ZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCmluZGV4IDg4ZWI4NTcuLmJhZjM5NGYgMTAwNjQ0Ci0tLSBhLy5naXRpZ25vcmUKKysrIGIvLmdpdGlnbm9yZQpAQCAtMSw5ICsxLDcgQEAKICoucHljCiAqLip+CiAqLnB5fgotLnByb2plY3QKIC5jcHJvamVjdAotLmNsYXNzcGF0aAogL2JpbgogLmlkZWEvKgogLmlkZWEvCmRpZmYgLS1naXQgYS9BbmRyb2lkLm1rIGIvQW5kcm9pZC5tawppbmRleCAxODk0MDQzLi4zMTFiNGViIDEwMDY0NAotLS0gYS9BbmRyb2lkLm1rCisrKyBiL0FuZHJvaWQubWsKQEAgLTEzLDcgKzEzLDUgQEAKICMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICMKLQogaW5jbHVkZSBjdHMvQ3RzQ292ZXJhZ2UubWsKIGluY2x1ZGUgJChjYWxsIGFsbC1zdWJkaXItbWFrZWZpbGVzKQotCmRpZmYgLS1naXQgYS9DbGVhblNwZWMubWsgYi9DbGVhblNwZWMubWsKaW5kZXggNzFhZGEzZC4uZTQyZTBkOSAxMDA2NDQKLS0tIGEvQ2xlYW5TcGVjLm1rCisrKyBiL0NsZWFuU3BlYy5tawpAQCAtNDYsNiArNDYsMTAgQEAKIAogJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChIT1NUX09VVF9JTlRFUk1FRElBVEVTKS9FWEVDVVRBQkxFUy92bS10ZXN0cy10Zl9pbnRlcm1lZGlhdGVzKQogJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChPVVRfRElSKS9ob3N0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvY3RzLXRyYWRlZmVkX2ludGVybWVkaWF0ZXMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9TdWl0ZUluZm8uamF2YSkKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoSE9TVF9PVVQpL2N0cy9hbmRyb2lkLWN0cy90ZXN0Y2FzZXMvQ3RzVWlIb3N0VGVzdENhc2VzKikKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoSE9TVF9PVVQpL2N0c19pbnN0YW50L2FuZHJvaWQtY3RzX2luc3RhbnQvdGVzdGNhc2VzL0N0c0pvYlNjaGVkdWxlclRlc3RDYXNlcyopCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKEhPU1RfT1VUKS9jdHNfaW5zdGFudC9hbmRyb2lkLWN0c19pbnN0YW50L3Rlc3RjYXNlcy9DdHNVaUhvc3RUZXN0Q2FzZXMqKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChIT1NUX09VVCkvY3RzX2luc3RhbnQvYW5kcm9pZC1jdHNfaW5zdGFudC90ZXN0Y2FzZXMvQ3RzRHBpVGVzdENhc2VzMiopCiAKICMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAjIE5FV0VSIENMRUFOIFNURVBTIE1VU1QgQkUgQVQgVEhFIEVORCBPRiBUSEUgTElTVApkaWZmIC0tZ2l0IGEvQ3RzQ292ZXJhZ2UubWsgYi9DdHNDb3ZlcmFnZS5tawppbmRleCA4OTVhZjRkLi44YTBlZWY4IDEwMDY0NAotLS0gYS9DdHNDb3ZlcmFnZS5taworKysgYi9DdHNDb3ZlcmFnZS5tawpAQCAtOTQsMTMgKzk0LDE0IEBACiAuUEhPTlk6IGN0cy1jb21iaW5lZC14bWwtY292ZXJhZ2UKIGN0cy1jb21iaW5lZC14bWwtY292ZXJhZ2UgOiAkKGN0cy1jb21iaW5lZC14bWwtY292ZXJhZ2UtcmVwb3J0KQogCi0jIFB1dCB0aGUgdGVzdCBjb3ZlcmFnZSByZXBvcnQgaW4gdGhlIGRpc3QgZGlyIGlmICJjdHMiIGlzIGFtb25nIHRoZSBidWlsZCBnb2Fscy4KLWlmbmVxICgkKGZpbHRlciBjdHMsICQoTUFLRUNNREdPQUxTKSksKQotICAkKGNhbGwgZGlzdC1mb3ItZ29hbHMsIGN0cywgJChjdHMtdGVzdC1jb3ZlcmFnZS1yZXBvcnQpOmN0cy10ZXN0LWNvdmVyYWdlLXJlcG9ydC5odG1sKQotICAkKGNhbGwgZGlzdC1mb3ItZ29hbHMsIGN0cywgJChjdHMtdmVyaWZpZXItY292ZXJhZ2UtcmVwb3J0KTpjdHMtdmVyaWZpZXItY292ZXJhZ2UtcmVwb3J0Lmh0bWwpCi0gICQoY2FsbCBkaXN0LWZvci1nb2FscywgY3RzLCAkKGN0cy1jb21iaW5lZC1jb3ZlcmFnZS1yZXBvcnQpOmN0cy1jb21iaW5lZC1jb3ZlcmFnZS1yZXBvcnQuaHRtbCkKLSAgJChjYWxsIGRpc3QtZm9yLWdvYWxzLCBjdHMsICQoY3RzLWNvbWJpbmVkLXhtbC1jb3ZlcmFnZS1yZXBvcnQpOmN0cy1jb21iaW5lZC1jb3ZlcmFnZS1yZXBvcnQueG1sKQotZW5kaWYKKy5QSE9OWTogY3RzLWFwaS1jb3ZlcmFnZQorY3RzLWNvdmVyYWdlLXJlcG9ydC1hbGw6IGN0cy10ZXN0LWNvdmVyYWdlIGN0cy12ZXJpZmllci1jb3ZlcmFnZSBjdHMtY29tYmluZWQtY292ZXJhZ2UgY3RzLWNvbWJpbmVkLXhtbC1jb3ZlcmFnZQorCisjIFB1dCB0aGUgdGVzdCBjb3ZlcmFnZSByZXBvcnQgaW4gdGhlIGRpc3QgZGlyIGlmICJjdHMtYXBpLWNvdmVyYWdlIiBpcyBhbW9uZyB0aGUgYnVpbGQgZ29hbHMuCiskKGNhbGwgZGlzdC1mb3ItZ29hbHMsIGN0cy1hcGktY292ZXJhZ2UsICQoY3RzLXRlc3QtY292ZXJhZ2UtcmVwb3J0KTpjdHMtdGVzdC1jb3ZlcmFnZS1yZXBvcnQuaHRtbCkKKyQoY2FsbCBkaXN0LWZvci1nb2FscywgY3RzLWFwaS1jb3ZlcmFnZSwgJChjdHMtdmVyaWZpZXItY292ZXJhZ2UtcmVwb3J0KTpjdHMtdmVyaWZpZXItY292ZXJhZ2UtcmVwb3J0Lmh0bWwpCiskKGNhbGwgZGlzdC1mb3ItZ29hbHMsIGN0cy1hcGktY292ZXJhZ2UsICQoY3RzLWNvbWJpbmVkLWNvdmVyYWdlLXJlcG9ydCk6Y3RzLWNvbWJpbmVkLWNvdmVyYWdlLXJlcG9ydC5odG1sKQorJChjYWxsIGRpc3QtZm9yLWdvYWxzLCBjdHMtYXBpLWNvdmVyYWdlLCAkKGN0cy1jb21iaW5lZC14bWwtY292ZXJhZ2UtcmVwb3J0KTpjdHMtY29tYmluZWQtY292ZXJhZ2UtcmVwb3J0LnhtbCkKIAogIyBBcmd1bWVudHM7CiAjICAxIC0gTmFtZSBvZiB0aGUgcmVwb3J0IHByaW50ZWQgb3V0IG9uIHRoZSBzY3JlZW4KZGlmZiAtLWdpdCBhL1BSRVVQTE9BRC5jZmcgYi9QUkVVUExPQUQuY2ZnCmluZGV4IGNjMmFhZDkuLjVmM2U5OWYgMTAwNjQ0Ci0tLSBhL1BSRVVQTE9BRC5jZmcKKysrIGIvUFJFVVBMT0FELmNmZwpAQCAtNiw2ICs2LDggQEAKICAgICAgICAgICAgICAgICAgICAgICB0ZXN0cy90ZXN0cy9hbmltYXRpb24vCiAgICAgICAgICAgICAgICAgICAgICAgdGVzdHMvdGVzdHMvcHJpbnQvCiAgICAgICAgICAgICAgICAgICAgICAgdGVzdHMvdGVzdHMvdGV4dC8KKyAgICAgICAgICAgICAgICAgICAgICB0ZXN0cy90ZXN0cy9ncmFwaGljcy8KICAgICAgICAgICAgICAgICAgICAgICB0ZXN0cy90ZXN0cy90cmFuc2l0aW9uLworICAgICAgICAgICAgICAgICAgICAgIHRlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nLwogICAgICAgICAgICAgICAgICAgICAgIHRlc3RzL3Rlc3RzL3ZpZXcvCiAgICAgICAgICAgICAgICAgICAgICAgdGVzdHMvdGVzdHMvd2lkZ2V0LwpkaWZmIC0tZ2l0IGEvYXBwcy9DYW1lcmFJVFMvYnVpbGQvZW52c2V0dXAuc2ggYi9hcHBzL0NhbWVyYUlUUy9idWlsZC9lbnZzZXR1cC5zaAppbmRleCAxM2M5MDdjLi5hMjExMDhlIDEwMDY0NAotLS0gYS9hcHBzL0NhbWVyYUlUUy9idWlsZC9lbnZzZXR1cC5zaAorKysgYi9hcHBzL0NhbWVyYUlUUy9idWlsZC9lbnZzZXR1cC5zaApAQCAtMzEsMTIgKzMxLDE5IEBACiBweXRob24gLVYgMj4mMSB8IGdyZXAgLXEgIlB5dGhvbiAyLjciIHx8IFwKICAgICBlY2hvICI+PiBSZXF1aXJlIHB5dGhvbiAyLjciID4mMgogCi1mb3IgTSBpbiBudW1weSBQSUwgSW1hZ2UgbWF0cGxvdGxpYiBweWxhYiBzY2lweS5zdGF0cyBzY2lweS5zcGF0aWFsCitmb3IgTSBpbiBudW1weSBQSUwgbWF0cGxvdGxpYiBzY2lweS5zdGF0cyBzY2lweS5zcGF0aWFsCiBkbwogICAgIHB5dGhvbiAtYyAiaW1wb3J0ICRNIiA+L2Rldi9udWxsIDI+JjEgfHwgXAogICAgICAgICBlY2hvICI+PiBSZXF1aXJlIFB5dGhvbiAkTSBtb2R1bGUiID4mMgogZG9uZQogCitmb3IgTiBpbiAnUElMIEltYWdlJyAnbWF0cGxvdGxpYiBweWxhYicKK2RvCisgICAgSUZTPScgJyByZWFkIG1vZHVsZSBzdWJtb2R1bGUgPDw8ICIkTiIKKyAgICBweXRob24gLWMgImZyb20gJG1vZHVsZSBpbXBvcnQgJHN1Ym1vZHVsZSIgPi9kZXYvbnVsbCAyPiYxIHx8IFwKKyAgICAgICAgZWNobyAiPj4gUmVxdWlyZSBQeXRob24gJG1vZHVsZSBtb2R1bGUgJHN1Ym1vZHVsZSBzdWJtb2R1bGUiID4mMgorZG9uZQorCiBDVjJfVkVSPSQocHl0aG9uIC1jICJcCiB0cnk6CiAgICAgaW1wb3J0IGN2MgpkaWZmIC0tZ2l0IGEvYXBwcy9DYW1lcmFJVFMvcHltb2R1bGVzL2l0cy9jYXBzLnB5IGIvYXBwcy9DYW1lcmFJVFMvcHltb2R1bGVzL2l0cy9jYXBzLnB5CmluZGV4IGU2ZjA5NmYuLmQ3NTUzMmIgMTAwNjQ0Ci0tLSBhL2FwcHMvQ2FtZXJhSVRTL3B5bW9kdWxlcy9pdHMvY2Fwcy5weQorKysgYi9hcHBzL0NhbWVyYUlUUy9weW1vZHVsZXMvaXRzL2NhcHMucHkKQEAgLTEyLDkgKzEyLDEwIEBACiAjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKLWltcG9ydCB1bml0dGVzdAotaW1wb3J0IGl0cy5vYmplY3RzCiBpbXBvcnQgc3lzCitpbXBvcnQgdW5pdHRlc3QKKworaW1wb3J0IGl0cy5vYmplY3RzCiAKIAogZGVmIHNraXBfdW5sZXNzKGNvbmQpOgpAQCAtOTcsOCArOTgsOCBAQAogICAgIHJldHVybiBwcm9wcy5oYXNfa2V5KCJhbmRyb2lkLmluZm8uc3VwcG9ydGVkSGFyZHdhcmVMZXZlbCIpIGFuZCBcCiAgICAgICAgICAgIHByb3BzWyJhbmRyb2lkLmluZm8uc3VwcG9ydGVkSGFyZHdhcmVMZXZlbCJdID09IDIKIAotZGVmIHJhZGlhbF9kaXN0b3J0aW9uX2NvcnJlY3Rpb24ocHJvcHMpOgotICAgICIiIlJldHVybnMgd2hldGhlciBhIGRldmljZSBzdXBwb3J0cyBSQURJQUxfRElTVE9SVElPTl9DT1JSRUNUSU9OCitkZWYgZGlzdG9ydGlvbl9jb3JyZWN0aW9uKHByb3BzKToKKyAgICAiIiJSZXR1cm5zIHdoZXRoZXIgYSBkZXZpY2Ugc3VwcG9ydHMgRElTVE9SVElPTl9DT1JSRUNUSU9OCiAgICAgY2FwYWJpbGl0aWVzLgogCiAgICAgQXJnczoKQEAgLTEwNyw4ICsxMDgsOCBAQAogICAgIFJldHVybnM6CiAgICAgICAgIEJvb2xlYW4uCiAgICAgIiIiCi0gICAgcmV0dXJuIHByb3BzLmhhc19rZXkoImFuZHJvaWQubGVucy5yYWRpYWxEaXN0b3J0aW9uIikgYW5kIFwKLSAgICAgICAgICAgcHJvcHNbImFuZHJvaWQubGVucy5yYWRpYWxEaXN0b3J0aW9uIl0gaXMgbm90IE5vbmUKKyAgICByZXR1cm4gcHJvcHMuaGFzX2tleSgiYW5kcm9pZC5sZW5zLmRpc3RvcnRpb24iKSBhbmQgXAorICAgICAgICAgICBwcm9wc1siYW5kcm9pZC5sZW5zLmRpc3RvcnRpb24iXSBpcyBub3QgTm9uZQogCiBkZWYgbWFudWFsX3NlbnNvcihwcm9wcyk6CiAgICAgIiIiUmV0dXJucyB3aGV0aGVyIGEgZGV2aWNlIHN1cHBvcnRzIE1BTlVBTF9TRU5TT1IgY2FwYWJpbGl0aWVzLgpAQCAtNDQ2LDYgKzQ0Nyw1OSBAQAogICAgIHJldHVybiBwcm9wcy5oYXNfa2V5KCJhbmRyb2lkLmxlbnMuaW5mby5taW5pbXVtRm9jdXNEaXN0YW5jZSIpIGFuZCBcCiAgICAgICAgIHByb3BzWyJhbmRyb2lkLmxlbnMuaW5mby5taW5pbXVtRm9jdXNEaXN0YW5jZSJdID09IDAKIAorZGVmIGxvZ2ljYWxfbXVsdGlfY2FtZXJhKHByb3BzKToKKyAgICAiIiJSZXR1cm5zIHdoZXRoZXIgYSBkZXZpY2UgaXMgYSBsb2dpY2FsIG11bHRpLWNhbWVyYS4KKworICAgIEFyZ3M6CisgICAgICAgIHByb3BzOiBDYW1lcmEgcHJvcGVydGllcyBvYmplY3QuCisKKyAgICBSZXR1cm46CisgICAgICAgIEJvb2xlYW4uCisgICAgIiIiCisgICAgcmV0dXJuIHByb3BzLmhhc19rZXkoImFuZHJvaWQucmVxdWVzdC5hdmFpbGFibGVDYXBhYmlsaXRpZXMiKSBhbmQgXAorICAgICAgICAgICAxMSBpbiBwcm9wc1siYW5kcm9pZC5yZXF1ZXN0LmF2YWlsYWJsZUNhcGFiaWxpdGllcyJdCisKK2RlZiBsb2dpY2FsX211bHRpX2NhbWVyYV9waHlzaWNhbF9pZHMocHJvcHMpOgorICAgICIiIlJldHVybnMgYSBsb2dpY2FsIG11bHRpLWNhbWVyYSdzIHVuZGVybHlpbmcgcGh5c2ljYWwgY2FtZXJhcy4KKworICAgIEFyZ3M6CisgICAgICAgIHByb3BzOiBDYW1lcmEgcHJvcGVydGllcyBvYmplY3QuCisKKyAgICBSZXR1cm46CisgICAgICAgIGxpc3Qgb2YgcGh5c2ljYWwgY2FtZXJhcyBiYWNraW5nIHRoZSBsb2dpY2FsIG11bHRpLWNhbWVyYS4KKyAgICAiIiIKKyAgICBwaHlzaWNhbElkc0xpc3QgPSBbXQorICAgIGlmIGxvZ2ljYWxfbXVsdGlfY2FtZXJhKHByb3BzKToKKyAgICAgICAgcGh5c2ljYWxJZHNMaXN0ID0gcHJvcHNbJ2NhbWVyYS5jaGFyYWN0ZXJpc3RpY3MucGh5c2ljYWxDYW1JZHMnXTsKKyAgICByZXR1cm4gcGh5c2ljYWxJZHNMaXN0CisKK2RlZiBtb25vX2NhbWVyYShwcm9wcyk6CisgICAgIiIiUmV0dXJucyB3aGV0aGVyIGEgZGV2aWNlIGlzIG1vbm9jaHJvbWF0aWMuCisKKyAgICBBcmdzOgorICAgICAgICBwcm9wczogQ2FtZXJhIHByb3BlcnRpZXMgb2JqZWN0LgorCisgICAgUmV0dXJuOgorICAgICAgICBCb29sZWFuLgorICAgICIiIgorICAgIHJldHVybiBwcm9wcy5oYXNfa2V5KCJhbmRyb2lkLnJlcXVlc3QuYXZhaWxhYmxlQ2FwYWJpbGl0aWVzIikgYW5kIFwKKyAgICAgICAgICAgMTIgaW4gcHJvcHNbImFuZHJvaWQucmVxdWVzdC5hdmFpbGFibGVDYXBhYmlsaXRpZXMiXQorCisKK2RlZiBmYWNlX2RldGVjdChwcm9wcyk6CisgICAgIiIiUmV0dXJucyB3aGV0aGVyIGEgZGV2aWNlIGhhcyBmYWNlIGRldGVjdGlvbiBtb2RlLgorCisgICAgcHJvcHNbJ2FuZHJvaWQuc3RhdGlzdGljcy5pbmZvLmF2YWlsYWJsZUZhY2VEZXRlY3RNb2RlcyddICE9IDAgaXMgZmFjZSBkZXQKKworICAgIEFyZ3M6CisgICAgICAgIHByb3BzOiBDYW1lcmEgcHJvcGVydGllcyBvYmplY3RzLgorCisgICAgUmV0dXJuczoKKyAgICAgICAgQm9vbGVhbi4KKyAgICAiIiIKKyAgICByZXR1cm4gcHJvcHMuaGFzX2tleSgiYW5kcm9pZC5zdGF0aXN0aWNzLmluZm8uYXZhaWxhYmxlRmFjZURldGVjdE1vZGVzIikgYW5kIFwKKyAgICAgICAgcHJvcHNbImFuZHJvaWQuc3RhdGlzdGljcy5pbmZvLmF2YWlsYWJsZUZhY2VEZXRlY3RNb2RlcyJdICE9IFswXQorCiAKIGRlZiBkZWJ1Z19tb2RlKCk6CiAgICAgIiIiUmV0dXJucyBUcnVlL0ZhbHNlIGZvciB3aGV0aGVyIHRlc3QgaXMgcnVuIGluIGRlYnVnIG1vZGUuCkBAIC00NTksNiArNTEzLDE5IEBACiAgICAgcmV0dXJuIEZhbHNlCiAKIAorZGVmIGJhY2t3YXJkX2NvbXBhdGlibGUocHJvcHMpOgorICAgICIiIlJldHVybnMgd2hldGhlciBhIGRldmljZSBzdXBwb3J0cyBCQUNLV0FSRF9DT01QQVRJQkxFLgorCisgICAgQXJnczoKKyAgICAgICAgcHJvcHM6IENhbWVyYSBwcm9wZXJ0aWVzIG9iamVjdC4KKworICAgIFJldHVybnM6CisgICAgICAgIEJvb2xlYW4uCisgICAgIiIiCisgICAgcmV0dXJuIHByb3BzLmhhc19rZXkoImFuZHJvaWQucmVxdWVzdC5hdmFpbGFibGVDYXBhYmlsaXRpZXMiKSBhbmQgXAorICAgICAgICAgICAgICAwIGluIHByb3BzWyJhbmRyb2lkLnJlcXVlc3QuYXZhaWxhYmxlQ2FwYWJpbGl0aWVzIl0KKworCiBjbGFzcyBfX1VuaXRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICAiIiJSdW4gYSBzdWl0ZSBvZiB1bml0IHRlc3RzIG9uIHRoaXMgbW9kdWxlLgogICAgICIiIgpAQCAtNDY2LDQgKzUzMywzIEBACiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgdW5pdHRlc3QubWFpbigpCi0KZGlmZiAtLWdpdCBhL2FwcHMvQ2FtZXJhSVRTL3B5bW9kdWxlcy9pdHMvY3YyaW1hZ2UucHkgYi9hcHBzL0NhbWVyYUlUUy9weW1vZHVsZXMvaXRzL2N2MmltYWdlLnB5CmluZGV4IDgzZTY1NGUuLjIwMDQ4NDYgMTAwNjQ0Ci0tLSBhL2FwcHMvQ2FtZXJhSVRTL3B5bW9kdWxlcy9pdHMvY3YyaW1hZ2UucHkKKysrIGIvYXBwcy9DYW1lcmFJVFMvcHltb2R1bGVzL2l0cy9jdjJpbWFnZS5weQpAQCAtMTIsMjcgKzEyLDM4IEBACiAjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKLWltcG9ydCBtYXRwbG90bGliCi1tYXRwbG90bGliLnVzZSgnQWdnJykKLQotaW1wb3J0IGl0cy5lcnJvcgotZnJvbSBtYXRwbG90bGliIGltcG9ydCBweWxhYgotaW1wb3J0IHN5cwotZnJvbSBQSUwgaW1wb3J0IEltYWdlCi1pbXBvcnQgbnVtcHkKLWltcG9ydCBtYXRoCi1pbXBvcnQgdW5pdHRlc3QKLWltcG9ydCBjU3RyaW5nSU8KLWltcG9ydCBzY2lweS5zdGF0cwotaW1wb3J0IGNvcHkKLWltcG9ydCBjdjIKIGltcG9ydCBvcworaW1wb3J0IHVuaXR0ZXN0CisKK2ltcG9ydCBjdjIKK2ltcG9ydCBpdHMuY2FwcworaW1wb3J0IGl0cy5kZXZpY2UKK2ltcG9ydCBpdHMuZXJyb3IKK2ltcG9ydCBpdHMuaW1hZ2UKK2ltcG9ydCBudW1weQorCitWR0FfSEVJR0hUID0gNDgwCitWR0FfV0lEVEggPSA2NDAKKwogCiBkZWYgc2NhbGVfaW1nKGltZywgc2NhbGU9MS4wKToKICAgICAiIiJTY2FsZSBhbmQgaW1hZ2UgYmFzZWQgb24gYSByZWFsIG51bWJlciBzY2FsZSBmYWN0b3IuIiIiCiAgICAgZGltID0gKGludChpbWcuc2hhcGVbMV0qc2NhbGUpLCBpbnQoaW1nLnNoYXBlWzBdKnNjYWxlKSkKICAgICByZXR1cm4gY3YyLnJlc2l6ZShpbWcuY29weSgpLCBkaW0sIGludGVycG9sYXRpb249Y3YyLklOVEVSX0FSRUEpCiAKKworZGVmIGdyYXlfc2NhbGVfaW1nKGltZyk6CisgICAgIiIiUmV0dXJuIGdyYXkgc2NhbGUgdmVyc2lvbiBvZiBpbWFnZS4iIiIKKyAgICBpZiBsZW4oaW1nLnNoYXBlKSA9PSAyOgorICAgICAgICBpbWdfZ3JheSA9IGltZy5jb3B5KCkKKyAgICBlbGlmIGxlbihpbWcuc2hhcGUpID09IDM6CisgICAgICAgIGlmIGltZy5zaGFwZVsyXSA9PSAxOgorICAgICAgICAgICAgaW1nX2dyYXkgPSBpbWdbOiwgOiwgMF0uY29weSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpbWdfZ3JheSA9IGN2Mi5jdnRDb2xvcihpbWcsIGN2Mi5DT0xPUl9SR0IyR1JBWSkKKyAgICByZXR1cm4gaW1nX2dyYXkKKworCiBjbGFzcyBDaGFydChvYmplY3QpOgogICAgICIiIkRlZmluaXRpb24gZm9yIGNoYXJ0IG9iamVjdC4KIApAQCAtNDAsNyArNTEsNyBAQAogICAgICIiIgogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNoYXJ0X2ZpbGUsIGhlaWdodCwgZGlzdGFuY2UsIHNjYWxlX3N0YXJ0LCBzY2FsZV9zdG9wLAotICAgICAgICAgICAgICAgICBzY2FsZV9zdGVwKToKKyAgICAgICAgICAgICAgICAgc2NhbGVfc3RlcCwgY2FtZXJhX2lkPU5vbmUpOgogICAgICAgICAiIiJJbml0aWFsIGNvbnN0cnVjdG9yIGZvciBjbGFzcy4KIAogICAgICAgICBBcmdzOgpAQCAtNTAsNiArNjEsNyBAQAogICAgICAgICAgICAgc2NhbGVfc3RhcnQ6ICAgIGZsb2F0OyBzdGFydCB2YWx1ZSBmb3Igc2NhbGluZyBmb3IgY2hhcnQgc2VhcmNoCiAgICAgICAgICAgICBzY2FsZV9zdG9wOiAgICAgZmxvYXQ7IHN0b3AgdmFsdWUgZm9yIHNjYWxpbmcgZm9yIGNoYXJ0IHNlYXJjaAogICAgICAgICAgICAgc2NhbGVfc3RlcDogICAgIGZsb2F0OyBzdGVwIHZhbHVlIGZvciBzY2FsaW5nIGZvciBjaGFydCBzZWFyY2gKKyAgICAgICAgICAgIGNhbWVyYV9pZDogICAgICBpbnQ7IGNhbWVyYSB1c2VkIGZvciBleHRyYWN0b3IKICAgICAgICAgIiIiCiAgICAgICAgIHNlbGYuX2ZpbGUgPSBjaGFydF9maWxlCiAgICAgICAgIHNlbGYuX2hlaWdodCA9IGhlaWdodApAQCAtNTcsNiArNjksMjMgQEAKICAgICAgICAgc2VsZi5fc2NhbGVfc3RhcnQgPSBzY2FsZV9zdGFydAogICAgICAgICBzZWxmLl9zY2FsZV9zdG9wID0gc2NhbGVfc3RvcAogICAgICAgICBzZWxmLl9zY2FsZV9zdGVwID0gc2NhbGVfc3RlcAorICAgICAgICBzZWxmLnhub3JtLCBzZWxmLnlub3JtLCBzZWxmLndub3JtLCBzZWxmLmhub3JtLCBzZWxmLnNjYWxlID0gaXRzLmltYWdlLmNoYXJ0X2xvY2F0ZWRfcGVyX2FyZ3YoKQorICAgICAgICBpZiBub3Qgc2VsZi54bm9ybToKKyAgICAgICAgICAgIHdpdGggaXRzLmRldmljZS5JdHNTZXNzaW9uKGNhbWVyYV9pZCkgYXMgY2FtOgorICAgICAgICAgICAgICAgIHByb3BzID0gY2FtLmdldF9jYW1lcmFfcHJvcGVydGllcygpCisgICAgICAgICAgICAgICAgaWYgaXRzLmNhcHMucmVhZF8zYShwcm9wcyk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYubG9jYXRlKGNhbSwgcHJvcHMpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgJ0NoYXJ0IGxvY2F0b3Igc2tpcHBlZC4nCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX3NldF9zY2FsZV9mYWN0b3JzX3RvX29uZSgpCisKKyAgICBkZWYgX3NldF9zY2FsZV9mYWN0b3JzX3RvX29uZShzZWxmKToKKyAgICAgICAgIiIiU2V0IHNjYWxlIGZhY3RvcnMgdG8gMS4wIGZvciBza2lwcGVkIHRlc3RzLiIiIgorICAgICAgICBzZWxmLndub3JtID0gMS4wCisgICAgICAgIHNlbGYuaG5vcm0gPSAxLjAKKyAgICAgICAgc2VsZi54bm9ybSA9IDAuMAorICAgICAgICBzZWxmLnlub3JtID0gMC4wCisgICAgICAgIHNlbGYuc2NhbGUgPSAxLjAKIAogICAgIGRlZiBfY2FsY19zY2FsZV9mYWN0b3JzKHNlbGYsIGNhbSwgcHJvcHMsIGZtdCwgcywgZSwgZmQpOgogICAgICAgICAiIiJUYWtlIGFuIGltYWdlIHdpdGggcywgZSwgJiBmZCB0byBmaW5kIHRoZSBjaGFydCBsb2NhdGlvbi4KQEAgLTc5LDcgKzEwOCw3IEBACiAgICAgICAgIHJlcVsnYW5kcm9pZC5sZW5zLmZvY3VzRGlzdGFuY2UnXSA9IGZkCiAgICAgICAgIGNhcF9jaGFydCA9IGl0cy5pbWFnZS5zdGF0aW9uYXJ5X2xlbnNfY2FwKGNhbSwgcmVxLCBmbXQpCiAgICAgICAgIGltZ18zYSA9IGl0cy5pbWFnZS5jb252ZXJ0X2NhcHR1cmVfdG9fcmdiX2ltYWdlKGNhcF9jaGFydCwgcHJvcHMpCi0gICAgICAgIGltZ18zYSA9IGl0cy5pbWFnZS5mbGlwX21pcnJvcl9pbWdfcGVyX2FyZ3YoaW1nXzNhKQorICAgICAgICBpbWdfM2EgPSBpdHMuaW1hZ2Uucm90YXRlX2ltZ19wZXJfYXJndihpbWdfM2EpCiAgICAgICAgIGl0cy5pbWFnZS53cml0ZV9pbWFnZShpbWdfM2EsICdhZl9zY2VuZS5qcGcnKQogICAgICAgICB0ZW1wbGF0ZSA9IGN2Mi5pbXJlYWQoc2VsZi5fZmlsZSwgY3YyLklNUkVBRF9BTllERVBUSCkKICAgICAgICAgZm9jYWxfbCA9IGNhcF9jaGFydFsnbWV0YWRhdGEnXVsnYW5kcm9pZC5sZW5zLmZvY2FsTGVuZ3RoJ10KQEAgLTk1LDQ0ICsxMjQsNDQgQEAKICAgICAgICAgcHJpbnQgJ0NoYXJ0L2ltYWdlIHNjYWxlIGZhY3RvciA9ICUuMmYnICUgc2NhbGVfZmFjdG9yCiAgICAgICAgIHJldHVybiB0ZW1wbGF0ZSwgaW1nXzNhLCBzY2FsZV9mYWN0b3IKIAotICAgIGRlZiBsb2NhdGUoc2VsZiwgY2FtLCBwcm9wcywgZm10LCBzLCBlLCBmZCk6Ci0gICAgICAgICIiIkZpbmQgdGhlIGNoYXJ0IGluIHRoZSBpbWFnZS4KKyAgICBkZWYgbG9jYXRlKHNlbGYsIGNhbSwgcHJvcHMpOgorICAgICAgICAiIiJGaW5kIHRoZSBjaGFydCBpbiB0aGUgaW1hZ2UsIGFuZCBhcHBlbmQgbG9jYXRpb24gdG8gY2hhcnQgb2JqZWN0LgogCi0gICAgICAgIEFyZ3M6Ci0gICAgICAgICAgICBjYW06ICAgICAgICAgICAgQW4gb3BlbiBkZXZpY2Ugc2Vzc2lvbgotICAgICAgICAgICAgcHJvcHM6ICAgICAgICAgIFByb3BlcnRpZXMgb2YgY2FtCi0gICAgICAgICAgICBmbXQ6ICAgICAgICAgICAgSW1hZ2UgZm9ybWF0IGZvciB0aGUgY2FwdHVyZQotICAgICAgICAgICAgczogICAgICAgICAgICAgIFNlbnNpdGl2aXR5IGZvciB0aGUgQUYgcmVxdWVzdCBhcyBkZWZpbmVkIGluCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5zZW5zb3Iuc2Vuc2l0aXZpdHkKLSAgICAgICAgICAgIGU6ICAgICAgICAgICAgICBFeHBvc3VyZSB0aW1lIGZvciB0aGUgQUYgcmVxdWVzdCBhcyBkZWZpbmVkIGluCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5zZW5zb3IuZXhwb3N1cmVUaW1lCi0gICAgICAgICAgICBmZDogICAgICAgICAgICAgZmxvYXQ7IGF1dG9mb2N1cyBsZW5zIHBvc2l0aW9uCi0KLSAgICAgICAgUmV0dXJuczoKKyAgICAgICAgVGhlIHZhbHVlcyBhcHBlbmRlZCBhcmU6CiAgICAgICAgICAgICB4bm9ybTogICAgICAgICAgZmxvYXQ7IFswLCAxXSBsZWZ0IGxvYyBvZiBjaGFydCBpbiBzY2VuZQogICAgICAgICAgICAgeW5vcm06ICAgICAgICAgIGZsb2F0OyBbMCwgMV0gdG9wIGxvYyBvZiBjaGFydCBpbiBzY2VuZQogICAgICAgICAgICAgd25vcm06ICAgICAgICAgIGZsb2F0OyBbMCwgMV0gd2lkdGggb2YgY2hhcnQgaW4gc2NlbmUKICAgICAgICAgICAgIGhub3JtOiAgICAgICAgICBmbG9hdDsgWzAsIDFdIGhlaWdodCBvZiBjaGFydCBpbiBzY2VuZQorICAgICAgICAgICAgc2NhbGU6ICAgICAgICAgIGZsb2F0OyBzY2FsZSBmYWN0b3IgdG8gZXh0cmFjdCBjaGFydAorCisgICAgICAgIEFyZ3M6CisgICAgICAgICAgICBjYW06ICAgICAgICAgICAgQW4gb3BlbiBkZXZpY2Ugc2Vzc2lvbgorICAgICAgICAgICAgcHJvcHM6ICAgICAgICAgIENhbWVyYSBwcm9wZXJ0aWVzCiAgICAgICAgICIiIgotICAgICAgICBjaGFydCwgc2NlbmUsIHNfZmFjdG9yID0gc2VsZi5fY2FsY19zY2FsZV9mYWN0b3JzKGNhbSwgcHJvcHMsIGZtdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLCBlLCBmZCkKKyAgICAgICAgaWYgaXRzLmNhcHMucmVhZF8zYShwcm9wcyk6CisgICAgICAgICAgICBzLCBlLCBfLCBfLCBmZCA9IGNhbS5kb18zYShnZXRfcmVzdWx0cz1UcnVlKQorICAgICAgICAgICAgZm10ID0geydmb3JtYXQnOiAneXV2JywgJ3dpZHRoJzogVkdBX1dJRFRILCAnaGVpZ2h0JzogVkdBX0hFSUdIVH0KKyAgICAgICAgICAgIGNoYXJ0LCBzY2VuZSwgc19mYWN0b3IgPSBzZWxmLl9jYWxjX3NjYWxlX2ZhY3RvcnMoY2FtLCBwcm9wcywgZm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLCBlLCBmZCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50ICdDaGFydCBsb2NhdG9yIHNraXBwZWQuJworICAgICAgICAgICAgc2VsZi5fc2V0X3NjYWxlX2ZhY3RvcnNfdG9fb25lKCkKKyAgICAgICAgICAgIHJldHVybgogICAgICAgICBzY2FsZV9zdGFydCA9IHNlbGYuX3NjYWxlX3N0YXJ0ICogc19mYWN0b3IKICAgICAgICAgc2NhbGVfc3RvcCA9IHNlbGYuX3NjYWxlX3N0b3AgKiBzX2ZhY3RvcgogICAgICAgICBzY2FsZV9zdGVwID0gc2VsZi5fc2NhbGVfc3RlcCAqIHNfZmFjdG9yCisgICAgICAgIHNlbGYuc2NhbGUgPSBzX2ZhY3RvcgogICAgICAgICBtYXhfbWF0Y2ggPSBbXQogICAgICAgICAjIGNoZWNrIGZvciBub3JtYWxpemVkIGltYWdlCiAgICAgICAgIGlmIG51bXB5LmFtYXgoc2NlbmUpIDw9IDEuMDoKICAgICAgICAgICAgIHNjZW5lID0gKHNjZW5lICogMjU1LjApLmFzdHlwZShudW1weS51aW50OCkKLSAgICAgICAgaWYgbGVuKHNjZW5lLnNoYXBlKSA9PSAyOgotICAgICAgICAgICAgc2NlbmVfZ3JheSA9IHNjZW5lLmNvcHkoKQotICAgICAgICBlbGlmIGxlbihzY2VuZS5zaGFwZSkgPT0gMzoKLSAgICAgICAgICAgIGlmIHNjZW5lLnNoYXBlWzJdID09IDE6Ci0gICAgICAgICAgICAgICAgc2NlbmVfZ3JheSA9IHNjZW5lWzosIDosIDBdCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHNjZW5lX2dyYXkgPSBjdjIuY3Z0Q29sb3Ioc2NlbmUuY29weSgpLCBjdjIuQ09MT1JfUkdCMkdSQVkpCisgICAgICAgIHNjZW5lX2dyYXkgPSBncmF5X3NjYWxlX2ltZyhzY2VuZSkKICAgICAgICAgcHJpbnQgJ0ZpbmRpbmcgY2hhcnQgaW4gc2NlbmUuLi4nCiAgICAgICAgIGZvciBzY2FsZSBpbiBudW1weS5hcmFuZ2Uoc2NhbGVfc3RhcnQsIHNjYWxlX3N0b3AsIHNjYWxlX3N0ZXApOgogICAgICAgICAgICAgc2NlbmVfc2NhbGVkID0gc2NhbGVfaW1nKHNjZW5lX2dyYXksIHNjYWxlKQorICAgICAgICAgICAgaWYgKHNjZW5lX3NjYWxlZC5zaGFwZVswXSA8IGNoYXJ0LnNoYXBlWzBdIG9yCisgICAgICAgICAgICAgICAgc2NlbmVfc2NhbGVkLnNoYXBlWzFdIDwgY2hhcnQuc2hhcGVbMV0pOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICByZXN1bHQgPSBjdjIubWF0Y2hUZW1wbGF0ZShzY2VuZV9zY2FsZWQsIGNoYXJ0LCBjdjIuVE1fQ0NPRUZGKQogICAgICAgICAgICAgXywgb3B0X3ZhbCwgXywgdG9wX2xlZnRfc2NhbGVkID0gY3YyLm1pbk1heExvYyhyZXN1bHQpCiAgICAgICAgICAgICAjIHByaW50IG91dCBzY2FsZSBhbmQgbWF0Y2gKQEAgLTE0MiwyNiArMTcxLDEzOSBAQAogICAgICAgICAjIGRldGVybWluZSBpZiBvcHRpbWl6YXRpb24gcmVzdWx0cyBhcmUgdmFsaWQKICAgICAgICAgb3B0X3ZhbHVlcyA9IFt4WzBdIGZvciB4IGluIG1heF9tYXRjaF0KICAgICAgICAgaWYgMi4wKm1pbihvcHRfdmFsdWVzKSA+IG1heChvcHRfdmFsdWVzKToKLSAgICAgICAgICAgIGVzdHJpbmcgPSAoJ1VuYWJsZSB0byBmaW5kIGNoYXJ0IGluIHNjZW5lIVxuJworICAgICAgICAgICAgZXN0cmluZyA9ICgnV2FybmluZzogdW5hYmxlIHRvIGZpbmQgY2hhcnQgaW4gc2NlbmUhXG4nCiAgICAgICAgICAgICAgICAgICAgICAgICdDaGVjayBjYW1lcmEgZGlzdGFuY2UgYW5kIHNlbGYtcmVwb3J0ZWQgJwogICAgICAgICAgICAgICAgICAgICAgICAncGl4ZWwgcGl0Y2gsIGZvY2FsIGxlbmd0aCBhbmQgaHlwZXJmb2NhbCBkaXN0YW5jZS4nKQotICAgICAgICAgICAgcmFpc2UgaXRzLmVycm9yLkVycm9yKGVzdHJpbmcpCi0gICAgICAgICMgZmluZCBtYXggYW5kIGRyYXcgYmJveAotICAgICAgICBtYXRjaF9pbmRleCA9IG1heF9tYXRjaC5pbmRleChtYXgobWF4X21hdGNoLCBrZXk9bGFtYmRhIHg6IHhbMF0pKQotICAgICAgICBzY2FsZSA9IHNjYWxlX3N0YXJ0ICsgc2NhbGVfc3RlcCAqIG1hdGNoX2luZGV4Ci0gICAgICAgIHByaW50ICdPcHRpbXVtIHNjYWxlIGZhY3RvcjogJS4zZicgJSAgc2NhbGUKLSAgICAgICAgdG9wX2xlZnRfc2NhbGVkID0gbWF4X21hdGNoW21hdGNoX2luZGV4XVsxXQotICAgICAgICBoLCB3ID0gY2hhcnQuc2hhcGUKLSAgICAgICAgYm90dG9tX3JpZ2h0X3NjYWxlZCA9ICh0b3BfbGVmdF9zY2FsZWRbMF0gKyB3LCB0b3BfbGVmdF9zY2FsZWRbMV0gKyBoKQotICAgICAgICB0b3BfbGVmdCA9IChpbnQodG9wX2xlZnRfc2NhbGVkWzBdL3NjYWxlKSwKLSAgICAgICAgICAgICAgICAgICAgaW50KHRvcF9sZWZ0X3NjYWxlZFsxXS9zY2FsZSkpCi0gICAgICAgIGJvdHRvbV9yaWdodCA9IChpbnQoYm90dG9tX3JpZ2h0X3NjYWxlZFswXS9zY2FsZSksCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQoYm90dG9tX3JpZ2h0X3NjYWxlZFsxXS9zY2FsZSkpCi0gICAgICAgIHdub3JtID0gZmxvYXQoKGJvdHRvbV9yaWdodFswXSkgLSB0b3BfbGVmdFswXSkgLyBzY2VuZS5zaGFwZVsxXQotICAgICAgICBobm9ybSA9IGZsb2F0KChib3R0b21fcmlnaHRbMV0pIC0gdG9wX2xlZnRbMV0pIC8gc2NlbmUuc2hhcGVbMF0KLSAgICAgICAgeG5vcm0gPSBmbG9hdCh0b3BfbGVmdFswXSkgLyBzY2VuZS5zaGFwZVsxXQotICAgICAgICB5bm9ybSA9IGZsb2F0KHRvcF9sZWZ0WzFdKSAvIHNjZW5lLnNoYXBlWzBdCi0gICAgICAgIHJldHVybiB4bm9ybSwgeW5vcm0sIHdub3JtLCBobm9ybQorICAgICAgICAgICAgcHJpbnQgZXN0cmluZworICAgICAgICAgICAgc2VsZi5fc2V0X3NjYWxlX2ZhY3RvcnNfdG9fb25lKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIChtYXgob3B0X3ZhbHVlcykgPT0gb3B0X3ZhbHVlc1swXSBvcgorICAgICAgICAgICAgICAgICAgICAgICAgbWF4KG9wdF92YWx1ZXMpID09IG9wdF92YWx1ZXNbbGVuKG9wdF92YWx1ZXMpLTFdKToKKyAgICAgICAgICAgICAgICBlc3RyaW5nID0gKCdXYXJuaW5nOiBjaGFydCBpcyBhdCBleHRyZW1lIHJhbmdlIG9mIGxvY2F0b3IgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NoZWNrLlxuJykKKyAgICAgICAgICAgICAgICBwcmludCBlc3RyaW5nCisgICAgICAgICAgICAjIGZpbmQgbWF4IGFuZCBkcmF3IGJib3gKKyAgICAgICAgICAgIG1hdGNoX2luZGV4ID0gbWF4X21hdGNoLmluZGV4KG1heChtYXhfbWF0Y2gsIGtleT1sYW1iZGEgeDogeFswXSkpCisgICAgICAgICAgICBzZWxmLnNjYWxlID0gc2NhbGVfc3RhcnQgKyBzY2FsZV9zdGVwICogbWF0Y2hfaW5kZXgKKyAgICAgICAgICAgIHByaW50ICdPcHRpbXVtIHNjYWxlIGZhY3RvcjogJS4zZicgJSAgc2VsZi5zY2FsZQorICAgICAgICAgICAgdG9wX2xlZnRfc2NhbGVkID0gbWF4X21hdGNoW21hdGNoX2luZGV4XVsxXQorICAgICAgICAgICAgaCwgdyA9IGNoYXJ0LnNoYXBlCisgICAgICAgICAgICBib3R0b21fcmlnaHRfc2NhbGVkID0gKHRvcF9sZWZ0X3NjYWxlZFswXSArIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcF9sZWZ0X3NjYWxlZFsxXSArIGgpCisgICAgICAgICAgICB0b3BfbGVmdCA9IChpbnQodG9wX2xlZnRfc2NhbGVkWzBdL3NlbGYuc2NhbGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50KHRvcF9sZWZ0X3NjYWxlZFsxXS9zZWxmLnNjYWxlKSkKKyAgICAgICAgICAgIGJvdHRvbV9yaWdodCA9IChpbnQoYm90dG9tX3JpZ2h0X3NjYWxlZFswXS9zZWxmLnNjYWxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQoYm90dG9tX3JpZ2h0X3NjYWxlZFsxXS9zZWxmLnNjYWxlKSkKKyAgICAgICAgICAgIHNlbGYud25vcm0gPSBmbG9hdCgoYm90dG9tX3JpZ2h0WzBdKSAtIHRvcF9sZWZ0WzBdKSAvIHNjZW5lLnNoYXBlWzFdCisgICAgICAgICAgICBzZWxmLmhub3JtID0gZmxvYXQoKGJvdHRvbV9yaWdodFsxXSkgLSB0b3BfbGVmdFsxXSkgLyBzY2VuZS5zaGFwZVswXQorICAgICAgICAgICAgc2VsZi54bm9ybSA9IGZsb2F0KHRvcF9sZWZ0WzBdKSAvIHNjZW5lLnNoYXBlWzFdCisgICAgICAgICAgICBzZWxmLnlub3JtID0gZmxvYXQodG9wX2xlZnRbMV0pIC8gc2NlbmUuc2hhcGVbMF0KKworCitkZWYgZ2V0X2FuZ2xlKGlucHV0X2ltZyk6CisgICAgIiIiQ29tcHV0ZXMgYW5nbHVsYXIgaW5jbGluYXRpb24gb2YgY2hlc3Nib2FyZCBpbiBpbnB1dF9pbWcuCisKKyAgICBBbmdsZSBlc3RpbWF0aW9uIGFsZ29yaXRtIGRlc2NyaXB0aW9uOgorICAgICAgICBJbnB1dDogMkQgZ3JheXNjYWxlIGltYWdlIG9mIGNoZXNzYm9hcmQuCisgICAgICAgIE91dHB1dDogQW5nbGUgb2Ygcm90YXRpb24gb2YgY2hlc3Nib2FyZCBwZXJwZW5kaWN1bGFyIHRvCisgICAgICAgICAgICBjaGVzc2JvYXJkLiBBc3N1bWVzIGNoZXNzYm9hcmQgYW5kIGNhbWVyYSBhcmUgcGFyYWxsZWwgdG8KKyAgICAgICAgICAgIGVhY2ggb3RoZXIuCisKKyAgICAgICAgMSkgVXNlIGFkYXB0aXZlIHRocmVzaG9sZCB0byBtYWtlIGltYWdlIGJpbmFyeQorICAgICAgICAyKSBGaW5kIGNvdW50b3VycworICAgICAgICAzKSBGaWx0ZXIgb3V0IHNtYWxsIGNvbnRvdXJzCisgICAgICAgIDQpIEZpbHRlciBvdXQgYWxsIG5vbi1zcXVhcmUgY29udG91cnMKKyAgICAgICAgNSkgQ29tcHV0ZSBtb3N0IGNvbW1vbiBzcXVhcmUgc2hhcGUuCisgICAgICAgICAgICBUaGUgYXNzdW1wdGlvbiBoZXJlIGlzIHRoYXQgdGhlIG1vc3QgY29tbW9uIHNxdWFyZSBpbnN0YW5jZXMKKyAgICAgICAgICAgIGFyZSB0aGUgY2hlc3Nib2FyZCBzcXVhcmVzLiBXZSd2ZSBzaG93biB0aGF0IHdpdGggb3VyIGN1cnJlbnQKKyAgICAgICAgICAgIHR1bmluZywgd2UgY2FuIHJvYnVzdGx5IGlkZW50aWZ5IHRoZSBzcXVhcmVzIG9uIHRoZSBzZW5zb3IgZnVzaW9uCisgICAgICAgICAgICBjaGVzc2JvYXJkLgorICAgICAgICA2KSBSZXR1cm4gbWVkaWFuIGFuZ2xlIG9mIG1vc3QgY29tbW9uIHNxdWFyZSBzaGFwZS4KKworICAgIFVTQUdFIE5PVEU6IFRoaXMgZnVuY3Rpb24gaGFzIGJlZW4gdHVuZWQgdG8gd29yayBmb3IgdGhlIGNoZXNzYm9hcmQgdXNlZCBpbgorICAgIHRoZSBzZW5zb3JfZnVzaW9uIHRlc3RzLiBTZWUgaW1hZ2VzIGluIHRlc3RfaW1hZ2VzL3JvdGF0ZWRfY2hlc3Nib2FyZC8gZm9yCisgICAgc2FtcGxlIGNhcHR1cmVzLiBJZiB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgd2l0aCBvdGhlciBjaGVzc2JvYXJkcywgaXQgbWF5IG5vdAorICAgIHdvcmsgYXMgZXhwZWN0ZWQuCisKKyAgICBUT0RPOiBNYWtlIGFsZ29yaXRobSBtb3JlIHJvYnVzdCBzbyBpdCB3b3JrcyBvbiBhbnkgdHlwZSBvZgorICAgIGNoZXNzYm9hcmQuCisKKyAgICBBcmdzOgorICAgICAgICBpbnB1dF9pbWcgKDJEIG51bXB5Lm5kYXJyYXkpOiBHcmF5c2NhbGUgaW1hZ2Ugc3RvcmVkIGFzIGEgMkQKKyAgICAgICAgICAgIG51bXB5IGFycmF5LgorCisgICAgUmV0dXJuczoKKyAgICAgICAgTWVkaWFuIGFuZ2xlIG9mIHNxdWFyZXMgaW4gZGVncmVlcyBpZGVudGlmaWVkIGluIHRoZSBpbWFnZS4KKyAgICAiIiIKKyAgICAjIFR1bmluZyBwYXJhbWV0ZXJzCisgICAgbWluX3NxdWFyZV9hcmVhID0gKGZsb2F0KShpbnB1dF9pbWcuc2hhcGVbMV0gKiAwLjA1KQorCisgICAgIyBDcmVhdGVzIGNvcHkgb2YgaW1hZ2UgdG8gYXZvaWQgbW9kaWZ5aW5nIG9yaWdpbmFsLgorICAgIGltZyA9IG51bXB5LmFycmF5KGlucHV0X2ltZywgY29weT1UcnVlKQorCisgICAgIyBTY2FsZSBwaXhlbCB2YWx1ZXMgZnJvbSAwLTEgdG8gMC0yNTUKKyAgICBpbWcgKj0gMjU1CisgICAgaW1nID0gaW1nLmFzdHlwZShudW1weS51aW50OCkKKworICAgIHRocmVzaCA9IGN2Mi5hZGFwdGl2ZVRocmVzaG9sZCgKKyAgICAgICAgICAgIGltZywgMjU1LCBjdjIuQURBUFRJVkVfVEhSRVNIX01FQU5fQywgY3YyLlRIUkVTSF9CSU5BUlksIDIwMSwgMikKKworICAgICMgRmluZCBhbGwgY29udG91cnMKKyAgICBjb250b3VycyA9IFtdCisgICAgY3YyX3ZlcnNpb24gPSBjdjIuX192ZXJzaW9uX18KKyAgICBpZiBjdjJfdmVyc2lvbi5zdGFydHN3aXRoKCcyLjQuJyk6CisgICAgICAgIGNvbnRvdXJzLCBfID0gY3YyLmZpbmRDb250b3VycygKKyAgICAgICAgICAgICAgICB0aHJlc2gsIGN2Mi5SRVRSX1RSRUUsIGN2Mi5DSEFJTl9BUFBST1hfU0lNUExFKQorICAgIGVsaWYgY3YyX3ZlcnNpb24uc3RhcnRzd2l0aCgnMy4yLicpOgorICAgICAgICBfLCBjb250b3VycywgXyA9IGN2Mi5maW5kQ29udG91cnMoCisgICAgICAgICAgICAgICAgdGhyZXNoLCBjdjIuUkVUUl9UUkVFLCBjdjIuQ0hBSU5fQVBQUk9YX1NJTVBMRSkKKworICAgICMgRmlsdGVyIGNvbnRvdXJzIHRvIHNxdWFyZXMgb25seS4KKyAgICBzcXVhcmVfY29udG91cnMgPSBbXQorCisgICAgZm9yIGNvbnRvdXIgaW4gY29udG91cnM6CisgICAgICAgIHJlY3QgPSBjdjIubWluQXJlYVJlY3QoY29udG91cikKKyAgICAgICAgXywgKHdpZHRoLCBoZWlnaHQpLCBhbmdsZSA9IHJlY3QKKworICAgICAgICAjIFNraXAgbm9uLXNxdWFyZXMgKHdpdGggMC4xIHRvbGVyYW5jZSkKKyAgICAgICAgdG9sZXJhbmNlID0gMC4xCisgICAgICAgIGlmIHdpZHRoIDwgaGVpZ2h0ICogKDEgLSB0b2xlcmFuY2UpIG9yIHdpZHRoID4gaGVpZ2h0ICogKDEgKyB0b2xlcmFuY2UpOgorICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAjIFJlbW92ZSB2ZXJ5IHNtYWxsIGNvbnRvdXJzLgorICAgICAgICAjIFRoZXNlIGFyZSB1c3VhbGx5IGp1c3QgdGlueSBkb3RzIGR1ZSB0byBub2lzZS4KKyAgICAgICAgYXJlYSA9IGN2Mi5jb250b3VyQXJlYShjb250b3VyKQorICAgICAgICBpZiBhcmVhIDwgbWluX3NxdWFyZV9hcmVhOgorICAgICAgICAgICAgY29udGludWUKKworICAgICAgICBpZiBjdjJfdmVyc2lvbi5zdGFydHN3aXRoKCcyLjQuJyk6CisgICAgICAgICAgICBib3ggPSBudW1weS5pbnQwKGN2Mi5jdi5Cb3hQb2ludHMocmVjdCkpCisgICAgICAgIGVsaWYgY3YyX3ZlcnNpb24uc3RhcnRzd2l0aCgnMy4yLicpOgorICAgICAgICAgICAgYm94ID0gbnVtcHkuaW50MChjdjIuYm94UG9pbnRzKHJlY3QpKQorICAgICAgICBzcXVhcmVfY29udG91cnMuYXBwZW5kKGNvbnRvdXIpCisKKyAgICBhcmVhcyA9IFtdCisgICAgZm9yIGNvbnRvdXIgaW4gc3F1YXJlX2NvbnRvdXJzOgorICAgICAgICBhcmVhID0gY3YyLmNvbnRvdXJBcmVhKGNvbnRvdXIpCisgICAgICAgIGFyZWFzLmFwcGVuZChhcmVhKQorCisgICAgbWVkaWFuX2FyZWEgPSBudW1weS5tZWRpYW4oYXJlYXMpCisKKyAgICBmaWx0ZXJlZF9zcXVhcmVzID0gW10KKyAgICBmaWx0ZXJlZF9hbmdsZXMgPSBbXQorICAgIGZvciBzcXVhcmUgaW4gc3F1YXJlX2NvbnRvdXJzOgorICAgICAgICBhcmVhID0gY3YyLmNvbnRvdXJBcmVhKHNxdWFyZSkKKyAgICAgICAgaWYgYXJlYSA8IG1lZGlhbl9hcmVhICogMC45MCBvciBhcmVhID4gbWVkaWFuX2FyZWEgKiAxLjEwOgorICAgICAgICAgICAgY29udGludWUKKworICAgICAgICBmaWx0ZXJlZF9zcXVhcmVzLmFwcGVuZChzcXVhcmUpCisgICAgICAgIF8sICh3aWR0aCwgaGVpZ2h0KSwgYW5nbGUgPSBjdjIubWluQXJlYVJlY3Qoc3F1YXJlKQorICAgICAgICBmaWx0ZXJlZF9hbmdsZXMuYXBwZW5kKGFuZ2xlKQorCisgICAgaWYgbGVuKGZpbHRlcmVkX2FuZ2xlcykgPCAxMDoKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIHJldHVybiBudW1weS5tZWRpYW4oZmlsdGVyZWRfYW5nbGVzKQogCiAKIGNsYXNzIF9fVW5pdFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgpAQCAtMTg2LDEyICszMjgsNjMgQEAKICAgICAgICAgICAgIGJsdXIgPSBjdjIuYmx1cihjaGFydCwgKGosIGopKQogICAgICAgICAgICAgYmx1ciA9IGJsdXJbOiwgOiwgbnVtcHkubmV3YXhpc10KICAgICAgICAgICAgIHNoYXJwbmVzc1tqXSA9ICh5dXZfZnVsbF9zY2FsZSAqCi0gICAgICAgICAgICAgICAgICAgIGl0cy5pbWFnZS5jb21wdXRlX2ltYWdlX3NoYXJwbmVzcyhibHVyIC8gd2hpdGVfbGV2ZWwpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0cy5pbWFnZS5jb21wdXRlX2ltYWdlX3NoYXJwbmVzcyhibHVyIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpdGVfbGV2ZWwpKQogICAgICAgICBzZWxmLmFzc2VydFRydWUobnVtcHkuaXNjbG9zZShzaGFycG5lc3NbMl0vc2hhcnBuZXNzWzRdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1weS5zcXJ0KDIpLCBhdG9sPTAuMSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShudW1weS5pc2Nsb3NlKHNoYXJwbmVzc1s0XS9zaGFycG5lc3NbOF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bXB5LnNxcnQoMiksIGF0b2w9MC4xKSkKIAorICAgIGRlZiB0ZXN0X2dldF9hbmdsZV9pZGVudGlmeV91bnJvdGF0ZWRfY2hlc3Nib2FyZF9hbmdsZShzZWxmKToKKyAgICAgICAgYmFzZWRpciA9IG9zLnBhdGguam9pbigKKyAgICAgICAgICAgICAgICBvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLCAndGVzdF9pbWFnZXMvcm90YXRlZF9jaGVzc2JvYXJkcy8nKQorCisgICAgICAgIG5vcm1hbF9pbWdfcGF0aCA9IG9zLnBhdGguam9pbihiYXNlZGlyLCAnbm9ybWFsLmpwZycpCisgICAgICAgIHdpZGVfaW1nX3BhdGggPSBvcy5wYXRoLmpvaW4oYmFzZWRpciwgJ3dpZGUuanBnJykKKworICAgICAgICBub3JtYWxfaW1nID0gY3YyLmN2dENvbG9yKAorICAgICAgICAgICAgICAgIGN2Mi5pbXJlYWQobm9ybWFsX2ltZ19wYXRoKSwgY3YyLkNPTE9SX0JHUjJHUkFZKQorICAgICAgICB3aWRlX2ltZyA9IGN2Mi5jdnRDb2xvcigKKyAgICAgICAgICAgICAgICBjdjIuaW1yZWFkKHdpZGVfaW1nX3BhdGgpLCBjdjIuQ09MT1JfQkdSMkdSQVkpCisKKyAgICAgICAgYXNzZXJ0IGdldF9hbmdsZShub3JtYWxfaW1nKSA9PSAwCisgICAgICAgIGFzc2VydCBnZXRfYW5nbGUod2lkZV9pbWcpID09IDAKKworICAgIGRlZiB0ZXN0X2dldF9hbmdsZV9pZGVudGlmeV9yb3RhdGVkX2NoZXNzYm9hcmRfYW5nbGUoc2VsZik6CisgICAgICAgIGJhc2VkaXIgPSBvcy5wYXRoLmpvaW4oCisgICAgICAgICAgICAgICAgb3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgJ3Rlc3RfaW1hZ2VzL3JvdGF0ZWRfY2hlc3Nib2FyZHMvJykKKworICAgICAgICAjIEFycmF5IG9mIHRoZSBpbWFnZSBmaWxlcyBhbmQgYW5nbGVzIGNvbnRhaW5pbmcgcm90YXRlZCBjaGVzc2JvYXJkcy4KKyAgICAgICAgdGVzdF9jYXNlcyA9IFsKKyAgICAgICAgICAgICAgICAoJ18xNV9jY3cnLCAxNSksCisgICAgICAgICAgICAgICAgKCdfMzBfY2N3JywgMzApLAorICAgICAgICAgICAgICAgICgnXzQ1X2NjdycsIDQ1KSwKKyAgICAgICAgICAgICAgICAoJ182MF9jY3cnLCA2MCksCisgICAgICAgICAgICAgICAgKCdfNzVfY2N3JywgNzUpLAorICAgICAgICAgICAgICAgICgnXzkwX2NjdycsIDkwKQorICAgICAgICBdCisKKyAgICAgICAgIyBGb3IgZWFjaCByb3RhdGVkIGltYWdlIHBhaXIgKG5vcm1hbCwgd2lkZSkuIENoZWNrIGlmIGFuZ2xlIGlzCisgICAgICAgICMgaWRlbnRpZmllZCBhcyBleHBlY3RlZC4KKyAgICAgICAgZm9yIHN1ZmZpeCwgYW5nbGUgaW4gdGVzdF9jYXNlczoKKyAgICAgICAgICAgICMgRGVmaW5lIGltYWdlIHBhdGhzCisgICAgICAgICAgICBub3JtYWxfaW1nX3BhdGggPSBvcy5wYXRoLmpvaW4oCisgICAgICAgICAgICAgICAgICAgIGJhc2VkaXIsICdub3JtYWx7fS5qcGcnLmZvcm1hdChzdWZmaXgpKQorICAgICAgICAgICAgd2lkZV9pbWdfcGF0aCA9IG9zLnBhdGguam9pbigKKyAgICAgICAgICAgICAgICAgICAgYmFzZWRpciwgJ3dpZGV7fS5qcGcnLmZvcm1hdChzdWZmaXgpKQorCisgICAgICAgICAgICAjIExvYWQgYW5kIGNvbG9yIGNvbnZlcnQgaW1hZ2VzCisgICAgICAgICAgICBub3JtYWxfaW1nID0gY3YyLmN2dENvbG9yKAorICAgICAgICAgICAgICAgICAgICBjdjIuaW1yZWFkKG5vcm1hbF9pbWdfcGF0aCksIGN2Mi5DT0xPUl9CR1IyR1JBWSkKKyAgICAgICAgICAgIHdpZGVfaW1nID0gY3YyLmN2dENvbG9yKAorICAgICAgICAgICAgICAgICAgICBjdjIuaW1yZWFkKHdpZGVfaW1nX3BhdGgpLCBjdjIuQ09MT1JfQkdSMkdSQVkpCisKKyAgICAgICAgICAgICMgQXNzZXJ0IGFuZ2xlIGlzIGFzIGV4cGVjdGVkIHVwIHRvIDIuMCBkZWdyZWVzIG9mIGFjY3VyYWN5LgorICAgICAgICAgICAgYXNzZXJ0IG51bXB5LmlzY2xvc2UoCisgICAgICAgICAgICAgICAgICAgIGFicyhnZXRfYW5nbGUobm9ybWFsX2ltZykpLCBhbmdsZSwgMi4wKQorICAgICAgICAgICAgYXNzZXJ0IG51bXB5LmlzY2xvc2UoCisgICAgICAgICAgICAgICAgICAgIGFicyhnZXRfYW5nbGUod2lkZV9pbWcpKSwgYW5nbGUsIDIuMCkKKwogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvYXBwcy9DYW1lcmFJVFMvcHltb2R1bGVzL2l0cy9kZXZpY2UucHkgYi9hcHBzL0NhbWVyYUlUUy9weW1vZHVsZXMvaXRzL2RldmljZS5weQppbmRleCA0OWJhZmM0Li44YjAyMjMwIDEwMDY0NAotLS0gYS9hcHBzL0NhbWVyYUlUUy9weW1vZHVsZXMvaXRzL2RldmljZS5weQorKysgYi9hcHBzL0NhbWVyYUlUUy9weW1vZHVsZXMvaXRzL2RldmljZS5weQpAQCAtMjUsOCArMjUsNyBAQAogaW1wb3J0IGhhc2hsaWIKIGltcG9ydCBudW1weQogaW1wb3J0IHN0cmluZwotCi1DTURfREVMQVkgPSAxICAjIHNlY29uZHMKK2ltcG9ydCB1bmljb2RlZGF0YQogCiAKIGNsYXNzIEl0c1Nlc3Npb24ob2JqZWN0KToKQEAgLTExOCwxMCArMTE3LDEwIEBACiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgc29ja2V0X2xvY2suYmluZCgoSXRzU2Vzc2lvbi5JUEFERFIsIEl0c1Nlc3Npb24uTE9DS19QT1JUKSkKICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKKyAgICAgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3Igb3Igc29ja2V0LnRpbWVvdXQ6CiAgICAgICAgICAgICAgICAgaWYgaSA9PSBOVU1fUkVUUklFUyAtIDE6CiAgICAgICAgICAgICAgICAgICAgIHJhaXNlIGl0cy5lcnJvci5FcnJvcihzZWxmLmRldmljZV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY3F1aXJpbmcgc29ja2V0IGxvY2sgdGltZWQgb3V0IikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb2NrZXQgbG9jayByZXR1cm5zIGVycm9yIikKICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKFJFVFJZX1dBSVRfVElNRV9TRUMpCiAKQEAgLTIwMywxMSArMjAyLDcgQEAKIAogICAgICAgICAjIFRPRE86IEZpZ3VyZSBvdXQgd2h5ICItLXVzZXIgMCIgaXMgbmVlZGVkLCBhbmQgZml4IHRoZSBwcm9ibGVtLgogICAgICAgICBfcnVuKCclcyBzaGVsbCBhbSBmb3JjZS1zdG9wIC0tdXNlciAwICVzJyAlIChzZWxmLmFkYiwgc2VsZi5QQUNLQUdFKSkKLSAgICAgICAgX3J1bigoJyVzIHNoZWxsIGFtIHN0YXJ0IC0tdXNlciAwICcKLSAgICAgICAgICAgICAgJ2NvbS5hbmRyb2lkLmN0cy52ZXJpZmllci8uY2FtZXJhLml0cy5JdHNUZXN0QWN0aXZpdHkgJwotICAgICAgICAgICAgICAnLS1hY3Rpdml0eS1icm91Z2h0LXRvLWZyb250JykgJSBzZWxmLmFkYikKLSAgICAgICAgdGltZS5zbGVlcChDTURfREVMQVkpCi0gICAgICAgIF9ydW4oKCclcyBzaGVsbCBhbSBzdGFydHNlcnZpY2UgLS11c2VyIDAgLXQgdGV4dC9wbGFpbiAnCisgICAgICAgIF9ydW4oKCclcyBzaGVsbCBhbSBzdGFydC1mb3JlZ3JvdW5kLXNlcnZpY2UgLS11c2VyIDAgLXQgdGV4dC9wbGFpbiAnCiAgICAgICAgICAgICAgICctYSAlcycpICUgKHNlbGYuYWRiLCBzZWxmLklOVEVOVF9TVEFSVCkpCiAKICAgICAgICAgIyBXYWl0IHVudGlsIHRoZSBzb2NrZXQgaXMgcmVhZHkgdG8gYWNjZXB0IGEgY29ubmVjdGlvbi4KQEAgLTIyMSw3ICsyMTYsMTAgQEAKICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICBwcm9jLmtpbGwoKQogCi0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjYW1lcmFfaWQ9Tm9uZSk6CisgICAgICAgIHNlbGYuX2NhbWVyYV9pZCA9IGNhbWVyYV9pZAorCisgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKICAgICAgICAgIyBJbml0aWFsaXplIGRldmljZSBpZCBhbmQgYWRiIGNvbW1hbmQuCiAgICAgICAgIHNlbGYuZGV2aWNlX2lkID0gZ2V0X2RldmljZV9pZCgpCiAgICAgICAgIHNlbGYuYWRiID0gImFkYiAtcyAiICsgc2VsZi5kZXZpY2VfaWQKQEAgLTIzMCwxNyArMjI4LDEzIEBACiAgICAgICAgIHNlbGYuX19pbml0X3NvY2tldF9wb3J0KCkKIAogICAgICAgICBzZWxmLl9fY2xvc2VfY2FtZXJhKCkKLSAgICAgICAgc2VsZi5fX29wZW5fY2FtZXJhKCkKLQotICAgIGRlZiBfX2RlbF9fKHNlbGYpOgotICAgICAgICBpZiBoYXNhdHRyKHNlbGYsICdzb2NrJykgYW5kIHNlbGYuc29jazoKLSAgICAgICAgICAgIHNlbGYuX19jbG9zZV9jYW1lcmEoKQotICAgICAgICAgICAgc2VsZi5zb2NrLmNsb3NlKCkKLQotICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgIHNlbGYuX19vcGVuX2NhbWVyYShzZWxmLl9jYW1lcmFfaWQpCiAgICAgICAgIHJldHVybiBzZWxmCiAKICAgICBkZWYgX19leGl0X18oc2VsZiwgdHlwZSwgdmFsdWUsIHRyYWNlYmFjayk6CisgICAgICAgIGlmIGhhc2F0dHIoc2VsZiwgJ3NvY2snKSBhbmQgc2VsZi5zb2NrOgorICAgICAgICAgICAgc2VsZi5fX2Nsb3NlX2NhbWVyYSgpCisgICAgICAgICAgICBzZWxmLnNvY2suY2xvc2UoKQogICAgICAgICByZXR1cm4gRmFsc2UKIAogICAgIGRlZiBfX3JlYWRfcmVzcG9uc2VfZnJvbV9zb2NrZXQoc2VsZik6CkBAIC0yNjcsMTIgKzI2MSwxNyBAQAogICAgICAgICAgICAgYnVmID0gbnVtcHkuZnJvbWJ1ZmZlcihidWYsIGR0eXBlPW51bXB5LnVpbnQ4KQogICAgICAgICByZXR1cm4gam9iaiwgYnVmCiAKLSAgICBkZWYgX19vcGVuX2NhbWVyYShzZWxmKToKLSAgICAgICAgIyBHZXQgdGhlIGNhbWVyYSBJRCB0byBvcGVuIGFzIGFuIGFyZ3VtZW50LgotICAgICAgICBjYW1lcmFfaWQgPSAwCi0gICAgICAgIGZvciBzIGluIHN5cy5hcmd2WzE6XToKLSAgICAgICAgICAgIGlmIHNbOjddID09ICJjYW1lcmE9IiBhbmQgbGVuKHMpID4gNzoKLSAgICAgICAgICAgICAgICBjYW1lcmFfaWQgPSBpbnQoc1s3Ol0pCisgICAgZGVmIF9fb3Blbl9jYW1lcmEoc2VsZiwgY2FtZXJhX2lkKToKKyAgICAgICAgIyBHZXQgdGhlIGNhbWVyYSBJRCB0byBvcGVuIGlmIGl0IGlzIGFuIGFyZ3VtZW50IGFzIGEgc2luZ2xlIGNhbWVyYS4KKyAgICAgICAgIyBUaGlzIGFsbG93cyBwYXNzaW5nIGNhbWVyYT0jIHRvIGluZGl2aWR1YWwgdGVzdHMgYXQgY29tbWFuZCBsaW5lCisgICAgICAgICMgYW5kIGNhbWVyYT0jLCMsIyBvciBhbiBubyBjYW1lcmEgYXJndiB3aXRoIHRvb2xzL3J1bl9hbGxfdGVzdHMucHkuCisgICAgICAgIGlmIG5vdCBjYW1lcmFfaWQ6CisgICAgICAgICAgICBjYW1lcmFfaWQgPSAwCisgICAgICAgICAgICBmb3IgcyBpbiBzeXMuYXJndlsxOl06CisgICAgICAgICAgICAgICAgaWYgc1s6N10gPT0gImNhbWVyYT0iIGFuZCBsZW4ocykgPiA3OgorICAgICAgICAgICAgICAgICAgICBjYW1lcmFfaWRzID0gc1s3Ol0uc3BsaXQoIiwiKQorICAgICAgICAgICAgICAgICAgICBpZiBsZW4oY2FtZXJhX2lkcykgPT0gMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYV9pZCA9IGNhbWVyYV9pZHNbMF0KICAgICAgICAgY21kID0geyJjbWROYW1lIjoib3BlbiIsICJjYW1lcmFJZCI6Y2FtZXJhX2lkfQogICAgICAgICBzZWxmLnNvY2suc2VuZChqc29uLmR1bXBzKGNtZCkgKyAiXG4iKQogICAgICAgICBkYXRhLF8gPSBzZWxmLl9fcmVhZF9yZXNwb25zZV9mcm9tX3NvY2tldCgpCkBAIC0zOTksMTMgKzM5OCwzMyBAQAogICAgICAgICBzZWxmLnByb3BzID0gZGF0YVsnb2JqVmFsdWUnXVsnY2FtZXJhUHJvcGVydGllcyddCiAgICAgICAgIHJldHVybiBkYXRhWydvYmpWYWx1ZSddWydjYW1lcmFQcm9wZXJ0aWVzJ10KIAorICAgIGRlZiBnZXRfY2FtZXJhX3Byb3BlcnRpZXNfYnlfaWQoc2VsZiwgY2FtZXJhX2lkKToKKyAgICAgICAgIiIiR2V0IHRoZSBjYW1lcmEgcHJvcGVydGllcyBvYmplY3QgZm9yIGRldmljZSB3aXRoIGNhbWVyYV9pZAorCisgICAgICAgIEFyZ3M6CisgICAgICAgICAgICBjYW1lcmFfaWQ6IFRoZSBJRCBzdHJpbmcgb2YgdGhlIGNhbWVyYQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBUaGUgUHl0aG9uIGRpY3Rpb25hcnkgb2JqZWN0IGZvciB0aGUgQ2FtZXJhUHJvcGVydGllcyBvYmplY3QuIEVtcHR5CisgICAgICAgICAgICBpZiBubyBzdWNoIGRldmljZSBleGlzdHMuCisKKyAgICAgICAgIiIiCisgICAgICAgIGNtZCA9IHt9CisgICAgICAgIGNtZFsiY21kTmFtZSJdID0gImdldENhbWVyYVByb3BlcnRpZXNCeUlkIgorICAgICAgICBjbWRbImNhbWVyYUlkIl0gPSBjYW1lcmFfaWQKKyAgICAgICAgc2VsZi5zb2NrLnNlbmQoanNvbi5kdW1wcyhjbWQpICsgIlxuIikKKyAgICAgICAgZGF0YSxfID0gc2VsZi5fX3JlYWRfcmVzcG9uc2VfZnJvbV9zb2NrZXQoKQorICAgICAgICBpZiBkYXRhWyd0YWcnXSAhPSAnY2FtZXJhUHJvcGVydGllcyc6CisgICAgICAgICAgICByYWlzZSBpdHMuZXJyb3IuRXJyb3IoJ0ludmFsaWQgY29tbWFuZCByZXNwb25zZScpCisgICAgICAgIHJldHVybiBkYXRhWydvYmpWYWx1ZSddWydjYW1lcmFQcm9wZXJ0aWVzJ10KKwogICAgIGRlZiBkb18zYShzZWxmLCByZWdpb25zX2FlPVtbMCwwLDEsMSwxXV0sCiAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbnNfYXdiPVtbMCwwLDEsMSwxXV0sCiAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbnNfYWY9W1swLDAsMSwxLDFdXSwKICAgICAgICAgICAgICAgICAgICAgZG9fYWU9VHJ1ZSwgZG9fYXdiPVRydWUsIGRvX2FmPVRydWUsCiAgICAgICAgICAgICAgICAgICAgIGxvY2tfYWU9RmFsc2UsIGxvY2tfYXdiPUZhbHNlLAogICAgICAgICAgICAgICAgICAgICBnZXRfcmVzdWx0cz1GYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgZXZfY29tcD0wKToKKyAgICAgICAgICAgICAgICAgICAgZXZfY29tcD0wLCBtb25vX2NhbWVyYT1GYWxzZSk6CiAgICAgICAgICIiIlBlcmZvcm0gYSAzQSBvcGVyYXRpb24gb24gdGhlIGRldmljZS4KIAogICAgICAgICBUcmlnZ2VycyBzb21lIG9yIGFsbCBvZiBBRSwgQVdCLCBhbmQgQUYsIGFuZCByZXR1cm5zIG9uY2UgdGhleSBoYXZlCkBAIC00MjUsNiArNDQ0LDcgQEAKICAgICAgICAgICAgIGxvY2tfYXdiOiBSZXF1ZXN0IEFXQiBsb2NrIGFmdGVyIGNvbnZlcmdlbmNlLCBhbmQgd2FpdCBmb3IgaXQuCiAgICAgICAgICAgICBnZXRfcmVzdWx0czogUmV0dXJuIHRoZSAzQSByZXN1bHRzIGZyb20gdGhpcyBmdW5jdGlvbi4KICAgICAgICAgICAgIGV2X2NvbXA6IEFuIEVWIGNvbXBlbnNhdGlvbiB2YWx1ZSB0byB1c2Ugd2hlbiBydW5uaW5nIEFFLgorICAgICAgICAgICAgbW9ub19jYW1lcmE6IEJvb2xlYW4gZm9yIG1vbm9jaHJvbWUgY2FtZXJhLgogCiAgICAgICAgIFJlZ2lvbiBmb3JtYXQgaW4gYXJnczoKICAgICAgICAgICAgIEFyZ3VtZW50cyBhcmUgbGlzdHMgb2Ygd2VpZ2h0ZWQgcmVnaW9uczsgZWFjaCB3ZWlnaHRlZCByZWdpb24gaXMgYQpAQCAtNDg1LDggKzUwNSw5IEBACiAgICAgICAgICAgICAgICAgcmFpc2UgaXRzLmVycm9yLkVycm9yKCdJbnZhbGlkIGNvbW1hbmQgcmVzcG9uc2UnKQogICAgICAgICBpZiBjb252ZXJnZWQgYW5kIG5vdCBnZXRfcmVzdWx0czoKICAgICAgICAgICAgIHJldHVybiBOb25lLE5vbmUsTm9uZSxOb25lLE5vbmUKLSAgICAgICAgaWYgKGRvX2FlIGFuZCBhZV9zZW5zID09IE5vbmUgb3IgZG9fYXdiIGFuZCBhd2JfZ2FpbnMgPT0gTm9uZQorICAgICAgICBpZiAoZG9fYWUgYW5kIGFlX3NlbnMgPT0gTm9uZSBvciAobm90IG1vbm9fY2FtZXJhIGFuZCBkb19hd2IgYW5kIGF3Yl9nYWlucyA9PSBOb25lKQogICAgICAgICAgICAgICAgIG9yIGRvX2FmIGFuZCBhZl9kaXN0ID09IE5vbmUgb3Igbm90IGNvbnZlcmdlZCk6CisKICAgICAgICAgICAgIHJhaXNlIGl0cy5lcnJvci5FcnJvcignM0EgZmFpbGVkIHRvIGNvbnZlcmdlJykKICAgICAgICAgcmV0dXJuIGFlX3NlbnMsIGFlX2V4cCwgYXdiX2dhaW5zLCBhd2JfdHJhbnNmb3JtLCBhZl9kaXN0CiAKQEAgLTUxMSw2ICs1MzIsMTcgQEAKICAgICAgICAgImRuZyIsICJyYXciLCAicmF3MTAiLCAicmF3MTIiLCBvciAicmF3U3RhdHMiLiBUaGUgZGVmYXVsdCBpcyBhIFlVVjQyMAogICAgICAgICBmcmFtZSAoInl1diIpIGNvcnJlc3BvbmRpbmcgdG8gYSBmdWxsIHNlbnNvciBmcmFtZS4KIAorICAgICAgICBPcHRpb25hbGx5IHRoZSBvdXRfc3VyZmFjZXMgZmllbGQgY2FuIHNwZWNpZnkgcGh5c2ljYWwgY2FtZXJhIGlkKHMpIGlmIHRoZQorICAgICAgICBjdXJyZW50IGNhbWVyYSBkZXZpY2UgaXMgYSBsb2dpY2FsIG11bHRpLWNhbWVyYS4gVGhlIHBoeXNpY2FsIGNhbWVyYSBpZAorICAgICAgICBtdXN0IHJlZmVyIHRvIGEgcGh5c2ljYWwgY2FtZXJhIGJhY2tpbmcgdGhpcyBsb2dpY2FsIGNhbWVyYSBkZXZpY2UuIEFuZAorICAgICAgICBvbmx5ICJ5dXYiLCAicmF3IiwgInJhdzEwIiwgInJhdzEyIiBzdXBwb3J0IHRoZSBwaHlzaWNhbCBjYW1lcmEgaWQgZmllbGQuCisKKyAgICAgICAgQ3VycmVudGx5IG9ubHkgMiBwaHlzaWNhbCBzdHJlYW1zIHdpdGggdGhlIHNhbWUgZm9ybWF0IGFyZSBzdXBwb3J0ZWQsIG9uZQorICAgICAgICBmcm9tIGVhY2ggcGh5c2ljYWwgY2FtZXJhOgorICAgICAgICAtIHl1diBwaHlzaWNhbCBzdHJlYW1zIG9mIHRoZSBzYW1lIHNpemUuCisgICAgICAgIC0gcmF3IHBoeXNpY2FsIHN0cmVhbXMgd2l0aCB0aGUgc2FtZSBvciBkaWZmZXJlbnQgc2l6ZXMsIGRlcGVuZGluZyBvbgorICAgICAgICAgIGRldmljZSBjYXBhYmlsaXR5LiAoRGlmZmVyZW50IHBoeXNpY2FsIGNhbWVyYXMgbWF5IGhhdmUgZGlmZmVyZW50IHJhdyBzaXplcykuCisKICAgICAgICAgTm90ZSB0aGF0IG9uZSBvciBtb3JlIHN1cmZhY2VzIGNhbiBiZSBzcGVjaWZpZWQsIGFsbG93aW5nIGEgY2FwdHVyZSB0bwogICAgICAgICByZXF1ZXN0IGltYWdlcyBiYWNrIGluIG11bHRpcGxlIGZvcm1hdHMgKGUuZy4pIHJhdyt5dXYsIHJhdytqcGVnLAogICAgICAgICB5dXYranBlZywgcmF3K3l1ditqcGVnLiBJZiB0aGUgc2l6ZSBpcyBvbWl0dGVkIGZvciBhIHN1cmZhY2UsIHRoZQpAQCAtNjcyLDE0ICs3MDQsMzYgQEAKICAgICAgICAgICAgIGNtZFsib3V0cHV0U3VyZmFjZXMiXSA9IFt7ImZvcm1hdCI6ICJ5dXYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2lkdGgiIDogbWF4X3l1dl9zaXplWzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGVpZ2h0IjogbWF4X3l1dl9zaXplWzFdfV0KKworICAgICAgICAjIEZpZ3VyZSBvdXQgcmVxdWVzdGVkIHBoeXNpY2FsIGNhbWVyYSBpZHMsIHBoeXNpY2FsIGFuZCBsb2dpY2FsCisgICAgICAgICMgc3RyZWFtcy4KKyAgICAgICAgcGh5c2ljYWxfY2FtX2lkcyA9IHt9CisgICAgICAgIHBoeXNpY2FsX2J1ZmZlcnMgPSB7fQorICAgICAgICBwaHlzaWNhbF9jYW1fZm9ybWF0ID0gTm9uZQorICAgICAgICBsb2dpY2FsX2NhbV9mb3JtYXRzID0gW10KKyAgICAgICAgZm9yIGkscyBpbiBlbnVtZXJhdGUoY21kWyJvdXRwdXRTdXJmYWNlcyJdKToKKyAgICAgICAgICAgIGlmICJmb3JtYXQiIGluIHMgYW5kIHNbImZvcm1hdCJdIGluIFsieXV2IiwgInJhdyIsICJyYXcxMCIsICJyYXcxMiJdOgorICAgICAgICAgICAgICAgIGlmICJwaHlzaWNhbENhbWVyYSIgaW4gczoKKyAgICAgICAgICAgICAgICAgICAgaWYgcGh5c2ljYWxfY2FtX2Zvcm1hdCBpcyBub3QgTm9uZSBhbmQgc1siZm9ybWF0Il0gIT0gcGh5c2ljYWxfY2FtX2Zvcm1hdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIGl0cy5lcnJvci5FcnJvcignSVRTIGRvZXMgbm90IHN1cHBvcnQgY2FwdHVyaW5nIG11bHRpcGxlICcgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwaHlzaWNhbCBmb3JtYXRzIHlldCcpCisgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsX2NhbV9pZHNbaV0gPSBzWyJwaHlzaWNhbENhbWVyYSJdCisgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsX2J1ZmZlcnNbc1sicGh5c2ljYWxDYW1lcmEiXV0gPSBbXQorICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbF9jYW1fZm9ybWF0ID0gc1siZm9ybWF0Il0KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBsb2dpY2FsX2NhbV9mb3JtYXRzLmFwcGVuZChzWyJmb3JtYXQiXSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbG9naWNhbF9jYW1fZm9ybWF0cy5hcHBlbmQoc1siZm9ybWF0Il0pCisKICAgICAgICAgbmNhcCA9IGxlbihjbWRbImNhcHR1cmVSZXF1ZXN0cyJdKQogICAgICAgICBuc3VyZiA9IDEgaWYgb3V0X3N1cmZhY2VzIGlzIE5vbmUgZWxzZSBsZW4oY21kWyJvdXRwdXRTdXJmYWNlcyJdKQogICAgICAgICAjIE9ubHkgYWxsb3cgeXV2IG91dHB1dCB0byBtdWx0aXBsZSB0YXJnZXRzCi0gICAgICAgIHl1dl9zdXJmYWNlcyA9IFtzIGZvciBzIGluIGNtZFsib3V0cHV0U3VyZmFjZXMiXSBpZiBzWyJmb3JtYXQiXT09Inl1diJdCi0gICAgICAgIG5feXV2ID0gbGVuKHl1dl9zdXJmYWNlcykKKyAgICAgICAgbG9naWNhbF95dXZfc3VyZmFjZXMgPSBbcyBmb3IgcyBpbiBjbWRbIm91dHB1dFN1cmZhY2VzIl0gaWYgc1siZm9ybWF0Il09PSJ5dXYiXAorICAgICAgICAgICAgICAgICAgICAgICAgYW5kICJwaHlzaWNhbENhbWVyYSIgbm90IGluIHNdCisgICAgICAgIG5feXV2ID0gbGVuKGxvZ2ljYWxfeXV2X3N1cmZhY2VzKQogICAgICAgICAjIENvbXB1dGUgdGhlIGJ1ZmZlciBzaXplIG9mIFlVViB0YXJnZXRzCiAgICAgICAgIHl1dl9tYXhzaXplXzFkID0gMAotICAgICAgICBmb3IgcyBpbiB5dXZfc3VyZmFjZXM6CisgICAgICAgIGZvciBzIGluIGxvZ2ljYWxfeXV2X3N1cmZhY2VzOgogICAgICAgICAgICAgaWYgbm90ICgid2lkdGgiIGluIHMgYW5kICJoZWlnaHQiIGluIHMpOgogICAgICAgICAgICAgICAgIGlmIHNlbGYucHJvcHMgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICAgcmFpc2UgaXRzLmVycm9yLkVycm9yKCdDYW1lcmEgcHJvcHMgYXJlIHVuYXZhaWxhYmxlJykKQEAgLTY5MCwxNCArNzQ0LDE0IEBACiAgICAgICAgIHl1dl9zaXplcyA9IFtjWyJ3aWR0aCJdKmNbImhlaWdodCJdKjMvMgogICAgICAgICAgICAgICAgICAgICAgaWYgIndpZHRoIiBpbiBjIGFuZCAiaGVpZ2h0IiBpbiBjCiAgICAgICAgICAgICAgICAgICAgICBlbHNlIHl1dl9tYXhzaXplXzFkCi0gICAgICAgICAgICAgICAgICAgICBmb3IgYyBpbiB5dXZfc3VyZmFjZXNdCisgICAgICAgICAgICAgICAgICAgICBmb3IgYyBpbiBsb2dpY2FsX3l1dl9zdXJmYWNlc10KICAgICAgICAgIyBDdXJyZW50bHkgd2UgZG9uJ3QgcGFzcyBlbm91Z2ggbWV0YWR0YSBmcm9tIEl0c1NlcnZpY2UgdG8gZGlzdGluZ3Vpc2gKICAgICAgICAgIyBkaWZmZXJlbnQgeXV2IHN0cmVhbSBvZiBzYW1lIGJ1ZmZlciBzaXplCiAgICAgICAgIGlmIGxlbih5dXZfc2l6ZXMpICE9IGxlbihzZXQoeXV2X3NpemVzKSk6CiAgICAgICAgICAgICByYWlzZSBpdHMuZXJyb3IuRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICdJVFMgZG9lcyBub3Qgc3VwcG9ydCB5dXYgb3V0cHV0cyBvZiBzYW1lIGJ1ZmZlciBzaXplJykKLSAgICAgICAgaWYgbGVuKGZvcm1hdHMpID4gbGVuKHNldChmb3JtYXRzKSk6Ci0gICAgICAgICAgICBpZiBuX3l1diAhPSBsZW4oZm9ybWF0cykgLSBsZW4oc2V0KGZvcm1hdHMpKSArIDE6CisgICAgICAgIGlmIGxlbihsb2dpY2FsX2NhbV9mb3JtYXRzKSA+IGxlbihzZXQobG9naWNhbF9jYW1fZm9ybWF0cykpOgorICAgICAgICAgIGlmIG5feXV2ICE9IGxlbihsb2dpY2FsX2NhbV9mb3JtYXRzKSAtIGxlbihzZXQobG9naWNhbF9jYW1fZm9ybWF0cykpICsgMToKICAgICAgICAgICAgICAgICByYWlzZSBpdHMuZXJyb3IuRXJyb3IoJ0R1cGxpY2F0ZSBmb3JtYXQgcmVxdWVzdGVkJykKIAogICAgICAgICByYXdfZm9ybWF0cyA9IDA7CkBAIC03MzYsNiArNzkwLDcgQEAKICAgICAgICAgICAgICAgICAicmF3U3RhdHMiOltdLCAiZG5nIjpbXSwgImpwZWciOltdfQogICAgICAgICB5dXZfYnVmcyA9IHtzaXplOltdIGZvciBzaXplIGluIHl1dl9zaXplc30KICAgICAgICAgbWRzID0gW10KKyAgICAgICAgcGh5c2ljYWxfbWRzID0gW10KICAgICAgICAgd2lkdGhzID0gTm9uZQogICAgICAgICBoZWlnaHRzID0gTm9uZQogICAgICAgICB3aGlsZSBuYnVmcyA8IG5jYXAqbnN1cmYgb3IgbGVuKG1kcykgPCBuY2FwOgpAQCAtNzUyLDEyICs4MDcsMTggQEAKICAgICAgICAgICAgICAgICBuYnVmcyArPSAxCiAgICAgICAgICAgICBlbGlmIGpzb25PYmpbJ3RhZyddID09ICdjYXB0dXJlUmVzdWx0cyc6CiAgICAgICAgICAgICAgICAgbWRzLmFwcGVuZChqc29uT2JqWydvYmpWYWx1ZSddWydjYXB0dXJlUmVzdWx0J10pCisgICAgICAgICAgICAgICAgcGh5c2ljYWxfbWRzLmFwcGVuZChqc29uT2JqWydvYmpWYWx1ZSddWydwaHlzaWNhbFJlc3VsdHMnXSkKICAgICAgICAgICAgICAgICBvdXRwdXRzID0ganNvbk9ialsnb2JqVmFsdWUnXVsnb3V0cHV0cyddCiAgICAgICAgICAgICAgICAgd2lkdGhzID0gW291dFsnd2lkdGgnXSBmb3Igb3V0IGluIG91dHB1dHNdCiAgICAgICAgICAgICAgICAgaGVpZ2h0cyA9IFtvdXRbJ2hlaWdodCddIGZvciBvdXQgaW4gb3V0cHV0c10KICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgIyBKdXN0IGlnbm9yZSBvdGhlciB0YWdzCi0gICAgICAgICAgICAgICAgTm9uZQorICAgICAgICAgICAgICAgIHRhZ1N0cmluZyA9IHVuaWNvZGVkYXRhLm5vcm1hbGl6ZSgnTkZLRCcsIGpzb25PYmpbJ3RhZyddKS5lbmNvZGUoJ2FzY2lpJywgJ2lnbm9yZScpOworICAgICAgICAgICAgICAgIGZvciB4IGluIFsncmF3SW1hZ2UnLCAncmF3MTBJbWFnZScsICdyYXcxMkltYWdlJywgJ3l1dkltYWdlJ106CisgICAgICAgICAgICAgICAgICAgIGlmICh0YWdTdHJpbmcuc3RhcnRzd2l0aCh4KSk6CisgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbElkID0ganNvbk9ialsndGFnJ11bbGVuKHgpOl07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBwaHlzaWNhbElkIGluIHBoeXNpY2FsX2NhbV9pZHMudmFsdWVzKCk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxfYnVmZmVyc1twaHlzaWNhbElkXS5hcHBlbmQoYnVmKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5idWZzICs9IDEKICAgICAgICAgcmV0cyA9IFtdCiAgICAgICAgIGZvciBqLGZtdCBpbiBlbnVtZXJhdGUoZm9ybWF0cyk6CiAgICAgICAgICAgICBvYmpzID0gW10KQEAgLTc2Niw4ICs4MjcsMTcgQEAKICAgICAgICAgICAgICAgICBvYmpbIndpZHRoIl0gPSB3aWR0aHNbal0KICAgICAgICAgICAgICAgICBvYmpbImhlaWdodCJdID0gaGVpZ2h0c1tqXQogICAgICAgICAgICAgICAgIG9ialsiZm9ybWF0Il0gPSBmbXQKLSAgICAgICAgICAgICAgICBvYmpbIm1ldGFkYXRhIl0gPSBtZHNbaV0KLSAgICAgICAgICAgICAgICBpZiBmbXQgPT0gJ3l1dic6CisgICAgICAgICAgICAgICAgaWYgaiBpbiBwaHlzaWNhbF9jYW1faWRzOgorICAgICAgICAgICAgICAgICAgICBmb3IgcGh5c2ljYWxfbWQgaW4gcGh5c2ljYWxfbWRzW2ldOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgcGh5c2ljYWxfY2FtX2lkc1tqXSBpbiBwaHlzaWNhbF9tZDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmpbIm1ldGFkYXRhIl0gPSBwaHlzaWNhbF9tZFtwaHlzaWNhbF9jYW1faWRzW2pdXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgb2JqWyJtZXRhZGF0YSJdID0gbWRzW2ldCisKKyAgICAgICAgICAgICAgICBpZiBqIGluIHBoeXNpY2FsX2NhbV9pZHM6CisgICAgICAgICAgICAgICAgICAgIG9ialsiZGF0YSJdID0gcGh5c2ljYWxfYnVmZmVyc1twaHlzaWNhbF9jYW1faWRzW2pdXVtpXQorICAgICAgICAgICAgICAgIGVsaWYgZm10ID09ICd5dXYnOgogICAgICAgICAgICAgICAgICAgICBidWZfc2l6ZSA9IHdpZHRoc1tqXSAqIGhlaWdodHNbal0gKiAzIC8gMgogICAgICAgICAgICAgICAgICAgICBvYmpbImRhdGEiXSA9IHl1dl9idWZzW2J1Zl9zaXplXVtpXQogICAgICAgICAgICAgICAgIGVsc2U6CkBAIC04MzksMTEgKzkwOSwxMyBAQAogICAgIFJldHVybnM6CiAgICAgICAgIE5vdGhpbmcuCiAgICAgIiIiCisgICAgQUNUSVZJVFlfU1RBUlRfV0FJVCA9IDEuNSAjIHNlY29uZHMKICAgICBhZGIgPSAiYWRiIC1zICIgKyBkZXZpY2VfaWQKIAotICAgICMgU3RhcnQgSXRzVGVzdEFjdGl2aXR5IHRvIHByZXZlbnQgZmxha3kKKyAgICAjIFN0YXJ0IEl0c1Rlc3RBY3Rpdml0eSB0byByZWNlaXZlIHRlc3QgcmVzdWx0cwogICAgIGNtZCA9ICIlcyBzaGVsbCBhbSBzdGFydCAlcyAtLWFjdGl2aXR5LWJyb3VnaHQtdG8tZnJvbnQiICUgKGFkYiwgSXRzU2Vzc2lvbi5JVFNfVEVTVF9BQ1RJVklUWSkKICAgICBfcnVuKGNtZCkKKyAgICB0aW1lLnNsZWVwKEFDVElWSVRZX1NUQVJUX1dBSVQpCiAKICAgICAjIFZhbGlkYXRlL3Byb2Nlc3MgcmVzdWx0cyBhcmd1bWVudAogICAgIGZvciBzY2VuZSBpbiByZXN1bHRzOgpAQCAtODcxLDYgKzk0MywyMCBAQAogICAgICAgICBwcmludCAiSVRTIGNvbW1hbmQgc3RyaW5nIG1pZ2h0IGJlIHRvbyBsb25nISBsZW46IiwgbGVuKGNtZCkKICAgICBfcnVuKGNtZCkKIAorZGVmIGFkYl9sb2coZGV2aWNlX2lkLCBtc2cpOgorICAgICIiIlNlbmQgYSBsb2cgbWVzc2FnZSB0byBhZGIgbG9nY2F0CisKKyAgICBBcmdzOgorICAgICAgICBkZXZpY2VfaWQ6IFRoZSBJRCBzdHJpbmcgb2YgdGhlIGFkYiBkZXZpY2UKKyAgICAgICAgbXNnOiB0aGUgbWVzc2FnZSBzdHJpbmcgdG8gYmUgc2VuZCB0byBsb2djYXQKKworICAgIFJldHVybnM6CisgICAgICAgIE5vdGhpbmcuCisgICAgIiIiCisgICAgYWRiID0gImFkYiAtcyAiICsgZGV2aWNlX2lkCisgICAgY21kID0gIiVzIHNoZWxsIGxvZyAtcCBpIC10IFwiSXRzVGVzdEhvc3RcIiAlcyIgJSAoYWRiLCBtc2cpCisgICAgX3J1bihjbWQpCisKIGRlZiBnZXRfZGV2aWNlX2ZpbmdlcnByaW50KGRldmljZV9pZCk6CiAgICAgIiIiIFJldHVybiB0aGUgQnVpbGQgRmluZ2VyUHJpbnQgb2YgdGhlIGRldmljZSB0aGF0IHRoZSB0ZXN0IGlzIHJ1bm5pbmcgb24uCiAKZGlmZiAtLWdpdCBhL2FwcHMvQ2FtZXJhSVRTL3B5bW9kdWxlcy9pdHMvaW1hZ2UucHkgYi9hcHBzL0NhbWVyYUlUUy9weW1vZHVsZXMvaXRzL2ltYWdlLnB5CmluZGV4IGMxYmMwZTIuLjNlYTZmYTMgMTAwNjQ0Ci0tLSBhL2FwcHMvQ2FtZXJhSVRTL3B5bW9kdWxlcy9pdHMvaW1hZ2UucHkKKysrIGIvYXBwcy9DYW1lcmFJVFMvcHltb2R1bGVzL2l0cy9pbWFnZS5weQpAQCAtMTUxLDcgKzE1MSw3IEBACiAgICAgbHNicyA9IGltZ1s6OiwgNDo6NV0ucmVzaGFwZShoLHcvNCkKICAgICBsc2JzID0gbnVtcHkucmlnaHRfc2hpZnQoCiAgICAgICAgICAgICBudW1weS5wYWNrYml0cyhudW1weS51bnBhY2tiaXRzKGxzYnMpLnJlc2hhcGUoaCx3LzQsNCwyKSwzKSwgNikKLSAgICAjIFBhaXIgdGhlIExTQiBiaXRzIGdyb3VwIHRvIHBpeGVsIDAgaW5zdGVhZCBvZiBwaXhlbCAzCisgICAgIyBQYWlyIHRoZSBMU0IgYml0cyBncm91cCB0byAwdGggcGl4ZWwgaW5zdGVhZCBvZiAzcmQgcGl4ZWwKICAgICBsc2JzID0gbHNicy5yZXNoYXBlKGgsdy80LDQpWzosOiw6Oi0xXQogICAgIGxzYnMgPSBsc2JzLnJlc2hhcGUoaCx3KQogICAgICMgRnVzZSB0aGUgTVNCcyBhbmQgTFNCcyBiYWNrIHRvZ2V0aGVyCkBAIC0yNjcsOCArMjY3LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXI9Y2FwWyJkYXRhIl1bMDp3KmgqMl0pCiAgICAgICAgIGltZyA9IGltZy5hc3R5cGUobnVtcHkuZmxvYXQzMikucmVzaGFwZShoLHcpIC8gd2hpdGVfbGV2ZWwKICAgICAgICAgIyBDcm9wIHRoZSByYXcgaW1hZ2UgdG8gdGhlIGFjdGl2ZSBhcnJheSByZWdpb24uCi0gICAgICAgIGlmIHByb3BzLmhhc19rZXkoImFuZHJvaWQuc2Vuc29yLmluZm8uYWN0aXZlQXJyYXlTaXplIikgXAotICAgICAgICAgICAgICAgIGFuZCBwcm9wc1siYW5kcm9pZC5zZW5zb3IuaW5mby5hY3RpdmVBcnJheVNpemUiXSBpcyBub3QgTm9uZSBcCisgICAgICAgIGlmIHByb3BzLmhhc19rZXkoImFuZHJvaWQuc2Vuc29yLmluZm8ucHJlQ29ycmVjdGlvbkFjdGl2ZUFycmF5U2l6ZSIpIFwKKyAgICAgICAgICAgICAgICBhbmQgcHJvcHNbImFuZHJvaWQuc2Vuc29yLmluZm8ucHJlQ29ycmVjdGlvbkFjdGl2ZUFycmF5U2l6ZSJdIGlzIG5vdCBOb25lIFwKICAgICAgICAgICAgICAgICBhbmQgcHJvcHMuaGFzX2tleSgiYW5kcm9pZC5zZW5zb3IuaW5mby5waXhlbEFycmF5U2l6ZSIpIFwKICAgICAgICAgICAgICAgICBhbmQgcHJvcHNbImFuZHJvaWQuc2Vuc29yLmluZm8ucGl4ZWxBcnJheVNpemUiXSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICMgTm90ZSB0aGF0IHRoZSBSZWN0IGNsYXNzIGlzIGRlZmluZWQgc3VjaCB0aGF0IHRoZSBsZWZ0LHRvcCB2YWx1ZXMKQEAgLTI3NywxMCArMjc3LDEwIEBACiAgICAgICAgICAgICAjIGNvbXB1dGVkIGFzIHJpZ2h0LWxlZnQsIHJhdGhlciB0aGFuIHJpZ2h0LWxlZnQrMSwgZXRjLgogICAgICAgICAgICAgd2Z1bGwgPSBwcm9wc1siYW5kcm9pZC5zZW5zb3IuaW5mby5waXhlbEFycmF5U2l6ZSJdWyJ3aWR0aCJdCiAgICAgICAgICAgICBoZnVsbCA9IHByb3BzWyJhbmRyb2lkLnNlbnNvci5pbmZvLnBpeGVsQXJyYXlTaXplIl1bImhlaWdodCJdCi0gICAgICAgICAgICB4Y3JvcCA9IHByb3BzWyJhbmRyb2lkLnNlbnNvci5pbmZvLmFjdGl2ZUFycmF5U2l6ZSJdWyJsZWZ0Il0KLSAgICAgICAgICAgIHljcm9wID0gcHJvcHNbImFuZHJvaWQuc2Vuc29yLmluZm8uYWN0aXZlQXJyYXlTaXplIl1bInRvcCJdCi0gICAgICAgICAgICB3Y3JvcCA9IHByb3BzWyJhbmRyb2lkLnNlbnNvci5pbmZvLmFjdGl2ZUFycmF5U2l6ZSJdWyJyaWdodCJdLXhjcm9wCi0gICAgICAgICAgICBoY3JvcCA9IHByb3BzWyJhbmRyb2lkLnNlbnNvci5pbmZvLmFjdGl2ZUFycmF5U2l6ZSJdWyJib3R0b20iXS15Y3JvcAorICAgICAgICAgICAgeGNyb3AgPSBwcm9wc1siYW5kcm9pZC5zZW5zb3IuaW5mby5wcmVDb3JyZWN0aW9uQWN0aXZlQXJyYXlTaXplIl1bImxlZnQiXQorICAgICAgICAgICAgeWNyb3AgPSBwcm9wc1siYW5kcm9pZC5zZW5zb3IuaW5mby5wcmVDb3JyZWN0aW9uQWN0aXZlQXJyYXlTaXplIl1bInRvcCJdCisgICAgICAgICAgICB3Y3JvcCA9IHByb3BzWyJhbmRyb2lkLnNlbnNvci5pbmZvLnByZUNvcnJlY3Rpb25BY3RpdmVBcnJheVNpemUiXVsicmlnaHQiXS14Y3JvcAorICAgICAgICAgICAgaGNyb3AgPSBwcm9wc1siYW5kcm9pZC5zZW5zb3IuaW5mby5wcmVDb3JyZWN0aW9uQWN0aXZlQXJyYXlTaXplIl1bImJvdHRvbSJdLXljcm9wCiAgICAgICAgICAgICBhc3NlcnQod2Z1bGwgPj0gd2Nyb3AgPj0gMCkKICAgICAgICAgICAgIGFzc2VydChoZnVsbCA+PSBoY3JvcCA+PSAwKQogICAgICAgICAgICAgYXNzZXJ0KHdmdWxsIC0gd2Nyb3AgPj0geGNyb3AgPj0gMCkKQEAgLTQxNCw3ICs0MTQsNyBAQAogICAgIHJldHVybiBpbWcKIAogCi1kZWYgZ2V0X2JsYWNrX2xldmVsKGNoYW4sIHByb3BzLCBjYXBfcmVzKToKK2RlZiBnZXRfYmxhY2tfbGV2ZWwoY2hhbiwgcHJvcHMsIGNhcF9yZXM9Tm9uZSk6CiAgICAgIiIiUmV0dXJuIHRoZSBibGFjayBsZXZlbCB0byB1c2UgZm9yIGEgZ2l2ZW4gY2FwdHVyZS4KIAogICAgIFVzZXMgYSBkeW5hbWljIHZhbHVlIGZyb20gdGhlIGNhcHR1cmUgcmVzdWx0IGlmIGF2YWlsYWJsZSwgZWxzZSBmYWxscyBiYWNrCkBAIC00MjgsNyArNDI4LDcgQEAKICAgICBSZXR1cm5zOgogICAgICAgICBUaGUgYmxhY2sgbGV2ZWwgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgY2hhbm5lbC4KICAgICAiIiIKLSAgICBpZiAoY2FwX3Jlcy5oYXNfa2V5KCdhbmRyb2lkLnNlbnNvci5keW5hbWljQmxhY2tMZXZlbCcpIGFuZAorICAgIGlmIChjYXBfcmVzIGlzIG5vdCBOb25lIGFuZCBjYXBfcmVzLmhhc19rZXkoJ2FuZHJvaWQuc2Vuc29yLmR5bmFtaWNCbGFja0xldmVsJykgYW5kCiAgICAgICAgICAgICBjYXBfcmVzWydhbmRyb2lkLnNlbnNvci5keW5hbWljQmxhY2tMZXZlbCddIGlzIG5vdCBOb25lKToKICAgICAgICAgYmxhY2tfbGV2ZWxzID0gY2FwX3Jlc1snYW5kcm9pZC5zZW5zb3IuZHluYW1pY0JsYWNrTGV2ZWwnXQogICAgIGVsc2U6CkBAIC02NDYsNyArNjQ2LDEwIEBACiAgICAgeXRpbGUgPSBpbnQobWF0aC5jZWlsKHlub3JtICogaGZ1bGwpKQogICAgIHd0aWxlID0gaW50KG1hdGguZmxvb3Iod25vcm0gKiB3ZnVsbCkpCiAgICAgaHRpbGUgPSBpbnQobWF0aC5mbG9vcihobm9ybSAqIGhmdWxsKSkKLSAgICByZXR1cm4gaW1nW3l0aWxlOnl0aWxlK2h0aWxlLHh0aWxlOnh0aWxlK3d0aWxlLDpdLmNvcHkoKQorICAgIGlmIGxlbihpbWcuc2hhcGUpPT0yOgorICAgICAgICByZXR1cm4gaW1nW3l0aWxlOnl0aWxlK2h0aWxlLHh0aWxlOnh0aWxlK3d0aWxlXS5jb3B5KCkKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gaW1nW3l0aWxlOnl0aWxlK2h0aWxlLHh0aWxlOnh0aWxlK3d0aWxlLDpdLmNvcHkoKQogCiAKIGRlZiBjb21wdXRlX2ltYWdlX21lYW5zKGltZyk6CkBAIC02OTcsNiArNzAwLDIyIEBACiAgICAgcmV0dXJuIHNucgogCiAKK2RlZiBjb21wdXRlX2ltYWdlX21heF9ncmFkaWVudHMoaW1nKToKKyAgICAiIiJDYWxjdWxhdGUgdGhlIG1heGltdW0gZ3JhZGllbnQgb2YgZWFjaCBjb2xvciBjaGFubmVsIGluIHRoZSBpbWFnZS4KKworICAgIEFyZ3M6CisgICAgICAgIGltZzogTnVtcHkgZmxvYXQgaW1hZ2UgYXJyYXksIHdpdGggcGl4ZWwgdmFsdWVzIGluIFswLDFdLgorCisgICAgUmV0dXJuczoKKyAgICAgICAgQSBsaXN0IG9mIGdyYWRpZW50IG1heCB2YWx1ZXMsIG9uZSBwZXIgY29sb3IgY2hhbm5lbCBpbiB0aGUgaW1hZ2UuCisgICAgIiIiCisgICAgZ3JhZHMgPSBbXQorICAgIGNoYW5zID0gaW1nLnNoYXBlWzJdCisgICAgZm9yIGkgaW4geHJhbmdlKGNoYW5zKToKKyAgICAgICAgZ3JhZHMuYXBwZW5kKG51bXB5LmFtYXgobnVtcHkuZ3JhZGllbnQoaW1nWzosIDosIGldKSkpCisgICAgcmV0dXJuIGdyYWRzCisKKwogZGVmIHdyaXRlX2ltYWdlKGltZywgZm5hbWUsIGFwcGx5X2dhbW1hPUZhbHNlKToKICAgICAiIiJTYXZlIGEgZmxvYXQtMyBudW1weSBhcnJheSBpbWFnZSB0byBhIGZpbGUuCiAKQEAgLTc4MCw2ICs3OTksNyBAQAogICAgIFtneSwgZ3hdID0gbnVtcHkuZ3JhZGllbnQobHVtYSkKICAgICByZXR1cm4gbnVtcHkuYXZlcmFnZShudW1weS5zcXJ0KGd5Kmd5ICsgZ3gqZ3gpKQogCisKIGRlZiBub3JtYWxpemVfaW1nKGltZyk6CiAgICAgIiIiTm9ybWFsaXplIHRoZSBpbWFnZSB2YWx1ZXMgdG8gYmV0d2VlbiAwIGFuZCAxLgogCkBAIC03OTAsMjEgKzgxMCwzOSBAQAogICAgICIiIgogICAgIHJldHVybiAoaW1nIC0gbnVtcHkuYW1pbihpbWcpKS8obnVtcHkuYW1heChpbWcpIC0gbnVtcHkuYW1pbihpbWcpKQogCi1kZWYgZmxpcF9taXJyb3JfaW1nX3Blcl9hcmd2KGltZyk6Ci0gICAgIiIiRmxpcC9taXJyb3IgYW4gaW1hZ2UgaWYgImZsaXAiIG9yICJtaXJyb3IiIGlzIGluIGFyZ3YKKworZGVmIGNoYXJ0X2xvY2F0ZWRfcGVyX2FyZ3YoKToKKyAgICAiIiJEZXRlcm1pbmUgaWYgY2hhcnQgYWxyZWFkeSBsb2NhdGVkIG91dHNpZGUgb2YgdGVzdC4KKworICAgIElmIGNoYXJ0IGluZm8gcHJvdmlkZWQsIHJldHVybiBsb2NhdGlvbiBhbmQgc2l6ZS4gSWYgbm90LCByZXR1cm4gTm9uZS4KKworICAgIEFyZ3M6CisgICAgICAgIE5vbmUKKyAgICBSZXR1cm5zOgorICAgICAgICBjaGFydF9sb2M6ICBmbG9hdCBjb252ZXJ0ZWQgeG5vcm0seW5vcm0sd25vcm0saG5vcm0sc2NhbGUgZnJvbSBhcmd2IHRleHQuCisgICAgICAgICAgICAgICAgICAgIGFyZ3YgaXMgb2YgZm9ybSAnY2hhcnRfbG9jPTAuNDUsMC40NSwwLjEsMC4xLDEuMCcKKyAgICAiIiIKKyAgICBmb3IgcyBpbiBzeXMuYXJndlsxOl06CisgICAgICAgIGlmIHNbOjEwXSA9PSAiY2hhcnRfbG9jPSIgYW5kIGxlbihzKSA+IDEwOgorICAgICAgICAgICAgY2hhcnRfbG9jID0gc1sxMDpdLnNwbGl0KCIsIikKKyAgICAgICAgICAgIHJldHVybiBtYXAoZmxvYXQsIGNoYXJ0X2xvYykKKyAgICByZXR1cm4gTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZQorCisKK2RlZiByb3RhdGVfaW1nX3Blcl9hcmd2KGltZyk6CisgICAgIiIiUm90YXRlIGFuIGltYWdlIDE4MCBkZWdyZWVzIGlmICJyb3RhdGUiIGlzIGluIGFyZ3YKIAogICAgIEFyZ3M6CiAgICAgICAgIGltZzogMi1EIG51bXB5IGFycmF5IG9mIGltYWdlIHZhbHVlcwogICAgIFJldHVybnM6Ci0gICAgICAgIEZsaXAvbWlycm9yZWQgaW1hZ2UKKyAgICAgICAgUm90YXRlZCBpbWFnZQogICAgICIiIgogICAgIGltZ19vdXQgPSBpbWcKLSAgICBpZiAiZmxpcCIgaW4gc3lzLmFyZ3Y6Ci0gICAgICAgIGltZ19vdXQgPSBudW1weS5mbGlwdWQoaW1nX291dCkKLSAgICBpZiAibWlycm9yIiBpbiBzeXMuYXJndjoKLSAgICAgICAgaW1nX291dCA9IG51bXB5LmZsaXBscihpbWdfb3V0KQorICAgIGlmICJyb3RhdGUxODAiIGluIHN5cy5hcmd2OgorICAgICAgICBpbWdfb3V0ID0gbnVtcHkuZmxpcGxyKG51bXB5LmZsaXB1ZChpbWdfb3V0KSkKICAgICByZXR1cm4gaW1nX291dAogCisKIGRlZiBzdGF0aW9uYXJ5X2xlbnNfY2FwKGNhbSwgcmVxLCBmbXQpOgogICAgICIiIlRha2UgdXAgdG8gTlVNX1RSWVMgY2FwcyBhbmQgc2F2ZSB0aGUgMXN0IG9uZSB3aXRoIGxlbnMgc3RhdGlvbmFyeS4KIApAQCAtODI5LDYgKzg2Nyw3IEBACiAgICAgICAgICAgICByYWlzZSBpdHMuZXJyb3IuRXJyb3IoJ0Nhbm5vdCBzZXR0bGUgbGVucyBhZnRlciAlZCB0cnlzIScgJSB0cnlzKQogICAgIHJldHVybiBjYXBbTlVNX0ZSQU1FUy0xXQogCisKIGNsYXNzIF9fVW5pdFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogICAgICIiIlJ1biBhIHN1aXRlIG9mIHVuaXQgdGVzdHMgb24gdGhpcyBtb2R1bGUuCiAgICAgIiIiCmRpZmYgLS1naXQgYS9hcHBzL0NhbWVyYUlUUy9weW1vZHVsZXMvaXRzL29iamVjdHMucHkgYi9hcHBzL0NhbWVyYUlUUy9weW1vZHVsZXMvaXRzL29iamVjdHMucHkKaW5kZXggODEyMjE4Ni4uNzhkOGI0MiAxMDA2NDQKLS0tIGEvYXBwcy9DYW1lcmFJVFMvcHltb2R1bGVzL2l0cy9vYmplY3RzLnB5CisrKyBiL2FwcHMvQ2FtZXJhSVRTL3B5bW9kdWxlcy9pdHMvb2JqZWN0cy5weQpAQCAtMTE1LDkgKzExNSwxMCBAQAogICAgICAgICAjQ09OVFJBU1RfQ1VSVkUgbW9kZQogICAgICAgICBpZiAwIGluIHByb3BzWyJhbmRyb2lkLnRvbmVtYXAuYXZhaWxhYmxlVG9uZU1hcE1vZGVzIl06CiAgICAgICAgICAgICByZXFbImFuZHJvaWQudG9uZW1hcC5tb2RlIl0gPSAwCi0gICAgICAgICAgICByZXFbImFuZHJvaWQudG9uZW1hcC5jdXJ2ZVJlZCJdID0gWzAuMCwwLjAsIDEuMCwxLjBdCi0gICAgICAgICAgICByZXFbImFuZHJvaWQudG9uZW1hcC5jdXJ2ZUdyZWVuIl0gPSBbMC4wLDAuMCwgMS4wLDEuMF0KLSAgICAgICAgICAgIHJlcVsiYW5kcm9pZC50b25lbWFwLmN1cnZlQmx1ZSJdID0gWzAuMCwwLjAsIDEuMCwxLjBdCisgICAgICAgICAgICByZXFbImFuZHJvaWQudG9uZW1hcC5jdXJ2ZSJdID0geworICAgICAgICAgICAgICAgICJyZWQiOiBbMC4wLDAuMCwgMS4wLDEuMF0sCisgICAgICAgICAgICAgICAgImdyZWVuIjogWzAuMCwwLjAsIDEuMCwxLjBdLAorICAgICAgICAgICAgICAgICJibHVlIjogWzAuMCwwLjAsIDEuMCwxLjBdfQogICAgICAgICAjR0FNTUFfVkFMVUUgbW9kZQogICAgICAgICBlbGlmIDMgaW4gcHJvcHNbImFuZHJvaWQudG9uZW1hcC5hdmFpbGFibGVUb25lTWFwTW9kZXMiXToKICAgICAgICAgICAgIHJlcVsiYW5kcm9pZC50b25lbWFwLm1vZGUiXSA9IDMKQEAgLTIyOCwxMiArMjI5LDE1IEBACiAgICAgc2V0X2ZpbHRlcl9vZmZfb3JfZmFzdF9pZl9wb3NzaWJsZShwcm9wcywgcmVxLAogICAgICAgICAiYW5kcm9pZC5jb2xvckNvcnJlY3Rpb24uYXZhaWxhYmxlQWJlcnJhdGlvbk1vZGVzIiwKICAgICAgICAgImFuZHJvaWQuY29sb3JDb3JyZWN0aW9uLmFiZXJyYXRpb25Nb2RlIikKLSAgICBpZiBwcm9wcy5oYXNfa2V5KCJhbmRyb2lkLnJlcXVlc3QuYXZhaWxhYmxlQ2hhcmFjdGVyaXN0aWNzS2V5cyIpOgotICAgICAgICBob3RfcGl4ZWxfbW9kZXMgPSAzOTMyMTcgaW4gcHJvcHNbImFuZHJvaWQucmVxdWVzdC5hdmFpbGFibGVDaGFyYWN0ZXJpc3RpY3NLZXlzIl0KLSAgICAgICAgZWRnZV9tb2RlcyA9IDE5NjYxMCBpbiBwcm9wc1siYW5kcm9pZC5yZXF1ZXN0LmF2YWlsYWJsZUNoYXJhY3RlcmlzdGljc0tleXMiXQotICAgIGlmIHByb3BzLmhhc19rZXkoImFuZHJvaWQucmVxdWVzdC5hdmFpbGFibGVSZXF1ZXN0S2V5cyIpOgotICAgICAgICBob3RfcGl4ZWxfbW9kZSA9IDM5MzIxNiBpbiBwcm9wc1siYW5kcm9pZC5yZXF1ZXN0LmF2YWlsYWJsZVJlcXVlc3RLZXlzIl0KLSAgICAgICAgZWRnZV9tb2RlID0gMTk2NjA4IGluIHByb3BzWyJhbmRyb2lkLnJlcXVlc3QuYXZhaWxhYmxlUmVxdWVzdEtleXMiXQorICAgIGlmIHByb3BzLmhhc19rZXkoImNhbWVyYS5jaGFyYWN0ZXJpc3RpY3Mua2V5cyIpOgorICAgICAgICBjaGFyc19rZXlzID0gcHJvcHNbImNhbWVyYS5jaGFyYWN0ZXJpc3RpY3Mua2V5cyJdCisgICAgICAgIGhvdF9waXhlbF9tb2RlcyA9IFwKKyAgICAgICAgICAgICAgICAiYW5kcm9pZC5ob3RQaXhlbC5hdmFpbGFibGVIb3RQaXhlbE1vZGVzIiBpbiBjaGFyc19rZXlzCisgICAgICAgIGVkZ2VfbW9kZXMgPSAiYW5kcm9pZC5lZGdlLmF2YWlsYWJsZUVkZ2VNb2RlcyIgaW4gY2hhcnNfa2V5cworICAgIGlmIHByb3BzLmhhc19rZXkoImNhbWVyYS5jaGFyYWN0ZXJpc3RpY3MucmVxdWVzdEtleXMiKToKKyAgICAgICAgcmVxX2tleXMgPSBwcm9wc1siY2FtZXJhLmNoYXJhY3RlcmlzdGljcy5yZXF1ZXN0S2V5cyJdCisgICAgICAgIGhvdF9waXhlbF9tb2RlID0gImFuZHJvaWQuaG90UGl4ZWwubW9kZSIgaW4gcmVxX2tleXMKKyAgICAgICAgZWRnZV9tb2RlID0gImFuZHJvaWQuZWRnZS5tb2RlIiBpbiByZXFfa2V5cwogICAgIGlmIGhvdF9waXhlbF9tb2RlcyBhbmQgaG90X3BpeGVsX21vZGU6CiAgICAgICAgIHNldF9maWx0ZXJfb2ZmX29yX2Zhc3RfaWZfcG9zc2libGUocHJvcHMsIHJlcSwKICAgICAgICAgICAgICJhbmRyb2lkLmhvdFBpeGVsLmF2YWlsYWJsZUhvdFBpeGVsTW9kZXMiLApAQCAtMjQ0LDcgKzI0OCw3IEBACiAgICAgICAgICAgICAiYW5kcm9pZC5lZGdlLm1vZGUiKQogCiBkZWYgZ2V0X2Zhc3Rlc3RfbWFudWFsX2NhcHR1cmVfc2V0dGluZ3MocHJvcHMpOgotICAgICIiIlJldHVybiBhIGNhcHR1cmUgcmVxdWVzdCBhbmQgZm9ybWF0IHNwZWMgZm9yIHRoZSBmYXN0ZXN0IGNhcHR1cmUuCisgICAgIiIiUmV0dXJuIGEgY2FwdHVyZSByZXF1ZXN0IGFuZCBmb3JtYXQgc3BlYyBmb3IgdGhlIGZhc3Rlc3QgbWFudWFsIGNhcHR1cmUuCiAKICAgICBBcmdzOgogICAgICAgICBwcm9wczogdGhlIG9iamVjdCByZXR1cm5lZCBmcm9tIGl0cy5kZXZpY2UuZ2V0X2NhbWVyYV9wcm9wZXJ0aWVzKCkuCkBAIC0yNjUsNiArMjY5LDI2IEBACiAKICAgICByZXR1cm4gcmVxLCBvdXRfc3BlYwogCitkZWYgZ2V0X2Zhc3Rlc3RfYXV0b19jYXB0dXJlX3NldHRpbmdzKHByb3BzKToKKyAgICAiIiJSZXR1cm4gYSBjYXB0dXJlIHJlcXVlc3QgYW5kIGZvcm1hdCBzcGVjIGZvciB0aGUgZmFzdGVzdCBhdXRvIGNhcHR1cmUuCisKKyAgICBBcmdzOgorICAgICAgICBwcm9wczogdGhlIG9iamVjdCByZXR1cm5lZCBmcm9tIGl0cy5kZXZpY2UuZ2V0X2NhbWVyYV9wcm9wZXJ0aWVzKCkuCisKKyAgICBSZXR1cm5zOgorICAgICAgICBUd28gdmFsdWVzLCB0aGUgZmlyc3QgaXMgYSBjYXB0dXJlIHJlcXVlc3QsIGFuZCB0aGUgc2Vjb25kIGlzIGFuIG91dHB1dAorICAgICAgICBmb3JtYXQgc3BlY2lmaWNhdGlvbiwgZm9yIHRoZSBmYXN0ZXN0IHBvc3NpYmxlIChsZWdhbCkgY2FwdHVyZSB0aGF0CisgICAgICAgIGNhbiBiZSBwZXJmb3JtZWQgb24gdGhpcyBkZXZpY2UgKHdpdGggdGhlIHNtYWxsZXN0IG91dHB1dCBzaXplKS4KKyAgICAiIiIKKyAgICBmbXQgPSAieXV2IgorICAgIHNpemUgPSBnZXRfYXZhaWxhYmxlX291dHB1dF9zaXplcyhmbXQsIHByb3BzKVstMV0KKyAgICBvdXRfc3BlYyA9IHsiZm9ybWF0IjpmbXQsICJ3aWR0aCI6c2l6ZVswXSwgImhlaWdodCI6c2l6ZVsxXX0KKyAgICByZXEgPSBhdXRvX2NhcHR1cmVfcmVxdWVzdCgpCisKKyAgICB0dXJuX3Nsb3dfZmlsdGVyc19vZmYocHJvcHMsIHJlcSkKKworICAgIHJldHVybiByZXEsIG91dF9zcGVjCisKIAogZGVmIGdldF9zbWFsbGVzdF95dXZfZm9ybWF0KHByb3BzLCBtYXRjaF9hcj1Ob25lKToKICAgICAiIiJSZXR1cm4gYSBjYXB0dXJlIHJlcXVlc3QgYW5kIGZvcm1hdCBzcGVjIGZvciB0aGUgc21hbGxlc3QgeXV2IHNpemUuCkBAIC0yODIsMTcgKzMwNiwxNyBAQAogICAgIHJldHVybiBmbXQKIAogCi1kZWYgZ2V0X2xhcmdlc3RfeXV2X2Zvcm1hdChwcm9wcyk6Ci0gICAgIiIiUmV0dXJuIGEgY2FwdHVyZSByZXF1ZXN0IGFuZCBmb3JtYXQgc3BlYyBmb3IgdGhlIHNtYWxsZXN0IHl1diBzaXplLgorZGVmIGdldF9sYXJnZXN0X3l1dl9mb3JtYXQocHJvcHMsIG1hdGNoX2FyPU5vbmUpOgorICAgICIiIlJldHVybiBhIGNhcHR1cmUgcmVxdWVzdCBhbmQgZm9ybWF0IHNwZWMgZm9yIHRoZSBsYXJnZXN0IHl1diBzaXplLgogCiAgICAgQXJnczoKICAgICAgICAgcHJvcHM6IHRoZSBvYmplY3QgcmV0dXJuZWQgZnJvbSBpdHMuZGV2aWNlLmdldF9jYW1lcmFfcHJvcGVydGllcygpLgogCiAgICAgUmV0dXJuczoKLSAgICAgICAgZm10OiAgICBhbiBvdXRwdXQgZm9ybWF0IHNwZWNpZmljYXRpb24sIGZvciB0aGUgc21hbGxlc3QgcG9zc2libGUgeXV2CisgICAgICAgIGZtdDogICAgYW4gb3V0cHV0IGZvcm1hdCBzcGVjaWZpY2F0aW9uLCBmb3IgdGhlIGxhcmdlc3QgcG9zc2libGUgeXV2CiAgICAgICAgIGZvcm1hdCBmb3IgdGhpcyBkZXZpY2UuCiAgICAgIiIiCi0gICAgc2l6ZSA9IGdldF9hdmFpbGFibGVfb3V0cHV0X3NpemVzKCJ5dXYiLCBwcm9wcylbMF0KKyAgICBzaXplID0gZ2V0X2F2YWlsYWJsZV9vdXRwdXRfc2l6ZXMoInl1diIsIHByb3BzLCBtYXRjaF9hcl9zaXplPW1hdGNoX2FyKVswXQogICAgIGZtdCA9IHsiZm9ybWF0IjoieXV2IiwgIndpZHRoIjpzaXplWzBdLCAiaGVpZ2h0IjpzaXplWzFdfQogCiAgICAgcmV0dXJuIGZtdApkaWZmIC0tZ2l0IGEvYXBwcy9DYW1lcmFJVFMvcHltb2R1bGVzL2l0cy90YXJnZXQucHkgYi9hcHBzL0NhbWVyYUlUUy9weW1vZHVsZXMvaXRzL3RhcmdldC5weQppbmRleCAzNzE1ZjM0Li4wMWQzYzVmIDEwMDY0NAotLS0gYS9hcHBzL0NhbWVyYUlUUy9weW1vZHVsZXMvaXRzL3RhcmdldC5weQorKysgYi9hcHBzL0NhbWVyYUlUUy9weW1vZHVsZXMvaXRzL3RhcmdldC5weQpAQCAtNjksOSArNjksOCBAQAogICAgICMgVXNlIHRoZSBnYWlucyt0cmFuc2Zvcm0gcmV0dXJuZWQgYnkgdGhlIEFXQiBwYXNzLgogICAgIHJlcSA9IGl0cy5vYmplY3RzLm1hbnVhbF9jYXB0dXJlX3JlcXVlc3Qoc2VucywgZXhwX3RpbWUpCiAgICAgcmVxWyJhbmRyb2lkLnRvbmVtYXAubW9kZSJdID0gMAotICAgIHJlcVsiYW5kcm9pZC50b25lbWFwLmN1cnZlUmVkIl0gPSB0bWFwCi0gICAgcmVxWyJhbmRyb2lkLnRvbmVtYXAuY3VydmVHcmVlbiJdID0gdG1hcAotICAgIHJlcVsiYW5kcm9pZC50b25lbWFwLmN1cnZlQmx1ZSJdID0gdG1hcAorICAgIHJlcVsiYW5kcm9pZC50b25lbWFwLmN1cnZlIl0gPSB7CisgICAgICAgICJyZWQiOiB0bWFwLCAiZ3JlZW4iOiB0bWFwLCAiYmx1ZSI6IHRtYXB9CiAgICAgcmVxWyJhbmRyb2lkLmNvbG9yQ29ycmVjdGlvbi50cmFuc2Zvcm0iXSA9IHhmb3JtX3JhdAogICAgIHJlcVsiYW5kcm9pZC5jb2xvckNvcnJlY3Rpb24uZ2FpbnMiXSA9IGdhaW5zCiAgICAgY2FwID0gaXRzX3Nlc3Npb24uZG9fY2FwdHVyZShyZXEpCmRpZmYgLS1naXQgYS9hcHBzL0NhbWVyYUlUUy9weW1vZHVsZXMvaXRzL3Rlc3RfaW1hZ2VzL3JvdGF0ZWRfY2hlc3Nib2FyZHMvbm9ybWFsLmpwZyBiL2FwcHMvQ2FtZXJhSVRTL3B5bW9kdWxlcy9pdHMvdGVzdF9pbWFnZXMvcm90YXRlZF9jaGVzc2JvYXJkcy9ub3JtYWwuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NDE4YmUKLS0tIC9kZXYvbnVsbAorKysgYi9hcHBzL0NhbWVyYUlUUy9weW1vZHVsZXMvaXRzL3Rlc3RfaW1hZ2VzL3JvdGF0ZWRfY2hlc3Nib2FyZHMvbm9ybWFsLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hcHBzL0NhbWVyYUlUUy9weW1vZHVsZXMvaXRzL3Rlc3RfaW1hZ2VzL3JvdGF0ZWRfY2hlc3Nib2FyZHMvbm9ybWFsXzE1X2Njdy5qcGcgYi9hcHBzL0NhbWVyYUlUUy9weW1vZHVsZXMvaXRzL3Rlc3RfaW1hZ2VzL3JvdGF0ZWRfY2hlc3Nib2FyZHMvbm9ybWFsXzE1X2Njdy5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE5MjFjMgotLS0gL2Rldi9udWxsCisrKyBiL2FwcHMvQ2FtZXJhSVRTL3B5bW9kdWxlcy9pdHMvdGVzdF9pbWFnZXMvcm90YXRlZF9jaGVzc2JvYXJkcy9ub3JtYWxfMTVfY2N3LmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hcHBzL0NhbWVyYUlUUy9weW1vZHVsZXMvaXRzL3Rlc3RfaW1hZ2VzL3JvdGF0ZWRfY2hlc3Nib2FyZHMvbm9ybWFsXzMwX2Njdy5qcGcgYi9hcHBzL0NhbWVyYUlUUy9weW1vZHVsZXMvaXRzL3Rlc3RfaW1hZ2VzL3JvdGF0ZWRfY2hlc3Nib2FyZHMvbm9ybWFsXzMwX2Njdy5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA3ZjBkMgotLS0gL2Rldi9udWxsCisrKyBiL2FwcHMvQ2FtZXJhSVRTL3B5bW9kdWxlcy9pdHMvdGVzdF9pbWFnZXMvcm90YXRlZF9jaGVzc2JvYXJkcy9ub3JtYWxfMzBfY2N3LmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hcHBzL0NhbWVyYUlUUy9weW1vZHVsZXMvaXRzL3Rlc3RfaW1hZ2VzL3JvdGF0ZWRfY2hlc3Nib2FyZHMvbm9ybWFsXzQ1X2Njdy5qcGcgYi9hcHBzL0NhbWVyYUlUUy9weW1vZHVsZXMvaXRzL3Rlc3RfaW1hZ2VzL3JvdGF0ZWRfY2hlc3Nib2FyZHMvbm9ybWFsXzQ1X2Njdy5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlkYzkzOQotLS0gL2Rldi9udWxsCisrKyBiL2FwcHMvQ2FtZXJhSVRTL3B5bW9kdWxlcy9pdHMvdGVzdF9pbWFnZXMvcm90YXRlZF9jaGVzc2JvYXJkcy9ub3JtYWxfNDVfY2N3LmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hcHBzL0NhbWVyYUlUUy9weW1vZHVsZXMvaXRzL3Rlc3RfaW1hZ2VzL3JvdGF0ZWRfY2hlc3Nib2FyZHMvbm9ybWFsXzYwX2Njdy5qcGcgYi9hcHBzL0NhbWVyYUlUUy9weW1vZHVsZXMvaXRzL3Rlc3RfaW1hZ2VzL3JvdGF0ZWRfY2hlc3Nib2FyZHMvbm9ybWFsXzYwX2Njdy5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QxMWM0MAotLS0gL2Rldi9udWxsCisrKyBiL2FwcHMvQ2FtZXJhSVRTL3B5bW9kdWxlcy9pdHMvdGVzdF9pbWFnZXMvcm90YXRlZF9jaGVzc2JvYXJkcy9ub3JtYWxfNjBfY2N3LmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hcHBzL0NhbWVyYUlUUy9weW1vZHVsZXMvaXRzL3Rlc3RfaW1hZ2VzL3JvdGF0ZWRfY2hlc3Nib2FyZHMvbm9ybWFsXzc1X2Njdy5qcGcgYi9hcHBzL0NhbWVyYUlUUy9weW1vZHVsZXMvaXRzL3Rlc3RfaW1hZ2VzL3JvdGF0ZWRfY2hlc3Nib2FyZHMvbm9ybWFsXzc1X2Njdy5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE5M2JiMQotLS0gL2Rldi9udWxsCisrKyBiL2FwcHMvQ2FtZXJhSVRTL3B5bW9kdWxlcy9pdHMvdGVzdF9pbWFnZXMvcm90YXRlZF9jaGVzc2JvYXJkcy9ub3JtYWxfNzVfY2N3LmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hcHBzL0NhbWVyYUlUUy9weW1vZHVsZXMvaXRzL3Rlc3RfaW1hZ2VzL3JvdGF0ZWRfY2hlc3Nib2FyZHMvbm9ybWFsXzkwX2Njdy5qcGcgYi9hcHBzL0NhbWVyYUlUUy9weW1vZHVsZXMvaXRzL3Rlc3RfaW1hZ2VzL3JvdGF0ZWRfY2hlc3Nib2FyZHMvbm9ybWFsXzkwX2Njdy5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEyMzNhZQotLS0gL2Rldi9udWxsCisrKyBiL2FwcHMvQ2FtZXJhSVRTL3B5bW9kdWxlcy9pdHMvdGVzdF9pbWFnZXMvcm90YXRlZF9jaGVzc2JvYXJkcy9ub3JtYWxfOTBfY2N3LmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hcHBzL0NhbWVyYUlUUy9weW1vZHVsZXMvaXRzL3Rlc3RfaW1hZ2VzL3JvdGF0ZWRfY2hlc3Nib2FyZHMvd2lkZS5qcGcgYi9hcHBzL0NhbWVyYUlUUy9weW1vZHVsZXMvaXRzL3Rlc3RfaW1hZ2VzL3JvdGF0ZWRfY2hlc3Nib2FyZHMvd2lkZS5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc5MDUwNgotLS0gL2Rldi9udWxsCisrKyBiL2FwcHMvQ2FtZXJhSVRTL3B5bW9kdWxlcy9pdHMvdGVzdF9pbWFnZXMvcm90YXRlZF9jaGVzc2JvYXJkcy93aWRlLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hcHBzL0NhbWVyYUlUUy9weW1vZHVsZXMvaXRzL3Rlc3RfaW1hZ2VzL3JvdGF0ZWRfY2hlc3Nib2FyZHMvd2lkZV8xNV9jY3cuanBnIGIvYXBwcy9DYW1lcmFJVFMvcHltb2R1bGVzL2l0cy90ZXN0X2ltYWdlcy9yb3RhdGVkX2NoZXNzYm9hcmRzL3dpZGVfMTVfY2N3LmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODcxYmFiCi0tLSAvZGV2L251bGwKKysrIGIvYXBwcy9DYW1lcmFJVFMvcHltb2R1bGVzL2l0cy90ZXN0X2ltYWdlcy9yb3RhdGVkX2NoZXNzYm9hcmRzL3dpZGVfMTVfY2N3LmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hcHBzL0NhbWVyYUlUUy9weW1vZHVsZXMvaXRzL3Rlc3RfaW1hZ2VzL3JvdGF0ZWRfY2hlc3Nib2FyZHMvd2lkZV8zMF9jY3cuanBnIGIvYXBwcy9DYW1lcmFJVFMvcHltb2R1bGVzL2l0cy90ZXN0X2ltYWdlcy9yb3RhdGVkX2NoZXNzYm9hcmRzL3dpZGVfMzBfY2N3LmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2JmZjJhCi0tLSAvZGV2L251bGwKKysrIGIvYXBwcy9DYW1lcmFJVFMvcHltb2R1bGVzL2l0cy90ZXN0X2ltYWdlcy9yb3RhdGVkX2NoZXNzYm9hcmRzL3dpZGVfMzBfY2N3LmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hcHBzL0NhbWVyYUlUUy9weW1vZHVsZXMvaXRzL3Rlc3RfaW1hZ2VzL3JvdGF0ZWRfY2hlc3Nib2FyZHMvd2lkZV80NV9jY3cuanBnIGIvYXBwcy9DYW1lcmFJVFMvcHltb2R1bGVzL2l0cy90ZXN0X2ltYWdlcy9yb3RhdGVkX2NoZXNzYm9hcmRzL3dpZGVfNDVfY2N3LmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjk4NzUyCi0tLSAvZGV2L251bGwKKysrIGIvYXBwcy9DYW1lcmFJVFMvcHltb2R1bGVzL2l0cy90ZXN0X2ltYWdlcy9yb3RhdGVkX2NoZXNzYm9hcmRzL3dpZGVfNDVfY2N3LmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hcHBzL0NhbWVyYUlUUy9weW1vZHVsZXMvaXRzL3Rlc3RfaW1hZ2VzL3JvdGF0ZWRfY2hlc3Nib2FyZHMvd2lkZV82MF9jY3cuanBnIGIvYXBwcy9DYW1lcmFJVFMvcHltb2R1bGVzL2l0cy90ZXN0X2ltYWdlcy9yb3RhdGVkX2NoZXNzYm9hcmRzL3dpZGVfNjBfY2N3LmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDJhZWVhCi0tLSAvZGV2L251bGwKKysrIGIvYXBwcy9DYW1lcmFJVFMvcHltb2R1bGVzL2l0cy90ZXN0X2ltYWdlcy9yb3RhdGVkX2NoZXNzYm9hcmRzL3dpZGVfNjBfY2N3LmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hcHBzL0NhbWVyYUlUUy9weW1vZHVsZXMvaXRzL3Rlc3RfaW1hZ2VzL3JvdGF0ZWRfY2hlc3Nib2FyZHMvd2lkZV83NV9jY3cuanBnIGIvYXBwcy9DYW1lcmFJVFMvcHltb2R1bGVzL2l0cy90ZXN0X2ltYWdlcy9yb3RhdGVkX2NoZXNzYm9hcmRzL3dpZGVfNzVfY2N3LmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjI0YWU0Ci0tLSAvZGV2L251bGwKKysrIGIvYXBwcy9DYW1lcmFJVFMvcHltb2R1bGVzL2l0cy90ZXN0X2ltYWdlcy9yb3RhdGVkX2NoZXNzYm9hcmRzL3dpZGVfNzVfY2N3LmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hcHBzL0NhbWVyYUlUUy9weW1vZHVsZXMvaXRzL3Rlc3RfaW1hZ2VzL3JvdGF0ZWRfY2hlc3Nib2FyZHMvd2lkZV85MF9jY3cuanBnIGIvYXBwcy9DYW1lcmFJVFMvcHltb2R1bGVzL2l0cy90ZXN0X2ltYWdlcy9yb3RhdGVkX2NoZXNzYm9hcmRzL3dpZGVfOTBfY2N3LmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmFkNDAxCi0tLSAvZGV2L251bGwKKysrIGIvYXBwcy9DYW1lcmFJVFMvcHltb2R1bGVzL2l0cy90ZXN0X2ltYWdlcy9yb3RhdGVkX2NoZXNzYm9hcmRzL3dpZGVfOTBfY2N3LmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hcHBzL0NhbWVyYUlUUy90ZXN0cy9kbmdfbm9pc2VfbW9kZWwvZG5nX25vaXNlX21vZGVsLnB5IGIvYXBwcy9DYW1lcmFJVFMvdGVzdHMvZG5nX25vaXNlX21vZGVsL2RuZ19ub2lzZV9tb2RlbC5weQppbmRleCBiZWE1MGFmLi5lOGM2ZDE5IDEwMDY0NAotLS0gYS9hcHBzL0NhbWVyYUlUUy90ZXN0cy9kbmdfbm9pc2VfbW9kZWwvZG5nX25vaXNlX21vZGVsLnB5CisrKyBiL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL2RuZ19ub2lzZV9tb2RlbC9kbmdfbm9pc2VfbW9kZWwucHkKQEAgLTQxLDYgKzQxLDcgQEAKICAgICAiIiJDYXB0dXJlIGEgc2V0IG9mIHJhdyBpbWFnZXMgd2l0aCBpbmNyZWFzaW5nIGdhaW5zIGFuZCBtZWFzdXJlIHRoZSBub2lzZS4KICAgICAiIiIKICAgICBOQU1FID0gb3MucGF0aC5iYXNlbmFtZShfX2ZpbGVfXykuc3BsaXQoIi4iKVswXQorICAgIEJBWUVSX0xJU1QgPSBbJ1InLCAnR1InLCAnR0InLCAnQiddCiAKICAgICAjIEhvdyBtYW55IHNlbnNpdGl2aXRpZXMgcGVyIHN0b3AgdG8gc2FtcGxlLgogICAgIHN0ZXBzX3Blcl9zdG9wID0gMgpAQCAtOTcsNiArOTgsOCBAQAogICAgICAgICAgICAgY2FtLmRvXzNhKGdldF9yZXN1bHRzPVRydWUsIGRvX2F3Yj1GYWxzZSwgZG9fYWY9RmFsc2UpCiAgICAgICAgICMgVW5kZXJleHBvc2UgdG8gZ2V0IG1vcmUgZGF0YSBmb3IgbG93IHNpZ25hbCBsZXZlbHMuCiAgICAgICAgIGF1dG9fZSA9IHNfYWUqZV9hZS9icmFja2V0X2ZhY3RvcgorICAgICAgICAjIEZvY3VzIGF0IHplcm8gdG8gaW50ZW50aW9uYWxseSBibHVyIHRoZSBzY2VuZSBhcyBtdWNoIGFzIHBvc3NpYmxlLgorICAgICAgICBmX2Rpc3QgPSAwLjAKIAogICAgICAgICAjIElmIHRoZSBhdXRvLWV4cG9zdXJlIHJlc3VsdCBpcyB0b28gYnJpZ2h0IGZvciB0aGUgaGlnaGVzdAogICAgICAgICAjIHNlbnNpdGl2aXR5IG9yIHRvbyBkYXJrIGZvciB0aGUgbG93ZXN0IHNlbnNpdGl2aXR5LCByZXBvcnQKQEAgLTExMyw5ICsxMTYsOSBAQAogICAgICAgICAjIFN0YXJ0IHRoZSBzZW5zaXRpdml0aWVzIGF0IHRoZSBtaW5pbXVtLgogICAgICAgICBzID0gc2Vuc19taW4KIAotICAgICAgICBzYW1wbGVzID0gW10KKyAgICAgICAgc2FtcGxlcyA9IFtbXSwgW10sIFtdLCBbXV0KICAgICAgICAgcGxvdHMgPSBbXQotICAgICAgICBtZWFzdXJlZF9tb2RlbHMgPSBbXQorICAgICAgICBtZWFzdXJlZF9tb2RlbHMgPSBbW10sIFtdLCBbXSwgW11dCiAgICAgICAgIHdoaWxlIHMgPD0gc2Vuc19tYXggKyAxOgogICAgICAgICAgICAgcHJpbnQgIklTTyAlZCIgJSByb3VuZChzKQogICAgICAgICAgICAgZmlnID0gcGx0LmZpZ3VyZSgpCkBAIC0xMjQsMTUgKzEyNywxNCBAQAogICAgICAgICAgICAgcGx0X3Muc2V0X3hsYWJlbCgiTWVhbiBzaWduYWwgbGV2ZWwiKQogICAgICAgICAgICAgcGx0X3Muc2V0X3lsYWJlbCgiVmFyaWFuY2UiKQogCi0gICAgICAgICAgICBzYW1wbGVzX3MgPSBbXQorICAgICAgICAgICAgc2FtcGxlc19zID0gW1tdLCBbXSwgW10sIFtdXQogICAgICAgICAgICAgZm9yIGIgaW4gcmFuZ2UoMCwgYnJhY2tldF9zdG9wcyArIDEpOgogICAgICAgICAgICAgICAgICMgR2V0IHRoZSBleHBvc3VyZSBmb3IgdGhpcyBzZW5zaXRpdml0eSBhbmQgZXhwb3N1cmUgdGltZS4KICAgICAgICAgICAgICAgICBlID0gaW50KG1hdGgucG93KDIsIGIpKmF1dG9fZS9mbG9hdChzKSkKLSAgICAgICAgICAgICAgICByZXEgPSBpdHMub2JqZWN0cy5tYW51YWxfY2FwdHVyZV9yZXF1ZXN0KHJvdW5kKHMpLCBlKQorICAgICAgICAgICAgICAgIHJlcSA9IGl0cy5vYmplY3RzLm1hbnVhbF9jYXB0dXJlX3JlcXVlc3Qocm91bmQocyksIGUsIGZfZGlzdCkKICAgICAgICAgICAgICAgICBjYXAgPSBjYW0uZG9fY2FwdHVyZShyZXEsIGNhbS5DQVBfUkFXKQogICAgICAgICAgICAgICAgIHBsYW5lcyA9IGl0cy5pbWFnZS5jb252ZXJ0X2NhcHR1cmVfdG9fcGxhbmVzKGNhcCwgcHJvcHMpCiAKLSAgICAgICAgICAgICAgICBzYW1wbGVzX2UgPSBbXQogICAgICAgICAgICAgICAgIGZvciAocGlkeCwgcCkgaW4gZW51bWVyYXRlKHBsYW5lcyk6CiAgICAgICAgICAgICAgICAgICAgIHAgPSBwLnNxdWVlemUoKQogCkBAIC0xNTYsMTM4ICsxNTgsMTcwIEBACiAgICAgICAgICAgICAgICAgICAgIHZhcnNfdGlsZWQgPSBcCiAgICAgICAgICAgICAgICAgICAgICAgICBucC52YXIodGlsZShocCwgdGlsZV9zaXplKSwgYXhpcz0oMCwgMSkpLmZsYXR0ZW4oKQogCisgICAgICAgICAgICAgICAgICAgIHNhbXBsZXNfZSA9IFtdCiAgICAgICAgICAgICAgICAgICAgIGZvciAobWVhbiwgdmFyKSBpbiB6aXAobWVhbnNfdGlsZWQsIHZhcnNfdGlsZWQpOgogICAgICAgICAgICAgICAgICAgICAgICAgIyBEb24ndCBpbmNsdWRlIHRoZSB0aWxlIGlmIGl0IGhhcyBzYW1wbGVzIHRoYXQgbWlnaHQKICAgICAgICAgICAgICAgICAgICAgICAgICMgYmUgY2xpcHBlZC4KICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG1lYW4gKyAyKm1hdGguc3FydCh2YXIpIDwgbWF4X3NpZ25hbF9sZXZlbDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzX2UuYXBwZW5kKFttZWFuLCB2YXJdKQogCi0gICAgICAgICAgICAgICAgICAgIG1lYW5zX2UsIHZhcnNfZSA9IHppcCgqc2FtcGxlc19lKQotICAgICAgICAgICAgICAgICAgICBwbHRfcy5wbG90KG1lYW5zX2UsIHZhcnNfZSwgY29sb3JzW2IlbGVuKGNvbG9ycyldICsgJywnKQorICAgICAgICAgICAgICAgICAgICBpZiBsZW4oc2FtcGxlc19lKSA+IDA6CisgICAgICAgICAgICAgICAgICAgICAgICBtZWFuc19lLCB2YXJzX2UgPSB6aXAoKnNhbXBsZXNfZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBsdF9zLnBsb3QobWVhbnNfZSwgdmFyc19lLCBjb2xvcnNbYiVsZW4oY29sb3JzKV0gKyAnLCcpCiAKLSAgICAgICAgICAgICAgICAgICAgc2FtcGxlc19zLmV4dGVuZChzYW1wbGVzX2UpCisgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzX3NbcGlkeF0uZXh0ZW5kKHNhbXBsZXNfZSkKIAotICAgICAgICAgICAgW1MsIE8sIFIsIHAsIHN0ZGVycl0gPSBzY2lweS5zdGF0cy5saW5yZWdyZXNzKHNhbXBsZXNfcykKLSAgICAgICAgICAgIG1lYXN1cmVkX21vZGVscy5hcHBlbmQoW3JvdW5kKHMpLCBTLCBPXSkKLSAgICAgICAgICAgIHByaW50ICJTZW5zaXRpdml0eSAlZDogJWUqeSArICVlIChSPSVmKSIgJSAocm91bmQocyksIFMsIE8sIFIpCisgICAgICAgICAgICBmb3IgKHBpZHgsIHApIGluIGVudW1lcmF0ZShzYW1wbGVzX3MpOgorICAgICAgICAgICAgICAgIFtTLCBPLCBSLCBwLCBzdGRlcnJdID0gc2NpcHkuc3RhdHMubGlucmVncmVzcyhzYW1wbGVzX3NbcGlkeF0pCisgICAgICAgICAgICAgICAgbWVhc3VyZWRfbW9kZWxzW3BpZHhdLmFwcGVuZChbcm91bmQocyksIFMsIE9dKQorICAgICAgICAgICAgICAgIHByaW50ICJTZW5zaXRpdml0eSAlZDogJWUqeSArICVlIChSPSVmKSIgJSAocm91bmQocyksIFMsIE8sIFIpCiAKLSAgICAgICAgICAgICMgQWRkIHRoZSBzYW1wbGVzIGZvciB0aGlzIHNlbnNpdGl2aXR5IHRvIHRoZSBnbG9iYWwgc2FtcGxlcyBsaXN0LgotICAgICAgICAgICAgc2FtcGxlcy5leHRlbmQoWyhyb3VuZChzKSwgbWVhbiwgdmFyKSBmb3IgKG1lYW4sIHZhcikgaW4gc2FtcGxlc19zXSkKKyAgICAgICAgICAgICAgICAjIEFkZCB0aGUgc2FtcGxlcyBmb3IgdGhpcyBzZW5zaXRpdml0eSB0byB0aGUgZ2xvYmFsIHNhbXBsZXMgbGlzdC4KKyAgICAgICAgICAgICAgICBzYW1wbGVzW3BpZHhdLmV4dGVuZChbKHJvdW5kKHMpLCBtZWFuLCB2YXIpIGZvciAobWVhbiwgdmFyKSBpbiBzYW1wbGVzX3NbcGlkeF1dKQogCi0gICAgICAgICAgICAjIEFkZCB0aGUgbGluZWFyIGZpdCB0byB0aGUgcGxvdCBmb3IgdGhpcyBzZW5zaXRpdml0eS4KLSAgICAgICAgICAgIHBsdF9zLnBsb3QoWzAsIG1heF9zaWduYWxfbGV2ZWxdLCBbTywgTyArIFMqbWF4X3NpZ25hbF9sZXZlbF0sICdyLScsCi0gICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPSJMaW5lYXIgZml0IikKLSAgICAgICAgICAgIHhtYXggPSBtYXgoW3ggZm9yICh4LCBfKSBpbiBzYW1wbGVzX3NdKSoxLjI1CisgICAgICAgICAgICAgICAgIyBBZGQgdGhlIGxpbmVhciBmaXQgdG8gdGhlIHBsb3QgZm9yIHRoaXMgc2Vuc2l0aXZpdHkuCisgICAgICAgICAgICAgICAgcGx0X3MucGxvdChbMCwgbWF4X3NpZ25hbF9sZXZlbF0sIFtPLCBPICsgUyptYXhfc2lnbmFsX2xldmVsXSwgJ3Jna2InW3BpZHhdKyctLScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD0iTGluZWFyIGZpdCIpCisKKyAgICAgICAgICAgIHhtYXggPSBtYXgoW21heChbeCBmb3IgKHgsIF8pIGluIHBdKSBmb3IgcCBpbiBzYW1wbGVzX3NdKSoxLjI1CisgICAgICAgICAgICB5bWF4ID0gbWF4KFttYXgoW3kgZm9yIChfLCB5KSBpbiBwXSkgZm9yIHAgaW4gc2FtcGxlc19zXSkqMS4yNQogICAgICAgICAgICAgcGx0X3Muc2V0X3hsaW0oeG1pbj0wLCB4bWF4PXhtYXgpCi0gICAgICAgICAgICBwbHRfcy5zZXRfeWxpbSh5bWluPTAsIHltYXg9KE8gKyBTKnhtYXgpKjEuMjUpCisgICAgICAgICAgICBwbHRfcy5zZXRfeWxpbSh5bWluPTAsIHltYXg9eW1heCkKKwogICAgICAgICAgICAgZmlnLnNhdmVmaWcoIiVzX3NhbXBsZXNfaXNvJTA0ZC5wbmciICUgKE5BTUUsIHJvdW5kKHMpKSkKICAgICAgICAgICAgIHBsb3RzLmFwcGVuZChbcm91bmQocyksIGZpZ10pCiAKICAgICAgICAgICAgICMgTW92ZSB0byB0aGUgbmV4dCBzZW5zaXRpdml0eS4KICAgICAgICAgICAgIHMgKj0gbWF0aC5wb3coMiwgMS4wL3N0ZXBzX3Blcl9zdG9wKQogCi0gICAgICAgICMgR3JhYiB0aGUgc2Vuc2l0aXZpdGllcyBhbmQgbGluZSBwYXJhbWV0ZXJzIGZyb20gZWFjaCBzZW5zaXRpdml0eS4KLSAgICAgICAgU19tZWFzdXJlZCA9IFtlWzFdIGZvciBlIGluIG1lYXN1cmVkX21vZGVsc10KLSAgICAgICAgT19tZWFzdXJlZCA9IFtlWzJdIGZvciBlIGluIG1lYXN1cmVkX21vZGVsc10KLSAgICAgICAgc2VucyA9IG5wLmFzYXJyYXkoW2VbMF0gZm9yIGUgaW4gbWVhc3VyZWRfbW9kZWxzXSkKLSAgICAgICAgc2Vuc19zcSA9IG5wLnNxdWFyZShzZW5zKQotCi0gICAgICAgICMgVXNlIGEgZ2xvYmFsIGxpbmVhciBvcHRpbWl6YXRpb24gdG8gZml0IHRoZSBub2lzZSBtb2RlbC4KLSAgICAgICAgZ2FpbnMgPSBucC5hc2FycmF5KFtzWzBdIGZvciBzIGluIHNhbXBsZXNdKQotICAgICAgICBtZWFucyA9IG5wLmFzYXJyYXkoW3NbMV0gZm9yIHMgaW4gc2FtcGxlc10pCi0gICAgICAgIHZhcnNfID0gbnAuYXNhcnJheShbc1syXSBmb3IgcyBpbiBzYW1wbGVzXSkKLQotICAgICAgICAjIERlZmluZSBkaWdpdGFsIGdhaW4gYXMgdGhlIGdhaW4gYWJvdmUgdGhlIG1heCBhbmFsb2cgZ2FpbgotICAgICAgICAjIHBlciB0aGUgQ2FtZXJhMiBzcGVjLiBBbHNvLCBkZWZpbmUgYSBjb3JyZXNwb25kaW5nIEMKLSAgICAgICAgIyBleHByZXNzaW9uIHNuaXBwZXQgdG8gdXNlIGluIHRoZSBnZW5lcmF0ZWQgbW9kZWwgY29kZS4KLSAgICAgICAgZGlnaXRhbF9nYWlucyA9IG5wLm1heGltdW0oZ2FpbnMvc2Vuc19tYXhfYW5hbG9nLCAxKQotICAgICAgICBkaWdpdGFsX2dhaW5fY2RlZiA9ICIoc2VucyAvICVkLjApIDwgMS4wID8gMS4wIDogKHNlbnMgLyAlZC4wKSIgJSBcCi0gICAgICAgICAgICAoc2Vuc19tYXhfYW5hbG9nLCBzZW5zX21heF9hbmFsb2cpCi0KLSAgICAgICAgIyBGaW5kIHRoZSBub2lzZSBtb2RlbCBwYXJhbWV0ZXJzIHZpYSBsZWFzdCBzcXVhcmVzIGZpdC4KLSAgICAgICAgYWQgPSBnYWlucyptZWFucwotICAgICAgICBiZCA9IG1lYW5zCi0gICAgICAgIGNkID0gZ2FpbnMqZ2FpbnMKLSAgICAgICAgZGQgPSBkaWdpdGFsX2dhaW5zKmRpZ2l0YWxfZ2FpbnMKLSAgICAgICAgYSA9IG5wLmFzYXJyYXkoW2FkLCBiZCwgY2QsIGRkXSkuVAotICAgICAgICBiID0gdmFyc18KLQotICAgICAgICAjIFRvIGF2b2lkIG92ZXJmaXR0aW5nIHRvIGhpZ2ggSVNPcyAoaGlnaCB2YXJpYW5jZXMpLCBkaXZpZGUgdGhlIHN5c3RlbQotICAgICAgICAjIGJ5IHRoZSBnYWlucy4KLSAgICAgICAgYSAvPSAobnAudGlsZShnYWlucywgKGEuc2hhcGVbMV0sIDEpKS5UKQotICAgICAgICBiIC89IGdhaW5zCi0KLSAgICAgICAgW0EsIEIsIEMsIERdLCBfLCBfLCBfID0gbnAubGluYWxnLmxzdHNxKGEsIGIpCi0KLSAgICAgICAgIyBQbG90IHRoZSBub2lzZSBtb2RlbCBjb21wb25lbnRzIHdpdGggdGhlIHZhbHVlcyBwcmVkaWN0ZWQgYnkgdGhlCi0gICAgICAgICMgbm9pc2UgbW9kZWwuCi0gICAgICAgIFNfbW9kZWwgPSBBKnNlbnMgKyBCCi0gICAgICAgIE9fbW9kZWwgPSBcCi0gICAgICAgICAgICBDKnNlbnNfc3EgKyBEKm5wLnNxdWFyZShucC5tYXhpbXVtKHNlbnMvc2Vuc19tYXhfYW5hbG9nLCAxKSkKLQogICAgICAgICAoZmlnLCAocGx0X1MsIHBsdF9PKSkgPSBwbHQuc3VicGxvdHMoMiwgMSkKICAgICAgICAgcGx0X1Muc2V0X3RpdGxlKCJOb2lzZSBtb2RlbCIpCiAgICAgICAgIHBsdF9TLnNldF95bGFiZWwoIlMiKQotICAgICAgICBwbHRfUy5sb2dsb2coc2VucywgU19tZWFzdXJlZCwgJ3IrJywgYmFzZXg9MTAsIGJhc2V5PTEwLAotICAgICAgICAgICAgICAgICAgICAgbGFiZWw9Ik1lYXN1cmVkIikKLSAgICAgICAgcGx0X1MubG9nbG9nKHNlbnMsIFNfbW9kZWwsICdieCcsIGJhc2V4PTEwLCBiYXNleT0xMCwgbGFiZWw9Ik1vZGVsIikKICAgICAgICAgcGx0X1MubGVnZW5kKGxvYz0yKQotCiAgICAgICAgIHBsdF9PLnNldF94bGFiZWwoIklTTyIpCiAgICAgICAgIHBsdF9PLnNldF95bGFiZWwoIk8iKQotICAgICAgICBwbHRfTy5sb2dsb2coc2VucywgT19tZWFzdXJlZCwgJ3IrJywgYmFzZXg9MTAsIGJhc2V5PTEwLAotICAgICAgICAgICAgICAgICAgICAgbGFiZWw9Ik1lYXN1cmVkIikKLSAgICAgICAgcGx0X08ubG9nbG9nKHNlbnMsIE9fbW9kZWwsICdieCcsIGJhc2V4PTEwLCBiYXNleT0xMCwgbGFiZWw9Ik1vZGVsIikKKworICAgICAgICBBID0gW10KKyAgICAgICAgQiA9IFtdCisgICAgICAgIEMgPSBbXQorICAgICAgICBEID0gW10KKyAgICAgICAgZm9yIChwaWR4LCBwKSBpbiBlbnVtZXJhdGUobWVhc3VyZWRfbW9kZWxzKToKKyAgICAgICAgICAgICMgR3JhYiB0aGUgc2Vuc2l0aXZpdGllcyBhbmQgbGluZSBwYXJhbWV0ZXJzIGZyb20gZWFjaCBzZW5zaXRpdml0eS4KKyAgICAgICAgICAgIFNfbWVhc3VyZWQgPSBbZVsxXSBmb3IgZSBpbiBtZWFzdXJlZF9tb2RlbHNbcGlkeF1dCisgICAgICAgICAgICBPX21lYXN1cmVkID0gW2VbMl0gZm9yIGUgaW4gbWVhc3VyZWRfbW9kZWxzW3BpZHhdXQorICAgICAgICAgICAgc2VucyA9IG5wLmFzYXJyYXkoW2VbMF0gZm9yIGUgaW4gbWVhc3VyZWRfbW9kZWxzW3BpZHhdXSkKKyAgICAgICAgICAgIHNlbnNfc3EgPSBucC5zcXVhcmUoc2VucykKKworICAgICAgICAgICAgIyBVc2UgYSBnbG9iYWwgbGluZWFyIG9wdGltaXphdGlvbiB0byBmaXQgdGhlIG5vaXNlIG1vZGVsLgorICAgICAgICAgICAgZ2FpbnMgPSBucC5hc2FycmF5KFtzWzBdIGZvciBzIGluIHNhbXBsZXNbcGlkeF1dKQorICAgICAgICAgICAgbWVhbnMgPSBucC5hc2FycmF5KFtzWzFdIGZvciBzIGluIHNhbXBsZXNbcGlkeF1dKQorICAgICAgICAgICAgdmFyc18gPSBucC5hc2FycmF5KFtzWzJdIGZvciBzIGluIHNhbXBsZXNbcGlkeF1dKQorCisgICAgICAgICAgICAjIERlZmluZSBkaWdpdGFsIGdhaW4gYXMgdGhlIGdhaW4gYWJvdmUgdGhlIG1heCBhbmFsb2cgZ2FpbgorICAgICAgICAgICAgIyBwZXIgdGhlIENhbWVyYTIgc3BlYy4gQWxzbywgZGVmaW5lIGEgY29ycmVzcG9uZGluZyBDCisgICAgICAgICAgICAjIGV4cHJlc3Npb24gc25pcHBldCB0byB1c2UgaW4gdGhlIGdlbmVyYXRlZCBtb2RlbCBjb2RlLgorICAgICAgICAgICAgZGlnaXRhbF9nYWlucyA9IG5wLm1heGltdW0oZ2FpbnMvc2Vuc19tYXhfYW5hbG9nLCAxKQorICAgICAgICAgICAgZGlnaXRhbF9nYWluX2NkZWYgPSAiKHNlbnMgLyAlZC4wKSA8IDEuMCA/IDEuMCA6IChzZW5zIC8gJWQuMCkiICUgXAorICAgICAgICAgICAgICAgIChzZW5zX21heF9hbmFsb2csIHNlbnNfbWF4X2FuYWxvZykKKworICAgICAgICAgICAgIyBGaW5kIHRoZSBub2lzZSBtb2RlbCBwYXJhbWV0ZXJzIHZpYSBsZWFzdCBzcXVhcmVzIGZpdC4KKyAgICAgICAgICAgIGFkID0gZ2FpbnMqbWVhbnMKKyAgICAgICAgICAgIGJkID0gbWVhbnMKKyAgICAgICAgICAgIGNkID0gZ2FpbnMqZ2FpbnMKKyAgICAgICAgICAgIGRkID0gZGlnaXRhbF9nYWlucypkaWdpdGFsX2dhaW5zCisgICAgICAgICAgICBhID0gbnAuYXNhcnJheShbYWQsIGJkLCBjZCwgZGRdKS5UCisgICAgICAgICAgICBiID0gdmFyc18KKworICAgICAgICAgICAgIyBUbyBhdm9pZCBvdmVyZml0dGluZyB0byBoaWdoIElTT3MgKGhpZ2ggdmFyaWFuY2VzKSwgZGl2aWRlIHRoZSBzeXN0ZW0KKyAgICAgICAgICAgICMgYnkgdGhlIGdhaW5zLgorICAgICAgICAgICAgYSAvPSAobnAudGlsZShnYWlucywgKGEuc2hhcGVbMV0sIDEpKS5UKQorICAgICAgICAgICAgYiAvPSBnYWlucworCisgICAgICAgICAgICBbQV9wLCBCX3AsIENfcCwgRF9wXSwgXywgXywgXyA9IG5wLmxpbmFsZy5sc3RzcShhLCBiKQorICAgICAgICAgICAgQS5hcHBlbmQoQV9wKQorICAgICAgICAgICAgQi5hcHBlbmQoQl9wKQorICAgICAgICAgICAgQy5hcHBlbmQoQ19wKQorICAgICAgICAgICAgRC5hcHBlbmQoRF9wKQorCisgICAgICAgICAgICAjIFBsb3QgdGhlIG5vaXNlIG1vZGVsIGNvbXBvbmVudHMgd2l0aCB0aGUgdmFsdWVzIHByZWRpY3RlZCBieSB0aGUKKyAgICAgICAgICAgICMgbm9pc2UgbW9kZWwuCisgICAgICAgICAgICBTX21vZGVsID0gQV9wKnNlbnMgKyBCX3AKKyAgICAgICAgICAgIE9fbW9kZWwgPSBcCisgICAgICAgICAgICAgICAgQ19wKnNlbnNfc3EgKyBEX3AqbnAuc3F1YXJlKG5wLm1heGltdW0oc2Vucy9zZW5zX21heF9hbmFsb2csIDEpKQorCisgICAgICAgICAgICBwbHRfUy5sb2dsb2coc2VucywgU19tZWFzdXJlZCwgJ3Jna2InW3BpZHhdKycrJywgYmFzZXg9MTAsIGJhc2V5PTEwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPSJNZWFzdXJlZCIpCisgICAgICAgICAgICBwbHRfUy5sb2dsb2coc2VucywgU19tb2RlbCwgJ3Jna2InW3BpZHhdKyd4JywgYmFzZXg9MTAsIGJhc2V5PTEwLCBsYWJlbD0iTW9kZWwiKQorCisgICAgICAgICAgICBwbHRfTy5sb2dsb2coc2VucywgT19tZWFzdXJlZCwgJ3Jna2InW3BpZHhdKycrJywgYmFzZXg9MTAsIGJhc2V5PTEwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPSJNZWFzdXJlZCIpCisgICAgICAgICAgICBwbHRfTy5sb2dsb2coc2VucywgT19tb2RlbCwgJ3Jna2InW3BpZHhdKyd4JywgYmFzZXg9MTAsIGJhc2V5PTEwLCBsYWJlbD0iTW9kZWwiKQorCiAgICAgICAgIGZpZy5zYXZlZmlnKCIlcy5wbmciICUgKE5BTUUpKQogCiAgICAgICAgIGZvciBbcywgZmlnXSBpbiBwbG90czoKICAgICAgICAgICAgIHBsdF9zID0gZmlnLmdjYSgpCiAKICAgICAgICAgICAgIGRnID0gbWF4KHMvc2Vuc19tYXhfYW5hbG9nLCAxKQotICAgICAgICAgICAgUyA9IEEqcyArIEIKLSAgICAgICAgICAgIE8gPSBDKnMqcyArIEQqZGcqZGcKLSAgICAgICAgICAgIHBsdF9zLnBsb3QoWzAsIG1heF9zaWduYWxfbGV2ZWxdLCBbTywgTyArIFMqbWF4X3NpZ25hbF9sZXZlbF0sICdiLScsCi0gICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPSJNb2RlbCIpCi0gICAgICAgICAgICBwbHRfcy5sZWdlbmQobG9jPTIpCisgICAgICAgICAgICBmb3IgKHBpZHgsIHApIGluIGVudW1lcmF0ZShtZWFzdXJlZF9tb2RlbHMpOgorICAgICAgICAgICAgICAgIFMgPSBBW3BpZHhdKnMgKyBCW3BpZHhdCisgICAgICAgICAgICAgICAgTyA9IENbcGlkeF0qcypzICsgRFtwaWR4XSpkZypkZworICAgICAgICAgICAgICAgIHBsdF9zLnBsb3QoWzAsIG1heF9zaWduYWxfbGV2ZWxdLCBbTywgTyArIFMqbWF4X3NpZ25hbF9sZXZlbF0sICdyZ2tiJ1twaWR4XSsnLScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD0iTW9kZWwiKQogCisgICAgICAgICAgICBwbHRfcy5sZWdlbmQobG9jPTIpCiAgICAgICAgICAgICBwbHQuZmlndXJlKGZpZy5udW1iZXIpCiAKICAgICAgICAgICAgICMgUmUtc2F2ZSB0aGUgcGxvdCB3aXRoIHRoZSBnbG9iYWwgbW9kZWwuCiAgICAgICAgICAgICBmaWcuc2F2ZWZpZygiJXNfc2FtcGxlc19pc28lMDRkLnBuZyIgJSAoTkFNRSwgcm91bmQocykpKQogCi0gICAgICAgICMgR2VuZXJhdGUgdGhlIG5vaXNlIG1vZGVsIGltcGxlbWVudGF0aW9uLgorICAgICAgICAgICMgR2VuZXJhdGUgdGhlIG5vaXNlIG1vZGVsIGltcGxlbWVudGF0aW9uLgorICAgICAgICBBX2FycmF5ID0gIiwiLmpvaW4oW3N0cihpKSBmb3IgaSBpbiBBXSkKKyAgICAgICAgQl9hcnJheSA9ICIsIi5qb2luKFtzdHIoaSkgZm9yIGkgaW4gQl0pCisgICAgICAgIENfYXJyYXkgPSAiLCIuam9pbihbc3RyKGkpIGZvciBpIGluIENdKQorICAgICAgICBEX2FycmF5ID0gIiwiLmpvaW4oW3N0cihpKSBmb3IgaSBpbiBEXSkKICAgICAgICAgbm9pc2VfbW9kZWxfY29kZSA9IHRleHR3cmFwLmRlZGVudCgiIiJcCiAgICAgICAgICAgICAvKiBHZW5lcmF0ZWQgdGVzdCBjb2RlIHRvIGR1bXAgYSB0YWJsZSBvZiBkYXRhIGZvciBleHRlcm5hbCB2YWxpZGF0aW9uCiAgICAgICAgICAgICAgKiBvZiB0aGUgbm9pc2UgbW9kZWwgcGFyYW1ldGVycy4KICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgI2luY2x1ZGUgPHN0ZGlvLmg+CiAgICAgICAgICAgICAjaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0gICAgICAgICAgICBkb3VibGUgY29tcHV0ZV9ub2lzZV9tb2RlbF9lbnRyeV9TKGludCBzZW5zKTsKLSAgICAgICAgICAgIGRvdWJsZSBjb21wdXRlX25vaXNlX21vZGVsX2VudHJ5X08oaW50IHNlbnMpOworICAgICAgICAgICAgZG91YmxlIGNvbXB1dGVfbm9pc2VfbW9kZWxfZW50cnlfUyhpbnQgcGxhbmUsIGludCBzZW5zKTsKKyAgICAgICAgICAgIGRvdWJsZSBjb21wdXRlX25vaXNlX21vZGVsX2VudHJ5X08oaW50IHBsYW5lLCBpbnQgc2Vucyk7CiAgICAgICAgICAgICBpbnQgbWFpbih2b2lkKSB7Ci0gICAgICAgICAgICAgICAgaW50IHNlbnM7Ci0gICAgICAgICAgICAgICAgZm9yIChzZW5zID0gJWQ7IHNlbnMgPD0gJWQ7IHNlbnMgKz0gMTAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRvdWJsZSBvID0gY29tcHV0ZV9ub2lzZV9tb2RlbF9lbnRyeV9PKHNlbnMpOwotICAgICAgICAgICAgICAgICAgICBkb3VibGUgcyA9IGNvbXB1dGVfbm9pc2VfbW9kZWxfZW50cnlfUyhzZW5zKTsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlJWQsJSVsZiwlJWxmXFxuIiwgc2Vucywgbywgcyk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgcGxhbmUgPSAwOyBwbGFuZSA8ICVkOyBwbGFuZSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IHNlbnMgPSAlZDsgc2VucyA8PSAlZDsgc2VucyArPSAxMDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBvID0gY29tcHV0ZV9ub2lzZV9tb2RlbF9lbnRyeV9PKHBsYW5lLCBzZW5zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBzID0gY29tcHV0ZV9ub2lzZV9tb2RlbF9lbnRyeV9TKHBsYW5lLCBzZW5zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJSVkLCUlZCwlJWxmLCUlbGZcXG4iLCBwbGFuZSwgc2Vucywgbywgcyk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8qIEdlbmVyYXRlZCBmdW5jdGlvbnMgdG8gbWFwIGEgZ2l2ZW4gc2Vuc2l0aXZpdHkgdG8gdGhlIE8gYW5kIFMgbm9pc2UKLSAgICAgICAgICAgICAqIG1vZGVsIHBhcmFtZXRlcnMgaW4gdGhlIERORyBub2lzZSBtb2RlbC4KKyAgICAgICAgICAgICAqIG1vZGVsIHBhcmFtZXRlcnMgaW4gdGhlIERORyBub2lzZSBtb2RlbC4gVGhlIHBsYW5lcyBhcmUgaW4KKyAgICAgICAgICAgICAqIFIsIEdyLCBHYiwgQiBvcmRlci4KICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgZG91YmxlIGNvbXB1dGVfbm9pc2VfbW9kZWxfZW50cnlfUyhpbnQgc2VucykgewotICAgICAgICAgICAgICAgIGRvdWJsZSBzID0gJWUgKiBzZW5zICsgJWU7CisgICAgICAgICAgICBkb3VibGUgY29tcHV0ZV9ub2lzZV9tb2RlbF9lbnRyeV9TKGludCBwbGFuZSwgaW50IHNlbnMpIHsKKyAgICAgICAgICAgICAgICBzdGF0aWMgZG91YmxlIG5vaXNlX21vZGVsX0FbXSA9IHsgJXMgfTsKKyAgICAgICAgICAgICAgICBzdGF0aWMgZG91YmxlIG5vaXNlX21vZGVsX0JbXSA9IHsgJXMgfTsKKyAgICAgICAgICAgICAgICBkb3VibGUgQSA9IG5vaXNlX21vZGVsX0FbcGxhbmVdOworICAgICAgICAgICAgICAgIGRvdWJsZSBCID0gbm9pc2VfbW9kZWxfQltwbGFuZV07CisgICAgICAgICAgICAgICAgZG91YmxlIHMgPSBBICogc2VucyArIEI7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHMgPCAwLjAgPyAwLjAgOiBzOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBkb3VibGUgY29tcHV0ZV9ub2lzZV9tb2RlbF9lbnRyeV9PKGludCBzZW5zKSB7CisgICAgICAgICAgICBkb3VibGUgY29tcHV0ZV9ub2lzZV9tb2RlbF9lbnRyeV9PKGludCBwbGFuZSwgaW50IHNlbnMpIHsKKyAgICAgICAgICAgICAgICBzdGF0aWMgZG91YmxlIG5vaXNlX21vZGVsX0NbXSA9IHsgJXMgfTsKKyAgICAgICAgICAgICAgICBzdGF0aWMgZG91YmxlIG5vaXNlX21vZGVsX0RbXSA9IHsgJXMgfTsKICAgICAgICAgICAgICAgICBkb3VibGUgZGlnaXRhbF9nYWluID0gJXM7Ci0gICAgICAgICAgICAgICAgZG91YmxlIG8gPSAlZSAqIHNlbnMgKiBzZW5zICsgJWUgKiBkaWdpdGFsX2dhaW4gKiBkaWdpdGFsX2dhaW47CisgICAgICAgICAgICAgICAgZG91YmxlIEMgPSBub2lzZV9tb2RlbF9DW3BsYW5lXTsKKyAgICAgICAgICAgICAgICBkb3VibGUgRCA9IG5vaXNlX21vZGVsX0RbcGxhbmVdOworICAgICAgICAgICAgICAgIGRvdWJsZSBvID0gQyAqIHNlbnMgKiBzZW5zICsgRCAqIGRpZ2l0YWxfZ2FpbiAqIGRpZ2l0YWxfZ2FpbjsKICAgICAgICAgICAgICAgICByZXR1cm4gbyA8IDAuMCA/IDAuMCA6IG87CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAiIiIgJSAoc2Vuc19taW4sIHNlbnNfbWF4LCBBLCBCLCBkaWdpdGFsX2dhaW5fY2RlZiwgQywgRCkpCisgICAgICAgICAgICAiIiIgJSAobGVuKEEpLCBzZW5zX21pbiwgc2Vuc19tYXgsIEFfYXJyYXksIEJfYXJyYXksIENfYXJyYXksIERfYXJyYXksIGRpZ2l0YWxfZ2Fpbl9jZGVmKSkKICAgICAgICAgcHJpbnQgbm9pc2VfbW9kZWxfY29kZQogICAgICAgICB0ZXh0X2ZpbGUgPSBvcGVuKCJub2lzZV9tb2RlbC5jIiwgInciKQogICAgICAgICB0ZXh0X2ZpbGUud3JpdGUoIiVzIiAlIG5vaXNlX21vZGVsX2NvZGUpCkBAIC0yOTUsNCArMzI5LDMgQEAKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICBtYWluKCkKLQpkaWZmIC0tZ2l0IGEvYXBwcy9DYW1lcmFJVFMvdGVzdHMvaW5wcm9nL3Rlc3RfM2FfcmVtb3RlLnB5IGIvYXBwcy9DYW1lcmFJVFMvdGVzdHMvaW5wcm9nL3Rlc3RfM2FfcmVtb3RlLnB5CmluZGV4IGM3NmZmNmQuLjFlZmMxYWEgMTAwNjQ0Ci0tLSBhL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL2lucHJvZy90ZXN0XzNhX3JlbW90ZS5weQorKysgYi9hcHBzL0NhbWVyYUlUUy90ZXN0cy9pbnByb2cvdGVzdF8zYV9yZW1vdGUucHkKQEAgLTI5LDggKzI5LDYgQEAKIAogICAgIHdpdGggaXRzLmRldmljZS5JdHNTZXNzaW9uKCkgYXMgY2FtOgogICAgICAgICBwcm9wcyA9IGNhbS5nZXRfY2FtZXJhX3Byb3BlcnRpZXMoKQotICAgICAgICB3X21hcCA9IHByb3BzWyJhbmRyb2lkLmxlbnMuaW5mby5zaGFkaW5nTWFwU2l6ZSJdWyJ3aWR0aCJdCi0gICAgICAgIGhfbWFwID0gcHJvcHNbImFuZHJvaWQubGVucy5pbmZvLnNoYWRpbmdNYXBTaXplIl1bImhlaWdodCJdCiAKICAgICAgICAgIyBUT0RPOiBUZXN0IGZvciAzQSBjb252ZXJnZW5jZSwgYW5kIGV4aXQgdGhpcyB0ZXN0IG9uY2UgY29udmVyZ2VkLgogCkBAIC01MCw3ICs0OCwxMCBAQAogICAgICAgICAgICAgZ2FpbnMgPSBjYXBbIm1ldGFkYXRhIl1bImFuZHJvaWQuY29sb3JDb3JyZWN0aW9uLmdhaW5zIl0KICAgICAgICAgICAgIHRyYW5zZm9ybSA9IGNhcFsibWV0YWRhdGEiXVsiYW5kcm9pZC5jb2xvckNvcnJlY3Rpb24udHJhbnNmb3JtIl0KICAgICAgICAgICAgIGV4cF90aW1lID0gY2FwWyJtZXRhZGF0YSJdWydhbmRyb2lkLnNlbnNvci5leHBvc3VyZVRpbWUnXQotICAgICAgICAgICAgbHNjX21hcCA9IGNhcFsibWV0YWRhdGEiXVsiYW5kcm9pZC5zdGF0aXN0aWNzLmxlbnNTaGFkaW5nTWFwIl0KKyAgICAgICAgICAgIGxzY19vYmogPSBjYXBfcmVzWyJhbmRyb2lkLnN0YXRpc3RpY3MubGVuc1NoYWRpbmdDb3JyZWN0aW9uTWFwIl0KKyAgICAgICAgICAgIGxzY19tYXAgPSBsc2Nfb2JqWyJtYXAiXQorICAgICAgICAgICAgd19tYXAgPSBsc2Nfb2JqWyJ3aWR0aCJdCisgICAgICAgICAgICBoX21hcCA9IGxzY19vYmpbImhlaWdodCJdCiAgICAgICAgICAgICBmb2NfZGlzdCA9IGNhcFsibWV0YWRhdGEiXVsnYW5kcm9pZC5sZW5zLmZvY3VzRGlzdGFuY2UnXQogICAgICAgICAgICAgZm9jX3JhbmdlID0gY2FwWyJtZXRhZGF0YSJdWydhbmRyb2lkLmxlbnMuZm9jdXNSYW5nZSddCiAKZGlmZiAtLWdpdCBhL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL2lucHJvZy90ZXN0X2JsY19sc2MucHkgYi9hcHBzL0NhbWVyYUlUUy90ZXN0cy9pbnByb2cvdGVzdF9ibGNfbHNjLnB5CmluZGV4IDMyYzBjNDkuLjFlNDE3YzEgMTAwNjQ0Ci0tLSBhL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL2lucHJvZy90ZXN0X2JsY19sc2MucHkKKysrIGIvYXBwcy9DYW1lcmFJVFMvdGVzdHMvaW5wcm9nL3Rlc3RfYmxjX2xzYy5weQpAQCAtNjMsOSArNjMsOCBAQAogICAgICAgICBmb3IgZSBpbiBleHBvc3VyZXM6CiAgICAgICAgICAgICByZXEgPSBpdHMub2JqZWN0cy5tYW51YWxfY2FwdHVyZV9yZXF1ZXN0KGFlX3NlbixlKQogICAgICAgICAgICAgcmVxWyJhbmRyb2lkLnRvbmVtYXAubW9kZSJdID0gMAotICAgICAgICAgICAgcmVxWyJhbmRyb2lkLnRvbmVtYXAuY3VydmVSZWQiXSA9IHRtYXAKLSAgICAgICAgICAgIHJlcVsiYW5kcm9pZC50b25lbWFwLmN1cnZlR3JlZW4iXSA9IHRtYXAKLSAgICAgICAgICAgIHJlcVsiYW5kcm9pZC50b25lbWFwLmN1cnZlQmx1ZSJdID0gdG1hcAorICAgICAgICAgICAgcmVxWyJhbmRyb2lkLnRvbmVtYXAuY3VydmUiXSA9IHsKKyAgICAgICAgICAgICAgICAicmVkIjogdG1hcCwgImdyZWVuIjogdG1hcCwgImJsdWUiOiB0bWFwfQogICAgICAgICAgICAgcmVxWyJhbmRyb2lkLmNvbG9yQ29ycmVjdGlvbi50cmFuc2Zvcm0iXSA9IGF3Yl90cmFuc2Zvcm1fcmF0CiAgICAgICAgICAgICByZXFbImFuZHJvaWQuY29sb3JDb3JyZWN0aW9uLmdhaW5zIl0gPSBhd2JfZ2FpbnMKICAgICAgICAgICAgIHJlcXMuYXBwZW5kKHJlcSkKZGlmZiAtLWdpdCBhL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL2lucHJvZy90ZXN0X3Rlc3RfcGF0dGVybnMucHkgYi9hcHBzL0NhbWVyYUlUUy90ZXN0cy9pbnByb2cvdGVzdF90ZXN0X3BhdHRlcm5zLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzViMTQxLi4wMDAwMDAwCi0tLSBhL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL2lucHJvZy90ZXN0X3Rlc3RfcGF0dGVybnMucHkKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0jIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWltcG9ydCBpdHMuaW1hZ2UKLWltcG9ydCBpdHMuZGV2aWNlCi1pbXBvcnQgaXRzLm9iamVjdHMKLWltcG9ydCBvcy5wYXRoCi0KLWRlZiBtYWluKCk6Ci0gICAgIiIiVGVzdCBzZW5zb3IgdGVzdCBwYXR0ZXJucy4KLSAgICAiIiIKLSAgICBOQU1FID0gb3MucGF0aC5iYXNlbmFtZShfX2ZpbGVfXykuc3BsaXQoIi4iKVswXQotCi0gICAgd2l0aCBpdHMuZGV2aWNlLkl0c1Nlc3Npb24oKSBhcyBjYW06Ci0gICAgICAgIGNhcHMgPSBbXQotICAgICAgICBmb3IgaSBpbiByYW5nZSgxLDYpOgotICAgICAgICAgICAgcmVxID0gaXRzLm9iamVjdHMubWFudWFsX2NhcHR1cmVfcmVxdWVzdCgxMDAsIDEwKjEwMDAqMTAwMCkKLSAgICAgICAgICAgIHJlcVsnYW5kcm9pZC5zZW5zb3IudGVzdFBhdHRlcm5EYXRhJ10gPSBbNDAsIDEwMCwgMTYwLCAyMjBdCi0gICAgICAgICAgICByZXFbJ2FuZHJvaWQuc2Vuc29yLnRlc3RQYXR0ZXJuTW9kZSddID0gaQotCi0gICAgICAgICAgICAjIENhcHR1cmUgdGhlIHNob3QgdHdpY2UsIGFuZCB1c2UgdGhlIHNlY29uZCBvbmUsIHNvIHRoZSBwYXR0ZXJuCi0gICAgICAgICAgICAjIHdpbGwgaGF2ZSBzdGFiaWxpemVkLgotICAgICAgICAgICAgY2FwcyA9IGNhbS5kb19jYXB0dXJlKFtyZXFdKjIpCi0KLSAgICAgICAgICAgIGltZyA9IGl0cy5pbWFnZS5jb252ZXJ0X2NhcHR1cmVfdG9fcmdiX2ltYWdlKGNhcHNbMV0pCi0gICAgICAgICAgICBpdHMuaW1hZ2Uud3JpdGVfaW1hZ2UoaW1nLCAiJXNfcGF0dGVybj0lZC5qcGciICUgKE5BTUUsIGkpKQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIG1haW4oKQotCmRpZmYgLS1naXQgYS9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTAvdGVzdF9idXJzdF9jYXB0dXJlLnB5IGIvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmUwL3Rlc3RfYnVyc3RfY2FwdHVyZS5weQppbmRleCBlNmVlMTAwLi5jNTczNTg0IDEwMDY0NAotLS0gYS9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTAvdGVzdF9idXJzdF9jYXB0dXJlLnB5CisrKyBiL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMC90ZXN0X2J1cnN0X2NhcHR1cmUucHkKQEAgLTEyLDIxICsxMiwyNiBAQAogIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCi1pbXBvcnQgaXRzLmltYWdlCi1pbXBvcnQgaXRzLmRldmljZQotaW1wb3J0IGl0cy5vYmplY3RzCiBpbXBvcnQgb3MucGF0aAogCitpbXBvcnQgaXRzLmNhcHMKK2ltcG9ydCBpdHMuZGV2aWNlCitpbXBvcnQgaXRzLmltYWdlCitpbXBvcnQgaXRzLm9iamVjdHMKKworCiBkZWYgbWFpbigpOgogICAgICIiIlRlc3QgY2FwdHVyZSBhIGJ1cnN0IG9mIGZ1bGwgc2l6ZSBpbWFnZXMgaXMgZmFzdCBlbm91Z2ggdG8gbm90IHRpbWVvdXQuCisKICAgICAgICBUaGlzIHRlc3QgdmVyaWZ5IHRoYXQgZW50aXJlIGNhcHR1cmUgcGlwZWxpbmUgY2FuIGtlZXAgdXAgdGhlIHNwZWVkCiAgICAgICAgb2YgZnVsbHNpemUgY2FwdHVyZSArIENQVSByZWFkIGZvciBhdCBsZWFzdCBzb21lIHRpbWUuCiAgICAgIiIiCiAgICAgTkFNRSA9IG9zLnBhdGguYmFzZW5hbWUoX19maWxlX18pLnNwbGl0KCIuIilbMF0KLSAgICBOVU1fVEVTVF9GUkFNRVMgPSAyMAorICAgIE5VTV9URVNUX0ZSQU1FUyA9IDE1CiAKICAgICB3aXRoIGl0cy5kZXZpY2UuSXRzU2Vzc2lvbigpIGFzIGNhbToKICAgICAgICAgcHJvcHMgPSBjYW0uZ2V0X2NhbWVyYV9wcm9wZXJ0aWVzKCkKKyAgICAgICAgaXRzLmNhcHMuc2tpcF91bmxlc3MoaXRzLmNhcHMuYmFja3dhcmRfY29tcGF0aWJsZShwcm9wcykpCiAgICAgICAgIHJlcSA9IGl0cy5vYmplY3RzLmF1dG9fY2FwdHVyZV9yZXF1ZXN0KCkKICAgICAgICAgY2FwcyA9IGNhbS5kb19jYXB0dXJlKFtyZXFdKk5VTV9URVNUX0ZSQU1FUykKIApkaWZmIC0tZ2l0IGEvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmUwL3Rlc3RfY2FtZXJhX3Byb3BlcnRpZXMucHkgYi9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTAvdGVzdF9jYW1lcmFfcHJvcGVydGllcy5weQppbmRleCBlYjYzOGYwLi5kYmQ1MjhkIDEwMDY0NAotLS0gYS9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTAvdGVzdF9jYW1lcmFfcHJvcGVydGllcy5weQorKysgYi9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTAvdGVzdF9jYW1lcmFfcHJvcGVydGllcy5weQpAQCAtMjYsOCArMjYsNiBAQAogCiAgICAgICAgIHBwcmludC5wcHJpbnQocHJvcHMpCiAKLSAgICAgICAgaXRzLmNhcHMuc2tpcF91bmxlc3MoaXRzLmNhcHMubWFudWFsX3NlbnNvcihwcm9wcykpCi0KICAgICAgICAgIyBUZXN0IHRoYXQgYSBoYW5kZnVsIG9mIHJlcXVpcmVkIGtleXMgYXJlIHByZXNlbnQuCiAgICAgICAgIGFzc2VydChwcm9wcy5oYXNfa2V5KCdhbmRyb2lkLnNlbnNvci5pbmZvLnNlbnNpdGl2aXR5UmFuZ2UnKSkKICAgICAgICAgYXNzZXJ0KHByb3BzLmhhc19rZXkoJ2FuZHJvaWQuc2Vuc29yLm9yaWVudGF0aW9uJykpCmRpZmYgLS1naXQgYS9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTAvdGVzdF9tZXRhZGF0YS5weSBiL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMC90ZXN0X21ldGFkYXRhLnB5CmluZGV4IGU3ODQ4OGUuLmI4OTQ5YjEgMTAwNjQ0Ci0tLSBhL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMC90ZXN0X21ldGFkYXRhLnB5CisrKyBiL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMC90ZXN0X21ldGFkYXRhLnB5CkBAIC0zMSw2ICszMSw3IEBACiAgICAgICAgICMgQXJiaXRyYXJ5IGNhcHR1cmUgcmVxdWVzdCBleHBvc3VyZSB2YWx1ZXM7IGltYWdlIGNvbnRlbnQgaXMgbm90CiAgICAgICAgICMgaW1wb3J0YW50IGZvciB0aGlzIHRlc3QsIG9ubHkgdGhlIG1ldGFkYXRhLgogICAgICAgICBwcm9wcyA9IGNhbS5nZXRfY2FtZXJhX3Byb3BlcnRpZXMoKQorICAgICAgICBpdHMuY2Fwcy5za2lwX3VubGVzcyhpdHMuY2Fwcy5iYWNrd2FyZF9jb21wYXRpYmxlKHByb3BzKSkKICAgICAgICAgYXV0b19yZXEgPSBpdHMub2JqZWN0cy5hdXRvX2NhcHR1cmVfcmVxdWVzdCgpCiAgICAgICAgIGNhcCA9IGNhbS5kb19jYXB0dXJlKGF1dG9fcmVxKQogICAgICAgICBtZCA9IGNhcFsibWV0YWRhdGEiXQpAQCAtOTAsOCArOTEsOCBAQAogICAgICAgICBwaXhlbF9waXRjaF93ID0gKHNlbnNvcl9zaXplWyJ3aWR0aCJdIC8gZm10c1swXVsid2lkdGgiXSAqIDFFMykKICAgICAgICAgcHJpbnQgIkFzc2VydCBwaXhlbF9waXRjaCBXeEg6ICUuMmYgdW0sICUuMmYgdW0iICUgKHBpeGVsX3BpdGNoX3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbF9waXRjaF9oKQotICAgICAgICBhc3NlcnQgMC45IDw9IHBpeGVsX3BpdGNoX3cgPD0gMTAKLSAgICAgICAgYXNzZXJ0IDAuOSA8PSBwaXhlbF9waXRjaF9oIDw9IDEwCisgICAgICAgIGFzc2VydCAwLjcgPD0gcGl4ZWxfcGl0Y2hfdyA8PSAxMAorICAgICAgICBhc3NlcnQgMC43IDw9IHBpeGVsX3BpdGNoX2ggPD0gMTAKICAgICAgICAgYXNzZXJ0IDAuMzMzIDw9IHBpeGVsX3BpdGNoX3cvcGl4ZWxfcGl0Y2hfaCA8PSAzLjAKIAogICAgICAgICBkaWFnID0gbWF0aC5zcXJ0KHNlbnNvcl9zaXplWyJoZWlnaHQiXSAqKiAyICsKZGlmZiAtLWdpdCBhL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMC90ZXN0X3BhcmFtX3NlbnNpdGl2aXR5X2J1cnN0LnB5IGIvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmUwL3Rlc3RfcGFyYW1fc2Vuc2l0aXZpdHlfYnVyc3QucHkKaW5kZXggYzNjMjE0Ny4uYjcxNjE0MSAxMDA2NDQKLS0tIGEvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmUwL3Rlc3RfcGFyYW1fc2Vuc2l0aXZpdHlfYnVyc3QucHkKKysrIGIvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmUwL3Rlc3RfcGFyYW1fc2Vuc2l0aXZpdHlfYnVyc3QucHkKQEAgLTEyLDE5ICsxMiwyMSBAQAogIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCi1pbXBvcnQgaXRzLmltYWdlCiBpbXBvcnQgaXRzLmNhcHMKIGltcG9ydCBpdHMuZGV2aWNlCitpbXBvcnQgaXRzLmltYWdlCiBpbXBvcnQgaXRzLm9iamVjdHMKIGltcG9ydCBpdHMudGFyZ2V0CiAKLWRlZiBtYWluKCk6Ci0gICAgIiIiVGVzdCB0aGF0IHRoZSBhbmRyb2lkLnNlbnNvci5zZW5zaXRpdml0eSBwYXJhbWV0ZXIgaXMgYXBwbGllZCBwcm9wZXJseQotICAgIHdpdGhpbiBhIGJ1cnN0LiBJbnNwZWN0cyB0aGUgb3V0cHV0IG1ldGFkYXRhIG9ubHkgKG5vdCB0aGUgaW1hZ2UgZGF0YSkuCi0gICAgIiIiCitOVU1fU1RFUFMgPSAzCitFUlJPUl9UT0xFUkFOQ0UgPSAwLjk2ICAjIEFsbG93IElTTyB0byBiZSByb3VuZGVkIGRvd24gYnkgNCUKIAotICAgIE5VTV9TVEVQUyA9IDMKLSAgICBFUlJPUl9UT0xFUkFOQ0UgPSAwLjk3ICMgQWxsb3cgSVNPIHRvIGJlIHJvdW5kZWQgZG93biBieSAzJQorCitkZWYgbWFpbigpOgorICAgICIiIlRlc3QgYW5kcm9pZC5zZW5zb3Iuc2Vuc2l0aXZpdHkgcGFyYW1ldGVyIGFwcGxpZWQgcHJvcGVybHkgaW4gYnVyc3QuCisKKyAgICBJbnNwZWN0cyB0aGUgb3V0cHV0IG1ldGFkYXRhIG9ubHkgKG5vdCB0aGUgaW1hZ2UgZGF0YSkuCisgICAgIiIiCiAKICAgICB3aXRoIGl0cy5kZXZpY2UuSXRzU2Vzc2lvbigpIGFzIGNhbToKICAgICAgICAgcHJvcHMgPSBjYW0uZ2V0X2NhbWVyYV9wcm9wZXJ0aWVzKCkKQEAgLTM1LDE1ICszNywxNyBAQAogICAgICAgICBzZW5zX3N0ZXAgPSAoc2Vuc19yYW5nZVsxXSAtIHNlbnNfcmFuZ2VbMF0pIC8gTlVNX1NURVBTCiAgICAgICAgIHNlbnNfbGlzdCA9IHJhbmdlKHNlbnNfcmFuZ2VbMF0sIHNlbnNfcmFuZ2VbMV0sIHNlbnNfc3RlcCkKICAgICAgICAgZSA9IG1pbihwcm9wc1snYW5kcm9pZC5zZW5zb3IuaW5mby5leHBvc3VyZVRpbWVSYW5nZSddKQotICAgICAgICByZXFzID0gW2l0cy5vYmplY3RzLm1hbnVhbF9jYXB0dXJlX3JlcXVlc3QocyxlKSBmb3IgcyBpbiBzZW5zX2xpc3RdCi0gICAgICAgIF8sZm10ID0gaXRzLm9iamVjdHMuZ2V0X2Zhc3Rlc3RfbWFudWFsX2NhcHR1cmVfc2V0dGluZ3MocHJvcHMpCisgICAgICAgIHJlcXMgPSBbaXRzLm9iamVjdHMubWFudWFsX2NhcHR1cmVfcmVxdWVzdChzLCBlKSBmb3IgcyBpbiBzZW5zX2xpc3RdCisgICAgICAgIF8sIGZtdCA9IGl0cy5vYmplY3RzLmdldF9mYXN0ZXN0X21hbnVhbF9jYXB0dXJlX3NldHRpbmdzKHByb3BzKQogCiAgICAgICAgIGNhcHMgPSBjYW0uZG9fY2FwdHVyZShyZXFzLCBmbXQpCi0gICAgICAgIGZvciBpLGNhcCBpbiBlbnVtZXJhdGUoY2Fwcyk6CisgICAgICAgIGZvciBpLCBjYXAgaW4gZW51bWVyYXRlKGNhcHMpOgogICAgICAgICAgICAgc19yZXEgPSBzZW5zX2xpc3RbaV0KLSAgICAgICAgICAgIHNfcmVzID0gY2FwWyJtZXRhZGF0YSJdWyJhbmRyb2lkLnNlbnNvci5zZW5zaXRpdml0eSJdCi0gICAgICAgICAgICBhc3NlcnQoc19yZXEgPj0gc19yZXMpCi0gICAgICAgICAgICBhc3NlcnQoc19yZXMvZmxvYXQoc19yZXEpID4gRVJST1JfVE9MRVJBTkNFKQorICAgICAgICAgICAgc19yZXMgPSBjYXBbJ21ldGFkYXRhJ11bJ2FuZHJvaWQuc2Vuc29yLnNlbnNpdGl2aXR5J10KKyAgICAgICAgICAgIG1zZyA9ICdzX3dyaXRlOiAlZCwgc19yZWFkOiAlZCwgVE9MOiAlLjJmJyAlIChzX3JlcSwgc19yZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJST1JfVE9MRVJBTkNFKQorICAgICAgICAgICAgYXNzZXJ0IHNfcmVxID49IHNfcmVzLCBtc2cKKyAgICAgICAgICAgIGFzc2VydCBzX3Jlcy9mbG9hdChzX3JlcSkgPiBFUlJPUl9UT0xFUkFOQ0UsIG1zZwogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmUwL3Rlc3RfcmVhZF93cml0ZS5weSBiL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMC90ZXN0X3JlYWRfd3JpdGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI3NjgwNgotLS0gL2Rldi9udWxsCisrKyBiL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMC90ZXN0X3JlYWRfd3JpdGUucHkKQEAgLTAsMCArMSwxMTcgQEAKKyMgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworaW1wb3J0IG9zLnBhdGgKKworaW1wb3J0IGl0cy5jYXBzCitpbXBvcnQgaXRzLmRldmljZQoraW1wb3J0IGl0cy5pbWFnZQoraW1wb3J0IGl0cy5vYmplY3RzCisKK05BTUUgPSBvcy5wYXRoLmJhc2VuYW1lKF9fZmlsZV9fKS5zcGxpdCgnLicpWzBdCitSVE9MX0VYUF9HQUlOID0gMC45NworVEVTVF9FWFBfUkFOR0UgPSBbNkU2LCAxRTldICAjIG5zIFs2bXMsIDFzXQorCisKK2RlZiBtYWluKCk6CisgICAgIiIiVGVzdCB0aGF0IHRoZSBkZXZpY2Ugd2lsbCB3cml0ZS9yZWFkIGNvcnJlY3QgZXhwL2dhaW4gdmFsdWVzLiIiIgorCisgICAgd2l0aCBpdHMuZGV2aWNlLkl0c1Nlc3Npb24oKSBhcyBjYW06CisgICAgICAgIHByb3BzID0gY2FtLmdldF9jYW1lcmFfcHJvcGVydGllcygpCisgICAgICAgIGl0cy5jYXBzLnNraXBfdW5sZXNzKGl0cy5jYXBzLm1hbnVhbF9zZW5zb3IocHJvcHMpIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdHMuY2Fwcy5wZXJfZnJhbWVfY29udHJvbChwcm9wcykpCisKKyAgICAgICAgIyBkZXRlcm1pbmUgY2FwdHVyZSBmb3JtYXQKKyAgICAgICAgZGVidWcgPSBpdHMuY2Fwcy5kZWJ1Z19tb2RlKCkKKyAgICAgICAgbGFyZ2VzdF95dXYgPSBpdHMub2JqZWN0cy5nZXRfbGFyZ2VzdF95dXZfZm9ybWF0KHByb3BzKQorICAgICAgICBpZiBkZWJ1ZzoKKyAgICAgICAgICAgIGZtdCA9IGxhcmdlc3RfeXV2CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtYXRjaF9hciA9IChsYXJnZXN0X3l1dlsnd2lkdGgnXSwgbGFyZ2VzdF95dXZbJ2hlaWdodCddKQorICAgICAgICAgICAgZm10ID0gaXRzLm9iamVjdHMuZ2V0X3NtYWxsZXN0X3l1dl9mb3JtYXQocHJvcHMsIG1hdGNoX2FyPW1hdGNoX2FyKQorCisgICAgICAgICMgZ3JhYiBleHAvZ2FpbiByYW5nZXMgZnJvbSBjYW1lcmEKKyAgICAgICAgc2Vuc29yX2V4cF9yYW5nZSA9IHByb3BzWydhbmRyb2lkLnNlbnNvci5pbmZvLmV4cG9zdXJlVGltZVJhbmdlJ10KKyAgICAgICAgc2Vuc19yYW5nZSA9IHByb3BzWydhbmRyb2lkLnNlbnNvci5pbmZvLnNlbnNpdGl2aXR5UmFuZ2UnXQorICAgICAgICBwcmludCAnc2Vuc29yIGUgcmFuZ2U6Jywgc2Vuc29yX2V4cF9yYW5nZQorICAgICAgICBwcmludCAnc2Vuc29yIHMgcmFuZ2U6Jywgc2Vuc19yYW5nZQorCisgICAgICAgICMgZGV0ZXJtaW5lIGlmIGV4cG9zdXJlIHRlc3QgcmFuZ2UgaXMgd2l0aGluIHNlbnNvciByZXBvcnRlZCByYW5nZQorICAgICAgICBleHBfcmFuZ2UgPSBbXQorICAgICAgICBpZiBzZW5zb3JfZXhwX3JhbmdlWzBdIDwgVEVTVF9FWFBfUkFOR0VbMF06CisgICAgICAgICAgICBleHBfcmFuZ2UuYXBwZW5kKFRFU1RfRVhQX1JBTkdFWzBdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZXhwX3JhbmdlLmFwcGVuZChzZW5zb3JfZXhwX3JhbmdlWzBdKQorICAgICAgICBpZiBzZW5zb3JfZXhwX3JhbmdlWzFdID4gVEVTVF9FWFBfUkFOR0VbMV06CisgICAgICAgICAgICBleHBfcmFuZ2UuYXBwZW5kKFRFU1RfRVhQX1JBTkdFWzFdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZXhwX3JhbmdlLmFwcGVuZChzZW5zb3JfZXhwX3JhbmdlWzFdKQorCisgICAgICAgICMgYnVpbGQgcmVxdWVzdHMKKyAgICAgICAgcmVxcyA9IFtdCisgICAgICAgIGluZGV4X2xpc3QgPSBbXQorICAgICAgICBmb3IgZXhwIGluIGV4cF9yYW5nZToKKyAgICAgICAgICAgIGZvciBzZW5zIGluIHNlbnNfcmFuZ2U6CisgICAgICAgICAgICAgICAgcmVxcy5hcHBlbmQoaXRzLm9iamVjdHMubWFudWFsX2NhcHR1cmVfcmVxdWVzdChzZW5zLCBleHApKQorICAgICAgICAgICAgICAgIGluZGV4X2xpc3QuYXBwZW5kKChleHAsIHNlbnMpKQorCisgICAgICAgICMgdGFrZSBzaG90cworICAgICAgICBjYXBzID0gY2FtLmRvX2NhcHR1cmUocmVxcywgZm10KQorCisgICAgICAgICMgZXh0cmFjdCBleHAvc2Vuc2l0aXZpdHkgZGF0YQorICAgICAgICBkYXRhID0ge30KKyAgICAgICAgZm9yIGksIGNhcCBpbiBlbnVtZXJhdGUoY2Fwcyk6CisgICAgICAgICAgICBlX3JlYWQgPSBjYXBbJ21ldGFkYXRhJ11bJ2FuZHJvaWQuc2Vuc29yLmV4cG9zdXJlVGltZSddCisgICAgICAgICAgICBzX3JlYWQgPSBjYXBbJ21ldGFkYXRhJ11bJ2FuZHJvaWQuc2Vuc29yLnNlbnNpdGl2aXR5J10KKyAgICAgICAgICAgIGRhdGFbaW5kZXhfbGlzdFtpXV0gPSAoZV9yZWFkLCBzX3JlYWQpCisKKyAgICAgICAgIyBjaGVjayByZWFkL3dyaXRlIG1hdGNoIGFjcm9zcyBhbGwgc2hvdHMKKyAgICAgICAgZV9mYWlsZWQgPSBbXQorICAgICAgICBzX2ZhaWxlZCA9IFtdCisgICAgICAgIGZvciBlX3dyaXRlIGluIGV4cF9yYW5nZToKKyAgICAgICAgICAgIGZvciBzX3dyaXRlIGluIHNlbnNfcmFuZ2U6CisgICAgICAgICAgICAgICAgKGVfcmVhZCwgc19yZWFkKSA9IGRhdGFbKGVfd3JpdGUsIHNfd3JpdGUpXQorICAgICAgICAgICAgICAgIGlmIGVfd3JpdGUgPCBlX3JlYWQgb3IgZV9yZWFkL2Zsb2F0KGVfd3JpdGUpIDw9IFJUT0xfRVhQX0dBSU46CisgICAgICAgICAgICAgICAgICAgIGVfZmFpbGVkLmFwcGVuZCh7J2Vfd3JpdGUnOiBlX3dyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlX3JlYWQnOiBlX3JlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Nfd3JpdGUnOiBzX3dyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzX3JlYWQnOiBzX3JlYWR9KQorICAgICAgICAgICAgICAgIGlmIHNfd3JpdGUgPCBzX3JlYWQgb3Igc19yZWFkL2Zsb2F0KHNfd3JpdGUpIDw9IFJUT0xfRVhQX0dBSU46CisgICAgICAgICAgICAgICAgICAgIHNfZmFpbGVkLmFwcGVuZCh7J2Vfd3JpdGUnOiBlX3dyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlX3JlYWQnOiBlX3JlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Nfd3JpdGUnOiBzX3dyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzX3JlYWQnOiBzX3JlYWR9KQorCisgICAgICAgICMgcHJpbnQgcmVzdWx0cworICAgICAgICBpZiBlX2ZhaWxlZDoKKyAgICAgICAgICAgIHByaW50ICdcbkZBSUxzIGZvciBleHBvc3VyZSB0aW1lJworICAgICAgICAgICAgZm9yIGZhaWwgaW4gZV9mYWlsZWQ6CisgICAgICAgICAgICAgICAgcHJpbnQgJyBlX3dyaXRlOiAlZCwgZV9yZWFkOiAlZCwgUlRPTDogJS4yZiwgJyAlICgKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxbJ2Vfd3JpdGUnXSwgZmFpbFsnZV9yZWFkJ10sIFJUT0xfRVhQX0dBSU4pLAorICAgICAgICAgICAgICAgIHByaW50ICdzX3dyaXRlOiAlZCwgc19yZWFkOiAlZCwgUlRPTDogJS4yZicgJSAoCisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsWydzX3dyaXRlJ10sIGZhaWxbJ3NfcmVhZCddLCBSVE9MX0VYUF9HQUlOKQorICAgICAgICBpZiBzX2ZhaWxlZDoKKyAgICAgICAgICAgIHByaW50ICdGQUlMcyBmb3Igc2Vuc2l0aXZpdHkoSVNPKScKKyAgICAgICAgICAgIGZvciBmYWlsIGluIHNfZmFpbGVkOgorICAgICAgICAgICAgICAgIHByaW50ICdzX3dyaXRlOiAlZCwgc19yZWFkOiAlZCwgUlRPTDogJS4yZiwgJyAlICgKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxbJ3Nfd3JpdGUnXSwgZmFpbFsnc19yZWFkJ10sIFJUT0xfRVhQX0dBSU4pLAorICAgICAgICAgICAgICAgIHByaW50ICcgZV93cml0ZTogJWQsIGVfcmVhZDogJWQsIFJUT0w6ICUuMmYnICUgKAorICAgICAgICAgICAgICAgICAgICAgICAgZmFpbFsnZV93cml0ZSddLCBmYWlsWydlX3JlYWQnXSwgUlRPTF9FWFBfR0FJTikKKworICAgICAgICAjIGFzc2VydCBQQVNTL0ZBSUwKKyAgICAgICAgYXNzZXJ0IG5vdCBlX2ZhaWxlZCtzX2ZhaWxlZAorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTAvdGVzdF90ZXN0X3BhdHRlcm5zLnB5IGIvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmUwL3Rlc3RfdGVzdF9wYXR0ZXJucy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWQ5Y2I4Ci0tLSAvZGV2L251bGwKKysrIGIvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmUwL3Rlc3RfdGVzdF9wYXR0ZXJucy5weQpAQCAtMCwwICsxLDE3NCBAQAorIyBDb3B5cmlnaHQgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbXBvcnQgb3MKKworaW1wb3J0IGl0cy5jYXBzCitpbXBvcnQgaXRzLmRldmljZQoraW1wb3J0IGl0cy5pbWFnZQoraW1wb3J0IGl0cy5vYmplY3RzCitpbXBvcnQgbnVtcHkgYXMgbnAKKworTkFNRSA9IG9zLnBhdGguYmFzZW5hbWUoX19maWxlX18pLnNwbGl0KCcuJylbMF0KK1BBVFRFUk5TID0gWzEsIDJdCitDT0xPUl9CQVJfT1JERVIgPSBbJ1dISVRFJywgJ1lFTExPVycsICdDWUFOJywgJ0dSRUVOJywgJ01BR0VOVEEnLCAnUkVEJywKKyAgICAgICAgICAgICAgICAgICAnQkxVRScsICdCTEFDSyddCitDT0xPUl9DSEVDS0VSID0geydCTEFDSyc6IFswLCAwLCAwXSwgJ1JFRCc6IFsxLCAwLCAwXSwgJ0dSRUVOJzogWzAsIDEsIDBdLAorICAgICAgICAgICAgICAgICAnQkxVRSc6IFswLCAwLCAxXSwgJ01BR0VOVEEnOiBbMSwgMCwgMV0sICdDWUFOJzogWzAsIDEsIDFdLAorICAgICAgICAgICAgICAgICAnWUVMTE9XJzogWzEsIDEsIDBdLCAnV0hJVEUnOiBbMSwgMSwgMV19CitDSF9UT0wgPSAyRS0zICAjIDEvMiBETiBpbiBbMDoxXQorTFNGUl9DT0VGRlMgPSAwYjEwMDAxMDAwMCAgIyBQTjkKKworCitkZWYgY2hlY2tfc29saWRfY29sb3IoY2FwLCBwcm9wcyk6CisgICAgIiIiU2ltcGxlIHRlc3QgZm9yIHNvbGlkIGNvbG9yLgorCisgICAgQXJnczoKKyAgICAgICAgY2FwOiBjYXB0dXJlIGVsZW1lbnQKKyAgICAgICAgcHJvcHM6IGNhcHR1cmUgcHJvcGVydGllcworICAgIFJldHVybnM6CisgICAgICAgIFRydWUvRmFsc2UKKyAgICAiIiIKKyAgICBwcmludCAnQ2hlY2tpbmcgc29saWQgVGVzdFBhdHRlcm4uLi4nCisgICAgciwgZ3IsIGdiLCBiID0gaXRzLmltYWdlLmNvbnZlcnRfY2FwdHVyZV90b19wbGFuZXMoY2FwLCBwcm9wcykKKyAgICByX3RpbGUgPSBpdHMuaW1hZ2UuZ2V0X2ltYWdlX3BhdGNoKHIsIDAuMCwgMC4wLCAxLjAsIDEuMCkKKyAgICBncl90aWxlID0gaXRzLmltYWdlLmdldF9pbWFnZV9wYXRjaChnciwgMC4wLCAwLjAsIDEuMCwgMS4wKQorICAgIGdiX3RpbGUgPSBpdHMuaW1hZ2UuZ2V0X2ltYWdlX3BhdGNoKGdiLCAwLjAsIDAuMCwgMS4wLCAxLjApCisgICAgYl90aWxlID0gaXRzLmltYWdlLmdldF9pbWFnZV9wYXRjaChiLCAwLjAsIDAuMCwgMS4wLCAxLjApCisgICAgdmFyX21heCA9IG1heChucC5hbWF4KHJfdGlsZSksIG5wLmFtYXgoZ3JfdGlsZSksIG5wLmFtYXgoZ2JfdGlsZSksCisgICAgICAgICAgICAgICAgICBucC5hbWF4KGJfdGlsZSkpCisgICAgdmFyX21pbiA9IG1pbihucC5hbWluKHJfdGlsZSksIG5wLmFtaW4oZ3JfdGlsZSksIG5wLmFtaW4oZ2JfdGlsZSksCisgICAgICAgICAgICAgICAgICBucC5hbWluKGJfdGlsZSkpCisgICAgd2hpdGVfbGV2ZWwgPSBpbnQocHJvcHNbJ2FuZHJvaWQuc2Vuc29yLmluZm8ud2hpdGVMZXZlbCddKQorICAgIHByaW50ICcgcGl4ZWwgbWluOiAlLmYsIHBpeGVsIG1heDogJS5mJyAlICh3aGl0ZV9sZXZlbCp2YXJfbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGl0ZV9sZXZlbCp2YXJfbWF4KQorICAgIHJldHVybiBucC5pc2Nsb3NlKHZhcl9tYXgsIHZhcl9taW4sIGF0b2w9Q0hfVE9MKQorCisKK2RlZiBjaGVja19jb2xvcl9iYXJzKGNhcCwgcHJvcHMsIG1pcnJvcj1GYWxzZSk6CisgICAgIiIiVGVzdCBpbWFnZSBmb3IgY29sb3IgYmFycy4KKworICAgIENvbXB1dGUgYXZnIG9mIGJhcnMgYW5kIGNvbXBhcmUgdG8gaWRlYWwKKworICAgIEFyZ3M6CisgICAgICAgIGNhcDogICAgICAgICAgICBjYXB0dXJlIGVsZW1lbnQKKyAgICAgICAgcHJvcHM6ICAgICAgICAgIGNhcHR1cmUgcHJvcGVydGllcworICAgICAgICBtaXJyb3IgKGJvb2wpOiAgd2hldGhlciB0byBtaXJyb3IgaW1hZ2Ugb3Igbm90CisgICAgUmV0dXJuczoKKyAgICAgICAgVHJ1ZS9GYWxzZQorICAgICIiIgorICAgIHByaW50ICdDaGVja2luZyBjb2xvciBiYXIgVGVzdFBhdHRlcm4uLi4nCisgICAgZGVsdGEgPSAwLjAwMDUKKyAgICBudW1fYmFycyA9IGxlbihDT0xPUl9CQVJfT1JERVIpCisgICAgY29sb3JfbWF0Y2ggPSBbXQorICAgIGltZyA9IGl0cy5pbWFnZS5jb252ZXJ0X2NhcHR1cmVfdG9fcmdiX2ltYWdlKGNhcCwgcHJvcHM9cHJvcHMpCisgICAgaWYgbWlycm9yOgorICAgICAgICBwcmludCAnIEltYWdlIG1pcnJvcmVkJworICAgICAgICBpbWcgPSBucC5mbGlwbHIoaW1nKQorICAgIGZvciBpLCBjb2xvciBpbiBlbnVtZXJhdGUoQ09MT1JfQkFSX09SREVSKToKKyAgICAgICAgdGlsZSA9IGl0cy5pbWFnZS5nZXRfaW1hZ2VfcGF0Y2goaW1nLCBmbG9hdChpKS9udW1fYmFycytkZWx0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wLCAxLjAvbnVtX2JhcnMtMipkZWx0YSwgMS4wKQorICAgICAgICBjb2xvcl9tYXRjaC5hcHBlbmQobnAuYWxsY2xvc2UoaXRzLmltYWdlLmNvbXB1dGVfaW1hZ2VfbWVhbnModGlsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0xPUl9DSEVDS0VSW2NvbG9yXSwgYXRvbD1DSF9UT0wpKQorICAgIHByaW50IENPTE9SX0JBUl9PUkRFUgorICAgIHByaW50IGNvbG9yX21hdGNoCisgICAgcmV0dXJuIGFsbChjb2xvcl9tYXRjaCkKKworCitkZWYgY2hlY2tfcGF0dGVybihjYXAsIHByb3BzLCBwYXR0ZXJuKToKKyAgICAiIiJTaW1wbGUgdGVzdHMgZm9yIHBhdHRlcm4gY29ycmVjdG5lc3MuCisKKyAgICBBcmdzOgorICAgICAgICBjYXA6IGNhcHR1cmUgZWxlbWVudAorICAgICAgICBwcm9wczogY2FwdHVyZSBwcm9wZXJ0aWVzCisgICAgICAgIHBhdHRlcm4gKGludCk6IHZhbGlkIG51bWJlciBmb3IgcGF0dGVybgorICAgIFJldHVybnM6CisgICAgICAgIGJvb2xlYW4KKyAgICAiIiIKKworICAgICMgd2hpdGVfbGV2ZWwgPSBpbnQocHJvcHNbJ2FuZHJvaWQuc2Vuc29yLmluZm8ud2hpdGVMZXZlbCddKQorICAgIGlmIHBhdHRlcm4gPT0gMTogICMgc29saWQgY29sb3IKKyAgICAgICAgcmV0dXJuIGNoZWNrX3NvbGlkX2NvbG9yKGNhcCwgcHJvcHMpCisKKyAgICBlbGlmIHBhdHRlcm4gPT0gMjogICMgY29sb3IgYmFycworICAgICAgICBzdHJpcGVkID0gY2hlY2tfY29sb3JfYmFycyhjYXAsIHByb3BzLCBtaXJyb3I9RmFsc2UpCisgICAgICAgICMgY2hlY2sgbWlycm9yZWQgdmVyc2lvbiBpbiBjYXNlIGltYWdlIHJvdGF0ZWQgZnJvbSBzZW5zb3Igb3JpZW50YXRpb24KKyAgICAgICAgaWYgbm90IHN0cmlwZWQ6CisgICAgICAgICAgICBzdHJpcGVkID0gY2hlY2tfY29sb3JfYmFycyhjYXAsIHByb3BzLCBtaXJyb3I9VHJ1ZSkKKyAgICAgICAgcmV0dXJuIHN0cmlwZWQKKworICAgIGVsc2U6CisgICAgICAgIHByaW50ICdObyBzcGVjaWZpYyB0ZXN0IGZvciBUZXN0UGF0dGVybiAlZCcgJSBwYXR0ZXJuCisgICAgICAgIHJldHVybiBUcnVlCisKKworZGVmIHRlc3RfdGVzdF9wYXR0ZXJucyhjYW0sIHByb3BzLCBhZl9mZCk6CisgICAgIiIidGVzdCBpbWFnZSBzZW5zb3IgdGVzdCBwYXR0ZXJucy4KKworICAgIEFyZ3M6CisgICAgICAgIGNhbTogQW4gb3BlbiBkZXZpY2Ugc2Vzc2lvbi4KKyAgICAgICAgcHJvcHM6IFByb3BlcnRpZXMgb2YgY2FtCisgICAgICAgIGFmX2ZkOiBGb2N1cyBkaXN0YW5jZQorICAgICIiIgorCisgICAgYXZhaWxfcGF0dGVybnMgPSBwcm9wc1snYW5kcm9pZC5zZW5zb3IuYXZhaWxhYmxlVGVzdFBhdHRlcm5Nb2RlcyddCisgICAgcHJpbnQgJ2F2YWlsX3BhdHRlcm5zOiAnLCBhdmFpbF9wYXR0ZXJucworICAgIHNlbnNfbWluLCBfID0gcHJvcHNbJ2FuZHJvaWQuc2Vuc29yLmluZm8uc2Vuc2l0aXZpdHlSYW5nZSddCisgICAgZXhwb3N1cmUgPSBtaW4ocHJvcHNbJ2FuZHJvaWQuc2Vuc29yLmluZm8uZXhwb3N1cmVUaW1lUmFuZ2UnXSkKKworICAgIGZvciBwYXR0ZXJuIGluIFBBVFRFUk5TOgorICAgICAgICBpZiBwYXR0ZXJuIGluIGF2YWlsX3BhdHRlcm5zOgorICAgICAgICAgICAgcmVxID0gaXRzLm9iamVjdHMubWFudWFsX2NhcHR1cmVfcmVxdWVzdChpbnQoc2Vuc19taW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBvc3VyZSkKKyAgICAgICAgICAgIHJlcVsnYW5kcm9pZC5sZW5zLmZvY3VzRGlzdGFuY2UnXSA9IGFmX2ZkCisgICAgICAgICAgICByZXFbJ2FuZHJvaWQuc2Vuc29yLnRlc3RQYXR0ZXJuTW9kZSddID0gcGF0dGVybgorICAgICAgICAgICAgZm10ID0geydmb3JtYXQnOiAncmF3J30KKyAgICAgICAgICAgIGNhcCA9IGNhbS5kb19jYXB0dXJlKHJlcSwgZm10KQorICAgICAgICAgICAgaW1nID0gaXRzLmltYWdlLmNvbnZlcnRfY2FwdHVyZV90b19yZ2JfaW1hZ2UoY2FwLCBwcm9wcz1wcm9wcykKKworICAgICAgICAgICAgIyBTYXZlIHBhdHRlcm4KKyAgICAgICAgICAgIGl0cy5pbWFnZS53cml0ZV9pbWFnZShpbWcsICclc18lZC5qcGcnICUgKE5BTUUsIHBhdHRlcm4pLCBUcnVlKQorCisgICAgICAgICAgICAjIENoZWNrIHBhdHRlcm4gZm9yIGNvcnJlY3RuZXNzCisgICAgICAgICAgICBhc3NlcnQgY2hlY2tfcGF0dGVybihjYXAsIHByb3BzLCBwYXR0ZXJuKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQgJ1BhdHRlcm4gbm90IGluIGFuZHJvaWQuc2Vuc29yLmF2YWlsYWJsZVRlc3RQYXR0ZXJuTW9kZXMuJworCisKK2RlZiBtYWluKCk6CisgICAgIiIiVGVzdCBwYXR0ZXJuIGdlbmVyYXRpb24gdGVzdC4KKworICAgIFRlc3Q6IGNhcHR1cmUgZnJhbWVzIGZvciBlYWNoIHZhbGlkIHRlc3QgcGF0dGVybiBhbmQgY2hlY2sgaWYKKyAgICBnZW5lcmF0ZWQgY29ycmVjdGx5LgorICAgIGFuZHJvaWQuc2Vuc29yLnRlc3RQYXR0ZXJuTW9kZQorICAgIDA6IE9GRgorICAgIDE6IFNPTElEX0NPTE9SCisgICAgMjogQ09MT1JfQkFSUworICAgIDM6IENPTE9SX0JBUlNfRkFERV9UT19HUkVZCisgICAgNDogUE45CisgICAgIiIiCisKKyAgICBwcmludCAnXG5TdGFydGluZyAlcycgJSBOQU1FCisgICAgd2l0aCBpdHMuZGV2aWNlLkl0c1Nlc3Npb24oKSBhcyBjYW06CisgICAgICAgIHByb3BzID0gY2FtLmdldF9jYW1lcmFfcHJvcGVydGllcygpCisgICAgICAgIGl0cy5jYXBzLnNraXBfdW5sZXNzKGl0cy5jYXBzLnJhdzE2KHByb3BzKSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRzLmNhcHMubWFudWFsX3NlbnNvcihwcm9wcykgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0cy5jYXBzLnBlcl9mcmFtZV9jb250cm9sKHByb3BzKSkKKworICAgICAgICAjIEZvciB0ZXN0IHBhdHRlcm4sIHVzZSBtaW5fZmQKKyAgICAgICAgZmQgPSBwcm9wc1snYW5kcm9pZC5sZW5zLmluZm8ubWluaW11bUZvY3VzRGlzdGFuY2UnXQorICAgICAgICB0ZXN0X3Rlc3RfcGF0dGVybnMoY2FtLCBwcm9wcywgZmQpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTAvdGVzdF91bmlmaWVkX3RpbWVzdGFtcHMucHkgYi9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTAvdGVzdF91bmlmaWVkX3RpbWVzdGFtcHMucHkKaW5kZXggYTQ5NmZiMy4uNWE5MjI4ZSAxMDA2NDQKLS0tIGEvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmUwL3Rlc3RfdW5pZmllZF90aW1lc3RhbXBzLnB5CisrKyBiL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMC90ZXN0X3VuaWZpZWRfdGltZXN0YW1wcy5weQpAQCAtMjUsMTAgKzI1LDE0IEBACiAgICAgICAgIHByb3BzID0gY2FtLmdldF9jYW1lcmFfcHJvcGVydGllcygpCiAKICAgICAgICAgIyBPbmx5IHJ1biB0ZXN0IGlmIHRoZSBhcHByb3ByaWF0ZSBjYXBzIGFyZSBjbGFpbWVkLgotICAgICAgICBpdHMuY2Fwcy5za2lwX3VubGVzcyhpdHMuY2Fwcy5zZW5zb3JfZnVzaW9uKHByb3BzKSkKKyAgICAgICAgaXRzLmNhcHMuc2tpcF91bmxlc3MoaXRzLmNhcHMuc2Vuc29yX2Z1c2lvbihwcm9wcykgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0cy5jYXBzLmJhY2t3YXJkX2NvbXBhdGlibGUocHJvcHMpKQogCiAgICAgICAgICMgR2V0IHRoZSB0aW1lc3RhbXAgb2YgYSBjYXB0dXJlZCBpbWFnZS4KLSAgICAgICAgcmVxLCBmbXQgPSBpdHMub2JqZWN0cy5nZXRfZmFzdGVzdF9tYW51YWxfY2FwdHVyZV9zZXR0aW5ncyhwcm9wcykKKyAgICAgICAgaWYgaXRzLmNhcHMubWFudWFsX3NlbnNvcihwcm9wcyk6CisgICAgICAgICAgICByZXEsIGZtdCA9IGl0cy5vYmplY3RzLmdldF9mYXN0ZXN0X21hbnVhbF9jYXB0dXJlX3NldHRpbmdzKHByb3BzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmVxLCBmbXQgPSBpdHMub2JqZWN0cy5nZXRfZmFzdGVzdF9hdXRvX2NhcHR1cmVfc2V0dGluZ3MocHJvcHMpCiAgICAgICAgIGNhcCA9IGNhbS5kb19jYXB0dXJlKHJlcSwgZm10KQogICAgICAgICB0c19pbWFnZTAgPSBjYXBbJ21ldGFkYXRhJ11bJ2FuZHJvaWQuc2Vuc29yLnRpbWVzdGFtcCddCiAKZGlmZiAtLWdpdCBhL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMS90ZXN0XzNhLnB5IGIvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmUxL3Rlc3RfM2EucHkKaW5kZXggMDhjZDc0Ny4uNjVjYWM3MSAxMDA2NDQKLS0tIGEvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmUxL3Rlc3RfM2EucHkKKysrIGIvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmUxL3Rlc3RfM2EucHkKQEAgLTEyLDggKzEyLDExIEBACiAjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKLWltcG9ydCBpdHMuZGV2aWNlCiBpbXBvcnQgaXRzLmNhcHMKK2ltcG9ydCBpdHMuZGV2aWNlCisKK2ltcG9ydCBudW1weSBhcyBucAorCiAKIGRlZiBtYWluKCk6CiAgICAgIiIiQmFzaWMgdGVzdCBmb3IgYnJpbmctdXAgb2YgM0EuCkBAIC0yNCwxNiArMjcsMjIgQEAKICAgICB3aXRoIGl0cy5kZXZpY2UuSXRzU2Vzc2lvbigpIGFzIGNhbToKICAgICAgICAgcHJvcHMgPSBjYW0uZ2V0X2NhbWVyYV9wcm9wZXJ0aWVzKCkKICAgICAgICAgaXRzLmNhcHMuc2tpcF91bmxlc3MoaXRzLmNhcHMucmVhZF8zYShwcm9wcykpCisgICAgICAgIG1vbm9fY2FtZXJhID0gaXRzLmNhcHMubW9ub19jYW1lcmEocHJvcHMpCiAKLSAgICAgICAgc2VucywgZXhwLCBnYWlucywgeGZvcm0sIGZvY3VzID0gY2FtLmRvXzNhKGdldF9yZXN1bHRzPVRydWUpCi0gICAgICAgIHByaW50ICJBRTogc2Vuc2l0aXZpdHkgJWQsIGV4cG9zdXJlICVkbXMiICUgKHNlbnMsIGV4cC8xMDAwMDAwKQotICAgICAgICBwcmludCAiQVdCOiBnYWlucyIsIGdhaW5zLCAidHJhbnNmb3JtIiwgeGZvcm0KLSAgICAgICAgcHJpbnQgIkFGOiBkaXN0YW5jZSIsIGZvY3VzCi0gICAgICAgIGFzc2VydChzZW5zID4gMCkKLSAgICAgICAgYXNzZXJ0KGV4cCA+IDApCi0gICAgICAgIGFzc2VydChsZW4oZ2FpbnMpID09IDQpCi0gICAgICAgIGFzc2VydChsZW4oeGZvcm0pID09IDkpCi0gICAgICAgIGFzc2VydChmb2N1cyA+PSAwKQorICAgICAgICBzZW5zLCBleHAsIGdhaW5zLCB4Zm9ybSwgZm9jdXMgPSBjYW0uZG9fM2EoZ2V0X3Jlc3VsdHM9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbm9fY2FtZXJhPW1vbm9fY2FtZXJhKQorICAgICAgICBwcmludCAnQUU6IHNlbnNpdGl2aXR5ICVkLCBleHBvc3VyZSAlZG1zJyAlIChzZW5zLCBleHAvMTAwMDAwMCkKKyAgICAgICAgcHJpbnQgJ0FXQjogZ2FpbnMnLCBnYWlucywgJ3RyYW5zZm9ybScsIHhmb3JtCisgICAgICAgIHByaW50ICdBRjogZGlzdGFuY2UnLCBmb2N1cworICAgICAgICBhc3NlcnQgc2VucyA+IDAKKyAgICAgICAgYXNzZXJ0IGV4cCA+IDAKKyAgICAgICAgYXNzZXJ0IGxlbihnYWlucykgPT0gNAorICAgICAgICBmb3IgZyBpbiBnYWluczoKKyAgICAgICAgICAgIGFzc2VydCBub3QgbnAuaXNuYW4oZykKKyAgICAgICAgYXNzZXJ0IGxlbih4Zm9ybSkgPT0gOQorICAgICAgICBmb3IgeCBpbiB4Zm9ybToKKyAgICAgICAgICAgIGFzc2VydCBub3QgbnAuaXNuYW4oeCkKKyAgICAgICAgYXNzZXJ0IGZvY3VzID49IDAKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICBtYWluKCkKZGlmZiAtLWdpdCBhL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMS90ZXN0X2FlX2FmLnB5IGIvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmUxL3Rlc3RfYWVfYWYucHkKaW5kZXggNjI2YTQ3NS4uZmFiYzQ5NCAxMDA2NDQKLS0tIGEvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmUxL3Rlc3RfYWVfYWYucHkKKysrIGIvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmUxL3Rlc3RfYWVfYWYucHkKQEAgLTE2LDcgKzE2LDcgQEAKIGltcG9ydCBpdHMuZGV2aWNlCiBpbXBvcnQgaXRzLnRhcmdldAogCi1pbXBvcnQgbnVtcHkKK2ltcG9ydCBudW1weSBhcyBucAogCiBHQUlOX0xFTkdUSCA9IDQKIFRSQU5TRk9STV9MRU5HVEggPSA5CkBAIC0zNSwxNiArMzUsMTggQEAKICAgICB3aXRoIGl0cy5kZXZpY2UuSXRzU2Vzc2lvbigpIGFzIGNhbToKICAgICAgICAgcHJvcHMgPSBjYW0uZ2V0X2NhbWVyYV9wcm9wZXJ0aWVzKCkKICAgICAgICAgaXRzLmNhcHMuc2tpcF91bmxlc3MoaXRzLmNhcHMucmVhZF8zYShwcm9wcykpCisgICAgICAgIG1vbm9fY2FtZXJhID0gaXRzLmNhcHMubW9ub19jYW1lcmEocHJvcHMpCiAKICAgICAgICAgZm9yIGssIHYgaW4gc29ydGVkKFNJTkdMRV9BLml0ZW1zKCkpOgogICAgICAgICAgICAgcHJpbnQgawogICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHMsIGUsIGcsIHhmb3JtLCBmZCA9IGNhbS5kb18zYShnZXRfcmVzdWx0cz1UcnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb19hZT12WzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb19hZj12WzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb19hd2I9dlsyXSkKKyAgICAgICAgICAgICAgICBzLCBlLCBnYWlucywgeGZvcm0sIGZkID0gY2FtLmRvXzNhKGdldF9yZXN1bHRzPVRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb19hZT12WzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9fYWY9dlsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvX2F3Yj12WzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9ub19jYW1lcmE9bW9ub19jYW1lcmEpCiAgICAgICAgICAgICAgICAgcHJpbnQgJyBzZW5zaXRpdml0eScsIHMsICdleHBvc3VyZScsIGUKLSAgICAgICAgICAgICAgICBwcmludCAnIGdhaW5zJywgZywgJ3RyYW5zZm9ybScsIHhmb3JtCisgICAgICAgICAgICAgICAgcHJpbnQgJyBnYWlucycsIGdhaW5zLCAndHJhbnNmb3JtJywgeGZvcm0KICAgICAgICAgICAgICAgICBwcmludCAnIGZkJywgZmQKICAgICAgICAgICAgICAgICBwcmludCAnJwogICAgICAgICAgICAgZXhjZXB0IGl0cy5lcnJvci5FcnJvcjoKQEAgLTUyLDEwICs1NCwxNCBAQAogICAgICAgICAgICAgaWYgayA9PSAnZnVsbF8zYSc6CiAgICAgICAgICAgICAgICAgYXNzZXJ0IHMgPiAwCiAgICAgICAgICAgICAgICAgYXNzZXJ0IGUgPiAwCi0gICAgICAgICAgICAgICAgYXNzZXJ0IGxlbihnKSA9PSA0CisgICAgICAgICAgICAgICAgYXNzZXJ0IGxlbihnYWlucykgPT0gNAorICAgICAgICAgICAgICAgIGZvciBnIGluIGdhaW5zOgorICAgICAgICAgICAgICAgICAgICBhc3NlcnQgbm90IG5wLmlzbmFuKGcpCiAgICAgICAgICAgICAgICAgYXNzZXJ0IGxlbih4Zm9ybSkgPT0gOQorICAgICAgICAgICAgICAgIGZvciB4IGluIHhmb3JtOgorICAgICAgICAgICAgICAgICAgICBhc3NlcnQgbm90IG5wLmlzbmFuKHgpCiAgICAgICAgICAgICAgICAgYXNzZXJ0IGZkID49IDAKLSAgICAgICAgICAgICAgICBhc3NlcnQgbnVtcHkuaXNjbG9zZShnWzJdLCBHUkVFTl9HQUlOLCBHUkVFTl9HQUlOX1RPTCkKKyAgICAgICAgICAgICAgICBhc3NlcnQgbnAuaXNjbG9zZShnYWluc1syXSwgR1JFRU5fR0FJTiwgR1JFRU5fR0FJTl9UT0wpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgbWFpbigpCmRpZmYgLS1naXQgYS9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTEvdGVzdF9hZV9wcmVjYXB0dXJlX3RyaWdnZXIucHkgYi9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTEvdGVzdF9hZV9wcmVjYXB0dXJlX3RyaWdnZXIucHkKaW5kZXggYmI5MWM5YS4uYTYyNmVlNCAxMDA2NDQKLS0tIGEvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmUxL3Rlc3RfYWVfcHJlY2FwdHVyZV90cmlnZ2VyLnB5CisrKyBiL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMS90ZXN0X2FlX3ByZWNhcHR1cmVfdHJpZ2dlci5weQpAQCAtMTgsNyArMTgsNyBAQAogaW1wb3J0IGl0cy50YXJnZXQKIAogQUVfRlJBTUVTX1BFUl9JVEVSQVRJT04gPSA4Ci1BRV9DT05WRVJHRV9JVEVSQVRJT05TID0gMworQUVfQ09OVkVSR0VfSVRFUkFUSU9OUyA9IDUKICMgQUUgbXVzdCBjb252ZXJnZSB3aXRoaW4gdGhpcyBudW1iZXIgb2YgYXV0byByZXF1ZXN0cyB1bmRlciBzY2VuZTEKIFRIUkVTSF9BRV9DT05WRVJHRSA9IEFFX0ZSQU1FU19QRVJfSVRFUkFUSU9OICogQUVfQ09OVkVSR0VfSVRFUkFUSU9OUwogCmRpZmYgLS1naXQgYS9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTEvdGVzdF9hdXRvX3ZzX21hbnVhbC5weSBiL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMS90ZXN0X2F1dG9fdnNfbWFudWFsLnB5CmluZGV4IDg0OWM3MjAuLmE3YjVhZGQgMTAwNjQ0Ci0tLSBhL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMS90ZXN0X2F1dG9fdnNfbWFudWFsLnB5CisrKyBiL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMS90ZXN0X2F1dG9fdnNfbWFudWFsLnB5CkBAIC0xOCw2ICsxOCw3IEBACiBpbXBvcnQgaXRzLm9iamVjdHMKIGltcG9ydCBvcy5wYXRoCiBpbXBvcnQgbWF0aAoraW1wb3J0IG51bXB5IGFzIG5wCiAKIGRlZiBtYWluKCk6CiAgICAgIiIiQ2FwdHVyZSBhdXRvIGFuZCBtYW51YWwgc2hvdHMgdGhhdCBzaG91bGQgbG9vayB0aGUgc2FtZS4KQEAgLTM1LDYgKzM2LDcgQEAKICAgICAgICAgaXRzLmNhcHMuc2tpcF91bmxlc3MoaXRzLmNhcHMubWFudWFsX3NlbnNvcihwcm9wcykgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0cy5jYXBzLm1hbnVhbF9wb3N0X3Byb2MocHJvcHMpIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdHMuY2Fwcy5wZXJfZnJhbWVfY29udHJvbChwcm9wcykpCisgICAgICAgIG1vbm9fY2FtZXJhID0gaXRzLmNhcHMubW9ub19jYW1lcmEocHJvcHMpCiAKICAgICAgICAgIyBDb252ZXJnZSAzQSBhbmQgZ2V0IHRoZSBlc3RpbWF0ZXMuCiAgICAgICAgIGRlYnVnID0gaXRzLmNhcHMuZGVidWdfbW9kZSgpCkBAIC00NCw3ICs0Niw4IEBACiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBtYXRjaF9hciA9IChsYXJnZXN0X3l1dlsnd2lkdGgnXSwgbGFyZ2VzdF95dXZbJ2hlaWdodCddKQogICAgICAgICAgICAgZm10ID0gaXRzLm9iamVjdHMuZ2V0X3NtYWxsZXN0X3l1dl9mb3JtYXQocHJvcHMsIG1hdGNoX2FyPW1hdGNoX2FyKQotICAgICAgICBzZW5zLCBleHAsIGdhaW5zLCB4Zm9ybSwgZm9jdXMgPSBjYW0uZG9fM2EoZ2V0X3Jlc3VsdHM9VHJ1ZSkKKyAgICAgICAgc2VucywgZXhwLCBnYWlucywgeGZvcm0sIGZvY3VzID0gY2FtLmRvXzNhKGdldF9yZXN1bHRzPVRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb25vX2NhbWVyYT1tb25vX2NhbWVyYSkKICAgICAgICAgeGZvcm1fcmF0ID0gaXRzLm9iamVjdHMuZmxvYXRfdG9fcmF0aW9uYWwoeGZvcm0pCiAgICAgICAgIHByaW50ICJBRSBzZW5zaXRpdml0eSAlZCwgZXhwb3N1cmUgJWRtcyIgJSAoc2VucywgZXhwLzEwMDAwMDAuMCkKICAgICAgICAgcHJpbnQgIkFXQiBnYWlucyIsIGdhaW5zCkBAIC03OCw5ICs4MSw4IEBACiAgICAgICAgICMgTWFudWFsIGNhcHR1cmUgMjogV0IgKyB0b25lbWFwCiAgICAgICAgIGdhbW1hID0gc3VtKFtbaS82My4wLG1hdGgucG93KGkvNjMuMCwxLzIuMildIGZvciBpIGluIHhyYW5nZSg2NCldLFtdKQogICAgICAgICByZXFbImFuZHJvaWQudG9uZW1hcC5tb2RlIl0gPSAwCi0gICAgICAgIHJlcVsiYW5kcm9pZC50b25lbWFwLmN1cnZlUmVkIl0gPSBnYW1tYQotICAgICAgICByZXFbImFuZHJvaWQudG9uZW1hcC5jdXJ2ZUdyZWVuIl0gPSBnYW1tYQotICAgICAgICByZXFbImFuZHJvaWQudG9uZW1hcC5jdXJ2ZUJsdWUiXSA9IGdhbW1hCisgICAgICAgIHJlcVsiYW5kcm9pZC50b25lbWFwLmN1cnZlIl0gPSB7CisgICAgICAgICAgICAicmVkIjogZ2FtbWEsICJncmVlbiI6IGdhbW1hLCAiYmx1ZSI6IGdhbW1hfQogICAgICAgICBjYXBfbWFuMiA9IGNhbS5kb19jYXB0dXJlKHJlcSwgZm10KQogICAgICAgICBpbWdfbWFuMiA9IGl0cy5pbWFnZS5jb252ZXJ0X2NhcHR1cmVfdG9fcmdiX2ltYWdlKGNhcF9tYW4yKQogICAgICAgICBpdHMuaW1hZ2Uud3JpdGVfaW1hZ2UoaW1nX21hbjIsICIlc19tYW51YWxfd2JfdG0uanBnIiAlIChOQU1FKSkKQEAgLTkyLDEwICs5NCwxNCBAQAogCiAgICAgICAgICMgQ2hlY2sgdGhhdCB0aGUgV0IgZ2FpbnMgYW5kIHRyYW5zZm9ybSByZXBvcnRlZCBpbiBlYWNoIGNhcHR1cmUKICAgICAgICAgIyByZXN1bHQgbWF0Y2ggd2l0aCB0aGUgb3JpZ2luYWwgQVdCIGVzdGltYXRlIGZyb20gZG9fM2EuCi0gICAgICAgIGZvciBnLHggaW4gWyhnYWluc19hLHhmb3JtX2EpLChnYWluc19tMSx4Zm9ybV9tMSksKGdhaW5zX20yLHhmb3JtX20yKV06CisgICAgICAgIGZvciBnLHggaW4gWyhnYWluc19tMSx4Zm9ybV9tMSksKGdhaW5zX20yLHhmb3JtX20yKV06CiAgICAgICAgICAgICBhc3NlcnQoYWxsKFthYnMoeGZvcm1baV0gLSB4W2ldKSA8IDAuMDUgZm9yIGkgaW4gcmFuZ2UoOSldKSkKICAgICAgICAgICAgIGFzc2VydChhbGwoW2FicyhnYWluc1tpXSAtIGdbaV0pIDwgMC4wNSBmb3IgaSBpbiByYW5nZSg0KV0pKQogCisgICAgICAgICMgQ2hlY2sgdGhhdCBhdXRvIEFXQiBzZXR0aW5ncyBhcmUgY2xvc2UKKyAgICAgICAgYXNzZXJ0KGFsbChbbnAuaXNjbG9zZSh4Zm9ybV9hW2ldLCB4Zm9ybVtpXSwgcnRvbD0wLjI1LCBhdG9sPTAuMSkgZm9yIGkgaW4gcmFuZ2UoOSldKSkKKyAgICAgICAgYXNzZXJ0KGFsbChbbnAuaXNjbG9zZShnYWluc19hW2ldLCBnYWluc1tpXSwgcnRvbD0wLjI1LCBhdG9sPTAuMSkgZm9yIGkgaW4gcmFuZ2UoNCldKSkKKwogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICBtYWluKCkKIApkaWZmIC0tZ2l0IGEvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmUxL3Rlc3RfY2FwdHVyZV9yZXN1bHQucHkgYi9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTEvdGVzdF9jYXB0dXJlX3Jlc3VsdC5weQppbmRleCBlNzk3ZWMwLi5hM2I4MWZhIDEwMDY0NAotLS0gYS9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTEvdGVzdF9jYXB0dXJlX3Jlc3VsdC5weQorKysgYi9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTEvdGVzdF9jYXB0dXJlX3Jlc3VsdC5weQpAQCAtNjMsMjQgKzYzLDIxIEBACiAgICAgICAgICAgICAiYW5kcm9pZC5jb2xvckNvcnJlY3Rpb24udHJhbnNmb3JtIjogbWFudWFsX3RyYW5zZm9ybSwKICAgICAgICAgICAgICJhbmRyb2lkLmNvbG9yQ29ycmVjdGlvbi5nYWlucyI6IG1hbnVhbF9nYWlucywKICAgICAgICAgICAgICJhbmRyb2lkLnRvbmVtYXAubW9kZSI6IDAsCi0gICAgICAgICAgICAiYW5kcm9pZC50b25lbWFwLmN1cnZlUmVkIjogbWFudWFsX3RvbmVtYXAsCi0gICAgICAgICAgICAiYW5kcm9pZC50b25lbWFwLmN1cnZlR3JlZW4iOiBtYW51YWxfdG9uZW1hcCwKLSAgICAgICAgICAgICJhbmRyb2lkLnRvbmVtYXAuY3VydmVCbHVlIjogbWFudWFsX3RvbmVtYXAsCisgICAgICAgICAgICAiYW5kcm9pZC50b25lbWFwLmN1cnZlIjogeyJyZWQiOiBtYW51YWxfdG9uZW1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyZWVuIjogbWFudWFsX3RvbmVtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJibHVlIjogbWFudWFsX3RvbmVtYXB9LAogICAgICAgICAgICAgImFuZHJvaWQuY29udHJvbC5hZVJlZ2lvbnMiOiBtYW51YWxfcmVnaW9uLAogICAgICAgICAgICAgImFuZHJvaWQuY29udHJvbC5hZlJlZ2lvbnMiOiBtYW51YWxfcmVnaW9uLAogICAgICAgICAgICAgImFuZHJvaWQuY29udHJvbC5hd2JSZWdpb25zIjogbWFudWFsX3JlZ2lvbiwKICAgICAgICAgICAgICJhbmRyb2lkLnN0YXRpc3RpY3MubGVuc1NoYWRpbmdNYXBNb2RlIjoxCiAgICAgICAgICAgICB9CiAKLSAgICAgICAgd19tYXAgPSBwcm9wc1siYW5kcm9pZC5sZW5zLmluZm8uc2hhZGluZ01hcFNpemUiXVsid2lkdGgiXQotICAgICAgICBoX21hcCA9IHByb3BzWyJhbmRyb2lkLmxlbnMuaW5mby5zaGFkaW5nTWFwU2l6ZSJdWyJoZWlnaHQiXQotCiAgICAgICAgIHByaW50ICJUZXN0aW5nIGF1dG8gY2FwdHVyZSByZXN1bHRzIgotICAgICAgICBsc2NfbWFwX2F1dG8gPSB0ZXN0X2F1dG8oY2FtLCB3X21hcCwgaF9tYXAsIHByb3BzKQorICAgICAgICBsc2NfbWFwX2F1dG8gPSB0ZXN0X2F1dG8oY2FtLCBwcm9wcykKICAgICAgICAgcHJpbnQgIlRlc3RpbmcgbWFudWFsIGNhcHR1cmUgcmVzdWx0cyIKLSAgICAgICAgdGVzdF9tYW51YWwoY2FtLCB3X21hcCwgaF9tYXAsIGxzY19tYXBfYXV0bywgcHJvcHMpCisgICAgICAgIHRlc3RfbWFudWFsKGNhbSwgbHNjX21hcF9hdXRvLCBwcm9wcykKICAgICAgICAgcHJpbnQgIlRlc3RpbmcgYXV0byBjYXB0dXJlIHJlc3VsdHMgYWdhaW4iCi0gICAgICAgIHRlc3RfYXV0byhjYW0sIHdfbWFwLCBoX21hcCwgcHJvcHMpCisgICAgICAgIHRlc3RfYXV0byhjYW0sIHByb3BzKQogCiAjIEEgdmVyeSBsb29zZSBkZWZpbml0aW9uIGZvciB0d28gZmxvYXRzIGJlaW5nIGNsb3NlIHRvIGVhY2ggb3RoZXI7CiAjIHRoZXJlIG1heSBiZSBkaWZmZXJlbnQgaW50ZXJwb2xhdGlvbiBhbmQgcm91bmRpbmcgdXNlZCB0byBnZXQgdGhlCkBAIC0xMDQsMTEgKzEwMSwxMiBAQAogICAgICAgICBheC5wbG90X3dpcmVmcmFtZSh4cywgeXMsIHpzKQogICAgICAgICBtYXRwbG90bGliLnB5cGxvdC5zYXZlZmlnKCIlc19wbG90X2xzY18lc19jaCVkLnBuZyIlKE5BTUUsbmFtZSxjaCkpCiAKLWRlZiB0ZXN0X2F1dG8oY2FtLCB3X21hcCwgaF9tYXAsIHByb3BzKToKK2RlZiB0ZXN0X2F1dG8oY2FtLCBwcm9wcyk6CiAgICAgIyBHZXQgM0EgbG9jayBmaXJzdCwgc28gdGhlIGF1dG8gdmFsdWVzIGluIHRoZSBjYXB0dXJlIHJlc3VsdCBhcmUKICAgICAjIHBvcHVsYXRlZCBwcm9wZXJseS4KICAgICByZWN0ID0gW1swLDAsMSwxLDFdXQotICAgIGNhbS5kb18zYShyZWN0LCByZWN0LCByZWN0LCBkb19hZj1GYWxzZSkKKyAgICBtb25vX2NhbWVyYSA9IGl0cy5jYXBzLm1vbm9fY2FtZXJhKHByb3BzKQorICAgIGNhbS5kb18zYShyZWN0LCByZWN0LCByZWN0LCBkb19hZj1GYWxzZSwgbW9ub19jYW1lcmE9bW9ub19jYW1lcmEpCiAKICAgICBjYXAgPSBjYW0uZG9fY2FwdHVyZShhdXRvX3JlcSkKICAgICBjYXBfcmVzID0gY2FwWyJtZXRhZGF0YSJdCkBAIC0xMTYsNyArMTE0LDEwIEBACiAgICAgZ2FpbnMgPSBjYXBfcmVzWyJhbmRyb2lkLmNvbG9yQ29ycmVjdGlvbi5nYWlucyJdCiAgICAgdHJhbnNmb3JtID0gY2FwX3Jlc1siYW5kcm9pZC5jb2xvckNvcnJlY3Rpb24udHJhbnNmb3JtIl0KICAgICBleHBfdGltZSA9IGNhcF9yZXNbJ2FuZHJvaWQuc2Vuc29yLmV4cG9zdXJlVGltZSddCi0gICAgbHNjX21hcCA9IGNhcF9yZXNbImFuZHJvaWQuc3RhdGlzdGljcy5sZW5zU2hhZGluZ01hcCJdCisgICAgbHNjX29iaiA9IGNhcF9yZXNbImFuZHJvaWQuc3RhdGlzdGljcy5sZW5zU2hhZGluZ0NvcnJlY3Rpb25NYXAiXQorICAgIGxzY19tYXAgPSBsc2Nfb2JqWyJtYXAiXQorICAgIHdfbWFwID0gbHNjX29ialsid2lkdGgiXQorICAgIGhfbWFwID0gbHNjX29ialsiaGVpZ2h0Il0KICAgICBjdHJsX21vZGUgPSBjYXBfcmVzWyJhbmRyb2lkLmNvbnRyb2wubW9kZSJdCiAKICAgICBwcmludCAiQ29udHJvbCBtb2RlOiIsIGN0cmxfbW9kZQpAQCAtMTU2LDE3ICsxNTcsMjAgQEAKIAogICAgIHJldHVybiBsc2NfbWFwCiAKLWRlZiB0ZXN0X21hbnVhbChjYW0sIHdfbWFwLCBoX21hcCwgbHNjX21hcF9hdXRvLCBwcm9wcyk6CitkZWYgdGVzdF9tYW51YWwoY2FtLCBsc2NfbWFwX2F1dG8sIHByb3BzKToKICAgICBjYXAgPSBjYW0uZG9fY2FwdHVyZShtYW51YWxfcmVxKQogICAgIGNhcF9yZXMgPSBjYXBbIm1ldGFkYXRhIl0KIAogICAgIGdhaW5zID0gY2FwX3Jlc1siYW5kcm9pZC5jb2xvckNvcnJlY3Rpb24uZ2FpbnMiXQogICAgIHRyYW5zZm9ybSA9IGNhcF9yZXNbImFuZHJvaWQuY29sb3JDb3JyZWN0aW9uLnRyYW5zZm9ybSJdCi0gICAgY3VydmVzID0gW2NhcF9yZXNbImFuZHJvaWQudG9uZW1hcC5jdXJ2ZVJlZCJdLAotICAgICAgICAgICAgICBjYXBfcmVzWyJhbmRyb2lkLnRvbmVtYXAuY3VydmVHcmVlbiJdLAotICAgICAgICAgICAgICBjYXBfcmVzWyJhbmRyb2lkLnRvbmVtYXAuY3VydmVCbHVlIl1dCisgICAgY3VydmVzID0gW2NhcF9yZXNbImFuZHJvaWQudG9uZW1hcC5jdXJ2ZSJdWyJyZWQiXSwKKyAgICAgICAgICAgICAgY2FwX3Jlc1siYW5kcm9pZC50b25lbWFwLmN1cnZlIl1bImdyZWVuIl0sCisgICAgICAgICAgICAgIGNhcF9yZXNbImFuZHJvaWQudG9uZW1hcC5jdXJ2ZSJdWyJibHVlIl1dCiAgICAgZXhwX3RpbWUgPSBjYXBfcmVzWydhbmRyb2lkLnNlbnNvci5leHBvc3VyZVRpbWUnXQotICAgIGxzY19tYXAgPSBjYXBfcmVzWyJhbmRyb2lkLnN0YXRpc3RpY3MubGVuc1NoYWRpbmdNYXAiXQorICAgIGxzY19vYmogPSBjYXBfcmVzWyJhbmRyb2lkLnN0YXRpc3RpY3MubGVuc1NoYWRpbmdDb3JyZWN0aW9uTWFwIl0KKyAgICBsc2NfbWFwID0gbHNjX29ialsibWFwIl0KKyAgICB3X21hcCA9IGxzY19vYmpbIndpZHRoIl0KKyAgICBoX21hcCA9IGxzY19vYmpbImhlaWdodCJdCiAgICAgY3RybF9tb2RlID0gY2FwX3Jlc1siYW5kcm9pZC5jb250cm9sLm1vZGUiXQogCiAgICAgcHJpbnQgIkNvbnRyb2wgbW9kZToiLCBjdHJsX21vZGUKZGlmZiAtLWdpdCBhL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMS90ZXN0X2Nyb3BfcmVnaW9uX3Jhdy5weSBiL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMS90ZXN0X2Nyb3BfcmVnaW9uX3Jhdy5weQppbmRleCBmMmQ3ODhlLi4yNmNkYzc0IDEwMDY0NAotLS0gYS9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTEvdGVzdF9jcm9wX3JlZ2lvbl9yYXcucHkKKysrIGIvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmUxL3Rlc3RfY3JvcF9yZWdpb25fcmF3LnB5CkBAIC0xMiwzMCArMTIsMzIgQEAKICMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAotaW1wb3J0IGl0cy5pbWFnZQoraW1wb3J0IG9zLnBhdGgKIGltcG9ydCBpdHMuY2FwcwogaW1wb3J0IGl0cy5kZXZpY2UKK2ltcG9ydCBpdHMuaW1hZ2UKIGltcG9ydCBpdHMub2JqZWN0cwogaW1wb3J0IGl0cy50YXJnZXQKIGltcG9ydCBudW1weQotaW1wb3J0IG9zLnBhdGgKKworQ1JPUF9GVUxMX0VSUk9SX1RIUkVTSE9MRCA9IDMgICMgcGl4ZWxzCitDUk9QX1JFR0lPTl9FUlJPUl9USFJFU0hPTEQgPSAwLjAxICAjIHJlbHRvbAorRElGRl9USFJFU0ggPSAwLjA1ICAjIHJlbHRvbAorTkFNRSA9IG9zLnBhdGguYmFzZW5hbWUoX19maWxlX18pLnNwbGl0KCIuIilbMF0KKwogCiBkZWYgbWFpbigpOgotICAgICIiIlRlc3QgdGhhdCByYXcgc3RyZWFtcyBhcmUgbm90IGNyb3BwYWJsZS4KLSAgICAiIiIKLSAgICBOQU1FID0gb3MucGF0aC5iYXNlbmFtZShfX2ZpbGVfXykuc3BsaXQoIi4iKVswXQotCi0gICAgRElGRl9USFJFU0ggPSAwLjA1Ci0gICAgQ1JPUF9SRUdJT05fRVJST1JfVEhSRVNIT0xEID0gMC4wMQorICAgICIiIlRlc3QgdGhhdCByYXcgc3RyZWFtcyBhcmUgbm90IGNyb3BwYWJsZS4iIiIKIAogICAgIHdpdGggaXRzLmRldmljZS5JdHNTZXNzaW9uKCkgYXMgY2FtOgogICAgICAgICBwcm9wcyA9IGNhbS5nZXRfY2FtZXJhX3Byb3BlcnRpZXMoKQogICAgICAgICBpdHMuY2Fwcy5za2lwX3VubGVzcyhpdHMuY2Fwcy5jb21wdXRlX3RhcmdldF9leHBvc3VyZShwcm9wcykgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0cy5jYXBzLnJhdzE2KHByb3BzKSBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRzLmNhcHMucGVyX2ZyYW1lX2NvbnRyb2wocHJvcHMpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdHMuY2Fwcy5wZXJfZnJhbWVfY29udHJvbChwcm9wcykgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBpdHMuY2Fwcy5tb25vX2NhbWVyYShwcm9wcykpCiAKICAgICAgICAgIyBDYWxjdWxhdGUgdGhlIGFjdGl2ZSBzZW5zb3IgcmVnaW9uIGZvciBhIGZ1bGwgKG5vbi1jcm9wcGVkKSBpbWFnZS4KLSAgICAgICAgYSA9IHByb3BzWydhbmRyb2lkLnNlbnNvci5pbmZvLmFjdGl2ZUFycmF5U2l6ZSddCisgICAgICAgIGEgPSBwcm9wc1siYW5kcm9pZC5zZW5zb3IuaW5mby5hY3RpdmVBcnJheVNpemUiXQogICAgICAgICBheCwgYXkgPSBhWyJsZWZ0Il0sIGFbInRvcCJdCiAgICAgICAgIGF3LCBhaCA9IGFbInJpZ2h0Il0gLSBhWyJsZWZ0Il0sIGFbImJvdHRvbSJdIC0gYVsidG9wIl0KICAgICAgICAgcHJpbnQgIkFjdGl2ZSBzZW5zb3IgcmVnaW9uOiAoJWQsJWQgJWR4JWQpIiAlIChheCwgYXksIGF3LCBhaCkKQEAgLTc4LDEwICs4MCwxMCBAQAogICAgICAgICAjIG5lZWQgdG8gcGVyZmVjdGx5IG1hdGNoIHRoZSBvbmUgdGhhdCB3YXMgcmVxdWVzdGVkLgogICAgICAgICBpbWdzID0ge30KICAgICAgICAgZm9yIHMsIGNhcCwgY3JfZXhwZWN0ZWQsIGVycl9kZWx0YSBpbiBbCi0gICAgICAgICAgICAgICAgKCJ5dXZfZnVsbCIsY2FwMV95dXYsZnVsbF9yZWdpb24sMCksCi0gICAgICAgICAgICAgICAgKCJyYXdfZnVsbCIsY2FwMV9yYXcsZnVsbF9yZWdpb24sMCksCi0gICAgICAgICAgICAgICAgKCJ5dXZfY3JvcCIsY2FwMl95dXYsY3JvcF9yZWdpb24sQ1JPUF9SRUdJT05fRVJST1JfVEhSRVNIT0xEKSwKLSAgICAgICAgICAgICAgICAoInJhd19jcm9wIixjYXAyX3Jhdyxjcm9wX3JlZ2lvbixDUk9QX1JFR0lPTl9FUlJPUl9USFJFU0hPTEQpXToKKyAgICAgICAgICAgICAgICAoInl1dl9mdWxsIiwgY2FwMV95dXYsIGZ1bGxfcmVnaW9uLCBDUk9QX0ZVTExfRVJST1JfVEhSRVNIT0xEKSwKKyAgICAgICAgICAgICAgICAoInJhd19mdWxsIiwgY2FwMV9yYXcsIGZ1bGxfcmVnaW9uLCBDUk9QX0ZVTExfRVJST1JfVEhSRVNIT0xEKSwKKyAgICAgICAgICAgICAgICAoInl1dl9jcm9wIiwgY2FwMl95dXYsIGNyb3BfcmVnaW9uLCBDUk9QX1JFR0lPTl9FUlJPUl9USFJFU0hPTEQpLAorICAgICAgICAgICAgICAgICgicmF3X2Nyb3AiLCBjYXAyX3JhdywgY3JvcF9yZWdpb24sIENST1BfUkVHSU9OX0VSUk9SX1RIUkVTSE9MRCldOgogCiAgICAgICAgICAgICAjIENvbnZlcnQgdGhlIGNhcHR1cmUgdG8gUkdCIGFuZCBkdW1wIHRvIGEgZmlsZS4KICAgICAgICAgICAgIGltZyA9IGl0cy5pbWFnZS5jb252ZXJ0X2NhcHR1cmVfdG9fcmdiX2ltYWdlKGNhcCwgcHJvcHM9cHJvcHMpCmRpZmYgLS1naXQgYS9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTEvdGVzdF9kbmdfbm9pc2VfbW9kZWwucHkgYi9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTEvdGVzdF9kbmdfbm9pc2VfbW9kZWwucHkKaW5kZXggNTM4ZTc4Ni4uYzQ0N2FlNSAxMDA2NDQKLS0tIGEvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmUxL3Rlc3RfZG5nX25vaXNlX21vZGVsLnB5CisrKyBiL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMS90ZXN0X2RuZ19ub2lzZV9tb2RlbC5weQpAQCAtNDUsMTUgKzQ1LDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0cy5jYXBzLnJhdzE2KHByb3BzKSBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRzLmNhcHMubWFudWFsX3NlbnNvcihwcm9wcykgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0cy5jYXBzLnJlYWRfM2EocHJvcHMpIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdHMuY2Fwcy5wZXJfZnJhbWVfY29udHJvbChwcm9wcykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0cy5jYXBzLnBlcl9mcmFtZV9jb250cm9sKHByb3BzKSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGl0cy5jYXBzLm1vbm9fY2FtZXJhKHByb3BzKSkKICAgICAgICAgZGVidWcgPSBpdHMuY2Fwcy5kZWJ1Z19tb2RlKCkKIAogICAgICAgICB3aGl0ZV9sZXZlbCA9IGZsb2F0KHByb3BzWydhbmRyb2lkLnNlbnNvci5pbmZvLndoaXRlTGV2ZWwnXSkKICAgICAgICAgY2ZhX2lkeHMgPSBpdHMuaW1hZ2UuZ2V0X2Nhbm9uaWNhbF9jZmFfb3JkZXIocHJvcHMpCi0gICAgICAgIGFheCA9IHByb3BzWydhbmRyb2lkLnNlbnNvci5pbmZvLmFjdGl2ZUFycmF5U2l6ZSddWydsZWZ0J10KLSAgICAgICAgYWF5ID0gcHJvcHNbJ2FuZHJvaWQuc2Vuc29yLmluZm8uYWN0aXZlQXJyYXlTaXplJ11bJ3RvcCddCi0gICAgICAgIGFhdyA9IHByb3BzWydhbmRyb2lkLnNlbnNvci5pbmZvLmFjdGl2ZUFycmF5U2l6ZSddWydyaWdodCddLWFheAotICAgICAgICBhYWggPSBwcm9wc1snYW5kcm9pZC5zZW5zb3IuaW5mby5hY3RpdmVBcnJheVNpemUnXVsnYm90dG9tJ10tYWF5CisgICAgICAgIGFheCA9IHByb3BzWydhbmRyb2lkLnNlbnNvci5pbmZvLnByZUNvcnJlY3Rpb25BY3RpdmVBcnJheVNpemUnXVsnbGVmdCddCisgICAgICAgIGFheSA9IHByb3BzWydhbmRyb2lkLnNlbnNvci5pbmZvLnByZUNvcnJlY3Rpb25BY3RpdmVBcnJheVNpemUnXVsndG9wJ10KKyAgICAgICAgYWF3ID0gcHJvcHNbJ2FuZHJvaWQuc2Vuc29yLmluZm8ucHJlQ29ycmVjdGlvbkFjdGl2ZUFycmF5U2l6ZSddWydyaWdodCddLWFheAorICAgICAgICBhYWggPSBwcm9wc1snYW5kcm9pZC5zZW5zb3IuaW5mby5wcmVDb3JyZWN0aW9uQWN0aXZlQXJyYXlTaXplJ11bJ2JvdHRvbSddLWFheQogCiAgICAgICAgICMgRXhwb3NlIGZvciB0aGUgc2NlbmUgd2l0aCBtaW4gc2Vuc2l0aXZpdHkKICAgICAgICAgc2Vuc19taW4sIHNlbnNfbWF4ID0gcHJvcHNbJ2FuZHJvaWQuc2Vuc29yLmluZm8uc2Vuc2l0aXZpdHlSYW5nZSddCmRpZmYgLS1naXQgYS9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTEvdGVzdF9ldl9jb21wZW5zYXRpb25fYWR2YW5jZWQucHkgYi9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTEvdGVzdF9ldl9jb21wZW5zYXRpb25fYWR2YW5jZWQucHkKaW5kZXggYTM2MDVmNi4uZDA4N2FiMSAxMDA2NDQKLS0tIGEvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmUxL3Rlc3RfZXZfY29tcGVuc2F0aW9uX2FkdmFuY2VkLnB5CisrKyBiL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMS90ZXN0X2V2X2NvbXBlbnNhdGlvbl9hZHZhbmNlZC5weQpAQCAtNDEsNiArNDEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdHMuY2Fwcy5wZXJfZnJhbWVfY29udHJvbChwcm9wcykgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0cy5jYXBzLmV2X2NvbXBlbnNhdGlvbihwcm9wcykpCiAKKyAgICAgICAgbW9ub19jYW1lcmEgPSBpdHMuY2Fwcy5tb25vX2NhbWVyYShwcm9wcykKICAgICAgICAgZGVidWcgPSBpdHMuY2Fwcy5kZWJ1Z19tb2RlKCkKICAgICAgICAgbGFyZ2VzdF95dXYgPSBpdHMub2JqZWN0cy5nZXRfbGFyZ2VzdF95dXZfZm9ybWF0KHByb3BzKQogICAgICAgICBpZiBkZWJ1ZzoKQEAgLTYzLDIwICs2NCwyMSBAQAogICAgICAgICAjIENvbnZlcmdlIDNBLCBhbmQgbG9jayBBRSBvbmNlIGNvbnZlcmdlZC4gc2tpcCBBRiB0cmlnZ2VyIGFzCiAgICAgICAgICMgZGFyay9icmlnaHQgc2NlbmUgY291bGQgbWFrZSBBRiBjb252ZXJnZW5jZSBmYWlsIGFuZCB0aGlzIHRlc3QKICAgICAgICAgIyBkb2Vzbid0IGNhcmUgdGhlIGltYWdlIHNoYXJwbmVzcy4KLSAgICAgICAgY2FtLmRvXzNhKGV2X2NvbXA9MCwgbG9ja19hZT1UcnVlLCBkb19hZj1GYWxzZSkKKyAgICAgICAgY2FtLmRvXzNhKGV2X2NvbXA9MCwgbG9ja19hZT1UcnVlLCBkb19hZj1GYWxzZSwgbW9ub19jYW1lcmE9bW9ub19jYW1lcmEpCiAKICAgICAgICAgZm9yIGV2IGluIGV2X3N0ZXBzOgogCiAgICAgICAgICAgICAjIENhcHR1cmUgYSBzaW5nbGUgc2hvdCB3aXRoIHRoZSBzYW1lIEVWIGNvbXAgYW5kIGxvY2tlZCBBRS4KICAgICAgICAgICAgIHJlcSA9IGl0cy5vYmplY3RzLmF1dG9fY2FwdHVyZV9yZXF1ZXN0KCkKICAgICAgICAgICAgIHJlcVsnYW5kcm9pZC5jb250cm9sLmFlRXhwb3N1cmVDb21wZW5zYXRpb24nXSA9IGV2Ci0gICAgICAgICAgICByZXFbImFuZHJvaWQuY29udHJvbC5hZUxvY2siXSA9IFRydWUKKyAgICAgICAgICAgIHJlcVsnYW5kcm9pZC5jb250cm9sLmFlTG9jayddID0gVHJ1ZQogICAgICAgICAgICAgIyBVc2UgbGluZWFyIHRvbmUgY3VydmUgdG8gYXZvaWQgYnJpZ2h0bmVzcyBiZWluZyBpbXBhY3RlZAogICAgICAgICAgICAgIyBieSB0b25lIGN1cnZlcy4KLSAgICAgICAgICAgIHJlcVsiYW5kcm9pZC50b25lbWFwLm1vZGUiXSA9IDAKLSAgICAgICAgICAgIHJlcVsiYW5kcm9pZC50b25lbWFwLmN1cnZlUmVkIl0gPSBbMC4wLDAuMCwgMS4wLDEuMF0KLSAgICAgICAgICAgIHJlcVsiYW5kcm9pZC50b25lbWFwLmN1cnZlR3JlZW4iXSA9IFswLjAsMC4wLCAxLjAsMS4wXQotICAgICAgICAgICAgcmVxWyJhbmRyb2lkLnRvbmVtYXAuY3VydmVCbHVlIl0gPSBbMC4wLDAuMCwgMS4wLDEuMF0KKyAgICAgICAgICAgIHJlcVsnYW5kcm9pZC50b25lbWFwLm1vZGUnXSA9IDAKKyAgICAgICAgICAgIHJlcVsnYW5kcm9pZC50b25lbWFwLmN1cnZlJ10gPSB7CisgICAgICAgICAgICAgICAgJ3JlZCc6IFswLjAsMC4wLCAxLjAsMS4wXSwKKyAgICAgICAgICAgICAgICAnZ3JlZW4nOiBbMC4wLDAuMCwgMS4wLDEuMF0sCisgICAgICAgICAgICAgICAgJ2JsdWUnOiBbMC4wLDAuMCwgMS4wLDEuMF19CiAgICAgICAgICAgICBjYXBzID0gY2FtLmRvX2NhcHR1cmUoW3JlcV0qVEhSRUFTSF9DT05WRVJHRV9GT1JfRVYsIGZtdCkKIAogICAgICAgICAgICAgZm9yIGNhcCBpbiBjYXBzOgpkaWZmIC0tZ2l0IGEvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmUxL3Rlc3RfZXZfY29tcGVuc2F0aW9uX2Jhc2ljLnB5IGIvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmUxL3Rlc3RfZXZfY29tcGVuc2F0aW9uX2Jhc2ljLnB5CmluZGV4IDQ0NzNiYzcuLjMyZTUwMDEgMTAwNjQ0Ci0tLSBhL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMS90ZXN0X2V2X2NvbXBlbnNhdGlvbl9iYXNpYy5weQorKysgYi9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTEvdGVzdF9ldl9jb21wZW5zYXRpb25fYmFzaWMucHkKQEAgLTQwLDYgKzQwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRzLmNhcHMuYWVfbG9jayhwcm9wcykpCiAKICAgICAgICAgZGVidWcgPSBpdHMuY2Fwcy5kZWJ1Z19tb2RlKCkKKyAgICAgICAgbW9ub19jYW1lcmEgPSBpdHMuY2Fwcy5tb25vX2NhbWVyYShwcm9wcykKICAgICAgICAgbGFyZ2VzdF95dXYgPSBpdHMub2JqZWN0cy5nZXRfbGFyZ2VzdF95dXZfZm9ybWF0KHByb3BzKQogICAgICAgICBpZiBkZWJ1ZzoKICAgICAgICAgICAgIGZtdCA9IGxhcmdlc3RfeXV2CkBAIC01OSw3ICs2MCw3IEBACiAgICAgICAgICMgQ29udmVyZ2UgM0EsIGFuZCBsb2NrIEFFIG9uY2UgY29udmVyZ2VkLiBza2lwIEFGIHRyaWdnZXIgYXMKICAgICAgICAgIyBkYXJrL2JyaWdodCBzY2VuZSBjb3VsZCBtYWtlIEFGIGNvbnZlcmdlbmNlIGZhaWwgYW5kIHRoaXMgdGVzdAogICAgICAgICAjIGRvZXNuJ3QgY2FyZSB0aGUgaW1hZ2Ugc2hhcnBuZXNzLgotICAgICAgICBjYW0uZG9fM2EoZXZfY29tcD0wLCBsb2NrX2FlPVRydWUsIGRvX2FmPUZhbHNlKQorICAgICAgICBjYW0uZG9fM2EoZXZfY29tcD0wLCBsb2NrX2FlPVRydWUsIGRvX2FmPUZhbHNlLCBtb25vX2NhbWVyYT1tb25vX2NhbWVyYSkKIAogICAgICAgICBmb3IgZXYgaW4gZXZzOgogICAgICAgICAgICAgIyBDYXB0dXJlIGEgc2luZ2xlIHNob3Qgd2l0aCB0aGUgc2FtZSBFViBjb21wIGFuZCBsb2NrZWQgQUUuCmRpZmYgLS1naXQgYS9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTEvdGVzdF9leHBvc3VyZS5weSBiL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMS90ZXN0X2V4cG9zdXJlLnB5CmluZGV4IGVjNDFiY2QuLmNhYzQ5ZDAgMTAwNjQ0Ci0tLSBhL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMS90ZXN0X2V4cG9zdXJlLnB5CisrKyBiL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMS90ZXN0X2V4cG9zdXJlLnB5CkBAIC0zMCwxNiArMzAsMTggQEAKIFRIUkVTSE9MRF9NQVhfTEVWRUwgPSAwLjkKIFRIUkVTSE9MRF9NQVhfTEVWRUxfRElGRiA9IDAuMDQ1CiBUSFJFU0hPTERfTUFYX0xFVkVMX0RJRkZfV0lERV9SQU5HRSA9IDAuMDYKLVRIUkVTSE9MRF9ST1VORF9ET1dOX0dBSU4gPSAwLjEKLVRIUkVTSE9MRF9ST1VORF9ET1dOX0VYUCA9IDAuMDUKK1RIUkVTSF9ST1VORF9ET1dOX0dBSU4gPSAwLjEKK1RIUkVTSF9ST1VORF9ET1dOX0VYUCA9IDAuMDMKK1RIUkVTSF9ST1VORF9ET1dOX0VYUDAgPSAxLjAwICAjIHRvbCBhdCAwbXMgZXhwOyB0aGVvcmV0aWNhbCBsaW1pdCBAIDQtbGluZSBleHAKK1RIUkVTSF9FWFBfS05FRSA9IDZFNiAgIyBleHBvc3VyZXMgbGVzcyB0aGFuIGtuZWUgaGF2ZSByZWxheGVkIHRvbAogCiAKIGRlZiBnZXRfcmF3X2FjdGl2ZV9hcnJheV9zaXplKHByb3BzKToKICAgICAiIiJSZXR1cm4gdGhlIGFjdGl2ZSBhcnJheSB3LCBoIGZyb20gcHJvcHMuIiIiCi0gICAgYWF3ID0gKHByb3BzWydhbmRyb2lkLnNlbnNvci5pbmZvLmFjdGl2ZUFycmF5U2l6ZSddWydyaWdodCddIC0KLSAgICAgICAgICAgcHJvcHNbJ2FuZHJvaWQuc2Vuc29yLmluZm8uYWN0aXZlQXJyYXlTaXplJ11bJ2xlZnQnXSkKLSAgICBhYWggPSAocHJvcHNbJ2FuZHJvaWQuc2Vuc29yLmluZm8uYWN0aXZlQXJyYXlTaXplJ11bJ2JvdHRvbSddIC0KLSAgICAgICAgICAgcHJvcHNbJ2FuZHJvaWQuc2Vuc29yLmluZm8uYWN0aXZlQXJyYXlTaXplJ11bJ3RvcCddKQorICAgIGFhdyA9IChwcm9wc1snYW5kcm9pZC5zZW5zb3IuaW5mby5wcmVDb3JyZWN0aW9uQWN0aXZlQXJyYXlTaXplJ11bJ3JpZ2h0J10gLQorICAgICAgICAgICBwcm9wc1snYW5kcm9pZC5zZW5zb3IuaW5mby5wcmVDb3JyZWN0aW9uQWN0aXZlQXJyYXlTaXplJ11bJ2xlZnQnXSkKKyAgICBhYWggPSAocHJvcHNbJ2FuZHJvaWQuc2Vuc29yLmluZm8ucHJlQ29ycmVjdGlvbkFjdGl2ZUFycmF5U2l6ZSddWydib3R0b20nXSAtCisgICAgICAgICAgIHByb3BzWydhbmRyb2lkLnNlbnNvci5pbmZvLnByZUNvcnJlY3Rpb25BY3RpdmVBcnJheVNpemUnXVsndG9wJ10pCiAgICAgcmV0dXJuIGFhdywgYWFoCiAKIApAQCAtNjUsOSArNjcsNyBAQAogICAgICAgICBpdHMuY2Fwcy5za2lwX3VubGVzcyhpdHMuY2Fwcy5jb21wdXRlX3RhcmdldF9leHBvc3VyZShwcm9wcykgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0cy5jYXBzLnBlcl9mcmFtZV9jb250cm9sKHByb3BzKSkKIAotICAgICAgICBwcm9jZXNzX3JhdyA9IChpdHMuY2Fwcy5jb21wdXRlX3RhcmdldF9leHBvc3VyZShwcm9wcykgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgIGl0cy5jYXBzLnBlcl9mcmFtZV9jb250cm9sKHByb3BzKSBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgaXRzLmNhcHMucmF3MTYocHJvcHMpIGFuZAorICAgICAgICBwcm9jZXNzX3JhdyA9IChpdHMuY2Fwcy5yYXcxNihwcm9wcykgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgIGl0cy5jYXBzLm1hbnVhbF9zZW5zb3IocHJvcHMpKQogCiAgICAgICAgIGRlYnVnID0gaXRzLmNhcHMuZGVidWdfbW9kZSgpCkBAIC05MCwxNSArOTAsMjcgQEAKICAgICAgICAgICAgIGVfdGVzdCA9IHNfZV9wcm9kdWN0IC8gc190ZXN0CiAgICAgICAgICAgICBwcmludCAnVGVzdGluZyBzOicsIHNfdGVzdCwgJ2U6JywgZV90ZXN0CiAgICAgICAgICAgICByZXEgPSBpdHMub2JqZWN0cy5tYW51YWxfY2FwdHVyZV9yZXF1ZXN0KAotICAgICAgICAgICAgICAgIHNfdGVzdCwgZV90ZXN0LCAwLjAsIFRydWUsIHByb3BzKQorICAgICAgICAgICAgICAgICAgICBzX3Rlc3QsIGVfdGVzdCwgMC4wLCBUcnVlLCBwcm9wcykKICAgICAgICAgICAgIGNhcCA9IGNhbS5kb19jYXB0dXJlKHJlcSwgZm10KQogICAgICAgICAgICAgc19yZXMgPSBjYXBbJ21ldGFkYXRhJ11bJ2FuZHJvaWQuc2Vuc29yLnNlbnNpdGl2aXR5J10KICAgICAgICAgICAgIGVfcmVzID0gY2FwWydtZXRhZGF0YSddWydhbmRyb2lkLnNlbnNvci5leHBvc3VyZVRpbWUnXQotICAgICAgICAgICAgYXNzZXJ0IDAgPD0gc190ZXN0IC0gc19yZXMgPCBzX3Rlc3QgKiBUSFJFU0hPTERfUk9VTkRfRE9XTl9HQUlOCi0gICAgICAgICAgICBhc3NlcnQgMCA8PSBlX3Rlc3QgLSBlX3JlcyA8IGVfdGVzdCAqIFRIUkVTSE9MRF9ST1VORF9ET1dOX0VYUAorICAgICAgICAgICAgIyBkZXRlcm1pbmUgZXhwb3N1cmUgdG9sZXJhbmNlIGJhc2VkIG9uIGV4cG9zdXJlIHRpbWUKKyAgICAgICAgICAgIGlmIGVfdGVzdCA+PSBUSFJFU0hfRVhQX0tORUU6CisgICAgICAgICAgICAgICAgdGhyZXNoX3JvdW5kX2Rvd25fZXhwID0gVEhSRVNIX1JPVU5EX0RPV05fRVhQCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHRocmVzaF9yb3VuZF9kb3duX2V4cCA9ICgKKyAgICAgICAgICAgICAgICAgICAgICAgIFRIUkVTSF9ST1VORF9ET1dOX0VYUCArCisgICAgICAgICAgICAgICAgICAgICAgICAoVEhSRVNIX1JPVU5EX0RPV05fRVhQMCAtIFRIUkVTSF9ST1VORF9ET1dOX0VYUCkgKgorICAgICAgICAgICAgICAgICAgICAgICAgKFRIUkVTSF9FWFBfS05FRSAtIGVfdGVzdCkgLyBUSFJFU0hfRVhQX0tORUUpCisgICAgICAgICAgICBzX21zZyA9ICdzX3dyaXRlOiAlZCwgc19yZWFkOiAlZCwgVE9MPSUuZiUlJyAlICgKKyAgICAgICAgICAgICAgICAgICAgc190ZXN0LCBzX3JlcywgVEhSRVNIX1JPVU5EX0RPV05fR0FJTioxMDApCisgICAgICAgICAgICBlX21zZyA9ICdlX3dyaXRlOiAlLjJmbXMsIGVfcmVhZDogJS4yZm1zLCBUT0w9JS5mJSUnICUgKAorICAgICAgICAgICAgICAgICAgICBlX3Rlc3QvMS4wRTYsIGVfcmVzLzEuMEU2LCB0aHJlc2hfcm91bmRfZG93bl9leHAqMTAwKQorICAgICAgICAgICAgYXNzZXJ0IDAgPD0gc190ZXN0IC0gc19yZXMgPCBzX3Rlc3QgKiBUSFJFU0hfUk9VTkRfRE9XTl9HQUlOLCBzX21zZworICAgICAgICAgICAgYXNzZXJ0IDAgPD0gZV90ZXN0IC0gZV9yZXMgPCBlX3Rlc3QgKiB0aHJlc2hfcm91bmRfZG93bl9leHAsIGVfbXNnCiAgICAgICAgICAgICBzX2VfcHJvZHVjdF9yZXMgPSBzX3JlcyAqIGVfcmVzCiAgICAgICAgICAgICByZXF1ZXN0X3Jlc3VsdF9yYXRpbyA9IHNfZV9wcm9kdWN0IC8gc19lX3Byb2R1Y3RfcmVzCi0gICAgICAgICAgICBwcmludCAnQ2FwdHVyZSByZXN1bHQgczonLCBzX3Rlc3QsICdlOicsIGVfdGVzdAorICAgICAgICAgICAgcHJpbnQgJ0NhcHR1cmUgcmVzdWx0IHM6Jywgc19yZXMsICdlOicsIGVfcmVzCiAgICAgICAgICAgICBpbWcgPSBpdHMuaW1hZ2UuY29udmVydF9jYXB0dXJlX3RvX3JnYl9pbWFnZShjYXApCiAgICAgICAgICAgICBpdHMuaW1hZ2Uud3JpdGVfaW1hZ2UoaW1nLCAnJXNfbXVsdD0lMy4yZi5qcGcnICUgKE5BTUUsIG0pKQogICAgICAgICAgICAgdGlsZSA9IGl0cy5pbWFnZS5nZXRfaW1hZ2VfcGF0Y2goaW1nLCAwLjQ1LCAwLjQ1LCAwLjEsIDAuMSkKZGlmZiAtLWdpdCBhL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMS90ZXN0X2xpbmVhcml0eS5weSBiL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMS90ZXN0X2xpbmVhcml0eS5weQppbmRleCAzNTA2OGE4Li4xZjRhYTE0IDEwMDY0NAotLS0gYS9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTEvdGVzdF9saW5lYXJpdHkucHkKKysrIGIvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmUxL3Rlc3RfbGluZWFyaXR5LnB5CkBAIC02Nyw5ICs2NywxMCBAQAogICAgICAgICByZXEgPSBpdHMub2JqZWN0cy5tYW51YWxfY2FwdHVyZV9yZXF1ZXN0KDAsIGUpCiAgICAgICAgIHJlcVsnYW5kcm9pZC5ibGFja0xldmVsLmxvY2snXSA9IFRydWUKICAgICAgICAgcmVxWydhbmRyb2lkLnRvbmVtYXAubW9kZSddID0gMAotICAgICAgICByZXFbJ2FuZHJvaWQudG9uZW1hcC5jdXJ2ZVJlZCddID0gZ2FtbWFfbHV0LnRvbGlzdCgpCi0gICAgICAgIHJlcVsnYW5kcm9pZC50b25lbWFwLmN1cnZlR3JlZW4nXSA9IGdhbW1hX2x1dC50b2xpc3QoKQotICAgICAgICByZXFbJ2FuZHJvaWQudG9uZW1hcC5jdXJ2ZUJsdWUnXSA9IGdhbW1hX2x1dC50b2xpc3QoKQorICAgICAgICByZXFbJ2FuZHJvaWQudG9uZW1hcC5jdXJ2ZSddID0geworICAgICAgICAgICAgJ3JlZCc6IGdhbW1hX2x1dC50b2xpc3QoKSwKKyAgICAgICAgICAgICdncmVlbic6IGdhbW1hX2x1dC50b2xpc3QoKSwKKyAgICAgICAgICAgICdibHVlJzogZ2FtbWFfbHV0LnRvbGlzdCgpfQogCiAgICAgICAgIHJfbWVhbnMgPSBbXQogICAgICAgICBnX21lYW5zID0gW10KZGlmZiAtLWdpdCBhL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMS90ZXN0X2xvY2tlZF9idXJzdC5weSBiL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMS90ZXN0X2xvY2tlZF9idXJzdC5weQppbmRleCA0N2EwMTg2Li5iZWZiYmVkIDEwMDY0NAotLS0gYS9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTEvdGVzdF9sb2NrZWRfYnVyc3QucHkKKysrIGIvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmUxL3Rlc3RfbG9ja2VkX2J1cnN0LnB5CkBAIC00MCw5ICs0MCwxMSBAQAogICAgICAgICBwcm9wcyA9IGNhbS5nZXRfY2FtZXJhX3Byb3BlcnRpZXMoKQogICAgICAgICBpdHMuY2Fwcy5za2lwX3VubGVzcyhpdHMuY2Fwcy5hZV9sb2NrKHByb3BzKSBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRzLmNhcHMuYXdiX2xvY2socHJvcHMpKQorICAgICAgICBtb25vX2NhbWVyYSA9IGl0cy5jYXBzLm1vbm9fY2FtZXJhKHByb3BzKQogCiAgICAgICAgICMgQ29udmVyZ2UgM0EgcHJpb3IgdG8gY2FwdHVyZS4KLSAgICAgICAgY2FtLmRvXzNhKGRvX2FmPVRydWUsIGxvY2tfYWU9VHJ1ZSwgbG9ja19hd2I9VHJ1ZSkKKyAgICAgICAgY2FtLmRvXzNhKGRvX2FmPVRydWUsIGxvY2tfYWU9VHJ1ZSwgbG9ja19hd2I9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgIG1vbm9fY2FtZXJhPW1vbm9fY2FtZXJhKQogCiAgICAgICAgIGZtdCA9IGl0cy5vYmplY3RzLmdldF9sYXJnZXN0X3l1dl9mb3JtYXQocHJvcHMpCiAKZGlmZiAtLWdpdCBhL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMS90ZXN0X211bHRpX2NhbWVyYV9tYXRjaC5weSBiL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMS90ZXN0X211bHRpX2NhbWVyYV9tYXRjaC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWJkNjNjCi0tLSAvZGV2L251bGwKKysrIGIvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmUxL3Rlc3RfbXVsdGlfY2FtZXJhX21hdGNoLnB5CkBAIC0wLDAgKzEsOTUgQEAKKyMgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworaW1wb3J0IG9zLnBhdGgKKworaW1wb3J0IGl0cy5jYXBzCitpbXBvcnQgaXRzLmRldmljZQoraW1wb3J0IGl0cy5pbWFnZQoraW1wb3J0IGl0cy5vYmplY3RzCitpbXBvcnQgaXRzLnRhcmdldAorCitpbXBvcnQgbnVtcHkgYXMgbnAKK05BTUUgPSBvcy5wYXRoLmJhc2VuYW1lKF9fZmlsZV9fKS5zcGxpdCgnLicpWzBdCitQQVRDSF9TSVpFID0gMC4wNjI1ICAjIDEvMTYgeCAxLzE2IGluIGNlbnRlciBvZiBpbWFnZQorUEFUQ0hfTE9DID0gKDEtUEFUQ0hfU0laRSkvMgorVEhSRVNIX0RJRkYgPSAwLjA2CitUSFJFU0hfR0FJTiA9IDAuMQorVEhSRVNIX0VYUCA9IDAuMDUKKworCitkZWYgbWFpbigpOgorICAgICIiIlRlc3QgYm90aCBjYW1lcmFzIGdpdmUgc2ltaWxhciBSQkcgdmFsdWVzIGZvciBncmF5IHBhdGNoLiIiIgorCisgICAgeXV2X3NpemVzID0ge30KKyAgICB3aXRoIGl0cy5kZXZpY2UuSXRzU2Vzc2lvbigpIGFzIGNhbToKKyAgICAgICAgcHJvcHMgPSBjYW0uZ2V0X2NhbWVyYV9wcm9wZXJ0aWVzKCkKKyAgICAgICAgaXRzLmNhcHMuc2tpcF91bmxlc3MoaXRzLmNhcHMuY29tcHV0ZV90YXJnZXRfZXhwb3N1cmUocHJvcHMpIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdHMuY2Fwcy5wZXJfZnJhbWVfY29udHJvbChwcm9wcykgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0cy5jYXBzLmxvZ2ljYWxfbXVsdGlfY2FtZXJhKHByb3BzKSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRzLmNhcHMucmF3MTYocHJvcHMpIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdHMuY2Fwcy5tYW51YWxfc2Vuc29yKHByb3BzKSkKKyAgICAgICAgaWRzID0gaXRzLmNhcHMubG9naWNhbF9tdWx0aV9jYW1lcmFfcGh5c2ljYWxfaWRzKHByb3BzKQorICAgICAgICBtYXhfcmF3X3NpemUgPSBpdHMub2JqZWN0cy5nZXRfYXZhaWxhYmxlX291dHB1dF9zaXplcygncmF3JywgcHJvcHMpWzBdCisgICAgICAgIGZvciBpIGluIGlkczoKKyAgICAgICAgICAgIHBoeXNpY2FsX3Byb3BzID0gY2FtLmdldF9jYW1lcmFfcHJvcGVydGllc19ieV9pZChpKQorICAgICAgICAgICAgaXRzLmNhcHMuc2tpcF91bmxlc3Mobm90IGl0cy5jYXBzLm1vbm9fY2FtZXJhKHBoeXNpY2FsX3Byb3BzKSkKKyAgICAgICAgICAgIHl1dl9zaXplc1tpXSA9IGl0cy5vYmplY3RzLmdldF9hdmFpbGFibGVfb3V0cHV0X3NpemVzKAorICAgICAgICAgICAgICAgICAgICAneXV2JywgcGh5c2ljYWxfcHJvcHMsIG1hdGNoX2FyX3NpemU9bWF4X3Jhd19zaXplKQorICAgICAgICAgICAgaWYgaSA9PSBpZHNbMF06CisgICAgICAgICAgICAgICAgeXV2X21hdGNoX3NpemVzID0geXV2X3NpemVzW2ldCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGxpc3Qoc2V0KHl1dl9zaXplc1tpXSkuaW50ZXJzZWN0aW9uKHl1dl9tYXRjaF9zaXplcykpCisKKyAgICAgICAgIyBmaW5kIG1hdGNoZWQgc2l6ZSBmb3IgY2FwdHVyZXMKKyAgICAgICAgeXV2X21hdGNoX3NpemVzLnNvcnQoKQorICAgICAgICB3ID0geXV2X21hdGNoX3NpemVzWy0xXVswXQorICAgICAgICBoID0geXV2X21hdGNoX3NpemVzWy0xXVsxXQorICAgICAgICBwcmludCAnTWF0Y2hlZCBZVVYgc2l6ZTogKCVkLCAlZCknICUgKHcsIGgpCisKKyAgICAgICAgIyBkbyAzYSBhbmQgY3JlYXRlIHJlcXVlc3RzCisgICAgICAgIGF2YWlsX2ZscyA9IHByb3BzWydhbmRyb2lkLmxlbnMuaW5mby5hdmFpbGFibGVGb2NhbExlbmd0aHMnXQorICAgICAgICBjYW0uZG9fM2EoKQorICAgICAgICByZXFzID0gW10KKyAgICAgICAgZm9yIGksIGZsIGluIGVudW1lcmF0ZShhdmFpbF9mbHMpOgorICAgICAgICAgICAgcmVxcy5hcHBlbmQoaXRzLm9iamVjdHMuYXV0b19jYXB0dXJlX3JlcXVlc3QoKSkKKyAgICAgICAgICAgIHJlcXNbaV1bJ2FuZHJvaWQubGVucy5mb2NhbExlbmd0aCddID0gZmwKKworICAgICAgICAjIGNhcHR1cmUgWVVWcworICAgICAgICB5X21lYW5zID0ge30KKyAgICAgICAgbXNnID0gJycKKyAgICAgICAgZm10ID0gW3snZm9ybWF0JzogJ3l1dicsICd3aWR0aCc6IHcsICdoZWlnaHQnOiBofV0KKyAgICAgICAgY2FwcyA9IGNhbS5kb19jYXB0dXJlKHJlcXMsIGZtdCkKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoY2FwcywgbGlzdCk6CisgICAgICAgICAgICBjYXBzID0gW2NhcHNdICAjIGhhbmRsZSBjYW5vbmljYWwgY2FzZSB3aGVyZSBjYXBzIGlzIG5vdCBsaXN0CisKKyAgICAgICAgZm9yIGksIGZsIGluIGVudW1lcmF0ZShhdmFpbF9mbHMpOgorICAgICAgICAgICAgaW1nID0gaXRzLmltYWdlLmNvbnZlcnRfY2FwdHVyZV90b19yZ2JfaW1hZ2UoY2Fwc1tpXSwgcHJvcHM9cHJvcHMpCisgICAgICAgICAgICBpdHMuaW1hZ2Uud3JpdGVfaW1hZ2UoaW1nLCAnJXNfeXV2X2ZsPSVzLmpwZycgJSAoTkFNRSwgZmwpKQorICAgICAgICAgICAgeSwgXywgXyA9IGl0cy5pbWFnZS5jb252ZXJ0X2NhcHR1cmVfdG9fcGxhbmVzKGNhcHNbaV0sIHByb3BzPXByb3BzKQorICAgICAgICAgICAgeV9tZWFuID0gaXRzLmltYWdlLmNvbXB1dGVfaW1hZ2VfbWVhbnMoCisgICAgICAgICAgICAgICAgICAgIGl0cy5pbWFnZS5nZXRfaW1hZ2VfcGF0Y2goeSwgUEFUQ0hfTE9DLCBQQVRDSF9MT0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFUQ0hfU0laRSwgUEFUQ0hfU0laRSkpWzBdCisgICAgICAgICAgICBwcmludCAneVslc106ICUuM2YnICUgKGZsLCB5X21lYW4pCisgICAgICAgICAgICBtc2cgKz0gJ3lbJXNdOiAlLjNmLCAnICUgKGZsLCB5X21lYW4pCisgICAgICAgICAgICB5X21lYW5zW2ZsXSA9IHlfbWVhbgorCisgICAgICAgICMgY29tcGFyZSBZVVZzCisgICAgICAgIG1zZyArPSAnVE9MPSUuNWYnICUgVEhSRVNIX0RJRkYKKyAgICAgICAgYXNzZXJ0IG5wLmlzY2xvc2UobWF4KHlfbWVhbnMudmFsdWVzKCkpLCBtaW4oeV9tZWFucy52YWx1ZXMoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0b2w9VEhSRVNIX0RJRkYpLCBtc2cKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmUxL3Rlc3RfcGFyYW1fY29sb3JfY29ycmVjdGlvbi5weSBiL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMS90ZXN0X3BhcmFtX2NvbG9yX2NvcnJlY3Rpb24ucHkKaW5kZXggM2RhYzNmNS4uODNmNGY3ZiAxMDA2NDQKLS0tIGEvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmUxL3Rlc3RfcGFyYW1fY29sb3JfY29ycmVjdGlvbi5weQorKysgYi9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTEvdGVzdF9wYXJhbV9jb2xvcl9jb3JyZWN0aW9uLnB5CkBAIC0zOCw3ICszOCw4IEBACiAgICAgd2l0aCBpdHMuZGV2aWNlLkl0c1Nlc3Npb24oKSBhcyBjYW06CiAgICAgICAgIHByb3BzID0gY2FtLmdldF9jYW1lcmFfcHJvcGVydGllcygpCiAgICAgICAgIGl0cy5jYXBzLnNraXBfdW5sZXNzKGl0cy5jYXBzLmNvbXB1dGVfdGFyZ2V0X2V4cG9zdXJlKHByb3BzKSBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRzLmNhcHMucGVyX2ZyYW1lX2NvbnRyb2wocHJvcHMpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdHMuY2Fwcy5wZXJfZnJhbWVfY29udHJvbChwcm9wcykgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBpdHMuY2Fwcy5tb25vX2NhbWVyYShwcm9wcykpCiAKICAgICAgICAgIyBCYXNlbGluZSByZXF1ZXN0CiAgICAgICAgIGRlYnVnID0gaXRzLmNhcHMuZGVidWdfbW9kZSgpCmRpZmYgLS1naXQgYS9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTEvdGVzdF9wYXJhbV9mbGFzaF9tb2RlLnB5IGIvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmUxL3Rlc3RfcGFyYW1fZmxhc2hfbW9kZS5weQppbmRleCAyZDhjNjc4Li5jZmQ4OGQ0IDEwMDY0NAotLS0gYS9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTEvdGVzdF9wYXJhbV9mbGFzaF9tb2RlLnB5CisrKyBiL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMS90ZXN0X3BhcmFtX2ZsYXNoX21vZGUucHkKQEAgLTEyLDE3ICsxMiwyMSBAQAogIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCi1pbXBvcnQgaXRzLmltYWdlCitpbXBvcnQgb3MucGF0aAogaW1wb3J0IGl0cy5jYXBzCiBpbXBvcnQgaXRzLmRldmljZQoraW1wb3J0IGl0cy5pbWFnZQogaW1wb3J0IGl0cy5vYmplY3RzCiBpbXBvcnQgaXRzLnRhcmdldAotaW1wb3J0IG9zLnBhdGgKKworTkFNRSA9IG9zLnBhdGguYmFzZW5hbWUoX19maWxlX18pLnNwbGl0KCcuJylbMF0KK0dSQURJRU5UX0RFTFRBID0gMC4xCitZX1JFTEFUSVZFX0RFTFRBX0ZMQVNIID0gMC4xICAjIDEwJQorWV9SRUxBVElWRV9ERUxUQV9UT1JDSCA9IDAuMDUgIyA1JQorCiAKIGRlZiBtYWluKCk6Ci0gICAgIiIiVGVzdCB0aGF0IHRoZSBhbmRyb2lkLmZsYXNoLm1vZGUgcGFyYW1ldGVyIGlzIGFwcGxpZWQuCi0gICAgIiIiCi0gICAgTkFNRSA9IG9zLnBhdGguYmFzZW5hbWUoX19maWxlX18pLnNwbGl0KCIuIilbMF0KKyAgICAiIiJUZXN0IHRoYXQgdGhlIGFuZHJvaWQuZmxhc2gubW9kZSBwYXJhbWV0ZXIgaXMgYXBwbGllZC4iIiIKIAogICAgIHdpdGggaXRzLmRldmljZS5JdHNTZXNzaW9uKCkgYXMgY2FtOgogICAgICAgICBwcm9wcyA9IGNhbS5nZXRfY2FtZXJhX3Byb3BlcnRpZXMoKQpAQCAtMzIsNyArMzYsOCBAQAogCiAgICAgICAgIGZsYXNoX21vZGVzX3JlcG9ydGVkID0gW10KICAgICAgICAgZmxhc2hfc3RhdGVzX3JlcG9ydGVkID0gW10KLSAgICAgICAgZ19tZWFucyA9IFtdCisgICAgICAgIG1lYW5zID0gW10KKyAgICAgICAgZ3JhZHMgPSBbXQogCiAgICAgICAgICMgTWFudWFsbHkgc2V0IHRoZSBleHBvc3VyZSB0byBiZSBhIGxpdHRsZSBvbiB0aGUgZGFyayBzaWRlLCBzbyB0aGF0CiAgICAgICAgICMgaXQgc2hvdWxkIGJlIG9idmlvdXMgd2hldGhlciB0aGUgZmxhc2ggZmlyZWQgb3Igbm90LCBhbmQgdXNlIGEKQEAgLTQ1LDI5ICs1MCwzMyBAQAogICAgICAgICAgICAgbWF0Y2hfYXIgPSAobGFyZ2VzdF95dXZbJ3dpZHRoJ10sIGxhcmdlc3RfeXV2WydoZWlnaHQnXSkKICAgICAgICAgICAgIGZtdCA9IGl0cy5vYmplY3RzLmdldF9zbWFsbGVzdF95dXZfZm9ybWF0KHByb3BzLCBtYXRjaF9hcj1tYXRjaF9hcikKIAotICAgICAgICBlLCBzID0gaXRzLnRhcmdldC5nZXRfdGFyZ2V0X2V4cG9zdXJlX2NvbWJvcyhjYW0pWyJtaWRFeHBvc3VyZVRpbWUiXQotICAgICAgICBlIC89IDQKKyAgICAgICAgZSwgcyA9IGl0cy50YXJnZXQuZ2V0X3RhcmdldF9leHBvc3VyZV9jb21ib3MoY2FtKVsnbWlkRXhwb3N1cmVUaW1lJ10KKyAgICAgICAgZSAvPSAyCiAgICAgICAgIHJlcSA9IGl0cy5vYmplY3RzLm1hbnVhbF9jYXB0dXJlX3JlcXVlc3QocywgZSwgMC4wLCBUcnVlLCBwcm9wcykKIAotICAgICAgICBmb3IgZiBpbiBbMCwxLDJdOgotICAgICAgICAgICAgcmVxWyJhbmRyb2lkLmZsYXNoLm1vZGUiXSA9IGYKKyAgICAgICAgZm9yIGYgaW4gWzAsIDEsIDJdOgorICAgICAgICAgICAgcmVxWydhbmRyb2lkLmZsYXNoLm1vZGUnXSA9IGYKICAgICAgICAgICAgIGNhcCA9IGNhbS5kb19jYXB0dXJlKHJlcSwgZm10KQotICAgICAgICAgICAgZmxhc2hfbW9kZXNfcmVwb3J0ZWQuYXBwZW5kKGNhcFsibWV0YWRhdGEiXVsiYW5kcm9pZC5mbGFzaC5tb2RlIl0pCi0gICAgICAgICAgICBmbGFzaF9zdGF0ZXNfcmVwb3J0ZWQuYXBwZW5kKGNhcFsibWV0YWRhdGEiXVsiYW5kcm9pZC5mbGFzaC5zdGF0ZSJdKQotICAgICAgICAgICAgaW1nID0gaXRzLmltYWdlLmNvbnZlcnRfY2FwdHVyZV90b19yZ2JfaW1hZ2UoY2FwKQotICAgICAgICAgICAgaXRzLmltYWdlLndyaXRlX2ltYWdlKGltZywgIiVzX21vZGU9JWQuanBnIiAlIChOQU1FLCBmKSkKLSAgICAgICAgICAgIHRpbGUgPSBpdHMuaW1hZ2UuZ2V0X2ltYWdlX3BhdGNoKGltZywgMC40NSwgMC40NSwgMC4xLCAwLjEpCi0gICAgICAgICAgICByZ2IgPSBpdHMuaW1hZ2UuY29tcHV0ZV9pbWFnZV9tZWFucyh0aWxlKQotICAgICAgICAgICAgZ19tZWFucy5hcHBlbmQocmdiWzFdKQorICAgICAgICAgICAgZmxhc2hfbW9kZXNfcmVwb3J0ZWQuYXBwZW5kKGNhcFsnbWV0YWRhdGEnXVsnYW5kcm9pZC5mbGFzaC5tb2RlJ10pCisgICAgICAgICAgICBmbGFzaF9zdGF0ZXNfcmVwb3J0ZWQuYXBwZW5kKGNhcFsnbWV0YWRhdGEnXVsnYW5kcm9pZC5mbGFzaC5zdGF0ZSddKQorICAgICAgICAgICAgeSwgXywgXyA9IGl0cy5pbWFnZS5jb252ZXJ0X2NhcHR1cmVfdG9fcGxhbmVzKGNhcCwgcHJvcHMpCisgICAgICAgICAgICBpdHMuaW1hZ2Uud3JpdGVfaW1hZ2UoeSwgJyVzXyVkLmpwZycgJSAoTkFNRSwgZikpCisgICAgICAgICAgICB0aWxlID0gaXRzLmltYWdlLmdldF9pbWFnZV9wYXRjaCh5LCAwLjM3NSwgMC4zNzUsIDAuMjUsIDAuMjUpCisgICAgICAgICAgICBpdHMuaW1hZ2Uud3JpdGVfaW1hZ2UodGlsZSwgJyVzXyVkX3RpbGUuanBnJyAlIChOQU1FLCBmKSkKKyAgICAgICAgICAgIG1lYW5zLmFwcGVuZChpdHMuaW1hZ2UuY29tcHV0ZV9pbWFnZV9tZWFucyh0aWxlKVswXSkKKyAgICAgICAgICAgIGdyYWRzLmFwcGVuZChpdHMuaW1hZ2UuY29tcHV0ZV9pbWFnZV9tYXhfZ3JhZGllbnRzKHRpbGUpWzBdKQogCi0gICAgICAgIGFzc2VydChmbGFzaF9tb2Rlc19yZXBvcnRlZCA9PSBbMCwxLDJdKQotICAgICAgICBhc3NlcnQoZmxhc2hfc3RhdGVzX3JlcG9ydGVkWzBdIG5vdCBpbiBbMyw0XSkKLSAgICAgICAgYXNzZXJ0KGZsYXNoX3N0YXRlc19yZXBvcnRlZFsxXSBpbiBbMyw0XSkKLSAgICAgICAgYXNzZXJ0KGZsYXNoX3N0YXRlc19yZXBvcnRlZFsyXSBpbiBbMyw0XSkKKyAgICAgICAgYXNzZXJ0IGZsYXNoX21vZGVzX3JlcG9ydGVkID09IFswLCAxLCAyXQorICAgICAgICBhc3NlcnQgZmxhc2hfc3RhdGVzX3JlcG9ydGVkWzBdIG5vdCBpbiBbMywgNF0KKyAgICAgICAgYXNzZXJ0IGZsYXNoX3N0YXRlc19yZXBvcnRlZFsxXSBpbiBbMywgNF0KKyAgICAgICAgYXNzZXJ0IGZsYXNoX3N0YXRlc19yZXBvcnRlZFsyXSBpbiBbMywgNF0KIAotICAgICAgICBwcmludCAiRyBicmlnaHRuZXNzZXM6IiwgZ19tZWFucwotICAgICAgICBhc3NlcnQoZ19tZWFuc1sxXSA+IGdfbWVhbnNbMF0pCi0gICAgICAgIGFzc2VydChnX21lYW5zWzJdID4gZ19tZWFuc1swXSkKKyAgICAgICAgcHJpbnQgJ0JyaWdodG5lc3NlczonLCBtZWFucworICAgICAgICBwcmludCAnTWF4IGdyYWRpZW50czogJywgZ3JhZHMKKyAgICAgICAgYXNzZXJ0IChncmFkc1sxXS1ncmFkc1swXSA+IEdSQURJRU5UX0RFTFRBIG9yCisgICAgICAgICAgICAgICAgKG1lYW5zWzFdLW1lYW5zWzBdKSAvIG1lYW5zWzBdID4gWV9SRUxBVElWRV9ERUxUQV9GTEFTSCkKKyAgICAgICAgYXNzZXJ0IChncmFkc1syXS1ncmFkc1swXSA+IEdSQURJRU5UX0RFTFRBIG9yCisgICAgICAgICAgICAgICAgKG1lYW5zWzJdLW1lYW5zWzBdKSAvIG1lYW5zWzBdID4gWV9SRUxBVElWRV9ERUxUQV9UT1JDSCkKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICBtYWluKCkKZGlmZiAtLWdpdCBhL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMS90ZXN0X3BhcmFtX3NoYWRpbmdfbW9kZS5weSBiL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMS90ZXN0X3BhcmFtX3NoYWRpbmdfbW9kZS5weQppbmRleCBmNGMyYjk5Li40NWM5YTEyIDEwMDY0NAotLS0gYS9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTEvdGVzdF9wYXJhbV9zaGFkaW5nX21vZGUucHkKKysrIGIvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmUxL3Rlc3RfcGFyYW1fc2hhZGluZ19tb2RlLnB5CkBAIC00MCwzNSArNDAsMzggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRzLmNhcHMubHNjX21hcChwcm9wcykgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0cy5jYXBzLmxzY19vZmYocHJvcHMpKQogCi0gICAgICAgIGFzc2VydChwcm9wcy5oYXNfa2V5KCJhbmRyb2lkLmxlbnMuaW5mby5zaGFkaW5nTWFwU2l6ZSIpIGFuZAotICAgICAgICAgICAgICAgcHJvcHNbImFuZHJvaWQubGVucy5pbmZvLnNoYWRpbmdNYXBTaXplIl0gIT0gTm9uZSkKKyAgICAgICAgbW9ub19jYW1lcmEgPSBpdHMuY2Fwcy5tb25vX2NhbWVyYShwcm9wcykKIAogICAgICAgICAjIGxzY19vZmYgZGV2aWNlcyBzaG91bGQgYWx3YXlzIHN1cHBvcnQgT0ZGKDApLCBGQVNUKDEpLCBhbmQgSFEoMikKICAgICAgICAgYXNzZXJ0KHByb3BzLmhhc19rZXkoImFuZHJvaWQuc2hhZGluZy5hdmFpbGFibGVNb2RlcyIpIGFuZAogICAgICAgICAgICAgICAgc2V0KHByb3BzWyJhbmRyb2lkLnNoYWRpbmcuYXZhaWxhYmxlTW9kZXMiXSkgPT0gc2V0KFswLCAxLCAyXSkpCiAKLSAgICAgICAgbnVtX21hcF9nYWlucyA9IHByb3BzWyJhbmRyb2lkLmxlbnMuaW5mby5zaGFkaW5nTWFwU2l6ZSJdWyJ3aWR0aCJdICogXAotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHNbImFuZHJvaWQubGVucy5pbmZvLnNoYWRpbmdNYXBTaXplIl1bImhlaWdodCJdICogNAotCiAgICAgICAgICMgVGVzdCAxOiBTd2l0Y2hpbmcgc2hhZGluZyBtb2RlcyBzZXZlcmFsIHRpbWVzIGFuZCB2ZXJpZnk6CiAgICAgICAgICMgICAxLiBMZW5zIHNoYWRpbmcgbWFwcyB3aXRoIG1vZGUgT0ZGIGFyZSBhbGwgMS4wCiAgICAgICAgICMgICAyLiBMZW5zIHNoYWRpbmcgbWFwcyB3aXRoIG1vZGUgRkFTVCBhcmUgc2ltaWxhciBhZnRlciBzd2l0Y2hpbmcKICAgICAgICAgIyAgICAgIHNoYWRpbmcgbW9kZXMuCiAgICAgICAgICMgICAzLiBMZW5zIHNoYWRpbmcgbWFwcyB3aXRoIG1vZGUgSElHSF9RVUFMSVRZIGFyZSBzaW1pbGFyIGFmdGVyCiAgICAgICAgICMgICAgICBzd2l0Y2hpbmcgc2hhZGluZyBtb2Rlcy4KLSAgICAgICAgY2FtLmRvXzNhKCk7CisgICAgICAgIGNhbS5kb18zYShtb25vX2NhbWVyYT1tb25vX2NhbWVyYSk7CiAKICAgICAgICAgIyBHZXQgdGhlIHJlZmVyZW5jZSBsZW5zIHNoYWRpbmcgbWFwcyBmb3IgT0ZGLCBGQVNULCBhbmQgSElHSF9RVUFMSVRZCiAgICAgICAgICMgaW4gZGlmZmVyZW50IHNlc3Npb25zLgogICAgICAgICAjIHJlZmVyZW5jZV9tYXBzW21vZGVdCiAgICAgICAgIHJlZmVyZW5jZV9tYXBzID0gW1tdIGZvciBtb2RlIGluIHJhbmdlKDMpXQotICAgICAgICByZWZlcmVuY2VfbWFwc1swXSA9IFsxLjBdICogbnVtX21hcF9nYWlucworICAgICAgICBudW1fbWFwX2dhaW5zID0gMAogICAgICAgICBmb3IgbW9kZSBpbiByYW5nZSgxLCAzKToKICAgICAgICAgICAgIHJlcSA9IGl0cy5vYmplY3RzLmF1dG9fY2FwdHVyZV9yZXF1ZXN0KCk7CiAgICAgICAgICAgICByZXFbImFuZHJvaWQuc3RhdGlzdGljcy5sZW5zU2hhZGluZ01hcE1vZGUiXSA9IDEKICAgICAgICAgICAgIHJlcVsiYW5kcm9pZC5zaGFkaW5nLm1vZGUiXSA9IG1vZGUKLSAgICAgICAgICAgIHJlZmVyZW5jZV9tYXBzW21vZGVdID0gY2FtLmRvX2NhcHR1cmUocmVxKVsibWV0YWRhdGEiXSBcCi0gICAgICAgICAgICAgICAgICAgIFsiYW5kcm9pZC5zdGF0aXN0aWNzLmxlbnNTaGFkaW5nTWFwIl0KKyAgICAgICAgICAgIGNhcF9yZXMgPSBjYW0uZG9fY2FwdHVyZShyZXEpWyJtZXRhZGF0YSJdCisgICAgICAgICAgICBsc2NfbWFwID0gY2FwX3Jlc1siYW5kcm9pZC5zdGF0aXN0aWNzLmxlbnNTaGFkaW5nQ29ycmVjdGlvbk1hcCJdCisgICAgICAgICAgICBhc3NlcnQobHNjX21hcC5oYXNfa2V5KCJ3aWR0aCIpIGFuZAorICAgICAgICAgICAgICAgICAgIGxzY19tYXAuaGFzX2tleSgiaGVpZ2h0IikgYW5kCisgICAgICAgICAgICAgICAgICAgbHNjX21hcFsid2lkdGgiXSAhPSBOb25lIGFuZCBsc2NfbWFwWyJoZWlnaHQiXSAhPSBOb25lKQorICAgICAgICAgICAgaWYgbW9kZSA9PSAxOgorICAgICAgICAgICAgICAgIG51bV9tYXBfZ2FpbnMgPSBsc2NfbWFwWyJ3aWR0aCJdICogbHNjX21hcFsiaGVpZ2h0Il0gKiA0CisgICAgICAgICAgICAgICAgcmVmZXJlbmNlX21hcHNbMF0gPSBbMS4wXSAqIG51bV9tYXBfZ2FpbnMKKyAgICAgICAgICAgIHJlZmVyZW5jZV9tYXBzW21vZGVdID0gbHNjX21hcFsibWFwIl0KIAogICAgICAgICAjIEdldCB0aGUgbGVucyBzaGFkaW5nIG1hcHMgd2hpbGUgc3dpdGNoaW5nIG1vZGVzIGluIG9uZSBzZXNzaW9uLgogICAgICAgICByZXFzID0gW10KQEAgLTg4LDcgKzkxLDggQEAKICAgICAgICAgIyBHZXQgdGhlIHNoYWRpbmcgbWFwcyBvdXQgb2YgY2FwdHVyZSByZXN1bHRzCiAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihjYXBzKSk6CiAgICAgICAgICAgICBzaGFkaW5nX21hcHNbaSAlIDNdW2kgLyAzXSA9IFwKLSAgICAgICAgICAgICAgICAgICAgY2Fwc1tpXVsibWV0YWRhdGEiXVsiYW5kcm9pZC5zdGF0aXN0aWNzLmxlbnNTaGFkaW5nTWFwIl0KKyAgICAgICAgICAgICAgICAgICAgY2Fwc1tpXVsibWV0YWRhdGEiXSBcCisgICAgICAgICAgICAgICAgICAgIFsiYW5kcm9pZC5zdGF0aXN0aWNzLmxlbnNTaGFkaW5nQ29ycmVjdGlvbk1hcCJdWyJtYXAiXQogCiAgICAgICAgICMgRHJhdyB0aGUgbWFwcwogICAgICAgICBmb3IgbW9kZSBpbiByYW5nZSgzKToKZGlmZiAtLWdpdCBhL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMS90ZXN0X3BhcmFtX3RvbmVtYXBfbW9kZS5weSBiL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMS90ZXN0X3BhcmFtX3RvbmVtYXBfbW9kZS5weQppbmRleCAxMjI5ZjkwLi40NWE1YjEzIDEwMDY0NAotLS0gYS9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTEvdGVzdF9wYXJhbV90b25lbWFwX21vZGUucHkKKysrIGIvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmUxL3Rlc3RfcGFyYW1fdG9uZW1hcF9tb2RlLnB5CkBAIC02MiwxMiArNjIsMTMgQEAKICAgICAgICAgZm9yIG4gaW4gWzAsMV06CiAgICAgICAgICAgICByZXEgPSBpdHMub2JqZWN0cy5tYW51YWxfY2FwdHVyZV9yZXF1ZXN0KHMsZSkKICAgICAgICAgICAgIHJlcVsiYW5kcm9pZC50b25lbWFwLm1vZGUiXSA9IDAKLSAgICAgICAgICAgIHJlcVsiYW5kcm9pZC50b25lbWFwLmN1cnZlUmVkIl0gPSAoCi0gICAgICAgICAgICAgICAgICAgIHN1bShbW2kvTE0xLCBtaW4oMS4wLCgxKzAuNSpuKSppL0xNMSldIGZvciBpIGluIHJhbmdlKEwpXSwgW10pKQotICAgICAgICAgICAgcmVxWyJhbmRyb2lkLnRvbmVtYXAuY3VydmVHcmVlbiJdID0gKAotICAgICAgICAgICAgICAgICAgICBzdW0oW1tpL0xNMSwgbWluKDEuMCwoMSsxLjAqbikqaS9MTTEpXSBmb3IgaSBpbiByYW5nZShMKV0sIFtdKSkKLSAgICAgICAgICAgIHJlcVsiYW5kcm9pZC50b25lbWFwLmN1cnZlQmx1ZSJdID0gKAotICAgICAgICAgICAgICAgICAgICBzdW0oW1tpL0xNMSwgbWluKDEuMCwoMSsxLjUqbikqaS9MTTEpXSBmb3IgaSBpbiByYW5nZShMKV0sIFtdKSkKKyAgICAgICAgICAgIHJlcVsiYW5kcm9pZC50b25lbWFwLmN1cnZlIl0gPSB7CisgICAgICAgICAgICAgICAgInJlZCI6IChzdW0oW1tpL0xNMSwgbWluKDEuMCwoMSswLjUqbikqaS9MTTEpXQorICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShMKV0sIFtdKSksCisgICAgICAgICAgICAgICAgImdyZWVuIjogKHN1bShbW2kvTE0xLCBtaW4oMS4wLCgxKzEuMCpuKSppL0xNMSldCisgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKEwpXSwgW10pKSwKKyAgICAgICAgICAgICAgICAiYmx1ZSI6IChzdW0oW1tpL0xNMSwgbWluKDEuMCwoMSsxLjUqbikqaS9MTTEpXQorICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShMKV0sIFtdKSl9CiAgICAgICAgICAgICBjYXAgPSBjYW0uZG9fY2FwdHVyZShyZXEsIGZtdCkKICAgICAgICAgICAgIGltZyA9IGl0cy5pbWFnZS5jb252ZXJ0X2NhcHR1cmVfdG9fcmdiX2ltYWdlKGNhcCkKICAgICAgICAgICAgIGl0cy5pbWFnZS53cml0ZV9pbWFnZSgKQEAgLTkwLDkgKzkxLDggQEAKICAgICAgICAgICAgIGN1cnZlID0gc3VtKFtbaS9tLCBpL21dIGZvciBpIGluIHJhbmdlKHNpemUpXSwgW10pCiAgICAgICAgICAgICByZXEgPSBpdHMub2JqZWN0cy5tYW51YWxfY2FwdHVyZV9yZXF1ZXN0KHMsZSkKICAgICAgICAgICAgIHJlcVsiYW5kcm9pZC50b25lbWFwLm1vZGUiXSA9IDAKLSAgICAgICAgICAgIHJlcVsiYW5kcm9pZC50b25lbWFwLmN1cnZlUmVkIl0gPSBjdXJ2ZQotICAgICAgICAgICAgcmVxWyJhbmRyb2lkLnRvbmVtYXAuY3VydmVHcmVlbiJdID0gY3VydmUKLSAgICAgICAgICAgIHJlcVsiYW5kcm9pZC50b25lbWFwLmN1cnZlQmx1ZSJdID0gY3VydmUKKyAgICAgICAgICAgIHJlcVsiYW5kcm9pZC50b25lbWFwLmN1cnZlIl0gPSB7CisgICAgICAgICAgICAgICAgInJlZCI6IGN1cnZlLCAiZ3JlZW4iOiBjdXJ2ZSwgImJsdWUiOiBjdXJ2ZX0KICAgICAgICAgICAgIGNhcCA9IGNhbS5kb19jYXB0dXJlKHJlcSkKICAgICAgICAgICAgIGltZyA9IGl0cy5pbWFnZS5jb252ZXJ0X2NhcHR1cmVfdG9fcmdiX2ltYWdlKGNhcCkKICAgICAgICAgICAgIGl0cy5pbWFnZS53cml0ZV9pbWFnZSgKZGlmZiAtLWdpdCBhL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMS90ZXN0X3Bvc3RfcmF3X3NlbnNpdGl2aXR5X2Jvb3N0LnB5IGIvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmUxL3Rlc3RfcG9zdF9yYXdfc2Vuc2l0aXZpdHlfYm9vc3QucHkKaW5kZXggNzBiMTkyNy4uNzNjMDAxZCAxMDA2NDQKLS0tIGEvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmUxL3Rlc3RfcG9zdF9yYXdfc2Vuc2l0aXZpdHlfYm9vc3QucHkKKysrIGIvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmUxL3Rlc3RfcG9zdF9yYXdfc2Vuc2l0aXZpdHlfYm9vc3QucHkKQEAgLTQwLDcgKzQwLDggQEAKICAgICAgICAgaXRzLmNhcHMuc2tpcF91bmxlc3MoaXRzLmNhcHMucmF3X291dHB1dChwcm9wcykgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0cy5jYXBzLnBvc3RfcmF3X3NlbnNpdGl2aXR5X2Jvb3N0KHByb3BzKSBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRzLmNhcHMuY29tcHV0ZV90YXJnZXRfZXhwb3N1cmUocHJvcHMpIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdHMuY2Fwcy5wZXJfZnJhbWVfY29udHJvbChwcm9wcykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0cy5jYXBzLnBlcl9mcmFtZV9jb250cm9sKHByb3BzKSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGl0cy5jYXBzLm1vbm9fY2FtZXJhKHByb3BzKSkKIAogICAgICAgICB3LGggPSBpdHMub2JqZWN0cy5nZXRfYXZhaWxhYmxlX291dHB1dF9zaXplcygKICAgICAgICAgICAgICAgICAieXV2IiwgcHJvcHMsICgxOTIwLCAxMDgwKSlbMF0KZGlmZiAtLWdpdCBhL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMS90ZXN0X3Jhd19idXJzdF9zZW5zaXRpdml0eS5weSBiL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMS90ZXN0X3Jhd19idXJzdF9zZW5zaXRpdml0eS5weQppbmRleCAwNTNmN2NhLi5iNmIwNTE0IDEwMDY0NAotLS0gYS9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTEvdGVzdF9yYXdfYnVyc3Rfc2Vuc2l0aXZpdHkucHkKKysrIGIvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmUxL3Rlc3RfcmF3X2J1cnN0X3NlbnNpdGl2aXR5LnB5CkBAIC0zOSw3ICszOSw4IEBACiAgICAgICAgIGl0cy5jYXBzLnNraXBfdW5sZXNzKGl0cy5jYXBzLnJhdzE2KHByb3BzKSBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRzLmNhcHMubWFudWFsX3NlbnNvcihwcm9wcykgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0cy5jYXBzLnJlYWRfM2EocHJvcHMpIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdHMuY2Fwcy5wZXJfZnJhbWVfY29udHJvbChwcm9wcykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0cy5jYXBzLnBlcl9mcmFtZV9jb250cm9sKHByb3BzKSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGl0cy5jYXBzLm1vbm9fY2FtZXJhKHByb3BzKSkKICAgICAgICAgZGVidWcgPSBpdHMuY2Fwcy5kZWJ1Z19tb2RlKCkKIAogICAgICAgICAjIEV4cG9zZSBmb3IgdGhlIHNjZW5lIHdpdGggbWluIHNlbnNpdGl2aXR5CkBAIC02MiwxMCArNjMsMTAgQEAKICAgICAgICAgICAgIGNhcHMgPSBjYW0uZG9fY2FwdHVyZShyZXFzLCBjYW0uQ0FQX1JBVykKICAgICAgICAgZWxzZToKICAgICAgICAgICAgICMgR2V0IHRoZSBhY3RpdmUgYXJyYXkgd2lkdGggYW5kIGhlaWdodC4KLSAgICAgICAgICAgIGFheCA9IHByb3BzWyJhbmRyb2lkLnNlbnNvci5pbmZvLmFjdGl2ZUFycmF5U2l6ZSJdWyJsZWZ0Il0KLSAgICAgICAgICAgIGFheSA9IHByb3BzWyJhbmRyb2lkLnNlbnNvci5pbmZvLmFjdGl2ZUFycmF5U2l6ZSJdWyJ0b3AiXQotICAgICAgICAgICAgYWF3ID0gcHJvcHNbImFuZHJvaWQuc2Vuc29yLmluZm8uYWN0aXZlQXJyYXlTaXplIl1bInJpZ2h0Il0tYWF4Ci0gICAgICAgICAgICBhYWggPSBwcm9wc1siYW5kcm9pZC5zZW5zb3IuaW5mby5hY3RpdmVBcnJheVNpemUiXVsiYm90dG9tIl0tYWF5CisgICAgICAgICAgICBhYXggPSBwcm9wc1siYW5kcm9pZC5zZW5zb3IuaW5mby5wcmVDb3JyZWN0aW9uQWN0aXZlQXJyYXlTaXplIl1bImxlZnQiXQorICAgICAgICAgICAgYWF5ID0gcHJvcHNbImFuZHJvaWQuc2Vuc29yLmluZm8ucHJlQ29ycmVjdGlvbkFjdGl2ZUFycmF5U2l6ZSJdWyJ0b3AiXQorICAgICAgICAgICAgYWF3ID0gcHJvcHNbImFuZHJvaWQuc2Vuc29yLmluZm8ucHJlQ29ycmVjdGlvbkFjdGl2ZUFycmF5U2l6ZSJdWyJyaWdodCJdLWFheAorICAgICAgICAgICAgYWFoID0gcHJvcHNbImFuZHJvaWQuc2Vuc29yLmluZm8ucHJlQ29ycmVjdGlvbkFjdGl2ZUFycmF5U2l6ZSJdWyJib3R0b20iXS1hYXkKICAgICAgICAgICAgICMgQ29tcHV0ZSBzdGF0cyBvbiBhIGdyaWQgYWNyb3NzIGVhY2ggaW1hZ2UuCiAgICAgICAgICAgICBjYXBzID0gY2FtLmRvX2NhcHR1cmUocmVxcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ImZvcm1hdCI6ICJyYXdTdGF0cyIsCmRpZmYgLS1naXQgYS9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTEvdGVzdF9yYXdfZXhwb3N1cmUucHkgYi9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTEvdGVzdF9yYXdfZXhwb3N1cmUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E1OWFhOAotLS0gL2Rldi9udWxsCisrKyBiL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMS90ZXN0X3Jhd19leHBvc3VyZS5weQpAQCAtMCwwICsxLDE2MiBAQAorIyBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbXBvcnQgb3MucGF0aAoraW1wb3J0IGl0cy5jYXBzCitpbXBvcnQgaXRzLmRldmljZQoraW1wb3J0IGl0cy5pbWFnZQoraW1wb3J0IGl0cy5vYmplY3RzCitmcm9tIG1hdHBsb3RsaWIgaW1wb3J0IHB5bGFiCitpbXBvcnQgbWF0cGxvdGxpYi5weXBsb3QKK2ltcG9ydCBudW1weSBhcyBucAorCitJTUdfU1RBVFNfR1JJRCA9IDkgICMgZmluZCB1c2VkIHRvIGZpbmQgdGhlIGNlbnRlciAxMS4xMSUKK05BTUUgPSBvcy5wYXRoLmJhc2VuYW1lKF9fZmlsZV9fKS5zcGxpdCgiLiIpWzBdCitOVU1fSVNPX1NURVBTID0gNQorU0FUVVJBVElPTl9UT0wgPSAwLjAxCitCTEtfTFZMX1RPTCA9IDAuMQorIyBUZXN0IDMgc3RlcHMgcGVyIDJ4IGV4cG9zdXJlCitFWFBfTVVMVCA9IHBvdygyLCAxLjAvMykKK0lOQ1JFQVNJTkdfVEhSID0gMC45OQorIyBzbGljZSBjYXB0dXJlcyBpbnRvIGJ1cnN0IG9mIFNMSUNFX0xFTiByZXF1ZXN0cworU0xJQ0VfTEVOID0gMTAKKworCitkZWYgbWFpbigpOgorICAgICIiIkNhcHR1cmUgYSBzZXQgb2YgcmF3IGltYWdlcyB3aXRoIGluY3JlYXNpbmcgZXhwb3N1cmUgdGltZSBhbmQgbWVhc3VyZSB0aGUgcGl4ZWwgdmFsdWVzLgorICAgICIiIgorCisgICAgd2l0aCBpdHMuZGV2aWNlLkl0c1Nlc3Npb24oKSBhcyBjYW06CisKKyAgICAgICAgcHJvcHMgPSBjYW0uZ2V0X2NhbWVyYV9wcm9wZXJ0aWVzKCkKKyAgICAgICAgaXRzLmNhcHMuc2tpcF91bmxlc3MoaXRzLmNhcHMucmF3MTYocHJvcHMpIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdHMuY2Fwcy5tYW51YWxfc2Vuc29yKHByb3BzKSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRzLmNhcHMucmVhZF8zYShwcm9wcykgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0cy5jYXBzLnBlcl9mcmFtZV9jb250cm9sKHByb3BzKSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGl0cy5jYXBzLm1vbm9fY2FtZXJhKHByb3BzKSkKKyAgICAgICAgZGVidWcgPSBpdHMuY2Fwcy5kZWJ1Z19tb2RlKCkKKworICAgICAgICAjIEV4cG9zZSBmb3IgdGhlIHNjZW5lIHdpdGggbWluIHNlbnNpdGl2aXR5CisgICAgICAgIGV4cF9taW4sIGV4cF9tYXggPSBwcm9wc1siYW5kcm9pZC5zZW5zb3IuaW5mby5leHBvc3VyZVRpbWVSYW5nZSJdCisgICAgICAgIHNlbnNfbWluLCBfID0gcHJvcHNbImFuZHJvaWQuc2Vuc29yLmluZm8uc2Vuc2l0aXZpdHlSYW5nZSJdCisgICAgICAgICMgRGlnaXRhbCBnYWlucyBtaWdodCBub3QgYmUgdmlzaWJsZSBvbiBSQVcgZGF0YQorICAgICAgICBzZW5zX21heCA9IHByb3BzWyJhbmRyb2lkLnNlbnNvci5tYXhBbmFsb2dTZW5zaXRpdml0eSJdCisgICAgICAgIHNlbnNfc3RlcCA9IChzZW5zX21heCAtIHNlbnNfbWluKSAvIE5VTV9JU09fU1RFUFMKKyAgICAgICAgd2hpdGVfbGV2ZWwgPSBmbG9hdChwcm9wc1siYW5kcm9pZC5zZW5zb3IuaW5mby53aGl0ZUxldmVsIl0pCisgICAgICAgIGJsYWNrX2xldmVscyA9IFtpdHMuaW1hZ2UuZ2V0X2JsYWNrX2xldmVsKGksIHByb3BzKSBmb3IgaSBpbiByYW5nZSg0KV0KKyAgICAgICAgIyBHZXQgdGhlIGFjdGl2ZSBhcnJheSB3aWR0aCBhbmQgaGVpZ2h0LgorICAgICAgICBhYXggPSBwcm9wc1siYW5kcm9pZC5zZW5zb3IuaW5mby5wcmVDb3JyZWN0aW9uQWN0aXZlQXJyYXlTaXplIl1bImxlZnQiXQorICAgICAgICBhYXkgPSBwcm9wc1siYW5kcm9pZC5zZW5zb3IuaW5mby5wcmVDb3JyZWN0aW9uQWN0aXZlQXJyYXlTaXplIl1bInRvcCJdCisgICAgICAgIGFhdyA9IHByb3BzWyJhbmRyb2lkLnNlbnNvci5pbmZvLnByZUNvcnJlY3Rpb25BY3RpdmVBcnJheVNpemUiXVsicmlnaHQiXS1hYXgKKyAgICAgICAgYWFoID0gcHJvcHNbImFuZHJvaWQuc2Vuc29yLmluZm8ucHJlQ29ycmVjdGlvbkFjdGl2ZUFycmF5U2l6ZSJdWyJib3R0b20iXS1hYXkKKyAgICAgICAgcmF3X3N0YXRfZm10ID0geyJmb3JtYXQiOiAicmF3U3RhdHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgImdyaWRXaWR0aCI6IGFhdy9JTUdfU1RBVFNfR1JJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJncmlkSGVpZ2h0IjogYWFoL0lNR19TVEFUU19HUklEfQorCisgICAgICAgIGVfdGVzdCA9IFtdCisgICAgICAgIG11bHQgPSAxLjAKKyAgICAgICAgd2hpbGUgZXhwX21pbiptdWx0IDwgZXhwX21heDoKKyAgICAgICAgICAgIGVfdGVzdC5hcHBlbmQoaW50KGV4cF9taW4qbXVsdCkpCisgICAgICAgICAgICBtdWx0ICo9IEVYUF9NVUxUCisgICAgICAgIGlmIGVfdGVzdFstMV0gPCBleHBfbWF4ICogSU5DUkVBU0lOR19USFI6CisgICAgICAgICAgICBlX3Rlc3QuYXBwZW5kKGludChleHBfbWF4KSkKKyAgICAgICAgZV90ZXN0X21zID0gW2UgLyAxMDAwMDAwLjAgZm9yIGUgaW4gZV90ZXN0XQorCisgICAgICAgIGZvciBzIGluIHJhbmdlKHNlbnNfbWluLCBzZW5zX21heCwgc2Vuc19zdGVwKToKKyAgICAgICAgICAgIG1lYW5zID0gW10KKyAgICAgICAgICAgIG1lYW5zLmFwcGVuZChibGFja19sZXZlbHMpCisgICAgICAgICAgICByZXFzID0gW2l0cy5vYmplY3RzLm1hbnVhbF9jYXB0dXJlX3JlcXVlc3QocywgZSwgMCkgZm9yIGUgaW4gZV90ZXN0XQorICAgICAgICAgICAgIyBDYXB0dXJlIHJhdyBpbiBkZWJ1ZyBtb2RlLCByYXdTdGF0cyBvdGhlcndpc2UKKyAgICAgICAgICAgIGNhcHMgPSBbXQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHJlcXMpIC8gU0xJQ0VfTEVOKToKKyAgICAgICAgICAgICAgICBpZiBkZWJ1ZzoKKyAgICAgICAgICAgICAgICAgICAgY2FwcyArPSBjYW0uZG9fY2FwdHVyZShyZXFzW2kqU0xJQ0VfTEVOOihpKzEpKlNMSUNFX0xFTl0sIGNhbS5DQVBfUkFXKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGNhcHMgKz0gY2FtLmRvX2NhcHR1cmUocmVxc1tpKlNMSUNFX0xFTjooaSsxKSpTTElDRV9MRU5dLCByYXdfc3RhdF9mbXQpCisgICAgICAgICAgICBsYXN0X24gPSBsZW4ocmVxcykgJSBTTElDRV9MRU4KKyAgICAgICAgICAgIGlmIGxhc3RfbiA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGRlYnVnOgorICAgICAgICAgICAgICAgICAgICBjYXBzICs9IFtjYW0uZG9fY2FwdHVyZShyZXFzWy1sYXN0X246XSwgY2FtLkNBUF9SQVcpXQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGNhcHMgKz0gW2NhbS5kb19jYXB0dXJlKHJlcXNbLWxhc3RfbjpdLCByYXdfc3RhdF9mbXQpXQorICAgICAgICAgICAgZWxpZiBsYXN0X24gPiAwOgorICAgICAgICAgICAgICAgIGlmIGRlYnVnOgorICAgICAgICAgICAgICAgICAgICBjYXBzICs9IGNhbS5kb19jYXB0dXJlKHJlcXNbLWxhc3RfbjpdLCBjYW0uQ0FQX1JBVykKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBjYXBzICs9IGNhbS5kb19jYXB0dXJlKHJlcXNbLWxhc3RfbjpdLCByYXdfc3RhdF9mbXQpCisKKyAgICAgICAgICAgICMgTWVhc3VyZSB0aGUgbWVhbiBvZiBlYWNoIGNoYW5uZWwuCisgICAgICAgICAgICAjIEVhY2ggc2hvdCBzaG91bGQgYmUgYnJpZ2h0ZXIgKGV4Y2VwdCB1bmRlcmV4cG9zZWQvb3ZlcmV4cG9zZWQgc2NlbmUpCisgICAgICAgICAgICBmb3IgaSwgY2FwIGluIGVudW1lcmF0ZShjYXBzKToKKyAgICAgICAgICAgICAgICBpZiBkZWJ1ZzoKKyAgICAgICAgICAgICAgICAgICAgcGxhbmVzID0gaXRzLmltYWdlLmNvbnZlcnRfY2FwdHVyZV90b19wbGFuZXMoY2FwLCBwcm9wcykKKyAgICAgICAgICAgICAgICAgICAgdGlsZXMgPSBbaXRzLmltYWdlLmdldF9pbWFnZV9wYXRjaChwLCAwLjQ0NSwgMC40NDUsIDAuMTEsIDAuMTEpIGZvciBwIGluIHBsYW5lc10KKyAgICAgICAgICAgICAgICAgICAgbWVhbiA9IFttICogd2hpdGVfbGV2ZWwgZm9yIHRpbGUgaW4gdGlsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbSBpbiBpdHMuaW1hZ2UuY29tcHV0ZV9pbWFnZV9tZWFucyh0aWxlKV0KKyAgICAgICAgICAgICAgICAgICAgaW1nID0gaXRzLmltYWdlLmNvbnZlcnRfY2FwdHVyZV90b19yZ2JfaW1hZ2UoY2FwLCBwcm9wcz1wcm9wcykKKyAgICAgICAgICAgICAgICAgICAgaXRzLmltYWdlLndyaXRlX2ltYWdlKGltZywgIiVzX3M9JWRfZT0lMDVkLmpwZyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKE5BTUUsIHMsIGVfdGVzdFtpXSkpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbWVhbl9pbWFnZSwgXyA9IGl0cy5pbWFnZS51bnBhY2tfcmF3c3RhdHNfY2FwdHVyZShjYXApCisgICAgICAgICAgICAgICAgICAgIG1lYW4gPSBtZWFuX2ltYWdlW0lNR19TVEFUU19HUklELzIsIElNR19TVEFUU19HUklELzJdCisKKyAgICAgICAgICAgICAgICBwcmludCAiSVNPPSVkLCBleHBvc3VyZSB0aW1lPSUuM2ZtcywgbWVhbj0lcyIgJSAoCisgICAgICAgICAgICAgICAgICAgICAgICBzLCBlX3Rlc3RbaV0gLyAxMDAwMDAwLjAsIHN0cihtZWFuKSkKKyAgICAgICAgICAgICAgICBtZWFucy5hcHBlbmQobWVhbikKKworICAgICAgICAgICAgIyBtZWFuc1swXSBpcyBibGFjayBsZXZlbCB2YWx1ZQorICAgICAgICAgICAgciA9IFttWzBdIGZvciBtIGluIG1lYW5zWzE6XV0KKyAgICAgICAgICAgIGdyID0gW21bMV0gZm9yIG0gaW4gbWVhbnNbMTpdXQorICAgICAgICAgICAgZ2IgPSBbbVsyXSBmb3IgbSBpbiBtZWFuc1sxOl1dCisgICAgICAgICAgICBiID0gW21bM10gZm9yIG0gaW4gbWVhbnNbMTpdXQorCisgICAgICAgICAgICBweWxhYi5wbG90KGVfdGVzdF9tcywgciwgInIuLSIpCisgICAgICAgICAgICBweWxhYi5wbG90KGVfdGVzdF9tcywgYiwgImIuLSIpCisgICAgICAgICAgICBweWxhYi5wbG90KGVfdGVzdF9tcywgZ3IsICJnLi0iKQorICAgICAgICAgICAgcHlsYWIucGxvdChlX3Rlc3RfbXMsIGdiLCAiay4tIikKKyAgICAgICAgICAgIHB5bGFiLnhzY2FsZSgibG9nIikKKyAgICAgICAgICAgIHB5bGFiLnlzY2FsZSgibG9nIikKKyAgICAgICAgICAgIHB5bGFiLnRpdGxlKCIlcyBJU089JWQiICUgKE5BTUUsIHMpKQorICAgICAgICAgICAgcHlsYWIueGxhYmVsKCJFeHBvc3VyZSB0aW1lIChtcykiKQorICAgICAgICAgICAgcHlsYWIueWxhYmVsKCJDZW50ZXIgcGF0Y2ggcGl4ZWwgbWVhbiIpCisgICAgICAgICAgICBtYXRwbG90bGliLnB5cGxvdC5zYXZlZmlnKCIlc19zPSVkLnBuZyIgJSAoTkFNRSwgcykpCisgICAgICAgICAgICBweWxhYi5jbGYoKQorCisgICAgICAgICAgICBhbGxvd191bmRlcl9zYXR1cmF0ZWQgPSBUcnVlCisgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMSwgbGVuKG1lYW5zKSk6CisgICAgICAgICAgICAgICAgcHJldl9tZWFuID0gbWVhbnNbaS0xXQorICAgICAgICAgICAgICAgIG1lYW4gPSBtZWFuc1tpXQorCisgICAgICAgICAgICAgICAgaWYgbnAuaXNjbG9zZShtYXgobWVhbiksIHdoaXRlX2xldmVsLCBydG9sPVNBVFVSQVRJT05fVE9MKToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgIlNhdHVyYXRlZDogd2hpdGVfbGV2ZWwgJWYsIG1heF9tZWFuICVmIiUgKHdoaXRlX2xldmVsLCBtYXgobWVhbikpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgICAgICBpZiBhbGxvd191bmRlcl9zYXR1cmF0ZWQgYW5kIG5wLmFsbGNsb3NlKG1lYW4sIGJsYWNrX2xldmVscywgcnRvbD1CTEtfTFZMX1RPTCk6CisgICAgICAgICAgICAgICAgICAgICMgQWxsIGNoYW5uZWwgbWVhbnMgYXJlIGNsb3NlIHRvIGJsYWNrIGxldmVsCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICBhbGxvd191bmRlcl9zYXR1cmF0ZWQgPSBGYWxzZQorICAgICAgICAgICAgICAgICMgQ2hlY2sgcGl4ZWwgbWVhbnMgYXJlIGluY3JlYXNpbmcgKHdpdGggc21hbGwgdG9sZXJhbmNlKQorICAgICAgICAgICAgICAgIGNoYW5uZWxzID0gWyJSZWQiLCAiR3IiLCAiR2IiLCAiQmx1ZSJdCisgICAgICAgICAgICAgICAgZm9yIGNoYW4gaW4gcmFuZ2UoNCk6CisgICAgICAgICAgICAgICAgICAgIGVycl9tc2cgPSAiSVNPPSVkLCAlcywgZXhwdGltZSAlM2ZtcyBtZWFuOiAlLjJmLCAlcyBtZWFuOiAlLjJmLCBUT0w9JS5mJSUiICUgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMsIGNoYW5uZWxzW2NoYW5dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVfdGVzdF9tc1tpLTFdLCBtZWFuW2NoYW5dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJibGFjayBsZXZlbCIgaWYgaSA9PSAxIGVsc2UgImV4cHRpbWUgJTNmbXMiJWVfdGVzdF9tc1tpLTJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZfbWVhbltjaGFuXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkNSRUFTSU5HX1RIUioxMDApCisgICAgICAgICAgICAgICAgICAgIGFzc2VydCBtZWFuW2NoYW5dID4gcHJldl9tZWFuW2NoYW5dICogSU5DUkVBU0lOR19USFIsIGVycl9tc2cKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMS90ZXN0X3Jhd19zZW5zaXRpdml0eS5weSBiL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMS90ZXN0X3Jhd19zZW5zaXRpdml0eS5weQppbmRleCA2ZGFjMjA2Li5kYjY5ZTM2IDEwMDY0NAotLS0gYS9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTEvdGVzdF9yYXdfc2Vuc2l0aXZpdHkucHkKKysrIGIvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmUxL3Rlc3RfcmF3X3NlbnNpdGl2aXR5LnB5CkBAIC0zNyw3ICszNyw4IEBACiAgICAgICAgIGl0cy5jYXBzLnNraXBfdW5sZXNzKGl0cy5jYXBzLnJhdzE2KHByb3BzKSBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRzLmNhcHMubWFudWFsX3NlbnNvcihwcm9wcykgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0cy5jYXBzLnJlYWRfM2EocHJvcHMpIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdHMuY2Fwcy5wZXJfZnJhbWVfY29udHJvbChwcm9wcykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0cy5jYXBzLnBlcl9mcmFtZV9jb250cm9sKHByb3BzKSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGl0cy5jYXBzLm1vbm9fY2FtZXJhKHByb3BzKSkKICAgICAgICAgZGVidWcgPSBpdHMuY2Fwcy5kZWJ1Z19tb2RlKCkKIAogICAgICAgICAjIEV4cG9zZSBmb3IgdGhlIHNjZW5lIHdpdGggbWluIHNlbnNpdGl2aXR5CkBAIC02NywxMCArNjgsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5BTUUsIHMsIHZhcikpCiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICMgR2V0IHRoZSBhY3RpdmUgYXJyYXkgd2lkdGggYW5kIGhlaWdodC4KLSAgICAgICAgICAgICAgICBhYXggPSBwcm9wc1siYW5kcm9pZC5zZW5zb3IuaW5mby5hY3RpdmVBcnJheVNpemUiXVsibGVmdCJdCi0gICAgICAgICAgICAgICAgYWF5ID0gcHJvcHNbImFuZHJvaWQuc2Vuc29yLmluZm8uYWN0aXZlQXJyYXlTaXplIl1bInRvcCJdCi0gICAgICAgICAgICAgICAgYWF3ID0gcHJvcHNbImFuZHJvaWQuc2Vuc29yLmluZm8uYWN0aXZlQXJyYXlTaXplIl1bInJpZ2h0Il0tYWF4Ci0gICAgICAgICAgICAgICAgYWFoID0gcHJvcHNbImFuZHJvaWQuc2Vuc29yLmluZm8uYWN0aXZlQXJyYXlTaXplIl1bImJvdHRvbSJdLWFheQorICAgICAgICAgICAgICAgIGFheCA9IHByb3BzWyJhbmRyb2lkLnNlbnNvci5pbmZvLnByZUNvcnJlY3Rpb25BY3RpdmVBcnJheVNpemUiXVsibGVmdCJdCisgICAgICAgICAgICAgICAgYWF5ID0gcHJvcHNbImFuZHJvaWQuc2Vuc29yLmluZm8ucHJlQ29ycmVjdGlvbkFjdGl2ZUFycmF5U2l6ZSJdWyJ0b3AiXQorICAgICAgICAgICAgICAgIGFhdyA9IHByb3BzWyJhbmRyb2lkLnNlbnNvci5pbmZvLnByZUNvcnJlY3Rpb25BY3RpdmVBcnJheVNpemUiXVsicmlnaHQiXS1hYXgKKyAgICAgICAgICAgICAgICBhYWggPSBwcm9wc1siYW5kcm9pZC5zZW5zb3IuaW5mby5wcmVDb3JyZWN0aW9uQWN0aXZlQXJyYXlTaXplIl1bImJvdHRvbSJdLWFheQogICAgICAgICAgICAgICAgIHdoaXRlX2xldmVsID0gZmxvYXQocHJvcHNbImFuZHJvaWQuc2Vuc29yLmluZm8ud2hpdGVMZXZlbCJdKQogICAgICAgICAgICAgICAgIGNhcCA9IGNhbS5kb19jYXB0dXJlKHJlcSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ImZvcm1hdCI6ICJyYXdTdGF0cyIsCmRpZmYgLS1naXQgYS9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTEvdGVzdF90b25lbWFwX3NlcXVlbmNlLnB5IGIvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmUxL3Rlc3RfdG9uZW1hcF9zZXF1ZW5jZS5weQppbmRleCAyYjVmMDk0Li5hN2I5ZjZkIDEwMDY0NAotLS0gYS9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTEvdGVzdF90b25lbWFwX3NlcXVlbmNlLnB5CisrKyBiL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMS90ZXN0X3RvbmVtYXBfc2VxdWVuY2UucHkKQEAgLTMzLDcgKzMzLDggQEAKICAgICAgICAgcHJvcHMgPSBjYW0uZ2V0X2NhbWVyYV9wcm9wZXJ0aWVzKCkKICAgICAgICAgaXRzLmNhcHMuc2tpcF91bmxlc3MoaXRzLmNhcHMubWFudWFsX3NlbnNvcihwcm9wcykgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0cy5jYXBzLm1hbnVhbF9wb3N0X3Byb2MocHJvcHMpIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdHMuY2Fwcy5wZXJfZnJhbWVfY29udHJvbChwcm9wcykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0cy5jYXBzLnBlcl9mcmFtZV9jb250cm9sKHByb3BzKSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGl0cy5jYXBzLm1vbm9fY2FtZXJhKHByb3BzKSkKIAogICAgICAgICBkZWJ1ZyA9IGl0cy5jYXBzLmRlYnVnX21vZGUoKQogICAgICAgICBsYXJnZXN0X3l1diA9IGl0cy5vYmplY3RzLmdldF9sYXJnZXN0X3l1dl9mb3JtYXQocHJvcHMpCmRpZmYgLS1naXQgYS9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTEvdGVzdF95dXZfcGx1c19kbmcucHkgYi9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTEvdGVzdF95dXZfcGx1c19kbmcucHkKaW5kZXggMjY4YjY0YS4uNGE2MjEyMCAxMDA2NDQKLS0tIGEvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmUxL3Rlc3RfeXV2X3BsdXNfZG5nLnB5CisrKyBiL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMS90ZXN0X3l1dl9wbHVzX2RuZy5weQpAQCAtMjcsOCArMjcsOSBAQAogICAgICAgICBwcm9wcyA9IGNhbS5nZXRfY2FtZXJhX3Byb3BlcnRpZXMoKQogICAgICAgICBpdHMuY2Fwcy5za2lwX3VubGVzcyhpdHMuY2Fwcy5yYXcocHJvcHMpIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdHMuY2Fwcy5yZWFkXzNhKHByb3BzKSkKKyAgICAgICAgbW9ub19jYW1lcmEgPSBpdHMuY2Fwcy5tb25vX2NhbWVyYShwcm9wcykKIAotICAgICAgICBjYW0uZG9fM2EoKQorICAgICAgICBjYW0uZG9fM2EobW9ub19jYW1lcmE9bW9ub19jYW1lcmEpCiAKICAgICAgICAgcmVxID0gaXRzLm9iamVjdHMuYXV0b19jYXB0dXJlX3JlcXVlc3QoKQogICAgICAgICBtYXhfZG5nX3NpemUgPSBcCmRpZmYgLS1naXQgYS9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTEvdGVzdF95dXZfcGx1c19yYXcucHkgYi9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTEvdGVzdF95dXZfcGx1c19yYXcucHkKaW5kZXggZGQ3ZWYyMS4uMGM1Yjc4YiAxMDA2NDQKLS0tIGEvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmUxL3Rlc3RfeXV2X3BsdXNfcmF3LnB5CisrKyBiL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMS90ZXN0X3l1dl9wbHVzX3Jhdy5weQpAQCAtMzEsNyArMzEsOCBAQAogICAgICAgICBwcm9wcyA9IGNhbS5nZXRfY2FtZXJhX3Byb3BlcnRpZXMoKQogICAgICAgICBpdHMuY2Fwcy5za2lwX3VubGVzcyhpdHMuY2Fwcy5jb21wdXRlX3RhcmdldF9leHBvc3VyZShwcm9wcykgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0cy5jYXBzLnJhdzE2KHByb3BzKSBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRzLmNhcHMucGVyX2ZyYW1lX2NvbnRyb2wocHJvcHMpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdHMuY2Fwcy5wZXJfZnJhbWVfY29udHJvbChwcm9wcykgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBpdHMuY2Fwcy5tb25vX2NhbWVyYShwcm9wcykpCiAKICAgICAgICAgIyBVc2UgYSBtYW51YWwgcmVxdWVzdCB3aXRoIGEgbGluZWFyIHRvbmVtYXAgc28gdGhhdCB0aGUgWVVWIGFuZCBSQVcKICAgICAgICAgIyBzaG91bGQgbG9vayB0aGUgc2FtZSAob25jZSBjb252ZXJ0ZWQgYnkgdGhlIGl0cy5pbWFnZSBtb2R1bGUpLgpkaWZmIC0tZ2l0IGEvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmUxL3Rlc3RfeXV2X3BsdXNfcmF3MTAucHkgYi9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTEvdGVzdF95dXZfcGx1c19yYXcxMC5weQppbmRleCA5YzBjNjliLi42ZTcwMGI3IDEwMDY0NAotLS0gYS9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTEvdGVzdF95dXZfcGx1c19yYXcxMC5weQorKysgYi9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTEvdGVzdF95dXZfcGx1c19yYXcxMC5weQpAQCAtMzEsNyArMzEsOCBAQAogICAgICAgICBwcm9wcyA9IGNhbS5nZXRfY2FtZXJhX3Byb3BlcnRpZXMoKQogICAgICAgICBpdHMuY2Fwcy5za2lwX3VubGVzcyhpdHMuY2Fwcy5jb21wdXRlX3RhcmdldF9leHBvc3VyZShwcm9wcykgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0cy5jYXBzLnJhdzEwKHByb3BzKSBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRzLmNhcHMucGVyX2ZyYW1lX2NvbnRyb2wocHJvcHMpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdHMuY2Fwcy5wZXJfZnJhbWVfY29udHJvbChwcm9wcykgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBpdHMuY2Fwcy5tb25vX2NhbWVyYShwcm9wcykpCiAKICAgICAgICAgIyBVc2UgYSBtYW51YWwgcmVxdWVzdCB3aXRoIGEgbGluZWFyIHRvbmVtYXAgc28gdGhhdCB0aGUgWVVWIGFuZCBSQVcKICAgICAgICAgIyBzaG91bGQgbG9vayB0aGUgc2FtZSAob25jZSBjb252ZXJ0ZWQgYnkgdGhlIGl0cy5pbWFnZSBtb2R1bGUpLgpkaWZmIC0tZ2l0IGEvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmUxL3Rlc3RfeXV2X3BsdXNfcmF3MTIucHkgYi9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTEvdGVzdF95dXZfcGx1c19yYXcxMi5weQppbmRleCA4MDcwNzg1Li5jZDI4NGI3IDEwMDY0NAotLS0gYS9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTEvdGVzdF95dXZfcGx1c19yYXcxMi5weQorKysgYi9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTEvdGVzdF95dXZfcGx1c19yYXcxMi5weQpAQCAtMzEsNyArMzEsOCBAQAogICAgICAgICBwcm9wcyA9IGNhbS5nZXRfY2FtZXJhX3Byb3BlcnRpZXMoKQogICAgICAgICBpdHMuY2Fwcy5za2lwX3VubGVzcyhpdHMuY2Fwcy5jb21wdXRlX3RhcmdldF9leHBvc3VyZShwcm9wcykgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0cy5jYXBzLnJhdzEyKHByb3BzKSBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRzLmNhcHMucGVyX2ZyYW1lX2NvbnRyb2wocHJvcHMpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdHMuY2Fwcy5wZXJfZnJhbWVfY29udHJvbChwcm9wcykgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBpdHMuY2Fwcy5tb25vX2NhbWVyYShwcm9wcykpCiAKICAgICAgICAgIyBVc2UgYSBtYW51YWwgcmVxdWVzdCB3aXRoIGEgbGluZWFyIHRvbmVtYXAgc28gdGhhdCB0aGUgWVVWIGFuZCBSQVcKICAgICAgICAgIyBzaG91bGQgbG9vayB0aGUgc2FtZSAob25jZSBjb252ZXJ0ZWQgYnkgdGhlIGl0cy5pbWFnZSBtb2R1bGUpLgpkaWZmIC0tZ2l0IGEvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmUyL3Rlc3RfZmFjZXMucHkgYi9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTIvdGVzdF9mYWNlcy5weQppbmRleCA0ZTMwZmMxLi4xNmVjNzgwIDEwMDY0NAotLS0gYS9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTIvdGVzdF9mYWNlcy5weQorKysgYi9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTIvdGVzdF9mYWNlcy5weQpAQCAtMzAsMTEgKzMwLDE0IEBACiAKICAgICB3aXRoIGl0cy5kZXZpY2UuSXRzU2Vzc2lvbigpIGFzIGNhbToKICAgICAgICAgcHJvcHMgPSBjYW0uZ2V0X2NhbWVyYV9wcm9wZXJ0aWVzKCkKKyAgICAgICAgaXRzLmNhcHMuc2tpcF91bmxlc3MoaXRzLmNhcHMuZmFjZV9kZXRlY3QocHJvcHMpKQorICAgICAgICBtb25vX2NhbWVyYSA9IGl0cy5jYXBzLm1vbm9fY2FtZXJhKHByb3BzKQogICAgICAgICBmZF9tb2RlcyA9IHByb3BzWydhbmRyb2lkLnN0YXRpc3RpY3MuaW5mby5hdmFpbGFibGVGYWNlRGV0ZWN0TW9kZXMnXQogICAgICAgICBhID0gcHJvcHNbJ2FuZHJvaWQuc2Vuc29yLmluZm8uYWN0aXZlQXJyYXlTaXplJ10KICAgICAgICAgYXcsIGFoID0gYVsncmlnaHQnXSAtIGFbJ2xlZnQnXSwgYVsnYm90dG9tJ10gLSBhWyd0b3AnXQogICAgICAgICBpZiBpdHMuY2Fwcy5yZWFkXzNhKHByb3BzKToKLSAgICAgICAgICAgIGdhaW4sIGV4cCwgXywgXywgZm9jdXMgPSBjYW0uZG9fM2EoZ2V0X3Jlc3VsdHM9VHJ1ZSkKKyAgICAgICAgICAgIGdhaW4sIGV4cCwgXywgXywgZm9jdXMgPSBjYW0uZG9fM2EoZ2V0X3Jlc3VsdHM9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9ub19jYW1lcmE9bW9ub19jYW1lcmEpCiAgICAgICAgICAgICBwcmludCAnaXNvID0gJWQnICUgZ2FpbgogICAgICAgICAgICAgcHJpbnQgJ2V4cCA9ICUuMmZtcycgJSAoZXhwKjEuMEUtNikKICAgICAgICAgICAgIGlmIGZvY3VzID09IDAuMDoKQEAgLTYwLDcgKzYzLDcgQEAKICAgICAgICAgICAgICAgICAjIGJ1dCBpdCBzaG91bGQgZGV0ZWN0IGF0IGxlYXN0IG9uZSBmYWNlIGluIGxhc3QgZnJhbWUKICAgICAgICAgICAgICAgICBpZiBpID09IE5VTV9URVNUX0ZSQU1FUyAtIDE6CiAgICAgICAgICAgICAgICAgICAgIGltZyA9IGl0cy5pbWFnZS5jb252ZXJ0X2NhcHR1cmVfdG9fcmdiX2ltYWdlKGNhcCwgcHJvcHM9cHJvcHMpCi0gICAgICAgICAgICAgICAgICAgIGltZyA9IGl0cy5pbWFnZS5mbGlwX21pcnJvcl9pbWdfcGVyX2FyZ3YoaW1nKQorICAgICAgICAgICAgICAgICAgICBpbWcgPSBpdHMuaW1hZ2Uucm90YXRlX2ltZ19wZXJfYXJndihpbWcpCiAgICAgICAgICAgICAgICAgICAgIGltZ19uYW1lID0gIiVzX2ZkX21vZGVfJXMuanBnIiAlIChOQU1FLCBmZF9tb2RlKQogICAgICAgICAgICAgICAgICAgICBpdHMuaW1hZ2Uud3JpdGVfaW1hZ2UoaW1nLCBpbWdfbmFtZSkKICAgICAgICAgICAgICAgICAgICAgaWYgbGVuKGZhY2VzKSA9PSAwOgpkaWZmIC0tZ2l0IGEvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmUyL3Rlc3RfbnVtX2ZhY2VzLnB5IGIvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmUyL3Rlc3RfbnVtX2ZhY2VzLnB5CmluZGV4IDE2ZTUzYWQuLjA0NGMxNTQgMTAwNjQ0Ci0tLSBhL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMi90ZXN0X251bV9mYWNlcy5weQorKysgYi9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTIvdGVzdF9udW1fZmFjZXMucHkKQEAgLTMyLDEyICszMiwxNSBAQAogICAgICIiIlRlc3QgZmFjZSBkZXRlY3Rpb24uIiIiCiAgICAgd2l0aCBpdHMuZGV2aWNlLkl0c1Nlc3Npb24oKSBhcyBjYW06CiAgICAgICAgIHByb3BzID0gY2FtLmdldF9jYW1lcmFfcHJvcGVydGllcygpCisgICAgICAgIGl0cy5jYXBzLnNraXBfdW5sZXNzKGl0cy5jYXBzLmZhY2VfZGV0ZWN0KHByb3BzKSkKKyAgICAgICAgbW9ub19jYW1lcmEgPSBpdHMuY2Fwcy5tb25vX2NhbWVyYShwcm9wcykKICAgICAgICAgZmRfbW9kZXMgPSBwcm9wc1snYW5kcm9pZC5zdGF0aXN0aWNzLmluZm8uYXZhaWxhYmxlRmFjZURldGVjdE1vZGVzJ10KICAgICAgICAgYSA9IHByb3BzWydhbmRyb2lkLnNlbnNvci5pbmZvLmFjdGl2ZUFycmF5U2l6ZSddCiAgICAgICAgIGF3LCBhaCA9IGFbJ3JpZ2h0J10gLSBhWydsZWZ0J10sIGFbJ2JvdHRvbSddIC0gYVsndG9wJ10KIAogICAgICAgICBpZiBpdHMuY2Fwcy5yZWFkXzNhKHByb3BzKToKLSAgICAgICAgICAgIF8sIF8sIF8sIF8sIF8gPSBjYW0uZG9fM2EoZ2V0X3Jlc3VsdHM9VHJ1ZSkKKyAgICAgICAgICAgIF8sIF8sIF8sIF8sIF8gPSBjYW0uZG9fM2EoZ2V0X3Jlc3VsdHM9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9ub19jYW1lcmE9bW9ub19jYW1lcmEpCiAKICAgICAgICAgZm9yIGZkX21vZGUgaW4gZmRfbW9kZXM6CiAgICAgICAgICAgICBhc3NlcnQgRkRfTU9ERV9PRkYgPD0gZmRfbW9kZSA8PSBGRF9NT0RFX0ZVTEwKZGlmZiAtLWdpdCBhL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMy90ZXN0XzNhX2NvbnNpc3RlbmN5LnB5IGIvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmUzL3Rlc3RfM2FfY29uc2lzdGVuY3kucHkKaW5kZXggZjQzYjNlYi4uZTg2ZGE0MiAxMDA2NDQKLS0tIGEvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmUzL3Rlc3RfM2FfY29uc2lzdGVuY3kucHkKKysrIGIvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmUzL3Rlc3RfM2FfY29uc2lzdGVuY3kucHkKQEAgLTIwLDggKzIwLDcgQEAKIAogR0dBSU5fVE9MID0gMC4xCiBGRF9UT0wgPSAwLjEKLVNFTlNfVE9MID0gMC4xCi1FWFBfVE9MID0gMC4xCitJU09fRVhQX1RPTCA9IDAuMQogTlVNX1RFU1RfSVRFUkFUSU9OUyA9IDMKIAogCkBAIC0zNCwyOSArMzMsMzIgQEAKICAgICB3aXRoIGl0cy5kZXZpY2UuSXRzU2Vzc2lvbigpIGFzIGNhbToKICAgICAgICAgcHJvcHMgPSBjYW0uZ2V0X2NhbWVyYV9wcm9wZXJ0aWVzKCkKICAgICAgICAgaXRzLmNhcHMuc2tpcF91bmxlc3MoaXRzLmNhcHMucmVhZF8zYShwcm9wcykpCisgICAgICAgIG1vbm9fY2FtZXJhID0gaXRzLmNhcHMubW9ub19jYW1lcmEocHJvcHMpCiAKLSAgICAgICAgZXhwcyA9IFtdCi0gICAgICAgIHNlbnNlcyA9IFtdCisgICAgICAgIGlzb19leHBzID0gW10KICAgICAgICAgZ19nYWlucyA9IFtdCiAgICAgICAgIGZkcyA9IFtdCiAgICAgICAgIGZvciBfIGluIHJhbmdlKE5VTV9URVNUX0lURVJBVElPTlMpOgogICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHMsIGUsIGcsIHhmb3JtLCBmZCA9IGNhbS5kb18zYShnZXRfcmVzdWx0cz1UcnVlKQotICAgICAgICAgICAgICAgIHByaW50ICcgc2Vuc2l0aXZpdHknLCBzLCAnZXhwb3N1cmUnLCBlCi0gICAgICAgICAgICAgICAgcHJpbnQgJyBnYWlucycsIGcsICd0cmFuc2Zvcm0nLCB4Zm9ybQorICAgICAgICAgICAgICAgIHMsIGUsIGdhaW5zLCB4Zm9ybSwgZmQgPSBjYW0uZG9fM2EoZ2V0X3Jlc3VsdHM9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbm9fY2FtZXJhPW1vbm9fY2FtZXJhKQorICAgICAgICAgICAgICAgIHByaW50ICcgaXNvOiAlZCwgZXhwb3N1cmU6ICVkLCBpc28qZXhwOiAlZCcgJSAocywgZSwgZSpzKQorICAgICAgICAgICAgICAgIHByaW50ICcgYXdiX2dhaW5zJywgZ2FpbnMsICdhd2JfdHJhbnNmb3JtJywgeGZvcm0KICAgICAgICAgICAgICAgICBwcmludCAnIGZkJywgZmQKICAgICAgICAgICAgICAgICBwcmludCAnJwotICAgICAgICAgICAgICAgIGV4cHMuYXBwZW5kKGUpCi0gICAgICAgICAgICAgICAgc2Vuc2VzLmFwcGVuZChzKQotICAgICAgICAgICAgICAgIGdfZ2FpbnMuYXBwZW5kKGdbMl0pCisgICAgICAgICAgICAgICAgaXNvX2V4cHMuYXBwZW5kKGUqcykKKyAgICAgICAgICAgICAgICBnX2dhaW5zLmFwcGVuZChnYWluc1syXSkKICAgICAgICAgICAgICAgICBmZHMuYXBwZW5kKGZkKQogICAgICAgICAgICAgZXhjZXB0IGl0cy5lcnJvci5FcnJvcjoKICAgICAgICAgICAgICAgICBwcmludCAnIEZBSUxcbicKLSAgICAgICAgYXNzZXJ0IGxlbihleHBzKSA9PSBOVU1fVEVTVF9JVEVSQVRJT05TCi0gICAgICAgIGFzc2VydCBucC5pc2Nsb3NlKG5wLmFtYXgoZXhwcyksIG5wLmFtaW4oZXhwcyksIEVYUF9UT0wpCi0gICAgICAgIGFzc2VydCBucC5pc2Nsb3NlKG5wLmFtYXgoc2Vuc2VzKSwgbnAuYW1pbihzZW5zZXMpLCBTRU5TX1RPTCkKKyAgICAgICAgYXNzZXJ0IGxlbihpc29fZXhwcykgPT0gTlVNX1RFU1RfSVRFUkFUSU9OUworICAgICAgICBhc3NlcnQgbnAuaXNjbG9zZShucC5hbWF4KGlzb19leHBzKSwgbnAuYW1pbihpc29fZXhwcyksIElTT19FWFBfVE9MKQogICAgICAgICBhc3NlcnQgbnAuaXNjbG9zZShucC5hbWF4KGdfZ2FpbnMpLCBucC5hbWluKGdfZ2FpbnMpLCBHR0FJTl9UT0wpCiAgICAgICAgIGFzc2VydCBucC5pc2Nsb3NlKG5wLmFtYXgoZmRzKSwgbnAuYW1pbihmZHMpLCBGRF9UT0wpCisgICAgICAgIGZvciBnIGluIGdhaW5zOgorICAgICAgICAgICAgYXNzZXJ0IG5vdCBucC5pc25hbihnKQorICAgICAgICBmb3IgeCBpbiB4Zm9ybToKKyAgICAgICAgICAgIGFzc2VydCBub3QgbnAuaXNuYW4oeCkKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICBtYWluKCkKZGlmZiAtLWdpdCBhL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMy90ZXN0X2VkZ2VfZW5oYW5jZW1lbnQucHkgYi9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTMvdGVzdF9lZGdlX2VuaGFuY2VtZW50LnB5CmluZGV4IDM3ZTFkNjMuLjc2MDkzZWYgMTAwNjQ0Ci0tLSBhL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMy90ZXN0X2VkZ2VfZW5oYW5jZW1lbnQucHkKKysrIGIvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmUzL3Rlc3RfZWRnZV9lbmhhbmNlbWVudC5weQpAQCAtODgsMTIgKzg4LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0cy5jYXBzLnBlcl9mcmFtZV9jb250cm9sKHByb3BzKSBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRzLmNhcHMuZWRnZV9tb2RlKHByb3BzLCAwKSkKIAorICAgICAgICBtb25vX2NhbWVyYSA9IGl0cy5jYXBzLm1vbm9fY2FtZXJhKHByb3BzKQogICAgICAgICB0ZXN0X2ZtdCA9ICJ5dXYiCiAgICAgICAgIHNpemUgPSBpdHMub2JqZWN0cy5nZXRfYXZhaWxhYmxlX291dHB1dF9zaXplcyh0ZXN0X2ZtdCwgcHJvcHMpWzBdCiAgICAgICAgIG91dF9zdXJmYWNlID0geyJ3aWR0aCI6c2l6ZVswXSwgImhlaWdodCI6c2l6ZVsxXSwgImZvcm1hdCI6dGVzdF9mbXR9CiAKICAgICAgICAgIyBHZXQgcHJvcGVyIHNlbnNpdGl2aXR5LCBleHBvc3VyZSB0aW1lLCBhbmQgZm9jdXMgZGlzdGFuY2UuCi0gICAgICAgIHMsZSxfLF8sZmQgPSBjYW0uZG9fM2EoZ2V0X3Jlc3VsdHM9VHJ1ZSkKKyAgICAgICAgcyxlLF8sXyxmZCA9IGNhbS5kb18zYShnZXRfcmVzdWx0cz1UcnVlLCBtb25vX2NhbWVyYT1tb25vX2NhbWVyYSkKIAogICAgICAgICAjIEdldCB0aGUgc2hhcnBuZXNzIGZvciBlYWNoIGVkZ2UgbW9kZSBmb3IgcmVndWxhciByZXF1ZXN0cwogICAgICAgICBzaGFycG5lc3NfcmVndWxhciA9IFtdCmRpZmYgLS1naXQgYS9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTMvdGVzdF9mbGlwX21pcnJvci5weSBiL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMy90ZXN0X2ZsaXBfbWlycm9yLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NDJlMGIKLS0tIC9kZXYvbnVsbAorKysgYi9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTMvdGVzdF9mbGlwX21pcnJvci5weQpAQCAtMCwwICsxLDE0MCBAQAorIyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAnTGljZW5zZScpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICdBUyBJUycgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbXBvcnQgb3MKK2ltcG9ydCBjdjIKKworaW1wb3J0IGl0cy5jYXBzCitpbXBvcnQgaXRzLmN2MmltYWdlCitpbXBvcnQgaXRzLmRldmljZQoraW1wb3J0IGl0cy5pbWFnZQoraW1wb3J0IGl0cy5vYmplY3RzCitpbXBvcnQgbnVtcHkgYXMgbnAKKworTkFNRSA9IG9zLnBhdGguYmFzZW5hbWUoX19maWxlX18pLnNwbGl0KCcuJylbMF0KK0NIQVJUX0ZJTEUgPSBvcy5wYXRoLmpvaW4ob3MuZW52aXJvblsnQ0FNRVJBX0lUU19UT1AnXSwgJ3B5bW9kdWxlcycsICdpdHMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdF9pbWFnZXMnLCAnSVNPMTIyMzMucG5nJykKK0NIQVJUX0hFSUdIVCA9IDEzLjUgICMgY20KK0NIQVJUX0RJU1RBTkNFID0gMzAuMCAgIyBjbQorQ0hBUlRfU0NBTEVfU1RBUlQgPSAwLjY1CitDSEFSVF9TQ0FMRV9TVE9QID0gMS4zNQorQ0hBUlRfU0NBTEVfU1RFUCA9IDAuMDI1CitDSEFSVF9PUklFTlRBVElPTlMgPSBbJ25vbWluYWwnLCAnZmxpcCcsICdtaXJyb3InLCAncm90YXRlJ10KK1ZHQV9XSURUSCA9IDY0MAorVkdBX0hFSUdIVCA9IDQ4MAorKFhfQ1JPUCwgWV9DUk9QKSA9ICgwLjUsIDAuNSkgICMgY3JvcCBjZW50ZXIgYXJlYSBvZiBJU08xMjIzMyBjaGFydAorCisKK2RlZiB0ZXN0X2ZsaXBfbWlycm9yKGNhbSwgcHJvcHMsIGZtdCwgY2hhcnQpOgorICAgICIiIlJldHVybiBpZiBpbWFnZSBpcyBmbGlwcGVkIG9yIG1pcnJvcmVkLgorCisgICAgQXJnczoKKyAgICAgICAgY2FtIChjbGFzcyk6IEFuIG9wZW4gZGV2aWNlIHNlc3Npb24KKyAgICAgICAgcHJvcHMgKGNsYXNzKTogUHJvcGVydGllcyBvZiBjYW0KKyAgICAgICAgZm10IChkaWN0KTogQ2FwdHVyZSBmb3JtYXQKKyAgICAgICAgY2hhcnQgKGNsYXNzKTogT2JqZWN0IHdpdGggY2hhcnQgcHJvcGVydGllcworCisgICAgUmV0dXJuczoKKyAgICAgICAgYm9vbGVhbjogVHJ1ZSBpZiBmbGlwcGVkLCBGYWxzZSBpZiBub3QKKyAgICAiIiIKKworICAgICMgZGV0ZXJtaW5lIGlmIG1vbm9jaHJvbWUgY2FtZXJhCisgICAgbW9ub19jYW1lcmEgPSBpdHMuY2Fwcy5tb25vX2NhbWVyYShwcm9wcykKKworICAgICMgZGV0ZXJtaW5lIGlmIGluIGRlYnVnIG1vZGUKKyAgICBkZWJ1ZyA9IGl0cy5jYXBzLmRlYnVnX21vZGUoKQorCisgICAgIyBnZXQgYSBsb2NhbCBjb3B5IG9mIHRoZSBjaGFydCB0ZW1wbGF0ZQorICAgIHRlbXBsYXRlID0gY3YyLmltcmVhZChDSEFSVF9GSUxFLCBjdjIuSU1SRUFEX0FOWURFUFRIKQorCisgICAgIyB0YWtlIGltZywgY3JvcCBjaGFydCwgc2NhbGUgYW5kIHByZXAgZm9yIGN2MiB0ZW1wbGF0ZSBtYXRjaAorICAgIHMsIGUsIF8sIF8sIGZkID0gY2FtLmRvXzNhKGdldF9yZXN1bHRzPVRydWUsIG1vbm9fY2FtZXJhPW1vbm9fY2FtZXJhKQorICAgIHJlcSA9IGl0cy5vYmplY3RzLm1hbnVhbF9jYXB0dXJlX3JlcXVlc3QocywgZSwgZmQpCisgICAgY2FwID0gY2FtLmRvX2NhcHR1cmUocmVxLCBmbXQpCisgICAgeSwgXywgXyA9IGl0cy5pbWFnZS5jb252ZXJ0X2NhcHR1cmVfdG9fcGxhbmVzKGNhcCwgcHJvcHMpCisgICAgeSA9IGl0cy5pbWFnZS5yb3RhdGVfaW1nX3Blcl9hcmd2KHkpCisgICAgcGF0Y2ggPSBpdHMuaW1hZ2UuZ2V0X2ltYWdlX3BhdGNoKHksIGNoYXJ0Lnhub3JtLCBjaGFydC55bm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnQud25vcm0sIGNoYXJ0Lmhub3JtKQorICAgIHBhdGNoID0gMjU1ICogaXRzLmN2MmltYWdlLmdyYXlfc2NhbGVfaW1nKHBhdGNoKQorICAgIHBhdGNoID0gaXRzLmN2MmltYWdlLnNjYWxlX2ltZyhwYXRjaC5hc3R5cGUobnAudWludDgpLCBjaGFydC5zY2FsZSkKKworICAgICMgc2FuaXR5IGNoZWNrIG9uIGltYWdlCisgICAgYXNzZXJ0IG5wLm1heChwYXRjaCktbnAubWluKHBhdGNoKSA+IDI1NS84CisKKyAgICAjIHNhdmUgZnVsbCBpbWFnZXMgaWYgaW4gZGVidWcKKyAgICBpZiBkZWJ1ZzoKKyAgICAgICAgaXRzLmltYWdlLndyaXRlX2ltYWdlKHRlbXBsYXRlWzosIDosIG5wLm5ld2F4aXNdLzI1NS4wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVzX3RlbXBsYXRlLmpwZycgJSBOQU1FKQorCisgICAgIyBzYXZlIHBhdGNoCisgICAgaXRzLmltYWdlLndyaXRlX2ltYWdlKHBhdGNoWzosIDosIG5wLm5ld2F4aXNdLzI1NS4wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnJXNfc2NlbmVfcGF0Y2guanBnJyAlIE5BTUUpCisKKyAgICAjIGNyb3AgY2VudGVyIGFyZWFzIGFuZCBzdHJpcCBvZmYgYW55IGV4dHJhIHJvd3MvY29sdW1ucworICAgIHRlbXBsYXRlID0gaXRzLmltYWdlLmdldF9pbWFnZV9wYXRjaCh0ZW1wbGF0ZSwgKDEtWF9DUk9QKS8yLCAoMS1ZX0NST1ApLzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhfQ1JPUCwgWV9DUk9QKQorICAgIHBhdGNoID0gaXRzLmltYWdlLmdldF9pbWFnZV9wYXRjaChwYXRjaCwgKDEtWF9DUk9QKS8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMS1ZX0NST1ApLzIsIFhfQ1JPUCwgWV9DUk9QKQorICAgIHBhdGNoID0gcGF0Y2hbMDptaW4ocGF0Y2guc2hhcGVbMF0sIHRlbXBsYXRlLnNoYXBlWzBdKSwKKyAgICAgICAgICAgICAgICAgIDA6bWluKHBhdGNoLnNoYXBlWzFdLCB0ZW1wbGF0ZS5zaGFwZVsxXSldCisgICAgY29tcF9jaGFydCA9IHBhdGNoCisKKyAgICAjIGRldGVybWluZSBvcHRpbXVtIG9yaWVudGF0aW9uCisgICAgb3B0cyA9IFtdCisgICAgZm9yIG9yaWVudGF0aW9uIGluIENIQVJUX09SSUVOVEFUSU9OUzoKKyAgICAgICAgaWYgb3JpZW50YXRpb24gPT0gJ2ZsaXAnOgorICAgICAgICAgICAgY29tcF9jaGFydCA9IG5wLmZsaXB1ZChwYXRjaCkKKyAgICAgICAgZWxpZiBvcmllbnRhdGlvbiA9PSAnbWlycm9yJzoKKyAgICAgICAgICAgIGNvbXBfY2hhcnQgPSBucC5mbGlwbHIocGF0Y2gpCisgICAgICAgIGVsaWYgb3JpZW50YXRpb24gPT0gJ3JvdGF0ZSc6CisgICAgICAgICAgICBjb21wX2NoYXJ0ID0gbnAuZmxpcHVkKG5wLmZsaXBscihwYXRjaCkpCisgICAgICAgIGNvcnJlbGF0aW9uID0gY3YyLm1hdGNoVGVtcGxhdGUoY29tcF9jaGFydCwgdGVtcGxhdGUsIGN2Mi5UTV9DQ09FRkYpCisgICAgICAgIF8sIG9wdF92YWwsIF8sIF8gPSBjdjIubWluTWF4TG9jKGNvcnJlbGF0aW9uKQorICAgICAgICBpZiBkZWJ1ZzoKKyAgICAgICAgICAgIGN2Mi5pbXdyaXRlKCclc18lcy5qcGcnICUgKE5BTUUsIG9yaWVudGF0aW9uKSwgY29tcF9jaGFydCkKKyAgICAgICAgcHJpbnQgJyAlcyBjb3JyZWxhdGlvbiB2YWx1ZTogJWQnICUgKG9yaWVudGF0aW9uLCBvcHRfdmFsKQorICAgICAgICBvcHRzLmFwcGVuZChvcHRfdmFsKQorCisgICAgIyBkZXRlcm1pbmUgaWYgJ25vbWluYWwnIG9yICdyb3RhdGVkJyBpcyBiZXN0IG9yaWVudGF0aW9uCisgICAgYXNzZXJ0X2ZsYWcgPSAob3B0c1swXSA9PSBtYXgob3B0cykgb3Igb3B0c1szXSA9PSBtYXgob3B0cykpCisgICAgYXNzZXJ0IGFzc2VydF9mbGFnLCAoJ09wdGltdW0gb3JpZW50YXRpb24gaXMgJXMnICUKKyAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSVF9PUklFTlRBVElPTlNbbnAuYXJnbWF4KG9wdHMpXSkKKyAgICAjIHByaW50IHdhcm5pbmcgaWYgcm90YXRlZAorICAgIGlmIG9wdHNbM10gPT0gbWF4KG9wdHMpOgorICAgICAgICBwcmludCAnSW1hZ2UgaXMgcm90YXRlZCAxODAgZGVncmVlcy4gVHJ5ICJyb3RhdGUiIGZsYWcuJworCisKK2RlZiBtYWluKCk6CisgICAgIiIiVGVzdCBpZiBpbWFnZSBpcyBwcm9wZXJseSBvcmllbnRlZC4iIiIKKworICAgIHByaW50ICdcblN0YXJ0aW5nIHRlc3RfZmxpcF9taXJyb3IucHknCisKKyAgICAjIGNoZWNrIHNraXAgY29uZGl0aW9ucworICAgIHdpdGggaXRzLmRldmljZS5JdHNTZXNzaW9uKCkgYXMgY2FtOgorICAgICAgICBwcm9wcyA9IGNhbS5nZXRfY2FtZXJhX3Byb3BlcnRpZXMoKQorICAgICAgICBpdHMuY2Fwcy5za2lwX3VubGVzcyhpdHMuY2Fwcy5yZWFkXzNhKHByb3BzKSkKKyAgICAjIGluaXRpYWxpemUgY2hhcnQgY2xhc3MgYW5kIGxvY2F0ZSBjaGFydCBpbiBzY2VuZQorICAgIGNoYXJ0ID0gaXRzLmN2MmltYWdlLkNoYXJ0KENIQVJUX0ZJTEUsIENIQVJUX0hFSUdIVCwgQ0hBUlRfRElTVEFOQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBUlRfU0NBTEVfU1RBUlQsIENIQVJUX1NDQUxFX1NUT1AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBUlRfU0NBTEVfU1RFUCkKKworICAgIHdpdGggaXRzLmRldmljZS5JdHNTZXNzaW9uKCkgYXMgY2FtOgorICAgICAgICBmbXQgPSB7J2Zvcm1hdCc6ICd5dXYnLCAnd2lkdGgnOiBWR0FfV0lEVEgsICdoZWlnaHQnOiBWR0FfSEVJR0hUfQorCisgICAgICAgICMgdGVzdCB0aGF0IGltYWdlIGlzIG5vdCBmbGlwcGVkLCBtaXJyb3JlZCwgb3Igcm90YXRlZAorICAgICAgICB0ZXN0X2ZsaXBfbWlycm9yKGNhbSwgcHJvcHMsIGZtdCwgY2hhcnQpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMy90ZXN0X2xlbnNfbW92ZW1lbnRfcmVwb3J0aW5nLnB5IGIvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmUzL3Rlc3RfbGVuc19tb3ZlbWVudF9yZXBvcnRpbmcucHkKaW5kZXggY2Q1NjNiZS4uNmZlYTYzMyAxMDA2NDQKLS0tIGEvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmUzL3Rlc3RfbGVuc19tb3ZlbWVudF9yZXBvcnRpbmcucHkKKysrIGIvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmUzL3Rlc3RfbGVuc19tb3ZlbWVudF9yZXBvcnRpbmcucHkKQEAgLTM3LDE5ICszNywyMCBAQAogQ0hBUlRfU0NBTEVfU1RFUCA9IDAuMDI1CiAKIAotZGVmIHRlc3RfbGVuc19tb3ZlbWVudF9yZXBvcnRpbmcoY2FtLCBwcm9wcywgZm10LCBzZW5zaXRpdml0eSwgZXhwLCBhZl9mZCk6CitkZWYgdGVzdF9sZW5zX21vdmVtZW50X3JlcG9ydGluZyhjYW0sIHByb3BzLCBmbXQsIGdhaW4sIGV4cCwgYWZfZmQsIGNoYXJ0KToKICAgICAiIiJSZXR1cm4gZmQsIHNoYXJwbmVzcywgbGVucyBzdGF0ZSBvZiB0aGUgb3V0cHV0IGltYWdlcy4KIAogICAgIEFyZ3M6CiAgICAgICAgIGNhbTogQW4gb3BlbiBkZXZpY2Ugc2Vzc2lvbi4KICAgICAgICAgcHJvcHM6IFByb3BlcnRpZXMgb2YgY2FtCiAgICAgICAgIGZtdDogZGljdDsgY2FwdHVyZSBmb3JtYXQKLSAgICAgICAgc2Vuc2l0aXZpdHk6IFNlbnNpdGl2aXR5IGZvciB0aGUgM0EgcmVxdWVzdCBhcyBkZWZpbmVkIGluCisgICAgICAgIGdhaW46IFNlbnNpdGl2aXR5IGZvciB0aGUgM0EgcmVxdWVzdCBhcyBkZWZpbmVkIGluCiAgICAgICAgICAgICBhbmRyb2lkLnNlbnNvci5zZW5zaXRpdml0eQogICAgICAgICBleHA6IEV4cG9zdXJlIHRpbWUgZm9yIHRoZSAzQSByZXF1ZXN0IGFzIGRlZmluZWQgaW4KICAgICAgICAgICAgIGFuZHJvaWQuc2Vuc29yLmV4cG9zdXJlVGltZQogICAgICAgICBhZl9mZDogRm9jdXMgZGlzdGFuY2UgZm9yIHRoZSAzQSByZXF1ZXN0IGFzIGRlZmluZWQgaW4KICAgICAgICAgICAgIGFuZHJvaWQubGVucy5mb2N1c0Rpc3RhbmNlCisgICAgICAgIGNoYXJ0OiBPYmplY3QgdGhhdCBjb250YWlucyBjaGFydCBpbmZvcm1hdGlvbgogCiAgICAgUmV0dXJuczoKICAgICAgICAgT2JqZWN0IGNvbnRhaW5pbmcgcmVwb3J0ZWQgc2hhcnBuZXNzIG9mIHRoZSBvdXRwdXQgaW1hZ2UsIGtleWVkIGJ5CkBAIC01NywxNSArNTgsNiBAQAogICAgICAgICAgICAgJ3NoYXJwbmVzcycKICAgICAiIiIKIAotICAgICMgaW5pdGlhbGl6ZSBjaGFydCBjbGFzcwotICAgIGNoYXJ0ID0gaXRzLmN2MmltYWdlLkNoYXJ0KENIQVJUX0ZJTEUsIENIQVJUX0hFSUdIVCwgQ0hBUlRfRElTVEFOQ0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBUlRfU0NBTEVfU1RBUlQsIENIQVJUX1NDQUxFX1NUT1AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBUlRfU0NBTEVfU1RFUCkKLQotICAgICMgZmluZCBjaGFydCBsb2NhdGlvbgotICAgIHhub3JtLCB5bm9ybSwgd25vcm0sIGhub3JtID0gY2hhcnQubG9jYXRlKGNhbSwgcHJvcHMsIGZtdCwgc2Vuc2l0aXZpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwLCBhZl9mZCkKLQogICAgICMgaW5pdGlhbGl6ZSB2YXJpYWJsZXMgYW5kIHRha2UgZGF0YSBzZXRzCiAgICAgZGF0YV9zZXQgPSB7fQogICAgIHdoaXRlX2xldmVsID0gaW50KHByb3BzWydhbmRyb2lkLnNlbnNvci5pbmZvLndoaXRlTGV2ZWwnXSkKQEAgLTc0LDcgKzY2LDcgQEAKICAgICBmZHMgPSBzb3J0ZWQoZmRzICogTlVNX0lNR1MpCiAgICAgcmVxcyA9IFtdCiAgICAgZm9yIGksIGZkIGluIGVudW1lcmF0ZShmZHMpOgotICAgICAgICByZXFzLmFwcGVuZChpdHMub2JqZWN0cy5tYW51YWxfY2FwdHVyZV9yZXF1ZXN0KHNlbnNpdGl2aXR5LCBleHApKQorICAgICAgICByZXFzLmFwcGVuZChpdHMub2JqZWN0cy5tYW51YWxfY2FwdHVyZV9yZXF1ZXN0KGdhaW4sIGV4cCkpCiAgICAgICAgIHJlcXNbaV1bJ2FuZHJvaWQubGVucy5mb2N1c0Rpc3RhbmNlJ10gPSBmZAogICAgIGNhcHMgPSBjYW0uZG9fY2FwdHVyZShyZXFzLCBmbXQpCiAgICAgZm9yIGksIGNhcCBpbiBlbnVtZXJhdGUoY2Fwcyk6CkBAIC05MiwxMiArODQsMTIgQEAKICAgICAgICAgcHJpbnQgJyBjdXJyZW50IGxlbnMgbG9jYXRpb24gKGRpb3B0ZXJzKTogJS4zZicgJSBkYXRhWydsb2MnXQogICAgICAgICBwcmludCAnIGxlbnMgbW92aW5nICVyJyAlIGRhdGFbJ2xlbnNfbW92aW5nJ10KICAgICAgICAgeSwgXywgXyA9IGl0cy5pbWFnZS5jb252ZXJ0X2NhcHR1cmVfdG9fcGxhbmVzKGNhcCwgcHJvcHMpCi0gICAgICAgIHkgPSBpdHMuaW1hZ2UuZmxpcF9taXJyb3JfaW1nX3Blcl9hcmd2KHkpCi0gICAgICAgIGNoYXJ0ID0gaXRzLmltYWdlLm5vcm1hbGl6ZV9pbWcoaXRzLmltYWdlLmdldF9pbWFnZV9wYXRjaCh5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG5vcm0sIHlub3JtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd25vcm0sIGhub3JtKSkKLSAgICAgICAgaXRzLmltYWdlLndyaXRlX2ltYWdlKGNoYXJ0LCAnJXNfaT0lZF9jaGFydC5qcGcnICUgKE5BTUUsIGkpKQotICAgICAgICBkYXRhWydzaGFycG5lc3MnXSA9IHdoaXRlX2xldmVsKml0cy5pbWFnZS5jb21wdXRlX2ltYWdlX3NoYXJwbmVzcyhjaGFydCkKKyAgICAgICAgeSA9IGl0cy5pbWFnZS5yb3RhdGVfaW1nX3Blcl9hcmd2KHkpCisgICAgICAgIGNoYXJ0LmltZyA9IGl0cy5pbWFnZS5ub3JtYWxpemVfaW1nKGl0cy5pbWFnZS5nZXRfaW1hZ2VfcGF0Y2goCisgICAgICAgICAgICAgICAgeSwgY2hhcnQueG5vcm0sIGNoYXJ0Lnlub3JtLCBjaGFydC53bm9ybSwgY2hhcnQuaG5vcm0pKQorICAgICAgICBpdHMuaW1hZ2Uud3JpdGVfaW1hZ2UoY2hhcnQuaW1nLCAnJXNfaT0lZF9jaGFydC5qcGcnICUgKE5BTUUsIGkpKQorICAgICAgICBkYXRhWydzaGFycG5lc3MnXSA9IHdoaXRlX2xldmVsKml0cy5pbWFnZS5jb21wdXRlX2ltYWdlX3NoYXJwbmVzcygKKyAgICAgICAgICAgICAgICBjaGFydC5pbWcpCiAgICAgICAgIHByaW50ICdDaGFydCBzaGFycG5lc3M6ICUuMWZcbicgJSBkYXRhWydzaGFycG5lc3MnXQogICAgICAgICBkYXRhX3NldFtpXSA9IGRhdGEKICAgICByZXR1cm4gZGF0YV9zZXQKQEAgLTExMCwxOCArMTAyLDI3IEBACiAgICAgIiIiCiAKICAgICBwcmludCAnXG5TdGFydGluZyB0ZXN0X2xlbnNfbW92ZW1lbnRfcmVwb3J0aW5nLnB5JworICAgICMgY2hlY2sgc2tpcCBjb25kaXRpb25zCiAgICAgd2l0aCBpdHMuZGV2aWNlLkl0c1Nlc3Npb24oKSBhcyBjYW06CiAgICAgICAgIHByb3BzID0gY2FtLmdldF9jYW1lcmFfcHJvcGVydGllcygpCiAgICAgICAgIGl0cy5jYXBzLnNraXBfdW5sZXNzKG5vdCBpdHMuY2Fwcy5maXhlZF9mb2N1cyhwcm9wcykpCi0gICAgICAgIGl0cy5jYXBzLnNraXBfdW5sZXNzKGl0cy5jYXBzLmxlbnNfYXBwcm94X2NhbGlicmF0ZWQocHJvcHMpKQorICAgICAgICBpdHMuY2Fwcy5za2lwX3VubGVzcyhpdHMuY2Fwcy5yZWFkXzNhKHByb3BzKSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRzLmNhcHMubGVuc19hcHByb3hfY2FsaWJyYXRlZChwcm9wcykpCisgICAgIyBpbml0aWFsaXplIGNoYXJ0IGNsYXNzCisgICAgY2hhcnQgPSBpdHMuY3YyaW1hZ2UuQ2hhcnQoQ0hBUlRfRklMRSwgQ0hBUlRfSEVJR0hULCBDSEFSVF9ESVNUQU5DRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSVF9TQ0FMRV9TVEFSVCwgQ0hBUlRfU0NBTEVfU1RPUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSVF9TQ0FMRV9TVEVQKQorCisgICAgd2l0aCBpdHMuZGV2aWNlLkl0c1Nlc3Npb24oKSBhcyBjYW06CisgICAgICAgIG1vbm9fY2FtZXJhID0gaXRzLmNhcHMubW9ub19jYW1lcmEocHJvcHMpCiAgICAgICAgIG1pbl9mZCA9IHByb3BzWydhbmRyb2lkLmxlbnMuaW5mby5taW5pbXVtRm9jdXNEaXN0YW5jZSddCiAgICAgICAgIGZtdCA9IHsnZm9ybWF0JzogJ3l1dicsICd3aWR0aCc6IFZHQV9XSURUSCwgJ2hlaWdodCc6IFZHQV9IRUlHSFR9CiAKICAgICAgICAgIyBHZXQgcHJvcGVyIHNlbnNpdGl2aXR5LCBleHBvc3VyZSB0aW1lLCBhbmQgZm9jdXMgZGlzdGFuY2Ugd2l0aCAzQS4KLSAgICAgICAgcywgZSwgXywgXywgZmQgPSBjYW0uZG9fM2EoZ2V0X3Jlc3VsdHM9VHJ1ZSkKKyAgICAgICAgcywgZSwgXywgXywgZmQgPSBjYW0uZG9fM2EoZ2V0X3Jlc3VsdHM9VHJ1ZSwgbW9ub19jYW1lcmE9bW9ub19jYW1lcmEpCiAKICAgICAgICAgIyBHZXQgc2hhcnBuZXNzIGZvciBlYWNoIGZvY2FsIGRpc3RhbmNlCi0gICAgICAgIGQgPSB0ZXN0X2xlbnNfbW92ZW1lbnRfcmVwb3J0aW5nKGNhbSwgcHJvcHMsIGZtdCwgcywgZSwgZmQpCisgICAgICAgIGQgPSB0ZXN0X2xlbnNfbW92ZW1lbnRfcmVwb3J0aW5nKGNhbSwgcHJvcHMsIGZtdCwgcywgZSwgZmQsIGNoYXJ0KQogICAgICAgICBmb3IgayBpbiBzb3J0ZWQoZCk6CiAgICAgICAgICAgICBwcmludCAoJ2k6ICVkXHRmZDogJS4zZlx0bGVucyBsb2NhdGlvbiAoZGlvcHRlcnMpOiAlLjNmIFx0JwogICAgICAgICAgICAgICAgICAgICdzaGFycG5lc3M6ICUuMWYgIFx0bGVuc19tb3Zpbmc6ICVyIFx0JwpAQCAtMTYyLDcgKzE2Myw4IEBACiAgICAgICAgIGFzc2VydCBucC5pc2Nsb3NlKG1pbl9zaGFycCwgbWF4X3NoYXJwLCBydG9sPVNIQVJQTkVTU19UT0wpCiAgICAgICAgICMgYXNzZXJ0IHJlcG9ydGVkIGxvY2F0aW9uIGlzIGNsb3NlIHRvIGFzc2lnbiBsb2NhdGlvbiBmb3IgYWZfZmQKICAgICAgICAgcHJpbnQgJ0Fzc2VydGluZyBsZW5zIGxvY2F0aW9uIGNsb3NlIHRvIGFzc2lnbmVkIGZkIGZvciBhZl9mZCBkYXRhJwotICAgICAgICBhc3NlcnQgbnAuaXNjbG9zZShkX2FmX2ZkWzBdWydsb2MnXSwgZF9hZl9mZFswXVsnZmQnXSwKKyAgICAgICAgZmlyc3Rfa2V5ID0gbWluKGRfYWZfZmQua2V5cygpKSAgIyBmaW5kcyAxc3Qgbm9uLW1vdmluZyBmcmFtZQorICAgICAgICBhc3NlcnQgbnAuaXNjbG9zZShkX2FmX2ZkW2ZpcnN0X2tleV1bJ2xvYyddLCBkX2FmX2ZkW2ZpcnN0X2tleV1bJ2ZkJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0b2w9UE9TSVRJT05fVE9MKQogCiAgICAgICAgICMgYXNzZXJ0IHJlcG9ydGVkIGxvY2F0aW9uIGlzIGNsb3NlIGZvciBtaW5fZmQgY2FwdHVyZXMKZGlmZiAtLWdpdCBhL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMy90ZXN0X2xlbnNfcG9zaXRpb24ucHkgYi9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTMvdGVzdF9sZW5zX3Bvc2l0aW9uLnB5CmluZGV4IGY4NTBlM2QuLjM5NzgwODEgMTAwNjQ0Ci0tLSBhL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMy90ZXN0X2xlbnNfcG9zaXRpb24ucHkKKysrIGIvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmUzL3Rlc3RfbGVuc19wb3NpdGlvbi5weQpAQCAtMjMsOCArMjMsOCBAQAogCiBOVU1fVFJZUyA9IDIKIE5VTV9TVEVQUyA9IDYKLVNIQVJQTkVTU19UT0wgPSAxMCAgIyBwZXJjZW50YWdlCi1QT1NJVElPTl9UT0wgPSAxMCAgIyBwZXJjZW50YWdlCitTSEFSUE5FU1NfVE9MID0gMC4xCitQT1NJVElPTl9UT0wgPSAwLjEKIEZSQU1FX1RJTUVfVE9MID0gMTAgICMgbXMKIFZHQV9XSURUSCA9IDY0MAogVkdBX0hFSUdIVCA9IDQ4MApAQCAtMzgsNyArMzgsNyBAQAogQ0hBUlRfU0NBTEVfU1RFUCA9IDAuMDI1CiAKIAotZGVmIHRlc3RfbGVuc19wb3NpdGlvbihjYW0sIHByb3BzLCBmbXQsIHNlbnNpdGl2aXR5LCBleHAsIGFmX2ZkKToKK2RlZiB0ZXN0X2xlbnNfcG9zaXRpb24oY2FtLCBwcm9wcywgZm10LCBzZW5zaXRpdml0eSwgZXhwLCBjaGFydCk6CiAgICAgIiIiUmV0dXJuIGZkLCBzaGFycG5lc3MsIGxlbnMgc3RhdGUgb2YgdGhlIG91dHB1dCBpbWFnZXMuCiAKICAgICBBcmdzOgpAQCAtNDksOCArNDksNyBAQAogICAgICAgICAgICAgYW5kcm9pZC5zZW5zb3Iuc2Vuc2l0aXZpdHkKICAgICAgICAgZXhwOiBFeHBvc3VyZSB0aW1lIGZvciB0aGUgM0EgcmVxdWVzdCBhcyBkZWZpbmVkIGluCiAgICAgICAgICAgICBhbmRyb2lkLnNlbnNvci5leHBvc3VyZVRpbWUKLSAgICAgICAgYWZfZmQ6IEZvY3VzIGRpc3RhbmNlIGZvciB0aGUgM0EgcmVxdWVzdCBhcyBkZWZpbmVkIGluCi0gICAgICAgICAgICBhbmRyb2lkLmxlbnMuZm9jdXNEaXN0YW5jZQorICAgICAgICBjaGFydDogT2JqZWN0IHdpdGggY2hhcnQgcHJvcGVydGllcwogCiAgICAgUmV0dXJuczoKICAgICAgICAgRGljdGlvbmFyeSBvZiByZXN1bHRzIGZvciBkaWZmZXJlbnQgZm9jYWwgZGlzdGFuY2UgY2FwdHVyZXMKQEAgLTU4LDE1ICs1Nyw2IEBACiAgICAgICAgIGRfc3RhdGljLCBkX21vdmluZwogICAgICIiIgogCi0gICAgIyBpbml0aWFsaXplIGNoYXJ0IGNsYXNzCi0gICAgY2hhcnQgPSBpdHMuY3YyaW1hZ2UuQ2hhcnQoQ0hBUlRfRklMRSwgQ0hBUlRfSEVJR0hULCBDSEFSVF9ESVNUQU5DRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBUlRfU0NBTEVfU1RBUlQsIENIQVJUX1NDQUxFX1NUT1AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQVJUX1NDQUxFX1NURVApCi0KLSAgICAjIGZpbmQgY2hhcnQgbG9jYXRpb24KLSAgICB4bm9ybSwgeW5vcm0sIHdub3JtLCBobm9ybSA9IGNoYXJ0LmxvY2F0ZShjYW0sIHByb3BzLCBmbXQsIHNlbnNpdGl2aXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cCwgYWZfZmQpCi0KICAgICAjIGluaXRpYWxpemUgdmFyaWFibGVzIGFuZCB0YWtlIGRhdGEgc2V0cwogICAgIGRhdGFfc3RhdGljID0ge30KICAgICBkYXRhX21vdmluZyA9IHt9CkBAIC04OSwxMSArNzksMTEgQEAKICAgICAgICAgcHJpbnQgJyBmb2N1cyBkaXN0YW5jZSAoZGlvcHRlcnMpOiAlLjNmJyAlIGRhdGFbJ2ZkJ10KICAgICAgICAgcHJpbnQgJyBjdXJyZW50IGxlbnMgbG9jYXRpb24gKGRpb3B0ZXJzKTogJS4zZicgJSBkYXRhWydsb2MnXQogICAgICAgICB5LCBfLCBfID0gaXRzLmltYWdlLmNvbnZlcnRfY2FwdHVyZV90b19wbGFuZXMoY2FwLCBwcm9wcykKLSAgICAgICAgY2hhcnQgPSBpdHMuaW1hZ2Uubm9ybWFsaXplX2ltZyhpdHMuaW1hZ2UuZ2V0X2ltYWdlX3BhdGNoKHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bm9ybSwgeW5vcm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3bm9ybSwgaG5vcm0pKQotICAgICAgICBpdHMuaW1hZ2Uud3JpdGVfaW1hZ2UoY2hhcnQsICclc19zdGF0X2k9JWRfY2hhcnQuanBnJyAlIChOQU1FLCBpKSkKLSAgICAgICAgZGF0YVsnc2hhcnBuZXNzJ10gPSB3aGl0ZV9sZXZlbCppdHMuaW1hZ2UuY29tcHV0ZV9pbWFnZV9zaGFycG5lc3MoY2hhcnQpCisgICAgICAgIGNoYXJ0LmltZyA9IGl0cy5pbWFnZS5ub3JtYWxpemVfaW1nKGl0cy5pbWFnZS5nZXRfaW1hZ2VfcGF0Y2goCisgICAgICAgICAgICAgICAgeSwgY2hhcnQueG5vcm0sIGNoYXJ0Lnlub3JtLCBjaGFydC53bm9ybSwgY2hhcnQuaG5vcm0pKQorICAgICAgICBpdHMuaW1hZ2Uud3JpdGVfaW1hZ2UoY2hhcnQuaW1nLCAnJXNfc3RhdF9pPSVkX2NoYXJ0LmpwZycgJSAoTkFNRSwgaSkpCisgICAgICAgIGRhdGFbJ3NoYXJwbmVzcyddID0gd2hpdGVfbGV2ZWwqaXRzLmltYWdlLmNvbXB1dGVfaW1hZ2Vfc2hhcnBuZXNzKAorICAgICAgICAgICAgICAgIGNoYXJ0LmltZykKICAgICAgICAgcHJpbnQgJ0NoYXJ0IHNoYXJwbmVzczogJS4xZlxuJyAlIGRhdGFbJ3NoYXJwbmVzcyddCiAgICAgICAgIGRhdGFfc3RhdGljW2ldID0gZGF0YQogICAgICMgdGFrZSBtb3ZpbmcgZGF0YSBzZXQKQEAgLTExNSwxMiArMTA1LDEyIEBACiAgICAgICAgIHByaW50ICcgZm9jdXMgZGlzdGFuY2UgKGRpb3B0ZXJzKTogJS4zZicgJSBkYXRhWydmZCddCiAgICAgICAgIHByaW50ICcgY3VycmVudCBsZW5zIGxvY2F0aW9uIChkaW9wdGVycyk6ICUuM2YnICUgZGF0YVsnbG9jJ10KICAgICAgICAgeSwgXywgXyA9IGl0cy5pbWFnZS5jb252ZXJ0X2NhcHR1cmVfdG9fcGxhbmVzKGNhcCwgcHJvcHMpCi0gICAgICAgIHkgPSBpdHMuaW1hZ2UuZmxpcF9taXJyb3JfaW1nX3Blcl9hcmd2KHkpCi0gICAgICAgIGNoYXJ0ID0gaXRzLmltYWdlLm5vcm1hbGl6ZV9pbWcoaXRzLmltYWdlLmdldF9pbWFnZV9wYXRjaCh5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG5vcm0sIHlub3JtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd25vcm0sIGhub3JtKSkKLSAgICAgICAgaXRzLmltYWdlLndyaXRlX2ltYWdlKGNoYXJ0LCAnJXNfbW92ZV9pPSVkX2NoYXJ0LmpwZycgJSAoTkFNRSwgaSkpCi0gICAgICAgIGRhdGFbJ3NoYXJwbmVzcyddID0gd2hpdGVfbGV2ZWwqaXRzLmltYWdlLmNvbXB1dGVfaW1hZ2Vfc2hhcnBuZXNzKGNoYXJ0KQorICAgICAgICB5ID0gaXRzLmltYWdlLnJvdGF0ZV9pbWdfcGVyX2FyZ3YoeSkKKyAgICAgICAgY2hhcnQuaW1nID0gaXRzLmltYWdlLm5vcm1hbGl6ZV9pbWcoaXRzLmltYWdlLmdldF9pbWFnZV9wYXRjaCgKKyAgICAgICAgICAgICAgICB5LCBjaGFydC54bm9ybSwgY2hhcnQueW5vcm0sIGNoYXJ0Lndub3JtLCBjaGFydC5obm9ybSkpCisgICAgICAgIGl0cy5pbWFnZS53cml0ZV9pbWFnZShjaGFydC5pbWcsICclc19tb3ZlX2k9JWRfY2hhcnQuanBnJyAlIChOQU1FLCBpKSkKKyAgICAgICAgZGF0YVsnc2hhcnBuZXNzJ10gPSB3aGl0ZV9sZXZlbCppdHMuaW1hZ2UuY29tcHV0ZV9pbWFnZV9zaGFycG5lc3MoCisgICAgICAgICAgICAgICAgY2hhcnQuaW1nKQogICAgICAgICBwcmludCAnQ2hhcnQgc2hhcnBuZXNzOiAlLjFmXG4nICUgZGF0YVsnc2hhcnBuZXNzJ10KICAgICAgICAgZGF0YV9tb3ZpbmdbaV0gPSBkYXRhCiAgICAgcmV0dXJuIGRhdGFfc3RhdGljLCBkYXRhX21vdmluZwpAQCAtMTI4LDE5ICsxMTgsMjcgQEAKIAogZGVmIG1haW4oKToKICAgICAiIiJUZXN0IGlmIGZvY3VzIHBvc2l0aW9uIGlzIHByb3Blcmx5IHJlcG9ydGVkIGZvciBtb3ZpbmcgbGVuc2VzLiIiIgotCiAgICAgcHJpbnQgJ1xuU3RhcnRpbmcgdGVzdF9sZW5zX3Bvc2l0aW9uLnB5JworICAgICMgY2hlY2sgc2tpcCBjb25kaXRpb25zCiAgICAgd2l0aCBpdHMuZGV2aWNlLkl0c1Nlc3Npb24oKSBhcyBjYW06CiAgICAgICAgIHByb3BzID0gY2FtLmdldF9jYW1lcmFfcHJvcGVydGllcygpCiAgICAgICAgIGl0cy5jYXBzLnNraXBfdW5sZXNzKG5vdCBpdHMuY2Fwcy5maXhlZF9mb2N1cyhwcm9wcykpCi0gICAgICAgIGl0cy5jYXBzLnNraXBfdW5sZXNzKGl0cy5jYXBzLmxlbnNfY2FsaWJyYXRlZChwcm9wcykpCisgICAgICAgIGl0cy5jYXBzLnNraXBfdW5sZXNzKGl0cy5jYXBzLnJlYWRfM2EocHJvcHMpIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdHMuY2Fwcy5sZW5zX2NhbGlicmF0ZWQocHJvcHMpKQorICAgICMgaW5pdGlhbGl6ZSBjaGFydCBjbGFzcworICAgIGNoYXJ0ID0gaXRzLmN2MmltYWdlLkNoYXJ0KENIQVJUX0ZJTEUsIENIQVJUX0hFSUdIVCwgQ0hBUlRfRElTVEFOQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBUlRfU0NBTEVfU1RBUlQsIENIQVJUX1NDQUxFX1NUT1AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBUlRfU0NBTEVfU1RFUCkKKworICAgIHdpdGggaXRzLmRldmljZS5JdHNTZXNzaW9uKCkgYXMgY2FtOgorICAgICAgICBtb25vX2NhbWVyYSA9IGl0cy5jYXBzLm1vbm9fY2FtZXJhKHByb3BzKQogICAgICAgICBmbXQgPSB7J2Zvcm1hdCc6ICd5dXYnLCAnd2lkdGgnOiBWR0FfV0lEVEgsICdoZWlnaHQnOiBWR0FfSEVJR0hUfQogCi0gICAgICAgICMgR2V0IHByb3BlciBzZW5zaXRpdml0eSwgZXhwb3N1cmUgdGltZSwgYW5kIGZvY3VzIGRpc3RhbmNlIHdpdGggM0EuCi0gICAgICAgIHMsIGUsIF8sIF8sIGZkID0gY2FtLmRvXzNhKGdldF9yZXN1bHRzPVRydWUpCisgICAgICAgICMgR2V0IHByb3BlciBzZW5zaXRpdml0eSBhbmQgZXhwb3N1cmUgdGltZSB3aXRoIDNBCisgICAgICAgIHMsIGUsIF8sIF8sIF8gPSBjYW0uZG9fM2EoZ2V0X3Jlc3VsdHM9VHJ1ZSwgbW9ub19jYW1lcmE9bW9ub19jYW1lcmEpCiAKICAgICAgICAgIyBHZXQgc2hhcnBuZXNzIGZvciBlYWNoIGZvY2FsIGRpc3RhbmNlCi0gICAgICAgIGRfc3RhdCwgZF9tb3ZlID0gdGVzdF9sZW5zX3Bvc2l0aW9uKGNhbSwgcHJvcHMsIGZtdCwgcywgZSwgZmQpCisgICAgICAgIGRfc3RhdCwgZF9tb3ZlID0gdGVzdF9sZW5zX3Bvc2l0aW9uKGNhbSwgcHJvcHMsIGZtdCwgcywgZSwgY2hhcnQpCiAgICAgICAgIHByaW50ICdMZW5zIHN0YXRpb25hcnknCiAgICAgICAgIGZvciBrIGluIHNvcnRlZChkX3N0YXQpOgogICAgICAgICAgICAgcHJpbnQgKCdpOiAlZFx0ZmQ6ICUuM2ZcdGxlbnMgbG9jYXRpb24gKGRpb3B0ZXJzKTogJS4zZiBcdCcKQEAgLTE2MSwxNCArMTU5LDE5IEBACiAgICAgICAgIHByaW50ICdBc3NlcnRpbmcgc3RhdGljIGxlbnMgbG9jYXRpb25zL3NoYXJwbmVzcyBhcmUgc2ltaWxhcicKICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGRfc3RhdCkvMik6CiAgICAgICAgICAgICBqID0gMiAqIE5VTV9TVEVQUyAtIDEgLSBpCi0gICAgICAgICAgICBwcmludCAoJyBsZW5zIHBvc2l0aW9uOiAlLjNmJwotICAgICAgICAgICAgICAgICAgICUgZF9zdGF0W2ldWydmZCddKQorICAgICAgICAgICAgcndfbXNnID0gJ2ZkX3dyaXRlOiAlLjNmLCBmZF9yZWFkOiAlLjNmLCBSVE9MOiAlLjJmJyAlICgKKyAgICAgICAgICAgICAgICAgICAgZF9zdGF0W2ldWydmZCddLCBkX3N0YXRbaV1bJ2xvYyddLCBQT1NJVElPTl9UT0wpCisgICAgICAgICAgICBmcl9tc2cgPSAnbG9jX2Z3ZDogJS4zZiwgbG9jX3JldjogJS4zZiwgUlRPTDogJS4yZicgJSAoCisgICAgICAgICAgICAgICAgICAgIGRfc3RhdFtpXVsnbG9jJ10sIGRfc3RhdFtqXVsnbG9jJ10sIFBPU0lUSU9OX1RPTCkKKyAgICAgICAgICAgIHNfbXNnID0gJ3NoYXJwbmVzc19md2Q6ICUuM2YsIHNoYXJwbmVzc19yZXY6ICUuM2YsIFJUT0w6ICUuMmYnICUgKAorICAgICAgICAgICAgICAgICAgICBkX3N0YXRbaV1bJ3NoYXJwbmVzcyddLCBkX3N0YXRbal1bJ3NoYXJwbmVzcyddLAorICAgICAgICAgICAgICAgICAgICBTSEFSUE5FU1NfVE9MKQogICAgICAgICAgICAgYXNzZXJ0IG5wLmlzY2xvc2UoZF9zdGF0W2ldWydsb2MnXSwgZF9zdGF0W2ldWydmZCddLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRvbD1QT1NJVElPTl9UT0wvMTAwLjApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydG9sPVBPU0lUSU9OX1RPTCksIHJ3X21zZwogICAgICAgICAgICAgYXNzZXJ0IG5wLmlzY2xvc2UoZF9zdGF0W2ldWydsb2MnXSwgZF9zdGF0W2pdWydsb2MnXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0b2w9UE9TSVRJT05fVE9MLzEwMC4wKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRvbD1QT1NJVElPTl9UT0wpLCBmcl9tc2cKICAgICAgICAgICAgIGFzc2VydCBucC5pc2Nsb3NlKGRfc3RhdFtpXVsnc2hhcnBuZXNzJ10sIGRfc3RhdFtqXVsnc2hhcnBuZXNzJ10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydG9sPVNIQVJQTkVTU19UT0wvMTAwLjApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydG9sPVNIQVJQTkVTU19UT0wpLCBzX21zZwogICAgICAgICAjIGFzc2VydCBtb3ZpbmcgZnJhbWVzIGFwcHJveGltYXRlbHkgY29uc2VjdXRpdmUgd2l0aCBldmVuIGRpc3RyaWJ1dGlvbgogICAgICAgICBwcmludCAnQXNzZXJ0aW5nIG1vdmluZyBmcmFtZXMgYXJlIGNvbnNlY3V0aXZlJwogICAgICAgICB0aW1lcyA9IFt2Wyd0aW1lc3RhbXAnXSBmb3IgdiBpbiBkX21vdmUuaXRlcnZhbHVlcygpXQpAQCAtMTc3LDkgKzE4MCwxMCBAQAogICAgICAgICAjIGFzc2VydCByZXBvcnRlZCBsb2NhdGlvbi9zaGFycG5lc3MgaXMgY29ycmVjdCBpbiBtb3ZpbmcgZnJhbWVzCiAgICAgICAgIHByaW50ICdBc3NlcnRpbmcgbW92aW5nIGxlbnMgbG9jYXRpb25zL3NoYXJwbmVzcyBhcmUgc2ltaWxhcicKICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGRfbW92ZSkpOgotICAgICAgICAgICAgcHJpbnQgJyBsZW5zIHBvc2l0aW9uOiAlLjNmJyAlIGRfc3RhdFtpXVsnZmQnXQorICAgICAgICAgICAgbV9tc2cgPSAnc3RhdGljOiAlLjNmLCBtb3Zpbmc6ICUuM2YsIFJUT0w6ICUuMmYnICUgKAorICAgICAgICAgICAgICAgICAgICBkX3N0YXRbaV1bJ2xvYyddLCBkX21vdmVbaV1bJ2xvYyddLCBQT1NJVElPTl9UT0wpCiAgICAgICAgICAgICBhc3NlcnQgbnAuaXNjbG9zZShkX3N0YXRbaV1bJ2xvYyddLCBkX21vdmVbaV1bJ2xvYyddLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRvbD1QT1NJVElPTl9UT0wpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydG9sPVBPU0lUSU9OX1RPTCksIG1fbXNnCiAgICAgICAgICAgICBpZiBkX21vdmVbaV1bJ2xlbnNfbW92aW5nJ10gYW5kIGkgPiAwOgogICAgICAgICAgICAgICAgIGlmIGRfc3RhdFtpXVsnc2hhcnBuZXNzJ10gPiBkX3N0YXRbaS0xXVsnc2hhcnBuZXNzJ106CiAgICAgICAgICAgICAgICAgICAgIGFzc2VydCAoZF9zdGF0W2ldWydzaGFycG5lc3MnXSooMS4wK1NIQVJQTkVTU19UT0wpID4KQEAgLTE5MCw4ICsxOTQsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRfbW92ZVtpXVsnc2hhcnBuZXNzJ10gPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRfc3RhdFtpXVsnc2hhcnBuZXNzJ10qKDEuMC1TSEFSUE5FU1NfVE9MKSkKICAgICAgICAgICAgIGVsaWYgbm90IGRfbW92ZVtpXVsnbGVuc19tb3ZpbmcnXToKLSAgICAgICAgICAgICAgICBhc3NlcnQgbnAuaXNjbG9zZShkX3N0YXRbaV1bJ3NoYXJwbmVzcyddLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRfbW92ZVtpXVsnc2hhcnBuZXNzJ10sIHJ0b2w9U0hBUlBORVNTX1RPTCkKKyAgICAgICAgICAgICAgICBhc3NlcnQgbnAuaXNjbG9zZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGRfc3RhdFtpXVsnc2hhcnBuZXNzJ10sIGRfbW92ZVtpXVsnc2hhcnBuZXNzJ10sCisgICAgICAgICAgICAgICAgICAgICAgICBydG9sPVNIQVJQTkVTU19UT0wpCiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIHJhaXNlIGl0cy5lcnJvci5FcnJvcignTGVucyBpcyBtb3ZpbmcgYXQgZnJhbWUgMCEnKQogCmRpZmYgLS1naXQgYS9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTMvdGVzdF9yZXByb2Nlc3NfZWRnZV9lbmhhbmNlbWVudC5weSBiL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMy90ZXN0X3JlcHJvY2Vzc19lZGdlX2VuaGFuY2VtZW50LnB5CmluZGV4IDk1ZmM2MzYuLjA0OTQyNmEgMTAwNjQ0Ci0tLSBhL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMy90ZXN0X3JlcHJvY2Vzc19lZGdlX2VuaGFuY2VtZW50LnB5CisrKyBiL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lMy90ZXN0X3JlcHJvY2Vzc19lZGdlX2VuaGFuY2VtZW50LnB5CkBAIC0xMDEsNiArMTAxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGl0cy5jYXBzLnl1dl9yZXByb2Nlc3MocHJvcHMpIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdHMuY2Fwcy5wcml2YXRlX3JlcHJvY2Vzcyhwcm9wcykpKQogCisgICAgICAgIG1vbm9fY2FtZXJhID0gaXRzLmNhcHMubW9ub19jYW1lcmEocHJvcHMpCiAgICAgICAgICMgSWYgcmVwcm9jZXNzaW5nIGlzIHN1cHBvcnRlZCwgWlNMIEVFIG1vZGUgbXVzdCBiZSBhdmFpYWJsZS4KICAgICAgICAgYXNzZXJ0KGl0cy5jYXBzLmVkZ2VfbW9kZShwcm9wcywgMykpCiAKQEAgLTExNCw3ICsxMTUsNyBAQAogICAgICAgICBvdXRfc3VyZmFjZSA9IHsid2lkdGgiOnNpemVbMF0sICJoZWlnaHQiOnNpemVbMV0sICJmb3JtYXQiOiJqcGcifQogCiAgICAgICAgICMgR2V0IHByb3BlciBzZW5zaXRpdml0eSwgZXhwb3N1cmUgdGltZSwgYW5kIGZvY3VzIGRpc3RhbmNlLgotICAgICAgICBzLGUsXyxfLGZkID0gY2FtLmRvXzNhKGdldF9yZXN1bHRzPVRydWUpCisgICAgICAgIHMsZSxfLF8sZmQgPSBjYW0uZG9fM2EoZ2V0X3Jlc3VsdHM9VHJ1ZSwgbW9ub19jYW1lcmE9bW9ub19jYW1lcmEpCiAKICAgICAgICAgIyBHZXQgdGhlIHNoYXJwbmVzcyBmb3IgZWFjaCBlZGdlIG1vZGUgZm9yIHJlZ3VsYXIgcmVxdWVzdHMKICAgICAgICAgc2hhcnBuZXNzX3JlZ3VsYXIgPSBbXQpkaWZmIC0tZ2l0IGEvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmU0L3Rlc3RfYXNwZWN0X3JhdGlvX2FuZF9jcm9wLnB5IGIvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmU0L3Rlc3RfYXNwZWN0X3JhdGlvX2FuZF9jcm9wLnB5CmluZGV4IDA2ZGI4YmIuLmE0NmQ1NGMgMTAwNjQ0Ci0tLSBhL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NjZW5lNC90ZXN0X2FzcGVjdF9yYXRpb19hbmRfY3JvcC5weQorKysgYi9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTQvdGVzdF9hc3BlY3RfcmF0aW9fYW5kX2Nyb3AucHkKQEAgLTEyLDE4ICsxMiwxNzAgQEAKICMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAotaW1wb3J0IGl0cy5pbWFnZQotaW1wb3J0IGl0cy5jYXBzCi1pbXBvcnQgaXRzLmRldmljZQotaW1wb3J0IGl0cy5vYmplY3RzCitpbXBvcnQgbWF0aAogaW1wb3J0IG9zLnBhdGgKIGltcG9ydCBjdjIKK2ltcG9ydCBpdHMuY2FwcworaW1wb3J0IGl0cy5kZXZpY2UKK2ltcG9ydCBpdHMuaW1hZ2UKK2ltcG9ydCBpdHMub2JqZWN0cwogaW1wb3J0IG51bXB5IGFzIG5wCiAKK0ZNVF9BVE9MID0gMC4wMSAgIyBBYnNvbHV0ZSB0b2xlcmFuY2Ugb24gZm9ybWF0IHJhdGlvCitBUl9DSEVDS0VEID0gWyI0OjMiLCAiMTY6OSIsICIxODo5Il0gICMgQXNwZWN0IHJhdGlvcyBjaGVja2VkCitGT1ZfUEVSQ0VOVF9SVE9MID0gMC4xNSAgIyBSZWxhdGl2ZSB0b2xlcmFuY2Ugb24gY2lyY2xlIEZvViAlIHRvIGV4cGVjdGVkCitMQVJHRV9TSVpFID0gMjAwMCAgICMgRGVmaW5lIHRoZSBzaXplIG9mIGEgbGFyZ2UgaW1hZ2UKK05BTUUgPSBvcy5wYXRoLmJhc2VuYW1lKF9fZmlsZV9fKS5zcGxpdCgiLiIpWzBdCitOVU1fRElTVE9SVF9QQVJBTVMgPSA1CitUSFJFU0hfTF9BUiA9IDAuMDIgICMgYXNwZWN0IHJhdGlvIHRlc3QgdGhyZXNob2xkIG9mIGxhcmdlIGltYWdlcworVEhSRVNIX1hTX0FSID0gMC4wNzUgICMgYXNwZWN0IHJhdGlvIHRlc3QgdGhyZXNob2xkIG9mIG1pbmkgaW1hZ2VzCitUSFJFU0hfTF9DUCA9IDAuMDIgICMgQ3JvcCB0ZXN0IHRocmVzaG9sZCBvZiBsYXJnZSBpbWFnZXMKK1RIUkVTSF9YU19DUCA9IDAuMDc1ICAjIENyb3AgdGVzdCB0aHJlc2hvbGQgb2YgbWluaSBpbWFnZXMKK1RIUkVTSF9NSU5fUElYRUwgPSA0ICAjIENyb3AgdGVzdCBhbGxvd2VkIG9mZnNldAorUFJFVklFV19TSVpFID0gKDE5MjAsIDEwODApICAjIHByZXZpZXcgc2l6ZQorCisKK2RlZiBjb252ZXJ0X2FyX3RvX2Zsb2F0KGFyX3N0cmluZyk6CisgICAgIiIiQ29udmVydCBhc3BlY3QgcmF0aW8gc3RyaW5nIGludG8gZmxvYXQuCisKKyAgICBBcmdzOgorICAgICAgICBhcl9zdHJpbmc6ICAiNDozIiBvciAiMTY6OSIKKyAgICBSZXR1cm5zOgorICAgICAgICBmbG9hdChhcl9zdHJpbmcpCisgICAgIiIiCisgICAgYXJfbGlzdCA9IFtmbG9hdCh4KSBmb3IgeCBpbiBhcl9zdHJpbmcuc3BsaXQoIjoiKV0KKyAgICByZXR1cm4gYXJfbGlzdFswXSAvIGFyX2xpc3RbMV0KKworCitkZWYgZGV0ZXJtaW5lX3NlbnNvcl9hc3BlY3RfcmF0aW8ocHJvcHMpOgorICAgICIiIkRldGVybWluZSB0aGUgYXNwZWN0IHJhdGlvIG9mIHRoZSBzZW5zb3IuCisKKyAgICBBcmdzOgorICAgICAgICBwcm9wczogICAgICBjYW1lcmEgcHJvcGVydGllcworICAgIFJldHVybnM6CisgICAgICAgIG1hdGNoZWQgZW50cnkgaW4gQVJfQ0hFQ0tFRAorICAgICIiIgorICAgIG1hdGNoX2FyID0gTm9uZQorICAgIHNlbnNvcl9zaXplID0gcHJvcHNbImFuZHJvaWQuc2Vuc29yLmluZm8ucHJlQ29ycmVjdGlvbkFjdGl2ZUFycmF5U2l6ZSJdCisgICAgc2Vuc29yX2FyID0gKGZsb2F0KGFicyhzZW5zb3Jfc2l6ZVsicmlnaHQiXSAtIHNlbnNvcl9zaXplWyJsZWZ0Il0pKSAvCisgICAgICAgICAgICAgICAgIGFicyhzZW5zb3Jfc2l6ZVsiYm90dG9tIl0gLSBzZW5zb3Jfc2l6ZVsidG9wIl0pKQorICAgIGZvciBhcl9zdHJpbmcgaW4gQVJfQ0hFQ0tFRDoKKyAgICAgICAgaWYgbnAuaXNjbG9zZShzZW5zb3JfYXIsIGNvbnZlcnRfYXJfdG9fZmxvYXQoYXJfc3RyaW5nKSwgYXRvbD1GTVRfQVRPTCk6CisgICAgICAgICAgICBtYXRjaF9hciA9IGFyX3N0cmluZworICAgIGlmIG5vdCBtYXRjaF9hcjoKKyAgICAgICAgcHJpbnQgIldhcm5pbmchIFJBVyBhc3BlY3QgcmF0aW8gbm90IGluOiIsIEFSX0NIRUNLRUQKKyAgICByZXR1cm4gbWF0Y2hfYXIKKworCitkZWYgYXNwZWN0X3JhdGlvX3NjYWxlX2ZhY3RvcnMocmVmX2FyX3N0cmluZywgcHJvcHMpOgorICAgICIiIkRldGVybWluZSBzY2FsZSBmYWN0b3JzIGZvciBlYWNoIGFzcGVjdCByYXRpbyB0byBjb3JyZWN0IGNyb3BwaW5nLgorCisgICAgQXJnczoKKyAgICAgICAgcmVmX2FyX3N0cmluZzogICAgICBjYW1lcmEgYXNwZWN0IHJhdGlvIHRoYXQgaXMgdGhlIHJlZmVyZW5jZQorICAgICAgICBwcm9wczogICAgICAgICAgICAgIGNhbWVyYSBwcm9wZXJ0aWVzCisgICAgUmV0dXJuczoKKyAgICAgICAgZGljdCBvZiBjb3JyZWN0aW9uIHJhdGlvcyB3aXRoIEFSX0NIRUNLRUQgdmFsdWVzIGFzIGtleXMKKyAgICAiIiIKKyAgICByZWZfYXIgPSBjb252ZXJ0X2FyX3RvX2Zsb2F0KHJlZl9hcl9zdHJpbmcpCisKKyAgICAjIGZpbmQgc2Vuc29yIGFyZWEKKyAgICBoZWlnaHRfbWF4ID0gMAorICAgIHdpZHRoX21heCA9IDAKKyAgICBmb3IgYXJfc3RyaW5nIGluIEFSX0NIRUNLRUQ6CisgICAgICAgIG1hdGNoX2FyID0gW2Zsb2F0KHgpIGZvciB4IGluIGFyX3N0cmluZy5zcGxpdCgiOiIpXQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmID0gaXRzLm9iamVjdHMuZ2V0X2xhcmdlc3RfeXV2X2Zvcm1hdChwcm9wcywgbWF0Y2hfYXI9bWF0Y2hfYXIpCisgICAgICAgICAgICBpZiBmWyJoZWlnaHQiXSA+IGhlaWdodF9tYXg6CisgICAgICAgICAgICAgICAgaGVpZ2h0X21heCA9IGZbImhlaWdodCJdCisgICAgICAgICAgICBpZiBmWyJ3aWR0aCJdID4gd2lkdGhfbWF4OgorICAgICAgICAgICAgICAgIHdpZHRoX21heCA9IGZbIndpZHRoIl0KKyAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICBjb250aW51ZQorICAgIHNlbnNvcl9hciA9IGZsb2F0KHdpZHRoX21heCkgLyBoZWlnaHRfbWF4CisKKyAgICAjIGFwcGx5IHNjYWxpbmcKKyAgICBhcl9zY2FsaW5nID0ge30KKyAgICBmb3IgYXJfc3RyaW5nIGluIEFSX0NIRUNLRUQ6CisgICAgICAgIHRhcmdldF9hciA9IGNvbnZlcnRfYXJfdG9fZmxvYXQoYXJfc3RyaW5nKQorICAgICAgICAjIHNjYWxlIGRvd24gdG8gc2Vuc29yIHdpdGggZ3JlYXRlciAob3IgZXF1YWwpIGRpbXMKKyAgICAgICAgaWYgcmVmX2FyID49IHNlbnNvcl9hcjoKKyAgICAgICAgICAgIHNjYWxpbmcgPSBzZW5zb3JfYXIgLyByZWZfYXIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNjYWxpbmcgPSByZWZfYXIgLyBzZW5zb3JfYXIKKworICAgICAgICAjIHNjYWxlIHVwIGR1ZSB0byBjcm9wcGluZyB0byBvdGhlciBmb3JtYXQKKyAgICAgICAgaWYgdGFyZ2V0X2FyID49IHNlbnNvcl9hcjoKKyAgICAgICAgICAgIHNjYWxpbmcgPSBzY2FsaW5nICogdGFyZ2V0X2FyIC8gc2Vuc29yX2FyCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzY2FsaW5nID0gc2NhbGluZyAqIHNlbnNvcl9hciAvIHRhcmdldF9hcgorCisgICAgICAgIGFyX3NjYWxpbmdbYXJfc3RyaW5nXSA9IHNjYWxpbmcKKyAgICByZXR1cm4gYXJfc2NhbGluZworCisKK2RlZiBmaW5kX3l1dl9mb3ZfcmVmZXJlbmNlKGNhbSwgcmVxLCBwcm9wcyk6CisgICAgIiIiRGV0ZXJtaW5lIHRoZSBjaXJjbGUgY292ZXJhZ2Ugb2YgdGhlIGltYWdlIGluIFlVViByZWZlcmVuY2UgaW1hZ2UuCisKKyAgICBBcmdzOgorICAgICAgICBjYW06ICAgICAgICBjYW1lcmEgb2JqZWN0CisgICAgICAgIHJlcTogICAgICAgIGNhbWVyYSByZXF1ZXN0CisgICAgICAgIHByb3BzOiAgICAgIGNhbWVyYSBwcm9wZXJ0aWVzCisKKyAgICBSZXR1cm5zOgorICAgICAgICByZWZfZm92OiAgICBkaWN0IHdpdGggW2ZtdCwgJSBjb3ZlcmFnZSwgdywgaF0KKyAgICAiIiIKKyAgICByZWZfZm92ID0ge30KKyAgICBmbXRfZGljdCA9IHt9CisKKyAgICAjIGZpbmQgbnVtYmVyIG9mIHBpeGVscyBpbiBkaWZmZXJlbnQgZm9ybWF0cworICAgIGZvciBhciBpbiBBUl9DSEVDS0VEOgorICAgICAgICBtYXRjaF9hciA9IFtmbG9hdCh4KSBmb3IgeCBpbiBhci5zcGxpdCgiOiIpXQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmID0gaXRzLm9iamVjdHMuZ2V0X2xhcmdlc3RfeXV2X2Zvcm1hdChwcm9wcywgbWF0Y2hfYXI9bWF0Y2hfYXIpCisgICAgICAgICAgICBmbXRfZGljdFtmWyJoZWlnaHQiXSpmWyJ3aWR0aCJdXSA9IHsiZm10IjogZiwgImFyIjogYXJ9CisgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgY29udGludWUKKworICAgICMgdXNlIGltYWdlIHdpdGggbGFyZ2VzdCBjb3ZlcmFnZSBhcyByZWZlcmVuY2UKKyAgICBhcl9tYXhfcGl4ZWxzID0gbWF4KGZtdF9kaWN0LCBrZXk9aW50KQorCisgICAgIyBjYXB0dXJlIGFuZCBkZXRlcm1pbmUgY2lyY2xlIGFyZWEgaW4gaW1hZ2UKKyAgICBjYXAgPSBjYW0uZG9fY2FwdHVyZShyZXEsIGZtdF9kaWN0W2FyX21heF9waXhlbHNdWyJmbXQiXSkKKyAgICB3ID0gY2FwWyJ3aWR0aCJdCisgICAgaCA9IGNhcFsiaGVpZ2h0Il0KKyAgICBpbWcgPSBpdHMuaW1hZ2UuY29udmVydF9jYXB0dXJlX3RvX3JnYl9pbWFnZShjYXAsIHByb3BzPXByb3BzKQorICAgIHByaW50ICJDYXB0dXJlZCAlcyAlZHglZCIgJSAoInl1diIsIHcsIGgpCisgICAgaW1nX25hbWUgPSAiJXNfJXNfdyVkX2glZC5wbmciICUgKE5BTUUsICJ5dXYiLCB3LCBoKQorICAgIF8sIF8sIGNpcmNsZV9zaXplID0gbWVhc3VyZV9hc3BlY3RfcmF0aW8oaW1nLCBGYWxzZSwgaW1nX25hbWUsIFRydWUpCisgICAgZm92X3BlcmNlbnQgPSBjYWxjX2NpcmNsZV9pbWFnZV9yYXRpbyhjaXJjbGVfc2l6ZVsxXSwgY2lyY2xlX3NpemVbMF0sIHcsIGgpCisgICAgcmVmX2ZvdlsiZm10Il0gPSBmbXRfZGljdFthcl9tYXhfcGl4ZWxzXVsiYXIiXQorICAgIHJlZl9mb3ZbInBlcmNlbnQiXSA9IGZvdl9wZXJjZW50CisgICAgcmVmX2ZvdlsidyJdID0gdworICAgIHJlZl9mb3ZbImgiXSA9IGgKKyAgICBwcmludCAiVXNpbmcgWVVWIHJlZmVyZW5jZToiLCByZWZfZm92CisgICAgcmV0dXJuIHJlZl9mb3YKKworCitkZWYgY2FsY19jaXJjbGVfaW1hZ2VfcmF0aW8oY2lyY2xlX3csIGNpcmNsZV9oLCBpbWFnZV93LCBpbWFnZV9oKToKKyAgICAiIiJDYWxjdWxhdGUgdGhlIGNpcmNsZSBjb3ZlcmFnZSBvZiB0aGUgaW1hZ2UuCisKKyAgICBBcmdzOgorICAgICAgICBjaXJjbGVfdyAoaW50KTogICAgICB3aWR0aCBvZiBjaXJjbGUKKyAgICAgICAgY2lyY2xlX2ggKGludCk6ICAgICAgaGVpZ2h0IG9mIGNpcmNsZQorICAgICAgICBpbWFnZV93IChpbnQpOiAgICAgICB3aWR0aCBvZiBpbWFnZQorICAgICAgICBpbWFnZV9oIChpbnQpOiAgICAgICBoZWlnaHQgb2YgaW1hZ2UKKyAgICBSZXR1cm5zOgorICAgICAgICBmb3ZfcGVyY2VudCAoZmxvYXQpOiAlIG9mIGltYWdlIGNvdmVyZWQgYnkgY2lyY2xlCisgICAgIiIiCisgICAgY2lyY2xlX2FyZWEgPSBtYXRoLnBpICogbWF0aC5wb3cobnAubWVhbihbY2lyY2xlX3csIGNpcmNsZV9oXSkvMi4wLCAyKQorICAgIGltYWdlX2FyZWEgPSBpbWFnZV93ICogaW1hZ2VfaAorICAgIGZvdl9wZXJjZW50ID0gMTAwKmNpcmNsZV9hcmVhL2ltYWdlX2FyZWEKKyAgICByZXR1cm4gZm92X3BlcmNlbnQKKwogCiBkZWYgbWFpbigpOgotICAgICIiIiBUZXN0IGFzcGVjdCByYXRpbyBhbmQgY2hlY2sgaWYgaW1hZ2VzIGFyZSBjcm9wcGVkIGNvcnJlY3RseSB1bmRlciBlYWNoCi0gICAgb3V0cHV0IHNpemUKKyAgICAiIiJUZXN0IGFzcGVjdCByYXRpbyAmIGNoZWNrIGlmIGltYWdlcyBhcmUgY3JvcHBlZCBjb3JyZWN0bHkgZm9yIGVhY2ggZm10LgorCiAgICAgQXNwZWN0IHJhdGlvIHRlc3QgcnVucyBvbiBsZXZlbDMsIGZ1bGwgYW5kIGxpbWl0ZWQgZGV2aWNlcy4gQ3JvcCB0ZXN0IG9ubHkKICAgICBydW5zIG9uIGZ1bGwgYW5kIGxldmVsMyBkZXZpY2VzLgogICAgIFRoZSB0ZXN0IGltYWdlIGlzIGEgYmxhY2sgY2lyY2xlIGluc2lkZSBhIGJsYWNrIHNxdWFyZS4gV2hlbiByYXcgY2FwdHVyZSBpcwpAQCAtMzMsMjUgKzE4NSwxMiBAQAogICAgIElmIHJhdyBjYXB0dXJlIGlzIHVuYXZhaWxhYmxlLCB0YWtlIGEgcGljdHVyZSBvZiB0aGUgdGVzdCBpbWFnZSByaWdodCBpbgogICAgIGZyb250IHRvIGVsaW1pbmF0ZSBzaG9vdGluZyBhbmdsZSBlZmZlY3QuIHRoZSBoZWlnaHQgdnMuIHdpZHRoIHJhdGlvIGZvcgogICAgIHRoZSBjaXJjbGUgc2hvdWxkIGJlIGNsb3NlIHRvIDEuIENvbnNpZGVyaW5nIHNob290aW5nIHBvc2l0aW9uIGVycm9yLCBhc3BlY3QKLSAgICByYXRpbyBncmVhdGVyIHRoYW4gMS4wNSBvciBzbWFsbGVyIHRoYW4gMC45NSB3aWxsIGZhaWwgdGhlIHRlc3QuCisgICAgcmF0aW8gZ3JlYXRlciB0aGFuIDErVEhSRVNIXypfQVIgb3IgbGVzcyB0aGFuIDEtVEhSRVNIXypfQVIgd2lsbCBGQUlMLgogICAgICIiIgotICAgIE5BTUUgPSBvcy5wYXRoLmJhc2VuYW1lKF9fZmlsZV9fKS5zcGxpdCgiLiIpWzBdCi0gICAgTEFSR0VfU0laRSA9IDIwMDAgICAjIERlZmluZSB0aGUgc2l6ZSBvZiBhIGxhcmdlIGltYWdlCi0gICAgIyBwYXNzL2ZhaWwgdGhyZXNob2xkIG9mIGxhcmdlIHNpemUgaW1hZ2VzIGZvciBhc3BlY3QgcmF0aW8gdGVzdAotICAgIFRIUkVTX0xfQVJfVEVTVCA9IDAuMDIKLSAgICAjIHBhc3MvZmFpbCB0aHJlc2hvbGQgb2YgbWluaSBzaXplIGltYWdlcyBmb3IgYXNwZWN0IHJhdGlvIHRlc3QKLSAgICBUSFJFU19YU19BUl9URVNUID0gMC4wNQotICAgICMgcGFzcy9mYWlsIHRocmVzaG9sZCBvZiBsYXJnZSBzaXplIGltYWdlcyBmb3IgY3JvcCB0ZXN0Ci0gICAgVEhSRVNfTF9DUF9URVNUID0gMC4wMgotICAgICMgcGFzcy9mYWlsIHRocmVzaG9sZCBvZiBtaW5pIHNpemUgaW1hZ2VzIGZvciBjcm9wIHRlc3QKLSAgICBUSFJFU19YU19DUF9URVNUID0gMC4wNQotICAgICMgQ3JvcCB0ZXN0IHdpbGwgYWxsb3cgYXQgbGVhc3QgVEhSRVNfTUlOX1BJWEVMIG9mZnNldAotICAgIFRIUkVTX01JTl9QSVhFTCA9IDQKLSAgICBQUkVWSUVXX1NJWkUgPSAoMTkyMCwgMTA4MCkgIyBwcmV2aWV3IHNpemUKICAgICBhc3BlY3RfcmF0aW9fZ3QgPSAxICAjIGdyb3VuZCB0cnV0aAogICAgIGZhaWxlZF9hciA9IFtdICAjIHN0cmVhbXMgZmFpbGVkIHRoZSBhc3BlY3QgcmF0aW9uIHRlc3QKLSAgICBmYWlsZWRfY3JvcCA9IFtdICMgc3RyZWFtcyBmYWlsZWQgdGhlIGNyb3AgdGVzdAotICAgIGZvcm1hdF9saXN0ID0gW10gIyBmb3JtYXQgbGlzdCBmb3IgbXVsdGlwbGUgY2FwdHVyZSBvYmplY3RzLgorICAgIGZhaWxlZF9jcm9wID0gW10gICMgc3RyZWFtcyBmYWlsZWQgdGhlIGNyb3AgdGVzdAorICAgIGZvcm1hdF9saXN0ID0gW10gICMgZm9ybWF0IGxpc3QgZm9yIG11bHRpcGxlIGNhcHR1cmUgb2JqZWN0cy4KICAgICAjIERvIG11bHRpLWNhcHR1cmUgb2YgIml0ZXIiIGFuZCAiY21wciIuIEl0ZXJhdGUgdGhyb3VnaCBhbGwgdGhlCiAgICAgIyBhdmFpbGFibGUgc2l6ZXMgb2YgIml0ZXIiLCBhbmQgb25seSB1c2UgdGhlIHNpemUgc3BlY2lmaWVkIGZvciAiY21wciIKICAgICAjIERvIHNpbmdsZS1jYXB0dXJlIHRvIGNvdmVyIHVudG91Y2hlZCBzaXplcyBpbiBtdWx0aS1jYXB0dXJlIHdoZW4gbmVlZGVkLgpAQCAtNjUsMjQgKzIwNCwyNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgImNtcHIiOiAicmF3IiwgImNtcHJfc2l6ZSI6IE5vbmV9KQogICAgIGZvcm1hdF9saXN0LmFwcGVuZCh7Iml0ZXIiOiAianBlZyIsICJpdGVyX21heCI6IE5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAiY21wciI6ICJ5dXYiLCAiY21wcl9zaXplIjogUFJFVklFV19TSVpFfSkKKyAgICByZWZfZm92ID0ge30KICAgICB3aXRoIGl0cy5kZXZpY2UuSXRzU2Vzc2lvbigpIGFzIGNhbToKICAgICAgICAgcHJvcHMgPSBjYW0uZ2V0X2NhbWVyYV9wcm9wZXJ0aWVzKCkKLSAgICAgICAgIyBUb2RvOiB0ZXN0IGZvciByYWRpYWwgZGlzdG9ydGlvbiBlbmFibGVkIGRldmljZXMgaGFzIG5vdCB5ZXQgYmVlbgotICAgICAgICAjIGltcGxlbWVudGVkCi0gICAgICAgIGl0cy5jYXBzLnNraXBfdW5sZXNzKG5vdCBpdHMuY2Fwcy5yYWRpYWxfZGlzdG9ydGlvbl9jb3JyZWN0aW9uKHByb3BzKSkKICAgICAgICAgaXRzLmNhcHMuc2tpcF91bmxlc3MoaXRzLmNhcHMucmVhZF8zYShwcm9wcykpCiAgICAgICAgIGZ1bGxfZGV2aWNlID0gaXRzLmNhcHMuZnVsbF9vcl9iZXR0ZXIocHJvcHMpCiAgICAgICAgIGxpbWl0ZWRfZGV2aWNlID0gaXRzLmNhcHMubGltaXRlZChwcm9wcykKICAgICAgICAgaXRzLmNhcHMuc2tpcF91bmxlc3MoZnVsbF9kZXZpY2Ugb3IgbGltaXRlZF9kZXZpY2UpCiAgICAgICAgIGxldmVsM19kZXZpY2UgPSBpdHMuY2Fwcy5sZXZlbDMocHJvcHMpCiAgICAgICAgIHJhd19hdmxiID0gaXRzLmNhcHMucmF3MTYocHJvcHMpCisgICAgICAgIG1vbm9fY2FtZXJhID0gaXRzLmNhcHMubW9ub19jYW1lcmEocHJvcHMpCiAgICAgICAgIHJ1bl9jcm9wX3Rlc3QgPSAobGV2ZWwzX2RldmljZSBvciBmdWxsX2RldmljZSkgYW5kIHJhd19hdmxiCiAgICAgICAgIGlmIG5vdCBydW5fY3JvcF90ZXN0OgogICAgICAgICAgICAgcHJpbnQgIkNyb3AgdGVzdCBza2lwcGVkIgogICAgICAgICBkZWJ1ZyA9IGl0cy5jYXBzLmRlYnVnX21vZGUoKQogICAgICAgICAjIENvbnZlcmdlIDNBIGFuZCBnZXQgdGhlIGVzdGltYXRlcy4KICAgICAgICAgc2VucywgZXhwLCBnYWlucywgeGZvcm0sIGZvY3VzID0gY2FtLmRvXzNhKGdldF9yZXN1bHRzPVRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrX2FlPVRydWUsIGxvY2tfYXdiPVRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrX2FlPVRydWUsIGxvY2tfYXdiPVRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb25vX2NhbWVyYT1tb25vX2NhbWVyYSkKICAgICAgICAgcHJpbnQgIkFFIHNlbnNpdGl2aXR5ICVkLCBleHBvc3VyZSAlZG1zIiAlIChzZW5zLCBleHAgLyAxMDAwMDAwLjApCiAgICAgICAgIHByaW50ICJBV0IgZ2FpbnMiLCBnYWlucwogICAgICAgICBwcmludCAiQVdCIHRyYW5zZm9ybSIsIHhmb3JtCkBAIC05NywyMyArMjM2LDg1IEBACiAgICAgICAgIGlmIHJhd19hdmxiOgogICAgICAgICAgICAgIyBDYXB0dXJlIGZ1bGwtZnJhbWUgcmF3LiBVc2UgaXRzIGFzcGVjdCByYXRpbyBhbmQgY2lyY2xlIGNlbnRlcgogICAgICAgICAgICAgIyBsb2NhdGlvbiBhcyBncm91bmQgdHJ1dGggZm9yIHRoZSBvdGhlciBqZXBnIG9yIHl1diBpbWFnZXMuCisgICAgICAgICAgICBwcmludCAiQ3JlYXRpbmcgcmVmZXJlbmNlcyBmb3IgZm92X2NvdmVyYWdlIGZyb20gUkFXIgogICAgICAgICAgICAgb3V0X3N1cmZhY2UgPSB7ImZvcm1hdCI6ICJyYXcifQogICAgICAgICAgICAgY2FwX3JhdyA9IGNhbS5kb19jYXB0dXJlKHJlcSwgb3V0X3N1cmZhY2UpCiAgICAgICAgICAgICBwcmludCAiQ2FwdHVyZWQgJXMgJWR4JWQiICUgKCJyYXciLCBjYXBfcmF3WyJ3aWR0aCJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBfcmF3WyJoZWlnaHQiXSkKICAgICAgICAgICAgIGltZ19yYXcgPSBpdHMuaW1hZ2UuY29udmVydF9jYXB0dXJlX3RvX3JnYl9pbWFnZShjYXBfcmF3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzPXByb3BzKQorICAgICAgICAgICAgaWYgaXRzLmNhcHMuZGlzdG9ydGlvbl9jb3JyZWN0aW9uKHByb3BzKToKKyAgICAgICAgICAgICAgICAjIFRoZSBpbnRyaW5zaWNzIGFuZCBkaXN0b3J0aW9uIGNvZWZmaWNpZW50cyBhcmUgbWVhbnQgZm9yIGZ1bGwKKyAgICAgICAgICAgICAgICAjIHNpemUgUkFXLiBSZXNpemUgYmFjayB0byBmdWxsIHNpemUgaGVyZS4KKyAgICAgICAgICAgICAgICBpbWdfcmF3ID0gY3YyLnJlc2l6ZShpbWdfcmF3LCAoMCwwKSwgZng9Mi4wLCBmeT0yLjApCisgICAgICAgICAgICAgICAgIyBJbnRyaW5zaWMgY2FsIGlzIG9mIGZvcm1hdDogW2ZfeCwgZl95LCBjX3gsIGNfeSwgc10KKyAgICAgICAgICAgICAgICAjIFtmX3gsIGZfeV0gaXMgdGhlIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGZvY2FsIGxlbmd0aHMsCisgICAgICAgICAgICAgICAgIyBbY194LCBjX3ldIGlzIHRoZSBwb3NpdGlvbiBvZiB0aGUgb3B0aWNhbCBheGlzLAorICAgICAgICAgICAgICAgICMgYW5kIHMgaXMgc2tldyBvZiBzZW5zb3IgcGxhbmUgdnMgbGVucyBwbGFuZS4KKyAgICAgICAgICAgICAgICBwcmludCAiQXBwbHlpbmcgaW50cmluc2ljIGNhbGlicmF0aW9uIGFuZCBkaXN0b3J0aW9uIHBhcmFtcyIKKyAgICAgICAgICAgICAgICBpY2FsID0gbnAuYXJyYXkocHJvcHNbImFuZHJvaWQubGVucy5pbnRyaW5zaWNDYWxpYnJhdGlvbiJdKQorICAgICAgICAgICAgICAgIG1zZyA9ICJDYW5ub3QgaW5jbHVkZSBsZW5zIGRpc3RvcnRpb24gd2l0aG91dCBpbnRyaW5zaWMgY2FsISIKKyAgICAgICAgICAgICAgICBhc3NlcnQgbGVuKGljYWwpID09IDUsIG1zZworICAgICAgICAgICAgICAgIHNlbnNvcl9oID0gcHJvcHNbImFuZHJvaWQuc2Vuc29yLmluZm8ucGh5c2ljYWxTaXplIl1bImhlaWdodCJdCisgICAgICAgICAgICAgICAgc2Vuc29yX3cgPSBwcm9wc1siYW5kcm9pZC5zZW5zb3IuaW5mby5waHlzaWNhbFNpemUiXVsid2lkdGgiXQorICAgICAgICAgICAgICAgIHBpeGVsX2ggPSBwcm9wc1siYW5kcm9pZC5zZW5zb3IuaW5mby5waXhlbEFycmF5U2l6ZSJdWyJoZWlnaHQiXQorICAgICAgICAgICAgICAgIHBpeGVsX3cgPSBwcm9wc1siYW5kcm9pZC5zZW5zb3IuaW5mby5waXhlbEFycmF5U2l6ZSJdWyJ3aWR0aCJdCisgICAgICAgICAgICAgICAgZmQgPSBmbG9hdChwcm9wc1siYW5kcm9pZC5sZW5zLmluZm8uYXZhaWxhYmxlRm9jYWxMZW5ndGhzIl1bMF0pCisgICAgICAgICAgICAgICAgZmRfd19waXggPSBwaXhlbF93ICogZmQgLyBzZW5zb3JfdworICAgICAgICAgICAgICAgIGZkX2hfcGl4ID0gcGl4ZWxfaCAqIGZkIC8gc2Vuc29yX2gKKyAgICAgICAgICAgICAgICAjIHRyYW5zZm9ybWF0aW9uIG1hdHJpeAorICAgICAgICAgICAgICAgICMgayA9IFtbZl94LCBzLCBjX3hdLAorICAgICAgICAgICAgICAgICMgICAgICBbMCwgZl95LCBjX3ldLAorICAgICAgICAgICAgICAgICMgICAgICBbMCwgICAwLCAgIDFdXQorICAgICAgICAgICAgICAgIGsgPSBucC5hcnJheShbW2ljYWxbMF0sIGljYWxbNF0sIGljYWxbMl1dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAsIGljYWxbMV0sIGljYWxbM11dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAsIDAsIDFdXSkKKyAgICAgICAgICAgICAgICBwcmludCAiazoiLCBrCisgICAgICAgICAgICAgICAgZV9tc2cgPSAiZmRfdyhwaXhlbHMpOiAlLjJmXHRjYWxbMF0ocGl4ZWxzKTogJS4yZlx0VE9MPTIwJSUiICUgKAorICAgICAgICAgICAgICAgICAgICAgICAgZmRfd19waXgsIGljYWxbMF0pCisgICAgICAgICAgICAgICAgYXNzZXJ0IG5wLmlzY2xvc2UoZmRfd19waXgsIGljYWxbMF0sIHJ0b2w9MC4yMCksIGVfbXNnCisgICAgICAgICAgICAgICAgZV9tc2cgPSAiZmRfaChwaXhlbHMpOiAlLjJmXHRjYWxbMV0ocGl4ZWxzKTogJS4yZlx0VE9MPTIwJSUiICUgKAorICAgICAgICAgICAgICAgICAgICAgICAgZmRfaF9waXgsIGljYWxbMF0pCisgICAgICAgICAgICAgICAgYXNzZXJ0IG5wLmlzY2xvc2UoZmRfaF9waXgsIGljYWxbMV0sIHJ0b2w9MC4yMCksIGVfbXNnCisKKyAgICAgICAgICAgICAgICAjIGRpc3RvcnRpb24KKyAgICAgICAgICAgICAgICByYWRfZGlzdCA9IHByb3BzWyJhbmRyb2lkLmxlbnMuZGlzdG9ydGlvbiJdCisgICAgICAgICAgICAgICAgcHJpbnQgImFuZHJvaWQubGVucy5kaXN0b3J0aW9uOiIsIHJhZF9kaXN0CisgICAgICAgICAgICAgICAgZV9tc2cgPSAiJXMgcGFyYW0ocykgZm91bmQuICVkIGV4cGVjdGVkLiIgJSAobGVuKHJhZF9kaXN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVU1fRElTVE9SVF9QQVJBTVMpCisgICAgICAgICAgICAgICAgYXNzZXJ0IGxlbihyYWRfZGlzdCkgPT0gTlVNX0RJU1RPUlRfUEFSQU1TLCBlX21zZworICAgICAgICAgICAgICAgIG9wZW5jdl9kaXN0ID0gbnAuYXJyYXkoW3JhZF9kaXN0WzBdLCByYWRfZGlzdFsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWRfZGlzdFszXSwgcmFkX2Rpc3RbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFkX2Rpc3RbMl1dKQorICAgICAgICAgICAgICAgIHByaW50ICJkaXN0OiIsIG9wZW5jdl9kaXN0CisgICAgICAgICAgICAgICAgaW1nX3JhdyA9IGN2Mi51bmRpc3RvcnQoaW1nX3Jhdywgaywgb3BlbmN2X2Rpc3QpCiAgICAgICAgICAgICBzaXplX3JhdyA9IGltZ19yYXcuc2hhcGUKLSAgICAgICAgICAgIGltZ19uYW1lID0gIiVzXyVzX3clZF9oJWQucG5nIiBcCi0gICAgICAgICAgICAgICAgICAgICAgICUgKE5BTUUsICJyYXciLCBzaXplX3Jhd1sxXSwgc2l6ZV9yYXdbMF0pCisgICAgICAgICAgICB3X3JhdyA9IHNpemVfcmF3WzFdCisgICAgICAgICAgICBoX3JhdyA9IHNpemVfcmF3WzBdCisgICAgICAgICAgICBpbWdfbmFtZSA9ICIlc18lc193JWRfaCVkLnBuZyIgJSAoTkFNRSwgInJhdyIsIHdfcmF3LCBoX3JhdykKICAgICAgICAgICAgIGFzcGVjdF9yYXRpb19ndCwgY2NfY3RfZ3QsIGNpcmNsZV9zaXplX3JhdyA9IG1lYXN1cmVfYXNwZWN0X3JhdGlvKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nX3JhdywgMSwgaW1nX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZykKKyAgICAgICAgICAgICAgICAgICAgaW1nX3JhdywgcmF3X2F2bGIsIGltZ19uYW1lLCBkZWJ1ZykKKyAgICAgICAgICAgIHJhd19mb3ZfcGVyY2VudCA9IGNhbGNfY2lyY2xlX2ltYWdlX3JhdGlvKAorICAgICAgICAgICAgICAgICAgICBjaXJjbGVfc2l6ZV9yYXdbMV0sIGNpcmNsZV9zaXplX3Jhd1swXSwgd19yYXcsIGhfcmF3KQogICAgICAgICAgICAgIyBOb3JtYWxpemUgdGhlIGNpcmNsZSBzaXplIHRvIDEvNCBvZiB0aGUgaW1hZ2Ugc2l6ZSwgc28gdGhhdAotICAgICAgICAgICAgIyBjaXJjbGUgc2l6ZSB3b24idCBhZmZlY3QgdGhlIGNyb3AgdGVzdCByZXN1bHQKKyAgICAgICAgICAgICMgY2lyY2xlIHNpemUgd29uJ3QgYWZmZWN0IHRoZSBjcm9wIHRlc3QgcmVzdWx0CiAgICAgICAgICAgICBmYWN0b3JfY3BfdGhyZXMgPSAobWluKHNpemVfcmF3WzA6MV0pLzQuMCkgLyBtYXgoY2lyY2xlX3NpemVfcmF3KQotICAgICAgICAgICAgdGhyZXNfbF9jcF90ZXN0ID0gVEhSRVNfTF9DUF9URVNUICogZmFjdG9yX2NwX3RocmVzCi0gICAgICAgICAgICB0aHJlc194c19jcF90ZXN0ID0gVEhSRVNfWFNfQ1BfVEVTVCAqIGZhY3Rvcl9jcF90aHJlcworICAgICAgICAgICAgdGhyZXNfbF9jcF90ZXN0ID0gVEhSRVNIX0xfQ1AgKiBmYWN0b3JfY3BfdGhyZXMKKyAgICAgICAgICAgIHRocmVzX3hzX2NwX3Rlc3QgPSBUSFJFU0hfWFNfQ1AgKiBmYWN0b3JfY3BfdGhyZXMKKyAgICAgICAgICAgICMgSWYgUkFXIGluIEFSX0NIRUNLRUQsIHVzZSBpdCBhcyByZWZlcmVuY2UKKyAgICAgICAgICAgIHJlZl9mb3ZbImZtdCJdID0gZGV0ZXJtaW5lX3NlbnNvcl9hc3BlY3RfcmF0aW8ocHJvcHMpCisgICAgICAgICAgICBpZiByZWZfZm92WyJmbXQiXToKKyAgICAgICAgICAgICAgICByZWZfZm92WyJwZXJjZW50Il0gPSByYXdfZm92X3BlcmNlbnQKKyAgICAgICAgICAgICAgICByZWZfZm92WyJ3Il0gPSB3X3JhdworICAgICAgICAgICAgICAgIHJlZl9mb3ZbImgiXSA9IGhfcmF3CisgICAgICAgICAgICAgICAgcHJpbnQgIlVzaW5nIFJBVyByZWZlcmVuY2U6IiwgcmVmX2ZvdgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZWZfZm92ID0gZmluZF95dXZfZm92X3JlZmVyZW5jZShjYW0sIHJlcSwgcHJvcHMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZWZfZm92ID0gZmluZF95dXZfZm92X3JlZmVyZW5jZShjYW0sIHJlcSwgcHJvcHMpCisKKyAgICAgICAgIyBEZXRlcm1pbmUgc2NhbGluZyBmYWN0b3JzIGZvciBBUiBjYWxjdWxhdGlvbnMKKyAgICAgICAgYXJfc2NhbGluZyA9IGFzcGVjdF9yYXRpb19zY2FsZV9mYWN0b3JzKHJlZl9mb3ZbImZtdCJdLCBwcm9wcykKIAogICAgICAgICAjIFRha2UgcGljdHVyZXMgb2YgZWFjaCBzZXR0aW5ncyB3aXRoIGFsbCB0aGUgaW1hZ2Ugc2l6ZXMgYXZhaWxhYmxlLgogICAgICAgICBmb3IgZm10IGluIGZvcm1hdF9saXN0OgpAQCAtMTI0LDcgKzMyNSw3IEBACiAgICAgICAgICAgICBpZiBkdWFsX3RhcmdldDoKICAgICAgICAgICAgICAgICBzaXplcyA9IGl0cy5vYmplY3RzLmdldF9hdmFpbGFibGVfb3V0cHV0X3NpemVzKAogICAgICAgICAgICAgICAgICAgICAgICAgZm10X2NtcHIsIHByb3BzLCBmbXRbImNtcHJfc2l6ZSJdKQotICAgICAgICAgICAgICAgIGlmIGxlbihzaXplcykgPT0gMDogIyBkZXZpY2UgbWlnaHQgbm90IHN1cHBvcnQgUkFXCisgICAgICAgICAgICAgICAgaWYgbm90IHNpemVzOiAgIyBkZXZpY2UgbWlnaHQgbm90IHN1cHBvcnQgUkFXCiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgc2l6ZV9jbXByID0gc2l6ZXNbMF0KICAgICAgICAgICAgIGZvciBzaXplX2l0ZXIgaW4gaXRzLm9iamVjdHMuZ2V0X2F2YWlsYWJsZV9vdXRwdXRfc2l6ZXMoCkBAIC0xMzMsMTAgKzMzNCw5IEBACiAgICAgICAgICAgICAgICAgaF9pdGVyID0gc2l6ZV9pdGVyWzFdCiAgICAgICAgICAgICAgICAgIyBTa2lwIHRlc3Rpbmcgc2FtZSBmb3JtYXQvc2l6ZSBjb21iaW5hdGlvbgogICAgICAgICAgICAgICAgICMgSVRTIGRvZXMgbm90IGhhbmRsZSB0aGF0IHByb3Blcmx5IG5vdwotICAgICAgICAgICAgICAgIGlmIGR1YWxfdGFyZ2V0IGFuZCBcCi0gICAgICAgICAgICAgICAgICAgICAgICB3X2l0ZXIgPT0gc2l6ZV9jbXByWzBdIGFuZCBcCi0gICAgICAgICAgICAgICAgICAgICAgICBoX2l0ZXIgPT0gc2l6ZV9jbXByWzFdIGFuZCBcCi0gICAgICAgICAgICAgICAgICAgICAgICBmbXRfaXRlciA9PSBmbXRfY21wcjoKKyAgICAgICAgICAgICAgICBpZiAoZHVhbF90YXJnZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgd19pdGVyKmhfaXRlciA9PSBzaXplX2NtcHJbMF0qc2l6ZV9jbXByWzFdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGZtdF9pdGVyID09IGZtdF9jbXByKToKICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICBvdXRfc3VyZmFjZSA9IFt7IndpZHRoIjogd19pdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGVpZ2h0IjogaF9pdGVyLApAQCAtMTUwLDM0ICszNTAsNjQgQEAKICAgICAgICAgICAgICAgICAgICAgZnJtX2l0ZXIgPSBjYXBbMF0KICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICBmcm1faXRlciA9IGNhcAotICAgICAgICAgICAgICAgIGFzc2VydCAoZnJtX2l0ZXJbImZvcm1hdCJdID09IGZtdF9pdGVyKQotICAgICAgICAgICAgICAgIGFzc2VydCAoZnJtX2l0ZXJbIndpZHRoIl0gPT0gd19pdGVyKQotICAgICAgICAgICAgICAgIGFzc2VydCAoZnJtX2l0ZXJbImhlaWdodCJdID09IGhfaXRlcikKLSAgICAgICAgICAgICAgICBwcmludCAiQ2FwdHVyZWQgJXMgd2l0aCAlcyAlZHglZCIgXAotICAgICAgICAgICAgICAgICAgICAgICAgJSAoZm10X2l0ZXIsIGZtdF9jbXByLCB3X2l0ZXIsIGhfaXRlcikKKyAgICAgICAgICAgICAgICBhc3NlcnQgZnJtX2l0ZXJbImZvcm1hdCJdID09IGZtdF9pdGVyCisgICAgICAgICAgICAgICAgYXNzZXJ0IGZybV9pdGVyWyJ3aWR0aCJdID09IHdfaXRlcgorICAgICAgICAgICAgICAgIGFzc2VydCBmcm1faXRlclsiaGVpZ2h0Il0gPT0gaF9pdGVyCisgICAgICAgICAgICAgICAgcHJpbnQgIkNhcHR1cmVkICVzIHdpdGggJXMgJWR4JWQuIENvbXBhcmVkIHNpemU6ICVkeCVkIiAlICgKKyAgICAgICAgICAgICAgICAgICAgICAgIGZtdF9pdGVyLCBmbXRfY21wciwgd19pdGVyLCBoX2l0ZXIsIHNpemVfY21wclswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfY21wclsxXSkKICAgICAgICAgICAgICAgICBpbWcgPSBpdHMuaW1hZ2UuY29udmVydF9jYXB0dXJlX3RvX3JnYl9pbWFnZShmcm1faXRlcikKLSAgICAgICAgICAgICAgICBpbWdfbmFtZSA9ICIlc18lc193aXRoXyVzX3clZF9oJWQucG5nIiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAlIChOQU1FLCBmbXRfaXRlciwgZm10X2NtcHIsIHdfaXRlciwgaF9pdGVyKQotICAgICAgICAgICAgICAgIGFzcGVjdF9yYXRpbywgY2NfY3QsIChjY193LCBjY19oKSA9IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmVfYXNwZWN0X3JhdGlvKGltZywgcmF3X2F2bGIsIGltZ19uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcpCisgICAgICAgICAgICAgICAgaWYgaXRzLmNhcHMuZGlzdG9ydGlvbl9jb3JyZWN0aW9uKHByb3BzKSBhbmQgcmF3X2F2bGI6CisgICAgICAgICAgICAgICAgICAgIHdfc2NhbGUgPSBmbG9hdCh3X2l0ZXIpL3dfcmF3CisgICAgICAgICAgICAgICAgICAgIGhfc2NhbGUgPSBmbG9hdChoX2l0ZXIpL2hfcmF3CisgICAgICAgICAgICAgICAgICAgIGtfc2NhbGUgPSBucC5hcnJheShbW2ljYWxbMF0qd19zY2FsZSwgaWNhbFs0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNhbFsyXSp3X3NjYWxlXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMCwgaWNhbFsxXSpoX3NjYWxlLCBpY2FsWzNdKmhfc2NhbGVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLCAwLCAxXV0pCisgICAgICAgICAgICAgICAgICAgIHByaW50ICJrX3NjYWxlOiIsIGtfc2NhbGUKKyAgICAgICAgICAgICAgICAgICAgaW1nID0gY3YyLnVuZGlzdG9ydChpbWcsIGtfc2NhbGUsIG9wZW5jdl9kaXN0KQorICAgICAgICAgICAgICAgIGltZ19uYW1lID0gIiVzXyVzX3dpdGhfJXNfdyVkX2glZC5wbmciICUgKE5BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm10X2l0ZXIsIGZtdF9jbXByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdfaXRlciwgaF9pdGVyKQorICAgICAgICAgICAgICAgIGFzcGVjdF9yYXRpbywgY2NfY3QsIChjY193LCBjY19oKSA9IG1lYXN1cmVfYXNwZWN0X3JhdGlvKAorICAgICAgICAgICAgICAgICAgICAgICAgaW1nLCByYXdfYXZsYiwgaW1nX25hbWUsIGRlYnVnKQorICAgICAgICAgICAgICAgICMgY2hlY2sgZm92IGNvdmVyYWdlIGZvciBhbGwgZm10cyBpbiBBUl9DSEVDS0VECisgICAgICAgICAgICAgICAgZm92X3BlcmNlbnQgPSBjYWxjX2NpcmNsZV9pbWFnZV9yYXRpbygKKyAgICAgICAgICAgICAgICAgICAgICAgIGNjX3csIGNjX2gsIHdfaXRlciwgaF9pdGVyKQorICAgICAgICAgICAgICAgIGZvciBhcl9jaGVjayBpbiBBUl9DSEVDS0VEOgorICAgICAgICAgICAgICAgICAgICBtYXRjaF9hcl9saXN0ID0gW2Zsb2F0KHgpIGZvciB4IGluIGFyX2NoZWNrLnNwbGl0KCI6IildCisgICAgICAgICAgICAgICAgICAgIG1hdGNoX2FyID0gbWF0Y2hfYXJfbGlzdFswXSAvIG1hdGNoX2FyX2xpc3RbMV0KKyAgICAgICAgICAgICAgICAgICAgaWYgbnAuaXNjbG9zZShmbG9hdCh3X2l0ZXIpL2hfaXRlciwgbWF0Y2hfYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXRvbD1GTVRfQVRPTCk6CisgICAgICAgICAgICAgICAgICAgICAgICAjIHNjYWxlIGNoZWNrIHZhbHVlIGJhc2VkIG9uIGFzcGVjdCByYXRpbworICAgICAgICAgICAgICAgICAgICAgICAgY2hrX3BlcmNlbnQgPSByZWZfZm92WyJwZXJjZW50Il0gKiBhcl9zY2FsaW5nW2FyX2NoZWNrXQorCisgICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSAiRm9WICUlOiAlLjJmLCBSZWYgRm9WICUlOiAlLjJmLCBUT0w9JS5mJSUsICIgJSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdl9wZXJjZW50LCBjaGtfcGVyY2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9WX1BFUkNFTlRfUlRPTCoxMDApCisgICAgICAgICAgICAgICAgICAgICAgICBtc2cgKz0gImltZzogJWR4JWQsIHJlZjogJWR4JWQiICUgKHdfaXRlciwgaF9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZfZm92WyJ3Il0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZl9mb3ZbImgiXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCBucC5pc2Nsb3NlKGZvdl9wZXJjZW50LCBjaGtfcGVyY2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0b2w9Rk9WX1BFUkNFTlRfUlRPTCksIG1zZwogICAgICAgICAgICAgICAgICMgY2hlY2sgcGFzcy9mYWlsIGZvciBhc3BlY3QgcmF0aW8KLSAgICAgICAgICAgICAgICAjIGltYWdlIHNpemUgPj0gTEFSR0VfU0laRTogdXNlIFRIUkVTX0xfQVJfVEVTVAotICAgICAgICAgICAgICAgICMgaW1hZ2Ugc2l6ZSA9PSAwIChleHRyZW1lIGNhc2UpOiBUSFJFU19YU19BUl9URVNUCi0gICAgICAgICAgICAgICAgIyAwIDwgaW1hZ2Ugc2l6ZSA8IExBUkdFX1NJWkU6IHNjYWxlIGJldHdlZW4gVEhSRVNfWFNfQVJfVEVTVAotICAgICAgICAgICAgICAgICMgYW5kIFRIUkVTX0xfQVJfVEVTVAotICAgICAgICAgICAgICAgIHRocmVzX2FyX3Rlc3QgPSBtYXgoVEhSRVNfTF9BUl9URVNULAotICAgICAgICAgICAgICAgICAgICAgICAgVEhSRVNfWFNfQVJfVEVTVCArIG1heCh3X2l0ZXIsIGhfaXRlcikgKgotICAgICAgICAgICAgICAgICAgICAgICAgKFRIUkVTX0xfQVJfVEVTVC1USFJFU19YU19BUl9URVNUKS9MQVJHRV9TSVpFKQorICAgICAgICAgICAgICAgICMgaW1hZ2Ugc2l6ZSA+PSBMQVJHRV9TSVpFOiB1c2UgVEhSRVNIX0xfQVIKKyAgICAgICAgICAgICAgICAjIGltYWdlIHNpemUgPT0gMCAoZXh0cmVtZSBjYXNlKTogVEhSRVNIX1hTX0FSCisgICAgICAgICAgICAgICAgIyAwIDwgaW1hZ2Ugc2l6ZSA8IExBUkdFX1NJWkU6IHNjYWxlIGJldHdlZW4gVEhSRVNIX1hTX0FSCisgICAgICAgICAgICAgICAgIyBhbmQgVEhSRVNIX0xfQVIKKyAgICAgICAgICAgICAgICB0aHJlc19hcl90ZXN0ID0gbWF4KAorICAgICAgICAgICAgICAgICAgICAgICAgVEhSRVNIX0xfQVIsIFRIUkVTSF9YU19BUiArIG1heCh3X2l0ZXIsIGhfaXRlcikgKgorICAgICAgICAgICAgICAgICAgICAgICAgKFRIUkVTSF9MX0FSLVRIUkVTSF9YU19BUikvTEFSR0VfU0laRSkKICAgICAgICAgICAgICAgICB0aHJlc19yYW5nZV9hciA9IChhc3BlY3RfcmF0aW9fZ3QtdGhyZXNfYXJfdGVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3BlY3RfcmF0aW9fZ3QrdGhyZXNfYXJfdGVzdCkKLSAgICAgICAgICAgICAgICBpZiBhc3BlY3RfcmF0aW8gPCB0aHJlc19yYW5nZV9hclswXSBcCi0gICAgICAgICAgICAgICAgICAgICAgICBvciBhc3BlY3RfcmF0aW8gPiB0aHJlc19yYW5nZV9hclsxXToKKyAgICAgICAgICAgICAgICBpZiAoYXNwZWN0X3JhdGlvIDwgdGhyZXNfcmFuZ2VfYXJbMF0gb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3BlY3RfcmF0aW8gPiB0aHJlc19yYW5nZV9hclsxXSk6CiAgICAgICAgICAgICAgICAgICAgIGZhaWxlZF9hci5hcHBlbmQoeyJmbXRfaXRlciI6IGZtdF9pdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm10X2NtcHIiOiBmbXRfY21wciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInciOiB3X2l0ZXIsICJoIjogaF9pdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXIiOiBhc3BlY3RfcmF0aW8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWxpZF9yYW5nZSI6IHRocmVzX3JhbmdlX2FyfSkKKyAgICAgICAgICAgICAgICAgICAgaXRzLmltYWdlLndyaXRlX2ltYWdlKGltZy8yNTUsIGltZ19uYW1lLCBUcnVlKQogCiAgICAgICAgICAgICAgICAgIyBjaGVjayBwYXNzL2ZhaWwgZm9yIGNyb3AKICAgICAgICAgICAgICAgICBpZiBydW5fY3JvcF90ZXN0OgpAQCAtMTg1LDI5ICs0MTUsMjkgQEAKICAgICAgICAgICAgICAgICAgICAgIyBpbWFnZSBzaXplID09IDAgKGV4dHJlbWUgY2FzZSk6IHRocmVzX3hzX2NwX3Rlc3QKICAgICAgICAgICAgICAgICAgICAgIyAwIDwgaW1hZ2Ugc2l6ZSA8IExBUkdFX1NJWkU6IHNjYWxlIGJldHdlZW4KICAgICAgICAgICAgICAgICAgICAgIyB0aHJlc194c19jcF90ZXN0IGFuZCB0aHJlc19sX2NwX3Rlc3QKLSAgICAgICAgICAgICAgICAgICAgIyBBbHNvLCBhbGxvdyBhdCBsZWFzdCBUSFJFU19NSU5fUElYRUwgb2ZmIHRvCisgICAgICAgICAgICAgICAgICAgICMgQWxzbywgYWxsb3cgYXQgbGVhc3QgVEhSRVNIX01JTl9QSVhFTCBvZmYgdG8KICAgICAgICAgICAgICAgICAgICAgIyBwcmV2ZW50IHRocmVzaG9sZCBiZWluZyB0b28gdGlnaHQgZm9yIHZlcnkKICAgICAgICAgICAgICAgICAgICAgIyBzbWFsbCBjaXJjbGUKLSAgICAgICAgICAgICAgICAgICAgdGhyZXNfaG9yaV9jcF90ZXN0ID0gbWF4KHRocmVzX2xfY3BfdGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlc194c19jcF90ZXN0ICsgd19pdGVyICoKKyAgICAgICAgICAgICAgICAgICAgdGhyZXNfaG9yaV9jcF90ZXN0ID0gbWF4KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVzX2xfY3BfdGVzdCwgdGhyZXNfeHNfY3BfdGVzdCArIHdfaXRlciAqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRocmVzX2xfY3BfdGVzdC10aHJlc194c19jcF90ZXN0KS9MQVJHRV9TSVpFKQotICAgICAgICAgICAgICAgICAgICBtaW5fdGhyZXNob2xkX2ggPSBUSFJFU19NSU5fUElYRUwgLyBjY193CisgICAgICAgICAgICAgICAgICAgIG1pbl90aHJlc2hvbGRfaCA9IFRIUkVTSF9NSU5fUElYRUwgLyBjY193CiAgICAgICAgICAgICAgICAgICAgIHRocmVzX2hvcmlfY3BfdGVzdCA9IG1heCh0aHJlc19ob3JpX2NwX3Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX3RocmVzaG9sZF9oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX3RocmVzaG9sZF9oKQogICAgICAgICAgICAgICAgICAgICB0aHJlc19yYW5nZV9oX2NwID0gKGNjX2N0X2d0WyJob3JpIl0tdGhyZXNfaG9yaV9jcF90ZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjX2N0X2d0WyJob3JpIl0rdGhyZXNfaG9yaV9jcF90ZXN0KQotICAgICAgICAgICAgICAgICAgICB0aHJlc192ZXJ0X2NwX3Rlc3QgPSBtYXgodGhyZXNfbF9jcF90ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVzX3hzX2NwX3Rlc3QgKyBoX2l0ZXIgKgorICAgICAgICAgICAgICAgICAgICB0aHJlc192ZXJ0X2NwX3Rlc3QgPSBtYXgoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNfbF9jcF90ZXN0LCB0aHJlc194c19jcF90ZXN0ICsgaF9pdGVyICoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhyZXNfbF9jcF90ZXN0LXRocmVzX3hzX2NwX3Rlc3QpL0xBUkdFX1NJWkUpCi0gICAgICAgICAgICAgICAgICAgIG1pbl90aHJlc2hvbGRfdiA9IFRIUkVTX01JTl9QSVhFTCAvIGNjX2gKKyAgICAgICAgICAgICAgICAgICAgbWluX3RocmVzaG9sZF92ID0gVEhSRVNIX01JTl9QSVhFTCAvIGNjX2gKICAgICAgICAgICAgICAgICAgICAgdGhyZXNfdmVydF9jcF90ZXN0ID0gbWF4KHRocmVzX3ZlcnRfY3BfdGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fdGhyZXNob2xkX3YpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fdGhyZXNob2xkX3YpCiAgICAgICAgICAgICAgICAgICAgIHRocmVzX3JhbmdlX3ZfY3AgPSAoY2NfY3RfZ3RbInZlcnQiXS10aHJlc192ZXJ0X2NwX3Rlc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2NfY3RfZ3RbInZlcnQiXSt0aHJlc192ZXJ0X2NwX3Rlc3QpCi0gICAgICAgICAgICAgICAgICAgIGlmIGNjX2N0WyJob3JpIl0gPCB0aHJlc19yYW5nZV9oX2NwWzBdIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBjY19jdFsiaG9yaSJdID4gdGhyZXNfcmFuZ2VfaF9jcFsxXSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgY2NfY3RbInZlcnQiXSA8IHRocmVzX3JhbmdlX3ZfY3BbMF0gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGNjX2N0WyJ2ZXJ0Il0gPiB0aHJlc19yYW5nZV92X2NwWzFdOgorICAgICAgICAgICAgICAgICAgICBpZiAoY2NfY3RbImhvcmkiXSA8IHRocmVzX3JhbmdlX2hfY3BbMF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgY2NfY3RbImhvcmkiXSA+IHRocmVzX3JhbmdlX2hfY3BbMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgY2NfY3RbInZlcnQiXSA8IHRocmVzX3JhbmdlX3ZfY3BbMF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgY2NfY3RbInZlcnQiXSA+IHRocmVzX3JhbmdlX3ZfY3BbMV0pOgogICAgICAgICAgICAgICAgICAgICAgICAgZmFpbGVkX2Nyb3AuYXBwZW5kKHsiZm10X2l0ZXIiOiBmbXRfaXRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZtdF9jbXByIjogZm10X2NtcHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3Ijogd19pdGVyLCAiaCI6IGhfaXRlciwKQEAgLTIxNSw2ICs0NDUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3RfdmVydCI6IGNjX2N0WyJ2ZXJ0Il0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWxpZF9yYW5nZV9oIjogdGhyZXNfcmFuZ2VfaF9jcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbGlkX3JhbmdlX3YiOiB0aHJlc19yYW5nZV92X2NwfSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0cy5pbWFnZS53cml0ZV9pbWFnZShpbWcvMjU1LCBpbWdfbmFtZSwgVHJ1ZSkKIAogICAgICAgICAjIFByaW50IGFzcGVjdCByYXRpbyB0ZXN0IHJlc3VsdHMKICAgICAgICAgZmFpbGVkX2ltYWdlX251bWJlcl9mb3JfYXNwZWN0X3JhdGlvX3Rlc3QgPSBsZW4oZmFpbGVkX2FyKQpAQCAtMjIzLDMzICs0NTQsMzQgQEAKICAgICAgICAgICAgIHByaW50ICJJbWFnZXMgZmFpbGVkIGluIHRoZSBhc3BlY3QgcmF0aW8gdGVzdDoiCiAgICAgICAgICAgICBwcmludCAiQXNwZWN0IHJhdGlvIHZhbHVlOiB3aWR0aCAvIGhlaWdodCIKICAgICAgICAgZm9yIGZhIGluIGZhaWxlZF9hcjoKLSAgICAgICAgICAgIHByaW50ICIlcyB3aXRoICVzICVkeCVkOiAlLjNmOyB2YWxpZCByYW5nZTogJS4zZiB+ICUuM2YiICUgXAotICAgICAgICAgICAgICAgICAgKGZhWyJmbXRfaXRlciJdLCBmYVsiZm10X2NtcHIiXSwgZmFbInciXSwgZmFbImgiXSwgZmFbImFyIl0sCi0gICAgICAgICAgICAgICAgICAgZmFbInZhbGlkX3JhbmdlIl1bMF0sIGZhWyJ2YWxpZF9yYW5nZSJdWzFdKQorICAgICAgICAgICAgcHJpbnQgIiVzIHdpdGggJXMgJWR4JWQ6ICUuM2Y7IiAlIChmYVsiZm10X2l0ZXIiXSwgZmFbImZtdF9jbXByIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhWyJ3Il0sIGZhWyJoIl0sIGZhWyJhciJdKSwKKyAgICAgICAgICAgIHByaW50ICJ2YWxpZCByYW5nZTogJS4zZiB+ICUuM2YiICUgKGZhWyJ2YWxpZF9yYW5nZSJdWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFbInZhbGlkX3JhbmdlIl1bMV0pCiAKICAgICAgICAgIyBQcmludCBjcm9wIHRlc3QgcmVzdWx0cwogICAgICAgICBmYWlsZWRfaW1hZ2VfbnVtYmVyX2Zvcl9jcm9wX3Rlc3QgPSBsZW4oZmFpbGVkX2Nyb3ApCiAgICAgICAgIGlmIGZhaWxlZF9pbWFnZV9udW1iZXJfZm9yX2Nyb3BfdGVzdCA+IDA6CiAgICAgICAgICAgICBwcmludCAiXG5Dcm9wIHRlc3Qgc3VtbWFyeSIKICAgICAgICAgICAgIHByaW50ICJJbWFnZXMgZmFpbGVkIGluIHRoZSBjcm9wIHRlc3Q6IgotICAgICAgICAgICAgcHJpbnQgIkNpcmNsZSBjZW50ZXIgcG9zaXRpb24sIChob3Jpem9udGFsIHggdmVydGljYWwpLCBsaXN0ZWQgIiBcCi0gICAgICAgICAgICAgICAgICAiYmVsb3cgaXMgcmVsYXRpdmUgdG8gdGhlIGltYWdlIGNlbnRlci4iCisgICAgICAgICAgICBwcmludCAiQ2lyY2xlIGNlbnRlciBwb3NpdGlvbiwgKGhvcml6b250YWwgeCB2ZXJ0aWNhbCksIGxpc3RlZCIsCisgICAgICAgICAgICBwcmludCAiYmVsb3cgaXMgcmVsYXRpdmUgdG8gdGhlIGltYWdlIGNlbnRlci4iCiAgICAgICAgIGZvciBmYyBpbiBmYWlsZWRfY3JvcDoKLSAgICAgICAgICAgIHByaW50ICIlcyB3aXRoICVzICVkeCVkOiAlLjNmIHggJS4zZjsgIiBcCi0gICAgICAgICAgICAgICAgICAgICJ2YWxpZCBob3Jpem9udGFsIHJhbmdlOiAlLjNmIH4gJS4zZjsgIiBcCi0gICAgICAgICAgICAgICAgICAgICJ2YWxpZCB2ZXJ0aWNhbCByYW5nZTogJS4zZiB+ICUuM2YiIFwKLSAgICAgICAgICAgICAgICAgICAgJSAoZmNbImZtdF9pdGVyIl0sIGZjWyJmbXRfY21wciJdLCBmY1sidyJdLCBmY1siaCJdLAotICAgICAgICAgICAgICAgICAgICBmY1siY3RfaG9yaSJdLCBmY1siY3RfdmVydCJdLCBmY1sidmFsaWRfcmFuZ2VfaCJdWzBdLAotICAgICAgICAgICAgICAgICAgICBmY1sidmFsaWRfcmFuZ2VfaCJdWzFdLCBmY1sidmFsaWRfcmFuZ2VfdiJdWzBdLAotICAgICAgICAgICAgICAgICAgICBmY1sidmFsaWRfcmFuZ2VfdiJdWzFdKQorICAgICAgICAgICAgcHJpbnQgIiVzIHdpdGggJXMgJWR4JWQ6ICUuM2YgeCAlLjNmOyIgJSAoCisgICAgICAgICAgICAgICAgICAgIGZjWyJmbXRfaXRlciJdLCBmY1siZm10X2NtcHIiXSwgZmNbInciXSwgZmNbImgiXSwKKyAgICAgICAgICAgICAgICAgICAgZmNbImN0X2hvcmkiXSwgZmNbImN0X3ZlcnQiXSksCisgICAgICAgICAgICBwcmludCAidmFsaWQgaG9yaXpvbnRhbCByYW5nZTogJS4zZiB+ICUuM2Y7IiAlICgKKyAgICAgICAgICAgICAgICAgICAgZmNbInZhbGlkX3JhbmdlX2giXVswXSwgZmNbInZhbGlkX3JhbmdlX2giXVsxXSksCisgICAgICAgICAgICBwcmludCAidmFsaWQgdmVydGljYWwgcmFuZ2U6ICUuM2YgfiAlLjNmIiAlICgKKyAgICAgICAgICAgICAgICAgICAgZmNbInZhbGlkX3JhbmdlX3YiXVswXSwgZmNbInZhbGlkX3JhbmdlX3YiXVsxXSkKIAotICAgICAgICBhc3NlcnQgKGZhaWxlZF9pbWFnZV9udW1iZXJfZm9yX2FzcGVjdF9yYXRpb190ZXN0ID09IDApCisgICAgICAgIGFzc2VydCBmYWlsZWRfaW1hZ2VfbnVtYmVyX2Zvcl9hc3BlY3RfcmF0aW9fdGVzdCA9PSAwCiAgICAgICAgIGlmIGxldmVsM19kZXZpY2U6Ci0gICAgICAgICAgICBhc3NlcnQgKGZhaWxlZF9pbWFnZV9udW1iZXJfZm9yX2Nyb3BfdGVzdCA9PSAwKQorICAgICAgICAgICAgYXNzZXJ0IGZhaWxlZF9pbWFnZV9udW1iZXJfZm9yX2Nyb3BfdGVzdCA9PSAwCiAKIAogZGVmIG1lYXN1cmVfYXNwZWN0X3JhdGlvKGltZywgcmF3X2F2bGIsIGltZ19uYW1lLCBkZWJ1Zyk6Ci0gICAgIiIiIE1lYXN1cmUgdGhlIGFzcGVjdCByYXRpbyBvZiB0aGUgYmxhY2sgY2lyY2xlIGluIHRoZSB0ZXN0IGltYWdlLgorICAgICIiIk1lYXN1cmUgdGhlIGFzcGVjdCByYXRpbyBvZiB0aGUgYmxhY2sgY2lyY2xlIGluIHRoZSB0ZXN0IGltYWdlLgogCiAgICAgQXJnczoKICAgICAgICAgaW1nOiBOdW1weSBmbG9hdCBpbWFnZSBhcnJheSBpbiBSR0IsIHdpdGggcGl4ZWwgdmFsdWVzIGluIFswLDFdLgpAQCAtMjYzLDIyICs0OTUsMjIgQEAKICAgICAgICAgKGNpcmNsZV93LCBjaXJjbGVfaCk6IHR1cGxlIG9mIHRoZSBjaXJjbGUgc2l6ZQogICAgICIiIgogICAgIHNpemUgPSBpbWcuc2hhcGUKLSAgICBpbWcgPSBpbWcgKiAyNTUKKyAgICBpbWcgKj0gMjU1CiAgICAgIyBHcmF5IGltYWdlCi0gICAgaW1nX2dyYXkgPSAwLjI5OSAqIGltZ1s6LDosMl0gKyAwLjU4NyAqIGltZ1s6LDosMV0gKyAwLjExNCAqIGltZ1s6LDosMF0KKyAgICBpbWdfZ3JheSA9IDAuMjk5KmltZ1s6LCA6LCAyXSArIDAuNTg3KmltZ1s6LCA6LCAxXSArIDAuMTE0KmltZ1s6LCA6LCAwXQogCiAgICAgIyBvdHN1IHRocmVzaG9sZCB0byBiaW5hcml6ZSB0aGUgaW1hZ2UKLSAgICByZXQzLCBpbWdfYncgPSBjdjIudGhyZXNob2xkKG5wLnVpbnQ4KGltZ19ncmF5KSwgMCwgMjU1LAotICAgICAgICAgICAgY3YyLlRIUkVTSF9CSU5BUlkgKyBjdjIuVEhSRVNIX09UU1UpCisgICAgXywgaW1nX2J3ID0gY3YyLnRocmVzaG9sZChucC51aW50OChpbWdfZ3JheSksIDAsIDI1NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN2Mi5USFJFU0hfQklOQVJZICsgY3YyLlRIUkVTSF9PVFNVKQogCiAgICAgIyBjb25uZWN0ZWQgY29tcG9uZW50CiAgICAgY3YyX3ZlcnNpb24gPSBjdjIuX192ZXJzaW9uX18KLSAgICBpZiBjdjJfdmVyc2lvbi5zdGFydHN3aXRoKCcyLjQuJyk6CisgICAgaWYgY3YyX3ZlcnNpb24uc3RhcnRzd2l0aCgiMi40LiIpOgogICAgICAgICBjb250b3VycywgaGllcmFyY2h5ID0gY3YyLmZpbmRDb250b3VycygyNTUtaW1nX2J3LCBjdjIuUkVUUl9UUkVFLAotICAgICAgICAgICAgICAgIGN2Mi5DSEFJTl9BUFBST1hfU0lNUExFKQotICAgIGVsaWYgY3YyX3ZlcnNpb24uc3RhcnRzd2l0aCgnMy4yLicpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdjIuQ0hBSU5fQVBQUk9YX1NJTVBMRSkKKyAgICBlbGlmIGN2Ml92ZXJzaW9uLnN0YXJ0c3dpdGgoIjMuMi4iKToKICAgICAgICAgXywgY29udG91cnMsIGhpZXJhcmNoeSA9IGN2Mi5maW5kQ29udG91cnMoMjU1LWltZ19idywgY3YyLlJFVFJfVFJFRSwKLSAgICAgICAgICAgICAgICBjdjIuQ0hBSU5fQVBQUk9YX1NJTVBMRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3YyLkNIQUlOX0FQUFJPWF9TSU1QTEUpCiAKICAgICAjIENoZWNrIGVhY2ggY29tcG9uZW50IGFuZCBmaW5kIHRoZSBibGFjayBjaXJjbGUKICAgICBtaW5fY21wdCA9IHNpemVbMF0gKiBzaXplWzFdICogMC4wMDUKQEAgLTI5MSw4ICs1MjMsOCBAQAogICAgICAgICAjIFBhcmVudGFsIGNvbXBvbmVudCBzaG91bGQgZXhpc3QgYW5kIHRoZSBhcmVhIGlzIGFjY2VwdGFibGUuCiAgICAgICAgICMgVGhlIGNvdXRvdXIgb2YgYSBjaXJjbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QgNSBwb2ludHMKICAgICAgICAgY2hpbGRfYXJlYSA9IGN2Mi5jb250b3VyQXJlYShjdCkKLSAgICAgICAgaWYgaHJjaFszXSA9PSAtMSBvciBjaGlsZF9hcmVhIDwgbWluX2NtcHQgb3IgY2hpbGRfYXJlYSA+IG1heF9jbXB0IG9yIFwKLSAgICAgICAgICAgICAgICBsZW4oY3QpIDwgMTU6CisgICAgICAgIGlmIChocmNoWzNdID09IC0xIG9yIGNoaWxkX2FyZWEgPCBtaW5fY21wdCBvciBjaGlsZF9hcmVhID4gbWF4X2NtcHQKKyAgICAgICAgICAgICAgICAgICAgb3IgbGVuKGN0KSA8IDE1KToKICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICMgQ2hlY2sgdGhlIHNoYXBlcyBvZiBjdXJyZW50IGNvbXBvbmVudCBhbmQgaXRzIHBhcmVudAogICAgICAgICBjaGlsZF9zaGFwZSA9IGNvbXBvbmVudF9zaGFwZShjdCkKQEAgLTMwOCwxNyArNTQwLDE3IEBACiAgICAgICAgICMgNS4gMC4yNSpQYXJlbnQicyBhcmVhIDwgQ2hpbGQicyBhcmVhIDwgMC40NSpQYXJlbnQicyBhcmVhCiAgICAgICAgICMgNi4gQ2hpbGQgaXMgYSBibGFjaywgYW5kIFBhcmVudCBpcyB3aGl0ZQogICAgICAgICAjIDcuIENlbnRlciBvZiBDaGlsZCBhbmQgY2VudGVyIG9mIHBhcmVudCBzaG91bGQgb3ZlcmxhcAotICAgICAgICBpZiBwcnRfc2hhcGVbIndpZHRoIl0gKiAwLjU2IDwgY2hpbGRfc2hhcGVbIndpZHRoIl0gXAotICAgICAgICAgICAgICAgIDwgcHJ0X3NoYXBlWyJ3aWR0aCJdICogMC43NiBcCi0gICAgICAgICAgICAgICAgYW5kIHBydF9zaGFwZVsiaGVpZ2h0Il0gKiAwLjU2IDwgY2hpbGRfc2hhcGVbImhlaWdodCJdIFwKLSAgICAgICAgICAgICAgICA8IHBydF9zaGFwZVsiaGVpZ2h0Il0gKiAwLjc2IFwKLSAgICAgICAgICAgICAgICBhbmQgY2hpbGRfc2hhcGVbIndpZHRoIl0gPiAwLjEgKiBzaXplWzFdIFwKLSAgICAgICAgICAgICAgICBhbmQgY2hpbGRfc2hhcGVbImhlaWdodCJdID4gMC4xICogc2l6ZVswXSBcCi0gICAgICAgICAgICAgICAgYW5kIDAuMzAgKiBwcnRfYXJlYSA8IGNoaWxkX2FyZWEgPCAwLjUwICogcHJ0X2FyZWEgXAotICAgICAgICAgICAgICAgIGFuZCBpbWdfYndbY2hpbGRfc2hhcGVbImN0eSJdXVtjaGlsZF9zaGFwZVsiY3R4Il1dID09IDAgXAotICAgICAgICAgICAgICAgIGFuZCBpbWdfYndbY2hpbGRfc2hhcGVbInRvcCJdXVtjaGlsZF9zaGFwZVsibGVmdCJdXSA9PSAyNTUgXAotICAgICAgICAgICAgICAgIGFuZCBkaXN0X3ggPCAwLjEgKiBjaGlsZF9zaGFwZVsid2lkdGgiXSBcCi0gICAgICAgICAgICAgICAgYW5kIGRpc3RfeSA8IDAuMSAqIGNoaWxkX3NoYXBlWyJoZWlnaHQiXToKKyAgICAgICAgaWYgKHBydF9zaGFwZVsid2lkdGgiXSAqIDAuNTYgPCBjaGlsZF9zaGFwZVsid2lkdGgiXQorICAgICAgICAgICAgICAgICAgICA8IHBydF9zaGFwZVsid2lkdGgiXSAqIDAuNzYKKyAgICAgICAgICAgICAgICAgICAgYW5kIHBydF9zaGFwZVsiaGVpZ2h0Il0gKiAwLjU2IDwgY2hpbGRfc2hhcGVbImhlaWdodCJdCisgICAgICAgICAgICAgICAgICAgIDwgcHJ0X3NoYXBlWyJoZWlnaHQiXSAqIDAuNzYKKyAgICAgICAgICAgICAgICAgICAgYW5kIGNoaWxkX3NoYXBlWyJ3aWR0aCJdID4gMC4xICogc2l6ZVsxXQorICAgICAgICAgICAgICAgICAgICBhbmQgY2hpbGRfc2hhcGVbImhlaWdodCJdID4gMC4xICogc2l6ZVswXQorICAgICAgICAgICAgICAgICAgICBhbmQgMC4zMCAqIHBydF9hcmVhIDwgY2hpbGRfYXJlYSA8IDAuNTAgKiBwcnRfYXJlYQorICAgICAgICAgICAgICAgICAgICBhbmQgaW1nX2J3W2NoaWxkX3NoYXBlWyJjdHkiXV1bY2hpbGRfc2hhcGVbImN0eCJdXSA9PSAwCisgICAgICAgICAgICAgICAgICAgIGFuZCBpbWdfYndbY2hpbGRfc2hhcGVbInRvcCJdXVtjaGlsZF9zaGFwZVsibGVmdCJdXSA9PSAyNTUKKyAgICAgICAgICAgICAgICAgICAgYW5kIGRpc3RfeCA8IDAuMSAqIGNoaWxkX3NoYXBlWyJ3aWR0aCJdCisgICAgICAgICAgICAgICAgICAgIGFuZCBkaXN0X3kgPCAwLjEgKiBjaGlsZF9zaGFwZVsiaGVpZ2h0Il0pOgogICAgICAgICAgICAgIyBJZiByYXcgY2FwdHVyZSBpcyBub3QgYXZhaWxhYmxlLCBjaGVjayB0aGUgY2FtZXJhIGlzIHBsYWNlZCByaWdodAogICAgICAgICAgICAgIyBpbiBmcm9udCBvZiB0aGUgdGVzdCBwYWdlOgogICAgICAgICAgICAgIyAxLiBEaXN0YW5jZXMgYmV0d2VlbiBwYXJlbnQgYW5kIGNoaWxkIGhvcml6b250YWxseSBvbiBib3RoIHNpZGUsMApAQCAtMzMwLDEzICs1NjIsMTEgQEAKICAgICAgICAgICAgICAgICBkaXN0X3JpZ2h0ID0gcHJ0X3NoYXBlWyJyaWdodCJdIC0gY2hpbGRfc2hhcGVbInJpZ2h0Il0KICAgICAgICAgICAgICAgICBkaXN0X3RvcCA9IGNoaWxkX3NoYXBlWyJ0b3AiXSAtIHBydF9zaGFwZVsidG9wIl0KICAgICAgICAgICAgICAgICBkaXN0X2JvdHRvbSA9IHBydF9zaGFwZVsiYm90dG9tIl0gLSBjaGlsZF9zaGFwZVsiYm90dG9tIl0KLSAgICAgICAgICAgICAgICBpZiBhYnMoZGlzdF9sZWZ0LWRpc3RfcmlnaHQpID4gMC4wNSAqIGNoaWxkX3NoYXBlWyJ3aWR0aCJdIG9yIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFicyhkaXN0X3RvcC1kaXN0X2JvdHRvbSkgPiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAwLjA1ICogY2hpbGRfc2hhcGVbImhlaWdodCJdOgorICAgICAgICAgICAgICAgIGlmIChhYnMoZGlzdF9sZWZ0LWRpc3RfcmlnaHQpID4gMC4wNSAqIGNoaWxkX3NoYXBlWyJ3aWR0aCJdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgYWJzKGRpc3RfdG9wLWRpc3RfYm90dG9tKSA+IDAuMDUgKiBjaGlsZF9zaGFwZVsiaGVpZ2h0Il0pOgogICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgIyBDYWxjdWxhdGUgYXNwZWN0IHJhdGlvCi0gICAgICAgICAgICBhc3BlY3RfcmF0aW8gPSBmbG9hdChjaGlsZF9zaGFwZVsid2lkdGgiXSkgLyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdChjaGlsZF9zaGFwZVsiaGVpZ2h0Il0pCisgICAgICAgICAgICBhc3BlY3RfcmF0aW8gPSBmbG9hdChjaGlsZF9zaGFwZVsid2lkdGgiXSkgLyBjaGlsZF9zaGFwZVsiaGVpZ2h0Il0KICAgICAgICAgICAgIGNpcmNsZV9jdHggPSBjaGlsZF9zaGFwZVsiY3R4Il0KICAgICAgICAgICAgIGNpcmNsZV9jdHkgPSBjaGlsZF9zaGFwZVsiY3R5Il0KICAgICAgICAgICAgIGNpcmNsZV93ID0gZmxvYXQoY2hpbGRfc2hhcGVbIndpZHRoIl0pCkBAIC0zNTAsMTUgKzU4MCwxNSBAQAogCiAgICAgaWYgbnVtX2NpcmNsZSA9PSAwOgogICAgICAgICBpdHMuaW1hZ2Uud3JpdGVfaW1hZ2UoaW1nLzI1NSwgaW1nX25hbWUsIFRydWUpCi0gICAgICAgIHByaW50ICJObyBibGFjayBjaXJjbGUgd2FzIGRldGVjdGVkLiBQbGVhc2UgdGFrZSBwaWN0dXJlcyBhY2NvcmRpbmcgIiBcCi0gICAgICAgICAgICAgICJ0byBpbnN0cnVjdGlvbiBjYXJlZnVsbHkhXG4iCi0gICAgICAgIGFzc2VydCAobnVtX2NpcmNsZSA9PSAxKQorICAgICAgICBwcmludCAiTm8gYmxhY2sgY2lyY2xlIHdhcyBkZXRlY3RlZC4gUGxlYXNlIHRha2UgcGljdHVyZXMgYWNjb3JkaW5nIiwKKyAgICAgICAgcHJpbnQgInRvIGluc3RydWN0aW9uIGNhcmVmdWxseSFcbiIKKyAgICAgICAgYXNzZXJ0IG51bV9jaXJjbGUgPT0gMQogCiAgICAgaWYgbnVtX2NpcmNsZSA+IDE6CiAgICAgICAgIGl0cy5pbWFnZS53cml0ZV9pbWFnZShpbWcvMjU1LCBpbWdfbmFtZSwgVHJ1ZSkKLSAgICAgICAgcHJpbnQgIk1vcmUgdGhhbiBvbmUgYmxhY2sgY2lyY2xlIHdhcyBkZXRlY3RlZC4gQmFja2dyb3VuZCBvZiBzY2VuZSAiIFwKLSAgICAgICAgICAgICAgIm1heSBiZSB0b28gY29tcGxleC5cbiIKLSAgICAgICAgYXNzZXJ0IChudW1fY2lyY2xlID09IDEpCisgICAgICAgIHByaW50ICJNb3JlIHRoYW4gb25lIGJsYWNrIGNpcmNsZSB3YXMgZGV0ZWN0ZWQuIEJhY2tncm91bmQgb2Ygc2NlbmUiLAorICAgICAgICBwcmludCAibWF5IGJlIHRvbyBjb21wbGV4LlxuIgorICAgICAgICBhc3NlcnQgbnVtX2NpcmNsZSA9PSAxCiAKICAgICAjIGRyYXcgY2lyY2xlIGNlbnRlciBhbmQgaW1hZ2UgY2VudGVyLCBhbmQgc2F2ZSB0aGUgaW1hZ2UKICAgICBsaW5lX3dpZHRoID0gbWF4KDEsIG1heChzaXplKS81MDApCkBAIC0zOTUsMTMgKzYyNSwxMyBAQAogICAgICAgICBpdHMuaW1hZ2Uud3JpdGVfaW1hZ2UoaW1nLzI1NSwgaW1nX25hbWUsIFRydWUpCiAKICAgICBwcmludCAiQXNwZWN0IHJhdGlvOiAlLjNmIiAlIGFzcGVjdF9yYXRpbwotICAgIHByaW50ICJDaXJjbGUgY2VudGVyIHBvc2l0aW9uIHJlZ2FyZGluZyB0byBpbWFnZSBjZW50ZXI6ICUuM2Z4JS4zZiIgJSBcCi0gICAgICAgICAgICAoY2NfY3RbInZlcnQiXSwgY2NfY3RbImhvcmkiXSkKKyAgICBwcmludCAiQ2lyY2xlIGNlbnRlciBwb3NpdGlvbiB3cnQgdG8gaW1hZ2UgY2VudGVyOiIsCisgICAgcHJpbnQgIiUuM2Z4JS4zZiIgJSAoY2NfY3RbInZlcnQiXSwgY2NfY3RbImhvcmkiXSkKICAgICByZXR1cm4gYXNwZWN0X3JhdGlvLCBjY19jdCwgKGNpcmNsZV93LCBjaXJjbGVfaCkKIAogCiBkZWYgY29tcG9uZW50X3NoYXBlKGNvbnRvdXIpOgotICAgICIiIiBNZWFzdXJlIHRoZSBzaGFwZSBmb3IgYSBjb25uZWN0ZWQgY29tcG9uZW50IGluIHRoZSBhc3BlY3QgcmF0aW8gdGVzdAorICAgICIiIk1lYXN1cmUgdGhlIHNoYXBlIGZvciBhIGNvbm5lY3RlZCBjb21wb25lbnQgaW4gdGhlIGFzcGVjdCByYXRpbyB0ZXN0LgogCiAgICAgQXJnczoKICAgICAgICAgY29udG91cjogcmV0dXJuIGZyb20gY3YyLmZpbmRDb250b3Vycy4gQSBsaXN0IG9mIHBpeGVsIGNvb3JkaW5hdGVzIG9mCmRpZmYgLS1naXQgYS9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zY2VuZTQvdGVzdF9tdWx0aV9jYW1lcmFfYWxpZ25tZW50LnB5IGIvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmU0L3Rlc3RfbXVsdGlfY2FtZXJhX2FsaWdubWVudC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzNjNGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2NlbmU0L3Rlc3RfbXVsdGlfY2FtZXJhX2FsaWdubWVudC5weQpAQCAtMCwwICsxLDQ1MCBAQAorIyBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbXBvcnQgbWF0aAoraW1wb3J0IG9zLnBhdGgKK2ltcG9ydCByZQoraW1wb3J0IHN5cworaW1wb3J0IGN2MgorCitpbXBvcnQgaXRzLmNhcHMKK2ltcG9ydCBpdHMuZGV2aWNlCitpbXBvcnQgaXRzLmltYWdlCitpbXBvcnQgaXRzLm9iamVjdHMKKworaW1wb3J0IG51bXB5IGFzIG5wCisKK0FMSUdOX1RPTF9NTSA9IDQuMEUtMyAgIyBtbQorQUxJR05fVE9MID0gMC4wMSAgIyBtdWx0aXBsaWVkIGJ5IHNlbnNvciBkaWFnb25hbCB0byBjb252ZXJ0IHRvIHBpeGVscworQ0hBUlRfRElTVEFOQ0VfQ00gPSAyMiAgIyBjbQorQ0lSQ0xFX1JUT0wgPSAwLjEKK0dZUk9fUkVGRVJFTkNFID0gMQorTkFNRSA9IG9zLnBhdGguYmFzZW5hbWUoX19maWxlX18pLnNwbGl0KCcuJylbMF0KK1RSQU5TX1JFRl9NQVRSSVggPSBucC5hcnJheShbMCwgMCwgMF0pCisKKworZGVmIGNvbnZlcnRfdG9fd29ybGRfY29vcmRpbmF0ZXMoeCwgeSwgciwgdCwgaywgel93KToKKyAgICAiIiJDb252ZXJ0IHgseSBjb29yZGluYXRlcyB0byB3b3JsZCBjb29yZGluYXRlcy4KKworICAgIENvbnZlcnNpb24gZXF1YXRpb24gaXM6CisgICAgQSA9IFtbeCpyWzJdWzBdIC0gZG90KGtfcm93MCwgcl9jb2wwKSwgeCpyX1syXVsxXSAtIGRvdChrX3JvdzAsIHJfY29sMSldLAorICAgICAgICAgW3kqclsyXVswXSAtIGRvdChrX3JvdzEsIHJfY29sMCksIHkqcl9bMl1bMV0gLSBkb3Qoa19yb3cxLCByX2NvbDEpXV0KKyAgICBiID0gW1t6X3cqZG90KGtfcm93MCwgcl9jb2wyKSArIGRvdChrX3JvdzAsIHQpIC0geCooclsyXVsyXSp6X3cgKyB0WzJdKV0sCisgICAgICAgICBbel93KmRvdChrX3JvdzEsIHJfY29sMikgKyBkb3Qoa19yb3cxLCB0KSAtIHkqKHJbMl1bMl0qel93ICsgdFsyXSldXQorCisgICAgW1t4X3ddLCBbeV93XV0gPSBpbnYoQSkgKiBiCisKKyAgICBBcmdzOgorICAgICAgICB4OiAgICAgIHggbG9jYXRpb24gaW4gcGl4ZWwgc3BhY2UKKyAgICAgICAgeTogICAgICB5IGxvY2F0aW9uIGluIHBpeGVsIHNwYWNlCisgICAgICAgIHI6ICAgICAgcm90YXRpb24gbWF0cml4CisgICAgICAgIHQ6ICAgICAgdHJhbnNsYXRpb24gbWF0cml4CisgICAgICAgIGs6ICAgICAgaW50cmluc2ljIG1hdHJpeAorICAgICAgICB6X3c6ICAgIHogZGlzdGFuY2UgaW4gd29ybGQgc3BhY2UKKworICAgIFJldHVybnM6CisgICAgICAgIHhfdzogICAgeCBpbiBtZXRlcnMgaW4gd29ybGQgc3BhY2UKKyAgICAgICAgeV93OiAgICB5IGluIG1ldGVycyBpbiB3b3JsZCBzcGFjZQorICAgICIiIgorICAgIGNfMSA9IHJbMiwgMl0gKiB6X3cgKyB0WzJdCisgICAga194MSA9IG5wLmRvdChrWzAsIDpdLCByWzosIDBdKQorICAgIGtfeDIgPSBucC5kb3Qoa1swLCA6XSwgcls6LCAxXSkKKyAgICBrX3gzID0gel93ICogbnAuZG90KGtbMCwgOl0sIHJbOiwgMl0pICsgbnAuZG90KGtbMCwgOl0sIHQpCisgICAga195MSA9IG5wLmRvdChrWzEsIDpdLCByWzosIDBdKQorICAgIGtfeTIgPSBucC5kb3Qoa1sxLCA6XSwgcls6LCAxXSkKKyAgICBrX3kzID0gel93ICogbnAuZG90KGtbMSwgOl0sIHJbOiwgMl0pICsgbnAuZG90KGtbMSwgOl0sIHQpCisKKyAgICBhID0gbnAuYXJyYXkoW1t4KnJbMl1bMF0ta194MSwgeCpyWzJdWzFdLWtfeDJdLAorICAgICAgICAgICAgICAgICAgW3kqclsyXVswXS1rX3kxLCB5KnJbMl1bMV0ta195Ml1dKQorICAgIGIgPSBucC5hcnJheShbW2tfeDMteCpjXzFdLCBba195My15KmNfMV1dKQorICAgIHJldHVybiBucC5kb3QobnAubGluYWxnLmludihhKSwgYikKKworCitkZWYgY29udmVydF90b19pbWFnZV9jb29yZGluYXRlcyhwX3csIHIsIHQsIGspOgorICAgIHBfYyA9IG5wLmRvdChyLCBwX3cpICsgdAorICAgIHBfaCA9IG5wLmRvdChrLCBwX2MpCisgICAgcmV0dXJuIHBfaFswXSAvIHBfaFsyXSwgcF9oWzFdIC8gcF9oWzJdCisKKworZGVmIHJvdGF0aW9uX21hdHJpeChyb3RhdGlvbik6CisgICAgIiIiQ29udmVydCB0aGUgcm90YXRpb24gcGFyYW1ldGVycyB0byAzLWF4aXMgZGF0YS4KKworICAgIEFyZ3M6CisgICAgICAgIHJvdGF0aW9uOiAgIGFuZHJvaWQubGVucy5Sb3RhdGlvbiB2ZWN0b3IKKyAgICBSZXR1cm5zOgorICAgICAgICAzeDMgbWF0cml4IHcvIHJvdGF0aW9uIHBhcmFtZXRlcnMKKyAgICAiIiIKKyAgICB4ID0gcm90YXRpb25bMF0KKyAgICB5ID0gcm90YXRpb25bMV0KKyAgICB6ID0gcm90YXRpb25bMl0KKyAgICB3ID0gcm90YXRpb25bM10KKyAgICByZXR1cm4gbnAuYXJyYXkoW1sxLTIqeSoqMi0yKnoqKjIsIDIqeCp5LTIqeip3LCAyKngqeisyKnkqd10sCisgICAgICAgICAgICAgICAgICAgICBbMip4KnkrMip6KncsIDEtMip4KioyLTIqeioqMiwgMip5KnotMip4KnddLAorICAgICAgICAgICAgICAgICAgICAgWzIqeCp6LTIqeSp3LCAyKnkqeisyKngqdywgMS0yKngqKjItMip5KioyXV0pCisKKworIyBUT0RPOiBtZXJnZSBmaW5kX2NpcmNsZSgpICYgdGVzdF9hc3BlY3RfcmF0aW9fYW5kX2Nyb3AubWVhc3VyZV9hc3BlY3RfcmF0aW8oKQorIyBmb3IgYSB1bmlmaWVkIGNpcmNsZSBzY3JpcHQgdGhhdCBpcyBhbmQgaW4gcHltb2R1bGVzL2ltYWdlLnB5CitkZWYgZmluZF9jaXJjbGUoZ3JheSwgbmFtZSk6CisgICAgIiIiRmluZCB0aGUgYmxhY2sgY2lyY2xlIGluIHRoZSBpbWFnZS4KKworICAgIEFyZ3M6CisgICAgICAgIGdyYXk6ICAgICAgICAgICBudW1weSBncmF5c2NhbGUgYXJyYXkgd2l0aCBwaXhlbCB2YWx1ZXMgaW4gWzAsMjU1XS4KKyAgICAgICAgbmFtZTogICAgICAgICAgIHN0cmluZyBvZiBmaWxlIG5hbWUuCisgICAgUmV0dXJuczoKKyAgICAgICAgY2lyY2xlOiAgICAgICAgIChjaXJjbGVfY2VudGVyX3gsIGNpcmNsZV9jZW50ZXJfeSwgcmFkaXVzKQorICAgICIiIgorICAgIHNpemUgPSBncmF5LnNoYXBlCisgICAgIyBvdHN1IHRocmVzaG9sZCB0byBiaW5hcml6ZSB0aGUgaW1hZ2UKKyAgICBfLCBpbWdfYncgPSBjdjIudGhyZXNob2xkKG5wLnVpbnQ4KGdyYXkpLCAwLCAyNTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdjIuVEhSRVNIX0JJTkFSWSArIGN2Mi5USFJFU0hfT1RTVSkKKworICAgICMgY29ubmVjdGVkIGNvbXBvbmVudAorICAgIGN2Ml92ZXJzaW9uID0gY3YyLl9fdmVyc2lvbl9fCisgICAgaWYgY3YyX3ZlcnNpb24uc3RhcnRzd2l0aCgnMi40LicpOgorICAgICAgICBjb250b3VycywgaGllcmFyY2h5ID0gY3YyLmZpbmRDb250b3VycygyNTUtaW1nX2J3LCBjdjIuUkVUUl9UUkVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdjIuQ0hBSU5fQVBQUk9YX1NJTVBMRSkKKyAgICBlbGlmIGN2Ml92ZXJzaW9uLnN0YXJ0c3dpdGgoJzMuMi4nKToKKyAgICAgICAgXywgY29udG91cnMsIGhpZXJhcmNoeSA9IGN2Mi5maW5kQ29udG91cnMoMjU1LWltZ19idywgY3YyLlJFVFJfVFJFRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3YyLkNIQUlOX0FQUFJPWF9TSU1QTEUpCisKKyAgICAjIENoZWNrIGVhY2ggY29tcG9uZW50IGFuZCBmaW5kIHRoZSBibGFjayBjaXJjbGUKKyAgICBtaW5fY21wdCA9IHNpemVbMF0gKiBzaXplWzFdICogMC4wMDUKKyAgICBtYXhfY21wdCA9IHNpemVbMF0gKiBzaXplWzFdICogMC4zNQorICAgIG51bV9jaXJjbGUgPSAwCisgICAgZm9yIGN0LCBocmNoIGluIHppcChjb250b3VycywgaGllcmFyY2h5WzBdKToKKyAgICAgICAgIyBUaGUgcmFkaXVzIG9mIHRoZSBjaXJjbGUgaXMgMS8zIG9mIHRoZSBsZW5ndGggb2YgdGhlIHNxdWFyZSwgbWVhbmluZworICAgICAgICAjIGFyb3VuZCAxLzMgb2YgdGhlIGFyZWEgb2YgdGhlIHNxdWFyZQorICAgICAgICAjIFBhcmVudGFsIGNvbXBvbmVudCBzaG91bGQgZXhpc3QgYW5kIHRoZSBhcmVhIGlzIGFjY2VwdGFibGUuCisgICAgICAgICMgVGhlIGNvbnRvdXIgb2YgYSBjaXJjbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QgNSBwb2ludHMKKyAgICAgICAgY2hpbGRfYXJlYSA9IGN2Mi5jb250b3VyQXJlYShjdCkKKyAgICAgICAgaWYgKGhyY2hbM10gPT0gLTEgb3IgY2hpbGRfYXJlYSA8IG1pbl9jbXB0IG9yIGNoaWxkX2FyZWEgPiBtYXhfY21wdAorICAgICAgICAgICAgICAgICAgICBvciBsZW4oY3QpIDwgMTUpOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgIyBDaGVjayB0aGUgc2hhcGVzIG9mIGN1cnJlbnQgY29tcG9uZW50IGFuZCBpdHMgcGFyZW50CisgICAgICAgIGNoaWxkX3NoYXBlID0gY29tcG9uZW50X3NoYXBlKGN0KQorICAgICAgICBwYXJlbnQgPSBocmNoWzNdCisgICAgICAgIHBydF9zaGFwZSA9IGNvbXBvbmVudF9zaGFwZShjb250b3Vyc1twYXJlbnRdKQorICAgICAgICBwcnRfYXJlYSA9IGN2Mi5jb250b3VyQXJlYShjb250b3Vyc1twYXJlbnRdKQorICAgICAgICBkaXN0X3ggPSBhYnMoY2hpbGRfc2hhcGVbJ2N0eCddLXBydF9zaGFwZVsnY3R4J10pCisgICAgICAgIGRpc3RfeSA9IGFicyhjaGlsZF9zaGFwZVsnY3R5J10tcHJ0X3NoYXBlWydjdHknXSkKKyAgICAgICAgIyAxLiAwLjU2KlBhcmVudCdzIHdpZHRoIDwgQ2hpbGQncyB3aWR0aCA8IDAuNzYqUGFyZW50J3Mgd2lkdGguCisgICAgICAgICMgMi4gMC41NipQYXJlbnQncyBoZWlnaHQgPCBDaGlsZCdzIGhlaWdodCA8IDAuNzYqUGFyZW50J3MgaGVpZ2h0LgorICAgICAgICAjIDMuIENoaWxkJ3Mgd2lkdGggPiAwLjEqSW1hZ2Ugd2lkdGgKKyAgICAgICAgIyA0LiBDaGlsZCdzIGhlaWdodCA+IDAuMSpJbWFnZSBoZWlnaHQKKyAgICAgICAgIyA1LiAwLjI1KlBhcmVudCdzIGFyZWEgPCBDaGlsZCdzIGFyZWEgPCAwLjQ1KlBhcmVudCdzIGFyZWEKKyAgICAgICAgIyA2LiBDaGlsZCBpcyBhIGJsYWNrLCBhbmQgUGFyZW50IGlzIHdoaXRlCisgICAgICAgICMgNy4gQ2VudGVyIG9mIENoaWxkIGFuZCBjZW50ZXIgb2YgcGFyZW50IHNob3VsZCBvdmVybGFwCisgICAgICAgIGlmIChwcnRfc2hhcGVbJ3dpZHRoJ10gKiAwLjU2IDwgY2hpbGRfc2hhcGVbJ3dpZHRoJ10KKyAgICAgICAgICAgICAgICAgICAgPCBwcnRfc2hhcGVbJ3dpZHRoJ10gKiAwLjc2CisgICAgICAgICAgICAgICAgICAgIGFuZCBwcnRfc2hhcGVbJ2hlaWdodCddICogMC41NiA8IGNoaWxkX3NoYXBlWydoZWlnaHQnXQorICAgICAgICAgICAgICAgICAgICA8IHBydF9zaGFwZVsnaGVpZ2h0J10gKiAwLjc2CisgICAgICAgICAgICAgICAgICAgIGFuZCBjaGlsZF9zaGFwZVsnd2lkdGgnXSA+IDAuMSAqIHNpemVbMV0KKyAgICAgICAgICAgICAgICAgICAgYW5kIGNoaWxkX3NoYXBlWydoZWlnaHQnXSA+IDAuMSAqIHNpemVbMF0KKyAgICAgICAgICAgICAgICAgICAgYW5kIDAuMzAgKiBwcnRfYXJlYSA8IGNoaWxkX2FyZWEgPCAwLjUwICogcHJ0X2FyZWEKKyAgICAgICAgICAgICAgICAgICAgYW5kIGltZ19id1tjaGlsZF9zaGFwZVsnY3R5J11dW2NoaWxkX3NoYXBlWydjdHgnXV0gPT0gMAorICAgICAgICAgICAgICAgICAgICBhbmQgaW1nX2J3W2NoaWxkX3NoYXBlWyd0b3AnXV1bY2hpbGRfc2hhcGVbJ2xlZnQnXV0gPT0gMjU1CisgICAgICAgICAgICAgICAgICAgIGFuZCBkaXN0X3ggPCAwLjEgKiBjaGlsZF9zaGFwZVsnd2lkdGgnXQorICAgICAgICAgICAgICAgICAgICBhbmQgZGlzdF95IDwgMC4xICogY2hpbGRfc2hhcGVbJ2hlaWdodCddKToKKyAgICAgICAgICAgICMgQ2FsY3VsYXRlIGNpcmNsZSBjZW50ZXIgYW5kIHNpemUKKyAgICAgICAgICAgIGNpcmNsZV9jdHggPSBmbG9hdChjaGlsZF9zaGFwZVsnY3R4J10pCisgICAgICAgICAgICBjaXJjbGVfY3R5ID0gZmxvYXQoY2hpbGRfc2hhcGVbJ2N0eSddKQorICAgICAgICAgICAgY2lyY2xlX3cgPSBmbG9hdChjaGlsZF9zaGFwZVsnd2lkdGgnXSkKKyAgICAgICAgICAgIGNpcmNsZV9oID0gZmxvYXQoY2hpbGRfc2hhcGVbJ2hlaWdodCddKQorICAgICAgICAgICAgbnVtX2NpcmNsZSArPSAxCisgICAgICAgICAgICAjIElmIG1vcmUgdGhhbiBvbmUgY2lyY2xlIGZvdW5kLCBicmVhaworICAgICAgICAgICAgaWYgbnVtX2NpcmNsZSA9PSAyOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgaXRzLmltYWdlLndyaXRlX2ltYWdlKGdyYXlbLi4uLCBucC5uZXdheGlzXS8yNTUuMCwgbmFtZSkKKworICAgIGlmIG51bV9jaXJjbGUgPT0gMDoKKyAgICAgICAgcHJpbnQgJ05vIGJsYWNrIGNpcmNsZSB3YXMgZGV0ZWN0ZWQuIFBsZWFzZSB0YWtlIHBpY3R1cmVzIGFjY29yZGluZycsCisgICAgICAgIHByaW50ICd0byBpbnN0cnVjdGlvbiBjYXJlZnVsbHkhXG4nCisgICAgICAgIGFzc2VydCBudW1fY2lyY2xlID09IDEKKworICAgIGlmIG51bV9jaXJjbGUgPiAxOgorICAgICAgICBwcmludCAnTW9yZSB0aGFuIG9uZSBibGFjayBjaXJjbGUgd2FzIGRldGVjdGVkLiBCYWNrZ3JvdW5kIG9mIHNjZW5lJywKKyAgICAgICAgcHJpbnQgJ21heSBiZSB0b28gY29tcGxleC5cbicKKyAgICAgICAgYXNzZXJ0IG51bV9jaXJjbGUgPT0gMQorICAgIHJldHVybiAoY2lyY2xlX2N0eCwgY2lyY2xlX2N0eSwgKGNpcmNsZV93K2NpcmNsZV9oKS80LjApCisKKworZGVmIGNvbXBvbmVudF9zaGFwZShjb250b3VyKToKKyAgICAiIiJNZWFzdXJlIHRoZSBzaGFwZSBvZiBhIGNvbm5lY3RlZCBjb21wb25lbnQuCisKKyAgICBBcmdzOgorICAgICAgICBjb250b3VyOiByZXR1cm4gZnJvbSBjdjIuZmluZENvbnRvdXJzLiBBIGxpc3Qgb2YgcGl4ZWwgY29vcmRpbmF0ZXMgb2YKKyAgICAgICAgdGhlIGNvbnRvdXIuCisKKyAgICBSZXR1cm5zOgorICAgICAgICBUaGUgbW9zdCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20gcGl4ZWwgbG9jYXRpb24sIGhlaWdodCwgd2lkdGgsIGFuZAorICAgICAgICB0aGUgY2VudGVyIHBpeGVsIGxvY2F0aW9uIG9mIHRoZSBjb250b3VyLgorICAgICIiIgorICAgIHNoYXBlID0geydsZWZ0JzogbnAuaW5mLCAncmlnaHQnOiAwLCAndG9wJzogbnAuaW5mLCAnYm90dG9tJzogMCwKKyAgICAgICAgICAgICAnd2lkdGgnOiAwLCAnaGVpZ2h0JzogMCwgJ2N0eCc6IDAsICdjdHknOiAwfQorICAgIGZvciBwdCBpbiBjb250b3VyOgorICAgICAgICBpZiBwdFswXVswXSA8IHNoYXBlWydsZWZ0J106CisgICAgICAgICAgICBzaGFwZVsnbGVmdCddID0gcHRbMF1bMF0KKyAgICAgICAgaWYgcHRbMF1bMF0gPiBzaGFwZVsncmlnaHQnXToKKyAgICAgICAgICAgIHNoYXBlWydyaWdodCddID0gcHRbMF1bMF0KKyAgICAgICAgaWYgcHRbMF1bMV0gPCBzaGFwZVsndG9wJ106CisgICAgICAgICAgICBzaGFwZVsndG9wJ10gPSBwdFswXVsxXQorICAgICAgICBpZiBwdFswXVsxXSA+IHNoYXBlWydib3R0b20nXToKKyAgICAgICAgICAgIHNoYXBlWydib3R0b20nXSA9IHB0WzBdWzFdCisgICAgc2hhcGVbJ3dpZHRoJ10gPSBzaGFwZVsncmlnaHQnXSAtIHNoYXBlWydsZWZ0J10gKyAxCisgICAgc2hhcGVbJ2hlaWdodCddID0gc2hhcGVbJ2JvdHRvbSddIC0gc2hhcGVbJ3RvcCddICsgMQorICAgIHNoYXBlWydjdHgnXSA9IChzaGFwZVsnbGVmdCddK3NoYXBlWydyaWdodCddKS8yCisgICAgc2hhcGVbJ2N0eSddID0gKHNoYXBlWyd0b3AnXStzaGFwZVsnYm90dG9tJ10pLzIKKyAgICByZXR1cm4gc2hhcGUKKworCitkZWYgZGVmaW5lX3JlZmVyZW5jZV9jYW1lcmEocG9zZV9yZWZlcmVuY2UsIGNhbV9yZWZlcmVuY2UpOgorICAgICIiIkRldGVybWluZSB0aGUgcmVmZXJlbmNlIGNhbWVyYS4KKworICAgIEFyZ3M6CisgICAgICAgIHBvc2VfcmVmZXJlbmNlOiAwIGZvciBjYW1lcmFzLCAxIGZvciBneXJvCisgICAgICAgIGNhbV9yZWZlcmVuY2U6ICBkaWN0IHdpdGgga2V5IG9mIHBoeXNpY2FsIGNhbWVyYSBhbmQgdmFsdWUgVHJ1ZS9GYWxzZQorICAgIFJldHVybnM6CisgICAgICAgIGlfcmVmOiAgICAgICAgICBwaHlzaWNhbCBpZCBvZiByZWZlcmVuY2UgY2FtZXJhCisgICAgICAgIGlfMm5kOiAgICAgICAgICBwaHlzaWNhbCBpZCBvZiBzZWNvbmRhcnkgY2FtZXJhCisgICAgIiIiCisKKyAgICBpZiBwb3NlX3JlZmVyZW5jZSA9PSBHWVJPX1JFRkVSRU5DRToKKyAgICAgICAgcHJpbnQgJ3Bvc2VfcmVmZXJlbmNlIGlzIEdZUk8nCisgICAgICAgIGlfcmVmID0gbGlzdChjYW1fcmVmZXJlbmNlLmtleXMoKSlbMF0gICMgcGljayBmaXJzdCBjYW1lcmEgYXMgcmVmCisgICAgICAgIGlfMm5kID0gbGlzdChjYW1fcmVmZXJlbmNlLmtleXMoKSlbMV0KKyAgICBlbHNlOgorICAgICAgICBwcmludCAncG9zZV9yZWZlcmVuY2UgaXMgQ0FNRVJBJworICAgICAgICBpX3JlZiA9IChrIGZvciAoaywgdikgaW4gY2FtX3JlZmVyZW5jZS5pdGVyaXRlbXMoKSBpZiB2KS5uZXh0KCkKKyAgICAgICAgaV8ybmQgPSAoayBmb3IgKGssIHYpIGluIGNhbV9yZWZlcmVuY2UuaXRlcml0ZW1zKCkgaWYgbm90IHYpLm5leHQoKQorICAgIHJldHVybiBpX3JlZiwgaV8ybmQKKworCitkZWYgbWFpbigpOgorICAgICIiIlRlc3QgdGhlIG11bHRpIGNhbWVyYSBzeXN0ZW0gcGFyYW1ldGVycyByZWxhdGVkIHRvIGNhbWVyYSBzcGFjaW5nLgorCisgICAgVXNpbmcgdGhlIG11bHRpLWNhbWVyYSBwaHlzaWNhbCBjYW1lcmFzLCB0YWtlIGEgcGljdHVyZSBvZiBzY2VuZTQKKyAgICAoYSBibGFjayBjaXJjbGUgYW5kIHN1cnJvdW5kaW5nIHNxdWFyZSBvbiBhIHdoaXRlIGJhY2tncm91bmQpIHdpdGgKKyAgICBvbmUgb2YgdGhlIHBoeXNpY2FsIGNhbWVyYXMuIFRoZW4gZmluZCB0aGUgY2lyY2xlIGNlbnRlci4gVXNpbmcgdGhlCisgICAgcGFyYW1ldGVyczoKKyAgICAgICAgYW5kcm9pZC5sZW5zLnBvc2VSZWZlcmVuY2UKKyAgICAgICAgYW5kcm9pZC5sZW5zLnBvc2VUcmFuc2xhdGlvbgorICAgICAgICBhbmRyb2lkLmxlbnMucG9zZVJvdGF0aW9uCisgICAgICAgIGFuZHJvaWQubGVucy5pbnN0cmluc2ljQ2FsaWJyYXRpb24KKyAgICAgICAgYW5kcm9pZC5sZW5zLmRpc3RvcnRpb24gKGlmIGF2YWlsYWJsZSkKKyAgICBwcm9qZWN0IHRoZSBjaXJjbGUgY2VudGVyIHRvIHRoZSB3b3JsZCBjb29yZGluYXRlcyBmb3IgZWFjaCBjYW1lcmEuCisgICAgQ29tcGFyZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gY2FtZXJhcycgY2lyY2xlIGNlbnRlcnMgaW4KKyAgICB3b3JsZCBjb29yZGluYXRlcy4KKworICAgIFJlcHJvamVjdCB0aGUgd29ybGQgY29vcmRpbmF0ZXMgYmFjayB0byBwaXhlbCBjb29yZGluYXRlcyBhbmQgY29tcGFyZQorICAgIGFnYWluc3Qgb3JpZ2luYWxzIGFzIGEgc2FuaXR5IGNoZWNrLgorCisgICAgQ29tcGFyZSB0aGUgY2lyY2xlIHNpemVzIGlmIHRoZSBmb2NhbCBsZW5ndGhzIG9mIHRoZSBjYW1lcmFzIGFyZQorICAgIGRpZmZlcmVudCB1c2luZworICAgICAgICBhbmRyb2lkLmxlbnMuYXZhaWxhYmxlRm9jYWxMZW5ndGhzLgorICAgICIiIgorICAgIGNoYXJ0X2Rpc3RhbmNlID0gQ0hBUlRfRElTVEFOQ0VfQ00KKyAgICBmb3IgcyBpbiBzeXMuYXJndlsxOl06CisgICAgICAgIGlmIHNbOjVdID09ICdkaXN0PScgYW5kIGxlbihzKSA+IDU6CisgICAgICAgICAgICBjaGFydF9kaXN0YW5jZSA9IGZsb2F0KHJlLnN1YignY20nLCAnJywgc1s1Ol0pKQorICAgICAgICAgICAgcHJpbnQgJ1VzaW5nIGNoYXJ0IGRpc3RhbmNlOiAlLjFmY20nICUgY2hhcnRfZGlzdGFuY2UKKyAgICBjaGFydF9kaXN0YW5jZSAqPSAxLjBFLTIKKworICAgIHdpdGggaXRzLmRldmljZS5JdHNTZXNzaW9uKCkgYXMgY2FtOgorICAgICAgICBwcm9wcyA9IGNhbS5nZXRfY2FtZXJhX3Byb3BlcnRpZXMoKQorICAgICAgICBpdHMuY2Fwcy5za2lwX3VubGVzcyhpdHMuY2Fwcy5jb21wdXRlX3RhcmdldF9leHBvc3VyZShwcm9wcykgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0cy5jYXBzLnBlcl9mcmFtZV9jb250cm9sKHByb3BzKSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRzLmNhcHMubG9naWNhbF9tdWx0aV9jYW1lcmEocHJvcHMpIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdHMuY2Fwcy5yYXcxNihwcm9wcykgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0cy5jYXBzLm1hbnVhbF9zZW5zb3IocHJvcHMpKQorICAgICAgICBkZWJ1ZyA9IGl0cy5jYXBzLmRlYnVnX21vZGUoKQorICAgICAgICBhdmFpbF9mbHMgPSBwcm9wc1snYW5kcm9pZC5sZW5zLmluZm8uYXZhaWxhYmxlRm9jYWxMZW5ndGhzJ10KKyAgICAgICAgcG9zZV9yZWZlcmVuY2UgPSBwcm9wc1snYW5kcm9pZC5sZW5zLnBvc2VSZWZlcmVuY2UnXQorCisgICAgICAgIG1heF9yYXdfc2l6ZSA9IGl0cy5vYmplY3RzLmdldF9hdmFpbGFibGVfb3V0cHV0X3NpemVzKCdyYXcnLCBwcm9wcylbMF0KKyAgICAgICAgdywgaCA9IGl0cy5vYmplY3RzLmdldF9hdmFpbGFibGVfb3V0cHV0X3NpemVzKAorICAgICAgICAgICAgICAgICd5dXYnLCBwcm9wcywgbWF0Y2hfYXJfc2l6ZT1tYXhfcmF3X3NpemUpWzBdCisKKyAgICAgICAgIyBEbyAzQSBhbmQgZ2V0IHRoZSB2YWx1ZXMKKyAgICAgICAgcywgZSwgXywgXywgZmQgPSBjYW0uZG9fM2EoZ2V0X3Jlc3VsdHM9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9ja19hZT1UcnVlLCBsb2NrX2F3Yj1UcnVlKQorICAgICAgICBlICo9IDIgICMgYnJpZ2h0ZW4gUkFXIGltYWdlcworICAgICAgICByZXEgPSBpdHMub2JqZWN0cy5tYW51YWxfY2FwdHVyZV9yZXF1ZXN0KHMsIGUsIGZkLCBUcnVlLCBwcm9wcykKKworICAgICAgICAjIGdldCBwaHlzaWNhbCBjYW1lcmEgcHJvcGVydGllcworICAgICAgICBpZHMgPSBpdHMuY2Fwcy5sb2dpY2FsX211bHRpX2NhbWVyYV9waHlzaWNhbF9pZHMocHJvcHMpCisgICAgICAgIHByb3BzX3BoeXNpY2FsID0ge30KKyAgICAgICAgZm9yIGkgaW4gaWRzOgorICAgICAgICAgICAgcHJvcHNfcGh5c2ljYWxbaV0gPSBjYW0uZ2V0X2NhbWVyYV9wcm9wZXJ0aWVzX2J5X2lkKGkpCisKKyAgICAgICAgIyBjYXB0dXJlIFJBV3Mgb2YgMXN0IDIgY2FtZXJhcworICAgICAgICBjYXBfcmF3ID0ge30KKyAgICAgICAgb3V0X3N1cmZhY2VzID0gW3snZm9ybWF0JzogJ3l1dicsICd3aWR0aCc6IHcsICdoZWlnaHQnOiBofSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsnZm9ybWF0JzogJ3JhdycsICdwaHlzaWNhbENhbWVyYSc6IGlkc1swXX0sCisgICAgICAgICAgICAgICAgICAgICAgICB7J2Zvcm1hdCc6ICdyYXcnLCAncGh5c2ljYWxDYW1lcmEnOiBpZHNbMV19XQorICAgICAgICBfLCBjYXBfcmF3W2lkc1swXV0sIGNhcF9yYXdbaWRzWzFdXSA9IGNhbS5kb19jYXB0dXJlKHJlcSwgb3V0X3N1cmZhY2VzKQorCisgICAgc2l6ZV9yYXcgPSB7fQorICAgIGsgPSB7fQorICAgIGNhbV9yZWZlcmVuY2UgPSB7fQorICAgIHIgPSB7fQorICAgIHQgPSB7fQorICAgIGNpcmNsZSA9IHt9CisgICAgZmwgPSB7fQorICAgIHNlbnNvcl9kaWFnID0ge30KKyAgICBmb3IgaSBpbiBpZHM6CisgICAgICAgIHByaW50ICdDYW1lcmEgJXMnICUgaQorICAgICAgICAjIHByb2Nlc3MgaW1hZ2UKKyAgICAgICAgaW1nX3JhdyA9IGl0cy5pbWFnZS5jb252ZXJ0X2NhcHR1cmVfdG9fcmdiX2ltYWdlKAorICAgICAgICAgICAgICAgIGNhcF9yYXdbaV0sIHByb3BzPXByb3BzKQorICAgICAgICBzaXplX3Jhd1tpXSA9IChjYXBfcmF3W2ldWyd3aWR0aCddLCBjYXBfcmF3W2ldWydoZWlnaHQnXSkKKworICAgICAgICAjIHNhdmUgaW1hZ2VzIGlmIGRlYnVnCisgICAgICAgIGlmIGRlYnVnOgorICAgICAgICAgICAgaXRzLmltYWdlLndyaXRlX2ltYWdlKGltZ19yYXcsICclc19yYXdfJXMuanBnJyAlIChOQU1FLCBpKSkKKworICAgICAgICAjIGNvbnZlcnQgdG8gWzAsIDI1NV0gaW1hZ2VzCisgICAgICAgIGltZ19yYXcgKj0gMjU1CisKKyAgICAgICAgIyBzY2FsZSB0byBtYXRjaCBjYWxpYnJhdGlvbiBkYXRhCisgICAgICAgIGltZyA9IGN2Mi5yZXNpemUoaW1nX3Jhdy5hc3R5cGUobnAudWludDgpLCBOb25lLCBmeD0yLCBmeT0yKQorCisgICAgICAgICMgbG9hZCBwYXJhbWV0ZXJzIGZvciBlYWNoIHBoeXNpY2FsIGNhbWVyYQorICAgICAgICBpY2FsID0gcHJvcHNfcGh5c2ljYWxbaV1bJ2FuZHJvaWQubGVucy5pbnRyaW5zaWNDYWxpYnJhdGlvbiddCisgICAgICAgIGFzc2VydCBsZW4oaWNhbCkgPT0gNSwgJ2FuZHJvaWQubGVucy5pbnN0cmlzaWNDYWxpYnJhdGlvbiBpbmNvcnJlY3QuJworICAgICAgICBrW2ldID0gbnAuYXJyYXkoW1tpY2FsWzBdLCBpY2FsWzRdLCBpY2FsWzJdXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbMCwgaWNhbFsxXSwgaWNhbFszXV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgWzAsIDAsIDFdXSkKKyAgICAgICAgcHJpbnQgJyBrOicsIGtbaV0KKworICAgICAgICByb3RhdGlvbiA9IG5wLmFycmF5KHByb3BzX3BoeXNpY2FsW2ldWydhbmRyb2lkLmxlbnMucG9zZVJvdGF0aW9uJ10pCisgICAgICAgIHByaW50ICcgcm90YXRpb246Jywgcm90YXRpb24KKyAgICAgICAgYXNzZXJ0IGxlbihyb3RhdGlvbikgPT0gNCwgJ3Bvc2VSb3RhdGlvbiBoYXMgd3JvbmcgIyBvZiBwYXJhbXMuJworICAgICAgICByW2ldID0gcm90YXRpb25fbWF0cml4KHJvdGF0aW9uKQorCisgICAgICAgIHRbaV0gPSBucC5hcnJheShwcm9wc19waHlzaWNhbFtpXVsnYW5kcm9pZC5sZW5zLnBvc2VUcmFuc2xhdGlvbiddKQorICAgICAgICBwcmludCAnIHRyYW5zbGF0aW9uOicsIHRbaV0KKyAgICAgICAgYXNzZXJ0IGxlbih0W2ldKSA9PSAzLCAncG9zZVRyYW5zbGF0aW9uIGhhcyB3cm9uZyAjIG9mIHBhcmFtcy4nCisgICAgICAgIGlmICh0W2ldID09IFRSQU5TX1JFRl9NQVRSSVgpLmFsbCgpOgorICAgICAgICAgICAgY2FtX3JlZmVyZW5jZVtpXSA9IFRydWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNhbV9yZWZlcmVuY2VbaV0gPSBGYWxzZQorCisgICAgICAgICMgQVBJIHNwZWMgZGVmaW5lcyBwb3NlVHJhbnNsYXRpb24gYXMgdGhlIHdvcmxkIGNvb3JkaW5hdGUgcF93X2NhbSBvZgorICAgICAgICAjIG9wdGljcyBjZW50ZXIuIFdoZW4gYXBwbHlpbmcgW1J8dF0gdG8gZ28gZnJvbSB3b3JsZCBjb29yZGluYXRlcyB0bworICAgICAgICAjIGNhbWVyYSBjb29yZGluYXRlcywgd2UgbmVlZCAtUipwX3dfY2FtIG9mIHRoZSBjb29yZGluYXRlIHJlcG9ydGVkIGluCisgICAgICAgICMgbWV0YWRhdGEuCisgICAgICAgICMgaWUuIGZvciBhIGNhbWVyYSB3aXRoIG9wdGljYWwgY2VudGVyIGF0IHdvcmxkIGNvb3JkaW5hdGUgKDUsIDQsIDMpCisgICAgICAgICMgYW5kIGlkZW50aXR5IHJvdGF0aW9uLCB0byBjb252ZXJ0IGEgd29ybGQgY29vcmRpbmF0ZSBpbnRvIHRoZQorICAgICAgICAjIGNhbWVyYSdzIGNvb3JkaW5hdGUsIHdlIG5lZWQgYSB0cmFuc2xhdGlvbiB2ZWN0b3Igb2YgWy01LCAtNCwgLTNdCisgICAgICAgICMgc28gdGhhdDogW0l8Wy01LCAtNCwgLTNdXlRdICogWzUsIDQsIDNdXlQgPSBbMCwwLDBdXlQKKyAgICAgICAgdFtpXSA9IC0xLjAgKiBucC5kb3QocltpXSwgdFtpXSkKKyAgICAgICAgaWYgZGVidWc6CisgICAgICAgICAgICBwcmludCAndDonLCB0W2ldCisgICAgICAgICAgICBwcmludCAncjonLCByW2ldCisKKyAgICAgICAgIyBEbyBvcGVyYXRpb24gb24gZGlzdG9ydGVkIGltYWdlCisgICAgICAgIHByaW50ICdEZXRlY3RpbmcgcHJlLWNvcnJlY3Rpb24gY2lyY2xlJworICAgICAgICBjaXJjbGVfZGlzdG9ydGVkID0gZmluZF9jaXJjbGUoY3YyLmN2dENvbG9yKGltZywgY3YyLkNPTE9SX0JHUjJHUkFZKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclc19ncmF5X3ByZWNvcnJfY2FtXyVzLmpwZycgJSAoTkFNRSwgaSkpCisgICAgICAgIHByaW50ICdjYW1lcmEgJXMgY2lyY2xlIHByZS1kaXN0b3J0aW9uIGNvcnJlY3Rpb246IHgsIHk6ICUuMmYsICUuMmYnICUgKAorICAgICAgICAgICAgICAgIGksIGNpcmNsZV9kaXN0b3J0ZWRbMF0sIGNpcmNsZV9kaXN0b3J0ZWRbMV0pCisKKyAgICAgICAgIyBBcHBseSBjb3JyZWN0aW9uIHRvIGltYWdlIChpZiBhdmFpbGFibGUpCisgICAgICAgIGlmIGl0cy5jYXBzLmRpc3RvcnRpb25fY29ycmVjdGlvbihwcm9wcyk6CisgICAgICAgICAgICBkaXN0b3J0ID0gbnAuYXJyYXkocHJvcHNfcGh5c2ljYWxbaV1bJ2FuZHJvaWQubGVucy5kaXN0b3J0aW9uJ10pCisgICAgICAgICAgICBhc3NlcnQgbGVuKGRpc3RvcnQpID09IDUsICdkaXN0b3J0aW9uIGhhcyB3cm9uZyAjIG9mIHBhcmFtcy4nCisgICAgICAgICAgICBjdjJfZGlzdG9ydCA9IG5wLmFycmF5KFtkaXN0b3J0WzBdLCBkaXN0b3J0WzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdG9ydFszXSwgZGlzdG9ydFs0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RvcnRbMl1dKQorICAgICAgICAgICAgcHJpbnQgJyBjdjIgZGlzdG9ydGlvbiBwYXJhbXM6JywgY3YyX2Rpc3RvcnQKKyAgICAgICAgICAgIGl0cy5pbWFnZS53cml0ZV9pbWFnZShpbWcvMjU1LjAsICclc19yYXdfJXMuanBnJyAlICgKKyAgICAgICAgICAgICAgICAgICAgTkFNRSwgaSkpCisgICAgICAgICAgICBpbWcgPSBjdjIudW5kaXN0b3J0KGltZywga1tpXSwgY3YyX2Rpc3RvcnQpCisgICAgICAgICAgICBpdHMuaW1hZ2Uud3JpdGVfaW1hZ2UoaW1nLzI1NS4wLCAnJXNfY29ycmVjdF8lcy5qcGcnICUgKAorICAgICAgICAgICAgICAgICAgICBOQU1FLCBpKSkKKworICAgICAgICAjIEZpbmQgdGhlIGNpcmNsZXMgaW4gZ3JheXNjYWxlIGltYWdlCisgICAgICAgIGNpcmNsZVtpXSA9IGZpbmRfY2lyY2xlKGN2Mi5jdnRDb2xvcihpbWcsIGN2Mi5DT0xPUl9CR1IyR1JBWSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclc19ncmF5XyVzLmpwZycgJSAoTkFNRSwgaSkpCisKKyAgICAgICAgIyBGaW5kIGZvY2FsIGxlbmd0aCAmIHNlbnNvciBzaXplCisgICAgICAgIGZsW2ldID0gcHJvcHNfcGh5c2ljYWxbaV1bJ2FuZHJvaWQubGVucy5pbmZvLmF2YWlsYWJsZUZvY2FsTGVuZ3RocyddWzBdCisgICAgICAgIHNlbnNvcl9kaWFnW2ldID0gbWF0aC5zcXJ0KHNpemVfcmF3W2ldWzBdICoqIDIgKyBzaXplX3Jhd1tpXVsxXSAqKiAyKQorCisgICAgaV9yZWYsIGlfMm5kID0gZGVmaW5lX3JlZmVyZW5jZV9jYW1lcmEocG9zZV9yZWZlcmVuY2UsIGNhbV9yZWZlcmVuY2UpCisgICAgcHJpbnQgJ3JlZmVyZW5jZSBjYW1lcmE6ICVzLCBzZWNvbmRhcnkgY2FtZXJhOiAlcycgJSAoaV9yZWYsIGlfMm5kKQorCisgICAgIyBDb252ZXJ0IGNpcmNsZSBjZW50ZXJzIHRvIHJlYWwgd29ybGQgY29vcmRpbmF0ZXMKKyAgICB4X3cgPSB7fQorICAgIHlfdyA9IHt9CisgICAgaWYgcHJvcHNbJ2FuZHJvaWQubGVucy5mYWNpbmcnXToKKyAgICAgICAgcHJpbnQgJ2xlbnMgZmFjaW5nIEJBQ0snCisgICAgICAgIGNoYXJ0X2Rpc3RhbmNlICo9IC0xICAjIEFQSSBzcGVjIGRlZmluZXMgK3ogaSBwb2ludGluZyBvdXQgZnJvbSBzY3JlZW4KKyAgICBmb3IgaSBpbiBbaV9yZWYsIGlfMm5kXToKKyAgICAgICAgeF93W2ldLCB5X3dbaV0gPSBjb252ZXJ0X3RvX3dvcmxkX2Nvb3JkaW5hdGVzKAorICAgICAgICAgICAgICAgIGNpcmNsZVtpXVswXSwgY2lyY2xlW2ldWzFdLCByW2ldLCB0W2ldLCBrW2ldLCBjaGFydF9kaXN0YW5jZSkKKworICAgICMgQmFjayBjb252ZXJ0IHRvIGltYWdlIGNvb3JkaW5hdGVzIGZvciBzYW5pdHkgY2hlY2sKKyAgICB4X3AgPSB7fQorICAgIHlfcCA9IHt9CisgICAgeF9wW2lfMm5kXSwgeV9wW2lfMm5kXSA9IGNvbnZlcnRfdG9faW1hZ2VfY29vcmRpbmF0ZXMoCisgICAgICAgICAgICBbeF93W2lfcmVmXSwgeV93W2lfcmVmXSwgY2hhcnRfZGlzdGFuY2VdLAorICAgICAgICAgICAgcltpXzJuZF0sIHRbaV8ybmRdLCBrW2lfMm5kXSkKKyAgICB4X3BbaV9yZWZdLCB5X3BbaV9yZWZdID0gY29udmVydF90b19pbWFnZV9jb29yZGluYXRlcygKKyAgICAgICAgICAgIFt4X3dbaV8ybmRdLCB5X3dbaV8ybmRdLCBjaGFydF9kaXN0YW5jZV0sCisgICAgICAgICAgICByW2lfcmVmXSwgdFtpX3JlZl0sIGtbaV9yZWZdKQorCisgICAgIyBTdW1tYXJpemUgcmVzdWx0cworICAgIGZvciBpIGluIFtpX3JlZiwgaV8ybmRdOgorICAgICAgICBwcmludCAnIENhbWVyYTogJXMnICUgaQorICAgICAgICBwcmludCAnIHgsIHkgKHBpeGVscyk6ICUuMWYsICUuMWYnICUgKGNpcmNsZVtpXVswXSwgY2lyY2xlW2ldWzFdKQorICAgICAgICBwcmludCAnIHhfdywgeV93IChtbSk6ICUuMmYsICUuMmYnICUgKHhfd1tpXSoxLjBFMywgeV93W2ldKjEuMEUzKQorICAgICAgICBwcmludCAnIHhfcCwgeV9wIChwaXhlbHMpOiAlLjFmLCAlLjFmJyAlICh4X3BbaV0sIHlfcFtpXSkKKworICAgICMgQ2hlY2sgY2VudGVyIGxvY2F0aW9ucworICAgIGVyciA9IG5wLmxpbmFsZy5ub3JtKG5wLmFycmF5KFt4X3dbaV9yZWZdLCB5X3dbaV9yZWZdXSkgLQorICAgICAgICAgICAgICAgICAgICAgICAgIG5wLmFycmF5KFt4X3dbaV8ybmRdLCB5X3dbaV8ybmRdXSkpCisgICAgcHJpbnQgJ1xuQ2VudGVyIGxvY2F0aW9uIGVyciAobW0pOiAlLjJmJyAlIChlcnIqMUUzKQorICAgIG1zZyA9ICdDZW50ZXIgbG9jYXRpb25zICVzIDwtPiAlcyB0b28gZGlmZmVyZW50IScgJSAoaV9yZWYsIGlfMm5kKQorICAgIG1zZyArPSAnIHZhbD0lLjJmbW0sIFRIUkVTSD0lLmZtbScgJSAoZXJyKjFFMywgQUxJR05fVE9MX01NKjFFMykKKyAgICBhc3NlcnQgZXJyIDwgQUxJR05fVE9MLCBtc2cKKworICAgICMgQ2hlY2sgcHJvamVjdGlvbnMgYmFjayBpbnRvIHBpeGVsIHNwYWNlCisgICAgZm9yIGkgaW4gW2lfcmVmLCBpXzJuZF06CisgICAgICAgIGVyciA9IG5wLmxpbmFsZy5ub3JtKG5wLmFycmF5KFtjaXJjbGVbaV1bMF0sIGNpcmNsZVtpXVsxXV0pIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnAuYXJyYXkoW3hfcFtpXSwgeV9wW2ldXSkpCisgICAgICAgIHByaW50ICdDYW1lcmEgJXMgcHJvamVjdGlvbiBlcnJvciAocGl4ZWxzKTogJS4xZicgJSAoaSwgZXJyKQorICAgICAgICB0b2wgPSBBTElHTl9UT0wgKiBzZW5zb3JfZGlhZ1tpXQorICAgICAgICBtc2cgPSAnQ2FtZXJhICVzIHByb2plY3QgbG9jYXRpb25zIHRvbyBkaWZmZXJlbnQhJyAlIGkKKyAgICAgICAgbXNnICs9ICcgZGlmZj0lLjJmLCBUT0w9JS4yZicgJSAoZXJyLCB0b2wpCisgICAgICAgIGFzc2VydCBlcnIgPCB0b2wsIG1zZworCisgICAgIyBDaGVjayBmb2NhbCBsZW5ndGggYW5kIGNpcmNsZSBzaXplIGlmIG1vcmUgdGhhbiAxIGZvY2FsIGxlbmd0aAorICAgIGlmIGxlbihhdmFpbF9mbHMpID4gMToKKyAgICAgICAgcHJpbnQgJ0NpcmNsZSByYWRpaSAocGl4ZWxzKTsgcmVmOiAlLjFmLCAybmQ6ICUuMWYnICUgKAorICAgICAgICAgICAgICAgIGNpcmNsZVtpX3JlZl1bMl0sIGNpcmNsZVtpXzJuZF1bMl0pCisgICAgICAgIHByaW50ICdGb2NhbCBsZW5ndGhzIChkaW9wdGVycyk7IHJlZjogJS4yZiwgMm5kOiAlLjJmJyAlICgKKyAgICAgICAgICAgICAgICBmbFtpX3JlZl0sIGZsW2lfMm5kXSkKKyAgICAgICAgcHJpbnQgJ1NlbnNvciBkaWFnb25hbHMgKHBpeGVscyk7IHJlZjogJS4yZiwgMm5kOiAlLjJmJyAlICgKKyAgICAgICAgICAgICAgICBzZW5zb3JfZGlhZ1tpX3JlZl0sIHNlbnNvcl9kaWFnW2lfMm5kXSkKKyAgICAgICAgbXNnID0gJ0NpcmNsZSBzaXplIHNjYWxlcyBpbXByb3Blcmx5ISBSVE9MPSUuMWYnICUgQ0lSQ0xFX1JUT0wKKyAgICAgICAgbXNnICs9ICdcbk1ldHJpYzogcmFkaXVzL2ZvY2FsX2xlbmd0aCpzZW5zb3JfZGlhZyBzaG91bGQgYmUgZXF1YWwuJworICAgICAgICBhc3NlcnQgbnAuaXNjbG9zZShjaXJjbGVbaV9yZWZdWzJdL2ZsW2lfcmVmXSpzZW5zb3JfZGlhZ1tpX3JlZl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNpcmNsZVtpXzJuZF1bMl0vZmxbaV8ybmRdKnNlbnNvcl9kaWFnW2lfMm5kXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcnRvbD1DSVJDTEVfUlRPTCksIG1zZworCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zZW5zb3JfZnVzaW9uL3Rlc3RfbXVsdGlfY2FtZXJhX2ZyYW1lX3N5bmMucHkgYi9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zZW5zb3JfZnVzaW9uL3Rlc3RfbXVsdGlfY2FtZXJhX2ZyYW1lX3N5bmMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNkZGJkZAotLS0gL2Rldi9udWxsCisrKyBiL2FwcHMvQ2FtZXJhSVRTL3Rlc3RzL3NlbnNvcl9mdXNpb24vdGVzdF9tdWx0aV9jYW1lcmFfZnJhbWVfc3luYy5weQpAQCAtMCwwICsxLDE4NiBAQAorIyBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbXBvcnQgaXRzLmNhcHMKK2Zyb20gaXRzLmN2MmltYWdlIGltcG9ydCBnZXRfYW5nbGUKK2ltcG9ydCBpdHMuZGV2aWNlCitpbXBvcnQgaXRzLmltYWdlCitpbXBvcnQgaXRzLm9iamVjdHMKK2ltcG9ydCBpdHMudGFyZ2V0CisKK2ltcG9ydCBjdjIKK2ltcG9ydCBtYXRwbG90bGliCitmcm9tIG1hdHBsb3RsaWIgaW1wb3J0IHB5bGFiCitpbXBvcnQgbnVtcHkKK2ltcG9ydCBvcworCitBTkdMRV9NQVNLID0gMTAgICMgZGVncmVlcworQU5HVUxBUl9ESUZGX1RIUkVTSE9MRCA9IDEwICAjIGRlZ3JlZXMKK0FOR1VMQVJfTU9WRU1FTlRfVEhSRVNIT0xEID0gMzUgICMgZGVncmVlcworTkFNRSA9IG9zLnBhdGguYmFzZW5hbWUoX19maWxlX18pLnNwbGl0KCIuIilbMF0KK05VTV9DQVBUVVJFUyA9IDEwMAorVyA9IDY0MAorSCA9IDQ4MAorQ0hBUlRfRElTVEFOQ0UgPSAyNSAgIyBjbQorQ01fVE9fTSA9IDEvMTAwLjAKKworCitkZWYgX2NoZWNrX2F2YWlsYWJsZV9jYXBhYmlsaXRpZXMocHJvcHMpOgorICAgICIiIlJldHVybnMgVHJ1ZSBpZiBhbGwgcmVxdWlyZWQgdGVzdCBjYXBhYmlsaXRpZXMgYXJlIHByZXNlbnQuIiIiCisgICAgcmV0dXJuIGFsbChbCisgICAgICAgICAgICBpdHMuY2Fwcy5jb21wdXRlX3RhcmdldF9leHBvc3VyZShwcm9wcyksCisgICAgICAgICAgICBpdHMuY2Fwcy5wZXJfZnJhbWVfY29udHJvbChwcm9wcyksCisgICAgICAgICAgICBpdHMuY2Fwcy5sb2dpY2FsX211bHRpX2NhbWVyYShwcm9wcyksCisgICAgICAgICAgICBpdHMuY2Fwcy5yYXcxNihwcm9wcyksCisgICAgICAgICAgICBpdHMuY2Fwcy5tYW51YWxfc2Vuc29yKHByb3BzKSwKKyAgICAgICAgICAgIGl0cy5jYXBzLnNlbnNvcl9mdXNpb24ocHJvcHMpXSkKKworCitkZWYgX2Fzc2VydF9jYW1lcmFfbW92ZW1lbnQoZnJhbWVfcGFpcnNfYW5nbGVzKToKKyAgICAiIiJBc3NlcnQgdGhlIGFuZ2xlcyBiZXR3ZWVuIGVhY2ggZnJhbWUgcGFpciBhcmUgc3VmZmljaWVudGx5IGRpZmZlcmVudC4KKworICAgIERpZmZlcmVudCBhbmdsZXMgaXMgYW4gaW5kaWNhdGlvbiBvZiBjYW1lcmEgbW92ZW1lbnQuCisgICAgIiIiCisgICAgYW5nbGVzID0gW2kgZm9yIGksIGogaW4gZnJhbWVfcGFpcnNfYW5nbGVzXQorICAgIG1heF9hbmdsZSA9IG51bXB5LmFtYXgoYW5nbGVzKQorICAgIG1pbl9hbmdsZSA9IG51bXB5LmFtaW4oYW5nbGVzKQorICAgIGVtc2cgPSAiTm90IGVub3VnaCBwaG9uZSBtb3ZlbWVudCFcbiIKKyAgICBlbXNnICs9ICJtaW4gYW5nbGU6ICUuMmYsIG1heCBhbmdsZTogJS4yZiBkZWcsIFRIUkVTSDogJWQgZGVnIiAlICgKKyAgICAgICAgICAgIG1pbl9hbmdsZSwgbWF4X2FuZ2xlLCBBTkdVTEFSX01PVkVNRU5UX1RIUkVTSE9MRCkKKyAgICBhc3NlcnQgbWF4X2FuZ2xlIC0gbWluX2FuZ2xlID4gQU5HVUxBUl9NT1ZFTUVOVF9USFJFU0hPTEQsIGVtc2cKKworCitkZWYgX2Fzc2VydF9hbmd1bGFyX2RpZmZlcmVuY2UoYW5nbGVfMSwgYW5nbGVfMik6CisgICAgIiIiQXNzZXJ0IGFuZ3VsYXIgZGlmZmVyZW5jZSBpcyB3aXRoaW4gdGhyZXNob2xkLiIiIgorICAgIGRpZmYgPSBhYnMoYW5nbGVfMiAtIGFuZ2xlXzEpCisKKyAgICAjIEFzc2VydCBkaWZmZXJlbmNlIGlzIGxlc3MgdGhhbiB0aHJlc2hvbGQKKyAgICBlbXNnID0gIkRpZmYgYmV0d2VlbiBmcmFtZSBwYWlyOiAlLjFmLiBUaHJlc2hvbGQ6ICVkIGRlZy4iICUgKAorICAgICAgICAgICAgZGlmZiwgQU5HVUxBUl9ESUZGX1RIUkVTSE9MRCkKKyAgICBhc3NlcnQgZGlmZiA8IEFOR1VMQVJfRElGRl9USFJFU0hPTEQsIGVtc2cKKworCitkZWYgX21hc2tfYW5nbGVzX25lYXJfZXh0cmVtZXMoZnJhbWVfcGFpcnNfYW5nbGVzKToKKyAgICAiIiJNYXNrIG91dCB0aGUgZGF0YSBuZWFyIHRoZSB0b3AgYW5kIGJvdHRvbSBvZiBhbmdsZSByYW5nZS4iIiIKKyAgICBtYXNrZWRfcGFpcnNfYW5nbGVzID0gW1tpLCBqXSBmb3IgaSwgaiBpbiBmcmFtZV9wYWlyc19hbmdsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIEFOR0xFX01BU0sgPD0gYWJzKGkpIDw9IDkwLUFOR0xFX01BU0sgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOR0xFX01BU0sgPD0gYWJzKGopIDw9IDkwLUFOR0xFX01BU0tdCisgICAgcmV0dXJuIG1hc2tlZF9wYWlyc19hbmdsZXMKKworCitkZWYgX3Bsb3RfZnJhbWVfcGFpcnNfYW5nbGVzKGZyYW1lX3BhaXJzX2FuZ2xlcywgaWRzKToKKyAgICAiIiJQbG90IHRoZSBleHRyYWN0ZWQgYW5nbGVzLiIiIgorICAgIG1hdHBsb3RsaWIucHlwbG90LmZpZ3VyZSgiQ2FtZXJhIFJvdGF0aW9uIEFuZ2xlIikKKyAgICBjYW0wX2FuZ2xlcyA9IFtpIGZvciBpLCBqIGluIGZyYW1lX3BhaXJzX2FuZ2xlc10KKyAgICBjYW0xX2FuZ2xlcyA9IFtqIGZvciBpLCBqIGluIGZyYW1lX3BhaXJzX2FuZ2xlc10KKyAgICBweWxhYi5wbG90KHJhbmdlKGxlbihjYW0wX2FuZ2xlcykpLCBjYW0wX2FuZ2xlcywgInIiLCBsYWJlbD0iJXMiICUgaWRzWzBdKQorICAgIHB5bGFiLnBsb3QocmFuZ2UobGVuKGNhbTFfYW5nbGVzKSksIGNhbTFfYW5nbGVzLCAiZyIsIGxhYmVsPSIlcyIgJSBpZHNbMV0pCisgICAgcHlsYWIubGVnZW5kKCkKKyAgICBweWxhYi54bGFiZWwoIkNhbWVyYSBmcmFtZSBudW1iZXIiKQorICAgIHB5bGFiLnlsYWJlbCgiUm90YXRpb24gYW5nbGUgKGRlZ3JlZXMpIikKKyAgICBtYXRwbG90bGliLnB5cGxvdC5zYXZlZmlnKCIlc19hbmdsZXNfcGxvdC5wbmciICUgKE5BTUUpKQorCisgICAgbWF0cGxvdGxpYi5weXBsb3QuZmlndXJlKCJBbmdsZSBEaWZmcyIpCisgICAgYW5nbGVfZGlmZnMgPSBbai1pIGZvciBpLCBqIGluIGZyYW1lX3BhaXJzX2FuZ2xlc10KKyAgICBweWxhYi5wbG90KHJhbmdlKGxlbihhbmdsZV9kaWZmcykpLCBhbmdsZV9kaWZmcywgImIiLAorICAgICAgICAgICAgICAgbGFiZWw9ImNhbSVzLSVzIiAlIChpZHNbMV0sIGlkc1swXSkpCisgICAgcHlsYWIubGVnZW5kKCkKKyAgICBweWxhYi54bGFiZWwoIkNhbWVyYSBmcmFtZSBudW1iZXIiKQorICAgIHB5bGFiLnlsYWJlbCgiUm90YXRpb24gYW5nbGUgZGlmZmVyZW5jZSAoZGVncmVlcykiKQorICAgIG1hdHBsb3RsaWIucHlwbG90LnNhdmVmaWcoIiVzX2FuZ2xlX2RpZmZzX3Bsb3QucG5nIiAlIChOQU1FKSkKKworZGVmIF9jb2xsZWN0X2RhdGEoKToKKyAgICAiIiJSZXR1cm5zIGxpc3Qgb2YgcGFpciBvZiBncmF5IGZyYW1lcyBhbmQgY2FtZXJhIGlkcyB1c2VkIGZvciBjYXB0dXJlcy4iIiIKKyAgICB5dXZfc2l6ZXMgPSB7fQorICAgIHdpdGggaXRzLmRldmljZS5JdHNTZXNzaW9uKCkgYXMgY2FtOgorICAgICAgICBwcm9wcyA9IGNhbS5nZXRfY2FtZXJhX3Byb3BlcnRpZXMoKQorCisgICAgICAgICMgSWYgY2FwYWJpbGl0aWVzIG5vdCBwcmVzZW50LCBza2lwLgorICAgICAgICBpdHMuY2Fwcy5za2lwX3VubGVzcyhfY2hlY2tfYXZhaWxhYmxlX2NhcGFiaWxpdGllcyhwcm9wcykpCisKKyAgICAgICAgIyBEZXRlcm1pbmUgcmV0dXJuIHBhcmFtZXRlcnMKKyAgICAgICAgZGVidWcgPSBpdHMuY2Fwcy5kZWJ1Z19tb2RlKCkKKyAgICAgICAgaWRzID0gaXRzLmNhcHMubG9naWNhbF9tdWx0aV9jYW1lcmFfcGh5c2ljYWxfaWRzKHByb3BzKQorCisgICAgICAgICMgRGVmaW5lIGNhcHR1cmUgcmVxdWVzdAorICAgICAgICBzLCBlLCBfLCBfLCBfID0gY2FtLmRvXzNhKGdldF9yZXN1bHRzPVRydWUsIGRvX2FmPUZhbHNlKQorICAgICAgICByZXEgPSBpdHMub2JqZWN0cy5tYW51YWxfY2FwdHVyZV9yZXF1ZXN0KHMsIGUpCisgICAgICAgIHJlcVsiYW5kcm9pZC5sZW5zLmZvY3VzRGlzdGFuY2UiXSA9IDEgLyAoQ0hBUlRfRElTVEFOQ0UgKiBDTV9UT19NKQorCisgICAgICAgICMgY2FwdHVyZSBZVVZzCisgICAgICAgIG91dF9zdXJmYWNlcyA9IFt7ImZvcm1hdCI6ICJ5dXYiLCAid2lkdGgiOiBXLCAiaGVpZ2h0IjogSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAicGh5c2ljYWxDYW1lcmEiOiBpZHNbMF19LAorICAgICAgICAgICAgICAgICAgICAgICAgeyJmb3JtYXQiOiAieXV2IiwgIndpZHRoIjogVywgImhlaWdodCI6IEgsCisgICAgICAgICAgICAgICAgICAgICAgICAgInBoeXNpY2FsQ2FtZXJhIjogaWRzWzFdfV0KKworICAgICAgICBjYXB0dXJlXzFfbGlzdCwgY2FwdHVyZV8yX2xpc3QgPSBjYW0uZG9fY2FwdHVyZSgKKyAgICAgICAgICAgIFtyZXFdKk5VTV9DQVBUVVJFUywgb3V0X3N1cmZhY2VzKQorCisgICAgICAgICMgQ3JlYXRlIGxpc3Qgb2YgY2FwdHVyZSBwYWlycy4gW1tjYXAxQSwgY2FwMUJdLCBbY2FwMkEsIGNhcDJCXSwgLi4uXQorICAgICAgICBmcmFtZV9wYWlycyA9IHppcChjYXB0dXJlXzFfbGlzdCwgY2FwdHVyZV8yX2xpc3QpCisKKyAgICAgICAgIyBDb252ZXJ0IGNhcHR1cmVzIHRvIGdyYXlzY2FsZQorICAgICAgICBmcmFtZV9wYWlyc19ncmF5ID0gWworICAgICAgICAgICAgWworICAgICAgICAgICAgICAgIGN2Mi5jdnRDb2xvcihpdHMuaW1hZ2UuY29udmVydF9jYXB0dXJlX3RvX3JnYl9pbWFnZShmLCBwcm9wcz1wcm9wcyksIGN2Mi5DT0xPUl9SR0IyR1JBWSkgZm9yIGYgaW4gcGFpcgorICAgICAgICAgICAgXSBmb3IgcGFpciBpbiBmcmFtZV9wYWlyc10KKworICAgICAgICAjIFNhdmUgaW1hZ2VzIGZvciBkZWJ1Z2dpbmcKKyAgICAgICAgaWYgZGVidWc6CisgICAgICAgICAgICBmb3IgaSwgaW1ncyBpbiBlbnVtZXJhdGUoZnJhbWVfcGFpcnNfZ3JheSk6CisgICAgICAgICAgICAgICAgZm9yIGogaW4gWzAsIDFdOgorICAgICAgICAgICAgICAgICAgICBmaWxlX25hbWUgPSAiJXNfJXNfJTAzZC5wbmciICUgKE5BTUUsIGlkc1tqXSwgaSkKKyAgICAgICAgICAgICAgICAgICAgY3YyLmltd3JpdGUoZmlsZV9uYW1lLCBpbWdzW2pdKjI1NSkKKworICAgICAgICByZXR1cm4gZnJhbWVfcGFpcnNfZ3JheSwgaWRzCisKK2RlZiBtYWluKCk6CisgICAgIiIiVGVzdCBmcmFtZSB0aW1lc3RhbXBzIGNhcHR1cmVkIGJ5IGxvZ2ljYWwgY2FtZXJhIGFyZSB3aXRoaW4gMTBtcy4iIiIKKyAgICBmcmFtZV9wYWlyc19ncmF5LCBpZHMgPSBfY29sbGVjdF9kYXRhKCkKKworICAgICMgQ29tcHV0ZSBhbmdsZXMgaW4gZnJhbWUgcGFpcnMKKyAgICBmcmFtZV9wYWlyc19hbmdsZXMgPSBbCisgICAgICAgICAgICBbZ2V0X2FuZ2xlKHBbMF0pLCBnZXRfYW5nbGUocFsxXSldIGZvciBwIGluIGZyYW1lX3BhaXJzX2dyYXldCisKKyAgICAjIFJlbW92ZSBmcmFtZXMgd2hlcmUgbm90IGVub3VnaCBzcXVhcmVzIHdlcmUgZGV0ZWN0ZWQuCisgICAgZmlsdGVyZWRfcGFpcnNfYW5nbGVzID0gW10KKyAgICBmb3IgYW5nbGVfMSwgYW5nbGVfMiBpbiBmcmFtZV9wYWlyc19hbmdsZXM6CisgICAgICAgIGlmIGFuZ2xlXzEgPT0gTm9uZSBvciBhbmdsZV8yID09IE5vbmU6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBmaWx0ZXJlZF9wYWlyc19hbmdsZXMuYXBwZW5kKFthbmdsZV8xLCBhbmdsZV8yXSkKKworICAgIHByaW50ICdVc2luZyB7fSBpbWFnZSBwYWlycyB0byBjb21wdXRlIGFuZ3VsYXIgZGlmZmVyZW5jZS4nLmZvcm1hdCgKKyAgICAgICAgbGVuKGZpbHRlcmVkX3BhaXJzX2FuZ2xlcykpCisKKyAgICBhc3NlcnQgbGVuKGZpbHRlcmVkX3BhaXJzX2FuZ2xlcykgPiAyMCwgKAorICAgICAgICAiVW5hYmxlIHRvIGlkZW50aWZ5IGVub3VnaCBmcmFtZXMgd2l0aCBkZXRlY3RlZCBzcXVhcmVzLiIpCisKKyAgICAjIE1hc2sgb3V0IGRhdGEgbmVhciA5MCBkZWdyZWVzLgorICAgICMgVGhlIGNoZXNzYm9hcmQgYW5nbGVzIHdlIGNvbXB1dGUgZ28gZnJvbSAwIHRvIDg5LiBNZWFuaW5nLAorICAgICMgOTAgZGVncmVlcyBlcXVhbHMgdG8gMCBkZWdyZWVzLgorICAgICMgSW4gb3JkZXIgdG8gYXZvaWQgdGhpcyBqdW1wLCB3ZSBpZ25vcmUgYW55IGZyYW1lcyBhdCB0aGVzZSBleHRyZW1ldGllcy4KKyAgICBtYXNrZWRfcGFpcnNfYW5nbGVzID0gX21hc2tfYW5nbGVzX25lYXJfZXh0cmVtZXMoZmlsdGVyZWRfcGFpcnNfYW5nbGVzKQorCisgICAgIyBQbG90IGFuZ2xlcyBhbmQgZGlmZmVyZW5jZXMKKyAgICBfcGxvdF9mcmFtZV9wYWlyc19hbmdsZXMoZmlsdGVyZWRfcGFpcnNfYW5nbGVzLCBpZHMpCisKKyAgICAjIEVuc3VyZSBjYW1lcmEgbW92ZWQKKyAgICBfYXNzZXJ0X2NhbWVyYV9tb3ZlbWVudChmaWx0ZXJlZF9wYWlyc19hbmdsZXMpCisKKyAgICAjIEVuc3VyZSBhbmdsZSBiZXR3ZWVuIGltYWdlcyBmcm9tIGVhY2ggY2FtZXJhIGRvZXMgbm90IGNoYW5nZSBhcHByZWNpYWJseQorICAgIGZvciBjYW1fMV9hbmdsZSwgY2FtXzJfYW5nbGUgaW4gbWFza2VkX3BhaXJzX2FuZ2xlczoKKyAgICAgICAgX2Fzc2VydF9hbmd1bGFyX2RpZmZlcmVuY2UoY2FtXzFfYW5nbGUsIGNhbV8yX2FuZ2xlKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvYXBwcy9DYW1lcmFJVFMvdGVzdHMvc2Vuc29yX2Z1c2lvbi90ZXN0X3NlbnNvcl9mdXNpb24ucHkgYi9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zZW5zb3JfZnVzaW9uL3Rlc3Rfc2Vuc29yX2Z1c2lvbi5weQppbmRleCAyZThmMzhlLi5mYmY3YmNkIDEwMDY0NAotLS0gYS9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zZW5zb3JfZnVzaW9uL3Rlc3Rfc2Vuc29yX2Z1c2lvbi5weQorKysgYi9hcHBzL0NhbWVyYUlUUy90ZXN0cy9zZW5zb3JfZnVzaW9uL3Rlc3Rfc2Vuc29yX2Z1c2lvbi5weQpAQCAtMTE2LDcgKzExNiw3IEBACiAgICAgICAgICAgICAjIFNwbGl0IGJ5IGNvbW1hIGFuZCBjb252ZXJ0IGVhY2ggZGltZW5zaW9uIHRvIGludC4KICAgICAgICAgICAgIFt3LCBoXSA9IG1hcChpbnQsIHNbOTpdLnNwbGl0KCIsIikpCiAgICAgICAgIGVsaWYgc1s6MTJdID09ICJ0ZXN0X2xlbmd0aD0iIGFuZCBsZW4ocykgPiAxMjoKLSAgICAgICAgICAgIHRlc3RfbGVuZ3RoID0gaW50KHNbMTI6XSkKKyAgICAgICAgICAgIHRlc3RfbGVuZ3RoID0gZmxvYXQoc1sxMjpdKQogCiAgICAgIyBDb2xsZWN0IG9yIGxvYWQgdGhlIGNhbWVyYStneXJvIGRhdGEuIEFsbCBneXJvIGV2ZW50cyBhcyB3ZWxsIGFzIGNhbWVyYQogICAgICMgdGltZXN0YW1wcyBhcmUgaW4gdGhlICJldmVudHMiIGRpY3Rpb25hcnksIGFuZCAiZnJhbWVzIiBpcyBhIGxpc3Qgb2YKQEAgLTM0NSw3ICszNDUsNyBAQAogICAgICAgICBpZiBudW1fZmVhdHVyZXMgPCBNSU5fRkVBVFVSRV9QVFM6CiAgICAgICAgICAgICBwcmludCAiTm90IGVub3VnaCBmZWF0dXJlIHBvaW50cyBpbiBmcmFtZSIsIGkKICAgICAgICAgICAgIHByaW50ICJOZWVkIGF0IGxlYXN0ICVkIGZlYXR1cmVzLCBnb3QgJWQiICUgKAotICAgICAgICAgICAgICAgICAgICBNSU5fRkVBVFVSRV9QVFMsIG51bV9mZWF0dXJlcykKKyAgICAgICAgICAgICAgICBNSU5fRkVBVFVSRV9QVFMsIG51bV9mZWF0dXJlcykKICAgICAgICAgICAgIGFzc2VydCAwCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBwcmludCAiTnVtYmVyIG9mIGZlYXR1cmVzIGluIGZyYW1lICVkIGlzICVkIiAlIChpLCBudW1fZmVhdHVyZXMpCkBAIC00NDgsMTMgKzQ0OCwxNyBAQAogICAgICAgICBmbXQgPSB7ImZvcm1hdCI6ICJ5dXYiLCAid2lkdGgiOiB3LCAiaGVpZ2h0IjogaH0KICAgICAgICAgcywgZSwgXywgXywgXyA9IGNhbS5kb18zYShnZXRfcmVzdWx0cz1UcnVlLCBkb19hZj1GYWxzZSkKICAgICAgICAgcmVxID0gaXRzLm9iamVjdHMubWFudWFsX2NhcHR1cmVfcmVxdWVzdChzLCBlKQotICAgICAgICBmcHMgPSAzMAorICAgICAgICBpdHMub2JqZWN0cy50dXJuX3Nsb3dfZmlsdGVyc19vZmYocHJvcHMsIHJlcSkKICAgICAgICAgcmVxWyJhbmRyb2lkLmxlbnMuZm9jdXNEaXN0YW5jZSJdID0gMSAvIChDSEFSVF9ESVNUQU5DRSAqIENNX1RPX00pCiAgICAgICAgIHJlcVsiYW5kcm9pZC5jb250cm9sLmFlVGFyZ2V0RnBzUmFuZ2UiXSA9IFtmcHMsIGZwc10KICAgICAgICAgcmVxWyJhbmRyb2lkLnNlbnNvci5mcmFtZUR1cmF0aW9uIl0gPSBpbnQoMTAwMC4wL2ZwcyAqIE1TRUNfVE9fTlNFQykKLSAgICAgICAgcHJpbnQgIkNhcHR1cmluZyAlZHglZCB3aXRoIHNlbnMuICVkLCBleHAuIHRpbWUgJS4xZm1zIiAlICgKLSAgICAgICAgICAgIHcsIGgsIHMsIGUqTlNFQ19UT19NU0VDKQotICAgICAgICBjYXBzID0gY2FtLmRvX2NhcHR1cmUoW3JlcV0qZnBzKnRlc3RfbGVuZ3RoLCBmbXQpCisgICAgICAgIHByaW50ICJDYXB0dXJpbmcgJWR4JWQgd2l0aCBzZW5zLiAlZCwgZXhwLiB0aW1lICUuMWZtcyBhdCAlZGZwcyIgJSAoCisgICAgICAgICAgICB3LCBoLCBzLCBlKk5TRUNfVE9fTVNFQywgZnBzKQorICAgICAgICBjYXBzID0gY2FtLmRvX2NhcHR1cmUoW3JlcV0qaW50KGZwcyp0ZXN0X2xlbmd0aCksIGZtdCkKKworICAgICAgICAjIENhcHR1cmUgYSBiaXQgbW9yZSBneXJvIHNhbXBsZXMgZm9yIHVzZSBpbgorICAgICAgICAjIGdldF9iZXN0X2FsaWdubWVudF9vZmZzZXQKKyAgICAgICAgdGltZS5zbGVlcCgwLjIpCiAKICAgICAgICAgIyBHZXQgdGhlIGd5cm8gZXZlbnRzLgogICAgICAgICBwcmludCAiUmVhZGluZyBvdXQgc2Vuc29yIGV2ZW50cyIKZGlmZiAtLWdpdCBhL2FwcHMvQ2FtZXJhSVRTL3Rvb2xzL2dldF9jYW1lcmFfaWRzLnB5IGIvYXBwcy9DYW1lcmFJVFMvdG9vbHMvZ2V0X2NhbWVyYV9pZHMucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMGIwNDYuLjAwMDAwMDAKLS0tIGEvYXBwcy9DYW1lcmFJVFMvdG9vbHMvZ2V0X2NhbWVyYV9pZHMucHkKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0jIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWltcG9ydCBzeXMKLWltcG9ydCBpdHMuZGV2aWNlCi1pbXBvcnQgaXRzLm9iamVjdHMKLWltcG9ydCBpdHMuaW1hZ2UKLQotZGVmIG1haW4oKToKLSAgICAiIiJnZXQgY2FtZXJhIGlkcyBhbmQgc2F2ZSBpdCB0byBkaXNrLgotICAgICIiIgotICAgIG91dF9wYXRoID0gIiIKLSAgICBmb3IgcyBpbiBzeXMuYXJndlsxOl06Ci0gICAgICAgIGlmIHNbOjRdID09ICJvdXQ9IiBhbmQgbGVuKHMpID4gNDoKLSAgICAgICAgICAgIG91dF9wYXRoID0gc1s0Ol0KLSAgICAjIGtpbmQgb2Ygd2VpcmQgd2UgbmVlZCB0byBvcGVuIGEgY2FtZXJhIHRvIGdldCBjYW1lcmEgaWRzLCBidXQKLSAgICAjIHRoaXMgaXMgaG93IElUUyBpcyB3b3JraW5nIG5vdy4KLSAgICB3aXRoIGl0cy5kZXZpY2UuSXRzU2Vzc2lvbigpIGFzIGNhbToKLSAgICAgICAgY2FtZXJhX2lkcyA9IGNhbS5nZXRfY2FtZXJhX2lkcygpCi0gICAgICAgIGlmIG91dF9wYXRoICE9ICIiOgotICAgICAgICAgICAgd2l0aCBvcGVuKG91dF9wYXRoLCAidyIpIGFzIGY6Ci0gICAgICAgICAgICAgICAgZm9yIGNhbWVyYV9pZCBpbiBjYW1lcmFfaWRzOgotICAgICAgICAgICAgICAgICAgICBmLndyaXRlKGNhbWVyYV9pZCArICJcbiIpCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gICAgbWFpbigpCmRpZmYgLS1naXQgYS9hcHBzL0NhbWVyYUlUUy90b29scy9sb2FkX3NjZW5lLnB5IGIvYXBwcy9DYW1lcmFJVFMvdG9vbHMvbG9hZF9zY2VuZS5weQppbmRleCA2MjU1MTM3Li4zMzBiMzJmIDEwMDY0NAotLS0gYS9hcHBzL0NhbWVyYUlUUy90b29scy9sb2FkX3NjZW5lLnB5CisrKyBiL2FwcHMvQ2FtZXJhSVRTL3Rvb2xzL2xvYWRfc2NlbmUucHkKQEAgLTE3LDggKzE3LDEwIEBACiBpbXBvcnQgc3VicHJvY2VzcwogaW1wb3J0IHN5cwogaW1wb3J0IHRpbWUKKwogaW1wb3J0IG51bXB5IGFzIG5wCiAKKwogZGVmIG1haW4oKToKICAgICAiIiJMb2FkIGNoYXJ0cyBvbiBkZXZpY2UgYW5kIGRpc3BsYXkuIiIiCiAgICAgc2NlbmUgPSBOb25lCkBAIC00Nyw3ICs0OSw3IEBACiAgICAgcmVtb3RlX3NjZW5lX2ZpbGUgPSAnL3NkY2FyZC9Eb3dubG9hZC8lcy5wZGYnICUgc2NlbmUKICAgICBsb2NhbF9zY2VuZV9maWxlID0gb3MucGF0aC5qb2luKG9zLmVudmlyb25bJ0NBTUVSQV9JVFNfVE9QJ10sICd0ZXN0cycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2VuZSkKLSAgICBpZiBucC5pc2Nsb3NlKGNoYXJ0X2Rpc3RhbmNlLCAyMiwgcnRvbD0wLjEpIGFuZCBjYW1lcmFfZm92IDwgOTA6CisgICAgaWYgbnAuaXNjbG9zZShjaGFydF9kaXN0YW5jZSwgMjAsIHJ0b2w9MC4xKSBhbmQgY2FtZXJhX2ZvdiA8IDkwOgogICAgICAgICBsb2NhbF9zY2VuZV9maWxlID0gb3MucGF0aC5qb2luKGxvY2FsX3NjZW5lX2ZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NlbmUrJ18wLjY3X3NjYWxlZC5wZGYnKQogICAgIGVsc2U6CmRpZmYgLS1naXQgYS9hcHBzL0NhbWVyYUlUUy90b29scy9ydW5fYWxsX3Rlc3RzLnB5IGIvYXBwcy9DYW1lcmFJVFMvdG9vbHMvcnVuX2FsbF90ZXN0cy5weQppbmRleCA1N2UzNDhhLi5hZDA3NjBiMSAxMDA2NDQKLS0tIGEvYXBwcy9DYW1lcmFJVFMvdG9vbHMvcnVuX2FsbF90ZXN0cy5weQorKysgYi9hcHBzL0NhbWVyYUlUUy90b29scy9ydW5fYWxsX3Rlc3RzLnB5CkBAIC0xNywzMCArMTcsNzcgQEAKIGltcG9ydCBvcwogaW1wb3J0IG9zLnBhdGgKIGltcG9ydCByZQotaW1wb3J0IHRlbXBmaWxlCiBpbXBvcnQgc3VicHJvY2VzcwotaW1wb3J0IHRpbWUKIGltcG9ydCBzeXMKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHRpbWUKIAogaW1wb3J0IGl0cy5jYXBzCitpbXBvcnQgaXRzLmN2MmltYWdlCiBpbXBvcnQgaXRzLmRldmljZQogZnJvbSBpdHMuZGV2aWNlIGltcG9ydCBJdHNTZXNzaW9uCitpbXBvcnQgaXRzLmltYWdlCisKK2ltcG9ydCBudW1weSBhcyBucAogCiBDSEFSVF9ERUxBWSA9IDEgICMgc2Vjb25kcwogQ0hBUlRfRElTVEFOQ0UgPSAzMC4wICAjIGNtCitDSEFSVF9IRUlHSFQgPSAxMy41ICAjIGNtCitDSEFSVF9TQ0FMRV9TVEFSVCA9IDAuNjUKK0NIQVJUX1NDQUxFX1NUT1AgPSAxLjM1CitDSEFSVF9TQ0FMRV9TVEVQID0gMC4wMjUKIEZBQ0lOR19FWFRFUk5BTCA9IDIKIE5VTV9UUllTID0gMgorU0NFTkUzX0ZJTEUgPSBvcy5wYXRoLmpvaW4ob3MuZW52aXJvblsiQ0FNRVJBX0lUU19UT1AiXSwgInB5bW9kdWxlcyIsICJpdHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3RfaW1hZ2VzIiwgIklTTzEyMjMzLnBuZyIpCiBTS0lQX1JFVF9DT0RFID0gMTAxICAjIG5vdGUgdGhpcyBtdXN0IGJlIHNhbWUgYXMgdGVzdHMvc2NlbmUqL3Rlc3RfKgorVkdBX0hFSUdIVCA9IDQ4MAorVkdBX1dJRFRIID0gNjQwCiAKLWRlZiBjYWxjX2NhbWVyYV9mb3YoKToKKyMgTm90IHlldCBtYW5kYXRlZCB0ZXN0cworTk9UX1lFVF9NQU5EQVRFRCA9IHsKKyAgICAgICAgInNjZW5lMCI6IFsKKyAgICAgICAgICAgICAgICAidGVzdF9qaXR0ZXIiLAorICAgICAgICAgICAgICAgICJ0ZXN0X2J1cnN0X2NhcHR1cmUiLAorICAgICAgICAgICAgICAgICJ0ZXN0X3Rlc3RfcGF0dGVybnMiCisgICAgICAgIF0sCisgICAgICAgICJzY2VuZTEiOiBbCisgICAgICAgICAgICAgICAgInRlc3RfYWVfYWYiLAorICAgICAgICAgICAgICAgICJ0ZXN0X2FlX3ByZWNhcHR1cmVfdHJpZ2dlciIsCisgICAgICAgICAgICAgICAgInRlc3RfY3JvcF9yZWdpb25fcmF3IiwKKyAgICAgICAgICAgICAgICAidGVzdF9ldl9jb21wZW5zYXRpb25fYWR2YW5jZWQiLAorICAgICAgICAgICAgICAgICJ0ZXN0X2V2X2NvbXBlbnNhdGlvbl9iYXNpYyIsCisgICAgICAgICAgICAgICAgInRlc3RfeXV2X3BsdXNfanBlZyIKKyAgICAgICAgXSwKKyAgICAgICAgInNjZW5lMiI6IFsKKyAgICAgICAgICAgICAgICAidGVzdF9udW1fZmFjZXMiCisgICAgICAgIF0sCisgICAgICAgICJzY2VuZTMiOiBbCisgICAgICAgICAgICAgICAgInRlc3RfZmxpcF9taXJyb3IiLAorICAgICAgICAgICAgICAgICJ0ZXN0X2xlbnNfbW92ZW1lbnRfcmVwb3J0aW5nIiwKKyAgICAgICAgICAgICAgICAidGVzdF9sZW5zX3Bvc2l0aW9uIgorICAgICAgICBdLAorICAgICAgICAic2NlbmU0IjogW10sCisgICAgICAgICJzY2VuZTUiOiBbXSwKKyAgICAgICAgInNlbnNvcl9mdXNpb24iOiBbXQorfQorCisKK2RlZiBjYWxjX2NhbWVyYV9mb3YoY2FtZXJhX2lkKToKICAgICAiIiJEZXRlcm1pbmUgdGhlIGNhbWVyYSBmaWVsZCBvZiB2aWV3IGZyb20gaW50ZXJuYWwgcGFyYW1zLiIiIgotICAgIHdpdGggSXRzU2Vzc2lvbigpIGFzIGNhbToKKyAgICB3aXRoIEl0c1Nlc3Npb24oY2FtZXJhX2lkKSBhcyBjYW06CiAgICAgICAgIHByb3BzID0gY2FtLmdldF9jYW1lcmFfcHJvcGVydGllcygpCisgICAgICAgIGZvY2FsX2xzID0gcHJvcHNbJ2FuZHJvaWQubGVucy5pbmZvLmF2YWlsYWJsZUZvY2FsTGVuZ3RocyddCisgICAgICAgIGlmIGxlbihmb2NhbF9scykgPiAxOgorICAgICAgICAgICAgcHJpbnQgJ0RvaW5nIGNhcHR1cmUgdG8gZGV0ZXJtaW5lIGxvZ2ljYWwgY2FtZXJhIGZvY2FsIGxlbmd0aCcKKyAgICAgICAgICAgIGNhcCA9IGNhbS5kb19jYXB0dXJlKGl0cy5vYmplY3RzLmF1dG9fY2FwdHVyZV9yZXF1ZXN0KCkpCisgICAgICAgICAgICBmb2NhbF9sID0gY2FwWydtZXRhZGF0YSddWydhbmRyb2lkLmxlbnMuZm9jYWxMZW5ndGgnXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZm9jYWxfbCA9IGZvY2FsX2xzWzBdCisgICAgc2Vuc29yX3NpemUgPSBwcm9wc1snYW5kcm9pZC5zZW5zb3IuaW5mby5waHlzaWNhbFNpemUnXQorICAgIGRpYWcgPSBtYXRoLnNxcnQoc2Vuc29yX3NpemVbJ2hlaWdodCddICoqIDIgKworICAgICAgICAgICAgICAgICAgICAgc2Vuc29yX3NpemVbJ3dpZHRoJ10gKiogMikKICAgICB0cnk6Ci0gICAgICAgIGZvY2FsX2wgPSBwcm9wc1snYW5kcm9pZC5sZW5zLmluZm8uYXZhaWxhYmxlRm9jYWxMZW5ndGhzJ11bMF0KLSAgICAgICAgc2Vuc29yX3NpemUgPSBwcm9wc1snYW5kcm9pZC5zZW5zb3IuaW5mby5waHlzaWNhbFNpemUnXQotICAgICAgICBkaWFnID0gbWF0aC5zcXJ0KHNlbnNvcl9zaXplWydoZWlnaHQnXSAqKiAyICsKLSAgICAgICAgICAgICAgICAgICAgICAgICBzZW5zb3Jfc2l6ZVsnd2lkdGgnXSAqKiAyKQogICAgICAgICBmb3YgPSBzdHIocm91bmQoMiAqIG1hdGguZGVncmVlcyhtYXRoLmF0YW4oZGlhZyAvICgyICogZm9jYWxfbCkpKSwgMikpCiAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgIGZvdiA9IHN0cigwKQpAQCAtNTQsMTYgKzEwMSwxNyBAQAogICAgIHdpdGggb3BlbihlcnJfZmlsZV9wYXRoLCAncicpIGFzIGZlcnI6CiAgICAgICAgIGZvciBsaW5lIGluIGZlcnI6CiAgICAgICAgICAgICBpZiAobGluZS5maW5kKCdzb2NrZXQuZXJyb3InKSAhPSAtMSBvcgorICAgICAgICAgICAgICAgIGxpbmUuZmluZCgnc29ja2V0LnRpbWVvdXQnKSAhPSAtMSBvcgogICAgICAgICAgICAgICAgIGxpbmUuZmluZCgnUHJvYmxlbSB3aXRoIHNvY2tldCcpICE9IC0xKToKICAgICAgICAgICAgICAgICBzb2NrZXRfZmFpbCA9IFRydWUKICAgICByZXR1cm4gc29ja2V0X2ZhaWwKIAogCi1kZWYgc2tpcF9zZW5zb3JfZnVzaW9uKCk6CitkZWYgc2tpcF9zZW5zb3JfZnVzaW9uKGNhbWVyYV9pZCk6CiAgICAgIiIiRGV0ZXJtaW5lIGlmIHNlbnNvciBmdXNpb24gdGVzdCBpcyBza2lwcGVkIGZvciB0aGlzIGNhbWVyYS4iIiIKIAogICAgIHNraXBfY29kZSA9IFNLSVBfUkVUX0NPREUKLSAgICB3aXRoIEl0c1Nlc3Npb24oKSBhcyBjYW06CisgICAgd2l0aCBJdHNTZXNzaW9uKGNhbWVyYV9pZCkgYXMgY2FtOgogICAgICAgICBwcm9wcyA9IGNhbS5nZXRfY2FtZXJhX3Byb3BlcnRpZXMoKQogICAgICAgICBpZiAoaXRzLmNhcHMuc2Vuc29yX2Z1c2lvbihwcm9wcykgYW5kIGl0cy5jYXBzLm1hbnVhbF9zZW5zb3IocHJvcHMpIGFuZAogICAgICAgICAgICAgICAgIHByb3BzWydhbmRyb2lkLmxlbnMuZmFjaW5nJ10gaXMgbm90IEZBQ0lOR19FWFRFUk5BTCk6CkBAIC0xMDAsMzMgKzE0OCw2IEBACiAgICAgICAgIGRpc3Q6ICAgIFtFeHBlcmltZW50YWxdIGNoYXJ0IGRpc3RhbmNlIGluIGNtLgogICAgICIiIgogCi0gICAgIyBOb3QgeWV0IG1hbmRhdGVkIHRlc3RzCi0gICAgTk9UX1lFVF9NQU5EQVRFRCA9IHsKLSAgICAgICAgInNjZW5lMCI6IFsKLSAgICAgICAgICAgICJ0ZXN0X2ppdHRlciIsCi0gICAgICAgICAgICAidGVzdF9idXJzdF9jYXB0dXJlIgotICAgICAgICAgICAgXSwKLSAgICAgICAgInNjZW5lMSI6IFsKLSAgICAgICAgICAgICJ0ZXN0X2FlX2FmIiwKLSAgICAgICAgICAgICJ0ZXN0X2FlX3ByZWNhcHR1cmVfdHJpZ2dlciIsCi0gICAgICAgICAgICAidGVzdF9jcm9wX3JlZ2lvbl9yYXciLAotICAgICAgICAgICAgInRlc3RfZXZfY29tcGVuc2F0aW9uX2FkdmFuY2VkIiwKLSAgICAgICAgICAgICJ0ZXN0X2V2X2NvbXBlbnNhdGlvbl9iYXNpYyIsCi0gICAgICAgICAgICAidGVzdF95dXZfcGx1c19qcGVnIgotICAgICAgICAgICAgXSwKLSAgICAgICAgInNjZW5lMiI6IFsKLSAgICAgICAgICAgICJ0ZXN0X251bV9mYWNlcyIsCi0gICAgICAgICAgICBdLAotICAgICAgICAic2NlbmUzIjogWwotICAgICAgICAgICAgInRlc3RfM2FfY29uc2lzdGVuY3kiLAotICAgICAgICAgICAgInRlc3RfbGVuc19tb3ZlbWVudF9yZXBvcnRpbmciLAotICAgICAgICAgICAgInRlc3RfbGVuc19wb3NpdGlvbiIKLSAgICAgICAgICAgIF0sCi0gICAgICAgICJzY2VuZTQiOiBbXSwKLSAgICAgICAgInNjZW5lNSI6IFtdLAotICAgICAgICAic2Vuc29yX2Z1c2lvbiI6IFtdCi0gICAgfQotCiAgICAgYWxsX3NjZW5lcyA9IFsic2NlbmUwIiwgInNjZW5lMSIsICJzY2VuZTIiLCAic2NlbmUzIiwgInNjZW5lNCIsICJzY2VuZTUiLAogICAgICAgICAgICAgICAgICAgInNlbnNvcl9mdXNpb24iXQogCkBAIC0xNzksNiArMjAwLDcgQEAKICAgICAgICAgZWxpZiBzWzo1XSA9PSAnZGlzdD0nIGFuZCBsZW4ocykgPiA1OgogICAgICAgICAgICAgY2hhcnRfZGlzdGFuY2UgPSBmbG9hdChyZS5zdWIoJ2NtJywgJycsIHNbNTpdKSkKIAorICAgIGNoYXJ0X2Rpc3RfYXJnID0gJ2Rpc3Q9ICcgKyBzdHIoY2hhcnRfZGlzdGFuY2UpCiAgICAgYXV0b19zY2VuZV9zd2l0Y2ggPSBjaGFydF9ob3N0X2lkIGlzIG5vdCBOb25lCiAgICAgbWVyZ2VfcmVzdWx0X3N3aXRjaCA9IHJlc3VsdF9kZXZpY2VfaWQgaXMgbm90IE5vbmUKIApAQCAtMjQxLDE2ICsyNjMsOCBAQAogCiAgICAgIyB1c2VyIGRvZXNuJ3Qgc3BlY2lmeSBjYW1lcmEgaWQsIHJ1biB0aHJvdWdoIGFsbCBjYW1lcmFzCiAgICAgaWYgbm90IGNhbWVyYV9pZHM6Ci0gICAgICAgIGNhbWVyYV9pZHNfcGF0aCA9IG9zLnBhdGguam9pbih0b3BkaXIsICJjYW1lcmFfaWRzLnR4dCIpCi0gICAgICAgIG91dF9hcmcgPSAib3V0PSIgKyBjYW1lcmFfaWRzX3BhdGgKLSAgICAgICAgY21kID0gWydweXRob24nLAotICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKG9zLmdldGN3ZCgpLCAidG9vbHMvZ2V0X2NhbWVyYV9pZHMucHkiKSwgb3V0X2FyZywKLSAgICAgICAgICAgICAgIGRldmljZV9pZF9hcmddCi0gICAgICAgIGNhbV9jb2RlID0gc3VicHJvY2Vzcy5jYWxsKGNtZCwgY3dkPXRvcGRpcikKLSAgICAgICAgYXNzZXJ0IGNhbV9jb2RlID09IDAKLSAgICAgICAgd2l0aCBvcGVuKGNhbWVyYV9pZHNfcGF0aCwgInIiKSBhcyBmOgotICAgICAgICAgICAgZm9yIGxpbmUgaW4gZjoKLSAgICAgICAgICAgICAgICBjYW1lcmFfaWRzLmFwcGVuZChsaW5lLnJlcGxhY2UoJ1xuJywgJycpKQorICAgICAgICB3aXRoIGl0cy5kZXZpY2UuSXRzU2Vzc2lvbigpIGFzIGNhbToKKyAgICAgICAgICAgIGNhbWVyYV9pZHMgPSBjYW0uZ2V0X2NhbWVyYV9pZHMoKQogCiAgICAgcHJpbnQgIlJ1bm5pbmcgSVRTIG9uIGNhbWVyYTogJXMsIHNjZW5lICVzIiAlIChjYW1lcmFfaWRzLCBzY2VuZXMpCiAKQEAgLTI2OCw3ICsyODIsNyBAQAogICAgICAgICAgICAgYXNzZXJ0IHdha2VfY29kZSA9PSAwCiAKICAgICBmb3IgY2FtZXJhX2lkIGluIGNhbWVyYV9pZHM6Ci0gICAgICAgIGNhbWVyYV9mb3YgPSBjYWxjX2NhbWVyYV9mb3YoKQorICAgICAgICBjYW1lcmFfZm92ID0gY2FsY19jYW1lcmFfZm92KGNhbWVyYV9pZCkKICAgICAgICAgIyBMb29wIGNhcHR1cmluZyBpbWFnZXMgdW50aWwgdXNlciBjb25maXJtIHRlc3Qgc2NlbmUgaXMgY29ycmVjdAogICAgICAgICBjYW1lcmFfaWRfYXJnID0gImNhbWVyYT0iICsgY2FtZXJhX2lkCiAgICAgICAgIHByaW50ICJQcmVwYXJpbmcgdG8gcnVuIElUUyBvbiBjYW1lcmEiLCBjYW1lcmFfaWQKQEAgLTI5NCw3ICszMDgsNyBAQAogICAgICAgICAgICAgICAgIG91dF9wYXRoID0gb3MucGF0aC5qb2luKHRvcGRpciwgY2FtZXJhX2lkLCBzY2VuZSsiLmpwZyIpCiAgICAgICAgICAgICAgICAgb3V0X2FyZyA9ICJvdXQ9IiArIG91dF9wYXRoCiAgICAgICAgICAgICAgICAgaWYgc2NlbmUgPT0gJ3NlbnNvcl9mdXNpb24nOgotICAgICAgICAgICAgICAgICAgICBza2lwX2NvZGUgPSBza2lwX3NlbnNvcl9mdXNpb24oKQorICAgICAgICAgICAgICAgICAgICBza2lwX2NvZGUgPSBza2lwX3NlbnNvcl9mdXNpb24oY2FtZXJhX2lkKQogICAgICAgICAgICAgICAgICAgICBpZiByb3RfcmlnX2lkIG9yIHNraXBfY29kZSA9PSBTS0lQX1JFVF9DT0RFOgogICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVfc3dpdGNoID0gRmFsc2UKICAgICAgICAgICAgICAgICBpZiBza2lwX3NjZW5lX3ZhbGlkYXRpb246CkBAIC0zMDQsNyArMzE4LDYgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKG5vdCBtZXJnZV9yZXN1bHRfc3dpdGNoIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1lcmdlX3Jlc3VsdF9zd2l0Y2ggYW5kIGNhbWVyYV9pZHNbMF0gPT0gJzAnKSk6CiAgICAgICAgICAgICAgICAgICAgICAgICBzY2VuZV9hcmcgPSAnc2NlbmU9JyArIHNjZW5lCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFydF9kaXN0X2FyZyA9ICdkaXN0PSAnICsgc3RyKGNoYXJ0X2Rpc3RhbmNlKQogICAgICAgICAgICAgICAgICAgICAgICAgZm92X2FyZyA9ICdmb3Y9JyArIGNhbWVyYV9mb3YKICAgICAgICAgICAgICAgICAgICAgICAgIGNtZCA9IFsncHl0aG9uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4ob3MuZ2V0Y3dkKCksICd0b29scy9sb2FkX3NjZW5lLnB5JyksCkBAIC0zMjUsNiArMzM4LDIwIEBACiAgICAgICAgICAgICAgICAgICAgIHZhbGlkX3NjZW5lX2NvZGUgPSBzdWJwcm9jZXNzLmNhbGwoY21kLCBjd2Q9dG9wZGlyKQogICAgICAgICAgICAgICAgICAgICBhc3NlcnQgdmFsaWRfc2NlbmVfY29kZSA9PSAwCiAgICAgICAgICAgICBwcmludCAiU3RhcnQgcnVubmluZyBJVFMgb24gY2FtZXJhICVzLCAlcyIgJSAoY2FtZXJhX2lkLCBzY2VuZSkKKyAgICAgICAgICAgICMgRXh0cmFjdCBjaGFydCBmcm9tIHNjZW5lIGZvciBzY2VuZTMgb25jZSB1cCBmcm9udAorICAgICAgICAgICAgY2hhcnRfbG9jX2FyZyA9ICcnCisgICAgICAgICAgICBjaGFydF9oZWlnaHQgPSBDSEFSVF9IRUlHSFQKKyAgICAgICAgICAgIGlmIHNjZW5lID09ICdzY2VuZTMnOgorICAgICAgICAgICAgICAgIGlmIGZsb2F0KGNhbWVyYV9mb3YpIDwgOTAgYW5kIG5wLmlzY2xvc2UoY2hhcnRfZGlzdGFuY2UsIDIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRvbD0wLjEpOgorICAgICAgICAgICAgICAgICAgICBjaGFydF9oZWlnaHQgKj0gMC42NworICAgICAgICAgICAgICAgIGNoYXJ0ID0gaXRzLmN2MmltYWdlLkNoYXJ0KFNDRU5FM19GSUxFLCBjaGFydF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnRfZGlzdGFuY2UsIENIQVJUX1NDQUxFX1NUQVJULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQVJUX1NDQUxFX1NUT1AsIENIQVJUX1NDQUxFX1NURVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhX2lkKQorICAgICAgICAgICAgICAgIGNoYXJ0X2xvY19hcmcgPSAnY2hhcnRfbG9jPSUuMmYsJS4yZiwlLjJmLCUuMmYsJS4zZicgJSAoCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFydC54bm9ybSwgY2hhcnQueW5vcm0sIGNoYXJ0Lndub3JtLCBjaGFydC5obm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJ0LnNjYWxlKQogICAgICAgICAgICAgIyBSdW4gZWFjaCB0ZXN0LCBjYXB0dXJpbmcgc3Rkb3V0IGFuZCBzdGRlcnIuCiAgICAgICAgICAgICBmb3IgKHRlc3RuYW1lLCB0ZXN0cGF0aCkgaW4gdGVzdHM6CiAgICAgICAgICAgICAgICAgaWYgYXV0b19zY2VuZV9zd2l0Y2g6CkBAIC0zNTYsNyArMzgzLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2NvZGUgPSBza2lwX2NvZGUKICAgICAgICAgICAgICAgICAgICAgaWYgc2tpcF9jb2RlIGlzIG5vdCBTS0lQX1JFVF9DT0RFOgogICAgICAgICAgICAgICAgICAgICAgICAgY21kID0gWydweXRob24nLCBvcy5wYXRoLmpvaW4ob3MuZ2V0Y3dkKCksIHRlc3RwYXRoKV0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNtZCArPSBzeXMuYXJndlsxOl0gKyBbY2FtZXJhX2lkX2FyZ10KKyAgICAgICAgICAgICAgICAgICAgICAgIGNtZCArPSBzeXMuYXJndlsxOl0gKyBbY2FtZXJhX2lkX2FyZ10gKyBbY2hhcnRfbG9jX2FyZ10KKyAgICAgICAgICAgICAgICAgICAgICAgIGNtZCArPSBbY2hhcnRfZGlzdF9hcmddCiAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIG9wZW4ob3V0cGF0aCwgJ3cnKSBhcyBmb3V0LCBvcGVuKGVycnBhdGgsICd3JykgYXMgZmVycjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2NvZGUgPSBzdWJwcm9jZXNzLmNhbGwoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZCwgc3RkZXJyPWZlcnIsIHN0ZG91dD1mb3V0LCBjd2Q9b3V0ZGlyKQpAQCAtMzkwLDYgKzQxOCw3IEBACiAKICAgICAgICAgICAgICAgICBtc2cgPSAiJXMgJXMvJXMgWyUuMWZzXSIgJSAocmV0c3RyLCBzY2VuZSwgdGVzdG5hbWUsIHQxLXQwKQogICAgICAgICAgICAgICAgIHByaW50IG1zZworICAgICAgICAgICAgICAgIGl0cy5kZXZpY2UuYWRiX2xvZyhkZXZpY2VfaWQsIG1zZykKICAgICAgICAgICAgICAgICBtc2dfc2hvcnQgPSAiJXMgJXMgWyUuMWZzXSIgJSAocmV0c3RyLCB0ZXN0bmFtZSwgdDEtdDApCiAgICAgICAgICAgICAgICAgaWYgdGVzdF9mYWlsZWQ6CiAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnkgKz0gbXNnX3Nob3J0ICsgIlxuIgpAQCAtNDIwLDcgKzQ0OSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIEl0c1Nlc3Npb24uUkVTVUxUX0ZBSUwpCiAgICAgICAgICAgICByZXN1bHRzW3NjZW5lXVtJdHNTZXNzaW9uLlNVTU1BUllfS0VZXSA9IHN1bW1hcnlfcGF0aAogCi0gICAgICAgIHByaW50ICJSZXBvcnRpbmcgSVRTIHJlc3VsdCB0byBDdHNWZXJpZmllciIKKyAgICAgICAgbXNnID0gIlJlcG9ydGluZyBJVFMgcmVzdWx0IHRvIEN0c1ZlcmlmaWVyIgorICAgICAgICBwcmludCBtc2cKKyAgICAgICAgaXRzLmRldmljZS5hZGJfbG9nKGRldmljZV9pZCwgbXNnKQogICAgICAgICBpZiBtZXJnZV9yZXN1bHRfc3dpdGNoOgogICAgICAgICAgICAgIyByZXN1bHRzIGFyZSBtb2RpZmllZCBieSByZXBvcnRfcmVzdWx0CiAgICAgICAgICAgICByZXN1bHRzX2JhY2t1cCA9IGNvcHkuZGVlcGNvcHkocmVzdWx0cykKZGlmZiAtLWdpdCBhL2FwcHMvQ2FtZXJhSVRTL3Rvb2xzL3J1bl9wYXJhbGxlbF90ZXN0cy5weSBiL2FwcHMvQ2FtZXJhSVRTL3Rvb2xzL3J1bl9wYXJhbGxlbF90ZXN0cy5weQppbmRleCA5MDJlYWJhLi5jZGJhMDFlIDEwMDY0NAotLS0gYS9hcHBzL0NhbWVyYUlUUy90b29scy9ydW5fcGFyYWxsZWxfdGVzdHMucHkKKysrIGIvYXBwcy9DYW1lcmFJVFMvdG9vbHMvcnVuX3BhcmFsbGVsX3Rlc3RzLnB5CkBAIC02Myw3ICs2Myw3IEBACiAgICAgaWYgc2NlbmVzIGlzIE5vbmU6CiAgICAgICAgIHNjZW5lcyA9IGF1dG9fc2NlbmVzCiAKLSAgICBwcmludCAiPj4+IFN0YXJ0IHRoZSBhdCAlcyIgJSB0aW1lLnN0cmZ0aW1lKCclWS8lbS8lZCAlSDolTTolUycpCisgICAgcHJpbnQgIj4+PiBTdGFydCB0aGUgdGVzdCBhdCAlcyIgJSB0aW1lLnN0cmZ0aW1lKCclWS8lbS8lZCAlSDolTTolUycpCiAgICAgZm9yIHNjZW5lIGluIHNjZW5lczoKICAgICAgICAgY21kcyA9IFtdCiAgICAgICAgIGNtZHMuYXBwZW5kKGJ1aWxkX2NtZChkZXZpY2UwX2lkLCBjaGFydF9ob3N0X2lkLCBkZXZpY2UxX2lkLCAwLCBzY2VuZSkpCmRpZmYgLS1naXQgYS9hcHBzL0NhbWVyYUlUUy90b29scy9ydW5fc2Vuc29yX2Z1c2lvbl9ib3gucHkgYi9hcHBzL0NhbWVyYUlUUy90b29scy9ydW5fc2Vuc29yX2Z1c2lvbl9ib3gucHkKaW5kZXggZWMxNmIzZC4uM2M5MTk5YSAxMDA2NDQKLS0tIGEvYXBwcy9DYW1lcmFJVFMvdG9vbHMvcnVuX3NlbnNvcl9mdXNpb25fYm94LnB5CisrKyBiL2FwcHMvQ2FtZXJhSVRTL3Rvb2xzL3J1bl9zZW5zb3JfZnVzaW9uX2JveC5weQpAQCAtODIsMTAgKzgyLDYgQEAKICAgICAgICAgZWxpZiBzWzo4XSA9PSAndG1wX2Rpcj0nIGFuZCBsZW4ocykgPiA4OgogICAgICAgICAgICAgdG1wX2RpciA9IHNbODpdCiAKLSAgICBpZiBjYW1lcmFfaWQgbm90IGluIFsnMCcsICcxJ106Ci0gICAgICAgIHByaW50ICdOZWVkIHRvIHNwZWNpZnkgY2FtZXJhIDAgb3IgMScKLSAgICAgICAgc3lzLmV4aXQoKQotCiAgICAgIyBNYWtlIG91dHB1dCBkaXJlY3RvcmllcyB0byBob2xkIHRoZSBnZW5lcmF0ZWQgZmlsZXMuCiAgICAgdG1wZGlyID0gdGVtcGZpbGUubWtkdGVtcChkaXI9dG1wX2RpcikKICAgICBwcmludCAnU2F2aW5nIG91dHB1dCBmaWxlcyB0bzonLCB0bXBkaXIsICdcbicKQEAgLTk0LDYgKzkwLDEyIEBACiAgICAgZGV2aWNlX2lkX2FyZyA9ICdkZXZpY2U9JyArIGRldmljZV9pZAogICAgIHByaW50ICdUZXN0aW5nIGRldmljZSAnICsgZGV2aWNlX2lkCiAKKyAgICAjIGVuc3VyZSBjYW1lcmFfaWQgaXMgdmFsaWQKKyAgICBhdmFpbF9jYW1lcmFfaWRzID0gZmluZF9hdmFpbF9jYW1lcmFfaWRzKGRldmljZV9pZF9hcmcsIHRtcGRpcikKKyAgICBpZiBjYW1lcmFfaWQgbm90IGluIGF2YWlsX2NhbWVyYV9pZHM6CisgICAgICAgIHByaW50ICdOZWVkIHRvIHNwZWNpZnkgdmFsaWQgY2FtZXJhX2lkIGluICcsIGF2YWlsX2NhbWVyYV9pZHMKKyAgICAgICAgc3lzLmV4aXQoKQorCiAgICAgY2FtZXJhX2lkX2FyZyA9ICdjYW1lcmE9JyArIGNhbWVyYV9pZAogICAgIGlmIHJvdGF0b3JfaWRzOgogICAgICAgICByb3RhdG9yX2lkX2FyZyA9ICdyb3RhdG9yPScgKyByb3RhdG9yX2lkcwpAQCAtMTA0LDYgKzEwNiw3IEBACiAKICAgICBmcHNfYXJnID0gJ2Zwcz0nICsgZnBzCiAgICAgdGVzdF9sZW5ndGhfYXJnID0gJ3Rlc3RfbGVuZ3RoPScgKyB0ZXN0X2xlbmd0aAorICAgIHByaW50ICdDYXB0dXJpbmcgYXQgJXNmcHMnICUgZnBzCiAKICAgICBvcy5ta2Rpcihvcy5wYXRoLmpvaW4odG1wZGlyLCBjYW1lcmFfaWQpKQogCkBAIC0yMTcsNiArMjIwLDE5IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIGxpbmUKICAgICByZXR1cm4gTm9uZQogCitkZWYgZmluZF9hdmFpbF9jYW1lcmFfaWRzKGRldmljZV9pZF9hcmcsIHRtcGRpcik6CisgICAgIiIiRmluZCB0aGUgYXZhaWxhYmxlIGNhbWVyYSBJRHMuCisKKyAgICBBcmdzOgorICAgICAgICBkZXZpY2VzX2lkX2FyZyhzdHIpOiAgICBkZXZpY2U9IyMjCisgICAgICAgIHRtcGRpcihzdHIpOiAgICAgICAgICAgIGdlbmVyYXRlZCB0bXAgZGlyIGZvciBydW4KKyAgICBSZXR1cm5zOgorICAgICAgICBsaXN0IG9mIGF2YWlsYWJsZSBjYW1lcmFzCisgICAgIiIiCisgICAgd2l0aCBpdHMuZGV2aWNlLkl0c1Nlc3Npb24oKSBhcyBjYW06CisgICAgICAgIGF2YWlsX2NhbWVyYV9pZHMgPSBjYW0uZ2V0X2NhbWVyYV9pZHMoKQorICAgIHJldHVybiBhdmFpbF9jYW1lcmFfaWRzCisKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICBtYWluKCkKZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXIvQW5kcm9pZC5tayBiL2FwcHMvQ3RzVmVyaWZpZXIvQW5kcm9pZC5tawppbmRleCBmZjQ1ZmI1Li4zMjA4ZWU1IDEwMDY0NAotLS0gYS9hcHBzL0N0c1ZlcmlmaWVyL0FuZHJvaWQubWsKKysrIGIvYXBwcy9DdHNWZXJpZmllci9BbmRyb2lkLm1rCkBAIC0yNSwzMyArMjUsNDUgQEAKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKSAkKGNhbGwgYWxsLUlhaWRsLWZpbGVzLXVuZGVyLCBzcmMpCiAKK0xPQ0FMX0FJRExfSU5DTFVERVMgOj0gXAorICAgIGZyYW1ld29ya3MvbmF0aXZlL2FpZGwvZ3VpCisKK0xPQ0FMX1VTRV9BQVBUMiA6PSB0cnVlCisKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLWV4LWNhbWVyYTIgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhdGliaWxpdHktY29tbW9uLXV0aWwtZGV2aWNlc2lkZWxpYiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RzLXNlbnNvcnMtdGVzdHMgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0cy1sb2NhdGlvbi10ZXN0cyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RzdGVzdHJ1bm5lciBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RzdGVzdHJ1bm5lci1heHQgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZS1jb21tb25zLW1hdGggXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRwbG90IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHN2ZXJpZmllci1vcGVuY3YgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmUtdGVzdHMtc3VwcG9ydCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC1zdXBwb3J0LXY0ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZHgubGVnYWN5X2xlZ2FjeS1zdXBwb3J0LXY0ICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9ja2l0by10YXJnZXQtbWludXMtanVuaXQ0IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2Nrd2Vic2VydmVyIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybS10ZXN0LWFubm90YXRpb25zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtLXRlc3QtYW5ub3RhdGlvbnMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0cy1zZWN1cml0eS10ZXN0LXN1cHBvcnQtbGlicmFyeQogCi1MT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBsZWdhY3ktYW5kcm9pZC10ZXN0CitMT0NBTF9TVEFUSUNfQU5EUk9JRF9MSUJSQVJJRVMgOj0gXAorICAgIGFuZHJvaWR4LmxlZ2FjeV9sZWdhY3ktc3VwcG9ydC12NAorCitMT0NBTF9KQVZBX0xJQlJBUklFUyArPSB0ZWxlcGhvbnktY29tbW9uCitMT0NBTF9KQVZBX0xJQlJBUklFUyArPSBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzCitMT0NBTF9KQVZBX0xJQlJBUklFUyArPSBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicworTE9DQUxfSkFWQV9MSUJSQVJJRVMgKz0gYW5kcm9pZC50ZXN0Lm1vY2suc3R1YnMKK0xPQ0FMX0pBVkFfTElCUkFSSUVTICs9IGJvdW5jeWNhc3RsZQorTE9DQUxfSkFWQV9MSUJSQVJJRVMgKz0gdm9pcC1jb21tb24KIAogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c1ZlcmlmaWVyCitMT0NBTF9QUklWQVRFX1BMQVRGT1JNX0FQSVMgOj0gdHJ1ZQogCiBMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdHN2ZXJpZmllcl9qbmkgXAogCQlsaWJhdWRpb2xvb3BiYWNrX2puaSBcCi0JCWxpYm5hdGl2ZWhlbHBlcl9jb21wYXRfbGliYysrCiAKIExPQ0FMX1BST0dVQVJEX0ZMQUdfRklMRVMgOj0gcHJvZ3VhcmQuZmxhZ3MKIAotTE9DQUxfU0RLX1ZFUlNJT04gOj0gdGVzdF9jdXJyZW50Ci0KIExPQ0FMX0RFWF9QUkVPUFQgOj0gZmFsc2UKIC1pbmNsdWRlIGN0cy9lcnJvcl9wcm9uZV9ydWxlc190ZXN0cy5tawogaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCkBAIC03NSw5ICs4Nyw5IEBACiAgICAgJChjYWxsIGphdmEtZmlsZXMtaW4sIHNyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIpIFwKICAgICAkKGNhbGwgYWxsLUlhaWRsLWZpbGVzLXVuZGVyLCBzcmMpCiAKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLXN1cHBvcnQtdjQgXAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWR4LmxlZ2FjeV9sZWdhY3ktc3VwcG9ydC12NCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGF0aWJpbGl0eS1jb21tb24tdXRpbC1kZXZpY2VzaWRlbGliIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBcCiAKIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfSkFWQV9MSUJSQVJZKQogCkBAIC0xNTYsOCArMTY4LDYgQEAKIAkJJChoaWRlKSAkKEFDUCkgLWZwciAkKEhPU1RfT1VUKS9DYW1lcmFJVFMgJCh2ZXJpZmllci1kaXIpCiAJCSQoaGlkZSkgY2QgJChjdHMtZGlyKSAmJiB6aXAgLXJxICQodmVyaWZpZXItZGlyLW5hbWUpICQodmVyaWZpZXItZGlyLW5hbWUpCiAKLWlmbmVxICgkKGZpbHRlciBjdHMsICQoTUFLRUNNREdPQUxTKSksKQotICAkKGNhbGwgZGlzdC1mb3ItZ29hbHMsIGN0cywgJCh2ZXJpZmllci16aXApOiQodmVyaWZpZXItemlwLW5hbWUpKQotZW5kaWYKKyQoY2FsbCBkaXN0LWZvci1nb2FscywgY3RzLCAkKHZlcmlmaWVyLXppcCk6JCh2ZXJpZmllci16aXAtbmFtZSkpCiAKIGluY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXIvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2FwcHMvQ3RzVmVyaWZpZXIvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBhMDZkYjllLi5jZTJkYzMzIDEwMDY0NAotLS0gYS9hcHBzL0N0c1ZlcmlmaWVyL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvYXBwcy9DdHNWZXJpZmllci9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0xOCw5ICsxOCw5IEBACiA8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgogICAgICAgcGFja2FnZT0iY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyIgogICAgICAgYW5kcm9pZDp2ZXJzaW9uQ29kZT0iNSIKLSAgICAgIGFuZHJvaWQ6dmVyc2lvbk5hbWU9IjguMV9yMTciPgorICAgICAgYW5kcm9pZDp2ZXJzaW9uTmFtZT0iOS4wX3IxMCI+CiAKLSAgICA8dXNlcy1zZGsgYW5kcm9pZDptaW5TZGtWZXJzaW9uPSIxOSIgYW5kcm9pZDp0YXJnZXRTZGtWZXJzaW9uPSIyNyIvPgorICAgIDx1c2VzLXNkayBhbmRyb2lkOm1pblNka1ZlcnNpb249IjE5IiBhbmRyb2lkOnRhcmdldFNka1ZlcnNpb249IjI4Ii8+CiAKICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkFDQ0VTU19GSU5FX0xPQ0FUSU9OIiAvPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX0xPQ0FUSU9OX0VYVFJBX0NPTU1BTkRTIi8+CkBAIC0zMiw2ICszMiw3IEBACiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5DQU1FUkEiIC8+CiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5DSEFOR0VfTkVUV09SS19TVEFURSIgLz4KICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkNIQU5HRV9XSUZJX1NUQVRFIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uRk9SRUdST1VORF9TRVJWSUNFIi8+CiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5GVUxMU0NSRUVOIiAvPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uSU5URVJORVQiIC8+CiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5ORkMiIC8+CkBAIC00Niw3ICs0Nyw2IEBACiAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnJlcXVpcmVkPSJmYWxzZSIgLz4KICAgICA8dXNlcy1mZWF0dXJlIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuYXV0b2ZvY3VzIgogICAgICAgICAgICAgICAgICAgYW5kcm9pZDpyZXF1aXJlZD0iZmFsc2UiIC8+Ci0gICAgPHVzZXMtZmVhdHVyZSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc29mdHdhcmUudnIubW9kZSIgYW5kcm9pZDpyZXF1aXJlZD0iZmFsc2UiIC8+CiAgICAgPHVzZXMtZmVhdHVyZSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaGFyZHdhcmUudnIuaGlnaF9wZXJmb3JtYW5jZSIgYW5kcm9pZDpyZXF1aXJlZD0iZmFsc2UiLz4KICAgICA8dXNlcy1mZWF0dXJlIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zb2Z0d2FyZS5jb21wYW5pb25fZGV2aWNlX3NldHVwIiAvPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVBRF9FWFRFUk5BTF9TVE9SQUdFIiAvPgpAQCAtNjIsMjMgKzYyLDM5IEBACiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5BQ0NFU1NfTkVUV09SS19TVEFURSIvPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5wcm92aWRlcnMudHYucGVybWlzc2lvbi5XUklURV9FUEdfREFUQSIgLz4KICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlVTRV9GSU5HRVJQUklOVCIvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uVVNFX0JJT01FVFJJQyIvPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX05PVElGSUNBVElPTl9QT0xJQ1kiIC8+CiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5BQ0NFU1NfV0lGSV9TVEFURSIgLz4KICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkNIQU5HRV9XSUZJX1NUQVRFIiAvPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX0NPQVJTRV9MT0NBVElPTiIgLz4KIAorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVBRF9QSE9ORV9TVEFURSIvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVBRF9TTVMiLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfUEhPTkVfTlVNQkVSUyIvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVDRUlWRV9TTVMiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5TRU5EX1NNUyIgLz4KKworICAgIDwhLS0gTmVlZGVkIGJ5IFVzYlRlc3QgdGFwamFja2luZyAtLT4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlNZU1RFTV9BTEVSVF9XSU5ET1ciIC8+CisKICAgICA8IS0tIE5lZWRlZCBieSB0aGUgQXVkaW8gUXVhbGl0eSBWZXJpZmllciB0byBzdG9yZSB0aGUgc291bmQgc2FtcGxlcyB0aGF0IHdpbGwgYmUgbWFpbGVkLiAtLT4KICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0VYVEVSTkFMX1NUT1JBR0UiIC8+CiAKICAgICA8IS0tIE5lZWRlZCBmb3IgVGVsZWNvbSBzZWxmLW1hbmFnZWQgQ29ubmVjdGlvblNlcnZpY2UgdGVzdHMuIC0tPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uTUFOQUdFX09XTl9DQUxMUyIgLz4KIAotICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2FwcF9uYW1lIgorICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOm5ldHdvcmtTZWN1cml0eUNvbmZpZz0iQHhtbC9uZXR3b3JrX3NlY3VyaXR5X2NvbmZpZyIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYXBwX25hbWUiCiAgICAgICAgICAgICBhbmRyb2lkOmljb249IkBkcmF3YWJsZS9pY29uIgogICAgICAgICAgICAgYW5kcm9pZDpkZWJ1Z2dhYmxlPSJ0cnVlIgogICAgICAgICAgICAgYW5kcm9pZDpsYXJnZUhlYXA9InRydWUiCiAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5EZXZpY2VEZWZhdWx0Ij4KIAorICAgICAgICA8cHJvdmlkZXIgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmxvY2F0aW9uLmN0cy5NbXNQZHVQcm92aWRlciIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmF1dGhvcml0aWVzPSJlbWVyZ2VuY3ljYWxsdmVyaWZpZXIiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpncmFudFVyaVBlcm1pc3Npb25zPSJ0cnVlIiAvPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKwogICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0iU3VpdGVOYW1lIiBhbmRyb2lkOnZhbHVlPSJDVFNfVkVSSUZJRVIiIC8+CiAKICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVsZXBob255LkhJREVfVk9JQ0VNQUlMX1NFVFRJTkdTX01FTlUiCkBAIC05NCw2ICsxMTAsMTQgQEAKICAgICAgICAgPHByb3ZpZGVyIGFuZHJvaWQ6bmFtZT0iLlRlc3RSZXN1bHRzUHJvdmlkZXIiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDphdXRob3JpdGllcz0iY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLnRlc3RyZXN1bHRzcHJvdmlkZXIiIC8+CiAKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLmFkbWluLnRhcGphY2tpbmcuVXNiVGVzdCIgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy91c2JfdGFwamFja2luZ190ZXN0Ij4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmN0cy5pbnRlbnQuY2F0ZWdvcnkuTUFOVUFMX1RFU1QiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0idGVzdF9jYXRlZ29yeSIgYW5kcm9pZDp2YWx1ZT0iQHN0cmluZy90ZXN0X2NhdGVnb3J5X2RldmljZV9hZG1pbiIgLz4KKyAgICAgICAgPC9hY3Rpdml0eT4KKwogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuYWRtaW4uUG9saWN5U2VyaWFsaXphdGlvblRlc3RBY3Rpdml0eSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2RhX3BvbGljeV9zZXJpYWxpemF0aW9uX3Rlc3QiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpjb25maWdDaGFuZ2VzPSJrZXlib2FyZEhpZGRlbnxvcmllbnRhdGlvbnxzY3JlZW5TaXplIj4KQEAgLTE1OCw4ICsxODIsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp2YWx1ZT0iYW5kcm9pZC5zb2Z0d2FyZS5jb21wYW5pb25fZGV2aWNlX3NldHVwIiAvPgogICAgICAgICA8L2FjdGl2aXR5PgogCi0gICAgICAgIDwhLS0gQSBnZW5lcmljIGFjdGl2aXR5IGZvciBpbnRlbnQgYmFzZWQgdGVzdHMgLS0+Ci0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5JbnRlbnREcml2ZW5UZXN0QWN0aXZpdHkiLz4KKyAgICAgICAgPCEtLSBBIGdlbmVyaWMgYWN0aXZpdHkgZm9yIGludGVudCBiYXNlZCB0ZXN0cy4KKyAgICAgICAgc3RhdGVOb3ROZWVkZWQgaXMgZGVmaW5lZCBvdCBwcmV2ZW50IEludGVudERyaXZlblRlc3RBY3Rpdml0eSBmcm9tIGJlaW5nIGtpbGxlZCB3aGVuCisgICAgICAgIHN3aXRjaGluZyB1c2Vycy4gSW50ZW50RHJpdmVuVGVzdEFjdGl2aXR5IGRvZXMgbm90IGltcGxlbWVudCBvblNhdmVJbnN0YW5jZVN0YXRlKCkgc28gaXQgaXMKKyAgICAgICAgZmluZSB0byBpZ25vcmUgb25TYXZlSW5zdGFuY2VTdGF0ZSgpIG5vdCBiZWluZyBjYWxsZWQuCisgICAgICAgIC0tPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuSW50ZW50RHJpdmVuVGVzdEFjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3RhdGVOb3ROZWVkZWQ9InRydWUiLz4KIAogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuYWRtaW4uRGV2aWNlQWRtaW5LZXlndWFyZERpc2FibGVkRmVhdHVyZXNBY3Rpdml0eSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2RhX2tnX2Rpc2FibGVkX2ZlYXR1cmVzX3Rlc3QiCkBAIC0xODYsNyArMjE1LDcgQEAKICAgICAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJ0ZXN0X3JlcXVpcmVkX2ZlYXR1cmVzIgogICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZhbHVlPSJhbmRyb2lkLnNvZnR3YXJlLmRldmljZV9hZG1pbiIgLz4KICAgICAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJ0ZXN0X2V4Y2x1ZGVkX2ZlYXR1cmVzIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZhbHVlPSJhbmRyb2lkLmhhcmR3YXJlLnR5cGUud2F0Y2giIC8+CisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmFsdWU9ImFuZHJvaWQuaGFyZHdhcmUudHlwZS53YXRjaDphbmRyb2lkLmhhcmR3YXJlLnR5cGUuYXV0b21vdGl2ZSIgLz4KICAgICAgICAgPC9hY3Rpdml0eT4KIAogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuYWRtaW4uU2NyZWVuTG9ja1Rlc3RBY3Rpdml0eSIKQEAgLTI0OCw2ICsyNzcsNTIgQEAKICAgICAgICAgPC9hY3Rpdml0eT4KIAogICAgICAgICA8IS0tCisgICAgICAgICAgICAgQ1RTIFZlcmlmaWVyIEJsdWV0b290aCBIaWQgRGV2aWNlIFRlc3QgU2NyZWVuCisgICAgICAgICAgICAgICAgIHRlc3QgY2F0ZWdvcnkgOiBidF9kZXZpY2VfY29tbXVuaWNhdGlvbgorICAgICAgICAgICAgICAgICB0ZXN0IHBhcmVudCA6IEJsdWV0b290aFRlc3RBY3Rpdml0eQorICAgICAgICAtLT4KKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICBhbmRyb2lkOm5hbWU9Ii5ibHVldG9vdGguSGlkRGV2aWNlQWN0aXZpdHkiCisgICAgICAgICAgICBhbmRyb2lkOmNvbmZpZ0NoYW5nZXM9ImtleWJvYXJkSGlkZGVufG9yaWVudGF0aW9ufHNjcmVlblNpemUiCisgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2J0X2hpZF9kZXZpY2UiID4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKworICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuY3RzLmludGVudC5jYXRlZ29yeS5NQU5VQUxfVEVTVCIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKworICAgICAgICAgICAgPG1ldGEtZGF0YQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0idGVzdF9jYXRlZ29yeSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnZhbHVlPSJAc3RyaW5nL2J0X2hpZCIgLz4KKyAgICAgICAgICAgIDxtZXRhLWRhdGEKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9InRlc3RfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmFsdWU9ImNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5ibHVldG9vdGguQmx1ZXRvb3RoVGVzdEFjdGl2aXR5IiAvPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDwhLS0KKyAgICAgICAgICAgICBDVFMgVmVyaWZpZXIgQmx1ZXRvb3RoIEhpZCBIb3N0IFRlc3QgU2NyZWVuCisgICAgICAgICAgICAgICAgIHRlc3QgY2F0ZWdvcnkgOiBidF9kZXZpY2VfY29tbXVuaWNhdGlvbgorICAgICAgICAgICAgICAgICB0ZXN0IHBhcmVudCA6IEJsdWV0b290aFRlc3RBY3Rpdml0eQorICAgICAgICAtLT4KKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICBhbmRyb2lkOm5hbWU9Ii5ibHVldG9vdGguSGlkSG9zdEFjdGl2aXR5IgorICAgICAgICAgICAgYW5kcm9pZDpjb25maWdDaGFuZ2VzPSJrZXlib2FyZEhpZGRlbnxvcmllbnRhdGlvbnxzY3JlZW5TaXplIgorICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9idF9oaWRfaG9zdCIgPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorCisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5jdHMuaW50ZW50LmNhdGVnb3J5Lk1BTlVBTF9URVNUIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorCisgICAgICAgICAgICA8bWV0YS1kYXRhCisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJ0ZXN0X2NhdGVnb3J5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmFsdWU9IkBzdHJpbmcvYnRfaGlkIiAvPgorICAgICAgICAgICAgPG1ldGEtZGF0YQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0idGVzdF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp2YWx1ZT0iY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLmJsdWV0b290aC5CbHVldG9vdGhUZXN0QWN0aXZpdHkiIC8+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPCEtLQogICAgICAgICAgICAgIENUUyBWZXJpZmllciBCbHVldG9vdGggU2VjdXJlIFNlcnZlciBUZXN0IFNjcmVlbgogICAgICAgICAgICAgICAgICB0ZXN0IGNhdGVnb3J5IDogYnRfZGV2aWNlX2NvbW11bmljYXRpb24KICAgICAgICAgICAgICAgICAgdGVzdCBwYXJlbnQgOiBCbHVldG9vdGhUZXN0QWN0aXZpdHkKQEAgLTUwNCwxMyArNTc5LDE3IEBACiAgICAgICAgICAgICA8bWV0YS1kYXRhCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJ0ZXN0X3JlcXVpcmVkX2ZlYXR1cmVzIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmFsdWU9ImFuZHJvaWQuaGFyZHdhcmUuYmx1ZXRvb3RoX2xlIiAvPgorICAgICAgICAgICAgPG1ldGEtZGF0YQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0idGVzdF9leGNsdWRlZF9mZWF0dXJlcyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnZhbHVlPSJhbmRyb2lkLmhhcmR3YXJlLnR5cGUud2F0Y2giICAvPgogICAgICAgICA8L2FjdGl2aXR5PgogCiAgICAgICAgIDwhLS0KICAgICAgICAgICAgQ1RTIFZlcmlmaWVyIEJMRSBJbnNlY3VyZSBDbGllbnQgRW5jcnlwdGVkIFRlc3QgU2NyZWVuCiAgICAgICAgICAgICAgICB0ZXN0IGNhdGVnb3J5IDogYnRfbGUKICAgICAgICAgICAgICAgIHRlc3QgcGFyZW50IDogQmxlSW5zZWN1cmVDbGllbnRUZXN0TGlzdEFjdGl2aXR5Ci0gICAgICAgIC0tPgorCS0tPgorICAgICAgICA8IS0tIFRPRE8oYi83ODUzODY1NykKICAgICAgICAgPGFjdGl2aXR5CiAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9Ii5ibHVldG9vdGguQmxlSW5zZWN1cmVFbmNyeXB0ZWRDbGllbnRUZXN0QWN0aXZpdHkiCiAgICAgICAgICAgICBhbmRyb2lkOmNvbmZpZ0NoYW5nZXM9ImtleWJvYXJkSGlkZGVufG9yaWVudGF0aW9ufHNjcmVlblNpemUiCkBAIC01MzEsNyArNjEwLDggQEAKICAgICAgICAgICAgIDxtZXRhLWRhdGEKICAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9InRlc3RfcmVxdWlyZWRfZmVhdHVyZXMiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDp2YWx1ZT0iYW5kcm9pZC5oYXJkd2FyZS5ibHVldG9vdGhfbGUiIC8+Ci0gICAgICAgIDwvYWN0aXZpdHk+CisJPC9hY3Rpdml0eT4KKyAgICAgICAgLS0+CiAKICAgICAgICAgPCEtLQogICAgICAgICAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTYxNCw2ICs2OTQsOSBAQAogICAgICAgICAgICAgPG1ldGEtZGF0YQogICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0idGVzdF9yZXF1aXJlZF9mZWF0dXJlcyIKICAgICAgICAgICAgICAgICBhbmRyb2lkOnZhbHVlPSJhbmRyb2lkLmhhcmR3YXJlLmJsdWV0b290aF9sZSIgLz4KKyAgICAgICAgICAgIDxtZXRhLWRhdGEKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9InRlc3RfZXhjbHVkZWRfZmVhdHVyZXMiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp2YWx1ZT0iYW5kcm9pZC5oYXJkd2FyZS50eXBlLndhdGNoIiAgLz4KICAgICAgICAgPC9hY3Rpdml0eT4KIAogICAgICAgICA8IS0tCkBAIC02MjEsNiArNzA0LDcgQEAKICAgICAgICAgICAgICAgIHRlc3QgY2F0ZWdvcnkgOiBidF9sZQogICAgICAgICAgICAgICAgdGVzdCBwYXJlbnQgOiBCbGVJbnNlY3VyZVNlcnZlclRlc3RMaXN0QWN0aXZpdHkKICAgICAgICAgLS0+CisgICAgICAgIDwhLS0gVE9ETyhiLzc4NTM4NjU3KQogICAgICAgICA8YWN0aXZpdHkKICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iLmJsdWV0b290aC5CbGVJbnNlY3VyZUVuY3J5cHRlZFNlcnZlclRlc3RBY3Rpdml0eSIKICAgICAgICAgICAgIGFuZHJvaWQ6Y29uZmlnQ2hhbmdlcz0ia2V5Ym9hcmRIaWRkZW58b3JpZW50YXRpb258c2NyZWVuU2l6ZSIKQEAgLTY0Miw2ICs3MjYsNyBAQAogICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0idGVzdF9yZXF1aXJlZF9mZWF0dXJlcyIKICAgICAgICAgICAgICAgICBhbmRyb2lkOnZhbHVlPSJhbmRyb2lkLmhhcmR3YXJlLmJsdWV0b290aF9sZSIgLz4KICAgICAgICAgPC9hY3Rpdml0eT4KKyAgICAgICAgLS0+CiAKICAgICAgICAgPCEtLQogICAgICAgICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtNzI1LDYgKzgxMCw5IEBACiAgICAgICAgICAgICA8bWV0YS1kYXRhCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJ0ZXN0X3JlcXVpcmVkX2ZlYXR1cmVzIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmFsdWU9ImFuZHJvaWQuaGFyZHdhcmUuYmx1ZXRvb3RoX2xlIiAvPgorICAgICAgICAgICAgPG1ldGEtZGF0YQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0idGVzdF9leGNsdWRlZF9mZWF0dXJlcyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnZhbHVlPSJhbmRyb2lkLmhhcmR3YXJlLnR5cGUud2F0Y2giICAvPgogICAgICAgICA8L2FjdGl2aXR5PgogCiAgICAgICAgIDwhLS0KQEAgLTgzNSw2ICs5MjMsOSBAQAogICAgICAgICAgICAgPG1ldGEtZGF0YQogICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0idGVzdF9yZXF1aXJlZF9mZWF0dXJlcyIKICAgICAgICAgICAgICAgICBhbmRyb2lkOnZhbHVlPSJhbmRyb2lkLmhhcmR3YXJlLmJsdWV0b290aF9sZSIgLz4KKyAgICAgICAgICAgIDxtZXRhLWRhdGEKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9InRlc3RfZXhjbHVkZWRfZmVhdHVyZXMiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp2YWx1ZT0iYW5kcm9pZC5oYXJkd2FyZS50eXBlLndhdGNoIiAgLz4KICAgICAgICAgPC9hY3Rpdml0eT4KIAogICAgICAgICA8IS0tCkBAIC05ODUsNiArMTA3NiwyMCBAQAogICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZhbHVlPSJhbmRyb2lkLmhhcmR3YXJlLnR5cGUudGVsZXZpc2lvbjphbmRyb2lkLnNvZnR3YXJlLmxlYW5iYWNrOmFuZHJvaWQuaGFyZHdhcmUudHlwZS53YXRjaCIgLz4KICAgICAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJ0ZXN0X3JlcXVpcmVkX2ZlYXR1cmVzIiBhbmRyb2lkOnZhbHVlPSJhbmRyb2lkLmhhcmR3YXJlLmZpbmdlcnByaW50IiAvPgogICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5zZWN1cml0eS5CaW9tZXRyaWNQcm9tcHRCb3VuZEtleXNUZXN0IgorICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9zZWNfZmluZ2VycHJpbnRfZGlhbG9nX2JvdW5kX2tleV90ZXN0IgorICAgICAgICAgICAgYW5kcm9pZDpjb25maWdDaGFuZ2VzPSJrZXlib2FyZEhpZGRlbnxvcmllbnRhdGlvbnxzY3JlZW5TaXplIiA+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5jdHMuaW50ZW50LmNhdGVnb3J5Lk1BTlVBTF9URVNUIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9InRlc3RfY2F0ZWdvcnkiIGFuZHJvaWQ6dmFsdWU9IkBzdHJpbmcvdGVzdF9jYXRlZ29yeV9zZWN1cml0eSIgLz4KKyAgICAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJ0ZXN0X2V4Y2x1ZGVkX2ZlYXR1cmVzIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmFsdWU9ImFuZHJvaWQuaGFyZHdhcmUudHlwZS50ZWxldmlzaW9uOmFuZHJvaWQuc29mdHdhcmUubGVhbmJhY2s6YW5kcm9pZC5oYXJkd2FyZS50eXBlLndhdGNoIiAvPgorICAgICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9InRlc3RfcmVxdWlyZWRfZmVhdHVyZXMiIGFuZHJvaWQ6dmFsdWU9ImFuZHJvaWQuaGFyZHdhcmUuZmluZ2VycHJpbnQiIC8+CisgICAgICAgIDwvYWN0aXZpdHk+CisKICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnNlY3VyaXR5LlNjcmVlbkxvY2tCb3VuZEtleXNUZXN0IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvc2VjX2xvY2tfYm91bmRfa2V5X3Rlc3QiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpjb25maWdDaGFuZ2VzPSJrZXlib2FyZEhpZGRlbnxvcmllbnRhdGlvbnxzY3JlZW5TaXplIiA+CkBAIC05OTgsNiArMTEwMyw3IEBACiAgICAgICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0idGVzdF9yZXF1aXJlZF9mZWF0dXJlcyIKICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp2YWx1ZT0iYW5kcm9pZC5zb2Z0d2FyZS5kZXZpY2VfYWRtaW4iIC8+CiAgICAgICAgIDwvYWN0aXZpdHk+CisKICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnNlY3VyaXR5LkxvY2tDb25maXJtQnlwYXNzVGVzdCIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2xvY2tfY29uZmlybV90ZXN0X3RpdGxlIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29uZmlnQ2hhbmdlcz0ia2V5Ym9hcmRIaWRkZW58b3JpZW50YXRpb258c2NyZWVuU2l6ZSIgPgpAQCAtMTEwNSw2ICsxMjExLDQyIEBACiAgICAgICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0idGVzdF9yZXF1aXJlZF9mZWF0dXJlcyIgYW5kcm9pZDp2YWx1ZT0iYW5kcm9pZC5oYXJkd2FyZS5sb2NhdGlvbi5ncHMiIC8+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLmxvY2F0aW9uLkVtZXJnZW5jeUNhbGxXaWZpVGVzdHNBY3Rpdml0eSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvbG9jYXRpb25fZW1lcmdlbmN5X2NhbGxfd2lmaV90ZXN0IgorICAgICAgICAgICAgYW5kcm9pZDpzY3JlZW5PcmllbnRhdGlvbj0ibG9ja2VkIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuY3RzLmludGVudC5jYXRlZ29yeS5NQU5VQUxfVEVTVCIvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9InRlc3RfY2F0ZWdvcnkiIGFuZHJvaWQ6dmFsdWU9IkBzdHJpbmcvdGVzdF9jYXRlZ29yeV9oYXJkd2FyZSIvPgorICAgICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9InRlc3RfcmVxdWlyZWRfZmVhdHVyZXMiCisgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmFsdWU9ImFuZHJvaWQuaGFyZHdhcmUubG9jYXRpb24uZ3BzOmFuZHJvaWQuaGFyZHdhcmUud2lmaTphbmRyb2lkLmhhcmR3YXJlLnRlbGVwaG9ueSIvPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5sb2NhdGlvbi5FbWVyZ2VuY3lDYWxsTWVzc2FnZVRlc3RzQWN0aXZpdHkiCisgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2xvY2F0aW9uX2VtZXJnZW5jeV9jYWxsX21lc3NhZ2VfdGVzdCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2NyZWVuT3JpZW50YXRpb249ImxvY2tlZCI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmN0cy5pbnRlbnQuY2F0ZWdvcnkuTUFOVUFMX1RFU1QiLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJ0ZXN0X2NhdGVnb3J5IiBhbmRyb2lkOnZhbHVlPSJAc3RyaW5nL3Rlc3RfY2F0ZWdvcnlfaGFyZHdhcmUiLz4KKyAgICAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJ0ZXN0X3JlcXVpcmVkX2ZlYXR1cmVzIgorICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZhbHVlPSJhbmRyb2lkLmhhcmR3YXJlLmxvY2F0aW9uLmdwczphbmRyb2lkLmhhcmR3YXJlLndpZmk6YW5kcm9pZC5oYXJkd2FyZS50ZWxlcGhvbnkiLz4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIubG9jYXRpb24uRW1lcmdlbmN5Q2FsbEdOU1NUZXN0c0FjdGl2aXR5IgorICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9sb2NhdGlvbl9lbWVyZ2VuY3lfY2FsbF9ncHNfdGVzdCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2NyZWVuT3JpZW50YXRpb249ImxvY2tlZCI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmN0cy5pbnRlbnQuY2F0ZWdvcnkuTUFOVUFMX1RFU1QiLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJ0ZXN0X2NhdGVnb3J5IiBhbmRyb2lkOnZhbHVlPSJAc3RyaW5nL3Rlc3RfY2F0ZWdvcnlfaGFyZHdhcmUiLz4KKyAgICAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJ0ZXN0X3JlcXVpcmVkX2ZlYXR1cmVzIgorICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZhbHVlPSJhbmRyb2lkLmhhcmR3YXJlLmxvY2F0aW9uLmdwczphbmRyb2lkLmhhcmR3YXJlLndpZmk6YW5kcm9pZC5oYXJkd2FyZS50ZWxlcGhvbnkiLz4KKyAgICAgICAgPC9hY3Rpdml0eT4KKwogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIubG9jYXRpb24uR25zc01lYXN1cmVtZW50V2hlbk5vTG9jYXRpb25UZXN0c0FjdGl2aXR5IgogICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9sb2NhdGlvbl9nbnNzX21lYXN1cmVfbm9fbG9jYXRpb25fdGVzdCIKICAgICAgICAgICAgIGFuZHJvaWQ6c2NyZWVuT3JpZW50YXRpb249ImxvY2tlZCI+CkBAIC0xMTU3LDYgKzEyOTksMTkgQEAKICAgICAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJ0ZXN0X3JlcXVpcmVkX2ZlYXR1cmVzIiBhbmRyb2lkOnZhbHVlPSJhbmRyb2lkLmhhcmR3YXJlLndpZmkiIC8+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLm5ldC5NdWx0aU5ldHdvcmtDb25uZWN0aXZpdHlUZXN0QWN0aXZpdHkiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL211bHRpbmV0d29ya19jb25uZWN0aXZpdHlfdGVzdCI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5jdHMuaW50ZW50LmNhdGVnb3J5Lk1BTlVBTF9URVNUIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9InRlc3RfY2F0ZWdvcnkiIGFuZHJvaWQ6dmFsdWU9IkBzdHJpbmcvdGVzdF9jYXRlZ29yeV9uZXR3b3JraW5nIiAvPgorICAgICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9InRlc3RfcmVxdWlyZWRfZmVhdHVyZXMiCisgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmFsdWU9ImFuZHJvaWQuaGFyZHdhcmUud2lmaTphbmRyb2lkLmhhcmR3YXJlLnRlbGVwaG9ueSIgLz4KKyAgICAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJ0ZXN0X2V4Y2x1ZGVkX2ZlYXR1cmVzIgorICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZhbHVlPSJhbmRyb2lkLmhhcmR3YXJlLnR5cGUudGVsZXZpc2lvbjphbmRyb2lkLnNvZnR3YXJlLmxlYW5iYWNrOmFuZHJvaWQuaGFyZHdhcmUudHlwZS53YXRjaCIgLz4KKyAgICAgICAgPC9hY3Rpdml0eT4KKwogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIubmZjLk5mY1Rlc3RBY3Rpdml0eSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL25mY190ZXN0IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29uZmlnQ2hhbmdlcz0ia2V5Ym9hcmRIaWRkZW58b3JpZW50YXRpb258c2NyZWVuU2l6ZSI+CkBAIC0xNTEwLDcgKzE2NjUsNyBAQAogCiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5zZW5zb3JzLk9mZkJvZHlTZW5zb3JUZXN0QWN0aXZpdHkiCiAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3Nuc3Jfb2ZmYm9keV9zZW5zb3JfdGVzdCI+Ci0gICAgICAgICAgICA8cmVjZWl2ZXIgYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIuc2Vuc29ycy5PZmZCb2R5U2Vuc29yVGVzdEFjdGl2aXR5JEFsYXJtUmVjZWl2ZXIiPjwvcmVjZWl2ZXI+Cis8IS0tICAgICAgICAgICAgPHJlY2VpdmVyIGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLnNlbnNvcnMuT2ZmQm9keVNlbnNvclRlc3RBY3Rpdml0eSRBbGFybVJlY2VpdmVyIj48L3JlY2VpdmVyPi0tPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgogICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuY3RzLmludGVudC5jYXRlZ29yeS5NQU5VQUxfVEVTVCIgLz4KQEAgLTE1OTQsNTEgKzE3NDksNiBAQAogICAgICAgICA8L2FjdGl2aXR5PgogICAgICAgICA8IS0tIEVuZCBzZW5zb3IgdGVzdHMgZGVmaW5pdGlvbnMgLS0+CiAKLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLmxvY2F0aW9uLkxvY2F0aW9uTW9kZU9mZlRlc3RBY3Rpdml0eSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2xvY2F0aW9uX21vZGVfb2ZmX3Rlc3QiPgotICAgICAgICAgICAgPGludGVudC1maWx0ZXI+Ci0gICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgotICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuY3RzLmludGVudC5jYXRlZ29yeS5NQU5VQUxfVEVTVCIgLz4KLSAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KLSAgICAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJ0ZXN0X2NhdGVnb3J5IiBhbmRyb2lkOnZhbHVlPSJAc3RyaW5nL3Rlc3RfY2F0ZWdvcnlfbG9jYXRpb24iIC8+Ci0gICAgICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0idGVzdF9leGNsdWRlZF9mZWF0dXJlcyIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp2YWx1ZT0iYW5kcm9pZC5oYXJkd2FyZS50eXBlLnRlbGV2aXNpb246YW5kcm9pZC5zb2Z0d2FyZS5sZWFuYmFjayIgLz4KLSAgICAgICAgPC9hY3Rpdml0eT4KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLmxvY2F0aW9uLkxvY2F0aW9uTW9kZUhpZ2hBY2N1cmFjeVRlc3RBY3Rpdml0eSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2xvY2F0aW9uX21vZGVfaGlnaF9hY2N1cmFjeV90ZXN0Ij4KLSAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgotICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KLSAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmN0cy5pbnRlbnQuY2F0ZWdvcnkuTUFOVUFMX1RFU1QiIC8+Ci0gICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+Ci0gICAgICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0idGVzdF9jYXRlZ29yeSIgYW5kcm9pZDp2YWx1ZT0iQHN0cmluZy90ZXN0X2NhdGVnb3J5X2xvY2F0aW9uIiAvPgotICAgICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9InRlc3RfcmVxdWlyZWRfZmVhdHVyZXMiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmFsdWU9ImFuZHJvaWQuaGFyZHdhcmUubG9jYXRpb24ubmV0d29yazphbmRyb2lkLmhhcmR3YXJlLmxvY2F0aW9uLmdwcyIgLz4KLSAgICAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJ0ZXN0X2V4Y2x1ZGVkX2ZlYXR1cmVzIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZhbHVlPSJhbmRyb2lkLmhhcmR3YXJlLnR5cGUudGVsZXZpc2lvbjphbmRyb2lkLnNvZnR3YXJlLmxlYW5iYWNrIiAvPgotICAgICAgICA8L2FjdGl2aXR5PgotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIubG9jYXRpb24uTG9jYXRpb25Nb2RlQmF0dGVyeVNhdmluZ1Rlc3RBY3Rpdml0eSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2xvY2F0aW9uX21vZGVfYmF0dGVyeV9zYXZpbmdfdGVzdCI+Ci0gICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KLSAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+Ci0gICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5jdHMuaW50ZW50LmNhdGVnb3J5Lk1BTlVBTF9URVNUIiAvPgotICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgotICAgICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9InRlc3RfY2F0ZWdvcnkiIGFuZHJvaWQ6dmFsdWU9IkBzdHJpbmcvdGVzdF9jYXRlZ29yeV9sb2NhdGlvbiIgLz4KLSAgICAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJ0ZXN0X3JlcXVpcmVkX2ZlYXR1cmVzIiBhbmRyb2lkOnZhbHVlPSJhbmRyb2lkLmhhcmR3YXJlLmxvY2F0aW9uLm5ldHdvcmsiIC8+Ci0gICAgICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0idGVzdF9leGNsdWRlZF9mZWF0dXJlcyIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp2YWx1ZT0iYW5kcm9pZC5oYXJkd2FyZS50eXBlLnRlbGV2aXNpb246YW5kcm9pZC5zb2Z0d2FyZS5sZWFuYmFjayIgLz4KLSAgICAgICAgPC9hY3Rpdml0eT4KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLmxvY2F0aW9uLkxvY2F0aW9uTW9kZURldmljZU9ubHlUZXN0QWN0aXZpdHkiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9sb2NhdGlvbl9tb2RlX2RldmljZV9vbmx5X3Rlc3QiPgotICAgICAgICAgICAgPGludGVudC1maWx0ZXI+Ci0gICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgotICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuY3RzLmludGVudC5jYXRlZ29yeS5NQU5VQUxfVEVTVCIgLz4KLSAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KLSAgICAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJ0ZXN0X2NhdGVnb3J5IiBhbmRyb2lkOnZhbHVlPSJAc3RyaW5nL3Rlc3RfY2F0ZWdvcnlfbG9jYXRpb24iIC8+Ci0gICAgICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0idGVzdF9yZXF1aXJlZF9mZWF0dXJlcyIgYW5kcm9pZDp2YWx1ZT0iYW5kcm9pZC5oYXJkd2FyZS5sb2NhdGlvbi5ncHMiIC8+Ci0gICAgICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0idGVzdF9leGNsdWRlZF9mZWF0dXJlcyIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp2YWx1ZT0iYW5kcm9pZC5oYXJkd2FyZS50eXBlLnRlbGV2aXNpb246YW5kcm9pZC5zb2Z0d2FyZS5sZWFuYmFjayIgLz4KLSAgICAgICAgPC9hY3Rpdml0eT4KLQogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuY2FtZXJhLmZvcm1hdHMuQ2FtZXJhRm9ybWF0c0FjdGl2aXR5IgogICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2NhbWVyYV9mb3JtYXQiCiAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2NyZWVuT3JpZW50YXRpb249ImxhbmRzY2FwZSI+CkBAIC0xODEwLDYgKzE5MjAsMTAgQEAKIAogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIubWFuYWdlZHByb3Zpc2lvbmluZy5SZWNlbnRzUmVkYWN0aW9uQWN0aXZpdHkiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9wcm92aXNpb25pbmdfYnlvZF9yZWNlbnRzIiA+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5tYW5hZ2VkcHJvdmlzaW9uaW5nLkludGVybWVkaWF0ZVJlY2VudEFjdGl2aXR5IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9wcm92aXNpb25pbmdfYnlvZF9yZWNlbnRzIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuTm9EaXNwbGF5Ij4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIubWFuYWdlZHByb3Zpc2lvbmluZy5SRUNFTlRTIiAvPgogICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkRFRkFVTFQiPjwvY2F0ZWdvcnk+CkBAIC0xODM1LDYgKzE5NDksMTQgQEAKICAgICAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJ0ZXN0X2NhdGVnb3J5IiBhbmRyb2lkOnZhbHVlPSJAc3RyaW5nL3Rlc3RfY2F0ZWdvcnlfbm90aWZpY2F0aW9ucyIgLz4KICAgICAgICAgPC9hY3Rpdml0eT4KIAorICAgICAgICA8cmVjZWl2ZXIgYW5kcm9pZDpuYW1lPSIubm90aWZpY2F0aW9ucy5CbG9ja0NoYW5nZVJlY2VpdmVyIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFwcC5hY3Rpb24uTk9USUZJQ0FUSU9OX0NIQU5ORUxfQkxPQ0tfU1RBVEVfQ0hBTkdFRCIvPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFwcC5hY3Rpb24uTk9USUZJQ0FUSU9OX0NIQU5ORUxfR1JPVVBfQkxPQ0tfU1RBVEVfQ0hBTkdFRCIvPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFwcC5hY3Rpb24uQVBQX0JMT0NLX1NUQVRFX0NIQU5HRUQiLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9yZWNlaXZlcj4KKwogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIubm90aWZpY2F0aW9ucy5Db25kaXRpb25Qcm92aWRlclZlcmlmaWVyQWN0aXZpdHkiCiAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2NwX3Rlc3QiPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CkBAIC0xODQzLDcgKzE5NjUsNyBAQAogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9InRlc3RfY2F0ZWdvcnkiIGFuZHJvaWQ6dmFsdWU9IkBzdHJpbmcvdGVzdF9jYXRlZ29yeV9ub3RpZmljYXRpb25zIiAvPgogICAgICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9InRlc3RfZXhjbHVkZWRfZmVhdHVyZXMiCi0gICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmFsdWU9ImFuZHJvaWQuaGFyZHdhcmUudHlwZS50ZWxldmlzaW9uOmFuZHJvaWQuc29mdHdhcmUubGVhbmJhY2s6YW5kcm9pZC5oYXJkd2FyZS50eXBlLndhdGNoIiAvPgorICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZhbHVlPSJhbmRyb2lkLmhhcmR3YXJlLnR5cGUuYXV0b21vdGl2ZTphbmRyb2lkLmhhcmR3YXJlLnR5cGUudGVsZXZpc2lvbjphbmRyb2lkLnNvZnR3YXJlLmxlYW5iYWNrOmFuZHJvaWQuaGFyZHdhcmUudHlwZS53YXRjaCIgLz4KICAgICAgICAgPC9hY3Rpdml0eT4KIAogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIubm90aWZpY2F0aW9ucy5BdHRlbnRpb25NYW5hZ2VtZW50VmVyaWZpZXJBY3Rpdml0eSIKQEAgLTE4ODQsNyArMjAwNiw3IEBACiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0idGVzdF9jYXRlZ29yeSIgYW5kcm9pZDp2YWx1ZT0iQHN0cmluZy90ZXN0X2NhdGVnb3J5X25vdGlmaWNhdGlvbnMiIC8+CiAgICAgICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0idGVzdF9leGNsdWRlZF9mZWF0dXJlcyIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnZhbHVlPSJhbmRyb2lkLmhhcmR3YXJlLnR5cGUud2F0Y2g6YW5kcm9pZC5zb2Z0d2FyZS5sZWFuYmFjayIgLz4KKyAgICAgICAgICAgICAgICBhbmRyb2lkOnZhbHVlPSJhbmRyb2lkLmhhcmR3YXJlLnR5cGUud2F0Y2g6YW5kcm9pZC5zb2Z0d2FyZS5sZWFuYmFjazphbmRyb2lkLmhhcmR3YXJlLnR5cGUuYXV0b21vdGl2ZSIgLz4KICAgICAgICAgPC9hY3Rpdml0eT4KIAogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIudnIuVnJMaXN0ZW5lclZlcmlmaWVyQWN0aXZpdHkiCkBAIC0xODk2LDcgKzIwMTgsNyBAQAogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9InRlc3RfY2F0ZWdvcnkiIGFuZHJvaWQ6dmFsdWU9IkBzdHJpbmcvdGVzdF9jYXRlZ29yeV92ciIgLz4KICAgICAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJ0ZXN0X3JlcXVpcmVkX2ZlYXR1cmVzIgotICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZhbHVlPSJhbmRyb2lkLnNvZnR3YXJlLnZyLm1vZGUiIC8+CisgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmFsdWU9ImFuZHJvaWQuaGFyZHdhcmUudnIuaGlnaF9wZXJmb3JtYW5jZSIgLz4KICAgICAgICAgPC9hY3Rpdml0eT4KIAogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIudnIuTW9ja1ZyQWN0aXZpdHkiCkBAIC0yMDYxLDYgKzIxODMsMTQgQEAKICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYXdhcmVfZGF0YV9wYXRoX29vYl9wYXNzcGhyYXNlX2luaXRpYXRvciIKICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29uZmlnQ2hhbmdlcz0ia2V5Ym9hcmRIaWRkZW58b3JpZW50YXRpb258c2NyZWVuU2l6ZSIgLz4KIAorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIud2lmaWF3YXJlLkRpc2NvdmVyeVJhbmdpbmdQdWJsaXNoVGVzdEFjdGl2aXR5IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9hd2FyZV9kaXNjb3ZlcnlfcmFuZ2luZ19wdWJsaXNoIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpjb25maWdDaGFuZ2VzPSJrZXlib2FyZEhpZGRlbnxvcmllbnRhdGlvbnxzY3JlZW5TaXplIiAvPgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii53aWZpYXdhcmUuRGlzY292ZXJ5UmFuZ2luZ1N1YnNjcmliZVRlc3RBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYXdhcmVfZGlzY292ZXJ5X3Jhbmdpbmdfc3Vic2NyaWJlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpjb25maWdDaGFuZ2VzPSJrZXlib2FyZEhpZGRlbnxvcmllbnRhdGlvbnxzY3JlZW5TaXplIiAvPgorCiAgICAgICAgIDxhY3Rpdml0eS1hbGlhcyBhbmRyb2lkOm5hbWU9Ii5DdHNWZXJpZmllckFjdGl2aXR5IiBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2FwcF9uYW1lIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0QWN0aXZpdHk9Ii5UZXN0TGlzdEFjdGl2aXR5Ij4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgpAQCAtMjEzMyw2ICsyMjYzLDExIEBACiAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmFsdWU9ImFuZHJvaWQuaGFyZHdhcmUudHlwZS50ZWxldmlzaW9uOmFuZHJvaWQuc29mdHdhcmUubGVhbmJhY2s6YW5kcm9pZC5oYXJkd2FyZS50eXBlLmF1dG9tb3RpdmUiIC8+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAKKyAgICAgICAgPHNlcnZpY2UKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5zZW5zb3JzLkRldmljZVN1c3BlbmRUZXN0QWN0aXZpdHkkRGV2aWNlU3VzcGVuZFRlc3RTZXJ2aWNlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvc25zcl9kZXZpY2Vfc3VzcGVuZF9zZXJ2aWNlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWNvbj0iQGRyYXdhYmxlL2ljb24iIC8+CisKICAgICAgICAgPHJlY2VpdmVyIGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLnNlbnNvcnMuRGV2aWNlU3VzcGVuZFRlc3RBY3Rpdml0eSRBbGFybVJlY2VpdmVyIj4KICAgICAgICAgPC9yZWNlaXZlcj4KIApAQCAtMjE1OSw2ICsyMjk0LDI4IEBACiAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmFsdWU9ImFuZHJvaWQuaGFyZHdhcmUuc2Vuc29yLmFjY2VsZXJvbWV0ZXIiIC8+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5zZW5zb3JzLkV2ZW50U2FuaXRpemF0aW9uVGVzdEFjdGl2aXR5IgorICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9zbnNyX2V2ZW50X3Nhbml0aXphdGlvbl90ZXN0IgorICAgICAgICAgICAgYW5kcm9pZDpzY3JlZW5PcmllbnRhdGlvbj0ibm9zZW5zb3IiID4KKworICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuY3RzLmludGVudC5jYXRlZ29yeS5NQU5VQUxfVEVTVCIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKworICAgICAgICAgICAgPG1ldGEtZGF0YQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0idGVzdF9jYXRlZ29yeSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnZhbHVlPSJAc3RyaW5nL3Rlc3RfY2F0ZWdvcnlfc2Vuc29ycyI+CisgICAgICAgICAgICA8L21ldGEtZGF0YT4KKworICAgICAgICAgICAgPG1ldGEtZGF0YQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0idGVzdF9yZXF1aXJlZF9mZWF0dXJlcyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnZhbHVlPSJhbmRyb2lkLmhhcmR3YXJlLnNlbnNvci5wcm94aW1pdHk6YW5kcm9pZC5oYXJkd2FyZS5zZW5zb3IuYWNjZWxlcm9tZXRlciI+CisgICAgICAgICAgICA8L21ldGEtZGF0YT4KKworICAgICAgICA8L2FjdGl2aXR5PgorCiAgICAgICAgIDxyZWNlaXZlciBhbmRyb2lkOm5hbWU9Ii53aWRnZXQuV2lkZ2V0Q3RzUHJvdmlkZXIiPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYXBwd2lkZ2V0LmFjdGlvbi5BUFBXSURHRVRfVVBEQVRFIiAvPgpAQCAtMjI3OCw2ICsyNDM1LDE1IEBACiAgICAgICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0idGVzdF9yZXF1aXJlZF9mZWF0dXJlcyIgYW5kcm9pZDp2YWx1ZT0iYW5kcm9pZC5zb2Z0d2FyZS5kZXZpY2VfYWRtaW4iIC8+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLm1hbmFnZWRwcm92aXNpb25pbmcuTWFuYWdlZFVzZXJQb3NpdGl2ZVRlc3RBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvbWFuYWdlZF91c2VyX3Rlc3QiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIubWFuYWdlZHByb3Zpc2lvbmluZy5hY3Rpb24uQ0hFQ0tfQUZGSUxJQVRFRF9QUk9GSUxFX09XTkVSIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkRFRkFVTFQiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLm1hbmFnZWRwcm92aXNpb25pbmcuRGV2aWNlT3duZXJSZXF1ZXN0aW5nQnVncmVwb3J0VGVzdEFjdGl2aXR5IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvZGV2aWNlX293bmVyX3JlcXVlc3RpbmdfYnVncmVwb3J0X3Rlc3RzIj4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgpAQCAtMjI5MCwxNCArMjQ1Niw2IEBACiAgICAgICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0idGVzdF9yZXF1aXJlZF9mZWF0dXJlcyIgYW5kcm9pZDp2YWx1ZT0iYW5kcm9pZC5zb2Z0d2FyZS5kZXZpY2VfYWRtaW4iIC8+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAKLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLm1hbmFnZWRwcm92aXNpb25pbmcuRGV2aWNlT3duZXJQb3NpdGl2ZVRlc3RBY3Rpdml0eSRDb21tYW5kUmVjZWl2ZXIiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0iZmFsc2UiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuTm9EaXNwbGF5IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bm9IaXN0b3J5PSJ0cnVlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6YXV0b1JlbW92ZUZyb21SZWNlbnRzPSJ0cnVlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3RhdGVOb3ROZWVkZWQ9InRydWUiPgotICAgICAgICA8L2FjdGl2aXR5PgotCiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5tYW5hZ2VkcHJvdmlzaW9uaW5nLktleWd1YXJkRGlzYWJsZWRGZWF0dXJlc0FjdGl2aXR5IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvcHJvdmlzaW9uaW5nX2J5b2Rfa2V5Z3VhcmRfZGlzYWJsZWRfZmVhdHVyZXMiPgogICAgICAgICA8L2FjdGl2aXR5PgpAQCAtMjMwNiw2ICsyNDY0LDE0IEBACiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9wcm92aXNpb25pbmdfYnlvZF9kaXNhbGxvd19hcHBzX2NvbnRyb2wiPgogICAgICAgICA8L2FjdGl2aXR5PgogCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5tYW5hZ2VkcHJvdmlzaW9uaW5nLkxvY2tUYXNrVWlUZXN0QWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9kZXZpY2Vfb3duZXJfbG9ja190YXNrX3VpX3Rlc3QiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5tYW5hZ2VkcHJvdmlzaW9uaW5nLmFjdGlvbi5TVE9QX0xPQ0tfVEFTSyIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5ERUZBVUxUIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5tYW5hZ2VkcHJvdmlzaW9uaW5nLldpZmlMb2NrZG93blRlc3RBY3Rpdml0eSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2RldmljZV9vd25lcl93aWZpX2xvY2tkb3duX3Rlc3QiPgogICAgICAgICA8L2FjdGl2aXR5PgpAQCAtMjMzMyw2ICsyNDk5LDE0IEBACiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLm1hbmFnZWRwcm92aXNpb25pbmcuS2V5Q2hhaW5UZXN0QWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9wcm92aXNpb25pbmdfYnlvZF9rZXljaGFpbiI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLm1hbmFnZWRwcm92aXNpb25pbmcuS0VZQ0hBSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuREVGQVVMVCIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKwogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIubWFuYWdlZHByb3Zpc2lvbmluZy5QZXJtaXNzaW9uTG9ja2Rvd25UZXN0QWN0aXZpdHkiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9kZXZpY2VfcHJvZmlsZV9vd25lcl9wZXJtaXNzaW9uX2xvY2tkb3duX3Rlc3QiPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CkBAIC0yNDY5LDExICsyNjQzLDE1IEBACiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLm1hbmFnZWRwcm92aXNpb25pbmcuQllPRF9TVEFUVVMiIC8+Ci0gICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuREVGQVVMVCI+PC9jYXRlZ29yeT4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5ERUZBVUxUIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLm1hbmFnZWRwcm92aXNpb25pbmcuQllPRF9URVNUX1JFU1VMVCIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5ERUZBVUxUIiAvPgogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5tYW5hZ2VkcHJvdmlzaW9uaW5nLmFjdGlvbi5CWU9EX0RJU0tfRU5DUllQVElPTl9TVEFUVVMiIC8+Ci0gICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuREVGQVVMVCI+PC9jYXRlZ29yeT4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5ERUZBVUxUIiAvPgogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9InRlc3RfY2F0ZWdvcnkiIGFuZHJvaWQ6dmFsdWU9IkBzdHJpbmcvdGVzdF9jYXRlZ29yeV9tYW5hZ2VkX3Byb3Zpc2lvbmluZyIgLz4KICAgICAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJ0ZXN0X3JlcXVpcmVkX2ZlYXR1cmVzIiBhbmRyb2lkOnZhbHVlPSJhbmRyb2lkLnNvZnR3YXJlLm1hbmFnZWRfdXNlcnM6YW5kcm9pZC5zb2Z0d2FyZS5kZXZpY2VfYWRtaW4iIC8+CkBAIC0yNTMxLDcgKzI3MDksNyBAQAogICAgICAgICA8L2FjdGl2aXR5PgogCiAgICAgICAgIDxwcm92aWRlcgotICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudjQuY29udGVudC5GaWxlUHJvdmlkZXIiCisgICAgICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LmNvcmUuY29udGVudC5GaWxlUHJvdmlkZXIiCiAgICAgICAgICAgICBhbmRyb2lkOmF1dGhvcml0aWVzPSJjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIubWFuYWdlZHByb3Zpc2lvbmluZy5maWxlcHJvdmlkZXIiCiAgICAgICAgICAgICBhbmRyb2lkOmdyYW50VXJpUGVybWlzc2lvbnM9InRydWUiCiAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJmYWxzZSI+CkBAIC0yNjQ4LDcgKzI4MjYsMTUgQEAKICAgICAgICAgPC9hY3Rpdml0eT4KIAogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIubWFuYWdlZHByb3Zpc2lvbmluZy5UdXJuT2ZmV29ya0FjdGl2aXR5IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvcHJvdmlzaW9uaW5nX2J5b2RfdHVybl9vZmZfd29yayI+CisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3Byb3Zpc2lvbmluZ19ieW9kX3R1cm5fb2ZmX3dvcmsiPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5tYW5hZ2VkcHJvdmlzaW9uaW5nLldvcmtQcm9maWxlV2lkZ2V0QWN0aXZpdHkiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3Byb3Zpc2lvbmluZ19ieW9kX3dvcmtfcHJvZmlsZV93aWRnZXQiPgorICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLmJ5b2QudGVzdF93b3JrX3Byb2ZpbGVfd2lkZ2V0Ii8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuREVGQVVMVCIvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICA8L2FjdGl2aXR5PgogCiAgICAgICAgIDxyZWNlaXZlciBhbmRyb2lkOm5hbWU9Ii5tYW5hZ2VkcHJvdmlzaW9uaW5nLkRldmljZUFkbWluVGVzdFJlY2VpdmVyIgpAQCAtMjY2MSw2ICsyODQ3LDEwIEBACiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYXBwLmFjdGlvbi5QUk9GSUxFX1BST1ZJU0lPTklOR19DT01QTEVURSIvPgogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICA8L3JlY2VpdmVyPgorICAgICAgICA8c2VydmljZSBhbmRyb2lkOm5hbWU9Ii5tYW5hZ2VkcHJvdmlzaW9uaW5nLkRldmljZUFkbWluVGVzdFJlY2VpdmVyJFByaW1hcnlVc2VyU2VydmljZSIKKyAgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgYW5kcm9pZDpwZXJtaXNzaW9uPSJhbmRyb2lkLnBlcm1pc3Npb24uQklORF9ERVZJQ0VfQURNSU4iPgorICAgICAgICA8L3NlcnZpY2U+CiAKIDwhLS0gQ29tbWVudCBvdXQgdW50aWwgYi8yODQwNjA0NCBpcyBhZGRyZXNzZWQKICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLmpvYnNjaGVkdWxlci5JZGxlQ29uc3RyYWludFRlc3RBY3Rpdml0eSIgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9qc19pZGxlX3Rlc3QiPgpAQCAtMjgyNSw2ICszMDE1LDcgQEAKICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KICAgICAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJ0ZXN0X2NhdGVnb3J5IiBhbmRyb2lkOnZhbHVlPSJAc3RyaW5nL3Rlc3RfY2F0ZWdvcnlfYXVkaW8iIC8+CiAgICAgICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0idGVzdF9yZXF1aXJlZF9mZWF0dXJlcyIgYW5kcm9pZDp2YWx1ZT0iYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5vdXRwdXQiIC8+CisgICAgICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0idGVzdF9leGNsdWRlZF9mZWF0dXJlcyIgYW5kcm9pZDp2YWx1ZT0iYW5kcm9pZC5zb2Z0d2FyZS5sZWFuYmFjayIgLz4KICAgICAgICAgPC9hY3Rpdml0eT4KIAogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuYXVkaW8uQXVkaW9JbnB1dERldmljZU5vdGlmaWNhdGlvbnNBY3Rpdml0eSIKQEAgLTI4MzUsNiArMzAyNiw3IEBACiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0idGVzdF9jYXRlZ29yeSIgYW5kcm9pZDp2YWx1ZT0iQHN0cmluZy90ZXN0X2NhdGVnb3J5X2F1ZGlvIiAvPgogICAgICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9InRlc3RfcmVxdWlyZWRfZmVhdHVyZXMiIGFuZHJvaWQ6dmFsdWU9ImFuZHJvaWQuaGFyZHdhcmUubWljcm9waG9uZSIgLz4KKyAgICAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJ0ZXN0X2V4Y2x1ZGVkX2ZlYXR1cmVzIiBhbmRyb2lkOnZhbHVlPSJhbmRyb2lkLnNvZnR3YXJlLmxlYW5iYWNrIiAvPgogICAgICAgICA8L2FjdGl2aXR5PgogCiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5hdWRpby5BdWRpb091dHB1dFJvdXRpbmdOb3RpZmljYXRpb25zQWN0aXZpdHkiCkBAIC0yODQ1LDcgKzMwMzcsOCBAQAogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9InRlc3RfY2F0ZWdvcnkiIGFuZHJvaWQ6dmFsdWU9IkBzdHJpbmcvdGVzdF9jYXRlZ29yeV9hdWRpbyIgLz4KICAgICAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJ0ZXN0X3JlcXVpcmVkX2ZlYXR1cmVzIiBhbmRyb2lkOnZhbHVlPSJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLm91dHB1dCIgLz4KLSAgICAgICAgICAgIDwvYWN0aXZpdHk+CisgICAgICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0idGVzdF9leGNsdWRlZF9mZWF0dXJlcyIgYW5kcm9pZDp2YWx1ZT0iYW5kcm9pZC5zb2Z0d2FyZS5sZWFuYmFjayIgLz4KKyAgICAgICAgPC9hY3Rpdml0eT4KIAogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuYXVkaW8uQXVkaW9JbnB1dFJvdXRpbmdOb3RpZmljYXRpb25zQWN0aXZpdHkiCiAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2F1ZGlvX2lucHV0X3JvdXRpbmdub3RpZmljYXRpb25zX3Rlc3QiPgpAQCAtMjg1NSw3ICszMDQ4LDggQEAKICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KICAgICAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJ0ZXN0X2NhdGVnb3J5IiBhbmRyb2lkOnZhbHVlPSJAc3RyaW5nL3Rlc3RfY2F0ZWdvcnlfYXVkaW8iIC8+CiAgICAgICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0idGVzdF9yZXF1aXJlZF9mZWF0dXJlcyIgYW5kcm9pZDp2YWx1ZT0iYW5kcm9pZC5oYXJkd2FyZS5taWNyb3Bob25lIiAvPgotICAgICAgICAgICAgPC9hY3Rpdml0eT4KKyAgICAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJ0ZXN0X2V4Y2x1ZGVkX2ZlYXR1cmVzIiBhbmRyb2lkOnZhbHVlPSJhbmRyb2lkLnNvZnR3YXJlLmxlYW5iYWNrIiAvPgorICAgICAgICA8L2FjdGl2aXR5PgogCiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5hdWRpby5VU0JBdWRpb1BlcmlwaGVyYWxBdHRyaWJ1dGVzQWN0aXZpdHkiCiAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2F1ZGlvX3VhcF9hdHRyaWJzX3Rlc3QiPgpAQCAtMjkxMiw4ICszMTA2LDcgQEAKICAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmN0cy5pbnRlbnQuY2F0ZWdvcnkuTUFOVUFMX1RFU1QiIC8+CiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0idGVzdF9jYXRlZ29yeSIgYW5kcm9pZDp2YWx1ZT0iQHN0cmluZy90ZXN0X2NhdGVnb3J5X2F1ZGlvIiAvPgotICAgICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9InRlc3RfcmVxdWlyZWRfZmVhdHVyZXMiIGFuZHJvaWQ6dmFsdWU9ImFuZHJvaWQuaGFyZHdhcmUubWljcm9waG9uZSIgLz4KLSAgICAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJ0ZXN0X3JlcXVpcmVkX2ZlYXR1cmVzIiBhbmRyb2lkOnZhbHVlPSJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLm91dHB1dCIgLz4KKyAgICAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJ0ZXN0X3JlcXVpcmVkX2ZlYXR1cmVzIiBhbmRyb2lkOnZhbHVlPSJhbmRyb2lkLmhhcmR3YXJlLm1pY3JvcGhvbmU6YW5kcm9pZC5oYXJkd2FyZS5hdWRpby5vdXRwdXQiIC8+CiAgICAgICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0idGVzdF9leGNsdWRlZF9mZWF0dXJlcyIKICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp2YWx1ZT0iYW5kcm9pZC5oYXJkd2FyZS50eXBlLndhdGNoOmFuZHJvaWQuaGFyZHdhcmUudHlwZS50ZWxldmlzaW9uIiAvPgogICAgICAgICA8L2FjdGl2aXR5PgpAQCAtMjkyNSw4ICszMTE4LDcgQEAKICAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmN0cy5pbnRlbnQuY2F0ZWdvcnkuTUFOVUFMX1RFU1QiIC8+CiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0idGVzdF9jYXRlZ29yeSIgYW5kcm9pZDp2YWx1ZT0iQHN0cmluZy90ZXN0X2NhdGVnb3J5X2F1ZGlvIiAvPgotICAgICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9InRlc3RfcmVxdWlyZWRfZmVhdHVyZXMiIGFuZHJvaWQ6dmFsdWU9ImFuZHJvaWQuaGFyZHdhcmUubWljcm9waG9uZSIgLz4KLSAgICAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJ0ZXN0X3JlcXVpcmVkX2ZlYXR1cmVzIiBhbmRyb2lkOnZhbHVlPSJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLm91dHB1dCIgLz4KKyAgICAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJ0ZXN0X3JlcXVpcmVkX2ZlYXR1cmVzIiBhbmRyb2lkOnZhbHVlPSJhbmRyb2lkLmhhcmR3YXJlLm1pY3JvcGhvbmU6YW5kcm9pZC5oYXJkd2FyZS5hdWRpby5vdXRwdXQiIC8+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAKICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLmF1ZGlvLkF1ZGlvRnJlcXVlbmN5U3BlYWtlckFjdGl2aXR5IgpAQCAtMjkzNiw4ICszMTI4LDcgQEAKICAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmN0cy5pbnRlbnQuY2F0ZWdvcnkuTUFOVUFMX1RFU1QiIC8+CiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0idGVzdF9jYXRlZ29yeSIgYW5kcm9pZDp2YWx1ZT0iQHN0cmluZy90ZXN0X2NhdGVnb3J5X2F1ZGlvIiAvPgotICAgICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9InRlc3RfcmVxdWlyZWRfZmVhdHVyZXMiIGFuZHJvaWQ6dmFsdWU9ImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8ub3V0cHV0IiAvPgotICAgICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9InRlc3RfcmVxdWlyZWRfZmVhdHVyZXMiIGFuZHJvaWQ6dmFsdWU9ImFuZHJvaWQuaGFyZHdhcmUudXNiLmhvc3QiIC8+CisgICAgICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0idGVzdF9yZXF1aXJlZF9mZWF0dXJlcyIgYW5kcm9pZDp2YWx1ZT0iYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5vdXRwdXQ6YW5kcm9pZC5oYXJkd2FyZS51c2IuaG9zdCIgLz4KICAgICAgICAgPC9hY3Rpdml0eT4KIAogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuYXVkaW8uQXVkaW9GcmVxdWVuY3lNaWNBY3Rpdml0eSIKQEAgLTI5NDcsOSArMzEzOCw3IEBACiAgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5jdHMuaW50ZW50LmNhdGVnb3J5Lk1BTlVBTF9URVNUIiAvPgogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9InRlc3RfY2F0ZWdvcnkiIGFuZHJvaWQ6dmFsdWU9IkBzdHJpbmcvdGVzdF9jYXRlZ29yeV9hdWRpbyIgLz4KLSAgICAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJ0ZXN0X3JlcXVpcmVkX2ZlYXR1cmVzIiBhbmRyb2lkOnZhbHVlPSJhbmRyb2lkLmhhcmR3YXJlLm1pY3JvcGhvbmUiIC8+Ci0gICAgICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0idGVzdF9yZXF1aXJlZF9mZWF0dXJlcyIgYW5kcm9pZDp2YWx1ZT0iYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5vdXRwdXQiIC8+Ci0gICAgICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0idGVzdF9yZXF1aXJlZF9mZWF0dXJlcyIgYW5kcm9pZDp2YWx1ZT0iYW5kcm9pZC5oYXJkd2FyZS51c2IuaG9zdCIgLz4KKyAgICAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJ0ZXN0X3JlcXVpcmVkX2ZlYXR1cmVzIiBhbmRyb2lkOnZhbHVlPSJhbmRyb2lkLmhhcmR3YXJlLm1pY3JvcGhvbmU6YW5kcm9pZC5oYXJkd2FyZS5hdWRpby5vdXRwdXQ6YW5kcm9pZC5oYXJkd2FyZS51c2IuaG9zdCIgLz4KICAgICAgICAgPC9hY3Rpdml0eT4KIAogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuYXVkaW8uQXVkaW9GcmVxdWVuY3lVbnByb2Nlc3NlZEFjdGl2aXR5IgpAQCAtMzMwMiw2ICszNDkxLDEyIEBACiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVsZWNvbS5Db25uZWN0aW9uU2VydmljZSIgLz4KICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KICAgICAgICAgPC9zZXJ2aWNlPgorICAgICAgICA8c2VydmljZSBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci50ZWxlY29tLkN0c1NlbGZNYW5hZ2VkQ29ubmVjdGlvblNlcnZpY2UiCisgICAgICAgICAgICBhbmRyb2lkOnBlcm1pc3Npb249ImFuZHJvaWQucGVybWlzc2lvbi5CSU5EX1RFTEVDT01fQ09OTkVDVElPTl9TRVJWSUNFIiA+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZWxlY29tLkNvbm5lY3Rpb25TZXJ2aWNlIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L3NlcnZpY2U+CiAgICAgPC9hcHBsaWNhdGlvbj4KIAogPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXIvY3JlYXRlX3Rlc3RfY2VydHMuc2ggYi9hcHBzL0N0c1ZlcmlmaWVyL2NyZWF0ZV90ZXN0X2NlcnRzLnNoCmluZGV4IGI1OTk3NGEuLjkzZmEzNzcgMTAwNzU1Ci0tLSBhL2FwcHMvQ3RzVmVyaWZpZXIvY3JlYXRlX3Rlc3RfY2VydHMuc2gKKysrIGIvYXBwcy9DdHNWZXJpZmllci9jcmVhdGVfdGVzdF9jZXJ0cy5zaApAQCAtMjAsMTEgKzIwLDE1IEBACiAnL089QW5kcm9pZCdcCiAnL0NOPWxvY2FsaG9zdCcKIFBBU1NXT1JEPSdhbmRyb2lkdGVzdCcKK1NBTj1cCisnRE5TOmxvY2FsaG9zdCcKIAogZWNobyAiQ3JlYXRpbmcgZGlyZWN0b3J5ICckQ0FfRElSJy4uLiIKIG1rZGlyIC1wICIkdG1wZGlyIi8iJENBX0RJUiIvbmV3Y2VydHMgXAogICAgICYmIGVjaG8gJzAxJyA+ICIkdG1wZGlyIi8iJENBX0RJUiIvc2VyaWFsIFwKICAgICAmJiB0b3VjaCAiJHRtcGRpciIvIiRDQV9ESVIiL2luZGV4LnR4dAorY2F0IC9ldGMvc3NsL29wZW5zc2wuY25mIDwocHJpbnRmICJcbltTQU5dXG5zdWJqZWN0QWx0TmFtZT0kU0FOIikgXAorICAgID4gIiR0bXBkaXIiL29wZW5zc2wuY29uZgogCiBlY2hvICJHZW5lcmF0aW5nIENBIGNlcnRpZmljYXRlLi4uIgogKGNkICIkdG1wZGlyIiBcCkBAIC01Miw2ICs1Niw4IEBACiAgICAgICAgIC1kYXlzIDM2NTAgXAogICAgICAgICAtb3V0ICd1c2Vya2V5LnJlcScgXAogICAgICAgICAtc3ViaiAiJFNVQkpFQ1QiIFwKKyAgICAgICAgLWV4dGVuc2lvbnMgU0FOIFwKKyAgICAgICAgLWNvbmZpZyBvcGVuc3NsLmNvbmYgXAogICAgICYmIG9wZW5zc2wgcGtjczggXAogICAgICAgICAtdG9wazggXAogICAgICAgICAtb3V0Zm9ybSBERVIgXApAQCAtNjgsNiArNzQsOCBAQAogICAgICAgICAta2V5ZmlsZSAnY2FrZXkucGVtJyBcCiAgICAgICAgIC1kYXlzIDM2NTAgXAogICAgICAgICAtcGFzc2luICdwYXNzOiciJFBBU1NXT1JEIiBcCisgICAgICAgIC1leHRlbnNpb25zIFNBTiBcCisgICAgICAgIC1jb25maWcgb3BlbnNzbC5jb25mIFwKICAgICAgICAgLWJhdGNoIFwKICAgICAmJiBvcGVuc3NsIHg1MDkgXAogICAgICAgICAtb3V0Zm9ybSBERVIgXApkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9qbmkvdmVyaWZpZXIvQW5kcm9pZC5tayBiL2FwcHMvQ3RzVmVyaWZpZXIvam5pL3ZlcmlmaWVyL0FuZHJvaWQubWsKaW5kZXggNDJlMmQyNi4uOWVlN2VlZSAxMDA2NDQKLS0tIGEvYXBwcy9DdHNWZXJpZmllci9qbmkvdmVyaWZpZXIvQW5kcm9pZC5taworKysgYi9hcHBzL0N0c1ZlcmlmaWVyL2puaS92ZXJpZmllci9BbmRyb2lkLm1rCkBAIC0yNywxMiArMjcsMTUgQEAKIAogTE9DQUxfQ19JTkNMVURFUyA6PSAkKEpOSV9IX0lOQ0xVREUpCiAKLUxPQ0FMX0NYWF9TVEwgOj0gbGliYysrX3N0YXRpYworTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorTE9DQUxfTkRLX1NUTF9WQVJJQU5UIDo9IHN5c3RlbQogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmxvZyBcCi0JCWxpYm5hdGl2ZWhlbHBlcl9jb21wYXRfbGliYysrCiAKLUxPQ0FMX0NGTEFHUyA6PSAtV25vLXVudXNlZC1wYXJhbWV0ZXIKK0xPQ0FMX0NGTEFHUyA6PSBcCisgICAgICAgIC1XYWxsIC1XZXJyb3IgXAorICAgICAgICAtV25vLXVudXNlZC1wYXJhbWV0ZXIgXAorICAgICAgICAtV25vLXVudXNlZC12YXJpYWJsZSBcCiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKIApkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9qbmkvdmVyaWZpZXIvY29tX2FuZHJvaWRfY3RzX3ZlcmlmaWVyX2NhbWVyYV9TdGF0c0ltYWdlLmNwcCBiL2FwcHMvQ3RzVmVyaWZpZXIvam5pL3ZlcmlmaWVyL2NvbV9hbmRyb2lkX2N0c192ZXJpZmllcl9jYW1lcmFfU3RhdHNJbWFnZS5jcHAKaW5kZXggYjdjOTZlMi4uNmM5NDhlYSAxMDA2NDQKLS0tIGEvYXBwcy9DdHNWZXJpZmllci9qbmkvdmVyaWZpZXIvY29tX2FuZHJvaWRfY3RzX3ZlcmlmaWVyX2NhbWVyYV9TdGF0c0ltYWdlLmNwcAorKysgYi9hcHBzL0N0c1ZlcmlmaWVyL2puaS92ZXJpZmllci9jb21fYW5kcm9pZF9jdHNfdmVyaWZpZXJfY2FtZXJhX1N0YXRzSW1hZ2UuY3BwCkBAIC0xNyw3ICsxNyw2IEBACiAjZGVmaW5lIExPR19UQUcgIklUUy1TdGF0c0ltYWdlLUpOSSIKIC8vICNkZWZpbmUgTE9HX05ERUJVRyAwCiAjaW5jbHVkZSA8YW5kcm9pZC9sb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgPGpuaS5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3Byb2d1YXJkLmZsYWdzIGIvYXBwcy9DdHNWZXJpZmllci9wcm9ndWFyZC5mbGFncwppbmRleCBlNDI0OWM0Li4yYmUxMjExIDEwMDY0NAotLS0gYS9hcHBzL0N0c1ZlcmlmaWVyL3Byb2d1YXJkLmZsYWdzCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvcHJvZ3VhcmQuZmxhZ3MKQEAgLTIwLDYgKzIwLDkgQEAKIAogLWtlZXBjbGFzc2Vzd2l0aG1lbWJlcnMgY2xhc3MgKiBleHRlbmRzIGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5sb2NhdGlvbi5Mb2NhdGlvbk1vZGVUZXN0QWN0aXZpdHkKIAorLWtlZXBjbGFzc2Vzd2l0aG1lbWJlcnMgY2xhc3MgKiBleHRlbmRzIGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5hdWRpby5IaWZpVWx0cmFzb3VuZFNwZWFrZXJUZXN0QWN0aXZpdHkKKy1rZWVwY2xhc3Nlc3dpdGhtZW1iZXJzIGNsYXNzICogZXh0ZW5kcyBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIuYXVkaW8uSGlmaVVsdHJhc291bmRUZXN0QWN0aXZpdHkKKwogIyBrZWVwIG1vY2tpdG8gbWV0aG9kcwogLWtlZXAgY2xhc3Mgb3JnLm1vY2tpdG8uKiogeyAqOyB9CiAta2VlcCBpbnRlcmZhY2Ugb3JnLm1vY2tpdG8uKiogeyAqOyB9CkBAIC0zOCw2ICs0MSw2IEBACiAtZG9udHdhcm4gY29tLmFuZHJvaWQub3JnLmJvdW5jeWNhc3RsZS4qKgogLWRvbnR3YXJuIGNvbS5hbmRyb2lkLm9raHR0cC4qKgogLWRvbnR3YXJuIG9yZy5vcGVuY3YuKioKLS1kb250d2FybiBhbmRyb2lkLnN1cHBvcnQudGVzdC5pbnRlcm5hbC5ydW5uZXIuaGlkZGVuLkV4cG9zZWRJbnN0cnVtZW50YXRpb25BcGkKKy1kb250d2FybiBhbmRyb2lkeC50ZXN0LmludGVybmFsLnJ1bm5lci5oaWRkZW4uRXhwb3NlZEluc3RydW1lbnRhdGlvbkFwaQogCiAtZG9udHdhcm4gamF2YS5sYW5nLm1hbmFnZW1lbnQuKioKZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXIvcmVzL2xheW91dC1sYW5kL2duc3NfZW1lcmdlbmN5X3Rlc3QueG1sIGIvYXBwcy9DdHNWZXJpZmllci9yZXMvbGF5b3V0LWxhbmQvZ25zc19lbWVyZ2VuY3lfdGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYzZjI5ZAotLS0gL2Rldi9udWxsCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvcmVzL2xheW91dC1sYW5kL2duc3NfZW1lcmdlbmN5X3Rlc3QueG1sCkBAIC0wLDAgKzEsNTkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLkJveEluc2V0TGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczphcHA9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMtYXV0byIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ij4KKyAgICA8TGluZWFyTGF5b3V0IGFwcDpjdHN2X2xheW91dF9ib3g9ImFsbCIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICA+CisKKyAgICAgICAgPExpbmVhckxheW91dAorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSI+CisKKyAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RleHQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTRzcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ii8+CisKKyAgICAgICAgICAgIDxTY3JvbGxWaWV3CisgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9sb2dfc2Nyb2xsX3ZpZXciCisgICAgICAgICAgICAgICAgYW5kcm9pZDpmaWxsVmlld3BvcnQ9InRydWUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiPgorCisgICAgICAgICAgICAgICAgPExpbmVhckxheW91dAorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2xvZ19sYXlvdXQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIvPgorICAgICAgICAgICAgPC9TY3JvbGxWaWV3PgorCisgICAgICAgIDwvTGluZWFyTGF5b3V0PgorICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL25leHRfYnV0dG9uIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL25leHRfYnV0dG9uX3RleHQiIC8+CisgICAgICAgIDxpbmNsdWRlIGxheW91dD0iQGxheW91dC9wYXNzX2ZhaWxfYnV0dG9ucyIgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKzwvY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLkJveEluc2V0TGF5b3V0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXIvcmVzL2xheW91dC1wb3J0L2duc3NfZW1lcmdlbmN5X3Rlc3QueG1sIGIvYXBwcy9DdHNWZXJpZmllci9yZXMvbGF5b3V0LXBvcnQvZ25zc19lbWVyZ2VuY3lfdGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIyM2EzMgotLS0gL2Rldi9udWxsCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvcmVzL2xheW91dC1wb3J0L2duc3NfZW1lcmdlbmN5X3Rlc3QueG1sCkBAIC0wLDAgKzEsNTAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBzdHlsZT0iQHN0eWxlL1Jvb3RMYXlvdXRQYWRkaW5nIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGV4dCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE0c3AiIC8+CisKKyAgICA8U2Nyb2xsVmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2xvZ19zY3JvbGxfdmlldyIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgYW5kcm9pZDpmaWxsVmlld3BvcnQ9InRydWUiPgorCisgICAgICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbG9nX2xheW91dCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIiAvPgorCisgICAgPC9TY3JvbGxWaWV3PgorCisgICAgPEJ1dHRvbgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL25leHRfYnV0dG9uIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL25leHRfYnV0dG9uX3RleHQiIC8+CisgICAgPGluY2x1ZGUgbGF5b3V0PSJAbGF5b3V0L3Bhc3NfZmFpbF9idXR0b25zIiAvPgorCis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXIvcmVzL2xheW91dC1yb3VuZC9wcm92aXNpb25pbmdfYnlvZC54bWwgYi9hcHBzL0N0c1ZlcmlmaWVyL3Jlcy9sYXlvdXQtcm91bmQvcHJvdmlzaW9uaW5nX2J5b2QueG1sCmluZGV4IGQyYjZlMGUuLmNlZTI2NTQgMTAwNjQ0Ci0tLSBhL2FwcHMvQ3RzVmVyaWZpZXIvcmVzL2xheW91dC1yb3VuZC9wcm92aXNpb25pbmdfYnlvZC54bWwKKysrIGIvYXBwcy9DdHNWZXJpZmllci9yZXMvbGF5b3V0LXJvdW5kL3Byb3Zpc2lvbmluZ19ieW9kLnhtbApAQCAtMTIsNyArMTIsNyBAQAogICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08YW5kcm9pZC5zdXBwb3J0LnY0LndpZGdldC5OZXN0ZWRTY3JvbGxWaWV3IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKzxhbmRyb2lkeC5jb3JlLndpZGdldC5OZXN0ZWRTY3JvbGxWaWV3IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKICAgICBhbmRyb2lkOmlkPSJAK2lkL21haW5fbGF5b3V0IgogICAgIHN0eWxlPSJAc3R5bGUvUm9vdExheW91dFBhZGRpbmciCiAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKQEAgLTM5LDQgKzM5LDQgQEAKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMyIvPgogICAgICAgICA8aW5jbHVkZSBsYXlvdXQ9IkBsYXlvdXQvcGFzc19mYWlsX2J1dHRvbnMiLz4KICAgICA8L0xpbmVhckxheW91dD4KLTwvYW5kcm9pZC5zdXBwb3J0LnY0LndpZGdldC5OZXN0ZWRTY3JvbGxWaWV3PgorPC9hbmRyb2lkeC5jb3JlLndpZGdldC5OZXN0ZWRTY3JvbGxWaWV3PgpkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9yZXMvbGF5b3V0LXNtYWxsLWRwYWQvcG9zaXRpdmVfZGV2aWNlX293bmVyLnhtbCBiL2FwcHMvQ3RzVmVyaWZpZXIvcmVzL2xheW91dC1zbWFsbC1kcGFkL3Bvc2l0aXZlX2RldmljZV9vd25lci54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YjkyNmIuLjAwMDAwMDAKLS0tIGEvYXBwcy9DdHNWZXJpZmllci9yZXMvbGF5b3V0LXNtYWxsLWRwYWQvcG9zaXRpdmVfZGV2aWNlX293bmVyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgc3R5bGU9IkBzdHlsZS9Sb290TGF5b3V0UGFkZGluZyIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KLQotICAgIDxTY3JvbGxWaWV3Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgICAgICBhbmRyb2lkOmZpbGxWaWV3cG9ydD0idHJ1ZSI+Ci0gICAgICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KLQotICAgICAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9wb3NpdGl2ZV9kZXZpY2Vfb3duZXJfaW5zdHJ1Y3Rpb25zIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2RldmljZV9vd25lcl9wb3NpdGl2ZV90ZXN0c19pbnN0cnVjdGlvbnMiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMThkaXAiIC8+Ci0KLSAgICAgICAgICAgIDxCdXR0b24KLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2NoZWNrX3ByZWNvbmRpdGlvbnMiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvZGV2aWNlX293bmVyX3ByZWNvbmRpdGlvbl9idXR0b25fbGFiZWwiIC8+Ci0KLSAgICAgICAgICAgIDxCdXR0b24KLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3NldF9kZXZpY2Vfb3duZXJfYnV0dG9uIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3NldF9kZXZpY2Vfb3duZXJfYnV0dG9uX2xhYmVsIiAvPgotCi0gICAgICAgICAgICA8TGlzdFZpZXcKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FuZHJvaWQ6bGlzdCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iOTUwZHAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIiAvPgotCi0gICAgICAgICAgICA8aW5jbHVkZSBsYXlvdXQ9IkBsYXlvdXQvcGFzc19mYWlsX2J1dHRvbnMiIC8+Ci0gICAgICAgIDwvTGluZWFyTGF5b3V0PgotICAgIDwvU2Nyb2xsVmlldz4KLTwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9yZXMvbGF5b3V0LXNtYWxsL2duc3NfZW1lcmdlbmN5X3Rlc3QueG1sIGIvYXBwcy9DdHNWZXJpZmllci9yZXMvbGF5b3V0LXNtYWxsL2duc3NfZW1lcmdlbmN5X3Rlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiZDQ4ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9hcHBzL0N0c1ZlcmlmaWVyL3Jlcy9sYXlvdXQtc21hbGwvZ25zc19lbWVyZ2VuY3lfdGVzdC54bWwKQEAgLTAsMCArMSw1MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHN0eWxlPSJAc3R5bGUvUm9vdExheW91dFBhZGRpbmciCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCI+CisgICAgPFNjcm9sbFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9sb2dfc2Nyb2xsX3ZpZXciCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmZpbGxWaWV3cG9ydD0idHJ1ZSI+CisgICAgICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KKworICAgICAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90ZXh0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTRzcCIgLz4KKworICAgICAgICAgICAgPExpbmVhckxheW91dAorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbG9nX2xheW91dCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIiAvPgorCisgICAgICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9uZXh0X2J1dHRvbiIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9uZXh0X2J1dHRvbl90ZXh0IiAvPgorICAgICAgICAgICAgPGluY2x1ZGUgbGF5b3V0PSJAbGF5b3V0L3Bhc3NfZmFpbF9idXR0b25zIiAvPgorICAgICAgICA8L0xpbmVhckxheW91dD4KKworICAgIDwvU2Nyb2xsVmlldz4KKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9yZXMvbGF5b3V0LXNtYWxsL3Bvc2l0aXZlX2RldmljZV9vd25lci54bWwgYi9hcHBzL0N0c1ZlcmlmaWVyL3Jlcy9sYXlvdXQtc21hbGwvcG9zaXRpdmVfZGV2aWNlX293bmVyLnhtbAppbmRleCBlODU1M2Q4Li44MmYxMWEyIDEwMDY0NAotLS0gYS9hcHBzL0N0c1ZlcmlmaWVyL3Jlcy9sYXlvdXQtc21hbGwvcG9zaXRpdmVfZGV2aWNlX293bmVyLnhtbAorKysgYi9hcHBzL0N0c1ZlcmlmaWVyL3Jlcy9sYXlvdXQtc21hbGwvcG9zaXRpdmVfZGV2aWNlX293bmVyLnhtbApAQCAtMzQsMTIgKzM0LDYgQEAKICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxNmRpcCIgLz4KIAogICAgICAgICAgICAgPEJ1dHRvbgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2hlY2tfcHJlY29uZGl0aW9ucyIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9kZXZpY2Vfb3duZXJfcHJlY29uZGl0aW9uX2J1dHRvbl9sYWJlbCIgLz4KLQotICAgICAgICAgICAgPEJ1dHRvbgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc2V0X2RldmljZV9vd25lcl9idXR0b24iCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXIvcmVzL2xheW91dC1zbWFsbC9wb3NpdGl2ZV9tYW5hZ2VkX3VzZXIueG1sIGIvYXBwcy9DdHNWZXJpZmllci9yZXMvbGF5b3V0LXNtYWxsL3Bvc2l0aXZlX21hbmFnZWRfdXNlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRmYTM2MwotLS0gL2Rldi9udWxsCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvcmVzL2xheW91dC1zbWFsbC9wb3NpdGl2ZV9tYW5hZ2VkX3VzZXIueG1sCkBAIC0wLDAgKzEsNDUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBzdHlsZT0iQHN0eWxlL1Jvb3RMYXlvdXRQYWRkaW5nIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgorCisgICAgPFNjcm9sbFZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiPgorICAgICAgICA8TGluZWFyTGF5b3V0CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+CisKKyAgICAgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvcG9zaXRpdmVfbWFuYWdlZF91c2VyX2luc3RydWN0aW9ucyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9tYW5hZ2VkX3VzZXJfcG9zaXRpdmVfdGVzdHNfaW5zdHJ1Y3Rpb25zIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE2ZGlwIiAvPgorCisgICAgICAgICAgICA8TGlzdFZpZXcKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FuZHJvaWQ6bGlzdCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iODAwZGlwIiAvPgorCisgICAgICAgICAgICA8aW5jbHVkZSBsYXlvdXQ9IkBsYXlvdXQvcGFzc19mYWlsX2J1dHRvbnMiIC8+CisgICAgICAgIDwvTGluZWFyTGF5b3V0PgorICAgIDwvU2Nyb2xsVmlldz4KKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9yZXMvbGF5b3V0LXdhdGNoL3Byb3Zpc2lvbmluZ19ieW9kLnhtbCBiL2FwcHMvQ3RzVmVyaWZpZXIvcmVzL2xheW91dC13YXRjaC9wcm92aXNpb25pbmdfYnlvZC54bWwKaW5kZXggNzVjYzkwYS4uZWExZDJkYiAxMDA2NDQKLS0tIGEvYXBwcy9DdHNWZXJpZmllci9yZXMvbGF5b3V0LXdhdGNoL3Byb3Zpc2lvbmluZ19ieW9kLnhtbAorKysgYi9hcHBzL0N0c1ZlcmlmaWVyL3Jlcy9sYXlvdXQtd2F0Y2gvcHJvdmlzaW9uaW5nX2J5b2QueG1sCkBAIC0xMyw3ICsxMyw3IEBACiAgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxhbmRyb2lkLnN1cHBvcnQudjQud2lkZ2V0Lk5lc3RlZFNjcm9sbFZpZXcgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorPGFuZHJvaWR4LmNvcmUud2lkZ2V0Lk5lc3RlZFNjcm9sbFZpZXcgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgogICAgIHN0eWxlPSJAc3R5bGUvUm9vdExheW91dFBhZGRpbmciCiAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCI+CkBAIC00MSw0ICs0MSw0IEBACiAKICAgICAgICAgPGluY2x1ZGUgbGF5b3V0PSJAbGF5b3V0L3Bhc3NfZmFpbF9idXR0b25zIi8+CiAgICAgPC9MaW5lYXJMYXlvdXQ+Ci08L2FuZHJvaWQuc3VwcG9ydC52NC53aWRnZXQuTmVzdGVkU2Nyb2xsVmlldz4KKzwvYW5kcm9pZHguY29yZS53aWRnZXQuTmVzdGVkU2Nyb2xsVmlldz4KZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXIvcmVzL2xheW91dC13YXRjaC9yZXF1ZXN0aW5nX2J1Z3JlcG9ydF9kZXZpY2Vfb3duZXIueG1sIGIvYXBwcy9DdHNWZXJpZmllci9yZXMvbGF5b3V0LXdhdGNoL3JlcXVlc3RpbmdfYnVncmVwb3J0X2RldmljZV9vd25lci54bWwKaW5kZXggNGY5ZmZkNi4uOGFlYmJlNiAxMDA2NDQKLS0tIGEvYXBwcy9DdHNWZXJpZmllci9yZXMvbGF5b3V0LXdhdGNoL3JlcXVlc3RpbmdfYnVncmVwb3J0X2RldmljZV9vd25lci54bWwKKysrIGIvYXBwcy9DdHNWZXJpZmllci9yZXMvbGF5b3V0LXdhdGNoL3JlcXVlc3RpbmdfYnVncmVwb3J0X2RldmljZV9vd25lci54bWwKQEAgLTMxLDExICszMSw2IEBACiAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxOGRpcCIvPgogCiAgICAgICAgIDxCdXR0b24KLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2hlY2tfcHJlY29uZGl0aW9ucyIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9kZXZpY2Vfb3duZXJfcHJlY29uZGl0aW9uX2J1dHRvbl9sYWJlbCIvPgotICAgICAgICA8QnV0dG9uCiAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3NldF9kZXZpY2Vfb3duZXJfYnV0dG9uIgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgpkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9yZXMvbGF5b3V0L2J0X2hpZF9kZXZpY2UueG1sIGIvYXBwcy9DdHNWZXJpZmllci9yZXMvbGF5b3V0L2J0X2hpZF9kZXZpY2UueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3OGZjMGUKLS0tIC9kZXYvbnVsbAorKysgYi9hcHBzL0N0c1ZlcmlmaWVyL3Jlcy9sYXlvdXQvYnRfaGlkX2RldmljZS54bWwKQEAgLTAsMCArMSw3MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPFNjcm9sbFZpZXcgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiPgorCis8TGluZWFyTGF5b3V0CisgICAgc3R5bGU9IkBzdHlsZS9Sb290TGF5b3V0UGFkZGluZyIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KKworICA8VGV4dFZpZXcKKyAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idF9oaWRfZGV2aWNlX3JlZ2lzdGVyIiAvPgorCisgIDxCdXR0b24KKyAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYnRfaGlkX2RldmljZV9yZWdpc3Rlcl9idXR0b24iCisgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnRfaGlkX2RldmljZV9yZWdpc3RlciIgLz4KKworICA8QnV0dG9uCisgICAgICBhbmRyb2lkOmlkPSJAK2lkL2J0X2hpZF9kZXZpY2VfZGlzY292ZXJhYmxlX2J1dHRvbiIKKyAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idF9tYWtlX2Rpc2NvdmVyYWJsZSIgLz4KKworICA8QnV0dG9uCisgICAgICBhbmRyb2lkOmlkPSJAK2lkL2J0X2hpZF9kZXZpY2Vfc2VuZF9yZXBvcnRfYnV0dG9uIgorICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J0X2hpZF9kZXZpY2Vfc2VuZF9yZXBvcnQiIC8+CisKKyAgPEJ1dHRvbgorICAgICAgYW5kcm9pZDppZD0iQCtpZC9idF9oaWRfZGV2aWNlX3JlcGx5X3JlcG9ydF9idXR0b24iCisgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnRfaGlkX2RldmljZV9yZXBseV9yZXBvcnQiIC8+CisKKyAgPEJ1dHRvbgorICAgICAgYW5kcm9pZDppZD0iQCtpZC9idF9oaWRfZGV2aWNlX3JlcG9ydF9lcnJvcl9idXR0b24iCisgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnRfaGlkX2RldmljZV9yZXBvcnRfZXJyb3IiIC8+CisKKyAgPEJ1dHRvbgorICAgICAgYW5kcm9pZDppZD0iQCtpZC9idF9oaWRfZGV2aWNlX3VucmVnaXN0ZXJfYnV0dG9uIgorICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J0X2hpZF9kZXZpY2VfdW5yZWdpc3RlciIgLz4KKworICA8aW5jbHVkZSBsYXlvdXQ9IkBsYXlvdXQvcGFzc19mYWlsX2J1dHRvbnMiIC8+Cis8L0xpbmVhckxheW91dD4KKworPC9TY3JvbGxWaWV3PgpkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9yZXMvbGF5b3V0L2J0X2hpZF9ob3N0LnhtbCBiL2FwcHMvQ3RzVmVyaWZpZXIvcmVzL2xheW91dC9idF9oaWRfaG9zdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM4ZjYyNwotLS0gL2Rldi9udWxsCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvcmVzL2xheW91dC9idF9oaWRfaG9zdC54bWwKQEAgLTAsMCArMSwzNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgc3R5bGU9IkBzdHlsZS9Sb290TGF5b3V0UGFkZGluZyIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KKworICA8QnV0dG9uCisgICAgICBhbmRyb2lkOmlkPSJAK2lkL2J0X2hpZF9ob3N0X3BpY2tfZGV2aWNlX2J1dHRvbiIKKyAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idF9oaWRfaG9zdF9zZWxlY3RfZGV2aWNlIiAvPgorCisgIDxFZGl0VGV4dAorICAgICAgYW5kcm9pZDppZD0iQCtpZC9idF9oaWRfaG9zdF9lZGl0X3RleHQiCisgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI2MGRwIiAvPgorCisgIDxpbmNsdWRlIGxheW91dD0iQGxheW91dC9wYXNzX2ZhaWxfYnV0dG9ucyIgLz4KKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9yZXMvbGF5b3V0L2NhbWVyYV9mb3ZfY2FsaWJyYXRpb25fcGhvdG9fY2FwdHVyZS54bWwgYi9hcHBzL0N0c1ZlcmlmaWVyL3Jlcy9sYXlvdXQvY2FtZXJhX2Zvdl9jYWxpYnJhdGlvbl9waG90b19jYXB0dXJlLnhtbAppbmRleCA3ZjhlZmEwLi5jMTQyYjE1IDEwMDY0NAotLS0gYS9hcHBzL0N0c1ZlcmlmaWVyL3Jlcy9sYXlvdXQvY2FtZXJhX2Zvdl9jYWxpYnJhdGlvbl9waG90b19jYXB0dXJlLnhtbAorKysgYi9hcHBzL0N0c1ZlcmlmaWVyL3Jlcy9sYXlvdXQvY2FtZXJhX2Zvdl9jYWxpYnJhdGlvbl9waG90b19jYXB0dXJlLnhtbApAQCAtNDksNyArNDksNiBAQAogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRCb3R0b209InRydWUiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudExlZnQ9InRydWUiCiAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmc9IjEwc3AiCi0gICAgICAgICAgICBhbmRyb2lkOnBvcHVwQmFja2dyb3VuZD0iI2ZmZmZmZiIKICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE4c3AiIC8+CiAgICAgPC9SZWxhdGl2ZUxheW91dD4KIApkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9yZXMvbGF5b3V0L2NhbWVyYV92aWRlby54bWwgYi9hcHBzL0N0c1ZlcmlmaWVyL3Jlcy9sYXlvdXQvY2FtZXJhX3ZpZGVvLnhtbAppbmRleCBiODE3MjFiLi41ZGQyOGFiIDEwMDY0NAotLS0gYS9hcHBzL0N0c1ZlcmlmaWVyL3Jlcy9sYXlvdXQvY2FtZXJhX3ZpZGVvLnhtbAorKysgYi9hcHBzL0N0c1ZlcmlmaWVyL3Jlcy9sYXlvdXQvY2FtZXJhX3ZpZGVvLnhtbApAQCAtODUsMTkgKzg1LDM5IEBACiAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9yZXNvbHV0aW9uX3NlbGVjdGlvbiIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiLz4KLSAgICAgICAgICAgIDxCdXR0b24KLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3JlY29yZF9idXR0b24iCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvcmVjb3JkX2J1dHRvbl90ZXh0Ii8+Ci0gICAgICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3N0YXR1c19sYWJlbCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9zdGF0dXNfcmVhZHkiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nPSIyZHAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTZzcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIgLz4KKworICAgICAgICAgICAgPExpbmVhckxheW91dAorICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiID4KKworICAgICAgICAgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9yZWNvcmRfYnV0dG9uIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3JlY29yZF9idXR0b25fdGV4dCIvPgorICAgICAgICAgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9uZXh0X2J1dHRvbiIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9jZl9uZXh0X2J1dHRvbiIgLz4KKyAgICAgICAgICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgICAgICAgICA8TGluZWFyTGF5b3V0CisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjIiID4KKworICAgICAgICAgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3N0YXR1c19sYWJlbCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9zdGF0dXNfcmVhZHkiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZz0iMmRwIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxNnNwIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIgLz4KKyAgICAgICAgICAgIDwvTGluZWFyTGF5b3V0PgogCiAgICAgICAgIDwvTGluZWFyTGF5b3V0PgogCmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3Jlcy9sYXlvdXQvY2ZfbWFpbi54bWwgYi9hcHBzL0N0c1ZlcmlmaWVyL3Jlcy9sYXlvdXQvY2ZfbWFpbi54bWwKaW5kZXggMWZmMzVjYy4uOGE0ZmI3ZiAxMDA2NDQKLS0tIGEvYXBwcy9DdHNWZXJpZmllci9yZXMvbGF5b3V0L2NmX21haW4ueG1sCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvcmVzL2xheW91dC9jZl9tYWluLnhtbApAQCAtODcsNiArODcsMTEgQEAKICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2Zvcm1hdF9zZWxlY3Rpb24iCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ii8+CisgICAgICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9uZXh0X2J1dHRvbiIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9jZl9uZXh0X2J1dHRvbiIgLz4KIAogICAgICAgICA8L0xpbmVhckxheW91dD4KIApkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9yZXMvbGF5b3V0L2RldmljZV9vd25lcl9sb2NrX3Rhc2tfdWkueG1sIGIvYXBwcy9DdHNWZXJpZmllci9yZXMvbGF5b3V0L2RldmljZV9vd25lcl9sb2NrX3Rhc2tfdWkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZGVlMWEKLS0tIC9kZXYvbnVsbAorKysgYi9hcHBzL0N0c1ZlcmlmaWVyL3Jlcy9sYXlvdXQvZGV2aWNlX293bmVyX2xvY2tfdGFza191aS54bWwKQEAgLTAsMCArMSw1MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL1Jvb3RMYXlvdXRQYWRkaW5nIgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgorCisgICAgPFNjcm9sbFZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6ZmlsbFZpZXdwb3J0PSJ0cnVlIj4KKyAgICAgICAgPExpbmVhckxheW91dAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgorCisgICAgICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2RldmljZV9vd25lcl9sb2NrX3Rhc2tfdWlfaW5zdHJ1Y3Rpb25zIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2RldmljZV9vd25lcl9sb2NrX3Rhc2tfdWlfdGVzdF9pbmZvIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE4ZGlwIiAvPgorCisgICAgICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zdGFydF9sb2NrX3Rhc2tfYnV0dG9uIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3N0YXJ0X2xvY2tfdGFza19idXR0b25fbGFiZWwiIC8+CisKKyAgICAgICAgICAgIDxMaXN0VmlldworICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYW5kcm9pZDpsaXN0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIiAvPgorCisgICAgICAgICAgICA8aW5jbHVkZSBsYXlvdXQ9IkBsYXlvdXQvcGFzc19mYWlsX2J1dHRvbnMiIC8+CisgICAgICAgIDwvTGluZWFyTGF5b3V0PgorICAgIDwvU2Nyb2xsVmlldz4KKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9yZXMvbGF5b3V0L2VtZXJnZW5jeV9jYWxsX2NvbmZpcm1fZGlhbG9nLnhtbCBiL2FwcHMvQ3RzVmVyaWZpZXIvcmVzL2xheW91dC9lbWVyZ2VuY3lfY2FsbF9jb25maXJtX2RpYWxvZy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFlNTE2NwotLS0gL2Rldi9udWxsCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvcmVzL2xheW91dC9lbWVyZ2VuY3lfY2FsbF9jb25maXJtX2RpYWxvZy54bWwKQEAgLTAsMCArMSwzMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKyAgICA8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICBzdHlsZT0iQHN0eWxlL1Jvb3RMYXlvdXRQYWRkaW5nIj4KKworICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9pbmZvIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMThzcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZz0iNWRwIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2VtZXJnZW5jeV9jYWxsX2NvbmZpcm1faW5mbyIvPgorICAgICAgICA8RWRpdFRleHQKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZW1lcmdlbmN5X251bWJlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6aGludD0iQHN0cmluZy9lbWVyZ2VuY3lfY2FsbF9lbWVyZ2VuY3lfbnVtYmVyX2hpbnRfdGV4dCIKKyAgICAgICAgICAgIGFuZHJvaWQ6aW5wdXRUeXBlPSJwaG9uZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9lbWVyZ2VuY3lfY2FsbF9lbWVyZ2VuY3lfbnVtYmVyX3RleHQiLz4KKyAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9kaWFsX2J1dHRvbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIyMDBweCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2VtZXJnZW5jeV9jYWxsX2RpYWxfdGV4dCIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjVkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI1ZHAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjVkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI1ZHAiLz4KKyAgICA8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXIvcmVzL2xheW91dC9lbWVyZ2VuY3lfY2FsbF9tc2dfdGVzdF9jb25maXJtX2RpYWxvZy54bWwgYi9hcHBzL0N0c1ZlcmlmaWVyL3Jlcy9sYXlvdXQvZW1lcmdlbmN5X2NhbGxfbXNnX3Rlc3RfY29uZmlybV9kaWFsb2cueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3MWUyYmYKLS0tIC9kZXYvbnVsbAorKysgYi9hcHBzL0N0c1ZlcmlmaWVyL3Jlcy9sYXlvdXQvZW1lcmdlbmN5X2NhbGxfbXNnX3Rlc3RfY29uZmlybV9kaWFsb2cueG1sCkBAIC0wLDAgKzEsMzcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+CisgICAgPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgc3R5bGU9IkBzdHlsZS9Sb290TGF5b3V0UGFkZGluZyI+CisKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvaW5mbyIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE4c3AiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmc9IjVkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9lbWVyZ2VuY3lfY2FsbF9jb25maXJtX2luZm8iLz4KKyAgICAgICAgPEVkaXRUZXh0CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2VtZXJnZW5jeV9udW1iZXIiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmhpbnQ9IkBzdHJpbmcvZW1lcmdlbmN5X2NhbGxfZW1lcmdlbmN5X251bWJlcl9oaW50X3RleHQiCisgICAgICAgICAgICBhbmRyb2lkOmlucHV0VHlwZT0icGhvbmUiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvZW1lcmdlbmN5X2NhbGxfZW1lcmdlbmN5X251bWJlcl90ZXh0Ii8+CisgICAgICAgIDxFZGl0VGV4dAorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9sb2NhbF9waG9uZV9udW1iZXIiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmhpbnQ9IkBzdHJpbmcvZW1lcmdlbmN5X2NhbGxfY3VycmVudF9udW1iZXJfaGludF90ZXh0IgorICAgICAgICAgICAgYW5kcm9pZDppbnB1dFR5cGU9InBob25lIi8+CisgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZGlhbF9idXR0b24iCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMjAwcHgiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9lbWVyZ2VuY3lfY2FsbF9kaWFsX3RleHQiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI1ZHAiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iNWRwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI1ZHAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iNWRwIi8+CisgICAgPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3Jlcy9sYXlvdXQva2V5Y2hhaW5fdGVzdC54bWwgYi9hcHBzL0N0c1ZlcmlmaWVyL3Jlcy9sYXlvdXQva2V5Y2hhaW5fdGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk3MDhjNwotLS0gL2Rldi9udWxsCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvcmVzL2xheW91dC9rZXljaGFpbl90ZXN0LnhtbApAQCAtMCwwICsxLDYyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCI+CisKKyAgICA8U2Nyb2xsVmlldworICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMzIwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIyIj4KKyAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9wcm92aXNpb25pbmdfYnlvZF9rZXljaGFpbl9pbnN0cnVjdGlvbnMiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmc9IjEwZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9wcm92aXNpb25pbmdfYnlvZF9rZXljaGFpbl9pbmZvX3N0YXJ0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE4ZGlwIiAvPgorICAgIDwvU2Nyb2xsVmlldz4KKworICAgIDxUZXh0VmlldworICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvcHJvdmlzaW9uaW5nX2J5b2Rfa2V5Y2hhaW5fdGVzdF9sb2ciCisgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICBhbmRyb2lkOnBhZGRpbmc9IjEwZGlwIgorICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE4ZGlwIiAvPgorCisgICAgPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIj4KKworICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3ByZXBhcmVfdGVzdF9idXR0b24iCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMjA0ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvcHJvdmlzaW9uaW5nX2J5b2Rfa2V5Z3VhcmRfZGlzYWJsZWRfZmVhdHVyZXNfcHJlcGFyZV9idXR0b24iLz4KKworICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3J1bl90ZXN0X2J1dHRvbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIyMDRkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9nb19idXR0b25fdGV4dCIvPgorCisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICA8aW5jbHVkZSBsYXlvdXQ9IkBsYXlvdXQvcGFzc19mYWlsX2J1dHRvbnMiIC8+CisKKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9yZXMvbGF5b3V0L2xvY2F0aW9uX21vZGVfaXRlbS54bWwgYi9hcHBzL0N0c1ZlcmlmaWVyL3Jlcy9sYXlvdXQvbG9jYXRpb25fbW9kZV9pdGVtLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU4ZGVkYi4uMDAwMDAwMAotLS0gYS9hcHBzL0N0c1ZlcmlmaWVyL3Jlcy9sYXlvdXQvbG9jYXRpb25fbW9kZV9pdGVtLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tCi0gICAgIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08UmVsYXRpdmVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiID4KLQotICAgIDxJbWFnZVZpZXcKLSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zdGF0dXMiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudExlZnQ9InRydWUiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50VG9wPSJ0cnVlIgotICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjEwZGlwIgotICAgICAgICBhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbj0iQHN0cmluZy9wYXNzX2J1dHRvbl90ZXh0IgotICAgICAgICBhbmRyb2lkOnBhZGRpbmc9IjEwZGlwIgotICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ZzX2luZGV0ZXJtaW5hdGUiIC8+Ci0KLSAgICA8VGV4dFZpZXcKLSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9pbnN0cnVjdGlvbnMiCi0gICAgICAgIHN0eWxlPSJAc3R5bGUvSW5zdHJ1Y3Rpb25zU21hbGxGb250IgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRSaWdodD0idHJ1ZSIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRUb3A9InRydWUiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3RvUmlnaHRPZj0iQGlkL3N0YXR1cyIKLSAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2xvY2F0aW9uX21vZGVfc2VsZWN0X2hpZ2hfYWNjdXJhY3kiIC8+Ci0KLSAgICA8QnV0dG9uCi0gICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbGF1bmNoX3NldHRpbmdzIgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRSaWdodD0idHJ1ZSIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC9pbnN0cnVjdGlvbnMiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjIwZGlwIgotICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iMjBkaXAiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3RvUmlnaHRPZj0iQGlkL3N0YXR1cyIKLSAgICAgICAgYW5kcm9pZDpvbkNsaWNrPSJsYXVuY2hTZXR0aW5ncyIKLSAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2xvY2F0aW9uX21vZGVfc3RhcnRfc2V0dGluZ3MiIC8+Ci0KLTwvUmVsYXRpdmVMYXlvdXQ+CmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3Jlcy9sYXlvdXQvbXVsdGluZXR3b3JrX2Nvbm5lY3Rpdml0eS54bWwgYi9hcHBzL0N0c1ZlcmlmaWVyL3Jlcy9sYXlvdXQvbXVsdGluZXR3b3JrX2Nvbm5lY3Rpdml0eS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgxZDA0YgotLS0gL2Rldi9udWxsCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvcmVzL2xheW91dC9tdWx0aW5ldHdvcmtfY29ubmVjdGl2aXR5LnhtbApAQCAtMCwwICsxLDgyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPFJlbGF0aXZlTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvUm9vdExheW91dFBhZGRpbmciPgorCisgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGVzdF9wcmVyZXF1aXNpdGVzIgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL211bHRpbmV0d29ya19jb25uZWN0aXZpdHlfdGVzdF9wcmVfcmVxdWlzaXRlcyIKKyAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9JbnN0cnVjdGlvbnNTbWFsbEZvbnQiCisgICAgLz4KKyAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90ZXN0X2FwX2xhYmVsIgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC90ZXN0X3ByZXJlcXVpc2l0ZXMiCisgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9tdWx0aW5ldHdvcmtfY29ubmVjdGl2aXR5X3Rlc3RfYXBfbmFtZSIKKyAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9JbnN0cnVjdGlvbnNTbWFsbEZvbnQiCisgICAgLz4KKyAgICA8RWRpdFRleHQgYW5kcm9pZDppZD0iQCtpZC90ZXN0X2FwX3NzaWQiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL3Rlc3RfYXBfbGFiZWwiCisgICAgICAgICAgICAgIGFuZHJvaWQ6aW5wdXRUeXBlPSJ0ZXh0IgorICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL0luc3RydWN0aW9uc1NtYWxsRm9udCIKKyAgICAvPgorICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3Rlc3RfcHNrX2xhYmVsIgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC90ZXN0X2FwX3NzaWQiCisgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9tdWx0aW5ldHdvcmtfY29ubmVjdGl2aXR5X3Rlc3RfYXBfcGFzc3BocmFzZSIKKyAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9JbnN0cnVjdGlvbnNTbWFsbEZvbnQiCisgICAgLz4KKyAgICA8RWRpdFRleHQgYW5kcm9pZDppZD0iQCtpZC90ZXN0X2FwX3BzayIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvdGVzdF9wc2tfbGFiZWwiCisgICAgICAgICAgICAgIGFuZHJvaWQ6aW5wdXRUeXBlPSJ0ZXh0UGFzc3dvcmQiCisgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvSW5zdHJ1Y3Rpb25zU21hbGxGb250IgorICAgIC8+CisgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvY3VycmVudF90ZXN0IgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC90ZXN0X2FwX3BzayIKKyAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL211bHRpbmV0d29ya19jb25uZWN0aXZpdHlfdGVzdF8xX2Rlc2MiCisgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvSW5zdHJ1Y3Rpb25zU21hbGxGb250IgorICAgIC8+CisgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGVzdF9wcm9ncmVzc19pbmZvIgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC9jdXJyZW50X3Rlc3QiCisgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvSW5zdHJ1Y3Rpb25zU21hbGxGb250IgorICAgIC8+CisgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3N0YXJ0X211bHRpbmV0X2J0biIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9tdWx0aW5ldHdvcmtfY29ubmVjdGl2aXR5X3Rlc3Rfc3RhcnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL3Rlc3RfcHJvZ3Jlc3NfaW5mbyIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlckhvcml6b250YWw9InRydWUiCisgICAgLz4KKworCisgICAgPGluY2x1ZGUgYW5kcm9pZDppZD0iQCtpZC9wYXNzX2ZhaWxfYnV0dG9ucyIKKyAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50Qm90dG9tPSJ0cnVlIgorICAgICAgICAgICAgIGxheW91dD0iQGxheW91dC9wYXNzX2ZhaWxfYnV0dG9ucyIvPgorPC9SZWxhdGl2ZUxheW91dD4KZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXIvcmVzL2xheW91dC9wb2FfdG91Y2gueG1sIGIvYXBwcy9DdHNWZXJpZmllci9yZXMvbGF5b3V0L3BvYV90b3VjaC54bWwKaW5kZXggY2JhN2U5OC4uYzQwNzY2ZCAxMDA2NDQKLS0tIGEvYXBwcy9DdHNWZXJpZmllci9yZXMvbGF5b3V0L3BvYV90b3VjaC54bWwKKysrIGIvYXBwcy9DdHNWZXJpZmllci9yZXMvbGF5b3V0L3BvYV90b3VjaC54bWwKQEAgLTIwLDYgKzIwLDcgQEAKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCiAgICAgICAgIGFuZHJvaWQ6Zm9jdXNhYmxlPSJ0cnVlIgotICAgICAgICBhbmRyb2lkOmZvY3VzYWJsZUluVG91Y2hNb2RlPSJ0cnVlIiAvPgorICAgICAgICBhbmRyb2lkOmZvY3VzYWJsZUluVG91Y2hNb2RlPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmRlZmF1bHRGb2N1c0hpZ2hsaWdodEVuYWJsZWQ9ImZhbHNlIiAvPgogCiA8L1JlbGF0aXZlTGF5b3V0PgpkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9yZXMvbGF5b3V0L3Bvc2l0aXZlX2RldmljZV9vd25lci54bWwgYi9hcHBzL0N0c1ZlcmlmaWVyL3Jlcy9sYXlvdXQvcG9zaXRpdmVfZGV2aWNlX293bmVyLnhtbAppbmRleCBiZTc5ZjFhLi43MmNkZWIxIDEwMDY0NAotLS0gYS9hcHBzL0N0c1ZlcmlmaWVyL3Jlcy9sYXlvdXQvcG9zaXRpdmVfZGV2aWNlX293bmVyLnhtbAorKysgYi9hcHBzL0N0c1ZlcmlmaWVyL3Jlcy9sYXlvdXQvcG9zaXRpdmVfZGV2aWNlX293bmVyLnhtbApAQCAtMzUsMTIgKzM1LDYgQEAKICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxOGRpcCIgLz4KIAogICAgICAgICAgICAgPEJ1dHRvbgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2hlY2tfcHJlY29uZGl0aW9ucyIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9kZXZpY2Vfb3duZXJfcHJlY29uZGl0aW9uX2J1dHRvbl9sYWJlbCIgLz4KLQotICAgICAgICAgICAgPEJ1dHRvbgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc2V0X2RldmljZV9vd25lcl9idXR0b24iCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXIvcmVzL2xheW91dC9wb3NpdGl2ZV9tYW5hZ2VkX3VzZXIueG1sIGIvYXBwcy9DdHNWZXJpZmllci9yZXMvbGF5b3V0L3Bvc2l0aXZlX21hbmFnZWRfdXNlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFmZGY2MwotLS0gL2Rldi9udWxsCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvcmVzL2xheW91dC9wb3NpdGl2ZV9tYW5hZ2VkX3VzZXIueG1sCkBAIC0wLDAgKzEsNDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBzdHlsZT0iQHN0eWxlL1Jvb3RMYXlvdXRQYWRkaW5nIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgorCisgICAgPFNjcm9sbFZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6ZmlsbFZpZXdwb3J0PSJ0cnVlIj4KKyAgICAgICAgPExpbmVhckxheW91dAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgorCisgICAgICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3Bvc2l0aXZlX21hbmFnZWRfdXNlcl9pbnN0cnVjdGlvbnMiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbWFuYWdlZF91c2VyX3Bvc2l0aXZlX3Rlc3RzX2luc3RydWN0aW9ucyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxOGRpcCIgLz4KKworICAgICAgICAgICAgPExpc3RWaWV3CisgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hbmRyb2lkOmxpc3QiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiIC8+CisKKyAgICAgICAgICAgIDxpbmNsdWRlIGxheW91dD0iQGxheW91dC9wYXNzX2ZhaWxfYnV0dG9ucyIgLz4KKyAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgPC9TY3JvbGxWaWV3PgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3Jlcy9sYXlvdXQvcmVxdWVzdGluZ19idWdyZXBvcnRfZGV2aWNlX293bmVyLnhtbCBiL2FwcHMvQ3RzVmVyaWZpZXIvcmVzL2xheW91dC9yZXF1ZXN0aW5nX2J1Z3JlcG9ydF9kZXZpY2Vfb3duZXIueG1sCmluZGV4IDZkN2QwYTUuLmYzMzIwYzYgMTAwNjQ0Ci0tLSBhL2FwcHMvQ3RzVmVyaWZpZXIvcmVzL2xheW91dC9yZXF1ZXN0aW5nX2J1Z3JlcG9ydF9kZXZpY2Vfb3duZXIueG1sCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvcmVzL2xheW91dC9yZXF1ZXN0aW5nX2J1Z3JlcG9ydF9kZXZpY2Vfb3duZXIueG1sCkBAIC0yOCwxMSArMjgsNiBAQAogICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMThkaXAiIC8+CiAgICAgPC9TY3JvbGxWaWV3PgogICAgIDxCdXR0b24KLSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9jaGVja19wcmVjb25kaXRpb25zIgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2RldmljZV9vd25lcl9wcmVjb25kaXRpb25fYnV0dG9uX2xhYmVsIi8+Ci0gICAgPEJ1dHRvbgogICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3NldF9kZXZpY2Vfb3duZXJfYnV0dG9uIgogICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMjA0ZHAiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgpkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9yZXMvbGF5b3V0L3Nuc3JfbmV4dF9idXR0b24ueG1sIGIvYXBwcy9DdHNWZXJpZmllci9yZXMvbGF5b3V0L3Nuc3JfbmV4dF9idXR0b24ueG1sCmluZGV4IGM0NzAxY2MuLjM3N2IyMzYgMTAwNjQ0Ci0tLSBhL2FwcHMvQ3RzVmVyaWZpZXIvcmVzL2xheW91dC9zbnNyX25leHRfYnV0dG9uLnhtbAorKysgYi9hcHBzL0N0c1ZlcmlmaWVyL3Jlcy9sYXlvdXQvc25zcl9uZXh0X2J1dHRvbi54bWwKQEAgLTIxLDEwICsyMSwxMCBAQAogICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iQGRpbWVuL3Nuc3Jfdmlld19wYWRkaW5nX3RvcCI+CiAKICAgICA8QnV0dG9uCi0gICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbmV4dF9idXR0b24iCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvcmV0cnlfYnV0dG9uIgogICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgogICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL25leHRfYnV0dG9uX3RleHQiIC8+CisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9yZXRyeV9idXR0b25fdGV4dCIgLz4KIAogICAgIDxCdXR0b24KICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9wYXNzX2J1dHRvbiIKQEAgLTQwLDQgKzQwLDEwIEBACiAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVUb3A9IkBkcmF3YWJsZS9mc19lcnJvciIKICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIiAvPgogCisgICAgPEJ1dHRvbgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL25leHRfYnV0dG9uIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL25leHRfYnV0dG9uX3RleHQiIC8+CisKIDwvR3JpZExheW91dD4KZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXIvcmVzL2xheW91dC90YXBqYWNraW5nLnhtbCBiL2FwcHMvQ3RzVmVyaWZpZXIvcmVzL2xheW91dC90YXBqYWNraW5nLnhtbAppbmRleCA2ZTVjYTczLi45OThlNjI0IDEwMDY0NAotLS0gYS9hcHBzL0N0c1ZlcmlmaWVyL3Jlcy9sYXlvdXQvdGFwamFja2luZy54bWwKKysrIGIvYXBwcy9DdHNWZXJpZmllci9yZXMvbGF5b3V0L3RhcGphY2tpbmcueG1sCkBAIC0zMSw4ICszMSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCiAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFJpZ2h0PSJ0cnVlIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFRvcD0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3VzYl90YXBqYWNraW5nX3Rlc3RfaW5zdHJ1Y3Rpb25zIiAvPgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFRvcD0idHJ1ZSIgLz4KIAogICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3RhcGphY2tpbmdfYnRuIgogICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvdXNiX3RhcGphY2tpbmdfYnV0dG9uX3RleHQiCmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3Jlcy9yYXcvY2FjZXJ0LmRlciBiL2FwcHMvQ3RzVmVyaWZpZXIvcmVzL3Jhdy9jYWNlcnQuZGVyCmluZGV4IDM5MzRlMWIuLjlhY2Y4MmEgMTAwNjQ0Ci0tLSBhL2FwcHMvQ3RzVmVyaWZpZXIvcmVzL3Jhdy9jYWNlcnQuZGVyCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvcmVzL3Jhdy9jYWNlcnQuZGVyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXIvcmVzL3Jhdy91c2VyY2VydC5kZXIgYi9hcHBzL0N0c1ZlcmlmaWVyL3Jlcy9yYXcvdXNlcmNlcnQuZGVyCmluZGV4IGNkZmI4ZjcuLmNiNDg4NTIgMTAwNjQ0Ci0tLSBhL2FwcHMvQ3RzVmVyaWZpZXIvcmVzL3Jhdy91c2VyY2VydC5kZXIKKysrIGIvYXBwcy9DdHNWZXJpZmllci9yZXMvcmF3L3VzZXJjZXJ0LmRlcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3Jlcy9yYXcvdXNlcmtleS5kZXIgYi9hcHBzL0N0c1ZlcmlmaWVyL3Jlcy9yYXcvdXNlcmtleS5kZXIKaW5kZXggMzFmMWY4Yy4uOTIxNmJiOCAxMDA2NDQKLS0tIGEvYXBwcy9DdHNWZXJpZmllci9yZXMvcmF3L3VzZXJrZXkuZGVyCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvcmVzL3Jhdy91c2Vya2V5LmRlcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3Jlcy92YWx1ZXMtd2F0Y2gvc3RyaW5ncy54bWwgYi9hcHBzL0N0c1ZlcmlmaWVyL3Jlcy92YWx1ZXMtd2F0Y2gvc3RyaW5ncy54bWwKaW5kZXggN2ZiMjJlOS4uY2EwNjY4NiAxMDA2NDQKLS0tIGEvYXBwcy9DdHNWZXJpZmllci9yZXMvdmFsdWVzLXdhdGNoL3N0cmluZ3MueG1sCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvcmVzL3ZhbHVlcy13YXRjaC9zdHJpbmdzLnhtbApAQCAtNTksNCArNTksNSBAQAogICAgICAgICA2KSBVbmxvY2sgdGhlIGRldmljZS5cbgogICAgICAgICA3KSBSZXBlYXQgc3RlcHMgKDEpIHRocm91Z2ggKDYpIGZvciBlYWNoIHNjcmVlbiBsb2NrIHR5cGUgb3RoZXIgdGhhbiBcIk5vbmVcIi4KICAgICA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzYl90YXBqYWNraW5nX3VzYl9kZWJ1Z2dpbmdfY29tcG9uZW50Ij5jb20uZ29vZ2xlLmFuZHJvaWQuYXBwcy53ZWFyYWJsZS5zZXR0aW5ncy9jb20uZ29vZ2xlLmFuZHJvaWQuY2xvY2t3b3JrLnNldHRpbmdzLlNlY3VyZUFkYkFjdGl2aXR5QWxpYXM8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvYXBwcy9DdHNWZXJpZmllci9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCmluZGV4IGIyMTBkMzMuLmYwZjBiN2UgMTAwNzU1Ci0tLSBhL2FwcHMvQ3RzVmVyaWZpZXIvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAorKysgYi9hcHBzL0N0c1ZlcmlmaWVyL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTI0LDYgKzI0LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl90ZXh0Ij5OZXh0PC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJnb19idXR0b25fdGV4dCI+R288L3N0cmluZz4KIAorICAgIDxzdHJpbmcgbmFtZT0icmV0cnlfYnV0dG9uX3RleHQiPlJldHJ5PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJmaW5pc2hfYnV0dG9uX3RleHQiPkZpbmlzaDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZmFpbF9hbmRfbmV4dF9idXR0b25fdGV4dCI+RmFpbCBhbmQgTmV4dDwvc3RyaW5nPgorCiAgICAgPCEtLSBTdHJpbmdzIGZvciBUZXN0TGlzdEFjdGl2aXR5IC0tPgogICAgIDxzdHJpbmcgbmFtZT0idGVzdF9jYXRlZ29yeV9hdWRpbyI+QXVkaW88L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRlc3RfY2F0ZWdvcnlfY2FtZXJhIj5DYW1lcmE8L3N0cmluZz4KQEAgLTE2OCw2ICsxNzIsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ic2VjX2ZwX2RpYWxvZ19tZXNzYWdlIj5BdXRoZW50aWNhdGUgbm93IHdpdGggZmluZ2VycHJpbnQ8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlY19mcF9hdXRoX2ZhaWxlZCI+QXV0aGVudGljYXRpb24gZmFpbGVkPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWNfc3RhcnRfdGVzdCI+U3RhcnQgVGVzdDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2VjX2ZpbmdlcnByaW50X2RpYWxvZ19ib3VuZF9rZXlfdGVzdCI+RmluZ2VycHJpbnQgQm91bmQgS2V5cyBUZXN0IChTeXN0ZW0gRGlhbG9nKTwvc3RyaW5nPgogCiAgICAgPCEtLSBTdHJpbmdzIGZvciBCbHVldG9vdGhBY3Rpdml0eSAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImJsdWV0b290aF90ZXN0Ij5CbHVldG9vdGggVGVzdDwvc3RyaW5nPgpAQCAtMTkxLDYgKzE5Niw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJidF9jb250cm9sIj5CbHVldG9vdGggQ29udHJvbDwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYnRfZGV2aWNlX2NvbW11bmljYXRpb24iPkRldmljZSBDb21tdW5pY2F0aW9uPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJidF9sZSI+Qmx1ZXRvb3RoIExFPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJidF9oaWQiPkJsdWV0b290aCBISUQ8L3N0cmluZz4KIAogICAgIDxzdHJpbmcgbmFtZT0iYnRfdG9nZ2xlX2JsdWV0b290aCI+VG9nZ2xlIEJsdWV0b290aDwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYnRfdG9nZ2xlX2luc3RydWN0aW9ucyI+RGlzYWJsZSBhbmQgZW5hYmxlIEJsdWV0b290aCB0byBzdWNjZXNzZnVsbHkgY29tcGxldGUgdGhpcyB0ZXN0Ljwvc3RyaW5nPgpAQCAtMjIzLDYgKzIyOSw0NCBAQAogICAgICAgICBkZXZpY2VzIHRvZ2V0aGVyIGFuZCBzdGFydCB0aGUgdGVzdC4KICAgICA8L3N0cmluZz4KIAorICAgIDwhLS0gU3RyaW5ncyBmb3IgSGlkSG9zdCBhbmQgSGlkRGV2aWNlIGFjdGl2aXR5IC0tPgorICAgIDxzdHJpbmcgbmFtZT0iYnRfaGlkX2hvc3RfdGVzdF9uYW1lIj5CbHVldG9vdGggSElEIEhvc3QgVGVzdDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYnRfaGlkX2hvc3RfdGVzdF9pbmZvIj4KKyAgICAgICAgU3RhcnQgdGhlIENUUyBWZXJpZmllciBvbiBhbm90aGVyIGRldmljZSwgc3RhcnQgdGhlIEJsdWV0b290aCB0ZXN0LCBhbmQgY2hvb3NlCisgICAgICAgIFwiQmx1ZXRvb3RoIEhJRCBEZXZpY2VcIiB0byBjb21wbGV0ZSB0aGUgdGVzdC4KKyAgICAgICAgXG5cbkNsaWNrIFwiUmVnaXN0ZXIgYXBwXCIgYW5kIFwiTWFrZSBkaXNjb3ZlcmFibGVcIiBvbiBhbm90aGVyIGRldmljZSBmaXJzdCwgYW5kIGNsaWNrCisgICAgICAgIFwiU2VsZWN0IGRldmljZVwiLiBDaG9vc2UgdGhlIGRldmljZSBmcm9tIGRldmljZSBwaWNrZXIuIElmIHRoZSByZW1vdGUgZGV2aWNlIGlzIGFscmVhZHkKKyAgICAgICAgcGFpcmVkLCB1bnBhaXIgaXQgZmlyc3QgZnJvbSBzeXN0ZW0gU2V0dGluZ3MuCisgICAgICAgIFxuXG5BZnRlciB0aGUgcmVtb3RlIGRldmljZSBjb21wbGV0ZXMgdGhlIFwiU2VuZF9yZXBvcnRcIiBjb21tYW5kLCB0ZXh0IFwiYmx1ZXRvb3RoXCIgc2hvdWxkCisgICAgICAgIGFwcGVhciBpbiB0aGUgRWRpdFRleHQuIE1hcmsgdGhlIHRlc3QgYXMgcGFzc2VkLgorICAgICAgICBcblxuIElmIHRoZSBkZXZpY2UgdW5kZXIgdGVzdCAoRFVUKSBkb2VzIG5vdCBoYXZlIEJsdWV0b290aCBISUQgSG9zdCBzZXJ2aWNlIG9yIEhJRCBEZXZpY2UKKyAgICAgICAgc2VydmljZSBlbmFibGVkLCBtYXJrIHRoZSB0ZXN0IGFzIHBhc3NlZC4KKyAgICA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJ0X2hpZF9ob3N0Ij5CbHVldG9vdGggSElEIEhvc3Q8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJ0X2hpZF9ob3N0X3NlbGVjdF9kZXZpY2UiPlNlbGVjdCBkZXZpY2U8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iYnRfaGlkX2RldmljZV90ZXN0X25hbWUiPkJsdWV0b290aCBISUQgRGV2aWNlIFRlc3Q8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJ0X2hpZF9kZXZpY2VfdGVzdF9pbmZvIj4KKyAgICAgICAgU3RhcnQgdGhlIENUUyBWZXJpZmllciBvbiBhbm90aGVyIGRldmljZSwgc3RhcnQgdGhlIEJsdWV0b290aCB0ZXN0LCBhbmQgY2hvb3NlCisgICAgICAgIFwiQmx1ZXRvb3RoIEhJRCBIb3N0XCIgdG8gY29tcGxldGUgdGhlIHRlc3QuCisgICAgICAgIFxuXG5GaXJzdCwgY2xpY2sgdGhlIFwiUmVnaXN0ZXIgYXBwXCIgYnV0dG9uLCBhbmQgY2xpY2sgdGhlIFwiTWFrZSBkaXNjb3ZlcmFibGVcIiBidXR0b24uCisgICAgICAgIFxuXG5UaGVuLCBvbiBhbm90aGVyIGRldmljZSwgY2xpY2sgdGhlIFwiU2VsZWN0IGRldmljZSIgYnV0dG9uLCBhbmQgY2hvb3NlIHRoaXMgZGV2aWNlLgorICAgICAgICBcblxuV2FpdCB1bnRpbCB0aGUgZGlhbG9nIHNob3dzIHVwIGZvciBwYWlyaW5nIHR3byBkZXZpY2VzLgorICAgICAgICBcblxuRmluYWxseSwgY2xpY2sgdGhlIFwiVGVzdCBzZW5kX3JlcG9ydFwiLCBcIlRlc3QgcmVwbHlfcmVwb3J0XCIsIFwiVGVzdCByZXBvcnRfZXJyb3JcIi4KKyAgICAgICAgXG5cbklmIGFsbCB0aGUgY29tbWFuZHMgYXJlIHN1Y2Nlc3NmdWwsIHRoZW4gY2xpY2sgXCJVbnJlZ2lzdGVyIGFwcFwiIGFuZCBtYXJrIHRoZSB0ZXN0IGFzCisgICAgICAgIHBhc3NlZC4KKyAgICAgICAgXG5cbiBJZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QgKERVVCkgZG9lcyBub3QgaGF2ZSBCbHVldG9vdGggSElEIEhvc3Qgc2VydmljZSBvciBISUQgRGV2aWNlCisgICAgICAgIHNlcnZpY2UgZW5hYmxlZCwgbWFyayB0aGUgdGVzdCBhcyBwYXNzZWQuCisgICAgPC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImJ0X2hpZF9kZXZpY2UiPkJsdWV0b290aCBISUQgRGV2aWNlPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJidF9oaWRfZGV2aWNlX3JlZ2lzdGVyIj5SZWdpc3RlciBhcHA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJ0X2hpZF9kZXZpY2VfdW5yZWdpc3RlciI+VW5yZWdpc3RlciBhcHA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJ0X2hpZF9kZXZpY2Vfc2VuZF9yZXBvcnQiPlRlc3QgU2VuZF9yZXBvcnQ8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJ0X2hpZF9kZXZpY2VfcmVwbHlfcmVwb3J0Ij5UZXN0IFJlcGx5X3JlcG9ydDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYnRfaGlkX2RldmljZV9yZXBvcnRfZXJyb3IiPlRlc3QgUmVwb3J0X2Vycm9yPC9zdHJpbmc+CisKKwogICAgIDxzdHJpbmcgbmFtZT0iYnRfc2VjdXJlX3NlcnZlciI+U2VjdXJlIFNlcnZlcjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYnRfc2VjdXJlX3NlcnZlcl9pbnN0cnVjdGlvbnMiPlN0YXJ0IHRoZSBDVFMgVmVyaWZpZXIgb24gYW5vdGhlciBkZXZpY2UsIHN0YXJ0IHRoZSBCbHVldG9vdGggdGVzdCwgYW5kIGNob29zZSBcIlNlY3VyZSBDbGllbnRcIiB0byBjb21wbGV0ZSB0aGUgdGVzdC48L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImJ0X2luc2VjdXJlX3NlcnZlciI+SW5zZWN1cmUgU2VydmVyPC9zdHJpbmc+CkBAIC0yNzEsOSArMzE1LDkgQEAKICAgICA8c3RyaW5nIG5hbWU9ImJsZV93cml0ZV9kZXNjcmlwdG9yX25hbWUiPkJsdWV0b290aCBMRSBXcml0ZSBEZXNjcmlwdG9yPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJibGVfcmVhZF9yc3NpX25hbWUiPkJsdWV0b290aCBMRSBSZWFkIFJTU0k8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImJsZV9jbGllbnRfZGlzY29ubmVjdF9uYW1lIj5CbHVldG9vdGggTEUgQ2xpZW50IERpc2Nvbm5lY3Q8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImJsZV9jbGllbnRfdGVzdF9pbmZvIj4KKyAgICA8c3RyaW5nIG5hbWU9ImJsZV9pbnNlY3VyZV9jbGllbnRfdGVzdF9pbmZvIj4KICAgICAgICAgVGhlIEJsdWV0b290aCBMRSB0ZXN0IG11c3QgYmUgZG9uZSBzaW11bHRhbmVvdXNseSBvbiB0d28gZGV2aWNlcy4gVGhpcyBkZXZpY2UgaXMgdGhlIGNsaWVudC4KLSAgICAgICAgQWxsIHRlc3RzIGxpc3RlZCBoZXJlIG11c3QgYmUgZG9uZSB3aXRoIG91dCBwYWlyaW5nLgorICAgICAgICBBbGwgdGVzdHMgbGlzdGVkIGhlcmUgbXVzdCBiZSBkb25lIHdpdGhvdXQgcGFpcmluZy4KICAgICA8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImJsZV9jbGllbnRfc2VuZF9jb25uZWN0X2luZm8iPlR5cGUgaW4gdGhlIEJsdWV0b290aCBhZGRyZXNzIG9mIHRoZSByZW1vdGUgZGV2aWNlIHRvIGNvbm5lY3QgdG8sIGFuZCB2ZXJpZnkgdGhhdCB0aGUgZGV2aWNlcyBhcmUgY29ubmVjdGVkLjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYmxlX2Rpc2NvdmVyX3NlcnZpY2VfaW5mbyI+VmVyaWZ5IHRoYXQgdGhlIHNlcnZpY2UgaXMgZGlzY292ZXJlZCB3aGVuIHlvdSBwcmVzcyB0aGUgIkRpc2NvdmVyIFNlcnZpY2UiIGJ1dHRvbi48L3N0cmluZz4KQEAgLTQwMCwxMCArNDQ0LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImJsZV9zY2FuX3N0b3AiPlN0b3Agc2Nhbjwvc3RyaW5nPgogCiAgICAgPCEtLSBCTEUgY29ubmVjdGlvbiBwcmlvcml0eSB0ZXN0IHN0cmluZ3MgLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJibGVfY2xpZW50X2Nvbm5lY3Rpb25fcHJpb3JpdHkiPlRlc3RpbmcgcHJpb3JpdHk6IDwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYmxlX2Nvbm5lY3Rpb25fcHJpb3JpdHlfYmFsYW5jZWQiPkJBTEFOQ0VEPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJibGVfY29ubmVjdGlvbl9wcmlvcml0eV9oaWdoIj5ISUdIPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJibGVfY29ubmVjdGlvbl9wcmlvcml0eV9sb3ciPkxPVzwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYmxlX2NsaWVudF9jb25uZWN0aW9uX3ByaW9yaXR5Ij5UZXN0aW5nIGNvbm5lY3Rpb24gcHJpb3JpdHkgc3dpdGNoaW5nIDwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYmxlX3NlcnZlcl9jb25uZWN0aW9uX3ByaW9yaXR5X3Jlc3VsdF9wYXNzZWQiPkFsbCB0ZXN0IHBhc3NlZDwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYmxlX3NlcnZlcl9jb25uZWN0aW9uX3ByaW9yaXR5X3Jlc3VsdF9mYWlsZWQiPlRlc3QgZmFpbGVkLjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYmxlX3NlcnZlcl9jb25uZWN0aW9uX3ByaW9yaXR5X3Jlc3VsdF9pbnRlcnZhbHMiPgpAQCAtNDI2LDkgKzQ2Nyw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJibGVfd3JpdGVfYXV0aGVudGljYXRlZF9jaGFyYWN0ZXJpc3RpY19uYW1lIj5CbHVldG9vdGggTEUgV3JpdGUgRW5jcnlwdGVkIENoYXJhY3RlcmlzdGljPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJibGVfcmVhZF9hdXRoZW50aWNhdGVkX2Rlc2NyaXB0b3JfbmFtZSI+Qmx1ZXRvb3RoIExFIFJlYWQgRW5jcnlwdGVkIERlc2NyaXB0b3I8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImJsZV93cml0ZV9hdXRoZW50aWNhdGVkX2Rlc2NyaXB0b3JfbmFtZSI+Qmx1ZXRvb3RoIExFIFdyaXRlIEVuY3J5cHRlZCBEZXNjcmlwdG9yPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJibGVfY29ubmVjdGlvbl9wcmlvcml0eV9jbGllbnRfaGlnaCI+Qmx1ZXRvb3RoIExFIFNlbmQgV2l0aCBDT05ORUNUSU9OX1BSSU9SSVRZX0hJR0g8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImJsZV9jb25uZWN0aW9uX3ByaW9yaXR5X2NsaWVudF9sb3ciPkJsdWV0b290aCBMRSBTZW5kIFdpdGggQ09OTkVDVElPTl9QUklPUklUWV9MT1dfUE9XRVI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImJsZV9jb25uZWN0aW9uX3ByaW9yaXR5X2NsaWVudF9iYWxhbmNlZCI+Qmx1ZXRvb3RoIExFIFNlbmQgV2l0aCBDT05ORUNUSU9OX1BSSU9SSVRZX0JBTEFOQ0VEPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJibGVfY29ubmVjdGlvbl9wcmlvcml0eV9jbGllbnRfZGVzY3JpcHRpb24iPkNsaWVudCBTd2l0Y2hpbmcgQ29ubmVjdGlvbiBQcmlvcml0eTwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYmxlX2luZGljYXRlX2NoYXJhY3RlcmlzdGljX25hbWUiPkJsdWV0b290aCBMRSBJbmRpY2F0ZSBDaGFyYWN0ZXJpc3RpYzwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYmxlX2VuY3J5cHRlZF9jbGllbnRfbmFtZSI+MDMgQmx1ZXRvb3RoIExFIEVuY3J5cHRlZCBDbGllbnQgVGVzdDwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYmxlX2VuY3J5cHRlZF9jbGllbnRfaW5mbyI+Qmx1ZXRvb3RoIExFIEVuY3J5cHRlZCBDbGllbnQgcmVhZC93cml0ZSBvbiBjaGFyYWN0ZXJpc3RpYyBhbmQgZGVzY3JpcHRvciBuZWVkIGVuY3J5cHRlZC48L3N0cmluZz4KQEAgLTU2NiwxMCArNjA1LDM1IEBACiAgICAgICAgIChmb3IgZXhhbXBsZSwgc3RhdGlvbmFyeSBvbiBhIHdpbmRvd3NpbGwuICBJZiBuZWVkZWQsIHRyeSBhZ2Fpbiwgb3V0c2lkZSwgYWxzbyB3aXRoIHRoZQogICAgICAgICBkZXZpY2Ugc3RhdGlvbmFyeSwgYW5kIHdpdGggYXQgbGVhc3Qgc29tZSB2aWV3IG9mIHRoZSBza3kuKSBhbmQgdGhlbiBwcmVzcyBOZXh0IHRvIHJ1bgogICAgICAgICB0aGUgYXV0b21hdGVkIHRlc3RzLjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9jYXRpb25fZW1lcmdlbmN5X2NhbGxfdGVzdF9pbmZvIj5UaGlzIHRlc3QgdmVyaWZpZXMgd2hldGhlciBiYXNpYyBmZWF0dXJlcworICAgICAgICAod2lmaSwgc21zLCBncHMpIHdvcmtzIGNvcnJlY3RseSBkdXJpbmcgdGhlIGVtZXJnZW5jeSBjYWxsLiBNYWtlIHN1cmUgdGhlIGRldmljZSBpcyB1c2luZworICAgICAgICBhIHNwZWNpYWwgd2hpdGUgbGlzdGVkIHNpbSBjYXJkLiBUaGUgd2lmaSBhbmQgR1BTIHNob3VsZCBiZSBvbiBhbmQgaGF2ZSBpbnRlcm5ldCBjb25uZWN0aW9uLgorICAgICAgICBQcmVzcyB0aGUgcGFzcyBidXR0b24gdG8gc2tpcCB0aGlzIHRlc3QgaWYgb3V0c2lkZSBVUy9DYW5hZGEuCisgICAgPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlbWVyZ2VuY3lfY2FsbF9jb25maXJtX2luZm8iPlRoaXMgdGVzdCB3aWxsIGRpYWwgOTExISBQbGVhc2UgbWFrZSBzdXJlIHRvIHVzZSBhCisgICAgICAgIHdoaXRlbGlzdGVkIHNpbSBjYXJkIHRvIHJ1biB0aGlzIHRlc3QhCisgICAgPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlbWVyZ2VuY3lfY2FsbF9za2lwX2luZm8iPkN1cnJlbnQgZGV2aWNlIGRvZXNuXCd0IHN1cHBvcnQgY2VsbHVsYXIgbmV0d29yay4gU2tpcHBpbmcgdGhlIFRlc3QuCisgICAgPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlbWVyZ2VuY3lfY2FsbF9lbWVyZ2VuY3lfbnVtYmVyX2hpbnRfdGV4dCI+CisgICAgICAgIEVtZXJnZW5jeSBOdW1iZXI6CisgICAgPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlbWVyZ2VuY3lfY2FsbF9jdXJyZW50X251bWJlcl9oaW50X3RleHQiPgorICAgICAgICBDdXJyZW50IE51bWJlcjoKKyAgICA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxfdGV4dCI+CisgICAgICAgIERpYWwgOTExCisgICAgPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlbWVyZ2VuY3lfY2FsbF9lbWVyZ2VuY3lfbnVtYmVyX3RleHQiPgorICAgICAgICA5MTEKKyAgICA8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2F0aW9uX2duc3NfdGVzdF9yZXRyeV9pbmZvIj5JZiB0aGlzIHRlc3QgZmFpbHMsIHBsZWFzZSBtYWtlIHN1cmUgdGhlIGRldmljZQogICAgICAgICBoYXMgbGluZSBvZiBzaWdodCB0byBHTlNTIHNhdGVsbGl0ZXMgKGZvciBleGFtcGxlLCBzdGF0aW9uYXJ5IG9uIGEgd2luZG93c2lsbC4gSWYgbmVlZGVkLAogICAgICAgICB0cnkgYWdhaW4sIG91dHNpZGUsIGFsc28gd2l0aCB0aGUgZGV2aWNlIHN0YXRpb25hcnksIHdpdGggYXMgbXVjaCB2aWV3IG9mIHRoZSBza3kgYXMKICAgICAgICAgcG9zc2libGUuKSA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2F0aW9uX2VtZXJnZW5jeV9jYWxsX2dwc190ZXN0Ij5FbWVyZ2VuY3kgQ2FsbCBHUFMgVGVzdDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9jYXRpb25fZW1lcmdlbmN5X2NhbGxfbWVzc2FnZV90ZXN0Ij5FbWVyZ2VuY3kgQ2FsbCBNZXNzYWdlIFRlc3Q8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2F0aW9uX2VtZXJnZW5jeV9jYWxsX3dpZmlfdGVzdCI+RW1lcmdlbmN5IENhbGwgV2lmaSBUZXN0PC9zdHJpbmc+CiAKICAgICA8IS0tIFN0cmluZ3MgZm9yIENvbm5lY3Rpdml0eUJhY2tncm91bmRUZXN0QWN0aXZpdHkgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJuZXR3b3JrX2JhY2tncm91bmRfdGVzdCI+TmV0d29yayBCYWNrZ3JvdW5kIENvbm5lY3Rpdml0eSBUZXN0PC9zdHJpbmc+CkBAIC01ODYsNiArNjUwLDUwIEBACiAgICAgPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJuZXR3b3JrX2JhY2tncm91bmRfdGVzdF9zdGFydCI+U3RhcnQ8L3N0cmluZz4KIAorICAgIDwhLS0gU3RyaW5ncyBmb3IgbmV0Lk11bHRpTmV0d29ya0Nvbm5lY3Rpdml0eVRlc3RBY3Rpdml0eSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9Im11bHRpbmV0d29ya19jb25uZWN0aXZpdHlfdGVzdCI+TXVsdGluZXR3b3JrIGNvbm5lY3Rpdml0eSBUZXN0PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtdWx0aW5ldHdvcmtfY29ubmVjdGl2aXR5X3Rlc3RfaW5zdHJ1Y3Rpb25zIj4KKyAgICAgICAgVGhpcyB0ZXN0IHZlcmlmaWVzIHRoYXQsIHdoZW4gYSBwaG9uZSBoYXMgaW50ZXJuZXQgY29ubmVjdGl2aXR5IHZpYSBtb2JpbGUgbmV0d29yaworICAgICAgICBpcyBjb25uZWN0ZWQgdG8gYSBXaS1GaSBhY2Nlc3MgcG9pbnQgdGhhdCBkb2VzblwndCBoYXZlIGludGVybmV0IG9yIGxvc2VzIGludGVybmV0IGFjY2VzcywKKyAgICAgICAgaXQgcmVzdG9yZXMgdGhlIGludGVybmV0IGFjdGl2aXR5IG92ZXIgdGhlIG1vYmlsZSBjZWxsIG5ldHdvcmssIHdoaWxlIGNvbm5lY3RlZCB0byB0aGUKKyAgICAgICAgV2ktRmkgYWNjZXNzIHBvaW50LiBcblxuCisKKyAgICAgICAgMS4gU2V0dXAgYSB3aXJlbGVzcyBhY2Nlc3MgcG9pbnQgd2l0aCBhYmlsaXR5IHRvIHR1cm4gb24gYW5kIG9mZiBpbnRlcm5ldCBhY2Nlc3MuCisgICAgICAgIDIuIEhhdmUgU0lNIG9yIGNlbGx1bGFyIGRhdGEgY29ubmVjdGl2aXR5IG9uIHRoZSBwaG9uZSBiZWluZyB0ZXN0ZWQuCisgICAgICAgIDMuIEV4ZWN1dGUgdGhlIHRlc3RzIHdpdGggdGhlIGluc3RydWN0aW9ucyBvdXRsaW5lZCBpbiB0aGUgdGVzdAorICAgICAgICA0LiBXaGVuIHRoZSB0ZXN0IGNvbXBsZXRlcywgaXQgd2lsbCBmaW5pc2ggYW5kIG1hcmsgaXQgcGFzc2VkLiBJZiBpdCBmYWlscywgaXQgd2lsbCBtYXJrIGl0IFxuCisgICAgICAgICAgIGFzIGZhaWxlZC4KKworICAgIDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXVsdGluZXR3b3JrX2Nvbm5lY3Rpdml0eV90ZXN0X3ByZV9yZXF1aXNpdGVzIj5QcmVyZXF1aXNpdGUgLSBTZXR1cCBhIFdpLUZpIGFjY2VzcyBwb2ludCB3aXRoIFdQQSBQU0sgaW4gd2hpY2ggd2UgY2FuIHR1cm4gb24gb3Igb2ZmIGludGVybmV0IGFjY2Vzcy4gPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtdWx0aW5ldHdvcmtfY29ubmVjdGl2aXR5X3Rlc3Rfc3RhcnQiPlN0YXJ0PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtdWx0aW5ldHdvcmtfY29ubmVjdGl2aXR5X3Rlc3RfYXBfbmFtZSI+V2ktRmkgU1NJRDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXVsdGluZXR3b3JrX2Nvbm5lY3Rpdml0eV90ZXN0X2FwX3Bhc3NwaHJhc2UiPldQQSAyIHBhc3NwaHJhc2U8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im11bHRpbmV0d29ya19jb25uZWN0aXZpdHlfdGVzdF9jb250aW51ZSI+Q29uZmlybSBhbmQgY29udGludWUgd2l0aCB0ZXN0Ljwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXVsdGluZXR3b3JrX2Nvbm5lY3Rpdml0eV90ZXN0X3JlcnVuIj5Db21wbGV0ZWQuIFJlLXJ1bi48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im11bHRpbmV0d29ya19jb25uZWN0aXZpdHlfdGVzdF9ydW5uaW5nIj5SdW5uaW5nLjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXVsdGluZXR3b3JrX2Nvbm5lY3Rpdml0eV90ZXN0X2Nvbm5lY3RfY2VsbHVsYXIiPkNvbm5lY3RpbmcgdG8gY2VsbHVsYXIgbmV0d29yay48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im11bHRpbmV0d29ya19jb25uZWN0aXZpdHlfdGVzdF9jb25uZWN0X3dpZmkiPkNvbm5lY3RpbmcgdG8gV2ktRmkgbmV0d29yay48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im11bHRpbmV0d29ya19jb25uZWN0aXZpdHlfdGVzdF9jb21wbGV0ZSI+VGVzdCBjb21wbGV0ZWQuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtdWx0aW5ldHdvcmtfY29ubmVjdGl2aXR5X3Rlc3RfcHJvZ3Jlc3NfMSI+V2FpdGluZyBmb3IgV2ktRmkgdG8gbG9zZSBjb25uZWN0aXZpdHkuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtdWx0aW5ldHdvcmtfY29ubmVjdGl2aXR5X3Rlc3RfcHJvZ3Jlc3NfMiI+V2FpdGluZyB0byBjaGVjayBjb25uZWN0aXZpdHkuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtdWx0aW5ldHdvcmtfY29ubmVjdGl2aXR5X3Rlc3RfcHJvZ3Jlc3NfMyI+V2FpdGluZyB0byBtYWtlIHN1cmUgV2ktRmkgaGFzIGNvbm5lY3Rpdml0eS48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im11bHRpbmV0d29ya19jb25uZWN0aXZpdHlfdGVzdF8xX2Rlc2MiPlRlc3QgMSAtIENvbm5lY3QgdG8gV2ktRmkgd2l0aCBubyBpbnRlcm5ldCBkb2VzbnQgZGlzYWJsZSBjdXJyZW50IGNvbm5lY3Rpdml0eTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXVsdGluZXR3b3JrX2Nvbm5lY3Rpdml0eV90ZXN0XzJfZGVzYyI+VGVzdCAyIC0gV2hlbiBjb25uZWN0ZWQgdG8gV2ktRmksIG9uIGxvc2luZyBjb25uZWN0aXZpdHksIHJlc3RvcmVzIG1vYmlsZSBjb25uZWN0aXZpdHk8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im11bHRpbmV0d29ya19zdGF0dXNfd2lmaV9jb25uZWN0X3N1Y2Nlc3MiPldpLUZpIGNvbm5lY3Qgc3VjY2Vzcy48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im11bHRpbmV0d29ya19zdGF0dXNfbW9iaWxlX2Nvbm5lY3Rfc3VjY2VzcyI+TW9iaWxlIG5ldCBjb25uZWN0IHN1Y2Nlc3MuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtdWx0aW5ldHdvcmtfc3RhdHVzX3dpZmlfY29ubmVjdF90aW1lZF9vdXQiPldpLUZpIGNvbm5lY3QgdGltZWQgb3V0Ljwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXVsdGluZXR3b3JrX3N0YXR1c193aWZpX2Nvbm5lY3Rfd3JvbmdfYXAiPldpLUZpIGNvbm5lY3RlZCB0byB3cm9uZyBhY2Nlc3MgcG9pbnQuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtdWx0aW5ldHdvcmtfc3RhdHVzX21vYmlsZV9jb25uZWN0X3RpbWVkX291dCI+TW9iaWxlIG5ldHdvcmsgY29ubmVjdCB0aW1lZCBvdXQuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtdWx0aW5ldHdvcmtfc3RhdHVzX21vYmlsZV9yZXN0b3JlX3N1Y2Nlc3MiPk1vYmlsZSByZXN0b3JlIHN1Y2NlZWRlZC48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im11bHRpbmV0d29ya19zdGF0dXNfbW9iaWxlX3Jlc3RvcmVfZmFpbGVkIj5Nb2JpbGUgcmVzdG9yZSBmYWlsZWQuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtdWx0aW5ldHdvcmtfY29ubmVjdGl2aXR5X3Rlc3RfMV9wcmVyZXEiPk1ha2Ugc3VyZSB0aGF0IHRoZSBIb3RzcG90IGRvZXMgbm90IGhhdmUgaW50ZXJuZXQgYWNjZXNzLjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXVsdGluZXR3b3JrX2Nvbm5lY3Rpdml0eV90ZXN0XzJfcHJlcmVxXzEiPk1ha2Ugc3VyZSB0aGF0IHRoZSBIb3RzcG90IGhhcyBpbnRlcm5ldCBhY2Nlc3MuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtdWx0aW5ldHdvcmtfY29ubmVjdGl2aXR5X3Rlc3RfMl9wcmVyZXFfMiI+TWFrZSBzdXJlIHRoYXQgdGhlIEhvdHNwb3QgZG9lcyBub3QgaGF2ZSBpbnRlcm5ldCBhY2Nlc3MuIFdoZW4gcHJvbXB0ZWQgdG8gZ28gYmFjayB0byB1c2luZyBtb2JpbGUgZGF0YSwgY2hvb3NlIG9rLjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXVsdGluZXR3b3JrX2Nvbm5lY3Rpdml0eV90ZXN0X2FsbF9wcmVyZXFfMSI+TG9va3MgbGlrZSB5b3VyIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRlbGVwaG9ueSBvciBtb2JpbGUgZGF0YS4gSWYgeWVzLCB5b3UgY2FuIG1hcmsgdGVzdCBwYXNzZWQgYW5kIHByb2NlZWQuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtdWx0aW5ldHdvcmtfY29ubmVjdGl2aXR5X3Rlc3RfYWxsX3ByZXJlcV8yIj5OZWVkIG1vYmlsZSBkYXRhIHRvIHByb2NlZWQuIFBsZWFzZSBpbnNlcnQgYSBtb2JpbGUgZGF0YSBjYXBhYmxlIHNpbSBhbmQgcmVwZWF0IHRoZSB0ZXN0LiBCeSBtYXJraW5nIHRlc3QgYXMgcGFzc2VkLCB5b3UgYWNrbm93bGVkZ2UgdGhhdCB0aGUgZGV2aWNlIGNhbm5vdCBkbyBtb2JpbGUgZGF0YS48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im11bHRpbmV0d29ya19zdGF0dXNfd2lmaV9jb25uZWN0aXZpdHlfZmFpbGVkIj5XaS1GaSBjb25uZWN0aXZpdHkgZmFpbGVkLjwvc3RyaW5nPgorCiAgICAgPCEtLSBTdHJpbmdzIGZvciBOZmNUZXN0QWN0aXZpdHkgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJuZmNfdGVzdCI+TkZDIFRlc3Q8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im5mY190ZXN0X2luZm8iPlRoZSBQZWVyLXRvLVBlZXIgRGF0YSBFeGNoYW5nZSB0ZXN0cyByZXF1aXJlIHR3byBkZXZpY2VzIHdpdGgKQEAgLTgwNCw2ICs5MTIsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ic25zcl9rZWVwX2RldmljZV9yb3RhdGluZ19jbG9ja3dpc2UiPk9uY2UgdGhlIHRlc3QgYmVnaW5zLCB5b3Ugd2lsbCBoYXZlIHRvIGtlZXAgcm90YXRpbmcgdGhlIGRldmljZSBjbG9ja3dpc2UuPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbnNyX3dhaXRfZm9yX3VzZXIiPlByZXNzIFwnTmV4dFwnIHRvIGNvbnRpbnVlLjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic25zcl93YWl0X3RvX2JlZ2luIj5QcmVzcyBcJ05leHRcJyB0byBiZWdpbi48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNuc3Jfd2FpdF90b19yZXRyeSI+UHJlc3MgXCdSZXRyeVwnIHRvIHJlcnVuIG9yIFwnRmFpbCBhbmQgTmV4dFwnIHRvIHNraXAgdG8gbmV4dC48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNuc3Jfd2FpdF90b19maW5pc2giPlByZXNzIFwnUmV0cnlcJyB0byByZXJ1biBvciBcJ0ZpbmlzaFwnIHRvIGVuZC48L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNuc3Jfb25fY29tcGxldGVfcmV0dXJuIj5BZnRlciBjb21wbGV0aW5nIHRoZSB0YXNrLCBnbyBiYWNrIHRvIHRoaXMgdGVzdC48L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNuc3JfbW92ZW1lbnRfZXhwZWN0ZWQiPk1vdmVtZW50IHdhcyBleHBlY3RlZCBkdXJpbmcgdGhlIHRlc3QuIEZvdW5kPSUxJGIuPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbnNyX3NlbnNvcl9mZWF0dXJlX2RlYWN0aXZhdGlvbiI+SU1QT1JUQU5UIE5PVEU6IFBsZWFzZSBhbHNvIHR1cm4gb2ZmIGFueSBzcGVjaWFsIGZlYXR1cmVzIGluIHRoZQpAQCAtOTA3LDYgKzEwMTcsOSBAQAogICAgIGZpcnN0RXZlbnRSZWNlaXZlZE1zPSUyJGQgZGlmZk1zPSUzJGQgdG9sZXJhbmNlTXM9JTQkZCA8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNuc3JfZGV2aWNlX3N1c3BlbmRfdGVzdF9pbnN0ciI+T25lIHlvdSBiZWdpbiB0aGUgdGVzdCwgZGlzY29ubmVjdCBVU0IsIHR1cm4gb2ZmIHRoZSBkaXNwbGF5IGFuZCBhbGxvdwogICAgIHRoZSBkZXZpY2UgdG8gZ28gaW50byBzdXNwZW5kIG1vZGUuIFRoZSBzY3JlZW4gd2lsbCB0dXJuIG9uIGFuZCBhIHNvdW5kIHdpbGwgYmUgcGxheWVkIG9uY2UgYWxsIHRoZSB0ZXN0cyBhcmUgY29tcGxldGVkLjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic25zcl9kZXZpY2Vfc3VzcGVuZF9zZXJ2aWNlIj5EZXZpY2UgU3VzcGVuZCBTZXJ2aWNlPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzbnNyX2RldmljZV9zdXNwZW5kX3NlcnZpY2VfYWN0aXZlIj5EZXZpY2UgU3VzcGVuZCBUZXN0IEFjdGl2ZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic25zcl9kZXZpY2Vfc3VzcGVuZF9zZXJ2aWNlX25vdGlmaWNhdGlvbiI+RGV2aWNlIFN1c3BlbmQgVGVzdCBpcyB1c2luZyBzZW5zb3JzLjwvc3RyaW5nPgogCiAgICAgPCEtLSBTaWduaWZpY2FudCBNb3Rpb24gLS0+CiAgICAgPHN0cmluZyBuYW1lPSJzbnNyX3NpZ25pZmljYW50X21vdGlvbl90ZXN0Ij5TaWduaWZpY2FudCBNb3Rpb24gVGVzdHM8L3N0cmluZz4KQEAgLTkyNiw2ICsxMDM5LDE3IEBACiAgICAgWW91IHdpbGwgbmVlZCB0byB3YWxrIHRvIGVuc3VyZSB0aGF0IFNpZ25pZmljYW50IE1vdGlvbiB0cmlnZ2Vycy4gVGhlIHNjcmVlbiB3aWxsIHR1cm4gb24gYW5kIGEgc291bmQgd2lsbCBiZSBwbGF5ZWQgb25jZSB0aGUgdGVzdCBjb21wbGV0ZXMuPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbnNyX2RldmljZV9kaWRfbm90X3dha2VfdXBfYXRfdHJpZ2dlciI+RGV2aWNlIGRpZCBub3Qgd2FrZXVwIGF0IHRyaWdnZXIgdGltZS4gd2FrZVRpbWU9JTEkZCBtcyB0cmlnZ2VyVGltZT0lMiRkIG1zPC9zdHJpbmc+CiAKKyAgICA8IS0tIEV2ZW50IHNhbml0aXphdGlvbiBmb3IgaWRsZSBVSURzIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ic25zcl9ldmVudF9zYW5pdGl6YXRpb25fdGVzdCI+RXZlbnQgc2FuaXRpemF0aW9uIGZvciBpZGxlIFVJRCB0ZXN0PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzbnNyX2V2ZW50X3Nhbml0aXphdGlvbl90ZXN0X3NldHVwIj5SdW4gdGhlIFwnYWRiIHNoZWxsIGNtZCBzZW5zb3JzZXJ2aWNlIHNldC11aWQtc3RhdGUgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyIGlkbGVcJyBzaGVsbCBjb21tYW5kCisgICAgICAgIHRvIGVtdWxhdGUgdGhlIEN0c1ZlcmlmaWVyIFVJRCBiZWluZyBpZGxlLjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic25zcl9ldmVudF9zYW5pdGl6YXRpb25fdGVzdF9jbGVhbnVwIj5SdW4gdGhlIFwnYWRiIHNoZWxsIGNtZCBzZW5zb3JzZXJ2aWNlIHJlc2V0LXVpZC1zdGF0ZSBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXJcJyBzaGVsbCBjb21tYW5kCisgICAgICAgIHRvIHN0b3AgZW11bGF0aW5nIHRoZSBDdHNWZXJpZmllciBVSUQgYmVpbmcgaWRsZS4gRmFpbGluZyB0byBkbyB0aGF0IHdvdWxkIGxlYWQgdG8gb3RoZXIgdGVzdHMgZmFpbGluZyE8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNuc3Jfc2lnbmlmaWNhbnRfbW90aW9uX3Rlc3RfdWlkX2lkbGUiPk1vdmUgYXJvdW5kIHdpdGggdGhlIGRldmljZSB0byB0cnkgdHJpZ2dlcmluZyBzaWduaWZpY2FudCBtb3Rpb248L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNuc3Jfc2lnbmlmaWNhbnRfbW90aW9uX3Rlc3RfdWlkX2lkbGVfZXhwZWN0YXRpb24iPk5vIHRyaWdnZXIgZXZlbnRzIHNob3VsZCBiZSBnZW5lcmF0ZWQgd2hpbGUgaWRsZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic25zcl9wcm94aW1pdHlfdGVzdF91aWRfaWRsZSI+VG91Y2ggdGhlIHByb3hpbWl0eSBzZW5zb3IgdG8gdHJ5IHRyaWdnZXJpbmcgaXQ8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNuc3JfcHJveGltaXR5X3Rlc3RfdWlkX2lkbGVfZXhwZWN0YXRpb24iPk5vIG9uLWNoYW5nZSBldmVudHMgc2hvdWxkIGJlIGdlbmVyYXRlZCB3aGlsZSBpZGxlPC9zdHJpbmc+CisKICAgICA8IS0tIExvdyBMYXRlbmN5IE9mZi1Cb2R5IERldGVjdCAtLT4KICAgICA8c3RyaW5nIG5hbWU9InNuc3Jfb2ZmYm9keV9zZW5zb3JfdGVzdCI+T2ZmIEJvZHkgU2Vuc29yIFRlc3RzPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbnNyX29mZmJvZHlfc2Vuc29yX3JlZ2lzdHJhdGlvbiI+UmVnaXN0cmF0aW9uIGZhaWxlZCBmb3IgbG93IGxhdGVuY3kgb2ZmYm9keSBkZXRlY3Qgc2Vuc29yLlxuPC9zdHJpbmc+CkBAIC05NjUsMTIgKzEwODksMTMgQEAKICAgICA8c3RyaW5nIG5hbWU9InVzYl90YXBqYWNraW5nX3Rlc3RfaW5zdHJ1Y3Rpb25zIj4KICAgICAgICAgMS4gQ29ubmVjdCBkZXZpY2UgdmlhIHVzYiB0byBjb21wdXRlci5cbgogICAgICAgICAyLiBDbGljayBcIlNob3cgb3ZlcmxheVwiIGJ1dHRvbi4gIFNldHRpbmdzIG1heSBhcHBlYXIgaWYgdGhlIENUUyBWZXJpZmllciBhcHAgZG9lc25cJ3QgaGF2ZSBkaXNwbGF5IG92ZXIgYXBwcyBwZXJtaXNzaW9uLiAgRW5hYmxlIHRoaXMgcGVybWlzc2lvbiBhbmQgdGhlbiBjbGljayBiYWNrIHRvIG5hdmlnYXRlIGJhY2sgdG8gdGhlIGFwcC5cbgotICAgICAgICAzLiBUcmlnZ2VyIFVTQiBkZWJ1Z2dpbmcgZGlhbG9nIChmcm9tIGNvbXB1dGVyIHRlcm1pbmFsKTogXCJhZGIgc2hlbGwgYW0gc3RhcnQgLWUgZmluZ2VycHJpbnRzIHBsYWNlaG9sZGVyIC1lIGtleSBwbGFjZWhvbGRlciBjb20uYW5kcm9pZC5zeXN0ZW11aS8udXNiLlVzYkRlYnVnZ2luZ0FjdGl2aXR5XCJcbgotICAgICAgICA0LiBVU0IgZGVidWdnaW5nIGRpYWxvZyBzaG91bGQgYXBwZWFyIHdpdGggdGhlIG92ZXJsYXkgb24gdG9wIHNheWluZyBcIlRoaXMgbWVzc2FnZSBjb3ZlcnMgdGhlIFVTQiBkZWJ1Z2dpbmcgUlNBIHByb21wdFwiIHRvIGFwcGVhci5cbgorICAgICAgICAzLiBUcmlnZ2VyIFVTQiBkZWJ1Z2dpbmcgZGlhbG9nIChmcm9tIGNvbXB1dGVyIHRlcm1pbmFsKTogXCJhZGIgc2hlbGwgYW0gc3RhcnQgLWUgZmluZ2VycHJpbnRzIHBsYWNlaG9sZGVyIC1lIGtleSBwbGFjZWhvbGRlciAlc1wiXG4KKyAgICAgICAgNC4gVVNCIGRlYnVnZ2luZyBkaWFsb2cgc2hvdWxkIGFwcGVhci4gIElmIHRoZSBvdmVybGF5IGNhbm5vdCBiZSBzZWVuIGFib3ZlIHRoZSBVU0IgZGVidWdnaW5nIGRpYWxvZywgUEFTUyB0aGlzIHRlc3QgKG5vIG5lZWQgdG8gcHJvY2VlZCB0byBTdGVwIDUpLiAgRWxzZSwgaWYgdGhlIG92ZXJsYXkgZG9lcyBhcHBlYXIgb24gdG9wIHNheWluZyBcIlRoaXMgbWVzc2FnZSBjb3ZlcnMgdGhlIFVTQiBkZWJ1Z2dpbmcgUlNBIHByb21wdFwiLCBjb250aW51ZSB0byBTdGVwIDUuXG4KICAgICAgICAgNS4gVHJ5IGNsaWNraW5nIE9LLiBcbgogICAgICAgICBUZXN0IHBhc3MgaWYgeW91IGNhbm5vdCBjbGljayBPSyB3aGVuIHRoZSB0ZXh0IHF1b3RlZCBhYm92ZSBpcyBvbiB0b3Agb2YgdGhlIFVTQiBkZWJ1Z2dpbmcgZGlhbG9nLiAgVG9hc3Qgc2hvdWxkIGFwcGVhciBzYXlpbmcgdGhlcmUgaXMgYW4gb3ZlcmxheSBzbyBTZXR0aW5ncyBjYW5ub3QgdmVyaWZ5IHlvdXIgcmVzcG9uc2UuIFxuCiAgICAgICAgIE5vdGU6IEZha2UgbWVzc2FnZSBvdmVybGF5IG1heSByZW1haW4gb24gc2NyZWVuIHVudGlsIHlvdSBsZWF2ZSB0aGUgdGVzdC4gVGhpcyBpcyB3b3JraW5nIGFzIGludGVuZGVkLiBcbgogICAgIDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNiX3RhcGphY2tpbmdfdXNiX2RlYnVnZ2luZ19jb21wb25lbnQiPmNvbS5hbmRyb2lkLnN5c3RlbXVpLy5Vc2JEZWJ1Z2dpbmdBY3Rpdml0eUFsaWFzPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2JfdGFwamFja2luZ19vdmVybGF5X21lc3NhZ2UiPlRoaXMgbWVzc2FnZSBjb3ZlcnMgdGhlIFVTQiBkZWJ1Z2dpbmcgUlNBIHByb21wdDwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3RhcGphY2tpbmdfZXJyb3JfdG9hc3QiPlBsZWFzZSByZXN0YXJ0IHRoZSBhcHBsaWNhdGlvbiBhbmQgdHJ5IGFnYWluLjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3RhcGphY2tpbmdfZXJyb3JfdG9hc3QyIj5QbGVhc2UgZW5hYmxlIGRpc3BsYXkgb3ZlciBhcHBzIHBlcm1pc3Npb24gZm9yIHRoaXMgYXBwbGljYXRpb24gYmVmb3JlIHByb2NlZWRpbmcuPC9zdHJpbmc+CkBAIC0xMDY2LDEwICsxMTkxLDEyIEBACiAgICAgdGhlIHJpZ2h0IHZpZXcgbXVzdCBiZSBob3Jpem9udGFsbHkgbWlycm9yZWQgcmVsYXRpdmUgdG8gdGhlIGxlZnQKICAgICB2aWV3LlxuIC0gTm90ZSB0aGF0IHRoZSBmcmFtZSByYXRlIG9mIHRoZSByaWdodCB2aWV3IG1heSBiZSBtdWNoCiAgICAgbG93ZXIgdGhhbiBvbiB0aGUgbGVmdDsgdGhpcyBpcyBub3QgYW4gaW5kaWNhdGlvbiBvZiBhIGZhaWxlZAotICAgIHRlc3QuCisgICAgdGVzdC5cbiAtIFRoZSBuZXh0IGJ1dHRvbiB0cmlnZ2VycyB0aGUgbmV4dCByZXNvbHV0aW9uIGFuZCBmb3JtYXQKKyAgICBjb21iaW5hdGlvbiBvZiB0aGUgY3VycmVudCBjYW1lcmEgdG8gc2hvdzsgdGhpcyBpcyBvcHRpb25hbC4KICAgICA8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNmX3ByZXZpZXdfbGFiZWwiPk5vcm1hbCBwcmV2aWV3PC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjZl9mb3JtYXRfbGFiZWwiPlByb2Nlc3NlZCBjYWxsYmFjayBkYXRhPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjZl9uZXh0X2J1dHRvbiI+TmV4dDwvc3RyaW5nPgogCiAgICAgPCEtLSBTdHJpbmdzIGZvciBDYW1lcmEgVmlkZW8gLS0+CiAgICAgPHN0cmluZyBuYW1lPSJyZWNvcmRfYnV0dG9uX3RleHQiPlRlc3Q8L3N0cmluZz4KQEAgLTEwODAsMTAgKzEyMDcsMTEgQEAKICAgICBzZWNvbmRzIG9mIHZpZGVvIHJlY29yZGluZy4gUGxheWJhY2sgd2lsbCBzaG93IHVwIGluIHRoZSByaWdodCB2aWV3CiAgICAgd2luZG93IGFmdGVyIHJlY29yZGluZyBpcyBjb21wbGV0ZS4gXG4gLSBVc2UgdGhlIHNwaW5uZXJzIHRvIGNob29zZQogICAgIGNhbWVyYSBhbmQgcmVzb2x1dGlvbiBjb21iaW5hdGlvbnMuIFRoZSBwbGF5YmFjayBzaG91bGQgYmUgc2ltaWxhcgotICAgIHRvIHdoYXQgeW91IHNhdyBpbiBwcmV2aWV3LiBcbiAtIEFmdGVyIGFsbCBwb3NzaWJsZSBjb21iaW5hdGlvbnMKLSAgICBhcmUgdGVzdGVkLCB0aGUgcGFzcyBidXR0b24gd2lsbCBiZSBlbmFibGVkLiBZb3UgbWF5IHByZXNzIHRoZSBwYXNzCi0gICAgYnV0dG9uIHRvIGluZGljYXRlIGEgcGFzcy4gXG4gLSBZb3UgbWF5IHByZXNzIGZhaWwgYnV0dG9uIGFueSB0aW1lIGR1cmluZwotICAgIHRoZSB0ZXN0IHRvIGluZGljYXRlIGZhaWx1cmUuCisgICAgdG8gd2hhdCB5b3Ugc2F3IGluIHByZXZpZXcuIFxuIC0gVGhlIG5leHQgYnV0dG9uIHRyaWdnZXJzIHRlc3QgZm9yIHRoZSBuZXh0CisgICAgdW50ZXN0ZWQgcmVzb2x1dGlvbiBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGNhbWVyYS4gLSBBZnRlciBhbGwgcG9zc2libGUKKyAgICBjb21iaW5hdGlvbnMgYXJlIHRlc3RlZCwgdGhlIHBhc3MgYnV0dG9uIHdpbGwgYmUgZW5hYmxlZC4gWW91IG1heSBwcmVzcyB0aGUKKyAgICBwYXNzIGJ1dHRvbiB0byBpbmRpY2F0ZSBhIHBhc3MuIFxuIC0gWW91IG1heSBwcmVzcyBmYWlsIGJ1dHRvbiBhbnkgdGltZQorICAgIGR1cmluZyB0aGUgdGVzdCB0byBpbmRpY2F0ZSBmYWlsdXJlLiBcbgogICAgIDwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idmlkZW9fY2FwdHVyZV9sYWJlbCI+VmlkZW8gY2FwdHVyZTwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idmlkZW9fcGxheWJhY2tfbGFiZWwiPlZpZGVvIHBsYXliYWNrPC9zdHJpbmc+CkBAIC0xMTgwLDkgKzEzMDgsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibm9fY2FtZXJhX21hbmFnZXIiPgogICAgICAgICBObyBjYW1lcmEgbWFuYWdlciBleGlzdHMhICBUaGlzIHRlc3QgZGV2aWNlIGlzIGluIGEgYmFkIHN0YXRlLgogICAgIDwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYWxsX2xlZ2FjeV9kZXZpY2VzIj4KLSAgICAgICAgQWxsIGNhbWVyYXMgb24gdGhpcyBkZXZpY2UgYXJlIExFR0FDWSBtb2RlIG9ubHkgLSBJVFMgdGVzdHMgYXJlIG9ubHkgcmVxdWlyZWQgb24gTElNSVRFRAotICAgICAgICBvciBiZXR0ZXIgZGV2aWNlcy4gIFBhc3MuCisgICAgPHN0cmluZyBuYW1lPSJhbGxfZXhlbXB0ZWRfZGV2aWNlcyI+CisgICAgICAgIEFsbCBjYW1lcmFzIG9uIHRoaXMgZGV2aWNlIGFyZSBleGVtcHRlZCBmcm9tIElUUyAtIFBhc3MuCiAgICAgPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJpdHNfdGVzdF9wYXNzZWQiPkFsbCBDYW1lcmEgSVRTIHRlc3RzIHBhc3NlZC4gIFBhc3MgYnV0dG9uIGVuYWJsZWQhPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJpdHNfdGVzdF9mYWlsZWQiPlNvbWUgQ2FtZXJhIElUUyB0ZXN0cyBmYWlsZWQuPC9zdHJpbmc+CkBAIC0xMzczLDkgKzE1MDAsOSBAQAogICAgICAgICBzdGFydCBpbiBhIHJvbGUsIGFuZCB0aGUgb3RoZXIgc2hvdWxkIHN0YXJ0IGluIHRoZSBjb21wbGVtZW50YXJ5CiAgICAgICAgIHJvbGUuIFlvdXIgZGV2aWNlIG11c3QgcGFzcyB0aGUgdGVzdHMgaW4gYWxsIHJvbGVzLgogICAgIDwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYXdhcmVfbm90X2VuYWJsZWQiPldpLUZpIGlzIG5vdCBlbmFibGVkPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJhd2FyZV9ub3RfZW5hYmxlZF9tZXNzYWdlIj5UaGVzZSB0ZXN0cyByZXF1aXJlIFdpLUZpIHRvIGJlIGVuYWJsZWQuCi0gICAgICAgIENsaWNrIHRoZSBidXR0b24gYmVsb3cgdG8gZ28gdG8gc3lzdGVtIHNldHRpbmdzIGFuZCBlbmFibGUgV2ktRmkuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhd2FyZV9ub3RfZW5hYmxlZCI+V2ktRmkgLyBMb2NhdGlvbiBNb2RlIGlzIG5vdCBlbmFibGVkPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhd2FyZV9ub3RfZW5hYmxlZF9tZXNzYWdlIj5UaGVzZSB0ZXN0cyByZXF1aXJlIFdpLUZpIGFuZCBMb2NhdGlvbiBNb2RlIHRvIGJlIGVuYWJsZWQuCisgICAgICAgIENsaWNrIHRoZSBidXR0b24gYmVsb3cgdG8gZ28gdG8gc3lzdGVtIHNldHRpbmdzIGFuZCBlbmFibGUgV2ktRmkgYW5kIExvY2F0aW9uIE1vZGUuPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhd2FyZV9zZXR0aW5ncyI+V2ktRmkgU2V0dGluZ3M8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImF3YXJlX3NldHVwX2Vycm9yIj4KICAgICAgICAgVGVzdCBmYWlsZWQuXG5cblNldCB1cCBlcnJvci4gQ2hlY2sgd2hldGhlciBXaS1GaSBpcyBlbmFibGVkLjwvc3RyaW5nPgpAQCAtMTM4Niw2ICsxNTEzLDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImF3YXJlX2RwX2liX3Bhc3NwaHJhc2VfdW5zb2xpY2l0ZWQiPkRhdGEgUGF0aDogUGFzc3BocmFzZTogVW5zb2xpY2l0ZWQvUGFzc2l2ZTwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYXdhcmVfZHBfaWJfb3Blbl9zb2xpY2l0ZWQiPkRhdGEgUGF0aDogT3BlbjogU29saWNpdGVkL0FjdGl2ZTwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYXdhcmVfZHBfaWJfcGFzc3BocmFzZV9zb2xpY2l0ZWQiPkRhdGEgUGF0aDogUGFzc3BocmFzZTogU29saWNpdGVkL0FjdGl2ZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYXdhcmVfZGlzY292ZXJ5X3JhbmdpbmciPkRpc2NvdmVyeSB3aXRoIFJhbmdpbmc8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImF3YXJlX3B1Ymxpc2giPlB1Ymxpc2g8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImF3YXJlX3N1YnNjcmliZSI+U3Vic2NyaWJlPC9zdHJpbmc+CiAKQEAgLTE0MDgsNiArMTUzNiw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJhd2FyZV9zdGF0dXNfcHVibGlzaF90aW1lb3V0Ij5QdWJsaXNoIGZhaWx1cmUgLSB0aW1lZCBvdXQhPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhd2FyZV9zdGF0dXNfcHVibGlzaF9udWxsX3Nlc3Npb24iPlB1Ymxpc2ggZmFpbHVyZSAtIG51bGwgc2Vzc2lvbiE8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImF3YXJlX3N0YXR1c19kaXNjb3ZlcnkiPlNlcnZpY2UgZGlzY292ZXJlZCAuLi48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImF3YXJlX3N0YXR1c19kaXNjb3Zlcnlfd2l0aF9pbmZvIj5TZXJ2aWNlIGRpc2NvdmVyZWQgLi4uIHBlZXIgTUFDIDogJTEkczwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYXdhcmVfc3RhdHVzX2Rpc2NvdmVyeV90aW1lb3V0Ij5TZXJ2aWNlIGRpc2NvdmVyeSBmYWlsdXJlIC0gdGltZWQgb3V0ITwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYXdhcmVfc3RhdHVzX2Rpc2NvdmVyeV9mYWlsIj5TZXJ2aWNlIGRpc2NvdmVyeSBmYWlsdXJlIC0gcGFyYW1ldGVyIG1pc21hdGNoITwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYXdhcmVfc3RhdHVzX3NlbmRfc3VjY2VzcyI+U2VudCBtZXNzYWdlIHN1Y2Nlc3NmdWxseSAuLi48L3N0cmluZz4KQEAgLTE0MTUsNiArMTU0NCw5IEBACiAgICAgPHN0cmluZyBuYW1lPSJhd2FyZV9zdGF0dXNfc2VuZF90aW1lb3V0Ij5TZW5kIG1lc3NhZ2UgZmFpbHVyZSAtIHRpbWVkIG91dCE8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImF3YXJlX3N0YXR1c19zZW5kX2ZhaWxfcGFyYW1ldGVyIj5TZW5kIG1lc3NhZ2UgZmFpbHVyZSAtIG1pc21hdGNoZWQgaWRzITwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYXdhcmVfc3RhdHVzX3JlY2VpdmVkIj5SZWNlaXZlZCBtZXNzYWdlIC4uLjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYXdhcmVfc3RhdHVzX3N0YXJ0aW5nX3J0dCI+U3RhcnRpbmcgUlRUIG9wZXJhdGlvbnMgLi4uPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhd2FyZV9zdGF0dXNfd2FpdGluZ19mb3JfcGVlcl9ydHQiPlBhdXNpbmcgdG8gbGV0IG90aGVyIGRldmljZSBwZXJmb3JtIFJUVCAuLi48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImF3YXJlX3N0YXR1c19yZWNlaXZlZF9wZWVyX3J0dF9kb25lIj5PdGhlciBkZXZpY2UgZG9uZSB3aXRoIFJUVCAuLi48L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImF3YXJlX3N0YXR1c19yZWNlaXZlZF9tYWMiPlJlY2VpdmVkIHBlZXIgTUFDIGFkZHJlc3M6ICUxJHMgLi4uPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhd2FyZV9zdGF0dXNfcmVjZWl2ZV90aW1lb3V0Ij5SZWNlaXZlIG1lc3NhZ2UgZmFpbHVyZSAtIHRpbWVkIG91dCE8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImF3YXJlX3N0YXR1c19yZWNlaXZlX2ZhaWx1cmUiPlJlY2VpdmUgbWVzc2FnZSBmYWlsdXJlIC0gZGlkblwndCByZWNlaXZlIGV4cGVjdGVkIG1lc3NhZ2UhPC9zdHJpbmc+CkBAIC0xNDIyLDYgKzE1NTQsMTEgQEAKICAgICA8c3RyaW5nIG5hbWU9ImF3YXJlX3N0YXR1c19uZXR3b3JrX3N1Y2Nlc3MiPk5ldHdvcmsgZm9ybWVkIC4uLjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYXdhcmVfc3RhdHVzX25ldHdvcmtfZmFpbGVkIj5OZXR3b3JrIHJlcXVlc3QgZmFpbHVyZSAtIHRpbWVkIG91dCE8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImF3YXJlX3N0YXR1c19zbGVlcGluZ193YWl0X2Zvcl9yZXNwb25kZXIiPlBhdXNpbmcgdG8gbGV0IFJlc3BvbmRlciB0aW1lIHRvIHNldCB1cCAuLi48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImF3YXJlX3N0YXR1c19yYW5naW5nX3BlZXJfZmFpbHVyZSI+UmFuZ2luZyB0byBQZWVySGFuZGxlIGZhaWx1cmU6ICUxJGQgZmFpbHVyZXMgb2YgJTIkZCBhdHRlbXB0cyE8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImF3YXJlX3N0YXR1c19yYW5naW5nX21hY19mYWlsdXJlIj5SYW5naW5nIHRvIE1BQyBhZGRyZXNzIGZhaWx1cmU6ICUxJGQgZmFpbHVyZXMgb2YgJTIkZCBhdHRlbXB0cyE8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImF3YXJlX3N0YXR1c19yYW5naW5nX3BlZXJfc3VjY2VzcyI+UmFuZ2luZyB0byBQZWVySGFuZGxlIHN1Y2Nlc3M6ICUxJGQgc3VjY2Vzc2VzIG9mICUyJGQgYXR0ZW1wdHMhPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhd2FyZV9zdGF0dXNfcmFuZ2luZ19tYWNfc3VjY2VzcyI+UmFuZ2luZyB0byBNQUMgYWRkcmVzcyBzdWNjZXNzOiAlMSRkIHN1Y2Nlc3NlcyBvZiAlMiRkIGF0dGVtcHRzITwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYXdhcmVfc3RhdHVzX2xpZmVjeWNsZV9mYWlsZWQiPkRpc2NvdmVyeSBsaWZlY3ljbGUgRkFJTFVSRSE8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImF3YXJlX3N0YXR1c19saWZlY3ljbGVfb2siPkRpc2NvdmVyeSBsaWZlY3ljbGUgdmFsaWRhdGVkITwvc3RyaW5nPgogCiAgICAgPHN0cmluZyBuYW1lPSJhd2FyZV9kYXRhX3BhdGhfb3Blbl91bnNvbGljaXRlZF9wdWJsaXNoIj5EYXRhIFBhdGg6IE9wZW46IFVuc29saWNpdGVkIFB1Ymxpc2g8L3N0cmluZz4KQEAgLTE0NDgsNiArMTU4NSwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0iYXdhcmVfZGF0YV9wYXRoX29vYl9wYXNzcGhyYXNlX3Jlc3BvbmRlcl9pbmZvIj5UaGUgcmVzcG9uZGVyIGlzIG5vdyByZWFkeS5cblxuT24gdGhlIG90aGVyIGRldmljZTogc3RhcnQgdGhlIFwnRGF0YSBQYXRoIChPT0IpOiBQYXNzcGhyYXNlXCcgLyBcJ0luaXRpYXRvclwnIHRlc3QuPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhd2FyZV9kYXRhX3BhdGhfb29iX3Bhc3NwaHJhc2VfaW5pdGlhdG9yIj5EYXRhIFBhdGggKE9PQik6IFBhc3NwaHJhc2U6IEluaXRpYXRvcjwvc3RyaW5nPgogCisgICAgPHN0cmluZyBuYW1lPSJhd2FyZV9kaXNjb3ZlcnlfcmFuZ2luZ19wdWJsaXNoIj5EaXNjb3Zlcnkgd2l0aCBSYW5naW5nOiBQdWJsaXNoPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhd2FyZV9kaXNjb3ZlcnlfcmFuZ2luZ19wdWJsaXNoX2luZm8iPlRoZSBwdWJsaXNoZXIgaXMgbm93IHJlYWR5LlxuXG5PbiB0aGUgb3RoZXIgZGV2aWNlOiBzdGFydCB0aGUgXCdEaXNjb3Zlcnkgd2l0aCBSYW5naW5nXCcgLyBcJ1N1YnNjcmliZVwnIHRlc3QuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhd2FyZV9kaXNjb3ZlcnlfcmFuZ2luZ19zdWJzY3JpYmUiPkRpc2NvdmVyeSB3aXRoIFJhbmdpbmc6IFN1YnNjcmliZTwvc3RyaW5nPgorCiAgICAgPHN0cmluZyBuYW1lPSJjYW1lcmFfZm92X2NhbGlicmF0aW9uIj5DYW1lcmEgRk9WIENhbGlicmF0aW9uPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYW1lcmFfZm92X2NhbGlicmF0aW9uX2RvbmUiPkRvbmU8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhbWVyYV9mb3ZfZ2VuZXJhbF9zZXR0aW5ncyI+R2VuZXJhbCBzZXR0aW5nczwvc3RyaW5nPgpAQCAtMTUyMCwxNyArMTY2MSwxNSBAQAogICAgIDxzdHJpbmcgbmFtZT0idGVzdF9tdXRlX2RuZF9hZmZlY3RlZF9zdHJlYW1zIj5UZXN0IG11dGUgc3RyZWFtczwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGVzdF9yaW5nZXJfbWFuYWdlciI+VGVzdCBSaW5ndG9uZU1hbmFnZXI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVuYWJsZV9zb3VuZF9lZmZlY3RzIj5QbGVhc2UgZW5hYmxlIHNvdW5kIGVmZmVjdHMgaW4gU291bmQgc2V0dGluZ3MuPC9zdHJpbmc+Ci0KICAgICA8c3RyaW5nIG5hbWU9ImF0dGVudGlvbl9yZWFkeSI+SVwnbSBkb25lPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhdHRlbnRpb25fZmlsdGVyX2FueSI+UGxlYXNlIGVuYWJsZSBcIkRvIG5vdCBkaXN0dXJiXCIgYnkgdGFwcGluZyB0aGUgUXVpY2sgU2V0dGluZ3MgdGlsZS48L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImF0dGVudGlvbl9maWx0ZXJfYWxsIj5QbGVhc2UgZGlzYWJsZSBcIkRvIG5vdCBkaXN0dXJiXCIgYnkgdGFwcGluZyB0aGUgUXVpY2sgU2V0dGluZ3MgdGlsZS48L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImF0dGVudGlvbl9maWx0ZXJfcHJpb3JpdHkiPlBsZWFzZSBzZWxlY3QgXCJQcmlvcml0eSBvbmx5XCIgaW4gdGhlIGRpYWxvZyB0aGF0IGFwcGVhcnMKLSAgICAgICAgd2hlbiB5b3UgdGFwIHRoZSBcIkRvIG5vdCBkaXN0dXJiXCIgdGlsZSBpbiBRdWljayBTZXR0aW5ncywgYW5kIGN1c3RvbWl6ZSB0aGUgc2V0dGluZyB0byBhbGxvdyBtZXNzYWdlcyBmcm9tCi0gICAgICAgIHN0YXJyZWQgY29udGFjdHMgb25seSBieSB0YXBwaW5nICJNb3JlIHNldHRpbmdzIi48L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImF0dGVudGlvbl9maWx0ZXJfYWxhcm1zIj5QbGVhc2Ugc2VsZWN0IFwiQWxhcm1zIG9ubHlcIiBpbiB0aGUgZGlhbG9nIHRoYXQgYXBwZWFycwotICAgICAgICB3aGVuIHlvdSB0YXAgdGhlIFwiRG8gbm90IGRpc3R1cmJcIiB0aWxlIGluIFF1aWNrIFNldHRpbmdzLjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYXR0ZW50aW9uX2ZpbHRlcl9ub25lIj5QbGVhc2Ugc2VsZWN0IFwiVG90YWwgc2lsZW5jZVwiIGluIHRoZSBkaWFsb2cgdGhhdCBhcHBlYXJzCi0gICAgICAgIHdoZW4geW91IHRhcCB0aGUgXCJEbyBub3QgZGlzdHVyYlwiIHRpbGUgaW4gUXVpY2sgU2V0dGluZ3MuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhdHRlbnRpb25fZmlsdGVyX3ByaW9yaXR5Ij5QbGVhc2UgZW5hYmxlIFwiRG8gbm90IGRpc3R1cmJcIiBieSB0YXBwaW5nIHRoZSBRdWljaworICAgICAgICBTZXR0aW5ncyB0aWxlLiAgVGhlbiwgbG9uZyBwcmVzcyB0aGUgc2FtZSB0aWxlIGFuZCBjdXN0b21pemUgdGhlIHNldHRpbmcgdG8gYWxsb3cgbWVzc2FnZXMKKyAgICAgICAgZnJvbSBzdGFycmVkIGNvbnRhY3RzIG9ubHkuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhdHRlbnRpb25fZmlsdGVyX3ByaW9yaXR5X21pbWljX2FsYXJtc19vbmx5Ij5QbGVhc2UgZW5hYmxlIFByaW9yaXR5LU9ubHkgXCJEbyBub3QgZGlzdHVyYlwiCisgICAgICAgIGJ5IHRhcHBpbmcgdGhlIFF1aWNrIFNldHRpbmdzIHRpbGUuICBUaGVuLCBsb25nIHByZXNzIHRoZSBzYW1lIHRpbGUgYW5kIGN1c3RvbWl6ZSB0aGUgc2V0dGluZyB0byBhbGxvdyBzb3VuZHMKKyAgICAgICAgZnJvbSBBbGFybXMgYW5kIE1lZGlhIChpZiBhcHBsaWNhYmxlKSBvbmx5Ljwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYXR0ZW50aW9uX2NyZWF0ZV9jb250YWN0cyI+Q3JlYXRlIGNvbnRhY3RzIGZvciBub3RpZmljYXRpb24gYW5ub3RhdGlvbnMuPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhdHRlbnRpb25fZGVsZXRlX2NvbnRhY3RzIj5EZWxldGUgdGVzdCBjb250YWN0cy48L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImF0dGVudGlvbl9kZWZhdWx0X29yZGVyIj5DaGVjayB0aGF0IHJhbmtlciBkZWZhdWx0cyB0byB0aW1lIG9yZGVyLjwvc3RyaW5nPgpAQCAtMTU0MSw5ICsxNjgwLDEzIEBACiAgICAgPHN0cmluZyBuYW1lPSJhdHRlbnRpb25fcGhvbmVfb3JkZXIiPkNoZWNrIHRoYXQgcmFua2VyIHJlc3BlY3RzIHRlbGVwaG9uZSBVUklzIGZvciBjb250YWN0cy48L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImF0dGVudGlvbl9pbnRlcnJ1cHRpb25fb3JkZXIiPkNoZWNrIHRoYXQgcmFua2VyIHRlbXBvcmFyaWx5IGJvb3N0cyBpbnRlcnJ1cHRpb25zLgogICAgIFRoaXMgdGVzdCB0YWtlcyAzMCBzZWNvbmRzIHRvIGNvbXBsZXRlLjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYXR0ZW50aW9uX25vbmVfYXJlX2ZpbHRlcmVkIj5DaGVjayB0aGF0IFwiQWxsXCIgbW9kZSBkb2VzblwndCBmaWx0ZXIgYW55IG5vdGlmaWNhdGlvbnMuPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJhdHRlbnRpb25fc29tZV9hcmVfZmlsdGVyZWQiPkNoZWNrIHRoYXQgXCJQcmlvcml0eVwiIG1vZGUgZG9lc25cJ3QgZmlsdGVyIHByaW9yaXR5IG5vdGlmaWNhdGlvbnMuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhdHRlbnRpb25fbm9uZV9hcmVfZmlsdGVyZWRfbWVzc2FnZXMiPkNoZWNrIHRoYXQgXCJBbGxcIiBtb2RlIGRvZXNuXCd0IGZpbHRlciBhbnkgbm90aWZpY2F0aW9ucyAobWVzc2FnZXMpLjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYXR0ZW50aW9uX25vbmVfYXJlX2ZpbHRlcmVkX2RpZmZfY2F0ZWdvcmllcyI+Q2hlY2sgdGhhdCBcIkFsbFwiIG1vZGUgZG9lc25cJ3QgZmlsdGVyIGFueSBub3RpZmljYXRpb25zIChldmVudCwgcmVtaW5kZXIsIGFsYXJtKS48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImF0dGVudGlvbl9zb21lX2FyZV9maWx0ZXJlZF9tZXNzYWdlcyI+Q2hlY2sgdGhhdCBcIlByaW9yaXR5XCIgbW9kZSBkb2VzblwndCBmaWx0ZXIgcHJpb3JpdHkgbm90aWZpY2F0aW9ucyAobWVzc2FnZXMgZnJvbSBzdGFycmVkIGNvbnRhY3RzKS48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImF0dGVudGlvbl9zb21lX2FyZV9maWx0ZXJlZF9hbGFybXMiPkNoZWNrIHRoYXQgXCJQcmlvcml0eVwiIG1vZGUgZG9lc25cJ3QgZmlsdGVyIHByaW9yaXR5IG5vdGlmaWNhdGlvbnMgKGFsYXJtcykuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhdHRlbnRpb25fc29tZV9hcmVfZmlsdGVyZWRfbWVkaWFfc3lzdGVtX290aGVyIj5DaGVjayB0aGF0IFwiUHJpb3JpdHlcIiBtb2RlIGRvZXNuXCd0IGZpbHRlciBwcmlvcml0eSBub3RpZmljYXRpb25zIChtZWRpYSwgc3lzdGVtLCBvdGhlcikuPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhdHRlbnRpb25fYWxsX2FyZV9maWx0ZXJlZCI+Q2hlY2sgdGhhdCBcIk5vbmVcIiBtb2RlIGZpbHRlcnMgYWxsIG5vdGlmaWNhdGlvbnMuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhdHRlbnRpb25fY2Fubm90X2Rpc2FsbG93X2FsYXJtc19vcl9tZWRpYSI+Q2hlY2sgdGhhdCBhcHBzIHRhcmdldGVkIHdpdGggUHJlLVAgU0RLIGNhblwndCBkaXNhbGxvdyBhbGFybXMgb3IgbWVkaWEgZnJvbSBieXBhc3NpbmcgRE5ELjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibmxzX3Rlc3QiPk5vdGlmaWNhdGlvbiBMaXN0ZW5lciBUZXN0PC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJuYXNfdGVzdCI+Tm90aWZpY2F0aW9uIEFzc2lzdGFudCBUZXN0PC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJubHNfc2VydmljZV9uYW1lIj5Ob3RpZmljYXRpb24gTGlzdGVuZXIgZm9yIENUUyBWZXJpZmllcjwvc3RyaW5nPgpAQCAtMTU4MCw2ICsxNzIzLDEwIEBACiAgICAgICAgIHVuZGVyIEFwcHMgPiBHZWFyIEljb24gPiBEZWZhdWx0ID4gTm90aWZpY2F0aW9uIEFzc2lzdGFudCBhbmQgcmV0dXJuIGhlcmUuPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJubHNfZW5hYmxlX3NlcnZpY2UiPlBsZWFzZSBlbmFibGUgXCJOb3RpZmljYXRpb24gTGlzdGVuZXIgZm9yIENUUyBWZXJpZmllclwiCiAgICAgICAgIHVuZGVyIEFwcHMgPiBHZWFyIEljb24gPiBTcGVjaWFsIEFjY2VzcyA+IE5vdGlmaWNhdGlvbiBBY2Nlc3MgYW5kIHJldHVybiBoZXJlLjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmxzX2Jsb2NrX2FwcCI+UGxlYXNlIGJsb2NrIHRoZSBsaW5rZWQgYXBwbGljYXRpb24gYW5kIHJldHVybiBoZXJlLjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmxzX3VuYmxvY2tfYXBwIj5QbGVhc2UgdW5ibG9jayB0aGUgbGlua2VkIGFwcGxpY2F0aW9uIGFuZCByZXR1cm4gaGVyZS48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5sc19ibG9ja19jaGFubmVsIj5QbGVhc2UgYmxvY2sgdGhlIGxpbmtlZCBub3RpZmljYXRpb24gY2hhbm5lbCBhbmQgcmV0dXJuIGhlcmUuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJubHNfYmxvY2tfZ3JvdXAiPlBsZWFzZSBibG9jayB0aGUgbGlua2VkIG5vdGlmaWNhdGlvbiBjaGFubmVsIGdyb3VwIGFuZCByZXR1cm4gaGVyZS48L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im5sc19jYW5ub3RfZW5hYmxlX3NlcnZpY2UiPlBsZWFzZSBtYWtlIHN1cmUgeW91IGNhbm5vdCBlbmFibGUKICAgICAgICAgXCJOb3RpZmljYXRpb24gTGlzdGVuZXIgZm9yIENUUyBWZXJpZmllclwiIGFuZCByZXR1cm4gaGVyZS48L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im5sc19kaXNhYmxlX3NlcnZpY2UiPlBsZWFzZSBkaXNhYmxlIFwiTm90aWZpY2F0aW9uIExpc3RlbmVyIGZvciBDVFMgVmVyaWZpZXJcIgpAQCAtMTU5OCw2ICsxNzQ1LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9Im5hc19zbm9vemVfY29udGV4dCI+Q2hlY2sgdGhhdCB0aGUgQXNzaXN0YW50IGNhbiBzbm9vemUgYSBub3RpZmljYXRpb24gdW50aWwgYSBnaXZlbiBjb250ZXh0Ljwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibmxzX2NsZWFyX29uZSI+Q2hlY2sgdGhhdCBzZXJ2aWNlIGNhbiBjbGVhciBhIG5vdGlmaWNhdGlvbi48L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im5sc19jbGVhcl9vbmVfcmVhc29uIj5DaGVjayB0aGF0IHNlcnZpY2UgY2FuIGNsZWFyIGEgbm90aWZpY2F0aW9uIGFuZCByZWNlaXZlIHRoZSBjb3JyZWN0IHJlYXNvbiBmb3IgZGlzbWlzc2FsLjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmxzX2NsZWFyX29uZV9zdGF0cyI+Q2hlY2sgdGhhdCBzZXJ2aWNlIGRvZXMgbm90IHJlY2VpdmUgbm90aWZpY2F0aW9uIHN0YXRzLjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibmxzX2NsZWFyX2FsbCI+Q2hlY2sgdGhhdCBzZXJ2aWNlIGNhbiBjbGVhciBhbGwgbm90aWZpY2F0aW9ucy48L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im5sc19zZXJ2aWNlX3N0b3BwZWQiPlNlcnZpY2Ugc2hvdWxkIHN0b3Agb25jZSBkaXNhYmxlZC48L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im5sc19ub3RlX21pc3NlZCI+Q2hlY2sgdGhhdCBub3RpZmljYXRpb24gd2FzIG5vdCByZWNlaXZlZC48L3N0cmluZz4KQEAgLTE2MjksNTcgKzE3NzcsNiBAQAogICAgIDxzdHJpbmcgbmFtZT0iY3BfZ2V0X3J1bGVzIj5SZXRyaWV2aW5nIEF1dG9tYXRpYyBaZW4gUnVsZXM8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNwX2dldF9ydWxlIj5SZXRyaWV2aW5nIEF1dG9tYXRpYyBaZW4gUnVsZTwvc3RyaW5nPgogCi0gICAgPHN0cmluZyBuYW1lPSJsb2NhdGlvbl9tb2RlX2hpZ2hfYWNjdXJhY3lfdGVzdCI+SGlnaCBBY2N1cmFjeSBNb2RlIFRlc3Q8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImxvY2F0aW9uX21vZGVfaGlnaF9hY2N1cmFjeV9pbmZvIj4KLSAgICAgICAgVGhpcyB0ZXN0IGNoZWNrcyB0aGF0IHRoZSBMb2NhdGlvbiBNb2RlIEFQSSBpcyBjb25zaXN0ZW50IHdpdGggdGhlCi0gICAgICAgIExvY2F0aW9uIFByb3ZpZGVyIEFQSSB3aGVuIHRoZSBkZXZpY2UgaXMgaW4gSGlnaCBBY2N1cmFjeSBsb2NhdGlvbiBtb2RlLgotICAgIDwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibG9jYXRpb25fbW9kZV9zZWxlY3RfaGlnaF9hY2N1cmFjeSI+Ci0gICAgICAgIFBsZWFzZSBzZWxlY3QgdGhlIFwiSGlnaCBhY2N1cmFjeVwiIG1vZGUgYXQgU2V0dGluZ3MgPiBMb2NhdGlvbgotICAgICAgICAoaGludDogdGFwIHRoZSAiTW9kZSIgaXRlbSkgYW5kIHJldHVybiBoZXJlLgotICAgIDwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibG9jYXRpb25fbW9kZV9iYXR0ZXJ5X3NhdmluZ190ZXN0Ij5CYXR0ZXJ5IFNhdmluZyBNb2RlIFRlc3Q8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImxvY2F0aW9uX21vZGVfYmF0dGVyeV9zYXZpbmdfaW5mbyI+Ci0gICAgICAgIFRoaXMgdGVzdCBjaGVja3MgdGhhdCB0aGUgTG9jYXRpb24gTW9kZSBBUEkgaXMgY29uc2lzdGVudCB3aXRoIHRoZQotICAgICAgICBMb2NhdGlvbiBQcm92aWRlciBBUEkgd2hlbiB0aGUgZGV2aWNlIGlzIGluIEJhdHRlcnkgU2F2aW5nIGxvY2F0aW9uIG1vZGUuCi0gICAgPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsb2NhdGlvbl9tb2RlX3NlbGVjdF9iYXR0ZXJ5X3NhdmluZyI+Ci0gICAgICAgIFBsZWFzZSBzZWxlY3QgdGhlIFwiQmF0dGVyeSBTYXZpbmdcIiBtb2RlIGF0IFNldHRpbmdzID4gTG9jYXRpb24KLSAgICAgICAgKGhpbnQ6IHRhcCB0aGUgIk1vZGUiIGl0ZW0pIGFuZCByZXR1cm4gaGVyZS4KLSAgICA8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImxvY2F0aW9uX21vZGVfZGV2aWNlX29ubHlfdGVzdCI+RGV2aWNlIE9ubHkgTW9kZSBUZXN0PC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsb2NhdGlvbl9tb2RlX2RldmljZV9vbmx5X2luZm8iPgotICAgICAgICBUaGlzIHRlc3QgY2hlY2tzIHRoYXQgdGhlIExvY2F0aW9uIE1vZGUgQVBJIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUKLSAgICAgICAgTG9jYXRpb24gUHJvdmlkZXIgQVBJIHdoZW4gdGhlIGRldmljZSBpcyBpbiBEZXZpY2UgT25seSBsb2NhdGlvbiBtb2RlLgotICAgIDwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibG9jYXRpb25fbW9kZV9zZWxlY3RfZGV2aWNlX29ubHkiPgotICAgICAgICBQbGVhc2Ugc2VsZWN0IHRoZSBcIkRldmljZSBPbmx5XCIgbW9kZSBhdAotICAgICAgICBTZXR0aW5ncyA+IExvY2F0aW9uIChoaW50OiB0YXAgdGhlICJNb2RlIiBpdGVtKSBhbmQgcmV0dXJuIGhlcmUuCi0gICAgPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsb2NhdGlvbl9tb2RlX29mZl90ZXN0Ij5Mb2NhdGlvbiBNb2RlIE9mZiBUZXN0PC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsb2NhdGlvbl9tb2RlX29mZl9pbmZvIj4KLSAgICAgICAgVGhpcyB0ZXN0IGNoZWNrcyB0aGF0IHRoZSBMb2NhdGlvbiBNb2RlIEFQSSBpcyBjb25zaXN0ZW50IHdpdGggdGhlCi0gICAgICAgIExvY2F0aW9uIFByb3ZpZGVyIEFQSSB3aGVuIHRoZSBkZXZpY2UgaXMgaW4gdGhlIE9mZiBsb2NhdGlvbiBtb2RlLgotICAgIDwvc3RyaW5nPgotCi0gICAgPHN0cmluZyBuYW1lPSJsb2NhdGlvbl9tb2RlX3N0YXJ0X3NldHRpbmdzIj5MYXVuY2ggU2V0dGluZ3M8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImxvY2F0aW9uX21vZGVfdHVybl9vbiI+Ci0gICAgICAgIFBsZWFzZSB0dXJuIE9OIGxvY2F0aW9uIGFjY2VzcyAodGhlIHN3aXRjaCBhdCB0aGUgdG9wIG9mIFNldHRpbmdzID4gTG9jYXRpb24pCi0gICAgICAgIGFuZCByZXR1cm4gaGVyZS4KLSAgICA8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImxvY2F0aW9uX21vZGVfdHVybl9vZmYiPgotICAgICAgICBQbGVhc2UgdHVybiBPRkYgbG9jYXRpb24gYWNjZXNzICh0aGUgc3dpdGNoIGF0IHRoZSB0b3Agb2YgU2V0dGluZ3MgPiBMb2NhdGlvbikKLSAgICAgICAgYW5kIHJldHVybiBoZXJlLgotICAgIDwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibG9jYXRpb25fbW9kZV9zZWN1cmVfZ3BzX29uIj5HUFMgcHJvdmlkZXIgc2hvdWxkIGJlIE9OIGluIHNlY3VyZSBzZXR0aW5ncy48L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImxvY2F0aW9uX21vZGVfc2VjdXJlX2dwc19vZmYiPkdQUyBwcm92aWRlciBzaG91bGQgYmUgT0ZGIGluIHNlY3VyZSBzZXR0aW5ncy48L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImxvY2F0aW9uX21vZGVfc2VjdXJlX25scF9vbiI+TmV0d29yayBsb2NhdGlvbiBwcm92aWRlciBzaG91bGQgYmUgT04gaW4gc2VjdXJlIHNldHRpbmdzLjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibG9jYXRpb25fbW9kZV9zZWN1cmVfbmxwX29mZiI+TmV0d29yayBsb2NhdGlvbiBwcm92aWRlciBzaG91bGQgYmUgT0ZGIGluIHNlY3VyZSBzZXR0aW5ncy48L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImxvY2F0aW9uX21vZGVfbWFuYWdlcl9ncHNfb24iPkdQUyBwcm92aWRlciBzaG91bGQgYmUgT04gaW4gTG9jYXRpb25NYW5hZ2VyLjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibG9jYXRpb25fbW9kZV9tYW5hZ2VyX2dwc19vZmYiPkdQUyBwcm92aWRlciBzaG91bGQgYmUgT0ZGIGluIExvY2F0aW9uTWFuYWdlci48L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImxvY2F0aW9uX21vZGVfbWFuYWdlcl9ubHBfb24iPk5ldHdvcmsgbG9jYXRpb24gcHJvdmlkZXIgc2hvdWxkIGJlIE9OIGluIExvY2F0aW9uTWFuYWdlci48L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImxvY2F0aW9uX21vZGVfbWFuYWdlcl9ubHBfb2ZmIj5OZXR3b3JrIGxvY2F0aW9uIHByb3ZpZGVyIHNob3VsZCBiZSBPRkYgaW4gTG9jYXRpb25NYW5hZ2VyLjwvc3RyaW5nPgotCiAgICAgPHN0cmluZyBuYW1lPSJjYWNlcnRfdGVzdCI+Q0EgQ2VydCBOb3RpZmljYXRpb24gVGVzdDwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FjZXJ0X2luZm8iPlRoaXMgdGVzdCBjaGVja3MgdGhhdCB3aGVuIGEgQ0EgQ2VydGlmaWNhdGUgaXMgaW5zdGFsbGVkLCB0aGUgdXNlciBpcyBub3RpZmllZC48L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhY2VydF9kb19zb21ldGhpbmciPkRvIGl0PC9zdHJpbmc+CkBAIC0xODgzLDYgKzE5ODAsNyBAQAogICAgICAgICA0LiBWZXJpZnkgdGhhdCB0aGUgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgcmVtYWluaW5nIGltYWdlIGlzIGJsdWUuXG4KICAgICAgICAgNS4gVmVyaWZ5IHRoYXQgdGhlIGhlYWRlciB0ZXh0IHNheXMgXCJDdHNWZXJpZmllclwiLlxuCiAgICAgICAgIDYuIENvbmZpcm0geW91ciBjcmVkZW50aWFscyBhbmQgdmVyaWZ5IHRoYXQgdGhlIGNyZWRlbnRpYWxzIHlvdSBlbnRlcmVkIHByZXZpb3VzbHkgd29yay4KKyAgICAgICAgNy4gVGhlIHdvcmsgYXBwIHNob3VsZCBiZSBsYXVuY2hlZC4KICAgICA8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InByb3Zpc2lvbmluZ19ieW9kX2NvbmZpcm1fd29ya19jcmVkZW50aWFsc19oZWFkZXIiPgogICAgICAgICBDdHNWZXJpZmllcgpAQCAtMTkwOCw3ICsyMDA2LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InByb3Zpc2lvbmluZ19ieW9kX3JlY2VudHNfdmVyaWZ5X3JlZGFjdGVkX2luc3RydWN0aW9uIj4KICAgICAgICAgMSkgRm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgb24tc2NyZWVuIHRvIHNldCBhIHdvcmsgcGFzc3dvcmQuXG4KICAgICAgICAgMikgVHVybiB0aGUgc2NyZWVuIG9mZiBhbmQgb24gYWdhaW4sIG9yIHVzZSB0aGUgImxvY2sgbm93IiBidXR0b24sIHRvIGxvY2sgdGhlIHdvcmsgcHJvZmlsZS5cbgotICAgICAgICAzKSBPcGVuIFJlY2VudHMuXG4KKyAgICAgICAgMykgR28gdG8gaG9tZSBzY3JlZW4gYW5kIHRoZW4gb3BlbiBSZWNlbnRzLlxuCiAgICAgICAgIDQpIENvbmZpcm0gdGhhdCB0aGlzICJDVFMgVmVyaWZpZXIiIGFjdGl2aXR5IGlzIHNob3duIGluIFJlY2VudHMuXG4KICAgICAgICAgNSkgQ29uZmlybSB0aGF0IHRoZSBjb250ZW50cyBvZiB0aGUgYWN0aXZpdHkgPGI+YXJlPC9iPiBoaWRkZW4uXG4KICAgICAgICAgNikgUmV0dXJuIHRvIHRoaXMgcGFnZSBhbmQgcGFzcyB0aGUgdGVzdC4KQEAgLTE5MjcsNiArMjAyNSwzNSBAQAogICAgICAgICBUaGUgd29yayBwcm9maWxlIHN0aWxsIGhhcyBhIHNlcGFyYXRlIHBhc3N3b3JkLiBQbGVhc2UgcmVtb3ZlIHRoaXMgYmVmb3JlIGNvbnRpbnVpbmcuCiAgICAgPC9zdHJpbmc+CiAKKyAgICA8c3RyaW5nIG5hbWU9InByb3Zpc2lvbmluZ19ieW9kX2tleWNoYWluIj5LZXlDaGFpbiB0ZXN0PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwcm92aXNpb25pbmdfYnlvZF9rZXljaGFpbl9pbmZvX3N0YXJ0Ij4KKyAgICAgICAgSW4gdGhpcyB0ZXN0LCB5b3VcJ2xsIHZlcmlmeSB0aGF0IGtleXMgZ2VuZXJhdGVkIGJ5IEtleUNoYWluIGtleXMgYXJlIGFzIHVzYWJsZSBhcyBrZXlzCisgICAgICAgIGluc3RhbGxlZCBpbnRvIEtleUNoYWluIGFuZCB0aGF0IHRoZXkgY2FuIGJlIGhpZGRlbiBmcm9tIHVzZXJzLlxuCisgICAgICAgIFRoZSB0ZXN0IGhhcyB0d28gcGFydHM6XG4KKyAgICAgICAgMSkgVGVzdGluZyB0aGF0IGEgZ2VuZXJhdGVkIGtleSBjYW4gYmUgc2VsZWN0YWJsZSBieSB0aGUgdXNlci5cbgorICAgICAgICAyKSBUZXN0aW5nIHRoYXQgYSBnZW5lcmF0ZWQga2V5IGNhbiBiZSBoaWRkZW4gZnJvbSB1c2Vycy5cbgorICAgICAgICBcbgorICAgICAgICBUYXAgXCJQcmVwYXJlIFRlc3RcIiBidXR0b24gYmVsb3cgdG8gYmVnaW4uXG4KKyAgICAgICAgXG4KKyAgICAgICAgTk9URTogQSBzY3JlZW4gbG9jayBtdXN0IGJlIGNvbmZpZ3VyZWQgZm9yIHRoaXMgdGVzdC4gT3RoZXJ3aXNlLCB0ZXN0IHByZXBhcmF0aW9uCisgICAgICAgIHdpbGwgZmFpbCB0byBnZW5lcmF0ZSBhIGtleSBmb3IgdXNlIGJ5IHRoZSB0ZXN0LgorICAgIDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icHJvdmlzaW9uaW5nX2J5b2Rfa2V5Y2hhaW5faW5mb19maXJzdF90ZXN0Ij4KKyAgICAgICAgT25jZSB5b3UgcHJlc3MgXCdHb1wnLCBhIHByb21wdCB0aXRsZWQgXCJDaG9vc2UgY2VydGlmaWNhdGVcIiBzaG91bGQgYXBwZWFyLlxuCisgICAgICAgIFZlcmlmeSB0aGF0IHRoZSBsaXN0IGluIHRoaXMgZGlhbG9nIGhhcyBvbmUgaXRlbSwgc3RhcnRpbmcgd2l0aCBcJ2N0cy12ZXJpZmllci1nZW5cJy4KKyAgICAgICAgUHJlc3MgXCdTZWxlY3RcJyB0byBzZWxlY3QgaXQuXG4KKyAgICAgICAgSWYgdGhlIHRlc3QgcGFzc2VzLCB5b3VcJ2xsIHNlZSB0aGUgdGV4dCBcIlNlY29uZCB0ZXN0IHJlYWR5XCIgYXQgdGhlIGJvdHRvbS5cbgorICAgICAgICBcbgorICAgICAgICBQcmVzcyBcJ0dvXCcuXG4KKyAgICA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InByb3Zpc2lvbmluZ19ieW9kX2tleWNoYWluX2luZm9fc2Vjb25kX3Rlc3QiPgorICAgICAgICBPbmNlIHlvdSBwcmVzcyBcJ1J1biAybmQgdGVzdFwnLCB0aGUgc2FtZSBwcm9tcHQgc2hvdWxkIGFwcGVhciBhZ2Fpbi5cbgorICAgICAgICBUaGlzIHRpbWUsIHZlcmlmeSB0aGF0IHRoZSB0aXRsZSBpcyBcIk5vIGNlcnRpZmljYXRlcyBmb3VuZFwiIGFuZCB0aGUgbGlzdCBpcyBlbXB0eSwKKyAgICAgICAgdGhlbiBwcmVzcyBcJ0NhbmNlbFwnLlxuCisgICAgICAgIFxuCisgICAgICAgIE1hcmsgdGhlIHRlc3QgYXMgcGFzc2VkIGlmIHRoZSB0ZXh0IGF0IHRoZSBib3R0b20gc2hvd3MgXCJQQVNTRUQgKDIvMilcIlxuCisgICAgPC9zdHJpbmc+CisKICAgICA8IS0tIFN0cmluZ3MgZm9yIERlc2tDbG9jayAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImRlc2tjbG9ja190ZXN0cyI+QWxhcm1zIGFuZCBUaW1lcnMgVGVzdHM8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRlc2tjbG9ja190ZXN0c19pbmZvIj4KQEAgLTIzMTAsNyArMjQzNywxMyBAQAogICAgICAgICAtIEJvdGggUGVyc29uYWwgYW5kIFdvcmsgY2F0ZWdvcmllcyBleGlzdC5cbgogICAgICAgICAtIFwiUmVtb3ZlIHdvcmsgcHJvZmlsZVwiIG9yIFwiVW5pbnN0YWxsXCIgZXhpc3RzIHVuZGVyIHRoZSBXb3JrIGNhdGVnb3J5LlxuCiAgICAgICAgIFxuCi0gICAgICAgIEZ1cnRoZXJtb3JlLCB2ZXJpZnkgdGhhdDpcbgorICAgICAgICBVc2UgdGhlIEJhY2sgYnV0dG9uIChvciBuYXZpZ2F0ZSBiYWNrIHRvIHRoaXMgYXBwIHVzaW5nIFJlY2VudHMpIHRvIHJldHVybiB0byB0aGlzIHBhZ2UuCisgICAgPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwcm92aXNpb25pbmdfYnlvZF91c2VyX3NldHRpbmdzIj5Qcm9maWxlLWF3YXJlIHVzZXIgc2V0dGluZ3M8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InByb3Zpc2lvbmluZ19ieW9kX3VzZXJfc2V0dGluZ3NfaW5zdHJ1Y3Rpb24iPgorICAgICAgICBQbGVhc2UgcHJlc3MgdGhlIEdvIGJ1dHRvbiB0byBvcGVuIHRoZSBTZXR0aW5ncyBwYWdlLgorICAgICAgICAoSWYgdGhpcyBkZXZpY2UgaGFzIGEgc2VwYXJhdGUgYXBwIGZvciB3b3JrIHNldHRpbmdzLCBpZ25vcmUgdGhlIEdvIGJ1dHRvbiBhbmQgb3BlbiB0aGF0IGFwcCBtYW51YWxseSBmcm9tIHRoZSBsYXVuY2hlci4pXG4KKyAgICAgICAgTmF2aWdhdGUgdG8gQWNjb3VudHMgYW5kIGNvbmZpcm0gdGhhdDpcbgogICAgICAgICAtIFRoZXJlIGFyZSB0d28gYXV0by1zeW5jIG9wdGlvbnMgcHJlc2VudCwgb25lIGZvciBwZXJzb25hbCBhbmQgb25lIGZvciB3b3JrIGRhdGEgKGVpdGhlciBvbiB0aGUgc2NyZWVuIG9yIGluIHRoZSBvdmVyZmxvdyBtZW51KS5cbgogICAgICAgICAtIERlLXNlbGVjdGluZyBlaXRoZXIgb3B0aW9uIHByb21wdHMgYSB3YXJuaW5nIGRpYWxvZy5cbgogICAgICAgICBcbgpAQCAtMjQxNSw5ICsyNTQ4LDkgQEAKICAgICA8c3RyaW5nIG5hbWU9InByb3Zpc2lvbmluZ19ieW9kX25mY19iZWFtX2FsbG93ZWRfaW5zdHJ1Y3Rpb24iPgogICAgICAgICBQbGVhc2UgcHJlc3MgdGhlIEdvIGJ1dHRvbiB0byB0ZXN0IGlmIE5mYyBiZWFtIGNhbiBiZSB0cmlnZ2VyZWQgaW4gdGhlIHdvcmsgcHJvZmlsZS5cbgogICAgICAgICBcbgotICAgICAgICBGb3IgdGhlIGZpcnN0IHRlc3QsIHByZXNzIFwiU2VuZCBtYW51YWwgYmVhbVwiIHRvIHRyaWdnZXIgYSBiZWFtLCB0aGVuIGJ1bXAgaW50byBhbm90aGVyIGRldmljZSB0byBzZW5kIHRoZSBmaWxlLiBWZXJpZnkgdGhhdCB0aGUgZmlsZSBpcyBzdWNjZXNzZnVsbHkgcmVjZWl2ZWQuXG4KKyAgICAgICAgRm9yIHRoZSBmaXJzdCB0ZXN0LCBwcmVzcyBcIlNlbmQgbWFudWFsIGJlYW1cIiB0byB0cmlnZ2VyIGEgYmVhbSwgdGhlbiBidW1wIGludG8gYW5vdGhlciBkZXZpY2UgdG8gc2VuZCB0aGUgdGFnLiBWZXJpZnkgdGhhdCB0aGUgdGFnIGlzIHN1Y2Nlc3NmdWxseSByZWNlaXZlZC5cbgogICAgICAgICBcbgotICAgICAgICBGb3IgdGhlIHNlY29uZCB0ZXN0LCBwcmVzcyBcIlNlbmQgc2hhcmUgaW50ZW50XCIgdG8gdHJpZ2dlciBhIGJlYW0sIHRoZW4gYnVtcCBpbnRvIGFub3RoZXIgZGV2aWNlIHRvIHNlbmQgdGhlIGZpbGUuIFZlcmlmeSB0aGF0IHRoZSBmaWxlIGlzIHN1Y2Nlc3NmdWxseSByZWNlaXZlZC5cbgorICAgICAgICBGb3IgdGhlIHNlY29uZCB0ZXN0LCBwcmVzcyBcIlNlbmQgc2hhcmUgaW50ZW50XCIgdG8gdHJpZ2dlciBhIGJlYW0sIHRoZW4gYnVtcCBpbnRvIGFub3RoZXIgZGV2aWNlIHRvIHNlbmQgdGhlIHRhZy4gVmVyaWZ5IHRoYXQgdGhlIHRhZyBpcyBzdWNjZXNzZnVsbHkgcmVjZWl2ZWQuXG4KICAgICAgICAgXG4KICAgICAgICAgVGhlbiB1c2UgdGhlIEJhY2sgYnV0dG9uIHRvIHJldHVybiB0byB0aGlzIHRlc3QgYW5kIG1hcmsgYWNjb3JkaW5nbHkuCiAgICAgPC9zdHJpbmc+CkBAIC0yNDc4LDU3ICsyNjExLDUyIEBACiAgICAgICAgIDMuIEdvIGJhY2sgdG8gdGhlIGN0cy12ZXJpZmllciB0ZXN0cyB1c2luZyB0aGUgYmFjayBidXR0b24sIHRoZW4gbWFyayB0aGUgdGVzdCBhY2NvcmRpbmdseS5cbgogICAgIDwvc3RyaW5nPgogCi0gICAgPHN0cmluZyBuYW1lPSJwcm92aXNpb25pbmdfYnlvZF90dXJuX29mZl93b3JrIj5UdXJuIG9mZiB3b3JrIG1vZGU8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InByb3Zpc2lvbmluZ19ieW9kX3R1cm5fb2ZmX3dvcmtfaW5mbyI+VGhpcyB0ZXN0IHZlcmlmaWVzIGRldmljZSBiZWhhdmlvcnMgd2hlbiB0dXJuaW5nIG9mZiB3b3JrIG1vZGUuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwcm92aXNpb25pbmdfYnlvZF90dXJuX29mZl93b3JrIj5UdXJuIG9mZiB3b3JrIHByb2ZpbGU8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InByb3Zpc2lvbmluZ19ieW9kX3R1cm5fb2ZmX3dvcmtfaW5mbyI+VGhpcyB0ZXN0IHZlcmlmaWVzIGRldmljZSBiZWhhdmlvcnMgd2hlbiB0dXJuaW5nIG9mZiB3b3JrIHByb2ZpbGUuPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwcm92aXNpb25pbmdfYnlvZF90dXJuX29mZl93b3JrX2luc3RydWN0aW9ucyI+CiAgICAgICAgIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGUgZGV2aWNlIGJlaGF2aW9yIHdoZW4gd29yayBwcm9maWxlIGlzIHR1cm5lZCBvZmYuXG4KICAgICAgICAgUGxlYXNlIGV4ZXJjaXNlIHRoZSBmb2xsb3dpbmcgdGVzdHMgaW4gc2VxdWVuY2UuXG4KLSAgICAgICAgVGhlIGJ1dHRvbiBiZWxvdyBjYW4gYmUgdXNlZCB0byBvcGVuIHRoZSBTZXR0aW5ncyBwYWdlIHdoZXJlIHlvdSBjYW4gdG9nZ2xlIHdvcmsgbW9kZS5cbgorICAgICAgICBUaGUgYnV0dG9uIGJlbG93IGNhbiBiZSB1c2VkIHRvIG9wZW4gdGhlIFNldHRpbmdzIHBhZ2Ugd2hlcmUgeW91IGNhbiB0b2dnbGUgd29yayBwcm9maWxlLlxuCiAgICAgICAgIChJZiB0aGlzIGRldmljZSBoYXMgYSBzZXBhcmF0ZSBhcHAgZm9yIHdvcmsgc2V0dGluZ3MsIGlnbm9yZSB0aGUgYnV0dG9uIGFuZCBvcGVuIHRoYXQgYXBwIG1hbnVhbGx5IGZyb20gdGhlIGxhdW5jaGVyKS5cbgogICAgIDwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icHJvdmlzaW9uaW5nX2J5b2RfdHVybl9vZmZfd29ya19wcmVwYXJlX2J1dHRvbiI+T3BlbiBTZXR0aW5ncyB0byB0b2dnbGUgd29yayBtb2RlPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwcm92aXNpb25pbmdfYnlvZF90dXJuX29mZl93b3JrX3ByZXBhcmVfYnV0dG9uIj5PcGVuIFNldHRpbmdzIHRvIHRvZ2dsZSB3b3JrIHByb2ZpbGU8L3N0cmluZz4KIAogICAgIDxzdHJpbmcgbmFtZT0icHJvdmlzaW9uaW5nX2J5b2RfdHVybl9vZmZfd29ya19wcmVwYXJlX25vdGlmaWNhdGlvbnMiPlByZXBhcmUgYSB3b3JrIG5vdGlmaWNhdGlvbjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icHJvdmlzaW9uaW5nX2J5b2RfdHVybl9vZmZfd29ya19wcmVwYXJlX25vdGlmaWNhdGlvbnNfaW5zdHJ1Y3Rpb24iPgogICAgICAgICBUaGlzIGlzIGEgdGVzdCBzZXR1cCBzdGVwLlxuCiAgICAgICAgIDEuIFByZXNzIHRoZSBnbyBidXR0b24gdG8gc2VuZCBhIHdvcmsgbm90aWZpY2F0aW9uLlxuCiAgICAgICAgIDIuIFZlcmlmeSB0aGF0IHRoZSBub3RpZmljYXRpb24gaXMgZGlzcGxheWVkIGFuZCBtYXJrIHRoaXMgdGVzdCBhcyBwYXNzZWQuXG4KLSAgICAgICAgKE5vdGU6IGluIHRoZSBmb2xsb3dpbmcgdGVzdCwgeW91IHdpbGwgYmUgYXNrZWQgdG8gdmVyaWZ5IHRoZSBub3RpZmljYXRpb24gZGlzYXBwZWFycyBhZnRlciB3b3JrIG1vZGUgaXMgdHVybmVkIG9mZi4pCisgICAgICAgIChOb3RlOiBpbiB0aGUgZm9sbG93aW5nIHRlc3QsIHlvdSB3aWxsIGJlIGFza2VkIHRvIHZlcmlmeSB0aGUgbm90aWZpY2F0aW9uIGRpc2FwcGVhcnMgYWZ0ZXIgd29yayBwcm9maWxlIGlzIHR1cm5lZCBvZmYuKQogICAgIDwvc3RyaW5nPgogCi0gICAgPHN0cmluZyBuYW1lPSJwcm92aXNpb25pbmdfYnlvZF90dXJuX29mZl93b3JrX3R1cm5lZF9vZmYiPlBsZWFzZSB0dXJuIG9mZiB3b3JrIG1vZGU8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InByb3Zpc2lvbmluZ19ieW9kX3R1cm5fb2ZmX3dvcmtfdHVybmVkX29mZl90b2FzdCI+T3BlbiBzZXR0aW5ncyB0byB0dXJuIG9mZiB3b3JrIG1vZGUsIHVzaW5nIHRoZSBidXR0b24gYWJvdmUuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwcm92aXNpb25pbmdfYnlvZF90dXJuX29mZl93b3JrX3R1cm5lZF9vZmYiPlBsZWFzZSB0dXJuIG9mZiB3b3JrIHByb2ZpbGU8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InByb3Zpc2lvbmluZ19ieW9kX3R1cm5fb2ZmX3dvcmtfdHVybmVkX29mZl90b2FzdCI+T3BlbiBzZXR0aW5ncyB0byB0dXJuIG9mZiB3b3JrIHByb2ZpbGUsIHVzaW5nIHRoZSBidXR0b24gYWJvdmUuPC9zdHJpbmc+CiAKLSAgICA8c3RyaW5nIG5hbWU9InByb3Zpc2lvbmluZ19ieW9kX3R1cm5fb2ZmX3dvcmtfbm90aWZpY2F0aW9ucyI+Tm90aWZpY2F0aW9ucyB3aGVuIHdvcmsgbW9kZSBpcyBvZmY8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InByb3Zpc2lvbmluZ19ieW9kX3R1cm5fb2ZmX3dvcmtfbm90aWZpY2F0aW9ucyI+Tm90aWZpY2F0aW9ucyB3aGVuIHdvcmsgcHJvZmlsZSBpcyBvZmY8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InByb3Zpc2lvbmluZ19ieW9kX3R1cm5fb2ZmX3dvcmtfbm90aWZpY2F0aW9uc19pbnN0cnVjdGlvbiI+CiAgICAgICAgIFZlcmlmeSB0aGF0IHRoZSBwcmV2aW91c2x5LXNob3duIHdvcmsgbm90aWZpY2F0aW9uIGhhcyBub3cgZGlzYXBwZWFyZWQuCiAgICAgPC9zdHJpbmc+CiAKLSAgICA8c3RyaW5nIG5hbWU9InByb3Zpc2lvbmluZ19ieW9kX3R1cm5fb2ZmX3dvcmtfaWNvbiI+U3RhdHVzIGJhciBpY29uIHdoZW4gd29yayBtb2RlIGlzIG9mZjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icHJvdmlzaW9uaW5nX2J5b2RfdHVybl9vZmZfd29ya19pY29uX2luc3RydWN0aW9uIj4KLSAgICAgICAgTm93IHRoYXQgd29yayBtb2RlIGlzIG9mZiwgcGxlYXNlIHZlcmlmeSB0aGF0IHRoZSBzdGF0dXMgYmFyIHNob3dzIGFuIGljb24gaW5kaWNhdGluZyB0aGF0IHdvcmsgbW9kZSBpcyBvZmYuXG4KLSAgICA8L3N0cmluZz4KLQotICAgIDxzdHJpbmcgbmFtZT0icHJvdmlzaW9uaW5nX2J5b2RfdHVybl9vZmZfd29ya19sYXVuY2hlciI+U3RhcnRpbmcgd29yayBhcHBzIHdoZW4gd29yayBtb2RlIGlzIG9mZjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icHJvdmlzaW9uaW5nX2J5b2RfdHVybl9vZmZfd29ya19sYXVuY2hlciI+U3RhcnRpbmcgd29yayBhcHBzIHdoZW4gd29yayBwcm9maWxlIGlzIG9mZjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icHJvdmlzaW9uaW5nX2J5b2RfdHVybl9vZmZfd29ya19sYXVuY2hlcl9pbnN0cnVjdGlvbiI+Ci0gICAgICAgIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGF0IHdvcmsgYXBwbGljYXRpb25zIGNhbm5vdCBiZSBzdGFydGVkIGlmIHdvcmsgbW9kZSBpcyBvZmYuXG4KKyAgICAgICAgVGhpcyB0ZXN0IHZlcmlmaWVzIHRoYXQgd29yayBhcHBsaWNhdGlvbnMgY2Fubm90IGJlIHN0YXJ0ZWQgaWYgd29yayBwcm9maWxlIGlzIG9mZi5cbgogICAgICAgICAxLiBQcmVzcyBob21lIHRvIGdvIHRvIHRoZSBsYXVuY2hlci5cbgogICAgICAgICAyLiBWZXJpZnkgdGhhdCB3b3JrIGFwcGxpY2F0aW9ucyBhcmUgZ3JleWVkIG91dC5cbgogICAgICAgICAzLiBUYXAgb24gYSB3b3JrIGFwcGxpY2F0aW9uLlxuCiAgICAgICAgIDQuIFZlcmlmeSB0aGF0IHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdGFydC5cbgogICAgIDwvc3RyaW5nPgogCi0gICAgPHN0cmluZyBuYW1lPSJwcm92aXNpb25pbmdfYnlvZF90dXJuX29mZl93b3JrX3R1cm5lZF9vbiI+UGxlYXNlIHR1cm4gd29yayBtb2RlIGJhY2sgb248L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InByb3Zpc2lvbmluZ19ieW9kX3R1cm5fb2ZmX3dvcmtfdHVybmVkX29uX3RvYXN0Ij5PcGVuIHNldHRpbmdzIHRvIHR1cm4gd29yayBtb2RlIGJhY2sgb24sIGVpdGhlciBtYW51YWxseSBvciB1c2luZyB0aGUgYnV0dG9uIGFib3ZlLjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icHJvdmlzaW9uaW5nX2J5b2RfdHVybl9vZmZfd29ya190dXJuZWRfb24iPlBsZWFzZSB0dXJuIHdvcmsgcHJvZmlsZSBiYWNrIG9uPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwcm92aXNpb25pbmdfYnlvZF90dXJuX29mZl93b3JrX3R1cm5lZF9vbl90b2FzdCI+T3BlbiBzZXR0aW5ncyB0byB0dXJuIHdvcmsgcHJvZmlsZSBiYWNrIG9uLCBlaXRoZXIgbWFudWFsbHkgb3IgdXNpbmcgdGhlIGJ1dHRvbiBhYm92ZS48L3N0cmluZz4KIAotICAgIDxzdHJpbmcgbmFtZT0icHJvdmlzaW9uaW5nX2J5b2RfdHVybl9vbl93b3JrX2ljb24iPlN0YXR1cyBiYXIgaWNvbiB3aGVuIHdvcmsgbW9kZSBpcyBvbjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icHJvdmlzaW9uaW5nX2J5b2RfdHVybl9vbl93b3JrX2ljb24iPlN0YXR1cyBiYXIgaWNvbiB3aGVuIHdvcmsgcHJvZmlsZSBpcyBvbjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icHJvdmlzaW9uaW5nX2J5b2RfdHVybl9vbl93b3JrX2ljb25faW5zdHJ1Y3Rpb24iPgotICAgICAgICBOb3cgdGhhdCB3b3JrIG1vZGUgaXMgYmFjayBvbiwgcGxlYXNlIHZlcmlmeSB0aGF0IHRoZSBzdGF0dXMgYmFyIGljb24gZm9yIHdvcmsgbW9kZSBvZmYgaXMgbm8gbG9uZ2VyIHZpc2libGUuCisgICAgICAgIE5vdyB0aGF0IHdvcmsgcHJvZmlsZSBpcyBiYWNrIG9uLCBwbGVhc2UgdmVyaWZ5IHRoYXQgdGhlIHN0YXR1cyBiYXIgaWNvbiBmb3Igd29yayBwcm9maWxlIG9mZiBpcyBubyBsb25nZXIgdmlzaWJsZS4KICAgICA8L3N0cmluZz4KIAotICAgIDxzdHJpbmcgbmFtZT0icHJvdmlzaW9uaW5nX2J5b2RfdHVybl9vbl93b3JrX2xhdW5jaGVyIj5TdGFydGluZyB3b3JrIGFwcHMgd2hlbiB3b3JrIG1vZGUgaXMgb248L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InByb3Zpc2lvbmluZ19ieW9kX3R1cm5fb25fd29ya19sYXVuY2hlciI+U3RhcnRpbmcgd29yayBhcHBzIHdoZW4gd29yayBwcm9maWxlIGlzIG9uPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwcm92aXNpb25pbmdfYnlvZF90dXJuX29uX3dvcmtfbGF1bmNoZXJfaW5zdHJ1Y3Rpb24iPgotICAgICAgICBOb3cgdGhhdCB3b3JrIG1vZGUgaXMgYmFjayBvbiwgcGxlYXNlIGdvIHRvIHRoZSBsYXVuY2hlciBhbmQgdmVyaWZ5IHRoYXQgeW91IGNhbiBzdGFydCBhIHdvcmsgYXBwbGljYXRpb24uCisgICAgICAgIE5vdyB0aGF0IHdvcmsgcHJvZmlsZSBpcyBiYWNrIG9uLCBwbGVhc2UgZ28gdG8gdGhlIGxhdW5jaGVyIGFuZCB2ZXJpZnkgdGhhdCB5b3UgY2FuIHN0YXJ0IGEgd29yayBhcHBsaWNhdGlvbi4KICAgICA8L3N0cmluZz4KIAogICAgIDxzdHJpbmcgbmFtZT0icHJvdmlzaW9uaW5nX2J5b2Rfb3JnYW5pemF0aW9uX2luZm8iPk9yZ2FuaXphdGlvbiBJbmZvPC9zdHJpbmc+CkBAIC0yNTU2LDEyICsyNjg0LDIxIEBACiAgICAgICAgIDEuIFByZXNzIHRoZSBHbyBidXR0b24gdG8gc2V0IGEgbmV3IHBhc3N3b3JkIGZvciB0aGUgcGVyc29uYWwgc2lkZS5cbgogICAgICAgICAyLiBMb2NrIGFuZCB1bmxvY2sgdGhlIHNjcmVlbiB0byB2ZXJpZnkgdGhhdCB0aGUgcGVyc29uYWwgc2lkZSBwYXNzd29yZCB3YXMgc2V0IGNvcnJlY3RseS5cbgogICAgIDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icHJvdmlzaW9uaW5nX2J5b2Rfd29ya19wcm9maWxlX3dpZGdldCI+V29yayBwcm9maWxlIHdpZGdldDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icHJvdmlzaW9uaW5nX2J5b2Rfd29ya19wcm9maWxlX3dpZGdldF9pbmZvIj5WZXJpZnkgdGhhdCB3b3JrIHByb2ZpbGUgd2lkZ2V0IGNhbiBiZSBhZGRlZCBpbnRvIGxhdW5jaGVyPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwcm92aXNpb25pbmdfYnlvZF93b3JrX3Byb2ZpbGVfd2lkZ2V0X2Rlc2NyaXB0aW9uIj4KKyAgICAgICAgVGhpcyB0ZXN0IHZlcmlmaWVzIHRoYXQgdGhlIHdpZGdldCBpbiB3b3JrIHByb2ZpbGUgY2FuIGJlIGFkZGVkIGludG8gTGF1bmNoZXIuXG4KKworICAgICAgICAxLiBHbyB0byBob21lIHNjcmVlbi5cbgorICAgICAgICAyLiBBZGQgdGhlIHdpZGdldCB0aXRsZWQgXCJDVFMgVmVyaWZpZXJcIiBhbmQgYmFkZ2VkIHdpdGggd29yayBwcm9maWxlIGJyaWVmY2FzZSB0byB0aGUgaG9tZSBzY3JlZW4uXG4KKyAgICAgICAgMy4gSWYgeW91IGNhbiBhZGQgdGhlIHdpZGdldCB0byB0aGUgaG9tZSBzY3JlZW4sIHBsZWFzZSBzZWxlY3QgXCJwYXNzXCIuIE90aGVyd2lzZSwgc2VsZWN0IFwiZmFpbFwiLgorICAgIDwvc3RyaW5nPgogCiAgICAgPCEtLSBTdHJpbmdzIGZvciBEZXZpY2VPd25lck5lZ2F0aXZlVGVzdEFjdGl2aXR5IC0tPgogICAgIDxzdHJpbmcgbmFtZT0ibmVnYXRpdmVfZGV2aWNlX293bmVyIj5ObyBEZXZpY2UgT3duZXIgVGVzdHM8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRldmljZV9vd25lcl9uZWdhdGl2ZV9jYXRlZ29yeSI+Tm8gRGV2aWNlIE93bmVyIFRlc3RzPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkZXZpY2Vfb3duZXJfcHJvdmlzaW9uaW5nX25lZ2F0aXZlIj5EZXZpY2Ugb3duZXIgcHJvdmlzaW9uaW5nPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJkZXZpY2Vfb3duZXJfcHJvdmlzaW9uaW5nX25lZ2F0aXZlX2luZm8iPlRoZSBkZXZpY2Ugb3duZXIgcHJvdmlzaW9uaW5nIHRlc3QgdmVyaWZpZXMgdGhhdCBzZXR0aW5nIHVwIGEgY29ycG9yYXRlIG93bmVkIGRldmljZSBjYW4gb25seSBiZSBkb25lIG9uIGEgZmFjdG9yeSByZXNldCBkZXZpY2UuXG5cblBsZWFzZSBjbGljayB0aGUgIlN0YXJ0IHByb3Zpc2lvbmluZyIgYnV0dG9uLCBhbmQgd2hlbiB5b3Ugc2VlIGEgd2FybmluZyBkaWFsb2cgdGVsbGluZyB0aGUgZGV2aWNlIGNhblwndCBiZSBzZXQgdXAsIHNlbGVjdCAicGFzcyIuIE90aGVyd2lzZSwgc2VsZWN0ICJmYWlsIi48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRldmljZV9vd25lcl9wcm92aXNpb25pbmdfbmVnYXRpdmVfaW5mbyI+VGhlIGRldmljZSBvd25lciBwcm92aXNpb25pbmcgdGVzdCB2ZXJpZmllcyB0aGF0IHNldHRpbmcgdXAgYSBjb3Jwb3JhdGUgb3duZWQgZGV2aWNlIGNhbiBvbmx5IGJlIGRvbmUgb24gYSBmYWN0b3J5IHJlc2V0IGRldmljZS5cblxuUGxlYXNlIGNsaWNrIHRoZSAiU3RhcnQgcHJvdmlzaW9uaW5nIiBidXR0b24sIGFuZCB3aGVuIHlvdSBzZWUgYSB3YXJuaW5nIGRpYWxvZyB0ZWxsaW5nIHRoZSBkZXZpY2UgaXMgYWxyZWFkeSBzZXQgdXAsIHNlbGVjdCAicGFzcyIuIE90aGVyd2lzZSwgc2VsZWN0ICJmYWlsIi48L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0YXJ0X2RldmljZV9vd25lcl9wcm92aXNpb25pbmdfYnV0dG9uIj5TdGFydCBwcm92aXNpb25pbmc8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVudGVycHJpc2VfcHJpdmFjeV9xdWlja19zZXR0aW5nc19uZWdhdGl2ZSI+UXVpY2sgc2V0dGluZ3MgZGlzY2xvc3VyZTwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZW50ZXJwcmlzZV9wcml2YWN5X3F1aWNrX3NldHRpbmdzX25lZ2F0aXZlX2luZm8iPgpAQCAtMjYxMSwyMSArMjc0OCwxMiBAQAogICAgICAgICAgICAgYmUgcnVuIGxhc3Qgc28gdGhhdCBpdCBkb2VzIG5vdCBpbnRlcmZlcmUgd2l0aCBvdGhlciB0ZXN0cy4KICAgICA8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRldmljZV9vd25lcl9wb3NpdGl2ZV9jYXRlZ29yeSI+RGV2aWNlIE93bmVyIFRlc3RzPC9zdHJpbmc+Ci0KLSAgICA8c3RyaW5nIG5hbWU9ImRldmljZV9vd25lcl9wcmVjb25kaXRpb25fYnV0dG9uX2xhYmVsIj5QcmVjb25kaXRpb24gY2hlY2tzPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJkZXZpY2Vfb3duZXJfcHJlY29uZGl0aW9uX2RpYWxvZ190aXRsZSI+UHJlY29uZGl0aW9uIGNoZWNrczwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZGV2aWNlX293bmVyX3ByZWNvbmRpdGlvbl9kaWFsb2dfdGV4dCI+Ci0gICAgVGhpcyB0ZXN0IHJlcXVpcmVzIEN0c0VtcHR5RGV2aWNlT3duZXIuYXBrIHRvIGJlIGluc3RhbGxlZCBvbiB0aGUgZGV2aWNlLgotICAgIFBsZWFzZSBzZXQgdGhlIGRldmljZSBvd25lciBieSBlbmFibGluZyBVU0IgZGVidWdnaW5nIG9uIHRoZSBkZXZpY2UgYW5kIGlzc3VpbmcgdGhlIGZvbGxvd2luZyBjb21tYW5kIG9uIHRoZSBob3N0OlxuCi0gICAgYWRiIHNoZWxsIGRwbSBzZXQtZGV2aWNlLW93bmVyIGNvbS5hbmRyb2lkLmN0cy5lbXB0eWRldmljZW93bmVyLy5FbXB0eURldmljZUFkbWluCi0gICAgUHJlc3MgXCJPS1wiIHdoZW4gdGhlIGNvbW1hbmQgaXMgc2V0LgotICAgIDwvc3RyaW5nPgotCiAgICAgPHN0cmluZyBuYW1lPSJzZXRfZGV2aWNlX293bmVyX2J1dHRvbl9sYWJlbCI+U2V0IHVwIGRldmljZSBvd25lcjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2V0X2RldmljZV9vd25lcl9kaWFsb2dfdGl0bGUiPlNldCB1cCBkZXZpY2Ugb3duZXI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNldF9kZXZpY2Vfb3duZXJfZGlhbG9nX3RleHQiPgotICAgICAgICBQbGVhc2Ugc2V0IHRoZSBkZXZpY2Ugb3duZXIgYnkgZW5hYmxpbmcgVVNCIGRlYnVnZ2luZyBvbiB0aGUgZGV2aWNlIGFuZCBpc3N1aW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZCBvbiB0aGUgaG9zdDpcbgotICAgICAgICBhZGIgc2hlbGwgZHBtIHNldC1kZXZpY2Utb3duZXIgXCdjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIvY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLm1hbmFnZWRwcm92aXNpb25pbmcuRGV2aWNlQWRtaW5UZXN0UmVjZWl2ZXJcJworICAgICAgICAgICAgVGhpcyB0ZXN0IHJlcXVpcmVzIEN0c0VtcHR5RGV2aWNlT3duZXIuYXBrIHRvIGJlIGluc3RhbGxlZCBvbiB0aGUgZGV2aWNlLgorICAgICAgICAgICAgUGxlYXNlIHNldCB0aGUgZGV2aWNlIG93bmVyIGJ5IGVuYWJsaW5nIFVTQiBkZWJ1Z2dpbmcgb24gdGhlIGRldmljZSBhbmQgaXNzdWluZyB0aGUgZm9sbG93aW5nIGNvbW1hbmQgb24gdGhlIGhvc3Q6XG4KKyAgICAgICAgICAgIGFkYiBzaGVsbCBkcG0gc2V0LWRldmljZS1vd25lciBjb20uYW5kcm9pZC5jdHMuZW1wdHlkZXZpY2Vvd25lci8uRW1wdHlEZXZpY2VBZG1pbgogICAgIDwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGV2aWNlX293bmVyX3JlbW92ZV9kZXZpY2Vfb3duZXJfdGVzdCI+UmVtb3ZlIGRldmljZSBvd25lcjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGV2aWNlX293bmVyX3JlbW92ZV9kZXZpY2Vfb3duZXJfdGVzdF9pbmZvIj4KQEAgLTI3MDAsNiArMjgyOCwxNTAgQEAKICAgICA8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRldmljZV9vd25lcl9kaXNhYmxlX2tleWd1YXJkX2J1dHRvbiI+RGlzYWJsZSBrZXlndWFyZDwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGV2aWNlX293bmVyX3JlZW5hYmxlX2tleWd1YXJkX2J1dHRvbiI+UmVlbmFibGUga2V5Z3VhcmQ8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRldmljZV9vd25lcl9sb2NrX3Rhc2tfdWlfdGVzdCI+TG9ja1Rhc2sgVUk8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRldmljZV9vd25lcl9sb2NrX3Rhc2tfdWlfdGVzdF9pbmZvIj4KKyAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgdGVzdHMgdmVyaWZ5IHRoZSBjb25maWd1cmFibGUgVUkgZHVyaW5nIExvY2tUYXNrLCBhIHNwZWNpYWwgbW9kZSB0aGF0CisgICAgICAgICAgICBwcmV2ZW50cyB0aGUgdXNlciBmcm9tIGxlYXZpbmcgdGhlIGN1cnJlbnQgYXBwbGljYXRpb24uXG5cbgorICAgICAgICAgICAgUGxlYXNlIG1ha2Ugc3VyZSB0aGUgbG9jayBzY3JlZW4gaXMgdHVybmVkIG9uIGJlZm9yZSB0aGUgdGVzdC4gUHJlc3MgdGhlIGJ1dHRvbiBiZWxvdyB0bworICAgICAgICAgICAgc3RhcnQgTG9ja1Rhc2sgbW9kZS4gVGhlbiBtYXJrIGVhY2ggaXRlbSBhcyBcJ3Bhc3NcJyBvciBcJ2ZhaWxcJyBhY2NvcmRpbmcgdG8gdGhlCisgICAgICAgICAgICBpbnN0cnVjdGlvbnMuXG5cbgorICAgICAgICAgICAgRmluYWxseSwgZXhlY3V0ZSB0aGUgbGFzdCB0ZXN0IGl0ZW0gdG8gbGVhdmUgTG9ja1Rhc2sgbW9kZS4KKyAgICA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InN0YXJ0X2xvY2tfdGFza19idXR0b25fbGFiZWwiPlN0YXJ0IExvY2tUYXNrIG1vZGU8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRldmljZV9vd25lcl9sb2NrX3Rhc2tfdWlfZGVmYXVsdF90ZXN0Ij5EZWZhdWx0IExvY2tUYXNrIFVJPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZXZpY2Vfb3duZXJfbG9ja190YXNrX3VpX2RlZmF1bHRfdGVzdF9pbmZvIj4KKyAgICAgICAgICAgIFByZXNzIHRoZSBidXR0b24gYmVsb3cgdG8gcmVzZXQgdG8gZGVmYXVsdCBMb2NrVGFzayBVSS4KKyAgICAgICAgICAgIE9ic2VydmUgdGhlIGZvbGxvd2luZyBVSSByZXN0cmljdGlvbnMuIE1hcmsgdGhlIHRlc3QgYXMgXCdwYXNzXCcgb25seSBpZiBBTEwgb2YgdGhlCisgICAgICAgICAgICByZXF1aXJlbWVudHMgYmVsb3cgYXJlIG1ldC5cblxuCisgICAgICAgICAgICAxKSBOb3RoaW5nIGlzIHNob3duIGluIHRoZSBzdGF0dXMgYmFyLCBpbmNsdWRpbmcgbm90aWZpY2F0aW9uIGljb25zLCBjb25uZWN0aXZpdHkgaWNvbnMsCisgICAgICAgICAgICBiYXR0ZXJ5IHN0YXR1cywgY2xvY2ssIGV0Yy5cbgorICAgICAgICAgICAgMikgVGhlIHN0YXR1cyBiYXIgY2FuXCd0IGJlIGV4cGFuZGVkLiBUaGF0IGlzLCB0aGUgXCdzd2lwZS1kb3duXCcgZ2VzdHVyZSBkb2VzblwndCB3b3JrCisgICAgICAgICAgICBmb3IgdGhlIHN0YXR1cyBiYXIuXG4KKyAgICAgICAgICAgIDMpIFRoZSBzb2Z0d2FyZSBIb21lIGJ1dHRvbiBpcyBoaWRkZW4uXG4KKyAgICAgICAgICAgIDQpIFRoZSBzb2Z0d2FyZSBPdmVydmlldyBidXR0b24gaXMgaGlkZGVuIGFuZCB0aGUgT3ZlcnZpZXcgZ2VzdHVyZSAoc3dpcGUtdXApIGRvZXMgbm90CisgICAgICAgICAgICB3b3JrLlxuCisgICAgICAgICAgICA1KSBMb25nLXByZXNzIHRoZSBwb3dlciBidXR0b24uIFRoZSBwb3dlciBidXR0b24gbWVudSwgd2hpY2ggdXN1YWxseSBzaG93cyB0aGUgcG93ZXItb2ZmCisgICAgICAgICAgICBidXR0b24sIGV0Yy4sIGlzblwndCBzaG93bi5cbgorICAgICAgICAgICAgNikgUHJlc3MgdGhlIHBvd2VyIGJ1dHRvbiB0byB0dXJuIG9mZiB0aGUgc2NyZWVuLCBhbmQgcHJlc3MgaXQgYWdhaW4gdG8gdHVybiB0aGUgc2NyZWVuCisgICAgICAgICAgICBiYWNrIG9uLiBMb2NrIHNjcmVlbiBzaG91bGRuXCd0IGJlIHNob3duLlxuCisgICAgICAgICAgICA3KSBUaGUgYXNzaXN0IGdlc3R1cmUgaXNuXCd0IGF2YWlsYWJsZS4KKyAgICA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRldmljZV9vd25lcl9sb2NrX3Rhc2tfdWlfc3lzdGVtX2luZm9fdGVzdCI+RW5hYmxlIHN5c3RlbSBpbmZvPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZXZpY2Vfb3duZXJfbG9ja190YXNrX3VpX3N5c3RlbV9pbmZvX3Rlc3RfaW5mbyI+CisgICAgICAgICAgICBQcmVzcyB0aGUgYnV0dG9uIGJlbG93IHRvIGVuYWJsZSBzeXN0ZW0gaW5mby4gT2JzZXJ2ZSB0aGUgc3lzdGVtIGluZm8gYXJlYSBvZiB0aGUgc3RhdHVzCisgICAgICAgICAgICBiYXIgaXMgbm93IGVuYWJsZWQuIFRoaXMgaW5jbHVkZXMgdGhlIGNsb2NrLCBjb25uZWN0aXZpdHkgaW5mbywgYmF0dGVyeSBpbmZvLCBldGMuXG5cbgorICAgICAgICAgICAgVGhlIHJlc3Qgb2YgdGhlIFVJIHJlc3RyaWN0aW9ucyBzaG91bGQgc3RpbGwgYXBwbHk6XG4KKyAgICAgICAgICAgIDEpIE5vdGlmaWNhdGlvbiBpY29ucyBhcmUgc3RpbGwgaGlkZGVuIG9uIHRoZSBzdGF0dXMgYmFyLlxuCisgICAgICAgICAgICAyKSBUaGUgc3RhdHVzIGJhciBjYW5cJ3QgYmUgZXhwYW5kZWQuIFRoYXQgaXMsIHRoZSBcJ3N3aXBlLWRvd25cJyBnZXN0dXJlIGRvZXNuXCd0IHdvcmsKKyAgICAgICAgICAgIGZvciB0aGUgc3RhdHVzIGJhci5cbgorICAgICAgICAgICAgMykgVGhlIHNvZnR3YXJlIEhvbWUgYnV0dG9uIGlzIGhpZGRlbi5cbgorICAgICAgICAgICAgNCkgVGhlIHNvZnR3YXJlIE92ZXJ2aWV3IGJ1dHRvbiBpcyBoaWRkZW4gYW5kIHRoZSBPdmVydmlldyBnZXN0dXJlIChzd2lwZS11cCkgZG9lcyBub3QKKyAgICAgICAgICAgIHdvcmsuXG4KKyAgICAgICAgICAgIDUpIExvbmctcHJlc3MgdGhlIHBvd2VyIGJ1dHRvbi4gVGhlIHBvd2VyIGJ1dHRvbiBtZW51LCB3aGljaCB1c3VhbGx5IHNob3dzIHRoZSBwb3dlci1vZmYKKyAgICAgICAgICAgIGJ1dHRvbiwgZXRjLiwgaXNuXCd0IHNob3duLlxuCisgICAgICAgICAgICA2KSBQcmVzcyB0aGUgcG93ZXIgYnV0dG9uIHRvIHR1cm4gb2ZmIHRoZSBzY3JlZW4sIGFuZCBwcmVzcyBpdCBhZ2FpbiB0byB0dXJuIHRoZSBzY3JlZW4KKyAgICAgICAgICAgIGJhY2sgb24uIExvY2sgc2NyZWVuIHNob3VsZG5cJ3QgYmUgc2hvd24uXG4KKyAgICAgICAgICAgIDcpIFRoZSBhc3Npc3QgZ2VzdHVyZSBpc25cJ3QgYXZhaWxhYmxlLlxuXG4KKyAgICAgICAgICAgIE1hcmsgdGhlIHRlc3QgYXMgXCdwYXNzXCcgb25seSBpZiBBTEwgb2YgdGhlIGFib3ZlIHJlcXVpcmVtZW50cyBhcmUgbWV0LgorICAgIDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGV2aWNlX293bmVyX2xvY2tfdGFza191aV9ub3RpZmljYXRpb25zX3Rlc3QiPkVuYWJsZSBub3RpZmljYXRpb25zPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZXZpY2Vfb3duZXJfbG9ja190YXNrX3VpX25vdGlmaWNhdGlvbnNfdGVzdF9pbmZvIj4KKyAgICAgICAgICAgIFByZXNzIHRoZSBidXR0b24gYmVsb3cgdG8gZW5hYmxlIG5vdGlmaWNhdGlvbnMuIE9ic2VydmUgdGhlIG5vdGlmaWNhdGlvbiBpY29ucyBvbiB0aGUKKyAgICAgICAgICAgIHN0YXR1cyBiYXIgYXJlIG5vdyBlbmFibGVkIGFuZCB0aGUgSG9tZSBidXR0b24gaXMgc2hvd24uIFRoZSBzdGF0dXMgYmFyIGNhbiBhbHNvIGJlCisgICAgICAgICAgICBleHBhbmRlZCB0byBzaG93IHRoZSBub3RpZmljYXRpb25zLiBIb3dldmVyLCBhbGwgU2V0dGluZ3MgVUkgc2hvdWxkIHJlbWFpbiBpbnZpc2libGUsCisgICAgICAgICAgICBpbmNsdWRpbmcgUXVpY2sgU2V0dGluZ3MgYW5kIGFueSBsaW5rIHRvIHRoZSBTZXR0aW5ncyBhcHAuXG5cbgorICAgICAgICAgICAgVGhlIHJlc3Qgb2YgdGhlIFVJIHJlc3RyaWN0aW9ucyBzaG91bGQgc3RpbGwgYXBwbHk6XG4KKyAgICAgICAgICAgIDEpIFN5c3RlbSBpbmZvIGFyZWEgaXMgc3RpbGwgaGlkZGVuIG9uIHRoZSBzdGF0dXMgYmFyLlxuCisgICAgICAgICAgICAyKSBUaGUgc29mdHdhcmUgT3ZlcnZpZXcgYnV0dG9uIGlzIGhpZGRlbiBhbmQgdGhlIE92ZXJ2aWV3IGdlc3R1cmUgKHN3aXBlLXVwKSBkb2VzIG5vdAorICAgICAgICAgICAgd29yay5cbgorICAgICAgICAgICAgMykgSG9sZGluZyB0aGUgSG9tZSBidXR0b24gYW5kIHN3aXBpbmcgdG8gdGhlIHJpZ2h0IGRvZXMgbm90IGJyaW5nIHVwIG90aGVyIHRhc2tzLlxuCisgICAgICAgICAgICA0KSBMb25nLXByZXNzIHRoZSBwb3dlciBidXR0b24uIFRoZSBwb3dlciBidXR0b24gbWVudSwgd2hpY2ggdXN1YWxseSBzaG93cyB0aGUgcG93ZXItb2ZmCisgICAgICAgICAgICBidXR0b24sIGV0Yy4sIGlzblwndCBzaG93bi5cbgorICAgICAgICAgICAgNSkgUHJlc3MgdGhlIHBvd2VyIGJ1dHRvbiB0byB0dXJuIG9mZiB0aGUgc2NyZWVuLCBhbmQgcHJlc3MgaXQgYWdhaW4gdG8gdHVybiB0aGUgc2NyZWVuCisgICAgICAgICAgICBiYWNrIG9uLiBMb2NrIHNjcmVlbiBzaG91bGRuXCd0IGJlIHNob3duLlxuCisgICAgICAgICAgICA2KSBUaGUgYXNzaXN0IGdlc3R1cmUgaXNuXCd0IGF2YWlsYWJsZS5cblxuCisgICAgICAgICAgICBNYXJrIHRoZSB0ZXN0IGFzIFwncGFzc1wnIG9ubHkgaWYgQUxMIG9mIHRoZSBhYm92ZSByZXF1aXJlbWVudHMgYXJlIG1ldC4KKyAgICA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRldmljZV9vd25lcl9sb2NrX3Rhc2tfdWlfaG9tZV90ZXN0Ij5FbmFibGUgSG9tZSBidXR0b248L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRldmljZV9vd25lcl9sb2NrX3Rhc2tfdWlfaG9tZV90ZXN0X2luZm8iPgorICAgICAgICAgICAgUHJlc3MgdGhlIGJ1dHRvbiBiZWxvdyB0byBlbmFibGUgdGhlIEhvbWUgYnV0dG9uLiBPYnNlcnZlIHRoZSBIb21lIGJ1dHRvbiBpcyBub3cKKyAgICAgICAgICAgIGVuYWJsZWQuXG5cbgorICAgICAgICAgICAgVGhlIHJlc3Qgb2YgdGhlIFVJIHJlc3RyaWN0aW9ucyBzaG91bGQgc3RpbGwgYXBwbHk6XG4KKyAgICAgICAgICAgIDEpIE5vdGhpbmcgaXMgc2hvd24gaW4gdGhlIHN0YXR1cyBiYXIsIGluY2x1ZGluZyBub3RpZmljYXRpb24gaWNvbnMsIGNvbm5lY3Rpdml0eSBpY29ucywKKyAgICAgICAgICAgIGJhdHRlcnkgc3RhdHVzLCBjbG9jaywgZXRjLlxuCisgICAgICAgICAgICAyKSBUaGUgc3RhdHVzIGJhciBjYW5cJ3QgYmUgZXhwYW5kZWQuIFRoYXQgaXMsIHRoZSBcJ3N3aXBlLWRvd25cJyBnZXN0dXJlIGRvZXNuXCd0IHdvcmsKKyAgICAgICAgICAgIGZvciB0aGUgc3RhdHVzIGJhci5cbgorICAgICAgICAgICAgMykgVGhlIHNvZnR3YXJlIE92ZXJ2aWV3IGJ1dHRvbiBpcyBoaWRkZW4gYW5kIHRoZSBPdmVydmlldyBnZXN0dXJlIChzd2lwZS11cCkgZG9lcyBub3QKKyAgICAgICAgICAgIHdvcmsuXG4KKyAgICAgICAgICAgIDQpIEhvbGRpbmcgdGhlIEhvbWUgYnV0dG9uIGFuZCBzd2lwaW5nIHRvIHRoZSByaWdodCBkb2VzIG5vdCBicmluZyB1cCBvdGhlciB0YXNrcy5cbgorICAgICAgICAgICAgNSkgTG9uZy1wcmVzcyB0aGUgcG93ZXIgYnV0dG9uLiBUaGUgcG93ZXIgYnV0dG9uIG1lbnUsIHdoaWNoIHVzdWFsbHkgc2hvd3MgdGhlIHBvd2VyLW9mZgorICAgICAgICAgICAgYnV0dG9uLCBldGMuLCBpc25cJ3Qgc2hvd24uXG4KKyAgICAgICAgICAgIDYpIFByZXNzIHRoZSBwb3dlciBidXR0b24gdG8gdHVybiBvZmYgdGhlIHNjcmVlbiwgYW5kIHByZXNzIGl0IGFnYWluIHRvIHR1cm4gdGhlIHNjcmVlbgorICAgICAgICAgICAgYmFjayBvbi4gTG9jayBzY3JlZW4gc2hvdWxkblwndCBiZSBzaG93bi5cbgorICAgICAgICAgICAgNykgVGhlIGFzc2lzdCBnZXN0dXJlIGlzblwndCBhdmFpbGFibGUuXG5cbgorICAgICAgICAgICAgTWFyayB0aGUgdGVzdCBhcyBcJ3Bhc3NcJyBvbmx5IGlmIEFMTCBvZiB0aGUgYWJvdmUgcmVxdWlyZW1lbnRzIGFyZSBtZXQuCisgICAgPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZXZpY2Vfb3duZXJfbG9ja190YXNrX3VpX3JlY2VudHNfdGVzdCI+RW5hYmxlIE92ZXJ2aWV3IGJ1dHRvbjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGV2aWNlX293bmVyX2xvY2tfdGFza191aV9yZWNlbnRzX3Rlc3RfaW5mbyI+CisgICAgICAgICAgICBQcmVzcyB0aGUgYnV0dG9uIGJlbG93IHRvIGVuYWJsZSB0aGUgT3ZlcnZpZXcgYnV0dG9uLiBPYnNlcnZlIHRoZSBIb21lIGJ1dHRvbiBpcyBub3cKKyAgICAgICAgICAgIGVuYWJsZWQuIFByZXNzIHRoZSBPdmVydmlldyBidXR0b24gb3IgcGVyZm9ybSB0aGUgT3ZlcnZpZXcgZ2VzdHVyZQorICAgICAgICAgICAgKHN3aXBlIHVwKSBhbmQgdmVyaWZ5IHRoZSBPdmVydmlldyB2aWV3IGNhbiBiZSBvcGVuZWQuXG5cbgorICAgICAgICAgICAgVGhlIHJlc3Qgb2YgdGhlIFVJIHJlc3RyaWN0aW9ucyBzaG91bGQgc3RpbGwgYXBwbHk6XG4KKyAgICAgICAgICAgIDEpIE5vdGhpbmcgaXMgc2hvd24gaW4gdGhlIHN0YXR1cyBiYXIsIGluY2x1ZGluZyBub3RpZmljYXRpb24gaWNvbnMsIGNvbm5lY3Rpdml0eSBpY29ucywKKyAgICAgICAgICAgIGJhdHRlcnkgc3RhdHVzLCBjbG9jaywgZXRjLlxuCisgICAgICAgICAgICAyKSBUaGUgc3RhdHVzIGJhciBjYW5cJ3QgYmUgZXhwYW5kZWQuIFRoYXQgaXMsIHRoZSBcJ3N3aXBlLWRvd25cJyBnZXN0dXJlIGRvZXNuXCd0IHdvcmsKKyAgICAgICAgICAgIGZvciB0aGUgc3RhdHVzIGJhci5cbgorICAgICAgICAgICAgMykgTG9uZy1wcmVzcyB0aGUgcG93ZXIgYnV0dG9uLiBUaGUgcG93ZXIgYnV0dG9uIG1lbnUsIHdoaWNoIHVzdWFsbHkgc2hvd3MgdGhlIHBvd2VyLW9mZgorICAgICAgICAgICAgYnV0dG9uLCBldGMuLCBpc25cJ3Qgc2hvd24uXG4KKyAgICAgICAgICAgIDQpIFByZXNzIHRoZSBwb3dlciBidXR0b24gdG8gdHVybiBvZmYgdGhlIHNjcmVlbiwgYW5kIHByZXNzIGl0IGFnYWluIHRvIHR1cm4gdGhlIHNjcmVlbgorICAgICAgICAgICAgYmFjayBvbi4gTG9jayBzY3JlZW4gc2hvdWxkblwndCBiZSBzaG93bi5cbgorICAgICAgICAgICAgNSkgVGhlIGFzc2lzdCBnZXN0dXJlIGlzblwndCBhdmFpbGFibGUuXG5cbgorICAgICAgICAgICAgTWFyayB0aGUgdGVzdCBhcyBcJ3Bhc3NcJyBvbmx5IGlmIEFMTCBvZiB0aGUgYWJvdmUgcmVxdWlyZW1lbnRzIGFyZSBtZXQuCisgICAgPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZXZpY2Vfb3duZXJfbG9ja190YXNrX3VpX2dsb2JhbF9hY3Rpb25zX3Rlc3QiPkVuYWJsZSBnbG9iYWwgYWN0aW9uczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGV2aWNlX293bmVyX2xvY2tfdGFza191aV9nbG9iYWxfYWN0aW9uc190ZXN0X2luZm8iPgorICAgICAgICAgICAgUHJlc3MgdGhlIGJ1dHRvbiBiZWxvdyB0byBlbmFibGUgZ2xvYmFsIGFjdGlvbnMgKGEuay5hLiBwb3dlciBidXR0b24gbWVudSkuIExvbmctcHJlc3MKKyAgICAgICAgICAgIHRoZSBwb3dlciBidXR0b24gYW5kIHZlcmlmeSBhIG1lbnUgY29udGFpbmluZyBwb3dlci1vZmYgYW5kIHJlc3RhcnQgYnV0dG9ucyBpcyBzaG93bi4KKyAgICAgICAgICAgIFRoaXMgbWVudSBjYW5cJ3QgY29udGFpbiBhbnkgVUkgdGhhdCBhbGxvd3MgdGhlIHVzZXIgdG8gY2hhbmdlIHN5c3RlbSBzZXR0aW5ncyAoc3VjaCBhcworICAgICAgICAgICAgYWlycGxhbmUgbW9kZSBzd2l0Y2gpIG9yIGFjY2VzcyB0aGUgU2V0dGluZ3MgYXBwLlxuXG4KKyAgICAgICAgICAgIFRoZSByZXN0IG9mIHRoZSBVSSByZXN0cmljdGlvbnMgc2hvdWxkIHN0aWxsIGFwcGx5OlxuCisgICAgICAgICAgICAxKSBOb3RoaW5nIGlzIHNob3duIGluIHRoZSBzdGF0dXMgYmFyLCBpbmNsdWRpbmcgbm90aWZpY2F0aW9uIGljb25zLCBjb25uZWN0aXZpdHkgaWNvbnMsCisgICAgICAgICAgICBiYXR0ZXJ5IHN0YXR1cywgY2xvY2ssIGV0Yy5cbgorICAgICAgICAgICAgMikgVGhlIHN0YXR1cyBiYXIgY2FuXCd0IGJlIGV4cGFuZGVkLiBUaGF0IGlzLCB0aGUgXCdzd2lwZS1kb3duXCcgZ2VzdHVyZSBkb2VzblwndCB3b3JrCisgICAgICAgICAgICBmb3IgdGhlIHN0YXR1cyBiYXIuXG4KKyAgICAgICAgICAgIDMpIFRoZSBzb2Z0d2FyZSBIb21lIGJ1dHRvbiBpcyBoaWRkZW4uXG4KKyAgICAgICAgICAgIDQpIFRoZSBzb2Z0d2FyZSBPdmVydmlldyBidXR0b24gaXMgaGlkZGVuIGFuZCB0aGUgT3ZlcnZpZXcgZ2VzdHVyZSAoc3dpcGUtdXApIGRvZXMgbm90CisgICAgICAgICAgICB3b3JrLlxuCisgICAgICAgICAgICA1KSBQcmVzcyB0aGUgcG93ZXIgYnV0dG9uIHRvIHR1cm4gb2ZmIHRoZSBzY3JlZW4sIGFuZCBwcmVzcyBpdCBhZ2FpbiB0byB0dXJuIHRoZSBzY3JlZW4KKyAgICAgICAgICAgIGJhY2sgb24uIExvY2sgc2NyZWVuIHNob3VsZG5cJ3QgYmUgc2hvd24uXG4KKyAgICAgICAgICAgIDYpIFRoZSBhc3Npc3QgZ2VzdHVyZSBpc25cJ3QgYXZhaWxhYmxlLlxuXG4KKyAgICAgICAgICAgIE1hcmsgdGhlIHRlc3QgYXMgXCdwYXNzXCcgb25seSBpZiBBTEwgb2YgdGhlIGFib3ZlIHJlcXVpcmVtZW50cyBhcmUgbWV0LgorICAgIDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGV2aWNlX293bmVyX2xvY2tfdGFza191aV9rZXlndWFyZF90ZXN0Ij5FbmFibGUga2V5Z3VhcmQ8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRldmljZV9vd25lcl9sb2NrX3Rhc2tfdWlfa2V5Z3VhcmRfdGVzdF9pbmZvIj4KKyAgICAgICAgICAgIFByZXNzIHRoZSBidXR0b24gYmVsb3cgdG8gZW5hYmxlIGtleWd1YXJkLiBQcmVzcyB0aGUgcG93ZXIgYnV0dG9uIHRvIHR1cm4gb2ZmIHRoZSBzY3JlZW4KKyAgICAgICAgICAgIGFuZCBwcmVzcyBpdCBhZ2FpbiB0byB0dXJuIHRoZSBzY3JlZW4gYmFjayBvbi4gVmVyaWZ5IHRoYXQgdGhlIGxvY2sgc2NyZWVuIGlzIHNob3duLlxuXG4KKyAgICAgICAgICAgIFRoZSByZXN0IG9mIHRoZSBVSSByZXN0cmljdGlvbnMgc2hvdWxkIHN0aWxsIGFwcGx5LCBib3RoIG9uIHRoZSBsb2NrIHNjcmVlbiBhbmQgYWZ0ZXIKKyAgICAgICAgICAgIHRoZSBsb2NrIHNjcmVlbiBpcyBkaXNtaXNzZWQ6XG4KKyAgICAgICAgICAgIDEpIE5vdGhpbmcgaXMgc2hvd24gaW4gdGhlIHN0YXR1cyBiYXIsIGluY2x1ZGluZyBub3RpZmljYXRpb24gaWNvbnMsIGNvbm5lY3Rpdml0eSBpY29ucywKKyAgICAgICAgICAgIGJhdHRlcnkgc3RhdHVzLCBjbG9jaywgZXRjLlxuCisgICAgICAgICAgICAyKSBUaGUgc3RhdHVzIGJhciBjYW5cJ3QgYmUgZXhwYW5kZWQuIFRoYXQgaXMsIHRoZSBcJ3N3aXBlLWRvd25cJyBnZXN0dXJlIGRvZXNuXCd0IHdvcmsKKyAgICAgICAgICAgIGZvciB0aGUgc3RhdHVzIGJhciwgZXZlbiBvbiB0aGUgbG9jayBzY3JlZW4uXG4KKyAgICAgICAgICAgIDMpIFRoZSBzb2Z0d2FyZSBIb21lIGJ1dHRvbiBpcyBoaWRkZW4uXG4KKyAgICAgICAgICAgIDQpIFRoZSBzb2Z0d2FyZSBPdmVydmlldyBidXR0b24gaXMgaGlkZGVuIGFuZCB0aGUgT3ZlcnZpZXcgZ2VzdHVyZSAoc3dpcGUtdXApIGRvZXMgbm90CisgICAgICAgICAgICB3b3JrLlxuCisgICAgICAgICAgICA1KSBMb25nLXByZXNzIHRoZSBwb3dlciBidXR0b24uIFRoZSBwb3dlciBidXR0b24gbWVudSwgd2hpY2ggdXN1YWxseSBzaG93cyB0aGUgcG93ZXItb2ZmCisgICAgICAgICAgICBidXR0b24sIGV0Yy4sIGlzblwndCBzaG93bi5cbgorICAgICAgICAgICAgNikgVGhlIGFzc2lzdCBnZXN0dXJlIGlzblwndCBhdmFpbGFibGUuXG5cbgorICAgICAgICAgICAgTWFyayB0aGUgdGVzdCBhcyBcJ3Bhc3NcJyBvbmx5IGlmIEFMTCBvZiB0aGUgYWJvdmUgcmVxdWlyZW1lbnRzIGFyZSBtZXQuCisgICAgPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZXZpY2Vfb3duZXJfbG9ja190YXNrX3VpX3N0b3BfbG9ja190YXNrX3Rlc3QiPlN0b3AgTG9ja1Rhc2sgbW9kZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGV2aWNlX293bmVyX2xvY2tfdGFza191aV9zdG9wX2xvY2tfdGFza190ZXN0X2luZm8iPgorICAgICAgICAgICAgUHJlc3MgdGhlIGJ1dHRvbiBiZWxvdyB0byBleGl0IExvY2tUYXNrIG1vZGUuXG5cbgorICAgICAgICAgICAgT2JzZXJ2ZSB0aGF0IHRoZSBVSSBoYXMgcmV0dXJuZWQgdG8gdGhlIG5vcm1hbCwgdW5yZXN0cmljdGVkIHN0YXRlLCBhbmQgaXMgbm8gbG9uZ2VyCisgICAgICAgICAgICBzdWJqZWN0IHRvIGFueSBMb2NrVGFzayByZXN0cmljdGlvbi5cblxuCisgICAgICAgICAgICBNYXJrIHRoZSB0ZXN0IGFzIFwncGFzc1wnIG9yIFwnZmFpbFwnIGFjY29yZGluZ2x5LgorICAgIDwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGV2aWNlX293bmVyX2xvY2tzY3JlZW5fc2VjdXJlIj5QbGVhc2UgcmVtb3ZlIGxvY2tzY3JlZW4gcGFzc3dvcmQ8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRldmljZV9wcm9maWxlX293bmVyX3Blcm1pc3Npb25fbG9ja2Rvd25fdGVzdCI+UGVybWlzc2lvbnMgbG9ja2Rvd248L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRldmljZV9wcm9maWxlX293bmVyX3Blcm1pc3Npb25fbG9ja2Rvd25fdGVzdF9pbnN0cnVjdGlvbnMiPgpAQCAtMjcxNyw4ICsyOTg5LDggQEAKICAgICA8c3RyaW5nIG5hbWU9ImRldmljZV9vd25lcl9kaXNhbGxvd191c2JfZmlsZV90cmFuc2Zlcl90ZXN0X2luZm8iPgogICAgICAgICAgICAgUGxlYXNlIHByZXNzIGJlbG93IGJ1dHRvbiB0byBzZXQgdGhlIFwiZGlzYWxsb3cgVVNCIGZpbGUgdHJhbnNmZXJcIiByZXN0cmljdGlvbi5cbgogICAgICAgICAgICAgSWYgYSBVU0Igbm90aWZpY2F0aW9uIGFwcGVhcnMsIG9wZW4gdGhlIG5vdGlmaWNhdGlvbiBhbmQgY2hlY2sgdGhhdCB0aGUKLSAgICAgICAgICAgIFwiVHJhbnNmZXIgZmlsZXMgKE1UUClcIiBhbmQgXCJUcmFuc2ZlciBwaG90b3MgKFBUUClcIiBjYW5ub3QgYmUgc2VsZWN0ZWQgYW5kIHRyaWdnZXIgYQotICAgICAgICAgICAgc3VwcG9ydCBtZXNzYWdlIHdoZW4gdHJ5aW5nIHRvIHNlbGVjdCB0aGVtLlxuCisgICAgICAgICAgICBcIlRyYW5zZmVyIGZpbGVzIChNVFApXCIgYW5kIFwiVHJhbnNmZXIgcGhvdG9zIChQVFApXCIgb3B0aW9ucyBlaXRoZXIgYXJlIG5vdCBkaXNwbGF5ZWQsCisgICAgICAgICAgICBvciB0aGV5IHRyaWdnZXIgYSBzdXBwb3J0IG1lc3NhZ2Ugd2hlbiB0cnlpbmcgdG8gc2VsZWN0IHRoZW0uXG4KICAgICAgICAgICAgIENoZWNrIGlmIHlvdSBjYW4gbW91bnQgdGhlIGRldmljZSBhcyBhIFVTQiBkcml2ZSBvbiB5b3VyIGRlc2t0b3AgY29tcHV0ZXIuIFRoZSB0ZXN0IGlzCiAgICAgICAgICAgICBzdWNjZXNzZnVsIGlmIHlvdSBjYW5ub3QgbW91bnQgdGhlIGRldmljZSwgYW5kIGZpbGVzIGZyb20geW91ciBwaG9uZSBjYW5ub3QgYmUKICAgICAgICAgICAgIGRvd25sb2FkZWQgdGhyb3VnaCBVU0IuXG4KQEAgLTI3ODAsNiArMzA1MiwxNiBAQAogICAgICAgICBcbgogICAgICAgICBVc2UgdGhlIEJhY2sgYnV0dG9uIHRvIHJldHVybiB0byB0aGlzIHBhZ2UuCiAgICAgPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZXZpY2Vfb3duZXJfZGlzYWxsb3dfYW1iaWVudF9kaXNwbGF5Ij5EaXNhbGxvdyBhbWJpZW50IGRpc3BsYXk8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRldmljZV9vd25lcl9kaXNhbGxvd19hbWJpZW50X2Rpc3BsYXlfaW5mbyI+CisgICAgICAgIFBsZWFzZSBwcmVzcyB0aGUgU2V0IHJlc3RyaWN0aW9uIGJ1dHRvbiB0byBzZXQgdGhlIHVzZXIgcmVzdHJpY3Rpb24uCisgICAgICAgIFRoZW4gcHJlc3MgR28gdG8gb3BlbiB0aGUgRGlzcGxheSBwYWdlIGluIFNldHRpbmdzLgorICAgICAgICBNYXJrIHRoaXMgdGVzdCBhcyBwYXNzZWQgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmc6XG5cbgorICAgICAgICAtIFRoZXJlIGlzIG5vIGFtYmllbnQgZGlzcGxheSBzZXR0aW5nIGluIERpc3BsYXkgU2V0dGluZ3MuXG4KKyAgICAgICAgLSBBbWJpZW50IGRpc3BsYXkgc2V0dGluZyBpcyBkaXNhYmxlZCB3aXRoIGFuIGluZm8gaWNvbiBvbiBpdC4gQ2xpY2tpbmcgb24gaXQgdHJpZ2dlcnMgYSBzdXBwb3J0IGRpYWxvZy5cbgorICAgICAgICBcbgorICAgICAgICBVc2UgdGhlIEJhY2sgYnV0dG9uIHRvIHJldHVybiB0byB0aGlzIHBhZ2UuCisgICAgPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkZXZpY2Vfb3duZXJfZGlzYWxsb3dfZGF0YV9yb2FtaW5nIj5EaXNhbGxvdyBkYXRhIHJvYW1pbmc8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRldmljZV9vd25lcl9kaXNhbGxvd19kYXRhX3JvYW1pbmdfaW5mbyI+CiAgICAgICAgIERldmljZSBzaG91bGQgaGF2ZSBhIHNpbSBjYXJkIHRvIHBlcmZvcm0gdGhpcyB0ZXN0LgpAQCAtMjk2MywyMCArMzI0NSwyOCBAQAogICAgICAgICAzLiBWZXJpZnkgdGhhdCBwZXJmb3JtaW5nIHRoZSBmb2xsb3dpbmcgYWN0aW9uIHdpbGwgdHJpZ2dlciBhIHN1cHBvcnQgZGlhbG9nOlxuCiAgICAgICAgICAgIDx4bGlmZjpnIGlkPSJ1c2VyX2FjdGlvbiIgZXhhbXBsZT0iQWRkaW5nIGFuIGFjY291bnQiPiUyJHM8L3hsaWZmOmc+LlxuCiAgICAgICAgIDQuIFZlcmlmeSB0aGF0IHRoZSBzdXBwb3J0IGRpYWxvZyBkaXNwbGF5cyB0aGUgc2hvcnQgc3VwcG9ydCBtZXNzYWdlIHNldCBlYXJsaWVyLlxuCi0gICAgICAgIDUuIFZlcmlmeSB0aGF0IGNsaWNraW5nIHRoZSAiTW9yZSBkZXRhaWxzIiBsaW5rIHdpbGwgcmVkaXJlY3QgdG8gRGV2aWNlIGFkbWluaXN0cmF0b3JzCisgICAgICAgIDUuIFZlcmlmeSB0aGF0IGNsaWNraW5nIHRoZSAiTGVhcm4gbW9yZSIgbGluayB3aWxsIHJlZGlyZWN0IHRvIERldmljZSBhZG1pbmlzdHJhdG9ycwogICAgICAgICAgICBwYWdlIGluIFNldHRpbmdzIGFwcCB3aGljaCBkaXNwbGF5cyB0aGUgbG9uZyBzdXBwb3J0IG1lc3NhZ2Ugc2V0IGVhcmxpZXIuXG4KICAgICA8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzZXJfcmVzdHJpY3Rpb25fc2V0X3N0ZXAiPgogICAgICAgICBTZXQgXCclc1wnIHVzZXIgcmVzdHJpY3Rpb24gYnkgdHVybmluZyBvbiB0aGUgc3dpdGNoIGJlbG93LgogICAgIDwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZGlzYWxsb3dfYWRkX3VzZXIiPkRpc2FsbG93IGFkZCB1c2VyPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJkaXNhbGxvd19hZGRfdXNlcl9hY3Rpb24iPkFkZGluZyBhIG5ldyB1c2VyPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaXNhbGxvd19hZGp1c3Rfdm9sdW1lIj5EaXNhbGxvdyBhZGp1c3Qgdm9sdW1lPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaXNhbGxvd19hZGp1c3Rfdm9sdW1lX2FjdGlvbiI+QWRqdXN0aW5nIHRoZSB2b2x1bWU8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpc2FsbG93X2NvbmZpZ19kYXRlX3RpbWUiPkRpc2FsbG93IGNvbmZpZyBkYXRlIGFuZCB0aW1lIHNldHRpbmdzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaXNhbGxvd19jb25maWdfZGF0ZV90aW1lX2FjdGlvbiI+Q29uZmlndXJpbmcgYXV0byB0aW1lLCB0aW1lLCBhdXRvIGRhdGUgb3IgZGF0ZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlzYWxsb3dfY29uZmlnX2xvY2F0aW9uIj5EaXNhbGxvdyBjb25maWcgbG9jYXRpb248L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpc2FsbG93X2NvbmZpZ19sb2NhdGlvbl9hY3Rpb24iPkVuYWJsaW5nIG9yIGRpc2FibGluZyBsb2NhdGlvbiBpbiBzZXR0aW5ncyBvciBxdWljayBzZXR0aW5nczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlzYWxsb3dfYWlycGxhbmVfbW9kZSI+RGlzYWxsb3cgYWlycGxhbmUgbW9kZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlzYWxsb3dfYWlycGxhbmVfbW9kZV9hY3Rpb24iPlRvZ2dsaW5nIGFpcnBsYW5lIG1vZGUgc3dpdGNoIGJhciBvciBjaGFuZ2luZyBhaXJwbGFuZSBtb2RlIHN0YXRlIGluIHF1aWNrIHNldHRpbmdzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaXNhbGxvd19jb25maWdfc2NyZWVuX3RpbWVvdXQiPkRpc2FsbG93IGNvbmZpZyBzbGVlcCBvcHRpb25zIHNldHRpbmdzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaXNhbGxvd19jb25maWdfc2NyZWVuX3RpbWVvdXRfYWN0aW9uIj5Db25maWd1cmluZyBzbGVlcCBvcHRpb25zIGluIERpc3BsYXkgb3IgQmF0dGVyeSBwYWdlLjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlzYWxsb3dfY29uZmlnX2JyaWdodG5lc3MiPkRpc2FsbG93IGNvbmZpZyBicmlnaHRuZXNzIHNldHRpbmdzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaXNhbGxvd19jb25maWdfYnJpZ2h0bmVzc19hY3Rpb24iPkNvbmZpZ3VyaW5nIGJyaWdodG5lc3MgbGV2ZWwgb3IgYWRhcHRpdmUgYnJpZ2h0bmVzcyBpbiBEaXNwbGF5IG9yIEJhdHRlcnkgcGFnZSwgb3IgdG9nZ2xpbmcgYnJpZ2h0bmVzcyBzbGlkZXIgaW4gcXVpY2sgc2V0dGluZ3M8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpc2FsbG93X2FwcHNfY29udHJvbCI+RGlzYWxsb3cgY29udHJvbGxpbmcgYXBwczwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlzYWxsb3dfYXBwc19jb250cm9sX2FjdGlvbiI+RElTQUJMRS9VTklOU1RBTEwvRk9SQ0UgU1RPUC1pbmcgYW55IGFwcCBpbiB0aGUgbWFuYWdlZCBkZXZpY2UvcHJvZmlsZSBvdGhlciB0aGFuIEN0c1ZlcmlmaWVyPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaXNhbGxvd19jb25maWdfY2VsbF9icm9hZGNhc3RzIj5EaXNhbGxvdyBjb25maWcgY2VsbCBicm9hZGNhc3RzPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJkaXNhbGxvd19jb25maWdfY2VsbF9icm9hZGNhc3RzX2FjdGlvbiI+Q29uZmlndXJpbmcgY2VsbCBicm9hZGNhc3RzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaXNhbGxvd19jb25maWdfY2VsbF9icm9hZGNhc3RzX2FjdGlvbiI+Q29uZmlndXJpbmcgZW1lcmdlbmN5IGFsZXJ0cyhjZWxsIGJyb2FkY2FzdHMpPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaXNhbGxvd19jb25maWdfY3JlZGVudGlhbHMiPkRpc2FsbG93IGNvbmZpZyBjcmVkZW50aWFsczwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlzYWxsb3dfY29uZmlnX2NyZWRlbnRpYWxzX2FjdGlvbiI+Q29uZmlndXJpbmcgdXNlciBjcmVkZW50aWFsczwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlzYWxsb3dfY29uZmlnX21vYmlsZV9uZXR3b3JrcyI+RGlzYWxsb3cgY29uZmlnIG1vYmlsZSBuZXR3b3Jrczwvc3RyaW5nPgpAQCAtMzAwMywxMyArMzI5MywzOSBAQAogICAgIDxzdHJpbmcgbmFtZT0iZGlzYWxsb3dfb3V0Z29pbmdfYmVhbSI+RGlzYWxsb3cgb3V0Z29pbmcgYmVhbTwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlzYWxsb3dfb3V0Z29pbmdfYmVhbV9hY3Rpb24iPlN3aXRjaGluZyBvbiBhbmRyb2lkIGJlYW08L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpc2FsbG93X3JlbW92ZV91c2VyIj5EaXNhbGxvdyByZW1vdmUgdXNlcjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZGlzYWxsb3dfcmVtb3ZlX3VzZXJfYWN0aW9uIj5SZW1vdmluZyBvdGhlciB1c2VycyAocGxlYXNlIGNyZWF0ZSBhIHVzZXIgYW5kIGF0dGVtcHQgdG8gcmVtb3ZlIGl0IHRvIHZlcmlmeSk8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRldmljZV9vd25lcl9kaXNhbGxvd19yZW1vdmVfdXNlcl9pbmZvIj4KKyAgICAgICAgUGxlYXNlIHByZXNzIFwnQ3JlYXRlIHVuaW5pdGlhbGl6ZWQgdXNlclwnIHRvIGNyZWF0ZSBhIHVzZXIgdGhhdCBpcyBub3Qgc2V0IHVwLiBUaGVuIHByZXNzIHRoZQorICAgICAgICBcJ1NldCByZXN0cmljdGlvblwnIGJ1dHRvbiB0byBzZXQgdGhlIHVzZXIgcmVzdHJpY3Rpb24uIFRoZW4gcHJlc3MgXCdHb1wnIHRvIG9wZW4gXCdTZXR0aW5nc1wnLAorICAgICAgICBhbmQgbWFudWFsbHkgZmluZCBhbmQgb3BlbiBcJ011bHRpcGxlIHVzZXJzXCcgc2V0dGluZy4gXG5cbgorCisgICAgICAgIE1hcmsgdGhpcyB0ZXN0IGFzIHBhc3NlZCBpZjpcblxuCisgICAgICAgIC0gVGhlIHVuaW5pdGlhbGl6ZWQgdXNlciBjYW5ub3QgYmUgcmVtb3ZlZC5cbgorICAgICAgICAtIFwnUmVtb3ZlIHVzZXJcJyBvcHRpb24gaXMgZGlzYWJsZWQgd2l0aCBhbiBpbmZvIGljb24gb24gaXQuIENsaWNraW5nIG9uIGl0IHRyaWdnZXJzIGEgc3VwcG9ydCBkaWFsb2cuXG5cbgorCisgICAgICAgIFVzZSB0aGUgQmFjayBidXR0b24gdG8gcmV0dXJuIHRvIHRoaXMgcGFnZS4KKyAgICA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1hbmFnZWRfdXNlcl9kaXNhbGxvd19yZW1vdmVfdXNlcl9pbmZvIj4KKyAgICAgICAgUGxlYXNlIHByZXNzIHRoZSBcJ1NldCByZXN0cmljdGlvblwnIGJ1dHRvbiB0byBzZXQgdGhlIHVzZXIgcmVzdHJpY3Rpb24uCisgICAgICAgIFRoZW4gcHJlc3MgXCdHb1wnIHRvIG9wZW4gXCdTZXR0aW5nc1wnLCBhbmQgbWFudWFsbHkgZmluZCBhbmQgb3BlbiBcJ011bHRpcGxlIHVzZXJzXCcgc2V0dGluZy4gXG5cbgorCisgICAgICAgIE1hcmsgdGhpcyB0ZXN0IGFzIHBhc3NlZCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIG1ldDpcblxuCisgICAgICAgIC0gXCdSZW1vdmUgdXNlclwnIG9wdGlvbiBpcyBkaXNhYmxlZCB3aXRoIGFuIGluZm8gaWNvbiBvbiBpdC4gQ2xpY2tpbmcgb24gaXQgdHJpZ2dlcnMgYSBzdXBwb3J0IGRpYWxvZy5cbgorICAgICAgICAtIFwnUmVtb3ZlIHVzZXJcJyBvcHRpb24gY2Fubm90IGJlIGZvdW5kLlxuIFxuCisKKyAgICAgICAgVXNlIHRoZSBCYWNrIGJ1dHRvbiB0byByZXR1cm4gdG8gdGhpcyBwYWdlLgorICAgIDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGV2aWNlX293bmVyX2Rpc2FsbG93X3JlbW92ZV91c2VyX2NyZWF0ZV91c2VyIj5DcmVhdGUgdW5pbml0aWFsaXplZCB1c2VyPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaXNhbGxvd19yZW1vdmVfbWFuYWdlZF9wcm9maWxlIj5EaXNhbGxvdyByZW1vdmUgbWFuYWdlZCBwcm9maWxlPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaXNhbGxvd19yZW1vdmVfbWFuYWdlZF9wcm9maWxlX2FjdGlvbiI+UmVtb3ZpbmcgdGhlIHdvcmsgcHJvZmlsZS4gSXQgc2hvdWxkblwndCBiZSBwb3NzaWJsZSBuZWl0aGVyIGZyb20gdGhlIEFjY291bnRzIHNjcmVlbiBub3IgdGhlIERldmljZSBBZG1pbmlzdHJhdG9ycyBzY3JlZW4gKGFmdGVyIHNlbGVjdGluZyB0aGUgRGV2aWNlIEFkbWluaXN0cmF0b3IgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgYmFkZ2VkIHZlcnNpb24gb2YgXCJDVFMgVmVyaWZpZXJcIik8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpc2FsbG93X3NoYXJlX2xvY2F0aW9uIj5EaXNhbGxvdyBzaGFyZSBsb2NhdGlvbjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlzYWxsb3dfc2hhcmVfbG9jYXRpb25fYWN0aW9uIj5UdXJuaW5nIG9uIGxvY2F0aW9uIHNoYXJpbmc8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpc2FsbG93X3VuaW5zdGFsbF9hcHBzIj5EaXNhbGxvdyB1bmluc3RhbGwgYXBwczwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZGlzYWxsb3dfdW5pbnN0YWxsX2FwcHNfYWN0aW9uIj5Vbmluc3RhbGxpbmcgYXBwbGljYXRpb25zIG90aGVyIEN0c1ZlcmlmaWVyPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaXNhbGxvd191bmluc3RhbGxfYXBwc19hY3Rpb24iPgorICAgICAgICBhLiBJZiB0ZXN0aW5nIGluIHdvcmsgcHJvZmlsZTogdW5pbnN0YWxsIGFwcGxpY2F0aW9ucyBmcm9tIHRoZSB3b3JrIHByb2ZpbGUgKGJhZGdlZCBhcHBsaWNhdGlvbnMpIG90aGVyIHRoYW4gQ3RzVmVyaWZpZXIgYW5kIHN5c3RlbSBhcHBzLiBcbgorICAgICAgICBiLiBPdGhlcndpc2U6IHVuaW5zdGFsbCBhcHBsaWNhdGlvbnMgb3RoZXIgdGhhbiBDdHNWZXJpZmllciBhbmQgc3lzdGVtIGFwcHMKKyAgICA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpc2FsbG93X3VuaWZpZWRfY2hhbGxlbmdlIj5EaXNhbGxvdyB1bmlmaWVkIGNoYWxsZW5nZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlzYWxsb3dfdW5pZmllZF9jaGFsbGVuZ2VfYWN0aW9uIj5TZXR0aW5nIG9uZSBsb2NrIGZvciBib3RoIHBlcnNvbmFsIGFuZCB3b3JrIHByb2ZpbGVzLiBJTVBPUlRBTlQ6IFNlcGFyYXRlIHdvcmsgbG9jayBzaG91bGQgYmUgc2V0IHByaW9yIHRvIHRoaXMgdGVzdCBpbiBTZXQgd29yayBsb2NrIHRlc3Q8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpc2FsbG93X2tleWd1YXJkX3VucmVkYWN0ZWRfbm90aWZpY2F0aW9ucyI+RGlzYWxsb3cgbG9ja3NjcmVlbiB1bnJlZGFjdGVkIG5vdGlmaWNhdGlvbjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlzYWxsb3dfa2V5Z3VhcmRfdW5yZWRhY3RlZF9ub3RpZmljYXRpb25zX3NldF9zdGVwIj5EaXNhbGxvdyB1bnJlZGFjdGVkIG5vdGlmaWNhdGlvbnMgd2hlbiBkZXZpY2UgaXMgbG9ja2VkIGJ5IHR1cm5pbmcgb24gdGhlIHN3aXRjaCBiZWxvdzwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlzYWxsb3dfa2V5Z3VhcmRfdW5yZWRhY3RlZF9ub3RpZmljYXRpb25zX2FjdGlvbiI+U2VsZWN0aW5nIHNob3cgYWxsIG5vdGlmaWNhdGlvbiBjb250ZW50IHdoZW4gZGV2aWNlIGlzIGxvY2tlZDwvc3RyaW5nPgpAQCAtMzM2OCw4ICszNjg0LDY5IEBACiAgICAgPHN0cmluZyBuYW1lPSJjb21wX3Rlc3QiPkNvcnBvcmF0ZSBPd25lZCBNYW5hZ2VkIFByb2ZpbGU8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvbXBfcHJvdmlzaW9uX3Byb2ZpbGVfZGlhbG9nX3RpdGxlIj5Qcm92aXNpb24gd29yayBwcm9maWxlPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb21wX3Byb3Zpc2lvbl9wcm9maWxlX2RpYWxvZ190ZXh0Ij5QcmVzcyB0aGUgT0sgYnV0dG9uIHRvIHN0YXJ0IHRoZSBtYW5hZ2VkIHByb3Zpc2lvbmluZyBmbG93LCBhbmQgY29tcGxldGUgdGhlIGZsb3cgdG8gY3JlYXRlIGEgd29yayBwcm9maWxlPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJkZXZpY2Vfb3duZXJfc2tpcHBlZF9wcmVsb2FkZWRfYWNjb3VudHMiPkRldmljZSBvd25lciB0ZXN0cyBhcmUgc2tpcHBlZCBiZWNhdXNlIG9mIHByZWxvYWRlZCBhY2NvdW50cy4gVGFwIGJhY2sgdG8gY29udGludWUgdGVzdGluZy48L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVtcHR5X2RldmljZV9vd25lcl9ub3RfY29uZmlndXJlX3Byb3Blcmx5Ij5FaXRoZXIgQ3RzRW1wdHlEZXZpY2VPd25lciBpcyBub3QgaW5zdGFsbGVkIG9yIHNldC1kZXZpY2Utb3duZXIgaXMgbm90IHJ1biBwcm9wZXJseS4gUGxlYXNlIHRyeSBpdCBhZ2Fpbi48L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0ibWFuYWdlZF91c2VyX3Rlc3QiPk1hbmFnZWQgVXNlcjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWFuYWdlZF91c2VyX3Bvc2l0aXZlX3Rlc3RzIj5NYW5hZ2VkIFVzZXIgcG9zaXRpdmUgdGVzdHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1hbmFnZWRfdXNlcl9wb3NpdGl2ZV90ZXN0c19pbnN0cnVjdGlvbnMiPgorICAgICAgICBUaGUgcG9zaXRpdmUgbWFuYWdlZCB1c2VyIHRlc3RzIHZlcmlmeSBwb2xpY2llcyBvbiBhIG1hbmFnZWQgdXNlciBjcmVhdGVkIGJ5IGEgZGV2aWNlIG93bmVyLgorICAgICAgICBcbgorICAgICAgICBQcmVzcyBHbyBidXR0b24gdG8gY3JlYXRlIGEgbWFuYWdlZCB1c2VyLCBhbmQgeW91IHdpbGwgYmUgc3dpdGNoZWQgdG8gdGhlIG1hbmFnZWQgdXNlcgorICAgICAgICBhdXRvbWF0aWNhbGx5LiBEaXNtaXNzIHRoZSBrZXlndWFyZCBhbmQgYSBcJ01hbmFnZWQgVXNlciBUZXN0c1wnIHNob3VsZCBsYXVuY2guXG4KKyAgICAgICAgRm9sbG93IHRoZSB0ZXN0IGluc3RydWN0aW9ucyBhbmQgcHJlc3MgXCdwYXNzXCcgb3IgXCdmYWlsXCcgdG8gcmV0dXJuIHRvIHRoaXMgc2NyZWVuLlxuCisgICAgPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtYW5hZ2VkX3VzZXJfcG9zaXRpdmVfdGVzdHNfaW5mbyI+CisgICAgICAgIFRoZSBwb3NpdGl2ZSBtYW5hZ2VkIHVzZXIgdGVzdHMgdmVyaWZ5IHBvbGljaWVzIG9uIGEgbWFuYWdlZCB1c2VyIGNyZWF0ZWQgYnkgYSBkZXZpY2Ugb3duZXIuCisgICAgICAgIFByb2NlZWQgdG8gdGhlIHRlc3QgY2FzZXMsIHRoZW4gcHJlc3MgXCdwYXNzXCcgb3IgXCdmYWlsXCcgdG8gZmluaXNoIHRoaXMgdGVzdC4KKyAgICA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1hbmFnZWRfdXNlcl9wb3NpdGl2ZV9jYXRlZ29yeSI+TWFuYWdlZCBVc2VyIFRlc3RzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtYW5hZ2VkX3VzZXJfY2hlY2tfbWFuYWdlZF91c2VyX3Rlc3QiPkNoZWNrIGFmZmlsaWF0ZWQgcHJvZmlsZSBvd25lcjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWFuYWdlZF91c2VyX2luY29ycmVjdF9tYW5hZ2VkX3VzZXIiPk1pc3Npbmcgb3IgaW5jb3JyZWN0IGFmZmlsaWF0ZWQgcHJvZmlsZSBvd25lcjogQ1RTVmVyaWZpZXIgaXMgbm90IGFmZmlsYWl0ZWQgUE8hPC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImRldmljZV9vd25lcl9kaXNhbGxvd191c2VyX3N3aXRjaCI+RGlzYWxsb3cgdXNlciBzd2l0Y2g8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRldmljZV9vd25lcl9kaXNhbGxvd191c2VyX3N3aXRjaF9pbmZvIj4KKyAgICAgICAgUHJlc3MgXCdDcmVhdGUgdW5pbml0aWFsaXplZCB1c2VyXCcgdG8gY3JlYXRlIGEgdXNlciB0aGF0IGlzIG5vdCBzZXR1cC4KKyAgICAgICAgVGhlbiBwcmVzcyBTZXQgcmVzdHJpY3Rpb24gYnV0dG9uIHRvIHNldCB0aGUgdXNlciByZXN0cmljdGlvbi4KKyAgICAgICAgVGhlbiBwcmVzcyBHbyB0byBvcGVuIHRoZSBTZXR0aW5ncywgYW5kIG1hbnVhbGx5IGZpbmQgYW5kIG9wZW4gdXNlciBzZXR0aW5ncyBzZWN0aW9uLgorICAgICAgICBDb25maXJtIHRoYXQ6XG4KKyAgICAgICAgXG4KKyAgICAgICAgLSBTZWxlY3RpbmcgdW5pbml0aWFsaXplZCB1c2VyIHNob3VsZCBub3QgdHJpZ2dlciB1c2VyIHN3aXRjaC5cbgorICAgICAgICBcbgorICAgICAgICBJbiBhZGRpdGlvbmFsLCBpZiBxdWljayBzZXR0aW5ncyBpcyBhdmFpbGFibGUsIGNvbmZpcm0gdGhhdCB1c2VyIHN3aXRjaGVyIGlzIGhpZGRlbiBvcgorICAgICAgICBkaXNhYmxlZC4KKyAgICAgICAgVXNlIHRoZSBCYWNrIGJ1dHRvbiB0byByZXR1cm4gdG8gdGhpcyBwYWdlLgorICAgIDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGV2aWNlX293bmVyX2Rpc2FsbG93X3VzZXJfc3dpdGNoX2NyZWF0ZV91c2VyIj5DcmVhdGUgdW5pbml0aWFsaXplZCB1c2VyPC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImRldmljZV9vd25lcl91c2VyX3N3aXRjaGVyX21lc3NhZ2UiPlVzZXIgc3dpdGNoZXIgbWVzc2FnZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGV2aWNlX293bmVyX3VzZXJfc3dpdGNoZXJfbWVzc2FnZV9pbmZvIj4KKyAgICAgICAgMS4gUGxlYXNlIHByZXNzIHRoZSBcJ1dpdGggdXNlciBzd2l0Y2hlciBtZXNzYWdlXCcgYnV0dG9uIHRvIHNldCB0aGUgdXNlciBzd2l0Y2hlciBtZXNzYWdlLgorICAgICAgICBZb3Ugd2lsbCB0aGVuIGJlIGF1dG9tYXRpY2FsbHkgc3dpdGNoZWQgdG8gYSBzZWNvbmRhcnkgdXNlci4gSWYgYSB1c2VyIHN3aXRjaGVyIGRpYWxvZyBzaG93cworICAgICAgICB1cCwgaXQgc2hvdWxkIHJlYWQgXCdTdGFydCB1c2VyIHNlc3Npb25cJy4gV2FpdCB1bnRpbCB5b3UgYXJlIGF1dG9tYXRpY2FsbHkgc3dpdGNoZWQgYmFjayB0bworICAgICAgICBwcmltYXJ5LCBpZiBhIHVzZXIgc3dpdGNoZXIgZGlhbG9nIHNob3dzIHVwLCBpdCBzaG91bGQgcmVhZCBcJ0VuZCB1c2VyIHNlc3Npb25cJy4KKworICAgICAgICBcbgorICAgICAgICAyLiBQbGVhc2UgcHJlc3MgdGhlIFwnV2l0aG91dCB1c2VyIHN3aXRjaGVyIG1lc3NhZ2VcJyBidXR0b24gdG8gY2xlYXIgdGhlIHVzZXIgc3dpdGNoZXIKKyAgICAgICAgbWVzc2FnZS4gWW91IHdpbGwgdGhlbiBiZSBhdXRvbWF0aWNhbGx5IHN3aXRjaGVkIHRvIGEgc2Vjb25kYXJ5IHVzZXIuIElmIGEgdXNlciBzd2l0Y2hlcgorICAgICAgICBkaWFsb2cgc2hvd3MgdXAsIGl0IHNob3VsZCByZWFkIFwnU3dpdGNoaW5nIHRvIG1hbmFnZWQgdXNlclwnLiBXYWl0IHVudGlsIHlvdSBhcmUKKyAgICAgICAgYXV0b21hdGljYWxseSBzd2l0Y2hlZCBiYWNrIHRvIHByaW1hcnksIGlmIGEgdXNlciBzd2l0Y2hlciBkaWFsb2cgc2hvd3MgdXAsIGl0IHNob3VsZCByZWFkCisgICAgICAgIFwnU3dpdGNoaW5nIHRvIChuYW1lIG9mIHByaW1hcnkgdXNlcilcJy4KKyAgICA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRldmljZV9vd25lcl93aXRoX3VzZXJfc3dpdGNoZXJfbWVzc2FnZSI+V2l0aCB1c2VyIHN3aXRjaGVyIG1lc3NhZ2U8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRldmljZV9vd25lcl93aXRob3V0X3VzZXJfc3dpdGNoZXJfbWVzc2FnZSI+V2l0aG91dCB1c2VyIHN3aXRjaGVyIG1lc3NhZ2U8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iZGV2aWNlX293bmVyX2VuYWJsZV9sb2dvdXQiPkxvZ291dDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGV2aWNlX293bmVyX2VuYWJsZV9sb2dvdXRfaW5mbyI+CisgICAgICAgIFBsZWFzZSBwcmVzcyB0aGUgR28gYnV0dG9uIHRvIGVuYWJsZSBsb2dvdXQuIFlvdSB3aWxsIHRoZW4gYmUgc3dpdGNoZWQgdG8gYSBuZXdseSBjcmVhdGVkCisgICAgICAgIHVzZXIuCisgICAgICAgIExvb2sgZm9yIGEgd2F5IHRvIGxvZ291dCB0aGUgY3VycmVudCB1c2VyIHdpdGhvdXQgdW5sb2NraW5nIHRoZSBsb2NrIHNjcmVlbi4gVGhlIGNvbnRyb2wgaXMKKyAgICAgICAgdXN1YWxseSBuYW1lZCBcJ0VuZCBzZXNzaW9uXCcuXG4KKyAgICAgICAgVGhlIGxvY2F0aW9uIG1heSB2YXJ5IGRlcGVuZGluZyBvbiBtYW51ZmFjdHVyZXIsIHR5cGljYWwgbG9jYXRpb25zIGFyZTpcbgorICAgICAgICAtIEluIHBvd2VyIGJ1dHRvbiBtZW51IGJ5IGxvbmcgcHJlc3NpbmcgcG93ZXIgYnV0dG9uLlxuCisgICAgICAgIC0gT24gdGhlIGxvY2sgc2NyZWVuLlxuCisgICAgICAgIFxuCisgICAgICAgIFdoZW4gc3VjY2Vzc2Z1bGx5IGxvZ291dCBhbmQgc3dpdGNoZWQgYmFjayB0byBwcmltYXJ5IHVzZXIsIGNvbmZpcm0gdGhhdCB0aGUgbG9nb3V0IGNvbnRyb2wKKyAgICAgICAgaXMgbm90IGF2YWlsYWJsZSBpbiBwcmltYXJ5IHVzZXIuCisgICAgPC9zdHJpbmc+CiAKICAgICA8IS0tIFN0cmluZ3MgZm9yIEpvYlNjaGVkdWxlciBUZXN0cyAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImpzX3Rlc3RfZGVzY3JpcHRpb24iPlRoaXMgdGVzdCBpcyBtb3N0bHkgYXV0b21hdGVkLCBidXQgcmVxdWlyZXMgc29tZSB1c2VyIGludGVyYWN0aW9uLiBZb3UgY2FuIHBhc3MgdGhpcyB0ZXN0IG9uY2UgdGhlIGxpc3QgaXRlbXMgYmVsb3cgYXJlIGNoZWNrZWQuPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3Jlcy94bWwvZGV2aWNlX2FkbWluX2J5b2QueG1sIGIvYXBwcy9DdHNWZXJpZmllci9yZXMveG1sL2RldmljZV9hZG1pbl9ieW9kLnhtbAppbmRleCBiMWJhMzcyLi4yZDMzNDU5IDEwMDY0NAotLS0gYS9hcHBzL0N0c1ZlcmlmaWVyL3Jlcy94bWwvZGV2aWNlX2FkbWluX2J5b2QueG1sCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvcmVzL3htbC9kZXZpY2VfYWRtaW5fYnlvZC54bWwKQEAgLTE2LDYgKzE2LDcgQEAKIAogPCEtLSBCRUdJTl9JTkNMVURFKG1ldGFfZGF0YSkgLS0+CiA8ZGV2aWNlLWFkbWluIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPHN1cHBvcnQtdHJhbnNmZXItb3duZXJzaGlwLz4KICAgICA8dXNlcy1wb2xpY2llcz4KICAgICAgICAgPGxpbWl0LXBhc3N3b3JkIC8+CiAgICAgICAgIDx3YXRjaC1sb2dpbiAvPgpkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9yZXMveG1sL25ldHdvcmtfc2VjdXJpdHlfY29uZmlnLnhtbCBiL2FwcHMvQ3RzVmVyaWZpZXIvcmVzL3htbC9uZXR3b3JrX3NlY3VyaXR5X2NvbmZpZy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE1YzA5YwotLS0gL2Rldi9udWxsCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvcmVzL3htbC9uZXR3b3JrX3NlY3VyaXR5X2NvbmZpZy54bWwKQEAgLTAsMCArMSw0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPG5ldHdvcmstc2VjdXJpdHktY29uZmlnPgorICAgIDxiYXNlLWNvbmZpZyBjbGVhcnRleHRUcmFmZmljUGVybWl0dGVkPSJ0cnVlIi8+Cis8L25ldHdvcmstc2VjdXJpdHktY29uZmlnPgpkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9yZXMveG1sL3VsdHJhc291bmRfbGluZV9mb3JtYXR0ZXJfbWVkaWFuLnhtbCBiL2FwcHMvQ3RzVmVyaWZpZXIvcmVzL3htbC91bHRyYXNvdW5kX2xpbmVfZm9ybWF0dGVyX21lZGlhbi54bWwKaW5kZXggOWM2ZGU3Ny4uZGQxODIzNiAxMDA2NDQKLS0tIGEvYXBwcy9DdHNWZXJpZmllci9yZXMveG1sL3VsdHJhc291bmRfbGluZV9mb3JtYXR0ZXJfbWVkaWFuLnhtbAorKysgYi9hcHBzL0N0c1ZlcmlmaWVyL3Jlcy94bWwvdWx0cmFzb3VuZF9saW5lX2Zvcm1hdHRlcl9tZWRpYW4ueG1sCkBAIC0zLDQgKzMsNCBAQAogICAgICAgICBsaW5lUGFpbnQuc3Ryb2tlV2lkdGg9IjNkcCIKICAgICAgICAgbGluZVBhaW50LmNvbG9yPSIjQUEwMDAwIgogICAgICAgICB2ZXJ0ZXhQYWludC5jb2xvcj0iIzc3MDAwMCIKLSAgICAgICAgZmlsbFBhaW50LmNvbG9yPSIjMDAwMDAwMDAiIC8+CisgICAgICAgIGZpbGxQYWludC5jb2xvcj0iIzc3MDAwMCIgLz4KZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXIvcmVzL3htbC91bHRyYXNvdW5kX2xpbmVfZm9ybWF0dGVyX25vaXNlLnhtbCBiL2FwcHMvQ3RzVmVyaWZpZXIvcmVzL3htbC91bHRyYXNvdW5kX2xpbmVfZm9ybWF0dGVyX25vaXNlLnhtbAppbmRleCA4ZmIyMzZlLi4wZjI3NTAzIDEwMDY0NAotLS0gYS9hcHBzL0N0c1ZlcmlmaWVyL3Jlcy94bWwvdWx0cmFzb3VuZF9saW5lX2Zvcm1hdHRlcl9ub2lzZS54bWwKKysrIGIvYXBwcy9DdHNWZXJpZmllci9yZXMveG1sL3VsdHJhc291bmRfbGluZV9mb3JtYXR0ZXJfbm9pc2UueG1sCkBAIC0zLDQgKzMsNCBAQAogICAgICAgICBsaW5lUGFpbnQuc3Ryb2tlV2lkdGg9IjJkcCIKICAgICAgICAgbGluZVBhaW50LmNvbG9yPSIjNzc3Nzc3IgogICAgICAgICB2ZXJ0ZXhQYWludC5jb2xvcj0iNzc3Nzc3IgotICAgICAgICBmaWxsUGFpbnQuY29sb3I9IiMwMDAwMDAwMCIgLz4KKyAgICAgICAgZmlsbFBhaW50LmNvbG9yPSIjNzcwMDAwIiAvPgpkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9yZXMveG1sL3VsdHJhc291bmRfbGluZV9mb3JtYXR0ZXJfcGFzcy54bWwgYi9hcHBzL0N0c1ZlcmlmaWVyL3Jlcy94bWwvdWx0cmFzb3VuZF9saW5lX2Zvcm1hdHRlcl9wYXNzLnhtbAppbmRleCA5YTZjMjlhLi4wMTFmMjBiIDEwMDY0NAotLS0gYS9hcHBzL0N0c1ZlcmlmaWVyL3Jlcy94bWwvdWx0cmFzb3VuZF9saW5lX2Zvcm1hdHRlcl9wYXNzLnhtbAorKysgYi9hcHBzL0N0c1ZlcmlmaWVyL3Jlcy94bWwvdWx0cmFzb3VuZF9saW5lX2Zvcm1hdHRlcl9wYXNzLnhtbApAQCAtMyw0ICszLDQgQEAKICAgICAgICAgbGluZVBhaW50LnN0cm9rZVdpZHRoPSIyZHAiCiAgICAgICAgIGxpbmVQYWludC5jb2xvcj0iIzAwNzcwMCIKICAgICAgICAgdmVydGV4UGFpbnQuY29sb3I9IiMwMDc3MDAiCi0gICAgICAgIGZpbGxQYWludC5jb2xvcj0iIzAwMDAwMDAwIiAvPgorICAgICAgICBmaWxsUGFpbnQuY29sb3I9IiM4ODAwMDAiIC8+CmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3Jlcy94bWwvdWx0cmFzb3VuZF9saW5lX2Zvcm1hdHRlcl90cmlhbHMueG1sIGIvYXBwcy9DdHNWZXJpZmllci9yZXMveG1sL3VsdHJhc291bmRfbGluZV9mb3JtYXR0ZXJfdHJpYWxzLnhtbAppbmRleCAzZjlmZmMyLi5jZTA5ZGZiIDEwMDY0NAotLS0gYS9hcHBzL0N0c1ZlcmlmaWVyL3Jlcy94bWwvdWx0cmFzb3VuZF9saW5lX2Zvcm1hdHRlcl90cmlhbHMueG1sCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvcmVzL3htbC91bHRyYXNvdW5kX2xpbmVfZm9ybWF0dGVyX3RyaWFscy54bWwKQEAgLTEsNiArMSw3IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgogPGNvbmZpZwotICAgICAgICBsaW5lUGFpbnQuc3Ryb2tlV2lkdGg9IjFkcCIKLSAgICAgICAgbGluZVBhaW50LmNvbG9yPSIjQUFBQUFBIgotICAgICAgICB2ZXJ0ZXhQYWludC5jb2xvcj0iIzc3Nzc3NyIKLSAgICAgICAgZmlsbFBhaW50LmNvbG9yPSIjMDAwMDAwMDAiIC8+CisgICAgICAgIGxpbmVQYWludC5zdHJva2VXaWR0aD0iM2RwIgorICAgICAgICBsaW5lUGFpbnQuY29sb3I9IiMwMEFBMDAiCisgICAgICAgIHZlcnRleFBhaW50LmNvbG9yPSIjMDA3NzAwIgorICAgICAgICBmaWxsUGFpbnQuY29sb3I9IiMwMGZmMDAiCisgICAgICAgIHBvaW50TGFiZWxGb3JtYXR0ZXIudGV4dFBhaW50LmNvbG9yPSIjRkZGRkZGIi8+CmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvVGVzdFJlc3VsdC5qYXZhIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL1Rlc3RSZXN1bHQuamF2YQppbmRleCBjNWQyZDUyLi4wNzIwOGRkIDEwMDY0NAotLS0gYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvVGVzdFJlc3VsdC5qYXZhCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9UZXN0UmVzdWx0LmphdmEKQEAgLTY4LDcgKzY4LDcgQEAKICAgICAgICAgICAgICAgICB0ZXN0RGV0YWlscywgcmVwb3J0TG9nKSk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgSW50ZW50IGNyZWF0ZVJlc3VsdChBY3Rpdml0eSBhY3Rpdml0eSwgaW50IHRlc3RSZXN1bHQsIFN0cmluZyB0ZXN0TmFtZSwKKyAgICBwdWJsaWMgc3RhdGljIEludGVudCBjcmVhdGVSZXN1bHQoQWN0aXZpdHkgYWN0aXZpdHksIGludCB0ZXN0UmVzdWx0LCBTdHJpbmcgdGVzdE5hbWUsCiAgICAgICAgICAgICBTdHJpbmcgdGVzdERldGFpbHMsIFJlcG9ydExvZyByZXBvcnRMb2cpIHsKICAgICAgICAgSW50ZW50IGRhdGEgPSBuZXcgSW50ZW50KGFjdGl2aXR5LCBhY3Rpdml0eS5nZXRDbGFzcygpKTsKICAgICAgICAgYWRkUmVzdWx0RGF0YShkYXRhLCB0ZXN0UmVzdWx0LCB0ZXN0TmFtZSwgdGVzdERldGFpbHMsIHJlcG9ydExvZyk7CmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvVGVzdFJlc3VsdHNSZXBvcnQuamF2YSBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9UZXN0UmVzdWx0c1JlcG9ydC5qYXZhCmluZGV4IDhjNzc5YzUuLjg4OTNlMGQgMTAwNjQ0Ci0tLSBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9UZXN0UmVzdWx0c1JlcG9ydC5qYXZhCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9UZXN0UmVzdWx0c1JlcG9ydC5qYXZhCkBAIC0xMDMsNyArMTAzLDcgQEAKICAgICAgICAgRGV2aWNlUHJvcGVydHlJbmZvIGRldmljZVByb3BlcnR5SW5mbyA9IG5ldyBEZXZpY2VQcm9wZXJ0eUluZm8oQnVpbGQuQ1BVX0FCSSwKICAgICAgICAgICAgICAgICBCdWlsZC5DUFVfQUJJMiwgYWJpcywgYWJpczMyLCBhYmlzNjQsIEJ1aWxkLkJPQVJELCBCdWlsZC5CUkFORCwgQnVpbGQuREVWSUNFLAogICAgICAgICAgICAgICAgIEJ1aWxkLkZJTkdFUlBSSU5ULCBCdWlsZC5JRCwgQnVpbGQuTUFOVUZBQ1RVUkVSLCBCdWlsZC5NT0RFTCwgQnVpbGQuUFJPRFVDVCwKLSAgICAgICAgICAgICAgICByZWZlcmVuY2VGaW5nZXJwcmludCwgQnVpbGQuU0VSSUFMLCBCdWlsZC5UQUdTLCBCdWlsZC5UWVBFLCB2ZXJzaW9uQmFzZU9zLAorICAgICAgICAgICAgICAgIHJlZmVyZW5jZUZpbmdlcnByaW50LCBCdWlsZC5nZXRTZXJpYWwoKSwgQnVpbGQuVEFHUywgQnVpbGQuVFlQRSwgdmVyc2lvbkJhc2VPcywKICAgICAgICAgICAgICAgICBCdWlsZC5WRVJTSU9OLlJFTEVBU0UsIEludGVnZXIudG9TdHJpbmcoQnVpbGQuVkVSU0lPTi5TREtfSU5UKSwKICAgICAgICAgICAgICAgICB2ZXJzaW9uU2VjdXJpdHlQYXRjaCwgQnVpbGQuVkVSU0lPTi5JTkNSRU1FTlRBTCk7CiAKZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9hZG1pbi9EZXZpY2VBZG1pbktleWd1YXJkRGlzYWJsZWRGZWF0dXJlc0FjdGl2aXR5LmphdmEgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvYWRtaW4vRGV2aWNlQWRtaW5LZXlndWFyZERpc2FibGVkRmVhdHVyZXNBY3Rpdml0eS5qYXZhCmluZGV4IGM4YmZmZGYuLjBlODI0MjMgMTAwNjQ0Ci0tLSBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9hZG1pbi9EZXZpY2VBZG1pbktleWd1YXJkRGlzYWJsZWRGZWF0dXJlc0FjdGl2aXR5LmphdmEKKysrIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL2FkbWluL0RldmljZUFkbWluS2V5Z3VhcmREaXNhYmxlZEZlYXR1cmVzQWN0aXZpdHkuamF2YQpAQCAtNjcsMTEgKzY3LDEyIEBACiAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmRldmljZV9hZG1pbl9rZXlndWFyZF9kaXNhYmxlX2NhbWVyYV9pbnN0cnVjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVudChCeW9kSGVscGVyQWN0aXZpdHkuQUNUSU9OX0xPQ0tOT1cpKSk7CiAgICAgICAgIH0KLQotICAgICAgICBhZGFwdGVyLmFkZChuZXcgRGlhbG9nVGVzdExpc3RJdGVtKHRoaXMsIFIuc3RyaW5nLmRldmljZV9hZG1pbl9kaXNhYmxlX25vdGlmaWNhdGlvbnMsCi0gICAgICAgICAgICAgICAgIkRldmljZUFkbWluX0Rpc2FibGVOb3RpZmljYXRpb25zIiwKLSAgICAgICAgICAgICAgICBSLnN0cmluZy5kZXZpY2VfYWRtaW5fZGlzYWJsZV9ub3RpZmljYXRpb25zX2luc3RydWN0aW9uLAotICAgICAgICAgICAgICAgIG5ldyBJbnRlbnQoQnlvZEhlbHBlckFjdGl2aXR5LkFDVElPTl9OT1RJRklDQVRJT05fT05fTE9DS1NDUkVFTikpKTsKKyAgICAgICAgaWYoIWdldFBhY2thZ2VNYW5hZ2VyKCkuaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX0FVVE9NT1RJVkUpKSB7CisgICAgICAgICAgICBhZGFwdGVyLmFkZChuZXcgRGlhbG9nVGVzdExpc3RJdGVtKHRoaXMsIFIuc3RyaW5nLmRldmljZV9hZG1pbl9kaXNhYmxlX25vdGlmaWNhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICJEZXZpY2VBZG1pbl9EaXNhYmxlTm90aWZpY2F0aW9ucyIsCisgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmRldmljZV9hZG1pbl9kaXNhYmxlX25vdGlmaWNhdGlvbnNfaW5zdHJ1Y3Rpb24sCisgICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlbnQoQnlvZEhlbHBlckFjdGl2aXR5LkFDVElPTl9OT1RJRklDQVRJT05fT05fTE9DS1NDUkVFTikpKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgYm9vbGVhbiBoYXNUcnVzdEFnZW50cygpIHsKZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9hZG1pbi90YXBqYWNraW5nL1VzYlRlc3QuamF2YSBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9hZG1pbi90YXBqYWNraW5nL1VzYlRlc3QuamF2YQppbmRleCAxNzMxOWQ2Li42MzcxODU3IDEwMDY0NAotLS0gYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvYWRtaW4vdGFwamFja2luZy9Vc2JUZXN0LmphdmEKKysrIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL2FkbWluL3RhcGphY2tpbmcvVXNiVGVzdC5qYXZhCkBAIC0xNyw2ICsxNyw3IEBACiBwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5hZG1pbi50YXBqYWNraW5nOwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBpeGVsRm9ybWF0OwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7CkBAIC0yNiw2ICsyNyw3IEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVG9hc3Q7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIuUGFzc0ZhaWxCdXR0b25zOwpAQCAtMzMsNiArMzUsNyBAQAogCiBwdWJsaWMgY2xhc3MgVXNiVGVzdCBleHRlbmRzIFBhc3NGYWlsQnV0dG9ucy5BY3Rpdml0eSB7CiAgICAgcHJpdmF0ZSBWaWV3IG1PdmVybGF5OworICAgIHByaXZhdGUgVGV4dFZpZXcgbVVzYlRhcGphY2tpbmdJbnN0cnVjdGlvbnM7CiAgICAgcHJpdmF0ZSBCdXR0b24gbVRyaWdnZXJPdmVybGF5QnV0dG9uOwogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJVc2JUZXN0IjsKQEAgLTQ1LDggKzQ4LDEyIEBACiAgICAgICAgIHNldEluZm9SZXNvdXJjZXMoUi5zdHJpbmcudXNiX3RhcGphY2tpbmdfdGVzdCwKICAgICAgICAgICAgICAgICBSLnN0cmluZy51c2JfdGFwamFja2luZ190ZXN0X2luZm8sIC0xKTsKIAorICAgICAgICBTdHJpbmcgdXNiRGVidWdnaW5nQ29tcG9uZW50ID0gZ2V0U3RyaW5nKFIuc3RyaW5nLnVzYl90YXBqYWNraW5nX3VzYl9kZWJ1Z2dpbmdfY29tcG9uZW50KTsKKyAgICAgICAgbVVzYlRhcGphY2tpbmdJbnN0cnVjdGlvbnMgPSBmaW5kVmlld0J5SWQoUi5pZC51c2JfdGFwamFja2luZ19pbnN0cnVjdGlvbnMpOworICAgICAgICBtVXNiVGFwamFja2luZ0luc3RydWN0aW9ucy5zZXRUZXh0KAorICAgICAgICAgICAgICAgIGdldFN0cmluZyhSLnN0cmluZy51c2JfdGFwamFja2luZ190ZXN0X2luc3RydWN0aW9ucywgdXNiRGVidWdnaW5nQ29tcG9uZW50KSk7CiAgICAgICAgIC8vaW5pdGlhbGlzZSB0aGUgZXNjYWxhdGUgYnV0dG9uIGFuZCBzZXQgYSBsaXN0ZW5lcgotICAgICAgICBtVHJpZ2dlck92ZXJsYXlCdXR0b24gPSAoQnV0dG9uKSBmaW5kVmlld0J5SWQoUi5pZC50YXBqYWNraW5nX2J0bik7CisgICAgICAgIG1UcmlnZ2VyT3ZlcmxheUJ1dHRvbiA9IGZpbmRWaWV3QnlJZChSLmlkLnRhcGphY2tpbmdfYnRuKTsKICAgICAgICAgbVRyaWdnZXJPdmVybGF5QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7CiAgICAgICAgIG1UcmlnZ2VyT3ZlcmxheUJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewogICAgICAgICAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvYXVkaW8vSGlmaVVsdHJhc291bmRTcGVha2VyVGVzdEFjdGl2aXR5LmphdmEgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvYXVkaW8vSGlmaVVsdHJhc291bmRTcGVha2VyVGVzdEFjdGl2aXR5LmphdmEKaW5kZXggMWE5ZmZhYy4uODc2MThiMSAxMDA2NDQKLS0tIGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL2F1ZGlvL0hpZmlVbHRyYXNvdW5kU3BlYWtlclRlc3RBY3Rpdml0eS5qYXZhCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9hdWRpby9IaWZpVWx0cmFzb3VuZFNwZWFrZXJUZXN0QWN0aXZpdHkuamF2YQpAQCAtMzcsOSArMzcsMTIgQEAKIGltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogCitpbXBvcnQgY29tLmFuZHJvaWRwbG90Lnh5LlBvaW50TGFiZWxGb3JtYXR0ZXI7CitpbXBvcnQgY29tLmFuZHJvaWRwbG90Lnh5LkxpbmVBbmRQb2ludEZvcm1hdHRlcjsKIGltcG9ydCBjb20uYW5kcm9pZHBsb3QueHkuU2ltcGxlWFlTZXJpZXM7CitpbXBvcnQgY29tLmFuZHJvaWRwbG90Lnh5LlhZUGxvdDsKIGltcG9ydCBjb20uYW5kcm9pZHBsb3QueHkuWFlTZXJpZXM7Ci1pbXBvcnQgY29tLmFuZHJvaWRwbG90Lnh5Lio7CitpbXBvcnQgY29tLmFuZHJvaWRwbG90Lnh5LlhZU3RlcE1vZGU7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNkZFRlc3Q7CiAKQEAgLTI3OSw3ICsyODIsNyBAQAogICAgICAgICBMaW5lQW5kUG9pbnRGb3JtYXR0ZXIgc2VyaWVzRm9ybWF0ID0gbmV3IExpbmVBbmRQb2ludEZvcm1hdHRlcigpOwogICAgICAgICBzZXJpZXNGb3JtYXQuY29uZmlndXJlKGdldEFwcGxpY2F0aW9uQ29udGV4dCgpLAogICAgICAgICAgICAgUi54bWwudWx0cmFzb3VuZF9saW5lX2Zvcm1hdHRlcl90cmlhbHMpOwotICAgICAgICBzZXJpZXNGb3JtYXQuc2V0UG9pbnRMYWJlbEZvcm1hdHRlcihudWxsKTsKKyAgICAgICAgc2VyaWVzRm9ybWF0LnNldFBvaW50TGFiZWxGb3JtYXR0ZXIobmV3IFBvaW50TGFiZWxGb3JtYXR0ZXIoKSk7CiAgICAgICAgIHBsb3QuYWRkU2VyaWVzKHNlcmllcywgc2VyaWVzRm9ybWF0KTsKICAgICAgIH0KIApAQCAtMjk2LDcgKzI5OSw3IEBACiAgICAgICBMaW5lQW5kUG9pbnRGb3JtYXR0ZXIgbm9pc2VTZXJpZXNGb3JtYXQgPSBuZXcgTGluZUFuZFBvaW50Rm9ybWF0dGVyKCk7CiAgICAgICBub2lzZVNlcmllc0Zvcm1hdC5jb25maWd1cmUoZ2V0QXBwbGljYXRpb25Db250ZXh0KCksCiAgICAgICAgICAgUi54bWwudWx0cmFzb3VuZF9saW5lX2Zvcm1hdHRlcl9ub2lzZSk7Ci0gICAgICBub2lzZVNlcmllc0Zvcm1hdC5zZXRQb2ludExhYmVsRm9ybWF0dGVyKG51bGwpOworICAgICAgbm9pc2VTZXJpZXNGb3JtYXQuc2V0UG9pbnRMYWJlbEZvcm1hdHRlcihuZXcgUG9pbnRMYWJlbEZvcm1hdHRlcigpKTsKICAgICAgIHBsb3QuYWRkU2VyaWVzKG5vaXNlU2VyaWVzLCBub2lzZVNlcmllc0Zvcm1hdCk7CiAKICAgICAgIGRvdWJsZVtdIGRCID0gd2F2QW5hbHl6ZXJUYXNrLmdldERCKCk7CkBAIC0zMTIsNyArMzE1LDcgQEAKICAgICAgIExpbmVBbmRQb2ludEZvcm1hdHRlciBzZXJpZXNGb3JtYXQgPSBuZXcgTGluZUFuZFBvaW50Rm9ybWF0dGVyKCk7CiAgICAgICBzZXJpZXNGb3JtYXQuY29uZmlndXJlKGdldEFwcGxpY2F0aW9uQ29udGV4dCgpLAogICAgICAgICAgIFIueG1sLnVsdHJhc291bmRfbGluZV9mb3JtYXR0ZXJfbWVkaWFuKTsKLSAgICAgIHNlcmllc0Zvcm1hdC5zZXRQb2ludExhYmVsRm9ybWF0dGVyKG51bGwpOworICAgICAgc2VyaWVzRm9ybWF0LnNldFBvaW50TGFiZWxGb3JtYXR0ZXIobmV3IFBvaW50TGFiZWxGb3JtYXR0ZXIoKSk7CiAgICAgICBwbG90LmFkZFNlcmllcyhzZXJpZXMsIHNlcmllc0Zvcm1hdCk7CiAKICAgICAgIERvdWJsZVtdIHBhc3NYID0gbmV3IERvdWJsZVtdIHtDb21tb24uTUlOX0ZSRVFVRU5DWV9IWiwgQ29tbW9uLk1BWF9GUkVRVUVOQ1lfSFp9OwpAQCAtMzIyLDcgKzMyNSw3IEBACiAgICAgICBMaW5lQW5kUG9pbnRGb3JtYXR0ZXIgcGFzc1Nlcmllc0Zvcm1hdCA9IG5ldyBMaW5lQW5kUG9pbnRGb3JtYXR0ZXIoKTsKICAgICAgIHBhc3NTZXJpZXNGb3JtYXQuY29uZmlndXJlKGdldEFwcGxpY2F0aW9uQ29udGV4dCgpLAogICAgICAgICAgIFIueG1sLnVsdHJhc291bmRfbGluZV9mb3JtYXR0ZXJfcGFzcyk7Ci0gICAgICBwYXNzU2VyaWVzRm9ybWF0LnNldFBvaW50TGFiZWxGb3JtYXR0ZXIobnVsbCk7CisgICAgICBwYXNzU2VyaWVzRm9ybWF0LnNldFBvaW50TGFiZWxGb3JtYXR0ZXIobmV3IFBvaW50TGFiZWxGb3JtYXR0ZXIoKSk7CiAgICAgICBwbG90LmFkZFNlcmllcyhwYXNzU2VyaWVzLCBwYXNzU2VyaWVzRm9ybWF0KTsKICAgICB9CiAgIH0KZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9hdWRpby9IaWZpVWx0cmFzb3VuZFRlc3RBY3Rpdml0eS5qYXZhIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL2F1ZGlvL0hpZmlVbHRyYXNvdW5kVGVzdEFjdGl2aXR5LmphdmEKaW5kZXggMDI3NmU2MC4uOWFlYmJjNCAxMDA2NDQKLS0tIGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL2F1ZGlvL0hpZmlVbHRyYXNvdW5kVGVzdEFjdGl2aXR5LmphdmEKKysrIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL2F1ZGlvL0hpZmlVbHRyYXNvdW5kVGVzdEFjdGl2aXR5LmphdmEKQEAgLTM3LDkgKzM3LDEyIEBACiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIAoraW1wb3J0IGNvbS5hbmRyb2lkcGxvdC54eS5Qb2ludExhYmVsRm9ybWF0dGVyOworaW1wb3J0IGNvbS5hbmRyb2lkcGxvdC54eS5MaW5lQW5kUG9pbnRGb3JtYXR0ZXI7CiBpbXBvcnQgY29tLmFuZHJvaWRwbG90Lnh5LlNpbXBsZVhZU2VyaWVzOworaW1wb3J0IGNvbS5hbmRyb2lkcGxvdC54eS5YWVBsb3Q7CiBpbXBvcnQgY29tLmFuZHJvaWRwbG90Lnh5LlhZU2VyaWVzOwotaW1wb3J0IGNvbS5hbmRyb2lkcGxvdC54eS4qOworaW1wb3J0IGNvbS5hbmRyb2lkcGxvdC54eS5YWVN0ZXBNb2RlOwogCiBwdWJsaWMgY2xhc3MgSGlmaVVsdHJhc291bmRUZXN0QWN0aXZpdHkgZXh0ZW5kcyBQYXNzRmFpbEJ1dHRvbnMuQWN0aXZpdHkgewogCkBAIC0yMzYsOSArMjM5LDkgQEAKICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QocG93ZXJXcmFwKSwKICAgICAgICAgICAgICIiKTsKICAgICAgICAgTGluZUFuZFBvaW50Rm9ybWF0dGVyIHNlcmllc0Zvcm1hdCA9IG5ldyBMaW5lQW5kUG9pbnRGb3JtYXR0ZXIoKTsKKyAgICAgICAgc2VyaWVzRm9ybWF0LnNldFBvaW50TGFiZWxGb3JtYXR0ZXIobmV3IFBvaW50TGFiZWxGb3JtYXR0ZXIoKSk7CiAgICAgICAgIHNlcmllc0Zvcm1hdC5jb25maWd1cmUoZ2V0QXBwbGljYXRpb25Db250ZXh0KCksCiAgICAgICAgICAgICBSLnhtbC51bHRyYXNvdW5kX2xpbmVfZm9ybWF0dGVyX3RyaWFscyk7Ci0gICAgICAgIHNlcmllc0Zvcm1hdC5zZXRQb2ludExhYmVsRm9ybWF0dGVyKG51bGwpOwogICAgICAgICBwbG90LmFkZFNlcmllcyhzZXJpZXMsIHNlcmllc0Zvcm1hdCk7CiAgICAgICB9CiAKQEAgLTI1Myw5ICsyNTYsOSBAQAogICAgICAgICAgIEFycmF5cy5hc0xpc3Qobm9pc2VEQldyYXApLAogICAgICAgICAgICJiYWNrZ3JvdW5kIG5vaXNlIik7CiAgICAgICBMaW5lQW5kUG9pbnRGb3JtYXR0ZXIgbm9pc2VTZXJpZXNGb3JtYXQgPSBuZXcgTGluZUFuZFBvaW50Rm9ybWF0dGVyKCk7CisgICAgICBub2lzZVNlcmllc0Zvcm1hdC5zZXRQb2ludExhYmVsRm9ybWF0dGVyKG5ldyBQb2ludExhYmVsRm9ybWF0dGVyKCkpOwogICAgICAgbm9pc2VTZXJpZXNGb3JtYXQuY29uZmlndXJlKGdldEFwcGxpY2F0aW9uQ29udGV4dCgpLAogICAgICAgICAgIFIueG1sLnVsdHJhc291bmRfbGluZV9mb3JtYXR0ZXJfbm9pc2UpOwotICAgICAgbm9pc2VTZXJpZXNGb3JtYXQuc2V0UG9pbnRMYWJlbEZvcm1hdHRlcihudWxsKTsKICAgICAgIHBsb3QuYWRkU2VyaWVzKG5vaXNlU2VyaWVzLCBub2lzZVNlcmllc0Zvcm1hdCk7CiAKICAgICAgIGRvdWJsZVtdIGRCID0gd2F2QW5hbHl6ZXJUYXNrLmdldERCKCk7CkBAIC0yNjksOSArMjcyLDkgQEAKICAgICAgICAgICBBcnJheXMuYXNMaXN0KGRCV3JhcCksCiAgICAgICAgICAgIm1lZGlhbiIpOwogICAgICAgTGluZUFuZFBvaW50Rm9ybWF0dGVyIHNlcmllc0Zvcm1hdCA9IG5ldyBMaW5lQW5kUG9pbnRGb3JtYXR0ZXIoKTsKKyAgICAgIHNlcmllc0Zvcm1hdC5zZXRQb2ludExhYmVsRm9ybWF0dGVyKG5ldyBQb2ludExhYmVsRm9ybWF0dGVyKCkpOwogICAgICAgc2VyaWVzRm9ybWF0LmNvbmZpZ3VyZShnZXRBcHBsaWNhdGlvbkNvbnRleHQoKSwKICAgICAgICAgICBSLnhtbC51bHRyYXNvdW5kX2xpbmVfZm9ybWF0dGVyX21lZGlhbik7Ci0gICAgICBzZXJpZXNGb3JtYXQuc2V0UG9pbnRMYWJlbEZvcm1hdHRlcihudWxsKTsKICAgICAgIHBsb3QuYWRkU2VyaWVzKHNlcmllcywgc2VyaWVzRm9ybWF0KTsKIAogICAgICAgRG91YmxlW10gcGFzc1ggPSBuZXcgRG91YmxlW10ge0NvbW1vbi5NSU5fRlJFUVVFTkNZX0haLCBDb21tb24uTUFYX0ZSRVFVRU5DWV9IWn07CkBAIC0yNzksOSArMjgyLDkgQEAKICAgICAgIFhZU2VyaWVzIHBhc3NTZXJpZXMgPSBuZXcgU2ltcGxlWFlTZXJpZXMoCiAgICAgICAgICAgQXJyYXlzLmFzTGlzdChwYXNzWCksIEFycmF5cy5hc0xpc3QocGFzc1kpLCAicGFzc2luZyIpOwogICAgICAgTGluZUFuZFBvaW50Rm9ybWF0dGVyIHBhc3NTZXJpZXNGb3JtYXQgPSBuZXcgTGluZUFuZFBvaW50Rm9ybWF0dGVyKCk7CisgICAgICBwYXNzU2VyaWVzRm9ybWF0LnNldFBvaW50TGFiZWxGb3JtYXR0ZXIobmV3IFBvaW50TGFiZWxGb3JtYXR0ZXIoKSk7CiAgICAgICBwYXNzU2VyaWVzRm9ybWF0LmNvbmZpZ3VyZShnZXRBcHBsaWNhdGlvbkNvbnRleHQoKSwKICAgICAgICAgICBSLnhtbC51bHRyYXNvdW5kX2xpbmVfZm9ybWF0dGVyX3Bhc3MpOwotICAgICAgcGFzc1Nlcmllc0Zvcm1hdC5zZXRQb2ludExhYmVsRm9ybWF0dGVyKG51bGwpOwogICAgICAgcGxvdC5hZGRTZXJpZXMocGFzc1NlcmllcywgcGFzc1Nlcmllc0Zvcm1hdCk7CiAgICAgfQogICB9CmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvYXVkaW8vUmluZ2VyTW9kZUFjdGl2aXR5LmphdmEgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvYXVkaW8vUmluZ2VyTW9kZUFjdGl2aXR5LmphdmEKaW5kZXggYjRiZmEwMS4uZmRiNTdmYyAxMDA2NDQKLS0tIGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL2F1ZGlvL1Jpbmdlck1vZGVBY3Rpdml0eS5qYXZhCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9hdWRpby9SaW5nZXJNb2RlQWN0aXZpdHkuamF2YQpAQCAtMTEzLDIwICsxMTMsMjIgQEAKICAgICAgICAgICAgIHJldHVybiB0ZXN0czsKICAgICAgICAgfQogICAgICAgICB0ZXN0cy5hZGQobmV3IFNldE1vZGVBbGxUZXN0KCkpOwotICAgICAgICB0ZXN0cy5hZGQobmV3IFNldE1vZGVBbGFybXNUZXN0KCkpOworICAgICAgICB0ZXN0cy5hZGQobmV3IFNldE1vZGVQcmlvcml0eVRlc3QoKSk7CiAgICAgICAgIHRlc3RzLmFkZChuZXcgVGVzdEFjY2Vzc1Jpbmdlck1vZGVEbmRPbigpKTsKICAgICAgICAgdGVzdHMuYWRkKG5ldyBUZXN0VmlicmF0ZU5vdGlmaWNhdGlvbkRuZE9uKCkpOwogICAgICAgICB0ZXN0cy5hZGQobmV3IFRlc3RWaWJyYXRlUmluZ2VyRG5kT24oKSk7CiAgICAgICAgIHRlc3RzLmFkZChuZXcgVGVzdFNldFJpbmdlck1vZGVQb2xpY3lBY2Nlc3NEbmRPbigpKTsKLSAgICAgICAgdGVzdHMuYWRkKG5ldyBUZXN0Vm9sdW1lRG5kQWZmZWN0ZWRTdHJlYW1EbmRPbigpKTsKLSAgICAgICAgdGVzdHMuYWRkKG5ldyBUZXN0QWRqdXN0Vm9sdW1lSW5BbGFybXNPbmx5TW9kZSgpKTsKKyAgICAgICAgLy8gVE9ETzogQWRkIGEgQFRlc3RBcGkgbWV0aG9kIHRvIHF1ZXJ5IHRoZSBWb2x1bVBvbGljeQorICAgICAgICAvL3Rlc3RzLmFkZChuZXcgVGVzdFZvbHVtZURuZEFmZmVjdGVkU3RyZWFtRG5kT24oKSk7CisgICAgICAgIHRlc3RzLmFkZChuZXcgVGVzdEFkanVzdFZvbHVtZUluUHJpb3JpdHlPbmx5QWxsb3dBbGFybXNNZWRpYU1vZGUoKSk7CiAKICAgICAgICAgdGVzdHMuYWRkKG5ldyBTZXRNb2RlQWxsVGVzdCgpKTsKICAgICAgICAgdGVzdHMuYWRkKG5ldyBUZXN0QWNjZXNzUmluZ2VyTW9kZSgpKTsKICAgICAgICAgdGVzdHMuYWRkKG5ldyBUZXN0VmlicmF0ZU5vdGlmaWNhdGlvbigpKTsKICAgICAgICAgdGVzdHMuYWRkKG5ldyBUZXN0VmlicmF0ZVJpbmdlcigpKTsKICAgICAgICAgdGVzdHMuYWRkKG5ldyBUZXN0U2V0UmluZ2VyTW9kZVBvbGljeUFjY2VzcygpKTsKLSAgICAgICAgdGVzdHMuYWRkKG5ldyBUZXN0Vm9sdW1lRG5kQWZmZWN0ZWRTdHJlYW0oKSk7CisgICAgICAgIC8vIFRPRE86IEFkZCBhIEBUZXN0QXBpIG1ldGhvZCB0byBxdWVyeSB0aGUgVm9sdW1Qb2xpY3kKKyAgICAgICAgLy90ZXN0cy5hZGQobmV3IFRlc3RWb2x1bWVEbmRBZmZlY3RlZFN0cmVhbSgpKTsKICAgICAgICAgdGVzdHMuYWRkKG5ldyBUZXN0Vm9sdW1lKCkpOwogICAgICAgICB0ZXN0cy5hZGQobmV3IFRlc3RNdXRlU3RyZWFtcygpKTsKICAgICAgICAgdGVzdHMuYWRkKG5ldyBFbmFibGVTb3VuZEVmZmVjdHMoKSk7CkBAIC0xNDksMzQgKzE1MSw0MSBAQAogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCB0ZXN0U3RyZWFtTXV0aW5nKGludCBzdHJlYW0pIHsKLSAgICAgICAgbUF1ZGlvTWFuYWdlci5hZGp1c3RTdHJlYW1Wb2x1bWUoc3RyZWFtLCBBdWRpb01hbmFnZXIuQURKVVNUX01VVEUsIDApOwotICAgICAgICBhc3NlcnRUcnVlKCJNdXRpbmcgc3RyZWFtICIgKyBzdHJlYW0gKyAiIGZhaWxlZC4iLAotICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuaXNTdHJlYW1NdXRlKHN0cmVhbSkpOworICAgICAgICBpZiAoc3RyZWFtID09IEF1ZGlvTWFuYWdlci5TVFJFQU1fVk9JQ0VfQ0FMTCkgeworICAgICAgICAgICAgLy8gVm9pY2UgY2FsbCByZXF1aXJlcyBNT0RJRllfUEhPTkVfU1RBVEUsIHNvIHdlIHNob3VsZCBub3QgYmUgYWJsZSB0byBtdXRlCisgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLmFkanVzdFN0cmVhbVZvbHVtZShzdHJlYW0sIEF1ZGlvTWFuYWdlci5BREpVU1RfTVVURSwgMCk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZSgiTXV0aW5nIHN0cmVhbSAiICsgc3RyZWFtICsgIiBzaG91bGQgcmVxdWlyZSBNT0RJRllfUEhPTkVfU1RBVEUgcGVybWlzc2lvbi4iLAorICAgICAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLmlzU3RyZWFtTXV0ZShzdHJlYW0pKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuYWRqdXN0U3RyZWFtVm9sdW1lKHN0cmVhbSwgQXVkaW9NYW5hZ2VyLkFESlVTVF9NVVRFLCAwKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIk11dGluZyBzdHJlYW0gIiArIHN0cmVhbSArICIgZmFpbGVkLiIsCisgICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuaXNTdHJlYW1NdXRlKHN0cmVhbSkpOwogCi0gICAgICAgIG1BdWRpb01hbmFnZXIuYWRqdXN0U3RyZWFtVm9sdW1lKHN0cmVhbSwgQXVkaW9NYW5hZ2VyLkFESlVTVF9VTk1VVEUsIDApOwotICAgICAgICBhc3NlcnRGYWxzZSgiVW5tdXRpbmcgc3RyZWFtICIgKyBzdHJlYW0gKyAiIGZhaWxlZC4iLAotICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuaXNTdHJlYW1NdXRlKHN0cmVhbSkpOworICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5hZGp1c3RTdHJlYW1Wb2x1bWUoc3RyZWFtLCBBdWRpb01hbmFnZXIuQURKVVNUX1VOTVVURSwgMCk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZSgiVW5tdXRpbmcgc3RyZWFtICIgKyBzdHJlYW0gKyAiIGZhaWxlZC4iLAorICAgICAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLmlzU3RyZWFtTXV0ZShzdHJlYW0pKTsKIAotICAgICAgICBtQXVkaW9NYW5hZ2VyLmFkanVzdFN0cmVhbVZvbHVtZShzdHJlYW0sIEF1ZGlvTWFuYWdlci5BREpVU1RfVE9HR0xFX01VVEUsIDApOwotICAgICAgICBhc3NlcnRUcnVlKCJUb2dnbGluZyBtdXRlIG9uIHN0cmVhbSAiICsgc3RyZWFtICsgIiBmYWlsZWQuIiwKLSAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLmlzU3RyZWFtTXV0ZShzdHJlYW0pKTsKKyAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuYWRqdXN0U3RyZWFtVm9sdW1lKHN0cmVhbSwgQXVkaW9NYW5hZ2VyLkFESlVTVF9UT0dHTEVfTVVURSwgMCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJUb2dnbGluZyBtdXRlIG9uIHN0cmVhbSAiICsgc3RyZWFtICsgIiBmYWlsZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5pc1N0cmVhbU11dGUoc3RyZWFtKSk7CiAKLSAgICAgICAgbUF1ZGlvTWFuYWdlci5hZGp1c3RTdHJlYW1Wb2x1bWUoc3RyZWFtLCBBdWRpb01hbmFnZXIuQURKVVNUX1RPR0dMRV9NVVRFLCAwKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIlRvZ2dsaW5nIG11dGUgb24gc3RyZWFtICIgKyBzdHJlYW0gKyAiIGZhaWxlZC4iLAotICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuaXNTdHJlYW1NdXRlKHN0cmVhbSkpOworICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5hZGp1c3RTdHJlYW1Wb2x1bWUoc3RyZWFtLCBBdWRpb01hbmFnZXIuQURKVVNUX1RPR0dMRV9NVVRFLCAwKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKCJUb2dnbGluZyBtdXRlIG9uIHN0cmVhbSAiICsgc3RyZWFtICsgIiBmYWlsZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5pc1N0cmVhbU11dGUoc3RyZWFtKSk7CiAKLSAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRTdHJlYW1NdXRlKHN0cmVhbSwgdHJ1ZSk7Ci0gICAgICAgIGFzc2VydFRydWUoIk11dGluZyBzdHJlYW0gIiArIHN0cmVhbSArICIgdXNpbmcgc2V0U3RyZWFtTXV0ZSBmYWlsZWQiLAotICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuaXNTdHJlYW1NdXRlKHN0cmVhbSkpOworICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRTdHJlYW1NdXRlKHN0cmVhbSwgdHJ1ZSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJNdXRpbmcgc3RyZWFtICIgKyBzdHJlYW0gKyAiIHVzaW5nIHNldFN0cmVhbU11dGUgZmFpbGVkIiwKKyAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5pc1N0cmVhbU11dGUoc3RyZWFtKSk7CiAKLSAgICAgICAgLy8gbXV0ZSBpdCB0aHJlZSBtb3JlIHRpbWVzIHRvIHZlcmlmeSB0aGUgcmVmIGNvdW50aW5nIGlzIGdvbmUuCi0gICAgICAgIG1BdWRpb01hbmFnZXIuc2V0U3RyZWFtTXV0ZShzdHJlYW0sIHRydWUpOwotICAgICAgICBtQXVkaW9NYW5hZ2VyLnNldFN0cmVhbU11dGUoc3RyZWFtLCB0cnVlKTsKLSAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRTdHJlYW1NdXRlKHN0cmVhbSwgdHJ1ZSk7CisgICAgICAgICAgICAvLyBtdXRlIGl0IHRocmVlIG1vcmUgdGltZXMgdG8gdmVyaWZ5IHRoZSByZWYgY291bnRpbmcgaXMgZ29uZS4KKyAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0U3RyZWFtTXV0ZShzdHJlYW0sIHRydWUpOworICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRTdHJlYW1NdXRlKHN0cmVhbSwgdHJ1ZSk7CisgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLnNldFN0cmVhbU11dGUoc3RyZWFtLCB0cnVlKTsKIAotICAgICAgICBtQXVkaW9NYW5hZ2VyLnNldFN0cmVhbU11dGUoc3RyZWFtLCBmYWxzZSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJVbm11dGluZyBzdHJlYW0gIiArIHN0cmVhbSArICIgdXNpbmcgc2V0U3RyZWFtTXV0ZSBmYWlsZWQuIiwKLSAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLmlzU3RyZWFtTXV0ZShzdHJlYW0pKTsKKyAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0U3RyZWFtTXV0ZShzdHJlYW0sIGZhbHNlKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKCJVbm11dGluZyBzdHJlYW0gIiArIHN0cmVhbSArICIgdXNpbmcgc2V0U3RyZWFtTXV0ZSBmYWlsZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5pc1N0cmVhbU11dGUoc3RyZWFtKSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvLyBUZXN0cwpAQCAtMjE2LDEwICsyMjUsMTAgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByb3RlY3RlZCBjbGFzcyBTZXRNb2RlQWxhcm1zVGVzdCBleHRlbmRzIEludGVyYWN0aXZlVGVzdENhc2UgeworICAgIHByb3RlY3RlZCBjbGFzcyBTZXRNb2RlUHJpb3JpdHlUZXN0IGV4dGVuZHMgSW50ZXJhY3RpdmVUZXN0Q2FzZSB7CiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwcm90ZWN0ZWQgVmlldyBpbmZsYXRlKFZpZXdHcm91cCBwYXJlbnQpIHsKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXRyeUl0ZW0ocGFyZW50LCBSLnN0cmluZy5hdHRlbnRpb25fZmlsdGVyX2FsYXJtcyk7CisgICAgICAgICAgICByZXR1cm4gY3JlYXRlUmV0cnlJdGVtKHBhcmVudCwgUi5zdHJpbmcuYXR0ZW50aW9uX2ZpbHRlcl9wcmlvcml0eV9taW1pY19hbGFybXNfb25seSk7CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKQEAgLTEwNzIsMjkgKzEwODEsMzUgQEAKIAogICAgICAgICAgICAgaW50IG11dGVBZmZlY3RlZFN0cmVhbXMgPSBTZXR0aW5ncy5TeXN0ZW0uZ2V0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAogICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0uTVVURV9TVFJFQU1TX0FGRkVDVEVELAotICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIGRlZmF1bHRzIGFzIGluIEF1ZGlvU2VydmljZS4gU2hvdWxkIGJlIGtlcHQgaW4KLSAgICAgICAgICAgICAgICAgICAgLy8gc3luYy4KLSAgICAgICAgICAgICAgICAgICAgKCgxIDw8IEF1ZGlvTWFuYWdlci5TVFJFQU1fTVVTSUMpIHwKKyAgICAgICAgICAgICAgICAgICAgLy8gc2FtZSBkZWZhdWx0cyBhcyBpbiBBdWRpb1NlcnZpY2UuIFNob3VsZCBiZSBrZXB0IGluIHN5bmMuCisgICAgICAgICAgICAgICAgICAgICgxIDw8IFNUUkVBTV9NVVNJQykgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IEF1ZGlvTWFuYWdlci5TVFJFQU1fUklORykgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IEF1ZGlvTWFuYWdlci5TVFJFQU1fTk9USUZJQ0FUSU9OKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgQXVkaW9NYW5hZ2VyLlNUUkVBTV9TWVNURU0pKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgQXVkaW9NYW5hZ2VyLlNUUkVBTV9TWVNURU0pIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBBdWRpb01hbmFnZXIuU1RSRUFNX1ZPSUNFX0NBTEwpKTsKKwogICAgICAgICAgICAgZm9yIChpbnQgc3RyZWFtIDogc3RyZWFtcykgewogICAgICAgICAgICAgICAgIC8vIGVuc3VyZSBlYWNoIHN0cmVhbSBpcyBvbiBhbmQgdHVybmVkIHVwLgotICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0U3RyZWFtVm9sdW1lKHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuZ2V0U3RyZWFtTWF4Vm9sdW1lKHN0cmVhbSksCi0gICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLnNldFN0cmVhbVZvbHVtZShzdHJlYW0sIG1BdWRpb01hbmFnZXIuZ2V0U3RyZWFtTWF4Vm9sdW1lKHN0cmVhbSksIDApOwogICAgICAgICAgICAgICAgIGlmICgoKDEgPDwgc3RyZWFtKSAmIG11dGVBZmZlY3RlZFN0cmVhbXMpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5hZGp1c3RTdHJlYW1Wb2x1bWUoc3RyZWFtLCBBdWRpb01hbmFnZXIuQURKVVNUX01VVEUsIDApOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZSgiU3RyZWFtICIgKyBzdHJlYW0gKyAiIHNob3VsZCBub3QgYmUgYWZmZWN0ZWQgYnkgbXV0ZS4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuaXNTdHJlYW1NdXRlKHN0cmVhbSkpOwotICAgICAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLnNldFN0cmVhbU11dGUoc3RyZWFtLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UoIlN0cmVhbSAiICsgc3RyZWFtICsgIiBzaG91bGQgbm90IGJlIGFmZmVjdGVkIGJ5IG11dGUuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLmlzU3RyZWFtTXV0ZShzdHJlYW0pKTsKLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5hZGp1c3RTdHJlYW1Wb2x1bWUoc3RyZWFtLCBBdWRpb01hbmFnZXIuQURKVVNUX1RPR0dMRV9NVVRFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZSgiU3RyZWFtICIgKyBzdHJlYW0gKyAiIHNob3VsZCBub3QgYmUgYWZmZWN0ZWQgYnkgbXV0ZS4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuaXNTdHJlYW1NdXRlKHN0cmVhbSkpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbSA9PSBBdWRpb01hbmFnZXIuU1RSRUFNX1ZPSUNFX0NBTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFZvaWNlIGNhbGwgcmVxdWlyZXMgTU9ESUZZX1BIT05FX1NUQVRFLCBzbyB3ZSBzaG91bGQgbm90IGJlIGFibGUgdG8gbXV0ZQorICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5hZGp1c3RTdHJlYW1Wb2x1bWUoc3RyZWFtLCBBdWRpb01hbmFnZXIuQURKVVNUX01VVEUsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVm9pY2UgY2FsbCBzdHJlYW0gKCIgKyBzdHJlYW0gKyAiKSBzaG91bGQgcmVxdWlyZSBNT0RJRllfUEhPTkVfU1RBVEUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJ0byBtdXRlLiIsIG1BdWRpb01hbmFnZXIuaXNTdHJlYW1NdXRlKHN0cmVhbSkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5hZGp1c3RTdHJlYW1Wb2x1bWUoc3RyZWFtLCBBdWRpb01hbmFnZXIuQURKVVNUX01VVEUsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UoIlN0cmVhbSAiICsgc3RyZWFtICsgIiBzaG91bGQgbm90IGJlIGFmZmVjdGVkIGJ5IG11dGUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5pc1N0cmVhbU11dGUoc3RyZWFtKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLnNldFN0cmVhbU11dGUoc3RyZWFtLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKCJTdHJlYW0gIiArIHN0cmVhbSArICIgc2hvdWxkIG5vdCBiZSBhZmZlY3RlZCBieSBtdXRlLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuaXNTdHJlYW1NdXRlKHN0cmVhbSkpOworICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5hZGp1c3RTdHJlYW1Wb2x1bWUoc3RyZWFtLCBBdWRpb01hbmFnZXIuQURKVVNUX1RPR0dMRV9NVVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKCJTdHJlYW0gIiArIHN0cmVhbSArICIgc2hvdWxkIG5vdCBiZSBhZmZlY3RlZCBieSBtdXRlLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuaXNTdHJlYW1NdXRlKHN0cmVhbSkpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgdGVzdFN0cmVhbU11dGluZyhzdHJlYW0pOwogICAgICAgICAgICAgfQpAQCAtMTEwMiw3ICsxMTE3LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByb3RlY3RlZCBjbGFzcyBUZXN0QWRqdXN0Vm9sdW1lSW5BbGFybXNPbmx5TW9kZSBleHRlbmRzIEludGVyYWN0aXZlVGVzdENhc2UgeworICAgIHByb3RlY3RlZCBjbGFzcyBUZXN0QWRqdXN0Vm9sdW1lSW5Qcmlvcml0eU9ubHlBbGxvd0FsYXJtc01lZGlhTW9kZSBleHRlbmRzIEludGVyYWN0aXZlVGVzdENhc2UgewogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHJvdGVjdGVkIFZpZXcgaW5mbGF0ZShWaWV3R3JvdXAgcGFyZW50KSB7CiAgICAgICAgICAgICByZXR1cm4gY3JlYXRlQXV0b0l0ZW0ocGFyZW50LCBSLnN0cmluZy50ZXN0X3ZvbHVtZV9kbmRfYWZmZWN0ZWRfc3RyZWFtKTsKQEAgLTExMjcsNCArMTE0Miw0IEBACiAgICAgICAgICAgICBzdGF0dXMgPSBQQVNTOwogICAgICAgICB9CiAgICAgfQotfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9hdWRpby9VU0JBdWRpb1BlcmlwaGVyYWxCdXR0b25zQWN0aXZpdHkuamF2YSBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9hdWRpby9VU0JBdWRpb1BlcmlwaGVyYWxCdXR0b25zQWN0aXZpdHkuamF2YQppbmRleCA1N2Q4MjNlLi5kZTNjZTdmIDEwMDY0NAotLS0gYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvYXVkaW8vVVNCQXVkaW9QZXJpcGhlcmFsQnV0dG9uc0FjdGl2aXR5LmphdmEKKysrIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL2F1ZGlvL1VTQkF1ZGlvUGVyaXBoZXJhbEJ1dHRvbnNBY3Rpdml0eS5qYXZhCkBAIC0xMDcsNiArMTA3LDcgQEAKICAgICBwcml2YXRlIHZvaWQgY2FsY3VsYXRlTWF0Y2goKSB7CiAgICAgICAgIGlmIChtSXNQZXJpcGhlcmFsQXR0YWNoZWQpIHsKICAgICAgICAgICAgIGJvb2xlYW4gbWF0Y2ggPSBtSGFzQnRuQSAmJiBtSGFzQnRuQiAmJiBtSGFzQnRuQzsKKyAgICAgICAgICAgIExvZy5pKFRBRywgIm1hdGNoOiIgKyBtYXRjaCk7CiAgICAgICAgICAgICBnZXRQYXNzQnV0dG9uKCkuc2V0RW5hYmxlZChtYXRjaCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBnZXRQYXNzQnV0dG9uKCkuc2V0RW5hYmxlZChmYWxzZSk7CmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvYXVkaW8vVVNCQXVkaW9QZXJpcGhlcmFsUmVjb3JkQWN0aXZpdHkuamF2YSBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9hdWRpby9VU0JBdWRpb1BlcmlwaGVyYWxSZWNvcmRBY3Rpdml0eS5qYXZhCmluZGV4IDIyYTI2NzguLjI2ODIwMWMgMTAwNjQ0Ci0tLSBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9hdWRpby9VU0JBdWRpb1BlcmlwaGVyYWxSZWNvcmRBY3Rpdml0eS5qYXZhCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9hdWRpby9VU0JBdWRpb1BlcmlwaGVyYWxSZWNvcmRBY3Rpdml0eS5qYXZhCkBAIC03Nyw3ICs3NywxMiBAQAogICAgICAgICAgICAgbVJlY29yZGVyLnN0b3AoKTsKICAgICAgICAgfQogCisgICAgICAgIC8vIG5vIHJlYXNvbiB0byBkbyBtb3JlIHRoYW4gMgogICAgICAgICBpbnQgbnVtQ2hhbnMgPSBVU0JEZXZpY2VJbmZvSGVscGVyLmNhbGNNYXhDaGFubmVsQ291bnQobUlucHV0RGV2SW5mbyk7CisgICAgICAgIGlmIChudW1DaGFucyA+IDIpIHsKKyAgICAgICAgICAgIG51bUNoYW5zID0gMjsKKyAgICAgICAgfQorICAgICAgICBMb2cuaShUQUcsICIgIG51bUNoYW5zOiIgKyBudW1DaGFucyk7CiAKICAgICAgICAgaWYgKG1SZWNvcmRlci5vcGVuKG51bUNoYW5zLCBtU3lzdGVtU2FtcGxlUmF0ZSwgbVN5c3RlbUJ1ZmZlclNpemUpKSB7CiAgICAgICAgICAgICBjb25uZWN0V2F2ZVZpZXcoKTsgIC8vIFNldHVwIHRoZSBXYXZlVmlldwpkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL2F1ZGlvL2F1ZGlvbGliL0F1ZGlvVXRpbHMuamF2YSBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9hdWRpby9hdWRpb2xpYi9BdWRpb1V0aWxzLmphdmEKaW5kZXggNzE5MGFmOS4uNTViN2Y5YSAxMDA2NDQKLS0tIGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL2F1ZGlvL2F1ZGlvbGliL0F1ZGlvVXRpbHMuamF2YQorKysgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvYXVkaW8vYXVkaW9saWIvQXVkaW9VdGlscy5qYXZhCkBAIC0zMiw5ICszMiw2IEBACiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBpbnQgY291bnRUb0luZGV4TWFzayhpbnQgY2hhbkNvdW50KSB7Ci0gICAgICAgIC8vIEZyb20gdGhlIGRvY3VtZW50YXRpb24gZm9yIEF1ZGlvRm9ybWF0OgotICAgICAgICAvLyBUaGUgY2Fub25pY2FsIGNoYW5uZWwgaW5kZXggbWFza3MgYnkgY2hhbm5lbCBjb3VudCBhcmUgZ2l2ZW4gYnkgdGhlIGZvcm11bGEKLSAgICAgICAgLy8gKDEgPDwgY2hhbm5lbENvdW50KSAtIDEuCiAgICAgICAgIHJldHVybiAoMSA8PCBjaGFuQ291bnQpIC0gMTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9hdWRpby9hdWRpb2xpYi9TdHJlYW1SZWNvcmRlci5qYXZhIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL2F1ZGlvL2F1ZGlvbGliL1N0cmVhbVJlY29yZGVyLmphdmEKaW5kZXggN2NkZmYzNC4uMmVjNzQyZSAxMDA2NDQKLS0tIGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL2F1ZGlvL2F1ZGlvbGliL1N0cmVhbVJlY29yZGVyLmphdmEKKysrIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL2F1ZGlvL2F1ZGlvbGliL1N0cmVhbVJlY29yZGVyLmphdmEKQEAgLTEyMCwxOSArMTIwLDMwIEBACiAgICAgICAgIG1OdW1DaGFubmVscyA9IG51bUNoYW5zOwogICAgICAgICBtU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CiAKLSAgICAgICAgaW50IGNoYW5JbmRleE1hc2sgPSBBdWRpb1V0aWxzLmNvdW50VG9JbmRleE1hc2sobnVtQ2hhbnMpOwotICAgICAgICBpbnQgYnVmZmVyU2l6ZUluQnl0ZXMgPSAyMDQ4OyAgIC8vIFNvbWUsIG5vbi1jcml0aWNhbCB2YWx1ZQorICAgICAgICBmaW5hbCBpbnQgZnJhbWVTaXplID0KKyAgICAgICAgICAgICAgICBBdWRpb1V0aWxzLmNhbGNGcmFtZVNpemVJbkJ5dGVzKEF1ZGlvRm9ybWF0LkVOQ09ESU5HX1BDTV9GTE9BVCwgbU51bUNoYW5uZWxzKTsKKyAgICAgICAgZmluYWwgaW50IGJ1ZmZlclNpemVJbkJ5dGVzID0gZnJhbWVTaXplICogNjQ7ICAgLy8gU29tZSwgbm9uLWNyaXRpY2FsIHZhbHVlCisKKyAgICAgICAgQXVkaW9Gb3JtYXQuQnVpbGRlciBmb3JtYXRCdWlsZGVyID0gbmV3IEF1ZGlvRm9ybWF0LkJ1aWxkZXIoKTsKKyAgICAgICAgZm9ybWF0QnVpbGRlci5zZXRFbmNvZGluZyhBdWRpb0Zvcm1hdC5FTkNPRElOR19QQ01fRkxPQVQpOworICAgICAgICBmb3JtYXRCdWlsZGVyLnNldFNhbXBsZVJhdGUobVNhbXBsZVJhdGUpOworCisgICAgICAgIGlmIChudW1DaGFucyA8PSAyKSB7CisgICAgICAgICAgICAvLyBUaGVyZSBpcyBjdXJyZW50bHkgYSBidWcgY2F1c2luZyBjaGFubmVsIElOREVYIG1hc2tzIHRvIGZhaWwuCisgICAgICAgICAgICAvLyBmb3IgY2hhbm5lbHMgY291bnRzIG9mIDw9IDIsIHVzZSBjaGFubmVsIFBPU0lUSU9OCisgICAgICAgICAgICBmaW5hbCBpbnQgY2hhblBvc01hc2sgPSBBdWRpb1V0aWxzLmNvdW50VG9JblBvc2l0aW9uTWFzayhudW1DaGFucyk7CisgICAgICAgICAgICBmb3JtYXRCdWlsZGVyLnNldENoYW5uZWxNYXNrKGNoYW5Qb3NNYXNrKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRoZXJlIGFyZSBubyBJTlBVVCBjaGFubmVsLXBvc2l0aW9uIG1hc2tzIGZvciA+IDIgY2hhbm5lbHMKKyAgICAgICAgICAgIGZpbmFsIGludCBjaGFuSW5kZXhNYXNrID0gQXVkaW9VdGlscy5jb3VudFRvSW5kZXhNYXNrKG51bUNoYW5zKTsKKyAgICAgICAgICAgIGZvcm1hdEJ1aWxkZXIuc2V0Q2hhbm5lbEluZGV4TWFzayhjaGFuSW5kZXhNYXNrKTsKKyAgICAgICAgfQorCisgICAgICAgIEF1ZGlvUmVjb3JkLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBBdWRpb1JlY29yZC5CdWlsZGVyKCk7CisgICAgICAgIGJ1aWxkZXIuc2V0QXVkaW9Gb3JtYXQoZm9ybWF0QnVpbGRlci5idWlsZCgpKTsKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgbUF1ZGlvUmVjb3JkID0gbmV3IEF1ZGlvUmVjb3JkLkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgICAgICAuc2V0QXVkaW9Gb3JtYXQobmV3IEF1ZGlvRm9ybWF0LkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRFbmNvZGluZyhBdWRpb0Zvcm1hdC5FTkNPRElOR19QQ01fRkxPQVQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFNhbXBsZVJhdGUobVNhbXBsZVJhdGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldENoYW5uZWxJbmRleE1hc2soY2hhbkluZGV4TWFzaykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKLSAgICAgICAgICAgICAgICAgICAgLnNldEJ1ZmZlclNpemVJbkJ5dGVzKGJ1ZmZlclNpemVJbkJ5dGVzKQotICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLQorICAgICAgICAgICAgbUF1ZGlvUmVjb3JkID0gYnVpbGRlci5idWlsZCgpOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICBMb2cuZShUQUcsICJDb3VsZG4ndCBvcGVuIEF1ZGlvUmVjb3JkOiAiICsgZXgpOwpkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL2F1ZGlvL3BlcmlwaGVyYWxwcm9maWxlL0F1ZGlvU3RyaW5nc0hlbHBlci5qYXZhIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL2F1ZGlvL3BlcmlwaGVyYWxwcm9maWxlL0F1ZGlvU3RyaW5nc0hlbHBlci5qYXZhCmluZGV4IGU5YWNhY2MuLmY5ZmZkODYgMTAwNjQ0Ci0tLSBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9hdWRpby9wZXJpcGhlcmFscHJvZmlsZS9BdWRpb1N0cmluZ3NIZWxwZXIuamF2YQorKysgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvYXVkaW8vcGVyaXBoZXJhbHByb2ZpbGUvQXVkaW9TdHJpbmdzSGVscGVyLmphdmEKQEAgLTE2LDcgKzE2LDcgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIuYXVkaW8ucGVyaXBoZXJhbHByb2ZpbGU7CiAKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Ob25OdWxsOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTm9uTnVsbDsKIAogcHVibGljIGNsYXNzIEF1ZGlvU3RyaW5nc0hlbHBlciB7CiAgICAgLy8gVGhlc2UgY29ycmVzcG9uZCB0byBlbmNvZGluZyBjb25zdGFudHMgZGVmaW5lZCBpbiBBdWRpb0Zvcm1hdHMuamF2YQpkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL2F1ZGlvL3BlcmlwaGVyYWxwcm9maWxlL1BlcmlwaGVyYWxQcm9maWxlLmphdmEgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvYXVkaW8vcGVyaXBoZXJhbHByb2ZpbGUvUGVyaXBoZXJhbFByb2ZpbGUuamF2YQppbmRleCBjNjA4YzI2Li5lZWZmNzkwIDEwMDY0NAotLS0gYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvYXVkaW8vcGVyaXBoZXJhbHByb2ZpbGUvUGVyaXBoZXJhbFByb2ZpbGUuamF2YQorKysgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvYXVkaW8vcGVyaXBoZXJhbHByb2ZpbGUvUGVyaXBoZXJhbFByb2ZpbGUuamF2YQpAQCAtMTcsNyArMTcsNyBAQAogcGFja2FnZSBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIuYXVkaW8ucGVyaXBoZXJhbHByb2ZpbGU7CiAKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvRGV2aWNlSW5mbzsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Ob25OdWxsOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTm9uTnVsbDsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5hdWRpby5wZXJpcGhlcmFscHJvZmlsZS5MaXN0c0hlbHBlcjsKIApkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL2F1ZGlvL3BlcmlwaGVyYWxwcm9maWxlL1Byb2ZpbGVNYW5hZ2VyLmphdmEgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvYXVkaW8vcGVyaXBoZXJhbHByb2ZpbGUvUHJvZmlsZU1hbmFnZXIuamF2YQppbmRleCA0NWIxMjIwLi5jMGE2YjA1IDEwMDY0NAotLS0gYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvYXVkaW8vcGVyaXBoZXJhbHByb2ZpbGUvUHJvZmlsZU1hbmFnZXIuamF2YQorKysgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvYXVkaW8vcGVyaXBoZXJhbHByb2ZpbGUvUHJvZmlsZU1hbmFnZXIuamF2YQpAQCAtMTcsNyArMTcsNyBAQAogcGFja2FnZSBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIuYXVkaW8ucGVyaXBoZXJhbHByb2ZpbGU7CiAKIGltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTnVsbGFibGU7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOwogCkBAIC04MCwxMSArODAsNiBAQAogICAgICAgICAgICAgICAgICI8SW5wdXREZXZJbmZvIENoYW5Db3VudHM9XCIxLDJcIiBDaGFuUG9zTWFza3M9XCIxMiwxNlwiIENoYW5JbmRleE1hc2tzPVwiM1wiIEVuY29kaW5ncz1cIjRcIiBTYW1wbGVSYXRlcz1cIjQ4MDAwXCIgLz4iICsKICAgICAgICAgICAgICAgICAiPEJ1dHRvbkluZm8gSGFzQnRuQT1cIjFcIiBIYXNCdG5CPVwiMVwiIEhhc0J0bkM9XCIxXCIgLz4iICsKICAgICAgICAgICAgICI8L1BlcmlwaGVyYWxQcm9maWxlPiIgKwotICAgICAgICAgICI8UGVyaXBoZXJhbFByb2ZpbGUgUHJvZmlsZU5hbWU9XCJtaXJcIiBQcm9maWxlRGVzY3JpcHRpb249XCJSZWZlcmVuY2UgVVNCIERvbmdsZVwiIFByb2R1Y3ROYW1lPVwiVVNCLUF1ZGlvIC0gVVNCIEF1ZGlvXCI+IiArCi0gICAgICAgICAgICAiPE91dHB1dERldkluZm8gQ2hhbkNvdW50cz1cIjJcIiBDaGFuUG9zTWFza3M9XCIxMlwiIENoYW5JbmRleE1hc2tzPVwiM1wiIEVuY29kaW5ncz1cIjRcIiBTYW1wbGVSYXRlcz1cIjQ4MDAwXCIgLz4iICsKLSAgICAgICAgICAgICI8SW5wdXREZXZJbmZvIENoYW5Db3VudHM9XCIxLDJcIiBDaGFuUG9zTWFza3M9XCIxMiwxNlwiIENoYW5JbmRleE1hc2tzPVwiM1wiIEVuY29kaW5ncz1cIjRcIiBTYW1wbGVSYXRlcz1cIjQ4MDAwXCIgLz4iICsKLSAgICAgICAgICAgICI8QnV0dG9uSW5mbyBIYXNCdG5BPVwiMVwiIEhhc0J0bkI9XCIxXCIgSGFzQnRuQz1cIjFcIiBIYXNCdG5EPVwiMVwiIC8+IiArCi0gICAgICAgICAgIjwvUGVyaXBoZXJhbFByb2ZpbGU+IiArCiAgICAgICAgICAgICAiPFBlcmlwaGVyYWxQcm9maWxlIFByb2ZpbGVOYW1lPVwiSFRDIERvbmdsZVwiIFByb2ZpbGVEZXNjcmlwdGlvbj1cIlR5cGUtQyB0byAzLjVtbSBIZWFkcGhvbmVcIiBQcm9kdWN0TmFtZT1cIlVTQi1BdWRpbyAtIEhUQyBUeXBlLUMgdG8gMy41bW0gSGVhZHBob25lIEpcIj4iICsKICAgICAgICAgICAgICAgICAiPE91dHB1dERldkluZm8gQ2hhbkNvdW50cz1cIjJcIiBDaGFuUG9zTWFza3M9XCIxMlwiIENoYW5JbmRleE1hc2tzPVwiM1wiIEVuY29kaW5ncz1cIjRcIiBTYW1wbGVSYXRlcz1cIjQ4MDAwXCIgLz4iICsKICAgICAgICAgICAgICAgICAiPElucHV0RGV2SW5mbyBDaGFuQ291bnRzPVwiMSwyXCIgQ2hhblBvc01hc2tzPVwiMTIsMTZcIiBDaGFuSW5kZXhNYXNrcz1cIjNcIiBFbmNvZGluZ3M9XCI0XCIgU2FtcGxlUmF0ZXM9XCI0ODAwMFwiLz4iICsKQEAgLTk1LDcgKzkwLDcgQEAKICAgICAgICAgICAgICAgICAiPElucHV0RGV2SW5mbyBDaGFuQ291bnRzPVwiMVwiIENoYW5Qb3NNYXNrcz1cIjE2XCIgQ2hhbkluZGV4TWFza3M9XCIxXCIgRW5jb2RpbmdzPVwiMlwiIFNhbXBsZVJhdGVzPVwiNDQxMDAsNDgwMDBcIiAvPiIgKwogICAgICAgICAgICAgICAgICI8QnV0dG9uSW5mbyBIYXNCdG5BPVwiMVwiIEhhc0J0bkI9XCIxXCIgSGFzQnRuQz1cIjFcIiAvPiIgKwogICAgICAgICAgICAgIjwvUGVyaXBoZXJhbFByb2ZpbGU+IiArCi0gICAgICAgICAgICI8L1Byb2ZpbGVMaXN0PiI7CisgICAgICAgICI8L1Byb2ZpbGVMaXN0PiI7CiAKICAgICAvLyBYTUwgVGFncyBhbmQgQXR0cmlidXRlcwogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBrVGFnX1Byb2ZpbGVMaXN0ID0gIlByb2ZpbGVMaXN0IjsKZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9ibHVldG9vdGgvQmxlQ2xpZW50U2VydmljZS5qYXZhIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL2JsdWV0b290aC9CbGVDbGllbnRTZXJ2aWNlLmphdmEKaW5kZXggNmI2ODZlMC4uMWZkNmEyYiAxMDA2NDQKLS0tIGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL2JsdWV0b290aC9CbGVDbGllbnRTZXJ2aWNlLmphdmEKKysrIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL2JsdWV0b290aC9CbGVDbGllbnRTZXJ2aWNlLmphdmEKQEAgLTE0OCw4ICsxNDgsOCBAQAogICAgICAgICAgICAgImNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5ibHVldG9vdGguQkxFX0NMSUVOVF9BQ1RJT05fQ0xJRU5UX0NPTk5FQ1QiOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJMRV9DTElFTlRfQUNUSU9OX0NMSUVOVF9DT05ORUNUX1NFQ1VSRSA9CiAgICAgICAgICAgICAiY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLmJsdWV0b290aC5CTEVfQ0xJRU5UX0FDVElPTl9DTElFTlRfQ09OTkVDVF9TRUNVUkUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJMRV9DTElFTlRfQUNUSU9OX0JMRV9ESVNWT0NFUl9TRVJWSUNFID0KLSAgICAgICAgICAgICJjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIuYmx1ZXRvb3RoLkJMRV9DTElFTlRfQUNUSU9OX0JMRV9ESVNWT0NFUl9TRVJWSUNFIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCTEVfQ0xJRU5UX0FDVElPTl9CTEVfRElTQ09WRVJfU0VSVklDRSA9CisgICAgICAgICAgICAiY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLmJsdWV0b290aC5CTEVfQ0xJRU5UX0FDVElPTl9CTEVfRElTQ09WRVJfU0VSVklDRSI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkxFX0NMSUVOVF9BQ1RJT05fUkVRVUVTVF9NVFVfMjMgPQogICAgICAgICAgICAgImNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5ibHVldG9vdGguQkxFX0NMSUVOVF9BQ1RJT05fUkVRVUVTVF9NVFVfMjMiOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJMRV9DTElFTlRfQUNUSU9OX1JFUVVFU1RfTVRVXzUxMiA9CkBAIC0zNTMsNyArMzUzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgbUV4ZWNSZWxpYWJsZVdyaXRlID0gUmVsaWFibGVXcml0ZVN0YXRlLlJFTElBQkxFX1dSSVRFX05PTkU7CiAgICAgICAgICAgICAgICAgICAgIHN0YXJ0U2NhbigpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEJMRV9DTElFTlRfQUNUSU9OX0JMRV9ESVNWT0NFUl9TRVJWSUNFOgorICAgICAgICAgICAgICAgIGNhc2UgQkxFX0NMSUVOVF9BQ1RJT05fQkxFX0RJU0NPVkVSX1NFUlZJQ0U6CiAgICAgICAgICAgICAgICAgICAgIGlmIChtQmx1ZXRvb3RoR2F0dCAhPSBudWxsICYmIG1CbGVTdGF0ZSA9PSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RFRCkgewogICAgICAgICAgICAgICAgICAgICAgICAgbUJsdWV0b290aEdhdHQuZGlzY292ZXJTZXJ2aWNlcygpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtNzcwLDEzICs3NzAsMTMgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgbm90aWZ5UmVsaWFibGVXcml0ZUNvbXBsZXRlZCgpIHsKLSAgICAgICAgc2hvd01lc3NhZ2UoIlJlbGlhYmxlIHdyaXRlIGNvbXBlbHRlIik7CisgICAgICAgIHNob3dNZXNzYWdlKCJSZWxpYWJsZSB3cml0ZSBjb21wbGV0ZSIpOwogICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChCTEVfUkVMSUFCTEVfV1JJVEVfQ09NUExFVEVEKTsKICAgICAgICAgc2VuZEJyb2FkY2FzdChpbnRlbnQpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBub3RpZnlSZWxpYWJsZVdyaXRlQmFkUmVzcENvbXBsZXRlZChTdHJpbmcgZXJyKSB7Ci0gICAgICAgIHNob3dNZXNzYWdlKCJSZWxpYWJsZSB3cml0ZShiYWQgcmVzcG9uc2UpIGNvbXBlbHRlIik7CisgICAgICAgIHNob3dNZXNzYWdlKCJSZWxpYWJsZSB3cml0ZShiYWQgcmVzcG9uc2UpIGNvbXBsZXRlIik7CiAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEJMRV9SRUxJQUJMRV9XUklURV9CQURfUkVTUF9DT01QTEVURUQpOwogICAgICAgICBpZiAoZXJyICE9IG51bGwpIHsKICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShFWFRSQV9FUlJPUl9NRVNTQUdFLCBlcnIpOwpkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL2JsdWV0b290aC9CbGVDbGllbnRUZXN0QmFzZUFjdGl2aXR5LmphdmEgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvYmx1ZXRvb3RoL0JsZUNsaWVudFRlc3RCYXNlQWN0aXZpdHkuamF2YQppbmRleCBkZjlhMzY4Li5iNTIyMGY4IDEwMDY0NAotLS0gYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvYmx1ZXRvb3RoL0JsZUNsaWVudFRlc3RCYXNlQWN0aXZpdHkuamF2YQorKysgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvYmx1ZXRvb3RoL0JsZUNsaWVudFRlc3RCYXNlQWN0aXZpdHkuamF2YQpAQCAtMzUsNiArMzUsNyBAQAogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCiBwdWJsaWMgY2xhc3MgQmxlQ2xpZW50VGVzdEJhc2VBY3Rpdml0eSBleHRlbmRzIFBhc3NGYWlsQnV0dG9ucy5BY3Rpdml0eSB7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkJsZUNsaWVudFRlc3RCYXNlIjsKQEAgLTYyLDcgKzYzLDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEFTU19GTEFHX0FMTCA9IDB4M0ZGRkY7CiAKICAgICBwcml2YXRlIGZpbmFsIGludCBCTEVfQ0xJRU5UX0NPTk5FQ1QgPSAwOwotICAgIHByaXZhdGUgZmluYWwgaW50IEJMRV9CTEVfRElTVk9DRVJfU0VSVklDRSA9IDE7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgQkxFX0JMRV9ESVNDT1ZFUl9TRVJWSUNFID0gMTsKICAgICBwcml2YXRlIGZpbmFsIGludCBCTEVfUkVBRF9DSEFSQUNURVJJU1RJQyA9IDI7CiAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgQkxFX1dSSVRFX0NIQVJBQ1RFUklTVElDID0gMzsKICAgICBwcml2YXRlIGZpbmFsIGludCBCTEVfUkVRVUVTVF9NVFVfMjNCWVRFUyA9IDQ7CkBAIC05MCw4ICs5MSw2IEBACiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CiAgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmJsZV9zZXJ2ZXJfc3RhcnQpOwogICAgICAgICBzZXRQYXNzRmFpbEJ1dHRvbkNsaWNrTGlzdGVuZXJzKCk7Ci0gICAgICAgIHNldEluZm9SZXNvdXJjZXMoUi5zdHJpbmcuYmxlX2NsaWVudF90ZXN0X25hbWUsCi0gICAgICAgICAgICAgICAgUi5zdHJpbmcuYmxlX2NsaWVudF90ZXN0X2luZm8sIC0xKTsKICAgICAgICAgZ2V0UGFzc0J1dHRvbigpLnNldEVuYWJsZWQoZmFsc2UpOwogCiAgICAgICAgIG1UZXN0QWRhcHRlciA9IG5ldyBUZXN0QWRhcHRlcih0aGlzLCBzZXR1cFRlc3RMaXN0KCkpOwpAQCAtMjEyLDcgKzIxMSwxMSBAQAogICAgICAgICAgICAgU3RyaW5nIGFjdGlvbiA9IGludGVudC5nZXRBY3Rpb24oKTsKICAgICAgICAgICAgIFN0cmluZyBuZXdBY3Rpb24gPSBudWxsOwogICAgICAgICAgICAgU3RyaW5nIGFjdGlvbk5hbWUgPSBudWxsOworICAgICAgICAgICAgbG9uZyBwcmV2aW91c1Bhc3NlZCA9IG1QYXNzZWQ7CiAgICAgICAgICAgICBmaW5hbCBJbnRlbnQgc3RhcnRJbnRlbnQgPSBuZXcgSW50ZW50KEJsZUNsaWVudFRlc3RCYXNlQWN0aXZpdHkudGhpcywgQmxlQ2xpZW50U2VydmljZS5jbGFzcyk7CisgICAgICAgICAgICBpZiAoYWN0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJQcm9jZXNzaW5nICIgKyBhY3Rpb24pOworICAgICAgICAgICAgfQogICAgICAgICAgICAgc3dpdGNoIChhY3Rpb24pIHsKICAgICAgICAgICAgIGNhc2UgQmxlQ2xpZW50U2VydmljZS5CTEVfQkxVRVRPT1RIX0RJU0FCTEVEOgogICAgICAgICAgICAgICAgIHNob3dFcnJvckRpYWxvZyhSLnN0cmluZy5ibGVfYmx1ZXRvb3RoX2Rpc2FibGVfdGl0bGUsIFIuc3RyaW5nLmJsZV9ibHVldG9vdGhfZGlzYWJsZV9tZXNzYWdlLCB0cnVlKTsKQEAgLTIyMiwxMSArMjI1LDExIEBACiAgICAgICAgICAgICAgICAgbVRlc3RBZGFwdGVyLnNldFRlc3RQYXNzKEJMRV9DTElFTlRfQ09OTkVDVCk7CiAgICAgICAgICAgICAgICAgbVBhc3NlZCB8PSBQQVNTX0ZMQUdfQ09OTkVDVDsKICAgICAgICAgICAgICAgICAvLyBleGVjdXRlIHNlcnZpY2UgZGlzY292ZXJ5IHRlc3QKLSAgICAgICAgICAgICAgICBuZXdBY3Rpb24gPSBCbGVDbGllbnRTZXJ2aWNlLkJMRV9DTElFTlRfQUNUSU9OX0JMRV9ESVNWT0NFUl9TRVJWSUNFOworICAgICAgICAgICAgICAgIG5ld0FjdGlvbiA9IEJsZUNsaWVudFNlcnZpY2UuQkxFX0NMSUVOVF9BQ1RJT05fQkxFX0RJU0NPVkVSX1NFUlZJQ0U7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIEJsZUNsaWVudFNlcnZpY2UuQkxFX1NFUlZJQ0VTX0RJU0NPVkVSRUQ6CiAgICAgICAgICAgICAgICAgYWN0aW9uTmFtZSA9IGdldFN0cmluZyhSLnN0cmluZy5ibGVfZGlzY292ZXJfc2VydmljZV9uYW1lKTsKLSAgICAgICAgICAgICAgICBtVGVzdEFkYXB0ZXIuc2V0VGVzdFBhc3MoQkxFX0JMRV9ESVNWT0NFUl9TRVJWSUNFKTsKKyAgICAgICAgICAgICAgICBtVGVzdEFkYXB0ZXIuc2V0VGVzdFBhc3MoQkxFX0JMRV9ESVNDT1ZFUl9TRVJWSUNFKTsKICAgICAgICAgICAgICAgICBtUGFzc2VkIHw9IFBBU1NfRkxBR19ESVNDT1ZFUjsKICAgICAgICAgICAgICAgICAvLyBleGVjdXRlIE1UVSByZXF1ZXN0aW5nIHRlc3QgKDIzYnl0ZXMpCiAgICAgICAgICAgICAgICAgbmV3QWN0aW9uID0gQmxlQ2xpZW50U2VydmljZS5CTEVfQ0xJRU5UX0FDVElPTl9SRUFEX0NIQVJBQ1RFUklTVElDOwpAQCAtMjgzLDYgKzI4Niw3IEBACiAKICAgICAgICAgICAgICAgICAvLyBza2lwIFJlbGlhYmxlIHdyaXRlIChiYWQgcmVzcG9uc2UpIHRlc3QKICAgICAgICAgICAgICAgICBtUGFzc2VkIHw9IFBBU1NfRkxBR19SRUxJQUJMRV9XUklURV9CQURfUkVTUDsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJTa2lwIFBBU1NfRkxBR19SRUxJQUJMRV9XUklURV9CQURfUkVTUC4iKTsKICAgICAgICAgICAgICAgICBuZXdBY3Rpb24gPSBCbGVDbGllbnRTZXJ2aWNlLkJMRV9DTElFTlRfQUNUSU9OX05PVElGWV9DSEFSQUNURVJJU1RJQzsKICAgICAgICAgICAgICAgICBzaG93UHJvZ3Jlc3NEaWFsb2cgPSB0cnVlOwogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMzQyLDYgKzM0Niw3IEBACiAgICAgICAgICAgICAgICAgLy8gbmV3QWN0aW9uID0gQmxlQ2xpZW50U2VydmljZS5CTEVfQ0xJRU5UX0FDVElPTl9SRUFEX1JTU0k7CiAgICAgICAgICAgICAgICAgLy8gZXhlY3V0ZSBkaXNjb25uZWN0aW9uIHRlc3QKICAgICAgICAgICAgICAgICBtUGFzc2VkIHw9IFBBU1NfRkxBR19SRUFEX1JTU0k7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU2tpcCBQQVNTX0ZMQUdfUkVBRF9SU1NJLiIpOwogICAgICAgICAgICAgICAgIG5ld0FjdGlvbiA9IEJsZUNsaWVudFNlcnZpY2UuQkxFX0NMSUVOVF9BQ1RJT05fQ0xJRU5UX0RJU0NPTk5FQ1Q7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIEJsZUNsaWVudFNlcnZpY2UuQkxFX1JFQURfUkVNT1RFX1JTU0k6CkBAIC0zNjUsOSArMzcwLDE2IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGlmIChwcmV2aW91c1Bhc3NlZCAhPSBtUGFzc2VkKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGxvZ01lc3NhZ2UgPSBTdHJpbmcuZm9ybWF0KCJQYXNzZWQgRmxhZ3MgaGFzIGNoYW5nZWQgZnJvbSAweCUwOFggdG8gMHglMDhYLiBEZWx0YT0weCUwOFgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c1Bhc3NlZCwgbVBhc3NlZCwgbVBhc3NlZCBeIHByZXZpb3VzUGFzc2VkKTsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGxvZ01lc3NhZ2UpOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBtVGVzdEFkYXB0ZXIubm90aWZ5RGF0YVNldENoYW5nZWQoKTsKIAogICAgICAgICAgICAgaWYgKG5ld0FjdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU3RhcnRpbmcgIiArIG5ld0FjdGlvbik7CiAgICAgICAgICAgICAgICAgc3RhcnRJbnRlbnQuc2V0QWN0aW9uKG5ld0FjdGlvbik7CiAgICAgICAgICAgICAgICAgaWYgKFNURVBfRVhFQ1VUSU9OKSB7CiAgICAgICAgICAgICAgICAgICAgIGNsb3NlRGlhbG9nKCk7CkBAIC0zOTksNiArNDExLDcgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKG1QYXNzZWQgPT0gUEFTU19GTEFHX0FMTCkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkFsbCBUZXN0cyBQYXNzZWQuIik7CiAgICAgICAgICAgICAgICAgaWYgKHNob3VsZFJlYm9vdEJsdWV0b290aEFmdGVyVGVzdCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIG1CdFBvd2VyU3dpdGNoZXIuZXhlY3V0ZVN3aXRjaGluZygpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvYmx1ZXRvb3RoL0JsZUNvbm5lY3Rpb25Qcmlvcml0eUNsaWVudEJhc2VBY3Rpdml0eS5qYXZhIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL2JsdWV0b290aC9CbGVDb25uZWN0aW9uUHJpb3JpdHlDbGllbnRCYXNlQWN0aXZpdHkuamF2YQppbmRleCAwYWE0ODQxLi45MTE5YWFlIDEwMDY0NAotLS0gYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvYmx1ZXRvb3RoL0JsZUNvbm5lY3Rpb25Qcmlvcml0eUNsaWVudEJhc2VBY3Rpdml0eS5qYXZhCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9ibHVldG9vdGgvQmxlQ29ubmVjdGlvblByaW9yaXR5Q2xpZW50QmFzZUFjdGl2aXR5LmphdmEKQEAgLTQwLDE3ICs0MCwxMiBAQAogcHVibGljIGNsYXNzIEJsZUNvbm5lY3Rpb25Qcmlvcml0eUNsaWVudEJhc2VBY3Rpdml0eSBleHRlbmRzIFBhc3NGYWlsQnV0dG9ucy5BY3Rpdml0eSB7DQogDQogICAgIHByaXZhdGUgVGVzdEFkYXB0ZXIgbVRlc3RBZGFwdGVyOw0KLSAgICBwcml2YXRlIGludCBtUGFzc2VkID0gMDsNCisgICAgcHJpdmF0ZSBib29sZWFuIG1QYXNzZWQgPSBmYWxzZTsNCiAgICAgcHJpdmF0ZSBEaWFsb2cgbURpYWxvZzsNCiANCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJMRV9DT05ORUNUSU9OX0hJR0ggPSAwOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQkxFX0NPTk5FQ1RJT05fQkFMQU5DRUQgPSAxOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQkxFX0NPTk5FQ1RJT05fTE9XID0gMjsNCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJMRV9DT05ORUNUSU9OX1VQREFURSA9IDA7DQogDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQQVNTRURfSElHSCA9IDB4MTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBU1NFRF9CQUxBTkNFRCA9IDB4MjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBU1NFRF9MT1cgPSAweDQ7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBTExfUEFTU0VEID0gMHg3Ow0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUxMX1BBU1NFRCA9IDB4MTsNCiANCiAgICAgcHJpdmF0ZSBib29sZWFuIG1TZWN1cmU7DQogDQpAQCAtNzEsOCArNjYsNiBAQAogICAgICAgICBtVGVzdEFkYXB0ZXIgPSBuZXcgVGVzdEFkYXB0ZXIodGhpcywgc2V0dXBUZXN0TGlzdCgpKTsNCiAgICAgICAgIExpc3RWaWV3IGxpc3RWaWV3ID0gKExpc3RWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5ibGVfY2xpZW50X2Nvbm5lY3Rpb25fdGVzdHMpOw0KICAgICAgICAgbGlzdFZpZXcuc2V0QWRhcHRlcihtVGVzdEFkYXB0ZXIpOw0KLSAgICAgICAgbGlzdFZpZXcuc2V0RW5hYmxlZChmYWxzZSk7DQotICAgICAgICBsaXN0Vmlldy5zZXRDbGlja2FibGUoZmFsc2UpOw0KICAgICB9DQogDQogICAgIEBPdmVycmlkZQ0KQEAgLTgyLDkgKzc1LDcgQEAKICAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsNCiAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oQmxlQ29ubmVjdGlvblByaW9yaXR5Q2xpZW50U2VydmljZS5BQ1RJT05fQkxVRVRPT1RIX0RJU0FCTEVEKTsNCiAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oQmxlQ29ubmVjdGlvblByaW9yaXR5Q2xpZW50U2VydmljZS5BQ1RJT05fQ09OTkVDVElPTl9TRVJWSUNFU19ESVNDT1ZFUkVEKTsNCi0gICAgICAgIGZpbHRlci5hZGRBY3Rpb24oQmxlQ29ubmVjdGlvblByaW9yaXR5Q2xpZW50U2VydmljZS5BQ1RJT05fRklOSVNIX0NPTk5FQ1RJT05fUFJJT1JJVFlfSElHSCk7DQotICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEJsZUNvbm5lY3Rpb25Qcmlvcml0eUNsaWVudFNlcnZpY2UuQUNUSU9OX0ZJTklTSF9DT05ORUNUSU9OX1BSSU9SSVRZX0JBTEFOQ0VEKTsNCi0gICAgICAgIGZpbHRlci5hZGRBY3Rpb24oQmxlQ29ubmVjdGlvblByaW9yaXR5Q2xpZW50U2VydmljZS5BQ1RJT05fRklOSVNIX0NPTk5FQ1RJT05fUFJJT1JJVFlfTE9XX1BPV0VSKTsNCisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oQmxlQ29ubmVjdGlvblByaW9yaXR5Q2xpZW50U2VydmljZS5BQ1RJT05fQ09OTkVDVElPTl9QUklPUklUWV9GSU5JU0gpOw0KICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihCbGVDb25uZWN0aW9uUHJpb3JpdHlDbGllbnRTZXJ2aWNlLkFDVElPTl9CTFVFVE9PVEhfTUlTTUFUQ0hfU0VDVVJFKTsNCiAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oQmxlQ29ubmVjdGlvblByaW9yaXR5Q2xpZW50U2VydmljZS5BQ1RJT05fQkxVRVRPT1RIX01JU01BVENIX0lOU0VDVVJFKTsNCiAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oQmxlQ29ubmVjdGlvblByaW9yaXR5Q2xpZW50U2VydmljZS5BQ1RJT05fRklOSVNIX0RJU0NPTk5FQ1QpOw0KQEAgLTE0Miw5ICsxMzMsNyBAQAogDQogICAgIHByaXZhdGUgTGlzdDxJbnRlZ2VyPiBzZXR1cFRlc3RMaXN0KCkgew0KICAgICAgICAgQXJyYXlMaXN0PEludGVnZXI+IHRlc3RMaXN0ID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOw0KLSAgICAgICAgdGVzdExpc3QuYWRkKFIuc3RyaW5nLmJsZV9jb25uZWN0aW9uX3ByaW9yaXR5X2NsaWVudF9oaWdoKTsNCi0gICAgICAgIHRlc3RMaXN0LmFkZChSLnN0cmluZy5ibGVfY29ubmVjdGlvbl9wcmlvcml0eV9jbGllbnRfYmFsYW5jZWQpOw0KLSAgICAgICAgdGVzdExpc3QuYWRkKFIuc3RyaW5nLmJsZV9jb25uZWN0aW9uX3ByaW9yaXR5X2NsaWVudF9sb3cpOw0KKyAgICAgICAgdGVzdExpc3QuYWRkKFIuc3RyaW5nLmJsZV9jb25uZWN0aW9uX3ByaW9yaXR5X2NsaWVudF9kZXNjcmlwdGlvbik7DQogICAgICAgICByZXR1cm4gdGVzdExpc3Q7DQogICAgIH0NCiANCkBAIC0xNTksNDQgKzE0OCwyNCBAQAogICAgIHByaXZhdGUgdm9pZCBleGVjdXRlTmV4dFRlc3RJbXBsKCkgew0KICAgICAgICAgc3dpdGNoIChtQ3VycmVudFRlc3QpIHsNCiAgICAgICAgICAgICBjYXNlIC0xOiB7DQotICAgICAgICAgICAgICAgIG1DdXJyZW50VGVzdCA9IEJMRV9DT05ORUNUSU9OX0hJR0g7DQorICAgICAgICAgICAgICAgIG1DdXJyZW50VGVzdCA9IEJMRV9DT05ORUNUSU9OX1VQREFURTsNCiAgICAgICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQodGhpcywgQmxlQ29ubmVjdGlvblByaW9yaXR5Q2xpZW50U2VydmljZS5jbGFzcyk7DQotICAgICAgICAgICAgICAgIGludGVudC5zZXRBY3Rpb24oQmxlQ29ubmVjdGlvblByaW9yaXR5Q2xpZW50U2VydmljZS5BQ1RJT05fQ09OTkVDVElPTl9QUklPUklUWV9ISUdIKTsNCisgICAgICAgICAgICAgICAgaW50ZW50LnNldEFjdGlvbihCbGVDb25uZWN0aW9uUHJpb3JpdHlDbGllbnRTZXJ2aWNlLkFDVElPTl9DT05ORUNUSU9OX1BSSU9SSVRZX1NUQVJUKTsNCiAgICAgICAgICAgICAgICAgc3RhcnRTZXJ2aWNlKGludGVudCk7DQotICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSBnZXRTdHJpbmcoUi5zdHJpbmcuYmxlX2NsaWVudF9jb25uZWN0aW9uX3ByaW9yaXR5KQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0U3RyaW5nKFIuc3RyaW5nLmJsZV9jb25uZWN0aW9uX3ByaW9yaXR5X2hpZ2gpOw0KKyAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gZ2V0U3RyaW5nKFIuc3RyaW5nLmJsZV9jbGllbnRfY29ubmVjdGlvbl9wcmlvcml0eSk7DQogICAgICAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KGdldEFwcGxpY2F0aW9uQ29udGV4dCgpLCBtc2csIFRvYXN0LkxFTkdUSF9MT05HKS5zaG93KCk7DQogICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEJMRV9DT05ORUNUSU9OX0JBTEFOQ0VEOiB7DQotICAgICAgICAgICAgICAgIG1DdXJyZW50VGVzdCA9IEJMRV9DT05ORUNUSU9OX0xPVzsNCi0gICAgICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQodGhpcywgQmxlQ29ubmVjdGlvblByaW9yaXR5Q2xpZW50U2VydmljZS5jbGFzcyk7DQotICAgICAgICAgICAgICAgIGludGVudC5zZXRBY3Rpb24oQmxlQ29ubmVjdGlvblByaW9yaXR5Q2xpZW50U2VydmljZS5BQ1RJT05fQ09OTkVDVElPTl9QUklPUklUWV9MT1dfUE9XRVIpOw0KLSAgICAgICAgICAgICAgICBzdGFydFNlcnZpY2UoaW50ZW50KTsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9IGdldFN0cmluZyhSLnN0cmluZy5ibGVfY2xpZW50X2Nvbm5lY3Rpb25fcHJpb3JpdHkpDQotICAgICAgICAgICAgICAgICAgICAgICAgKyBnZXRTdHJpbmcoUi5zdHJpbmcuYmxlX2Nvbm5lY3Rpb25fcHJpb3JpdHlfbG93KTsNCi0gICAgICAgICAgICAgICAgVG9hc3QubWFrZVRleHQoZ2V0QXBwbGljYXRpb25Db250ZXh0KCksIG1zZywgVG9hc3QuTEVOR1RIX0xPTkcpLnNob3coKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgQkxFX0NPTk5FQ1RJT05fSElHSDogew0KLSAgICAgICAgICAgICAgICBtQ3VycmVudFRlc3QgPSBCTEVfQ09OTkVDVElPTl9CQUxBTkNFRDsNCi0gICAgICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQodGhpcywgQmxlQ29ubmVjdGlvblByaW9yaXR5Q2xpZW50U2VydmljZS5jbGFzcyk7DQotICAgICAgICAgICAgICAgIGludGVudC5zZXRBY3Rpb24oQmxlQ29ubmVjdGlvblByaW9yaXR5Q2xpZW50U2VydmljZS5BQ1RJT05fQ09OTkVDVElPTl9QUklPUklUWV9CQUxBTkNFRCk7DQotICAgICAgICAgICAgICAgIHN0YXJ0U2VydmljZShpbnRlbnQpOw0KLSAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gZ2V0U3RyaW5nKFIuc3RyaW5nLmJsZV9jbGllbnRfY29ubmVjdGlvbl9wcmlvcml0eSkNCi0gICAgICAgICAgICAgICAgICAgICAgICArIGdldFN0cmluZyhSLnN0cmluZy5ibGVfY29ubmVjdGlvbl9wcmlvcml0eV9iYWxhbmNlZCk7DQotICAgICAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KGdldEFwcGxpY2F0aW9uQ29udGV4dCgpLCBtc2csIFRvYXN0LkxFTkdUSF9MT05HKS5zaG93KCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEJMRV9DT05ORUNUSU9OX0xPVzoNCisgICAgICAgICAgICBjYXNlIEJMRV9DT05ORUNUSU9OX1VQREFURTogew0KICAgICAgICAgICAgICAgICAvLyBhbGwgdGVzdCBkb25lDQogICAgICAgICAgICAgICAgIGNsb3NlRGlhbG9nKCk7DQotICAgICAgICAgICAgICAgIGlmIChtUGFzc2VkID09IEFMTF9QQVNTRUQpIHsNCisgICAgICAgICAgICAgICAgaWYgKG1QYXNzZWQgPT0gdHJ1ZSkgew0KICAgICAgICAgICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQodGhpcywgQmxlQ29ubmVjdGlvblByaW9yaXR5Q2xpZW50U2VydmljZS5jbGFzcyk7DQogICAgICAgICAgICAgICAgICAgICBpbnRlbnQuc2V0QWN0aW9uKEJsZUNvbm5lY3Rpb25Qcmlvcml0eUNsaWVudFNlcnZpY2UuQUNUSU9OX0RJU0NPTk5FQ1QpOw0KICAgICAgICAgICAgICAgICAgICAgc3RhcnRTZXJ2aWNlKGludGVudCk7DQogICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KICAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgIC8vIHNvbWV0aGluZyB3ZW50IHdyb25nDQogICAgICAgICAgICAgICAgIGNsb3NlRGlhbG9nKCk7DQpAQCAtMjI5LDIxICsxOTgsMTEgQEAKICAgICAgICAgICAgICAgICBzaG93UHJvZ3Jlc3NEaWFsb2coKTsNCiAgICAgICAgICAgICAgICAgZXhlY3V0ZU5leHRUZXN0KDMwMDApOw0KICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEJsZUNvbm5lY3Rpb25Qcmlvcml0eUNsaWVudFNlcnZpY2UuQUNUSU9OX0ZJTklTSF9DT05ORUNUSU9OX1BSSU9SSVRZX0hJR0g6DQotICAgICAgICAgICAgICAgIG1UZXN0QWRhcHRlci5zZXRUZXN0UGFzcyhCTEVfQ09OTkVDVElPTl9ISUdIKTsNCi0gICAgICAgICAgICAgICAgbVBhc3NlZCB8PSBQQVNTRURfSElHSDsNCisgICAgICAgICAgICBjYXNlIEJsZUNvbm5lY3Rpb25Qcmlvcml0eUNsaWVudFNlcnZpY2UuQUNUSU9OX0NPTk5FQ1RJT05fUFJJT1JJVFlfRklOSVNIOg0KKyAgICAgICAgICAgICAgICBtVGVzdEFkYXB0ZXIuc2V0VGVzdFBhc3MoQkxFX0NPTk5FQ1RJT05fVVBEQVRFKTsNCisgICAgICAgICAgICAgICAgbVBhc3NlZCA9IHRydWU7DQogICAgICAgICAgICAgICAgIGV4ZWN1dGVOZXh0VGVzdCgxMDAwKTsNCiAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBCbGVDb25uZWN0aW9uUHJpb3JpdHlDbGllbnRTZXJ2aWNlLkFDVElPTl9GSU5JU0hfQ09OTkVDVElPTl9QUklPUklUWV9CQUxBTkNFRDoNCi0gICAgICAgICAgICAgICAgbVRlc3RBZGFwdGVyLnNldFRlc3RQYXNzKEJMRV9DT05ORUNUSU9OX0JBTEFOQ0VEKTsNCi0gICAgICAgICAgICAgICAgbVBhc3NlZCB8PSBQQVNTRURfQkFMQU5DRUQ7DQotICAgICAgICAgICAgICAgIGV4ZWN1dGVOZXh0VGVzdCgxMDAwKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBCbGVDb25uZWN0aW9uUHJpb3JpdHlDbGllbnRTZXJ2aWNlLkFDVElPTl9GSU5JU0hfQ09OTkVDVElPTl9QUklPUklUWV9MT1dfUE9XRVI6DQotICAgICAgICAgICAgICAgIG1UZXN0QWRhcHRlci5zZXRUZXN0UGFzcyhCTEVfQ09OTkVDVElPTl9MT1cpOw0KLSAgICAgICAgICAgICAgICBtUGFzc2VkIHw9IFBBU1NFRF9MT1c7DQotICAgICAgICAgICAgICAgIGV4ZWN1dGVOZXh0VGVzdCgxMDApOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICBjYXNlIEJsZUNvbm5lY3Rpb25Qcmlvcml0eUNsaWVudFNlcnZpY2UuQUNUSU9OX0JMVUVUT09USF9NSVNNQVRDSF9TRUNVUkU6DQogICAgICAgICAgICAgICAgIHNob3dFcnJvckRpYWxvZyhSLnN0cmluZy5ibGVfYmx1ZXRvb3RoX21pc21hdGNoX3RpdGxlLCBSLnN0cmluZy5ibGVfYmx1ZXRvb3RoX21pc21hdGNoX3NlY3VyZV9tZXNzYWdlLCB0cnVlKTsNCiAgICAgICAgICAgICAgICAgYnJlYWs7DQpkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL2JsdWV0b290aC9CbGVDb25uZWN0aW9uUHJpb3JpdHlDbGllbnRTZXJ2aWNlLmphdmEgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvYmx1ZXRvb3RoL0JsZUNvbm5lY3Rpb25Qcmlvcml0eUNsaWVudFNlcnZpY2UuamF2YQppbmRleCAzOGQzN2JkLi4xZGY0MGY1IDEwMDY0NAotLS0gYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvYmx1ZXRvb3RoL0JsZUNvbm5lY3Rpb25Qcmlvcml0eUNsaWVudFNlcnZpY2UuamF2YQorKysgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvYmx1ZXRvb3RoL0JsZUNvbm5lY3Rpb25Qcmlvcml0eUNsaWVudFNlcnZpY2UuamF2YQpAQCAtNjIsMTkgKzYyLDExIEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0JMVUVUT09USF9NSVNNQVRDSF9JTlNFQ1VSRSA9DQogICAgICAgICAgICAgImNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5ibHVldG9vdGguYWN0aW9uLkFDVElPTl9CTFVFVE9PVEhfTUlTTUFUQ0hfSU5TRUNVUkUiOw0KIA0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fQ09OTkVDVElPTl9QUklPUklUWV9CQUxBTkNFRCA9DQotICAgICAgICAgICAgImNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5ibHVldG9vdGguYWN0aW9uLkNPTk5FQ1RJT05fUFJJT1JJVFlfQkFMQU5DRUQiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fQ09OTkVDVElPTl9QUklPUklUWV9ISUdIID0NCi0gICAgICAgICAgICAiY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLmJsdWV0b290aC5hY3Rpb24uQ09OTkVDVElPTl9QUklPUklUWV9ISUdIIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0NPTk5FQ1RJT05fUFJJT1JJVFlfTE9XX1BPV0VSID0NCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0NPTk5FQ1RJT05fUFJJT1JJVFlfU1RBUlQgPQ0KICAgICAgICAgICAgICJjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIuYmx1ZXRvb3RoLmFjdGlvbi5DT05ORUNUSU9OX1BSSU9SSVRZX0xPV19QT1dFUiI7DQogDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9GSU5JU0hfQ09OTkVDVElPTl9QUklPUklUWV9CQUxBTkNFRCA9DQotICAgICAgICAgICAgImNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5ibHVldG9vdGguYWN0aW9uLkZJTklTSF9DT05ORUNUSU9OX1BSSU9SSVRZX0JBTEFOQ0VEIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0ZJTklTSF9DT05ORUNUSU9OX1BSSU9SSVRZX0hJR0ggPQ0KLSAgICAgICAgICAgICJjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIuYmx1ZXRvb3RoLmFjdGlvbi5GSU5JU0hfQ09OTkVDVElPTl9QUklPUklUWV9ISUdIIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0ZJTklTSF9DT05ORUNUSU9OX1BSSU9SSVRZX0xPV19QT1dFUiA9DQotICAgICAgICAgICAgImNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5ibHVldG9vdGguYWN0aW9uLkZJTklTSF9DT05ORUNUSU9OX1BSSU9SSVRZX0xPV19QT1dFUiI7DQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9DT05ORUNUSU9OX1BSSU9SSVRZX0ZJTklTSCA9DQorICAgICAgICAgICAgImNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5ibHVldG9vdGguYWN0aW9uLkNPTk5FQ1RJT05fUFJJT1JJVFlfRklOSVNIIjsNCiANCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0NMSUVOVF9DT05ORUNUX1NFQ1VSRSA9DQogICAgICAgICAgICAgImNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5ibHVldG9vdGguYWN0aW9uLkNMSUVOVF9DT05ORUNUX1NFQ1VSRSI7DQpAQCAtODQsMjAgKzc2LDcgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fRklOSVNIX0RJU0NPTk5FQ1QgPQ0KICAgICAgICAgICAgICJjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIuYmx1ZXRvb3RoLmFjdGlvbi5GSU5JU0hfRElTQ09OTkVDVCI7DQogDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBERUZBVUxUX0lOVEVSVkFMID0gMTAwTDsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIERFRkFVTFRfUEVSSU9EID0gMTAwMDBMOw0KLQ0KLSAgICAvLyB0aGlzIHN0cmluZyB3aWxsIGJlIHVzZWQgYXQgd3JpdGluZyB0ZXN0IGFuZCBjb25uZWN0aW9uIHByaW9yaXR5IHRlc3QuDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXUklURV9WQUxVRSA9ICJURVNUIjsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVVJRCBTRVJWSUNFX1VVSUQgPQ0KLSAgICAgICAgICAgIFVVSUQuZnJvbVN0cmluZygiMDAwMDk5OTktMDAwMC0xMDAwLTgwMDAtMDA4MDVmOWIzNGZiIik7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVVSUQgQ0hBUkFDVEVSSVNUSUNfVVVJRCA9DQotICAgICAgICAgICAgVVVJRC5mcm9tU3RyaW5nKCIwMDAwOTk5OC0wMDAwLTEwMDAtODAwMC0wMDgwNWY5YjM0ZmIiKTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVVJRCBTVEFSVF9DSEFSQUNURVJJU1RJQ19VVUlEID0NCi0gICAgICAgICAgICBVVUlELmZyb21TdHJpbmcoIjAwMDA5OTk3LTAwMDAtMTAwMC04MDAwLTAwODA1ZjliMzRmYiIpOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVVUlEIFNUT1BfQ0hBUkFDVEVSSVNUSUNfVVVJRCA9DQotICAgICAgICAgICAgVVVJRC5mcm9tU3RyaW5nKCIwMDAwOTk5NS0wMDAwLTEwMDAtODAwMC0wMDgwNWY5YjM0ZmIiKTsNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9UX1VOREVSX1RFU1QgPSAtMTsNCiANCiAgICAgcHJpdmF0ZSBCbHVldG9vdGhNYW5hZ2VyIG1CbHVldG9vdGhNYW5hZ2VyOw0KICAgICBwcml2YXRlIEJsdWV0b290aEFkYXB0ZXIgbUJsdWV0b290aEFkYXB0ZXI7DQpAQCAtMTA4LDEzICs4NywxMiBAQAogICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsNCiANCiAgICAgcHJpdmF0ZSBTdHJpbmcgbUFjdGlvbjsNCi0gICAgcHJpdmF0ZSBsb25nIG1JbnRlcnZhbDsNCi0gICAgcHJpdmF0ZSBsb25nIG1QZXJpb2Q7DQotICAgIHByaXZhdGUgRGF0ZSBtU3RhcnREYXRlOw0KLSAgICBwcml2YXRlIGludCBtV3JpdGVDb3VudDsNCiAgICAgcHJpdmF0ZSBib29sZWFuIG1TZWN1cmU7DQogDQotICAgIHByaXZhdGUgU3RyaW5nIG1Qcmlvcml0eTsNCisgICAgcHJpdmF0ZSBpbnQgbVByaW9yaXR5ID0gTk9UX1VOREVSX1RFU1Q7DQorICAgIHByaXZhdGUgaW50IGludGVydmFsX2xvdyA9IDA7DQorICAgIHByaXZhdGUgaW50IGludGVydmFsX2JhbGFuY2VkID0gMDsNCisgICAgcHJpdmF0ZSBpbnQgaW50ZXJ2YWxfaGlnaCA9IDA7DQogDQogICAgIHByaXZhdGUgVGVzdFRhc2tRdWV1ZSBtVGFza1F1ZXVlOw0KIA0KQEAgLTEyOSw4ICsxMDcsNiBAQAogICAgICAgICBtU2Nhbm5lciA9IG1CbHVldG9vdGhBZGFwdGVyLmdldEJsdWV0b290aExlU2Nhbm5lcigpOw0KICAgICAgICAgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpOw0KICAgICAgICAgbUNvbnRleHQgPSB0aGlzOw0KLSAgICAgICAgbUludGVydmFsID0gREVGQVVMVF9JTlRFUlZBTDsNCi0gICAgICAgIG1QZXJpb2QgPSBERUZBVUxUX1BFUklPRDsNCiANCiAgICAgICAgIHN0YXJ0U2NhbigpOw0KICAgICB9DQpAQCAtMTcxLDE1ICsxNDcsOCBAQAogICAgICAgICAgICAgICAgIGNhc2UgQUNUSU9OX0NMSUVOVF9DT05ORUNUX1NFQ1VSRToNCiAgICAgICAgICAgICAgICAgICAgIG1TZWN1cmUgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgQUNUSU9OX0NPTk5FQ1RJT05fUFJJT1JJVFlfQkFMQU5DRUQ6DQotICAgICAgICAgICAgICAgIGNhc2UgQUNUSU9OX0NPTk5FQ1RJT05fUFJJT1JJVFlfSElHSDoNCi0gICAgICAgICAgICAgICAgY2FzZSBBQ1RJT05fQ09OTkVDVElPTl9QUklPUklUWV9MT1dfUE9XRVI6DQotICAgICAgICAgICAgICAgICAgICBtVGFza1F1ZXVlLmFkZFRhc2sobmV3IFJ1bm5hYmxlKCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRQZXJpb2RpY1RyYW5zbWlzc2lvbigpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0pOw0KKyAgICAgICAgICAgICAgICBjYXNlIEFDVElPTl9DT05ORUNUSU9OX1BSSU9SSVRZX1NUQVJUOg0KKyAgICAgICAgICAgICAgICAgICAgbXlSZXF1ZXN0Q29ubmVjdGlvblByaW9yaXR5KEJsdWV0b290aEdhdHQuQ09OTkVDVElPTl9QUklPUklUWV9MT1dfUE9XRVIpOw0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgIGNhc2UgQUNUSU9OX0RJU0NPTk5FQ1Q6DQogICAgICAgICAgICAgICAgICAgICBpZiAobUJsdWV0b290aEdhdHQgIT0gbnVsbCkgew0KQEAgLTE5NCwxMjAgKzE2MywxNyBAQAogICAgICAgICByZXR1cm4gU1RBUlRfTk9UX1NUSUNLWTsNCiAgICAgfQ0KIA0KLSAgICBwcml2YXRlIHZvaWQgc3RhcnRQZXJpb2RpY1RyYW5zbWlzc2lvbigpIHsNCi0gICAgICAgIG1Xcml0ZUNvdW50ID0gMDsNCi0NCi0gICAgICAgIC8vIFNldCBjb25uZWN0aW9uIHByaW9yaXR5DQotICAgICAgICBzd2l0Y2ggKG1BY3Rpb24pIHsNCi0gICAgICAgIGNhc2UgQUNUSU9OX0NPTk5FQ1RJT05fUFJJT1JJVFlfQkFMQU5DRUQ6DQotICAgICAgICAgICAgbVByaW9yaXR5ID0gQmxlQ29ubmVjdGlvblByaW9yaXR5U2VydmVyU2VydmljZS5DT05ORUNUSU9OX1BSSU9SSVRZX0JBTEFOQ0VEOw0KLSAgICAgICAgICAgIG1CbHVldG9vdGhHYXR0LnJlcXVlc3RDb25uZWN0aW9uUHJpb3JpdHkoQmx1ZXRvb3RoR2F0dC5DT05ORUNUSU9OX1BSSU9SSVRZX0JBTEFOQ0VEKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgQUNUSU9OX0NPTk5FQ1RJT05fUFJJT1JJVFlfSElHSDoNCi0gICAgICAgICAgICBtUHJpb3JpdHkgPSBCbGVDb25uZWN0aW9uUHJpb3JpdHlTZXJ2ZXJTZXJ2aWNlLkNPTk5FQ1RJT05fUFJJT1JJVFlfSElHSDsNCi0gICAgICAgICAgICBtQmx1ZXRvb3RoR2F0dC5yZXF1ZXN0Q29ubmVjdGlvblByaW9yaXR5KEJsdWV0b290aEdhdHQuQ09OTkVDVElPTl9QUklPUklUWV9ISUdIKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgQUNUSU9OX0NPTk5FQ1RJT05fUFJJT1JJVFlfTE9XX1BPV0VSOg0KLSAgICAgICAgICAgIG1Qcmlvcml0eSA9IEJsZUNvbm5lY3Rpb25Qcmlvcml0eVNlcnZlclNlcnZpY2UuQ09OTkVDVElPTl9QUklPUklUWV9MT1dfUE9XRVI7DQotICAgICAgICAgICAgbUJsdWV0b290aEdhdHQucmVxdWVzdENvbm5lY3Rpb25Qcmlvcml0eShCbHVldG9vdGhHYXR0LkNPTk5FQ1RJT05fUFJJT1JJVFlfTE9XX1BPV0VSKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgbVByaW9yaXR5ID0gQmxlQ29ubmVjdGlvblByaW9yaXR5U2VydmVyU2VydmljZS5DT05ORUNUSU9OX1BSSU9SSVRZX0JBTEFOQ0VEOw0KLSAgICAgICAgICAgIG1CbHVldG9vdGhHYXR0LnJlcXVlc3RDb25uZWN0aW9uUHJpb3JpdHkoQmx1ZXRvb3RoR2F0dC5DT05ORUNUSU9OX1BSSU9SSVRZX0JBTEFOQ0VEKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIENyZWF0ZSBUaW1lciBmb3IgUGVyaW9kaWMgdHJhbnNtaXNzaW9uDQotICAgICAgICBtU3RhcnREYXRlID0gbmV3IERhdGUoKTsNCi0gICAgICAgIFRpbWVyVGFzayB0YXNrID0gbmV3IFRpbWVyVGFzaygpIHsNCi0gICAgICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7DQotICAgICAgICAgICAgICAgIGlmIChtQmx1ZXRvb3RoR2F0dCA9PSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJCbHVldG9vdGhHYXR0IGlzIG51bGwsIHJldHVybiIpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIERhdGUgY3VycmVudERhdGEgPSBuZXcgRGF0ZSgpOw0KLSAgICAgICAgICAgICAgICBpZiAoKGN1cnJlbnREYXRhLmdldFRpbWUoKSAtIG1TdGFydERhdGUuZ2V0VGltZSgpKSA+PSBtUGVyaW9kKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAobUNvbm5lY3Rpb25UaW1lciAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25UaW1lci5jYW5jZWwoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvblRpbWVyID0gbnVsbDsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBTVE9QX0NIQVJBQ1RFUklTVElDX1VVSUQgaXMgY3JpdGljYWwgaW4gc3luY2luZyB0aGUgY2xpZW50IGFuZCBzZXJ2ZXINCi0gICAgICAgICAgICAgICAgICAgIC8vIHN0YXRlcy4gIERlbGF5IHRoZSB3cml0ZSBieSAyIHNlY29uZHMgdG8gaW1wcm92ZSB0aGUgY2hhbmNlIG9mIHRoaXMNCi0gICAgICAgICAgICAgICAgICAgIC8vIGNoYXJhY3RlcmlzdGljIGdvaW5nIHRocm91Z2guICBDb25zaWRlciBjaGFuZ2luZyB0aGUgY29kZSB0byB1c2UgY2FsbGJhY2tzDQotICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgZnV0dXJlIHRvIG1ha2UgaXQgbW9yZSByb2J1c3QuDQotICAgICAgICAgICAgICAgICAgICBzbGVlcCgyMDAwKTsNCi0gICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRlcm1pbmF0aW9uIGRhdGEgKGNvbnRhaW5zIGN1cnJlbnQgcHJpb3JpdHkgYW5kIG51bWJlciBvZiBtZXNzYWdlcyB3cm90ZSkNCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiIiArIG1Qcmlvcml0eSArICIsIiArIG1Xcml0ZUNvdW50Ow0KLSAgICAgICAgICAgICAgICAgICAgd3JpdGVDaGFyYWN0ZXJpc3RpYyhTVE9QX0NIQVJBQ1RFUklTVElDX1VVSUQsIG1zZyk7DQotICAgICAgICAgICAgICAgICAgICBzbGVlcCgxMDAwKTsNCi0gICAgICAgICAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KCk7DQotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1Qcmlvcml0eSkgew0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBCbGVDb25uZWN0aW9uUHJpb3JpdHlTZXJ2ZXJTZXJ2aWNlLkNPTk5FQ1RJT05fUFJJT1JJVFlfQkFMQU5DRUQ6DQotICAgICAgICAgICAgICAgICAgICAgICAgaW50ZW50LnNldEFjdGlvbihBQ1RJT05fRklOSVNIX0NPTk5FQ1RJT05fUFJJT1JJVFlfQkFMQU5DRUQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBCbGVDb25uZWN0aW9uUHJpb3JpdHlTZXJ2ZXJTZXJ2aWNlLkNPTk5FQ1RJT05fUFJJT1JJVFlfSElHSDoNCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnQuc2V0QWN0aW9uKEFDVElPTl9GSU5JU0hfQ09OTkVDVElPTl9QUklPUklUWV9ISUdIKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgQmxlQ29ubmVjdGlvblByaW9yaXR5U2VydmVyU2VydmljZS5DT05ORUNUSU9OX1BSSU9SSVRZX0xPV19QT1dFUjoNCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnQuc2V0QWN0aW9uKEFDVElPTl9GSU5JU0hfQ09OTkVDVElPTl9QUklPUklUWV9MT1dfUE9XRVIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgc2VuZEJyb2FkY2FzdChpbnRlbnQpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmIChtQ29ubmVjdGlvblRpbWVyICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRlc3RpbmcgZGF0YQ0KLSAgICAgICAgICAgICAgICAgICAgKyttV3JpdGVDb3VudDsNCi0gICAgICAgICAgICAgICAgICAgIHdyaXRlQ2hhcmFjdGVyaXN0aWMoQ0hBUkFDVEVSSVNUSUNfVVVJRCwgV1JJVEVfVkFMVUUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfTsNCi0NCi0gICAgICAgIC8vIHdyaXRlIHN0YXJ0aW5nIGRhdGENCi0gICAgICAgIHdyaXRlQ2hhcmFjdGVyaXN0aWMoU1RBUlRfQ0hBUkFDVEVSSVNUSUNfVVVJRCwgbVByaW9yaXR5KTsNCi0NCi0gICAgICAgIC8vIHN0YXJ0IHNlbmRpbmcNCi0gICAgICAgIHNsZWVwKDEwMDApOw0KLSAgICAgICAgbUNvbm5lY3Rpb25UaW1lciA9IG5ldyBUaW1lcigpOw0KLSAgICAgICAgbUNvbm5lY3Rpb25UaW1lci5zY2hlZHVsZSh0YXNrLCAwLCBtSW50ZXJ2YWwpOw0KKyAgICBwcml2YXRlIHZvaWQgbXlSZXF1ZXN0Q29ubmVjdGlvblByaW9yaXR5KGZpbmFsIGludCBwcmlvcml0eSkgew0KKyAgICAgICAgbVRhc2tRdWV1ZS5hZGRUYXNrKG5ldyBSdW5uYWJsZSgpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qcmlvcml0eSA9IHByaW9yaXR5Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CbHVldG9vdGhHYXR0LnJlcXVlc3RDb25uZWN0aW9uUHJpb3JpdHkobVByaW9yaXR5KTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnRpbnVlIGluIG9uQ29ubmVjdGlvblVwZGF0ZWQoKSBjYWxsYmFjaw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsNCiAgICAgfQ0KIA0KLSAgICBwcml2YXRlIEJsdWV0b290aEdhdHRTZXJ2aWNlIGdldFNlcnZpY2UoKSB7DQotICAgICAgICBCbHVldG9vdGhHYXR0U2VydmljZSBzZXJ2aWNlID0gbnVsbDsNCi0NCi0gICAgICAgIGlmIChtQmx1ZXRvb3RoR2F0dCAhPSBudWxsKSB7DQotICAgICAgICAgICAgc2VydmljZSA9IG1CbHVldG9vdGhHYXR0LmdldFNlcnZpY2UoU0VSVklDRV9VVUlEKTsNCi0gICAgICAgICAgICBpZiAoc2VydmljZSA9PSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHNob3dNZXNzYWdlKCJTZXJ2aWNlIG5vdCBmb3VuZCIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBzZXJ2aWNlOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgQmx1ZXRvb3RoR2F0dENoYXJhY3RlcmlzdGljIGdldENoYXJhY3RlcmlzdGljKFVVSUQgdXVpZCkgew0KLSAgICAgICAgQmx1ZXRvb3RoR2F0dENoYXJhY3RlcmlzdGljIGNoYXJhY3RlcmlzdGljID0gbnVsbDsNCi0NCi0gICAgICAgIEJsdWV0b290aEdhdHRTZXJ2aWNlIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKCk7DQotICAgICAgICBpZiAoc2VydmljZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgY2hhcmFjdGVyaXN0aWMgPSBzZXJ2aWNlLmdldENoYXJhY3RlcmlzdGljKHV1aWQpOw0KLSAgICAgICAgICAgIGlmIChjaGFyYWN0ZXJpc3RpYyA9PSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHNob3dNZXNzYWdlKCJDaGFyYWN0ZXJpc3RpYyBub3QgZm91bmQiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gY2hhcmFjdGVyaXN0aWM7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlQ2hhcmFjdGVyaXN0aWMoVVVJRCB1aWQsIFN0cmluZyB3cml0ZVZhbHVlKSB7DQotICAgICAgICBCbHVldG9vdGhHYXR0Q2hhcmFjdGVyaXN0aWMgY2hhcmFjdGVyaXN0aWMgPSBnZXRDaGFyYWN0ZXJpc3RpYyh1aWQpOw0KLSAgICAgICAgaWYgKGNoYXJhY3RlcmlzdGljICE9IG51bGwpew0KLSAgICAgICAgICAgIGNoYXJhY3RlcmlzdGljLnNldFZhbHVlKHdyaXRlVmFsdWUpOw0KLSAgICAgICAgICAgIG1CbHVldG9vdGhHYXR0LndyaXRlQ2hhcmFjdGVyaXN0aWMoY2hhcmFjdGVyaXN0aWMpOw0KLSAgICAgICAgfQ0KLSAgICB9DQogDQogICAgIHByaXZhdGUgdm9pZCBzbGVlcChpbnQgbWlsbGlzKSB7DQogICAgICAgICB0cnkgew0KQEAgLTM3MiwxOSArMjM4LDU2IEBACiAgICAgICAgICAgICBpZiAoREVCVUcpew0KICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvblNlcnZpY2VEaXNjb3ZlcmVkIik7DQogICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmICgoc3RhdHVzID09IEJsdWV0b290aEdhdHQuR0FUVF9TVUNDRVNTKSAmJiAobUJsdWV0b290aEdhdHQuZ2V0U2VydmljZShTRVJWSUNFX1VVSUQpICE9IG51bGwpKSB7DQorICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBCbHVldG9vdGhHYXR0LkdBVFRfU1VDQ0VTUykgew0KICAgICAgICAgICAgICAgICBzaG93TWVzc2FnZSgiU2VydmljZSBkaXNjb3ZlcmVkIik7DQogICAgICAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEFDVElPTl9DT05ORUNUSU9OX1NFUlZJQ0VTX0RJU0NPVkVSRUQpOw0KICAgICAgICAgICAgICAgICBzZW5kQnJvYWRjYXN0KGludGVudCk7DQogICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KIA0KLSAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNoYXJhY3RlcmlzdGljV3JpdGUoQmx1ZXRvb3RoR2F0dCBnYXR0LCBCbHVldG9vdGhHYXR0Q2hhcmFjdGVyaXN0aWMgY2hhcmFjdGVyaXN0aWMsIGludCBzdGF0dXMpIHsNCi0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBjaGFyYWN0ZXJpc3RpYy5nZXRTdHJpbmdWYWx1ZSgwKTsNCi0gICAgICAgICAgICBVVUlEIHVpZCA9IGNoYXJhY3RlcmlzdGljLmdldFV1aWQoKTsNCi0gICAgICAgICAgICBpZiAoREVCVUcpIHsNCi0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25DaGFyYWN0ZXJpc3RpY1dyaXRlOiBjaGFyYWN0ZXJpc3RpYy52YWw9IiArIHZhbHVlICsgIiBzdGF0dXM9IiArIHN0YXR1cyArICIgdWlkPSIgKyB1aWQpOw0KKyAgICAgICAgICAgIC8vb25Db25uZWN0aW9uVXBkYXRlZCBpcyBoaWRkZW4gY2FsbGJhY2ssIGNhbid0IGJlIG1hcmtlZCBhcyBAT3ZlcnJpZGUuDQorICAgICAgICAgICAgLy8gV2UgbXVzdCBoYXZlIGEgY2FsbCB0byBpdCwgb3RoZXJ3aXNlIGNvbXBpbGVyIHdpbGwgZGVsZXRlIGl0IGR1cmluZyBvcHRpbWl6YXRpb24uDQorICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSAweEZGRUZGRUUpIHsNCisgICAgICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgZXhlY3V0ZSwgYnV0IHdpbGwgbWFrZSBjb21waWxlciBub3QgcmVtb3ZlIG9uQ29ubmVjdGlvblVwZGF0ZWQgDQorICAgICAgICAgICAgICAgIG9uQ29ubmVjdGlvblVwZGF0ZWQobnVsbCwgMCwgMCwgMCwgMCk7DQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiEiKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorIA0KKyAgICAgICAgLy8gQE92ZXJyaWRlIHVuY29tbWVudCBvbmNlIHRoaXMgYmVjb21lcyBwdWJsaWMgQVBJDQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbm5lY3Rpb25VcGRhdGVkKEJsdWV0b290aEdhdHQgZ2F0dCwgaW50IGludGVydmFsLCBpbnQgbGF0ZW5jeSwgaW50IHRpbWVvdXQsDQorICAgICAgICAgICAgaW50IHN0YXR1cykgew0KKyAgICAgICAgICAgIGlmIChtUHJpb3JpdHkgPT0gTk9UX1VOREVSX1RFU1QpIHJldHVybjsNCisNCisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IDApIHsNCisgICAgICAgICAgICAgICAgc2hvd01lc3NhZ2UoIm9uQ29ubmVjdGlvblVwZGF0ZWQoKSBlcnJvciwgc3RhdHVzPSIgKyBzdGF0dXMgKTsNCisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAib25Db25uZWN0aW9uVXBkYXRlZCgpIHN0YXR1cz0iICsgc3RhdHVzKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBMb2cuaShUQUcsICJvbkNvbm5lY3Rpb25VcGRhdGVkKCkgc3RhdHVzPSIgKyBzdGF0dXMgKyAiLCBpbnRlcnZhbD0iICsgaW50ZXJ2YWwpOw0KKyAgICAgICAgICAgIGlmIChtUHJpb3JpdHkgPT0gQmx1ZXRvb3RoR2F0dC5DT05ORUNUSU9OX1BSSU9SSVRZX0xPV19QT1dFUikgew0KKyAgICAgICAgICAgICAgICBpbnRlcnZhbF9sb3cgPSBpbnRlcnZhbDsNCisgICAgICAgICAgICAgICAgbXlSZXF1ZXN0Q29ubmVjdGlvblByaW9yaXR5KEJsdWV0b290aEdhdHQuQ09OTkVDVElPTl9QUklPUklUWV9CQUxBTkNFRCk7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChtUHJpb3JpdHkgPT0gQmx1ZXRvb3RoR2F0dC5DT05ORUNUSU9OX1BSSU9SSVRZX0JBTEFOQ0VEKSB7DQorICAgICAgICAgICAgICAgIGludGVydmFsX2JhbGFuY2VkID0gaW50ZXJ2YWw7DQorICAgICAgICAgICAgICAgIG15UmVxdWVzdENvbm5lY3Rpb25Qcmlvcml0eShCbHVldG9vdGhHYXR0LkNPTk5FQ1RJT05fUFJJT1JJVFlfSElHSCk7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChtUHJpb3JpdHkgPT0gQmx1ZXRvb3RoR2F0dC5DT05ORUNUSU9OX1BSSU9SSVRZX0hJR0gpIHsNCisgICAgICAgICAgICAgICAgaW50ZXJ2YWxfaGlnaCA9IGludGVydmFsOw0KKw0KKyAgICAgICAgICAgICAgICBpZiAoaW50ZXJ2YWxfbG93IDwgaW50ZXJ2YWxfYmFsYW5jZWQgfHwgaW50ZXJ2YWxfYmFsYW5jZWQgPCBpbnRlcnZhbF9oaWdoKSB7DQorICAgICAgICAgICAgICAgICAgIHNob3dNZXNzYWdlKCJpbnRlcnZhbCB2YWx1ZSBzaG91bGQgYmUgZGVzY2VuZGluZyAtIGZhaWx1cmUhIik7DQorICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgImludGVydmFsIHZhbHVlcyBzaG91bGQgYmUgZGVzY2VuZGluZzogaW50ZXJ2YWxfbG93PSIgKyBpbnRlcnZhbF9sb3cgKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBpbnRlcnZhbF9iYWxhbmNlZD0iICsgaW50ZXJ2YWxfYmFsYW5jZWQgKyAiLCBpbnRlcnZhbF9oaWdoPSIgKyBpbnRlcnZhbF9oaWdoKTsNCisgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgIHNob3dNZXNzYWdlKCJpbnRlcnZhbHM6ICIgKyBpbnRlcnZhbF9sb3cgKyIgPiAiICsgaW50ZXJ2YWxfYmFsYW5jZWQgKyAiID4gIiArIGludGVydmFsX2hpZ2gpOw0KKyAgICAgICAgIA0KKyAgICAgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOw0KKyAgICAgICAgICAgICAgICBpbnRlbnQuc2V0QWN0aW9uKEFDVElPTl9DT05ORUNUSU9OX1BSSU9SSVRZX0ZJTklTSCk7DQorICAgICAgICAgICAgICAgIHNlbmRCcm9hZGNhc3QoaW50ZW50KTsNCisgICAgICAgIA0KKyAgICAgICAgICAgICAgICBtUHJpb3JpdHkgPSBOT1RfVU5ERVJfVEVTVDsNCiAgICAgICAgICAgICB9DQogICAgICAgICB9DQogICAgIH07DQpkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL2JsdWV0b290aC9CbGVDb25uZWN0aW9uUHJpb3JpdHlTZXJ2ZXJCYXNlQWN0aXZpdHkuamF2YSBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9ibHVldG9vdGgvQmxlQ29ubmVjdGlvblByaW9yaXR5U2VydmVyQmFzZUFjdGl2aXR5LmphdmEKaW5kZXggYzBhMmYwOS4uNjZlMDY4ZSAxMDA2NDQKLS0tIGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL2JsdWV0b290aC9CbGVDb25uZWN0aW9uUHJpb3JpdHlTZXJ2ZXJCYXNlQWN0aXZpdHkuamF2YQorKysgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvYmx1ZXRvb3RoL0JsZUNvbm5lY3Rpb25Qcmlvcml0eVNlcnZlckJhc2VBY3Rpdml0eS5qYXZhCkBAIC0zNywxMiArMzcsNiBAQAogcHVibGljIGNsYXNzIEJsZUNvbm5lY3Rpb25Qcmlvcml0eVNlcnZlckJhc2VBY3Rpdml0eSBleHRlbmRzIFBhc3NGYWlsQnV0dG9ucy5BY3Rpdml0eSB7DQogDQogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RJT05fUFJJT1JJVFlfSElHSCA9IDA7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RJT05fUFJJT1JJVFlfQkFMQU5DRUQgPSAxOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ORUNUSU9OX1BSSU9SSVRZX0xPV19QT1dFUiA9IDI7DQotDQotICAgIHByaXZhdGUgbG9uZyBtQXZlcmFnZUJhbGFuY2VkID0gLTE7DQotICAgIHByaXZhdGUgbG9uZyBtQXZlcmFnZUhpZ2ggPSAtMTsNCi0gICAgcHJpdmF0ZSBsb25nIG1BdmVyYWdlTG93ID0gLTE7DQogDQogICAgIHByaXZhdGUgVGVzdEFkYXB0ZXIgbVRlc3RBZGFwdGVyOw0KIA0KQEAgLTcxLDEwICs2NSw3IEBACiANCiAgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7DQogICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEJsZUNvbm5lY3Rpb25Qcmlvcml0eVNlcnZlclNlcnZpY2UuQUNUSU9OX0JMVUVUT09USF9ESVNBQkxFRCk7DQotICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEJsZUNvbm5lY3Rpb25Qcmlvcml0eVNlcnZlclNlcnZpY2UuQUNUSU9OX0NPTk5FQ1RJT05fV1JJVEVfUkVRVUVTVCk7DQotICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEJsZUNvbm5lY3Rpb25Qcmlvcml0eVNlcnZlclNlcnZpY2UuQUNUSU9OX0ZJTklDSF9DT05ORUNUSU9OX1BSSU9SSVRZX0hJR0hUKTsNCi0gICAgICAgIGZpbHRlci5hZGRBY3Rpb24oQmxlQ29ubmVjdGlvblByaW9yaXR5U2VydmVyU2VydmljZS5BQ1RJT05fRklOSUNIX0NPTk5FQ1RJT05fUFJJT1JJVFlfQkFMQU5DRUQpOw0KLSAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihCbGVDb25uZWN0aW9uUHJpb3JpdHlTZXJ2ZXJTZXJ2aWNlLkFDVElPTl9GSU5JQ0hfQ09OTkVDVElPTl9QUklPUklUWV9MT1cpOw0KKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihCbGVDb25uZWN0aW9uUHJpb3JpdHlTZXJ2ZXJTZXJ2aWNlLkFDVElPTl9DT05ORUNUSU9OX1BSSU9SSVRZX0ZJTklTSCk7DQogICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEJsZVNlcnZlclNlcnZpY2UuQkxFX0FEVkVSVElTRV9VTlNVUFBPUlRFRCk7DQogICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEJsZVNlcnZlclNlcnZpY2UuQkxFX09QRU5fRkFJTCk7DQogICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEJsZUNvbm5lY3Rpb25Qcmlvcml0eVNlcnZlclNlcnZpY2UuQUNUSU9OX1NUQVJUX0NPTk5FQ1RJT05fUFJJT1JJVFlfVEVTVCk7DQpAQCAtOTAsOSArODEsNyBAQAogDQogICAgIHByaXZhdGUgTGlzdDxJbnRlZ2VyPiBzZXR1cFRlc3RMaXN0KCkgew0KICAgICAgICAgQXJyYXlMaXN0PEludGVnZXI+IHRlc3RMaXN0ID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOw0KLSAgICAgICAgdGVzdExpc3QuYWRkKFIuc3RyaW5nLmJsZV9jb25uZWN0aW9uX3ByaW9yaXR5X2NsaWVudF9oaWdoKTsNCi0gICAgICAgIHRlc3RMaXN0LmFkZChSLnN0cmluZy5ibGVfY29ubmVjdGlvbl9wcmlvcml0eV9jbGllbnRfYmFsYW5jZWQpOw0KLSAgICAgICAgdGVzdExpc3QuYWRkKFIuc3RyaW5nLmJsZV9jb25uZWN0aW9uX3ByaW9yaXR5X2NsaWVudF9sb3cpOw0KKyAgICAgICAgdGVzdExpc3QuYWRkKFIuc3RyaW5nLmJsZV9jb25uZWN0aW9uX3ByaW9yaXR5X2NsaWVudF9kZXNjcmlwdGlvbik7DQogICAgICAgICByZXR1cm4gdGVzdExpc3Q7DQogICAgIH0NCiANCkBAIC0xMzAsOCArMTE5LDggQEAKICAgICBwcml2YXRlIEJyb2FkY2FzdFJlY2VpdmVyIG1Ccm9hZGNhc3QgPSBuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7DQogICAgICAgICBAT3ZlcnJpZGUNCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsNCisgICAgICAgICAgICBib29sZWFuIHBhc3NlZEFsbCA9IGZhbHNlOw0KICAgICAgICAgICAgIFN0cmluZyBhY3Rpb24gPSBpbnRlbnQuZ2V0QWN0aW9uKCk7DQotICAgICAgICAgICAgbG9uZyBhdmVyYWdlID0gaW50ZW50LmdldExvbmdFeHRyYShCbGVDb25uZWN0aW9uUHJpb3JpdHlTZXJ2ZXJTZXJ2aWNlLkVYVFJBX0FWRVJBR0UsIC0xKTsNCiAgICAgICAgICAgICBzd2l0Y2ggKGFjdGlvbikgew0KICAgICAgICAgICAgIGNhc2UgQmxlQ29ubmVjdGlvblByaW9yaXR5U2VydmVyU2VydmljZS5BQ1RJT05fQkxVRVRPT1RIX0RJU0FCTEVEOg0KICAgICAgICAgICAgICAgICBuZXcgQWxlcnREaWFsb2cuQnVpbGRlcihjb250ZXh0KQ0KQEAgLTE0OCw2NCArMTM3LDEyIEBACiAgICAgICAgICAgICBjYXNlIEJsZUNvbm5lY3Rpb25Qcmlvcml0eVNlcnZlclNlcnZpY2UuQUNUSU9OX1NUQVJUX0NPTk5FQ1RJT05fUFJJT1JJVFlfVEVTVDoNCiAgICAgICAgICAgICAgICAgc2hvd1Byb2dyZXNzRGlhbG9nKCk7DQogICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgQmxlQ29ubmVjdGlvblByaW9yaXR5U2VydmVyU2VydmljZS5BQ1RJT05fRklOSUNIX0NPTk5FQ1RJT05fUFJJT1JJVFlfSElHSFQ6DQotICAgICAgICAgICAgICAgIG1BdmVyYWdlSGlnaCA9IGF2ZXJhZ2U7DQotICAgICAgICAgICAgICAgIG1BdmVyYWdlQmFsYW5jZWQgPSAtMTsNCi0gICAgICAgICAgICAgICAgbUF2ZXJhZ2VMb3cgPSAtMTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBCbGVDb25uZWN0aW9uUHJpb3JpdHlTZXJ2ZXJTZXJ2aWNlLkFDVElPTl9GSU5JQ0hfQ09OTkVDVElPTl9QUklPUklUWV9CQUxBTkNFRDoNCi0gICAgICAgICAgICAgICAgbUF2ZXJhZ2VCYWxhbmNlZCA9IGF2ZXJhZ2U7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgQmxlQ29ubmVjdGlvblByaW9yaXR5U2VydmVyU2VydmljZS5BQ1RJT05fRklOSUNIX0NPTk5FQ1RJT05fUFJJT1JJVFlfTE9XOg0KLSAgICAgICAgICAgICAgICBtQXZlcmFnZUxvdyA9IGF2ZXJhZ2U7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgQmxlU2VydmVyU2VydmljZS5CTEVfT1BFTl9GQUlMOg0KLSAgICAgICAgICAgICAgICBzZXRUZXN0UmVzdWx0QW5kRmluaXNoKGZhbHNlKTsNCi0gICAgICAgICAgICAgICAgcnVuT25VaVRocmVhZChuZXcgUnVubmFibGUoKSB7DQotICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBUb2FzdC5tYWtlVGV4dChCbGVDb25uZWN0aW9uUHJpb3JpdHlTZXJ2ZXJCYXNlQWN0aXZpdHkudGhpcywgUi5zdHJpbmcuYnRfb3Blbl9mYWlsZWRfbWVzc2FnZSwgVG9hc3QuTEVOR1RIX1NIT1JUKS5zaG93KCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0pOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEJsZVNlcnZlclNlcnZpY2UuQkxFX0FEVkVSVElTRV9VTlNVUFBPUlRFRDoNCi0gICAgICAgICAgICAgICAgc2hvd0Vycm9yRGlhbG9nKFIuc3RyaW5nLmJ0X2FkdmVydGlzZV91bnN1cHBvcnRlZF90aXRsZSwgUi5zdHJpbmcuYnRfYWR2ZXJ0aXNlX3Vuc3VwcG9ydGVkX21lc3NhZ2UsIHRydWUpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgYm9vbGVhbiBwYXNzZWRIaWdoID0gKG1BdmVyYWdlSGlnaCA+PSAwKTsNCi0gICAgICAgICAgICBib29sZWFuIHBhc3NlZEFsbCA9IGZhbHNlOw0KLQ0KLSAgICAgICAgICAgIGlmIChwYXNzZWRIaWdoKSB7DQotICAgICAgICAgICAgICAgIG1UZXN0QWRhcHRlci5zZXRUZXN0UGFzcyhDT05ORUNUSU9OX1BSSU9SSVRZX0hJR0gpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAocGFzc2VkSGlnaCAmJiAobUF2ZXJhZ2VMb3cgPj0gMCkgJiYgKG1BdmVyYWdlQmFsYW5jZWQgPj0gMCkpIHsNCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBwYXNzZWRCYWxhbmNlZCA9IChtQXZlcmFnZUhpZ2ggPD0gbUF2ZXJhZ2VCYWxhbmNlZCk7DQotICAgICAgICAgICAgICAgIGJvb2xlYW4gcGFzc2VkTG93ID0gKG1BdmVyYWdlQmFsYW5jZWQgPD0gbUF2ZXJhZ2VMb3cpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiAocGFzc2VkQmFsYW5jZWQpIHsNCi0gICAgICAgICAgICAgICAgICAgIG1UZXN0QWRhcHRlci5zZXRUZXN0UGFzcyhDT05ORUNUSU9OX1BSSU9SSVRZX0JBTEFOQ0VEKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpZiAocGFzc2VkTG93KSB7DQotICAgICAgICAgICAgICAgICAgICBtVGVzdEFkYXB0ZXIuc2V0VGVzdFBhc3MoQ09OTkVDVElPTl9QUklPUklUWV9MT1dfUE9XRVIpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIFN0cmluZyByZXN1bHRNc2c7DQotICAgICAgICAgICAgICAgIGlmIChwYXNzZWRCYWxhbmNlZCAmJiBwYXNzZWRMb3cpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdE1zZyA9IGdldFN0cmluZyhSLnN0cmluZy5ibGVfc2VydmVyX2Nvbm5lY3Rpb25fcHJpb3JpdHlfcmVzdWx0X3Bhc3NlZCk7DQotICAgICAgICAgICAgICAgICAgICBwYXNzZWRBbGwgPSB0cnVlOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRldGFpbHNNc2cgPSBTdHJpbmcuZm9ybWF0KGdldFN0cmluZyhSLnN0cmluZy5ibGVfc2VydmVyX2Nvbm5lY3Rpb25fcHJpb3JpdHlfcmVzdWx0X2ludGVydmFscyksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdmVyYWdlSGlnaCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF2ZXJhZ2VCYWxhbmNlZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF2ZXJhZ2VMb3cpOw0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0TXNnID0gZ2V0U3RyaW5nKFIuc3RyaW5nLmJsZV9zZXJ2ZXJfY29ubmVjdGlvbl9wcmlvcml0eV9yZXN1bHRfZmFpbGVkKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJcblxuIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGRldGFpbHNNc2c7DQotICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIEJsZUNvbm5lY3Rpb25Qcmlvcml0eVNlcnZlclNlcnZpY2UuQUNUSU9OX0NPTk5FQ1RJT05fUFJJT1JJVFlfRklOSVNIOg0KKyAgICAgICAgICAgICAgICBTdHJpbmcgcmVzdWx0TXNnID0gZ2V0U3RyaW5nKFIuc3RyaW5nLmJsZV9zZXJ2ZXJfY29ubmVjdGlvbl9wcmlvcml0eV9yZXN1bHRfcGFzc2VkKTsNCiANCiAgICAgICAgICAgICAgICAgY2xvc2VEaWFsb2coKTsNCisNCisgICAgICAgICAgICAgICAgbVRlc3RBZGFwdGVyLnNldFRlc3RQYXNzKENPTk5FQ1RJT05fUFJJT1JJVFlfSElHSCk7DQogICAgICAgICAgICAgICAgIG1EaWFsb2cgPSBuZXcgQWxlcnREaWFsb2cuQnVpbGRlcihCbGVDb25uZWN0aW9uUHJpb3JpdHlTZXJ2ZXJCYXNlQWN0aXZpdHkudGhpcykNCiAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0TWVzc2FnZShyZXN1bHRNc2cpDQogICAgICAgICAgICAgICAgICAgICAgICAgLnNldFBvc2l0aXZlQnV0dG9uKGFuZHJvaWQuUi5zdHJpbmcub2ssIG5ldyBEaWFsb2dJbnRlcmZhY2UuT25DbGlja0xpc3RlbmVyKCkgew0KQEAgLTIyMiwxMCArMTU5LDI1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGUoKTsNCiAgICAgICAgICAgICAgICAgbURpYWxvZy5zaG93KCk7DQorDQorICAgICAgICAgICAgICAgIGdldFBhc3NCdXR0b24oKS5zZXRFbmFibGVkKHRydWUpOw0KKyAgICAgICAgICAgICAgICBtVGVzdEFkYXB0ZXIubm90aWZ5RGF0YVNldENoYW5nZWQoKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICAgICAgY2FzZSBCbGVTZXJ2ZXJTZXJ2aWNlLkJMRV9PUEVOX0ZBSUw6DQorICAgICAgICAgICAgICAgIHNldFRlc3RSZXN1bHRBbmRGaW5pc2goZmFsc2UpOw0KKyAgICAgICAgICAgICAgICBydW5PblVpVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsNCisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQ0KKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KEJsZUNvbm5lY3Rpb25Qcmlvcml0eVNlcnZlckJhc2VBY3Rpdml0eS50aGlzLCBSLnN0cmluZy5idF9vcGVuX2ZhaWxlZF9tZXNzYWdlLCBUb2FzdC5MRU5HVEhfU0hPUlQpLnNob3coKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfSk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgQmxlU2VydmVyU2VydmljZS5CTEVfQURWRVJUSVNFX1VOU1VQUE9SVEVEOg0KKyAgICAgICAgICAgICAgICBzaG93RXJyb3JEaWFsb2coUi5zdHJpbmcuYnRfYWR2ZXJ0aXNlX3Vuc3VwcG9ydGVkX3RpdGxlLCBSLnN0cmluZy5idF9hZHZlcnRpc2VfdW5zdXBwb3J0ZWRfbWVzc2FnZSwgdHJ1ZSk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgIH0NCiANCi0gICAgICAgICAgICBnZXRQYXNzQnV0dG9uKCkuc2V0RW5hYmxlZChwYXNzZWRBbGwpOw0KLSAgICAgICAgICAgIG1UZXN0QWRhcHRlci5ub3RpZnlEYXRhU2V0Q2hhbmdlZCgpOw0KICAgICAgICAgfQ0KICAgICB9Ow0KIA0KZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9ibHVldG9vdGgvQmxlQ29ubmVjdGlvblByaW9yaXR5U2VydmVyU2VydmljZS5qYXZhIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL2JsdWV0b290aC9CbGVDb25uZWN0aW9uUHJpb3JpdHlTZXJ2ZXJTZXJ2aWNlLmphdmEKaW5kZXggZTFlNGVlZC4uY2NmZmNkYiAxMDA2NDQKLS0tIGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL2JsdWV0b290aC9CbGVDb25uZWN0aW9uUHJpb3JpdHlTZXJ2ZXJTZXJ2aWNlLmphdmEKKysrIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL2JsdWV0b290aC9CbGVDb25uZWN0aW9uUHJpb3JpdHlTZXJ2ZXJTZXJ2aWNlLmphdmEKQEAgLTQ1LDQzICs0NSwxNiBAQAogcHVibGljIGNsYXNzIEJsZUNvbm5lY3Rpb25Qcmlvcml0eVNlcnZlclNlcnZpY2UgZXh0ZW5kcyBTZXJ2aWNlIHsNCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsNCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkJsZVByaW9yaXR5U2VydmVyIjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU0VUX0NPVU5UX1ZBTFVFID0gIlJFU0VUIjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVJUX1ZBTFVFID0gIlNUQVJUIjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUT1BfVkFMVUUgPSAiU1RPUCI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTk5FQ1RJT05fUFJJT1JJVFlfSElHSCA9ICJQUl9IIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVElPTl9QUklPUklUWV9CQUxBTkNFRCA9ICJQUl9CIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVElPTl9QUklPUklUWV9MT1dfUE9XRVIgPSAiUFJfTCI7DQogDQogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9CTFVFVE9PVEhfRElTQUJMRUQgPQ0KICAgICAgICAgICAgICJjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIuYmx1ZXRvb3RoLmFjdGlvbi5CTFVFVE9PVEhfRElTQUJMRUQiOw0KIA0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fQ09OTkVDVElPTl9XUklURV9SRVFVRVNUID0NCi0gICAgICAgICAgICAiY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLmJsdWV0b290aC5hY3Rpb24uQ09OTkVDVElPTl9XUklURV9SRVFVRVNUIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfUkVRVUVTVF9DT1VOVCA9DQotICAgICAgICAgICAgImNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5ibHVldG9vdGguaW50ZW50LkVYVFJBX1JFUVVFU1RfQ09VTlQiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fRklOSUNIX0NPTk5FQ1RJT05fUFJJT1JJVFlfSElHSFQgPQ0KLSAgICAgICAgICAgICJjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIuYmx1ZXRvb3RoLmFjdGlvbi5BQ1RJT05fRklOSUNIX0NPTk5FQ1RJT05fUFJJT1JJVFlfSElHSFQiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fRklOSUNIX0NPTk5FQ1RJT05fUFJJT1JJVFlfQkFMQU5DRUQgPQ0KLSAgICAgICAgICAgICJjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIuYmx1ZXRvb3RoLmFjdGlvbi5BQ1RJT05fRklOSUNIX0NPTk5FQ1RJT05fUFJJT1JJVFlfQkFMQU5DRUQiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fRklOSUNIX0NPTk5FQ1RJT05fUFJJT1JJVFlfTE9XID0NCi0gICAgICAgICAgICAiY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLmJsdWV0b290aC5hY3Rpb24uQUNUSU9OX0ZJTklDSF9DT05ORUNUSU9OX1BSSU9SSVRZX0xPVyI7DQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9DT05ORUNUSU9OX1BSSU9SSVRZX0ZJTklTSCA9DQorICAgICAgICAgICAgImNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5ibHVldG9vdGguYWN0aW9uLkFDVElPTl9DT05ORUNUSU9OX1BSSU9SSVRZX0ZJTklTSCI7DQogDQogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TVEFSVF9DT05ORUNUSU9OX1BSSU9SSVRZX1RFU1QgPQ0KICAgICAgICAgICAgICJjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIuYmx1ZXRvb3RoLmFjdGlvbi5BQ1RJT05fU1RBUlRfQ09OTkVDVElPTl9QUklPUklUWV9URVNUIjsNCiANCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfQVZFUkFHRSA9DQotICAgICAgICAgICAgImNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5ibHVldG9vdGguaW50ZW50LkVYVFJBX0FWRVJBR0UiOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVVUlEIFNFUlZJQ0VfVVVJRCA9DQotICAgICAgICAgICAgVVVJRC5mcm9tU3RyaW5nKCIwMDAwOTk5OS0wMDAwLTEwMDAtODAwMC0wMDgwNWY5YjM0ZmIiKTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVVJRCBDSEFSQUNURVJJU1RJQ19VVUlEID0NCi0gICAgICAgICAgICBVVUlELmZyb21TdHJpbmcoIjAwMDA5OTk4LTAwMDAtMTAwMC04MDAwLTAwODA1ZjliMzRmYiIpOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVVUlEIFNUQVJUX0NIQVJBQ1RFUklTVElDX1VVSUQgPQ0KLSAgICAgICAgICAgIFVVSUQuZnJvbVN0cmluZygiMDAwMDk5OTctMDAwMC0xMDAwLTgwMDAtMDA4MDVmOWIzNGZiIik7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVVSUQgU1RPUF9DSEFSQUNURVJJU1RJQ19VVUlEID0NCi0gICAgICAgICAgICBVVUlELmZyb21TdHJpbmcoIjAwMDA5OTk1LTAwMDAtMTAwMC04MDAwLTAwODA1ZjliMzRmYiIpOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVVUlEIERFU0NSSVBUT1JfVVVJRCA9DQotICAgICAgICAgICAgVVVJRC5mcm9tU3RyaW5nKCIwMDAwOTk5Ni0wMDAwLTEwMDAtODAwMC0wMDgwNWY5YjM0ZmIiKTsNCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVVUlEIEFEVl9TRVJWSUNFX1VVSUQ9DQogICAgICAgICAgICAgVVVJRC5mcm9tU3RyaW5nKCIwMDAwMjIyMi0wMDAwLTEwMDAtODAwMC0wMDgwNWY5YjM0ZmIiKTsNCiANCkBAIC05Miw4ICs2NSwxMCBAQAogICAgIHByaXZhdGUgSGFuZGxlciBtSGFuZGxlcjsNCiAgICAgcHJpdmF0ZSBCbHVldG9vdGhMZUFkdmVydGlzZXIgbUFkdmVydGlzZXI7DQogICAgIHByaXZhdGUgbG9uZyBtUmVjZWl2ZVdyaXRlQ291bnQ7DQotICAgIHByaXZhdGUgVGltZXIgbVRpbWVvdXRUaW1lcjsNCi0gICAgcHJpdmF0ZSBUaW1lclRhc2sgbVRpbWVvdXRUaW1lclRhc2s7DQorDQorICAgIHByaXZhdGUgaW50IGludGVydmFsX2xvdyA9IDA7DQorICAgIHByaXZhdGUgaW50IGludGVydmFsX2JhbGFuY2VkID0gMDsNCisgICAgcHJpdmF0ZSBpbnQgaW50ZXJ2YWxfaGlnaCA9IDA7DQogDQogICAgIEBPdmVycmlkZQ0KICAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZSgpIHsNCkBAIC0xMDIsMTAgKzc3LDYgQEAKICAgICAgICAgbUJsdWV0b290aE1hbmFnZXIgPSAoQmx1ZXRvb3RoTWFuYWdlcikgZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkJMVUVUT09USF9TRVJWSUNFKTsNCiAgICAgICAgIG1BZHZlcnRpc2VyID0gbUJsdWV0b290aE1hbmFnZXIuZ2V0QWRhcHRlcigpLmdldEJsdWV0b290aExlQWR2ZXJ0aXNlcigpOw0KICAgICAgICAgbUdhdHRTZXJ2ZXIgPSBtQmx1ZXRvb3RoTWFuYWdlci5vcGVuR2F0dFNlcnZlcih0aGlzLCBtQ2FsbGJhY2tzKTsNCi0gICAgICAgIG1TZXJ2aWNlID0gY3JlYXRlU2VydmljZSgpOw0KLSAgICAgICAgaWYgKChtR2F0dFNlcnZlciAhPSBudWxsKSAmJiAobUFkdmVydGlzZXIgIT0gbnVsbCkpIHsNCi0gICAgICAgICAgICBtR2F0dFNlcnZlci5hZGRTZXJ2aWNlKG1TZXJ2aWNlKTsNCi0gICAgICAgIH0NCiAgICAgICAgIG1EZXZpY2UgPSBudWxsOw0KICAgICAgICAgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpOw0KIA0KQEAgLTEyNCwxNCArOTUsNiBAQAogICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveSgpIHsNCiAgICAgICAgIHN1cGVyLm9uRGVzdHJveSgpOw0KIA0KLSAgICAgICAgY2FuY2VsVGltZW91dFRpbWVyKGZhbHNlKTsNCi0NCi0gICAgICAgIGlmIChtVGltZW91dFRpbWVyICE9IG51bGwpIHsNCi0gICAgICAgICAgICBtVGltZW91dFRpbWVyLmNhbmNlbCgpOw0KLSAgICAgICAgICAgIG1UaW1lb3V0VGltZXIgPSBudWxsOw0KLSAgICAgICAgfQ0KLSAgICAgICAgbVRpbWVvdXRUaW1lclRhc2sgPSBudWxsOw0KLQ0KICAgICAgICAgc3RvcEFkdmVydGlzZSgpOw0KICAgICAgICAgaWYgKG1HYXR0U2VydmVyID09IG51bGwpIHsNCiAgICAgICAgICAgICByZXR1cm47DQpAQCAtMTk0LDIxICsxNTcsNiBAQAogICAgICAgICB9DQogICAgIH0NCiANCi0gICAgcHJpdmF0ZSB2b2lkIG5vdGlmeVNlcnZpY2VBZGRlZCgpIHsNCi0gICAgICAgIGlmIChERUJVRykgew0KLSAgICAgICAgICAgIExvZy5kKFRBRywgIm5vdGlmeVNlcnZpY2VBZGRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBub3RpZnlDaGFyYWN0ZXJpc3RpY1dyaXRlUmVxdWVzdCgpIHsNCi0gICAgICAgIGlmIChERUJVRykgew0KLSAgICAgICAgICAgIExvZy5kKFRBRywgIm5vdGlmeUNoYXJhY3RlcmlzdGljV3JpdGVSZXF1ZXN0Iik7DQotICAgICAgICB9DQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChBQ1RJT05fQ09OTkVDVElPTl9XUklURV9SRVFVRVNUKTsNCi0gICAgICAgIGludGVudC5wdXRFeHRyYShFWFRSQV9SRVFVRVNUX0NPVU5ULCBTdHJpbmcudmFsdWVPZihtUmVjZWl2ZVdyaXRlQ291bnQpKTsNCi0gICAgICAgIHNlbmRCcm9hZGNhc3QoaW50ZW50KTsNCi0gICAgfQ0KLQ0KICAgICBwcml2YXRlIHZvaWQgc2hvd01lc3NhZ2UoZmluYWwgU3RyaW5nIG1zZykgew0KICAgICAgICAgbUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7DQogICAgICAgICAgICAgQE92ZXJyaWRlDQpAQCAtMjE4LDM4ICsxNjYsNiBAQAogICAgICAgICB9KTsNCiAgICAgfQ0KIA0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGNhbmNlbFRpbWVvdXRUaW1lcihib29sZWFuIHJ1blRpbWVvdXQpIHsNCi0gICAgICAgIGlmIChtVGltZW91dFRpbWVyVGFzayAhPSBudWxsKSB7DQotICAgICAgICAgICAgbVRpbWVvdXRUaW1lci5jYW5jZWwoKTsNCi0gICAgICAgICAgICBpZiAocnVuVGltZW91dCkgew0KLSAgICAgICAgICAgICAgICBtVGltZW91dFRpbWVyVGFzay5ydW4oKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgbVRpbWVvdXRUaW1lclRhc2sgPSBudWxsOw0KLSAgICAgICAgICAgIG1UaW1lb3V0VGltZXIgPSBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgQmx1ZXRvb3RoR2F0dFNlcnZpY2UgY3JlYXRlU2VydmljZSgpIHsNCi0gICAgICAgIEJsdWV0b290aEdhdHRTZXJ2aWNlIHNlcnZpY2UgPQ0KLSAgICAgICAgICAgICAgICBuZXcgQmx1ZXRvb3RoR2F0dFNlcnZpY2UoU0VSVklDRV9VVUlELCBCbHVldG9vdGhHYXR0U2VydmljZS5TRVJWSUNFX1RZUEVfUFJJTUFSWSk7DQotICAgICAgICAvLyBhZGQgY2hhcmFjdGVyaXN0aWMgdG8gc2VydmljZQ0KLSAgICAgICAgLy8gICBwcm9wZXJ0eTogMHgwQSAocmVhZCwgd3JpdGUpDQotICAgICAgICAvLyAgIHBlcm1pc3Npb246IDB4MTEgKHJlYWQsIHdyaXRlKQ0KLSAgICAgICAgQmx1ZXRvb3RoR2F0dENoYXJhY3RlcmlzdGljIGNoYXJhY3RlcmlzdGljID0NCi0gICAgICAgICAgICAgICAgbmV3IEJsdWV0b290aEdhdHRDaGFyYWN0ZXJpc3RpYyhDSEFSQUNURVJJU1RJQ19VVUlELCAweDBBLCAweDExKTsNCi0gICAgICAgIEJsdWV0b290aEdhdHREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQmx1ZXRvb3RoR2F0dERlc2NyaXB0b3IoREVTQ1JJUFRPUl9VVUlELCAweDExKTsNCi0gICAgICAgIGNoYXJhY3RlcmlzdGljLmFkZERlc2NyaXB0b3IoZGVzY3JpcHRvcik7DQotICAgICAgICBzZXJ2aWNlLmFkZENoYXJhY3RlcmlzdGljKGNoYXJhY3RlcmlzdGljKTsNCi0gICAgICAgIGNoYXJhY3RlcmlzdGljID0gbmV3IEJsdWV0b290aEdhdHRDaGFyYWN0ZXJpc3RpYyhTVEFSVF9DSEFSQUNURVJJU1RJQ19VVUlELCAweDBBLCAweDExKTsNCi0gICAgICAgIGNoYXJhY3RlcmlzdGljLmFkZERlc2NyaXB0b3IoZGVzY3JpcHRvcik7DQotICAgICAgICBzZXJ2aWNlLmFkZENoYXJhY3RlcmlzdGljKGNoYXJhY3RlcmlzdGljKTsNCi0gICAgICAgIGNoYXJhY3RlcmlzdGljID0gbmV3IEJsdWV0b290aEdhdHRDaGFyYWN0ZXJpc3RpYyhTVE9QX0NIQVJBQ1RFUklTVElDX1VVSUQsIDB4MEEsIDB4MTEpOw0KLSAgICAgICAgY2hhcmFjdGVyaXN0aWMuYWRkRGVzY3JpcHRvcihkZXNjcmlwdG9yKTsNCi0gICAgICAgIHNlcnZpY2UuYWRkQ2hhcmFjdGVyaXN0aWMoY2hhcmFjdGVyaXN0aWMpOw0KLQ0KLSAgICAgICAgcmV0dXJuIHNlcnZpY2U7DQotICAgIH0NCi0NCiAgICAgcHJpdmF0ZSBmaW5hbCBCbHVldG9vdGhHYXR0U2VydmVyQ2FsbGJhY2sgbUNhbGxiYWNrcyA9IG5ldyBCbHVldG9vdGhHYXR0U2VydmVyQ2FsbGJhY2soKSB7DQogICAgICAgICBAT3ZlcnJpZGUNCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlKEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBzdGF0dXMsIGludCBuZXdTdGF0ZSkgew0KQEAgLTI2MSwxMjAgKzE3Nyw1MCBAQAogICAgICAgICAgICAgICAgICAgICBtRGV2aWNlID0gZGV2aWNlOw0KICAgICAgICAgICAgICAgICAgICAgbm90aWZ5Q29ubmVjdGVkKCk7DQogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVEVEKSB7DQotICAgICAgICAgICAgICAgICAgICBjYW5jZWxUaW1lb3V0VGltZXIodHJ1ZSk7DQogICAgICAgICAgICAgICAgICAgICBub3RpZnlEaXNjb25uZWN0ZWQoKTsNCiAgICAgICAgICAgICAgICAgICAgIG1EZXZpY2UgPSBudWxsOw0KICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIC8vb25Db25uZWN0aW9uVXBkYXRlZCBpcyBoaWRkZW4gY2FsbGJhY2ssIGNhbid0IGJlIG1hcmtlZCBhcyBAT3ZlcnJpZGUuDQorICAgICAgICAgICAgLy8gV2UgbXVzdCBoYXZlIGEgY2FsbCB0byBpdCwgb3RoZXJ3aXNlIGNvbXBpbGVyIHdpbGwgZGVsZXRlIGl0IGR1cmluZyBvcHRpbWl6YXRpb24uDQorICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSAweEZGRUZGRUUpIHsNCisgICAgICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgZXhlY3V0ZSwgYnV0IHdpbGwgbWFrZSBjb21waWxlciBub3QgcmVtb3ZlIG9uQ29ubmVjdGlvblVwZGF0ZWQgDQorICAgICAgICAgICAgICAgIG9uQ29ubmVjdGlvblVwZGF0ZWQobnVsbCwgMCwgMCwgMCwgMCk7DQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiEiKTsNCisgICAgICAgICAgICB9DQorDQogICAgICAgICB9DQogDQotICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZUFkZGVkKGludCBzdGF0dXMsIEJsdWV0b290aEdhdHRTZXJ2aWNlIHNlcnZpY2UpIHsNCi0gICAgICAgICAgICBpZiAoREVCVUcpIHsNCi0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25TZXJ2aWNlQWRkZWQoKSIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoc3RhdHVzID09IEJsdWV0b290aEdhdHQuR0FUVF9TVUNDRVNTKSB7DQotICAgICAgICAgICAgICAgIG5vdGlmeVNlcnZpY2VBZGRlZCgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCisgICAgICAgIC8vIEBPdmVycmlkZSB1bmNvbW1lbnQgb25jZSB0aGlzIGJlY29tZXMgcHVibGljIEFQSQ0KKyAgICAgICAgcHVibGljIHZvaWQgb25Db25uZWN0aW9uVXBkYXRlZChCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgaW50ZXJ2YWwsIGludCBsYXRlbmN5LCBpbnQgdGltZW91dCwgaW50IHN0YXR1cykgew0KKyAgICAgICAgICAgIExvZy5pKFRBRywgIm9uQ29ubmVjdGlvblVwZGF0ZWQoKSBzdGF0dXM9IiArIHN0YXR1cyArICIsIGludGVydmFsPSIgKyBpbnRlcnZhbCk7DQogDQotICAgICAgICBTdHJpbmcgbVByaW9yaXR5ID0gbnVsbDsNCi0NCi0gICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgcHVibGljIHZvaWQgb25DaGFyYWN0ZXJpc3RpY1dyaXRlUmVxdWVzdChCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgcmVxdWVzdElkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhHYXR0Q2hhcmFjdGVyaXN0aWMgY2hhcmFjdGVyaXN0aWMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcHJlcGFyZWRXcml0ZSwgYm9vbGVhbiByZXNwb25zZU5lZWRlZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCwgYnl0ZVtdIHZhbHVlKSB7DQotICAgICAgICAgICAgaWYgKG1HYXR0U2VydmVyID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7DQotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJHYXR0U2VydmVyIGlzIG51bGwsIHJldHVybiIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKERFQlVHKSB7DQotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm9uQ2hhcmFjdGVyaXN0aWNXcml0ZVJlcXVlc3Q6IHByZXBhcmVkV3JpdGU9IiArIHByZXBhcmVkV3JpdGUpOw0KKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gMCkgew0KKyAgICAgICAgICAgICAgIGludGVydmFsX2xvdyA9IGludGVydmFsX2JhbGFuY2VkID0gaW50ZXJ2YWxfaGlnaCA9IDA7DQorICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgIH0NCiANCi0gICAgICAgICAgICBpZiAoY2hhcmFjdGVyaXN0aWMuZ2V0VXVpZCgpLmVxdWFscyhTVEFSVF9DSEFSQUNURVJJU1RJQ19VVUlEKSkgew0KLSAgICAgICAgICAgICAgICAvLyB0aW1lIG91dCBpZiBwcmV2aW91cyBtZWFzdXJlbWVudCBpcyBydW5uaW5nDQotICAgICAgICAgICAgICAgIGNhbmNlbFRpbWVvdXRUaW1lcih0cnVlKTsNCisgICAgICAgICAgICAvLyBzaW5jZSB3ZSBkb24ndCBrbm93IHdoZW4gdGhlIHRlc3Qgc3RhcnRlZCwgd2FpdCBmb3IgdGhyZWUgZGVzY2VuZGluZyBpbnRlcnZhbCB2YWx1ZXMuDQorICAgICAgICAgICAgLy8gRXZlbiB0aG91Z2ggY29ubmVjaXRvbiBpcyB1cGRhdGVkIGJ5IHNlcnZpY2UgZGlzY292ZXJ5LCBpdCBuZXZlciBoYXBwZW4gdGhyZWUgdGltZXMNCisgICAgICAgICAgICAvLyBkZXNjZW5kaW5nIGluIGFueSBzY2VuYXJpby4gDQogDQotICAgICAgICAgICAgICAgIG1Qcmlvcml0eSA9IG5ldyBTdHJpbmcodmFsdWUpOw0KLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJTdGFydCBDb3VudCBVcC4gUHJpb3JpdHkgaXMgIiArIG1Qcmlvcml0eSk7DQotICAgICAgICAgICAgICAgIGlmIChCbGVDb25uZWN0aW9uUHJpb3JpdHlTZXJ2ZXJTZXJ2aWNlLkNPTk5FQ1RJT05fUFJJT1JJVFlfSElHSC5lcXVhbHMobVByaW9yaXR5KSkgew0KLSAgICAgICAgICAgICAgICAgICAgbm90aWZ5VGVzdFN0YXJ0KCk7DQotICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAvLyBzaGlmdCBhbGwgdmFsdWVzDQorICAgICAgICAgICAgaW50ZXJ2YWxfbG93ID0gaW50ZXJ2YWxfYmFsYW5jZWQ7DQorICAgICAgICAgICAgaW50ZXJ2YWxfYmFsYW5jZWQgPSBpbnRlcnZhbF9oaWdoOw0KKyAgICAgICAgICAgIGludGVydmFsX2hpZ2ggPSBpbnRlcnZhbDsNCiANCi0gICAgICAgICAgICAgICAgLy8gc3RhcnQgdGltZW91dCB0aW1lcg0KLSAgICAgICAgICAgICAgICBtVGltZW91dFRpbWVyID0gbmV3IFRpbWVyKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIl9UaW1lb3V0VGltZXIiKTsNCi0gICAgICAgICAgICAgICAgbVRpbWVvdXRUaW1lclRhc2sgPSBuZXcgVGltZXJUYXNrKCkgew0KLSAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVhc3VyZW1lbnQgdGltZWQgb3V0DQotICAgICAgICAgICAgICAgICAgICAgICAgbVRpbWVvdXRUaW1lclRhc2sgPSBudWxsOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1UaW1lb3V0VGltZXIgPSBudWxsOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1SZWNlaXZlV3JpdGVDb3VudCA9IDA7DQotICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TWVhc3VyZW1lbnRGaW5pc2hlZChtUHJpb3JpdHksIExvbmcuTUFYX1ZBTFVFKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfTsNCi0gICAgICAgICAgICAgICAgbVRpbWVvdXRUaW1lci5zY2hlZHVsZShtVGltZW91dFRpbWVyVGFzaywgKEJsZUNvbm5lY3Rpb25Qcmlvcml0eUNsaWVudFNlcnZpY2UuREVGQVVMVF9QRVJJT0QgKiAyKSk7DQotDQotICAgICAgICAgICAgICAgIG1SZWNlaXZlV3JpdGVDb3VudCA9IDA7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChjaGFyYWN0ZXJpc3RpYy5nZXRVdWlkKCkuZXF1YWxzKFNUT1BfQ0hBUkFDVEVSSVNUSUNfVVVJRCkpIHsNCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBpc1J1bm5pbmcgPSAobVRpbWVvdXRUaW1lclRhc2sgIT0gbnVsbCk7DQotICAgICAgICAgICAgICAgIGNhbmNlbFRpbWVvdXRUaW1lcihmYWxzZSk7DQotDQotICAgICAgICAgICAgICAgIFN0cmluZyB2YWxlU3RyID0gbmV3IFN0cmluZyh2YWx1ZSk7DQotICAgICAgICAgICAgICAgIFN0cmluZyBwcmlvcml0eSA9IG51bGw7DQotICAgICAgICAgICAgICAgIGludCB3cml0ZUNvdW50ID0gLTE7DQotICAgICAgICAgICAgICAgIGludCBzZXAgPSB2YWxlU3RyLmluZGV4T2YoIiwiKTsNCi0gICAgICAgICAgICAgICAgaWYgKHNlcCA+IDApIHsNCi0gICAgICAgICAgICAgICAgICAgIHByaW9yaXR5ID0gdmFsZVN0ci5zdWJzdHJpbmcoMCwgc2VwKTsNCi0gICAgICAgICAgICAgICAgICAgIHdyaXRlQ291bnQgPSBJbnRlZ2VyLnZhbHVlT2YodmFsZVN0ci5zdWJzdHJpbmcoc2VwICsgMSkpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmICgobVByaW9yaXR5ICE9IG51bGwpICYmIGlzUnVubmluZykgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1Qcmlvcml0eS5lcXVhbHMocHJpb3JpdHkpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBhdmVyYWdlVGltZSA9IEJsZUNvbm5lY3Rpb25Qcmlvcml0eUNsaWVudFNlcnZpY2UuREVGQVVMVF9QRVJJT0QgLyBtUmVjZWl2ZVdyaXRlQ291bnQ7DQotICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TWVhc3VyZW1lbnRGaW5pc2hlZChtUHJpb3JpdHksIGF2ZXJhZ2VUaW1lKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSZWNlaXZlZCAiICsgbVJlY2VpdmVXcml0ZUNvdW50ICsgIiBvZiAiICsgd3JpdGVDb3VudCArICIgbWVzc2FnZXMiKTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQ29ubmVjdGlvbiBwcmlvcml0eSBkb2VzIG5vdCBtYXRjaCIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNob3dNZXNzYWdlKCJDb25uZWN0aW9uIHByaW9yaXR5IGRvZXMgbm90IG1hdGNoIik7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJOb3QgU3RhcnQgQ291bnQgVVAuIik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgbVJlY2VpdmVXcml0ZUNvdW50ID0gMDsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBpZiAobVRpbWVvdXRUaW1lclRhc2sgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgKyttUmVjZWl2ZVdyaXRlQ291bnQ7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYgKCFwcmVwYXJlZFdyaXRlKSB7DQotICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJpc3RpYy5zZXRWYWx1ZSh2YWx1ZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYgKHJlc3BvbnNlTmVlZGVkKSB7DQotICAgICAgICAgICAgICAgIG1HYXR0U2VydmVyLnNlbmRSZXNwb25zZShkZXZpY2UsIHJlcXVlc3RJZCwgQmx1ZXRvb3RoR2F0dC5HQVRUX1NVQ0NFU1MsIDAsIG51bGwpOw0KKyAgICAgICAgICAgIC8vIElmIHdlIGVuZCB1cCB3aXRoIHRocmVlIGRlc2NlbmRpbmcgdmFsdWVzLCB0ZXN0IGlzIHBhc3NlZC4NCisgICAgICAgICAgICBpZiAoaW50ZXJ2YWxfbG93ID4gaW50ZXJ2YWxfYmFsYW5jZWQgJiYgaW50ZXJ2YWxfYmFsYW5jZWQgPiBpbnRlcnZhbF9oaWdoKSB7DQorICAgICAgICAgICAgICAgIHNob3dNZXNzYWdlKCJpbnRlcnZhbHM6ICIgKyBpbnRlcnZhbF9sb3cgKyIgPiAiICsgaW50ZXJ2YWxfYmFsYW5jZWQgKyAiID4gIiArIGludGVydmFsX2hpZ2gpOw0KKyAgICAgICAgICAgICAgICBub3RpZnlNZWFzdXJlbWVudEZpbmlzaGVkKCk7DQogICAgICAgICAgICAgfQ0KICAgICAgICAgfQ0KICAgICB9Ow0KIA0KLSAgICBwcml2YXRlIHZvaWQgbm90aWZ5TWVhc3VyZW1lbnRGaW5pc2hlZChTdHJpbmcgcHJpb3JpdHksIGxvbmcgYXZlcmFnZVRpbWUpIHsNCisgICAgcHJpdmF0ZSB2b2lkIG5vdGlmeU1lYXN1cmVtZW50RmluaXNoZWQoKSB7DQogICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOw0KLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKEVYVFJBX0FWRVJBR0UsIGF2ZXJhZ2VUaW1lKTsNCi0gICAgICAgIHN3aXRjaCAocHJpb3JpdHkpIHsNCi0gICAgICAgICAgICBjYXNlIENPTk5FQ1RJT05fUFJJT1JJVFlfSElHSDoNCi0gICAgICAgICAgICAgICAgaW50ZW50LnNldEFjdGlvbihBQ1RJT05fRklOSUNIX0NPTk5FQ1RJT05fUFJJT1JJVFlfSElHSFQpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIENPTk5FQ1RJT05fUFJJT1JJVFlfQkFMQU5DRUQ6DQotICAgICAgICAgICAgICAgIGludGVudC5zZXRBY3Rpb24oQUNUSU9OX0ZJTklDSF9DT05ORUNUSU9OX1BSSU9SSVRZX0JBTEFOQ0VEKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBDT05ORUNUSU9OX1BSSU9SSVRZX0xPV19QT1dFUjoNCi0gICAgICAgICAgICAgICAgaW50ZW50LnNldEFjdGlvbihBQ1RJT05fRklOSUNIX0NPTk5FQ1RJT05fUFJJT1JJVFlfTE9XKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQorICAgICAgICBpbnRlbnQuc2V0QWN0aW9uKEFDVElPTl9DT05ORUNUSU9OX1BSSU9SSVRZX0ZJTklTSCk7DQogICAgICAgICBzZW5kQnJvYWRjYXN0KGludGVudCk7DQogICAgIH0NCiANCmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvYmx1ZXRvb3RoL0JsZUluc2VjdXJlQ2xpZW50U3RhcnRBY3Rpdml0eS5qYXZhIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL2JsdWV0b290aC9CbGVJbnNlY3VyZUNsaWVudFN0YXJ0QWN0aXZpdHkuamF2YQppbmRleCAwMzI1NmZiLi5kMGE2ZTgwIDEwMDY0NAotLS0gYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvYmx1ZXRvb3RoL0JsZUluc2VjdXJlQ2xpZW50U3RhcnRBY3Rpdml0eS5qYXZhCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9ibHVldG9vdGgvQmxlSW5zZWN1cmVDbGllbnRTdGFydEFjdGl2aXR5LmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKIA0KIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50Ow0KIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsNCitpbXBvcnQgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLlI7DQogDQogcHVibGljIGNsYXNzIEJsZUluc2VjdXJlQ2xpZW50U3RhcnRBY3Rpdml0eSBleHRlbmRzIEJsZUNsaWVudFRlc3RCYXNlQWN0aXZpdHkgew0KICAgICBwcml2YXRlIEludGVudCBtSW50ZW50Ow0KQEAgLTI1LDYgKzI2LDEwIEBACiAgICAgQE92ZXJyaWRlDQogICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsNCiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7DQorDQorICAgICAgICBzZXRJbmZvUmVzb3VyY2VzKFIuc3RyaW5nLmJsZV9jbGllbnRfdGVzdF9uYW1lLA0KKyAgICAgICAgICAgICAgICBSLnN0cmluZy5ibGVfaW5zZWN1cmVfY2xpZW50X3Rlc3RfaW5mbywgLTEpOw0KKw0KICAgICAgICAgbUludGVudCA9IG5ldyBJbnRlbnQodGhpcywgQmxlQ2xpZW50U2VydmljZS5jbGFzcyk7DQogICAgICAgICBtSW50ZW50LnNldEFjdGlvbihCbGVDbGllbnRTZXJ2aWNlLkJMRV9DTElFTlRfQUNUSU9OX0NMSUVOVF9DT05ORUNUKTsNCiANCmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvYmx1ZXRvb3RoL0hpZENvbnN0YW50cy5qYXZhIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL2JsdWV0b290aC9IaWRDb25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTdmZGE1Ci0tLSAvZGV2L251bGwKKysrIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL2JsdWV0b290aC9IaWRDb25zdGFudHMuamF2YQpAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLmJsdWV0b290aDsKKworcHVibGljIGNsYXNzIEhpZENvbnN0YW50cyB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIElEX0tFWUJPQVJEID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgSURfTU9VU0UgPSAyOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gSElERF9SRVBPUlRfREVTQyA9IHsKKyAgICAgICAgICAgIChieXRlKSAweDA1LAorICAgICAgICAgICAgKGJ5dGUpIDB4MDEsIC8vIFVzYWdlIHBhZ2UgKEdlbmVyaWMgRGVza3RvcCkKKyAgICAgICAgICAgIChieXRlKSAweDA5LAorICAgICAgICAgICAgKGJ5dGUpIDB4MDYsIC8vIFVzYWdlIChLZXlib2FyZCkKKyAgICAgICAgICAgIChieXRlKSAweEExLAorICAgICAgICAgICAgKGJ5dGUpIDB4MDEsIC8vIENvbGxlY3Rpb24gKEFwcGxpY2F0aW9uKQorICAgICAgICAgICAgKGJ5dGUpIDB4ODUsCisgICAgICAgICAgICBJRF9LRVlCT0FSRCwgLy8gICAgUmVwb3J0IElECisgICAgICAgICAgICAoYnl0ZSkgMHgwNSwKKyAgICAgICAgICAgIChieXRlKSAweDA3LCAvLyAgICAgICBVc2FnZSBwYWdlIChLZXkgQ29kZXMpCisgICAgICAgICAgICAoYnl0ZSkgMHgxOSwKKyAgICAgICAgICAgIChieXRlKSAweEUwLCAvLyAgICAgICBVc2FnZSBtaW5pbXVtICgyMjQpCisgICAgICAgICAgICAoYnl0ZSkgMHgyOSwKKyAgICAgICAgICAgIChieXRlKSAweEU3LCAvLyAgICAgICBVc2FnZSBtYXhpbXVtICgyMzEpCisgICAgICAgICAgICAoYnl0ZSkgMHgxNSwKKyAgICAgICAgICAgIChieXRlKSAweDAwLCAvLyAgICAgICBMb2dpY2FsIG1pbmltdW0gKDApCisgICAgICAgICAgICAoYnl0ZSkgMHgyNSwKKyAgICAgICAgICAgIChieXRlKSAweDAxLCAvLyAgICAgICBMb2dpY2FsIG1heGltdW0gKDEpCisgICAgICAgICAgICAoYnl0ZSkgMHg3NSwKKyAgICAgICAgICAgIChieXRlKSAweDAxLCAvLyAgICAgICBSZXBvcnQgc2l6ZSAoMSkKKyAgICAgICAgICAgIChieXRlKSAweDk1LAorICAgICAgICAgICAgKGJ5dGUpIDB4MDgsIC8vICAgICAgIFJlcG9ydCBjb3VudCAoOCkKKyAgICAgICAgICAgIChieXRlKSAweDgxLAorICAgICAgICAgICAgKGJ5dGUpIDB4MDIsIC8vICAgICAgIElucHV0IChEYXRhLCBWYXJpYWJsZSwgQWJzb2x1dGUpIDsgTW9kaWZpZXIgYnl0ZQorICAgICAgICAgICAgKGJ5dGUpIDB4NzUsCisgICAgICAgICAgICAoYnl0ZSkgMHgwOCwgLy8gICAgICAgUmVwb3J0IHNpemUgKDgpCisgICAgICAgICAgICAoYnl0ZSkgMHg5NSwKKyAgICAgICAgICAgIChieXRlKSAweDAxLCAvLyAgICAgICBSZXBvcnQgY291bnQgKDEpCisgICAgICAgICAgICAoYnl0ZSkgMHg4MSwKKyAgICAgICAgICAgIChieXRlKSAweDAxLCAvLyAgICAgICBJbnB1dCAoQ29uc3RhbnQpICAgICAgICAgICAgICAgICA7IFJlc2VydmVkIGJ5dGUKKyAgICAgICAgICAgIChieXRlKSAweDc1LAorICAgICAgICAgICAgKGJ5dGUpIDB4MDgsIC8vICAgICAgIFJlcG9ydCBzaXplICg4KQorICAgICAgICAgICAgKGJ5dGUpIDB4OTUsCisgICAgICAgICAgICAoYnl0ZSkgMHgwNiwgLy8gICAgICAgUmVwb3J0IGNvdW50ICg2KQorICAgICAgICAgICAgKGJ5dGUpIDB4MTUsCisgICAgICAgICAgICAoYnl0ZSkgMHgwMCwgLy8gICAgICAgTG9naWNhbCBNaW5pbXVtICgwKQorICAgICAgICAgICAgKGJ5dGUpIDB4MjUsCisgICAgICAgICAgICAoYnl0ZSkgMHg2NSwgLy8gICAgICAgTG9naWNhbCBNYXhpbXVtICgxMDEpCisgICAgICAgICAgICAoYnl0ZSkgMHgwNSwKKyAgICAgICAgICAgIChieXRlKSAweDA3LCAvLyAgICAgICBVc2FnZSBwYWdlIChLZXkgQ29kZXMpCisgICAgICAgICAgICAoYnl0ZSkgMHgxOSwKKyAgICAgICAgICAgIChieXRlKSAweDAwLCAvLyAgICAgICBVc2FnZSBNaW5pbXVtICgwKQorICAgICAgICAgICAgKGJ5dGUpIDB4MjksCisgICAgICAgICAgICAoYnl0ZSkgMHg2NSwgLy8gICAgICAgVXNhZ2UgTWF4aW11bSAoMTAxKQorICAgICAgICAgICAgKGJ5dGUpIDB4ODEsCisgICAgICAgICAgICAoYnl0ZSkgMHgwMCwgLy8gICAgICAgSW5wdXQgKERhdGEsIEFycmF5KSAgICAgICAgICAgICAgOyBLZXkgYXJyYXkgKDYga2V5cykKKyAgICAgICAgICAgIChieXRlKSAweEMwLCAvLyBFbmQgQ29sbGVjdGlvbgorICAgICAgICAgICAgKGJ5dGUpIDB4MDUsCisgICAgICAgICAgICAoYnl0ZSkgMHgwMSwgLy8gVXNhZ2UgUGFnZSAoR2VuZXJpYyBEZXNrdG9wKQorICAgICAgICAgICAgKGJ5dGUpIDB4MDksCisgICAgICAgICAgICAoYnl0ZSkgMHgwMiwgLy8gVXNhZ2UgKE1vdXNlKQorICAgICAgICAgICAgKGJ5dGUpIDB4QTEsCisgICAgICAgICAgICAoYnl0ZSkgMHgwMSwgLy8gQ29sbGVjdGlvbiAoQXBwbGljYXRpb24pCisgICAgICAgICAgICAoYnl0ZSkgMHg4NSwKKyAgICAgICAgICAgIElEX01PVVNFLCAvLyAgICBSZXBvcnQgSUQKKyAgICAgICAgICAgIChieXRlKSAweDA5LAorICAgICAgICAgICAgKGJ5dGUpIDB4MDEsIC8vICAgIFVzYWdlIChQb2ludGVyKQorICAgICAgICAgICAgKGJ5dGUpIDB4QTEsCisgICAgICAgICAgICAoYnl0ZSkgMHgwMCwgLy8gICAgQ29sbGVjdGlvbiAoUGh5c2ljYWwpCisgICAgICAgICAgICAoYnl0ZSkgMHgwNSwKKyAgICAgICAgICAgIChieXRlKSAweDA5LCAvLyAgICAgICBVc2FnZSBQYWdlIChCdXR0b25zKQorICAgICAgICAgICAgKGJ5dGUpIDB4MTksCisgICAgICAgICAgICAoYnl0ZSkgMHgwMSwgLy8gICAgICAgVXNhZ2UgbWluaW11bSAoMSkKKyAgICAgICAgICAgIChieXRlKSAweDI5LAorICAgICAgICAgICAgKGJ5dGUpIDB4MDMsIC8vICAgICAgIFVzYWdlIG1heGltdW0gKDMpCisgICAgICAgICAgICAoYnl0ZSkgMHgxNSwKKyAgICAgICAgICAgIChieXRlKSAweDAwLCAvLyAgICAgICBMb2dpY2FsIG1pbmltdW0gKDApCisgICAgICAgICAgICAoYnl0ZSkgMHgyNSwKKyAgICAgICAgICAgIChieXRlKSAweDAxLCAvLyAgICAgICBMb2dpY2FsIG1heGltdW0gKDEpCisgICAgICAgICAgICAoYnl0ZSkgMHg3NSwKKyAgICAgICAgICAgIChieXRlKSAweDAxLCAvLyAgICAgICBSZXBvcnQgc2l6ZSAoMSkKKyAgICAgICAgICAgIChieXRlKSAweDk1LAorICAgICAgICAgICAgKGJ5dGUpIDB4MDMsIC8vICAgICAgIFJlcG9ydCBjb3VudCAoMykKKyAgICAgICAgICAgIChieXRlKSAweDgxLAorICAgICAgICAgICAgKGJ5dGUpIDB4MDIsIC8vICAgICAgIElucHV0IChEYXRhLCBWYXJpYWJsZSwgQWJzb2x1dGUpCisgICAgICAgICAgICAoYnl0ZSkgMHg3NSwKKyAgICAgICAgICAgIChieXRlKSAweDA1LCAvLyAgICAgICBSZXBvcnQgc2l6ZSAoNSkKKyAgICAgICAgICAgIChieXRlKSAweDk1LAorICAgICAgICAgICAgKGJ5dGUpIDB4MDEsIC8vICAgICAgIFJlcG9ydCBjb3VudCAoMSkKKyAgICAgICAgICAgIChieXRlKSAweDgxLAorICAgICAgICAgICAgKGJ5dGUpIDB4MDEsIC8vICAgICAgIElucHV0IChjb25zdGFudCkgICAgICAgICAgICAgICAgIDsgNSBiaXQgcGFkZGluZworICAgICAgICAgICAgKGJ5dGUpIDB4MDUsCisgICAgICAgICAgICAoYnl0ZSkgMHgwMSwgLy8gICAgICAgVXNhZ2UgcGFnZSAoR2VuZXJpYyBEZXNrdG9wKQorICAgICAgICAgICAgKGJ5dGUpIDB4MDksCisgICAgICAgICAgICAoYnl0ZSkgMHgzMCwgLy8gICAgICAgVXNhZ2UgKFgpCisgICAgICAgICAgICAoYnl0ZSkgMHgwOSwKKyAgICAgICAgICAgIChieXRlKSAweDMxLCAvLyAgICAgICBVc2FnZSAoWSkKKyAgICAgICAgICAgIChieXRlKSAweDA5LAorICAgICAgICAgICAgKGJ5dGUpIDB4MzgsIC8vICAgICAgIFVzYWdlIChXaGVlbCkKKyAgICAgICAgICAgIChieXRlKSAweDE1LAorICAgICAgICAgICAgKGJ5dGUpIDB4ODEsIC8vICAgICAgIExvZ2ljYWwgbWluaW11bSAoLTEyNykKKyAgICAgICAgICAgIChieXRlKSAweDI1LAorICAgICAgICAgICAgKGJ5dGUpIDB4N0YsIC8vICAgICAgIExvZ2ljYWwgbWF4aW11bSAoMTI3KQorICAgICAgICAgICAgKGJ5dGUpIDB4NzUsCisgICAgICAgICAgICAoYnl0ZSkgMHgwOCwgLy8gICAgICAgUmVwb3J0IHNpemUgKDgpCisgICAgICAgICAgICAoYnl0ZSkgMHg5NSwKKyAgICAgICAgICAgIChieXRlKSAweDAzLCAvLyAgICAgICBSZXBvcnQgY291bnQgKDMpCisgICAgICAgICAgICAoYnl0ZSkgMHg4MSwKKyAgICAgICAgICAgIChieXRlKSAweDA2LCAvLyAgICAgICBJbnB1dCAoRGF0YSwgVmFyaWFibGUsIFJlbGF0aXZlKQorICAgICAgICAgICAgKGJ5dGUpIDB4QzAsIC8vICAgIEVuZCBDb2xsZWN0aW9uCisgICAgICAgICAgICAoYnl0ZSkgMHhDMCAvLyBFbmQgQ29sbGVjdGlvbgorICAgIH07Cit9CmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvYmx1ZXRvb3RoL0hpZERldmljZUFjdGl2aXR5LmphdmEgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvYmx1ZXRvb3RoL0hpZERldmljZUFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRhMDk3ZAotLS0gL2Rldi9udWxsCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9ibHVldG9vdGgvSGlkRGV2aWNlQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDI5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLmJsdWV0b290aDsKKworaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlOworaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEhpZERldmljZTsKK2ltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhIaWREZXZpY2VBcHBRb3NTZXR0aW5nczsKK2ltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhIaWREZXZpY2VBcHBTZHBTZXR0aW5nczsKK2ltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhQcm9maWxlOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CisKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uQ2xpY2tMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLlBhc3NGYWlsQnV0dG9uczsKK2ltcG9ydCBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIuUjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CisKK3B1YmxpYyBjbGFzcyBIaWREZXZpY2VBY3Rpdml0eSBleHRlbmRzIFBhc3NGYWlsQnV0dG9ucy5BY3Rpdml0eSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IEhpZERldmljZUFjdGl2aXR5LmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0FQUF9TVEFUVVNfQ0hBTkdFRCA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNEUF9OQU1FID0gIkN0c1ZlcmlmaWVyIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0RQX0RFU0NSSVBUSU9OID0gIkN0c1ZlcmlmaWVyIEhJRCBEZXZpY2UgdGVzdCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNEUF9QUk9WSURFUiA9ICJBbmRyb2lkIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUU9TX1RPS0VOX1JBVEUgPSA4MDA7IC8vIDkgYnl0ZXMgKiAxMDAwMDAwIHVzIC8gMTEyNTAgdXMKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUU9TX1RPS0VOX0JVQ0tFVF9TSVpFID0gOTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUU9TX1BFQUtfQkFORFdJRFRIID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUU9TX0xBVEVOQ1kgPSAxMTI1MDsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFNBTVBMRV9JTlBVVCA9ICJibHVldG9vdGgiOworCisgICAgcHJpdmF0ZSBCbHVldG9vdGhBZGFwdGVyIG1CbHVldG9vdGhBZGFwdGVyOworICAgIHByaXZhdGUgQmx1ZXRvb3RoSGlkRGV2aWNlIG1CbHVldG9vdGhIaWREZXZpY2U7CisgICAgcHJpdmF0ZSBCbHVldG9vdGhEZXZpY2UgbUhpZEhvc3Q7CisgICAgcHJpdmF0ZSBFeGVjdXRvclNlcnZpY2UgbUV4ZWN1dG9yOworCisgICAgcHJpdmF0ZSBCdXR0b24gbVJlZ2lzdGVyQXBwQnV0dG9uOworICAgIHByaXZhdGUgQnV0dG9uIG1NYWtlRGlzY292ZXJhYmxlQnV0dG9uOworICAgIHByaXZhdGUgQnV0dG9uIG1VbnJlZ2lzdGVyQXBwQnV0dG9uOworICAgIHByaXZhdGUgQnV0dG9uIG1TZW5kUmVwb3J0QnV0dG9uOworICAgIHByaXZhdGUgQnV0dG9uIG1SZXBseVJlcG9ydEJ1dHRvbjsKKyAgICBwcml2YXRlIEJ1dHRvbiBtUmVwb3J0RXJyb3JCdXR0b247CisKKyAgICBwcml2YXRlIEJsdWV0b290aFByb2ZpbGUuU2VydmljZUxpc3RlbmVyIG1Qcm9maWxlTGlzdGVuZXIgPQorICAgICAgICAgICAgbmV3IEJsdWV0b290aFByb2ZpbGUuU2VydmljZUxpc3RlbmVyKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VDb25uZWN0ZWQoaW50IHByb2ZpbGUsIEJsdWV0b290aFByb2ZpbGUgcHJveHkpIHsKKyAgICAgICAgICAgIGlmIChwcm9maWxlID09IEJsdWV0b290aFByb2ZpbGUuSElEX0RFVklDRSkgeworICAgICAgICAgICAgICAgIG1CbHVldG9vdGhIaWREZXZpY2UgPSAoQmx1ZXRvb3RoSGlkRGV2aWNlKSBwcm94eTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZURpc2Nvbm5lY3RlZChpbnQgcHJvZmlsZSkgeworICAgICAgICAgICAgaWYgKHByb2ZpbGUgPT0gQmx1ZXRvb3RoUHJvZmlsZS5ISURfREVWSUNFKSB7CisgICAgICAgICAgICAgICAgbUJsdWV0b290aEhpZERldmljZSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBmaW5hbCBCbHVldG9vdGhIaWREZXZpY2VBcHBTZHBTZXR0aW5ncyBtU2RwU2V0dGluZ3MgPQorICAgICAgICAgICAgbmV3IEJsdWV0b290aEhpZERldmljZUFwcFNkcFNldHRpbmdzKAorICAgICAgICAgICAgICAgICAgICBTRFBfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgU0RQX0RFU0NSSVBUSU9OLAorICAgICAgICAgICAgICAgICAgICBTRFBfUFJPVklERVIsCisgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aEhpZERldmljZS5TVUJDTEFTUzFfQ09NQk8sCisgICAgICAgICAgICAgICAgICAgIEhpZENvbnN0YW50cy5ISUREX1JFUE9SVF9ERVNDKTsKKworICAgIHByaXZhdGUgZmluYWwgQmx1ZXRvb3RoSGlkRGV2aWNlQXBwUW9zU2V0dGluZ3MgbU91dFFvcyA9CisgICAgICAgICAgICBuZXcgQmx1ZXRvb3RoSGlkRGV2aWNlQXBwUW9zU2V0dGluZ3MoCisgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aEhpZERldmljZUFwcFFvc1NldHRpbmdzLlNFUlZJQ0VfQkVTVF9FRkZPUlQsCisgICAgICAgICAgICAgICAgICAgIFFPU19UT0tFTl9SQVRFLAorICAgICAgICAgICAgICAgICAgICBRT1NfVE9LRU5fQlVDS0VUX1NJWkUsCisgICAgICAgICAgICAgICAgICAgIFFPU19QRUFLX0JBTkRXSURUSCwKKyAgICAgICAgICAgICAgICAgICAgUU9TX0xBVEVOQ1ksCisgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aEhpZERldmljZUFwcFFvc1NldHRpbmdzLk1BWCk7CisKKyAgICBwcml2YXRlIEJsdWV0b290aEhpZERldmljZS5DYWxsYmFjayBtQ2FsbGJhY2sgPSBuZXcgQmx1ZXRvb3RoSGlkRGV2aWNlLkNhbGxiYWNrKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25BcHBTdGF0dXNDaGFuZ2VkKEJsdWV0b290aERldmljZSBwbHVnZ2VkRGV2aWNlLCBib29sZWFuIHJlZ2lzdGVyZWQpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIm9uQXBwU3RhdHVzQ2hhbmdlZDogcGx1Z2dlZERldmljZT0iICsgcGx1Z2dlZERldmljZSArICIgcmVnaXN0ZXJlZD0iCisgICAgICAgICAgICAgICAgICAgICsgcmVnaXN0ZXJlZCk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5idF9oaWRfZGV2aWNlKTsKKyAgICAgICAgc2V0UGFzc0ZhaWxCdXR0b25DbGlja0xpc3RlbmVycygpOworICAgICAgICBzZXRJbmZvUmVzb3VyY2VzKFIuc3RyaW5nLmJ0X2hpZF9kZXZpY2VfdGVzdF9uYW1lLCBSLnN0cmluZy5idF9oaWRfZGV2aWNlX3Rlc3RfaW5mbywgLTEpOworCisgICAgICAgIG1CbHVldG9vdGhBZGFwdGVyID0gQmx1ZXRvb3RoQWRhcHRlci5nZXREZWZhdWx0QWRhcHRlcigpOworICAgICAgICBtQmx1ZXRvb3RoQWRhcHRlci5nZXRQcm9maWxlUHJveHkoZ2V0QXBwbGljYXRpb25Db250ZXh0KCksIG1Qcm9maWxlTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgQmx1ZXRvb3RoUHJvZmlsZS5ISURfREVWSUNFKTsKKyAgICAgICAgbUV4ZWN1dG9yID0gRXhlY3V0b3JzLm5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yKCk7CisKKyAgICAgICAgbVJlZ2lzdGVyQXBwQnV0dG9uID0gKEJ1dHRvbikgZmluZFZpZXdCeUlkKFIuaWQuYnRfaGlkX2RldmljZV9yZWdpc3Rlcl9idXR0b24pOworICAgICAgICBtUmVnaXN0ZXJBcHBCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgcmVnaXN0ZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgbVVucmVnaXN0ZXJBcHBCdXR0b24gPSAoQnV0dG9uKSBmaW5kVmlld0J5SWQoUi5pZC5idF9oaWRfZGV2aWNlX3VucmVnaXN0ZXJfYnV0dG9uKTsKKyAgICAgICAgbVVucmVnaXN0ZXJBcHBCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgdW5yZWdpc3RlcigpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBtTWFrZURpc2NvdmVyYWJsZUJ1dHRvbiA9IChCdXR0b24pIGZpbmRWaWV3QnlJZChSLmlkLmJ0X2hpZF9kZXZpY2VfZGlzY292ZXJhYmxlX2J1dHRvbik7CisgICAgICAgIG1NYWtlRGlzY292ZXJhYmxlQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIG1ha2VEaXNjb3ZlcmFibGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgbVNlbmRSZXBvcnRCdXR0b24gPSAoQnV0dG9uKSBmaW5kVmlld0J5SWQoUi5pZC5idF9oaWRfZGV2aWNlX3NlbmRfcmVwb3J0X2J1dHRvbik7CisgICAgICAgIG1TZW5kUmVwb3J0QnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIHRlc3RTZW5kUmVwb3J0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIG1SZXBseVJlcG9ydEJ1dHRvbiA9IChCdXR0b24pIGZpbmRWaWV3QnlJZChSLmlkLmJ0X2hpZF9kZXZpY2VfcmVwbHlfcmVwb3J0X2J1dHRvbik7CisgICAgICAgIG1SZXBseVJlcG9ydEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgbVJlcGx5UmVwb3J0QnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIHRlc3RSZXBseVJlcG9ydCgpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBtUmVwb3J0RXJyb3JCdXR0b24gPSAoQnV0dG9uKSBmaW5kVmlld0J5SWQoUi5pZC5idF9oaWRfZGV2aWNlX3JlcG9ydF9lcnJvcl9idXR0b24pOworICAgICAgICBtUmVwb3J0RXJyb3JCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgIG1SZXBvcnRFcnJvckJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICB0ZXN0UmVwb3J0RXJyb3IoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25EZXN0cm95KCkgeworICAgICAgICBzdXBlci5vbkRlc3Ryb3koKTsKKyAgICAgICAgdW5yZWdpc3RlcigpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiByZWdpc3RlcigpIHsKKyAgICAgICAgcmV0dXJuIG1CbHVldG9vdGhIaWREZXZpY2UgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIG1CbHVldG9vdGhIaWREZXZpY2UucmVnaXN0ZXJBcHAobVNkcFNldHRpbmdzLCBudWxsLCBtT3V0UW9zLCBtRXhlY3V0b3IsCisgICAgICAgICAgICAgICAgbUNhbGxiYWNrKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbWFrZURpc2NvdmVyYWJsZSgpIHsKKyAgICAgICAgaWYgKG1CbHVldG9vdGhBZGFwdGVyLmdldFNjYW5Nb2RlKCkgIT0KKyAgICAgICAgICAgICAgICBCbHVldG9vdGhBZGFwdGVyLlNDQU5fTU9ERV9DT05ORUNUQUJMRV9ESVNDT1ZFUkFCTEUpIHsKKyAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEJsdWV0b290aEFkYXB0ZXIuQUNUSU9OX1JFUVVFU1RfRElTQ09WRVJBQkxFKTsKKyAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShCbHVldG9vdGhBZGFwdGVyLkVYVFJBX0RJU0NPVkVSQUJMRV9EVVJBVElPTiwgMzApOworICAgICAgICAgICAgc3RhcnRBY3Rpdml0eShpbnRlbnQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHVucmVnaXN0ZXIoKSB7CisgICAgICAgIHJldHVybiBtQmx1ZXRvb3RoSGlkRGV2aWNlICE9IG51bGwgJiYgbUJsdWV0b290aEhpZERldmljZS51bnJlZ2lzdGVyQXBwKCk7CisgICAgfQorCisKKyAgICBwcml2YXRlIGJvb2xlYW4gZ2V0Q29ubmVjdGVkRGV2aWNlKCkgeworICAgICAgICBpZiAobUJsdWV0b290aEhpZERldmljZSA9PSBudWxsKSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJtQmx1ZXRvb3RoSGlkRGV2aWNlIGlzIG51bGwiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIExpc3Q8Qmx1ZXRvb3RoRGV2aWNlPiBjb25uZWN0ZWREZXZpY2VzID0gbUJsdWV0b290aEhpZERldmljZS5nZXRDb25uZWN0ZWREZXZpY2VzKCk7CisgICAgICAgIGlmIChjb25uZWN0ZWREZXZpY2VzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdFNlbmRSZXBvcnQoKSB7CisgICAgICAgIGlmIChtQmx1ZXRvb3RoSGlkRGV2aWNlID09IG51bGwpIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIm1CbHVldG9vdGhIaWREZXZpY2UgaXMgbnVsbCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1IaWRIb3N0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChtQmx1ZXRvb3RoSGlkRGV2aWNlLmdldENvbm5lY3RlZERldmljZXMoKS5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkhJRCBob3N0IG5vdCBjb25uZWN0ZWQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1IaWRIb3N0ID0gbUJsdWV0b290aEhpZERldmljZS5nZXRDb25uZWN0ZWREZXZpY2VzKCkuZ2V0KDApOworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImNvbm5lY3RlZCB0bzogIiArIG1IaWRIb3N0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKGNoYXIgYyA6IFNBTVBMRV9JTlBVVC50b0NoYXJBcnJheSgpKSB7CisgICAgICAgICAgICBtQmx1ZXRvb3RoSGlkRGV2aWNlLnNlbmRSZXBvcnQobUhpZEhvc3QsIEJsdWV0b290aEhpZERldmljZS5SRVBPUlRfVFlQRV9JTlBVVCwKKyAgICAgICAgICAgICAgICAgICAgc2luZ2xlS2V5SGl0KGNoYXJUb0tleUNvZGUoYykpKTsKKyAgICAgICAgICAgIG1CbHVldG9vdGhIaWREZXZpY2Uuc2VuZFJlcG9ydChtSGlkSG9zdCwgQmx1ZXRvb3RoSGlkRGV2aWNlLlJFUE9SVF9UWVBFX0lOUFVULAorICAgICAgICAgICAgICAgICAgICBzaW5nbGVLZXlIaXQoKGJ5dGUpIDApKTsKKyAgICAgICAgfQorICAgICAgICBtUmVwbHlSZXBvcnRCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKKworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0UmVwbHlSZXBvcnQoKSB7CisgICAgICAgIGlmIChtQmx1ZXRvb3RoSGlkRGV2aWNlID09IG51bGwpIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIm1CbHVldG9vdGhIaWREZXZpY2UgaXMgbnVsbCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1IaWRIb3N0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChtQmx1ZXRvb3RoSGlkRGV2aWNlLmdldENvbm5lY3RlZERldmljZXMoKS5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkhJRCBob3N0IG5vdCBjb25uZWN0ZWQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1IaWRIb3N0ID0gbUJsdWV0b290aEhpZERldmljZS5nZXRDb25uZWN0ZWREZXZpY2VzKCkuZ2V0KDApOworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImNvbm5lY3RlZCB0bzogIiArIG1IaWRIb3N0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobUJsdWV0b290aEhpZERldmljZS5yZXBseVJlcG9ydChtSGlkSG9zdCwgKGJ5dGUpIDAsIChieXRlKSAwLAorICAgICAgICAgICAgICAgIHNpbmdsZUtleUhpdCgoYnl0ZSkgMCkpKSB7CisgICAgICAgICAgICBtUmVwb3J0RXJyb3JCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0UmVwb3J0RXJyb3IoKSB7CisgICAgICAgIGlmIChtQmx1ZXRvb3RoSGlkRGV2aWNlID09IG51bGwpIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIm1CbHVldG9vdGhIaWREZXZpY2UgaXMgbnVsbCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1IaWRIb3N0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChtQmx1ZXRvb3RoSGlkRGV2aWNlLmdldENvbm5lY3RlZERldmljZXMoKS5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkhJRCBob3N0IG5vdCBjb25uZWN0ZWQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1IaWRIb3N0ID0gbUJsdWV0b290aEhpZERldmljZS5nZXRDb25uZWN0ZWREZXZpY2VzKCkuZ2V0KDApOworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImNvbm5lY3RlZCB0bzogIiArIG1IaWRIb3N0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobUJsdWV0b290aEhpZERldmljZS5yZXBvcnRFcnJvcihtSGlkSG9zdCwgKGJ5dGUpIDApKSB7CisgICAgICAgICAgICBnZXRQYXNzQnV0dG9uKCkuc2V0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHJpdmF0ZSBieXRlW10gc2luZ2xlS2V5SGl0KGJ5dGUgY29kZSkgeworICAgICAgICBieXRlW10ga2V5Ym9hcmREYXRhID0gbmV3IGJ5dGVbOF07CisgICAgICAgIGtleWJvYXJkRGF0YVswXSA9IDA7CisgICAgICAgIGtleWJvYXJkRGF0YVsxXSA9IDA7CisgICAgICAgIGtleWJvYXJkRGF0YVsyXSA9IGNvZGU7CisgICAgICAgIGtleWJvYXJkRGF0YVszXSA9IDA7CisgICAgICAgIGtleWJvYXJkRGF0YVs0XSA9IDA7CisgICAgICAgIGtleWJvYXJkRGF0YVs1XSA9IDA7CisgICAgICAgIGtleWJvYXJkRGF0YVs2XSA9IDA7CisgICAgICAgIGtleWJvYXJkRGF0YVs3XSA9IDA7CisgICAgICAgIHJldHVybiBrZXlib2FyZERhdGE7CisgICAgfQorCisgICAgcHJpdmF0ZSBieXRlIGNoYXJUb0tleUNvZGUoY2hhciBjKSB7CisgICAgICAgIGlmIChjIDwgJ2EnIHx8IGMgPiAneicpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoYnl0ZSkgKGMgLSAnYScgKyAweDA0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvYmx1ZXRvb3RoL0hpZEhvc3RBY3Rpdml0eS5qYXZhIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL2JsdWV0b290aC9IaWRIb3N0QWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTcwYjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL2JsdWV0b290aC9IaWRIb3N0QWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLmJsdWV0b290aDsKKworaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC50ZXh0LkVkaXRhYmxlOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0V2F0Y2hlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuT25DbGlja0xpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5FZGl0VGV4dDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5QYXNzRmFpbEJ1dHRvbnM7CitpbXBvcnQgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLlI7CitpbXBvcnQgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLlRlc3RSZXN1bHQ7CisKK3B1YmxpYyBjbGFzcyBIaWRIb3N0QWN0aXZpdHkgZXh0ZW5kcyBQYXNzRmFpbEJ1dHRvbnMuQWN0aXZpdHkgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBIaWRIb3N0QWN0aXZpdHkuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOworCisgICAgQmx1ZXRvb3RoQWRhcHRlciBtQmx1ZXRvb3RoQWRhcHRlcjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTkFCTEVfQkxVRVRPT1RIX1JFUVVFU1QgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQSUNLX1NFUlZFUl9ERVZJQ0VfUkVRVUVTVCA9IDI7CisKKyAgICBwcml2YXRlIFN0cmluZyBtRGV2aWNlQWRkcmVzczsKKworICAgIHByaXZhdGUgQnV0dG9uIG1QaWNrRGV2aWNlQnV0dG9uOworICAgIHByaXZhdGUgRWRpdFRleHQgbUVkaXRUZXh0OworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5idF9oaWRfaG9zdCk7CisgICAgICAgIHNldFBhc3NGYWlsQnV0dG9uQ2xpY2tMaXN0ZW5lcnMoKTsKKyAgICAgICAgc2V0SW5mb1Jlc291cmNlcyhSLnN0cmluZy5idF9oaWRfaG9zdF90ZXN0X25hbWUsIFIuc3RyaW5nLmJ0X2hpZF9ob3N0X3Rlc3RfaW5mbywgLTEpOworICAgICAgICBtQmx1ZXRvb3RoQWRhcHRlciA9IEJsdWV0b290aEFkYXB0ZXIuZ2V0RGVmYXVsdEFkYXB0ZXIoKTsKKworICAgICAgICBtRWRpdFRleHQgPSAoRWRpdFRleHQpIGZpbmRWaWV3QnlJZChSLmlkLmJ0X2hpZF9ob3N0X2VkaXRfdGV4dCk7CisgICAgICAgIG1FZGl0VGV4dC5hZGRUZXh0Q2hhbmdlZExpc3RlbmVyKG5ldyBUZXh0V2F0Y2hlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgYmVmb3JlVGV4dENoYW5nZWQoQ2hhclNlcXVlbmNlIHMsIGludCBzdGFydCwgaW50IGNvdW50LCBpbnQgYWZ0ZXIpIHt9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25UZXh0Q2hhbmdlZChDaGFyU2VxdWVuY2UgcywgaW50IHN0YXJ0LCBpbnQgYmVmb3JlLCBpbnQgY291bnQpIHsKKyAgICAgICAgICAgICAgICBpZiAocy50b1N0cmluZygpLmVxdWFscyhIaWREZXZpY2VBY3Rpdml0eS5TQU1QTEVfSU5QVVQpKSB7CisgICAgICAgICAgICAgICAgICAgIGdldFBhc3NCdXR0b24oKS5zZXRFbmFibGVkKHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBhZnRlclRleHRDaGFuZ2VkKEVkaXRhYmxlIHMpIHt9CisgICAgICAgIH0pOworICAgICAgICBtUGlja0RldmljZUJ1dHRvbiA9IChCdXR0b24pIGZpbmRWaWV3QnlJZChSLmlkLmJ0X2hpZF9ob3N0X3BpY2tfZGV2aWNlX2J1dHRvbik7CisgICAgICAgIG1QaWNrRGV2aWNlQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEhpZEhvc3RBY3Rpdml0eS50aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlUGlja2VyQWN0aXZpdHkuY2xhc3MpOworICAgICAgICAgICAgICAgIHN0YXJ0QWN0aXZpdHlGb3JSZXN1bHQoaW50ZW50LCBQSUNLX1NFUlZFUl9ERVZJQ0VfUkVRVUVTVCk7CisgICAgICAgICAgICAgICAgbUVkaXRUZXh0LnJlcXVlc3RGb2N1cygpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkFjdGl2aXR5UmVzdWx0KGludCByZXF1ZXN0Q29kZSwgaW50IHJlc3VsdENvZGUsIEludGVudCBkYXRhKSB7CisgICAgICAgIHN1cGVyLm9uQWN0aXZpdHlSZXN1bHQocmVxdWVzdENvZGUsIHJlc3VsdENvZGUsIGRhdGEpOworICAgICAgICBzd2l0Y2ggKHJlcXVlc3RDb2RlKSB7CisgICAgICAgICAgICBjYXNlIFBJQ0tfU0VSVkVSX0RFVklDRV9SRVFVRVNUOgorICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInBpY2sgZGV2aWNlOiAiICsgcmVzdWx0Q29kZSk7CisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdENvZGUgPT0gUkVTVUxUX09LKSB7CisgICAgICAgICAgICAgICAgICAgIG1EZXZpY2VBZGRyZXNzID0gZGF0YS5nZXRTdHJpbmdFeHRyYShEZXZpY2VQaWNrZXJBY3Rpdml0eS5FWFRSQV9ERVZJQ0VfQUREUkVTUyk7CisgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RUb0RldmljZSgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNldFJlc3VsdChSRVNVTFRfQ0FOQ0VMRUQpOworICAgICAgICAgICAgICAgICAgICBmaW5pc2goKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gY29ubmVjdFRvRGV2aWNlKCkgeworICAgICAgICBCbHVldG9vdGhEZXZpY2UgYmx1ZXRvb3RoRGV2aWNlID0gbUJsdWV0b290aEFkYXB0ZXIuZ2V0UmVtb3RlRGV2aWNlKG1EZXZpY2VBZGRyZXNzKTsKKyAgICAgICAgYmx1ZXRvb3RoRGV2aWNlLmNyZWF0ZUJvbmQoKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL2NhbWVyYS9mb3JtYXRzL0NhbWVyYUZvcm1hdHNBY3Rpdml0eS5qYXZhIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL2NhbWVyYS9mb3JtYXRzL0NhbWVyYUZvcm1hdHNBY3Rpdml0eS5qYXZhCmluZGV4IDljNWIzMWQuLjA3YzU5OGYgMTAwNzU1Ci0tLSBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9jYW1lcmEvZm9ybWF0cy9DYW1lcmFGb3JtYXRzQWN0aXZpdHkuamF2YQorKysgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvY2FtZXJhL2Zvcm1hdHMvQ2FtZXJhRm9ybWF0c0FjdGl2aXR5LmphdmEKQEAgLTQwLDYgKzQwLDcgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuVGV4dHVyZVZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZUJ1dHRvbjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuU3Bpbm5lcjsKQEAgLTUxLDYgKzUyLDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CiBpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CiAKIC8qKgpAQCAtOTksMTQgKzEwMSw0NCBAQAogICAgIHByaXZhdGUgYm9vbGVhbiBtUHJvY2Vzc0luUHJvZ3Jlc3MgPSBmYWxzZTsKICAgICBwcml2YXRlIGJvb2xlYW4gbVByb2Nlc3NpbmdGaXJzdEZyYW1lID0gZmFsc2U7CiAKLSAgICBwcml2YXRlIFRyZWVTZXQ8U3RyaW5nPiBtVGVzdGVkQ29tYmluYXRpb25zID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOwotICAgIHByaXZhdGUgVHJlZVNldDxTdHJpbmc+IG1VbnRlc3RlZENvbWJpbmF0aW9ucyA9IG5ldyBUcmVlU2V0PFN0cmluZz4oKTsKKyAgICBwcml2YXRlIGZpbmFsIFRyZWVTZXQ8Q2FtZXJhQ29tYmluYXRpb24+IG1UZXN0ZWRDb21iaW5hdGlvbnMgPSBuZXcgVHJlZVNldDw+KENPTVBBUkFUT1IpOworICAgIHByaXZhdGUgZmluYWwgVHJlZVNldDxDYW1lcmFDb21iaW5hdGlvbj4gbVVudGVzdGVkQ29tYmluYXRpb25zID0gbmV3IFRyZWVTZXQ8PihDT01QQVJBVE9SKTsKIAogICAgIHByaXZhdGUgaW50IG1BbGxDb21iaW5hdGlvbnNTaXplID0gMDsKIAogICAgIC8vIE1lbnUgdG8gc2hvdyB0aGUgdGVzdCBwcm9ncmVzcwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRU5VX0lEX1BST0dSRVNTID0gTWVudS5GSVJTVCArIDE7CiAKKyAgICBwcml2YXRlIGNsYXNzIENhbWVyYUNvbWJpbmF0aW9uIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUNhbWVyYUluZGV4OworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtUmVzb2x1dGlvbkluZGV4OworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtRm9ybWF0SW5kZXg7CisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1SZXNvbHV0aW9uV2lkdGg7CisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1SZXNvbHV0aW9uSGVpZ2h0OworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtRm9ybWF0TmFtZTsKKworICAgICAgICBwcml2YXRlIENhbWVyYUNvbWJpbmF0aW9uKGludCBjYW1lcmFJbmRleCwgaW50IHJlc29sdXRpb25JbmRleCwgaW50IGZvcm1hdEluZGV4LAorICAgICAgICAgICAgaW50IHJlc29sdXRpb25XaWR0aCwgaW50IHJlc29sdXRpb25IZWlnaHQsIFN0cmluZyBmb3JtYXROYW1lKSB7CisgICAgICAgICAgICB0aGlzLm1DYW1lcmFJbmRleCA9IGNhbWVyYUluZGV4OworICAgICAgICAgICAgdGhpcy5tUmVzb2x1dGlvbkluZGV4ID0gcmVzb2x1dGlvbkluZGV4OworICAgICAgICAgICAgdGhpcy5tRm9ybWF0SW5kZXggPSBmb3JtYXRJbmRleDsKKyAgICAgICAgICAgIHRoaXMubVJlc29sdXRpb25XaWR0aCA9IHJlc29sdXRpb25XaWR0aDsKKyAgICAgICAgICAgIHRoaXMubVJlc29sdXRpb25IZWlnaHQgPSByZXNvbHV0aW9uSGVpZ2h0OworICAgICAgICAgICAgdGhpcy5tRm9ybWF0TmFtZSA9IGZvcm1hdE5hbWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJDYW1lcmEgJWQsICVkeCVkLCAlcyIsCisgICAgICAgICAgICAgICAgbUNhbWVyYUluZGV4LCBtUmVzb2x1dGlvbldpZHRoLCBtUmVzb2x1dGlvbkhlaWdodCwgbUZvcm1hdE5hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tcGFyYXRvcjxDYW1lcmFDb21iaW5hdGlvbj4gQ09NUEFSQVRPUiA9CisgICAgICAgIENvbXBhcmF0b3IuPENhbWVyYUNvbWJpbmF0aW9uLCBJbnRlZ2VyPmNvbXBhcmluZyhjIC0+IGMubUNhbWVyYUluZGV4KQorICAgICAgICAgICAgLnRoZW5Db21wYXJpbmcoYyAtPiBjLm1SZXNvbHV0aW9uSW5kZXgpCisgICAgICAgICAgICAudGhlbkNvbXBhcmluZyhjIC0+IGMubUZvcm1hdEluZGV4KTsKKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKQEAgLTEzMCw3ICsxNjIsNiBAQAogICAgICAgICBTdHJpbmdbXSBjYW1lcmFOYW1lcyA9IG5ldyBTdHJpbmdbbnVtQ2FtZXJhc107CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ2FtZXJhczsgaSsrKSB7CiAgICAgICAgICAgICBjYW1lcmFOYW1lc1tpXSA9ICJDYW1lcmEgIiArIGk7Ci0gICAgICAgICAgICBtVW50ZXN0ZWRDb21iaW5hdGlvbnMuYWRkKCJBbGwgY29tYmluYXRpb25zIGZvciBDYW1lcmEgIiArIGkgKyAiXG4iKTsKICAgICAgICAgfQogICAgICAgICBtQ2FtZXJhU3Bpbm5lciA9IChTcGlubmVyKSBmaW5kVmlld0J5SWQoUi5pZC5jYW1lcmFzX3NlbGVjdGlvbik7CiAgICAgICAgIG1DYW1lcmFTcGlubmVyLnNldEFkYXB0ZXIoCkBAIC0xNzEsNiArMjAyLDM1IEBACiAgICAgICAgIHlUb3RhbC5zZXRDb25jYXQoeTJyLCB5T2Zmc2V0KTsKIAogICAgICAgICBtWXV2MlJnYkZpbHRlciA9IG5ldyBDb2xvck1hdHJpeENvbG9yRmlsdGVyKHlUb3RhbCk7CisKKyAgICAgICAgQnV0dG9uIG1OZXh0QnV0dG9uID0gZmluZFZpZXdCeUlkKFIuaWQubmV4dF9idXR0b24pOworICAgICAgICBtTmV4dEJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIodiAtPiB7CisgICAgICAgICAgICAgICAgc2V0VW50ZXN0ZWRDb21iaW5hdGlvbigpOworICAgICAgICAgICAgICAgIHN0YXJ0UHJldmlldygpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgYW4gdW50ZXN0ZWQgY29tYmluYXRpb24gb2YgcmVzb2x1dGlvbiBhbmQgZm9ybWF0IGZvciB0aGUgY3VycmVudCBjYW1lcmEuCisgICAgICogVHJpZ2dlcmVkIGJ5IG5leHQgYnV0dG9uIGNsaWNrLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXRVbnRlc3RlZENvbWJpbmF0aW9uKCkgeworICAgICAgICBPcHRpb25hbDxDYW1lcmFDb21iaW5hdGlvbj4gY29tYmluYXRpb24gPSBtVW50ZXN0ZWRDb21iaW5hdGlvbnMuc3RyZWFtKCkuZmlsdGVyKAorICAgICAgICAgICAgYyAtPiBjLm1DYW1lcmFJbmRleCA9PSBtQ3VycmVudENhbWVyYUlkKS5maW5kRmlyc3QoKTsKKyAgICAgICAgaWYgKCFjb21iaW5hdGlvbi5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgVG9hc3QubWFrZVRleHQodGhpcywgIkFsbCBDYW1lcmEgIiArIG1DdXJyZW50Q2FtZXJhSWQgKyAiIHRlc3RzIGFyZSBkb25lLiIsCisgICAgICAgICAgICAgICAgVG9hc3QuTEVOR1RIX1NIT1JUKS5zaG93KCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBUaGVyZSBpcyB1bnRlc3RlZCBjb21iaW5hdGlvbiBmb3IgdGhlIGN1cnJlbnQgY2FtZXJhLCBzZXQgdGhlIG5leHQgdW50ZXN0ZWQgY29tYmluYXRpb24uCisgICAgICAgIGludCBtTmV4dFJlc29sdXRpb25JbmRleCA9IGNvbWJpbmF0aW9uLmdldCgpLm1SZXNvbHV0aW9uSW5kZXg7CisgICAgICAgIGludCBtTmV4dEZvcm1hdEluZGV4ID0gY29tYmluYXRpb24uZ2V0KCkubUZvcm1hdEluZGV4OworCisgICAgICAgIG1OZXh0UHJldmlld1NpemUgPSBtUHJldmlld1NpemVzLmdldChtTmV4dFJlc29sdXRpb25JbmRleCk7CisgICAgICAgIG1SZXNvbHV0aW9uU3Bpbm5lci5zZXRTZWxlY3Rpb24obU5leHRSZXNvbHV0aW9uSW5kZXgpOworICAgICAgICBtTmV4dFByZXZpZXdGb3JtYXQgPSBtUHJldmlld0Zvcm1hdHMuZ2V0KG1OZXh0Rm9ybWF0SW5kZXgpOworICAgICAgICBtRm9ybWF0U3Bpbm5lci5zZXRTZWxlY3Rpb24obU5leHRGb3JtYXRJbmRleCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xODMsMTMgKzI0MywxMyBAQAogICAgIHB1YmxpYyBib29sZWFuIG9uT3B0aW9uc0l0ZW1TZWxlY3RlZChNZW51SXRlbSBpdGVtKSB7CiAgICAgICAgIGJvb2xlYW4gcmV0ID0gdHJ1ZTsKICAgICAgICAgc3dpdGNoIChpdGVtLmdldEl0ZW1JZCgpKSB7Ci0gICAgICAgIGNhc2UgTUVOVV9JRF9QUk9HUkVTUzoKLSAgICAgICAgICAgIHNob3dDb21iaW5hdGlvbnNEaWFsb2coKTsKLSAgICAgICAgICAgIHJldCA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldCA9IHN1cGVyLm9uT3B0aW9uc0l0ZW1TZWxlY3RlZChpdGVtKTsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNRU5VX0lEX1BST0dSRVNTOgorICAgICAgICAgICAgICAgIHNob3dDb21iaW5hdGlvbnNEaWFsb2coKTsKKyAgICAgICAgICAgICAgICByZXQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXQgPSBzdXBlci5vbk9wdGlvbnNJdGVtU2VsZWN0ZWQoaXRlbSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CkBAIC0yMjIsMTcgKzI4MiwxOSBAQAogICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGVzdERldGFpbHMoKSB7CiAgICAgICAgIFN0cmluZ0J1aWxkZXIgcmVwb3J0QnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAgICAgICAgIHJlcG9ydEJ1aWxkZXIuYXBwZW5kKCJUZXN0ZWQgY29tYmluYXRpb25zOlxuIik7Ci0gICAgICAgIGZvciAoU3RyaW5nIGNvbWJpbmF0aW9uOiBtVGVzdGVkQ29tYmluYXRpb25zKSB7CisgICAgICAgIGZvciAoQ2FtZXJhQ29tYmluYXRpb24gY29tYmluYXRpb246IG1UZXN0ZWRDb21iaW5hdGlvbnMpIHsKICAgICAgICAgICAgIHJlcG9ydEJ1aWxkZXIuYXBwZW5kKGNvbWJpbmF0aW9uKTsKKyAgICAgICAgICAgIHJlcG9ydEJ1aWxkZXIuYXBwZW5kKCJcbiIpOwogICAgICAgICB9CisKICAgICAgICAgcmVwb3J0QnVpbGRlci5hcHBlbmQoIlVudGVzdGVkIGNvbWJpbmF0aW9uczpcbiIpOwotICAgICAgICBmb3IgKFN0cmluZyBjb21iaW5hdGlvbjogbVVudGVzdGVkQ29tYmluYXRpb25zKSB7CisgICAgICAgIGZvciAoQ2FtZXJhQ29tYmluYXRpb24gY29tYmluYXRpb246IG1VbnRlc3RlZENvbWJpbmF0aW9ucykgewogICAgICAgICAgICAgcmVwb3J0QnVpbGRlci5hcHBlbmQoY29tYmluYXRpb24pOworICAgICAgICAgICAgcmVwb3J0QnVpbGRlci5hcHBlbmQoIlxuIik7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJlcG9ydEJ1aWxkZXIudG9TdHJpbmcoKTsKICAgICB9CiAKLQogICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZVRleHR1cmVBdmFpbGFibGUoU3VyZmFjZVRleHR1cmUgc3VyZmFjZSwKICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCkgewogICAgICAgICBtUHJldmlld1RleHR1cmUgPSBzdXJmYWNlOwpAQCAtMjQwLDcgKzMwMiw3IEBACiAgICAgICAgICAgICAgICAgfHwgbUZvcm1hdFZpZXcuZ2V0TWVhc3VyZWRIZWlnaHQoKSAhPSBoZWlnaHQpIHsKICAgICAgICAgICAgIG1QcmV2aWV3VGV4V2lkdGggPSBtRm9ybWF0Vmlldy5nZXRNZWFzdXJlZFdpZHRoKCk7CiAgICAgICAgICAgICBtUHJldmlld1RleEhlaWdodCA9IG1Gb3JtYXRWaWV3LmdldE1lYXN1cmVkSGVpZ2h0KCk7Ci0gICAgICAgICB9IGVsc2UgeworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbVByZXZpZXdUZXhXaWR0aCA9IHdpZHRoOwogICAgICAgICAgICAgbVByZXZpZXdUZXhIZWlnaHQgPSBoZWlnaHQ7CiAgICAgICAgIH0KQEAgLTMxMCw4ICszNzIsNiBAQAogCiAgICAgICAgICAgICB9OwogCi0KLQogICAgIHByaXZhdGUgdm9pZCBzZXRVcENhbWVyYShpbnQgaWQpIHsKICAgICAgICAgc2h1dGRvd25DYW1lcmEoKTsKIApAQCAtMzMxLDcgKzM5MSw3IEBACiAgICAgICAgICAgICAgICAgaWYgKGxocy5oZWlnaHQgPiByaHMuaGVpZ2h0KSByZXR1cm4gMTsKICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgIH0KLSAgICAgICAgfTsKKyAgICAgICAgfQogCiAgICAgICAgIFNpemVDb21wYXJlIHMgPSBuZXcgU2l6ZUNvbXBhcmUoKTsKICAgICAgICAgVHJlZVNldDxDYW1lcmEuU2l6ZT4gc29ydGVkUmVzb2x1dGlvbnMgPSBuZXcgVHJlZVNldDxDYW1lcmEuU2l6ZT4ocyk7CkBAIC0zNjUsMTMgKzQyNSwxNCBAQAogCiAgICAgICAgIC8vIFVwZGF0ZSB1bnRlc3RlZCBlbnRyaWVzCiAKLSAgICAgICAgbVVudGVzdGVkQ29tYmluYXRpb25zLnJlbW92ZSgiQWxsIGNvbWJpbmF0aW9ucyBmb3IgQ2FtZXJhICIgKyBpZCArICJcbiIpOwotICAgICAgICBmb3IgKENhbWVyYS5TaXplIHByZXZpZXdTaXplOiBtUHJldmlld1NpemVzKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBwcmV2aWV3Rm9ybWF0OiBtUHJldmlld0Zvcm1hdHMpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY29tYmluYXRpb24gPSAiQ2FtZXJhICIgKyBpZCArICIsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgcHJldmlld1NpemUud2lkdGggKyAieCIgKyBwcmV2aWV3U2l6ZS5oZWlnaHQKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgIiArIG1QcmV2aWV3Rm9ybWF0TmFtZXMuZ2V0KHByZXZpZXdGb3JtYXQpCi0gICAgICAgICAgICAgICAgICAgICAgICArICJcbiI7CisgICAgICAgIGZvciAoaW50IHJlc29sdXRpb25JbmRleCA9IDA7IHJlc29sdXRpb25JbmRleCA8IG1QcmV2aWV3U2l6ZXMuc2l6ZSgpOyByZXNvbHV0aW9uSW5kZXgrKykgeworICAgICAgICAgICAgZm9yIChpbnQgZm9ybWF0SW5kZXggPSAwOyBmb3JtYXRJbmRleCA8IG1QcmV2aWV3Rm9ybWF0cy5zaXplKCk7IGZvcm1hdEluZGV4KyspIHsKKyAgICAgICAgICAgICAgICBDYW1lcmFDb21iaW5hdGlvbiBjb21iaW5hdGlvbiA9IG5ldyBDYW1lcmFDb21iaW5hdGlvbigKKyAgICAgICAgICAgICAgICAgICAgaWQsIHJlc29sdXRpb25JbmRleCwgZm9ybWF0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgIG1QcmV2aWV3U2l6ZXMuZ2V0KHJlc29sdXRpb25JbmRleCkud2lkdGgsCisgICAgICAgICAgICAgICAgICAgIG1QcmV2aWV3U2l6ZXMuZ2V0KHJlc29sdXRpb25JbmRleCkuaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICBtUHJldmlld0Zvcm1hdE5hbWVzLmdldChtUHJldmlld0Zvcm1hdHMuZ2V0KGZvcm1hdEluZGV4KSkpOworCiAgICAgICAgICAgICAgICAgaWYgKCFtVGVzdGVkQ29tYmluYXRpb25zLmNvbnRhaW5zKGNvbWJpbmF0aW9uKSkgewogICAgICAgICAgICAgICAgICAgICBtVW50ZXN0ZWRDb21iaW5hdGlvbnMuYWRkKGNvbWJpbmF0aW9uKTsKICAgICAgICAgICAgICAgICB9CkBAIC01NzEsMTQgKzYzMiwyMCBAQAogICAgICAgICAgICAgICAgIG1Gb3JtYXRWaWV3LnNldEltYWdlQml0bWFwKG1DYWxsYmFja0JpdG1hcCk7CiAgICAgICAgICAgICAgICAgaWYgKG1Qcm9jZXNzaW5nRmlyc3RGcmFtZSkgewogICAgICAgICAgICAgICAgICAgICBtUHJvY2Vzc2luZ0ZpcnN0RnJhbWUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvbWJpbmF0aW9uID0gIkNhbWVyYSAiICsgbUN1cnJlbnRDYW1lcmFJZCArICIsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1QcmV2aWV3U2l6ZS53aWR0aCArICJ4IiArIG1QcmV2aWV3U2l6ZS5oZWlnaHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsICIgKyBtUHJldmlld0Zvcm1hdE5hbWVzLmdldChtUHJldmlld0Zvcm1hdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJcbiI7CisKKyAgICAgICAgICAgICAgICAgICAgQ2FtZXJhQ29tYmluYXRpb24gY29tYmluYXRpb24gPSBuZXcgQ2FtZXJhQ29tYmluYXRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudENhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgbVJlc29sdXRpb25TcGlubmVyLmdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICBtRm9ybWF0U3Bpbm5lci5nZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgbVByZXZpZXdTaXplcy5nZXQobVJlc29sdXRpb25TcGlubmVyLmdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCkpLndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgbVByZXZpZXdTaXplcy5nZXQobVJlc29sdXRpb25TcGlubmVyLmdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCkpLmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QcmV2aWV3Rm9ybWF0TmFtZXMuZ2V0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmV2aWV3Rm9ybWF0cy5nZXQobUZvcm1hdFNwaW5uZXIuZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKSkpKTsKKwogICAgICAgICAgICAgICAgICAgICBtVW50ZXN0ZWRDb21iaW5hdGlvbnMucmVtb3ZlKGNvbWJpbmF0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgbVRlc3RlZENvbWJpbmF0aW9ucy5hZGQoY29tYmluYXRpb24pOwogCi0gICAgICAgICAgICAgICAgICAgIGRpc3BsYXlUb2FzdChjb21iaW5hdGlvbi5yZXBsYWNlKCJcbiIsICIiKSk7CisgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlUb2FzdChjb21iaW5hdGlvbi50b1N0cmluZygpKTsKIAogICAgICAgICAgICAgICAgICAgICBpZiAobVRlc3RlZENvbWJpbmF0aW9ucy5zaXplKCkgPT0gbUFsbENvbWJpbmF0aW9uc1NpemUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHNldFBhc3NCdXR0b25FbmFibGVkKHRydWUpOwpAQCAtNjE3LDcgKzY4NCw4IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGRpc3BsYXlUb2FzdChTdHJpbmcgY29tYmluYXRpb24pIHsKLSAgICAgICAgVG9hc3QubWFrZVRleHQodGhpcywgIlwiIiArIGNvbWJpbmF0aW9uICsgIlwiXG4iICsgIiBoYXMgYmVlbiB0ZXN0ZWQuIiwgVG9hc3QuTEVOR1RIX0xPTkcpLnNob3coKTsKKyAgICAgICAgVG9hc3QubWFrZVRleHQodGhpcywgIlwiIiArIGNvbWJpbmF0aW9uICsgIlwiXG4iICsgIiBoYXMgYmVlbiB0ZXN0ZWQuIiwgVG9hc3QuTEVOR1RIX1NIT1JUKQorICAgICAgICAgICAgLnNob3coKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBvblByZXZpZXdGcmFtZShieXRlW10gZGF0YSwgQ2FtZXJhIGNhbWVyYSkgewpkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL2NhbWVyYS9mb3YvUGhvdG9DYXB0dXJlQWN0aXZpdHkuamF2YSBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9jYW1lcmEvZm92L1Bob3RvQ2FwdHVyZUFjdGl2aXR5LmphdmEKaW5kZXggODgzOWQ1Mi4uYjYyNzc5NyAxMDA2NDQKLS0tIGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL2NhbWVyYS9mb3YvUGhvdG9DYXB0dXJlQWN0aXZpdHkuamF2YQorKysgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvY2FtZXJhL2Zvdi9QaG90b0NhcHR1cmVBY3Rpdml0eS5qYXZhCkBAIC0yNiw2ICsyNiw5IEBACiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5DYW1lcmE7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5DYW1lcmEuUGljdHVyZUNhbGxiYWNrOwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuQ2FtZXJhLlNodXR0ZXJDYWxsYmFjazsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FtZXJhQWNjZXNzRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYW1lcmFDaGFyYWN0ZXJpc3RpY3M7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5Qb3dlck1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5Qb3dlck1hbmFnZXIuV2FrZUxvY2s7CkBAIC0xMDQsNiArMTA3LDEzIEBACiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CiAgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmNhbWVyYV9mb3ZfY2FsaWJyYXRpb25fcGhvdG9fY2FwdHVyZSk7CiAKKyAgICAgICAgaW50IGNhbWVyYVRvQmVUZXN0ZWQgPSAwOworICAgICAgICBmb3IgKGludCBjYW1lcmFJZCA9IDA7IGNhbWVyYUlkIDwgQ2FtZXJhLmdldE51bWJlck9mQ2FtZXJhcygpOyArK2NhbWVyYUlkKSB7CisgICAgICAgICAgICBpZiAoIWlzRXh0ZXJuYWxDYW1lcmEoY2FtZXJhSWQpKSB7CisgICAgICAgICAgICAgICAgY2FtZXJhVG9CZVRlc3RlZCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgbVByZXZpZXcgPSAoU3VyZmFjZVZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLmNhbWVyYV9mb3ZfY2FtZXJhX3ByZXZpZXcpOwogICAgICAgICBtU3VyZmFjZUhvbGRlciA9IG1QcmV2aWV3LmdldEhvbGRlcigpOwogICAgICAgICBtU3VyZmFjZUhvbGRlci5hZGRDYWxsYmFjayh0aGlzKTsKQEAgLTEzOSw3ICsxNDksOSBAQAogICAgICAgICAgICAgICAgIG1QcmV2aWV3U2l6ZUNhbWVyYXNUb1Byb2Nlc3MuY2xlYXIoKTsKICAgICAgICAgICAgICAgICBtUHJldmlld1NpemVzID0gIG5ldyBTaXplW0NhbWVyYS5nZXROdW1iZXJPZkNhbWVyYXMoKV07CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgY2FtZXJhSWQgPSAwOyBjYW1lcmFJZCA8IENhbWVyYS5nZXROdW1iZXJPZkNhbWVyYXMoKTsgKytjYW1lcmFJZCkgewotICAgICAgICAgICAgICAgICAgICBtUHJldmlld1NpemVDYW1lcmFzVG9Qcm9jZXNzLmFkZChjYW1lcmFJZCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghaXNFeHRlcm5hbENhbWVyYShjYW1lcmFJZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QcmV2aWV3U2l6ZUNhbWVyYXNUb1Byb2Nlc3MuYWRkKGNhbWVyYUlkKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBzaG93TmV4dERpYWxvZ1RvQ2hvb3NlUHJldmlld1NpemUoKTsKICAgICAgICAgICAgIH0KQEAgLTE4MSw5ICsxOTMsMTkgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uTm90aGluZ1NlbGVjdGVkKEFkYXB0ZXJWaWV3PD8+IGFyZzApIHt9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uTm90aGluZ1NlbGVjdGVkKEFkYXB0ZXJWaWV3PD8+IGFyZzApIHt9CiAgICAgICAgIH0pOworCisgICAgICAgIGlmIChjYW1lcmFUb0JlVGVzdGVkID09IDApIHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgIk5vIGNhbWVyYXMgbmVlZHMgdG8gYmUgdGVzdGVkLiBTZXR0aW5nIHRlc3QgcGFzcy4iKTsKKyAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KHRoaXMsICJObyBjYW1lcmFzIG5lZWRzIHRvIGJlIHRlc3RlZC4gVGVzdCBwYXNzLiIsCisgICAgICAgICAgICAgICAgICAgIFRvYXN0LkxFTkdUSF9MT05HKS5zaG93KCk7CisKKyAgICAgICAgICAgIFRlc3RSZXN1bHQuc2V0UGFzc2VkUmVzdWx0KHRoaXMsIGdldENsYXNzKCkuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAiQWxsIGNhbWVyYXMgYXJlIGV4dGVybmFsLCB0ZXN0IHNraXBwZWQhIik7CisgICAgICAgICAgICBmaW5pc2goKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMTk4LDYgKzIyMCwxMCBAQAogICAgICAgICAgICAgbVN1cHBvcnRlZFJlc29sdXRpb25zID0gbmV3IEFycmF5TGlzdDxTZWxlY3RhYmxlUmVzb2x1dGlvbj4oKTsKICAgICAgICAgICAgIGludCBudW1DYW1lcmFzID0gQ2FtZXJhLmdldE51bWJlck9mQ2FtZXJhcygpOwogICAgICAgICAgICAgZm9yIChpbnQgY2FtZXJhSWQgPSAwOyBjYW1lcmFJZCA8IG51bUNhbWVyYXM7ICsrY2FtZXJhSWQpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNFeHRlcm5hbENhbWVyYShjYW1lcmFJZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgQ2FtZXJhIGNhbWVyYSA9IENhbWVyYS5vcGVuKGNhbWVyYUlkKTsKIAogICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgc3VwcG9ydGVkIHBpY3R1cmUgc2l6ZXMgYW5kIGZpbGwgdGhlIHNwaW5uZXIuCkBAIC01NDgsNCArNTc0LDIzIEBACiAgICAgICAgICAgICBtUHJldmlld09yaWVudGF0aW9uID0gbUpwZWdPcmllbnRhdGlvbjsKICAgICAgICAgfQogICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc0V4dGVybmFsQ2FtZXJhKGludCBjYW1lcmFJZCkgeworICAgICAgICBDYW1lcmFNYW5hZ2VyIG1hbmFnZXIgPSAoQ2FtZXJhTWFuYWdlcikgdGhpcy5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQ0FNRVJBX1NFUlZJQ0UpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RyaW5nIGNhbWVyYUlkU3RyID0gbWFuYWdlci5nZXRDYW1lcmFJZExpc3QoKVtjYW1lcmFJZF07CisgICAgICAgICAgICBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MgY2hhcmFjdGVyaXN0aWNzID0KKyAgICAgICAgICAgICAgICAgICAgbWFuYWdlci5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoY2FtZXJhSWRTdHIpOworCisgICAgICAgICAgICBpZiAoY2hhcmFjdGVyaXN0aWNzLmdldChDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuSU5GT19TVVBQT1JURURfSEFSRFdBUkVfTEVWRUwpID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLklORk9fU1VQUE9SVEVEX0hBUkRXQVJFX0xFVkVMX0VYVEVSTkFMKSB7CisgICAgICAgICAgICAgICAgLy8gRXh0ZXJuYWwgY2FtZXJhIGRvZXNuJ3Qgc3VwcG9ydCBGT1YgaW5mb3JtYXRpb25zCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKENhbWVyYUFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBUb2FzdC5tYWtlVGV4dCh0aGlzLCAiQ291bGQgbm90IGFjY2VzcyBjYW1lcmEgIiArIGNhbWVyYUlkICsKKyAgICAgICAgICAgICAgICAgICAgIjogIiArIGUuZ2V0TWVzc2FnZSgpLCBUb2FzdC5MRU5HVEhfTE9ORykuc2hvdygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvY2FtZXJhL2l0cy9JdHNTZXJpYWxpemVyLmphdmEgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvY2FtZXJhL2l0cy9JdHNTZXJpYWxpemVyLmphdmEKaW5kZXggMmE2YzE0Ni4uZmJkNzUyMiAxMDA2NDQKLS0tIGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL2NhbWVyYS9pdHMvSXRzU2VyaWFsaXplci5qYXZhCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9jYW1lcmEvaXRzL0l0c1NlcmlhbGl6ZXIuamF2YQpAQCAtNTIsNiArNTIsNyBAQAogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKIAogLyoqCiAgKiBDbGFzcyB0byBkZWFsIHdpdGggc2VyaWFsaXppbmcgYW5kIGRlc2VyaWFsaXppbmcgYmV0d2VlbiBKU09OIGFuZCBDYW1lcmEyIG9iamVjdHMuCkBAIC0yNjIsMTQgKzI2MywxOCBAQAogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgIHByaXZhdGUgc3RhdGljIE9iamVjdCBzZXJpYWxpemVMZW5zU2hhZGluZ01hcChMZW5zU2hhZGluZ01hcCBtYXApCiAgICAgICAgICAgICB0aHJvd3Mgb3JnLmpzb24uSlNPTkV4Y2VwdGlvbiB7Ci0gICAgICAgIEpTT05BcnJheSBtYXBPYmogPSBuZXcgSlNPTkFycmF5KCk7CisgICAgICAgIEpTT05PYmplY3QgbWFwT2JqID0gbmV3IEpTT05PYmplY3QoKTsKKyAgICAgICAgSlNPTkFycmF5IG1hcEFyciA9IG5ldyBKU09OQXJyYXkoKTsKICAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbWFwLmdldFJvd0NvdW50KCk7IHJvdysrKSB7CiAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtYXAuZ2V0Q29sdW1uQ291bnQoKTsgY29sKyspIHsKICAgICAgICAgICAgICAgICBmb3IgKGludCBjaCA9IDA7IGNoIDwgNDsgY2grKykgewotICAgICAgICAgICAgICAgICAgICBtYXBPYmoucHV0KG1hcC5nZXRHYWluRmFjdG9yKGNoLCBjb2wsIHJvdykpOworICAgICAgICAgICAgICAgICAgICBtYXBBcnIucHV0KG1hcC5nZXRHYWluRmFjdG9yKGNoLCBjb2wsIHJvdykpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICBtYXBPYmoucHV0KCJ3aWR0aCIsIG1hcC5nZXRDb2x1bW5Db3VudCgpKTsKKyAgICAgICAgbWFwT2JqLnB1dCgiaGVpZ2h0IiwgbWFwLmdldFJvd0NvdW50KCkpOworICAgICAgICBtYXBPYmoucHV0KCJtYXAiLCBtYXBBcnIpOwogICAgICAgICByZXR1cm4gbWFwT2JqOwogICAgIH0KIApAQCAtNDczLDYgKzQ3OCwzNyBAQAogICAgICAgICBpZiAobWQuZ2V0Q2xhc3MoKSA9PSBUb3RhbENhcHR1cmVSZXN1bHQuY2xhc3MpIHsKICAgICAgICAgICAgIGFsbEZpZWxkcyA9IENhcHR1cmVSZXN1bHQuY2xhc3MuZ2V0RGVjbGFyZWRGaWVsZHMoKTsKICAgICAgICAgfQorICAgICAgICBpZiAobWQuZ2V0Q2xhc3MoKSA9PSBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuY2xhc3MpIHsKKyAgICAgICAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGluZm9ybWF0aW9uIG5vdCBzdG9yZWQgaW4gbWV0YWRhdGEga2V5cworICAgICAgICAgICAgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzIGNoYXJzID0gKENhbWVyYUNoYXJhY3RlcmlzdGljcykgbWQ7CisgICAgICAgICAgICBMaXN0PENhbWVyYUNoYXJhY3RlcmlzdGljcy5LZXk8Pz4+IGNoYXJzS2V5cyA9IGNoYXJzLmdldEtleXMoKTsKKyAgICAgICAgICAgIExpc3Q8Q2FwdHVyZVJlcXVlc3QuS2V5PD8+PiByZXF1ZXN0S2V5cyA9IGNoYXJzLmdldEF2YWlsYWJsZUNhcHR1cmVSZXF1ZXN0S2V5cygpOworICAgICAgICAgICAgU2V0PFN0cmluZz4gcGh5c2ljYWxDYW1JZHMgPSBjaGFycy5nZXRQaHlzaWNhbENhbWVyYUlkcygpOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEpTT05BcnJheSBjaGFyS2V5c0FyciA9IG5ldyBKU09OQXJyYXkoKTsKKyAgICAgICAgICAgICAgICBmb3IgKENhbWVyYUNoYXJhY3RlcmlzdGljcy5LZXk8Pz4gayA6IGNoYXJzS2V5cykgeworICAgICAgICAgICAgICAgICAgICBjaGFyS2V5c0Fyci5wdXQoay5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBKU09OQXJyYXkgcmVxS2V5c0FyciA9IG5ldyBKU09OQXJyYXkoKTsKKyAgICAgICAgICAgICAgICBmb3IgKENhcHR1cmVSZXF1ZXN0LktleTw/PiBrIDogcmVxdWVzdEtleXMpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVxS2V5c0Fyci5wdXQoay5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBBdm9pZCB1c2luZyB0aGUgaGlkZGVuIG1ldGFkYXRhIGtleSBuYW1lIGhlcmUgdG8gcHJldmVudCBjb25mbGljdGlvbgorICAgICAgICAgICAgICAgIGpzb25PYmoucHV0KCJjYW1lcmEuY2hhcmFjdGVyaXN0aWNzLmtleXMiLCBjaGFyS2V5c0Fycik7CisgICAgICAgICAgICAgICAganNvbk9iai5wdXQoImNhbWVyYS5jaGFyYWN0ZXJpc3RpY3MucmVxdWVzdEtleXMiLCByZXFLZXlzQXJyKTsKKworICAgICAgICAgICAgICAgIGlmICghcGh5c2ljYWxDYW1JZHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIEpTT05BcnJheSBwaHlzQ2FtSWRzQXJyID0gbmV3IEpTT05BcnJheSgpOworICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBpZCA6IHBoeXNpY2FsQ2FtSWRzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwaHlzQ2FtSWRzQXJyLnB1dChpZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAganNvbk9iai5wdXQoImNhbWVyYS5jaGFyYWN0ZXJpc3RpY3MucGh5c2ljYWxDYW1JZHMiLCBwaHlzQ2FtSWRzQXJyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChvcmcuanNvbi5KU09ORXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSXRzRXhjZXB0aW9uKCJKU09OIGVycm9yIGZvciBDYW1lcmFDaGFyYWN0ZXJpc3RpY3M6IiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgZm9yIChGaWVsZCBmaWVsZCA6IGFsbEZpZWxkcykgewogICAgICAgICAgICAgaWYgKE1vZGlmaWVyLmlzUHVibGljKGZpZWxkLmdldE1vZGlmaWVycygpKSAmJgogICAgICAgICAgICAgICAgICAgICBNb2RpZmllci5pc1N0YXRpYyhmaWVsZC5nZXRNb2RpZmllcnMoKSkgJiYKQEAgLTY3Myw2ICs3MDksMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyci5nZXRKU09OT2JqZWN0KGkpLmdldEludCgiZGVub21pbmF0b3IiKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBuZXcgQ29sb3JTcGFjZVRyYW5zZm9ybShhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXlUeXBlID09IFRvbmVtYXBDdXJ2ZS5jbGFzcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNPTk9iamVjdCBvYmogPSBqc29uUmVxLm9wdEpTT05PYmplY3Qoa2V5TmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZXNbXSA9IHsicmVkIiwgImdyZWVuIiwgImJsdWUifTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0W11bXSBjdXJ2ZXMgPSBuZXcgZmxvYXRbM11bXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGNoID0gMDsgY2ggPCAzOyBjaCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNPTkFycmF5IGphID0gb2JqLmdldEpTT05BcnJheShuYW1lc1tjaF0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnZlc1tjaF0gPSBuZXcgZmxvYXRbamEubGVuZ3RoKCldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgamEubGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5zZXQoY3VydmVzW2NoXSwgaSwgKGZsb2F0KWphLmdldERvdWJsZShpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gbmV3IFRvbmVtYXBDdXJ2ZShjdXJ2ZXNbMF0sIGN1cnZlc1sxXSwgY3VydmVzWzJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXlUeXBlIGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFR5cGUgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBhcmFtZXRlcml6ZWRUeXBlKWtleVR5cGUpLmdldFJhd1R5cGUoKSA9PSBSYW5nZS5jbGFzcyAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUGFyYW1ldGVyaXplZFR5cGUpa2V5VHlwZSkuZ2V0QWN0dWFsVHlwZUFyZ3VtZW50cygpLmxlbmd0aCA9PSAxICYmCmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvY2FtZXJhL2l0cy9JdHNTZXJ2aWNlLmphdmEgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvY2FtZXJhL2l0cy9JdHNTZXJ2aWNlLmphdmEKaW5kZXggYmQ5ZWJkYS4uZmUxYzBlZCAxMDA2NDQKLS0tIGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL2NhbWVyYS9pdHMvSXRzU2VydmljZS5qYXZhCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9jYW1lcmEvaXRzL0l0c1NlcnZpY2UuamF2YQpAQCAtMTYsNiArMTYsOSBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5jYW1lcmEuaXRzOwogCitpbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uOworaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbkNoYW5uZWw7CitpbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmFwcC5TZXJ2aWNlOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CkBAIC0zMiw2ICszNSw3IEBACiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLlRvdGFsQ2FwdHVyZVJlc3VsdDsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIucGFyYW1zLklucHV0Q29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIucGFyYW1zLk1ldGVyaW5nUmVjdGFuZ2xlOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5wYXJhbXMuT3V0cHV0Q29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvcjsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvckV2ZW50OwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuU2Vuc29yRXZlbnRMaXN0ZW5lcjsKQEAgLTUxLDYgKzU1LDcgQEAKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5SYXRpb25hbDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU2l6ZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2U7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5leC5jYW1lcmEyLmJsb2NraW5nLkJsb2NraW5nQ2FtZXJhTWFuYWdlcjsKQEAgLTU5LDYgKzY0LDcgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5leC5jYW1lcmEyLmJsb2NraW5nLkJsb2NraW5nU2Vzc2lvbkNhbGxiYWNrOwogCiBpbXBvcnQgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLmNhbWVyYS5pdHMuU3RhdHNJbWFnZTsKK2ltcG9ydCBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIuUjsKIAogaW1wb3J0IG9yZy5qc29uLkpTT05BcnJheTsKIGltcG9ydCBvcmcuanNvbi5KU09OT2JqZWN0OwpAQCAtODAsOCArODYsMTAgQEAKIGltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQmxvY2tpbmdRdWV1ZTsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5MaW5rZWRCbG9ja2luZ0RlcXVlOwpAQCAtOTMsNiArMTAxLDkgQEAKIHB1YmxpYyBjbGFzcyBJdHNTZXJ2aWNlIGV4dGVuZHMgU2VydmljZSBpbXBsZW1lbnRzIFNlbnNvckV2ZW50TGlzdGVuZXIgewogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IEl0c1NlcnZpY2UuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOwogCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgU0VSVklDRV9OT1RJRklDQVRJT05fSUQgPSAzNzsgLy8gcmFuZG9tIGludCB0aGF0IGlzIHVuaXF1ZSB3aXRoaW4gYXBwCisgICAgcHJpdmF0ZSBOb3RpZmljYXRpb25DaGFubmVsIG1DaGFubmVsOworCiAgICAgLy8gVGltZW91dHMsIGluIHNlY29uZHMuCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRJTUVPVVRfQ0FMTEJBQ0sgPSAyMDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVElNRU9VVF8zQSA9IDEwOwpAQCAtMTM1LDYgKzE0Niw3IEBACiAgICAgcHJpdmF0ZSBDYW1lcmFEZXZpY2UgbUNhbWVyYSA9IG51bGw7CiAgICAgcHJpdmF0ZSBDYW1lcmFDYXB0dXJlU2Vzc2lvbiBtU2Vzc2lvbiA9IG51bGw7CiAgICAgcHJpdmF0ZSBJbWFnZVJlYWRlcltdIG1PdXRwdXRJbWFnZVJlYWRlcnMgPSBudWxsOworICAgIHByaXZhdGUgU3BhcnNlQXJyYXk8U3RyaW5nPiBtUGh5c2ljYWxTdHJlYW1NYXAgPSBuZXcgU3BhcnNlQXJyYXk8U3RyaW5nPigpOwogICAgIHByaXZhdGUgSW1hZ2VSZWFkZXIgbUlucHV0SW1hZ2VSZWFkZXIgPSBudWxsOwogICAgIHByaXZhdGUgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzIG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3MgPSBudWxsOwogCkBAIC0xNzQsNyArMTg2LDggQEAKICAgICBwcml2YXRlIENhcHR1cmVSZXN1bHQgbUNhcHR1cmVSZXN1bHRzW10gPSBudWxsOwogCiAgICAgcHJpdmF0ZSB2b2xhdGlsZSBDb25kaXRpb25WYXJpYWJsZSBtSW50ZXJsb2NrM0EgPSBuZXcgQ29uZGl0aW9uVmFyaWFibGUodHJ1ZSk7Ci0gICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIG1Jc3N1ZWRSZXF1ZXN0M0EgPSBmYWxzZTsKKworICAgIGZpbmFsIE9iamVjdCBtM0FTdGF0ZUxvY2sgPSBuZXcgT2JqZWN0KCk7CiAgICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIG1Db252ZXJnZWRBRSA9IGZhbHNlOwogICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBtQ29udmVyZ2VkQUYgPSBmYWxzZTsKICAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gbUNvbnZlcmdlZEFXQiA9IGZhbHNlOwpAQCAtMjAxLDggKzIxNCwxMSBAQAogICAgIHByaXZhdGUgSGFuZGxlclRocmVhZCBtU2Vuc29yVGhyZWFkID0gbnVsbDsKICAgICBwcml2YXRlIEhhbmRsZXIgbVNlbnNvckhhbmRsZXIgPSBudWxsOwogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFUklBTElaRVJfU1VSRkFDRVNfSUQgPSAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRVJJQUxJWkVSX1BIWVNJQ0FMX01FVEFEQVRBX0lEID0gMzsKKwogICAgIHB1YmxpYyBpbnRlcmZhY2UgQ2FwdHVyZUNhbGxiYWNrIHsKLSAgICAgICAgdm9pZCBvbkNhcHR1cmVBdmFpbGFibGUoSW1hZ2UgY2FwdHVyZSk7CisgICAgICAgIHZvaWQgb25DYXB0dXJlQXZhaWxhYmxlKEltYWdlIGNhcHR1cmUsIFN0cmluZyBwaHlzaWNhbENhbWVyYUlkKTsKICAgICB9CiAKICAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2FwdHVyZVJlc3VsdExpc3RlbmVyIGV4dGVuZHMgQ2FtZXJhQ2FwdHVyZVNlc3Npb24uQ2FwdHVyZUNhbGxiYWNrIHt9CkBAIC0yNzAsNiArMjg2LDE1IEBACiAgICAgICAgIH0gY2F0Y2ggKEl0c0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBMb2d0LmUoVEFHLCAiU2VydmljZSBmYWlsZWQgdG8gc3RhcnQ6ICIsIGUpOwogICAgICAgICB9CisKKyAgICAgICAgTm90aWZpY2F0aW9uTWFuYWdlciBub3RpZmljYXRpb25NYW5hZ2VyID0KKyAgICAgICAgICAgICAgICAoTm90aWZpY2F0aW9uTWFuYWdlcikgZ2V0U3lzdGVtU2VydmljZShDb250ZXh0Lk5PVElGSUNBVElPTl9TRVJWSUNFKTsKKyAgICAgICAgbUNoYW5uZWwgPSBuZXcgTm90aWZpY2F0aW9uQ2hhbm5lbCgKKyAgICAgICAgICAgICAgICAiSXRzU2VydmljZUNoYW5uZWwiLCAiSXRzU2VydmljZSIsIE5vdGlmaWNhdGlvbk1hbmFnZXIuSU1QT1JUQU5DRV9MT1cpOworICAgICAgICAvLyBDb25maWd1cmUgdGhlIG5vdGlmaWNhdGlvbiBjaGFubmVsLgorICAgICAgICBtQ2hhbm5lbC5zZXREZXNjcmlwdGlvbigiSXRzU2VydmljZUNoYW5uZWwiKTsKKyAgICAgICAgbUNoYW5uZWwuZW5hYmxlVmlicmF0aW9uKGZhbHNlKTsKKyAgICAgICAgbm90aWZpY2F0aW9uTWFuYWdlci5jcmVhdGVOb3RpZmljYXRpb25DaGFubmVsKG1DaGFubmVsKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTI4NSw2ICszMTAsMTMgQEAKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgTG9ndC5lKFRBRywgIlN0YXJ0aW5nIEl0c1NlcnZpY2UgaW4gYmFkIHN0YXRlIik7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24gPSBuZXcgTm90aWZpY2F0aW9uLkJ1aWxkZXIodGhpcywgbUNoYW5uZWwuZ2V0SWQoKSkKKyAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnRUaXRsZSgiQ2FtZXJhSVRTIFNlcnZpY2UiKQorICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudFRleHQoIkNhbWVyYUlUUyBTZXJ2aWNlIGlzIHJ1bm5pbmciKQorICAgICAgICAgICAgICAgICAgICAuc2V0U21hbGxJY29uKFIuZHJhd2FibGUuaWNvbikKKyAgICAgICAgICAgICAgICAgICAgLnNldE9uZ29pbmcodHJ1ZSkuYnVpbGQoKTsKKyAgICAgICAgICAgIHN0YXJ0Rm9yZWdyb3VuZChTRVJWSUNFX05PVElGSUNBVElPTl9JRCwgbm90aWZpY2F0aW9uKTsKICAgICAgICAgfSBjYXRjaCAoamF2YS5sYW5nLkludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIExvZ3QuZShUQUcsICJFcnJvciBzdGFydGluZyBJdHNTZXJ2aWNlIChpbnRlcnJ1cHRlZCkiLCBlKTsKICAgICAgICAgfQpAQCAtMzE0LDE3ICszNDYsMTYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIG9wZW5DYW1lcmFEZXZpY2UoaW50IGNhbWVyYUlkKSB0aHJvd3MgSXRzRXhjZXB0aW9uIHsKLSAgICAgICAgTG9ndC5pKFRBRywgU3RyaW5nLmZvcm1hdCgiT3BlbmluZyBjYW1lcmEgJWQiLCBjYW1lcmFJZCkpOworICAgIHB1YmxpYyB2b2lkIG9wZW5DYW1lcmFEZXZpY2UoU3RyaW5nIGNhbWVyYUlkKSB0aHJvd3MgSXRzRXhjZXB0aW9uIHsKKyAgICAgICAgTG9ndC5pKFRBRywgU3RyaW5nLmZvcm1hdCgiT3BlbmluZyBjYW1lcmEgJXMiLCBjYW1lcmFJZCkpOwogCi0gICAgICAgIFN0cmluZ1tdIGRldmljZXM7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBkZXZpY2VzID0gbUNhbWVyYU1hbmFnZXIuZ2V0Q2FtZXJhSWRMaXN0KCk7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlcyA9PSBudWxsIHx8IGRldmljZXMubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSXRzRXhjZXB0aW9uKCJObyBjYW1lcmEgZGV2aWNlcyIpOwotICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG1NZW1vcnlRdW90YSA9PSAtMSkgewogICAgICAgICAgICAgICAgIC8vIEluaXRpYWxpemUgbWVtb3J5IHF1b3RhIG9uIHRoaXMgZGV2aWNlCisgICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGRldmljZXMgPSBJdHNVdGlscy5nZXRJdHNDb21wYXRpYmxlQ2FtZXJhSWRzKG1DYW1lcmFNYW5hZ2VyKTsKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSXRzRXhjZXB0aW9uKCJObyBjYW1lcmEgZGV2aWNlcyIpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBjYW1JZCA6IGRldmljZXMpIHsKICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzIGNoYXJzID0gIG1DYW1lcmFNYW5hZ2VyLmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjYW1JZCk7CiAgICAgICAgICAgICAgICAgICAgIFNpemUgbWF4WXV2U2l6ZSA9IEl0c1V0aWxzLmdldE1heE91dHB1dFNpemUoCkBAIC0zNDEsMTAgKzM3Miw4IEBACiAgICAgICAgIH0KIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgbUNhbWVyYSA9IG1CbG9ja2luZ0NhbWVyYU1hbmFnZXIub3BlbkNhbWVyYShkZXZpY2VzW2NhbWVyYUlkXSwKLSAgICAgICAgICAgICAgICAgICAgbUNhbWVyYUxpc3RlbmVyLCBtQ2FtZXJhSGFuZGxlcik7Ci0gICAgICAgICAgICBtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzID0gbUNhbWVyYU1hbmFnZXIuZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKAotICAgICAgICAgICAgICAgICAgICBkZXZpY2VzW2NhbWVyYUlkXSk7CisgICAgICAgICAgICBtQ2FtZXJhID0gbUJsb2NraW5nQ2FtZXJhTWFuYWdlci5vcGVuQ2FtZXJhKGNhbWVyYUlkLCBtQ2FtZXJhTGlzdGVuZXIsIG1DYW1lcmFIYW5kbGVyKTsKKyAgICAgICAgICAgIG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3MgPSBtQ2FtZXJhTWFuYWdlci5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoY2FtZXJhSWQpOwogICAgICAgICAgICAgbVNvY2tldFF1ZXVlUXVvdGEgPSBuZXcgU2VtYXBob3JlKG1NZW1vcnlRdW90YSwgdHJ1ZSk7CiAgICAgICAgIH0gY2F0Y2ggKENhbWVyYUFjY2Vzc0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSXRzRXhjZXB0aW9uKCJGYWlsZWQgdG8gb3BlbiBjYW1lcmEiLCBlKTsKQEAgLTM5NSw5ICs0MjQsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc29uT2JqLnB1dCgiY2FwdHVyZVJlc3VsdCIsIEl0c1NlcmlhbGl6ZXIuc2VyaWFsaXplKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENhcHR1cmVSZXN1bHQpb2JqKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEpTT05BcnJheSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzb25PYmoucHV0KCJvdXRwdXRzIiwgKEpTT05BcnJheSlvYmopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWcgPT0gImNhcHR1cmVSZXN1bHRzIikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSBTRVJJQUxJWkVSX1NVUkZBQ0VTX0lEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc29uT2JqLnB1dCgib3V0cHV0cyIsIChKU09OQXJyYXkpb2JqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpID09IFNFUklBTElaRVJfUEhZU0lDQUxfTUVUQURBVEFfSUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzb25PYmoucHV0KCJwaHlzaWNhbFJlc3VsdHMiLCAoSlNPTkFycmF5KW9iaik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSXRzRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5zdXBwb3J0ZWQgSlNPTkFycmF5IGZvciBjYXB0dXJlUmVzdWx0cyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganNvbk9iai5wdXQoIm91dHB1dHMiLCAoSlNPTkFycmF5KW9iaik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSXRzRXhjZXB0aW9uKCJJbnZhbGlkIG9iamVjdCByZWNlaXZlZCBmb3Igc2VyaWFsaWF0aW9uIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEl0c0V4Y2VwdGlvbigiSW52YWxpZCBvYmplY3QgcmVjZWl2ZWQgZm9yIHNlcmlhbGl6YXRpb24iKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpZiAodGFnID09IG51bGwpIHsKQEAgLTYwMywxMiArNjQzLDE0IEBACiAgICAgICAgICAgICAgICAgSlNPTk9iamVjdCBjbWRPYmogPSBuZXcgSlNPTk9iamVjdChjbWQpOwogICAgICAgICAgICAgICAgIExvZ3QuaShUQUcsICJTdGFydCBwcm9jZXNzaW5nIGNvbW1hbmQiICsgY21kT2JqLmdldFN0cmluZygiY21kTmFtZSIpKTsKICAgICAgICAgICAgICAgICBpZiAoIm9wZW4iLmVxdWFscyhjbWRPYmouZ2V0U3RyaW5nKCJjbWROYW1lIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjYW1lcmFJZCA9IGNtZE9iai5nZXRJbnQoImNhbWVyYUlkIik7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjYW1lcmFJZCA9IGNtZE9iai5nZXRTdHJpbmcoImNhbWVyYUlkIik7CiAgICAgICAgICAgICAgICAgICAgIG9wZW5DYW1lcmFEZXZpY2UoY2FtZXJhSWQpOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoImNsb3NlIi5lcXVhbHMoY21kT2JqLmdldFN0cmluZygiY21kTmFtZSIpKSkgewogICAgICAgICAgICAgICAgICAgICBjbG9zZUNhbWVyYURldmljZSgpOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoImdldENhbWVyYVByb3BlcnRpZXMiLmVxdWFscyhjbWRPYmouZ2V0U3RyaW5nKCJjbWROYW1lIikpKSB7CiAgICAgICAgICAgICAgICAgICAgIGRvR2V0UHJvcHMoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJnZXRDYW1lcmFQcm9wZXJ0aWVzQnlJZCIuZXF1YWxzKGNtZE9iai5nZXRTdHJpbmcoImNtZE5hbWUiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZG9HZXRQcm9wc0J5SWQoY21kT2JqKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJzdGFydFNlbnNvckV2ZW50cyIuZXF1YWxzKGNtZE9iai5nZXRTdHJpbmcoImNtZE5hbWUiKSkpIHsKICAgICAgICAgICAgICAgICAgICAgZG9TdGFydFNlbnNvckV2ZW50cygpOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoImNoZWNrU2Vuc29yRXhpc3RlbmNlIi5lcXVhbHMoY21kT2JqLmdldFN0cmluZygiY21kTmFtZSIpKSkgewpAQCAtNzI3LDcgKzc2OSw3IEBACiAKICAgICAgICAgcHVibGljIHZvaWQgc2VuZFJlc3BvbnNlQ2FwdHVyZVJlc3VsdChDYW1lcmFDaGFyYWN0ZXJpc3RpY3MgcHJvcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FwdHVyZVJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXB0dXJlUmVzdWx0IHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb3RhbENhcHR1cmVSZXN1bHQgcmVzdWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltYWdlUmVhZGVyW10gcmVhZGVycykKICAgICAgICAgICAgICAgICB0aHJvd3MgSXRzRXhjZXB0aW9uIHsKICAgICAgICAgICAgIHRyeSB7CkBAIC03NjUsMTIgKzgwNywxOSBAQAogICAgICAgICAgICAgICAgICAgICBqc29uU3VyZmFjZXMucHV0KGpzb25TdXJmYWNlKTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBPYmplY3Qgb2Jqc1tdID0gbmV3IE9iamVjdFs1XTsKKyAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBDYXB0dXJlUmVzdWx0PiBwaHlzaWNhbE1ldGFkYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXRQaHlzaWNhbENhbWVyYVJlc3VsdHMoKTsKKyAgICAgICAgICAgICAgICBKU09OQXJyYXkganNvblBoeXNpY2FsTWV0YWRhdGEgPSBuZXcgSlNPTkFycmF5KCk7CisgICAgICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBDYXB0dXJlUmVzdWx0PiBwYWlyIDogcGh5c2ljYWxNZXRhZGF0YS5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICAgICAgICAgIEpTT05PYmplY3QganNvbk9uZU1ldGFkYXRhID0gbmV3IEpTT05PYmplY3QoKTsKKyAgICAgICAgICAgICAgICAgICAganNvbk9uZU1ldGFkYXRhLnB1dChwYWlyLmdldEtleSgpLCBJdHNTZXJpYWxpemVyLnNlcmlhbGl6ZShwYWlyLmdldFZhbHVlKCkpKTsKKyAgICAgICAgICAgICAgICAgICAganNvblBoeXNpY2FsTWV0YWRhdGEucHV0KGpzb25PbmVNZXRhZGF0YSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIE9iamVjdCBvYmpzW10gPSBuZXcgT2JqZWN0WzRdOwogICAgICAgICAgICAgICAgIG9ianNbMF0gPSAiY2FwdHVyZVJlc3VsdHMiOwotICAgICAgICAgICAgICAgIG9ianNbMV0gPSBwcm9wczsKLSAgICAgICAgICAgICAgICBvYmpzWzJdID0gcmVxdWVzdDsKLSAgICAgICAgICAgICAgICBvYmpzWzNdID0gcmVzdWx0OwotICAgICAgICAgICAgICAgIG9ianNbNF0gPSBqc29uU3VyZmFjZXM7CisgICAgICAgICAgICAgICAgb2Jqc1sxXSA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICBvYmpzW1NFUklBTElaRVJfU1VSRkFDRVNfSURdID0ganNvblN1cmZhY2VzOworICAgICAgICAgICAgICAgIG9ianNbU0VSSUFMSVpFUl9QSFlTSUNBTF9NRVRBREFUQV9JRF0gPSBqc29uUGh5c2ljYWxNZXRhZGF0YTsKICAgICAgICAgICAgICAgICBtU2VyaWFsaXplclF1ZXVlLnB1dChvYmpzKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKG9yZy5qc29uLkpTT05FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJdHNFeGNlcHRpb24oIkpTT04gZXJyb3I6ICIsIGUpOwpAQCAtNzg4LDcgKzgzNywxMyBAQAogICAgICAgICAgICAgICAgIEltYWdlIGkgPSBudWxsOwogICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgIGkgPSByZWFkZXIuYWNxdWlyZU5leHRJbWFnZSgpOwotICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5vbkNhcHR1cmVBdmFpbGFibGUoaSk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwaHlzaWNhbENhbWVyYUlkID0gbmV3IFN0cmluZygpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpZHggPSAwOyBpZHggPCBtT3V0cHV0SW1hZ2VSZWFkZXJzLmxlbmd0aDsgaWR4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtT3V0cHV0SW1hZ2VSZWFkZXJzW2lkeF0gPT0gcmVhZGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZCA9IG1QaHlzaWNhbFN0cmVhbU1hcC5nZXQoaWR4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5vbkNhcHR1cmVBdmFpbGFibGUoaSwgcGh5c2ljYWxDYW1lcmFJZCk7CiAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGkgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgaS5jbG9zZSgpOwpAQCAtODQwLDkgKzg5NSwxMiBAQAogICAgICAgICBtU29ja2V0UnVubmFibGVPYmouc2VuZFJlc3BvbnNlKG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3MpOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBkb0dldENhbWVyYUlkcygpIHRocm93cyBJdHNFeGNlcHRpb24geworICAgIHByaXZhdGUgdm9pZCBkb0dldFByb3BzQnlJZChKU09OT2JqZWN0IHBhcmFtcykgdGhyb3dzIEl0c0V4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZ1tdIGRldmljZXM7CiAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBJbnRlbnRpb25hbGx5IG5vdCB1c2luZyBJdHNVdGlscy5nZXRJdHNDb21wYXRpYmxlQ2FtZXJhSWRzIGhlcmUgc28gaXQncyBwb3NzaWJsZSB0bworICAgICAgICAgICAgLy8gd3JpdGUgc29tZSBzaW1wbGUgc2NyaXB0IHRvIHF1ZXJ5IGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MgZXZlbiBmb3IgZGV2aWNlcyBleGVtcHRlZAorICAgICAgICAgICAgLy8gZnJvbSBJVFMgdG9kYXkuCiAgICAgICAgICAgICBkZXZpY2VzID0gbUNhbWVyYU1hbmFnZXIuZ2V0Q2FtZXJhSWRMaXN0KCk7CiAgICAgICAgICAgICBpZiAoZGV2aWNlcyA9PSBudWxsIHx8IGRldmljZXMubGVuZ3RoID09IDApIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSXRzRXhjZXB0aW9uKCJObyBjYW1lcmEgZGV2aWNlcyIpOwpAQCAtODUyLDIzICs5MTAsMzggQEAKICAgICAgICAgfQogCiAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmcgY2FtZXJhSWQgPSBwYXJhbXMuZ2V0U3RyaW5nKCJjYW1lcmFJZCIpOworICAgICAgICAgICAgaWYgKEFycmF5cy5hc0xpc3QoZGV2aWNlcykuY29udGFpbnMoY2FtZXJhSWQpKSB7CisgICAgICAgICAgICAgICAgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzIGNoYXJhY3RlcmlzdGljcyA9CisgICAgICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhTWFuYWdlci5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoY2FtZXJhSWQpOworICAgICAgICAgICAgICAgIG1Tb2NrZXRSdW5uYWJsZU9iai5zZW5kUmVzcG9uc2UoY2hhcmFjdGVyaXN0aWNzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiSW52YWxpZCBjYW1lcmEgSUQ6ICIgKyBjYW1lcmFJZCk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEl0c0V4Y2VwdGlvbigiSW52YWxpZCBjYW1lcmFJZDoiICsgY2FtZXJhSWQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChvcmcuanNvbi5KU09ORXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJdHNFeGNlcHRpb24oIkpTT04gZXJyb3I6ICIsIGUpOworICAgICAgICB9IGNhdGNoIChDYW1lcmFBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEl0c0V4Y2VwdGlvbigiQWNjZXNzIGVycm9yOiAiLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkb0dldENhbWVyYUlkcygpIHRocm93cyBJdHNFeGNlcHRpb24geworICAgICAgICBMaXN0PFN0cmluZz4gZGV2aWNlcyA9IEl0c1V0aWxzLmdldEl0c0NvbXBhdGlibGVDYW1lcmFJZHMobUNhbWVyYU1hbmFnZXIpOworICAgICAgICBpZiAoZGV2aWNlcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEl0c0V4Y2VwdGlvbigiTm8gY2FtZXJhIGRldmljZXMiKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBKU09OT2JqZWN0IG9iaiA9IG5ldyBKU09OT2JqZWN0KCk7CiAgICAgICAgICAgICBKU09OQXJyYXkgYXJyYXkgPSBuZXcgSlNPTkFycmF5KCk7CiAgICAgICAgICAgICBmb3IgKFN0cmluZyBpZCA6IGRldmljZXMpIHsKLSAgICAgICAgICAgICAgICBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MgY2hhcmFjdGVyaXN0aWNzID0gbUNhbWVyYU1hbmFnZXIuZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGlkKTsKLSAgICAgICAgICAgICAgICAvLyBPbmx5IHN1cHBseSBjYW1lcmEgSWQgZm9yIG5vbi1sZWdhY3kgY2FtZXJhcyBzaW5jZSBsZWdhY3kgY2FtZXJhIGRvZXMgbm90Ci0gICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBJVFMKLSAgICAgICAgICAgICAgICBpZiAoY2hhcmFjdGVyaXN0aWNzLmdldChDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuSU5GT19TVVBQT1JURURfSEFSRFdBUkVfTEVWRUwpICE9Ci0gICAgICAgICAgICAgICAgICAgICAgICBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuSU5GT19TVVBQT1JURURfSEFSRFdBUkVfTEVWRUxfTEVHQUNZKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFycmF5LnB1dChpZCk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFycmF5LnB1dChpZCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBvYmoucHV0KCJjYW1lcmFJZEFycmF5IiwgYXJyYXkpOwogICAgICAgICAgICAgbVNvY2tldFJ1bm5hYmxlT2JqLnNlbmRSZXNwb25zZSgiY2FtZXJhSWRzIiwgb2JqKTsKICAgICAgICAgfSBjYXRjaCAob3JnLmpzb24uSlNPTkV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSXRzRXhjZXB0aW9uKCJKU09OIGVycm9yOiAiLCBlKTsKLSAgICAgICAgfSBjYXRjaCAoYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYUFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSXRzRXhjZXB0aW9uKCJBY2Nlc3MgZXJyb3I6ICIsIGUpOwogICAgICAgICB9CiAgICAgfQogCkBAIC05MTIsNiArOTg1LDcgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgZG8zQShKU09OT2JqZWN0IHBhcmFtcykgdGhyb3dzIEl0c0V4Y2VwdGlvbiB7CisgICAgICAgIFRocmVlQVJlc3VsdExpc3RlbmVyIHRocmVlQUxpc3RlbmVyID0gbmV3IFRocmVlQVJlc3VsdExpc3RlbmVyKCk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAvLyBTdGFydCBhIDNBIGFjdGlvbiwgYW5kIHdhaXQgZm9yIGl0IHRvIGNvbnZlcmdlLgogICAgICAgICAgICAgLy8gR2V0IHRoZSBjb252ZXJnZWQgdmFsdWVzIGZvciBlYWNoICJBIiwgYW5kIHBhY2thZ2UgaW50byBKU09OIHJlc3VsdCBmb3IgY2FsbGVyLgpAQCAtOTY0LDExICsxMDM4LDYgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIElmIEFFIG9yIEFXQiBsb2NrIGlzIHNwZWNpZmllZCwgdGhlbiB0aGUgM0Egd2lsbCBjb252ZXJnZSBmaXJzdCBhbmQgdGhlbiBsb2NrIHRoZXNlCi0gICAgICAgICAgICAvLyB2YWx1ZXMsIHdhaXRpbmcgdW50aWwgdGhlIEhBTCBoYXMgcmVwb3J0ZWQgdGhhdCB0aGUgbG9jayB3YXMgc3VjY2Vzc2Z1bC4KLSAgICAgICAgICAgIG1OZWVkc0xvY2tlZEFFID0gcGFyYW1zLm9wdEJvb2xlYW4oTE9DS19BRV9LRVksIGZhbHNlKTsKLSAgICAgICAgICAgIG1OZWVkc0xvY2tlZEFXQiA9IHBhcmFtcy5vcHRCb29sZWFuKExPQ0tfQVdCX0tFWSwgZmFsc2UpOwotCiAgICAgICAgICAgICAvLyBBbiBFViBjb21wZW5zYXRpb24gY2FuIGJlIHNwZWNpZmllZCBhcyBwYXJ0IG9mIEFFIGNvbnZlcmdlbmNlLgogICAgICAgICAgICAgaW50IGV2Q29tcCA9IHBhcmFtcy5vcHRJbnQoRVZDT01QX0tFWSwgMCk7CiAgICAgICAgICAgICBpZiAoZXZDb21wICE9IDApIHsKQEAgLTEwMDAsMTIgKzEwNjksMTcgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbUludGVybG9jazNBLm9wZW4oKTsKLSAgICAgICAgICAgIG1Jc3N1ZWRSZXF1ZXN0M0EgPSBmYWxzZTsKLSAgICAgICAgICAgIG1Db252ZXJnZWRBRSA9IGZhbHNlOwotICAgICAgICAgICAgbUNvbnZlcmdlZEFXQiA9IGZhbHNlOwotICAgICAgICAgICAgbUNvbnZlcmdlZEFGID0gZmFsc2U7Ci0gICAgICAgICAgICBtTG9ja2VkQUUgPSBmYWxzZTsKLSAgICAgICAgICAgIG1Mb2NrZWRBV0IgPSBmYWxzZTsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZChtM0FTdGF0ZUxvY2spIHsKKyAgICAgICAgICAgICAgICAvLyBJZiBBRSBvciBBV0IgbG9jayBpcyBzcGVjaWZpZWQsIHRoZW4gdGhlIDNBIHdpbGwgY29udmVyZ2UgZmlyc3QgYW5kIHRoZW4gbG9jayB0aGVzZQorICAgICAgICAgICAgICAgIC8vIHZhbHVlcywgd2FpdGluZyB1bnRpbCB0aGUgSEFMIGhhcyByZXBvcnRlZCB0aGF0IHRoZSBsb2NrIHdhcyBzdWNjZXNzZnVsLgorICAgICAgICAgICAgICAgIG1OZWVkc0xvY2tlZEFFID0gcGFyYW1zLm9wdEJvb2xlYW4oTE9DS19BRV9LRVksIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBtTmVlZHNMb2NrZWRBV0IgPSBwYXJhbXMub3B0Qm9vbGVhbihMT0NLX0FXQl9LRVksIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBtQ29udmVyZ2VkQUUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBtQ29udmVyZ2VkQVdCID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbUNvbnZlcmdlZEFGID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbUxvY2tlZEFFID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbUxvY2tlZEFXQiA9IGZhbHNlOworICAgICAgICAgICAgfQogICAgICAgICAgICAgbG9uZyB0c3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgICAgICAgICAgIGJvb2xlYW4gdHJpZ2dlcmVkQUUgPSBmYWxzZTsKICAgICAgICAgICAgIGJvb2xlYW4gdHJpZ2dlcmVkQUYgPSBmYWxzZTsKQEAgLTEwMjgsNzEgKzExMDIsODMgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbUludGVybG9jazNBLmNsb3NlKCk7CiAKLSAgICAgICAgICAgICAgICAvLyBJZiBub3QgY29udmVyZ2VkIHlldCwgaXNzdWUgYW5vdGhlciBjYXB0dXJlIHJlcXVlc3QuCi0gICAgICAgICAgICAgICAgaWYgKCAgICAgICAoZG9BRSAmJiAoIXRyaWdnZXJlZEFFIHx8ICFtQ29udmVyZ2VkQUUpKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgIW1Db252ZXJnZWRBV0IKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IChkb0FGICYmICghdHJpZ2dlcmVkQUYgfHwgIW1Db252ZXJnZWRBRikpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCAoZG9BRSAmJiBtTmVlZHNMb2NrZWRBRSAmJiAhbUxvY2tlZEFFKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgKG1OZWVkc0xvY2tlZEFXQiAmJiAhbUxvY2tlZEFXQikpIHsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQobTNBU3RhdGVMb2NrKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIG5vdCBjb252ZXJnZWQgeWV0LCBpc3N1ZSBhbm90aGVyIGNhcHR1cmUgcmVxdWVzdC4KKyAgICAgICAgICAgICAgICAgICAgaWYgKCAgICAgICAoZG9BRSAmJiAoIXRyaWdnZXJlZEFFIHx8ICFtQ29udmVyZ2VkQUUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFtQ29udmVyZ2VkQVdCCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGRvQUYgJiYgKCF0cmlnZ2VyZWRBRiB8fCAhbUNvbnZlcmdlZEFGKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoZG9BRSAmJiBtTmVlZHNMb2NrZWRBRSAmJiAhbUxvY2tlZEFFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChtTmVlZHNMb2NrZWRBV0IgJiYgIW1Mb2NrZWRBV0IpKSB7CiAKLSAgICAgICAgICAgICAgICAgICAgLy8gQmFzZWxpbmUgY2FwdHVyZSByZXF1ZXN0IGZvciAzQS4KLSAgICAgICAgICAgICAgICAgICAgQ2FwdHVyZVJlcXVlc3QuQnVpbGRlciByZXEgPSBtQ2FtZXJhLmNyZWF0ZUNhcHR1cmVSZXF1ZXN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbWVyYURldmljZS5URU1QTEFURV9QUkVWSUVXKTsKLSAgICAgICAgICAgICAgICAgICAgcmVxLnNldChDYXB0dXJlUmVxdWVzdC5GTEFTSF9NT0RFLCBDYXB0dXJlUmVxdWVzdC5GTEFTSF9NT0RFX09GRik7Ci0gICAgICAgICAgICAgICAgICAgIHJlcS5zZXQoQ2FwdHVyZVJlcXVlc3QuQ09OVFJPTF9NT0RFLCBDYXB0dXJlUmVxdWVzdC5DT05UUk9MX01PREVfQVVUTyk7Ci0gICAgICAgICAgICAgICAgICAgIHJlcS5zZXQoQ2FwdHVyZVJlcXVlc3QuQ09OVFJPTF9DQVBUVVJFX0lOVEVOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXB0dXJlUmVxdWVzdC5DT05UUk9MX0NBUFRVUkVfSU5URU5UX1BSRVZJRVcpOwotICAgICAgICAgICAgICAgICAgICByZXEuc2V0KENhcHR1cmVSZXF1ZXN0LkNPTlRST0xfQUVfTU9ERSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXB0dXJlUmVxdWVzdC5DT05UUk9MX0FFX01PREVfT04pOwotICAgICAgICAgICAgICAgICAgICByZXEuc2V0KENhcHR1cmVSZXF1ZXN0LkNPTlRST0xfQUVfRVhQT1NVUkVfQ09NUEVOU0FUSU9OLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgcmVxLnNldChDYXB0dXJlUmVxdWVzdC5DT05UUk9MX0FFX0xPQ0ssIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgcmVxLnNldChDYXB0dXJlUmVxdWVzdC5DT05UUk9MX0FFX1JFR0lPTlMsIHJlZ2lvbkFFKTsKLSAgICAgICAgICAgICAgICAgICAgcmVxLnNldChDYXB0dXJlUmVxdWVzdC5DT05UUk9MX0FGX01PREUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FwdHVyZVJlcXVlc3QuQ09OVFJPTF9BRl9NT0RFX0FVVE8pOwotICAgICAgICAgICAgICAgICAgICByZXEuc2V0KENhcHR1cmVSZXF1ZXN0LkNPTlRST0xfQUZfUkVHSU9OUywgcmVnaW9uQUYpOwotICAgICAgICAgICAgICAgICAgICByZXEuc2V0KENhcHR1cmVSZXF1ZXN0LkNPTlRST0xfQVdCX01PREUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FwdHVyZVJlcXVlc3QuQ09OVFJPTF9BV0JfTU9ERV9BVVRPKTsKLSAgICAgICAgICAgICAgICAgICAgcmVxLnNldChDYXB0dXJlUmVxdWVzdC5DT05UUk9MX0FXQl9MT0NLLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlcS5zZXQoQ2FwdHVyZVJlcXVlc3QuQ09OVFJPTF9BV0JfUkVHSU9OUywgcmVnaW9uQVdCKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gSVRTIG9ubHkgdHVybnMgT0lTIG9uIHdoZW4gaXQncyBleHBsaWNpdGx5IHJlcXVlc3RlZAotICAgICAgICAgICAgICAgICAgICByZXEuc2V0KENhcHR1cmVSZXF1ZXN0LkxFTlNfT1BUSUNBTF9TVEFCSUxJWkFUSU9OX01PREUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FwdHVyZVJlcXVlc3QuTEVOU19PUFRJQ0FMX1NUQUJJTElaQVRJT05fTU9ERV9PRkYpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQmFzZWxpbmUgY2FwdHVyZSByZXF1ZXN0IGZvciAzQS4KKyAgICAgICAgICAgICAgICAgICAgICAgIENhcHR1cmVSZXF1ZXN0LkJ1aWxkZXIgcmVxID0gbUNhbWVyYS5jcmVhdGVDYXB0dXJlUmVxdWVzdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhRGV2aWNlLlRFTVBMQVRFX1BSRVZJRVcpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVxLnNldChDYXB0dXJlUmVxdWVzdC5GTEFTSF9NT0RFLCBDYXB0dXJlUmVxdWVzdC5GTEFTSF9NT0RFX09GRik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXEuc2V0KENhcHR1cmVSZXF1ZXN0LkNPTlRST0xfTU9ERSwgQ2FwdHVyZVJlcXVlc3QuQ09OVFJPTF9NT0RFX0FVVE8pOworICAgICAgICAgICAgICAgICAgICAgICAgcmVxLnNldChDYXB0dXJlUmVxdWVzdC5DT05UUk9MX0NBUFRVUkVfSU5URU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXB0dXJlUmVxdWVzdC5DT05UUk9MX0NBUFRVUkVfSU5URU5UX1BSRVZJRVcpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVxLnNldChDYXB0dXJlUmVxdWVzdC5DT05UUk9MX0FFX01PREUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcHR1cmVSZXF1ZXN0LkNPTlRST0xfQUVfTU9ERV9PTik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXEuc2V0KENhcHR1cmVSZXF1ZXN0LkNPTlRST0xfQUVfRVhQT1NVUkVfQ09NUEVOU0FUSU9OLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5zZXQoQ2FwdHVyZVJlcXVlc3QuQ09OVFJPTF9BRV9MT0NLLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXEuc2V0KENhcHR1cmVSZXF1ZXN0LkNPTlRST0xfQUVfUkVHSU9OUywgcmVnaW9uQUUpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVxLnNldChDYXB0dXJlUmVxdWVzdC5DT05UUk9MX0FGX01PREUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcHR1cmVSZXF1ZXN0LkNPTlRST0xfQUZfTU9ERV9BVVRPKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5zZXQoQ2FwdHVyZVJlcXVlc3QuQ09OVFJPTF9BRl9SRUdJT05TLCByZWdpb25BRik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXEuc2V0KENhcHR1cmVSZXF1ZXN0LkNPTlRST0xfQVdCX01PREUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcHR1cmVSZXF1ZXN0LkNPTlRST0xfQVdCX01PREVfQVVUTyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXEuc2V0KENhcHR1cmVSZXF1ZXN0LkNPTlRST0xfQVdCX0xPQ0ssIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5zZXQoQ2FwdHVyZVJlcXVlc3QuQ09OVFJPTF9BV0JfUkVHSU9OUywgcmVnaW9uQVdCKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElUUyBvbmx5IHR1cm5zIE9JUyBvbiB3aGVuIGl0J3MgZXhwbGljaXRseSByZXF1ZXN0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5zZXQoQ2FwdHVyZVJlcXVlc3QuTEVOU19PUFRJQ0FMX1NUQUJJTElaQVRJT05fTU9ERSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FwdHVyZVJlcXVlc3QuTEVOU19PUFRJQ0FMX1NUQUJJTElaQVRJT05fTU9ERV9PRkYpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmIChldkNvbXAgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVxLnNldChDYXB0dXJlUmVxdWVzdC5DT05UUk9MX0FFX0VYUE9TVVJFX0NPTVBFTlNBVElPTiwgZXZDb21wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldkNvbXAgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5zZXQoQ2FwdHVyZVJlcXVlc3QuQ09OVFJPTF9BRV9FWFBPU1VSRV9DT01QRU5TQVRJT04sIGV2Q29tcCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ29udmVyZ2VkQUUgJiYgbU5lZWRzTG9ja2VkQUUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXEuc2V0KENhcHR1cmVSZXF1ZXN0LkNPTlRST0xfQUVfTE9DSywgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNvbnZlcmdlZEFXQiAmJiBtTmVlZHNMb2NrZWRBV0IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXEuc2V0KENhcHR1cmVSZXF1ZXN0LkNPTlRST0xfQVdCX0xPQ0ssIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHRyaWdnZXJpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRyaWdnZXIgQUUgZmlyc3QuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9BRSAmJiAhdHJpZ2dlcmVkQUUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2d0LmkoVEFHLCAiVHJpZ2dlcmluZyBBRSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5zZXQoQ2FwdHVyZVJlcXVlc3QuQ09OVFJPTF9BRV9QUkVDQVBUVVJFX1RSSUdHRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXB0dXJlUmVxdWVzdC5DT05UUk9MX0FFX1BSRUNBUFRVUkVfVFJJR0dFUl9TVEFSVCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcmVkQUUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBBZnRlciBBRSBoYXMgY29udmVyZ2VkLCB0cmlnZ2VyIEFGLgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvQUYgJiYgIXRyaWdnZXJlZEFGICYmICghZG9BRSB8fCAodHJpZ2dlcmVkQUUgJiYgbUNvbnZlcmdlZEFFKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2d0LmkoVEFHLCAiVHJpZ2dlcmluZyBBRiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5zZXQoQ2FwdHVyZVJlcXVlc3QuQ09OVFJPTF9BRl9UUklHR0VSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FwdHVyZVJlcXVlc3QuQ09OVFJPTF9BRl9UUklHR0VSX1NUQVJUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyZWRBRiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcmluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5hZGRUYXJnZXQobU91dHB1dEltYWdlUmVhZGVyc1swXS5nZXRTdXJmYWNlKCkpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJpZ2dlcmluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlbmQgc2luZ2xlIHJlcXVlc3QgZm9yIEFFL0FGIHRyaWdnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbi5jYXB0dXJlKHJlcS5idWlsZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWVBTGlzdGVuZXIsIG1SZXN1bHRIYW5kbGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlIHJlcGVhdGluZyByZXF1ZXN0IGZvciBub24tdHJpZ2dlciByZXF1ZXN0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uLnNldFJlcGVhdGluZ1JlcXVlc3QocmVxLmJ1aWxkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlZUFMaXN0ZW5lciwgbVJlc3VsdEhhbmRsZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbVNvY2tldFJ1bm5hYmxlT2JqLnNlbmRSZXNwb25zZSgiM2FDb252ZXJnZWQiLCAiIik7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2d0LmkoVEFHLCAiM0EgY29udmVyZ2VkIik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtQ29udmVyZ2VkQUUgJiYgbU5lZWRzTG9ja2VkQUUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5zZXQoQ2FwdHVyZVJlcXVlc3QuQ09OVFJPTF9BRV9MT0NLLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAobUNvbnZlcmdlZEFXQiAmJiBtTmVlZHNMb2NrZWRBV0IpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5zZXQoQ2FwdHVyZVJlcXVlc3QuQ09OVFJPTF9BV0JfTE9DSywgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBUcmlnZ2VyIEFFIGZpcnN0LgotICAgICAgICAgICAgICAgICAgICBpZiAoZG9BRSAmJiAhdHJpZ2dlcmVkQUUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZ3QuaShUQUcsICJUcmlnZ2VyaW5nIEFFIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXEuc2V0KENhcHR1cmVSZXF1ZXN0LkNPTlRST0xfQUVfUFJFQ0FQVFVSRV9UUklHR0VSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXB0dXJlUmVxdWVzdC5DT05UUk9MX0FFX1BSRUNBUFRVUkVfVFJJR0dFUl9TVEFSVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyZWRBRSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBBZnRlciBBRSBoYXMgY29udmVyZ2VkLCB0cmlnZ2VyIEFGLgotICAgICAgICAgICAgICAgICAgICBpZiAoZG9BRiAmJiAhdHJpZ2dlcmVkQUYgJiYgKCFkb0FFIHx8ICh0cmlnZ2VyZWRBRSAmJiBtQ29udmVyZ2VkQUUpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9ndC5pKFRBRywgIlRyaWdnZXJpbmcgQUYiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5zZXQoQ2FwdHVyZVJlcXVlc3QuQ09OVFJPTF9BRl9UUklHR0VSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXB0dXJlUmVxdWVzdC5DT05UUk9MX0FGX1RSSUdHRVJfU1RBUlQpOwotICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcmVkQUYgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcmVxLmFkZFRhcmdldChtT3V0cHV0SW1hZ2VSZWFkZXJzWzBdLmdldFN1cmZhY2UoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgbUlzc3VlZFJlcXVlc3QzQSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uLmNhcHR1cmUocmVxLmJ1aWxkKCksIG1DYXB0dXJlUmVzdWx0TGlzdGVuZXIsIG1SZXN1bHRIYW5kbGVyKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtU29ja2V0UnVubmFibGVPYmouc2VuZFJlc3BvbnNlKCIzYUNvbnZlcmdlZCIsICIiKTsKLSAgICAgICAgICAgICAgICAgICAgTG9ndC5pKFRBRywgIjNBIGNvbnZlcmdlZCIpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2ggKGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYW1lcmFBY2Nlc3NFeGNlcHRpb24gZSkgewpAQCAtMTEwMSw2ICsxMTg3LDExIEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgSXRzRXhjZXB0aW9uKCJKU09OIGVycm9yOiAiLCBlKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIG1Tb2NrZXRSdW5uYWJsZU9iai5zZW5kUmVzcG9uc2UoIjNhRG9uZSIsICIiKTsKKyAgICAgICAgICAgIC8vIHN0b3AgbGlzdGVuZXIgZnJvbSB1cGRhdGluZyAzQSBzdGF0ZXMKKyAgICAgICAgICAgIHRocmVlQUxpc3RlbmVyLnN0b3AoKTsKKyAgICAgICAgICAgIGlmIChtU2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVNlc3Npb24uY2xvc2UoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtMTEzMyw2ICsxMjI0LDcgQEAKICAgICAgICAgU2l6ZSBvdXRwdXRTaXplc1tdOwogICAgICAgICBpbnQgb3V0cHV0Rm9ybWF0c1tdOwogICAgICAgICBpbnQgbnVtU3VyZmFjZXMgPSAwOworICAgICAgICBtUGh5c2ljYWxTdHJlYW1NYXAuY2xlYXIoKTsKIAogICAgICAgICBpZiAoanNvbk91dHB1dFNwZWNzICE9IG51bGwpIHsKICAgICAgICAgICAgIHRyeSB7CkBAIC0xMjAxLDYgKzEyOTMsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKGhlaWdodCA8PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSBJdHNVdGlscy5nZXRNYXhTaXplKHNpemVzKS5nZXRIZWlnaHQoKTsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGh5c2ljYWxDYW1lcmFJZCA9IHN1cmZhY2VPYmoub3B0U3RyaW5nKCJwaHlzaWNhbENhbWVyYSIpOworICAgICAgICAgICAgICAgICAgICBpZiAocGh5c2ljYWxDYW1lcmFJZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtUGh5c2ljYWxTdHJlYW1NYXAucHV0KGksIHBoeXNpY2FsQ2FtZXJhSWQpOworICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHN0YXRzIGNvbXB1dGF0aW9uIG9ubHkgYXBwbGllcyB0byB0aGUgYWN0aXZlIGFycmF5IHJlZ2lvbi4KICAgICAgICAgICAgICAgICAgICAgaW50IGFhdyA9IEl0c1V0aWxzLmdldEFjdGl2ZUFycmF5Q3JvcFJlZ2lvbihtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzKS53aWR0aCgpOwpAQCAtMTI1Myw3ICsxMzQ5LDggQEAKIAogICAgICAgICAgICAgICAgIGludCBuZXdDb3VudCA9IG1Db3VudENhbGxiYWNrc1JlbWFpbmluZy5nZXQoKTsKICAgICAgICAgICAgICAgICBpZiAobmV3Q291bnQgPT0gY3VycmVudENvdW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJdHNFeGNlcHRpb24oIk5vIGNhbGxiYWNrIHJlY2VpdmVkIHdpdGhpbiB0aW1lb3V0Iik7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJdHNFeGNlcHRpb24oIk5vIGNhbGxiYWNrIHJlY2VpdmVkIHdpdGhpbiB0aW1lb3V0ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRNcyArICJtcyIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjdXJyZW50Q291bnQgPSBuZXdDb3VudDsKICAgICAgICAgICAgIH0KQEAgLTEyOTIsMTEgKzEzODksMTggQEAKICAgICAgICAgICAgICAgICBudW1TdXJmYWNlcyA9IG1PdXRwdXRJbWFnZVJlYWRlcnMubGVuZ3RoOwogICAgICAgICAgICAgICAgIG51bUNhcHR1cmVTdXJmYWNlcyA9IG51bVN1cmZhY2VzIC0gKGJhY2tncm91bmRSZXF1ZXN0ID8gMSA6IDApOwogCi0gICAgICAgICAgICAgICAgTGlzdDxTdXJmYWNlPiBvdXRwdXRTdXJmYWNlcyA9IG5ldyBBcnJheUxpc3Q8U3VyZmFjZT4obnVtU3VyZmFjZXMpOworICAgICAgICAgICAgICAgIExpc3Q8T3V0cHV0Q29uZmlndXJhdGlvbj4gb3V0cHV0Q29uZmlncyA9CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PE91dHB1dENvbmZpZ3VyYXRpb24+KG51bVN1cmZhY2VzKTsKICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVN1cmZhY2VzOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3VyZmFjZXMuYWRkKG1PdXRwdXRJbWFnZVJlYWRlcnNbaV0uZ2V0U3VyZmFjZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgT3V0cHV0Q29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgT3V0cHV0Q29uZmlndXJhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0SW1hZ2VSZWFkZXJzW2ldLmdldFN1cmZhY2UoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtUGh5c2ljYWxTdHJlYW1NYXAuZ2V0KGkpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zZXRQaHlzaWNhbENhbWVyYUlkKG1QaHlzaWNhbFN0cmVhbU1hcC5nZXQoaSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG91dHB1dENvbmZpZ3MuYWRkKGNvbmZpZyk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1DYW1lcmEuY3JlYXRlQ2FwdHVyZVNlc3Npb24ob3V0cHV0U3VyZmFjZXMsIHNlc3Npb25MaXN0ZW5lciwgbUNhbWVyYUhhbmRsZXIpOworICAgICAgICAgICAgICAgIG1DYW1lcmEuY3JlYXRlQ2FwdHVyZVNlc3Npb25CeU91dHB1dENvbmZpZ3VyYXRpb25zKG91dHB1dENvbmZpZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uTGlzdGVuZXIsIG1DYW1lcmFIYW5kbGVyKTsKICAgICAgICAgICAgICAgICBtU2Vzc2lvbiA9IHNlc3Npb25MaXN0ZW5lci53YWl0QW5kR2V0U2Vzc2lvbihUSU1FT1VUX0lETEVfTVMpOwogCiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TdXJmYWNlczsgaSsrKSB7CkBAIC0xNTYxLDcgKzE2NjUsNyBAQAogCiAgICAgcHJpdmF0ZSBmaW5hbCBDYXB0dXJlQ2FsbGJhY2sgbUNhcHR1cmVDYWxsYmFjayA9IG5ldyBDYXB0dXJlQ2FsbGJhY2soKSB7CiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNhcHR1cmVBdmFpbGFibGUoSW1hZ2UgY2FwdHVyZSkgeworICAgICAgICBwdWJsaWMgdm9pZCBvbkNhcHR1cmVBdmFpbGFibGUoSW1hZ2UgY2FwdHVyZSwgU3RyaW5nIHBoeXNpY2FsQ2FtZXJhSWQpIHsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCA9IGNhcHR1cmUuZ2V0Rm9ybWF0KCk7CiAgICAgICAgICAgICAgICAgaWYgKGZvcm1hdCA9PSBJbWFnZUZvcm1hdC5KUEVHKSB7CkBAIC0xNTc0LDIwICsxNjc4LDIxIEBACiAgICAgICAgICAgICAgICAgICAgIExvZ3QuaShUQUcsICJSZWNlaXZlZCBZVVYgY2FwdHVyZSIpOwogICAgICAgICAgICAgICAgICAgICBieXRlW10gaW1nID0gSXRzVXRpbHMuZ2V0RGF0YUZyb21JbWFnZShjYXB0dXJlLCBtU29ja2V0UXVldWVRdW90YSk7CiAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgYnVmID0gQnl0ZUJ1ZmZlci53cmFwKGltZyk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjb3VudCA9IG1Db3VudFl1di5nZXRBbmRJbmNyZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgbVNvY2tldFJ1bm5hYmxlT2JqLnNlbmRSZXNwb25zZUNhcHR1cmVCdWZmZXIoInl1dkltYWdlIiwgYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgbVNvY2tldFJ1bm5hYmxlT2JqLnNlbmRSZXNwb25zZUNhcHR1cmVCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInl1dkltYWdlIitwaHlzaWNhbENhbWVyYUlkLCBidWYpOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09IEltYWdlRm9ybWF0LlJBVzEwKSB7CiAgICAgICAgICAgICAgICAgICAgIExvZ3QuaShUQUcsICJSZWNlaXZlZCBSQVcxMCBjYXB0dXJlIik7CiAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBpbWcgPSBJdHNVdGlscy5nZXREYXRhRnJvbUltYWdlKGNhcHR1cmUsIG1Tb2NrZXRRdWV1ZVF1b3RhKTsKICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBidWYgPSBCeXRlQnVmZmVyLndyYXAoaW1nKTsKICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gbUNvdW50UmF3MTAuZ2V0QW5kSW5jcmVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIG1Tb2NrZXRSdW5uYWJsZU9iai5zZW5kUmVzcG9uc2VDYXB0dXJlQnVmZmVyKCJyYXcxMEltYWdlIiwgYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgbVNvY2tldFJ1bm5hYmxlT2JqLnNlbmRSZXNwb25zZUNhcHR1cmVCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJhdzEwSW1hZ2UiK3BoeXNpY2FsQ2FtZXJhSWQsIGJ1Zik7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT0gSW1hZ2VGb3JtYXQuUkFXMTIpIHsKICAgICAgICAgICAgICAgICAgICAgTG9ndC5pKFRBRywgIlJlY2VpdmVkIFJBVzEyIGNhcHR1cmUiKTsKICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGltZyA9IEl0c1V0aWxzLmdldERhdGFGcm9tSW1hZ2UoY2FwdHVyZSwgbVNvY2tldFF1ZXVlUXVvdGEpOwogICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIGJ1ZiA9IEJ5dGVCdWZmZXIud3JhcChpbWcpOwogICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQgPSBtQ291bnRSYXcxMi5nZXRBbmRJbmNyZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgbVNvY2tldFJ1bm5hYmxlT2JqLnNlbmRSZXNwb25zZUNhcHR1cmVCdWZmZXIoInJhdzEySW1hZ2UiLCBidWYpOworICAgICAgICAgICAgICAgICAgICBtU29ja2V0UnVubmFibGVPYmouc2VuZFJlc3BvbnNlQ2FwdHVyZUJ1ZmZlcigicmF3MTJJbWFnZSIrcGh5c2ljYWxDYW1lcmFJZCwgYnVmKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PSBJbWFnZUZvcm1hdC5SQVdfU0VOU09SKSB7CiAgICAgICAgICAgICAgICAgICAgIExvZ3QuaShUQUcsICJSZWNlaXZlZCBSQVcxNiBjYXB0dXJlIik7CiAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCA9IG1Db3VudFJhd09yRG5nLmdldEFuZEluY3JlbWVudCgpOwpAQCAtMTU5NSw3ICsxNzAwLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBpbWcgPSBJdHNVdGlscy5nZXREYXRhRnJvbUltYWdlKGNhcHR1cmUsIG1Tb2NrZXRRdWV1ZVF1b3RhKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIG1DYXB0dXJlUmF3SXNTdGF0cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgYnVmID0gQnl0ZUJ1ZmZlci53cmFwKGltZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNvY2tldFJ1bm5hYmxlT2JqLnNlbmRSZXNwb25zZUNhcHR1cmVCdWZmZXIoInJhd0ltYWdlIiwgYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU29ja2V0UnVubmFibGVPYmouc2VuZFJlc3BvbnNlQ2FwdHVyZUJ1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyYXdJbWFnZSIgKyBwaHlzaWNhbENhbWVyYUlkLCBidWYpOwogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb21wdXRlIHRoZSByZXF1ZXN0ZWQgc3RhdHMgb24gdGhlIHJhdyBmcmFtZSwgYW5kIHJldHVybiB0aGUgcmVzdWx0cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIGEgbmV3ICJzdGF0cyBpbWFnZSIuCkBAIC0xNjEwLDYgKzE3MTYsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubGVmdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWF5ID0gSXRzVXRpbHMuZ2V0QWN0aXZlQXJyYXlDcm9wUmVnaW9uKG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvcDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3ID09IGFhdykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXggPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaCA9PSBhYWgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF5ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3cgPSBtQ2FwdHVyZVN0YXRzR3JpZFdpZHRoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBnaCA9IG1DYXB0dXJlU3RhdHNHcmlkSGVpZ2h0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0W10gc3RhdHMgPSBTdGF0c0ltYWdlLmNvbXB1dGVTdGF0c0ltYWdlKApAQCAtMTY3OSw2ICsxNzkzLDE5OCBAQAogICAgICAgICByZXR1cm4gKGZsb2F0KXIuZ2V0TnVtZXJhdG9yKCkgLyAoZmxvYXQpci5nZXREZW5vbWluYXRvcigpOwogICAgIH0KIAorICAgIHByaXZhdGUgU3RyaW5nIGJ1aWxkTG9nU3RyaW5nKENhcHR1cmVSZXN1bHQgcmVzdWx0KSB0aHJvd3MgSXRzRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBsb2dNc2cgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBsb2dNc2cuYXBwZW5kKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgIkNhcHQgcmVzdWx0OiBBRT0lZCwgQUY9JWQsIEFXQj0lZCwgIiwKKyAgICAgICAgICAgICAgICByZXN1bHQuZ2V0KENhcHR1cmVSZXN1bHQuQ09OVFJPTF9BRV9TVEFURSksCisgICAgICAgICAgICAgICAgcmVzdWx0LmdldChDYXB0dXJlUmVzdWx0LkNPTlRST0xfQUZfU1RBVEUpLAorICAgICAgICAgICAgICAgIHJlc3VsdC5nZXQoQ2FwdHVyZVJlc3VsdC5DT05UUk9MX0FXQl9TVEFURSkpKTsKKyAgICAgICAgaW50W10gY2FwYWJpbGl0aWVzID0gbUNhbWVyYUNoYXJhY3RlcmlzdGljcy5nZXQoCisgICAgICAgICAgICAgICAgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLlJFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUyk7CisgICAgICAgIGlmIChjYXBhYmlsaXRpZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEl0c0V4Y2VwdGlvbigiRmFpbGVkIHRvIGdldCBjYXBhYmlsaXRpZXMiKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHJlYWRTZW5zb3JTZXR0aW5ncyA9IGZhbHNlOworICAgICAgICBmb3IgKGludCBjYXBhYmlsaXR5IDogY2FwYWJpbGl0aWVzKSB7CisgICAgICAgICAgICBpZiAoY2FwYWJpbGl0eSA9PQorICAgICAgICAgICAgICAgICAgICBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1JFQURfU0VOU09SX1NFVFRJTkdTKSB7CisgICAgICAgICAgICAgICAgcmVhZFNlbnNvclNldHRpbmdzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocmVhZFNlbnNvclNldHRpbmdzKSB7CisgICAgICAgICAgICBsb2dNc2cuYXBwZW5kKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICJzZW5zPSVkLCBleHA9JS4xZm1zLCBkdXI9JS4xZm1zLCAiLAorICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0KENhcHR1cmVSZXN1bHQuU0VOU09SX1NFTlNJVElWSVRZKSwKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldChDYXB0dXJlUmVzdWx0LlNFTlNPUl9FWFBPU1VSRV9USU1FKS5sb25nVmFsdWUoKSAvIDEwMDAwMDAuMGYsCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXQoQ2FwdHVyZVJlc3VsdC5TRU5TT1JfRlJBTUVfRFVSQVRJT04pLmxvbmdWYWx1ZSgpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwMC4wZikpOworICAgICAgICB9CisgICAgICAgIGlmIChyZXN1bHQuZ2V0KENhcHR1cmVSZXN1bHQuQ09MT1JfQ09SUkVDVElPTl9HQUlOUykgIT0gbnVsbCkgeworICAgICAgICAgICAgbG9nTXNnLmFwcGVuZChTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAiZ2FpbnM9WyUuMWYsICUuMWYsICUuMWYsICUuMWZdLCAiLAorICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0KENhcHR1cmVSZXN1bHQuQ09MT1JfQ09SUkVDVElPTl9HQUlOUykuZ2V0UmVkKCksCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXQoQ2FwdHVyZVJlc3VsdC5DT0xPUl9DT1JSRUNUSU9OX0dBSU5TKS5nZXRHcmVlbkV2ZW4oKSwKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldChDYXB0dXJlUmVzdWx0LkNPTE9SX0NPUlJFQ1RJT05fR0FJTlMpLmdldEdyZWVuT2RkKCksCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXQoQ2FwdHVyZVJlc3VsdC5DT0xPUl9DT1JSRUNUSU9OX0dBSU5TKS5nZXRCbHVlKCkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxvZ01zZy5hcHBlbmQoImdhaW5zPVtdLCAiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVzdWx0LmdldChDYXB0dXJlUmVzdWx0LkNPTE9SX0NPUlJFQ1RJT05fVFJBTlNGT1JNKSAhPSBudWxsKSB7CisgICAgICAgICAgICBsb2dNc2cuYXBwZW5kKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICJ4Zm9ybT1bJS4xZiwgJS4xZiwgJS4xZiwgJS4xZiwgJS4xZiwgJS4xZiwgJS4xZiwgJS4xZiwgJS4xZl0sICIsCisgICAgICAgICAgICAgICAgICAgIHIyZihyZXN1bHQuZ2V0KENhcHR1cmVSZXN1bHQuQ09MT1JfQ09SUkVDVElPTl9UUkFOU0ZPUk0pLmdldEVsZW1lbnQoMCwwKSksCisgICAgICAgICAgICAgICAgICAgIHIyZihyZXN1bHQuZ2V0KENhcHR1cmVSZXN1bHQuQ09MT1JfQ09SUkVDVElPTl9UUkFOU0ZPUk0pLmdldEVsZW1lbnQoMSwwKSksCisgICAgICAgICAgICAgICAgICAgIHIyZihyZXN1bHQuZ2V0KENhcHR1cmVSZXN1bHQuQ09MT1JfQ09SUkVDVElPTl9UUkFOU0ZPUk0pLmdldEVsZW1lbnQoMiwwKSksCisgICAgICAgICAgICAgICAgICAgIHIyZihyZXN1bHQuZ2V0KENhcHR1cmVSZXN1bHQuQ09MT1JfQ09SUkVDVElPTl9UUkFOU0ZPUk0pLmdldEVsZW1lbnQoMCwxKSksCisgICAgICAgICAgICAgICAgICAgIHIyZihyZXN1bHQuZ2V0KENhcHR1cmVSZXN1bHQuQ09MT1JfQ09SUkVDVElPTl9UUkFOU0ZPUk0pLmdldEVsZW1lbnQoMSwxKSksCisgICAgICAgICAgICAgICAgICAgIHIyZihyZXN1bHQuZ2V0KENhcHR1cmVSZXN1bHQuQ09MT1JfQ09SUkVDVElPTl9UUkFOU0ZPUk0pLmdldEVsZW1lbnQoMiwxKSksCisgICAgICAgICAgICAgICAgICAgIHIyZihyZXN1bHQuZ2V0KENhcHR1cmVSZXN1bHQuQ09MT1JfQ09SUkVDVElPTl9UUkFOU0ZPUk0pLmdldEVsZW1lbnQoMCwyKSksCisgICAgICAgICAgICAgICAgICAgIHIyZihyZXN1bHQuZ2V0KENhcHR1cmVSZXN1bHQuQ09MT1JfQ09SUkVDVElPTl9UUkFOU0ZPUk0pLmdldEVsZW1lbnQoMSwyKSksCisgICAgICAgICAgICAgICAgICAgIHIyZihyZXN1bHQuZ2V0KENhcHR1cmVSZXN1bHQuQ09MT1JfQ09SUkVDVElPTl9UUkFOU0ZPUk0pLmdldEVsZW1lbnQoMiwyKSkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxvZ01zZy5hcHBlbmQoInhmb3JtPVtdLCAiKTsKKyAgICAgICAgfQorICAgICAgICBsb2dNc2cuYXBwZW5kKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgImZvYz0lLjFmIiwKKyAgICAgICAgICAgICAgICByZXN1bHQuZ2V0KENhcHR1cmVSZXN1bHQuTEVOU19GT0NVU19ESVNUQU5DRSkpKTsKKyAgICAgICAgcmV0dXJuIGxvZ01zZy50b1N0cmluZygpOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgVGhyZWVBUmVzdWx0TGlzdGVuZXIgZXh0ZW5kcyBDYXB0dXJlUmVzdWx0TGlzdGVuZXIgeworICAgICAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gc3RvcHBlZCA9IGZhbHNlOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gYWVSZXN1bHRTZW50ID0gZmFsc2U7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBhd2JSZXN1bHRTZW50ID0gZmFsc2U7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBhZlJlc3VsdFNlbnQgPSBmYWxzZTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DYXB0dXJlU3RhcnRlZChDYW1lcmFDYXB0dXJlU2Vzc2lvbiBzZXNzaW9uLCBDYXB0dXJlUmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgIGxvbmcgdGltZXN0YW1wLCBsb25nIGZyYW1lTnVtYmVyKSB7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DYXB0dXJlQ29tcGxldGVkKENhbWVyYUNhcHR1cmVTZXNzaW9uIHNlc3Npb24sIENhcHR1cmVSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgVG90YWxDYXB0dXJlUmVzdWx0IHJlc3VsdCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAoc3RvcHBlZCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHJlcXVlc3QgPT0gbnVsbCB8fCByZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSXRzRXhjZXB0aW9uKCJSZXF1ZXN0L3Jlc3VsdCBpcyBpbnZhbGlkIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgTG9ndC5pKFRBRywgYnVpbGRMb2dTdHJpbmcocmVzdWx0KSk7CisKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQobTNBU3RhdGVMb2NrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZ2V0KENhcHR1cmVSZXN1bHQuQ09OVFJPTF9BRV9TVEFURSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnZlcmdlZEFFID0gcmVzdWx0LmdldChDYXB0dXJlUmVzdWx0LkNPTlRST0xfQUVfU1RBVEUpID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcHR1cmVSZXN1bHQuQ09OVFJPTF9BRV9TVEFURV9DT05WRVJHRUQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXQoQ2FwdHVyZVJlc3VsdC5DT05UUk9MX0FFX1NUQVRFKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXB0dXJlUmVzdWx0LkNPTlRST0xfQUVfU1RBVEVfRkxBU0hfUkVRVUlSRUQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXQoQ2FwdHVyZVJlc3VsdC5DT05UUk9MX0FFX1NUQVRFKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXB0dXJlUmVzdWx0LkNPTlRST0xfQUVfU1RBVEVfTE9DS0VEOworICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2tlZEFFID0gcmVzdWx0LmdldChDYXB0dXJlUmVzdWx0LkNPTlRST0xfQUVfU1RBVEUpID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcHR1cmVSZXN1bHQuQ09OVFJPTF9BRV9TVEFURV9MT0NLRUQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5nZXQoQ2FwdHVyZVJlc3VsdC5DT05UUk9MX0FGX1NUQVRFKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ29udmVyZ2VkQUYgPSByZXN1bHQuZ2V0KENhcHR1cmVSZXN1bHQuQ09OVFJPTF9BRl9TVEFURSkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FwdHVyZVJlc3VsdC5DT05UUk9MX0FGX1NUQVRFX0ZPQ1VTRURfTE9DS0VEOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZ2V0KENhcHR1cmVSZXN1bHQuQ09OVFJPTF9BV0JfU1RBVEUpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db252ZXJnZWRBV0IgPSByZXN1bHQuZ2V0KENhcHR1cmVSZXN1bHQuQ09OVFJPTF9BV0JfU1RBVEUpID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXB0dXJlUmVzdWx0LkNPTlRST0xfQVdCX1NUQVRFX0NPTlZFUkdFRCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXQoQ2FwdHVyZVJlc3VsdC5DT05UUk9MX0FXQl9TVEFURSkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcHR1cmVSZXN1bHQuQ09OVFJPTF9BV0JfU1RBVEVfTE9DS0VEOworICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2tlZEFXQiA9IHJlc3VsdC5nZXQoQ2FwdHVyZVJlc3VsdC5DT05UUk9MX0FXQl9TVEFURSkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcHR1cmVSZXN1bHQuQ09OVFJPTF9BV0JfU1RBVEVfTE9DS0VEOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Db252ZXJnZWRBRSAmJiAoIW1OZWVkc0xvY2tlZEFFIHx8IG1Mb2NrZWRBRSkgJiYgIWFlUmVzdWx0U2VudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWVSZXN1bHRTZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZ2V0KENhcHR1cmVSZXN1bHQuU0VOU09SX1NFTlNJVElWSVRZKSAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHJlc3VsdC5nZXQoQ2FwdHVyZVJlc3VsdC5TRU5TT1JfRVhQT1NVUkVfVElNRSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Tb2NrZXRSdW5uYWJsZU9iai5zZW5kUmVzcG9uc2UoImFlUmVzdWx0IiwgU3RyaW5nLmZvcm1hdCgiJWQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldChDYXB0dXJlUmVzdWx0LlNFTlNPUl9TRU5TSVRJVklUWSkuaW50VmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXQoQ2FwdHVyZVJlc3VsdC5TRU5TT1JfRVhQT1NVUkVfVElNRSkuaW50VmFsdWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZ3QuaShUQUcsIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQUUgY29udmVyZ2VkIGJ1dCBOVUxMIGV4cG9zdXJlIHZhbHVlcywgc2Vuc2l0aXZpdHk6JWIsIGV4cFRpbWU6JWIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldChDYXB0dXJlUmVzdWx0LlNFTlNPUl9TRU5TSVRJVklUWSkgPT0gbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXQoQ2FwdHVyZVJlc3VsdC5TRU5TT1JfRVhQT1NVUkVfVElNRSkgPT0gbnVsbCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Db252ZXJnZWRBRiAmJiAhYWZSZXN1bHRTZW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhZlJlc3VsdFNlbnQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5nZXQoQ2FwdHVyZVJlc3VsdC5MRU5TX0ZPQ1VTX0RJU1RBTkNFKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNvY2tldFJ1bm5hYmxlT2JqLnNlbmRSZXNwb25zZSgiYWZSZXN1bHQiLCBTdHJpbmcuZm9ybWF0KCIlZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0KENhcHR1cmVSZXN1bHQuTEVOU19GT0NVU19ESVNUQU5DRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2d0LmkoVEFHLCAiQUYgY29udmVyZ2VkIGJ1dCBOVUxMIGZvY3VzIGRpc3RhbmNlIHZhbHVlcyIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Db252ZXJnZWRBV0IgJiYgKCFtTmVlZHNMb2NrZWRBV0IgfHwgbUxvY2tlZEFXQikgJiYgIWF3YlJlc3VsdFNlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YlJlc3VsdFNlbnQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5nZXQoQ2FwdHVyZVJlc3VsdC5DT0xPUl9DT1JSRUNUSU9OX0dBSU5TKSAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHJlc3VsdC5nZXQoQ2FwdHVyZVJlc3VsdC5DT0xPUl9DT1JSRUNUSU9OX1RSQU5TRk9STSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Tb2NrZXRSdW5uYWJsZU9iai5zZW5kUmVzcG9uc2UoImF3YlJlc3VsdCIsIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJWYgJWYgJWYgJWYgJWYgJWYgJWYgJWYgJWYgJWYgJWYgJWYgJWYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldChDYXB0dXJlUmVzdWx0LkNPTE9SX0NPUlJFQ1RJT05fR0FJTlMpLmdldFJlZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldChDYXB0dXJlUmVzdWx0LkNPTE9SX0NPUlJFQ1RJT05fR0FJTlMpLmdldEdyZWVuRXZlbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldChDYXB0dXJlUmVzdWx0LkNPTE9SX0NPUlJFQ1RJT05fR0FJTlMpLmdldEdyZWVuT2RkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0KENhcHR1cmVSZXN1bHQuQ09MT1JfQ09SUkVDVElPTl9HQUlOUykuZ2V0Qmx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcjJmKHJlc3VsdC5nZXQoQ2FwdHVyZVJlc3VsdC5DT0xPUl9DT1JSRUNUSU9OX1RSQU5TRk9STSkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEVsZW1lbnQoMCwwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByMmYocmVzdWx0LmdldChDYXB0dXJlUmVzdWx0LkNPTE9SX0NPUlJFQ1RJT05fVFJBTlNGT1JNKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RWxlbWVudCgxLDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIyZihyZXN1bHQuZ2V0KENhcHR1cmVSZXN1bHQuQ09MT1JfQ09SUkVDVElPTl9UUkFOU0ZPUk0pLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRFbGVtZW50KDIsMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcjJmKHJlc3VsdC5nZXQoQ2FwdHVyZVJlc3VsdC5DT0xPUl9DT1JSRUNUSU9OX1RSQU5TRk9STSkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEVsZW1lbnQoMCwxKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByMmYocmVzdWx0LmdldChDYXB0dXJlUmVzdWx0LkNPTE9SX0NPUlJFQ1RJT05fVFJBTlNGT1JNKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RWxlbWVudCgxLDEpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIyZihyZXN1bHQuZ2V0KENhcHR1cmVSZXN1bHQuQ09MT1JfQ09SUkVDVElPTl9UUkFOU0ZPUk0pLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRFbGVtZW50KDIsMSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcjJmKHJlc3VsdC5nZXQoQ2FwdHVyZVJlc3VsdC5DT0xPUl9DT1JSRUNUSU9OX1RSQU5TRk9STSkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEVsZW1lbnQoMCwyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByMmYocmVzdWx0LmdldChDYXB0dXJlUmVzdWx0LkNPTE9SX0NPUlJFQ1RJT05fVFJBTlNGT1JNKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RWxlbWVudCgxLDIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIyZihyZXN1bHQuZ2V0KENhcHR1cmVSZXN1bHQuQ09MT1JfQ09SUkVDVElPTl9UUkFOU0ZPUk0pLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRFbGVtZW50KDIsMikpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZ3QuaShUQUcsIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVdCIGNvbnZlcmdlZCBidXQgTlVMTCBjb2xvciBjb3JyZWN0aW9uIHZhbHVlcywgZ2FpbnM6JWIsIGNjbTolYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0KENhcHR1cmVSZXN1bHQuQ09MT1JfQ09SUkVDVElPTl9HQUlOUykgPT0gbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXQoQ2FwdHVyZVJlc3VsdC5DT0xPUl9DT1JSRUNUSU9OX1RSQU5TRk9STSkgPT0gbnVsbCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbUludGVybG9jazNBLm9wZW4oKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEl0c0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9ndC5lKFRBRywgIlNjcmlwdCBlcnJvcjogIiwgZSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZ3QuZShUQUcsICJTY3JpcHQgZXJyb3I6ICIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2FwdHVyZUZhaWxlZChDYW1lcmFDYXB0dXJlU2Vzc2lvbiBzZXNzaW9uLCBDYXB0dXJlUmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgIENhcHR1cmVGYWlsdXJlIGZhaWx1cmUpIHsKKyAgICAgICAgICAgIExvZ3QuZShUQUcsICJTY3JpcHQgZXJyb3I6IGNhcHR1cmUgZmFpbGVkIik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzdG9wKCkgeworICAgICAgICAgICAgc3RvcHBlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwcml2YXRlIGZpbmFsIENhcHR1cmVSZXN1bHRMaXN0ZW5lciBtQ2FwdHVyZVJlc3VsdExpc3RlbmVyID0gbmV3IENhcHR1cmVSZXN1bHRMaXN0ZW5lcigpIHsKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2FwdHVyZVN0YXJ0ZWQoQ2FtZXJhQ2FwdHVyZVNlc3Npb24gc2Vzc2lvbiwgQ2FwdHVyZVJlcXVlc3QgcmVxdWVzdCwKQEAgLTE2ODksMTU2ICsxOTk1LDE5IEBACiAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2FwdHVyZUNvbXBsZXRlZChDYW1lcmFDYXB0dXJlU2Vzc2lvbiBzZXNzaW9uLCBDYXB0dXJlUmVxdWVzdCByZXF1ZXN0LAogICAgICAgICAgICAgICAgIFRvdGFsQ2FwdHVyZVJlc3VsdCByZXN1bHQpIHsKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gQ3VycmVudGx5IHJlc3VsdCBoYXMgYWxsIDAgdmFsdWVzLgogICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0ID09IG51bGwgfHwgcmVzdWx0ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEl0c0V4Y2VwdGlvbigiUmVxdWVzdC9yZXN1bHQgaXMgaW52YWxpZCIpOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgbG9nTXNnID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICBsb2dNc2cuYXBwZW5kKFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAiQ2FwdCByZXN1bHQ6IEFFPSVkLCBBRj0lZCwgQVdCPSVkLCAiLAotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldChDYXB0dXJlUmVzdWx0LkNPTlRST0xfQUVfU1RBVEUpLAotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldChDYXB0dXJlUmVzdWx0LkNPTlRST0xfQUZfU1RBVEUpLAotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldChDYXB0dXJlUmVzdWx0LkNPTlRST0xfQVdCX1NUQVRFKSkpOwotICAgICAgICAgICAgICAgIGludFtdIGNhcGFiaWxpdGllcyA9IG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3MuZ2V0KAotICAgICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLlJFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUyk7Ci0gICAgICAgICAgICAgICAgaWYgKGNhcGFiaWxpdGllcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJdHNFeGNlcHRpb24oIkZhaWxlZCB0byBnZXQgY2FwYWJpbGl0aWVzIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVhZFNlbnNvclNldHRpbmdzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgY2FwYWJpbGl0eSA6IGNhcGFiaWxpdGllcykgewotICAgICAgICAgICAgICAgICAgICBpZiAoY2FwYWJpbGl0eSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbWVyYUNoYXJhY3RlcmlzdGljcy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19SRUFEX1NFTlNPUl9TRVRUSU5HUykgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVhZFNlbnNvclNldHRpbmdzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChyZWFkU2Vuc29yU2V0dGluZ3MpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nTXNnLmFwcGVuZChTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZW5zPSVkLCBleHA9JS4xZm1zLCBkdXI9JS4xZm1zLCAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXQoQ2FwdHVyZVJlc3VsdC5TRU5TT1JfU0VOU0lUSVZJVFkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXQoQ2FwdHVyZVJlc3VsdC5TRU5TT1JfRVhQT1NVUkVfVElNRSkuaW50VmFsdWUoKSAvIDEwMDAwMDAuMGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldChDYXB0dXJlUmVzdWx0LlNFTlNPUl9GUkFNRV9EVVJBVElPTikuaW50VmFsdWUoKSAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwMC4wZikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmdldChDYXB0dXJlUmVzdWx0LkNPTE9SX0NPUlJFQ1RJT05fR0FJTlMpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nTXNnLmFwcGVuZChTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnYWlucz1bJS4xZiwgJS4xZiwgJS4xZiwgJS4xZl0sICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldChDYXB0dXJlUmVzdWx0LkNPTE9SX0NPUlJFQ1RJT05fR0FJTlMpLmdldFJlZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXQoQ2FwdHVyZVJlc3VsdC5DT0xPUl9DT1JSRUNUSU9OX0dBSU5TKS5nZXRHcmVlbkV2ZW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0KENhcHR1cmVSZXN1bHQuQ09MT1JfQ09SUkVDVElPTl9HQUlOUykuZ2V0R3JlZW5PZGQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0KENhcHR1cmVSZXN1bHQuQ09MT1JfQ09SUkVDVElPTl9HQUlOUykuZ2V0Qmx1ZSgpKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nTXNnLmFwcGVuZCgiZ2FpbnM9W10sICIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmdldChDYXB0dXJlUmVzdWx0LkNPTE9SX0NPUlJFQ1RJT05fVFJBTlNGT1JNKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ01zZy5hcHBlbmQoU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAieGZvcm09WyUuMWYsICUuMWYsICUuMWYsICUuMWYsICUuMWYsICUuMWYsICUuMWYsICUuMWYsICUuMWZdLCAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIyZihyZXN1bHQuZ2V0KENhcHR1cmVSZXN1bHQuQ09MT1JfQ09SUkVDVElPTl9UUkFOU0ZPUk0pLmdldEVsZW1lbnQoMCwwKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcjJmKHJlc3VsdC5nZXQoQ2FwdHVyZVJlc3VsdC5DT0xPUl9DT1JSRUNUSU9OX1RSQU5TRk9STSkuZ2V0RWxlbWVudCgxLDApKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByMmYocmVzdWx0LmdldChDYXB0dXJlUmVzdWx0LkNPTE9SX0NPUlJFQ1RJT05fVFJBTlNGT1JNKS5nZXRFbGVtZW50KDIsMCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIyZihyZXN1bHQuZ2V0KENhcHR1cmVSZXN1bHQuQ09MT1JfQ09SUkVDVElPTl9UUkFOU0ZPUk0pLmdldEVsZW1lbnQoMCwxKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcjJmKHJlc3VsdC5nZXQoQ2FwdHVyZVJlc3VsdC5DT0xPUl9DT1JSRUNUSU9OX1RSQU5TRk9STSkuZ2V0RWxlbWVudCgxLDEpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByMmYocmVzdWx0LmdldChDYXB0dXJlUmVzdWx0LkNPTE9SX0NPUlJFQ1RJT05fVFJBTlNGT1JNKS5nZXRFbGVtZW50KDIsMSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIyZihyZXN1bHQuZ2V0KENhcHR1cmVSZXN1bHQuQ09MT1JfQ09SUkVDVElPTl9UUkFOU0ZPUk0pLmdldEVsZW1lbnQoMCwyKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcjJmKHJlc3VsdC5nZXQoQ2FwdHVyZVJlc3VsdC5DT0xPUl9DT1JSRUNUSU9OX1RSQU5TRk9STSkuZ2V0RWxlbWVudCgxLDIpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByMmYocmVzdWx0LmdldChDYXB0dXJlUmVzdWx0LkNPTE9SX0NPUlJFQ1RJT05fVFJBTlNGT1JNKS5nZXRFbGVtZW50KDIsMikpKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nTXNnLmFwcGVuZCgieGZvcm09W10sICIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsb2dNc2cuYXBwZW5kKFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAiZm9jPSUuMWYiLAotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldChDYXB0dXJlUmVzdWx0LkxFTlNfRk9DVVNfRElTVEFOQ0UpKSk7Ci0gICAgICAgICAgICAgICAgTG9ndC5pKFRBRywgbG9nTXNnLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIExvZ3QuaShUQUcsIGJ1aWxkTG9nU3RyaW5nKHJlc3VsdCkpOwogCi0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5nZXQoQ2FwdHVyZVJlc3VsdC5DT05UUk9MX0FFX1NUQVRFKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Db252ZXJnZWRBRSA9IHJlc3VsdC5nZXQoQ2FwdHVyZVJlc3VsdC5DT05UUk9MX0FFX1NUQVRFKSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcHR1cmVSZXN1bHQuQ09OVFJPTF9BRV9TVEFURV9DT05WRVJHRUQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldChDYXB0dXJlUmVzdWx0LkNPTlRST0xfQUVfU1RBVEUpID09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FwdHVyZVJlc3VsdC5DT05UUk9MX0FFX1NUQVRFX0ZMQVNIX1JFUVVJUkVEIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXQoQ2FwdHVyZVJlc3VsdC5DT05UUk9MX0FFX1NUQVRFKSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcHR1cmVSZXN1bHQuQ09OVFJPTF9BRV9TVEFURV9MT0NLRUQ7Ci0gICAgICAgICAgICAgICAgICAgIG1Mb2NrZWRBRSA9IHJlc3VsdC5nZXQoQ2FwdHVyZVJlc3VsdC5DT05UUk9MX0FFX1NUQVRFKSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcHR1cmVSZXN1bHQuQ09OVFJPTF9BRV9TVEFURV9MT0NLRUQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZ2V0KENhcHR1cmVSZXN1bHQuQ09OVFJPTF9BRl9TVEFURSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtQ29udmVyZ2VkQUYgPSByZXN1bHQuZ2V0KENhcHR1cmVSZXN1bHQuQ09OVFJPTF9BRl9TVEFURSkgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXB0dXJlUmVzdWx0LkNPTlRST0xfQUZfU1RBVEVfRk9DVVNFRF9MT0NLRUQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZ2V0KENhcHR1cmVSZXN1bHQuQ09OVFJPTF9BV0JfU1RBVEUpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNvbnZlcmdlZEFXQiA9IHJlc3VsdC5nZXQoQ2FwdHVyZVJlc3VsdC5DT05UUk9MX0FXQl9TVEFURSkgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FwdHVyZVJlc3VsdC5DT05UUk9MX0FXQl9TVEFURV9DT05WRVJHRUQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXQoQ2FwdHVyZVJlc3VsdC5DT05UUk9MX0FXQl9TVEFURSkgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FwdHVyZVJlc3VsdC5DT05UUk9MX0FXQl9TVEFURV9MT0NLRUQ7Ci0gICAgICAgICAgICAgICAgICAgIG1Mb2NrZWRBV0IgPSByZXN1bHQuZ2V0KENhcHR1cmVSZXN1bHQuQ09OVFJPTF9BV0JfU1RBVEUpID09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcHR1cmVSZXN1bHQuQ09OVFJPTF9BV0JfU1RBVEVfTE9DS0VEOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChtQ29udmVyZ2VkQUUgJiYgKCFtTmVlZHNMb2NrZWRBRSB8fCBtTG9ja2VkQUUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZ2V0KENhcHR1cmVSZXN1bHQuU0VOU09SX1NFTlNJVElWSVRZKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgcmVzdWx0LmdldChDYXB0dXJlUmVzdWx0LlNFTlNPUl9FWFBPU1VSRV9USU1FKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU29ja2V0UnVubmFibGVPYmouc2VuZFJlc3BvbnNlKCJhZVJlc3VsdCIsIFN0cmluZy5mb3JtYXQoIiVkICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldChDYXB0dXJlUmVzdWx0LlNFTlNPUl9TRU5TSVRJVklUWSkuaW50VmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldChDYXB0dXJlUmVzdWx0LlNFTlNPUl9FWFBPU1VSRV9USU1FKS5pbnRWYWx1ZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9ndC5pKFRBRywgU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFFIGNvbnZlcmdlZCBidXQgTlVMTCBleHBvc3VyZSB2YWx1ZXMsIHNlbnNpdGl2aXR5OiViLCBleHBUaW1lOiViIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldChDYXB0dXJlUmVzdWx0LlNFTlNPUl9TRU5TSVRJVklUWSkgPT0gbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldChDYXB0dXJlUmVzdWx0LlNFTlNPUl9FWFBPU1VSRV9USU1FKSA9PSBudWxsKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobUNvbnZlcmdlZEFGKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZ2V0KENhcHR1cmVSZXN1bHQuTEVOU19GT0NVU19ESVNUQU5DRSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVNvY2tldFJ1bm5hYmxlT2JqLnNlbmRSZXNwb25zZSgiYWZSZXN1bHQiLCBTdHJpbmcuZm9ybWF0KCIlZiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXQoQ2FwdHVyZVJlc3VsdC5MRU5TX0ZPQ1VTX0RJU1RBTkNFKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZ3QuaShUQUcsICJBRiBjb252ZXJnZWQgYnV0IE5VTEwgZm9jdXMgZGlzdGFuY2UgdmFsdWVzIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobUNvbnZlcmdlZEFXQiAmJiAoIW1OZWVkc0xvY2tlZEFXQiB8fCBtTG9ja2VkQVdCKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmdldChDYXB0dXJlUmVzdWx0LkNPTE9SX0NPUlJFQ1RJT05fR0FJTlMpICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiByZXN1bHQuZ2V0KENhcHR1cmVSZXN1bHQuQ09MT1JfQ09SUkVDVElPTl9UUkFOU0ZPUk0pICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Tb2NrZXRSdW5uYWJsZU9iai5zZW5kUmVzcG9uc2UoImF3YlJlc3VsdCIsIFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlZiAlZiAlZiAlZiAlZiAlZiAlZiAlZiAlZiAlZiAlZiAlZiAlZiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXQoQ2FwdHVyZVJlc3VsdC5DT0xPUl9DT1JSRUNUSU9OX0dBSU5TKS5nZXRSZWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldChDYXB0dXJlUmVzdWx0LkNPTE9SX0NPUlJFQ1RJT05fR0FJTlMpLmdldEdyZWVuRXZlbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0KENhcHR1cmVSZXN1bHQuQ09MT1JfQ09SUkVDVElPTl9HQUlOUykuZ2V0R3JlZW5PZGQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldChDYXB0dXJlUmVzdWx0LkNPTE9SX0NPUlJFQ1RJT05fR0FJTlMpLmdldEJsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcjJmKHJlc3VsdC5nZXQoQ2FwdHVyZVJlc3VsdC5DT0xPUl9DT1JSRUNUSU9OX1RSQU5TRk9STSkuZ2V0RWxlbWVudCgwLDApKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcjJmKHJlc3VsdC5nZXQoQ2FwdHVyZVJlc3VsdC5DT0xPUl9DT1JSRUNUSU9OX1RSQU5TRk9STSkuZ2V0RWxlbWVudCgxLDApKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcjJmKHJlc3VsdC5nZXQoQ2FwdHVyZVJlc3VsdC5DT0xPUl9DT1JSRUNUSU9OX1RSQU5TRk9STSkuZ2V0RWxlbWVudCgyLDApKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcjJmKHJlc3VsdC5nZXQoQ2FwdHVyZVJlc3VsdC5DT0xPUl9DT1JSRUNUSU9OX1RSQU5TRk9STSkuZ2V0RWxlbWVudCgwLDEpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcjJmKHJlc3VsdC5nZXQoQ2FwdHVyZVJlc3VsdC5DT0xPUl9DT1JSRUNUSU9OX1RSQU5TRk9STSkuZ2V0RWxlbWVudCgxLDEpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcjJmKHJlc3VsdC5nZXQoQ2FwdHVyZVJlc3VsdC5DT0xPUl9DT1JSRUNUSU9OX1RSQU5TRk9STSkuZ2V0RWxlbWVudCgyLDEpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcjJmKHJlc3VsdC5nZXQoQ2FwdHVyZVJlc3VsdC5DT0xPUl9DT1JSRUNUSU9OX1RSQU5TRk9STSkuZ2V0RWxlbWVudCgwLDIpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcjJmKHJlc3VsdC5nZXQoQ2FwdHVyZVJlc3VsdC5DT0xPUl9DT1JSRUNUSU9OX1RSQU5TRk9STSkuZ2V0RWxlbWVudCgxLDIpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcjJmKHJlc3VsdC5nZXQoQ2FwdHVyZVJlc3VsdC5DT0xPUl9DT1JSRUNUSU9OX1RSQU5TRk9STSkuZ2V0RWxlbWVudCgyLDIpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZ3QuaShUQUcsIFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBV0IgY29udmVyZ2VkIGJ1dCBOVUxMIGNvbG9yIGNvcnJlY3Rpb24gdmFsdWVzLCBnYWluczolYiwgY2NtOiViIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldChDYXB0dXJlUmVzdWx0LkNPTE9SX0NPUlJFQ1RJT05fR0FJTlMpID09IG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXQoQ2FwdHVyZVJlc3VsdC5DT0xPUl9DT1JSRUNUSU9OX1RSQU5TRk9STSkgPT0gbnVsbCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG1Jc3N1ZWRSZXF1ZXN0M0EpIHsKLSAgICAgICAgICAgICAgICAgICAgbUlzc3VlZFJlcXVlc3QzQSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBtSW50ZXJsb2NrM0Eub3BlbigpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjb3VudCA9IG1Db3VudENhcFJlcy5nZXRBbmRJbmNyZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgbUNhcHR1cmVSZXN1bHRzW2NvdW50XSA9IHJlc3VsdDsKLSAgICAgICAgICAgICAgICAgICAgbVNvY2tldFJ1bm5hYmxlT2JqLnNlbmRSZXNwb25zZUNhcHR1cmVSZXN1bHQobUNhbWVyYUNoYXJhY3RlcmlzdGljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LCByZXN1bHQsIG1PdXRwdXRJbWFnZVJlYWRlcnMpOwotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQobUNvdW50Q2FsbGJhY2tzUmVtYWluaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ291bnRDYWxsYmFja3NSZW1haW5pbmcuZGVjcmVtZW50QW5kR2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ291bnRDYWxsYmFja3NSZW1haW5pbmcubm90aWZ5KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgY291bnQgPSBtQ291bnRDYXBSZXMuZ2V0QW5kSW5jcmVtZW50KCk7CisgICAgICAgICAgICAgICAgbUNhcHR1cmVSZXN1bHRzW2NvdW50XSA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICBtU29ja2V0UnVubmFibGVPYmouc2VuZFJlc3BvbnNlQ2FwdHVyZVJlc3VsdChtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCwgcmVzdWx0LCBtT3V0cHV0SW1hZ2VSZWFkZXJzKTsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQobUNvdW50Q2FsbGJhY2tzUmVtYWluaW5nKSB7CisgICAgICAgICAgICAgICAgICAgIG1Db3VudENhbGxiYWNrc1JlbWFpbmluZy5kZWNyZW1lbnRBbmRHZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgbUNvdW50Q2FsbGJhY2tzUmVtYWluaW5nLm5vdGlmeSgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gY2F0Y2ggKEl0c0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgTG9ndC5lKFRBRywgIlNjcmlwdCBlcnJvcjogIiwgZSk7CmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvY2FtZXJhL2l0cy9JdHNUZXN0QWN0aXZpdHkuamF2YSBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9jYW1lcmEvaXRzL0l0c1Rlc3RBY3Rpdml0eS5qYXZhCmluZGV4IDkwMjQ3MDUuLmZkNjJlZDIgMTAwNjQ0Ci0tLSBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9jYW1lcmEvaXRzL0l0c1Rlc3RBY3Rpdml0eS5qYXZhCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9jYW1lcmEvaXRzL0l0c1Rlc3RBY3Rpdml0eS5qYXZhCkBAIC0yMSw3ICsyMSw2IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKLWltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FtZXJhQWNjZXNzRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYW1lcmFDaGFyYWN0ZXJpc3RpY3M7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CkBAIC03Nyw5ICs3NiwxMCBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfU1VNTUFSWV9MRU4gPSAyMDA7CiAKICAgICBwcml2YXRlIGZpbmFsIFJlc3VsdFJlY2VpdmVyIG1SZXN1bHRzUmVjZWl2ZXIgPSBuZXcgUmVzdWx0UmVjZWl2ZXIoKTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVJlY2VpdmVyUmVnaXN0ZXJlZCA9IGZhbHNlOwogCiAgICAgLy8gSW5pdGlhbGl6ZWQgaW4gb25DcmVhdGUKLSAgICBBcnJheUxpc3Q8U3RyaW5nPiBtTm9uTGVnYWN5Q2FtZXJhSWRzID0gbnVsbDsKKyAgICBMaXN0PFN0cmluZz4gbVRvQmVUZXN0ZWRDYW1lcmFJZHMgPSBudWxsOwogCiAgICAgLy8gU2NlbmVzCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXJyYXlMaXN0PFN0cmluZz4gbVNjZW5lSWRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+ICgpIHsgewpAQCAtMTY0LDcgKzE2NCw3IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAoIW1Ob25MZWdhY3lDYW1lcmFJZHMuY29udGFpbnMoY2FtZXJhSWQpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtVG9CZVRlc3RlZENhbWVyYUlkcy5jb250YWlucyhjYW1lcmFJZCkpIHsKICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiVW5rbm93biBjYW1lcmEgaWQgIiArIGNhbWVyYUlkICsgIiByZXBvcnRlZCB0byBJVFMiKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgIH0KQEAgLTIxNCw3ICsyMTQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbUV4ZWN1dGVkU2NlbmVzLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtQWxsU2NlbmVzLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBzY2VuZSA6IHNjZW5lcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGMgOiBtTm9uTGVnYWN5Q2FtZXJhSWRzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgYyA6IG1Ub0JlVGVzdGVkQ2FtZXJhSWRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BbGxTY2VuZXMuYWRkKG5ldyBSZXN1bHRLZXkoYywgc2NlbmUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC0zMzIsMzAgKzMzMiwyMCBAQAogICAgICAgICAvLyBIaWRlIHRoZSB0ZXN0IGlmIGFsbCBjYW1lcmEgZGV2aWNlcyBhcmUgbGVnYWN5CiAgICAgICAgIENhbWVyYU1hbmFnZXIgbWFuYWdlciA9IChDYW1lcmFNYW5hZ2VyKSB0aGlzLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5DQU1FUkFfU0VSVklDRSk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBjYW1lcmFJZHMgPSBtYW5hZ2VyLmdldENhbWVyYUlkTGlzdCgpOwotICAgICAgICAgICAgbU5vbkxlZ2FjeUNhbWVyYUlkcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgYm9vbGVhbiBhbGxDYW1lcmFzQXJlTGVnYWN5ID0gdHJ1ZTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGlkIDogY2FtZXJhSWRzKSB7Ci0gICAgICAgICAgICAgICAgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzIGNoYXJhY3RlcmlzdGljcyA9IG1hbmFnZXIuZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGlkKTsKLSAgICAgICAgICAgICAgICBpZiAoY2hhcmFjdGVyaXN0aWNzLmdldChDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuSU5GT19TVVBQT1JURURfSEFSRFdBUkVfTEVWRUwpCi0gICAgICAgICAgICAgICAgICAgICAgICAhPSBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuSU5GT19TVVBQT1JURURfSEFSRFdBUkVfTEVWRUxfTEVHQUNZKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Ob25MZWdhY3lDYW1lcmFJZHMuYWRkKGlkKTsKLSAgICAgICAgICAgICAgICAgICAgYWxsQ2FtZXJhc0FyZUxlZ2FjeSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhbGxDYW1lcmFzQXJlTGVnYWN5KSB7Ci0gICAgICAgICAgICAgICAgc2hvd1RvYXN0KFIuc3RyaW5nLmFsbF9sZWdhY3lfZGV2aWNlcyk7Ci0gICAgICAgICAgICAgICAgSXRzVGVzdEFjdGl2aXR5LnRoaXMuZ2V0UmVwb3J0TG9nKCkuc2V0U3VtbWFyeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJQQVNTOiBhbGwgY2FtZXJhcyBvbiB0aGlzIGRldmljZSBhcmUgTEVHQUNZIgotICAgICAgICAgICAgICAgICAgICAgICAgLCAxLjAsIFJlc3VsdFR5cGUuTkVVVFJBTCwgUmVzdWx0VW5pdC5OT05FKTsKLSAgICAgICAgICAgICAgICBzZXRUZXN0UmVzdWx0QW5kRmluaXNoKHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChDYW1lcmFBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbVRvQmVUZXN0ZWRDYW1lcmFJZHMgPSBJdHNVdGlscy5nZXRJdHNDb21wYXRpYmxlQ2FtZXJhSWRzKG1hbmFnZXIpOworICAgICAgICB9IGNhdGNoIChJdHNFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgVG9hc3QubWFrZVRleHQoSXRzVGVzdEFjdGl2aXR5LnRoaXMsCiAgICAgICAgICAgICAgICAgICAgICJSZWNlaXZlZCBlcnJvciBmcm9tIGNhbWVyYSBzZXJ2aWNlIHdoaWxlIGNoZWNraW5nIGRldmljZSBjYXBhYmlsaXRpZXM6ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUsIFRvYXN0LkxFTkdUSF9TSE9SVCkuc2hvdygpOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKG1Ub0JlVGVzdGVkQ2FtZXJhSWRzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBzaG93VG9hc3QoUi5zdHJpbmcuYWxsX2V4ZW1wdGVkX2RldmljZXMpOworICAgICAgICAgICAgSXRzVGVzdEFjdGl2aXR5LnRoaXMuZ2V0UmVwb3J0TG9nKCkuc2V0U3VtbWFyeSgKKyAgICAgICAgICAgICAgICAgICAgIlBBU1M6IGFsbCBjYW1lcmFzIG9uIHRoaXMgZGV2aWNlIGFyZSBleGVtcHRlZCBmcm9tIElUUyIKKyAgICAgICAgICAgICAgICAgICAgLCAxLjAsIFJlc3VsdFR5cGUuTkVVVFJBTCwgUmVzdWx0VW5pdC5OT05FKTsKKyAgICAgICAgICAgIHNldFRlc3RSZXN1bHRBbmRGaW5pc2godHJ1ZSk7CisgICAgICAgIH0KICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKICAgICAgICAgZ2V0V2luZG93KCkuYWRkRmxhZ3MoV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19LRUVQX1NDUkVFTl9PTik7CiAgICAgfQpAQCAtMzc1LDcgKzM2NSw3IEBACiAgICAgfQogCiAgICAgcHJvdGVjdGVkIHZvaWQgc2V0dXBJdHNUZXN0cyhBcnJheVRlc3RMaXN0QWRhcHRlciBhZGFwdGVyKSB7Ci0gICAgICAgIGZvciAoU3RyaW5nIGNhbSA6IG1Ob25MZWdhY3lDYW1lcmFJZHMpIHsKKyAgICAgICAgZm9yIChTdHJpbmcgY2FtIDogbVRvQmVUZXN0ZWRDYW1lcmFJZHMpIHsKICAgICAgICAgICAgIGZvciAoU3RyaW5nIHNjZW5lIDogbVNjZW5lSWRzKSB7CiAgICAgICAgICAgICAgICAgYWRhcHRlci5hZGQobmV3IERpYWxvZ1Rlc3RMaXN0SXRlbSh0aGlzLAogICAgICAgICAgICAgICAgIHRlc3RUaXRsZShjYW0sIHNjZW5lKSwKQEAgLTM5OSwxNCArMzg5LDE3IEBACiAgICAgICAgICAgICBMb2cuZChUQUcsICJyZWdpc3RlciBJVFMgcmVzdWx0IHJlY2VpdmVyIik7CiAgICAgICAgICAgICBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEludGVudEZpbHRlcihBQ1RJT05fSVRTX1JFU1VMVCk7CiAgICAgICAgICAgICByZWdpc3RlclJlY2VpdmVyKG1SZXN1bHRzUmVjZWl2ZXIsIGZpbHRlcik7CisgICAgICAgICAgICBtUmVjZWl2ZXJSZWdpc3RlcmVkID0gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uUGF1c2UoKSB7Ci0gICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKKyAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3koKSB7CiAgICAgICAgIExvZy5kKFRBRywgInVucmVnaXN0ZXIgSVRTIHJlc3VsdCByZWNlaXZlciIpOwotICAgICAgICB1bnJlZ2lzdGVyUmVjZWl2ZXIobVJlc3VsdHNSZWNlaXZlcik7CisgICAgICAgIGlmIChtUmVjZWl2ZXJSZWdpc3RlcmVkKSB7CisgICAgICAgICAgICB1bnJlZ2lzdGVyUmVjZWl2ZXIobVJlc3VsdHNSZWNlaXZlcik7CisgICAgICAgIH0KKyAgICAgICAgc3VwZXIub25EZXN0cm95KCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvY2FtZXJhL2l0cy9JdHNVdGlscy5qYXZhIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL2NhbWVyYS9pdHMvSXRzVXRpbHMuamF2YQppbmRleCA2NWU0OTcwLi40MWFlMjg4IDEwMDY0NAotLS0gYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvY2FtZXJhL2l0cy9JdHNVdGlscy5qYXZhCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9jYW1lcmEvaXRzL0l0c1V0aWxzLmphdmEKQEAgLTE5LDggKzE5LDEwIEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5JbWFnZUZvcm1hdDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYUFjY2Vzc0V4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FtZXJhRGV2aWNlOwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYW1lcmFDaGFyYWN0ZXJpc3RpY3M7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhcHR1cmVSZXF1ZXN0OwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYXB0dXJlUmVzdWx0OwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5wYXJhbXMuTWV0ZXJpbmdSZWN0YW5nbGU7CkBAIC0yOTYsNCArMjk4LDQ3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gZ2V0SXRzQ29tcGF0aWJsZUNhbWVyYUlkcyhDYW1lcmFNYW5hZ2VyIG1hbmFnZXIpCisgICAgICAgICAgICB0aHJvd3MgSXRzRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG1hbmFnZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2FtZXJhTWFuYWdlciBpcyBudWxsIik7CisgICAgICAgIH0KKworICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBvdXRMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmdbXSBjYW1lcmFJZHMgPSBtYW5hZ2VyLmdldENhbWVyYUlkTGlzdCgpOworICAgICAgICAgICAgZm9yIChTdHJpbmcgaWQgOiBjYW1lcmFJZHMpIHsKKyAgICAgICAgICAgICAgICBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MgY2hhcmFjdGVyaXN0aWNzID0gbWFuYWdlci5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoaWQpOworICAgICAgICAgICAgICAgIGludFtdIGFjdHVhbENhcGFiaWxpdGllcyA9IGNoYXJhY3RlcmlzdGljcy5nZXQoCisgICAgICAgICAgICAgICAgICAgICAgICBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTKTsKKyAgICAgICAgICAgICAgICBib29sZWFuIGhhdmVCQyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBCQUNLV0FSRF9DT01QQVQgPQorICAgICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLlJFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19CQUNLV0FSRF9DT01QQVRJQkxFOworICAgICAgICAgICAgICAgIGZvciAoaW50IGNhcGFiaWxpdHkgOiBhY3R1YWxDYXBhYmlsaXRpZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNhcGFiaWxpdHkgPT0gQkFDS1dBUkRfQ09NUEFUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoYXZlQkMgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBTa2lwIGRldmljZXMgdGhhdCBkb2VzIG5vdCBzdXBwb3J0IEJBQ0tXQVJEX0NPTVBBVElCTEUgY2FwYWJpbGl0eQorICAgICAgICAgICAgICAgIGlmICghaGF2ZUJDKSBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIGludCBod0xldmVsID0gY2hhcmFjdGVyaXN0aWNzLmdldCgKKyAgICAgICAgICAgICAgICAgICAgICAgIENhbWVyYUNoYXJhY3RlcmlzdGljcy5JTkZPX1NVUFBPUlRFRF9IQVJEV0FSRV9MRVZFTCk7CisgICAgICAgICAgICAgICAgaWYgKGh3TGV2ZWwgPT0gQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLklORk9fU1VQUE9SVEVEX0hBUkRXQVJFX0xFVkVMX0xFR0FDWSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgaHdMZXZlbCA9PSBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuSU5GT19TVVBQT1JURURfSEFSRFdBUkVfTEVWRUxfRVhURVJOQUwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCBMRUdBQ1kgYW5kIEVYVEVSTkFMIGRldmljZXMKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dExpc3QuYWRkKGlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoQ2FtZXJhQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZ3QuZShUQUcsCisgICAgICAgICAgICAgICAgICAgICJSZWNlaXZlZCBlcnJvciBmcm9tIGNhbWVyYSBzZXJ2aWNlIHdoaWxlIGNoZWNraW5nIGRldmljZSBjYXBhYmlsaXRpZXM6ICIgKyBlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJdHNFeGNlcHRpb24oIkZhaWxlZCB0byBnZXQgZGV2aWNlIElEIGxpc3QiLCBlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gb3V0TGlzdDsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvY2FtZXJhL3ZpZGVvL0NhbWVyYVZpZGVvQWN0aXZpdHkuamF2YSBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9jYW1lcmEvdmlkZW8vQ2FtZXJhVmlkZW9BY3Rpdml0eS5qYXZhCmluZGV4IDBhMzk3ZTguLjM5MDRmMDkgMTAwNjQ0Ci0tLSBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9jYW1lcmEvdmlkZW8vQ2FtZXJhVmlkZW9BY3Rpdml0eS5qYXZhCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9jYW1lcmEvdmlkZW8vQ2FtZXJhVmlkZW9BY3Rpdml0eS5qYXZhCkBAIC0xNiwxOCArMTYsMjMgQEAKIHBhY2thZ2UgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLmNhbWVyYS52aWRlbzsKIAogaW1wb3J0IGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2U7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5NYXRyaXg7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5TdXJmYWNlVGV4dHVyZTsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLkNhbWVyYTsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLkNhbWVyYS5DYW1lcmFJbmZvOwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuQ2FtZXJhLlNpemU7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYUFjY2Vzc0V4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYW1lcmFNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuQ2FtY29yZGVyUHJvZmlsZTsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFSZWNvcmRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLnRleHQubWV0aG9kLlNjcm9sbGluZ01vdmVtZW50TWV0aG9kOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2U7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlRleHR1cmVWaWV3OwpAQCAtMzgsNiArNDMsNyBAQAogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlQnV0dG9uOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNwaW5uZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVG9hc3Q7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVmlkZW9WaWV3OwogCiBpbXBvcnQgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLlBhc3NGYWlsQnV0dG9uczsKQEAgLTUwLDYgKzU2LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CiBpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CiAKIApAQCAtNzksNiArODYsNyBAQAogCiAgICAgcHJpdmF0ZSBpbnQgbUN1cnJlbnRDYW1lcmFJZCA9IC0xOwogICAgIHByaXZhdGUgQ2FtZXJhIG1DYW1lcmE7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Jc0V4dGVybmFsQ2FtZXJhOwogCiAgICAgcHJpdmF0ZSBNZWRpYVJlY29yZGVyIG1NZWRpYVJlY29yZGVyOwogCkBAIC04Niw3ICs5NCw5IEBACiAgICAgcHJpdmF0ZSBTaXplIG1OZXh0UHJldmlld1NpemU7CiAgICAgcHJpdmF0ZSBTaXplIG1QcmV2aWV3U2l6ZTsKICAgICBwcml2YXRlIExpc3Q8SW50ZWdlcj4gbVZpZGVvU2l6ZUlkczsKKyAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtVmlkZW9TaXplTmFtZXM7CiAgICAgcHJpdmF0ZSBpbnQgbUN1cnJlbnRWaWRlb1NpemVJZDsKKyAgICBwcml2YXRlIFN0cmluZyBtQ3VycmVudFZpZGVvU2l6ZU5hbWU7CiAKICAgICBwcml2YXRlIGJvb2xlYW4gaXNSZWNvcmRpbmcgPSBmYWxzZTsKICAgICBwcml2YXRlIGJvb2xlYW4gaXNQbGF5aW5nQmFjayA9IGZhbHNlOwpAQCAtOTYsMTEgKzEwNiwzNCBAQAogCiAgICAgcHJpdmF0ZSBUZXh0VmlldyBtU3RhdHVzTGFiZWw7CiAKLSAgICBwcml2YXRlIFRyZWVTZXQ8U3RyaW5nPiBtVGVzdGVkQ29tYmluYXRpb25zID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOwotICAgIHByaXZhdGUgVHJlZVNldDxTdHJpbmc+IG1VbnRlc3RlZENvbWJpbmF0aW9ucyA9IG5ldyBUcmVlU2V0PFN0cmluZz4oKTsKKyAgICBwcml2YXRlIFRyZWVTZXQ8Q2FtZXJhQ29tYmluYXRpb24+IG1UZXN0ZWRDb21iaW5hdGlvbnMgPSBuZXcgVHJlZVNldDw+KENPTVBBUkFUT1IpOworICAgIHByaXZhdGUgVHJlZVNldDxDYW1lcmFDb21iaW5hdGlvbj4gbVVudGVzdGVkQ29tYmluYXRpb25zID0gbmV3IFRyZWVTZXQ8PihDT01QQVJBVE9SKTsKKyAgICBwcml2YXRlIFRyZWVTZXQ8U3RyaW5nPiBtVW50ZXN0ZWRDYW1lcmFzID0gbmV3IFRyZWVTZXQ8PigpOwogCiAgICAgcHJpdmF0ZSBGaWxlIG91dHB1dFZpZGVvRmlsZTsKIAorICAgIHByaXZhdGUgY2xhc3MgQ2FtZXJhQ29tYmluYXRpb24geworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtQ2FtZXJhSW5kZXg7CisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1WaWRlb1NpemVJZEluZGV4OworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtVmlkZW9TaXplTmFtZTsKKworICAgICAgICBwcml2YXRlIENhbWVyYUNvbWJpbmF0aW9uKAorICAgICAgICAgICAgaW50IGNhbWVyYUluZGV4LCBpbnQgdmlkZW9TaXplSWRJbmRleCwgU3RyaW5nIHZpZGVvU2l6ZU5hbWUpIHsKKyAgICAgICAgICAgIHRoaXMubUNhbWVyYUluZGV4ID0gY2FtZXJhSW5kZXg7CisgICAgICAgICAgICB0aGlzLm1WaWRlb1NpemVJZEluZGV4ID0gdmlkZW9TaXplSWRJbmRleDsKKyAgICAgICAgICAgIHRoaXMubVZpZGVvU2l6ZU5hbWUgPSB2aWRlb1NpemVOYW1lOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiQ2FtZXJhICVkLCAlcyIsIG1DYW1lcmFJbmRleCwgbVZpZGVvU2l6ZU5hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tcGFyYXRvcjxDYW1lcmFDb21iaW5hdGlvbj4gQ09NUEFSQVRPUiA9CisgICAgICAgIENvbXBhcmF0b3IuPENhbWVyYUNvbWJpbmF0aW9uLCBJbnRlZ2VyPmNvbXBhcmluZyhjIC0+IGMubUNhbWVyYUluZGV4KQorICAgICAgICAgICAgLnRoZW5Db21wYXJpbmcoYyAtPiBjLm1WaWRlb1NpemVJZEluZGV4KTsKKwogICAgIC8qKgogICAgICAqIEBzZWUgI01FRElBX1RZUEVfSU1BR0UKICAgICAgKiBAc2VlICNNRURJQV9UWVBFX1ZJREVPCkBAIC0xNDEsNiArMTc0LDE5IEBACiAgICAgICAgIHJldHVybiBtZWRpYUZpbGU7CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJJVF9SQVRFXzcyMFAgPSA4MDAwMDAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCSVRfUkFURV9NSU4gPSA2NDAwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQklUX1JBVEVfTUFYID0gQklUX1JBVEVfNzIwUDsKKworICAgIHByaXZhdGUgaW50IGdldFZpZGVvQml0UmF0ZShDYW1lcmEuU2l6ZSBzeikgeworICAgICAgICBpbnQgcmF0ZSA9IEJJVF9SQVRFXzcyMFA7CisgICAgICAgIGZsb2F0IHNjYWxlRmFjdG9yID0gc3ouaGVpZ2h0ICogc3oud2lkdGggLyAoZmxvYXQpKDEyODAgKiA3MjApOworICAgICAgICByYXRlID0gKGludCkocmF0ZSAqIHNjYWxlRmFjdG9yKTsKKworICAgICAgICAvLyBDbGFtcCB0byB0aGUgTUlOLCBNQVggcmFuZ2UuCisgICAgICAgIHJldHVybiBNYXRoLm1heChCSVRfUkFURV9NSU4sIE1hdGgubWluKEJJVF9SQVRFX01BWCwgcmF0ZSkpOworICAgIH0KKwogICAgIHByaXZhdGUgYm9vbGVhbiBwcmVwYXJlVmlkZW9SZWNvcmRlcigpIHsKIAogICAgICAgICBtTWVkaWFSZWNvcmRlciA9IG5ldyBNZWRpYVJlY29yZGVyKCk7CkBAIC0xNTQsNyArMjAwLDM5IEBACiAgICAgICAgIG1NZWRpYVJlY29yZGVyLnNldFZpZGVvU291cmNlKE1lZGlhUmVjb3JkZXIuVmlkZW9Tb3VyY2UuQ0FNRVJBKTsKIAogICAgICAgICAvLyBTdGVwIDM6IHNldCBhIENhbWNvcmRlclByb2ZpbGUKLSAgICAgICAgbU1lZGlhUmVjb3JkZXIuc2V0UHJvZmlsZShDYW1jb3JkZXJQcm9maWxlLmdldChtQ3VycmVudENhbWVyYUlkLCBtQ3VycmVudFZpZGVvU2l6ZUlkKSk7CisgICAgICAgIGlmIChtSXNFeHRlcm5hbENhbWVyYSkgeworICAgICAgICAgICAgQ2FtZXJhLlNpemUgcmVjb3JkU2l6ZSA9IG51bGw7CisgICAgICAgICAgICBzd2l0Y2ggKG1DdXJyZW50VmlkZW9TaXplSWQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIENhbWNvcmRlclByb2ZpbGUuUVVBTElUWV9RQ0lGOgorICAgICAgICAgICAgICAgICAgICByZWNvcmRTaXplID0gbUNhbWVyYS5uZXcgU2l6ZSgxNzYsIDE0NCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDYW1jb3JkZXJQcm9maWxlLlFVQUxJVFlfUVZHQToKKyAgICAgICAgICAgICAgICAgICAgcmVjb3JkU2l6ZSA9IG1DYW1lcmEubmV3IFNpemUoMzIwLCAyNDApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ2FtY29yZGVyUHJvZmlsZS5RVUFMSVRZX0NJRjoKKyAgICAgICAgICAgICAgICAgICAgcmVjb3JkU2l6ZSA9IG1DYW1lcmEubmV3IFNpemUoMzUyLCAyODgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ2FtY29yZGVyUHJvZmlsZS5RVUFMSVRZXzQ4MFA6CisgICAgICAgICAgICAgICAgICAgIHJlY29yZFNpemUgPSBtQ2FtZXJhLm5ldyBTaXplKDcyMCwgNDgwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENhbWNvcmRlclByb2ZpbGUuUVVBTElUWV83MjBQOgorICAgICAgICAgICAgICAgICAgICByZWNvcmRTaXplID0gbUNhbWVyYS5uZXcgU2l6ZSgxMjgwLCA3MjApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiVW5rbm93biBDYW1jb3JkZXJQcm9maWxlOiAiICsgbUN1cnJlbnRWaWRlb1NpemVJZDsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCBtc2cpOworICAgICAgICAgICAgICAgICAgICByZWxlYXNlTWVkaWFSZWNvcmRlcigpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IobXNnKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbU1lZGlhUmVjb3JkZXIuc2V0T3V0cHV0Rm9ybWF0KE1lZGlhUmVjb3JkZXIuT3V0cHV0Rm9ybWF0LkRFRkFVTFQpOworICAgICAgICAgICAgbU1lZGlhUmVjb3JkZXIuc2V0VmlkZW9FbmNvZGVyKE1lZGlhUmVjb3JkZXIuVmlkZW9FbmNvZGVyLkRFRkFVTFQpOworICAgICAgICAgICAgbU1lZGlhUmVjb3JkZXIuc2V0QXVkaW9FbmNvZGVyKE1lZGlhUmVjb3JkZXIuQXVkaW9FbmNvZGVyLkRFRkFVTFQpOworICAgICAgICAgICAgbU1lZGlhUmVjb3JkZXIuc2V0VmlkZW9FbmNvZGluZ0JpdFJhdGUoZ2V0VmlkZW9CaXRSYXRlKHJlY29yZFNpemUpKTsKKyAgICAgICAgICAgIG1NZWRpYVJlY29yZGVyLnNldFZpZGVvU2l6ZShyZWNvcmRTaXplLndpZHRoLCByZWNvcmRTaXplLmhlaWdodCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtTWVkaWFSZWNvcmRlci5zZXRQcm9maWxlKENhbWNvcmRlclByb2ZpbGUuZ2V0KG1DdXJyZW50Q2FtZXJhSWQsIG1DdXJyZW50VmlkZW9TaXplSWQpKTsKKyAgICAgICAgfQogCiAgICAgICAgIC8vIFN0ZXAgNDogc2V0IG91dHB1dCBmaWxlCiAgICAgICAgIG91dHB1dFZpZGVvRmlsZSA9IGdldE91dHB1dE1lZGlhRmlsZShNRURJQV9UWVBFX1ZJREVPKTsKQEAgLTIyMCw3ICsyOTgsNyBAQAogICAgICAgICBTdHJpbmdbXSBjYW1lcmFOYW1lcyA9IG5ldyBTdHJpbmdbbnVtQ2FtZXJhc107CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ2FtZXJhczsgaSsrKSB7CiAgICAgICAgICAgICBjYW1lcmFOYW1lc1tpXSA9ICJDYW1lcmEgIiArIGk7Ci0gICAgICAgICAgICBtVW50ZXN0ZWRDb21iaW5hdGlvbnMuYWRkKCJBbGwgY29tYmluYXRpb25zIGZvciBDYW1lcmEgIiArIGkgKyAiXG4iKTsKKyAgICAgICAgICAgIG1VbnRlc3RlZENhbWVyYXMuYWRkKCJBbGwgY29tYmluYXRpb25zIGZvciBDYW1lcmEgIiArIGkgKyAiXG4iKTsKICAgICAgICAgfQogICAgICAgICBpZiAoVkVSQk9TRSkgewogICAgICAgICAgICAgTG9nLnYoVEFHLCAib25DcmVhdGU6IG51bWJlciBvZiBjYW1lcmFzPSIgKyBudW1DYW1lcmFzKTsKQEAgLTIzNSw2ICszMTMsNDUgQEAKICAgICAgICAgbVJlc29sdXRpb25TcGlubmVyLnNldE9uSXRlbVNlbGVjdGVkTGlzdGVuZXIobVJlc29sdXRpb25TZWxlY3RlZExpc3RlbmVyKTsKIAogICAgICAgICBtU3RhdHVzTGFiZWwgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLnN0YXR1c19sYWJlbCk7CisKKyAgICAgICAgQnV0dG9uIG1OZXh0QnV0dG9uID0gKEJ1dHRvbikgZmluZFZpZXdCeUlkKFIuaWQubmV4dF9idXR0b24pOworICAgICAgICBtTmV4dEJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIodiAtPiB7CisgICAgICAgICAgICBzZXRVbnRlc3RlZENvbWJpbmF0aW9uKCk7CisgICAgICAgICAgICBpZiAoVkVSQk9TRSkgeworICAgICAgICAgICAgICAgIExvZy52KFRBRywgIm9uQ2xpY2s6IG1DdXJyZW50VmlkZW9TaXplSWQgPSAiICsKKyAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRWaWRlb1NpemVJZCArICIgIiArIG1DdXJyZW50VmlkZW9TaXplTmFtZSk7CisgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAib25DbGljazogc2V0dGluZyBwcmV2aWV3IHNpemUgIgorICAgICAgICAgICAgICAgICAgICArIG1OZXh0UHJldmlld1NpemUud2lkdGggKyAieCIgKyBtTmV4dFByZXZpZXdTaXplLmhlaWdodCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXJ0UHJldmlldygpOworICAgICAgICAgICAgaWYgKFZFUkJPU0UpIHsKKyAgICAgICAgICAgICAgICBMb2cudihUQUcsICJvbkNsaWNrOiBzdGFydGVkIG5ldyBwcmV2aWV3Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXB0dXJlQnV0dG9uLnBlcmZvcm1DbGljaygpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgYW4gdW50ZXN0ZWQgY29tYmluYXRpb24gb2YgdGhlIGN1cnJlbnQgY2FtZXJhIGFuZCB2aWRlbyBzaXplLgorICAgICAqIFRyaWdnZXJlZCBieSBuZXh0IGJ1dHRvbiBjbGljay4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0VW50ZXN0ZWRDb21iaW5hdGlvbigpIHsKKyAgICAgICAgT3B0aW9uYWw8Q2FtZXJhQ29tYmluYXRpb24+IGNvbWJpbmF0aW9uID0gbVVudGVzdGVkQ29tYmluYXRpb25zLnN0cmVhbSgpLmZpbHRlcigKKyAgICAgICAgICAgIGMgLT4gYy5tQ2FtZXJhSW5kZXggPT0gbUN1cnJlbnRDYW1lcmFJZCkuZmluZEZpcnN0KCk7CisgICAgICAgIGlmICghY29tYmluYXRpb24uaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KHRoaXMsICJBbGwgQ2FtZXJhICIgKyBtQ3VycmVudENhbWVyYUlkICsgIiB0ZXN0cyBhcmUgZG9uZS4iLAorICAgICAgICAgICAgICAgIFRvYXN0LkxFTkdUSF9TSE9SVCkuc2hvdygpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGhlcmUgaXMgdW50ZXN0ZWQgY29tYmluYXRpb24gZm9yIHRoZSBjdXJyZW50IGNhbWVyYSwgc2V0IHRoZSBuZXh0IHVudGVzdGVkIGNvbWJpbmF0aW9uLgorICAgICAgICBpbnQgbU5leHRWaWRlb1NpemVJZEluZGV4ID0gY29tYmluYXRpb24uZ2V0KCkubVZpZGVvU2l6ZUlkSW5kZXg7CisKKyAgICAgICAgbUN1cnJlbnRWaWRlb1NpemVJZCA9IG1WaWRlb1NpemVJZHMuZ2V0KG1OZXh0VmlkZW9TaXplSWRJbmRleCk7CisgICAgICAgIG1DdXJyZW50VmlkZW9TaXplTmFtZSA9IG1WaWRlb1NpemVOYW1lcy5nZXQobU5leHRWaWRlb1NpemVJZEluZGV4KTsKKyAgICAgICAgbU5leHRQcmV2aWV3U2l6ZSA9IG1hdGNoUHJldmlld1JlY29yZFNpemUoKTsKKyAgICAgICAgbVJlc29sdXRpb25TcGlubmVyLnNldFNlbGVjdGlvbihtTmV4dFZpZGVvU2l6ZUlkSW5kZXgpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMjcwLDcgKzM4NywxMyBAQAogICAgICAgICAgICAgICAgICAgICBpc1BsYXlpbmdCYWNrID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIG1QbGF5YmFja1ZpZXcuc3RvcFBsYXliYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgbVN0YXR1c0xhYmVsLnNldFRleHQoZ2V0UmVzb3VyY2VzKCkuZ2V0U3RyaW5nKFIuc3RyaW5nLnN0YXR1c19yZWFkeSkpOworCisgICAgICAgICAgICAgICAgICAgIG1TdGF0dXNMYWJlbC5zZXRNb3ZlbWVudE1ldGhvZChuZXcgU2Nyb2xsaW5nTW92ZW1lbnRNZXRob2QoKSk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgcHJvZ3Jlc3MgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcy5hcHBlbmQoZ2V0UmVzb3VyY2VzKCkuZ2V0U3RyaW5nKFIuc3RyaW5nLnN0YXR1c19yZWFkeSkpOworICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcy5hcHBlbmQoIlxuLS0tLSBQcm9ncmVzcyAtLS0tXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3MuYXBwZW5kKGdldFRlc3REZXRhaWxzKCkpOworICAgICAgICAgICAgICAgICAgICBtU3RhdHVzTGFiZWwuc2V0VGV4dChwcm9ncmVzcy50b1N0cmluZygpKTsKICAgICAgICAgICAgICAgICB9CiAKICAgICB9OwpAQCAtMjg4LDEyICs0MTEsMTcgQEAKICAgICBwdWJsaWMgU3RyaW5nIGdldFRlc3REZXRhaWxzKCkgewogICAgICAgICBTdHJpbmdCdWlsZGVyIHJlcG9ydEJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgICByZXBvcnRCdWlsZGVyLmFwcGVuZCgiVGVzdGVkIGNvbWJpbmF0aW9uczpcbiIpOwotICAgICAgICBmb3IgKFN0cmluZyBjb21iaW5hdGlvbiA6IG1UZXN0ZWRDb21iaW5hdGlvbnMpIHsKKyAgICAgICAgZm9yIChDYW1lcmFDb21iaW5hdGlvbiBjb21iaW5hdGlvbjogbVRlc3RlZENvbWJpbmF0aW9ucykgewogICAgICAgICAgICAgcmVwb3J0QnVpbGRlci5hcHBlbmQoY29tYmluYXRpb24pOworICAgICAgICAgICAgcmVwb3J0QnVpbGRlci5hcHBlbmQoIlxuIik7CiAgICAgICAgIH0KICAgICAgICAgcmVwb3J0QnVpbGRlci5hcHBlbmQoIlVudGVzdGVkIGNvbWJpbmF0aW9uczpcbiIpOwotICAgICAgICBmb3IgKFN0cmluZyBjb21iaW5hdGlvbiA6IG1VbnRlc3RlZENvbWJpbmF0aW9ucykgeworICAgICAgICBmb3IgKFN0cmluZyB1bnRlc3RlZENhbSA6IG1VbnRlc3RlZENhbWVyYXMpIHsKKyAgICAgICAgICAgIHJlcG9ydEJ1aWxkZXIuYXBwZW5kKHVudGVzdGVkQ2FtKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKENhbWVyYUNvbWJpbmF0aW9uIGNvbWJpbmF0aW9uOiBtVW50ZXN0ZWRDb21iaW5hdGlvbnMpIHsKICAgICAgICAgICAgIHJlcG9ydEJ1aWxkZXIuYXBwZW5kKGNvbWJpbmF0aW9uKTsKKyAgICAgICAgICAgIHJlcG9ydEJ1aWxkZXIuYXBwZW5kKCJcbiIpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXBvcnRCdWlsZGVyLnRvU3RyaW5nKCk7CiAgICAgfQpAQCAtMzQ5LDkgKzQ3NywxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgVmlldyB2aWV3LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1WaWRlb1NpemVJZHMuZ2V0KHBvc2l0aW9uKSAhPSBtQ3VycmVudFZpZGVvU2l6ZUlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFZpZGVvU2l6ZUlkID0gbVZpZGVvU2l6ZUlkcy5nZXQocG9zaXRpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRWaWRlb1NpemVOYW1lID0gbVZpZGVvU2l6ZU5hbWVzLmdldChwb3NpdGlvbik7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoVkVSQk9TRSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgIm9uSXRlbVNlbGVjdGVkOiBtQ3VycmVudFZpZGVvU2l6ZUlkID0gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFZpZGVvU2l6ZUlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50VmlkZW9TaXplSWQgKyAiICIgKyBtQ3VycmVudFZpZGVvU2l6ZU5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgbU5leHRQcmV2aWV3U2l6ZSA9IG1hdGNoUHJldmlld1JlY29yZFNpemUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChWRVJCT1NFKSB7CkBAIC00MDcsMTIgKzUzNiwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNQbGF5aW5nQmFjayA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdHVzTGFiZWwuc2V0VGV4dChnZXRSZXNvdXJjZXMoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKFIuc3RyaW5nLnN0YXR1c19wbGF5YmFjaykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvbWJpbmF0aW9uID0gIkNhbWVyYSAiICsgbUN1cnJlbnRDYW1lcmFJZCArICIsICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFZpZGVvU2l6ZUlkICsgIlxuIjsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlc0lkeCA9IG1SZXNvbHV0aW9uU3Bpbm5lci5nZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhQ29tYmluYXRpb24gY29tYmluYXRpb24gPSBuZXcgQ2FtZXJhQ29tYmluYXRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50Q2FtZXJhSWQsIHJlc0lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZpZGVvU2l6ZU5hbWVzLmdldChyZXNJZHgpKTsKKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVVudGVzdGVkQ29tYmluYXRpb25zLnJlbW92ZShjb21iaW5hdGlvbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGVzdGVkQ29tYmluYXRpb25zLmFkZChjb21iaW5hdGlvbik7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVW50ZXN0ZWRDb21iaW5hdGlvbnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVVudGVzdGVkQ29tYmluYXRpb25zLmlzRW1wdHkoKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVW50ZXN0ZWRDYW1lcmFzLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QYXNzQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFZFUkJPU0UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAicnVuOiB0ZXN0IHN1Y2Nlc3MiKTsKQEAgLTQ1MCwxNSArNTg0LDI4IEBACiAgICAgICAgIGludFtdIHF1YWxpdHlBcnJheSA9IHsKICAgICAgICAgICAgICAgICBDYW1jb3JkZXJQcm9maWxlLlFVQUxJVFlfTE9XLAogICAgICAgICAgICAgICAgIENhbWNvcmRlclByb2ZpbGUuUVVBTElUWV9ISUdILAotICAgICAgICAgICAgICAgIENhbWNvcmRlclByb2ZpbGUuUVVBTElUWV9RQ0lGLAotICAgICAgICAgICAgICAgIENhbWNvcmRlclByb2ZpbGUuUVVBTElUWV9RVkdBLAotICAgICAgICAgICAgICAgIENhbWNvcmRlclByb2ZpbGUuUVVBTElUWV9DSUYsCi0gICAgICAgICAgICAgICAgQ2FtY29yZGVyUHJvZmlsZS5RVUFMSVRZXzQ4MFAsCi0gICAgICAgICAgICAgICAgQ2FtY29yZGVyUHJvZmlsZS5RVUFMSVRZXzcyMFAsCi0gICAgICAgICAgICAgICAgQ2FtY29yZGVyUHJvZmlsZS5RVUFMSVRZXzEwODBQLAorICAgICAgICAgICAgICAgIENhbWNvcmRlclByb2ZpbGUuUVVBTElUWV9RQ0lGLCAgLy8gMTc2eDE0NAorICAgICAgICAgICAgICAgIENhbWNvcmRlclByb2ZpbGUuUVVBTElUWV9RVkdBLCAgLy8gMzIweDI0MAorICAgICAgICAgICAgICAgIENhbWNvcmRlclByb2ZpbGUuUVVBTElUWV9DSUYsICAgLy8gMzUyeDI4OAorICAgICAgICAgICAgICAgIENhbWNvcmRlclByb2ZpbGUuUVVBTElUWV80ODBQLCAgLy8gNzIweDQ4MAorICAgICAgICAgICAgICAgIENhbWNvcmRlclByb2ZpbGUuUVVBTElUWV83MjBQLCAgLy8gMTI4MHg3MjAKKyAgICAgICAgICAgICAgICBDYW1jb3JkZXJQcm9maWxlLlFVQUxJVFlfMTA4MFAsIC8vIDE5MjB4MTA4MCBvciAxOTIweDEwODgKICAgICAgICAgICAgICAgICBDYW1jb3JkZXJQcm9maWxlLlFVQUxJVFlfMjE2MFAKICAgICAgICAgfTsKIAorICAgICAgICBmaW5hbCBDYW1lcmEuU2l6ZSBza2lwID0gbUNhbWVyYS5uZXcgU2l6ZSgtMSwgLTEpOworICAgICAgICBDYW1lcmEuU2l6ZVtdIHZpZGVvU2l6ZUFycmF5ID0geworICAgICAgICAgICAgICAgIHNraXAsCisgICAgICAgICAgICAgICAgc2tpcCwKKyAgICAgICAgICAgICAgICBtQ2FtZXJhLm5ldyBTaXplKDE3NiwgMTQ0KSwKKyAgICAgICAgICAgICAgICBtQ2FtZXJhLm5ldyBTaXplKDMyMCwgMjQwKSwKKyAgICAgICAgICAgICAgICBtQ2FtZXJhLm5ldyBTaXplKDM1MiwgMjg4KSwKKyAgICAgICAgICAgICAgICBtQ2FtZXJhLm5ldyBTaXplKDcyMCwgNDgwKSwKKyAgICAgICAgICAgICAgICBtQ2FtZXJhLm5ldyBTaXplKDEyODAsIDcyMCksCisgICAgICAgICAgICAgICAgc2tpcCwKKyAgICAgICAgICAgICAgICBza2lwCisgICAgICAgIH07CisKICAgICAgICAgU3RyaW5nW10gbmFtZUFycmF5ID0gewogICAgICAgICAgICAgICAgICJMT1ciLAogICAgICAgICAgICAgICAgICJISUdIIiwKQEAgLTQ3NCwxMCArNjIxLDIzIEBACiAgICAgICAgIEFycmF5TGlzdDxWaWRlb1NpemVOYW1lUGFpcj4gYXZhaWxhYmxlU2l6ZXMgPQogICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8VmlkZW9TaXplTmFtZVBhaXI+ICgpOwogCisgICAgICAgIENhbWVyYS5QYXJhbWV0ZXJzIHAgPSBtQ2FtZXJhLmdldFBhcmFtZXRlcnMoKTsKKyAgICAgICAgTGlzdDxDYW1lcmEuU2l6ZT4gc3VwcG9ydGVkVmlkZW9TaXplcyA9IHAuZ2V0U3VwcG9ydGVkVmlkZW9TaXplcygpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHF1YWxpdHlBcnJheS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKENhbWNvcmRlclByb2ZpbGUuaGFzUHJvZmlsZShjYW1lcmFJZCwgcXVhbGl0eUFycmF5W2ldKSkgewotICAgICAgICAgICAgICAgIFZpZGVvU2l6ZU5hbWVQYWlyIHBhaXIgPSBuZXcgVmlkZW9TaXplTmFtZVBhaXIocXVhbGl0eUFycmF5W2ldLCBuYW1lQXJyYXlbaV0pOwotICAgICAgICAgICAgICAgIGF2YWlsYWJsZVNpemVzLmFkZChwYWlyKTsKKyAgICAgICAgICAgIGlmIChtSXNFeHRlcm5hbENhbWVyYSkgeworICAgICAgICAgICAgICAgIENhbWVyYS5TaXplIHZpZGVvU3ogPSB2aWRlb1NpemVBcnJheVtpXTsKKyAgICAgICAgICAgICAgICBpZiAodmlkZW9Tei5lcXVhbHMoc2tpcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzdXBwb3J0ZWRWaWRlb1NpemVzLmNvbnRhaW5zKHZpZGVvU3opKSB7CisgICAgICAgICAgICAgICAgICAgIFZpZGVvU2l6ZU5hbWVQYWlyIHBhaXIgPSBuZXcgVmlkZW9TaXplTmFtZVBhaXIocXVhbGl0eUFycmF5W2ldLCBuYW1lQXJyYXlbaV0pOworICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVTaXplcy5hZGQocGFpcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoQ2FtY29yZGVyUHJvZmlsZS5oYXNQcm9maWxlKGNhbWVyYUlkLCBxdWFsaXR5QXJyYXlbaV0pKSB7CisgICAgICAgICAgICAgICAgICAgIFZpZGVvU2l6ZU5hbWVQYWlyIHBhaXIgPSBuZXcgVmlkZW9TaXplTmFtZVBhaXIocXVhbGl0eUFycmF5W2ldLCBuYW1lQXJyYXlbaV0pOworICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVTaXplcy5hZGQocGFpcik7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBhdmFpbGFibGVTaXplczsKQEAgLTUxMSwxMiArNjcxLDM4IEBACiAgICAgICAgICAgICAgICAgQ2FtY29yZGVyUHJvZmlsZS5RVUFMSVRZXzIxNjBQCiAgICAgICAgIH07CiAKKyAgICAgICAgZmluYWwgQ2FtZXJhLlNpemUgc2tpcCA9IG1DYW1lcmEubmV3IFNpemUoLTEsIC0xKTsKKyAgICAgICAgQ2FtZXJhLlNpemVbXSB2aWRlb1NpemVBcnJheSA9IHsKKyAgICAgICAgICAgICAgICBza2lwLAorICAgICAgICAgICAgICAgIHNraXAsCisgICAgICAgICAgICAgICAgbUNhbWVyYS5uZXcgU2l6ZSgxNzYsIDE0NCksCisgICAgICAgICAgICAgICAgbUNhbWVyYS5uZXcgU2l6ZSgzMjAsIDI0MCksCisgICAgICAgICAgICAgICAgbUNhbWVyYS5uZXcgU2l6ZSgzNTIsIDI4OCksCisgICAgICAgICAgICAgICAgbUNhbWVyYS5uZXcgU2l6ZSg3MjAsIDQ4MCksCisgICAgICAgICAgICAgICAgbUNhbWVyYS5uZXcgU2l6ZSgxMjgwLCA3MjApLAorICAgICAgICAgICAgICAgIHNraXAsCisgICAgICAgICAgICAgICAgc2tpcAorICAgICAgICB9OworCiAgICAgICAgIEFycmF5TGlzdDxSZXNvbHV0aW9uUXVhbGl0eT4gcXVhbGl0eUxpc3QgPSBuZXcgQXJyYXlMaXN0PFJlc29sdXRpb25RdWFsaXR5PigpOworICAgICAgICBDYW1lcmEuUGFyYW1ldGVycyBwID0gbUNhbWVyYS5nZXRQYXJhbWV0ZXJzKCk7CisgICAgICAgIExpc3Q8Q2FtZXJhLlNpemU+IHN1cHBvcnRlZFZpZGVvU2l6ZXMgPSBwLmdldFN1cHBvcnRlZFZpZGVvU2l6ZXMoKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwb3NzaWJsZVF1YWxpdHkubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChDYW1jb3JkZXJQcm9maWxlLmhhc1Byb2ZpbGUoY2FtZXJhSWQsIHBvc3NpYmxlUXVhbGl0eVtpXSkpIHsKLSAgICAgICAgICAgICAgICBDYW1jb3JkZXJQcm9maWxlIHByb2ZpbGUgPSBDYW1jb3JkZXJQcm9maWxlLmdldChjYW1lcmFJZCwgcG9zc2libGVRdWFsaXR5W2ldKTsKLSAgICAgICAgICAgICAgICBxdWFsaXR5TGlzdC5hZGQobmV3IFJlc29sdXRpb25RdWFsaXR5KHBvc3NpYmxlUXVhbGl0eVtpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUudmlkZW9GcmFtZVdpZHRoLCBwcm9maWxlLnZpZGVvRnJhbWVIZWlnaHQpKTsKKyAgICAgICAgICAgIGlmIChtSXNFeHRlcm5hbENhbWVyYSkgeworICAgICAgICAgICAgICAgIENhbWVyYS5TaXplIHZpZGVvU3ogPSB2aWRlb1NpemVBcnJheVtpXTsKKyAgICAgICAgICAgICAgICBpZiAodmlkZW9Tei5lcXVhbHMoc2tpcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzdXBwb3J0ZWRWaWRlb1NpemVzLmNvbnRhaW5zKHZpZGVvU3opKSB7CisgICAgICAgICAgICAgICAgICAgIHF1YWxpdHlMaXN0LmFkZChuZXcgUmVzb2x1dGlvblF1YWxpdHkocG9zc2libGVRdWFsaXR5W2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvU3oud2lkdGgsIHZpZGVvU3ouaGVpZ2h0KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoQ2FtY29yZGVyUHJvZmlsZS5oYXNQcm9maWxlKGNhbWVyYUlkLCBwb3NzaWJsZVF1YWxpdHlbaV0pKSB7CisgICAgICAgICAgICAgICAgICAgIENhbWNvcmRlclByb2ZpbGUgcHJvZmlsZSA9IENhbWNvcmRlclByb2ZpbGUuZ2V0KGNhbWVyYUlkLCBwb3NzaWJsZVF1YWxpdHlbaV0pOworICAgICAgICAgICAgICAgICAgICBxdWFsaXR5TGlzdC5hZGQobmV3IFJlc29sdXRpb25RdWFsaXR5KHBvc3NpYmxlUXVhbGl0eVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLnZpZGVvRnJhbWVXaWR0aCwgcHJvZmlsZS52aWRlb0ZyYW1lSGVpZ2h0KSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTU5NSw2ICs3ODEsNyBAQAogICAgICAgICAgICAgZmFpbFRlc3QoImNhbWVyYSBub3QgYXZhaWxhYmxlIiArIGUuZ2V0TWVzc2FnZSgpKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQorICAgICAgICBtSXNFeHRlcm5hbENhbWVyYSA9IGlzRXh0ZXJuYWxDYW1lcmEoaWQpOwogCiAgICAgICAgIENhbWVyYS5QYXJhbWV0ZXJzIHAgPSBtQ2FtZXJhLmdldFBhcmFtZXRlcnMoKTsKICAgICAgICAgaWYgKFZFUkJPU0UpIHsKQEAgLTYyNCw5ICs4MTEsMTEgQEAKICAgICAgICAgQXJyYXlMaXN0PFZpZGVvU2l6ZU5hbWVQYWlyPiBhdmFpbGFibGVWaWRlb1NpemVzID0gZ2V0VmlkZW9TaXplTmFtZVBhaXJzKGlkKTsKICAgICAgICAgU3RyaW5nW10gYXZhaWxhYmxlVmlkZW9TaXplTmFtZXMgPSBuZXcgU3RyaW5nW2F2YWlsYWJsZVZpZGVvU2l6ZXMuc2l6ZSgpXTsKICAgICAgICAgbVZpZGVvU2l6ZUlkcyA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKKyAgICAgICAgbVZpZGVvU2l6ZU5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXZhaWxhYmxlVmlkZW9TaXplcy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgYXZhaWxhYmxlVmlkZW9TaXplTmFtZXNbaV0gPSBhdmFpbGFibGVWaWRlb1NpemVzLmdldChpKS5nZXRTaXplTmFtZSgpOwogICAgICAgICAgICAgbVZpZGVvU2l6ZUlkcy5hZGQoYXZhaWxhYmxlVmlkZW9TaXplcy5nZXQoaSkuZ2V0U2l6ZUlkKCkpOworICAgICAgICAgICAgbVZpZGVvU2l6ZU5hbWVzLmFkZChhdmFpbGFibGVWaWRlb1NpemVOYW1lc1tpXSk7CiAgICAgICAgIH0KIAogICAgICAgICBtUmVzb2x1dGlvblNwaW5uZXIuc2V0QWRhcHRlcigKQEAgLTYzNCw5ICs4MjMsMTMgQEAKICAgICAgICAgICAgICAgICB0aGlzLCBSLmxheW91dC5jZl9mb3JtYXRfbGlzdF9pdGVtLCBhdmFpbGFibGVWaWRlb1NpemVOYW1lcykpOwogCiAgICAgICAgIC8vIFVwZGF0ZSB1bnRlc3RlZAotICAgICAgICBtVW50ZXN0ZWRDb21iaW5hdGlvbnMucmVtb3ZlKCJBbGwgY29tYmluYXRpb25zIGZvciBDYW1lcmEgIiArIGlkICsgIlxuIik7Ci0gICAgICAgIGZvciAoaW50IHZpZGVvU2l6ZUlkOiBtVmlkZW9TaXplSWRzKSB7Ci0gICAgICAgICAgICBTdHJpbmcgY29tYmluYXRpb24gPSAiQ2FtZXJhICIgKyBpZCArICIsICIgKyB2aWRlb1NpemVJZCArICJcbiI7CisgICAgICAgIG1VbnRlc3RlZENhbWVyYXMucmVtb3ZlKCJBbGwgY29tYmluYXRpb25zIGZvciBDYW1lcmEgIiArIGlkICsgIlxuIik7CisKKyAgICAgICAgZm9yIChpbnQgdmlkZW9TaXplSWRJbmRleCA9IDA7CisgICAgICAgICAgICAgICAgdmlkZW9TaXplSWRJbmRleCA8IG1WaWRlb1NpemVJZHMuc2l6ZSgpOyB2aWRlb1NpemVJZEluZGV4KyspIHsKKyAgICAgICAgICAgIENhbWVyYUNvbWJpbmF0aW9uIGNvbWJpbmF0aW9uID0gbmV3IENhbWVyYUNvbWJpbmF0aW9uKAorICAgICAgICAgICAgICAgIGlkLCB2aWRlb1NpemVJZEluZGV4LCBtVmlkZW9TaXplTmFtZXMuZ2V0KHZpZGVvU2l6ZUlkSW5kZXgpKTsKKwogICAgICAgICAgICAgaWYgKCFtVGVzdGVkQ29tYmluYXRpb25zLmNvbnRhaW5zKGNvbWJpbmF0aW9uKSkgewogICAgICAgICAgICAgICAgIG1VbnRlc3RlZENvbWJpbmF0aW9ucy5hZGQoY29tYmluYXRpb24pOwogICAgICAgICAgICAgfQpAQCAtNjQ0LDYgKzgzNyw3IEBACiAKICAgICAgICAgLy8gU2V0IGluaXRpYWwgdmFsdWVzCiAgICAgICAgIG1DdXJyZW50VmlkZW9TaXplSWQgPSBtVmlkZW9TaXplSWRzLmdldCgwKTsKKyAgICAgICAgbUN1cnJlbnRWaWRlb1NpemVOYW1lID0gbVZpZGVvU2l6ZU5hbWVzLmdldCgwKTsKICAgICAgICAgbU5leHRQcmV2aWV3U2l6ZSA9IG1hdGNoUHJldmlld1JlY29yZFNpemUoKTsKICAgICAgICAgbVJlc29sdXRpb25TcGlubmVyLnNldFNlbGVjdGlvbigwKTsKIApAQCAtNzY3LDQgKzk2MSwyMyBAQAogICAgICAgICAgICAgICAgIC5zaG93KCk7CiAgICAgfQogCisgICAgcHJpdmF0ZSBib29sZWFuIGlzRXh0ZXJuYWxDYW1lcmEoaW50IGNhbWVyYUlkKSB7CisgICAgICAgIENhbWVyYU1hbmFnZXIgbWFuYWdlciA9IChDYW1lcmFNYW5hZ2VyKSB0aGlzLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5DQU1FUkFfU0VSVklDRSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmcgY2FtZXJhSWRTdHIgPSBtYW5hZ2VyLmdldENhbWVyYUlkTGlzdCgpW2NhbWVyYUlkXTsKKyAgICAgICAgICAgIENhbWVyYUNoYXJhY3RlcmlzdGljcyBjaGFyYWN0ZXJpc3RpY3MgPQorICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyLmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjYW1lcmFJZFN0cik7CisKKyAgICAgICAgICAgIGlmIChjaGFyYWN0ZXJpc3RpY3MuZ2V0KENhbWVyYUNoYXJhY3RlcmlzdGljcy5JTkZPX1NVUFBPUlRFRF9IQVJEV0FSRV9MRVZFTCkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuSU5GT19TVVBQT1JURURfSEFSRFdBUkVfTEVWRUxfRVhURVJOQUwpIHsKKyAgICAgICAgICAgICAgICAvLyBFeHRlcm5hbCBjYW1lcmEgZG9lc24ndCBzdXBwb3J0IEZPViBpbmZvcm1hdGlvbnMKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoQ2FtZXJhQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KHRoaXMsICJDb3VsZCBub3QgYWNjZXNzIGNhbWVyYSAiICsgY2FtZXJhSWQgKworICAgICAgICAgICAgICAgICAgICAiOiAiICsgZS5nZXRNZXNzYWdlKCksIFRvYXN0LkxFTkdUSF9MT05HKS5zaG93KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwogfQpkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL2NvbXBhbmlvbi9Db21wYW5pb25EZXZpY2VUZXN0QWN0aXZpdHkuamF2YSBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9jb21wYW5pb24vQ29tcGFuaW9uRGV2aWNlVGVzdEFjdGl2aXR5LmphdmEKaW5kZXggMGZhNmY3Mi4uM2EwMmU5MSAxMDA2NDQKLS0tIGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL2NvbXBhbmlvbi9Db21wYW5pb25EZXZpY2VUZXN0QWN0aXZpdHkuamF2YQorKysgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvY29tcGFuaW9uL0NvbXBhbmlvbkRldmljZVRlc3RBY3Rpdml0eS5qYXZhCkBAIC0xMTAsMTcgKzExMCwyMiBAQAogICAgIHByb3RlY3RlZCB2b2lkIG9uQWN0aXZpdHlSZXN1bHQoaW50IHJlcXVlc3RDb2RlLCBpbnQgcmVzdWx0Q29kZSwgSW50ZW50IGRhdGEpIHsKICAgICAgICAgaWYgKHJlcXVlc3RDb2RlID09IFJFUVVFU1RfQ09ERV9DSE9PU0VSKSB7CiAKLSAgICAgICAgICAgIGlmIChyZXN1bHRDb2RlICE9IFJFU1VMVF9PSykgZmFpbCgiQWN0aXZpdHkgcmVzdWx0IGNvZGUgIiArIHJlc3VsdENvZGUpOworICAgICAgICAgICAgaWYgKHJlc3VsdENvZGUgIT0gUkVTVUxUX09LKSB7CisgICAgICAgICAgICAgICAgZmFpbCgiQWN0aXZpdHkgcmVzdWx0IGNvZGUgIiArIHJlc3VsdENvZGUpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgTGlzdDxTdHJpbmc+IG5ld0Fzc29jaWF0aW9ucyA9IG1Db21wYW5pb25EZXZpY2VNYW5hZ2VyLmdldEFzc29jaWF0aW9ucygpOwogICAgICAgICAgICAgaWYgKCFuZXdBc3NvY2lhdGlvbnMuY29udGFpbnNBbGwobUluaXRpYWxBc3NvY2lhdGlvbnMpKSB7CiAgICAgICAgICAgICAgICAgZmFpbCgiTmV3IGFzc29jaWF0aW9ucyAiICsgbmV3QXNzb2NpYXRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICArICIgbGFjayBzb21lIG9mIHRoZSBvcmlnaW5hbCBpdGVtcyBmcm9tICIKICAgICAgICAgICAgICAgICAgICAgICAgICsgbUluaXRpYWxBc3NvY2lhdGlvbnMpOworICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChuZXdBc3NvY2lhdGlvbnMuc2l6ZSgpICE9IG1Jbml0aWFsQXNzb2NpYXRpb25zLnNpemUoKSArIDEpIHsKICAgICAgICAgICAgICAgICBmYWlsKCJOZXcgYXNzb2NpYXRpb25zICIgKyBuZXdBc3NvY2lhdGlvbnMgKyAiIGFyZSBub3QgMSBpdGVtIGxhcmdlciBmcm9tIGluaXRpYWwgIgogICAgICAgICAgICAgICAgICAgICAgICAgKyBtSW5pdGlhbEFzc29jaWF0aW9ucyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBCbHVldG9vdGhEZXZpY2UgYXNzb2NpYXRlZERldmljZQpAQCAtMTI4LDYgKzEzMyw3IEBACiAgICAgICAgICAgICBTdHJpbmcgZGV2aWNlQWRkcmVzcyA9IGFzc29jaWF0ZWREZXZpY2UuZ2V0QWRkcmVzcygpOwogICAgICAgICAgICAgaWYgKCFuZXdBc3NvY2lhdGlvbnMuY29udGFpbnMoZGV2aWNlQWRkcmVzcykpIHsKICAgICAgICAgICAgICAgICBmYWlsKCJTZWxlY3RlZCBkZXZpY2UgaXMgbm90IHByZXNlbnQgYW1vbmcgbmV3IGFzc29jaWF0aW9ucyAiICsgbmV3QXNzb2NpYXRpb25zKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG1Db21wYW5pb25EZXZpY2VNYW5hZ2VyLmRpc2Fzc29jaWF0ZShhc3NvY2lhdGVkRGV2aWNlLmdldEFkZHJlc3MoKSk7CkBAIC0xMzYsNiArMTQyLDcgQEAKICAgICAgICAgICAgICAgICBmYWlsKCJEaXNhc3NvY2lhdGluZyBkZXZpY2UgIiArIGRldmljZUFkZHJlc3MKICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkaWQgbm90IHJlbW92ZSBpdCBmcm9tIGFzc29jaWF0aW9ucyBsaXN0IgogICAgICAgICAgICAgICAgICAgICAgICAgKyBhc3NvY2lhdGlvbnMpOworICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKCFpc0ZpbmlzaGluZygpKSB7CmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbG9jYXRpb24vRW1lcmdlbmN5Q2FsbEdOU1NUZXN0c0FjdGl2aXR5LmphdmEgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbG9jYXRpb24vRW1lcmdlbmN5Q2FsbEdOU1NUZXN0c0FjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUyNGU2YQotLS0gL2Rldi9udWxsCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9sb2NhdGlvbi9FbWVyZ2VuY3lDYWxsR05TU1Rlc3RzQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5sb2NhdGlvbjsKKworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uY3RzLkduc3NNZWFzdXJlbWVudFZhbHVlc1Rlc3Q7CitpbXBvcnQgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLmxvY2F0aW9uLmJhc2UuRW1lcmdlbmN5Q2FsbEJhc2VUZXN0QWN0aXZpdHk7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKKy8qKgorICogQWN0aXZpdHkgdG8gZXhlY3V0ZSBDVFMgR25zc01lYXN1cmVtZW50VmFsdWVzVGVzdCB3aGlsZSBkaWFsaW5nIGVtZXJnZW5jeSBudW1iZXIuCisgKiBJdCBpcyBhIHdyYXBwZXIgZm9yIHtAbGluayBHbnNzTWVhc3VyZW1lbnRWYWx1ZXNUZXN0fSBydW5uaW5nIHdpdGggQW5kcm9pZEpVbml0UnVubmVyLgorICovCitwdWJsaWMgY2xhc3MgRW1lcmdlbmN5Q2FsbEdOU1NUZXN0c0FjdGl2aXR5IGV4dGVuZHMgRW1lcmdlbmN5Q2FsbEJhc2VUZXN0QWN0aXZpdHkgeworICAvLyBHTlNTIHRlc3QgaGFzIGEgbG9uZ2VyIHRpbWVvdXQKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBQSE9ORV9DQUxMX0RVUkFUSU9OX01TID0gVGltZVVuaXQuTUlOVVRFUy50b01pbGxpcygyKTsKKworICBwdWJsaWMgRW1lcmdlbmN5Q2FsbEdOU1NUZXN0c0FjdGl2aXR5KCkgeworICAgIHN1cGVyKEduc3NNZWFzdXJlbWVudFZhbHVlc1Rlc3QuY2xhc3MpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBsb25nIGdldFBob25lQ2FsbER1cmF0aW9uTXMoKSB7CisgICAgcmV0dXJuIFBIT05FX0NBTExfRFVSQVRJT05fTVM7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIGJvb2xlYW4gc2hvd0xvY2FsTnVtYmVySW5wdXRib3goKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbG9jYXRpb24vRW1lcmdlbmN5Q2FsbE1lc3NhZ2VUZXN0c0FjdGl2aXR5LmphdmEgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbG9jYXRpb24vRW1lcmdlbmN5Q2FsbE1lc3NhZ2VUZXN0c0FjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM3NzA2NQotLS0gL2Rldi9udWxsCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9sb2NhdGlvbi9FbWVyZ2VuY3lDYWxsTWVzc2FnZVRlc3RzQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5sb2NhdGlvbjsKKworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uY3RzLkVtZXJnZW5jeUNhbGxNZXNzYWdlVGVzdDsKK2ltcG9ydCBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIubG9jYXRpb24uYmFzZS5FbWVyZ2VuY3lDYWxsQmFzZVRlc3RBY3Rpdml0eTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworLyoqCisgKiBBY3Rpdml0eSB0byBleGVjdXRlIENUUyBFbWVyZ2VuY3lDYWxsTWVzc2FnZVRlc3Qgd2hpbGUgZGlhbGluZyBlbWVyZ2VuY3kgbnVtYmVyLgorICogSXQgaXMgYSB3cmFwcGVyIGZvciB7QGxpbmsgRW1lcmdlbmN5Q2FsbE1lc3NhZ2VUZXN0fSBydW5uaW5nIHdpdGggQW5kcm9pZEpVbml0UnVubmVyLgorICovCitwdWJsaWMgY2xhc3MgRW1lcmdlbmN5Q2FsbE1lc3NhZ2VUZXN0c0FjdGl2aXR5IGV4dGVuZHMgRW1lcmdlbmN5Q2FsbEJhc2VUZXN0QWN0aXZpdHkgeworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFBIT05FX0NBTExfRFVSQVRJT05fTVMgPSBUaW1lVW5pdC5TRUNPTkRTLnRvTWlsbGlzKDM1KTsKKyAgcHVibGljIEVtZXJnZW5jeUNhbGxNZXNzYWdlVGVzdHNBY3Rpdml0eSgpIHsKKyAgICBzdXBlcihFbWVyZ2VuY3lDYWxsTWVzc2FnZVRlc3QuY2xhc3MpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBsb25nIGdldFBob25lQ2FsbER1cmF0aW9uTXMoKSB7CisgICAgcmV0dXJuIFBIT05FX0NBTExfRFVSQVRJT05fTVM7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIGJvb2xlYW4gc2hvd0xvY2FsTnVtYmVySW5wdXRib3goKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KK30KZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9sb2NhdGlvbi9FbWVyZ2VuY3lDYWxsV2lmaVRlc3RzQWN0aXZpdHkuamF2YSBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9sb2NhdGlvbi9FbWVyZ2VuY3lDYWxsV2lmaVRlc3RzQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzQ4NjNkCi0tLSAvZGV2L251bGwKKysrIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL2xvY2F0aW9uL0VtZXJnZW5jeUNhbGxXaWZpVGVzdHNBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLmxvY2F0aW9uOworCitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5jdHMuRW1lcmdlbmN5Q2FsbFdpZmlUZXN0OworaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5sb2NhdGlvbi5iYXNlLkVtZXJnZW5jeUNhbGxCYXNlVGVzdEFjdGl2aXR5OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCisvKioKKyAqIEFjdGl2aXR5IHRvIGV4ZWN1dGUgQ1RTIEVtZXJnZW5jeUNhbGxXaWZpVGVzdCB3aGlsZSBkaWFsaW5nIGVtZXJnZW5jeSBudW1iZXIuCisgKiBJdCBpcyBhIHdyYXBwZXIgZm9yIHtAbGluayBFbWVyZ2VuY3lDYWxsV2lmaVRlc3R9IHJ1bm5pbmcgd2l0aCBBbmRyb2lkSlVuaXRSdW5uZXIuCisgKi8KK3B1YmxpYyBjbGFzcyBFbWVyZ2VuY3lDYWxsV2lmaVRlc3RzQWN0aXZpdHkgZXh0ZW5kcyBFbWVyZ2VuY3lDYWxsQmFzZVRlc3RBY3Rpdml0eSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBQSE9ORV9DQUxMX0RVUkFUSU9OX01TID0gVGltZVVuaXQuU0VDT05EUy50b01pbGxpcygzNSk7CisgICAgcHVibGljIEVtZXJnZW5jeUNhbGxXaWZpVGVzdHNBY3Rpdml0eSgpIHsKKyAgICAgICAgc3VwZXIoRW1lcmdlbmN5Q2FsbFdpZmlUZXN0LmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgbG9uZyBnZXRQaG9uZUNhbGxEdXJhdGlvbk1zKCkgeworICAgICAgcmV0dXJuIFBIT05FX0NBTExfRFVSQVRJT05fTVM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc2hvd0xvY2FsTnVtYmVySW5wdXRib3goKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL2xvY2F0aW9uL0xvY2F0aW9uTW9kZUJhdHRlcnlTYXZpbmdUZXN0QWN0aXZpdHkuamF2YSBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9sb2NhdGlvbi9Mb2NhdGlvbk1vZGVCYXR0ZXJ5U2F2aW5nVGVzdEFjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZmIzNGQuLjAwMDAwMDAKLS0tIGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL2xvY2F0aW9uL0xvY2F0aW9uTW9kZUJhdHRlcnlTYXZpbmdUZXN0QWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5sb2NhdGlvbjsKLQotaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uTG9jYXRpb25NYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU2VjdXJlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5SOwotCi1wdWJsaWMgY2xhc3MgTG9jYXRpb25Nb2RlQmF0dGVyeVNhdmluZ1Rlc3RBY3Rpdml0eSBleHRlbmRzIExvY2F0aW9uTW9kZVRlc3RBY3Rpdml0eSB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUZXN0SXRlbXMoKSB7Ci0gICAgICAgIGNyZWF0ZVVzZXJJdGVtKFIuc3RyaW5nLmxvY2F0aW9uX21vZGVfdHVybl9vbik7Ci0gICAgICAgIGNyZWF0ZVVzZXJJdGVtKFIuc3RyaW5nLmxvY2F0aW9uX21vZGVfc2VsZWN0X2JhdHRlcnlfc2F2aW5nKTsKLSAgICAgICAgY3JlYXRlQXV0b0l0ZW0oUi5zdHJpbmcubG9jYXRpb25fbW9kZV9zZWN1cmVfZ3BzX29mZik7Ci0gICAgICAgIGNyZWF0ZUF1dG9JdGVtKFIuc3RyaW5nLmxvY2F0aW9uX21vZGVfc2VjdXJlX25scF9vbik7Ci0gICAgICAgIGNyZWF0ZUF1dG9JdGVtKFIuc3RyaW5nLmxvY2F0aW9uX21vZGVfbWFuYWdlcl9ncHNfb2ZmKTsKLSAgICAgICAgY3JlYXRlQXV0b0l0ZW0oUi5zdHJpbmcubG9jYXRpb25fbW9kZV9tYW5hZ2VyX25scF9vbik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0SW5mb1Jlc291cmNlcygpIHsKLSAgICAgICAgc2V0SW5mb1Jlc291cmNlcyhSLnN0cmluZy5sb2NhdGlvbl9tb2RlX2JhdHRlcnlfc2F2aW5nX3Rlc3QsCi0gICAgICAgICAgICAgICAgUi5zdHJpbmcubG9jYXRpb25fbW9kZV9iYXR0ZXJ5X3NhdmluZ19pbmZvLCAtMSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVzdEFkdmFuY2UoaW50IHN0YXRlKSB7Ci0gICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICB0ZXN0SXNPbigwKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICB0ZXN0SXNFeHBlY3RlZE1vZGUoMSwgU2VjdXJlLkxPQ0FUSU9OX01PREVfQkFUVEVSWV9TQVZJTkcpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgIHRlc3RTZWN1cmVQcm92aWRlcklzRGlzYWJsZWQoMiwgTG9jYXRpb25NYW5hZ2VyLkdQU19QUk9WSURFUik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgdGVzdFNlY3VyZVByb3ZpZGVySXNFbmFibGVkKDMsIExvY2F0aW9uTWFuYWdlci5ORVRXT1JLX1BST1ZJREVSKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICB0ZXN0TWFuYWdlclByb3ZpZGVySXNEaXNhYmxlZCg0LCBMb2NhdGlvbk1hbmFnZXIuR1BTX1BST1ZJREVSKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgICAgICB0ZXN0TWFuYWdlclByb3ZpZGVySXNFbmFibGVkKDUsIExvY2F0aW9uTWFuYWdlci5ORVRXT1JLX1BST1ZJREVSKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9sb2NhdGlvbi9Mb2NhdGlvbk1vZGVEZXZpY2VPbmx5VGVzdEFjdGl2aXR5LmphdmEgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbG9jYXRpb24vTG9jYXRpb25Nb2RlRGV2aWNlT25seVRlc3RBY3Rpdml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmE5Zjc2Li4wMDAwMDAwCi0tLSBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9sb2NhdGlvbi9Mb2NhdGlvbk1vZGVEZXZpY2VPbmx5VGVzdEFjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIubG9jYXRpb247Ci0KLWltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlNlY3VyZTsKLWltcG9ydCBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIuUjsKLQotcHVibGljIGNsYXNzIExvY2F0aW9uTW9kZURldmljZU9ubHlUZXN0QWN0aXZpdHkgZXh0ZW5kcyBMb2NhdGlvbk1vZGVUZXN0QWN0aXZpdHkgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlVGVzdEl0ZW1zKCkgewotICAgICAgICBjcmVhdGVVc2VySXRlbShSLnN0cmluZy5sb2NhdGlvbl9tb2RlX3R1cm5fb24pOwotICAgICAgICBjcmVhdGVVc2VySXRlbShSLnN0cmluZy5sb2NhdGlvbl9tb2RlX3NlbGVjdF9kZXZpY2Vfb25seSk7Ci0gICAgICAgIGNyZWF0ZUF1dG9JdGVtKFIuc3RyaW5nLmxvY2F0aW9uX21vZGVfc2VjdXJlX2dwc19vbik7Ci0gICAgICAgIGNyZWF0ZUF1dG9JdGVtKFIuc3RyaW5nLmxvY2F0aW9uX21vZGVfc2VjdXJlX25scF9vZmYpOwotICAgICAgICBjcmVhdGVBdXRvSXRlbShSLnN0cmluZy5sb2NhdGlvbl9tb2RlX21hbmFnZXJfZ3BzX29uKTsKLSAgICAgICAgY3JlYXRlQXV0b0l0ZW0oUi5zdHJpbmcubG9jYXRpb25fbW9kZV9tYW5hZ2VyX25scF9vZmYpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldEluZm9SZXNvdXJjZXMoKSB7Ci0gICAgICAgIHNldEluZm9SZXNvdXJjZXMoUi5zdHJpbmcubG9jYXRpb25fbW9kZV9kZXZpY2Vfb25seV90ZXN0LAotICAgICAgICAgICAgICAgIFIuc3RyaW5nLmxvY2F0aW9uX21vZGVfZGV2aWNlX29ubHlfaW5mbywgLTEpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHRlc3RBZHZhbmNlKGludCBzdGF0ZSkgewotICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgdGVzdElzT24oMCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgdGVzdElzRXhwZWN0ZWRNb2RlKDEsIFNlY3VyZS5MT0NBVElPTl9NT0RFX1NFTlNPUlNfT05MWSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgdGVzdFNlY3VyZVByb3ZpZGVySXNFbmFibGVkKDIsIExvY2F0aW9uTWFuYWdlci5HUFNfUFJPVklERVIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgIHRlc3RTZWN1cmVQcm92aWRlcklzRGlzYWJsZWQoMywgTG9jYXRpb25NYW5hZ2VyLk5FVFdPUktfUFJPVklERVIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICAgIHRlc3RNYW5hZ2VyUHJvdmlkZXJJc0VuYWJsZWQoNCwgTG9jYXRpb25NYW5hZ2VyLkdQU19QUk9WSURFUik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICAgICAgdGVzdE1hbmFnZXJQcm92aWRlcklzRGlzYWJsZWQoNSwgTG9jYXRpb25NYW5hZ2VyLk5FVFdPUktfUFJPVklERVIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL2xvY2F0aW9uL0xvY2F0aW9uTW9kZUhpZ2hBY2N1cmFjeVRlc3RBY3Rpdml0eS5qYXZhIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL2xvY2F0aW9uL0xvY2F0aW9uTW9kZUhpZ2hBY2N1cmFjeVRlc3RBY3Rpdml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzEwNzA1Li4wMDAwMDAwCi0tLSBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9sb2NhdGlvbi9Mb2NhdGlvbk1vZGVIaWdoQWNjdXJhY3lUZXN0QWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5sb2NhdGlvbjsKLQotaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uTG9jYXRpb25NYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU2VjdXJlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5SOwotCi1wdWJsaWMgY2xhc3MgTG9jYXRpb25Nb2RlSGlnaEFjY3VyYWN5VGVzdEFjdGl2aXR5IGV4dGVuZHMgTG9jYXRpb25Nb2RlVGVzdEFjdGl2aXR5IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVRlc3RJdGVtcygpIHsKLSAgICAgICAgY3JlYXRlVXNlckl0ZW0oUi5zdHJpbmcubG9jYXRpb25fbW9kZV90dXJuX29uKTsKLSAgICAgICAgY3JlYXRlVXNlckl0ZW0oUi5zdHJpbmcubG9jYXRpb25fbW9kZV9zZWxlY3RfaGlnaF9hY2N1cmFjeSk7Ci0gICAgICAgIGNyZWF0ZUF1dG9JdGVtKFIuc3RyaW5nLmxvY2F0aW9uX21vZGVfc2VjdXJlX2dwc19vbik7Ci0gICAgICAgIGNyZWF0ZUF1dG9JdGVtKFIuc3RyaW5nLmxvY2F0aW9uX21vZGVfc2VjdXJlX25scF9vbik7Ci0gICAgICAgIGNyZWF0ZUF1dG9JdGVtKFIuc3RyaW5nLmxvY2F0aW9uX21vZGVfbWFuYWdlcl9ncHNfb24pOwotICAgICAgICBjcmVhdGVBdXRvSXRlbShSLnN0cmluZy5sb2NhdGlvbl9tb2RlX21hbmFnZXJfbmxwX29uKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRJbmZvUmVzb3VyY2VzKCkgewotICAgICAgICBzZXRJbmZvUmVzb3VyY2VzKFIuc3RyaW5nLmxvY2F0aW9uX21vZGVfaGlnaF9hY2N1cmFjeV90ZXN0LAotICAgICAgICAgICAgICAgIFIuc3RyaW5nLmxvY2F0aW9uX21vZGVfaGlnaF9hY2N1cmFjeV9pbmZvLCAtMSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVzdEFkdmFuY2UoaW50IHN0YXRlKSB7Ci0gICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICB0ZXN0SXNPbigwKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICB0ZXN0SXNFeHBlY3RlZE1vZGUoMSwgU2VjdXJlLkxPQ0FUSU9OX01PREVfSElHSF9BQ0NVUkFDWSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgdGVzdFNlY3VyZVByb3ZpZGVySXNFbmFibGVkKDIsIExvY2F0aW9uTWFuYWdlci5HUFNfUFJPVklERVIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgIHRlc3RTZWN1cmVQcm92aWRlcklzRW5hYmxlZCgzLCBMb2NhdGlvbk1hbmFnZXIuTkVUV09SS19QUk9WSURFUik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgdGVzdE1hbmFnZXJQcm92aWRlcklzRW5hYmxlZCg0LCBMb2NhdGlvbk1hbmFnZXIuR1BTX1BST1ZJREVSKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgICAgICB0ZXN0TWFuYWdlclByb3ZpZGVySXNFbmFibGVkKDUsIExvY2F0aW9uTWFuYWdlci5ORVRXT1JLX1BST1ZJREVSKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9sb2NhdGlvbi9Mb2NhdGlvbk1vZGVPZmZUZXN0QWN0aXZpdHkuamF2YSBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9sb2NhdGlvbi9Mb2NhdGlvbk1vZGVPZmZUZXN0QWN0aXZpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJiMDc0Mi4uMDAwMDAwMAotLS0gYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbG9jYXRpb24vTG9jYXRpb25Nb2RlT2ZmVGVzdEFjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIubG9jYXRpb247Ci0KLWltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlNlY3VyZTsKLWltcG9ydCBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIuUjsKLQotcHVibGljIGNsYXNzIExvY2F0aW9uTW9kZU9mZlRlc3RBY3Rpdml0eSBleHRlbmRzIExvY2F0aW9uTW9kZVRlc3RBY3Rpdml0eSB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUZXN0SXRlbXMoKSB7Ci0gICAgICAgIGNyZWF0ZVVzZXJJdGVtKFIuc3RyaW5nLmxvY2F0aW9uX21vZGVfdHVybl9vZmYpOwotICAgICAgICBjcmVhdGVBdXRvSXRlbShSLnN0cmluZy5sb2NhdGlvbl9tb2RlX3NlY3VyZV9ncHNfb2ZmKTsKLSAgICAgICAgY3JlYXRlQXV0b0l0ZW0oUi5zdHJpbmcubG9jYXRpb25fbW9kZV9zZWN1cmVfbmxwX29mZik7Ci0gICAgICAgIGNyZWF0ZUF1dG9JdGVtKFIuc3RyaW5nLmxvY2F0aW9uX21vZGVfbWFuYWdlcl9ncHNfb2ZmKTsKLSAgICAgICAgY3JlYXRlQXV0b0l0ZW0oUi5zdHJpbmcubG9jYXRpb25fbW9kZV9tYW5hZ2VyX25scF9vZmYpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldEluZm9SZXNvdXJjZXMoKSB7Ci0gICAgICAgIHNldEluZm9SZXNvdXJjZXMoUi5zdHJpbmcubG9jYXRpb25fbW9kZV9vZmZfdGVzdCwKLSAgICAgICAgICAgICAgICBSLnN0cmluZy5sb2NhdGlvbl9tb2RlX29mZl9pbmZvLCAtMSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVzdEFkdmFuY2UoaW50IHN0YXRlKSB7Ci0gICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICB0ZXN0SXNFeHBlY3RlZE1vZGUoMCwgU2VjdXJlLkxPQ0FUSU9OX01PREVfT0ZGKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICB0ZXN0U2VjdXJlUHJvdmlkZXJJc0Rpc2FibGVkKDEsIExvY2F0aW9uTWFuYWdlci5HUFNfUFJPVklERVIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgIHRlc3RTZWN1cmVQcm92aWRlcklzRGlzYWJsZWQoMiwgTG9jYXRpb25NYW5hZ2VyLk5FVFdPUktfUFJPVklERVIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgIHRlc3RNYW5hZ2VyUHJvdmlkZXJJc0Rpc2FibGVkKDMsIExvY2F0aW9uTWFuYWdlci5HUFNfUFJPVklERVIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICAgIHRlc3RNYW5hZ2VyUHJvdmlkZXJJc0Rpc2FibGVkKDQsIExvY2F0aW9uTWFuYWdlci5ORVRXT1JLX1BST1ZJREVSKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9sb2NhdGlvbi9Mb2NhdGlvbk1vZGVUZXN0QWN0aXZpdHkuamF2YSBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9sb2NhdGlvbi9Mb2NhdGlvbk1vZGVUZXN0QWN0aXZpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJkNDFmNC4uMDAwMDAwMAotLS0gYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbG9jYXRpb24vTG9jYXRpb25Nb2RlVGVzdEFjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLmxvY2F0aW9uOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uTG9jYXRpb25NYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5TZWN1cmU7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwotaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5QYXNzRmFpbEJ1dHRvbnM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLlI7Ci0KLS8qKgotICogQXNrcyB0aGUgdXNlciB0byBwdXQgdGhlIGRldmljZSBpbiBvbmUgb2YgdGhlIGZvdXIgbG9jYXRpb24gbW9kZXMgYW5kIHRoZW4gY2hlY2tzIHRvIHNlZSBpZgotICoge0BsaW5rIFNlY3VyZSNpc0xvY2F0aW9uUHJvdmlkZXJFbmFibGVkKENvbnRlbnRSZXNvbHZlciwgU3RyaW5nKX0gYW5kIHtAbGluawotICogTG9jYXRpb25NYW5hZ2VyI2lzUHJvdmlkZXJFbmFibGVkKFN0cmluZyl9IGhhdmUgdGhlIGV4cGVjdGVkIHZhbHVlcyBmb3IgR1BTIGFuZCBXaS1GaS4gRm9yCi0gKiBleGFtcGxlIGluIGJhdHRlcnkgc2F2aW5nIG1vZGUsIFdpLUZpIHNob3VsZCBiZSBvbiBidXQgR1BTIHNob3VsZCBiZSBvZmYuCi0gKgotICogSXQgd291bGQgYmUgaGFyZCB0byBhdXRvbWF0ZSB0aGVzZSB0ZXN0cyBiZWNhdXNlIHRoZSB7QGxpbmsgU2VjdXJlI0xPQ0FUSU9OX01PREV9IEFQSSBpcyBvbmx5Ci0gKiBhY2Nlc3NpYmxlIHRvIGFwcHMgaW4gdGhlIHN5c3RlbSBpbWFnZS4gRnVydGhlcm1vcmUsIHNlbGVjdGluZyB0d28gb2YgdGhlIG1vZGVzIHJlcXVpcmVzIHRoZSB1c2VyCi0gKiB0byBhY2NlcHQgdGhlIE5MUCBjb25maXJtYXRpb24gZGlhbG9nLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTG9jYXRpb25Nb2RlVGVzdEFjdGl2aXR5Ci0gICAgICAgIGV4dGVuZHMgUGFzc0ZhaWxCdXR0b25zLkFjdGl2aXR5IGltcGxlbWVudHMgUnVubmFibGUgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRFID0gInN0YXRlIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBQQVNTID0gMTsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBGQUlMID0gMjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBXQUlUX0ZPUl9VU0VSID0gMzsKLQotICAgIHByb3RlY3RlZCBpbnQgbVN0YXRlOwotICAgIHByb3RlY3RlZCBpbnRbXSBtU3RhdHVzOwotICAgIHByaXZhdGUgTGF5b3V0SW5mbGF0ZXIgbUluZmxhdGVyOwotICAgIHByaXZhdGUgVmlld0dyb3VwIG1JdGVtTGlzdDsKLSAgICBwcml2YXRlIFJ1bm5hYmxlIG1SdW5uZXI7Ci0gICAgcHJpdmF0ZSBWaWV3IG1IYW5kbGVyOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwotCi0gICAgICAgIGlmIChzYXZlZEluc3RhbmNlU3RhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgbVN0YXRlID0gc2F2ZWRJbnN0YW5jZVN0YXRlLmdldEludChTVEFURSwgMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBtUnVubmVyID0gdGhpczsKLSAgICAgICAgbUluZmxhdGVyID0gZ2V0TGF5b3V0SW5mbGF0ZXIoKTsKLSAgICAgICAgVmlldyB2aWV3ID0gbUluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQubG9jYXRpb25fbW9kZV9tYWluLCBudWxsKTsKLSAgICAgICAgbUl0ZW1MaXN0ID0gKFZpZXdHcm91cCkgdmlldy5maW5kVmlld0J5SWQoUi5pZC50ZXN0X2l0ZW1zKTsKLSAgICAgICAgbUhhbmRsZXIgPSBtSXRlbUxpc3Q7Ci0KLSAgICAgICAgY3JlYXRlVGVzdEl0ZW1zKCk7Ci0gICAgICAgIG1TdGF0dXMgPSBuZXcgaW50W21JdGVtTGlzdC5nZXRDaGlsZENvdW50KCldOwotICAgICAgICBzZXRDb250ZW50Vmlldyh2aWV3KTsKLQotICAgICAgICBzZXRQYXNzRmFpbEJ1dHRvbkNsaWNrTGlzdGVuZXJzKCk7Ci0KLSAgICAgICAgc2V0SW5mb1Jlc291cmNlcygpOwotCi0gICAgICAgIGdldFBhc3NCdXR0b24oKS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvblNhdmVJbnN0YW5jZVN0YXRlKEJ1bmRsZSBvdXRTdGF0ZSkgewotICAgICAgICBvdXRTdGF0ZS5wdXRJbnQoU1RBVEUsIG1TdGF0ZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7Ci0gICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7Ci0gICAgICAgIG5leHQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZW1wbGF0ZSBtZXRob2QgdXNlZCBieSB0aGUgc3ViY2xhc3MgdG8gY3JlYXRlIHRoZSBjaGVja3MgY29ycmVzcG9uZGluZyB0byBlYWNoIHZhbHVlIG9mCi0gICAgICoge0BsaW5rICNtU3RhdGV9LiBTdWJjbGFzcyBzaG91bGQgY2FsbCB7QGxpbmsgI2NyZWF0ZVVzZXJJdGVtKGludCl9IGFuZCB7QGxpbmsKLSAgICAgKiAjY3JlYXRlQXV0b0l0ZW0oaW50KX0gYXMgYXBwcm9wcmlhdGUgdG8gZ2VuZXJhdGUgZWFjaCBpdGVtLgotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGNyZWF0ZVRlc3RJdGVtcygpOwotCi0gICAgLyoqCi0gICAgICogVGVtcGxhdGUgbWV0aG9kIHVzZWQgYnkgdGhlIHN1YmNsYXNzIHRvIGNhbGwge0BsaW5rICNzZXRJbmZvUmVzb3VyY2VzKGludCwgaW50LCBpbnQpfSB3aXRoCi0gICAgICogdGhlIGFwcHJvcHJpYXRlIHJlc291cmNlcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBzZXRJbmZvUmVzb3VyY2VzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTdWJjbGFzcyBjYW4gY2FsbCB0aGlzIHRvIGNyZWF0ZSBhIHRlc3Qgc3RlcCB3aGVyZSB0aGUgdXNlciBtdXN0IHBlcmZvcm0gc29tZSBhY3Rpb24gc3VjaAotICAgICAqIGFzIHNldHRpbmcgdGhlIGxvY2F0aW9uIG1vZGUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFZpZXcgY3JlYXRlVXNlckl0ZW0oaW50IHN0cmluZ0lkKSB7Ci0gICAgICAgIFZpZXcgaXRlbSA9IG1JbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LmxvY2F0aW9uX21vZGVfaXRlbSwgbUl0ZW1MaXN0LCBmYWxzZSk7Ci0gICAgICAgIFRleHRWaWV3IGluc3RydWN0aW9ucyA9IChUZXh0VmlldykgaXRlbS5maW5kVmlld0J5SWQoUi5pZC5pbnN0cnVjdGlvbnMpOwotICAgICAgICBpbnN0cnVjdGlvbnMuc2V0VGV4dChzdHJpbmdJZCk7Ci0gICAgICAgIG1JdGVtTGlzdC5hZGRWaWV3KGl0ZW0pOwotICAgICAgICByZXR1cm4gaXRlbTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdWJjbGFzcyBjYW4gY2FsbCB0aGlzIHRvIGNyZWF0ZSBhIHRlc3Qgc3RlcCB3aGVyZSB0aGUgdGVzdCBhdXRvbWF0aWNhbGx5IGV2YWx1YXRlcyB3aGV0aGVyCi0gICAgICogYW4gZXhwZWN0ZWQgY29uZGl0aW9uIGlzIHNhdGlzZmllZCwgc3VjaCBhcyBHUFMgaXMgb2ZmLgotICAgICAqLwotICAgIHByb3RlY3RlZCBWaWV3IGNyZWF0ZUF1dG9JdGVtKGludCBzdHJpbmdJZCkgewotICAgICAgICBWaWV3IGl0ZW0gPSBtSW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC5sb2NhdGlvbl9tb2RlX2l0ZW0sIG1JdGVtTGlzdCwgZmFsc2UpOwotICAgICAgICBUZXh0VmlldyBpbnN0cnVjdGlvbnMgPSAoVGV4dFZpZXcpIGl0ZW0uZmluZFZpZXdCeUlkKFIuaWQuaW5zdHJ1Y3Rpb25zKTsKLSAgICAgICAgaW5zdHJ1Y3Rpb25zLnNldFRleHQoc3RyaW5nSWQpOwotICAgICAgICBWaWV3IGJ1dHRvbiA9IGl0ZW0uZmluZFZpZXdCeUlkKFIuaWQubGF1bmNoX3NldHRpbmdzKTsKLSAgICAgICAgYnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgbUl0ZW1MaXN0LmFkZFZpZXcoaXRlbSk7Ci0gICAgICAgIHJldHVybiBpdGVtOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgdmlzaWJsZSBzdGF0ZSBvZiBhIHRlc3QgaXRlbSB0byBwYXNzZWQgb3IgZmFpbGVkLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRJdGVtU3RhdGUoaW50IGluZGV4LCBib29sZWFuIHBhc3NlZCkgewotICAgICAgICBWaWV3R3JvdXAgaXRlbSA9IChWaWV3R3JvdXApIG1JdGVtTGlzdC5nZXRDaGlsZEF0KGluZGV4KTsKLSAgICAgICAgSW1hZ2VWaWV3IHN0YXR1cyA9IChJbWFnZVZpZXcpIGl0ZW0uZmluZFZpZXdCeUlkKFIuaWQuc3RhdHVzKTsKLSAgICAgICAgc3RhdHVzLnNldEltYWdlUmVzb3VyY2UocGFzc2VkID8gUi5kcmF3YWJsZS5mc19nb29kIDogUi5kcmF3YWJsZS5mc19lcnJvcik7Ci0gICAgICAgIFZpZXcgYnV0dG9uID0gaXRlbS5maW5kVmlld0J5SWQoUi5pZC5sYXVuY2hfc2V0dGluZ3MpOwotICAgICAgICBidXR0b24uc2V0Q2xpY2thYmxlKGZhbHNlKTsKLSAgICAgICAgYnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBzdGF0dXMuaW52YWxpZGF0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgdmlzaWJsZSBzdGF0ZSBvZiBhIHRlc3QgaXRlbSB0byB3YWl0aW5nLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIG1hcmtJdGVtV2FpdGluZyhpbnQgaW5kZXgpIHsKLSAgICAgICAgVmlld0dyb3VwIGl0ZW0gPSAoVmlld0dyb3VwKSBtSXRlbUxpc3QuZ2V0Q2hpbGRBdChpbmRleCk7Ci0gICAgICAgIEltYWdlVmlldyBzdGF0dXMgPSAoSW1hZ2VWaWV3KSBpdGVtLmZpbmRWaWV3QnlJZChSLmlkLnN0YXR1cyk7Ci0gICAgICAgIHN0YXR1cy5zZXRJbWFnZVJlc291cmNlKFIuZHJhd2FibGUuZnNfd2FybmluZyk7Ci0gICAgICAgIHN0YXR1cy5pbnZhbGlkYXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWR2YW5jZXMgdGhlIHN0YXRlIG1hY2hpbmUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAvLyBBZHZhbmNlIHRlc3Qgc3RhdGUgdW50aWwgd2UgZmluZCBjYXNlIHdoZXJlIGl0IGhhc24ndCBwYXNzZWQgKHlldCkKLSAgICAgICAgd2hpbGUgKG1TdGF0ZSA8IG1TdGF0dXMubGVuZ3RoICYmIG1TdGF0dXNbbVN0YXRlXSAhPSBXQUlUX0ZPUl9VU0VSKSB7Ci0gICAgICAgICAgICBpZiAobVN0YXR1c1ttU3RhdGVdID09IFBBU1MpIHsKLSAgICAgICAgICAgICAgICBzZXRJdGVtU3RhdGUobVN0YXRlLCB0cnVlKTsKLSAgICAgICAgICAgICAgICBtU3RhdGUrKzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobVN0YXR1c1ttU3RhdGVdID09IEZBSUwpIHsKLSAgICAgICAgICAgICAgICBzZXRJdGVtU3RhdGUobVN0YXRlLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtU3RhdGUgPCBtU3RhdHVzLmxlbmd0aCAmJiBtU3RhdHVzW21TdGF0ZV0gPT0gV0FJVF9GT1JfVVNFUikgewotICAgICAgICAgICAgbWFya0l0ZW1XYWl0aW5nKG1TdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0ZXN0QWR2YW5jZShtU3RhdGUpOwotCi0gICAgICAgIGlmIChtU3RhdGUgPT0gbVN0YXR1cy5sZW5ndGggLSAxICYmIG1TdGF0dXNbbVN0YXRlXSA9PSBQQVNTKSB7Ci0gICAgICAgICAgICAvLyBBbGwgdGVzdHMgcnVuIGFuZCBwYXNzCi0gICAgICAgICAgICBnZXRQYXNzQnV0dG9uKCkuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIExhdW5jaGVzIExvY2F0aW9ucyAmZ3Q7IFNldHRpbmdzIHNvIHRoZSB1c2VyIGNhbiBzZXQgdGhlIGxvY2F0aW9uIG1vZGUuIFB1YmxpYyBiZWNhdXNlIGl0Ci0gICAgICogaXMgcmVmZXJlbmNlZCBieSBsYXlvdXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbGF1bmNoU2V0dGluZ3MoVmlldyBidXR0b24pIHsKLSAgICAgICAgc3RhcnRBY3Rpdml0eShuZXcgSW50ZW50KFNldHRpbmdzLkFDVElPTl9MT0NBVElPTl9TT1VSQ0VfU0VUVElOR1MpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdG8gdGhlIHN0YXRlIG1hY2hpbmUgdG8gcHJvZ3Jlc3MgdGhyb3VnaCB0aGUgdGVzdHMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgbmV4dCgpIHsKLSAgICAgICAgbUhhbmRsZXIucG9zdChtUnVubmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXYWl0IGZvciB0aGluZ3MgdG8gc2V0dGxlIGJlZm9yZSByZXR1cm5pbmcgdG8gdGhlIHN0YXRlIG1hY2hpbmUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZGVsYXkoKSB7Ci0gICAgICAgIG1IYW5kbGVyLnBvc3REZWxheWVkKG1SdW5uZXIsIDIwMDApOwotICAgIH0KLQotICAgIC8vIFRlc3RzCi0KLSAgICBwcml2YXRlIGludCBnZXRMb2NhdGlvbk1vZGUoKSB7Ci0gICAgICAgIENvbnRlbnRSZXNvbHZlciBjciA9IGdldENvbnRlbnRSZXNvbHZlcigpOwotICAgICAgICByZXR1cm4gU2VjdXJlLmdldEludChjciwgU2VjdXJlLkxPQ0FUSU9OX01PREUsIFNlY3VyZS5MT0NBVElPTl9NT0RFX09GRik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVzdElzT24oaW50IGkpIHsKLSAgICAgICAgaW50IG1vZGUgPSBnZXRMb2NhdGlvbk1vZGUoKTsKLSAgICAgICAgYm9vbGVhbiBwYXNzZWQgPSBtb2RlICE9IFNlY3VyZS5MT0NBVElPTl9NT0RFX09GRjsKLSAgICAgICAgaWYgKHBhc3NlZCkgewotICAgICAgICAgICAgbVN0YXR1c1tpXSA9IFBBU1M7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtU3RhdHVzW2ldID0gV0FJVF9GT1JfVVNFUjsKLSAgICAgICAgfQotICAgICAgICBuZXh0KCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVzdElzRXhwZWN0ZWRNb2RlKGludCBpLCBpbnQgZXhwZWN0ZWRNb2RlKSB7Ci0gICAgICAgIGludCBtb2RlID0gZ2V0TG9jYXRpb25Nb2RlKCk7Ci0gICAgICAgIGJvb2xlYW4gcGFzc2VkID0gbW9kZSA9PSBleHBlY3RlZE1vZGU7Ci0gICAgICAgIGlmIChwYXNzZWQpIHsKLSAgICAgICAgICAgIG1TdGF0dXNbaV0gPSBQQVNTOwotICAgICAgICAgICAgbmV4dCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVN0YXR1c1tpXSA9IFdBSVRfRk9SX1VTRVI7Ci0gICAgICAgICAgICBkZWxheSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVzdFNlY3VyZVByb3ZpZGVySXNFbmFibGVkKGludCBpLCBTdHJpbmcgcHJvdmlkZXIpIHsKLSAgICAgICAgQ29udGVudFJlc29sdmVyIGNyID0gZ2V0Q29udGVudFJlc29sdmVyKCk7Ci0gICAgICAgIGJvb2xlYW4gZW5hYmxlZCA9IFNlY3VyZS5pc0xvY2F0aW9uUHJvdmlkZXJFbmFibGVkKGNyLCBwcm92aWRlcik7Ci0gICAgICAgIG1TdGF0dXNbaV0gPSBlbmFibGVkID8gUEFTUyA6IEZBSUw7Ci0gICAgICAgIG5leHQoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZXN0U2VjdXJlUHJvdmlkZXJJc0Rpc2FibGVkKGludCBpLCBTdHJpbmcgcHJvdmlkZXIpIHsKLSAgICAgICAgQ29udGVudFJlc29sdmVyIGNyID0gZ2V0Q29udGVudFJlc29sdmVyKCk7Ci0gICAgICAgIGJvb2xlYW4gZW5hYmxlZCA9IFNlY3VyZS5pc0xvY2F0aW9uUHJvdmlkZXJFbmFibGVkKGNyLCBwcm92aWRlcik7Ci0gICAgICAgIG1TdGF0dXNbaV0gPSAhZW5hYmxlZCA/IFBBU1MgOiBGQUlMOwotICAgICAgICBuZXh0KCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVzdE1hbmFnZXJQcm92aWRlcklzRW5hYmxlZChpbnQgaSwgU3RyaW5nIGdwc1Byb3ZpZGVyKSB7Ci0gICAgICAgIExvY2F0aW9uTWFuYWdlciBtYW5hZ2VyID0gKExvY2F0aW9uTWFuYWdlcikgZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkxPQ0FUSU9OX1NFUlZJQ0UpOwotICAgICAgICBib29sZWFuIGVuYWJsZWQgPSBtYW5hZ2VyLmlzUHJvdmlkZXJFbmFibGVkKGdwc1Byb3ZpZGVyKTsKLSAgICAgICAgbVN0YXR1c1tpXSA9IGVuYWJsZWQgPyBQQVNTIDogRkFJTDsKLSAgICAgICAgbmV4dCgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHRlc3RNYW5hZ2VyUHJvdmlkZXJJc0Rpc2FibGVkKGludCBpLCBTdHJpbmcgZ3BzUHJvdmlkZXIpIHsKLSAgICAgICAgTG9jYXRpb25NYW5hZ2VyIG1hbmFnZXIgPSAoTG9jYXRpb25NYW5hZ2VyKSBnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTE9DQVRJT05fU0VSVklDRSk7Ci0gICAgICAgIGJvb2xlYW4gZW5hYmxlZCA9IG1hbmFnZXIuaXNQcm92aWRlckVuYWJsZWQoZ3BzUHJvdmlkZXIpOwotICAgICAgICBtU3RhdHVzW2ldID0gIWVuYWJsZWQgPyBQQVNTIDogRkFJTDsKLSAgICAgICAgbmV4dCgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHRlc3RBZHZhbmNlKGludCBzdGF0ZSk7Ci19CmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbG9jYXRpb24vYmFzZS9FbWVyZ2VuY3lDYWxsQmFzZVRlc3RBY3Rpdml0eS5qYXZhIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL2xvY2F0aW9uL2Jhc2UvRW1lcmdlbmN5Q2FsbEJhc2VUZXN0QWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjVmNzU4Ci0tLSAvZGV2L251bGwKKysrIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL2xvY2F0aW9uL2Jhc2UvRW1lcmdlbmN5Q2FsbEJhc2VUZXN0QWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIubG9jYXRpb24uYmFzZTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2U7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5jdHMuR25zc1Rlc3RDYXNlOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5FZGl0VGV4dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5Ub2FzdDsKK2ltcG9ydCBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIuUjsKK2ltcG9ydCBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIuVGVzdFJlc3VsdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworLyoqCisgKiBBbiBBY3Rpdml0eSB0aGF0IGFsbG93cyBHbnNzIENUUyB0ZXN0cyB0byBiZSBleGVjdXRlZCBpbnNpZGUgQ3RzVmVyaWZpZXIuCisgKgorICogU3ViLWNsYXNzZXMgcGFzcyB0aGUgdGVzdCBjbGFzcyBhcyBwYXJ0IG9mIGNvbnN0cnVjdGlvbi4KKyAqIE9uZSBKVW5pdCB0ZXN0IGNsYXNzIGlzIGV4ZWN1dGVkIHBlciBBY3Rpdml0eSwgdGhlIHRlc3QgY2xhc3MgY2FuIHN0aWxsIGJlIGV4ZWN1dGVkIG91dHNpZGUKKyAqIEN0c1ZlcmlmaWVyLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRW1lcmdlbmN5Q2FsbEJhc2VUZXN0QWN0aXZpdHkgZXh0ZW5kcyBHbnNzQ3RzVGVzdEFjdGl2aXR5IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEhPTkVfTlVNQkVSX0tFWSA9ICJhbmRyb2lkLmN0cy5lbWVyZ2VuY3ljYWxsLnBob25lbnVtYmVyIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGVmYXVsdFBob25lUGFja2FnZU5hbWUgPSAiY29tLmdvb2dsZS5hbmRyb2lkLmRpYWxlciI7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYSBDVFMgdGVzdCBleGVjdXRvci4gSXQgd2lsbCBleGVjdXRlIGEgc3RhbmRhbG9uZSBDVFMgdGVzdCBjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXN0Q2xhc3MgVGhlIHRlc3QgY2xhc3MgdG8gZXhlY3V0ZSwgaXQgbXVzdCBiZSBhIHN1YmNsYXNzIG9mIHtAbGluayBBbmRyb2lkVGVzdENhc2V9LgorICAgICAqLworICAgIHByb3RlY3RlZCBFbWVyZ2VuY3lDYWxsQmFzZVRlc3RBY3Rpdml0eShDbGFzczw/IGV4dGVuZHMgR25zc1Rlc3RDYXNlPiB0ZXN0Q2xhc3MpIHsKKyAgICAgICAgc3VwZXIodGVzdENsYXNzLCBSLmxheW91dC5nbnNzX2VtZXJnZW5jeV90ZXN0KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgbG9uZyBnZXRQaG9uZUNhbGxEdXJhdGlvbk1zKCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgLy8gc2tpcCBjdXJyZW50IHRlc3QgaWYgZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBjZWxsdWxhcgorICAgICAgICBpZiAoIUVtZXJnZW5jeUNhbGxVdGlsLmlzUGhvbmVEZXZpY2UodGhpcykpIHsKKyAgICAgICAgICBTdHJpbmcgc2tpcEluZm8gPSBnZXRSZXNvdXJjZXMoKS5nZXRTdHJpbmcoUi5zdHJpbmcuZW1lcmdlbmN5X2NhbGxfc2tpcF9pbmZvKTsKKyAgICAgICAgICBUZXN0UmVzdWx0LnNldFBhc3NlZFJlc3VsdCh0aGlzLCBzdXBlci5nZXRDbGFzcygpLmdldE5hbWUoKSwgc2tpcEluZm8pOworICAgICAgICAgIFRvYXN0IHRvYXN0ID0gVG9hc3QubWFrZVRleHQoZ2V0QXBwbGljYXRpb25Db250ZXh0KCksIHNraXBJbmZvLCBUb2FzdC5MRU5HVEhfTE9ORyk7CisgICAgICAgICAgdG9hc3Quc2hvdygpOworICAgICAgICAgIHRoaXMuZmluaXNoKCk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIG92ZXJyaWRlIHRoZSB0ZXN0IGluZm8KKyAgICAgICAgbVRleHRWaWV3LnNldFRleHQoUi5zdHJpbmcubG9jYXRpb25fZW1lcmdlbmN5X2NhbGxfdGVzdF9pbmZvKTsKKyAgICAgICAgRW1lcmdlbmN5Q2FsbFV0aWwuc2V0RGVmYXVsdERpYWxlcih0aGlzLCB0aGlzLmdldFBhY2thZ2VOYW1lKCkpOworICAgICAgICBzZXRQYXNzRmFpbEJ1dHRvbkNsaWNrTGlzdGVuZXJzKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25EZXN0cm95KCkgeworICAgICAgICBzdXBlci5vbkRlc3Ryb3koKTsKKyAgICAgICAgRW1lcmdlbmN5Q2FsbFV0aWwuc2V0RGVmYXVsdERpYWxlcih0aGlzLCBkZWZhdWx0UGhvbmVQYWNrYWdlTmFtZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gc2hvd0xvY2FsTnVtYmVySW5wdXRib3goKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB0YXJnZXQpIHsKKworICAgICAgICBBbGVydERpYWxvZy5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgQWxlcnREaWFsb2cuQnVpbGRlcih0aGlzKTsKKyAgICAgICAgZmluYWwgRnJhbWVMYXlvdXQgZnJhbWVWaWV3ID0gbmV3IEZyYW1lTGF5b3V0KHRoaXMpOworICAgICAgICBidWlsZGVyLnNldFZpZXcoZnJhbWVWaWV3KTsKKworICAgICAgICBmaW5hbCBib29sZWFuIGVuYWJsZUxvY2FsTnVtYmVySW5wdXRCb3ggPSBzaG93TG9jYWxOdW1iZXJJbnB1dGJveCgpOworICAgICAgICBmaW5hbCBBbGVydERpYWxvZyBhbGVydERpYWxvZyA9IGJ1aWxkZXIuY3JlYXRlKCk7CisgICAgICAgIExheW91dEluZmxhdGVyIGluZmxhdGVyID0gYWxlcnREaWFsb2cuZ2V0TGF5b3V0SW5mbGF0ZXIoKTsKKworICAgICAgICBWaWV3IGRpYWxvZ1ZpZXc7CisgICAgICAgIGlmIChlbmFibGVMb2NhbE51bWJlcklucHV0Qm94KSB7CisgICAgICAgICAgICBkaWFsb2dWaWV3ID0KKyAgICAgICAgICAgICAgICBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LmVtZXJnZW5jeV9jYWxsX21zZ190ZXN0X2NvbmZpcm1fZGlhbG9nLCBmcmFtZVZpZXcpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGlhbG9nVmlldyA9IGluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQuZW1lcmdlbmN5X2NhbGxfY29uZmlybV9kaWFsb2csIGZyYW1lVmlldyk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgRWRpdFRleHQgdGFyZ2V0TnVtYmVyRWRpdFRleHQgPQorICAgICAgICAgICAgKEVkaXRUZXh0KSBkaWFsb2dWaWV3LmZpbmRWaWV3QnlJZChSLmlkLmVtZXJnZW5jeV9udW1iZXIpOworICAgICAgICBmaW5hbCBCdXR0b24gZGlhbEJ1dHRvbiA9IChCdXR0b24pIGRpYWxvZ1ZpZXcuZmluZFZpZXdCeUlkKFIuaWQuZGlhbF9idXR0b24pOworICAgICAgICBkaWFsQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgQnV0dG9uLk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICBpZiAoZW5hYmxlTG9jYWxOdW1iZXJJbnB1dEJveCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBFZGl0VGV4dCBjdXJyZW50TnVtYmVyRWRpdFRleHQgPQorICAgICAgICAgICAgICAgICAgICAgICAgKEVkaXRUZXh0KSBkaWFsb2dWaWV3LmZpbmRWaWV3QnlJZChSLmlkLmxvY2FsX3Bob25lX251bWJlcik7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjdXJyZW50TnVtYmVyID0gY3VycmVudE51bWJlckVkaXRUZXh0LmdldFRleHQoKS50b1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICAvLyBwYXNzIHRoZSBudW1iZXIgdG8gY3RzIHRlc3RzIGZvciBjdHMgdmVyaWZpZXIgVUksIHRocm91Z2ggU3lzdGVtIHByb3BlcnR5LgorICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoUEhPTkVfTlVNQkVSX0tFWSwgY3VycmVudE51bWJlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludCB0YXJnZXRQaG9uZU51bWJlciA9CisgICAgICAgICAgICAgICAgICAgIEludGVnZXIucGFyc2VJbnQodGFyZ2V0TnVtYmVyRWRpdFRleHQuZ2V0VGV4dCgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIGxvbmcgY2FsbER1cmF0aW9uTXMgPSBFbWVyZ2VuY3lDYWxsQmFzZVRlc3RBY3Rpdml0eS50aGlzLmdldFBob25lQ2FsbER1cmF0aW9uTXMoKTsKKyAgICAgICAgICAgICAgICBFbWVyZ2VuY3lDYWxsVXRpbC5tYWtlUGhvbmVDYWxsKAorICAgICAgICAgICAgICAgICAgICBFbWVyZ2VuY3lDYWxsQmFzZVRlc3RBY3Rpdml0eS50aGlzLCB0YXJnZXRQaG9uZU51bWJlcik7CisgICAgICAgICAgICAgICAgRW1lcmdlbmN5Q2FsbEJhc2VUZXN0QWN0aXZpdHkuc3VwZXIub25DbGljayh0YXJnZXQpOworICAgICAgICAgICAgICAgIEVtZXJnZW5jeUNhbGxVdGlsLmVuZENhbGxXaXRoRGVsYXkoCisgICAgICAgICAgICAgICAgICAgIEVtZXJnZW5jeUNhbGxCYXNlVGVzdEFjdGl2aXR5LnRoaXMuZ2V0QXBwbGljYXRpb25Db250ZXh0KCksIGNhbGxEdXJhdGlvbk1zKTsKKyAgICAgICAgICAgICAgICBhbGVydERpYWxvZy5kaXNtaXNzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBhbGVydERpYWxvZy5zaG93KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL2xvY2F0aW9uL2Jhc2UvRW1lcmdlbmN5Q2FsbFV0aWwuamF2YSBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9sb2NhdGlvbi9iYXNlL0VtZXJnZW5jeUNhbGxVdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI4NDk4ZQotLS0gL2Rldi9udWxsCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9sb2NhdGlvbi9iYXNlL0VtZXJnZW5jeUNhbGxVdGlsLmphdmEKQEAgLTAsMCArMSwxMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLmxvY2F0aW9uLmJhc2U7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BbGVydERpYWxvZzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLnRlbGVjb20uVGVsZWNvbU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuVGVsZXBob255TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuSW5wdXRUeXBlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRWRpdFRleHQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OworaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5SOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworLyoqCisgKiBUaGUgRW1lcmdlbmN5Q2FsbFV0aWwgY2xhc3MgcHJvdmlkZXMgdXRpbCBmdW5jdGlvbnMgcmVsYXRlZCB0byB0aGUgZW1lcmdlbmN5IGNhbGwuCisgKi8KK3B1YmxpYyBjbGFzcyBFbWVyZ2VuY3lDYWxsVXRpbCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFUVVFU1RfQ09ERV9TRVRfREVGQVVMVF9ESUFMRVIgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRW1lcmdlbmN5Q2FsbFV0aWwiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgV0FJVF9GT1JfQ09OTkVDVElPTl9NUyA9IFRpbWVVbml0LlNFQ09ORFMudG9NaWxsaXMoMyk7CisKKyAgICAvKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gc2V0IGRlZmF1bHQgZGlhbGVyIGFwcC4KKyAgICAgKiBUbyBkaWFsIDkxMSwgaXQgcmVxdWlyZXMgdG8gc2V0IHRoZSBkaWFsZXIgdG8gYmUgdGhlIHN5c3RlbSBkZWZhdWx0IGRpYWwgYXBwLgorICAgICAqCisgICAgICogQHBhcmFtIGFjdGl2aXR5IGN1cnJlbnQgQWN0aXZpdHkuCisgICAgICogQHBhcmFtIHBhY2thZ2VOYW1lIGRpYWxlciBwYWNrYWdlIG5hbWUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldERlZmF1bHREaWFsZXIoQWN0aXZpdHkgYWN0aXZpdHksIFN0cmluZyBwYWNrYWdlTmFtZSkgeworICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChUZWxlY29tTWFuYWdlci5BQ1RJT05fQ0hBTkdFX0RFRkFVTFRfRElBTEVSKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFRlbGVjb21NYW5hZ2VyLkVYVFJBX0NIQU5HRV9ERUZBVUxUX0RJQUxFUl9QQUNLQUdFX05BTUUsIHBhY2thZ2VOYW1lKTsKKyAgICAgICAgYWN0aXZpdHkuc3RhcnRBY3Rpdml0eUZvclJlc3VsdChpbnRlbnQsIFJFUVVFU1RfQ09ERV9TRVRfREVGQVVMVF9ESUFMRVIpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWtlUGhvbmVDYWxsKEFjdGl2aXR5IGFjdGl2aXR5LCBpbnQgcGhvbmVOdW1iZXIpIHsKKyAgICAgICAgSW50ZW50IGNhbGxJbnRlbnQgPSBuZXcgSW50ZW50KEludGVudC5BQ1RJT05fQ0FMTCk7CisgICAgICAgIGNhbGxJbnRlbnQuc2V0RGF0YShVcmkucGFyc2UoInRlbDoiICsgcGhvbmVOdW1iZXIpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNhbGxJbnRlbnQuc2V0RmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTk9fVVNFUl9BQ1RJT04pOworICAgICAgICAgICAgYWN0aXZpdHkuc3RhcnRBY3Rpdml0eUZvclJlc3VsdChjYWxsSW50ZW50LCBSRVFVRVNUX0NPREVfU0VUX0RFRkFVTFRfRElBTEVSKTsKKyAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIkZhaWxlZCB0byBtYWtlIHRoZSBwaG9uZSBjYWxsOiAiICsgZXgudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gc2xlZXAgM3NlYyB0byBtYWtlIHN1cmUgY2FsbCBpcyBjb25uZWN0ZWQKKyAgICAgICAgYWN0aXZpdHkucnVuT25VaVRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoV0FJVF9GT1JfQ09OTkVDVElPTl9NUyk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRmFpbGVkIHRvIG1ha2UgdGhlIHBob25lIGNhbGw6ICIgKyBleC50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBlbmRDYWxsV2l0aERlbGF5KENvbnRleHQgY29udGV4dCwgbG9uZyBkZWxheU1zKSB7CisgICAgICAgIFJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKGRlbGF5TXMpOworICAgICAgICAgICAgICAgICAgICBlbmRDYWxsKGNvbnRleHQpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkZhaWxlZCB0byBtYWtlIHRoZSBwaG9uZSBjYWxsOiAiICsgZXgudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBuZXcgVGhyZWFkKHJ1bm5hYmxlKS5zdGFydCgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Bob25lRGV2aWNlKEFjdGl2aXR5IGFjdGl2aXR5KSB7CisgICAgICAgIFRlbGVwaG9ueU1hbmFnZXIgdE1nciA9CisgICAgICAgICAgICAoVGVsZXBob255TWFuYWdlcikgYWN0aXZpdHkuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlRFTEVQSE9OWV9TRVJWSUNFKTsKKyAgICAgICAgaWYodE1nci5nZXRQaG9uZVR5cGUoKSA9PSBUZWxlcGhvbnlNYW5hZ2VyLlBIT05FX1RZUEVfTk9ORSl7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBlbmRDYWxsKENvbnRleHQgY29udGV4dCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgVGVsZXBob255TWFuYWdlciB0ZWxlcGhvbnlNYW5hZ2VyID0KKyAgICAgICAgICAgICAgICAoVGVsZXBob255TWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuVEVMRVBIT05ZX1NFUlZJQ0UpOworCisgICAgICAgICAgICBDbGFzczw/PiBjbGFzc1RlbGVwaG9ueSA9IENsYXNzLmZvck5hbWUodGVsZXBob255TWFuYWdlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICBNZXRob2QgbWV0aG9kR2V0SVRlbGVwaG9ueSA9IGNsYXNzVGVsZXBob255LmdldERlY2xhcmVkTWV0aG9kKCJnZXRJVGVsZXBob255Iik7CisgICAgICAgICAgICBtZXRob2RHZXRJVGVsZXBob255LnNldEFjY2Vzc2libGUodHJ1ZSk7CisKKyAgICAgICAgICAgIE9iamVjdCB0ZWxlcGhvbnlJbnRlcmZhY2UgPSBtZXRob2RHZXRJVGVsZXBob255Lmludm9rZSh0ZWxlcGhvbnlNYW5hZ2VyKTsKKworICAgICAgICAgICAgQ2xhc3M8Pz4gdGVsZXBob255SW50ZXJmYWNlQ2xhc3MgPQorICAgICAgICAgICAgICAgIENsYXNzLmZvck5hbWUodGVsZXBob255SW50ZXJmYWNlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIE1ldGhvZCBtZXRob2RFbmRDYWxsID0gdGVsZXBob255SW50ZXJmYWNlQ2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoImVuZENhbGwiKTsKKworICAgICAgICAgICAgbWV0aG9kRW5kQ2FsbC5pbnZva2UodGVsZXBob255SW50ZXJmYWNlKTsKKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiRmFpbGVkIHRvIGNhbmNlbCB0aGUgY2FsbDogIiArIGUudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0Q3VycmVudFBob25lTnVtYmVyKEFjdGl2aXR5IGFjdGl2aXR5KSB7CisgICAgICAgIFRlbGVwaG9ueU1hbmFnZXIgdE1nciA9CisgICAgICAgICAgICAoVGVsZXBob255TWFuYWdlcilhY3Rpdml0eS5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuVEVMRVBIT05ZX1NFUlZJQ0UpOworICAgICAgICByZXR1cm4gdE1nci5nZXRMaW5lMU51bWJlcigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9sb2NhdGlvbi9iYXNlL0duc3NDdHNUZXN0QWN0aXZpdHkuamF2YSBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9sb2NhdGlvbi9iYXNlL0duc3NDdHNUZXN0QWN0aXZpdHkuamF2YQppbmRleCAxZTdlNDgxLi5lNjJjMjFmIDEwMDY0NAotLS0gYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbG9jYXRpb24vYmFzZS9HbnNzQ3RzVGVzdEFjdGl2aXR5LmphdmEKKysrIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL2xvY2F0aW9uL2Jhc2UvR25zc0N0c1Rlc3RBY3Rpdml0eS5qYXZhCkBAIC01OSw2ICs1OSwxOCBAQAogICAgICAgICBzdXBlcih0ZXN0Q2xhc3MpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIHRvIGJlIHVzZWQgYnkgc3ViY2xhc3Nlcy4gSXQgYWxsb3dzIHRvIHByb3ZpZGUgYSBjdXN0b20gbGF5b3V0IGZvciB0aGUgdGVzdCBVSS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXN0Q2xhc3MgVGhlIGNsYXNzIHRoYXQgY29udGFpbnMgdGhlIHRlc3RzLiBJdCBpcyBkZXBlbmRhbnQgb24gdGVzdCBleGVjdXRvcgorICAgICAqICAgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3Nlcy4KKyAgICAgKiBAcGFyYW0gbGF5b3V0SWQgVGhlIElkIG9mIHRoZSBsYXlvdXQgdG8gdXNlIGZvciB0aGUgdGVzdCBVSS4gVGhlIGxheW91dCBtdXN0IGNvbnRhaW4gYWxsIHRoZQorICAgICAqICAgICAgICAgICAgICAgICBlbGVtZW50cyBpbiB0aGUgYmFzZSBsYXlvdXQge0Bjb2RlIFIubGF5b3V0Lmduc3NfdGVzdH0uCisgICAgICovCisgICAgcHJvdGVjdGVkIEduc3NDdHNUZXN0QWN0aXZpdHkoQ2xhc3M8PyBleHRlbmRzIEduc3NUZXN0Q2FzZT4gdGVzdENsYXNzLCBpbnQgbGF5b3V0SWQpIHsKKyAgICAgICAgc3VwZXIodGVzdENsYXNzLCBsYXlvdXRJZCk7CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgYWN0aXZpdHlTZXRVcCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CiAgICAgICAgIHdhaXRGb3JVc2VyVG9CZWdpbigpOwpAQCAtODcsNyArOTksNyBAQAogCiAgICAgLyoqCiAgICAgICogRm9yIHJlZmVyZW5jZSBvbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyB0ZXN0IGV4ZWN1dG9yIHNlZToKLSAgICAgKiAgICAgIGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIKKyAgICAgKiAgICAgIGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lcgogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBHbnNzVGVzdERldGFpbHMgZXhlY3V0ZVRlc3RzKCkgewpkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL21hbmFnZWRwcm92aXNpb25pbmcvQnlvZEZsb3dUZXN0QWN0aXZpdHkuamF2YSBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9tYW5hZ2VkcHJvdmlzaW9uaW5nL0J5b2RGbG93VGVzdEFjdGl2aXR5LmphdmEKaW5kZXggN2U1OWU5OC4uNjdmODJkMCAxMDA2NDQKLS0tIGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL21hbmFnZWRwcm92aXNpb25pbmcvQnlvZEZsb3dUZXN0QWN0aXZpdHkuamF2YQorKysgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbWFuYWdlZHByb3Zpc2lvbmluZy9CeW9kRmxvd1Rlc3RBY3Rpdml0eS5qYXZhCkBAIC0zMSw4ICszMSw2IEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuT25DbGlja0xpc3RlbmVyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRvYXN0OwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DZGRUZXN0OwotCiBpbXBvcnQgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLkFycmF5VGVzdExpc3RBZGFwdGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5EaWFsb2dUZXN0TGlzdEFjdGl2aXR5OwogaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5SOwpAQCAtNTMsOSArNTEsMTQgQEAKICAqIFRoZSBmaXJzdCB0d28gdmVyaWZpY2F0aW9ucyBhcmUgcGVyZm9ybWVkIGF1dG9tYXRpY2FsbHksIGJ5IGludGVyYWN0aW5nIHdpdGggcHJvZmlsZSBvd25lciB1c2luZwogICogY3Jvc3MtcHJvZmlsZSBpbnRlbnRzLCB3aGlsZSB0aGUgbGFzdCB0d28gYXJlIGNhcnJpZWQgb3V0IG1hbnVhbGx5IGJ5IHRoZSB1c2VyLgogICovCi1AQ2RkVGVzdChyZXF1aXJlbWVudD0iMy45L0gtMS0xLDMuOS4xLjIvQy0xLTEsQy0xLTIsQy0xLTMsMy45LjIvQy0xLTEsQy0xLTMsQy0xLTQsQy0xLTUsQy0xLTYsQy0xLTcsQy0xLTEwIikKIHB1YmxpYyBjbGFzcyBCeW9kRmxvd1Rlc3RBY3Rpdml0eSBleHRlbmRzIERpYWxvZ1Rlc3RMaXN0QWN0aXZpdHkgewogCisgICAgLy8gQWN0aW9uIGZvciBkZWxpdmVyaW5nIHN1Yi10ZXN0IHJlc3VsdCBmcm9tIHRoZSBwcm9maWxlLgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9URVNUX1JFU1VMVCA9CisgICAgICAgICAgICAiY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLm1hbmFnZWRwcm92aXNpb25pbmcuQllPRF9URVNUX1JFU1VMVCI7CisgICAgLy8gRXh0cmEgZm9yIEFDVElPTl9URVNUX1JFU1VMVCBjb250YWluaW5nIHRlc3QgcmVzdWx0LgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1JFU1VMVCA9ICJleHRyYS1yZXN1bHQiOworCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJCeW9kRmxvd1Rlc3RBY3Rpdml0eSI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgQ29ubmVjdGl2aXR5TWFuYWdlciBtQ207CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFUVVFU1RfTUFOQUdFRF9QUk9WSVNJT05JTkcgPSAwOwpAQCAtODEsNiArODQsNyBAQAogICAgIHByaXZhdGUgRGlhbG9nVGVzdExpc3RJdGVtIG1Xb3JrTm90aWZpY2F0aW9uQmFkZ2VkVGVzdDsKICAgICBwcml2YXRlIERpYWxvZ1Rlc3RMaXN0SXRlbSBtV29ya1N0YXR1c0Jhckljb25UZXN0OwogICAgIHByaXZhdGUgRGlhbG9nVGVzdExpc3RJdGVtIG1Xb3JrU3RhdHVzQmFyVG9hc3RUZXN0OworICAgIHByaXZhdGUgRGlhbG9nVGVzdExpc3RJdGVtIG1Vc2VyU2V0dGluZ3NWaXNpYmxlVGVzdDsKICAgICBwcml2YXRlIERpYWxvZ1Rlc3RMaXN0SXRlbSBtQXBwU2V0dGluZ3NWaXNpYmxlVGVzdDsKICAgICBwcml2YXRlIERpYWxvZ1Rlc3RMaXN0SXRlbSBtTG9jYXRpb25TZXR0aW5nc1Zpc2libGVUZXN0OwogICAgIHByaXZhdGUgRGlhbG9nVGVzdExpc3RJdGVtIG1XaUZpRGF0YVVzYWdlU2V0dGluZ3NWaXNpYmxlVGVzdDsKQEAgLTEwNCwxMiArMTA4LDE0IEBACiAgICAgcHJpdmF0ZSBEaWFsb2dUZXN0TGlzdEl0ZW0gbUNvbmZpcm1Xb3JrQ3JlZGVudGlhbHM7CiAgICAgcHJpdmF0ZSBEaWFsb2dUZXN0TGlzdEl0ZW0gbVBhcmVudFByb2ZpbGVQYXNzd29yZDsKICAgICBwcml2YXRlIFRlc3RMaXN0SXRlbSBtVnBuVGVzdDsKKyAgICBwcml2YXRlIFRlc3RMaXN0SXRlbSBtS2V5Q2hhaW5UZXN0OwogICAgIHByaXZhdGUgVGVzdExpc3RJdGVtIG1BbHdheXNPblZwblNldHRpbmdzVGVzdDsKICAgICBwcml2YXRlIFRlc3RMaXN0SXRlbSBtUmVjZW50c1Rlc3Q7CiAgICAgcHJpdmF0ZSBUZXN0TGlzdEl0ZW0gbURpc2FsbG93QXBwc0NvbnRyb2xUZXN0OwogICAgIHByaXZhdGUgVGVzdExpc3RJdGVtIG1Pcmdhbml6YXRpb25JbmZvVGVzdDsKICAgICBwcml2YXRlIFRlc3RMaXN0SXRlbSBtUG9saWN5VHJhbnNwYXJlbmN5VGVzdDsKICAgICBwcml2YXRlIFRlc3RMaXN0SXRlbSBtVHVybk9mZldvcmtGZWF0dXJlc1Rlc3Q7CisgICAgcHJpdmF0ZSBUZXN0TGlzdEl0ZW0gbVdpZGdldFRlc3Q7CiAKICAgICBwdWJsaWMgQnlvZEZsb3dUZXN0QWN0aXZpdHkoKSB7CiAgICAgICAgIHN1cGVyKFIubGF5b3V0LnByb3Zpc2lvbmluZ19ieW9kLApAQCAtMTUxLDEwICsxNTcsMTMgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uTmV3SW50ZW50KEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgLy8gVGhpcyBpcyBjYWxsZWQgd2hlbiBtYW5hZ2VkIHByb3Zpc2lvbmluZyBjb21wbGV0ZXMgc3VjY2Vzc2Z1bGx5IHdpdGhvdXQgcmVib290LgogICAgICAgICBzdXBlci5vbk5ld0ludGVudChpbnRlbnQpOwogICAgICAgICBpZiAoQnlvZEhlbHBlckFjdGl2aXR5LkFDVElPTl9QUk9GSUxFX09XTkVSX1NUQVRVUy5lcXVhbHMoaW50ZW50LmdldEFjdGlvbigpKSkgeworICAgICAgICAgICAgLy8gVGhpcyBpcyBjYWxsZWQgd2hlbiBtYW5hZ2VkIHByb3Zpc2lvbmluZyBjb21wbGV0ZXMgc3VjY2Vzc2Z1bGx5IHdpdGhvdXQgcmVib290LgogICAgICAgICAgICAgaGFuZGxlU3RhdHVzVXBkYXRlKFJFU1VMVF9PSywgaW50ZW50KTsKKyAgICAgICAgfSBlbHNlIGlmIChBQ1RJT05fVEVTVF9SRVNVTFQuZXF1YWxzKGludGVudC5nZXRBY3Rpb24oKSkpIHsKKyAgICAgICAgICAgIC8vIENhbGxlZCB3aGVuIHN1YnRlc3QgY2Fubm90IGNvbW11bmljYXRlIHRlc3QgcmVzdWx0IGZyb20gdGhlIHByb2ZpbGUgdmlhIHNldFJlc3VsdCgpLgorICAgICAgICAgICAgaGFuZGxlTGF1bmNoVGVzdFJlc3VsdChSRVNVTFRfT0ssIGludGVudC5nZXRQYXJjZWxhYmxlRXh0cmEoRVhUUkFfUkVTVUxUKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI2MSw2ICsyNzAsNyBAQAogICAgICAgICAgICAgICAgIHdvcmtTdGF0dXNJY29uLAogICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuc3RhdF9zeXNfbWFuYWdlZF9wcm9maWxlX3N0YXR1cyk7CiAKKyAgICAgICAgLyogRGlzYWJsZSBkdWUgdG8gYi8xMTE3MzQ0MzYuCiAgICAgICAgIEludGVudCB3b3JrU3RhdHVzVG9hc3QgPSBuZXcgSW50ZW50KFdvcmtTdGF0dXNUZXN0QWN0aXZpdHkuQUNUSU9OX1dPUktfU1RBVFVTX1RPQVNUKTsKICAgICAgICAgd29ya1N0YXR1c1RvYXN0LnNldEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLKTsKICAgICAgICAgbVdvcmtTdGF0dXNCYXJUb2FzdFRlc3QgPSBuZXcgRGlhbG9nVGVzdExpc3RJdGVtKHRoaXMsCkBAIC0yNjgsNiArMjc4LDcgQEAKICAgICAgICAgICAgICAgICAiQllPRF9Xb3JrU3RhdHVzQmFyVG9hc3RUZXN0IiwKICAgICAgICAgICAgICAgICBSLnN0cmluZy5wcm92aXNpb25pbmdfYnlvZF93b3JrX3N0YXR1c190b2FzdF9pbnN0cnVjdGlvbiwKICAgICAgICAgICAgICAgICB3b3JrU3RhdHVzVG9hc3QpOworICAgICAgICAqLwogCiAgICAgICAgIG1EaXNhYmxlTm9uTWFya2V0VGVzdCA9IG5ldyBEaWFsb2dUZXN0TGlzdEl0ZW0odGhpcywKICAgICAgICAgICAgICAgICBSLnN0cmluZy5wcm92aXNpb25pbmdfYnlvZF9ub25tYXJrZXRfZGVueSwKQEAgLTI4OSw2ICszMDAsMTIgQEAKICAgICAgICAgICAgICAgICBSLnN0cmluZy5wcm92aXNpb25pbmdfYnlvZF9wcm9maWxlX3Zpc2libGVfaW5zdHJ1Y3Rpb24sCiAgICAgICAgICAgICAgICAgbmV3IEludGVudChTZXR0aW5ncy5BQ1RJT05fU0VUVElOR1MpKTsKIAorICAgICAgICBtVXNlclNldHRpbmdzVmlzaWJsZVRlc3QgPSBuZXcgRGlhbG9nVGVzdExpc3RJdGVtKHRoaXMsCisgICAgICAgICAgICBSLnN0cmluZy5wcm92aXNpb25pbmdfYnlvZF91c2VyX3NldHRpbmdzLAorICAgICAgICAgICAgIkJZT0RfVXNlclNldHRpbmdzVmlzaWJsZVRlc3QiLAorICAgICAgICAgICAgUi5zdHJpbmcucHJvdmlzaW9uaW5nX2J5b2RfdXNlcl9zZXR0aW5nc19pbnN0cnVjdGlvbiwKKyAgICAgICAgICAgIG5ldyBJbnRlbnQoU2V0dGluZ3MuQUNUSU9OX1NFVFRJTkdTKSk7CisKICAgICAgICAgbUFwcFNldHRpbmdzVmlzaWJsZVRlc3QgPSBuZXcgRGlhbG9nVGVzdExpc3RJdGVtKHRoaXMsCiAgICAgICAgICAgICAgICAgUi5zdHJpbmcucHJvdmlzaW9uaW5nX2J5b2RfYXBwX3NldHRpbmdzLAogICAgICAgICAgICAgICAgICJCWU9EX0FwcFNldHRpbmdzVmlzaWJsZVRlc3QiLApAQCAtNDA5LDcgKzQyNiw4IEBACiAgICAgICAgIG1SZWNlbnRzVGVzdCA9IFRlc3RMaXN0SXRlbS5uZXdUZXN0KHRoaXMsCiAgICAgICAgICAgICAgICAgUi5zdHJpbmcucHJvdmlzaW9uaW5nX2J5b2RfcmVjZW50cywKICAgICAgICAgICAgICAgICBSZWNlbnRzUmVkYWN0aW9uQWN0aXZpdHkuY2xhc3MuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgIG5ldyBJbnRlbnQoUmVjZW50c1JlZGFjdGlvbkFjdGl2aXR5LkFDVElPTl9SRUNFTlRTKSwKKyAgICAgICAgICAgICAgICBuZXcgSW50ZW50KFJlY2VudHNSZWRhY3Rpb25BY3Rpdml0eS5BQ1RJT05fUkVDRU5UUykuc2V0RmxhZ3MoCisgICAgICAgICAgICAgICAgICAgICAgICBJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyksCiAgICAgICAgICAgICAgICAgbnVsbCk7CiAKICAgICAgICAgbU9yZ2FuaXphdGlvbkluZm9UZXN0ID0gVGVzdExpc3RJdGVtLm5ld1Rlc3QodGhpcywKQEAgLTQxOCw2ICs0MzYsMTIgQEAKICAgICAgICAgICAgICAgICBuZXcgSW50ZW50KHRoaXMsIE9yZ2FuaXphdGlvbkluZm9UZXN0QWN0aXZpdHkuY2xhc3MpLAogICAgICAgICAgICAgICAgIG51bGwpOwogCisgICAgICAgIG1LZXlDaGFpblRlc3QgPSBUZXN0TGlzdEl0ZW0ubmV3VGVzdCh0aGlzLAorICAgICAgICAgICAgICAgIFIuc3RyaW5nLnByb3Zpc2lvbmluZ19ieW9kX2tleWNoYWluLAorICAgICAgICAgICAgICAgIEtleUNoYWluVGVzdEFjdGl2aXR5LmNsYXNzLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICBuZXcgSW50ZW50KEtleUNoYWluVGVzdEFjdGl2aXR5LkFDVElPTl9LRVlDSEFJTiksCisgICAgICAgICAgICAgICAgbnVsbCk7CisKICAgICAgICAgbVBhcmVudFByb2ZpbGVQYXNzd29yZCA9IG5ldyBEaWFsb2dUZXN0TGlzdEl0ZW0odGhpcywKICAgICAgICAgICAgICAgICBSLnN0cmluZy5wcm92aXNpb25pbmdfYnlvZF9wYXJlbnRfcHJvZmlsZV9wYXNzd29yZCwKICAgICAgICAgICAgICAgICAiQllPRF9QYXJlbnRQcm9maWxlUGFzc3dvcmRUZXN0IiwKQEAgLTQyOCw3ICs0NTIsNyBAQAogICAgICAgICAgICAgICAgIFBvbGljeVRyYW5zcGFyZW5jeVRlc3RMaXN0QWN0aXZpdHkuY2xhc3MpOwogICAgICAgICBwb2xpY3lUcmFuc3BhcmVuY3lUZXN0SW50ZW50LnB1dEV4dHJhKAogICAgICAgICAgICAgICAgIFBvbGljeVRyYW5zcGFyZW5jeVRlc3RMaXN0QWN0aXZpdHkuRVhUUkFfTU9ERSwKLSAgICAgICAgICAgICAgICBQb2xpY3lUcmFuc3BhcmVuY3lUZXN0TGlzdEFjdGl2aXR5Lk1PREVfUFJPRklMRV9PV05FUik7CisgICAgICAgICAgICAgICAgUG9saWN5VHJhbnNwYXJlbmN5VGVzdExpc3RBY3Rpdml0eS5NT0RFX01BTkFHRURfUFJPRklMRSk7CiAgICAgICAgIHBvbGljeVRyYW5zcGFyZW5jeVRlc3RJbnRlbnQucHV0RXh0cmEoCiAgICAgICAgICAgICAgICAgUG9saWN5VHJhbnNwYXJlbmN5VGVzdEFjdGl2aXR5LkVYVFJBX1RFU1RfSUQsICJCWU9EX1BvbGljeVRyYW5zcGFyZW5jeSIpOwogICAgICAgICBtUG9saWN5VHJhbnNwYXJlbmN5VGVzdCA9IFRlc3RMaXN0SXRlbS5uZXdUZXN0KHRoaXMsCkBAIC00NDYsMTIgKzQ3MCwxNiBAQAogCiAgICAgICAgIGFkYXB0ZXIuYWRkKG1Xb3JrTm90aWZpY2F0aW9uQmFkZ2VkVGVzdCk7CiAgICAgICAgIGFkYXB0ZXIuYWRkKG1Xb3JrU3RhdHVzQmFySWNvblRlc3QpOworCisgICAgICAgIC8qIERpc2FibGUgZHVlIHRvIGIvMTExNzM0NDM2LgogICAgICAgICBhZGFwdGVyLmFkZChtV29ya1N0YXR1c0JhclRvYXN0VGVzdCk7CisgICAgICAgICovCiAKICAgICAgICAgLy8gU2V0dGluZ3MgcmVsYXRlZCB0ZXN0cy4KICAgICAgICAgYWRhcHRlci5hZGQobVByb2ZpbGVBY2NvdW50VmlzaWJsZVRlc3QpOwogICAgICAgICBhZGFwdGVyLmFkZChtRGV2aWNlQWRtaW5WaXNpYmxlVGVzdCk7CiAgICAgICAgIGFkYXB0ZXIuYWRkKG1DcmVkU2V0dGluZ3NWaXNpYmxlVGVzdCk7CisgICAgICAgIGFkYXB0ZXIuYWRkKG1Vc2VyU2V0dGluZ3NWaXNpYmxlVGVzdCk7CiAgICAgICAgIGFkYXB0ZXIuYWRkKG1BcHBTZXR0aW5nc1Zpc2libGVUZXN0KTsKICAgICAgICAgYWRhcHRlci5hZGQobUxvY2F0aW9uU2V0dGluZ3NWaXNpYmxlVGVzdCk7CiAgICAgICAgIGFkYXB0ZXIuYWRkKG1QcmludFNldHRpbmdzVmlzaWJsZVRlc3QpOwpAQCAtNTY2LDYgKzU5NCw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfTsKICAgICAgICAgICAgIGFkYXB0ZXIuYWRkKG1EaXNhYmxlTmZjQmVhbVRlc3QpOworICAgICAgICAgICAgYWRhcHRlci5hZGQobUtleUNoYWluVGVzdCk7CiAgICAgICAgIH0KIAogICAgICAgICAvKiBJZiB0aGVyZSBpcyBhbiBhcHBsaWNhdGlvbiB0aGF0IGhhbmRsZXMgUkVDT1JEX1NPVU5EX0FDVElPTiwgdGVzdCB0aGF0IGl0IGhhbmRsZXMgaXQKQEAgLTYxNyw2ICs2NDYsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcucHJvdmlzaW9uaW5nX2J5b2Rfbm9fZ3BzX2xvY2F0aW9uX2ZlYXR1cmUsIFRvYXN0LkxFTkdUSF9TSE9SVCkKICAgICAgICAgICAgICAgICAgICAgLnNob3coKTsKICAgICAgICAgfQorCisgICAgICAgIGlmIChnZXRQYWNrYWdlTWFuYWdlcigpLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9BUFBfV0lER0VUUykpIHsKKyAgICAgICAgICAgIG1XaWRnZXRUZXN0ID0gVGVzdExpc3RJdGVtLm5ld1Rlc3QodGhpcywKKyAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcucHJvdmlzaW9uaW5nX2J5b2Rfd29ya19wcm9maWxlX3dpZGdldCwKKyAgICAgICAgICAgICAgICAgICAgV29ya1Byb2ZpbGVXaWRnZXRBY3Rpdml0eS5jbGFzcy5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlbnQoV29ya1Byb2ZpbGVXaWRnZXRBY3Rpdml0eS5BQ1RJT05fVEVTVF9XT1JLX1BST0ZJTEVfV0lER0VUKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tde1BhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfQVBQX1dJREdFVFN9KTsKKyAgICAgICAgICAgIGFkYXB0ZXIuYWRkKG1XaWRnZXRUZXN0KTsKKyAgICAgICAgfQorCiAgICAgfQogCiAgICAgLy8gUmV0dXJuIHdoZXRoZXIgdGhlIGludGVudCBjYW4gYmUgcmVzb2x2ZWQgaW4gdGhlIGN1cnJlbnQgcHJvZmlsZQpAQCAtNzQ1LDUgKzc4NCw0IEBACiAgICAgICAgICAgICBuZXcgQ29tcG9uZW50TmFtZShCeW9kRmxvd1Rlc3RBY3Rpdml0eS50aGlzLCBIYW5kbGVJbnRlbnRBY3Rpdml0eS5jbGFzcy5nZXROYW1lKCkpLAogICAgICAgICAgICAgZW5hYmxlU3RhdGUsIFBhY2thZ2VNYW5hZ2VyLkRPTlRfS0lMTF9BUFApOwogICAgIH0KLQogfQpkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL21hbmFnZWRwcm92aXNpb25pbmcvQnlvZEZsb3dUZXN0SGVscGVyLmphdmEgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbWFuYWdlZHByb3Zpc2lvbmluZy9CeW9kRmxvd1Rlc3RIZWxwZXIuamF2YQppbmRleCA1MDUzYTkwLi4yNGUwOTE5IDEwMDY0NAotLS0gYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbWFuYWdlZHByb3Zpc2lvbmluZy9CeW9kRmxvd1Rlc3RIZWxwZXIuamF2YQorKysgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbWFuYWdlZHByb3Zpc2lvbmluZy9CeW9kRmxvd1Rlc3RIZWxwZXIuamF2YQpAQCAtMiw2ICsyLDcgQEAKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwogCiBwdWJsaWMgY2xhc3MgQnlvZEZsb3dUZXN0SGVscGVyIHsKQEAgLTE3LDYgKzE4LDIzIEBACiAgICAgICAgIHNldENvbXBvbmVudHNFbmFibGVkU3RhdGUoUGFja2FnZU1hbmFnZXIuQ09NUE9ORU5UX0VOQUJMRURfU1RBVEVfRElTQUJMRUQpOwogICAgIH0KIAorICAgIC8qKiBSZXBvcnRzIHJlc3VsdCB0byBCeW9kRmxvd1Rlc3RBY3Rpdml0eSBpZiBpdCBpcyBpbXBvc3NpYmxlIHZpYSBub3JtYWwgc2V0UmVzdWx0LiAqLworICAgIHB1YmxpYyB2b2lkIHNlbmRSZXN1bHRUb1ByaW1hcnkoSW50ZW50IHJlc3VsdCkgeworICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChCeW9kRmxvd1Rlc3RBY3Rpdml0eS5BQ1RJT05fVEVTVF9SRVNVTFQpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoQnlvZEZsb3dUZXN0QWN0aXZpdHkuRVhUUkFfUkVTVUxULCByZXN1bHQpOworICAgICAgICBzdGFydEFjdGl2aXR5SW5QcmltYXJ5KGludGVudCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RhcnRBY3Rpdml0eUluUHJpbWFyeShJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIC8vIERpc2FibGUgYXBwIGNvbXBvbmVudHMgaW4gdGhlIGN1cnJlbnQgcHJvZmlsZSwgc28gb25seSB0aGUgY291bnRlcnBhcnQgaW4gdGhlIG90aGVyCisgICAgICAgIC8vIHByb2ZpbGUgY2FuIHJlc3BvbmQgKHZpYSBjcm9zcy1wcm9maWxlIGludGVudCBmaWx0ZXIpCisgICAgICAgIG1Db250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCkuc2V0Q29tcG9uZW50RW5hYmxlZFNldHRpbmcoCisgICAgICAgICAgICAgICAgbmV3IENvbXBvbmVudE5hbWUobUNvbnRleHQsIEJ5b2RGbG93VGVzdEFjdGl2aXR5LmNsYXNzKSwKKyAgICAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlci5DT01QT05FTlRfRU5BQkxFRF9TVEFURV9ESVNBQkxFRCwKKyAgICAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlci5ET05UX0tJTExfQVBQKTsKKyAgICAgICAgbUNvbnRleHQuc3RhcnRBY3Rpdml0eShpbnRlbnQpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIENsZWFuIHVwIHRoaW5ncy4gVGhpcyBoYXMgdG8gYmUgd29ya2luZyBldmVuIGl0IGlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4KICAgICAgKi8KQEAgLTQwLDkgKzU4LDExIEBACiAgICAgICAgICAgICAgICAgQXV0aGVudGljYXRpb25Cb3VuZEtleVRlc3RBY3Rpdml0eS5jbGFzcy5nZXROYW1lKCksCiAgICAgICAgICAgICAgICAgVnBuVGVzdEFjdGl2aXR5LmNsYXNzLmdldE5hbWUoKSwKICAgICAgICAgICAgICAgICBBbHdheXNPblZwblNldHRpbmdzVGVzdEFjdGl2aXR5LmNsYXNzLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICBSZWNlbnRzUmVkYWN0aW9uQWN0aXZpdHkuY2xhc3MuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgIEludGVybWVkaWF0ZVJlY2VudEFjdGl2aXR5LmNsYXNzLmdldE5hbWUoKSwKICAgICAgICAgICAgICAgICBDb21tYW5kUmVjZWl2ZXJBY3Rpdml0eS5jbGFzcy5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgU2V0U3VwcG9ydE1lc3NhZ2VBY3Rpdml0eS5jbGFzcy5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICBTZXRTdXBwb3J0TWVzc2FnZUFjdGl2aXR5LmNsYXNzLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICBLZXlDaGFpblRlc3RBY3Rpdml0eS5jbGFzcy5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgV29ya1Byb2ZpbGVXaWRnZXRBY3Rpdml0eS5jbGFzcy5nZXROYW1lKCkKICAgICAgICAgfTsKICAgICAgICAgZm9yIChTdHJpbmcgY29tcG9uZW50IDogY29tcG9uZW50cykgewogICAgICAgICAgICAgbVBhY2thZ2VNYW5hZ2VyLnNldENvbXBvbmVudEVuYWJsZWRTZXR0aW5nKG5ldyBDb21wb25lbnROYW1lKG1Db250ZXh0LCBjb21wb25lbnQpLApkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL21hbmFnZWRwcm92aXNpb25pbmcvQnlvZEhlbHBlckFjdGl2aXR5LmphdmEgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbWFuYWdlZHByb3Zpc2lvbmluZy9CeW9kSGVscGVyQWN0aXZpdHkuamF2YQppbmRleCBmNjFjODg0Li45YmI5Y2Y4IDEwMDY0NAotLS0gYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbWFuYWdlZHByb3Zpc2lvbmluZy9CeW9kSGVscGVyQWN0aXZpdHkuamF2YQorKysgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbWFuYWdlZHByb3Zpc2lvbmluZy9CeW9kSGVscGVyQWN0aXZpdHkuamF2YQpAQCAtMzMsOCArMzMsOCBAQAogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLlVzZXJNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuTWVkaWFTdG9yZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQuY29udGVudC5GaWxlUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LnV0aWwuUGFpcjsKK2ltcG9ydCBhbmRyb2lkeC5jb3JlLmNvbnRlbnQuRmlsZVByb3ZpZGVyOworaW1wb3J0IGFuZHJvaWR4LmNvcmUudXRpbC5QYWlyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIuUjsKQEAgLTIxOSw3ICsyMTksNyBAQAogICAgICAgICAgICAgLy8gSnVtcCBiYWNrIHRvIENUUyB2ZXJpZmllciB3aXRoIHJlc3VsdC4KICAgICAgICAgICAgIEludGVudCByZXNwb25zZSA9IG5ldyBJbnRlbnQoQUNUSU9OX1BST0ZJTEVfT1dORVJfU1RBVFVTKTsKICAgICAgICAgICAgIHJlc3BvbnNlLnB1dEV4dHJhKEVYVFJBX1BST1ZJU0lPTkVELCBpc1Byb2ZpbGVPd25lcigpKTsKLSAgICAgICAgICAgIHN0YXJ0QWN0aXZpdHlJblByaW1hcnkocmVzcG9uc2UpOworICAgICAgICAgICAgbmV3IEJ5b2RGbG93VGVzdEhlbHBlcih0aGlzKS5zdGFydEFjdGl2aXR5SW5QcmltYXJ5KHJlc3BvbnNlKTsKICAgICAgICAgICAgIC8vIFF1ZXJpZWQgYnkgQ3RzVmVyaWZpZXIgaW4gdGhlIHByaW1hcnkgc2lkZSB1c2luZyBzdGFydEFjdGl2aXR5Rm9yUmVzdWx0LgogICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5lcXVhbHMoQUNUSU9OX1FVRVJZX1BST0ZJTEVfT1dORVIpKSB7CiAgICAgICAgICAgICBJbnRlbnQgcmVzcG9uc2UgPSBuZXcgSW50ZW50KCk7CkBAIC01MTQsMTYgKzUxNCw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgc3RhcnRBY3Rpdml0eUluUHJpbWFyeShJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgIC8vIERpc2FibGUgYXBwIGNvbXBvbmVudHMgaW4gdGhlIGN1cnJlbnQgcHJvZmlsZSwgc28gb25seSB0aGUgY291bnRlcnBhcnQgaW4gdGhlIG90aGVyCi0gICAgICAgIC8vIHByb2ZpbGUgY2FuIHJlc3BvbmQgKHZpYSBjcm9zcy1wcm9maWxlIGludGVudCBmaWx0ZXIpCi0gICAgICAgIGdldFBhY2thZ2VNYW5hZ2VyKCkuc2V0Q29tcG9uZW50RW5hYmxlZFNldHRpbmcobmV3IENvbXBvbmVudE5hbWUoCi0gICAgICAgICAgICAgICAgdGhpcywgQnlvZEZsb3dUZXN0QWN0aXZpdHkuY2xhc3MpLAotICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VyLkNPTVBPTkVOVF9FTkFCTEVEX1NUQVRFX0RJU0FCTEVELAotICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VyLkRPTlRfS0lMTF9BUFApOwotICAgICAgICBzdGFydEFjdGl2aXR5KGludGVudCk7Ci0gICAgfQotCiAgICAgcHJpdmF0ZSB2b2lkIGdyYW50Q2FtZXJhUGVybWlzc2lvblRvU2VsZigpIHsKICAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuc2V0UGVybWlzc2lvbkdyYW50U3RhdGUobUFkbWluUmVjZWl2ZXJDb21wb25lbnQsIGdldFBhY2thZ2VOYW1lKCksCiAgICAgICAgICAgICAgICAgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkNBTUVSQSwKZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9tYW5hZ2VkcHJvdmlzaW9uaW5nL0NvbW1hbmRSZWNlaXZlckFjdGl2aXR5LmphdmEgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbWFuYWdlZHByb3Zpc2lvbmluZy9Db21tYW5kUmVjZWl2ZXJBY3Rpdml0eS5qYXZhCmluZGV4IGM1MWVhMGEuLmU4MDdkMjkgMTAwNjQ0Ci0tLSBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9tYW5hZ2VkcHJvdmlzaW9uaW5nL0NvbW1hbmRSZWNlaXZlckFjdGl2aXR5LmphdmEKKysrIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL21hbmFnZWRwcm92aXNpb25pbmcvQ29tbWFuZFJlY2VpdmVyQWN0aXZpdHkuamF2YQpAQCAtMTYsNiArMTYsMTEgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIubWFuYWdlZHByb3Zpc2lvbmluZzsKIAoraW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5hZG1pbi5EZXZpY2VQb2xpY3lNYW5hZ2VyLkxPQ0tfVEFTS19GRUFUVVJFX0hPTUU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLmFkbWluLkRldmljZVBvbGljeU1hbmFnZXIuTE9DS19UQVNLX0ZFQVRVUkVfT1ZFUlZJRVc7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLmFkbWluLkRldmljZVBvbGljeU1hbmFnZXIuTUFLRV9VU0VSX0VQSEVNRVJBTDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuYWRtaW4uRGV2aWNlUG9saWN5TWFuYWdlci5TS0lQX1NFVFVQX1dJWkFSRDsKKwogaW1wb3J0IGFuZHJvaWQuTWFuaWZlc3Q7CiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CiBpbXBvcnQgYW5kcm9pZC5hcHAuS2V5Z3VhcmRNYW5hZ2VyOwpAQCAtMjcsOSArMzIsMTEgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlSW5zdGFsbGVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUmVzb2x2ZUluZm87CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OwogaW1wb3J0IGFuZHJvaWQubmV0LlByb3h5SW5mbzsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlBlcnNpc3RhYmxlQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuVXNlckhhbmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlVzZXJNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdDsKQEAgLTQxLDEzICs0OCwxMyBAQAogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRvYXN0OwogCiBpbXBvcnQgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLlI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLm1hbmFnZWRwcm92aXNpb25pbmcuVXRpbHM7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKIGltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CkBAIC03MSw2ICs3OCw3IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9TRVRfS0VZR1VBUkRfRElTQUJMRUQgPSAic2V0LWtleWd1YXJkLWRpc2FibGVkIjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX1NFVF9MT0NLX1NDUkVFTl9JTkZPID0gInNldC1sb2NrLXNjcmVlbi1pbmZvIjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX1NFVF9TVEFUVVNCQVJfRElTQUJMRUQgPSAic2V0LXN0YXR1c2Jhci1kaXNhYmxlZCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9TRVRfTE9DS19UQVNLX0ZFQVRVUkVTID0gInNldC1sb2NrLXRhc2stZmVhdHVyZXMiOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfQUxMT1dfT05MWV9TWVNURU1fSU5QVVRfTUVUSE9EUyA9CiAgICAgICAgICAgICAiYWxsb3ctb25seS1zeXN0ZW0taW5wdXQtbWV0aG9kcyI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9BTExPV19PTkxZX1NZU1RFTV9BQ0NFU1NJQklMSVRZX1NFUlZJQ0VTID0KQEAgLTEwNSw2ICsxMTMsMTMgQEAKICAgICAgICAgICAgICJjbGVhci1tYXhpbXVtLXBhc3N3b3JkLWF0dGVtcHRzIjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX1NFVF9ERUZBVUxUX0lNRSA9ICJzZXQtZGVmYXVsdC1pbWUiOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfQ0xFQVJfREVGQVVMVF9JTUUgPSAiY2xlYXItZGVmYXVsdC1pbWUiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfQ1JFQVRFX01BTkFHRURfVVNFUiA9ICJjcmVhdGUtbWFuYWdlZC11c2VyIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX0NSRUFURV9NQU5BR0VEX1VTRVJfV0lUSE9VVF9TRVRVUCA9CisgICAgICAgICAgICAiY3JlYXRlLW1hbmFnZWQtdXNlci13aXRob3V0LXNldHVwIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX1dJVEhfVVNFUl9TV0lUQ0hFUl9NRVNTQUdFID0gIndpdGgtdXNlci1zd2l0Y2hlci1tZXNzYWdlIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX1dJVEhPVVRfVVNFUl9TV0lUQ0hFUl9NRVNTQUdFID0KKyAgICAgICAgICAgICJ3aXRob3V0LXVzZXItc3dpdGNoZXItbWVzc2FnZSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9FTkFCTEVfTE9HT1VUID0gImVuYWJsZS1sb2dvdXQiOwogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfVVNFUl9SRVNUUklDVElPTiA9CiAgICAgICAgICAgICAiY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLm1hbmFnZWRwcm92aXNpb25pbmcuZXh0cmEuVVNFUl9SRVNUUklDVElPTiI7CkBAIC0xNzQsOSArMTg5LDggQEAKICAgICAgICAgICAgICAgICAgICAgQ29udGV4dC5ERVZJQ0VfUE9MSUNZX1NFUlZJQ0UpOwogICAgICAgICAgICAgbVVtID0gKFVzZXJNYW5hZ2VyKSBnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuVVNFUl9TRVJWSUNFKTsKICAgICAgICAgICAgIG1BZG1pbiA9IERldmljZUFkbWluVGVzdFJlY2VpdmVyLmdldFJlY2VpdmVyQ29tcG9uZW50TmFtZSgpOwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiQ29tbWFuZDogIiArIGludGVudCk7Ci0KICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjb21tYW5kID0gZ2V0SW50ZW50KCkuZ2V0U3RyaW5nRXh0cmEoRVhUUkFfQ09NTUFORCk7CisgICAgICAgICAgICBMb2cuaShUQUcsICJDb21tYW5kOiAiICsgY29tbWFuZCk7CiAgICAgICAgICAgICBzd2l0Y2ggKGNvbW1hbmQpIHsKICAgICAgICAgICAgICAgICBjYXNlIENPTU1BTkRfU0VUX1VTRVJfUkVTVFJJQ1RJT046IHsKICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlc3RyaWN0aW9uS2V5ID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKEVYVFJBX1VTRVJfUkVTVFJJQ1RJT04pOwpAQCAtMjIzLDYgKzIzNywxOCBAQAogICAgICAgICAgICAgICAgICAgICBib29sZWFuIGVuZm9yY2VkID0gaW50ZW50LmdldEJvb2xlYW5FeHRyYShFWFRSQV9FTkZPUkNFRCwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICBtRHBtLnNldFN0YXR1c0JhckRpc2FibGVkKG1BZG1pbiwgZW5mb3JjZWQpOwogICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDT01NQU5EX1NFVF9MT0NLX1RBU0tfRkVBVFVSRVM6IHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzID0gaW50ZW50LmdldEludEV4dHJhKEVYVFJBX1ZBTFVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIuTE9DS19UQVNLX0ZFQVRVUkVfTk9ORSk7CisgICAgICAgICAgICAgICAgICAgIG1EcG0uc2V0TG9ja1Rhc2tGZWF0dXJlcyhtQWRtaW4sIGZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgZmVhdHVyZSBIT01FIGlzIHVzZWQsIHdlIG5lZWQgdG8gd2hpdGVsaXN0IHRoZSBjdXJyZW50IGxhdW5jaGVyCisgICAgICAgICAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBMT0NLX1RBU0tfRkVBVFVSRV9IT01FKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtRHBtLnNldExvY2tUYXNrUGFja2FnZXMobUFkbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10ge2dldFBhY2thZ2VOYW1lKCksIGdldEN1cnJlbnRMYXVuY2hlclBhY2thZ2UoKX0pOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbURwbS5zZXRMb2NrVGFza1BhY2thZ2VzKG1BZG1pbiwgbmV3IFN0cmluZ1tdIHtnZXRQYWNrYWdlTmFtZSgpfSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgQ09NTUFORF9BTExPV19PTkxZX1NZU1RFTV9JTlBVVF9NRVRIT0RTOiB7CiAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZW5mb3JjZWQgPSBpbnRlbnQuZ2V0Qm9vbGVhbkV4dHJhKEVYVFJBX0VORk9SQ0VELCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgIG1EcG0uc2V0UGVybWl0dGVkSW5wdXRNZXRob2RzKG1BZG1pbiwKQEAgLTI2NCwxMSArMjkwLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJBbGxQb2xpY2llc0FuZFJlc3RyaWN0aW9ucygpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYobW9kZSA9PSBQb2xpY3lUcmFuc3BhcmVuY3lUZXN0TGlzdEFjdGl2aXR5Lk1PREVfUFJPRklMRV9PV05FUikgeworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gUG9saWN5VHJhbnNwYXJlbmN5VGVzdExpc3RBY3Rpdml0eS5NT0RFX01BTkFHRURfUFJPRklMRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1vZGUgPT0gUG9saWN5VHJhbnNwYXJlbmN5VGVzdExpc3RBY3Rpdml0eS5NT0RFX01BTkFHRURfVVNFUikgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtRHBtLmlzUHJvZmlsZU93bmVyQXBwKGdldFBhY2thZ2VOYW1lKCkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJQcm9maWxlT3duZXJSZWxhdGVkUG9saWNpZXNBbmRSZXN0cmljdGlvbnMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyUHJvZmlsZU93bmVyUmVsYXRlZFBvbGljaWVzQW5kUmVzdHJpY3Rpb25zKG1vZGUpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIC8vIE5vIHBvbGljaWVzIG5lZWQgdG8gYmUgY2xlYXJlZCBmb3IgQ09NUCBhdCB0aGUgbW9tZW50LgogICAgICAgICAgICAgICAgIH0gYnJlYWs7CkBAIC00NjIsNyArNDg5LDQ0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgbURwbS5zZXRTZWN1cmVTZXR0aW5nKG1BZG1pbiwgU2V0dGluZ3MuU2VjdXJlLkRFRkFVTFRfSU5QVVRfTUVUSE9ELCBudWxsKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENPTU1BTkRfQ1JFQVRFX01BTkFHRURfVVNFUjp7CisgICAgICAgICAgICAgICAgICAgIGlmICghbURwbS5pc0RldmljZU93bmVyQXBwKGdldFBhY2thZ2VOYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgUGVyc2lzdGFibGVCdW5kbGUgZXh0cmFzID0gbmV3IFBlcnNpc3RhYmxlQnVuZGxlKCk7CisgICAgICAgICAgICAgICAgICAgIGV4dHJhcy5wdXRCb29sZWFuKERldmljZUFkbWluVGVzdFJlY2VpdmVyLkVYVFJBX01BTkFHRURfVVNFUl9URVNULCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgVXNlckhhbmRsZSB1c2VySGFuZGxlID0gbURwbS5jcmVhdGVBbmRNYW5hZ2VVc2VyKG1BZG1pbiwgIm1hbmFnZWQgdXNlciIsIG1BZG1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0tJUF9TRVRVUF9XSVpBUkQgfCBNQUtFX1VTRVJfRVBIRU1FUkFMKTsKKyAgICAgICAgICAgICAgICAgICAgbURwbS5zZXRBZmZpbGlhdGlvbklkcyhtQWRtaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc2luZ2xldG9uKERldmljZUFkbWluVGVzdFJlY2VpdmVyLkFGRklMSUFUSU9OX0lEKSk7CisgICAgICAgICAgICAgICAgICAgIG1EcG0uc3RhcnRVc2VySW5CYWNrZ3JvdW5kKG1BZG1pbiwgdXNlckhhbmRsZSk7CisgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENPTU1BTkRfQ1JFQVRFX01BTkFHRURfVVNFUl9XSVRIT1VUX1NFVFVQOnsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtRHBtLmlzRGV2aWNlT3duZXJBcHAoZ2V0UGFja2FnZU5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBQZXJzaXN0YWJsZUJ1bmRsZSBleHRyYXMgPSBuZXcgUGVyc2lzdGFibGVCdW5kbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgZXh0cmFzLnB1dEJvb2xlYW4oRGV2aWNlQWRtaW5UZXN0UmVjZWl2ZXIuRVhUUkFfTUFOQUdFRF9VU0VSX1RFU1QsIHRydWUpOworICAgICAgICAgICAgICAgICAgICBtRHBtLmNyZWF0ZUFuZE1hbmFnZVVzZXIobUFkbWluLCAibWFuYWdlZCB1c2VyIiwgbUFkbWluLCBleHRyYXMsIC8qIGZsYWdzICovIDApOworICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDT01NQU5EX1dJVEhfVVNFUl9TV0lUQ0hFUl9NRVNTQUdFOiB7CisgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUFuZFN3aXRjaFVzZXJXaXRoTWVzc2FnZSgiU3RhcnQgdXNlciBzZXNzaW9uIiwgIkVuZCB1c2VyIHNlc3Npb24iKTsKKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ09NTUFORF9XSVRIT1VUX1VTRVJfU1dJVENIRVJfTUVTU0FHRTogeworICAgICAgICAgICAgICAgICAgICBjcmVhdGVBbmRTd2l0Y2hVc2VyV2l0aE1lc3NhZ2UobnVsbCwgbnVsbCk7CisgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENPTU1BTkRfRU5BQkxFX0xPR09VVDogeworICAgICAgICAgICAgICAgICAgICBpZiAoIW1EcG0uaXNEZXZpY2VPd25lckFwcChnZXRQYWNrYWdlTmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1EcG0uYWRkVXNlclJlc3RyaWN0aW9uKG1BZG1pbiwgVXNlck1hbmFnZXIuRElTQUxMT1dfVVNFUl9TV0lUQ0gpOworICAgICAgICAgICAgICAgICAgICBtRHBtLnNldExvZ291dEVuYWJsZWQobUFkbWluLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgVXNlckhhbmRsZSB1c2VySGFuZGxlID0gbURwbS5jcmVhdGVBbmRNYW5hZ2VVc2VyKG1BZG1pbiwgIm1hbmFnZWQgdXNlciIsIG1BZG1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBTS0lQX1NFVFVQX1dJWkFSRCB8IE1BS0VfVVNFUl9FUEhFTUVSQUwpOworICAgICAgICAgICAgICAgICAgICBtRHBtLnN3aXRjaFVzZXIobUFkbWluLCB1c2VySGFuZGxlKTsKKyAgICAgICAgICAgICAgICB9IGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIGV4ZWN1dGUgY29tbWFuZDogIiArIGludGVudCwgZSk7CkBAIC01MTAsNiArNTc0LDcgQEAKICAgICAgICAgbURwbS5jbGVhclVzZXJSZXN0cmljdGlvbihtQWRtaW4sIFVzZXJNYW5hZ2VyLkRJU0FMTE9XX0NPTkZJR19CTFVFVE9PVEgpOwogICAgICAgICBtRHBtLmNsZWFyVXNlclJlc3RyaWN0aW9uKG1BZG1pbiwgVXNlck1hbmFnZXIuRElTQUxMT1dfQ09ORklHX1ZQTik7CiAgICAgICAgIG1EcG0uY2xlYXJVc2VyUmVzdHJpY3Rpb24obUFkbWluLCBVc2VyTWFuYWdlci5ESVNBTExPV19EQVRBX1JPQU1JTkcpOworICAgICAgICBtRHBtLmNsZWFyVXNlclJlc3RyaWN0aW9uKG1BZG1pbiwgVXNlck1hbmFnZXIuRElTQUxMT1dfVVNFUl9TV0lUQ0gpOwogCiAgICAgICAgIG1EcG0uc2V0RGV2aWNlT3duZXJMb2NrU2NyZWVuSW5mbyhtQWRtaW4sIG51bGwpOwogICAgICAgICBtRHBtLnNldEtleWd1YXJkRGlzYWJsZWQobUFkbWluLCBmYWxzZSk7CkBAIC01MzEsNiArNTk2LDEwIEBACiAgICAgICAgIG1EcG0udW5pbnN0YWxsQ2FDZXJ0KG1BZG1pbiwgVEVTVF9DQS5nZXRCeXRlcygpKTsKICAgICAgICAgbURwbS5zZXRNYXhpbXVtRmFpbGVkUGFzc3dvcmRzRm9yV2lwZShtQWRtaW4sIDApOwogICAgICAgICBtRHBtLnNldFNlY3VyZVNldHRpbmcobUFkbWluLCBTZXR0aW5ncy5TZWN1cmUuREVGQVVMVF9JTlBVVF9NRVRIT0QsIG51bGwpOworICAgICAgICBtRHBtLnNldEFmZmlsaWF0aW9uSWRzKG1BZG1pbiwgQ29sbGVjdGlvbnMuZW1wdHlTZXQoKSk7CisgICAgICAgIG1EcG0uc2V0U3RhcnRVc2VyU2Vzc2lvbk1lc3NhZ2UobUFkbWluLCBudWxsKTsKKyAgICAgICAgbURwbS5zZXRFbmRVc2VyU2Vzc2lvbk1lc3NhZ2UobUFkbWluLCBudWxsKTsKKyAgICAgICAgbURwbS5zZXRMb2dvdXRFbmFibGVkKG1BZG1pbiwgZmFsc2UpOwogCiAgICAgICAgIHVuaW5zdGFsbEhlbHBlclBhY2thZ2UoKTsKICAgICAgICAgcmVtb3ZlTWFuYWdlZFByb2ZpbGUoKTsKQEAgLTU0MCw5ICs2MDksOCBAQAogICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VyLkRPTlRfS0lMTF9BUFApOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBjbGVhclByb2ZpbGVPd25lclJlbGF0ZWRQb2xpY2llc0FuZFJlc3RyaWN0aW9ucygpIHsKLSAgICAgICAgY2xlYXJQb2xpY3lUcmFuc3BhcmVuY3lVc2VyUmVzdHJpY3Rpb24oCi0gICAgICAgICAgICAgICAgUG9saWN5VHJhbnNwYXJlbmN5VGVzdExpc3RBY3Rpdml0eS5NT0RFX1BST0ZJTEVfT1dORVIpOworICAgIHByaXZhdGUgdm9pZCBjbGVhclByb2ZpbGVPd25lclJlbGF0ZWRQb2xpY2llc0FuZFJlc3RyaWN0aW9ucyhpbnQgbW9kZSkgeworICAgICAgICBjbGVhclBvbGljeVRyYW5zcGFyZW5jeVVzZXJSZXN0cmljdGlvbihtb2RlKTsKICAgICAgICAgY2xlYXJQcm9maWxlT3duZXJSZWxhdGVkUG9saWNpZXMoKTsKICAgICB9CiAKQEAgLTU2Nyw2ICs2MzUsMTMgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHB1YmxpYyBzdGF0aWMgSW50ZW50IGNyZWF0ZVNldFVzZXJSZXN0cmljdGlvbkludGVudChTdHJpbmcgcmVzdHJpY3Rpb24sIGJvb2xlYW4gZW5mb3JjZWQpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJbnRlbnQoQUNUSU9OX0VYRUNVVEVfQ09NTUFORCkKKyAgICAgICAgICAgICAgICAucHV0RXh0cmEoRVhUUkFfQ09NTUFORCxDT01NQU5EX1NFVF9VU0VSX1JFU1RSSUNUSU9OKQorICAgICAgICAgICAgICAgIC5wdXRFeHRyYShFWFRSQV9VU0VSX1JFU1RSSUNUSU9OLCByZXN0cmljdGlvbikKKyAgICAgICAgICAgICAgICAucHV0RXh0cmEoRVhUUkFfRU5GT1JDRUQsIGVuZm9yY2VkKTsKKyAgICB9CisKICAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBnZXRFbmFibGVkTm9uU3lzdGVtSW1lcygpIHsKICAgICAgICAgSW5wdXRNZXRob2RNYW5hZ2VyIGlucHV0TWV0aG9kTWFuYWdlciA9IGdldFN5c3RlbVNlcnZpY2UoSW5wdXRNZXRob2RNYW5hZ2VyLmNsYXNzKTsKICAgICAgICAgZmluYWwgTGlzdDxJbnB1dE1ldGhvZEluZm8+IGlucHV0TWV0aG9kcyA9IGlucHV0TWV0aG9kTWFuYWdlci5nZXRFbmFibGVkSW5wdXRNZXRob2RMaXN0KCk7CkBAIC01ODEsNCArNjU2LDMzIEBACiAgICAgcHJpdmF0ZSBib29sZWFuIGlzU3lzdGVtSW5wdXRNZXRob2RJbmZvKElucHV0TWV0aG9kSW5mbyBpbnB1dE1ldGhvZEluZm8pIHsKICAgICAgICAgcmV0dXJuIGlucHV0TWV0aG9kSW5mby5nZXRTZXJ2aWNlSW5mbygpLmFwcGxpY2F0aW9uSW5mby5pc1N5c3RlbUFwcCgpOwogICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjcmVhdGVBbmRTd2l0Y2hVc2VyV2l0aE1lc3NhZ2UoU3RyaW5nIHN0YXJ0VXNlclNlc3Npb25NZXNzYWdlLAorICAgICAgICAgICAgU3RyaW5nIGVuZFVzZXJTZXNzaW9uTWVzc2FnZSkgeworICAgICAgICBpZiAoIW1EcG0uaXNEZXZpY2VPd25lckFwcChnZXRQYWNrYWdlTmFtZSgpKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1EcG0uc2V0U3RhcnRVc2VyU2Vzc2lvbk1lc3NhZ2UobUFkbWluLCBzdGFydFVzZXJTZXNzaW9uTWVzc2FnZSk7CisgICAgICAgIG1EcG0uc2V0RW5kVXNlclNlc3Npb25NZXNzYWdlKG1BZG1pbiwgZW5kVXNlclNlc3Npb25NZXNzYWdlKTsKKyAgICAgICAgbURwbS5zZXRBZmZpbGlhdGlvbklkcyhtQWRtaW4sCisgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc2luZ2xldG9uKERldmljZUFkbWluVGVzdFJlY2VpdmVyLkFGRklMSUFUSU9OX0lEKSk7CisKKyAgICAgICAgUGVyc2lzdGFibGVCdW5kbGUgZXh0cmFzID0gbmV3IFBlcnNpc3RhYmxlQnVuZGxlKCk7CisgICAgICAgIGV4dHJhcy5wdXRCb29sZWFuKERldmljZUFkbWluVGVzdFJlY2VpdmVyLkVYVFJBX0xPR09VVF9PTl9TVEFSVCwgdHJ1ZSk7CisgICAgICAgIFVzZXJIYW5kbGUgdXNlckhhbmRsZSA9IG1EcG0uY3JlYXRlQW5kTWFuYWdlVXNlcihtQWRtaW4sICJtYW5hZ2VkIHVzZXIiLCBtQWRtaW4sCisgICAgICAgICAgICAgICAgZXh0cmFzLAorICAgICAgICAgICAgICAgIFNLSVBfU0VUVVBfV0laQVJEIHwgTUFLRV9VU0VSX0VQSEVNRVJBTCk7CisgICAgICAgIG1EcG0uc3dpdGNoVXNlcihtQWRtaW4sIHVzZXJIYW5kbGUpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldEN1cnJlbnRMYXVuY2hlclBhY2thZ2UoKSB7CisgICAgICAgIFJlc29sdmVJbmZvIHJlc29sdmVJbmZvID0gZ2V0UGFja2FnZU1hbmFnZXIoKQorICAgICAgICAgICAgLnJlc29sdmVBY3Rpdml0eShuZXcgSW50ZW50KEludGVudC5BQ1RJT05fTUFJTikKKyAgICAgICAgICAgICAgICAuYWRkQ2F0ZWdvcnkoSW50ZW50LkNBVEVHT1JZX0hPTUUpLCBQYWNrYWdlTWFuYWdlci5NQVRDSF9ERUZBVUxUX09OTFkpOworICAgICAgICBpZiAocmVzb2x2ZUluZm8gPT0gbnVsbCB8fCByZXNvbHZlSW5mby5hY3Rpdml0eUluZm8gPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzb2x2ZUluZm8uYWN0aXZpdHlJbmZvLnBhY2thZ2VOYW1lOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9tYW5hZ2VkcHJvdmlzaW9uaW5nL0RldmljZUFkbWluVGVzdFJlY2VpdmVyLmphdmEgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbWFuYWdlZHByb3Zpc2lvbmluZy9EZXZpY2VBZG1pblRlc3RSZWNlaXZlci5qYXZhCmluZGV4IGY1NGU1NjcuLmFiYWQ1YjUgMTAwNjQ0Ci0tLSBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9tYW5hZ2VkcHJvdmlzaW9uaW5nL0RldmljZUFkbWluVGVzdFJlY2VpdmVyLmphdmEKKysrIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL21hbmFnZWRwcm92aXNpb25pbmcvRGV2aWNlQWRtaW5UZXN0UmVjZWl2ZXIuamF2YQpAQCAtMTgsMTggKzE4LDI4IEBACiAKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuYWRtaW4uRGV2aWNlUG9saWN5TWFuYWdlci5FWFRSQV9QUk9WSVNJT05JTkdfQURNSU5fRVhUUkFTX0JVTkRMRTsKIAoraW1wb3J0IGFuZHJvaWQuYXBwLlNlcnZpY2U7CiBpbXBvcnQgYW5kcm9pZC5hcHAuYWRtaW4uRGV2aWNlQWRtaW5SZWNlaXZlcjsKIGltcG9ydCBhbmRyb2lkLmFwcC5hZG1pbi5EZXZpY2VQb2xpY3lNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2VydmljZUNvbm5lY3Rpb247CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuUGVyc2lzdGFibGVCdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuVXNlckhhbmRsZTsKK2ltcG9ydCBhbmRyb2lkeC5sb2NhbGJyb2FkY2FzdG1hbmFnZXIuY29udGVudC5Mb2NhbEJyb2FkY2FzdE1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5SOwogaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5sb2NhdGlvbi5Mb2NhdGlvbkxpc3RlbmVyQWN0aXZpdHk7CiAKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworCiAvKioKICAqIFByb2ZpbGUgb3duZXIgcmVjZWl2ZXIgZm9yIEJZT0QgZmxvdyB0ZXN0LgogICogU2V0dXAgY3Jvc3MtcHJvZmlsZSBpbnRlbnQgZmlsdGVyIGFmdGVyIHN1Y2Nlc3NmdWwgcHJvdmlzaW9uaW5nLgpAQCAtNDMsNiArNTMsMTEgQEAKICAgICAgICAgICAgIERFVklDRV9PV05FUl9QS0cgKyAiLm1hbmFnZWRwcm92aXNpb25pbmcuRGV2aWNlQWRtaW5UZXN0UmVjZWl2ZXIiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbXBvbmVudE5hbWUgUkVDRUlWRVJfQ09NUE9ORU5UX05BTUUgPSBuZXcgQ29tcG9uZW50TmFtZSgKICAgICAgICAgICAgIERFVklDRV9PV05FUl9QS0csIEFETUlOX1JFQ0VJVkVSX1RFU1RfQ0xBU1MpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX01BTkFHRURfVVNFUl9URVNUID0KKyAgICAgICAgICAgICJjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIubWFuYWdlZHByb3Zpc2lvbmluZy5leHRyYS5NQU5BR0VEX1VTRVJfVEVTVCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfTE9HT1VUX09OX1NUQVJUID0KKyAgICAgICAgICAgICJjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIubWFuYWdlZHByb3Zpc2lvbmluZy5leHRyYS5MT0dPVVRfT05fU1RBUlQiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFGRklMSUFUSU9OX0lEID0gImFmZmlsaWF0aW9uSWQiOwogCiAgICAgcHVibGljIHN0YXRpYyBDb21wb25lbnROYW1lIGdldFJlY2VpdmVyQ29tcG9uZW50TmFtZSgpIHsKICAgICAgICAgcmV0dXJuIFJFQ0VJVkVSX0NPTVBPTkVOVF9OQU1FOwpAQCAtNzYsNiArOTEsNDggQEAKICAgICAgICAgICAgICAgICBSLnN0cmluZy5idWdyZXBvcnRfZmFpbGVkX2NvbXBsZXRpbmcpLCBVdGlscy5CVUdSRVBPUlRfTk9USUZJQ0FUSU9OX0lEKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkxvY2tUYXNrTW9kZUVudGVyaW5nKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCwgU3RyaW5nIHBrZykgeworICAgICAgICBMb2cuaShUQUcsICJFbnRlcmluZyBMb2NrVGFzayBtb2RlOiAiICsgcGtnKTsKKyAgICAgICAgTG9jYWxCcm9hZGNhc3RNYW5hZ2VyLmdldEluc3RhbmNlKGNvbnRleHQpCisgICAgICAgICAgICAgICAgLnNlbmRCcm9hZGNhc3QobmV3IEludGVudChMb2NrVGFza1VpVGVzdEFjdGl2aXR5LkFDVElPTl9MT0NLX1RBU0tfU1RBUlRFRCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uTG9ja1Rhc2tNb2RlRXhpdGluZyhDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgTG9nLmkoVEFHLCAiRXhpdGluZyBMb2NrVGFzayBtb2RlIik7CisgICAgICAgIExvY2FsQnJvYWRjYXN0TWFuYWdlci5nZXRJbnN0YW5jZShjb250ZXh0KQorICAgICAgICAgICAgICAgIC5zZW5kQnJvYWRjYXN0KG5ldyBJbnRlbnQoTG9ja1Rhc2tVaVRlc3RBY3Rpdml0eS5BQ1RJT05fTE9DS19UQVNLX1NUT1BQRUQpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkVuYWJsZWQoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIExvZy5pKFRBRywgIkRldmljZSBhZG1pbiBlbmFibGVkIik7CisgICAgICAgIGlmIChpbnRlbnQuZ2V0Qm9vbGVhbkV4dHJhKEVYVFJBX01BTkFHRURfVVNFUl9URVNULCBmYWxzZSkpIHsKKyAgICAgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIgZHBtID0gY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKERldmljZVBvbGljeU1hbmFnZXIuY2xhc3MpOworICAgICAgICAgICAgQ29tcG9uZW50TmFtZSBhZG1pbiA9IGdldFJlY2VpdmVyQ29tcG9uZW50TmFtZSgpOworICAgICAgICAgICAgZHBtLnNldEFmZmlsaWF0aW9uSWRzKGFkbWluLAorICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zaW5nbGV0b24oRGV2aWNlQWRtaW5UZXN0UmVjZWl2ZXIuQUZGSUxJQVRJT05fSUQpKTsKKyAgICAgICAgICAgIGNvbnRleHQuc3RhcnRBY3Rpdml0eSgKKyAgICAgICAgICAgICAgICAgICAgbmV3IEludGVudChjb250ZXh0LCBNYW5hZ2VkVXNlclBvc2l0aXZlVGVzdEFjdGl2aXR5LmNsYXNzKS5zZXRGbGFncygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSykpOworCisgICAgICAgICAgICBiaW5kUHJpbWFyeVVzZXJTZXJ2aWNlKGNvbnRleHQsIGlDcm9zc1VzZXJTZXJ2aWNlIC0+IHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpQ3Jvc3NVc2VyU2VydmljZS5zd2l0Y2hVc2VyKFByb2Nlc3MubXlVc2VySGFuZGxlKCkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvciB3aGVuIGNhbGxpbmcgcHJpbWFyeSB1c2VyIiwgcmUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9IGVsc2UgaWYgKGludGVudC5nZXRCb29sZWFuRXh0cmEoRVhUUkFfTE9HT1VUX09OX1NUQVJULCBmYWxzZSkpIHsKKyAgICAgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIgZHBtID0gY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKERldmljZVBvbGljeU1hbmFnZXIuY2xhc3MpOworICAgICAgICAgICAgQ29tcG9uZW50TmFtZSBhZG1pbiA9IGdldFJlY2VpdmVyQ29tcG9uZW50TmFtZSgpOworICAgICAgICAgICAgZHBtLnNldEFmZmlsaWF0aW9uSWRzKGFkbWluLAorICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zaW5nbGV0b24oRGV2aWNlQWRtaW5UZXN0UmVjZWl2ZXIuQUZGSUxJQVRJT05fSUQpKTsKKyAgICAgICAgICAgIGRwbS5sb2dvdXRVc2VyKGFkbWluKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCBzZXR1cFByb2ZpbGUoQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIgZHBtID0gKERldmljZVBvbGljeU1hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkRFVklDRV9QT0xJQ1lfU0VSVklDRSk7CiAgICAgICAgIGRwbS5zZXRQcm9maWxlRW5hYmxlZChuZXcgQ29tcG9uZW50TmFtZShjb250ZXh0LmdldEFwcGxpY2F0aW9uQ29udGV4dCgpLCBnZXRDbGFzcygpKSk7CkBAIC0xMTcsNyArMTc0LDkgQEAKICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihCeW9kSGVscGVyQWN0aXZpdHkuQUNUSU9OX1NFVF9PUkdBTklaQVRJT05fSU5GTyk7CiAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oQnlvZEhlbHBlckFjdGl2aXR5LkFDVElPTl9URVNUX1BBUkVOVF9QUk9GSUxFX1BBU1NXT1JEKTsKICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihTZXRTdXBwb3J0TWVzc2FnZUFjdGl2aXR5LkFDVElPTl9TRVRfU1VQUE9SVF9NU0cpOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEtleUNoYWluVGVzdEFjdGl2aXR5LkFDVElPTl9LRVlDSEFJTik7CiAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oQ29tbWFuZFJlY2VpdmVyQWN0aXZpdHkuQUNUSU9OX0VYRUNVVEVfQ09NTUFORCk7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oV29ya1Byb2ZpbGVXaWRnZXRBY3Rpdml0eS5BQ1RJT05fVEVTVF9XT1JLX1BST0ZJTEVfV0lER0VUKTsKICAgICAgICAgZHBtLmFkZENyb3NzUHJvZmlsZUludGVudEZpbHRlcihnZXRXaG8oY29udGV4dCksIGZpbHRlciwKICAgICAgICAgICAgICAgICBEZXZpY2VQb2xpY3lNYW5hZ2VyLkZMQUdfTUFOQUdFRF9DQU5fQUNDRVNTX1BBUkVOVCk7CiAKQEAgLTEyNSw2ICsxODQsNyBAQAogICAgICAgICBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7CiAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oQnlvZEhlbHBlckFjdGl2aXR5LkFDVElPTl9QUk9GSUxFX09XTkVSX1NUQVRVUyk7CiAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oQnlvZEhlbHBlckFjdGl2aXR5LkFDVElPTl9ESVNLX0VOQ1JZUFRJT05fU1RBVFVTKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihCeW9kRmxvd1Rlc3RBY3Rpdml0eS5BQ1RJT05fVEVTVF9SRVNVTFQpOwogICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKENyb3NzUHJvZmlsZVRlc3RBY3Rpdml0eS5BQ1RJT05fQ1JPU1NfUFJPRklMRV9UT19QRVJTT05BTCk7CiAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oTG9jYXRpb25MaXN0ZW5lckFjdGl2aXR5LkFDVElPTl9TRVRfTE9DQVRJT05fQU5EX0NIRUNLX1VQREFURVMpOwogICAgICAgICBkcG0uYWRkQ3Jvc3NQcm9maWxlSW50ZW50RmlsdGVyKGdldFdobyhjb250ZXh0KSwgZmlsdGVyLApAQCAtMTQzLDQgKzIwMyw0MyBAQAogICAgICAgICAgICAgZ2V0TWFuYWdlcihjb250ZXh0KS53aXBlRGF0YSgwKTsKICAgICAgICAgfQogICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBiaW5kUHJpbWFyeVVzZXJTZXJ2aWNlKENvbnRleHQgY29udGV4dCwgQ29uc3VtZXI8SUNyb3NzVXNlclNlcnZpY2U+IGNvbnN1bWVyKSB7CisgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIgZGV2aWNlUG9saWN5TWFuYWdlciA9IGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZSgKKyAgICAgICAgICAgICAgICBEZXZpY2VQb2xpY3lNYW5hZ2VyLmNsYXNzKTsKKyAgICAgICAgVXNlckhhbmRsZSBwcmltYXJ5VXNlciA9IGRldmljZVBvbGljeU1hbmFnZXIuZ2V0QmluZERldmljZUFkbWluVGFyZ2V0VXNlcnMoCisgICAgICAgICAgICAgICAgZ2V0UmVjZWl2ZXJDb21wb25lbnROYW1lKCkpLmdldCgwKTsKKworICAgICAgICBMb2cuZChUQUcsICJDYWxsaW5nIHByaW1hcnkgdXNlcjogIiArIHByaW1hcnlVc2VyKTsKKyAgICAgICAgZmluYWwgU2VydmljZUNvbm5lY3Rpb24gc2VydmljZUNvbm5lY3Rpb24gPSBuZXcgU2VydmljZUNvbm5lY3Rpb24oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZUNvbm5lY3RlZChDb21wb25lbnROYW1lIG5hbWUsIElCaW5kZXIgc2VydmljZSkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm9uU2VydmljZUNvbm5lY3RlZCBpcyBjYWxsZWQiKTsKKyAgICAgICAgICAgICAgICBjb25zdW1lci5hY2NlcHQoSUNyb3NzVXNlclNlcnZpY2UuU3R1Yi5hc0ludGVyZmFjZShzZXJ2aWNlKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlRGlzY29ubmVjdGVkKENvbXBvbmVudE5hbWUgbmFtZSkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm9uU2VydmljZURpc2Nvbm5lY3RlZCBpcyBjYWxsZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgZmluYWwgSW50ZW50IHNlcnZpY2VJbnRlbnQgPSBuZXcgSW50ZW50KGNvbnRleHQsIFByaW1hcnlVc2VyU2VydmljZS5jbGFzcyk7CisgICAgICAgIGRldmljZVBvbGljeU1hbmFnZXIuYmluZERldmljZUFkbWluU2VydmljZUFzVXNlcihnZXRSZWNlaXZlckNvbXBvbmVudE5hbWUoKSwgc2VydmljZUludGVudCwKKyAgICAgICAgICAgICAgICBzZXJ2aWNlQ29ubmVjdGlvbiwgQ29udGV4dC5CSU5EX0FVVE9fQ1JFQVRFLCBwcmltYXJ5VXNlcik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBQcmltYXJ5VXNlclNlcnZpY2UgZXh0ZW5kcyBTZXJ2aWNlIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBJQ3Jvc3NVc2VyU2VydmljZS5TdHViIG1CaW5kZXIgPSBuZXcgSUNyb3NzVXNlclNlcnZpY2UuU3R1YigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHN3aXRjaFVzZXIoVXNlckhhbmRsZSB1c2VySGFuZGxlKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAic3dpdGNoVXNlcjogIiArIHVzZXJIYW5kbGUpOworICAgICAgICAgICAgICAgIGdldFN5c3RlbVNlcnZpY2UoRGV2aWNlUG9saWN5TWFuYWdlci5jbGFzcykuc3dpdGNoVXNlcihnZXRSZWNlaXZlckNvbXBvbmVudE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJIYW5kbGUpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSUJpbmRlciBvbkJpbmQoSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgcmV0dXJuIG1CaW5kZXI7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbWFuYWdlZHByb3Zpc2lvbmluZy9EZXZpY2VPd25lck5lZ2F0aXZlVGVzdEFjdGl2aXR5LmphdmEgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbWFuYWdlZHByb3Zpc2lvbmluZy9EZXZpY2VPd25lck5lZ2F0aXZlVGVzdEFjdGl2aXR5LmphdmEKaW5kZXggMDc4ZTljZS4uZGZmY2U1NiAxMDA2NDQKLS0tIGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL21hbmFnZWRwcm92aXNpb25pbmcvRGV2aWNlT3duZXJOZWdhdGl2ZVRlc3RBY3Rpdml0eS5qYXZhCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9tYW5hZ2VkcHJvdmlzaW9uaW5nL0RldmljZU93bmVyTmVnYXRpdmVUZXN0QWN0aXZpdHkuamF2YQpAQCAtMjAsNiArMjAsNyBAQAogaW1wb3J0IGFuZHJvaWQuYXBwLmFkbWluLkRldmljZVBvbGljeU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhU2V0T2JzZXJ2ZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKQEAgLTk4LDEwICs5OSwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgLnB1dEV4dHJhKEVudGVycHJpc2VQcml2YWN5SW5mb09ubHlUZXN0QWN0aXZpdHkuRVhUUkFfSU5GTywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuZW50ZXJwcmlzZV9wcml2YWN5X3F1aWNrX3NldHRpbmdzX25lZ2F0aXZlX2luZm8pLAogICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCkpOwotICAgICAgICBhZGFwdGVyLmFkZChjcmVhdGVJbnRlcmFjdGl2ZVRlc3RJdGVtKHRoaXMsIEVOVEVSUFJJU0VfUFJJVkFDWV9LRVlHVUFSRF9ORUdBVElWRSwKLSAgICAgICAgICAgICAgICBSLnN0cmluZy5lbnRlcnByaXNlX3ByaXZhY3lfa2V5Z3VhcmRfbmVnYXRpdmUsCi0gICAgICAgICAgICAgICAgUi5zdHJpbmcuZW50ZXJwcmlzZV9wcml2YWN5X2tleWd1YXJkX25lZ2F0aXZlX2luZm8sCi0gICAgICAgICAgICAgICAgbmV3IEJ1dHRvbkluZm8oUi5zdHJpbmcuZ29fYnV0dG9uX3RleHQsIG5ldyBJbnRlbnQoU2V0dGluZ3MuQUNUSU9OX1NFVFRJTkdTKSkpKTsKKyAgICAgICAgaWYoIWdldFBhY2thZ2VNYW5hZ2VyKCkuaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX0FVVE9NT1RJVkUpKSB7CisgICAgICAgICAgICBhZGFwdGVyLmFkZChjcmVhdGVJbnRlcmFjdGl2ZVRlc3RJdGVtKHRoaXMsIEVOVEVSUFJJU0VfUFJJVkFDWV9LRVlHVUFSRF9ORUdBVElWRSwKKyAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuZW50ZXJwcmlzZV9wcml2YWN5X2tleWd1YXJkX25lZ2F0aXZlLAorICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5lbnRlcnByaXNlX3ByaXZhY3lfa2V5Z3VhcmRfbmVnYXRpdmVfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgbmV3IEJ1dHRvbkluZm8oUi5zdHJpbmcuZ29fYnV0dG9uX3RleHQsIG5ldyBJbnRlbnQoU2V0dGluZ3MuQUNUSU9OX1NFVFRJTkdTKSkpKTsKKyAgICAgICAgfQogICAgICAgICBhZGFwdGVyLmFkZChjcmVhdGVJbnRlcmFjdGl2ZVRlc3RJdGVtKHRoaXMsIEVOVEVSUFJJU0VfUFJJVkFDWV9BRERfQUNDT1VOVF9ORUdBVElWRSwKICAgICAgICAgICAgICAgICBSLnN0cmluZy5lbnRlcnByaXNlX3ByaXZhY3lfYWRkX2FjY291bnRfbmVnYXRpdmUsCiAgICAgICAgICAgICAgICAgUi5zdHJpbmcuZW50ZXJwcmlzZV9wcml2YWN5X2FkZF9hY2NvdW50X25lZ2F0aXZlX2luZm8sCmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbWFuYWdlZHByb3Zpc2lvbmluZy9EZXZpY2VPd25lclBvc2l0aXZlVGVzdEFjdGl2aXR5LmphdmEgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbWFuYWdlZHByb3Zpc2lvbmluZy9EZXZpY2VPd25lclBvc2l0aXZlVGVzdEFjdGl2aXR5LmphdmEKaW5kZXggNmQ0NDE1Mi4uZmY0ZjU0MCAxMDA2NDQKLS0tIGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL21hbmFnZWRwcm92aXNpb25pbmcvRGV2aWNlT3duZXJQb3NpdGl2ZVRlc3RBY3Rpdml0eS5qYXZhCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9tYW5hZ2VkcHJvdmlzaW9uaW5nL0RldmljZU93bmVyUG9zaXRpdmVUZXN0QWN0aXZpdHkuamF2YQpAQCAtNTcsNiArNTcsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXSUZJX0xPQ0tET1dOX1RFU1RfSUQgPSBXaWZpTG9ja2Rvd25UZXN0QWN0aXZpdHkuY2xhc3MuZ2V0TmFtZSgpOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFX1NUQVRVU19CQVJfVEVTVF9JRCA9ICJESVNBQkxFX1NUQVRVU19CQVIiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFX0tFWUdVQVJEX1RFU1RfSUQgPSAiRElTQUJMRV9LRVlHVUFSRCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0tfVEFTS19VSV9URVNUX0lEID0gIkxPQ0tfVEFTS19VSSI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENIRUNLX1BFUk1JU1NJT05fTE9DS0RPV05fVEVTVF9JRCA9CiAgICAgICAgICAgICBQZXJtaXNzaW9uTG9ja2Rvd25UZXN0QWN0aXZpdHkuY2xhc3MuZ2V0TmFtZSgpOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBTExPV19DT05GSUdfQlRfSUQgPSAiRElTQUxMT1dfQ09ORklHX0JUIjsKQEAgLTY5LDkgKzcwLDE0IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBPTElDWV9UUkFOU1BBUkVOQ1lfVEVTVF9JRCA9ICJQT0xJQ1lfVFJBTlNQQVJFTkNZIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5URVJQUklTRV9QUklWQUNZX1RFU1RfSUQgPSAiRU5URVJQUklTRV9QUklWQUNZIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVUV09SS19MT0dHSU5HX1VJX1RFU1RfSUQgPSAiTkVUV09SS19MT0dHSU5HX1VJIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QX1RFU1RfSUQgPSAiQ09NUF9VSSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FMTE9XX1VTRVJfU1dJVENIX1RFU1RfSUQgPSAiRElTQUxMT1dfVVNFUl9TV0lUQ0giOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX1NXSVRDSEVSX01FU1NBR0VfVEVTVF9JRCA9ICJVU0VSX1NXSVRDSEVSX01FU1NBR0UiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTkFCTEVfTE9HT1VUX1RFU1RfSUQgPSAiRU5BQkxFX0xPR09VVCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBfVEVTVF9JRCA9ICJDT01QX1VJIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFOQUdFRF9VU0VSX1RFU1RfSUQgPSAiTUFOQUdFRF9VU0VSX1VJIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1ZFX0RFVklDRV9PV05FUl9URVNUX0lEID0gIlJFTU9WRV9ERVZJQ0VfT1dORVIiOwotICAgIHByaXZhdGUgRGV2aWNlT3duZXJTa2lwVGVzdEhlbHBlciBtRGV2aWNlT3duZXJTa2lwVGVzdEhlbHBlcjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUxMT1dfQU1CSUVOVF9ESVNQTEFZX0lEID0gIkRJU0FMTE9XX0FNQklFTlRfRElTUExBWSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FMTE9XX1JFTU9WRV9VU0VSX1RFU1RfSUQgPSAiRElTQUxMT1dfUkVNT1ZFX1VTRVIiOwogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewpAQCAtODQsNiArOTAsOSBAQAogICAgICAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlciBkcG0gPSAoRGV2aWNlUG9saWN5TWFuYWdlcikgZ2V0U3lzdGVtU2VydmljZSgKICAgICAgICAgICAgICAgICAgICAgQ29udGV4dC5ERVZJQ0VfUE9MSUNZX1NFUlZJQ0UpOwogICAgICAgICAgICAgaWYgKGRwbS5pc0RldmljZU93bmVyQXBwKGdldFBhY2thZ2VOYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgLy8gU2V0IERJU0FMTE9XX0FERF9VU0VSIG9uIGJlaGFsZiBvZiBNYW5hZ2VkUHJvdmlzaW9uaW5nLgorICAgICAgICAgICAgICAgIGRwbS5hZGRVc2VyUmVzdHJpY3Rpb24oRGV2aWNlQWRtaW5UZXN0UmVjZWl2ZXIuZ2V0UmVjZWl2ZXJDb21wb25lbnROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICBVc2VyTWFuYWdlci5ESVNBTExPV19BRERfVVNFUik7CiAgICAgICAgICAgICAgICAgVGVzdFJlc3VsdC5zZXRQYXNzZWRSZXN1bHQodGhpcywgZ2V0SW50ZW50KCkuZ2V0U3RyaW5nRXh0cmEoRVhUUkFfVEVTVF9JRCksCiAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsKTsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC05NSwyMCArMTA0LDYgQEAKICAgICAgICAgfQogCiAgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LnBvc2l0aXZlX2RldmljZV9vd25lcik7Ci0gICAgICAgIG1EZXZpY2VPd25lclNraXBUZXN0SGVscGVyID0gbmV3IERldmljZU93bmVyU2tpcFRlc3RIZWxwZXIodGhpcywgKCkgLT4gc2V0dXBUZXN0cygpKTsKLSAgICAgICAgbURldmljZU93bmVyU2tpcFRlc3RIZWxwZXIuc2V0dXBTa2lwQ2hlY2tVaSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUFjdGl2aXR5UmVzdWx0KGludCByZXF1ZXN0Q29kZSwgaW50IHJlc3VsdENvZGUsIEludGVudCBkYXRhKSB7Ci0gICAgICAgIGJvb2xlYW4gaGFuZGxlZCA9IG1EZXZpY2VPd25lclNraXBUZXN0SGVscGVyLmhhbmRsZVNraXBDaGVja0FjdGl2aXR5UmVzdWx0KAotICAgICAgICAgICAgICAgIHJlcXVlc3RDb2RlLCByZXN1bHRDb2RlLCBkYXRhKTsKLSAgICAgICAgaWYgKCFoYW5kbGVkKSB7Ci0gICAgICAgICAgICBzdXBlci5oYW5kbGVBY3Rpdml0eVJlc3VsdChyZXF1ZXN0Q29kZSwgcmVzdWx0Q29kZSwgZGF0YSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0dXBUZXN0cygpIHsKICAgICAgICAgc2V0SW5mb1Jlc291cmNlcyhSLnN0cmluZy5kZXZpY2Vfb3duZXJfcG9zaXRpdmVfdGVzdHMsCiAgICAgICAgICAgICAgICAgUi5zdHJpbmcuZGV2aWNlX293bmVyX3Bvc2l0aXZlX3Rlc3RzX2luZm8sIDApOwogICAgICAgICBzZXRQYXNzRmFpbEJ1dHRvbkNsaWNrTGlzdGVuZXJzKCk7CkBAIC0xNDAsNiArMTM1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIC5zaG93KCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0pOworCiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xODIsMTMgKzE3OCwyNiBAQAogICAgICAgICAgICAgICAgICAgICBuZXcgQnV0dG9uSW5mb1tdIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnV0dG9uSW5mbygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmRldmljZV9vd25lcl91c2VyX3Jlc3RyaWN0aW9uX3NldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVNldFVzZXJSZXN0cmljdGlvbkludGVudCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlck1hbmFnZXIuRElTQUxMT1dfQ09ORklHX1dJRkkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRSZWNlaXZlckFjdGl2aXR5LmNyZWF0ZVNldFVzZXJSZXN0cmljdGlvbkludGVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlck1hbmFnZXIuRElTQUxMT1dfQ09ORklHX1dJRkksIHRydWUpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnV0dG9uSW5mbygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmRldmljZV9vd25lcl9zZXR0aW5nc19nbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlbnQoU2V0dGluZ3MuQUNUSU9OX1dJRklfU0VUVElOR1MpKX0pKTsKICAgICAgICAgfQogCisgICAgICAgIC8vIERJU0FMTE9XX0FNQklFTlRfRElTUExBWS4KKyAgICAgICAgYWRhcHRlci5hZGQoY3JlYXRlSW50ZXJhY3RpdmVUZXN0SXRlbSh0aGlzLCBESVNBTExPV19BTUJJRU5UX0RJU1BMQVlfSUQsCisgICAgICAgICAgICAgICAgUi5zdHJpbmcuZGV2aWNlX293bmVyX2Rpc2FsbG93X2FtYmllbnRfZGlzcGxheSwKKyAgICAgICAgICAgICAgICBSLnN0cmluZy5kZXZpY2Vfb3duZXJfZGlzYWxsb3dfYW1iaWVudF9kaXNwbGF5X2luZm8sCisgICAgICAgICAgICAgICAgbmV3IEJ1dHRvbkluZm9bXSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnV0dG9uSW5mbygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuZGV2aWNlX293bmVyX3VzZXJfcmVzdHJpY3Rpb25fc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kUmVjZWl2ZXJBY3Rpdml0eS5jcmVhdGVTZXRVc2VyUmVzdHJpY3Rpb25JbnRlbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlck1hbmFnZXIuRElTQUxMT1dfQU1CSUVOVF9ESVNQTEFZLCB0cnVlKSksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnV0dG9uSW5mbygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuZGV2aWNlX293bmVyX3NldHRpbmdzX2dvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZW50KFNldHRpbmdzLkFDVElPTl9ESVNQTEFZX1NFVFRJTkdTKSl9KSk7CisKICAgICAgICAgLy8gRElTQUxMT1dfQ09ORklHX1ZQTgogICAgICAgICBhZGFwdGVyLmFkZChjcmVhdGVJbnRlcmFjdGl2ZVRlc3RJdGVtKHRoaXMsIERJU0FMTE9XX0NPTkZJR19WUE5fSUQsCiAgICAgICAgICAgICAgICAgUi5zdHJpbmcuZGV2aWNlX293bmVyX2Rpc2FsbG93X2NvbmZpZ192cG4sCkBAIC0xOTYsOCArMjA1LDggQEAKICAgICAgICAgICAgICAgICBuZXcgQnV0dG9uSW5mb1tdIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCdXR0b25JbmZvKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5kZXZpY2Vfb3duZXJfdXNlcl92cG5fcmVzdHJpY3Rpb25fc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVTZXRVc2VyUmVzdHJpY3Rpb25JbnRlbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlck1hbmFnZXIuRElTQUxMT1dfQ09ORklHX1ZQTikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kUmVjZWl2ZXJBY3Rpdml0eS5jcmVhdGVTZXRVc2VyUmVzdHJpY3Rpb25JbnRlbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlck1hbmFnZXIuRElTQUxMT1dfQ09ORklHX1ZQTiwgdHJ1ZSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ1dHRvbkluZm8oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmRldmljZV9vd25lcl9zZXR0aW5nc19nbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVudChTZXR0aW5ncy5BQ1RJT05fVlBOX1NFVFRJTkdTKSksCkBAIC0yMTMsOCArMjIyLDggQEAKICAgICAgICAgICAgICAgICAgICAgbmV3IEJ1dHRvbkluZm9bXSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ1dHRvbkluZm8oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5kZXZpY2Vfb3duZXJfdXNlcl9yZXN0cmljdGlvbl9zZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVTZXRVc2VyUmVzdHJpY3Rpb25JbnRlbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJNYW5hZ2VyLkRJU0FMTE9XX0RBVEFfUk9BTUlORykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZFJlY2VpdmVyQWN0aXZpdHkuY3JlYXRlU2V0VXNlclJlc3RyaWN0aW9uSW50ZW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyTWFuYWdlci5ESVNBTExPV19EQVRBX1JPQU1JTkcsIHRydWUpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnV0dG9uSW5mbygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmRldmljZV9vd25lcl9zZXR0aW5nc19nbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlbnQoU2V0dGluZ3MuQUNUSU9OX0RBVEFfUk9BTUlOR19TRVRUSU5HUykpfSkpOwpAQCAtMjI3LDggKzIzNiw4IEBACiAgICAgICAgICAgICAgICAgbmV3IEJ1dHRvbkluZm9bXSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnV0dG9uSW5mbygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuZGV2aWNlX293bmVyX3VzZXJfcmVzdHJpY3Rpb25fc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVTZXRVc2VyUmVzdHJpY3Rpb25JbnRlbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlck1hbmFnZXIuRElTQUxMT1dfRkFDVE9SWV9SRVNFVCkpfSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kUmVjZWl2ZXJBY3Rpdml0eS5jcmVhdGVTZXRVc2VyUmVzdHJpY3Rpb25JbnRlbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlck1hbmFnZXIuRElTQUxMT1dfRkFDVE9SWV9SRVNFVCwgdHJ1ZSkpfSkpOwogCiAgICAgICAgIC8vIERJU0FMTE9XX0NPTkZJR19CTFVFVE9PVEgKICAgICAgICAgaWYgKHBhY2thZ2VNYW5hZ2VyLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9CTFVFVE9PVEgpKSB7CkBAIC0yMzgsOCArMjQ3LDggQEAKICAgICAgICAgICAgICAgICAgICAgbmV3IEJ1dHRvbkluZm9bXSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ1dHRvbkluZm8oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5kZXZpY2Vfb3duZXJfdXNlcl9yZXN0cmljdGlvbl9zZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVTZXRVc2VyUmVzdHJpY3Rpb25JbnRlbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJNYW5hZ2VyLkRJU0FMTE9XX0NPTkZJR19CTFVFVE9PVEgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRSZWNlaXZlckFjdGl2aXR5LmNyZWF0ZVNldFVzZXJSZXN0cmljdGlvbkludGVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlck1hbmFnZXIuRElTQUxMT1dfQ09ORklHX0JMVUVUT09USCwgdHJ1ZSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCdXR0b25JbmZvKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuZGV2aWNlX293bmVyX3NldHRpbmdzX2dvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVudChTZXR0aW5ncy5BQ1RJT05fQkxVRVRPT1RIX1NFVFRJTkdTKSl9KSk7CkBAIC0yNTIsOCArMjYxLDggQEAKICAgICAgICAgICAgICAgICBuZXcgQnV0dG9uSW5mb1tdIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCdXR0b25JbmZvKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5kZXZpY2Vfb3duZXJfdXNlcl9yZXN0cmljdGlvbl9zZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVNldFVzZXJSZXN0cmljdGlvbkludGVudCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyTWFuYWdlci5ESVNBTExPV19VU0JfRklMRV9UUkFOU0ZFUikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kUmVjZWl2ZXJBY3Rpdml0eS5jcmVhdGVTZXRVc2VyUmVzdHJpY3Rpb25JbnRlbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlck1hbmFnZXIuRElTQUxMT1dfVVNCX0ZJTEVfVFJBTlNGRVIsIHRydWUpKSwKICAgICAgICAgICAgICAgICB9KSk7CiAKICAgICAgICAgLy8gRElTQUJMRV9TVEFUVVNfQkFSX1RFU1QKQEAgLTI5MCw2ICsyOTksMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kUmVjZWl2ZXJBY3Rpdml0eS5DT01NQU5EX1NFVF9LRVlHVUFSRF9ESVNBQkxFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSl9KSk7CiAKKyAgICAgICAgLy8gc2V0TG9ja1Rhc2tGZWF0dXJlcworICAgICAgICBmaW5hbCBJbnRlbnQgbG9ja1Rhc2tVaVRlc3RJbnRlbnQgPSBuZXcgSW50ZW50KHRoaXMsIExvY2tUYXNrVWlUZXN0QWN0aXZpdHkuY2xhc3MpOworICAgICAgICBsb2NrVGFza1VpVGVzdEludGVudC5wdXRFeHRyYShMb2NrVGFza1VpVGVzdEFjdGl2aXR5LkVYVFJBX1RFU1RfSUQsIExPQ0tfVEFTS19VSV9URVNUX0lEKTsKKyAgICAgICAgYWRhcHRlci5hZGQoY3JlYXRlVGVzdEl0ZW0odGhpcywgTE9DS19UQVNLX1VJX1RFU1RfSUQsCisgICAgICAgICAgICAgICAgUi5zdHJpbmcuZGV2aWNlX293bmVyX2xvY2tfdGFza191aV90ZXN0LAorICAgICAgICAgICAgICAgIGxvY2tUYXNrVWlUZXN0SW50ZW50KSk7CisKKyAgICAgICAgLy8gc2V0VXNlckljb24KICAgICAgICAgYWRhcHRlci5hZGQoY3JlYXRlSW50ZXJhY3RpdmVUZXN0SXRlbSh0aGlzLCBTRVRfVVNFUl9JQ09OX1RFU1RfSUQsCiAgICAgICAgICAgICAgICAgUi5zdHJpbmcuZGV2aWNlX293bmVyX3NldF91c2VyX2ljb24sCiAgICAgICAgICAgICAgICAgUi5zdHJpbmcuZGV2aWNlX293bmVyX3NldF91c2VyX2ljb25faW5zdHJ1Y3Rpb24sCkBAIC0zMjgsNiArMzQ1LDcgQEAKICAgICAgICAgICAgICAgICBSLnN0cmluZy5lbnRlcnByaXNlX3ByaXZhY3lfdGVzdCwKICAgICAgICAgICAgICAgICBlbnRlcnByaXNlUG9saWN5VGVzdEludGVudCkpOwogCisgICAgICAgIC8vIENPTVAKICAgICAgICAgaWYgKHBhY2thZ2VNYW5hZ2VyLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9NQU5BR0VEX1VTRVJTKSkgewogICAgICAgICAgICAgSW50ZW50IGNvbXBJbnRlbnQgPSBuZXcgSW50ZW50KHRoaXMsIENvbXBUZXN0QWN0aXZpdHkuY2xhc3MpCiAgICAgICAgICAgICAgICAgICAgIC5wdXRFeHRyYShQb2xpY3lUcmFuc3BhcmVuY3lUZXN0QWN0aXZpdHkuRVhUUkFfVEVTVF9JRCwgQ09NUF9URVNUX0lEKTsKQEAgLTMzNiw2ICszNTQsNzEgQEAKICAgICAgICAgICAgICAgICAgICAgY29tcEludGVudCkpOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKHBhY2thZ2VNYW5hZ2VyLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9NQU5BR0VEX1VTRVJTKQorICAgICAgICAgICAgICAgICYmIFVzZXJNYW5hZ2VyLnN1cHBvcnRzTXVsdGlwbGVVc2VycygpKSB7CisgICAgICAgICAgICAvLyBNYW5hZ2VkIHVzZXIKKyAgICAgICAgICAgIGFkYXB0ZXIuYWRkKGNyZWF0ZUludGVyYWN0aXZlVGVzdEl0ZW0odGhpcywgTUFOQUdFRF9VU0VSX1RFU1RfSUQsCisgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLm1hbmFnZWRfdXNlcl90ZXN0LAorICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5tYW5hZ2VkX3VzZXJfcG9zaXRpdmVfdGVzdHNfaW5zdHJ1Y3Rpb25zLAorICAgICAgICAgICAgICAgICAgICBuZXcgQnV0dG9uSW5mb1tdeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCdXR0b25JbmZvKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuZGV2aWNlX293bmVyX3NldHRpbmdzX2dvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlQ3JlYXRlTWFuYWdlZFVzZXJJbnRlbnQoKSl9KSk7CisKKyAgICAgICAgICAgIC8vIFVzZXIgc3dpdGNoZXIgbWVzc2FnZQorICAgICAgICAgICAgYWRhcHRlci5hZGQoY3JlYXRlSW50ZXJhY3RpdmVUZXN0SXRlbSh0aGlzLCBVU0VSX1NXSVRDSEVSX01FU1NBR0VfVEVTVF9JRCwKKyAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuZGV2aWNlX293bmVyX3VzZXJfc3dpdGNoZXJfbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuZGV2aWNlX293bmVyX3VzZXJfc3dpdGNoZXJfbWVzc2FnZV9pbmZvLAorICAgICAgICAgICAgICAgICAgICBuZXcgQnV0dG9uSW5mb1tdeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCdXR0b25JbmZvKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuZGV2aWNlX293bmVyX3dpdGhfdXNlcl9zd2l0Y2hlcl9tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlV2l0aFVzZXJTd2l0Y2hlck1lc3NhZ2VJbnRlbnQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ1dHRvbkluZm8oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5kZXZpY2Vfb3duZXJfd2l0aG91dF91c2VyX3N3aXRjaGVyX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVXaXRob3V0VXNlclN3aXRjaGVyTWVzc2FnZUludGVudCgpKX0pKTsKKworICAgICAgICAgICAgLy8gRW5hYmxlIGxvZ291dAorICAgICAgICAgICAgYWRhcHRlci5hZGQoY3JlYXRlSW50ZXJhY3RpdmVUZXN0SXRlbSh0aGlzLCBFTkFCTEVfTE9HT1VUX1RFU1RfSUQsCisgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmRldmljZV9vd25lcl9lbmFibGVfbG9nb3V0LAorICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5kZXZpY2Vfb3duZXJfZW5hYmxlX2xvZ291dF9pbmZvLAorICAgICAgICAgICAgICAgICAgICBuZXcgQnV0dG9uSW5mb1tdeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCdXR0b25JbmZvKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuZGV2aWNlX293bmVyX3NldHRpbmdzX2dvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlRW5hYmxlTG9nb3V0SW50ZW50KCkpfSkpOworCisgICAgICAgICAgICAvLyBESVNBTExPV19VU0VSX1NXSVRDSAorICAgICAgICAgICAgYWRhcHRlci5hZGQoY3JlYXRlSW50ZXJhY3RpdmVUZXN0SXRlbSh0aGlzLCBESVNBTExPV19VU0VSX1NXSVRDSF9URVNUX0lELAorICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5kZXZpY2Vfb3duZXJfZGlzYWxsb3dfdXNlcl9zd2l0Y2gsCisgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmRldmljZV9vd25lcl9kaXNhbGxvd191c2VyX3N3aXRjaF9pbmZvLAorICAgICAgICAgICAgICAgICAgICBuZXcgQnV0dG9uSW5mb1tdeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCdXR0b25JbmZvKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuZGV2aWNlX293bmVyX2Rpc2FsbG93X3VzZXJfc3dpdGNoX2NyZWF0ZV91c2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlQ3JlYXRlTWFuYWdlZFVzZXJXaXRob3V0U2V0dXBJbnRlbnQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ1dHRvbkluZm8oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5kZXZpY2Vfb3duZXJfdXNlcl9yZXN0cmljdGlvbl9zZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kUmVjZWl2ZXJBY3Rpdml0eS5jcmVhdGVTZXRVc2VyUmVzdHJpY3Rpb25JbnRlbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJNYW5hZ2VyLkRJU0FMTE9XX1VTRVJfU1dJVENILCB0cnVlKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ1dHRvbkluZm8oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5kZXZpY2Vfb3duZXJfc2V0dGluZ3NfZ28sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZW50KFNldHRpbmdzLkFDVElPTl9TRVRUSU5HUykpfSkpOworCisgICAgICAgICAgICAvLyBESVNBTExPV19SRU1PVkVfVVNFUgorICAgICAgICAgICAgYWRhcHRlci5hZGQoY3JlYXRlSW50ZXJhY3RpdmVUZXN0SXRlbSh0aGlzLCBESVNBTExPV19SRU1PVkVfVVNFUl9URVNUX0lELAorICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5kaXNhbGxvd19yZW1vdmVfdXNlciwKKyAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuZGV2aWNlX293bmVyX2Rpc2FsbG93X3JlbW92ZV91c2VyX2luZm8sCisgICAgICAgICAgICAgICAgICAgIG5ldyBCdXR0b25JbmZvW117CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ1dHRvbkluZm8oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5kZXZpY2Vfb3duZXJfZGlzYWxsb3dfcmVtb3ZlX3VzZXJfY3JlYXRlX3VzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVDcmVhdGVNYW5hZ2VkVXNlcldpdGhvdXRTZXR1cEludGVudCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnV0dG9uSW5mbygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmRldmljZV9vd25lcl91c2VyX3Jlc3RyaWN0aW9uX3NldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRSZWNlaXZlckFjdGl2aXR5LmNyZWF0ZVNldFVzZXJSZXN0cmljdGlvbkludGVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlck1hbmFnZXIuRElTQUxMT1dfUkVNT1ZFX1VTRVIsIHRydWUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnV0dG9uSW5mbygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmRldmljZV9vd25lcl9zZXR0aW5nc19nbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlbnQoU2V0dGluZ3MuQUNUSU9OX1NFVFRJTkdTKSl9KSk7CisgICAgICAgIH0KKwogICAgICAgICAvLyBOZXR3b3JrIGxvZ2dpbmcgVUkKICAgICAgICAgYWRhcHRlci5hZGQoY3JlYXRlSW50ZXJhY3RpdmVUZXN0SXRlbSh0aGlzLCBORVRXT1JLX0xPR0dJTkdfVUlfVEVTVF9JRCwKICAgICAgICAgICAgICAgICBSLnN0cmluZy5kZXZpY2Vfb3duZXJfbmV0d29ya19sb2dnaW5nX3VpLApAQCAtMzc2LDE0ICs0NTksNiBAQAogICAgICAgICAgICAgICAgIC5wdXRFeHRyYShDb21tYW5kUmVjZWl2ZXJBY3Rpdml0eS5FWFRSQV9FTkZPUkNFRCwgdmFsdWUpOwogICAgIH0KIAotICAgIHByaXZhdGUgSW50ZW50IGNyZWF0ZVNldFVzZXJSZXN0cmljdGlvbkludGVudChTdHJpbmcgcmVzdHJpY3Rpb24pIHsKLSAgICAgICAgcmV0dXJuIG5ldyBJbnRlbnQodGhpcywgQ29tbWFuZFJlY2VpdmVyQWN0aXZpdHkuY2xhc3MpCi0gICAgICAgICAgICAgICAgLnB1dEV4dHJhKENvbW1hbmRSZWNlaXZlckFjdGl2aXR5LkVYVFJBX0NPTU1BTkQsCi0gICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kUmVjZWl2ZXJBY3Rpdml0eS5DT01NQU5EX1NFVF9VU0VSX1JFU1RSSUNUSU9OKQotICAgICAgICAgICAgICAgIC5wdXRFeHRyYShDb21tYW5kUmVjZWl2ZXJBY3Rpdml0eS5FWFRSQV9VU0VSX1JFU1RSSUNUSU9OLCByZXN0cmljdGlvbikKLSAgICAgICAgICAgICAgICAucHV0RXh0cmEoQ29tbWFuZFJlY2VpdmVyQWN0aXZpdHkuRVhUUkFfRU5GT1JDRUQsIHRydWUpOwotICAgIH0KLQogICAgIHByaXZhdGUgSW50ZW50IGNyZWF0ZVNldFVzZXJJY29uSW50ZW50KCkgewogICAgICAgICByZXR1cm4gbmV3IEludGVudCh0aGlzLCBDb21tYW5kUmVjZWl2ZXJBY3Rpdml0eS5jbGFzcykKICAgICAgICAgICAgICAgICAucHV0RXh0cmEoQ29tbWFuZFJlY2VpdmVyQWN0aXZpdHkuRVhUUkFfQ09NTUFORCwKQEAgLTQwMiw5ICs0NzcsNDAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRSZWNlaXZlckFjdGl2aXR5LkNPTU1BTkRfRElTQUJMRV9ORVRXT1JLX0xPR0dJTkcpOwogICAgIH0KIAorICAgIHByaXZhdGUgSW50ZW50IGNyZWF0ZUNyZWF0ZU1hbmFnZWRVc2VySW50ZW50KCkgeworICAgICAgICByZXR1cm4gbmV3IEludGVudCh0aGlzLCBDb21tYW5kUmVjZWl2ZXJBY3Rpdml0eS5jbGFzcykKKyAgICAgICAgICAgICAgICAucHV0RXh0cmEoQ29tbWFuZFJlY2VpdmVyQWN0aXZpdHkuRVhUUkFfQ09NTUFORCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRSZWNlaXZlckFjdGl2aXR5LkNPTU1BTkRfQ1JFQVRFX01BTkFHRURfVVNFUik7CisgICAgfQorCisgICAgcHJpdmF0ZSBJbnRlbnQgY3JlYXRlV2l0aFVzZXJTd2l0Y2hlck1lc3NhZ2VJbnRlbnQoKSB7CisgICAgICAgIHJldHVybiBuZXcgSW50ZW50KHRoaXMsIENvbW1hbmRSZWNlaXZlckFjdGl2aXR5LmNsYXNzKQorICAgICAgICAgICAgICAgIC5wdXRFeHRyYShDb21tYW5kUmVjZWl2ZXJBY3Rpdml0eS5FWFRSQV9DT01NQU5ELAorICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZFJlY2VpdmVyQWN0aXZpdHkuQ09NTUFORF9XSVRIX1VTRVJfU1dJVENIRVJfTUVTU0FHRSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBJbnRlbnQgY3JlYXRlV2l0aG91dFVzZXJTd2l0Y2hlck1lc3NhZ2VJbnRlbnQoKSB7CisgICAgICAgIHJldHVybiBuZXcgSW50ZW50KHRoaXMsIENvbW1hbmRSZWNlaXZlckFjdGl2aXR5LmNsYXNzKQorICAgICAgICAgICAgICAgIC5wdXRFeHRyYShDb21tYW5kUmVjZWl2ZXJBY3Rpdml0eS5FWFRSQV9DT01NQU5ELAorICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZFJlY2VpdmVyQWN0aXZpdHkuQ09NTUFORF9XSVRIT1VUX1VTRVJfU1dJVENIRVJfTUVTU0FHRSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBJbnRlbnQgY3JlYXRlRW5hYmxlTG9nb3V0SW50ZW50KCkgeworICAgICAgICByZXR1cm4gbmV3IEludGVudCh0aGlzLCBDb21tYW5kUmVjZWl2ZXJBY3Rpdml0eS5jbGFzcykKKyAgICAgICAgICAgICAgICAucHV0RXh0cmEoQ29tbWFuZFJlY2VpdmVyQWN0aXZpdHkuRVhUUkFfQ09NTUFORCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRSZWNlaXZlckFjdGl2aXR5LkNPTU1BTkRfRU5BQkxFX0xPR09VVCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBJbnRlbnQgY3JlYXRlQ3JlYXRlTWFuYWdlZFVzZXJXaXRob3V0U2V0dXBJbnRlbnQoKSB7CisgICAgICAgIHJldHVybiBuZXcgSW50ZW50KHRoaXMsIENvbW1hbmRSZWNlaXZlckFjdGl2aXR5LmNsYXNzKQorICAgICAgICAgICAgICAgIC5wdXRFeHRyYShDb21tYW5kUmVjZWl2ZXJBY3Rpdml0eS5FWFRSQV9DT01NQU5ELAorICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZFJlY2VpdmVyQWN0aXZpdHkuQ09NTUFORF9DUkVBVEVfTUFOQUdFRF9VU0VSX1dJVEhPVVRfU0VUVVApOworICAgIH0KKwogICAgIHByaXZhdGUgYm9vbGVhbiBpc1N0YXR1c0JhckVuYWJsZWQoKSB7CiAgICAgICAvLyBXYXRjaGVzIGRvbid0IHN1cHBvcnQgdGhlIHN0YXR1cyBiYXIgc28gdGhpcyBpcyBhbiBvayBwcm94eSwgYnV0IHRoaXMgaXMgbm90IHRoZSBtb3N0CiAgICAgICAvLyBnZW5lcmFsIHRlc3QgZm9yIHRoYXQuIFRPRE86IGFkZCBhIHRlc3QgQVBJIHRvIGRvIGEgcmVhbCBjaGVjayBmb3Igc3RhdHVzIGJhciBzdXBwb3J0LgotICAgICAgcmV0dXJuICFnZXRQYWNrYWdlTWFuYWdlcigpLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9XQVRDSCk7CisgICAgICByZXR1cm4gIWdldFBhY2thZ2VNYW5hZ2VyKCkuaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX1dBVENIKSAmJiAKKyAgICAgICAgICAgICAhZ2V0UGFja2FnZU1hbmFnZXIoKS5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfQVVUT01PVElWRSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL21hbmFnZWRwcm92aXNpb25pbmcvRGV2aWNlT3duZXJSZXF1ZXN0aW5nQnVncmVwb3J0VGVzdEFjdGl2aXR5LmphdmEgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbWFuYWdlZHByb3Zpc2lvbmluZy9EZXZpY2VPd25lclJlcXVlc3RpbmdCdWdyZXBvcnRUZXN0QWN0aXZpdHkuamF2YQppbmRleCA1MjRkOWE1Li43YWI4ZTdlIDEwMDY0NAotLS0gYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbWFuYWdlZHByb3Zpc2lvbmluZy9EZXZpY2VPd25lclJlcXVlc3RpbmdCdWdyZXBvcnRUZXN0QWN0aXZpdHkuamF2YQorKysgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbWFuYWdlZHByb3Zpc2lvbmluZy9EZXZpY2VPd25lclJlcXVlc3RpbmdCdWdyZXBvcnRUZXN0QWN0aXZpdHkuamF2YQpAQCAtMjEsNiArMjEsNyBAQAogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwogaW1wb3J0IGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nOwogaW1wb3J0IGFuZHJvaWQuYXBwLmFkbWluLkRldmljZVBvbGljeU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFTZXRPYnNlcnZlcjsKQEAgLTYyLDggKzYzLDYgQEAKICAgICAgICAgICAgICJCVUdSRVBPUlRfU0hBUklOR19BQ0NFUFRFRF9BRlRFUl9IQVZJTkdfQkVFTl9UQUtFTiI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTU9WRV9ERVZJQ0VfT1dORVJfVEVTVF9JRCA9ICJSRU1PVkVfREVWSUNFX09XTkVSIjsKIAotICAgIHByaXZhdGUgRGV2aWNlT3duZXJTa2lwVGVzdEhlbHBlciBtRGV2aWNlT3duZXJTa2lwVGVzdEhlbHBlcjsKLQogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKQEAgLTg1LDExICs4NCw2IEBACiAgICAgICAgIG5ldyBCeW9kRmxvd1Rlc3RIZWxwZXIodGhpcykudGVhckRvd24oKTsKIAogICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5yZXF1ZXN0aW5nX2J1Z3JlcG9ydF9kZXZpY2Vfb3duZXIpOwotICAgICAgICBtRGV2aWNlT3duZXJTa2lwVGVzdEhlbHBlciA9IG5ldyBEZXZpY2VPd25lclNraXBUZXN0SGVscGVyKHRoaXMsICgpIC0+IHNldHVwVGVzdHMoKSk7Ci0gICAgICAgIG1EZXZpY2VPd25lclNraXBUZXN0SGVscGVyLnNldHVwU2tpcENoZWNrVWkoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0dXBUZXN0cygpIHsKICAgICAgICAgc2V0SW5mb1Jlc291cmNlcyhSLnN0cmluZy5kZXZpY2Vfb3duZXJfcmVxdWVzdGluZ19idWdyZXBvcnRfdGVzdHMsCiAgICAgICAgICAgICAgICAgUi5zdHJpbmcuZGV2aWNlX293bmVyX3JlcXVlc3RpbmdfYnVncmVwb3J0X3Rlc3RzX2luZm8sIDApOwogICAgICAgICBzZXRQYXNzRmFpbEJ1dHRvbkNsaWNrTGlzdGVuZXJzKCk7CkBAIC0xMjUsMTUgKzExOSw2IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlQWN0aXZpdHlSZXN1bHQoaW50IHJlcXVlc3RDb2RlLCBpbnQgcmVzdWx0Q29kZSwgSW50ZW50IGRhdGEpIHsKLSAgICAgICAgYm9vbGVhbiBoYW5kbGVkID0gbURldmljZU93bmVyU2tpcFRlc3RIZWxwZXIuaGFuZGxlU2tpcENoZWNrQWN0aXZpdHlSZXN1bHQoCi0gICAgICAgICAgICAgICAgcmVxdWVzdENvZGUsIHJlc3VsdENvZGUsIGRhdGEpOwotICAgICAgICBpZiAoIWhhbmRsZWQpIHsKLSAgICAgICAgICAgIHN1cGVyLmhhbmRsZUFjdGl2aXR5UmVzdWx0KHJlcXVlc3RDb2RlLCByZXN1bHRDb2RlLCBkYXRhKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGZpbmlzaCgpIHsKICAgICAgICAgLy8gSWYgdGhpcyBhY3Rpdml0eSB3YXMgc3RhcnRlZCBmb3IgY2hlY2tpbmcgZGV2aWNlIG93bmVyIHN0YXR1cywgdGhlbiBubyBuZWVkIHRvIGRvIGFueQogICAgICAgICAvLyB0ZWFyIGRvd24uCmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbWFuYWdlZHByb3Zpc2lvbmluZy9EZXZpY2VPd25lclNraXBUZXN0SGVscGVyLmphdmEgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbWFuYWdlZHByb3Zpc2lvbmluZy9EZXZpY2VPd25lclNraXBUZXN0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZGRmNDQuLjAwMDAwMDAKLS0tIGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL21hbmFnZWRwcm92aXNpb25pbmcvRGV2aWNlT3duZXJTa2lwVGVzdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIubWFuYWdlZHByb3Zpc2lvbmluZzsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nOwotaW1wb3J0IGFuZHJvaWQuYXBwLmFkbWluLkRldmljZVBvbGljeU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5Ub2FzdDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5SOwotCi1wdWJsaWMgY2xhc3MgRGV2aWNlT3duZXJTa2lwVGVzdEhlbHBlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJEZXZpY2VPd25lclNraXBUZXN0SGVscGVyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVRVUVTVF9DT0RFX1NLSVBfVEVTVCA9IDE5OTc7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfREVWSUNFX09XTkVSID0gImRldmljZS1vd25lciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TS0lQUEVEID0gIlNLSVBQRUQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbXBvbmVudE5hbWUgU0tJUF9URVNUX0NIRUNLX0FDVElWSVRZID0gbmV3IENvbXBvbmVudE5hbWUoCi0gICAgICAgICAgICAiY29tLmFuZHJvaWQuY3RzLmVtcHR5ZGV2aWNlb3duZXIiLAotICAgICAgICAgICAgImNvbS5hbmRyb2lkLmN0cy5lbXB0eWRldmljZW93bmVyLlNraXBUZXN0Q2hlY2tBY3Rpdml0eSIpOwotCi0gICAgcHJpdmF0ZSBBY3Rpdml0eSBtVGVzdEFjdGl2aXR5OwotICAgIHByaXZhdGUgU2hhcmVkUHJlZmVyZW5jZXMgbVByZWZzOwotICAgIHByaXZhdGUgUnVubmFibGUgbVNldHVwVGVzdFJ1bm5hYmxlOwotCi0gICAgcHVibGljIERldmljZU93bmVyU2tpcFRlc3RIZWxwZXIoQWN0aXZpdHkgdGVzdEFjdGl2aXR5LCBSdW5uYWJsZSBzZXR1cFRlc3RSdW5uYWJsZSkgewotICAgICAgICBtVGVzdEFjdGl2aXR5ID0gdGVzdEFjdGl2aXR5OwotICAgICAgICBtU2V0dXBUZXN0UnVubmFibGUgPSBzZXR1cFRlc3RSdW5uYWJsZTsKLSAgICAgICAgbVByZWZzID0gdGVzdEFjdGl2aXR5LmdldFNoYXJlZFByZWZlcmVuY2VzKFBSRUZfREVWSUNFX09XTkVSLCBDb250ZXh0Lk1PREVfUFJJVkFURSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0dXBTa2lwQ2hlY2tVaSgpIHsKLSAgICAgICAgbVRlc3RBY3Rpdml0eS5maW5kVmlld0J5SWQoUi5pZC5jaGVja19wcmVjb25kaXRpb25zKS5zZXRPbkNsaWNrTGlzdGVuZXIoCi0gICAgICAgICAgICAgICAgdiAtPiBuZXcgQWxlcnREaWFsb2cuQnVpbGRlcihtVGVzdEFjdGl2aXR5KQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEljb24oYW5kcm9pZC5SLmRyYXdhYmxlLmljX2RpYWxvZ19pbmZvKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldFRpdGxlKFIuc3RyaW5nLmRldmljZV9vd25lcl9wcmVjb25kaXRpb25fZGlhbG9nX3RpdGxlKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldE1lc3NhZ2UoUi5zdHJpbmcuZGV2aWNlX293bmVyX3ByZWNvbmRpdGlvbl9kaWFsb2dfdGV4dCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQb3NpdGl2ZUJ1dHRvbihhbmRyb2lkLlIuc3RyaW5nLm9rLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGlhbG9nLCB3aGljaCkgLT4gc3RhcnRTa2lwQ2hlY2tBY3Rpdml0eSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNob3coKSk7Ci0gICAgICAgIG1UZXN0QWN0aXZpdHkuZmluZFZpZXdCeUlkKFIuaWQuc2V0X2RldmljZV9vd25lcl9idXR0b24pLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLQotICAgICAgICBpZiAobVByZWZzLmNvbnRhaW5zKEtFWV9TS0lQUEVEKSkgewotICAgICAgICAgICAgYm9vbGVhbiBzaG91bGRTa2lwID0gbVByZWZzLmdldEJvb2xlYW4oS0VZX1NLSVBQRUQsIGZhbHNlKTsKLSAgICAgICAgICAgIHVwZGF0ZVVpKHNob3VsZFNraXApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHN0YXJ0U2tpcENoZWNrQWN0aXZpdHkoKSB7Ci0gICAgICAgIERldmljZVBvbGljeU1hbmFnZXIgZHBtID0gbVRlc3RBY3Rpdml0eS5nZXRTeXN0ZW1TZXJ2aWNlKERldmljZVBvbGljeU1hbmFnZXIuY2xhc3MpOwotICAgICAgICBpZiAoIWRwbS5pc0RldmljZU93bmVyQXBwKFNLSVBfVEVTVF9DSEVDS19BQ1RJVklUWS5nZXRQYWNrYWdlTmFtZSgpKSkgewotICAgICAgICAgICAgVG9hc3QubWFrZVRleHQobVRlc3RBY3Rpdml0eSwKLSAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuZW1wdHlfZGV2aWNlX293bmVyX25vdF9jb25maWd1cmVfcHJvcGVybHksCi0gICAgICAgICAgICAgICAgICAgIFRvYXN0LkxFTkdUSF9MT05HKS5zaG93KCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOwotICAgICAgICBpbnRlbnQuc2V0Q29tcG9uZW50KFNLSVBfVEVTVF9DSEVDS19BQ1RJVklUWSk7Ci0gICAgICAgIG1UZXN0QWN0aXZpdHkuc3RhcnRBY3Rpdml0eUZvclJlc3VsdChpbnRlbnQsIFJFUVVFU1RfQ09ERV9TS0lQX1RFU1QpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhbmRsZVNraXBDaGVja0FjdGl2aXR5UmVzdWx0KGludCByZXF1ZXN0Q29kZSwgaW50IHJlc3VsdENvZGUsIEludGVudCBkYXRhKSB7Ci0gICAgICAgIGlmIChSRVFVRVNUX0NPREVfU0tJUF9URVNUICE9IHJlcXVlc3RDb2RlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbGVhbiBzaG91bGRTa2lwID0gZGF0YS5nZXRCb29sZWFuRXh0cmEoSW50ZW50LkVYVFJBX1JFVFVSTl9SRVNVTFQsIGZhbHNlKTsKLSAgICAgICAgTG9nLmQoVEFHLCAiaGFuZGxlU2tpcENoZWNrQWN0aXZpdHlSZXN1bHQ6IHNob3VsZFNraXAgPSAiICsgc2hvdWxkU2tpcCk7Ci0gICAgICAgIG1QcmVmcy5lZGl0KCkucHV0Qm9vbGVhbihLRVlfU0tJUFBFRCwgc2hvdWxkU2tpcCkuYXBwbHkoKTsKLSAgICAgICAgdXBkYXRlVWkoc2hvdWxkU2tpcCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVVaShib29sZWFuIHNob3VsZFNraXApIHsKLSAgICAgICAgaWYgKHNob3VsZFNraXApIHsKLSAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KG1UZXN0QWN0aXZpdHksCi0gICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmRldmljZV9vd25lcl9za2lwcGVkX3ByZWxvYWRlZF9hY2NvdW50cywKLSAgICAgICAgICAgICAgICAgICAgVG9hc3QuTEVOR1RIX0xPTkcpLnNob3coKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1UZXN0QWN0aXZpdHkuZmluZFZpZXdCeUlkKFIuaWQuY2hlY2tfcHJlY29uZGl0aW9ucykuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbVRlc3RBY3Rpdml0eS5maW5kVmlld0J5SWQoUi5pZC5zZXRfZGV2aWNlX293bmVyX2J1dHRvbikuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgbVNldHVwVGVzdFJ1bm5hYmxlLnJ1bigpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL21hbmFnZWRwcm92aXNpb25pbmcvRW50ZXJwcmlzZVByaXZhY3lUZXN0TGlzdEFjdGl2aXR5LmphdmEgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbWFuYWdlZHByb3Zpc2lvbmluZy9FbnRlcnByaXNlUHJpdmFjeVRlc3RMaXN0QWN0aXZpdHkuamF2YQppbmRleCA3MWM0NDIxLi41MTlkNTBiIDEwMDY0NAotLS0gYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbWFuYWdlZHByb3Zpc2lvbmluZy9FbnRlcnByaXNlUHJpdmFjeVRlc3RMaXN0QWN0aXZpdHkuamF2YQorKysgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbWFuYWdlZHByb3Zpc2lvbmluZy9FbnRlcnByaXNlUHJpdmFjeVRlc3RMaXN0QWN0aXZpdHkuamF2YQpAQCAtMjY5LDE5ICsyNjksMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZFJlY2VpdmVyQWN0aXZpdHkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTU1BTkRfUkVNT1ZFX01BTkFHRURfUFJPRklMRSkpfSkpOwogICAgICAgICB9Ci0gICAgICAgIC8vIERpc2FibGVkIGZvciBBUEkgMjYgZHVlIHRvIGIvNjM2OTY1MzYuCi0gICAgICAgIC8vIGFkYXB0ZXIuYWRkKGNyZWF0ZUludGVyYWN0aXZlVGVzdEl0ZW0odGhpcywgRU5URVJQUklTRV9QUklWQUNZX0ZBSUxFRF9QQVNTV09SRF9XSVBFLAotICAgICAgICAvLyAgICAgICAgIFIuc3RyaW5nLmVudGVycHJpc2VfcHJpdmFjeV9mYWlsZWRfcGFzc3dvcmRfd2lwZSwKLSAgICAgICAgLy8gICAgICAgICBSLnN0cmluZy5lbnRlcnByaXNlX3ByaXZhY3lfZmFpbGVkX3Bhc3N3b3JkX3dpcGVfaW5mbywKLSAgICAgICAgLy8gICAgICAgICBuZXcgQnV0dG9uSW5mb1tdIHsKLSAgICAgICAgLy8gICAgICAgICAgICAgICAgIG5ldyBCdXR0b25JbmZvKFIuc3RyaW5nLmVudGVycHJpc2VfcHJpdmFjeV9vcGVuX3NldHRpbmdzLAotICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZW50KFNldHRpbmdzLkFDVElPTl9FTlRFUlBSSVNFX1BSSVZBQ1lfU0VUVElOR1MpKSwKLSAgICAgICAgLy8gICAgICAgICAgICAgICAgIG5ldyBCdXR0b25JbmZvKFIuc3RyaW5nLmVudGVycHJpc2VfcHJpdmFjeV9zZXRfbGltaXQsCi0gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkQ29tbWFuZEludGVudChDb21tYW5kUmVjZWl2ZXJBY3Rpdml0eQotICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5DT01NQU5EX1NFVF9NQVhJTVVNX1BBU1NXT1JEX0FUVEVNUFRTKSksCi0gICAgICAgIC8vICAgICAgICAgICAgICAgICBuZXcgQnV0dG9uSW5mbyhSLnN0cmluZy5lbnRlcnByaXNlX3ByaXZhY3lfZmluaXNoLAotICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZENvbW1hbmRJbnRlbnQoQ29tbWFuZFJlY2VpdmVyQWN0aXZpdHkKLSAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQ09NTUFORF9DTEVBUl9NQVhJTVVNX1BBU1NXT1JEX0FUVEVNUFRTKSl9KSk7CisgICAgICAgIGFkYXB0ZXIuYWRkKGNyZWF0ZUludGVyYWN0aXZlVGVzdEl0ZW0odGhpcywgRU5URVJQUklTRV9QUklWQUNZX0ZBSUxFRF9QQVNTV09SRF9XSVBFLAorICAgICAgICAgICAgICAgIFIuc3RyaW5nLmVudGVycHJpc2VfcHJpdmFjeV9mYWlsZWRfcGFzc3dvcmRfd2lwZSwKKyAgICAgICAgICAgICAgICBSLnN0cmluZy5lbnRlcnByaXNlX3ByaXZhY3lfZmFpbGVkX3Bhc3N3b3JkX3dpcGVfaW5mbywKKyAgICAgICAgICAgICAgICBuZXcgQnV0dG9uSW5mb1tdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCdXR0b25JbmZvKFIuc3RyaW5nLmVudGVycHJpc2VfcHJpdmFjeV9vcGVuX3NldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZW50KFNldHRpbmdzLkFDVElPTl9FTlRFUlBSSVNFX1BSSVZBQ1lfU0VUVElOR1MpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCdXR0b25JbmZvKFIuc3RyaW5nLmVudGVycHJpc2VfcHJpdmFjeV9zZXRfbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkQ29tbWFuZEludGVudChDb21tYW5kUmVjZWl2ZXJBY3Rpdml0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5DT01NQU5EX1NFVF9NQVhJTVVNX1BBU1NXT1JEX0FUVEVNUFRTKSksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnV0dG9uSW5mbyhSLnN0cmluZy5lbnRlcnByaXNlX3ByaXZhY3lfZmluaXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZENvbW1hbmRJbnRlbnQoQ29tbWFuZFJlY2VpdmVyQWN0aXZpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQ09NTUFORF9DTEVBUl9NQVhJTVVNX1BBU1NXT1JEX0FUVEVNUFRTKSl9KSk7CiAgICAgICAgIGlmIChnZXRQYWNrYWdlTWFuYWdlcigpLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9NQU5BR0VEX1VTRVJTKSkgewogICAgICAgICAgICAgYWRhcHRlci5hZGQoY3JlYXRlSW50ZXJhY3RpdmVUZXN0SXRlbSh0aGlzLAogICAgICAgICAgICAgICAgICAgICBFTlRFUlBSSVNFX1BSSVZBQ1lfQ09NUF9GQUlMRURfUEFTU1dPUkRfV0lQRSwKQEAgLTMxMywyMCArMzEyLDIyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZFJlY2VpdmVyQWN0aXZpdHkuQ09NTUFORF9TRVRfT1JHQU5JWkFUSU9OX05BTUUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnB1dEV4dHJhKENvbW1hbmRSZWNlaXZlckFjdGl2aXR5LkVYVFJBX09SR0FOSVpBVElPTl9OQU1FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZvbywgSW5jLiIpKX0pKTsKLSAgICAgICAgYWRhcHRlci5hZGQoY3JlYXRlSW50ZXJhY3RpdmVUZXN0SXRlbSh0aGlzLCBFTlRFUlBSSVNFX1BSSVZBQ1lfS0VZR1VBUkQsCi0gICAgICAgICAgICAgICAgUi5zdHJpbmcuZW50ZXJwcmlzZV9wcml2YWN5X2tleWd1YXJkLAotICAgICAgICAgICAgICAgIFIuc3RyaW5nLmVudGVycHJpc2VfcHJpdmFjeV9rZXlndWFyZF9pbmZvLAotICAgICAgICAgICAgICAgIG5ldyBCdXR0b25JbmZvW10gewotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ1dHRvbkluZm8oUi5zdHJpbmcuZW50ZXJwcmlzZV9wcml2YWN5X29wZW5fc2V0dGluZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlbnQoU2V0dGluZ3MuQUNUSU9OX1NFVFRJTkdTKSksCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnV0dG9uSW5mbyhSLnN0cmluZy5lbnRlcnByaXNlX3ByaXZhY3lfY2xlYXJfb3JnYW5pemF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZENvbW1hbmRJbnRlbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZFJlY2VpdmVyQWN0aXZpdHkuQ09NTUFORF9TRVRfT1JHQU5JWkFUSU9OX05BTUUpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCdXR0b25JbmZvKFIuc3RyaW5nLmVudGVycHJpc2VfcHJpdmFjeV9zZXRfb3JnYW5pemF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZENvbW1hbmRJbnRlbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZFJlY2VpdmVyQWN0aXZpdHkuQ09NTUFORF9TRVRfT1JHQU5JWkFUSU9OX05BTUUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnB1dEV4dHJhKENvbW1hbmRSZWNlaXZlckFjdGl2aXR5LkVYVFJBX09SR0FOSVpBVElPTl9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZvbywgSW5jLiIpKX0pKTsKKyAgICAgICAgaWYoIWdldFBhY2thZ2VNYW5hZ2VyKCkuaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX0FVVE9NT1RJVkUpKSB7CisgICAgICAgICAgICBhZGFwdGVyLmFkZChjcmVhdGVJbnRlcmFjdGl2ZVRlc3RJdGVtKHRoaXMsIEVOVEVSUFJJU0VfUFJJVkFDWV9LRVlHVUFSRCwKKyAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuZW50ZXJwcmlzZV9wcml2YWN5X2tleWd1YXJkLAorICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5lbnRlcnByaXNlX3ByaXZhY3lfa2V5Z3VhcmRfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgbmV3IEJ1dHRvbkluZm9bXXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnV0dG9uSW5mbyhSLnN0cmluZy5lbnRlcnByaXNlX3ByaXZhY3lfb3Blbl9zZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlbnQoU2V0dGluZ3MuQUNUSU9OX1NFVFRJTkdTKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ1dHRvbkluZm8oUi5zdHJpbmcuZW50ZXJwcmlzZV9wcml2YWN5X2NsZWFyX29yZ2FuaXphdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkQ29tbWFuZEludGVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZFJlY2VpdmVyQWN0aXZpdHkuQ09NTUFORF9TRVRfT1JHQU5JWkFUSU9OX05BTUUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnV0dG9uSW5mbyhSLnN0cmluZy5lbnRlcnByaXNlX3ByaXZhY3lfc2V0X29yZ2FuaXphdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkQ29tbWFuZEludGVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZFJlY2VpdmVyQWN0aXZpdHkuQ09NTUFORF9TRVRfT1JHQU5JWkFUSU9OX05BTUUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wdXRFeHRyYShDb21tYW5kUmVjZWl2ZXJBY3Rpdml0eS5FWFRSQV9PUkdBTklaQVRJT05fTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRm9vLCBJbmMuIikpfSkpOworICAgICAgICB9CiAgICAgICAgIGFkYXB0ZXIuYWRkKGNyZWF0ZUludGVyYWN0aXZlVGVzdEl0ZW0odGhpcywgRU5URVJQUklTRV9QUklWQUNZX0FERF9BQ0NPVU5ULAogICAgICAgICAgICAgICAgIFIuc3RyaW5nLmVudGVycHJpc2VfcHJpdmFjeV9hZGRfYWNjb3VudCwKICAgICAgICAgICAgICAgICBSLnN0cmluZy5lbnRlcnByaXNlX3ByaXZhY3lfYWRkX2FjY291bnRfaW5mbywKZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9tYW5hZ2VkcHJvdmlzaW9uaW5nL0lDcm9zc1VzZXJTZXJ2aWNlLmFpZGwgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbWFuYWdlZHByb3Zpc2lvbmluZy9JQ3Jvc3NVc2VyU2VydmljZS5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4OTQ3NDUKLS0tIC9kZXYvbnVsbAorKysgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbWFuYWdlZHByb3Zpc2lvbmluZy9JQ3Jvc3NVc2VyU2VydmljZS5haWRsCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5tYW5hZ2VkcHJvdmlzaW9uaW5nOworCitpbXBvcnQgYW5kcm9pZC5vcy5Vc2VySGFuZGxlOworCitpbnRlcmZhY2UgSUNyb3NzVXNlclNlcnZpY2UgeworICAgIHZvaWQgc3dpdGNoVXNlcihpbiBVc2VySGFuZGxlIHVzZXJIYW5kbGUpOworfQpkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL21hbmFnZWRwcm92aXNpb25pbmcvSW50ZXJtZWRpYXRlUmVjZW50QWN0aXZpdHkuamF2YSBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9tYW5hZ2VkcHJvdmlzaW9uaW5nL0ludGVybWVkaWF0ZVJlY2VudEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM5NTc3OQotLS0gL2Rldi9udWxsCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9tYW5hZ2VkcHJvdmlzaW9uaW5nL0ludGVybWVkaWF0ZVJlY2VudEFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLm1hbmFnZWRwcm92aXNpb25pbmc7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworCisvKioKKyAqIEhhbmRsZXMgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLm1hbmFnZWRwcm92aXNpb25pbmcuUkVDRU5UUyBpbnRlbnQgc2VudAorICogZnJvbSBtYWluIHByb2ZpbGUgdG8gd29yayBwcm9maWxlLgorICoKKyAqIHtAbGluayBSZWNlbnRzUmVkYWN0aW9uQWN0aXZpdHl9IGlzIHJlcXVpcmVkIHRvIHN0YXkgaW4gUmVjZW50cyB0byBjb21wbGV0ZQorICogIlJlY2VudCBSZWRhY3Rpb24gVGVzdCIuIEhvd2V2ZXIgYSB7QGxpbmsgSW50ZW50I0ZMQUdfQUNUSVZJVFlfRVhDTFVERV9GUk9NX1JFQ0VOVFN9IHdpbGwgYmUKKyAqIGFkZGVkIGJ5IGZyYW1ld29yayB3aGVuIGludGVudCB7QGxpbmsgUmVjZW50c1JlZGFjdGlvbkFjdGl2aXR5I0FDVElPTl9SRUNFTlRTfSBpcyBzZW50IGZyb20KKyAqIHBlcnNvbmFsIHByb2ZpbGUgdG8gd29yayBwcm9maWxlLiBCeSBhZGRpbmcgdGhpcyB7QGxpbmsgSW50ZXJtZWRpYXRlUmVjZW50QWN0aXZpdHl9IGFuZAorICogbGV0IGl0IGhhbmxkZSB7QGxpbmsgUmVjZW50c1JlZGFjdGlvbkFjdGl2aXR5I0FDVElPTl9SRUNFTlRTfSBhbmQgdGhlbiBzdGFydAorICoge0BsaW5rIEludGVybWVkaWF0ZVJlY2VudEFjdGl2aXR5fSBpbiBhIG5ldyB0YXNrLCB3ZSBjYW4gbWFrZSBzdXJlIG5vCisgKiB7QGxpbmsgSW50ZW50I0ZMQUdfQUNUSVZJVFlfRVhDTFVERV9GUk9NX1JFQ0VOVFN9IGlzIGFkZGVkIGZvciBzdGFydGluZworICoge0BsaW5rIEludGVybWVkaWF0ZVJlY2VudEFjdGl2aXR5fS4KKyAqLworcHVibGljIGNsYXNzIEludGVybWVkaWF0ZVJlY2VudEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzdGFydEFjdGl2aXR5KG5ldyBJbnRlbnQodGhpcywgUmVjZW50c1JlZGFjdGlvbkFjdGl2aXR5LmNsYXNzKS5hZGRGbGFncygKKyAgICAgICAgICAgICAgICBJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyB8IEludGVudC5GTEFHX0FDVElWSVRZX01VTFRJUExFX1RBU0spKTsKKyAgICAgICAgZmluaXNoKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL21hbmFnZWRwcm92aXNpb25pbmcvS2V5Q2hhaW5UZXN0QWN0aXZpdHkuamF2YSBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9tYW5hZ2VkcHJvdmlzaW9uaW5nL0tleUNoYWluVGVzdEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU5MjYxYwotLS0gL2Rldi9udWxsCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9tYW5hZ2VkcHJvdmlzaW9uaW5nL0tleUNoYWluVGVzdEFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwzMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5tYW5hZ2VkcHJvdmlzaW9uaW5nOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQua2V5c3RvcmUuY3RzLkNlcnRpZmljYXRlVXRpbHMuY3JlYXRlQ2VydGlmaWNhdGU7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5hZG1pbi5EZXZpY2VQb2xpY3lNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNUYXNrOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQuc2VjdXJpdHkuQXR0ZXN0ZWRLZXlQYWlyOworaW1wb3J0IGFuZHJvaWQuc2VjdXJpdHkuS2V5Q2hhaW47CitpbXBvcnQgYW5kcm9pZC5zZWN1cml0eS5LZXlDaGFpbkFsaWFzQ2FsbGJhY2s7CitpbXBvcnQgYW5kcm9pZC5zZWN1cml0eS5LZXlDaGFpbkV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnNlY3VyaXR5LmtleXN0b3JlLktleUdlblBhcmFtZXRlclNwZWM7CitpbXBvcnQgYW5kcm9pZC5zZWN1cml0eS5rZXlzdG9yZS5LZXlQcm9wZXJ0aWVzOworaW1wb3J0IGFuZHJvaWQudGV4dC5tZXRob2QuU2Nyb2xsaW5nTW92ZW1lbnRNZXRob2Q7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CitpbXBvcnQgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLlBhc3NGYWlsQnV0dG9uczsKK2ltcG9ydCBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIuUjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZhdGVLZXk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5TaWduYXR1cmU7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGgueDUwMC5YNTAwUHJpbmNpcGFsOworCisvKioKKyAqIEFjdGl2aXR5IHRvIHRlc3QgS2V5Q2hhaW4ga2V5IGdlbmVyYXRpb24uIFRoZSBmb2xsb3dpbmcgZmxvd3MgYXJlIHRlc3RlZDogKiBHZW5lcmF0aW5nIGEga2V5LiAqCisgKiBJbnN0YWxsaW5nIGEgKHNlbGYtc2lnbmVkKSBjZXJ0aWZpY2F0ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSwgdmlzaWJsZSB0byB1c2Vycy4gKiBTZXR0aW5nCisgKiB2aXNpYmlsaXR5IG9mIHRoZSBjZXJ0aWZpY2F0ZSB0byBub3QgYmUgdmlzaWJsZSB0byB1c2VyLgorICoKKyAqIDxwPkFmdGVyIHRoZSBrZXkgZ2VuZXJhdGlvbiBhbmQgY2VydGlmaWNhdGUgaW5zdGFsbGF0aW9uLCBpdCBzaG91bGQgYmUgcG9zc2libGUgZm9yIGEgdXNlciB0bworICogc2VsZWN0IHRoZSBrZXkgZnJvbSB0aGUgY2VydGlmaWNhdGUgc2VsZWN0aW9uIHByb21wdCB3aGVuIHtAY29kZSBLZXlDaGFpbi5jaG9vc2VQcml2YXRlS2V5QWxpYXN9CisgKiBpcyBjYWxsZWQuIFRoZSB0ZXN0IHRoZW4gdGVzdHMgdGhhdCB0aGUga2V5IGlzIGluZGVlZCB1c2FibGUgZm9yIHNpZ25pbmcuCisgKgorICogPHA+QWZ0ZXIgdGhlIHZpc2liaWxpdHkgaXMgc2V0IHRvIG5vdC11c2VyLXZpc2libGUsIHRoZSBwcm9tcHQgaXMgc2hvd24gYWdhaW4sIHRoaXMgdGltZSB0aGUKKyAqIHRlc3RlcyBpcyBhc2tlZCB0byB2ZXJpZnkgbm8ga2V5cyBhcmUgc2VsZWN0YWJsZSBhbmQgY2FuY2VsIHRoZSBkaWFsb2cuCisgKi8KK3B1YmxpYyBjbGFzcyBLZXlDaGFpblRlc3RBY3Rpdml0eSBleHRlbmRzIFBhc3NGYWlsQnV0dG9ucy5BY3Rpdml0eSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJCeW9kS2V5Q2hhaW5BY3Rpdml0eSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fS0VZQ0hBSU4gPQorICAgICAgICAgICAgImNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5tYW5hZ2VkcHJvdmlzaW9uaW5nLktFWUNIQUlOIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMSUFTID0gImN0cy12ZXJpZmllci1nZW4tcnNhLTEiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9BTEdPUklUSE0gPSAiUlNBIjsKKworICAgIHByaXZhdGUgRGV2aWNlUG9saWN5TWFuYWdlciBtRGV2aWNlUG9saWN5TWFuYWdlcjsKKyAgICBwcml2YXRlIEF0dGVzdGVkS2V5UGFpciBtQXR0ZXN0ZWRLZXlQYWlyOworICAgIHByaXZhdGUgWDUwOUNlcnRpZmljYXRlIG1DZXJ0OworICAgIHByaXZhdGUgVGV4dFZpZXcgbUxvZ1ZpZXc7CisgICAgcHJpdmF0ZSBUZXh0VmlldyBtSW5zdHJ1Y3Rpb25zVmlldzsKKyAgICBwcml2YXRlIEJ1dHRvbiBtU2V0dXBCdXR0b247CisgICAgcHJpdmF0ZSBCdXR0b24gbUdvQnV0dG9uOworCisgICAgLy8gQ2FsbGJhY2sgaW50ZXJmYWNlIGZvciB3aGVuIGEga2V5IGlzIGdlbmVyYXRlZC4KKyAgICBzdGF0aWMgaW50ZXJmYWNlIEtleUdlbmVyYXRpb25MaXN0ZW5lciB7CisgICAgICAgIHZvaWQgb25LZXlQYWlyR2VuZXJhdGVkKEF0dGVzdGVkS2V5UGFpciBrZXlQYWlyKTsKKyAgICB9CisKKyAgICAvLyBUYXNrIGZvciBnZW5lcmF0aW5nIGEga2V5IHBhaXIgdXNpbmcge0Bjb2RlIERldmljZVBvbGljeU1hbmFnZXIuZ2VuZXJhdGVLZXlQYWlyfS4KKyAgICAvLyBUaGUgbGlzdGVuZXIsIGlmIHByb3ZpZGVkLCB3aWxsIGJlIGludm9rZWQgYWZ0ZXIgdGhlIGtleSBoYXMgYmVlbiBnZW5lcmF0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgIGNsYXNzIEdlbmVyYXRlS2V5VGFzayBleHRlbmRzIEFzeW5jVGFzazxLZXlHZW5QYXJhbWV0ZXJTcGVjLCBJbnRlZ2VyLCBBdHRlc3RlZEtleVBhaXI+IHsKKyAgICAgICAgS2V5R2VuZXJhdGlvbkxpc3RlbmVyIG1MaXN0ZW5lcjsKKworICAgICAgICBwdWJsaWMgR2VuZXJhdGVLZXlUYXNrKEtleUdlbmVyYXRpb25MaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIEF0dGVzdGVkS2V5UGFpciBkb0luQmFja2dyb3VuZChLZXlHZW5QYXJhbWV0ZXJTcGVjLi4uIHNwZWNzKSB7CisgICAgICAgICAgICBMb2cuaShUQUcsICJHZW5lcmF0aW5nIGtleSBwYWlyLiIpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBBdHRlc3RlZEtleVBhaXIga3AgPQorICAgICAgICAgICAgICAgICAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuZ2VuZXJhdGVLZXlQYWlyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VBZG1pblRlc3RSZWNlaXZlci5nZXRSZWNlaXZlckNvbXBvbmVudE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZX0FMR09SSVRITSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY3NbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICAgICAgICAgIGlmIChrcCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1Mb2dWaWV3LnNldFRleHQoIktleSBnZW5lcmF0ZWQgc3VjY2Vzc2Z1bGx5LiIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1Mb2dWaWV3LnNldFRleHQoIkZhaWxlZCBnZW5lcmF0aW5nIGtleS4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGtwOworICAgICAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIG1Mb2dWaWV3LnNldFRleHQoIlNlY3VyaXR5IGV4Y2VwdGlvbiB3aGlsZSBnZW5lcmF0aW5nIGtleS4iKTsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJTZWN1cml0eSBleGNlcHRpb24iLCBlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25Qb3N0RXhlY3V0ZShBdHRlc3RlZEtleVBhaXIga3ApIHsKKyAgICAgICAgICAgIHN1cGVyLm9uUG9zdEV4ZWN1dGUoa3ApOworICAgICAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsICYmIGtwICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtTGlzdGVuZXIub25LZXlQYWlyR2VuZXJhdGVkKGtwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEhlbHBlciBmb3IgZ2VuZXJhdGluZyBhbmQgaW5zdGFsbGluZyBhIHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlLgorICAgIGNsYXNzIENlcnRpZmljYXRlSW5zdGFsbGVyIGltcGxlbWVudHMgS2V5R2VuZXJhdGlvbkxpc3RlbmVyIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uS2V5UGFpckdlbmVyYXRlZChBdHRlc3RlZEtleVBhaXIga2V5UGFpcikgeworICAgICAgICAgICAgbUF0dGVzdGVkS2V5UGFpciA9IGtleVBhaXI7CisgICAgICAgICAgICBYNTAwUHJpbmNpcGFsIGlzc3VlciA9IG5ldyBYNTAwUHJpbmNpcGFsKCJDTj1TZWxmU2lnbmVkLCBPPUFuZHJvaWQsIEM9VVMiKTsKKyAgICAgICAgICAgIFg1MDBQcmluY2lwYWwgc3ViamVjdCA9IG5ldyBYNTAwUHJpbmNpcGFsKCJDTj1TdWJqZWN0LCBPPUFuZHJvaWQsIEM9VVMiKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbUNlcnQgPSBjcmVhdGVDZXJ0aWZpY2F0ZShtQXR0ZXN0ZWRLZXlQYWlyLmdldEtleVBhaXIoKSwgc3ViamVjdCwgaXNzdWVyKTsKKyAgICAgICAgICAgICAgICBib29sZWFuIGluc3RhbGxSZXN1bHQgPSBpbnN0YWxsQ2VydGlmaWNhdGUobUNlcnQsIHRydWUpOworICAgICAgICAgICAgICAgIC8vIGNhbGxlZCBmcm9tIG9uUG9zdEV4ZWN1dGUgc28gc2FmZSB0byBpbnRlcmFjdCB3aXRoIHRoZSBVSSBoZXJlLgorICAgICAgICAgICAgICAgIGlmIChpbnN0YWxsUmVzdWx0KSB7CisgICAgICAgICAgICAgICAgICAgIG1Mb2dWaWV3LnNldFRleHQoIlRlc3QgcmVhZHkiKTsKKyAgICAgICAgICAgICAgICAgICAgbUluc3RydWN0aW9uc1ZpZXcuc2V0VGV4dChSLnN0cmluZy5wcm92aXNpb25pbmdfYnlvZF9rZXljaGFpbl9pbmZvX2ZpcnN0X3Rlc3QpOworICAgICAgICAgICAgICAgICAgICBtR29CdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtTG9nVmlldy5zZXRUZXh0KCJGQUlMRUQgY2VydGlmaWNhdGUgaW5zdGFsbGF0aW9uLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIGluc3RhbGxpbmcgY2VydGlmaWNhdGUiLCBlKTsKKyAgICAgICAgICAgICAgICBtTG9nVmlldy5zZXRUZXh0KCJFcnJvciBnZW5lcmF0aW5nIGEgY2VydGlmaWNhdGUuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBIZWxwZXIgZm9yIGNhbGxpbmcge0Bjb2RlIERldmljZVBvbGljeU1hbmFnZXIuc2V0S2V5UGFpckNlcnRpZmljYXRlfSB3aXRoIHRoZSB1c2VyLXZpc2liaWxpdHkKKyAgICAvLyBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yLiBSZXR1cm5zIHRydWUgaWYgdGhlIGNhbGwgd2FzIHN1Y2Nlc3NmdWwgKGFuZCBubyBleGNlcHRpb25zCisgICAgLy8gd2VyZSB0aHJvd24pLgorICAgIHByb3RlY3RlZCBib29sZWFuIGluc3RhbGxDZXJ0aWZpY2F0ZShYNTA5Q2VydGlmaWNhdGUgY2VydCwgYm9vbGVhbiBpc1VzZXJWaXNpYmxlKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbURldmljZVBvbGljeU1hbmFnZXIuc2V0S2V5UGFpckNlcnRpZmljYXRlKAorICAgICAgICAgICAgICAgICAgICBEZXZpY2VBZG1pblRlc3RSZWNlaXZlci5nZXRSZWNlaXZlckNvbXBvbmVudE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgQUxJQVMsCisgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QobmV3IFg1MDlDZXJ0aWZpY2F0ZVtdIHtjZXJ0fSksCisgICAgICAgICAgICAgICAgICAgIGlzVXNlclZpc2libGUpOworICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2dTdGF0dXMoIlNlY3VyaXR5IGV4Y2VwdGlvbiB3aGlsZSBpbnN0YWxsaW5nIGNlcnQuIik7CisgICAgICAgICAgICBMb2cudyhUQUcsICJTZWN1cml0eSBleGNlcHRpb24iLCBlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gSW52b2tlcyBjaG9vc2VQcml2YXRlS2V5QWxpYXMuCisgICAgdm9pZCBzZWxlY3RDZXJ0aWZpY2F0ZShLZXlDaGFpbkFsaWFzQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgU3RyaW5nW10ga2V5VHlwZXMgPSBuZXcgU3RyaW5nW10ge0tFWV9BTEdPUklUSE19OworICAgICAgICBQcmluY2lwYWxbXSBpc3N1ZXJzID0gbmV3IFByaW5jaXBhbFswXTsKKyAgICAgICAgS2V5Q2hhaW4uY2hvb3NlUHJpdmF0ZUtleUFsaWFzKAorICAgICAgICAgICAgICAgIEtleUNoYWluVGVzdEFjdGl2aXR5LnRoaXMsIGNhbGxiYWNrLCBrZXlUeXBlcywgaXNzdWVycywgbnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgY2xhc3MgVGVzdFByZXBhcmF0b3IgaW1wbGVtZW50cyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgbUxvZ1ZpZXcuc2V0VGV4dCgiU3RhcnRpbmcga2V5IGdlbmVyYXRpb24iKTsKKyAgICAgICAgICAgIEtleUdlblBhcmFtZXRlclNwZWMgc3BlYyA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBLZXlHZW5QYXJhbWV0ZXJTcGVjLkJ1aWxkZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTElBUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleVByb3BlcnRpZXMuUFVSUE9TRV9TSUdOIHwgS2V5UHJvcGVydGllcy5QVVJQT1NFX1ZFUklGWSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0S2V5U2l6ZSgyMDQ4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXREaWdlc3RzKEtleVByb3BlcnRpZXMuRElHRVNUX1NIQTI1NikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0U2lnbmF0dXJlUGFkZGluZ3MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlQcm9wZXJ0aWVzLlNJR05BVFVSRV9QQURESU5HX1JTQV9QU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlQcm9wZXJ0aWVzLlNJR05BVFVSRV9QQURESU5HX1JTQV9QS0NTMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgICAgIG5ldyBHZW5lcmF0ZUtleVRhc2sobmV3IENlcnRpZmljYXRlSW5zdGFsbGVyKCkpLmV4ZWN1dGUoc3BlYyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBTZWxlY3RDZXJ0aWZpY2F0ZSBpbXBsZW1lbnRzIFZpZXcuT25DbGlja0xpc3RlbmVyLCBLZXlDaGFpbkFsaWFzQ2FsbGJhY2sgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgIlNlbGVjdGluZyBjZXJ0aWZpY2F0ZSIpOworICAgICAgICAgICAgbUxvZ1ZpZXcuc2V0VGV4dCgiV2FpdGluZyBmb3IgcHJvbXB0Iik7CisgICAgICAgICAgICBzZWxlY3RDZXJ0aWZpY2F0ZSh0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBhbGlhcyhTdHJpbmcgYWxpYXMpIHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgIkdvdCBhbGlhczogIiArIGFsaWFzKTsKKyAgICAgICAgICAgIGlmIChhbGlhcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbG9nU3RhdHVzKCJGQUlMRUQgKG5vIGFsaWFzKSIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIWFsaWFzLmVxdWFscyhBTElBUykpIHsKKyAgICAgICAgICAgICAgICBsb2dTdGF0dXMoIkZBSUxFRCAod3JvbmcgYWxpYXMpIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9nU3RhdHVzKCJHb3QgcmlnaHQgYWxpYXMuIik7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFByaXZhdGVLZXkgcHJpdmF0ZUtleSA9IEtleUNoYWluLmdldFByaXZhdGVLZXkoS2V5Q2hhaW5UZXN0QWN0aXZpdHkudGhpcywgYWxpYXMpOworICAgICAgICAgICAgICAgIGJ5dGVbXSBkYXRhID0gbmV3IFN0cmluZygiaGVsbG8iKS5nZXRCeXRlcygpOworICAgICAgICAgICAgICAgIFNpZ25hdHVyZSBzaWduID0gU2lnbmF0dXJlLmdldEluc3RhbmNlKCJTSEEyNTZ3aXRoUlNBIik7CisgICAgICAgICAgICAgICAgc2lnbi5pbml0U2lnbihwcml2YXRlS2V5KTsKKyAgICAgICAgICAgICAgICBzaWduLnVwZGF0ZShkYXRhKTsKKyAgICAgICAgICAgICAgICBpZiAoc2lnbi5zaWduKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBwcmVwYXJlU2Vjb25kVGVzdCgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGxvZ1N0YXR1cygiRkFJTEVEIChjYW5ub3Qgc2lnbikiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChHZW5lcmFsU2VjdXJpdHlFeGNlcHRpb24gfCBLZXlDaGFpbkV4Y2VwdGlvbiB8IEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdXNpbmcgdGhlIGtleSIsIGUpOworICAgICAgICAgICAgICAgIGxvZ1N0YXR1cygiRkFJTEVEIChrZXkgdW51c2FibGUpIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBTZWxlY3RDZXJ0aWZpY2F0ZUV4cGVjdGluZ05vbmUgaW1wbGVtZW50cyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciwgS2V5Q2hhaW5BbGlhc0NhbGxiYWNrIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICBMb2cuaShUQUcsICJTZWxlY3RpbmcgY2VydGlmaWNhdGUiKTsKKyAgICAgICAgICAgIG1Mb2dWaWV3LnNldFRleHQoIldhaXRpbmcgZm9yIHByb21wdCIpOworICAgICAgICAgICAgc2VsZWN0Q2VydGlmaWNhdGUodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgYWxpYXMoU3RyaW5nIGFsaWFzKSB7CisgICAgICAgICAgICBMb2cuaShUQUcsICJHb3QgYWxpYXM6ICIgKyBhbGlhcyk7CisgICAgICAgICAgICBpZiAoYWxpYXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGxvZ1N0YXR1cygiRkFJTEVEOiBTaG91bGQgaGF2ZSBubyBjZXJ0aWZpY2F0ZS4iKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbG9nU3RhdHVzKCJQQVNTRUQgKDIvMikiKTsKKyAgICAgICAgICAgICAgICBydW5PblVpVGhyZWFkKAorICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFBhc3NCdXR0b24oKS5zZXRFbmFibGVkKHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmtleWNoYWluX3Rlc3QpOworICAgICAgICBzZXRQYXNzRmFpbEJ1dHRvbkNsaWNrTGlzdGVuZXJzKCk7CisgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyID0KKyAgICAgICAgICAgICAgICAoRGV2aWNlUG9saWN5TWFuYWdlcikgZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkRFVklDRV9QT0xJQ1lfU0VSVklDRSk7CisKKyAgICAgICAgbUxvZ1ZpZXcgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLnByb3Zpc2lvbmluZ19ieW9kX2tleWNoYWluX3Rlc3RfbG9nKTsKKyAgICAgICAgbUxvZ1ZpZXcuc2V0TW92ZW1lbnRNZXRob2QobmV3IFNjcm9sbGluZ01vdmVtZW50TWV0aG9kKCkpOworCisgICAgICAgIG1JbnN0cnVjdGlvbnNWaWV3ID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5wcm92aXNpb25pbmdfYnlvZF9rZXljaGFpbl9pbnN0cnVjdGlvbnMpOworCisgICAgICAgIG1TZXR1cEJ1dHRvbiA9IChCdXR0b24pIGZpbmRWaWV3QnlJZChSLmlkLnByZXBhcmVfdGVzdF9idXR0b24pOworICAgICAgICBtU2V0dXBCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG5ldyBUZXN0UHJlcGFyYXRvcigpKTsKKworICAgICAgICBtR29CdXR0b24gPSAoQnV0dG9uKSBmaW5kVmlld0J5SWQoUi5pZC5ydW5fdGVzdF9idXR0b24pOworICAgICAgICBtR29CdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG5ldyBTZWxlY3RDZXJ0aWZpY2F0ZSgpKTsKKyAgICAgICAgbUdvQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOworCisgICAgICAgIC8vIERpc2FibGUgdGhlIHBhc3MgYnV0dG9uIGhlcmUsIG9ubHkgZW5hYmxlIGl0IHdoZW4gdGhlIDJuZCB0ZXN0IHBhc3Nlcy4KKyAgICAgICAgZ2V0UGFzc0J1dHRvbigpLnNldEVuYWJsZWQoZmFsc2UpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHByZXBhcmVTZWNvbmRUZXN0KCkgeworICAgICAgICBSdW5uYWJsZSB1aUNoYW5nZXM7CisgICAgICAgIGlmIChpbnN0YWxsQ2VydGlmaWNhdGUobUNlcnQsIGZhbHNlKSkgeworICAgICAgICAgICAgdWlDaGFuZ2VzID0KKyAgICAgICAgICAgICAgICAgICAgKCkgLT4geworICAgICAgICAgICAgICAgICAgICAgICAgbUxvZ1ZpZXcuc2V0VGV4dCgiU2Vjb25kIHRlc3QgcmVhZHkuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBtSW5zdHJ1Y3Rpb25zVmlldy5zZXRUZXh0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5wcm92aXNpb25pbmdfYnlvZF9rZXljaGFpbl9pbmZvX3NlY29uZF90ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Hb0J1dHRvbi5zZXRUZXh0KCJSdW4gMm5kIHRlc3QiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Hb0J1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFNlbGVjdENlcnRpZmljYXRlRXhwZWN0aW5nTm9uZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVpQ2hhbmdlcyA9CisgICAgICAgICAgICAgICAgICAgICgpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2dWaWV3LnNldFRleHQoIkZBSUxFRCBzZWNvbmQgdGVzdCBzZXR1cC4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Hb0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgfQorCisgICAgICAgIHJ1bk9uVWlUaHJlYWQodWlDaGFuZ2VzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmaW5pc2goKSB7CisgICAgICAgIHN1cGVyLmZpbmlzaCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIucmVtb3ZlS2V5UGFpcigKKyAgICAgICAgICAgICAgICAgICAgRGV2aWNlQWRtaW5UZXN0UmVjZWl2ZXIuZ2V0UmVjZWl2ZXJDb21wb25lbnROYW1lKCksIEFMSUFTKTsKKyAgICAgICAgICAgIExvZy5pKFRBRywgIkRlbGV0ZWQgYWxpYXMgIiArIEFMSUFTKTsKKyAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIGRlbGV0aW5nIGFsaWFzIiwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbG9nU3RhdHVzKFN0cmluZyBzdGF0dXMpIHsKKyAgICAgICAgcnVuT25VaVRocmVhZCgKKyAgICAgICAgICAgICAgICAoKSAtPiB7CisgICAgICAgICAgICAgICAgICAgIG1Mb2dWaWV3LnNldFRleHQoc3RhdHVzKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbWFuYWdlZHByb3Zpc2lvbmluZy9LZXlndWFyZERpc2FibGVkRmVhdHVyZXNBY3Rpdml0eS5qYXZhIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL21hbmFnZWRwcm92aXNpb25pbmcvS2V5Z3VhcmREaXNhYmxlZEZlYXR1cmVzQWN0aXZpdHkuamF2YQppbmRleCAzMWE4NzkxLi42NjM3NTA5IDEwMDY0NAotLS0gYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbWFuYWdlZHByb3Zpc2lvbmluZy9LZXlndWFyZERpc2FibGVkRmVhdHVyZXNBY3Rpdml0eS5qYXZhCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9tYW5hZ2VkcHJvdmlzaW9uaW5nL0tleWd1YXJkRGlzYWJsZWRGZWF0dXJlc0FjdGl2aXR5LmphdmEKQEAgLTExMCwxMiArMTEwLDE0IEBACiAgICAgfQogCiAgICAgcHJvdGVjdGVkIHZvaWQgc2V0dXBEaXNhYmxlVW5yZWRhY3RlZFdvcmtOb3RpZmljYXRpb24oQXJyYXlUZXN0TGlzdEFkYXB0ZXIgYWRhcHRlcikgewotICAgICAgICBhZGFwdGVyLmFkZChuZXcgRGlhbG9nVGVzdExpc3RJdGVtV2l0aEljb24odGhpcywKLSAgICAgICAgICAgICAgICBSLnN0cmluZy5wcm92aXNpb25pbmdfYnlvZF9kaXNhYmxlX3VucmVkYWN0ZWRfbm90aWZpY2F0aW9ucywKLSAgICAgICAgICAgICAgICBnZXRUZXN0SWRQcmVmaXgoKSArICJEaXNhYmxlVW5yZWRhY3RlZE5vdGlmaWNhdGlvbnMiLAotICAgICAgICAgICAgICAgIFIuc3RyaW5nLnByb3Zpc2lvbmluZ19ieW9kX2Rpc2FibGVfdW5yZWRhY3RlZF9ub3RpZmljYXRpb25zX2luc3RydWN0aW9uLAotICAgICAgICAgICAgICAgIG5ldyBJbnRlbnQoQnlvZEhlbHBlckFjdGl2aXR5LkFDVElPTl9OT1RJRklDQVRJT05fT05fTE9DS1NDUkVFTiksCi0gICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5pY19jb3JwX2ljb24pKTsKKyAgICAgICAgaWYoIWdldFBhY2thZ2VNYW5hZ2VyKCkuaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX0FVVE9NT1RJVkUpKSB7CisgICAgICAgICAgICBhZGFwdGVyLmFkZChuZXcgRGlhbG9nVGVzdExpc3RJdGVtV2l0aEljb24odGhpcywKKyAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcucHJvdmlzaW9uaW5nX2J5b2RfZGlzYWJsZV91bnJlZGFjdGVkX25vdGlmaWNhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgIGdldFRlc3RJZFByZWZpeCgpICsgIkRpc2FibGVVbnJlZGFjdGVkTm90aWZpY2F0aW9ucyIsCisgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLnByb3Zpc2lvbmluZ19ieW9kX2Rpc2FibGVfdW5yZWRhY3RlZF9ub3RpZmljYXRpb25zX2luc3RydWN0aW9uLAorICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZW50KEJ5b2RIZWxwZXJBY3Rpdml0eS5BQ1RJT05fTk9USUZJQ0FUSU9OX09OX0xPQ0tTQ1JFRU4pLAorICAgICAgICAgICAgICAgICAgICBSLmRyYXdhYmxlLmljX2NvcnBfaWNvbikpOworICAgICAgICB9CiAgICAgfQogCiAgICAgcHJvdGVjdGVkIHZvaWQgc2V0dXBGaW5nZXJwcmludFRlc3RzKEFycmF5VGVzdExpc3RBZGFwdGVyIGFkYXB0ZXIpIHsKZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9tYW5hZ2VkcHJvdmlzaW9uaW5nL0xvY2tUYXNrVWlUZXN0QWN0aXZpdHkuamF2YSBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9tYW5hZ2VkcHJvdmlzaW9uaW5nL0xvY2tUYXNrVWlUZXN0QWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjYxMmY3Ci0tLSAvZGV2L251bGwKKysrIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL21hbmFnZWRwcm92aXNpb25pbmcvTG9ja1Rhc2tVaVRlc3RBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMzY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIubWFuYWdlZHByb3Zpc2lvbmluZzsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5hZG1pbi5EZXZpY2VQb2xpY3lNYW5hZ2VyLkxPQ0tfVEFTS19GRUFUVVJFX0dMT0JBTF9BQ1RJT05TOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5hZG1pbi5EZXZpY2VQb2xpY3lNYW5hZ2VyLkxPQ0tfVEFTS19GRUFUVVJFX0hPTUU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLmFkbWluLkRldmljZVBvbGljeU1hbmFnZXIuTE9DS19UQVNLX0ZFQVRVUkVfS0VZR1VBUkQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLmFkbWluLkRldmljZVBvbGljeU1hbmFnZXIuTE9DS19UQVNLX0ZFQVRVUkVfTk9ORTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuYWRtaW4uRGV2aWNlUG9saWN5TWFuYWdlci5MT0NLX1RBU0tfRkVBVFVSRV9OT1RJRklDQVRJT05TOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5hZG1pbi5EZXZpY2VQb2xpY3lNYW5hZ2VyLkxPQ0tfVEFTS19GRUFUVVJFX09WRVJWSUVXOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5hZG1pbi5EZXZpY2VQb2xpY3lNYW5hZ2VyLkxPQ0tfVEFTS19GRUFUVVJFX1NZU1RFTV9JTkZPOworCitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5tYW5hZ2VkcHJvdmlzaW9uaW5nLlV0aWxzLmNyZWF0ZUludGVyYWN0aXZlVGVzdEl0ZW07CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uOworaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbkNoYW5uZWw7CitpbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5hZG1pbi5EZXZpY2VQb2xpY3lNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YVNldE9ic2VydmVyOworaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNUYXNrOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWR4LmxvY2FsYnJvYWRjYXN0bWFuYWdlci5jb250ZW50LkxvY2FsQnJvYWRjYXN0TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5Ub2FzdDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5BcnJheVRlc3RMaXN0QWRhcHRlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIuSW50ZW50RHJpdmVuVGVzdEFjdGl2aXR5LkJ1dHRvbkluZm87CitpbXBvcnQgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLlBhc3NGYWlsQnV0dG9uczsKK2ltcG9ydCBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIuUjsKK2ltcG9ydCBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIuVGVzdExpc3RBZGFwdGVyLlRlc3RMaXN0SXRlbTsKK2ltcG9ydCBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIuVGVzdFJlc3VsdDsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCisvKioKKyAqIFRlc3RzIGZvciB7QGxpbmsgRGV2aWNlUG9saWN5TWFuYWdlciNzZXRMb2NrVGFza0ZlYXR1cmVzKENvbXBvbmVudE5hbWUsIGludCl9LgorICovCitwdWJsaWMgY2xhc3MgTG9ja1Rhc2tVaVRlc3RBY3Rpdml0eSBleHRlbmRzIFBhc3NGYWlsQnV0dG9ucy5UZXN0TGlzdEFjdGl2aXR5IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBMb2NrVGFza1VpVGVzdEFjdGl2aXR5LmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1RFU1RfSUQgPQorICAgICAgICAgICAgImNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5tYW5hZ2VkcHJvdmlzaW9uaW5nLmV4dHJhLlRFU1RfSUQiOworCisgICAgLyoqIEJyb2FkY2FzdCBhY3Rpb24gc2VudCBieSB7QGxpbmsgRGV2aWNlQWRtaW5UZXN0UmVjZWl2ZXJ9IHdoZW4gTG9ja1Rhc2sgc3RhcnRzLiAqLworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0xPQ0tfVEFTS19TVEFSVEVEID0KKyAgICAgICAgICAgICJjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIubWFuYWdlZHByb3Zpc2lvbmluZy5hY3Rpb24uTE9DS19UQVNLX1NUQVJURUQiOworICAgIC8qKiBCcm9hZGNhc3QgYWN0aW9uIHNlbnQgYnkge0BsaW5rIERldmljZUFkbWluVGVzdFJlY2VpdmVyfSB3aGVuIExvY2tUYXNrIHN0b3BzLiAqLworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0xPQ0tfVEFTS19TVE9QUEVEID0KKyAgICAgICAgICAgICJjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIubWFuYWdlZHByb3Zpc2lvbmluZy5hY3Rpb24uTE9DS19UQVNLX1NUT1BQRUQiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tcG9uZW50TmFtZSBBRE1JTl9SRUNFSVZFUiA9CisgICAgICAgICAgICBEZXZpY2VBZG1pblRlc3RSZWNlaXZlci5nZXRSZWNlaXZlckNvbXBvbmVudE5hbWUoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9QQUNLQUdFX05BTUUgPSAiY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1NUT1BfTE9DS19UQVNLID0KKyAgICAgICAgICAgICJjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIubWFuYWdlZHByb3Zpc2lvbmluZy5hY3Rpb24uU1RPUF9MT0NLX1RBU0siOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfSURfREVGQVVMVCA9ICJsb2NrLXRhc2stdWktZGVmYXVsdCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfSURfU1lTVEVNX0lORk8gPSAibG9jay10YXNrLXVpLXN5c3RlbS1pbmZvIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9JRF9OT1RJRklDQVRJT05TID0gImxvY2stdGFzay11aS1ub3RpZmljYXRpb25zIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9JRF9IT01FID0gImxvY2stdGFzay11aS1ob21lIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9JRF9SRUNFTlRTID0gImxvY2stdGFzay11aS1yZWNlbnRzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9JRF9HTE9CQUxfQUNUSU9OUyA9ICJsb2NrLXRhc2stdWktZ2xvYmFsLWFjdGlvbnMiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0lEX0tFWUdVQVJEID0gImxvY2stdGFzay11aS1rZXlndWFyZCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfSURfU1RPUF9MT0NLX1RBU0sgPSAibG9jay10YXNrLXVpLXN0b3AtbG9jay10YXNrIjsKKworICAgIHByaXZhdGUgRGV2aWNlUG9saWN5TWFuYWdlciBtRHBtOworICAgIHByaXZhdGUgQWN0aXZpdHlNYW5hZ2VyIG1BbTsKKyAgICBwcml2YXRlIE5vdGlmaWNhdGlvbk1hbmFnZXIgbU5vdGlmeU1ncjsKKworICAgIHByaXZhdGUgTG9ja1Rhc2tTdGF0ZUNoYW5nZWRSZWNlaXZlciBtU3RhdGVDaGFuZ2VkUmVjZWl2ZXI7CisgICAgcHJpdmF0ZSBDb3VudERvd25MYXRjaCBtTG9ja1Rhc2tTdGFydGVkTGF0Y2g7CisgICAgcHJpdmF0ZSBDb3VudERvd25MYXRjaCBtTG9ja1Rhc2tTdG9wcGVkTGF0Y2g7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmRldmljZV9vd25lcl9sb2NrX3Rhc2tfdWkpOworICAgICAgICBzZXRQYXNzRmFpbEJ1dHRvbkNsaWNrTGlzdGVuZXJzKCk7CisKKyAgICAgICAgbURwbSA9IGdldFN5c3RlbVNlcnZpY2UoRGV2aWNlUG9saWN5TWFuYWdlci5jbGFzcyk7CisgICAgICAgIG1BbSA9IGdldFN5c3RlbVNlcnZpY2UoQWN0aXZpdHlNYW5hZ2VyLmNsYXNzKTsKKyAgICAgICAgbU5vdGlmeU1nciA9IGdldFN5c3RlbVNlcnZpY2UoTm90aWZpY2F0aW9uTWFuYWdlci5jbGFzcyk7CisKKyAgICAgICAgZmluYWwgQXJyYXlUZXN0TGlzdEFkYXB0ZXIgYWRhcHRlciA9IG5ldyBBcnJheVRlc3RMaXN0QWRhcHRlcih0aGlzKTsKKyAgICAgICAgYWRkVGVzdHNUb0FkYXB0ZXIoYWRhcHRlcik7CisgICAgICAgIGFkYXB0ZXIucmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIobmV3IERhdGFTZXRPYnNlcnZlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25DaGFuZ2VkKCkgeworICAgICAgICAgICAgICAgIHVwZGF0ZVBhc3NCdXR0b24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIHNldFRlc3RMaXN0QWRhcHRlcihhZGFwdGVyKTsKKworICAgICAgICBCdXR0b24gc3RhcnRMb2NrVGFza0J1dHRvbiA9IGZpbmRWaWV3QnlJZChSLmlkLnN0YXJ0X2xvY2tfdGFza19idXR0b24pOworICAgICAgICBzdGFydExvY2tUYXNrQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcigodmlldykgLT4gc3RhcnRMb2NrVGFza01vZGUoKSk7CisKKyAgICAgICAgaWYgKEFDVElPTl9TVE9QX0xPQ0tfVEFTSy5lcXVhbHMoZ2V0SW50ZW50KCkuZ2V0QWN0aW9uKCkpKSB7CisgICAgICAgICAgICAvLyBUaGlzIG1lYW5zIHdlJ3JlIHN0YXJ0ZWQgYnkgdGhlICJzdG9wIExvY2tUYXNrIG1vZGUiIHRlc3QgYWN0aXZpdHkgKHRoZSBsYXN0IG9uZSBpbgorICAgICAgICAgICAgLy8gdGhlIGxpc3QpIGluIG9yZGVyIHRvIHN0b3AgTG9ja1Rhc2suCisgICAgICAgICAgICBzdG9wTG9ja1Rhc2tNb2RlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWRkVGVzdHNUb0FkYXB0ZXIoZmluYWwgQXJyYXlUZXN0TGlzdEFkYXB0ZXIgYWRhcHRlcikgeworICAgICAgICBpZiAoIWdldFBhY2thZ2VNYW5hZ2VyKCkuaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX0FVVE9NT1RJVkUpKSB7CisgICAgICAgICAgICBhZGFwdGVyLmFkZChjcmVhdGVTZXRMb2NrVGFza0ZlYXR1cmVzVGVzdCgKKyAgICAgICAgICAgICAgICAgICAgVEVTVF9JRF9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICBMT0NLX1RBU0tfRkVBVFVSRV9OT05FLAorICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5kZXZpY2Vfb3duZXJfbG9ja190YXNrX3VpX2RlZmF1bHRfdGVzdCwKKyAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuZGV2aWNlX293bmVyX2xvY2tfdGFza191aV9kZWZhdWx0X3Rlc3RfaW5mbykpOworCisgICAgICAgICAgICBhZGFwdGVyLmFkZChjcmVhdGVTZXRMb2NrVGFza0ZlYXR1cmVzVGVzdCgKKyAgICAgICAgICAgICAgICAgICAgVEVTVF9JRF9TWVNURU1fSU5GTywKKyAgICAgICAgICAgICAgICAgICAgTE9DS19UQVNLX0ZFQVRVUkVfU1lTVEVNX0lORk8sCisgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmRldmljZV9vd25lcl9sb2NrX3Rhc2tfdWlfc3lzdGVtX2luZm9fdGVzdCwKKyAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuZGV2aWNlX293bmVyX2xvY2tfdGFza191aV9zeXN0ZW1faW5mb190ZXN0X2luZm8pKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghZ2V0UGFja2FnZU1hbmFnZXIoKS5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfQVVUT01PVElWRSkpIHsKKyAgICAgICAgICAgIGFkYXB0ZXIuYWRkKGNyZWF0ZVNldExvY2tUYXNrRmVhdHVyZXNUZXN0KAorICAgICAgICAgICAgICAgICAgICBURVNUX0lEX05PVElGSUNBVElPTlMsCisgICAgICAgICAgICAgICAgICAgIExPQ0tfVEFTS19GRUFUVVJFX0hPTUUgfCBMT0NLX1RBU0tfRkVBVFVSRV9OT1RJRklDQVRJT05TLAorICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5kZXZpY2Vfb3duZXJfbG9ja190YXNrX3VpX25vdGlmaWNhdGlvbnNfdGVzdCwKKyAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuZGV2aWNlX293bmVyX2xvY2tfdGFza191aV9ub3RpZmljYXRpb25zX3Rlc3RfaW5mbykpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFnZXRQYWNrYWdlTWFuYWdlcigpLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9BVVRPTU9USVZFKSkgeworICAgICAgICAgICAgYWRhcHRlci5hZGQoY3JlYXRlU2V0TG9ja1Rhc2tGZWF0dXJlc1Rlc3QoCisgICAgICAgICAgICAgICAgICAgIFRFU1RfSURfSE9NRSwKKyAgICAgICAgICAgICAgICAgICAgTE9DS19UQVNLX0ZFQVRVUkVfSE9NRSwKKyAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuZGV2aWNlX293bmVyX2xvY2tfdGFza191aV9ob21lX3Rlc3QsCisgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmRldmljZV9vd25lcl9sb2NrX3Rhc2tfdWlfaG9tZV90ZXN0X2luZm8pKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghZ2V0UGFja2FnZU1hbmFnZXIoKS5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfQVVUT01PVElWRSkpIHsKKyAgICAgICAgICAgIGFkYXB0ZXIuYWRkKGNyZWF0ZVNldExvY2tUYXNrRmVhdHVyZXNUZXN0KAorICAgICAgICAgICAgICAgICAgICBURVNUX0lEX1JFQ0VOVFMsCisgICAgICAgICAgICAgICAgICAgIExPQ0tfVEFTS19GRUFUVVJFX0hPTUUgfCBMT0NLX1RBU0tfRkVBVFVSRV9PVkVSVklFVywKKyAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuZGV2aWNlX293bmVyX2xvY2tfdGFza191aV9yZWNlbnRzX3Rlc3QsCisgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmRldmljZV9vd25lcl9sb2NrX3Rhc2tfdWlfcmVjZW50c190ZXN0X2luZm8pKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghZ2V0UGFja2FnZU1hbmFnZXIoKS5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfQVVUT01PVElWRSkpIHsKKyAgICAgICAgICAgIGFkYXB0ZXIuYWRkKGNyZWF0ZVNldExvY2tUYXNrRmVhdHVyZXNUZXN0KAorICAgICAgICAgICAgICAgICAgICBURVNUX0lEX0dMT0JBTF9BQ1RJT05TLAorICAgICAgICAgICAgICAgICAgICBMT0NLX1RBU0tfRkVBVFVSRV9HTE9CQUxfQUNUSU9OUywKKyAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuZGV2aWNlX293bmVyX2xvY2tfdGFza191aV9nbG9iYWxfYWN0aW9uc190ZXN0LAorICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5kZXZpY2Vfb3duZXJfbG9ja190YXNrX3VpX2dsb2JhbF9hY3Rpb25zX3Rlc3RfaW5mbykpOworCisgICAgICAgICAgICBhZGFwdGVyLmFkZChjcmVhdGVTZXRMb2NrVGFza0ZlYXR1cmVzVGVzdCgKKyAgICAgICAgICAgICAgICAgICAgVEVTVF9JRF9LRVlHVUFSRCwKKyAgICAgICAgICAgICAgICAgICAgTE9DS19UQVNLX0ZFQVRVUkVfS0VZR1VBUkQsCisgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmRldmljZV9vd25lcl9sb2NrX3Rhc2tfdWlfa2V5Z3VhcmRfdGVzdCwKKyAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuZGV2aWNlX293bmVyX2xvY2tfdGFza191aV9rZXlndWFyZF90ZXN0X2luZm8pKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIEludGVudCBzdG9wTG9ja1Rhc2tJbnRlbnQgPSBuZXcgSW50ZW50KHRoaXMsIExvY2tUYXNrVWlUZXN0QWN0aXZpdHkuY2xhc3MpOworICAgICAgICBzdG9wTG9ja1Rhc2tJbnRlbnQuc2V0QWN0aW9uKEFDVElPTl9TVE9QX0xPQ0tfVEFTSyk7CisgICAgICAgIGFkYXB0ZXIuYWRkKGNyZWF0ZUludGVyYWN0aXZlVGVzdEl0ZW0odGhpcywKKyAgICAgICAgICAgICAgICBURVNUX0lEX1NUT1BfTE9DS19UQVNLLAorICAgICAgICAgICAgICAgIFIuc3RyaW5nLmRldmljZV9vd25lcl9sb2NrX3Rhc2tfdWlfc3RvcF9sb2NrX3Rhc2tfdGVzdCwKKyAgICAgICAgICAgICAgICBSLnN0cmluZy5kZXZpY2Vfb3duZXJfbG9ja190YXNrX3VpX3N0b3BfbG9ja190YXNrX3Rlc3RfaW5mbywKKyAgICAgICAgICAgICAgICBuZXcgQnV0dG9uSW5mbygKKyAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmRldmljZV9vd25lcl9sb2NrX3Rhc2tfdWlfc3RvcF9sb2NrX3Rhc2tfdGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BMb2NrVGFza0ludGVudAorICAgICAgICAgICAgICAgICkpKTsKKyAgICB9CisKKyAgICAvKiogUmVjZWl2ZXMgTG9ja1Rhc2sgc3RhcnQvc3RvcCBjYWxsYmFja3MgZm9yd2FyZGVkIGJ5IHtAbGluayBEZXZpY2VBZG1pblRlc3RSZWNlaXZlcn0uICovCisgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBMb2NrVGFza1N0YXRlQ2hhbmdlZFJlY2VpdmVyIGV4dGVuZHMgQnJvYWRjYXN0UmVjZWl2ZXIgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgU3RyaW5nIGFjdGlvbiA9IGludGVudC5nZXRBY3Rpb24oKTsKKyAgICAgICAgICAgIHN3aXRjaCAoYWN0aW9uKSB7CisgICAgICAgICAgICAgICAgY2FzZSBBQ1RJT05fTE9DS19UQVNLX1NUQVJURUQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChtTG9ja1Rhc2tTdGFydGVkTGF0Y2ggIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2tUYXNrU3RhcnRlZExhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQUNUSU9OX0xPQ0tfVEFTS19TVE9QUEVEOgorICAgICAgICAgICAgICAgICAgICBpZiAobUxvY2tUYXNrU3RvcHBlZExhdGNoICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrVGFza1N0b3BwZWRMYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgeworICAgICAgICBzdXBlci5vblJlc3VtZSgpOworICAgICAgICBtU3RhdGVDaGFuZ2VkUmVjZWl2ZXIgPSBuZXcgTG9ja1Rhc2tTdGF0ZUNoYW5nZWRSZWNlaXZlcigpOworICAgICAgICBmaW5hbCBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEludGVudEZpbHRlcigpOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEFDVElPTl9MT0NLX1RBU0tfU1RBUlRFRCk7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oQUNUSU9OX0xPQ0tfVEFTS19TVE9QUEVEKTsKKyAgICAgICAgTG9jYWxCcm9hZGNhc3RNYW5hZ2VyLmdldEluc3RhbmNlKHRoaXMpLnJlZ2lzdGVyUmVjZWl2ZXIobVN0YXRlQ2hhbmdlZFJlY2VpdmVyLCBmaWx0ZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUGF1c2UoKSB7CisgICAgICAgIGlmIChtU3RhdGVDaGFuZ2VkUmVjZWl2ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgTG9jYWxCcm9hZGNhc3RNYW5hZ2VyLmdldEluc3RhbmNlKHRoaXMpLnVucmVnaXN0ZXJSZWNlaXZlcihtU3RhdGVDaGFuZ2VkUmVjZWl2ZXIpOworICAgICAgICAgICAgbVN0YXRlQ2hhbmdlZFJlY2VpdmVyID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBzdXBlci5vblBhdXNlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnRzIExvY2tUYXNrIG1vZGUgYW5kIHdhaXRzIGZvciBjYWxsYmFjayBmcm9tIHtAbGluayBEZXZpY2VBZG1pblRlc3RSZWNlaXZlcn0gdG8gY29uZmlybQorICAgICAqIExvY2tUYXNrIGhhcyBzdGFydGVkIHN1Y2Nlc3NmdWxseS4gSWYgdGhlIGNhbGxiYWNrIGlzbid0IHJlY2VpdmVkLCB0aGUgZW50aXJlIHRlc3Qgd2lsbCBiZQorICAgICAqIG1hcmtlZCBhcyBmYWlsZWQuCisgICAgICoKKyAgICAgKiBAc2VlIExvY2tUYXNrU3RhdGVDaGFuZ2VkUmVjZWl2ZXIKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc3RhcnRMb2NrVGFza01vZGUoKSB7CisgICAgICAgIGlmIChtQW0uZ2V0TG9ja1Rhc2tNb2RlU3RhdGUoKSA9PSBBY3Rpdml0eU1hbmFnZXIuTE9DS19UQVNLX01PREVfTE9DS0VEKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBtTG9ja1Rhc2tTdGFydGVkTGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtRHBtLnNldExvY2tUYXNrUGFja2FnZXMoQURNSU5fUkVDRUlWRVIsIG5ldyBTdHJpbmdbXSB7VEVTVF9QQUNLQUdFX05BTUV9KTsKKyAgICAgICAgICAgIG1EcG0uc2V0TG9ja1Rhc2tGZWF0dXJlcyhBRE1JTl9SRUNFSVZFUiwgTE9DS19UQVNLX0ZFQVRVUkVfTk9ORSk7CisgICAgICAgICAgICBzdGFydExvY2tUYXNrKCk7CisKKyAgICAgICAgICAgIG5ldyBDaGVja0xvY2tUYXNrU3RhdGVUYXNrKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uUG9zdEV4ZWN1dGUoQm9vbGVhbiBzdWNjZXNzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpc3N1ZVRlc3ROb3RpZmljYXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUZhaWx1cmUoZ2V0VGVzdElkKCksICJGYWlsZWQgdG8gc3RhcnQgTG9ja1Rhc2sgbW9kZSIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfS5leGVjdXRlKG1Mb2NrVGFza1N0YXJ0ZWRMYXRjaCk7CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICAgICAgVG9hc3QubWFrZVRleHQodGhpcywgIkZhaWxlZCB0byBydW4gdGVzdC4gRGlkIHlvdSBzZXQgdXAgZGV2aWNlIG93bmVyIGNvcnJlY3RseT8iLAorICAgICAgICAgICAgICAgICAgICBUb2FzdC5MRU5HVEhfU0hPUlQpLnNob3coKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFN0b3BzIExvY2tUYXNrIG1vZGUgYW5kIHdhaXRzIGZvciBjYWxsYmFjayBmcm9tIHtAbGluayBEZXZpY2VBZG1pblRlc3RSZWNlaXZlcn0gdG8gY29uZmlybQorICAgICAqIExvY2tUYXNrIGhhcyBzdG9wcGVkIHN1Y2Nlc3NmdWxseS4gSWYgdGhlIGNhbGxiYWNrIGlzbid0IHJlY2VpdmVkLCB0aGUgIlN0b3AgTG9ja1Rhc2sgbW9kZSIKKyAgICAgKiB0ZXN0IGNhc2Ugd2lsbCBiZSBtYXJrZWQgYXMgZmFpbGVkLgorICAgICAqCisgICAgICogTm90ZSB0aGF0IHdlIHtAbGluayAjZmluaXNoKCl9IHRoaXMgYWN0aXZpdHkgaGVyZSwgc2luY2UgaXQncyBzdGFydGVkIGJ5IHRoZSAiU3RvcCBMb2NrVGFzaworICAgICAqIG1vZGUiIHRlc3QgYWN0aXZpdHksIGFuZCBzaG91bGRuJ3QgYmUgZXhwb3NlZCB0byB0aGUgdGVzdGVyIG9uY2UgaXRzIGpvYiBpcyBkb25lLgorICAgICAqCisgICAgICogQHNlZSBMb2NrVGFza1N0YXRlQ2hhbmdlZFJlY2VpdmVyCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHN0b3BMb2NrVGFza01vZGUoKSB7CisgICAgICAgIGlmIChtQW0uZ2V0TG9ja1Rhc2tNb2RlU3RhdGUoKSA9PSBBY3Rpdml0eU1hbmFnZXIuTE9DS19UQVNLX01PREVfTk9ORSkgeworICAgICAgICAgICAgZmluaXNoKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBtTG9ja1Rhc2tTdG9wcGVkTGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdG9wTG9ja1Rhc2soKTsKKworICAgICAgICAgICAgbmV3IENoZWNrTG9ja1Rhc2tTdGF0ZVRhc2soKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25Qb3N0RXhlY3V0ZShCb29sZWFuIHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzdWNjZXNzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlGYWlsdXJlKFRFU1RfSURfU1RPUF9MT0NLX1RBU0ssICJGYWlsZWQgdG8gc3RvcCBMb2NrVGFzayBtb2RlIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2FuY2VsVGVzdE5vdGlmaWNhdGlvbigpOworICAgICAgICAgICAgICAgICAgICBtRHBtLnNldExvY2tUYXNrRmVhdHVyZXMoQURNSU5fUkVDRUlWRVIsIExPQ0tfVEFTS19GRUFUVVJFX05PTkUpOworICAgICAgICAgICAgICAgICAgICBtRHBtLnNldExvY2tUYXNrUGFja2FnZXMoQURNSU5fUkVDRUlWRVIsIG5ldyBTdHJpbmdbXSB7fSk7CisgICAgICAgICAgICAgICAgICAgIExvY2tUYXNrVWlUZXN0QWN0aXZpdHkudGhpcy5maW5pc2goKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LmV4ZWN1dGUobUxvY2tUYXNrU3RvcHBlZExhdGNoKTsKKyAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgICAgICBUb2FzdC5tYWtlVGV4dCh0aGlzLCAiRmFpbGVkIHRvIGZpbmlzaCB0ZXN0LiBEaWQgeW91IHNldCB1cCBkZXZpY2Ugb3duZXIgY29ycmVjdGx5PyIsCisgICAgICAgICAgICAgICAgICAgIFRvYXN0LkxFTkdUSF9TSE9SVCkuc2hvdygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBhYnN0cmFjdCBjbGFzcyBDaGVja0xvY2tUYXNrU3RhdGVUYXNrIGV4dGVuZHMgQXN5bmNUYXNrPENvdW50RG93bkxhdGNoLCBWb2lkLCBCb29sZWFuPiB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQm9vbGVhbiBkb0luQmFja2dyb3VuZChDb3VudERvd25MYXRjaC4uLiBsYXRjaGVzKSB7CisgICAgICAgICAgICBpZiAobGF0Y2hlcy5sZW5ndGggPiAwICYmIGxhdGNoZXNbMF0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsYXRjaGVzWzBdLmF3YWl0KDEsIFRpbWVVbml0LlNFQ09ORFMpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRmFsbCB0aHJvdWdoCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIG9uUG9zdEV4ZWN1dGUoQm9vbGVhbiBzdWNjZXNzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbm90aWZ5RmFpbHVyZShTdHJpbmcgdGVzdElkLCBTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICBMb2cuZShUQUcsIG1lc3NhZ2UpOworICAgICAgICBUb2FzdC5tYWtlVGV4dCh0aGlzLCBtZXNzYWdlLCBUb2FzdC5MRU5HVEhfU0hPUlQpLnNob3coKTsKKyAgICAgICAgVGVzdFJlc3VsdC5zZXRGYWlsZWRSZXN1bHQodGhpcywgdGVzdElkLCBtZXNzYWdlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaXNzdWVUZXN0Tm90aWZpY2F0aW9uKCkgeworICAgICAgICBTdHJpbmcgY2hhbm5lbElkID0gZ2V0VGVzdElkKCk7CisgICAgICAgIGlmIChtTm90aWZ5TWdyLmdldE5vdGlmaWNhdGlvbkNoYW5uZWwoY2hhbm5lbElkKSA9PSBudWxsKSB7CisgICAgICAgICAgICBOb3RpZmljYXRpb25DaGFubmVsIGNoYW5uZWwgPSBuZXcgTm90aWZpY2F0aW9uQ2hhbm5lbCgKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbElkLCBnZXRUZXN0SWQoKSwgTm90aWZpY2F0aW9uTWFuYWdlci5JTVBPUlRBTkNFX0hJR0gpOworICAgICAgICAgICAgbU5vdGlmeU1nci5jcmVhdGVOb3RpZmljYXRpb25DaGFubmVsKGNoYW5uZWwpOworICAgICAgICB9CisKKyAgICAgICAgTm90aWZpY2F0aW9uIG5vdGUgPSBuZXcgTm90aWZpY2F0aW9uLkJ1aWxkZXIodGhpcywgY2hhbm5lbElkKQorICAgICAgICAgICAgICAgIC5zZXRDb250ZW50VGl0bGUoZ2V0U3RyaW5nKFIuc3RyaW5nLmRldmljZV9vd25lcl9sb2NrX3Rhc2tfdWlfdGVzdCkpCisgICAgICAgICAgICAgICAgLnNldFNtYWxsSWNvbihhbmRyb2lkLlIuZHJhd2FibGUuc3ltX2RlZl9hcHBfaWNvbikKKyAgICAgICAgICAgICAgICAuc2V0T25nb2luZyh0cnVlKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworCisgICAgICAgIG1Ob3RpZnlNZ3Iubm90aWZ5KDAsIG5vdGUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjYW5jZWxUZXN0Tm90aWZpY2F0aW9uKCkgeworICAgICAgICBtTm90aWZ5TWdyLmNhbmNlbEFsbCgpOworICAgIH0KKworICAgIHByaXZhdGUgVGVzdExpc3RJdGVtIGNyZWF0ZVNldExvY2tUYXNrRmVhdHVyZXNUZXN0KFN0cmluZyB0ZXN0SWQsIGludCBmZWF0dXJlRmxhZ3MsCisgICAgICAgICAgICBpbnQgdGl0bGVSZXNJZCwgaW50IGRldGFpbFJlc0lkKSB7CisgICAgICAgIGZpbmFsIEludGVudCBjb21tYW5kSW50ZW50ID0gbmV3IEludGVudChDb21tYW5kUmVjZWl2ZXJBY3Rpdml0eS5BQ1RJT05fRVhFQ1VURV9DT01NQU5EKTsKKyAgICAgICAgY29tbWFuZEludGVudC5wdXRFeHRyYShDb21tYW5kUmVjZWl2ZXJBY3Rpdml0eS5FWFRSQV9DT01NQU5ELAorICAgICAgICAgICAgICAgIENvbW1hbmRSZWNlaXZlckFjdGl2aXR5LkNPTU1BTkRfU0VUX0xPQ0tfVEFTS19GRUFUVVJFUyk7CisgICAgICAgIGNvbW1hbmRJbnRlbnQucHV0RXh0cmEoQ29tbWFuZFJlY2VpdmVyQWN0aXZpdHkuRVhUUkFfVkFMVUUsIGZlYXR1cmVGbGFncyk7CisKKyAgICAgICAgcmV0dXJuIGNyZWF0ZUludGVyYWN0aXZlVGVzdEl0ZW0odGhpcywgdGVzdElkLCB0aXRsZVJlc0lkLCBkZXRhaWxSZXNJZCwKKyAgICAgICAgICAgICAgICBuZXcgQnV0dG9uSW5mbyh0aXRsZVJlc0lkLCBjb21tYW5kSW50ZW50KSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRUZXN0SWQoKSB7CisgICAgICAgIHJldHVybiBnZXRJbnRlbnQoKS5nZXRTdHJpbmdFeHRyYShFWFRSQV9URVNUX0lEKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbWFuYWdlZHByb3Zpc2lvbmluZy9NYW5hZ2VkVXNlclBvc2l0aXZlVGVzdEFjdGl2aXR5LmphdmEgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbWFuYWdlZHByb3Zpc2lvbmluZy9NYW5hZ2VkVXNlclBvc2l0aXZlVGVzdEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQyYTYzOQotLS0gL2Rldi9udWxsCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9tYW5hZ2VkcHJvdmlzaW9uaW5nL01hbmFnZWRVc2VyUG9zaXRpdmVUZXN0QWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDE5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLm1hbmFnZWRwcm92aXNpb25pbmc7CisKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLm1hbmFnZWRwcm92aXNpb25pbmcuVXRpbHMuY3JlYXRlSW50ZXJhY3RpdmVUZXN0SXRlbTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuYXBwLmFkbWluLkRldmljZVBvbGljeU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhU2V0T2JzZXJ2ZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5Vc2VyTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOworCitpbXBvcnQgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLkFycmF5VGVzdExpc3RBZGFwdGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5JbnRlbnREcml2ZW5UZXN0QWN0aXZpdHkuQnV0dG9uSW5mbzsKK2ltcG9ydCBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIuUGFzc0ZhaWxCdXR0b25zOworaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5SOworaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5UZXN0TGlzdEFkYXB0ZXIuVGVzdExpc3RJdGVtOworaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5UZXN0UmVzdWx0OworCisvKioKKyAqIEFjdGl2aXR5IHRoYXQgbGlzdHMgYWxsIHBvc2l0aXZlIG1hbmFnZWQgdXNlciB0ZXN0cy4KKyAqLworcHVibGljIGNsYXNzIE1hbmFnZWRVc2VyUG9zaXRpdmVUZXN0QWN0aXZpdHkgZXh0ZW5kcyBQYXNzRmFpbEJ1dHRvbnMuVGVzdExpc3RBY3Rpdml0eSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNYW5hZ2VkVXNlclBvc2l0aXZlVGVzdEFjdGl2aXR5IjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fQ0hFQ0tfQUZGSUxJQVRFRF9QUk9GSUxFX09XTkVSID0KKyAgICAgICAgICAgICJjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIubWFuYWdlZHByb3Zpc2lvbmluZy5hY3Rpb24uQ0hFQ0tfQUZGSUxJQVRFRF9QUk9GSUxFX09XTkVSIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1RFU1RfSUQgPSAiZXh0cmEtdGVzdC1pZCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hFQ0tfQUZGSUxJQVRFRF9QUk9GSUxFX09XTkVSX1RFU1RfSUQgPQorICAgICAgICAgICAgIkNIRUNLX0FGRklMSUFURURfUFJPRklMRV9PV05FUiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFVklDRV9BRE1JTl9TRVRUSU5HU19JRCA9ICJERVZJQ0VfQURNSU5fU0VUVElOR1MiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFX1NUQVRVU19CQVJfVEVTVF9JRCA9ICJESVNBQkxFX1NUQVRVU19CQVIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFX0tFWUdVQVJEX1RFU1RfSUQgPSAiRElTQUJMRV9LRVlHVUFSRCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBPTElDWV9UUkFOU1BBUkVOQ1lfVEVTVF9JRCA9ICJQT0xJQ1lfVFJBTlNQQVJFTkNZIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUxMT1dfUkVNT1ZFX1VTRVJfVEVTVF9JRCA9ICJESVNBTExPV19SRU1PVkVfVVNFUiI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgaWYgKEFDVElPTl9DSEVDS19BRkZJTElBVEVEX1BST0ZJTEVfT1dORVIuZXF1YWxzKGdldEludGVudCgpLmdldEFjdGlvbigpKSkgeworICAgICAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlciBkcG0gPSBnZXRTeXN0ZW1TZXJ2aWNlKERldmljZVBvbGljeU1hbmFnZXIuY2xhc3MpOworICAgICAgICAgICAgaWYgKGRwbS5pc1Byb2ZpbGVPd25lckFwcChnZXRQYWNrYWdlTmFtZSgpKSAmJiBkcG0uaXNBZmZpbGlhdGVkVXNlcigpKSB7CisgICAgICAgICAgICAgICAgVGVzdFJlc3VsdC5zZXRQYXNzZWRSZXN1bHQodGhpcywgZ2V0SW50ZW50KCkuZ2V0U3RyaW5nRXh0cmEoRVhUUkFfVEVTVF9JRCksCisgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgVGVzdFJlc3VsdC5zZXRGYWlsZWRSZXN1bHQodGhpcywgZ2V0SW50ZW50KCkuZ2V0U3RyaW5nRXh0cmEoRVhUUkFfVEVTVF9JRCksCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRTdHJpbmcoUi5zdHJpbmcubWFuYWdlZF91c2VyX2luY29ycmVjdF9tYW5hZ2VkX3VzZXIpLCBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmlzaCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQucG9zaXRpdmVfbWFuYWdlZF91c2VyKTsKKyAgICAgICAgc2V0SW5mb1Jlc291cmNlcyhSLnN0cmluZy5tYW5hZ2VkX3VzZXJfcG9zaXRpdmVfdGVzdHMsCisgICAgICAgICAgICAgICAgUi5zdHJpbmcubWFuYWdlZF91c2VyX3Bvc2l0aXZlX3Rlc3RzX2luZm8sIDApOworICAgICAgICBzZXRQYXNzRmFpbEJ1dHRvbkNsaWNrTGlzdGVuZXJzKCk7CisKKyAgICAgICAgZmluYWwgQXJyYXlUZXN0TGlzdEFkYXB0ZXIgYWRhcHRlciA9IG5ldyBBcnJheVRlc3RMaXN0QWRhcHRlcih0aGlzKTsKKyAgICAgICAgYWRhcHRlci5hZGQoVGVzdExpc3RJdGVtLm5ld0NhdGVnb3J5KHRoaXMsIFIuc3RyaW5nLm1hbmFnZWRfdXNlcl9wb3NpdGl2ZV9jYXRlZ29yeSkpOworCisgICAgICAgIGFkZFRlc3RzVG9BZGFwdGVyKGFkYXB0ZXIpOworCisgICAgICAgIGFkYXB0ZXIucmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIobmV3IERhdGFTZXRPYnNlcnZlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25DaGFuZ2VkKCkgeworICAgICAgICAgICAgICAgIHVwZGF0ZVBhc3NCdXR0b24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgc2V0VGVzdExpc3RBZGFwdGVyKGFkYXB0ZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGZpbmlzaCgpIHsKKyAgICAgICAgLy8gSWYgdGhpcyBhY3Rpdml0eSB3YXMgc3RhcnRlZCBmb3IgY2hlY2tpbmcgcHJvZmlsZSBvd25lciBzdGF0dXMsIHRoZW4gbm8gbmVlZCB0byBkbyBhbnkKKyAgICAgICAgLy8gdGVhciBkb3duLgorICAgICAgICBpZiAoIUFDVElPTl9DSEVDS19BRkZJTElBVEVEX1BST0ZJTEVfT1dORVIuZXF1YWxzKGdldEludGVudCgpLmdldEFjdGlvbigpKSkgeworICAgICAgICAgICAgLy8gUGFzcyBhbmQgZmFpbCBidXR0b25zIGFyZSBrbm93biB0byBjYWxsIGZpbmlzaCgpIHdoZW4gY2xpY2tlZCwKKyAgICAgICAgICAgIC8vIGFuZCB0aGlzIGlzIHdoZW4gd2Ugd2FudCB0byByZW1vdmUgdGhlIG1hbmFnZWQgb3duZXIuCisgICAgICAgICAgICBEZXZpY2VQb2xpY3lNYW5hZ2VyIGRwbSA9IGdldFN5c3RlbVNlcnZpY2UoRGV2aWNlUG9saWN5TWFuYWdlci5jbGFzcyk7CisgICAgICAgICAgICBkcG0ubG9nb3V0VXNlcihEZXZpY2VBZG1pblRlc3RSZWNlaXZlci5nZXRSZWNlaXZlckNvbXBvbmVudE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgc3VwZXIuZmluaXNoKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFkZFRlc3RzVG9BZGFwdGVyKGZpbmFsIEFycmF5VGVzdExpc3RBZGFwdGVyIGFkYXB0ZXIpIHsKKyAgICAgICAgYWRhcHRlci5hZGQoY3JlYXRlVGVzdEl0ZW0odGhpcywgQ0hFQ0tfQUZGSUxJQVRFRF9QUk9GSUxFX09XTkVSX1RFU1RfSUQsCisgICAgICAgICAgICAgICAgUi5zdHJpbmcubWFuYWdlZF91c2VyX2NoZWNrX21hbmFnZWRfdXNlcl90ZXN0LAorICAgICAgICAgICAgICAgIG5ldyBJbnRlbnQoQUNUSU9OX0NIRUNLX0FGRklMSUFURURfUFJPRklMRV9PV05FUikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5wdXRFeHRyYShFWFRSQV9URVNUX0lELCBnZXRJbnRlbnQoKS5nZXRTdHJpbmdFeHRyYShFWFRSQV9URVNUX0lEKSkpKTsKKworICAgICAgICAvLyBkZXZpY2UgYWRtaW4gc2V0dGluZ3MKKyAgICAgICAgYWRhcHRlci5hZGQoY3JlYXRlSW50ZXJhY3RpdmVUZXN0SXRlbSh0aGlzLCBERVZJQ0VfQURNSU5fU0VUVElOR1NfSUQsCisgICAgICAgICAgICAgICAgUi5zdHJpbmcuZGV2aWNlX293bmVyX2RldmljZV9hZG1pbl92aXNpYmxlLAorICAgICAgICAgICAgICAgIFIuc3RyaW5nLmRldmljZV9vd25lcl9kZXZpY2VfYWRtaW5fdmlzaWJsZV9pbmZvLAorICAgICAgICAgICAgICAgIG5ldyBCdXR0b25JbmZvKAorICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuZGV2aWNlX293bmVyX3NldHRpbmdzX2dvLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVudChTZXR0aW5ncy5BQ1RJT05fU0VDVVJJVFlfU0VUVElOR1MpKSkpOworCisgICAgICAgIC8vIERJU0FCTEVfU1RBVFVTX0JBUl9URVNUCisgICAgICAgIGlmIChpc1N0YXR1c0JhckVuYWJsZWQoKSkgeworICAgICAgICAgICAgYWRhcHRlci5hZGQoY3JlYXRlSW50ZXJhY3RpdmVUZXN0SXRlbSh0aGlzLCBESVNBQkxFX1NUQVRVU19CQVJfVEVTVF9JRCwKKyAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuZGV2aWNlX293bmVyX2Rpc2FibGVfc3RhdHVzYmFyX3Rlc3QsCisgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmRldmljZV9vd25lcl9kaXNhYmxlX3N0YXR1c2Jhcl90ZXN0X2luZm8sCisgICAgICAgICAgICAgICAgICAgIG5ldyBCdXR0b25JbmZvW117CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ1dHRvbkluZm8oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5kZXZpY2Vfb3duZXJfZGlzYWJsZV9zdGF0dXNiYXJfYnV0dG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlTWFuYWdlZFVzZXJJbnRlbnRXaXRoQm9vbGVhblBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZFJlY2VpdmVyQWN0aXZpdHkuQ09NTUFORF9TRVRfU1RBVFVTQkFSX0RJU0FCTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ1dHRvbkluZm8oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5kZXZpY2Vfb3duZXJfcmVlbmFibGVfc3RhdHVzYmFyX2J1dHRvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZU1hbmFnZWRVc2VySW50ZW50V2l0aEJvb2xlYW5QYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRSZWNlaXZlckFjdGl2aXR5LkNPTU1BTkRfU0VUX1NUQVRVU0JBUl9ESVNBQkxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpKX0pKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHNldEtleWd1YXJkRGlzYWJsZWQKKyAgICAgICAgYWRhcHRlci5hZGQoY3JlYXRlSW50ZXJhY3RpdmVUZXN0SXRlbSh0aGlzLCBESVNBQkxFX0tFWUdVQVJEX1RFU1RfSUQsCisgICAgICAgICAgICAgICAgUi5zdHJpbmcuZGV2aWNlX293bmVyX2Rpc2FibGVfa2V5Z3VhcmRfdGVzdCwKKyAgICAgICAgICAgICAgICBSLnN0cmluZy5kZXZpY2Vfb3duZXJfZGlzYWJsZV9rZXlndWFyZF90ZXN0X2luZm8sCisgICAgICAgICAgICAgICAgbmV3IEJ1dHRvbkluZm9bXXsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCdXR0b25JbmZvKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5kZXZpY2Vfb3duZXJfZGlzYWJsZV9rZXlndWFyZF9idXR0b24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZU1hbmFnZWRVc2VySW50ZW50V2l0aEJvb2xlYW5QYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZFJlY2VpdmVyQWN0aXZpdHkuQ09NTUFORF9TRVRfS0VZR1VBUkRfRElTQUJMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ1dHRvbkluZm8oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmRldmljZV9vd25lcl9yZWVuYWJsZV9rZXlndWFyZF9idXR0b24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZU1hbmFnZWRVc2VySW50ZW50V2l0aEJvb2xlYW5QYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZFJlY2VpdmVyQWN0aXZpdHkuQ09NTUFORF9TRVRfS0VZR1VBUkRfRElTQUJMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpKX0pKTsKKworICAgICAgICAvLyBESVNBTExPV19SRU1PVkVfVVNFUgorICAgICAgICBhZGFwdGVyLmFkZChjcmVhdGVJbnRlcmFjdGl2ZVRlc3RJdGVtKHRoaXMsIERJU0FMTE9XX1JFTU9WRV9VU0VSX1RFU1RfSUQsCisgICAgICAgICAgICAgICAgUi5zdHJpbmcuZGlzYWxsb3dfcmVtb3ZlX3VzZXIsCisgICAgICAgICAgICAgICAgUi5zdHJpbmcubWFuYWdlZF91c2VyX2Rpc2FsbG93X3JlbW92ZV91c2VyX2luZm8sCisgICAgICAgICAgICAgICAgbmV3IEJ1dHRvbkluZm9bXXsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCdXR0b25JbmZvKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5kZXZpY2Vfb3duZXJfdXNlcl9yZXN0cmljdGlvbl9zZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRSZWNlaXZlckFjdGl2aXR5LmNyZWF0ZVNldFVzZXJSZXN0cmljdGlvbkludGVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyTWFuYWdlci5ESVNBTExPV19SRU1PVkVfVVNFUiwgdHJ1ZSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ1dHRvbkluZm8oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmRldmljZV9vd25lcl9zZXR0aW5nc19nbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVudChTZXR0aW5ncy5BQ1RJT05fU0VUVElOR1MpKX0pKTsKKworICAgICAgICAvLyBQb2xpY3kgVHJhbnNwYXJlbmN5CisgICAgICAgIGZpbmFsIEludGVudCBwb2xpY3lUcmFuc3BhcmVuY3lUZXN0SW50ZW50ID0gbmV3IEludGVudCh0aGlzLAorICAgICAgICAgICAgICAgIFBvbGljeVRyYW5zcGFyZW5jeVRlc3RMaXN0QWN0aXZpdHkuY2xhc3MpOworICAgICAgICBwb2xpY3lUcmFuc3BhcmVuY3lUZXN0SW50ZW50LnB1dEV4dHJhKAorICAgICAgICAgICAgICAgIFBvbGljeVRyYW5zcGFyZW5jeVRlc3RMaXN0QWN0aXZpdHkuRVhUUkFfTU9ERSwKKyAgICAgICAgICAgICAgICBQb2xpY3lUcmFuc3BhcmVuY3lUZXN0TGlzdEFjdGl2aXR5Lk1PREVfTUFOQUdFRF9VU0VSKTsKKyAgICAgICAgLy8gU28gdGhhdCBQb2xpY3lUcmFuc3BhcmVuY3lUZXN0TGlzdEFjdGl2aXR5IGtub3dzIHdoaWNoIHRlc3QgdG8gdXBkYXRlIHdpdGggdGhlIHJlc3VsdDoKKyAgICAgICAgcG9saWN5VHJhbnNwYXJlbmN5VGVzdEludGVudC5wdXRFeHRyYSgKKyAgICAgICAgICAgICAgICBQb2xpY3lUcmFuc3BhcmVuY3lUZXN0QWN0aXZpdHkuRVhUUkFfVEVTVF9JRCwgUE9MSUNZX1RSQU5TUEFSRU5DWV9URVNUX0lEKTsKKyAgICAgICAgYWRhcHRlci5hZGQoY3JlYXRlVGVzdEl0ZW0odGhpcywgUE9MSUNZX1RSQU5TUEFSRU5DWV9URVNUX0lELAorICAgICAgICAgICAgICAgIFIuc3RyaW5nLmRldmljZV9wcm9maWxlX293bmVyX3BvbGljeV90cmFuc3BhcmVuY3lfdGVzdCwKKyAgICAgICAgICAgICAgICBwb2xpY3lUcmFuc3BhcmVuY3lUZXN0SW50ZW50KSk7CisKKyAgICB9CisKKworICAgIHN0YXRpYyBUZXN0TGlzdEl0ZW0gY3JlYXRlVGVzdEl0ZW0oQWN0aXZpdHkgYWN0aXZpdHksIFN0cmluZyBpZCwgaW50IHRpdGxlUmVzLAorICAgICAgICAgICAgSW50ZW50IGludGVudCkgeworICAgICAgICBpbnRlbnQucHV0RXh0cmEoRVhUUkFfVEVTVF9JRCwgaWQpOworICAgICAgICByZXR1cm4gVGVzdExpc3RJdGVtLm5ld1Rlc3QoYWN0aXZpdHksIHRpdGxlUmVzLCBpZCwgaW50ZW50LCBudWxsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEludGVudCBjcmVhdGVNYW5hZ2VkVXNlckludGVudFdpdGhCb29sZWFuUGFyYW1ldGVyKFN0cmluZyBjb21tYW5kLCBib29sZWFuIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBuZXcgSW50ZW50KHRoaXMsIENvbW1hbmRSZWNlaXZlckFjdGl2aXR5LmNsYXNzKQorICAgICAgICAgICAgICAgIC5wdXRFeHRyYShDb21tYW5kUmVjZWl2ZXJBY3Rpdml0eS5FWFRSQV9DT01NQU5ELCBjb21tYW5kKQorICAgICAgICAgICAgICAgIC5wdXRFeHRyYShDb21tYW5kUmVjZWl2ZXJBY3Rpdml0eS5FWFRSQV9FTkZPUkNFRCwgdmFsdWUpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc1N0YXR1c0JhckVuYWJsZWQoKSB7CisgICAgICAgIC8vIFdhdGNoZXMgZG9uJ3Qgc3VwcG9ydCB0aGUgc3RhdHVzIGJhciBzbyB0aGlzIGlzIGFuIG9rIHByb3h5LCBidXQgdGhpcyBpcyBub3QgdGhlIG1vc3QKKyAgICAgICAgLy8gZ2VuZXJhbCB0ZXN0IGZvciB0aGF0LiBUT0RPOiBhZGQgYSB0ZXN0IEFQSSB0byBkbyBhIHJlYWwgY2hlY2sgZm9yIHN0YXR1cyBiYXIgc3VwcG9ydC4KKyAgICAgICAgcmV0dXJuICFnZXRQYWNrYWdlTWFuYWdlcigpLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9XQVRDSCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL21hbmFnZWRwcm92aXNpb25pbmcvTmZjVGVzdEFjdGl2aXR5LmphdmEgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbWFuYWdlZHByb3Zpc2lvbmluZy9OZmNUZXN0QWN0aXZpdHkuamF2YQppbmRleCBlNzY3ZjdmLi5lZjNhZTJhIDEwMDY0NAotLS0gYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbWFuYWdlZHByb3Zpc2lvbmluZy9OZmNUZXN0QWN0aXZpdHkuamF2YQorKysgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbWFuYWdlZHByb3Zpc2lvbmluZy9OZmNUZXN0QWN0aXZpdHkuamF2YQpAQCAtMjIsMTcgKzIyLDExIEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5uZmMuTmRlZk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5uZmMuTmRlZlJlY29yZDsKIGltcG9ydCBhbmRyb2lkLm5mYy5OZmNBZGFwdGVyOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuVXNlck1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LmNvbnRlbnQuRmlsZVByb3ZpZGVyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuT25DbGlja0xpc3RlbmVyOwpAQCAtNDAsOSArMzQsNyBAQAogCiBpbXBvcnQgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLlI7CiAKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKIAogcHVibGljIGNsYXNzIE5mY1Rlc3RBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk5mY1Rlc3RBY3Rpdml0eSI7CkBAIC01MSwxNyArNDMsMTQgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBORkNfQkVBTV9QQUNLQUdFID0gImNvbS5hbmRyb2lkLm5mYyI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5GQ19CRUFNX0FDVElWSVRZID0gImNvbS5hbmRyb2lkLm5mYy5CZWFtU2hhcmVBY3Rpdml0eSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNBTVBMRV9JTUFHRV9GSUxFTkFNRSA9ICJpbWFnZV90b19zaGFyZS5qcGciOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQU1QTEVfSU1BR0VfQ09OVEVOVCA9ICJzYW1wbGUgaW1hZ2UiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQU1QTEVfVEVYVCA9ICJzYW1wbGUgdGV4dCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BUkdJTiA9IDgwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBURVhUX1NJWkUgPSAyMDA7CiAKICAgICBwcml2YXRlIENvbXBvbmVudE5hbWUgbUFkbWluUmVjZWl2ZXJDb21wb25lbnQ7CiAgICAgcHJpdmF0ZSBEZXZpY2VQb2xpY3lNYW5hZ2VyIG1EZXZpY2VQb2xpY3lNYW5hZ2VyOwogICAgIHByaXZhdGUgVXNlck1hbmFnZXIgbVVzZXJNYW5nYWVyOwogICAgIHByaXZhdGUgTmZjQWRhcHRlciBtTmZjQWRhcHRlcjsKICAgICBwcml2YXRlIGJvb2xlYW4gbURpc2FsbG93QnlQb2xpY3k7CisgICAgcHJpdmF0ZSBib29sZWFuIG1BZGRVc2VyUmVzdHJpY3Rpb25PbkZpbmlzaDsKIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKQEAgLTcyLDM0ICs2MSwyMiBAQAogICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlciA9IChEZXZpY2VQb2xpY3lNYW5hZ2VyKSBnZXRTeXN0ZW1TZXJ2aWNlKAogICAgICAgICAgICAgICAgIENvbnRleHQuREVWSUNFX1BPTElDWV9TRVJWSUNFKTsKICAgICAgICAgbVVzZXJNYW5nYWVyID0gKFVzZXJNYW5hZ2VyKSBnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuVVNFUl9TRVJWSUNFKTsKKyAgICAgICAgbUFkZFVzZXJSZXN0cmljdGlvbk9uRmluaXNoID0gbVVzZXJNYW5nYWVyLmhhc1VzZXJSZXN0cmljdGlvbigKKyAgICAgICAgICAgICAgICBVc2VyTWFuYWdlci5ESVNBTExPV19PVVRHT0lOR19CRUFNKTsKICAgICAgICAgbURpc2FsbG93QnlQb2xpY3kgPSBnZXRJbnRlbnQoKS5nZXRCb29sZWFuRXh0cmEoRVhUUkFfRElTQUxMT1dfQllfUE9MSUNZLCBmYWxzZSk7CiAgICAgICAgIGlmIChtRGlzYWxsb3dCeVBvbGljeSkgewogICAgICAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuYWRkVXNlclJlc3RyaWN0aW9uKG1BZG1pblJlY2VpdmVyQ29tcG9uZW50LAogICAgICAgICAgICAgICAgICAgICBVc2VyTWFuYWdlci5ESVNBTExPV19PVVRHT0lOR19CRUFNKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmNsZWFyVXNlclJlc3RyaWN0aW9uKG1BZG1pblJlY2VpdmVyQ29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICBVc2VyTWFuYWdlci5ESVNBTExPV19PVVRHT0lOR19CRUFNKTsKICAgICAgICAgfQogCiAgICAgICAgIG1OZmNBZGFwdGVyID0gTmZjQWRhcHRlci5nZXREZWZhdWx0QWRhcHRlcih0aGlzKTsKKyAgICAgICAgbU5mY0FkYXB0ZXIuc2V0TmRlZlB1c2hNZXNzYWdlKGdldFRlc3RNZXNzYWdlKCksIHRoaXMpOwogCiAgICAgICAgIGZpbmFsIEludGVudCBzaGFyZUludGVudCA9IG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9TRU5EKTsKLQotICAgICAgICAvLyBTZW5kaW5nIGEgbGFyZ2UgYW1vdW50IG9mIGRhdGEgcmVxdWlyZXMgaGFuZC1vdmVyIHRvIGJsdWV0b290aCwgc28gZGV0ZXJtaW5lIGhlcmUKLSAgICAgICAgLy8gaWYgc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UuIElmIGJsdWV0b290aCBpcyBub3Qgc3VwcG9ydGVkLCBhIHNpbXBsZSB0ZXh0IG1lc3NhZ2UKLSAgICAgICAgLy8gd2lsbCBiZSB0cmFuc2ZlcnJlZCBpbnN0ZWFkLgotICAgICAgICBmaW5hbCBib29sZWFuIGhhc0JsdWV0b290aCA9Ci0gICAgICAgICAgICAgICAgZ2V0UGFja2FnZU1hbmFnZXIoKS5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfQkxVRVRPT1RIKTsKLQotICAgICAgICBpZiAoaGFzQmx1ZXRvb3RoKSB7Ci0gICAgICAgICAgICBmaW5hbCBVcmkgdXJpID0gY3JlYXRlVXJpRm9ySW1hZ2UoU0FNUExFX0lNQUdFX0ZJTEVOQU1FLCBTQU1QTEVfSU1BR0VfQ09OVEVOVCk7Ci0gICAgICAgICAgICBVcmlbXSB1cmlzID0gbmV3IFVyaVtde3VyaX07Ci0KLSAgICAgICAgICAgIG1OZmNBZGFwdGVyLnNldEJlYW1QdXNoVXJpcyh1cmlzLCB0aGlzKTsKLQotICAgICAgICAgICAgc2hhcmVJbnRlbnQucHV0RXh0cmEoSW50ZW50LkVYVFJBX1NUUkVBTSwgdXJpKTsKLSAgICAgICAgICAgIHNoYXJlSW50ZW50LnNldFR5cGUoImltYWdlL2pwZyIpOwotICAgICAgICAgICAgc2hhcmVJbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfR1JBTlRfUkVBRF9VUklfUEVSTUlTU0lPTik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzaGFyZUludGVudC5wdXRFeHRyYShJbnRlbnQuRVhUUkFfVEVYVCwgU0FNUExFX1RFWFQpOwotICAgICAgICB9CisgICAgICAgIHNoYXJlSW50ZW50LnB1dEV4dHJhKEludGVudC5FWFRSQV9URVhULCBTQU1QTEVfVEVYVCk7CiAKICAgICAgICAgZmluZFZpZXdCeUlkKFIuaWQubWFudWFsX2JlYW1fYnV0dG9uKS5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKICAgICAgICAgICAgIEBPdmVycmlkZQpAQCAtMTI3LDQ3ICsxMDQsMjMgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGZpbmlzaCgpIHsKLSAgICAgICAgaWYgKG1Vc2VyTWFuZ2Flci5oYXNVc2VyUmVzdHJpY3Rpb24oVXNlck1hbmFnZXIuRElTQUxMT1dfT1VUR09JTkdfQkVBTSkpIHsKKyAgICAgICAgaWYgKG1BZGRVc2VyUmVzdHJpY3Rpb25PbkZpbmlzaCkgeworICAgICAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuYWRkVXNlclJlc3RyaWN0aW9uKG1BZG1pblJlY2VpdmVyQ29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICBVc2VyTWFuYWdlci5ESVNBTExPV19PVVRHT0lOR19CRUFNKTsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmNsZWFyVXNlclJlc3RyaWN0aW9uKG1BZG1pblJlY2VpdmVyQ29tcG9uZW50LAogICAgICAgICAgICAgICAgICAgICBVc2VyTWFuYWdlci5ESVNBTExPV19PVVRHT0lOR19CRUFNKTsKICAgICAgICAgfQogICAgICAgICBzdXBlci5maW5pc2goKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgQml0bWFwIGltYWdlIHRoYXQgY29udGFpbnMgcmVkIG9uIHdoaXRlIHRleHQgd2l0aCBhIHNwZWNpZmllZCBtYXJnaW4uCi0gICAgICogQHBhcmFtIHRleHQgVGV4dCB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGltYWdlLgotICAgICAqIEByZXR1cm4gQSBCaXRtYXAgaW1hZ2Ugd2l0aCB0aGUgYWJvdmUgc3BlY2lmaWNhdGlvbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIEJpdG1hcCBjcmVhdGVTYW1wbGVJbWFnZShTdHJpbmcgdGV4dCkgewotICAgICAgICBQYWludCBwYWludCA9IG5ldyBQYWludCgpOwotICAgICAgICBwYWludC5zZXRTdHlsZShQYWludC5TdHlsZS5GSUxMKTsKLSAgICAgICAgcGFpbnQuc2V0VGV4dFNpemUoVEVYVF9TSVpFKTsKLSAgICAgICAgUmVjdCByZWN0ID0gbmV3IFJlY3QoKTsKLSAgICAgICAgcGFpbnQuZ2V0VGV4dEJvdW5kcyh0ZXh0LCAwLCB0ZXh0Lmxlbmd0aCgpLCByZWN0KTsKLSAgICAgICAgaW50IHcgPSAyICogTUFSR0lOICsgcmVjdC5yaWdodCAtIHJlY3QubGVmdDsKLSAgICAgICAgaW50IGggPSAyICogTUFSR0lOICsgcmVjdC5ib3R0b20gLSByZWN0LnRvcDsKLSAgICAgICAgQml0bWFwIGRlc3QgPSBCaXRtYXAuY3JlYXRlQml0bWFwKHcsIGgsIEJpdG1hcC5Db25maWcuQVJHQl84ODg4KTsKLSAgICAgICAgQ2FudmFzIGNhbnZhcyA9IG5ldyBDYW52YXMoKTsKLSAgICAgICAgY2FudmFzLnNldEJpdG1hcChkZXN0KTsKLSAgICAgICAgcGFpbnQuc2V0Q29sb3IoQ29sb3IuV0hJVEUpOwotICAgICAgICBjYW52YXMuZHJhd1BhaW50KHBhaW50KTsKLSAgICAgICAgcGFpbnQuc2V0Q29sb3IoQ29sb3IuUkVEKTsKLSAgICAgICAgY2FudmFzLmRyYXdUZXh0KHRleHQsIE1BUkdJTiAtIHJlY3QubGVmdCwgTUFSR0lOIC0gcmVjdC50b3AsIHBhaW50KTsKLSAgICAgICAgcmV0dXJuIGRlc3Q7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBVcmkgY3JlYXRlVXJpRm9ySW1hZ2UoU3RyaW5nIG5hbWUsIFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIGZpbmFsIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGdldEZpbGVzRGlyKCkgKyBGaWxlLnNlcGFyYXRvciArICJpbWFnZXMiCi0gICAgICAgICAgICAgICAgKyBGaWxlLnNlcGFyYXRvciArIG5hbWUpOwotICAgICAgICBmaWxlLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsgLy9pZiB0aGUgZm9sZGVyIGRvZXNuJ3QgZXhpc3RzIGl0IGlzIGNyZWF0ZWQKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNyZWF0ZVNhbXBsZUltYWdlKHRleHQpLmNvbXByZXNzKEJpdG1hcC5Db21wcmVzc0Zvcm1hdC5KUEVHLCAxMDAsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpKTsKLSAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBGaWxlUHJvdmlkZXIuZ2V0VXJpRm9yRmlsZSh0aGlzLAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIubWFuYWdlZHByb3Zpc2lvbmluZy5maWxlcHJvdmlkZXIiLCBmaWxlKTsKKyAgICBwcml2YXRlIE5kZWZNZXNzYWdlIGdldFRlc3RNZXNzYWdlKCkgeworICAgICAgICBieXRlW10gbWltZUJ5dGVzID0gImFwcGxpY2F0aW9uL2NvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5tYW5hZ2VkcHJvdmlzaW9uaW5nIgorICAgICAgICAgICAgICAgIC5nZXRCeXRlcyhDaGFyc2V0LmZvck5hbWUoIlVTLUFTQ0lJIikpOworICAgICAgICBieXRlW10gaWQgPSBuZXcgYnl0ZVtdIHsxLCAzLCAzLCA3fTsKKyAgICAgICAgYnl0ZVtdIHBheWxvYWQgPSBTQU1QTEVfVEVYVC5nZXRCeXRlcyhDaGFyc2V0LmZvck5hbWUoIlVTLUFTQ0lJIikpOworICAgICAgICByZXR1cm4gbmV3IE5kZWZNZXNzYWdlKG5ldyBOZGVmUmVjb3JkW10geworICAgICAgICAgICAgICAgIG5ldyBOZGVmUmVjb3JkKE5kZWZSZWNvcmQuVE5GX01JTUVfTUVESUEsIG1pbWVCeXRlcywgaWQsIHBheWxvYWQpCisgICAgICAgIH0pOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9tYW5hZ2VkcHJvdmlzaW9uaW5nL1BvbGljeVRyYW5zcGFyZW5jeVRlc3RBY3Rpdml0eS5qYXZhIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL21hbmFnZWRwcm92aXNpb25pbmcvUG9saWN5VHJhbnNwYXJlbmN5VGVzdEFjdGl2aXR5LmphdmEKaW5kZXggMGY1N2I4Ny4uZTNkNmVkYiAxMDA2NDQKLS0tIGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL21hbmFnZWRwcm92aXNpb25pbmcvUG9saWN5VHJhbnNwYXJlbmN5VGVzdEFjdGl2aXR5LmphdmEKKysrIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL21hbmFnZWRwcm92aXNpb25pbmcvUG9saWN5VHJhbnNwYXJlbmN5VGVzdEFjdGl2aXR5LmphdmEKQEAgLTIxLDcgKzIxLDYgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuaW5wdXRtZXRob2RzZXJ2aWNlLklucHV0TWV0aG9kU2VydmljZTsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLlVzZXJNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BcnJheU1hcDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CkBAIC0yMzUsMTUgKzIzNCwxNCBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25DaGVja2VkQ2hhbmdlZChDb21wb3VuZEJ1dHRvbiBidXR0b25WaWV3LCBib29sZWFuIGlzQ2hlY2tlZCkgewotICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChDb21tYW5kUmVjZWl2ZXJBY3Rpdml0eS5BQ1RJT05fRVhFQ1VURV9DT01NQU5EKTsKKyAgICAgICAgZmluYWwgSW50ZW50IGludGVudDsKICAgICAgICAgaWYgKFRFU1RfQ0hFQ0tfVVNFUl9SRVNUUklDVElPTi5lcXVhbHMobVRlc3QpKSB7CiAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdXNlclJlc3RyaWN0aW9uID0gZ2V0SW50ZW50KCkuZ2V0U3RyaW5nRXh0cmEoCiAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRSZWNlaXZlckFjdGl2aXR5LkVYVFJBX1VTRVJfUkVTVFJJQ1RJT04pOwotICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKENvbW1hbmRSZWNlaXZlckFjdGl2aXR5LkVYVFJBX0NPTU1BTkQsCi0gICAgICAgICAgICAgICAgICAgIENvbW1hbmRSZWNlaXZlckFjdGl2aXR5LkNPTU1BTkRfU0VUX1VTRVJfUkVTVFJJQ1RJT04pOwotICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKENvbW1hbmRSZWNlaXZlckFjdGl2aXR5LkVYVFJBX1VTRVJfUkVTVFJJQ1RJT04sIHVzZXJSZXN0cmljdGlvbik7Ci0gICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoQ29tbWFuZFJlY2VpdmVyQWN0aXZpdHkuRVhUUkFfRU5GT1JDRUQsIGlzQ2hlY2tlZCk7CisgICAgICAgICAgICBpbnRlbnQgPSBDb21tYW5kUmVjZWl2ZXJBY3Rpdml0eS5jcmVhdGVTZXRVc2VyUmVzdHJpY3Rpb25JbnRlbnQoCisgICAgICAgICAgICAgICAgICAgIHVzZXJSZXN0cmljdGlvbiwgaXNDaGVja2VkKTsKICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludGVudCA9IG5ldyBJbnRlbnQoQ29tbWFuZFJlY2VpdmVyQWN0aXZpdHkuQUNUSU9OX0VYRUNVVEVfQ09NTUFORCk7CiAgICAgICAgICAgICBmaW5hbCBQb2xpY3lUZXN0SXRlbSB0ZXN0SXRlbSA9IFBPTElDWV9URVNUX0lURU1TLmdldChtVGVzdCk7CiAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoQ29tbWFuZFJlY2VpdmVyQWN0aXZpdHkuRVhUUkFfQ09NTUFORCwgdGVzdEl0ZW0uY29tbWFuZCk7CiAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoQ29tbWFuZFJlY2VpdmVyQWN0aXZpdHkuRVhUUkFfRU5GT1JDRUQsIGlzQ2hlY2tlZCk7CmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbWFuYWdlZHByb3Zpc2lvbmluZy9Qb2xpY3lUcmFuc3BhcmVuY3lUZXN0TGlzdEFjdGl2aXR5LmphdmEgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbWFuYWdlZHByb3Zpc2lvbmluZy9Qb2xpY3lUcmFuc3BhcmVuY3lUZXN0TGlzdEFjdGl2aXR5LmphdmEKaW5kZXggZDhkYmVmZC4uOTk4ZjhhOCAxMDA2NDQKLS0tIGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL21hbmFnZWRwcm92aXNpb25pbmcvUG9saWN5VHJhbnNwYXJlbmN5VGVzdExpc3RBY3Rpdml0eS5qYXZhCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9tYW5hZ2VkcHJvdmlzaW9uaW5nL1BvbGljeVRyYW5zcGFyZW5jeVRlc3RMaXN0QWN0aXZpdHkuamF2YQpAQCAtMTYsNyArMTYsNiBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5tYW5hZ2VkcHJvdmlzaW9uaW5nOwogCi1pbXBvcnQgYW5kcm9pZC5hcHAuYWRtaW4uRGV2aWNlUG9saWN5TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFTZXRPYnNlcnZlcjsKQEAgLTMwLDcgKzI5LDggQEAKIGltcG9ydCBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIuUjsKIGltcG9ydCBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIuVGVzdExpc3RBZGFwdGVyLlRlc3RMaXN0SXRlbTsKIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogLyoqCiAgKiBUZXN0IGNsYXNzIHRvIHZlcmlmeSB0cmFuc3BhcmVuY3kgZm9yIHBvbGljaWVzIGVuZm9yY2VkIGJ5IGRldmljZS9wcm9maWxlIG93bmVyLgpAQCAtNDQsOCArNDQsOSBAQAogICAgICAgICAgICAgImNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5tYW5hZ2VkcHJvdmlzaW9uaW5nLmV4dHJhLm1vZGUiOwogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9ERVZJQ0VfT1dORVIgPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfUFJPRklMRV9PV05FUiA9IDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9NQU5BR0VEX1BST0ZJTEUgPSAyOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfQ09NUCA9IDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9NQU5BR0VEX1VTRVIgPSA0OwogCiAgICAgLyoqCiAgICAgICogUGFpcnMgb2Y6CkBAIC0xMDAsMTIgKzEwMSwxMiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXJyYXlMaXN0PFN0cmluZz4gQUxTT19WQUxJRF9GT1JfUE8gPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICBzdGF0aWMgewotICAgICAgICBBTFNPX1ZBTElEX0ZPUl9QTy5hZGQoCi0gICAgICAgICAgICAgICAgUG9saWN5VHJhbnNwYXJlbmN5VGVzdEFjdGl2aXR5LlRFU1RfQ0hFQ0tfUEVSTUlUVEVEX0FDQ0VTU0lCSUxJVFlfU0VSVklDRSk7Ci0gICAgICAgIEFMU09fVkFMSURfRk9SX1BPLmFkZChQb2xpY3lUcmFuc3BhcmVuY3lUZXN0QWN0aXZpdHkuVEVTVF9DSEVDS19QRVJNSVRURURfSU5QVVRfTUVUSE9EKTsKLSAgICB9CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdDxTdHJpbmc+IEFMU09fVkFMSURfRk9SX01BTkFHRURfUFJPRklMRSA9IEFycmF5cy5hc0xpc3QoCisgICAgICAgICAgICBQb2xpY3lUcmFuc3BhcmVuY3lUZXN0QWN0aXZpdHkuVEVTVF9DSEVDS19QRVJNSVRURURfQUNDRVNTSUJJTElUWV9TRVJWSUNFLAorICAgICAgICAgICAgUG9saWN5VHJhbnNwYXJlbmN5VGVzdEFjdGl2aXR5LlRFU1RfQ0hFQ0tfUEVSTUlUVEVEX0lOUFVUX01FVEhPRCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdDxTdHJpbmc+IEFMU09fVkFMSURfRk9SX01BTkFHRURfVVNFUiA9IEFycmF5cy5hc0xpc3QoCisgICAgICAgICAgICBQb2xpY3lUcmFuc3BhcmVuY3lUZXN0QWN0aXZpdHkuVEVTVF9DSEVDS19QRVJNSVRURURfQUNDRVNTSUJJTElUWV9TRVJWSUNFLAorICAgICAgICAgICAgUG9saWN5VHJhbnNwYXJlbmN5VGVzdEFjdGl2aXR5LlRFU1RfQ0hFQ0tfUEVSTUlUVEVEX0lOUFVUX01FVEhPRCk7CiAKICAgICBwcml2YXRlIGludCBtTW9kZTsKIApAQCAtMTIzLDcgKzEyNCw4IEBACiAgICAgICAgICAgICAgICAgICAgICsgRVhUUkFfTU9ERSk7CiAgICAgICAgIH0KICAgICAgICAgbU1vZGUgPSBnZXRJbnRlbnQoKS5nZXRJbnRFeHRyYShFWFRSQV9NT0RFLCBNT0RFX0RFVklDRV9PV05FUik7Ci0gICAgICAgIGlmIChtTW9kZSAhPSBNT0RFX0RFVklDRV9PV05FUiAmJiBtTW9kZSAhPSBNT0RFX1BST0ZJTEVfT1dORVIgJiYgbU1vZGUgIT0gTU9ERV9DT01QKSB7CisgICAgICAgIGlmIChtTW9kZSAhPSBNT0RFX0RFVklDRV9PV05FUiAmJiBtTW9kZSAhPSBNT0RFX01BTkFHRURfUFJPRklMRSAmJiBtTW9kZSAhPSBNT0RFX0NPTVAKKyAgICAgICAgICAgICAgICAmJiBtTW9kZSAhPSBNT0RFX01BTkFHRURfVVNFUikgewogICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVua25vd24gbW9kZSAiICsgbU1vZGUpOwogICAgICAgICB9CiAKQEAgLTE2MSw3ICsxNjMsMTAgQEAKICAgICAgICAgICAgIGlmICghaXNQb2xpY3lWYWxpZCh0ZXN0KSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1Nb2RlID09IE1PREVfUFJPRklMRV9PV05FUiAmJiAhQUxTT19WQUxJRF9GT1JfUE8uY29udGFpbnModGVzdCkpIHsKKyAgICAgICAgICAgIGlmIChtTW9kZSA9PSBNT0RFX01BTkFHRURfUFJPRklMRSAmJiAhQUxTT19WQUxJRF9GT1JfTUFOQUdFRF9QUk9GSUxFLmNvbnRhaW5zKHRlc3QpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobU1vZGUgPT0gTU9ERV9NQU5BR0VEX1VTRVIgJiYgIUFMU09fVkFMSURfRk9SX01BTkFHRURfVVNFUi5jb250YWlucyh0ZXN0KSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRpdGxlID0gZ2V0U3RyaW5nKHBvbGljeS5zZWNvbmQpOwpAQCAtMTc1LDEwICsxODAsMTIgQEAKICAgICBwcml2YXRlIFN0cmluZyBnZXRUZXN0SWQoU3RyaW5nIHRpdGxlKSB7CiAgICAgICAgIGlmIChtTW9kZSA9PSBNT0RFX0RFVklDRV9PV05FUikgewogICAgICAgICAgICAgcmV0dXJuICJET18iICsgdGl0bGU7Ci0gICAgICAgIH0gZWxzZSBpZiAobU1vZGUgPT0gTU9ERV9QUk9GSUxFX09XTkVSKSB7Ci0gICAgICAgICAgICByZXR1cm4gIlBPXyIgKyB0aXRsZTsKKyAgICAgICAgfSBlbHNlIGlmIChtTW9kZSA9PSBNT0RFX01BTkFHRURfUFJPRklMRSkgeworICAgICAgICAgICAgcmV0dXJuICJNUF8iICsgdGl0bGU7CiAgICAgICAgIH0gZWxzZSBpZiAobU1vZGUgPT0gTU9ERV9DT01QKXsKICAgICAgICAgICAgIHJldHVybiAiQ09NUF8iICsgdGl0bGU7CisgICAgICAgIH0gZWxzZSBpZiAobU1vZGUgPT0gTU9ERV9NQU5BR0VEX1VTRVIpIHsKKyAgICAgICAgICAgIHJldHVybiAiTVVfIiArIHRpdGxlOwogICAgICAgICB9CiAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmtub3duIG1vZGUgIiArIG1Nb2RlKTsKICAgICB9CmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbWFuYWdlZHByb3Zpc2lvbmluZy9SZWNlbnRzUmVkYWN0aW9uQWN0aXZpdHkuamF2YSBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9tYW5hZ2VkcHJvdmlzaW9uaW5nL1JlY2VudHNSZWRhY3Rpb25BY3Rpdml0eS5qYXZhCmluZGV4IGQ5YjZmZGEuLmE0OTk4NWQgMTAwNjQ0Ci0tLSBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9tYW5hZ2VkcHJvdmlzaW9uaW5nL1JlY2VudHNSZWRhY3Rpb25BY3Rpdml0eS5qYXZhCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9tYW5hZ2VkcHJvdmlzaW9uaW5nL1JlY2VudHNSZWRhY3Rpb25BY3Rpdml0eS5qYXZhCkBAIC0yOCw2ICsyOCw3IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLkFycmF5VGVzdExpc3RBZGFwdGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5EaWFsb2dUZXN0TGlzdEFjdGl2aXR5OwogaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5SOworaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5UZXN0UmVzdWx0OwogCiAvKioKICAqIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGF0IGlmIGEgd29yayBwcm9maWxlIGlzIGxvY2tlZCB3aXRoIGEgc2VwYXJhdGUgcGFzc3dvcmQsIFJlY2VudHMgdmlld3MgZm9yCkBAIC01MiwxMCArNTMsMzMgQEAKICAgICAgICAgICAgICAgICAvKiBpbnN0cnVjdGlvbnMgKi8gUi5zdHJpbmcucHJvdmlzaW9uaW5nX2J5b2RfcmVjZW50c19pbnN0cnVjdGlvbnMpOwogICAgIH0KIAorICAgIC8vIERlZmF1bHQgbGlzdGVuZXIgd2lsbCB1c2Ugc2V0UmVzdWx0KCksIHdoaWNoIHdvbid0IHdvcmsgZHVlIHRvIGFjdGl2aXR5IGJlaW5nIGluIGEgbmV3IHRhc2suCisgICAgcHJpdmF0ZSBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBjbGlja0xpc3RlbmVyID0gdGFyZ2V0IC0+IHsKKyAgICAgICAgZmluYWwgaW50IHJlc3VsdENvZGU7CisgICAgICAgIHN3aXRjaCAodGFyZ2V0LmdldElkKCkpIHsKKyAgICAgICAgICAgIGNhc2UgUi5pZC5wYXNzX2J1dHRvbjoKKyAgICAgICAgICAgICAgICByZXN1bHRDb2RlID0gVGVzdFJlc3VsdC5URVNUX1JFU1VMVF9QQVNTRUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFIuaWQuZmFpbF9idXR0b246CisgICAgICAgICAgICAgICAgcmVzdWx0Q29kZSA9IFRlc3RSZXN1bHQuVEVTVF9SRVNVTFRfRkFJTEVEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIGlkOiAiICsgdGFyZ2V0LmdldElkKCkpOworICAgICAgICB9CisgICAgICAgIEludGVudCByZXN1bHRJbnRlbnQgPSBUZXN0UmVzdWx0LmNyZWF0ZVJlc3VsdChSZWNlbnRzUmVkYWN0aW9uQWN0aXZpdHkudGhpcywgcmVzdWx0Q29kZSwKKyAgICAgICAgICAgICAgICBnZXRUZXN0SWQoKSwgZ2V0VGVzdERldGFpbHMoKSwgZ2V0UmVwb3J0TG9nKCkpOworCisgICAgICAgIG5ldyBCeW9kRmxvd1Rlc3RIZWxwZXIodGhpcykuc2VuZFJlc3VsdFRvUHJpbWFyeShyZXN1bHRJbnRlbnQpOworICAgICAgICBmaW5pc2goKTsKKyAgICB9OworCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewogICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwogCisgICAgICAgIGZpbmRWaWV3QnlJZChSLmlkLnBhc3NfYnV0dG9uKS5zZXRPbkNsaWNrTGlzdGVuZXIoY2xpY2tMaXN0ZW5lcik7CisgICAgICAgIGZpbmRWaWV3QnlJZChSLmlkLmZhaWxfYnV0dG9uKS5zZXRPbkNsaWNrTGlzdGVuZXIoY2xpY2tMaXN0ZW5lcik7CisKICAgICAgICAgbVByZXBhcmVUZXN0QnV0dG9uLnNldFRleHQoUi5zdHJpbmcucHJvdmlzaW9uaW5nX2J5b2RfcmVjZW50c19sb2NrX25vdyk7CiAgICAgICAgIG1QcmVwYXJlVGVzdEJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIoKFZpZXcgdmlldykgLT4gewogICAgICAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIubG9ja05vdygpOwpkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL21hbmFnZWRwcm92aXNpb25pbmcvVHVybk9mZldvcmtBY3Rpdml0eS5qYXZhIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL21hbmFnZWRwcm92aXNpb25pbmcvVHVybk9mZldvcmtBY3Rpdml0eS5qYXZhCmluZGV4IGY4NTViNTYuLmMwYTE2MjYgMTAwNjQ0Ci0tLSBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9tYW5hZ2VkcHJvdmlzaW9uaW5nL1R1cm5PZmZXb3JrQWN0aXZpdHkuamF2YQorKysgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbWFuYWdlZHByb3Zpc2lvbmluZy9UdXJuT2ZmV29ya0FjdGl2aXR5LmphdmEKQEAgLTEyMCwxMSArMTIwLDYgQEAKICAgICAgICAgICAgICAgICBSLnN0cmluZy5wcm92aXNpb25pbmdfYnlvZF90dXJuX29mZl93b3JrX25vdGlmaWNhdGlvbnNfaW5zdHJ1Y3Rpb24sCiAgICAgICAgICAgICAgICAgbmV3IEludGVudChCeW9kSGVscGVyQWN0aXZpdHkuQUNUSU9OX05PVElGSUNBVElPTikpKTsKIAotICAgICAgICBhZGFwdGVyLmFkZChuZXcgRGlhbG9nVGVzdExpc3RJdGVtKHRoaXMsIFIuc3RyaW5nLnByb3Zpc2lvbmluZ19ieW9kX3R1cm5fb2ZmX3dvcmtfaWNvbiwKLSAgICAgICAgICAgICAgICAiQllPRF9UdXJuT2ZmV29ya0ljb24iLAotICAgICAgICAgICAgICAgIFIuc3RyaW5nLnByb3Zpc2lvbmluZ19ieW9kX3R1cm5fb2ZmX3dvcmtfaWNvbl9pbnN0cnVjdGlvbiwKLSAgICAgICAgICAgICAgICBuZXcgSW50ZW50KFNldHRpbmdzLkFDVElPTl9TRVRUSU5HUykpKTsKLQogICAgICAgICBpZiAoIWdldFBhY2thZ2VNYW5hZ2VyKCkuaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX0FVVE9NT1RJVkUpKSB7CiAgICAgICAgICAgICBhZGFwdGVyLmFkZChuZXcgRGlhbG9nVGVzdExpc3RJdGVtKHRoaXMsIFIuc3RyaW5nLnByb3Zpc2lvbmluZ19ieW9kX3R1cm5fb2ZmX3dvcmtfbGF1bmNoZXIsCiAgICAgICAgICAgICAgICAgICAgICJCWU9EX1R1cm5PZmZXb3JrU3RhcnRBcHBzIiwKZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9tYW5hZ2VkcHJvdmlzaW9uaW5nL1VzZXJSZXN0cmljdGlvbnMuamF2YSBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9tYW5hZ2VkcHJvdmlzaW9uaW5nL1VzZXJSZXN0cmljdGlvbnMuamF2YQppbmRleCAyYzQ0MDMwLi4xMmIwZGE4IDEwMDY0NAotLS0gYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbWFuYWdlZHByb3Zpc2lvbmluZy9Vc2VyUmVzdHJpY3Rpb25zLmphdmEKKysrIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL21hbmFnZWRwcm92aXNpb25pbmcvVXNlclJlc3RyaWN0aW9ucy5qYXZhCkBAIC0zMSw3ICszMSw2IEBACiAKIHB1YmxpYyBjbGFzcyBVc2VyUmVzdHJpY3Rpb25zIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBSRVNUUklDVElPTl9JRFNfRk9SX1BPTElDWV9UUkFOU1BBUkVOQ1kgPSBuZXcgU3RyaW5nW10gewotICAgICAgICBVc2VyTWFuYWdlci5ESVNBTExPV19BRERfVVNFUiwKICAgICAgICAgVXNlck1hbmFnZXIuRElTQUxMT1dfQURKVVNUX1ZPTFVNRSwKICAgICAgICAgVXNlck1hbmFnZXIuRElTQUxMT1dfQVBQU19DT05UUk9MLAogICAgICAgICBVc2VyTWFuYWdlci5ESVNBTExPV19DT05GSUdfQ0VMTF9CUk9BRENBU1RTLApAQCAtNDcsMTUgKzQ2LDE5IEBACiAgICAgICAgIFVzZXJNYW5hZ2VyLkRJU0FMTE9XX05FVFdPUktfUkVTRVQsCiAgICAgICAgIFVzZXJNYW5hZ2VyLkRJU0FMTE9XX09VVEdPSU5HX0JFQU0sCiAgICAgICAgIFVzZXJNYW5hZ2VyLkRJU0FMTE9XX1JFTU9WRV9NQU5BR0VEX1BST0ZJTEUsCi0gICAgICAgIFVzZXJNYW5hZ2VyLkRJU0FMTE9XX1JFTU9WRV9VU0VSLAogICAgICAgICBVc2VyTWFuYWdlci5ESVNBTExPV19TSEFSRV9MT0NBVElPTiwKLSAgICAgICAgVXNlck1hbmFnZXIuRElTQUxMT1dfVU5JTlNUQUxMX0FQUFMKKyAgICAgICAgVXNlck1hbmFnZXIuRElTQUxMT1dfVU5JTlNUQUxMX0FQUFMsCisgICAgICAgIFVzZXJNYW5hZ2VyLkRJU0FMTE9XX1VOSUZJRURfUEFTU1dPUkQsCisgICAgICAgIFVzZXJNYW5hZ2VyLkRJU0FMTE9XX0NPTkZJR19EQVRFX1RJTUUsCisgICAgICAgIFVzZXJNYW5hZ2VyLkRJU0FMTE9XX0NPTkZJR19MT0NBVElPTiwKKyAgICAgICAgVXNlck1hbmFnZXIuRElTQUxMT1dfQUlSUExBTkVfTU9ERSwKKyAgICAgICAgVXNlck1hbmFnZXIuRElTQUxMT1dfQ09ORklHX1NDUkVFTl9USU1FT1VULAorICAgICAgICBVc2VyTWFuYWdlci5ESVNBTExPV19DT05GSUdfQlJJR0hUTkVTUywKICAgICB9OwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXJyYXlNYXA8U3RyaW5nLCBVc2VyUmVzdHJpY3Rpb25JdGVtPiBVU0VSX1JFU1RSSUNUSU9OX0lURU1TOwogICAgIHN0YXRpYyB7CiAgICAgICAgIGZpbmFsIGludFtdIHJlc3RyaWN0aW9uTGFiZWxzID0gbmV3IGludFtdIHsKLSAgICAgICAgICAgIFIuc3RyaW5nLmRpc2FsbG93X2FkZF91c2VyLAogICAgICAgICAgICAgUi5zdHJpbmcuZGlzYWxsb3dfYWRqdXN0X3ZvbHVtZSwKICAgICAgICAgICAgIFIuc3RyaW5nLmRpc2FsbG93X2FwcHNfY29udHJvbCwKICAgICAgICAgICAgIFIuc3RyaW5nLmRpc2FsbG93X2NvbmZpZ19jZWxsX2Jyb2FkY2FzdHMsCkBAIC03MSwxMyArNzQsMTcgQEAKICAgICAgICAgICAgIFIuc3RyaW5nLmRpc2FsbG93X25ldHdvcmtfcmVzZXQsCiAgICAgICAgICAgICBSLnN0cmluZy5kaXNhbGxvd19vdXRnb2luZ19iZWFtLAogICAgICAgICAgICAgUi5zdHJpbmcuZGlzYWxsb3dfcmVtb3ZlX21hbmFnZWRfcHJvZmlsZSwKLSAgICAgICAgICAgIFIuc3RyaW5nLmRpc2FsbG93X3JlbW92ZV91c2VyLAogICAgICAgICAgICAgUi5zdHJpbmcuZGlzYWxsb3dfc2hhcmVfbG9jYXRpb24sCi0gICAgICAgICAgICBSLnN0cmluZy5kaXNhbGxvd191bmluc3RhbGxfYXBwcworICAgICAgICAgICAgUi5zdHJpbmcuZGlzYWxsb3dfdW5pbnN0YWxsX2FwcHMsCisgICAgICAgICAgICBSLnN0cmluZy5kaXNhbGxvd191bmlmaWVkX2NoYWxsZW5nZSwKKyAgICAgICAgICAgIFIuc3RyaW5nLmRpc2FsbG93X2NvbmZpZ19kYXRlX3RpbWUsCisgICAgICAgICAgICBSLnN0cmluZy5kaXNhbGxvd19jb25maWdfbG9jYXRpb24sCisgICAgICAgICAgICBSLnN0cmluZy5kaXNhbGxvd19haXJwbGFuZV9tb2RlLAorICAgICAgICAgICAgUi5zdHJpbmcuZGlzYWxsb3dfY29uZmlnX3NjcmVlbl90aW1lb3V0LAorICAgICAgICAgICAgUi5zdHJpbmcuZGlzYWxsb3dfY29uZmlnX2JyaWdodG5lc3MKICAgICAgICAgfTsKIAogICAgICAgICBmaW5hbCBpbnRbXSByZXN0cmljdGlvbkFjdGlvbnMgPSBuZXcgaW50W10gewotICAgICAgICAgICAgUi5zdHJpbmcuZGlzYWxsb3dfYWRkX3VzZXJfYWN0aW9uLAogICAgICAgICAgICAgUi5zdHJpbmcuZGlzYWxsb3dfYWRqdXN0X3ZvbHVtZV9hY3Rpb24sCiAgICAgICAgICAgICBSLnN0cmluZy5kaXNhbGxvd19hcHBzX2NvbnRyb2xfYWN0aW9uLAogICAgICAgICAgICAgUi5zdHJpbmcuZGlzYWxsb3dfY29uZmlnX2NlbGxfYnJvYWRjYXN0c19hY3Rpb24sCkBAIC05MywxNiArMTAwLDIwIEBACiAgICAgICAgICAgICBSLnN0cmluZy5kaXNhbGxvd19uZXR3b3JrX3Jlc2V0X2FjdGlvbiwKICAgICAgICAgICAgIFIuc3RyaW5nLmRpc2FsbG93X291dGdvaW5nX2JlYW1fYWN0aW9uLAogICAgICAgICAgICAgUi5zdHJpbmcuZGlzYWxsb3dfcmVtb3ZlX21hbmFnZWRfcHJvZmlsZV9hY3Rpb24sCi0gICAgICAgICAgICBSLnN0cmluZy5kaXNhbGxvd19yZW1vdmVfdXNlcl9hY3Rpb24sCiAgICAgICAgICAgICBSLnN0cmluZy5kaXNhbGxvd19zaGFyZV9sb2NhdGlvbl9hY3Rpb24sCi0gICAgICAgICAgICBSLnN0cmluZy5kaXNhbGxvd191bmluc3RhbGxfYXBwc19hY3Rpb24KKyAgICAgICAgICAgIFIuc3RyaW5nLmRpc2FsbG93X3VuaW5zdGFsbF9hcHBzX2FjdGlvbiwKKyAgICAgICAgICAgIFIuc3RyaW5nLmRpc2FsbG93X3VuaWZpZWRfY2hhbGxlbmdlX2FjdGlvbiwKKyAgICAgICAgICAgIFIuc3RyaW5nLmRpc2FsbG93X2NvbmZpZ19kYXRlX3RpbWVfYWN0aW9uLAorICAgICAgICAgICAgUi5zdHJpbmcuZGlzYWxsb3dfY29uZmlnX2xvY2F0aW9uX2FjdGlvbiwKKyAgICAgICAgICAgIFIuc3RyaW5nLmRpc2FsbG93X2FpcnBsYW5lX21vZGVfYWN0aW9uLAorICAgICAgICAgICAgUi5zdHJpbmcuZGlzYWxsb3dfY29uZmlnX3NjcmVlbl90aW1lb3V0X2FjdGlvbiwKKyAgICAgICAgICAgIFIuc3RyaW5nLmRpc2FsbG93X2NvbmZpZ19icmlnaHRuZXNzX2FjdGlvbgogICAgICAgICB9OwogCiAgICAgICAgIGZpbmFsIFN0cmluZ1tdIHNldHRpbmdzSW50ZW50QWN0aW9ucyA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICBTZXR0aW5ncy5BQ1RJT05fU0VUVElOR1MsCiAgICAgICAgICAgICBTZXR0aW5ncy5BQ1RJT05fU09VTkRfU0VUVElOR1MsCiAgICAgICAgICAgICBTZXR0aW5ncy5BQ1RJT05fQVBQTElDQVRJT05fU0VUVElOR1MsCi0gICAgICAgICAgICBTZXR0aW5ncy5BQ1RJT05fU09VTkRfU0VUVElOR1MsCisgICAgICAgICAgICBTZXR0aW5ncy5BQ1RJT05fU0VUVElOR1MsCiAgICAgICAgICAgICBTZXR0aW5ncy5BQ1RJT05fU0VDVVJJVFlfU0VUVElOR1MsCiAgICAgICAgICAgICBTZXR0aW5ncy5BQ1RJT05fV0lSRUxFU1NfU0VUVElOR1MsCiAgICAgICAgICAgICBTZXR0aW5ncy5BQ1RJT05fV0lSRUxFU1NfU0VUVElOR1MsCkBAIC0xMTUsOSArMTI2LDE0IEBACiAgICAgICAgICAgICBTZXR0aW5ncy5BQ1RJT05fU0VUVElOR1MsCiAgICAgICAgICAgICBTZXR0aW5ncy5BQ1RJT05fTkZDX1NFVFRJTkdTLAogICAgICAgICAgICAgU2V0dGluZ3MuQUNUSU9OX1NFVFRJTkdTLAotICAgICAgICAgICAgU2V0dGluZ3MuQUNUSU9OX1NFVFRJTkdTLAogICAgICAgICAgICAgU2V0dGluZ3MuQUNUSU9OX0xPQ0FUSU9OX1NPVVJDRV9TRVRUSU5HUywKICAgICAgICAgICAgIFNldHRpbmdzLkFDVElPTl9BUFBMSUNBVElPTl9TRVRUSU5HUywKKyAgICAgICAgICAgIFNldHRpbmdzLkFDVElPTl9TRUNVUklUWV9TRVRUSU5HUywKKyAgICAgICAgICAgIFNldHRpbmdzLkFDVElPTl9EQVRFX1NFVFRJTkdTLAorICAgICAgICAgICAgU2V0dGluZ3MuQUNUSU9OX0xPQ0FUSU9OX1NPVVJDRV9TRVRUSU5HUywKKyAgICAgICAgICAgIFNldHRpbmdzLkFDVElPTl9BSVJQTEFORV9NT0RFX1NFVFRJTkdTLAorICAgICAgICAgICAgU2V0dGluZ3MuQUNUSU9OX0RJU1BMQVlfU0VUVElOR1MsCisgICAgICAgICAgICBTZXR0aW5ncy5BQ1RJT05fRElTUExBWV9TRVRUSU5HUywKICAgICAgICAgfTsKIAogICAgICAgICBpZiAoUkVTVFJJQ1RJT05fSURTX0ZPUl9QT0xJQ1lfVFJBTlNQQVJFTkNZLmxlbmd0aCAhPSByZXN0cmljdGlvbkxhYmVscy5sZW5ndGgKQEAgLTEzNiwxNCArMTUyLDI3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBcnJheUxpc3Q8U3RyaW5nPiBBTFNPX1ZBTElEX0ZPUl9QT19QT0xJQ1lfVFJBTlNQQVJFTkNZID0KLSAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgIHN0YXRpYyB7Ci0gICAgICAgIEFMU09fVkFMSURfRk9SX1BPX1BPTElDWV9UUkFOU1BBUkVOQ1kuYWRkKFVzZXJNYW5hZ2VyLkRJU0FMTE9XX0FQUFNfQ09OVFJPTCk7Ci0gICAgICAgIEFMU09fVkFMSURfRk9SX1BPX1BPTElDWV9UUkFOU1BBUkVOQ1kuYWRkKFVzZXJNYW5hZ2VyLkRJU0FMTE9XX1VOSU5TVEFMTF9BUFBTKTsKLSAgICAgICAgQUxTT19WQUxJRF9GT1JfUE9fUE9MSUNZX1RSQU5TUEFSRU5DWS5hZGQoVXNlck1hbmFnZXIuRElTQUxMT1dfTU9ESUZZX0FDQ09VTlRTKTsKLSAgICAgICAgQUxTT19WQUxJRF9GT1JfUE9fUE9MSUNZX1RSQU5TUEFSRU5DWS5hZGQoVXNlck1hbmFnZXIuRElTQUxMT1dfU0hBUkVfTE9DQVRJT04pOwotICAgIH0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0PFN0cmluZz4gQUxTT19WQUxJRF9GT1JfTUFOQUdFRF9QUk9GSUxFX1BPTElDWV9UUkFOU1BBUkVOQ1kgPQorICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgKKyAgICAgICAgICAgICAgICAgICAgVXNlck1hbmFnZXIuRElTQUxMT1dfQVBQU19DT05UUk9MLAorICAgICAgICAgICAgICAgICAgICBVc2VyTWFuYWdlci5ESVNBTExPV19VTklOU1RBTExfQVBQUywKKyAgICAgICAgICAgICAgICAgICAgVXNlck1hbmFnZXIuRElTQUxMT1dfTU9ESUZZX0FDQ09VTlRTLCBVc2VyTWFuYWdlci5ESVNBTExPV19TSEFSRV9MT0NBVElPTiwKKyAgICAgICAgICAgICAgICAgICAgVXNlck1hbmFnZXIuRElTQUxMT1dfVU5JRklFRF9QQVNTV09SRCwKKyAgICAgICAgICAgICAgICAgICAgVXNlck1hbmFnZXIuRElTQUxMT1dfQ09ORklHX0xPQ0FUSU9OKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0PFN0cmluZz4gQUxTT19WQUxJRF9GT1JfTUFOQUdFRF9VU0VSX1BPTElDWV9UUkFOU1BBUkVOQ1kgPQorICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgKKyAgICAgICAgICAgICAgICAgICAgVXNlck1hbmFnZXIuRElTQUxMT1dfQURKVVNUX1ZPTFVNRSwKKyAgICAgICAgICAgICAgICAgICAgVXNlck1hbmFnZXIuRElTQUxMT1dfQVBQU19DT05UUk9MLAorICAgICAgICAgICAgICAgICAgICBVc2VyTWFuYWdlci5ESVNBTExPV19DT05GSUdfV0lGSSwKKyAgICAgICAgICAgICAgICAgICAgVXNlck1hbmFnZXIuRElTQUxMT1dfSU5TVEFMTF9VTktOT1dOX1NPVVJDRVMsCisgICAgICAgICAgICAgICAgICAgIFVzZXJNYW5hZ2VyLkRJU0FMTE9XX01PRElGWV9BQ0NPVU5UUywKKyAgICAgICAgICAgICAgICAgICAgVXNlck1hbmFnZXIuRElTQUxMT1dfT1VUR09JTkdfQkVBTSwKKyAgICAgICAgICAgICAgICAgICAgVXNlck1hbmFnZXIuRElTQUxMT1dfU0hBUkVfTE9DQVRJT04sCisgICAgICAgICAgICAgICAgICAgIFVzZXJNYW5hZ2VyLkRJU0FMTE9XX1VOSU5TVEFMTF9BUFBTLAorICAgICAgICAgICAgICAgICAgICBVc2VyTWFuYWdlci5ESVNBTExPV19DT05GSUdfREFURV9USU1FLAorICAgICAgICAgICAgICAgICAgICBVc2VyTWFuYWdlci5ESVNBTExPV19DT05GSUdfTE9DQVRJT04sCisgICAgICAgICAgICAgICAgICAgIFVzZXJNYW5hZ2VyLkRJU0FMTE9XX0NPTkZJR19TQ1JFRU5fVElNRU9VVCwKKyAgICAgICAgICAgICAgICAgICAgVXNlck1hbmFnZXIuRElTQUxMT1dfQ09ORklHX0JSSUdIVE5FU1MpOwogCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzdHJpY3Rpb25MYWJlbChDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXN0cmljdGlvbikgewogICAgICAgICBmaW5hbCBVc2VyUmVzdHJpY3Rpb25JdGVtIGl0ZW0gPSBmaW5kUmVzdHJpY3Rpb25JdGVtKHJlc3RyaWN0aW9uKTsKQEAgLTE2OCwxNSArMTk3LDE4IEBACiAgICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKICAgICAgICAgICAgIC8vIFRoZXkgYXJlIGFsbCB2YWxpZCBleGNlcHQgZm9yIERJU0FMTE9XX1JFTU9WRV9NQU5BR0VEX1BST0ZJTEUKICAgICAgICAgICAgIGZvciAoU3RyaW5nIHN0IDogUkVTVFJJQ1RJT05fSURTX0ZPUl9QT0xJQ1lfVFJBTlNQQVJFTkNZKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFzdC5lcXVhbHMoVXNlck1hbmFnZXIuRElTQUxMT1dfUkVNT1ZFX01BTkFHRURfUFJPRklMRSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXN0LmVxdWFscyhVc2VyTWFuYWdlci5ESVNBTExPV19SRU1PVkVfTUFOQUdFRF9QUk9GSUxFKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXN0LmVxdWFscyhVc2VyTWFuYWdlci5ESVNBTExPV19VTklGSUVEX1BBU1NXT1JEKSkgewogICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKHN0KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gUG9saWN5VHJhbnNwYXJlbmN5VGVzdExpc3RBY3Rpdml0eS5NT0RFX0NPTVApIHsKICAgICAgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KFVzZXJNYW5hZ2VyLkRJU0FMTE9XX1JFTU9WRV9NQU5BR0VEX1BST0ZJTEUpOwotICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gUG9saWN5VHJhbnNwYXJlbmN5VGVzdExpc3RBY3Rpdml0eS5NT0RFX1BST0ZJTEVfT1dORVIpIHsKLSAgICAgICAgICAgIHJldHVybiBBTFNPX1ZBTElEX0ZPUl9QT19QT0xJQ1lfVFJBTlNQQVJFTkNZOworICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gUG9saWN5VHJhbnNwYXJlbmN5VGVzdExpc3RBY3Rpdml0eS5NT0RFX01BTkFHRURfUFJPRklMRSkgeworICAgICAgICAgICAgcmV0dXJuIEFMU09fVkFMSURfRk9SX01BTkFHRURfUFJPRklMRV9QT0xJQ1lfVFJBTlNQQVJFTkNZOworICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gUG9saWN5VHJhbnNwYXJlbmN5VGVzdExpc3RBY3Rpdml0eS5NT0RFX01BTkFHRURfVVNFUikgeworICAgICAgICAgICAgcmV0dXJuIEFMU09fVkFMSURfRk9SX01BTkFHRURfVVNFUl9QT0xJQ1lfVFJBTlNQQVJFTkNZOwogICAgICAgICB9CiAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnZhbGlkIG1vZGUgIiArIG1vZGUpOwogICAgIH0KQEAgLTE5NSw5ICsyMjcsNiBAQAogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Jlc3RyaWN0aW9uVmFsaWQoQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVzdHJpY3Rpb24pIHsKICAgICAgICAgZmluYWwgUGFja2FnZU1hbmFnZXIgcG0gPSBjb250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7CiAgICAgICAgIHN3aXRjaCAocmVzdHJpY3Rpb24pIHsKLSAgICAgICAgICAgIGNhc2UgVXNlck1hbmFnZXIuRElTQUxMT1dfQUREX1VTRVI6Ci0gICAgICAgICAgICBjYXNlIFVzZXJNYW5hZ2VyLkRJU0FMTE9XX1JFTU9WRV9VU0VSOgotICAgICAgICAgICAgICAgIHJldHVybiBVc2VyTWFuYWdlci5zdXBwb3J0c011bHRpcGxlVXNlcnMoKTsKICAgICAgICAgICAgIGNhc2UgVXNlck1hbmFnZXIuRElTQUxMT1dfQURKVVNUX1ZPTFVNRToKICAgICAgICAgICAgICAgICByZXR1cm4gcG0uaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX0FVRElPX09VVFBVVCk7CiAgICAgICAgICAgICBjYXNlIFVzZXJNYW5hZ2VyLkRJU0FMTE9XX0NPTkZJR19DRUxMX0JST0FEQ0FTVFM6CmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbWFuYWdlZHByb3Zpc2lvbmluZy9Xb3JrUHJvZmlsZVdpZGdldEFjdGl2aXR5LmphdmEgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbWFuYWdlZHByb3Zpc2lvbmluZy9Xb3JrUHJvZmlsZVdpZGdldEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNmNTczYgotLS0gL2Rldi9udWxsCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9tYW5hZ2VkcHJvdmlzaW9uaW5nL1dvcmtQcm9maWxlV2lkZ2V0QWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIubWFuYWdlZHByb3Zpc2lvbmluZzsKKworaW1wb3J0IGFuZHJvaWQuYXBwLmFkbWluLkRldmljZVBvbGljeU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIuQXJyYXlUZXN0TGlzdEFkYXB0ZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLkRpYWxvZ1Rlc3RMaXN0QWN0aXZpdHk7CitpbXBvcnQgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLlI7CisKK3B1YmxpYyBjbGFzcyBXb3JrUHJvZmlsZVdpZGdldEFjdGl2aXR5IGV4dGVuZHMgRGlhbG9nVGVzdExpc3RBY3Rpdml0eSB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fVEVTVF9XT1JLX1BST0ZJTEVfV0lER0VUID0KKyAgICAgICAgICAgICJjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIuYnlvZC50ZXN0X3dvcmtfcHJvZmlsZV93aWRnZXQiOworCisgICAgcHJpdmF0ZSBEZXZpY2VQb2xpY3lNYW5hZ2VyIG1EcG07CisKKyAgICBwdWJsaWMgV29ya1Byb2ZpbGVXaWRnZXRBY3Rpdml0eSgpIHsKKyAgICAgICAgc3VwZXIoUi5sYXlvdXQucHJvdmlzaW9uaW5nX2J5b2QsCisgICAgICAgICAgICAgICAgUi5zdHJpbmcucHJvdmlzaW9uaW5nX2J5b2Rfd29ya19wcm9maWxlX3dpZGdldCwKKyAgICAgICAgICAgICAgICBSLnN0cmluZy5wcm92aXNpb25pbmdfYnlvZF93b3JrX3Byb2ZpbGVfd2lkZ2V0X2luZm8sCisgICAgICAgICAgICAgICAgUi5zdHJpbmcucHJvdmlzaW9uaW5nX2J5b2Rfd29ya19wcm9maWxlX3dpZGdldF9kZXNjcmlwdGlvbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBtUHJlcGFyZVRlc3RCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworCisgICAgICAgIG1EcG0gPSAoRGV2aWNlUG9saWN5TWFuYWdlcikgZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkRFVklDRV9QT0xJQ1lfU0VSVklDRSk7CisgICAgICAgIGFsbG93VG9BZGRDdHNWZXJpZmllcldpZGdldCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGZpbmlzaCgpIHsKKyAgICAgICAgLy8gUmV2ZXJ0IHRoZSBwb2xpY3kuCisgICAgICAgIGRpc2FsbG93VG9BZGRDdHNWZXJpZmllcldpZGdldCgpOworICAgICAgICBzdXBlci5maW5pc2goKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXR1cFRlc3RzKEFycmF5VGVzdExpc3RBZGFwdGVyIGFkYXB0ZXIpIHsKKyAgICAgICAgLy8gbm8tb3AKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWxsb3dUb0FkZEN0c1ZlcmlmaWVyV2lkZ2V0KCkgeworICAgICAgICBtRHBtLmFkZENyb3NzUHJvZmlsZVdpZGdldFByb3ZpZGVyKGdldEFkbWluQ29tcG9uZW50KCksIGdldFBhY2thZ2VOYW1lKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkaXNhbGxvd1RvQWRkQ3RzVmVyaWZpZXJXaWRnZXQoKSB7CisgICAgICAgIG1EcG0ucmVtb3ZlQ3Jvc3NQcm9maWxlV2lkZ2V0UHJvdmlkZXIoZ2V0QWRtaW5Db21wb25lbnQoKSwgZ2V0UGFja2FnZU5hbWUoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBDb21wb25lbnROYW1lIGdldEFkbWluQ29tcG9uZW50KCkgeworICAgICAgICByZXR1cm4gRGV2aWNlQWRtaW5UZXN0UmVjZWl2ZXIuZ2V0UmVjZWl2ZXJDb21wb25lbnROYW1lKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL25ldC9Db25uZWN0aXZpdHlCYWNrZ3JvdW5kVGVzdEFjdGl2aXR5LmphdmEgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbmV0L0Nvbm5lY3Rpdml0eUJhY2tncm91bmRUZXN0QWN0aXZpdHkuamF2YQppbmRleCAzNmRmYjViLi40OTZiYmU0IDEwMDY0NAotLS0gYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbmV0L0Nvbm5lY3Rpdml0eUJhY2tncm91bmRUZXN0QWN0aXZpdHkuamF2YQorKysgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbmV0L0Nvbm5lY3Rpdml0eUJhY2tncm91bmRUZXN0QWN0aXZpdHkuamF2YQpAQCAtNDIsOCArNDIsNiBAQAogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNjcm9sbFZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNkZFRlc3Q7Ci0KIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTc2LDcgKzc0LDYgQEAKICAqICAgICBbNF0gVGhlIHNjcmVlbiBpcyBwdXQgdG8gc2xlZXAgaWYgdGhpcyBmZWF0dXJlIHN1cHBvcnRlZC4KICAqICAgICBbNV0gQWZ0ZXIgdHdvIG1pbnV0ZXMsIGFub3RoZXIgSVB2NiBjb25uZWN0aXZpdHkgdGVzdCBpcyBwZXJmb3JtZWQuCiAgKi8KLUBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjQuNS9DLTAtMSxDLTAtMixDLTAtMyxDLTAtNCIpCiBwdWJsaWMgY2xhc3MgQ29ubmVjdGl2aXR5QmFja2dyb3VuZFRlc3RBY3Rpdml0eSBleHRlbmRzIFBhc3NGYWlsQnV0dG9ucy5BY3Rpdml0eSB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gQ29ubmVjdGl2aXR5QmFja2dyb3VuZFRlc3RBY3Rpdml0eS5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7CmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbmV0L011bHRpTmV0d29ya0Nvbm5lY3Rpdml0eVRlc3RBY3Rpdml0eS5qYXZhIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL25ldC9NdWx0aU5ldHdvcmtDb25uZWN0aXZpdHlUZXN0QWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTQ0OWNmCi0tLSAvZGV2L251bGwKKysrIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL25ldC9NdWx0aU5ldHdvcmtDb25uZWN0aXZpdHlUZXN0QWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDg0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLm5ldDsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC5OZXR3b3JrQ2FwYWJpbGl0aWVzLk5FVF9DQVBBQklMSVRZX0lOVEVSTkVUOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC5OZXR3b3JrQ2FwYWJpbGl0aWVzLlRSQU5TUE9SVF9DRUxMVUxBUjsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQuTmV0d29ya0NhcGFiaWxpdGllcy5UUkFOU1BPUlRfV0lGSTsKKworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIubmV0Lk11bHRpTmV0d29ya0Nvbm5lY3Rpdml0eVRlc3RBY3Rpdml0eS5WYWxpZGF0b3JTdGF0ZQorICAgICAgICAuQ09NUExFVEVEOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIubmV0Lk11bHRpTmV0d29ya0Nvbm5lY3Rpdml0eVRlc3RBY3Rpdml0eS5WYWxpZGF0b3JTdGF0ZQorICAgICAgICAuTk9UX1NUQVJURUQ7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5uZXQuTXVsdGlOZXR3b3JrQ29ubmVjdGl2aXR5VGVzdEFjdGl2aXR5LlZhbGlkYXRvclN0YXRlCisgICAgICAgIC5TVEFSVEVEOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIubmV0Lk11bHRpTmV0d29ya0Nvbm5lY3Rpdml0eVRlc3RBY3Rpdml0eS5WYWxpZGF0b3JTdGF0ZQorICAgICAgICAuV0FJVElOR19GT1JfVVNFUl9JTlBVVDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuQ29ubmVjdGl2aXR5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Db25uZWN0aXZpdHlNYW5hZ2VyLk5ldHdvcmtDYWxsYmFjazsKK2ltcG9ydCBhbmRyb2lkLm5ldC5EaGNwSW5mbzsKK2ltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtDYXBhYmlsaXRpZXM7CitpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0luZm87CitpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1JlcXVlc3Q7CitpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5TdXBwbGljYW50U3RhdGU7CitpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlJbmZvOworaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuVGVsZXBob255TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuRWRpdGFibGU7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFdhdGNoZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRWRpdFRleHQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIuUGFzc0ZhaWxCdXR0b25zOworaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5SOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQSBDVFMgdmVyaWZpZXIgdG8gZW5zdXJlIHRoYXQgd2hlbiBhbiBhcHAgY2FsbHMgV2lmaU1hbmFnZXIjZW5hYmxlTmV0d29yaywKKyAqIC0gV2hlbiB0aGUgd2lmaSBuZXR3b3JrIGRvZXMgbm90IGhhdmUgaW50ZXJuZXQgY29ubmVjdGl2aXR5LCB0aGUgZGV2aWNlIHNob3VsZAorICogbm90IGRpc2FibGUgb3RoZXIgZm9ybXMgb3IgY29ubmVjdGl2aXR5LCBmb3IgZXhhbXBsZSBjZWxsdWxhci4KKyAqIC0gV2hlbiB0aGUgd2lmaSBuZXR3b3JrIHRoYXQgdGhlIHBob25lIGNvbm5lY3RzIHRvIGxvc2VzIGNvbm5lY3Rpdml0eSwgdGhlbgorICogb3RoZXIgZm9ybXMgb2YgY29ubmVjdGl2aXR5IGFyZSByZXN0b3JlZCwgZm9yIGV4YW1wbGUgY2VsbHVsYXIgd2hlbiB0aGUgcGhvbmUKKyAqIGRldGVjdHMgdGhhdCB0aGUgV2lmaSBuZXR3b3JrIGRvZXNuJ3QgaGF2ZSBpbnRlcm5ldC4KKyAqLworcHVibGljIGNsYXNzIE11bHRpTmV0d29ya0Nvbm5lY3Rpdml0eVRlc3RBY3Rpdml0eSBleHRlbmRzIFBhc3NGYWlsQnV0dG9ucy5BY3Rpdml0eSB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk11bHRpbmV0d29ya1Rlc3QiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOQUJMRV9ESVNBQkxFX1dJRklfREVMQVlfTVMgPSAzMDAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdJRklfTkVUV09SS19DT05ORUNUX1RJTUVPVVRfTVMgPSA0NTAwMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXSUZJX05FVFdPUktfQ09OTkVDVF9UT19CRV9BQ1RJVkVfTVMgPSAyNTAwMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDRUxMVUxBUl9ORVRXT1JLX0NPTk5FQ1RfVElNRU9VVF9NUyA9IDQ1MDAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENFTExVTEFSX05FVFdPUktfUkVTVE9SRV9USU1FT1VUX01TID0gMTUwMDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0VMTFVMQVJfTkVUV09SS19SRVNUT1JFX0FGVEVSX1dJRklfSU5URVJORVRfTE9TVF9USU1FT1VUX01TID0gNjAwMDA7CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgdGhlIHZhbGlkYXRvciB0ZXN0IHdoZW4gaXQgaGFzIGRpZmZlcmVudCBzdGF0ZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnRlcmZhY2UgTXVsdGluZXR3b3JrVGVzdENhbGxiYWNrIHsKKyAgICAgICAgLyoqIE5vdGlmeSB0ZXN0IGhhcyBzdGFydGVkICovCisgICAgICAgIHZvaWQgdGVzdFN0YXJ0ZWQoKTsKKworICAgICAgICAvKiogU2hvdyAvIGRpc3BsYXkgcHJvZ3Jlc3MgdXNpbmcgdGhlIG1lc3NhZ2UgaW4gcHJvZ3Jlc3NNZXNzYWdlICovCisgICAgICAgIHZvaWQgdGVzdFByb2dyZXNzKGludCBwcm9ncmVzc01lc3NhZ2VSZXNvdXJjZUlkKTsKKworICAgICAgICAvKiogVGVzdCBjb21wbGV0ZWQgZm9yIHRoZSB2YWxpZGF0b3IgKi8KKyAgICAgICAgdm9pZCB0ZXN0Q29tcGxldGVkKE11bHRpTmV0d29ya1ZhbGlkYXRvciB2YWxpZGF0b3IpOworICAgIH0KKworICAgIGVudW0gVmFsaWRhdG9yU3RhdGUgeworICAgICAgICBOT1RfU1RBUlRFRCwKKyAgICAgICAgU1RBUlRFRCwKKyAgICAgICAgV0FJVElOR19GT1JfVVNFUl9JTlBVVCwKKyAgICAgICAgQ09NUExFVEVELAorICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgSGFuZGxlciBtTWFpbkhhbmRsZXIgPSBuZXcgSGFuZGxlcihMb29wZXIuZ2V0TWFpbkxvb3BlcigpKTsKKyAgICAvLyBVc2VkIG9ubHkgZm9yIHBvc3RpbmcgYnVncyAvIGRlYnVnZ2luZy4KKyAgICBwcml2YXRlIGZpbmFsIEJyb2FkY2FzdFJlY2VpdmVyIG1NdWx0aU5ldENvbm5lY3Rpdml0eVJlY2VpdmVyID0gbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiQWN0aW9uICIgKyBpbnRlbnQuZ2V0QWN0aW9uKCkpOworICAgICAgICAgICAgaWYgKGludGVudC5nZXRBY3Rpb24oKS5lcXVhbHMoV2lmaU1hbmFnZXIuTkVUV09SS19TVEFURV9DSEFOR0VEX0FDVElPTikpIHsKKyAgICAgICAgICAgICAgICBOZXR3b3JrSW5mbyBuZXR3b3JrSW5mbyA9IGludGVudC5nZXRQYXJjZWxhYmxlRXh0cmEoV2lmaU1hbmFnZXIuRVhUUkFfTkVUV09SS19JTkZPKTsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJOZXcgbmV0d29yayBzdGF0ZSAiICsgbmV0d29ya0luZm8uZ2V0U3RhdGUoKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGludGVudC5nZXRBY3Rpb24oKS5lcXVhbHMoV2lmaU1hbmFnZXIuU1VQUExJQ0FOVF9TVEFURV9DSEFOR0VEX0FDVElPTikpIHsKKyAgICAgICAgICAgICAgICBTdXBwbGljYW50U3RhdGUgc3RhdGUgPSBpbnRlbnQuZ2V0UGFyY2VsYWJsZUV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX05FV19TVEFURSk7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiTmV3IHN1cHBsaWNhbnQgc3RhdGUuICIgKyBzdGF0ZS5uYW1lKCkpOworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIklzIGNvbm5lY3RlZCB0byBleHBlY3RlZCB3aWZpIEFQLiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzQ29ubmVjdGVkVG9FeHBlY3RlZFdpZmlOZXR3b3JrKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKyAgICBwcml2YXRlIGZpbmFsIE11bHRpbmV0d29ya1Rlc3RDYWxsYmFjayBtTXVsdGluZXR3b3JrVGVzdENhbGxiYWNrID0KKyAgICAgICAgICAgIG5ldyBNdWx0aW5ldHdvcmtUZXN0Q2FsbGJhY2soKSB7CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhcnRlZCgpIHsKKyAgICAgICAgICAgICAgICAgICAgbVRlc3RJbmZvVmlldy5zZXRUZXh0KFIuc3RyaW5nLm11bHRpbmV0d29ya19jb25uZWN0aXZpdHlfdGVzdF9ydW5uaW5nKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvZ3Jlc3MoaW50IHByb2dyZXNzTWVzc2FnZVJlc291cmNlSWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbVRlc3RJbmZvVmlldy5zZXRUZXh0KHByb2dyZXNzTWVzc2FnZVJlc291cmNlSWQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wbGV0ZWQoTXVsdGlOZXR3b3JrVmFsaWRhdG9yIHZhbGlkYXRvcikgeworICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRhdG9yID09IG1NdWx0aU5ldHdvcmtWYWxpZGF0b3JzW21NdWx0aU5ldHdvcmtWYWxpZGF0b3JzLmxlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvbmUgYWxsIHRlc3RzLgorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwYXNzZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChNdWx0aU5ldHdvcmtWYWxpZGF0b3IgbXVsdGlOZXR3b3JrVmFsaWRhdG9yIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU11bHRpTmV0d29ya1ZhbGlkYXRvcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBwYXNzZWQgJiYgbXVsdGlOZXR3b3JrVmFsaWRhdG9yLm1UZXN0UmVzdWx0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGVzdFJlc3VsdEFuZEZpbmlzaChwYXNzZWQpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF2YWxpZGF0b3IubVRlc3RSZXN1bHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldFRlc3RSZXN1bHRBbmRGaW5pc2goZmFsc2UpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTXVsdGlOZXR3b3JrVmFsaWRhdG9ycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtTXVsdGlOZXR3b3JrVmFsaWRhdG9yc1tpXSA9PSB2YWxpZGF0b3IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRWYWxpZGF0b3IgPSBtTXVsdGlOZXR3b3JrVmFsaWRhdG9yc1tpICsgMV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UZXN0TmFtZVZpZXcuc2V0VGV4dChtQ3VycmVudFZhbGlkYXRvci5tVGVzdERlc2NyaXB0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRWYWxpZGF0b3Iuc3RhcnRUZXN0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgcHJpdmF0ZSBmaW5hbCBNdWx0aU5ldHdvcmtWYWxpZGF0b3JbXSBtTXVsdGlOZXR3b3JrVmFsaWRhdG9ycyA9IHsKKyAgICAgICAgICAgIG5ldyBDb25uZWN0VG9XaWZpV2l0aE5vSW50ZXJuZXRWYWxpZGF0b3IoCisgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLm11bHRpbmV0d29ya19jb25uZWN0aXZpdHlfdGVzdF8xX2Rlc2MpLAorICAgICAgICAgICAgbmV3IENvbm5lY3RUb1dpZmlXaXRoSW50ZXJtaXR0ZW50SW50ZXJuZXRWYWxpZGF0b3IoCisgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLm11bHRpbmV0d29ya19jb25uZWN0aXZpdHlfdGVzdF8yX2Rlc2MpCisgICAgfTsKKyAgICBwcml2YXRlIGZpbmFsIFJ1bm5hYmxlIG1UaW1lVG9Db21wbGV0aW9uUnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBtU2Vjb25kc1RvQ29tcGxldGlvbi0tOworICAgICAgICAgICAgaWYgKG1TZWNvbmRzVG9Db21wbGV0aW9uID4gMCkgeworICAgICAgICAgICAgICAgIG1TdGFydEJ1dHRvbi5zZXRUZXh0KCIiICsgbVNlY29uZHNUb0NvbXBsZXRpb24pOworICAgICAgICAgICAgICAgIG1NYWluSGFuZGxlci5wb3N0RGVsYXllZCh0aGlzLCAxMDAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICAvLyBVc2VyIGludGVyZmFjZSBlbGVtZW50cy4KKyAgICBwcml2YXRlIEJ1dHRvbiBtU3RhcnRCdXR0b247CisgICAgcHJpdmF0ZSBUZXh0VmlldyBtVGVzdE5hbWVWaWV3OworICAgIHByaXZhdGUgVGV4dFZpZXcgbVRlc3RJbmZvVmlldzsKKyAgICBwcml2YXRlIEVkaXRUZXh0IG1BY2Nlc3NQb2ludFNzaWRFZGl0VGV4dDsKKyAgICBwcml2YXRlIEVkaXRUZXh0IG1Qc2tFZGl0VGV4dDsKKworICAgIC8vIEN1cnJlbnQgc3RhdGUgbWVtZWJlcnMuCisgICAgcHJpdmF0ZSBNdWx0aU5ldHdvcmtWYWxpZGF0b3IgbUN1cnJlbnRWYWxpZGF0b3I7CisgICAgcHJpdmF0ZSBpbnQgbVNlY29uZHNUb0NvbXBsZXRpb247CisgICAgcHJpdmF0ZSBTdHJpbmcgbUFjY2Vzc1BvaW50U3NpZCA9ICIiOworICAgIHByaXZhdGUgU3RyaW5nIG1Qc2tWYWx1ZSA9ICIiOworICAgIHByaXZhdGUgQ29ubmVjdGl2aXR5TWFuYWdlciBtQ29ubmVjdGl2aXR5TWFuYWdlcjsKKyAgICBwcml2YXRlIFdpZmlNYW5hZ2VyIG1XaWZpTWFuYWdlcjsKKworICAgIHByaXZhdGUgaW50IG1SZWNvcmRlZFdpZmlDb25maWd1cmF0aW9uID0gLTE7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIG1Db25uZWN0aXZpdHlNYW5hZ2VyID0gKENvbm5lY3Rpdml0eU1hbmFnZXIpIGdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5DT05ORUNUSVZJVFlfU0VSVklDRSk7CisgICAgICAgIG1XaWZpTWFuYWdlciA9IChXaWZpTWFuYWdlcikgZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LldJRklfU0VSVklDRSk7CisgICAgICAgIHJlY29yZEN1cnJlbnRXaWZpU3RhdGUoKTsKKyAgICAgICAgc2V0dXBVc2VySW50ZXJmYWNlKCk7CisgICAgICAgIHNldHVwQnJvYWRjYXN0UmVjZWl2ZXJzKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7CisgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CisgICAgICAgIHNldHVwQ3VycmVudFRlc3RTdGF0ZU9uUmVzdW1lKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25EZXN0cm95KCkgeworICAgICAgICBzdXBlci5vbkRlc3Ryb3koKTsKKyAgICAgICAgZGVzdHJveUJyb2FkY2FzdFJlY2VpdmVycygpOworICAgICAgICByZXN0b3JlT3JpZ2luYWxXaWZpU3RhdGUoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVjb3JkQ3VycmVudFdpZmlTdGF0ZSgpIHsKKyAgICAgICAgaWYgKCFtV2lmaU1hbmFnZXIuaXNXaWZpRW5hYmxlZCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgV2lmaUluZm8gd2lmaUluZm8gPSBtV2lmaU1hbmFnZXIuZ2V0Q29ubmVjdGlvbkluZm8oKTsKKyAgICAgICAgaWYgKHdpZmlJbmZvICE9IG51bGwgJiYgU3VwcGxpY2FudFN0YXRlLkNPTVBMRVRFRC5lcXVhbHMod2lmaUluZm8uZ2V0U3VwcGxpY2FudFN0YXRlKCkpKSB7CisgICAgICAgICAgICBtUmVjb3JkZWRXaWZpQ29uZmlndXJhdGlvbiA9IHdpZmlJbmZvLmdldE5ldHdvcmtJZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlc3RvcmVPcmlnaW5hbFdpZmlTdGF0ZSgpIHsKKyAgICAgICAgaWYgKG1SZWNvcmRlZFdpZmlDb25maWd1cmF0aW9uID49IDApIHsKKyAgICAgICAgICAgIG1XaWZpTWFuYWdlci5lbmFibGVOZXR3b3JrKG1SZWNvcmRlZFdpZmlDb25maWd1cmF0aW9uLCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXR1cFVzZXJJbnRlcmZhY2UoKSB7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0Lm11bHRpbmV0d29ya19jb25uZWN0aXZpdHkpOworICAgICAgICBzZXRJbmZvUmVzb3VyY2VzKAorICAgICAgICAgICAgICAgIFIuc3RyaW5nLm11bHRpbmV0d29ya19jb25uZWN0aXZpdHlfdGVzdCwKKyAgICAgICAgICAgICAgICBSLnN0cmluZy5tdWx0aW5ldHdvcmtfY29ubmVjdGl2aXR5X3Rlc3RfaW5zdHJ1Y3Rpb25zLAorICAgICAgICAgICAgICAgIC0xKTsKKyAgICAgICAgbVN0YXJ0QnV0dG9uID0gZmluZFZpZXdCeUlkKFIuaWQuc3RhcnRfbXVsdGluZXRfYnRuKTsKKyAgICAgICAgbVRlc3ROYW1lVmlldyA9IGZpbmRWaWV3QnlJZChSLmlkLmN1cnJlbnRfdGVzdCk7CisgICAgICAgIG1UZXN0SW5mb1ZpZXcgPSBmaW5kVmlld0J5SWQoUi5pZC50ZXN0X3Byb2dyZXNzX2luZm8pOworICAgICAgICBtQWNjZXNzUG9pbnRTc2lkRWRpdFRleHQgPSBmaW5kVmlld0J5SWQoUi5pZC50ZXN0X2FwX3NzaWQpOworICAgICAgICBtUHNrRWRpdFRleHQgPSBmaW5kVmlld0J5SWQoUi5pZC50ZXN0X2FwX3Bzayk7CisgICAgICAgIG1BY2Nlc3NQb2ludFNzaWRFZGl0VGV4dC5hZGRUZXh0Q2hhbmdlZExpc3RlbmVyKG5ldyBUZXh0V2F0Y2hlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgYmVmb3JlVGV4dENoYW5nZWQoQ2hhclNlcXVlbmNlIGNoYXJTZXF1ZW5jZSwgaW50IGksIGludCBpMSwgaW50IGkyKSB7fQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVGV4dENoYW5nZWQoQ2hhclNlcXVlbmNlIGNoYXJTZXF1ZW5jZSwgaW50IGksIGludCBpMSwgaW50IGkyKSB7fQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyVGV4dENoYW5nZWQoRWRpdGFibGUgZWRpdGFibGUpIHsKKyAgICAgICAgICAgICAgICBtQWNjZXNzUG9pbnRTc2lkID0gZWRpdGFibGUudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJDb25uZWN0aW5nIHRvICIgKyBtQWNjZXNzUG9pbnRTc2lkKTsKKyAgICAgICAgICAgICAgICBtU3RhcnRCdXR0b24uc2V0RW5hYmxlZChpc1JlYWR5VG9TdGFydCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIG1Qc2tFZGl0VGV4dC5hZGRUZXh0Q2hhbmdlZExpc3RlbmVyKG5ldyBUZXh0V2F0Y2hlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgYmVmb3JlVGV4dENoYW5nZWQoQ2hhclNlcXVlbmNlIGNoYXJTZXF1ZW5jZSwgaW50IGksIGludCBpMSwgaW50IGkyKSB7fQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVGV4dENoYW5nZWQoQ2hhclNlcXVlbmNlIGNoYXJTZXF1ZW5jZSwgaW50IGksIGludCBpMSwgaW50IGkyKSB7fQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyVGV4dENoYW5nZWQoRWRpdGFibGUgZWRpdGFibGUpIHsKKyAgICAgICAgICAgICAgICBtUHNrVmFsdWUgPSBlZGl0YWJsZS50b1N0cmluZygpOworICAgICAgICAgICAgICAgIG1TdGFydEJ1dHRvbi5zZXRFbmFibGVkKGlzUmVhZHlUb1N0YXJ0KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgbVN0YXJ0QnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcih2aWV3IC0+IHByb2Nlc3NTdGFydENsaWNrZWQoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldHVwQnJvYWRjYXN0UmVjZWl2ZXJzKCkgeworICAgICAgICBJbnRlbnRGaWx0ZXIgaW50ZW50RmlsdGVyID0gbmV3IEludGVudEZpbHRlcihDb25uZWN0aXZpdHlNYW5hZ2VyLkNPTk5FQ1RJVklUWV9BQ1RJT04pOworICAgICAgICBpbnRlbnRGaWx0ZXIuYWRkQWN0aW9uKFdpZmlNYW5hZ2VyLk5FVFdPUktfU1RBVEVfQ0hBTkdFRF9BQ1RJT04pOworICAgICAgICBpbnRlbnRGaWx0ZXIuYWRkQWN0aW9uKFdpZmlNYW5hZ2VyLlNVUFBMSUNBTlRfQ09OTkVDVElPTl9DSEFOR0VfQUNUSU9OKTsKKyAgICAgICAgaW50ZW50RmlsdGVyLmFkZEFjdGlvbihXaWZpTWFuYWdlci5TVVBQTElDQU5UX1NUQVRFX0NIQU5HRURfQUNUSU9OKTsKKyAgICAgICAgcmVnaXN0ZXJSZWNlaXZlcihtTXVsdGlOZXRDb25uZWN0aXZpdHlSZWNlaXZlciwgaW50ZW50RmlsdGVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGVzdHJveUJyb2FkY2FzdFJlY2VpdmVycygpIHsKKyAgICAgICAgdW5yZWdpc3RlclJlY2VpdmVyKG1NdWx0aU5ldENvbm5lY3Rpdml0eVJlY2VpdmVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNSZWFkeVRvU3RhcnQoKSB7CisgICAgICAgIHJldHVybiAhKFRleHRVdGlscy5pc0VtcHR5KG1BY2Nlc3NQb2ludFNzaWQpIHx8IFRleHRVdGlscy5pc0VtcHR5KG1Qc2tWYWx1ZSkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNOZXR3b3JrQ2VsbHVsYXJBbmRIYXNJbnRlcm5ldChDb25uZWN0aXZpdHlNYW5hZ2VyIGNvbm5lY3Rpdml0eU1hbmFnZXIsCisgICAgICAgICAgICBOZXR3b3JrIG5ldHdvcmspIHsKKyAgICAgICAgTmV0d29ya0NhcGFiaWxpdGllcyBjYXBhYmlsaXRpZXMgPSBjb25uZWN0aXZpdHlNYW5hZ2VyLmdldE5ldHdvcmtDYXBhYmlsaXRpZXMobmV0d29yayk7CisgICAgICAgIHJldHVybiBjYXBhYmlsaXRpZXMuaGFzVHJhbnNwb3J0KFRSQU5TUE9SVF9DRUxMVUxBUikKKyAgICAgICAgICAgICAgICAmJiBjYXBhYmlsaXRpZXMuaGFzQ2FwYWJpbGl0eShORVRfQ0FQQUJJTElUWV9JTlRFUk5FVCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzTW9iaWxlRGF0YUVuYWJsZWQoVGVsZXBob255TWFuYWdlciB0ZWxlcGhvbnlNYW5hZ2VyKSB7CisgICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgPj0gQnVpbGQuVkVSU0lPTl9DT0RFUy5PKSB7CisgICAgICAgICAgICByZXR1cm4gdGVsZXBob255TWFuYWdlci5pc0RhdGFFbmFibGVkKCk7CisgICAgICAgIH0KKyAgICAgICAgTmV0d29ya1tdIGFsbE5ldHdvcmtzID0gbUNvbm5lY3Rpdml0eU1hbmFnZXIuZ2V0QWxsTmV0d29ya3MoKTsKKyAgICAgICAgZm9yIChOZXR3b3JrIG5ldHdvcmsgOiBhbGxOZXR3b3JrcykgeworICAgICAgICAgICAgaWYgKGlzTmV0d29ya0NlbGx1bGFyQW5kSGFzSW50ZXJuZXQobUNvbm5lY3Rpdml0eU1hbmFnZXIsIG5ldHdvcmspKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja1ByZVJlcXVpc2l0ZXMoKSB7CisgICAgICAgIFRlbGVwaG9ueU1hbmFnZXIgdGVsZXBob255TWFuYWdlciA9CisgICAgICAgICAgICAgICAgKFRlbGVwaG9ueU1hbmFnZXIpIGdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5URUxFUEhPTllfU0VSVklDRSk7CisgICAgICAgIGlmICh0ZWxlcGhvbnlNYW5hZ2VyID09IG51bGwpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkRldmljZSBkb2VzIG5vdCBoYXZlIHRlbGVwaG9ueSBtYW5hZ2VyIik7CisgICAgICAgICAgICBtVGVzdEluZm9WaWV3LnNldFRleHQoUi5zdHJpbmcubXVsdGluZXR3b3JrX2Nvbm5lY3Rpdml0eV90ZXN0X2FsbF9wcmVyZXFfMSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSBpZiAoIWlzTW9iaWxlRGF0YUVuYWJsZWQodGVsZXBob255TWFuYWdlcikpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkRldmljZSBtb2JpbGUgZGF0YSBpcyBub3QgYXZhaWxhYmxlIik7CisgICAgICAgICAgICBtVGVzdEluZm9WaWV3LnNldFRleHQoUi5zdHJpbmcubXVsdGluZXR3b3JrX2Nvbm5lY3Rpdml0eV90ZXN0X2FsbF9wcmVyZXFfMik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdGVzdGVyIHdlbnQgYmFjayBhbmQgY2FtZSBpbiBhZ2FpbiwgbWFrZSBzdXJlIHRoYXQgdGVzdCByZXN1bWVzIGZyb20gdGhlIHByZXZpb3VzIHN0YXRlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXR1cEN1cnJlbnRUZXN0U3RhdGVPblJlc3VtZSgpIHsKKyAgICAgICAgbUN1cnJlbnRWYWxpZGF0b3IgPSBudWxsOworICAgICAgICBtU3RhcnRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7CisKKyAgICAgICAgaWYgKCFjaGVja1ByZVJlcXVpc2l0ZXMoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTXVsdGlOZXR3b3JrVmFsaWRhdG9ycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKG1NdWx0aU5ldHdvcmtWYWxpZGF0b3JzW2ldLm1WYWxpZGF0b3JTdGF0ZSAhPSBDT01QTEVURUQpIHsKKyAgICAgICAgICAgICAgICBtQ3VycmVudFZhbGlkYXRvciA9IG1NdWx0aU5ldHdvcmtWYWxpZGF0b3JzW2ldOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtQ3VycmVudFZhbGlkYXRvciAhPSBudWxsKSB7CisgICAgICAgICAgICBtVGVzdE5hbWVWaWV3LnNldFRleHQobUN1cnJlbnRWYWxpZGF0b3IubVRlc3REZXNjcmlwdGlvbik7CisKKyAgICAgICAgICAgIHN3aXRjaCAobUN1cnJlbnRWYWxpZGF0b3IubVZhbGlkYXRvclN0YXRlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBOT1RfU1RBUlRFRDoKKyAgICAgICAgICAgICAgICAgICAgbVN0YXJ0QnV0dG9uLnNldFRleHQoUi5zdHJpbmcubXVsdGluZXR3b3JrX2Nvbm5lY3Rpdml0eV90ZXN0X3N0YXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXJ0QnV0dG9uLnNldEVuYWJsZWQoaXNSZWFkeVRvU3RhcnQoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU1RBUlRFRDoKKyAgICAgICAgICAgICAgICAgICAgbVRlc3RJbmZvVmlldy5zZXRUZXh0KGdldFJlc291cmNlcygpLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFZhbGlkYXRvci5tVGVzdFByb2dyZXNzTWVzc2FnZSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFdBSVRJTkdfRk9SX1VTRVJfSU5QVVQ6CisgICAgICAgICAgICAgICAgICAgIG1TdGFydEJ1dHRvbi5zZXRUZXh0KFIuc3RyaW5nLm11bHRpbmV0d29ya19jb25uZWN0aXZpdHlfdGVzdF9jb250aW51ZSk7CisgICAgICAgICAgICAgICAgICAgIG1TdGFydEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOworICAgICAgICAgICAgICAgICAgICBtVGVzdEluZm9WaWV3LnNldFRleHQoZ2V0UmVzb3VyY2VzKCkuZ2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50VmFsaWRhdG9yLm1UZXN0UHJvZ3Jlc3NNZXNzYWdlKSk7CisgICAgICAgICAgICAgICAgY2FzZSBDT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVRlc3ROYW1lVmlldy5zZXRUZXh0KG1DdXJyZW50VmFsaWRhdG9yLm1UZXN0RGVzY3JpcHRpb24pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gQWxsIHRlc3RzIGNvbXBsZXRlZCwgc28gbmVlZCB0byByZSBydW4uIEl0J3Mgbm90IGxpa2VseSB0byBnZXQgaGVyZSBhcworICAgICAgICAgICAgLy8gdGhlIGRlZmF1bHQgYWN0aW9uIHdoZW4gYWxsIHRlc3QgY29tcGxldGVzIGlzIHRvIG1hcmsgc3VjY2VzcyBhbmQgZmluaXNoLgorICAgICAgICAgICAgbVN0YXJ0QnV0dG9uLnNldFRleHQoUi5zdHJpbmcubXVsdGluZXR3b3JrX2Nvbm5lY3Rpdml0eV90ZXN0X3JlcnVuKTsKKyAgICAgICAgICAgIG1TdGFydEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOworICAgICAgICAgICAgcmVydW5NdWx0aW5ldHdvcmtUZXN0cygpOworICAgICAgICAgICAgbUN1cnJlbnRWYWxpZGF0b3IgPSBtTXVsdGlOZXR3b3JrVmFsaWRhdG9yc1swXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZXJ1bk11bHRpbmV0d29ya1Rlc3RzKCkgeworICAgICAgICBmb3IgKE11bHRpTmV0d29ya1ZhbGlkYXRvciB2YWxpZGF0b3IgOiBtTXVsdGlOZXR3b3JrVmFsaWRhdG9ycykgeworICAgICAgICAgICAgdmFsaWRhdG9yLnJlc2V0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVxdWVzdFVzZXJDb25maXJtYXRpb24oKSB7CisgICAgICAgIG1NYWluSGFuZGxlci5wb3N0KCgpIC0+IHsKKyAgICAgICAgICAgIG1TdGFydEJ1dHRvbi5zZXRUZXh0KFIuc3RyaW5nLm11bHRpbmV0d29ya19jb25uZWN0aXZpdHlfdGVzdF9jb250aW51ZSk7CisgICAgICAgICAgICBtU3RhcnRCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NTdGFydENsaWNrZWQoKSB7CisgICAgICAgIGlmIChtQ3VycmVudFZhbGlkYXRvciA9PSBudWxsKSB7CisgICAgICAgICAgICByZXJ1bk11bHRpbmV0d29ya1Rlc3RzKCk7CisgICAgICAgICAgICBzZXR1cEN1cnJlbnRUZXN0U3RhdGVPblJlc3VtZSgpOworICAgICAgICB9CisgICAgICAgIG1TdGFydEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgaWYgKG1DdXJyZW50VmFsaWRhdG9yLm1WYWxpZGF0b3JTdGF0ZSA9PSBOT1RfU1RBUlRFRCkgeworICAgICAgICAgICAgbUN1cnJlbnRWYWxpZGF0b3Iuc3RhcnRUZXN0KCk7CisgICAgICAgIH0gZWxzZSBpZiAobUN1cnJlbnRWYWxpZGF0b3IubVZhbGlkYXRvclN0YXRlID09IFdBSVRJTkdfRk9SX1VTRVJfSU5QVVQpIHsKKyAgICAgICAgICAgIG1TdGFydEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgICAgIG1DdXJyZW50VmFsaWRhdG9yLmNvbnRpbnVlV2l0aFRlc3QoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgV2lmaUNvbmZpZ3VyYXRpb24gYnVpbGRXaWZpQ29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24gd2lmaUNvbmZpZ3VyYXRpb24gPSBuZXcgV2lmaUNvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgd2lmaUNvbmZpZ3VyYXRpb24uU1NJRCA9ICJcIiIgKyBtQWNjZXNzUG9pbnRTc2lkICsgIlwiIjsKKyAgICAgICAgd2lmaUNvbmZpZ3VyYXRpb24ucHJlU2hhcmVkS2V5ID0gIlwiIiArIG1Qc2tWYWx1ZSArICJcIiI7CisgICAgICAgIHdpZmlDb25maWd1cmF0aW9uLnN0YXR1cyA9IFdpZmlDb25maWd1cmF0aW9uLlN0YXR1cy5FTkFCTEVEOworICAgICAgICB3aWZpQ29uZmlndXJhdGlvbi5hbGxvd2VkR3JvdXBDaXBoZXJzLnNldChXaWZpQ29uZmlndXJhdGlvbi5Hcm91cENpcGhlci5US0lQKTsKKyAgICAgICAgd2lmaUNvbmZpZ3VyYXRpb24uYWxsb3dlZEdyb3VwQ2lwaGVycy5zZXQoV2lmaUNvbmZpZ3VyYXRpb24uR3JvdXBDaXBoZXIuQ0NNUCk7CisgICAgICAgIHdpZmlDb25maWd1cmF0aW9uLmFsbG93ZWRLZXlNYW5hZ2VtZW50LnNldChXaWZpQ29uZmlndXJhdGlvbi5LZXlNZ210LldQQV9QU0spOworICAgICAgICB3aWZpQ29uZmlndXJhdGlvbi5hbGxvd2VkUGFpcndpc2VDaXBoZXJzLnNldChXaWZpQ29uZmlndXJhdGlvbi5QYWlyd2lzZUNpcGhlci5US0lQKTsKKyAgICAgICAgd2lmaUNvbmZpZ3VyYXRpb24uYWxsb3dlZFBhaXJ3aXNlQ2lwaGVycy5zZXQoV2lmaUNvbmZpZ3VyYXRpb24uUGFpcndpc2VDaXBoZXIuQ0NNUCk7CisgICAgICAgIHdpZmlDb25maWd1cmF0aW9uLmFsbG93ZWRQcm90b2NvbHMuc2V0KFdpZmlDb25maWd1cmF0aW9uLlByb3RvY29sLlJTTik7CisgICAgICAgIHJldHVybiB3aWZpQ29uZmlndXJhdGlvbjsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBhZGRPclVwZGF0ZU5ldHdvcmsoKSB7CisgICAgICAgIExpc3Q8V2lmaUNvbmZpZ3VyYXRpb24+IGF2YWlsYWJsZUNvbmZpZ3VyYXRpb25zID0gbVdpZmlNYW5hZ2VyLmdldENvbmZpZ3VyZWROZXR3b3JrcygpOworICAgICAgICBmb3IgKFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gOiBhdmFpbGFibGVDb25maWd1cmF0aW9ucykgeworICAgICAgICAgICAgaWYgKG1BY2Nlc3NQb2ludFNzaWQuZXF1YWxzKGNvbmZpZ3VyYXRpb24uU1NJRCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlndXJhdGlvbi5uZXR3b3JrSWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50IG5ld05ldHdvcmsgPSBtV2lmaU1hbmFnZXIuYWRkTmV0d29yayhidWlsZFdpZmlDb25maWd1cmF0aW9uKCkpOworICAgICAgICByZXR1cm4gbmV3TmV0d29yazsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNDb25uZWN0ZWRUb0V4cGVjdGVkV2lmaU5ldHdvcmsoKSB7CisgICAgICAgIFdpZmlJbmZvIHdpZmlJbmZvID0gbVdpZmlNYW5hZ2VyLmdldENvbm5lY3Rpb25JbmZvKCk7CisgICAgICAgIERoY3BJbmZvIGRoY3BJbmZvID0gbVdpZmlNYW5hZ2VyLmdldERoY3BJbmZvKCk7CisgICAgICAgIExvZy5pKFRBRywgIkNoZWNraW5nIGNvbm5lY3RlZCB0byBleHBlY3RlZCAiICsgbUFjY2Vzc1BvaW50U3NpZCk7CisgICAgICAgIGlmICh3aWZpSW5mbyAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgd2lmaUluZm8uZ2V0U3VwcGxpY2FudFN0YXRlKCkuZXF1YWxzKFN1cHBsaWNhbnRTdGF0ZS5DT01QTEVURUQpCisgICAgICAgICAgICAgICAgJiYgZGhjcEluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIGZhaWxzYWZlU3NpZCA9IFN0cmluZy5mb3JtYXQoIlwiJXNcIiIsIG1BY2Nlc3NQb2ludFNzaWQpOworICAgICAgICAgICAgTG9nLmkoVEFHLCAiQ29ubmVjdGVkIHRvICIgKyB3aWZpSW5mby5nZXRTU0lEKCkgKyAiIGV4cGVjdGVkICIgKyBtQWNjZXNzUG9pbnRTc2lkKTsKKyAgICAgICAgICAgIHJldHVybiBtQWNjZXNzUG9pbnRTc2lkLmVxdWFscyh3aWZpSW5mby5nZXRTU0lEKCkpCisgICAgICAgICAgICAgICAgICAgIHx8IGZhaWxzYWZlU3NpZC5lcXVhbHMod2lmaUluZm8uZ2V0U1NJRCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0VGltZXJDb3VudGRvd25EaXNwbGF5KGludCB0aW1lb3V0SW5TZWNvbmRzKSB7CisgICAgICAgIG1NYWluSGFuZGxlci5wb3N0KCgpIC0+IG1TZWNvbmRzVG9Db21wbGV0aW9uID0gdGltZW91dEluU2Vjb25kcyk7CisgICAgICAgIG1NYWluSGFuZGxlci5wb3N0KG1UaW1lVG9Db21wbGV0aW9uUnVubmFibGUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzdG9wVGltZXJDb3VudGRvd25EaXNwbGF5KCkgeworICAgICAgICBtTWFpbkhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1UaW1lVG9Db21wbGV0aW9uUnVubmFibGUpOworICAgICAgICBtU3RhcnRCdXR0b24uc2V0VGV4dCgiLS0iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYW5hZ2UgdGhlIGNvbm5lY3Rpdml0eSBzdGF0ZSBmb3IgZWFjaCBNdWx0aW5ldHdvcmtWYWxpZGF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgVGVzdENvbm5lY3Rpdml0eVN0YXRlIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBNdWx0aU5ldHdvcmtWYWxpZGF0b3IgbU11bHRpTmV0d29ya1ZhbGlkYXRvcjsKKworICAgICAgICBmaW5hbCBOZXR3b3JrQ2FsbGJhY2sgbVdpZmlOZXR3b3JrQ2FsbGJhY2sgPSBuZXcgTmV0d29ya0NhbGxiYWNrKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkF2YWlsYWJsZShOZXR3b3JrIG5ldHdvcmspIHsKKyAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJXaWZpIG5ldHdvcmsgYXZhaWxhYmxlICIgKyBuZXR3b3JrLm5ldElkKTsKKyAgICAgICAgICAgICAgICBzdG9wVGltZXJEaXNwbGF5SWZSZXF1ZXN0ZWQoKTsKKyAgICAgICAgICAgICAgICBtTXVsdGlOZXR3b3JrVmFsaWRhdG9yLm9uV2lmaU5ldHdvcmtDb25uZWN0ZWQobmV0d29yayk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25VbmF2YWlsYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgdG8gY29ubmVjdCB0byB3aWZpIik7CisgICAgICAgICAgICAgICAgc3RvcFRpbWVyRGlzcGxheUlmUmVxdWVzdGVkKCk7CisgICAgICAgICAgICAgICAgbU11bHRpTmV0d29ya1ZhbGlkYXRvci5vbldpZmlOZXR3b3JrVW5hdmFpbGFibGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgZmluYWwgTmV0d29ya0NhbGxiYWNrIG1DZWxsdWxhck5ldHdvcmtDYWxsYmFjayA9IG5ldyBOZXR3b3JrQ2FsbGJhY2soKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQXZhaWxhYmxlKE5ldHdvcmsgbmV0d29yaykgeworICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkNlbGx1bGFyIG5ldHdvcmsgYXZhaWxhYmxlICIgKyBuZXR3b3JrLm5ldElkKTsKKyAgICAgICAgICAgICAgICBzdG9wVGltZXJEaXNwbGF5SWZSZXF1ZXN0ZWQoKTsKKyAgICAgICAgICAgICAgICBtTXVsdGlOZXR3b3JrVmFsaWRhdG9yLm9uQ2VsbHVsYXJOZXR3b3JrQ29ubmVjdGVkKG5ldHdvcmspOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVW5hdmFpbGFibGUoKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ2VsbHVsYXIgbmV0d29yayB1bmF2YWlsYWJsZSAiKTsKKyAgICAgICAgICAgICAgICBzdG9wVGltZXJEaXNwbGF5SWZSZXF1ZXN0ZWQoKTsKKyAgICAgICAgICAgICAgICBtTXVsdGlOZXR3b3JrVmFsaWRhdG9yLm9uQ2VsbHVsYXJOZXR3b3JrVW5hdmFpbGFibGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgYm9vbGVhbiBtQ2VsbHVsYXJOZXR3b3JrUmVxdWVzdGVkOworICAgICAgICBib29sZWFuIG1XaWZpTmV0d29ya1JlcXVlc3RlZDsKKyAgICAgICAgYm9vbGVhbiBtVGltZXJTdGFydFJlcXVlc3RlZDsKKworICAgICAgICBUZXN0Q29ubmVjdGl2aXR5U3RhdGUoTXVsdGlOZXR3b3JrVmFsaWRhdG9yIHZhbGlkYXRvcikgeworICAgICAgICAgICAgbU11bHRpTmV0d29ya1ZhbGlkYXRvciA9IHZhbGlkYXRvcjsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgcmVzZXQoKSB7CisgICAgICAgICAgICBtTWFpbkhhbmRsZXIucG9zdCgoKSAtPiBzdG9wVGltZXJEaXNwbGF5SWZSZXF1ZXN0ZWQoKSk7CisgICAgICAgICAgICBpZiAobVdpZmlOZXR3b3JrUmVxdWVzdGVkKSB7CisgICAgICAgICAgICAgICAgbUNvbm5lY3Rpdml0eU1hbmFnZXIudW5yZWdpc3Rlck5ldHdvcmtDYWxsYmFjayhtV2lmaU5ldHdvcmtDYWxsYmFjayk7CisgICAgICAgICAgICAgICAgbVdpZmlOZXR3b3JrUmVxdWVzdGVkID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUNlbGx1bGFyTmV0d29ya1JlcXVlc3RlZCkgeworICAgICAgICAgICAgICAgIG1Db25uZWN0aXZpdHlNYW5hZ2VyLnVucmVnaXN0ZXJOZXR3b3JrQ2FsbGJhY2sobUNlbGx1bGFyTmV0d29ya0NhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICBtQ2VsbHVsYXJOZXR3b3JrUmVxdWVzdGVkID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgY29ubmVjdFRvV2lmaU5ldHdvcmsoYm9vbGVhbiByZXF1aXJlSW50ZXJuZXQpIHsKKyAgICAgICAgICAgIC8vIElmIGRldmljZSBpcyBub3QgY29ubmVjdGVkIHRvIHRoZSBleHBlY3RlZCBXaWZpTmV0d29yaywgY29ubmVjdCB0byB0aGUgd2lmaSBOZXR3b3JrLgorICAgICAgICAgICAgLy8gVGltZW91dCB3aXRoIGZhaWx1cmUgaWYgaXQgY2FuJ3QgY29ubmVjdC4KKyAgICAgICAgICAgIGlmICghaXNDb25uZWN0ZWRUb0V4cGVjdGVkV2lmaU5ldHdvcmsoKSkgeworICAgICAgICAgICAgICAgIGludCBuZXR3b3JrID0gYWRkT3JVcGRhdGVOZXR3b3JrKCk7CisgICAgICAgICAgICAgICAgV2lmaU1hbmFnZXIgd2lmaU1hbmFnZXIgPSAoV2lmaU1hbmFnZXIpIGdldEFwcGxpY2F0aW9uQ29udGV4dCgpCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LldJRklfU0VSVklDRSk7CisgICAgICAgICAgICAgICAgd2lmaU1hbmFnZXIuZW5hYmxlTmV0d29yayhuZXR3b3JrLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXJ0VGltZXJEaXNwbGF5KFdJRklfTkVUV09SS19DT05ORUNUX1RJTUVPVVRfTVMgLyAxMDAwKTsKKyAgICAgICAgICAgIE5ldHdvcmtSZXF1ZXN0LkJ1aWxkZXIgbmV0d29ya1JlcXVlc3RCdWlsZGVyID0gbmV3IE5ldHdvcmtSZXF1ZXN0LkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAuYWRkVHJhbnNwb3J0VHlwZShUUkFOU1BPUlRfV0lGSSk7CisgICAgICAgICAgICBpZiAocmVxdWlyZUludGVybmV0KSB7CisgICAgICAgICAgICAgICAgbmV0d29ya1JlcXVlc3RCdWlsZGVyLmFkZENhcGFiaWxpdHkoTkVUX0NBUEFCSUxJVFlfSU5URVJORVQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTmV0d29ya1JlcXVlc3QgbmV0d29ya1JlcXVlc3QgPSBuZXR3b3JrUmVxdWVzdEJ1aWxkZXIuYnVpbGQoKTsKKyAgICAgICAgICAgIG1XaWZpTmV0d29ya1JlcXVlc3RlZCA9IHRydWU7CisgICAgICAgICAgICBtQ29ubmVjdGl2aXR5TWFuYWdlci5yZXF1ZXN0TmV0d29yayhuZXR3b3JrUmVxdWVzdCwgbVdpZmlOZXR3b3JrQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgIG1NYWluSGFuZGxlciwgV0lGSV9ORVRXT1JLX0NPTk5FQ1RfVElNRU9VVF9NUyk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgY29ubmVjdFRvQ2VsbHVsYXJOZXR3b3JrKCkgeworICAgICAgICAgICAgTmV0d29ya1JlcXVlc3QgbmV0d29ya1JlcXVlc3QgPSBuZXcgTmV0d29ya1JlcXVlc3QuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgIC5hZGRUcmFuc3BvcnRUeXBlKFRSQU5TUE9SVF9DRUxMVUxBUikKKyAgICAgICAgICAgICAgICAgICAgLmFkZENhcGFiaWxpdHkoTkVUX0NBUEFCSUxJVFlfSU5URVJORVQpCisgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICAgICAgc3RhcnRUaW1lckRpc3BsYXkoQ0VMTFVMQVJfTkVUV09SS19DT05ORUNUX1RJTUVPVVRfTVMgLyAxMDAwKTsKKyAgICAgICAgICAgIG1DZWxsdWxhck5ldHdvcmtSZXF1ZXN0ZWQgPSB0cnVlOworICAgICAgICAgICAgbUNvbm5lY3Rpdml0eU1hbmFnZXIucmVxdWVzdE5ldHdvcmsobmV0d29ya1JlcXVlc3QsIG1DZWxsdWxhck5ldHdvcmtDYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgbU1haW5IYW5kbGVyLCBDRUxMVUxBUl9ORVRXT1JLX0NPTk5FQ1RfVElNRU9VVF9NUyk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgc3RhcnRUaW1lckRpc3BsYXkoaW50IHRpbWVJblNlY29uZHMpIHsKKyAgICAgICAgICAgIHN0YXJ0VGltZXJDb3VudGRvd25EaXNwbGF5KHRpbWVJblNlY29uZHMpOworICAgICAgICAgICAgbVRpbWVyU3RhcnRSZXF1ZXN0ZWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLyoqIFRpbWVyIGlzIGEgc2hhcmVkIHJlc291cmNlLCBjaGFuZ2UgdGhlIHN0YXRlIG9ubHkgaWYgaXQncyBzdGFydGVkIGluIGEgcmVxdWVzdC4gKi8KKyAgICAgICAgcHJpdmF0ZSB2b2lkIHN0b3BUaW1lckRpc3BsYXlJZlJlcXVlc3RlZCgpIHsKKyAgICAgICAgICAgIGlmIChtVGltZXJTdGFydFJlcXVlc3RlZCkgeworICAgICAgICAgICAgICAgIG1UaW1lclN0YXJ0UmVxdWVzdGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgc3RvcFRpbWVyQ291bnRkb3duRGlzcGxheSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFuYWdlIHRoZSBsaWZlY3ljbGUgb2YgZWFjaCB0ZXN0IHRvIGJlIHJ1biBpbiB0aGUgdmFsaWRhdG9yLgorICAgICAqCisgICAgICogRWFjaCB0ZXN0IGdvZXMgdGhyb3VnaCB0aGlzIGN5Y2xlCisgICAgICogLSBTdGFydAorICAgICAqIC0gQ29ubmVjdCB0byBjZWxsdWxhciBuZXR3b3JrCisgICAgICogLSBDb25uZWN0IHRvIHdpZmkgbmV0d29yaworICAgICAqIC0gQ2hlY2sgZXhwZWN0YXRpb24KKyAgICAgKiAtIEVuZCB0ZXN0CisgICAgICovCisgICAgcHJpdmF0ZSBhYnN0cmFjdCBjbGFzcyBNdWx0aU5ldHdvcmtWYWxpZGF0b3IgeworICAgICAgICBmaW5hbCBTdHJpbmcgbVRlc3ROYW1lOworICAgICAgICBmaW5hbCBNdWx0aW5ldHdvcmtUZXN0Q2FsbGJhY2sgbVRlc3RDYWxsYmFjazsKKyAgICAgICAgZmluYWwgVGVzdENvbm5lY3Rpdml0eVN0YXRlIG1Db25uZWN0aXZpdHlTdGF0ZTsKKworICAgICAgICBpbnQgbVRlc3REZXNjcmlwdGlvbjsKKyAgICAgICAgYm9vbGVhbiBtVGVzdFJlc3VsdCA9IGZhbHNlOworICAgICAgICBWYWxpZGF0b3JTdGF0ZSBtVmFsaWRhdG9yU3RhdGU7CisgICAgICAgIGludCBtVGVzdFJlc3VsdE1lc3NhZ2UgPSAtMTsKKyAgICAgICAgaW50IG1UZXN0UHJvZ3Jlc3NNZXNzYWdlOworCisgICAgICAgIE11bHRpTmV0d29ya1ZhbGlkYXRvcihNdWx0aW5ldHdvcmtUZXN0Q2FsbGJhY2sgdGVzdENhbGxiYWNrLAorICAgICAgICAgICAgICAgIFN0cmluZyB0ZXN0TmFtZSwgaW50IHRlc3REZXNjcmlwdGlvbikgeworICAgICAgICAgICAgbVRlc3RDYWxsYmFjayA9IHRlc3RDYWxsYmFjazsKKyAgICAgICAgICAgIG1UZXN0TmFtZSA9IHRlc3ROYW1lOworICAgICAgICAgICAgbVRlc3REZXNjcmlwdGlvbiA9IHRlc3REZXNjcmlwdGlvbjsKKyAgICAgICAgICAgIG1Db25uZWN0aXZpdHlTdGF0ZSA9IG5ldyBUZXN0Q29ubmVjdGl2aXR5U3RhdGUodGhpcyk7CisgICAgICAgICAgICBtVmFsaWRhdG9yU3RhdGUgPSBOT1RfU1RBUlRFRDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBTdGFydCB0ZXN0IGlmIG5vdCBzdGFydGVkLiAqLworICAgICAgICB2b2lkIHN0YXJ0VGVzdCgpIHsKKyAgICAgICAgICAgIGlmIChtVmFsaWRhdG9yU3RhdGUgPT0gTk9UX1NUQVJURUQpIHsKKyAgICAgICAgICAgICAgICBtVGVzdENhbGxiYWNrLnRlc3RTdGFydGVkKCk7CisgICAgICAgICAgICAgICAgV2lmaU1hbmFnZXIgd2lmaU1hbmFnZXIgPSAoV2lmaU1hbmFnZXIpIGdldEFwcGxpY2F0aW9uQ29udGV4dCgpCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LldJRklfU0VSVklDRSk7CisgICAgICAgICAgICAgICAgd2lmaU1hbmFnZXIuc2V0V2lmaUVuYWJsZWQoZmFsc2UpOworICAgICAgICAgICAgICAgIG1NYWluSGFuZGxlci5wb3N0RGVsYXllZCgoKSAtPiB7CisgICAgICAgICAgICAgICAgICAgIHdpZmlNYW5hZ2VyLnNldFdpZmlFbmFibGVkKHRydWUpOworICAgICAgICAgICAgICAgICAgICBtVGVzdENhbGxiYWNrLnRlc3RQcm9ncmVzcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5tdWx0aW5ldHdvcmtfY29ubmVjdGl2aXR5X3Rlc3RfY29ubmVjdF9jZWxsdWxhcik7CisgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aXZpdHlTdGF0ZS5jb25uZWN0VG9DZWxsdWxhck5ldHdvcmsoKTsKKyAgICAgICAgICAgICAgICB9LCBFTkFCTEVfRElTQUJMRV9XSUZJX0RFTEFZX01TKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKiBNYWtlIHN1cmUgdGhhdCB0aGUgc3RhdGUgaXMgcmVzdG9yZWQgZm9yIHJlLXJ1bm5pbmcgdGhlIHRlc3QuICovCisgICAgICAgIHZvaWQgcmVzZXQoKSB7CisgICAgICAgICAgICBtVmFsaWRhdG9yU3RhdGUgPSBOT1RfU1RBUlRFRDsKKyAgICAgICAgICAgIG1UZXN0UmVzdWx0TWVzc2FnZSA9IC0xOworICAgICAgICAgICAgbVRlc3RQcm9ncmVzc01lc3NhZ2UgPSAtMTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBDYWxsZWQgd2hlbiB1c2VyIGhhcyByZXF1ZXN0ZWQgdG8gY29udGludWUgd2l0aCB0aGUgdGVzdCAqLworICAgICAgICB2b2lkIGNvbnRpbnVlV2l0aFRlc3QoKSB7CisgICAgICAgICAgICBtVmFsaWRhdG9yU3RhdGUgPSBTVEFSVEVEOworICAgICAgICB9CisKKworICAgICAgICB2b2lkIGNvbm5lY3RUb1dpZmkoKSB7CisgICAgICAgICAgICBtVGVzdENhbGxiYWNrLnRlc3RQcm9ncmVzcyhSLnN0cmluZy5tdWx0aW5ldHdvcmtfY29ubmVjdGl2aXR5X3Rlc3RfY29ubmVjdF93aWZpKTsKKyAgICAgICAgICAgIG1Db25uZWN0aXZpdHlTdGF0ZS5jb25uZWN0VG9XaWZpTmV0d29yayhmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIG9uQ2VsbHVsYXJOZXR3b3JrVW5hdmFpbGFibGUoKSB7CisgICAgICAgICAgICBlbmRUZXN0KGZhbHNlLCBSLnN0cmluZy5tdWx0aW5ldHdvcmtfc3RhdHVzX21vYmlsZV9jb25uZWN0X3RpbWVkX291dCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGVuZFRlc3QoYm9vbGVhbiBzdGF0dXMsIGludCBtZXNzYWdlUmVzSWQpIHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgIkVuZGluZyB0ZXN0IHdpdGggc3RhdHVzICIgKyBzdGF0dXMgKyAiIG1lc3NhZ2UgIiArCisgICAgICAgICAgICAgICAgTXVsdGlOZXR3b3JrQ29ubmVjdGl2aXR5VGVzdEFjdGl2aXR5LnRoaXMuZ2V0UmVzb3VyY2VzKCkuZ2V0U3RyaW5nKG1lc3NhZ2VSZXNJZCkpOworICAgICAgICAgICAgbU1haW5IYW5kbGVyLnBvc3QoKCkgLT4geworICAgICAgICAgICAgICAgIG1UZXN0UmVzdWx0ID0gc3RhdHVzOworICAgICAgICAgICAgICAgIG1UZXN0UmVzdWx0TWVzc2FnZSA9IG1lc3NhZ2VSZXNJZDsKKyAgICAgICAgICAgICAgICBtVmFsaWRhdG9yU3RhdGUgPSBDT01QTEVURUQ7CisgICAgICAgICAgICAgICAgbVRlc3RDYWxsYmFjay50ZXN0Q29tcGxldGVkKE11bHRpTmV0d29ya1ZhbGlkYXRvci50aGlzKTsKKyAgICAgICAgICAgICAgICBtQ29ubmVjdGl2aXR5U3RhdGUucmVzZXQoKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICAgICAgLyoqIENhbGxlZCB3aGVuIGNlbGx1bGFyIG5ldHdvcmsgaXMgY29ubmVjdGVkLiAqLworICAgICAgICB2b2lkIG9uQ2VsbHVsYXJOZXR3b3JrQ29ubmVjdGVkKE5ldHdvcmsgbmV0d29yaykgeworICAgICAgICAgICAgb25Db250aW51ZVByZVdpZmlDb25uZWN0KCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHBhcmFtIHRyYW5zcG9ydCBUaGUgYWN0aXZlIG5ldHdvcmsgaGFzIHRoaXMgdHJhbnNwb3J0IHR5cGUKKyAgICAgICAgICogQHJldHVybgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbGVhbiBpc0V4cGVjdGVkVHJhbnNwb3J0Rm9yQWN0aXZlTmV0d29yayhpbnQgdHJhbnNwb3J0KSB7CisgICAgICAgICAgICBOZXR3b3JrIGFjdGl2ZU5ldHdvcmsgPSBtQ29ubmVjdGl2aXR5TWFuYWdlci5nZXRBY3RpdmVOZXR3b3JrKCk7CisgICAgICAgICAgICBOZXR3b3JrQ2FwYWJpbGl0aWVzIGFjdGl2ZU5ldHdvcmtDYXBhYmlsaXRpZXMgPQorICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGl2aXR5TWFuYWdlci5nZXROZXR3b3JrQ2FwYWJpbGl0aWVzKGFjdGl2ZU5ldHdvcmspOworICAgICAgICAgICAgTG9nLmkoVEFHLCAiTmV0d29yayBjYXBhYmlsaXRpZXMgZm9yICIgKyBhY3RpdmVOZXR3b3JrLm5ldElkICsgIiAiCisgICAgICAgICAgICAgICAgICAgICsgYWN0aXZlTmV0d29ya0NhcGFiaWxpdGllcy5oYXNDYXBhYmlsaXR5KE5FVF9DQVBBQklMSVRZX0lOVEVSTkVUKSk7CisgICAgICAgICAgICByZXR1cm4gYWN0aXZlTmV0d29ya0NhcGFiaWxpdGllcy5oYXNUcmFuc3BvcnQodHJhbnNwb3J0KQorICAgICAgICAgICAgICAgICAgICAmJiBhY3RpdmVOZXR3b3JrQ2FwYWJpbGl0aWVzLmhhc0NhcGFiaWxpdHkoTkVUX0NBUEFCSUxJVFlfSU5URVJORVQpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBwYXJhbSBuZXR3b3JrIHRvIGNoZWNrIGlmIGNvbm5lY3RlZCBvciBub3QuCisgICAgICAgICAqIEByZXR1cm4KKyAgICAgICAgICovCisgICAgICAgIGJvb2xlYW4gaXNOZXR3b3JrQ29ubmVjdGVkKE5ldHdvcmsgbmV0d29yaykgeworICAgICAgICAgICAgTmV0d29ya0luZm8gbmV0d29ya0luZm8gPSBtQ29ubmVjdGl2aXR5TWFuYWdlci5nZXROZXR3b3JrSW5mbyhuZXR3b3JrKTsKKyAgICAgICAgICAgIGJvb2xlYW4gc3RhdHVzID0gbmV0d29ya0luZm8gIT0gbnVsbCAmJiBuZXR3b3JrSW5mby5pc0Nvbm5lY3RlZE9yQ29ubmVjdGluZygpOworICAgICAgICAgICAgTG9nLmkoVEFHLCAiTmV0d29yayBjb25uZWN0aW9uIHN0YXR1cyAiICsgbmV0d29yay5uZXRJZCArICIgIiArIHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCBiZWZvcmUgY29ubmVjdGluZyB0byB3aWZpLiBTcGVjaWFsbHkgaWYgdGhlIGNvbmNyZXRlIHZhbGlkYXRvciB3YW50cyB0bworICAgICAgICAgKiBwcm9tcHQgYSBtZXNzYWdlCisgICAgICAgICAqLworICAgICAgICBhYnN0cmFjdCB2b2lkIG9uQ29udGludWVQcmVXaWZpQ29ubmVjdCgpOworCisgICAgICAgIC8qKiBDYWxsZWQgd2hlbiBhIHdpZmkgbmV0d29yayBpcyBjb25uZWN0ZWQgYW5kIGF2YWlsYWJsZSAqLworICAgICAgICB2b2lkIG9uV2lmaU5ldHdvcmtDb25uZWN0ZWQoTmV0d29yayBuZXR3b3JrKSB7CisgICAgICAgICAgICBMb2cuaShUQUcsICJXaWZpIG5ldHdvcmsgY29ubmVjdGVkICIgKyBuZXR3b3JrLm5ldElkKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgb25XaWZpTmV0d29ya1VuYXZhaWxhYmxlKCkgeworICAgICAgICAgICAgZW5kVGVzdChmYWxzZSwgUi5zdHJpbmcubXVsdGluZXR3b3JrX3N0YXR1c193aWZpX2Nvbm5lY3RfdGltZWRfb3V0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhhdCBkZXZpY2UgZG9lcyBub3QgbG9zZSBjZWxsdWxhciBjb25uZWN0aXZpdHkgd2hlbiBpdCdzIGNvbm5lY3RlZCB0byBhbiBhY2Nlc3MKKyAgICAgKiBwb2ludCB3aXRoIG5vIGNvbm5lY3Rpdml0eS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIENvbm5lY3RUb1dpZmlXaXRoTm9JbnRlcm5ldFZhbGlkYXRvciBleHRlbmRzIE11bHRpTmV0d29ya1ZhbGlkYXRvciB7CisKKyAgICAgICAgQ29ubmVjdFRvV2lmaVdpdGhOb0ludGVybmV0VmFsaWRhdG9yKGludCBkZXNjcmlwdGlvbikgeworICAgICAgICAgICAgc3VwZXIobU11bHRpbmV0d29ya1Rlc3RDYWxsYmFjaywgIm5vX2ludGVybmV0X3Rlc3QiLCBkZXNjcmlwdGlvbik7CisgICAgICAgIH0KKworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICB2b2lkIGNvbnRpbnVlV2l0aFRlc3QoKSB7CisgICAgICAgICAgICBzdXBlci5jb250aW51ZVdpdGhUZXN0KCk7CisgICAgICAgICAgICBjb25uZWN0VG9XaWZpKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgdm9pZCBvbkNvbnRpbnVlUHJlV2lmaUNvbm5lY3QoKSB7CisgICAgICAgICAgICBtVGVzdFByb2dyZXNzTWVzc2FnZSA9IFIuc3RyaW5nLm11bHRpbmV0d29ya19jb25uZWN0aXZpdHlfdGVzdF8xX3ByZXJlcTsKKyAgICAgICAgICAgIG1UZXN0Q2FsbGJhY2sudGVzdFByb2dyZXNzKG1UZXN0UHJvZ3Jlc3NNZXNzYWdlKTsKKyAgICAgICAgICAgIG1WYWxpZGF0b3JTdGF0ZSA9IFdBSVRJTkdfRk9SX1VTRVJfSU5QVVQ7CisgICAgICAgICAgICByZXF1ZXN0VXNlckNvbmZpcm1hdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHZvaWQgb25XaWZpTmV0d29ya0Nvbm5lY3RlZChOZXR3b3JrIHdpZmlOZXR3b3JrKSB7CisgICAgICAgICAgICBzdXBlci5vbldpZmlOZXR3b3JrQ29ubmVjdGVkKHdpZmlOZXR3b3JrKTsKKyAgICAgICAgICAgIGlmIChpc0Nvbm5lY3RlZFRvRXhwZWN0ZWRXaWZpTmV0d29yaygpKSB7CisgICAgICAgICAgICAgICAgc3RhcnRUaW1lckNvdW50ZG93bkRpc3BsYXkoQ0VMTFVMQVJfTkVUV09SS19SRVNUT1JFX1RJTUVPVVRfTVMgLyAxMDAwKTsKKyAgICAgICAgICAgICAgICBtVGVzdENhbGxiYWNrLnRlc3RQcm9ncmVzcyhSLnN0cmluZy5tdWx0aW5ldHdvcmtfY29ubmVjdGl2aXR5X3Rlc3RfcHJvZ3Jlc3NfMik7CisKKyAgICAgICAgICAgICAgICAvLyBXYWl0IGZvciBDRUxMVUxBUl9ORVRXT1JLX1JFU1RPUkVfVElNRU9VVF9NUywgYmVmb3JlIGNoZWNraW5nIGlmIHRoZXJlIGlzIHN0aWxsCisgICAgICAgICAgICAgICAgLy8gdGhlIGFjdGl2ZSBuZXR3b3JrIGFzIHRoZSBjZWxsIG5ldHdvcmsuCisgICAgICAgICAgICAgICAgbU1haW5IYW5kbGVyLnBvc3REZWxheWVkKCgpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgc3RvcFRpbWVyQ291bnRkb3duRGlzcGxheSgpOworICAgICAgICAgICAgICAgICAgICBtTWFpbkhhbmRsZXIucG9zdCgoKSAtPiB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNFeHBlY3RlZFRyYW5zcG9ydEZvckFjdGl2ZU5ldHdvcmsoVFJBTlNQT1JUX0NFTExVTEFSKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpc05ldHdvcmtDb25uZWN0ZWQod2lmaU5ldHdvcmspKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUEFTUyB0ZXN0IGFzIGRldmljZSBoYXMgY29ubmVjdGl2aXR5Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kVGVzdCh0cnVlLCBSLnN0cmluZy5tdWx0aW5ldHdvcmtfc3RhdHVzX21vYmlsZV9yZXN0b3JlX3N1Y2Nlc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJGYWlsIHRlc3QgYXMgZGV2aWNlIGRpZG4ndCBoYXZlIGNvbm5lY3Rpdml0eSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZFRlc3QoZmFsc2UsIFIuc3RyaW5nLm11bHRpbmV0d29ya19zdGF0dXNfbW9iaWxlX3Jlc3RvcmVfZmFpbGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgfSwgQ0VMTFVMQVJfTkVUV09SS19SRVNUT1JFX1RJTUVPVVRfTVMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlbmRUZXN0KGZhbHNlLCBSLnN0cmluZy5tdWx0aW5ldHdvcmtfc3RhdHVzX3dpZmlfY29ubmVjdF93cm9uZ19hcCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoYXQgZGV2aWNlIHJlc3RvcmVzIGxvc3QgY2VsbHVsYXIgY29ubmVjdGl2aXR5IHdoZW4gaXQncyBjb25uZWN0ZWQgdG8gYW4gYWNjZXNzCisgICAgICogcG9pbnQgd2hpY2ggbG9zZXMgaW50ZXJuZXQgY29ubmVjdGl2aXR5LgorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgQ29ubmVjdFRvV2lmaVdpdGhJbnRlcm1pdHRlbnRJbnRlcm5ldFZhbGlkYXRvciBleHRlbmRzIE11bHRpTmV0d29ya1ZhbGlkYXRvciB7CisgICAgICAgIGJvb2xlYW4gbVdhaXRpbmdGb3JXaWZpQ29ubmVjdCA9IGZhbHNlOworICAgICAgICBib29sZWFuIG1XYWl0aW5nRm9yQ2VsbHVhclRvQ29ubmVjdEJhY2sgPSBmYWxzZTsKKyAgICAgICAgTmV0d29yayBtV2lmaU5ldHdvcms7CisKKyAgICAgICAgQ29ubmVjdFRvV2lmaVdpdGhJbnRlcm1pdHRlbnRJbnRlcm5ldFZhbGlkYXRvcihpbnQgZGVzY3JpcHRpb24pIHsKKyAgICAgICAgICAgIHN1cGVyKG1NdWx0aW5ldHdvcmtUZXN0Q2FsbGJhY2ssICJub19pbnRlcm5ldF90ZXN0IiwgZGVzY3JpcHRpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHZvaWQgY29udGludWVXaXRoVGVzdCgpIHsKKyAgICAgICAgICAgIHN1cGVyLmNvbnRpbnVlV2l0aFRlc3QoKTsKKyAgICAgICAgICAgIGlmIChtV2FpdGluZ0ZvcldpZmlDb25uZWN0KSB7CisgICAgICAgICAgICAgICAgY29ubmVjdFRvV2lmaSgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChtV2FpdGluZ0ZvckNlbGx1YXJUb0Nvbm5lY3RCYWNrKSB7CisgICAgICAgICAgICAgICAgbVdhaXRpbmdGb3JDZWxsdWFyVG9Db25uZWN0QmFjayA9IGZhbHNlOworICAgICAgICAgICAgICAgIHdhaXRGb3JDb25uZWN0aXZpdHlSZXN0b3JlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgdm9pZCBvbkNvbnRpbnVlUHJlV2lmaUNvbm5lY3QoKSB7CisgICAgICAgICAgICBtVGVzdFByb2dyZXNzTWVzc2FnZSA9IFIuc3RyaW5nLm11bHRpbmV0d29ya19jb25uZWN0aXZpdHlfdGVzdF8yX3ByZXJlcV8xOworICAgICAgICAgICAgbVRlc3RDYWxsYmFjay50ZXN0UHJvZ3Jlc3MobVRlc3RQcm9ncmVzc01lc3NhZ2UpOworICAgICAgICAgICAgbVZhbGlkYXRvclN0YXRlID0gV0FJVElOR19GT1JfVVNFUl9JTlBVVDsKKyAgICAgICAgICAgIG1XYWl0aW5nRm9yV2lmaUNvbm5lY3QgPSB0cnVlOworICAgICAgICAgICAgcmVxdWVzdFVzZXJDb25maXJtYXRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICB2b2lkIGNvbm5lY3RUb1dpZmkoKSB7CisgICAgICAgICAgICBtVGVzdENhbGxiYWNrLnRlc3RQcm9ncmVzcyhSLnN0cmluZy5tdWx0aW5ldHdvcmtfY29ubmVjdGl2aXR5X3Rlc3RfY29ubmVjdF93aWZpKTsKKyAgICAgICAgICAgIG1Db25uZWN0aXZpdHlTdGF0ZS5jb25uZWN0VG9XaWZpTmV0d29yayh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICB2b2lkIG9uV2lmaU5ldHdvcmtDb25uZWN0ZWQoTmV0d29yayB3aWZpTmV0d29yaykgeworICAgICAgICAgICAgc3VwZXIub25XaWZpTmV0d29ya0Nvbm5lY3RlZCh3aWZpTmV0d29yayk7CisgICAgICAgICAgICBpZiAoaXNDb25uZWN0ZWRUb0V4cGVjdGVkV2lmaU5ldHdvcmsoKSkgeworICAgICAgICAgICAgICAgIC8vIElmIHRoZSBkZXZpY2UgaXMgY29ubmVjdGVkIHRvIHRoZSBleHBlY3RlZCBuZXR3b3JrLCB0aGVuIHVwZGF0ZSB0aGUgd2lmaQorICAgICAgICAgICAgICAgIC8vIG5ldHdvcmsgdG8gdGhlIGxhdGVzdC4KKyAgICAgICAgICAgICAgICBtV2lmaU5ldHdvcmsgPSB3aWZpTmV0d29yazsKKyAgICAgICAgICAgICAgICAvLyBEbyBmdXJ0aGVyIHByb2Nlc3Npbmcgb25seSB3aGVuIHRoZSB0ZXN0IGlzIHJlcXVlc3RpbmcgYW5kIHdhaXRpbmcgZm9yIGEgd2lmaQorICAgICAgICAgICAgICAgIC8vIGNvbm5lY3Rpb24uCisgICAgICAgICAgICAgICAgaWYgKG1XYWl0aW5nRm9yV2lmaUNvbm5lY3QpIHsKKyAgICAgICAgICAgICAgICAgICAgbVdhaXRpbmdGb3JXaWZpQ29ubmVjdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWVyQ291bnRkb3duRGlzcGxheShXSUZJX05FVFdPUktfQ09OTkVDVF9UT19CRV9BQ1RJVkVfTVMgLyAxMDAwKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBXYWl0IGZvciBXSUZJX05FVFdPUktfQ09OTkVDVF9UT19CRV9BQ1RJVkVfTVMsIGJlZm9yZSBjaGVja2luZworICAgICAgICAgICAgICAgICAgICAvLyBpZiBkZXZpY2UgaGFzIHRoZSBhY3RpdmUgbmV0d29yayBhcyB3aWZpIG5ldHdvcmsuLgorICAgICAgICAgICAgICAgICAgICBtVGVzdENhbGxiYWNrLnRlc3RQcm9ncmVzcyhSLnN0cmluZy5tdWx0aW5ldHdvcmtfY29ubmVjdGl2aXR5X3Rlc3RfcHJvZ3Jlc3NfMik7CisgICAgICAgICAgICAgICAgICAgIG1NYWluSGFuZGxlci5wb3N0RGVsYXllZCgoKSAtPiB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdG9wVGltZXJDb3VudGRvd25EaXNwbGF5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UgYm90aCBhY3RpdmUgYW5kIHBlZXIgYXJlIHNhbWUgYXMgV2lmaSBoYXMgaW50ZXJuZXQgYWNjZXNzLgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRXhwZWN0ZWRUcmFuc3BvcnRGb3JBY3RpdmVOZXR3b3JrKFRSQU5TUE9SVF9XSUZJKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpc05ldHdvcmtDb25uZWN0ZWQobVdpZmlOZXR3b3JrKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFzayB0aGUgdXNlciB0byB0dXJuIG9mZiB3aWZpIG9uIHRoZSByb3V0ZXIgYW5kIGNoZWNrIGNvbm5lY3Rpdml0eS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGVzdFByb2dyZXNzTWVzc2FnZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5tdWx0aW5ldHdvcmtfY29ubmVjdGl2aXR5X3Rlc3RfMl9wcmVyZXFfMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmFsaWRhdG9yU3RhdGUgPSBXQUlUSU5HX0ZPUl9VU0VSX0lOUFVUOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UZXN0Q2FsbGJhY2sudGVzdFByb2dyZXNzKG1UZXN0UHJvZ3Jlc3NNZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2FpdGluZ0ZvckNlbGx1YXJUb0Nvbm5lY3RCYWNrID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VXNlckNvbmZpcm1hdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJGYWlsIHRlc3QgYXMgZGV2aWNlIGRpZG4ndCBoYXZlIGNvbm5lY3Rpdml0eSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZFRlc3QoZmFsc2UsIFIuc3RyaW5nLm11bHRpbmV0d29ya19zdGF0dXNfd2lmaV9jb25uZWN0aXZpdHlfZmFpbGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSwgV0lGSV9ORVRXT1JLX0NPTk5FQ1RfVE9fQkVfQUNUSVZFX01TKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGVuZFRlc3QoZmFsc2UsIFIuc3RyaW5nLm11bHRpbmV0d29ya19zdGF0dXNfd2lmaV9jb25uZWN0X3dyb25nX2FwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICB2b2lkIHJlc2V0KCkgeworICAgICAgICAgICAgc3VwZXIucmVzZXQoKTsKKyAgICAgICAgICAgIG1XYWl0aW5nRm9yQ2VsbHVhclRvQ29ubmVjdEJhY2sgPSBmYWxzZTsKKyAgICAgICAgICAgIG1XYWl0aW5nRm9yV2lmaUNvbm5lY3QgPSBmYWxzZTsKKyAgICAgICAgICAgIG1XaWZpTmV0d29yayA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgdm9pZCBvbldpZmlOZXR3b3JrVW5hdmFpbGFibGUoKSB7CisgICAgICAgICAgICBpZiAobVdhaXRpbmdGb3JXaWZpQ29ubmVjdCkgeworICAgICAgICAgICAgICAgIHN1cGVyLm9uV2lmaU5ldHdvcmtVbmF2YWlsYWJsZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdm9pZCB3YWl0Rm9yQ29ubmVjdGl2aXR5UmVzdG9yZSgpIHsKKyAgICAgICAgICAgIG1UZXN0Q2FsbGJhY2sudGVzdFByb2dyZXNzKFIuc3RyaW5nLm11bHRpbmV0d29ya19jb25uZWN0aXZpdHlfdGVzdF9wcm9ncmVzc18xKTsKKyAgICAgICAgICAgIG1Db25uZWN0aXZpdHlNYW5hZ2VyLnJlcG9ydE5ldHdvcmtDb25uZWN0aXZpdHkobVdpZmlOZXR3b3JrLCBmYWxzZSk7CisgICAgICAgICAgICBzdGFydFRpbWVyQ291bnRkb3duRGlzcGxheSgKKyAgICAgICAgICAgICAgICAgICAgQ0VMTFVMQVJfTkVUV09SS19SRVNUT1JFX0FGVEVSX1dJRklfSU5URVJORVRfTE9TVF9USU1FT1VUX01TIC8gMTAwMCk7CisgICAgICAgICAgICAvLyBXYWl0IGZvciBDRUxMVUxBUl9ORVRXT1JLX1JFU1RPUkVfQUZURVJfV0lGSV9JTlRFUk5FVF9MT1NUX1RJTUVPVVRfTVMsCisgICAgICAgICAgICAvLyBiZWZvcmUgY2hlY2tpbmcgaWYgZGV2aWNlIG5vdyBoYXMgdGhlIGFjdGl2ZSBuZXR3b3JrIGFzIGNlbGwgbmV0d29yay4KKyAgICAgICAgICAgIG1NYWluSGFuZGxlci5wb3N0RGVsYXllZCgoKSAtPiB7CisgICAgICAgICAgICAgICAgc3RvcFRpbWVyQ291bnRkb3duRGlzcGxheSgpOworICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGRldmljZSBoYXMgZmFsbGVuIGJhY2sgdG8gY2VsbHVsYXIgbmV0d29yayB3aGVuIGl0IGxvc2VzIGludGVybmV0IGFjY2VzcworICAgICAgICAgICAgICAgIC8vIGluIHRoZSB3aWZpIG5ldHdvcmsuCisgICAgICAgICAgICAgICAgaWYgKGlzRXhwZWN0ZWRUcmFuc3BvcnRGb3JBY3RpdmVOZXR3b3JrKFRSQU5TUE9SVF9DRUxMVUxBUikKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGlzTmV0d29ya0Nvbm5lY3RlZChtV2lmaU5ldHdvcmspKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlBBU1MgdGVzdCBhcyBkZXZpY2UgaGFzIGNvbm5lY3Rpdml0eSIpOworICAgICAgICAgICAgICAgICAgICBlbmRUZXN0KHRydWUsIFIuc3RyaW5nLm11bHRpbmV0d29ya19zdGF0dXNfbW9iaWxlX3Jlc3RvcmVfc3VjY2Vzcyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRmFpbCB0ZXN0IGFzIGRldmljZSBkaWRuJ3QgaGF2ZSBjb25uZWN0aXZpdHkiKTsKKyAgICAgICAgICAgICAgICAgICAgZW5kVGVzdChmYWxzZSwgUi5zdHJpbmcubXVsdGluZXR3b3JrX3N0YXR1c19tb2JpbGVfcmVzdG9yZV9mYWlsZWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sIENFTExVTEFSX05FVFdPUktfUkVTVE9SRV9BRlRFUl9XSUZJX0lOVEVSTkVUX0xPU1RfVElNRU9VVF9NUyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbmZjL0xsY3BWZXJzaW9uQWN0aXZpdHkuamF2YSBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9uZmMvTGxjcFZlcnNpb25BY3Rpdml0eS5qYXZhCmluZGV4IDc2ODIwNzguLmNlNWEzZDQgMTAwNjQ0Ci0tLSBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9uZmMvTGxjcFZlcnNpb25BY3Rpdml0eS5qYXZhCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9uZmMvTGxjcFZlcnNpb25BY3Rpdml0eS5qYXZhCkBAIC0xOSw4ICsxOSw2IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLlBhc3NGYWlsQnV0dG9uczsKIGltcG9ydCBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIuUjsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ2RkVGVzdDsKLQogaW1wb3J0IGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nOwogaW1wb3J0IGFuZHJvaWQuYXBwLkRpYWxvZzsKIGltcG9ydCBhbmRyb2lkLm5mYy5OZGVmTWVzc2FnZTsKQEAgLTM3LDcgKzM1LDYgQEAKIC8qKgogICogVGVzdCBhY3Rpdml0eSB0aGF0IHNlbmRzIGEgcGFydGljdWxhciBOREVGIFB1c2ggbWVzc2FnZSB0byBhbm90aGVyIE5GQyBkZXZpY2UuCiAgKi8KLUBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjQuNC9DLTEtMyIpCiBwdWJsaWMgY2xhc3MgTGxjcFZlcnNpb25BY3Rpdml0eSBleHRlbmRzIFBhc3NGYWlsQnV0dG9ucy5BY3Rpdml0eSBpbXBsZW1lbnRzCiAgICAgICAgIE5mY0FkYXB0ZXIuQ3JlYXRlTmRlZk1lc3NhZ2VDYWxsYmFjayB7CiAKZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9uZmMvTmRlZlB1c2hSZWNlaXZlckFjdGl2aXR5LmphdmEgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbmZjL05kZWZQdXNoUmVjZWl2ZXJBY3Rpdml0eS5qYXZhCmluZGV4IDM2NDRjY2IuLjA2OTdiZTIgMTAwNjQ0Ci0tLSBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9uZmMvTmRlZlB1c2hSZWNlaXZlckFjdGl2aXR5LmphdmEKKysrIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL25mYy9OZGVmUHVzaFJlY2VpdmVyQWN0aXZpdHkuamF2YQpAQCAtMjAsOCArMjAsNiBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5SOwogaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5uZmMudGVjaC5OZmNVdGlsczsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ2RkVGVzdDsKLQogaW1wb3J0IGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nOwogaW1wb3J0IGFuZHJvaWQuYXBwLkRpYWxvZzsKIGltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwpAQCAtMzYsNyArMzQsNiBAQAogLyoqCiAgKiBUZXN0IGFjdGl2aXR5IHRoYXQgd2FpdHMgdG8gcmVjZWl2ZSBhIHBhcnRpY3VsYXIgTkRFRiBQdXNoIG1lc3NhZ2UgZnJvbSBhbm90aGVyIE5GQyBkZXZpY2UuCiAgKi8KLUBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjQuNC9DLTEtNCxDLTEtNSIpCiBwdWJsaWMgY2xhc3MgTmRlZlB1c2hSZWNlaXZlckFjdGl2aXR5IGV4dGVuZHMgUGFzc0ZhaWxCdXR0b25zLkFjdGl2aXR5IHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBORkNfTk9UX0VOQUJMRURfRElBTE9HX0lEID0gMTsKZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9uZmMvTmRlZlB1c2hTZW5kZXJBY3Rpdml0eS5qYXZhIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL25mYy9OZGVmUHVzaFNlbmRlckFjdGl2aXR5LmphdmEKaW5kZXggM2UzMmFkNi4uMmY3Nzg5NSAxMDA2NDQKLS0tIGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL25mYy9OZGVmUHVzaFNlbmRlckFjdGl2aXR5LmphdmEKKysrIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL25mYy9OZGVmUHVzaFNlbmRlckFjdGl2aXR5LmphdmEKQEAgLTE5LDggKzE5LDYgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIuUGFzc0ZhaWxCdXR0b25zOwogaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5SOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DZGRUZXN0OwotCiBpbXBvcnQgYW5kcm9pZC5hcHAuRGlhbG9nOwogaW1wb3J0IGFuZHJvaWQubmZjLk5kZWZNZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQubmZjLk5kZWZSZWNvcmQ7CkBAIC0zNSw3ICszMyw2IEBACiAvKioKICAqIFRlc3QgYWN0aXZpdHkgdGhhdCBzZW5kcyBhIHBhcnRpY3VsYXIgTkRFRiBQdXNoIG1lc3NhZ2UgdG8gYW5vdGhlciBORkMgZGV2aWNlLgogICovCi1AQ2RkVGVzdChyZXF1aXJlbWVudD0iNy40LjQvQy0xLTQsQy0xLTUsQy0xLTEwIikKIHB1YmxpYyBjbGFzcyBOZGVmUHVzaFNlbmRlckFjdGl2aXR5IGV4dGVuZHMgUGFzc0ZhaWxCdXR0b25zLkFjdGl2aXR5IGltcGxlbWVudHMKICAgICAgICAgTmZjQWRhcHRlci5DcmVhdGVOZGVmTWVzc2FnZUNhbGxiYWNrIHsKIApkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL25mYy9oY2UvRHVhbE5vblBheW1lbnRFbXVsYXRvckFjdGl2aXR5LmphdmEgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbmZjL2hjZS9EdWFsTm9uUGF5bWVudEVtdWxhdG9yQWN0aXZpdHkuamF2YQppbmRleCA4NzdhZTRhLi4wYTkzNjJhIDEwMDY0NAotLS0gYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbmZjL2hjZS9EdWFsTm9uUGF5bWVudEVtdWxhdG9yQWN0aXZpdHkuamF2YQorKysgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbmZjL2hjZS9EdWFsTm9uUGF5bWVudEVtdWxhdG9yQWN0aXZpdHkuamF2YQpAQCAtNSwxMiArNSw5IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ2RkVGVzdDsKLQogaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5SOwogaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5uZmMuTmZjRGlhbG9nczsKIAotQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuNC40L0MtMi0yIikKIHB1YmxpYyBjbGFzcyBEdWFsTm9uUGF5bWVudEVtdWxhdG9yQWN0aXZpdHkgZXh0ZW5kcyBCYXNlRW11bGF0b3JBY3Rpdml0eSB7CiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewpkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL25mYy9oY2UvRHVhbFBheW1lbnRFbXVsYXRvckFjdGl2aXR5LmphdmEgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbmZjL2hjZS9EdWFsUGF5bWVudEVtdWxhdG9yQWN0aXZpdHkuamF2YQppbmRleCA2MjZhNzlmLi5jMTdmYzJlIDEwMDY0NAotLS0gYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbmZjL2hjZS9EdWFsUGF5bWVudEVtdWxhdG9yQWN0aXZpdHkuamF2YQorKysgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbmZjL2hjZS9EdWFsUGF5bWVudEVtdWxhdG9yQWN0aXZpdHkuamF2YQpAQCAtNywxMiArNyw5IEBACiBpbXBvcnQgYW5kcm9pZC5uZmMuY2FyZGVtdWxhdGlvbi5DYXJkRW11bGF0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DZGRUZXN0OwotCiBpbXBvcnQgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLlI7CiBpbXBvcnQgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLm5mYy5OZmNEaWFsb2dzOwogCi1AQ2RkVGVzdChyZXF1aXJlbWVudD0iNy40LjQvQy0yLTIiKQogQFRhcmdldEFwaSgxOSkKIHB1YmxpYyBjbGFzcyBEdWFsUGF5bWVudEVtdWxhdG9yQWN0aXZpdHkgZXh0ZW5kcyBCYXNlRW11bGF0b3JBY3Rpdml0eSB7CiAgICAgZmluYWwgc3RhdGljIGludCBTVEFURV9JRExFID0gMDsKZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9uZmMvaGNlL0ZvcmVncm91bmRQYXltZW50RW11bGF0b3JBY3Rpdml0eS5qYXZhIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL25mYy9oY2UvRm9yZWdyb3VuZFBheW1lbnRFbXVsYXRvckFjdGl2aXR5LmphdmEKaW5kZXggMzI1NzEzYzUuLjI3Y2IwNjEgMTAwNjQ0Ci0tLSBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9uZmMvaGNlL0ZvcmVncm91bmRQYXltZW50RW11bGF0b3JBY3Rpdml0eS5qYXZhCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9uZmMvaGNlL0ZvcmVncm91bmRQYXltZW50RW11bGF0b3JBY3Rpdml0eS5qYXZhCkBAIC04LDEyICs4LDkgQEAKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DZGRUZXN0OwotCiBpbXBvcnQgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLlI7CiBpbXBvcnQgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLm5mYy5OZmNEaWFsb2dzOwogCi1AQ2RkVGVzdChyZXF1aXJlbWVudD0iNy40LjQvQy0yLTIiKQogQFRhcmdldEFwaSgxOSkKIHB1YmxpYyBjbGFzcyBGb3JlZ3JvdW5kUGF5bWVudEVtdWxhdG9yQWN0aXZpdHkgZXh0ZW5kcyBCYXNlRW11bGF0b3JBY3Rpdml0eSB7CiAKZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9uZmMvaGNlL0hjZUVtdWxhdG9yVGVzdEFjdGl2aXR5LmphdmEgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbmZjL2hjZS9IY2VFbXVsYXRvclRlc3RBY3Rpdml0eS5qYXZhCmluZGV4IGFhZDVmMjcuLmIzMGJiNzMgMTAwNjQ0Ci0tLSBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9uZmMvaGNlL0hjZUVtdWxhdG9yVGVzdEFjdGl2aXR5LmphdmEKKysrIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL25mYy9oY2UvSGNlRW11bGF0b3JUZXN0QWN0aXZpdHkuamF2YQpAQCAtMjEsOCArMjEsNiBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5SOwogaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5UZXN0TGlzdEFkYXB0ZXIuVGVzdExpc3RJdGVtOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DZGRUZXN0OwotCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5uZmMuTmZjQWRhcHRlcjsKQEAgLTMxLDcgKzI5LDYgQEAKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIAogLyoqIEFjdGl2aXR5IHRoYXQgbGlzdHMgYWxsIHRoZSBORkMgSENFIGVtdWxhdG9yIHRlc3RzLiAqLwotQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuNC40L0MtMi0yIikKIHB1YmxpYyBjbGFzcyBIY2VFbXVsYXRvclRlc3RBY3Rpdml0eSBleHRlbmRzIFBhc3NGYWlsQnV0dG9ucy5UZXN0TGlzdEFjdGl2aXR5IHsKIAogICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL25mYy9oY2UvUHJvdG9jb2xQYXJhbXNSZWFkZXJBY3Rpdml0eS5qYXZhIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL25mYy9oY2UvUHJvdG9jb2xQYXJhbXNSZWFkZXJBY3Rpdml0eS5qYXZhCmluZGV4IGI3MDcyZjUuLmQzNTA0ZmYgMTAwNjQ0Ci0tLSBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9uZmMvaGNlL1Byb3RvY29sUGFyYW1zUmVhZGVyQWN0aXZpdHkuamF2YQorKysgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbmZjL2hjZS9Qcm90b2NvbFBhcmFtc1JlYWRlckFjdGl2aXR5LmphdmEKQEAgLTksMTQgKzksMTEgQEAKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ2RkVGVzdDsKLQogaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5QYXNzRmFpbEJ1dHRvbnM7CiBpbXBvcnQgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLlI7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogCi1AQ2RkVGVzdChyZXF1aXJlbWVudD0iNy40LjQvQy0yLTIsQy0yLTIiKQogQFRhcmdldEFwaSgxOSkKIHB1YmxpYyBjbGFzcyBQcm90b2NvbFBhcmFtc1JlYWRlckFjdGl2aXR5IGV4dGVuZHMgUGFzc0ZhaWxCdXR0b25zLkFjdGl2aXR5IGltcGxlbWVudHMgUmVhZGVyQ2FsbGJhY2sgewogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJQcm90b2NvbFBhcmFtc1JlYWRlckFjdGl2aXR5IjsKZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9uZmMvaGNlL1NpbmdsZU5vblBheW1lbnRFbXVsYXRvckFjdGl2aXR5LmphdmEgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbmZjL2hjZS9TaW5nbGVOb25QYXltZW50RW11bGF0b3JBY3Rpdml0eS5qYXZhCmluZGV4IDk4ODQ5OWYuLjY5NDE5OWIgMTAwNjQ0Ci0tLSBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9uZmMvaGNlL1NpbmdsZU5vblBheW1lbnRFbXVsYXRvckFjdGl2aXR5LmphdmEKKysrIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL25mYy9oY2UvU2luZ2xlTm9uUGF5bWVudEVtdWxhdG9yQWN0aXZpdHkuamF2YQpAQCAtNSwxMiArNSw5IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ2RkVGVzdDsKLQogaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5SOwogaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5uZmMuTmZjRGlhbG9nczsKIAotQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuNC40L0MtMi0yIikKIHB1YmxpYyBjbGFzcyBTaW5nbGVOb25QYXltZW50RW11bGF0b3JBY3Rpdml0eSBleHRlbmRzIEJhc2VFbXVsYXRvckFjdGl2aXR5IHsKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbmZjL2hjZS9TaW5nbGVQYXltZW50RW11bGF0b3JBY3Rpdml0eS5qYXZhIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL25mYy9oY2UvU2luZ2xlUGF5bWVudEVtdWxhdG9yQWN0aXZpdHkuamF2YQppbmRleCBkZWFiNmEwLi4wZjFmYmEwIDEwMDY0NAotLS0gYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbmZjL2hjZS9TaW5nbGVQYXltZW50RW11bGF0b3JBY3Rpdml0eS5qYXZhCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9uZmMvaGNlL1NpbmdsZVBheW1lbnRFbXVsYXRvckFjdGl2aXR5LmphdmEKQEAgLTgsOSArOCw2IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLlI7CiBpbXBvcnQgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLm5mYy5OZmNEaWFsb2dzOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DZGRUZXN0OwotCi1AQ2RkVGVzdChyZXF1aXJlbWVudD0iNy40LjQvQy0yLTIiKQogQFRhcmdldEFwaSgxOSkKIHB1YmxpYyBjbGFzcyBTaW5nbGVQYXltZW50RW11bGF0b3JBY3Rpdml0eSBleHRlbmRzIEJhc2VFbXVsYXRvckFjdGl2aXR5IHsKICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9uZmMvaGNlL1RhcFRlc3RFbXVsYXRvckFjdGl2aXR5LmphdmEgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbmZjL2hjZS9UYXBUZXN0RW11bGF0b3JBY3Rpdml0eS5qYXZhCmluZGV4IDY2NWZiYTI0Li4yZWVhODljIDEwMDY0NAotLS0gYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbmZjL2hjZS9UYXBUZXN0RW11bGF0b3JBY3Rpdml0eS5qYXZhCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9uZmMvaGNlL1RhcFRlc3RFbXVsYXRvckFjdGl2aXR5LmphdmEKQEAgLTcsMTIgKzcsOSBAQAogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DZGRUZXN0OwotCiBpbXBvcnQgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLlI7CiBpbXBvcnQgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLm5mYy5OZmNEaWFsb2dzOwogCi1AQ2RkVGVzdChyZXF1aXJlbWVudD0iNy40LjQvQy0yLTIiKQogQFRhcmdldEFwaSgxOSkKIHB1YmxpYyBjbGFzcyBUYXBUZXN0RW11bGF0b3JBY3Rpdml0eSBleHRlbmRzIEJhc2VFbXVsYXRvckFjdGl2aXR5IHsKICAgICBUZXh0VmlldyBtVGV4dFZpZXc7CmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbmZjL2hjZWYvSGNlRkVtdWxhdG9yQWN0aXZpdHkuamF2YSBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9uZmMvaGNlZi9IY2VGRW11bGF0b3JBY3Rpdml0eS5qYXZhCmluZGV4IGZjMmJmYzYuLjcxMThhZTMgMTAwNjQ0Ci0tLSBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9uZmMvaGNlZi9IY2VGRW11bGF0b3JBY3Rpdml0eS5qYXZhCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9uZmMvaGNlZi9IY2VGRW11bGF0b3JBY3Rpdml0eS5qYXZhCkBAIC0yNCwxMiArMjQsOSBAQAogaW1wb3J0IGFuZHJvaWQubmZjLmNhcmRlbXVsYXRpb24uTmZjRkNhcmRFbXVsYXRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNkZFRlc3Q7Ci0KIGltcG9ydCBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIuUGFzc0ZhaWxCdXR0b25zOwogaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5SOwogCi1AQ2RkVGVzdChyZXF1aXJlbWVudD0iNy40LjQvQy0zLTIiKQogcHVibGljIGNsYXNzIEhjZUZFbXVsYXRvckFjdGl2aXR5IGV4dGVuZHMgUGFzc0ZhaWxCdXR0b25zLkFjdGl2aXR5ewogICAgIHN0YXRpYyBTdHJpbmcgQUNUSU9OX1RFU1RfU1VDQ0VTUyA9ICJzdWNjZXNzIjsKIApkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL25mYy9oY2VmL0hjZUZSZWFkZXJBY3Rpdml0eS5qYXZhIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL25mYy9oY2VmL0hjZUZSZWFkZXJBY3Rpdml0eS5qYXZhCmluZGV4IDM1MWU3OWIuLjliMGQ2NjkgMTAwNjQ0Ci0tLSBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9uZmMvaGNlZi9IY2VGUmVhZGVyQWN0aXZpdHkuamF2YQorKysgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbmZjL2hjZWYvSGNlRlJlYWRlckFjdGl2aXR5LmphdmEKQEAgLTI2LDE0ICsyNiwxMSBAQAogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3Lk9uSXRlbVNlbGVjdGVkTGlzdGVuZXI7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNkZFRlc3Q7Ci0KIGltcG9ydCBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIuUGFzc0ZhaWxCdXR0b25zOwogaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5SOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAotQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuNC40L0MtMy0yIikKIEBUYXJnZXRBcGkoMjQpCiBwdWJsaWMgY2xhc3MgSGNlRlJlYWRlckFjdGl2aXR5IGV4dGVuZHMgUGFzc0ZhaWxCdXR0b25zLkFjdGl2aXR5IGltcGxlbWVudHMgUmVhZGVyQ2FsbGJhY2ssCiAgICAgICAgIE9uSXRlbVNlbGVjdGVkTGlzdGVuZXIgewpkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL25mYy90ZWNoL01pZmFyZVVsdHJhbGlnaHRUYWdUZXN0ZXIuamF2YSBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9uZmMvdGVjaC9NaWZhcmVVbHRyYWxpZ2h0VGFnVGVzdGVyLmphdmEKaW5kZXggODE4MDUxZi4uMDM4ZDI3NiAxMDA2NDQKLS0tIGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL25mYy90ZWNoL01pZmFyZVVsdHJhbGlnaHRUYWdUZXN0ZXIuamF2YQorKysgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbmZjL3RlY2gvTWlmYXJlVWx0cmFsaWdodFRhZ1Rlc3Rlci5qYXZhCkBAIC0xOSw4ICsxOSw2IEBACiBpbXBvcnQgYW5kcm9pZC5uZmMuVGFnOwogaW1wb3J0IGFuZHJvaWQubmZjLnRlY2guTWlmYXJlVWx0cmFsaWdodDsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ2RkVGVzdDsKLQogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwpAQCAtMjksNyArMjcsNiBAQAogICoge0BsaW5rIFRhZ1Rlc3Rlcn0gZm9yIE1JRkFSRSBVbHRyYWxpZ2h0IHRhZ3MuIEl0IHdyaXRlcyByYW5kb20gYnl0ZXMgdG8gdGhlCiAgKiB0YWcncyBmaXJzdCB1c2VyIHBhZ2UgYW5kIHZlcmlmaWVzIHRoYXQgaXQgbWF0Y2hlcyB3aGVuIHNjYW5uZWQgbGF0ZXIuCiAgKi8KLUBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjQuNC9DLTQtMSIpCiBwdWJsaWMgY2xhc3MgTWlmYXJlVWx0cmFsaWdodFRhZ1Rlc3RlciBpbXBsZW1lbnRzIFRhZ1Rlc3RlciB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVVNFUl9QQUdFX09GRlNFVCA9IDU7CmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbm90aWZpY2F0aW9ucy9BdHRlbnRpb25NYW5hZ2VtZW50VmVyaWZpZXJBY3Rpdml0eS5qYXZhIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL25vdGlmaWNhdGlvbnMvQXR0ZW50aW9uTWFuYWdlbWVudFZlcmlmaWVyQWN0aXZpdHkuamF2YQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGRkZmEyODMuLjg3NjRkYmUKLS0tIGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL25vdGlmaWNhdGlvbnMvQXR0ZW50aW9uTWFuYWdlbWVudFZlcmlmaWVyQWN0aXZpdHkuamF2YQorKysgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbm90aWZpY2F0aW9ucy9BdHRlbnRpb25NYW5hZ2VtZW50VmVyaWZpZXJBY3Rpdml0eS5qYXZhCkBAIC0yOCw3ICsyOCw5IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50Lk9wZXJhdGlvbkFwcGxpY2F0aW9uRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9BdHRyaWJ1dGVzOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdDsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkVtYWlsOwpAQCAtMzcsNyArMzksOSBAQAogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5SOworCiBpbXBvcnQgb3JnLmpzb24uSlNPTkV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuanNvbi5KU09OT2JqZWN0OwogCkBAIC01Miw2ICs1Niw4IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9USUZJQ0FUSU9OX0NIQU5ORUxfSUQgPSBUQUc7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVElGSUNBVElPTl9DSEFOTkVMX0lEX05PSVNZID0gVEFHICsgIi9ub2lzeSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVElGSUNBVElPTl9DSEFOTkVMX0lEX01FRElBID0gVEFHICsgIi9tZWRpYSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVElGSUNBVElPTl9DSEFOTkVMX0lEX0dBTUUgPSBUQUcgKyAiL2dhbWUiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTElDRSA9ICJBbGljZSI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFMSUNFX1BIT05FID0gIisxNjE3NTU1MTIxMiI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFMSUNFX0VNQUlMID0gImFsaWNlQF9mb28uX2JhciI7CkBAIC03MCw3ICs3Niw2IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFTkRfQyA9IDB4NDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VORF9BTEwgPSBTRU5EX0EgfCBTRU5EX0IgfCBTRU5EX0M7CiAKLQogICAgIHByaXZhdGUgVXJpIG1BbGljZVVyaTsKICAgICBwcml2YXRlIFVyaSBtQm9iVXJpOwogICAgIHByaXZhdGUgVXJpIG1DaGFybGllVXJpOwpAQCAtODksNiArOTQsNyBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIExpc3Q8SW50ZXJhY3RpdmVUZXN0Q2FzZT4gY3JlYXRlVGVzdEl0ZW1zKCkgeworCiAgICAgICAgIExpc3Q8SW50ZXJhY3RpdmVUZXN0Q2FzZT4gdGVzdHMgPSBuZXcgQXJyYXlMaXN0PD4oMTcpOwogICAgICAgICBBY3Rpdml0eU1hbmFnZXIgYW0gPSAoQWN0aXZpdHlNYW5hZ2VyKSBnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQUNUSVZJVFlfU0VSVklDRSk7CiAgICAgICAgIGlmIChhbS5pc0xvd1JhbURldmljZSgpKSB7CkBAIC05OCw5ICsxMDQsMTggQEAKICAgICAgICAgICAgIHRlc3RzLmFkZChuZXcgSXNFbmFibGVkVGVzdCgpKTsKICAgICAgICAgICAgIHRlc3RzLmFkZChuZXcgU2VydmljZVN0YXJ0ZWRUZXN0KCkpOwogICAgICAgICAgICAgdGVzdHMuYWRkKG5ldyBJbnNlcnRDb250YWN0c1Rlc3QoKSk7Ci0gICAgICAgICAgICB0ZXN0cy5hZGQobmV3IE5vbmVJbnRlcmNlcHRzQWxsVGVzdCgpKTsKLSAgICAgICAgICAgIHRlc3RzLmFkZChuZXcgUHJpb3JpdHlJbnRlcmNlcHRzU29tZVRlc3QoKSk7Ci0gICAgICAgICAgICB0ZXN0cy5hZGQobmV3IEFsbEludGVyY2VwdHNOb3RoaW5nVGVzdCgpKTsKKyAgICAgICAgICAgIHRlc3RzLmFkZChuZXcgTm9uZUludGVyY2VwdHNBbGxNZXNzYWdlc1Rlc3QoKSk7CisgICAgICAgICAgICB0ZXN0cy5hZGQobmV3IE5vbmVJbnRlcmNlcHRzQWxhcm1FdmVudFJlbWluZGVyQ2F0ZWdvcmllc1Rlc3QoKSk7CisgICAgICAgICAgICB0ZXN0cy5hZGQobmV3IFByaW9yaXR5SW50ZXJjZXB0c1NvbWVNZXNzYWdlc1Rlc3QoKSk7CisKKyAgICAgICAgICAgIGlmIChnZXRBcHBsaWNhdGlvbkluZm8oKS50YXJnZXRTZGtWZXJzaW9uID4gQnVpbGQuVkVSU0lPTl9DT0RFUy5PX01SMSkgeworICAgICAgICAgICAgICAgIC8vIFRlc3RzIHRhcmdldGluZyBQIGFuZCBhYm92ZToKKyAgICAgICAgICAgICAgICB0ZXN0cy5hZGQobmV3IFByaW9yaXR5SW50ZXJjZXB0c0FsYXJtc1Rlc3QoKSk7CisgICAgICAgICAgICAgICAgdGVzdHMuYWRkKG5ldyBQcmlvcml0eUludGVyY2VwdHNNZWRpYVN5c3RlbU90aGVyVGVzdCgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGVzdHMuYWRkKG5ldyBBbGxJbnRlcmNlcHRzTm90aGluZ01lc3NhZ2VzVGVzdCgpKTsKKyAgICAgICAgICAgIHRlc3RzLmFkZChuZXcgQWxsSW50ZXJjZXB0c05vdGhpbmdEaWZmQ2F0ZWdvcmllc1Rlc3QoKSk7CiAgICAgICAgICAgICB0ZXN0cy5hZGQobmV3IERlZmF1bHRPcmRlclRlc3QoKSk7CiAgICAgICAgICAgICB0ZXN0cy5hZGQobmV3IFByaW9yaXR5T3JkZXJUZXN0KCkpOwogICAgICAgICAgICAgdGVzdHMuYWRkKG5ldyBJbnRlcnJ1cHRpb25PcmRlclRlc3QoKSk7CkBAIC0xMjEsMTEgKzEzNiwyNSBAQAogICAgICAgICAgICAgICAgIE5PVElGSUNBVElPTl9DSEFOTkVMX0lEX05PSVNZLCBOb3RpZmljYXRpb25NYW5hZ2VyLklNUE9SVEFOQ0VfSElHSCk7CiAgICAgICAgIG5vaXN5Q2hhbm5lbC5lbmFibGVWaWJyYXRpb24odHJ1ZSk7CiAgICAgICAgIG1ObS5jcmVhdGVOb3RpZmljYXRpb25DaGFubmVsKG5vaXN5Q2hhbm5lbCk7CisgICAgICAgIE5vdGlmaWNhdGlvbkNoYW5uZWwgbWVkaWFDaGFubmVsID0gbmV3IE5vdGlmaWNhdGlvbkNoYW5uZWwoTk9USUZJQ0FUSU9OX0NIQU5ORUxfSURfTUVESUEsCisgICAgICAgICAgICAgICAgTk9USUZJQ0FUSU9OX0NIQU5ORUxfSURfTUVESUEsIE5vdGlmaWNhdGlvbk1hbmFnZXIuSU1QT1JUQU5DRV9ISUdIKTsKKyAgICAgICAgQXVkaW9BdHRyaWJ1dGVzLkJ1aWxkZXIgYWEgPSBuZXcgQXVkaW9BdHRyaWJ1dGVzLkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRVc2FnZShBdWRpb0F0dHJpYnV0ZXMuVVNBR0VfTUVESUEpOworICAgICAgICBtZWRpYUNoYW5uZWwuc2V0U291bmQobnVsbCwgYWEuYnVpbGQoKSk7CisgICAgICAgIG1ObS5jcmVhdGVOb3RpZmljYXRpb25DaGFubmVsKG1lZGlhQ2hhbm5lbCk7CisgICAgICAgIE5vdGlmaWNhdGlvbkNoYW5uZWwgZ2FtZUNoYW5uZWwgPSBuZXcgTm90aWZpY2F0aW9uQ2hhbm5lbChOT1RJRklDQVRJT05fQ0hBTk5FTF9JRF9HQU1FLAorICAgICAgICAgICAgICAgIE5PVElGSUNBVElPTl9DSEFOTkVMX0lEX0dBTUUsIE5vdGlmaWNhdGlvbk1hbmFnZXIuSU1QT1JUQU5DRV9ISUdIKTsKKyAgICAgICAgQXVkaW9BdHRyaWJ1dGVzLkJ1aWxkZXIgYWEyID0gbmV3IEF1ZGlvQXR0cmlidXRlcy5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0VXNhZ2UoQXVkaW9BdHRyaWJ1dGVzLlVTQUdFX0dBTUUpOworICAgICAgICBnYW1lQ2hhbm5lbC5zZXRTb3VuZChudWxsLCBhYTIuYnVpbGQoKSk7CisgICAgICAgIG1ObS5jcmVhdGVOb3RpZmljYXRpb25DaGFubmVsKGdhbWVDaGFubmVsKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgZGVsZXRlQ2hhbm5lbHMoKSB7CiAgICAgICAgIG1ObS5kZWxldGVOb3RpZmljYXRpb25DaGFubmVsKE5PVElGSUNBVElPTl9DSEFOTkVMX0lEKTsKICAgICAgICAgbU5tLmRlbGV0ZU5vdGlmaWNhdGlvbkNoYW5uZWwoTk9USUZJQ0FUSU9OX0NIQU5ORUxfSURfTk9JU1kpOworICAgICAgICBtTm0uZGVsZXRlTm90aWZpY2F0aW9uQ2hhbm5lbChOT1RJRklDQVRJT05fQ0hBTk5FTF9JRF9NRURJQSk7CisgICAgICAgIG1ObS5kZWxldGVOb3RpZmljYXRpb25DaGFubmVsKE5PVElGSUNBVElPTl9DSEFOTkVMX0lEX0dBTUUpOwogICAgIH0KIAogICAgIC8vIFRlc3RzCkBAIC0yMTYsNyArMjQ1LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByb3RlY3RlZCBjbGFzcyBOb25lSW50ZXJjZXB0c0FsbFRlc3QgZXh0ZW5kcyBJbnRlcmFjdGl2ZVRlc3RDYXNlIHsKKyAgICBwcm90ZWN0ZWQgY2xhc3MgTm9uZUludGVyY2VwdHNBbGxNZXNzYWdlc1Rlc3QgZXh0ZW5kcyBJbnRlcmFjdGl2ZVRlc3RDYXNlIHsKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHByb3RlY3RlZCBWaWV3IGluZmxhdGUoVmlld0dyb3VwIHBhcmVudCkgewogICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUF1dG9JdGVtKHBhcmVudCwgUi5zdHJpbmcuYXR0ZW50aW9uX2FsbF9hcmVfZmlsdGVyZWQpOwpAQCAtMjQ0LDcgKzI3Myw3IEBACiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRhZyA9IHBheWxvYWQuZ2V0U3RyaW5nKEpTT05fVEFHKTsKICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB6ZW4gPSBwYXlsb2FkLmdldEJvb2xlYW4oSlNPTl9NQVRDSEVTX1pFTl9GSUxURVIpOwotICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsIHRhZyArICh6ZW4gPyAiIiA6ICIgbm90IikgKyAiIGludGVyY2VwdGVkIik7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgdGFnICsgKCF6ZW4gPyAiIiA6ICIgbm90IikgKyAiIGludGVyY2VwdGVkIik7CiAgICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZC5jb250YWlucyh0YWcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtdWx0aXBsZSBlbnRyaWVzIGZvciBzYW1lIG5vdGlmaWNhdGlvbiEKICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgPSBmYWxzZTsKQEAgLTI3NCwxOSArMzAzLDE5IEBACiAgICAgICAgICAgICBkZWxldGVDaGFubmVscygpOwogICAgICAgICAgICAgTW9ja0xpc3RlbmVyLmdldEluc3RhbmNlKCkucmVzZXREYXRhKCk7CiAgICAgICAgIH0KLQogICAgIH0KIAotICAgIHByb3RlY3RlZCBjbGFzcyBBbGxJbnRlcmNlcHRzTm90aGluZ1Rlc3QgZXh0ZW5kcyBJbnRlcmFjdGl2ZVRlc3RDYXNlIHsKKyAgICBwcm90ZWN0ZWQgY2xhc3MgTm9uZUludGVyY2VwdHNBbGFybUV2ZW50UmVtaW5kZXJDYXRlZ29yaWVzVGVzdCBleHRlbmRzIEludGVyYWN0aXZlVGVzdENhc2UgewogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHJvdGVjdGVkIFZpZXcgaW5mbGF0ZShWaWV3R3JvdXAgcGFyZW50KSB7Ci0gICAgICAgICAgICByZXR1cm4gY3JlYXRlQXV0b0l0ZW0ocGFyZW50LCBSLnN0cmluZy5hdHRlbnRpb25fbm9uZV9hcmVfZmlsdGVyZWQpOworICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUF1dG9JdGVtKHBhcmVudCwgUi5zdHJpbmcuYXR0ZW50aW9uX2FsbF9hcmVfZmlsdGVyZWQpOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgeworICAgICAgICAgICAgbU5tLnNldEludGVycnVwdGlvbkZpbHRlcihOb3RpZmljYXRpb25NYW5hZ2VyLklOVEVSUlVQVElPTl9GSUxURVJfTk9ORSk7CiAgICAgICAgICAgICBjcmVhdGVDaGFubmVscygpOwotICAgICAgICAgICAgc2VuZE5vdGlmaWNhdGlvbnMoTU9ERV9VUkksIGZhbHNlLCBmYWxzZSk7CisgICAgICAgICAgICBzZW5kRXZlbnRBbGFybVJlbWluZGVyTm90aWZpY2F0aW9ucyhTRU5EX0FMTCk7CiAgICAgICAgICAgICBzdGF0dXMgPSBSRUFEWTsKICAgICAgICAgfQogCkBAIC0zMDQsNyArMzMzLDY2IEBACiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRhZyA9IHBheWxvYWQuZ2V0U3RyaW5nKEpTT05fVEFHKTsKICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB6ZW4gPSBwYXlsb2FkLmdldEJvb2xlYW4oSlNPTl9NQVRDSEVTX1pFTl9GSUxURVIpOwotICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsIHRhZyArICh6ZW4gPyAiIiA6ICIgbm90IikgKyAiIGludGVyY2VwdGVkIik7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgdGFnICsgKCF6ZW4gPyAiIiA6ICIgbm90IikgKyAiIGludGVyY2VwdGVkIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZC5jb250YWlucyh0YWcpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBtdWx0aXBsZSBlbnRyaWVzIGZvciBzYW1lIG5vdGlmaWNhdGlvbiEKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBTElDRS5lcXVhbHModGFnKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQuYWRkKEFMSUNFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgJj0gIXplbjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChCT0IuZXF1YWxzKHRhZykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kLmFkZChCT0IpOworICAgICAgICAgICAgICAgICAgICAgICAgcGFzcyAmPSAhemVuOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKENIQVJMSUUuZXF1YWxzKHRhZykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kLmFkZChDSEFSTElFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgJj0gIXplbjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEpTT05FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBwYXNzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgImZhaWxlZCB0byB1bnBhY2sgZGF0YSBmcm9tIG1vY2tsaXN0ZW5lciIsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhc3MgJj0gZm91bmQuc2l6ZSgpID09IDM7CisgICAgICAgICAgICBzdGF0dXMgPSBwYXNzID8gUEFTUyA6IEZBSUw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7CisgICAgICAgICAgICBtTm0uY2FuY2VsQWxsKCk7CisgICAgICAgICAgICBkZWxldGVDaGFubmVscygpOworICAgICAgICAgICAgTW9ja0xpc3RlbmVyLmdldEluc3RhbmNlKCkucmVzZXREYXRhKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgY2xhc3MgQWxsSW50ZXJjZXB0c05vdGhpbmdNZXNzYWdlc1Rlc3QgZXh0ZW5kcyBJbnRlcmFjdGl2ZVRlc3RDYXNlIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBWaWV3IGluZmxhdGUoVmlld0dyb3VwIHBhcmVudCkgeworICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUF1dG9JdGVtKHBhcmVudCwgUi5zdHJpbmcuYXR0ZW50aW9uX25vbmVfYXJlX2ZpbHRlcmVkX21lc3NhZ2VzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgICAgIG1ObS5zZXRJbnRlcnJ1cHRpb25GaWx0ZXIoTm90aWZpY2F0aW9uTWFuYWdlci5JTlRFUlJVUFRJT05fRklMVEVSX0FMTCk7CisgICAgICAgICAgICBjcmVhdGVDaGFubmVscygpOworICAgICAgICAgICAgc2VuZE5vdGlmaWNhdGlvbnMoTU9ERV9VUkksIGZhbHNlLCBmYWxzZSk7IC8vIGRpZmZlcmVudCBtZXNzYWdlcworICAgICAgICAgICAgc3RhdHVzID0gUkVBRFk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgdGVzdCgpIHsKKyAgICAgICAgICAgIExpc3Q8SlNPTk9iamVjdD4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KE1vY2tMaXN0ZW5lci5nZXRJbnN0YW5jZSgpLmdldFBvc3RlZCgpKTsKKworICAgICAgICAgICAgU2V0PFN0cmluZz4gZm91bmQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgICAgICAgICBpZiAocmVzdWx0LnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRkFJTDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBib29sZWFuIHBhc3MgPSB0cnVlOworICAgICAgICAgICAgZm9yIChKU09OT2JqZWN0IHBheWxvYWQgOiByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGFnID0gcGF5bG9hZC5nZXRTdHJpbmcoSlNPTl9UQUcpOworICAgICAgICAgICAgICAgICAgICBib29sZWFuIHplbiA9IHBheWxvYWQuZ2V0Qm9vbGVhbihKU09OX01BVENIRVNfWkVOX0ZJTFRFUik7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgdGFnICsgKCF6ZW4gPyAiIiA6ICIgbm90IikgKyAiIGludGVyY2VwdGVkIik7CiAgICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZC5jb250YWlucyh0YWcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtdWx0aXBsZSBlbnRyaWVzIGZvciBzYW1lIG5vdGlmaWNhdGlvbiEKICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgPSBmYWxzZTsKQEAgLTMzNSwxOCArNDIzLDc3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgY2xhc3MgUHJpb3JpdHlJbnRlcmNlcHRzU29tZVRlc3QgZXh0ZW5kcyBJbnRlcmFjdGl2ZVRlc3RDYXNlIHsKKyAgICBwcm90ZWN0ZWQgY2xhc3MgQWxsSW50ZXJjZXB0c05vdGhpbmdEaWZmQ2F0ZWdvcmllc1Rlc3QgZXh0ZW5kcyBJbnRlcmFjdGl2ZVRlc3RDYXNlIHsKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHByb3RlY3RlZCBWaWV3IGluZmxhdGUoVmlld0dyb3VwIHBhcmVudCkgewotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUF1dG9JdGVtKHBhcmVudCwgUi5zdHJpbmcuYXR0ZW50aW9uX3NvbWVfYXJlX2ZpbHRlcmVkKTsKKyAgICAgICAgICAgIHJldHVybiBjcmVhdGVBdXRvSXRlbShwYXJlbnQsIFIuc3RyaW5nLmF0dGVudGlvbl9ub25lX2FyZV9maWx0ZXJlZF9kaWZmX2NhdGVnb3JpZXMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgeworICAgICAgICAgICAgbU5tLnNldEludGVycnVwdGlvbkZpbHRlcihOb3RpZmljYXRpb25NYW5hZ2VyLklOVEVSUlVQVElPTl9GSUxURVJfQUxMKTsKKyAgICAgICAgICAgIGNyZWF0ZUNoYW5uZWxzKCk7CisgICAgICAgICAgICBzZW5kRXZlbnRBbGFybVJlbWluZGVyTm90aWZpY2F0aW9ucyhTRU5EX0FMTCk7CisgICAgICAgICAgICBzdGF0dXMgPSBSRUFEWTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCB0ZXN0KCkgeworICAgICAgICAgICAgTGlzdDxKU09OT2JqZWN0PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oTW9ja0xpc3RlbmVyLmdldEluc3RhbmNlKCkuZ2V0UG9zdGVkKCkpOworCisgICAgICAgICAgICBTZXQ8U3RyaW5nPiBmb3VuZCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBGQUlMOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJvb2xlYW4gcGFzcyA9IHRydWU7CisgICAgICAgICAgICBmb3IgKEpTT05PYmplY3QgcGF5bG9hZCA6IHJlc3VsdCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0YWcgPSBwYXlsb2FkLmdldFN0cmluZyhKU09OX1RBRyk7CisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gemVuID0gcGF5bG9hZC5nZXRCb29sZWFuKEpTT05fTUFUQ0hFU19aRU5fRklMVEVSKTsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCB0YWcgKyAoIXplbiA/ICIiIDogIiBub3QiKSArICIgaW50ZXJjZXB0ZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kLmNvbnRhaW5zKHRhZykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG11bHRpcGxlIGVudHJpZXMgZm9yIHNhbWUgbm90aWZpY2F0aW9uIQorICAgICAgICAgICAgICAgICAgICAgICAgcGFzcyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEFMSUNFLmVxdWFscyh0YWcpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZC5hZGQoQUxJQ0UpOworICAgICAgICAgICAgICAgICAgICAgICAgcGFzcyAmPSB6ZW47CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQk9CLmVxdWFscyh0YWcpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZC5hZGQoQk9CKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgJj0gemVuOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKENIQVJMSUUuZXF1YWxzKHRhZykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kLmFkZChDSEFSTElFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgJj0gemVuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSlNPTkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHBhc3MgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiZmFpbGVkIHRvIHVucGFjayBkYXRhIGZyb20gbW9ja2xpc3RlbmVyIiwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcGFzcyAmPSBmb3VuZC5zaXplKCkgPT0gMzsKKyAgICAgICAgICAgIHN0YXR1cyA9IHBhc3MgPyBQQVNTIDogRkFJTDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKKyAgICAgICAgICAgIG1ObS5jYW5jZWxBbGwoKTsKKyAgICAgICAgICAgIGRlbGV0ZUNoYW5uZWxzKCk7CisgICAgICAgICAgICBNb2NrTGlzdGVuZXIuZ2V0SW5zdGFuY2UoKS5yZXNldERhdGEoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBjbGFzcyBQcmlvcml0eUludGVyY2VwdHNTb21lTWVzc2FnZXNUZXN0IGV4dGVuZHMgSW50ZXJhY3RpdmVUZXN0Q2FzZSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgVmlldyBpbmZsYXRlKFZpZXdHcm91cCBwYXJlbnQpIHsKKyAgICAgICAgICAgIHJldHVybiBjcmVhdGVBdXRvSXRlbShwYXJlbnQsIFIuc3RyaW5nLmF0dGVudGlvbl9zb21lX2FyZV9maWx0ZXJlZF9tZXNzYWdlcyk7CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7CiAgICAgICAgICAgICBtTm0uc2V0SW50ZXJydXB0aW9uRmlsdGVyKE5vdGlmaWNhdGlvbk1hbmFnZXIuSU5URVJSVVBUSU9OX0ZJTFRFUl9QUklPUklUWSk7CiAgICAgICAgICAgICBOb3RpZmljYXRpb25NYW5hZ2VyLlBvbGljeSBwb2xpY3kgPSBtTm0uZ2V0Tm90aWZpY2F0aW9uUG9saWN5KCk7Ci0gICAgICAgICAgICBwb2xpY3kgPSBuZXcgTm90aWZpY2F0aW9uTWFuYWdlci5Qb2xpY3kocG9saWN5LnByaW9yaXR5Q2F0ZWdvcmllcwotICAgICAgICAgICAgICAgICAgICB8IE5vdGlmaWNhdGlvbk1hbmFnZXIuUG9saWN5LlBSSU9SSVRZX0NBVEVHT1JZX01FU1NBR0VTLAorICAgICAgICAgICAgcG9saWN5ID0gbmV3IE5vdGlmaWNhdGlvbk1hbmFnZXIuUG9saWN5KAorICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25NYW5hZ2VyLlBvbGljeS5QUklPUklUWV9DQVRFR09SWV9NRVNTQUdFUywKICAgICAgICAgICAgICAgICAgICAgcG9saWN5LnByaW9yaXR5Q2FsbFNlbmRlcnMsCiAgICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbk1hbmFnZXIuUG9saWN5LlBSSU9SSVRZX1NFTkRFUlNfU1RBUlJFRCk7CiAgICAgICAgICAgICBtTm0uc2V0Tm90aWZpY2F0aW9uUG9saWN5KHBvbGljeSk7CkBAIC0zNjksNyArNTE2LDcgQEAKICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGFnID0gcGF5bG9hZC5nZXRTdHJpbmcoSlNPTl9UQUcpOwogICAgICAgICAgICAgICAgICAgICBib29sZWFuIHplbiA9IHBheWxvYWQuZ2V0Qm9vbGVhbihKU09OX01BVENIRVNfWkVOX0ZJTFRFUik7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgdGFnICsgKHplbiA/ICIiIDogIiBub3QiKSArICIgaW50ZXJjZXB0ZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCB0YWcgKyAoIXplbiA/ICIiIDogIiBub3QiKSArICIgaW50ZXJjZXB0ZWQiKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kLmNvbnRhaW5zKHRhZykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG11bHRpcGxlIGVudHJpZXMgZm9yIHNhbWUgbm90aWZpY2F0aW9uIQogICAgICAgICAgICAgICAgICAgICAgICAgcGFzcyA9IGZhbHNlOwpAQCAtMzk0LDYgKzU0MSwxMzggQEAKIAogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7CisgICAgICAgICAgICBtTm0uY2FuY2VsQWxsKCk7CisgICAgICAgICAgICBkZWxldGVDaGFubmVscygpOworICAgICAgICAgICAgTW9ja0xpc3RlbmVyLmdldEluc3RhbmNlKCkucmVzZXREYXRhKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgY2xhc3MgUHJpb3JpdHlJbnRlcmNlcHRzQWxhcm1zVGVzdCBleHRlbmRzIEludGVyYWN0aXZlVGVzdENhc2UgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIFZpZXcgaW5mbGF0ZShWaWV3R3JvdXAgcGFyZW50KSB7CisgICAgICAgICAgICByZXR1cm4gY3JlYXRlQXV0b0l0ZW0ocGFyZW50LCBSLnN0cmluZy5hdHRlbnRpb25fc29tZV9hcmVfZmlsdGVyZWRfYWxhcm1zKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgICAgIG1ObS5zZXRJbnRlcnJ1cHRpb25GaWx0ZXIoTm90aWZpY2F0aW9uTWFuYWdlci5JTlRFUlJVUFRJT05fRklMVEVSX1BSSU9SSVRZKTsKKyAgICAgICAgICAgIE5vdGlmaWNhdGlvbk1hbmFnZXIuUG9saWN5IHBvbGljeSA9IG1ObS5nZXROb3RpZmljYXRpb25Qb2xpY3koKTsKKyAgICAgICAgICAgIHBvbGljeSA9IG5ldyBOb3RpZmljYXRpb25NYW5hZ2VyLlBvbGljeSgKKyAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uTWFuYWdlci5Qb2xpY3kuUFJJT1JJVFlfQ0FURUdPUllfQUxBUk1TLAorICAgICAgICAgICAgICAgICAgICBwb2xpY3kucHJpb3JpdHlDYWxsU2VuZGVycywKKyAgICAgICAgICAgICAgICAgICAgcG9saWN5LnByaW9yaXR5TWVzc2FnZVNlbmRlcnMpOworICAgICAgICAgICAgbU5tLnNldE5vdGlmaWNhdGlvblBvbGljeShwb2xpY3kpOworICAgICAgICAgICAgY3JlYXRlQ2hhbm5lbHMoKTsKKyAgICAgICAgICAgIC8vIEV2ZW50IHRvIEFsaWNlLCBBbGFybSB0byBCb2IsIFJlbWluZGVyIHRvIENoYXJsaWU6CisgICAgICAgICAgICBzZW5kRXZlbnRBbGFybVJlbWluZGVyTm90aWZpY2F0aW9ucyhTRU5EX0FMTCk7CisgICAgICAgICAgICBzdGF0dXMgPSBSRUFEWTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCB0ZXN0KCkgeworICAgICAgICAgICAgTGlzdDxKU09OT2JqZWN0PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oTW9ja0xpc3RlbmVyLmdldEluc3RhbmNlKCkuZ2V0UG9zdGVkKCkpOworCisgICAgICAgICAgICBTZXQ8U3RyaW5nPiBmb3VuZCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBGQUlMOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJvb2xlYW4gcGFzcyA9IHRydWU7CisgICAgICAgICAgICBmb3IgKEpTT05PYmplY3QgcGF5bG9hZCA6IHJlc3VsdCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0YWcgPSBwYXlsb2FkLmdldFN0cmluZyhKU09OX1RBRyk7CisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gemVuSW50ZXJjZXB0ZWQgPSAhcGF5bG9hZC5nZXRCb29sZWFuKEpTT05fTUFUQ0hFU19aRU5fRklMVEVSKTsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCB0YWcgKyAoemVuSW50ZXJjZXB0ZWQgPyAiIiA6ICIgbm90IikgKyAiIGludGVyY2VwdGVkIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZC5jb250YWlucyh0YWcpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBtdWx0aXBsZSBlbnRyaWVzIGZvciBzYW1lIG5vdGlmaWNhdGlvbiEKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBTElDRS5lcXVhbHModGFnKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQuYWRkKEFMSUNFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgJj0gemVuSW50ZXJjZXB0ZWQ7IC8vIEFsaWNlJ3MgZXZlbnQgbm90aWYgc2hvdWxkIGJlIGludGVyY2VwdGVkCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQk9CLmVxdWFscyh0YWcpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZC5hZGQoQk9CKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgJj0gIXplbkludGVyY2VwdGVkOyAgIC8vIEJvYidzIGFsYXJtIG5vdGlmIHNob3VsZCBub3QgYmUgaW50ZXJjZXB0ZWQKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChDSEFSTElFLmVxdWFscyh0YWcpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZC5hZGQoQ0hBUkxJRSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzICY9IHplbkludGVyY2VwdGVkOyAvLyBDaGFybGllJ3MgcmVtaW5kZXIgbm90aWYgc2hvdWxkIGJlIGludGVyY2VwdGVkCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChKU09ORXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFzcyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJmYWlsZWQgdG8gdW5wYWNrIGRhdGEgZnJvbSBtb2NrbGlzdGVuZXIiLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYXNzICY9IGZvdW5kLnNpemUoKSA+PSAzOworICAgICAgICAgICAgc3RhdHVzID0gcGFzcyA/IFBBU1MgOiBGQUlMOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgeworICAgICAgICAgICAgbU5tLmNhbmNlbEFsbCgpOworICAgICAgICAgICAgZGVsZXRlQ2hhbm5lbHMoKTsKKyAgICAgICAgICAgIE1vY2tMaXN0ZW5lci5nZXRJbnN0YW5jZSgpLnJlc2V0RGF0YSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIGNsYXNzIFByaW9yaXR5SW50ZXJjZXB0c01lZGlhU3lzdGVtT3RoZXJUZXN0IGV4dGVuZHMgSW50ZXJhY3RpdmVUZXN0Q2FzZSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgVmlldyBpbmZsYXRlKFZpZXdHcm91cCBwYXJlbnQpIHsKKyAgICAgICAgICAgIHJldHVybiBjcmVhdGVBdXRvSXRlbShwYXJlbnQsIFIuc3RyaW5nLmF0dGVudGlvbl9zb21lX2FyZV9maWx0ZXJlZF9tZWRpYV9zeXN0ZW1fb3RoZXIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgeworICAgICAgICAgICAgbU5tLnNldEludGVycnVwdGlvbkZpbHRlcihOb3RpZmljYXRpb25NYW5hZ2VyLklOVEVSUlVQVElPTl9GSUxURVJfUFJJT1JJVFkpOworICAgICAgICAgICAgTm90aWZpY2F0aW9uTWFuYWdlci5Qb2xpY3kgcG9saWN5ID0gbU5tLmdldE5vdGlmaWNhdGlvblBvbGljeSgpOworICAgICAgICAgICAgcG9saWN5ID0gbmV3IE5vdGlmaWNhdGlvbk1hbmFnZXIuUG9saWN5KAorICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25NYW5hZ2VyLlBvbGljeS5QUklPUklUWV9DQVRFR09SWV9NRURJQSwKKyAgICAgICAgICAgICAgICAgICAgcG9saWN5LnByaW9yaXR5Q2FsbFNlbmRlcnMsCisgICAgICAgICAgICAgICAgICAgIHBvbGljeS5wcmlvcml0eU1lc3NhZ2VTZW5kZXJzKTsKKyAgICAgICAgICAgIG1ObS5zZXROb3RpZmljYXRpb25Qb2xpY3kocG9saWN5KTsKKyAgICAgICAgICAgIGNyZWF0ZUNoYW5uZWxzKCk7CisgICAgICAgICAgICAvLyBBbGFybSB0byBBbGljZSwgT3RoZXIgKEdhbWUpIHRvIEJvYiwgTWVkaWEgdG8gQ2hhcmxpZToKKyAgICAgICAgICAgIHNlbmRBbGFybU90aGVyTWVkaWFOb3RpZmljYXRpb25zKFNFTkRfQUxMKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IFJFQURZOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHRlc3QoKSB7CisgICAgICAgICAgICBMaXN0PEpTT05PYmplY3Q+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PihNb2NrTGlzdGVuZXIuZ2V0SW5zdGFuY2UoKS5nZXRQb3N0ZWQoKSk7CisKKyAgICAgICAgICAgIFNldDxTdHJpbmc+IGZvdW5kID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgICAgICAgICAgaWYgKHJlc3VsdC5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEZBSUw7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYm9vbGVhbiBwYXNzID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvciAoSlNPTk9iamVjdCBwYXlsb2FkIDogcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRhZyA9IHBheWxvYWQuZ2V0U3RyaW5nKEpTT05fVEFHKTsKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB6ZW5JbnRlcmNlcHRlZCA9ICFwYXlsb2FkLmdldEJvb2xlYW4oSlNPTl9NQVRDSEVTX1pFTl9GSUxURVIpOworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsIHRhZyArICh6ZW5JbnRlcmNlcHRlZCA/ICIiIDogIiBub3QiKSArICIgaW50ZXJjZXB0ZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kLmNvbnRhaW5zKHRhZykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG11bHRpcGxlIGVudHJpZXMgZm9yIHNhbWUgbm90aWZpY2F0aW9uIQorICAgICAgICAgICAgICAgICAgICAgICAgcGFzcyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEFMSUNFLmVxdWFscyh0YWcpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZC5hZGQoQUxJQ0UpOworICAgICAgICAgICAgICAgICAgICAgICAgcGFzcyAmPSB6ZW5JbnRlcmNlcHRlZDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChCT0IuZXF1YWxzKHRhZykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kLmFkZChCT0IpOworICAgICAgICAgICAgICAgICAgICAgICAgcGFzcyAmPSAhemVuSW50ZXJjZXB0ZWQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQ0hBUkxJRS5lcXVhbHModGFnKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQuYWRkKENIQVJMSUUpOworICAgICAgICAgICAgICAgICAgICAgICAgcGFzcyAmPSAhemVuSW50ZXJjZXB0ZWQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChKU09ORXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFzcyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJmYWlsZWQgdG8gdW5wYWNrIGRhdGEgZnJvbSBtb2NrbGlzdGVuZXIiLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYXNzICY9IGZvdW5kLnNpemUoKSA+PSAzOworICAgICAgICAgICAgc3RhdHVzID0gcGFzcyA/IFBBU1MgOiBGQUlMOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewogICAgICAgICAgICAgbU5tLnNldEludGVycnVwdGlvbkZpbHRlcihOb3RpZmljYXRpb25NYW5hZ2VyLklOVEVSUlVQVElPTl9GSUxURVJfQUxMKTsKICAgICAgICAgICAgIG1ObS5jYW5jZWxBbGwoKTsKICAgICAgICAgICAgIGRlbGV0ZUNoYW5uZWxzKCk7CkBAIC00MTAsNiArNjg5LDcgQEAKIAogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7CisgICAgICAgICAgICBtTm0uc2V0SW50ZXJydXB0aW9uRmlsdGVyKE5vdGlmaWNhdGlvbk1hbmFnZXIuSU5URVJSVVBUSU9OX0ZJTFRFUl9BTEwpOwogICAgICAgICAgICAgY3JlYXRlQ2hhbm5lbHMoKTsKICAgICAgICAgICAgIHNlbmROb3RpZmljYXRpb25zKE1PREVfTk9ORSwgZmFsc2UsIGZhbHNlKTsKICAgICAgICAgICAgIHN0YXR1cyA9IFJFQURZOwpAQCAtNDQ2LDYgKzcyNiw3IEBACiAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgeworICAgICAgICAgICAgbU5tLnNldEludGVycnVwdGlvbkZpbHRlcihOb3RpZmljYXRpb25NYW5hZ2VyLklOVEVSUlVQVElPTl9GSUxURVJfQUxMKTsKICAgICAgICAgICAgIGNyZWF0ZUNoYW5uZWxzKCk7CiAgICAgICAgICAgICBzZW5kTm90aWZpY2F0aW9ucyhNT0RFX05PTkUsIHRydWUsIGZhbHNlKTsKICAgICAgICAgICAgIHN0YXR1cyA9IFJFQURZOwpAQCAtNDg0LDYgKzc2NSw3IEBACiAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgeworICAgICAgICAgICAgbU5tLnNldEludGVycnVwdGlvbkZpbHRlcihOb3RpZmljYXRpb25NYW5hZ2VyLklOVEVSUlVQVElPTl9GSUxURVJfQUxMKTsKICAgICAgICAgICAgIGRlbGF5VGltZSA9IDE1MDAwOwogICAgICAgICAgICAgY3JlYXRlQ2hhbm5lbHMoKTsKICAgICAgICAgICAgIC8vIHNlbmQgQiAmIEMgbm9pc3kgd2l0aCBjb250YWN0IGFmZmluaXR5CkBAIC03NTgsNiArMTA0MCw4MyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIHNlbmRFdmVudEFsYXJtUmVtaW5kZXJOb3RpZmljYXRpb25zKGludCB3aGljaCkgeworICAgICAgICBsb25nIHdoZW4gPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIDQwMDAwMDBMOworICAgICAgICBmaW5hbCBTdHJpbmcgY2hhbm5lbElkID0gTk9USUZJQ0FUSU9OX0NIQU5ORUxfSUQ7CisKKyAgICAgICAgLy8gRXZlbnQgbm90aWZpY2F0aW9uIHRvIEFsaWNlCisgICAgICAgIGlmICgod2hpY2ggJiBTRU5EX0EpICE9IDApIHsKKyAgICAgICAgICAgIE5vdGlmaWNhdGlvbi5CdWlsZGVyIGFsaWNlID0gbmV3IE5vdGlmaWNhdGlvbi5CdWlsZGVyKG1Db250ZXh0LCBjaGFubmVsSWQpCisgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50VGl0bGUoQUxJQ0UpCisgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50VGV4dChBTElDRSkKKyAgICAgICAgICAgICAgICAgICAgLnNldFNtYWxsSWNvbihSLmRyYXdhYmxlLmljX3N0YXRfYWxpY2UpCisgICAgICAgICAgICAgICAgICAgIC5zZXRDYXRlZ29yeShOb3RpZmljYXRpb24uQ0FURUdPUllfRVZFTlQpCisgICAgICAgICAgICAgICAgICAgIC5zZXRXaGVuKHdoZW4pOworICAgICAgICAgICAgbU5tLm5vdGlmeShBTElDRSwgTk9USUZJQ0FUSU9OX0lEICsgMSwgYWxpY2UuYnVpbGQoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBBbGFybSBub3RpZmljYXRpb24gdG8gQm9iCisgICAgICAgIGlmICgod2hpY2ggJiBTRU5EX0IpICE9IDApIHsKKyAgICAgICAgICAgIE5vdGlmaWNhdGlvbi5CdWlsZGVyIGJvYiA9IG5ldyBOb3RpZmljYXRpb24uQnVpbGRlcihtQ29udGV4dCwgY2hhbm5lbElkKQorICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudFRpdGxlKEJPQikKKyAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnRUZXh0KEJPQikKKyAgICAgICAgICAgICAgICAgICAgLnNldFNtYWxsSWNvbihSLmRyYXdhYmxlLmljX3N0YXRfYm9iKQorICAgICAgICAgICAgICAgICAgICAuc2V0Q2F0ZWdvcnkoTm90aWZpY2F0aW9uLkNBVEVHT1JZX0FMQVJNKQorICAgICAgICAgICAgICAgICAgICAuc2V0V2hlbih3aGVuKTsKKyAgICAgICAgICAgIG1ObS5ub3RpZnkoQk9CLCBOT1RJRklDQVRJT05fSUQgKyAyLCBib2IuYnVpbGQoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZW1pbmRlciBub3RpZmljYXRpb24gdG8gQ2hhcmxpZQorICAgICAgICBpZiAoKHdoaWNoICYgU0VORF9DKSAhPSAwKSB7CisgICAgICAgICAgICBOb3RpZmljYXRpb24uQnVpbGRlciBjaGFybGllID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IE5vdGlmaWNhdGlvbi5CdWlsZGVyKG1Db250ZXh0LCBjaGFubmVsSWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnRUaXRsZShDSEFSTElFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50VGV4dChDSEFSTElFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTbWFsbEljb24oUi5kcmF3YWJsZS5pY19zdGF0X2NoYXJsaWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldENhdGVnb3J5KE5vdGlmaWNhdGlvbi5DQVRFR09SWV9SRU1JTkRFUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0V2hlbih3aGVuKTsKKyAgICAgICAgICAgIG1ObS5ub3RpZnkoQ0hBUkxJRSwgTk9USUZJQ0FUSU9OX0lEICsgMywgY2hhcmxpZS5idWlsZCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZW5kQWxhcm1PdGhlck1lZGlhTm90aWZpY2F0aW9ucyhpbnQgd2hpY2gpIHsKKyAgICAgICAgbG9uZyB3aGVuID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSA0MDAwMDAwTDsKKyAgICAgICAgZmluYWwgU3RyaW5nIGNoYW5uZWxJZCA9IE5PVElGSUNBVElPTl9DSEFOTkVMX0lEOworCisgICAgICAgIC8vIEFsYXJtIG5vdGlmaWNhdGlvbiB0byBBbGljZQorICAgICAgICBpZiAoKHdoaWNoICYgU0VORF9BKSAhPSAwKSB7CisgICAgICAgICAgICBOb3RpZmljYXRpb24uQnVpbGRlciBhbGljZSA9IG5ldyBOb3RpZmljYXRpb24uQnVpbGRlcihtQ29udGV4dCwgY2hhbm5lbElkKQorICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudFRpdGxlKEFMSUNFKQorICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudFRleHQoQUxJQ0UpCisgICAgICAgICAgICAgICAgICAgIC5zZXRTbWFsbEljb24oUi5kcmF3YWJsZS5pY19zdGF0X2FsaWNlKQorICAgICAgICAgICAgICAgICAgICAuc2V0Q2F0ZWdvcnkoTm90aWZpY2F0aW9uLkNBVEVHT1JZX0FMQVJNKQorICAgICAgICAgICAgICAgICAgICAuc2V0V2hlbih3aGVuKTsKKyAgICAgICAgICAgIG1ObS5ub3RpZnkoQUxJQ0UsIE5PVElGSUNBVElPTl9JRCArIDEsIGFsaWNlLmJ1aWxkKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gIk90aGVyIiBub3RpZmljYXRpb24gdG8gQm9iCisgICAgICAgIGlmICgod2hpY2ggJiBTRU5EX0IpICE9IDApIHsKKyAgICAgICAgICAgIE5vdGlmaWNhdGlvbi5CdWlsZGVyIGJvYiA9IG5ldyBOb3RpZmljYXRpb24uQnVpbGRlcihtQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgTk9USUZJQ0FUSU9OX0NIQU5ORUxfSURfR0FNRSkKKyAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnRUaXRsZShCT0IpCisgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50VGV4dChCT0IpCisgICAgICAgICAgICAgICAgICAgIC5zZXRTbWFsbEljb24oUi5kcmF3YWJsZS5pY19zdGF0X2JvYikKKyAgICAgICAgICAgICAgICAgICAgLnNldFdoZW4od2hlbik7CisgICAgICAgICAgICBtTm0ubm90aWZ5KEJPQiwgTk9USUZJQ0FUSU9OX0lEICsgMiwgYm9iLmJ1aWxkKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gTWVkaWEgbm90aWZpY2F0aW9uIHRvIENoYXJsaWUKKyAgICAgICAgaWYgKCh3aGljaCAmIFNFTkRfQykgIT0gMCkgeworICAgICAgICAgICAgTm90aWZpY2F0aW9uLkJ1aWxkZXIgY2hhcmxpZSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBOb3RpZmljYXRpb24uQnVpbGRlcihtQ29udGV4dCwgTk9USUZJQ0FUSU9OX0NIQU5ORUxfSURfTUVESUEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnRUaXRsZShDSEFSTElFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50VGV4dChDSEFSTElFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTbWFsbEljb24oUi5kcmF3YWJsZS5pY19zdGF0X2NoYXJsaWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFdoZW4od2hlbik7CisgICAgICAgICAgICBtTm0ubm90aWZ5KENIQVJMSUUsIE5PVElGSUNBVElPTl9JRCArIDMsIGNoYXJsaWUuYnVpbGQoKSk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgYWRkUGVyc29uKGludCBtb2RlLCBOb3RpZmljYXRpb24uQnVpbGRlciBub3RlLAogICAgICAgICAgICAgVXJpIHVyaSwgU3RyaW5nIHBob25lLCBTdHJpbmcgZW1haWwpIHsKICAgICAgICAgaWYgKG1vZGUgPT0gTU9ERV9VUkkgJiYgdXJpICE9IG51bGwpIHsKZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9ub3RpZmljYXRpb25zL0Jsb2NrQ2hhbmdlUmVjZWl2ZXIuamF2YSBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9ub3RpZmljYXRpb25zL0Jsb2NrQ2hhbmdlUmVjZWl2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODRlOTA3Ci0tLSAvZGV2L251bGwKKysrIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL25vdGlmaWNhdGlvbnMvQmxvY2tDaGFuZ2VSZWNlaXZlci5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKK3BhY2thZ2UgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLm5vdGlmaWNhdGlvbnM7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uTWFuYWdlci5BQ1RJT05fQVBQX0JMT0NLX1NUQVRFX0NIQU5HRUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbk1hbmFnZXIuQUNUSU9OX05PVElGSUNBVElPTl9DSEFOTkVMX0JMT0NLX1NUQVRFX0NIQU5HRUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbk1hbmFnZXIuQUNUSU9OX05PVElGSUNBVElPTl9DSEFOTkVMX0dST1VQX0JMT0NLX1NUQVRFX0NIQU5HRUQ7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb25NYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlczsKKworcHVibGljIGNsYXNzIEJsb2NrQ2hhbmdlUmVjZWl2ZXIgZXh0ZW5kcyBCcm9hZGNhc3RSZWNlaXZlciB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIFNoYXJlZFByZWZlcmVuY2VzIHByZWZzID0gY29udGV4dC5nZXRTaGFyZWRQcmVmZXJlbmNlcygKKyAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25MaXN0ZW5lclZlcmlmaWVyQWN0aXZpdHkuUFJFRlMsIENvbnRleHQuTU9ERV9QUklWQVRFKTsKKyAgICAgICAgU2hhcmVkUHJlZmVyZW5jZXMuRWRpdG9yIGVkaXRvciA9IHByZWZzLmVkaXQoKTsKKyAgICAgICAgaWYgKEFDVElPTl9OT1RJRklDQVRJT05fQ0hBTk5FTF9HUk9VUF9CTE9DS19TVEFURV9DSEFOR0VELmVxdWFscyhpbnRlbnQuZ2V0QWN0aW9uKCkpKSB7CisgICAgICAgICAgICBTdHJpbmcgaWQgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoCisgICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbk1hbmFnZXIuRVhUUkFfTk9USUZJQ0FUSU9OX0NIQU5ORUxfR1JPVVBfSUQpOworICAgICAgICAgICAgZWRpdG9yLnB1dEJvb2xlYW4oaWQsCisgICAgICAgICAgICAgICAgICAgIGludGVudC5nZXRCb29sZWFuRXh0cmEoTm90aWZpY2F0aW9uTWFuYWdlci5FWFRSQV9CTE9DS0VEX1NUQVRFLCBmYWxzZSkpOworICAgICAgICB9IGVsc2UgaWYgKEFDVElPTl9OT1RJRklDQVRJT05fQ0hBTk5FTF9CTE9DS19TVEFURV9DSEFOR0VELmVxdWFscyhpbnRlbnQuZ2V0QWN0aW9uKCkpKSB7CisgICAgICAgICAgICBTdHJpbmcgaWQgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoTm90aWZpY2F0aW9uTWFuYWdlci5FWFRSQV9OT1RJRklDQVRJT05fQ0hBTk5FTF9JRCk7CisgICAgICAgICAgICBlZGl0b3IucHV0Qm9vbGVhbihpZCwKKyAgICAgICAgICAgICAgICAgICAgaW50ZW50LmdldEJvb2xlYW5FeHRyYShOb3RpZmljYXRpb25NYW5hZ2VyLkVYVFJBX0JMT0NLRURfU1RBVEUsIGZhbHNlKSk7CisgICAgICAgIH0gZWxzZSBpZiAoQUNUSU9OX0FQUF9CTE9DS19TVEFURV9DSEFOR0VELmVxdWFscyhpbnRlbnQuZ2V0QWN0aW9uKCkpKSB7CisgICAgICAgICAgICBTdHJpbmcgaWQgPSBjb250ZXh0LmdldFBhY2thZ2VOYW1lKCk7CisgICAgICAgICAgICBlZGl0b3IucHV0Qm9vbGVhbihpZCwKKyAgICAgICAgICAgICAgICAgICAgaW50ZW50LmdldEJvb2xlYW5FeHRyYShOb3RpZmljYXRpb25NYW5hZ2VyLkVYVFJBX0JMT0NLRURfU1RBVEUsIGZhbHNlKSk7CisgICAgICAgIH0KKyAgICAgICAgZWRpdG9yLmNvbW1pdCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9ub3RpZmljYXRpb25zL0NvbmRpdGlvblByb3ZpZGVyVmVyaWZpZXJBY3Rpdml0eS5qYXZhIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL25vdGlmaWNhdGlvbnMvQ29uZGl0aW9uUHJvdmlkZXJWZXJpZmllckFjdGl2aXR5LmphdmEKaW5kZXggNDZiODA4Yi4uZDUxMDMyMCAxMDA2NDQKLS0tIGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL25vdGlmaWNhdGlvbnMvQ29uZGl0aW9uUHJvdmlkZXJWZXJpZmllckFjdGl2aXR5LmphdmEKKysrIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL25vdGlmaWNhdGlvbnMvQ29uZGl0aW9uUHJvdmlkZXJWZXJpZmllckFjdGl2aXR5LmphdmEKQEAgLTI1LDkgKzI1LDkgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKIApAQCAtNzEsNiArNzEsOCBAQAogICAgICAgICAgICAgdGVzdHMuYWRkKG5ldyBTdWJzY3JpYmVBdXRvbWF0aWNaZW5SdWxlVGVzdCgpKTsKICAgICAgICAgICAgIHRlc3RzLmFkZChuZXcgRGVsZXRlQXV0b21hdGljWmVuUnVsZVRlc3QoKSk7CiAgICAgICAgICAgICB0ZXN0cy5hZGQobmV3IFVuc3Vic2NyaWJlQXV0b21hdGljWmVuUnVsZVRlc3QoKSk7CisgICAgICAgICAgICB0ZXN0cy5hZGQobmV3IFJlcXVlc3RVbmJpbmRUZXN0KCkpOworICAgICAgICAgICAgdGVzdHMuYWRkKG5ldyBSZXF1ZXN0QmluZFRlc3QoKSk7CiAgICAgICAgICAgICB0ZXN0cy5hZGQobmV3IElzRGlzYWJsZWRUZXN0KCkpOwogICAgICAgICAgICAgdGVzdHMuYWRkKG5ldyBTZXJ2aWNlU3RvcHBlZFRlc3QoKSk7CiAgICAgICAgIH0KQEAgLTEwOCw2ICsxMTAsMTEgQEAKICAgICAgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBzZXJ2aWNlIHRvIHN0YXJ0CiAgICAgICAgICAgICBkZWxheSgpOwogICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBJbnRlbnQgZ2V0SW50ZW50KCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnRlbnQoU2V0dGluZ3MuQUNUSU9OX05PVElGSUNBVElPTl9QT0xJQ1lfQUNDRVNTX1NFVFRJTkdTKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHByb3RlY3RlZCBjbGFzcyBDYW5ub3RCZUVuYWJsZWRUZXN0IGV4dGVuZHMgSW50ZXJhY3RpdmVUZXN0Q2FzZSB7CkBAIC0xMjQsNyArMTMxLDcgQEAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHByb3RlY3RlZCB2b2lkIHRlc3QoKSB7CiAgICAgICAgICAgICBtTm0uY2FuY2VsQWxsKCk7Ci0gICAgICAgICAgICBJbnRlbnQgc2V0dGluZ3MgPSBuZXcgSW50ZW50KE5PVElGSUNBVElPTl9MSVNURU5FUl9TRVRUSU5HUyk7CisgICAgICAgICAgICBJbnRlbnQgc2V0dGluZ3MgPSBuZXcgSW50ZW50KFNldHRpbmdzLkFDVElPTl9OT1RJRklDQVRJT05fUE9MSUNZX0FDQ0VTU19TRVRUSU5HUyk7CiAgICAgICAgICAgICBpZiAoc2V0dGluZ3MucmVzb2x2ZUFjdGl2aXR5KG1QYWNrYWdlTWFuYWdlcikgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGxvZ0ZhaWwoIm5vIHNldHRpbmdzIGFjdGl2aXR5Iik7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gRkFJTDsKQEAgLTE0Miw5ICsxNDksMTUgQEAKICAgICAgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBzZXJ2aWNlIHRvIHN0YXJ0CiAgICAgICAgICAgICBkZWxheSgpOwogICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBJbnRlbnQgZ2V0SW50ZW50KCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnRlbnQoU2V0dGluZ3MuQUNUSU9OX05PVElGSUNBVElPTl9QT0xJQ1lfQUNDRVNTX1NFVFRJTkdTKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHByb3RlY3RlZCBjbGFzcyBTZXJ2aWNlU3RhcnRlZFRlc3QgZXh0ZW5kcyBJbnRlcmFjdGl2ZVRlc3RDYXNlIHsKKyAgICAgICAgaW50IG1SZXRyaWVzID0gNTsKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHByb3RlY3RlZCBWaWV3IGluZmxhdGUoVmlld0dyb3VwIHBhcmVudCkgewogICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUF1dG9JdGVtKHBhcmVudCwgUi5zdHJpbmcuY3Bfc2VydmljZV9zdGFydGVkKTsKQEAgLTE1MiwzMCArMTY1LDkxIEBACiAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHByb3RlY3RlZCB2b2lkIHRlc3QoKSB7Ci0gICAgICAgICAgICBNb2NrQ29uZGl0aW9uUHJvdmlkZXIucHJvYmVDb25uZWN0ZWQobUNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBNb2NrQ29uZGl0aW9uUHJvdmlkZXIuQm9vbGVhblJlc3VsdENhdGNoZXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjY2VwdChib29sZWFuIHJlc3VsdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUEFTUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dGYWlsKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFJFVEVTVDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIGRlbGF5KCk7ICAvLyBpbiBjYXNlIHRoZSBjYXRjaGVyIG5ldmVyIHJldHVybnMKKyAgICAgICAgICAgIGlmIChNb2NrQ29uZGl0aW9uUHJvdmlkZXIuZ2V0SW5zdGFuY2UoKS5pc0Nvbm5lY3RlZCgpCisgICAgICAgICAgICAgICAgICAgICYmIE1vY2tDb25kaXRpb25Qcm92aWRlci5nZXRJbnN0YW5jZSgpLmlzQm91bmQoKSkgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBBU1M7CisgICAgICAgICAgICAgICAgbmV4dCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoLS1tUmV0cmllcyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUkVURVNUOworICAgICAgICAgICAgICAgICAgICBuZXh0KCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nRmFpbCgpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBGQUlMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgUmVxdWVzdFVuYmluZFRlc3QgZXh0ZW5kcyBJbnRlcmFjdGl2ZVRlc3RDYXNlIHsKKyAgICAgICAgaW50IG1SZXRyaWVzID0gNTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIFZpZXcgaW5mbGF0ZShWaWV3R3JvdXAgcGFyZW50KSB7CisgICAgICAgICAgICByZXR1cm4gY3JlYXRlQXV0b0l0ZW0ocGFyZW50LCBSLnN0cmluZy5ubHNfc25vb3plKTsKKwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotICAgICAgICAgICAgTW9ja0NvbmRpdGlvblByb3ZpZGVyLnJlc2V0RGF0YShtQ29udGV4dCk7Ci0gICAgICAgICAgICBkZWxheSgpOworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IFJFQURZOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHRlc3QoKSB7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IFJFQURZKSB7CisgICAgICAgICAgICAgICAgTW9ja0NvbmRpdGlvblByb3ZpZGVyLmdldEluc3RhbmNlKCkucmVxdWVzdFVuYmluZCgpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IFJFVEVTVDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKE1vY2tDb25kaXRpb25Qcm92aWRlci5nZXRJbnN0YW5jZSgpID09IG51bGwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICFNb2NrQ29uZGl0aW9uUHJvdmlkZXIuZ2V0SW5zdGFuY2UoKS5pc0Nvbm5lY3RlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBBU1M7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKC0tbVJldHJpZXMgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBSRVRFU1Q7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2dGYWlsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBGQUlMOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5leHQoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgY2xhc3MgUmVxdWVzdEJpbmRUZXN0IGV4dGVuZHMgSW50ZXJhY3RpdmVUZXN0Q2FzZSB7CisgICAgICAgIGludCBtUmV0cmllcyA9IDU7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBWaWV3IGluZmxhdGUoVmlld0dyb3VwIHBhcmVudCkgeworICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUF1dG9JdGVtKHBhcmVudCwgUi5zdHJpbmcubmxzX3Vuc25vb3plKTsKKworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHRlc3QoKSB7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IFJFQURZKSB7CisgICAgICAgICAgICAgICAgTW9ja0NvbmRpdGlvblByb3ZpZGVyLnJlcXVlc3RSZWJpbmQoTW9ja0NvbmRpdGlvblByb3ZpZGVyLkNPTVBPTkVOVF9OQU1FKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBSRVRFU1Q7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChNb2NrQ29uZGl0aW9uUHJvdmlkZXIuZ2V0SW5zdGFuY2UoKS5pc0Nvbm5lY3RlZCgpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBNb2NrQ29uZGl0aW9uUHJvdmlkZXIuZ2V0SW5zdGFuY2UoKS5pc0JvdW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUEFTUzsKKyAgICAgICAgICAgICAgICAgICAgbmV4dCgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgtLW1SZXRyaWVzID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUkVURVNUOworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCgpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9nRmFpbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gRkFJTDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCiAgICAgcHJpdmF0ZSBjbGFzcyBDcmVhdGVBdXRvbWF0aWNaZW5SdWxlVGVzdCBleHRlbmRzIEludGVyYWN0aXZlVGVzdENhc2UgewogICAgICAgICBwcml2YXRlIFN0cmluZyBpZCA9IG51bGw7CiAKQEAgLTE4Niw3ICsyNjAsNiBAQAogCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwcm90ZWN0ZWQgdm9pZCB0ZXN0KCkgewotICAgICAgICAgICAgbG9uZyBub3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgICAgICAgICAgIEF1dG9tYXRpY1plblJ1bGUgcnVsZVRvQ3JlYXRlID0KICAgICAgICAgICAgICAgICAgICAgY3JlYXRlUnVsZSgiUnVsZSIsICJ2YWx1ZSIsIE5vdGlmaWNhdGlvbk1hbmFnZXIuSU5URVJSVVBUSU9OX0ZJTFRFUl9BTEFSTVMpOwogICAgICAgICAgICAgaWQgPSBtTm0uYWRkQXV0b21hdGljWmVuUnVsZShydWxlVG9DcmVhdGUpOwpAQCAtMjA1LDggKzI3OCw3IEBACiAgICAgICAgICAgICBpZiAoaWQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIG1ObS5yZW1vdmVBdXRvbWF0aWNaZW5SdWxlKGlkKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE1vY2tDb25kaXRpb25Qcm92aWRlci5yZXNldERhdGEobUNvbnRleHQpOwotICAgICAgICAgICAgZGVsYXkoKTsKKyAgICAgICAgICAgIE1vY2tDb25kaXRpb25Qcm92aWRlci5nZXRJbnN0YW5jZSgpLnJlc2V0RGF0YSgpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yNTMsMTQgKzMyNSwxNCBAQAogICAgICAgICAgICAgaWYgKGlkICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBtTm0ucmVtb3ZlQXV0b21hdGljWmVuUnVsZShpZCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBNb2NrQ29uZGl0aW9uUHJvdmlkZXIucmVzZXREYXRhKG1Db250ZXh0KTsKLSAgICAgICAgICAgIGRlbGF5KCk7CisgICAgICAgICAgICBNb2NrQ29uZGl0aW9uUHJvdmlkZXIuZ2V0SW5zdGFuY2UoKS5yZXNldERhdGEoKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgY2xhc3MgU3Vic2NyaWJlQXV0b21hdGljWmVuUnVsZVRlc3QgZXh0ZW5kcyBJbnRlcmFjdGl2ZVRlc3RDYXNlIHsKICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgaWQgPSBudWxsOwogICAgICAgICBwcml2YXRlIEF1dG9tYXRpY1plblJ1bGUgcnVsZVRvQ3JlYXRlOworICAgICAgICBwcml2YXRlIGludCBtUmV0cmllcyA9IDM7CiAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHByb3RlY3RlZCBWaWV3IGluZmxhdGUoVmlld0dyb3VwIHBhcmVudCkgewpAQCAtMjc4LDI5ICszNTAsMjQgQEAKIAogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHJvdGVjdGVkIHZvaWQgdGVzdCgpIHsKLQotICAgICAgICAgICAgTW9ja0NvbmRpdGlvblByb3ZpZGVyLnByb2JlU3Vic2NyaWJlKG1Db250ZXh0LAotICAgICAgICAgICAgICAgICAgICBuZXcgTW9ja0NvbmRpdGlvblByb3ZpZGVyLlBhcmNlbGFibGVMaXN0UmVzdWx0Q2F0Y2hlcigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYWNjZXB0KExpc3Q8UGFyY2VsYWJsZT4gcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBmb3VuZE1hdGNoID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChQYXJjZWxhYmxlIHAgOiByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXJpIHVyaSA9IChVcmkpIHA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlVG9DcmVhdGUuZ2V0Q29uZGl0aW9uSWQoKS5lcXVhbHModXJpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRNYXRjaCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmRNYXRjaCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBQQVNTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0ZhaWwoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUkVURVNUOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgZGVsYXkoKTsgIC8vIGluIGNhc2UgdGhlIGNhdGNoZXIgbmV2ZXIgcmV0dXJucworICAgICAgICAgICAgYm9vbGVhbiBmb3VuZE1hdGNoID0gZmFsc2U7CisgICAgICAgICAgICBMaXN0PFVyaT4gc3Vic2NyaXB0aW9ucyA9IE1vY2tDb25kaXRpb25Qcm92aWRlci5nZXRJbnN0YW5jZSgpLmdldFN1YnNjcmlwdGlvbnMoKTsKKyAgICAgICAgICAgIGZvciAoVXJpIGFjdHVhbCA6IHN1YnNjcmlwdGlvbnMpIHsKKyAgICAgICAgICAgICAgICBpZiAocnVsZVRvQ3JlYXRlLmdldENvbmRpdGlvbklkKCkuZXF1YWxzKGFjdHVhbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUEFTUzsKKyAgICAgICAgICAgICAgICAgICAgZm91bmRNYXRjaCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmb3VuZE1hdGNoKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gUEFTUzsKKyAgICAgICAgICAgICAgICBuZXh0KCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKC0tbVJldHJpZXMgPiAwKSB7CisgICAgICAgICAgICAgICAgc2V0RmFpbGVkKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IFJFVEVTVDsKKyAgICAgICAgICAgICAgICBuZXh0KCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKQEAgLTMwOCw5ICszNzUsNyBAQAogICAgICAgICAgICAgaWYgKGlkICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBtTm0ucmVtb3ZlQXV0b21hdGljWmVuUnVsZShpZCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBNb2NrQ29uZGl0aW9uUHJvdmlkZXIucmVzZXREYXRhKG1Db250ZXh0KTsKLSAgICAgICAgICAgIC8vIHdhaXQgZm9yIGludGVudCB0byBtb3ZlIHRocm91Z2ggdGhlIHN5c3RlbQotICAgICAgICAgICAgZGVsYXkoKTsKKyAgICAgICAgICAgIE1vY2tDb25kaXRpb25Qcm92aWRlci5nZXRJbnN0YW5jZSgpLnJlc2V0RGF0YSgpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zNTMsOCArNDE4LDcgQEAKICAgICAgICAgICAgIGlmIChpZCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgbU5tLnJlbW92ZUF1dG9tYXRpY1plblJ1bGUoaWQpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgTW9ja0NvbmRpdGlvblByb3ZpZGVyLnJlc2V0RGF0YShtQ29udGV4dCk7Ci0gICAgICAgICAgICBkZWxheSgpOworICAgICAgICAgICAgTW9ja0NvbmRpdGlvblByb3ZpZGVyLmdldEluc3RhbmNlKCkucmVzZXREYXRhKCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTQwNSw4ICs0NjksNyBAQAogICAgICAgICAgICAgZm9yIChTdHJpbmcgaWQgOiBpZHMpIHsKICAgICAgICAgICAgICAgICBtTm0ucmVtb3ZlQXV0b21hdGljWmVuUnVsZShpZCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBNb2NrQ29uZGl0aW9uUHJvdmlkZXIucmVzZXREYXRhKG1Db250ZXh0KTsKLSAgICAgICAgICAgIGRlbGF5KCk7CisgICAgICAgICAgICBNb2NrQ29uZGl0aW9uUHJvdmlkZXIuZ2V0SW5zdGFuY2UoKS5yZXNldERhdGEoKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNDQ1LDcgKzUwOCw3IEBACiAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotICAgICAgICAgICAgTW9ja0NvbmRpdGlvblByb3ZpZGVyLnJlc2V0RGF0YShtQ29udGV4dCk7CisgICAgICAgICAgICBNb2NrQ29uZGl0aW9uUHJvdmlkZXIuZ2V0SW5zdGFuY2UoKS5yZXNldERhdGEoKTsKICAgICAgICAgICAgIGRlbGF5KCk7CiAgICAgICAgIH0KICAgICB9CkBAIC00NTMsNiArNTE2LDkgQEAKICAgICBwcml2YXRlIGNsYXNzIFVuc3Vic2NyaWJlQXV0b21hdGljWmVuUnVsZVRlc3QgZXh0ZW5kcyBJbnRlcmFjdGl2ZVRlc3RDYXNlIHsKICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgaWQgPSBudWxsOwogICAgICAgICBwcml2YXRlIEF1dG9tYXRpY1plblJ1bGUgcnVsZVRvQ3JlYXRlOworICAgICAgICBwcml2YXRlIGludCBtU3Vic2NyaWJlUmV0cmllcyA9IDM7CisgICAgICAgIHByaXZhdGUgaW50IG1VbnN1YnNjcmliZVJldHJpZXMgPSAzOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbVN1YnNjcmliaW5nID0gdHJ1ZTsKIAogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHJvdGVjdGVkIFZpZXcgaW5mbGF0ZShWaWV3R3JvdXAgcGFyZW50KSB7CkBAIC00NzAsNjQgKzUzNiw2MCBAQAogCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwcm90ZWN0ZWQgdm9pZCB0ZXN0KCkgewotICAgICAgICAgICAgTW9ja0NvbmRpdGlvblByb3ZpZGVyLnByb2JlU3Vic2NyaWJlKG1Db250ZXh0LAotICAgICAgICAgICAgICAgICAgICBuZXcgTW9ja0NvbmRpdGlvblByb3ZpZGVyLlBhcmNlbGFibGVMaXN0UmVzdWx0Q2F0Y2hlcigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYWNjZXB0KExpc3Q8UGFyY2VsYWJsZT4gcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBmb3VuZE1hdGNoID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChQYXJjZWxhYmxlIHAgOiByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXJpIHVyaSA9IChVcmkpIHA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlVG9DcmVhdGUuZ2V0Q29uZGl0aW9uSWQoKS5lcXVhbHModXJpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRNYXRjaCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmRNYXRjaCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3cgdGhhdCBpdCdzIHN1YnNjcmliZWQsIHJlbW92ZSB0aGUgcnVsZSBhbmQgdmVyaWZ5IHRoYXQgaXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5zdWJzY3JpYmVzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm0ucmVtb3ZlQXV0b21hdGljWmVuUnVsZShpZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMzAwMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0ZhaWwoInVuZXhwZWN0ZWQgSW50ZXJydXB0ZWRFeGNlcHRpb24iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2NrQ29uZGl0aW9uUHJvdmlkZXIucHJvYmVTdWJzY3JpYmUobUNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE1vY2tDb25kaXRpb25Qcm92aWRlci5QYXJjZWxhYmxlTGlzdFJlc3VsdENhdGNoZXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhY2NlcHQoTGlzdDxQYXJjZWxhYmxlPiByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZm91bmRNYXRjaCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChQYXJjZWxhYmxlIHAgOiByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcmkgdXJpID0gKFVyaSkgcDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZVRvQ3JlYXRlLmdldENvbmRpdGlvbklkKCkuZXF1YWxzKHVyaSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRNYXRjaCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZE1hdGNoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nRmFpbCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFJFVEVTVDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUEFTUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0ZhaWwoIkNvdWxkbid0IHRlc3QgdW5zdWJzY3JpYmU7IHN1YnNjcmliZSBmYWlsZWQuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFJFVEVTVDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBkZWxheSgpOyAgLy8gaW4gY2FzZSB0aGUgY2F0Y2hlciBuZXZlciByZXR1cm5zCisgICAgICAgICAgICBpZiAobVN1YnNjcmliaW5nKSB7CisgICAgICAgICAgICAgICAgLy8gdHJ5aW5nIHRvIHN1YnNjcmliZQorICAgICAgICAgICAgICAgIGJvb2xlYW4gZm91bmRNYXRjaCA9IGZhbHNlOworICAgICAgICAgICAgICAgIExpc3Q8VXJpPiBzdWJzY3JpcHRpb25zID0gTW9ja0NvbmRpdGlvblByb3ZpZGVyLmdldEluc3RhbmNlKCkuZ2V0U3Vic2NyaXB0aW9ucygpOworICAgICAgICAgICAgICAgIGZvciAoVXJpIGFjdHVhbCA6IHN1YnNjcmlwdGlvbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVUb0NyZWF0ZS5nZXRDb25kaXRpb25JZCgpLmVxdWFscyhhY3R1YWwpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBQQVNTOworICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRNYXRjaCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZm91bmRNYXRjaCkgeworICAgICAgICAgICAgICAgICAgICAvLyBOb3cgdGhhdCBpdCdzIHN1YnNjcmliZWQsIHJlbW92ZSB0aGUgcnVsZSBhbmQgdmVyaWZ5IHRoYXQgaXQKKyAgICAgICAgICAgICAgICAgICAgLy8gdW5zdWJzY3JpYmVzLgorICAgICAgICAgICAgICAgICAgICBMb2cuZChNb2NrQ29uZGl0aW9uUHJvdmlkZXIuVEFHLCAiRm91bmQgc3Vic2NyaXB0aW9uLCByZW1vdmluZyIpOworICAgICAgICAgICAgICAgICAgICBtTm0ucmVtb3ZlQXV0b21hdGljWmVuUnVsZShpZCk7CisKKyAgICAgICAgICAgICAgICAgICAgbVN1YnNjcmliaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFJFVEVTVDsKKyAgICAgICAgICAgICAgICAgICAgbmV4dCgpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoLS1tU3Vic2NyaWJlUmV0cmllcyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0RmFpbGVkKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUkVURVNUOworICAgICAgICAgICAgICAgICAgICBuZXh0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyB0cnlpbmcgdG8gdW5zdWJzY3JpYmUKKyAgICAgICAgICAgICAgICBMaXN0PFVyaT4gY29udGludWluZ1N1YnNjcmlwdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgID0gTW9ja0NvbmRpdGlvblByb3ZpZGVyLmdldEluc3RhbmNlKCkuZ2V0U3Vic2NyaXB0aW9ucygpOworICAgICAgICAgICAgICAgIGJvb2xlYW4gc3RpbGxGb3VuZE1hdGNoID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZm9yIChVcmkgYWN0dWFsIDogY29udGludWluZ1N1YnNjcmlwdGlvbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVUb0NyZWF0ZS5nZXRDb25kaXRpb25JZCgpLmVxdWFscyhhY3R1YWwpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGlsbEZvdW5kTWF0Y2ggPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFzdGlsbEZvdW5kTWF0Y2gpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUEFTUzsKKyAgICAgICAgICAgICAgICAgICAgbmV4dCgpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RpbGxGb3VuZE1hdGNoICYmIC0tbVVuc3Vic2NyaWJlUmV0cmllcyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoTW9ja0NvbmRpdGlvblByb3ZpZGVyLlRBRywgIlN0aWxsIGZvdW5kIHN1YnNjcmlwdGlvbiwgcmV0cnlpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUkVURVNUOworICAgICAgICAgICAgICAgICAgICBuZXh0KCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0RmFpbGVkKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewogICAgICAgICAgICAgbU5tLnJlbW92ZUF1dG9tYXRpY1plblJ1bGUoaWQpOwotICAgICAgICAgICAgTW9ja0NvbmRpdGlvblByb3ZpZGVyLnJlc2V0RGF0YShtQ29udGV4dCk7Ci0gICAgICAgICAgICAvLyB3YWl0IGZvciBpbnRlbnQgdG8gbW92ZSB0aHJvdWdoIHRoZSBzeXN0ZW0KLSAgICAgICAgICAgIGRlbGF5KCk7CisgICAgICAgICAgICBNb2NrQ29uZGl0aW9uUHJvdmlkZXIuZ2V0SW5zdGFuY2UoKS5yZXNldERhdGEoKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNTUzLDEzICs2MTUsMTQgQEAKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLSAgICAgICAgICAgIE1vY2tDb25kaXRpb25Qcm92aWRlci5yZXNldERhdGEobUNvbnRleHQpOwotICAgICAgICAgICAgZGVsYXkoKTsKKyAgICAgICAgcHJvdGVjdGVkIEludGVudCBnZXRJbnRlbnQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEludGVudChTZXR0aW5ncy5BQ1RJT05fTk9USUZJQ0FUSU9OX1BPTElDWV9BQ0NFU1NfU0VUVElOR1MpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSBjbGFzcyBTZXJ2aWNlU3RvcHBlZFRlc3QgZXh0ZW5kcyBJbnRlcmFjdGl2ZVRlc3RDYXNlIHsKKyAgICAgICAgaW50IG1SZXRyaWVzID0gNTsKKwogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHJvdGVjdGVkIFZpZXcgaW5mbGF0ZShWaWV3R3JvdXAgcGFyZW50KSB7CiAgICAgICAgICAgICByZXR1cm4gY3JlYXRlQXV0b0l0ZW0ocGFyZW50LCBSLnN0cmluZy5jcF9zZXJ2aWNlX3N0b3BwZWQpOwpAQCAtNTY3LDI4ICs2MzAsMTggQEAKIAogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHJvdGVjdGVkIHZvaWQgdGVzdCgpIHsKLSAgICAgICAgICAgIE1vY2tDb25kaXRpb25Qcm92aWRlci5wcm9iZUNvbm5lY3RlZChtQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgbmV3IE1vY2tDb25kaXRpb25Qcm92aWRlci5Cb29sZWFuUmVzdWx0Q2F0Y2hlcigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYWNjZXB0KGJvb2xlYW4gcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dGYWlsKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFJFVEVTVDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBQQVNTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgZGVsYXkoKTsgIC8vIGluIGNhc2UgdGhlIGNhdGNoZXIgbmV2ZXIgcmV0dXJucwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotICAgICAgICAgICAgTW9ja0NvbmRpdGlvblByb3ZpZGVyLnJlc2V0RGF0YShtQ29udGV4dCk7Ci0gICAgICAgICAgICAvLyB3YWl0IGZvciBpbnRlbnQgdG8gbW92ZSB0aHJvdWdoIHRoZSBzeXN0ZW0KLSAgICAgICAgICAgIGRlbGF5KCk7CisgICAgICAgICAgICBpZiAoTW9ja0NvbmRpdGlvblByb3ZpZGVyLmdldEluc3RhbmNlKCkgPT0gbnVsbCB8fAorICAgICAgICAgICAgICAgICAgICAhTW9ja0NvbmRpdGlvblByb3ZpZGVyLmdldEluc3RhbmNlKCkuaXNDb25uZWN0ZWQoKSkgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBBU1M7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICgtLW1SZXRyaWVzID4gMCkgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBSRVRFU1Q7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nRmFpbCgpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBGQUlMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5leHQoKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNjExLDIxICs2NjQsNCBAQAogICAgIHByb3RlY3RlZCBWaWV3IGNyZWF0ZVNldHRpbmdzSXRlbShWaWV3R3JvdXAgcGFyZW50LCBpbnQgbWVzc2FnZUlkKSB7CiAgICAgICAgIHJldHVybiBjcmVhdGVVc2VySXRlbShwYXJlbnQsIFIuc3RyaW5nLmNwX3N0YXJ0X3NldHRpbmdzLCBtZXNzYWdlSWQpOwogICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGxhdW5jaFNldHRpbmdzKCkgewotICAgICAgICBzdGFydEFjdGl2aXR5KG5ldyBJbnRlbnQoU2V0dGluZ3MuQUNUSU9OX05PVElGSUNBVElPTl9QT0xJQ1lfQUNDRVNTX1NFVFRJTkdTKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWN0aW9uUHJlc3NlZChWaWV3IHYpIHsKLSAgICAgICAgT2JqZWN0IHRhZyA9IHYuZ2V0VGFnKCk7Ci0gICAgICAgIGlmICh0YWcgaW5zdGFuY2VvZiBJbnRlZ2VyKSB7Ci0gICAgICAgICAgICBpbnQgaWQgPSAoKEludGVnZXIpIHRhZykuaW50VmFsdWUoKTsKLSAgICAgICAgICAgIGlmIChpZCA9PSBSLnN0cmluZy5jcF9zdGFydF9zZXR0aW5ncykgewotICAgICAgICAgICAgICAgIGxhdW5jaFNldHRpbmdzKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGlkID09IFIuc3RyaW5nLmF0dGVudGlvbl9yZWFkeSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50VGVzdC5zdGF0dXMgPSBSRUFEWTsKLSAgICAgICAgICAgICAgICBuZXh0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9CiB9CmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbm90aWZpY2F0aW9ucy9JbnRlcmFjdGl2ZVZlcmlmaWVyQWN0aXZpdHkuamF2YSBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9ub3RpZmljYXRpb25zL0ludGVyYWN0aXZlVmVyaWZpZXJBY3Rpdml0eS5qYXZhCmluZGV4IDE0MzM5MTQuLmYxZjA4ZmYgMTAwNjQ0Ci0tLSBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9ub3RpZmljYXRpb25zL0ludGVyYWN0aXZlVmVyaWZpZXJBY3Rpdml0eS5qYXZhCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9ub3RpZmljYXRpb25zL0ludGVyYWN0aXZlVmVyaWZpZXJBY3Rpdml0eS5qYXZhCkBAIC0xNiw2ICsxNiw4IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLm5vdGlmaWNhdGlvbnM7CiAKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5BQ1RJT05fTk9USUZJQ0FUSU9OX0xJU1RFTkVSX1NFVFRJTkdTOworCiBpbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuYXBwLlNlcnZpY2U7CkBAIC02NSw4ICs2Nyw2IEBACiAKICAgICAvLyBUT0RPIHJlbW92ZSB0aGVzZSBvbmNlIGIvMTAwMjMzOTcgaXMgZml4ZWQKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkFCTEVEX05PVElGSUNBVElPTl9MSVNURU5FUlMgPSAiZW5hYmxlZF9ub3RpZmljYXRpb25fbGlzdGVuZXJzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RJRklDQVRJT05fTElTVEVORVJfU0VUVElOR1MgPQotICAgICAgICAgICAgImFuZHJvaWQuc2V0dGluZ3MuQUNUSU9OX05PVElGSUNBVElPTl9MSVNURU5FUl9TRVRUSU5HUyI7CiAKICAgICBwcm90ZWN0ZWQgSW50ZXJhY3RpdmVUZXN0Q2FzZSBtQ3VycmVudFRlc3Q7CiAgICAgcHJvdGVjdGVkIFBhY2thZ2VNYW5hZ2VyIG1QYWNrYWdlTWFuYWdlcjsKQEAgLTEzOSw2ICsxMzksMTIgQEAKICAgICAgICAgICAgIExvZy5lKFRBRywgImZhaWxlZCAiICsgdGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSArCiAgICAgICAgICAgICAgICAgICAgICgobWVzc2FnZSA9PSBudWxsKSA/ICIiIDogIjogIiArIG1lc3NhZ2UpLCBlKTsKICAgICAgICAgfQorCisgICAgICAgIC8vIElmIHRoaXMgdGVzdCBjb250YWlucyBhIGJ1dHRvbiB0aGF0IGxhdW5jaGVzIGFub3RoZXIgYWN0aXZpdHksIG92ZXJyaWRlIHRoaXMKKyAgICAgICAgLy8gbWV0aG9kIHRvIHByb3ZpZGUgdGhlIGludGVudCB0byBsYXVuY2guCisgICAgICAgIHByb3RlY3RlZCBJbnRlbnQgZ2V0SW50ZW50KCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KICAgICB9CiAKICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgaW50IGdldFRpdGxlUmVzb3VyY2UoKTsKQEAgLTM2MSwxNiArMzY3LDEyIEBACiAKICAgICAvLyBVSSBjYWxsYmFja3MKIAotICAgIHB1YmxpYyB2b2lkIGxhdW5jaFNldHRpbmdzKCkgewotICAgICAgICBzdGFydEFjdGl2aXR5KG5ldyBJbnRlbnQoTk9USUZJQ0FUSU9OX0xJU1RFTkVSX1NFVFRJTkdTKSk7Ci0gICAgfQotCiAgICAgcHVibGljIHZvaWQgYWN0aW9uUHJlc3NlZChWaWV3IHYpIHsKICAgICAgICAgT2JqZWN0IHRhZyA9IHYuZ2V0VGFnKCk7CiAgICAgICAgIGlmICh0YWcgaW5zdGFuY2VvZiBJbnRlZ2VyKSB7CiAgICAgICAgICAgICBpbnQgaWQgPSAoKEludGVnZXIpIHRhZykuaW50VmFsdWUoKTsKLSAgICAgICAgICAgIGlmIChpZCA9PSBSLnN0cmluZy5ubHNfc3RhcnRfc2V0dGluZ3MpIHsKLSAgICAgICAgICAgICAgICBsYXVuY2hTZXR0aW5ncygpOworICAgICAgICAgICAgaWYgKG1DdXJyZW50VGVzdCAhPSBudWxsICYmIG1DdXJyZW50VGVzdC5nZXRJbnRlbnQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc3RhcnRBY3Rpdml0eShtQ3VycmVudFRlc3QuZ2V0SW50ZW50KCkpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChpZCA9PSBSLnN0cmluZy5hdHRlbnRpb25fcmVhZHkpIHsKICAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnRUZXN0ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRUZXN0LnN0YXR1cyA9IFJFQURZOwpAQCAtNDcxLDcgKzQ3Myw3IEBACiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwcm90ZWN0ZWQgdm9pZCB0ZXN0KCkgewogICAgICAgICAgICAgbU5tLmNhbmNlbEFsbCgpOwotICAgICAgICAgICAgSW50ZW50IHNldHRpbmdzID0gbmV3IEludGVudChOT1RJRklDQVRJT05fTElTVEVORVJfU0VUVElOR1MpOworICAgICAgICAgICAgSW50ZW50IHNldHRpbmdzID0gbmV3IEludGVudChBQ1RJT05fTk9USUZJQ0FUSU9OX0xJU1RFTkVSX1NFVFRJTkdTKTsKICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5yZXNvbHZlQWN0aXZpdHkobVBhY2thZ2VNYW5hZ2VyKSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgbG9nRmFpbCgibm8gc2V0dGluZ3MgYWN0aXZpdHkiKTsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSBGQUlMOwpAQCAtNDg3LDEwICs0ODksNTcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKICAgICAgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBzZXJ2aWNlIHRvIHN0YXJ0CiAgICAgICAgICAgICBkZWxheSgpOwogICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBJbnRlbnQgZ2V0SW50ZW50KCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnRlbnQoQUNUSU9OX05PVElGSUNBVElPTl9MSVNURU5FUl9TRVRUSU5HUyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgY2xhc3MgQ2Fubm90QmVFbmFibGVkVGVzdCBleHRlbmRzIEludGVyYWN0aXZlVGVzdENhc2UgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIFZpZXcgaW5mbGF0ZShWaWV3R3JvdXAgcGFyZW50KSB7CisgICAgICAgICAgICByZXR1cm4gY3JlYXRlTmxzU2V0dGluZ3NJdGVtKHBhcmVudCwgUi5zdHJpbmcubmxzX2Nhbm5vdF9lbmFibGVfc2VydmljZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgYm9vbGVhbiBhdXRvU3RhcnQoKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCB0ZXN0KCkgeworICAgICAgICAgICAgbU5tLmNhbmNlbEFsbCgpOworICAgICAgICAgICAgSW50ZW50IHNldHRpbmdzID0gbmV3IEludGVudChBQ1RJT05fTk9USUZJQ0FUSU9OX0xJU1RFTkVSX1NFVFRJTkdTKTsKKyAgICAgICAgICAgIGlmIChzZXR0aW5ncy5yZXNvbHZlQWN0aXZpdHkobVBhY2thZ2VNYW5hZ2VyKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbG9nRmFpbCgibm8gc2V0dGluZ3MgYWN0aXZpdHkiKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBGQUlMOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbGlzdGVuZXJzID0gU2VjdXJlLmdldFN0cmluZyhnZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVOQUJMRURfTk9USUZJQ0FUSU9OX0xJU1RFTkVSUyk7CisgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVycyAhPSBudWxsICYmIGxpc3RlbmVycy5jb250YWlucyhMSVNURU5FUl9QQVRIKSkgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBGQUlMOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBBU1M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5leHQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgeworICAgICAgICAgICAgLy8gd2FpdCBmb3IgdGhlIHNlcnZpY2UgdG8gc3RhcnQKKyAgICAgICAgICAgIGRlbGF5KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIEludGVudCBnZXRJbnRlbnQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEludGVudChBQ1RJT05fTk9USUZJQ0FUSU9OX0xJU1RFTkVSX1NFVFRJTkdTKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHByb3RlY3RlZCBjbGFzcyBTZXJ2aWNlU3RhcnRlZFRlc3QgZXh0ZW5kcyBJbnRlcmFjdGl2ZVRlc3RDYXNlIHsKQEAgLTUxMSw0MSArNTYwLDQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLQotICAgIHByb3RlY3RlZCBjbGFzcyBDYW5ub3RCZUVuYWJsZWRUZXN0IGV4dGVuZHMgSW50ZXJhY3RpdmVUZXN0Q2FzZSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgVmlldyBpbmZsYXRlKFZpZXdHcm91cCBwYXJlbnQpIHsKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVObHNTZXR0aW5nc0l0ZW0ocGFyZW50LCBSLnN0cmluZy5ubHNfY2Fubm90X2VuYWJsZV9zZXJ2aWNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBib29sZWFuIGF1dG9TdGFydCgpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHRlc3QoKSB7Ci0gICAgICAgICAgICBtTm0uY2FuY2VsQWxsKCk7Ci0gICAgICAgICAgICBJbnRlbnQgc2V0dGluZ3MgPSBuZXcgSW50ZW50KE5PVElGSUNBVElPTl9MSVNURU5FUl9TRVRUSU5HUyk7Ci0gICAgICAgICAgICBpZiAoc2V0dGluZ3MucmVzb2x2ZUFjdGl2aXR5KG1QYWNrYWdlTWFuYWdlcikgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxvZ0ZhaWwoIm5vIHNldHRpbmdzIGFjdGl2aXR5Iik7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gRkFJTDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGxpc3RlbmVycyA9IFNlY3VyZS5nZXRTdHJpbmcoZ2V0Q29udGVudFJlc29sdmVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBFTkFCTEVEX05PVElGSUNBVElPTl9MSVNURU5FUlMpOwotICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lcnMgIT0gbnVsbCAmJiBsaXN0ZW5lcnMuY29udGFpbnMoTElTVEVORVJfUEFUSCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gRkFJTDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBQQVNTOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBuZXh0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLSAgICAgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBzZXJ2aWNlIHRvIHN0YXJ0Ci0gICAgICAgICAgICBkZWxheSgpOwotICAgICAgICB9Ci0gICAgfQotCiB9CmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbm90aWZpY2F0aW9ucy9Nb2NrQ29uZGl0aW9uUHJvdmlkZXIuamF2YSBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9ub3RpZmljYXRpb25zL01vY2tDb25kaXRpb25Qcm92aWRlci5qYXZhCmluZGV4IDQ4OTc5N2IuLmEzNmFiN2EgMTAwNjQ0Ci0tLSBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9ub3RpZmljYXRpb25zL01vY2tDb25kaXRpb25Qcm92aWRlci5qYXZhCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9ub3RpZmljYXRpb25zL01vY2tDb25kaXRpb25Qcm92aWRlci5qYXZhCkBAIC0xNiwxNiArMTYsOSBAQAogcGFja2FnZSBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIubm90aWZpY2F0aW9uczsKIAogCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuQXV0b21hdGljWmVuUnVsZTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLm5vdGlmaWNhdGlvbi5Db25kaXRpb247CiBpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLm5vdGlmaWNhdGlvbi5Db25kaXRpb25Qcm92aWRlclNlcnZpY2U7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIApAQCAtMzUsOTkgKzI4LDUwIEBACiBwdWJsaWMgY2xhc3MgTW9ja0NvbmRpdGlvblByb3ZpZGVyIGV4dGVuZHMgQ29uZGl0aW9uUHJvdmlkZXJTZXJ2aWNlIHsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNb2NrQ29uZGl0aW9uUHJvdmlkZXIiOwogCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFX05BTUUgPSAiY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLm5vdGlmaWNhdGlvbnMiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcG9uZW50TmFtZSBDT01QT05FTlRfTkFNRSA9CisgICAgICAgICAgICBuZXcgQ29tcG9uZW50TmFtZSgiY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyIiwgTW9ja0NvbmRpdGlvblByb3ZpZGVyLmNsYXNzLmdldE5hbWUoKSk7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIID0gIm1vY2tfY3AiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUlkgPSAicXVlcnlfaXRlbSI7CiAKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfQkFTRSA9ICJhbmRyb2lkLnNlcnZpY2Uubm90aWZpY2F0aW9uLmN0cy5Nb2NrQ29uZGl0aW9uUHJvdmlkZXIuIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfQ0hFQ0sgPSBTRVJWSUNFX0JBU0UgKyAiU0VSVklDRV9DSEVDSyI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX1JFU0VUID0gU0VSVklDRV9CQVNFICsgIlNFUlZJQ0VfUkVTRVQiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9TVUJTQ1JJQkUgPSBTRVJWSUNFX0JBU0UgKyAiU0VSVklDRV9TVUJTQ1JJQkUiOwotCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9QQVlMT0FEID0gIlBBWUxPQUQiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfSU5UID0gIklOVCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9CT09MRUFOID0gIkJPT0xFQU4iOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfVEFHID0gIlRBRyI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9DT0RFID0gIkNPREUiOwotCi0gICAgc3RhdGljIGZpbmFsIGludCBSRVNVTFRfTk9fU0VSVkVSID0gQWN0aXZpdHkuUkVTVUxUX0ZJUlNUX1VTRVIgKyAxOwotCi0KICAgICBwcml2YXRlIEFycmF5TGlzdDxVcmk+IG1TdWJzY3JpcHRpb25zID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1Db25uZWN0ZWQgPSBmYWxzZTsKICAgICBwcml2YXRlIEJyb2FkY2FzdFJlY2VpdmVyIG1SZWNlaXZlcjsKKyAgICBwcml2YXRlIHN0YXRpYyBNb2NrQ29uZGl0aW9uUHJvdmlkZXIgc0NvbmRpdGlvblByb3ZpZGVySW5zdGFuY2UgPSBudWxsOwogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25DcmVhdGUoKSB7CiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKCk7CiAgICAgICAgIExvZy5kKFRBRywgImNyZWF0ZWQiKTsKIAotICAgICAgICBtU3Vic2NyaXB0aW9ucyA9IG5ldyBBcnJheUxpc3Q8VXJpPigpOwotCi0gICAgICAgIG1SZWNlaXZlciA9IG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBhY3Rpb24gPSBpbnRlbnQuZ2V0QWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgaWYgKFNFUlZJQ0VfQ0hFQ0suZXF1YWxzKGFjdGlvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU0VSVklDRV9DSEVDSyIpOwotICAgICAgICAgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgICAgICAgICBidW5kbGUucHV0Qm9vbGVhbihFWFRSQV9CT09MRUFOLCBtQ29ubmVjdGVkKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0UmVzdWx0RXh0cmFzKGJ1bmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgIHNldFJlc3VsdENvZGUoQWN0aXZpdHkuUkVTVUxUX09LKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFNFUlZJQ0VfU1VCU0NSSUJFLmVxdWFscyhhY3Rpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlNFUlZJQ0VfU1VCU0NSSUJFIik7Ci0gICAgICAgICAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1bmRsZS5wdXRQYXJjZWxhYmxlQXJyYXlMaXN0KEVYVFJBX1BBWUxPQUQsIG1TdWJzY3JpcHRpb25zKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0UmVzdWx0RXh0cmFzKGJ1bmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgIHNldFJlc3VsdENvZGUoQWN0aXZpdHkuUkVTVUxUX09LKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFNFUlZJQ0VfUkVTRVQuZXF1YWxzKGFjdGlvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU0VSVklDRV9SRVNFVCIpOwotICAgICAgICAgICAgICAgICAgICByZXNldERhdGEoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJ1bmtub3duIGFjdGlvbiIpOwotICAgICAgICAgICAgICAgICAgICBzZXRSZXN1bHRDb2RlKEFjdGl2aXR5LlJFU1VMVF9DQU5DRUxFRCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEludGVudEZpbHRlcigpOwotICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKFNFUlZJQ0VfQ0hFQ0spOwotICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKFNFUlZJQ0VfU1VCU0NSSUJFKTsKLSAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihTRVJWSUNFX1JFU0VUKTsKLSAgICAgICAgcmVnaXN0ZXJSZWNlaXZlcihtUmVjZWl2ZXIsIGZpbHRlcik7CisgICAgICAgIG1TdWJzY3JpcHRpb25zID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25EZXN0cm95KCkgewogICAgICAgICBzdXBlci5vbkRlc3Ryb3koKTsKICAgICAgICAgbUNvbm5lY3RlZCA9IGZhbHNlOwotICAgICAgICB1bnJlZ2lzdGVyUmVjZWl2ZXIobVJlY2VpdmVyKTsKKyAgICAgICAgaWYgKG1SZWNlaXZlciAhPSBudWxsKSB7CisgICAgICAgICAgICB1bnJlZ2lzdGVyUmVjZWl2ZXIobVJlY2VpdmVyKTsKKyAgICAgICAgfQogICAgICAgICBtUmVjZWl2ZXIgPSBudWxsOwogICAgICAgICBMb2cuZChUQUcsICJkZXN0cm95ZWQiKTsKKyAgICAgICAgc0NvbmRpdGlvblByb3ZpZGVySW5zdGFuY2UgPSBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGVkKCkgeworICAgICAgICByZXR1cm4gbUNvbm5lY3RlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE1vY2tDb25kaXRpb25Qcm92aWRlciBnZXRJbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIHNDb25kaXRpb25Qcm92aWRlckluc3RhbmNlOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHJlc2V0RGF0YSgpIHsKICAgICAgICAgbVN1YnNjcmlwdGlvbnMuY2xlYXIoKTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXREYXRhKENvbnRleHQgY29udGV4dCkgewotICAgICAgICBzZW5kQ29tbWFuZChjb250ZXh0LCBTRVJWSUNFX1JFU0VULCBudWxsLCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJvYmVDb25uZWN0ZWQoQ29udGV4dCBjb250ZXh0LCBCb29sZWFuUmVzdWx0Q2F0Y2hlciBjYXRjaGVyKSB7Ci0gICAgICAgIHJlcXVlc3RDb25uZWN0ZWQoY29udGV4dCwgU0VSVklDRV9DSEVDSywgY2F0Y2hlcik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHByb2JlU3Vic2NyaWJlKENvbnRleHQgY29udGV4dCwgUGFyY2VsYWJsZUxpc3RSZXN1bHRDYXRjaGVyIGNhdGNoZXIpIHsKLSAgICAgICAgcmVxdWVzdFBhcmNlbGFibGVMaXN0UmVzdWx0KGNvbnRleHQsIFNFUlZJQ0VfU1VCU0NSSUJFLCBjYXRjaGVyKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHNlbmRDb21tYW5kKENvbnRleHQgY29udGV4dCwgU3RyaW5nIGFjdGlvbiwgU3RyaW5nIHRhZywgaW50IGNvZGUpIHsKLSAgICAgICAgSW50ZW50IGJyb2FkY2FzdCA9IG5ldyBJbnRlbnQoYWN0aW9uKTsKLSAgICAgICAgaWYgKHRhZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBicm9hZGNhc3QucHV0RXh0cmEoRVhUUkFfVEFHLCB0YWcpOwotICAgICAgICAgICAgYnJvYWRjYXN0LnB1dEV4dHJhKEVYVFJBX0NPREUsIGNvZGUpOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRleHQuc2VuZEJyb2FkY2FzdChicm9hZGNhc3QpOworICAgIHB1YmxpYyBMaXN0PFVyaT4gZ2V0U3Vic2NyaXB0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIG1TdWJzY3JpcHRpb25zOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgVXJpIHRvQ29uZGl0aW9uSWQoU3RyaW5nIHF1ZXJ5VmFsdWUpIHsKQEAgLTE0MSw2ICs4NSw3IEBACiAgICAgcHVibGljIHZvaWQgb25Db25uZWN0ZWQoKSB7CiAgICAgICAgIExvZy5kKFRBRywgImNvbm5lY3RlZCIpOwogICAgICAgICBtQ29ubmVjdGVkID0gdHJ1ZTsKKyAgICAgICAgc0NvbmRpdGlvblByb3ZpZGVySW5zdGFuY2UgPSB0aGlzOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMTU0LDM0ICs5OSw0IEBACiAgICAgICAgIExvZy5kKFRBRywgInVuc3Vic2NyaWJlZCBmcm9tICIgKyBjb25kaXRpb25JZCk7CiAgICAgICAgIG1TdWJzY3JpcHRpb25zLnJlbW92ZShjb25kaXRpb25JZCk7CiAgICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBCb29sZWFuUmVzdWx0Q2F0Y2hlciBleHRlbmRzIEJyb2FkY2FzdFJlY2VpdmVyIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgICAgIGFjY2VwdChnZXRSZXN1bHRFeHRyYXModHJ1ZSkuZ2V0Qm9vbGVhbihFWFRSQV9CT09MRUFOLCBmYWxzZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgYWJzdHJhY3QgcHVibGljIHZvaWQgYWNjZXB0KGJvb2xlYW4gcmVzdWx0KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJlcXVlc3RDb25uZWN0ZWQoQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgYWN0aW9uLAotICAgICAgICAgICAgQm9vbGVhblJlc3VsdENhdGNoZXIgY2F0Y2hlcikgewotICAgICAgICBJbnRlbnQgYnJvYWRjYXN0ID0gbmV3IEludGVudChhY3Rpb24pOwotICAgICAgICBjb250ZXh0LnNlbmRPcmRlcmVkQnJvYWRjYXN0KGJyb2FkY2FzdCwgbnVsbCwgY2F0Y2hlciwgbnVsbCwgUkVTVUxUX05PX1NFUlZFUiwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBQYXJjZWxhYmxlTGlzdFJlc3VsdENhdGNoZXIgZXh0ZW5kcyBCcm9hZGNhc3RSZWNlaXZlciB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgICAgICBhY2NlcHQoZ2V0UmVzdWx0RXh0cmFzKHRydWUpLmdldFBhcmNlbGFibGVBcnJheUxpc3QoRVhUUkFfUEFZTE9BRCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgYWJzdHJhY3QgcHVibGljIHZvaWQgYWNjZXB0KExpc3Q8UGFyY2VsYWJsZT4gcmVzdWx0KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJlcXVlc3RQYXJjZWxhYmxlTGlzdFJlc3VsdChDb250ZXh0IGNvbnRleHQsIFN0cmluZyBhY3Rpb24sCi0gICAgICAgICAgICBQYXJjZWxhYmxlTGlzdFJlc3VsdENhdGNoZXIgY2F0Y2hlcikgewotICAgICAgICBJbnRlbnQgYnJvYWRjYXN0ID0gbmV3IEludGVudChhY3Rpb24pOwotICAgICAgICBjb250ZXh0LnNlbmRPcmRlcmVkQnJvYWRjYXN0KGJyb2FkY2FzdCwgbnVsbCwgY2F0Y2hlciwgbnVsbCwgUkVTVUxUX05PX1NFUlZFUiwgbnVsbCwgbnVsbCk7Ci0gICAgfQogfQpkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL25vdGlmaWNhdGlvbnMvTW9ja0xpc3RlbmVyLmphdmEgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbm90aWZpY2F0aW9ucy9Nb2NrTGlzdGVuZXIuamF2YQppbmRleCA4YjVhY2Y4Li41ZGZlZTEyIDEwMDY0NAotLS0gYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbm90aWZpY2F0aW9ucy9Nb2NrTGlzdGVuZXIuamF2YQorKysgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbm90aWZpY2F0aW9ucy9Nb2NrTGlzdGVuZXIuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKIGltcG9ydCBhbmRyb2lkLnNlcnZpY2Uubm90aWZpY2F0aW9uLk5vdGlmaWNhdGlvbkxpc3RlbmVyU2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLnNlcnZpY2Uubm90aWZpY2F0aW9uLk5vdGlmaWNhdGlvblN0YXRzOwogaW1wb3J0IGFuZHJvaWQuc2VydmljZS5ub3RpZmljYXRpb24uU3RhdHVzQmFyTm90aWZpY2F0aW9uOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BcnJheU1hcDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwpAQCAtNDcsNiArNDgsNyBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fQU1CSUVOVCA9ICJhbWJpZW50IjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX01BVENIRVNfWkVOX0ZJTFRFUiA9ICJtYXRjaGVzX3plbl9maWx0ZXIiOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fUkVBU09OID0gInJlYXNvbiI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9TVEFUUyA9ICJzdGF0cyI7CiAKICAgICBBcnJheUxpc3Q8U3RyaW5nPiBtUG9zdGVkID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CiAgICAgQXJyYXlNYXA8U3RyaW5nLCBKU09OT2JqZWN0PiBtTm90aWZpY2F0aW9ucyA9IG5ldyBBcnJheU1hcDw+KCk7CkBAIC0xNzQsMTMgKzE3NiwxNCBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25Ob3RpZmljYXRpb25SZW1vdmVkKFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBzYm4sIFJhbmtpbmdNYXAgcmFua2luZ01hcCwKLSAgICAgICAgICAgIGludCByZWFzb24pIHsKKyAgICAgICAgICAgIE5vdGlmaWNhdGlvblN0YXRzIHN0YXRzLCBpbnQgcmVhc29uKSB7CiAgICAgICAgIExvZy5kKFRBRywgInJlbW92ZWQ6ICIgKyBzYm4uZ2V0VGFnKCkgKyAiIGZvciByZWFzb24gIiArIHJlYXNvbik7CiAgICAgICAgIG1SZW1vdmVkLmFkZChzYm4uZ2V0VGFnKCkpOwogICAgICAgICBKU09OT2JqZWN0IHJlbW92ZWQgPSBuZXcgSlNPTk9iamVjdCgpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgcmVtb3ZlZC5wdXQoSlNPTl9UQUcsIHNibi5nZXRUYWcoKSk7CiAgICAgICAgICAgICByZW1vdmVkLnB1dChKU09OX1JFQVNPTiwgcmVhc29uKTsKKyAgICAgICAgICAgIHJlbW92ZWQucHV0KEpTT05fU1RBVFMsIHN0YXRzICE9IG51bGwpOwogICAgICAgICB9IGNhdGNoIChKU09ORXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIExvZy5lKFRBRywgImZhaWxlZCB0byBwYWNrIHVwIG5vdGlmaWNhdGlvbiBwYXlsb2FkIiwgZSk7CiAgICAgICAgIH0KQEAgLTE4OSw1ICsxOTIsNCBAQAogICAgICAgICBtUmVtb3ZlZFJlYXNvbi5wdXQoc2JuLmdldFRhZygpLCByZW1vdmVkKTsKICAgICAgICAgb25Ob3RpZmljYXRpb25SYW5raW5nVXBkYXRlKHJhbmtpbmdNYXApOwogICAgIH0KLQogfQpkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL25vdGlmaWNhdGlvbnMvTm90aWZpY2F0aW9uTGlzdGVuZXJWZXJpZmllckFjdGl2aXR5LmphdmEgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvbm90aWZpY2F0aW9ucy9Ob3RpZmljYXRpb25MaXN0ZW5lclZlcmlmaWVyQWN0aXZpdHkuamF2YQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDdmM2JmYzcuLjJmZDI1MjEKLS0tIGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL25vdGlmaWNhdGlvbnMvTm90aWZpY2F0aW9uTGlzdGVuZXJWZXJpZmllckFjdGl2aXR5LmphdmEKKysrIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL25vdGlmaWNhdGlvbnMvTm90aWZpY2F0aW9uTGlzdGVuZXJWZXJpZmllckFjdGl2aXR5LmphdmEKQEAgLTE2LDI0ICsxNiw0NSBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5ub3RpZmljYXRpb25zOwogCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbk1hbmFnZXIuSU1QT1JUQU5DRV9MT1c7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbk1hbmFnZXIuSU1QT1JUQU5DRV9OT05FOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLkFDVElPTl9OT1RJRklDQVRJT05fTElTVEVORVJfU0VUVElOR1M7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuRVhUUkFfQVBQX1BBQ0tBR0U7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuRVhUUkFfQ0hBTk5FTF9JRDsKKworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIubm90aWZpY2F0aW9ucy5Nb2NrTGlzdGVuZXIuSlNPTl9GTEFHUzsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLm5vdGlmaWNhdGlvbnMuTW9ja0xpc3RlbmVyLkpTT05fSUNPTjsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLm5vdGlmaWNhdGlvbnMuTW9ja0xpc3RlbmVyLkpTT05fSUQ7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5ub3RpZmljYXRpb25zLk1vY2tMaXN0ZW5lci5KU09OX1BBQ0tBR0U7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5ub3RpZmljYXRpb25zLk1vY2tMaXN0ZW5lci5KU09OX1JFQVNPTjsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLm5vdGlmaWNhdGlvbnMuTW9ja0xpc3RlbmVyLkpTT05fU1RBVFM7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5ub3RpZmljYXRpb25zLk1vY2tMaXN0ZW5lci5KU09OX1RBRzsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLm5vdGlmaWNhdGlvbnMuTW9ja0xpc3RlbmVyLkpTT05fV0hFTjsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLm5vdGlmaWNhdGlvbnMuTW9ja0xpc3RlbmVyLlJFQVNPTl9MSVNURU5FUl9DQU5DRUw7CisKIGltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uU3VwcHJlc3NMaW50OwogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BbGVydERpYWxvZzsKIGltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb247CiBpbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uQ2hhbm5lbDsKLWltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb25NYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbkNoYW5uZWxHcm91cDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU2VjdXJlOwogaW1wb3J0IGFuZHJvaWQuc2VydmljZS5ub3RpZmljYXRpb24uU3RhdHVzQmFyTm90aWZpY2F0aW9uOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5hcHAuTm90aWZpY2F0aW9uQ29tcGF0OworaW1wb3J0IGFuZHJvaWR4LmNvcmUuYXBwLk5vdGlmaWNhdGlvbkNvbXBhdDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOwogCiBpbXBvcnQgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLlI7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNkZFRlc3Q7Ci0KIGltcG9ydCBvcmcuanNvbi5KU09ORXhjZXB0aW9uOwogaW1wb3J0IG9yZy5qc29uLkpTT05PYmplY3Q7CiAKQEAgLTQzLDE1ICs2NCwxMiBAQAogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLlVVSUQ7CiAKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLm5vdGlmaWNhdGlvbnMuTW9ja0xpc3RlbmVyLio7Ci0KLWltcG9ydCBzdGF0aWMganVuaXQuZnJhbWV3b3JrLkFzc2VydC5hc3NlcnROb3ROdWxsOwotCi1AQ2RkVGVzdChyZXF1aXJlbWVudD0iMy44LjMuMi9DLTEtMSxDLTEtMixDLTItMSIpCiBwdWJsaWMgY2xhc3MgTm90aWZpY2F0aW9uTGlzdGVuZXJWZXJpZmllckFjdGl2aXR5IGV4dGVuZHMgSW50ZXJhY3RpdmVWZXJpZmllckFjdGl2aXR5CiAgICAgICAgIGltcGxlbWVudHMgUnVubmFibGUgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTm9MaXN0ZW5lclZlcmlmaWVyIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9USUZJQ0FUSU9OX0NIQU5ORUxfSUQgPSBUQUc7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRlMgPSAibGlzdGVuZXJfcHJlZnMiOworICAgIGZpbmFsIGludCBOVU1fTk9USUZJQ0FUSU9OU19TRU5UID0gMzsgLy8gIyBub3RpZmljYXRpb25zIHNlbnQgYnkgc2VuZE5vdGlmaWNhdGlvbnMoKQogCiAgICAgcHJpdmF0ZSBTdHJpbmcgbVRhZzE7CiAgICAgcHJpdmF0ZSBTdHJpbmcgbVRhZzI7CkBAIC05NiwxMSArMTE0LDE4IEBACiAgICAgICAgICAgICB0ZXN0cy5hZGQobmV3IERhdGFJbnRhY3RUZXN0KCkpOwogICAgICAgICAgICAgdGVzdHMuYWRkKG5ldyBEaXNtaXNzT25lVGVzdCgpKTsKICAgICAgICAgICAgIHRlc3RzLmFkZChuZXcgRGlzbWlzc09uZVdpdGhSZWFzb25UZXN0KCkpOworICAgICAgICAgICAgdGVzdHMuYWRkKG5ldyBEaXNtaXNzT25lV2l0aFN0YXRzVGVzdCgpKTsKICAgICAgICAgICAgIHRlc3RzLmFkZChuZXcgRGlzbWlzc0FsbFRlc3QoKSk7CiAgICAgICAgICAgICB0ZXN0cy5hZGQobmV3IFNub296ZU5vdGlmaWNhdGlvbkZvclRpbWVUZXN0KCkpOwogICAgICAgICAgICAgdGVzdHMuYWRkKG5ldyBTbm9vemVOb3RpZmljYXRpb25Gb3JUaW1lQ2FuY2VsVGVzdCgpKTsKICAgICAgICAgICAgIHRlc3RzLmFkZChuZXcgR2V0U25vb3plZE5vdGlmaWNhdGlvblRlc3QoKSk7CiAgICAgICAgICAgICB0ZXN0cy5hZGQobmV3IEVuYWJsZUhpbnRzVGVzdCgpKTsKKyAgICAgICAgICAgIHRlc3RzLmFkZChuZXcgUmVjZWl2ZUFwcEJsb2NrTm90aWNlVGVzdCgpKTsKKyAgICAgICAgICAgIHRlc3RzLmFkZChuZXcgUmVjZWl2ZUFwcFVuYmxvY2tOb3RpY2VUZXN0KCkpOworICAgICAgICAgICAgaWYgKCFnZXRQYWNrYWdlTWFuYWdlcigpLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9BVVRPTU9USVZFKSkgeworICAgICAgICAgICAgICAgIHRlc3RzLmFkZChuZXcgUmVjZWl2ZUNoYW5uZWxCbG9ja05vdGljZVRlc3QoKSk7CisgICAgICAgICAgICAgICAgdGVzdHMuYWRkKG5ldyBSZWNlaXZlR3JvdXBCbG9ja05vdGljZVRlc3QoKSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICB0ZXN0cy5hZGQobmV3IFJlcXVlc3RVbmJpbmRUZXN0KCkpOwogICAgICAgICAgICAgdGVzdHMuYWRkKG5ldyBSZXF1ZXN0QmluZFRlc3QoKSk7CiAgICAgICAgICAgICB0ZXN0cy5hZGQobmV3IE1lc3NhZ2VCdW5kbGVUZXN0KCkpOwpAQCAtMTE0LDcgKzEzOSw3IEBACiAKICAgICBwcml2YXRlIHZvaWQgY3JlYXRlQ2hhbm5lbCgpIHsKICAgICAgICAgTm90aWZpY2F0aW9uQ2hhbm5lbCBjaGFubmVsID0gbmV3IE5vdGlmaWNhdGlvbkNoYW5uZWwoTk9USUZJQ0FUSU9OX0NIQU5ORUxfSUQsCi0gICAgICAgICAgICAgICAgTk9USUZJQ0FUSU9OX0NIQU5ORUxfSUQsIE5vdGlmaWNhdGlvbk1hbmFnZXIuSU1QT1JUQU5DRV9MT1cpOworICAgICAgICAgICAgICAgIE5PVElGSUNBVElPTl9DSEFOTkVMX0lELCBJTVBPUlRBTkNFX0xPVyk7CiAgICAgICAgIG1ObS5jcmVhdGVOb3RpZmljYXRpb25DaGFubmVsKGNoYW5uZWwpOwogICAgIH0KIApAQCAtMTgxLDcgKzIwNiw2IEBACiAgICAgfQogCiAgICAgLy8gVGVzdHMKLQogICAgIHByaXZhdGUgY2xhc3MgTm90aWZpY2F0aW9uUmVjZWl2ZWRUZXN0IGV4dGVuZHMgSW50ZXJhY3RpdmVUZXN0Q2FzZSB7CiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwcm90ZWN0ZWQgVmlldyBpbmZsYXRlKFZpZXdHcm91cCBwYXJlbnQpIHsKQEAgLTIxNSw2ICsyMzksMzAwIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbm90aWZpY2F0aW9uIGNoYW5uZWwuIFNlbmRzIHRoZSB1c2VyIHRvIHNldHRpbmdzIHRvIGJsb2NrIHRoZSBjaGFubmVsLiBXYWl0cworICAgICAqIHRvIHJlY2VpdmUgdGhlIGJyb2FkY2FzdCB0aGF0IHRoZSBjaGFubmVsIHdhcyBibG9ja2VkLCBhbmQgY29uZmlybXMgdGhhdCB0aGUgYnJvYWRjYXN0CisgICAgICogY29udGFpbnMgdGhlIGNvcnJlY3QgZXh0cmFzLgorICAgICAqLworICAgIHByb3RlY3RlZCBjbGFzcyBSZWNlaXZlQ2hhbm5lbEJsb2NrTm90aWNlVGVzdCBleHRlbmRzIEludGVyYWN0aXZlVGVzdENhc2UgeworICAgICAgICBwcml2YXRlIFN0cmluZyBtQ2hhbm5lbElkOworICAgICAgICBwcml2YXRlIGludCBtUmV0cmllcyA9IDI7CisgICAgICAgIHByaXZhdGUgVmlldyBtVmlldzsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBWaWV3IGluZmxhdGUoVmlld0dyb3VwIHBhcmVudCkgeworICAgICAgICAgICAgbVZpZXcgPSBjcmVhdGVObHNTZXR0aW5nc0l0ZW0ocGFyZW50LCBSLnN0cmluZy5ubHNfYmxvY2tfY2hhbm5lbCk7CisgICAgICAgICAgICBCdXR0b24gYnV0dG9uID0gbVZpZXcuZmluZFZpZXdCeUlkKFIuaWQubmxzX2FjdGlvbl9idXR0b24pOworICAgICAgICAgICAgYnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOworICAgICAgICAgICAgcmV0dXJuIG1WaWV3OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgeworICAgICAgICAgICAgbUNoYW5uZWxJZCA9IFVVSUQucmFuZG9tVVVJRCgpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICBOb3RpZmljYXRpb25DaGFubmVsIGNoYW5uZWwgPSBuZXcgTm90aWZpY2F0aW9uQ2hhbm5lbCgKKyAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWxJZCwgIlJlY2VpdmVDaGFubmVsQmxvY2tOb3RpY2VUZXN0IiwgSU1QT1JUQU5DRV9MT1cpOworICAgICAgICAgICAgbU5tLmNyZWF0ZU5vdGlmaWNhdGlvbkNoYW5uZWwoY2hhbm5lbCk7CisgICAgICAgICAgICBzdGF0dXMgPSBSRUFEWTsKKyAgICAgICAgICAgIEJ1dHRvbiBidXR0b24gPSBtVmlldy5maW5kVmlld0J5SWQoUi5pZC5ubHNfYWN0aW9uX2J1dHRvbik7CisgICAgICAgICAgICBidXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBib29sZWFuIGF1dG9TdGFydCgpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHRlc3QoKSB7CisgICAgICAgICAgICBOb3RpZmljYXRpb25DaGFubmVsIGNoYW5uZWwgPSBtTm0uZ2V0Tm90aWZpY2F0aW9uQ2hhbm5lbChtQ2hhbm5lbElkKTsKKyAgICAgICAgICAgIFNoYXJlZFByZWZlcmVuY2VzIHByZWZzID0gbUNvbnRleHQuZ2V0U2hhcmVkUHJlZmVyZW5jZXMoCisgICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkxpc3RlbmVyVmVyaWZpZXJBY3Rpdml0eS5QUkVGUywgQ29udGV4dC5NT0RFX1BSSVZBVEUpOworCisgICAgICAgICAgICBpZiAoY2hhbm5lbC5nZXRJbXBvcnRhbmNlKCkgPT0gSU1QT1JUQU5DRV9OT05FKSB7CisgICAgICAgICAgICAgICAgaWYgKHByZWZzLmNvbnRhaW5zKG1DaGFubmVsSWQpICYmIHByZWZzLmdldEJvb2xlYW4obUNoYW5uZWxJZCwgZmFsc2UpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBBU1M7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1SZXRyaWVzID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVJldHJpZXMtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFJFVEVTVDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEZBSUw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIHVzZXIgaGFzbid0IGp1bXBlZCB0byBzZXR0aW5ncyB0byBibG9jayB0aGUgY2hhbm5lbCB5ZXQKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBXQUlUX0ZPUl9VU0VSOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBuZXh0KCk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKKyAgICAgICAgICAgIE1vY2tMaXN0ZW5lci5nZXRJbnN0YW5jZSgpLnJlc2V0RGF0YSgpOworICAgICAgICAgICAgbU5tLmRlbGV0ZU5vdGlmaWNhdGlvbkNoYW5uZWwobUNoYW5uZWxJZCk7CisgICAgICAgICAgICBTaGFyZWRQcmVmZXJlbmNlcyBwcmVmcyA9IG1Db250ZXh0LmdldFNoYXJlZFByZWZlcmVuY2VzKAorICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25MaXN0ZW5lclZlcmlmaWVyQWN0aXZpdHkuUFJFRlMsIENvbnRleHQuTU9ERV9QUklWQVRFKTsKKyAgICAgICAgICAgIFNoYXJlZFByZWZlcmVuY2VzLkVkaXRvciBlZGl0b3IgPSBwcmVmcy5lZGl0KCk7CisgICAgICAgICAgICBlZGl0b3IucmVtb3ZlKG1DaGFubmVsSWQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBJbnRlbnQgZ2V0SW50ZW50KCkgeworICAgICAgICAgcmV0dXJuIG5ldyBJbnRlbnQoU2V0dGluZ3MuQUNUSU9OX0NIQU5ORUxfTk9USUZJQ0FUSU9OX1NFVFRJTkdTKQorICAgICAgICAgICAgICAgICAucHV0RXh0cmEoRVhUUkFfQVBQX1BBQ0tBR0UsIG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCkpCisgICAgICAgICAgICAgICAgIC5wdXRFeHRyYShFWFRSQV9DSEFOTkVMX0lELCBtQ2hhbm5lbElkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBub3RpZmljYXRpb24gY2hhbm5lbCBncm91cC4gU2VuZHMgdGhlIHVzZXIgdG8gc2V0dGluZ3MgdG8gYmxvY2sgdGhlIGdyb3VwLiBXYWl0cworICAgICAqIHRvIHJlY2VpdmUgdGhlIGJyb2FkY2FzdCB0aGF0IHRoZSBncm91cCB3YXMgYmxvY2tlZCwgYW5kIGNvbmZpcm1zIHRoYXQgdGhlIGJyb2FkY2FzdCBjb250YWlucworICAgICAqIHRoZSBjb3JyZWN0IGV4dHJhcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgY2xhc3MgUmVjZWl2ZUdyb3VwQmxvY2tOb3RpY2VUZXN0IGV4dGVuZHMgSW50ZXJhY3RpdmVUZXN0Q2FzZSB7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1Hcm91cElkOworICAgICAgICBwcml2YXRlIGludCBtUmV0cmllcyA9IDI7CisgICAgICAgIHByaXZhdGUgVmlldyBtVmlldzsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBWaWV3IGluZmxhdGUoVmlld0dyb3VwIHBhcmVudCkgeworICAgICAgICAgICAgbVZpZXcgPSBjcmVhdGVObHNTZXR0aW5nc0l0ZW0ocGFyZW50LCBSLnN0cmluZy5ubHNfYmxvY2tfZ3JvdXApOworICAgICAgICAgICAgQnV0dG9uIGJ1dHRvbiA9IG1WaWV3LmZpbmRWaWV3QnlJZChSLmlkLm5sc19hY3Rpb25fYnV0dG9uKTsKKyAgICAgICAgICAgIGJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgICAgIHJldHVybiBtVmlldzsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgICAgIG1Hcm91cElkID0gVVVJRC5yYW5kb21VVUlEKCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIE5vdGlmaWNhdGlvbkNoYW5uZWxHcm91cCBncm91cAorICAgICAgICAgICAgICAgICAgICA9IG5ldyBOb3RpZmljYXRpb25DaGFubmVsR3JvdXAobUdyb3VwSWQsICJSZWNlaXZlQ2hhbm5lbEdyb3VwQmxvY2tOb3RpY2VUZXN0Iik7CisgICAgICAgICAgICBtTm0uY3JlYXRlTm90aWZpY2F0aW9uQ2hhbm5lbEdyb3VwKGdyb3VwKTsKKyAgICAgICAgICAgIE5vdGlmaWNhdGlvbkNoYW5uZWwgY2hhbm5lbCA9IG5ldyBOb3RpZmljYXRpb25DaGFubmVsKAorICAgICAgICAgICAgICAgICAgICBtR3JvdXBJZCwgIlJlY2VpdmVDaGFubmVsQmxvY2tOb3RpY2VUZXN0IiwgSU1QT1JUQU5DRV9MT1cpOworICAgICAgICAgICAgY2hhbm5lbC5zZXRHcm91cChtR3JvdXBJZCk7CisgICAgICAgICAgICBtTm0uY3JlYXRlTm90aWZpY2F0aW9uQ2hhbm5lbChjaGFubmVsKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IFJFQURZOworICAgICAgICAgICAgQnV0dG9uIGJ1dHRvbiA9IG1WaWV3LmZpbmRWaWV3QnlJZChSLmlkLm5sc19hY3Rpb25fYnV0dG9uKTsKKyAgICAgICAgICAgIGJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIGJvb2xlYW4gYXV0b1N0YXJ0KCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgdGVzdCgpIHsKKyAgICAgICAgICAgIE5vdGlmaWNhdGlvbkNoYW5uZWxHcm91cCBncm91cCA9IG1ObS5nZXROb3RpZmljYXRpb25DaGFubmVsR3JvdXAobUdyb3VwSWQpOworICAgICAgICAgICAgU2hhcmVkUHJlZmVyZW5jZXMgcHJlZnMgPSBtQ29udGV4dC5nZXRTaGFyZWRQcmVmZXJlbmNlcygKKyAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uTGlzdGVuZXJWZXJpZmllckFjdGl2aXR5LlBSRUZTLCBDb250ZXh0Lk1PREVfUFJJVkFURSk7CisKKyAgICAgICAgICAgIGlmIChncm91cC5pc0Jsb2NrZWQoKSkgeworICAgICAgICAgICAgICAgIGlmIChwcmVmcy5jb250YWlucyhtR3JvdXBJZCkgJiYgcHJlZnMuZ2V0Qm9vbGVhbihtR3JvdXBJZCwgZmFsc2UpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBBU1M7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1SZXRyaWVzID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVJldHJpZXMtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFJFVEVTVDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEZBSUw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIHVzZXIgaGFzbid0IGp1bXBlZCB0byBzZXR0aW5ncyB0byBibG9jayB0aGUgZ3JvdXAgeWV0CisgICAgICAgICAgICAgICAgc3RhdHVzID0gV0FJVF9GT1JfVVNFUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbmV4dCgpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7CisgICAgICAgICAgICBNb2NrTGlzdGVuZXIuZ2V0SW5zdGFuY2UoKS5yZXNldERhdGEoKTsKKyAgICAgICAgICAgIG1ObS5kZWxldGVOb3RpZmljYXRpb25DaGFubmVsR3JvdXAobUdyb3VwSWQpOworICAgICAgICAgICAgU2hhcmVkUHJlZmVyZW5jZXMgcHJlZnMgPSBtQ29udGV4dC5nZXRTaGFyZWRQcmVmZXJlbmNlcygKKyAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uTGlzdGVuZXJWZXJpZmllckFjdGl2aXR5LlBSRUZTLCBDb250ZXh0Lk1PREVfUFJJVkFURSk7CisgICAgICAgICAgICBTaGFyZWRQcmVmZXJlbmNlcy5FZGl0b3IgZWRpdG9yID0gcHJlZnMuZWRpdCgpOworICAgICAgICAgICAgZWRpdG9yLnJlbW92ZShtR3JvdXBJZCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIEludGVudCBnZXRJbnRlbnQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEludGVudChTZXR0aW5ncy5BQ1RJT05fQVBQX05PVElGSUNBVElPTl9TRVRUSU5HUykKKyAgICAgICAgICAgICAgICAgICAgLmFkZEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX0NMRUFSX1RBU0spCisgICAgICAgICAgICAgICAgICAgIC5wdXRFeHRyYShFWFRSQV9BUFBfUEFDS0FHRSwgbUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kcyB0aGUgdXNlciB0byBzZXR0aW5ncyB0byBibG9jayB0aGUgYXBwLiBXYWl0cyB0byByZWNlaXZlIHRoZSBicm9hZGNhc3QgdGhhdCB0aGUgYXBwIHdhcworICAgICAqIGJsb2NrZWQsIGFuZCBjb25maXJtcyB0aGF0IHRoZSBicm9hZGNhc3QgY29udGFpbnMgdGhlIGNvcnJlY3QgZXh0cmFzLgorICAgICAqLworICAgIHByb3RlY3RlZCBjbGFzcyBSZWNlaXZlQXBwQmxvY2tOb3RpY2VUZXN0IGV4dGVuZHMgSW50ZXJhY3RpdmVUZXN0Q2FzZSB7CisgICAgICAgIHByaXZhdGUgaW50IG1SZXRyaWVzID0gMjsKKyAgICAgICAgcHJpdmF0ZSBWaWV3IG1WaWV3OworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIFZpZXcgaW5mbGF0ZShWaWV3R3JvdXAgcGFyZW50KSB7CisgICAgICAgICAgICBtVmlldyA9IGNyZWF0ZU5sc1NldHRpbmdzSXRlbShwYXJlbnQsIFIuc3RyaW5nLm5sc19ibG9ja19hcHApOworICAgICAgICAgICAgQnV0dG9uIGJ1dHRvbiA9IG1WaWV3LmZpbmRWaWV3QnlJZChSLmlkLm5sc19hY3Rpb25fYnV0dG9uKTsKKyAgICAgICAgICAgIGJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgICAgIHJldHVybiBtVmlldzsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IFJFQURZOworICAgICAgICAgICAgQnV0dG9uIGJ1dHRvbiA9IG1WaWV3LmZpbmRWaWV3QnlJZChSLmlkLm5sc19hY3Rpb25fYnV0dG9uKTsKKyAgICAgICAgICAgIGJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIGJvb2xlYW4gYXV0b1N0YXJ0KCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgdGVzdCgpIHsKKyAgICAgICAgICAgIFNoYXJlZFByZWZlcmVuY2VzIHByZWZzID0gbUNvbnRleHQuZ2V0U2hhcmVkUHJlZmVyZW5jZXMoCisgICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkxpc3RlbmVyVmVyaWZpZXJBY3Rpdml0eS5QUkVGUywgQ29udGV4dC5NT0RFX1BSSVZBVEUpOworCisgICAgICAgICAgICBpZiAoIW1ObS5hcmVOb3RpZmljYXRpb25zRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiR290IGJyb2FkY2FzdCAiICsgcHJlZnMuY29udGFpbnMobUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSkpOworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkJyb2FkY2FzdCBjb250YWlucyBjb3JyZWN0IGRhdGE/ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgcHJlZnMuZ2V0Qm9vbGVhbihtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpLCBmYWxzZSkpOworICAgICAgICAgICAgICAgIGlmIChwcmVmcy5jb250YWlucyhtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgcHJlZnMuZ2V0Qm9vbGVhbihtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpLCBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUEFTUzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAobVJldHJpZXMgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtUmV0cmllcy0tOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUkVURVNUOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gRkFJTDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiTm90aWZpY2F0aW9ucyBzdGlsbCBlbmFibGVkIik7CisgICAgICAgICAgICAgICAgLy8gdXNlciBoYXNuJ3QganVtcGVkIHRvIHNldHRpbmdzIHRvIGJsb2NrIHRoZSBhcHAgeWV0CisgICAgICAgICAgICAgICAgc3RhdHVzID0gV0FJVF9GT1JfVVNFUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbmV4dCgpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7CisgICAgICAgICAgICBNb2NrTGlzdGVuZXIuZ2V0SW5zdGFuY2UoKS5yZXNldERhdGEoKTsKKyAgICAgICAgICAgIFNoYXJlZFByZWZlcmVuY2VzIHByZWZzID0gbUNvbnRleHQuZ2V0U2hhcmVkUHJlZmVyZW5jZXMoCisgICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkxpc3RlbmVyVmVyaWZpZXJBY3Rpdml0eS5QUkVGUywgQ29udGV4dC5NT0RFX1BSSVZBVEUpOworICAgICAgICAgICAgU2hhcmVkUHJlZmVyZW5jZXMuRWRpdG9yIGVkaXRvciA9IHByZWZzLmVkaXQoKTsKKyAgICAgICAgICAgIGVkaXRvci5yZW1vdmUobUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIEludGVudCBnZXRJbnRlbnQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEludGVudChTZXR0aW5ncy5BQ1RJT05fQVBQX05PVElGSUNBVElPTl9TRVRUSU5HUykKKyAgICAgICAgICAgICAgICAgICAgLmFkZEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX0NMRUFSX1RBU0spCisgICAgICAgICAgICAgICAgICAgIC5wdXRFeHRyYShFWFRSQV9BUFBfUEFDS0FHRSwgbUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kcyB0aGUgdXNlciB0byBzZXR0aW5ncyB0byB1bmJsb2NrIHRoZSBhcHAuIFdhaXRzIHRvIHJlY2VpdmUgdGhlIGJyb2FkY2FzdCB0aGF0IHRoZSBhcHAKKyAgICAgKiB3YXMgdW5ibG9ja2VkLCBhbmQgY29uZmlybXMgdGhhdCB0aGUgYnJvYWRjYXN0IGNvbnRhaW5zIHRoZSBjb3JyZWN0IGV4dHJhcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgY2xhc3MgUmVjZWl2ZUFwcFVuYmxvY2tOb3RpY2VUZXN0IGV4dGVuZHMgSW50ZXJhY3RpdmVUZXN0Q2FzZSB7CisgICAgICAgIHByaXZhdGUgaW50IG1SZXRyaWVzID0gMjsKKyAgICAgICAgcHJpdmF0ZSBWaWV3IG1WaWV3OworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIFZpZXcgaW5mbGF0ZShWaWV3R3JvdXAgcGFyZW50KSB7CisgICAgICAgICAgICBtVmlldyA9IGNyZWF0ZU5sc1NldHRpbmdzSXRlbShwYXJlbnQsIFIuc3RyaW5nLm5sc191bmJsb2NrX2FwcCk7CisgICAgICAgICAgICBCdXR0b24gYnV0dG9uID0gbVZpZXcuZmluZFZpZXdCeUlkKFIuaWQubmxzX2FjdGlvbl9idXR0b24pOworICAgICAgICAgICAgYnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOworICAgICAgICAgICAgcmV0dXJuIG1WaWV3OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgeworICAgICAgICAgICAgc3RhdHVzID0gUkVBRFk7CisgICAgICAgICAgICBCdXR0b24gYnV0dG9uID0gbVZpZXcuZmluZFZpZXdCeUlkKFIuaWQubmxzX2FjdGlvbl9idXR0b24pOworICAgICAgICAgICAgYnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgYm9vbGVhbiBhdXRvU3RhcnQoKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCB0ZXN0KCkgeworICAgICAgICAgICAgU2hhcmVkUHJlZmVyZW5jZXMgcHJlZnMgPSBtQ29udGV4dC5nZXRTaGFyZWRQcmVmZXJlbmNlcygKKyAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uTGlzdGVuZXJWZXJpZmllckFjdGl2aXR5LlBSRUZTLCBDb250ZXh0Lk1PREVfUFJJVkFURSk7CisKKyAgICAgICAgICAgIGlmIChtTm0uYXJlTm90aWZpY2F0aW9uc0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIGlmIChwcmVmcy5jb250YWlucyhtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXByZWZzLmdldEJvb2xlYW4obUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSwgdHJ1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUEFTUzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAobVJldHJpZXMgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtUmV0cmllcy0tOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUkVURVNUOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gRkFJTDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gdXNlciBoYXNuJ3QganVtcGVkIHRvIHNldHRpbmdzIHRvIGJsb2NrIHRoZSBhcHAgeWV0CisgICAgICAgICAgICAgICAgc3RhdHVzID0gV0FJVF9GT1JfVVNFUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbmV4dCgpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7CisgICAgICAgICAgICBNb2NrTGlzdGVuZXIuZ2V0SW5zdGFuY2UoKS5yZXNldERhdGEoKTsKKyAgICAgICAgICAgIFNoYXJlZFByZWZlcmVuY2VzIHByZWZzID0gbUNvbnRleHQuZ2V0U2hhcmVkUHJlZmVyZW5jZXMoCisgICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkxpc3RlbmVyVmVyaWZpZXJBY3Rpdml0eS5QUkVGUywgQ29udGV4dC5NT0RFX1BSSVZBVEUpOworICAgICAgICAgICAgU2hhcmVkUHJlZmVyZW5jZXMuRWRpdG9yIGVkaXRvciA9IHByZWZzLmVkaXQoKTsKKyAgICAgICAgICAgIGVkaXRvci5yZW1vdmUobUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIEludGVudCBnZXRJbnRlbnQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEludGVudChTZXR0aW5ncy5BQ1RJT05fQVBQX05PVElGSUNBVElPTl9TRVRUSU5HUykKKyAgICAgICAgICAgICAgICAgICAgLmFkZEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX0NMRUFSX1RBU0spCisgICAgICAgICAgICAgICAgICAgIC5wdXRFeHRyYShFWFRSQV9BUFBfUEFDS0FHRSwgbUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwcml2YXRlIGNsYXNzIERhdGFJbnRhY3RUZXN0IGV4dGVuZHMgSW50ZXJhY3RpdmVUZXN0Q2FzZSB7CiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwcm90ZWN0ZWQgVmlldyBpbmZsYXRlKFZpZXdHcm91cCBwYXJlbnQpIHsKQEAgLTM5NSw2ICs3MTMsNjEgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgY2xhc3MgRGlzbWlzc09uZVdpdGhTdGF0c1Rlc3QgZXh0ZW5kcyBJbnRlcmFjdGl2ZVRlc3RDYXNlIHsKKyAgICAgICAgaW50IG1SZXRyaWVzID0gMzsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIFZpZXcgaW5mbGF0ZShWaWV3R3JvdXAgcGFyZW50KSB7CisgICAgICAgICAgICByZXR1cm4gY3JlYXRlQXV0b0l0ZW0ocGFyZW50LCBSLnN0cmluZy5ubHNfY2xlYXJfb25lX3N0YXRzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgICAgIGNyZWF0ZUNoYW5uZWwoKTsKKyAgICAgICAgICAgIHNlbmROb3RpZmljYXRpb25zKCk7CisgICAgICAgICAgICBzdGF0dXMgPSBSRUFEWTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCB0ZXN0KCkgeworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBSRUFEWSkgeworICAgICAgICAgICAgICAgIE1vY2tMaXN0ZW5lci5nZXRJbnN0YW5jZSgpLmNhbmNlbE5vdGlmaWNhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1vY2tMaXN0ZW5lci5nZXRJbnN0YW5jZSgpLmdldEtleUZvclRhZyhtVGFnMSkpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IFJFVEVTVDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTGlzdDxKU09OT2JqZWN0PiByZXN1bHQgPQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDw+KE1vY2tMaXN0ZW5lci5nZXRJbnN0YW5jZSgpLm1SZW1vdmVkUmVhc29uLnZhbHVlcygpKTsKKyAgICAgICAgICAgICAgICBib29sZWFuIHBhc3MgPSB0cnVlOworICAgICAgICAgICAgICAgIGZvciAoSlNPTk9iamVjdCBwYXlsb2FkIDogcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzICY9IChwYXlsb2FkLmdldEJvb2xlYW4oSlNPTl9TVEFUUykgPT0gZmFsc2UpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChKU09ORXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHBhc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUEFTUzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoLS1tUmV0cmllcyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNsZWVwKDEwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBSRVRFU1Q7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2dGYWlsKCJOb3RpZmljYXRpb24gbGlzdGVuZXIgZ290IHBvcHVsYXRlZCBzdGF0cyBvYmplY3QuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBGQUlMOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgeworICAgICAgICAgICAgbU5tLmNhbmNlbEFsbCgpOworICAgICAgICAgICAgZGVsZXRlQ2hhbm5lbCgpOworICAgICAgICAgICAgTW9ja0xpc3RlbmVyLmdldEluc3RhbmNlKCkucmVzZXREYXRhKCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwcml2YXRlIGNsYXNzIERpc21pc3NBbGxUZXN0IGV4dGVuZHMgSW50ZXJhY3RpdmVUZXN0Q2FzZSB7CiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwcm90ZWN0ZWQgVmlldyBpbmZsYXRlKFZpZXdHcm91cCBwYXJlbnQpIHsKQEAgLTQ2MSw2ICs4MzQsMTEgQEAKICAgICAgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7CiAgICAgICAgICAgICBNb2NrTGlzdGVuZXIuZ2V0SW5zdGFuY2UoKS5yZXNldERhdGEoKTsKICAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgSW50ZW50IGdldEludGVudCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSW50ZW50KEFDVElPTl9OT1RJRklDQVRJT05fTElTVEVORVJfU0VUVElOR1MpOworICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSBjbGFzcyBTZXJ2aWNlU3RvcHBlZFRlc3QgZXh0ZW5kcyBJbnRlcmFjdGl2ZVRlc3RDYXNlIHsKQEAgLTQ4NCw2ICs4NjIsMTEgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIEludGVudCBnZXRJbnRlbnQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEludGVudChBQ1RJT05fTk9USUZJQ0FUSU9OX0xJU1RFTkVSX1NFVFRJTkdTKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgY2xhc3MgTm90aWZpY2F0aW9uTm90UmVjZWl2ZWRUZXN0IGV4dGVuZHMgSW50ZXJhY3RpdmVUZXN0Q2FzZSB7CkBAIC05MzUsNyArMTMxOCw3IEBACiAgICAgICAgICAgICAgICAgbmV4dCgpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIENhbiBvbmx5IHJlYWQgaW4gTWVzc2FnaW5TdHlsZSB1c2luZyB0aGUgY29tcGF0IGNsYXNzLgorICAgICAgICAgICAgLy8gQ2FuIG9ubHkgcmVhZCBpbiBNZXNzYWdpbmdTdHlsZSB1c2luZyB0aGUgY29tcGF0IGNsYXNzLgogICAgICAgICAgICAgTm90aWZpY2F0aW9uQ29tcGF0Lk1lc3NhZ2luZ1N0eWxlIHJlYWRTdHlsZSA9CiAgICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkNvbXBhdC5NZXNzYWdpbmdTdHlsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5leHRyYWN0TWVzc2FnaW5nU3R5bGVGcm9tTm90aWZpY2F0aW9uKApkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL3NjcmVlbnBpbm5pbmcvU2NyZWVuUGlubmluZ1Rlc3RBY3Rpdml0eS5qYXZhIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL3NjcmVlbnBpbm5pbmcvU2NyZWVuUGlubmluZ1Rlc3RBY3Rpdml0eS5qYXZhCmluZGV4IDE1MTc2NDEuLmE2ZTVmOTggMTAwNjQ0Ci0tLSBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9zY3JlZW5waW5uaW5nL1NjcmVlblBpbm5pbmdUZXN0QWN0aXZpdHkuamF2YQorKysgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvc2NyZWVucGlubmluZy9TY3JlZW5QaW5uaW5nVGVzdEFjdGl2aXR5LmphdmEKQEAgLTI0LDEyICsyNCw5IEBACiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DZGRUZXN0OwotCiBpbXBvcnQgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLlBhc3NGYWlsQnV0dG9uczsKIGltcG9ydCBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIuUjsKIAotQENkZFRlc3QocmVxdWlyZW1lbnQ9IjMuOC44L0MtMS0yIikKIHB1YmxpYyBjbGFzcyBTY3JlZW5QaW5uaW5nVGVzdEFjdGl2aXR5IGV4dGVuZHMgUGFzc0ZhaWxCdXR0b25zLkFjdGl2aXR5IHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU2NyZWVuUGlubmluZ1Rlc3RBY3Rpdml0eSI7CmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvc2VjdXJpdHkvQmlvbWV0cmljUHJvbXB0Qm91bmRLZXlzVGVzdC5qYXZhIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL3NlY3VyaXR5L0Jpb21ldHJpY1Byb21wdEJvdW5kS2V5c1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTFlYjgyCi0tLSAvZGV2L251bGwKKysrIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL3NlY3VyaXR5L0Jpb21ldHJpY1Byb21wdEJvdW5kS2V5c1Rlc3QuamF2YQpAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5zZWN1cml0eTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2U7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5iaW9tZXRyaWNzLkJpb21ldHJpY1Byb21wdDsKK2ltcG9ydCBhbmRyb2lkLm9zLkNhbmNlbGxhdGlvblNpZ25hbDsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjsKKworcHVibGljIGNsYXNzIEJpb21ldHJpY1Byb21wdEJvdW5kS2V5c1Rlc3QgZXh0ZW5kcyBGaW5nZXJwcmludEJvdW5kS2V5c1Rlc3QgeworCisgICAgcHJpdmF0ZSBEaWFsb2dDYWxsYmFjayBtRGlhbG9nQ2FsbGJhY2s7CisgICAgcHJpdmF0ZSBCaW9tZXRyaWNQcm9tcHQgbUJpb21ldHJpY1Byb21wdDsKKyAgICBwcml2YXRlIENhbmNlbGxhdGlvblNpZ25hbCBtQ2FuY2VsbGF0aW9uU2lnbmFsOworCisgICAgcHJpdmF0ZSBmaW5hbCBIYW5kbGVyIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoTG9vcGVyLmdldE1haW5Mb29wZXIoKSk7CisKKyAgICBwcml2YXRlIGZpbmFsIEV4ZWN1dG9yIG1FeGVjdXRvciA9IChydW5uYWJsZSkgLT4geworICAgICAgICBtSGFuZGxlci5wb3N0KHJ1bm5hYmxlKTsKKyAgICB9OworCisgICAgcHJpdmF0ZSBmaW5hbCBSdW5uYWJsZSBtTmVnYXRpdmVCdXR0b25SdW5uYWJsZSA9ICgpIC0+IHsKKyAgICAgICAgc2hvd1RvYXN0KCJBdXRoZW50aWNhdGlvbiBjYW5jZWxlZCBieSB1c2VyIik7CisgICAgfTsKKworICAgIHByaXZhdGUgY2xhc3MgRGlhbG9nQ2FsbGJhY2sgZXh0ZW5kcworICAgICAgICAgICAgQmlvbWV0cmljUHJvbXB0LkF1dGhlbnRpY2F0aW9uQ2FsbGJhY2sgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25BdXRoZW50aWNhdGlvbkVycm9yKGludCBlcnJNc2dJZCwgQ2hhclNlcXVlbmNlIGVyclN0cmluZykgeworICAgICAgICAgICAgc2hvd1RvYXN0KGVyclN0cmluZy50b1N0cmluZygpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkF1dGhlbnRpY2F0aW9uU3VjY2VlZGVkKEJpb21ldHJpY1Byb21wdC5BdXRoZW50aWNhdGlvblJlc3VsdCByZXN1bHQpIHsKKyAgICAgICAgICAgIGlmICh0cnlFbmNyeXB0KCkpIHsKKyAgICAgICAgICAgICAgICBzaG93VG9hc3QoIlRlc3QgcGFzc2VkLiIpOworICAgICAgICAgICAgICAgIGdldFBhc3NCdXR0b24oKS5zZXRFbmFibGVkKHRydWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzaG93VG9hc3QoIlRlc3QgZmFpbGVkLiBLZXkgbm90IGFjY2Vzc2libGUgYWZ0ZXIgYXV0aCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2hvd0F1dGhlbnRpY2F0aW9uU2NyZWVuKCkgeworICAgICAgICBtQ2FuY2VsbGF0aW9uU2lnbmFsID0gbmV3IENhbmNlbGxhdGlvblNpZ25hbCgpOworICAgICAgICBtRGlhbG9nQ2FsbGJhY2sgPSBuZXcgRGlhbG9nQ2FsbGJhY2soKTsKKyAgICAgICAgbUJpb21ldHJpY1Byb21wdCA9IG5ldyBCaW9tZXRyaWNQcm9tcHQuQnVpbGRlcihnZXRBcHBsaWNhdGlvbkNvbnRleHQoKSkKKyAgICAgICAgICAgICAgICAuc2V0VGl0bGUoIkF1dGhlbnRpY2F0ZSB3aXRoIGZpbmdlcnByaW50IikKKyAgICAgICAgICAgICAgICAuc2V0TmVnYXRpdmVCdXR0b24oIkNhbmNlbCIsIG1FeGVjdXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIChEaWFsb2dJbnRlcmZhY2UgZGlhbG9nSW50ZXJmYWNlLCBpbnQgd2hpY2gpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2hpY2ggPT0gRGlhbG9nSW50ZXJmYWNlLkJVVFRPTl9ORUdBVElWRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGFuZGxlci5wb3N0KG1OZWdhdGl2ZUJ1dHRvblJ1bm5hYmxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICBtQmlvbWV0cmljUHJvbXB0LmF1dGhlbnRpY2F0ZSgKKyAgICAgICAgICAgICAgICBuZXcgQmlvbWV0cmljUHJvbXB0CisgICAgICAgICAgICAgICAgLkNyeXB0b09iamVjdChnZXRDaXBoZXIoKSksCisgICAgICAgICAgICAgICAgbUNhbmNlbGxhdGlvblNpZ25hbCwgbUV4ZWN1dG9yLCBtRGlhbG9nQ2FsbGJhY2spOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9zZWN1cml0eS9DQU5vdGlmeU9uQm9vdEFjdGl2aXR5LmphdmEgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvc2VjdXJpdHkvQ0FOb3RpZnlPbkJvb3RBY3Rpdml0eS5qYXZhCmluZGV4IGEzYjQ0NDEuLmE0ZjYzYWQgMTAwNjQ0Ci0tLSBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9zZWN1cml0eS9DQU5vdGlmeU9uQm9vdEFjdGl2aXR5LmphdmEKKysrIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL3NlY3VyaXR5L0NBTm90aWZ5T25Cb290QWN0aXZpdHkuamF2YQpAQCAtMTMsMTQgKzEzLDExIEBACiBpbXBvcnQgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLlBhc3NGYWlsQnV0dG9uczsKIGltcG9ydCBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIuUjsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ2RkVGVzdDsKLQogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogCi1AQ2RkVGVzdChyZXF1aXJlbWVudD0iOS44LjQvQy0wLTMiKQogcHVibGljIGNsYXNzIENBTm90aWZ5T25Cb290QWN0aXZpdHkgZXh0ZW5kcyBQYXNzRmFpbEJ1dHRvbnMuQWN0aXZpdHkgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IENBTm90aWZ5T25Cb290QWN0aXZpdHkuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOwpkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL3NlY3VyaXR5L0ZpbmdlcnByaW50Qm91bmRLZXlzVGVzdC5qYXZhIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL3NlY3VyaXR5L0ZpbmdlcnByaW50Qm91bmRLZXlzVGVzdC5qYXZhCmluZGV4IDNmNjM0ODkuLjY1MWI2YmYgMTAwNjQ0Ci0tLSBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9zZWN1cml0eS9GaW5nZXJwcmludEJvdW5kS2V5c1Rlc3QuamF2YQorKysgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvc2VjdXJpdHkvRmluZ2VycHJpbnRCb3VuZEtleXNUZXN0LmphdmEKQEAgLTQxLDggKzQxLDYgQEAKIGltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVG9hc3Q7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNkZFRlc3Q7Ci0KIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRLZXlFeGNlcHRpb247CkBAIC02MCw3ICs1OCw2IEBACiBpbXBvcnQgamF2YXguY3J5cHRvLk5vU3VjaFBhZGRpbmdFeGNlcHRpb247CiBpbXBvcnQgamF2YXguY3J5cHRvLlNlY3JldEtleTsKIAotQENkZFRlc3QocmVxdWlyZW1lbnQ9IjkuMTEuMS9DLTItMSxDLTItMiIpCiBwdWJsaWMgY2xhc3MgRmluZ2VycHJpbnRCb3VuZEtleXNUZXN0IGV4dGVuZHMgUGFzc0ZhaWxCdXR0b25zLkFjdGl2aXR5IHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJGaW5nZXJwcmludEJvdW5kS2V5c1Rlc3QiOwpAQCAtMTcwLDEwICsxNjcsMTQgQEAKICAgICAgKiBvbmx5IHdvcmtzIGlmIHRoZSB1c2VyIGhhcyBqdXN0IGF1dGhlbnRpY2F0ZWQgdmlhIGRldmljZSBjcmVkZW50aWFscy4KICAgICAgKiBoYXMgdG8gYmUgcnVuIGFmdGVyIHN1Y2Nlc3NmdWwgYXV0aCwgaW4gb3JkZXIgdG8gc3VjY2VlZAogICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiB0cnlFbmNyeXB0KCkgeworICAgIHByb3RlY3RlZCBib29sZWFuIHRyeUVuY3J5cHQoKSB7CiAgICAgICAgIHJldHVybiBlbmNyeXB0SW50ZXJuYWwodHJ1ZSk7CiAgICAgfQogCisgICAgcHJvdGVjdGVkIENpcGhlciBnZXRDaXBoZXIoKSB7CisgICAgICAgIHJldHVybiBtQ2lwaGVyOworICAgIH0KKwogICAgIHByaXZhdGUgYm9vbGVhbiBlbmNyeXB0SW50ZXJuYWwoYm9vbGVhbiBkb0VuY3J5cHQpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIEtleVN0b3JlIGtleVN0b3JlID0gS2V5U3RvcmUuZ2V0SW5zdGFuY2UoIkFuZHJvaWRLZXlTdG9yZSIpOwpAQCAtMjIwLDE1ICsyMjEsMTQgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBzaG93QXV0aGVudGljYXRpb25TY3JlZW4oKSB7CisgICAgcHJvdGVjdGVkIHZvaWQgc2hvd0F1dGhlbnRpY2F0aW9uU2NyZWVuKCkgewogICAgICAgICBtRmluZ2VycHJpbnREaWFsb2cgPSBuZXcgRmluZ2VycHJpbnRBdXRoRGlhbG9nRnJhZ21lbnQoKTsKICAgICAgICAgbUZpbmdlcnByaW50RGlhbG9nLnNldEFjdGl2aXR5KHRoaXMpOwogICAgICAgICBtRmluZ2VycHJpbnREaWFsb2cuc2hvdyhnZXRGcmFnbWVudE1hbmFnZXIoKSwgImZpbmdlcnByaW50X2RpYWxvZyIpOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBzaG93VG9hc3QoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgVG9hc3QubWFrZVRleHQodGhpcywgbWVzc2FnZSwgVG9hc3QuTEVOR1RIX0xPTkcpCi0gICAgICAgICAgICAuc2hvdygpOworICAgIHByb3RlY3RlZCB2b2lkIHNob3dUb2FzdChTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICBUb2FzdC5tYWtlVGV4dCh0aGlzLCBtZXNzYWdlLCBUb2FzdC5MRU5HVEhfTE9ORykuc2hvdygpOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmluZ2VycHJpbnRBdXRoRGlhbG9nRnJhZ21lbnQgZXh0ZW5kcyBEaWFsb2dGcmFnbWVudCB7CmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvc2VjdXJpdHkvU2NyZWVuTG9ja0JvdW5kS2V5c1Rlc3QuamF2YSBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9zZWN1cml0eS9TY3JlZW5Mb2NrQm91bmRLZXlzVGVzdC5qYXZhCmluZGV4IDQ1MDMyMGIuLjg2MzQ4OGIgMTAwNjQ0Ci0tLSBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9zZWN1cml0eS9TY3JlZW5Mb2NrQm91bmRLZXlzVGVzdC5qYXZhCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9zZWN1cml0eS9TY3JlZW5Mb2NrQm91bmRLZXlzVGVzdC5qYXZhCkBAIC0zMyw4ICszMyw2IEBACiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRvYXN0OwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DZGRUZXN0OwotCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkS2V5RXhjZXB0aW9uOwpAQCAtNTIsNyArNTAsNiBAQAogaW1wb3J0IGphdmF4LmNyeXB0by5Ob1N1Y2hQYWRkaW5nRXhjZXB0aW9uOwogaW1wb3J0IGphdmF4LmNyeXB0by5TZWNyZXRLZXk7CiAKLUBDZGRUZXN0KHJlcXVpcmVtZW50PSI5LjExLjEvQy0yLTEsQy0yLTIiKQogcHVibGljIGNsYXNzIFNjcmVlbkxvY2tCb3VuZEtleXNUZXN0IGV4dGVuZHMgUGFzc0ZhaWxCdXR0b25zLkFjdGl2aXR5IHsKIAogICAgIC8qKiBBbGlhcyBmb3Igb3VyIGtleSBpbiB0aGUgQW5kcm9pZCBLZXkgU3RvcmUuICovCmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvc2Vuc29ycy9BY2NlbGVyb21ldGVyTWVhc3VyZW1lbnRUZXN0QWN0aXZpdHkuamF2YSBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9zZW5zb3JzL0FjY2VsZXJvbWV0ZXJNZWFzdXJlbWVudFRlc3RBY3Rpdml0eS5qYXZhCmluZGV4IDRjODIwNGYuLjM0YzE4ZGUgMTAwNjQ0Ci0tLSBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9zZW5zb3JzL0FjY2VsZXJvbWV0ZXJNZWFzdXJlbWVudFRlc3RBY3Rpdml0eS5qYXZhCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9zZW5zb3JzL0FjY2VsZXJvbWV0ZXJNZWFzdXJlbWVudFRlc3RBY3Rpdml0eS5qYXZhCkBAIC0zMyw2ICszMyw3IEBACiBwdWJsaWMgY2xhc3MgQWNjZWxlcm9tZXRlck1lYXN1cmVtZW50VGVzdEFjdGl2aXR5IGV4dGVuZHMgU2Vuc29yQ3RzVmVyaWZpZXJUZXN0QWN0aXZpdHkgewogICAgIHB1YmxpYyBBY2NlbGVyb21ldGVyTWVhc3VyZW1lbnRUZXN0QWN0aXZpdHkoKSB7CiAgICAgICAgIHN1cGVyKEFjY2VsZXJvbWV0ZXJNZWFzdXJlbWVudFRlc3RBY3Rpdml0eS5jbGFzcyk7CisgICAgICAgIG1FbmFibGVSZXRyeSA9IHRydWU7CiAgICAgfQogCiAgICAgcHVibGljIFN0cmluZyB0ZXN0RmFjZVVwKCkgdGhyb3dzIFRocm93YWJsZSB7CkBAIC0xMDksOSArMTEwLDExIEBACiAgICAgcHJpdmF0ZSBTdHJpbmcgZGVsYXllZFZlcmlmeU1lYXN1cmVtZW50cyhpbnQgZGVzY3JpcHRpb25SZXNJZCwgZmxvYXQgLi4uIGV4cGVjdGF0aW9ucykKICAgICAgICAgICAgIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBTZW5zb3JUZXN0TG9nZ2VyIGxvZ2dlciA9IGdldFRlc3RMb2dnZXIoKTsKLSAgICAgICAgbG9nZ2VyLmxvZ0luc3RydWN0aW9ucyhkZXNjcmlwdGlvblJlc0lkKTsKLSAgICAgICAgbG9nZ2VyLmxvZ1dhaXRGb3JTb3VuZCgpOwotICAgICAgICB3YWl0Rm9yVXNlclRvQmVnaW4oKTsKKyAgICAgICAgaWYgKCFtU2hvdWxkUmV0cnkpIHsKKyAgICAgICAgICAgIGxvZ2dlci5sb2dJbnN0cnVjdGlvbnMoZGVzY3JpcHRpb25SZXNJZCk7CisgICAgICAgICAgICBsb2dnZXIubG9nV2FpdEZvclNvdW5kKCk7CisgICAgICAgICAgICB3YWl0Rm9yVXNlclRvQmVnaW4oKTsKKyAgICAgICAgfQogICAgICAgICBUaHJlYWQuc2xlZXAoVGltZVVuaXQuTUlMTElTRUNPTkRTLmNvbnZlcnQoNywgVGltZVVuaXQuU0VDT05EUykpOwogCiAgICAgICAgIHRyeSB7CkBAIC0xMjQsOSArMTI3LDExIEBACiAgICAgcHJpdmF0ZSBTdHJpbmcgdmVyaWZ5TWVhc3VyZW1lbnRzKGludCBkZXNjcmlwdGlvblJlc0lkLCBmbG9hdCAuLi4gZXhwZWN0YXRpb25zKQogICAgICAgICAgICAgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIFNlbnNvclRlc3RMb2dnZXIgbG9nZ2VyID0gZ2V0VGVzdExvZ2dlcigpOwotICAgICAgICBsb2dnZXIubG9nSW5zdHJ1Y3Rpb25zKGRlc2NyaXB0aW9uUmVzSWQpOwotICAgICAgICBsb2dnZXIubG9nSW5zdHJ1Y3Rpb25zKFIuc3RyaW5nLnNuc3JfZGV2aWNlX3N0ZWFkeSk7Ci0gICAgICAgIHdhaXRGb3JVc2VyVG9CZWdpbigpOworICAgICAgICBpZiAoIW1TaG91bGRSZXRyeSkgeworICAgICAgICAgICAgbG9nZ2VyLmxvZ0luc3RydWN0aW9ucyhkZXNjcmlwdGlvblJlc0lkKTsKKyAgICAgICAgICAgIGxvZ2dlci5sb2dJbnN0cnVjdGlvbnMoUi5zdHJpbmcuc25zcl9kZXZpY2Vfc3RlYWR5KTsKKyAgICAgICAgICAgIHdhaXRGb3JVc2VyVG9CZWdpbigpOworICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIHZlcmlmeU1lYXN1cmVtZW50cyhleHBlY3RhdGlvbnMpOwogICAgIH0KZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9zZW5zb3JzL0JhdGNoaW5nVGVzdEFjdGl2aXR5LmphdmEgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvc2Vuc29ycy9CYXRjaGluZ1Rlc3RBY3Rpdml0eS5qYXZhCmluZGV4IGI3ZDk2MTcuLmVhYTQ5MjQgMTAwNjQ0Ci0tLSBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9zZW5zb3JzL0JhdGNoaW5nVGVzdEFjdGl2aXR5LmphdmEKKysrIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL3NlbnNvcnMvQmF0Y2hpbmdUZXN0QWN0aXZpdHkuamF2YQpAQCAtMzcsNiArMzcsNyBAQAogcHVibGljIGNsYXNzIEJhdGNoaW5nVGVzdEFjdGl2aXR5IGV4dGVuZHMgU2Vuc29yQ3RzVmVyaWZpZXJUZXN0QWN0aXZpdHkgewogICAgIHB1YmxpYyBCYXRjaGluZ1Rlc3RBY3Rpdml0eSgpIHsKICAgICAgICAgc3VwZXIoQmF0Y2hpbmdUZXN0QWN0aXZpdHkuY2xhc3MpOworICAgICAgICBtRW5hYmxlUmV0cnkgPSB0cnVlOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRU5TT1JfQkFUQ0hJTkdfUkFURV9VUyA9IFNlbnNvck1hbmFnZXIuU0VOU09SX0RFTEFZX0ZBU1RFU1Q7CkBAIC0xMjEsOCArMTIyLDEwIEBACiAKICAgICBwcml2YXRlIFN0cmluZyBydW5CYXRjaFRlc3QoaW50IHNlbnNvclR5cGUsIGludCBtYXhCYXRjaFJlcG9ydExhdGVuY3lTZWMsIGludCBpbnN0cnVjdGlvbnNSZXNJZCkKICAgICAgICAgICAgIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBnZXRUZXN0TG9nZ2VyKCkubG9nSW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9uc1Jlc0lkKTsKLSAgICAgICAgd2FpdEZvclVzZXJUb0JlZ2luKCk7CisgICAgICAgIGlmICghbVNob3VsZFJldHJ5KSB7CisgICAgICAgICAgICBnZXRUZXN0TG9nZ2VyKCkubG9nSW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9uc1Jlc0lkKTsKKyAgICAgICAgICAgIHdhaXRGb3JVc2VyVG9CZWdpbigpOworICAgICAgICB9CiAKICAgICAgICAgaW50IG1heEJhdGNoUmVwb3J0TGF0ZW5jeVVzID0gKGludCkgVGltZVVuaXQuU0VDT05EUy50b01pY3JvcyhtYXhCYXRjaFJlcG9ydExhdGVuY3lTZWMpOwogICAgICAgICBUZXN0U2Vuc29yRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBuZXcgVGVzdFNlbnNvckVudmlyb25tZW50KApAQCAtMTM5LDggKzE0MiwxMCBAQAogCiAgICAgcHJpdmF0ZSBTdHJpbmcgcnVuRmx1c2hUZXN0KGludCBzZW5zb3JUeXBlLCBpbnQgbWF4QmF0Y2hSZXBvcnRMYXRlbmN5U2VjLCBpbnQgaW5zdHJ1Y3Rpb25zUmVzSWQpCiAgICAgICAgICAgICB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgZ2V0VGVzdExvZ2dlcigpLmxvZ0luc3RydWN0aW9ucyhpbnN0cnVjdGlvbnNSZXNJZCk7Ci0gICAgICAgIHdhaXRGb3JVc2VyVG9CZWdpbigpOworICAgICAgICBpZiAoIW1TaG91bGRSZXRyeSkgeworICAgICAgICAgICAgZ2V0VGVzdExvZ2dlcigpLmxvZ0luc3RydWN0aW9ucyhpbnN0cnVjdGlvbnNSZXNJZCk7CisgICAgICAgICAgICB3YWl0Rm9yVXNlclRvQmVnaW4oKTsKKyAgICAgICAgfQogCiAgICAgICAgIGludCBtYXhCYXRjaFJlcG9ydExhdGVuY3lVcyA9IChpbnQpIFRpbWVVbml0LlNFQ09ORFMudG9NaWNyb3MobWF4QmF0Y2hSZXBvcnRMYXRlbmN5U2VjKTsKICAgICAgICAgVGVzdFNlbnNvckVudmlyb25tZW50IGVudmlyb25tZW50ID0gbmV3IFRlc3RTZW5zb3JFbnZpcm9ubWVudCgKQEAgLTE1NSw3ICsxNjAsNyBAQAogICAgICAgICByZXR1cm4gZXhlY3V0ZVRlc3Qob3BlcmF0aW9uKTsKICAgICB9CiAKLSAgICBwcml2YXRlIFN0cmluZyBleGVjdXRlVGVzdChUZXN0U2Vuc29yT3BlcmF0aW9uIG9wZXJhdGlvbikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICBwcml2YXRlIFN0cmluZyBleGVjdXRlVGVzdChUZXN0U2Vuc29yT3BlcmF0aW9uIG9wZXJhdGlvbikgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIG9wZXJhdGlvbi5hZGREZWZhdWx0VmVyaWZpY2F0aW9ucygpOwogICAgICAgICBvcGVyYXRpb24uZXhlY3V0ZShnZXRDdXJyZW50VGVzdE5vZGUoKSk7CiAgICAgICAgIHJldHVybiBudWxsOwpkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL3NlbnNvcnMvRGV2aWNlU3VzcGVuZFRlc3RBY3Rpdml0eS5qYXZhIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL3NlbnNvcnMvRGV2aWNlU3VzcGVuZFRlc3RBY3Rpdml0eS5qYXZhCmluZGV4IDJkMmFhOTQuLmEyMzMyNTAgMTAwNjQ0Ci0tLSBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9zZW5zb3JzL0RldmljZVN1c3BlbmRUZXN0QWN0aXZpdHkuamF2YQorKysgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvc2Vuc29ycy9EZXZpY2VTdXNwZW5kVGVzdEFjdGl2aXR5LmphdmEKQEAgLTExLDEwICsxMSwxMyBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5zZW5zb3JzLmJhc2UuU2Vuc29yQ3RzVmVyaWZpZXJUZXN0QWN0aXZpdHk7CiBpbXBvcnQgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLnNlbnNvcnMuaGVscGVycy5TZW5zb3JUZXN0U2NyZWVuTWFuaXB1bGF0b3I7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNkZFRlc3Q7Ci0KIGltcG9ydCBhbmRyb2lkLmFwcC5BbGFybU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5hcHAuSW50ZW50U2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb247CitpbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uQ2hhbm5lbDsKK2ltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb25NYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5hcHAuU2VydmljZTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKQEAgLTM3LDEwICs0MCwxMSBAQAogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY3RzLmhlbHBlcnMuU2Vuc29yTm90U3VwcG9ydGVkRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY3RzLmhlbHBlcnMuc2Vuc29ydmVyaWZpY2F0aW9uLkJhdGNoQXJyaXZhbFZlcmlmaWNhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmN0cy5oZWxwZXJzLnNlbnNvcnZlcmlmaWNhdGlvbi5UaW1lc3RhbXBDbG9ja1NvdXJjZVZlcmlmaWNhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5Qb3dlck1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5Qb3dlck1hbmFnZXIuV2FrZUxvY2s7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQuY29udGVudC5Mb2NhbEJyb2FkY2FzdE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZHgubG9jYWxicm9hZGNhc3RtYW5hZ2VyLmNvbnRlbnQuTG9jYWxCcm9hZGNhc3RNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwpAQCAtNzcsNiArODEsMTEgQEAKICAgICAgICAgICAgIFBvd2VyTWFuYWdlciBwbSA9IChQb3dlck1hbmFnZXIpZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlBPV0VSX1NFUlZJQ0UpOwogICAgICAgICAgICAgbURldmljZVN1c3BlbmRMb2NrID0gcG0ubmV3V2FrZUxvY2soUG93ZXJNYW5hZ2VyLlBBUlRJQUxfV0FLRV9MT0NLLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRldmljZVN1c3BlbmRUZXN0QWN0aXZpdHkiKTsKKworICAgICAgICAgICAgLy8gTGF1bmNoIGEgZm9yZWdyb3VuZCBzZXJ2aWNlIHRvIGVuc3VyZSB0aGF0IHRoZSB0ZXN0IHJlbWFpbnMgaW4gdGhlIGZvcmVncm91bmQgYW5kIGlzCisgICAgICAgICAgICAvLyBhYmxlIHRvIGJlIHdva2VuLXVwIHdoZW4gc2Vuc29yIGRhdGEgaXMgZGVsaXZlcmVkLgorICAgICAgICAgICAgc3RhcnRGb3JlZ3JvdW5kU2VydmljZShuZXcgSW50ZW50KHRoaXMsIERldmljZVN1c3BlbmRUZXN0U2VydmljZS5jbGFzcykpOworCiAgICAgICAgICAgICBtRGV2aWNlU3VzcGVuZExvY2suYWNxdWlyZSgpOwogICAgICAgICAgICAgU2Vuc29yVGVzdExvZ2dlciBsb2dnZXIgPSBnZXRUZXN0TG9nZ2VyKCk7CiAgICAgICAgICAgICBsb2dnZXIubG9nSW5zdHJ1Y3Rpb25zKFIuc3RyaW5nLnNuc3JfZGV2aWNlX3N1c3BlbmRfdGVzdF9pbnN0cik7CkBAIC05NSw2ICsxMDQsOCBAQAogICAgICAgICAgICAgaWYgKG1EZXZpY2VTdXNwZW5kTG9jayAhPSBudWxsICYmIG1EZXZpY2VTdXNwZW5kTG9jay5pc0hlbGQoKSkgewogICAgICAgICAgICAgICAgIG1EZXZpY2VTdXNwZW5kTG9jay5yZWxlYXNlKCk7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0b3BTZXJ2aWNlKG5ldyBJbnRlbnQodGhpcywgRGV2aWNlU3VzcGVuZFRlc3RTZXJ2aWNlLmNsYXNzKSk7CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKQEAgLTEyNCw3ICsxMzUsMzkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfTsKIAotICAgICAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iNy4zL0MtMS04IikKKyAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEZXZpY2VTdXNwZW5kVGVzdFNlcnZpY2UgZXh0ZW5kcyBTZXJ2aWNlIHsKKyAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RJRklDQVRJT05fQ0hBTk5FTF9JRCA9CisgICAgICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIuc2Vuc29ycy5EZXZpY2VTdXNwZW5kVGVzdEFjdGl2aXR5Lk5vdGlmaWNhdGlvbiI7CisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9USUZJQ0FUSU9OX0NIQU5ORUxfTkFNRSA9ICJEZXZpY2UgU3VzcGVuZCBUZXN0IjsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgSUJpbmRlciBvbkJpbmQoSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgb25TdGFydENvbW1hbmQoSW50ZW50IGludGVudCwgaW50IGZsYWdzLCBpbnQgc3RhcnRJZCkgeworICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkNoYW5uZWwgY2hhbm5lbCA9IG5ldyBOb3RpZmljYXRpb25DaGFubmVsKAorICAgICAgICAgICAgICAgICAgICAgICAgTk9USUZJQ0FUSU9OX0NIQU5ORUxfSUQsCisgICAgICAgICAgICAgICAgICAgICAgICBOT1RJRklDQVRJT05fQ0hBTk5FTF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uTWFuYWdlci5JTVBPUlRBTkNFX0RFRkFVTFQpOworICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbk1hbmFnZXIgbm90aWZpY2F0aW9uTWFuYWdlciA9CisgICAgICAgICAgICAgICAgICAgICAgICBnZXRTeXN0ZW1TZXJ2aWNlKE5vdGlmaWNhdGlvbk1hbmFnZXIuY2xhc3MpOworICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbk1hbmFnZXIuY3JlYXRlTm90aWZpY2F0aW9uQ2hhbm5lbChjaGFubmVsKTsKKyAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb3RpZmljYXRpb24uQnVpbGRlcihnZXRBcHBsaWNhdGlvbkNvbnRleHQoKSwgTk9USUZJQ0FUSU9OX0NIQU5ORUxfSUQpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudFRpdGxlKGdldFN0cmluZyhSLnN0cmluZy5zbnNyX2RldmljZV9zdXNwZW5kX3NlcnZpY2VfYWN0aXZlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50VGV4dChnZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLnNuc3JfZGV2aWNlX3N1c3BlbmRfc2VydmljZV9ub3RpZmljYXRpb24pKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFNtYWxsSWNvbihSLmRyYXdhYmxlLmljb24pCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0QXV0b0NhbmNlbCh0cnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgICAgICAgICAgc3RhcnRGb3JlZ3JvdW5kKDEsIG5vdGlmaWNhdGlvbik7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gU1RBUlRfTk9UX1NUSUNLWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyBTdHJpbmcgdGVzdEFQV2FrZVVwV2hlblJlcG9ydExhdGVuY3lFeHBpcmVzQWNjZWwoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgICAgIFNlbnNvciB3YWtlVXBTZW5zb3IgPSBtU2Vuc29yTWFuYWdlci5nZXREZWZhdWx0U2Vuc29yKFNlbnNvci5UWVBFX0FDQ0VMRVJPTUVURVIsIHRydWUpOwogICAgICAgICAgICAgaWYgKHdha2VVcFNlbnNvciA9PSBudWxsKSB7CkBAIC0xMzMsNyArMTc2LDYgQEAKICAgICAgICAgICAgIHJldHVybiBydW5BUFdha2VVcFdoZW5SZXBvcnRMYXRlbmN5RXhwaXJlcyh3YWtlVXBTZW5zb3IpOwogICAgICAgICB9CiAKLSAgICAgICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuMy9DLTEtOCIpCiAgICAgICAgIHB1YmxpYyBTdHJpbmcgdGVzdEFQV2FrZVVwV2hlblJlcG9ydExhdGVuY3lFeHBpcmVzR3lybygpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICAgICAgU2Vuc29yIHdha2VVcFNlbnNvciA9IG1TZW5zb3JNYW5hZ2VyLmdldERlZmF1bHRTZW5zb3IoU2Vuc29yLlRZUEVfR1lST1NDT1BFLCB0cnVlKTsKICAgICAgICAgICAgIGlmICh3YWtlVXBTZW5zb3IgPT0gbnVsbCkgewpAQCAtMTQyLDcgKzE4NCw2IEBACiAgICAgICAgICAgICByZXR1cm4gcnVuQVBXYWtlVXBXaGVuUmVwb3J0TGF0ZW5jeUV4cGlyZXMod2FrZVVwU2Vuc29yKTsKICAgICAgICAgfQogCi0gICAgICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjMvQy0xLTgiKQogICAgICAgICBwdWJsaWMgU3RyaW5nIHRlc3RBUFdha2VVcFdoZW5SZXBvcnRMYXRlbmN5RXhwaXJlc01hZygpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICAgICAgU2Vuc29yIHdha2VVcFNlbnNvciA9IG1TZW5zb3JNYW5hZ2VyLmdldERlZmF1bHRTZW5zb3IoU2Vuc29yLlRZUEVfTUFHTkVUSUNfRklFTEQsdHJ1ZSk7CiAgICAgICAgICAgICBpZiAod2FrZVVwU2Vuc29yID09IG51bGwpIHsKQEAgLTE1MSw3ICsxOTIsNiBAQAogICAgICAgICAgICAgcmV0dXJuIHJ1bkFQV2FrZVVwV2hlblJlcG9ydExhdGVuY3lFeHBpcmVzKHdha2VVcFNlbnNvcik7CiAgICAgICAgIH0KIAotICAgICAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iNy4zL0MtMS04IikKICAgICAgICAgcHVibGljIFN0cmluZyB0ZXN0QVBXYWtlVXBXaGVuRklGT0Z1bGxBY2NlbCgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICAgICAgU2Vuc29yIHdha2VVcFNlbnNvciA9IG1TZW5zb3JNYW5hZ2VyLmdldERlZmF1bHRTZW5zb3IoU2Vuc29yLlRZUEVfQUNDRUxFUk9NRVRFUiwgdHJ1ZSk7CiAgICAgICAgICAgICBpZiAod2FrZVVwU2Vuc29yID09IG51bGwpIHsKQEAgLTE2MCw3ICsyMDAsNiBAQAogICAgICAgICAgICAgcmV0dXJuIHJ1bkFQV2FrZVVwV2hlbkZJRk9GdWxsKHdha2VVcFNlbnNvcik7CiAgICAgICAgIH0KIAotICAgICAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iNy4zL0MtMS04IikKICAgICAgICAgcHVibGljIFN0cmluZyB0ZXN0QVBXYWtlVXBXaGVuRklGT0Z1bGxHeXJvKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgICAgICBTZW5zb3Igd2FrZVVwU2Vuc29yID0gbVNlbnNvck1hbmFnZXIuZ2V0RGVmYXVsdFNlbnNvcihTZW5zb3IuVFlQRV9HWVJPU0NPUEUsIHRydWUpOwogICAgICAgICAgICAgaWYgKHdha2VVcFNlbnNvciA9PSBudWxsKSB7CkBAIC0xNjksNyArMjA4LDYgQEAKICAgICAgICAgICAgIHJldHVybiBydW5BUFdha2VVcFdoZW5GSUZPRnVsbCh3YWtlVXBTZW5zb3IpOwogICAgICAgICB9CiAKLSAgICAgICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuMy9DLTEtOCIpCiAgICAgICAgIHB1YmxpYyBTdHJpbmcgdGVzdEFQV2FrZVVwV2hlbkZJRk9GdWxsTWFnKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgICAgICBTZW5zb3Igd2FrZVVwU2Vuc29yID0gbVNlbnNvck1hbmFnZXIuZ2V0RGVmYXVsdFNlbnNvcihTZW5zb3IuVFlQRV9NQUdORVRJQ19GSUVMRCx0cnVlKTsKICAgICAgICAgICAgIGlmICh3YWtlVXBTZW5zb3IgPT0gbnVsbCkgewpAQCAtMTc4LDcgKzIxNiw2IEBACiAgICAgICAgICAgICByZXR1cm4gcnVuQVBXYWtlVXBXaGVuRklGT0Z1bGwod2FrZVVwU2Vuc29yKTsKICAgICAgICAgfQogCi0gICAgICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjMvQy0xLTgiKQogICAgICAgICBwdWJsaWMgU3RyaW5nIHRlc3RBY2NlbEJhdGNoaW5nSW5BUFN1c3BlbmRMYXJnZVJlcG9ydExhdGVuY3koKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgICAgIFNlbnNvciBhY2NlbCA9IG1TZW5zb3JNYW5hZ2VyLmdldERlZmF1bHRTZW5zb3IoU2Vuc29yLlRZUEVfQUNDRUxFUk9NRVRFUik7CiAgICAgICAgICAgICBpZiAoYWNjZWwgPT0gbnVsbCkgewpAQCAtMTg3LDcgKzIyNCw2IEBACiAgICAgICAgICAgICByZXR1cm4gcnVuQVBXYWtlVXBCeUFsYXJtTm9uV2FrZVNlbnNvcihhY2NlbCwgKGludClUaW1lVW5pdC5TRUNPTkRTLnRvTWljcm9zKDEwMDApKTsKICAgICAgICAgfQogCi0gICAgICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjMvQy0xLTgiKQogICAgICAgICBwdWJsaWMgU3RyaW5nIHRlc3RBY2NlbEJhdGNoaW5nSW5BUFN1c3BlbmRaZXJvUmVwb3J0TGF0ZW5jeSgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICAgICAgU2Vuc29yIGFjY2VsID0gbVNlbnNvck1hbmFnZXIuZ2V0RGVmYXVsdFNlbnNvcihTZW5zb3IuVFlQRV9BQ0NFTEVST01FVEVSKTsKICAgICAgICAgICAgaWYgKGFjY2VsID09IG51bGwpIHsKZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9zZW5zb3JzL0V2ZW50U2FuaXRpemF0aW9uVGVzdEFjdGl2aXR5LmphdmEgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvc2Vuc29ycy9FdmVudFNhbml0aXphdGlvblRlc3RBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYmI1YzYKLS0tIC9kZXYvbnVsbAorKysgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvc2Vuc29ycy9FdmVudFNhbml0aXphdGlvblRlc3RBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMTQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIuc2Vuc29yczsKKworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuU2Vuc29yOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuU2Vuc29yRXZlbnQ7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3JFdmVudExpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuU2Vuc29yTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLlRyaWdnZXJFdmVudDsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLlRyaWdnZXJFdmVudExpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY3RzLmhlbHBlcnMuU2Vuc29yTm90U3VwcG9ydGVkRXhjZXB0aW9uOworaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5SOworaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5zZW5zb3JzLmJhc2UuU2Vuc29yQ3RzVmVyaWZpZXJUZXN0QWN0aXZpdHk7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCisvKioKKyAqIFRlc3RzIGFib3V0IGV2ZW50IHBvbGljeSB3aGVuIHRoZSBvYnNlcnZlcidzIFVJRCBpcyBpZGxlLgorICovCitwdWJsaWMgY2xhc3MgRXZlbnRTYW5pdGl6YXRpb25UZXN0QWN0aXZpdHkgZXh0ZW5kcyBTZW5zb3JDdHNWZXJpZmllclRlc3RBY3Rpdml0eSB7CisgICAgcHVibGljIEV2ZW50U2FuaXRpemF0aW9uVGVzdEFjdGl2aXR5KCkgeworICAgICAgICBzdXBlcihFdmVudFNhbml0aXphdGlvblRlc3RBY3Rpdml0eS5jbGFzcyk7CisgICAgfQorCisgICAgLy8gdGltZSBmb3IgdGhlIHRlc3QgdG8gd2FpdCBmb3IgYW4gZXZlbnQKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfVElNRU9VVCA9IDMwOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgYWN0aXZpdHlTZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBnZXRUZXN0TG9nZ2VyKCkubG9nSW5zdHJ1Y3Rpb25zKFIuc3RyaW5nLnNuc3JfZXZlbnRfc2FuaXRpemF0aW9uX3Rlc3Rfc2V0dXApOworICAgICAgICB3YWl0Rm9yVXNlclRvQmVnaW4oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBhY3Rpdml0eUNsZWFuVXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZ2V0VGVzdExvZ2dlcigpLmxvZ0luc3RydWN0aW9ucyhSLnN0cmluZy5zbnNyX2V2ZW50X3Nhbml0aXphdGlvbl90ZXN0X2NsZWFudXApOworICAgICAgICB3YWl0Rm9yVXNlclRvQ29udGludWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoYXQgbm8gdHJpZ2dlciBldmVudHMgYXJlIHRyaWdnZXJlZCB3aGlsZSB0aGUgVUlEIGlzIGlkbGUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0ZXN0Tm9UcmlnZ2VyRXZlbnRzV2hpbGVVaWRJZGxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIE5vdCBzaWduaWZpY2FudCBtb3Rpb24gc2Vuc29yLCBub3RoaW5nIHRvIGRvLgorICAgICAgICBmaW5hbCBTZW5zb3JNYW5hZ2VyIHNlbnNvck1hbmFnZXIgPSBnZXRBcHBsaWNhdGlvbkNvbnRleHQoKQorICAgICAgICAgICAgICAgIC5nZXRTeXN0ZW1TZXJ2aWNlKFNlbnNvck1hbmFnZXIuY2xhc3MpOworICAgICAgICBmaW5hbCBTZW5zb3Igc2Vuc29yID0gc2Vuc29yTWFuYWdlci5nZXREZWZhdWx0U2Vuc29yKAorICAgICAgICAgICAgICAgIFNlbnNvci5UWVBFX1NJR05JRklDQU5UX01PVElPTik7CisgICAgICAgIGlmIChzZW5zb3IgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlbnNvck5vdFN1cHBvcnRlZEV4Y2VwdGlvbihTZW5zb3IuVFlQRV9TSUdOSUZJQ0FOVF9NT1RJT04pOworICAgICAgICB9CisKKyAgICAgICAgLy8gTGV0IHVzIGJlZ2luLgorICAgICAgICBmaW5hbCBTZW5zb3JUZXN0TG9nZ2VyIGxvZ2dlciA9IGdldFRlc3RMb2dnZXIoKTsKKyAgICAgICAgbG9nZ2VyLmxvZ0luc3RydWN0aW9ucyhSLnN0cmluZy5zbnNyX3NpZ25pZmljYW50X21vdGlvbl90ZXN0X3VpZF9pZGxlKTsKKyAgICAgICAgd2FpdEZvclVzZXJUb0JlZ2luKCk7CisKKyAgICAgICAgLy8gV2F0Y2ggZm9yIHRoZSB0cmlnZ2VyIGV2ZW50LgorICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICAgICAgZmluYWwgVHJpZ2dlckV2ZW50TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVHJpZ2dlckV2ZW50TGlzdGVuZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVHJpZ2dlcihUcmlnZ2VyRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgc2Vuc29yTWFuYWdlci5yZXF1ZXN0VHJpZ2dlclNlbnNvcihsaXN0ZW5lciwgc2Vuc29yKTsKKworICAgICAgICAvLyBUZWxsIHRoZSB1c2VyIG5vdyB3aGVuIHRoZSB0ZXN0IGNvbXBsZXRlcy4KKyAgICAgICAgbG9nZ2VyLmxvZ1dhaXRGb3JTb3VuZCgpOworCisgICAgICAgIC8vIFdlIHNob3VsZG4ndCBiZSBnZXR0aW5nIGFuIGV2ZW50LgorICAgICAgICB0cnkgeworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKGdldFN0cmluZyhSLnN0cmluZworICAgICAgICAgICAgICAgICAgICAuc25zcl9zaWduaWZpY2FudF9tb3Rpb25fdGVzdF91aWRfaWRsZV9leHBlY3RhdGlvbiksCisgICAgICAgICAgICAgICAgICAgIGxhdGNoLmF3YWl0KEVWRU5UX1RJTUVPVVQsIFRpbWVVbml0LlNFQ09ORFMpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHNlbnNvck1hbmFnZXIuY2FuY2VsVHJpZ2dlclNlbnNvcihsaXN0ZW5lciwgc2Vuc29yKTsKKyAgICAgICAgICAgIHBsYXlTb3VuZCgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0aGF0IG5vIG9uLWNoYW5nZSBldmVudHMgYXJlIHRyaWdnZXJlZCB3aGlsZSB0aGUgVUlEIGlzIGlkbGUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0ZXN0Tm9PbkNoYW5nZUV2ZW50c1doaWxlVWlkSWRsZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBOb3Qgc2lnbmlmaWNhbnQgbW90aW9uIHNlbnNvciwgbm90aGluZyB0byBkby4KKyAgICAgICAgZmluYWwgU2Vuc29yTWFuYWdlciBzZW5zb3JNYW5hZ2VyID0gZ2V0QXBwbGljYXRpb25Db250ZXh0KCkKKyAgICAgICAgICAgICAgICAuZ2V0U3lzdGVtU2VydmljZShTZW5zb3JNYW5hZ2VyLmNsYXNzKTsKKyAgICAgICAgZmluYWwgU2Vuc29yIHNlbnNvciA9IHNlbnNvck1hbmFnZXIuZ2V0RGVmYXVsdFNlbnNvcigKKyAgICAgICAgICAgICAgICBTZW5zb3IuVFlQRV9QUk9YSU1JVFkpOworICAgICAgICBpZiAoc2Vuc29yID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZW5zb3JOb3RTdXBwb3J0ZWRFeGNlcHRpb24oU2Vuc29yLlRZUEVfUFJPWElNSVRZKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIExldCB1cyBiZWdpbi4KKyAgICAgICAgZmluYWwgU2Vuc29yVGVzdExvZ2dlciBsb2dnZXIgPSBnZXRUZXN0TG9nZ2VyKCk7CisgICAgICAgIGxvZ2dlci5sb2dJbnN0cnVjdGlvbnMoUi5zdHJpbmcuc25zcl9wcm94aW1pdHlfdGVzdF91aWRfaWRsZSk7CisgICAgICAgIHdhaXRGb3JVc2VyVG9CZWdpbigpOworCisgICAgICAgIC8vIFdhdGNoIGZvciB0aGUgY2hhbmdlIGV2ZW50LgorICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICAgICAgZmluYWwgU2Vuc29yRXZlbnRMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBTZW5zb3JFdmVudExpc3RlbmVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblNlbnNvckNoYW5nZWQoU2Vuc29yRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFjY3VyYWN5Q2hhbmdlZChTZW5zb3Igc2Vuc29yLCBpbnQgYWNjdXJhY3kpIHsKKyAgICAgICAgICAgICAgICAvKiBkbyBub3RoaW5nICovCisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHNlbnNvck1hbmFnZXIucmVnaXN0ZXJMaXN0ZW5lcihsaXN0ZW5lciwgc2Vuc29yLAorICAgICAgICAgICAgICAgIHNlbnNvci5nZXRNaW5EZWxheSgpLCBzZW5zb3IuZ2V0TWF4RGVsYXkoKSk7CisKKyAgICAgICAgLy8gVGVsbCB0aGUgdXNlciBub3cgd2hlbiB0aGUgdGVzdCBjb21wbGV0ZXMuCisgICAgICAgIGxvZ2dlci5sb2dXYWl0Rm9yU291bmQoKTsKKworICAgICAgICAvLyBXZSBzaG91bGRuJ3QgYmUgZ2V0dGluZyBhbiBldmVudC4KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShnZXRTdHJpbmcoUi5zdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgLnNuc3JfcHJveGltaXR5X3Rlc3RfdWlkX2lkbGVfZXhwZWN0YXRpb24pLAorICAgICAgICAgICAgICAgICAgICBsYXRjaC5hd2FpdChFVkVOVF9USU1FT1VULCBUaW1lVW5pdC5TRUNPTkRTKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzZW5zb3JNYW5hZ2VyLnVucmVnaXN0ZXJMaXN0ZW5lcihsaXN0ZW5lciwgc2Vuc29yKTsKKyAgICAgICAgICAgIHBsYXlTb3VuZCgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL3NlbnNvcnMvR3lyb3Njb3BlTWVhc3VyZW1lbnRUZXN0QWN0aXZpdHkuamF2YSBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9zZW5zb3JzL0d5cm9zY29wZU1lYXN1cmVtZW50VGVzdEFjdGl2aXR5LmphdmEKaW5kZXggN2JlMGZiMS4uMzY4ZWI2NiAxMDA2NDQKLS0tIGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL3NlbnNvcnMvR3lyb3Njb3BlTWVhc3VyZW1lbnRUZXN0QWN0aXZpdHkuamF2YQorKysgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvc2Vuc29ycy9HeXJvc2NvcGVNZWFzdXJlbWVudFRlc3RBY3Rpdml0eS5qYXZhCkBAIC00OCw2ICs0OCw3IEBACiAKICAgICBwdWJsaWMgR3lyb3Njb3BlTWVhc3VyZW1lbnRUZXN0QWN0aXZpdHkoKSB7CiAgICAgICAgIHN1cGVyKEd5cm9zY29wZU1lYXN1cmVtZW50VGVzdEFjdGl2aXR5LmNsYXNzKTsKKyAgICAgICAgbUVuYWJsZVJldHJ5ID0gdHJ1ZTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTExMCw4ICsxMTEsMTAgQEAKICAgICAgICAgc2V0UmVuZGVyZXJSb3RhdGlvbihaX0FYSVMsIGZhbHNlKTsKIAogICAgICAgICBTZW5zb3JUZXN0TG9nZ2VyIGxvZ2dlciA9IGdldFRlc3RMb2dnZXIoKTsKLSAgICAgICAgbG9nZ2VyLmxvZ0luc3RydWN0aW9ucyhSLnN0cmluZy5zbnNyX2tlZXBfZGV2aWNlX3JvdGF0aW5nX2Nsb2Nrd2lzZSk7Ci0gICAgICAgIHdhaXRGb3JVc2VyVG9CZWdpbigpOworICAgICAgICBpZiAoIW1TaG91bGRSZXRyeSkgeworICAgICAgICAgICAgbG9nZ2VyLmxvZ0luc3RydWN0aW9ucyhSLnN0cmluZy5zbnNyX2tlZXBfZGV2aWNlX3JvdGF0aW5nX2Nsb2Nrd2lzZSk7CisgICAgICAgICAgICB3YWl0Rm9yVXNlclRvQmVnaW4oKTsKKyAgICAgICAgfQogICAgICAgICBsb2dnZXIubG9nV2FpdEZvclNvdW5kKCk7CiAKICAgICAgICAgVGVzdFNlbnNvckVudmlyb25tZW50IGNhbGlicmF0ZWRFbnZpcm9ubWVudCA9IG5ldyBUZXN0U2Vuc29yRW52aXJvbm1lbnQoCkBAIC0xNDgsOCArMTUxLDEwIEBACiAgICAgICAgIHNldFJlbmRlcmVyUm90YXRpb24ocm90YXRpb25BeGlzLCBleHBlY3RhdGlvbkRlZyA+PSAwKTsKIAogICAgICAgICBTZW5zb3JUZXN0TG9nZ2VyIGxvZ2dlciA9IGdldFRlc3RMb2dnZXIoKTsKLSAgICAgICAgbG9nZ2VyLmxvZ0luc3RydWN0aW9ucyhpbnN0cnVjdGlvbnNSZXNJZCk7Ci0gICAgICAgIHdhaXRGb3JVc2VyVG9CZWdpbigpOworICAgICAgICBpZiAoIW1TaG91bGRSZXRyeSkgeworICAgICAgICAgICAgbG9nZ2VyLmxvZ0luc3RydWN0aW9ucyhpbnN0cnVjdGlvbnNSZXNJZCk7CisgICAgICAgICAgICB3YWl0Rm9yVXNlclRvQmVnaW4oKTsKKyAgICAgICAgfQogICAgICAgICBsb2dnZXIubG9nV2FpdEZvclNvdW5kKCk7CiAKICAgICAgICAgVGVzdFNlbnNvckVudmlyb25tZW50IGVudmlyb25tZW50ID0gbmV3IFRlc3RTZW5zb3JFbnZpcm9ubWVudCgKZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9zZW5zb3JzL01vdGlvbkluZGljYXRvclZpZXcuamF2YSBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9zZW5zb3JzL01vdGlvbkluZGljYXRvclZpZXcuamF2YQppbmRleCAxNDc4NGRkLi40MTYwNTcyIDEwMDY0NAotLS0gYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvc2Vuc29ycy9Nb3Rpb25JbmRpY2F0b3JWaWV3LmphdmEKKysrIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL3NlbnNvcnMvTW90aW9uSW5kaWNhdG9yVmlldy5qYXZhCkBAIC0yNiw2ICsyNiw3IEBACiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3JNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIAogLyoqCkBAIC04OSw2ICs5MCw4IEBACiAKICAgICBwcml2YXRlIGJvb2xlYW4gbVhFbmFibGVkLCBtWUVuYWJsZWQsIG1aRW5hYmxlZDsKIAorICAgIHByaXZhdGUgYm9vbGVhbiBtSXNEZXZpY2VSb3RhdGVkID0gZmFsc2U7CisKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3RvcgogICAgICAqIEBwYXJhbSBjb250ZXh0CkBAIC0xNDYsNiArMTQ5LDE1IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogU2V0IHRoZSBkZXZpY2UncyBjdXJyZW50IHJvdGF0aW9uCisgICAgICogQHBhcmFtIHJvdGF0aW9uIFN1cmZhY2UuUk9UQVRJT05fMCwgU3VyZmFjZS5ST1RBVElPTl85MCwgU3VyZmFjZS5ST1RBVElPTl8xODAsIG9yCisgICAgICogICAgICAgICAgICAgICAgIFN1cmZhY2UuUk9UQVRJT05fMjcwCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGV2aWNlUm90YXRpb24oaW50IHJvdGF0aW9uKSB7CisgICAgICAgIG1Jc0RldmljZVJvdGF0ZWQgPSAocm90YXRpb24gPT0gU3VyZmFjZS5ST1RBVElPTl85MCB8fCByb3RhdGlvbiA9PSBTdXJmYWNlLlJPVEFUSU9OXzI3MCk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogU2V0IHRoZSBhY3RpdmUgYXhpcyBmb3IgZGlzcGxheQogICAgICAqCiAgICAgICogQHBhcmFtIGF4aXMgQVhJU19YLCBBWElTX1ksIEFYSVNfWiBmb3IgeCwgeSwgeiBheGlzIGluZGljYXRvcnMsIG9yIEFYSVNfQUxMIGZvciBhbGwgdGhyZWUuCkBAIC0xODEsMTYgKzE5MywyMiBAQAogICAgICAgICBtWFNpemUgPSB3OwogICAgICAgICBtWVNpemUgPSBoOwogCi0gICAgICAgIG1aQm91bmRPdXQgPSBuZXcgUmVjdEYody8yLXcvMi41ZiwgaC8yLXcvMi41Ziwgdy8yK3cvMi41ZiwgaC8yK3cvMi41Zik7CisgICAgICAgIGZsb2F0IGhhbGZTaWRlTGVuZ3RoID0gMC40ZiAqIE1hdGgubWluKHcsIGgpOworICAgICAgICBmbG9hdCBsZWZ0U2lkZSA9IHcvMiAtIGhhbGZTaWRlTGVuZ3RoOworICAgICAgICBmbG9hdCB0b3BTaWRlID0gaC8yIC0gaGFsZlNpZGVMZW5ndGg7CisgICAgICAgIGZsb2F0IHJpZ2h0U2lkZSA9IHcvMiArIGhhbGZTaWRlTGVuZ3RoOworICAgICAgICBmbG9hdCBib3R0b21TaWRlID0gaC8yICsgaGFsZlNpZGVMZW5ndGg7CisKKyAgICAgICAgbVpCb3VuZE91dCA9IG5ldyBSZWN0RihsZWZ0U2lkZSwgdG9wU2lkZSwgcmlnaHRTaWRlLCBib3R0b21TaWRlKTsKICAgICAgICAgbVpCb3VuZE91dDIgPSBuZXcgUmVjdEYoCi0gICAgICAgICAgICAgICAgdy8yLXcvMi41Zi1aUklOR19DVVJTT1JfQURELCBoLzItdy8yLjVmLVpSSU5HX0NVUlNPUl9BREQsCi0gICAgICAgICAgICAgICAgdy8yK3cvMi41ZitaUklOR19DVVJTT1JfQURELCBoLzIrdy8yLjVmK1pSSU5HX0NVUlNPUl9BREQpOworICAgICAgICAgICAgICAgIGxlZnRTaWRlLVpSSU5HX0NVUlNPUl9BREQsIHRvcFNpZGUtWlJJTkdfQ1VSU09SX0FERCwKKyAgICAgICAgICAgICAgICByaWdodFNpZGUrWlJJTkdfQ1VSU09SX0FERCwgYm90dG9tU2lkZStaUklOR19DVVJTT1JfQUREKTsKICAgICAgICAgbVpCb3VuZEluID0gbmV3IFJlY3RGKAotICAgICAgICAgICAgICAgIHcvMi13LzIuNWYrWlJJTkdfV0lEVEgsIGgvMi13LzIuNWYrWlJJTkdfV0lEVEgsCi0gICAgICAgICAgICAgICAgdy8yK3cvMi41Zi1aUklOR19XSURUSCwgaC8yK3cvMi41Zi1aUklOR19XSURUSCk7CisgICAgICAgICAgICAgICAgbGVmdFNpZGUrWlJJTkdfV0lEVEgsIHRvcFNpZGUrWlJJTkdfV0lEVEgsCisgICAgICAgICAgICAgICAgcmlnaHRTaWRlLVpSSU5HX1dJRFRILCBib3R0b21TaWRlLVpSSU5HX1dJRFRIKTsKICAgICAgICAgbVpCb3VuZEluMiA9IG5ldyBSZWN0RigKLSAgICAgICAgICAgICAgICB3LzItdy8yLjVmK1pSSU5HX1dJRFRIK1pSSU5HX0NVUlNPUl9BREQsIGgvMi13LzIuNWYrWlJJTkdfV0lEVEgrWlJJTkdfQ1VSU09SX0FERCwKLSAgICAgICAgICAgICAgICB3LzIrdy8yLjVmLVpSSU5HX1dJRFRILVpSSU5HX0NVUlNPUl9BREQsIGgvMit3LzIuNWYtWlJJTkdfV0lEVEgtWlJJTkdfQ1VSU09SX0FERCk7CisgICAgICAgICAgICAgICAgbGVmdFNpZGUrWlJJTkdfV0lEVEgrWlJJTkdfQ1VSU09SX0FERCwgdG9wU2lkZStaUklOR19XSURUSCtaUklOR19DVVJTT1JfQURELAorICAgICAgICAgICAgICAgIHJpZ2h0U2lkZS1aUklOR19XSURUSC1aUklOR19DVVJTT1JfQURELCBib3R0b21TaWRlLVpSSU5HX1dJRFRILVpSSU5HX0NVUlNPUl9BREQpOwogCiAgICAgICAgIGlmIChMT0NBTF9MT0dWKSBMb2cudihUQUcsICJOZXcgdmlldyBzaXplID0gKCIrdysiLCAiK2grIikiKTsKICAgICB9CkBAIC0yMDksOCArMjI3LDE0IEBACiAgICAgICAgIHAuc2V0Q29sb3IoQ29sb3IuWUVMTE9XKTsKICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDEwLDEwLCA1MCwgNTAsIHApOwogCi0gICAgICAgIGlmIChtWEVuYWJsZWQgJiYgbVhDb3ZlcmVkICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludCB4TlN0ZXAgPSBtWENvdmVyZWQuZ2V0TlN0ZXBzKCkgKyA0OyAvLyB0d28gb24gZWFjaCBzaWRlIGFzIGEgYnVmZmVyCisgICAgICAgIC8vIEluIG9yZGVyIHRvIGRldGVybWluZSB3aGljaCBwcm9ncmVzcyBiYXIgdG8gZHJhdywgdGhlIGRldmljZSdzIHJvdGF0aW9uIG11c3QgYmUgYWNjb3VudGVkCisgICAgICAgIC8vIGZvciBzaW5jZSB0aGUgYWNjZWxlcm9tZXRlciByb3RhdGVzIHdpdGggdGhlIGRpc3BsYXkuCisgICAgICAgIGJvb2xlYW4gZHJhd1ggPSAobVhFbmFibGVkICYmICFtSXNEZXZpY2VSb3RhdGVkKSB8fCAobVlFbmFibGVkICYmIG1Jc0RldmljZVJvdGF0ZWQpOworICAgICAgICBib29sZWFuIGRyYXdZID0gKG1ZRW5hYmxlZCAmJiAhbUlzRGV2aWNlUm90YXRlZCkgfHwgKG1YRW5hYmxlZCAmJiBtSXNEZXZpY2VSb3RhdGVkKTsKKworICAgICAgICBpZiAoZHJhd1ggJiYgbVhDb3ZlcmVkICE9IG51bGwpIHsKKyAgICAgICAgICAgIFJhbmdlQ292ZXJlZFJlZ2lzdGVyIGNvdmVyZWQgPSBtSXNEZXZpY2VSb3RhdGVkID8gbVlDb3ZlcmVkIDogbVhDb3ZlcmVkOworICAgICAgICAgICAgaW50IHhOU3RlcCA9IGNvdmVyZWQuZ2V0TlN0ZXBzKCkgKyA0OyAvLyB0d28gb24gZWFjaCBzaWRlIGFzIGEgYnVmZmVyCiAgICAgICAgICAgICBpbnQgeFN0ZXBTaXplID0gbVhTaXplICogMy80IC8geE5TdGVwOwogICAgICAgICAgICAgaW50IHhMZWZ0ID0gbVhTaXplICogMS84ICsgKG1YU2l6ZSAqIDMvNCAlIHhOU3RlcCkvMjsKIApAQCAtMjE5LDggKzI0Myw4IEBACiAgICAgICAgICAgICAgICAgICAgIHhMZWZ0K3hTdGVwU2l6ZSp4TlN0ZXAtMSwgWEJBUl9XSURUSCtYQkFSX01BUkdJTiwgbVJhbmdlUGFpbnQpOwogCiAgICAgICAgICAgICAvLyBjb3ZlcmVkIHJhbmdlCi0gICAgICAgICAgICBmb3IgKGk9MDsgaTxtWENvdmVyZWQuZ2V0TlN0ZXBzKCk7ICsraSkgewotICAgICAgICAgICAgICAgIGlmIChtWENvdmVyZWQuaXNDb3ZlcmVkKGkpKSB7CisgICAgICAgICAgICBmb3IgKGk9MDsgaTxjb3ZlcmVkLmdldE5TdGVwcygpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBpZiAoY292ZXJlZC5pc0NvdmVyZWQoaSkpIHsKICAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhMZWZ0K3hTdGVwU2l6ZSooaSsyKSwgWEJBUl9NQVJHSU4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeExlZnQreFN0ZXBTaXplKihpKzMpLTEsIFhCQVJfV0lEVEggKyBYQkFSX01BUkdJTiwKQEAgLTIzNSwxMiArMjU5LDE0IEBACiAgICAgICAgICAgICAgICAgICAgIHhMZWZ0K3hTdGVwU2l6ZSooeE5TdGVwLTIpKzMsIFhCQVJfV0lEVEgrWEJBUl9NQVJHSU4sIG1MaW1pdFBhaW50KTsKIAogICAgICAgICAgICAgLy8gY3Vyc29yCi0gICAgICAgICAgICB0ID0gKGludCkoeExlZnQreFN0ZXBTaXplKihtWENvdmVyZWQuZ2V0TGFzdFZhbHVlKCkrMikpOworICAgICAgICAgICAgdCA9IChpbnQpKHhMZWZ0K3hTdGVwU2l6ZSooY292ZXJlZC5nZXRMYXN0VmFsdWUoKSsyKSk7CiAgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QodC00LCBYQkFSX01BUkdJTi1YQkFSX0NVUlNPUl9BREQsIHQrMywKICAgICAgICAgICAgICAgICAgICAgWEJBUl9XSURUSCtYQkFSX01BUkdJTitYQkFSX0NVUlNPUl9BREQsIG1DdXJzb3JQYWludCk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKG1ZRW5hYmxlZCAmJiBtWUNvdmVyZWQgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50IHlOU3RlcCA9IG1ZQ292ZXJlZC5nZXROU3RlcHMoKSArIDQ7IC8vIHR3byBvbiBlYWNoIHNpZGUgYXMgYSBidWZmZXIKKworICAgICAgICBpZiAoZHJhd1kgJiYgbVlDb3ZlcmVkICE9IG51bGwpIHsKKyAgICAgICAgICAgIFJhbmdlQ292ZXJlZFJlZ2lzdGVyIGNvdmVyZWQgPSBtSXNEZXZpY2VSb3RhdGVkID8gbVhDb3ZlcmVkIDogbVlDb3ZlcmVkOworICAgICAgICAgICAgaW50IHlOU3RlcCA9IGNvdmVyZWQuZ2V0TlN0ZXBzKCkgKyA0OyAvLyB0d28gb24gZWFjaCBzaWRlIGFzIGEgYnVmZmVyCiAgICAgICAgICAgICBpbnQgeVN0ZXBTaXplID0gbVlTaXplICogMy80IC8geU5TdGVwOwogICAgICAgICAgICAgaW50IHlMZWZ0ID0gbVlTaXplICogMS84ICsgKG1ZU2l6ZSAqIDMvNCAlIHlOU3RlcCkvMjsKIApAQCAtMjQ5LDggKzI3NSw4IEBACiAgICAgICAgICAgICAgICAgICAgIFlCQVJfV0lEVEgrWUJBUl9NQVJHSU4sIHlMZWZ0K3lTdGVwU2l6ZSp5TlN0ZXAtMSwgbVJhbmdlUGFpbnQpOwogCiAgICAgICAgICAgICAvLyBjb3ZlcmVkIHJhbmdlCi0gICAgICAgICAgICBmb3IgKGk9MDsgaTxtWUNvdmVyZWQuZ2V0TlN0ZXBzKCk7ICsraSkgewotICAgICAgICAgICAgICAgIGlmIChtWUNvdmVyZWQuaXNDb3ZlcmVkKGkpKSB7CisgICAgICAgICAgICBmb3IgKGk9MDsgaTxjb3ZlcmVkLmdldE5TdGVwcygpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBpZiAoY292ZXJlZC5pc0NvdmVyZWQoaSkpIHsKICAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlCQVJfTUFSR0lOLCB5TGVmdCt5U3RlcFNpemUqKGkrMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWUJBUl9XSURUSCArIFlCQVJfTUFSR0lOLCB5TGVmdCt5U3RlcFNpemUqKGkrMyktMSwKQEAgLTI2NSw3ICsyOTEsNyBAQAogICAgICAgICAgICAgICAgICAgICBZQkFSX1dJRFRIICsgWUJBUl9NQVJHSU4sIHlMZWZ0ICsgeVN0ZXBTaXplICogKHlOU3RlcCAtIDIpICsgMywgbUxpbWl0UGFpbnQpOwogCiAgICAgICAgICAgICAvLyBjdXJzb3IKLSAgICAgICAgICAgIHQgPSAoaW50KSh5TGVmdCt5U3RlcFNpemUqKG1ZQ292ZXJlZC5nZXRMYXN0VmFsdWUoKSsyKSk7CisgICAgICAgICAgICB0ID0gKGludCkoeUxlZnQreVN0ZXBTaXplKihjb3ZlcmVkLmdldExhc3RWYWx1ZSgpKzIpKTsKICAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCggWUJBUl9NQVJHSU4tWUJBUl9DVVJTT1JfQURELCB0LTQsCiAgICAgICAgICAgICAgICAgICAgIFlCQVJfV0lEVEgrWUJBUl9NQVJHSU4rWUJBUl9DVVJTT1JfQURELCB0KzMsIG1DdXJzb3JQYWludCk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9zZW5zb3JzL09mZkJvZHlTZW5zb3JUZXN0QWN0aXZpdHkuamF2YSBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9zZW5zb3JzL09mZkJvZHlTZW5zb3JUZXN0QWN0aXZpdHkuamF2YQppbmRleCA4MzE4ZDE2Li5iODBiZTQwIDEwMDY0NAotLS0gYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvc2Vuc29ycy9PZmZCb2R5U2Vuc29yVGVzdEFjdGl2aXR5LmphdmEKKysrIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL3NlbnNvcnMvT2ZmQm9keVNlbnNvclRlc3RBY3Rpdml0eS5qYXZhCkBAIC0yOSw3ICsyOSw3IEBACiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jdHMuaGVscGVycy5TdXNwZW5kU3RhdGVNb25pdG9yOwogaW1wb3J0IGFuZHJvaWQub3MuUG93ZXJNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LmNvbnRlbnQuTG9jYWxCcm9hZGNhc3RNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWR4LmxvY2FsYnJvYWRjYXN0bWFuYWdlci5jb250ZW50LkxvY2FsQnJvYWRjYXN0TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCiBpbXBvcnQgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLlI7CmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvc2Vuc29ycy9SVkNWQ2FtZXJhUHJldmlldy5qYXZhIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL3NlbnNvcnMvUlZDVkNhbWVyYVByZXZpZXcuamF2YQppbmRleCBiZDQ2M2FmLi4xMGQxODY1IDEwMDY0NAotLS0gYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvc2Vuc29ycy9SVkNWQ2FtZXJhUHJldmlldy5qYXZhCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9zZW5zb3JzL1JWQ1ZDYW1lcmFQcmV2aWV3LmphdmEKQEAgLTIxLDkgKzIxLDExIEBACiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5DYW1lcmE7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlOwogaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmxhbmcuTWF0aDsKQEAgLTM2LDEwICszOCwxMSBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiUlZDVkNhbWVyYVByZXZpZXciOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gTE9DQUxfTE9HRCA9IHRydWU7CiAKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQgPSBudWxsOwogICAgIHByaXZhdGUgU3VyZmFjZUhvbGRlciBtSG9sZGVyOwogICAgIHByaXZhdGUgQ2FtZXJhIG1DYW1lcmE7Ci0gICAgcHJpdmF0ZSBmbG9hdCBtQXNwZWN0OwotICAgIHByaXZhdGUgaW50IG1Sb3RhdGlvbjsKKyAgICBwcml2YXRlIGZsb2F0IG1DYW1lcmFBc3BlY3RSYXRpbyA9IDA7CisgICAgcHJpdmF0ZSBpbnQgbUNhbWVyYVJvdGF0aW9uID0gMDsKICAgICBwcml2YXRlIGJvb2xlYW4gbUNoZWNrU3RhcnRUZXN0ID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1QcmV2aWV3U3RhcnRlZCA9IGZhbHNlOwogCkBAIC01MSw2ICs1NCw3IEBACiAgICAgICovCiAgICAgcHVibGljIFJWQ1ZDYW1lcmFQcmV2aWV3KENvbnRleHQgY29udGV4dCkgewogICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwogICAgICAgICBtQ2FtZXJhID0gbnVsbDsKICAgICAgICAgaW5pdFN1cmZhY2UoKTsKICAgICB9CkBAIC02MiwxMiArNjYsMTMgQEAKICAgICAgKi8KICAgICBwdWJsaWMgUlZDVkNhbWVyYVByZXZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKICAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgaW5pdChDYW1lcmEgY2FtZXJhLCBmbG9hdCBhc3BlY3RSYXRpbywgaW50IHJvdGF0aW9uKSAgewogICAgICAgICB0aGlzLm1DYW1lcmEgPSBjYW1lcmE7Ci0gICAgICAgIG1Bc3BlY3QgPSBhc3BlY3RSYXRpbzsKLSAgICAgICAgbVJvdGF0aW9uID0gcm90YXRpb247CisgICAgICAgIG1DYW1lcmFBc3BlY3RSYXRpbyA9IGFzcGVjdFJhdGlvOworICAgICAgICBtQ2FtZXJhUm90YXRpb24gPSByb3RhdGlvbjsKICAgICAgICAgaW5pdFN1cmZhY2UoKTsKICAgICB9CiAKQEAgLTExMSw3ICsxMTYsMTEgQEAKICAgICAgICAgICAgIC8vIHByZXZpZXcgc3VyZmFjZSBvciBjYW1lcmEgZG9lcyBub3QgZXhpc3QKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBpZiAoYWRqdXN0TGF5b3V0UGFyYW1zSWZOZWVkZWQoKSkgeworCisgICAgICAgIGludCB0b3RhbFJvdGF0aW9uID0gZ2V0UmVxdWlyZWRSb3RhdGlvbigpOworICAgICAgICBtQ2FtZXJhLnNldERpc3BsYXlPcmllbnRhdGlvbih0b3RhbFJvdGF0aW9uKTsKKworICAgICAgICBpZiAoYWRqdXN0TGF5b3V0UGFyYW1zSWZOZWVkZWQodG90YWxSb3RhdGlvbikpIHsKICAgICAgICAgICAgIC8vIFdhaXQgb24gbmV4dCBzdXJmYWNlQ2hhbmdlZCgpIGNhbGwgYmVmb3JlIHByb2NlZWRpbmcKICAgICAgICAgICAgIExvZy5kKFRBRywgIldhaXRpbmcgb24gc3VyZmFjZSBjaGFuZ2UgYmVmb3JlIHN0YXJ0aW5nIHByZXZpZXciKTsKICAgICAgICAgICAgIHJldHVybjsKQEAgLTEyNyw3ICsxMzYsNiBAQAogICAgICAgICB9CiAgICAgICAgIG1DaGVja1N0YXJ0VGVzdCA9IGZhbHNlOwogCi0gICAgICAgIG1DYW1lcmEuc2V0RGlzcGxheU9yaWVudGF0aW9uKG1Sb3RhdGlvbik7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBtQ2FtZXJhLnNldFByZXZpZXdEaXNwbGF5KGhvbGRlcik7CiAgICAgICAgICAgICBtQ2FtZXJhLnN0YXJ0UHJldmlldygpOwpAQCAtMTQyLDIzICsxNTAsNzAgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBEZXRlcm1pbmUgdGhlIHJvdGF0aW9uIHJlcXVpcmVkIHRvIGRpc3BsYXkgdGhlIGNhbWVyYSdzIHByZXZpZXcgb24gdGhlIHNjcmVlbiBhcyBsYXJnZSBhcworICAgICAqIHBvc3NpYmxlLiBUaGlzIGZ1bmN0aW9uIGNvbWJpbmVzIHRoZSBkZXZpY2UncyBjdXJyZW50IHJvdGF0aW9uIGZyb20gaXRzIGRlZmF1bHQgb3JpZW50YXRpb24KKyAgICAgKiBhbmQgdGhlIHJvdGF0aW9uIG9mIHRoZSBjYW1lcmEuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZ2V0UmVxdWlyZWRSb3RhdGlvbigpIHsKKyAgICAgICAgV2luZG93TWFuYWdlciB3aW5kb3dNYW5hZ2VyID0KKyAgICAgICAgICAgICAgICAoV2luZG93TWFuYWdlciltQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuV0lORE9XX1NFUlZJQ0UpOworICAgICAgICBpbnQgZGV2aWNlUm90YXRpb24gPSAwOworICAgICAgICBpZiAod2luZG93TWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHdpbmRvd01hbmFnZXIuZ2V0RGVmYXVsdERpc3BsYXkoKS5nZXRSb3RhdGlvbigpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBTdXJmYWNlLlJPVEFUSU9OXzA6CisgICAgICAgICAgICAgICAgICAgIGRldmljZVJvdGF0aW9uID0gMDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTdXJmYWNlLlJPVEFUSU9OXzkwOgorICAgICAgICAgICAgICAgICAgICBkZXZpY2VSb3RhdGlvbiA9IDI3MDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTdXJmYWNlLlJPVEFUSU9OXzE4MDoKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlUm90YXRpb24gPSAxODA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU3VyZmFjZS5ST1RBVElPTl8yNzA6CisgICAgICAgICAgICAgICAgICAgIGRldmljZVJvdGF0aW9uID0gOTA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGRldmljZVJvdGF0aW9uID0gMDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJVbmFibGUgdG8gZ2V0IGRldmljZSByb3RhdGlvbiwgcHJldmlldyBtYXkgYmUgc2tld2VkLiIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChtQ2FtZXJhUm90YXRpb24gKyBkZXZpY2VSb3RhdGlvbikgJSAzNjA7CisgICAgfQorCisgICAgLyoqCiAgICAgICogUmVzaXplIHRoZSBsYXlvdXQgdG8gbW9yZSBjbG9zZWx5IG1hdGNoIHRoZSBkZXNpcmVkIGFzcGVjdCByYXRpbywgaWYgbmVjZXNzYXJ5LgogICAgICAqCiAgICAgICogQHJldHVybiB0cnVlIGlmIHdlIHVwZGF0ZWQgdGhlIGxheW91dCBwYXJhbXMsIGZhbHNlIGlmIHRoZSBwYXJhbXMgbG9vayBnb29kCiAgICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGFkanVzdExheW91dFBhcmFtc0lmTmVlZGVkKCkgeworICAgIHByaXZhdGUgYm9vbGVhbiBhZGp1c3RMYXlvdXRQYXJhbXNJZk5lZWRlZChpbnQgdG90YWxSb3RhdGlvbikgeworICAgICAgICAvLyBEZXRlcm1pbmUgdGhlIG1heGltdW0gc2l6ZSBsYXlvdXQgdGhhdCBtYWludGFpbnMgdGhlIGNhbWVyYSdzIHByZXZpZXcgYXNwZWN0IHJhdGlvCisgICAgICAgIGZsb2F0IGNhbWVyYUFzcGVjdCA9IG1DYW1lcmFBc3BlY3RSYXRpbzsKKworICAgICAgICAvLyBDaGVjayB0aGUgY2FtZXJhIGFuZCBkZXZpY2Ugcm90YXRpb24gYW5kIGludmVydCB0aGUgYXNwZWN0IHJhdGlvIGlmIHRoZSBkZXZpY2UgaXMgbm90CisgICAgICAgIC8vIHJvdGF0ZWQgYXQgMCBvciAxODAgZGVncmVlcy4KKyAgICAgICAgaWYgKHRvdGFsUm90YXRpb24gJSAxODAgIT0gMCkgeworICAgICAgICAgICAgLy8gVGhlIGRldmljZSBpcyByb3RhdGVkLCBzbyB0aGUgc2NyZWVuIHNob3VsZCBiZSB0aGUgaW52ZXJzZSBvZiB0aGUgYXNwZWN0IHJhdGlvCisgICAgICAgICAgICBjYW1lcmFBc3BlY3QgPSAxLjBmIC8gbUNhbWVyYUFzcGVjdFJhdGlvOworICAgICAgICB9CisKKyAgICAgICAgLy8gT25seSBhZGp1c3QgaWYgdGhlcmUgaXMgYXQgbGVhc3QgMSUgZXJyb3IgYmV0d2VlbiB0aGUgYXNwZWN0cwogICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIGxheW91dFBhcmFtcyA9IGdldExheW91dFBhcmFtcygpOwogICAgICAgICBpbnQgY3VyV2lkdGggPSBnZXRXaWR0aCgpOwogICAgICAgICBpbnQgY3VySGVpZ2h0ID0gZ2V0SGVpZ2h0KCk7Ci0gICAgICAgIGZsb2F0IGN1ckFzcGVjdCA9IChmbG9hdCljdXJIZWlnaHQgLyAoZmxvYXQpY3VyV2lkdGg7Ci0gICAgICAgIGZsb2F0IGFzcGVjdERlbHRhID0gTWF0aC5hYnMobUFzcGVjdCAtIGN1ckFzcGVjdCk7Ci0gICAgICAgIGlmICgoYXNwZWN0RGVsdGEgLyBtQXNwZWN0KSA+PSAwLjAxKSB7Ci0gICAgICAgICAgICBpZiAoY3VyQXNwZWN0ID4gbUFzcGVjdCkgewotICAgICAgICAgICAgICAgIGxheW91dFBhcmFtcy5oZWlnaHQgPSAoaW50KU1hdGgucm91bmQoY3VyV2lkdGggKiBtQXNwZWN0KTsKKyAgICAgICAgZmxvYXQgY3VyQXNwZWN0ID0gKGZsb2F0KWN1cldpZHRoIC8gKGZsb2F0KWN1ckhlaWdodDsKKyAgICAgICAgZmxvYXQgYXNwZWN0RGVsdGEgPSBNYXRoLmFicyhjYW1lcmFBc3BlY3QgLSBjdXJBc3BlY3QpOworICAgICAgICBpZiAoKGFzcGVjdERlbHRhIC8gY2FtZXJhQXNwZWN0KSA+PSAwLjAxKSB7CisgICAgICAgICAgICBpZiAoY2FtZXJhQXNwZWN0ID4gY3VyQXNwZWN0KSB7CisgICAgICAgICAgICAgICAgLy8gQ2FtZXJhIHByZXZpZXcgaXMgd2lkZXIgdGhhbiB0aGUgY3VycmVudCBsYXlvdXQuIE5lZWQgdG8gc2hvcnRlbiB0aGUgY3VycmVudCBsYXlvdXQKICAgICAgICAgICAgICAgICBsYXlvdXRQYXJhbXMud2lkdGggPSBjdXJXaWR0aDsKKyAgICAgICAgICAgICAgICBsYXlvdXRQYXJhbXMuaGVpZ2h0ID0gKGludCkoY3VyV2lkdGggLyBjYW1lcmFBc3BlY3QpOwogICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBDYW1lcmEgcHJldmlldyB0YWxsZXIgdGhhbiB0aGUgY3VycmVudCBsYXlvdXQuIE5lZWQgdG8gbmFycm93IHRoZSBjdXJyZW50IGxheW91dAorICAgICAgICAgICAgICAgIGxheW91dFBhcmFtcy53aWR0aCA9IChpbnQpKGN1ckhlaWdodCAqIGNhbWVyYUFzcGVjdCk7CiAgICAgICAgICAgICAgICAgbGF5b3V0UGFyYW1zLmhlaWdodCA9IGN1ckhlaWdodDsKLSAgICAgICAgICAgICAgICBsYXlvdXRQYXJhbXMud2lkdGggPSAoaW50KU1hdGgucm91bmQoY3VySGVpZ2h0IC8gbUFzcGVjdCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChsYXlvdXRQYXJhbXMuaGVpZ2h0ICE9IGN1ckhlaWdodCB8fCBsYXlvdXRQYXJhbXMud2lkdGggIT0gY3VyV2lkdGgpIHsKZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9zZW5zb3JzL1JWQ1ZSZWNvcmRBY3Rpdml0eS5qYXZhIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL3NlbnNvcnMvUlZDVlJlY29yZEFjdGl2aXR5LmphdmEKaW5kZXggODE5OTczNi4uNGY5MmI2NCAxMDA2NDQKLS0tIGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL3NlbnNvcnMvUlZDVlJlY29yZEFjdGl2aXR5LmphdmEKKysrIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL3NlbnNvcnMvUlZDVlJlY29yZEFjdGl2aXR5LmphdmEKQEAgLTMzLDcgKzMzLDkgQEAKIGltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OwogaW1wb3J0IGFuZHJvaWQudXRpbC5Kc29uV3JpdGVyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2U7CiBpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvdzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVG9hc3Q7CiAKQEAgLTcwLDYgKzcyLDcgQEAKICAgICBwcml2YXRlIFJWU2Vuc29yTG9nZ2VyICAgICAgICAgIG1SVlNlbnNvckxvZ2dlcjsKICAgICBwcml2YXRlIENvdmVyYWdlTWFuYWdlciAgICAgICAgIG1Db3Zlck1hbmFnZXI7CiAgICAgcHJpdmF0ZSBDYW1lcmFDb250ZXh0IG1DYW1lcmFDb250ZXh0OworICAgIHByaXZhdGUgaW50IG1EZXZpY2VSb3RhdGlvbiA9IFN1cmZhY2UuUk9UQVRJT05fMDsKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFYSVNfTk9ORSA9IDA7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVhJU19BTEwgPSBTZW5zb3JNYW5hZ2VyLkFYSVNfWCArCkBAIC0xMTksNiArMTIyLDEyIEBACiAKICAgICAgICAgLy8gbG9jYXRlIHZpZXdzCiAgICAgICAgIG1JbmRpY2F0b3JWaWV3ID0gKE1vdGlvbkluZGljYXRvclZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLmNhbV9pbmRpY2F0b3IpOworICAgICAgICBXaW5kb3dNYW5hZ2VyIHdpbmRvd01hbmFnZXIgPQorICAgICAgICAgICAgICAgIChXaW5kb3dNYW5hZ2VyKWdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5XSU5ET1dfU0VSVklDRSk7CisgICAgICAgIGlmICh3aW5kb3dNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1EZXZpY2VSb3RhdGlvbiA9IHdpbmRvd01hbmFnZXIuZ2V0RGVmYXVsdERpc3BsYXkoKS5nZXRSb3RhdGlvbigpOworICAgICAgICAgICAgbUluZGljYXRvclZpZXcuc2V0RGV2aWNlUm90YXRpb24obURldmljZVJvdGF0aW9uKTsKKyAgICAgICAgfQogCiAgICAgICAgIGluaXRTdG9yYWdlUGF0aCgpOwogICAgIH0KQEAgLTIyNCw2ICsyMzMsOSBAQAogCiAgICAgICAgIGlmIChheGlzID49U2Vuc29yTWFuYWdlci5BWElTX1ggJiYgYXhpcyA8PVNlbnNvck1hbmFnZXIuQVhJU19aKSB7CiAgICAgICAgICAgICBpbWFnZVZpZXcuc2V0SW1hZ2VSZXNvdXJjZShwcm9tcHRzW2F4aXMtMV0pOworICAgICAgICAgICAgaWYgKG1EZXZpY2VSb3RhdGlvbiAhPSBTdXJmYWNlLlJPVEFUSU9OXzAgJiYgbURldmljZVJvdGF0aW9uICE9IFN1cmZhY2UuUk9UQVRJT05fMTgwKSB7CisgICAgICAgICAgICAgICAgaW1hZ2VWaWV3LnNldFJvdGF0aW9uKDkwKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1JbmRpY2F0b3JWaWV3LmVuYWJsZUF4aXMoYXhpcyk7CiAgICAgICAgICAgICBtUlZTZW5zb3JMb2dnZXIudXBkYXRlUmVnaXN0ZXIobUNvdmVyTWFuYWdlci5nZXRBeGlzKGF4aXMpLCBheGlzKTsKICAgICAgICAgICAgIG5vdGlmeVByb21wdChheGlzKTsKZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9zZW5zb3JzL1JWQ1ZYQ2hlY2tUZXN0QWN0aXZpdHkuamF2YSBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9zZW5zb3JzL1JWQ1ZYQ2hlY2tUZXN0QWN0aXZpdHkuamF2YQppbmRleCBmZWM1OTNjLi41ODE0NWUyIDEwMDY0NAotLS0gYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvc2Vuc29ycy9SVkNWWENoZWNrVGVzdEFjdGl2aXR5LmphdmEKKysrIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL3NlbnNvcnMvUlZDVlhDaGVja1Rlc3RBY3Rpdml0eS5qYXZhCkBAIC0xNjcsNyArMTY3LDcgQEAKIAogICAgICAgICAgICAgLy8gYWNxdWlyZSBhIHBhcnRpYWwgd2FrZSBsb2NrIGp1c3QgaW4gY2FzZSBDUFUgZmFsbCBhc2xlZXAKICAgICAgICAgICAgIFBvd2VyTWFuYWdlciBwbSA9IChQb3dlck1hbmFnZXIpIGdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5QT1dFUl9TRVJWSUNFKTsKLSAgICAgICAgICAgIFBvd2VyTWFuYWdlci5XYWtlTG9jayB3bCA9IHBtLm5ld1dha2VMb2NrKFBvd2VyTWFuYWdlci5QQVJUSUFMX1dBS0VfTE9DSywKKyAgICAgICAgICAgIFBvd2VyTWFuYWdlci5XYWtlTG9jayB3bCA9IHBtLm5ld1dha2VMb2NrKFBvd2VyTWFuYWdlci5GVUxMX1dBS0VfTE9DSywKICAgICAgICAgICAgICAgICAgICAgIlJWQ1ZYQ2hlY2tBbmFseXplciIpOwogCiAgICAgICAgICAgICB3bC5hY3F1aXJlKCk7CmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvc2Vuc29ycy9TaWduaWZpY2FudE1vdGlvblRlc3RBY3Rpdml0eS5qYXZhIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL3NlbnNvcnMvU2lnbmlmaWNhbnRNb3Rpb25UZXN0QWN0aXZpdHkuamF2YQppbmRleCA0MmU4M2YyLi5lNzQ3Nzg0IDEwMDY0NAotLS0gYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvc2Vuc29ycy9TaWduaWZpY2FudE1vdGlvblRlc3RBY3Rpdml0eS5qYXZhCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9zZW5zb3JzL1NpZ25pZmljYW50TW90aW9uVGVzdEFjdGl2aXR5LmphdmEKQEAgLTQzLDcgKzQzLDcgQEAKIGltcG9ydCBhbmRyb2lkLm9zLlBvd2VyTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm9zLlBvd2VyTWFuYWdlci5XYWtlTG9jazsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5jb250ZW50LkxvY2FsQnJvYWRjYXN0TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkeC5sb2NhbGJyb2FkY2FzdG1hbmFnZXIuY29udGVudC5Mb2NhbEJyb2FkY2FzdE1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7CkBAIC01NSw2ICs1NSw3IEBACiBwdWJsaWMgY2xhc3MgU2lnbmlmaWNhbnRNb3Rpb25UZXN0QWN0aXZpdHkgZXh0ZW5kcyBTZW5zb3JDdHNWZXJpZmllclRlc3RBY3Rpdml0eSB7CiAgICAgcHVibGljIFNpZ25pZmljYW50TW90aW9uVGVzdEFjdGl2aXR5KCkgewogICAgICAgICBzdXBlcihTaWduaWZpY2FudE1vdGlvblRlc3RBY3Rpdml0eS5jbGFzcyk7CisgICAgICAgIG1FbmFibGVSZXRyeSA9IHRydWU7CiAgICAgfQogCiAgICAgLy8gYWNjZXB0YWJsZSB0aW1lIGRpZmZlcmVuY2UgYmV0d2VlbiBldmVudCB0aW1lIGFuZCBzeXN0ZW0gdGltZQpAQCAtMTQxLDggKzE0MiwxMCBAQAogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQogICAgIHB1YmxpYyBTdHJpbmcgdGVzdFRyaWdnZXJEZWFjdGl2YXRpb24oKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgU2Vuc29yVGVzdExvZ2dlciBsb2dnZXIgPSBnZXRUZXN0TG9nZ2VyKCk7Ci0gICAgICAgIGxvZ2dlci5sb2dJbnN0cnVjdGlvbnMoUi5zdHJpbmcuc25zcl9zaWduaWZpY2FudF9tb3Rpb25fdGVzdF9kZWFjdGl2YXRpb24pOwotICAgICAgICB3YWl0Rm9yVXNlclRvQmVnaW4oKTsKKyAgICAgICAgaWYgKCFtU2hvdWxkUmV0cnkpIHsKKyAgICAgICAgICAgIGxvZ2dlci5sb2dJbnN0cnVjdGlvbnMoUi5zdHJpbmcuc25zcl9zaWduaWZpY2FudF9tb3Rpb25fdGVzdF9kZWFjdGl2YXRpb24pOworICAgICAgICAgICAgd2FpdEZvclVzZXJUb0JlZ2luKCk7CisgICAgICAgIH0KIAogICAgICAgICBUcmlnZ2VyVmVyaWZpZXIgdmVyaWZpZXIgPSBuZXcgVHJpZ2dlclZlcmlmaWVyKCk7CiAgICAgICAgIG1TZW5zb3JNYW5hZ2VyLnJlcXVlc3RUcmlnZ2VyU2Vuc29yKHZlcmlmaWVyLCBtU2Vuc29yU2lnbmlmaWNhbnRNb3Rpb24pOwpAQCAtMTkwLDggKzE5MywxMCBAQAogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQogICAgIHB1YmxpYyBTdHJpbmcgdGVzdEFQV2FrZVVwT25TTURUcmlnZ2VyKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIFNlbnNvclRlc3RMb2dnZXIgbG9nZ2VyID0gZ2V0VGVzdExvZ2dlcigpOwotICAgICAgICBsb2dnZXIubG9nSW5zdHJ1Y3Rpb25zKFIuc3RyaW5nLnNuc3Jfc2lnbmlmaWNhbnRfbW90aW9uX2FwX3N1c3BlbmQpOwotICAgICAgICB3YWl0Rm9yVXNlclRvQmVnaW4oKTsKKyAgICAgICAgaWYgKCFtU2hvdWxkUmV0cnkpIHsKKyAgICAgICAgICAgIGxvZ2dlci5sb2dJbnN0cnVjdGlvbnMoUi5zdHJpbmcuc25zcl9zaWduaWZpY2FudF9tb3Rpb25fYXBfc3VzcGVuZCk7CisgICAgICAgICAgICB3YWl0Rm9yVXNlclRvQmVnaW4oKTsKKyAgICAgICAgfQogICAgICAgICBtVmVyaWZpZXIgPSBuZXcgVHJpZ2dlclZlcmlmaWVyKCk7CiAgICAgICAgIG1TZW5zb3JNYW5hZ2VyLnJlcXVlc3RUcmlnZ2VyU2Vuc29yKG1WZXJpZmllciwgbVNlbnNvclNpZ25pZmljYW50TW90aW9uKTsKICAgICAgICAgbG9uZyB0ZXN0U3RhcnRUaW1lTnMgPSBTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWVOYW5vcygpOwpAQCAtMjQzLDggKzI0OCwxMCBAQAogICAgICAgICAgICAgYm9vbGVhbiBjYW5jZWxFdmVudE5vdGlmaWNhdGlvbiwKICAgICAgICAgICAgIGJvb2xlYW4gdmlicmF0ZSkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIFNlbnNvclRlc3RMb2dnZXIgbG9nZ2VyID0gZ2V0VGVzdExvZ2dlcigpOwotICAgICAgICBsb2dnZXIubG9nSW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9uc1Jlc0lkKTsKLSAgICAgICAgd2FpdEZvclVzZXJUb0JlZ2luKCk7CisgICAgICAgIGlmICghbVNob3VsZFJldHJ5KSB7CisgICAgICAgICAgICBsb2dnZXIubG9nSW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9uc1Jlc0lkKTsKKyAgICAgICAgICAgIHdhaXRGb3JVc2VyVG9CZWdpbigpOworICAgICAgICB9CiAKICAgICAgICAgaWYgKHZpYnJhdGUpIHsKICAgICAgICAgICAgIHZpYnJhdGUoVklCUkFURV9EVVJBVElPTl9NSUxMSVMpOwpkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL3NlbnNvcnMvYmFzZS9CYXNlU2Vuc29yVGVzdEFjdGl2aXR5LmphdmEgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvc2Vuc29ycy9iYXNlL0Jhc2VTZW5zb3JUZXN0QWN0aXZpdHkuamF2YQppbmRleCAxYzkyZmQ3Li4yOGY2YmEwIDEwMDY0NAotLS0gYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvc2Vuc29ycy9iYXNlL0Jhc2VTZW5zb3JUZXN0QWN0aXZpdHkuamF2YQorKysgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvc2Vuc29ycy9iYXNlL0Jhc2VTZW5zb3JUZXN0QWN0aXZpdHkuamF2YQpAQCAtOTIsMTAgKzkyLDE5IEBACiAgICAgcHJpdmF0ZSBCdXR0b24gbU5leHRCdXR0b247CiAgICAgcHJpdmF0ZSBCdXR0b24gbVBhc3NCdXR0b247CiAgICAgcHJpdmF0ZSBCdXR0b24gbUZhaWxCdXR0b247CisgICAgcHJpdmF0ZSBCdXR0b24gbVJldHJ5QnV0dG9uOwogCiAgICAgcHJpdmF0ZSBHTFN1cmZhY2VWaWV3IG1HTFN1cmZhY2VWaWV3OwogICAgIHByaXZhdGUgYm9vbGVhbiBtVXNpbmdHbFN1cmZhY2VWaWV3OwogCisgICAgLy8gRmxhZyBmb3Igc2Vuc29yIHRlc3RzIHdpdGggcmV0cnkuCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gbUVuYWJsZVJldHJ5ID0gZmFsc2U7CisgICAgLy8gRmxhZyBmb3IgUmV0cnkgYnV0dG9uIGFwcGVhcmFuY2UuCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gbVNob3VsZFJldHJ5ID0gZmFsc2U7CisgICAgLy8gRmxhZyBmb3IgdGhlIGxhc3Qgc3ViLXRlc3QgdG8gc2hvdyBGaW5pc2ggYnV0dG9uLgorICAgIHByb3RlY3RlZCBib29sZWFuIG1Jc0xhc3RTdWJ0ZXN0ID0gZmFsc2U7CisgICAgcHJvdGVjdGVkIGludCBtUmV0cnlDb3VudCA9IDA7CisKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3RvciB0byBiZSB1c2VkIGJ5IHN1YmNsYXNzZXMuCiAgICAgICoKQEAgLTEzMiw3ICsxNDEsMTAgQEAKICAgICAgICAgbVBhc3NCdXR0b24gPSAoQnV0dG9uKSBmaW5kVmlld0J5SWQoUi5pZC5wYXNzX2J1dHRvbik7CiAgICAgICAgIG1GYWlsQnV0dG9uID0gKEJ1dHRvbikgZmluZFZpZXdCeUlkKFIuaWQuZmFpbF9idXR0b24pOwogICAgICAgICBtR0xTdXJmYWNlVmlldyA9IChHTFN1cmZhY2VWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5nbF9zdXJmYWNlX3ZpZXcpOworICAgICAgICBtUmV0cnlCdXR0b24gPSAoQnV0dG9uKSBmaW5kVmlld0J5SWQoUi5pZC5yZXRyeV9idXR0b24pOworICAgICAgICBtUmV0cnlCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKHRoaXMpOwogCisgICAgICAgIG1SZXRyeUJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CiAgICAgICAgIHVwZGF0ZU5leHRCdXR0b24oZmFsc2UgLyplbmFibGVkKi8pOwogICAgICAgICBtRXhlY3V0b3JTZXJ2aWNlLmV4ZWN1dGUodGhpcyk7CiAgICAgfQpAQCAtMTYxLDYgKzE3MywxNSBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHRhcmdldCkgeworICAgICAgICBzd2l0Y2ggKHRhcmdldC5nZXRJZCgpKSB7CisgICAgICAgICAgICBjYXNlIFIuaWQubmV4dF9idXR0b246CisgICAgICAgICAgICAgICAgbVNob3VsZFJldHJ5ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFIuaWQucmV0cnlfYnV0dG9uOgorICAgICAgICAgICAgICAgIG1TaG91bGRSZXRyeSA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0Rm9yVXNlckxhdGNoZXMpIHsKICAgICAgICAgICAgIGZvciAoQ291bnREb3duTGF0Y2ggbGF0Y2ggOiBtV2FpdEZvclVzZXJMYXRjaGVzKSB7CiAgICAgICAgICAgICAgICAgbGF0Y2guY291bnREb3duKCk7CkBAIC0zMDQsNiArMzI1LDE4IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogV2FpdHMgZm9yIHRoZSBvcGVyYXRvciB0byBhY2tub3dsZWRnZSB0byByZXRyeSBleGVjdXRpb24uCisgICAgICogSWYgdGhlIGV4ZWN1dGlvbiBpcyBmb3IgdGhlIGxhc3Qgc3VidGVzdCwgd2lsbCBub3RpZnkgdXNlciBieSBGaW5pc2ggYnV0dG9uLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHdhaXRGb3JVc2VyVG9SZXRyeSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChtSXNMYXN0U3VidGVzdCkgeworICAgICAgICAgICAgd2FpdEZvclVzZXIoUi5zdHJpbmcuc25zcl93YWl0X3RvX2ZpbmlzaCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3YWl0Rm9yVXNlcihSLnN0cmluZy5zbnNyX3dhaXRfdG9fcmV0cnkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICoge0Bpbmhlcml0RG9jfQogICAgICAqLwogICAgIEBPdmVycmlkZQpAQCAtNTI2LDExICs1NTksNDcgQEAKICAgICAgICAgcnVuT25VaVRocmVhZChuZXcgUnVubmFibGUoKSB7CiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBtTmV4dEJ1dHRvbi5zZXRUZXh0KGdldE5leHRCdXR0b25UZXh0KCkpOworICAgICAgICAgICAgICAgIHVwZGF0ZVJldHJ5QnV0dG9uKGVuYWJsZWQpOwogICAgICAgICAgICAgICAgIG1OZXh0QnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0pOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEdldCB0aGUgdGV4dCBmb3IgbmV4dCBidXR0b24uCisgICAgICogRHVyaW5nIHJldHJ5LCBuZXh0IGJ1dHRvbiB0ZXh0IGlzIGNoYW5nZWQgdG8gbm90aWZ5IHVzZXJzLgorICAgICAqLworICAgIHByaXZhdGUgaW50IGdldE5leHRCdXR0b25UZXh0KCkgeworICAgICAgICBpbnQgbmV4dEJ1dHRvblRleHQgPSBSLnN0cmluZy5uZXh0X2J1dHRvbl90ZXh0OworICAgICAgICBpZiAobVNob3VsZFJldHJ5KSB7CisgICAgICAgICAgICBpZiAobUlzTGFzdFN1YnRlc3QpeworICAgICAgICAgICAgICAgIG5leHRCdXR0b25UZXh0ID0gUi5zdHJpbmcuZmluaXNoX2J1dHRvbl90ZXh0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBuZXh0QnV0dG9uVGV4dCA9IFIuc3RyaW5nLmZhaWxfYW5kX25leHRfYnV0dG9uX3RleHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5leHRCdXR0b25UZXh0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFVwZGF0ZSB0aGUgcmV0cnkgYnV0dG9uIHN0YXR1cy4KKyAgICAgKiBEdXJpbmcgcmV0cnksIHNob3cgcmV0cnkgZXhlY3V0aW9uIGNvdW50LiBJZiBub3QgdG8gcmV0cnksIG1ha2UgcmV0cnkgYnV0dG9uIGludmlzaWJsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbmFibGVkIFRoZSBzdGF0dXMgb2YgYnV0dG9uLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVSZXRyeUJ1dHRvbihib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgU3RyaW5nIHNob3dSZXRyeUNvdW50ID0gU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICIlcyAoJWQpIiwgZ2V0UmVzb3VyY2VzKCkuZ2V0VGV4dChSLnN0cmluZy5yZXRyeV9idXR0b25fdGV4dCksIG1SZXRyeUNvdW50KTsKKyAgICAgICAgaWYgKG1TaG91bGRSZXRyeSkgeworICAgICAgICAgICAgbVJldHJ5QnV0dG9uLnNldFRleHQoc2hvd1JldHJ5Q291bnQpOworICAgICAgICAgICAgbVJldHJ5QnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIG1SZXRyeUJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVJldHJ5QnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCBlbmFibGVUZXN0UmVzdWx0QnV0dG9uKAogICAgICAgICAgICAgZmluYWwgQnV0dG9uIGJ1dHRvbiwKICAgICAgICAgICAgIGZpbmFsIGludCB0ZXh0UmVzSWQsCkBAIC01OTYsNiArNjY1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgbG9nVGVzdFNraXAobmFtZSwgc3VtbWFyeSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgUEFTUzoKKyAgICAgICAgICAgICAgICAgICAgbVNob3VsZFJldHJ5ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIGxvZ1Rlc3RQYXNzKG5hbWUsIHN1bW1hcnkpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIEZBSUw6CmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvc2Vuc29ycy9iYXNlL1NlbnNvckN0c1Rlc3RBY3Rpdml0eS5qYXZhIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL3NlbnNvcnMvYmFzZS9TZW5zb3JDdHNUZXN0QWN0aXZpdHkuamF2YQppbmRleCA2NTEyZmQzLi41ODBlYTU4IDEwMDY0NAotLS0gYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvc2Vuc29ycy9iYXNlL1NlbnNvckN0c1Rlc3RBY3Rpdml0eS5qYXZhCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9zZW5zb3JzL2Jhc2UvU2Vuc29yQ3RzVGVzdEFjdGl2aXR5LmphdmEKQEAgLTE3LDYgKzE3LDExIEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLnNlbnNvcnMuYmFzZTsKIAoraW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY3RzLlNlbnNvclRlc3RDYXNlOworaW1wb3J0IGFuZHJvaWQub3MuUG93ZXJNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOworCiBpbXBvcnQgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLlI7CiBpbXBvcnQgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLnNlbnNvcnMuaGVscGVycy5TZW5zb3JUZXN0U2NyZWVuTWFuaXB1bGF0b3I7CiBpbXBvcnQgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLnNlbnNvcnMucmVwb3J0aW5nLlNlbnNvclRlc3REZXRhaWxzOwpAQCAtMzcsMTEgKzQyLDYgQEAKIGltcG9ydCBvcmcuanVuaXQucnVubmVycy5tb2RlbC5Jbml0aWFsaXphdGlvbkVycm9yOwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLm1vZGVsLlJ1bm5lckJ1aWxkZXI7CiAKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmN0cy5TZW5zb3JUZXN0Q2FzZTsKLWltcG9ydCBhbmRyb2lkLm9zLlBvd2VyTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKLQogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogCiAvKioKQEAgLTEwOSw3ICsxMDksNyBAQAogCiAgICAgLyoqCiAgICAgICogRm9yIHJlZmVyZW5jZSBvbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyB0ZXN0IGV4ZWN1dG9yIHNlZToKLSAgICAgKiAgICAgIGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIKKyAgICAgKiAgICAgIGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lcgogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBTZW5zb3JUZXN0RGV0YWlscyBleGVjdXRlVGVzdHMoKSB7CmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvc2Vuc29ycy9iYXNlL1NlbnNvckN0c1ZlcmlmaWVyVGVzdEFjdGl2aXR5LmphdmEgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvc2Vuc29ycy9iYXNlL1NlbnNvckN0c1ZlcmlmaWVyVGVzdEFjdGl2aXR5LmphdmEKaW5kZXggOGNmMjg3YS4uNDQwMTUzNiAxMDA2NDQKLS0tIGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL3NlbnNvcnMvYmFzZS9TZW5zb3JDdHNWZXJpZmllclRlc3RBY3Rpdml0eS5qYXZhCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9zZW5zb3JzL2Jhc2UvU2Vuc29yQ3RzVmVyaWZpZXJUZXN0QWN0aXZpdHkuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogcGFja2FnZSBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIuc2Vuc29ycy5iYXNlOwogCiBpbXBvcnQgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLnNlbnNvcnMucmVwb3J0aW5nLlNlbnNvclRlc3REZXRhaWxzOworaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5zZW5zb3JzLnJlcG9ydGluZy5TZW5zb3JUZXN0RGV0YWlscy5SZXN1bHRDb2RlOwogCiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jdHMuaGVscGVycy5yZXBvcnRpbmcuSVNlbnNvclRlc3ROb2RlOwogCkBAIC0yNSw2ICsyNiw3IEBACiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiAvKioKQEAgLTU0LDkgKzU2LDI2IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIFNlbnNvclRlc3REZXRhaWxzIGV4ZWN1dGVUZXN0cygpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRPRE86IHVzZSByZXBvcnRpbmcgdG8gbG9nIGluZGl2aWR1YWwgdGVzdCByZXN1bHRzCi0gICAgICAgIGZvciAoTWV0aG9kIHRlc3RNZXRob2QgOiBmaW5kVGVzdE1ldGhvZHMoKSkgeworICAgICAgICBJdGVyYXRvcjxNZXRob2Q+IHRlc3RNZXRob2RJdCA9IGZpbmRUZXN0TWV0aG9kcygpLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlICh0ZXN0TWV0aG9kSXQuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBNZXRob2QgdGVzdE1ldGhvZCA9IHRlc3RNZXRob2RJdC5uZXh0KCk7CisgICAgICAgICAgICBtSXNMYXN0U3VidGVzdCA9ICF0ZXN0TWV0aG9kSXQuaGFzTmV4dCgpOworICAgICAgICAgICAgbVJldHJ5Q291bnQgPSAwOworICAgICAgICAgICAgZ2V0VGVzdExvZ2dlcigpLmxvZ1Rlc3RTdGFydCh0ZXN0TWV0aG9kLmdldE5hbWUoKSk7CiAgICAgICAgICAgICBTZW5zb3JUZXN0RGV0YWlscyB0ZXN0RGV0YWlscyA9IGV4ZWN1dGVUZXN0KHRlc3RNZXRob2QpOwogICAgICAgICAgICAgZ2V0VGVzdExvZ2dlcigpLmxvZ1Rlc3REZXRhaWxzKHRlc3REZXRhaWxzKTsKKyAgICAgICAgICAgIC8vIElmIHRlc3RzIGVuYWJsZSByZXRyeSBhbmQgZ2V0IGZhaWxlZCByZXN1bHQsIHRyaWdnZXIgdGhlIHJldHJ5IHByb2Nlc3MuCisgICAgICAgICAgICB3aGlsZSAobUVuYWJsZVJldHJ5ICYmIHRlc3REZXRhaWxzLmdldFJlc3VsdENvZGUoKS5lcXVhbHMoUmVzdWx0Q29kZS5GQUlMKSkgeworICAgICAgICAgICAgICAgIG1TaG91bGRSZXRyeSA9IHRydWU7CisgICAgICAgICAgICAgICAgd2FpdEZvclVzZXJUb1JldHJ5KCk7CisgICAgICAgICAgICAgICAgaWYgKCFtU2hvdWxkUmV0cnkpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1UZXN0RmFpbGVkQ291bnRlci0tOworICAgICAgICAgICAgICAgIHRlc3REZXRhaWxzID0gZXhlY3V0ZVRlc3QodGVzdE1ldGhvZCk7CisgICAgICAgICAgICAgICAgZ2V0VGVzdExvZ2dlcigpLmxvZ1Rlc3REZXRhaWxzKHRlc3REZXRhaWxzKTsKKyAgICAgICAgICAgICAgICBtUmV0cnlDb3VudCsrOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBuZXcgU2Vuc29yVGVzdERldGFpbHMoCiAgICAgICAgICAgICAgICAgZ2V0QXBwbGljYXRpb25Db250ZXh0KCksCkBAIC05MCw3ICsxMDksNiBAQAogCiAgICAgICAgIFNlbnNvclRlc3REZXRhaWxzIHRlc3REZXRhaWxzOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgZ2V0VGVzdExvZ2dlcigpLmxvZ1Rlc3RTdGFydCh0ZXN0TWV0aG9kTmFtZSk7CiAgICAgICAgICAgICBTdHJpbmcgdGVzdFN1bW1hcnkgPSAoU3RyaW5nKSB0ZXN0TWV0aG9kLmludm9rZSh0aGlzKTsKICAgICAgICAgICAgIHRlc3REZXRhaWxzID0KICAgICAgICAgICAgICAgICAgICAgbmV3IFNlbnNvclRlc3REZXRhaWxzKHRlc3ROYW1lLCBTZW5zb3JUZXN0RGV0YWlscy5SZXN1bHRDb2RlLlBBU1MsIHRlc3RTdW1tYXJ5KTsKZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci9zZW5zb3JzL2hlbHBlcnMvU2Vuc29yRmVhdHVyZXNEZWFjdGl2YXRvci5qYXZhIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL3NlbnNvcnMvaGVscGVycy9TZW5zb3JGZWF0dXJlc0RlYWN0aXZhdG9yLmphdmEKaW5kZXggNTk2NDQ0Zi4uNjBkYzYzMyAxMDA2NDQKLS0tIGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL3NlbnNvcnMvaGVscGVycy9TZW5zb3JGZWF0dXJlc0RlYWN0aXZhdG9yLmphdmEKKysrIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL3NlbnNvcnMvaGVscGVycy9TZW5zb3JGZWF0dXJlc0RlYWN0aXZhdG9yLmphdmEKQEAgLTEzNywyNiArMTM3LDkgQEAKIAogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHJvdGVjdGVkIGludCBnZXRTZXR0aW5nTW9kZShpbnQgZGVmYXVsdFZhbHVlKSB7Ci0gICAgICAgICAgICAvLyBUT0RPOiByZXBsYWNlIHRoZSB1c2Ugb2YgcmVmbGVjdGlvbiB3aXRoIFNldHRpbmdzLlNlY3VyZS5ET1pFX0VOQUJMRUQgd2hlbiB0aGUKLSAgICAgICAgICAgIC8vICAgICAgIHN0YXRpYyBmaWVsZCBpcyBub3QgaGlkZGVuIGFueW1vcmUKLSAgICAgICAgICAgIENsYXNzPD8+IHNlY3VyZVNldHRpbmdzQ2xhc3MgPSBTZXR0aW5ncy5TZWN1cmUuY2xhc3M7Ci0gICAgICAgICAgICBGaWVsZCBkb3plRW5hYmxlZEZpZWxkOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBkb3plRW5hYmxlZEZpZWxkID0gc2VjdXJlU2V0dGluZ3NDbGFzcy5nZXRGaWVsZCgiRE9aRV9FTkFCTEVEIik7Ci0gICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIHNldHRpbmdOYW1lOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBzZXR0aW5nTmFtZSA9IChTdHJpbmcpIGRvemVFbmFibGVkRmllbGQuZ2V0KG51bGwgLyogb2JqICovKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7Ci0gICAgICAgICAgICB9Ci0KICAgICAgICAgICAgIHJldHVybiBTZXR0aW5ncy5TZWN1cmUuZ2V0SW50KAogICAgICAgICAgICAgICAgICAgICBtU3RhdGVDb250YWluZXIuZ2V0Q29udGVudFJlc29sdmVyKCksCi0gICAgICAgICAgICAgICAgICAgIHNldHRpbmdOYW1lLAorICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuRE9aRV9FTkFCTEVELAogICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUpOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL3NlbnNvcnMvc2l4ZG9mL0FjdGl2aXRpZXMvVGVzdEFjdGl2aXR5LmphdmEgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvc2Vuc29ycy9zaXhkb2YvQWN0aXZpdGllcy9UZXN0QWN0aXZpdHkuamF2YQppbmRleCAxNTdjYTNkLi45Y2E1ZjJjIDEwMDY0NAotLS0gYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvc2Vuc29ycy9zaXhkb2YvQWN0aXZpdGllcy9UZXN0QWN0aXZpdHkuamF2YQorKysgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvc2Vuc29ycy9zaXhkb2YvQWN0aXZpdGllcy9UZXN0QWN0aXZpdHkuamF2YQpAQCAtMzksOCArMzksNiBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5zZW5zb3JzLnNpeGRvZi5VdGlscy5Qb3NlUHJvdmlkZXIuUG9zZVByb3ZpZGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5zZW5zb3JzLnNpeGRvZi5VdGlscy5SZXN1bHRPYmplY3RzLlJlc3VsdE9iamVjdDsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ2RkVGVzdDsKLQogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkFjdGl2aXR5SW5mbzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CkBAIC02NCw3ICs2Miw2IEBACiAgKiBNYWluIEFjdGl2aXR5IGZvciA2RE9GIHRlc3RzIEhhbmRsZXMgY2FsbHMgYmV0d2VlbiBVSSBmcmFnbWVudHMgYW5kIHRoZSBEYXRhIGZyYWdtZW50LiBUaGUKICAqIGNvbnRyb2xsZXIgaW4gdGhlIE1WQyBzdHJ1Y3R1cmUuCiAgKi8KLUBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjMuMTIvQy0xLTEiKQogcHVibGljIGNsYXNzIFRlc3RBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IGltcGxlbWVudHMgQmFzZVVpTGlzdGVuZXIsIEFjY3VyYWN5TGlzdGVuZXIsCiAgICAgICAgIFJvYnVzdG5lc3NMaXN0ZW5lciwgQ29tcGxleE1vdmVtZW50TGlzdGVuZXIgewogCmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvdGVsZWNvbS9DdHNTZWxmTWFuYWdlZENvbm5lY3Rpb25TZXJ2aWNlLmphdmEgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvdGVsZWNvbS9DdHNTZWxmTWFuYWdlZENvbm5lY3Rpb25TZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTljNGY0NAotLS0gL2Rldi9udWxsCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci90ZWxlY29tL0N0c1NlbGZNYW5hZ2VkQ29ubmVjdGlvblNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDExNSBAQAorcGFja2FnZSBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIudGVsZWNvbTsKKworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudGVsZWNvbS5Db25uZWN0aW9uOworaW1wb3J0IGFuZHJvaWQudGVsZWNvbS5Db25uZWN0aW9uUmVxdWVzdDsKK2ltcG9ydCBhbmRyb2lkLnRlbGVjb20uQ29ubmVjdGlvblNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC50ZWxlY29tLlBob25lQWNjb3VudEhhbmRsZTsKK2ltcG9ydCBhbmRyb2lkLnRlbGVjb20uVGVsZWNvbU1hbmFnZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCitwdWJsaWMgY2xhc3MgQ3RzU2VsZk1hbmFnZWRDb25uZWN0aW9uU2VydmljZSBleHRlbmRzIENvbm5lY3Rpb25TZXJ2aWNlIHsKKyAgICBzdGF0aWMgZmluYWwgaW50IFRJTUVPVVRfTUlMTElTID0gMTAwMDA7CisKKyAgICBwcml2YXRlIEN0c0Nvbm5lY3Rpb24uTGlzdGVuZXIgbUNvbm5lY3Rpb25MaXN0ZW5lciA9CisgICAgICAgICAgICBuZXcgQ3RzQ29ubmVjdGlvbi5MaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICB2b2lkIG9uRGVzdHJveWVkKEN0c0Nvbm5lY3Rpb24gY29ubmVjdGlvbikgeworICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Db25uZWN0aW9uc0xvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9ucy5yZW1vdmUoY29ubmVjdGlvbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgQ3RzU2VsZk1hbmFnZWRDb25uZWN0aW9uU2VydmljZSBzQ29ubmVjdGlvblNlcnZpY2U7CisgICAgcHJpdmF0ZSBzdGF0aWMgQ291bnREb3duTGF0Y2ggc0JpbmRpbmdMYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKworICAgIExpc3Q8Q3RzQ29ubmVjdGlvbj4gbUNvbm5lY3Rpb25zID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgT2JqZWN0IG1Db25uZWN0aW9uc0xvY2sgPSBuZXcgT2JqZWN0KCk7CisgICAgQ291bnREb3duTGF0Y2ggbUNvbm5lY3Rpb25MYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKworICAgIHB1YmxpYyBzdGF0aWMgQ3RzU2VsZk1hbmFnZWRDb25uZWN0aW9uU2VydmljZSBnZXRDb25uZWN0aW9uU2VydmljZSgpIHsKKyAgICAgICAgcmV0dXJuIHNDb25uZWN0aW9uU2VydmljZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEN0c1NlbGZNYW5hZ2VkQ29ubmVjdGlvblNlcnZpY2Ugd2FpdEZvckFuZEdldENvbm5lY3Rpb25TZXJ2aWNlKCkgeworICAgICAgICBpZiAoc0Nvbm5lY3Rpb25TZXJ2aWNlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc0JpbmRpbmdMYXRjaC5hd2FpdChUSU1FT1VUX01JTExJUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc0Nvbm5lY3Rpb25TZXJ2aWNlOworICAgIH0KKworICAgIHB1YmxpYyBDdHNTZWxmTWFuYWdlZENvbm5lY3Rpb25TZXJ2aWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHNDb25uZWN0aW9uU2VydmljZSA9IHRoaXM7CisgICAgICAgIGlmIChzQmluZGluZ0xhdGNoICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNCaW5kaW5nTGF0Y2guY291bnREb3duKCk7CisgICAgICAgIH0KKyAgICAgICAgc0JpbmRpbmdMYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxDdHNDb25uZWN0aW9uPiBnZXRDb25uZWN0aW9ucygpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtQ29ubmVjdGlvbnNMb2NrKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxDdHNDb25uZWN0aW9uPihtQ29ubmVjdGlvbnMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIEN0c0Nvbm5lY3Rpb24gd2FpdEZvckFuZEdldENvbm5lY3Rpb24oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQ29ubmVjdGlvbkxhdGNoLmF3YWl0KFRJTUVPVVRfTUlMTElTLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgbUNvbm5lY3Rpb25MYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICAgICAgc3luY2hyb25pemVkIChtQ29ubmVjdGlvbnNMb2NrKSB7CisgICAgICAgICAgICBpZiAobUNvbm5lY3Rpb25zLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbUNvbm5lY3Rpb25zLmdldCgwKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ29ubmVjdGlvbiBvbkNyZWF0ZUluY29taW5nQ29ubmVjdGlvbihQaG9uZUFjY291bnRIYW5kbGUgY29ubmVjdGlvbk1hbmFnZXJQaG9uZUFjY291bnQsCisgICAgICAgICAgICBDb25uZWN0aW9uUmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIHJldHVybiBjcmVhdGVDb25uZWN0aW9uKHJlcXVlc3QsIHRydWUgLyogaXNJbmNvbWluZyAqLyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENvbm5lY3Rpb24gb25DcmVhdGVPdXRnb2luZ0Nvbm5lY3Rpb24oUGhvbmVBY2NvdW50SGFuZGxlIGNvbm5lY3Rpb25NYW5hZ2VyQWNjb3VudCwKKyAgICAgICAgICAgIENvbm5lY3Rpb25SZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZUNvbm5lY3Rpb24ocmVxdWVzdCwgZmFsc2UgLyogaXNJbmNvbWluZyAqLyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBDb25uZWN0aW9uIGNyZWF0ZUNvbm5lY3Rpb24oQ29ubmVjdGlvblJlcXVlc3QgcmVxdWVzdCwgYm9vbGVhbiBpc0luY29taW5nKSB7CisgICAgICAgIGJvb2xlYW4gdXNlQXVkaW9DbGlwID0KKyAgICAgICAgICAgICAgICByZXF1ZXN0LmdldEV4dHJhcygpLmdldEJvb2xlYW4oQ3RzQ29ubmVjdGlvbi5FWFRSQV9QTEFZX0NTX0FVRElPLCBmYWxzZSk7CisgICAgICAgIEN0c0Nvbm5lY3Rpb24gY29ubmVjdGlvbiA9IG5ldyBDdHNDb25uZWN0aW9uKGdldEFwcGxpY2F0aW9uQ29udGV4dCgpLCBpc0luY29taW5nLAorICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uTGlzdGVuZXIsIHVzZUF1ZGlvQ2xpcCk7CisgICAgICAgIGNvbm5lY3Rpb24uc2V0Q29ubmVjdGlvbkNhcGFiaWxpdGllcyhDb25uZWN0aW9uLkNBUEFCSUxJVFlfU1VQUE9SVF9IT0xEIHwKKyAgICAgICAgICAgICAgICBDb25uZWN0aW9uLkNBUEFCSUxJVFlfSE9MRCk7CisgICAgICAgIGNvbm5lY3Rpb24uc2V0QWRkcmVzcyhyZXF1ZXN0LmdldEFkZHJlc3MoKSwgVGVsZWNvbU1hbmFnZXIuUFJFU0VOVEFUSU9OX0FMTE9XRUQpOworICAgICAgICBjb25uZWN0aW9uLnNldEV4dHJhcyhyZXF1ZXN0LmdldEV4dHJhcygpKTsKKworICAgICAgICBCdW5kbGUgbW9yZUV4dHJhcyA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgbW9yZUV4dHJhcy5wdXRQYXJjZWxhYmxlKFRlbGVjb21NYW5hZ2VyLkVYVFJBX1BIT05FX0FDQ09VTlRfSEFORExFLAorICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0QWNjb3VudEhhbmRsZSgpKTsKKyAgICAgICAgY29ubmVjdGlvbi5wdXRFeHRyYXMobW9yZUV4dHJhcyk7CisgICAgICAgIGNvbm5lY3Rpb24uc2V0VmlkZW9TdGF0ZShyZXF1ZXN0LmdldFZpZGVvU3RhdGUoKSk7CisKKyAgICAgICAgc3luY2hyb25pemVkIChtQ29ubmVjdGlvbnNMb2NrKSB7CisgICAgICAgICAgICBtQ29ubmVjdGlvbnMuYWRkKGNvbm5lY3Rpb24pOworICAgICAgICB9CisgICAgICAgIGlmIChtQ29ubmVjdGlvbkxhdGNoICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Db25uZWN0aW9uTGF0Y2guY291bnREb3duKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb247CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL3RlbGVjb20vRW5hYmxlUGhvbmVBY2NvdW50VGVzdEFjdGl2aXR5LmphdmEgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvdGVsZWNvbS9FbmFibGVQaG9uZUFjY291bnRUZXN0QWN0aXZpdHkuamF2YQppbmRleCAwODY2NTI0Li4yYjcyMDFhIDEwMDY0NAotLS0gYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvdGVsZWNvbS9FbmFibGVQaG9uZUFjY291bnRUZXN0QWN0aXZpdHkuamF2YQorKysgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvdGVsZWNvbS9FbmFibGVQaG9uZUFjY291bnRUZXN0QWN0aXZpdHkuamF2YQpAQCAtMjUsMTMgKzI1LDEwIEBACiBpbXBvcnQgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLlBhc3NGYWlsQnV0dG9uczsKIGltcG9ydCBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIuUjsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ2RkVGVzdDsKLQogLyoqCiAgKiBUZXN0cyB0aGF0IGEgbmV3IHtAbGluayBhbmRyb2lkLnRlbGVjb20uQ29ubmVjdGlvblNlcnZpY2V9IGJlIGFkZGVkIGFuZCBpdHMgYXNzb2NpYXRlZAogICoge0BsaW5rIGFuZHJvaWQudGVsZWNvbS5QaG9uZUFjY291bnR9IGVuYWJsZWQgdXNpbmcgdGhlIGNhbGxpbmcgYWNjb3VudHMgc2V0dGluZ3Mgc2NyZWVuLgogICovCi1AQ2RkVGVzdChyZXF1aXJlbWVudD0iMy4yLjMuNS9DLTItMyIpCiBwdWJsaWMgY2xhc3MgRW5hYmxlUGhvbmVBY2NvdW50VGVzdEFjdGl2aXR5IGV4dGVuZHMgUGFzc0ZhaWxCdXR0b25zLkFjdGl2aXR5IHsKIAogICAgIHByaXZhdGUgQnV0dG9uIG1SZWdpc3RlclBob25lQWNjb3VudDsKZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci90ZWxlY29tL1Bob25lQWNjb3VudFV0aWxzLmphdmEgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvdGVsZWNvbS9QaG9uZUFjY291bnRVdGlscy5qYXZhCmluZGV4IDZiMGIzZGEuLmRlZTA5ZDAgMTAwNjQ0Ci0tLSBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci90ZWxlY29tL1Bob25lQWNjb3VudFV0aWxzLmphdmEKKysrIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL3RlbGVjb20vUGhvbmVBY2NvdW50VXRpbHMuamF2YQpAQCAtNjEsOSArNjEsMTAgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1NFTEZfTUFOQUdFRF9QSE9ORV9BQ0NPVU5UMl9MQUJFTCA9ICJDVFNWZXJpZmllcjIiOwogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQaG9uZUFjY291bnRIYW5kbGUgVEVTVF9TRUxGX01BTkFHRURfUEhPTkVfQUNDT1VOVF9IQU5ETEVfMiA9Ci0gICAgICAgICAgICBuZXcgUGhvbmVBY2NvdW50SGFuZGxlKG5ldyBDb21wb25lbnROYW1lKAorICAgICAgICBuZXcgUGhvbmVBY2NvdW50SGFuZGxlKG5ldyBDb21wb25lbnROYW1lKAogICAgICAgICAgICAgICAgICAgICBQYXNzRmFpbEJ1dHRvbnMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgQ3RzQ29ubmVjdGlvblNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpKSwgVEVTVF9TRUxGX01BQU5HRURfUEhPTkVfQUNDT1VOVDJfSUQpOworICAgICAgICAgICAgICAgICAgICBDdHNTZWxmTWFuYWdlZENvbm5lY3Rpb25TZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSksCisgICAgICAgICAgICAgICAgVEVTVF9TRUxGX01BQU5HRURfUEhPTkVfQUNDT1VOVDJfSUQpOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGhvbmVBY2NvdW50IFRFU1RfU0VMRl9NQU5BR0VEX1BIT05FX0FDQ09VTlRfMiA9IG5ldyBQaG9uZUFjY291bnQuQnVpbGRlcigKICAgICAgICAgICAgIFRFU1RfU0VMRl9NQU5BR0VEX1BIT05FX0FDQ09VTlRfSEFORExFXzIsIFRFU1RfU0VMRl9NQU5BR0VEX1BIT05FX0FDQ09VTlQyX0xBQkVMKQogICAgICAgICAgICAgLnNldEFkZHJlc3MoVEVTVF9TRUxGX01BTkFHRURfUEhPTkVfQUNDT1VOVF9BRERSRVNTKQpkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL3RlbGVjb20vU2VsZk1hbmFnZWRJbmNvbWluZ0NhbGxUZXN0QWN0aXZpdHkuamF2YSBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci90ZWxlY29tL1NlbGZNYW5hZ2VkSW5jb21pbmdDYWxsVGVzdEFjdGl2aXR5LmphdmEKaW5kZXggMmIwNjQ0Ni4uZDg5ZTg0ZSAxMDA2NDQKLS0tIGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL3RlbGVjb20vU2VsZk1hbmFnZWRJbmNvbWluZ0NhbGxUZXN0QWN0aXZpdHkuamF2YQorKysgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvdGVsZWNvbS9TZWxmTWFuYWdlZEluY29taW5nQ2FsbFRlc3RBY3Rpdml0eS5qYXZhCkBAIC0xMTcsNiArMTE3LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIGl0IGFjdGl2ZSB0byBzaW11bGF0ZSBhbiBhbnN3ZXIuCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnNldEFjdGl2ZSgpOwogCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmVzIHRoZSBob2xkIGNhcGFiaWxpdHkgb2YgdGhlIHNlbGYtbWFuYWdlZCBjYWxsLCBzbyB0aGF0IHRoZSBmb2xsb3cKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluY29taW5nIGNhbGwgY2FuIHRyaWdnZXIgdGhlIGluY29taW5nIGNhbGwgVVggdGhhdCBhbGxvdyB1c2VyIHRvIGFuc3dlcgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGluY29taW5nIGNhbGwgdG8gZGlzY29ubmVjdCB0aGUgb25nb2luZyBjYWxsLgorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNhcGFiaWxpdGllcyA9IGNvbm5lY3Rpb24uZ2V0Q29ubmVjdGlvbkNhcGFiaWxpdGllcygpOworICAgICAgICAgICAgICAgICAgICAgICAgY2FwYWJpbGl0aWVzICY9IH5Db25uZWN0aW9uLkNBUEFCSUxJVFlfSE9MRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uc2V0Q29ubmVjdGlvbkNhcGFiaWxpdGllcyhjYXBhYmlsaXRpZXMpOworCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQbGFjZSB0aGUgc2Vjb25kIGNhbGwuIEl0IHNob3VsZCB0cmlnZ2VyIHRoZSBpbmNvbWluZyBjYWxsIFVYLgogICAgICAgICAgICAgICAgICAgICAgICAgQnVuZGxlIGV4dHJhczIgPSBuZXcgQnVuZGxlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYXMyLnB1dFBhcmNlbGFibGUoVGVsZWNvbU1hbmFnZXIuRVhUUkFfSU5DT01JTkdfQ0FMTF9BRERSRVNTLApAQCAtMTI3LDcgKzEzNCw3IEBACiAKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICB0OworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKQEAgLTE0OSwzMSArMTU2LDY0IEBACiAgICAgICAgIG1TdGVwM1N0YXR1cyA9IHZpZXcuZmluZFZpZXdCeUlkKFIuaWQuc3RlcF8zX3N0YXR1cyk7CiAgICAgICAgIG1Db25maXJtID0gdmlldy5maW5kVmlld0J5SWQoUi5pZC50ZWxlY29tX2luY29taW5nX3NlbGZfbWdkX2NvbmZpcm1fYW5zd2VyX2J1dHRvbik7CiAgICAgICAgIG1Db25maXJtLnNldE9uQ2xpY2tMaXN0ZW5lcih2IC0+IHsKLSAgICAgICAgICAgIEN0c0Nvbm5lY3Rpb25TZXJ2aWNlIGN0c0Nvbm5lY3Rpb25TZXJ2aWNlID0gQ3RzQ29ubmVjdGlvblNlcnZpY2UuZ2V0Q29ubmVjdGlvblNlcnZpY2UoKTsKLSAgICAgICAgICAgIGlmIChjdHNDb25uZWN0aW9uU2VydmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVN0ZXAzU3RhdHVzLnNldEltYWdlUmVzb3VyY2UoUi5kcmF3YWJsZS5mc19lcnJvcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTGlzdDxDdHNDb25uZWN0aW9uPiBjb25uZWN0aW9ucyA9IGN0c0Nvbm5lY3Rpb25TZXJ2aWNlLmdldENvbm5lY3Rpb25zKCk7Ci0gICAgICAgICAgICBpZiAoY29ubmVjdGlvbnMuc2l6ZSgpICE9IDEpIHsKLSAgICAgICAgICAgICAgICBtU3RlcDNTdGF0dXMuc2V0SW1hZ2VSZXNvdXJjZShSLmRyYXdhYmxlLmZzX2Vycm9yKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEN0c1NlbGZNYW5hZ2VkQ29ubmVjdGlvblNlcnZpY2UgY3RzU2VsZkNvbm5TdnIgPQorICAgICAgICAgICAgICAgICAgICAgICAgQ3RzU2VsZk1hbmFnZWRDb25uZWN0aW9uU2VydmljZS53YWl0Rm9yQW5kR2V0Q29ubmVjdGlvblNlcnZpY2UoKTsKKyAgICAgICAgICAgICAgICBpZiAoY3RzU2VsZkNvbm5TdnIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtU3RlcDNTdGF0dXMuc2V0SW1hZ2VSZXNvdXJjZShSLmRyYXdhYmxlLmZzX2Vycm9yKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBMaXN0PEN0c0Nvbm5lY3Rpb24+IGNvbm5lY3Rpb25zID0gY3RzU2VsZkNvbm5TdnIuZ2V0Q29ubmVjdGlvbnMoKTsKKyAgICAgICAgICAgICAgICBpZiAoY29ubmVjdGlvbnMuc2l6ZSgpICE9IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgbVN0ZXAzU3RhdHVzLnNldEltYWdlUmVzb3VyY2UoUi5kcmF3YWJsZS5mc19lcnJvcik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChjb25uZWN0aW9ucy5nZXQoMCkuZ2V0U3RhdGUoKSA9PSBDb25uZWN0aW9uLlNUQVRFX0FDVElWRSkgewotICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25zCi0gICAgICAgICAgICAgICAgICAgICAgICAuc3RyZWFtKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKChjKSAtPiBjLm9uRGlzY29ubmVjdCgpKTsKLSAgICAgICAgICAgICAgICBtU3RlcDNTdGF0dXMuc2V0SW1hZ2VSZXNvdXJjZShSLmRyYXdhYmxlLmZzX2dvb2QpOwotICAgICAgICAgICAgICAgIGdldFBhc3NCdXR0b24oKS5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtU3RlcDNTdGF0dXMuc2V0SW1hZ2VSZXNvdXJjZShSLmRyYXdhYmxlLmZzX2Vycm9yKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY29ubmVjdGlvbnMuZ2V0KDApLmdldFN0YXRlKCkgPT0gQ29ubmVjdGlvbi5TVEFURV9BQ1RJVkUpIHsKKyAgICAgICAgICAgICAgICAgICAgbVN0ZXAzU3RhdHVzLnNldEltYWdlUmVzb3VyY2UoUi5kcmF3YWJsZS5mc19nb29kKTsKKyAgICAgICAgICAgICAgICAgICAgZ2V0UGFzc0J1dHRvbigpLnNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbVN0ZXAzU3RhdHVzLnNldEltYWdlUmVzb3VyY2UoUi5kcmF3YWJsZS5mc19lcnJvcik7CisgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBQaG9uZUFjY291bnRVdGlscy51blJlZ2lzdGVyVGVzdFNlbGZNYW5hZ2VkUGhvbmVBY2NvdW50KHRoaXMpOworICAgICAgICAgICAgICAgIC8vIFRoZSBzZWxmLW1hbmFnZWQgY29ubmVjdGlvbiBzZXJ2aWNlIHNob3VsZCBiZSBkaXNjb25uZWN0ZWQsIGJlY2F1c2UgYWxsIG9mIHRoZQorICAgICAgICAgICAgICAgIC8vIHNlbGYtbWFuYWdlZCBjb25uZWN0aW9ucyBhcmUgZGlzY29ubmVjdGVkLgorICAgICAgICAgICAgICAgIGlmIChDdHNDb25uZWN0aW9uU2VydmljZS5nZXRDb25uZWN0aW9uU2VydmljZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbVN0ZXAzU3RhdHVzLnNldEltYWdlUmVzb3VyY2UoUi5kcmF3YWJsZS5mc19lcnJvcik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtQ29uZmlybS5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgLy8gSWYgc29tZSBzdGVwIGZhaWxzLCBtYWtlIHN1cmUgd2UgY2xlYW51cCBhbnkgbGluZ2VyaW5nIGNvbm5lY3Rpb25zLgorICAgICAgICAgICAgICAgIGNsZWFudXBDb25uZWN0aW9uU2VydmljZXMoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfSk7CiAKICAgICAgICAgbVNob3dVaS5zZXRFbmFibGVkKGZhbHNlKTsKICAgICAgICAgbUNvbmZpcm0uc2V0RW5hYmxlZChmYWxzZSk7CiAgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNsZWFudXBDb25uZWN0aW9uU2VydmljZXMoKSB7CisgICAgICAgIEN0c1NlbGZNYW5hZ2VkQ29ubmVjdGlvblNlcnZpY2UgY3RzU2VsZkNvbm5TdnIgPQorICAgICAgICAgICAgICAgIEN0c1NlbGZNYW5hZ2VkQ29ubmVjdGlvblNlcnZpY2UuZ2V0Q29ubmVjdGlvblNlcnZpY2UoKTsKKyAgICAgICAgaWYgKGN0c1NlbGZDb25uU3ZyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGN0c1NlbGZDb25uU3ZyLmdldENvbm5lY3Rpb25zKCkKKyAgICAgICAgICAgICAgICAgICAgLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKChjKSAtPiB7CisgICAgICAgICAgICAgICAgICAgICAgICBjLm9uRGlzY29ubmVjdCgpOworICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIEN0c0Nvbm5lY3Rpb25TZXJ2aWNlIGN0c0Nvbm5lY3Rpb25TZXJ2aWNlID0KKyAgICAgICAgICAgICAgICBDdHNDb25uZWN0aW9uU2VydmljZS5nZXRDb25uZWN0aW9uU2VydmljZSgpOworICAgICAgICBpZiAoY3RzQ29ubmVjdGlvblNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgY3RzQ29ubmVjdGlvblNlcnZpY2UuZ2V0Q29ubmVjdGlvbnMoKQorICAgICAgICAgICAgICAgICAgICAuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAgICAgLmZvckVhY2goKGMpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMub25EaXNjb25uZWN0KCk7CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgICAgIFBob25lQWNjb3VudFV0aWxzLnVuUmVnaXN0ZXJUZXN0U2VsZk1hbmFnZWRQaG9uZUFjY291bnQodGhpcyk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL3VzYi9VdGlsLmphdmEgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvdXNiL1V0aWwuamF2YQppbmRleCA1YmUxNzkyLi5iOTQ0YjUxIDEwMDY0NAotLS0gYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvdXNiL1V0aWwuamF2YQorKysgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvdXNiL1V0aWwuamF2YQpAQCAtMTYsNyArMTYsNyBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci51c2I7CiAKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Ob25OdWxsOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTm9uTnVsbDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCiAvKioKZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci91c2IvYWNjZXNzb3J5L0FjY2Vzc29yeUF0dGFjaG1lbnRIYW5kbGVyLmphdmEgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvdXNiL2FjY2Vzc29yeS9BY2Nlc3NvcnlBdHRhY2htZW50SGFuZGxlci5qYXZhCmluZGV4IGY1ZTBmZWYuLjI0ZDNkZDMgMTAwNjQ0Ci0tLSBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci91c2IvYWNjZXNzb3J5L0FjY2Vzc29yeUF0dGFjaG1lbnRIYW5kbGVyLmphdmEKKysrIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL3VzYi9hY2Nlc3NvcnkvQWNjZXNzb3J5QXR0YWNobWVudEhhbmRsZXIuamF2YQpAQCAtMjAsOCArMjAsOCBAQAogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudXNiLlVzYkFjY2Vzc29yeTsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLnVzYi5Vc2JNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uTnVsbGFibGU7CitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5Ob25OdWxsOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTnVsbGFibGU7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogCmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvdXNiL2FjY2Vzc29yeS9Vc2JBY2Nlc3NvcnlUZXN0QWN0aXZpdHkuamF2YSBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci91c2IvYWNjZXNzb3J5L1VzYkFjY2Vzc29yeVRlc3RBY3Rpdml0eS5qYXZhCmluZGV4IDlmNmQ3MmIuLmMxNTAxMzIgMTAwNjQ0Ci0tLSBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci91c2IvYWNjZXNzb3J5L1VzYkFjY2Vzc29yeVRlc3RBY3Rpdml0eS5qYXZhCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci91c2IvYWNjZXNzb3J5L1VzYkFjY2Vzc29yeVRlc3RBY3Rpdml0eS5qYXZhCkBAIC0yOSw4ICsyOSw4IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uTnVsbGFibGU7CitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5Ob25OdWxsOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTnVsbGFibGU7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5Qcm9ncmVzc0JhcjsKZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci91c2IvZGV2aWNlL1VzYkRldmljZVRlc3RBY3Rpdml0eS5qYXZhIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL3VzYi9kZXZpY2UvVXNiRGV2aWNlVGVzdEFjdGl2aXR5LmphdmEKaW5kZXggOWRjNjkwYi4uZjQ1NDJkYiAxMDA2NDQKLS0tIGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL3VzYi9kZXZpY2UvVXNiRGV2aWNlVGVzdEFjdGl2aXR5LmphdmEKKysrIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL3VzYi9kZXZpY2UvVXNiRGV2aWNlVGVzdEFjdGl2aXR5LmphdmEKQEAgLTI1LDggKzI1LDYgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFNhbWU7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc3VtZS5hc3N1bWVOb3ROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzdW1lLmFzc3VtZVRydWU7CiAKIGltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKQEAgLTQyLDIxICs0MCwxOSBAQAogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudXNiLlVzYk1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS51c2IuVXNiUmVxdWVzdDsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk51bGxhYmxlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BcnJheVNldDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5QYWlyOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlByb2dyZXNzQmFyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRvYXN0OworCitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5Ob25OdWxsOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTnVsbGFibGU7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIuUGFzc0ZhaWxCdXR0b25zOwogaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5SOwogCi1pbXBvcnQgb3JnLmp1bml0LkFzc3VtcHRpb25WaW9sYXRlZEV4Y2VwdGlvbjsKLQogaW1wb3J0IGphdmEubmlvLkJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS5uaW8uQ2hhckJ1ZmZlcjsKQEAgLTc2LDggKzcyLDcgQEAKICAgICAgICAgICAgICJjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIudXNiLmRldmljZS5VU0JfUEVSTUlTU0lPTiI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSBVc2JEZXZpY2VUZXN0QWN0aXZpdHkuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUSU1FT1VUX01JTExJUyA9IDUwMDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9CVUZGRVJfU0laRSA9IDE2Mzg0OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPVkVSU0laRURfQlVGRkVSX1NJWkUgPSBNQVhfQlVGRkVSX1NJWkUgKyAxMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExBUkdFX0JVRkZFUl9TSVpFID0gMTI0NjE5OwogCiAgICAgcHJpdmF0ZSBVc2JNYW5hZ2VyIG1Vc2JNYW5hZ2VyOwogICAgIHByaXZhdGUgQnJvYWRjYXN0UmVjZWl2ZXIgbVVzYkRldmljZUNvbm5lY3Rpb25SZWNlaXZlcjsKQEAgLTEwMiwxOSArOTcsOCBAQAogICAgICAqCiAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgYSB6ZXJvIHNpemVkIHRyYW5zZmVyIGlzIGV4cGVjdGVkCiAgICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzWmVyb1RyYW5zZmVyRXhwZWN0ZWQoaW50IHRyYW5zZmVyU2l6ZSkgewotICAgICAgICBpZiAobURvZXNDb21wYW5pb25aZXJvVGVybWluYXRlKSB7Ci0gICAgICAgICAgICBpZiAodHJhbnNmZXJTaXplICUgMTAyNCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRyYW5zZmVyU2l6ZSAlIDggIT0gMCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBcyB0aGUgdHJhbnNmZXIgc3BlZWQgaXMgdW5rbm93biB0aGUgY29kZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiaGFzIHRvIHdvcmsgZm9yIGFsbCBzcGVlZHMiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNaZXJvVHJhbnNmZXJFeHBlY3RlZChpbnQgdHJhbnNmZXJTaXplLCBATm9uTnVsbCBVc2JFbmRwb2ludCBlcCkgeworICAgICAgICByZXR1cm4gbURvZXNDb21wYW5pb25aZXJvVGVybWluYXRlICYmIHRyYW5zZmVyU2l6ZSAlIGVwLmdldE1heFBhY2tldFNpemUoKSA9PSAwOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMzA4LDcgKzI5Miw3IEBACiAKICAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMoc2VudEJ1ZmZlciwgcmVjZWl2ZWRCdWZmZXIpOwogCi0gICAgICAgIGlmIChpc1plcm9UcmFuc2ZlckV4cGVjdGVkKHNpemUpKSB7CisgICAgICAgIGlmIChpc1plcm9UcmFuc2ZlckV4cGVjdGVkKHNpemUsIGluKSkgewogICAgICAgICAgICAgcmVjZWl2ZVplcm9TaXplZFRyYW5zZmVyKGNvbm5lY3Rpb24sIGluKTsKICAgICAgICAgfQogICAgIH0KQEAgLTM0Miw3NiArMzI2LDQ3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoaXNaZXJvVHJhbnNmZXJFeHBlY3RlZChzaXplKSkgeworICAgICAgICBpZiAoaXNaZXJvVHJhbnNmZXJFeHBlY3RlZChzaXplLCBpbikpIHsKICAgICAgICAgICAgIHJlY2VpdmVaZXJvU2l6ZWRUcmFuc2Zlcihjb25uZWN0aW9uLCBpbik7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZW5kIGEgdHJhbnNmZXIgdGhhdCBpcyBsYXJnZXIgdGhhbiBNQVhfQlVGRkVSX1NJWkUuCisgICAgICogU2VuZCBhIHRyYW5zZmVyIHRoYXQgaXMgbGFyZ2UuCiAgICAgICoKICAgICAgKiBAcGFyYW0gY29ubmVjdGlvbiBDb25uZWN0aW9uIHRvIHRoZSBVU0IgZGV2aWNlCiAgICAgICogQHBhcmFtIGluICAgICAgICAgVGhlIGluIGVuZHBvaW50CiAgICAgICogQHBhcmFtIG91dCAgICAgICAgVGhlIG91dCBlbmRwb2ludAogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBlY2hvT3ZlcnNpemVkQnVsa1RyYW5zZmVyKEBOb25OdWxsIFVzYkRldmljZUNvbm5lY3Rpb24gY29ubmVjdGlvbiwKKyAgICBwcml2YXRlIHZvaWQgZWNob0xhcmdlQnVsa1RyYW5zZmVyKEBOb25OdWxsIFVzYkRldmljZUNvbm5lY3Rpb24gY29ubmVjdGlvbiwKICAgICAgICAgICAgIEBOb25OdWxsIFVzYkVuZHBvaW50IGluLCBATm9uTnVsbCBVc2JFbmRwb2ludCBvdXQpIHsKLSAgICAgICAgaW50IHRvdGFsU2l6ZSA9IE9WRVJTSVpFRF9CVUZGRVJfU0laRTsKKyAgICAgICAgaW50IHRvdGFsU2l6ZSA9IExBUkdFX0JVRkZFUl9TSVpFOwogICAgICAgICBieXRlW10gc2VudEJ1ZmZlciA9IG5ldyBieXRlW3RvdGFsU2l6ZV07CiAgICAgICAgIFJhbmRvbSByID0gbmV3IFJhbmRvbSgpOwogICAgICAgICByLm5leHRCeXRlcyhzZW50QnVmZmVyKTsKIAogICAgICAgICBpbnQgbnVtU2VudCA9IGNvbm5lY3Rpb24uYnVsa1RyYW5zZmVyKG91dCwgc2VudEJ1ZmZlciwgc2VudEJ1ZmZlci5sZW5ndGgsIDApOwogCi0gICAgICAgIC8vIEJ1ZmZlciB3aWxsIG9ubHkgYmUgcGFydGlhbGx5IHRyYW5zZmVycmVkCi0gICAgICAgIGFzc2VydEVxdWFscyhNQVhfQlVGRkVSX1NJWkUsIG51bVNlbnQpOworICAgICAgICAvLyBCdWZmZXIgd2lsbCBiZSBjb21wbGV0ZWx5IHRyYW5zZmVycmVkCisgICAgICAgIGFzc2VydEVxdWFscyhMQVJHRV9CVUZGRVJfU0laRSwgbnVtU2VudCk7CiAKICAgICAgICAgYnl0ZVtdIHJlY2VpdmVkQnVmZmVyID0gbmV3IGJ5dGVbdG90YWxTaXplXTsKICAgICAgICAgaW50IG51bVJlY2VpdmVkID0gY29ubmVjdGlvbi5idWxrVHJhbnNmZXIoaW4sIHJlY2VpdmVkQnVmZmVyLCByZWNlaXZlZEJ1ZmZlci5sZW5ndGgsCiAgICAgICAgICAgICAgICAgVElNRU9VVF9NSUxMSVMpOwogCi0gICAgICAgIC8vIEFsbCBiZXlvbmQgTUFYX0JVRkZFUl9TSVpFIHdhcyBub3Qgc2VuZCwgaGVuY2UgaXQgd2lsbCBub3QgYmUgZWNob2VkIGJhY2sKLSAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9CVUZGRVJfU0laRSwgbnVtUmVjZWl2ZWQpOworICAgICAgICAvLyBBbGwgb2YgdGhlIGJ1ZmZlciB3aWxsIGJlIGVjaG9lZCBiYWNrCisgICAgICAgIGFzc2VydEVxdWFscyhMQVJHRV9CVUZGRVJfU0laRSwgbnVtUmVjZWl2ZWQpOwogCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG90YWxTaXplOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChpIDwgTUFYX0JVRkZFUl9TSVpFKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNlbnRCdWZmZXJbaV0sIHJlY2VpdmVkQnVmZmVyW2ldKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHJlY2VpdmVkQnVmZmVyW2ldKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhzZW50QnVmZmVyW2ldLCByZWNlaXZlZEJ1ZmZlcltpXSk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAobURvZXNDb21wYW5pb25aZXJvVGVybWluYXRlKSB7CisgICAgICAgIGlmIChpc1plcm9UcmFuc2ZlckV4cGVjdGVkKExBUkdFX0JVRkZFUl9TSVpFLCBpbikpIHsKICAgICAgICAgICAgIHJlY2VpdmVaZXJvU2l6ZWRUcmFuc2Zlcihjb25uZWN0aW9uLCBpbik7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWNlaXZlIGEgdHJhbnNmZXIgdGhhdCBpcyBsYXJnZXIgdGhhbiBNQVhfQlVGRkVSX1NJWkUKLSAgICAgKgotICAgICAqIEBwYXJhbSBjb25uZWN0aW9uIENvbm5lY3Rpb24gdG8gdGhlIFVTQiBkZXZpY2UKLSAgICAgKiBAcGFyYW0gaW4gICAgICAgICBUaGUgaW4gZW5kcG9pbnQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcmVjZWl2ZU92ZXJzaXplZEJ1bGtUcmFuc2ZlcihATm9uTnVsbCBVc2JEZXZpY2VDb25uZWN0aW9uIGNvbm5lY3Rpb24sCi0gICAgICAgICAgICBATm9uTnVsbCBVc2JFbmRwb2ludCBpbikgewotICAgICAgICAvLyBCdWZmZXIgd2lsbCBiZSByZWNlaXZlZCBhcyB0d28gdHJhbnNmZXJzCi0gICAgICAgIGJ5dGVbXSByZWNlaXZlZEJ1ZmZlcjEgPSBuZXcgYnl0ZVtPVkVSU0laRURfQlVGRkVSX1NJWkVdOwotICAgICAgICBpbnQgbnVtUmVjZWl2ZWQgPSBjb25uZWN0aW9uLmJ1bGtUcmFuc2ZlcihpbiwgcmVjZWl2ZWRCdWZmZXIxLCByZWNlaXZlZEJ1ZmZlcjEubGVuZ3RoLAotICAgICAgICAgICAgICAgIFRJTUVPVVRfTUlMTElTKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9CVUZGRVJfU0laRSwgbnVtUmVjZWl2ZWQpOwotCi0gICAgICAgIGJ5dGVbXSByZWNlaXZlZEJ1ZmZlcjIgPSBuZXcgYnl0ZVtPVkVSU0laRURfQlVGRkVSX1NJWkUgLSBNQVhfQlVGRkVSX1NJWkVdOwotICAgICAgICBudW1SZWNlaXZlZCA9IGNvbm5lY3Rpb24uYnVsa1RyYW5zZmVyKGluLCByZWNlaXZlZEJ1ZmZlcjIsIHJlY2VpdmVkQnVmZmVyMi5sZW5ndGgsCi0gICAgICAgICAgICAgICAgVElNRU9VVF9NSUxMSVMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoT1ZFUlNJWkVEX0JVRkZFUl9TSVpFIC0gTUFYX0JVRkZFUl9TSVpFLCBudW1SZWNlaXZlZCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlY2VpdmVkQnVmZmVyMVswXSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCByZWNlaXZlZEJ1ZmZlcjFbTUFYX0JVRkZFUl9TSVpFIC0gMV0pOwotICAgICAgICBhc3NlcnRFcXVhbHMoMywgcmVjZWl2ZWRCdWZmZXIyWzBdKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIHJlY2VpdmVkQnVmZmVyMltPVkVSU0laRURfQlVGRkVSX1NJWkUgLSBNQVhfQlVGRkVSX1NJWkUgLSAxXSk7Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICogUmVjZWl2ZSBkYXRhIGJ1dCBzdXBwbHkgYW4gZW1wdHkgYnVmZmVyLiBUaGlzIGNhdXNlcyB0aGUgdGhyZWFkIHRvIGJsb2NrIHVudGlsIGFueSBkYXRhIGlzCiAgICAgICogc2VudC4gVGhlIHplcm8tc2l6ZWQgcmVjZWl2ZS10cmFuc2ZlciBqdXN0IHJldHVybnMgd2l0aG91dCBkYXRhIGFuZCB0aGUgbmV4dCB0cmFuc2ZlciBjYW4KICAgICAgKiBhY3R1YWxseSByZWFkIHRoZSBkYXRhLgpAQCAtNTk3LDcgKzU1Miw3IEBACiAgICAgICAgICAgICAvLyBTaG91bGQgd2UgaGF2ZSBnb3R0ZW4gYSBmYWlsdXJlPwogICAgICAgICAgICAgaWYgKGZpbmlzaGVkID09IHJlY2VpdmUpIHsKICAgICAgICAgICAgICAgICAvLyBXZSBzaG91bGQgaGF2ZSBnb3R0ZW4gYW4gZXhjZXB0aW9uIGlmIHNpemUgPiBsaW1pdAotICAgICAgICAgICAgICAgIGFzc3VtZVRydWUoYnVmZmVyUmVjZWl2ZWRTbGljZWQubGltaXQoKSA+PSBzaXplKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGJ1ZmZlclJlY2VpdmVkU2xpY2VkLmxpbWl0KCkgPj0gc2l6ZSk7CiAKICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoc2l6ZSwgYnVmZmVyUmVjZWl2ZWRTbGljZWQucG9zaXRpb24oKSk7CiAKQEAgLTYxNSw3ICs1NzAsNyBAQAogICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhzaXplLCBidWZmZXJTZW50U2xpY2VkLnBvc2l0aW9uKCkpOwogCiAgICAgICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIGhhdmUgZ290dGVuIGFuIGV4Y2VwdGlvbiBpZiBzaXplID4gbGltaXQKLSAgICAgICAgICAgICAgICBhc3N1bWVUcnVlKGJ1ZmZlclNlbnRTbGljZWQubGltaXQoKSA+PSBzaXplKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGJ1ZmZlclNlbnRTbGljZWQubGltaXQoKSA+PSBzaXplKTsKICAgICAgICAgICAgICAgICBhc3NlcnRTYW1lKHNlbnQsIGZpbmlzaGVkKTsKICAgICAgICAgICAgICAgICBhc3NlcnRTYW1lKHNlbnRDbGllbnREYXRhLCBmaW5pc2hlZC5nZXRDbGllbnREYXRhKCkpOwogICAgICAgICAgICAgICAgIGFzc2VydFNhbWUob3V0LCBmaW5pc2hlZC5nZXRFbmRwb2ludCgpKTsKQEAgLTYyMyw3ICs1NzgsNyBAQAogICAgICAgICAgICAgZmluaXNoZWQuY2xvc2UoKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChpc1plcm9UcmFuc2ZlckV4cGVjdGVkKHNpemUpKSB7CisgICAgICAgIGlmIChpc1plcm9UcmFuc2ZlckV4cGVjdGVkKHNpemUsIGluKSkgewogICAgICAgICAgICAgcmVjZWl2ZVplcm9TaXplUmVxdWVzdExlZ2FjeShjb25uZWN0aW9uLCBpbik7CiAgICAgICAgIH0KICAgICB9CkBAIC03NDcsNyArNzAyLDcgQEAKICAgICAgICAgICAgIGZpbmlzaGVkLmNsb3NlKCk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoaXNaZXJvVHJhbnNmZXJFeHBlY3RlZChzbGljZVN0YXJ0ICsgbGltaXRJblNsaWNlIC0gKHNsaWNlU3RhcnQgKyBwb3NpdGlvbkluU2xpY2UpKSkgeworICAgICAgICBpZiAoaXNaZXJvVHJhbnNmZXJFeHBlY3RlZChzbGljZVN0YXJ0ICsgbGltaXRJblNsaWNlIC0gKHNsaWNlU3RhcnQgKyBwb3NpdGlvbkluU2xpY2UpLCBpbikpIHsKICAgICAgICAgICAgIHJlY2VpdmVaZXJvU2l6ZVJlcXVlc3QoY29ubmVjdGlvbiwgaW4pOwogICAgICAgICB9CiAgICAgfQpAQCAtNzg3LDEwICs3NDIsMTAgQEAKICAgICAgKiBAcGFyYW0gaW4gICAgICAgICAgICAgIFRoZSBlbmRwb2ludCB0byByZWNlaXZlIHJlcXVlc3RzIGZyb20KICAgICAgKiBAcGFyYW0gb3V0ICAgICAgICAgICAgIFRoZSBlbmRwb2ludCB0byBzZW5kIHJlcXVlc3RzIHRvCiAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGVjaG9PdmVyc2l6ZWRVc2JSZXF1ZXN0TGVnYWN5KEBOb25OdWxsIFVzYkRldmljZUNvbm5lY3Rpb24gY29ubmVjdGlvbiwKKyAgICBwcml2YXRlIHZvaWQgZWNob0xhcmdlVXNiUmVxdWVzdExlZ2FjeShATm9uTnVsbCBVc2JEZXZpY2VDb25uZWN0aW9uIGNvbm5lY3Rpb24sCiAgICAgICAgICAgICBATm9uTnVsbCBVc2JFbmRwb2ludCBpbiwgQE5vbk51bGwgVXNiRW5kcG9pbnQgb3V0KSB7CiAgICAgICAgIFJhbmRvbSByYW5kb20gPSBuZXcgUmFuZG9tKCk7Ci0gICAgICAgIGludCB0b3RhbFNpemUgPSBPVkVSU0laRURfQlVGRkVSX1NJWkU7CisgICAgICAgIGludCB0b3RhbFNpemUgPSBMQVJHRV9CVUZGRVJfU0laRTsKIAogICAgICAgICBVc2JSZXF1ZXN0IHNlbnQgPSBuZXcgVXNiUmVxdWVzdCgpOwogICAgICAgICBib29sZWFuIGlzSW5pdGVkID0gc2VudC5pbml0aWFsaXplKGNvbm5lY3Rpb24sIG91dCk7CkBAIC04MTUsMTMgKzc3MCwxMCBAQAogICAgICAgICBmb3IgKGludCByZXF1ZXN0TnVtID0gMDsgcmVxdWVzdE51bSA8IDI7IHJlcXVlc3ROdW0rKykgewogICAgICAgICAgICAgVXNiUmVxdWVzdCBmaW5pc2hlZCA9IGNvbm5lY3Rpb24ucmVxdWVzdFdhaXQoKTsKICAgICAgICAgICAgIGlmIChmaW5pc2hlZCA9PSByZWNlaXZlKSB7Ci0gICAgICAgICAgICAgICAgLy8gc2l6ZSBiZXlvbmQgTUFYX0JVRkZFUl9TSVpFIGlzIGlnbm9yZWQKKyAgICAgICAgICAgICAgICAvLyBFbnRpcmUgYnVmZmVyIGlzIHJlY2VpdmVkCisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJ1ZmZlclJlY2VpdmVkLnBvc2l0aW9uKCksIHRvdGFsU2l6ZSk7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b3RhbFNpemU7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IE1BWF9CVUZGRVJfU0laRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNlbnRCeXRlc1tpXSwgcmVjZWl2ZWRCeXRlc1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcmVjZWl2ZWRCeXRlc1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNlbnRCeXRlc1tpXSwgcmVjZWl2ZWRCeXRlc1tpXSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBhc3NlcnRTYW1lKHNlbnQsIGZpbmlzaGVkKTsKQEAgLTgyOSw4ICs3ODEsOCBAQAogICAgICAgICAgICAgZmluaXNoZWQuY2xvc2UoKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChtRG9lc0NvbXBhbmlvblplcm9UZXJtaW5hdGUpIHsKLSAgICAgICAgICAgIHJlY2VpdmVaZXJvU2l6ZVJlcXVlc3RMZWdhY3koY29ubmVjdGlvbiwgaW4pOworICAgICAgICBpZiAoaXNaZXJvVHJhbnNmZXJFeHBlY3RlZChMQVJHRV9CVUZGRVJfU0laRSwgaW4pKSB7CisgICAgICAgICAgICByZWNlaXZlWmVyb1NpemVkVHJhbnNmZXIoY29ubmVjdGlvbiwgaW4pOwogICAgICAgICB9CiAgICAgfQogCkBAIC04OTgsNyArODUwLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGJvb2xlYW4gaXNRdWV1ZWQgPSBzZW50LnF1ZXVlKGJ1ZmZlciwgMCk7Ci0gICAgICAgIGFzc3VtZVRydWUoaXNRdWV1ZWQpOworICAgICAgICBhc3NlcnRUcnVlKGlzUXVldWVkKTsKICAgICAgICAgVXNiUmVxdWVzdCBmaW5pc2hlZCA9IGNvbm5lY3Rpb24ucmVxdWVzdFdhaXQoKTsKICAgICAgICAgYXNzZXJ0U2FtZShmaW5pc2hlZCwgc2VudCk7CiAgICAgICAgIGZpbmlzaGVkLmNsb3NlKCk7CkBAIC05MjUsNyArODc3LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGJvb2xlYW4gaXNRdWV1ZWQgPSBzZW50LnF1ZXVlKGJ1ZmZlcik7Ci0gICAgICAgIGFzc3VtZVRydWUoaXNRdWV1ZWQpOworICAgICAgICBhc3NlcnRUcnVlKGlzUXVldWVkKTsKICAgICAgICAgVXNiUmVxdWVzdCBmaW5pc2hlZCA9IGNvbm5lY3Rpb24ucmVxdWVzdFdhaXQoKTsKICAgICAgICAgYXNzZXJ0U2FtZShmaW5pc2hlZCwgc2VudCk7CiAgICAgICAgIGZpbmlzaGVkLmNsb3NlKCk7CkBAIC05NDQsNyArODk2LDcgQEAKICAgICAgICAgYXNzZXJ0VHJ1ZShpc0luaXRlZCk7CiAKICAgICAgICAgYm9vbGVhbiBpc1F1ZXVlZCA9IHNlbnQucXVldWUobnVsbCk7Ci0gICAgICAgIGFzc3VtZVRydWUoaXNRdWV1ZWQpOworICAgICAgICBhc3NlcnRUcnVlKGlzUXVldWVkKTsKICAgICAgICAgVXNiUmVxdWVzdCBmaW5pc2hlZCA9IGNvbm5lY3Rpb24ucmVxdWVzdFdhaXQoKTsKICAgICAgICAgYXNzZXJ0U2FtZShmaW5pc2hlZCwgc2VudCk7CiAgICAgICAgIGZpbmlzaGVkLmNsb3NlKCk7CkBAIC05ODEsOSArOTMzLDkgQEAKICAgICAgICAgfQogCiAgICAgICAgIGJvb2xlYW4gaXNRdWV1ZWQgPSB6ZXJvUmVjZWl2ZWQucXVldWUoYnVmZmVyKTsKLSAgICAgICAgYXNzdW1lVHJ1ZShpc1F1ZXVlZCk7CisgICAgICAgIGFzc2VydFRydWUoaXNRdWV1ZWQpOwogICAgICAgICBpc1F1ZXVlZCA9IG9uZVJlY2VpdmVkLnF1ZXVlKGJ1ZmZlcjEpOwotICAgICAgICBhc3N1bWVUcnVlKGlzUXVldWVkKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShpc1F1ZXVlZCk7CiAKICAgICAgICAgLy8gV2UgZXhwZWN0IGJvdGggdG8gYmUgcmV0dXJuZWQgYWZ0ZXIgc29tZSB0aW1lCiAgICAgICAgIEFycmF5TGlzdDxVc2JSZXF1ZXN0PiBmaW5pc2hlZCA9IG5ldyBBcnJheUxpc3Q8PigyKTsKQEAgLTk5NSw4ICs5NDcsOCBAQAogICAgICAgICBmaW5pc2hlZC5hZGQoY29ubmVjdGlvbi5yZXF1ZXN0V2FpdCgpKTsKICAgICAgICAgbG9uZyBzZWNvbmRSZXR1cm5lZCA9IG5vdygpOwogCi0gICAgICAgIGFzc3VtZVRydWUoZmlyc3RSZXR1cm5lZCAtIHN0YXJ0VGltZSA+IDEwMCk7Ci0gICAgICAgIGFzc3VtZVRydWUoc2Vjb25kUmV0dXJuZWQgLSBmaXJzdFJldHVybmVkIDwgMTAwKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShmaXJzdFJldHVybmVkIC0gc3RhcnRUaW1lID4gMTAwKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzZWNvbmRSZXR1cm5lZCAtIGZpcnN0UmV0dXJuZWQgPCAxMDApOwogCiAgICAgICAgIGFzc2VydFRydWUoZmluaXNoZWQuY29udGFpbnMoemVyb1JlY2VpdmVkKSk7CiAgICAgICAgIGFzc2VydFRydWUoZmluaXNoZWQuY29udGFpbnMob25lUmVjZWl2ZWQpKTsKQEAgLTEwMTMsNyArOTY1LDcgQEAKICAgICBwcml2YXRlIHZvaWQgdXNiUmVxdWVzdExlZ2FjeVRlc3RzKEBOb25OdWxsIFVzYkRldmljZUNvbm5lY3Rpb24gY29ubmVjdGlvbiwKICAgICAgICAgICAgIEBOb25OdWxsIFVzYkludGVyZmFjZSBpZmFjZSkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIC8vIEZpbmQgYnVsayBpbiBhbmQgb3V0IGVuZHBvaW50cwotICAgICAgICBhc3N1bWVUcnVlKGlmYWNlLmdldEVuZHBvaW50Q291bnQoKSA9PSAyKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShpZmFjZS5nZXRFbmRwb2ludENvdW50KCkgPT0gMik7CiAgICAgICAgIGZpbmFsIFVzYkVuZHBvaW50IGluID0gZ2V0RW5kcG9pbnQoaWZhY2UsIFVzYkNvbnN0YW50cy5VU0JfRElSX0lOKTsKICAgICAgICAgZmluYWwgVXNiRW5kcG9pbnQgb3V0ID0gZ2V0RW5kcG9pbnQoaWZhY2UsIFVzYkNvbnN0YW50cy5VU0JfRElSX09VVCk7CiAgICAgICAgIGFzc2VydE5vdE51bGwoaW4pOwpAQCAtMTAyNiwxNCArOTc4LDE0IEBACiAgICAgICAgIG5leHRUZXN0KGNvbm5lY3Rpb24sIGluLCBvdXQsICJFY2hvIDEgYnl0ZSIpOwogICAgICAgICBlY2hvVXNiUmVxdWVzdExlZ2FjeShjb25uZWN0aW9uLCBpbiwgb3V0LCAxLCBmYWxzZSk7CiAKLSAgICAgICAgbmV4dFRlc3QoY29ubmVjdGlvbiwgaW4sIG91dCwgIkVjaG8gbWF4IGJ5dGVzIik7Ci0gICAgICAgIGVjaG9Vc2JSZXF1ZXN0TGVnYWN5KGNvbm5lY3Rpb24sIGluLCBvdXQsIE1BWF9CVUZGRVJfU0laRSwgdHJ1ZSk7CisgICAgICAgIG5leHRUZXN0KGNvbm5lY3Rpb24sIGluLCBvdXQsICJFY2hvIDE2Mzg0IGJ5dGVzIik7CisgICAgICAgIGVjaG9Vc2JSZXF1ZXN0TGVnYWN5KGNvbm5lY3Rpb24sIGluLCBvdXQsIDE2Mzg0LCB0cnVlKTsKIAotICAgICAgICBuZXh0VGVzdChjb25uZWN0aW9uLCBpbiwgb3V0LCAiRWNobyBtYXggYnl0ZXMiKTsKLSAgICAgICAgZWNob1VzYlJlcXVlc3RMZWdhY3koY29ubmVjdGlvbiwgaW4sIG91dCwgTUFYX0JVRkZFUl9TSVpFLCBmYWxzZSk7CisgICAgICAgIG5leHRUZXN0KGNvbm5lY3Rpb24sIGluLCBvdXQsICJFY2hvIDE2Mzg0IGJ5dGVzIik7CisgICAgICAgIGVjaG9Vc2JSZXF1ZXN0TGVnYWN5KGNvbm5lY3Rpb24sIGluLCBvdXQsIDE2Mzg0LCBmYWxzZSk7CiAKLSAgICAgICAgbmV4dFRlc3QoY29ubmVjdGlvbiwgaW4sIG91dCwgIkVjaG8gb3ZlcnNpemVkIGJ1ZmZlciIpOwotICAgICAgICBlY2hvT3ZlcnNpemVkVXNiUmVxdWVzdExlZ2FjeShjb25uZWN0aW9uLCBpbiwgb3V0KTsKKyAgICAgICAgbmV4dFRlc3QoY29ubmVjdGlvbiwgaW4sIG91dCwgIkVjaG8gbGFyZ2UgYnVmZmVyIik7CisgICAgICAgIGVjaG9MYXJnZVVzYlJlcXVlc3RMZWdhY3koY29ubmVjdGlvbiwgaW4sIG91dCk7CiAKICAgICAgICAgLy8gU2VuZCBlbXB0eSByZXF1ZXN0cwogICAgICAgICBzZW5kWmVyb0xlbmd0aFJlcXVlc3RMZWdhY3koY29ubmVjdGlvbiwgb3V0LCB0cnVlKTsKQEAgLTExMzcsNyArMTA4OSw3IEBACiAgICAgcHJpdmF0ZSB2b2lkIHVzYlJlcXVlc3RUZXN0cyhATm9uTnVsbCBVc2JEZXZpY2VDb25uZWN0aW9uIGNvbm5lY3Rpb24sCiAgICAgICAgICAgICBATm9uTnVsbCBVc2JJbnRlcmZhY2UgaWZhY2UpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICAvLyBGaW5kIGJ1bGsgaW4gYW5kIG91dCBlbmRwb2ludHMKLSAgICAgICAgYXNzdW1lVHJ1ZShpZmFjZS5nZXRFbmRwb2ludENvdW50KCkgPT0gMik7CisgICAgICAgIGFzc2VydFRydWUoaWZhY2UuZ2V0RW5kcG9pbnRDb3VudCgpID09IDIpOwogICAgICAgICBmaW5hbCBVc2JFbmRwb2ludCBpbiA9IGdldEVuZHBvaW50KGlmYWNlLCBVc2JDb25zdGFudHMuVVNCX0RJUl9JTik7CiAgICAgICAgIGZpbmFsIFVzYkVuZHBvaW50IG91dCA9IGdldEVuZHBvaW50KGlmYWNlLCBVc2JDb25zdGFudHMuVVNCX0RJUl9PVVQpOwogICAgICAgICBhc3NlcnROb3ROdWxsKGluKTsKQEAgLTExNTAsMTEgKzExMDIsMTEgQEAKICAgICAgICAgbmV4dFRlc3QoY29ubmVjdGlvbiwgaW4sIG91dCwgIkVjaG8gMSBieXRlIik7CiAgICAgICAgIGVjaG9Vc2JSZXF1ZXN0KGNvbm5lY3Rpb24sIGluLCBvdXQsIDEsIGZhbHNlKTsKIAotICAgICAgICBuZXh0VGVzdChjb25uZWN0aW9uLCBpbiwgb3V0LCAiRWNobyBtYXggYnl0ZXMiKTsKLSAgICAgICAgZWNob1VzYlJlcXVlc3QoY29ubmVjdGlvbiwgaW4sIG91dCwgTUFYX0JVRkZFUl9TSVpFLCB0cnVlKTsKKyAgICAgICAgbmV4dFRlc3QoY29ubmVjdGlvbiwgaW4sIG91dCwgIkVjaG8gMTYzODQgYnl0ZXMiKTsKKyAgICAgICAgZWNob1VzYlJlcXVlc3QoY29ubmVjdGlvbiwgaW4sIG91dCwgMTYzODQsIHRydWUpOwogCi0gICAgICAgIG5leHRUZXN0KGNvbm5lY3Rpb24sIGluLCBvdXQsICJFY2hvIG1heCBieXRlcyIpOwotICAgICAgICBlY2hvVXNiUmVxdWVzdChjb25uZWN0aW9uLCBpbiwgb3V0LCBNQVhfQlVGRkVSX1NJWkUsIGZhbHNlKTsKKyAgICAgICAgbmV4dFRlc3QoY29ubmVjdGlvbiwgaW4sIG91dCwgIkVjaG8gMTYzODQgYnl0ZXMiKTsKKyAgICAgICAgZWNob1VzYlJlcXVlc3QoY29ubmVjdGlvbiwgaW4sIG91dCwgMTYzODQsIGZhbHNlKTsKIAogICAgICAgICAvLyBTZW5kIGVtcHR5IHJlcXVlc3RzCiAgICAgICAgIHNlbmRaZXJvTGVuZ3RoUmVxdWVzdChjb25uZWN0aW9uLCBvdXQsIHRydWUpOwpAQCAtMTU3OCw3ICsxNTMwLDcgQEAKICAgICBwcml2YXRlIHZvaWQgcGFyYWxsZWxVc2JSZXF1ZXN0c1Rlc3RzKEBOb25OdWxsIFVzYkRldmljZUNvbm5lY3Rpb24gY29ubmVjdGlvbiwKICAgICAgICAgICAgIEBOb25OdWxsIFVzYkludGVyZmFjZSBpZmFjZSkgewogICAgICAgICAvLyBGaW5kIGJ1bGsgaW4gYW5kIG91dCBlbmRwb2ludHMKLSAgICAgICAgYXNzdW1lVHJ1ZShpZmFjZS5nZXRFbmRwb2ludENvdW50KCkgPT0gMik7CisgICAgICAgIGFzc2VydFRydWUoaWZhY2UuZ2V0RW5kcG9pbnRDb3VudCgpID09IDIpOwogICAgICAgICBmaW5hbCBVc2JFbmRwb2ludCBpbiA9IGdldEVuZHBvaW50KGlmYWNlLCBVc2JDb25zdGFudHMuVVNCX0RJUl9JTik7CiAgICAgICAgIGZpbmFsIFVzYkVuZHBvaW50IG91dCA9IGdldEVuZHBvaW50KGlmYWNlLCBVc2JDb25zdGFudHMuVVNCX0RJUl9PVVQpOwogICAgICAgICBhc3NlcnROb3ROdWxsKGluKTsKQEAgLTE3MTgsNyArMTY3MCw3IEBACiAgICAgcHJpdmF0ZSB2b2lkIGJ1bGtUcmFuc2ZlclRlc3RzKEBOb25OdWxsIFVzYkRldmljZUNvbm5lY3Rpb24gY29ubmVjdGlvbiwKICAgICAgICAgICAgIEBOb25OdWxsIFVzYkludGVyZmFjZSBpZmFjZSkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIC8vIEZpbmQgYnVsayBpbiBhbmQgb3V0IGVuZHBvaW50cwotICAgICAgICBhc3N1bWVUcnVlKGlmYWNlLmdldEVuZHBvaW50Q291bnQoKSA9PSAyKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShpZmFjZS5nZXRFbmRwb2ludENvdW50KCkgPT0gMik7CiAgICAgICAgIGZpbmFsIFVzYkVuZHBvaW50IGluID0gZ2V0RW5kcG9pbnQoaWZhY2UsIFVzYkNvbnN0YW50cy5VU0JfRElSX0lOKTsKICAgICAgICAgZmluYWwgVXNiRW5kcG9pbnQgb3V0ID0gZ2V0RW5kcG9pbnQoaWZhY2UsIFVzYkNvbnN0YW50cy5VU0JfRElSX09VVCk7CiAgICAgICAgIGFzc2VydE5vdE51bGwoaW4pOwpAQCAtMTczMSwxNCArMTY4MywxMSBAQAogICAgICAgICBuZXh0VGVzdChjb25uZWN0aW9uLCBpbiwgb3V0LCAiRWNobyA0MiBieXRlcyIpOwogICAgICAgICBlY2hvQnVsa1RyYW5zZmVyT2Zmc2V0KGNvbm5lY3Rpb24sIGluLCBvdXQsIDIzLCA0Mik7CiAKLSAgICAgICAgbmV4dFRlc3QoY29ubmVjdGlvbiwgaW4sIG91dCwgIkVjaG8gbWF4IGJ5dGVzIik7Ci0gICAgICAgIGVjaG9CdWxrVHJhbnNmZXIoY29ubmVjdGlvbiwgaW4sIG91dCwgTUFYX0JVRkZFUl9TSVpFKTsKKyAgICAgICAgbmV4dFRlc3QoY29ubmVjdGlvbiwgaW4sIG91dCwgIkVjaG8gMTYzODQgYnl0ZXMiKTsKKyAgICAgICAgZWNob0J1bGtUcmFuc2Zlcihjb25uZWN0aW9uLCBpbiwgb3V0LCAxNjM4NCk7CiAKLSAgICAgICAgbmV4dFRlc3QoY29ubmVjdGlvbiwgaW4sIG91dCwgIkVjaG8gb3ZlcnNpemVkIGJ1ZmZlciIpOwotICAgICAgICBlY2hvT3ZlcnNpemVkQnVsa1RyYW5zZmVyKGNvbm5lY3Rpb24sIGluLCBvdXQpOwotCi0gICAgICAgIG5leHRUZXN0KGNvbm5lY3Rpb24sIGluLCBvdXQsICJSZWNlaXZlIG92ZXJzaXplZCBidWZmZXIiKTsKLSAgICAgICAgcmVjZWl2ZU92ZXJzaXplZEJ1bGtUcmFuc2Zlcihjb25uZWN0aW9uLCBpbik7CisgICAgICAgIG5leHRUZXN0KGNvbm5lY3Rpb24sIGluLCBvdXQsICJFY2hvIGxhcmdlIGJ1ZmZlciIpOworICAgICAgICBlY2hvTGFyZ2VCdWxrVHJhbnNmZXIoY29ubmVjdGlvbiwgaW4sIG91dCk7CiAKICAgICAgICAgLy8gSWxsZWdhbCBhcmd1bWVudHMKICAgICAgICAgcnVuQW5kQXNzZXJ0RXhjZXB0aW9uKCgpIC0+IGNvbm5lY3Rpb24uYnVsa1RyYW5zZmVyKG91dCwgbmV3IGJ5dGVbMV0sIDIsIDApLApAQCAtMTgzNCw3ICsxNzgzLDcgQEAKICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgdGVzdElmQ29tcGFuaW9uWmVyb1Rlcm1pbmF0ZXMoQE5vbk51bGwgVXNiRGV2aWNlQ29ubmVjdGlvbiBjb25uZWN0aW9uLAogICAgICAgICAgICAgQE5vbk51bGwgVXNiSW50ZXJmYWNlIGlmYWNlKSB7Ci0gICAgICAgIGFzc3VtZVRydWUoaWZhY2UuZ2V0RW5kcG9pbnRDb3VudCgpID09IDIpOworICAgICAgICBhc3NlcnRUcnVlKGlmYWNlLmdldEVuZHBvaW50Q291bnQoKSA9PSAyKTsKICAgICAgICAgZmluYWwgVXNiRW5kcG9pbnQgaW4gPSBnZXRFbmRwb2ludChpZmFjZSwgVXNiQ29uc3RhbnRzLlVTQl9ESVJfSU4pOwogICAgICAgICBmaW5hbCBVc2JFbmRwb2ludCBvdXQgPSBnZXRFbmRwb2ludChpZmFjZSwgVXNiQ29uc3RhbnRzLlVTQl9ESVJfT1VUKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChpbik7CkBAIC0xOTQ3LDcgKzE4OTYsNyBAQAogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBzZXRDb25maWd1cmF0aW9uVGVzdHMoQE5vbk51bGwgVXNiRGV2aWNlIGRldmljZSwKICAgICAgICAgICAgIEBOb25OdWxsIFVzYkRldmljZUNvbm5lY3Rpb24gY29ubmVjdGlvbiwgQE5vbk51bGwgVXNiSW50ZXJmYWNlIGlmYWNlKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgYXNzdW1lVHJ1ZShkZXZpY2UuZ2V0Q29uZmlndXJhdGlvbkNvdW50KCkgPT0gMSk7CisgICAgICAgIGFzc2VydFRydWUoZGV2aWNlLmdldENvbmZpZ3VyYXRpb25Db3VudCgpID09IDEpOwogICAgICAgICBib29sZWFuIHdhc1NldCA9IGNvbm5lY3Rpb24uc2V0Q29uZmlndXJhdGlvbihkZXZpY2UuZ2V0Q29uZmlndXJhdGlvbigwKSk7CiAgICAgICAgIGFzc2VydFRydWUod2FzU2V0KTsKIApAQCAtMjAyMSwxMSArMTk3MCwxMSBAQAogICAgICAgICAgICAgZGV2aWNlLmdldERldmljZVByb3RvY29sKCk7CiAKICAgICAgICAgICAgIFNldDxVc2JJbnRlcmZhY2U+IGludGVyZmFjZXNGcm9tQWxsQ29uZmlncyA9IG5ldyBBcnJheVNldDw+KCk7Ci0gICAgICAgICAgICBTZXQ8UGFpcjxJbnRlZ2VyLCBJbnRlZ2VyPj4ga25vd25JbnRlcmZhY2VJZHMgPSBuZXcgQXJyYXlTZXQ8PigpOwogICAgICAgICAgICAgU2V0PEludGVnZXI+IGtub3duQ29uZmlndXJhdGlvbklkcyA9IG5ldyBBcnJheVNldDw+KCk7CiAgICAgICAgICAgICBpbnQgbnVtQ29uZmlndXJhdGlvbnMgPSBkZXZpY2UuZ2V0Q29uZmlndXJhdGlvbkNvdW50KCk7CiAgICAgICAgICAgICBmb3IgKGludCBjb25maWdOdW0gPSAwOyBjb25maWdOdW0gPCBudW1Db25maWd1cmF0aW9uczsgY29uZmlnTnVtKyspIHsKICAgICAgICAgICAgICAgICBVc2JDb25maWd1cmF0aW9uIGNvbmZpZyA9IGRldmljZS5nZXRDb25maWd1cmF0aW9uKGNvbmZpZ051bSk7CisgICAgICAgICAgICAgICAgU2V0PFBhaXI8SW50ZWdlciwgSW50ZWdlcj4+IGtub3duSW50ZXJmYWNlSWRzID0gbmV3IEFycmF5U2V0PD4oKTsKIAogICAgICAgICAgICAgICAgIC8vIENvbmZpZ3VyYXRpb24gSUQgc2hvdWxkIGJlIHVuaXF1ZQogICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKGtub3duQ29uZmlndXJhdGlvbklkcy5jb250YWlucyhjb25maWcuZ2V0SWQoKSkpOwpAQCAtMjA5NCwxNCArMjA0MywxOCBAQAogICAgIHByaXZhdGUgdm9pZCBydW5UZXN0cyhATm9uTnVsbCBVc2JEZXZpY2UgZGV2aWNlKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAvLyBGaW5kIHRoZSBBT0FQIGludGVyZmFjZQorICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gYWxsSW50ZXJmYWNlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgICAgICAgVXNiSW50ZXJmYWNlIGlmYWNlID0gbnVsbDsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGV2aWNlLmdldENvbmZpZ3VyYXRpb25Db3VudCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBhbGxJbnRlcmZhY2VzLmFkZChkZXZpY2UuZ2V0SW50ZXJmYWNlKGkpLnRvU3RyaW5nKCkpOworCiAgICAgICAgICAgICAgICAgaWYgKGRldmljZS5nZXRJbnRlcmZhY2UoaSkuZ2V0TmFtZSgpLmVxdWFscygiQW5kcm9pZCBBY2Nlc3NvcnkgSW50ZXJmYWNlIikpIHsKICAgICAgICAgICAgICAgICAgICAgaWZhY2UgPSBkZXZpY2UuZ2V0SW50ZXJmYWNlKGkpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBhc3N1bWVOb3ROdWxsKGlmYWNlKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIk5vIFwiQW5kcm9pZCBBY2Nlc3NvcnkgSW50ZXJmYWNlXCIgaW50ZXJmYWNlIGZvdW5kIGluICIgKyBhbGxJbnRlcmZhY2VzLAorICAgICAgICAgICAgICAgICAgICBpZmFjZSk7CiAKICAgICAgICAgICAgIGVudW1lcmF0ZURldmljZXMoKTsKIApAQCAtMjE1NywxMCArMjExMCw2IEBACiAgICAgICAgICAgICBjb25uZWN0aW9uLmNsb3NlKCk7CiAKICAgICAgICAgICAgIHNldFRlc3RSZXN1bHRBbmRGaW5pc2godHJ1ZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEFzc3VtcHRpb25WaW9sYXRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBBc3N1bXB0aW9ucyBmYWlsaW5nIG1lYW5zIHRoYXQgc29tZWhvdyB0aGUgZGV2aWNlL2Nvbm5lY3Rpb24gaXMgc2V0IHVwIGluY29ycmVjdGx5Ci0gICAgICAgICAgICBUb2FzdC5tYWtlVGV4dCh0aGlzLCBnZXRTdHJpbmcoUi5zdHJpbmcudXNiX2RldmljZV91bmV4cGVjdGVkLCBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSksCi0gICAgICAgICAgICAgICAgICAgIFRvYXN0LkxFTkdUSF9MT05HKS5zaG93KCk7CiAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CiAgICAgICAgICAgICBmYWlsKG51bGwsIGUpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvdnIvVnJMaXN0ZW5lclZlcmlmaWVyQWN0aXZpdHkuamF2YSBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci92ci9Wckxpc3RlbmVyVmVyaWZpZXJBY3Rpdml0eS5qYXZhCmluZGV4IDJmODllYzYuLjljNjA3MzcgMTAwNjQ0Ci0tLSBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci92ci9Wckxpc3RlbmVyVmVyaWZpZXJBY3Rpdml0eS5qYXZhCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci92ci9Wckxpc3RlbmVyVmVyaWZpZXJBY3Rpdml0eS5qYXZhCkBAIC0zMSw4ICszMSw2IEBACiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiAKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ2RkVGVzdDsKLQogaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5QYXNzRmFpbEJ1dHRvbnM7CiBpbXBvcnQgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLlI7CiAKQEAgLTQzLDcgKzQxLDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TY2hlZHVsZWRFeGVjdXRvclNlcnZpY2U7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiAKLUBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjkuMS9ILTItMSIpCiBwdWJsaWMgY2xhc3MgVnJMaXN0ZW5lclZlcmlmaWVyQWN0aXZpdHkgZXh0ZW5kcyBQYXNzRmFpbEJ1dHRvbnMuQWN0aXZpdHkgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJWckxpc3RlbmVyQWN0aXZpdHkiOwpkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL3dpZmlhd2FyZS9DYWxsYmFja1V0aWxzLmphdmEgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvd2lmaWF3YXJlL0NhbGxiYWNrVXRpbHMuamF2YQppbmRleCA0NTkzZWQ0Li4yYmY0NjE0IDEwMDY0NAotLS0gYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvd2lmaWF3YXJlL0NhbGxiYWNrVXRpbHMuamF2YQorKysgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvd2lmaWF3YXJlL0NhbGxiYWNrVXRpbHMuamF2YQpAQCAtMjUsNiArMjUsOCBAQAogaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuYXdhcmUuUHVibGlzaERpc2NvdmVyeVNlc3Npb247CiBpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5hd2FyZS5TdWJzY3JpYmVEaXNjb3ZlcnlTZXNzaW9uOwogaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuYXdhcmUuV2lmaUF3YXJlU2Vzc2lvbjsKK2ltcG9ydCBhbmRyb2lkLm5ldC53aWZpLnJ0dC5SYW5naW5nUmVzdWx0OworaW1wb3J0IGFuZHJvaWQubmV0LndpZmkucnR0LlJhbmdpbmdSZXN1bHRDYWxsYmFjazsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5QYWlyOwogCkBAIC0xNjMsNiArMTY1LDcgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT05fTUVTU0FHRV9TRU5EX1NVQ0NFRURFRCA9IDB4MSA8PCA2OwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPTl9NRVNTQUdFX1NFTkRfRkFJTEVEID0gMHgxIDw8IDc7CiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9OX01FU1NBR0VfUkVDRUlWRUQgPSAweDEgPDwgODsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT05fU0VSVklDRV9ESVNDT1ZFUkVEX1dJVEhfUkFOR0UgPSAweDEgPDwgOTsKIAogICAgICAgICAvKioKICAgICAgICAgICogRGF0YSBjb250YWluZXIgZm9yIGFsbCBwYXJhbWV0ZXJzIHdoaWNoIGNhbiBiZSByZXR1cm5lZCBieSBhbnkgRGlzY292ZXJ5U2Vzc2lvbkNhbGxiYWNrCkBAIC0xODEsNiArMTg0LDcgQEAKICAgICAgICAgICAgIHB1YmxpYyBieXRlW10gc2VydmljZVNwZWNpZmljSW5mbzsKICAgICAgICAgICAgIHB1YmxpYyBMaXN0PGJ5dGVbXT4gbWF0Y2hGaWx0ZXI7CiAgICAgICAgICAgICBwdWJsaWMgaW50IG1lc3NhZ2VJZDsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgZGlzdGFuY2VNbTsKICAgICAgICAgfQogCiAgICAgICAgIHByaXZhdGUgQ291bnREb3duTGF0Y2ggbUJsb2NrZXIgPSBudWxsOwpAQCAtMzE2LDYgKzMyMCwxOCBAQAogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZURpc2NvdmVyZWRXaXRoaW5SYW5nZShQZWVySGFuZGxlIHBlZXJIYW5kbGUsCisgICAgICAgICAgICAgICAgYnl0ZVtdIHNlcnZpY2VTcGVjaWZpY0luZm8sCisgICAgICAgICAgICAgICAgTGlzdDxieXRlW10+IG1hdGNoRmlsdGVyLCBpbnQgZGlzdGFuY2VNbSkgeworICAgICAgICAgICAgQ2FsbGJhY2tEYXRhIGNhbGxiYWNrRGF0YSA9IG5ldyBDYWxsYmFja0RhdGEoT05fU0VSVklDRV9ESVNDT1ZFUkVEX1dJVEhfUkFOR0UpOworICAgICAgICAgICAgY2FsbGJhY2tEYXRhLnBlZXJIYW5kbGUgPSBwZWVySGFuZGxlOworICAgICAgICAgICAgY2FsbGJhY2tEYXRhLnNlcnZpY2VTcGVjaWZpY0luZm8gPSBzZXJ2aWNlU3BlY2lmaWNJbmZvOworICAgICAgICAgICAgY2FsbGJhY2tEYXRhLm1hdGNoRmlsdGVyID0gbWF0Y2hGaWx0ZXI7CisgICAgICAgICAgICBjYWxsYmFja0RhdGEuZGlzdGFuY2VNbSA9IGRpc3RhbmNlTW07CisgICAgICAgICAgICBwcm9jZXNzQ2FsbGJhY2soY2FsbGJhY2tEYXRhKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBvbk1lc3NhZ2VTZW5kU3VjY2VlZGVkKGludCBtZXNzYWdlSWQpIHsKICAgICAgICAgICAgIENhbGxiYWNrRGF0YSBjYWxsYmFja0RhdGEgPSBuZXcgQ2FsbGJhY2tEYXRhKE9OX01FU1NBR0VfU0VORF9TVUNDRUVERUQpOwogICAgICAgICAgICAgY2FsbGJhY2tEYXRhLm1lc3NhZ2VJZCA9IG1lc3NhZ2VJZDsKQEAgLTMzNyw0ICszNTMsNDQgQEAKICAgICAgICAgICAgIHByb2Nlc3NDYWxsYmFjayhjYWxsYmFja0RhdGEpOwogICAgICAgICB9CiAgICAgfQorCisgICAgLyoqCisgICAgICogVXRpbGl0eSBSYW5naW5nUmVzdWx0Q2FsbGJhY2sgLSBwcm92aWRlcyBtZWNoYW5pc20gZm9yIGJsb2NraW5nL3NlcmlhbGl6aW5nIGFjY2VzcyB3aXRoIHRoZQorICAgICAqIHdhaXRGb3JSYW5naW5nUmVzdWx0cyBtZXRob2QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSYW5naW5nQ2IgZXh0ZW5kcyBSYW5naW5nUmVzdWx0Q2FsbGJhY2sgeworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUSU1FT1VUID0gLTE7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9OX0ZBSUxVUkUgPSAwOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPTl9SRVNVTFRTID0gMTsKKworICAgICAgICBwcml2YXRlIENvdW50RG93bkxhdGNoIG1CbG9ja2VyID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworICAgICAgICBwcml2YXRlIGludCBtU3RhdHVzID0gVElNRU9VVDsKKyAgICAgICAgcHJpdmF0ZSBMaXN0PFJhbmdpbmdSZXN1bHQ+IG1SZXN1bHRzID0gbnVsbDsKKworICAgICAgICAvKioKKyAgICAgICAgICogV2FpdCAoYmxvY2tzKSBmb3IgUmFuZ2luZyByZXN1bHRzIGNhbGxiYWNrcyAtIG9yIHRpbWVzLW91dC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBQYWlyIG9mIHN0YXR1cyAmIFJhbmdpbmcgcmVzdWx0cyBpZiBzdWNjZWVkZWQsIG51bGwgb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFBhaXI8SW50ZWdlciwgTGlzdDxSYW5naW5nUmVzdWx0Pj4gd2FpdEZvclJhbmdpbmdSZXN1bHRzKCkKKyAgICAgICAgICAgICAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICAgICAgaWYgKG1CbG9ja2VyLmF3YWl0KENBTExCQUNLX1RJTUVPVVRfU0VDLCBUaW1lVW5pdC5TRUNPTkRTKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUGFpcjw+KG1TdGF0dXMsIG1SZXN1bHRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXcgUGFpcjw+KFRJTUVPVVQsIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUmFuZ2luZ0ZhaWx1cmUoaW50IGNvZGUpIHsKKyAgICAgICAgICAgIG1TdGF0dXMgPSBPTl9GQUlMVVJFOworICAgICAgICAgICAgbUJsb2NrZXIuY291bnREb3duKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25SYW5naW5nUmVzdWx0cyhMaXN0PFJhbmdpbmdSZXN1bHQ+IHJlc3VsdHMpIHsKKyAgICAgICAgICAgIG1TdGF0dXMgPSBPTl9SRVNVTFRTOworICAgICAgICAgICAgbVJlc3VsdHMgPSByZXN1bHRzOworICAgICAgICAgICAgbUJsb2NrZXIuY291bnREb3duKCk7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvd2lmaWF3YXJlL0Rpc2NvdmVyeVJhbmdpbmdQdWJsaXNoVGVzdEFjdGl2aXR5LmphdmEgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvd2lmaWF3YXJlL0Rpc2NvdmVyeVJhbmdpbmdQdWJsaXNoVGVzdEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMxY2M3OAotLS0gL2Rldi9udWxsCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci93aWZpYXdhcmUvRGlzY292ZXJ5UmFuZ2luZ1B1Ymxpc2hUZXN0QWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIud2lmaWF3YXJlOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIuUjsKK2ltcG9ydCBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIud2lmaWF3YXJlLnRlc3RjYXNlLkRpc2NvdmVyeVdpdGhSYW5naW5nVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBEaXNjb3ZlcnlSYW5naW5nUHVibGlzaFRlc3RBY3Rpdml0eSBleHRlbmRzIEJhc2VUZXN0QWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBCYXNlVGVzdENhc2UgZ2V0VGVzdENhc2UoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBuZXcgRGlzY292ZXJ5V2l0aFJhbmdpbmdUZXN0Q2FzZShjb250ZXh0LCB0cnVlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldEluZm9SZXNvdXJjZXMoUi5zdHJpbmcuYXdhcmVfZGlzY292ZXJ5X3JhbmdpbmdfcHVibGlzaCwKKyAgICAgICAgICAgICAgICBSLnN0cmluZy5hd2FyZV9kaXNjb3ZlcnlfcmFuZ2luZ19wdWJsaXNoX2luZm8sIDApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci93aWZpYXdhcmUvRGlzY292ZXJ5UmFuZ2luZ1N1YnNjcmliZVRlc3RBY3Rpdml0eS5qYXZhIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL3dpZmlhd2FyZS9EaXNjb3ZlcnlSYW5naW5nU3Vic2NyaWJlVGVzdEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg1NTk3MwotLS0gL2Rldi9udWxsCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci93aWZpYXdhcmUvRGlzY292ZXJ5UmFuZ2luZ1N1YnNjcmliZVRlc3RBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci53aWZpYXdhcmU7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci53aWZpYXdhcmUudGVzdGNhc2UuRGlzY292ZXJ5V2l0aFJhbmdpbmdUZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIERpc2NvdmVyeVJhbmdpbmdTdWJzY3JpYmVUZXN0QWN0aXZpdHkgZXh0ZW5kcyBCYXNlVGVzdEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQmFzZVRlc3RDYXNlIGdldFRlc3RDYXNlKENvbnRleHQgY29udGV4dCkgeworICAgICAgICByZXR1cm4gbmV3IERpc2NvdmVyeVdpdGhSYW5naW5nVGVzdENhc2UoY29udGV4dCwgZmFsc2UpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL3dpZmlhd2FyZS9PV05FUlMgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvd2lmaWF3YXJlL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWZjNDdmCi0tLSAvZGV2L251bGwKKysrIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL3dpZmlhd2FyZS9PV05FUlMKQEAgLTAsMCArMSwyIEBACitldGFuY29oZW5AZ29vZ2xlLmNvbQorc2F0a0Bnb29nbGUuY29tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL3dpZmlhd2FyZS9UZXN0TGlzdEFjdGl2aXR5LmphdmEgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvd2lmaWF3YXJlL1Rlc3RMaXN0QWN0aXZpdHkuamF2YQppbmRleCBjMmM3NjM2Li40ZTg4NTY1IDEwMDY0NAotLS0gYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvd2lmaWF3YXJlL1Rlc3RMaXN0QWN0aXZpdHkuamF2YQorKysgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvd2lmaWF3YXJlL1Rlc3RMaXN0QWN0aXZpdHkuamF2YQpAQCAtMjAsNiArMjAsNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2U7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhU2V0T2JzZXJ2ZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5hd2FyZS5XaWZpQXdhcmVNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwpAQCAtNTIsNiArNTMsOSBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKKyAgICAgICAgYm9vbGVhbiBpc1J0dFN1cHBvcnRlZCA9IGdldFBhY2thZ2VNYW5hZ2VyKCkuaGFzU3lzdGVtRmVhdHVyZSgKKyAgICAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlci5GRUFUVVJFX1dJRklfUlRUKTsKKwogICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5wYXNzX2ZhaWxfbGlzdCk7CiAgICAgICAgIHNldEluZm9SZXNvdXJjZXMoUi5zdHJpbmcuYXdhcmVfdGVzdCwgUi5zdHJpbmcuYXdhcmVfdGVzdF9pbmZvLCAwKTsKICAgICAgICAgc2V0UGFzc0ZhaWxCdXR0b25DbGlja0xpc3RlbmVycygpOwpAQCAtMTIwLDYgKzEyNCwxOCBAQAogICAgICAgICAgICAgICAgIFIuc3RyaW5nLmF3YXJlX2luaXRpYXRvciwKICAgICAgICAgICAgICAgICBEYXRhUGF0aE9vYlBhc3NwaHJhc2VJbml0aWF0b3JUZXN0QWN0aXZpdHkuY2xhc3MuZ2V0TmFtZSgpLAogICAgICAgICAgICAgICAgIG5ldyBJbnRlbnQodGhpcywgRGF0YVBhdGhPb2JQYXNzcGhyYXNlSW5pdGlhdG9yVGVzdEFjdGl2aXR5LmNsYXNzKSwgbnVsbCkpOworICAgICAgICBpZiAoaXNSdHRTdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgIGFkYXB0ZXIuYWRkKFRlc3RMaXN0QWRhcHRlci5UZXN0TGlzdEl0ZW0ubmV3Q2F0ZWdvcnkodGhpcywKKyAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuYXdhcmVfZGlzY292ZXJ5X3JhbmdpbmcpKTsKKyAgICAgICAgICAgIGFkYXB0ZXIuYWRkKFRlc3RMaXN0QWRhcHRlci5UZXN0TGlzdEl0ZW0ubmV3VGVzdCh0aGlzLAorICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5hd2FyZV9wdWJsaXNoLAorICAgICAgICAgICAgICAgICAgICBEaXNjb3ZlcnlSYW5naW5nUHVibGlzaFRlc3RBY3Rpdml0eS5jbGFzcy5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlbnQodGhpcywgRGlzY292ZXJ5UmFuZ2luZ1B1Ymxpc2hUZXN0QWN0aXZpdHkuY2xhc3MpLCBudWxsKSk7CisgICAgICAgICAgICBhZGFwdGVyLmFkZChUZXN0TGlzdEFkYXB0ZXIuVGVzdExpc3RJdGVtLm5ld1Rlc3QodGhpcywKKyAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuYXdhcmVfc3Vic2NyaWJlLAorICAgICAgICAgICAgICAgICAgICBEaXNjb3ZlcnlSYW5naW5nU3Vic2NyaWJlVGVzdEFjdGl2aXR5LmNsYXNzLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IEludGVudCh0aGlzLCBEaXNjb3ZlcnlSYW5naW5nU3Vic2NyaWJlVGVzdEFjdGl2aXR5LmNsYXNzKSwgbnVsbCkpOworICAgICAgICB9CiAKICAgICAgICAgYWRhcHRlci5yZWdpc3RlckRhdGFTZXRPYnNlcnZlcihuZXcgRGF0YVNldE9ic2VydmVyKCkgewogICAgICAgICAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvd2lmaWF3YXJlL3Rlc3RjYXNlL0RhdGFQYXRoSW5CYW5kVGVzdENhc2UuamF2YSBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci93aWZpYXdhcmUvdGVzdGNhc2UvRGF0YVBhdGhJbkJhbmRUZXN0Q2FzZS5qYXZhCmluZGV4IDVmNjRmMDIuLmZjOGEzZWYgMTAwNjQ0Ci0tLSBhL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci93aWZpYXdhcmUvdGVzdGNhc2UvRGF0YVBhdGhJbkJhbmRUZXN0Q2FzZS5qYXZhCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci93aWZpYXdhcmUvdGVzdGNhc2UvRGF0YVBhdGhJbkJhbmRUZXN0Q2FzZS5qYXZhCkBAIC0yMiwyMyArMjIsMTIgQEAKIGltcG9ydCBhbmRyb2lkLm5ldC5Db25uZWN0aXZpdHlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtDYXBhYmlsaXRpZXM7CiBpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1JlcXVlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5hd2FyZS5EaXNjb3ZlcnlTZXNzaW9uOwotaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuYXdhcmUuUGVlckhhbmRsZTsKLWltcG9ydCBhbmRyb2lkLm5ldC53aWZpLmF3YXJlLlB1Ymxpc2hDb25maWc7Ci1pbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5hd2FyZS5QdWJsaXNoRGlzY292ZXJ5U2Vzc2lvbjsKLWltcG9ydCBhbmRyb2lkLm5ldC53aWZpLmF3YXJlLlN1YnNjcmliZUNvbmZpZzsKLWltcG9ydCBhbmRyb2lkLm5ldC53aWZpLmF3YXJlLlN1YnNjcmliZURpc2NvdmVyeVNlc3Npb247Ci1pbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5hd2FyZS5XaWZpQXdhcmVTZXNzaW9uOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlBhaXI7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIuUjsKLWltcG9ydCBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIud2lmaWF3YXJlLkJhc2VUZXN0Q2FzZTsKIGltcG9ydCBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIud2lmaWF3YXJlLkNhbGxiYWNrVXRpbHM7CiAKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIC8qKgogICogVGVzdCBjYXNlIGZvciBkYXRhLXBhdGgsIGluLWJhbmQgdGVzdCBjYXNlczoKQEAgLTQ5LDcgKzM4LDcgQEAKICAqICAgIHdhaXQgZm9yIHJlc3VsdHMgKHNlc3Npb24pCiAgKiAyLiBTdWJzY3JpYmUKICAqICAgIHdhaXQgZm9yIHJlc3VsdHMgKHN1YnNjcmliZSBzZXNzaW9uKQotICogMy4gV2FpdCBmb3IgZGlzY292ZXJ5CisgKiAzLiBXYWl0IGZvciBkaXNjb3ZlcnkgKHBvc3NpYmx5IHdpdGggcmFuZ2luZykKICAqIDQuIFNlbmQgbWVzc2FnZQogICogICAgV2FpdCBmb3Igc3VjY2VzcwogICogNS4gV2FpdCBmb3IgcnggbWVzc2FnZQpAQCAtNjksMzUgKzU4LDIyIEBACiAgKiA2LiBXYWl0IGZvciBuZXR3b3JrCiAgKiA3LiBEZXN0cm95IHNlc3Npb24KICAqLwotcHVibGljIGNsYXNzIERhdGFQYXRoSW5CYW5kVGVzdENhc2UgZXh0ZW5kcyBCYXNlVGVzdENhc2UgeworcHVibGljIGNsYXNzIERhdGFQYXRoSW5CYW5kVGVzdENhc2UgZXh0ZW5kcyBEaXNjb3ZlcnlCYXNlVGVzdENhc2UgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRGF0YVBhdGhJbkJhbmRUZXN0Q2FzZSI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSB0cnVlOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfTkFNRSA9ICJDdHNWZXJpZmllclRlc3RTZXJ2aWNlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gTUFUQ0hfRklMVEVSX0JZVEVTID0gImJ5dGVzIHVzZWQgZm9yIG1hdGNoaW5nIi5nZXRCeXRlcygpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBQVUJfU1NJID0gIkV4dHJhIGJ5dGVzIGluIHRoZSBwdWJsaXNoZXIgZGlzY292ZXJ5Ii5nZXRCeXRlcygpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBTVUJfU1NJID0gIkFyYml0cmFyeSBieXRlcyBmb3IgdGhlIHN1YnNjcmliZSBkaXNjb3ZlcnkiLmdldEJ5dGVzKCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIE1TR19TVUJfVE9fUFVCID0gIkxldCdzIHRhbGsiLmdldEJ5dGVzKCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIE1TR19QVUJfVE9fU1VCID0gIlJlYWR5Ii5nZXRCeXRlcygpOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVNTUEhSQVNFID0gIlNvbWUgc3VwZXIgc2VjcmV0IHBhc3N3b3JkIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9JRCA9IDEyMzQ7CiAKICAgICBwcml2YXRlIGJvb2xlYW4gbUlzU2VjdXJpdHlPcGVuOwogICAgIHByaXZhdGUgYm9vbGVhbiBtSXNQdWJsaXNoOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNVbnNvbGljaXRlZDsKLQotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbUZhaWx1cmVSZWFzb247Ci0gICAgcHJpdmF0ZSBXaWZpQXdhcmVTZXNzaW9uIG1XaWZpQXdhcmVTZXNzaW9uOwotICAgIHByaXZhdGUgRGlzY292ZXJ5U2Vzc2lvbiBtV2lmaUF3YXJlRGlzY292ZXJ5U2Vzc2lvbjsKIAogICAgIHB1YmxpYyBEYXRhUGF0aEluQmFuZFRlc3RDYXNlKENvbnRleHQgY29udGV4dCwgYm9vbGVhbiBpc1NlY3VyaXR5T3BlbiwgYm9vbGVhbiBpc1B1Ymxpc2gsCiAgICAgICAgICAgICBib29sZWFuIGlzVW5zb2xpY2l0ZWQpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGlzVW5zb2xpY2l0ZWQsIGZhbHNlKTsKKwogICAgICAgICBtSXNTZWN1cml0eU9wZW4gPSBpc1NlY3VyaXR5T3BlbjsKICAgICAgICAgbUlzUHVibGlzaCA9IGlzUHVibGlzaDsKLSAgICAgICAgbUlzVW5zb2xpY2l0ZWQgPSBpc1Vuc29saWNpdGVkOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMTA4LDE2OSArODQsMzMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIG1Jc1Vuc29saWNpdGVkPSIgKyBtSXNVbnNvbGljaXRlZCk7CiAgICAgICAgIH0KIAotICAgICAgICAvLyAxLiBhdHRhY2gKLSAgICAgICAgQ2FsbGJhY2tVdGlscy5BdHRhY2hDYiBhdHRhY2hDYiA9IG5ldyBDYWxsYmFja1V0aWxzLkF0dGFjaENiKCk7Ci0gICAgICAgIG1XaWZpQXdhcmVNYW5hZ2VyLmF0dGFjaChhdHRhY2hDYiwgbUhhbmRsZXIpOwotICAgICAgICBQYWlyPEludGVnZXIsIFdpZmlBd2FyZVNlc3Npb24+IHJlc3VsdHMgPSBhdHRhY2hDYi53YWl0Rm9yQXR0YWNoKCk7Ci0gICAgICAgIHN3aXRjaCAocmVzdWx0cy5maXJzdCkgewotICAgICAgICAgICAgY2FzZSBDYWxsYmFja1V0aWxzLkF0dGFjaENiLlRJTUVPVVQ6Ci0gICAgICAgICAgICAgICAgc2V0RmFpbHVyZVJlYXNvbihtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcuYXdhcmVfc3RhdHVzX2F0dGFjaF90aW1lb3V0KSk7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiZXhlY3V0ZVRlc3Q6IGF0dGFjaCBUSU1FT1VUIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgY2FzZSBDYWxsYmFja1V0aWxzLkF0dGFjaENiLk9OX0FUVEFDSF9GQUlMRUQ6Ci0gICAgICAgICAgICAgICAgc2V0RmFpbHVyZVJlYXNvbihtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcuYXdhcmVfc3RhdHVzX2F0dGFjaF9mYWlsKSk7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiZXhlY3V0ZVRlc3Q6IGF0dGFjaCBPTl9BVFRBQ0hfRkFJTEVEIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBib29sZWFuIHN1Y2Nlc3M7CisgICAgICAgIGlmIChtSXNQdWJsaXNoKSB7CisgICAgICAgICAgICBzdWNjZXNzID0gZXhlY3V0ZVRlc3RQdWJsaXNoZXIoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSBleGVjdXRlVGVzdFN1YnNjcmliZXIoKTsKICAgICAgICAgfQotICAgICAgICBtV2lmaUF3YXJlU2Vzc2lvbiA9IHJlc3VsdHMuc2Vjb25kOwotICAgICAgICBpZiAobVdpZmlBd2FyZVNlc3Npb24gPT0gbnVsbCkgewotICAgICAgICAgICAgc2V0RmFpbHVyZVJlYXNvbihtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcuYXdhcmVfc3RhdHVzX2F0dGFjaF9mYWlsKSk7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJleGVjdXRlVGVzdDogYXR0YWNoIGNhbGxiYWNrIHN1Y2NlZWRlZCBidXQgbnVsbCBzZXNzaW9uIHJldHVybmVkIT8iKTsKKyAgICAgICAgaWYgKCFzdWNjZXNzKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgbUxpc3RlbmVyLm9uVGVzdE1zZ1JlY2VpdmVkKG1Db250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5hd2FyZV9zdGF0dXNfYXR0YWNoZWQpKTsKLSAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiZXhlY3V0ZVRlc3Q6IGF0dGFjaCBzdWNjZWVkZWQiKTsKLSAgICAgICAgfQogCi0gICAgICAgIGlmIChtSXNQdWJsaXNoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXhlY3V0ZVRlc3RQdWJsaXNoZXIoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBleGVjdXRlVGVzdFN1YnNjcmliZXIoKTsKLSAgICAgICAgfQotICAgIH0KKyAgICAgICAgLy8gZGVzdHJveSBzZXNzaW9uCisgICAgICAgIG1XaWZpQXdhcmVEaXNjb3ZlcnlTZXNzaW9uLmNsb3NlKCk7CisgICAgICAgIG1XaWZpQXdhcmVEaXNjb3ZlcnlTZXNzaW9uID0gbnVsbDsKIAotICAgIHByaXZhdGUgdm9pZCBzZXRGYWlsdXJlUmVhc29uKFN0cmluZyByZWFzb24pIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbUZhaWx1cmVSZWFzb24gPSByZWFzb247Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEZhaWx1cmVSZWFzb24oKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBtRmFpbHVyZVJlYXNvbjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotICAgICAgICBpZiAobVdpZmlBd2FyZURpc2NvdmVyeVNlc3Npb24gIT0gbnVsbCkgewotICAgICAgICAgICAgbVdpZmlBd2FyZURpc2NvdmVyeVNlc3Npb24uY2xvc2UoKTsKLSAgICAgICAgICAgIG1XaWZpQXdhcmVEaXNjb3ZlcnlTZXNzaW9uID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAobVdpZmlBd2FyZVNlc3Npb24gIT0gbnVsbCkgewotICAgICAgICAgICAgbVdpZmlBd2FyZVNlc3Npb24uY2xvc2UoKTsKLSAgICAgICAgICAgIG1XaWZpQXdhcmVTZXNzaW9uID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgICAgICBtTGlzdGVuZXIub25UZXN0TXNnUmVjZWl2ZWQobUNvbnRleHQuZ2V0U3RyaW5nKFIuc3RyaW5nLmF3YXJlX3N0YXR1c19saWZlY3ljbGVfb2spKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBib29sZWFuIGV4ZWN1dGVUZXN0U3Vic2NyaWJlcigpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgImV4ZWN1dGVUZXN0U3Vic2NyaWJlciIpOwotICAgICAgICBDYWxsYmFja1V0aWxzLkRpc2NvdmVyeUNiIGRpc2NvdmVyeUNiID0gbmV3IENhbGxiYWNrVXRpbHMuRGlzY292ZXJ5Q2IoKTsKLQotICAgICAgICAvLyAyLiBzdWJzY3JpYmUKLSAgICAgICAgTGlzdDxieXRlW10+IG1hdGNoRmlsdGVyID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIG1hdGNoRmlsdGVyLmFkZChNQVRDSF9GSUxURVJfQllURVMpOwotICAgICAgICBTdWJzY3JpYmVDb25maWcgc3Vic2NyaWJlQ29uZmlnID0gbmV3IFN1YnNjcmliZUNvbmZpZy5CdWlsZGVyKCkuc2V0U2VydmljZU5hbWUoCi0gICAgICAgICAgICAgICAgU0VSVklDRV9OQU1FKS5zZXRTZXJ2aWNlU3BlY2lmaWNJbmZvKFNVQl9TU0kpLnNldE1hdGNoRmlsdGVyKAotICAgICAgICAgICAgICAgIG1hdGNoRmlsdGVyKS5zZXRTdWJzY3JpYmVUeXBlKAotICAgICAgICAgICAgICAgIG1Jc1Vuc29saWNpdGVkID8gU3Vic2NyaWJlQ29uZmlnLlNVQlNDUklCRV9UWVBFX1BBU1NJVkUKLSAgICAgICAgICAgICAgICAgICAgICAgIDogU3Vic2NyaWJlQ29uZmlnLlNVQlNDUklCRV9UWVBFX0FDVElWRSkuc2V0VGVybWluYXRlTm90aWZpY2F0aW9uRW5hYmxlZCgKLSAgICAgICAgICAgICAgICB0cnVlKS5idWlsZCgpOwotICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJleGVjdXRlVGVzdFN1YnNjcmliZXI6IHN1YnNjcmliZUNvbmZpZz0iICsgc3Vic2NyaWJlQ29uZmlnKTsKLSAgICAgICAgbVdpZmlBd2FyZVNlc3Npb24uc3Vic2NyaWJlKHN1YnNjcmliZUNvbmZpZywgZGlzY292ZXJ5Q2IsIG1IYW5kbGVyKTsKLQotICAgICAgICAvLyAgICB3YWl0IGZvciByZXN1bHRzIC0gc3Vic2NyaWJlIHNlc3Npb24KLSAgICAgICAgQ2FsbGJhY2tVdGlscy5EaXNjb3ZlcnlDYi5DYWxsYmFja0RhdGEgY2FsbGJhY2tEYXRhID0gZGlzY292ZXJ5Q2Iud2FpdEZvckNhbGxiYWNrcygKLSAgICAgICAgICAgICAgICBDYWxsYmFja1V0aWxzLkRpc2NvdmVyeUNiLk9OX1NVQlNDUklCRV9TVEFSVEVECi0gICAgICAgICAgICAgICAgICAgICAgICB8IENhbGxiYWNrVXRpbHMuRGlzY292ZXJ5Q2IuT05fU0VTU0lPTl9DT05GSUdfRkFJTEVEKTsKLSAgICAgICAgc3dpdGNoIChjYWxsYmFja0RhdGEuY2FsbGJhY2spIHsKLSAgICAgICAgICAgIGNhc2UgQ2FsbGJhY2tVdGlscy5EaXNjb3ZlcnlDYi5USU1FT1VUOgotICAgICAgICAgICAgICAgIHNldEZhaWx1cmVSZWFzb24obUNvbnRleHQuZ2V0U3RyaW5nKFIuc3RyaW5nLmF3YXJlX3N0YXR1c19zdWJzY3JpYmVfdGltZW91dCkpOwotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgImV4ZWN1dGVUZXN0U3Vic2NyaWJlcjogc3Vic2NyaWJlIFRJTUVPVVQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBjYXNlIENhbGxiYWNrVXRpbHMuRGlzY292ZXJ5Q2IuT05fU0VTU0lPTl9DT05GSUdfRkFJTEVEOgotICAgICAgICAgICAgICAgIHNldEZhaWx1cmVSZWFzb24obUNvbnRleHQuZ2V0U3RyaW5nKFIuc3RyaW5nLmF3YXJlX3N0YXR1c19zdWJzY3JpYmVfZmFpbGVkKSk7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiZXhlY3V0ZVRlc3RTdWJzY3JpYmVyOiBzdWJzY3JpYmUgT05fU0VTU0lPTl9DT05GSUdfRkFJTEVEIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIFN1YnNjcmliZURpc2NvdmVyeVNlc3Npb24gZGlzY292ZXJ5U2Vzc2lvbiA9IGNhbGxiYWNrRGF0YS5zdWJzY3JpYmVEaXNjb3ZlcnlTZXNzaW9uOwotICAgICAgICBtV2lmaUF3YXJlRGlzY292ZXJ5U2Vzc2lvbiA9IGRpc2NvdmVyeVNlc3Npb247Ci0gICAgICAgIGlmIChkaXNjb3ZlcnlTZXNzaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIHNldEZhaWx1cmVSZWFzb24obUNvbnRleHQuZ2V0U3RyaW5nKFIuc3RyaW5nLmF3YXJlX3N0YXR1c19zdWJzY3JpYmVfbnVsbF9zZXNzaW9uKSk7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJleGVjdXRlVGVzdFN1YnNjcmliZXI6IHN1YnNjcmliZSBzdWNjZWVkZWQgYnV0IG51bGwgc2Vzc2lvbiByZXR1cm5lZCIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIG1MaXN0ZW5lci5vblRlc3RNc2dSZWNlaXZlZChtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcuYXdhcmVfc3RhdHVzX3N1YnNjcmliZV9zdGFydGVkKSk7Ci0gICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgImV4ZWN1dGVUZXN0U3Vic2NyaWJlcjogc3Vic2NyaWJlIHN1Y2NlZWRlZCIpOwotCi0gICAgICAgIC8vIDMuIHdhaXQgZm9yIGRpc2NvdmVyeQotICAgICAgICBjYWxsYmFja0RhdGEgPSBkaXNjb3ZlcnlDYi53YWl0Rm9yQ2FsbGJhY2tzKAotICAgICAgICAgICAgICAgIENhbGxiYWNrVXRpbHMuRGlzY292ZXJ5Q2IuT05fU0VSVklDRV9ESVNDT1ZFUkVEKTsKLSAgICAgICAgc3dpdGNoIChjYWxsYmFja0RhdGEuY2FsbGJhY2spIHsKLSAgICAgICAgICAgIGNhc2UgQ2FsbGJhY2tVdGlscy5EaXNjb3ZlcnlDYi5USU1FT1VUOgotICAgICAgICAgICAgICAgIHNldEZhaWx1cmVSZWFzb24obUNvbnRleHQuZ2V0U3RyaW5nKFIuc3RyaW5nLmF3YXJlX3N0YXR1c19kaXNjb3ZlcnlfdGltZW91dCkpOwotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgImV4ZWN1dGVUZXN0U3Vic2NyaWJlcjogd2FpdGluZyBmb3IgZGlzY292ZXJ5IFRJTUVPVVQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgUGVlckhhbmRsZSBwZWVySGFuZGxlID0gY2FsbGJhY2tEYXRhLnBlZXJIYW5kbGU7Ci0gICAgICAgIG1MaXN0ZW5lci5vblRlc3RNc2dSZWNlaXZlZChtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcuYXdhcmVfc3RhdHVzX2Rpc2NvdmVyeSkpOwotICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJleGVjdXRlVGVzdFN1YnNjcmliZXI6IGRpc2NvdmVyeSIpOwotCi0gICAgICAgIC8vICAgIHZhbGlkYXRlIGRpc2NvdmVyeSBwYXJhbWV0ZXJzIG1hdGNoCi0gICAgICAgIGlmICghQXJyYXlzLmVxdWFscyhQVUJfU1NJLCBjYWxsYmFja0RhdGEuc2VydmljZVNwZWNpZmljSW5mbykpIHsKLSAgICAgICAgICAgIHNldEZhaWx1cmVSZWFzb24obUNvbnRleHQuZ2V0U3RyaW5nKFIuc3RyaW5nLmF3YXJlX3N0YXR1c19kaXNjb3ZlcnlfZmFpbCkpOwotICAgICAgICAgICAgTG9nLmUoVEFHLCAiZXhlY3V0ZVRlc3RTdWJzY3JpYmVyOiBkaXNjb3ZlcnkgYnV0IFNTSSBtaXNtYXRjaDogcng9JyIgKyBuZXcgU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICBjYWxsYmFja0RhdGEuc2VydmljZVNwZWNpZmljSW5mbykgKyAiJyIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjYWxsYmFja0RhdGEubWF0Y2hGaWx0ZXIuc2l6ZSgpICE9IDEgfHwgIUFycmF5cy5lcXVhbHMoTUFUQ0hfRklMVEVSX0JZVEVTLAotICAgICAgICAgICAgICAgIGNhbGxiYWNrRGF0YS5tYXRjaEZpbHRlci5nZXQoMCkpKSB7Ci0gICAgICAgICAgICBzZXRGYWlsdXJlUmVhc29uKG1Db250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5hd2FyZV9zdGF0dXNfZGlzY292ZXJ5X2ZhaWwpKTsKLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgic2l6ZT0iKS5hcHBlbmQoY2FsbGJhY2tEYXRhLm1hdGNoRmlsdGVyLnNpemUoKSk7Ci0gICAgICAgICAgICBmb3IgKGJ5dGVbXSBtZjogY2FsbGJhY2tEYXRhLm1hdGNoRmlsdGVyKSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIsIGU9JyIpLmFwcGVuZChuZXcgU3RyaW5nKG1mKSkuYXBwZW5kKCInIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJleGVjdXRlVGVzdFN1YnNjcmliZXI6IGRpc2NvdmVyeSBidXQgbWF0Y2hGaWx0ZXIgbWlzbWF0Y2g6ICIKLSAgICAgICAgICAgICAgICAgICAgKyBzYi50b1N0cmluZygpKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAocGVlckhhbmRsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzZXRGYWlsdXJlUmVhc29uKG1Db250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5hd2FyZV9zdGF0dXNfZGlzY292ZXJ5X2ZhaWwpKTsKLSAgICAgICAgICAgIExvZy5lKFRBRywgImV4ZWN1dGVUZXN0U3Vic2NyaWJlcjogZGlzY292ZXJ5IGJ1dCBudWxsIHBlZXJIYW5kbGUiKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIDQuIHNlbmQgbWVzc2FnZSAmIHdhaXQgZm9yIHNlbmQgc3RhdHVzCi0gICAgICAgIGRpc2NvdmVyeVNlc3Npb24uc2VuZE1lc3NhZ2UocGVlckhhbmRsZSwgTUVTU0FHRV9JRCwgTVNHX1NVQl9UT19QVUIpOwotICAgICAgICBjYWxsYmFja0RhdGEgPSBkaXNjb3ZlcnlDYi53YWl0Rm9yQ2FsbGJhY2tzKAotICAgICAgICAgICAgICAgIENhbGxiYWNrVXRpbHMuRGlzY292ZXJ5Q2IuT05fTUVTU0FHRV9TRU5EX1NVQ0NFRURFRAotICAgICAgICAgICAgICAgICAgICAgICAgfCBDYWxsYmFja1V0aWxzLkRpc2NvdmVyeUNiLk9OX01FU1NBR0VfU0VORF9GQUlMRUQpOwotICAgICAgICBzd2l0Y2ggKGNhbGxiYWNrRGF0YS5jYWxsYmFjaykgewotICAgICAgICAgICAgY2FzZSBDYWxsYmFja1V0aWxzLkRpc2NvdmVyeUNiLlRJTUVPVVQ6Ci0gICAgICAgICAgICAgICAgc2V0RmFpbHVyZVJlYXNvbihtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcuYXdhcmVfc3RhdHVzX3NlbmRfdGltZW91dCkpOwotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgImV4ZWN1dGVUZXN0U3Vic2NyaWJlcjogc2VuZCBtZXNzYWdlIFRJTUVPVVQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBjYXNlIENhbGxiYWNrVXRpbHMuRGlzY292ZXJ5Q2IuT05fTUVTU0FHRV9TRU5EX0ZBSUxFRDoKLSAgICAgICAgICAgICAgICBzZXRGYWlsdXJlUmVhc29uKG1Db250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5hd2FyZV9zdGF0dXNfc2VuZF9mYWlsZWQpKTsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJleGVjdXRlVGVzdFN1YnNjcmliZXI6IHNlbmQgbWVzc2FnZSBPTl9NRVNTQUdFX1NFTkRfRkFJTEVEIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIG1MaXN0ZW5lci5vblRlc3RNc2dSZWNlaXZlZChtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcuYXdhcmVfc3RhdHVzX3NlbmRfc3VjY2VzcykpOwotICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJleGVjdXRlVGVzdFN1YnNjcmliZXI6IHNlbmQgbWVzc2FnZSBzdWNjZWVkZWQiKTsKLQotICAgICAgICBpZiAoY2FsbGJhY2tEYXRhLm1lc3NhZ2VJZCAhPSBNRVNTQUdFX0lEKSB7Ci0gICAgICAgICAgICBzZXRGYWlsdXJlUmVhc29uKG1Db250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5hd2FyZV9zdGF0dXNfc2VuZF9mYWlsX3BhcmFtZXRlcikpOwotICAgICAgICAgICAgTG9nLmUoVEFHLCAiZXhlY3V0ZVRlc3RTdWJzY3JpYmVyOiBzZW5kIG1lc3NhZ2UgbWVzc2FnZSBJRCBtaXNtYXRjaDogIgotICAgICAgICAgICAgICAgICAgICArIGNhbGxiYWNrRGF0YS5tZXNzYWdlSWQpOworICAgICAgICBpZiAoIWV4ZWN1dGVTdWJzY3JpYmUoKSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKICAgICAgICAgLy8gNS4gd2FpdCB0byByZWNlaXZlIG1lc3NhZ2UKLSAgICAgICAgY2FsbGJhY2tEYXRhID0gZGlzY292ZXJ5Q2Iud2FpdEZvckNhbGxiYWNrcyhDYWxsYmFja1V0aWxzLkRpc2NvdmVyeUNiLk9OX01FU1NBR0VfUkVDRUlWRUQpOworICAgICAgICBDYWxsYmFja1V0aWxzLkRpc2NvdmVyeUNiLkNhbGxiYWNrRGF0YSBjYWxsYmFja0RhdGEgPSBtRGlzY292ZXJ5Q2Iud2FpdEZvckNhbGxiYWNrcygKKyAgICAgICAgICAgICAgICBDYWxsYmFja1V0aWxzLkRpc2NvdmVyeUNiLk9OX01FU1NBR0VfUkVDRUlWRUQpOwogICAgICAgICBzd2l0Y2ggKGNhbGxiYWNrRGF0YS5jYWxsYmFjaykgewogICAgICAgICAgICAgY2FzZSBDYWxsYmFja1V0aWxzLkRpc2NvdmVyeUNiLlRJTUVPVVQ6CiAgICAgICAgICAgICAgICAgc2V0RmFpbHVyZVJlYXNvbihtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcuYXdhcmVfc3RhdHVzX3JlY2VpdmVfdGltZW91dCkpOwpAQCAtMjkzLDEyICsxMzMsMTMgQEAKICAgICAgICAgICAgICAgICBDb250ZXh0LkNPTk5FQ1RJVklUWV9TRVJWSUNFKTsKICAgICAgICAgTmV0d29ya1JlcXVlc3QgbnIgPSBuZXcgTmV0d29ya1JlcXVlc3QuQnVpbGRlcigpLmFkZFRyYW5zcG9ydFR5cGUoCiAgICAgICAgICAgICAgICAgTmV0d29ya0NhcGFiaWxpdGllcy5UUkFOU1BPUlRfV0lGSV9BV0FSRSkuc2V0TmV0d29ya1NwZWNpZmllcigKLSAgICAgICAgICAgICAgICBtSXNTZWN1cml0eU9wZW4gPyBkaXNjb3ZlcnlTZXNzaW9uLmNyZWF0ZU5ldHdvcmtTcGVjaWZpZXJPcGVuKHBlZXJIYW5kbGUpCi0gICAgICAgICAgICAgICAgICAgICAgICA6IGRpc2NvdmVyeVNlc3Npb24uY3JlYXRlTmV0d29ya1NwZWNpZmllclBhc3NwaHJhc2UocGVlckhhbmRsZSwKKyAgICAgICAgICAgICAgICBtSXNTZWN1cml0eU9wZW4gPyBtV2lmaUF3YXJlRGlzY292ZXJ5U2Vzc2lvbi5jcmVhdGVOZXR3b3JrU3BlY2lmaWVyT3BlbihtUGVlckhhbmRsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIDogbVdpZmlBd2FyZURpc2NvdmVyeVNlc3Npb24uY3JlYXRlTmV0d29ya1NwZWNpZmllclBhc3NwaHJhc2UobVBlZXJIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBU1NQSFJBU0UpKS5idWlsZCgpOwogICAgICAgICBDYWxsYmFja1V0aWxzLk5ldHdvcmtDYiBuZXR3b3JrQ2IgPSBuZXcgQ2FsbGJhY2tVdGlscy5OZXR3b3JrQ2IoKTsKICAgICAgICAgY20ucmVxdWVzdE5ldHdvcmsobnIsIG5ldHdvcmtDYiwgQ0FMTEJBQ0tfVElNRU9VVF9TRUMgKiAxMDAwKTsKLSAgICAgICAgbUxpc3RlbmVyLm9uVGVzdE1zZ1JlY2VpdmVkKG1Db250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5hd2FyZV9zdGF0dXNfbmV0d29ya19yZXF1ZXN0ZWQpKTsKKyAgICAgICAgbUxpc3RlbmVyLm9uVGVzdE1zZ1JlY2VpdmVkKAorICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5hd2FyZV9zdGF0dXNfbmV0d29ya19yZXF1ZXN0ZWQpKTsKICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAiZXhlY3V0ZVRlc3RTdWJzY3JpYmVyOiByZXF1ZXN0ZWQgbmV0d29yayIpOwogICAgICAgICBib29sZWFuIG5ldHdvcmtBdmFpbGFibGUgPSBuZXR3b3JrQ2Iud2FpdEZvck5ldHdvcmsoKTsKICAgICAgICAgY20udW5yZWdpc3Rlck5ldHdvcmtDYWxsYmFjayhuZXR3b3JrQ2IpOwpAQCAtMzEwLDcxICsxNTEsMTIgQEAKICAgICAgICAgbUxpc3RlbmVyLm9uVGVzdE1zZ1JlY2VpdmVkKG1Db250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5hd2FyZV9zdGF0dXNfbmV0d29ya19zdWNjZXNzKSk7CiAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgImV4ZWN1dGVUZXN0U3Vic2NyaWJlcjogbmV0d29yayByZXF1ZXN0IGdyYW50ZWQgLSBBVkFJTEFCTEUiKTsKIAotICAgICAgICAvLyA3LiBkZXN0cm95IHNlc3Npb24KLSAgICAgICAgZGlzY292ZXJ5U2Vzc2lvbi5jbG9zZSgpOwotICAgICAgICBtV2lmaUF3YXJlRGlzY292ZXJ5U2Vzc2lvbiA9IG51bGw7Ci0KLSAgICAgICAgbUxpc3RlbmVyLm9uVGVzdE1zZ1JlY2VpdmVkKG1Db250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5hd2FyZV9zdGF0dXNfbGlmZWN5Y2xlX29rKSk7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIHByaXZhdGUgYm9vbGVhbiBleGVjdXRlVGVzdFB1Ymxpc2hlcigpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgImV4ZWN1dGVUZXN0UHVibGlzaGVyIik7Ci0gICAgICAgIENhbGxiYWNrVXRpbHMuRGlzY292ZXJ5Q2IgZGlzY292ZXJ5Q2IgPSBuZXcgQ2FsbGJhY2tVdGlscy5EaXNjb3ZlcnlDYigpOwotCi0gICAgICAgIC8vIDIuIHB1Ymxpc2gKLSAgICAgICAgTGlzdDxieXRlW10+IG1hdGNoRmlsdGVyID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIG1hdGNoRmlsdGVyLmFkZChNQVRDSF9GSUxURVJfQllURVMpOwotICAgICAgICBQdWJsaXNoQ29uZmlnIHB1Ymxpc2hDb25maWcgPSBuZXcgUHVibGlzaENvbmZpZy5CdWlsZGVyKCkuc2V0U2VydmljZU5hbWUoCi0gICAgICAgICAgICAgICAgU0VSVklDRV9OQU1FKS5zZXRTZXJ2aWNlU3BlY2lmaWNJbmZvKFBVQl9TU0kpLnNldE1hdGNoRmlsdGVyKAotICAgICAgICAgICAgICAgIG1hdGNoRmlsdGVyKS5zZXRQdWJsaXNoVHlwZShtSXNVbnNvbGljaXRlZCA/IFB1Ymxpc2hDb25maWcuUFVCTElTSF9UWVBFX1VOU09MSUNJVEVECi0gICAgICAgICAgICAgICAgOiBQdWJsaXNoQ29uZmlnLlBVQkxJU0hfVFlQRV9TT0xJQ0lURUQpLnNldFRlcm1pbmF0ZU5vdGlmaWNhdGlvbkVuYWJsZWQoCi0gICAgICAgICAgICAgICAgdHJ1ZSkuYnVpbGQoKTsKLSAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAiZXhlY3V0ZVRlc3RQdWJsaXNoZXI6IHB1Ymxpc2hDb25maWc9IiArIHB1Ymxpc2hDb25maWcpOwotICAgICAgICBtV2lmaUF3YXJlU2Vzc2lvbi5wdWJsaXNoKHB1Ymxpc2hDb25maWcsIGRpc2NvdmVyeUNiLCBtSGFuZGxlcik7Ci0KLSAgICAgICAgLy8gICAgd2FpdCBmb3IgcmVzdWx0cyAtIHB1Ymxpc2ggc2Vzc2lvbgotICAgICAgICBDYWxsYmFja1V0aWxzLkRpc2NvdmVyeUNiLkNhbGxiYWNrRGF0YSBjYWxsYmFja0RhdGEgPSBkaXNjb3ZlcnlDYi53YWl0Rm9yQ2FsbGJhY2tzKAotICAgICAgICAgICAgICAgIENhbGxiYWNrVXRpbHMuRGlzY292ZXJ5Q2IuT05fUFVCTElTSF9TVEFSVEVECi0gICAgICAgICAgICAgICAgICAgICAgICB8IENhbGxiYWNrVXRpbHMuRGlzY292ZXJ5Q2IuT05fU0VTU0lPTl9DT05GSUdfRkFJTEVEKTsKLSAgICAgICAgc3dpdGNoIChjYWxsYmFja0RhdGEuY2FsbGJhY2spIHsKLSAgICAgICAgICAgIGNhc2UgQ2FsbGJhY2tVdGlscy5EaXNjb3ZlcnlDYi5USU1FT1VUOgotICAgICAgICAgICAgICAgIHNldEZhaWx1cmVSZWFzb24obUNvbnRleHQuZ2V0U3RyaW5nKFIuc3RyaW5nLmF3YXJlX3N0YXR1c19wdWJsaXNoX3RpbWVvdXQpKTsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJleGVjdXRlVGVzdFB1Ymxpc2hlcjogcHVibGlzaCBUSU1FT1VUIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgY2FzZSBDYWxsYmFja1V0aWxzLkRpc2NvdmVyeUNiLk9OX1NFU1NJT05fQ09ORklHX0ZBSUxFRDoKLSAgICAgICAgICAgICAgICBzZXRGYWlsdXJlUmVhc29uKG1Db250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5hd2FyZV9zdGF0dXNfcHVibGlzaF9mYWlsZWQpKTsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJleGVjdXRlVGVzdFB1Ymxpc2hlcjogcHVibGlzaCBPTl9TRVNTSU9OX0NPTkZJR19GQUlMRUQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgUHVibGlzaERpc2NvdmVyeVNlc3Npb24gZGlzY292ZXJ5U2Vzc2lvbiA9IGNhbGxiYWNrRGF0YS5wdWJsaXNoRGlzY292ZXJ5U2Vzc2lvbjsKLSAgICAgICAgbVdpZmlBd2FyZURpc2NvdmVyeVNlc3Npb24gPSBkaXNjb3ZlcnlTZXNzaW9uOwotICAgICAgICBpZiAoZGlzY292ZXJ5U2Vzc2lvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzZXRGYWlsdXJlUmVhc29uKG1Db250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5hd2FyZV9zdGF0dXNfcHVibGlzaF9udWxsX3Nlc3Npb24pKTsKLSAgICAgICAgICAgIExvZy5lKFRBRywgImV4ZWN1dGVUZXN0UHVibGlzaGVyOiBwdWJsaXNoIHN1Y2NlZWRlZCBidXQgbnVsbCBzZXNzaW9uIHJldHVybmVkIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgbUxpc3RlbmVyLm9uVGVzdE1zZ1JlY2VpdmVkKG1Db250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5hd2FyZV9zdGF0dXNfcHVibGlzaF9zdGFydGVkKSk7Ci0gICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgImV4ZWN1dGVUZXN0UHVibGlzaGVyOiBwdWJsaXNoIHN1Y2NlZWRlZCIpOwotCi0gICAgICAgIC8vIDMuIHdhaXQgdG8gcmVjZWl2ZSBtZXNzYWdlOiBubyB0aW1lb3V0IHNpbmNlIHRoaXMgZGVwZW5kcyBvbiAoaHVtYW4pIG9wZXJhdG9yIHN0YXJ0aW5nCi0gICAgICAgIC8vICAgIHRoZSB0ZXN0IG9uIHRoZSBzdWJzY3JpYmVyIGRldmljZS4KLSAgICAgICAgY2FsbGJhY2tEYXRhID0gZGlzY292ZXJ5Q2Iud2FpdEZvckNhbGxiYWNrc05vVGltZW91dCgKLSAgICAgICAgICAgICAgICBDYWxsYmFja1V0aWxzLkRpc2NvdmVyeUNiLk9OX01FU1NBR0VfUkVDRUlWRUQpOwotICAgICAgICBQZWVySGFuZGxlIHBlZXJIYW5kbGUgPSBjYWxsYmFja0RhdGEucGVlckhhbmRsZTsKLSAgICAgICAgbUxpc3RlbmVyLm9uVGVzdE1zZ1JlY2VpdmVkKG1Db250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5hd2FyZV9zdGF0dXNfcmVjZWl2ZWQpKTsKLSAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAiZXhlY3V0ZVRlc3RQdWJsaXNoZXI6IHJlY2VpdmVkIG1lc3NhZ2UiKTsKLQotICAgICAgICAvLyAgICB2YWxpZGF0ZSB0aGF0IHJlY2VpdmVkIHRoZSBleHBlY3RlZCBtZXNzYWdlCi0gICAgICAgIGlmICghQXJyYXlzLmVxdWFscyhNU0dfU1VCX1RPX1BVQiwgY2FsbGJhY2tEYXRhLnNlcnZpY2VTcGVjaWZpY0luZm8pKSB7Ci0gICAgICAgICAgICBzZXRGYWlsdXJlUmVhc29uKG1Db250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5hd2FyZV9zdGF0dXNfcmVjZWl2ZV9mYWlsdXJlKSk7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJleGVjdXRlVGVzdFB1Ymxpc2hlcjogcmVjZWl2ZSBtZXNzYWdlIG1lc3NhZ2UgY29udGVudCBtaXNtYXRjaDogcng9JyIKLSAgICAgICAgICAgICAgICAgICAgKyBuZXcgU3RyaW5nKGNhbGxiYWNrRGF0YS5zZXJ2aWNlU3BlY2lmaWNJbmZvKSArICInIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBlZXJIYW5kbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgc2V0RmFpbHVyZVJlYXNvbihtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcuYXdhcmVfc3RhdHVzX3JlY2VpdmVfZmFpbHVyZSkpOwotICAgICAgICAgICAgTG9nLmUoVEFHLCAiZXhlY3V0ZVRlc3RQdWJsaXNoZXI6IHJlY2VpdmVkIG1lc3NhZ2UgYnV0IHBlZXJIYW5kbGUgaXMgbnVsbCE/Iik7CisgICAgICAgIGlmICghZXhlY3V0ZVB1Ymxpc2goKSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKQEAgLTM4MywxNyArMTY1LDE4IEBACiAgICAgICAgICAgICAgICAgQ29udGV4dC5DT05ORUNUSVZJVFlfU0VSVklDRSk7CiAgICAgICAgIE5ldHdvcmtSZXF1ZXN0IG5yID0gbmV3IE5ldHdvcmtSZXF1ZXN0LkJ1aWxkZXIoKS5hZGRUcmFuc3BvcnRUeXBlKAogICAgICAgICAgICAgICAgIE5ldHdvcmtDYXBhYmlsaXRpZXMuVFJBTlNQT1JUX1dJRklfQVdBUkUpLnNldE5ldHdvcmtTcGVjaWZpZXIoCi0gICAgICAgICAgICAgICAgbUlzU2VjdXJpdHlPcGVuID8gZGlzY292ZXJ5U2Vzc2lvbi5jcmVhdGVOZXR3b3JrU3BlY2lmaWVyT3BlbihwZWVySGFuZGxlKQotICAgICAgICAgICAgICAgICAgICAgICAgOiBkaXNjb3ZlcnlTZXNzaW9uLmNyZWF0ZU5ldHdvcmtTcGVjaWZpZXJQYXNzcGhyYXNlKHBlZXJIYW5kbGUsCisgICAgICAgICAgICAgICAgbUlzU2VjdXJpdHlPcGVuID8gbVdpZmlBd2FyZURpc2NvdmVyeVNlc3Npb24uY3JlYXRlTmV0d29ya1NwZWNpZmllck9wZW4obVBlZXJIYW5kbGUpCisgICAgICAgICAgICAgICAgICAgICAgICA6IG1XaWZpQXdhcmVEaXNjb3ZlcnlTZXNzaW9uLmNyZWF0ZU5ldHdvcmtTcGVjaWZpZXJQYXNzcGhyYXNlKG1QZWVySGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQVNTUEhSQVNFKSkuYnVpbGQoKTsKICAgICAgICAgQ2FsbGJhY2tVdGlscy5OZXR3b3JrQ2IgbmV0d29ya0NiID0gbmV3IENhbGxiYWNrVXRpbHMuTmV0d29ya0NiKCk7CiAgICAgICAgIGNtLnJlcXVlc3ROZXR3b3JrKG5yLCBuZXR3b3JrQ2IsIENBTExCQUNLX1RJTUVPVVRfU0VDICogMTAwMCk7Ci0gICAgICAgIG1MaXN0ZW5lci5vblRlc3RNc2dSZWNlaXZlZChtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcuYXdhcmVfc3RhdHVzX25ldHdvcmtfcmVxdWVzdGVkKSk7CisgICAgICAgIG1MaXN0ZW5lci5vblRlc3RNc2dSZWNlaXZlZCgKKyAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcuYXdhcmVfc3RhdHVzX25ldHdvcmtfcmVxdWVzdGVkKSk7CiAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgImV4ZWN1dGVUZXN0UHVibGlzaGVyOiByZXF1ZXN0ZWQgbmV0d29yayIpOwogCiAgICAgICAgIC8vIDUuIHNlbmQgbWVzc2FnZSAmIHdhaXQgZm9yIHNlbmQgc3RhdHVzCi0gICAgICAgIGRpc2NvdmVyeVNlc3Npb24uc2VuZE1lc3NhZ2UocGVlckhhbmRsZSwgTUVTU0FHRV9JRCwgTVNHX1BVQl9UT19TVUIpOwotICAgICAgICBjYWxsYmFja0RhdGEgPSBkaXNjb3ZlcnlDYi53YWl0Rm9yQ2FsbGJhY2tzKAorICAgICAgICBtV2lmaUF3YXJlRGlzY292ZXJ5U2Vzc2lvbi5zZW5kTWVzc2FnZShtUGVlckhhbmRsZSwgTUVTU0FHRV9JRCwgTVNHX1BVQl9UT19TVUIpOworICAgICAgICBDYWxsYmFja1V0aWxzLkRpc2NvdmVyeUNiLkNhbGxiYWNrRGF0YSBjYWxsYmFja0RhdGEgPSBtRGlzY292ZXJ5Q2Iud2FpdEZvckNhbGxiYWNrcygKICAgICAgICAgICAgICAgICBDYWxsYmFja1V0aWxzLkRpc2NvdmVyeUNiLk9OX01FU1NBR0VfU0VORF9TVUNDRUVERUQKICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ2FsbGJhY2tVdGlscy5EaXNjb3ZlcnlDYi5PTl9NRVNTQUdFX1NFTkRfRkFJTEVEKTsKICAgICAgICAgc3dpdGNoIChjYWxsYmFja0RhdGEuY2FsbGJhY2spIHsKQEAgLTQyNywxMiArMjEwLDYgQEAKICAgICAgICAgbUxpc3RlbmVyLm9uVGVzdE1zZ1JlY2VpdmVkKG1Db250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5hd2FyZV9zdGF0dXNfbmV0d29ya19zdWNjZXNzKSk7CiAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgImV4ZWN1dGVUZXN0UHVibGlzaGVyOiBuZXR3b3JrIHJlcXVlc3QgZ3JhbnRlZCAtIEFWQUlMQUJMRSIpOwogCi0gICAgICAgIC8vIDcuIGRlc3Ryb3kgc2Vzc2lvbgotICAgICAgICBkaXNjb3ZlcnlTZXNzaW9uLmNsb3NlKCk7Ci0gICAgICAgIG1XaWZpQXdhcmVEaXNjb3ZlcnlTZXNzaW9uID0gbnVsbDsKLQotICAgICAgICBtTGlzdGVuZXIub25UZXN0TXNnUmVjZWl2ZWQobUNvbnRleHQuZ2V0U3RyaW5nKFIuc3RyaW5nLmF3YXJlX3N0YXR1c19saWZlY3ljbGVfb2spKTsKICAgICAgICAgcmV0dXJuIHRydWU7Ci0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvd2lmaWF3YXJlL3Rlc3RjYXNlL0Rpc2NvdmVyeUJhc2VUZXN0Q2FzZS5qYXZhIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL3dpZmlhd2FyZS90ZXN0Y2FzZS9EaXNjb3ZlcnlCYXNlVGVzdENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Nzc4NWI1Ci0tLSAvZGV2L251bGwKKysrIGIvYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL3dpZmlhd2FyZS90ZXN0Y2FzZS9EaXNjb3ZlcnlCYXNlVGVzdENhc2UuamF2YQpAQCAtMCwwICsxLDM4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLndpZmlhd2FyZS50ZXN0Y2FzZTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQubmV0Lk1hY0FkZHJlc3M7CitpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5hd2FyZS5EaXNjb3ZlcnlTZXNzaW9uOworaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuYXdhcmUuUGVlckhhbmRsZTsKK2ltcG9ydCBhbmRyb2lkLm5ldC53aWZpLmF3YXJlLlB1Ymxpc2hDb25maWc7CitpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5hd2FyZS5TdWJzY3JpYmVDb25maWc7CitpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5hd2FyZS5XaWZpQXdhcmVTZXNzaW9uOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlBhaXI7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIuUjsKK2ltcG9ydCBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIud2lmaWF3YXJlLkJhc2VUZXN0Q2FzZTsKK2ltcG9ydCBjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIud2lmaWF3YXJlLkNhbGxiYWNrVXRpbHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQmFzZSB0ZXN0IGNhc2UgcHJvdmlkaW5nIHV0aWxpdGllcyBmb3IgRGlzY292ZXJ5OgorICoKKyAqIFN1YnNjcmliZSB0ZXN0IHNlcXVlbmNlOgorICogMS4gQXR0YWNoCisgKiAgICB3YWl0IGZvciByZXN1bHRzIChzZXNzaW9uKQorICogMi4gU3Vic2NyaWJlCisgKiAgICB3YWl0IGZvciByZXN1bHRzIChzdWJzY3JpYmUgc2Vzc2lvbikKKyAqIDMuIFdhaXQgZm9yIGRpc2NvdmVyeSAocG9zc2libHkgd2l0aCByYW5naW5nKQorICogNC4gU2VuZCBtZXNzYWdlCisgKiAgICBXYWl0IGZvciBzdWNjZXNzCisgKgorICogUHVibGlzaCB0ZXN0IHNlcXVlbmNlOgorICogMS4gQXR0YWNoCisgKiAgICB3YWl0IGZvciByZXN1bHRzIChzZXNzaW9uKQorICogMi4gUHVibGlzaAorICogICAgd2FpdCBmb3IgcmVzdWx0cyAocHVibGlzaCBzZXNzaW9uKQorICogMy4gV2FpdCBmb3IgcnggbWVzc2FnZQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGlzY292ZXJ5QmFzZVRlc3RDYXNlIGV4dGVuZHMgQmFzZVRlc3RDYXNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkRpc2NvdmVyeUJhc2VUZXN0Q2FzZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSB0cnVlOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfTkFNRSA9ICJDdHNWZXJpZmllclRlc3RTZXJ2aWNlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gTUFUQ0hfRklMVEVSX0JZVEVTID0gImJ5dGVzIHVzZWQgZm9yIG1hdGNoaW5nIi5nZXRCeXRlcygpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBQVUJfU1NJID0gIkV4dHJhIGJ5dGVzIGluIHRoZSBwdWJsaXNoZXIgZGlzY292ZXJ5Ii5nZXRCeXRlcygpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBTVUJfU1NJID0gIkFyYml0cmFyeSBieXRlcyBmb3IgdGhlIHN1YnNjcmliZSBkaXNjb3ZlcnkiLmdldEJ5dGVzKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIE1TR19TVUJfVE9fUFVCID0gIkxldCdzIHRhbGsiLmdldEJ5dGVzKCk7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9JRCA9IDEyMzQ7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTEFSR0VfRU5PVUdIX0RJU1RBTkNFID0gMTAwMDAwOyAvLyAxMDAgbWV0ZXJzCisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtSXNVbnNvbGljaXRlZDsKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtSXNSYW5naW5nUmVxdWlyZWQ7CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbUZhaWx1cmVSZWFzb247CisgICAgcHJvdGVjdGVkIFdpZmlBd2FyZVNlc3Npb24gbVdpZmlBd2FyZVNlc3Npb247CisgICAgcHJvdGVjdGVkIERpc2NvdmVyeVNlc3Npb24gbVdpZmlBd2FyZURpc2NvdmVyeVNlc3Npb247CisgICAgcHJvdGVjdGVkIENhbGxiYWNrVXRpbHMuRGlzY292ZXJ5Q2IgbURpc2NvdmVyeUNiOworICAgIHByb3RlY3RlZCBQZWVySGFuZGxlIG1QZWVySGFuZGxlOworICAgIHByb3RlY3RlZCBNYWNBZGRyZXNzIG1NeU1hY0FkZHJlc3M7CisgICAgcHJvdGVjdGVkIE1hY0FkZHJlc3MgbVBlZXJNYWNBZGRyZXNzOworCisgICAgcHVibGljIERpc2NvdmVyeUJhc2VUZXN0Q2FzZShDb250ZXh0IGNvbnRleHQsIGJvb2xlYW4gaXNVbnNvbGljaXRlZCwKKyAgICAgICAgICAgIGJvb2xlYW4gaXNSYW5naW5nUmVxdWlyZWQpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCk7CisKKyAgICAgICAgbUlzVW5zb2xpY2l0ZWQgPSBpc1Vuc29saWNpdGVkOworICAgICAgICBtSXNSYW5naW5nUmVxdWlyZWQgPSBpc1JhbmdpbmdSZXF1aXJlZDsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gZXhlY3V0ZUF0dGFjaCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGF0dGFjaCAob3B0aW9uYWxseSB3aXRoIGFuIGlkZW50aXR5IGxpc3RlbmVyKQorICAgICAgICBDYWxsYmFja1V0aWxzLkF0dGFjaENiIGF0dGFjaENiID0gbmV3IENhbGxiYWNrVXRpbHMuQXR0YWNoQ2IoKTsKKyAgICAgICAgQ2FsbGJhY2tVdGlscy5JZGVudGl0eUxpc3RlbmVyU2luZ2xlU2hvdCBpZGVudGl0eUwgPSBuZXcgQ2FsbGJhY2tVdGlscworICAgICAgICAgICAgICAgIC5JZGVudGl0eUxpc3RlbmVyU2luZ2xlU2hvdCgpOworICAgICAgICBpZiAobUlzUmFuZ2luZ1JlcXVpcmVkKSB7CisgICAgICAgICAgICBtV2lmaUF3YXJlTWFuYWdlci5hdHRhY2goYXR0YWNoQ2IsIGlkZW50aXR5TCwgbUhhbmRsZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVdpZmlBd2FyZU1hbmFnZXIuYXR0YWNoKGF0dGFjaENiLCBtSGFuZGxlcik7CisgICAgICAgIH0KKyAgICAgICAgUGFpcjxJbnRlZ2VyLCBXaWZpQXdhcmVTZXNzaW9uPiByZXN1bHRzID0gYXR0YWNoQ2Iud2FpdEZvckF0dGFjaCgpOworICAgICAgICBzd2l0Y2ggKHJlc3VsdHMuZmlyc3QpIHsKKyAgICAgICAgICAgIGNhc2UgQ2FsbGJhY2tVdGlscy5BdHRhY2hDYi5USU1FT1VUOgorICAgICAgICAgICAgICAgIHNldEZhaWx1cmVSZWFzb24obUNvbnRleHQuZ2V0U3RyaW5nKFIuc3RyaW5nLmF3YXJlX3N0YXR1c19hdHRhY2hfdGltZW91dCkpOworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgImV4ZWN1dGVUZXN0OiBhdHRhY2ggVElNRU9VVCIpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGNhc2UgQ2FsbGJhY2tVdGlscy5BdHRhY2hDYi5PTl9BVFRBQ0hfRkFJTEVEOgorICAgICAgICAgICAgICAgIHNldEZhaWx1cmVSZWFzb24obUNvbnRleHQuZ2V0U3RyaW5nKFIuc3RyaW5nLmF3YXJlX3N0YXR1c19hdHRhY2hfZmFpbCkpOworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgImV4ZWN1dGVUZXN0OiBhdHRhY2ggT05fQVRUQUNIX0ZBSUxFRCIpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBtV2lmaUF3YXJlU2Vzc2lvbiA9IHJlc3VsdHMuc2Vjb25kOworICAgICAgICBpZiAobVdpZmlBd2FyZVNlc3Npb24gPT0gbnVsbCkgeworICAgICAgICAgICAgc2V0RmFpbHVyZVJlYXNvbihtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcuYXdhcmVfc3RhdHVzX2F0dGFjaF9mYWlsKSk7CisgICAgICAgICAgICBMb2cuZShUQUcsICJleGVjdXRlVGVzdDogYXR0YWNoIGNhbGxiYWNrIHN1Y2NlZWRlZCBidXQgbnVsbCBzZXNzaW9uIHJldHVybmVkIT8iKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBtTGlzdGVuZXIub25UZXN0TXNnUmVjZWl2ZWQobUNvbnRleHQuZ2V0U3RyaW5nKFIuc3RyaW5nLmF3YXJlX3N0YXR1c19hdHRhY2hlZCkpOworICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJleGVjdXRlVGVzdDogYXR0YWNoIHN1Y2NlZWRlZCIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gMS41IG9wdGlvbmFsbHkgd2FpdCBmb3IgaWRlbnRpdHkgKG5lY2Vzc2FyeSBpbiByYW5naW5nIGNhc2VzKQorICAgICAgICBpZiAobUlzUmFuZ2luZ1JlcXVpcmVkKSB7CisgICAgICAgICAgICBieXRlW10gbWFjID0gaWRlbnRpdHlMLndhaXRGb3JNYWMoKTsKKyAgICAgICAgICAgIGlmIChtYWMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNldEZhaWx1cmVSZWFzb24obUNvbnRleHQuZ2V0U3RyaW5nKFIuc3RyaW5nLmF3YXJlX3N0YXR1c19pZGVudGl0eV9mYWlsKSk7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiZXhlY3V0ZUF0dGFjaDogaWRlbnRpdHkgY2FsbGJhY2sgbm90IHRyaWdnZXJlZCIpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1NeU1hY0FkZHJlc3MgPSBNYWNBZGRyZXNzLmZyb21CeXRlcyhtYWMpOworICAgICAgICAgICAgbUxpc3RlbmVyLm9uVGVzdE1zZ1JlY2VpdmVkKG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLmF3YXJlX3N0YXR1c19pZGVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgbU15TWFjQWRkcmVzcykpOworICAgICAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImV4ZWN1dGVBdHRhY2g6IGlkZW50aXR5IHJlY2VpdmVkOiAiICsgbU15TWFjQWRkcmVzcy50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIGV4ZWN1dGVTdWJzY3JpYmUoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICAvLyAxLiBhdHRhY2gKKyAgICAgICAgaWYgKCFleGVjdXRlQXR0YWNoKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIG1EaXNjb3ZlcnlDYiA9IG5ldyBDYWxsYmFja1V0aWxzLkRpc2NvdmVyeUNiKCk7CisKKyAgICAgICAgLy8gMi4gc3Vic2NyaWJlCisgICAgICAgIExpc3Q8Ynl0ZVtdPiBtYXRjaEZpbHRlciA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBtYXRjaEZpbHRlci5hZGQoTUFUQ0hfRklMVEVSX0JZVEVTKTsKKyAgICAgICAgU3Vic2NyaWJlQ29uZmlnLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTdWJzY3JpYmVDb25maWcuQnVpbGRlcigpLnNldFNlcnZpY2VOYW1lKAorICAgICAgICAgICAgICAgIFNFUlZJQ0VfTkFNRSkuc2V0U2VydmljZVNwZWNpZmljSW5mbyhTVUJfU1NJKS5zZXRNYXRjaEZpbHRlcigKKyAgICAgICAgICAgICAgICBtYXRjaEZpbHRlcikuc2V0U3Vic2NyaWJlVHlwZSgKKyAgICAgICAgICAgICAgICBtSXNVbnNvbGljaXRlZCA/IFN1YnNjcmliZUNvbmZpZy5TVUJTQ1JJQkVfVFlQRV9QQVNTSVZFCisgICAgICAgICAgICAgICAgICAgICAgICA6IFN1YnNjcmliZUNvbmZpZy5TVUJTQ1JJQkVfVFlQRV9BQ1RJVkUpLnNldFRlcm1pbmF0ZU5vdGlmaWNhdGlvbkVuYWJsZWQoCisgICAgICAgICAgICAgICAgdHJ1ZSk7CisgICAgICAgIGlmIChtSXNSYW5naW5nUmVxdWlyZWQpIHsKKyAgICAgICAgICAgIC8vIHNldCB1cCBhIGRpc3RhbmNlIHRoYXQgd2lsbCBhbHdheXMgdHJpZ2dlciAtIGkuZS4gdGhhdCB3ZSdyZSBhbHJlYWR5IGluIHRoYXQgcmFuZ2UKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0TWF4RGlzdGFuY2VNbShMQVJHRV9FTk9VR0hfRElTVEFOQ0UpOworICAgICAgICB9CisgICAgICAgIFN1YnNjcmliZUNvbmZpZyBzdWJzY3JpYmVDb25maWcgPSBidWlsZGVyLmJ1aWxkKCk7CisgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgImV4ZWN1dGVUZXN0U3Vic2NyaWJlcjogc3Vic2NyaWJlQ29uZmlnPSIgKyBzdWJzY3JpYmVDb25maWcpOworICAgICAgICBtV2lmaUF3YXJlU2Vzc2lvbi5zdWJzY3JpYmUoc3Vic2NyaWJlQ29uZmlnLCBtRGlzY292ZXJ5Q2IsIG1IYW5kbGVyKTsKKworICAgICAgICAvLyAgICB3YWl0IGZvciByZXN1bHRzIC0gc3Vic2NyaWJlIHNlc3Npb24KKyAgICAgICAgQ2FsbGJhY2tVdGlscy5EaXNjb3ZlcnlDYi5DYWxsYmFja0RhdGEgY2FsbGJhY2tEYXRhID0gbURpc2NvdmVyeUNiLndhaXRGb3JDYWxsYmFja3MoCisgICAgICAgICAgICAgICAgQ2FsbGJhY2tVdGlscy5EaXNjb3ZlcnlDYi5PTl9TVUJTQ1JJQkVfU1RBUlRFRAorICAgICAgICAgICAgICAgICAgICAgICAgfCBDYWxsYmFja1V0aWxzLkRpc2NvdmVyeUNiLk9OX1NFU1NJT05fQ09ORklHX0ZBSUxFRCk7CisgICAgICAgIHN3aXRjaCAoY2FsbGJhY2tEYXRhLmNhbGxiYWNrKSB7CisgICAgICAgICAgICBjYXNlIENhbGxiYWNrVXRpbHMuRGlzY292ZXJ5Q2IuVElNRU9VVDoKKyAgICAgICAgICAgICAgICBzZXRGYWlsdXJlUmVhc29uKG1Db250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5hd2FyZV9zdGF0dXNfc3Vic2NyaWJlX3RpbWVvdXQpKTsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJleGVjdXRlVGVzdFN1YnNjcmliZXI6IHN1YnNjcmliZSBUSU1FT1VUIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgY2FzZSBDYWxsYmFja1V0aWxzLkRpc2NvdmVyeUNiLk9OX1NFU1NJT05fQ09ORklHX0ZBSUxFRDoKKyAgICAgICAgICAgICAgICBzZXRGYWlsdXJlUmVhc29uKG1Db250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5hd2FyZV9zdGF0dXNfc3Vic2NyaWJlX2ZhaWxlZCkpOworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgImV4ZWN1dGVUZXN0U3Vic2NyaWJlcjogc3Vic2NyaWJlIE9OX1NFU1NJT05fQ09ORklHX0ZBSUxFRCIpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBtV2lmaUF3YXJlRGlzY292ZXJ5U2Vzc2lvbiA9IGNhbGxiYWNrRGF0YS5zdWJzY3JpYmVEaXNjb3ZlcnlTZXNzaW9uOworICAgICAgICBpZiAobVdpZmlBd2FyZURpc2NvdmVyeVNlc3Npb24gPT0gbnVsbCkgeworICAgICAgICAgICAgc2V0RmFpbHVyZVJlYXNvbihtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcuYXdhcmVfc3RhdHVzX3N1YnNjcmliZV9udWxsX3Nlc3Npb24pKTsKKyAgICAgICAgICAgIExvZy5lKFRBRywgImV4ZWN1dGVUZXN0U3Vic2NyaWJlcjogc3Vic2NyaWJlIHN1Y2NlZWRlZCBidXQgbnVsbCBzZXNzaW9uIHJldHVybmVkIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgbUxpc3RlbmVyLm9uVGVzdE1zZ1JlY2VpdmVkKG1Db250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5hd2FyZV9zdGF0dXNfc3Vic2NyaWJlX3N0YXJ0ZWQpKTsKKyAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAiZXhlY3V0ZVRlc3RTdWJzY3JpYmVyOiBzdWJzY3JpYmUgc3VjY2VlZGVkIik7CisKKyAgICAgICAgLy8gMy4gd2FpdCBmb3IgZGlzY292ZXJ5CisgICAgICAgIGNhbGxiYWNrRGF0YSA9IG1EaXNjb3ZlcnlDYi53YWl0Rm9yQ2FsbGJhY2tzKAorICAgICAgICAgICAgICAgIG1Jc1JhbmdpbmdSZXF1aXJlZCA/IENhbGxiYWNrVXRpbHMuRGlzY292ZXJ5Q2IuT05fU0VSVklDRV9ESVNDT1ZFUkVEX1dJVEhfUkFOR0UKKyAgICAgICAgICAgICAgICAgICAgICAgIDogQ2FsbGJhY2tVdGlscy5EaXNjb3ZlcnlDYi5PTl9TRVJWSUNFX0RJU0NPVkVSRUQpOworICAgICAgICBzd2l0Y2ggKGNhbGxiYWNrRGF0YS5jYWxsYmFjaykgeworICAgICAgICAgICAgY2FzZSBDYWxsYmFja1V0aWxzLkRpc2NvdmVyeUNiLlRJTUVPVVQ6CisgICAgICAgICAgICAgICAgc2V0RmFpbHVyZVJlYXNvbihtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcuYXdhcmVfc3RhdHVzX2Rpc2NvdmVyeV90aW1lb3V0KSk7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiZXhlY3V0ZVRlc3RTdWJzY3JpYmVyOiB3YWl0aW5nIGZvciBkaXNjb3ZlcnkgVElNRU9VVCIpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBtUGVlckhhbmRsZSA9IGNhbGxiYWNrRGF0YS5wZWVySGFuZGxlOworICAgICAgICBpZiAoIW1Jc1JhbmdpbmdSZXF1aXJlZCkgeworICAgICAgICAgICAgbUxpc3RlbmVyLm9uVGVzdE1zZ1JlY2VpdmVkKG1Db250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5hd2FyZV9zdGF0dXNfZGlzY292ZXJ5KSk7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJleGVjdXRlVGVzdFN1YnNjcmliZXI6IGRpc2NvdmVyeSIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImV4ZWN1dGVUZXN0U3Vic2NyaWJlcjogZGlzY292ZXJ5IHdpdGggcmFuZ2U9IgorICAgICAgICAgICAgICAgICAgICAgICAgKyBjYWxsYmFja0RhdGEuZGlzdGFuY2VNbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyAgICB2YWxpZGF0ZSBkaXNjb3ZlcnkgcGFyYW1ldGVycyBtYXRjaAorICAgICAgICBpZiAobUlzUmFuZ2luZ1JlcXVpcmVkKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1QZWVyTWFjQWRkcmVzcyA9IE1hY0FkZHJlc3MuZnJvbUJ5dGVzKGNhbGxiYWNrRGF0YS5zZXJ2aWNlU3BlY2lmaWNJbmZvKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgc2V0RmFpbHVyZVJlYXNvbihtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcuYXdhcmVfc3RhdHVzX2Rpc2NvdmVyeV9mYWlsKSk7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiZXhlY3V0ZVRlc3RTdWJzY3JpYmVyOiBpbnZhbGlkIE1BQyByZWNlaXZlZCBpbiBTU0k6IHJ4PSciICsgbmV3IFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrRGF0YS5zZXJ2aWNlU3BlY2lmaWNJbmZvKSArICInIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUxpc3RlbmVyLm9uVGVzdE1zZ1JlY2VpdmVkKAorICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5hd2FyZV9zdGF0dXNfZGlzY292ZXJ5X3dpdGhfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGVlck1hY0FkZHJlc3MpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghQXJyYXlzLmVxdWFscyhQVUJfU1NJLCBjYWxsYmFja0RhdGEuc2VydmljZVNwZWNpZmljSW5mbykpIHsKKyAgICAgICAgICAgICAgICBzZXRGYWlsdXJlUmVhc29uKG1Db250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5hd2FyZV9zdGF0dXNfZGlzY292ZXJ5X2ZhaWwpKTsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJleGVjdXRlVGVzdFN1YnNjcmliZXI6IGRpc2NvdmVyeSBidXQgU1NJIG1pc21hdGNoOiByeD0nIiArIG5ldyBTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja0RhdGEuc2VydmljZVNwZWNpZmljSW5mbykgKyAiJyIpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoY2FsbGJhY2tEYXRhLm1hdGNoRmlsdGVyLnNpemUoKSAhPSAxIHx8ICFBcnJheXMuZXF1YWxzKE1BVENIX0ZJTFRFUl9CWVRFUywKKyAgICAgICAgICAgICAgICBjYWxsYmFja0RhdGEubWF0Y2hGaWx0ZXIuZ2V0KDApKSkgeworICAgICAgICAgICAgc2V0RmFpbHVyZVJlYXNvbihtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcuYXdhcmVfc3RhdHVzX2Rpc2NvdmVyeV9mYWlsKSk7CisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICBzYi5hcHBlbmQoInNpemU9IikuYXBwZW5kKGNhbGxiYWNrRGF0YS5tYXRjaEZpbHRlci5zaXplKCkpOworICAgICAgICAgICAgZm9yIChieXRlW10gbWY6IGNhbGxiYWNrRGF0YS5tYXRjaEZpbHRlcikgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLCBlPSciKS5hcHBlbmQobmV3IFN0cmluZyhtZikpLmFwcGVuZCgiJyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTG9nLmUoVEFHLCAiZXhlY3V0ZVRlc3RTdWJzY3JpYmVyOiBkaXNjb3ZlcnkgYnV0IG1hdGNoRmlsdGVyIG1pc21hdGNoOiAiCisgICAgICAgICAgICAgICAgICAgICsgc2IudG9TdHJpbmcoKSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1QZWVySGFuZGxlID09IG51bGwpIHsKKyAgICAgICAgICAgIHNldEZhaWx1cmVSZWFzb24obUNvbnRleHQuZ2V0U3RyaW5nKFIuc3RyaW5nLmF3YXJlX3N0YXR1c19kaXNjb3ZlcnlfZmFpbCkpOworICAgICAgICAgICAgTG9nLmUoVEFHLCAiZXhlY3V0ZVRlc3RTdWJzY3JpYmVyOiBkaXNjb3ZlcnkgYnV0IG51bGwgcGVlckhhbmRsZSIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gNC4gc2VuZCBtZXNzYWdlICYgd2FpdCBmb3Igc2VuZCBzdGF0dXMKKyAgICAgICAgbVdpZmlBd2FyZURpc2NvdmVyeVNlc3Npb24uc2VuZE1lc3NhZ2UobVBlZXJIYW5kbGUsIE1FU1NBR0VfSUQsCisgICAgICAgICAgICAgICAgbUlzUmFuZ2luZ1JlcXVpcmVkID8gbU15TWFjQWRkcmVzcy50b0J5dGVBcnJheSgpIDogTVNHX1NVQl9UT19QVUIpOworICAgICAgICBjYWxsYmFja0RhdGEgPSBtRGlzY292ZXJ5Q2Iud2FpdEZvckNhbGxiYWNrcygKKyAgICAgICAgICAgICAgICBDYWxsYmFja1V0aWxzLkRpc2NvdmVyeUNiLk9OX01FU1NBR0VfU0VORF9TVUNDRUVERUQKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgQ2FsbGJhY2tVdGlscy5EaXNjb3ZlcnlDYi5PTl9NRVNTQUdFX1NFTkRfRkFJTEVEKTsKKyAgICAgICAgc3dpdGNoIChjYWxsYmFja0RhdGEuY2FsbGJhY2spIHsKKyAgICAgICAgICAgIGNhc2UgQ2FsbGJhY2tVdGlscy5EaXNjb3ZlcnlDYi5USU1FT1VUOgorICAgICAgICAgICAgICAgIHNldEZhaWx1cmVSZWFzb24obUNvbnRleHQuZ2V0U3RyaW5nKFIuc3RyaW5nLmF3YXJlX3N0YXR1c19zZW5kX3RpbWVvdXQpKTsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJleGVjdXRlVGVzdFN1YnNjcmliZXI6IHNlbmQgbWVzc2FnZSBUSU1FT1VUIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgY2FzZSBDYWxsYmFja1V0aWxzLkRpc2NvdmVyeUNiLk9OX01FU1NBR0VfU0VORF9GQUlMRUQ6CisgICAgICAgICAgICAgICAgc2V0RmFpbHVyZVJlYXNvbihtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcuYXdhcmVfc3RhdHVzX3NlbmRfZmFpbGVkKSk7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiZXhlY3V0ZVRlc3RTdWJzY3JpYmVyOiBzZW5kIG1lc3NhZ2UgT05fTUVTU0FHRV9TRU5EX0ZBSUxFRCIpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBtTGlzdGVuZXIub25UZXN0TXNnUmVjZWl2ZWQobUNvbnRleHQuZ2V0U3RyaW5nKFIuc3RyaW5nLmF3YXJlX3N0YXR1c19zZW5kX3N1Y2Nlc3MpKTsKKyAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAiZXhlY3V0ZVRlc3RTdWJzY3JpYmVyOiBzZW5kIG1lc3NhZ2Ugc3VjY2VlZGVkIik7CisKKyAgICAgICAgaWYgKGNhbGxiYWNrRGF0YS5tZXNzYWdlSWQgIT0gTUVTU0FHRV9JRCkgeworICAgICAgICAgICAgc2V0RmFpbHVyZVJlYXNvbihtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcuYXdhcmVfc3RhdHVzX3NlbmRfZmFpbF9wYXJhbWV0ZXIpKTsKKyAgICAgICAgICAgIExvZy5lKFRBRywgImV4ZWN1dGVUZXN0U3Vic2NyaWJlcjogc2VuZCBtZXNzYWdlIG1lc3NhZ2UgSUQgbWlzbWF0Y2g6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBjYWxsYmFja0RhdGEubWVzc2FnZUlkKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIGV4ZWN1dGVQdWJsaXNoKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gMS4gYXR0YWNoCisgICAgICAgIGlmICghZXhlY3V0ZUF0dGFjaCgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBtRGlzY292ZXJ5Q2IgPSBuZXcgQ2FsbGJhY2tVdGlscy5EaXNjb3ZlcnlDYigpOworCisgICAgICAgIC8vIDIuIHB1Ymxpc2gKKyAgICAgICAgTGlzdDxieXRlW10+IG1hdGNoRmlsdGVyID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIG1hdGNoRmlsdGVyLmFkZChNQVRDSF9GSUxURVJfQllURVMpOworICAgICAgICBQdWJsaXNoQ29uZmlnIHB1Ymxpc2hDb25maWcgPSBuZXcgUHVibGlzaENvbmZpZy5CdWlsZGVyKCkuc2V0U2VydmljZU5hbWUoCisgICAgICAgICAgICAgICAgU0VSVklDRV9OQU1FKS5zZXRTZXJ2aWNlU3BlY2lmaWNJbmZvKAorICAgICAgICAgICAgICAgIG1Jc1JhbmdpbmdSZXF1aXJlZCA/IG1NeU1hY0FkZHJlc3MudG9CeXRlQXJyYXkoKSA6IFBVQl9TU0kpLnNldE1hdGNoRmlsdGVyKAorICAgICAgICAgICAgICAgIG1hdGNoRmlsdGVyKS5zZXRQdWJsaXNoVHlwZShtSXNVbnNvbGljaXRlZCA/IFB1Ymxpc2hDb25maWcuUFVCTElTSF9UWVBFX1VOU09MSUNJVEVECisgICAgICAgICAgICAgICAgOiBQdWJsaXNoQ29uZmlnLlBVQkxJU0hfVFlQRV9TT0xJQ0lURUQpLnNldFRlcm1pbmF0ZU5vdGlmaWNhdGlvbkVuYWJsZWQoCisgICAgICAgICAgICAgICAgdHJ1ZSkuc2V0UmFuZ2luZ0VuYWJsZWQobUlzUmFuZ2luZ1JlcXVpcmVkKS5idWlsZCgpOworICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJleGVjdXRlVGVzdFB1Ymxpc2hlcjogcHVibGlzaENvbmZpZz0iICsgcHVibGlzaENvbmZpZyk7CisgICAgICAgIG1XaWZpQXdhcmVTZXNzaW9uLnB1Ymxpc2gocHVibGlzaENvbmZpZywgbURpc2NvdmVyeUNiLCBtSGFuZGxlcik7CisKKyAgICAgICAgLy8gICAgd2FpdCBmb3IgcmVzdWx0cyAtIHB1Ymxpc2ggc2Vzc2lvbgorICAgICAgICBDYWxsYmFja1V0aWxzLkRpc2NvdmVyeUNiLkNhbGxiYWNrRGF0YSBjYWxsYmFja0RhdGEgPSBtRGlzY292ZXJ5Q2Iud2FpdEZvckNhbGxiYWNrcygKKyAgICAgICAgICAgICAgICBDYWxsYmFja1V0aWxzLkRpc2NvdmVyeUNiLk9OX1BVQkxJU0hfU1RBUlRFRAorICAgICAgICAgICAgICAgICAgICAgICAgfCBDYWxsYmFja1V0aWxzLkRpc2NvdmVyeUNiLk9OX1NFU1NJT05fQ09ORklHX0ZBSUxFRCk7CisgICAgICAgIHN3aXRjaCAoY2FsbGJhY2tEYXRhLmNhbGxiYWNrKSB7CisgICAgICAgICAgICBjYXNlIENhbGxiYWNrVXRpbHMuRGlzY292ZXJ5Q2IuVElNRU9VVDoKKyAgICAgICAgICAgICAgICBzZXRGYWlsdXJlUmVhc29uKG1Db250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5hd2FyZV9zdGF0dXNfcHVibGlzaF90aW1lb3V0KSk7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiZXhlY3V0ZVRlc3RQdWJsaXNoZXI6IHB1Ymxpc2ggVElNRU9VVCIpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGNhc2UgQ2FsbGJhY2tVdGlscy5EaXNjb3ZlcnlDYi5PTl9TRVNTSU9OX0NPTkZJR19GQUlMRUQ6CisgICAgICAgICAgICAgICAgc2V0RmFpbHVyZVJlYXNvbihtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcuYXdhcmVfc3RhdHVzX3B1Ymxpc2hfZmFpbGVkKSk7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiZXhlY3V0ZVRlc3RQdWJsaXNoZXI6IHB1Ymxpc2ggT05fU0VTU0lPTl9DT05GSUdfRkFJTEVEIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIG1XaWZpQXdhcmVEaXNjb3ZlcnlTZXNzaW9uID0gY2FsbGJhY2tEYXRhLnB1Ymxpc2hEaXNjb3ZlcnlTZXNzaW9uOworICAgICAgICBpZiAobVdpZmlBd2FyZURpc2NvdmVyeVNlc3Npb24gPT0gbnVsbCkgeworICAgICAgICAgICAgc2V0RmFpbHVyZVJlYXNvbihtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcuYXdhcmVfc3RhdHVzX3B1Ymxpc2hfbnVsbF9zZXNzaW9uKSk7CisgICAgICAgICAgICBMb2cuZShUQUcsICJleGVjdXRlVGVzdFB1Ymxpc2hlcjogcHVibGlzaCBzdWNjZWVkZWQgYnV0IG51bGwgc2Vzc2lvbiByZXR1cm5lZCIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIG1MaXN0ZW5lci5vblRlc3RNc2dSZWNlaXZlZChtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcuYXdhcmVfc3RhdHVzX3B1Ymxpc2hfc3RhcnRlZCkpOworICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJleGVjdXRlVGVzdFB1Ymxpc2hlcjogcHVibGlzaCBzdWNjZWVkZWQiKTsKKworICAgICAgICAvLyAzLiB3YWl0IHRvIHJlY2VpdmUgbWVzc2FnZTogbm8gdGltZW91dCBzaW5jZSB0aGlzIGRlcGVuZHMgb24gKGh1bWFuKSBvcGVyYXRvciBzdGFydGluZworICAgICAgICAvLyAgICB0aGUgdGVzdCBvbiB0aGUgc3Vic2NyaWJlciBkZXZpY2UuCisgICAgICAgIGNhbGxiYWNrRGF0YSA9IG1EaXNjb3ZlcnlDYi53YWl0Rm9yQ2FsbGJhY2tzTm9UaW1lb3V0KAorICAgICAgICAgICAgICAgIENhbGxiYWNrVXRpbHMuRGlzY292ZXJ5Q2IuT05fTUVTU0FHRV9SRUNFSVZFRCk7CisgICAgICAgIG1QZWVySGFuZGxlID0gY2FsbGJhY2tEYXRhLnBlZXJIYW5kbGU7CisgICAgICAgIG1MaXN0ZW5lci5vblRlc3RNc2dSZWNlaXZlZChtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcuYXdhcmVfc3RhdHVzX3JlY2VpdmVkKSk7CisgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgImV4ZWN1dGVUZXN0UHVibGlzaGVyOiByZWNlaXZlZCBtZXNzYWdlIik7CisKKyAgICAgICAgLy8gICAgdmFsaWRhdGUgdGhhdCByZWNlaXZlZCB0aGUgZXhwZWN0ZWQgbWVzc2FnZQorICAgICAgICBpZiAobUlzUmFuZ2luZ1JlcXVpcmVkKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1QZWVyTWFjQWRkcmVzcyA9IE1hY0FkZHJlc3MuZnJvbUJ5dGVzKGNhbGxiYWNrRGF0YS5zZXJ2aWNlU3BlY2lmaWNJbmZvKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgc2V0RmFpbHVyZVJlYXNvbihtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcuYXdhcmVfc3RhdHVzX2Rpc2NvdmVyeV9mYWlsKSk7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiZXhlY3V0ZVRlc3RTdWJzY3JpYmVyOiBpbnZhbGlkIE1BQyByZWNlaXZlZCBpbiBTU0k6IHJ4PSciICsgbmV3IFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrRGF0YS5zZXJ2aWNlU3BlY2lmaWNJbmZvKSArICInIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUxpc3RlbmVyLm9uVGVzdE1zZ1JlY2VpdmVkKG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLmF3YXJlX3N0YXR1c19yZWNlaXZlZF9tYWMsCisgICAgICAgICAgICAgICAgICAgIG1QZWVyTWFjQWRkcmVzcykpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCFBcnJheXMuZXF1YWxzKE1TR19TVUJfVE9fUFVCLCBjYWxsYmFja0RhdGEuc2VydmljZVNwZWNpZmljSW5mbykpIHsKKyAgICAgICAgICAgICAgICBzZXRGYWlsdXJlUmVhc29uKG1Db250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5hd2FyZV9zdGF0dXNfcmVjZWl2ZV9mYWlsdXJlKSk7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiZXhlY3V0ZVRlc3RQdWJsaXNoZXI6IHJlY2VpdmUgbWVzc2FnZSBtZXNzYWdlIGNvbnRlbnQgbWlzbWF0Y2g6IHJ4PSciCisgICAgICAgICAgICAgICAgICAgICAgICArIG5ldyBTdHJpbmcoY2FsbGJhY2tEYXRhLnNlcnZpY2VTcGVjaWZpY0luZm8pICsgIiciKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1QZWVySGFuZGxlID09IG51bGwpIHsKKyAgICAgICAgICAgIHNldEZhaWx1cmVSZWFzb24obUNvbnRleHQuZ2V0U3RyaW5nKFIuc3RyaW5nLmF3YXJlX3N0YXR1c19yZWNlaXZlX2ZhaWx1cmUpKTsKKyAgICAgICAgICAgIExvZy5lKFRBRywgImV4ZWN1dGVUZXN0UHVibGlzaGVyOiByZWNlaXZlZCBtZXNzYWdlIGJ1dCBwZWVySGFuZGxlIGlzIG51bGwhPyIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0RmFpbHVyZVJlYXNvbihTdHJpbmcgcmVhc29uKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIG1GYWlsdXJlUmVhc29uID0gcmVhc29uOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRGYWlsdXJlUmVhc29uKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICByZXR1cm4gbUZhaWx1cmVSZWFzb247CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKKyAgICAgICAgaWYgKG1XaWZpQXdhcmVEaXNjb3ZlcnlTZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1XaWZpQXdhcmVEaXNjb3ZlcnlTZXNzaW9uLmNsb3NlKCk7CisgICAgICAgICAgICBtV2lmaUF3YXJlRGlzY292ZXJ5U2Vzc2lvbiA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1XaWZpQXdhcmVTZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1XaWZpQXdhcmVTZXNzaW9uLmNsb3NlKCk7CisgICAgICAgICAgICBtV2lmaUF3YXJlU2Vzc2lvbiA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvd2lmaWF3YXJlL3Rlc3RjYXNlL0Rpc2NvdmVyeVdpdGhSYW5naW5nVGVzdENhc2UuamF2YSBiL2FwcHMvQ3RzVmVyaWZpZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllci93aWZpYXdhcmUvdGVzdGNhc2UvRGlzY292ZXJ5V2l0aFJhbmdpbmdUZXN0Q2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwOWJlZGMKLS0tIC9kZXYvbnVsbAorKysgYi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvd2lmaWF3YXJlL3Rlc3RjYXNlL0Rpc2NvdmVyeVdpdGhSYW5naW5nVGVzdENhc2UuamF2YQpAQCAtMCwwICsxLDI3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLndpZmlhd2FyZS50ZXN0Y2FzZTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQubmV0LndpZmkucnR0LlJhbmdpbmdSZXF1ZXN0OworaW1wb3J0IGFuZHJvaWQubmV0LndpZmkucnR0LlJhbmdpbmdSZXN1bHQ7CitpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5ydHQuV2lmaVJ0dE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuUGFpcjsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci5SOworaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci53aWZpYXdhcmUuQ2FsbGJhY2tVdGlsczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogVGVzdCBjYXNlIGZvciBEaXNjb3ZlcnkgKyBSYW5naW5nOgorICoKKyAqIFN1YnNjcmliZSB0ZXN0IHNlcXVlbmNlOgorICogMS4gQXR0YWNoCisgKiAgICB3YWl0IGZvciByZXN1bHRzIChzZXNzaW9uKQorICogMi4gU3Vic2NyaWJlCisgKiAgICB3YWl0IGZvciByZXN1bHRzIChzdWJzY3JpYmUgc2Vzc2lvbikKKyAqIDMuIFdhaXQgZm9yIGRpc2NvdmVyeSB3aXRoIHJhbmdpbmcKKyAqIDQuIFNlbmQgbWVzc2FnZQorICogICAgV2FpdCBmb3Igc3VjY2VzcworICogNS4gV2FpdCBmb3IgbWVzc2FnZSAoImRvbmUgd2l0aCBSVFQiKQorICogNi4gRGlyZWN0ZWQgUmFuZ2UgdG8gUGVlciB3aXRoIFBlZXJIYW5kbGUKKyAqIDcuIERpcmVjdGVkIFJhbmdlIHRvIFBlZXIgd2l0aCBNQUMgYWRkcmVzcworICogOC4gU2VuZCBtZXNzYWdlICgiZG9uZSB3aXRoIFJUVCIpCisgKiAgICBXYWl0IGZvciBzdWNjZXNzCisgKiBMQVNULiBEZXN0cm95IHNlc3Npb24KKyAqCisgKiBQdWJsaXNoIHRlc3Qgc2VxdWVuY2U6CisgKiAxLiBBdHRhY2gKKyAqICAgIHdhaXQgZm9yIHJlc3VsdHMgKHNlc3Npb24pCisgKiAyLiBQdWJsaXNoCisgKiAgICB3YWl0IGZvciByZXN1bHRzIChwdWJsaXNoIHNlc3Npb24pCisgKiAzLiBXYWl0IGZvciByeCBtZXNzYWdlCisgKiA0LiBEaXJlY3RlZCBSYW5nZSB0byBQZWVyIHdpdGggUGVlckhhbmRsZXIKKyAqIDUuIERpcmVjdGVkIFJhbmdlIHRvIFBlZXIgd2l0aCBNQUMgYWRkcmVzcworICogNi4gU2VuZCBtZXNzYWdlICgiZG9uZSB3aXRoIFJUVCIpCisgKiAgICBXYWl0IGZvciBzdWNjZXNzCisgKiA3LiBXYWl0IGZvciBNZXNzYWdlICgiZG9uZSB3aXRoIFJUVCIpCisgKiBMQVNULiBEZXN0cm95IHNlc3Npb24KKyAqCisgKiBWYWxpZGF0ZSB0aGF0IG1lYXN1cmVkIHJhbmdlIGlzICJyZWFzb25hYmxlIiAoaS5lLiAwIDw9IFggPD0gU1BFQ0lGSUVEX0xBUkdFX1JBTkdFKS4KKyAqCisgKiBOb3RlIHRoYXQgdGhlIHByb2Nlc3MgdHJpZXMgdG8gcHJldmVudCBSVFQgY29uY3VycmVuY3ksIGVhY2ggcGVlciB3aWxsIGV4ZWN1dGUgUlRUIGluCisgKiBzZXF1ZW5jZS4KKyAqLworcHVibGljIGNsYXNzIERpc2NvdmVyeVdpdGhSYW5naW5nVGVzdENhc2UgZXh0ZW5kcyBEaXNjb3ZlcnlCYXNlVGVzdENhc2UgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRGlzY1dpdGhSYW5naW5nVGVzdENhc2UiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gdHJ1ZTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOVU1fUlRUX0lURVJBVElPTlMgPSAxMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1JUVF9SQU5HSU5HX1NVQ0NFU1MgPSA1OyAvLyBoaWdoOiBidXQgb3BlbiBlbnZpcm9ubWVudAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNSU5fUlNTSSA9IC0xMDA7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gTVNHX1JUVCA9ICJEb25lIHdpdGggUlRUIi5nZXRCeXRlcygpOworCisgICAgcHJpdmF0ZSBXaWZpUnR0TWFuYWdlciBtV2lmaVJ0dE1hbmFnZXI7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Jc1B1Ymxpc2g7CisKKyAgICBwdWJsaWMgRGlzY292ZXJ5V2l0aFJhbmdpbmdUZXN0Q2FzZShDb250ZXh0IGNvbnRleHQsIGJvb2xlYW4gaXNQdWJsaXNoKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIHRydWUsIHRydWUpOworCisgICAgICAgIG1XaWZpUnR0TWFuYWdlciA9IChXaWZpUnR0TWFuYWdlcikgbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZSgKKyAgICAgICAgICAgICAgICBDb250ZXh0LldJRklfUlRUX1JBTkdJTkdfU0VSVklDRSk7CisgICAgICAgIG1Jc1B1Ymxpc2ggPSBpc1B1Ymxpc2g7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZXhlY3V0ZVRlc3QoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBib29sZWFuIHN0YXR1cyA9IGV4ZWN1dGVUZXN0TG9jYWwoKTsKKworICAgICAgICAvLyBMQVNULiBkZXN0cm95IHNlc3Npb24KKyAgICAgICAgaWYgKG1XaWZpQXdhcmVEaXNjb3ZlcnlTZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1XaWZpQXdhcmVEaXNjb3ZlcnlTZXNzaW9uLmNsb3NlKCk7CisgICAgICAgICAgICBtV2lmaUF3YXJlRGlzY292ZXJ5U2Vzc2lvbiA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFjdHVhbCB0ZXN0IGV4ZWN1dGlvbiAoYW5vdGhlciBsZXZlbCBvZiBhYnN0cmFjdGlvbiB0byBndWFyYW50ZWUgY2xlYW4tdXAgY29kZSBnZXRzCisgICAgICogZXhlY3V0ZWQgYnkgcGFyZW50IG1ldGhvZCkuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGV4ZWN1dGVUZXN0TG9jYWwoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJleGVjdXRlVGVzdDogbUlzUHVibGlzaD0iICsgbUlzUHVibGlzaCk7CisKKyAgICAgICAgaWYgKG1Jc1B1Ymxpc2gpIHsKKyAgICAgICAgICAgIGlmICghZXhlY3V0ZVB1Ymxpc2goKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghZXhlY3V0ZVN1YnNjcmliZSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtSXNQdWJsaXNoKSB7CisgICAgICAgICAgICBtTGlzdGVuZXIub25UZXN0TXNnUmVjZWl2ZWQoCisgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5hd2FyZV9zdGF0dXNfd2FpdGluZ19mb3JfcGVlcl9ydHQpKTsKKworICAgICAgICAgICAgLy8gcGF1c2luZyB0byBsZXQgUHVibGlzaGVyIHBlcmZvcm0gaXRzIFJUVCBvcGVyYXRpb25zIChob3dldmVyIGxvbmcpCisgICAgICAgICAgICBDYWxsYmFja1V0aWxzLkRpc2NvdmVyeUNiLkNhbGxiYWNrRGF0YSBjYWxsYmFja0RhdGEgPQorICAgICAgICAgICAgICAgICAgICBtRGlzY292ZXJ5Q2Iud2FpdEZvckNhbGxiYWNrc05vVGltZW91dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsYmFja1V0aWxzLkRpc2NvdmVyeUNiLk9OX01FU1NBR0VfUkVDRUlWRUQpOworICAgICAgICAgICAgaWYgKCFBcnJheXMuZXF1YWxzKE1TR19SVFQsIGNhbGxiYWNrRGF0YS5zZXJ2aWNlU3BlY2lmaWNJbmZvKSkgeworICAgICAgICAgICAgICAgIHNldEZhaWx1cmVSZWFzb24obUNvbnRleHQuZ2V0U3RyaW5nKFIuc3RyaW5nLmF3YXJlX3N0YXR1c19yZWNlaXZlX2ZhaWx1cmUpKTsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJleGVjdXRlVGVzdDogcmVjZWl2ZSBSVFQgbWVzc2FnZSBjb250ZW50IG1pc21hdGNoOiByeD0iICsgKAorICAgICAgICAgICAgICAgICAgICAoY2FsbGJhY2tEYXRhLnNlcnZpY2VTcGVjaWZpY0luZm8gPT0gbnVsbCkgPyAiPG51bGw+IgorICAgICAgICAgICAgICAgICAgICAgICAgOiAoIiciICsgbmV3IFN0cmluZyhjYWxsYmFja0RhdGEuc2VydmljZVNwZWNpZmljSW5mbykgKyAiJyIpKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtTGlzdGVuZXIub25UZXN0TXNnUmVjZWl2ZWQoCisgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5hd2FyZV9zdGF0dXNfcmVjZWl2ZWRfcGVlcl9ydHRfZG9uZSkpOworCisgICAgICAgICAgICAvLyB3YWl0IGEgZmV3IHNlY29uZHMgdG8gYWxsb3cgdGhlIHByZXZpb3VzIFJUVCBzZXNzaW9uIHRvIHRlYXJkb3duLCBzZW1pLWFyYml0cmFyeQorICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDUwMDApOworCisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJleGVjdXRlVGVzdDogc3Vic2NyaWJlciByZWNlaXZlZCBtZXNzYWdlIC0gY2FuIHByb2NlZWQgd2l0aCBSVFQiKTsKKyAgICAgICAgfQorCisgICAgICAgIG1MaXN0ZW5lci5vblRlc3RNc2dSZWNlaXZlZChtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcuYXdhcmVfc3RhdHVzX3N0YXJ0aW5nX3J0dCkpOworCisgICAgICAgIC8vIERpcmVjdGVkIHJhbmdlIHRvIHBlZXIgd2l0aCBQZWVySGFuZGxlcgorICAgICAgICBpbnQgbnVtRmFpbHVyZXNUb1BlZXJIYW5kbGUgPSAwOworICAgICAgICBSYW5naW5nUmVxdWVzdCByYW5nZVRvUGVlckhhbmRsZSA9IG5ldyBSYW5naW5nUmVxdWVzdC5CdWlsZGVyKCkuYWRkV2lmaUF3YXJlUGVlcigKKyAgICAgICAgICAgICAgICBtUGVlckhhbmRsZSkuYnVpbGQoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fUlRUX0lURVJBVElPTlM7ICsraSkgeworICAgICAgICAgICAgaWYgKCFleGVjdXRlUmFuZ2luZyhyYW5nZVRvUGVlckhhbmRsZSkpIHsKKyAgICAgICAgICAgICAgICBudW1GYWlsdXJlc1RvUGVlckhhbmRsZSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIExvZy5kKFRBRywgImV4ZWN1dGVUZXN0OiBEaXJlY3QgUlRUIHRvIFBlZXJIYW5kbGUgIiArIG51bUZhaWx1cmVzVG9QZWVySGFuZGxlICsgIiBvZiAiCisgICAgICAgICAgICAgICAgKyBOVU1fUlRUX0lURVJBVElPTlMgKyAiIEZBSUwiKTsKKyAgICAgICAgaWYgKG51bUZhaWx1cmVzVG9QZWVySGFuZGxlID4gTUFYX1JUVF9SQU5HSU5HX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIG1MaXN0ZW5lci5vblRlc3RNc2dSZWNlaXZlZCgKKyAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0U3RyaW5nKFIuc3RyaW5nLmF3YXJlX3N0YXR1c19yYW5naW5nX3BlZXJfZmFpbHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1GYWlsdXJlc1RvUGVlckhhbmRsZSwgTlVNX1JUVF9JVEVSQVRJT05TKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtTGlzdGVuZXIub25UZXN0TXNnUmVjZWl2ZWQoCisgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5hd2FyZV9zdGF0dXNfcmFuZ2luZ19wZWVyX3N1Y2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVNX1JUVF9JVEVSQVRJT05TIC0gbnVtRmFpbHVyZXNUb1BlZXJIYW5kbGUsIE5VTV9SVFRfSVRFUkFUSU9OUykpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRGlyZWN0ZWQgcmFuZ2UgdG8gcGVlciB3aXRoIE1BQyBhZGRyZXNzCisgICAgICAgIGludCBudW1GYWlsdXJlc1RvUGVlck1hYyA9IDA7CisgICAgICAgIFJhbmdpbmdSZXF1ZXN0IHJhbmdlVG9NQUMgPSBuZXcgUmFuZ2luZ1JlcXVlc3QuQnVpbGRlcigpLmFkZFdpZmlBd2FyZVBlZXIoCisgICAgICAgICAgICAgICAgbVBlZXJNYWNBZGRyZXNzKS5idWlsZCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9SVFRfSVRFUkFUSU9OUzsgKytpKSB7CisgICAgICAgICAgICBpZiAoIWV4ZWN1dGVSYW5naW5nKHJhbmdlVG9NQUMpKSB7CisgICAgICAgICAgICAgICAgbnVtRmFpbHVyZXNUb1BlZXJNYWMrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBMb2cuZShUQUcsICJleGVjdXRlVGVzdDogRGlyZWN0IFJUVCB0byBNQUMgIiArIG51bUZhaWx1cmVzVG9QZWVyTWFjICsgIiBvZiAiCisgICAgICAgICAgICAgICAgKyBOVU1fUlRUX0lURVJBVElPTlMgKyAiIEZBSUwiKTsKKyAgICAgICAgaWYgKG51bUZhaWx1cmVzVG9QZWVyTWFjID4gTUFYX1JUVF9SQU5HSU5HX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIG1MaXN0ZW5lci5vblRlc3RNc2dSZWNlaXZlZCgKKyAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0U3RyaW5nKFIuc3RyaW5nLmF3YXJlX3N0YXR1c19yYW5naW5nX21hY19mYWlsdXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUZhaWx1cmVzVG9QZWVyTWFjLCBOVU1fUlRUX0lURVJBVElPTlMpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1MaXN0ZW5lci5vblRlc3RNc2dSZWNlaXZlZCgKKyAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0U3RyaW5nKFIuc3RyaW5nLmF3YXJlX3N0YXR1c19yYW5naW5nX21hY19zdWNjZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTV9SVFRfSVRFUkFUSU9OUyAtIG51bUZhaWx1cmVzVG9QZWVyTWFjLCBOVU1fUlRUX0lURVJBVElPTlMpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGxldCBwZWVyIGtub3cgd2UncmUgZG9uZSB3aXRoIG91ciBSVFQKKyAgICAgICAgbVdpZmlBd2FyZURpc2NvdmVyeVNlc3Npb24uc2VuZE1lc3NhZ2UobVBlZXJIYW5kbGUsIE1FU1NBR0VfSUQgKyAyLCBNU0dfUlRUKTsKKyAgICAgICAgQ2FsbGJhY2tVdGlscy5EaXNjb3ZlcnlDYi5DYWxsYmFja0RhdGEgY2FsbGJhY2tEYXRhID0gbURpc2NvdmVyeUNiLndhaXRGb3JDYWxsYmFja3MoCisgICAgICAgICAgICAgICAgQ2FsbGJhY2tVdGlscy5EaXNjb3ZlcnlDYi5PTl9NRVNTQUdFX1NFTkRfU1VDQ0VFREVECisgICAgICAgICAgICAgICAgICAgICAgICB8IENhbGxiYWNrVXRpbHMuRGlzY292ZXJ5Q2IuT05fTUVTU0FHRV9TRU5EX0ZBSUxFRCk7CisgICAgICAgIHN3aXRjaCAoY2FsbGJhY2tEYXRhLmNhbGxiYWNrKSB7CisgICAgICAgICAgICBjYXNlIENhbGxiYWNrVXRpbHMuRGlzY292ZXJ5Q2IuVElNRU9VVDoKKyAgICAgICAgICAgICAgICBzZXRGYWlsdXJlUmVhc29uKG1Db250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5hd2FyZV9zdGF0dXNfc2VuZF90aW1lb3V0KSk7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiZXhlY3V0ZVRlc3Q6IHNlbmQgbWVzc2FnZSBUSU1FT1VUIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgY2FzZSBDYWxsYmFja1V0aWxzLkRpc2NvdmVyeUNiLk9OX01FU1NBR0VfU0VORF9GQUlMRUQ6CisgICAgICAgICAgICAgICAgc2V0RmFpbHVyZVJlYXNvbihtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcuYXdhcmVfc3RhdHVzX3NlbmRfZmFpbGVkKSk7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiZXhlY3V0ZVRlc3Q6IHNlbmQgbWVzc2FnZSBPTl9NRVNTQUdFX1NFTkRfRkFJTEVEIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChEQkcpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgImV4ZWN1dGVUZXN0OiBzZW50IG1lc3NhZ2UgdG8gcGVlciAtIEknbSBkb25lIHdpdGggUlRUIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUlzUHVibGlzaCkgeworICAgICAgICAgICAgbUxpc3RlbmVyLm9uVGVzdE1zZ1JlY2VpdmVkKAorICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcuYXdhcmVfc3RhdHVzX3dhaXRpbmdfZm9yX3BlZXJfcnR0KSk7CisKKyAgICAgICAgICAgIC8vIHRoZW4gcGF1c2luZyB0byBsZXQgU3Vic2NyaWJlciBmaW5pc2ggaXQncyBSVFQgKGNhbid0IHRlcm1pbmF0ZSBvdXIgQXdhcmUgc2Vzc2lvbgorICAgICAgICAgICAgLy8gd2hpbGUgd2Ugd2FudCBBd2FyZSBvcGVyYXRpb25zIHRvIHByb2NlZWQhKS4KKyAgICAgICAgICAgIGNhbGxiYWNrRGF0YSA9IG1EaXNjb3ZlcnlDYi53YWl0Rm9yQ2FsbGJhY2tzTm9UaW1lb3V0KAorICAgICAgICAgICAgICAgICAgICBDYWxsYmFja1V0aWxzLkRpc2NvdmVyeUNiLk9OX01FU1NBR0VfUkVDRUlWRUQpOworICAgICAgICAgICAgaWYgKCFBcnJheXMuZXF1YWxzKE1TR19SVFQsIGNhbGxiYWNrRGF0YS5zZXJ2aWNlU3BlY2lmaWNJbmZvKSkgeworICAgICAgICAgICAgICAgIHNldEZhaWx1cmVSZWFzb24obUNvbnRleHQuZ2V0U3RyaW5nKFIuc3RyaW5nLmF3YXJlX3N0YXR1c19yZWNlaXZlX2ZhaWx1cmUpKTsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJleGVjdXRlVGVzdDogcmVjZWl2ZSBSVFQgbWVzc2FnZSBjb250ZW50IG1pc21hdGNoOiByeD0iICsgKAorICAgICAgICAgICAgICAgICAgICAoY2FsbGJhY2tEYXRhLnNlcnZpY2VTcGVjaWZpY0luZm8gPT0gbnVsbCkgPyAiPG51bGw+IgorICAgICAgICAgICAgICAgICAgICAgICAgOiAoIiciICsgbmV3IFN0cmluZyhjYWxsYmFja0RhdGEuc2VydmljZVNwZWNpZmljSW5mbykgKyAiJyIpKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUxpc3RlbmVyLm9uVGVzdE1zZ1JlY2VpdmVkKAorICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcuYXdhcmVfc3RhdHVzX3JlY2VpdmVkX3BlZXJfcnR0X2RvbmUpKTsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgImV4ZWN1dGVUZXN0OiBwdWJsaXNoZXIgcmVjZWl2ZWQgbWVzc2FnZSAtIGNhbiBwcm9jZWVkIChmaW5pc2gpIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAobnVtRmFpbHVyZXNUb1BlZXJIYW5kbGUgPiBNQVhfUlRUX1JBTkdJTkdfU1VDQ0VTUworICAgICAgICAgICAgICAgIHx8IG51bUZhaWx1cmVzVG9QZWVyTWFjID4gTUFYX1JUVF9SQU5HSU5HX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIHNldEZhaWx1cmVSZWFzb24obUNvbnRleHQuZ2V0U3RyaW5nKFIuc3RyaW5nLmF3YXJlX3N0YXR1c19saWZlY3ljbGVfZmFpbGVkLAorICAgICAgICAgICAgICAgICAgICBudW1GYWlsdXJlc1RvUGVlckhhbmRsZSwgTlVNX1JUVF9JVEVSQVRJT05TKSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBtTGlzdGVuZXIub25UZXN0TXNnUmVjZWl2ZWQobUNvbnRleHQuZ2V0U3RyaW5nKFIuc3RyaW5nLmF3YXJlX3N0YXR1c19saWZlY3ljbGVfb2spKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGV4ZWN1dGVSYW5naW5nKFJhbmdpbmdSZXF1ZXN0IHJlcXVlc3QpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIENhbGxiYWNrVXRpbHMuUmFuZ2luZ0NiIHJhbmdpbmdDYiA9IG5ldyBDYWxsYmFja1V0aWxzLlJhbmdpbmdDYigpOworICAgICAgICBtV2lmaVJ0dE1hbmFnZXIuc3RhcnRSYW5naW5nKHJlcXVlc3QsIGNvbW1hbmQgLT4gbUhhbmRsZXIucG9zdChjb21tYW5kKSwgcmFuZ2luZ0NiKTsKKyAgICAgICAgUGFpcjxJbnRlZ2VyLCBMaXN0PFJhbmdpbmdSZXN1bHQ+PiByZXN1bHRzID0gcmFuZ2luZ0NiLndhaXRGb3JSYW5naW5nUmVzdWx0cygpOworICAgICAgICBzd2l0Y2ggKHJlc3VsdHMuZmlyc3QpIHsKKyAgICAgICAgICAgIGNhc2UgQ2FsbGJhY2tVdGlscy5SYW5naW5nQ2IuVElNRU9VVDoKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJleGVjdXRlUmFuZ2luZzogcmFuZ2luZyB0byBwZWVyIFRJTUVPVVQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBjYXNlIENhbGxiYWNrVXRpbHMuUmFuZ2luZ0NiLk9OX0ZBSUxVUkU6CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiZXhlY3V0ZVJhbmdpbmc6IHJhbmdpbmcgcGVlciBPTl9GQUlMVVJFIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChyZXN1bHRzLnNlY29uZCA9PSBudWxsIHx8IHJlc3VsdHMuc2Vjb25kLnNpemUoKSAhPSAxKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJleGVjdXRlUmFuZ2luZzogcmFuZ2luZyBwZWVyIGludmFsaWQgcmVzdWx0cyAtIG51bGwsIGVtcHR5LCBvciB3cm9uZyBsZW5ndGgiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBSYW5naW5nUmVzdWx0IHJlc3VsdCA9IHJlc3VsdHMuc2Vjb25kLmdldCgwKTsKKyAgICAgICAgaWYgKHJlc3VsdC5nZXRTdGF0dXMoKSAhPSBSYW5naW5nUmVzdWx0LlNUQVRVU19TVUNDRVNTKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJleGVjdXRlUmFuZ2luZzogcmFuZ2luZyBwZWVyIGZhaWxlZCAtIGluZGl2aWR1YWwgcmVzdWx0IGZhaWx1cmUgY29kZSA9ICIKKyAgICAgICAgICAgICAgICAgICAgKyByZXN1bHQuZ2V0U3RhdHVzKCkpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGludCBkaXN0YW5jZU1tID0gcmVzdWx0LmdldERpc3RhbmNlTW0oKTsKKyAgICAgICAgaW50IHJzc2kgPSByZXN1bHQuZ2V0UnNzaSgpOworCisgICAgICAgIGlmIChkaXN0YW5jZU1tID4gTEFSR0VfRU5PVUdIX0RJU1RBTkNFIHx8IHJzc2kgPCBNSU5fUlNTSSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiZXhlY3V0ZVJhbmdpbmc6IHJhbmdpbmcgcGVlciBmYWlsZWQgLSBpbnZhbGlkIHJlc3VsdHM6IHJlc3VsdD0iICsgcmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIExvZy5kKFRBRywgImV4ZWN1dGVSYW5naW5nOiByZXN1bHQ9IiArIHJlc3VsdCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXJVU0JDb21wYW5pb24vQW5kcm9pZC5tayBiL2FwcHMvQ3RzVmVyaWZpZXJVU0JDb21wYW5pb24vQW5kcm9pZC5tawppbmRleCAxM2U1NjVlLi4yZTA4MTQyIDEwMDY0NAotLS0gYS9hcHBzL0N0c1ZlcmlmaWVyVVNCQ29tcGFuaW9uL0FuZHJvaWQubWsKKysrIGIvYXBwcy9DdHNWZXJpZmllclVTQkNvbXBhbmlvbi9BbmRyb2lkLm1rCkBAIC0yMSwxMyArMjEsMTMgQEAKIAogTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKIAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQtc3VwcG9ydC1hbm5vdGF0aW9ucyBqdW5pdAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWR4LmFubm90YXRpb25fYW5ub3RhdGlvbiBqdW5pdAogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNWZXJpZmllclVTQkNvbXBhbmlvbgogCi1MT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CitMT0NBTF9TREtfVkVSU0lPTiA6PSAyNQogCiBMT0NBTF9ERVhfUFJFT1BUIDo9IGZhbHNlCiAKZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXJVU0JDb21wYW5pb24vc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllcnVzYmNvbXBhbmlvbi9BY2Nlc3NvcnlBdHRhY2htZW50SGFuZGxlci5qYXZhIGIvYXBwcy9DdHNWZXJpZmllclVTQkNvbXBhbmlvbi9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVydXNiY29tcGFuaW9uL0FjY2Vzc29yeUF0dGFjaG1lbnRIYW5kbGVyLmphdmEKaW5kZXggZWM2MGFiOS4uMGNhMmM3OSAxMDA2NDQKLS0tIGEvYXBwcy9DdHNWZXJpZmllclVTQkNvbXBhbmlvbi9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVydXNiY29tcGFuaW9uL0FjY2Vzc29yeUF0dGFjaG1lbnRIYW5kbGVyLmphdmEKKysrIGIvYXBwcy9DdHNWZXJpZmllclVTQkNvbXBhbmlvbi9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVydXNiY29tcGFuaW9uL0FjY2Vzc29yeUF0dGFjaG1lbnRIYW5kbGVyLmphdmEKQEAgLTIwLDggKzIwLDggQEAKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLnVzYi5Vc2JBY2Nlc3Nvcnk7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS51c2IuVXNiTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTm9uTnVsbDsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk51bGxhYmxlOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIApkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllclVTQkNvbXBhbmlvbi9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVydXNiY29tcGFuaW9uL0FjY2Vzc29yeVRlc3RDb21wYW5pb24uamF2YSBiL2FwcHMvQ3RzVmVyaWZpZXJVU0JDb21wYW5pb24vc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllcnVzYmNvbXBhbmlvbi9BY2Nlc3NvcnlUZXN0Q29tcGFuaW9uLmphdmEKaW5kZXggYWMwMjVkMS4uMjYxYjQ3ZSAxMDA2NDQKLS0tIGEvYXBwcy9DdHNWZXJpZmllclVTQkNvbXBhbmlvbi9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVydXNiY29tcGFuaW9uL0FjY2Vzc29yeVRlc3RDb21wYW5pb24uamF2YQorKysgYi9hcHBzL0N0c1ZlcmlmaWVyVVNCQ29tcGFuaW9uL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXJ1c2Jjb21wYW5pb24vQWNjZXNzb3J5VGVzdENvbXBhbmlvbi5qYXZhCkBAIC0yOSw3ICsyOSw3IEBACiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS51c2IuVXNiRW5kcG9pbnQ7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS51c2IuVXNiSW50ZXJmYWNlOwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudXNiLlVzYk1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uTm9uTnVsbDsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk5vbk51bGw7CiAKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKZGlmZiAtLWdpdCBhL2FwcHMvQ3RzVmVyaWZpZXJVU0JDb21wYW5pb24vc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllcnVzYmNvbXBhbmlvbi9EZXZpY2VUZXN0Q29tcGFuaW9uLmphdmEgYi9hcHBzL0N0c1ZlcmlmaWVyVVNCQ29tcGFuaW9uL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXJ1c2Jjb21wYW5pb24vRGV2aWNlVGVzdENvbXBhbmlvbi5qYXZhCmluZGV4IDdjYmVjY2YuLmIzZTYxNjYgMTAwNjQ0Ci0tLSBhL2FwcHMvQ3RzVmVyaWZpZXJVU0JDb21wYW5pb24vc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllcnVzYmNvbXBhbmlvbi9EZXZpY2VUZXN0Q29tcGFuaW9uLmphdmEKKysrIGIvYXBwcy9DdHNWZXJpZmllclVTQkNvbXBhbmlvbi9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVydXNiY29tcGFuaW9uL0RldmljZVRlc3RDb21wYW5pb24uamF2YQpAQCAtMjMsNyArMjMsNyBAQAogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudXNiLlVzYkFjY2Vzc29yeTsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLnVzYi5Vc2JNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3I7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uTm9uTnVsbDsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk5vbk51bGw7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CkBAIC0zNSw4ICszNSw3IEBACiAgKiBDb21wYW5pb24gY29kZSBmb3IgY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLnVzYi5kZXZpY2UuVXNiRGV2aWNlVGVzdEFjdGl2aXR5CiAgKi8KIGNsYXNzIERldmljZVRlc3RDb21wYW5pb24gZXh0ZW5kcyBUZXN0Q29tcGFuaW9uIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0JVRkZFUl9TSVpFID0gMTYzODQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9WRVJTSVpFRF9CVUZGRVJfU0laRSA9IE1BWF9CVUZGRVJfU0laRSArIDEwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTEFSR0VfQlVGRkVSX1NJWkUgPSAxMjQ2MTk7CiAKICAgICBEZXZpY2VUZXN0Q29tcGFuaW9uKEBOb25OdWxsIENvbnRleHQgY29udGV4dCwgQE5vbk51bGwgVGVzdE9ic2VydmVyIG9ic2VydmVyKSB7CiAgICAgICAgIHN1cGVyKGNvbnRleHQsIG9ic2VydmVyKTsKQEAgLTk0LDEwICs5MywxNCBAQAogICAgIHByaXZhdGUgYm9vbGVhbiBlY2hvQnl0ZXMoQE5vbk51bGwgSW5wdXRTdHJlYW0gaXMsIEBOb25OdWxsIE91dHB1dFN0cmVhbSBvcywgaW50IHNpemUpCiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbc2l6ZV07CisgICAgICAgIGludCByZWFkID0gMDsKIAotICAgICAgICBpbnQgbnVtUmVhZCA9IGlzLnJlYWQoYnVmZmVyKTsKLSAgICAgICAgaWYgKG51bVJlYWQgIT0gc2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB3aGlsZSAocmVhZCAhPSBzaXplKSB7CisgICAgICAgICAgICBpbnQgcmV0ID0gaXMucmVhZChidWZmZXIsIHJlYWQsIHNpemUgLSByZWFkKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVhZCArPSByZXQ7CiAgICAgICAgIH0KIAogICAgICAgICBvcy53cml0ZShidWZmZXIpOwpAQCAtMTk4LDI1ICsyMDEsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIkVjaG8gNDIgYnl0ZXMiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU3VjY2VzcyA9IGVjaG9CeXRlcyhpcywgb3MsIDQyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIkVjaG8gbWF4IGJ5dGVzIjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1N1Y2Nlc3MgPSBlY2hvQnl0ZXMoaXMsIG9zLCBNQVhfQlVGRkVSX1NJWkUpOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiRWNobyAxNjM4NCBieXRlcyI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTdWNjZXNzID0gZWNob0J5dGVzKGlzLCBvcywgMTYzODQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiRWNobyBvdmVyc2l6ZWQgYnVmZmVyIjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgYnl0ZXMgYmV5b25kIE1BWF9CVUZGRVJfU0laRSBnb3QgaWdub3JlZCB3aGVuIHNlbmRpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1N1Y2Nlc3MgPSBlY2hvQnl0ZXMoaXMsIG9zLCBNQVhfQlVGRkVSX1NJWkUpOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiRWNobyBsYXJnZSBidWZmZXIiOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU3VjY2VzcyA9IGVjaG9CeXRlcyhpcywgb3MsIExBUkdFX0JVRkZFUl9TSVpFKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIlJlY2VpdmUgb3ZlcnNpemVkIGJ1ZmZlciI6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbT1ZFUlNJWkVEX0JVRkZFUl9TSVpFXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJbMF0gPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltNQVhfQlVGRkVSX1NJWkUgLSAxXSA9IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyW01BWF9CVUZGRVJfU0laRV0gPSAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltPVkVSU0laRURfQlVGRkVSX1NJWkUgLSAxXSA9IDQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy53cml0ZShidWZmZXIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTdWNjZXNzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiUmVjZWl2ZSBieXRlIGFmdGVyIHNvbWUgdGltZSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDIwMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Mud3JpdGUobmV3IGJ5dGVbMV0pOwpkaWZmIC0tZ2l0IGEvYXBwcy9DdHNWZXJpZmllclVTQkNvbXBhbmlvbi9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVydXNiY29tcGFuaW9uL01haW4uamF2YSBiL2FwcHMvQ3RzVmVyaWZpZXJVU0JDb21wYW5pb24vc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllcnVzYmNvbXBhbmlvbi9NYWluLmphdmEKaW5kZXggYTg3ZjljZS4uN2VlNTg0MjggMTAwNjQ0Ci0tLSBhL2FwcHMvQ3RzVmVyaWZpZXJVU0JDb21wYW5pb24vc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllcnVzYmNvbXBhbmlvbi9NYWluLmphdmEKKysrIGIvYXBwcy9DdHNWZXJpZmllclVTQkNvbXBhbmlvbi9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVydXNiY29tcGFuaW9uL01haW4uamF2YQpAQCAtMTgsOCArMTgsOCBAQAogCiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk5vbk51bGw7CitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5OdWxsYWJsZTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CmRpZmYgLS1naXQgYS9hcHBzL0N0c1ZlcmlmaWVyVVNCQ29tcGFuaW9uL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXJ1c2Jjb21wYW5pb24vVGVzdENvbXBhbmlvbi5qYXZhIGIvYXBwcy9DdHNWZXJpZmllclVTQkNvbXBhbmlvbi9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVydXNiY29tcGFuaW9uL1Rlc3RDb21wYW5pb24uamF2YQppbmRleCBlNzY2YTE4Li44NjQ5OGNjIDEwMDY0NAotLS0gYS9hcHBzL0N0c1ZlcmlmaWVyVVNCQ29tcGFuaW9uL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXJ1c2Jjb21wYW5pb24vVGVzdENvbXBhbmlvbi5qYXZhCisrKyBiL2FwcHMvQ3RzVmVyaWZpZXJVU0JDb21wYW5pb24vc3JjL2NvbS9hbmRyb2lkL2N0cy92ZXJpZmllcnVzYmNvbXBhbmlvbi9UZXN0Q29tcGFuaW9uLmphdmEKQEAgLTE5LDcgKzE5LDcgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk5vbk51bGw7CitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5Ob25OdWxsOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwpkaWZmIC0tZ2l0IGEvYXBwcy9FbXB0eURldmljZU93bmVyL0FuZHJvaWQubWsgYi9hcHBzL0VtcHR5RGV2aWNlT3duZXIvQW5kcm9pZC5tawppbmRleCAyMmM5OWUzLi43MTRlOTk2IDEwMDY0NAotLS0gYS9hcHBzL0VtcHR5RGV2aWNlT3duZXIvQW5kcm9pZC5taworKysgYi9hcHBzL0VtcHR5RGV2aWNlT3duZXIvQW5kcm9pZC5tawpAQCAtMjYsNyArMjYsNyBAQAogCiBMT0NBTF9SRVNPVVJDRV9ESVIgKz0gJChMT0NBTF9QQVRIKS9yZXMKIAotTE9DQUxfU0RLX1ZFUlNJT04gOj0gdGVzdF9jdXJyZW50CitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CiAKICMgdGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKIExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCmRpZmYgLS1naXQgYS9hcHBzL0VtcHR5RGV2aWNlT3duZXIvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2FwcHMvRW1wdHlEZXZpY2VPd25lci9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGYwYmJlMWYuLmQ2YTk3ZWIgMTAwNjQ0Ci0tLSBhL2FwcHMvRW1wdHlEZXZpY2VPd25lci9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2FwcHMvRW1wdHlEZXZpY2VPd25lci9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0zMSw3ICszMSwxMSBAQAogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICA8L3JlY2VpdmVyPgogCi0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5Ta2lwVGVzdENoZWNrQWN0aXZpdHkiIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiLz4KKyAgICAgICAgPHJlY2VpdmVyIGFuZHJvaWQ6bmFtZT0iLkRldmljZU93bmVyQ2hhbmdlZFJlY2VpdmVyIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFwcC5hY3Rpb24uREVWSUNFX09XTkVSX0NIQU5HRUQiLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9yZWNlaXZlcj4KIAogICAgIDwvYXBwbGljYXRpb24+CiA8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvYXBwcy9FbXB0eURldmljZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZW1wdHlkZXZpY2Vvd25lci9EZXZpY2VPd25lckNoYW5nZWRSZWNlaXZlci5qYXZhIGIvYXBwcy9FbXB0eURldmljZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZW1wdHlkZXZpY2Vvd25lci9EZXZpY2VPd25lckNoYW5nZWRSZWNlaXZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMDczMmUKLS0tIC9kZXYvbnVsbAorKysgYi9hcHBzL0VtcHR5RGV2aWNlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9lbXB0eWRldmljZW93bmVyL0RldmljZU93bmVyQ2hhbmdlZFJlY2VpdmVyLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5lbXB0eWRldmljZW93bmVyOworCitpbXBvcnQgYW5kcm9pZC5hcHAuYWRtaW4uRGV2aWNlQWRtaW5SZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5hZG1pbi5EZXZpY2VQb2xpY3lNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworcHVibGljIGNsYXNzIERldmljZU93bmVyQ2hhbmdlZFJlY2VpdmVyIGV4dGVuZHMgRGV2aWNlQWRtaW5SZWNlaXZlciB7CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisJCUxvZy5kKCJEZXZpY2VPd25lckNoYW5nZWRSZWNlaXZlciIsICJkZXZpY2Ugb3duZXIgaXMgY2hhbmdlZC4iKTsKKwkJaWYgKCFEZXZpY2VQb2xpY3lNYW5hZ2VyLkFDVElPTl9ERVZJQ0VfT1dORVJfQ0hBTkdFRC5lcXVhbHMoaW50ZW50LmdldEFjdGlvbigpKSkgeworCQkJcmV0dXJuOworCQl9CisJCURldmljZVBvbGljeU1hbmFnZXIgZHBtID0gY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKERldmljZVBvbGljeU1hbmFnZXIuY2xhc3MpOworCQlpZiAoIWRwbS5pc0RldmljZU93bmVyQXBwKGNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSkpIHsKKwkJCXJldHVybjsKKwkJfQorCQlMb2cuZCgiRGV2aWNlT3duZXJDaGFuZ2VkUmVjZWl2ZXIiLCAidHJhbnNmZXJyaW5nIG93bmVyc2hpcCB0byBDdHNWZXJpZmllciIpOworCQlkcG0udHJhbnNmZXJPd25lcnNoaXAoCisJCQlFbXB0eURldmljZUFkbWluLmdldENvbXBvbmVudE5hbWUoY29udGV4dCksCisJCQluZXcgQ29tcG9uZW50TmFtZSgiY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyIiwKKwkJCQkiY29tLmFuZHJvaWQuY3RzLnZlcmlmaWVyLm1hbmFnZWRwcm92aXNpb25pbmcuRGV2aWNlQWRtaW5UZXN0UmVjZWl2ZXIiKSwKKwkJCW51bGwpOworCX0KK30KZGlmZiAtLWdpdCBhL2FwcHMvRW1wdHlEZXZpY2VPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2VtcHR5ZGV2aWNlb3duZXIvRW1wdHlEZXZpY2VBZG1pbi5qYXZhIGIvYXBwcy9FbXB0eURldmljZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZW1wdHlkZXZpY2Vvd25lci9FbXB0eURldmljZUFkbWluLmphdmEKaW5kZXggN2EwNjcyMS4uOTBlZTI1MiAxMDA2NDQKLS0tIGEvYXBwcy9FbXB0eURldmljZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZW1wdHlkZXZpY2Vvd25lci9FbXB0eURldmljZUFkbWluLmphdmEKKysrIGIvYXBwcy9FbXB0eURldmljZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZW1wdHlkZXZpY2Vvd25lci9FbXB0eURldmljZUFkbWluLmphdmEKQEAgLTI0LDcgKzI0LDcgQEAKIAogcHVibGljIGNsYXNzIEVtcHR5RGV2aWNlQWRtaW4gZXh0ZW5kcyBEZXZpY2VBZG1pblJlY2VpdmVyIHsKIAotICAgIHB1YmxpYyBzdGF0aWMgQ29tcG9uZW50TmFtZSBnZXRDb21wb25lbnROYW1lKENvbnRleHQgY29udGV4dCkgewotICAgICAgICByZXR1cm4gbmV3IENvbXBvbmVudE5hbWUoY29udGV4dCwgRW1wdHlEZXZpY2VBZG1pbi5jbGFzcyk7Ci0gICAgfQorCXB1YmxpYyBzdGF0aWMgQ29tcG9uZW50TmFtZSBnZXRDb21wb25lbnROYW1lKENvbnRleHQgY29udGV4dCkgeworCQlyZXR1cm4gbmV3IENvbXBvbmVudE5hbWUoY29udGV4dCwgRW1wdHlEZXZpY2VBZG1pbi5jbGFzcyk7CisJfQogfQpkaWZmIC0tZ2l0IGEvYXBwcy9FbXB0eURldmljZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZW1wdHlkZXZpY2Vvd25lci9Ta2lwVGVzdENoZWNrQWN0aXZpdHkuamF2YSBiL2FwcHMvRW1wdHlEZXZpY2VPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2VtcHR5ZGV2aWNlb3duZXIvU2tpcFRlc3RDaGVja0FjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0YTBkYTQuLjAwMDAwMDAKLS0tIGEvYXBwcy9FbXB0eURldmljZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZW1wdHlkZXZpY2Vvd25lci9Ta2lwVGVzdENoZWNrQWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuY3RzLmVtcHR5ZGV2aWNlb3duZXI7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuYWRtaW4uRGV2aWNlUG9saWN5TWFuYWdlci5BQ0NPVU5UX0ZFQVRVUkVfREVWSUNFX09SX1BST0ZJTEVfT1dORVJfQUxMT1dFRDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuYWRtaW4uRGV2aWNlUG9saWN5TWFuYWdlcgotICAgICAgICAuQUNDT1VOVF9GRUFUVVJFX0RFVklDRV9PUl9QUk9GSUxFX09XTkVSX0RJU0FMTE9XRUQ7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm8uU0NSRUVOX09SSUVOVEFUSU9OX1BPUlRSQUlUOwotCi1pbXBvcnQgYW5kcm9pZC5hY2NvdW50cy5BY2NvdW50OwotaW1wb3J0IGFuZHJvaWQuYWNjb3VudHMuQWNjb3VudE1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuYWRtaW4uRGV2aWNlUG9saWN5TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuUGVyc2lzdGFibGVCdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLXB1YmxpYyBjbGFzcyBTa2lwVGVzdENoZWNrQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTa2lwVGVzdENoZWNrQWN0aXZpdHkiOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHdoZXRoZXIgZGV2aWNlIG93bmVyIHRlc3RzIHNob3VsZCBiZSBza2lwcGVkLgotICAgICAqIDxwPgotICAgICAqIFNvbWUgT0VNIGRldmljZXMgaGF2ZSBwcmUtbG9hZGVkIGFjY291bnRzLCBhbmQgdGh1cyBmYWlsZWQgdGhlIHNldC1kZXZpY2Utb3duZXIgY29tbWFuZC4KLSAgICAgKiBJbiBPLCB3ZSBpbnRyb2R1Y2VkCi0gICAgICoge0BsaW5rIERldmljZVBvbGljeU1hbmFnZXIjQUNDT1VOVF9GRUFUVVJFX0RFVklDRV9PUl9QUk9GSUxFX09XTkVSX0FMTE9XRUR9IHRvIG1ha2UgdGVzdGluZwotICAgICAqIGluIHRoZXNlIGRldmljZXMgcG9zc2libGUgYnkgYWxsb3dpbmcgdGhlIGNvbW1hbmQgdG8gd29yayBpZiBhbGwgcHJlbG9hZGVkIGFjY291bnRzIGhhdmUKLSAgICAgKiB0aGUgZmVhdHVyZSBmbGFnLiBCdXQgdGhpcyByZXF1aXJlcyB0aGUgRE8gYXBwIHRvIGJlICJ0ZXN0LW9ubHkiLCBhbmQgd2UgZG9uJ3Qgd2FudAotICAgICAqIHRvIG1ha2UgQ3RzVmVyaWZpZXIgdGVzdC1vbmx5LiBUaHVzLCBzaW5jZSBQKyB3ZSBpbnRyb2R1Y2UgYSBkdW1teSB0ZXN0LW9ubHkgZGV2aWNlIG93bmVyCi0gICAgICogYXBwLCB3ZSBzZXQgaXQgYXMgZGV2aWNlIG93bmVyIGFuZCB0aGVuIHVzZQotICAgICAqIHtAbGluayBEZXZpY2VQb2xpY3lNYW5hZ2VyI3RyYW5zZmVyT3duZXJzaGlwKENvbXBvbmVudE5hbWUsIENvbXBvbmVudE5hbWUsIFBlcnNpc3RhYmxlQnVuZGxlKX0KLSAgICAgKiB0byB0cmFuc2ZlciB0aGUgb3duZXJzaGlwIHRvIHRoZSBDdHNWZXJpZmllciBhcHAuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHdvcmthcm91bmQgcmVxdWlyZXMgUCsgdG8gd29yaywgc28gd2UgbmVlZCB0byBza2lwIHRoZSB0ZXN0IGlmIGl0IGlzIHJ1bm5pbmcgaW4gcHJlCi0gICAgICogUCBkZXZpY2VzIGFuZCBhbGwgYWNjb3VudHMgaGFzIHRoZSBmZWF0dXJlIGZsYWcKLSAgICAgKiB7QGxpbmsgRGV2aWNlUG9saWN5TWFuYWdlciNBQ0NPVU5UX0ZFQVRVUkVfREVWSUNFX09SX1BST0ZJTEVfT1dORVJfQUxMT1dFRCBhbmQgbm9uZSBvZiB0aGVtCi0gICAgICogaGFzIHRoZSB7QGxpbmsgRGV2aWNlUG9saWN5TWFuYWdlciNBQ0NPVU5UX0ZFQVRVUkVfREVWSUNFX09SX1BST0ZJTEVfT1dORVJfRElTQUxMT1dFRH0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGV4dAotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGRldmljZSBvd25lcnMgdGVzdCBzaG91bGQgYmUgc2tpcHBlZCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHNob3VsZFNraXBEZXZpY2VPd25lclRlc3RGb3JQcmVsb2FkZWRBY2NvdW50cyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgQWNjb3VudE1hbmFnZXIgYW0gPSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQWNjb3VudE1hbmFnZXIuY2xhc3MpOwotICAgICAgICBmaW5hbCBBY2NvdW50IGFjY291bnRzW10gPSBhbS5nZXRBY2NvdW50cygpOwotICAgICAgICBpZiAoYWNjb3VudHMubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKEFjY291bnQgYWNjb3VudCA6IGFjY291bnRzKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJzaG91bGRTa2lwRGV2aWNlT3duZXJUZXN0Rm9yUHJlbG9hZGVkQWNjb3VudHM6IGZvdW5kICIgKyBhY2NvdW50KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIUFycmF5cy5zdHJlYW0oYWNjb3VudHMpLmFsbE1hdGNoKAotICAgICAgICAgICAgICAgIGFjY291bnQgLT4gaGFzQWNjb3VudEZlYXR1cmUoCi0gICAgICAgICAgICAgICAgICAgICAgICBhbSwgYWNjb3VudCwgQUNDT1VOVF9GRUFUVVJFX0RFVklDRV9PUl9QUk9GSUxFX09XTkVSX0FMTE9XRUQpKSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU29tZSBhY2NvdW50cyBkb2VzIG5vdCBoYXZlIHRoZSBERVZJQ0VfT1JfUFJPRklMRV9PV05FUl9BTExPV0VEIGZsYWciKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoQXJyYXlzLnN0cmVhbShhY2NvdW50cykuYW55TWF0Y2goCi0gICAgICAgICAgICAgICAgYWNjb3VudCAtPiBoYXNBY2NvdW50RmVhdHVyZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIGFtLCBhY2NvdW50LCBBQ0NPVU5UX0ZFQVRVUkVfREVWSUNFX09SX1BST0ZJTEVfT1dORVJfRElTQUxMT1dFRCkpKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTb21lIGFjY291bnRzIGhhdmUgdGhlIERFVklDRV9PUl9QUk9GSUxFX09XTkVSX0RJU0FMTE9XRUQgZmxhZyIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaGFzQWNjb3VudEZlYXR1cmUoQWNjb3VudE1hbmFnZXIgYW0sIEFjY291bnQgYWNjb3VudCwgU3RyaW5nIGZlYXR1cmUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBhbS5oYXNGZWF0dXJlcyhhY2NvdW50LCBuZXcgU3RyaW5nW117ZmVhdHVyZX0sIG51bGwsIG51bGwpLmdldFJlc3VsdCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiaGFzQWNjb3VudEZlYXR1cmVzOiAiLCBlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwotICAgICAgICBzZXRSZXF1ZXN0ZWRPcmllbnRhdGlvbihTQ1JFRU5fT1JJRU5UQVRJT05fUE9SVFJBSVQpOwotICAgICAgICBuZXcgVGhyZWFkKCgpIC0+IHsKLSAgICAgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIgZHBtID0gZ2V0U3lzdGVtU2VydmljZShEZXZpY2VQb2xpY3lNYW5hZ2VyLmNsYXNzKTsKLSAgICAgICAgICAgIGJvb2xlYW4gc2hvdWxkU2tpcCA9IGZhbHNlOwotICAgICAgICAgICAgYm9vbGVhbiBpc0RldmljZU93bmVyID0gZHBtLmlzRGV2aWNlT3duZXJBcHAoZ2V0UGFja2FnZU5hbWUoKSk7Ci0gICAgICAgICAgICBpZiAoaXNEZXZpY2VPd25lcikgewotICAgICAgICAgICAgICAgIHNob3VsZFNraXAgPSBzaG91bGRTa2lwRGV2aWNlT3duZXJUZXN0Rm9yUHJlbG9hZGVkQWNjb3VudHModGhpcyk7OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBJbnRlbnQgcmVzdWx0SW50ZW50ID0gbmV3IEludGVudCgpOwotICAgICAgICAgICAgcmVzdWx0SW50ZW50LnB1dEV4dHJhKEludGVudC5FWFRSQV9SRVRVUk5fUkVTVUxULCBzaG91bGRTa2lwKTsKLSAgICAgICAgICAgIHNldFJlc3VsdChBY3Rpdml0eS5SRVNVTFRfT0ssIHJlc3VsdEludGVudCk7Ci0KLSAgICAgICAgICAgIGlmIChpc0RldmljZU93bmVyKSB7Ci0gICAgICAgICAgICAgICAgZ2V0U3lzdGVtU2VydmljZShEZXZpY2VQb2xpY3lNYW5hZ2VyLmNsYXNzKS5jbGVhckRldmljZU93bmVyQXBwKGdldFBhY2thZ2VOYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluaXNoKCk7Ci0gICAgICAgIH0pLnN0YXJ0KCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYXBwcy9QZXJtaXNzaW9uQXBwL0FuZHJvaWQubWsgYi9hcHBzL1Blcm1pc3Npb25BcHAvQW5kcm9pZC5tawppbmRleCBmMjJlY2MzLi5jZjQxODZkIDEwMDY0NAotLS0gYS9hcHBzL1Blcm1pc3Npb25BcHAvQW5kcm9pZC5taworKysgYi9hcHBzL1Blcm1pc3Npb25BcHAvQW5kcm9pZC5tawpAQCAtMjksNiArMjksNiBAQAogTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAogCiAjIHRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0Ci1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBhcmN0cyBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKIAogaW5jbHVkZSAkKEJVSUxEX0NUU19QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvYXBwcy9QZXJtaXNzaW9uQXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9hcHBzL1Blcm1pc3Npb25BcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA4MmUzNjE3Li5mODgwOTMzIDEwMDY0NAotLS0gYS9hcHBzL1Blcm1pc3Npb25BcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9hcHBzL1Blcm1pc3Npb25BcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjEsNiArMjEsNyBAQAogICAgIDx1c2VzLXNkayBhbmRyb2lkOm1pblNka1ZlcnNpb249IjIzIi8+CiAKICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfQ09OVEFDVFMiLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLklOVEVSQUNUX0FDUk9TU19VU0VSUyIvPgogCiAgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFiZWw9IkN0c1Blcm1pc3Npb25BcHAiCiAgICAgICAgICAgICBhbmRyb2lkOmljb249IkBkcmF3YWJsZS9pY19wZXJtaXNzaW9uYXBwIj4KZGlmZiAtLWdpdCBhL2FwcHMvVnBuQXBwL2FwaTIzL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9hcHBzL1ZwbkFwcC9hcGkyMy9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGIwMGUxYTUuLmNmMDFkNTggMTAwNjQ0Ci0tLSBhL2FwcHMvVnBuQXBwL2FwaTIzL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvYXBwcy9WcG5BcHAvYXBpMjMvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMTgsNiArMTgsNyBAQAogICAgICAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5jdHMudnBuZmlyZXdhbGwiPgogCiAgICAgPHVzZXMtc2RrIGFuZHJvaWQ6bWluU2RrVmVyc2lvbj0iMjIiIGFuZHJvaWQ6dGFyZ2V0U2RrVmVyc2lvbj0iMjMiLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkFDQ0VTU19ORVRXT1JLX1NUQVRFIi8+CiAKICAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9hcHAiPgogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuVnBuQ2xpZW50Ij4KZGlmZiAtLWdpdCBhL2FwcHMvVnBuQXBwL2FwaTI0L0FuZHJvaWRNYW5pZmVzdC54bWwgYi9hcHBzL1ZwbkFwcC9hcGkyNC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGMwYzBkZjYuLjMxNjFjMTUgMTAwNjQ0Ci0tLSBhL2FwcHMvVnBuQXBwL2FwaTI0L0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvYXBwcy9WcG5BcHAvYXBpMjQvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMTgsNiArMTgsNyBAQAogICAgICAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5jdHMudnBuZmlyZXdhbGwiPgogCiAgICAgPHVzZXMtc2RrIGFuZHJvaWQ6bWluU2RrVmVyc2lvbj0iMjIiIGFuZHJvaWQ6dGFyZ2V0U2RrVmVyc2lvbj0iMjQiLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkFDQ0VTU19ORVRXT1JLX1NUQVRFIi8+CiAKICAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9hcHAiPgogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuVnBuQ2xpZW50Ij4KZGlmZiAtLWdpdCBhL2FwcHMvVnBuQXBwL2xhdGVzdC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvYXBwcy9WcG5BcHAvbGF0ZXN0L0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggNmNjNzA2Zi4uZjgxZTM4MSAxMDA2NDQKLS0tIGEvYXBwcy9WcG5BcHAvbGF0ZXN0L0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvYXBwcy9WcG5BcHAvbGF0ZXN0L0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTE4LDYgKzE4LDkgQEAKICAgICAgICAgcGFja2FnZT0iY29tLmFuZHJvaWQuY3RzLnZwbmZpcmV3YWxsIj4KIAogICAgIDx1c2VzLXNkayBhbmRyb2lkOm1pblNka1ZlcnNpb249IjIyIi8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5BQ0NFU1NfTkVUV09SS19TVEFURSIvPgorCisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5GT1JFR1JPVU5EX1NFUlZJQ0UiLz4KIAogICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2FwcCI+CiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5WcG5DbGllbnQiPgpkaWZmIC0tZ2l0IGEvYXBwcy9WcG5BcHAvbm90YWx3YXlzb24vQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2FwcHMvVnBuQXBwL25vdGFsd2F5c29uL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggZmMyNTBhYS4uYjM1NjM2OSAxMDA2NDQKLS0tIGEvYXBwcy9WcG5BcHAvbm90YWx3YXlzb24vQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9hcHBzL1ZwbkFwcC9ub3RhbHdheXNvbi9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0xOCw2ICsxOCw4IEBACiAgICAgICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLmN0cy52cG5maXJld2FsbCI+CiAKICAgICA8dXNlcy1zZGsgYW5kcm9pZDptaW5TZGtWZXJzaW9uPSIyMiIvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX05FVFdPUktfU1RBVEUiLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkZPUkVHUk9VTkRfU0VSVklDRSIvPgogCiAgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYXBwIj4KICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLlZwbkNsaWVudCI+CmRpZmYgLS1naXQgYS9hcHBzL1ZwbkFwcC9zcmMvY29tL2FuZHJvaWQvY3RzL3ZwbmZpcmV3YWxsL1JlZmxlY3RvclZwblNlcnZpY2UuamF2YSBiL2FwcHMvVnBuQXBwL3NyYy9jb20vYW5kcm9pZC9jdHMvdnBuZmlyZXdhbGwvUmVmbGVjdG9yVnBuU2VydmljZS5qYXZhCmluZGV4IDczYWZlYWYuLjEzOTc2ODcgMTAwNzU1Ci0tLSBhL2FwcHMvVnBuQXBwL3NyYy9jb20vYW5kcm9pZC9jdHMvdnBuZmlyZXdhbGwvUmVmbGVjdG9yVnBuU2VydmljZS5qYXZhCisrKyBiL2FwcHMvVnBuQXBwL3NyYy9jb20vYW5kcm9pZC9jdHMvdnBuZmlyZXdhbGwvUmVmbGVjdG9yVnBuU2VydmljZS5qYXZhCkBAIC0yMyw2ICsyMywxMCBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLk5hbWVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Db25uZWN0aXZpdHlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcms7CitpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0NhcGFiaWxpdGllczsKK2ltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrUmVxdWVzdDsKIGltcG9ydCBhbmRyb2lkLm5ldC5WcG5TZXJ2aWNlOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3I7CkBAIC0zNywxMyArNDEsMTggQEAKIAogcHVibGljIGNsYXNzIFJlZmxlY3RvclZwblNlcnZpY2UgZXh0ZW5kcyBWcG5TZXJ2aWNlIHsKIAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBUQUcgPSAiUmVmbGVjdG9yVnBuU2VydmljZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJSZWZsZWN0b3JWcG5TZXJ2aWNlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVWSUNFX0FORF9QUk9GSUxFX09XTkVSX1BBQ0tBR0UgPQorICAgICAgICAiY29tLmFuZHJvaWQuY3RzLmRldmljZWFuZHByb2ZpbGVvd25lciI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9WUE5fSVNfVVAgPSAiY29tLmFuZHJvaWQuY3RzLnZwbmZpcmV3YWxsLlZQTl9JU19VUCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PVElGSUNBVElPTl9JRCA9IDE7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVElGSUNBVElPTl9DSEFOTkVMX0lEID0gVEFHOwogICAgIHByaXZhdGUgc3RhdGljIGludCBNVFUgPSAxNzk5OwogCiAgICAgcHJpdmF0ZSBQYXJjZWxGaWxlRGVzY3JpcHRvciBtRmQgPSBudWxsOwogICAgIHByaXZhdGUgUGluZ1JlZmxlY3RvciBtUGluZ1JlZmxlY3RvciA9IG51bGw7CisgICAgcHJpdmF0ZSBDb25uZWN0aXZpdHlNYW5hZ2VyIG1Db25uZWN0aXZpdHlNYW5hZ2VyID0gbnVsbDsKKyAgICBwcml2YXRlIENvbm5lY3Rpdml0eU1hbmFnZXIuTmV0d29ya0NhbGxiYWNrIG1OZXR3b3JrQ2FsbGJhY2sgPSBudWxsOwogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVFJJQ1RJT05fQUREUkVTU0VTID0gInZwbi5hZGRyZXNzZXMiOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1RSSUNUSU9OX1JPVVRFUyA9ICJ2cG4ucm91dGVzIjsKQEAgLTY2LDE1ICs3NSw0NSBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKCkgeworICAgICAgICBtQ29ubmVjdGl2aXR5TWFuYWdlciA9IGdldFN5c3RlbVNlcnZpY2UoQ29ubmVjdGl2aXR5TWFuYWdlci5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25EZXN0cm95KCkgewogICAgICAgICBzdG9wKCk7CiAgICAgICAgIE5vdGlmaWNhdGlvbk1hbmFnZXIgbm90aWZpY2F0aW9uTWFuYWdlciA9IGdldFN5c3RlbVNlcnZpY2UoTm90aWZpY2F0aW9uTWFuYWdlci5jbGFzcyk7CiAgICAgICAgIG5vdGlmaWNhdGlvbk1hbmFnZXIuZGVsZXRlTm90aWZpY2F0aW9uQ2hhbm5lbChOT1RJRklDQVRJT05fQ0hBTk5FTF9JRCk7CisgICAgICAgIGVuc3VyZU5ldHdvcmtDYWxsYmFja1VucmVnaXN0ZXJlZCgpOwogICAgICAgICBzdXBlci5vbkRlc3Ryb3koKTsKICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgZW5zdXJlTmV0d29ya0NhbGxiYWNrVW5yZWdpc3RlcmVkKCkgeworICAgICAgICBpZiAobnVsbCA9PSBtQ29ubmVjdGl2aXR5TWFuYWdlciB8fCBudWxsID09IG1OZXR3b3JrQ2FsbGJhY2spIHJldHVybjsKKyAgICAgICAgbUNvbm5lY3Rpdml0eU1hbmFnZXIudW5yZWdpc3Rlck5ldHdvcmtDYWxsYmFjayhtTmV0d29ya0NhbGxiYWNrKTsKKyAgICAgICAgbU5ldHdvcmtDYWxsYmFjayA9IG51bGw7CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0KCkgewogICAgICAgICBWcG5TZXJ2aWNlLnByZXBhcmUodGhpcyk7CisKKyAgICAgICAgZW5zdXJlTmV0d29ya0NhbGxiYWNrVW5yZWdpc3RlcmVkKCk7CisgICAgICAgIGZpbmFsIE5ldHdvcmtSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgTmV0d29ya1JlcXVlc3QuQnVpbGRlcigpCisgICAgICAgICAgICAuYWRkVHJhbnNwb3J0VHlwZShOZXR3b3JrQ2FwYWJpbGl0aWVzLlRSQU5TUE9SVF9WUE4pCisgICAgICAgICAgICAucmVtb3ZlQ2FwYWJpbGl0eShOZXR3b3JrQ2FwYWJpbGl0aWVzLk5FVF9DQVBBQklMSVRZX05PVF9WUE4pCisgICAgICAgICAgICAucmVtb3ZlQ2FwYWJpbGl0eShOZXR3b3JrQ2FwYWJpbGl0aWVzLk5FVF9DQVBBQklMSVRZX0lOVEVSTkVUKQorICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIG1OZXR3b3JrQ2FsbGJhY2sgPSBuZXcgQ29ubmVjdGl2aXR5TWFuYWdlci5OZXR3b3JrQ2FsbGJhY2soKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25BdmFpbGFibGUoZmluYWwgTmV0d29yayBuZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgSW50ZW50IHZwbklzVXBJbnRlbnQgPSBuZXcgSW50ZW50KEFDVElPTl9WUE5fSVNfVVApOworICAgICAgICAgICAgICAgICAgICB2cG5Jc1VwSW50ZW50LnNldFBhY2thZ2UoREVWSUNFX0FORF9QUk9GSUxFX09XTkVSX1BBQ0tBR0UpOworICAgICAgICAgICAgICAgICAgICBzZW5kQnJvYWRjYXN0KHZwbklzVXBJbnRlbnQpOworICAgICAgICAgICAgICAgICAgICBlbnN1cmVOZXR3b3JrQ2FsbGJhY2tVbnJlZ2lzdGVyZWQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICBtQ29ubmVjdGl2aXR5TWFuYWdlci5yZWdpc3Rlck5ldHdvcmtDYWxsYmFjayhyZXF1ZXN0LCBtTmV0d29ya0NhbGxiYWNrKTsKKwogICAgICAgICBCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgQnVpbGRlcigpOwogCiAgICAgICAgIGZpbmFsIFVzZXJNYW5hZ2VyIHVtID0gKFVzZXJNYW5hZ2VyKSBnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuVVNFUl9TRVJWSUNFKTsKZGlmZiAtLWdpdCBhL2J1aWxkL2NvbXBhdGliaWxpdHlfdGVzdF9zdWl0ZS5tayBiL2J1aWxkL2NvbXBhdGliaWxpdHlfdGVzdF9zdWl0ZS5tawppbmRleCBkMTMzYzNlLi4wMWEyZmZmIDEwMDY0NAotLS0gYS9idWlsZC9jb21wYXRpYmlsaXR5X3Rlc3Rfc3VpdGUubWsKKysrIGIvYnVpbGQvY29tcGF0aWJpbGl0eV90ZXN0X3N1aXRlLm1rCkBAIC00MiwxMCArNDIsMTggQEAKIExPQ0FMX0pBVkFfUkVTT1VSQ0VfRklMRVMgKz0gJChzdWl0ZV9pbmZvX3Byb3ApCiAKICMgQWRkIHRoZSBiYXNlIGxpYnJhcmllcwotTE9DQUxfSkFWQV9MSUJSQVJJRVMgKz0gdHJhZGVmZWQgaG9zdHRlc3RsaWIgY29tcGF0aWJpbGl0eS1ob3N0LXV0aWwKK0xPQ0FMX0pBVkFfTElCUkFSSUVTICs9IHRyYWRlZmVkIGxvZ2FuYWx5c2lzIGhvc3R0ZXN0bGliIGNvbXBhdGliaWxpdHktaG9zdC11dGlsCiAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCiAKKyMgSWYgRHluYW1pY0NvbmZpZy54bWwgZXhpc3RzIGNvcHkgaXQgaW5zaWRlIHRoZSBqYXIKK2lmbmVxICgsJCh3aWxkY2FyZCAkKExPQ0FMX1BBVEgpL0R5bmFtaWNDb25maWcueG1sKSkKKyAgZHluYW1pY19jb25maWdfbG9jYWwgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixKQVZBX0xJQlJBUklFUywkKExPQ0FMX01PRFVMRSksdHJ1ZSxDT01NT04pLyQoTE9DQUxfTU9EVUxFKS5keW5hbWljCisgICQoZXZhbCAkKGNhbGwgY29weS1vbmUtZmlsZSwkKExPQ0FMX1BBVEgpL0R5bmFtaWNDb25maWcueG1sLCQoZHluYW1pY19jb25maWdfbG9jYWwpKSkKKyAgTE9DQUxfSkFWQV9SRVNPVVJDRV9GSUxFUyArPSAkKGR5bmFtaWNfY29uZmlnX2xvY2FsKQorZW5kaWYKKwogaW5jbHVkZSAkKEJVSUxEX0hPU1RfSkFWQV9MSUJSQVJZKQogCitkeW5hbWljX2NvbmZpZ19sb2NhbCA6PQogc3VpdGVfaW5mb19wcm9wIDo9CmRpZmYgLS1naXQgYS9idWlsZC9kZXZpY2VfaW5mb19wYWNrYWdlLm1rIGIvYnVpbGQvZGV2aWNlX2luZm9fcGFja2FnZS5tawppbmRleCA1YzI5MGIwLi4xOTczZWY5IDEwMDY0NAotLS0gYS9idWlsZC9kZXZpY2VfaW5mb19wYWNrYWdlLm1rCisrKyBiL2J1aWxkL2RldmljZV9pbmZvX3BhY2thZ2UubWsKQEAgLTE3LDEwICsxNywxMyBAQAogIwogCiBERVZJQ0VfSU5GT19QQUNLQUdFIDo9IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLmRldmljZWluZm8KLURFVklDRV9JTkZPX0lOU1RSVU1FTlQgOj0gYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lcgorREVWSUNFX0lORk9fSU5TVFJVTUVOVCA6PSBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIKIERFVklDRV9JTkZPX1VTRVNfTElCUkFSWSA6PSBhbmRyb2lkLnRlc3QucnVubmVyCi1ERVZJQ0VfSU5GT19QRVJNSVNTSU9OUyArPSBhbmRyb2lkLnBlcm1pc3Npb24uV1JJVEVfRVhURVJOQUxfU1RPUkFHRQorREVWSUNFX0lORk9fUEVSTUlTU0lPTlMgKz0gXAorICBhbmRyb2lkLnBlcm1pc3Npb24uUkVBRF9QSE9ORV9TVEFURSBcCisgIGFuZHJvaWQucGVybWlzc2lvbi5XUklURV9FWFRFUk5BTF9TVE9SQUdFCiBERVZJQ0VfSU5GT19BQ1RJVklUSUVTICs9IFwKKyAgJChERVZJQ0VfSU5GT19QQUNLQUdFKS5BcHBTdGFuZGJ5RGV2aWNlSW5mbyBcCiAgICQoREVWSUNFX0lORk9fUEFDS0FHRSkuQ29uZmlndXJhdGlvbkRldmljZUluZm8gXAogICAkKERFVklDRV9JTkZPX1BBQ0tBR0UpLkNwdURldmljZUluZm8gXAogICAkKERFVklDRV9JTkZPX1BBQ0tBR0UpLkZlYXR1cmVEZXZpY2VJbmZvIFwKQEAgLTQyLDExICs0NSwxMSBAQAogZW5kaWYKIAogaWZlcSAoJChERVZJQ0VfSU5GT19UQVJHRVRfU0RLKSwpCi1ERVZJQ0VfSU5GT19UQVJHRVRfU0RLIDo9IDgKK0RFVklDRV9JTkZPX1RBUkdFVF9TREsgOj0gMTcKIGVuZGlmCiAKICMgQWRkIHRoZSBiYXNlIGRldmljZSBpbmZvCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgKz0gY29tcGF0aWJpbGl0eS1kZXZpY2UtaW5mbyBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgKz0gY29tcGF0aWJpbGl0eS1kZXZpY2UtaW5mbyBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dAogCiAjIEdlbmVyYXRvciBvZiBBUEsgbWFuaWZlc3RzLgogTUFOSUZFU1RfR0VORVJBVE9SX0pBUiA6PSAkKEhPU1RfT1VUX0pBVkFfTElCUkFSSUVTKS9jb21wYXRpYmlsaXR5LW1hbmlmZXN0LWdlbmVyYXRvci5qYXIKQEAgLTk0LDYgKzk3LDEwIEBACiAjIEFuZCB3aGVuIGJ1aWx0IGV4cGxpY2l0bHkgcHV0IGl0IGluIHRoZSBkYXRhIHBhcnRpdGlvbgogTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKIAorCisjVE9ETyhiLzcyNjIwNTExKSByZW1vdmUgdGhpcyBjb25kaXRpb24gd2hlbiBBdHNEZXZpY2VJbmZvIGNhbiBiZSBidWlsdCB3aXRoIFNESyBhZ2FpbgoraWZuZXEgKCQoTE9DQUxfUFJJVkFURV9QTEFURk9STV9BUElTKSx0cnVlKQogTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorZW5kaWYKIAogaW5jbHVkZSAkKEJVSUxEX0NUU19TVVBQT1JUX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9jb21tb24vZGV2aWNlLXNpZGUvZGV2aWNlLWluZm8vQW5kcm9pZC5tayBiL2NvbW1vbi9kZXZpY2Utc2lkZS9kZXZpY2UtaW5mby9BbmRyb2lkLm1rCmluZGV4IGJmNmUxMjIuLjkwODM2ZDEgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9kZXZpY2Utc2lkZS9kZXZpY2UtaW5mby9BbmRyb2lkLm1rCisrKyBiL2NvbW1vbi9kZXZpY2Utc2lkZS9kZXZpY2UtaW5mby9BbmRyb2lkLm1rCkBAIC0yMSwxNiArMjEsMjggQEAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCiAKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCi0gICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbCBcCi0gICAgYW5kcm9pZC1zdXBwb3J0LXRlc3QgXAotICAgIGp1bml0IFwKLSAgICBsZWdhY3ktYW5kcm9pZC10ZXN0CisgICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgXAorICAgIGFuZHJvaWR4LnRlc3QucnVsZXMgXAorICAgIGp1bml0CisKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IFwKKyAgICBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicyBcCisgICAgZnJhbWV3b3JrLXN0dWItZm9yLWNvbXBhdGliaWxpdHktZGV2aWNlLWluZm8KIAogTE9DQUxfTU9EVUxFIDo9IGNvbXBhdGliaWxpdHktZGV2aWNlLWluZm8KIAotIyB1bmNvbW1lbnQgd2hlbiBiLzEzMjgyMjU0IGlzIGZpeGVkCi0jTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAogCiBpbmNsdWRlICQoQlVJTERfU1RBVElDX0pBVkFfTElCUkFSWSkKIAoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisjIFRoaXMgc3R1YiBsaWJyYXJ5IHByb3ZpZGVzIHNvbWUgaW50ZXJuYWwgQVBJcyAoU3lzdGVtUHJvcGVydGllcywgVmludGZPYmplY3QsIGV0Yy4pCisjIHRvIGNvbXBhdGliaWxpdHktZGV2aWNlLWluZm8gbGlicmFyeS4KK0xPQ0FMX01PRFVMRSA6PSBmcmFtZXdvcmstc3R1Yi1mb3ItY29tcGF0aWJpbGl0eS1kZXZpY2UtaW5mbworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjX3N0dWIpCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorTE9DQUxfVU5JTlNUQUxMQUJMRV9NT0RVTEUgOj0gdHJ1ZQoraW5jbHVkZSAkKEJVSUxEX0pBVkFfTElCUkFSWSkKKwogaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQpkaWZmIC0tZ2l0IGEvY29tbW9uL2RldmljZS1zaWRlL2RldmljZS1pbmZvL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi9kZXZpY2VpbmZvL0FwcFN0YW5kYnlEZXZpY2VJbmZvLmphdmEgYi9jb21tb24vZGV2aWNlLXNpZGUvZGV2aWNlLWluZm8vc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL2RldmljZWluZm8vQXBwU3RhbmRieURldmljZUluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTZjOGI2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2RldmljZS1zaWRlL2RldmljZS1pbmZvL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi9kZXZpY2VpbmZvL0FwcFN0YW5kYnlEZXZpY2VJbmZvLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLmRldmljZWluZm87CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkFwcFN0YW5kYnlVdGlsczsKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkRldmljZUluZm9TdG9yZTsKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlN5c3RlbVV0aWw7CisKKy8qKgorICogQSBkZXZpY2UgaW5mbyBjb2xsZWN0b3IgdGhhdCBjb2xsZWN0cyB3aGV0aGVyIGFwcCBzdGFuZGJ5IHdhcyB0dXJuZWQgb24gb3Igb2ZmIGluIGEgZGV2aWNlCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBBcHBTdGFuZGJ5RGV2aWNlSW5mbyBleHRlbmRzIERldmljZUluZm8geworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQVBQX1NUQU5EQllfRU5BQkxFRCA9ICJhcHBfc3RhbmRieV9lbmFibGVkIjsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbGxlY3REZXZpY2VJbmZvKERldmljZUluZm9TdG9yZSBzdG9yZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN0b3JlLmFkZFJlc3VsdChLRVlfQVBQX1NUQU5EQllfRU5BQkxFRCwgQXBwU3RhbmRieVV0aWxzLmlzQXBwU3RhbmRieUVuYWJsZWQoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2RldmljZS1zaWRlL2RldmljZS1pbmZvL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi9kZXZpY2VpbmZvL0RldmljZUluZm8uamF2YSBiL2NvbW1vbi9kZXZpY2Utc2lkZS9kZXZpY2UtaW5mby9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vZGV2aWNlaW5mby9EZXZpY2VJbmZvLmphdmEKaW5kZXggNzUwZTQ1Zi4uYzQ4ZDE2ZiAxMDA2NDQKLS0tIGEvY29tbW9uL2RldmljZS1zaWRlL2RldmljZS1pbmZvL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi9kZXZpY2VpbmZvL0RldmljZUluZm8uamF2YQorKysgYi9jb21tb24vZGV2aWNlLXNpZGUvZGV2aWNlLWluZm8vc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL2RldmljZWluZm8vRGV2aWNlSW5mby5qYXZhCkBAIC02NCwxNSArNjQsMjMgQEAKIAogICAgIFNldDxTdHJpbmc+IG1BY3Rpdml0eUxpc3QgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CiAKKyAgICBzdGF0aWMgRmlsZSBtYWtlUmVzdWx0RGlyKCkgeworICAgICAgICBmaW5hbCBGaWxlIGRpciA9IG5ldyBGaWxlKEVudmlyb25tZW50LmdldEV4dGVybmFsU3RvcmFnZURpcmVjdG9yeSgpLCAiZGV2aWNlLWluZm8tZmlsZXMiKTsKKyAgICAgICAgaWYgKCFkaXIubWtkaXJzKCkgJiYgIWRpci5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZGlyOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0RGV2aWNlSW5mbygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBpZiAoIW1BY3Rpdml0eUxpc3QuY29udGFpbnMoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICBmaW5hbCBGaWxlIGRpciA9IG5ldyBGaWxlKEVudmlyb25tZW50LmdldEV4dGVybmFsU3RvcmFnZURpcmVjdG9yeSgpLCAiZGV2aWNlLWluZm8tZmlsZXMiKTsKKyAgICAgICAgZmluYWwgRmlsZSBkaXI7CiAgICAgICAgIGlmICghRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlU3RhdGUoKS5lcXVhbHMoRW52aXJvbm1lbnQuTUVESUFfTU9VTlRFRCkpIHsKICAgICAgICAgICAgIGZhaWxlZCgiRXh0ZXJuYWwgc3RvcmFnZSBpcyBub3QgbW91bnRlZCIpOwotICAgICAgICB9IGVsc2UgaWYgKCFkaXIubWtkaXJzKCkgJiYgIWRpci5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgIH0gZWxzZSBpZiAoKGRpciA9IG1ha2VSZXN1bHREaXIoKSkgPT0gbnVsbCkgewogICAgICAgICAgICAgZmFpbGVkKCJDYW5ub3QgY3JlYXRlIGRpcmVjdG9yeSBmb3IgZGV2aWNlIGluZm8gZmlsZXMiKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHRyeSB7CmRpZmYgLS1naXQgYS9jb21tb24vZGV2aWNlLXNpZGUvZGV2aWNlLWluZm8vc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL2RldmljZWluZm8vR2VuZXJpY0RldmljZUluZm8uamF2YSBiL2NvbW1vbi9kZXZpY2Utc2lkZS9kZXZpY2UtaW5mby9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vZGV2aWNlaW5mby9HZW5lcmljRGV2aWNlSW5mby5qYXZhCmluZGV4IGNiNDMyNGMuLjQyNGEyYmEgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9kZXZpY2Utc2lkZS9kZXZpY2UtaW5mby9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vZGV2aWNlaW5mby9HZW5lcmljRGV2aWNlSW5mby5qYXZhCisrKyBiL2NvbW1vbi9kZXZpY2Utc2lkZS9kZXZpY2UtaW5mby9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vZGV2aWNlaW5mby9HZW5lcmljRGV2aWNlSW5mby5qYXZhCkBAIC0yOSw2ICsyOSw3IEBACiBpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLmRldmljZWluZm8uRGV2aWNlSW5mbzsKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkFwaUxldmVsVXRpbDsKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkRldmljZUluZm9TdG9yZTsKIAogLyoqCkBAIC03Myw3ICs3NCwxMSBAQAogICAgICAgICBzdG9yZS5hZGRSZXN1bHQoQlVJTERfRklOR0VSUFJJTlQsIEJ1aWxkLkZJTkdFUlBSSU5UKTsKICAgICAgICAgc3RvcmUuYWRkUmVzdWx0KEJVSUxEX0FCSSwgQnVpbGQuQ1BVX0FCSSk7CiAgICAgICAgIHN0b3JlLmFkZFJlc3VsdChCVUlMRF9BQkkyLCBCdWlsZC5DUFVfQUJJMik7Ci0gICAgICAgIHN0b3JlLmFkZFJlc3VsdChCVUlMRF9TRVJJQUwsIEJ1aWxkLlNFUklBTCk7CisgICAgICAgIGlmIChBcGlMZXZlbFV0aWwuaXNBdExlYXN0KEJ1aWxkLlZFUlNJT05fQ09ERVMuTykpIHsKKyAgICAgICAgICAgIHN0b3JlLmFkZFJlc3VsdChCVUlMRF9TRVJJQUwsIEJ1aWxkLmdldFNlcmlhbCgpKTsgLy8gYWRkZWQgaW4gTworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RvcmUuYWRkUmVzdWx0KEJVSUxEX1NFUklBTCwgQnVpbGQuU0VSSUFMKTsgLy8gZGVwcmVjYXRlZCBpbiBPCisgICAgICAgIH0KICAgICAgICAgc3RvcmUuYWRkUmVzdWx0KEJVSUxEX1ZFUlNJT05fUkVMRUFTRSwgQnVpbGQuVkVSU0lPTi5SRUxFQVNFKTsKICAgICAgICAgc3RvcmUuYWRkUmVzdWx0KEJVSUxEX1ZFUlNJT05fU0RLLCBCdWlsZC5WRVJTSU9OLlNESyk7CiAgICAgICAgIHN0b3JlLmFkZFJlc3VsdChCVUlMRF9SRUZFUkVOQ0VfRklOR0VSUFJJTlQsCmRpZmYgLS1naXQgYS9jb21tb24vZGV2aWNlLXNpZGUvZGV2aWNlLWluZm8vc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL2RldmljZWluZm8vVmludGZEZXZpY2VJbmZvLmphdmEgYi9jb21tb24vZGV2aWNlLXNpZGUvZGV2aWNlLWluZm8vc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL2RldmljZWluZm8vVmludGZEZXZpY2VJbmZvLmphdmEKaW5kZXggYzlhNjI2NS4uYjlhOTUyMiAxMDA2NDQKLS0tIGEvY29tbW9uL2RldmljZS1zaWRlL2RldmljZS1pbmZvL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi9kZXZpY2VpbmZvL1ZpbnRmRGV2aWNlSW5mby5qYXZhCisrKyBiL2NvbW1vbi9kZXZpY2Utc2lkZS9kZXZpY2UtaW5mby9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vZGV2aWNlaW5mby9WaW50ZkRldmljZUluZm8uamF2YQpAQCAtNDUsNyArNDUsNiBAQAogICAgICAgICBzdG9yZS5hZGRSZXN1bHQoIm9zX3ZlcnNpb24iLCBWaW50ZlJ1bnRpbWVJbmZvLmdldE9zVmVyc2lvbigpKTsKICAgICAgICAgc3RvcmUuYWRkUmVzdWx0KCJoYXJkd2FyZV9pZCIsIFZpbnRmUnVudGltZUluZm8uZ2V0SGFyZHdhcmVJZCgpKTsKICAgICAgICAgc3RvcmUuYWRkUmVzdWx0KCJrZXJuZWxfdmVyc2lvbiIsIFZpbnRmUnVudGltZUluZm8uZ2V0S2VybmVsVmVyc2lvbigpKTsKLSAgICAgICAgc3RvcmUuYWRkUmVzdWx0KCJrZXJuZWxfc2Vwb2xpY3lfdmVyc2lvbiIsIFZpbnRmUnVudGltZUluZm8uZ2V0S2VybmVsU2Vwb2xpY3lWZXJzaW9uKCkpOwogICAgICAgICBzdG9yZS5hZGRSZXN1bHQoInNlcG9saWN5X3ZlcnNpb24iLCBWaW50Zk9iamVjdC5nZXRTZXBvbGljeVZlcnNpb24oKSk7CiAKICAgICAgICAgU3RyaW5nW10gaGFscyA9IFZpbnRmT2JqZWN0LmdldEhhbE5hbWVzQW5kVmVyc2lvbnMoKTsKQEAgLTY0LDUgKzYzLDE1IEBACiAgICAgICAgICAgICBzdG9yZS5lbmRHcm91cCgpOwogICAgICAgICB9CiAgICAgICAgIHN0b3JlLmVuZEFycmF5KCk7CisKKyAgICAgICAgLy8gZ2V0VGFyZ2V0RnJhbWV3b3JrQ29tcGF0aWJpbGl0eU1hdHJpeFZlcnNpb24gaXMgYXZhaWxhYmxlIEFuZHJvaWQgUCBvbndhcmQuCisgICAgICAgIC8vIChVc2UgT19NUjEgdW50aWwgUCBpcyByZWxlYXNlZC4pCisgICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgPD0gQnVpbGQuVkVSU0lPTl9DT0RFUy5PX01SMSkgeworICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgTG9uZyB2ZXJzaW9uID0gVmludGZPYmplY3QuZ2V0VGFyZ2V0RnJhbWV3b3JrQ29tcGF0aWJpbGl0eU1hdHJpeFZlcnNpb24oKTsKKyAgICAgICAgaWYgKHZlcnNpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgc3RvcmUuYWRkUmVzdWx0KCJ0YXJnZXRfZmNtX3ZlcnNpb24iLCB2ZXJzaW9uKTsKKyAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvbW1vbi9kZXZpY2Utc2lkZS9kZXZpY2UtaW5mby9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vZGV2aWNlaW5mby9WaW50ZkZpbGVzQ29sbGVjdG9yLmphdmEgYi9jb21tb24vZGV2aWNlLXNpZGUvZGV2aWNlLWluZm8vc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL2RldmljZWluZm8vVmludGZGaWxlc0NvbGxlY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5OTk3ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vZGV2aWNlLXNpZGUvZGV2aWNlLWluZm8vc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL2RldmljZWluZm8vVmludGZGaWxlc0NvbGxlY3Rvci5qYXZhCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24uZGV2aWNlaW5mbzsKKworaW1wb3J0IGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0Q2FzZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7CitpbXBvcnQgYW5kcm9pZC5vcy5WaW50Zk9iamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7CitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRmFjdG9yeTsKKworLyoqCisgKiBEZXZpY2Utc2lkZSBWSU5URiBmaWxlcyBjb2xsZWN0b3IuIFVzZXMge0BsaW5rIGFuZHJvaWQub3MuVmludGZPYmplY3R9IHRvIGNvbGxlY3QgVklOVEYgbWFuaWZlc3RzCisgKiBhbmQgY29tcGF0aWJpbGl0eSBtYXRyaWNlcy4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFZpbnRmRmlsZXNDb2xsZWN0b3IgZXh0ZW5kcyBJbnN0cnVtZW50YXRpb25UZXN0Q2FzZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlJBTUVXT1JLX01BTklGRVNUX05BTUUgPSAiZnJhbWV3b3JrX21hbmlmZXN0LnhtbCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZSQU1FV09SS19NQVRSSVhfTkFNRSA9ICJmcmFtZXdvcmtfY29tcGF0aWJpbGl0eV9tYXRyaXgueG1sIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVWSUNFX01BTklGRVNUX05BTUUgPSAiZGV2aWNlX21hbmlmZXN0LnhtbCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFVklDRV9NQVRSSVhfTkFNRSA9ICJkZXZpY2VfY29tcGF0aWJpbGl0eV9tYXRyaXgueG1sIjsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0VmludGZGaWxlcygpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgPCBCdWlsZC5WRVJTSU9OX0NPREVTLk8pIHsKKyAgICAgICAgICAgIC8vIE5vIFZJTlRGIGJlZm9yZSBPLgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRXh0ZXJuYWwgc3RvcmFnZSBpcyBub3QgbW91bnRlZCIsCisgICAgICAgICAgICAgICAgRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlU3RhdGUoKS5lcXVhbHMoRW52aXJvbm1lbnQuTUVESUFfTU9VTlRFRCkpOworICAgICAgICBGaWxlIGRpciA9IERldmljZUluZm8ubWFrZVJlc3VsdERpcigpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJDYW5ub3QgY3JlYXRlIGRpcmVjdG9yeSBmb3IgZGV2aWNlIGluZm8gZmlsZXMiLCBkaXIpOworICAgICAgICBjb2xsZWN0KGRpcik7CisgICAgfQorCisKKyAgICAvLyByZXBvcnQoKSBkb2Vzbid0IGRpc3Rpbmd1aXNoIHRoZSBmb3VyIFhNTCBTdHJpbmdzLCBzbyB3ZSBoYXZlIHRvIGd1ZXNzLgorICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY29sbGVjdChGaWxlIGRpcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoU3RyaW5nIGNvbnRlbnQgOiBWaW50Zk9iamVjdC5yZXBvcnQoKSkgeworICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gZ3Vlc3NGaWxlTmFtZShjb250ZW50KTsKKyAgICAgICAgICAgIGlmIChmaWxlTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgd3JpdGVTdHJpbmdUb0ZpbGUoY29udGVudCwgbmV3IEZpbGUoZGlyLCBmaWxlTmFtZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZVN0cmluZ1RvRmlsZShTdHJpbmcgY29udGVudCwgRmlsZSBmaWxlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGNvbnRlbnQgPT0gbnVsbCB8fCBjb250ZW50LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRyeSAoV3JpdGVyIG9zID0gbmV3IEZpbGVXcml0ZXIoZmlsZSkpIHsKKyAgICAgICAgICAgIG9zLndyaXRlKGNvbnRlbnQpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gR3Vlc3MgYSBzdWl0YWJsZSBmaWxlIG5hbWUgZm9yIHRoZSBnaXZlbiBYTUwgc3RyaW5nLiBSZXR1cm4gbnVsbCBpZgorICAgIC8vIGl0IGlzIG5vdCBhbiBYTUwgc3RyaW5nLCBvciBubyBzdWl0YWJsZSBuYW1lcyBjYW4gYmUgcHJvdmlkZWQuCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGd1ZXNzRmlsZU5hbWUoU3RyaW5nIGNvbnRlbnQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgWG1sUHVsbFBhcnNlciBwYXJzZXIgPSBYbWxQdWxsUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1B1bGxQYXJzZXIoKTsKKyAgICAgICAgICAgIHBhcnNlci5zZXRJbnB1dChuZXcgU3RyaW5nUmVhZGVyKGNvbnRlbnQpKTsKKworICAgICAgICAgICAgZm9yIChpbnQgZXZlbnRUeXBlID0gcGFyc2VyLmdldEV2ZW50VHlwZSgpOyBldmVudFR5cGUgIT0gWG1sUHVsbFBhcnNlci5FTkRfRE9DVU1FTlQ7CisgICAgICAgICAgICAgICAgIGV2ZW50VHlwZSA9IHBhcnNlci5uZXh0KCkpIHsKKworICAgICAgICAgICAgICAgIGlmIChldmVudFR5cGUgPT0gWG1sUHVsbFBhcnNlci5TVEFSVF9UQUcpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRhZyA9IHBhcnNlci5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZXIuZ2V0RGVwdGgoKSAhPSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gb25seSBwYXJzZSB0b3AgbGV2ZWwgdGFncworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHR5cGUgPSBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInR5cGUiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCJtYW5pZmVzdCIuZXF1YWxzKHRhZykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgiZnJhbWV3b3JrIi5lcXVhbHModHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRlJBTUVXT1JLX01BTklGRVNUX05BTUU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoImRldmljZSIuZXF1YWxzKHR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERFVklDRV9NQU5JRkVTVF9OQU1FOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICgiY29tcGF0aWJpbGl0eS1tYXRyaXgiLmVxdWFscyh0YWcpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoImZyYW1ld29yayIuZXF1YWxzKHR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZSQU1FV09SS19NQVRSSVhfTkFNRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgiZGV2aWNlIi5lcXVhbHModHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gREVWSUNFX01BVFJJWF9OQU1FOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb21tb24vZGV2aWNlLXNpZGUvZGV2aWNlLWluZm8vc3JjX3N0dWIvYW5kcm9pZC9vcy9TeXN0ZW1Qcm9wZXJ0aWVzLmphdmEgYi9jb21tb24vZGV2aWNlLXNpZGUvZGV2aWNlLWluZm8vc3JjX3N0dWIvYW5kcm9pZC9vcy9TeXN0ZW1Qcm9wZXJ0aWVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY4YTA1MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9kZXZpY2Utc2lkZS9kZXZpY2UtaW5mby9zcmNfc3R1Yi9hbmRyb2lkL29zL1N5c3RlbVByb3BlcnRpZXMuamF2YQpAQCAtMCwwICsxLDkgQEAKKy8qKgorICogVGhpcyBpcyBhIHN0dWIgbGlicmFyeSBmb3IgdGhlIHJ1bnRpbWUgY2xhc3MgYXQKKyAqIGZyYW1ld29ya3MvYmFzZS9jb3JlL2phdmEvYW5kcm9pZC9vcy9TeXN0ZW1Qcm9wZXJ0aWVzLmphdmEKKyAqLworcGFja2FnZSBhbmRyb2lkLm9zOworCitwdWJsaWMgY2xhc3MgU3lzdGVtUHJvcGVydGllcyB7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0KFN0cmluZyBrZXksIFN0cmluZyBkZWYpIHsgcmV0dXJuIG51bGw7IH0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9kZXZpY2Utc2lkZS9kZXZpY2UtaW5mby9zcmNfc3R1Yi9hbmRyb2lkL29zL1ZpbnRmT2JqZWN0LmphdmEgYi9jb21tb24vZGV2aWNlLXNpZGUvZGV2aWNlLWluZm8vc3JjX3N0dWIvYW5kcm9pZC9vcy9WaW50Zk9iamVjdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ZGE1MmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vZGV2aWNlLXNpZGUvZGV2aWNlLWluZm8vc3JjX3N0dWIvYW5kcm9pZC9vcy9WaW50Zk9iamVjdC5qYXZhCkBAIC0wLDAgKzEsMTYgQEAKKy8qKgorICogVGhpcyBpcyBhIHN0dWIgbGlicmFyeSBmb3IgdGhlIHJ1bnRpbWUgY2xhc3MgYXQKKyAqIGZyYW1ld29ya3MvYmFzZS9jb3JlL2phdmEvYW5kcm9pZC9vcy9WaW50Zk9iamVjdC5qYXZhCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm9zOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworcHVibGljIGNsYXNzIFZpbnRmT2JqZWN0IHsKKyAgICBwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZ1tdPiBnZXRWbmRrU25hcHNob3RzKCkgeyByZXR1cm4gbnVsbDsgfQorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNlcG9saWN5VmVyc2lvbigpIHsgcmV0dXJuIG51bGw7IH0KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldEhhbE5hbWVzQW5kVmVyc2lvbnMoKSB7IHJldHVybiBudWxsOyB9CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSByZXBvcnQoKSB7IHJldHVybiBudWxsOyB9CisgICAgcHVibGljIHN0YXRpYyBMb25nIGdldFRhcmdldEZyYW1ld29ya0NvbXBhdGliaWxpdHlNYXRyaXhWZXJzaW9uKCkgeyByZXR1cm4gbnVsbDsgfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2RldmljZS1zaWRlL2RldmljZS1pbmZvL3NyY19zdHViL2FuZHJvaWQvb3MvVmludGZSdW50aW1lSW5mby5qYXZhIGIvY29tbW9uL2RldmljZS1zaWRlL2RldmljZS1pbmZvL3NyY19zdHViL2FuZHJvaWQvb3MvVmludGZSdW50aW1lSW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwZmE5NGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vZGV2aWNlLXNpZGUvZGV2aWNlLWluZm8vc3JjX3N0dWIvYW5kcm9pZC9vcy9WaW50ZlJ1bnRpbWVJbmZvLmphdmEKQEAgLTAsMCArMSwxNyBAQAorLyoqCisgKiBUaGlzIGlzIGEgc3R1YiBsaWJyYXJ5IGZvciB0aGUgcnVudGltZSBjbGFzcyBhdAorICogZnJhbWV3b3Jrcy9iYXNlL2NvcmUvamF2YS9hbmRyb2lkL29zL1ZpbnRmUnVudGltZUluZm8uamF2YQorICovCitwYWNrYWdlIGFuZHJvaWQub3M7CisKK3B1YmxpYyBjbGFzcyBWaW50ZlJ1bnRpbWVJbmZvIHsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRCb290QXZiVmVyc2lvbigpIHsgcmV0dXJuIG51bGw7IH0KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRCb290VmJtZXRhQXZiVmVyc2lvbigpIHsgcmV0dXJuIG51bGw7IH0KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDcHVJbmZvKCkgeyByZXR1cm4gbnVsbDsgfQorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEhhcmR3YXJlSWQoKSB7IHJldHVybiBudWxsOyB9CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0S2VybmVsVmVyc2lvbigpIHsgcmV0dXJuIG51bGw7IH0KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsgcmV0dXJuIG51bGw7IH0KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRPc05hbWUoKSB7IHJldHVybiBudWxsOyB9CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0T3NSZWxlYXNlKCkgeyByZXR1cm4gbnVsbDsgfQorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE9zVmVyc2lvbigpIHsgcmV0dXJuIG51bGw7IH0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9kZXZpY2Utc2lkZS9kZXZpY2UtaW5mby90ZXN0cy9BbmRyb2lkLm1rIGIvY29tbW9uL2RldmljZS1zaWRlL2RldmljZS1pbmZvL3Rlc3RzL0FuZHJvaWQubWsKaW5kZXggZDQwNjE0Yy4uY2QwNTc5NiAxMDA2NDQKLS0tIGEvY29tbW9uL2RldmljZS1zaWRlL2RldmljZS1pbmZvL3Rlc3RzL0FuZHJvaWQubWsKKysrIGIvY29tbW9uL2RldmljZS1zaWRlL2RldmljZS1pbmZvL3Rlc3RzL0FuZHJvaWQubWsKQEAgLTE4LDEyICsxOCwxNCBAQAogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjb21wYXRpYmlsaXR5LWRldmljZS1pbmZvIGp1bml0IGxlZ2FjeS1hbmRyb2lkLXRlc3QKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjb21wYXRpYmlsaXR5LWRldmljZS1pbmZvIGp1bml0CiAKLUxPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIuc3R1YnMgYW5kcm9pZC50ZXN0LmJhc2Uuc3R1YnMKIAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIAogTE9DQUxfTU9EVUxFIDo9IGNvbXBhdGliaWxpdHktZGV2aWNlLWluZm8tdGVzdHMKIAorTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorCiBpbmNsdWRlICQoQlVJTERfU1RBVElDX0pBVkFfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2NvbW1vbi9kZXZpY2Utc2lkZS9uYXRpdmV0ZXN0aGVscGVyL0FuZHJvaWQubWsgYi9jb21tb24vZGV2aWNlLXNpZGUvbmF0aXZldGVzdGhlbHBlci9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzYjgxZTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vZGV2aWNlLXNpZGUvbmF0aXZldGVzdGhlbHBlci9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjYgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY29tcGF0aWJpbGl0eS1jb21tb24tdXRpbC1kZXZpY2VzaWRlbGliCitMT0NBTF9NT0RVTEUgOj0gbmF0aXZldGVzdGhlbHBlcgorTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0pBVkFfTElCUkFSWSkKKworaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQpkaWZmIC0tZ2l0IGEvY29tbW9uL2RldmljZS1zaWRlL25hdGl2ZXRlc3RoZWxwZXIvam5pL0FuZHJvaWQubWsgYi9jb21tb24vZGV2aWNlLXNpZGUvbmF0aXZldGVzdGhlbHBlci9qbmkvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTcwZThjCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2RldmljZS1zaWRlL25hdGl2ZXRlc3RoZWxwZXIvam5pL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzNiBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIworIyBUaGlzIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBpbmNsdWRlZCBieSB0aGUgSk5JIHRlc3QgYXBwLgorIworCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJuYXRpdmV0ZXN0aGVscGVyX2puaQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgICAgICBndGVzdF93cmFwcGVyLmNwcAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYm5hdGl2ZWhlbHBlcl9jb21wYXRfbGliYysrCitMT0NBTF9XSE9MRV9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYmd0ZXN0X25ka19jKysKK0xPQ0FMX0VYUE9SVF9TVEFUSUNfTElCUkFSWV9IRUFERVJTIDo9IGxpYmd0ZXN0X25ka19jKysKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKK0xPQ0FMX05ES19TVExfVkFSSUFOVCA6PSBjKytfc3RhdGljCitMT0NBTF9DRkxBR1MgOj0gLVdhbGwgLVdlcnJvcgorTE9DQUxfTVVMVElMSUIgOj0gYm90aAorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9jb21tb24vZGV2aWNlLXNpZGUvbmF0aXZldGVzdGhlbHBlci9qbmkvZ3Rlc3Rfd3JhcHBlci5jcHAgYi9jb21tb24vZGV2aWNlLXNpZGUvbmF0aXZldGVzdGhlbHBlci9qbmkvZ3Rlc3Rfd3JhcHBlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRhOTE5YwotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9kZXZpY2Utc2lkZS9uYXRpdmV0ZXN0aGVscGVyL2puaS9ndGVzdF93cmFwcGVyLmNwcApAQCAtMCwwICsxLDI1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8am5pLmg+CisjaW5jbHVkZSA8bmF0aXZlaGVscGVyL1Njb3BlZExvY2FsUmVmLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworbmFtZXNwYWNlIHsKKworc3RydWN0IHsKKyAgICBqY2xhc3MgY2xheno7CisKKyAgICAvKiogc3RhdGljIG1ldGhvZHMgKiovCisgICAgam1ldGhvZElEIGNyZWF0ZVRlc3REZXNjcmlwdGlvbjsKKworICAgIC8qKiBtZXRob2RzICoqLworICAgIGptZXRob2RJRCBhZGRDaGlsZDsKK30gZ0Rlc2NyaXB0aW9uOworCitzdHJ1Y3QgeworICAgIGpjbGFzcyBjbGF6ejsKKworICAgIGptZXRob2RJRCBmaXJlVGVzdFN0YXJ0ZWQ7CisgICAgam1ldGhvZElEIGZpcmVUZXN0SWdub3JlZDsKKyAgICBqbWV0aG9kSUQgZmlyZVRlc3RGYWlsdXJlOworICAgIGptZXRob2RJRCBmaXJlVGVzdEZpbmlzaGVkOworCit9IGdSdW5Ob3RpZmllcjsKKworc3RydWN0IHsKKyAgICBqY2xhc3MgY2xheno7CisgICAgam1ldGhvZElEIGN0b3I7Cit9IGdBc3NlcnRpb25GYWlsdXJlOworCitzdHJ1Y3QgeworICAgIGpjbGFzcyBjbGF6ejsKKyAgICBqbWV0aG9kSUQgY3RvcjsKK30gZ0ZhaWx1cmU7CisKK2pvYmplY3QgZ0VtcHR5QW5ub3RhdGlvbnNBcnJheTsKKworc3RydWN0IFRlc3ROYW1lSW5mbyB7CisgICAgc3RkOjpzdHJpbmcgbmF0aXZlTmFtZTsKKyAgICBib29sIHJ1bjsKK307CisvLyBNYXBzIG1hbmdsZWQgdGVzdCBuYW1lcyB0byBuYXRpdmUgdGVzdCBuYW1lcy4KK3N0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgVGVzdE5hbWVJbmZvPiBnTmF0aXZlVGVzdE5hbWVzOworCisvLyBSZXR1cm4gdGhlIGZ1bGwgbmF0aXZlIHRlc3QgbmFtZSBhcyBhIEphdmEgbWV0aG9kIG5hbWUsIHdoaWNoIGRvZXMgbm90IGFsbG93CisvLyBzbGFzaGVzIG9yIGRvdHMuIFN0b3JlIHRoZSBvcmlnaW5hbCBuYW1lIGZvciBsYXRlciBsb29rdXAuCitzdGQ6OnN0cmluZyByZWdpc3RlckFuZE1hbmdsZVRlc3ROYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYXRpdmVOYW1lKSB7CisgICAgc3RkOjpzdHJpbmcgbWFuZ2xlZE5hbWUgPSBuYXRpdmVOYW1lOworICAgIHN0ZDo6cmVwbGFjZShtYW5nbGVkTmFtZS5iZWdpbigpLCBtYW5nbGVkTmFtZS5lbmQoKSwgJy4nLCAnXycpOworICAgIHN0ZDo6cmVwbGFjZShtYW5nbGVkTmFtZS5iZWdpbigpLCBtYW5nbGVkTmFtZS5lbmQoKSwgJy8nLCAnXycpOworICAgIGdOYXRpdmVUZXN0TmFtZXMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKG1hbmdsZWROYW1lLCBUZXN0TmFtZUluZm97bmF0aXZlTmFtZSwgZmFsc2V9KSk7CisgICAgcmV0dXJuIG1hbmdsZWROYW1lOworfQorCisvLyBDcmVhdGVzIG9yZy5qdW5pdC5ydW5uZXIuRGVzY3JpcHRpb24gb2JqZWN0IGZvciBhIEdUZXN0IGdpdmVuIGl0cyBuYW1lLgoram9iamVjdCBjcmVhdGVUZXN0RGVzY3JpcHRpb24oSk5JRW52KiBlbnYsIGpzdHJpbmcgY2xhc3NOYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgbWFuZ2xlZE5hbWUpIHsKKyAgICBTY29wZWRMb2NhbFJlZjxqc3RyaW5nPiBqVGVzdE5hbWUoZW52LCBlbnYtPk5ld1N0cmluZ1VURihtYW5nbGVkTmFtZS5jX3N0cigpKSk7CisgICAgcmV0dXJuIGVudi0+Q2FsbFN0YXRpY09iamVjdE1ldGhvZChnRGVzY3JpcHRpb24uY2xhenosIGdEZXNjcmlwdGlvbi5jcmVhdGVUZXN0RGVzY3JpcHRpb24sCisgICAgICAgICAgICBjbGFzc05hbWUsIGpUZXN0TmFtZS5nZXQoKSwgZ0VtcHR5QW5ub3RhdGlvbnNBcnJheSk7Cit9CisKK2pvYmplY3QgY3JlYXRlVGVzdERlc2NyaXB0aW9uKEpOSUVudiogZW52LCBqc3RyaW5nIGNsYXNzTmFtZSwgY29uc3QgY2hhciogdGVzdENhc2VOYW1lLCBjb25zdCBjaGFyKiB0ZXN0TmFtZSkgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBuYXRpdmVOYW1lU3RyZWFtOworICAgIG5hdGl2ZU5hbWVTdHJlYW0gPDwgdGVzdENhc2VOYW1lIDw8ICIuIiA8PCB0ZXN0TmFtZTsKKyAgICBzdGQ6OnN0cmluZyBtYW5nbGVkTmFtZSA9IHJlZ2lzdGVyQW5kTWFuZ2xlVGVzdE5hbWUobmF0aXZlTmFtZVN0cmVhbS5zdHIoKSk7CisgICAgcmV0dXJuIGNyZWF0ZVRlc3REZXNjcmlwdGlvbihlbnYsIGNsYXNzTmFtZSwgbWFuZ2xlZE5hbWUpOworfQorCit2b2lkIGFkZENoaWxkKEpOSUVudiogZW52LCBqb2JqZWN0IGRlc2NyaXB0aW9uLCBqb2JqZWN0IGNoaWxkRGVzY3JpcHRpb24pIHsKKyAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKGRlc2NyaXB0aW9uLCBnRGVzY3JpcHRpb24uYWRkQ2hpbGQsIGNoaWxkRGVzY3JpcHRpb24pOworfQorCisKK2NsYXNzIEpVbml0Tm90aWZ5aW5nTGlzdGVuZXIgOiBwdWJsaWMgOjp0ZXN0aW5nOjpFbXB0eVRlc3RFdmVudExpc3RlbmVyIHsKK3B1YmxpYzoKKworICAgIEpVbml0Tm90aWZ5aW5nTGlzdGVuZXIoSk5JRW52KiBlbnYsIGpzdHJpbmcgY2xhc3NOYW1lLCBqb2JqZWN0IHJ1bk5vdGlmaWVyKQorICAgICAgICAgICAgOiBtRW52KGVudikKKyAgICAgICAgICAgICwgbVJ1bk5vdGlmaWVyKHJ1bk5vdGlmaWVyKQorICAgICAgICAgICAgLCBtQ2xhc3NOYW1lKGNsYXNzTmFtZSkKKyAgICAgICAgICAgICwgbUN1cnJlbnRUZXN0RGVzY3JpcHRpb257ZW52LCBudWxscHRyfQorICAgIHt9CisgICAgdmlydHVhbCB+SlVuaXROb3RpZnlpbmdMaXN0ZW5lcigpIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgT25UZXN0U3RhcnQoY29uc3QgdGVzdGluZzo6VGVzdEluZm8gJnRlc3RJbmZvKSBvdmVycmlkZSB7CisgICAgICAgIG1DdXJyZW50VGVzdERlc2NyaXB0aW9uLnJlc2V0KAorICAgICAgICAgICAgICAgIGNyZWF0ZVRlc3REZXNjcmlwdGlvbihtRW52LCBtQ2xhc3NOYW1lLCB0ZXN0SW5mby50ZXN0X2Nhc2VfbmFtZSgpLCB0ZXN0SW5mby5uYW1lKCkpKTsKKyAgICAgICAgbm90aWZ5KGdSdW5Ob3RpZmllci5maXJlVGVzdFN0YXJ0ZWQpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBPblRlc3RQYXJ0UmVzdWx0KGNvbnN0IHRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0ICZ0ZXN0UGFydFJlc3VsdCkgb3ZlcnJpZGUgeworICAgICAgICBpZiAoIXRlc3RQYXJ0UmVzdWx0LnBhc3NlZCgpKSB7CisgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gbWVzc2FnZVN0cmVhbTsKKyAgICAgICAgICAgIG1lc3NhZ2VTdHJlYW0gPDwgdGVzdFBhcnRSZXN1bHQuZmlsZV9uYW1lKCkgPDwgIjoiIDw8IHRlc3RQYXJ0UmVzdWx0LmxpbmVfbnVtYmVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuIiA8PCB0ZXN0UGFydFJlc3VsdC5tZXNzYWdlKCk7CisgICAgICAgICAgICBTY29wZWRMb2NhbFJlZjxqc3RyaW5nPiBqbWVzc2FnZShtRW52LCBtRW52LT5OZXdTdHJpbmdVVEYobWVzc2FnZVN0cmVhbS5zdHIoKS5jX3N0cigpKSk7CisgICAgICAgICAgICBTY29wZWRMb2NhbFJlZjxqb2JqZWN0PiBqdGhyb3dhYmxlKG1FbnYsIG1FbnYtPk5ld09iamVjdChnQXNzZXJ0aW9uRmFpbHVyZS5jbGF6eiwKKyAgICAgICAgICAgICAgICAgICAgZ0Fzc2VydGlvbkZhaWx1cmUuY3Rvciwgam1lc3NhZ2UuZ2V0KCkpKTsKKyAgICAgICAgICAgIFNjb3BlZExvY2FsUmVmPGpvYmplY3Q+IGpmYWlsdXJlKG1FbnYsIG1FbnYtPk5ld09iamVjdChnRmFpbHVyZS5jbGF6eiwKKyAgICAgICAgICAgICAgICAgICAgZ0ZhaWx1cmUuY3RvciwgbUN1cnJlbnRUZXN0RGVzY3JpcHRpb24uZ2V0KCksIGp0aHJvd2FibGUuZ2V0KCkpKTsKKyAgICAgICAgICAgIG1FbnYtPkNhbGxWb2lkTWV0aG9kKG1SdW5Ob3RpZmllciwgZ1J1bk5vdGlmaWVyLmZpcmVUZXN0RmFpbHVyZSwgamZhaWx1cmUuZ2V0KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIE9uVGVzdEVuZChjb25zdCB0ZXN0aW5nOjpUZXN0SW5mbyYpIG92ZXJyaWRlIHsKKyAgICAgICAgbm90aWZ5KGdSdW5Ob3RpZmllci5maXJlVGVzdEZpbmlzaGVkKTsKKyAgICAgICAgbUN1cnJlbnRUZXN0RGVzY3JpcHRpb24ucmVzZXQoKTsKKyAgICB9CisKKyAgICB2b2lkIHJlcG9ydERpc2FibGVkVGVzdHMoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBtYW5nbGVkTmFtZXMpIHsKKyAgICAgICAgZm9yIChjb25zdCBzdGQ6OnN0cmluZyYgbWFuZ2xlZE5hbWUgOiBtYW5nbGVkTmFtZXMpIHsKKyAgICAgICAgICAgIG1DdXJyZW50VGVzdERlc2NyaXB0aW9uLnJlc2V0KGNyZWF0ZVRlc3REZXNjcmlwdGlvbihtRW52LCBtQ2xhc3NOYW1lLCBtYW5nbGVkTmFtZSkpOworICAgICAgICAgICAgbm90aWZ5KGdSdW5Ob3RpZmllci5maXJlVGVzdElnbm9yZWQpOworICAgICAgICAgICAgbUN1cnJlbnRUZXN0RGVzY3JpcHRpb24ucmVzZXQoKTsKKyAgICAgICAgfQorICAgIH0KKworcHJpdmF0ZToKKyAgICB2b2lkIG5vdGlmeShqbWV0aG9kSUQgbWV0aG9kKSB7CisgICAgICAgIG1FbnYtPkNhbGxWb2lkTWV0aG9kKG1SdW5Ob3RpZmllciwgbWV0aG9kLCBtQ3VycmVudFRlc3REZXNjcmlwdGlvbi5nZXQoKSk7CisgICAgfQorCisgICAgSk5JRW52KiBtRW52OworICAgIGpvYmplY3QgbVJ1bk5vdGlmaWVyOworICAgIGpzdHJpbmcgbUNsYXNzTmFtZTsKKyAgICBTY29wZWRMb2NhbFJlZjxqb2JqZWN0PiBtQ3VycmVudFRlc3REZXNjcmlwdGlvbjsKK307CisKK30gIC8vIG5hbWVzcGFjZQorCitleHRlcm4gIkMiCitKTklFWFBPUlQgdm9pZCBKTklDQUxMCitKYXZhX2NvbV9hbmRyb2lkX2d0ZXN0cnVubmVyX0d0ZXN0UnVubmVyX25Jbml0aWFsaXplKEpOSUVudiAqZW52LCBqY2xhc3MsIGpzdHJpbmcgY2xhc3NOYW1lLCBqb2JqZWN0IHN1aXRlKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBndGVzdCwgcmVtb3ZpbmcgdGhlIGRlZmF1bHQgcmVzdWx0IHByaW50ZXIKKyAgICBpbnQgYXJnYyA9IDE7CisgICAgY29uc3QgY2hhciogYXJndltdID0geyAiZ3Rlc3Rfd3JhcHBlciIgfTsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCAoY2hhcioqKSBhcmd2KTsKKworICAgIGF1dG8mIGxpc3RlbmVycyA9IDo6dGVzdGluZzo6VW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmxpc3RlbmVycygpOworICAgIGRlbGV0ZSBsaXN0ZW5lcnMuUmVsZWFzZShsaXN0ZW5lcnMuZGVmYXVsdF9yZXN1bHRfcHJpbnRlcigpKTsKKworICAgIGdEZXNjcmlwdGlvbi5jbGF6eiA9IChqY2xhc3MpIGVudi0+TmV3R2xvYmFsUmVmKGVudi0+RmluZENsYXNzKCJvcmcvanVuaXQvcnVubmVyL0Rlc2NyaXB0aW9uIikpOworICAgIGdEZXNjcmlwdGlvbi5jcmVhdGVUZXN0RGVzY3JpcHRpb24gPSBlbnYtPkdldFN0YXRpY01ldGhvZElEKGdEZXNjcmlwdGlvbi5jbGF6eiwgImNyZWF0ZVRlc3REZXNjcmlwdGlvbiIsCisgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nO1tMamF2YS9sYW5nL2Fubm90YXRpb24vQW5ub3RhdGlvbjspTG9yZy9qdW5pdC9ydW5uZXIvRGVzY3JpcHRpb247Iik7CisgICAgZ0Rlc2NyaXB0aW9uLmFkZENoaWxkID0gZW52LT5HZXRNZXRob2RJRChnRGVzY3JpcHRpb24uY2xhenosICJhZGRDaGlsZCIsCisgICAgICAgICAgICAiKExvcmcvanVuaXQvcnVubmVyL0Rlc2NyaXB0aW9uOylWIik7CisKKyAgICBqY2xhc3MgYW5ub3RhdGlvbnMgPSBlbnYtPkZpbmRDbGFzcygiamF2YS9sYW5nL2Fubm90YXRpb24vQW5ub3RhdGlvbiIpOworICAgIGdFbXB0eUFubm90YXRpb25zQXJyYXkgPSBlbnYtPk5ld0dsb2JhbFJlZihlbnYtPk5ld09iamVjdEFycmF5KDAsIGFubm90YXRpb25zLCBudWxscHRyKSk7CisgICAgZ05hdGl2ZVRlc3ROYW1lcy5jbGVhcigpOworCisgICAgZ0Fzc2VydGlvbkZhaWx1cmUuY2xhenogPSAoamNsYXNzKSBlbnYtPk5ld0dsb2JhbFJlZihlbnYtPkZpbmRDbGFzcygiamF2YS9sYW5nL0Fzc2VydGlvbkVycm9yIikpOworICAgIGdBc3NlcnRpb25GYWlsdXJlLmN0b3IgPSBlbnYtPkdldE1ldGhvZElEKGdBc3NlcnRpb25GYWlsdXJlLmNsYXp6LCAiPGluaXQ+IiwgIihMamF2YS9sYW5nL09iamVjdDspViIpOworCisgICAgZ0ZhaWx1cmUuY2xhenogPSAoamNsYXNzKSBlbnYtPk5ld0dsb2JhbFJlZihlbnYtPkZpbmRDbGFzcygib3JnL2p1bml0L3J1bm5lci9ub3RpZmljYXRpb24vRmFpbHVyZSIpKTsKKyAgICBnRmFpbHVyZS5jdG9yID0gZW52LT5HZXRNZXRob2RJRChnRmFpbHVyZS5jbGF6eiwgIjxpbml0PiIsCisgICAgICAgICAgICAiKExvcmcvanVuaXQvcnVubmVyL0Rlc2NyaXB0aW9uO0xqYXZhL2xhbmcvVGhyb3dhYmxlOylWIik7CisKKyAgICBnUnVuTm90aWZpZXIuY2xhenogPSAoamNsYXNzKSBlbnYtPk5ld0dsb2JhbFJlZigKKyAgICAgICAgICAgIGVudi0+RmluZENsYXNzKCJvcmcvanVuaXQvcnVubmVyL25vdGlmaWNhdGlvbi9SdW5Ob3RpZmllciIpKTsKKyAgICBnUnVuTm90aWZpZXIuZmlyZVRlc3RTdGFydGVkID0gZW52LT5HZXRNZXRob2RJRChnUnVuTm90aWZpZXIuY2xhenosICJmaXJlVGVzdFN0YXJ0ZWQiLAorICAgICAgICAgICAgIihMb3JnL2p1bml0L3J1bm5lci9EZXNjcmlwdGlvbjspViIpOworICAgIGdSdW5Ob3RpZmllci5maXJlVGVzdElnbm9yZWQgPSBlbnYtPkdldE1ldGhvZElEKGdSdW5Ob3RpZmllci5jbGF6eiwgImZpcmVUZXN0SWdub3JlZCIsCisgICAgICAgICAgICAiKExvcmcvanVuaXQvcnVubmVyL0Rlc2NyaXB0aW9uOylWIik7CisgICAgZ1J1bk5vdGlmaWVyLmZpcmVUZXN0RmluaXNoZWQgPSBlbnYtPkdldE1ldGhvZElEKGdSdW5Ob3RpZmllci5jbGF6eiwgImZpcmVUZXN0RmluaXNoZWQiLAorICAgICAgICAgICAgIihMb3JnL2p1bml0L3J1bm5lci9EZXNjcmlwdGlvbjspViIpOworICAgIGdSdW5Ob3RpZmllci5maXJlVGVzdEZhaWx1cmUgPSBlbnYtPkdldE1ldGhvZElEKGdSdW5Ob3RpZmllci5jbGF6eiwgImZpcmVUZXN0RmFpbHVyZSIsCisgICAgICAgICAgICAiKExvcmcvanVuaXQvcnVubmVyL25vdGlmaWNhdGlvbi9GYWlsdXJlOylWIik7CisKKyAgICBhdXRvIHVuaXRUZXN0ID0gOjp0ZXN0aW5nOjpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKTsKKyAgICBmb3IgKGludCB0ZXN0Q2FzZUluZGV4ID0gMDsgdGVzdENhc2VJbmRleCA8IHVuaXRUZXN0LT50b3RhbF90ZXN0X2Nhc2VfY291bnQoKTsgdGVzdENhc2VJbmRleCsrKSB7CisgICAgICAgIGF1dG8gdGVzdENhc2UgPSB1bml0VGVzdC0+R2V0VGVzdENhc2UodGVzdENhc2VJbmRleCk7CisgICAgICAgIGZvciAoaW50IHRlc3RJbmRleCA9IDA7IHRlc3RJbmRleCA8IHRlc3RDYXNlLT50b3RhbF90ZXN0X2NvdW50KCk7IHRlc3RJbmRleCsrKSB7CisgICAgICAgICAgICBhdXRvIHRlc3RJbmZvID0gdGVzdENhc2UtPkdldFRlc3RJbmZvKHRlc3RJbmRleCk7CisgICAgICAgICAgICBTY29wZWRMb2NhbFJlZjxqb2JqZWN0PiB0ZXN0RGVzY3JpcHRpb24oZW52LAorICAgICAgICAgICAgICAgICAgICBjcmVhdGVUZXN0RGVzY3JpcHRpb24oZW52LCBjbGFzc05hbWUsIHRlc3RDYXNlLT5uYW1lKCksIHRlc3RJbmZvLT5uYW1lKCkpKTsKKyAgICAgICAgICAgIGFkZENoaWxkKGVudiwgc3VpdGUsIHRlc3REZXNjcmlwdGlvbi5nZXQoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2V4dGVybiAiQyIKK0pOSUVYUE9SVCB2b2lkIEpOSUNBTEwKK0phdmFfY29tX2FuZHJvaWRfZ3Rlc3RydW5uZXJfR3Rlc3RSdW5uZXJfbkFkZFRlc3QoSk5JRW52ICplbnYsIGpjbGFzcywganN0cmluZyB0ZXN0TmFtZSkgeworICAgIGNvbnN0IGNoYXIqIHRlc3ROYW1lQ2hhcnMgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKHRlc3ROYW1lLCBKTklfRkFMU0UpOworICAgIGF1dG8gZm91bmQgPSBnTmF0aXZlVGVzdE5hbWVzLmZpbmQodGVzdE5hbWVDaGFycyk7CisgICAgaWYgKGZvdW5kICE9IGdOYXRpdmVUZXN0TmFtZXMuZW5kKCkpIHsKKyAgICAgICAgZm91bmQtPnNlY29uZC5ydW4gPSB0cnVlOworICAgIH0KKyAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyh0ZXN0TmFtZSwgdGVzdE5hbWVDaGFycyk7Cit9CisKK2V4dGVybiAiQyIKK0pOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMCitKYXZhX2NvbV9hbmRyb2lkX2d0ZXN0cnVubmVyX0d0ZXN0UnVubmVyX25SdW4oSk5JRW52ICplbnYsIGpjbGFzcywganN0cmluZyBjbGFzc05hbWUsIGpvYmplY3Qgbm90aWZpZXIpIHsKKyAgICAvLyBBcHBseSB0aGUgdGVzdCBmaWx0ZXIgY29tcHV0ZWQgaW4gSmF2YS1sYW5kLiBUaGUgZmlsdGVyIGlzIGp1c3QgYSBsaXN0IG9mIHRlc3QgbmFtZXMuCisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIGZpbHRlclN0cmVhbTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbWFuZ2xlZE5hbWVzT2ZEaXNhYmxlZFRlc3RzOworICAgIGZvciAoY29uc3QgYXV0byYgZW50cnkgOiBnTmF0aXZlVGVzdE5hbWVzKSB7CisgICAgICAgIC8vIElmIHRoZSB0ZXN0IHdhcyBub3Qgc2VsZWN0ZWQgZm9yIHJ1bm5pbmcgYnkgdGhlIEphdmEgbGF5ZXIsIGlnbm9yZSBpdCBjb21wbGV0ZWx5LgorICAgICAgICBpZiAoIWVudHJ5LnNlY29uZC5ydW4pIGNvbnRpbnVlOworICAgICAgICAvLyBJZiB0aGUgdGVzdCBoYXMgRElTQUJMRURfIGF0IHRoZSBiZWdpbm5pbmcgb2YgaXRzIG5hbWUsIGFmdGVyIGEgc2xhc2ggb3IgYWZ0ZXIgYSBkb3QsCisgICAgICAgIC8vIHJlcG9ydCBpdCBhcyBpZ25vcmVkIChkaXNhYmxlZCkgdG8gdGhlIEphdmEgbGF5ZXIuCisgICAgICAgIGlmIChlbnRyeS5zZWNvbmQubmF0aXZlTmFtZS5maW5kKCJESVNBQkxFRF8iKSA9PSAwIHx8CisgICAgICAgICAgICAgICAgZW50cnkuc2Vjb25kLm5hdGl2ZU5hbWUuZmluZCgiL0RJU0FCTEVEXyIpICE9IHN0ZDo6c3RyaW5nOjpucG9zIHx8CisgICAgICAgICAgICAgICAgZW50cnkuc2Vjb25kLm5hdGl2ZU5hbWUuZmluZCgiLkRJU0FCTEVEXyIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICBtYW5nbGVkTmFtZXNPZkRpc2FibGVkVGVzdHMucHVzaF9iYWNrKGVudHJ5LmZpcnN0KTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGZpbHRlclN0cmVhbSA8PCBlbnRyeS5zZWNvbmQubmF0aXZlTmFtZSA8PCAiOiI7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIGZpbHRlciA9IGZpbHRlclN0cmVhbS5zdHIoKTsKKyAgICBpZiAoZmlsdGVyLmVtcHR5KCkpIHsKKyAgICAgICAgLy8gSWYgdGhlIHN0cmluZyB3ZSBidWlsdCBpcyBlbXB0eSwgd2UgZG9uJ3Qgd2FudCB0byBydW4gYW55IHRlc3RzLCBidXQgR1Rlc3QgcnVucyBhbGwgdGVzdHMKKyAgICAgICAgLy8gd2hlbiBhbiBlbXB0eSBmaWx0ZXIgaXMgcGFzc2VkLiBSZXBsYWNlIGFuIGVtcHR5IGZpbHRlciB3aXRoIGEgZmlsdGVyIHRoYXQgbWF0Y2hlcyBub3RoaW5nLgorICAgICAgICBmaWx0ZXIgPSAiLSoiOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFJlbW92ZXMgdGhlIHRyYWlsaW5nIGNvbG9uLgorICAgICAgICBmaWx0ZXIucG9wX2JhY2soKTsKKyAgICB9CisgICAgOjp0ZXN0aW5nOjpHVEVTVF9GTEFHKGZpbHRlcikgPSBmaWx0ZXI7CisKKyAgICBhdXRvJiBsaXN0ZW5lcnMgPSA6OnRlc3Rpbmc6OlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5saXN0ZW5lcnMoKTsKKyAgICBKVW5pdE5vdGlmeWluZ0xpc3RlbmVyIGp1bml0TGlzdGVuZXJ7ZW52LCBjbGFzc05hbWUsIG5vdGlmaWVyfTsKKyAgICBsaXN0ZW5lcnMuQXBwZW5kKCZqdW5pdExpc3RlbmVyKTsKKyAgICBpbnQgc3VjY2VzcyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgICBsaXN0ZW5lcnMuUmVsZWFzZSgmanVuaXRMaXN0ZW5lcik7CisgICAganVuaXRMaXN0ZW5lci5yZXBvcnREaXNhYmxlZFRlc3RzKG1hbmdsZWROYW1lc09mRGlzYWJsZWRUZXN0cyk7CisgICAgcmV0dXJuIHN1Y2Nlc3MgPT0gMDsKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9kZXZpY2Utc2lkZS9uYXRpdmV0ZXN0aGVscGVyL3NyYy9jb20vYW5kcm9pZC9ndGVzdHJ1bm5lci9HdGVzdFJ1bm5lci5qYXZhIGIvY29tbW9uL2RldmljZS1zaWRlL25hdGl2ZXRlc3RoZWxwZXIvc3JjL2NvbS9hbmRyb2lkL2d0ZXN0cnVubmVyL0d0ZXN0UnVubmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUzYTc1MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9kZXZpY2Utc2lkZS9uYXRpdmV0ZXN0aGVscGVyL3NyYy9jb20vYW5kcm9pZC9ndGVzdHJ1bm5lci9HdGVzdFJ1bm5lci5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmd0ZXN0cnVubmVyOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuRGVzY3JpcHRpb247CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5uZXI7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5tYW5pcHVsYXRpb24uRmlsdGVyOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIubWFuaXB1bGF0aW9uLkZpbHRlcmFibGU7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5tYW5pcHVsYXRpb24uTm9UZXN0c1JlbWFpbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLm5vdGlmaWNhdGlvbi5SdW5Ob3RpZmllcjsKKworLyoqCisgKiBDdXN0b20gUnVubmVyIHRoYXQgaW1wbGVtZW50cyBhIGJyaWRnZSBiZXR3ZWVuIEpVbml0IGFuZCBHVGVzdC4KKyAqIAorICogVXNlIHRoaXMgUnVubmVyIGluIGEgQFJ1bldpdGggYW5ub3RhdGlvbiB0b2dldGhlciB3aXRoIGEgQFRhcmdldExpYnJhcnkKKyAqIGFubm90YXRpb24gb24gYW4gZW1wdHkgY2xhc3MgdG8gY3JlYXRlIGEgQ1RTIHRlc3QgdGhhdCBjb25zaXN0cyBvZiBuYXRpdmUKKyAqIHRlc3RzIHdyaXR0ZW4gYWdhaW5zdCB0aGUgR29vZ2xlIFRlc3QgRnJhbWV3b3JrLiBTZWUgdGhlIENUUyBtb2R1bGUgaW4KKyAqIGN0cy90ZXN0cy90ZXN0cy9uYXRpdmVoYXJkd2FyZSBmb3IgYW4gZXhhbXBsZS4KKyAqLworcHVibGljIGNsYXNzIEd0ZXN0UnVubmVyIGV4dGVuZHMgUnVubmVyIGltcGxlbWVudHMgRmlsdGVyYWJsZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzT25jZUZsYWcgPSBmYWxzZTsKKworICAgIHByaXZhdGUgQ2xhc3MgbVRhcmdldENsYXNzOworICAgIHByaXZhdGUgRGVzY3JpcHRpb24gbURlc2NyaXB0aW9uOworCisgICAgcHVibGljIEd0ZXN0UnVubmVyKENsYXNzIHRlc3RDbGFzcykgeworICAgICAgICBzeW5jaHJvbml6ZWQgKEd0ZXN0UnVubmVyLmNsYXNzKSB7CisgICAgICAgICAgICBpZiAoc09uY2VGbGFnKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRXJyb3IgbXVsdGlwbGUgR3Rlc3RSdW5uZXJzIGRlZmluZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNPbmNlRmxhZyA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBtVGFyZ2V0Q2xhc3MgPSB0ZXN0Q2xhc3M7CisgICAgICAgIFRhcmdldExpYnJhcnkgbGlicmFyeSA9IChUYXJnZXRMaWJyYXJ5KSB0ZXN0Q2xhc3MuZ2V0QW5ub3RhdGlvbihUYXJnZXRMaWJyYXJ5LmNsYXNzKTsKKyAgICAgICAgaWYgKGxpYnJhcnkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTWlzc2luZyByZXF1aXJlZCBAVGFyZ2V0TGlicmFyeSBhbm5vdGF0aW9uIik7CisgICAgICAgIH0KKyAgICAgICAgU3lzdGVtLmxvYWRMaWJyYXJ5KGxpYnJhcnkudmFsdWUoKSk7CisgICAgICAgIG1EZXNjcmlwdGlvbiA9IERlc2NyaXB0aW9uLmNyZWF0ZVN1aXRlRGVzY3JpcHRpb24odGVzdENsYXNzKTsKKyAgICAgICAgLy8gVGhlIG5Jbml0aWFsaXplIG5hdGl2ZSBtZXRob2Qgd2lsbCBwb3B1bGF0ZSB0aGUgZGVzY3JpcHRpb24gYmFzZWQgb24KKyAgICAgICAgLy8gR1Rlc3QgdGVzdCBkYXRhLgorICAgICAgICBuSW5pdGlhbGl6ZSh0ZXN0Q2xhc3MuZ2V0TmFtZSgpLCBtRGVzY3JpcHRpb24pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBEZXNjcmlwdGlvbiBnZXREZXNjcmlwdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG1EZXNjcmlwdGlvbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoRmlsdGVyIGZpbHRlcikgdGhyb3dzIE5vVGVzdHNSZW1haW5FeGNlcHRpb24geworICAgICAgICBMaXN0PERlc2NyaXB0aW9uPiBjaGlsZHJlbiA9IG1EZXNjcmlwdGlvbi5nZXRDaGlsZHJlbigpOworICAgICAgICBtRGVzY3JpcHRpb24gPSBEZXNjcmlwdGlvbi5jcmVhdGVTdWl0ZURlc2NyaXB0aW9uKG1UYXJnZXRDbGFzcyk7CisgICAgICAgIGZvciAoSXRlcmF0b3I8RGVzY3JpcHRpb24+IGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKSB7CisgICAgICAgICAgICBEZXNjcmlwdGlvbiB0ZXN0RGVzY3JpcHRpb24gPSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChmaWx0ZXIuc2hvdWxkUnVuKHRlc3REZXNjcmlwdGlvbikpIHsKKyAgICAgICAgICAgICAgICBtRGVzY3JpcHRpb24uYWRkQ2hpbGQodGVzdERlc2NyaXB0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobURlc2NyaXB0aW9uLmdldENoaWxkcmVuKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTm9UZXN0c1JlbWFpbkV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcnVuKFJ1bk5vdGlmaWVyIG5vdGlmaWVyKSB7CisgICAgICAgIGZvciAoRGVzY3JpcHRpb24gZGVzY3JpcHRpb24gOiBtRGVzY3JpcHRpb24uZ2V0Q2hpbGRyZW4oKSkgeworICAgICAgICAgICAgbkFkZFRlc3QoZGVzY3JpcHRpb24uZ2V0TWV0aG9kTmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBuUnVuKG1UYXJnZXRDbGFzcy5nZXROYW1lKCksIG5vdGlmaWVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuSW5pdGlhbGl6ZShTdHJpbmcgY2xhc3NOYW1lLCBEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbik7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbkFkZFRlc3QoU3RyaW5nIHRlc3ROYW1lKTsKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBuUnVuKFN0cmluZyBjbGFzc05hbWUsIFJ1bk5vdGlmaWVyIG5vdGlmaWVyKTsKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9kZXZpY2Utc2lkZS9uYXRpdmV0ZXN0aGVscGVyL3NyYy9jb20vYW5kcm9pZC9ndGVzdHJ1bm5lci9UYXJnZXRMaWJyYXJ5LmphdmEgYi9jb21tb24vZGV2aWNlLXNpZGUvbmF0aXZldGVzdGhlbHBlci9zcmMvY29tL2FuZHJvaWQvZ3Rlc3RydW5uZXIvVGFyZ2V0TGlicmFyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzYmM1M2QKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vZGV2aWNlLXNpZGUvbmF0aXZldGVzdGhlbHBlci9zcmMvY29tL2FuZHJvaWQvZ3Rlc3RydW5uZXIvVGFyZ2V0TGlicmFyeS5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmd0ZXN0cnVubmVyOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uSW5oZXJpdGVkOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCitAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorQFRhcmdldChFbGVtZW50VHlwZS5UWVBFKQorQEluaGVyaXRlZAorcHVibGljIEBpbnRlcmZhY2UgVGFyZ2V0TGlicmFyeSB7CisgICAgU3RyaW5nIHZhbHVlKCk7Cit9CmRpZmYgLS1naXQgYS9jb21tb24vZGV2aWNlLXNpZGUvdGVzdC1hcHAvQW5kcm9pZC5tayBiL2NvbW1vbi9kZXZpY2Utc2lkZS90ZXN0LWFwcC9BbmRyb2lkLm1rCmluZGV4IDZhZGNlOTcuLmI2NjYwZTggMTAwNzU1Ci0tLSBhL2NvbW1vbi9kZXZpY2Utc2lkZS90ZXN0LWFwcC9BbmRyb2lkLm1rCisrKyBiL2NvbW1vbi9kZXZpY2Utc2lkZS90ZXN0LWFwcC9BbmRyb2lkLm1rCkBAIC0zMSw3ICszMSw3IEBACiAgICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtaW5mby10ZXN0c1wKICAgICBjb21wYXRpYmlsaXR5LWRldmljZS1pbmZvXAogICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtdGVzdHNcCi0gICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbAorICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0CiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDb21wYXRpYmlsaXR5VGVzdEFwcAogCmRpZmYgLS1naXQgYS9jb21tb24vZGV2aWNlLXNpZGUvdGVzdC1hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2NvbW1vbi9kZXZpY2Utc2lkZS90ZXN0LWFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDljODU3ZjAuLjNhYTVkYzUgMTAwNzU1Ci0tLSBhL2NvbW1vbi9kZXZpY2Utc2lkZS90ZXN0LWFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2NvbW1vbi9kZXZpY2Utc2lkZS90ZXN0LWFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0xNywxNCArMTcsMTcgQEAKIAogPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKICAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbiI+CisKICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0VYVEVSTkFMX1NUT1JBR0UiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX1BIT05FX1NUQVRFIiAvPgorCiAgICAgPGFwcGxpY2F0aW9uPgogICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24uZGV2aWNlaW5mby5UZXN0RGV2aWNlSW5mbyIgLz4KICAgICA8L2FwcGxpY2F0aW9uPgogCiAgICAgPCEtLSAgc2VsZi1pbnN0cnVtZW50aW5nIHRlc3QgcGFja2FnZS4gLS0+Ci0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24iCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJUZXN0cyBmb3IgZGV2aWNlLXNpZGUgQ29tcGF0aWJpbGl0eSBjb21tb24gY29kZSI+CiAgICAgPC9pbnN0cnVtZW50YXRpb24+CmRpZmYgLS1naXQgYS9jb21tb24vZGV2aWNlLXNpZGUvdGVzdC1hcHAvcnVuX3Rlc3RzLnNoIGIvY29tbW9uL2RldmljZS1zaWRlL3Rlc3QtYXBwL3J1bl90ZXN0cy5zaAppbmRleCA1NjQwMjYwLi5lNGFmZDEyIDEwMDc1NQotLS0gYS9jb21tb24vZGV2aWNlLXNpZGUvdGVzdC1hcHAvcnVuX3Rlc3RzLnNoCisrKyBiL2NvbW1vbi9kZXZpY2Utc2lkZS90ZXN0LWFwcC9ydW5fdGVzdHMuc2gKQEAgLTM1LDcgKzM1LDcgQEAKIGNoZWNrRmlsZSAke0FQS30KIAogQ09NTU9OX1BBQ0tBR0U9Y29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24KLVJVTk5FUj1hbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyCitSVU5ORVI9YW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyCiAjIFRPRE8gWzIwMTUtMTItMDkga2FsbGVdIEZhaWwgJiBleGl0IG9uIGZhaWxpbmcgaW5zdGFsbD8KIGFkYiAtcyAke1NFUklBTH0gaW5zdGFsbCAtciAtZyAke0FQS30KIGJ1aWxkX2phcl9wYXRoICR7SkFSX0RJUn0gIiR7SkFSU30iCmRpZmYgLS1naXQgYS9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvQW5kcm9pZC5tayBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzYjRhODMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvQW5kcm9pZC5tawpAQCAtMCwwICsxLDQxIEBACisjIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKSBcCisgICAgJChjYWxsIGFsbC1JYWlkbC1maWxlcy11bmRlciwgc3JjKQorCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAorICAgIGNvbXBhdGliaWxpdHktY29tbW9uLXV0aWwtZGV2aWNlc2lkZWxpYiBcCisgICAgYW5kcm9pZHgudGVzdC5ydWxlcyBcCisgICAgdWItdWlhdXRvbWF0b3IgXAorICAgIG1vY2tpdG8tdGFyZ2V0LW1pbnVzLWp1bml0NCBcCisgICAgYW5kcm9pZHguYW5ub3RhdGlvbl9hbm5vdGF0aW9uCisKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IFwKKyAgICBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzIFwKKyAgICBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicworCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9NT0RVTEUgOj0gY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQKKworTE9DQUxfU0RLX1ZFUlNJT04gOj0gdGVzdF9jdXJyZW50CisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfSkFWQV9MSUJSQVJZKQorCitpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCmRpZmYgLS1naXQgYS9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQW1VdGlscy5qYXZhIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0FtVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2UxNzhiCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0FtVXRpbHMuamF2YQpAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKKworcHVibGljIGNsYXNzIEFtVXRpbHMgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQ3RzQW1VdGlscyI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFVNUFNZU19BQ1RJVklUWV9QUk9DRVNTRVMgPSAiZHVtcHN5cyBhY3Rpdml0eSAtLXByb3RvIHByb2Nlc3NlcyI7CisKKyAgICBwcml2YXRlIEFtVXRpbHMoKSB7CisgICAgfQorCisgICAgLyoqIFJ1biAiYWRiIHNoZWxsIGFtIG1ha2UtdWlkLWlkbGUgUEFDS0FHRSIgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcnVuTWFrZVVpZElkbGUoU3RyaW5nIHBhY2thZ2VOYW1lKSB7CisgICAgICAgIFN5c3RlbVV0aWwucnVuU2hlbGxDb21tYW5kRm9yTm9PdXRwdXQoImFtIG1ha2UtdWlkLWlkbGUgIiArIHBhY2thZ2VOYW1lKTsKKyAgICB9CisKKyAgICAvKiogUnVuICJhZGIgc2hlbGwgYW0ga2lsbCBQQUNLQUdFIiAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBydW5LaWxsKFN0cmluZyBwYWNrYWdlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJ1bktpbGwocGFja2FnZU5hbWUsIGZhbHNlIC8qIHdhaXQgKi8pOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBydW5LaWxsKFN0cmluZyBwYWNrYWdlTmFtZSwgYm9vbGVhbiB3YWl0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3lzdGVtVXRpbC5ydW5TaGVsbENvbW1hbmRGb3JOb091dHB1dCgiYW0ga2lsbCAtLXVzZXIgY3VyICIgKyBwYWNrYWdlTmFtZSk7CisKKyAgICAgICAgaWYgKCF3YWl0KSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBUZXN0VXRpbHMud2FpdFVudGlsKCJwYWNrYWdlIHByb2Nlc3Mgd2FzIG5vdCBraWxsZWQ6IiArIHBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICgpIC0+ICFpc1Byb2Nlc3NSdW5uaW5nKHBhY2thZ2VOYW1lKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1Byb2Nlc3NSdW5uaW5nKFN0cmluZyBwYWNrYWdlTmFtZSkgeworICAgICAgICBmaW5hbCBTdHJpbmcgb3V0cHV0ID0gU3lzdGVtVXRpbC5ydW5TaGVsbENvbW1hbmQoInBzIC1BIC1vIE5BTUUiKTsKKyAgICAgICAgU3RyaW5nW10gcGFja2FnZXMgPSBvdXRwdXQuc3BsaXQoIlxcbiIpOworICAgICAgICBmb3IgKGludCBpID0gcGFja2FnZXMubGVuZ3RoIC0xOyBpID49MDsgLS1pKSB7CisgICAgICAgICAgICBpZiAocGFja2FnZXNbaV0uZXF1YWxzKHBhY2thZ2VOYW1lKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKiogUnVuICJhZGIgc2hlbGwgYW0gc2V0LXN0YW5kYnktYnVja2V0IiAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTdGFuZGJ5QnVja2V0KFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHZhbHVlKSB7CisgICAgICAgIFN5c3RlbVV0aWwucnVuU2hlbGxDb21tYW5kRm9yTm9PdXRwdXQoImFtIHNldC1zdGFuZGJ5LWJ1Y2tldCAiICsgcGFja2FnZU5hbWUKKyAgICAgICAgICAgICAgICArICIgIiArIHZhbHVlKTsKKyAgICB9CisKKyAgICAvKiogV2FpdCB1bnRpbCBhbGwgYnJvYWQgcXVldWVzIGFyZSBpZGxlLiAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3YWl0Rm9yQnJvYWRjYXN0SWRsZSgpIHsKKyAgICAgICAgU3lzdGVtVXRpbC5ydW5Db21tYW5kQW5kUHJpbnRPbkxvZ2NhdChUQUcsICJhbSB3YWl0LWZvci1icm9hZGNhc3QtaWRsZSIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9BcGlMZXZlbFV0aWwuamF2YSBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9BcGlMZXZlbFV0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDNlYmM3Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0FwaUxldmVsVXRpbC5qYXZhCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWw7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CisKKy8qKgorICogRGV2aWNlLXNpZGUgY29tcGF0aWJpbGl0eSB1dGlsaXR5IGNsYXNzIGZvciByZWFkaW5nIGRldmljZSBBUEkgbGV2ZWwuCisgKi8KK3B1YmxpYyBjbGFzcyBBcGlMZXZlbFV0aWwgeworCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQmVmb3JlKGludCB2ZXJzaW9uKSB7CisgICAgICAgIHJldHVybiBCdWlsZC5WRVJTSU9OLlNES19JTlQgPCB2ZXJzaW9uOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0JlZm9yZShTdHJpbmcgdmVyc2lvbikgeworICAgICAgICByZXR1cm4gQnVpbGQuVkVSU0lPTi5TREtfSU5UIDwgcmVzb2x2ZVZlcnNpb25TdHJpbmcodmVyc2lvbik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQWZ0ZXIoaW50IHZlcnNpb24pIHsKKyAgICAgICAgcmV0dXJuIEJ1aWxkLlZFUlNJT04uU0RLX0lOVCA+IHZlcnNpb247CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQWZ0ZXIoU3RyaW5nIHZlcnNpb24pIHsKKyAgICAgICAgcmV0dXJuIEJ1aWxkLlZFUlNJT04uU0RLX0lOVCA+IHJlc29sdmVWZXJzaW9uU3RyaW5nKHZlcnNpb24pOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0F0TGVhc3QoaW50IHZlcnNpb24pIHsKKyAgICAgICAgcmV0dXJuIEJ1aWxkLlZFUlNJT04uU0RLX0lOVCA+PSB2ZXJzaW9uOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0F0TGVhc3QoU3RyaW5nIHZlcnNpb24pIHsKKyAgICAgICAgcmV0dXJuIEJ1aWxkLlZFUlNJT04uU0RLX0lOVCA+PSByZXNvbHZlVmVyc2lvblN0cmluZyh2ZXJzaW9uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBdE1vc3QoaW50IHZlcnNpb24pIHsKKyAgICAgICAgcmV0dXJuIEJ1aWxkLlZFUlNJT04uU0RLX0lOVCA8PSB2ZXJzaW9uOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0F0TW9zdChTdHJpbmcgdmVyc2lvbikgeworICAgICAgICByZXR1cm4gQnVpbGQuVkVSU0lPTi5TREtfSU5UIDw9IHJlc29sdmVWZXJzaW9uU3RyaW5nKHZlcnNpb24pOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldEFwaUxldmVsKCkgeworICAgICAgICByZXR1cm4gQnVpbGQuVkVSU0lPTi5TREtfSU5UOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb2RlbmFtZUVxdWFscyhTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gQnVpbGQuVkVSU0lPTi5DT0RFTkFNRS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUudHJpbSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29kZW5hbWVTdGFydHNXaXRoKFN0cmluZyBwcmVmaXgpIHsKKyAgICAgICAgcmV0dXJuIEJ1aWxkLlZFUlNJT04uQ09ERU5BTUUuc3RhcnRzV2l0aChwcmVmaXgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENvZGVuYW1lKCkgeworICAgICAgICByZXR1cm4gQnVpbGQuVkVSU0lPTi5DT0RFTkFNRTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGludCByZXNvbHZlVmVyc2lvblN0cmluZyhTdHJpbmcgdmVyc2lvblN0cmluZykgeworICAgICAgICAvLyBBdHRlbXB0IDE6IFBhcnNlIHZlcnNpb24gc3RyaW5nIGFzIGFuIGludGVnZXIsIGUuZy4gIjIzIiBmb3IgTQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQodmVyc2lvblN0cmluZyk7CisgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7IC8qIGlnbm9yZSBmb3IgYWx0ZXJuYXRlIGFwcHJvYWNoZXMgYmVsb3cgKi8gfQorICAgICAgICAvLyBBdHRlbXB0IDI6IEZpbmQgbWF0Y2hpbmcgZmllbGQgaW4gVmVyc2lvbkNvZGVzIHV0aWxpdHkgY2xhc3MsIHJldHVybiB2YWx1ZQorICAgICAgICB0cnkgeworICAgICAgICAgICAgRmllbGQgdmVyc2lvbkZpZWxkID0gVmVyc2lvbkNvZGVzLmNsYXNzLmdldEZpZWxkKHZlcnNpb25TdHJpbmcudG9VcHBlckNhc2UoKSk7CisgICAgICAgICAgICByZXR1cm4gdmVyc2lvbkZpZWxkLmdldEludChudWxsKTsgLy8gbm8gaW5zdGFuY2UgZm9yIFZFUlNJT05fQ09ERVMsIHVzZSBudWxsCisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gfCBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBlKSB7IC8qIGlnbm9yZSAqLyB9CisgICAgICAgIC8vIEF0dGVtcHQgMzogRmluZCBmaWVsZCB3aXRoaW4gYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OX0NPREVTCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBGaWVsZCB2ZXJzaW9uRmllbGQgPSBCdWlsZC5WRVJTSU9OX0NPREVTLmNsYXNzLmdldEZpZWxkKHZlcnNpb25TdHJpbmcudG9VcHBlckNhc2UoKSk7CisgICAgICAgICAgICByZXR1cm4gdmVyc2lvbkZpZWxkLmdldEludChudWxsKTsgLy8gbm8gaW5zdGFuY2UgZm9yIFZFUlNJT05fQ09ERVMsIHVzZSBudWxsCisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gfCBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiRmFpbGVkIHRvIHBhcnNlIHZlcnNpb24gc3RyaW5nICVzIiwgdmVyc2lvblN0cmluZyksIGUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0FwcE9wc1V0aWxzLmphdmEgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQXBwT3BzVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTMzOGU0Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0FwcE9wc1V0aWxzLmphdmEKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLkFwcE9wc01hbmFnZXIuTU9ERV9BTExPV0VEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5BcHBPcHNNYW5hZ2VyLk1PREVfREVGQVVMVDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuQXBwT3BzTWFuYWdlci5NT0RFX0VSUk9SRUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLkFwcE9wc01hbmFnZXIuTU9ERV9JR05PUkVEOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQXBwT3BzTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBVdGlsaXRpZXMgZm9yIGNvbnRyb2xsaW5nIEFwcCBPcHMgc2V0dGluZ3MsIGFuZCB0ZXN0aW5nIHdoZXRoZXIgb3BzIGFyZSBsb2dnZWQuCisgKi8KK3B1YmxpYyBjbGFzcyBBcHBPcHNVdGlscyB7CisKKyAgICAvKioKKyAgICAgKiBSZXNldHMgYSBwYWNrYWdlJ3MgYXBwIG9wcyBjb25maWd1cmF0aW9uIHRvIHRoZSBkZXZpY2UgZGVmYXVsdC4gU2VlIEFwcE9wc01hbmFnZXIgZm9yIHRoZQorICAgICAqIGRlZmF1bHQgb3Agc2V0dGluZ3MuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBJdCdzIHJlY29tbWVuZGVkIHRvIGNhbGwgdGhpcyBpbiBzZXRVcCgpIGFuZCB0ZWFyRG93bigpIG9mIHlvdXIgdGVzdCBzbyB0aGUgdGVzdCBzdGFydHMgYW5kCisgICAgICogZW5kcyB3aXRoIGEgcmVwcm9kdWNpYmxlIGRlZmF1bHQgc3RhdGUsIGFuZCBzbyBkb2Vzbid0IGFmZmVjdCBvdGhlciB0ZXN0cy4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFNvbWUgYXBwIG9wcyBhcmUgY29uZmlndXJlZCB0byBiZSBub24tcmVzZXR0YWJsZSwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgc3RhdGUgb2YgdGhlc2Ugd2lsbAorICAgICAqIG5vdCBiZSByZXNldCBldmVuIHdoZW4gY2FsbGluZyB0aGlzIG1ldGhvZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyByZXNldChTdHJpbmcgcGFja2FnZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBydW5Db21tYW5kKCJhcHBvcHMgcmVzZXQgIiArIHBhY2thZ2VOYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBhcHAgb3AgbW9kZSAoZS5nLiBhbGxvd2VkLCBkZW5pZWQpIGZvciBhIHNpbmdsZSBwYWNrYWdlIGFuZCBvcGVyYXRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgc2V0T3BNb2RlKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIG9wU3RyLCBpbnQgbW9kZSkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBtb2RlU3RyOworICAgICAgICBzd2l0Y2ggKG1vZGUpIHsKKyAgICAgICAgICAgIGNhc2UgTU9ERV9BTExPV0VEOgorICAgICAgICAgICAgICAgIG1vZGVTdHIgPSAiYWxsb3ciOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNT0RFX0VSUk9SRUQ6CisgICAgICAgICAgICAgICAgbW9kZVN0ciA9ICJkZW55IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTU9ERV9JR05PUkVEOgorICAgICAgICAgICAgICAgIG1vZGVTdHIgPSAiaWdub3JlIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTU9ERV9ERUZBVUxUOgorICAgICAgICAgICAgICAgIG1vZGVTdHIgPSAiZGVmYXVsdCI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgYXBwIG9wIHR5cGUiKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgY29tbWFuZCA9ICJhcHBvcHMgc2V0ICIgKyBwYWNrYWdlTmFtZSArICIgIiArIG9wU3RyICsgIiAiICsgbW9kZVN0cjsKKyAgICAgICAgcmV0dXJuIHJ1bkNvbW1hbmQoY29tbWFuZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBhcHAgb3AgbW9kZSAoZS5nLiBNT0RFX0FMTE9XRUQsIE1PREVfREVGQVVMVCkgZm9yIGEgc2luZ2xlIHBhY2thZ2UgYW5kIG9wZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRPcE1vZGUoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgb3BTdHIpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgb3BTdGF0ZSA9IGdldE9wU3RhdGUocGFja2FnZU5hbWUsIG9wU3RyKTsKKyAgICAgICAgaWYgKG9wU3RhdGUuY29udGFpbnMoIiBhbGxvdyIpKSB7CisgICAgICAgICAgICByZXR1cm4gTU9ERV9BTExPV0VEOworICAgICAgICB9IGVsc2UgaWYgKG9wU3RhdGUuY29udGFpbnMoIiBkZW55IikpIHsKKyAgICAgICAgICAgIHJldHVybiBNT0RFX0VSUk9SRUQ7CisgICAgICAgIH0gZWxzZSBpZiAob3BTdGF0ZS5jb250YWlucygiIGlnbm9yZSIpKSB7CisgICAgICAgICAgICByZXR1cm4gTU9ERV9JR05PUkVEOworICAgICAgICB9IGVsc2UgaWYgKG9wU3RhdGUuY29udGFpbnMoIiBkZWZhdWx0IikpIHsKKyAgICAgICAgICAgIHJldHVybiBNT0RFX0RFRkFVTFQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVbmV4cGVjdGVkIGFwcCBvcCBtb2RlIHJldHVybmVkICIgKyBvcFN0YXRlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciBhbiBhbGxvd2VkIG9wZXJhdGlvbiBoYXMgYmVlbiBsb2dnZWQgYnkgdGhlIEFwcE9wc01hbmFnZXIgZm9yIGEKKyAgICAgKiBwYWNrYWdlLiBPcGVyYXRpb25zIGFyZSBub3RlZCB3aGVuIHRoZSBhcHAgYXR0ZW1wdHMgdG8gcGVyZm9ybSB0aGVtIGFuZCBjYWxscyBlLmcuCisgICAgICoge0BsaW5rIEFwcE9wc01hbmFnZXIjbm90ZU9wZXJhdGlvbn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3BTdHIgVGhlIHB1YmxpYyBzdHJpbmcgY29uc3RhbnQgb2YgdGhlIG9wZXJhdGlvbiAoZS5nLiBPUFNUUl9SRUFEX1NNUykuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGFsbG93ZWRPcGVyYXRpb25Mb2dnZWQoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgb3BTdHIpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2V0T3BTdGF0ZShwYWNrYWdlTmFtZSwgb3BTdHIpLmNvbnRhaW5zKCIgdGltZT0iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgYSByZWplY3RlZCBvcGVyYXRpb24gaGFzIGJlZW4gbG9nZ2VkIGJ5IHRoZSBBcHBPcHNNYW5hZ2VyIGZvciBhCisgICAgICogcGFja2FnZS4gT3BlcmF0aW9ucyBhcmUgbm90ZWQgd2hlbiB0aGUgYXBwIGF0dGVtcHRzIHRvIHBlcmZvcm0gdGhlbSBhbmQgY2FsbHMgZS5nLgorICAgICAqIHtAbGluayBBcHBPcHNNYW5hZ2VyI25vdGVPcGVyYXRpb259LgorICAgICAqCisgICAgICogQHBhcmFtIG9wU3RyIFRoZSBwdWJsaWMgc3RyaW5nIGNvbnN0YW50IG9mIHRoZSBvcGVyYXRpb24gKGUuZy4gT1BTVFJfUkVBRF9TTVMpLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZWplY3RlZE9wZXJhdGlvbkxvZ2dlZChTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBvcFN0cikKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRPcFN0YXRlKHBhY2thZ2VOYW1lLCBvcFN0cikuY29udGFpbnMoIiByZWplY3RUaW1lPSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGFwcCBvcCBzdGF0ZSBmb3IgYSBwYWNrYWdlLiBJbmNsdWRlcyBpbmZvcm1hdGlvbiBvbiB3aGVuIHRoZSBvcGVyYXRpb24gd2FzIGxhc3QKKyAgICAgKiBhdHRlbXB0ZWQgdG8gYmUgcGVyZm9ybWVkIGJ5IHRoZSBwYWNrYWdlLgorICAgICAqCisgICAgICogRm9ybWF0OiAiU0VORF9TTVM6IGFsbG93OyB0aW1lPSsyM2gxMm01NHM5ODBtcyBhZ287IHJlamVjdFRpbWU9KzFoMTBtMjNzMTgwbXMiCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE9wU3RhdGUoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgb3BTdHIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBydW5Db21tYW5kKCJhcHBvcHMgZ2V0ICIgKyBwYWNrYWdlTmFtZSArICIgIiArIG9wU3RyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcnVuQ29tbWFuZChTdHJpbmcgY29tbWFuZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIFN5c3RlbVV0aWwucnVuU2hlbGxDb21tYW5kKEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLCBjb21tYW5kKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQXBwU3RhbmRieVV0aWxzLmphdmEgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQXBwU3RhbmRieVV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI5NGI2MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9BcHBTdGFuZGJ5VXRpbHMuamF2YQpAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsOworCitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCitwdWJsaWMgY2xhc3MgQXBwU3RhbmRieVV0aWxzIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkN0c0FwcFN0YW5kYnlVdGlscyI7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGlmIGFwcCBzdGFuZGJ5IGlzIGVuYWJsZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgZW5hYmxlZDsgb3IgZmFsc2UgaWYgZGlzYWJsZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQXBwU3RhbmRieUVuYWJsZWQoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyByZXN1bHQgPSBTeXN0ZW1VdGlsLnJ1blNoZWxsQ29tbWFuZCgKKyAgICAgICAgICAgICAgICAiZHVtcHN5cyB1c2FnZXN0YXRzIGlzLWFwcC1zdGFuZGJ5LWVuYWJsZWQiKS50cmltKCk7CisgICAgICAgIHJldHVybiBCb29sZWFuLnBhcnNlQm9vbGVhbihyZXN1bHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgZW5hYmxlZCBzdGF0ZSBmb3IgYXBwIHN0YW5kYnkgZmVhdHVyZSBmb3IgcnVudGltZSBzd2l0Y2guCisgICAgICoKKyAgICAgKiBBcHAgc3RhbmRieSBmZWF0dXJlIGhhcyAyIHN3aXRjaGVzLiBUaGlzIG9uZSBhZmZlY3RzIHRoZSBzd2l0Y2ggYXQgcnVudGltZS4gSWYgdGhlIGJ1aWxkCisgICAgICogc3dpdGNoIGlzIG9mZiwgZW5hYmxpbmcgdGhlIHJ1bnRpbWUgc3dpdGNoIHdpbGwgbm90IGVuYWJsZSBBcHAgc3RhbmRieS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbmFibGVkIGlmIEFwcCBzdGFuZGJ5IGlzIGVuYWJsZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEFwcFN0YW5kYnlFbmFibGVkQXRSdW50aW1lKGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWUgPSBlbmFibGVkID8gIjEiIDogIjAiOworICAgICAgICBMb2cuZChUQUcsICJTZXR0aW5nIEFwcFN0YW5kYnkgIiArIChlbmFibGVkID8gImVuYWJsZWQiIDogImRpc2FibGVkIikgKyAiIGF0IHJ1bnRpbWUuIik7CisgICAgICAgIFNldHRpbmdzVXRpbHMucHV0R2xvYmFsU2V0dGluZygiYXBwX3N0YW5kYnlfZW5hYmxlZCIsIHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGlmIGFwcCBzdGFuZGJ5IGlzIGVuYWJsZWQgYXQgcnVudGltZS4gTm90ZSB7QGxpbmsgI2lzQXBwU3RhbmRieUVuYWJsZWQoKX0gbWF5IHN0aWxsCisgICAgICogcmV0dXJuIHtAY29kZSBmYWxzZX0gaWYgdGhpcyBtZXRob2QgcmV0dXJucyB7QGNvZGUgdHJ1ZX0sIGJlY2F1c2UgYXBwIHN0YW5kYnkgY2FuIGJlIGRpc2FibGVkCisgICAgICogYXQgYnVpbGQgdGltZSBhcyB3ZWxsLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIGVuYWJsZWQgYXQgcnVudGltZTsgb3IgZmFsc2UgaWYgZGlzYWJsZWQgYXQgcnVudGltZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBcHBTdGFuZGJ5RW5hYmxlZEF0UnVudGltZSgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdCA9CisgICAgICAgICAgICAgICAgU3lzdGVtVXRpbC5ydW5TaGVsbENvbW1hbmQoInNldHRpbmdzIGdldCBnbG9iYWwgYXBwX3N0YW5kYnlfZW5hYmxlZCIpLnRyaW0oKTsKKyAgICAgICAgLy8gZnJhbWV3b3JrIGNvbnNpZGVycyBudWxsIHZhbHVlIGFzIGVuYWJsZWQuCisgICAgICAgIGZpbmFsIGJvb2xlYW4gYm9vbFJlc3VsdCA9IHJlc3VsdC5lcXVhbHMoIjEiKSB8fCByZXN1bHQuZXF1YWxzKCJudWxsIik7CisgICAgICAgIExvZy5kKFRBRywgIkFwcFN0YW5kYnkgaXMgIiArIChib29sUmVzdWx0ID8gImVuYWJsZWQiIDogImRpc2FibGVkIikgKyAiIGF0IHJ1bnRpbWUuIik7CisgICAgICAgIHJldHVybiBib29sUmVzdWx0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9CYXR0ZXJ5VXRpbHMuamF2YSBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9CYXR0ZXJ5VXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTg4ZThhCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0JhdHRlcnlVdGlscy5qYXZhCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKKworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlNldHRpbmdzVXRpbHMucHV0R2xvYmFsU2V0dGluZzsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5UZXN0VXRpbHMud2FpdFVudGlsOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJhdHRlcnlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuUG93ZXJNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuR2xvYmFsOworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3N1bWU7CisKK3B1YmxpYyBjbGFzcyBCYXR0ZXJ5VXRpbHMgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQ3RzQmF0dGVyeVV0aWxzIjsKKworICAgIHByaXZhdGUgQmF0dGVyeVV0aWxzKCkgeworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQmF0dGVyeU1hbmFnZXIgZ2V0QmF0dGVyeU1hbmFnZXIoKSB7CisgICAgICAgIHJldHVybiBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShCYXR0ZXJ5TWFuYWdlci5jbGFzcyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBQb3dlck1hbmFnZXIgZ2V0UG93ZXJNYW5hZ2VyKCkgeworICAgICAgICByZXR1cm4gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoUG93ZXJNYW5hZ2VyLmNsYXNzKTsKKyAgICB9CisKKyAgICAvKiogTWFrZSB0aGUgdGFyZ2V0IGRldmljZSB0aGluayBpdCdzIG9mZiBjaGFyZ2VyLiAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBydW5EdW1wc3lzQmF0dGVyeVVucGx1ZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTeXN0ZW1VdGlsLnJ1blNoZWxsQ29tbWFuZEZvck5vT3V0cHV0KCJkdW1wc3lzIGJhdHRlcnkgdW5wbHVnIik7CisKKyAgICAgICAgTG9nLmQoVEFHLCAiQmF0dGVyeSBVTlBMVUdHRUQiKTsKKyAgICB9CisKKyAgICAvKiogUmVzZXQge0BsaW5rICNydW5EdW1wc3lzQmF0dGVyeVVucGx1Z30uICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBydW5EdW1wc3lzQmF0dGVyeVJlc2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN5c3RlbVV0aWwucnVuU2hlbGxDb21tYW5kRm9yTm9PdXRwdXQoKCJkdW1wc3lzIGJhdHRlcnkgcmVzZXQiKSk7CisKKyAgICAgICAgTG9nLmQoVEFHLCAiQmF0dGVyeSBSRVNFVCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuYWJsZSAvIGRpc2FibGUgYmF0dGVyeSBzYXZlci4gTm90ZSB7QGxpbmsgI3J1bkR1bXBzeXNCYXR0ZXJ5VW5wbHVnfSBtdXN0IGhhdmUgYmVlbgorICAgICAqIGV4ZWN1dGVkIGJlZm9yZSBlbmFibGluZyBCUy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZW5hYmxlQmF0dGVyeVNhdmVyKGJvb2xlYW4gZW5hYmxlZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChlbmFibGVkKSB7CisgICAgICAgICAgICBTeXN0ZW1VdGlsLnJ1blNoZWxsQ29tbWFuZEZvck5vT3V0cHV0KCJjbWQgcG93ZXIgc2V0LW1vZGUgMSIpOworICAgICAgICAgICAgcHV0R2xvYmFsU2V0dGluZyhHbG9iYWwuTE9XX1BPV0VSX01PREUsICIxIik7CisgICAgICAgICAgICB3YWl0VW50aWwoIkJhdHRlcnkgc2F2ZXIgc3RpbGwgb2ZmIiwgKCkgLT4gZ2V0UG93ZXJNYW5hZ2VyKCkuaXNQb3dlclNhdmVNb2RlKCkpOworICAgICAgICAgICAgd2FpdFVudGlsKCJMb2NhdGlvbiBtb2RlIHN0aWxsICIgKyBnZXRQb3dlck1hbmFnZXIoKS5nZXRMb2NhdGlvblBvd2VyU2F2ZU1vZGUoKSwKKyAgICAgICAgICAgICAgICAgICAgKCkgLT4gKFBvd2VyTWFuYWdlci5MT0NBVElPTl9NT0RFX05PX0NIQU5HRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IGdldFBvd2VyTWFuYWdlcigpLmdldExvY2F0aW9uUG93ZXJTYXZlTW9kZSgpKSk7CisKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcCg1MDApOworICAgICAgICAgICAgd2FpdFVudGlsKCJGb3JjZSBhbGwgYXBwcyBzdGFuZGJ5IHN0aWxsIG9mZiIsCisgICAgICAgICAgICAgICAgICAgICgpIC0+IFN5c3RlbVV0aWwucnVuU2hlbGxDb21tYW5kKCJkdW1wc3lzIGFsYXJtIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29udGFpbnMoIiBGb3JjZSBhbGwgYXBwcyBzdGFuZGJ5OiB0cnVlXG4iKSk7CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN5c3RlbVV0aWwucnVuU2hlbGxDb21tYW5kRm9yTm9PdXRwdXQoImNtZCBwb3dlciBzZXQtbW9kZSAwIik7CisgICAgICAgICAgICBwdXRHbG9iYWxTZXR0aW5nKEdsb2JhbC5MT1dfUE9XRVJfTU9ERV9TVElDS1ksICIwIik7CisgICAgICAgICAgICB3YWl0VW50aWwoIkJhdHRlcnkgc2F2ZXIgc3RpbGwgb24iLCAoKSAtPiAhZ2V0UG93ZXJNYW5hZ2VyKCkuaXNQb3dlclNhdmVNb2RlKCkpOworICAgICAgICAgICAgd2FpdFVudGlsKCJMb2NhdGlvbiBtb2RlIHN0aWxsICIgKyBnZXRQb3dlck1hbmFnZXIoKS5nZXRMb2NhdGlvblBvd2VyU2F2ZU1vZGUoKSwKKyAgICAgICAgICAgICAgICAgICAgKCkgLT4gKFBvd2VyTWFuYWdlci5MT0NBVElPTl9NT0RFX05PX0NIQU5HRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IGdldFBvd2VyTWFuYWdlcigpLmdldExvY2F0aW9uUG93ZXJTYXZlTW9kZSgpKSk7CisKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcCg1MDApOworICAgICAgICAgICAgd2FpdFVudGlsKCJGb3JjZSBhbGwgYXBwcyBzdGFuZGJ5IHN0aWxsIG9uIiwKKyAgICAgICAgICAgICAgICAgICAgKCkgLT4gU3lzdGVtVXRpbC5ydW5TaGVsbENvbW1hbmQoImR1bXBzeXMgYWxhcm0iKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb250YWlucygiIEZvcmNlIGFsbCBhcHBzIHN0YW5kYnk6IGZhbHNlXG4iKSk7CisgICAgICAgIH0KKworICAgICAgICBBbVV0aWxzLndhaXRGb3JCcm9hZGNhc3RJZGxlKCk7CisgICAgICAgIExvZy5kKFRBRywgIkJhdHRlcnkgc2F2ZXIgdHVybmVkICIgKyAoZW5hYmxlZCA/ICJPTiIgOiAiT0ZGIikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFR1cm4gb24vb2ZmIHNjcmVlbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdHVybk9uU2NyZWVuKGJvb2xlYW4gb24pIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAob24pIHsKKyAgICAgICAgICAgIFN5c3RlbVV0aWwucnVuU2hlbGxDb21tYW5kRm9yTm9PdXRwdXQoImlucHV0IGtleWV2ZW50IEtFWUNPREVfV0FLRVVQIik7CisgICAgICAgICAgICB3YWl0VW50aWwoIkRldmljZSBzdGlsbCBub3QgaW50ZXJhY3RpdmUiLCAoKSAtPiBnZXRQb3dlck1hbmFnZXIoKS5pc0ludGVyYWN0aXZlKCkpOworCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTeXN0ZW1VdGlsLnJ1blNoZWxsQ29tbWFuZEZvck5vT3V0cHV0KCJpbnB1dCBrZXlldmVudCBLRVlDT0RFX1NMRUVQIik7CisgICAgICAgICAgICB3YWl0VW50aWwoIkRldmljZSBzdGlsbCBpbnRlcmFjdGl2ZSIsICgpIC0+ICFnZXRQb3dlck1hbmFnZXIoKS5pc0ludGVyYWN0aXZlKCkpOworICAgICAgICB9CisgICAgICAgIEFtVXRpbHMud2FpdEZvckJyb2FkY2FzdElkbGUoKTsKKyAgICAgICAgTG9nLmQoVEFHLCAiU2NyZWVuIHR1cm5lZCAiICsgKG9uID8gIk9OIiA6ICJPRkYiKSk7CisgICAgfQorCisgICAgLyoqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZGV2aWNlIHN1cHBvcnRzIGJhdHRlcnkgc2F2ZXIuICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQmF0dGVyeVNhdmVyU3VwcG9ydGVkKCkgeworICAgICAgICBmaW5hbCBJbnRlbnQgYmF0dGVyeUluZm8gPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCkucmVnaXN0ZXJSZWNlaXZlcigKKyAgICAgICAgICAgICAgICBudWxsLCBuZXcgSW50ZW50RmlsdGVyKEludGVudC5BQ1RJT05fQkFUVEVSWV9DSEFOR0VEKSk7CisgICAgICAgIGlmICghYmF0dGVyeUluZm8uZ2V0Qm9vbGVhbkV4dHJhKEJhdHRlcnlNYW5hZ2VyLkVYVFJBX1BSRVNFTlQsIHRydWUpKSB7CisgICAgICAgICAgICAvLyBEZXZpY2VzIHdpdGhvdXQgYmF0dGVyeSBkb2VzIG5vdCBzdXBwb3J0IGJhdHRlcnkgc2F2ZXIuCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBQYWNrYWdlTWFuYWdlciBwbSA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKS5nZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICByZXR1cm4gIXBtLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9XQVRDSCk7CisgICAgfQorCisgICAgLyoqICJBc3N1bWUiIHRoZSBjdXJyZW50IGRldmljZSBzdXBwb3J0cyBiYXR0ZXJ5IHNhdmVyLiAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3N1bWVCYXR0ZXJ5U2F2ZXJGZWF0dXJlKCkgeworICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZSgiRGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBiYXR0ZXJ5IHNhdmVyIiwgaXNCYXR0ZXJ5U2F2ZXJTdXBwb3J0ZWQoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0JlZm9yZUFmdGVyUnVsZS5qYXZhIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0JlZm9yZUFmdGVyUnVsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNzU2NzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQmVmb3JlQWZ0ZXJSdWxlLmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWw7CisKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVzdFJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5EZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5tb2RlbC5TdGF0ZW1lbnQ7CisKKy8qKgorICogQ3VzdG9tIEpVbml0NCBydWxlIHRoYXQgcHJvdmlkZXMgImJlZm9yZSIgLyAiYWZ0ZXIiIGNhbGxiYWNrcywgd2hpY2ggaXMgdXNlZnVsIHRvIHVzZSB3aXRoCisgKiB7QGxpbmsgb3JnLmp1bml0LnJ1bGVzLlJ1bGVDaGFpbn0uCisgKi8KK3B1YmxpYyBjbGFzcyBCZWZvcmVBZnRlclJ1bGUgaW1wbGVtZW50cyBUZXN0UnVsZSB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0YXRlbWVudCBhcHBseShTdGF0ZW1lbnQgYmFzZSwgRGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdGF0ZW1lbnQoKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgZXZhbHVhdGUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgICAgICAgICBvbkJlZm9yZShiYXNlLCBkZXNjcmlwdGlvbik7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgYmFzZS5ldmFsdWF0ZSgpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIG9uQWZ0ZXIoYmFzZSwgZGVzY3JpcHRpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkJlZm9yZShTdGF0ZW1lbnQgYmFzZSwgRGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBUaHJvd2FibGUgeworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIG9uQWZ0ZXIoU3RhdGVtZW50IGJhc2UsIERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQml0bWFwVXRpbHMuamF2YSBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9CaXRtYXBVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmOTRkNmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQml0bWFwVXRpbHMuamF2YQpAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsOworCitpbXBvcnQgYW5kcm9pZC5hcHAuV2FsbHBhcGVyTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcC5Db21wcmVzc0Zvcm1hdDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CisKK3B1YmxpYyBjbGFzcyBCaXRtYXBVdGlscyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJCaXRtYXBVdGlscyI7CisKKyAgICBwcml2YXRlIEJpdG1hcFV0aWxzKCkge30KKworICAgIC8vIENvbXBhcmVzIHR3byBiaXRtYXBzIGJ5IHBpeGVscy4KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29tcGFyZUJpdG1hcHMoQml0bWFwIGJtcDEsIEJpdG1hcCBibXAyKSB7CisgICAgICAgIGlmIChibXAxID09IGJtcDIpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGJtcDEgPT0gbnVsbCB8fCBibXAyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoYm1wMS5nZXRXaWR0aCgpICE9IGJtcDIuZ2V0V2lkdGgoKSkgfHwgKGJtcDEuZ2V0SGVpZ2h0KCkgIT0gYm1wMi5nZXRIZWlnaHQoKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYm1wMS5nZXRXaWR0aCgpOyBpKyspIHsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgYm1wMS5nZXRIZWlnaHQoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKGJtcDEuZ2V0UGl4ZWwoaSwgaikgIT0gYm1wMi5nZXRQaXhlbChpLCBqKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQml0bWFwIGdlbmVyYXRlUmFuZG9tQml0bWFwKGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgICAgICBmaW5hbCBCaXRtYXAgYm1wID0gQml0bWFwLmNyZWF0ZUJpdG1hcCh3aWR0aCwgaGVpZ2h0LCBCaXRtYXAuQ29uZmlnLkFSR0JfODg4OCk7CisgICAgICAgIGZpbmFsIFJhbmRvbSBnZW5lcmF0b3IgPSBuZXcgUmFuZG9tKCk7CisgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgICAgIGJtcC5zZXRQaXhlbCh4LCB5LCBnZW5lcmF0b3IubmV4dEludChJbnRlZ2VyLk1BWF9WQUxVRSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBibXA7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBCaXRtYXAgZ2VuZXJhdGVXaGl0ZUJpdG1hcChpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICAgICAgZmluYWwgQml0bWFwIGJtcCA9IEJpdG1hcC5jcmVhdGVCaXRtYXAod2lkdGgsIGhlaWdodCwgQml0bWFwLkNvbmZpZy5BUkdCXzg4ODgpOworICAgICAgICBibXAuZXJhc2VDb2xvcihDb2xvci5XSElURSk7CisgICAgICAgIHJldHVybiBibXA7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBCaXRtYXAgZ2V0V2FsbHBhcGVyQml0bWFwKENvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFdhbGxwYXBlck1hbmFnZXIgd2FsbHBhcGVyTWFuYWdlciA9IFdhbGxwYXBlck1hbmFnZXIuZ2V0SW5zdGFuY2UoY29udGV4dCk7CisgICAgICAgIENsYXNzPD8+IG5vcGFyYW1zW10gPSB7fTsKKyAgICAgICAgQ2xhc3M8Pz4gd21DbGFzcyA9IHdhbGxwYXBlck1hbmFnZXIuZ2V0Q2xhc3MoKTsKKyAgICAgICAgTWV0aG9kIG1ldGhvZEdldEJpdG1hcCA9IHdtQ2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoImdldEJpdG1hcCIsIG5vcGFyYW1zKTsKKyAgICAgICAgcmV0dXJuIChCaXRtYXApIG1ldGhvZEdldEJpdG1hcC5pbnZva2Uod2FsbHBhcGVyTWFuYWdlciwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiaXRtYXBUb0lucHV0U3RyZWFtKEJpdG1hcCBibXApIHsKKyAgICAgICAgZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgYm1wLmNvbXByZXNzKENvbXByZXNzRm9ybWF0LlBORywgMCAvKmlnbm9yZWQgZm9yIFBORyovLCBib3MpOworICAgICAgICBieXRlW10gYml0bWFwRGF0YSA9IGJvcy50b0J5dGVBcnJheSgpOworICAgICAgICByZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJpdG1hcERhdGEpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgbG9nSWZCaXRtYXBTb2xpZENvbG9yKFN0cmluZyBmaWxlTmFtZSwgQml0bWFwIGJpdG1hcCkgeworICAgICAgICBpbnQgZmlyc3RDb2xvciA9IGJpdG1hcC5nZXRQaXhlbCgwLCAwKTsKKyAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCBiaXRtYXAuZ2V0V2lkdGgoKTsgeCsrKSB7CisgICAgICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IGJpdG1hcC5nZXRIZWlnaHQoKTsgeSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGJpdG1hcC5nZXRQaXhlbCh4LCB5KSAhPSBmaXJzdENvbG9yKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBMb2cudyhUQUcsIFN0cmluZy5mb3JtYXQoIiVzIGVudGlyZSBiaXRtYXAgY29sb3IgaXMgJXgiLCBmaWxlTmFtZSwgZmlyc3RDb2xvcikpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzYXZlQml0bWFwKEJpdG1hcCBiaXRtYXAsIFN0cmluZyBkaXJlY3RvcnlOYW1lLCBTdHJpbmcgZmlsZU5hbWUpIHsKKyAgICAgICAgbmV3IEZpbGUoZGlyZWN0b3J5TmFtZSkubWtkaXJzKCk7IC8vIGNyZWF0ZSBkaXJzIGlmIG5lZWRlZAorCisgICAgICAgIExvZy5kKFRBRywgIlNhdmluZyBmaWxlOiAiICsgZmlsZU5hbWUgKyAiIGluIGRpcmVjdG9yeTogIiArIGRpcmVjdG9yeU5hbWUpOworCisgICAgICAgIGlmIChiaXRtYXAgPT0gbnVsbCkgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiRmlsZSBub3Qgc2F2ZWQsIGJpdG1hcCB3YXMgbnVsbCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbG9nSWZCaXRtYXBTb2xpZENvbG9yKGZpbGVOYW1lLCBiaXRtYXApOworCisgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGRpcmVjdG9yeU5hbWUsIGZpbGVOYW1lKTsKKyAgICAgICAgdHJ5IChGaWxlT3V0cHV0U3RyZWFtIGZpbGVTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKSkgeworICAgICAgICAgICAgYml0bWFwLmNvbXByZXNzKEJpdG1hcC5Db21wcmVzc0Zvcm1hdC5QTkcsIDAgLyogaWdub3JlZCBmb3IgUE5HICovLCBmaWxlU3RyZWFtKTsKKyAgICAgICAgICAgIGZpbGVTdHJlYW0uZmx1c2goKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQmxvY2tlZE51bWJlclNlcnZpY2UuamF2YSBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9CbG9ja2VkTnVtYmVyU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MGMwNzgKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQmxvY2tlZE51bWJlclNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQucHJvdmlkZXIuQmxvY2tlZE51bWJlckNvbnRyYWN0LkJsb2NrZWROdW1iZXJzLkNPTFVNTl9PUklHSU5BTF9OVU1CRVI7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQucHJvdmlkZXIuQmxvY2tlZE51bWJlckNvbnRyYWN0LkJsb2NrZWROdW1iZXJzLkNPTlRFTlRfVVJJOworCitpbXBvcnQgYW5kcm9pZC5hcHAuSW50ZW50U2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuUmVzdWx0UmVjZWl2ZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworLyoqCisgKiBBIHNlcnZpY2UgdG8gaGFuZGxlIGludGVyYWN0aW9ucyB3aXRoIHRoZSBCbG9ja2VkTnVtYmVyUHJvdmlkZXIuIFRoZSBCbG9ja2VkTnVtYmVyUHJvdmlkZXIKKyAqIGNhbiBvbmx5IGJlIGFjY2Vzc2VkIGJ5IHRoZSBwcmltYXJ5IHVzZXIuIFRoaXMgc2VydmljZSBjYW4gYmUgcnVuIGFzIGEgc2luZ2xldG9uIHNlcnZpY2UKKyAqIHdoaWNoIHdpbGwgdGhlbiBiZSBhYmxlIHRvIGFjY2VzcyB0aGUgQmxvY2tlZE51bWJlclByb3ZpZGVyIGZyb20gYSB0ZXN0IHJ1bm5pbmcgaW4gYQorICogc2Vjb25kYXJ5IHVzZXIuCisgKi8KK3B1YmxpYyBjbGFzcyBCbG9ja2VkTnVtYmVyU2VydmljZSBleHRlbmRzIEludGVudFNlcnZpY2UgeworCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBJTlNFUlRfQUNUSU9OID0gImFuZHJvaWQudGVsZWNvbS5jdHMuSW5zZXJ0QmxvY2tlZE51bWJlciI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFVEVfQUNUSU9OID0gImFuZHJvaWQudGVsZWNvbS5jdHMuRGVsZXRlQmxvY2tlZE51bWJlciI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBQSE9ORV9OVU1CRVJfRVhUUkEgPSAibnVtYmVyIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9FWFRSQSA9ICJ1cmkiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9XU19FWFRSQSA9ICJyb3dzIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9SRUNFSVZFUl9FWFRSQSA9ICJyZXN1bHRSZWNlaXZlciI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkN0c0Jsb2NrTnVtYmVyU3ZjIjsKKworICAgIHByaXZhdGUgQ29udGVudFJlc29sdmVyIG1Db250ZW50UmVzb2x2ZXI7CisKKyAgICBwdWJsaWMgQmxvY2tlZE51bWJlclNlcnZpY2UoKSB7CisgICAgICAgIHN1cGVyKEJsb2NrZWROdW1iZXJTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25IYW5kbGVJbnRlbnQoSW50ZW50IGludGVudCkgeworICAgICAgICBMb2cuaShUQUcsICJTdGFydGluZyBCbG9ja2VkTnVtYmVyU2VydmljZSBzZXJ2aWNlOiAiICsgaW50ZW50KTsKKyAgICAgICAgaWYgKGludGVudCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgQnVuZGxlIGJ1bmRsZTsKKyAgICAgICAgbUNvbnRlbnRSZXNvbHZlciA9IGdldENvbnRlbnRSZXNvbHZlcigpOworICAgICAgICBzd2l0Y2ggKGludGVudC5nZXRBY3Rpb24oKSkgeworICAgICAgICAgICAgY2FzZSBJTlNFUlRfQUNUSU9OOgorICAgICAgICAgICAgICAgIGJ1bmRsZSA9IGluc2VydEJsb2NrZWROdW1iZXIoaW50ZW50LmdldFN0cmluZ0V4dHJhKFBIT05FX05VTUJFUl9FWFRSQSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBERUxFVEVfQUNUSU9OOgorICAgICAgICAgICAgICAgIGJ1bmRsZSA9IGRlbGV0ZUJsb2NrZWROdW1iZXIoVXJpLnBhcnNlKGludGVudC5nZXRTdHJpbmdFeHRyYShVUklfRVhUUkEpKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBSZXN1bHRSZWNlaXZlciByZWNlaXZlciA9IGludGVudC5nZXRQYXJjZWxhYmxlRXh0cmEoUkVTVUxUX1JFQ0VJVkVSX0VYVFJBKTsKKyAgICAgICAgcmVjZWl2ZXIuc2VuZCgwLCBidW5kbGUpOworICAgIH0KKworICAgIHByaXZhdGUgQnVuZGxlIGluc2VydEJsb2NrZWROdW1iZXIoU3RyaW5nIG51bWJlcikgeworICAgICAgICBMb2cuaShUQUcsICJpbnNlcnRCbG9ja2VkTnVtYmVyOiAiICsgbnVtYmVyKTsKKworICAgICAgICBDb250ZW50VmFsdWVzIGN2ID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKKyAgICAgICAgY3YucHV0KENPTFVNTl9PUklHSU5BTF9OVU1CRVIsIG51bWJlcik7CisgICAgICAgIFVyaSB1cmkgPSBtQ29udGVudFJlc29sdmVyLmluc2VydChDT05URU5UX1VSSSwgY3YpOworICAgICAgICBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOworICAgICAgICBidW5kbGUucHV0U3RyaW5nKFVSSV9FWFRSQSwgdXJpLnRvU3RyaW5nKCkpOworICAgICAgICByZXR1cm4gYnVuZGxlOworICAgIH0KKworICAgIHByaXZhdGUgQnVuZGxlIGRlbGV0ZUJsb2NrZWROdW1iZXIoVXJpIHVyaSkgeworICAgICAgICBMb2cuaShUQUcsICJkZWxldGVCbG9ja2VkTnVtYmVyOiAiICsgdXJpKTsKKworICAgICAgICBpbnQgcm93cyA9IG1Db250ZW50UmVzb2x2ZXIuZGVsZXRlKHVyaSwgbnVsbCwgbnVsbCk7CisgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgIGJ1bmRsZS5wdXRJbnQoUk9XU19FWFRSQSwgcm93cyk7CisgICAgICAgIHJldHVybiBidW5kbGU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0Jsb2NrZWROdW1iZXJVdGlsLmphdmEgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQmxvY2tlZE51bWJlclV0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWEwY2U0Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0Jsb2NrZWROdW1iZXJVdGlsLmphdmEKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKKworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkJsb2NrZWROdW1iZXJTZXJ2aWNlLkRFTEVURV9BQ1RJT047CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQmxvY2tlZE51bWJlclNlcnZpY2UuSU5TRVJUX0FDVElPTjsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5CbG9ja2VkTnVtYmVyU2VydmljZS5QSE9ORV9OVU1CRVJfRVhUUkE7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQmxvY2tlZE51bWJlclNlcnZpY2UuUkVTVUxUX1JFQ0VJVkVSX0VYVFJBOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkJsb2NrZWROdW1iZXJTZXJ2aWNlLlJPV1NfRVhUUkE7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQmxvY2tlZE51bWJlclNlcnZpY2UuVVJJX0VYVFJBOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOworaW1wb3J0IGFuZHJvaWQub3MuUmVzdWx0UmVjZWl2ZXI7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TZW1hcGhvcmU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKKy8qKgorICogVXRpbGl0eSBmb3Igc3RhcnRpbmcgdGhlIGJsb2NrZWQgbnVtYmVyIHNlcnZpY2UuCisgKi8KK3B1YmxpYyBjbGFzcyBCbG9ja2VkTnVtYmVyVXRpbCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVElNRU9VVCA9IDI7CisKKyAgICBwcml2YXRlIEJsb2NrZWROdW1iZXJVdGlsKCkge30KKworICAgIC8qKiBJbnNlcnQgYSBwaG9uZSBudW1iZXIgaW50byB0aGUgYmxvY2tlZCBudW1iZXIgcHJvdmlkZXIgYW5kIHJldHVybnMgdGhlIHJlc3VsdGluZyBVcmkuICovCisgICAgcHVibGljIHN0YXRpYyBVcmkgaW5zZXJ0QmxvY2tlZE51bWJlcihDb250ZXh0IGNvbnRleHQsIFN0cmluZyBwaG9uZU51bWJlcikgeworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChJTlNFUlRfQUNUSU9OKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFBIT05FX05VTUJFUl9FWFRSQSwgcGhvbmVOdW1iZXIpOworCisgICAgICAgIHJldHVybiBVcmkucGFyc2UocnVuQmxvY2tlZE51bWJlclNlcnZpY2UoY29udGV4dCwgaW50ZW50KS5nZXRTdHJpbmcoVVJJX0VYVFJBKSk7CisgICAgfQorCisgICAgLyoqIFJlbW92ZSBhIG51bWJlciBmcm9tIHRoZSBibG9ja2VkIG51bWJlciBwcm92aWRlciBhbmQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHJvd3MgZGVsZXRlZC4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBkZWxldGVCbG9ja2VkTnVtYmVyKENvbnRleHQgY29udGV4dCwgVXJpIHVyaSkgeworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChERUxFVEVfQUNUSU9OKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFVSSV9FWFRSQSwgdXJpLnRvU3RyaW5nKCkpOworCisgICAgICAgIHJldHVybiBydW5CbG9ja2VkTnVtYmVyU2VydmljZShjb250ZXh0LCBpbnRlbnQpLmdldEludChST1dTX0VYVFJBKTsKKyAgICB9CisKKyAgICAvKiogU3RhcnQgdGhlIGJsb2NrZWQgbnVtYmVyIHNlcnZpY2UuICovCisgICAgc3RhdGljIEJ1bmRsZSBydW5CbG9ja2VkTnVtYmVyU2VydmljZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgLy8gVGVtcG9yYXJpbHkgYWxsb3cgYmFja2dyb3VuZCBzZXJ2aWNlCisgICAgICAgIFN5c3RlbVV0aWwucnVuU2hlbGxDb21tYW5kKCJjbWQgZGV2aWNlaWRsZSB0ZW1wd2hpdGVsaXN0ICIgKyBjb250ZXh0LmdldFBhY2thZ2VOYW1lKCkpOworCisgICAgICAgIGZpbmFsIFNlbWFwaG9yZSBzZW1hcGhvcmUgPSBuZXcgU2VtYXBob3JlKDApOworICAgICAgICBmaW5hbCBCdW5kbGUgcmVzdWx0ID0gbmV3IEJ1bmRsZSgpOworCisgICAgICAgIFJlc3VsdFJlY2VpdmVyIHJlY2VpdmVyID0gbmV3IFJlc3VsdFJlY2VpdmVyKG5ldyBIYW5kbGVyKExvb3Blci5nZXRNYWluTG9vcGVyKCkpKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uUmVjZWl2ZVJlc3VsdChpbnQgcmVzdWx0Q29kZSwgQnVuZGxlIHJlc3VsdERhdGEpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQucHV0QWxsKHJlc3VsdERhdGEpOworICAgICAgICAgICAgICAgIHNlbWFwaG9yZS5yZWxlYXNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIGludGVudC5wdXRFeHRyYShSRVNVTFRfUkVDRUlWRVJfRVhUUkEsIHJlY2VpdmVyKTsKKyAgICAgICAgaW50ZW50LnNldENvbXBvbmVudChuZXcgQ29tcG9uZW50TmFtZShjb250ZXh0LCBCbG9ja2VkTnVtYmVyU2VydmljZS5jbGFzcykpOworCisgICAgICAgIGNvbnRleHQuc3RhcnRTZXJ2aWNlKGludGVudCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFRlc3RDYXNlLmFzc2VydFRydWUoc2VtYXBob3JlLnRyeUFjcXVpcmUoVElNRU9VVCwgVGltZVVuaXQuU0VDT05EUykpOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBUZXN0Q2FzZS5mYWlsKCJUaW1lZCBvdXQgd2FpdGluZyBmb3IgcmVzdWx0IGZyb20gQmxvY2tlZE51bWJlclNlcnZpY2UiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9CbG9ja2luZ0Jyb2FkY2FzdFJlY2VpdmVyLmphdmEgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQmxvY2tpbmdCcm9hZGNhc3RSZWNlaXZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMWE2MjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQmxvY2tpbmdCcm9hZGNhc3RSZWNlaXZlci5qYXZhCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5OdWxsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQXJyYXlCbG9ja2luZ1F1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkJsb2NraW5nUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKKy8qKgorICogQSByZWNlaXZlciB0aGF0IGFsbG93cyBjYWxsZXIgdG8gd2FpdCBmb3IgdGhlIGJyb2FkY2FzdCBzeW5jaHJvbm91c2x5LiBOb3RpY2UgdGhhdCB5b3Ugc2hvdWxkIG5vdAorICogcmV1c2UgdGhlIGluc3RhbmNlLiBVc2FnZSBpcyB0eXBpY2FsbHkgbGlrZSB0aGlzOgorICogPHByZT4KKyAqICAgICBCbG9ja2luZ0Jyb2FkY2FzdFJlY2VpdmVyIHJlY2VpdmVyID0gbmV3IEJsb2NraW5nQnJvYWRjYXN0UmVjZWl2ZXIoY29udGV4dCwgImFjdGlvbiIpOworICogICAgIHRyeSB7CisgKiAgICAgICAgIHJlY2VpdmVyLnJlZ2lzdGVyKCk7CisgKiAgICAgICAgIEludGVudCBpbnRlbnQgPSByZWNlaXZlci5hd2FpdEZvckJyb2FkY2FzdCgpOworICogICAgICAgICAvLyBhc3NlcnQgdGhlIGludGVudAorICogICAgIH0gZmluYWxseSB7CisgKiAgICAgICAgIHJlY2VpdmVyLnVucmVnaXN0ZXJRdWlldGx5KCk7CisgKiAgICAgfQorICogPC9wcmU+CisgKi8KK3B1YmxpYyBjbGFzcyBCbG9ja2luZ0Jyb2FkY2FzdFJlY2VpdmVyIGV4dGVuZHMgQnJvYWRjYXN0UmVjZWl2ZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQmxvY2tpbmdCcm9hZGNhc3QiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfVElNRU9VVF9TRUNPTkRTID0gMTA7CisKKyAgICBwcml2YXRlIGZpbmFsIEJsb2NraW5nUXVldWU8SW50ZW50PiBtQmxvY2tpbmdRdWV1ZTsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtRXhwZWN0ZWRBY3Rpb247CisgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OworCisgICAgcHVibGljIEJsb2NraW5nQnJvYWRjYXN0UmVjZWl2ZXIoQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgZXhwZWN0ZWRBY3Rpb24pIHsKKyAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICBtRXhwZWN0ZWRBY3Rpb24gPSBleHBlY3RlZEFjdGlvbjsKKyAgICAgICAgbUJsb2NraW5nUXVldWUgPSBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPD4oMSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICBpZiAobUV4cGVjdGVkQWN0aW9uLmVxdWFscyhpbnRlbnQuZ2V0QWN0aW9uKCkpKSB7CisgICAgICAgICAgICBtQmxvY2tpbmdRdWV1ZS5hZGQoaW50ZW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyKCkgeworICAgICAgICBtQ29udGV4dC5yZWdpc3RlclJlY2VpdmVyKHRoaXMsIG5ldyBJbnRlbnRGaWx0ZXIobUV4cGVjdGVkQWN0aW9uKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2FpdCB1bnRpbCB0aGUgYnJvYWRjYXN0IGFuZCByZXR1cm4gdGhlIHJlY2VpdmVkIGJyb2FkY2FzdCBpbnRlbnQuIHtAY29kZSBudWxsfSBpcyByZXR1cm5lZAorICAgICAqIGlmIG5vIGJyb2FkY2FzdCB3aXRoIGV4cGVjdGVkIGFjdGlvbiBpcyByZWNlaXZlZCB3aXRoaW4gMTAgc2Vjb25kcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQE51bGxhYmxlIEludGVudCBhd2FpdEZvckJyb2FkY2FzdCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBtQmxvY2tpbmdRdWV1ZS5wb2xsKERFRkFVTFRfVElNRU9VVF9TRUNPTkRTLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAid2FpdEZvckJyb2FkY2FzdCBnZXQgaW50ZXJydXB0ZWQ6ICIsIGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdhaXQgdW50aWwgdGhlIGJyb2FkY2FzdCBhbmQgcmV0dXJuIHRoZSByZWNlaXZlZCBicm9hZGNhc3QgaW50ZW50LiB7QGNvZGUgbnVsbH0gaXMgcmV0dXJuZWQKKyAgICAgKiBpZiBubyBicm9hZGNhc3Qgd2l0aCBleHBlY3RlZCBhY3Rpb24gaXMgcmVjZWl2ZWQgd2l0aGluIHRoZSBnaXZlbiB0aW1lb3V0LgorICAgICAqLworICAgIHB1YmxpYyBATnVsbGFibGUgSW50ZW50IGF3YWl0Rm9yQnJvYWRjYXN0KGxvbmcgdGltZW91dE1pbGxpcykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1CbG9ja2luZ1F1ZXVlLnBvbGwodGltZW91dE1pbGxpcywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAid2FpdEZvckJyb2FkY2FzdCBnZXQgaW50ZXJydXB0ZWQ6ICIsIGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJRdWlldGx5KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUNvbnRleHQudW5yZWdpc3RlclJlY2VpdmVyKHRoaXMpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byB1bnJlZ2lzdGVyIEJsb2NraW5nQnJvYWRjYXN0UmVjZWl2ZXI6ICIsIGV4KTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQnJvYWRjYXN0UnBjQmFzZS5qYXZhIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0Jyb2FkY2FzdFJwY0Jhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGQ5YzIyCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0Jyb2FkY2FzdFJwY0Jhc2UuamF2YQpAQCAtMCwwICsxLDE0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWw7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY1JlZmVyZW5jZTsKKworLyoqCisgKiBCYXNlIGNsYXNzIHRvIGhlbHAgYnJvYWRjYXN0LWJhc2VkIFJQQy4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEJyb2FkY2FzdFJwY0Jhc2U8VFJlcXVlc3QsIFRSZXNwb25zZT4geworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQnJvYWRjYXN0UnBjIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gVkVSQk9TRSA9IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpOworCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fUkVRVUVTVCA9ICJBQ1RJT05fUkVRVUVTVCI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9QQVlMT0FEID0gIkVYVFJBX1BBWUxPQUQiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfRVhDRVBUSU9OID0gIkVYVFJBX0VYQ0VQVElPTiI7CisKKyAgICBzdGF0aWMgSGFuZGxlciBzTWFpbkhhbmRsZXIgPSBuZXcgSGFuZGxlcihMb29wZXIuZ2V0TWFpbkxvb3BlcigpKTsKKworICAgIC8qKiBJbXBsZW1lbnQgaW4gYSBzdWJjbGFzcyAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBieXRlW10gcmVxdWVzdFRvQnl0ZXMoVFJlcXVlc3QgcmVxdWVzdCk7CisKKyAgICAvKiogSW1wbGVtZW50IGluIGEgc3ViY2xhc3MgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgVFJlc3BvbnNlIGJ5dGVzVG9SZXNwb25zZShieXRlW10gYnl0ZXMpOworCisgICAgcHVibGljIFRSZXNwb25zZSBpbnZva2UoQ29tcG9uZW50TmFtZSB0YXJnZXRSZWNlaXZlciwgVFJlcXVlc3QgcmVxdWVzdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIENyZWF0ZSBhIHJlcXVlc3QgaW50ZW50LgorICAgICAgICBMb2cuaShUQUcsICJTZW5kaW5nIHRvOiAiICsgdGFyZ2V0UmVjZWl2ZXIgKyAoVkVSQk9TRSA/ICJcblJlcXVlc3Q6ICIgKyByZXF1ZXN0IDogIiIpKTsKKworICAgICAgICBmaW5hbCBJbnRlbnQgcmVxdWVzdEludGVudCA9IG5ldyBJbnRlbnQoQUNUSU9OX1JFUVVFU1QpCisgICAgICAgICAgICAgICAgLnNldENvbXBvbmVudCh0YXJnZXRSZWNlaXZlcikKKyAgICAgICAgICAgICAgICAuYWRkRmxhZ3MoSW50ZW50LkZMQUdfUkVDRUlWRVJfRk9SRUdST1VORCkKKyAgICAgICAgICAgICAgICAucHV0RXh0cmEoRVhUUkFfUEFZTE9BRCwgcmVxdWVzdFRvQnl0ZXMocmVxdWVzdCkpOworCisgICAgICAgIC8vIFNlbmQgaXQuCisgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworICAgICAgICBmaW5hbCBBdG9taWNSZWZlcmVuY2U8QnVuZGxlPiByZXNwb25zZUJ1bmRsZSA9IG5ldyBBdG9taWNSZWZlcmVuY2U8PigpOworCisgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKS5zZW5kT3JkZXJlZEJyb2FkY2FzdCgKKyAgICAgICAgICAgICAgICByZXF1ZXN0SW50ZW50LCBudWxsLCBuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZUJ1bmRsZS5zZXQoZ2V0UmVzdWx0RXh0cmFzKGZhbHNlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sIHNNYWluSGFuZGxlciwgMCwgbnVsbCwgbnVsbCk7CisKKyAgICAgICAgLy8gV2FpdCBmb3IgYSByZXBseSBhbmQgY2hlY2sgaXQuCisgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVzcG9uc2VBcnJpdmVkID0gbGF0Y2guYXdhaXQoNjAsIFRpbWVVbml0LlNFQ09ORFMpOworICAgICAgICBhc3NlcnRUcnVlKCJEaWRuJ3QgcmVjZWl2ZSBicm9hZGNhc3QgcmVzdWx0LiIsIHJlc3BvbnNlQXJyaXZlZCk7CisKKyAgICAgICAgLy8gVE9ETyBJZiByZXNwb25zZUFycml2ZWQgaXMgZmFsc2UsIHByaW50IGlmIHRoZSBwYWNrYWdlIC8gY29tcG9uZW50IGlzIGluc3RhbGxlZD8KKworICAgICAgICBhc3NlcnROb3ROdWxsKCJEaWRuJ3QgcmVjZWl2ZSByZXN1bHQgZXh0cmFzIiwgcmVzcG9uc2VCdW5kbGUuZ2V0KCkpOworCisgICAgICAgIGZpbmFsIFN0cmluZyBleGNlcHRpb24gPSByZXNwb25zZUJ1bmRsZS5nZXQoKS5nZXRTdHJpbmcoRVhUUkFfRVhDRVBUSU9OKTsKKyAgICAgICAgaWYgKGV4Y2VwdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBmYWlsKCJUYXJnZXQgdGhyb3cgZXhjZXB0aW9uOiByZWNlaXZlcj0iICsgdGFyZ2V0UmVjZWl2ZXIKKyAgICAgICAgICAgICAgICAgICAgKyAiXG5FeGNlcHRpb246ICIgKyBleGNlcHRpb24pOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgYnl0ZVtdIHJlc3VsdFBheWxvYWQgPSByZXNwb25zZUJ1bmRsZS5nZXQoKS5nZXRCeXRlQXJyYXkoRVhUUkFfUEFZTE9BRCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoIkRpZG4ndCByZWNlaXZlIHJlc3VsdCBwYXlsb2FkIiwgcmVzdWx0UGF5bG9hZCk7CisKKyAgICAgICAgTG9nLmkoVEFHLCAiUmVzcG9uc2UgcmVjZWl2ZWQ6ICIgKyAoVkVSQk9TRSA/IHJlc3VsdFBheWxvYWQudG9TdHJpbmcoKSA6ICIiKSk7CisKKyAgICAgICAgcmV0dXJuIGJ5dGVzVG9SZXNwb25zZShyZXN1bHRQYXlsb2FkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCYXNlIGNsYXNzIGZvciBhIHJlY2VpdmVyIGZvciBhIGJyb2FkY2FzdC1iYXNlZCBSUEMuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBSZWNlaXZlckJhc2U8VFJlcXVlc3QsIFRSZXNwb25zZT4gZXh0ZW5kcyBCcm9hZGNhc3RSZWNlaXZlciB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgZmluYWwgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoQUNUSU9OX1JFUVVFU1QsIGludGVudC5nZXRBY3Rpb24oKSk7CisKKyAgICAgICAgICAgIC8vIFBhcnNlIHRoZSByZXF1ZXN0LgorICAgICAgICAgICAgZmluYWwgVFJlcXVlc3QgcmVxdWVzdCA9IGJ5dGVzVG9SZXF1ZXN0KGludGVudC5nZXRCeXRlQXJyYXlFeHRyYShFWFRSQV9QQVlMT0FEKSk7CisKKyAgICAgICAgICAgIExvZy5pKFRBRywgIlJlcXVlc3QgcmVjZWl2ZWQ6ICIgKyAoVkVSQk9TRSA/IHJlcXVlc3QudG9TdHJpbmcoKSA6ICIiKSk7CisKKyAgICAgICAgICAgIFRocm93YWJsZSBleGNlcHRpb24gPSBudWxsOworCisgICAgICAgICAgICAvLyBIYW5kbGUgaXQgYW5kIGdlbmVyYXRlIGEgcmVzcG9uc2UuCisgICAgICAgICAgICBUUmVzcG9uc2UgcmVzcG9uc2UgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXNwb25zZSA9IGhhbmRsZVJlcXVlc3QoY29udGV4dCwgcmVxdWVzdCk7CisgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiUmVzcG9uc2UgZ2VuZXJhdGVkOiAiICsgKFZFUkJPU0UgPyByZXNwb25zZS50b1N0cmluZygpIDogIiIpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICAgICAgZXhjZXB0aW9uID0gZTsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJFeGNlcHRpb24gdGhyb3duOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBTZW5kIGJhY2suCisgICAgICAgICAgICBmaW5hbCBCdW5kbGUgZXh0cmFzID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgaWYgKHJlc3BvbnNlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBleHRyYXMucHV0Qnl0ZUFycmF5KEVYVFJBX1BBWUxPQUQsIHJlc3BvbnNlVG9CeXRlcyhyZXNwb25zZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZXh0cmFzLnB1dFN0cmluZyhFWFRSQV9FWENFUFRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb24udG9TdHJpbmcoKSArICJcbiIgKyBMb2cuZ2V0U3RhY2tUcmFjZVN0cmluZyhleGNlcHRpb24pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldFJlc3VsdEV4dHJhcyhleHRyYXMpOworICAgICAgICB9CisKKyAgICAgICAgLyoqIEltcGxlbWVudCBpbiBhIHN1YmNsYXNzICovCisgICAgICAgIHByb3RlY3RlZCBhYnN0cmFjdCBUUmVzcG9uc2UgaGFuZGxlUmVxdWVzdChDb250ZXh0IGNvbnRleHQsIFRSZXF1ZXN0IHJlcXVlc3QpCisgICAgICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbjsKKworICAgICAgICAvKiogSW1wbGVtZW50IGluIGEgc3ViY2xhc3MgKi8KKyAgICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IGJ5dGVbXSByZXNwb25zZVRvQnl0ZXMoVFJlc3BvbnNlIHJlc3BvbnNlKTsKKworICAgICAgICAvKiogSW1wbGVtZW50IGluIGEgc3ViY2xhc3MgKi8KKyAgICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IFRSZXF1ZXN0IGJ5dGVzVG9SZXF1ZXN0KGJ5dGVbXSBieXRlcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0Jyb2FkY2FzdFRlc3RCYXNlLmphdmEgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQnJvYWRjYXN0VGVzdEJhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjVkYzM5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0Jyb2FkY2FzdFRlc3RCYXNlLmphdmEKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWw7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCitwdWJsaWMgY2xhc3MgQnJvYWRjYXN0VGVzdEJhc2UgZXh0ZW5kcyBBY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJyb2FkY2FzdFRlc3RTdGFydEFjdGl2aXR5PiB7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQnJvYWRjYXN0VGVzdEJhc2UiOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFRJTUVPVVRfTVMgPSAyMCAqIDEwMDA7CisKKyAgICBwcm90ZWN0ZWQgQ29udGV4dCBtQ29udGV4dDsKKyAgICBwcm90ZWN0ZWQgQnVuZGxlIG1SZXN1bHRFeHRyYXM7CisgICAgcHJpdmF0ZSBDb3VudERvd25MYXRjaCBtTGF0Y2g7CisgICAgcHJvdGVjdGVkIEFjdGl2aXR5RG9uZVJlY2VpdmVyIG1BY3Rpdml0eURvbmVSZWNlaXZlciA9IG51bGw7CisgICAgcHJpdmF0ZSBCcm9hZGNhc3RUZXN0U3RhcnRBY3Rpdml0eSBtQWN0aXZpdHk7CisgICAgcHJpdmF0ZSBCcm9hZGNhc3RVdGlscy5UZXN0Y2FzZVR5cGUgbVRlc3RDYXNlVHlwZTsKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtSGFzRmVhdHVyZTsKKworICAgIHB1YmxpYyBCcm9hZGNhc3RUZXN0QmFzZSgpIHsKKyAgICAgICAgc3VwZXIoQnJvYWRjYXN0VGVzdFN0YXJ0QWN0aXZpdHkuY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgIG1IYXNGZWF0dXJlID0gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG1IYXNGZWF0dXJlICYmIG1BY3Rpdml0eURvbmVSZWNlaXZlciAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1Db250ZXh0LnVucmVnaXN0ZXJSZWNlaXZlcihtQWN0aXZpdHlEb25lUmVjZWl2ZXIpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgbUFjdGl2aXR5RG9uZVJlY2VpdmVyIGluCisgICAgICAgICAgICAgICAgLy8gdGhlIGFib3ZlIGNhbGwgdG8gdW5yZWdpc3RlclJlY2VpdmVyIGlzIG5ldmVyIHJlZ2lzdGVyZWQuCisgICAgICAgICAgICAgICAgLy8gSWYgc28sIG5vIGhhcm0gZG9uZSBieSBpZ25vcmluZyB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1BY3Rpdml0eURvbmVSZWNlaXZlciA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0ludGVudFN1cHBvcnRlZChTdHJpbmcgaW50ZW50U3RyKSB7CisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KGludGVudFN0cik7CisgICAgICAgIGZpbmFsIFBhY2thZ2VNYW5hZ2VyIG1hbmFnZXIgPSBtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICBhc3NlcnROb3ROdWxsKG1hbmFnZXIpOworICAgICAgICBpZiAobWFuYWdlci5yZXNvbHZlQWN0aXZpdHkoaW50ZW50LCAwKSA9PSBudWxsKSB7CisgICAgICAgICAgICBMb2cuaShUQUcsICJObyBBY3Rpdml0eSBmb3VuZCBmb3IgdGhlIGludGVudDogIiArIGludGVudFN0cik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc3RhcnRUZXN0QWN0aXZpdHkoU3RyaW5nIGludGVudFN1ZmZpeCkgeworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOworICAgICAgICBpbnRlbnQuc2V0QWN0aW9uKCJhbmRyb2lkLmludGVudC5hY3Rpb24uVEVTVF9TVEFSVF9BQ1RJVklUWV8iICsgaW50ZW50U3VmZml4KTsKKyAgICAgICAgaW50ZW50LnNldENvbXBvbmVudChuZXcgQ29tcG9uZW50TmFtZShnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgQnJvYWRjYXN0VGVzdFN0YXJ0QWN0aXZpdHkuY2xhc3MpKTsKKyAgICAgICAgc2V0QWN0aXZpdHlJbnRlbnQoaW50ZW50KTsKKyAgICAgICAgbUFjdGl2aXR5ID0gZ2V0QWN0aXZpdHkoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3RlckJyb2FkY2FzdFJlY2VpdmVyKEJyb2FkY2FzdFV0aWxzLlRlc3RjYXNlVHlwZSB0ZXN0Q2FzZVR5cGUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtVGVzdENhc2VUeXBlID0gdGVzdENhc2VUeXBlOworICAgICAgICBtTGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgICAgIG1BY3Rpdml0eURvbmVSZWNlaXZlciA9IG5ldyBBY3Rpdml0eURvbmVSZWNlaXZlcigpOworICAgICAgICBtQ29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG1BY3Rpdml0eURvbmVSZWNlaXZlciwKKyAgICAgICAgICAgICAgICBuZXcgSW50ZW50RmlsdGVyKEJyb2FkY2FzdFV0aWxzLkJST0FEQ0FTVF9JTlRFTlQgKyB0ZXN0Q2FzZVR5cGUudG9TdHJpbmcoKSkpOworICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIHN0YXJ0VGVzdEFuZFdhaXRGb3JCcm9hZGNhc3QoQnJvYWRjYXN0VXRpbHMuVGVzdGNhc2VUeXBlIHRlc3RDYXNlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwa2csIFN0cmluZyBjbHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBMb2cuaShUQUcsICJCZWdpbiBUZXN0aW5nOiAiICsgdGVzdENhc2VUeXBlKTsKKyAgICAgICAgcmVnaXN0ZXJCcm9hZGNhc3RSZWNlaXZlcih0ZXN0Q2FzZVR5cGUpOworICAgICAgICBtQWN0aXZpdHkuc3RhcnRUZXN0KHRlc3RDYXNlVHlwZS50b1N0cmluZygpLCBwa2csIGNscyk7CisgICAgICAgIGlmICghbUxhdGNoLmF3YWl0KFRJTUVPVVRfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpIHsKKyAgICAgICAgICAgIGZhaWwoIkZhaWxlZCB0byByZWNlaXZlIGJyb2FkY2FzdCBpbiAiICsgVElNRU9VVF9NUyArICJtc2VjIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgY2xhc3MgQWN0aXZpdHlEb25lUmVjZWl2ZXIgZXh0ZW5kcyBCcm9hZGNhc3RSZWNlaXZlciB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICBpZiAoaW50ZW50LmdldEFjdGlvbigpLmVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgQnJvYWRjYXN0VXRpbHMuQlJPQURDQVNUX0lOVEVOVCArCisgICAgICAgICAgICAgICAgICAgICAgICBCcm9hZGNhc3RUZXN0QmFzZS50aGlzLm1UZXN0Q2FzZVR5cGUudG9TdHJpbmcoKSkpIHsKKyAgICAgICAgICAgICAgICBCdW5kbGUgZXh0cmFzID0gaW50ZW50LmdldEV4dHJhcygpOworICAgICAgICAgICAgICAgIExvZy5pKFRBRywgInJlY2VpdmVkX2Jyb2FkY2FzdCBmb3IgIiArIEJyb2FkY2FzdFV0aWxzLnRvQnVuZGxlU3RyaW5nKGV4dHJhcykpOworICAgICAgICAgICAgICAgIEJyb2FkY2FzdFRlc3RCYXNlLnRoaXMubVJlc3VsdEV4dHJhcyA9IGV4dHJhczsKKyAgICAgICAgICAgICAgICBtTGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQnJvYWRjYXN0VGVzdFN0YXJ0QWN0aXZpdHkuamF2YSBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9Ccm9hZGNhc3RUZXN0U3RhcnRBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiM2U4NWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQnJvYWRjYXN0VGVzdFN0YXJ0QWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitwdWJsaWMgY2xhc3MgQnJvYWRjYXN0VGVzdFN0YXJ0QWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQnJvYWRjYXN0VGVzdFN0YXJ0QWN0aXZpdHkiOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBMb2cuaShUQUcsICIgaW4gb25DcmVhdGUiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKKyAgICAgICAgTG9nLmkoVEFHLCAiIGluIG9uUmVzdW1lIik7CisgICAgfQorCisgICAgdm9pZCBzdGFydFRlc3QoU3RyaW5nIHRlc3RDYXNlVHlwZSwgU3RyaW5nIHBrZywgU3RyaW5nIGNscykgeworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOworICAgICAgICBMb2cuaShUQUcsICJyZWNlaXZlZF90ZXN0Y2FzZXR5cGUgPSAiICsgdGVzdENhc2VUeXBlKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKEJyb2FkY2FzdFV0aWxzLlRFU1RDQVNFX1RZUEUsIHRlc3RDYXNlVHlwZSk7CisgICAgICAgIGludGVudC5zZXRBY3Rpb24oImFuZHJvaWQuaW50ZW50LmFjdGlvbi5WSU1BSU5fIiArIHRlc3RDYXNlVHlwZSk7CisgICAgICAgIGludGVudC5zZXRDb21wb25lbnQobmV3IENvbXBvbmVudE5hbWUocGtnLCBjbHMpKTsKKyAgICAgICAgc3RhcnRBY3Rpdml0eShpbnRlbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUGF1c2UoKSB7CisgICAgICAgIExvZy5pKFRBRywgIiBpbiBvblBhdXNlIik7CisgICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblN0YXJ0KCkgeworICAgICAgICBzdXBlci5vblN0YXJ0KCk7CisgICAgICAgIExvZy5pKFRBRywgIiBpbiBvblN0YXJ0Iik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25SZXN0YXJ0KCkgeworICAgICAgICBzdXBlci5vblJlc3RhcnQoKTsKKyAgICAgICAgTG9nLmkoVEFHLCAiIGluIG9uUmVzdGFydCIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uU3RvcCgpIHsKKyAgICAgICAgTG9nLmkoVEFHLCAiIGluIG9uU3RvcCIpOworICAgICAgICBzdXBlci5vblN0b3AoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkRlc3Ryb3koKSB7CisgICAgICAgIExvZy5pKFRBRywgIiBpbiBvbkRlc3Ryb3kiKTsKKyAgICAgICAgc3VwZXIub25EZXN0cm95KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0Jyb2FkY2FzdFV0aWxzLmphdmEgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQnJvYWRjYXN0VXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDY2MWZjCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0Jyb2FkY2FzdFV0aWxzLmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWw7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKKworcHVibGljIGNsYXNzIEJyb2FkY2FzdFV0aWxzIHsKKyAgICBwdWJsaWMgZW51bSBUZXN0Y2FzZVR5cGUgeworICAgICAgICBaRU5fTU9ERV9PTiwKKyAgICAgICAgWkVOX01PREVfT0ZGLAorICAgICAgICBBSVJQTEFORV9NT0RFX09OLAorICAgICAgICBBSVJQTEFORV9NT0RFX09GRiwKKyAgICAgICAgQkFUVEVSWVNBVkVSX01PREVfT04sCisgICAgICAgIEJBVFRFUllTQVZFUl9NT0RFX09GRiwKKyAgICAgICAgVEhFQVRFUl9NT0RFX09OLAorICAgICAgICBUSEVBVEVSX01PREVfT0ZGCisgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RDQVNFX1RZUEUgPSAiVGVzdGNhc2VfdHlwZSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJPQURDQVNUX0lOVEVOVCA9CisgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLkZST01fVVRJTF9DVFNfVEVTVF8iOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5VTV9NSU5VVEVTX0ZPUl9aRU5NT0RFID0gMTA7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyB0b0J1bmRsZVN0cmluZyhCdW5kbGUgYnVuZGxlKSB7CisgICAgICAgIGlmIChidW5kbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuICIqKiogQnVuZGxlIGlzIG51bGwgKioqKiI7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBpZiAoYnVuZGxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoImV4dHJhczogIik7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBzIDogYnVuZGxlLmtleVNldCgpKSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiKCIgKyBzICsgIiA9ICIgKyBidW5kbGUuZ2V0KHMpICsgIiksICIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQnVuZGxlVXRpbHMuamF2YSBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9CdW5kbGVVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYTY0MWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQnVuZGxlVXRpbHMuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKKworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworCitwdWJsaWMgY2xhc3MgQnVuZGxlVXRpbHMgeworICAgIHByaXZhdGUgQnVuZGxlVXRpbHMoKSB7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBCdW5kbGUgbWFrZUJ1bmRsZShPYmplY3QuLi4ga2V5c0FuZFZhbHVlcykgeworICAgICAgICBpZiAoKGtleXNBbmRWYWx1ZXMubGVuZ3RoICUgMikgIT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQXJndW1lbnQgY291bnQgbm90IGV2ZW4uIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoa2V5c0FuZFZhbHVlcy5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgQnVuZGxlIHJldCA9IG5ldyBCdW5kbGUoKTsKKworICAgICAgICBmb3IgKGludCBpID0ga2V5c0FuZFZhbHVlcy5sZW5ndGggLSAyOyBpID49IDA7IGkgLT0gMikgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGtleSA9IGtleXNBbmRWYWx1ZXNbaV0udG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSA9IGtleXNBbmRWYWx1ZXNbaSArIDFdOworCisgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldC5wdXRTdHJpbmcoa2V5LCBudWxsKTsKKworICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4pIHsKKyAgICAgICAgICAgICAgICByZXQucHV0Qm9vbGVhbihrZXksIChCb29sZWFuKSB2YWx1ZSk7CisKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBJbnRlZ2VyKSB7CisgICAgICAgICAgICAgICAgcmV0LnB1dEludChrZXksIChJbnRlZ2VyKSB2YWx1ZSk7CisKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKyAgICAgICAgICAgICAgICByZXQucHV0U3RyaW5nKGtleSwgKFN0cmluZykgdmFsdWUpOworCisgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgQnVuZGxlKSB7CisgICAgICAgICAgICAgICAgcmV0LnB1dEJ1bmRsZShrZXksIChCdW5kbGUpIHZhbHVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJUeXBlIG5vdCBzdXBwb3J0ZWQgeWV0OiAiICsgdmFsdWUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0J1c2luZXNzTG9naWNDb25kaXRpb25hbFRlc3RDYXNlLmphdmEgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQnVzaW5lc3NMb2dpY0NvbmRpdGlvbmFsVGVzdENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTJjYWE4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0J1c2luZXNzTG9naWNDb25kaXRpb25hbFRlc3RDYXNlLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWw7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworCisvKioKKyAqICBEZXZpY2Utc2lkZSBiYXNlIGNsYXNzIGZvciB0ZXN0cyBsZXZlcmFnaW5nIHRoZSBCdXNpbmVzcyBMb2dpYyBzZXJ2aWNlIGZvciBydWxlcyB0aGF0IGFyZQorICogIGNvbmRpdGlvbmFsbHkgYWRkZWQgYmFzZWQgb24gdGhlIGRldmljZSBjaGFyYWN0ZXJpc3RpY3MuCisgKi8KK3B1YmxpYyBjbGFzcyBCdXNpbmVzc0xvZ2ljQ29uZGl0aW9uYWxUZXN0Q2FzZSBleHRlbmRzIEJ1c2luZXNzTG9naWNUZXN0Q2FzZSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgaGFuZGxlQnVzaW5lc3NMb2dpYygpIHsKKyAgICAgICAgc3VwZXIubG9hZEJ1c2luZXNzTG9naWMoKTsKKyAgICAgICAgZW5zdXJlQXV0aGVudGljYXRlZCgpOworICAgICAgICBzdXBlci5leGVjdXRlQnVzaW5lc3NMb2dpYygpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGVuc3VyZUF1dGhlbnRpY2F0ZWQoKSB7CisgICAgICAgIGlmICghbUNhblJlYWRCdXNpbmVzc0xvZ2ljKSB7CisgICAgICAgICAgICAvLyBzdXBlciBjbGFzcyBoYW5kbGVzIHRoZSBjb25kaXRpb24gdGhhdCB0aGUgc2VydmljZSBpcyB1bmF2YWlsYWJsZS4KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghbUJ1c2luZXNzTG9naWMubUNvbmRpdGlvbmFsVGVzdHNFbmFibGVkKSB7CisgICAgICAgICAgICBza2lwVGVzdCgiRXhlY3V0aW9uIG9mIGRldmljZSBzcGVjaWZpYyB0ZXN0cyBpcyBub3QgZW5hYmxlZC4gIgorICAgICAgICAgICAgICAgICAgICArICJFbmFibGUgd2l0aCAnLS1jb25kaXRpb25hbC1idXNpbmVzcy1sb2dpYy10ZXN0cy1lbmFibGVkJyIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1CdXNpbmVzc0xvZ2ljLmlzQXV0aG9yaXplZCgpKSB7CisgICAgICAgICAgICAvLyBSdW4gdGVzdCBhcyBub3JtYWwuCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBtQnVzaW5lc3NMb2dpYy5nZXRBdXRoZW50aWNhdGlvblN0YXR1c01lc3NhZ2UoKTsKKworICAgICAgICAvLyBGYWlsIHRlc3Qgc2luY2UgcmVxdWVzdCB3YXMgbm90IGF1dGhvcml6ZWQuCisgICAgICAgIGZhaWxUZXN0KFN0cmluZy5mb3JtYXQoIlVuYWJsZSB0byBleGVjdXRlIGJlY2F1c2UgJXMuIiwgbWVzc2FnZSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9CdXNpbmVzc0xvZ2ljRGV2aWNlRXhlY3V0b3IuamF2YSBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9CdXNpbmVzc0xvZ2ljRGV2aWNlRXhlY3V0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDdhYWYwCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0J1c2luZXNzTG9naWNEZXZpY2VFeGVjdXRvci5qYXZhCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogRXhlY3V0ZSBidXNpbmVzcyBsb2dpYyBtZXRob2RzIGZvciBkZXZpY2Ugc2lkZSB0ZXN0IGNhc2VzCisgKi8KK3B1YmxpYyBjbGFzcyBCdXNpbmVzc0xvZ2ljRGV2aWNlRXhlY3V0b3IgZXh0ZW5kcyBCdXNpbmVzc0xvZ2ljRXhlY3V0b3IgeworCisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgT2JqZWN0IG1UZXN0T2JqOworCisgICAgcHVibGljIEJ1c2luZXNzTG9naWNEZXZpY2VFeGVjdXRvcihDb250ZXh0IGNvbnRleHQsIE9iamVjdCB0ZXN0T2JqKSB7CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgbVRlc3RPYmogPSB0ZXN0T2JqOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldFRlc3RPYmplY3QoKSB7CisgICAgICAgIHJldHVybiBtVGVzdE9iajsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgbG9nSW5mbyhTdHJpbmcgZm9ybWF0LCBPYmplY3QuLi4gYXJncykgeworICAgICAgICBMb2cuaShMT0dfVEFHLCBTdHJpbmcuZm9ybWF0KGZvcm1hdCwgYXJncykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBsb2dEZWJ1ZyhTdHJpbmcgZm9ybWF0LCBPYmplY3QuLi4gYXJncykgeworICAgICAgICBMb2cuZChMT0dfVEFHLCBTdHJpbmcuZm9ybWF0KGZvcm1hdCwgYXJncykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGZvcm1hdEV4ZWN1dGlvblN0cmluZyhTdHJpbmcgbWV0aG9kLCBTdHJpbmcuLi4gYXJncykgeworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJXMoJXMpIiwgbWV0aG9kLCBUZXh0VXRpbHMuam9pbigiLCAiLCBhcmdzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvbHZlZE1ldGhvZCBnZXRSZXNvbHZlZE1ldGhvZChDbGFzcyBjbHMsIFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmcuLi4gYXJncykKKyAgICAgICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgTGlzdDxNZXRob2Q+IG5hbWVNYXRjaGVzID0gZ2V0TWV0aG9kc1dpdGhOYW1lKGNscywgbWV0aG9kTmFtZSk7CisgICAgICAgIGZvciAoTWV0aG9kIG0gOiBuYW1lTWF0Y2hlcykgeworICAgICAgICAgICAgUmVzb2x2ZWRNZXRob2Qgcm0gPSBuZXcgUmVzb2x2ZWRNZXRob2QobSk7CisgICAgICAgICAgICBpbnQgcGFyYW1UeXBlc01hdGNoZWQgPSAwOworICAgICAgICAgICAgaW50IGFyZ3NVc2VkID0gMDsKKyAgICAgICAgICAgIENsYXNzW10gcGFyYW1UeXBlcyA9IG0uZ2V0UGFyYW1ldGVyVHlwZXMoKTsKKyAgICAgICAgICAgIGZvciAoQ2xhc3MgcGFyYW1UeXBlIDogcGFyYW1UeXBlcykgeworICAgICAgICAgICAgICAgIGlmIChhcmdzVXNlZCA9PSBhcmdzLmxlbmd0aCAmJiBwYXJhbVR5cGUuZXF1YWxzKFN0cmluZy5jbGFzcykpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UndmUgdXNlZCB1cCBhbGwgc3VwcGxpZWQgc3RyaW5nIGFyZ3MsIHNvIHRoaXMgbWV0aG9kIHdpbGwgbm90IG1hdGNoLgorICAgICAgICAgICAgICAgICAgICAvLyBJZiBwYXJhbVR5cGUgaXMgdGhlIENvbnRleHQgY2xhc3MsIHdlIGNhbiBtYXRjaCBhIHBhcmFtVHlwZSB3aXRob3V0IG5lZWRpbmcKKyAgICAgICAgICAgICAgICAgICAgLy8gbW9yZSBzdHJpbmcgYXJncy4gc2ltaWxhcmx5LCBwYXJhbVR5cGUgIlN0cmluZ1tdIiBjYW4gYmUgbWF0Y2hlZCB3aXRoIHplcm8KKyAgICAgICAgICAgICAgICAgICAgLy8gc3RyaW5nIGFyZ3MuIElmIHdlIGFkZCBzdXBwb3J0IGZvciBtb3JlIHBhcmFtVHlwZXMsIHRoaXMgbG9naWMgbWF5IHJlcXVpcmUKKyAgICAgICAgICAgICAgICAgICAgLy8gYWRqdXN0bWVudC4KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwYXJhbVR5cGUuZXF1YWxzKFN0cmluZy5jbGFzcykpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVHlwZSAiU3RyaW5nIiAtLSBzdXBwbHkgdGhlIG5leHQgYXZhaWxhYmxlIGFyZworICAgICAgICAgICAgICAgICAgICBybS5hZGRBcmcoYXJnc1thcmdzVXNlZCsrXSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChDb250ZXh0LmNsYXNzLmlzQXNzaWduYWJsZUZyb20ocGFyYW1UeXBlKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBUeXBlICJDb250ZXh0IiAtLSBzdXBwbHkgdGhlIGNvbnRleHQgZnJvbSB0aGUgdGVzdCBjYXNlCisgICAgICAgICAgICAgICAgICAgIHJtLmFkZEFyZyhtQ29udGV4dCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbVR5cGUuZXF1YWxzKENsYXNzLmZvck5hbWUoU1RSSU5HX0FSUkFZX0NMQVNTKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVHlwZSAiU3RyaW5nW10iIChvciAiU3RyaW5nLi4uIikgLS0gc3VwcGx5IGFsbCByZW1haW5pbmcgYXJncworICAgICAgICAgICAgICAgICAgICBybS5hZGRBcmcoQXJyYXlzLmNvcHlPZlJhbmdlKGFyZ3MsIGFyZ3NVc2VkLCBhcmdzLmxlbmd0aCkpOworICAgICAgICAgICAgICAgICAgICBhcmdzVXNlZCArPSAoYXJncy5sZW5ndGggLSBhcmdzVXNlZCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vIFBhcmFtIHR5cGUgaXMgdW5yZWNvZ25pemVkLCB0aGlzIG1ldGhvZCB3aWxsIG5vdCBtYXRjaC4KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGFyYW1UeXBlc01hdGNoZWQrKzsgLy8gQSBwYXJhbSB0eXBlIGhhcyBiZWVuIG1hdGNoZWQgd2hlbiByZWFjaGluZyB0aGlzIHBvaW50LgorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBhcmFtVHlwZXNNYXRjaGVkID09IHBhcmFtVHlwZXMubGVuZ3RoICYmIGFyZ3NVc2VkID09IGFyZ3MubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJtOyAvLyBBcmdzIG1hdGNoLCBtZXRob2RzIG1hdGNoLCBzbyByZXR1cm4gdGhlIGZpcnN0IG1ldGhvZC1hcmdzIHBhaXJpbmcuCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBOb3QgYSBtYXRjaCwgdHJ5IGFyZ3MgZm9yIG5leHQgbWV0aG9kIHRoYXQgbWF0Y2hlcyBieSBuYW1lLgorICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgIkJ1c2luZXNzTG9naWM6IEZhaWxlZCB0byBpbnZva2UgYWN0aW9uIG1ldGhvZCAlcyB3aXRoIGFyZ3M6ICVzIiwgbWV0aG9kTmFtZSwKKyAgICAgICAgICAgICAgICBBcnJheXMudG9TdHJpbmcoYXJncykpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQnVzaW5lc3NMb2dpY1Rlc3RDYXNlLmphdmEgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQnVzaW5lc3NMb2dpY1Rlc3RDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZlNjQ3YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9CdXNpbmVzc0xvZ2ljVGVzdENhc2UuamF2YQpAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWw7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3N1bWUuYXNzdW1lVHJ1ZTsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5UZXN0TmFtZTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBEZXZpY2Utc2lkZSBiYXNlIGNsYXNzIGZvciB0ZXN0cyBsZXZlcmFnaW5nIHRoZSBCdXNpbmVzcyBMb2dpYyBzZXJ2aWNlLgorICovCitwdWJsaWMgY2xhc3MgQnVzaW5lc3NMb2dpY1Rlc3RDYXNlIHsKKworICAgIC8qIFN0cmluZyBtYXJraW5nIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhcmFtZXRlciBpbiBhIHRlc3QgbmFtZSAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9TVEFSVCA9ICJbIjsKKworICAgIC8qIFRlc3QgbmFtZSBydWxlIHRoYXQgdHJhY2tzIHRoZSBjdXJyZW50IHRlc3QgbWV0aG9kIHVuZGVyIGV4ZWN1dGlvbiAqLworICAgIEBSdWxlIHB1YmxpYyBUZXN0TmFtZSBtVGVzdENhc2UgPSBuZXcgVGVzdE5hbWUoKTsKKworICAgIHByb3RlY3RlZCBCdXNpbmVzc0xvZ2ljIG1CdXNpbmVzc0xvZ2ljOworICAgIHByb3RlY3RlZCBib29sZWFuIG1DYW5SZWFkQnVzaW5lc3NMb2dpYyA9IHRydWU7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgaGFuZGxlQnVzaW5lc3NMb2dpYygpIHsKKyAgICAgICAgbG9hZEJ1c2luZXNzTG9naWMoKTsKKyAgICAgICAgZXhlY3V0ZUJ1c2luZXNzTG9naWMoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBleGVjdXRlQnVzaW5lc3NMb2dpYygpIHsKKyAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSBtVGVzdENhc2UuZ2V0TWV0aG9kTmFtZSgpOworICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoIlRlc3QgXCIlc1wiIGlzIHVuYWJsZSB0byBleGVjdXRlIGFzIGl0IGRlcGVuZHMgb24gdGhlIG1pc3NpbmcgIgorICAgICAgICAgICAgICAgICsgInJlbW90ZSBjb25maWd1cmF0aW9uLiIsIG1ldGhvZE5hbWUpLCBtQ2FuUmVhZEJ1c2luZXNzTG9naWMpOworICAgICAgICBpZiAobWV0aG9kTmFtZS5jb250YWlucyhQQVJBTV9TVEFSVCkpIHsKKyAgICAgICAgICAgIC8vIFN0cmlwIHBhcmFtZXRlciBzdWZmaXggKGUuZy4gIlswXSIpIGZyb20gbWV0aG9kIG5hbWUKKyAgICAgICAgICAgIG1ldGhvZE5hbWUgPSBtZXRob2ROYW1lLnN1YnN0cmluZygwLCBtZXRob2ROYW1lLmxhc3RJbmRleE9mKFBBUkFNX1NUQVJUKSk7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHRlc3ROYW1lID0gU3RyaW5nLmZvcm1hdCgiJXMjJXMiLCB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpLCBtZXRob2ROYW1lKTsKKyAgICAgICAgaWYgKG1CdXNpbmVzc0xvZ2ljLmhhc0xvZ2ljRm9yKHRlc3ROYW1lKSkgeworICAgICAgICAgICAgTG9nLmkoIkZpbmRpbmcgYnVzaW5lc3MgbG9naWMgZm9yIHRlc3QgY2FzZTogIiwgdGVzdE5hbWUpOworICAgICAgICAgICAgQnVzaW5lc3NMb2dpY0V4ZWN1dG9yIGV4ZWN1dG9yID0gbmV3IEJ1c2luZXNzTG9naWNEZXZpY2VFeGVjdXRvcihnZXRDb250ZXh0KCksIHRoaXMpOworICAgICAgICAgICAgbUJ1c2luZXNzTG9naWMuYXBwbHlMb2dpY0Zvcih0ZXN0TmFtZSwgZXhlY3V0b3IpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgbG9hZEJ1c2luZXNzTG9naWMoKSB7CisgICAgICAgIEZpbGUgYnVzaW5lc3NMb2dpY0ZpbGUgPSBuZXcgRmlsZShCdXNpbmVzc0xvZ2ljLkRFVklDRV9GSUxFKTsKKyAgICAgICAgaWYgKGJ1c2luZXNzTG9naWNGaWxlLmNhblJlYWQoKSkgeworICAgICAgICAgICAgbUJ1c2luZXNzTG9naWMgPSBCdXNpbmVzc0xvZ2ljRmFjdG9yeS5jcmVhdGVGcm9tRmlsZShidXNpbmVzc0xvZ2ljRmlsZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQ2FuUmVhZEJ1c2luZXNzTG9naWMgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgSW5zdHJ1bWVudGF0aW9uIGdldEluc3RydW1lbnRhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpOworICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgQ29udGV4dCBnZXRDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VGFyZ2V0Q29udGV4dCgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBza2lwVGVzdChTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICBhc3N1bWVUcnVlKG1lc3NhZ2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZmFpbFRlc3QoU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgZmFpbChtZXNzYWdlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtYXBQdXQoU3RyaW5nIG1hcE5hbWUsIFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBib29sZWFuIHB1dCA9IGZhbHNlOworICAgICAgICBmb3IgKEZpZWxkIGYgOiBnZXRDbGFzcygpLmdldERlY2xhcmVkRmllbGRzKCkpIHsKKyAgICAgICAgICAgIGlmIChmLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKG1hcE5hbWUpICYmIE1hcC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGYuZ2V0VHlwZSgpKSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICgoTWFwKSBmLmdldCh0aGlzKSkucHV0KGtleSwgdmFsdWUpOworICAgICAgICAgICAgICAgICAgICBwdXQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cudyhTdHJpbmcuZm9ybWF0KCJmYWlsZWQgdG8gaW52b2tlIG1hcFB1dCBvbiBmaWVsZCBcIiVzXCIuIFJlc3VtaW5nLi4uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLmdldE5hbWUoKSksIGUpOworICAgICAgICAgICAgICAgICAgICAvLyBjb250aW51ZSBpdGVyYXRpbmcgdGhyb3VnaCBmaWVsZHMsIHRocm93IGV4Y2VwdGlvbiBpZiBubyBvdGhlciBmaWVsZHMgbWF0Y2gKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFwdXQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkZhaWxlZCB0byBmaW5kIG1hcCAlcyBpbiBjbGFzcyAlcyIsIG1hcE5hbWUsCisgICAgICAgICAgICAgICAgICAgIGdldENsYXNzKCkuZ2V0TmFtZSgpKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQ1RTUmVzdWx0LmphdmEgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQ1RTUmVzdWx0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYwMTU1YQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9DVFNSZXN1bHQuamF2YQpAQCAtMCwwICsxLDIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisgKiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKKworcHVibGljIGludGVyZmFjZSBDVFNSZXN1bHQgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1VMVF9PSyA9IDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTVUxUX0ZBSUwgPSAyOworICAgIHB1YmxpYyB2b2lkIHNldFJlc3VsdChpbnQgcmVzdWx0Q29kZSk7Cit9CmRpZmYgLS1naXQgYS9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQ2FsbGJhY2tBc3NlcnRlci5qYXZhIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0NhbGxiYWNrQXNzZXJ0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTlhMmE2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0NhbGxiYWNrQXNzZXJ0ZXIuamF2YQpAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWw7CisKK2ltcG9ydCBzdGF0aWMganVuaXQuZnJhbWV3b3JrLkFzc2VydC5mYWlsOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkNvbnRlbnRPYnNlcnZlcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTsKKworLyoqCisgKiBDYWxsYmFja0Fzc2VydGVyIGhlbHBzIHdhaXQgdW50aWwgYSBjYWxsYmFjayBpcyBjYWxsZWQuCisgKi8KK3B1YmxpYyBjbGFzcyBDYWxsYmFja0Fzc2VydGVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkNhbGxiYWNrQXNzZXJ0ZXIiOworCisgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbUxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworCisgICAgQ2FsbGJhY2tBc3NlcnRlcigpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsIHRoaXMgdG8gYXNzZXJ0IGEgY2FsbGJhY2sgYmUgY2FsbGVkIHdpdGhpbiB0aGUgZ2l2ZW4gdGltZW91dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBhc3NlcnRDYWxsZWQoU3RyaW5nIG1lc3NhZ2UsIGludCB0aW1lb3V0U2Vjb25kcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAobUxhdGNoLmF3YWl0KHRpbWVvdXRTZWNvbmRzLCBUaW1lVW5pdC5TRUNPTkRTKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZhaWwoIkRpZG4ndCByZWNlaXZlIGNhbGxiYWNrOiAiICsgbWVzc2FnZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBjbGVhblVwKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGNsZWFuVXAoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIGZvciBhIGJyb2FkY2FzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENhbGxiYWNrQXNzZXJ0ZXIgZm9yQnJvYWRjYXN0KEludGVudEZpbHRlciBmaWx0ZXIpIHsKKyAgICAgICAgcmV0dXJuIGZvckJyb2FkY2FzdChmaWx0ZXIsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBmb3IgYSBicm9hZGNhc3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDYWxsYmFja0Fzc2VydGVyIGZvckJyb2FkY2FzdChJbnRlbnRGaWx0ZXIgZmlsdGVyLCBQcmVkaWNhdGU8SW50ZW50PiBjaGVja2VyKSB7CisgICAgICAgIHJldHVybiBuZXcgQnJvYWRjYXN0QXNzZXJ0ZXIoZmlsdGVyLCBjaGVja2VyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2UgZm9yIGEgY29udGVudCBjaGFuZ2VkIG5vdGlmaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENhbGxiYWNrQXNzZXJ0ZXIgZm9yQ29udGVudFVyaShVcmkgd2F0Y2hVcmkpIHsKKyAgICAgICAgcmV0dXJuIGZvckNvbnRlbnRVcmkod2F0Y2hVcmksIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBmb3IgYSBjb250ZW50IGNoYW5nZWQgbm90aWZpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ2FsbGJhY2tBc3NlcnRlciBmb3JDb250ZW50VXJpKFVyaSB3YXRjaFVyaSwgUHJlZGljYXRlPFVyaT4gY2hlY2tlcikgeworICAgICAgICByZXR1cm4gbmV3IENvbnRlbnRPYnNlcnZlckFzc2VydGVyKHdhdGNoVXJpLCBjaGVja2VyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBCcm9hZGNhc3RBc3NlcnRlciBleHRlbmRzIENhbGxiYWNrQXNzZXJ0ZXIgeworICAgICAgICBwcml2YXRlIGZpbmFsIEJyb2FkY2FzdFJlY2VpdmVyIG1SZWNlaXZlcjsKKworICAgICAgICBCcm9hZGNhc3RBc3NlcnRlcihJbnRlbnRGaWx0ZXIgZmlsdGVyLCBQcmVkaWNhdGU8SW50ZW50PiBjaGVja2VyKSB7CisgICAgICAgICAgICBtUmVjZWl2ZXIgPSBuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tlciAhPSBudWxsICYmICFjaGVja2VyLnRlc3QoaW50ZW50KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiSWdub3JpbmcgaW50ZW50OiAiICsgaW50ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtTGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKS5yZWdpc3RlclJlY2VpdmVyKG1SZWNlaXZlciwgZmlsdGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICB2b2lkIGNsZWFuVXAoKSB7CisgICAgICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCkudW5yZWdpc3RlclJlY2VpdmVyKG1SZWNlaXZlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDb250ZW50T2JzZXJ2ZXJBc3NlcnRlciBleHRlbmRzIENhbGxiYWNrQXNzZXJ0ZXIgeworICAgICAgICBwcml2YXRlIGZpbmFsIENvbnRlbnRPYnNlcnZlciBtT2JzZXJ2ZXI7CisKKyAgICAgICAgQ29udGVudE9ic2VydmVyQXNzZXJ0ZXIoVXJpIHdhdGNoVXJpLCBQcmVkaWNhdGU8VXJpPiBjaGVja2VyKSB7CisgICAgICAgICAgICBtT2JzZXJ2ZXIgPSBuZXcgQ29udGVudE9ic2VydmVyKG51bGwpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNoYW5nZShib29sZWFuIHNlbGZDaGFuZ2UsIFVyaSB1cmkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrZXIgIT0gbnVsbCAmJiAhY2hlY2tlci50ZXN0KHVyaSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgIklnbm9yaW5nIG5vdGlmaWNhdGlvbiBvbiBVUkk6ICIgKyB1cmkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1MYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpLmdldENvbnRlbnRSZXNvbHZlcigpLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKAorICAgICAgICAgICAgICAgICAgICB3YXRjaFVyaSwgdHJ1ZSwgbU9ic2VydmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICB2b2lkIGNsZWFuVXAoKSB7CisgICAgICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCkuZ2V0Q29udGVudFJlc29sdmVyKCkudW5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcigKKyAgICAgICAgICAgICAgICAgICAgbU9ic2VydmVyKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9Db2xvclV0aWxzLmphdmEgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQ29sb3JVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNDM5YzcKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQ29sb3JVdGlscy5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKKworcHVibGljIGNsYXNzIENvbG9yVXRpbHMgeworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2ZXJpZnlDb2xvcihpbnQgZXhwZWN0ZWQsIGludCBvYnNlcnZlZCkgeworICAgICAgICB2ZXJpZnlDb2xvcihleHBlY3RlZCwgb2JzZXJ2ZWQsIDApOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2ZXJpZnlDb2xvcihpbnQgZXhwZWN0ZWQsIGludCBvYnNlcnZlZCwgaW50IHRvbGVyYW5jZSkgeworICAgICAgICBTdHJpbmcgcyA9ICJleHBlY3RlZCAiICsgSW50ZWdlci50b0hleFN0cmluZyhleHBlY3RlZCkKKyAgICAgICAgICAgICAgICArICIsIG9ic2VydmVkICIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKG9ic2VydmVkKQorICAgICAgICAgICAgICAgICsgIiwgdG9sZXJhdGVkIGNoYW5uZWwgZXJyb3IgIiArIHRvbGVyYW5jZTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHMsIENvbG9yLnJlZChleHBlY3RlZCksIENvbG9yLnJlZChvYnNlcnZlZCksIHRvbGVyYW5jZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhzLCBDb2xvci5ncmVlbihleHBlY3RlZCksIENvbG9yLmdyZWVuKG9ic2VydmVkKSwgdG9sZXJhbmNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHMsIENvbG9yLmJsdWUoZXhwZWN0ZWQpLCBDb2xvci5ibHVlKG9ic2VydmVkKSwgdG9sZXJhbmNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHMsIENvbG9yLmFscGhhKGV4cGVjdGVkKSwgQ29sb3IuYWxwaGEob2JzZXJ2ZWQpLCB0b2xlcmFuY2UpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9Db25uZWN0aXZpdHlVdGlscy5qYXZhIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0Nvbm5lY3Rpdml0eVV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDlhMGE4NQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9Db25uZWN0aXZpdHlVdGlscy5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQubmV0LkNvbm5lY3Rpdml0eU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0luZm87CisKK3B1YmxpYyBjbGFzcyBDb25uZWN0aXZpdHlVdGlscyB7CisgICAgcHJpdmF0ZSBDb25uZWN0aXZpdHlVdGlscygpIHsKKyAgICB9CisKKyAgICAvKiogQHJldHVybiB0cnVlIHdoZW4gdGhlIGRldmljZSBoYXMgYSBuZXR3b3JrIGNvbm5lY3Rpb24uICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTmV0d29ya0Nvbm5lY3RlZChDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgZmluYWwgTmV0d29ya0luZm8gbmV0d29ya0luZm8gPSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29ubmVjdGl2aXR5TWFuYWdlci5jbGFzcykKKyAgICAgICAgICAgICAgICAuZ2V0QWN0aXZlTmV0d29ya0luZm8oKTsKKyAgICAgICAgcmV0dXJuIChuZXR3b3JrSW5mbyAhPSBudWxsKSAmJiBuZXR3b3JrSW5mby5pc0Nvbm5lY3RlZCgpOworICAgIH0KKworICAgIC8qKiBBc3NlcnQgdGhhdCB0aGUgZGV2aWNlIGhhcyBhIG5ldHdvcmsgY29ubmVjdGlvbi4gKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0TmV0d29ya0Nvbm5lY3RlZChDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiTmV0d29yayBtdXN0IGJlIGNvbm5lY3RlZCIsIGlzTmV0d29ya0Nvbm5lY3RlZChjb250ZXh0KSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0NwdUZlYXR1cmVzLmphdmEgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQ3B1RmVhdHVyZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2YxNDE0Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0NwdUZlYXR1cmVzLmphdmEKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKKworaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7CisKK3B1YmxpYyBjbGFzcyBDcHVGZWF0dXJlcyB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUk1FQUJJX1Y3ID0gImFybWVhYmktdjdhIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSTUVBQkkgPSAiYXJtZWFiaSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSVBTQUJJID0gIm1pcHMiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCAgU3RyaW5nIFg4NkFCSSA9ICJ4ODYiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSFdDQVBfVkZQID0gKDEgPDwgNik7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIV0NBUF9ORU9OID0gKDEgPDwgMTIpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSFdDQVBfVkZQdjMgPSAoMSA8PCAxMyk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIV0NBUF9WRlB2NCA9ICgxIDw8IDE2KTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhXQ0FQX0lESVZBID0gKDEgPDwgMTcpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSFdDQVBfSURJVlQgPSAoMSA8PCAxOCk7CisKKyAgICBzdGF0aWMgeworICAgICAgICBTeXN0ZW0ubG9hZExpYnJhcnkoImN0c19qbmkiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIGlzQXJtQ3B1KCk7CisKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIGlzQXJtN0NvbXBhdGlibGUoKTsKKworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gaXNNaXBzQ3B1KCk7CisKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIGlzWDg2Q3B1KCk7CisKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIGlzQXJtNjRDcHUoKTsKKworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gaXNNaXBzNjRDcHUoKTsKKworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gaXNYODZfNjRDcHUoKTsKKworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBnZXRId0NhcHMoKTsKKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FybTY0Q3B1SW4zMkJpdE1vZGUoKSB7CisgICAgICAgIGlmICghaXNBcm1DcHUoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChTdHJpbmcgYWJpIDogQnVpbGQuU1VQUE9SVEVEXzY0X0JJVF9BQklTKSB7CisgICAgICAgICAgICBpZiAoYWJpLmVxdWFscygiYXJtNjQtdjhhIikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQ3RzQW5kcm9pZFRlc3RDYXNlLmphdmEgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQ3RzQW5kcm9pZFRlc3RDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZmYWQxZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9DdHNBbmRyb2lkVGVzdENhc2UuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWw7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI7CisKKy8qKgorICogIFRoaXMgY2xhc3MgZW11bGF0ZXMgQW5kcm9pZFRlc3RDYXNlLCBidXQgaW50ZXJuYWxseSBpdCBpcyBBY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMgorICogIHRvIGFjY2VzcyBJbnN0cnVtZW50YXRpb24uCisgKiAgRHVtbXlBY3Rpdml0eSBpcyBub3Qgc3VwcG9zZWQgdG8gYmUgYWNjZXNzZWQuCisgKi8KK3B1YmxpYyBjbGFzcyBDdHNBbmRyb2lkVGVzdENhc2UgZXh0ZW5kcyBBY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjxEdW1teUFjdGl2aXR5PiB7CisgICAgcHVibGljIEN0c0FuZHJvaWRUZXN0Q2FzZSgpIHsKKyAgICAgICAgc3VwZXIoRHVtbXlBY3Rpdml0eS5jbGFzcyk7CisgICAgfQorCisgICAgcHVibGljIENvbnRleHQgZ2V0Q29udGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIGdldEluc3RydW1lbnRhdGlvbigpLmdldENvbnRleHQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQ3RzS2V5RXZlbnRVdGlsLmphdmEgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQ3RzS2V5RXZlbnRVdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdlNDMxMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9DdHNLZXlFdmVudFV0aWwuamF2YQpAQCAtMCwwICsxLDI5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LklucHV0RGV2aWNlOworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlDaGFyYWN0ZXJNYXA7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dE1ldGhvZE1hbmFnZXI7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIHRvIHNlbmQgS2V5RXZlbnRzIGJ5cGFzc2luZyB0aGUgSU1FLiBUaGUgY29kZSBpcyBzaW1pbGFyIHRvIGZ1bmN0aW9ucyBpbgorICoge0BsaW5rIEluc3RydW1lbnRhdGlvbn0gYW5kIHtAbGluayBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdENhc2V9IGNsYXNzZXMuIEl0IHVzZXMKKyAqIHtAbGluayBJbnB1dE1ldGhvZE1hbmFnZXIjZGlzcGF0Y2hLZXlFdmVudEZyb21JbnB1dE1ldGhvZChWaWV3LCBLZXlFdmVudCl9IHRvIHNlbmQgdGhlIGV2ZW50cy4KKyAqIEFmdGVyIHNlbmRpbmcgdGhlIGV2ZW50cyB3YWl0cyBmb3IgaWRsZS4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEN0c0tleUV2ZW50VXRpbCB7CisKKyAgICBwcml2YXRlIEN0c0tleUV2ZW50VXRpbCgpIHt9CisKKyAgICAvKioKKyAgICAgKiBTZW5kcyB0aGUga2V5IGV2ZW50cyBjb3JyZXNwb25kaW5nIHRvIHRoZSB0ZXh0IHRvIHRoZSBhcHAgYmVpbmcgaW5zdHJ1bWVudGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGluc3RydW1lbnRhdGlvbiB0aGUgaW5zdHJ1bWVudGF0aW9uIHVzZWQgdG8gcnVuIHRoZSB0ZXN0LgorICAgICAqIEBwYXJhbSB0YXJnZXRWaWV3IFZpZXcgdG8gZmluZCB0aGUgVmlld1Jvb3RJbXBsIGFuZCBkaXNwYXRjaC4KKyAgICAgKiBAcGFyYW0gdGV4dCBUaGUgdGV4dCB0byBiZSBzZW50LiBOdWxsIHZhbHVlIHJldHVybnMgaW1tZWRpYXRlbHkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNlbmRTdHJpbmcoZmluYWwgSW5zdHJ1bWVudGF0aW9uIGluc3RydW1lbnRhdGlvbiwgZmluYWwgVmlldyB0YXJnZXRWaWV3LAorICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRleHQpIHsKKyAgICAgICAgaWYgKHRleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgS2V5RXZlbnRbXSBldmVudHMgPSBnZXRLZXlFdmVudHModGV4dCk7CisKKyAgICAgICAgaWYgKGV2ZW50cyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV2ZW50cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgdG8gY2hhbmdlIHRoZSB0aW1lIG9mIGFuIGV2ZW50IGJlZm9yZSBpbmplY3RpbmcgaXQgYmVjYXVzZQorICAgICAgICAgICAgICAgIC8vIGFsbCBLZXlFdmVudHMgcmV0dXJuZWQgYnkgS2V5Q2hhcmFjdGVyTWFwLmdldEV2ZW50cygpIGhhdmUgdGhlIHNhbWUKKyAgICAgICAgICAgICAgICAvLyB0aW1lIHN0YW1wIGFuZCB0aGUgc3lzdGVtIHJlamVjdHMgdG9vIG9sZCBldmVudHMuIEhlbmNlLCBpdCBpcworICAgICAgICAgICAgICAgIC8vIHBvc3NpYmxlIGZvciBhbiBldmVudCB0byBiZWNvbWUgc3RhbGUgYmVmb3JlIGl0IGlzIGluamVjdGVkIGlmIGl0CisgICAgICAgICAgICAgICAgLy8gdGFrZXMgdG9vIGxvbmcgdG8gaW5qZWN0IHRoZSBwcmVjZWRpbmcgb25lcy4KKyAgICAgICAgICAgICAgICBzZW5kS2V5KGluc3RydW1lbnRhdGlvbiwgdGFyZ2V0VmlldywgS2V5RXZlbnQuY2hhbmdlVGltZVJlcGVhdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50c1tpXSwgU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCksIDAgLyogbmV3UmVwZWF0ICovKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kcyBhIHNlcmllcyBvZiBrZXkgZXZlbnRzIHRocm91Z2ggaW5zdHJ1bWVudGF0aW9uLiBGb3IgaW5zdGFuY2U6CisgICAgICogc2VuZEtleXModmlldywgS0VZQ09ERV9EUEFEX0xFRlQsIEtFWUNPREVfRFBBRF9DRU5URVIpLgorICAgICAqCisgICAgICogQHBhcmFtIGluc3RydW1lbnRhdGlvbiB0aGUgaW5zdHJ1bWVudGF0aW9uIHVzZWQgdG8gcnVuIHRoZSB0ZXN0LgorICAgICAqIEBwYXJhbSB0YXJnZXRWaWV3IFZpZXcgdG8gZmluZCB0aGUgVmlld1Jvb3RJbXBsIGFuZCBkaXNwYXRjaC4KKyAgICAgKiBAcGFyYW0ga2V5cyBUaGUgc2VyaWVzIG9mIGtleSBjb2Rlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2VuZEtleXMoZmluYWwgSW5zdHJ1bWVudGF0aW9uIGluc3RydW1lbnRhdGlvbiwgZmluYWwgVmlldyB0YXJnZXRWaWV3LAorICAgICAgICAgICAgZmluYWwgaW50Li4ua2V5cykgeworICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBrZXlzLmxlbmd0aDsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc2VuZEtleURvd25VcChpbnN0cnVtZW50YXRpb24sIHRhcmdldFZpZXcsIGtleXNbaV0pOworICAgICAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIElnbm9yZSBzZWN1cml0eSBleGNlcHRpb25zIHRoYXQgYXJlIG5vdyB0aHJvd24KKyAgICAgICAgICAgICAgICAvLyB3aGVuIHRyeWluZyB0byBzZW5kIHRvIGFub3RoZXIgYXBwLCB0byByZXRhaW4KKyAgICAgICAgICAgICAgICAvLyBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgdGVzdHMuCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kcyBhIHNlcmllcyBvZiBrZXkgZXZlbnRzIHRocm91Z2ggaW5zdHJ1bWVudGF0aW9uLiBUaGUgc2VxdWVuY2Ugb2Yga2V5cyBpcyBhIHN0cmluZworICAgICAqIGNvbnRhaW5pbmcgdGhlIGtleSBuYW1lcyBhcyBzcGVjaWZpZWQgaW4gS2V5RXZlbnQsIHdpdGhvdXQgdGhlIEtFWUNPREVfIHByZWZpeC4gRm9yCisgICAgICogaW5zdGFuY2U6IHNlbmRLZXlzKHZpZXcsICJEUEFEX0xFRlQgQSBCIEMgRFBBRF9DRU5URVIiKS4gRWFjaCBrZXkgY2FuIGJlIHJlcGVhdGVkIGJ5IHVzaW5nCisgICAgICogdGhlIE4qIHByZWZpeC4gRm9yIGluc3RhbmNlLCB0byBzZW5kIHR3byBLRVlDT0RFX0RQQURfTEVGVCwgdXNlIHRoZSBmb2xsb3dpbmc6CisgICAgICogc2VuZEtleXModmlldywgIjIqRFBBRF9MRUZUIikuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5zdHJ1bWVudGF0aW9uIHRoZSBpbnN0cnVtZW50YXRpb24gdXNlZCB0byBydW4gdGhlIHRlc3QuCisgICAgICogQHBhcmFtIHRhcmdldFZpZXcgVmlldyB0byBmaW5kIHRoZSBWaWV3Um9vdEltcGwgYW5kIGRpc3BhdGNoLgorICAgICAqIEBwYXJhbSBrZXlzU2VxdWVuY2UgVGhlIHNlcXVlbmNlIG9mIGtleXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNlbmRLZXlzKGZpbmFsIEluc3RydW1lbnRhdGlvbiBpbnN0cnVtZW50YXRpb24sIGZpbmFsIFZpZXcgdGFyZ2V0VmlldywKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBrZXlzU2VxdWVuY2UpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nW10ga2V5cyA9IGtleXNTZXF1ZW5jZS5zcGxpdCgiICIpOworICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBrZXlzLmxlbmd0aDsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyBrZXkgPSBrZXlzW2ldOworICAgICAgICAgICAgaW50IHJlcGVhdGVyID0ga2V5LmluZGV4T2YoJyonKTsKKworICAgICAgICAgICAgaW50IGtleUNvdW50OworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBrZXlDb3VudCA9IHJlcGVhdGVyID09IC0xID8gMSA6IEludGVnZXIucGFyc2VJbnQoa2V5LnN1YnN0cmluZygwLCByZXBlYXRlcikpOworICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudygiQWN0aXZpdHlUZXN0Q2FzZSIsICJJbnZhbGlkIHJlcGVhdCBjb3VudDogIiArIGtleSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChyZXBlYXRlciAhPSAtMSkgeworICAgICAgICAgICAgICAgIGtleSA9IGtleS5zdWJzdHJpbmcocmVwZWF0ZXIgKyAxKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBrZXlDb3VudDsgaisrKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgRmllbGQga2V5Q29kZUZpZWxkID0gS2V5RXZlbnQuY2xhc3MuZ2V0RmllbGQoIktFWUNPREVfIiArIGtleSk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBrZXlDb2RlID0ga2V5Q29kZUZpZWxkLmdldEludChudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRLZXlEb3duVXAoaW5zdHJ1bWVudGF0aW9uLCB0YXJnZXRWaWV3LCBrZXlDb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIHNlY3VyaXR5IGV4Y2VwdGlvbnMgdGhhdCBhcmUgbm93IHRocm93bgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiB0cnlpbmcgdG8gc2VuZCB0byBhbm90aGVyIGFwcCwgdG8gcmV0YWluCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgdGVzdHMuCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy53KCJBY3Rpdml0eVRlc3RDYXNlIiwgIlVua25vd24ga2V5Y29kZTogS0VZQ09ERV8iICsga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy53KCJBY3Rpdml0eVRlc3RDYXNlIiwgIlVua25vd24ga2V5Y29kZTogS0VZQ09ERV8iICsga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZHMgYW4gdXAgYW5kIGRvd24ga2V5IGV2ZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnN0cnVtZW50YXRpb24gdGhlIGluc3RydW1lbnRhdGlvbiB1c2VkIHRvIHJ1biB0aGUgdGVzdC4KKyAgICAgKiBAcGFyYW0gdGFyZ2V0VmlldyBWaWV3IHRvIGZpbmQgdGhlIFZpZXdSb290SW1wbCBhbmQgZGlzcGF0Y2guCisgICAgICogQHBhcmFtIGtleSBUaGUgaW50ZWdlciBrZXljb2RlIGZvciB0aGUgZXZlbnQgdG8gYmUgc2VudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2VuZEtleURvd25VcChmaW5hbCBJbnN0cnVtZW50YXRpb24gaW5zdHJ1bWVudGF0aW9uLCBmaW5hbCBWaWV3IHRhcmdldFZpZXcsCisgICAgICAgICAgICBmaW5hbCBpbnQga2V5KSB7CisgICAgICAgIHNlbmRLZXkoaW5zdHJ1bWVudGF0aW9uLCB0YXJnZXRWaWV3LCBuZXcgS2V5RXZlbnQoS2V5RXZlbnQuQUNUSU9OX0RPV04sIGtleSkpOworICAgICAgICBzZW5kS2V5KGluc3RydW1lbnRhdGlvbiwgdGFyZ2V0VmlldywgbmV3IEtleUV2ZW50KEtleUV2ZW50LkFDVElPTl9VUCwga2V5KSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZHMgYSBrZXkgZXZlbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5zdHJ1bWVudGF0aW9uIHRoZSBpbnN0cnVtZW50YXRpb24gdXNlZCB0byBydW4gdGhlIHRlc3QuCisgICAgICogQHBhcmFtIHRhcmdldFZpZXcgVmlldyB0byBmaW5kIHRoZSBWaWV3Um9vdEltcGwgYW5kIGRpc3BhdGNoLgorICAgICAqIEBwYXJhbSBldmVudCBLZXlFdmVudCB0byBiZSBzZW5kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZW5kS2V5KGZpbmFsIEluc3RydW1lbnRhdGlvbiBpbnN0cnVtZW50YXRpb24sIGZpbmFsIFZpZXcgdGFyZ2V0VmlldywKKyAgICAgICAgICAgIGZpbmFsIEtleUV2ZW50IGV2ZW50KSB7CisgICAgICAgIHZhbGlkYXRlTm90QXBwVGhyZWFkKCk7CisKKyAgICAgICAgbG9uZyBkb3duVGltZSA9IGV2ZW50LmdldERvd25UaW1lKCk7CisgICAgICAgIGxvbmcgZXZlbnRUaW1lID0gZXZlbnQuZ2V0RXZlbnRUaW1lKCk7CisgICAgICAgIGludCBhY3Rpb24gPSBldmVudC5nZXRBY3Rpb24oKTsKKyAgICAgICAgaW50IGNvZGUgPSBldmVudC5nZXRLZXlDb2RlKCk7CisgICAgICAgIGludCByZXBlYXRDb3VudCA9IGV2ZW50LmdldFJlcGVhdENvdW50KCk7CisgICAgICAgIGludCBtZXRhU3RhdGUgPSBldmVudC5nZXRNZXRhU3RhdGUoKTsKKyAgICAgICAgaW50IGRldmljZUlkID0gZXZlbnQuZ2V0RGV2aWNlSWQoKTsKKyAgICAgICAgaW50IHNjYW5Db2RlID0gZXZlbnQuZ2V0U2NhbkNvZGUoKTsKKyAgICAgICAgaW50IHNvdXJjZSA9IGV2ZW50LmdldFNvdXJjZSgpOworICAgICAgICBpbnQgZmxhZ3MgPSBldmVudC5nZXRGbGFncygpOworICAgICAgICBpZiAoc291cmNlID09IElucHV0RGV2aWNlLlNPVVJDRV9VTktOT1dOKSB7CisgICAgICAgICAgICBzb3VyY2UgPSBJbnB1dERldmljZS5TT1VSQ0VfS0VZQk9BUkQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGV2ZW50VGltZSA9PSAwKSB7CisgICAgICAgICAgICBldmVudFRpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZG93blRpbWUgPT0gMCkgeworICAgICAgICAgICAgZG93blRpbWUgPSBldmVudFRpbWU7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBLZXlFdmVudCBuZXdFdmVudCA9IG5ldyBLZXlFdmVudChkb3duVGltZSwgZXZlbnRUaW1lLCBhY3Rpb24sIGNvZGUsIHJlcGVhdENvdW50LAorICAgICAgICAgICAgICAgIG1ldGFTdGF0ZSwgZGV2aWNlSWQsIHNjYW5Db2RlLCBmbGFncywgc291cmNlKTsKKworICAgICAgICBJbnB1dE1ldGhvZE1hbmFnZXIgaW1tID0gdGFyZ2V0Vmlldy5nZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShJbnB1dE1ldGhvZE1hbmFnZXIuY2xhc3MpOworICAgICAgICBpbW0uZGlzcGF0Y2hLZXlFdmVudEZyb21JbnB1dE1ldGhvZChudWxsLCBuZXdFdmVudCk7CisgICAgICAgIGluc3RydW1lbnRhdGlvbi53YWl0Rm9ySWRsZVN5bmMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kcyBhIGtleSBldmVudCB3aGlsZSBob2xkaW5nIGFub3RoZXIgbW9kaWZpZXIga2V5IGRvd24sIHRoZW4gcmVsZWFzZXMgYm90aCBrZXlzIGFuZAorICAgICAqIHdhaXRzIGZvciBpZGxlIHN5bmMuIFVzZWZ1bCBmb3Igc2VuZGluZyBjb21iaW5hdGlvbnMgbGlrZSBzaGlmdCArIHRhYi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnN0cnVtZW50YXRpb24gdGhlIGluc3RydW1lbnRhdGlvbiB1c2VkIHRvIHJ1biB0aGUgdGVzdC4KKyAgICAgKiBAcGFyYW0gdGFyZ2V0VmlldyBWaWV3IHRvIGZpbmQgdGhlIFZpZXdSb290SW1wbCBhbmQgZGlzcGF0Y2guCisgICAgICogQHBhcmFtIGtleUNvZGVUb1NlbmQgVGhlIGludGVnZXIga2V5Y29kZSBmb3IgdGhlIGV2ZW50IHRvIGJlIHNlbnQuCisgICAgICogQHBhcmFtIG1vZGlmaWVyS2V5Q29kZVRvSG9sZCBUaGUgaW50ZWdlciBrZXljb2RlIG9mIHRoZSBtb2RpZmllciB0byBiZSBoZWxkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZW5kS2V5V2hpbGVIb2xkaW5nTW9kaWZpZXIoZmluYWwgSW5zdHJ1bWVudGF0aW9uIGluc3RydW1lbnRhdGlvbiwKKyAgICAgICAgICAgIGZpbmFsIFZpZXcgdGFyZ2V0VmlldywgZmluYWwgaW50IGtleUNvZGVUb1NlbmQsCisgICAgICAgICAgICBmaW5hbCBpbnQgbW9kaWZpZXJLZXlDb2RlVG9Ib2xkKSB7CisgICAgICAgIGZpbmFsIGludCBtZXRhU3RhdGUgPSBnZXRNZXRhU3RhdGVGb3JNb2RpZmllcktleUNvZGUobW9kaWZpZXJLZXlDb2RlVG9Ib2xkKTsKKyAgICAgICAgZmluYWwgbG9uZyBkb3duVGltZSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworCisgICAgICAgIGZpbmFsIEtleUV2ZW50IGhvbGRLZXlEb3duID0gbmV3IEtleUV2ZW50KGRvd25UaW1lLCBkb3duVGltZSwgS2V5RXZlbnQuQUNUSU9OX0RPV04sCisgICAgICAgICAgICAgICAgbW9kaWZpZXJLZXlDb2RlVG9Ib2xkLCAwIC8qIHJlcGVhdCAqLyk7CisgICAgICAgIHNlbmRLZXkoaW5zdHJ1bWVudGF0aW9uICx0YXJnZXRWaWV3LCBob2xkS2V5RG93bik7CisKKyAgICAgICAgZmluYWwgS2V5RXZlbnQga2V5RG93biA9IG5ldyBLZXlFdmVudChkb3duVGltZSwgZG93blRpbWUsIEtleUV2ZW50LkFDVElPTl9ET1dOLAorICAgICAgICAgICAgICAgIGtleUNvZGVUb1NlbmQsIDAgLyogcmVwZWF0ICovLCBtZXRhU3RhdGUpOworICAgICAgICBzZW5kS2V5KGluc3RydW1lbnRhdGlvbiwgdGFyZ2V0Vmlldywga2V5RG93bik7CisKKyAgICAgICAgZmluYWwgS2V5RXZlbnQga2V5VXAgPSBuZXcgS2V5RXZlbnQoZG93blRpbWUsIGRvd25UaW1lLCBLZXlFdmVudC5BQ1RJT05fVVAsCisgICAgICAgICAgICAgICAga2V5Q29kZVRvU2VuZCwgMCAvKiByZXBlYXQgKi8sIG1ldGFTdGF0ZSk7CisgICAgICAgIHNlbmRLZXkoaW5zdHJ1bWVudGF0aW9uLCB0YXJnZXRWaWV3LCBrZXlVcCk7CisKKyAgICAgICAgZmluYWwgS2V5RXZlbnQgaG9sZEtleVVwID0gbmV3IEtleUV2ZW50KGRvd25UaW1lLCBkb3duVGltZSwgS2V5RXZlbnQuQUNUSU9OX1VQLAorICAgICAgICAgICAgICAgIG1vZGlmaWVyS2V5Q29kZVRvSG9sZCwgMCAvKiByZXBlYXQgKi8pOworICAgICAgICBzZW5kS2V5KGluc3RydW1lbnRhdGlvbiwgdGFyZ2V0VmlldywgaG9sZEtleVVwKTsKKworICAgICAgICBpbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldE1ldGFTdGF0ZUZvck1vZGlmaWVyS2V5Q29kZShpbnQgbW9kaWZpZXJLZXlDb2RlKSB7CisgICAgICAgIGlmICghS2V5RXZlbnQuaXNNb2RpZmllcktleShtb2RpZmllcktleUNvZGUpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNb2RpZmllciBrZXkgZXhwZWN0ZWQsIGJ1dCBnb3Q6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBLZXlFdmVudC5rZXlDb2RlVG9TdHJpbmcobW9kaWZpZXJLZXlDb2RlKSk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgbWV0YVN0YXRlOworICAgICAgICBzd2l0Y2ggKG1vZGlmaWVyS2V5Q29kZSkgeworICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX1NISUZUX0xFRlQ6CisgICAgICAgICAgICAgICAgbWV0YVN0YXRlID0gS2V5RXZlbnQuTUVUQV9TSElGVF9MRUZUX09OOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX1NISUZUX1JJR0hUOgorICAgICAgICAgICAgICAgIG1ldGFTdGF0ZSA9IEtleUV2ZW50Lk1FVEFfU0hJRlRfUklHSFRfT047CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfQUxUX0xFRlQ6CisgICAgICAgICAgICAgICAgbWV0YVN0YXRlID0gS2V5RXZlbnQuTUVUQV9BTFRfTEVGVF9PTjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9BTFRfUklHSFQ6CisgICAgICAgICAgICAgICAgbWV0YVN0YXRlID0gS2V5RXZlbnQuTUVUQV9BTFRfUklHSFRfT047CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfQ1RSTF9MRUZUOgorICAgICAgICAgICAgICAgIG1ldGFTdGF0ZSA9IEtleUV2ZW50Lk1FVEFfQ1RSTF9MRUZUX09OOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0NUUkxfUklHSFQ6CisgICAgICAgICAgICAgICAgbWV0YVN0YXRlID0gS2V5RXZlbnQuTUVUQV9DVFJMX1JJR0hUX09OOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX01FVEFfTEVGVDoKKyAgICAgICAgICAgICAgICBtZXRhU3RhdGUgPSBLZXlFdmVudC5NRVRBX01FVEFfTEVGVF9PTjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9NRVRBX1JJR0hUOgorICAgICAgICAgICAgICAgIG1ldGFTdGF0ZSA9IEtleUV2ZW50Lk1FVEFfTUVUQV9SSUdIVF9PTjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9TWU06CisgICAgICAgICAgICAgICAgbWV0YVN0YXRlID0gS2V5RXZlbnQuTUVUQV9TWU1fT047CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfTlVNOgorICAgICAgICAgICAgICAgIG1ldGFTdGF0ZSA9IEtleUV2ZW50Lk1FVEFfTlVNX0xPQ0tfT047CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRlVOQ1RJT046CisgICAgICAgICAgICAgICAgbWV0YVN0YXRlID0gS2V5RXZlbnQuTUVUQV9GVU5DVElPTl9PTjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgLy8gU2FmZXR5IG5ldDogYWxsIG1vZGlmaWVyIGtleXMgbmVlZCB0byBoYXZlIGF0IGxlYXN0IG9uZSBtZXRhIHN0YXRlIGFzc29jaWF0ZWQuCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJObyBtZXRhIHN0YXRlIGFzc29jaWF0ZWQgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJtb2RpZmllciBrZXk6ICIgKyBLZXlFdmVudC5rZXlDb2RlVG9TdHJpbmcobW9kaWZpZXJLZXlDb2RlKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gS2V5RXZlbnQubm9ybWFsaXplTWV0YVN0YXRlKG1ldGFTdGF0ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgS2V5RXZlbnRbXSBnZXRLZXlFdmVudHMoZmluYWwgU3RyaW5nIHRleHQpIHsKKyAgICAgICAgS2V5Q2hhcmFjdGVyTWFwIGtleUNoYXJhY3Rlck1hcCA9IEtleUNoYXJhY3Rlck1hcC5sb2FkKEtleUNoYXJhY3Rlck1hcC5WSVJUVUFMX0tFWUJPQVJEKTsKKyAgICAgICAgcmV0dXJuIGtleUNoYXJhY3Rlck1hcC5nZXRFdmVudHModGV4dC50b0NoYXJBcnJheSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZhbGlkYXRlTm90QXBwVGhyZWFkKCkgeworICAgICAgICBpZiAoTG9vcGVyLm15TG9vcGVyKCkgPT0gTG9vcGVyLmdldE1haW5Mb29wZXIoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJUaGlzIG1ldGhvZCBjYW4gbm90IGJlIGNhbGxlZCBmcm9tIHRoZSBtYWluIGFwcGxpY2F0aW9uIHRocmVhZCIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0N0c01vY2tpdG9VdGlscy5qYXZhIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0N0c01vY2tpdG9VdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0OTg1ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQ3RzTW9ja2l0b1V0aWxzLmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWw7CisKK2ltcG9ydCBvcmcubW9ja2l0by52ZXJpZmljYXRpb24uVmVyaWZpY2F0aW9uTW9kZTsKKworcHVibGljIGNsYXNzIEN0c01vY2tpdG9VdGlscyB7CisgICAgcHJpdmF0ZSBDdHNNb2NraXRvVXRpbHMoKSB7fQorCisgICAgcHVibGljIHN0YXRpYyBWZXJpZmljYXRpb25Nb2RlIHdpdGhpbihsb25nIHRpbWVvdXQpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBXaXRoaW4odGltZW91dCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0N0c01vdXNlVXRpbC5qYXZhIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0N0c01vdXNlVXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MjI4ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQ3RzTW91c2VVdGlsLmphdmEKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWw7CisKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTWF0Y2hlcnMuYXJnVGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTWF0Y2hlcnMuZXE7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8uaW5PcmRlcjsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5tb2NrOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnRpbWVzOworCitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuSW5wdXREZXZpY2U7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitpbXBvcnQgb3JnLm1vY2tpdG8uQXJndW1lbnRNYXRjaGVyOworaW1wb3J0IG9yZy5tb2NraXRvLkluT3JkZXI7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBDdHNNb3VzZVV0aWwgeworCisgICAgcHJpdmF0ZSBDdHNNb3VzZVV0aWwoKSB7fQorCisgICAgcHVibGljIHN0YXRpYyBWaWV3Lk9uSG92ZXJMaXN0ZW5lciBpbnN0YWxsSG92ZXJMaXN0ZW5lcihWaWV3IHZpZXcpIHsKKyAgICAgICAgcmV0dXJuIGluc3RhbGxIb3Zlckxpc3RlbmVyKHZpZXcsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgVmlldy5PbkhvdmVyTGlzdGVuZXIgaW5zdGFsbEhvdmVyTGlzdGVuZXIoVmlldyB2aWV3LCBib29sZWFuIHJlc3VsdCkgeworICAgICAgICBmaW5hbCBWaWV3Lk9uSG92ZXJMaXN0ZW5lciBtb2NrTGlzdGVuZXIgPSBtb2NrKFZpZXcuT25Ib3Zlckxpc3RlbmVyLmNsYXNzKTsKKyAgICAgICAgdmlldy5zZXRPbkhvdmVyTGlzdGVuZXIoKHYsIGV2ZW50KSAtPiB7CisgICAgICAgICAgICAvLyBDbG9uZSB0aGUgZXZlbnQgdG8gd29yayBhcm91bmQgZXZlbnQgaW5zdGFuY2UgcmV1c2UgaW4gdGhlIGZyYW1ld29yay4KKyAgICAgICAgICAgIG1vY2tMaXN0ZW5lci5vbkhvdmVyKHYsIE1vdGlvbkV2ZW50Lm9idGFpbihldmVudCkpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBtb2NrTGlzdGVuZXI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNsZWFySG92ZXJMaXN0ZW5lcihWaWV3IHZpZXcpIHsKKyAgICAgICAgdmlldy5zZXRPbkhvdmVyTGlzdGVuZXIobnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBNb3Rpb25FdmVudCBvYnRhaW5Nb3VzZUV2ZW50KGludCBhY3Rpb24sIFZpZXcgYW5jaG9yLCBpbnQgb2Zmc2V0WCwgaW50IG9mZnNldFkpIHsKKyAgICAgICAgZmluYWwgbG9uZyBldmVudFRpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgZmluYWwgaW50W10gc2NyZWVuUG9zID0gbmV3IGludFsyXTsKKyAgICAgICAgYW5jaG9yLmdldExvY2F0aW9uT25TY3JlZW4oc2NyZWVuUG9zKTsKKyAgICAgICAgZmluYWwgaW50IHggPSBzY3JlZW5Qb3NbMF0gKyBvZmZzZXRYOworICAgICAgICBmaW5hbCBpbnQgeSA9IHNjcmVlblBvc1sxXSArIG9mZnNldFk7CisgICAgICAgIE1vdGlvbkV2ZW50IGV2ZW50ID0gTW90aW9uRXZlbnQub2J0YWluKGV2ZW50VGltZSwgZXZlbnRUaW1lLCBhY3Rpb24sIHgsIHksIDApOworICAgICAgICBldmVudC5zZXRTb3VyY2UoSW5wdXREZXZpY2UuU09VUkNFX01PVVNFKTsKKyAgICAgICAgcmV0dXJuIGV2ZW50OworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQWN0aW9uTWF0Y2hlciBpbXBsZW1lbnRzIEFyZ3VtZW50TWF0Y2hlcjxNb3Rpb25FdmVudD4geworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtQWN0aW9uOworCisgICAgICAgIHB1YmxpYyBBY3Rpb25NYXRjaGVyKGludCBhY3Rpb24pIHsKKyAgICAgICAgICAgIG1BY3Rpb24gPSBhY3Rpb247CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhNb3Rpb25FdmVudCBhY3R1YWwpIHsKKyAgICAgICAgICAgIHJldHVybiBhY3R1YWwuZ2V0QWN0aW9uKCkgPT0gbUFjdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJhY3Rpb249IiArIE1vdGlvbkV2ZW50LmFjdGlvblRvU3RyaW5nKG1BY3Rpb24pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQb3NpdGlvbk1hdGNoZXIgZXh0ZW5kcyBBY3Rpb25NYXRjaGVyIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVg7CisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1ZOworCisgICAgICAgIHB1YmxpYyBQb3NpdGlvbk1hdGNoZXIoaW50IGFjdGlvbiwgaW50IHgsIGludCB5KSB7CisgICAgICAgICAgICBzdXBlcihhY3Rpb24pOworICAgICAgICAgICAgbVggPSB4OworICAgICAgICAgICAgbVkgPSB5OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoTW90aW9uRXZlbnQgYWN0dWFsKSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIubWF0Y2hlcyhhY3R1YWwpCisgICAgICAgICAgICAgICAgICAgICYmICgoaW50KSBhY3R1YWwuZ2V0WCgpKSA9PSBtWAorICAgICAgICAgICAgICAgICAgICAmJiAoKGludCkgYWN0dWFsLmdldFkoKSkgPT0gbVk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBzdXBlci50b1N0cmluZygpICsgIkAoIiArIG1YICsgIiwiICsgbVkgKyAiKSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmVyaWZ5RW50ZXJNb3ZlKFZpZXcuT25Ib3Zlckxpc3RlbmVyIGxpc3RlbmVyLCBWaWV3IHZpZXcsIGludCBtb3ZlQ291bnQpIHsKKyAgICAgICAgZmluYWwgSW5PcmRlciBpbk9yZGVyID0gaW5PcmRlcihsaXN0ZW5lcik7CisgICAgICAgIHZlcmlmeUVudGVyTW92ZUludGVybmFsKGxpc3RlbmVyLCB2aWV3LCBtb3ZlQ291bnQsIGluT3JkZXIpOworICAgICAgICBpbk9yZGVyLnZlcmlmeU5vTW9yZUludGVyYWN0aW9ucygpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2ZXJpZnlFbnRlck1vdmVFeGl0KAorICAgICAgICAgICAgVmlldy5PbkhvdmVyTGlzdGVuZXIgbGlzdGVuZXIsIFZpZXcgdmlldywgaW50IG1vdmVDb3VudCkgeworICAgICAgICBmaW5hbCBJbk9yZGVyIGluT3JkZXIgPSBpbk9yZGVyKGxpc3RlbmVyKTsKKyAgICAgICAgdmVyaWZ5RW50ZXJNb3ZlSW50ZXJuYWwobGlzdGVuZXIsIHZpZXcsIG1vdmVDb3VudCwgaW5PcmRlcik7CisgICAgICAgIGluT3JkZXIudmVyaWZ5KGxpc3RlbmVyLCB0aW1lcygxKSkub25Ib3ZlcihlcSh2aWV3KSwKKyAgICAgICAgICAgICAgICBhcmdUaGF0KG5ldyBBY3Rpb25NYXRjaGVyKE1vdGlvbkV2ZW50LkFDVElPTl9IT1ZFUl9FWElUKSkpOworICAgICAgICBpbk9yZGVyLnZlcmlmeU5vTW9yZUludGVyYWN0aW9ucygpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdmVyaWZ5RW50ZXJNb3ZlSW50ZXJuYWwoCisgICAgICAgICAgICBWaWV3Lk9uSG92ZXJMaXN0ZW5lciBsaXN0ZW5lciwgVmlldyB2aWV3LCBpbnQgbW92ZUNvdW50LCBJbk9yZGVyIGluT3JkZXIpIHsKKyAgICAgICAgaW5PcmRlci52ZXJpZnkobGlzdGVuZXIsIHRpbWVzKDEpKS5vbkhvdmVyKGVxKHZpZXcpLAorICAgICAgICAgICAgICAgIGFyZ1RoYXQobmV3IEFjdGlvbk1hdGNoZXIoTW90aW9uRXZlbnQuQUNUSU9OX0hPVkVSX0VOVEVSKSkpOworICAgICAgICBpbk9yZGVyLnZlcmlmeShsaXN0ZW5lciwgdGltZXMobW92ZUNvdW50KSkub25Ib3ZlcihlcSh2aWV3KSwKKyAgICAgICAgICAgICAgICBhcmdUaGF0KG5ldyBBY3Rpb25NYXRjaGVyKE1vdGlvbkV2ZW50LkFDVElPTl9IT1ZFUl9NT1ZFKSkpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0N0c1RvdWNoVXRpbHMuamF2YSBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9DdHNUb3VjaFV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY3OTZhOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9DdHNUb3VjaFV0aWxzLmphdmEKQEAgLTAsMCArMSw1NjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWw7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb247CitpbXBvcnQgYW5kcm9pZC5hcHAuVWlBdXRvbWF0aW9uOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CitpbXBvcnQgYW5kcm9pZC52aWV3LklucHV0RGV2aWNlOworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0NvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKKworLyoqCisgKiBUZXN0IHV0aWxpdGllcyBmb3IgdG91Y2ggZW11bGF0aW9uLgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQ3RzVG91Y2hVdGlscyB7CisgICAgLyoqCisgICAgICogSW50ZXJmYWNlIGRlZmluaXRpb24gZm9yIGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3aGVuIGFuIGV2ZW50IGhhcyBiZWVuIGluamVjdGVkLgorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgRXZlbnRJbmplY3Rpb25MaXN0ZW5lciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsYmFjayBtZXRob2QgdG8gYmUgaW52b2tlZCB3aGVuIGEge01vdGlvbkV2ZW50I0FDVElPTl9ET1dOfSBoYXMgYmVlbiBpbmplY3RlZC4KKyAgICAgICAgICogQHBhcmFtIHhPblNjcmVlbiBYIGNvb3JkaW5hdGUgb2YgdGhlIGluamVjdGVkIGV2ZW50LgorICAgICAgICAgKiBAcGFyYW0geU9uU2NyZWVuIFkgY29vcmRpbmF0ZSBvZiB0aGUgaW5qZWN0ZWQgZXZlbnQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkRvd25JbmplY3RlZChpbnQgeE9uU2NyZWVuLCBpbnQgeU9uU2NyZWVuKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGJhY2sgbWV0aG9kIHRvIGJlIGludm9rZWQgd2hlbiBhIHtNb3Rpb25FdmVudCNBQ1RJT05fTU9WRX0gaGFzIGJlZW4gaW5qZWN0ZWQuCisgICAgICAgICAqIEBwYXJhbSB4T25TY3JlZW4gWCBjb29yZGluYXRlcyBvZiB0aGUgaW5qZWN0ZWQgZXZlbnQuCisgICAgICAgICAqIEBwYXJhbSB5T25TY3JlZW4gWSBjb29yZGluYXRlcyBvZiB0aGUgaW5qZWN0ZWQgZXZlbnQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbk1vdmVJbmplY3RlZChpbnRbXSB4T25TY3JlZW4sIGludFtdIHlPblNjcmVlbik7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxiYWNrIG1ldGhvZCB0byBiZSBpbnZva2VkIHdoZW4gYSB7TW90aW9uRXZlbnQjQUNUSU9OX1VQfSBoYXMgYmVlbiBpbmplY3RlZC4KKyAgICAgICAgICogQHBhcmFtIHhPblNjcmVlbiBYIGNvb3JkaW5hdGUgb2YgdGhlIGluamVjdGVkIGV2ZW50LgorICAgICAgICAgKiBAcGFyYW0geU9uU2NyZWVuIFkgY29vcmRpbmF0ZSBvZiB0aGUgaW5qZWN0ZWQgZXZlbnQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvblVwSW5qZWN0ZWQoaW50IHhPblNjcmVlbiwgaW50IHlPblNjcmVlbik7CisgICAgfQorCisgICAgcHJpdmF0ZSBDdHNUb3VjaFV0aWxzKCkge30KKworICAgIC8qKgorICAgICAqIEVtdWxhdGVzIGEgdGFwIGluIHRoZSBjZW50ZXIgb2YgdGhlIHBhc3NlZCB7QGxpbmsgVmlld30uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5zdHJ1bWVudGF0aW9uIHRoZSBpbnN0cnVtZW50YXRpb24gdXNlZCB0byBydW4gdGhlIHRlc3QKKyAgICAgKiBAcGFyYW0gdmlldyB0aGUgdmlldyB0byAidGFwIgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBlbXVsYXRlVGFwT25WaWV3Q2VudGVyKEluc3RydW1lbnRhdGlvbiBpbnN0cnVtZW50YXRpb24sIFZpZXcgdmlldykgeworICAgICAgICBlbXVsYXRlVGFwT25WaWV3KGluc3RydW1lbnRhdGlvbiwgdmlldywgdmlldy5nZXRXaWR0aCgpIC8gMiwgdmlldy5nZXRIZWlnaHQoKSAvIDIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVtdWxhdGVzIGEgdGFwIG9uIGEgcG9pbnQgcmVsYXRpdmUgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgcGFzc2VkIHtAbGluayBWaWV3fS4gT2Zmc2V0CisgICAgICogcGFyYW1ldGVycyBhcmUgdXNlZCB0byBjb21wdXRlIHRoZSBmaW5hbCBzY3JlZW4gY29vcmRpbmF0ZXMgb2YgdGhlIHRhcCBwb2ludC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnN0cnVtZW50YXRpb24gdGhlIGluc3RydW1lbnRhdGlvbiB1c2VkIHRvIHJ1biB0aGUgdGVzdAorICAgICAqIEBwYXJhbSBhbmNob3JWaWV3IHRoZSBhbmNob3IgdmlldyB0byBkZXRlcm1pbmUgdGhlIHRhcCBsb2NhdGlvbiBvbiB0aGUgc2NyZWVuCisgICAgICogQHBhcmFtIG9mZnNldFggZXh0cmEgWCBvZmZzZXQgZm9yIHRoZSB0YXAKKyAgICAgKiBAcGFyYW0gb2Zmc2V0WSBleHRyYSBZIG9mZnNldCBmb3IgdGhlIHRhcAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBlbXVsYXRlVGFwT25WaWV3KEluc3RydW1lbnRhdGlvbiBpbnN0cnVtZW50YXRpb24sIFZpZXcgYW5jaG9yVmlldywKKyAgICAgICAgICAgIGludCBvZmZzZXRYLCBpbnQgb2Zmc2V0WSkgeworICAgICAgICBmaW5hbCBpbnQgdG91Y2hTbG9wID0gVmlld0NvbmZpZ3VyYXRpb24uZ2V0KGFuY2hvclZpZXcuZ2V0Q29udGV4dCgpKS5nZXRTY2FsZWRUb3VjaFNsb3AoKTsKKyAgICAgICAgLy8gR2V0IGFuY2hvciBjb29yZGluYXRlcyBvbiB0aGUgc2NyZWVuCisgICAgICAgIGZpbmFsIGludFtdIHZpZXdPblNjcmVlblhZID0gbmV3IGludFsyXTsKKyAgICAgICAgYW5jaG9yVmlldy5nZXRMb2NhdGlvbk9uU2NyZWVuKHZpZXdPblNjcmVlblhZKTsKKyAgICAgICAgaW50IHhPblNjcmVlbiA9IHZpZXdPblNjcmVlblhZWzBdICsgb2Zmc2V0WDsKKyAgICAgICAgaW50IHlPblNjcmVlbiA9IHZpZXdPblNjcmVlblhZWzFdICsgb2Zmc2V0WTsKKyAgICAgICAgZmluYWwgVWlBdXRvbWF0aW9uIHVpQXV0b21hdGlvbiA9IGluc3RydW1lbnRhdGlvbi5nZXRVaUF1dG9tYXRpb24oKTsKKyAgICAgICAgZmluYWwgbG9uZyBkb3duVGltZSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworCisgICAgICAgIGluamVjdERvd25FdmVudCh1aUF1dG9tYXRpb24sIGRvd25UaW1lLCB4T25TY3JlZW4sIHlPblNjcmVlbiwgbnVsbCk7CisgICAgICAgIGluamVjdE1vdmVFdmVudEZvclRhcCh1aUF1dG9tYXRpb24sIGRvd25UaW1lLCB0b3VjaFNsb3AsIHhPblNjcmVlbiwgeU9uU2NyZWVuKTsKKyAgICAgICAgaW5qZWN0VXBFdmVudCh1aUF1dG9tYXRpb24sIGRvd25UaW1lLCBmYWxzZSwgeE9uU2NyZWVuLCB5T25TY3JlZW4sIG51bGwpOworCisgICAgICAgIC8vIFdhaXQgZm9yIHRoZSBzeXN0ZW0gdG8gcHJvY2VzcyBhbGwgZXZlbnRzIGluIHRoZSBxdWV1ZQorICAgICAgICBpbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW11bGF0ZXMgYSBkb3VibGUgdGFwIGluIHRoZSBjZW50ZXIgb2YgdGhlIHBhc3NlZCB7QGxpbmsgVmlld30uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5zdHJ1bWVudGF0aW9uIHRoZSBpbnN0cnVtZW50YXRpb24gdXNlZCB0byBydW4gdGhlIHRlc3QKKyAgICAgKiBAcGFyYW0gdmlldyB0aGUgdmlldyB0byAiZG91YmxlIHRhcCIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZW11bGF0ZURvdWJsZVRhcE9uVmlld0NlbnRlcihJbnN0cnVtZW50YXRpb24gaW5zdHJ1bWVudGF0aW9uLCBWaWV3IHZpZXcpIHsKKyAgICAgICAgZW11bGF0ZURvdWJsZVRhcE9uVmlldyhpbnN0cnVtZW50YXRpb24sIHZpZXcsIHZpZXcuZ2V0V2lkdGgoKSAvIDIsIHZpZXcuZ2V0SGVpZ2h0KCkgLyAyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbXVsYXRlcyBhIGRvdWJsZSB0YXAgb24gYSBwb2ludCByZWxhdGl2ZSB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBwYXNzZWQge0BsaW5rIFZpZXd9LgorICAgICAqIE9mZnNldCBwYXJhbWV0ZXJzIGFyZSB1c2VkIHRvIGNvbXB1dGUgdGhlIGZpbmFsIHNjcmVlbiBjb29yZGluYXRlcyBvZiB0aGUgdGFwIHBvaW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnN0cnVtZW50YXRpb24gdGhlIGluc3RydW1lbnRhdGlvbiB1c2VkIHRvIHJ1biB0aGUgdGVzdAorICAgICAqIEBwYXJhbSBhbmNob3JWaWV3IHRoZSBhbmNob3IgdmlldyB0byBkZXRlcm1pbmUgdGhlIHRhcCBsb2NhdGlvbiBvbiB0aGUgc2NyZWVuCisgICAgICogQHBhcmFtIG9mZnNldFggZXh0cmEgWCBvZmZzZXQgZm9yIHRoZSB0YXBzCisgICAgICogQHBhcmFtIG9mZnNldFkgZXh0cmEgWSBvZmZzZXQgZm9yIHRoZSB0YXBzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGVtdWxhdGVEb3VibGVUYXBPblZpZXcoSW5zdHJ1bWVudGF0aW9uIGluc3RydW1lbnRhdGlvbiwgVmlldyBhbmNob3JWaWV3LAorICAgICAgICAgICAgaW50IG9mZnNldFgsIGludCBvZmZzZXRZKSB7CisgICAgICAgIGZpbmFsIGludCB0b3VjaFNsb3AgPSBWaWV3Q29uZmlndXJhdGlvbi5nZXQoYW5jaG9yVmlldy5nZXRDb250ZXh0KCkpLmdldFNjYWxlZFRvdWNoU2xvcCgpOworICAgICAgICAvLyBHZXQgYW5jaG9yIGNvb3JkaW5hdGVzIG9uIHRoZSBzY3JlZW4KKyAgICAgICAgZmluYWwgaW50W10gdmlld09uU2NyZWVuWFkgPSBuZXcgaW50WzJdOworICAgICAgICBhbmNob3JWaWV3LmdldExvY2F0aW9uT25TY3JlZW4odmlld09uU2NyZWVuWFkpOworICAgICAgICBpbnQgeE9uU2NyZWVuID0gdmlld09uU2NyZWVuWFlbMF0gKyBvZmZzZXRYOworICAgICAgICBpbnQgeU9uU2NyZWVuID0gdmlld09uU2NyZWVuWFlbMV0gKyBvZmZzZXRZOworICAgICAgICBmaW5hbCBVaUF1dG9tYXRpb24gdWlBdXRvbWF0aW9uID0gaW5zdHJ1bWVudGF0aW9uLmdldFVpQXV0b21hdGlvbigpOworICAgICAgICBmaW5hbCBsb25nIGRvd25UaW1lID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CisKKyAgICAgICAgaW5qZWN0RG93bkV2ZW50KHVpQXV0b21hdGlvbiwgZG93blRpbWUsIHhPblNjcmVlbiwgeU9uU2NyZWVuLCBudWxsKTsKKyAgICAgICAgaW5qZWN0TW92ZUV2ZW50Rm9yVGFwKHVpQXV0b21hdGlvbiwgZG93blRpbWUsIHRvdWNoU2xvcCwgeE9uU2NyZWVuLCB5T25TY3JlZW4pOworICAgICAgICBpbmplY3RVcEV2ZW50KHVpQXV0b21hdGlvbiwgZG93blRpbWUsIGZhbHNlLCB4T25TY3JlZW4sIHlPblNjcmVlbiwgbnVsbCk7CisgICAgICAgIGluamVjdERvd25FdmVudCh1aUF1dG9tYXRpb24sIGRvd25UaW1lLCB4T25TY3JlZW4sIHlPblNjcmVlbiwgbnVsbCk7CisgICAgICAgIGluamVjdE1vdmVFdmVudEZvclRhcCh1aUF1dG9tYXRpb24sIGRvd25UaW1lLCB0b3VjaFNsb3AsIHhPblNjcmVlbiwgeU9uU2NyZWVuKTsKKyAgICAgICAgaW5qZWN0VXBFdmVudCh1aUF1dG9tYXRpb24sIGRvd25UaW1lLCBmYWxzZSwgeE9uU2NyZWVuLCB5T25TY3JlZW4sIG51bGwpOworCisgICAgICAgIC8vIFdhaXQgZm9yIHRoZSBzeXN0ZW0gdG8gcHJvY2VzcyBhbGwgZXZlbnRzIGluIHRoZSBxdWV1ZQorICAgICAgICBpbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW11bGF0ZXMgYSBsaW5lYXIgZHJhZyBnZXN0dXJlIGJldHdlZW4gMiBwb2ludHMgYWNyb3NzIHRoZSBzY3JlZW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5zdHJ1bWVudGF0aW9uIHRoZSBpbnN0cnVtZW50YXRpb24gdXNlZCB0byBydW4gdGhlIHRlc3QKKyAgICAgKiBAcGFyYW0gZHJhZ1N0YXJ0WCBTdGFydCBYIG9mIHRoZSBlbXVsYXRlZCBkcmFnIGdlc3R1cmUKKyAgICAgKiBAcGFyYW0gZHJhZ1N0YXJ0WSBTdGFydCBZIG9mIHRoZSBlbXVsYXRlZCBkcmFnIGdlc3R1cmUKKyAgICAgKiBAcGFyYW0gZHJhZ0Ftb3VudFggWCBhbW91bnQgb2YgdGhlIGVtdWxhdGVkIGRyYWcgZ2VzdHVyZQorICAgICAqIEBwYXJhbSBkcmFnQW1vdW50WSBZIGFtb3VudCBvZiB0aGUgZW11bGF0ZWQgZHJhZyBnZXN0dXJlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGVtdWxhdGVEcmFnR2VzdHVyZShJbnN0cnVtZW50YXRpb24gaW5zdHJ1bWVudGF0aW9uLAorICAgICAgICAgICAgaW50IGRyYWdTdGFydFgsIGludCBkcmFnU3RhcnRZLCBpbnQgZHJhZ0Ftb3VudFgsIGludCBkcmFnQW1vdW50WSkgeworICAgICAgICBlbXVsYXRlRHJhZ0dlc3R1cmUoaW5zdHJ1bWVudGF0aW9uLCBkcmFnU3RhcnRYLCBkcmFnU3RhcnRZLCBkcmFnQW1vdW50WCwgZHJhZ0Ftb3VudFksCisgICAgICAgICAgICAgICAgMjAwMCwgMjAsIG51bGwpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZW11bGF0ZURyYWdHZXN0dXJlKEluc3RydW1lbnRhdGlvbiBpbnN0cnVtZW50YXRpb24sCisgICAgICAgICAgICBpbnQgZHJhZ1N0YXJ0WCwgaW50IGRyYWdTdGFydFksIGludCBkcmFnQW1vdW50WCwgaW50IGRyYWdBbW91bnRZLAorICAgICAgICAgICAgaW50IGRyYWdEdXJhdGlvbk1zLCBpbnQgbW92ZUV2ZW50Q291bnQpIHsKKyAgICAgICAgZW11bGF0ZURyYWdHZXN0dXJlKGluc3RydW1lbnRhdGlvbiwgZHJhZ1N0YXJ0WCwgZHJhZ1N0YXJ0WSwgZHJhZ0Ftb3VudFgsIGRyYWdBbW91bnRZLAorICAgICAgICAgICAgICAgIGRyYWdEdXJhdGlvbk1zLCBtb3ZlRXZlbnRDb3VudCwgbnVsbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBlbXVsYXRlRHJhZ0dlc3R1cmUoSW5zdHJ1bWVudGF0aW9uIGluc3RydW1lbnRhdGlvbiwKKyAgICAgICAgICAgIGludCBkcmFnU3RhcnRYLCBpbnQgZHJhZ1N0YXJ0WSwgaW50IGRyYWdBbW91bnRYLCBpbnQgZHJhZ0Ftb3VudFksCisgICAgICAgICAgICBpbnQgZHJhZ0R1cmF0aW9uTXMsIGludCBtb3ZlRXZlbnRDb3VudCwKKyAgICAgICAgICAgIEV2ZW50SW5qZWN0aW9uTGlzdGVuZXIgZXZlbnRJbmplY3Rpb25MaXN0ZW5lcikgeworICAgICAgICAvLyBXZSBhcmUgdXNpbmcgdGhlIFVpQXV0b21hdGlvbiBvYmplY3QgdG8gaW5qZWN0IGV2ZW50cyBzbyB0aGF0IGRyYWcgd29ya3MKKyAgICAgICAgLy8gYWNyb3NzIHZpZXcgLyB3aW5kb3cgYm91bmRhcmllcyAoc3VjaCBhcyBmb3IgdGhlIGVtdWxhdGVkIGRyYWcgYW5kIGRyb3AKKyAgICAgICAgLy8gc2VxdWVuY2VzKQorICAgICAgICBmaW5hbCBVaUF1dG9tYXRpb24gdWlBdXRvbWF0aW9uID0gaW5zdHJ1bWVudGF0aW9uLmdldFVpQXV0b21hdGlvbigpOworICAgICAgICBmaW5hbCBsb25nIGRvd25UaW1lID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CisKKyAgICAgICAgaW5qZWN0RG93bkV2ZW50KHVpQXV0b21hdGlvbiwgZG93blRpbWUsIGRyYWdTdGFydFgsIGRyYWdTdGFydFksIGV2ZW50SW5qZWN0aW9uTGlzdGVuZXIpOworCisgICAgICAgIC8vIEluamVjdCBhIHNlcXVlbmNlIG9mIE1PVkUgZXZlbnRzIHRoYXQgZW11bGF0ZSB0aGUgIm1vdmUiIHBhcnQgb2YgdGhlIGdlc3R1cmUKKyAgICAgICAgaW5qZWN0TW92ZUV2ZW50c0ZvckRyYWcodWlBdXRvbWF0aW9uLCBkb3duVGltZSwgdHJ1ZSwgZHJhZ1N0YXJ0WCwgZHJhZ1N0YXJ0WSwKKyAgICAgICAgICAgICAgICBkcmFnU3RhcnRYICsgZHJhZ0Ftb3VudFgsIGRyYWdTdGFydFkgKyBkcmFnQW1vdW50WSwgbW92ZUV2ZW50Q291bnQsIGRyYWdEdXJhdGlvbk1zLAorICAgICAgICAgICAgZXZlbnRJbmplY3Rpb25MaXN0ZW5lcik7CisKKyAgICAgICAgaW5qZWN0VXBFdmVudCh1aUF1dG9tYXRpb24sIGRvd25UaW1lLCB0cnVlLCBkcmFnU3RhcnRYICsgZHJhZ0Ftb3VudFgsCisgICAgICAgICAgICAgICAgZHJhZ1N0YXJ0WSArIGRyYWdBbW91bnRZLCBldmVudEluamVjdGlvbkxpc3RlbmVyKTsKKworICAgICAgICAvLyBXYWl0IGZvciB0aGUgc3lzdGVtIHRvIHByb2Nlc3MgYWxsIGV2ZW50cyBpbiB0aGUgcXVldWUKKyAgICAgICAgaW5zdHJ1bWVudGF0aW9uLndhaXRGb3JJZGxlU3luYygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVtdWxhdGVzIGEgc2VyaWVzIG9mIGxpbmVhciBkcmFnIGdlc3R1cmVzIGFjcm9zcyB0aGUgc2NyZWVuIGJldHdlZW4gbXVsdGlwbGUgcG9pbnRzIHdpdGhvdXQKKyAgICAgKiBsaWZ0aW5nIHRoZSBmaW5nZXIuIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IHN1cHBvcnQgY3VydmUgbW92ZW1lbnRzIGJldHdlZW4gdGhlCisgICAgICogcG9pbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIGluc3RydW1lbnRhdGlvbiB0aGUgaW5zdHJ1bWVudGF0aW9uIHVzZWQgdG8gcnVuIHRoZSB0ZXN0CisgICAgICogQHBhcmFtIGNvb3JkaW5hdGVzIHRoZSBvcmRlcmVkIGxpc3Qgb2YgcG9pbnRzIGZvciB0aGUgZHJhZyBnZXN0dXJlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGVtdWxhdGVEcmFnR2VzdHVyZShJbnN0cnVtZW50YXRpb24gaW5zdHJ1bWVudGF0aW9uLAorICAgICAgICAgICAgU3BhcnNlQXJyYXk8UG9pbnQ+IGNvb3JkaW5hdGVzKSB7CisgICAgICAgIGVtdWxhdGVEcmFnR2VzdHVyZShpbnN0cnVtZW50YXRpb24sIGNvb3JkaW5hdGVzLCAyMDAwLCAyMCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBlbXVsYXRlRHJhZ0dlc3R1cmUoSW5zdHJ1bWVudGF0aW9uIGluc3RydW1lbnRhdGlvbiwKKyAgICAgICAgICAgIFNwYXJzZUFycmF5PFBvaW50PiBjb29yZGluYXRlcywgaW50IGRyYWdEdXJhdGlvbk1zLCBpbnQgbW92ZUV2ZW50Q291bnQpIHsKKyAgICAgICAgZmluYWwgaW50IGNvb3JkaW5hdGVzU2l6ZSA9IGNvb3JkaW5hdGVzLnNpemUoKTsKKyAgICAgICAgaWYgKGNvb3JkaW5hdGVzU2l6ZSA8IDIpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5lZWQgYXQgbGVhc3QgMiBwb2ludHMgZm9yIGVtdWxhdGluZyBkcmFnIik7CisgICAgICAgIH0KKyAgICAgICAgLy8gV2UgYXJlIHVzaW5nIHRoZSBVaUF1dG9tYXRpb24gb2JqZWN0IHRvIGluamVjdCBldmVudHMgc28gdGhhdCBkcmFnIHdvcmtzCisgICAgICAgIC8vIGFjcm9zcyB2aWV3IC8gd2luZG93IGJvdW5kYXJpZXMgKHN1Y2ggYXMgZm9yIHRoZSBlbXVsYXRlZCBkcmFnIGFuZCBkcm9wCisgICAgICAgIC8vIHNlcXVlbmNlcykKKyAgICAgICAgZmluYWwgVWlBdXRvbWF0aW9uIHVpQXV0b21hdGlvbiA9IGluc3RydW1lbnRhdGlvbi5nZXRVaUF1dG9tYXRpb24oKTsKKyAgICAgICAgZmluYWwgbG9uZyBkb3duVGltZSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworCisgICAgICAgIGluamVjdERvd25FdmVudCh1aUF1dG9tYXRpb24sIGRvd25UaW1lLCBjb29yZGluYXRlcy5nZXQoMCkueCwgY29vcmRpbmF0ZXMuZ2V0KDApLnksIG51bGwpOworCisgICAgICAgIC8vIE1vdmUgdG8gZWFjaCBjb29yZGluYXRlLgorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvb3JkaW5hdGVzU2l6ZSAtIDE7IGkrKykgeworICAgICAgICAgICAgLy8gSW5qZWN0IGEgc2VxdWVuY2Ugb2YgTU9WRSBldmVudHMgdGhhdCBlbXVsYXRlIHRoZSAibW92ZSIgcGFydCBvZiB0aGUgZ2VzdHVyZS4KKyAgICAgICAgICAgIGluamVjdE1vdmVFdmVudHNGb3JEcmFnKHVpQXV0b21hdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgZG93blRpbWUsCisgICAgICAgICAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzLmdldChpKS54LAorICAgICAgICAgICAgICAgICAgICBjb29yZGluYXRlcy5nZXQoaSkueSwKKyAgICAgICAgICAgICAgICAgICAgY29vcmRpbmF0ZXMuZ2V0KGkgKyAxKS54LAorICAgICAgICAgICAgICAgICAgICBjb29yZGluYXRlcy5nZXQoaSArIDEpLnksCisgICAgICAgICAgICAgICAgICAgIG1vdmVFdmVudENvdW50LAorICAgICAgICAgICAgICAgICAgICBkcmFnRHVyYXRpb25NcywKKyAgICAgICAgICAgICAgICAgICAgbnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBpbmplY3RVcEV2ZW50KHVpQXV0b21hdGlvbiwKKyAgICAgICAgICAgICAgICBkb3duVGltZSwKKyAgICAgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzLmdldChjb29yZGluYXRlc1NpemUgLSAxKS54LAorICAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzLmdldChjb29yZGluYXRlc1NpemUgLSAxKS55LAorICAgICAgICAgICAgICAgIG51bGwpOworCisgICAgICAgIC8vIFdhaXQgZm9yIHRoZSBzeXN0ZW0gdG8gcHJvY2VzcyBhbGwgZXZlbnRzIGluIHRoZSBxdWV1ZQorICAgICAgICBpbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBpbmplY3REb3duRXZlbnQoVWlBdXRvbWF0aW9uIHVpQXV0b21hdGlvbiwgbG9uZyBkb3duVGltZSwgaW50IHhPblNjcmVlbiwKKyAgICAgICAgICAgIGludCB5T25TY3JlZW4sIEV2ZW50SW5qZWN0aW9uTGlzdGVuZXIgZXZlbnRJbmplY3Rpb25MaXN0ZW5lcikgeworICAgICAgICBNb3Rpb25FdmVudCBldmVudERvd24gPSBNb3Rpb25FdmVudC5vYnRhaW4oCisgICAgICAgICAgICAgICAgZG93blRpbWUsIGRvd25UaW1lLCBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTiwgeE9uU2NyZWVuLCB5T25TY3JlZW4sIDEpOworICAgICAgICBldmVudERvd24uc2V0U291cmNlKElucHV0RGV2aWNlLlNPVVJDRV9UT1VDSFNDUkVFTik7CisgICAgICAgIHVpQXV0b21hdGlvbi5pbmplY3RJbnB1dEV2ZW50KGV2ZW50RG93biwgdHJ1ZSk7CisgICAgICAgIGlmIChldmVudEluamVjdGlvbkxpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGV2ZW50SW5qZWN0aW9uTGlzdGVuZXIub25Eb3duSW5qZWN0ZWQoeE9uU2NyZWVuLCB5T25TY3JlZW4pOworICAgICAgICB9CisgICAgICAgIGV2ZW50RG93bi5yZWN5Y2xlKCk7CisgICAgICAgIHJldHVybiBkb3duVGltZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGluamVjdE1vdmVFdmVudEZvclRhcChVaUF1dG9tYXRpb24gdWlBdXRvbWF0aW9uLCBsb25nIGRvd25UaW1lLAorICAgICAgICAgICAgaW50IHRvdWNoU2xvcCwgaW50IHhPblNjcmVlbiwgaW50IHlPblNjcmVlbikgeworICAgICAgICBNb3Rpb25FdmVudCBldmVudE1vdmUgPSBNb3Rpb25FdmVudC5vYnRhaW4oZG93blRpbWUsIGRvd25UaW1lLCBNb3Rpb25FdmVudC5BQ1RJT05fTU9WRSwKKyAgICAgICAgICAgICAgICB4T25TY3JlZW4gKyAodG91Y2hTbG9wIC8gMi4wZiksIHlPblNjcmVlbiArICh0b3VjaFNsb3AgLyAyLjBmKSwgMSk7CisgICAgICAgIGV2ZW50TW92ZS5zZXRTb3VyY2UoSW5wdXREZXZpY2UuU09VUkNFX1RPVUNIU0NSRUVOKTsKKyAgICAgICAgdWlBdXRvbWF0aW9uLmluamVjdElucHV0RXZlbnQoZXZlbnRNb3ZlLCB0cnVlKTsKKyAgICAgICAgZXZlbnRNb3ZlLnJlY3ljbGUoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGluamVjdE1vdmVFdmVudHNGb3JEcmFnKFVpQXV0b21hdGlvbiB1aUF1dG9tYXRpb24sIGxvbmcgZG93blRpbWUsCisgICAgICAgICAgICBib29sZWFuIHVzZUN1cnJlbnRFdmVudFRpbWUsIGludCBkcmFnU3RhcnRYLCBpbnQgZHJhZ1N0YXJ0WSwgaW50IGRyYWdFbmRYLCBpbnQgZHJhZ0VuZFksCisgICAgICAgICAgICBpbnQgbW92ZUV2ZW50Q291bnQsIGludCBkcmFnRHVyYXRpb25NcywgRXZlbnRJbmplY3Rpb25MaXN0ZW5lciBldmVudEluamVjdGlvbkxpc3RlbmVyKSB7CisgICAgICAgIGZpbmFsIGludCBkcmFnQW1vdW50WCA9IGRyYWdFbmRYIC0gZHJhZ1N0YXJ0WDsKKyAgICAgICAgZmluYWwgaW50IGRyYWdBbW91bnRZID0gZHJhZ0VuZFkgLSBkcmFnU3RhcnRZOworICAgICAgICBmaW5hbCBpbnQgc2xlZXBUaW1lID0gZHJhZ0R1cmF0aW9uTXMgLyBtb3ZlRXZlbnRDb3VudDsKKworICAgICAgICAvLyBzbGVlcCBmb3IgYSBiaXQgdG8gZW11bGF0ZSB0aGUgb3ZlcmFsbCBkcmFnIGdlc3R1cmUuCisgICAgICAgIGxvbmcgcHJldkV2ZW50VGltZSA9IGRvd25UaW1lOworICAgICAgICBTeXN0ZW1DbG9jay5zbGVlcChzbGVlcFRpbWUpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1vdmVFdmVudENvdW50OyBpKyspIHsKKyAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgZmlyc3QgTU9WRSBldmVudCBpcyBnZW5lcmF0ZWQgImF3YXkiIGZyb20gdGhlIGNvb3JkaW5hdGVzCisgICAgICAgICAgICAvLyBvZiB0aGUgc3RhcnQgLyBET1dOIGV2ZW50LCBhbmQgdGhlIGxhc3QgTU9WRSBldmVudCBpcyBnZW5lcmF0ZWQKKyAgICAgICAgICAgIC8vIGF0IHRoZSBzYW1lIGNvb3JkaW5hdGVzIGFzIHRoZSBzdWJzZXF1ZW50IFVQIGV2ZW50LgorICAgICAgICAgICAgZmluYWwgaW50IG1vdmVYID0gZHJhZ1N0YXJ0WCArIGRyYWdBbW91bnRYICogKGkgICsgMSkgLyBtb3ZlRXZlbnRDb3VudDsKKyAgICAgICAgICAgIGZpbmFsIGludCBtb3ZlWSA9IGRyYWdTdGFydFkgKyBkcmFnQW1vdW50WSAqIChpICArIDEpIC8gbW92ZUV2ZW50Q291bnQ7CisgICAgICAgICAgICBsb25nIGV2ZW50VGltZSA9IHVzZUN1cnJlbnRFdmVudFRpbWUgPyBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSA6IGRvd25UaW1lOworCisgICAgICAgICAgICAvLyBJZiBuZWNlc3NhcnksIGdlbmVyYXRlIGhpc3RvcnkgZm9yIG91ciBuZXh0IE1PVkUgZXZlbnQuIFRoZSBoaXN0b3J5IGlzIGdlbmVyYXRlZAorICAgICAgICAgICAgLy8gdG8gYmUgc3BhY2VkIGF0IDEwIG1pbGxpc2Vjb25kIGludGVydmFscywgaW50ZXJwb2xhdGluZyB0aGUgY29vcmRpbmF0ZXMgZnJvbSB0aGUKKyAgICAgICAgICAgIC8vIGxhc3QgZ2VuZXJhdGVkIE1PVkUgZXZlbnQgdG8gb3VyIGN1cnJlbnQgb25lLgorICAgICAgICAgICAgaW50IGhpc3RvcnlFdmVudENvdW50ID0gKGludCkgKChldmVudFRpbWUgLSBwcmV2RXZlbnRUaW1lKSAvIDEwKTsKKyAgICAgICAgICAgIGludFtdIHhDb29yZHNGb3JMaXN0ZW5lciA9IChldmVudEluamVjdGlvbkxpc3RlbmVyID09IG51bGwpID8gbnVsbCA6CisgICAgICAgICAgICAgICAgICAgIG5ldyBpbnRbTWF0aC5tYXgoMSwgaGlzdG9yeUV2ZW50Q291bnQpXTsKKyAgICAgICAgICAgIGludFtdIHlDb29yZHNGb3JMaXN0ZW5lciA9IChldmVudEluamVjdGlvbkxpc3RlbmVyID09IG51bGwpID8gbnVsbCA6CisgICAgICAgICAgICAgICAgICAgIG5ldyBpbnRbTWF0aC5tYXgoMSwgaGlzdG9yeUV2ZW50Q291bnQpXTsKKyAgICAgICAgICAgIE1vdGlvbkV2ZW50IGV2ZW50TW92ZSA9IG51bGw7CisgICAgICAgICAgICBpZiAoaGlzdG9yeUV2ZW50Q291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgIGV2ZW50TW92ZSA9IE1vdGlvbkV2ZW50Lm9idGFpbigKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvd25UaW1lLCBldmVudFRpbWUsIE1vdGlvbkV2ZW50LkFDVElPTl9NT1ZFLCBtb3ZlWCwgbW92ZVksIDEpOworICAgICAgICAgICAgICAgIGlmIChldmVudEluamVjdGlvbkxpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgeENvb3Jkc0Zvckxpc3RlbmVyWzBdID0gbW92ZVg7CisgICAgICAgICAgICAgICAgICAgIHlDb29yZHNGb3JMaXN0ZW5lclswXSA9IG1vdmVZOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHByZXZNb3ZlWCA9IGRyYWdTdGFydFggKyBkcmFnQW1vdW50WCAqIGkgLyBtb3ZlRXZlbnRDb3VudDsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcHJldk1vdmVZID0gZHJhZ1N0YXJ0WSArIGRyYWdBbW91bnRZICogaSAvIG1vdmVFdmVudENvdW50OworICAgICAgICAgICAgICAgIGZpbmFsIGludCBkZWx0YU1vdmVYID0gbW92ZVggLSBwcmV2TW92ZVg7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGRlbHRhTW92ZVkgPSBtb3ZlWSAtIHByZXZNb3ZlWTsKKyAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGRlbHRhVGltZSA9IChldmVudFRpbWUgLSBwcmV2RXZlbnRUaW1lKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBoaXN0b3J5SW5kZXggPSAwOyBoaXN0b3J5SW5kZXggPCBoaXN0b3J5RXZlbnRDb3VudDsgaGlzdG9yeUluZGV4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHN0ZXBNb3ZlWCA9IHByZXZNb3ZlWCArIGRlbHRhTW92ZVggKiAoaGlzdG9yeUluZGV4ICsgMSkgLyBoaXN0b3J5RXZlbnRDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgaW50IHN0ZXBNb3ZlWSA9IHByZXZNb3ZlWSArIGRlbHRhTW92ZVkgKiAoaGlzdG9yeUluZGV4ICsgMSkgLyBoaXN0b3J5RXZlbnRDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgbG9uZyBzdGVwRXZlbnRUaW1lID0gdXNlQ3VycmVudEV2ZW50VGltZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcHJldkV2ZW50VGltZSArIGRlbHRhVGltZSAqIChoaXN0b3J5SW5kZXggKyAxKSAvIGhpc3RvcnlFdmVudENvdW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkb3duVGltZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhpc3RvcnlJbmRleCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZW5lcmF0ZSB0aGUgZmlyc3QgZXZlbnQgaW4gb3VyIHNlcXVlbmNlCisgICAgICAgICAgICAgICAgICAgICAgICBldmVudE1vdmUgPSBNb3Rpb25FdmVudC5vYnRhaW4oZG93blRpbWUsIHN0ZXBFdmVudFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdGlvbkV2ZW50LkFDVElPTl9NT1ZFLCBzdGVwTW92ZVgsIHN0ZXBNb3ZlWSwgMSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgdGhlbiBhZGQgdG8gaXQKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TW92ZS5hZGRCYXRjaChzdGVwRXZlbnRUaW1lLCBzdGVwTW92ZVgsIHN0ZXBNb3ZlWSwgMS4wZiwgMS4wZiwgMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50SW5qZWN0aW9uTGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgeENvb3Jkc0Zvckxpc3RlbmVyW2hpc3RvcnlJbmRleF0gPSBzdGVwTW92ZVg7CisgICAgICAgICAgICAgICAgICAgICAgICB5Q29vcmRzRm9yTGlzdGVuZXJbaGlzdG9yeUluZGV4XSA9IHN0ZXBNb3ZlWTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZXZlbnRNb3ZlLnNldFNvdXJjZShJbnB1dERldmljZS5TT1VSQ0VfVE9VQ0hTQ1JFRU4pOworICAgICAgICAgICAgdWlBdXRvbWF0aW9uLmluamVjdElucHV0RXZlbnQoZXZlbnRNb3ZlLCB0cnVlKTsKKyAgICAgICAgICAgIGlmIChldmVudEluamVjdGlvbkxpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBldmVudEluamVjdGlvbkxpc3RlbmVyLm9uTW92ZUluamVjdGVkKHhDb29yZHNGb3JMaXN0ZW5lciwgeUNvb3Jkc0Zvckxpc3RlbmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGV2ZW50TW92ZS5yZWN5Y2xlKCk7CisgICAgICAgICAgICBwcmV2RXZlbnRUaW1lID0gZXZlbnRUaW1lOworCisgICAgICAgICAgICAvLyBzbGVlcCBmb3IgYSBiaXQgdG8gZW11bGF0ZSB0aGUgb3ZlcmFsbCBkcmFnIGdlc3R1cmUuCisgICAgICAgICAgICBTeXN0ZW1DbG9jay5zbGVlcChzbGVlcFRpbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbmplY3RVcEV2ZW50KFVpQXV0b21hdGlvbiB1aUF1dG9tYXRpb24sIGxvbmcgZG93blRpbWUsCisgICAgICAgICAgICBib29sZWFuIHVzZUN1cnJlbnRFdmVudFRpbWUsIGludCB4T25TY3JlZW4sIGludCB5T25TY3JlZW4sCisgICAgICAgICAgICBFdmVudEluamVjdGlvbkxpc3RlbmVyIGV2ZW50SW5qZWN0aW9uTGlzdGVuZXIpIHsKKyAgICAgICAgbG9uZyBldmVudFRpbWUgPSB1c2VDdXJyZW50RXZlbnRUaW1lID8gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkgOiBkb3duVGltZTsKKyAgICAgICAgTW90aW9uRXZlbnQgZXZlbnRVcCA9IE1vdGlvbkV2ZW50Lm9idGFpbigKKyAgICAgICAgICAgICAgICBkb3duVGltZSwgZXZlbnRUaW1lLCBNb3Rpb25FdmVudC5BQ1RJT05fVVAsIHhPblNjcmVlbiwgeU9uU2NyZWVuLCAxKTsKKyAgICAgICAgZXZlbnRVcC5zZXRTb3VyY2UoSW5wdXREZXZpY2UuU09VUkNFX1RPVUNIU0NSRUVOKTsKKyAgICAgICAgdWlBdXRvbWF0aW9uLmluamVjdElucHV0RXZlbnQoZXZlbnRVcCwgdHJ1ZSk7CisgICAgICAgIGlmIChldmVudEluamVjdGlvbkxpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGV2ZW50SW5qZWN0aW9uTGlzdGVuZXIub25VcEluamVjdGVkKHhPblNjcmVlbiwgeU9uU2NyZWVuKTsKKyAgICAgICAgfQorICAgICAgICBldmVudFVwLnJlY3ljbGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbXVsYXRlcyBhIGZsaW5nIGdlc3R1cmUgYWNyb3NzIHRoZSBob3Jpem9udGFsIGNlbnRlciBvZiB0aGUgcGFzc2VkIHZpZXcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5zdHJ1bWVudGF0aW9uIHRoZSBpbnN0cnVtZW50YXRpb24gdXNlZCB0byBydW4gdGhlIHRlc3QKKyAgICAgKiBAcGFyYW0gdmlldyB0aGUgdmlldyB0byBmbGluZworICAgICAqIEBwYXJhbSBpc0Rvd253YXJkc0ZsaW5nR2VzdHVyZSBpZiA8Y29kZT50cnVlPC9jb2RlPiwgdGhlIGVtdWxhdGVkIGZsaW5nIHdpbGwKKyAgICAgKiAgICAgIGJlIGEgZG93bndhcmRzIGdlc3R1cmUKKyAgICAgKiBAcmV0dXJuIFRoZSB2ZXJ0aWNhbCBhbW91bnQgb2YgZW11bGF0ZWQgZmxpbmcgaW4gcGl4ZWxzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgZW11bGF0ZUZsaW5nR2VzdHVyZShJbnN0cnVtZW50YXRpb24gaW5zdHJ1bWVudGF0aW9uLAorICAgICAgICAgICAgVmlldyB2aWV3LCBib29sZWFuIGlzRG93bndhcmRzRmxpbmdHZXN0dXJlKSB7CisgICAgICAgIHJldHVybiBlbXVsYXRlRmxpbmdHZXN0dXJlKGluc3RydW1lbnRhdGlvbiwgdmlldywgaXNEb3dud2FyZHNGbGluZ0dlc3R1cmUsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVtdWxhdGVzIGEgZmxpbmcgZ2VzdHVyZSBhY3Jvc3MgdGhlIGhvcml6b250YWwgY2VudGVyIG9mIHRoZSBwYXNzZWQgdmlldy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnN0cnVtZW50YXRpb24gdGhlIGluc3RydW1lbnRhdGlvbiB1c2VkIHRvIHJ1biB0aGUgdGVzdAorICAgICAqIEBwYXJhbSB2aWV3IHRoZSB2aWV3IHRvIGZsaW5nCisgICAgICogQHBhcmFtIGlzRG93bndhcmRzRmxpbmdHZXN0dXJlIGlmIDxjb2RlPnRydWU8L2NvZGU+LCB0aGUgZW11bGF0ZWQgZmxpbmcgd2lsbAorICAgICAqICAgICAgYmUgYSBkb3dud2FyZHMgZ2VzdHVyZQorICAgICAqIEBwYXJhbSBldmVudEluamVjdGlvbkxpc3RlbmVyIG9wdGlvbmFsIGxpc3RlbmVyIHRvIG5vdGlmeSBhYm91dCB0aGUgaW5qZWN0ZWQgZXZlbnRzCisgICAgICogQHJldHVybiBUaGUgdmVydGljYWwgYW1vdW50IG9mIGVtdWxhdGVkIGZsaW5nIGluIHBpeGVscworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IGVtdWxhdGVGbGluZ0dlc3R1cmUoSW5zdHJ1bWVudGF0aW9uIGluc3RydW1lbnRhdGlvbiwKKyAgICAgICAgICAgIFZpZXcgdmlldywgYm9vbGVhbiBpc0Rvd253YXJkc0ZsaW5nR2VzdHVyZSwKKyAgICAgICAgICAgIEV2ZW50SW5qZWN0aW9uTGlzdGVuZXIgZXZlbnRJbmplY3Rpb25MaXN0ZW5lcikgeworICAgICAgICBmaW5hbCBWaWV3Q29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gVmlld0NvbmZpZ3VyYXRpb24uZ2V0KHZpZXcuZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgZmluYWwgaW50IGZsaW5nVmVsb2NpdHkgPSAoY29uZmlndXJhdGlvbi5nZXRTY2FsZWRNaW5pbXVtRmxpbmdWZWxvY2l0eSgpICsKKyAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLmdldFNjYWxlZE1heGltdW1GbGluZ1ZlbG9jaXR5KCkpIC8gMjsKKyAgICAgICAgLy8gR2V0IHZpZXcgY29vcmRpbmF0ZXMgb24gdGhlIHNjcmVlbgorICAgICAgICBmaW5hbCBpbnRbXSB2aWV3T25TY3JlZW5YWSA9IG5ldyBpbnRbMl07CisgICAgICAgIHZpZXcuZ2V0TG9jYXRpb25PblNjcmVlbih2aWV3T25TY3JlZW5YWSk7CisKKyAgICAgICAgLy8gT3VyIGZsaW5nIGdlc3R1cmUgd2lsbCBiZSBmcm9tIDI1JSBoZWlnaHQgb2YgdGhlIHZpZXcgdG8gNzUlIGhlaWdodCBvZiB0aGUgdmlldworICAgICAgICAvLyBmb3IgZG93bndhcmRzIGZsaW5nIGdlc3R1cmUsIGFuZCB0aGUgb3RoZXIgd2F5IGFyb3VuZCBmb3IgdXB3YXJkcyBmbGluZyBnZXN0dXJlCisgICAgICAgIGZpbmFsIGludCB2aWV3SGVpZ2h0ID0gdmlldy5nZXRIZWlnaHQoKTsKKyAgICAgICAgZmluYWwgaW50IHggPSB2aWV3T25TY3JlZW5YWVswXSArIHZpZXcuZ2V0V2lkdGgoKSAvIDI7CisgICAgICAgIGZpbmFsIGludCBzdGFydFkgPSBpc0Rvd253YXJkc0ZsaW5nR2VzdHVyZSA/IHZpZXdPblNjcmVlblhZWzFdICsgdmlld0hlaWdodCAvIDQKKyAgICAgICAgICAgICAgICA6IHZpZXdPblNjcmVlblhZWzFdICsgMyAqIHZpZXdIZWlnaHQgLyA0OworICAgICAgICBmaW5hbCBpbnQgYW1vdW50WSA9IGlzRG93bndhcmRzRmxpbmdHZXN0dXJlID8gdmlld0hlaWdodCAvIDIgOiAtdmlld0hlaWdodCAvIDI7CisKKyAgICAgICAgLy8gQ29tcHV0ZSBmbGluZyBnZXN0dXJlIGR1cmF0aW9uIGJhc2VkIG9uIHRoZSBkaXN0YW5jZSAoNTAlIGhlaWdodCBvZiB0aGUgdmlldykgYW5kCisgICAgICAgIC8vIGZsaW5nIHZlbG9jaXR5CisgICAgICAgIGZpbmFsIGludCBkdXJhdGlvbk1zID0gKDEwMDAgKiB2aWV3SGVpZ2h0KSAvICgyICogZmxpbmdWZWxvY2l0eSk7CisKKyAgICAgICAgLy8gQW5kIGRvIHRoZSBzYW1lIGV2ZW50IGluamVjdGlvbiBzZXF1ZW5jZSBhcyBvdXIgZ2VuZXJpYyBkcmFnIGdlc3R1cmUKKyAgICAgICAgZW11bGF0ZURyYWdHZXN0dXJlKGluc3RydW1lbnRhdGlvbiwgeCwgc3RhcnRZLCAwLCBhbW91bnRZLCBkdXJhdGlvbk1zLCBkdXJhdGlvbk1zIC8gMTYsCisgICAgICAgICAgICBldmVudEluamVjdGlvbkxpc3RlbmVyKTsKKworICAgICAgICByZXR1cm4gYW1vdW50WTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBWaWV3U3RhdGVTbmFwc2hvdCB7CisgICAgICAgIGZpbmFsIFZpZXcgbUZpcnN0OworICAgICAgICBmaW5hbCBWaWV3IG1MYXN0OworICAgICAgICBmaW5hbCBpbnQgbUZpcnN0VG9wOworICAgICAgICBmaW5hbCBpbnQgbUxhc3RCb3R0b207CisgICAgICAgIGZpbmFsIGludCBtQ2hpbGRDb3VudDsKKyAgICAgICAgcHJpdmF0ZSBWaWV3U3RhdGVTbmFwc2hvdChWaWV3R3JvdXAgdmlld0dyb3VwKSB7CisgICAgICAgICAgICBtQ2hpbGRDb3VudCA9IHZpZXdHcm91cC5nZXRDaGlsZENvdW50KCk7CisgICAgICAgICAgICBpZiAobUNoaWxkQ291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgIG1GaXJzdCA9IG1MYXN0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBtRmlyc3RUb3AgPSBtTGFzdEJvdHRvbSA9IEludGVnZXIuTUlOX1ZBTFVFOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtRmlyc3QgPSB2aWV3R3JvdXAuZ2V0Q2hpbGRBdCgwKTsKKyAgICAgICAgICAgICAgICBtTGFzdCA9IHZpZXdHcm91cC5nZXRDaGlsZEF0KG1DaGlsZENvdW50IC0gMSk7CisgICAgICAgICAgICAgICAgbUZpcnN0VG9wID0gbUZpcnN0LmdldFRvcCgpOworICAgICAgICAgICAgICAgIG1MYXN0Qm90dG9tID0gbUxhc3QuZ2V0Qm90dG9tKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgICAgICBpZiAodGhpcyA9PSBvKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobyA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gby5nZXRDbGFzcygpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBWaWV3U3RhdGVTbmFwc2hvdCB0aGF0ID0gKFZpZXdTdGF0ZVNuYXBzaG90KSBvOworICAgICAgICAgICAgcmV0dXJuIG1GaXJzdFRvcCA9PSB0aGF0Lm1GaXJzdFRvcCAmJgorICAgICAgICAgICAgICAgICAgICBtTGFzdEJvdHRvbSA9PSB0aGF0Lm1MYXN0Qm90dG9tICYmCisgICAgICAgICAgICAgICAgICAgIG1GaXJzdCA9PSB0aGF0Lm1GaXJzdCAmJgorICAgICAgICAgICAgICAgICAgICBtTGFzdCA9PSB0aGF0Lm1MYXN0ICYmCisgICAgICAgICAgICAgICAgICAgIG1DaGlsZENvdW50ID09IHRoYXQubUNoaWxkQ291bnQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIGludCByZXN1bHQgPSBtRmlyc3QgIT0gbnVsbCA/IG1GaXJzdC5oYXNoQ29kZSgpIDogMDsKKyAgICAgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgKG1MYXN0ICE9IG51bGwgPyBtTGFzdC5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIG1GaXJzdFRvcDsKKyAgICAgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgbUxhc3RCb3R0b207CisgICAgICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIG1DaGlsZENvdW50OworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEVtdWxhdGVzIGEgc2Nyb2xsIHRvIHRoZSBib3R0b20gb2YgdGhlIHNwZWNpZmllZCB7QGxpbmsgVmlld0dyb3VwfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnN0cnVtZW50YXRpb24gdGhlIGluc3RydW1lbnRhdGlvbiB1c2VkIHRvIHJ1biB0aGUgdGVzdAorICAgICAqIEBwYXJhbSB2aWV3R3JvdXAgVmlldyBncm91cAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBlbXVsYXRlU2Nyb2xsVG9Cb3R0b20oSW5zdHJ1bWVudGF0aW9uIGluc3RydW1lbnRhdGlvbiwgVmlld0dyb3VwIHZpZXdHcm91cCkgeworICAgICAgICBmaW5hbCBpbnRbXSB2aWV3R3JvdXBPblNjcmVlblhZID0gbmV3IGludFsyXTsKKyAgICAgICAgdmlld0dyb3VwLmdldExvY2F0aW9uT25TY3JlZW4odmlld0dyb3VwT25TY3JlZW5YWSk7CisKKyAgICAgICAgZmluYWwgaW50IGVtdWxhdGVkWCA9IHZpZXdHcm91cE9uU2NyZWVuWFlbMF0gKyB2aWV3R3JvdXAuZ2V0V2lkdGgoKSAvIDI7CisgICAgICAgIGZpbmFsIGludCBlbXVsYXRlZFN0YXJ0WSA9IHZpZXdHcm91cE9uU2NyZWVuWFlbMV0gKyAzICogdmlld0dyb3VwLmdldEhlaWdodCgpIC8gNDsKKyAgICAgICAgZmluYWwgaW50IHN3aXBlQW1vdW50ID0gdmlld0dyb3VwLmdldEhlaWdodCgpIC8gMjsKKworICAgICAgICBWaWV3U3RhdGVTbmFwc2hvdCBwcmV2OworICAgICAgICBWaWV3U3RhdGVTbmFwc2hvdCBuZXh0ID0gbmV3IFZpZXdTdGF0ZVNuYXBzaG90KHZpZXdHcm91cCk7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHByZXYgPSBuZXh0OworICAgICAgICAgICAgZW11bGF0ZURyYWdHZXN0dXJlKGluc3RydW1lbnRhdGlvbiwgZW11bGF0ZWRYLCBlbXVsYXRlZFN0YXJ0WSwgMCwgLXN3aXBlQW1vdW50LAorICAgICAgICAgICAgICAgICAgICAzMDAsIDEwKTsKKyAgICAgICAgICAgIG5leHQgPSBuZXcgVmlld1N0YXRlU25hcHNob3Qodmlld0dyb3VwKTsKKyAgICAgICAgfSB3aGlsZSAoIXByZXYuZXF1YWxzKG5leHQpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbXVsYXRlcyBhIGxvbmcgcHJlc3MgaW4gdGhlIGNlbnRlciBvZiB0aGUgcGFzc2VkIHtAbGluayBWaWV3fS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnN0cnVtZW50YXRpb24gdGhlIGluc3RydW1lbnRhdGlvbiB1c2VkIHRvIHJ1biB0aGUgdGVzdAorICAgICAqIEBwYXJhbSB2aWV3IHRoZSB2aWV3IHRvICJsb25nIHByZXNzIgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBlbXVsYXRlTG9uZ1ByZXNzT25WaWV3Q2VudGVyKEluc3RydW1lbnRhdGlvbiBpbnN0cnVtZW50YXRpb24sIFZpZXcgdmlldykgeworICAgICAgICBlbXVsYXRlTG9uZ1ByZXNzT25WaWV3Q2VudGVyKGluc3RydW1lbnRhdGlvbiwgdmlldywgMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW11bGF0ZXMgYSBsb25nIHByZXNzIGluIHRoZSBjZW50ZXIgb2YgdGhlIHBhc3NlZCB7QGxpbmsgVmlld30uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5zdHJ1bWVudGF0aW9uIHRoZSBpbnN0cnVtZW50YXRpb24gdXNlZCB0byBydW4gdGhlIHRlc3QKKyAgICAgKiBAcGFyYW0gdmlldyB0aGUgdmlldyB0byAibG9uZyBwcmVzcyIKKyAgICAgKiBAcGFyYW0gZXh0cmFXYWl0TXMgdGhlIGR1cmF0aW9uIG9mIGVtdWxhdGVkICJsb25nIHByZXNzIiBpbiBtaWxsaXNlY29uZHMgc3RhcnRpbmcKKyAgICAgKiAgICAgIGFmdGVyIHN5c3RlbS1sZXZlbCBsb25nIHByZXNzIHRpbWVvdXQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGVtdWxhdGVMb25nUHJlc3NPblZpZXdDZW50ZXIoSW5zdHJ1bWVudGF0aW9uIGluc3RydW1lbnRhdGlvbiwgVmlldyB2aWV3LAorICAgICAgICAgICAgbG9uZyBleHRyYVdhaXRNcykgeworICAgICAgICBmaW5hbCBpbnQgdG91Y2hTbG9wID0gVmlld0NvbmZpZ3VyYXRpb24uZ2V0KHZpZXcuZ2V0Q29udGV4dCgpKS5nZXRTY2FsZWRUb3VjaFNsb3AoKTsKKyAgICAgICAgLy8gVXNlIGluc3RydW1lbnRhdGlvbiB0byBlbXVsYXRlIGEgdGFwIG9uIHRoZSBzcGlubmVyIHRvIGJyaW5nIGRvd24gaXRzIHBvcHVwCisgICAgICAgIGZpbmFsIGludFtdIHZpZXdPblNjcmVlblhZID0gbmV3IGludFsyXTsKKyAgICAgICAgdmlldy5nZXRMb2NhdGlvbk9uU2NyZWVuKHZpZXdPblNjcmVlblhZKTsKKyAgICAgICAgaW50IHhPblNjcmVlbiA9IHZpZXdPblNjcmVlblhZWzBdICsgdmlldy5nZXRXaWR0aCgpIC8gMjsKKyAgICAgICAgaW50IHlPblNjcmVlbiA9IHZpZXdPblNjcmVlblhZWzFdICsgdmlldy5nZXRIZWlnaHQoKSAvIDI7CisKKyAgICAgICAgZW11bGF0ZUxvbmdQcmVzc09uU2NyZWVuKAorICAgICAgICAgICAgICAgIGluc3RydW1lbnRhdGlvbiwgeE9uU2NyZWVuLCB5T25TY3JlZW4sIHRvdWNoU2xvcCwgZXh0cmFXYWl0TXMsIHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVtdWxhdGVzIGEgbG9uZyBwcmVzcyBjb25maXJtZWQgb24gYSBwb2ludCByZWxhdGl2ZSB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBwYXNzZWQKKyAgICAgKiB7QGxpbmsgVmlld30uIE9mZnNldCBwYXJhbWV0ZXJzIGFyZSB1c2VkIHRvIGNvbXB1dGUgdGhlIGZpbmFsIHNjcmVlbiBjb29yZGluYXRlcyBvZiB0aGUKKyAgICAgKiBwcmVzcyBwb2ludC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnN0cnVtZW50YXRpb24gdGhlIGluc3RydW1lbnRhdGlvbiB1c2VkIHRvIHJ1biB0aGUgdGVzdAorICAgICAqIEBwYXJhbSB2aWV3IHRoZSB2aWV3IHRvICJsb25nIHByZXNzIgorICAgICAqIEBwYXJhbSBvZmZzZXRYIGV4dHJhIFggb2Zmc2V0IGZvciB0aGUgdGFwCisgICAgICogQHBhcmFtIG9mZnNldFkgZXh0cmEgWSBvZmZzZXQgZm9yIHRoZSB0YXAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZW11bGF0ZUxvbmdQcmVzc09uVmlldyhJbnN0cnVtZW50YXRpb24gaW5zdHJ1bWVudGF0aW9uLCBWaWV3IHZpZXcsCisgICAgICAgICAgICBpbnQgb2Zmc2V0WCwgaW50IG9mZnNldFkpIHsKKyAgICAgICAgZmluYWwgaW50IHRvdWNoU2xvcCA9IFZpZXdDb25maWd1cmF0aW9uLmdldCh2aWV3LmdldENvbnRleHQoKSkuZ2V0U2NhbGVkVG91Y2hTbG9wKCk7CisgICAgICAgIGZpbmFsIGludFtdIHZpZXdPblNjcmVlblhZID0gbmV3IGludFsyXTsKKyAgICAgICAgdmlldy5nZXRMb2NhdGlvbk9uU2NyZWVuKHZpZXdPblNjcmVlblhZKTsKKyAgICAgICAgaW50IHhPblNjcmVlbiA9IHZpZXdPblNjcmVlblhZWzBdICsgb2Zmc2V0WDsKKyAgICAgICAgaW50IHlPblNjcmVlbiA9IHZpZXdPblNjcmVlblhZWzFdICsgb2Zmc2V0WTsKKworICAgICAgICBlbXVsYXRlTG9uZ1ByZXNzT25TY3JlZW4oaW5zdHJ1bWVudGF0aW9uLCB4T25TY3JlZW4sIHlPblNjcmVlbiwgdG91Y2hTbG9wLCAwLCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbXVsYXRlcyBhIGxvbmcgcHJlc3MgdGhlbiBhIGxpbmVhciBkcmFnIGdlc3R1cmUgYmV0d2VlbiAyIHBvaW50cyBhY3Jvc3MgdGhlIHNjcmVlbi4KKyAgICAgKiBUaGlzIGlzIHVzZWQgZm9yIGRyYWcgc2VsZWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGluc3RydW1lbnRhdGlvbiB0aGUgaW5zdHJ1bWVudGF0aW9uIHVzZWQgdG8gcnVuIHRoZSB0ZXN0CisgICAgICogQHBhcmFtIGRyYWdTdGFydFggU3RhcnQgWCBvZiB0aGUgZW11bGF0ZWQgZHJhZyBnZXN0dXJlCisgICAgICogQHBhcmFtIGRyYWdTdGFydFkgU3RhcnQgWSBvZiB0aGUgZW11bGF0ZWQgZHJhZyBnZXN0dXJlCisgICAgICogQHBhcmFtIGRyYWdBbW91bnRYIFggYW1vdW50IG9mIHRoZSBlbXVsYXRlZCBkcmFnIGdlc3R1cmUKKyAgICAgKiBAcGFyYW0gZHJhZ0Ftb3VudFkgWSBhbW91bnQgb2YgdGhlIGVtdWxhdGVkIGRyYWcgZ2VzdHVyZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBlbXVsYXRlTG9uZ1ByZXNzQW5kRHJhZ0dlc3R1cmUoSW5zdHJ1bWVudGF0aW9uIGluc3RydW1lbnRhdGlvbiwKKyAgICAgICAgICAgIGludCBkcmFnU3RhcnRYLCBpbnQgZHJhZ1N0YXJ0WSwgaW50IGRyYWdBbW91bnRYLCBpbnQgZHJhZ0Ftb3VudFkpIHsKKyAgICAgICAgZW11bGF0ZUxvbmdQcmVzc09uU2NyZWVuKGluc3RydW1lbnRhdGlvbiwgZHJhZ1N0YXJ0WCwgZHJhZ1N0YXJ0WSwKKyAgICAgICAgICAgICAgICAwIC8qIHRvdWNoU2xvcCAqLywgMCAvKiBleHRyYVdhaXRNcyAqLywgZmFsc2UgLyogdXBHZXN0dXJlICovKTsKKyAgICAgICAgZW11bGF0ZURyYWdHZXN0dXJlKGluc3RydW1lbnRhdGlvbiwgZHJhZ1N0YXJ0WCwgZHJhZ1N0YXJ0WSwgZHJhZ0Ftb3VudFgsIGRyYWdBbW91bnRZKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbXVsYXRlcyBhIGxvbmcgcHJlc3Mgb24gdGhlIHNjcmVlbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnN0cnVtZW50YXRpb24gdGhlIGluc3RydW1lbnRhdGlvbiB1c2VkIHRvIHJ1biB0aGUgdGVzdAorICAgICAqIEBwYXJhbSB4T25TY3JlZW4gWCBwb3NpdGlvbiBvbiBzY3JlZW4gZm9yIHRoZSAibG9uZyBwcmVzcyIKKyAgICAgKiBAcGFyYW0geU9uU2NyZWVuIFkgcG9zaXRpb24gb24gc2NyZWVuIGZvciB0aGUgImxvbmcgcHJlc3MiCisgICAgICogQHBhcmFtIGV4dHJhV2FpdE1zIGV4dHJhIGR1cmF0aW9uIG9mIGVtdWxhdGVkIGxvbmcgcHJlc3MgaW4gbWlsbGlzZWNvbmRzIGFkZGVkCisgICAgICogICAgICAgIGFmdGVyIHRoZSBzeXN0ZW0tbGV2ZWwgImxvbmcgcHJlc3MiIHRpbWVvdXQuCisgICAgICogQHBhcmFtIHVwR2VzdHVyZSB3aGV0aGVyIHRvIGluY2x1ZGUgYW4gdXAgZXZlbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBlbXVsYXRlTG9uZ1ByZXNzT25TY3JlZW4oSW5zdHJ1bWVudGF0aW9uIGluc3RydW1lbnRhdGlvbiwKKyAgICAgICAgICAgIGludCB4T25TY3JlZW4sIGludCB5T25TY3JlZW4sIGludCB0b3VjaFNsb3AsIGxvbmcgZXh0cmFXYWl0TXMsIGJvb2xlYW4gdXBHZXN0dXJlKSB7CisgICAgICAgIGZpbmFsIFVpQXV0b21hdGlvbiB1aUF1dG9tYXRpb24gPSBpbnN0cnVtZW50YXRpb24uZ2V0VWlBdXRvbWF0aW9uKCk7CisgICAgICAgIGZpbmFsIGxvbmcgZG93blRpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKworICAgICAgICBpbmplY3REb3duRXZlbnQodWlBdXRvbWF0aW9uLCBkb3duVGltZSwgeE9uU2NyZWVuLCB5T25TY3JlZW4sIG51bGwpOworICAgICAgICBpbmplY3RNb3ZlRXZlbnRGb3JUYXAodWlBdXRvbWF0aW9uLCBkb3duVGltZSwgdG91Y2hTbG9wLCB4T25TY3JlZW4sIHlPblNjcmVlbik7CisgICAgICAgIFN5c3RlbUNsb2NrLnNsZWVwKChsb25nKSAoVmlld0NvbmZpZ3VyYXRpb24uZ2V0TG9uZ1ByZXNzVGltZW91dCgpICogMS41ZikgKyBleHRyYVdhaXRNcyk7CisgICAgICAgIGlmICh1cEdlc3R1cmUpIHsKKyAgICAgICAgICAgIGluamVjdFVwRXZlbnQodWlBdXRvbWF0aW9uLCBkb3duVGltZSwgZmFsc2UsIHhPblNjcmVlbiwgeU9uU2NyZWVuLCBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFdhaXQgZm9yIHRoZSBzeXN0ZW0gdG8gcHJvY2VzcyBhbGwgZXZlbnRzIGluIHRoZSBxdWV1ZQorICAgICAgICBpbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0RldmljZUluZm9TdG9yZS5qYXZhIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0RldmljZUluZm9TdG9yZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NmFjMWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvRGV2aWNlSW5mb1N0b3JlLmphdmEKQEAgLTAsMCArMSwyNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsOworCitpbXBvcnQgYW5kcm9pZC51dGlsLkpzb25Xcml0ZXI7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBEZXZpY2VJbmZvU3RvcmUgZXh0ZW5kcyBJbmZvU3RvcmUgeworCisgICAgcHJvdGVjdGVkIEZpbGUgbUpzb25GaWxlOworICAgIHByb3RlY3RlZCBKc29uV3JpdGVyIG1Kc29uV3JpdGVyID0gbnVsbDsKKworICAgIHB1YmxpYyBEZXZpY2VJbmZvU3RvcmUoKSB7CisgICAgICAgIG1Kc29uRmlsZSA9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIERldmljZUluZm9TdG9yZShGaWxlIGZpbGUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtSnNvbkZpbGUgPSBmaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIE9wZW5zIHRoZSBmaWxlIGZvciBzdG9yYWdlIGFuZCBjcmVhdGVzIHRoZSB3cml0ZXIuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb3BlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0obUpzb25GaWxlKTsKKyAgICAgICAgbUpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dCwgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpOworICAgICAgICAvLyBUT0RPKGFnYXRoYW1hbik6IHJlbW92ZSB0byBtYWtlIGpzb24gb3V0cHV0IGxlc3MgcHJldHR5CisgICAgICAgIG1Kc29uV3JpdGVyLnNldEluZGVudCgiICAiKTsKKyAgICAgICAgbUpzb25Xcml0ZXIuYmVnaW5PYmplY3QoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhlIHdyaXRlci4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG1Kc29uV3JpdGVyLmVuZE9iamVjdCgpOworICAgICAgICBtSnNvbldyaXRlci5mbHVzaCgpOworICAgICAgICBtSnNvbldyaXRlci5jbG9zZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IGEgbmV3IGdyb3VwIG9mIHJlc3VsdC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzdGFydEdyb3VwKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgbUpzb25Xcml0ZXIuYmVnaW5PYmplY3QoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydCBhIG5ldyBncm91cCBvZiByZXN1bHQgd2l0aCBzcGVjaWZpZWQgbmFtZS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzdGFydEdyb3VwKFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBtSnNvbldyaXRlci5uYW1lKG5hbWUpOworICAgICAgICBtSnNvbldyaXRlci5iZWdpbk9iamVjdCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXBsZXRlIGFkZGluZyByZXN1bHQgdG8gdGhlIGxhc3Qgc3RhcnRlZCBncm91cC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBlbmRHcm91cCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG1Kc29uV3JpdGVyLmVuZE9iamVjdCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IGEgbmV3IGFycmF5IG9mIHJlc3VsdC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzdGFydEFycmF5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgbUpzb25Xcml0ZXIuYmVnaW5BcnJheSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IGEgbmV3IGFycmF5IG9mIHJlc3VsdCB3aXRoIHNwZWNpZmllZCBuYW1lLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHN0YXJ0QXJyYXkoU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNoZWNrTmFtZShuYW1lKTsKKyAgICAgICAgbUpzb25Xcml0ZXIubmFtZShuYW1lKTsKKyAgICAgICAgbUpzb25Xcml0ZXIuYmVnaW5BcnJheSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXBsZXRlIGFkZGluZyByZXN1bHQgdG8gdGhlIGxhc3Qgc3RhcnRlZCBhcnJheS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBlbmRBcnJheSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG1Kc29uV3JpdGVyLmVuZEFycmF5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIGludCB2YWx1ZSB0byB0aGUgSW5mb1N0b3JlCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYWRkUmVzdWx0KFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNoZWNrTmFtZShuYW1lKTsKKyAgICAgICAgbUpzb25Xcml0ZXIubmFtZShuYW1lKTsKKyAgICAgICAgbUpzb25Xcml0ZXIudmFsdWUodmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBsb25nIHZhbHVlIHRvIHRoZSBJbmZvU3RvcmUKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhZGRSZXN1bHQoU3RyaW5nIG5hbWUsIGxvbmcgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNoZWNrTmFtZShuYW1lKTsKKyAgICAgICAgbUpzb25Xcml0ZXIubmFtZShuYW1lKTsKKyAgICAgICAgbUpzb25Xcml0ZXIudmFsdWUodmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBmbG9hdCB2YWx1ZSB0byB0aGUgSW5mb1N0b3JlCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYWRkUmVzdWx0KFN0cmluZyBuYW1lLCBmbG9hdCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYWRkUmVzdWx0KG5hbWUsIChkb3VibGUpIHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgZG91YmxlIHZhbHVlIHRvIHRoZSBJbmZvU3RvcmUKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhZGRSZXN1bHQoU3RyaW5nIG5hbWUsIGRvdWJsZSB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY2hlY2tOYW1lKG5hbWUpOworICAgICAgICBpZiAoaXNEb3VibGVOYU5PckluZmluaXRlKHZhbHVlKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUpzb25Xcml0ZXIubmFtZShuYW1lKTsKKyAgICAgICAgICAgIG1Kc29uV3JpdGVyLnZhbHVlKHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBib29sZWFuIHZhbHVlIHRvIHRoZSBJbmZvU3RvcmUKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhZGRSZXN1bHQoU3RyaW5nIG5hbWUsIGJvb2xlYW4gdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNoZWNrTmFtZShuYW1lKTsKKyAgICAgICAgbUpzb25Xcml0ZXIubmFtZShuYW1lKTsKKyAgICAgICAgbUpzb25Xcml0ZXIudmFsdWUodmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBTdHJpbmcgdmFsdWUgdG8gdGhlIEluZm9TdG9yZQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFkZFJlc3VsdChTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBjaGVja05hbWUobmFtZSk7CisgICAgICAgIG1Kc29uV3JpdGVyLm5hbWUobmFtZSk7CisgICAgICAgIG1Kc29uV3JpdGVyLnZhbHVlKGNoZWNrU3RyaW5nKHZhbHVlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIGludCBhcnJheSB0byB0aGUgSW5mb1N0b3JlCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYWRkQXJyYXlSZXN1bHQoU3RyaW5nIG5hbWUsIGludFtdIGFycmF5KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBjaGVja05hbWUobmFtZSk7CisgICAgICAgIG1Kc29uV3JpdGVyLm5hbWUobmFtZSk7CisgICAgICAgIG1Kc29uV3JpdGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgZm9yIChpbnQgdmFsdWUgOiBjaGVja0FycmF5KGFycmF5KSkgeworICAgICAgICAgICAgbUpzb25Xcml0ZXIudmFsdWUodmFsdWUpOworICAgICAgICB9CisgICAgICAgIG1Kc29uV3JpdGVyLmVuZEFycmF5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIGxvbmcgYXJyYXkgdG8gdGhlIEluZm9TdG9yZQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFkZEFycmF5UmVzdWx0KFN0cmluZyBuYW1lLCBsb25nW10gYXJyYXkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNoZWNrTmFtZShuYW1lKTsKKyAgICAgICAgbUpzb25Xcml0ZXIubmFtZShuYW1lKTsKKyAgICAgICAgbUpzb25Xcml0ZXIuYmVnaW5BcnJheSgpOworICAgICAgICBmb3IgKGxvbmcgdmFsdWUgOiBjaGVja0FycmF5KGFycmF5KSkgeworICAgICAgICAgICAgbUpzb25Xcml0ZXIudmFsdWUodmFsdWUpOworICAgICAgICB9CisgICAgICAgIG1Kc29uV3JpdGVyLmVuZEFycmF5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIGZsb2F0IGFycmF5IHRvIHRoZSBJbmZvU3RvcmUKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhZGRBcnJheVJlc3VsdChTdHJpbmcgbmFtZSwgZmxvYXRbXSBhcnJheSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZG91YmxlW10gZG91YmxlQXJyYXkgPSBuZXcgZG91YmxlW2FycmF5Lmxlbmd0aF07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGRvdWJsZUFycmF5W2ldID0gYXJyYXlbaV07CisgICAgICAgIH0KKyAgICAgICAgYWRkQXJyYXlSZXN1bHQobmFtZSwgZG91YmxlQXJyYXkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBkb3VibGUgYXJyYXkgdG8gdGhlIEluZm9TdG9yZQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFkZEFycmF5UmVzdWx0KFN0cmluZyBuYW1lLCBkb3VibGVbXSBhcnJheSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY2hlY2tOYW1lKG5hbWUpOworICAgICAgICBtSnNvbldyaXRlci5uYW1lKG5hbWUpOworICAgICAgICBtSnNvbldyaXRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGZvciAoZG91YmxlIHZhbHVlIDogY2hlY2tBcnJheShhcnJheSkpIHsKKyAgICAgICAgICAgIGlmIChpc0RvdWJsZU5hTk9ySW5maW5pdGUodmFsdWUpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtSnNvbldyaXRlci52YWx1ZSh2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgbUpzb25Xcml0ZXIuZW5kQXJyYXkoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgYm9vbGVhbiBhcnJheSB0byB0aGUgSW5mb1N0b3JlCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYWRkQXJyYXlSZXN1bHQoU3RyaW5nIG5hbWUsIGJvb2xlYW5bXSBhcnJheSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY2hlY2tOYW1lKG5hbWUpOworICAgICAgICBtSnNvbldyaXRlci5uYW1lKG5hbWUpOworICAgICAgICBtSnNvbldyaXRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGZvciAoYm9vbGVhbiB2YWx1ZSA6IGNoZWNrQXJyYXkoYXJyYXkpKSB7CisgICAgICAgICAgICBtSnNvbldyaXRlci52YWx1ZSh2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgbUpzb25Xcml0ZXIuZW5kQXJyYXkoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgTGlzdCBvZiBTdHJpbmcgdG8gdGhlIEluZm9TdG9yZQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFkZExpc3RSZXN1bHQoU3RyaW5nIG5hbWUsIExpc3Q8U3RyaW5nPiBsaXN0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBjaGVja05hbWUobmFtZSk7CisgICAgICAgIG1Kc29uV3JpdGVyLm5hbWUobmFtZSk7CisgICAgICAgIG1Kc29uV3JpdGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgZm9yIChTdHJpbmcgdmFsdWUgOiBjaGVja1N0cmluZ0xpc3QobGlzdCkpIHsKKyAgICAgICAgICAgIG1Kc29uV3JpdGVyLnZhbHVlKGNoZWNrU3RyaW5nKHZhbHVlKSk7CisgICAgICAgIH0KKyAgICAgICAgbUpzb25Xcml0ZXIuZW5kQXJyYXkoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvRGV2aWNlUmVwb3J0TG9nLmphdmEgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvRGV2aWNlUmVwb3J0TG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE3MDI2MwotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9EZXZpY2VSZXBvcnRMb2cuamF2YQpAQCAtMCwwICsxLDI4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBIYW5kbGVzIGFkZGluZyByZXN1bHRzIHRvIHRoZSByZXBvcnQgZm9yIGRldmljZSBzaWRlIHRlc3RzLgorICoKKyAqIE5PVEU6IHRlc3RzIE1VU1QgY2FsbCB7QGxpbmsgI3N1Ym1pdChJbnN0cnVtZW50YXRpb24pfSBpZiBhbmQgb25seSBpZiB0aGUgdGVzdCBwYXNzZXMgaW4gb3JkZXIgdG8KKyAqIHNlbmQgdGhlIHJlc3VsdHMgdG8gdGhlIHJ1bm5lci4KKyAqLworcHVibGljIGNsYXNzIERldmljZVJlcG9ydExvZyBleHRlbmRzIFJlcG9ydExvZyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IERldmljZVJlcG9ydExvZy5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVCA9ICJDT01QQVRJQklMSVRZX1RFU1RfUkVTVUxUIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5TVF9TVEFUVVNfRVJST1IgPSAtMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5TVF9TVEFUVVNfSU5fUFJPR1JFU1MgPSAyOworCisgICAgcHJpdmF0ZSBSZXBvcnRMb2dEZXZpY2VJbmZvU3RvcmUgc3RvcmU7CisKKyAgICBwdWJsaWMgRGV2aWNlUmVwb3J0TG9nKFN0cmluZyByZXBvcnRMb2dOYW1lLCBTdHJpbmcgc3RyZWFtTmFtZSkgeworICAgICAgICB0aGlzKHJlcG9ydExvZ05hbWUsIHN0cmVhbU5hbWUsCisgICAgICAgICAgICAgICAgbmV3IEZpbGUoRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlRGlyZWN0b3J5KCksICJyZXBvcnQtbG9nLWZpbGVzIikpOworICAgIH0KKworICAgIHB1YmxpYyBEZXZpY2VSZXBvcnRMb2coU3RyaW5nIHJlcG9ydExvZ05hbWUsIFN0cmluZyBzdHJlYW1OYW1lLCBGaWxlIGxvZ0RpcmVjdG9yeSkgeworICAgICAgICBzdXBlcihyZXBvcnRMb2dOYW1lLCBzdHJlYW1OYW1lKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIGRpciB2YWx1ZSBtdXN0IG1hdGNoIHRoZSBzcmMtZGlyIHZhbHVlIGNvbmZpZ3VyZWQgaW4gUmVwb3J0TG9nQ29sbGVjdG9yIHRhcmdldAorICAgICAgICAgICAgLy8gcHJlcGFyZXIgaW4gY3RzL2hhcm5lc3MvdG9vbHMvY3RzLXRyYWRlZmVkL3Jlcy9jb25maWcvY3RzLXByZWNvbmRpdGlvbnMueG1sCisgICAgICAgICAgICBpZiAoIUVudmlyb25tZW50LmdldEV4dGVybmFsU3RvcmFnZVN0YXRlKCkuZXF1YWxzKEVudmlyb25tZW50Lk1FRElBX01PVU5URUQpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJFeHRlcm5hbCBzdG9yYWdlIGlzIG5vdCBtb3VudGVkIik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCghbG9nRGlyZWN0b3J5LmV4aXN0cygpICYmICFsb2dEaXJlY3RvcnkubWtkaXJzKCkpCisgICAgICAgICAgICAgICAgICAgIHx8IChsb2dEaXJlY3RvcnkuZXhpc3RzKCkgJiYgIWxvZ0RpcmVjdG9yeS5pc0RpcmVjdG9yeSgpKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiQ2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgZm9yIGRldmljZSBpbmZvIGZpbGVzIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEZpbGUganNvbkZpbGUgPSBuZXcgRmlsZShsb2dEaXJlY3RvcnksIG1SZXBvcnRMb2dOYW1lICsgIi5yZXBvcnRsb2cuanNvbiIpOworICAgICAgICAgICAgICAgIHN0b3JlID0gbmV3IFJlcG9ydExvZ0RldmljZUluZm9TdG9yZShqc29uRmlsZSwgbVN0cmVhbU5hbWUpOworICAgICAgICAgICAgICAgIHN0b3JlLm9wZW4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkNvdWxkIG5vdCBjcmVhdGUgcmVwb3J0IGxvZyBmaWxlLiIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIGRvdWJsZSBtZXRyaWMgdG8gdGhlIHJlcG9ydC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhZGRWYWx1ZShTdHJpbmcgc291cmNlLCBTdHJpbmcgbWVzc2FnZSwgZG91YmxlIHZhbHVlLCBSZXN1bHRUeXBlIHR5cGUsCisgICAgICAgICAgICBSZXN1bHRVbml0IHVuaXQpIHsKKyAgICAgICAgc3VwZXIuYWRkVmFsdWUoc291cmNlLCBtZXNzYWdlLCB2YWx1ZSwgdHlwZSwgdW5pdCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdG9yZS5hZGRSZXN1bHQobWVzc2FnZSwgdmFsdWUpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ291bGQgbm90IGxvZyBtZXRyaWMuIiwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgZG91YmxlIG1ldHJpYyB0byB0aGUgcmVwb3J0LgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFkZFZhbHVlKFN0cmluZyBtZXNzYWdlLCBkb3VibGUgdmFsdWUsIFJlc3VsdFR5cGUgdHlwZSwgUmVzdWx0VW5pdCB1bml0KSB7CisgICAgICAgIHN1cGVyLmFkZFZhbHVlKG1lc3NhZ2UsIHZhbHVlLCB0eXBlLCB1bml0KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN0b3JlLmFkZFJlc3VsdChtZXNzYWdlLCB2YWx1ZSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJDb3VsZCBub3QgbG9nIG1ldHJpYy4iLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBkb3VibGUgYXJyYXkgb2YgbWV0cmljcyB0byB0aGUgcmVwb3J0LgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFkZFZhbHVlcyhTdHJpbmcgc291cmNlLCBTdHJpbmcgbWVzc2FnZSwgZG91YmxlW10gdmFsdWVzLCBSZXN1bHRUeXBlIHR5cGUsCisgICAgICAgICAgICBSZXN1bHRVbml0IHVuaXQpIHsKKyAgICAgICAgc3VwZXIuYWRkVmFsdWVzKHNvdXJjZSwgbWVzc2FnZSwgdmFsdWVzLCB0eXBlLCB1bml0KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN0b3JlLmFkZEFycmF5UmVzdWx0KG1lc3NhZ2UsIHZhbHVlcyk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJDb3VsZCBub3QgbG9nIG1ldHJpYy4iLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBkb3VibGUgYXJyYXkgb2YgbWV0cmljcyB0byB0aGUgcmVwb3J0LgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFkZFZhbHVlcyhTdHJpbmcgbWVzc2FnZSwgZG91YmxlW10gdmFsdWVzLCBSZXN1bHRUeXBlIHR5cGUsIFJlc3VsdFVuaXQgdW5pdCkgeworICAgICAgICBzdXBlci5hZGRWYWx1ZXMobWVzc2FnZSwgdmFsdWVzLCB0eXBlLCB1bml0KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN0b3JlLmFkZEFycmF5UmVzdWx0KG1lc3NhZ2UsIHZhbHVlcyk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJDb3VsZCBub3QgbG9nIG1ldHJpYy4iLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYW4gaW50IG1ldHJpYyB0byB0aGUgcmVwb3J0LgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFkZFZhbHVlKFN0cmluZyBtZXNzYWdlLCBpbnQgdmFsdWUsIFJlc3VsdFR5cGUgdHlwZSwgUmVzdWx0VW5pdCB1bml0KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdG9yZS5hZGRSZXN1bHQobWVzc2FnZSwgdmFsdWUpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ291bGQgbm90IGxvZyBtZXRyaWMuIiwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgbG9uZyBtZXRyaWMgdG8gdGhlIHJlcG9ydC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhZGRWYWx1ZShTdHJpbmcgbWVzc2FnZSwgbG9uZyB2YWx1ZSwgUmVzdWx0VHlwZSB0eXBlLCBSZXN1bHRVbml0IHVuaXQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN0b3JlLmFkZFJlc3VsdChtZXNzYWdlLCB2YWx1ZSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJDb3VsZCBub3QgbG9nIG1ldHJpYy4iLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBmbG9hdCBtZXRyaWMgdG8gdGhlIHJlcG9ydC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhZGRWYWx1ZShTdHJpbmcgbWVzc2FnZSwgZmxvYXQgdmFsdWUsIFJlc3VsdFR5cGUgdHlwZSwgUmVzdWx0VW5pdCB1bml0KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdG9yZS5hZGRSZXN1bHQobWVzc2FnZSwgdmFsdWUpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ291bGQgbm90IGxvZyBtZXRyaWMuIiwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgYm9vbGVhbiBtZXRyaWMgdG8gdGhlIHJlcG9ydC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhZGRWYWx1ZShTdHJpbmcgbWVzc2FnZSwgYm9vbGVhbiB2YWx1ZSwgUmVzdWx0VHlwZSB0eXBlLCBSZXN1bHRVbml0IHVuaXQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN0b3JlLmFkZFJlc3VsdChtZXNzYWdlLCB2YWx1ZSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJDb3VsZCBub3QgbG9nIG1ldHJpYy4iLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBTdHJpbmcgbWV0cmljIHRvIHRoZSByZXBvcnQuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYWRkVmFsdWUoU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyB2YWx1ZSwgUmVzdWx0VHlwZSB0eXBlLCBSZXN1bHRVbml0IHVuaXQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN0b3JlLmFkZFJlc3VsdChtZXNzYWdlLCB2YWx1ZSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJDb3VsZCBub3QgbG9nIG1ldHJpYy4iLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYW4gaW50IGFycmF5IG9mIG1ldHJpY3MgdG8gdGhlIHJlcG9ydC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhZGRWYWx1ZXMoU3RyaW5nIG1lc3NhZ2UsIGludFtdIHZhbHVlcywgUmVzdWx0VHlwZSB0eXBlLCBSZXN1bHRVbml0IHVuaXQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN0b3JlLmFkZEFycmF5UmVzdWx0KG1lc3NhZ2UsIHZhbHVlcyk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJDb3VsZCBub3QgbG9nIG1ldHJpYy4iLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBsb25nIGFycmF5IG9mIG1ldHJpY3MgdG8gdGhlIHJlcG9ydC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhZGRWYWx1ZXMoU3RyaW5nIG1lc3NhZ2UsIGxvbmdbXSB2YWx1ZXMsIFJlc3VsdFR5cGUgdHlwZSwgUmVzdWx0VW5pdCB1bml0KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdG9yZS5hZGRBcnJheVJlc3VsdChtZXNzYWdlLCB2YWx1ZXMpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ291bGQgbm90IGxvZyBtZXRyaWMuIiwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgZmxvYXQgYXJyYXkgb2YgbWV0cmljcyB0byB0aGUgcmVwb3J0LgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFkZFZhbHVlcyhTdHJpbmcgbWVzc2FnZSwgZmxvYXRbXSB2YWx1ZXMsIFJlc3VsdFR5cGUgdHlwZSwgUmVzdWx0VW5pdCB1bml0KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdG9yZS5hZGRBcnJheVJlc3VsdChtZXNzYWdlLCB2YWx1ZXMpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ291bGQgbm90IGxvZyBtZXRyaWMuIiwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgYm9vbGVhbiBhcnJheSBvZiBtZXRyaWNzIHRvIHRoZSByZXBvcnQuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYWRkVmFsdWVzKFN0cmluZyBtZXNzYWdlLCBib29sZWFuW10gdmFsdWVzLCBSZXN1bHRUeXBlIHR5cGUsIFJlc3VsdFVuaXQgdW5pdCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3RvcmUuYWRkQXJyYXlSZXN1bHQobWVzc2FnZSwgdmFsdWVzKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkNvdWxkIG5vdCBsb2cgbWV0cmljLiIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIFN0cmluZyBMaXN0IG9mIG1ldHJpY3MgdG8gdGhlIHJlcG9ydC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhZGRWYWx1ZXMoU3RyaW5nIG1lc3NhZ2UsIExpc3Q8U3RyaW5nPiB2YWx1ZXMsIFJlc3VsdFR5cGUgdHlwZSwgUmVzdWx0VW5pdCB1bml0KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdG9yZS5hZGRMaXN0UmVzdWx0KG1lc3NhZ2UsIHZhbHVlcyk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJDb3VsZCBub3QgbG9nIG1ldHJpYy4iLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHN1bW1hcnkgZG91YmxlIG1ldHJpYyBvZiB0aGUgcmVwb3J0LgorICAgICAqCisgICAgICogTk9URTogbWVzc2FnZXMgb3ZlciB7QHZhbHVlIE1ldHJpYyNNQVhfTUVTU0FHRV9MRU5HVEh9IGNoYXJzIHdpbGwgYmUgdHJpbW1lZC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRTdW1tYXJ5KFN0cmluZyBtZXNzYWdlLCBkb3VibGUgdmFsdWUsIFJlc3VsdFR5cGUgdHlwZSwgUmVzdWx0VW5pdCB1bml0KSB7CisgICAgICAgIHN1cGVyLnNldFN1bW1hcnkobWVzc2FnZSwgdmFsdWUsIHR5cGUsIHVuaXQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3RvcmUuYWRkUmVzdWx0KG1lc3NhZ2UsIHZhbHVlKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkNvdWxkIG5vdCBsb2cgbWV0cmljLiIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2VzIHJlcG9ydCBmaWxlIGFuZCBzdWJtaXRzIHJlcG9ydCB0byBpbnN0cnVtZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3VibWl0KEluc3RydW1lbnRhdGlvbiBpbnN0cnVtZW50YXRpb24pIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN0b3JlLmNsb3NlKCk7CisgICAgICAgICAgICBCdW5kbGUgb3V0cHV0ID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgb3V0cHV0LnB1dFN0cmluZyhSRVNVTFQsIHNlcmlhbGl6ZSh0aGlzKSk7CisgICAgICAgICAgICBpbnN0cnVtZW50YXRpb24uc2VuZFN0YXR1cyhJTlNUX1NUQVRVU19JTl9QUk9HUkVTUywgb3V0cHV0KTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIlJlcG9ydExvZyBTdWJtaXQgRmFpbGVkIiwgZSk7CisgICAgICAgICAgICBpbnN0cnVtZW50YXRpb24uc2VuZFN0YXR1cyhJTlNUX1NUQVRVU19FUlJPUiwgbnVsbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgcmVwb3J0IGZpbGUuIFN0YXRpYyBmdW5jdGlvbnMgdGhhdCBkbyBub3QgaGF2ZSBhY2Nlc3MgdG8gaW5zdHJ1bWVudGF0aW9uIGNhbgorICAgICAqIHVzZSB0aGlzIHRvIGNsb3NlIHJlcG9ydCBsb2dzLiBTdW1tYXJ5LCBpZiBwcmVzZW50LCBpcyBub3QgcmVwb3J0ZWQgdG8gaW5zdHJ1bWVudGF0aW9uLCBoZW5jZQorICAgICAqIGRvZXMgbm90IGFwcGVhciBpbiB0aGUgcmVzdWx0IFhNTC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdWJtaXQoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdG9yZS5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiUmVwb3J0TG9nIFN1Ym1pdCBGYWlsZWQiLCBlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9EdW1teUFjdGl2aXR5LmphdmEgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvRHVtbXlBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MjEwNmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvRHVtbXlBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworCitwdWJsaWMgY2xhc3MgRHVtbXlBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKworfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0R5bmFtaWNDb25maWdEZXZpY2VTaWRlLmphdmEgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvRHluYW1pY0NvbmZpZ0RldmljZVNpZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2VlNDk5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0R5bmFtaWNDb25maWdEZXZpY2VTaWRlLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKKworaW1wb3J0IGFuZHJvaWQub3MuRW52aXJvbm1lbnQ7CisKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogTG9hZCBkeW5hbWljIGNvbmZpZyBmb3IgZGV2aWNlIHNpZGUgdGVzdCBjYXNlcworICovCitwdWJsaWMgY2xhc3MgRHluYW1pY0NvbmZpZ0RldmljZVNpZGUgZXh0ZW5kcyBEeW5hbWljQ29uZmlnIHsKKyAgICBwdWJsaWMgRHluYW1pY0NvbmZpZ0RldmljZVNpZGUoU3RyaW5nIG1vZHVsZU5hbWUpIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMobW9kdWxlTmFtZSwgbmV3IEZpbGUoQ09ORklHX0ZPTERFUl9PTl9ERVZJQ0UpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRHluYW1pY0NvbmZpZ0RldmljZVNpZGUoU3RyaW5nIG1vZHVsZU5hbWUsIEZpbGUgY29uZmlnRm9sZGVyKQorICAgICAgICAgICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFFbnZpcm9ubWVudC5nZXRFeHRlcm5hbFN0b3JhZ2VTdGF0ZSgpLmVxdWFscyhFbnZpcm9ubWVudC5NRURJQV9NT1VOVEVEKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJFeHRlcm5hbCBzdG9yYWdlIGlzIG5vdCBtb3VudGVkIik7CisgICAgICAgIH0KKyAgICAgICAgRmlsZSBjb25maWdGaWxlID0gZ2V0Q29uZmlnRmlsZShjb25maWdGb2xkZXIsIG1vZHVsZU5hbWUpOworICAgICAgICBpbml0aWFsaXplQ29uZmlnKGNvbmZpZ0ZpbGUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9FdmFsdWF0ZUpzUmVzdWx0UG9sbGluZ0NoZWNrLmphdmEgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvRXZhbHVhdGVKc1Jlc3VsdFBvbGxpbmdDaGVjay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NjdlYzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvRXZhbHVhdGVKc1Jlc3VsdFBvbGxpbmdDaGVjay5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWw7CisKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5WYWx1ZUNhbGxiYWNrOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKKworcHVibGljIGNsYXNzIEV2YWx1YXRlSnNSZXN1bHRQb2xsaW5nQ2hlY2sgZXh0ZW5kcyBQb2xsaW5nQ2hlY2sKKyAgICAgICAgaW1wbGVtZW50cyBWYWx1ZUNhbGxiYWNrPFN0cmluZz4geworICAgIHByaXZhdGUgU3RyaW5nIG1BY3R1YWxSZXN1bHQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgbUV4cGVjdGVkUmVzdWx0OworICAgIHByaXZhdGUgYm9vbGVhbiBtR290UmVzdWx0OworCisgICAgcHVibGljIEV2YWx1YXRlSnNSZXN1bHRQb2xsaW5nQ2hlY2soU3RyaW5nIGV4cGVjdGVkKSB7CisgICAgICAgIG1FeHBlY3RlZFJlc3VsdCA9IGV4cGVjdGVkOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBjaGVjaygpIHsKKyAgICAgICAgcmV0dXJuIG1Hb3RSZXN1bHQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICBzdXBlci5ydW4oKTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG1FeHBlY3RlZFJlc3VsdCwgbUFjdHVhbFJlc3VsdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgb25SZWNlaXZlVmFsdWUoU3RyaW5nIHJlc3VsdCkgeworICAgICAgICBtR290UmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgbUFjdHVhbFJlc3VsdCA9IHJlc3VsdDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvRmFrZUtleXMuamF2YSBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9GYWtlS2V5cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZTA2ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvRmFrZUtleXMuamF2YQpAQCAtMCwwICsxLDQ2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWw7CisKKy8vIENvcGllZCBmcm9tIGN0cy90ZXN0cy90ZXN0cy9rZXlzdG9yZS9zcmMvYW5kcm9pZC9rZXlzdG9yZS9jdHMvQW5kcm9pZEtleVN0b3JlVGVzdC5qYXZhCisKK3B1YmxpYyBjbGFzcyBGYWtlS2V5cyB7CisgICAgLyoKKyAgICAgKiBUaGUga2V5cyBhbmQgY2VydGlmaWNhdGVzIGJlbG93IGFyZSBnZW5lcmF0ZWQgd2l0aDoKKyAgICAgKgorICAgICAqIG9wZW5zc2wgcmVxIC1uZXcgLXg1MDkgLWRheXMgMzY1MCAtZXh0ZW5zaW9ucyB2M19jYSAta2V5b3V0IGNha2V5LnBlbSAtb3V0IGNhY2VydC5wZW0KKyAgICAgKiBvcGVuc3NsIHJlcSAtbmV3a2V5IHJzYToxMDI0IC1rZXlvdXQgdXNlcmtleS5wZW0gLW5vZGVzIC1kYXlzIDM2NTAgLW91dCB1c2Vya2V5LnJlcQorICAgICAqIG1rZGlyIC1wIGRlbW9DQS9uZXdjZXJ0cworICAgICAqIHRvdWNoIGRlbW9DQS9pbmRleC50eHQKKyAgICAgKiBlY2hvICIwMSIgPiBkZW1vQ0Evc2VyaWFsCisgICAgICogb3BlbnNzbCBjYSAtb3V0IHVzZXJjZXJ0LnBlbSAtaW4gdXNlcmtleS5yZXEgLWNlcnQgY2FjZXJ0LnBlbSAta2V5ZmlsZSBjYWtleS5wZW0gLWRheXMgMzY1MAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRkFLRV9SU0FfMSB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBHZW5lcmF0ZWQgZnJvbSBhYm92ZSBhbmQgY29udmVydGVkIHdpdGg6CisgICAgICAgICAqCisgICAgICAgICAqIG9wZW5zc2wgcGtjczggLXRvcGs4IC1vdXRmb3JtIGQgLWluIHVzZXJrZXkucGVtIC1ub2NyeXB0IHwgeHhkIC1pIHwgc2VkICdzLzB4LyhieXRlKSAweC9nJworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gcHJpdmF0ZUtleSA9IHsKKyAgICAgICAgICAgIChieXRlKSAweDMwLCAoYnl0ZSkgMHg4MiwgKGJ5dGUpIDB4MDIsIChieXRlKSAweDc4LCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MDEsCisgICAgICAgICAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MzAsIChieXRlKSAweDBkLCAoYnl0ZSkgMHgwNiwgKGJ5dGUpIDB4MDksIChieXRlKSAweDJhLAorICAgICAgICAgICAgKGJ5dGUpIDB4ODYsIChieXRlKSAweDQ4LCAoYnl0ZSkgMHg4NiwgKGJ5dGUpIDB4ZjcsIChieXRlKSAweDBkLCAoYnl0ZSkgMHgwMSwKKyAgICAgICAgICAgIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4MDUsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwNCwgKGJ5dGUpIDB4ODIsCisgICAgICAgICAgICAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4NjIsIChieXRlKSAweDMwLCAoYnl0ZSkgMHg4MiwgKGJ5dGUpIDB4MDIsIChieXRlKSAweDVlLAorICAgICAgICAgICAgKGJ5dGUpIDB4MDIsIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDIsIChieXRlKSAweDgxLCAoYnl0ZSkgMHg4MSwKKyAgICAgICAgICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHhjZSwgKGJ5dGUpIDB4MjksIChieXRlKSAweGViLCAoYnl0ZSkgMHhmNiwgKGJ5dGUpIDB4NWIsCisgICAgICAgICAgICAoYnl0ZSkgMHgyNSwgKGJ5dGUpIDB4ZGMsIChieXRlKSAweGExLCAoYnl0ZSkgMHhhNiwgKGJ5dGUpIDB4MmMsIChieXRlKSAweDY2LAorICAgICAgICAgICAgKGJ5dGUpIDB4Y2IsIChieXRlKSAweDIwLCAoYnl0ZSkgMHg5MCwgKGJ5dGUpIDB4MjcsIChieXRlKSAweDg2LCAoYnl0ZSkgMHg4YSwKKyAgICAgICAgICAgIChieXRlKSAweDQ0LCAoYnl0ZSkgMHg3MSwgKGJ5dGUpIDB4NTAsIChieXRlKSAweGRhLCAoYnl0ZSkgMHhkMywgKGJ5dGUpIDB4MDIsCisgICAgICAgICAgICAoYnl0ZSkgMHg3NywgKGJ5dGUpIDB4NTUsIChieXRlKSAweGU5LCAoYnl0ZSkgMHhlOCwgKGJ5dGUpIDB4MDgsIChieXRlKSAweGYzLAorICAgICAgICAgICAgKGJ5dGUpIDB4MzYsIChieXRlKSAweDlhLCAoYnl0ZSkgMHhhZSwgKGJ5dGUpIDB4YWIsIChieXRlKSAweDA0LCAoYnl0ZSkgMHg2ZCwKKyAgICAgICAgICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHg5OSwgKGJ5dGUpIDB4YmYsIChieXRlKSAweDdkLCAoYnl0ZSkgMHgwZiwgKGJ5dGUpIDB4NjcsCisgICAgICAgICAgICAoYnl0ZSkgMHg4YiwgKGJ5dGUpIDB4MWQsIChieXRlKSAweGQ0LCAoYnl0ZSkgMHgyYiwgKGJ5dGUpIDB4N2MsIChieXRlKSAweGNiLAorICAgICAgICAgICAgKGJ5dGUpIDB4Y2QsIChieXRlKSAweDMzLCAoYnl0ZSkgMHhjNywgKGJ5dGUpIDB4ODQsIChieXRlKSAweDMwLCAoYnl0ZSkgMHhlMiwKKyAgICAgICAgICAgIChieXRlKSAweDQ1LCAoYnl0ZSkgMHgyMSwgKGJ5dGUpIDB4YjMsIChieXRlKSAweDc1LCAoYnl0ZSkgMHhmNSwgKGJ5dGUpIDB4NzksCisgICAgICAgICAgICAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4ZGEsIChieXRlKSAweDUwLCAoYnl0ZSkgMHhhMywgKGJ5dGUpIDB4OGIsIChieXRlKSAweGNlLAorICAgICAgICAgICAgKGJ5dGUpIDB4YzMsIChieXRlKSAweDhlLCAoYnl0ZSkgMHgwZiwgKGJ5dGUpIDB4MjUsIChieXRlKSAweGViLCAoYnl0ZSkgMHgwOCwKKyAgICAgICAgICAgIChieXRlKSAweDJjLCAoYnl0ZSkgMHhkZCwgKGJ5dGUpIDB4MWMsIChieXRlKSAweGNmLCAoYnl0ZSkgMHhmZiwgKGJ5dGUpIDB4M2IsCisgICAgICAgICAgICAoYnl0ZSkgMHhkZSwgKGJ5dGUpIDB4YjYsIChieXRlKSAweGFhLCAoYnl0ZSkgMHgyYSwgKGJ5dGUpIDB4YTksIChieXRlKSAweGM0LAorICAgICAgICAgICAgKGJ5dGUpIDB4OGEsIChieXRlKSAweDI0LCAoYnl0ZSkgMHgyNCwgKGJ5dGUpIDB4ZTYsIChieXRlKSAweDI5LCAoYnl0ZSkgMHgwZCwKKyAgICAgICAgICAgIChieXRlKSAweDk4LCAoYnl0ZSkgMHg0YywgKGJ5dGUpIDB4MzIsIChieXRlKSAweGExLCAoYnl0ZSkgMHg3YiwgKGJ5dGUpIDB4MjMsCisgICAgICAgICAgICAoYnl0ZSkgMHgyYiwgKGJ5dGUpIDB4NDIsIChieXRlKSAweDMwLCAoYnl0ZSkgMHhlZSwgKGJ5dGUpIDB4NzgsIChieXRlKSAweDA4LAorICAgICAgICAgICAgKGJ5dGUpIDB4NDcsIChieXRlKSAweGFkLCAoYnl0ZSkgMHhmMiwgKGJ5dGUpIDB4OTYsIChieXRlKSAweGQ1LCAoYnl0ZSkgMHhmMSwKKyAgICAgICAgICAgIChieXRlKSAweDYyLCAoYnl0ZSkgMHg0MiwgKGJ5dGUpIDB4MmQsIChieXRlKSAweDM1LCAoYnl0ZSkgMHgxOSwgKGJ5dGUpIDB4YjQsCisgICAgICAgICAgICAoYnl0ZSkgMHgzYywgKGJ5dGUpIDB4YzksIChieXRlKSAweGMzLCAoYnl0ZSkgMHg1ZiwgKGJ5dGUpIDB4MDMsIChieXRlKSAweDE2LAorICAgICAgICAgICAgKGJ5dGUpIDB4M2EsIChieXRlKSAweDIzLCAoYnl0ZSkgMHhhYywgKGJ5dGUpIDB4Y2IsIChieXRlKSAweGNlLCAoYnl0ZSkgMHg5ZSwKKyAgICAgICAgICAgIChieXRlKSAweDUxLCAoYnl0ZSkgMHgyZSwgKGJ5dGUpIDB4NmQsIChieXRlKSAweDAyLCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDEsCisgICAgICAgICAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDEsIChieXRlKSAweDAyLCAoYnl0ZSkgMHg4MSwgKGJ5dGUpIDB4ODAsIChieXRlKSAweDE2LAorICAgICAgICAgICAgKGJ5dGUpIDB4NTksIChieXRlKSAweGMzLCAoYnl0ZSkgMHgyNCwgKGJ5dGUpIDB4MWQsIChieXRlKSAweDMzLCAoYnl0ZSkgMHg5OCwKKyAgICAgICAgICAgIChieXRlKSAweDljLCAoYnl0ZSkgMHhjOSwgKGJ5dGUpIDB4YzgsIChieXRlKSAweDJjLCAoYnl0ZSkgMHg4OCwgKGJ5dGUpIDB4YmYsCisgICAgICAgICAgICAoYnl0ZSkgMHgwYSwgKGJ5dGUpIDB4MDEsIChieXRlKSAweGNlLCAoYnl0ZSkgMHhmYiwgKGJ5dGUpIDB4MzQsIChieXRlKSAweDdhLAorICAgICAgICAgICAgKGJ5dGUpIDB4NTgsIChieXRlKSAweDdhLCAoYnl0ZSkgMHhiMCwgKGJ5dGUpIDB4YmYsIChieXRlKSAweGE2LCAoYnl0ZSkgMHhiMiwKKyAgICAgICAgICAgIChieXRlKSAweDYwLCAoYnl0ZSkgMHhiZSwgKGJ5dGUpIDB4NzAsIChieXRlKSAweDIxLCAoYnl0ZSkgMHhmNSwgKGJ5dGUpIDB4ZmMsCisgICAgICAgICAgICAoYnl0ZSkgMHg4NSwgKGJ5dGUpIDB4MGQsIChieXRlKSAweDMzLCAoYnl0ZSkgMHg1OCwgKGJ5dGUpIDB4YTEsIChieXRlKSAweGU1LAorICAgICAgICAgICAgKGJ5dGUpIDB4MDksIChieXRlKSAweDM2LCAoYnl0ZSkgMHg4NCwgKGJ5dGUpIDB4YjIsIChieXRlKSAweDA0LCAoYnl0ZSkgMHgwYSwKKyAgICAgICAgICAgIChieXRlKSAweDAyLCAoYnl0ZSkgMHhkMywgKGJ5dGUpIDB4ODgsIChieXRlKSAweDFmLCAoYnl0ZSkgMHgwYywgKGJ5dGUpIDB4MmIsCisgICAgICAgICAgICAoYnl0ZSkgMHgxZCwgKGJ5dGUpIDB4ZTksIChieXRlKSAweDNkLCAoYnl0ZSkgMHhlNywgKGJ5dGUpIDB4NzksIChieXRlKSAweGY5LAorICAgICAgICAgICAgKGJ5dGUpIDB4MzIsIChieXRlKSAweDVjLCAoYnl0ZSkgMHg4YSwgKGJ5dGUpIDB4NzUsIChieXRlKSAweDQ5LCAoYnl0ZSkgMHgxMiwKKyAgICAgICAgICAgIChieXRlKSAweGU0LCAoYnl0ZSkgMHgwNSwgKGJ5dGUpIDB4MjYsIChieXRlKSAweGQ0LCAoYnl0ZSkgMHgyZSwgKGJ5dGUpIDB4OWUsCisgICAgICAgICAgICAoYnl0ZSkgMHgxZiwgKGJ5dGUpIDB4Y2MsIChieXRlKSAweDU0LCAoYnl0ZSkgMHhhZCwgKGJ5dGUpIDB4MzMsIChieXRlKSAweDhkLAorICAgICAgICAgICAgKGJ5dGUpIDB4OTksIChieXRlKSAweDAwLCAoYnl0ZSkgMHhkYywgKGJ5dGUpIDB4ZjUsIChieXRlKSAweGI0LCAoYnl0ZSkgMHhhMiwKKyAgICAgICAgICAgIChieXRlKSAweDJmLCAoYnl0ZSkgMHhiYSwgKGJ5dGUpIDB4ZTUsIChieXRlKSAweDYyLCAoYnl0ZSkgMHgzMCwgKGJ5dGUpIDB4NmQsCisgICAgICAgICAgICAoYnl0ZSkgMHhlNiwgKGJ5dGUpIDB4M2QsIChieXRlKSAweGViLCAoYnl0ZSkgMHgyNCwgKGJ5dGUpIDB4YzIsIChieXRlKSAweGRjLAorICAgICAgICAgICAgKGJ5dGUpIDB4NWYsIChieXRlKSAweGI3LCAoYnl0ZSkgMHgxNiwgKGJ5dGUpIDB4MzUsIChieXRlKSAweGEzLCAoYnl0ZSkgMHg5OCwKKyAgICAgICAgICAgIChieXRlKSAweDk4LCAoYnl0ZSkgMHhhOCwgKGJ5dGUpIDB4ZWYsIChieXRlKSAweGU4LCAoYnl0ZSkgMHhjNCwgKGJ5dGUpIDB4OTYsCisgICAgICAgICAgICAoYnl0ZSkgMHg2ZCwgKGJ5dGUpIDB4MzgsIChieXRlKSAweGFiLCAoYnl0ZSkgMHgyNiwgKGJ5dGUpIDB4NmQsIChieXRlKSAweDMwLAorICAgICAgICAgICAgKGJ5dGUpIDB4YzIsIChieXRlKSAweGEwLCAoYnl0ZSkgMHg0NCwgKGJ5dGUpIDB4ZTQsIChieXRlKSAweGZmLCAoYnl0ZSkgMHg3ZSwKKyAgICAgICAgICAgIChieXRlKSAweGJlLCAoYnl0ZSkgMHg3YywgKGJ5dGUpIDB4MzMsIChieXRlKSAweGE1LCAoYnl0ZSkgMHgxMCwgKGJ5dGUpIDB4YWQsCisgICAgICAgICAgICAoYnl0ZSkgMHhkNywgKGJ5dGUpIDB4MWUsIChieXRlKSAweDEzLCAoYnl0ZSkgMHgyMCwgKGJ5dGUpIDB4YjMsIChieXRlKSAweDFmLAorICAgICAgICAgICAgKGJ5dGUpIDB4NDEsIChieXRlKSAweDAyLCAoYnl0ZSkgMHg0MSwgKGJ5dGUpIDB4MDAsIChieXRlKSAweGYxLCAoYnl0ZSkgMHg4OSwKKyAgICAgICAgICAgIChieXRlKSAweDA3LCAoYnl0ZSkgMHgwZiwgKGJ5dGUpIDB4ZTgsIChieXRlKSAweGNmLCAoYnl0ZSkgMHhhYiwgKGJ5dGUpIDB4MTMsCisgICAgICAgICAgICAoYnl0ZSkgMHgyYSwgKGJ5dGUpIDB4OGYsIChieXRlKSAweDg4LCAoYnl0ZSkgMHg4MCwgKGJ5dGUpIDB4MTEsIChieXRlKSAweDlhLAorICAgICAgICAgICAgKGJ5dGUpIDB4NzksIChieXRlKSAweGI2LCAoYnl0ZSkgMHg1OSwgKGJ5dGUpIDB4M2EsIChieXRlKSAweDUwLCAoYnl0ZSkgMHg2ZSwKKyAgICAgICAgICAgIChieXRlKSAweDU3LCAoYnl0ZSkgMHgzNywgKGJ5dGUpIDB4YWIsIChieXRlKSAweDJhLCAoYnl0ZSkgMHhkMiwgKGJ5dGUpIDB4YWEsCisgICAgICAgICAgICAoYnl0ZSkgMHhkOSwgKGJ5dGUpIDB4NzIsIChieXRlKSAweDczLCAoYnl0ZSkgMHhmZiwgKGJ5dGUpIDB4OGIsIChieXRlKSAweDQ3LAorICAgICAgICAgICAgKGJ5dGUpIDB4NzYsIChieXRlKSAweGRkLCAoYnl0ZSkgMHhkYywgKGJ5dGUpIDB4ZjUsIChieXRlKSAweDk3LCAoYnl0ZSkgMHg0NCwKKyAgICAgICAgICAgIChieXRlKSAweDNhLCAoYnl0ZSkgMHg3OCwgKGJ5dGUpIDB4YmUsIChieXRlKSAweDE3LCAoYnl0ZSkgMHhiNCwgKGJ5dGUpIDB4MjIsCisgICAgICAgICAgICAoYnl0ZSkgMHg2ZiwgKGJ5dGUpIDB4ZTUsIChieXRlKSAweDIzLCAoYnl0ZSkgMHg3MCwgKGJ5dGUpIDB4MWQsIChieXRlKSAweDEwLAorICAgICAgICAgICAgKGJ5dGUpIDB4NWQsIChieXRlKSAweGJhLCAoYnl0ZSkgMHgxNiwgKGJ5dGUpIDB4ODEsIChieXRlKSAweGYxLCAoYnl0ZSkgMHg0NSwKKyAgICAgICAgICAgIChieXRlKSAweGNlLCAoYnl0ZSkgMHgzMCwgKGJ5dGUpIDB4YjQsIChieXRlKSAweGFiLCAoYnl0ZSkgMHg4MCwgKGJ5dGUpIDB4ZTQsCisgICAgICAgICAgICAoYnl0ZSkgMHg5OCwgKGJ5dGUpIDB4MzEsIChieXRlKSAweDAyLCAoYnl0ZSkgMHg0MSwgKGJ5dGUpIDB4MDAsIChieXRlKSAweGRhLAorICAgICAgICAgICAgKGJ5dGUpIDB4ODIsIChieXRlKSAweDlkLCAoYnl0ZSkgMHgzZiwgKGJ5dGUpIDB4Y2EsIChieXRlKSAweDJmLCAoYnl0ZSkgMHhlMSwKKyAgICAgICAgICAgIChieXRlKSAweGQ0LCAoYnl0ZSkgMHg4NiwgKGJ5dGUpIDB4NzcsIChieXRlKSAweDQ4LCAoYnl0ZSkgMHhhNiwgKGJ5dGUpIDB4YWIsCisgICAgICAgICAgICAoYnl0ZSkgMHhhYiwgKGJ5dGUpIDB4MWMsIChieXRlKSAweDQyLCAoYnl0ZSkgMHg1YywgKGJ5dGUpIDB4ZDUsIChieXRlKSAweGM3LAorICAgICAgICAgICAgKGJ5dGUpIDB4NDYsIChieXRlKSAweDU5LCAoYnl0ZSkgMHg5MSwgKGJ5dGUpIDB4M2YsIChieXRlKSAweGZjLCAoYnl0ZSkgMHhjYywKKyAgICAgICAgICAgIChieXRlKSAweGVjLCAoYnl0ZSkgMHhjMiwgKGJ5dGUpIDB4NDAsIChieXRlKSAweDEyLCAoYnl0ZSkgMHgyYywgKGJ5dGUpIDB4OGQsCisgICAgICAgICAgICAoYnl0ZSkgMHgxZiwgKGJ5dGUpIDB4YTIsIChieXRlKSAweDE4LCAoYnl0ZSkgMHg4OCwgKGJ5dGUpIDB4ZWUsIChieXRlKSAweDgyLAorICAgICAgICAgICAgKGJ5dGUpIDB4NGEsIChieXRlKSAweDVhLCAoYnl0ZSkgMHg1ZSwgKGJ5dGUpIDB4ODgsIChieXRlKSAweDIwLCAoYnl0ZSkgMHhlMywKKyAgICAgICAgICAgIChieXRlKSAweDdiLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZDgsIChieXRlKSAweDNhLCAoYnl0ZSkgMHg1MiwgKGJ5dGUpIDB4OWEsCisgICAgICAgICAgICAoYnl0ZSkgMHgyNiwgKGJ5dGUpIDB4NmEsIChieXRlKSAweDA0LCAoYnl0ZSkgMHhlYywgKGJ5dGUpIDB4ZTgsIChieXRlKSAweGI5LAorICAgICAgICAgICAgKGJ5dGUpIDB4NDgsIChieXRlKSAweDQwLCAoYnl0ZSkgMHhlMSwgKGJ5dGUpIDB4ZTEsIChieXRlKSAweDgzLCAoYnl0ZSkgMHhhNiwKKyAgICAgICAgICAgIChieXRlKSAweDY3LCAoYnl0ZSkgMHhhNiwgKGJ5dGUpIDB4ZmQsIChieXRlKSAweDAyLCAoYnl0ZSkgMHg0MSwgKGJ5dGUpIDB4MDAsCisgICAgICAgICAgICAoYnl0ZSkgMHg4OSwgKGJ5dGUpIDB4NzIsIChieXRlKSAweDNlLCAoYnl0ZSkgMHhiMCwgKGJ5dGUpIDB4OTAsIChieXRlKSAweGZkLAorICAgICAgICAgICAgKGJ5dGUpIDB4NGMsIChieXRlKSAweDBlLCAoYnl0ZSkgMHhkNiwgKGJ5dGUpIDB4MTMsIChieXRlKSAweDYzLCAoYnl0ZSkgMHhjYiwKKyAgICAgICAgICAgIChieXRlKSAweGVkLCAoYnl0ZSkgMHgzOCwgKGJ5dGUpIDB4ODgsIChieXRlKSAweGI2LCAoYnl0ZSkgMHg3OSwgKGJ5dGUpIDB4YzQsCisgICAgICAgICAgICAoYnl0ZSkgMHgzMywgKGJ5dGUpIDB4NmMsIChieXRlKSAweGY2LCAoYnl0ZSkgMHhmOCwgKGJ5dGUpIDB4ZDgsIChieXRlKSAweGQwLAorICAgICAgICAgICAgKGJ5dGUpIDB4YmYsIChieXRlKSAweDlkLCAoYnl0ZSkgMHgzNSwgKGJ5dGUpIDB4YWMsIChieXRlKSAweDY5LCAoYnl0ZSkgMHhkMiwKKyAgICAgICAgICAgIChieXRlKSAweDJiLCAoYnl0ZSkgMHhjMSwgKGJ5dGUpIDB4ZjksIChieXRlKSAweDI0LCAoYnl0ZSkgMHg3YiwgKGJ5dGUpIDB4Y2UsCisgICAgICAgICAgICAoYnl0ZSkgMHhjZCwgKGJ5dGUpIDB4Y2IsIChieXRlKSAweGE3LCAoYnl0ZSkgMHhiMiwgKGJ5dGUpIDB4N2EsIChieXRlKSAweDBhLAorICAgICAgICAgICAgKGJ5dGUpIDB4MjcsIChieXRlKSAweDE5LCAoYnl0ZSkgMHhjOSwgKGJ5dGUpIDB4YWYsIChieXRlKSAweDBkLCAoYnl0ZSkgMHgyMSwKKyAgICAgICAgICAgIChieXRlKSAweDg5LCAoYnl0ZSkgMHg4OCwgKGJ5dGUpIDB4N2MsIChieXRlKSAweGFkLCAoYnl0ZSkgMHg5ZSwgKGJ5dGUpIDB4OGQsCisgICAgICAgICAgICAoYnl0ZSkgMHg0NywgKGJ5dGUpIDB4NmQsIChieXRlKSAweDNmLCAoYnl0ZSkgMHhjZSwgKGJ5dGUpIDB4N2IsIChieXRlKSAweGExLAorICAgICAgICAgICAgKGJ5dGUpIDB4NzQsIChieXRlKSAweGYxLCAoYnl0ZSkgMHhhMCwgKGJ5dGUpIDB4YTEsIChieXRlKSAweDAyLCAoYnl0ZSkgMHg0MSwKKyAgICAgICAgICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHhkOSwgKGJ5dGUpIDB4YTgsIChieXRlKSAweGY1LCAoYnl0ZSkgMHhmZSwgKGJ5dGUpIDB4Y2UsCisgICAgICAgICAgICAoYnl0ZSkgMHhlNiwgKGJ5dGUpIDB4NzcsIChieXRlKSAweDZiLCAoYnl0ZSkgMHhmZSwgKGJ5dGUpIDB4MmQsIChieXRlKSAweGUwLAorICAgICAgICAgICAgKGJ5dGUpIDB4MWUsIChieXRlKSAweGI2LCAoYnl0ZSkgMHgyZSwgKGJ5dGUpIDB4MTIsIChieXRlKSAweDRlLCAoYnl0ZSkgMHg0MCwKKyAgICAgICAgICAgIChieXRlKSAweGFmLCAoYnl0ZSkgMHg2YSwgKGJ5dGUpIDB4N2IsIChieXRlKSAweDM3LCAoYnl0ZSkgMHg0OSwgKGJ5dGUpIDB4MmEsCisgICAgICAgICAgICAoYnl0ZSkgMHg5NiwgKGJ5dGUpIDB4MjUsIChieXRlKSAweDgzLCAoYnl0ZSkgMHg0OSwgKGJ5dGUpIDB4ZDQsIChieXRlKSAweDBjLAorICAgICAgICAgICAgKGJ5dGUpIDB4YzYsIChieXRlKSAweDc4LCAoYnl0ZSkgMHgyNSwgKGJ5dGUpIDB4MjQsIChieXRlKSAweDkwLCAoYnl0ZSkgMHg5MCwKKyAgICAgICAgICAgIChieXRlKSAweDA2LCAoYnl0ZSkgMHgxNSwgKGJ5dGUpIDB4OWUsIChieXRlKSAweGZlLCAoYnl0ZSkgMHhmOSwgKGJ5dGUpIDB4ZGYsCisgICAgICAgICAgICAoYnl0ZSkgMHg1YiwgKGJ5dGUpIDB4ZjMsIChieXRlKSAweDdlLCAoYnl0ZSkgMHgzOCwgKGJ5dGUpIDB4NzAsIChieXRlKSAweGViLAorICAgICAgICAgICAgKGJ5dGUpIDB4NTcsIChieXRlKSAweGQwLCAoYnl0ZSkgMHhkOSwgKGJ5dGUpIDB4YTcsIChieXRlKSAweDBlLCAoYnl0ZSkgMHgxNCwKKyAgICAgICAgICAgIChieXRlKSAweGY3LCAoYnl0ZSkgMHg5NSwgKGJ5dGUpIDB4NjgsIChieXRlKSAweGQ1LCAoYnl0ZSkgMHhjOCwgKGJ5dGUpIDB4YWIsCisgICAgICAgICAgICAoYnl0ZSkgMHg5ZCwgKGJ5dGUpIDB4M2EsIChieXRlKSAweDJiLCAoYnl0ZSkgMHg1MSwgKGJ5dGUpIDB4ZjksIChieXRlKSAweDAyLAorICAgICAgICAgICAgKGJ5dGUpIDB4NDEsIChieXRlKSAweDAwLCAoYnl0ZSkgMHg5NiwgKGJ5dGUpIDB4ZGYsIChieXRlKSAweGU5LCAoYnl0ZSkgMHg2NywKKyAgICAgICAgICAgIChieXRlKSAweDZjLCAoYnl0ZSkgMHhkYywgKGJ5dGUpIDB4OTAsIChieXRlKSAweDE0LCAoYnl0ZSkgMHhiNCwgKGJ5dGUpIDB4MWQsCisgICAgICAgICAgICAoYnl0ZSkgMHgyMiwgKGJ5dGUpIDB4MzMsIChieXRlKSAweDRhLCAoYnl0ZSkgMHgzMSwgKGJ5dGUpIDB4YzEsIChieXRlKSAweDlkLAorICAgICAgICAgICAgKGJ5dGUpIDB4MmUsIChieXRlKSAweGZmLCAoYnl0ZSkgMHg5YSwgKGJ5dGUpIDB4MmEsIChieXRlKSAweDk1LCAoYnl0ZSkgMHg0YiwKKyAgICAgICAgICAgIChieXRlKSAweDI3LCAoYnl0ZSkgMHg3NCwgKGJ5dGUpIDB4Y2IsIChieXRlKSAweDIxLCAoYnl0ZSkgMHhjMywgKGJ5dGUpIDB4ZDIsCisgICAgICAgICAgICAoYnl0ZSkgMHgwYiwgKGJ5dGUpIDB4YjIsIChieXRlKSAweDQ2LCAoYnl0ZSkgMHg4NywgKGJ5dGUpIDB4ZjgsIChieXRlKSAweDI4LAorICAgICAgICAgICAgKGJ5dGUpIDB4MDEsIChieXRlKSAweDhiLCAoYnl0ZSkgMHhkOCwgKGJ5dGUpIDB4YjksIChieXRlKSAweDRiLCAoYnl0ZSkgMHhjZCwKKyAgICAgICAgICAgIChieXRlKSAweDlhLCAoYnl0ZSkgMHg5NiwgKGJ5dGUpIDB4NDEsIChieXRlKSAweDBlLCAoYnl0ZSkgMHgzNiwgKGJ5dGUpIDB4NmQsCisgICAgICAgICAgICAoYnl0ZSkgMHg0MCwgKGJ5dGUpIDB4NDIsIChieXRlKSAweGJjLCAoYnl0ZSkgMHhkOSwgKGJ5dGUpIDB4ZDMsIChieXRlKSAweDdiLAorICAgICAgICAgICAgKGJ5dGUpIDB4YmMsIChieXRlKSAweGE3LCAoYnl0ZSkgMHg5MiwgKGJ5dGUpIDB4OTAsIChieXRlKSAweGRkLCAoYnl0ZSkgMHhhMSwKKyAgICAgICAgICAgIChieXRlKSAweDljLCAoYnl0ZSkgMHhjZSwgKGJ5dGUpIDB4YTEsIChieXRlKSAweDg3LCAoYnl0ZSkgMHgxMSwgKGJ5dGUpIDB4NTEKKyAgICAgICAgfTsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2VuZXJhdGVkIGZyb20gYWJvdmUgYW5kIGNvbnZlcnRlZCB3aXRoOgorICAgICAgICAgKgorICAgICAgICAgKiBvcGVuc3NsIHg1MDkgLW91dGZvcm0gZCAtaW4gY2FjZXJ0LnBlbSB8IHh4ZCAtaSB8IHNlZCAncy8weC8oYnl0ZSkgMHgvZycKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIGNhQ2VydGlmaWNhdGUgPSB7CisgICAgICAgICAgICAoYnl0ZSkgMHgzMCwgKGJ5dGUpIDB4ODIsIChieXRlKSAweDAyLCAoYnl0ZSkgMHhjZSwgKGJ5dGUpIDB4MzAsIChieXRlKSAweDgyLAorICAgICAgICAgICAgKGJ5dGUpIDB4MDIsIChieXRlKSAweDM3LCAoYnl0ZSkgMHhhMCwgKGJ5dGUpIDB4MDMsIChieXRlKSAweDAyLCAoYnl0ZSkgMHgwMSwKKyAgICAgICAgICAgIChieXRlKSAweDAyLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MDksIChieXRlKSAweDAwLCAoYnl0ZSkgMHhlMSwgKGJ5dGUpIDB4NmEsCisgICAgICAgICAgICAoYnl0ZSkgMHhhMiwgKGJ5dGUpIDB4ZjQsIChieXRlKSAweDJlLCAoYnl0ZSkgMHg1NSwgKGJ5dGUpIDB4NDgsIChieXRlKSAweDBhLAorICAgICAgICAgICAgKGJ5dGUpIDB4MzAsIChieXRlKSAweDBkLCAoYnl0ZSkgMHgwNiwgKGJ5dGUpIDB4MDksIChieXRlKSAweDJhLCAoYnl0ZSkgMHg4NiwKKyAgICAgICAgICAgIChieXRlKSAweDQ4LCAoYnl0ZSkgMHg4NiwgKGJ5dGUpIDB4ZjcsIChieXRlKSAweDBkLCAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4MDEsCisgICAgICAgICAgICAoYnl0ZSkgMHgwNSwgKGJ5dGUpIDB4MDUsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgzMCwgKGJ5dGUpIDB4NGYsIChieXRlKSAweDMxLAorICAgICAgICAgICAgKGJ5dGUpIDB4MGIsIChieXRlKSAweDMwLCAoYnl0ZSkgMHgwOSwgKGJ5dGUpIDB4MDYsIChieXRlKSAweDAzLCAoYnl0ZSkgMHg1NSwKKyAgICAgICAgICAgIChieXRlKSAweDA0LCAoYnl0ZSkgMHgwNiwgKGJ5dGUpIDB4MTMsIChieXRlKSAweDAyLCAoYnl0ZSkgMHg1NSwgKGJ5dGUpIDB4NTMsCisgICAgICAgICAgICAoYnl0ZSkgMHgzMSwgKGJ5dGUpIDB4MGIsIChieXRlKSAweDMwLCAoYnl0ZSkgMHgwOSwgKGJ5dGUpIDB4MDYsIChieXRlKSAweDAzLAorICAgICAgICAgICAgKGJ5dGUpIDB4NTUsIChieXRlKSAweDA0LCAoYnl0ZSkgMHgwOCwgKGJ5dGUpIDB4MTMsIChieXRlKSAweDAyLCAoYnl0ZSkgMHg0MywKKyAgICAgICAgICAgIChieXRlKSAweDQxLCAoYnl0ZSkgMHgzMSwgKGJ5dGUpIDB4MTYsIChieXRlKSAweDMwLCAoYnl0ZSkgMHgxNCwgKGJ5dGUpIDB4MDYsCisgICAgICAgICAgICAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4NTUsIChieXRlKSAweDA0LCAoYnl0ZSkgMHgwNywgKGJ5dGUpIDB4MTMsIChieXRlKSAweDBkLAorICAgICAgICAgICAgKGJ5dGUpIDB4NGQsIChieXRlKSAweDZmLCAoYnl0ZSkgMHg3NSwgKGJ5dGUpIDB4NmUsIChieXRlKSAweDc0LCAoYnl0ZSkgMHg2MSwKKyAgICAgICAgICAgIChieXRlKSAweDY5LCAoYnl0ZSkgMHg2ZSwgKGJ5dGUpIDB4MjAsIChieXRlKSAweDU2LCAoYnl0ZSkgMHg2OSwgKGJ5dGUpIDB4NjUsCisgICAgICAgICAgICAoYnl0ZSkgMHg3NywgKGJ5dGUpIDB4MzEsIChieXRlKSAweDFiLCAoYnl0ZSkgMHgzMCwgKGJ5dGUpIDB4MTksIChieXRlKSAweDA2LAorICAgICAgICAgICAgKGJ5dGUpIDB4MDMsIChieXRlKSAweDU1LCAoYnl0ZSkgMHgwNCwgKGJ5dGUpIDB4MGEsIChieXRlKSAweDEzLCAoYnl0ZSkgMHgxMiwKKyAgICAgICAgICAgIChieXRlKSAweDQxLCAoYnl0ZSkgMHg2ZSwgKGJ5dGUpIDB4NjQsIChieXRlKSAweDcyLCAoYnl0ZSkgMHg2ZiwgKGJ5dGUpIDB4NjksCisgICAgICAgICAgICAoYnl0ZSkgMHg2NCwgKGJ5dGUpIDB4MjAsIChieXRlKSAweDU0LCAoYnl0ZSkgMHg2NSwgKGJ5dGUpIDB4NzMsIChieXRlKSAweDc0LAorICAgICAgICAgICAgKGJ5dGUpIDB4MjAsIChieXRlKSAweDQzLCAoYnl0ZSkgMHg2MSwgKGJ5dGUpIDB4NzMsIChieXRlKSAweDY1LCAoYnl0ZSkgMHg3MywKKyAgICAgICAgICAgIChieXRlKSAweDMwLCAoYnl0ZSkgMHgxZSwgKGJ5dGUpIDB4MTcsIChieXRlKSAweDBkLCAoYnl0ZSkgMHgzMSwgKGJ5dGUpIDB4MzIsCisgICAgICAgICAgICAoYnl0ZSkgMHgzMCwgKGJ5dGUpIDB4MzgsIChieXRlKSAweDMxLCAoYnl0ZSkgMHgzNCwgKGJ5dGUpIDB4MzEsIChieXRlKSAweDM2LAorICAgICAgICAgICAgKGJ5dGUpIDB4MzUsIChieXRlKSAweDM1LCAoYnl0ZSkgMHgzNCwgKGJ5dGUpIDB4MzQsIChieXRlKSAweDVhLCAoYnl0ZSkgMHgxNywKKyAgICAgICAgICAgIChieXRlKSAweDBkLCAoYnl0ZSkgMHgzMiwgKGJ5dGUpIDB4MzIsIChieXRlKSAweDMwLCAoYnl0ZSkgMHgzOCwgKGJ5dGUpIDB4MzEsCisgICAgICAgICAgICAoYnl0ZSkgMHgzMiwgKGJ5dGUpIDB4MzEsIChieXRlKSAweDM2LCAoYnl0ZSkgMHgzNSwgKGJ5dGUpIDB4MzUsIChieXRlKSAweDM0LAorICAgICAgICAgICAgKGJ5dGUpIDB4MzQsIChieXRlKSAweDVhLCAoYnl0ZSkgMHgzMCwgKGJ5dGUpIDB4NGYsIChieXRlKSAweDMxLCAoYnl0ZSkgMHgwYiwKKyAgICAgICAgICAgIChieXRlKSAweDMwLCAoYnl0ZSkgMHgwOSwgKGJ5dGUpIDB4MDYsIChieXRlKSAweDAzLCAoYnl0ZSkgMHg1NSwgKGJ5dGUpIDB4MDQsCisgICAgICAgICAgICAoYnl0ZSkgMHgwNiwgKGJ5dGUpIDB4MTMsIChieXRlKSAweDAyLCAoYnl0ZSkgMHg1NSwgKGJ5dGUpIDB4NTMsIChieXRlKSAweDMxLAorICAgICAgICAgICAgKGJ5dGUpIDB4MGIsIChieXRlKSAweDMwLCAoYnl0ZSkgMHgwOSwgKGJ5dGUpIDB4MDYsIChieXRlKSAweDAzLCAoYnl0ZSkgMHg1NSwKKyAgICAgICAgICAgIChieXRlKSAweDA0LCAoYnl0ZSkgMHgwOCwgKGJ5dGUpIDB4MTMsIChieXRlKSAweDAyLCAoYnl0ZSkgMHg0MywgKGJ5dGUpIDB4NDEsCisgICAgICAgICAgICAoYnl0ZSkgMHgzMSwgKGJ5dGUpIDB4MTYsIChieXRlKSAweDMwLCAoYnl0ZSkgMHgxNCwgKGJ5dGUpIDB4MDYsIChieXRlKSAweDAzLAorICAgICAgICAgICAgKGJ5dGUpIDB4NTUsIChieXRlKSAweDA0LCAoYnl0ZSkgMHgwNywgKGJ5dGUpIDB4MTMsIChieXRlKSAweDBkLCAoYnl0ZSkgMHg0ZCwKKyAgICAgICAgICAgIChieXRlKSAweDZmLCAoYnl0ZSkgMHg3NSwgKGJ5dGUpIDB4NmUsIChieXRlKSAweDc0LCAoYnl0ZSkgMHg2MSwgKGJ5dGUpIDB4NjksCisgICAgICAgICAgICAoYnl0ZSkgMHg2ZSwgKGJ5dGUpIDB4MjAsIChieXRlKSAweDU2LCAoYnl0ZSkgMHg2OSwgKGJ5dGUpIDB4NjUsIChieXRlKSAweDc3LAorICAgICAgICAgICAgKGJ5dGUpIDB4MzEsIChieXRlKSAweDFiLCAoYnl0ZSkgMHgzMCwgKGJ5dGUpIDB4MTksIChieXRlKSAweDA2LCAoYnl0ZSkgMHgwMywKKyAgICAgICAgICAgIChieXRlKSAweDU1LCAoYnl0ZSkgMHgwNCwgKGJ5dGUpIDB4MGEsIChieXRlKSAweDEzLCAoYnl0ZSkgMHgxMiwgKGJ5dGUpIDB4NDEsCisgICAgICAgICAgICAoYnl0ZSkgMHg2ZSwgKGJ5dGUpIDB4NjQsIChieXRlKSAweDcyLCAoYnl0ZSkgMHg2ZiwgKGJ5dGUpIDB4NjksIChieXRlKSAweDY0LAorICAgICAgICAgICAgKGJ5dGUpIDB4MjAsIChieXRlKSAweDU0LCAoYnl0ZSkgMHg2NSwgKGJ5dGUpIDB4NzMsIChieXRlKSAweDc0LCAoYnl0ZSkgMHgyMCwKKyAgICAgICAgICAgIChieXRlKSAweDQzLCAoYnl0ZSkgMHg2MSwgKGJ5dGUpIDB4NzMsIChieXRlKSAweDY1LCAoYnl0ZSkgMHg3MywgKGJ5dGUpIDB4MzAsCisgICAgICAgICAgICAoYnl0ZSkgMHg4MSwgKGJ5dGUpIDB4OWYsIChieXRlKSAweDMwLCAoYnl0ZSkgMHgwZCwgKGJ5dGUpIDB4MDYsIChieXRlKSAweDA5LAorICAgICAgICAgICAgKGJ5dGUpIDB4MmEsIChieXRlKSAweDg2LCAoYnl0ZSkgMHg0OCwgKGJ5dGUpIDB4ODYsIChieXRlKSAweGY3LCAoYnl0ZSkgMHgwZCwKKyAgICAgICAgICAgIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4MDEsIChieXRlKSAweDA1LCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDMsCisgICAgICAgICAgICAoYnl0ZSkgMHg4MSwgKGJ5dGUpIDB4OGQsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgzMCwgKGJ5dGUpIDB4ODEsIChieXRlKSAweDg5LAorICAgICAgICAgICAgKGJ5dGUpIDB4MDIsIChieXRlKSAweDgxLCAoYnl0ZSkgMHg4MSwgKGJ5dGUpIDB4MDAsIChieXRlKSAweGEzLCAoYnl0ZSkgMHg3MiwKKyAgICAgICAgICAgIChieXRlKSAweGFiLCAoYnl0ZSkgMHhkMCwgKGJ5dGUpIDB4ZTQsIChieXRlKSAweGFkLCAoYnl0ZSkgMHgyZiwgKGJ5dGUpIDB4ZTcsCisgICAgICAgICAgICAoYnl0ZSkgMHhlMiwgKGJ5dGUpIDB4NzksIChieXRlKSAweDA3LCAoYnl0ZSkgMHgzNiwgKGJ5dGUpIDB4M2QsIChieXRlKSAweDBjLAorICAgICAgICAgICAgKGJ5dGUpIDB4OGQsIChieXRlKSAweDQyLCAoYnl0ZSkgMHg5YSwgKGJ5dGUpIDB4MGEsIChieXRlKSAweDMzLCAoYnl0ZSkgMHg2NCwKKyAgICAgICAgICAgIChieXRlKSAweGIzLCAoYnl0ZSkgMHhjZCwgKGJ5dGUpIDB4YjIsIChieXRlKSAweGQ3LCAoYnl0ZSkgMHgzYSwgKGJ5dGUpIDB4NDIsCisgICAgICAgICAgICAoYnl0ZSkgMHgwNiwgKGJ5dGUpIDB4NzcsIChieXRlKSAweDQ1LCAoYnl0ZSkgMHgyOSwgKGJ5dGUpIDB4ZTksIChieXRlKSAweGNiLAorICAgICAgICAgICAgKGJ5dGUpIDB4YjcsIChieXRlKSAweDRhLCAoYnl0ZSkgMHhkNiwgKGJ5dGUpIDB4ZWUsIChieXRlKSAweGFkLCAoYnl0ZSkgMHgwMSwKKyAgICAgICAgICAgIChieXRlKSAweDkxLCAoYnl0ZSkgMHg5YiwgKGJ5dGUpIDB4MGMsIChieXRlKSAweDU5LCAoYnl0ZSkgMHhhMSwgKGJ5dGUpIDB4MDMsCisgICAgICAgICAgICAoYnl0ZSkgMHhmYSwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweDVhLCAoYnl0ZSkgMHg3YywgKGJ5dGUpIDB4NGYsIChieXRlKSAweGY3LAorICAgICAgICAgICAgKGJ5dGUpIDB4OGQsIChieXRlKSAweDM2LCAoYnl0ZSkgMHgwZiwgKGJ5dGUpIDB4MWYsIChieXRlKSAweDQ1LCAoYnl0ZSkgMHg3ZCwKKyAgICAgICAgICAgIChieXRlKSAweDFiLCAoYnl0ZSkgMHgzMSwgKGJ5dGUpIDB4YTEsIChieXRlKSAweDM1LCAoYnl0ZSkgMHgwYiwgKGJ5dGUpIDB4MDAsCisgICAgICAgICAgICAoYnl0ZSkgMHhlZCwgKGJ5dGUpIDB4N2EsIChieXRlKSAweGI2LCAoYnl0ZSkgMHhjOCwgKGJ5dGUpIDB4NGUsIChieXRlKSAweGE5LAorICAgICAgICAgICAgKGJ5dGUpIDB4ODYsIChieXRlKSAweDRjLCAoYnl0ZSkgMHg3YiwgKGJ5dGUpIDB4OTksIChieXRlKSAweDU3LCAoYnl0ZSkgMHg0MSwKKyAgICAgICAgICAgIChieXRlKSAweDEyLCAoYnl0ZSkgMHhlZiwgKGJ5dGUpIDB4NmIsIChieXRlKSAweGJjLCAoYnl0ZSkgMHgzZCwgKGJ5dGUpIDB4NjAsCisgICAgICAgICAgICAoYnl0ZSkgMHhmMiwgKGJ5dGUpIDB4OTksIChieXRlKSAweDFhLCAoYnl0ZSkgMHhjZCwgKGJ5dGUpIDB4ZWQsIChieXRlKSAweDU2LAorICAgICAgICAgICAgKGJ5dGUpIDB4YTQsIChieXRlKSAweGU1LCAoYnl0ZSkgMHgzNiwgKGJ5dGUpIDB4OWYsIChieXRlKSAweDI0LCAoYnl0ZSkgMHgxZiwKKyAgICAgICAgICAgIChieXRlKSAweGRjLCAoYnl0ZSkgMHg4OSwgKGJ5dGUpIDB4NDAsIChieXRlKSAweGM4LCAoYnl0ZSkgMHg5OSwgKGJ5dGUpIDB4OTIsCisgICAgICAgICAgICAoYnl0ZSkgMHhhYiwgKGJ5dGUpIDB4NGEsIChieXRlKSAweGI1LCAoYnl0ZSkgMHg2MSwgKGJ5dGUpIDB4NDUsIChieXRlKSAweDYyLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZmYsIChieXRlKSAweGEzLCAoYnl0ZSkgMHg0NSwgKGJ5dGUpIDB4NjUsIChieXRlKSAweGFmLCAoYnl0ZSkgMHhmNiwKKyAgICAgICAgICAgIChieXRlKSAweDI3LCAoYnl0ZSkgMHgzMCwgKGJ5dGUpIDB4NTEsIChieXRlKSAweDBlLCAoYnl0ZSkgMHgwZSwgKGJ5dGUpIDB4ZWIsCisgICAgICAgICAgICAoYnl0ZSkgMHg3OSwgKGJ5dGUpIDB4MGMsIChieXRlKSAweGJlLCAoYnl0ZSkgMHhiMywgKGJ5dGUpIDB4MGEsIChieXRlKSAweDZmLAorICAgICAgICAgICAgKGJ5dGUpIDB4MjksIChieXRlKSAweDA2LCAoYnl0ZSkgMHhkYywgKGJ5dGUpIDB4MmYsIChieXRlKSAweDZiLCAoYnl0ZSkgMHg1MSwKKyAgICAgICAgICAgIChieXRlKSAweDAyLCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDEsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4YTMsCisgICAgICAgICAgICAoYnl0ZSkgMHg4MSwgKGJ5dGUpIDB4YjEsIChieXRlKSAweDMwLCAoYnl0ZSkgMHg4MSwgKGJ5dGUpIDB4YWUsIChieXRlKSAweDMwLAorICAgICAgICAgICAgKGJ5dGUpIDB4MWQsIChieXRlKSAweDA2LCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4NTUsIChieXRlKSAweDFkLCAoYnl0ZSkgMHgwZSwKKyAgICAgICAgICAgIChieXRlKSAweDA0LCAoYnl0ZSkgMHgxNiwgKGJ5dGUpIDB4MDQsIChieXRlKSAweDE0LCAoYnl0ZSkgMHgzMywgKGJ5dGUpIDB4MDUsCisgICAgICAgICAgICAoYnl0ZSkgMHhlZSwgKGJ5dGUpIDB4ZmUsIChieXRlKSAweDZmLCAoYnl0ZSkgMHg2MCwgKGJ5dGUpIDB4YzcsIChieXRlKSAweGY5LAorICAgICAgICAgICAgKGJ5dGUpIDB4YTksIChieXRlKSAweGQyLCAoYnl0ZSkgMHg3MywgKGJ5dGUpIDB4NWMsIChieXRlKSAweDhmLCAoYnl0ZSkgMHg2ZCwKKyAgICAgICAgICAgIChieXRlKSAweGEyLCAoYnl0ZSkgMHgyZiwgKGJ5dGUpIDB4OTcsIChieXRlKSAweDhlLCAoYnl0ZSkgMHg1ZCwgKGJ5dGUpIDB4NTEsCisgICAgICAgICAgICAoYnl0ZSkgMHgzMCwgKGJ5dGUpIDB4N2YsIChieXRlKSAweDA2LCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4NTUsIChieXRlKSAweDFkLAorICAgICAgICAgICAgKGJ5dGUpIDB4MjMsIChieXRlKSAweDA0LCAoYnl0ZSkgMHg3OCwgKGJ5dGUpIDB4MzAsIChieXRlKSAweDc2LCAoYnl0ZSkgMHg4MCwKKyAgICAgICAgICAgIChieXRlKSAweDE0LCAoYnl0ZSkgMHgzMywgKGJ5dGUpIDB4MDUsIChieXRlKSAweGVlLCAoYnl0ZSkgMHhmZSwgKGJ5dGUpIDB4NmYsCisgICAgICAgICAgICAoYnl0ZSkgMHg2MCwgKGJ5dGUpIDB4YzcsIChieXRlKSAweGY5LCAoYnl0ZSkgMHhhOSwgKGJ5dGUpIDB4ZDIsIChieXRlKSAweDczLAorICAgICAgICAgICAgKGJ5dGUpIDB4NWMsIChieXRlKSAweDhmLCAoYnl0ZSkgMHg2ZCwgKGJ5dGUpIDB4YTIsIChieXRlKSAweDJmLCAoYnl0ZSkgMHg5NywKKyAgICAgICAgICAgIChieXRlKSAweDhlLCAoYnl0ZSkgMHg1ZCwgKGJ5dGUpIDB4NTEsIChieXRlKSAweGExLCAoYnl0ZSkgMHg1MywgKGJ5dGUpIDB4YTQsCisgICAgICAgICAgICAoYnl0ZSkgMHg1MSwgKGJ5dGUpIDB4MzAsIChieXRlKSAweDRmLCAoYnl0ZSkgMHgzMSwgKGJ5dGUpIDB4MGIsIChieXRlKSAweDMwLAorICAgICAgICAgICAgKGJ5dGUpIDB4MDksIChieXRlKSAweDA2LCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4NTUsIChieXRlKSAweDA0LCAoYnl0ZSkgMHgwNiwKKyAgICAgICAgICAgIChieXRlKSAweDEzLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4NTUsIChieXRlKSAweDUzLCAoYnl0ZSkgMHgzMSwgKGJ5dGUpIDB4MGIsCisgICAgICAgICAgICAoYnl0ZSkgMHgzMCwgKGJ5dGUpIDB4MDksIChieXRlKSAweDA2LCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4NTUsIChieXRlKSAweDA0LAorICAgICAgICAgICAgKGJ5dGUpIDB4MDgsIChieXRlKSAweDEzLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4NDMsIChieXRlKSAweDQxLCAoYnl0ZSkgMHgzMSwKKyAgICAgICAgICAgIChieXRlKSAweDE2LCAoYnl0ZSkgMHgzMCwgKGJ5dGUpIDB4MTQsIChieXRlKSAweDA2LCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4NTUsCisgICAgICAgICAgICAoYnl0ZSkgMHgwNCwgKGJ5dGUpIDB4MDcsIChieXRlKSAweDEzLCAoYnl0ZSkgMHgwZCwgKGJ5dGUpIDB4NGQsIChieXRlKSAweDZmLAorICAgICAgICAgICAgKGJ5dGUpIDB4NzUsIChieXRlKSAweDZlLCAoYnl0ZSkgMHg3NCwgKGJ5dGUpIDB4NjEsIChieXRlKSAweDY5LCAoYnl0ZSkgMHg2ZSwKKyAgICAgICAgICAgIChieXRlKSAweDIwLCAoYnl0ZSkgMHg1NiwgKGJ5dGUpIDB4NjksIChieXRlKSAweDY1LCAoYnl0ZSkgMHg3NywgKGJ5dGUpIDB4MzEsCisgICAgICAgICAgICAoYnl0ZSkgMHgxYiwgKGJ5dGUpIDB4MzAsIChieXRlKSAweDE5LCAoYnl0ZSkgMHgwNiwgKGJ5dGUpIDB4MDMsIChieXRlKSAweDU1LAorICAgICAgICAgICAgKGJ5dGUpIDB4MDQsIChieXRlKSAweDBhLCAoYnl0ZSkgMHgxMywgKGJ5dGUpIDB4MTIsIChieXRlKSAweDQxLCAoYnl0ZSkgMHg2ZSwKKyAgICAgICAgICAgIChieXRlKSAweDY0LCAoYnl0ZSkgMHg3MiwgKGJ5dGUpIDB4NmYsIChieXRlKSAweDY5LCAoYnl0ZSkgMHg2NCwgKGJ5dGUpIDB4MjAsCisgICAgICAgICAgICAoYnl0ZSkgMHg1NCwgKGJ5dGUpIDB4NjUsIChieXRlKSAweDczLCAoYnl0ZSkgMHg3NCwgKGJ5dGUpIDB4MjAsIChieXRlKSAweDQzLAorICAgICAgICAgICAgKGJ5dGUpIDB4NjEsIChieXRlKSAweDczLCAoYnl0ZSkgMHg2NSwgKGJ5dGUpIDB4NzMsIChieXRlKSAweDgyLCAoYnl0ZSkgMHgwOSwKKyAgICAgICAgICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHhlMSwgKGJ5dGUpIDB4NmEsIChieXRlKSAweGEyLCAoYnl0ZSkgMHhmNCwgKGJ5dGUpIDB4MmUsCisgICAgICAgICAgICAoYnl0ZSkgMHg1NSwgKGJ5dGUpIDB4NDgsIChieXRlKSAweDBhLCAoYnl0ZSkgMHgzMCwgKGJ5dGUpIDB4MGMsIChieXRlKSAweDA2LAorICAgICAgICAgICAgKGJ5dGUpIDB4MDMsIChieXRlKSAweDU1LCAoYnl0ZSkgMHgxZCwgKGJ5dGUpIDB4MTMsIChieXRlKSAweDA0LCAoYnl0ZSkgMHgwNSwKKyAgICAgICAgICAgIChieXRlKSAweDMwLCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDEsIChieXRlKSAweDAxLCAoYnl0ZSkgMHhmZiwgKGJ5dGUpIDB4MzAsCisgICAgICAgICAgICAoYnl0ZSkgMHgwZCwgKGJ5dGUpIDB4MDYsIChieXRlKSAweDA5LCAoYnl0ZSkgMHgyYSwgKGJ5dGUpIDB4ODYsIChieXRlKSAweDQ4LAorICAgICAgICAgICAgKGJ5dGUpIDB4ODYsIChieXRlKSAweGY3LCAoYnl0ZSkgMHgwZCwgKGJ5dGUpIDB4MDEsIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwNSwKKyAgICAgICAgICAgIChieXRlKSAweDA1LCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDMsIChieXRlKSAweDgxLCAoYnl0ZSkgMHg4MSwgKGJ5dGUpIDB4MDAsCisgICAgICAgICAgICAoYnl0ZSkgMHg4YywgKGJ5dGUpIDB4MzAsIChieXRlKSAweDQyLCAoYnl0ZSkgMHhmYSwgKGJ5dGUpIDB4ZWIsIChieXRlKSAweDFhLAorICAgICAgICAgICAgKGJ5dGUpIDB4MjYsIChieXRlKSAweGViLCAoYnl0ZSkgMHhkYSwgKGJ5dGUpIDB4NTYsIChieXRlKSAweDMyLCAoYnl0ZSkgMHhmMiwKKyAgICAgICAgICAgIChieXRlKSAweDlkLCAoYnl0ZSkgMHhhNSwgKGJ5dGUpIDB4MjQsIChieXRlKSAweGQ4LCAoYnl0ZSkgMHgzYSwgKGJ5dGUpIDB4ZGEsCisgICAgICAgICAgICAoYnl0ZSkgMHgzMCwgKGJ5dGUpIDB4YTYsIChieXRlKSAweDhiLCAoYnl0ZSkgMHg0NiwgKGJ5dGUpIDB4ZmUsIChieXRlKSAweGZlLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZGIsIChieXRlKSAweGYxLCAoYnl0ZSkgMHhlNiwgKGJ5dGUpIDB4ZTEsIChieXRlKSAweDdjLCAoYnl0ZSkgMHgxYiwKKyAgICAgICAgICAgIChieXRlKSAweGU3LCAoYnl0ZSkgMHg3NywgKGJ5dGUpIDB4MDAsIChieXRlKSAweGExLCAoYnl0ZSkgMHgxYywgKGJ5dGUpIDB4MTksCisgICAgICAgICAgICAoYnl0ZSkgMHgxNywgKGJ5dGUpIDB4NzMsIChieXRlKSAweGIwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4OWQsIChieXRlKSAweGYzLAorICAgICAgICAgICAgKGJ5dGUpIDB4NGYsIChieXRlKSAweGI2LCAoYnl0ZSkgMHhiYywgKGJ5dGUpIDB4YzcsIChieXRlKSAweDQ3LCAoYnl0ZSkgMHg4NSwKKyAgICAgICAgICAgIChieXRlKSAweDJhLCAoYnl0ZSkgMHg0YSwgKGJ5dGUpIDB4YTEsIChieXRlKSAweGE1LCAoYnl0ZSkgMHg1OCwgKGJ5dGUpIDB4ZjUsCisgICAgICAgICAgICAoYnl0ZSkgMHhjNSwgKGJ5dGUpIDB4MWEsIChieXRlKSAweDUxLCAoYnl0ZSkgMHhiMSwgKGJ5dGUpIDB4MDQsIChieXRlKSAweDgwLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZWUsIChieXRlKSAweDNhLCAoYnl0ZSkgMHhlYywgKGJ5dGUpIDB4MmYsIChieXRlKSAweGUxLCAoYnl0ZSkgMHhmZCwKKyAgICAgICAgICAgIChieXRlKSAweDU4LCAoYnl0ZSkgMHhlYiwgKGJ5dGUpIDB4ZWQsIChieXRlKSAweDgyLCAoYnl0ZSkgMHg5ZSwgKGJ5dGUpIDB4MzgsCisgICAgICAgICAgICAoYnl0ZSkgMHhhMywgKGJ5dGUpIDB4MjQsIChieXRlKSAweDc1LCAoYnl0ZSkgMHhmNywgKGJ5dGUpIDB4M2UsIChieXRlKSAweGMyLAorICAgICAgICAgICAgKGJ5dGUpIDB4YzUsIChieXRlKSAweDI3LCAoYnl0ZSkgMHhlYiwgKGJ5dGUpIDB4NmYsIChieXRlKSAweDdiLCAoYnl0ZSkgMHg1MCwKKyAgICAgICAgICAgIChieXRlKSAweGRhLCAoYnl0ZSkgMHg0MywgKGJ5dGUpIDB4ZGMsIChieXRlKSAweDNiLCAoYnl0ZSkgMHgwYiwgKGJ5dGUpIDB4NmYsCisgICAgICAgICAgICAoYnl0ZSkgMHg3OCwgKGJ5dGUpIDB4OGYsIChieXRlKSAweGIwLCAoYnl0ZSkgMHg2NiwgKGJ5dGUpIDB4ZTEsIChieXRlKSAweDEyLAorICAgICAgICAgICAgKGJ5dGUpIDB4ODcsIChieXRlKSAweDVmLCAoYnl0ZSkgMHg5NywgKGJ5dGUpIDB4N2IsIChieXRlKSAweGNhLCAoYnl0ZSkgMHgxNCwKKyAgICAgICAgICAgIChieXRlKSAweDc5LCAoYnl0ZSkgMHhmNywgKGJ5dGUpIDB4ZTgsIChieXRlKSAweDZjLCAoYnl0ZSkgMHg3MiwgKGJ5dGUpIDB4ZGIsCisgICAgICAgICAgICAoYnl0ZSkgMHg5MSwgKGJ5dGUpIDB4NjUsIChieXRlKSAweDE3LCAoYnl0ZSkgMHg1NCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweDc0LAorICAgICAgICAgICAgKGJ5dGUpIDB4MWQsIChieXRlKSAweGFjLCAoYnl0ZSkgMHg0NywgKGJ5dGUpIDB4MDQsIChieXRlKSAweDEyLCAoYnl0ZSkgMHhlMCwKKyAgICAgICAgICAgIChieXRlKSAweGMzLCAoYnl0ZSkgMHg2NiwgKGJ5dGUpIDB4MTksIChieXRlKSAweDA1LCAoYnl0ZSkgMHgyZSwgKGJ5dGUpIDB4N2UsCisgICAgICAgICAgICAoYnl0ZSkgMHhmMSwgKGJ5dGUpIDB4NjEKKyAgICAgICAgfTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFRoZSBrZXlzIGFuZCBjZXJ0aWZpY2F0ZXMgYmVsb3cgYXJlIGdlbmVyYXRlZCB3aXRoOgorICAgICAqCisgICAgICogb3BlbnNzbCByZXEgLW5ldyAteDUwOSAtZGF5cyAzNjUwIC1leHRlbnNpb25zIHYzX2NhIC1rZXlvdXQgY2FrZXkucGVtIC1vdXQgY2FjZXJ0LnBlbQorICAgICAqIG9wZW5zc2wgZHNhcGFyYW0gLW91dCBkc2FwYXJhbS5wZW0gMTAyNAorICAgICAqIG9wZW5zc2wgcmVxIC1uZXdrZXkgZHNhOmRzYXBhcmFtLnBlbSAta2V5b3V0IHVzZXJrZXkucGVtIC1ub2RlcyAtZGF5cyAzNjUwIC1vdXQgdXNlcmtleS5yZXEKKyAgICAgKiBta2RpciAtcCBkZW1vQ0EvbmV3Y2VydHMKKyAgICAgKiB0b3VjaCBkZW1vQ0EvaW5kZXgudHh0CisgICAgICogZWNobyAiMDEiID4gZGVtb0NBL3NlcmlhbAorICAgICAqIG9wZW5zc2wgY2EgLW91dCB1c2VyY2VydC5wZW0gLWluIHVzZXJrZXkucmVxIC1jZXJ0IGNhY2VydC5wZW0gLWtleWZpbGUgY2FrZXkucGVtIC1kYXlzIDM2NTAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZBS0VfRFNBXzEgeworICAgICAgICAvKioKKyAgICAgICAgICogR2VuZXJhdGVkIGZyb20gYWJvdmUgYW5kIGNvbnZlcnRlZCB3aXRoOiBvcGVuc3NsIHBrY3M4IC10b3BrOCAtb3V0Zm9ybSBkCisgICAgICAgICAqIC1pbiB1c2Vya2V5LnBlbSAtbm9jcnlwdCB8IHh4ZCAtaSB8IHNlZCAncy8weC8oYnl0ZSkgMHgvZycKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIHByaXZhdGVLZXkgPSB7CisgICAgICAgICAgICAoYnl0ZSkgMHgzMCwgKGJ5dGUpIDB4ODIsIChieXRlKSAweDAxLCAoYnl0ZSkgMHg0YywgKGJ5dGUpIDB4MDIsIChieXRlKSAweDAxLAorICAgICAgICAgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDMwLCAoYnl0ZSkgMHg4MiwgKGJ5dGUpIDB4MDEsIChieXRlKSAweDJjLCAoYnl0ZSkgMHgwNiwKKyAgICAgICAgICAgIChieXRlKSAweDA3LCAoYnl0ZSkgMHgyYSwgKGJ5dGUpIDB4ODYsIChieXRlKSAweDQ4LCAoYnl0ZSkgMHhjZSwgKGJ5dGUpIDB4MzgsCisgICAgICAgICAgICAoYnl0ZSkgMHgwNCwgKGJ5dGUpIDB4MDEsIChieXRlKSAweDMwLCAoYnl0ZSkgMHg4MiwgKGJ5dGUpIDB4MDEsIChieXRlKSAweDFmLAorICAgICAgICAgICAgKGJ5dGUpIDB4MDIsIChieXRlKSAweDgxLCAoYnl0ZSkgMHg4MSwgKGJ5dGUpIDB4MDAsIChieXRlKSAweGIzLCAoYnl0ZSkgMHgyMywKKyAgICAgICAgICAgIChieXRlKSAweGY3LCAoYnl0ZSkgMHg4NiwgKGJ5dGUpIDB4YmQsIChieXRlKSAweDNiLCAoYnl0ZSkgMHg4NiwgKGJ5dGUpIDB4Y2MsCisgICAgICAgICAgICAoYnl0ZSkgMHhjMywgKGJ5dGUpIDB4OTEsIChieXRlKSAweGMwLCAoYnl0ZSkgMHgzMCwgKGJ5dGUpIDB4MzIsIChieXRlKSAweDAyLAorICAgICAgICAgICAgKGJ5dGUpIDB4NDcsIChieXRlKSAweDM1LCAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4ZWYsIChieXRlKSAweGVlLCAoYnl0ZSkgMHg5OCwKKyAgICAgICAgICAgIChieXRlKSAweDEzLCAoYnl0ZSkgMHg1NiwgKGJ5dGUpIDB4NDksIChieXRlKSAweDQ3LCAoYnl0ZSkgMHhiNSwgKGJ5dGUpIDB4MjAsCisgICAgICAgICAgICAoYnl0ZSkgMHhhOCwgKGJ5dGUpIDB4NjAsIChieXRlKSAweGNiLCAoYnl0ZSkgMHhjMCwgKGJ5dGUpIDB4ZDUsIChieXRlKSAweDc3LAorICAgICAgICAgICAgKGJ5dGUpIDB4YzEsIChieXRlKSAweDY5LCAoYnl0ZSkgMHhjZCwgKGJ5dGUpIDB4MTgsIChieXRlKSAweDM0LCAoYnl0ZSkgMHg5MiwKKyAgICAgICAgICAgIChieXRlKSAweGYyLCAoYnl0ZSkgMHg2YSwgKGJ5dGUpIDB4MmEsIChieXRlKSAweDEwLCAoYnl0ZSkgMHg1OSwgKGJ5dGUpIDB4MWMsCisgICAgICAgICAgICAoYnl0ZSkgMHg5MSwgKGJ5dGUpIDB4MjAsIChieXRlKSAweDUxLCAoYnl0ZSkgMHhjYSwgKGJ5dGUpIDB4MzcsIChieXRlKSAweGIyLAorICAgICAgICAgICAgKGJ5dGUpIDB4ODcsIChieXRlKSAweGE2LCAoYnl0ZSkgMHg4YSwgKGJ5dGUpIDB4MDIsIChieXRlKSAweGZkLCAoYnl0ZSkgMHg0NSwKKyAgICAgICAgICAgIChieXRlKSAweDQ2LCAoYnl0ZSkgMHhmOSwgKGJ5dGUpIDB4NzYsIChieXRlKSAweGIxLCAoYnl0ZSkgMHgzNSwgKGJ5dGUpIDB4MzgsCisgICAgICAgICAgICAoYnl0ZSkgMHg4ZCwgKGJ5dGUpIDB4ZmYsIChieXRlKSAweDRjLCAoYnl0ZSkgMHg1ZCwgKGJ5dGUpIDB4NzUsIChieXRlKSAweDhmLAorICAgICAgICAgICAgKGJ5dGUpIDB4NjYsIChieXRlKSAweDE1LCAoYnl0ZSkgMHg3ZCwgKGJ5dGUpIDB4N2IsIChieXRlKSAweGRhLCAoYnl0ZSkgMHhkYiwKKyAgICAgICAgICAgIChieXRlKSAweDU3LCAoYnl0ZSkgMHgzOSwgKGJ5dGUpIDB4ZmYsIChieXRlKSAweDkxLCAoYnl0ZSkgMHgzZiwgKGJ5dGUpIDB4ZGQsCisgICAgICAgICAgICAoYnl0ZSkgMHhlMiwgKGJ5dGUpIDB4YjQsIChieXRlKSAweDIyLCAoYnl0ZSkgMHg2MCwgKGJ5dGUpIDB4NGMsIChieXRlKSAweDMyLAorICAgICAgICAgICAgKGJ5dGUpIDB4M2IsIChieXRlKSAweDlkLCAoYnl0ZSkgMHgzNCwgKGJ5dGUpIDB4OWYsIChieXRlKSAweGI5LCAoYnl0ZSkgMHg1ZCwKKyAgICAgICAgICAgIChieXRlKSAweDc1LCAoYnl0ZSkgMHhiOSwgKGJ5dGUpIDB4ZDMsIChieXRlKSAweDdmLCAoYnl0ZSkgMHgxMSwgKGJ5dGUpIDB4YmEsCisgICAgICAgICAgICAoYnl0ZSkgMHhiNywgKGJ5dGUpIDB4YzgsIChieXRlKSAweDMyLCAoYnl0ZSkgMHhjNiwgKGJ5dGUpIDB4Y2UsIChieXRlKSAweDcxLAorICAgICAgICAgICAgKGJ5dGUpIDB4OTEsIChieXRlKSAweGQzLCAoYnl0ZSkgMHgzMiwgKGJ5dGUpIDB4YWYsIChieXRlKSAweDRkLCAoYnl0ZSkgMHg3ZSwKKyAgICAgICAgICAgIChieXRlKSAweDdjLCAoYnl0ZSkgMHgxNSwgKGJ5dGUpIDB4ZjcsIChieXRlKSAweDcxLCAoYnl0ZSkgMHgyYywgKGJ5dGUpIDB4NTIsCisgICAgICAgICAgICAoYnl0ZSkgMHg2NSwgKGJ5dGUpIDB4NGQsIChieXRlKSAweGE5LCAoYnl0ZSkgMHg4MSwgKGJ5dGUpIDB4MjUsIChieXRlKSAweDM1LAorICAgICAgICAgICAgKGJ5dGUpIDB4Y2UsIChieXRlKSAweDBiLCAoYnl0ZSkgMHg1YiwgKGJ5dGUpIDB4NTYsIChieXRlKSAweGZlLCAoYnl0ZSkgMHhmMSwKKyAgICAgICAgICAgIChieXRlKSAweDAyLCAoYnl0ZSkgMHgxNSwgKGJ5dGUpIDB4MDAsIChieXRlKSAweGViLCAoYnl0ZSkgMHg0ZSwgKGJ5dGUpIDB4N2YsCisgICAgICAgICAgICAoYnl0ZSkgMHg3YSwgKGJ5dGUpIDB4MzEsIChieXRlKSAweGIzLCAoYnl0ZSkgMHg3ZCwgKGJ5dGUpIDB4OGQsIChieXRlKSAweGIyLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZjcsIChieXRlKSAweGFmLCAoYnl0ZSkgMHhhZCwgKGJ5dGUpIDB4YjEsIChieXRlKSAweDQyLCAoYnl0ZSkgMHg5MiwKKyAgICAgICAgICAgIChieXRlKSAweGYzLCAoYnl0ZSkgMHg2YywgKGJ5dGUpIDB4ZTQsIChieXRlKSAweGVkLCAoYnl0ZSkgMHg4YiwgKGJ5dGUpIDB4MDIsCisgICAgICAgICAgICAoYnl0ZSkgMHg4MSwgKGJ5dGUpIDB4ODEsIChieXRlKSAweDAwLCAoYnl0ZSkgMHg4MSwgKGJ5dGUpIDB4YzgsIChieXRlKSAweDM2LAorICAgICAgICAgICAgKGJ5dGUpIDB4NDgsIChieXRlKSAweGRiLCAoYnl0ZSkgMHg3MSwgKGJ5dGUpIDB4MmIsIChieXRlKSAweDkxLCAoYnl0ZSkgMHhjZSwKKyAgICAgICAgICAgIChieXRlKSAweDZkLCAoYnl0ZSkgMHhiYywgKGJ5dGUpIDB4YjgsIChieXRlKSAweGY5LCAoYnl0ZSkgMHhjYiwgKGJ5dGUpIDB4NTAsCisgICAgICAgICAgICAoYnl0ZSkgMHg5MSwgKGJ5dGUpIDB4MTAsIChieXRlKSAweDhhLCAoYnl0ZSkgMHhmOCwgKGJ5dGUpIDB4MzcsIChieXRlKSAweDUwLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZGEsIChieXRlKSAweDRmLCAoYnl0ZSkgMHhjOCwgKGJ5dGUpIDB4NGQsIChieXRlKSAweDczLCAoYnl0ZSkgMHhjYiwKKyAgICAgICAgICAgIChieXRlKSAweDRkLCAoYnl0ZSkgMHhiMCwgKGJ5dGUpIDB4MTksIChieXRlKSAweDU0LCAoYnl0ZSkgMHg1YSwgKGJ5dGUpIDB4ZjMsCisgICAgICAgICAgICAoYnl0ZSkgMHg2YywgKGJ5dGUpIDB4YzksIChieXRlKSAweGQ4LCAoYnl0ZSkgMHg5NiwgKGJ5dGUpIDB4ZDksIChieXRlKSAweGIwLAorICAgICAgICAgICAgKGJ5dGUpIDB4NTQsIChieXRlKSAweDdlLCAoYnl0ZSkgMHg3ZCwgKGJ5dGUpIDB4ZTIsIChieXRlKSAweDU4LCAoYnl0ZSkgMHgwZSwKKyAgICAgICAgICAgIChieXRlKSAweDVmLCAoYnl0ZSkgMHhjMCwgKGJ5dGUpIDB4Y2UsIChieXRlKSAweGI5LCAoYnl0ZSkgMHg1YywgKGJ5dGUpIDB4ZTMsCisgICAgICAgICAgICAoYnl0ZSkgMHhkMywgKGJ5dGUpIDB4ZGYsIChieXRlKSAweGNmLCAoYnl0ZSkgMHg0NSwgKGJ5dGUpIDB4NzQsIChieXRlKSAweGZiLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZTYsIChieXRlKSAweDIwLCAoYnl0ZSkgMHhlNywgKGJ5dGUpIDB4ZmMsIChieXRlKSAweDBmLCAoYnl0ZSkgMHhjYSwKKyAgICAgICAgICAgIChieXRlKSAweGRiLCAoYnl0ZSkgMHhjMCwgKGJ5dGUpIDB4MGIsIChieXRlKSAweGUxLCAoYnl0ZSkgMHg1YSwgKGJ5dGUpIDB4MTYsCisgICAgICAgICAgICAoYnl0ZSkgMHgxZCwgKGJ5dGUpIDB4YjMsIChieXRlKSAweDJlLCAoYnl0ZSkgMHhlNSwgKGJ5dGUpIDB4NWYsIChieXRlKSAweDg5LAorICAgICAgICAgICAgKGJ5dGUpIDB4MTcsIChieXRlKSAweDczLCAoYnl0ZSkgMHg1MCwgKGJ5dGUpIDB4ZDEsIChieXRlKSAweDRhLCAoYnl0ZSkgMHg2MCwKKyAgICAgICAgICAgIChieXRlKSAweGI3LCAoYnl0ZSkgMHhhYSwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGM3LCAoYnl0ZSkgMHhjNSwgKGJ5dGUpIDB4MDMsCisgICAgICAgICAgICAoYnl0ZSkgMHg0ZSwgKGJ5dGUpIDB4MzYsIChieXRlKSAweDUxLCAoYnl0ZSkgMHg5ZSwgKGJ5dGUpIDB4MmYsIChieXRlKSAweGZhLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZjMsIChieXRlKSAweGQ2LCAoYnl0ZSkgMHg1OCwgKGJ5dGUpIDB4MTQsIChieXRlKSAweDAyLCAoYnl0ZSkgMHhiNCwKKyAgICAgICAgICAgIChieXRlKSAweDQxLCAoYnl0ZSkgMHhkNiwgKGJ5dGUpIDB4NzIsIChieXRlKSAweDZmLCAoYnl0ZSkgMHg1OCwgKGJ5dGUpIDB4NWIsCisgICAgICAgICAgICAoYnl0ZSkgMHgyZCwgKGJ5dGUpIDB4MjMsIChieXRlKSAweGMwLCAoYnl0ZSkgMHg3NSwgKGJ5dGUpIDB4NGYsIChieXRlKSAweDM5LAorICAgICAgICAgICAgKGJ5dGUpIDB4YTgsIChieXRlKSAweDZhLCAoYnl0ZSkgMHhkZiwgKGJ5dGUpIDB4NzksIChieXRlKSAweDIxLCAoYnl0ZSkgMHhmMiwKKyAgICAgICAgICAgIChieXRlKSAweDc3LCAoYnl0ZSkgMHg5MSwgKGJ5dGUpIDB4M2YsIChieXRlKSAweDFjLCAoYnl0ZSkgMHg0ZCwgKGJ5dGUpIDB4NDgsCisgICAgICAgICAgICAoYnl0ZSkgMHg3OCwgKGJ5dGUpIDB4Y2QsIChieXRlKSAweGVkLCAoYnl0ZSkgMHg3OSwgKGJ5dGUpIDB4MjMsIChieXRlKSAweDA0LAorICAgICAgICAgICAgKGJ5dGUpIDB4MTcsIChieXRlKSAweDAyLCAoYnl0ZSkgMHgxNSwgKGJ5dGUpIDB4MDAsIChieXRlKSAweGM3LCAoYnl0ZSkgMHhlNywKKyAgICAgICAgICAgIChieXRlKSAweGUyLCAoYnl0ZSkgMHg2YiwgKGJ5dGUpIDB4MTQsIChieXRlKSAweGU2LCAoYnl0ZSkgMHgzMSwgKGJ5dGUpIDB4MTIsCisgICAgICAgICAgICAoYnl0ZSkgMHhiMiwgKGJ5dGUpIDB4MWUsIChieXRlKSAweGQ0LCAoYnl0ZSkgMHhmMiwgKGJ5dGUpIDB4OWIsIChieXRlKSAweDJjLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZjYsIChieXRlKSAweDU0LCAoYnl0ZSkgMHg0YywgKGJ5dGUpIDB4MTIsIChieXRlKSAweGU4LCAoYnl0ZSkgMHgyMgorCisgICAgICAgIH07CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdlbmVyYXRlZCBmcm9tIGFib3ZlIGFuZCBjb252ZXJ0ZWQgd2l0aDoKKyAgICAgICAgICoKKyAgICAgICAgICogb3BlbnNzbCB4NTA5IC1vdXRmb3JtIGQgLWluIGNhY2VydC5wZW0gfCB4eGQgLWkgfCBzZWQgJ3MvMHgvKGJ5dGUpIDB4L2cnCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBjYUNlcnRpZmljYXRlID0gbmV3IGJ5dGVbXSB7CisgICAgICAgICAgICAoYnl0ZSkgMHgzMCwgKGJ5dGUpIDB4ODIsIChieXRlKSAweDAyLCAoYnl0ZSkgMHg4YSwgKGJ5dGUpIDB4MzAsIChieXRlKSAweDgyLAorICAgICAgICAgICAgKGJ5dGUpIDB4MDEsIChieXRlKSAweGYzLCAoYnl0ZSkgMHhhMCwgKGJ5dGUpIDB4MDMsIChieXRlKSAweDAyLCAoYnl0ZSkgMHgwMSwKKyAgICAgICAgICAgIChieXRlKSAweDAyLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MDksIChieXRlKSAweDAwLCAoYnl0ZSkgMHg4NywgKGJ5dGUpIDB4YzAsCisgICAgICAgICAgICAoYnl0ZSkgMHg2OCwgKGJ5dGUpIDB4N2YsIChieXRlKSAweDQyLCAoYnl0ZSkgMHg5MiwgKGJ5dGUpIDB4MGIsIChieXRlKSAweDdhLAorICAgICAgICAgICAgKGJ5dGUpIDB4MzAsIChieXRlKSAweDBkLCAoYnl0ZSkgMHgwNiwgKGJ5dGUpIDB4MDksIChieXRlKSAweDJhLCAoYnl0ZSkgMHg4NiwKKyAgICAgICAgICAgIChieXRlKSAweDQ4LCAoYnl0ZSkgMHg4NiwgKGJ5dGUpIDB4ZjcsIChieXRlKSAweDBkLCAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4MDEsCisgICAgICAgICAgICAoYnl0ZSkgMHgwNSwgKGJ5dGUpIDB4MDUsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgzMCwgKGJ5dGUpIDB4NWUsIChieXRlKSAweDMxLAorICAgICAgICAgICAgKGJ5dGUpIDB4MGIsIChieXRlKSAweDMwLCAoYnl0ZSkgMHgwOSwgKGJ5dGUpIDB4MDYsIChieXRlKSAweDAzLCAoYnl0ZSkgMHg1NSwKKyAgICAgICAgICAgIChieXRlKSAweDA0LCAoYnl0ZSkgMHgwNiwgKGJ5dGUpIDB4MTMsIChieXRlKSAweDAyLCAoYnl0ZSkgMHg0MSwgKGJ5dGUpIDB4NTUsCisgICAgICAgICAgICAoYnl0ZSkgMHgzMSwgKGJ5dGUpIDB4MTMsIChieXRlKSAweDMwLCAoYnl0ZSkgMHgxMSwgKGJ5dGUpIDB4MDYsIChieXRlKSAweDAzLAorICAgICAgICAgICAgKGJ5dGUpIDB4NTUsIChieXRlKSAweDA0LCAoYnl0ZSkgMHgwOCwgKGJ5dGUpIDB4MGMsIChieXRlKSAweDBhLCAoYnl0ZSkgMHg1MywKKyAgICAgICAgICAgIChieXRlKSAweDZmLCAoYnl0ZSkgMHg2ZCwgKGJ5dGUpIDB4NjUsIChieXRlKSAweDJkLCAoYnl0ZSkgMHg1MywgKGJ5dGUpIDB4NzQsCisgICAgICAgICAgICAoYnl0ZSkgMHg2MSwgKGJ5dGUpIDB4NzQsIChieXRlKSAweDY1LCAoYnl0ZSkgMHgzMSwgKGJ5dGUpIDB4MjEsIChieXRlKSAweDMwLAorICAgICAgICAgICAgKGJ5dGUpIDB4MWYsIChieXRlKSAweDA2LCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4NTUsIChieXRlKSAweDA0LCAoYnl0ZSkgMHgwYSwKKyAgICAgICAgICAgIChieXRlKSAweDBjLCAoYnl0ZSkgMHgxOCwgKGJ5dGUpIDB4NDksIChieXRlKSAweDZlLCAoYnl0ZSkgMHg3NCwgKGJ5dGUpIDB4NjUsCisgICAgICAgICAgICAoYnl0ZSkgMHg3MiwgKGJ5dGUpIDB4NmUsIChieXRlKSAweDY1LCAoYnl0ZSkgMHg3NCwgKGJ5dGUpIDB4MjAsIChieXRlKSAweDU3LAorICAgICAgICAgICAgKGJ5dGUpIDB4NjksIChieXRlKSAweDY0LCAoYnl0ZSkgMHg2NywgKGJ5dGUpIDB4NjksIChieXRlKSAweDc0LCAoYnl0ZSkgMHg3MywKKyAgICAgICAgICAgIChieXRlKSAweDIwLCAoYnl0ZSkgMHg1MCwgKGJ5dGUpIDB4NzQsIChieXRlKSAweDc5LCAoYnl0ZSkgMHgyMCwgKGJ5dGUpIDB4NGMsCisgICAgICAgICAgICAoYnl0ZSkgMHg3NCwgKGJ5dGUpIDB4NjQsIChieXRlKSAweDMxLCAoYnl0ZSkgMHgxNywgKGJ5dGUpIDB4MzAsIChieXRlKSAweDE1LAorICAgICAgICAgICAgKGJ5dGUpIDB4MDYsIChieXRlKSAweDAzLCAoYnl0ZSkgMHg1NSwgKGJ5dGUpIDB4MDQsIChieXRlKSAweDAzLCAoYnl0ZSkgMHgwYywKKyAgICAgICAgICAgIChieXRlKSAweDBlLCAoYnl0ZSkgMHg2MywgKGJ5dGUpIDB4NjEsIChieXRlKSAweDJlLCAoYnl0ZSkgMHg2NSwgKGJ5dGUpIDB4NzgsCisgICAgICAgICAgICAoYnl0ZSkgMHg2MSwgKGJ5dGUpIDB4NmQsIChieXRlKSAweDcwLCAoYnl0ZSkgMHg2YywgKGJ5dGUpIDB4NjUsIChieXRlKSAweDJlLAorICAgICAgICAgICAgKGJ5dGUpIDB4NjMsIChieXRlKSAweDZmLCAoYnl0ZSkgMHg2ZCwgKGJ5dGUpIDB4MzAsIChieXRlKSAweDFlLCAoYnl0ZSkgMHgxNywKKyAgICAgICAgICAgIChieXRlKSAweDBkLCAoYnl0ZSkgMHgzMSwgKGJ5dGUpIDB4MzMsIChieXRlKSAweDMwLCAoYnl0ZSkgMHgzOCwgKGJ5dGUpIDB4MzIsCisgICAgICAgICAgICAoYnl0ZSkgMHgzNywgKGJ5dGUpIDB4MzIsIChieXRlKSAweDMzLCAoYnl0ZSkgMHgzMywgKGJ5dGUpIDB4MzEsIChieXRlKSAweDMyLAorICAgICAgICAgICAgKGJ5dGUpIDB4MzksIChieXRlKSAweDVhLCAoYnl0ZSkgMHgxNywgKGJ5dGUpIDB4MGQsIChieXRlKSAweDMyLCAoYnl0ZSkgMHgzMywKKyAgICAgICAgICAgIChieXRlKSAweDMwLCAoYnl0ZSkgMHgzOCwgKGJ5dGUpIDB4MzIsIChieXRlKSAweDM1LCAoYnl0ZSkgMHgzMiwgKGJ5dGUpIDB4MzMsCisgICAgICAgICAgICAoYnl0ZSkgMHgzMywgKGJ5dGUpIDB4MzEsIChieXRlKSAweDMyLCAoYnl0ZSkgMHgzOSwgKGJ5dGUpIDB4NWEsIChieXRlKSAweDMwLAorICAgICAgICAgICAgKGJ5dGUpIDB4NWUsIChieXRlKSAweDMxLCAoYnl0ZSkgMHgwYiwgKGJ5dGUpIDB4MzAsIChieXRlKSAweDA5LCAoYnl0ZSkgMHgwNiwKKyAgICAgICAgICAgIChieXRlKSAweDAzLCAoYnl0ZSkgMHg1NSwgKGJ5dGUpIDB4MDQsIChieXRlKSAweDA2LCAoYnl0ZSkgMHgxMywgKGJ5dGUpIDB4MDIsCisgICAgICAgICAgICAoYnl0ZSkgMHg0MSwgKGJ5dGUpIDB4NTUsIChieXRlKSAweDMxLCAoYnl0ZSkgMHgxMywgKGJ5dGUpIDB4MzAsIChieXRlKSAweDExLAorICAgICAgICAgICAgKGJ5dGUpIDB4MDYsIChieXRlKSAweDAzLCAoYnl0ZSkgMHg1NSwgKGJ5dGUpIDB4MDQsIChieXRlKSAweDA4LCAoYnl0ZSkgMHgwYywKKyAgICAgICAgICAgIChieXRlKSAweDBhLCAoYnl0ZSkgMHg1MywgKGJ5dGUpIDB4NmYsIChieXRlKSAweDZkLCAoYnl0ZSkgMHg2NSwgKGJ5dGUpIDB4MmQsCisgICAgICAgICAgICAoYnl0ZSkgMHg1MywgKGJ5dGUpIDB4NzQsIChieXRlKSAweDYxLCAoYnl0ZSkgMHg3NCwgKGJ5dGUpIDB4NjUsIChieXRlKSAweDMxLAorICAgICAgICAgICAgKGJ5dGUpIDB4MjEsIChieXRlKSAweDMwLCAoYnl0ZSkgMHgxZiwgKGJ5dGUpIDB4MDYsIChieXRlKSAweDAzLCAoYnl0ZSkgMHg1NSwKKyAgICAgICAgICAgIChieXRlKSAweDA0LCAoYnl0ZSkgMHgwYSwgKGJ5dGUpIDB4MGMsIChieXRlKSAweDE4LCAoYnl0ZSkgMHg0OSwgKGJ5dGUpIDB4NmUsCisgICAgICAgICAgICAoYnl0ZSkgMHg3NCwgKGJ5dGUpIDB4NjUsIChieXRlKSAweDcyLCAoYnl0ZSkgMHg2ZSwgKGJ5dGUpIDB4NjUsIChieXRlKSAweDc0LAorICAgICAgICAgICAgKGJ5dGUpIDB4MjAsIChieXRlKSAweDU3LCAoYnl0ZSkgMHg2OSwgKGJ5dGUpIDB4NjQsIChieXRlKSAweDY3LCAoYnl0ZSkgMHg2OSwKKyAgICAgICAgICAgIChieXRlKSAweDc0LCAoYnl0ZSkgMHg3MywgKGJ5dGUpIDB4MjAsIChieXRlKSAweDUwLCAoYnl0ZSkgMHg3NCwgKGJ5dGUpIDB4NzksCisgICAgICAgICAgICAoYnl0ZSkgMHgyMCwgKGJ5dGUpIDB4NGMsIChieXRlKSAweDc0LCAoYnl0ZSkgMHg2NCwgKGJ5dGUpIDB4MzEsIChieXRlKSAweDE3LAorICAgICAgICAgICAgKGJ5dGUpIDB4MzAsIChieXRlKSAweDE1LCAoYnl0ZSkgMHgwNiwgKGJ5dGUpIDB4MDMsIChieXRlKSAweDU1LCAoYnl0ZSkgMHgwNCwKKyAgICAgICAgICAgIChieXRlKSAweDAzLCAoYnl0ZSkgMHgwYywgKGJ5dGUpIDB4MGUsIChieXRlKSAweDYzLCAoYnl0ZSkgMHg2MSwgKGJ5dGUpIDB4MmUsCisgICAgICAgICAgICAoYnl0ZSkgMHg2NSwgKGJ5dGUpIDB4NzgsIChieXRlKSAweDYxLCAoYnl0ZSkgMHg2ZCwgKGJ5dGUpIDB4NzAsIChieXRlKSAweDZjLAorICAgICAgICAgICAgKGJ5dGUpIDB4NjUsIChieXRlKSAweDJlLCAoYnl0ZSkgMHg2MywgKGJ5dGUpIDB4NmYsIChieXRlKSAweDZkLCAoYnl0ZSkgMHgzMCwKKyAgICAgICAgICAgIChieXRlKSAweDgxLCAoYnl0ZSkgMHg5ZiwgKGJ5dGUpIDB4MzAsIChieXRlKSAweDBkLCAoYnl0ZSkgMHgwNiwgKGJ5dGUpIDB4MDksCisgICAgICAgICAgICAoYnl0ZSkgMHgyYSwgKGJ5dGUpIDB4ODYsIChieXRlKSAweDQ4LCAoYnl0ZSkgMHg4NiwgKGJ5dGUpIDB4ZjcsIChieXRlKSAweDBkLAorICAgICAgICAgICAgKGJ5dGUpIDB4MDEsIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4MDUsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMywKKyAgICAgICAgICAgIChieXRlKSAweDgxLCAoYnl0ZSkgMHg4ZCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDMwLCAoYnl0ZSkgMHg4MSwgKGJ5dGUpIDB4ODksCisgICAgICAgICAgICAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4ODEsIChieXRlKSAweDgxLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4YTQsIChieXRlKSAweGM3LAorICAgICAgICAgICAgKGJ5dGUpIDB4MDYsIChieXRlKSAweGJhLCAoYnl0ZSkgMHhkZiwgKGJ5dGUpIDB4MmIsIChieXRlKSAweGVlLCAoYnl0ZSkgMHhkMiwKKyAgICAgICAgICAgIChieXRlKSAweGI5LCAoYnl0ZSkgMHhlNCwgKGJ5dGUpIDB4NTIsIChieXRlKSAweDIxLCAoYnl0ZSkgMHg2OCwgKGJ5dGUpIDB4MmIsCisgICAgICAgICAgICAoYnl0ZSkgMHg4MywgKGJ5dGUpIDB4ZGYsIChieXRlKSAweGUzLCAoYnl0ZSkgMHg5YywgKGJ5dGUpIDB4MDgsIChieXRlKSAweDczLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZGQsIChieXRlKSAweDkwLCAoYnl0ZSkgMHhlYSwgKGJ5dGUpIDB4OTcsIChieXRlKSAweDBjLCAoYnl0ZSkgMHg5NiwKKyAgICAgICAgICAgIChieXRlKSAweDIwLCAoYnl0ZSkgMHhiMSwgKGJ5dGUpIDB4ZWUsIChieXRlKSAweDExLCAoYnl0ZSkgMHhkNSwgKGJ5dGUpIDB4ZDQsCisgICAgICAgICAgICAoYnl0ZSkgMHg3YywgKGJ5dGUpIDB4NDQsIChieXRlKSAweDk2LCAoYnl0ZSkgMHgyZSwgKGJ5dGUpIDB4NmUsIChieXRlKSAweGEyLAorICAgICAgICAgICAgKGJ5dGUpIDB4YjIsIChieXRlKSAweGEzLCAoYnl0ZSkgMHg0YiwgKGJ5dGUpIDB4MGYsIChieXRlKSAweDMyLCAoYnl0ZSkgMHg5MCwKKyAgICAgICAgICAgIChieXRlKSAweGFmLCAoYnl0ZSkgMHg1YywgKGJ5dGUpIDB4NmYsIChieXRlKSAweDAwLCAoYnl0ZSkgMHg4OCwgKGJ5dGUpIDB4NDUsCisgICAgICAgICAgICAoYnl0ZSkgMHg0ZSwgKGJ5dGUpIDB4OWIsIChieXRlKSAweDI2LCAoYnl0ZSkgMHhjMSwgKGJ5dGUpIDB4OTQsIChieXRlKSAweDNjLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZmUsIChieXRlKSAweDEwLCAoYnl0ZSkgMHhiZCwgKGJ5dGUpIDB4ZGEsIChieXRlKSAweGYyLCAoYnl0ZSkgMHg4ZCwKKyAgICAgICAgICAgIChieXRlKSAweDAzLCAoYnl0ZSkgMHg1MiwgKGJ5dGUpIDB4MzIsIChieXRlKSAweDExLCAoYnl0ZSkgMHhmZiwgKGJ5dGUpIDB4ZjYsCisgICAgICAgICAgICAoYnl0ZSkgMHhmOSwgKGJ5dGUpIDB4NmUsIChieXRlKSAweDhmLCAoYnl0ZSkgMHgwZiwgKGJ5dGUpIDB4YzgsIChieXRlKSAweDBhLAorICAgICAgICAgICAgKGJ5dGUpIDB4NDgsIChieXRlKSAweDM5LCAoYnl0ZSkgMHgzMywgKGJ5dGUpIDB4YjksIChieXRlKSAweDBjLCAoYnl0ZSkgMHhiMywKKyAgICAgICAgICAgIChieXRlKSAweDJiLCAoYnl0ZSkgMHhhYiwgKGJ5dGUpIDB4N2QsIChieXRlKSAweDc5LCAoYnl0ZSkgMHg2ZiwgKGJ5dGUpIDB4NTcsCisgICAgICAgICAgICAoYnl0ZSkgMHg1YiwgKGJ5dGUpIDB4YjgsIChieXRlKSAweDg0LCAoYnl0ZSkgMHhiNiwgKGJ5dGUpIDB4Y2MsIChieXRlKSAweGU4LAorICAgICAgICAgICAgKGJ5dGUpIDB4MzAsIChieXRlKSAweDc4LCAoYnl0ZSkgMHhmZiwgKGJ5dGUpIDB4OTIsIChieXRlKSAweGU1LCAoYnl0ZSkgMHg0MywKKyAgICAgICAgICAgIChieXRlKSAweDJlLCAoYnl0ZSkgMHhlZiwgKGJ5dGUpIDB4NjYsIChieXRlKSAweDk4LCAoYnl0ZSkgMHhiNCwgKGJ5dGUpIDB4ZmUsCisgICAgICAgICAgICAoYnl0ZSkgMHhhMiwgKGJ5dGUpIDB4NDAsIChieXRlKSAweGYyLCAoYnl0ZSkgMHgxZiwgKGJ5dGUpIDB4ZDAsIChieXRlKSAweDg2LAorICAgICAgICAgICAgKGJ5dGUpIDB4MTYsIChieXRlKSAweGM4LCAoYnl0ZSkgMHg0NSwgKGJ5dGUpIDB4YzQsIChieXRlKSAweDUyLCAoYnl0ZSkgMHhjYiwKKyAgICAgICAgICAgIChieXRlKSAweDMxLCAoYnl0ZSkgMHg1YywgKGJ5dGUpIDB4OWYsIChieXRlKSAweDMyLCAoYnl0ZSkgMHgzYiwgKGJ5dGUpIDB4ZjcsCisgICAgICAgICAgICAoYnl0ZSkgMHgxOSwgKGJ5dGUpIDB4MDgsIChieXRlKSAweGM3LCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MjEsIChieXRlKSAweDdkLAorICAgICAgICAgICAgKGJ5dGUpIDB4MDIsIChieXRlKSAweDAzLCAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAxLCAoYnl0ZSkgMHhhMywKKyAgICAgICAgICAgIChieXRlKSAweDUwLCAoYnl0ZSkgMHgzMCwgKGJ5dGUpIDB4NGUsIChieXRlKSAweDMwLCAoYnl0ZSkgMHgxZCwgKGJ5dGUpIDB4MDYsCisgICAgICAgICAgICAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4NTUsIChieXRlKSAweDFkLCAoYnl0ZSkgMHgwZSwgKGJ5dGUpIDB4MDQsIChieXRlKSAweDE2LAorICAgICAgICAgICAgKGJ5dGUpIDB4MDQsIChieXRlKSAweDE0LCAoYnl0ZSkgMHg0NywgKGJ5dGUpIDB4ODIsIChieXRlKSAweGEzLCAoYnl0ZSkgMHhmMSwKKyAgICAgICAgICAgIChieXRlKSAweGMyLCAoYnl0ZSkgMHg3ZSwgKGJ5dGUpIDB4M2EsIChieXRlKSAweGRlLCAoYnl0ZSkgMHg0ZiwgKGJ5dGUpIDB4MzAsCisgICAgICAgICAgICAoYnl0ZSkgMHg0YywgKGJ5dGUpIDB4N2YsIChieXRlKSAweDcyLCAoYnl0ZSkgMHg4MSwgKGJ5dGUpIDB4MTUsIChieXRlKSAweDMyLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZGEsIChieXRlKSAweDdmLCAoYnl0ZSkgMHg1OCwgKGJ5dGUpIDB4MTgsIChieXRlKSAweDMwLCAoYnl0ZSkgMHgxZiwKKyAgICAgICAgICAgIChieXRlKSAweDA2LCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4NTUsIChieXRlKSAweDFkLCAoYnl0ZSkgMHgyMywgKGJ5dGUpIDB4MDQsCisgICAgICAgICAgICAoYnl0ZSkgMHgxOCwgKGJ5dGUpIDB4MzAsIChieXRlKSAweDE2LCAoYnl0ZSkgMHg4MCwgKGJ5dGUpIDB4MTQsIChieXRlKSAweDQ3LAorICAgICAgICAgICAgKGJ5dGUpIDB4ODIsIChieXRlKSAweGEzLCAoYnl0ZSkgMHhmMSwgKGJ5dGUpIDB4YzIsIChieXRlKSAweDdlLCAoYnl0ZSkgMHgzYSwKKyAgICAgICAgICAgIChieXRlKSAweGRlLCAoYnl0ZSkgMHg0ZiwgKGJ5dGUpIDB4MzAsIChieXRlKSAweDRjLCAoYnl0ZSkgMHg3ZiwgKGJ5dGUpIDB4NzIsCisgICAgICAgICAgICAoYnl0ZSkgMHg4MSwgKGJ5dGUpIDB4MTUsIChieXRlKSAweDMyLCAoYnl0ZSkgMHhkYSwgKGJ5dGUpIDB4N2YsIChieXRlKSAweDU4LAorICAgICAgICAgICAgKGJ5dGUpIDB4MTgsIChieXRlKSAweDMwLCAoYnl0ZSkgMHgwYywgKGJ5dGUpIDB4MDYsIChieXRlKSAweDAzLCAoYnl0ZSkgMHg1NSwKKyAgICAgICAgICAgIChieXRlKSAweDFkLCAoYnl0ZSkgMHgxMywgKGJ5dGUpIDB4MDQsIChieXRlKSAweDA1LCAoYnl0ZSkgMHgzMCwgKGJ5dGUpIDB4MDMsCisgICAgICAgICAgICAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4MDEsIChieXRlKSAweGZmLCAoYnl0ZSkgMHgzMCwgKGJ5dGUpIDB4MGQsIChieXRlKSAweDA2LAorICAgICAgICAgICAgKGJ5dGUpIDB4MDksIChieXRlKSAweDJhLCAoYnl0ZSkgMHg4NiwgKGJ5dGUpIDB4NDgsIChieXRlKSAweDg2LCAoYnl0ZSkgMHhmNywKKyAgICAgICAgICAgIChieXRlKSAweDBkLCAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4MDEsIChieXRlKSAweDA1LCAoYnl0ZSkgMHgwNSwgKGJ5dGUpIDB4MDAsCisgICAgICAgICAgICAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4ODEsIChieXRlKSAweDgxLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDgsIChieXRlKSAweDdmLAorICAgICAgICAgICAgKGJ5dGUpIDB4NmEsIChieXRlKSAweDQ4LCAoYnl0ZSkgMHg5MCwgKGJ5dGUpIDB4N2IsIChieXRlKSAweDliLCAoYnl0ZSkgMHg3MiwKKyAgICAgICAgICAgIChieXRlKSAweDEzLCAoYnl0ZSkgMHhhNywgKGJ5dGUpIDB4ZWYsIChieXRlKSAweDZiLCAoYnl0ZSkgMHgwYiwgKGJ5dGUpIDB4NTksCisgICAgICAgICAgICAoYnl0ZSkgMHhlNSwgKGJ5dGUpIDB4NDksIChieXRlKSAweDcyLCAoYnl0ZSkgMHgzYSwgKGJ5dGUpIDB4YzgsIChieXRlKSAweDg0LAorICAgICAgICAgICAgKGJ5dGUpIDB4Y2MsIChieXRlKSAweDIzLCAoYnl0ZSkgMHgxOCwgKGJ5dGUpIDB4NGMsIChieXRlKSAweGVjLCAoYnl0ZSkgMHhjNywKKyAgICAgICAgICAgIChieXRlKSAweGVmLCAoYnl0ZSkgMHhjYiwgKGJ5dGUpIDB4YTcsIChieXRlKSAweGJlLCAoYnl0ZSkgMHhlNCwgKGJ5dGUpIDB4ZWYsCisgICAgICAgICAgICAoYnl0ZSkgMHg4ZiwgKGJ5dGUpIDB4YzYsIChieXRlKSAweDA2LCAoYnl0ZSkgMHg4YywgKGJ5dGUpIDB4YzAsIChieXRlKSAweGU0LAorICAgICAgICAgICAgKGJ5dGUpIDB4MmYsIChieXRlKSAweDJhLCAoYnl0ZSkgMHhjMCwgKGJ5dGUpIDB4MzUsIChieXRlKSAweDdkLCAoYnl0ZSkgMHg1ZSwKKyAgICAgICAgICAgIChieXRlKSAweDE5LCAoYnl0ZSkgMHgyOSwgKGJ5dGUpIDB4OGMsIChieXRlKSAweGI5LCAoYnl0ZSkgMHhmMSwgKGJ5dGUpIDB4MWUsCisgICAgICAgICAgICAoYnl0ZSkgMHhhZiwgKGJ5dGUpIDB4ODIsIChieXRlKSAweGQ4LCAoYnl0ZSkgMHhlMywgKGJ5dGUpIDB4ODgsIChieXRlKSAweGUxLAorICAgICAgICAgICAgKGJ5dGUpIDB4MzEsIChieXRlKSAweGM4LCAoYnl0ZSkgMHg4MiwgKGJ5dGUpIDB4MWYsIChieXRlKSAweDgzLCAoYnl0ZSkgMHhhOSwKKyAgICAgICAgICAgIChieXRlKSAweGRlLCAoYnl0ZSkgMHhmZSwgKGJ5dGUpIDB4NGIsIChieXRlKSAweGUyLCAoYnl0ZSkgMHg3OCwgKGJ5dGUpIDB4NjQsCisgICAgICAgICAgICAoYnl0ZSkgMHhlZCwgKGJ5dGUpIDB4YTQsIChieXRlKSAweDdiLCAoYnl0ZSkgMHhlZSwgKGJ5dGUpIDB4OGQsIChieXRlKSAweDcxLAorICAgICAgICAgICAgKGJ5dGUpIDB4MWIsIChieXRlKSAweDQ0LCAoYnl0ZSkgMHhlNiwgKGJ5dGUpIDB4YjcsIChieXRlKSAweGU4LCAoYnl0ZSkgMHhjNSwKKyAgICAgICAgICAgIChieXRlKSAweDlhLCAoYnl0ZSkgMHg5MywgKGJ5dGUpIDB4OTIsIChieXRlKSAweDZmLCAoYnl0ZSkgMHg2ZiwgKGJ5dGUpIDB4ZGIsCisgICAgICAgICAgICAoYnl0ZSkgMHhiZCwgKGJ5dGUpIDB4ZDcsIChieXRlKSAweDAzLCAoYnl0ZSkgMHg4NSwgKGJ5dGUpIDB4YTksIChieXRlKSAweDVmLAorICAgICAgICAgICAgKGJ5dGUpIDB4NTMsIChieXRlKSAweDVmLCAoYnl0ZSkgMHg1ZCwgKGJ5dGUpIDB4MzAsIChieXRlKSAweGM2LCAoYnl0ZSkgMHhkOSwKKyAgICAgICAgICAgIChieXRlKSAweGNlLCAoYnl0ZSkgMHgzNCwgKGJ5dGUpIDB4YTgsIChieXRlKSAweGJlLCAoYnl0ZSkgMHgzMSwgKGJ5dGUpIDB4NDcsCisgICAgICAgICAgICAoYnl0ZSkgMHgxYywgKGJ5dGUpIDB4YTQsIChieXRlKSAweDdmLCAoYnl0ZSkgMHhjMCwgKGJ5dGUpIDB4MmMsIChieXRlKSAweGJjLAorICAgICAgICAgICAgKGJ5dGUpIDB4ZmUsIChieXRlKSAweDFhLCAoYnl0ZSkgMHgzMSwgKGJ5dGUpIDB4ZDgsIChieXRlKSAweDc3LCAoYnl0ZSkgMHg0ZCwKKyAgICAgICAgICAgIChieXRlKSAweGZjLCAoYnl0ZSkgMHg0NSwgKGJ5dGUpIDB4ODQsIChieXRlKSAweGZjLCAoYnl0ZSkgMHg0NSwgKGJ5dGUpIDB4MTIsCisgICAgICAgICAgICAoYnl0ZSkgMHhhYiwgKGJ5dGUpIDB4NTAsIChieXRlKSAweGU0LCAoYnl0ZSkgMHg0NSwgKGJ5dGUpIDB4ZTUsIChieXRlKSAweDExCisgICAgICAgIH07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0ZlYXR1cmVVdGlsLmphdmEgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvRmVhdHVyZVV0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODYwYjk2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0ZlYXR1cmVVdGlsLmphdmEKQEAgLTAsMCArMSwxMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWw7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uRmVhdHVyZUluZm87CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIERldmljZS1zaWRlIHV0aWxpdHkgY2xhc3MgZm9yIGRldGVjdGluZyBzeXN0ZW0gZmVhdHVyZXMKKyAqLworcHVibGljIGNsYXNzIEZlYXR1cmVVdGlsIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVE9NT1RJVkVfRkVBVFVSRSA9ICJhbmRyb2lkLmhhcmR3YXJlLnR5cGUuYXV0b21vdGl2ZSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVBTkJBQ0tfRkVBVFVSRSA9ICJhbmRyb2lkLnNvZnR3YXJlLmxlYW5iYWNrIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT1dfUkFNX0ZFQVRVUkUgPSAiYW5kcm9pZC5oYXJkd2FyZS5yYW0ubG93IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURUxFUEhPTllfRkVBVFVSRSA9ICJhbmRyb2lkLmhhcmR3YXJlLnRlbGVwaG9ueSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFZfRkVBVFVSRSA9ICJhbmRyb2lkLmhhcmR3YXJlLnR5cGUudGVsZXZpc2lvbiI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FUQ0hfRkVBVFVSRSA9ICJhbmRyb2lkLmhhcmR3YXJlLnR5cGUud2F0Y2giOworCisKKyAgICAvKiogUmV0dXJucyB0cnVlIGlmIHRoZSBkZXZpY2UgaGFzIGEgZ2l2ZW4gc3lzdGVtIGZlYXR1cmUgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzU3lzdGVtRmVhdHVyZShTdHJpbmcgZmVhdHVyZSkgeworICAgICAgICByZXR1cm4gZ2V0UGFja2FnZU1hbmFnZXIoKS5oYXNTeXN0ZW1GZWF0dXJlKGZlYXR1cmUpOworICAgIH0KKworICAgIC8qKiBSZXR1cm5zIHRydWUgaWYgdGhlIGRldmljZSBoYXMgYW55IGZlYXR1cmUgaW4gYSBnaXZlbiBjb2xsZWN0aW9uIG9mIHN5c3RlbSBmZWF0dXJlcyAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNBbnlTeXN0ZW1GZWF0dXJlKFN0cmluZy4uLiBmZWF0dXJlcykgeworICAgICAgICBQYWNrYWdlTWFuYWdlciBwbSA9IGdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgIGZvciAoU3RyaW5nIGZlYXR1cmUgOiBmZWF0dXJlcykgeworICAgICAgICAgICAgaWYgKHBtLmhhc1N5c3RlbUZlYXR1cmUoZmVhdHVyZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGV2aWNlIGhhcyBhbGwgZmVhdHVyZXMgaW4gYSBnaXZlbiBjb2xsZWN0aW9uIG9mIHN5c3RlbSBmZWF0dXJlcyAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNBbGxTeXN0ZW1GZWF0dXJlcyhTdHJpbmcuLi4gZmVhdHVyZXMpIHsKKyAgICAgICAgUGFja2FnZU1hbmFnZXIgcG0gPSBnZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICBmb3IgKFN0cmluZyBmZWF0dXJlIDogZmVhdHVyZXMpIHsKKyAgICAgICAgICAgIGlmICghcG0uaGFzU3lzdGVtRmVhdHVyZShmZWF0dXJlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyBhbGwgc3lzdGVtIGZlYXR1cmVzIG9mIHRoZSBkZXZpY2UgKi8KKyAgICBwdWJsaWMgc3RhdGljIFNldDxTdHJpbmc+IGdldEFsbEZlYXR1cmVzKCkgeworICAgICAgICBTZXQ8U3RyaW5nPiBhbGxGZWF0dXJlcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICAgICAgZm9yIChGZWF0dXJlSW5mbyBmaSA6IGdldFBhY2thZ2VNYW5hZ2VyKCkuZ2V0U3lzdGVtQXZhaWxhYmxlRmVhdHVyZXMoKSkgeworICAgICAgICAgICAgYWxsRmVhdHVyZXMuYWRkKGZpLm5hbWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhbGxGZWF0dXJlczsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyB0cnVlIGlmIHRoZSBkZXZpY2UgaGFzIGZlYXR1cmUgVFZfRkVBVFVSRSBvciBmZWF0dXJlIExFQU5CQUNLX0ZFQVRVUkUgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUVigpIHsKKyAgICAgICAgcmV0dXJuIGhhc0FueVN5c3RlbUZlYXR1cmUoVFZfRkVBVFVSRSwgTEVBTkJBQ0tfRkVBVFVSRSk7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGV2aWNlIGhhcyBmZWF0dXJlIFdBVENIX0ZFQVRVUkUgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNXYXRjaCgpIHsKKyAgICAgICAgcmV0dXJuIGhhc1N5c3RlbUZlYXR1cmUoV0FUQ0hfRkVBVFVSRSk7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGV2aWNlIGhhcyBmZWF0dXJlIEFVVE9NT1RJVkVfRkVBVFVSRSAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0F1dG9tb3RpdmUoKSB7CisgICAgICAgIHJldHVybiBoYXNTeXN0ZW1GZWF0dXJlKEFVVE9NT1RJVkVfRkVBVFVSRSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVnJIZWFkc2V0KCkgeworICAgICAgICBpbnQgbWFza2VkVWlNb2RlID0gKGdldENvbmZpZ3VyYXRpb24oKS51aU1vZGUgJiBDb25maWd1cmF0aW9uLlVJX01PREVfVFlQRV9NQVNLKTsKKyAgICAgICAgcmV0dXJuIChtYXNrZWRVaU1vZGUgPT0gQ29uZmlndXJhdGlvbi5VSV9NT0RFX1RZUEVfVlJfSEVBRFNFVCk7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGV2aWNlIGlzIGEgbG93IHJhbSBkZXZpY2U6CisgICAgICogIDEuIEFQSSBsZXZlbCAmZ3Q7PSBPX01SMQorICAgICAqICAyLiBkZXZpY2UgaGFzIGZlYXR1cmUgTE9XX1JBTV9GRUFUVVJFCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTG93UmFtKCkgeworICAgICAgICByZXR1cm4gQXBpTGV2ZWxVdGlsLmlzQXRMZWFzdChCdWlsZC5WRVJTSU9OX0NPREVTLk9fTVIxKSAmJgorICAgICAgICAgICAgICAgIGhhc1N5c3RlbUZlYXR1cmUoTE9XX1JBTV9GRUFUVVJFKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBDb250ZXh0IGdldENvbnRleHQoKSB7CisgICAgICAgIHJldHVybiBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKS5nZXRUYXJnZXRDb250ZXh0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgUGFja2FnZU1hbmFnZXIgZ2V0UGFja2FnZU1hbmFnZXIoKSB7CisgICAgICAgIHJldHVybiBnZXRDb250ZXh0KCkuZ2V0UGFja2FnZU1hbmFnZXIoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24oKSB7CisgICAgICAgIHJldHVybiBnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0Q29uZmlndXJhdGlvbigpOworICAgIH0KKworICAgIC8qKiBSZXR1cm5zIHRydWUgaWYgdGhlIGRldmljZSBoYXMgZmVhdHVyZSBURUxFUEhPTllfRkVBVFVSRSAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNUZWxlcGhvbnkoKSB7CisgICAgICAgIHJldHVybiBoYXNTeXN0ZW1GZWF0dXJlKFRFTEVQSE9OWV9GRUFUVVJFKTsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyB0cnVlIGlmIHRoZSBkZXZpY2UgaGFzIGZlYXR1cmUgRkVBVFVSRV9NSUNST1BIT05FICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGhhc01pY3JvcGhvbmUoKSB7CisgICAgICAgIHJldHVybiBoYXNTeXN0ZW1GZWF0dXJlKGdldFBhY2thZ2VNYW5hZ2VyKCkuRkVBVFVSRV9NSUNST1BIT05FKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvRmlsZUNvcHlIZWxwZXIuamF2YSBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9GaWxlQ29weUhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1OGRiZDAKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvRmlsZUNvcHlIZWxwZXIuamF2YQpAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworLyoqCisgKiBGaWxlQ29weUhlbHBlciBpcyB1c2VkIHRvIGNvcHkgZmlsZXMgZnJvbSByZXNvdXJjZXMgdG8gdGhlCisgKiBhcHBsaWNhdGlvbiBkaXJlY3RvcnkgYW5kIHJlc3BvbnNpYmxlIGZvciBkZWxldGluZyB0aGUgZmlsZXMuCisgKgorICogQHNlZSBNZWRpYVN0b3JlX1ZpZGVvVGVzdAorICogQHNlZSBNZWRpYVN0b3JlX0ltYWdlc19NZWRpYVRlc3QKKyAqIEBzZWUgTWVkaWFTdG9yZV9JbWFnZXNfVGh1bWJuYWlsc1Rlc3QKKyAqLworcHVibGljIGNsYXNzIEZpbGVDb3B5SGVscGVyIHsKKyAgICAvKiogVGhlIGNvbnRleHQuICovCisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworCisgICAgLyoqIFRoZSBmaWxlcyBhZGRlZC4gKi8KKyAgICBwcml2YXRlIEFycmF5TGlzdDxTdHJpbmc+IG1GaWxlc0xpc3Q7CisKKyAgICAvKioKKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZmlsZSBjb3B5IGhlbHBlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBjb250ZXh0CisgICAgICovCisgICAgcHVibGljIEZpbGVDb3B5SGVscGVyKENvbnRleHQgY29udGV4dCkgeworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIG1GaWxlc0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb3B5IHRoZSBmaWxlIGZyb20gdGhlIHJlc291cmNlcyB3aXRoIGEgZmlsZW5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzSWQgdGhlIHJlcyBpZAorICAgICAqIEBwYXJhbSBmaWxlTmFtZSB0aGUgZmlsZSBuYW1lCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBkZXN0aW5hdGlvbiBmaWxlCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgY29weShpbnQgcmVzSWQsIFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSW5wdXRTdHJlYW0gc291cmNlID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkub3BlblJhd1Jlc291cmNlKHJlc0lkKTsKKyAgICAgICAgT3V0cHV0U3RyZWFtIHRhcmdldCA9IG1Db250ZXh0Lm9wZW5GaWxlT3V0cHV0KGZpbGVOYW1lLCBDb250ZXh0Lk1PREVfV09STERfUkVBREFCTEUpOworICAgICAgICBjb3B5RmlsZShzb3VyY2UsIHRhcmdldCk7CisgICAgICAgIG1GaWxlc0xpc3QuYWRkKGZpbGVOYW1lKTsKKyAgICAgICAgcmV0dXJuIG1Db250ZXh0LmdldEZpbGVTdHJlYW1QYXRoKGZpbGVOYW1lKS5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjb3B5VG9FeHRlcm5hbFN0b3JhZ2UoaW50IHJlc0lkLCBGaWxlIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIElucHV0U3RyZWFtIHNvdXJjZSA9IG1Db250ZXh0LmdldFJlc291cmNlcygpLm9wZW5SYXdSZXNvdXJjZShyZXNJZCk7CisgICAgICAgIE91dHB1dFN0cmVhbSB0YXJnZXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShwYXRoKTsKKyAgICAgICAgY29weUZpbGUoc291cmNlLCB0YXJnZXQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjb3B5RmlsZShJbnB1dFN0cmVhbSBzb3VyY2UsIE91dHB1dFN0cmVhbSB0YXJnZXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbMTAyNF07CisgICAgICAgICAgICBmb3IgKGludCBsZW4gPSBzb3VyY2UucmVhZChidWZmZXIpOyBsZW4gPiAwOyBsZW4gPSBzb3VyY2UucmVhZChidWZmZXIpKSB7CisgICAgICAgICAgICAgICAgdGFyZ2V0LndyaXRlKGJ1ZmZlciwgMCwgbGVuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChzb3VyY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNvdXJjZS5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRhcmdldCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGFyZ2V0LmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWxldGUgYWxsIHRoZSBmaWxlcyBjb3BpZWQgYnkgdGhlIGhlbHBlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpeworICAgICAgICBmb3IgKFN0cmluZyBwYXRoIDogbUZpbGVzTGlzdCkgeworICAgICAgICAgICAgbUNvbnRleHQuZGVsZXRlRmlsZShwYXRoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9GaWxlVXRpbHMuamF2YSBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9GaWxlVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWFkYTAxCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0ZpbGVVdGlscy5qYXZhCkBAIC0wLDAgKzEsMTYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKKy8qKiBCaXRzIGFuZCBwaWVjZXMgY29waWVkIGZyb20gaGlkZGVuIEFQSSBvZiBhbmRyb2lkLm9zLkZpbGVVdGlscy4gKi8KK3B1YmxpYyBjbGFzcyBGaWxlVXRpbHMgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU19JRk1UICA9IDAxNzAwMDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU19JRlNPQ0sgPSAwMTQwMDAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNfSUZMTksgPSAwMTIwMDAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNfSUZSRUcgPSAwMTAwMDAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNfSUZCTEsgPSAwMDYwMDAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNfSUZESVIgPSAwMDQwMDAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNfSUZDSFIgPSAwMDIwMDAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNfSUZJRk8gPSAwMDEwMDAwOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU19JU1VJRCA9IDAwMDQwMDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU19JU0dJRCA9IDAwMDIwMDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU19JU1ZUWCA9IDAwMDEwMDA7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTX0lSV1hVID0gMDA3MDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU19JUlVTUiA9IDAwNDAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNfSVdVU1IgPSAwMDIwMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTX0lYVVNSID0gMDAxMDA7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTX0lSV1hHID0gMDAwNzA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU19JUkdSUCA9IDAwMDQwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNfSVdHUlAgPSAwMDAyMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTX0lYR1JQID0gMDAwMTA7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTX0lSV1hPID0gMDAwMDc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU19JUk9USCA9IDAwMDA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNfSVdPVEggPSAwMDAwMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTX0lYT1RIID0gMDAwMDE7CisKKyAgICBzdGF0aWMgeworICAgICAgICBTeXN0ZW0ubG9hZExpYnJhcnkoImN0c19qbmkiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZpbGVTdGF0dXMgeworCisgICAgICAgIHB1YmxpYyBpbnQgZGV2OworICAgICAgICBwdWJsaWMgaW50IGlubzsKKyAgICAgICAgcHVibGljIGludCBtb2RlOworICAgICAgICBwdWJsaWMgaW50IG5saW5rOworICAgICAgICBwdWJsaWMgaW50IHVpZDsKKyAgICAgICAgcHVibGljIGludCBnaWQ7CisgICAgICAgIHB1YmxpYyBpbnQgcmRldjsKKyAgICAgICAgcHVibGljIGxvbmcgc2l6ZTsKKyAgICAgICAgcHVibGljIGludCBibGtzaXplOworICAgICAgICBwdWJsaWMgbG9uZyBibG9ja3M7CisgICAgICAgIHB1YmxpYyBsb25nIGF0aW1lOworICAgICAgICBwdWJsaWMgbG9uZyBtdGltZTsKKyAgICAgICAgcHVibGljIGxvbmcgY3RpbWU7CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTW9kZUZsYWcoaW50IGZsYWcpIHsKKyAgICAgICAgICAgIGlmICgoKFNfSVJXWFUgfCBTX0lSV1hHIHwgU19JUldYTykgJiBmbGFnKSAhPSBmbGFnKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW5hcHByb3ByaWF0ZSBmbGFnICIgKyBmbGFnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAobW9kZSAmIGZsYWcpID09IGZsYWc7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc09mVHlwZShpbnQgdHlwZSkgeworICAgICAgICAgICAgaWYgKCh0eXBlICYgU19JRk1UKSAhPSB0eXBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biB0eXBlICIgKyB0eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAobW9kZSAmIFNfSUZNVCkgPT0gdHlwZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBwYXRoIG9mIHRoZSBmaWxlIHRvIHN0YXQKKyAgICAgKiBAcGFyYW0gc3RhdHVzIG9iamVjdCB0byBzZXQgdGhlIGZpZWxkcyBvbgorICAgICAqIEBwYXJhbSBzdGF0TGlua3Mgb3IgZG9uJ3Qgc3RhdCBsaW5rcyAobHN0YXQgdnMgc3RhdCkKKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgb3Igbm90IHdlIHdlcmUgYWJsZSB0byBzdGF0IHRoZSBmaWxlCisgICAgICovCisgICAgcHVibGljIG5hdGl2ZSBzdGF0aWMgYm9vbGVhbiBnZXRGaWxlU3RhdHVzKFN0cmluZyBwYXRoLCBGaWxlU3RhdHVzIHN0YXR1cywgYm9vbGVhbiBzdGF0TGlua3MpOworCisgICAgcHVibGljIG5hdGl2ZSBzdGF0aWMgU3RyaW5nIGdldFVzZXJOYW1lKGludCB1aWQpOworCisgICAgcHVibGljIG5hdGl2ZSBzdGF0aWMgU3RyaW5nIGdldEdyb3VwTmFtZShpbnQgZ2lkKTsKKworICAgIHB1YmxpYyBuYXRpdmUgc3RhdGljIGludCBzZXRQZXJtaXNzaW9ucyhTdHJpbmcgZmlsZSwgaW50IG1vZGUpOworCisgICAgLyoqCisgICAgICogQ29weSBkYXRhIGZyb20gYSBzb3VyY2Ugc3RyZWFtIHRvIGRlc3RGaWxlLgorICAgICAqIFJldHVybiB0cnVlIGlmIHN1Y2NlZWQsIHJldHVybiBmYWxzZSBpZiBmYWlsZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNvcHlUb0ZpbGUoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIEZpbGUgZGVzdEZpbGUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChkZXN0RmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgIGRlc3RGaWxlLmRlbGV0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShkZXN0RmlsZSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVs0MDk2XTsKKyAgICAgICAgICAgICAgICBpbnQgYnl0ZXNSZWFkOworICAgICAgICAgICAgICAgIHdoaWxlICgoYnl0ZXNSZWFkID0gaW5wdXRTdHJlYW0ucmVhZChidWZmZXIpKSA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZShidWZmZXIsIDAsIGJ5dGVzUmVhZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBvdXQuZmx1c2goKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBvdXQuZ2V0RkQoKS5zeW5jKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlRmlsZShGaWxlIGZpbGUsIGludCBudW1CeXRlcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSBwYXJlbnRGaWxlID0gZmlsZS5nZXRQYXJlbnRGaWxlKCk7CisgICAgICAgIGlmIChwYXJlbnRGaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHBhcmVudEZpbGUubWtkaXJzKCk7CisgICAgICAgIH0KKyAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlW251bUJ5dGVzXTsKKyAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXRwdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG91dHB1dC53cml0ZShidWZmZXIpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgb3V0cHV0LmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSByZWFkSW5wdXRTdHJlYW1GdWxseShJbnB1dFN0cmVhbSBpcykgeworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVszMjc2OF07CisgICAgICAgIGludCBjb3VudDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdoaWxlICgoY291bnQgPSBpcy5yZWFkKGJ1ZmZlcikpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgb3Mud3JpdGUoYnVmZmVyLCAwLCBjb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpcy5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gb3MudG9CeXRlQXJyYXkoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvSUJpbmRlclBhcmNlbGFibGUuamF2YSBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9JQmluZGVyUGFyY2VsYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzYzUzZmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvSUJpbmRlclBhcmNlbGFibGUuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKKworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CisKK3B1YmxpYyBjbGFzcyBJQmluZGVyUGFyY2VsYWJsZSBpbXBsZW1lbnRzIFBhcmNlbGFibGUgeworICAgIHB1YmxpYyBJQmluZGVyIGJpbmRlcjsKKworICAgIHB1YmxpYyBJQmluZGVyUGFyY2VsYWJsZShJQmluZGVyIHNvdXJjZSkgeworICAgICAgICBiaW5kZXIgPSBzb3VyY2U7CisgICAgfQorCisgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgZGVzdC53cml0ZVN0cm9uZ0JpbmRlcihiaW5kZXIpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPElCaW5kZXJQYXJjZWxhYmxlPgorICAgICAgICBDUkVBVE9SID0gbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxJQmluZGVyUGFyY2VsYWJsZT4oKSB7CisKKyAgICAgICAgcHVibGljIElCaW5kZXJQYXJjZWxhYmxlIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIHNvdXJjZSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBJQmluZGVyUGFyY2VsYWJsZShzb3VyY2UpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIElCaW5kZXJQYXJjZWxhYmxlW10gbmV3QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSUJpbmRlclBhcmNlbGFibGVbc2l6ZV07CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBJQmluZGVyUGFyY2VsYWJsZShQYXJjZWwgc291cmNlKSB7CisgICAgICAgIGJpbmRlciA9IHNvdXJjZS5yZWFkU3Ryb25nQmluZGVyKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0xvY2F0aW9uVXRpbHMuamF2YSBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9Mb2NhdGlvblV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIzMzg1MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9Mb2NhdGlvblV0aWxzLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsOworCitpbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitwdWJsaWMgY2xhc3MgTG9jYXRpb25VdGlscyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFRBRyA9ICJMb2NhdGlvblV0aWxzIjsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3Rlck1vY2tMb2NhdGlvblByb3ZpZGVyKEluc3RydW1lbnRhdGlvbiBpbnN0cnVtZW50YXRpb24sCisgICAgICAgICAgICBib29sZWFuIGVuYWJsZSkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIGNvbW1hbmQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBjb21tYW5kLmFwcGVuZCgiYXBwb3BzIHNldCAiKTsKKyAgICAgICAgY29tbWFuZC5hcHBlbmQoaW5zdHJ1bWVudGF0aW9uLmdldENvbnRleHQoKS5nZXRQYWNrYWdlTmFtZSgpKTsKKyAgICAgICAgY29tbWFuZC5hcHBlbmQoIiBhbmRyb2lkOm1vY2tfbG9jYXRpb24gIik7CisgICAgICAgIGNvbW1hbmQuYXBwZW5kKGVuYWJsZSA/ICJhbGxvdyIgOiAiZGVueSIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3lzdGVtVXRpbC5ydW5TaGVsbENvbW1hbmQoaW5zdHJ1bWVudGF0aW9uLCBjb21tYW5kLnRvU3RyaW5nKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvciBtYW5hZ2luZyBtb2NrIGxvY2F0aW9uIGFwcC4gQ29tbWFuZDogIiArIGNvbW1hbmQsIGUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL01lZGlhUGVyZlV0aWxzLmphdmEgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvTWVkaWFQZXJmVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjllOTlhCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL01lZGlhUGVyZlV0aWxzLmphdmEKQEAgLTAsMCArMSwxNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWw7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRm9ybWF0OworaW1wb3J0IGFuZHJvaWQudXRpbC5SYW5nZTsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuRGV2aWNlUmVwb3J0TG9nOworaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuUmVzdWx0VHlwZTsKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlJlc3VsdFVuaXQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK3B1YmxpYyBjbGFzcyBNZWRpYVBlcmZVdGlscyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVBlcmZVdGlscyI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU9WSU5HX0FWRVJBR0VfTlVNX0ZSQU1FUyA9IDEwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNT1ZJTkdfQVZFUkFHRV9XSU5ET1dfTVMgPSAxMDAwOworCisgICAgLy8gYWxsb3cgYSB2YXJpYW5jZSBvZiAyeCBmb3IgbWVhc3VyZWQgZnJhbWUgcmF0ZXMgKGUuZy4gaGFsZiBvZiBsb3dlci1saW1pdCB0byBkb3VibGUgb2YKKyAgICAvLyB1cHBlci1saW1pdCBvZiB0aGUgcHVibGlzaGVkIHZhbHVlcykuIEFsc28gYWxsb3cgYW4gZXh0cmEgMTAlIG1hcmdpbi4gVGhpcyBhbHNvIGFjdHMgYXMKKyAgICAvLyBhIGxpbWl0IGZvciB0aGUgc2l6ZSBvZiB0aGUgcHVibGlzaGVkIHJhdGVzIChlLmcuIHVwcGVyLWxpbWl0IC8gbG93ZXItbGltaXQgPD0gdG9sZXJhbmNlKS4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUgRlJBTUVSQVRFX1RPTEVSQU5DRSA9IDIuMCAqIDEuMTsKKworICAgIC8qCisgICAgICogIC0tLS0tLS0tLS0tLS0tLS0tLSBIRUxQRVIgTUVUSE9EUyBGT1IgQUNISUVWQUJMRSBGUkFNRSBSQVRFUyAtLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgKi8KKworICAgIC8qKiByZW1vdmVzIGJyYWNrZXRzIGZyb20gZm9ybWF0IHRvIGJlIGluY2x1ZGVkIGluIEpTT04uICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZvcm1hdEZvclJlcG9ydChNZWRpYUZvcm1hdCBmb3JtYXQpIHsKKyAgICAgICAgU3RyaW5nIGFzU3RyaW5nID0gIiIgKyBmb3JtYXQ7CisgICAgICAgIHJldHVybiBhc1N0cmluZy5zdWJzdHJpbmcoMSwgYXNTdHJpbmcubGVuZ3RoKCkgLSAxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIHBlcmZvcm1hbmNlIGhlYWRlciBpbmZvIHRvIHxsb2d8IGZvciB8Y29kZWNOYW1lfCwgfHJvdW5kfCwgfGNvbmZpZ0Zvcm1hdHwsIHxpbnB1dEZvcm1hdHwKKyAgICAgKiBhbmQgfG91dHB1dEZvcm1hdHwuIEFsc28gYXBwZW5kcyBzYW1lIHRvIHxtZXNzYWdlfCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0aW5nIGJhc2UgbWVzc2FnZQorICAgICAqIGZvciBsb2dnaW5nIHB1cnBvc2VzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGFkZFBlcmZvcm1hbmNlSGVhZGVyc1RvTG9nKAorICAgICAgICAgICAgRGV2aWNlUmVwb3J0TG9nIGxvZywgU3RyaW5nIG1lc3NhZ2UsIGludCByb3VuZCwgU3RyaW5nIGNvZGVjTmFtZSwKKyAgICAgICAgICAgIE1lZGlhRm9ybWF0IGNvbmZpZ0Zvcm1hdCwgTWVkaWFGb3JtYXQgaW5wdXRGb3JtYXQsIE1lZGlhRm9ybWF0IG91dHB1dEZvcm1hdCkgeworICAgICAgICBTdHJpbmcgbWltZSA9IGNvbmZpZ0Zvcm1hdC5nZXRTdHJpbmcoTWVkaWFGb3JtYXQuS0VZX01JTUUpOworICAgICAgICBpbnQgd2lkdGggPSBjb25maWdGb3JtYXQuZ2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfV0lEVEgpOworICAgICAgICBpbnQgaGVpZ2h0ID0gY29uZmlnRm9ybWF0LmdldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0hFSUdIVCk7CisKKyAgICAgICAgbG9nLmFkZFZhbHVlKCJyb3VuZCIsIHJvdW5kLCBSZXN1bHRUeXBlLk5FVVRSQUwsIFJlc3VsdFVuaXQuTk9ORSk7CisgICAgICAgIGxvZy5hZGRWYWx1ZSgiY29kZWNfbmFtZSIsIGNvZGVjTmFtZSwgUmVzdWx0VHlwZS5ORVVUUkFMLCBSZXN1bHRVbml0Lk5PTkUpOworICAgICAgICBsb2cuYWRkVmFsdWUoIm1pbWVfdHlwZSIsIG1pbWUsIFJlc3VsdFR5cGUuTkVVVFJBTCwgUmVzdWx0VW5pdC5OT05FKTsKKyAgICAgICAgbG9nLmFkZFZhbHVlKCJ3aWR0aCIsIHdpZHRoLCBSZXN1bHRUeXBlLk5FVVRSQUwsIFJlc3VsdFVuaXQuTk9ORSk7CisgICAgICAgIGxvZy5hZGRWYWx1ZSgiaGVpZ2h0IiwgaGVpZ2h0LCBSZXN1bHRUeXBlLk5FVVRSQUwsIFJlc3VsdFVuaXQuTk9ORSk7CisgICAgICAgIGxvZy5hZGRWYWx1ZSgiY29uZmlnX2Zvcm1hdCIsIGZvcm1hdEZvclJlcG9ydChjb25maWdGb3JtYXQpLAorICAgICAgICAgICAgICAgIFJlc3VsdFR5cGUuTkVVVFJBTCwgUmVzdWx0VW5pdC5OT05FKTsKKyAgICAgICAgbG9nLmFkZFZhbHVlKCJpbnB1dF9mb3JtYXQiLCBmb3JtYXRGb3JSZXBvcnQoaW5wdXRGb3JtYXQpLAorICAgICAgICAgICAgICAgIFJlc3VsdFR5cGUuTkVVVFJBTCwgUmVzdWx0VW5pdC5OT05FKTsKKyAgICAgICAgbG9nLmFkZFZhbHVlKCJvdXRwdXRfZm9ybWF0IiwgZm9ybWF0Rm9yUmVwb3J0KG91dHB1dEZvcm1hdCksCisgICAgICAgICAgICAgICAgUmVzdWx0VHlwZS5ORVVUUkFMLCBSZXN1bHRVbml0Lk5PTkUpOworCisgICAgICAgIG1lc3NhZ2UgKz0gIiBjb2RlYz0iICsgY29kZWNOYW1lICsgIiByb3VuZD0iICsgcm91bmQgKyAiIGNvbmZpZ0Zvcm1hdD0iICsgY29uZmlnRm9ybWF0CisgICAgICAgICAgICAgICAgKyAiIGlucHV0Rm9ybWF0PSIgKyBpbnB1dEZvcm1hdCArICIgb3V0cHV0Rm9ybWF0PSIgKyBvdXRwdXRGb3JtYXQ7CisKKyAgICAgICAgUmFuZ2U8RG91YmxlPiByZXBvcnRlZCA9CisgICAgICAgICAgICBNZWRpYVV0aWxzLmdldFZpZGVvQ2FwYWJpbGl0aWVzKGNvZGVjTmFtZSwgbWltZSkKKyAgICAgICAgICAgICAgICAgICAgLmdldEFjaGlldmFibGVGcmFtZVJhdGVzRm9yKHdpZHRoLCBoZWlnaHQpOworICAgICAgICBpZiAocmVwb3J0ZWQgIT0gbnVsbCkgeworICAgICAgICAgICAgbG9nLmFkZFZhbHVlKCJyZXBvcnRlZF9sb3ciLCByZXBvcnRlZC5nZXRMb3dlcigpLCBSZXN1bHRUeXBlLk5FVVRSQUwsIFJlc3VsdFVuaXQuRlBTKTsKKyAgICAgICAgICAgIGxvZy5hZGRWYWx1ZSgicmVwb3J0ZWRfaGlnaCIsIHJlcG9ydGVkLmdldFVwcGVyKCksIFJlc3VsdFR5cGUuTkVVVFJBTCwgUmVzdWx0VW5pdC5GUFMpOworICAgICAgICAgICAgbWVzc2FnZSArPSAiIHJlcG9ydGVkPSIgKyByZXBvcnRlZC5nZXRMb3dlcigpICsgIi0iICsgcmVwb3J0ZWQuZ2V0VXBwZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtZXNzYWdlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgcGVyZm9ybWFuY2Ugc3RhdGlzdGljcyBiYXNlZCBvbiB0aGUgcmF3IHxzdGF0c3wgdG8gfGxvZ3wuIEFsc28gcHJpbnRzIHRoZSBzYW1lIGludG8KKyAgICAgKiBsb2djYXQuIFJldHVybnMgdGhlICJmaW5hbCBmcHMiIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIGFkZFBlcmZvcm1hbmNlU3RhdHNUb0xvZygKKyAgICAgICAgICAgIERldmljZVJlcG9ydExvZyBsb2csIE1lZGlhVXRpbHMuU3RhdHMgZHVyYXRpb25zVXNTdGF0cywgU3RyaW5nIG1lc3NhZ2UpIHsKKworICAgICAgICBNZWRpYVV0aWxzLlN0YXRzIGZyYW1lQXZnVXNTdGF0cyA9CisgICAgICAgICAgICBkdXJhdGlvbnNVc1N0YXRzLm1vdmluZ0F2ZXJhZ2UoTU9WSU5HX0FWRVJBR0VfTlVNX0ZSQU1FUyk7CisgICAgICAgIGxvZy5hZGRWYWx1ZSgKKyAgICAgICAgICAgICAgICAid2luZG93X2ZyYW1lcyIsIE1PVklOR19BVkVSQUdFX05VTV9GUkFNRVMsIFJlc3VsdFR5cGUuTkVVVFJBTCwgUmVzdWx0VW5pdC5DT1VOVCk7CisgICAgICAgIGxvZ1BlcmZvcm1hbmNlU3RhdHMobG9nLCBmcmFtZUF2Z1VzU3RhdHMsICJmcmFtZV9hdmdfc3RhdHMiLAorICAgICAgICAgICAgICAgIG1lc3NhZ2UgKyAiIHdpbmRvdz0iICsgTU9WSU5HX0FWRVJBR0VfTlVNX0ZSQU1FUyk7CisKKyAgICAgICAgTWVkaWFVdGlscy5TdGF0cyB0aW1lQXZnVXNTdGF0cyA9CisgICAgICAgICAgICBkdXJhdGlvbnNVc1N0YXRzLm1vdmluZ0F2ZXJhZ2VPdmVyU3VtKE1PVklOR19BVkVSQUdFX1dJTkRPV19NUyAqIDEwMDApOworICAgICAgICBsb2cuYWRkVmFsdWUoIndpbmRvd190aW1lIiwgTU9WSU5HX0FWRVJBR0VfV0lORE9XX01TLCBSZXN1bHRUeXBlLk5FVVRSQUwsIFJlc3VsdFVuaXQuTVMpOworICAgICAgICBkb3VibGUgZnBzID0gbG9nUGVyZm9ybWFuY2VTdGF0cyhsb2csIHRpbWVBdmdVc1N0YXRzLCAidGltZV9hdmdfc3RhdHMiLAorICAgICAgICAgICAgICAgIG1lc3NhZ2UgKyAiIHdpbmRvd01zPSIgKyBNT1ZJTkdfQVZFUkFHRV9XSU5ET1dfTVMpOworCisgICAgICAgIGxvZy5zZXRTdW1tYXJ5KCJmcHMiLCBmcHMsIFJlc3VsdFR5cGUuSElHSEVSX0JFVFRFUiwgUmVzdWx0VW5pdC5GUFMpOworICAgICAgICByZXR1cm4gZnBzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgcGVyZm9ybWFuY2Ugc3RhdGlzdGljcyBiYXNlZCBvbiB0aGUgcHJvY2Vzc2VkIHxzdGF0c3wgdG8gfGxvZ3wgdXNpbmcgfHByZWZpeHwuCisgICAgICogQWxzbyBwcmludHMgdGhlIHNhbWUgaW50byBsb2djYXQgdXNpbmcgfG1lc3NhZ2V8IGFzIHRoZSBiYXNlIG1lc3NhZ2UuIFJldHVybnMgdGhlIGZwcyB2YWx1ZQorICAgICAqIGZvciB8c3RhdHN8LiB8cHJlZml4fCBtdXN0IGJlIGxvd2VyY2FzZSBhbHBoYW51bWVyaWMgdW5kZXJzY29yZWQgZm9ybWF0LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGRvdWJsZSBsb2dQZXJmb3JtYW5jZVN0YXRzKAorICAgICAgICAgICAgRGV2aWNlUmVwb3J0TG9nIGxvZywgTWVkaWFVdGlscy5TdGF0cyBzdGF0c1VzLCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICBmaW5hbCBTdHJpbmdbXSBsYWJlbHMgPSB7CisgICAgICAgICAgICAibWluIiwgInA1IiwgInAxMCIsICJwMjAiLCAicDMwIiwgInA0MCIsICJwNTAiLCAicDYwIiwgInA3MCIsICJwODAiLCAicDkwIiwgInA5NSIsICJtYXgiCisgICAgICAgIH07CisgICAgICAgIGZpbmFsIGRvdWJsZVtdIHBvaW50cyA9IHsKKyAgICAgICAgICAgICAwLCAgICAgNSwgICAgMTAsICAgIDIwLCAgICAzMCwgICAgNDAsICAgIDUwLCAgICA2MCwgICAgNzAsICAgIDgwLCAgICA5MCwgICAgOTUsICAgIDEwMAorICAgICAgICB9OworCisgICAgICAgIGludCBudW0gPSBzdGF0c1VzLmdldE51bSgpOworICAgICAgICBsb25nIGF2ZyA9IE1hdGgucm91bmQoc3RhdHNVcy5nZXRBdmVyYWdlKCkpOworICAgICAgICBsb25nIHN0ZGV2ID0gTWF0aC5yb3VuZChzdGF0c1VzLmdldFN0ZGV2KCkpOworICAgICAgICBsb2cuYWRkVmFsdWUocHJlZml4ICsgIl9udW0iLCBudW0sIFJlc3VsdFR5cGUuTkVVVFJBTCwgUmVzdWx0VW5pdC5DT1VOVCk7CisgICAgICAgIGxvZy5hZGRWYWx1ZShwcmVmaXggKyAiX2F2ZyIsIGF2ZyAvIDEwMDAuLCBSZXN1bHRUeXBlLkxPV0VSX0JFVFRFUiwgUmVzdWx0VW5pdC5NUyk7CisgICAgICAgIGxvZy5hZGRWYWx1ZShwcmVmaXggKyAiX3N0ZGV2Iiwgc3RkZXYgLyAxMDAwLiwgUmVzdWx0VHlwZS5MT1dFUl9CRVRURVIsIFJlc3VsdFVuaXQuTVMpOworICAgICAgICBtZXNzYWdlICs9ICIgbnVtPSIgKyBudW0gKyAiIGF2Zz0iICsgYXZnICsgIiBzdGRldj0iICsgc3RkZXY7CisgICAgICAgIGZpbmFsIGRvdWJsZVtdIHBlcmNlbnRpbGVzID0gc3RhdHNVcy5nZXRQZXJjZW50aWxlcyhwb2ludHMpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxhYmVscy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgbG9uZyBwID0gTWF0aC5yb3VuZChwZXJjZW50aWxlc1tpXSk7CisgICAgICAgICAgICBtZXNzYWdlICs9ICIgIiArIGxhYmVsc1tpXSArICI9IiArIHA7CisgICAgICAgICAgICBsb2cuYWRkVmFsdWUocHJlZml4ICsgIl8iICsgbGFiZWxzW2ldLCBwIC8gMTAwMC4sIFJlc3VsdFR5cGUuTkVVVFJBTCwgUmVzdWx0VW5pdC5NUyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBwcmludCByZXN1bHQgdG8gbG9nY2F0IGluIGNhc2UgdGVzdCBhYm9ydHMgYmVmb3JlIGxvZ3MgYXJlIHdyaXR0ZW4KKyAgICAgICAgTG9nLmkoVEFHLCBtZXNzYWdlKTsKKworICAgICAgICByZXR1cm4gMWU2IC8gcGVyY2VudGlsZXNbcG9pbnRzLmxlbmd0aCAtIDJdOworICAgIH0KKworICAgIC8qKiBWZXJpZmllcyB8bWVhc3VyZWRGcHN8IGFnYWluc3QgcmVwb3J0ZWQgYWNoaWV2YWJsZSByYXRlcy4gUmV0dXJucyBudWxsIGlmIGF0IGxlYXN0CisgICAgICogIG9uZSBtZWFzdXJlbWVudCBmYWxscyB3aXRoaW4gdGhlIG1hcmdpbnMgb2YgdGhlIHJlcG9ydGVkIHJhbmdlLiBPdGhlcndpc2UsIHJldHVybnMKKyAgICAgKiAgYW4gZXJyb3IgbWVzc2FnZSB0byBkaXNwbGF5LiovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdmVyaWZ5QWNoaWV2YWJsZUZyYW1lUmF0ZXMoCisgICAgICAgICAgICBTdHJpbmcgbmFtZSwgU3RyaW5nIG1pbWUsIGludCB3LCBpbnQgaCwgZG91YmxlLi4uIG1lYXN1cmVkRnBzKSB7CisgICAgICAgIFJhbmdlPERvdWJsZT4gcmVwb3J0ZWQgPQorICAgICAgICAgICAgTWVkaWFVdGlscy5nZXRWaWRlb0NhcGFiaWxpdGllcyhuYW1lLCBtaW1lKS5nZXRBY2hpZXZhYmxlRnJhbWVSYXRlc0Zvcih3LCBoKTsKKyAgICAgICAgU3RyaW5nIGtpbmQgPSAiYWNoaWV2YWJsZSBmcmFtZSByYXRlcyBmb3IgIiArIG5hbWUgKyAiICIgKyBtaW1lICsgIiAiICsgdyArICJ4IiArIGg7CisgICAgICAgIGlmIChyZXBvcnRlZCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gIkZhaWxlZCB0byBnZXQgIiArIGtpbmQ7CisgICAgICAgIH0KKyAgICAgICAgZG91YmxlIGxvd2VyQm91bmRhcnkxID0gcmVwb3J0ZWQuZ2V0TG93ZXIoKSAvIEZSQU1FUkFURV9UT0xFUkFOQ0U7CisgICAgICAgIGRvdWJsZSB1cHBlckJvdW5kYXJ5MSA9IHJlcG9ydGVkLmdldFVwcGVyKCkgKiBGUkFNRVJBVEVfVE9MRVJBTkNFOworICAgICAgICBkb3VibGUgbG93ZXJCb3VuZGFyeTIgPSByZXBvcnRlZC5nZXRVcHBlcigpIC8gTWF0aC5wb3coRlJBTUVSQVRFX1RPTEVSQU5DRSwgMik7CisgICAgICAgIGRvdWJsZSB1cHBlckJvdW5kYXJ5MiA9IHJlcG9ydGVkLmdldExvd2VyKCkgKiBNYXRoLnBvdyhGUkFNRVJBVEVfVE9MRVJBTkNFLCAyKTsKKyAgICAgICAgTG9nLmQoVEFHLCBuYW1lICsgIiAiICsgbWltZSArICIgIiArIHcgKyAieCIgKyBoICsKKyAgICAgICAgICAgICAgICAiIGxvd2VyQm91bmRhcnkxICIgKyBsb3dlckJvdW5kYXJ5MSArICIgdXBwZXJCb3VuZGFyeTEgIiArIHVwcGVyQm91bmRhcnkxICsKKyAgICAgICAgICAgICAgICAiIGxvd2VyQm91bmRhcnkyICIgKyBsb3dlckJvdW5kYXJ5MiArICIgdXBwZXJCb3VuZGFyeTIgIiArIHVwcGVyQm91bmRhcnkyICsKKyAgICAgICAgICAgICAgICAiIG1lYXN1cmVkICIgKyBBcnJheXMudG9TdHJpbmcobWVhc3VyZWRGcHMpKTsKKworICAgICAgICBmb3IgKGRvdWJsZSBtZWFzdXJlZCA6IG1lYXN1cmVkRnBzKSB7CisgICAgICAgICAgICBpZiAobWVhc3VyZWQgPj0gbG93ZXJCb3VuZGFyeTEgJiYgbWVhc3VyZWQgPD0gdXBwZXJCb3VuZGFyeTEKKyAgICAgICAgICAgICAgICAgICAgJiYgbWVhc3VyZWQgPj0gbG93ZXJCb3VuZGFyeTIgJiYgbWVhc3VyZWQgPD0gdXBwZXJCb3VuZGFyeTIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAiRXhwZWN0ZWQgIiArIGtpbmQgKyAiOiAiICsgcmVwb3J0ZWQgKyAiLlxuIgorICAgICAgICAgICAgICAgICsgIk1lYXN1cmVkIGZyYW1lIHJhdGU6ICIgKyBBcnJheXMudG9TdHJpbmcobWVhc3VyZWRGcHMpICsgIi5cbiI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL01lZGlhVXRpbHMuamF2YSBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9NZWRpYVV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VhNmI2MwotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9NZWRpYVV0aWxzLmphdmEKQEAgLTAsMCArMSwxMjMyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldEZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGFuZHJvaWQuZHJtLkRybUNvbnZlcnRlZFN0YXR1czsKK2ltcG9ydCBhbmRyb2lkLmRybS5Ecm1NYW5hZ2VyQ2xpZW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuSW1hZ2VGb3JtYXQ7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5JbWFnZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkltYWdlLlBsYW5lOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb2RlYzsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29kZWMuQnVmZmVySW5mbzsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29kZWNJbmZvOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb2RlY0luZm8uQ29kZWNDYXBhYmlsaXRpZXM7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvZGVjSW5mby5WaWRlb0NhcGFiaWxpdGllczsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29kZWNMaXN0OworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFFeHRyYWN0b3I7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUZvcm1hdDsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuUmFuZ2U7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkRldmljZVJlcG9ydExvZzsKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlJlc3VsdFR5cGU7CitpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5SZXN1bHRVbml0OworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0OworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyLmlzUHVibGljOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllci5pc1N0YXRpYzsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlOworCitwdWJsaWMgY2xhc3MgTWVkaWFVdGlscyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVV0aWxzIjsKKworICAgIC8qCisgICAgICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEhFTFBFUiBNRVRIT0RTIEZPUiBTS0lQUElORyBURVNUUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBTExfQVZfVFJBQ0tTID0gLTE7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZWRpYUNvZGVjTGlzdCBzTUNMID0gbmV3IE1lZGlhQ29kZWNMaXN0KE1lZGlhQ29kZWNMaXN0LlJFR1VMQVJfQ09ERUNTKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHRlc3QgbmFtZSAoaGV1cmlzdGljYWxseSkuCisgICAgICoKKyAgICAgKiBTaW5jZSBpdCB1c2VzIGhldXJpc3RpY3MsIHRoaXMgbWV0aG9kIGhhcyBvbmx5IGJlZW4gdmVyaWZpZWQgZm9yIG1lZGlhCisgICAgICogdGVzdHMuIFRoaXMgY2VudHJhbGl6ZXMgdGhlIHdheSB0byBzaWduYWwgZXJyb3JzIGR1cmluZyBhIHRlc3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VGVzdE5hbWUoKSB7CisgICAgICAgIHJldHVybiBnZXRUZXN0TmFtZShmYWxzZSAvKiB3aXRoQ2xhc3MgKi8pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHRlc3QgbmFtZSB3aXRoIHRoZSBmdWxsIGNsYXNzIChoZXVyaXN0aWNhbGx5KS4KKyAgICAgKgorICAgICAqIFNpbmNlIGl0IHVzZXMgaGV1cmlzdGljcywgdGhpcyBtZXRob2QgaGFzIG9ubHkgYmVlbiB2ZXJpZmllZCBmb3IgbWVkaWEKKyAgICAgKiB0ZXN0cy4gVGhpcyBjZW50cmFsaXplcyB0aGUgd2F5IHRvIHNpZ25hbCBlcnJvcnMgZHVyaW5nIGEgdGVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUZXN0TmFtZVdpdGhDbGFzcygpIHsKKyAgICAgICAgcmV0dXJuIGdldFRlc3ROYW1lKHRydWUgLyogd2l0aENsYXNzICovKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VGVzdE5hbWUoYm9vbGVhbiB3aXRoQ2xhc3MpIHsKKyAgICAgICAgaW50IGJlc3RTY29yZSA9IC0xOworICAgICAgICBTdHJpbmcgdGVzdE5hbWUgPSAidGVzdD8/PyI7CisgICAgICAgIE1hcDxUaHJlYWQsIFN0YWNrVHJhY2VFbGVtZW50W10+IHRyYWNlcyA9IFRocmVhZC5nZXRBbGxTdGFja1RyYWNlcygpOworICAgICAgICBmb3IgKE1hcC5FbnRyeTxUaHJlYWQsIFN0YWNrVHJhY2VFbGVtZW50W10+IGVudHJ5IDogdHJhY2VzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIFN0YWNrVHJhY2VFbGVtZW50W10gc3RhY2sgPSBlbnRyeS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHN0YWNrLmxlbmd0aDsgKytpbmRleCkgeworICAgICAgICAgICAgICAgIC8vIG1ldGhvZCBuYW1lIG11c3Qgc3RhcnQgd2l0aCAidGVzdCIKKyAgICAgICAgICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSA9IHN0YWNrW2luZGV4XS5nZXRNZXRob2ROYW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKCFtZXRob2ROYW1lLnN0YXJ0c1dpdGgoInRlc3QiKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbnQgc2NvcmUgPSAwOworICAgICAgICAgICAgICAgIC8vIHNlZSBpZiB0aGVyZSBpcyBhIHB1YmxpYyBub24tc3RhdGljIHZvaWQgbWV0aG9kIHRoYXQgdGFrZXMgbm8gYXJndW1lbnQKKyAgICAgICAgICAgICAgICBDbGFzczw/PiBjbGF6ejsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjbGF6eiA9IENsYXNzLmZvck5hbWUoc3RhY2tbaW5kZXhdLmdldENsYXNzTmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgKytzY29yZTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChmaW5hbCBNZXRob2QgbWV0aG9kIDogY2xhenouZ2V0RGVjbGFyZWRNZXRob2RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscyhtZXRob2ROYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpc1B1YmxpYyhtZXRob2QuZ2V0TW9kaWZpZXJzKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICFpc1N0YXRpYyhtZXRob2QuZ2V0TW9kaWZpZXJzKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aCA9PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1ldGhvZC5nZXRSZXR1cm5UeXBlKCkuZXF1YWxzKFZvaWQuVFlQRSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArK3Njb3JlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChzY29yZSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBjb3VsZCByZWFkIHRoZSBjbGFzcywgYnV0IG1ldGhvZCBpcyBub3QgcHVibGljIHZvaWQsIGl0IGlzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3QgYSBjYW5kaWRhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gZXZlbiBpZiB3ZSBjYW5ub3QgdmVyaWZ5IHRoZSBtZXRob2Qgc2lnbmF0dXJlLCB0aGVyZSBhcmUgc2lnbmFscyBpbiB0aGUgc3RhY2sKKworICAgICAgICAgICAgICAgIC8vIHVzdWFsbHkgdGVzdCBtZXRob2QgaXMgaW52b2tlZCBieSByZWZsZWN0aW9uCisgICAgICAgICAgICAgICAgaW50IGRlcHRoID0gMTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoaW5kZXggKyBkZXB0aCA8IHN0YWNrLmxlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgc3RhY2tbaW5kZXggKyBkZXB0aF0uZ2V0TWV0aG9kTmFtZSgpLmVxdWFscygiaW52b2tlIikKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHN0YWNrW2luZGV4ICsgZGVwdGhdLmdldENsYXNzTmFtZSgpLmVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCIpKSB7CisgICAgICAgICAgICAgICAgICAgICsrZGVwdGg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChkZXB0aCA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgKytzY29yZTsKKyAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHVzdWFsbHkgdGVzdCBtZXRob2QgaXMgcnVuIGJ5IHJ1bk1ldGhvZCBtZXRob2QgaW4gYW5kcm9pZC50ZXN0IHBhY2thZ2UKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ICsgZGVwdGggPCBzdGFjay5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFja1tpbmRleCArIGRlcHRoXS5nZXRDbGFzc05hbWUoKS5zdGFydHNXaXRoKCJhbmRyb2lkLnRlc3QuIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArK3Njb3JlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrW2luZGV4ICsgZGVwdGhdLmdldE1ldGhvZE5hbWUoKS5lcXVhbHMoInJ1bk1ldGhvZCIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytzY29yZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChzY29yZSA+IGJlc3RTY29yZSkgeworICAgICAgICAgICAgICAgICAgICBiZXN0U2NvcmUgPSBzY29yZTsKKyAgICAgICAgICAgICAgICAgICAgdGVzdE5hbWUgPSBtZXRob2ROYW1lOworICAgICAgICAgICAgICAgICAgICBpZiAod2l0aENsYXNzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0TmFtZSA9IHN0YWNrW2luZGV4XS5nZXRDbGFzc05hbWUoKSArICIuIiArIHRlc3ROYW1lOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0ZXN0TmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kcyB0ZXN0IG5hbWUgKGhldXJpc3RpY2FsbHkpIGFuZCBwcmludHMgb3V0IHN0YW5kYXJkIHNraXAgbWVzc2FnZS4KKyAgICAgKgorICAgICAqIFNpbmNlIGl0IHVzZXMgaGV1cmlzdGljcywgdGhpcyBtZXRob2QgaGFzIG9ubHkgYmVlbiB2ZXJpZmllZCBmb3IgbWVkaWEKKyAgICAgKiB0ZXN0cy4gVGhpcyBjZW50cmFsaXplcyB0aGUgd2F5IHRvIHNpZ25hbCBhIHNraXBwZWQgdGVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2tpcFRlc3QoU3RyaW5nIHRhZywgU3RyaW5nIHJlYXNvbikgeworICAgICAgICBMb2cuaSh0YWcsICJTS0lQUElORyAiICsgZ2V0VGVzdE5hbWUoKSArICIoKTogIiArIHJlYXNvbik7CisgICAgICAgIERldmljZVJlcG9ydExvZyBsb2cgPSBuZXcgRGV2aWNlUmVwb3J0TG9nKCJDdHNNZWRpYVNraXBwZWRUZXN0cyIsICJ0ZXN0X3NraXBwZWQiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxvZy5hZGRWYWx1ZSgicmVhc29uIiwgcmVhc29uLCBSZXN1bHRUeXBlLk5FVVRSQUwsIFJlc3VsdFVuaXQuTk9ORSk7CisgICAgICAgICAgICBsb2cuYWRkVmFsdWUoCisgICAgICAgICAgICAgICAgICAgICJ0ZXN0IiwgZ2V0VGVzdE5hbWVXaXRoQ2xhc3MoKSwgUmVzdWx0VHlwZS5ORVVUUkFMLCBSZXN1bHRVbml0Lk5PTkUpOworICAgICAgICAgICAgbG9nLnN1Ym1pdCgpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7IH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kcyB0ZXN0IG5hbWUgKGhldXJpc3RpY2FsbHkpIGFuZCBwcmludHMgb3V0IHN0YW5kYXJkIHNraXAgbWVzc2FnZS4KKyAgICAgKgorICAgICAqIFNpbmNlIGl0IHVzZXMgaGV1cmlzdGljcywgdGhpcyBtZXRob2QgaGFzIG9ubHkgYmVlbiB2ZXJpZmllZCBmb3IgbWVkaWEKKyAgICAgKiB0ZXN0cy4gIFRoaXMgY2VudHJhbGl6ZXMgdGhlIHdheSB0byBzaWduYWwgYSBza2lwcGVkIHRlc3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNraXBUZXN0KFN0cmluZyByZWFzb24pIHsKKyAgICAgICAgc2tpcFRlc3QoVEFHLCByZWFzb24pOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVjayhib29sZWFuIHJlc3VsdCwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgaWYgKCFyZXN1bHQpIHsKKyAgICAgICAgICAgIHNraXBUZXN0KG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLSBIRUxQRVIgTUVUSE9EUyBGT1IgQ0hFQ0tJTkcgQ09ERUMgU1VQUE9SVCAtLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNHb29nbGUoU3RyaW5nIGNvZGVjTmFtZSkgeworICAgICAgICBjb2RlY05hbWUgPSBjb2RlY05hbWUudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgcmV0dXJuIGNvZGVjTmFtZS5zdGFydHNXaXRoKCJvbXguZ29vZ2xlLiIpCisgICAgICAgICAgICAgICAgfHwgY29kZWNOYW1lLnN0YXJ0c1dpdGgoImMyLmFuZHJvaWQuIikKKyAgICAgICAgICAgICAgICB8fCBjb2RlY05hbWUuc3RhcnRzV2l0aCgiYzIuZ29vZ2xlLiIpOworICAgIH0KKworICAgIC8vIHJldHVybnMgdGhlIGxpc3Qgb2YgY29kZWNzIHRoYXQgc3VwcG9ydCBhbnkgb25lIG9mIHRoZSBmb3JtYXRzCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZ2V0Q29kZWNOYW1lcygKKyAgICAgICAgICAgIGJvb2xlYW4gaXNFbmNvZGVyLCBCb29sZWFuIGlzR29vZywgTWVkaWFGb3JtYXQuLi4gZm9ybWF0cykgeworICAgICAgICBNZWRpYUNvZGVjTGlzdCBtY2wgPSBuZXcgTWVkaWFDb2RlY0xpc3QoTWVkaWFDb2RlY0xpc3QuUkVHVUxBUl9DT0RFQ1MpOworICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgZm9yIChNZWRpYUNvZGVjSW5mbyBpbmZvIDogbWNsLmdldENvZGVjSW5mb3MoKSkgeworICAgICAgICAgICAgaWYgKGluZm8uaXNFbmNvZGVyKCkgIT0gaXNFbmNvZGVyKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaXNHb29nICE9IG51bGwgJiYgaXNHb29nbGUoaW5mby5nZXROYW1lKCkpICE9IGlzR29vZykgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKE1lZGlhRm9ybWF0IGZvcm1hdCA6IGZvcm1hdHMpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbWltZSA9IGZvcm1hdC5nZXRTdHJpbmcoTWVkaWFGb3JtYXQuS0VZX01JTUUpOworCisgICAgICAgICAgICAgICAgQ29kZWNDYXBhYmlsaXRpZXMgY2FwcyA9IG51bGw7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY2FwcyA9IGluZm8uZ2V0Q2FwYWJpbGl0aWVzRm9yVHlwZShtaW1lKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeyAgLy8gbWltZSBpcyBub3Qgc3VwcG9ydGVkCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY2Fwcy5pc0Zvcm1hdFN1cHBvcnRlZChmb3JtYXQpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoaW5mby5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC50b0FycmF5KG5ldyBTdHJpbmdbcmVzdWx0LnNpemUoKV0pOworICAgIH0KKworICAgIC8qIFVzZSBpc0dvb2cgPSBudWxsIHRvIHF1ZXJ5IGFsbCBkZWNvZGVycyAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0RGVjb2Rlck5hbWVzKC8qIE51bGxhYmxlICovIEJvb2xlYW4gaXNHb29nLCBNZWRpYUZvcm1hdC4uLiBmb3JtYXRzKSB7CisgICAgICAgIHJldHVybiBnZXRDb2RlY05hbWVzKGZhbHNlIC8qIGlzRW5jb2RlciAqLywgaXNHb29nLCBmb3JtYXRzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldERlY29kZXJOYW1lcyhNZWRpYUZvcm1hdC4uLiBmb3JtYXRzKSB7CisgICAgICAgIHJldHVybiBnZXRDb2RlY05hbWVzKGZhbHNlIC8qIGlzRW5jb2RlciAqLywgbnVsbCAvKiBpc0dvb2cgKi8sIGZvcm1hdHMpOworICAgIH0KKworICAgIC8qIFVzZSBpc0dvb2cgPSBudWxsIHRvIHF1ZXJ5IGFsbCBkZWNvZGVycyAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0RW5jb2Rlck5hbWVzKC8qIE51bGxhYmxlICovIEJvb2xlYW4gaXNHb29nLCBNZWRpYUZvcm1hdC4uLiBmb3JtYXRzKSB7CisgICAgICAgIHJldHVybiBnZXRDb2RlY05hbWVzKHRydWUgLyogaXNFbmNvZGVyICovLCBpc0dvb2csIGZvcm1hdHMpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0RW5jb2Rlck5hbWVzKE1lZGlhRm9ybWF0Li4uIGZvcm1hdHMpIHsKKyAgICAgICAgcmV0dXJuIGdldENvZGVjTmFtZXModHJ1ZSAvKiBpc0VuY29kZXIgKi8sIG51bGwgLyogaXNHb29nICovLCBmb3JtYXRzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldERlY29kZXJOYW1lc0Zvck1pbWUoU3RyaW5nIG1pbWUpIHsKKyAgICAgICAgTWVkaWFGb3JtYXQgZm9ybWF0ID0gbmV3IE1lZGlhRm9ybWF0KCk7CisgICAgICAgIGZvcm1hdC5zZXRTdHJpbmcoTWVkaWFGb3JtYXQuS0VZX01JTUUsIG1pbWUpOworICAgICAgICByZXR1cm4gZ2V0Q29kZWNOYW1lcyhmYWxzZSAvKiBpc0VuY29kZXIgKi8sIG51bGwgLyogaXNHb29nICovLCBmb3JtYXQpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0RW5jb2Rlck5hbWVzRm9yTWltZShTdHJpbmcgbWltZSkgeworICAgICAgICBNZWRpYUZvcm1hdCBmb3JtYXQgPSBuZXcgTWVkaWFGb3JtYXQoKTsKKyAgICAgICAgZm9ybWF0LnNldFN0cmluZyhNZWRpYUZvcm1hdC5LRVlfTUlNRSwgbWltZSk7CisgICAgICAgIHJldHVybiBnZXRDb2RlY05hbWVzKHRydWUgLyogaXNFbmNvZGVyICovLCBudWxsIC8qIGlzR29vZyAqLywgZm9ybWF0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmVyaWZ5TnVtQ29kZWNzKAorICAgICAgICAgICAgaW50IGNvdW50LCBib29sZWFuIGlzRW5jb2RlciwgQm9vbGVhbiBpc0dvb2csIE1lZGlhRm9ybWF0Li4uIGZvcm1hdHMpIHsKKyAgICAgICAgU3RyaW5nIGRlc2MgPSAoaXNFbmNvZGVyID8gImVuY29kZXJzIiA6ICJkZWNvZGVycyIpICsgIiBmb3IgIgorICAgICAgICAgICAgICAgICsgKGZvcm1hdHMubGVuZ3RoID09IDEgPyBmb3JtYXRzWzBdLnRvU3RyaW5nKCkgOiBBcnJheXMudG9TdHJpbmcoZm9ybWF0cykpOworICAgICAgICBpZiAoaXNHb29nICE9IG51bGwpIHsKKyAgICAgICAgICAgIGRlc2MgPSAoaXNHb29nID8gIkdvb2dsZSAiIDogIm5vbi1Hb29nbGUgIikgKyBkZXNjOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nW10gY29kZWNzID0gZ2V0Q29kZWNOYW1lcyhpc0VuY29kZXIsIGlzR29vZywgZm9ybWF0cyk7CisgICAgICAgIGFzc2VydFRydWUoInRlc3QgY2FuIG9ubHkgdmVyaWZ5ICIgKyBjb3VudCArICIgIiArIGRlc2MgKyAiOyBmb3VuZCAiICsgY29kZWNzLmxlbmd0aCArICI6ICIKKyAgICAgICAgICAgICAgICArIEFycmF5cy50b1N0cmluZyhjb2RlY3MpLCBjb2RlY3MubGVuZ3RoIDw9IGNvdW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE1lZGlhQ29kZWMgZ2V0RGVjb2RlcihNZWRpYUZvcm1hdCBmb3JtYXQpIHsKKyAgICAgICAgU3RyaW5nIGRlY29kZXIgPSBzTUNMLmZpbmREZWNvZGVyRm9yRm9ybWF0KGZvcm1hdCk7CisgICAgICAgIGlmIChkZWNvZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE1lZGlhQ29kZWMuY3JlYXRlQnlDb2RlY05hbWUoZGVjb2Rlcik7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNhbkVuY29kZShNZWRpYUZvcm1hdCBmb3JtYXQpIHsKKyAgICAgICAgaWYgKHNNQ0wuZmluZEVuY29kZXJGb3JGb3JtYXQoZm9ybWF0KSA9PSBudWxsKSB7CisgICAgICAgICAgICBMb2cuaShUQUcsICJubyBlbmNvZGVyIGZvciAiICsgZm9ybWF0KTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuRGVjb2RlKE1lZGlhRm9ybWF0IGZvcm1hdCkgeworICAgICAgICBpZiAoc01DTC5maW5kRGVjb2RlckZvckZvcm1hdChmb3JtYXQpID09IG51bGwpIHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgIm5vIGRlY29kZXIgZm9yICIgKyBmb3JtYXQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgY29kZWNOYW1lLCBTdHJpbmcgbWltZSwgaW50IHcsIGludCBoKSB7CisgICAgICAgIC8vIFdoaWxlIHRoaXMgY291bGQgYmUgc2ltcGx5IHdyaXR0ZW4gYXMgc3VjaCwgZ2l2ZSBtb3JlIGdyYWNlZnVsIGZlZWRiYWNrLgorICAgICAgICAvLyBNZWRpYUZvcm1hdCBmb3JtYXQgPSBNZWRpYUZvcm1hdC5jcmVhdGVWaWRlb0Zvcm1hdChtaW1lLCB3LCBoKTsKKyAgICAgICAgLy8gcmV0dXJuIHN1cHBvcnRzKGNvZGVjTmFtZSwgZm9ybWF0KTsKKworICAgICAgICBWaWRlb0NhcGFiaWxpdGllcyB2aWRDYXAgPSBnZXRWaWRlb0NhcGFiaWxpdGllcyhjb2RlY05hbWUsIG1pbWUpOworICAgICAgICBpZiAodmlkQ2FwID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIGlmICh2aWRDYXAuaXNTaXplU3VwcG9ydGVkKHcsIGgpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIExvZy53KFRBRywgInVuc3VwcG9ydGVkIHNpemUgIiArIHcgKyAieCIgKyBoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgY29kZWNOYW1lLCBNZWRpYUZvcm1hdCBmb3JtYXQpIHsKKyAgICAgICAgTWVkaWFDb2RlYyBjb2RlYzsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvZGVjID0gTWVkaWFDb2RlYy5jcmVhdGVCeUNvZGVjTmFtZShjb2RlY05hbWUpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJjb2RlYyBub3QgZm91bmQ6ICIgKyBjb2RlY05hbWUpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIG1pbWUgPSBmb3JtYXQuZ2V0U3RyaW5nKE1lZGlhRm9ybWF0LktFWV9NSU1FKTsKKyAgICAgICAgQ29kZWNDYXBhYmlsaXRpZXMgY2FwID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNhcCA9IGNvZGVjLmdldENvZGVjSW5mbygpLmdldENhcGFiaWxpdGllc0ZvclR5cGUobWltZSk7CisgICAgICAgICAgICByZXR1cm4gY2FwLmlzRm9ybWF0U3VwcG9ydGVkKGZvcm1hdCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJub3Qgc3VwcG9ydGVkIG1pbWU6ICIgKyBtaW1lKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGNvZGVjLnJlbGVhc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNDb2RlY0ZvclRyYWNrKE1lZGlhRXh0cmFjdG9yIGV4LCBpbnQgdHJhY2spIHsKKyAgICAgICAgaW50IGNvdW50ID0gZXguZ2V0VHJhY2tDb3VudCgpOworICAgICAgICBpZiAodHJhY2sgPCAwIHx8IHRyYWNrID49IGNvdW50KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbih0cmFjayArICIgbm90IGluIFswLi4iICsgKGNvdW50IC0gMSkgKyAiXSIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjYW5EZWNvZGUoZXguZ2V0VHJhY2tGb3JtYXQodHJhY2spKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZXR1cm4gdHJ1ZSBpZmYgYWxsIGF1ZGlvIGFuZCB2aWRlbyB0cmFja3MgYXJlIHN1cHBvcnRlZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNDb2RlY3NGb3JNZWRpYShNZWRpYUV4dHJhY3RvciBleCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4LmdldFRyYWNrQ291bnQoKTsgKytpKSB7CisgICAgICAgICAgICBNZWRpYUZvcm1hdCBmb3JtYXQgPSBleC5nZXRUcmFja0Zvcm1hdChpKTsKKyAgICAgICAgICAgIC8vIG9ubHkgY2hlY2sgZm9yIGF1ZGlvIGFuZCB2aWRlbyBjb2RlY3MKKyAgICAgICAgICAgIFN0cmluZyBtaW1lID0gZm9ybWF0LmdldFN0cmluZyhNZWRpYUZvcm1hdC5LRVlfTUlNRSkudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgICAgIGlmICghbWltZS5zdGFydHNXaXRoKCJhdWRpby8iKSAmJiAhbWltZS5zdGFydHNXaXRoKCJ2aWRlby8iKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFjYW5EZWNvZGUoZm9ybWF0KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZXR1cm4gdHJ1ZSBpZmYgYW55IHRyYWNrIHN0YXJ0aW5nIHdpdGggbWltZVByZWZpeCBpcyBzdXBwb3J0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzQ29kZWNGb3JNZWRpYUFuZERvbWFpbihNZWRpYUV4dHJhY3RvciBleCwgU3RyaW5nIG1pbWVQcmVmaXgpIHsKKyAgICAgICAgbWltZVByZWZpeCA9IG1pbWVQcmVmaXgudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleC5nZXRUcmFja0NvdW50KCk7ICsraSkgeworICAgICAgICAgICAgTWVkaWFGb3JtYXQgZm9ybWF0ID0gZXguZ2V0VHJhY2tGb3JtYXQoaSk7CisgICAgICAgICAgICBTdHJpbmcgbWltZSA9IGZvcm1hdC5nZXRTdHJpbmcoTWVkaWFGb3JtYXQuS0VZX01JTUUpOworICAgICAgICAgICAgaWYgKG1pbWUudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKG1pbWVQcmVmaXgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGNhbkRlY29kZShmb3JtYXQpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJubyBkZWNvZGVyIGZvciAiICsgZm9ybWF0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBoYXNDb2RlY3NGb3JSZXNvdXJjZUNvbWJvKAorICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0LCBpbnQgcmVzb3VyY2VJZCwgaW50IHRyYWNrLCBTdHJpbmcgbWltZVByZWZpeCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQXNzZXRGaWxlRGVzY3JpcHRvciBhZmQgPSBudWxsOworICAgICAgICAgICAgTWVkaWFFeHRyYWN0b3IgZXggPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBhZmQgPSBjb250ZXh0LmdldFJlc291cmNlcygpLm9wZW5SYXdSZXNvdXJjZUZkKHJlc291cmNlSWQpOworICAgICAgICAgICAgICAgIGV4ID0gbmV3IE1lZGlhRXh0cmFjdG9yKCk7CisgICAgICAgICAgICAgICAgZXguc2V0RGF0YVNvdXJjZShhZmQuZ2V0RmlsZURlc2NyaXB0b3IoKSwgYWZkLmdldFN0YXJ0T2Zmc2V0KCksIGFmZC5nZXRMZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgaWYgKG1pbWVQcmVmaXggIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFzQ29kZWNGb3JNZWRpYUFuZERvbWFpbihleCwgbWltZVByZWZpeCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0cmFjayA9PSBBTExfQVZfVFJBQ0tTKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBoYXNDb2RlY3NGb3JNZWRpYShleCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhhc0NvZGVjRm9yVHJhY2soZXgsIHRyYWNrKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlmIChleCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGV4LnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGFmZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGFmZC5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmkoVEFHLCAiY291bGQgbm90IG9wZW4gcmVzb3VyY2UiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogcmV0dXJuIHRydWUgaWZmIGFsbCBhdWRpbyBhbmQgdmlkZW8gdHJhY2tzIGFyZSBzdXBwb3J0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzQ29kZWNzRm9yUmVzb3VyY2UoQ29udGV4dCBjb250ZXh0LCBpbnQgcmVzb3VyY2VJZCkgeworICAgICAgICByZXR1cm4gaGFzQ29kZWNzRm9yUmVzb3VyY2VDb21ibyhjb250ZXh0LCByZXNvdXJjZUlkLCBBTExfQVZfVFJBQ0tTLCBudWxsIC8qIG1pbWVQcmVmaXggKi8pOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja0NvZGVjc0ZvclJlc291cmNlKENvbnRleHQgY29udGV4dCwgaW50IHJlc291cmNlSWQpIHsKKyAgICAgICAgcmV0dXJuIGNoZWNrKGhhc0NvZGVjc0ZvclJlc291cmNlKGNvbnRleHQsIHJlc291cmNlSWQpLCAibm8gZGVjb2RlciBmb3VuZCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHJldHVybiB0cnVlIGlmZiB0cmFjayBpcyBzdXBwb3J0ZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGhhc0NvZGVjRm9yUmVzb3VyY2UoQ29udGV4dCBjb250ZXh0LCBpbnQgcmVzb3VyY2VJZCwgaW50IHRyYWNrKSB7CisgICAgICAgIHJldHVybiBoYXNDb2RlY3NGb3JSZXNvdXJjZUNvbWJvKGNvbnRleHQsIHJlc291cmNlSWQsIHRyYWNrLCBudWxsIC8qIG1pbWVQcmVmaXggKi8pOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja0NvZGVjRm9yUmVzb3VyY2UoQ29udGV4dCBjb250ZXh0LCBpbnQgcmVzb3VyY2VJZCwgaW50IHRyYWNrKSB7CisgICAgICAgIHJldHVybiBjaGVjayhoYXNDb2RlY0ZvclJlc291cmNlKGNvbnRleHQsIHJlc291cmNlSWQsIHRyYWNrKSwgIm5vIGRlY29kZXIgZm91bmQiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZXR1cm4gdHJ1ZSBpZmYgYW55IHRyYWNrIHN0YXJ0aW5nIHdpdGggbWltZVByZWZpeCBpcyBzdXBwb3J0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzQ29kZWNGb3JSZXNvdXJjZUFuZERvbWFpbigKKyAgICAgICAgICAgIENvbnRleHQgY29udGV4dCwgaW50IHJlc291cmNlSWQsIFN0cmluZyBtaW1lUHJlZml4KSB7CisgICAgICAgIHJldHVybiBoYXNDb2RlY3NGb3JSZXNvdXJjZUNvbWJvKGNvbnRleHQsIHJlc291cmNlSWQsIEFMTF9BVl9UUkFDS1MsIG1pbWVQcmVmaXgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHJldHVybiB0cnVlIGlmZiBhbGwgYXVkaW8gYW5kIHZpZGVvIHRyYWNrcyBhcmUgc3VwcG9ydGVkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGhhc0NvZGVjc0ZvclBhdGgoQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcGF0aCkgeworICAgICAgICBNZWRpYUV4dHJhY3RvciBleCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBleCA9IGdldEV4dHJhY3RvckZvclBhdGgoY29udGV4dCwgcGF0aCk7CisgICAgICAgICAgICByZXR1cm4gaGFzQ29kZWNzRm9yTWVkaWEoZXgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuaShUQUcsICJjb3VsZCBub3Qgb3BlbiBwYXRoICIgKyBwYXRoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChleCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZXgucmVsZWFzZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIE1lZGlhRXh0cmFjdG9yIGdldEV4dHJhY3RvckZvclBhdGgoQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcGF0aCkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2UocGF0aCk7CisgICAgICAgIFN0cmluZyBzY2hlbWUgPSB1cmkuZ2V0U2NoZW1lKCk7CisgICAgICAgIE1lZGlhRXh0cmFjdG9yIGV4ID0gbmV3IE1lZGlhRXh0cmFjdG9yKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoc2NoZW1lID09IG51bGwpIHsgLy8gZmlsZQorICAgICAgICAgICAgICAgIGV4LnNldERhdGFTb3VyY2UocGF0aCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHNjaGVtZS5lcXVhbHNJZ25vcmVDYXNlKCJmaWxlIikpIHsKKyAgICAgICAgICAgICAgICBleC5zZXREYXRhU291cmNlKHVyaS5nZXRQYXRoKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBleC5zZXREYXRhU291cmNlKGNvbnRleHQsIHVyaSwgbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGV4LnJlbGVhc2UoKTsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGV4OworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja0NvZGVjc0ZvclBhdGgoQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcGF0aCkgeworICAgICAgICByZXR1cm4gY2hlY2soaGFzQ29kZWNzRm9yUGF0aChjb250ZXh0LCBwYXRoKSwgIm5vIGRlY29kZXIgZm91bmQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzQ29kZWNGb3JEb21haW4oYm9vbGVhbiBlbmNvZGVyLCBTdHJpbmcgZG9tYWluKSB7CisgICAgICAgIGZvciAoTWVkaWFDb2RlY0luZm8gaW5mbyA6IHNNQ0wuZ2V0Q29kZWNJbmZvcygpKSB7CisgICAgICAgICAgICBpZiAoZW5jb2RlciAhPSBpbmZvLmlzRW5jb2RlcigpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIHR5cGUgOiBpbmZvLmdldFN1cHBvcnRlZFR5cGVzKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAodHlwZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoZG9tYWluLnRvTG93ZXJDYXNlKCkgKyAiLyIpKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgImZvdW5kIGNvZGVjICIgKyBpbmZvLmdldE5hbWUoKSArICIgZm9yIG1pbWUgIiArIHR5cGUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja0NvZGVjRm9yRG9tYWluKGJvb2xlYW4gZW5jb2RlciwgU3RyaW5nIGRvbWFpbikgeworICAgICAgICByZXR1cm4gY2hlY2soaGFzQ29kZWNGb3JEb21haW4oZW5jb2RlciwgZG9tYWluKSwKKyAgICAgICAgICAgICAgICAibm8gIiArIGRvbWFpbiArIChlbmNvZGVyID8gIiBlbmNvZGVyIiA6ICIgZGVjb2RlciIpICsgIiBmb3VuZCIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaGFzQ29kZWNGb3JNaW1lKGJvb2xlYW4gZW5jb2RlciwgU3RyaW5nIG1pbWUpIHsKKyAgICAgICAgZm9yIChNZWRpYUNvZGVjSW5mbyBpbmZvIDogc01DTC5nZXRDb2RlY0luZm9zKCkpIHsKKyAgICAgICAgICAgIGlmIChlbmNvZGVyICE9IGluZm8uaXNFbmNvZGVyKCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChTdHJpbmcgdHlwZSA6IGluZm8uZ2V0U3VwcG9ydGVkVHlwZXMoKSkgeworICAgICAgICAgICAgICAgIGlmICh0eXBlLmVxdWFsc0lnbm9yZUNhc2UobWltZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiZm91bmQgY29kZWMgIiArIGluZm8uZ2V0TmFtZSgpICsgIiBmb3IgbWltZSAiICsgbWltZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBoYXNDb2RlY0Zvck1pbWVzKGJvb2xlYW4gZW5jb2RlciwgU3RyaW5nW10gbWltZXMpIHsKKyAgICAgICAgZm9yIChTdHJpbmcgbWltZSA6IG1pbWVzKSB7CisgICAgICAgICAgICBpZiAoIWhhc0NvZGVjRm9yTWltZShlbmNvZGVyLCBtaW1lKSkgeworICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIm5vICIgKyAoZW5jb2RlciA/ICJlbmNvZGVyIiA6ICJkZWNvZGVyIikgKyAiIGZvciBtaW1lICIgKyBtaW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzRW5jb2RlcihTdHJpbmcuLi4gbWltZXMpIHsKKyAgICAgICAgcmV0dXJuIGhhc0NvZGVjRm9yTWltZXModHJ1ZSAvKiBlbmNvZGVyICovLCBtaW1lcyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGhhc0RlY29kZXIoU3RyaW5nLi4uIG1pbWVzKSB7CisgICAgICAgIHJldHVybiBoYXNDb2RlY0Zvck1pbWVzKGZhbHNlIC8qIGVuY29kZXIgKi8sIG1pbWVzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2hlY2tEZWNvZGVyKFN0cmluZy4uLiBtaW1lcykgeworICAgICAgICByZXR1cm4gY2hlY2soaGFzQ29kZWNGb3JNaW1lcyhmYWxzZSAvKiBlbmNvZGVyICovLCBtaW1lcyksICJubyBkZWNvZGVyIGZvdW5kIik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrRW5jb2RlcihTdHJpbmcuLi4gbWltZXMpIHsKKyAgICAgICAgcmV0dXJuIGNoZWNrKGhhc0NvZGVjRm9yTWltZXModHJ1ZSAvKiBlbmNvZGVyICovLCBtaW1lcyksICJubyBlbmNvZGVyIGZvdW5kIik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNhbkRlY29kZVZpZGVvKFN0cmluZyBtaW1lLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGZsb2F0IHJhdGUpIHsKKyAgICAgICAgTWVkaWFGb3JtYXQgZm9ybWF0ID0gTWVkaWFGb3JtYXQuY3JlYXRlVmlkZW9Gb3JtYXQobWltZSwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIGZvcm1hdC5zZXRGbG9hdChNZWRpYUZvcm1hdC5LRVlfRlJBTUVfUkFURSwgcmF0ZSk7CisgICAgICAgIHJldHVybiBjYW5EZWNvZGUoZm9ybWF0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuRGVjb2RlVmlkZW8oCisgICAgICAgICAgICBTdHJpbmcgbWltZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBmbG9hdCByYXRlLAorICAgICAgICAgICAgSW50ZWdlciBwcm9maWxlLCBJbnRlZ2VyIGxldmVsLCBJbnRlZ2VyIGJpdHJhdGUpIHsKKyAgICAgICAgTWVkaWFGb3JtYXQgZm9ybWF0ID0gTWVkaWFGb3JtYXQuY3JlYXRlVmlkZW9Gb3JtYXQobWltZSwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIGZvcm1hdC5zZXRGbG9hdChNZWRpYUZvcm1hdC5LRVlfRlJBTUVfUkFURSwgcmF0ZSk7CisgICAgICAgIGlmIChwcm9maWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvcm1hdC5zZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9QUk9GSUxFLCBwcm9maWxlKTsKKyAgICAgICAgICAgIGlmIChsZXZlbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9ybWF0LnNldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0xFVkVMLCBsZXZlbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJpdHJhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9ybWF0LnNldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0JJVF9SQVRFLCBiaXRyYXRlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2FuRGVjb2RlKGZvcm1hdCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrRW5jb2RlckZvckZvcm1hdChNZWRpYUZvcm1hdCBmb3JtYXQpIHsKKyAgICAgICAgcmV0dXJuIGNoZWNrKGNhbkVuY29kZShmb3JtYXQpLCAibm8gZW5jb2RlciBmb3IgIiArIGZvcm1hdCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrRGVjb2RlckZvckZvcm1hdChNZWRpYUZvcm1hdCBmb3JtYXQpIHsKKyAgICAgICAgcmV0dXJuIGNoZWNrKGNhbkRlY29kZShmb3JtYXQpLCAibm8gZGVjb2RlciBmb3IgIiArIGZvcm1hdCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSEVMUEVSIE1FVEhPRFMgRk9SIE1FRElBIEhBTkRMSU5HIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIFZpZGVvQ2FwYWJpbGl0aWVzIGdldFZpZGVvQ2FwYWJpbGl0aWVzKFN0cmluZyBjb2RlY05hbWUsIFN0cmluZyBtaW1lKSB7CisgICAgICAgIGZvciAoTWVkaWFDb2RlY0luZm8gaW5mbyA6IHNNQ0wuZ2V0Q29kZWNJbmZvcygpKSB7CisgICAgICAgICAgICBpZiAoIWluZm8uZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoY29kZWNOYW1lKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29kZWNDYXBhYmlsaXRpZXMgY2FwczsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY2FwcyA9IGluZm8uZ2V0Q2FwYWJpbGl0aWVzRm9yVHlwZShtaW1lKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gbWltZSBpcyBub3Qgc3VwcG9ydGVkCisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAibm90IHN1cHBvcnRlZCBtaW1lOiAiICsgbWltZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBWaWRlb0NhcGFiaWxpdGllcyB2aWRDYXBzID0gY2Fwcy5nZXRWaWRlb0NhcGFiaWxpdGllcygpOworICAgICAgICAgICAgaWYgKHZpZENhcHMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIm5vdCBhIHZpZGVvIGNvZGVjOiAiICsgY29kZWNOYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB2aWRDYXBzOworICAgICAgICB9CisgICAgICAgIExvZy53KFRBRywgImNvZGVjIG5vdCBmb3VuZDogIiArIGNvZGVjTmFtZSk7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTWVkaWFGb3JtYXQgZ2V0VHJhY2tGb3JtYXRGb3JSZXNvdXJjZSgKKyAgICAgICAgICAgIENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgIGludCByZXNvdXJjZUlkLAorICAgICAgICAgICAgU3RyaW5nIG1pbWVUeXBlUHJlZml4KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBNZWRpYUV4dHJhY3RvciBleHRyYWN0b3IgPSBuZXcgTWVkaWFFeHRyYWN0b3IoKTsKKyAgICAgICAgQXNzZXRGaWxlRGVzY3JpcHRvciBhZmQgPSBjb250ZXh0LmdldFJlc291cmNlcygpLm9wZW5SYXdSZXNvdXJjZUZkKHJlc291cmNlSWQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZXh0cmFjdG9yLnNldERhdGFTb3VyY2UoYWZkLmdldEZpbGVEZXNjcmlwdG9yKCksIGFmZC5nZXRTdGFydE9mZnNldCgpLCBhZmQuZ2V0TGVuZ3RoKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgYWZkLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdldFRyYWNrRm9ybWF0Rm9yRXh0cmFjdG9yKGV4dHJhY3RvciwgbWltZVR5cGVQcmVmaXgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTWVkaWFGb3JtYXQgZ2V0VHJhY2tGb3JtYXRGb3JQYXRoKAorICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcGF0aCwgU3RyaW5nIG1pbWVUeXBlUHJlZml4KQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIE1lZGlhRXh0cmFjdG9yIGV4dHJhY3RvciA9IGdldEV4dHJhY3RvckZvclBhdGgoY29udGV4dCwgcGF0aCk7CisgICAgICByZXR1cm4gZ2V0VHJhY2tGb3JtYXRGb3JFeHRyYWN0b3IoZXh0cmFjdG9yLCBtaW1lVHlwZVByZWZpeCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTWVkaWFGb3JtYXQgZ2V0VHJhY2tGb3JtYXRGb3JFeHRyYWN0b3IoCisgICAgICAgICAgICBNZWRpYUV4dHJhY3RvciBleHRyYWN0b3IsCisgICAgICAgICAgICBTdHJpbmcgbWltZVR5cGVQcmVmaXgpIHsKKyAgICAgIGludCB0cmFja0luZGV4OworICAgICAgTWVkaWFGb3JtYXQgZm9ybWF0ID0gbnVsbDsKKyAgICAgIGZvciAodHJhY2tJbmRleCA9IDA7IHRyYWNrSW5kZXggPCBleHRyYWN0b3IuZ2V0VHJhY2tDb3VudCgpOyB0cmFja0luZGV4KyspIHsKKyAgICAgICAgICBNZWRpYUZvcm1hdCB0cmFja01lZGlhRm9ybWF0ID0gZXh0cmFjdG9yLmdldFRyYWNrRm9ybWF0KHRyYWNrSW5kZXgpOworICAgICAgICAgIGlmICh0cmFja01lZGlhRm9ybWF0LmdldFN0cmluZyhNZWRpYUZvcm1hdC5LRVlfTUlNRSkuc3RhcnRzV2l0aChtaW1lVHlwZVByZWZpeCkpIHsKKyAgICAgICAgICAgICAgZm9ybWF0ID0gdHJhY2tNZWRpYUZvcm1hdDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgfQorICAgICAgZXh0cmFjdG9yLnJlbGVhc2UoKTsKKyAgICAgIGlmIChmb3JtYXQgPT0gbnVsbCkgeworICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJjb3VsZG4ndCBnZXQgYSB0cmFjayBmb3IgIiArIG1pbWVUeXBlUHJlZml4KTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGZvcm1hdDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE1lZGlhRXh0cmFjdG9yIGNyZWF0ZU1lZGlhRXh0cmFjdG9yRm9yTWltZVR5cGUoCisgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsIGludCByZXNvdXJjZUlkLCBTdHJpbmcgbWltZVR5cGVQcmVmaXgpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBNZWRpYUV4dHJhY3RvciBleHRyYWN0b3IgPSBuZXcgTWVkaWFFeHRyYWN0b3IoKTsKKyAgICAgICAgQXNzZXRGaWxlRGVzY3JpcHRvciBhZmQgPSBjb250ZXh0LmdldFJlc291cmNlcygpLm9wZW5SYXdSZXNvdXJjZUZkKHJlc291cmNlSWQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZXh0cmFjdG9yLnNldERhdGFTb3VyY2UoCisgICAgICAgICAgICAgICAgICAgIGFmZC5nZXRGaWxlRGVzY3JpcHRvcigpLCBhZmQuZ2V0U3RhcnRPZmZzZXQoKSwgYWZkLmdldExlbmd0aCgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGFmZC5jbG9zZSgpOworICAgICAgICB9CisgICAgICAgIGludCB0cmFja0luZGV4OworICAgICAgICBmb3IgKHRyYWNrSW5kZXggPSAwOyB0cmFja0luZGV4IDwgZXh0cmFjdG9yLmdldFRyYWNrQ291bnQoKTsgdHJhY2tJbmRleCsrKSB7CisgICAgICAgICAgICBNZWRpYUZvcm1hdCB0cmFja01lZGlhRm9ybWF0ID0gZXh0cmFjdG9yLmdldFRyYWNrRm9ybWF0KHRyYWNrSW5kZXgpOworICAgICAgICAgICAgaWYgKHRyYWNrTWVkaWFGb3JtYXQuZ2V0U3RyaW5nKE1lZGlhRm9ybWF0LktFWV9NSU1FKS5zdGFydHNXaXRoKG1pbWVUeXBlUHJlZml4KSkgeworICAgICAgICAgICAgICAgIGV4dHJhY3Rvci5zZWxlY3RUcmFjayh0cmFja0luZGV4KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAodHJhY2tJbmRleCA9PSBleHRyYWN0b3IuZ2V0VHJhY2tDb3VudCgpKSB7CisgICAgICAgICAgICBleHRyYWN0b3IucmVsZWFzZSgpOworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiY291bGRuJ3QgZ2V0IGEgdHJhY2sgZm9yICIgKyBtaW1lVHlwZVByZWZpeCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZXh0cmFjdG9yOworICAgIH0KKworICAgIC8qCisgICAgICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSEVMUEVSIE1FVEhPRFMgRk9SIENPREVDIENPTkZJR1VSQVRJT04KKyAgICAgKi8KKworICAgIC8qKiBGb3JtYXQgbXVzdCBjb250YWluIG1pbWUsIHdpZHRoIGFuZCBoZWlnaHQuCisgICAgICogIFRocm93cyBFeGNlcHRpb24gaWYgZW5jb2RlciBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgd2lkdGggYW5kIGhlaWdodCAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRNYXhFbmNvZGVyRnJhbWVBbmRCaXRyYXRlcygKKyAgICAgICAgICAgIE1lZGlhQ29kZWMgZW5jb2RlciwgTWVkaWFGb3JtYXQgZm9ybWF0LCBpbnQgbWF4RnBzKSB7CisgICAgICAgIFN0cmluZyBtaW1lID0gZm9ybWF0LmdldFN0cmluZyhNZWRpYUZvcm1hdC5LRVlfTUlNRSk7CisKKyAgICAgICAgVmlkZW9DYXBhYmlsaXRpZXMgdmlkQ2FwcyA9CisgICAgICAgICAgICBlbmNvZGVyLmdldENvZGVjSW5mbygpLmdldENhcGFiaWxpdGllc0ZvclR5cGUobWltZSkuZ2V0VmlkZW9DYXBhYmlsaXRpZXMoKTsKKyAgICAgICAgc2V0TWF4RW5jb2RlckZyYW1lQW5kQml0cmF0ZXModmlkQ2FwcywgZm9ybWF0LCBtYXhGcHMpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRNYXhFbmNvZGVyRnJhbWVBbmRCaXRyYXRlcygKKyAgICAgICAgICAgIFZpZGVvQ2FwYWJpbGl0aWVzIHZpZENhcHMsIE1lZGlhRm9ybWF0IGZvcm1hdCwgaW50IG1heEZwcykgeworICAgICAgICBpbnQgd2lkdGggPSBmb3JtYXQuZ2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfV0lEVEgpOworICAgICAgICBpbnQgaGVpZ2h0ID0gZm9ybWF0LmdldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0hFSUdIVCk7CisKKyAgICAgICAgaW50IG1heFdpZHRoID0gdmlkQ2Fwcy5nZXRTdXBwb3J0ZWRXaWR0aHMoKS5nZXRVcHBlcigpOworICAgICAgICBpbnQgbWF4SGVpZ2h0ID0gdmlkQ2Fwcy5nZXRTdXBwb3J0ZWRIZWlnaHRzRm9yKG1heFdpZHRoKS5nZXRVcHBlcigpOworICAgICAgICBpbnQgZnJhbWVSYXRlID0gTWF0aC5taW4oCisgICAgICAgICAgICAgICAgbWF4RnBzLCB2aWRDYXBzLmdldFN1cHBvcnRlZEZyYW1lUmF0ZXNGb3Iod2lkdGgsIGhlaWdodCkuZ2V0VXBwZXIoKS5pbnRWYWx1ZSgpKTsKKyAgICAgICAgZm9ybWF0LnNldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0ZSQU1FX1JBVEUsIGZyYW1lUmF0ZSk7CisKKyAgICAgICAgaW50IGJpdHJhdGUgPSB2aWRDYXBzLmdldEJpdHJhdGVSYW5nZSgpLmNsYW1wKAorICAgICAgICAgICAgKGludCkodmlkQ2Fwcy5nZXRCaXRyYXRlUmFuZ2UoKS5nZXRVcHBlcigpIC8KKyAgICAgICAgICAgICAgICAgIE1hdGguc3FydCgoZG91YmxlKW1heFdpZHRoICogbWF4SGVpZ2h0IC8gd2lkdGggLyBoZWlnaHQpKSk7CisgICAgICAgIGZvcm1hdC5zZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9CSVRfUkFURSwgYml0cmF0ZSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAgLS0tLS0tLS0tLS0tLS0tLS0tIEhFTFBFUiBNRVRIT0RTIEZPUiBTVEFUSVNUSUNTIEFORCBSRVBPUlRJTkcgLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICovCisKKyAgICAvLyBUT0RPOiBtaWdyYXRlIHRoaXMgaW50byBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlN0YXQKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN0YXRzIHsKKyAgICAgICAgLyoqIGRvZXMgbm90IHN1cHBvcnQgTmFOIG9yIEluZiBpbiB8ZGF0YXwgKi8KKyAgICAgICAgcHVibGljIFN0YXRzKGRvdWJsZVtdIGRhdGEpIHsKKyAgICAgICAgICAgIG1EYXRhID0gZGF0YTsKKyAgICAgICAgICAgIGlmIChtRGF0YSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbU51bSA9IG1EYXRhLmxlbmd0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0TnVtKCkgeworICAgICAgICAgICAgcmV0dXJuIG1OdW07CisgICAgICAgIH0KKworICAgICAgICAvKiogY2FsY3VsYXRlIG1TdW1YIGFuZCBtU3VtWFggKi8KKyAgICAgICAgcHJpdmF0ZSB2b2lkIGFuYWx5emUoKSB7CisgICAgICAgICAgICBpZiAobUFuYWx5emVkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobURhdGEgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZvciAoZG91YmxlIHggOiBtRGF0YSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoISh4ID49IG1NaW5YKSkgeyAvLyBtTWluWCBtYXkgYmUgTmFOCisgICAgICAgICAgICAgICAgICAgICAgICBtTWluWCA9IHg7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCEoeCA8PSBtTWF4WCkpIHsgLy8gbU1heFggbWF5IGJlIE5hTgorICAgICAgICAgICAgICAgICAgICAgICAgbU1heFggPSB4OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1TdW1YICs9IHg7CisgICAgICAgICAgICAgICAgICAgIG1TdW1YWCArPSB4ICogeDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQW5hbHl6ZWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLyoqIHJldHVybnMgdGhlIG1heGltdW0gb3IgTmFOIGlmIGl0IGRvZXMgbm90IGV4aXN0ICovCisgICAgICAgIHB1YmxpYyBkb3VibGUgZ2V0TWluKCkgeworICAgICAgICAgICAgYW5hbHl6ZSgpOworICAgICAgICAgICAgcmV0dXJuIG1NaW5YOworICAgICAgICB9CisKKyAgICAgICAgLyoqIHJldHVybnMgdGhlIG1pbmltdW0gb3IgTmFOIGlmIGl0IGRvZXMgbm90IGV4aXN0ICovCisgICAgICAgIHB1YmxpYyBkb3VibGUgZ2V0TWF4KCkgeworICAgICAgICAgICAgYW5hbHl6ZSgpOworICAgICAgICAgICAgcmV0dXJuIG1NYXhYOworICAgICAgICB9CisKKyAgICAgICAgLyoqIHJldHVybnMgdGhlIGF2ZXJhZ2Ugb3IgTmFOIGlmIGl0IGRvZXMgbm90IGV4aXN0LiAqLworICAgICAgICBwdWJsaWMgZG91YmxlIGdldEF2ZXJhZ2UoKSB7CisgICAgICAgICAgICBhbmFseXplKCk7CisgICAgICAgICAgICBpZiAobU51bSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIERvdWJsZS5OYU47CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBtU3VtWCAvIG1OdW07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiogcmV0dXJucyB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9yIE5hTiBpZiBpdCBkb2VzIG5vdCBleGlzdC4gKi8KKyAgICAgICAgcHVibGljIGRvdWJsZSBnZXRTdGRldigpIHsKKyAgICAgICAgICAgIGFuYWx5emUoKTsKKyAgICAgICAgICAgIGlmIChtTnVtID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRG91YmxlLk5hTjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZG91YmxlIGF2ZXJhZ2UgPSBtU3VtWCAvIG1OdW07CisgICAgICAgICAgICAgICAgcmV0dXJuIE1hdGguc3FydChtU3VtWFggLyBtTnVtIC0gYXZlcmFnZSAqIGF2ZXJhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqIHJldHVybnMgdGhlIHN0YXRpc3RpY3MgZm9yIHRoZSBtb3ZpbmcgYXZlcmFnZSBvdmVyIG4gdmFsdWVzICovCisgICAgICAgIHB1YmxpYyBTdGF0cyBtb3ZpbmdBdmVyYWdlKGludCBuKSB7CisgICAgICAgICAgICBpZiAobiA8IDEgfHwgbU51bSA8IG4pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0YXRzKG51bGwpOworICAgICAgICAgICAgfSBlbHNlIGlmIChuID09IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZG91YmxlW10gYXZncyA9IG5ldyBkb3VibGVbbU51bSAtIG4gKyAxXTsKKyAgICAgICAgICAgIGRvdWJsZSBzdW0gPSAwOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTnVtOyArK2kpIHsKKyAgICAgICAgICAgICAgICBzdW0gKz0gbURhdGFbaV07CisgICAgICAgICAgICAgICAgaWYgKGkgPj0gbiAtIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZnc1tpIC0gbiArIDFdID0gc3VtIC8gbjsKKyAgICAgICAgICAgICAgICAgICAgc3VtIC09IG1EYXRhW2kgLSBuICsgMV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ldyBTdGF0cyhhdmdzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiByZXR1cm5zIHRoZSBzdGF0aXN0aWNzIGZvciB0aGUgbW92aW5nIGF2ZXJhZ2Ugb3ZlciBhIHdpbmRvdyBvdmVyIHRoZQorICAgICAgICAgKiAgY3VtdWxhdGl2ZSBzdW0uIEJhc2ljYWxseSwgbW92ZXMgYSB3aW5kb3cgZnJvbTogWzAsIHdpbmRvd10gdG8KKyAgICAgICAgICogIFtzdW0gLSB3aW5kb3csIHN1bV0gb3ZlciB0aGUgY3VtdWxhdGl2ZSBzdW0sIG92ZXIgKChzdW0gLSB3aW5kb3cpIC8gYXZlcmFnZSkKKyAgICAgICAgICogIHN0ZXBzLCBhbmQgcmV0dXJucyB0aGUgYXZlcmFnZSB2YWx1ZSBvdmVyIGVhY2ggd2luZG93LgorICAgICAgICAgKiAgVGhpcyBtZXRob2QgaXMgdXNlZCB0byBhdmVyYWdlIHRpbWUtZGlmZiBkYXRhIG92ZXIgYSB3aW5kb3cgb2YgYSBjb25zdGFudCB0aW1lLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0YXRzIG1vdmluZ0F2ZXJhZ2VPdmVyU3VtKGRvdWJsZSB3aW5kb3cpIHsKKyAgICAgICAgICAgIGlmICh3aW5kb3cgPD0gMCB8fCBtTnVtIDwgMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RhdHMobnVsbCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFuYWx5emUoKTsKKyAgICAgICAgICAgIGRvdWJsZSBhdmVyYWdlID0gbVN1bVggLyBtTnVtOworICAgICAgICAgICAgaWYgKHdpbmRvdyA+PSBtU3VtWCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RhdHMobmV3IGRvdWJsZVtdIHsgYXZlcmFnZSB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBzYW1wbGVzID0gKGludClNYXRoLmNlaWwoKG1TdW1YIC0gd2luZG93KSAvIGF2ZXJhZ2UpOworICAgICAgICAgICAgZG91YmxlW10gYXZncyA9IG5ldyBkb3VibGVbc2FtcGxlc107CisKKyAgICAgICAgICAgIC8vIEEgc29tZXdoYXQgYnJ1dGUgZm9yY2UgYXBwcm9hY2ggdG8gY2FsY3VsYXRpbmcgdGhlIG1vdmluZyBhdmVyYWdlLgorICAgICAgICAgICAgLy8gVE9ETzogYWRkIHN1cHBvcnQgZm9yIHdlaWdodHMgaW4gU3RhdHMsIHNvIHdlIGNhbiBkbyBhIG1vcmUgcmVmaW5lZCBhcHByb2FjaC4KKyAgICAgICAgICAgIGRvdWJsZSBzdW0gPSAwOyAvLyBzdW0gb2YgZWxlbWVudHMgaW4gdGhlIHdpbmRvdworICAgICAgICAgICAgaW50IG51bSA9IDA7IC8vIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbW92aW5nIHdpbmRvdworICAgICAgICAgICAgaW50IGJpID0gMDsgLy8gaW5kZXggb2YgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIG1vdmluZyB3aW5kb3cKKyAgICAgICAgICAgIGludCBlaSA9IDA7IC8vIGluZGV4IG9mIHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlIG1vdmluZyB3aW5kb3cKKyAgICAgICAgICAgIGRvdWJsZSBzcGFjZSA9IHdpbmRvdzsgLy8gc3BhY2UgYXQgdGhlIGVuZCBvZiB0aGUgd2luZG93CisgICAgICAgICAgICBkb3VibGUgZm9vdCA9IDA7IC8vIHNwYWNlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHdpbmRvdworCisgICAgICAgICAgICAvLyBpbnZhcmlhbnRzOiBmb290ICsgc3VtICsgc3BhY2UgPT0gd2luZG93CisgICAgICAgICAgICAvLyAgICAgICAgICAgICBiaSArIG51bSA9PSBlaQorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vICB3aW5kb3c6ICAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgfCAgICA8LS0tLS1zdW0tLS0tLS0+ICAgICAgICAgICB8CisgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICA8Zm9vdD4gICAgICAgICAgICAgICA8LS0tc3BhY2UtLT4KKyAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgIC8vICBpbnRlcnZhbHM6ICAgfC0tLS0tLS0tLS0tfC0tLS0tLS18LS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLXwKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgXmJpICAgICAgICAgICAgIF5laQorCisgICAgICAgICAgICBpbnQgaXggPSAwOyAvLyBpbmRleCBpbiB0aGUgcmVzdWx0CisgICAgICAgICAgICB3aGlsZSAoaXggPCBzYW1wbGVzKSB7CisgICAgICAgICAgICAgICAgLy8gYWRkIGludGVydmFscyB3aGlsZSB0aGVyZSBpcyBzcGFjZSBpbiB0aGUgd2luZG93CisgICAgICAgICAgICAgICAgd2hpbGUgKGVpIDwgbURhdGEubGVuZ3RoICYmIG1EYXRhW2VpXSA8PSBzcGFjZSkgeworICAgICAgICAgICAgICAgICAgICBzcGFjZSAtPSBtRGF0YVtlaV07CisgICAgICAgICAgICAgICAgICAgIHN1bSArPSBtRGF0YVtlaV07CisgICAgICAgICAgICAgICAgICAgIG51bSsrOworICAgICAgICAgICAgICAgICAgICBlaSsrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSBhdmVyYWdlIG92ZXIgd2luZG93IGFuZCBkZWFsIHdpdGggb2RkcyBhbmQgZW5kcyAoZS5nLiBpZiB0aGVyZSBhcmUgbm8KKyAgICAgICAgICAgICAgICAvLyBpbnRlcnZhbHMgaW4gdGhlIGN1cnJlbnQgd2luZG93OiBwaWNrIHdoaWNoZXZlciBlbGVtZW50IG92ZXJsYXBzIHRoZSB3aW5kb3cKKyAgICAgICAgICAgICAgICAvLyBtb3N0LgorICAgICAgICAgICAgICAgIGlmIChudW0gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGF2Z3NbaXgrK10gPSBzdW0gLyBudW07CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChiaSA+IDAgJiYgZm9vdCA+IHNwYWNlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNpZGVyIHByZXZpb3VzCisgICAgICAgICAgICAgICAgICAgIGF2Z3NbaXgrK10gPSBtRGF0YVtiaSAtIDFdOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZWkgPT0gbURhdGEubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGF2Z3NbaXgrK10gPSBtRGF0YVtlaV07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gbW92ZSB0aGUgd2luZG93IHRvIHRoZSBuZXh0IHBvc2l0aW9uCisgICAgICAgICAgICAgICAgZm9vdCAtPSBhdmVyYWdlOworICAgICAgICAgICAgICAgIHNwYWNlICs9IGF2ZXJhZ2U7CisKKyAgICAgICAgICAgICAgICAvLyByZW1vdmUgaW50ZXJ2YWxzIHRoYXQgYXJlIG5vdyBwYXJ0aWFsbHkgb3Igd2hvbGx5IG91dHNpZGUgb2YgdGhlIHdpbmRvdworICAgICAgICAgICAgICAgIHdoaWxlIChiaSA8IGVpICYmIGZvb3QgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGZvb3QgKz0gbURhdGFbYmldOworICAgICAgICAgICAgICAgICAgICBzdW0gLT0gbURhdGFbYmldOworICAgICAgICAgICAgICAgICAgICBudW0tLTsKKyAgICAgICAgICAgICAgICAgICAgYmkrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0YXRzKEFycmF5cy5jb3B5T2YoYXZncywgaXgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBjYWxjdWxhdGUgbVNvcnRlZERhdGEgKi8KKyAgICAgICAgcHJpdmF0ZSB2b2lkIHNvcnQoKSB7CisgICAgICAgICAgICBpZiAobVNvcnRlZCB8fCBtTnVtID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtU29ydGVkRGF0YSA9IEFycmF5cy5jb3B5T2YobURhdGEsIG1OdW0pOworICAgICAgICAgICAgQXJyYXlzLnNvcnQobVNvcnRlZERhdGEpOworICAgICAgICAgICAgbVNvcnRlZCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICAvKiogcmV0dXJucyBhbiBhcnJheSBvZiBwZXJjZW50aWxlcyBmb3IgdGhlIHBvaW50cyB1c2luZyBuZWFyZXN0IHJhbmsgKi8KKyAgICAgICAgcHVibGljIGRvdWJsZVtdIGdldFBlcmNlbnRpbGVzKGRvdWJsZS4uLiBwb2ludHMpIHsKKyAgICAgICAgICAgIHNvcnQoKTsKKyAgICAgICAgICAgIGRvdWJsZVtdIHJlcyA9IG5ldyBkb3VibGVbcG9pbnRzLmxlbmd0aF07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgIGlmIChtTnVtIDwgMSB8fCBwb2ludHNbaV0gPCAwIHx8IHBvaW50c1tpXSA+IDEwMCkgeworICAgICAgICAgICAgICAgICAgICByZXNbaV0gPSBEb3VibGUuTmFOOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJlc1tpXSA9IG1Tb3J0ZWREYXRhWyhpbnQpTWF0aC5yb3VuZChwb2ludHNbaV0gLyAxMDAgKiAobU51bSAtIDEpKV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgU3RhdHMpIHsKKyAgICAgICAgICAgICAgICBTdGF0cyBvdGhlciA9IChTdGF0cylvOworICAgICAgICAgICAgICAgIGlmIChvdGhlci5tTnVtICE9IG1OdW0pIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobU51bSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXlzLmVxdWFscyhtRGF0YSwgb3RoZXIubURhdGEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBkb3VibGVbXSBtRGF0YTsKKyAgICAgICAgcHJpdmF0ZSBkb3VibGUgbVN1bVggPSAwOworICAgICAgICBwcml2YXRlIGRvdWJsZSBtU3VtWFggPSAwOworICAgICAgICBwcml2YXRlIGRvdWJsZSBtTWluWCA9IERvdWJsZS5OYU47CisgICAgICAgIHByaXZhdGUgZG91YmxlIG1NYXhYID0gRG91YmxlLk5hTjsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbU51bSA9IDA7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtQW5hbHl6ZWQgPSBmYWxzZTsKKyAgICAgICAgcHJpdmF0ZSBkb3VibGVbXSBtU29ydGVkRGF0YTsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1Tb3J0ZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IGEgZm9yd2FyZCBsb2NrIC5kbSBtZXNzYWdlIHN0cmVhbSB0byBhIC5mbCBmaWxlCisgICAgICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB0byB1c2UKKyAgICAgKiBAcGFyYW0gZG1TdHJlYW0gVGhlIC5kbSBtZXNzYWdlCisgICAgICogQHBhcmFtIGZsRmlsZSBUaGUgb3V0cHV0IGZpbGUgdG8gYmUgd3JpdHRlbgorICAgICAqIEByZXR1cm4gc3VjY2VzcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb252ZXJ0RG1Ub0ZsKAorICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgSW5wdXRTdHJlYW0gZG1TdHJlYW0sCisgICAgICAgICAgICBSYW5kb21BY2Nlc3NGaWxlIGZsRmlsZSkgeworICAgICAgICBmaW5hbCBTdHJpbmcgTUlNRVRZUEVfRFJNX01FU1NBR0UgPSAiYXBwbGljYXRpb24vdm5kLm9tYS5kcm0ubWVzc2FnZSI7CisgICAgICAgIGJ5dGVbXSBkbURhdGEgPSBuZXcgYnl0ZVsxMDAwMF07CisgICAgICAgIGludCB0b3RhbFJlYWQgPSAwOworICAgICAgICBpbnQgbnVtUmVhZDsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbnVtUmVhZCA9IGRtU3RyZWFtLnJlYWQoZG1EYXRhLCB0b3RhbFJlYWQsIGRtRGF0YS5sZW5ndGggLSB0b3RhbFJlYWQpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0byByZWFkIGZyb20gaW5wdXQgZmlsZSIpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChudW1SZWFkID09IC0xKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0b3RhbFJlYWQgKz0gbnVtUmVhZDsKKyAgICAgICAgICAgIGlmICh0b3RhbFJlYWQgPT0gZG1EYXRhLmxlbmd0aCkgeworICAgICAgICAgICAgICAgIC8vIGdyb3cgYXJyYXkKKyAgICAgICAgICAgICAgICBkbURhdGEgPSBBcnJheXMuY29weU9mKGRtRGF0YSwgZG1EYXRhLmxlbmd0aCArIDEwMDAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBieXRlW10gZmlsZURhdGEgPSBBcnJheXMuY29weU9mKGRtRGF0YSwgdG90YWxSZWFkKTsKKworICAgICAgICBEcm1NYW5hZ2VyQ2xpZW50IGRybUNsaWVudCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBkcm1DbGllbnQgPSBuZXcgRHJtTWFuYWdlckNsaWVudChjb250ZXh0KTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIkRybU1hbmFnZXJDbGllbnQgaW5zdGFuY2UgY291bGQgbm90IGJlIGNyZWF0ZWQsIGNvbnRleHQgaXMgSWxsZWdhbC4iKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIkRybU1hbmFnZXJDbGllbnQgZGlkbid0IGluaXRpYWxpemUgcHJvcGVybHkuIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IGNvbnZlcnRTZXNzaW9uSWQgPSAtMTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29udmVydFNlc3Npb25JZCA9IGRybUNsaWVudC5vcGVuQ29udmVydFNlc3Npb24oTUlNRVRZUEVfRFJNX01FU1NBR0UpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDb252ZXJzaW9uIG9mIE1pbWV0eXBlOiAiICsgTUlNRVRZUEVfRFJNX01FU1NBR0UKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpcyBub3Qgc3VwcG9ydGVkLiIsIGUpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ291bGQgbm90IGFjY2VzcyBPcGVuIERybUZyYW1ld29yay4iLCBlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjb252ZXJ0U2Vzc2lvbklkIDwgMCkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0byBvcGVuIHNlc3Npb24uIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBEcm1Db252ZXJ0ZWRTdGF0dXMgY29udmVydGVkU3RhdHVzID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29udmVydGVkU3RhdHVzID0gZHJtQ2xpZW50LmNvbnZlcnREYXRhKGNvbnZlcnRTZXNzaW9uSWQsIGZpbGVEYXRhKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQnVmZmVyIHdpdGggZGF0YSB0byBjb252ZXJ0IGlzIGlsbGVnYWwuIENvbnZlcnRzZXNzaW9uOiAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGNvbnZlcnRTZXNzaW9uSWQsIGUpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ291bGQgbm90IGNvbnZlcnQgZGF0YS4gQ29udmVydHNlc3Npb246ICIgKyBjb252ZXJ0U2Vzc2lvbklkLCBlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjb252ZXJ0ZWRTdGF0dXMgPT0gbnVsbCB8fAorICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWRTdGF0dXMuc3RhdHVzQ29kZSAhPSBEcm1Db252ZXJ0ZWRTdGF0dXMuU1RBVFVTX09LIHx8CisgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZFN0YXR1cy5jb252ZXJ0ZWREYXRhID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJFcnJvciBpbiBjb252ZXJ0aW5nIGRhdGEuIENvbnZlcnRzZXNzaW9uOiAiICsgY29udmVydFNlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgRHJtQ29udmVydGVkU3RhdHVzIHJlc3VsdCA9IGRybUNsaWVudC5jbG9zZUNvbnZlcnRTZXNzaW9uKGNvbnZlcnRTZXNzaW9uSWQpOworICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnN0YXR1c0NvZGUgIT0gRHJtQ29udmVydGVkU3RhdHVzLlNUQVRVU19PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ29udmVyc2lvbiBmYWlsZWQgd2l0aCBzdGF0dXM6ICIgKyByZXN1bHQuc3RhdHVzQ29kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDb3VsZCBub3QgY2xvc2Ugc2Vzc2lvbi4gQ29udmVydHNlc3Npb246ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydFNlc3Npb25JZCwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmbEZpbGUud3JpdGUoY29udmVydGVkU3RhdHVzLmNvbnZlcnRlZERhdGEsIDAsIGNvbnZlcnRlZFN0YXR1cy5jb252ZXJ0ZWREYXRhLmxlbmd0aCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRvIHdyaXRlIHRvIG91dHB1dCBmaWxlOiAiICsgZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNvbnZlcnRlZFN0YXR1cyA9IGRybUNsaWVudC5jbG9zZUNvbnZlcnRTZXNzaW9uKGNvbnZlcnRTZXNzaW9uSWQpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDb3VsZCBub3QgY2xvc2UgY29udmVydHNlc3Npb24uIENvbnZlcnRzZXNzaW9uOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRTZXNzaW9uSWQsIGUpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvbnZlcnRlZFN0YXR1cyA9PSBudWxsIHx8CisgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZFN0YXR1cy5zdGF0dXNDb2RlICE9IERybUNvbnZlcnRlZFN0YXR1cy5TVEFUVVNfT0sgfHwKKyAgICAgICAgICAgICAgICAgICAgY29udmVydGVkU3RhdHVzLmNvbnZlcnRlZERhdGEgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkVycm9yIGluIGNsb3Npbmcgc2Vzc2lvbi4gQ29udmVydHNlc3Npb246ICIgKyBjb252ZXJ0U2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZmxGaWxlLnNlZWsoY29udmVydGVkU3RhdHVzLm9mZnNldCk7CisgICAgICAgICAgICAgICAgZmxGaWxlLndyaXRlKGNvbnZlcnRlZFN0YXR1cy5jb252ZXJ0ZWREYXRhKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDb3VsZCBub3QgdXBkYXRlIGZpbGUuIiwgZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGRybUNsaWVudC5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGRlY29kZXIgbmV3IE1lZGlhQ29kZWMgb2JqZWN0CisgICAgICogQHBhcmFtIGV4IE1lZGlhRXh0cmFjdG9yIGFmdGVyIHNldERhdGFTb3VyY2UgYW5kIHNlbGVjdFRyYWNrCisgICAgICogQHBhcmFtIGZyYW1lTUQ1U3VtcyByZWZlcmVuY2UgTUQ1IGNoZWNrc3VtIGZvciBkZWNvZGVkIGZyYW1lcworICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBkZWNvZGVkIGZyYW1lcyBjaGVja3N1bXMgbWF0Y2hlcyByZWZlcmVuY2UgY2hlY2tzdW1zCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2ZXJpZnlEZWNvZGVyKAorICAgICAgICAgICAgTWVkaWFDb2RlYyBkZWNvZGVyLCBNZWRpYUV4dHJhY3RvciBleCwgTGlzdDxTdHJpbmc+IGZyYW1lTUQ1U3VtcykKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaW50IHRyYWNrSW5kZXggPSBleC5nZXRTYW1wbGVUcmFja0luZGV4KCk7CisgICAgICAgIE1lZGlhRm9ybWF0IGZvcm1hdCA9IGV4LmdldFRyYWNrRm9ybWF0KHRyYWNrSW5kZXgpOworICAgICAgICBkZWNvZGVyLmNvbmZpZ3VyZShmb3JtYXQsIG51bGwgLyogc3VyZmFjZSAqLywgbnVsbCAvKiBjcnlwdG8gKi8sIDAgLyogZmxhZ3MgKi8pOworICAgICAgICBkZWNvZGVyLnN0YXJ0KCk7CisKKyAgICAgICAgYm9vbGVhbiBzYXdJbnB1dEVPUyA9IGZhbHNlOworICAgICAgICBib29sZWFuIHNhd091dHB1dEVPUyA9IGZhbHNlOworICAgICAgICBmaW5hbCBsb25nIGtUaW1lT3V0VXMgPSA1MDAwOyAvLyA1bXMgdGltZW91dAorICAgICAgICBpbnQgZGVjb2RlZEZyYW1lQ291bnQgPSAwOworICAgICAgICBpbnQgZXhwZWN0ZWRGcmFtZUNvdW50ID0gZnJhbWVNRDVTdW1zLnNpemUoKTsKKyAgICAgICAgTWVkaWFDb2RlYy5CdWZmZXJJbmZvIGluZm8gPSBuZXcgTWVkaWFDb2RlYy5CdWZmZXJJbmZvKCk7CisKKyAgICAgICAgd2hpbGUgKCFzYXdPdXRwdXRFT1MpIHsKKyAgICAgICAgICAgIC8vIGhhbmRsZSBpbnB1dAorICAgICAgICAgICAgaWYgKCFzYXdJbnB1dEVPUykgeworICAgICAgICAgICAgICAgIGludCBpbklkeCA9IGRlY29kZXIuZGVxdWV1ZUlucHV0QnVmZmVyKGtUaW1lT3V0VXMpOworICAgICAgICAgICAgICAgIGlmIChpbklkeCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgYnVmZmVyID0gZGVjb2Rlci5nZXRJbnB1dEJ1ZmZlcihpbklkeCk7CisgICAgICAgICAgICAgICAgICAgIGludCBzYW1wbGVTaXplID0gZXgucmVhZFNhbXBsZURhdGEoYnVmZmVyLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNhbXBsZVNpemUgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZmxhZ0VPUyA9IE1lZGlhQ29kZWMuQlVGRkVSX0ZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXIucXVldWVJbnB1dEJ1ZmZlcihpbklkeCwgMCwgMCwgMCwgZmxhZ0VPUyk7CisgICAgICAgICAgICAgICAgICAgICAgICBzYXdJbnB1dEVPUyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyLnF1ZXVlSW5wdXRCdWZmZXIoaW5JZHgsIDAsIHNhbXBsZVNpemUsIGV4LmdldFNhbXBsZVRpbWUoKSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBleC5hZHZhbmNlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGhhbmRsZSBvdXRwdXQKKyAgICAgICAgICAgIGludCBvdXRwdXRCdWZJbmRleCA9IGRlY29kZXIuZGVxdWV1ZU91dHB1dEJ1ZmZlcihpbmZvLCBrVGltZU91dFVzKTsKKyAgICAgICAgICAgIGlmIChvdXRwdXRCdWZJbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8uc2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIERpc3JlZ2FyZCAwLXNpemVkIGJ1ZmZlcnMgYXQgdGhlIGVuZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZDVDaGVja1N1bSA9ICIiOworICAgICAgICAgICAgICAgICAgICAgICAgSW1hZ2UgaW1hZ2UgPSBkZWNvZGVyLmdldE91dHB1dEltYWdlKG91dHB1dEJ1ZkluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1kNUNoZWNrU3VtID0gZ2V0SW1hZ2VNRDVDaGVja3N1bShpbWFnZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbWQ1Q2hlY2tTdW0uZXF1YWxzKGZyYW1lTUQ1U3Vtcy5nZXQoZGVjb2RlZEZyYW1lQ291bnQpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGcmFtZSAlZCBtZDVzdW0gbWlzbWF0Y2g6ICVzKGFjdHVhbCkgdnMgJXMoZXhwZWN0ZWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZEZyYW1lQ291bnQsIG1kNUNoZWNrU3VtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZU1ENVN1bXMuZ2V0KGRlY29kZWRGcmFtZUNvdW50KSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZEZyYW1lQ291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgImdldE91dHB1dEltYWdlIG1kNUNoZWNrU3VtIGZhaWxlZCIsIGUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgZGVjb2Rlci5yZWxlYXNlT3V0cHV0QnVmZmVyKG91dHB1dEJ1ZkluZGV4LCBmYWxzZSAvKiByZW5kZXIgKi8pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKGluZm8uZmxhZ3MgJiBNZWRpYUNvZGVjLkJVRkZFUl9GTEFHX0VORF9PRl9TVFJFQU0pICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc2F3T3V0cHV0RU9TID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKG91dHB1dEJ1ZkluZGV4ID09IE1lZGlhQ29kZWMuSU5GT19PVVRQVVRfRk9STUFUX0NIQU5HRUQpIHsKKyAgICAgICAgICAgICAgICBNZWRpYUZvcm1hdCBkZWNPdXRwdXRGb3JtYXQgPSBkZWNvZGVyLmdldE91dHB1dEZvcm1hdCgpOworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm91dHB1dCBmb3JtYXQgIiArIGRlY091dHB1dEZvcm1hdCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG91dHB1dEJ1ZkluZGV4ID09IE1lZGlhQ29kZWMuSU5GT19PVVRQVVRfQlVGRkVSU19DSEFOR0VEKSB7CisgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiU2tpcCBoYW5kbGluZyBNZWRpYUNvZGVjLklORk9fT1VUUFVUX0JVRkZFUlNfQ0hBTkdFRCIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChvdXRwdXRCdWZJbmRleCA9PSBNZWRpYUNvZGVjLklORk9fVFJZX0FHQUlOX0xBVEVSKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgImRlY29kZXIuZGVxdWV1ZU91dHB1dEJ1ZmZlcigpIHVucmVjb2duaXplZCBpbmRleDogIiArIG91dHB1dEJ1ZkluZGV4KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGVjb2RlZEZyYW1lQ291bnQgIT0gZXhwZWN0ZWRGcmFtZUNvdW50KSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRJbWFnZU1ENUNoZWNrc3VtKEltYWdlIGltYWdlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IGZvcm1hdCA9IGltYWdlLmdldEZvcm1hdCgpOworICAgICAgICBpZiAoSW1hZ2VGb3JtYXQuWVVWXzQyMF84ODggIT0gZm9ybWF0KSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJ1bnN1cHBvcnRlZCBpbWFnZSBmb3JtYXQiKTsKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorCisgICAgICAgIE1lc3NhZ2VEaWdlc3QgbWQgPSBNZXNzYWdlRGlnZXN0LmdldEluc3RhbmNlKCJNRDUiKTsKKworICAgICAgICBpbnQgaW1hZ2VXaWR0aCA9IGltYWdlLmdldFdpZHRoKCk7CisgICAgICAgIGludCBpbWFnZUhlaWdodCA9IGltYWdlLmdldEhlaWdodCgpOworCisgICAgICAgIEltYWdlLlBsYW5lW10gcGxhbmVzID0gaW1hZ2UuZ2V0UGxhbmVzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGxhbmVzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBCeXRlQnVmZmVyIGJ1ZiA9IHBsYW5lc1tpXS5nZXRCdWZmZXIoKTsKKworICAgICAgICAgICAgaW50IHdpZHRoLCBoZWlnaHQsIHJvd1N0cmlkZSwgcGl4ZWxTdHJpZGUsIHgsIHk7CisgICAgICAgICAgICByb3dTdHJpZGUgPSBwbGFuZXNbaV0uZ2V0Um93U3RyaWRlKCk7CisgICAgICAgICAgICBwaXhlbFN0cmlkZSA9IHBsYW5lc1tpXS5nZXRQaXhlbFN0cmlkZSgpOworICAgICAgICAgICAgaWYgKGkgPT0gMCkgeworICAgICAgICAgICAgICAgIHdpZHRoID0gaW1hZ2VXaWR0aDsKKyAgICAgICAgICAgICAgICBoZWlnaHQgPSBpbWFnZUhlaWdodDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgd2lkdGggPSBpbWFnZVdpZHRoIC8gMjsKKyAgICAgICAgICAgICAgICBoZWlnaHQgPSBpbWFnZUhlaWdodCAvMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGxvY2FsIGNvbnRpZ3VvdXMgcGl4ZWwgYnVmZmVyCisgICAgICAgICAgICBieXRlW10gYmIgPSBuZXcgYnl0ZVt3aWR0aCAqIGhlaWdodF07CisgICAgICAgICAgICBpZiAoYnVmLmhhc0FycmF5KCkpIHsKKyAgICAgICAgICAgICAgICBieXRlIGJbXSA9IGJ1Zi5hcnJheSgpOworICAgICAgICAgICAgICAgIGludCBvZmZzID0gYnVmLmFycmF5T2Zmc2V0KCk7CisgICAgICAgICAgICAgICAgaWYgKHBpeGVsU3RyaWRlID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJiLCB5ICogd2lkdGgsIGIsIHkgKiByb3dTdHJpZGUgKyBvZmZzLCB3aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBkbyBpdCBwaXhlbC1ieS1waXhlbAorICAgICAgICAgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lT2Zmc2V0ID0gb2ZmcyArIHkgKiByb3dTdHJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7ICsreCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJiW3kgKiB3aWR0aCArIHhdID0gYltsaW5lT2Zmc2V0ICsgeCAqIHBpeGVsU3RyaWRlXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7IC8vIGFsbW9zdCBhbHdheXMgZW5kcyB1cCBoZXJlIGR1ZSB0byBkaXJlY3QgYnVmZmVycworICAgICAgICAgICAgICAgIGludCBwb3MgPSBidWYucG9zaXRpb24oKTsKKyAgICAgICAgICAgICAgICBpZiAocGl4ZWxTdHJpZGUgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5wb3NpdGlvbihwb3MgKyB5ICogcm93U3RyaWRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5nZXQoYmIsIHkgKiB3aWR0aCwgd2lkdGgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbG9jYWwgbGluZSBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGxiID0gbmV3IGJ5dGVbcm93U3RyaWRlXTsKKyAgICAgICAgICAgICAgICAgICAgLy8gZG8gaXQgcGl4ZWwtYnktcGl4ZWwKKyAgICAgICAgICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBidWYucG9zaXRpb24ocG9zICsgeSAqIHJvd1N0cmlkZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSdyZSBvbmx5IGd1YXJhbnRlZWQgdG8gaGF2ZSBwaXhlbFN0cmlkZSAqICh3aWR0aCAtIDEpICsgMSBieXRlcworICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmdldChsYiwgMCwgcGl4ZWxTdHJpZGUgKiAod2lkdGggLSAxKSArIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYlt5ICogd2lkdGggKyB4XSA9IGxiW3ggKiBwaXhlbFN0cmlkZV07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnVmLnBvc2l0aW9uKHBvcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZC51cGRhdGUoYmIsIDAsIHdpZHRoICogaGVpZ2h0KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjb252ZXJ0Qnl0ZUFycmF5VG9IRVhTdHJpbmcobWQuZGlnZXN0KCkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBjb252ZXJ0Qnl0ZUFycmF5VG9IRVhTdHJpbmcoYnl0ZVtdIGJhKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJhLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKEludGVnZXIudG9TdHJpbmcoKGJhW2ldICYgMHhmZikgKyAweDEwMCwgMTYpLnN1YnN0cmluZygxKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRU5EIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICovCit9CmRpZmYgLS1naXQgYS9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvTW9yZU1hdGNoZXJzLmphdmEgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvTW9yZU1hdGNoZXJzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VlNjEwZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9Nb3JlTWF0Y2hlcnMuamF2YQpAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKKworaW1wb3J0IG9yZy5tb2NraXRvLkFyZ3VtZW50TWF0Y2hlcnM7CisKK3B1YmxpYyBjbGFzcyBNb3JlTWF0Y2hlcnMgeworICAgIHByaXZhdGUgTW9yZU1hdGNoZXJzKCkgeworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFQgYW55T3JOdWxsKENsYXNzPFQ+IGNsYXp6KSB7CisgICAgICAgIHJldHVybiBBcmd1bWVudE1hdGNoZXJzLmFyZ1RoYXQodmFsdWUgLT4gdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgYW55U3RyaW5nT3JOdWxsKCkgeworICAgICAgICByZXR1cm4gQXJndW1lbnRNYXRjaGVycy5hcmdUaGF0KHZhbHVlIC0+IHRydWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9OdWxsV2ViVmlld1V0aWxzLmphdmEgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvTnVsbFdlYlZpZXdVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNTNhZGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvTnVsbFdlYlZpZXdVdGlscy5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWw7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CisKKy8qKgorICogVXRpbGl0aWVzIHRvIGVuYWJsZSB0aGUgYW5kcm9pZC53ZWJraXQuKiBDVFMgdGVzdHMgKGFuZCBvdGhlcnMgdGhhdCByZWx5IG9uIGEgZnVuY3Rpb25pbmcKKyAqIGFuZHJvaWQud2Via2l0LldlYlZpZXcgaW1wbGVtZW50YXRpb24pIHRvIGRldGVybWluZSB3aGV0aGVyIGEgZnVuY3Rpb25pbmcgV2ViVmlldyBpcyBwcmVzZW50CisgKiBvbiB0aGUgZGV2aWNlIG9yIG5vdC4KKyAqCisgKiBUZXN0IGNhc2VzIHRoYXQgcmVxdWlyZSBhbmRyb2lkLndlYmtpdC4qIGNsYXNzZXMgc2hvdWxkIHdyYXAgdGhlaXIgZmlyc3QgdXNhZ2Ugb2YgV2ViVmlldyBpbiBhCisgKiB0cnkgY2F0Y2ggYmxvY2ssIGFuZCBwYXNzIGFueSBleGNlcHRpb24gdGhhdCBpcyB0aHJvd24gdG8KKyAqIE51bGxXZWJWaWV3VXRpbHMuZGV0ZXJtaW5lSWZXZWJWaWV3QXZhaWxhYmxlLiBUaGUgcmV0dXJuIHZhbHVlIG9mCisgKiBOdWxsV2ViVmlld1V0aWxzLmlzV2ViVmlld0F2YWlsYWJsZSB3aWxsIHRoZW4gZGV0ZXJtaW5lIGlmIHRoZSB0ZXN0IHNob3VsZCBleHBlY3QgdG8gYmUgYWJsZSB0bworICogdXNlIGEgV2ViVmlldy4KKyAqLworcHVibGljIGNsYXNzIE51bGxXZWJWaWV3VXRpbHMgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzV2ViVmlld1VuYXZhaWxhYmxlOworCisgICAgLyoqCisgICAgICogQHBhcmFtIGNvbnRleHQgQ3VycmVudCBBY3Rpdml0eSBjb250ZXh0LCB1c2VkIHRvIHF1ZXJ5IHRoZSBQYWNrYWdlTWFuYWdlci4KKyAgICAgKiBAcGFyYW0gdCAgICAgICBBbiBleGNlcHRpb24gdGhyb3duIGJ5IHRyeWluZyB0byBpbnZva2UgYW5kcm9pZC53ZWJraXQuKiBBUElzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZXRlcm1pbmVJZldlYlZpZXdBdmFpbGFibGUoQ29udGV4dCBjb250ZXh0LCBUaHJvd2FibGUgdCkgeworICAgICAgICBzV2ViVmlld1VuYXZhaWxhYmxlID0gIWhhc1dlYlZpZXdGZWF0dXJlKGNvbnRleHQpICYmIGNoZWNrQ2F1c2VXYXNVbnN1cHBvcnRlZE9wZXJhdGlvbih0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZnRlciBjYWxsaW5nIGRldGVybWluZUlmV2ViVmlld0F2YWlsYWJsZSwgdGhpcyByZXR1cm5zIHdoZXRoZXIgYSBXZWJWaWV3IGlzIGF2YWlsYWJsZSBvbiB0aGUKKyAgICAgKiBkZXZpY2UgYW5kIHdoZXRlciB0aGUgdGVzdCBjYW4gcmVseSBvbiBpdC4KKyAgICAgKiBAcmV0dXJuIFRydWUgaWZmLiBQYWNrYWdlTWFuYWdlciBkZXRlcm1pbmVkIHRoYXQgdGhlcmUgaXMgbm8gV2ViVmlldyBvbiB0aGUgZGV2aWNlIGFuZCB0aGUKKyAgICAgKiAgICAgICAgIGV4Y2VwdGlvbiB0aHJvd24gZnJvbSBhbmRyb2lkLndlYmtpdC4qIHdhcyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNXZWJWaWV3QXZhaWxhYmxlKCkgeworICAgICAgICByZXR1cm4gIXNXZWJWaWV3VW5hdmFpbGFibGU7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBoYXNXZWJWaWV3RmVhdHVyZShDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgLy8gUXVlcnkgdGhlIHN5c3RlbSBwcm9wZXJ0eSB0aGF0IGRldGVybWlucyBpZiB0aGVyZSBpcyBhIGZ1bmN0aW9uYWwgV2ViVmlldyBvbiB0aGUgZGV2aWNlLgorICAgICAgICBQYWNrYWdlTWFuYWdlciBwbSA9IGNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKTsKKyAgICAgICAgcmV0dXJuIHBtLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9XRUJWSUVXKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNoZWNrQ2F1c2VXYXNVbnN1cHBvcnRlZE9wZXJhdGlvbihUaHJvd2FibGUgdCkgeworICAgICAgICBpZiAodCA9PSBudWxsKSByZXR1cm4gZmFsc2U7CisgICAgICAgIHdoaWxlICh0LmdldENhdXNlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgdCA9IHQuZ2V0Q2F1c2UoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdCBpbnN0YW5jZW9mIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNvbWUgQ1RTIHRlc3RzIChieSBkZXNpZ24pIGZpcnN0IHVzZSBhbmRyb2lkLndlYmtpdC4qIGZyb20gYSBiYWNrZ3JvdW5kIHRocmVhZC4gVGhpcyBoZWxwZXIKKyAgICAgKiBhbGxvd3MgdGhlIHRlc3QgdG8gY2F0Y2ggdGhlIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGZyb20gdGhhdCBiYWNrZ3JvdW5kIHRocmVhZCwgYW5kCisgICAgICogdGhlbiBxdWVyeSB0aGUgcmVzdWx0IGZyb20gdGhlIHRlc3QgbWFpbiB0aHJlYWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBOdWxsV2ViVmlld0Zyb21UaHJlYWRFeGNlcHRpb25IYW5kbGVyCisgICAgICAgICAgICBpbXBsZW1lbnRzIFRocmVhZC5VbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIgeworICAgICAgICBwcml2YXRlIFRocm93YWJsZSBtUGVuZGluZ0V4Y2VwdGlvbjsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdW5jYXVnaHRFeGNlcHRpb24oVGhyZWFkIHQsIFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICBtUGVuZGluZ0V4Y2VwdGlvbiA9IGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dlYlZpZXdBdmFpbGFibGUoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICByZXR1cm4gaGFzV2ViVmlld0ZlYXR1cmUoY29udGV4dCkgfHwKKyAgICAgICAgICAgICAgICAgICAgIWNoZWNrQ2F1c2VXYXNVbnN1cHBvcnRlZE9wZXJhdGlvbihtUGVuZGluZ0V4Y2VwdGlvbik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvT25GYWlsdXJlUnVsZS5qYXZhIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL09uRmFpbHVyZVJ1bGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODVjMTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL09uRmFpbHVyZVJ1bGUuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKKworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVzdFJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5EZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5tb2RlbC5TdGF0ZW1lbnQ7CisKKy8qKgorICogQ3VzdG9tIEpVbml0NCBydWxlIHRoYXQgcHJvdmlkZXMgYSBjYWxsYmFjayB1cG9uIHRlc3QgZmFpbHVyZXMuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBPbkZhaWx1cmVSdWxlIGltcGxlbWVudHMgVGVzdFJ1bGUgeworICAgIHByaXZhdGUgU3RyaW5nIG1Mb2dUYWcgPSAiT25GYWlsdXJlUnVsZSI7CisKKyAgICBwdWJsaWMgT25GYWlsdXJlUnVsZSgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgT25GYWlsdXJlUnVsZShTdHJpbmcgbG9nVGFnKSB7CisgICAgICAgIG1Mb2dUYWcgPSBsb2dUYWc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0YXRlbWVudCBhcHBseShTdGF0ZW1lbnQgYmFzZSwgRGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdGF0ZW1lbnQoKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgZXZhbHVhdGUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBiYXNlLmV2YWx1YXRlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUobUxvZ1RhZywgIlRlc3QgZmFpbGVkOiBkZXNjcmlwdGlvbj0iICsgIGRlc2NyaXB0aW9uICsgIlxuVGhyb3dhYmxlPSIgKyB0KTsKKyAgICAgICAgICAgICAgICAgICAgb25UZXN0RmFpbHVyZShiYXNlLCBkZXNjcmlwdGlvbiwgdCk7CisgICAgICAgICAgICAgICAgICAgIHRocm93IHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIG9uVGVzdEZhaWx1cmUoU3RhdGVtZW50IGJhc2UsIERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLCBUaHJvd2FibGUgdCk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1BhY2thZ2VVdGlsLmphdmEgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvUGFja2FnZVV0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGQ5ZTgyCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1BhY2thZ2VVdGlsLmphdmEKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWw7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQXBwbGljYXRpb25JbmZvOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlSW5mbzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247CisKKy8qKgorICogRGV2aWNlLXNpZGUgdXRpbGl0eSBjbGFzcyBmb3IgUGFja2FnZU1hbmFnZXItcmVsYXRlZCBvcGVyYXRpb25zCisgKi8KK3B1YmxpYyBjbGFzcyBQYWNrYWdlVXRpbCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gUGFja2FnZVV0aWwuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNZU1RFTV9BUFBfTUFTSyA9CisgICAgICAgICAgICBBcHBsaWNhdGlvbkluZm8uRkxBR19TWVNURU0gfCBBcHBsaWNhdGlvbkluZm8uRkxBR19VUERBVEVEX1NZU1RFTV9BUFA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEhFWF9BUlJBWSA9ICIwMTIzNDU2Nzg5QUJDREVGIi50b0NoYXJBcnJheSgpOworCisgICAgLyoqIFJldHVybnMgdHJ1ZSBpZiBhIHBhY2thZ2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSBleGlzdHMgb24gdGhlIGRldmljZSAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBleGlzdHMoU3RyaW5nIHBhY2thZ2VOYW1lKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gKGdldFBhY2thZ2VNYW5hZ2VyKCkuZ2V0QXBwbGljYXRpb25JbmZvKHBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlci5HRVRfTUVUQV9EQVRBKSAhPSBudWxsKTsKKyAgICAgICAgfSBjYXRjaChQYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIFJldHVybnMgdHJ1ZSBpZiBhIHBhY2thZ2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSBBTkQgU0hBIGRpZ2VzdCBleGlzdHMgb24gdGhlIGRldmljZSAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBleGlzdHMoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgc2hhKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoZ2V0UGFja2FnZU1hbmFnZXIoKS5nZXRBcHBsaWNhdGlvbkluZm8oCisgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lLCBQYWNrYWdlTWFuYWdlci5HRVRfTUVUQV9EQVRBKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHNoYS5lcXVhbHMoY29tcHV0ZVBhY2thZ2VTaWduYXR1cmVEaWdlc3QocGFja2FnZU5hbWUpKTsKKyAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHwgUGFja2FnZU1hbmFnZXIuTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBSZXR1cm5zIHRydWUgaWYgdGhlIGFwcCBmb3IgdGhlIGdpdmVuIHBhY2thZ2UgbmFtZSBpcyBhIHN5c3RlbSBhcHAgZm9yIHRoaXMgZGV2aWNlICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzU3lzdGVtQXBwKFN0cmluZyBwYWNrYWdlTmFtZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQXBwbGljYXRpb25JbmZvIGFpID0gZ2V0UGFja2FnZU1hbmFnZXIoKS5nZXRBcHBsaWNhdGlvbkluZm8ocGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VyLkdFVF9NRVRBX0RBVEEpOworICAgICAgICAgICAgcmV0dXJuIGFpICE9IG51bGwgJiYgKChhaS5mbGFncyAmIFNZU1RFTV9BUFBfTUFTSykgIT0gMCk7CisgICAgICAgIH0gY2F0Y2goUGFja2FnZU1hbmFnZXIuTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBSZXR1cm5zIHRoZSB2ZXJzaW9uIHN0cmluZyBvZiB0aGUgcGFja2FnZSBuYW1lLCBvciBudWxsIGlmIHRoZSBwYWNrYWdlIGNhbid0IGJlIGZvdW5kICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VmVyc2lvblN0cmluZyhTdHJpbmcgcGFja2FnZU5hbWUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFBhY2thZ2VJbmZvIGluZm8gPSBnZXRQYWNrYWdlTWFuYWdlcigpLmdldFBhY2thZ2VJbmZvKHBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlci5HRVRfTUVUQV9EQVRBKTsKKyAgICAgICAgICAgIHJldHVybiBpbmZvLnZlcnNpb25OYW1lOworICAgICAgICB9IGNhdGNoIChQYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb24gfCBOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJDb3VsZCBub3QgZmluZCB2ZXJzaW9uIHN0cmluZyBmb3IgcGFja2FnZSAiICsgcGFja2FnZU5hbWUpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wdXRlIHRoZSBzaWduYXR1cmUgU0hBIGRpZ2VzdCBmb3IgYSBwYWNrYWdlLgorICAgICAqIEBwYXJhbSBwYWNrYWdlIHRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIGZvciB3aGljaCB0aGUgc2lnbmF0dXJlIFNIQSBkaWdlc3QgaXMgcmVxdWVzdGVkCisgICAgICogQHJldHVybiB0aGUgc2lnbmF0dXJlIFNIQSBkaWdlc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb21wdXRlUGFja2FnZVNpZ25hdHVyZURpZ2VzdChTdHJpbmcgcGFja2FnZU5hbWUpCisgICAgICAgICAgICB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLCBQYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBQYWNrYWdlSW5mbyBwYWNrYWdlSW5mbyA9IGdldFBhY2thZ2VNYW5hZ2VyKCkKKyAgICAgICAgICAgICAgICAuZ2V0UGFja2FnZUluZm8ocGFja2FnZU5hbWUsIFBhY2thZ2VNYW5hZ2VyLkdFVF9TSUdOQVRVUkVTKTsKKyAgICAgICAgTWVzc2FnZURpZ2VzdCBtZXNzYWdlRGlnZXN0ID0gTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZSgiU0hBMjU2Iik7CisgICAgICAgIG1lc3NhZ2VEaWdlc3QudXBkYXRlKHBhY2thZ2VJbmZvLnNpZ25hdHVyZXNbMF0udG9CeXRlQXJyYXkoKSk7CisKKyAgICAgICAgZmluYWwgYnl0ZVtdIGRpZ2VzdCA9IG1lc3NhZ2VEaWdlc3QuZGlnZXN0KCk7CisgICAgICAgIGZpbmFsIGludCBkaWdlc3RMZW5ndGggPSBkaWdlc3QubGVuZ3RoOworICAgICAgICBmaW5hbCBpbnQgY2hhckNvdW50ID0gMyAqIGRpZ2VzdExlbmd0aCAtIDE7CisKKyAgICAgICAgZmluYWwgY2hhcltdIGNoYXJzID0gbmV3IGNoYXJbY2hhckNvdW50XTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaWdlc3RMZW5ndGg7IGkrKykgeworICAgICAgICAgICAgZmluYWwgaW50IGJ5dGVIZXggPSBkaWdlc3RbaV0gJiAweEZGOworICAgICAgICAgICAgY2hhcnNbaSAqIDNdID0gSEVYX0FSUkFZW2J5dGVIZXggPj4+IDRdOworICAgICAgICAgICAgY2hhcnNbaSAqIDMgKyAxXSA9IEhFWF9BUlJBWVtieXRlSGV4ICYgMHgwRl07CisgICAgICAgICAgICBpZiAoaSA8IGRpZ2VzdExlbmd0aCAtIDEpIHsKKyAgICAgICAgICAgICAgICBjaGFyc1tpICogMyArIDJdID0gJzonOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGNoYXJzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBQYWNrYWdlTWFuYWdlciBnZXRQYWNrYWdlTWFuYWdlcigpIHsKKyAgICAgICAgcmV0dXJuIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLmdldFRhcmdldENvbnRleHQoKS5nZXRQYWNrYWdlTWFuYWdlcigpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaGFzRGV2aWNlRmVhdHVyZShmaW5hbCBTdHJpbmcgcmVxdWlyZWRGZWF0dXJlKSB7CisgICAgICAgIHJldHVybiBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCkKKyAgICAgICAgICAgICAgICAuZ2V0UGFja2FnZU1hbmFnZXIoKQorICAgICAgICAgICAgICAgIC5oYXNTeXN0ZW1GZWF0dXJlKHJlcXVpcmVkRmVhdHVyZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUm90YXRpb24gc3VwcG9ydCBpcyBpbmRpY2F0ZWQgYnkgZXhwbGljaXRseSBoYXZpbmcgYm90aCBsYW5kc2NhcGUgYW5kIHBvcnRyYWl0CisgICAgICogZmVhdHVyZXMgb3Igbm90IGxpc3RpbmcgZWl0aGVyIGF0IGFsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3VwcG9ydHNSb3RhdGlvbigpIHsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBzdXBwb3J0c0xhbmRzY2FwZSA9IGhhc0RldmljZUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9TQ1JFRU5fTEFORFNDQVBFKTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBzdXBwb3J0c1BvcnRyYWl0ID0gaGFzRGV2aWNlRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX1NDUkVFTl9QT1JUUkFJVCk7CisgICAgICAgIHJldHVybiAoc3VwcG9ydHNMYW5kc2NhcGUgJiYgc3VwcG9ydHNQb3J0cmFpdCkKKyAgICAgICAgICAgICAgICB8fCAoIXN1cHBvcnRzTGFuZHNjYXBlICYmICFzdXBwb3J0c1BvcnRyYWl0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvUGFyY2VsVXRpbHMuamF2YSBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9QYXJjZWxVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjYWE3MjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvUGFyY2VsVXRpbHMuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CisKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CisKK3B1YmxpYyBjbGFzcyBQYXJjZWxVdGlscyB7CisgICAgcHJpdmF0ZSBQYXJjZWxVdGlscygpIHsKKyAgICB9CisKKyAgICAvKiogQ29udmVydCBhIFBhcmNlbGFibGUgaW50byBhIGJ5dGVbXS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSB0b0J5dGVzKFBhcmNlbGFibGUgcCkgeworICAgICAgICBhc3NlcnROb3ROdWxsKHApOworCisgICAgICAgIGZpbmFsIFBhcmNlbCBwYXJjZWwgPSBQYXJjZWwub2J0YWluKCk7CisgICAgICAgIHBhcmNlbC53cml0ZVBhcmNlbGFibGUocCwgMCk7CisgICAgICAgIGJ5dGVbXSBkYXRhID0gcGFyY2VsLm1hcnNoYWxsKCk7CisgICAgICAgIHBhcmNlbC5yZWN5Y2xlKCk7CisKKyAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgfQorCisgICAgLyoqIERlY29kZSBhIGJ5dGVbXSBpbnRvIGEgUGFyY2VsYWJsZS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIDxUIGV4dGVuZHMgUGFyY2VsYWJsZT4gVCBmcm9tQnl0ZXMoYnl0ZVtdIGRhdGEpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChkYXRhKTsKKworICAgICAgICBmaW5hbCBQYXJjZWwgcGFyY2VsID0gUGFyY2VsLm9idGFpbigpOworICAgICAgICBwYXJjZWwudW5tYXJzaGFsbChkYXRhLCAwLCBkYXRhLmxlbmd0aCk7CisgICAgICAgIHBhcmNlbC5zZXREYXRhUG9zaXRpb24oMCk7CisgICAgICAgIFQgcmV0ID0gcGFyY2VsLnJlYWRQYXJjZWxhYmxlKFBhcmNlbFV0aWxzLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOworICAgICAgICBwYXJjZWwucmVjeWNsZSgpOworCisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1BvbGxpbmdDaGVjay5qYXZhIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1BvbGxpbmdDaGVjay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjYzM1MzAKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvUG9sbGluZ0NoZWNrLmphdmEKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIFBvbGxpbmdDaGVjayB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBUSU1FX1NMSUNFID0gNTA7CisgICAgcHJpdmF0ZSBsb25nIG1UaW1lb3V0ID0gMzAwMDsKKworICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFBvbGxpbmdDaGVja0NvbmRpdGlvbiB7CisgICAgICAgIGJvb2xlYW4gY2FuUHJvY2VlZCgpOworICAgIH0KKworICAgIHB1YmxpYyBQb2xsaW5nQ2hlY2soKSB7CisgICAgfQorCisgICAgcHVibGljIFBvbGxpbmdDaGVjayhsb25nIHRpbWVvdXQpIHsKKyAgICAgICAgbVRpbWVvdXQgPSB0aW1lb3V0OworICAgIH0KKworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGNoZWNrKCk7CisKKyAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgIGlmIChjaGVjaygpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBsb25nIHRpbWVvdXQgPSBtVGltZW91dDsKKyAgICAgICAgd2hpbGUgKHRpbWVvdXQgPiAwKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChUSU1FX1NMSUNFKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBBc3NlcnQuZmFpbCgidW5leHBlY3RlZCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY2hlY2soKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGltZW91dCAtPSBUSU1FX1NMSUNFOworICAgICAgICB9CisKKyAgICAgICAgQXNzZXJ0LmZhaWwoInVuZXhwZWN0ZWQgdGltZW91dCIpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjaGVjayhDaGFyU2VxdWVuY2UgbWVzc2FnZSwgbG9uZyB0aW1lb3V0LCBDYWxsYWJsZTxCb29sZWFuPiBjb25kaXRpb24pCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgd2hpbGUgKHRpbWVvdXQgPiAwKSB7CisgICAgICAgICAgICBpZiAoY29uZGl0aW9uLmNhbGwoKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFRJTUVfU0xJQ0UpOworICAgICAgICAgICAgdGltZW91dCAtPSBUSU1FX1NMSUNFOworICAgICAgICB9CisKKyAgICAgICAgQXNzZXJ0LmZhaWwobWVzc2FnZS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd2FpdEZvcihmaW5hbCBQb2xsaW5nQ2hlY2tDb25kaXRpb24gY29uZGl0aW9uKSB7CisgICAgICAgIG5ldyBQb2xsaW5nQ2hlY2soKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBib29sZWFuIGNoZWNrKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBjb25kaXRpb24uY2FuUHJvY2VlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9LnJ1bigpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3YWl0Rm9yKGxvbmcgdGltZW91dCwgZmluYWwgUG9sbGluZ0NoZWNrQ29uZGl0aW9uIGNvbmRpdGlvbikgeworICAgICAgICBuZXcgUG9sbGluZ0NoZWNrKHRpbWVvdXQpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2soKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbmRpdGlvbi5jYW5Qcm9jZWVkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0ucnVuKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1Byb3BlcnR5VXRpbC5qYXZhIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1Byb3BlcnR5VXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NWI3MzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvUHJvcGVydHlVdGlsLmphdmEKQEAgLTAsMCArMSwxNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWw7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNjYW5uZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKKy8qKgorICogRGV2aWNlLXNpZGUgdXRpbGl0eSBjbGFzcyBmb3IgcmVhZGluZyBwcm9wZXJ0aWVzIGFuZCBnYXRoZXJpbmcgaW5mb3JtYXRpb24gZm9yIHRlc3RpbmcKKyAqIEFuZHJvaWQgZGV2aWNlIGNvbXBhdGliaWxpdHkuCisgKi8KK3B1YmxpYyBjbGFzcyBQcm9wZXJ0eVV0aWwgeworCisgICAgLyoqCisgICAgICogTmFtZSBvZiByZWFkLW9ubHkgcHJvcGVydHkgZGV0YWlsaW5nIHRoZSBmaXJzdCBBUEkgbGV2ZWwgZm9yIHdoaWNoIHRoZSBwcm9kdWN0IHdhcworICAgICAqIHNoaXBwZWQuIFByb3BlcnR5IHNob3VsZCBiZSB1bmRlZmluZWQgZm9yIGZhY3RvcnkgUk9NIHByb2R1Y3RzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJUlNUX0FQSV9MRVZFTCA9ICJyby5wcm9kdWN0LmZpcnN0X2FwaV9sZXZlbCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVSUxEX1RZUEVfUFJPUEVSVFkgPSAicm8uYnVpbGQudHlwZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1BTlVGQUNUVVJFUl9QUk9QRVJUWSA9ICJyby5wcm9kdWN0Lm1hbnVmYWN0dXJlciI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19ERVZfS0VZUyA9ICJkZXYta2V5cyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZOREtfVkVSU0lPTiA9ICJyby52bmRrLnZlcnNpb24iOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR09PR0xFX1NFVFRJTkdTX1FVRVJZID0KKyAgICAgICAgICAgICJjb250ZW50IHF1ZXJ5IC0tdXJpIGNvbnRlbnQ6Ly9jb20uZ29vZ2xlLnNldHRpbmdzL3BhcnRuZXIiOworCisgICAgLyoqIFZhbHVlIHRvIGJlIHJldHVybmVkIGJ5IGdldFByb3BlcnR5SW50KCkgaWYgcHJvcGVydHkgaXMgbm90IGZvdW5kICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgSU5UX1ZBTFVFX0lGX1VOU0VUID0gLTE7CisKKyAgICAvKiogUmV0dXJucyB3aGV0aGVyIHRoZSBkZXZpY2UgYnVpbGQgaXMgYSB1c2VyIGJ1aWxkICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVXNlckJ1aWxkKCkgeworICAgICAgICByZXR1cm4gcHJvcGVydHlFcXVhbHMoQlVJTERfVFlQRV9QUk9QRVJUWSwgInVzZXIiKTsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyB3aGV0aGVyIHRoZSBkZXZpY2UgYnVpbGQgaXMgdGhlIGZhY3RvcnkgUk9NICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRmFjdG9yeVJPTSgpIHsKKyAgICAgICAgLy8gcHJvcGVydHkgc2hvdWxkIGJlIHVuZGVmaW5lZCBpZiBhbmQgb25seSBpZiB0aGUgcHJvZHVjdCBpcyBmYWN0b3J5IFJPTS4KKyAgICAgICAgcmV0dXJuIGdldFByb3BlcnR5SW50KEZJUlNUX0FQSV9MRVZFTCkgPT0gSU5UX1ZBTFVFX0lGX1VOU0VUOworICAgIH0KKworICAgIC8qKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBidWlsZCBpcyBidWlsdCB3aXRoIGRldi1rZXlzICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGV2S2V5c0J1aWxkKCkgeworICAgICAgICBmb3IgKFN0cmluZyB0YWcgOiBCdWlsZC5UQUdTLnNwbGl0KCIsIikpIHsKKyAgICAgICAgICAgIGlmIChUQUdfREVWX0tFWVMuZXF1YWxzKHRhZy50cmltKCkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZmlyc3QgQVBJIGxldmVsIGZvciB0aGlzIHByb2R1Y3QuIElmIHRoZSByZWFkLW9ubHkgcHJvcGVydHkgaXMgdW5zZXQsCisgICAgICogdGhpcyBtZWFucyB0aGUgZmlyc3QgQVBJIGxldmVsIGlzIHRoZSBjdXJyZW50IEFQSSBsZXZlbCwgYW5kIHRoZSBjdXJyZW50IEFQSSBsZXZlbAorICAgICAqIGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldEZpcnN0QXBpTGV2ZWwoKSB7CisgICAgICAgIGludCBmaXJzdEFwaUxldmVsID0gZ2V0UHJvcGVydHlJbnQoRklSU1RfQVBJX0xFVkVMKTsKKyAgICAgICAgcmV0dXJuIChmaXJzdEFwaUxldmVsID09IElOVF9WQUxVRV9JRl9VTlNFVCkgPyBCdWlsZC5WRVJTSU9OLlNES19JTlQgOiBmaXJzdEFwaUxldmVsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB3aGV0aGVyIHRoZSBTREsgdmVyc2lvbiBvZiB0aGUgdmVuZG9yIHBhcnRpdG9uIGlzIG5ld2VyIHRoYW4gdGhlIGdpdmVuIEFQSSBsZXZlbC4KKyAgICAgKiBJZiB0aGUgcHJvcGVydHkgaXMgc2V0IHRvIG5vbi1pbnRlZ2VyIHZhbHVlLCB0aGlzIG1lYW5zIHRoZSB2ZW5kb3IgcGFydGl0aW9uIGlzIHVzaW5nCisgICAgICogY3VycmVudCBBUEkgbGV2ZWwgYW5kIHRydWUgaXMgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmVuZG9yQXBpTGV2ZWxOZXdlclRoYW4oaW50IGFwaUxldmVsKSB7CisgICAgICAgIGludCB2ZW5kb3JBcGlMZXZlbCA9IGdldFByb3BlcnR5SW50KFZOREtfVkVSU0lPTik7CisgICAgICAgIGlmICh2ZW5kb3JBcGlMZXZlbCA9PSBJTlRfVkFMVUVfSUZfVU5TRVQpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2ZW5kb3JBcGlMZXZlbCA+IGFwaUxldmVsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbWFudWZhY3R1cmVyIG9mIHRoaXMgcHJvZHVjdC4gSWYgdW5zZXQsIHJldHVybiBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1hbnVmYWN0dXJlcigpIHsKKyAgICAgICAgcmV0dXJuIGdldFByb3BlcnR5KE1BTlVGQUNUVVJFUl9QUk9QRVJUWSk7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgYSBtYXBwaW5nIGZyb20gY2xpZW50IElEIG5hbWVzIHRvIGNsaWVudCBJRCB2YWx1ZXMgKi8KKyAgICBwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0Q2xpZW50SWRzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgTWFwPFN0cmluZyxTdHJpbmc+IGNsaWVudElkcyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgU3RyaW5nIHF1ZXJ5T3V0cHV0ID0gU3lzdGVtVXRpbC5ydW5TaGVsbENvbW1hbmQoCisgICAgICAgICAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCksIEdPT0dMRV9TRVRUSU5HU19RVUVSWSk7CisgICAgICAgIGZvciAoU3RyaW5nIGxpbmUgOiBxdWVyeU91dHB1dC5zcGxpdCgiW1xccj9cXG5dKyIpKSB7CisgICAgICAgICAgICAvLyBFeHBlY3RlZCBsaW5lIGZvcm1hdDogIlJvdzogMSBfaWQ9MTIzLCBuYW1lPTxwcm9wZXJ0eV9uYW1lPiwgdmFsdWU9PHByb3BlcnR5X3ZhbHVlPiIKKyAgICAgICAgICAgIFBhdHRlcm4gcGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgibmFtZT0oW2Etel9dKiksIHZhbHVlPSguKikkIik7CisgICAgICAgICAgICBNYXRjaGVyIG1hdGNoZXIgPSBwYXR0ZXJuLm1hdGNoZXIobGluZSk7CisgICAgICAgICAgICBpZiAobWF0Y2hlci5maW5kKCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG1hdGNoZXIuZ3JvdXAoMSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gbWF0Y2hlci5ncm91cCgyKTsKKyAgICAgICAgICAgICAgICBpZiAobmFtZS5jb250YWlucygiY2xpZW50X2lkIikpIHsKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50SWRzLnB1dChuYW1lLCB2YWx1ZSk7IC8vIG9ubHkgYWRkIG5hbWUtdmFsdWUgcGFpciBmb3IgY2xpZW50IGlkcworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2xpZW50SWRzOworICAgIH0KKworICAgIC8qKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHByb3BlcnR5IGV4aXN0cyBvbiB0aGlzIGRldmljZSAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwcm9wZXJ0eUV4aXN0cyhTdHJpbmcgcHJvcGVydHkpIHsKKyAgICAgICAgcmV0dXJuIGdldFByb3BlcnR5KHByb3BlcnR5KSAhPSBudWxsOworICAgIH0KKworICAgIC8qKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHByb3BlcnR5IHZhbHVlIGlzIGVxdWFsIHRvIGEgZ2l2ZW4gc3RyaW5nICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHByb3BlcnR5RXF1YWxzKFN0cmluZyBwcm9wZXJ0eSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gIXByb3BlcnR5RXhpc3RzKHByb3BlcnR5KTsgLy8gbnVsbCB2YWx1ZSBpbXBsaWVzIHByb3BlcnR5IGRvZXMgbm90IGV4aXN0CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHZhbHVlLmVxdWFscyhnZXRQcm9wZXJ0eShwcm9wZXJ0eSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgcHJvcGVydHkgdmFsdWUgbWF0Y2hlcyBhIGdpdmVuIHJlZ3VsYXIgZXhwcmVzc2lvbi4gVGhlIG1ldGhvZCB1c2VzCisgICAgICogU3RyaW5nLm1hdGNoZXMoKSwgcmVxdWlyaW5nIGEgY29tcGxldGUgbWF0Y2ggKGkuZS4gZXhwcmVzc2lvbiBtYXRjaGVzIGVudGlyZSB2YWx1ZSBzdHJpbmcpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHByb3BlcnR5TWF0Y2hlcyhTdHJpbmcgcHJvcGVydHksIFN0cmluZyByZWdleCkgeworICAgICAgICBpZiAocmVnZXggPT0gbnVsbCB8fCByZWdleC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIC8vIG51bGwgb3IgZW1wdHkgcGF0dGVybiBpbXBsaWVzIHByb3BlcnR5IGRvZXMgbm90IGV4aXN0CisgICAgICAgICAgICByZXR1cm4gIXByb3BlcnR5RXhpc3RzKHByb3BlcnR5KTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgdmFsdWUgPSBnZXRQcm9wZXJ0eShwcm9wZXJ0eSk7CisgICAgICAgIHJldHVybiAodmFsdWUgPT0gbnVsbCkgPyBmYWxzZSA6IHZhbHVlLm1hdGNoZXMocmVnZXgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgZGVzaXJlZCBpbnRlZ2VyIHByb3BlcnR5LCByZXR1cm5pbmcgSU5UX1ZBTFVFX0lGX1VOU0VUIGlmIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRQcm9wZXJ0eUludChTdHJpbmcgcHJvcGVydHkpIHsKKyAgICAgICAgU3RyaW5nIHZhbHVlID0gZ2V0UHJvcGVydHkocHJvcGVydHkpOworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIElOVF9WQUxVRV9JRl9VTlNFVDsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQodmFsdWUpOworICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIElOVF9WQUxVRV9JRl9VTlNFVDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBSZXRyaWV2ZXMgdGhlIGRlc2lyZWQgcHJvcGVydHkgdmFsdWUgaW4gc3RyaW5nIGZvcm0gKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHkpIHsKKyAgICAgICAgU2Nhbm5lciBzY2FubmVyID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFByb2Nlc3MgcHJvY2VzcyA9IG5ldyBQcm9jZXNzQnVpbGRlcigiZ2V0cHJvcCIsIHByb3BlcnR5KS5zdGFydCgpOworICAgICAgICAgICAgc2Nhbm5lciA9IG5ldyBTY2FubmVyKHByb2Nlc3MuZ2V0SW5wdXRTdHJlYW0oKSk7CisgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBzY2FubmVyLm5leHRMaW5lKCkudHJpbSgpOworICAgICAgICAgICAgcmV0dXJuICh2YWx1ZS5pc0VtcHR5KCkpID8gbnVsbCA6IHZhbHVlOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChzY2FubmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzY2FubmVyLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvUmVhZEVsZi5qYXZhIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1JlYWRFbGYuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWFhOWNkCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1JlYWRFbGYuamF2YQpAQCAtMCwwICsxLDQ5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIEEgcG9vciBtYW4ncyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcmVhZGVsZiBjb21tYW5kLiBUaGlzIHByb2dyYW0gaXMgZGVzaWduZWQKKyAqIHRvIHBhcnNlIEVMRiAoRXhlY3V0YWJsZSBhbmQgTGlua2FibGUgRm9ybWF0KSBmaWxlcy4KKyAqLworcHVibGljIGNsYXNzIFJlYWRFbGYgaW1wbGVtZW50cyBBdXRvQ2xvc2VhYmxlIHsKKyAgICAvKiogVGhlIG1hZ2ljIHZhbHVlcyBmb3IgdGhlIEVMRiBpZGVudGlmaWNhdGlvbi4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gRUxGTUFHID0geworICAgICAgICAgICAgKGJ5dGUpIDB4N0YsIChieXRlKSAnRScsIChieXRlKSAnTCcsIChieXRlKSAnRicsIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRUlfTklERU5UID0gMTY7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRUlfQ0xBU1MgPSA0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFSV9EQVRBID0gNTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTV8zODYgPSAzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTV9NSVBTID0gODsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRU1fQVJNID0gNDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVNX1g4Nl82NCA9IDYyOworICAgIC8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUXVhbGNvbW1fSGV4YWdvbgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTV9RRFNQNiA9IDE2NDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRU1fQUFSQ0g2NCA9IDE4MzsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTEZDTEFTUzMyID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRUxGQ0xBU1M2NCA9IDI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRUxGREFUQTJMU0IgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTEZEQVRBMk1TQiA9IDI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZfQ1VSUkVOVCA9IDE7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFBUX0xPQUQgPSAxOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNIVF9TWU1UQUIgPSAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSFRfU1RSVEFCID0gMzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0hUX0RZTkFNSUMgPSA2OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSFRfRFlOU1lNID0gMTE7CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN5bWJvbCB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQl9MT0NBTCA9IDA7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQl9HTE9CQUwgPSAxOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEJfV0VBSyA9IDI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQl9MT1BST0MgPSAxMzsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RCX0hJUFJPQyA9IDE1OworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUVF9OT1RZUEUgPSAwOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVFRfT0JKRUNUID0gMTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RUX0ZVTkMgPSAyOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVFRfU0VDVElPTiA9IDM7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUVF9GSUxFID0gNDsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RUX0NPTU1PTiA9IDU7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUVF9UTFMgPSA2OworCisgICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgbmFtZTsKKyAgICAgICAgcHVibGljIGZpbmFsIGludCBiaW5kOworICAgICAgICBwdWJsaWMgZmluYWwgaW50IHR5cGU7CisKKyAgICAgICAgU3ltYm9sKFN0cmluZyBuYW1lLCBpbnQgc3RfaW5mbykgeworICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgICAgIHRoaXMuYmluZCA9IChzdF9pbmZvID4+IDQpICYgMHgwRjsKKyAgICAgICAgICAgIHRoaXMudHlwZSA9IHN0X2luZm8gJiAweDBGOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIlN5bWJvbFsiICsgbmFtZSArICIsIiArIHRvQmluZCgpICsgIiwiICsgdG9UeXBlKCkgKyAiXSI7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFN0cmluZyB0b0JpbmQoKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGJpbmQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFNUQl9MT0NBTDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJMT0NBTCI7CisgICAgICAgICAgICAgICAgY2FzZSBTVEJfR0xPQkFMOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkdMT0JBTCI7CisgICAgICAgICAgICAgICAgY2FzZSBTVEJfV0VBSzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJXRUFLIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAiU1RCXz8/PyAoIiArIGJpbmQgKyAiKSI7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFN0cmluZyB0b1R5cGUoKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFNUVF9OT1RZUEU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiTk9UWVBFIjsKKyAgICAgICAgICAgICAgICBjYXNlIFNUVF9PQkpFQ1Q6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiT0JKRUNUIjsKKyAgICAgICAgICAgICAgICBjYXNlIFNUVF9GVU5DOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkZVTkMiOworICAgICAgICAgICAgICAgIGNhc2UgU1RUX1NFQ1RJT046CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiU0VDVElPTiI7CisgICAgICAgICAgICAgICAgY2FzZSBTVFRfRklMRToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJGSUxFIjsKKyAgICAgICAgICAgICAgICBjYXNlIFNUVF9DT01NT046CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiQ09NTU9OIjsKKyAgICAgICAgICAgICAgICBjYXNlIFNUVF9UTFM6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiVExTIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAiU1RUXz8/PyAoIiArIHR5cGUgKyAiKSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtUGF0aDsKKyAgICBwcml2YXRlIGZpbmFsIFJhbmRvbUFjY2Vzc0ZpbGUgbUZpbGU7CisgICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gbUJ1ZmZlciA9IG5ldyBieXRlWzUxMl07CisgICAgcHJpdmF0ZSBpbnQgbUVuZGlhbjsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzRHluYW1pYzsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzUElFOworICAgIHByaXZhdGUgaW50IG1UeXBlOworICAgIHByaXZhdGUgaW50IG1BZGRyU2l6ZTsKKworICAgIC8qKiBTeW1ib2wgVGFibGUgb2Zmc2V0ICovCisgICAgcHJpdmF0ZSBsb25nIG1TeW1UYWJPZmZzZXQ7CisKKyAgICAvKiogU3ltYm9sIFRhYmxlIHNpemUgKi8KKyAgICBwcml2YXRlIGxvbmcgbVN5bVRhYlNpemU7CisKKyAgICAvKiogRHluYW1pYyBTeW1ib2wgVGFibGUgb2Zmc2V0ICovCisgICAgcHJpdmF0ZSBsb25nIG1EeW5TeW1PZmZzZXQ7CisKKyAgICAvKiogRHluYW1pYyBTeW1ib2wgVGFibGUgc2l6ZSAqLworICAgIHByaXZhdGUgbG9uZyBtRHluU3ltU2l6ZTsKKworICAgIC8qKiBTZWN0aW9uIEhlYWRlciBTdHJpbmcgVGFibGUgb2Zmc2V0ICovCisgICAgcHJpdmF0ZSBsb25nIG1TaFN0clRhYk9mZnNldDsKKworICAgIC8qKiBTZWN0aW9uIEhlYWRlciBTdHJpbmcgVGFibGUgc2l6ZSAqLworICAgIHByaXZhdGUgbG9uZyBtU2hTdHJUYWJTaXplOworCisgICAgLyoqIFN0cmluZyBUYWJsZSBvZmZzZXQgKi8KKyAgICBwcml2YXRlIGxvbmcgbVN0clRhYk9mZnNldDsKKworICAgIC8qKiBTdHJpbmcgVGFibGUgc2l6ZSAqLworICAgIHByaXZhdGUgbG9uZyBtU3RyVGFiU2l6ZTsKKworICAgIC8qKiBEeW5hbWljIFN0cmluZyBUYWJsZSBvZmZzZXQgKi8KKyAgICBwcml2YXRlIGxvbmcgbUR5blN0ck9mZnNldDsKKworICAgIC8qKiBEeW5hbWljIFN0cmluZyBUYWJsZSBzaXplICovCisgICAgcHJpdmF0ZSBsb25nIG1EeW5TdHJTaXplOworCisgICAgLyoqIFN5bWJvbCBUYWJsZSBzeW1ib2wgbmFtZXMgKi8KKyAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFN5bWJvbD4gbVN5bWJvbHM7CisKKyAgICAvKiogRHluYW1pYyBTeW1ib2wgVGFibGUgc3ltYm9sIG5hbWVzICovCisgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTeW1ib2w+IG1EeW5hbWljU3ltYm9sczsKKworICAgIHB1YmxpYyBzdGF0aWMgUmVhZEVsZiByZWFkKEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZWFkRWxmKGZpbGUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoU3RyaW5nIGFyZyA6IGFyZ3MpIHsKKyAgICAgICAgICAgIFJlYWRFbGYgcmUgPSBuZXcgUmVhZEVsZihuZXcgRmlsZShhcmcpKTsKKyAgICAgICAgICAgIHJlLmdldFN5bWJvbCgieCIpOworICAgICAgICAgICAgcmUuZ2V0RHluYW1pY1N5bWJvbCgieCIpOworICAgICAgICAgICAgcmUuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRHluYW1pYygpIHsKKyAgICAgICAgcmV0dXJuIG1Jc0R5bmFtaWM7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gbVR5cGU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNQSUUoKSB7CisgICAgICAgIHJldHVybiBtSXNQSUU7CisgICAgfQorCisgICAgcHJpdmF0ZSBSZWFkRWxmKEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgbVBhdGggPSBmaWxlLmdldFBhdGgoKTsKKyAgICAgICAgbUZpbGUgPSBuZXcgUmFuZG9tQWNjZXNzRmlsZShmaWxlLCAiciIpOworCisgICAgICAgIGlmIChtRmlsZS5sZW5ndGgoKSA8IEVJX05JREVOVCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVG9vIHNtYWxsIHRvIGJlIGFuIEVMRiBmaWxlOiAiICsgZmlsZSk7CisgICAgICAgIH0KKworICAgICAgICByZWFkSGVhZGVyKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtRmlsZS5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpZ25vcmVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2xvc2UoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHN1cGVyLmZpbmFsaXplKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVhZEhlYWRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG1GaWxlLnNlZWsoMCk7CisgICAgICAgIG1GaWxlLnJlYWRGdWxseShtQnVmZmVyLCAwLCBFSV9OSURFTlQpOworCisgICAgICAgIGlmIChtQnVmZmVyWzBdICE9IEVMRk1BR1swXSB8fCBtQnVmZmVyWzFdICE9IEVMRk1BR1sxXSB8fAorICAgICAgICAgICAgICAgIG1CdWZmZXJbMl0gIT0gRUxGTUFHWzJdIHx8IG1CdWZmZXJbM10gIT0gRUxGTUFHWzNdKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIEVMRiBmaWxlOiAiICsgbVBhdGgpOworICAgICAgICB9CisKKyAgICAgICAgaW50IGVsZkNsYXNzID0gbUJ1ZmZlcltFSV9DTEFTU107CisgICAgICAgIGlmIChlbGZDbGFzcyA9PSBFTEZDTEFTUzMyKSB7CisgICAgICAgICAgICBtQWRkclNpemUgPSA0OworICAgICAgICB9IGVsc2UgaWYgKGVsZkNsYXNzID09IEVMRkNMQVNTNjQpIHsKKyAgICAgICAgICAgIG1BZGRyU2l6ZSA9IDg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkludmFsaWQgRUxGIEVJX0NMQVNTOiAiICsgZWxmQ2xhc3MgKyAiOiAiICsgbVBhdGgpOworICAgICAgICB9CisKKyAgICAgICAgbUVuZGlhbiA9IG1CdWZmZXJbRUlfREFUQV07CisgICAgICAgIGlmIChtRW5kaWFuID09IEVMRkRBVEEyTFNCKSB7CisgICAgICAgIH0gZWxzZSBpZiAobUVuZGlhbiA9PSBFTEZEQVRBMk1TQikgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBFTEZEQVRBMk1TQiBmaWxlOiAiICsgbVBhdGgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJJbnZhbGlkIEVMRiBFSV9EQVRBOiAiICsgbUVuZGlhbiArICI6ICIgKyBtUGF0aCk7CisgICAgICAgIH0KKworICAgICAgICBtVHlwZSA9IHJlYWRIYWxmKCk7CisKKyAgICAgICAgaW50IGVfbWFjaGluZSA9IHJlYWRIYWxmKCk7CisgICAgICAgIGlmIChlX21hY2hpbmUgIT0gRU1fMzg2ICYmIGVfbWFjaGluZSAhPSBFTV9YODZfNjQgJiYKKyAgICAgICAgICAgICAgICBlX21hY2hpbmUgIT0gRU1fQUFSQ0g2NCAmJiBlX21hY2hpbmUgIT0gRU1fQVJNICYmCisgICAgICAgICAgICAgICAgZV9tYWNoaW5lICE9IEVNX01JUFMgJiYKKyAgICAgICAgICAgICAgICBlX21hY2hpbmUgIT0gRU1fUURTUDYpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiSW52YWxpZCBFTEYgZV9tYWNoaW5lOiAiICsgZV9tYWNoaW5lICsgIjogIiArIG1QYXRoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFiaVRlc3QgcmVsaWVzIG9uIHVzIHJlamVjdGluZyBhbnkgdW5zdXBwb3J0ZWQgY29tYmluYXRpb25zLgorICAgICAgICBpZiAoKGVfbWFjaGluZSA9PSBFTV8zODYgJiYgZWxmQ2xhc3MgIT0gRUxGQ0xBU1MzMikgfHwKKyAgICAgICAgICAgICAgICAoZV9tYWNoaW5lID09IEVNX1g4Nl82NCAmJiBlbGZDbGFzcyAhPSBFTEZDTEFTUzY0KSB8fAorICAgICAgICAgICAgICAgIChlX21hY2hpbmUgPT0gRU1fQUFSQ0g2NCAmJiBlbGZDbGFzcyAhPSBFTEZDTEFTUzY0KSB8fAorICAgICAgICAgICAgICAgIChlX21hY2hpbmUgPT0gRU1fQVJNICYmIGVsZkNsYXNzICE9IEVMRkNMQVNTMzIpIHx8CisgICAgICAgICAgICAgICAgKGVfbWFjaGluZSA9PSBFTV9RRFNQNiAmJiBlbGZDbGFzcyAhPSBFTEZDTEFTUzMyKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJJbnZhbGlkIGVfbWFjaGluZS9FSV9DTEFTUyBFTEYgY29tYmluYXRpb246ICIgKworICAgICAgICAgICAgICAgICAgICBlX21hY2hpbmUgKyAiLyIgKyBlbGZDbGFzcyArICI6ICIgKyBtUGF0aCk7CisgICAgICAgIH0KKworICAgICAgICBsb25nIGVfdmVyc2lvbiA9IHJlYWRXb3JkKCk7CisgICAgICAgIGlmIChlX3ZlcnNpb24gIT0gRVZfQ1VSUkVOVCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJJbnZhbGlkIGVfdmVyc2lvbjogIiArIGVfdmVyc2lvbiArICI6ICIgKyBtUGF0aCk7CisgICAgICAgIH0KKworICAgICAgICBsb25nIGVfZW50cnkgPSByZWFkQWRkcigpOworCisgICAgICAgIGxvbmcgcGhfb2ZmID0gcmVhZE9mZigpOworICAgICAgICBsb25nIHNoX29mZiA9IHJlYWRPZmYoKTsKKworICAgICAgICBsb25nIGVfZmxhZ3MgPSByZWFkV29yZCgpOworICAgICAgICBpbnQgZV9laHNpemUgPSByZWFkSGFsZigpOworICAgICAgICBpbnQgZV9waGVudHNpemUgPSByZWFkSGFsZigpOworICAgICAgICBpbnQgZV9waG51bSA9IHJlYWRIYWxmKCk7CisgICAgICAgIGludCBlX3NoZW50c2l6ZSA9IHJlYWRIYWxmKCk7CisgICAgICAgIGludCBlX3NobnVtID0gcmVhZEhhbGYoKTsKKyAgICAgICAgaW50IGVfc2hzdHJuZHggPSByZWFkSGFsZigpOworCisgICAgICAgIHJlYWRTZWN0aW9uSGVhZGVycyhzaF9vZmYsIGVfc2hudW0sIGVfc2hlbnRzaXplLCBlX3Noc3RybmR4KTsKKyAgICAgICAgcmVhZFByb2dyYW1IZWFkZXJzKHBoX29mZiwgZV9waG51bSwgZV9waGVudHNpemUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWFkU2VjdGlvbkhlYWRlcnMobG9uZyBzaF9vZmYsIGludCBlX3NobnVtLCBpbnQgZV9zaGVudHNpemUsIGludCBlX3Noc3RybmR4KQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gUmVhZCB0aGUgU2VjdGlvbiBIZWFkZXIgU3RyaW5nIFRhYmxlIG9mZnNldCBmaXJzdC4KKyAgICAgICAgeworICAgICAgICAgICAgbUZpbGUuc2VlayhzaF9vZmYgKyBlX3Noc3RybmR4ICogZV9zaGVudHNpemUpOworCisgICAgICAgICAgICBsb25nIHNoX25hbWUgPSByZWFkV29yZCgpOworICAgICAgICAgICAgbG9uZyBzaF90eXBlID0gcmVhZFdvcmQoKTsKKyAgICAgICAgICAgIGxvbmcgc2hfZmxhZ3MgPSByZWFkWChtQWRkclNpemUpOworICAgICAgICAgICAgbG9uZyBzaF9hZGRyID0gcmVhZEFkZHIoKTsKKyAgICAgICAgICAgIGxvbmcgc2hfb2Zmc2V0ID0gcmVhZE9mZigpOworICAgICAgICAgICAgbG9uZyBzaF9zaXplID0gcmVhZFgobUFkZHJTaXplKTsKKyAgICAgICAgICAgIC8vIC4uLgorCisgICAgICAgICAgICBpZiAoc2hfdHlwZSA9PSBTSFRfU1RSVEFCKSB7CisgICAgICAgICAgICAgICAgbVNoU3RyVGFiT2Zmc2V0ID0gc2hfb2Zmc2V0OworICAgICAgICAgICAgICAgIG1TaFN0clRhYlNpemUgPSBzaF9zaXplOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlX3NobnVtOyArK2kpIHsKKyAgICAgICAgICAgIC8vIERvbid0IGJvdGhlciB0byByZS1yZWFkIHRoZSBTZWN0aW9uIEhlYWRlciBTdHJUYWIuCisgICAgICAgICAgICBpZiAoaSA9PSBlX3Noc3RybmR4KSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1GaWxlLnNlZWsoc2hfb2ZmICsgaSAqIGVfc2hlbnRzaXplKTsKKworICAgICAgICAgICAgbG9uZyBzaF9uYW1lID0gcmVhZFdvcmQoKTsKKyAgICAgICAgICAgIGxvbmcgc2hfdHlwZSA9IHJlYWRXb3JkKCk7CisgICAgICAgICAgICBsb25nIHNoX2ZsYWdzID0gcmVhZFgobUFkZHJTaXplKTsKKyAgICAgICAgICAgIGxvbmcgc2hfYWRkciA9IHJlYWRBZGRyKCk7CisgICAgICAgICAgICBsb25nIHNoX29mZnNldCA9IHJlYWRPZmYoKTsKKyAgICAgICAgICAgIGxvbmcgc2hfc2l6ZSA9IHJlYWRYKG1BZGRyU2l6ZSk7CisKKyAgICAgICAgICAgIGlmIChzaF90eXBlID09IFNIVF9TWU1UQUIgfHwgc2hfdHlwZSA9PSBTSFRfRFlOU1lNKSB7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHN5bVRhYk5hbWUgPSByZWFkU2hTdHJUYWJFbnRyeShzaF9uYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoIi5zeW10YWIiLmVxdWFscyhzeW1UYWJOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBtU3ltVGFiT2Zmc2V0ID0gc2hfb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICBtU3ltVGFiU2l6ZSA9IHNoX3NpemU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiLmR5bnN5bSIuZXF1YWxzKHN5bVRhYk5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIG1EeW5TeW1PZmZzZXQgPSBzaF9vZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIG1EeW5TeW1TaXplID0gc2hfc2l6ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHNoX3R5cGUgPT0gU0hUX1NUUlRBQikgeworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzdHJUYWJOYW1lID0gcmVhZFNoU3RyVGFiRW50cnkoc2hfbmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKCIuc3RydGFiIi5lcXVhbHMoc3RyVGFiTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbVN0clRhYk9mZnNldCA9IHNoX29mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgbVN0clRhYlNpemUgPSBzaF9zaXplOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIi5keW5zdHIiLmVxdWFscyhzdHJUYWJOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBtRHluU3RyT2Zmc2V0ID0gc2hfb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICBtRHluU3RyU2l6ZSA9IHNoX3NpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChzaF90eXBlID09IFNIVF9EWU5BTUlDKSB7CisgICAgICAgICAgICAgICAgbUlzRHluYW1pYyA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVhZFByb2dyYW1IZWFkZXJzKGxvbmcgcGhfb2ZmLCBpbnQgZV9waG51bSwgaW50IGVfcGhlbnRzaXplKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVfcGhudW07ICsraSkgeworICAgICAgICAgICAgbUZpbGUuc2VlayhwaF9vZmYgKyBpICogZV9waGVudHNpemUpOworCisgICAgICAgICAgICBsb25nIHBfdHlwZSA9IHJlYWRXb3JkKCk7CisgICAgICAgICAgICBpZiAocF90eXBlID09IFBUX0xPQUQpIHsKKyAgICAgICAgICAgICAgICBpZiAobUFkZHJTaXplID09IDgpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gT25seSBpbiBFbGY2NF9waGRyOyBpbiBFbGYzMl9waGRyIHBfZmxhZ3MgaXMgYXQgdGhlIGVuZC4KKyAgICAgICAgICAgICAgICAgICAgbG9uZyBwX2ZsYWdzID0gcmVhZFdvcmQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbG9uZyBwX29mZnNldCA9IHJlYWRPZmYoKTsKKyAgICAgICAgICAgICAgICBsb25nIHBfdmFkZHIgPSByZWFkQWRkcigpOworICAgICAgICAgICAgICAgIC8vIC4uLgorCisgICAgICAgICAgICAgICAgaWYgKHBfdmFkZHIgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtSXNQSUUgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIFN5bWJvbD4gcmVhZFN5bWJvbFRhYmxlKGxvbmcgc3ltU3RyT2Zmc2V0LCBsb25nIHN5bVN0clNpemUsCisgICAgICAgICAgICBsb25nIHRhYmxlT2Zmc2V0LCBsb25nIHRhYmxlU2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSGFzaE1hcDxTdHJpbmcsIFN5bWJvbD4gcmVzdWx0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTeW1ib2w+KCk7CisgICAgICAgIG1GaWxlLnNlZWsodGFibGVPZmZzZXQpOworICAgICAgICB3aGlsZSAobUZpbGUuZ2V0RmlsZVBvaW50ZXIoKSA8IHRhYmxlT2Zmc2V0ICsgdGFibGVTaXplKSB7CisgICAgICAgICAgICBsb25nIHN0X25hbWUgPSByZWFkV29yZCgpOworICAgICAgICAgICAgaW50IHN0X2luZm87CisgICAgICAgICAgICBpZiAobUFkZHJTaXplID09IDgpIHsKKyAgICAgICAgICAgICAgICBzdF9pbmZvID0gcmVhZEJ5dGUoKTsKKyAgICAgICAgICAgICAgICBpbnQgc3Rfb3RoZXIgPSByZWFkQnl0ZSgpOworICAgICAgICAgICAgICAgIGludCBzdF9zaG5keCA9IHJlYWRIYWxmKCk7CisgICAgICAgICAgICAgICAgbG9uZyBzdF92YWx1ZSA9IHJlYWRBZGRyKCk7CisgICAgICAgICAgICAgICAgbG9uZyBzdF9zaXplID0gcmVhZFgobUFkZHJTaXplKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbG9uZyBzdF92YWx1ZSA9IHJlYWRBZGRyKCk7CisgICAgICAgICAgICAgICAgbG9uZyBzdF9zaXplID0gcmVhZFdvcmQoKTsKKyAgICAgICAgICAgICAgICBzdF9pbmZvID0gcmVhZEJ5dGUoKTsKKyAgICAgICAgICAgICAgICBpbnQgc3Rfb3RoZXIgPSByZWFkQnl0ZSgpOworICAgICAgICAgICAgICAgIGludCBzdF9zaG5keCA9IHJlYWRIYWxmKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RfbmFtZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzeW1OYW1lID0gcmVhZFN0clRhYkVudHJ5KHN5bVN0ck9mZnNldCwgc3ltU3RyU2l6ZSwgc3RfbmFtZSk7CisgICAgICAgICAgICBpZiAoc3ltTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgU3ltYm9sIHMgPSBuZXcgU3ltYm9sKHN5bU5hbWUsIHN0X2luZm8pOworICAgICAgICAgICAgICAgIHJlc3VsdC5wdXQoc3ltTmFtZSwgcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyByZWFkU2hTdHJUYWJFbnRyeShsb25nIHN0ck9mZnNldCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG1TaFN0clRhYk9mZnNldCA9PSAwIHx8IHN0ck9mZnNldCA8IDAgfHwgc3RyT2Zmc2V0ID49IG1TaFN0clRhYlNpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZWFkU3RyaW5nKG1TaFN0clRhYk9mZnNldCArIHN0ck9mZnNldCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVhZFN0clRhYkVudHJ5KGxvbmcgdGFibGVPZmZzZXQsIGxvbmcgdGFibGVTaXplLCBsb25nIHN0ck9mZnNldCkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICh0YWJsZU9mZnNldCA9PSAwIHx8IHN0ck9mZnNldCA8IDAgfHwgc3RyT2Zmc2V0ID49IHRhYmxlU2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlYWRTdHJpbmcodGFibGVPZmZzZXQgKyBzdHJPZmZzZXQpOworICAgIH0KKworICAgIHByaXZhdGUgaW50IHJlYWRIYWxmKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIChpbnQpIHJlYWRYKDIpOworICAgIH0KKworICAgIHByaXZhdGUgbG9uZyByZWFkV29yZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiByZWFkWCg0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIGxvbmcgcmVhZE9mZigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiByZWFkWChtQWRkclNpemUpOworICAgIH0KKworICAgIHByaXZhdGUgbG9uZyByZWFkQWRkcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiByZWFkWChtQWRkclNpemUpOworICAgIH0KKworICAgIHByaXZhdGUgbG9uZyByZWFkWChpbnQgYnl0ZUNvdW50KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBtRmlsZS5yZWFkRnVsbHkobUJ1ZmZlciwgMCwgYnl0ZUNvdW50KTsKKworICAgICAgICBpbnQgYW5zd2VyID0gMDsKKyAgICAgICAgaWYgKG1FbmRpYW4gPT0gRUxGREFUQTJMU0IpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBieXRlQ291bnQgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgICAgIGFuc3dlciA9IChhbnN3ZXIgPDwgOCkgfCAobUJ1ZmZlcltpXSAmIDB4ZmYpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmluYWwgaW50IE4gPSBieXRlQ291bnQgLSAxOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gTjsgKytpKSB7CisgICAgICAgICAgICAgICAgYW5zd2VyID0gKGFuc3dlciA8PCA4KSB8IChtQnVmZmVyW2ldICYgMHhmZik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYW5zd2VyOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIHJlYWRTdHJpbmcobG9uZyBvZmZzZXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGxvbmcgb3JpZ2luYWxPZmZzZXQgPSBtRmlsZS5nZXRGaWxlUG9pbnRlcigpOworICAgICAgICBtRmlsZS5zZWVrKG9mZnNldCk7CisgICAgICAgIG1GaWxlLnJlYWRGdWxseShtQnVmZmVyLCAwLCAoaW50KSBNYXRoLm1pbihtQnVmZmVyLmxlbmd0aCwgbUZpbGUubGVuZ3RoKCkgLSBvZmZzZXQpKTsKKyAgICAgICAgbUZpbGUuc2VlayhvcmlnaW5hbE9mZnNldCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtQnVmZmVyLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBpZiAobUJ1ZmZlcltpXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcobUJ1ZmZlciwgMCwgaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCByZWFkQnl0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBtRmlsZS5yZWFkKCkgJiAweGZmOworICAgIH0KKworICAgIHB1YmxpYyBTeW1ib2wgZ2V0U3ltYm9sKFN0cmluZyBuYW1lKSB7CisgICAgICAgIGlmIChtU3ltYm9scyA9PSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1TeW1ib2xzID0gcmVhZFN5bWJvbFRhYmxlKG1TdHJUYWJPZmZzZXQsIG1TdHJUYWJTaXplLCBtU3ltVGFiT2Zmc2V0LCBtU3ltVGFiU2l6ZSk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1TeW1ib2xzLmdldChuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3ltYm9sIGdldER5bmFtaWNTeW1ib2woU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgaWYgKG1EeW5hbWljU3ltYm9scyA9PSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1EeW5hbWljU3ltYm9scyA9IHJlYWRTeW1ib2xUYWJsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EeW5TdHJPZmZzZXQsIG1EeW5TdHJTaXplLCBtRHluU3ltT2Zmc2V0LCBtRHluU3ltU2l6ZSk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1EeW5hbWljU3ltYm9scy5nZXQobmFtZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1JlcG9ydExvZ0RldmljZUluZm9TdG9yZS5qYXZhIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1JlcG9ydExvZ0RldmljZUluZm9TdG9yZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzODg4MWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvUmVwb3J0TG9nRGV2aWNlSW5mb1N0b3JlLmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWw7CisKK2ltcG9ydCBhbmRyb2lkLnV0aWwuSnNvbldyaXRlcjsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitwdWJsaWMgY2xhc3MgUmVwb3J0TG9nRGV2aWNlSW5mb1N0b3JlIGV4dGVuZHMgRGV2aWNlSW5mb1N0b3JlIHsKKworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1TdHJlYW1OYW1lOworICAgIHByaXZhdGUgRmlsZSB0ZW1wSnNvbkZpbGU7CisKKyAgICBwdWJsaWMgUmVwb3J0TG9nRGV2aWNlSW5mb1N0b3JlKEZpbGUganNvbkZpbGUsIFN0cmluZyBzdHJlYW1OYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbUpzb25GaWxlID0ganNvbkZpbGU7CisgICAgICAgIG1TdHJlYW1OYW1lID0gc3RyZWFtTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIHRoZSB3cml0ZXIgYW5kIHN0YXJ0cyB0aGUgSlNPTiBPYmplY3QgZm9yIHRoZSBtZXRyaWMgc3RyZWFtLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9wZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBXcml0ZSBuZXcgbWV0cmljcyB0byBhIHRlbXAgZmlsZSB0byBhdm9pZCBpbnZhbGlkIEpTT04gZmlsZXMgZHVlIHRvIGZhaWxlZCB0ZXN0cy4KKyAgICAgICAgQnVmZmVyZWRXcml0ZXIgZm9ybWF0V3JpdGVyOworICAgICAgICB0ZW1wSnNvbkZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKG1TdHJlYW1OYW1lLCAiLXRlbXAtcmVwb3J0LWxvZyIpOworICAgICAgICBmb3JtYXRXcml0ZXIgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIodGVtcEpzb25GaWxlKSk7CisgICAgICAgIGlmIChtSnNvbkZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGpzb25SZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIobUpzb25GaWxlKSk7CisgICAgICAgICAgICBTdHJpbmcgY3VycmVudExpbmU7CisgICAgICAgICAgICBTdHJpbmcgbmV4dExpbmUgPSBqc29uUmVhZGVyLnJlYWRMaW5lKCk7CisgICAgICAgICAgICB3aGlsZSAoKGN1cnJlbnRMaW5lID0gbmV4dExpbmUpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBuZXh0TGluZSA9IGpzb25SZWFkZXIucmVhZExpbmUoKTsKKyAgICAgICAgICAgICAgICBpZiAobmV4dExpbmUgPT0gbnVsbCAmJiBjdXJyZW50TGluZS5jaGFyQXQoY3VycmVudExpbmUubGVuZ3RoKCkgLSAxKSA9PSAnfScpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gUmVvcGVuIG92ZXJhbGwgSlNPTiBvYmplY3QgdG8gd3JpdGUgbmV3IG1ldHJpY3MuCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRMaW5lID0gY3VycmVudExpbmUuc3Vic3RyaW5nKDAsIGN1cnJlbnRMaW5lLmxlbmd0aCgpIC0gMSkgKyAiLCI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIENvcHkgdG8gdGVtcCBmaWxlIGRpcmVjdGx5IHRvIGF2b2lkIGxhcmdlIG1ldHJpY3Mgc3RyaW5nIGluIG1lbW9yeS4KKyAgICAgICAgICAgICAgICBmb3JtYXRXcml0ZXIud3JpdGUoY3VycmVudExpbmUsIDAsIGN1cnJlbnRMaW5lLmxlbmd0aCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGpzb25SZWFkZXIuY2xvc2UoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvcm1hdFdyaXRlci53cml0ZSgieyIsIDAgLCAxKTsKKyAgICAgICAgfQorICAgICAgICAvLyBTdGFydCBuZXcgSlNPTiBvYmplY3QgZm9yIG5ldyBtZXRyaWNzLgorICAgICAgICBmb3JtYXRXcml0ZXIud3JpdGUoIlwiIiArIG1TdHJlYW1OYW1lICsgIlwiOiIsIDAsIG1TdHJlYW1OYW1lLmxlbmd0aCgpICsgMyk7CisgICAgICAgIGZvcm1hdFdyaXRlci5mbHVzaCgpOworICAgICAgICBmb3JtYXRXcml0ZXIuY2xvc2UoKTsKKyAgICAgICAgbUpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihuZXcgRmlsZVdyaXRlcih0ZW1wSnNvbkZpbGUsIHRydWUpKTsKKyAgICAgICAgbUpzb25Xcml0ZXIuYmVnaW5PYmplY3QoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhlIHdyaXRlci4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIENsb3NlIEpTT04gV3JpdGVyLgorICAgICAgICBtSnNvbldyaXRlci5lbmRPYmplY3QoKTsKKyAgICAgICAgbUpzb25Xcml0ZXIuY2xvc2UoKTsKKyAgICAgICAgLy8gQ2xvc2Ugb3ZlcmFsbCBKU09OIE9iamVjdC4KKyAgICAgICAgdHJ5IChCdWZmZXJlZFdyaXRlciBmb3JtYXRXcml0ZXIgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIodGVtcEpzb25GaWxlLCB0cnVlKSkpIHsKKyAgICAgICAgICAgIGZvcm1hdFdyaXRlci53cml0ZSgifSIsIDAsIDEpOworICAgICAgICB9CisgICAgICAgIC8vIENvcHkgbWV0cmljcyBmcm9tIHRlbXAgZmlsZSBhbmQgZGVsZXRlIHRlbXAgZmlsZS4KKyAgICAgICAgbUpzb25GaWxlLmNyZWF0ZU5ld0ZpbGUoKTsKKyAgICAgICAgdHJ5ICgKKyAgICAgICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBqc29uUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKHRlbXBKc29uRmlsZSkpOworICAgICAgICAgICAgICAgIEJ1ZmZlcmVkV3JpdGVyIG1ldHJpY3NXcml0ZXIgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIobUpzb25GaWxlKSkKKyAgICAgICAgKSB7CisgICAgICAgICAgICBTdHJpbmcgbGluZTsKKyAgICAgICAgICAgIHdoaWxlICgobGluZSA9IGpzb25SZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIENvcHkgZnJvbSB0ZW1wIGZpbGUgZGlyZWN0bHkgdG8gYXZvaWQgbGFyZ2UgbWV0cmljcyBzdHJpbmcgaW4gbWVtb3J5LgorICAgICAgICAgICAgICAgIG1ldHJpY3NXcml0ZXIud3JpdGUobGluZSwgMCwgbGluZS5sZW5ndGgoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvUmVxdWlyZWRGZWF0dXJlUnVsZS5qYXZhIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1JlcXVpcmVkRmVhdHVyZVJ1bGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWI3MDU2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1JlcXVpcmVkRmVhdHVyZVJ1bGUuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLlRlc3RSdWxlOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuRGVzY3JpcHRpb247CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMubW9kZWwuU3RhdGVtZW50OworCisvKioKKyAqIEN1c3RvbSBKVW5pdDQgcnVsZSB0aGF0IGRvZXMgbm90IHJ1biBhIHRlc3QgY2FzZSBpZiB0aGUgZGV2aWNlIGRvZXMgbm90IGhhdmUgYSBnaXZlbiBmZWF0dXJlLgorICovCitwdWJsaWMgY2xhc3MgUmVxdWlyZWRGZWF0dXJlUnVsZSBpbXBsZW1lbnRzIFRlc3RSdWxlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlJlcXVpcmVkRmVhdHVyZVJ1bGUiOworCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUZlYXR1cmU7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1IYXNGZWF0dXJlOworCisgICAgcHVibGljIFJlcXVpcmVkRmVhdHVyZVJ1bGUoU3RyaW5nIGZlYXR1cmUpIHsKKyAgICAgICAgbUZlYXR1cmUgPSBmZWF0dXJlOworICAgICAgICBtSGFzRmVhdHVyZSA9IGhhc0ZlYXR1cmUoZmVhdHVyZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0YXRlbWVudCBhcHBseShTdGF0ZW1lbnQgYmFzZSwgRGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdGF0ZW1lbnQoKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgZXZhbHVhdGUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1IYXNGZWF0dXJlKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInNraXBwaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGRlc2NyaXB0aW9uLmdldENsYXNzTmFtZSgpICsgIiMiICsgZGVzY3JpcHRpb24uZ2V0TWV0aG9kTmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGJlY2F1c2UgZGV2aWNlIGRvZXMgbm90IGhhdmUgZmVhdHVyZSAnIiArIG1GZWF0dXJlICsgIiciKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBiYXNlLmV2YWx1YXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGhhc0ZlYXR1cmUoU3RyaW5nIGZlYXR1cmUpIHsKKyAgICAgICAgcmV0dXJuIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKS5nZXRQYWNrYWdlTWFuYWdlcigpLmhhc1N5c3RlbUZlYXR1cmUoZmVhdHVyZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1Jlc3VsdC5qYXZhIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1Jlc3VsdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkOGEyOWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvUmVzdWx0LmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisgKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorICogdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisgKiB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWw7CisKKy8qKgorICogUmVwcmVzZW50cyB0aGUgcmVzdWx0IG9mIGEgdGVzdC4KKyAqLworcHVibGljIGludGVyZmFjZSBSZXN1bHQgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1VMVF9PSyA9IDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTVUxUX0ZBSUwgPSAyOworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHRlc3QgcmVzdWx0IG9mIHRoaXMgb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIHJlc3VsdENvZGUgVGhlIHRlc3QgcmVzdWx0LCBlaXRoZXIge0Bjb2RlIFJFU1VMVF9PS30gb3Ige0Bjb2RlIFJFU1VMVF9GQUlMfS4KKyAgICAgKi8KKyAgICB2b2lkIHNldFJlc3VsdChpbnQgcmVzdWx0Q29kZSk7Cit9CmRpZmYgLS1naXQgYS9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvU2V0dGluZ3NVdGlscy5qYXZhIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1NldHRpbmdzVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzRjYjYwCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1NldHRpbmdzVXRpbHMuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKKworcHVibGljIGNsYXNzIFNldHRpbmdzVXRpbHMgeworICAgIHByaXZhdGUgU2V0dGluZ3NVdGlscygpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQdXQgYSBnbG9iYWwgc2V0dGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHV0R2xvYmFsU2V0dGluZyhTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgLy8gSG1tLCB0ZWNobmljYWxseSB3ZSBzaG91bGQgZXNjYXBlIGEgdmFsdWUsIGJ1dCBpZiBJIGRvIGxpa2UgJzEnLCBpdCB3b24ndCB3b3JrLiA/PworICAgICAgICBTeXN0ZW1VdGlsLnJ1blNoZWxsQ29tbWFuZEZvck5vT3V0cHV0KCJzZXR0aW5ncyBwdXQgZ2xvYmFsICIgKyBrZXkgKyAiICIgKyB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHV0IGEgZ2xvYmFsIHNldHRpbmcgZm9yIHRoZSBjdXJyZW50IChmb3JlZ3JvdW5kKSB1c2VyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwdXRTZWN1cmVTZXR0aW5nKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBTeXN0ZW1VdGlsLnJ1blNoZWxsQ29tbWFuZEZvck5vT3V0cHV0KAorICAgICAgICAgICAgICAgICJzZXR0aW5ncyAtLXVzZXIgY3VycmVudCBwdXQgc2VjdXJlICIgKyBrZXkgKyAiICIgKyB2YWx1ZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1N5c3RlbVV0aWwuamF2YSBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9TeXN0ZW1VdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdjMjMyMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9TeXN0ZW1VdGlsLmphdmEKQEAgLTAsMCArMSwxNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWw7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyLk1lbW9yeUluZm87CitpbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3I7CitpbXBvcnQgYW5kcm9pZC5vcy5TdGF0RnM7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlOworCitwdWJsaWMgY2xhc3MgU3lzdGVtVXRpbCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJDdHNTeXN0ZW1VdGlsIjsKKworICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBnZXRGcmVlRGlza1NpemUoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGZpbmFsIFN0YXRGcyBzdGF0RnMgPSBuZXcgU3RhdEZzKGNvbnRleHQuZ2V0RmlsZXNEaXIoKS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgIHJldHVybiAobG9uZylzdGF0RnMuZ2V0QXZhaWxhYmxlQmxvY2tzKCkgKiBzdGF0RnMuZ2V0QmxvY2tTaXplKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBsb25nIGdldEZyZWVNZW1vcnkoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGZpbmFsIE1lbW9yeUluZm8gaW5mbyA9IG5ldyBNZW1vcnlJbmZvKCk7CisgICAgICAgICgoQWN0aXZpdHlNYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BQ1RJVklUWV9TRVJWSUNFKSkuZ2V0TWVtb3J5SW5mbyhpbmZvKTsKKyAgICAgICAgcmV0dXJuIGluZm8uYXZhaWxNZW07CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBsb25nIGdldFRvdGFsTWVtb3J5KENvbnRleHQgY29udGV4dCkgeworICAgICAgICBmaW5hbCBNZW1vcnlJbmZvIGluZm8gPSBuZXcgTWVtb3J5SW5mbygpOworICAgICAgICAoKEFjdGl2aXR5TWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQUNUSVZJVFlfU0VSVklDRSkpLmdldE1lbW9yeUluZm8oaW5mbyk7CisgICAgICAgIHJldHVybiBpbmZvLnRvdGFsTWVtOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4ZWN1dGVzIGEgc2hlbGwgY29tbWFuZCB1c2luZyBzaGVsbCB1c2VyIGlkZW50aXR5LCBhbmQgcmV0dXJuIHRoZSBzdGFuZGFyZCBvdXRwdXQgaW4gc3RyaW5nCisgICAgICogPHA+Tm90ZTogY2FsbGluZyB0aGlzIGZ1bmN0aW9uIHJlcXVpcmVzIEFQSSBsZXZlbCAyMSBvciBhYm92ZQorICAgICAqIEBwYXJhbSBpbnN0cnVtZW50YXRpb24ge0BsaW5rIEluc3RydW1lbnRhdGlvbn0gaW5zdGFuY2UsIG9idGFpbmVkIGZyb20gYSB0ZXN0IHJ1bm5pbmcgaW4KKyAgICAgKiBpbnN0cnVtZW50YXRpb24gZnJhbWV3b3JrCisgICAgICogQHBhcmFtIGNtZCB0aGUgY29tbWFuZCB0byBydW4KKyAgICAgKiBAcmV0dXJuIHRoZSBzdGFuZGFyZCBvdXRwdXQgb2YgdGhlIGNvbW1hbmQKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJ1blNoZWxsQ29tbWFuZChJbnN0cnVtZW50YXRpb24gaW5zdHJ1bWVudGF0aW9uLCBTdHJpbmcgY21kKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgTG9nLnYoVEFHLCAiUnVubmluZyBjb21tYW5kOiAiICsgY21kKTsKKyAgICAgICAgaWYgKGNtZC5zdGFydHNXaXRoKCJwbSBncmFudCAiKSB8fCBjbWQuc3RhcnRzV2l0aCgicG0gcmV2b2tlICIpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlVzZSBVaUF1dG9tYXRpb24uZ3JhbnRSdW50aW1lUGVybWlzc2lvbigpICIKKyAgICAgICAgICAgICAgICAgICAgKyAib3IgcmV2b2tlUnVudGltZVBlcm1pc3Npb24oKSBkaXJlY3RseSwgd2hpY2ggYXJlIG1vcmUgcm9idXN0LiIpOworICAgICAgICB9CisgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHBmZCA9IGluc3RydW1lbnRhdGlvbi5nZXRVaUF1dG9tYXRpb24oKS5leGVjdXRlU2hlbGxDb21tYW5kKGNtZCk7CisgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVs1MTJdOworICAgICAgICBpbnQgYnl0ZXNSZWFkOworICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IFBhcmNlbEZpbGVEZXNjcmlwdG9yLkF1dG9DbG9zZUlucHV0U3RyZWFtKHBmZCk7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzdGRvdXQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIHdoaWxlICgoYnl0ZXNSZWFkID0gZmlzLnJlYWQoYnVmKSkgIT0gLTEpIHsKKyAgICAgICAgICAgIHN0ZG91dC5hcHBlbmQobmV3IFN0cmluZyhidWYsIDAsIGJ5dGVzUmVhZCkpOworICAgICAgICB9CisgICAgICAgIGZpcy5jbG9zZSgpOworICAgICAgICByZXR1cm4gc3Rkb3V0LnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2ltcGxlciB2ZXJzaW9uIG9mIHtAbGluayAjcnVuU2hlbGxDb21tYW5kKEluc3RydW1lbnRhdGlvbiwgU3RyaW5nKX0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcnVuU2hlbGxDb21tYW5kKFN0cmluZyBjbWQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBydW5TaGVsbENvbW1hbmQoSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCksIGNtZCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkZhaWxlZCByZWFkaW5nIGNvbW1hbmQgb3V0cHV0OiAiICsgZSk7CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTYW1lIGFzIHtAbGluayAjcnVuU2hlbGxDb21tYW5kKFN0cmluZyl9LCB3aXRoIG9wdGlvbmFsbHkKKyAgICAgKiBjaGVjayB0aGUgcmVzdWx0IHVzaW5nIHtAY29kZSByZXN1bHRDaGVja2VyfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBydW5TaGVsbENvbW1hbmQoU3RyaW5nIGNtZCwgUHJlZGljYXRlPFN0cmluZz4gcmVzdWx0Q2hlY2tlcikgeworICAgICAgICBmaW5hbCBTdHJpbmcgcmVzdWx0ID0gcnVuU2hlbGxDb21tYW5kKGNtZCk7CisgICAgICAgIGlmIChyZXN1bHRDaGVja2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkFzc2VydGlvbiBmYWlsZWQuIENvbW1hbmQgd2FzOiAiICsgY21kICsgIlxuIgorICAgICAgICAgICAgICAgICAgICArICJPdXRwdXQgd2FzOlxuIiArIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0Q2hlY2tlci50ZXN0KHJlc3VsdCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2FtZSBhcyB7QGxpbmsgI3J1blNoZWxsQ29tbWFuZChTdHJpbmcpfSwgYnV0IGZhaWxzIGlmIHRoZSBvdXRwdXQgaXMgbm90IGVtcHR5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJ1blNoZWxsQ29tbWFuZEZvck5vT3V0cHV0KFN0cmluZyBjbWQpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdCA9IHJ1blNoZWxsQ29tbWFuZChjbWQpOworICAgICAgICBhc3NlcnRUcnVlKCJDb21tYW5kIGZhaWxlZC4gQ29tbWFuZCB3YXM6ICIgKyBjbWQgKyAiXG4iCisgICAgICAgICAgICAgICAgKyAiRGlkbid0IGV4cGVjdCBhbnkgb3V0cHV0LCBidXQgdGhlIG91dHB1dCB3YXM6XG4iICsgcmVzdWx0LAorICAgICAgICAgICAgICAgIHJlc3VsdC5sZW5ndGgoKSA9PSAwKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSdW4gYSBjb21tYW5kIGFuZCBwcmludCB0aGUgcmVzdWx0IG9uIGxvZ2NhdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcnVuQ29tbWFuZEFuZFByaW50T25Mb2djYXQoU3RyaW5nIGxvZ3RhZywgU3RyaW5nIGNtZCkgeworICAgICAgICBMb2cuaShsb2d0YWcsICJFeGVjdXRpbmc6ICIgKyBjbWQpOworICAgICAgICBmaW5hbCBTdHJpbmcgb3V0cHV0ID0gcnVuU2hlbGxDb21tYW5kKGNtZCk7CisgICAgICAgIGZvciAoU3RyaW5nIGxpbmUgOiBvdXRwdXQuc3BsaXQoIlxcbiIsIC0xKSkgeworICAgICAgICAgICAgTG9nLmkobG9ndGFnLCBsaW5lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJ1biBhIGNvbW1hbmQgYW5kIHJldHVybiB0aGUgc2VjdGlvbiBtYXRjaGluZyB0aGUgcGF0dGVybnMuCisgICAgICoKKyAgICAgKiBAc2VlIFRleHRVdGlscyNleHRyYWN0U2VjdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJ1bkNvbW1hbmRBbmRFeHRyYWN0U2VjdGlvbihTdHJpbmcgY21kLAorICAgICAgICAgICAgU3RyaW5nIGV4dHJhY3Rpb25TdGFydFJlZ2V4LCBib29sZWFuIHN0YXJ0SW5jbHVzaXZlLAorICAgICAgICAgICAgU3RyaW5nIGV4dHJhY3Rpb25FbmRSZWdleCwgYm9vbGVhbiBlbmRJbmNsdXNpdmUpIHsKKyAgICAgICAgcmV0dXJuIFRleHRVdGlscy5leHRyYWN0U2VjdGlvbihydW5TaGVsbENvbW1hbmQoY21kKSwgZXh0cmFjdGlvblN0YXJ0UmVnZXgsIHN0YXJ0SW5jbHVzaXZlLAorICAgICAgICAgICAgICAgIGV4dHJhY3Rpb25FbmRSZWdleCwgZW5kSW5jbHVzaXZlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvVGVzdFRocmVhZC5qYXZhIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1Rlc3RUaHJlYWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTRiOWM4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1Rlc3RUaHJlYWQuamF2YQpAQCAtMCwwICsxLDkzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKKworLyoqCisgKiBUaHJlYWQgY2xhc3MgZm9yIGV4ZWN1dGluZyBhIFJ1bm5hYmxlIGNvbnRhaW5pbmcgYXNzZXJ0aW9ucyBpbiBhIHNlcGFyYXRlIHRocmVhZC4KKyAqIFVuY2F1Z2h0IGV4Y2VwdGlvbnMgaW4gdGhlIFJ1bm5hYmxlIGFyZSByZXRocm93biBpbiB0aGUgY29udGV4dCBvZiB0aGUgdGhlIHRocmVhZAorICogY2FsbGluZyB0aGUgPGNvZGU+cnVuVGVzdCgpPC9jb2RlPiBtZXRob2QuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBUZXN0VGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKKyAgICBwcml2YXRlIFRocm93YWJsZSBtVGhyb3dhYmxlOworICAgIHByaXZhdGUgUnVubmFibGUgbVRhcmdldDsKKworICAgIHB1YmxpYyBUZXN0VGhyZWFkKFJ1bm5hYmxlIHRhcmdldCkgeworICAgICAgICBtVGFyZ2V0ID0gdGFyZ2V0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1UYXJnZXQucnVuKCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBtVGhyb3dhYmxlID0gdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJ1biB0aGUgdGFyZ2V0IFJ1bm5hYmxlIG9iamVjdCBhbmQgd2FpdCB1bnRpbCB0aGUgdGVzdCBmaW5pc2ggb3IgdGhyb3cKKyAgICAgKiBvdXQgRXhjZXB0aW9uIGlmIHRlc3QgZmFpbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBydW5UaW1lCisgICAgICogQHRocm93cyBUaHJvd2FibGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBydW5UZXN0KGxvbmcgcnVuVGltZSkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIHN0YXJ0KCk7CisgICAgICAgIGpvaW5BbmRDaGVjayhydW5UaW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIFRocm93YWJsZSBvYmplY3Qgd2hpY2ggaXMgdGhyb3duIHdoZW4gdGVzdCBydW5uaW5nCisgICAgICogQHJldHVybiAgVGhlIFRocm93YWJsZSBvYmplY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgVGhyb3dhYmxlIGdldFRocm93YWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1UaHJvd2FibGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBUaHJvd2FibGUgb2JqZWN0IHdoaWNoIGlzIHRocm93biB3aGVuIHRlc3QgcnVubmluZworICAgICAqIEBwYXJhbSB0IFRoZSBUaHJvd2FibGUgb2JqZWN0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGhyb3dhYmxlKFRocm93YWJsZSB0KSB7CisgICAgICAgIG1UaHJvd2FibGUgPSB0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFdhaXQgZm9yIHRoZSB0ZXN0IHRocmVhZCB0byBjb21wbGV0ZSBhbmQgdGhyb3cgdGhlIHN0b3JlZCBleGNlcHRpb24gaWYgdGhlcmUgaXMgb25lLgorICAgICAqCisgICAgICogQHBhcmFtIHJ1blRpbWUgVGhlIHRpbWUgdG8gd2FpdCBmb3IgdGhlIHRlc3QgdGhyZWFkIHRvIGNvbXBsZXRlLgorICAgICAqIEB0aHJvd3MgVGhyb3dhYmxlCisgICAgICovCisgICAgcHVibGljIHZvaWQgam9pbkFuZENoZWNrKGxvbmcgcnVuVGltZSkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIHRoaXMuam9pbihydW5UaW1lKTsKKyAgICAgICAgaWYgKHRoaXMuaXNBbGl2ZSgpKSB7CisgICAgICAgICAgICB0aGlzLmludGVycnVwdCgpOworICAgICAgICAgICAgdGhpcy5qb2luKHJ1blRpbWUpOworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGhyZWFkIGRpZCBub3QgZmluaXNoIHdpdGhpbiBhbGxvdHRlZCB0aW1lLiIpOworICAgICAgICB9CisgICAgICAgIGNoZWNrRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgd2hldGhlciB0aGVyZSBpcyBhbiBleGNlcHRpb24gd2hlbiBydW5uaW5nIFJ1bm5hYmxlIG9iamVjdC4KKyAgICAgKiBAdGhyb3dzIFRocm93YWJsZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNoZWNrRXhjZXB0aW9uKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGlmIChtVGhyb3dhYmxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG1UaHJvd2FibGU7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvVGVzdFV0aWxzLmphdmEgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvVGVzdFV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcwMjg3NQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9UZXN0VXRpbHMuamF2YQpAQCAtMCwwICsxLDk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKKworaW1wb3J0IHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0LmZhaWw7CisKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK3B1YmxpYyBjbGFzcyBUZXN0VXRpbHMgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQ3RzVGVzdFV0aWxzIjsKKworICAgIHByaXZhdGUgVGVzdFV0aWxzKCkgeworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfVElNRU9VVF9TRUNPTkRTID0gMzA7CisKKyAgICAvKiogUHJpbnQgYW4gZXJyb3IgbG9nIGFuZCBmYWlsLiAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBmYWlsV2l0aExvZyhTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICBMb2cuZShUQUcsIG1lc3NhZ2UpOworICAgICAgICBmYWlsKG1lc3NhZ2UpOworICAgIH0KKworICAgIEBGdW5jdGlvbmFsSW50ZXJmYWNlCisgICAgcHVibGljIGludGVyZmFjZSBCb29sZWFuU3VwcGxpZXJXaXRoVGhyb3cgeworICAgICAgICBib29sZWFuIGdldEFzQm9vbGVhbigpIHRocm93cyBFeGNlcHRpb247CisgICAgfQorCisgICAgQEZ1bmN0aW9uYWxJbnRlcmZhY2UKKyAgICBwdWJsaWMgaW50ZXJmYWNlIFJ1bm5hYmxlV2l0aFRocm93IHsKKyAgICAgICAgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdhaXQgdW50aWwge0Bjb2RlIHByZWRpY2F0ZX0gaXMgc2F0aXNmaWVkLCBvciBmYWlsLCB3aXRoIHtAbGluayAjREVGQVVMVF9USU1FT1VUX1NFQ09ORFN9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3YWl0VW50aWwoU3RyaW5nIG1lc3NhZ2UsIEJvb2xlYW5TdXBwbGllcldpdGhUaHJvdyBwcmVkaWNhdGUpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgd2FpdFVudGlsKG1lc3NhZ2UsIDAsIHByZWRpY2F0ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2FpdCB1bnRpbCB7QGNvZGUgcHJlZGljYXRlfSBpcyBzYXRpc2ZpZWQsIG9yIGZhaWwsIHdpdGggYSBnaXZlbiB0aW1lb3V0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3YWl0VW50aWwoCisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSwgaW50IHRpbWVvdXRTZWNvbmQsIEJvb2xlYW5TdXBwbGllcldpdGhUaHJvdyBwcmVkaWNhdGUpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHRpbWVvdXRTZWNvbmQgPD0gMCkgeworICAgICAgICAgICAgdGltZW91dFNlY29uZCA9IERFRkFVTFRfVElNRU9VVF9TRUNPTkRTOworICAgICAgICB9CisgICAgICAgIGludCBzbGVlcCA9IDEyNTsKKyAgICAgICAgZmluYWwgbG9uZyB0aW1lb3V0ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkgKyB0aW1lb3V0U2Vjb25kICogMTAwMDsKKyAgICAgICAgd2hpbGUgKFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpIDwgdGltZW91dCkgeworICAgICAgICAgICAgaWYgKHByZWRpY2F0ZS5nZXRBc0Jvb2xlYW4oKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsgLy8gb2theQorICAgICAgICAgICAgfQorICAgICAgICAgICAgVGhyZWFkLnNsZWVwKHNsZWVwKTsKKyAgICAgICAgICAgIHNsZWVwICo9IDU7CisgICAgICAgICAgICBzbGVlcCA9IE1hdGgubWluKDIwMDAsIHNsZWVwKTsKKyAgICAgICAgfQorICAgICAgICBmYWlsV2l0aExvZygiVGltZW91dDogIiArIG1lc3NhZ2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJ1biBhIFJ1bm5hYmxlIHtAY29kZSByfSwgYW5kIGlmIGl0IHRocm93cywgYWxzbyBydW4ge0Bjb2RlIG9uRmFpbHVyZX0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHJ1bldpdGhGYWlsdXJlSG9vayhSdW5uYWJsZVdpdGhUaHJvdyByLCBSdW5uYWJsZVdpdGhUaHJvdyBvbkZhaWx1cmUpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJyIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9uRmFpbHVyZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIm9uRmFpbHVyZSIpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByLnJ1bigpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdGgpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkNhdWdodCBleGNlcHRpb246ICIgKyB0aCwgdGgpOworICAgICAgICAgICAgb25GYWlsdXJlLnJ1bigpOworICAgICAgICAgICAgdGhyb3cgdGg7CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9UZXh0VXRpbHMuamF2YSBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9UZXh0VXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzlkYzljCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1RleHRVdGlscy5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKKworcHVibGljIGNsYXNzIFRleHRVdGlscyB7CisgICAgcHJpdmF0ZSBUZXh0VXRpbHMoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBmaXJzdCBzZWN0aW9uIGluIHtAY29kZSBzb3VyY2V9IGJldHdlZW4gdGhlIGxpbmUgbWF0Y2hlcworICAgICAqIHtAY29kZSBleHRyYWN0aW9uU3RhcnRSZWdleH0gYW5kIHRoZSBsaW5lIG1hdGNoZXMge0Bjb2RlIGV4dHJhY3Rpb25FbmRSZWdleH0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZXh0cmFjdFNlY3Rpb24oU3RyaW5nIHNvdXJjZSwKKyAgICAgICAgICAgIFN0cmluZyBleHRyYWN0aW9uU3RhcnRSZWdleCwgYm9vbGVhbiBzdGFydEluY2x1c2l2ZSwKKyAgICAgICAgICAgIFN0cmluZyBleHRyYWN0aW9uRW5kUmVnZXgsIGJvb2xlYW4gZW5kSW5jbHVzaXZlKSB7CisKKyAgICAgICAgZmluYWwgUGF0dGVybiBzdGFydCA9IFBhdHRlcm4uY29tcGlsZShleHRyYWN0aW9uU3RhcnRSZWdleCk7CisgICAgICAgIGZpbmFsIFBhdHRlcm4gZW5kID0gUGF0dGVybi5jb21waWxlKGV4dHJhY3Rpb25FbmRSZWdleCk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGZpbmFsIFN0cmluZ1tdIGxpbmVzID0gc291cmNlLnNwbGl0KCJcXG4iLCAtMSk7CisKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBmb3IgKDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbGluZSA9IGxpbmVzW2ldOworICAgICAgICAgICAgaWYgKHN0YXJ0Lm1hdGNoZXIobGluZSkubWF0Y2hlcygpKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXJ0SW5jbHVzaXZlKSB7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChsaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCdcbicpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbGluZSA9IGxpbmVzW2ldOworICAgICAgICAgICAgaWYgKGVuZC5tYXRjaGVyKGxpbmUpLm1hdGNoZXMoKSkgeworICAgICAgICAgICAgICAgIGlmIChlbmRJbmNsdXNpdmUpIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGxpbmUpOworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJ1xuJyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2IuYXBwZW5kKGxpbmUpOworICAgICAgICAgICAgc2IuYXBwZW5kKCdcbicpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9UaHJlYWRVdGlscy5qYXZhIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1RocmVhZFV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk0ODYyOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9UaHJlYWRVdGlscy5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsOworCitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKKworcHVibGljIGZpbmFsIGNsYXNzIFRocmVhZFV0aWxzIHsKKyAgICBwcml2YXRlIFRocmVhZFV0aWxzKCkgeworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzbGVlcFVudGlsUmVhbHRpbWUobG9uZyByZWFsdGltZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFRocmVhZC5zbGVlcChNYXRoLm1heCgwLCByZWFsdGltZSAtIFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1dhdGNoRG9nLmphdmEgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvV2F0Y2hEb2cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmNjNjkzCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1dhdGNoRG9nLmphdmEKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2VtYXBob3JlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7CisKKy8qKgorICogY2xhc3MgZm9yIGNoZWNraW5nIGlmIHJlbmRlcmluZyBmdW5jdGlvbiBpcyBhbGl2ZSBvciBub3QuCisgKiBwYW5pYyBpZiB3YXRjaC1kb2cgaXMgbm90IHJlc2V0IG92ZXIgY2VydGFpbiBhbW91bnQgb2YgdGltZQorICovCitwdWJsaWMgY2xhc3MgV2F0Y2hEb2cgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJXYXRjaERvZyI7CisgICAgcHJpdmF0ZSBUaHJlYWQgbVRocmVhZDsKKyAgICBwcml2YXRlIFNlbWFwaG9yZSBtU2VtYXBob3JlOworICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBtU3RvcFJlcXVlc3RlZDsKKyAgICBwcml2YXRlIGZpbmFsIGxvbmcgbVRpbWVvdXRJbk1pbGxpU2VjczsKKyAgICBwcml2YXRlIFRpbWVvdXRDYWxsYmFjayBtQ2FsbGJhY2sgPSBudWxsOworCisgICAgcHVibGljIFdhdGNoRG9nKGxvbmcgdGltZW91dEluTWlsbGlTZWNzKSB7CisgICAgICAgIG1UaW1lb3V0SW5NaWxsaVNlY3MgPSB0aW1lb3V0SW5NaWxsaVNlY3M7CisgICAgfQorCisgICAgcHVibGljIFdhdGNoRG9nKGxvbmcgdGltZW91dEluTWlsbGlTZWNzLCBUaW1lb3V0Q2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgdGhpcyh0aW1lb3V0SW5NaWxsaVNlY3MpOworICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICB9CisKKyAgICAvKiogc3RhcnQgd2F0Y2gtZG9nICovCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB7CisgICAgICAgIExvZy5pKFRBRywgInN0YXJ0Iik7CisgICAgICAgIG1TdG9wUmVxdWVzdGVkID0gZmFsc2U7CisgICAgICAgIG1TZW1hcGhvcmUgPSBuZXcgU2VtYXBob3JlKDApOworICAgICAgICBtVGhyZWFkID0gbmV3IFRocmVhZCh0aGlzKTsKKyAgICAgICAgbVRocmVhZC5zdGFydCgpOworICAgIH0KKworICAgIC8qKiBzdG9wIHdhdGNoLWRvZyAqLworICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CisgICAgICAgIExvZy5pKFRBRywgInN0b3AiKTsKKyAgICAgICAgaWYgKG1UaHJlYWQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOyAvLyBhbHJlYWR5IGZpbmlzaGVkCisgICAgICAgIH0KKyAgICAgICAgbVN0b3BSZXF1ZXN0ZWQgPSB0cnVlOworICAgICAgICBtU2VtYXBob3JlLnJlbGVhc2UoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1UaHJlYWQuam9pbigpOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgfQorICAgICAgICBtVGhyZWFkID0gbnVsbDsKKyAgICAgICAgbVNlbWFwaG9yZSA9IG51bGw7CisgICAgfQorCisgICAgLyoqIHJlc2V0cyB3YXRjaC1kb2csIHRodXMgcHJldmVudCBpdCBmcm9tIHBhbmljICovCisgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7CisgICAgICAgIGlmICghbVN0b3BSZXF1ZXN0ZWQpIHsgLy8gc3RvcCByZXF1ZXN0ZWQsIGJ1dCByZW5kZXJpbmcgc3RpbGwgb24tZ29pbmcKKyAgICAgICAgICAgIG1TZW1hcGhvcmUucmVsZWFzZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICB3aGlsZSAoIW1TdG9wUmVxdWVzdGVkKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9IG1TZW1hcGhvcmUudHJ5QWNxdWlyZShtVGltZW91dEluTWlsbGlTZWNzLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICAgICAgICAgIGlmIChtQ2FsbGJhY2sgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiV2F0Y2hkb2cgdGltZWQtb3V0Iiwgc3VjY2Vzcyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3VjY2VzcykgeworICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2sub25UaW1lb3V0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIHRoaXMgdGhyZWFkIHdpbGwgbm90IGJlIGludGVycnVwdGVkLAorICAgICAgICAgICAgICAgIC8vIGJ1dCBpZiBpdCBoYXBwZW5zLCBqdXN0IGNoZWNrIHRoZSBleGl0IGNvbmRpdGlvbi4KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSB0aGUgV2F0Y2hkb2cgd2hlbiBpdCBoYXMgdGltZWQgb3V0LgorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgVGltZW91dENhbGxiYWNrIHsKKworICAgICAgICBwdWJsaWMgdm9pZCBvblRpbWVvdXQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvV2lkZ2V0VGVzdFV0aWxzLmphdmEgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvV2lkZ2V0VGVzdFV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYzYWI4ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9XaWRnZXRUZXN0VXRpbHMuamF2YQpAQCAtMCwwICsxLDMxMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk5vbk51bGw7CitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5OdWxsYWJsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuRWRpdGFibGU7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld1RyZWVPYnNlcnZlcjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7CisKK2ltcG9ydCBvcmcuaGFtY3Jlc3QuQmFzZU1hdGNoZXI7CitpbXBvcnQgb3JnLmhhbWNyZXN0LkRlc2NyaXB0aW9uOworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7CitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LlZpZXdUcmVlT2JzZXJ2ZXIuT25EcmF3TGlzdGVuZXI7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyLk9uR2xvYmFsTGF5b3V0TGlzdGVuZXI7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLmhhbWNyZXN0Lk1vY2tpdG9IYW1jcmVzdC5hcmdUaGF0OworCisvKioKKyAqIFRoZSB1c2VmdWwgbWV0aG9kcyBmb3Igd2lkZ2V0IHRlc3QuCisgKi8KK3B1YmxpYyBjbGFzcyBXaWRnZXRUZXN0VXRpbHMgeworICAgIC8qKgorICAgICAqIEFzc2VydCB0aGF0IHR3byBiaXRtYXBzIGhhdmUgaWRlbnRpY2FsIGNvbnRlbnQgKHNhbWUgZGltZW5zaW9ucywgc2FtZSBjb25maWd1cmF0aW9uLAorICAgICAqIHNhbWUgcGl4ZWwgY29udGVudCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYjEgdGhlIGZpcnN0IGJpdG1hcCB3aGljaCBuZWVkcyB0byBjb21wYXJlLgorICAgICAqIEBwYXJhbSBiMiB0aGUgc2Vjb25kIGJpdG1hcCB3aGljaCBuZWVkcyB0byBjb21wYXJlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRFcXVhbHMoQml0bWFwIGIxLCBCaXRtYXAgYjIpIHsKKyAgICAgICAgaWYgKGIxID09IGIyKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoYjEgPT0gbnVsbCB8fCBiMiA9PSBudWxsKSB7CisgICAgICAgICAgICBBc3NlcnQuZmFpbCgidGhlIGJpdG1hcHMgYXJlIG5vdCBlcXVhbCIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gYjEgYW5kIGIyIGFyZSBhbGwgbm90IG51bGwuCisgICAgICAgIGlmIChiMS5nZXRXaWR0aCgpICE9IGIyLmdldFdpZHRoKCkgfHwgYjEuZ2V0SGVpZ2h0KCkgIT0gYjIuZ2V0SGVpZ2h0KCkKKyAgICAgICAgICAgIHx8IGIxLmdldENvbmZpZygpICE9IGIyLmdldENvbmZpZygpKSB7CisgICAgICAgICAgICBBc3NlcnQuZmFpbCgidGhlIGJpdG1hcHMgYXJlIG5vdCBlcXVhbCIpOworICAgICAgICB9CisKKyAgICAgICAgaW50IHcgPSBiMS5nZXRXaWR0aCgpOworICAgICAgICBpbnQgaCA9IGIxLmdldEhlaWdodCgpOworICAgICAgICBpbnQgcyA9IHcgKiBoOworICAgICAgICBpbnRbXSBwaXhlbHMxID0gbmV3IGludFtzXTsKKyAgICAgICAgaW50W10gcGl4ZWxzMiA9IG5ldyBpbnRbc107CisKKyAgICAgICAgYjEuZ2V0UGl4ZWxzKHBpeGVsczEsIDAsIHcsIDAsIDAsIHcsIGgpOworICAgICAgICBiMi5nZXRQaXhlbHMocGl4ZWxzMiwgMCwgdywgMCwgMCwgdywgaCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChwaXhlbHMxW2ldICE9IHBpeGVsczJbaV0pIHsKKyAgICAgICAgICAgICAgICBBc3NlcnQuZmFpbCgidGhlIGJpdG1hcHMgYXJlIG5vdCBlcXVhbCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCBiZWdpbm5pbmcgb2YgdGhlIHNwZWNpYWwgZWxlbWVudC4KKyAgICAgKiBAcGFyYW0gcGFyc2VyIFhtbFB1bGxQYXJzZXIgd2lsbCBiZSBwYXJzZWQuCisgICAgICogQHBhcmFtIGZpcnN0RWxlbWVudE5hbWUgdGhlIHRhcmdldCBlbGVtZW50IG5hbWUuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gaWYgWE1MIFB1bGwgUGFyc2VyIHJlbGF0ZWQgZmF1bHRzIG9jY3VyLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgSS9PLXJlbGF0ZWQgZXJyb3Igb2NjdXIgd2hlbiBwYXJzaW5nLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBiZWdpbkRvY3VtZW50KFhtbFB1bGxQYXJzZXIgcGFyc2VyLCBTdHJpbmcgZmlyc3RFbGVtZW50TmFtZSkKKyAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKHBhcnNlcik7CisgICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGZpcnN0RWxlbWVudE5hbWUpOworCisgICAgICAgIGludCB0eXBlOworICAgICAgICB3aGlsZSAoKHR5cGUgPSBwYXJzZXIubmV4dCgpKSAhPSBYbWxQdWxsUGFyc2VyLlNUQVJUX1RBRworICAgICAgICAgICAgICAgICYmIHR5cGUgIT0gWG1sUHVsbFBhcnNlci5FTkRfRE9DVU1FTlQpIHsKKyAgICAgICAgICAgIDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghcGFyc2VyLmdldE5hbWUoKS5lcXVhbHMoZmlyc3RFbGVtZW50TmFtZSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN0YXJ0IHRhZzogZm91bmQgIiArIHBhcnNlci5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBleHBlY3RlZCAiICsgZmlyc3RFbGVtZW50TmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlIHRoZSBleHBlY3RlZCBwaXhlbHMgd2l0aCBhY3R1YWwsIHNjYWxpbmcgZm9yIHRoZSB0YXJnZXQgY29udGV4dCBkZW5zaXR5CisgICAgICoKKyAgICAgKiBAdGhyb3dzIEFzc2VydGlvbkZhaWxlZEVycm9yCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydFNjYWxlZFBpeGVscyhpbnQgZXhwZWN0ZWQsIGludCBhY3R1YWwsIENvbnRleHQgY29udGV4dCkgeworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGV4cGVjdGVkICogY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpLmRlbnNpdHksCisgICAgICAgICAgICAgICAgYWN0dWFsLCAzKTsKKyAgICB9CisKKyAgICAvKiogQ29udmVydHMgZGlwcyBpbnRvIHBpeGVscyB1c2luZyB0aGUge0BsaW5rIENvbnRleHR9J3MgZGVuc2l0eS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBjb252ZXJ0RGlwVG9QaXhlbHMoQ29udGV4dCBjb250ZXh0LCBpbnQgZGlwKSB7CisgICAgICBmbG9hdCBkZW5zaXR5ID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpLmRlbnNpdHk7CisgICAgICByZXR1cm4gTWF0aC5yb3VuZChkZW5zaXR5ICogZGlwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSBhIGJpdG1hcCB0aGF0IGNhbiBiZSB1c2VkIGZvciBjb21wYXJpc29uIG9uIGFueSBkZW5zaXR5CisgICAgICogQHBhcmFtIHJlc291cmNlcworICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBCaXRtYXB9IG9yIDxjb2RlPm51bGw8L2NvZGU+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBCaXRtYXAgZ2V0VW5zY2FsZWRCaXRtYXAoUmVzb3VyY2VzIHJlc291cmNlcywgaW50IHJlc0lkKSB7CisgICAgICAgIEJpdG1hcEZhY3RvcnkuT3B0aW9ucyBvcHRpb25zID0gbmV3IEJpdG1hcEZhY3RvcnkuT3B0aW9ucygpOworICAgICAgICBvcHRpb25zLmluU2NhbGVkID0gZmFsc2U7CisgICAgICAgIHJldHVybiBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKHJlc291cmNlcywgcmVzSWQsIG9wdGlvbnMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHJpZXZlIGEgZGl0aGVyZWQgYml0bWFwIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGNvbXBhcmlzb24gb24gYW55IGRlbnNpdHkKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VzCisgICAgICogQHBhcmFtIGNvbmZpZyB0aGUgcHJlZmVycmVkIGNvbmZpZyBmb3IgdGhlIHJldHVybmluZyBiaXRtYXAKKyAgICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgQml0bWFwfSBvciA8Y29kZT5udWxsPC9jb2RlPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQml0bWFwIGdldFVuc2NhbGVkQW5kRGl0aGVyZWRCaXRtYXAoUmVzb3VyY2VzIHJlc291cmNlcywKKyAgICAgICAgICAgIGludCByZXNJZCwgQml0bWFwLkNvbmZpZyBjb25maWcpIHsKKyAgICAgICAgQml0bWFwRmFjdG9yeS5PcHRpb25zIG9wdGlvbnMgPSBuZXcgQml0bWFwRmFjdG9yeS5PcHRpb25zKCk7CisgICAgICAgIG9wdGlvbnMuaW5EaXRoZXIgPSB0cnVlOworICAgICAgICBvcHRpb25zLmluU2NhbGVkID0gZmFsc2U7CisgICAgICAgIG9wdGlvbnMuaW5QcmVmZXJyZWRDb25maWcgPSBjb25maWc7CisgICAgICAgIHJldHVybiBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKHJlc291cmNlcywgcmVzSWQsIG9wdGlvbnMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFyZ3VtZW50IG1hdGNoZXIgZm9yIGVxdWFsaXR5IGNoZWNrIG9mIGEgQ2hhclNlcXVlbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIGV4cGVjdGVkIGV4cGVjdGVkIENoYXJTZXF1ZW5jZQorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ2hhclNlcXVlbmNlIHNhbWVDaGFyU2VxdWVuY2UoZmluYWwgQ2hhclNlcXVlbmNlIGV4cGVjdGVkKSB7CisgICAgICAgIHJldHVybiBhcmdUaGF0KG5ldyBCYXNlTWF0Y2hlcjxDaGFyU2VxdWVuY2U+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKE9iamVjdCBvKSB7CisgICAgICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBDaGFyU2VxdWVuY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRleHRVdGlscy5lcXVhbHMoZXhwZWN0ZWQsIChDaGFyU2VxdWVuY2UpIG8pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgZGVzY3JpYmVUbyhEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgeworICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLmFwcGVuZFRleHQoImRvZXNuJ3QgbWF0Y2ggIiArIGV4cGVjdGVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXJndW1lbnQgbWF0Y2hlciBmb3IgZXF1YWxpdHkgY2hlY2sgb2YgYW4gRWRpdGFibGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXhwZWN0ZWQgZXhwZWN0ZWQgRWRpdGFibGUKKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEVkaXRhYmxlIHNhbWVFZGl0YWJsZShmaW5hbCBFZGl0YWJsZSBleHBlY3RlZCkgeworICAgICAgICByZXR1cm4gYXJnVGhhdChuZXcgQmFzZU1hdGNoZXI8RWRpdGFibGU+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKE9iamVjdCBvKSB7CisgICAgICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBFZGl0YWJsZSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gVGV4dFV0aWxzLmVxdWFscyhleHBlY3RlZCwgKEVkaXRhYmxlKSBvKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGRlc2NyaWJlVG8oRGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHsKKyAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbi5hcHBlbmRUZXh0KCJkb2Vzbid0IG1hdGNoICIgKyBleHBlY3RlZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJ1bnMgdGhlIHNwZWNpZmllZCBSdW5uYWJsZSBvbiB0aGUgbWFpbiB0aHJlYWQgYW5kIGVuc3VyZXMgdGhhdCB0aGUgc3BlY2lmaWVkIFZpZXcncyB0cmVlIGlzCisgICAgICogZHJhd24gYmVmb3JlIHJldHVybmluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhY3Rpdml0eVRlc3RSdWxlIHRoZSBhY3Rpdml0eSB0ZXN0IHJ1bGUgdXNlZCB0byBydW4gdGhlIHRlc3QKKyAgICAgKiBAcGFyYW0gdmlldyB0aGUgdmlldyB3aG9zZSB0cmVlIHNob3VsZCBiZSBkcmF3biBiZWZvcmUgcmV0dXJuaW5nCisgICAgICogQHBhcmFtIHJ1bm5lciB0aGUgcnVubmFibGUgdG8gcnVuIG9uIHRoZSBtYWluIHRocmVhZCwgb3Ige0Bjb2RlIG51bGx9IHRvCisgICAgICogICAgICAgICAgICAgICBzaW1wbHkgZm9yY2UgaW52YWxpZGF0aW9uIGFuZCBhIGRyYXcgcGFzcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBydW5Pbk1haW5BbmREcmF3U3luYyhATm9uTnVsbCBmaW5hbCBBY3Rpdml0eVRlc3RSdWxlIGFjdGl2aXR5VGVzdFJ1bGUsCisgICAgICAgICAgICBATm9uTnVsbCBmaW5hbCBWaWV3IHZpZXcsIEBOdWxsYWJsZSBmaW5hbCBSdW5uYWJsZSBydW5uZXIpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKworICAgICAgICBhY3Rpdml0eVRlc3RSdWxlLnJ1bk9uVWlUaHJlYWQoKCkgLT4geworICAgICAgICAgICAgZmluYWwgT25EcmF3TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgT25EcmF3TGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25EcmF3KCkgeworICAgICAgICAgICAgICAgICAgICAvLyBwb3N0aW5nIHNvIHRoYXQgdGhlIHN5bmMgaGFwcGVucyBhZnRlciB0aGUgZHJhdyB0aGF0J3MgYWJvdXQgdG8gaGFwcGVuCisgICAgICAgICAgICAgICAgICAgIHZpZXcucG9zdCgoKSAtPiB7CisgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eVRlc3RSdWxlLmdldEFjdGl2aXR5KCkuZ2V0V2luZG93KCkuZ2V0RGVjb3JWaWV3KCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFZpZXdUcmVlT2JzZXJ2ZXIoKS5yZW1vdmVPbkRyYXdMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBhY3Rpdml0eVRlc3RSdWxlLmdldEFjdGl2aXR5KCkuZ2V0V2luZG93KCkuZ2V0RGVjb3JWaWV3KCkuCisgICAgICAgICAgICAgICAgICAgIGdldFZpZXdUcmVlT2JzZXJ2ZXIoKS5hZGRPbkRyYXdMaXN0ZW5lcihsaXN0ZW5lcik7CisKKyAgICAgICAgICAgIGlmIChydW5uZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJ1bm5lci5ydW4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpZXcuaW52YWxpZGF0ZSgpOworICAgICAgICB9KTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkV4cGVjdGVkIGRyYXcgcGFzcyBvY2N1cnJlZCB3aXRoaW4gNSBzZWNvbmRzIiwKKyAgICAgICAgICAgICAgICAgICAgbGF0Y2guYXdhaXQoNSwgVGltZVVuaXQuU0VDT05EUykpOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJ1bnMgdGhlIHNwZWNpZmllZCBSdW5uYWJsZSBvbiB0aGUgbWFpbiB0aHJlYWQgYW5kIGVuc3VyZXMgdGhhdCB0aGUgYWN0aXZpdHkncyB2aWV3IHRyZWUgaXMKKyAgICAgKiBsYWlkIG91dCBiZWZvcmUgcmV0dXJuaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIGFjdGl2aXR5VGVzdFJ1bGUgdGhlIGFjdGl2aXR5IHRlc3QgcnVsZSB1c2VkIHRvIHJ1biB0aGUgdGVzdAorICAgICAqIEBwYXJhbSBydW5uZXIgdGhlIHJ1bm5hYmxlIHRvIHJ1biBvbiB0aGUgbWFpbiB0aHJlYWQuIHtAY29kZSBudWxsfSBpcworICAgICAqIGFsbG93ZWQsIGFuZCBzaW1wbHkgbWVhbnMgdGhhdCB0aGVyZSBubyBydW5uYWJsZSBpcyByZXF1aXJlZC4KKyAgICAgKiBAcGFyYW0gZm9yY2VMYXlvdXQgdHJ1ZSBpZiB0aGVyZSBzaG91bGQgYmUgYW4gZXhwbGljaXQgY2FsbCB0byByZXF1ZXN0TGF5b3V0KCksCisgICAgICogZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHJ1bk9uTWFpbkFuZExheW91dFN5bmMoQE5vbk51bGwgZmluYWwgQWN0aXZpdHlUZXN0UnVsZSBhY3Rpdml0eVRlc3RSdWxlLAorICAgICAgICAgICAgQE51bGxhYmxlIGZpbmFsIFJ1bm5hYmxlIHJ1bm5lciwgYm9vbGVhbiBmb3JjZUxheW91dCkKKyAgICAgICAgICAgIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBydW5Pbk1haW5BbmRMYXlvdXRTeW5jKGFjdGl2aXR5VGVzdFJ1bGUsCisgICAgICAgICAgICAgICAgYWN0aXZpdHlUZXN0UnVsZS5nZXRBY3Rpdml0eSgpLmdldFdpbmRvdygpLmdldERlY29yVmlldygpLCBydW5uZXIsIGZvcmNlTGF5b3V0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSdW5zIHRoZSBzcGVjaWZpZWQgUnVubmFibGUgb24gdGhlIG1haW4gdGhyZWFkIGFuZCBlbnN1cmVzIHRoYXQgdGhlIHNwZWNpZmllZCB2aWV3IGlzCisgICAgICogbGFpZCBvdXQgYmVmb3JlIHJldHVybmluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhY3Rpdml0eVRlc3RSdWxlIHRoZSBhY3Rpdml0eSB0ZXN0IHJ1bGUgdXNlZCB0byBydW4gdGhlIHRlc3QKKyAgICAgKiBAcGFyYW0gdmlldyBUaGUgdmlldworICAgICAqIEBwYXJhbSBydW5uZXIgdGhlIHJ1bm5hYmxlIHRvIHJ1biBvbiB0aGUgbWFpbiB0aHJlYWQuIHtAY29kZSBudWxsfSBpcworICAgICAqIGFsbG93ZWQsIGFuZCBzaW1wbHkgbWVhbnMgdGhhdCB0aGVyZSBubyBydW5uYWJsZSBpcyByZXF1aXJlZC4KKyAgICAgKiBAcGFyYW0gZm9yY2VMYXlvdXQgdHJ1ZSBpZiB0aGVyZSBzaG91bGQgYmUgYW4gZXhwbGljaXQgY2FsbCB0byByZXF1ZXN0TGF5b3V0KCksCisgICAgICogZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHJ1bk9uTWFpbkFuZExheW91dFN5bmMoQE5vbk51bGwgZmluYWwgQWN0aXZpdHlUZXN0UnVsZSBhY3Rpdml0eVRlc3RSdWxlLAorICAgICAgICAgICAgQE5vbk51bGwgZmluYWwgVmlldyB2aWV3LCBATnVsbGFibGUgZmluYWwgUnVubmFibGUgcnVubmVyLCBib29sZWFuIGZvcmNlTGF5b3V0KQorICAgICAgICAgICAgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGZpbmFsIFZpZXcgcm9vdFZpZXcgPSB2aWV3LmdldFJvb3RWaWV3KCk7CisKKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisKKyAgICAgICAgYWN0aXZpdHlUZXN0UnVsZS5ydW5PblVpVGhyZWFkKCgpIC0+IHsKKyAgICAgICAgICAgIGZpbmFsIE9uR2xvYmFsTGF5b3V0TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVmlld1RyZWVPYnNlcnZlci5Pbkdsb2JhbExheW91dExpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uR2xvYmFsTGF5b3V0KCkgeworICAgICAgICAgICAgICAgICAgICByb290Vmlldy5nZXRWaWV3VHJlZU9ic2VydmVyKCkucmVtb3ZlT25HbG9iYWxMYXlvdXRMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gY291bnRkb3duIGltbWVkaWF0ZWx5IHNpbmNlIHRoZSBsYXlvdXQgd2Ugd2VyZSB3YWl0aW5nIG9uIGhhcyBoYXBwZW5lZAorICAgICAgICAgICAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICByb290Vmlldy5nZXRWaWV3VHJlZU9ic2VydmVyKCkuYWRkT25HbG9iYWxMYXlvdXRMaXN0ZW5lcihsaXN0ZW5lcik7CisKKyAgICAgICAgICAgIGlmIChydW5uZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJ1bm5lci5ydW4oKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcmNlTGF5b3V0KSB7CisgICAgICAgICAgICAgICAgcm9vdFZpZXcucmVxdWVzdExheW91dCgpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkV4cGVjdGVkIGxheW91dCBwYXNzIHdpdGhpbiA1IHNlY29uZHMiLAorICAgICAgICAgICAgICAgICAgICBsYXRjaC5hd2FpdCg1LCBUaW1lVW5pdC5TRUNPTkRTKSk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvV2lmaUNvbmZpZ0NyZWF0b3IuamF2YSBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9XaWZpQ29uZmlnQ3JlYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE5ZDg0M2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvV2lmaUNvbmZpZ0NyZWF0b3IuamF2YQpAQCAtMCwwICsxLDI1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLkVYVFJBX1dJRklfU1RBVEU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIuV0lGSV9TVEFURV9FTkFCTEVEOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Qcm94eUluZm87CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaUNvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworLyoqCisgKiBBIHNpbXBsZSBhY3Rpdml0eSB0byBjcmVhdGUgYW5kIG1hbmFnZSB3aWZpIGNvbmZpZ3VyYXRpb25zLgorICovCitwdWJsaWMgY2xhc3MgV2lmaUNvbmZpZ0NyZWF0b3IgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9DUkVBVEVfV0lGSV9DT05GSUcgPQorICAgICAgICAgICAgImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ1JFQVRFX1dJRklfQ09ORklHIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fVVBEQVRFX1dJRklfQ09ORklHID0KKyAgICAgICAgICAgICJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlVQREFURV9XSUZJX0NPTkZJRyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1JFTU9WRV9XSUZJX0NPTkZJRyA9CisgICAgICAgICAgICAiY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5SRU1PVkVfV0lGSV9DT05GSUciOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX05FVElEID0gImV4dHJhLW5ldGlkIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9TU0lEID0gImV4dHJhLXNzaWQiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1NFQ1VSSVRZX1RZUEUgPSAiZXh0cmEtc2VjdXJpdHktdHlwZSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfUEFTU1dPUkQgPSAiZXh0cmEtcGFzc3dvcmQiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VDVVJJVFlfVFlQRV9OT05FID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRUNVUklUWV9UWVBFX1dQQSA9IDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VDVVJJVFlfVFlQRV9XRVAgPSAzOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJXaWZpQ29uZmlnQ3JlYXRvciI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEVOQUJMRV9XSUZJX1dBSVRfU0VDID0gMTBMOworCisgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgZmluYWwgV2lmaU1hbmFnZXIgbVdpZmlNYW5hZ2VyOworCisgICAgcHVibGljIFdpZmlDb25maWdDcmVhdG9yKENvbnRleHQgY29udGV4dCkgeworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIG1XaWZpTWFuYWdlciA9IChXaWZpTWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuV0lGSV9TRVJWSUNFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgbmV3IFdpRmkgbmV0d29yay4KKyAgICAgKiBAcmV0dXJuIG5ldHdvcmsgaWQgb3IgLTEgaW4gY2FzZSBvZiBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyBpbnQgYWRkTmV0d29yayhTdHJpbmcgc3NpZCwgYm9vbGVhbiBoaWRkZW4sIGludCBzZWN1cml0eVR5cGUsCisgICAgICAgICAgICBTdHJpbmcgcGFzc3dvcmQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgU2VjdXJpdHlFeGNlcHRpb24geworICAgICAgICBjaGVja0FuZEVuYWJsZVdpZmkoKTsKKworICAgICAgICBXaWZpQ29uZmlndXJhdGlvbiB3aWZpQ29uZiA9IGNyZWF0ZUNvbmZpZyhzc2lkLCBoaWRkZW4sIHNlY3VyaXR5VHlwZSwgcGFzc3dvcmQpOworCisgICAgICAgIGludCBuZXRJZCA9IG1XaWZpTWFuYWdlci5hZGROZXR3b3JrKHdpZmlDb25mKTsKKworICAgICAgICBpZiAobmV0SWQgIT0gLTEpIHsKKyAgICAgICAgICAgIG1XaWZpTWFuYWdlci5lbmFibGVOZXR3b3JrKG5ldElkLCB0cnVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIlVuYWJsZSB0byBhZGQgU1NJRCAnIiArIHNzaWQgKyAiJzogbmV0SWQgPSAiICsgbmV0SWQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXRJZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgbmV3IHdpZmlDb25maWd1cmF0aW9uIHdpdGggT1BFTiBzZWN1cml0eSB0eXBlLCBhbmQgdGhlIGdpdmVuIHBhY1Byb3h5CisgICAgICogdmVyaWZpZXMgdGhhdCB0aGUgcHJveHkgaXMgYWRkZWQgYnkgZ2V0dGluZyB0aGUgY29uZmlndXJhdGlvbiBiYWNrLCBhbmQgY2hlY2tpbmcgaXQuCisgICAgICogQHJldHVybiByZXR1cm5zIHRoZSBQQUMgcHJveHkgVVJMIGFmdGVyIGFkZGluZyB0aGUgbmV0d29yayBhbmQgZ2V0dGluZyBpdCBmcm9tIFdpZmlNYW5hZ2VyCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgYW55IG9mIHRoZSBXaWZpTWFuYWdlciBvcGVyYXRpb25zIGZhaWwKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGFkZEh0dHBQcm94eU5ldHdvcmtWZXJpZnlBbmRSZW1vdmUoU3RyaW5nIHNzaWQsIFN0cmluZyBwYWNQcm94eVVybCkKKyAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgcmV0cmlldmVkUGFjUHJveHlVcmwgPSBudWxsOworICAgICAgICBpbnQgbmV0SWQgPSAtMTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uIGNvbmYgPSBjcmVhdGVDb25maWcoc3NpZCwgZmFsc2UsIFNFQ1VSSVRZX1RZUEVfTk9ORSwgbnVsbCk7CisgICAgICAgICAgICBpZiAocGFjUHJveHlVcmwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNvbmYuc2V0SHR0cFByb3h5KFByb3h5SW5mby5idWlsZFBhY1Byb3h5KFVyaS5wYXJzZShwYWNQcm94eVVybCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5ldElkID0gbVdpZmlNYW5hZ2VyLmFkZE5ldHdvcmsoY29uZik7CisgICAgICAgICAgICBpZiAobmV0SWQgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJGYWlsZWQgdG8gYWRkTmV0d29yazogIiArIHNzaWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChmaW5hbCBXaWZpQ29uZmlndXJhdGlvbiB3IDogbVdpZmlNYW5hZ2VyLmdldENvbmZpZ3VyZWROZXR3b3JrcygpKSB7CisgICAgICAgICAgICAgICAgaWYgKHcuU1NJRC5lcXVhbHMoc3NpZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uZiA9IHc7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjb25mID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJGYWlsZWQgdG8gZ2V0IFdpZmlDb25maWd1cmF0aW9uIGZvcjogIiArIHNzaWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVXJpIHBhY1Byb3h5RmlsZVVyaSA9IG51bGw7CisgICAgICAgICAgICBQcm94eUluZm8gaHR0cFByb3h5ID0gY29uZi5nZXRIdHRwUHJveHkoKTsKKyAgICAgICAgICAgIGlmIChodHRwUHJveHkgIT0gbnVsbCkgcGFjUHJveHlGaWxlVXJpID0gaHR0cFByb3h5LmdldFBhY0ZpbGVVcmwoKTsKKyAgICAgICAgICAgIGlmIChwYWNQcm94eUZpbGVVcmkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHJpZXZlZFBhY1Byb3h5VXJsID0gY29uZi5nZXRIdHRwUHJveHkoKS5nZXRQYWNGaWxlVXJsKCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbVdpZmlNYW5hZ2VyLnJlbW92ZU5ldHdvcmsobmV0SWQpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRmFpbGVkIHRvIHJlbW92ZSBXaWZpQ29uZmlndXJhdGlvbjogIiArIHNzaWQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgbVdpZmlNYW5hZ2VyLnJlbW92ZU5ldHdvcmsobmV0SWQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXRyaWV2ZWRQYWNQcm94eVVybDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGVzIGEgbmV3IFdpRmkgbmV0d29yay4KKyAgICAgKiBAcmV0dXJuIG5ldHdvcmsgaWQgKG1heSBkaWZmZXIgZnJvbSBvcmlnaW5hbCkgb3IgLTEgaW4gY2FzZSBvZiBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyBpbnQgdXBkYXRlTmV0d29yayhXaWZpQ29uZmlndXJhdGlvbiB3aWZpQ29uZiwgU3RyaW5nIHNzaWQsIGJvb2xlYW4gaGlkZGVuLAorICAgICAgICAgICAgaW50IHNlY3VyaXR5VHlwZSwgU3RyaW5nIHBhc3N3b3JkKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIFNlY3VyaXR5RXhjZXB0aW9uIHsKKyAgICAgICAgY2hlY2tBbmRFbmFibGVXaWZpKCk7CisgICAgICAgIGlmICh3aWZpQ29uZiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBXaWZpQ29uZmlndXJhdGlvbiBjb25mID0gY3JlYXRlQ29uZmlnKHNzaWQsIGhpZGRlbiwgc2VjdXJpdHlUeXBlLCBwYXNzd29yZCk7CisgICAgICAgIGNvbmYubmV0d29ya0lkID0gd2lmaUNvbmYubmV0d29ya0lkOworCisgICAgICAgIGludCBuZXdOZXRJZCA9IG1XaWZpTWFuYWdlci51cGRhdGVOZXR3b3JrKGNvbmYpOworCisgICAgICAgIGlmIChuZXdOZXRJZCAhPSAtMSkgeworICAgICAgICAgICAgbVdpZmlNYW5hZ2VyLnNhdmVDb25maWd1cmF0aW9uKCk7CisgICAgICAgICAgICBtV2lmaU1hbmFnZXIuZW5hYmxlTmV0d29yayhuZXdOZXRJZCwgdHJ1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJVbmFibGUgdG8gdXBkYXRlIFNTSUQgJyIgKyBzc2lkICsgIic6IG5ldElkID0gIiArIG5ld05ldElkKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3TmV0SWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXBkYXRlcyBhIG5ldyBXaUZpIG5ldHdvcmsuCisgICAgICogQHJldHVybiBuZXR3b3JrIGlkIChtYXkgZGlmZmVyIGZyb20gb3JpZ2luYWwpIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHVwZGF0ZU5ldHdvcmsoaW50IG5ldElkLCBTdHJpbmcgc3NpZCwgYm9vbGVhbiBoaWRkZW4sCisgICAgICAgICAgICBpbnQgc2VjdXJpdHlUeXBlLCBTdHJpbmcgcGFzc3dvcmQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgU2VjdXJpdHlFeGNlcHRpb24geworICAgICAgICBjaGVja0FuZEVuYWJsZVdpZmkoKTsKKworICAgICAgICBXaWZpQ29uZmlndXJhdGlvbiB3aWZpQ29uZiA9IG51bGw7CisgICAgICAgIExpc3Q8V2lmaUNvbmZpZ3VyYXRpb24+IGNvbmZpZ3MgPSBtV2lmaU1hbmFnZXIuZ2V0Q29uZmlndXJlZE5ldHdvcmtzKCk7CisgICAgICAgIGZvciAoV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnIDogY29uZmlncykgeworICAgICAgICAgICAgaWYgKGNvbmZpZy5uZXR3b3JrSWQgPT0gbmV0SWQpIHsKKyAgICAgICAgICAgICAgICB3aWZpQ29uZiA9IGNvbmZpZzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdXBkYXRlTmV0d29yayh3aWZpQ29uZiwgc3NpZCwgaGlkZGVuLCBzZWN1cml0eVR5cGUsIHBhc3N3b3JkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVOZXR3b3JrKGludCBuZXRJZCkgeworICAgICAgICByZXR1cm4gbVdpZmlNYW5hZ2VyLnJlbW92ZU5ldHdvcmsobmV0SWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBXaWZpQ29uZmlndXJhdGlvbiBzZXQgdXAgYWNjb3JkaW5nIHRvIGdpdmVuIHBhcmFtZXRlcnMKKyAgICAgKiBAcGFyYW0gc3NpZCBTU0lEIG9mIHRoZSBuZXR3b3JrCisgICAgICogQHBhcmFtIGhpZGRlbiBJcyBTU0lEIG5vdCBicm9hZGNhc3Q/CisgICAgICogQHBhcmFtIHNlY3VyaXR5VHlwZSBPbmUgb2Yge0BsaW5rICNTRUNVUklUWV9UWVBFX05PTkV9LCB7QGxpbmsgI1NFQ1VSSVRZX1RZUEVfV1BBfSBvcgorICAgICAqICAgICAgICAgICAgICAgICAgICAge0BsaW5rICNTRUNVUklUWV9UWVBFX1dFUH0KKyAgICAgKiBAcGFyYW0gcGFzc3dvcmQgUGFzc3dvcmQgZm9yIFdQQSBvciBXRVAKKyAgICAgKiBAcmV0dXJuIENyZWF0ZWQgY29uZmlndXJhdGlvbiBvYmplY3QKKyAgICAgKi8KKyAgICBwcml2YXRlIFdpZmlDb25maWd1cmF0aW9uIGNyZWF0ZUNvbmZpZyhTdHJpbmcgc3NpZCwgYm9vbGVhbiBoaWRkZW4sIGludCBzZWN1cml0eVR5cGUsCisgICAgICAgICAgICBTdHJpbmcgcGFzc3dvcmQpIHsKKyAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24gd2lmaUNvbmYgPSBuZXcgV2lmaUNvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShzc2lkKSkgeworICAgICAgICAgICAgd2lmaUNvbmYuU1NJRCA9ICciJyArIHNzaWQgKyAnIic7CisgICAgICAgIH0KKyAgICAgICAgd2lmaUNvbmYuc3RhdHVzID0gV2lmaUNvbmZpZ3VyYXRpb24uU3RhdHVzLkVOQUJMRUQ7CisgICAgICAgIHdpZmlDb25mLmhpZGRlblNTSUQgPSBoaWRkZW47CisgICAgICAgIHN3aXRjaCAoc2VjdXJpdHlUeXBlKSB7CisgICAgICAgICAgICBjYXNlIFNFQ1VSSVRZX1RZUEVfTk9ORToKKyAgICAgICAgICAgICAgICB3aWZpQ29uZi5hbGxvd2VkS2V5TWFuYWdlbWVudC5zZXQoV2lmaUNvbmZpZ3VyYXRpb24uS2V5TWdtdC5OT05FKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU0VDVVJJVFlfVFlQRV9XUEE6CisgICAgICAgICAgICAgICAgdXBkYXRlRm9yV1BBQ29uZmlndXJhdGlvbih3aWZpQ29uZiwgcGFzc3dvcmQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTRUNVUklUWV9UWVBFX1dFUDoKKyAgICAgICAgICAgICAgICB1cGRhdGVGb3JXRVBDb25maWd1cmF0aW9uKHdpZmlDb25mLCBwYXNzd29yZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHdpZmlDb25mOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVGb3JXUEFDb25maWd1cmF0aW9uKFdpZmlDb25maWd1cmF0aW9uIHdpZmlDb25mLCBTdHJpbmcgd2lmaVBhc3N3b3JkKSB7CisgICAgICAgIHdpZmlDb25mLmFsbG93ZWRLZXlNYW5hZ2VtZW50LnNldChXaWZpQ29uZmlndXJhdGlvbi5LZXlNZ210LldQQV9QU0spOworICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHdpZmlQYXNzd29yZCkpIHsKKyAgICAgICAgICAgIHdpZmlDb25mLnByZVNoYXJlZEtleSA9ICciJyArIHdpZmlQYXNzd29yZCArICciJzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVGb3JXRVBDb25maWd1cmF0aW9uKFdpZmlDb25maWd1cmF0aW9uIHdpZmlDb25mLCBTdHJpbmcgcGFzc3dvcmQpIHsKKyAgICAgICAgd2lmaUNvbmYuYWxsb3dlZEtleU1hbmFnZW1lbnQuc2V0KFdpZmlDb25maWd1cmF0aW9uLktleU1nbXQuTk9ORSk7CisgICAgICAgIHdpZmlDb25mLmFsbG93ZWRBdXRoQWxnb3JpdGhtcy5zZXQoV2lmaUNvbmZpZ3VyYXRpb24uQXV0aEFsZ29yaXRobS5PUEVOKTsKKyAgICAgICAgd2lmaUNvbmYuYWxsb3dlZEF1dGhBbGdvcml0aG1zLnNldChXaWZpQ29uZmlndXJhdGlvbi5BdXRoQWxnb3JpdGhtLlNIQVJFRCk7CisgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkocGFzc3dvcmQpKSB7CisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gcGFzc3dvcmQubGVuZ3RoKCk7CisgICAgICAgICAgICBpZiAoKGxlbmd0aCA9PSAxMCB8fCBsZW5ndGggPT0gMjYKKyAgICAgICAgICAgICAgICAgICAgfHwgbGVuZ3RoID09IDU4KSAmJiBwYXNzd29yZC5tYXRjaGVzKCJbMC05QS1GYS1mXSoiKSkgeworICAgICAgICAgICAgICAgIHdpZmlDb25mLndlcEtleXNbMF0gPSBwYXNzd29yZDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgd2lmaUNvbmYud2VwS2V5c1swXSA9ICciJyArIHBhc3N3b3JkICsgJyInOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2lmaUNvbmYud2VwVHhLZXlJbmRleCA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tBbmRFbmFibGVXaWZpKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggZW5hYmxlZExhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworCisgICAgICAgIC8vIFJlZ2lzdGVyIGEgY2hhbmdlIHJlY2VpdmVyIGZpcnN0IHRvIHBpY2sgdXAgZXZlbnRzIGJldHdlZW4gaXNFbmFibGVkIGFuZCBzZXRFbmFibGVkCisgICAgICAgIGZpbmFsIEJyb2FkY2FzdFJlY2VpdmVyIHdhdGNoZXIgPSBuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgICAgICAgICBpZiAoaW50ZW50LmdldEludEV4dHJhKEVYVFJBX1dJRklfU1RBVEUsIC0xKSA9PSBXSUZJX1NUQVRFX0VOQUJMRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgZW5hYmxlZExhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBtQ29udGV4dC5yZWdpc3RlclJlY2VpdmVyKHdhdGNoZXIsIG5ldyBJbnRlbnRGaWx0ZXIoV2lmaU1hbmFnZXIuV0lGSV9TVEFURV9DSEFOR0VEX0FDVElPTikpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW4gY2FzZSB3aWZpIGlzIG5vdCBhbHJlYWR5IGVuYWJsZWQsIHdhaXQgZm9yIGl0IHRvIGNvbWUgdXAKKyAgICAgICAgICAgIGlmICghbVdpZmlNYW5hZ2VyLmlzV2lmaUVuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIG1XaWZpTWFuYWdlci5zZXRXaWZpRW5hYmxlZCh0cnVlKTsKKyAgICAgICAgICAgICAgICBlbmFibGVkTGF0Y2guYXdhaXQoRU5BQkxFX1dJRklfV0FJVF9TRUMsIFRpbWVVbml0LlNFQ09ORFMpOworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgbUNvbnRleHQudW5yZWdpc3RlclJlY2VpdmVyKHdhdGNoZXIpOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvV2l0aGluLmphdmEgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvV2l0aGluLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ5ZmY4MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9XaXRoaW4uamF2YQpAQCAtMCwwICsxLDkxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKKworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CisKK2ltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvOworaW1wb3J0IG9yZy5tb2NraXRvLmV4Y2VwdGlvbnMuYmFzZS5Nb2NraXRvQXNzZXJ0aW9uRXJyb3I7CitpbXBvcnQgb3JnLm1vY2tpdG8uaW50ZXJuYWwudmVyaWZpY2F0aW9uLmFwaS5WZXJpZmljYXRpb25EYXRhOworaW1wb3J0IG9yZy5tb2NraXRvLmludm9jYXRpb24uSW52b2NhdGlvbjsKK2ltcG9ydCBvcmcubW9ja2l0by52ZXJpZmljYXRpb24uVmVyaWZpY2F0aW9uTW9kZTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEN1c3RvbSB2ZXJpZmljYXRpb24gbW9kZSB0aGF0IGFsbG93cyB3YWl0aW5nIGZvciB0aGUgc3BlY2lmaWMgaW52b2NhdGlvbiB0byBoYXBwZW4gd2l0aGluCisgKiBhIGNlcnRhaW4gdGltZSBpbnRlcnZhbC4gTm90IHRoYXQgdW5saWtlIHtAbGluayBNb2NraXRvI3RpbWVvdXQoaW50KX0sIHRoaXMgbW9kZSB3aWxsIG5vdAorICogcmV0dXJuIGVhcmx5IGFuZCB0aHJvdyBleGNlcHRpb24gaWYgdGhlIGV4cGVjdGVkIG1ldGhvZCB3YXMgY2FsbGVkIHdpdGggYSBkaWZmZXJlbnQgc2V0IG9mCisgKiBwYXJhbWV0ZXJzIGJlZm9yZSB0aGUgY2FsbCB0aGF0IHdlJ3JlIHdhaXRpbmcgZm9yLgorICovCitwdWJsaWMgY2xhc3MgV2l0aGluIGltcGxlbWVudHMgVmVyaWZpY2F0aW9uTW9kZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBUSU1FX1NMSUNFID0gNTA7CisgICAgcHJpdmF0ZSBmaW5hbCBsb25nIG1UaW1lb3V0OworCisgICAgcHVibGljIFdpdGhpbihsb25nIHRpbWVvdXQpIHsKKyAgICAgICAgbVRpbWVvdXQgPSB0aW1lb3V0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZlcmlmeShWZXJpZmljYXRpb25EYXRhIGRhdGEpIHsKKyAgICAgICAgbG9uZyB0aW1lb3V0ID0gbVRpbWVvdXQ7CisgICAgICAgIE1vY2tpdG9Bc3NlcnRpb25FcnJvciBlcnJvclRvUmV0aHJvdyA9IG51bGw7CisgICAgICAgIC8vIExvb3AgaW4gdGhlIHNhbWUgd2F5IHdlIGRvIGluIFBvbGxpbmdDaGVjaywgc2xlZXBpbmcgYW5kIHRoZW4gdGVzdGluZyBmb3IgdGhlIHRhcmdldAorICAgICAgICAvLyBpbnZvY2F0aW9uCisgICAgICAgIHdoaWxlICh0aW1lb3V0ID4gMCkgeworICAgICAgICAgICAgU3lzdGVtQ2xvY2suc2xlZXAoVElNRV9TTElDRSk7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxJbnZvY2F0aW9uPiBhY3R1YWxJbnZvY2F0aW9ucyA9IGRhdGEuZ2V0QWxsSW52b2NhdGlvbnMoKTsKKyAgICAgICAgICAgICAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIGludm9jYXRpb25zIHNvIGZhciB0byBzZWUgaWYgd2UgaGF2ZSBhIG1hdGNoCisgICAgICAgICAgICAgICAgZm9yIChJbnZvY2F0aW9uIGludm9jYXRpb24gOiBhY3R1YWxJbnZvY2F0aW9ucykgeworICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5nZXRXYW50ZWQoKS5tYXRjaGVzKGludm9jYXRpb24pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3VuZCBvdXIgbWF0Y2ggd2l0aGluIG91ciB0aW1lb3V0LiBNYXJrIGFsbCBpbnZvY2F0aW9ucyBhcyB2ZXJpZmllZAorICAgICAgICAgICAgICAgICAgICAgICAgbWFya0FsbEludm9jYXRpb25zQXNWZXJpZmllZChkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCByZXR1cm4KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKE1vY2tpdG9Bc3NlcnRpb25FcnJvciBhc3NlcnRpb25FcnJvcikgeworICAgICAgICAgICAgICAgIGVycm9yVG9SZXRocm93ID0gYXNzZXJ0aW9uRXJyb3I7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRpbWVvdXQgLT0gVElNRV9TTElDRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlcnJvclRvUmV0aHJvdyAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBlcnJvclRvUmV0aHJvdzsKKyAgICAgICAgfQorCisgICAgICAgIHRocm93IG5ldyBNb2NraXRvQXNzZXJ0aW9uRXJyb3IoCisgICAgICAgICAgICAgICAgIlRpbWVkIG91dCB3aGlsZSB3YWl0aW5nICIgKyBtVGltZW91dCArICJtcyBmb3IgIiArIGRhdGEuZ2V0V2FudGVkKCkudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgLy8gVE9ETzogVW5jb21tZW50IG9uY2UgdXBncmFkZWQgdG8gMi43LjEzCisgICAgLy8gQE92ZXJyaWRlCisgICAgcHVibGljIFZlcmlmaWNhdGlvbk1vZGUgZGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisgICAgICAgIC8vIFJldHVybiB0aGlzIGZvciBub3cuCisgICAgICAgIC8vIFRPRE86IFJldHVybiB3cmFwcGVyIG9uY2UgdXBncmFkZWQgdG8gMi43LjEzCisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBtYXJrQWxsSW52b2NhdGlvbnNBc1ZlcmlmaWVkKFZlcmlmaWNhdGlvbkRhdGEgZGF0YSkgeworICAgICAgICBmb3IgKEludm9jYXRpb24gaW52b2NhdGlvbiA6IGRhdGEuZ2V0QWxsSW52b2NhdGlvbnMoKSkgeworICAgICAgICAgICAgaW52b2NhdGlvbi5tYXJrVmVyaWZpZWQoKTsKKyAgICAgICAgICAgIGRhdGEuZ2V0V2FudGVkKCkuY2FwdHVyZUFyZ3VtZW50c0Zyb20oaW52b2NhdGlvbik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvZGV2aWNlcG9saWN5L3Byb3Zpc2lvbmluZy9JQm9vbGVhbkNhbGxiYWNrLmFpZGwgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvZGV2aWNlcG9saWN5L3Byb3Zpc2lvbmluZy9JQm9vbGVhbkNhbGxiYWNrLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZkYjI2YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9kZXZpY2Vwb2xpY3kvcHJvdmlzaW9uaW5nL0lCb29sZWFuQ2FsbGJhY2suYWlkbApAQCAtMCwwICsxLDIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5kZXZpY2Vwb2xpY3kucHJvdmlzaW9uaW5nOworCitpbnRlcmZhY2UgSUJvb2xlYW5DYWxsYmFjayB7CisgICAgb25ld2F5IHZvaWQgb25SZXN1bHQoYm9vbGVhbiByZXN1bHQpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9kZXZpY2Vwb2xpY3kvcHJvdmlzaW9uaW5nL1NpbGVudFByb3Zpc2lvbmluZ1Rlc3RNYW5hZ2VyLmphdmEgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvZGV2aWNlcG9saWN5L3Byb3Zpc2lvbmluZy9TaWxlbnRQcm92aXNpb25pbmdUZXN0TWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNjg0OWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvZGV2aWNlcG9saWN5L3Byb3Zpc2lvbmluZy9TaWxlbnRQcm92aXNpb25pbmdUZXN0TWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMTc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5kZXZpY2Vwb2xpY3kucHJvdmlzaW9uaW5nOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLmFkbWluLkRldmljZVBvbGljeU1hbmFnZXIuQUNUSU9OX01BTkFHRURfUFJPRklMRV9QUk9WSVNJT05FRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuYWRtaW4uRGV2aWNlUG9saWN5TWFuYWdlci5BQ1RJT05fUFJPVklTSU9OX01BTkFHRURfUFJPRklMRTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LkludGVudC5BQ1RJT05fTUFOQUdFRF9QUk9GSUxFX0FEREVEOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLlVpRGV2aWNlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkJsb2NraW5nQnJvYWRjYXN0UmVjZWl2ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5MaW5rZWRCbG9ja2luZ1F1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCitwdWJsaWMgY2xhc3MgU2lsZW50UHJvdmlzaW9uaW5nVGVzdE1hbmFnZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVElNRU9VVF9TRUNPTkRTID0gMTIwTDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlNpbGVudFByb3Zpc2lvbmluZ1Rlc3QiOworCisgICAgcHJpdmF0ZSBmaW5hbCBMaW5rZWRCbG9ja2luZ1F1ZXVlPEJvb2xlYW4+IG1Qcm92aXNpb25pbmdSZXN1bHRzID0gbmV3IExpbmtlZEJsb2NraW5nUXVldWUoMSk7CisKKyAgICBwcml2YXRlIGZpbmFsIElCb29sZWFuQ2FsbGJhY2sgbVByb3Zpc2lvbmluZ1Jlc3VsdENhbGxiYWNrID0gbmV3IElCb29sZWFuQ2FsbGJhY2suU3R1YigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KGJvb2xlYW4gcmVzdWx0KSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1Qcm92aXNpb25pbmdSZXN1bHRzLnB1dChyZXN1bHQpOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIklCb29sZWFuQ2FsbGJhY2suY2FsbGJhY2siLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBJbnRlbnQgbVJlY2VpdmVkUHJvZmlsZVByb3Zpc2lvbmVkSW50ZW50OworCisgICAgcHVibGljIFNpbGVudFByb3Zpc2lvbmluZ1Rlc3RNYW5hZ2VyKENvbnRleHQgY29udGV4dCkgeworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQuZ2V0QXBwbGljYXRpb25Db250ZXh0KCk7CisgICAgfQorCisgICAgcHVibGljIEludGVudCBnZXRSZWNldmllZFByb2ZpbGVQcm92aXNpb25lZEludGVudCgpIHsKKyAgICAgICAgcmV0dXJuIG1SZWNlaXZlZFByb2ZpbGVQcm92aXNpb25lZEludGVudDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBzdGFydFByb3Zpc2lvbmluZ0FuZFdhaXQoSW50ZW50IHByb3Zpc2lvbmluZ0ludGVudCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgd2FrZVVwQW5kRGlzbWlzc0luc2VjdXJlS2V5Z3VhcmQoKTsKKyAgICAgICAgbUNvbnRleHQuc3RhcnRBY3Rpdml0eShnZXRTdGFydEludGVudChwcm92aXNpb25pbmdJbnRlbnQpKTsKKyAgICAgICAgTG9nLmkoVEFHLCAic3RhcnRBY3Rpdml0eSB3aXRoIGludGVudDogIiArIHByb3Zpc2lvbmluZ0ludGVudCk7CisKKyAgICAgICAgaWYgKEFDVElPTl9QUk9WSVNJT05fTUFOQUdFRF9QUk9GSUxFLmVxdWFscyhwcm92aXNpb25pbmdJbnRlbnQuZ2V0QWN0aW9uKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gd2FpdE1hbmFnZWRQcm9maWxlUHJvdmlzaW9uaW5nKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gd2FpdERldmljZU93bmVyUHJvdmlzaW9uaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gd2FpdERldmljZU93bmVyUHJvdmlzaW9uaW5nKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHBvbGxQcm92aXNpb25pbmdSZXN1bHQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gd2FpdE1hbmFnZWRQcm9maWxlUHJvdmlzaW9uaW5nKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgQmxvY2tpbmdCcm9hZGNhc3RSZWNlaXZlciBtYW5hZ2VkUHJvZmlsZVByb3Zpc2lvbmVkUmVjZWl2ZXIgPQorICAgICAgICAgICAgICAgIG5ldyBCbG9ja2luZ0Jyb2FkY2FzdFJlY2VpdmVyKG1Db250ZXh0LCBBQ1RJT05fTUFOQUdFRF9QUk9GSUxFX1BST1ZJU0lPTkVEKTsKKyAgICAgICAgQmxvY2tpbmdCcm9hZGNhc3RSZWNlaXZlciBtYW5hZ2VkUHJvZmlsZUFkZGVkUmVjZWl2ZXIgPQorICAgICAgICAgICAgICAgIG5ldyBCbG9ja2luZ0Jyb2FkY2FzdFJlY2VpdmVyKG1Db250ZXh0LCBBQ1RJT05fTUFOQUdFRF9QUk9GSUxFX0FEREVEKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1hbmFnZWRQcm9maWxlUHJvdmlzaW9uZWRSZWNlaXZlci5yZWdpc3RlcigpOworICAgICAgICAgICAgbWFuYWdlZFByb2ZpbGVBZGRlZFJlY2VpdmVyLnJlZ2lzdGVyKCk7CisKKyAgICAgICAgICAgIGlmICghcG9sbFByb3Zpc2lvbmluZ1Jlc3VsdCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtUmVjZWl2ZWRQcm9maWxlUHJvdmlzaW9uZWRJbnRlbnQgPQorICAgICAgICAgICAgICAgICAgICBtYW5hZ2VkUHJvZmlsZVByb3Zpc2lvbmVkUmVjZWl2ZXIuYXdhaXRGb3JCcm9hZGNhc3QoKTsKKyAgICAgICAgICAgIGlmIChtUmVjZWl2ZWRQcm9maWxlUHJvdmlzaW9uZWRJbnRlbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIm1hbmFnZWRQcm9maWxlUHJvdmlzaW9uZWRSZWNlaXZlci5hd2FpdEZvckJyb2FkY2FzdCgpOiBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtYW5hZ2VkUHJvZmlsZUFkZGVkUmVjZWl2ZXIuYXdhaXRGb3JCcm9hZGNhc3QoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAibWFuYWdlZFByb2ZpbGVBZGRlZFJlY2VpdmVyLmF3YWl0Rm9yQnJvYWRjYXN0KCk6IGZhaWxlZCIpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIG1hbmFnZWRQcm9maWxlUHJvdmlzaW9uZWRSZWNlaXZlci51bnJlZ2lzdGVyUXVpZXRseSgpOworICAgICAgICAgICAgbWFuYWdlZFByb2ZpbGVBZGRlZFJlY2VpdmVyLnVucmVnaXN0ZXJRdWlldGx5KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHBvbGxQcm92aXNpb25pbmdSZXN1bHQoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBCb29sZWFuIHJlc3VsdCA9IG1Qcm92aXNpb25pbmdSZXN1bHRzLnBvbGwoVElNRU9VVF9TRUNPTkRTLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICBMb2cuaShUQUcsICJNYW5hZ2VkUHJvdmlzaW9uaW5nIGRvZXNuJ3QgcmV0dXJuIHJlc3VsdCB3aXRoaW4gIgorICAgICAgICAgICAgICAgICAgICArIFRJTUVPVVRfU0VDT05EUyArICIgc2Vjb25kcyAiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghcmVzdWx0KSB7CisgICAgICAgICAgICBMb2cuaShUQUcsICJGYWlsZWQgdG8gcHJvdmlzaW9uIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBJbnRlbnQgZ2V0U3RhcnRJbnRlbnQoSW50ZW50IGludGVudCkgeworICAgICAgICBmaW5hbCBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOworICAgICAgICBidW5kbGUucHV0UGFyY2VsYWJsZShJbnRlbnQuRVhUUkFfSU5URU5ULCBpbnRlbnQpOworICAgICAgICBidW5kbGUucHV0QmluZGVyKFN0YXJ0UHJvdmlzaW9uaW5nQWN0aXZpdHkuRVhUUkFfQk9PTEVBTl9DQUxMQkFDSywKKyAgICAgICAgICAgICAgICBtUHJvdmlzaW9uaW5nUmVzdWx0Q2FsbGJhY2suYXNCaW5kZXIoKSk7CisgICAgICAgIHJldHVybiBuZXcgSW50ZW50KG1Db250ZXh0LCBTdGFydFByb3Zpc2lvbmluZ0FjdGl2aXR5LmNsYXNzKQorICAgICAgICAgICAgICAgIC5wdXRFeHRyYXMoYnVuZGxlKQorICAgICAgICAgICAgICAgIC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB3YWtlVXBBbmREaXNtaXNzSW5zZWN1cmVLZXlndWFyZCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFVpRGV2aWNlIHVpRGV2aWNlID0gVWlEZXZpY2UuZ2V0SW5zdGFuY2UoSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkpOworICAgICAgICAgICAgdWlEZXZpY2Uud2FrZVVwKCk7CisgICAgICAgICAgICB1aURldmljZS5wcmVzc01lbnUoKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIndha2VVcFNjcmVlbiIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQmxvY2tpbmdSZWNlaXZlciBleHRlbmRzIEJyb2FkY2FzdFJlY2VpdmVyIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIENvdW50RG93bkxhdGNoIG1MYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQWN0aW9uOworICAgICAgICBwcml2YXRlIEludGVudCBtUmVjZWl2ZWRJbnRlbnQ7CisKKyAgICAgICAgcHJpdmF0ZSBCbG9ja2luZ1JlY2VpdmVyKENvbnRleHQgY29udGV4dCwgU3RyaW5nIGFjdGlvbikgeworICAgICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICAgICAgbUFjdGlvbiA9IGFjdGlvbjsKKyAgICAgICAgICAgIG1SZWNlaXZlZEludGVudCA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCByZWdpc3RlcigpIHsKKyAgICAgICAgICAgIG1Db250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIodGhpcywgbmV3IEludGVudEZpbHRlcihtQWN0aW9uKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBhd2FpdCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gbUxhdGNoLmF3YWl0KFRJTUVPVVRfU0VDT05EUywgVGltZVVuaXQuU0VDT05EUyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSW50ZW50IGdldFJlY2VpdmVkSW50ZW50KCkgeworICAgICAgICAgICAgcmV0dXJuIG1SZWNlaXZlZEludGVudDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICBtUmVjZWl2ZWRJbnRlbnQgPSBpbnRlbnQ7CisgICAgICAgICAgICBtTGF0Y2guY291bnREb3duKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvZGV2aWNlcG9saWN5L3Byb3Zpc2lvbmluZy9TdGFydFByb3Zpc2lvbmluZ0FjdGl2aXR5LmphdmEgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvZGV2aWNlcG9saWN5L3Byb3Zpc2lvbmluZy9TdGFydFByb3Zpc2lvbmluZ0FjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE5ODc5NAotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9kZXZpY2Vwb2xpY3kvcHJvdmlzaW9uaW5nL1N0YXJ0UHJvdmlzaW9uaW5nQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5kZXZpY2Vwb2xpY3kucHJvdmlzaW9uaW5nOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOworCisvKioKKyAqIE11c3QgcmVnaXN0ZXIgaXQgaW4gQW5kcm9pZE1hbmlmZXN0LnhtbAorICogPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5kZXZpY2Vwb2xpY3kucHJvdmlzaW9uaW5nLlN0YXJ0UHJvdmlzaW9uaW5nQWN0aXZpdHkiPjwvYWN0aXZpdHk+CisgKi8KK3B1YmxpYyBjbGFzcyBTdGFydFByb3Zpc2lvbmluZ0FjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVFVRVNUX0NPREUgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3RhcnRQcm92aXNpb25BY3Rpdml0eSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9CT09MRUFOX0NBTExCQUNLID0gIkVYVFJBX0JPT0xFQU5fQ0FMTEJBQ0siOworCisgICAgSUJvb2xlYW5DYWxsYmFjayBtUmVzdWx0Q2FsbGJhY2s7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgLy8gUmVkdWNlIGZsYWtpbmVzcyBvZiB0aGUgdGVzdAorICAgICAgICAvLyBTaG93IGFjdGl2aXR5IG9uIHRvcCBvZiBrZXlndWFyZAorICAgICAgICBnZXRXaW5kb3coKS5hZGRGbGFncyhXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0RJU01JU1NfS0VZR1VBUkQpOworICAgICAgICAvLyBUdXJuIG9uIHNjcmVlbiB0byBwcmV2ZW50IGFjdGl2aXR5IGJlaW5nIHBhdXNlZCBieSBzeXN0ZW0KKyAgICAgICAgZ2V0V2luZG93KCkuYWRkRmxhZ3MoV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19UVVJOX1NDUkVFTl9PTik7CisgICAgICAgIGdldFdpbmRvdygpLmFkZEZsYWdzKFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfS0VFUF9TQ1JFRU5fT04pOworCisgICAgICAgIG1SZXN1bHRDYWxsYmFjayA9IElCb29sZWFuQ2FsbGJhY2suU3R1Yi5hc0ludGVyZmFjZSgKKyAgICAgICAgICAgICAgICBnZXRJbnRlbnQoKS5nZXRFeHRyYXMoKS5nZXRCaW5kZXIoRVhUUkFfQk9PTEVBTl9DQUxMQkFDSykpOworICAgICAgICBMb2cuaShUQUcsICJyZXN1bHQgY2FsbGJhY2sgY2xhc3MgbmFtZSAiICsgbVJlc3VsdENhbGxiYWNrKTsKKworICAgICAgICAvLyBPbmx5IHByb3Zpc2lvbiBpdCBpZiB0aGUgYWN0aXZpdHkgaXMgbm90IHJlLWNyZWF0ZWQKKyAgICAgICAgaWYgKHNhdmVkSW5zdGFuY2VTdGF0ZSA9PSBudWxsKSB7CisgICAgICAgICAgICBJbnRlbnQgcHJvdmlzaW9uaW5nSW50ZW50ID0gZ2V0SW50ZW50KCkuZ2V0UGFyY2VsYWJsZUV4dHJhKEludGVudC5FWFRSQV9JTlRFTlQpOworCisgICAgICAgICAgICBzdGFydEFjdGl2aXR5Rm9yUmVzdWx0KHByb3Zpc2lvbmluZ0ludGVudCwgUkVRVUVTVF9DT0RFKTsKKyAgICAgICAgICAgIExvZy5pKFRBRywgIlN0YXJ0IHByb3Zpc2lvbmluZyBpbnRlbnQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQWN0aXZpdHlSZXN1bHQoaW50IHJlcXVlc3RDb2RlLCBpbnQgcmVzdWx0Q29kZSwgSW50ZW50IGRhdGEpIHsKKyAgICAgICAgaWYgKHJlcXVlc3RDb2RlID09IFJFUVVFU1RfQ09ERSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBib29sZWFuIHJlc3VsdCA9IHJlc3VsdENvZGUgPT0gUkVTVUxUX09LOworICAgICAgICAgICAgICAgIG1SZXN1bHRDYWxsYmFjay5vblJlc3VsdChyZXN1bHQpOworICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIm9uQWN0aXZpdHlSZXN1bHQgcmVzdWx0OiAiICsgcmVzdWx0KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAib25BY3Rpdml0eVJlc3VsdCIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3VwZXIub25BY3Rpdml0eVJlc3VsdChyZXF1ZXN0Q29kZSwgcmVzdWx0Q29kZSwgZGF0YSk7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL3RyYW5zaXRpb24vVGFyZ2V0VHJhY2tpbmcuamF2YSBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC90cmFuc2l0aW9uL1RhcmdldFRyYWNraW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M1MzkyMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC90cmFuc2l0aW9uL1RhcmdldFRyYWNraW5nLmphdmEKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwudHJhbnNpdGlvbjsKKworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK3B1YmxpYyBpbnRlcmZhY2UgVGFyZ2V0VHJhY2tpbmcgeworICAgIEFycmF5TGlzdDxWaWV3PiBnZXRUcmFja2VkVGFyZ2V0cygpOworICAgIHZvaWQgY2xlYXJUYXJnZXRzKCk7CisgICAgUmVjdCBnZXRDYXB0dXJlZEVwaWNlbnRlcigpOworfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL3RyYW5zaXRpb24vVHJhY2tpbmdUcmFuc2l0aW9uLmphdmEgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvdHJhbnNpdGlvbi9UcmFja2luZ1RyYW5zaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWIyMzVkCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL3RyYW5zaXRpb24vVHJhY2tpbmdUcmFuc2l0aW9uLmphdmEKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwudHJhbnNpdGlvbjsKKworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKK2ltcG9ydCBhbmRyb2lkLnRyYW5zaXRpb24uVHJhbnNpdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnRyYW5zaXRpb24uVHJhbnNpdGlvblZhbHVlczsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworLyoqCisgKiBBIHRyYW5zaXRpb24gdGhhdCB0cmFja3Mgd2hpY2ggdGFyZ2V0cyBhcmUgYXBwbGllZCB0byBpdC4KKyAqIEl0IHdpbGwgYXNzdW1lIGFueSB0YXJnZXQgdGhhdCBpdCBhcHBsaWVzIHRvIHdpbGwgaGF2ZSBkaWZmZXJlbmNlcworICogYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZCBzdGF0ZSwgcmVnYXJkbGVzcyBvZiB0aGUgZGlmZmVyZW5jZXMKKyAqIHRoYXQgYWN0dWFsbHkgZXhpc3QuIEluIG90aGVyIHdvcmRzLCBpdCBkb2Vzbid0IGFjdHVhbGx5IGNoZWNrCisgKiBhbnkgc2l6ZSBvciBwb3NpdGlvbiBkaWZmZXJlbmNlcyBvciBhbnkgb3RoZXIgcHJvcGVydHkgb2YgdGhlIHZpZXcuCisgKiBJdCBqdXN0IHJlY29yZHMgdGhlIGRpZmZlcmVuY2UuCisgKiA8cD4KKyAqIEJvdGggc3RhcnQgYW5kIGVuZCB2YWx1ZSBWaWV3cyBhcmUgcmVjb3JkZWQsIGJ1dCBubyBhY3R1YWwgYW5pbWF0aW9uCisgKiBpcyBjcmVhdGVkLgorICovCitwdWJsaWMgY2xhc3MgVHJhY2tpbmdUcmFuc2l0aW9uIGV4dGVuZHMgVHJhbnNpdGlvbiBpbXBsZW1lbnRzIFRhcmdldFRyYWNraW5nIHsKKyAgICBwdWJsaWMgZmluYWwgQXJyYXlMaXN0PFZpZXc+IHRhcmdldHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIFJlY3RbXSBtRXBpY2VudGVyID0gbmV3IFJlY3RbMV07CisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFBST1AgPSAidHJhY2tpbmc6cHJvcCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gUFJPUFMgPSB7IFBST1AgfTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRUcmFuc2l0aW9uUHJvcGVydGllcygpIHsKKyAgICAgICAgcmV0dXJuIFBST1BTOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNhcHR1cmVTdGFydFZhbHVlcyhUcmFuc2l0aW9uVmFsdWVzIHRyYW5zaXRpb25WYWx1ZXMpIHsKKyAgICAgICAgdHJhbnNpdGlvblZhbHVlcy52YWx1ZXMucHV0KFBST1AsIDApOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNhcHR1cmVFbmRWYWx1ZXMoVHJhbnNpdGlvblZhbHVlcyB0cmFuc2l0aW9uVmFsdWVzKSB7CisgICAgICAgIHRyYW5zaXRpb25WYWx1ZXMudmFsdWVzLnB1dChQUk9QLCAxKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQW5pbWF0b3IgY3JlYXRlQW5pbWF0b3IoVmlld0dyb3VwIHNjZW5lUm9vdCwgVHJhbnNpdGlvblZhbHVlcyBzdGFydFZhbHVlcywKKyAgICAgICAgICAgIFRyYW5zaXRpb25WYWx1ZXMgZW5kVmFsdWVzKSB7CisgICAgICAgIGlmIChzdGFydFZhbHVlcyAhPSBudWxsKSB7CisgICAgICAgICAgICB0YXJnZXRzLmFkZChzdGFydFZhbHVlcy52aWV3KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZW5kVmFsdWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRhcmdldHMuYWRkKGVuZFZhbHVlcy52aWV3KTsKKyAgICAgICAgfQorICAgICAgICBSZWN0IGVwaWNlbnRlciA9IGdldEVwaWNlbnRlcigpOworICAgICAgICBpZiAoZXBpY2VudGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1FcGljZW50ZXJbMF0gPSBuZXcgUmVjdChlcGljZW50ZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUVwaWNlbnRlclswXSA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFycmF5TGlzdDxWaWV3PiBnZXRUcmFja2VkVGFyZ2V0cygpIHsKKyAgICAgICAgcmV0dXJuIHRhcmdldHM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xlYXJUYXJnZXRzKCkgeworICAgICAgICB0YXJnZXRzLmNsZWFyKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlY3QgZ2V0Q2FwdHVyZWRFcGljZW50ZXIoKSB7CisgICAgICAgIHJldHVybiBtRXBpY2VudGVyWzBdOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC90cmFuc2l0aW9uL1RyYWNraW5nVmlzaWJpbGl0eS5qYXZhIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL3RyYW5zaXRpb24vVHJhY2tpbmdWaXNpYmlsaXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE1YTE5ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC90cmFuc2l0aW9uL1RyYWNraW5nVmlzaWJpbGl0eS5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLnRyYW5zaXRpb247CisKK2ltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CitpbXBvcnQgYW5kcm9pZC50cmFuc2l0aW9uLlRyYW5zaXRpb25WYWx1ZXM7CitpbXBvcnQgYW5kcm9pZC50cmFuc2l0aW9uLlZpc2liaWxpdHk7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKKy8qKgorICogVmlzaWJpbGl0eSB0cmFuc2l0aW9uIHRoYXQgdHJhY2tzIHdoaWNoIHRhcmdldHMgYXJlIGFwcGxpZWQgdG8gaXQuCisgKiBUaGlzIHRyYW5zaXRpb24gZG9lcyBubyBhbmltYXRpb24uCisgKi8KK3B1YmxpYyBjbGFzcyBUcmFja2luZ1Zpc2liaWxpdHkgZXh0ZW5kcyBWaXNpYmlsaXR5IGltcGxlbWVudHMgVGFyZ2V0VHJhY2tpbmcgeworICAgIHB1YmxpYyBmaW5hbCBBcnJheUxpc3Q8Vmlldz4gdGFyZ2V0cyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgIHByaXZhdGUgZmluYWwgUmVjdFtdIG1FcGljZW50ZXIgPSBuZXcgUmVjdFsxXTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBbmltYXRvciBvbkFwcGVhcihWaWV3R3JvdXAgc2NlbmVSb290LCBWaWV3IHZpZXcsIFRyYW5zaXRpb25WYWx1ZXMgc3RhcnRWYWx1ZXMsCisgICAgICAgICAgICBUcmFuc2l0aW9uVmFsdWVzIGVuZFZhbHVlcykgeworICAgICAgICB0YXJnZXRzLmFkZChlbmRWYWx1ZXMudmlldyk7CisgICAgICAgIFJlY3QgZXBpY2VudGVyID0gZ2V0RXBpY2VudGVyKCk7CisgICAgICAgIGlmIChlcGljZW50ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbUVwaWNlbnRlclswXSA9IG5ldyBSZWN0KGVwaWNlbnRlcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtRXBpY2VudGVyWzBdID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQW5pbWF0b3Igb25EaXNhcHBlYXIoVmlld0dyb3VwIHNjZW5lUm9vdCwgVmlldyB2aWV3LCBUcmFuc2l0aW9uVmFsdWVzIHN0YXJ0VmFsdWVzLAorICAgICAgICAgICAgVHJhbnNpdGlvblZhbHVlcyBlbmRWYWx1ZXMpIHsKKyAgICAgICAgdGFyZ2V0cy5hZGQoc3RhcnRWYWx1ZXMudmlldyk7CisgICAgICAgIFJlY3QgZXBpY2VudGVyID0gZ2V0RXBpY2VudGVyKCk7CisgICAgICAgIGlmIChlcGljZW50ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbUVwaWNlbnRlclswXSA9IG5ldyBSZWN0KGVwaWNlbnRlcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtRXBpY2VudGVyWzBdID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQXJyYXlMaXN0PFZpZXc+IGdldFRyYWNrZWRUYXJnZXRzKCkgeworICAgICAgICByZXR1cm4gdGFyZ2V0czsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbGVhclRhcmdldHMoKSB7CisgICAgICAgIHRhcmdldHMuY2xlYXIoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVjdCBnZXRDYXB0dXJlZEVwaWNlbnRlcigpIHsKKyAgICAgICAgcmV0dXJuIG1FcGljZW50ZXJbMF07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3Rlc3RzL0FuZHJvaWQubWsgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvdGVzdHMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDY4MWRlCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3Rlc3RzL0FuZHJvaWQubWsKQEAgLTAsMCArMSwyOSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQorCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQganVuaXQKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfTU9EVUxFIDo9IGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0LXRlc3RzCisKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19KQVZBX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQXBpTGV2ZWxVdGlsVGVzdC5qYXZhIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0FwaUxldmVsVXRpbFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjBmMGRlCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0FwaUxldmVsVXRpbFRlc3QuamF2YQpAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsOworCitpbXBvcnQgc3RhdGljIGp1bml0LmZyYW1ld29yay5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKKy8qKgorICogVGVzdHMgZm9yIHtAbGluZSBBcGlMZXZlbFV0aWx9LgorICovCitAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIEFwaUxldmVsVXRpbFRlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyaXNvbkJ5SW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGludCB2ZXJzaW9uID0gQnVpbGQuVkVSU0lPTi5TREtfSU5UOworCisgICAgICAgIGFzc2VydEZhbHNlKEFwaUxldmVsVXRpbC5pc0JlZm9yZSh2ZXJzaW9uIC0gMSkpOworICAgICAgICBhc3NlcnRGYWxzZShBcGlMZXZlbFV0aWwuaXNCZWZvcmUodmVyc2lvbikpOworICAgICAgICBhc3NlcnRUcnVlKEFwaUxldmVsVXRpbC5pc0JlZm9yZSh2ZXJzaW9uICsgMSkpOworCisgICAgICAgIGFzc2VydFRydWUoQXBpTGV2ZWxVdGlsLmlzQWZ0ZXIodmVyc2lvbiAtIDEpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoQXBpTGV2ZWxVdGlsLmlzQWZ0ZXIodmVyc2lvbikpOworICAgICAgICBhc3NlcnRGYWxzZShBcGlMZXZlbFV0aWwuaXNBZnRlcih2ZXJzaW9uICsgMSkpOworCisgICAgICAgIGFzc2VydFRydWUoQXBpTGV2ZWxVdGlsLmlzQXRMZWFzdCh2ZXJzaW9uIC0gMSkpOworICAgICAgICBhc3NlcnRUcnVlKEFwaUxldmVsVXRpbC5pc0F0TGVhc3QodmVyc2lvbikpOworICAgICAgICBhc3NlcnRGYWxzZShBcGlMZXZlbFV0aWwuaXNBdExlYXN0KHZlcnNpb24gKyAxKSk7CisKKyAgICAgICAgYXNzZXJ0RmFsc2UoQXBpTGV2ZWxVdGlsLmlzQXRNb3N0KHZlcnNpb24gLSAxKSk7CisgICAgICAgIGFzc2VydFRydWUoQXBpTGV2ZWxVdGlsLmlzQXRNb3N0KHZlcnNpb24pKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShBcGlMZXZlbFV0aWwuaXNBdE1vc3QodmVyc2lvbiArIDEpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wYXJpc29uQnlTdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gdGVzdCBzaG91bGQgcGFzcyBhcyBsb25nIGFzIGRldmljZSBTREsgdmVyc2lvbiBpcyBhdCBsZWFzdCAxMgorICAgICAgICBhc3NlcnRUcnVlKEFwaUxldmVsVXRpbC5pc0F0TGVhc3QoIkhPTkVZQ09NQl9NUjEiKSk7CisgICAgICAgIGFzc2VydFRydWUoQXBpTGV2ZWxVdGlsLmlzQXRMZWFzdCgiMTIiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZVZlcnNpb25TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gY2FuIG9ubHkgdGVzdCB2ZXJzaW9ucyBrbm93biB0byB0aGUgZGV2aWNlIGJ1aWxkCisgICAgICAgIGFzc2VydEVxdWFscyhBcGlMZXZlbFV0aWwucmVzb2x2ZVZlcnNpb25TdHJpbmcoIkdJTkdFUkJSRUFEX01SMSIpLCAxMCk7CisgICAgICAgIGFzc2VydEVxdWFscyhBcGlMZXZlbFV0aWwucmVzb2x2ZVZlcnNpb25TdHJpbmcoIjEwIiksIDEwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFwaUxldmVsVXRpbC5yZXNvbHZlVmVyc2lvblN0cmluZygiSE9ORVlDT01CIiksIDExKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFwaUxldmVsVXRpbC5yZXNvbHZlVmVyc2lvblN0cmluZygiMTEiKSwgMTEpOworICAgICAgICBhc3NlcnRFcXVhbHMoQXBpTGV2ZWxVdGlsLnJlc29sdmVWZXJzaW9uU3RyaW5nKCJob25leWNvbWJfbXIxIiksIDEyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFwaUxldmVsVXRpbC5yZXNvbHZlVmVyc2lvblN0cmluZygiMTIiKSwgMTIpOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gUnVudGltZUV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZU1pc3NwZWxsZWRWZXJzaW9uU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEFwaUxldmVsVXRpbC5yZXNvbHZlVmVyc2lvblN0cmluZygiR0lOR0VSQkVBUkQiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQnVzaW5lc3NMb2dpY0RldmljZUV4ZWN1dG9yVGVzdC5qYXZhIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0J1c2luZXNzTG9naWNEZXZpY2VFeGVjdXRvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGQ1ZDI5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0J1c2luZXNzTG9naWNEZXZpY2VFeGVjdXRvclRlc3QuamF2YQpAQCAtMCwwICsxLDMxNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKKworaW1wb3J0IHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMganVuaXQuZnJhbWV3b3JrLkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMganVuaXQuZnJhbWV3b3JrLkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIGp1bml0LmZyYW1ld29yay5Bc3NlcnQuZmFpbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc3VtZS5hc3N1bWVUcnVlOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgb3JnLmp1bml0LkFzc3VtcHRpb25WaW9sYXRlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yOworCisvKioKKyAqIFRlc3RzIGZvciB7QGxpbmUgQnVzaW5lc3NMb2dpY0RldmljZUV4ZWN1dG9yfS4KKyAqLworQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBCdXNpbmVzc0xvZ2ljRGV2aWNlRXhlY3V0b3JUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUSElTX0NMQVNTID0KKyAgICAgICAgICAgICJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkJ1c2luZXNzTG9naWNEZXZpY2VFeGVjdXRvclRlc3QiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfMSA9IFRISVNfQ0xBU1MgKyAiLm1ldGhvZDEiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfMiA9IFRISVNfQ0xBU1MgKyAiLm1ldGhvZDIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfMyA9IFRISVNfQ0xBU1MgKyAiLm1ldGhvZDMiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfNCA9IFRISVNfQ0xBU1MgKyAiLm1ldGhvZDQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfNSA9IFRISVNfQ0xBU1MgKyAiLm1ldGhvZDUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfNiA9IFRISVNfQ0xBU1MgKyAiLm1ldGhvZDYiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfNyA9IFRISVNfQ0xBU1MgKyAiLm1ldGhvZDciOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfOCA9IFRISVNfQ0xBU1MgKyAiLm1ldGhvZDgiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfOSA9IFRISVNfQ0xBU1MgKyAiLm1ldGhvZDkiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfMTAgPSBUSElTX0NMQVNTICsgIi5tZXRob2QxMCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZBS0VfTUVUSE9EID0gVEhJU19DTEFTUyArICIubWV0aG9kRG9lc250RXhpc3QiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdfU1RSSU5HXzEgPSAiYXJnMSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR19TVFJJTkdfMiA9ICJhcmcyIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPVEhFUl9NRVRIT0RfMSA9IFRISVNfQ0xBU1MgKyAiJE90aGVyQ2xhc3MubWV0aG9kMSI7CisKKyAgICBwcml2YXRlIFN0cmluZyBtSW52b2tlZCA9IG51bGw7CisgICAgcHJpdmF0ZSBPYmplY3RbXSBtQXJnc1VzZWQgPSBudWxsOworICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKKyAgICBwcml2YXRlIEJ1c2luZXNzTG9naWNFeGVjdXRvciBtRXhlY3V0b3I7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIG1Db250ZXh0ID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0VGFyZ2V0Q29udGV4dCgpOworICAgICAgICBtRXhlY3V0b3IgPSBuZXcgQnVzaW5lc3NMb2dpY0RldmljZUV4ZWN1dG9yKG1Db250ZXh0LCB0aGlzKTsKKyAgICAgICAgLy8gcmVzZXQgdGhlIGluc3RhbmNlIHZhcmlhYmxlcyB0cmFja2luZyB0aGUgbWV0aG9kIGludm9rZWQgYW5kIHRoZSBhcmdzIHVzZWQKKyAgICAgICAgbUludm9rZWQgPSBudWxsOworICAgICAgICBtQXJnc1VzZWQgPSBudWxsOworICAgICAgICAvLyByZXNldCB0aGUgT3RoZXJDbGFzcyBjbGFzcyB2YXJpYWJsZSB0cmFja2luZyB0aGUgbWV0aG9kIGludm9rZWQKKyAgICAgICAgT3RoZXJDbGFzcy5vdGhlckludm9rZWQgPSBudWxsOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEludm9rZU1ldGhvZEluVGhpc0NsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1FeGVjdXRvci5pbnZva2VNZXRob2QoTUVUSE9EXzEpOworICAgICAgICAvLyBhc3NlcnQgdGhhdCBtSW52b2tlZCB3YXMgc2V0IGZvciB0aGlzIEJ1c2luZXNzTG9naWNEZXZpY2VFeGVjdXRvclRlc3QgaW5zdGFuY2UKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJGYWlsZWQgdG8gaW52b2tlIG1ldGhvZCBpbiB0aGlzIGNsYXNzIiwgbUludm9rZWQsIE1FVEhPRF8xKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZva2VNZXRob2RJbk90aGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbUV4ZWN1dG9yLmludm9rZU1ldGhvZChPVEhFUl9NRVRIT0RfMSk7CisgICAgICAgIC8vIGFzc2VydCB0aGF0IE90aGVyQ2xhc3MubWV0aG9kMSB3YXMgaW52b2tlZCwgYW5kIHN0YXRpYyBmaWVsZCBvZiBPdGhlckNsYXNzIHdhcyBjaGFuZ2VkCisgICAgICAgIGFzc2VydEVxdWFscygiRmFpbGVkIHRvIGludm9rZSBtZXRob2QgaW4gb3RoZXIgY2xhc3MiLCBPdGhlckNsYXNzLm90aGVySW52b2tlZCwKKyAgICAgICAgICAgICAgICBPVEhFUl9NRVRIT0RfMSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlTWV0aG9kV2l0aFN0cmluZ0FyZ3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbUV4ZWN1dG9yLmludm9rZU1ldGhvZChNRVRIT0RfMiwgQVJHX1NUUklOR18xLCBBUkdfU1RSSU5HXzIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byBpbnZva2UgbWV0aG9kIGluIHRoaXMgY2xhc3MiLCBtSW52b2tlZCwgTUVUSE9EXzIpOworICAgICAgICAvLyBhc3NlcnQgYm90aCBTdHJpbmcgYXJndW1lbnRzIHdlcmUgY29ycmVjdGx5IHNldCBmb3IgbWV0aG9kMgorICAgICAgICBhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byBzZXQgZmlyc3QgYXJndW1lbnQiLCBtQXJnc1VzZWRbMF0sIEFSR19TVFJJTkdfMSk7CisgICAgICAgIGFzc2VydEVxdWFscygiRmFpbGVkIHRvIHNldCBzZWNvbmQgYXJndW1lbnQiLCBtQXJnc1VzZWRbMV0sIEFSR19TVFJJTkdfMik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlTWV0aG9kV2l0aFN0cmluZ0FuZENvbnRleHRBcmdzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1FeGVjdXRvci5pbnZva2VNZXRob2QoTUVUSE9EXzMsIEFSR19TVFJJTkdfMSk7CisgICAgICAgIGFzc2VydEVxdWFscygiRmFpbGVkIHRvIGludm9rZSBtZXRob2QgaW4gdGhpcyBjbGFzcyIsIG1JbnZva2VkLCBNRVRIT0RfMyk7CisgICAgICAgIC8vIGFzc2VydCB0aGF0IFN0cmluZyBhcmcgYW5kIENvbnRleHQgYXJnIHdlcmUgY29ycmVjdGx5IHNldCBmb3IgbWV0aG9kMworICAgICAgICBhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byBzZXQgZmlyc3QgYXJndW1lbnQiLCBtQXJnc1VzZWRbMF0sIEFSR19TVFJJTkdfMSk7CisgICAgICAgIGFzc2VydEVxdWFscygiRmFpbGVkIHRvIHNldCBzZWNvbmQgYXJndW1lbnQiLCBtQXJnc1VzZWRbMV0sIG1Db250ZXh0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZva2VNZXRob2RXaXRoQ29udGV4dEFuZFN0cmluZ0FyZ3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbUV4ZWN1dG9yLmludm9rZU1ldGhvZChNRVRIT0RfNCwgQVJHX1NUUklOR18xKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJGYWlsZWQgdG8gaW52b2tlIG1ldGhvZCBpbiB0aGlzIGNsYXNzIiwgbUludm9rZWQsIE1FVEhPRF80KTsKKyAgICAgICAgLy8gTGlrZSB0ZXN0SW52b2tlTWV0aG9kV2l0aFN0cmluZ0FuZENvbnRleHRBcmdzLCBidXQgZmxpcCB0aGUgYXJncyBmb3IgbWV0aG9kNAorICAgICAgICBhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byBzZXQgZmlyc3QgYXJndW1lbnQiLCBtQXJnc1VzZWRbMF0sIG1Db250ZXh0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJGYWlsZWQgdG8gc2V0IHNlY29uZCBhcmd1bWVudCIsIG1BcmdzVXNlZFsxXSwgQVJHX1NUUklOR18xKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZva2VNZXRob2RXaXRoU3RyaW5nQXJyYXlBcmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbUV4ZWN1dG9yLmludm9rZU1ldGhvZChNRVRIT0RfNSwgQVJHX1NUUklOR18xLCBBUkdfU1RSSU5HXzIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byBpbnZva2UgbWV0aG9kIGluIHRoaXMgY2xhc3MiLCBtSW52b2tlZCwgTUVUSE9EXzUpOworICAgICAgICAvLyBhc3NlcnQgYm90aCBTdHJpbmcgYXJndW1lbnRzIHdlcmUgY29ycmVjdGx5IHNldCBmb3IgbWV0aG9kNQorICAgICAgICBhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byBzZXQgZmlyc3QgYXJndW1lbnQiLCBtQXJnc1VzZWRbMF0sIEFSR19TVFJJTkdfMSk7CisgICAgICAgIGFzc2VydEVxdWFscygiRmFpbGVkIHRvIHNldCBzZWNvbmQgYXJndW1lbnQiLCBtQXJnc1VzZWRbMV0sIEFSR19TVFJJTkdfMik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlTWV0aG9kV2l0aEVtcHR5U3RyaW5nQXJyYXlBcmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbUV4ZWN1dG9yLmludm9rZU1ldGhvZChNRVRIT0RfNSk7CisgICAgICAgIGFzc2VydEVxdWFscygiRmFpbGVkIHRvIGludm9rZSBtZXRob2QgaW4gdGhpcyBjbGFzcyIsIG1JbnZva2VkLCBNRVRIT0RfNSk7CisgICAgICAgIC8vIGFzc2VydCBubyBTdHJpbmcgYXJndW1lbnRzIHdlcmUgc2V0IGZvciBtZXRob2Q1CisgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0bHkgc2V0IGFyZ3MiLCBtQXJnc1VzZWQubGVuZ3RoLCAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZva2VNZXRob2RXaXRoU3RyaW5nQW5kU3RyaW5nQXJyYXlBcmdzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1FeGVjdXRvci5pbnZva2VNZXRob2QoTUVUSE9EXzYsIEFSR19TVFJJTkdfMSwgQVJHX1NUUklOR18yKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJGYWlsZWQgdG8gaW52b2tlIG1ldGhvZCBpbiB0aGlzIGNsYXNzIiwgbUludm9rZWQsIE1FVEhPRF82KTsKKyAgICAgICAgLy8gYXNzZXJ0IGJvdGggU3RyaW5nIGFyZ3VtZW50cyB3ZXJlIGNvcnJlY3RseSBzZXQgZm9yIG1ldGhvZDYKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJGYWlsZWQgdG8gc2V0IGZpcnN0IGFyZ3VtZW50IiwgbUFyZ3NVc2VkWzBdLCBBUkdfU1RSSU5HXzEpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byBzZXQgc2Vjb25kIGFyZ3VtZW50IiwgbUFyZ3NVc2VkWzFdLCBBUkdfU1RSSU5HXzIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEludm9rZU1ldGhvZFdpdGhBbGxBcmdUeXBlcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtRXhlY3V0b3IuaW52b2tlTWV0aG9kKE1FVEhPRF83LCBBUkdfU1RSSU5HXzEsIEFSR19TVFJJTkdfMik7CisgICAgICAgIGFzc2VydEVxdWFscygiRmFpbGVkIHRvIGludm9rZSBtZXRob2QgaW4gdGhpcyBjbGFzcyIsIG1JbnZva2VkLCBNRVRIT0RfNyk7CisgICAgICAgIC8vIGFzc2VydCBhbGwgYXJndW1lbnRzIHdlcmUgY29ycmVjdGx5IHNldCBmb3IgbWV0aG9kNworICAgICAgICBhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byBzZXQgZmlyc3QgYXJndW1lbnQiLCBtQXJnc1VzZWRbMF0sIEFSR19TVFJJTkdfMSk7CisgICAgICAgIGFzc2VydEVxdWFscygiRmFpbGVkIHRvIHNldCBzZWNvbmQgYXJndW1lbnQiLCBtQXJnc1VzZWRbMV0sIG1Db250ZXh0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJGYWlsZWQgdG8gc2V0IHRoaXJkIGFyZ3VtZW50IiwgbUFyZ3NVc2VkWzJdLCBBUkdfU1RSSU5HXzIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEludm9rZU92ZXJsb2FkZWRNZXRob2RPbmVBcmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbUV4ZWN1dG9yLmludm9rZU1ldGhvZChNRVRIT0RfMSwgQVJHX1NUUklOR18xKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJGYWlsZWQgdG8gaW52b2tlIG1ldGhvZCBpbiB0aGlzIGNsYXNzIiwgbUludm9rZWQsIE1FVEhPRF8xKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJTZXQgd3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cyIsIG1BcmdzVXNlZC5sZW5ndGgsIDEpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byBzZXQgZmlyc3QgYXJndW1lbnQiLCBtQXJnc1VzZWRbMF0sIEFSR19TVFJJTkdfMSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlT3ZlcmxvYWRlZE1ldGhvZFR3b0FyZ3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbUV4ZWN1dG9yLmludm9rZU1ldGhvZChNRVRIT0RfMSwgQVJHX1NUUklOR18xLCBBUkdfU1RSSU5HXzIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byBpbnZva2UgbWV0aG9kIGluIHRoaXMgY2xhc3MiLCBtSW52b2tlZCwgTUVUSE9EXzEpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlNldCB3cm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIiwgbUFyZ3NVc2VkLmxlbmd0aCwgMik7CisgICAgICAgIGFzc2VydEVxdWFscygiRmFpbGVkIHRvIHNldCBmaXJzdCBhcmd1bWVudCIsIG1BcmdzVXNlZFswXSwgQVJHX1NUUklOR18xKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJGYWlsZWQgdG8gc2V0IHNlY29uZCBhcmd1bWVudCIsIG1BcmdzVXNlZFsxXSwgQVJHX1NUUklOR18yKTsKKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZCA9IFJ1bnRpbWVFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdEludm9rZU5vbkV4aXN0ZW50TWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1FeGVjdXRvci5pbnZva2VNZXRob2QoRkFLRV9NRVRIT0QsIEFSR19TVFJJTkdfMSwgQVJHX1NUUklOR18yKTsKKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZCA9IFJ1bnRpbWVFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdEludm9rZU1ldGhvZFRvb01hbnlBcmdzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1FeGVjdXRvci5pbnZva2VNZXRob2QoTUVUSE9EXzMsIEFSR19TVFJJTkdfMSwgQVJHX1NUUklOR18yKTsKKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZCA9IFJ1bnRpbWVFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdEludm9rZU1ldGhvZFRvb0Zld0FyZ3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbUV4ZWN1dG9yLmludm9rZU1ldGhvZChNRVRIT0RfMiwgQVJHX1NUUklOR18xKTsKKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZCA9IFJ1bnRpbWVFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdEludm9rZU1ldGhvZEluY29tcGF0aWJsZUFyZ3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbUV4ZWN1dG9yLmludm9rZU1ldGhvZChNRVRIT0RfOCwgQVJHX1NUUklOR18xKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFeGVjdXRlQ29uZGl0aW9uQ2hlY2tSZXR1cm5WYWx1ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRUcnVlKCJXcm9uZyByZXR1cm4gdmFsdWUiLAorICAgICAgICAgICAgICAgIG1FeGVjdXRvci5leGVjdXRlQ29uZGl0aW9uKE1FVEhPRF8yLCBBUkdfU1RSSU5HXzEsIEFSR19TVFJJTkdfMSkpOworICAgICAgICBhc3NlcnRGYWxzZSgiV3JvbmcgcmV0dXJuIHZhbHVlIiwKKyAgICAgICAgICAgICAgICBtRXhlY3V0b3IuZXhlY3V0ZUNvbmRpdGlvbihNRVRIT0RfMiwgQVJHX1NUUklOR18xLCBBUkdfU1RSSU5HXzIpKTsKKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZCA9IFJ1bnRpbWVFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdEV4ZWN1dGVJbnZhbGlkQ29uZGl0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1FeGVjdXRvci5leGVjdXRlQ29uZGl0aW9uKE1FVEhPRF8xKTsgLy8gbWV0aG9kMSBkb2VzIG5vdCByZXR1cm4gdHlwZSBib29sZWFuCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhlY3V0ZUFjdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtRXhlY3V0b3IuZXhlY3V0ZUFjdGlvbihNRVRIT0RfMiwgQVJHX1NUUklOR18xLCBBUkdfU1RSSU5HXzIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byBpbnZva2UgbWV0aG9kIGluIHRoaXMgY2xhc3MiLCBtSW52b2tlZCwgTUVUSE9EXzIpOworICAgICAgICAvLyBhc3NlcnQgYm90aCBTdHJpbmcgYXJndW1lbnRzIHdlcmUgY29ycmVjdGx5IHNldCBmb3IgbWV0aG9kMgorICAgICAgICBhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byBzZXQgZmlyc3QgYXJndW1lbnQiLCBtQXJnc1VzZWRbMF0sIEFSR19TVFJJTkdfMSk7CisgICAgICAgIGFzc2VydEVxdWFscygiRmFpbGVkIHRvIHNldCBzZWNvbmQgYXJndW1lbnQiLCBtQXJnc1VzZWRbMV0sIEFSR19TVFJJTkdfMik7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBSdW50aW1lRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RFeGVjdXRlQWN0aW9uVGhyb3dFeGNlcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbUV4ZWN1dG9yLmV4ZWN1dGVBY3Rpb24oTUVUSE9EXzkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEV4ZWN1dGVBY3Rpb25WaW9sYXRlQXNzdW1wdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUV4ZWN1dG9yLmV4ZWN1dGVBY3Rpb24oTUVUSE9EXzEwKTsKKyAgICAgICAgICAgIC8vIEpVbml0NCBkb2Vzbid0IHN1cHBvcnQgZXhwZWN0aW5nIEFzc3VtcHRpb25WaW9sYXRlZEV4Y2VwdGlvbiB3aXRoICJleHBlY3RlZCIKKyAgICAgICAgICAgIC8vIGF0dHJpYnV0ZSBvbiBAVGVzdCBhbm5vdGF0aW9uLCBzbyB0ZXN0IHVzaW5nIEFzc2VydC5mYWlsKCkKKyAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIGFzc3VtcHRpb24gZmFpbHVyZSIpOworICAgICAgICB9IGNhdGNoIChBc3N1bXB0aW9uVmlvbGF0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1ldGhvZDEoKSB7CisgICAgICAgIG1JbnZva2VkID0gTUVUSE9EXzE7CisgICAgfQorCisgICAgLy8gb3ZlcmxvYWRlZCBtZXRob2Qgd2l0aCBvbmUgYXJnCisgICAgcHVibGljIHZvaWQgbWV0aG9kMShTdHJpbmcgYXJnMSkgeworICAgICAgICBtSW52b2tlZCA9IE1FVEhPRF8xOworICAgICAgICBtQXJnc1VzZWQgPSBuZXcgT2JqZWN0W117YXJnMX07CisgICAgfQorCisgICAgLy8gb3ZlcmxvYWRlZCBtZXRob2Qgd2l0aCB0d28gYXJncworICAgIHB1YmxpYyB2b2lkIG1ldGhvZDEoU3RyaW5nIGFyZzEsIFN0cmluZyBhcmcyKSB7CisgICAgICAgIG1JbnZva2VkID0gTUVUSE9EXzE7CisgICAgICAgIG1BcmdzVXNlZCA9IG5ldyBPYmplY3RbXXthcmcxLCBhcmcyfTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBtZXRob2QyKFN0cmluZyBhcmcxLCBTdHJpbmcgYXJnMikgeworICAgICAgICBtSW52b2tlZCA9IE1FVEhPRF8yOworICAgICAgICBtQXJnc1VzZWQgPSBuZXcgT2JqZWN0W117YXJnMSwgYXJnMn07CisgICAgICAgIHJldHVybiBhcmcxLmVxdWFscyhhcmcyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtZXRob2QzKFN0cmluZyBhcmcxLCBDb250ZXh0IGFyZzIpIHsKKyAgICAgICAgbUludm9rZWQgPSBNRVRIT0RfMzsKKyAgICAgICAgbUFyZ3NVc2VkID0gbmV3IE9iamVjdFtde2FyZzEsIGFyZzJ9OworICAgIH0KKworICAgIC8vIFNhbWUgYXMgbWV0aG9kMywgYnV0IGZsaXBwZWQgYXJncworICAgIHB1YmxpYyB2b2lkIG1ldGhvZDQoQ29udGV4dCBhcmcxLCBTdHJpbmcgYXJnMikgeworICAgICAgICBtSW52b2tlZCA9IE1FVEhPRF80OworICAgICAgICBtQXJnc1VzZWQgPSBuZXcgT2JqZWN0W117YXJnMSwgYXJnMn07CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbWV0aG9kNShTdHJpbmcuLi4gYXJncykgeworICAgICAgICBtSW52b2tlZCA9IE1FVEhPRF81OworICAgICAgICBtQXJnc1VzZWQgPSBhcmdzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1ldGhvZDYoU3RyaW5nIGFyZzEsIFN0cmluZy4uLiBtb3JlQXJncykgeworICAgICAgICBtSW52b2tlZCA9IE1FVEhPRF82OworICAgICAgICBMaXN0PFN0cmluZz4gYWxsQXJncyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBhbGxBcmdzLmFkZChhcmcxKTsKKyAgICAgICAgYWxsQXJncy5hZGRBbGwoQXJyYXlzLmFzTGlzdChtb3JlQXJncykpOworICAgICAgICBtQXJnc1VzZWQgPSBhbGxBcmdzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbWV0aG9kNyhTdHJpbmcgYXJnMSwgQ29udGV4dCBhcmcyLCBTdHJpbmcuLi4gbW9yZUFyZ3MpIHsKKyAgICAgICAgbUludm9rZWQgPSBNRVRIT0RfNzsKKyAgICAgICAgTGlzdDxPYmplY3Q+IGFsbEFyZ3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgYWxsQXJncy5hZGQoYXJnMSk7CisgICAgICAgIGFsbEFyZ3MuYWRkKGFyZzIpOworICAgICAgICBhbGxBcmdzLmFkZEFsbChBcnJheXMuYXNMaXN0KG1vcmVBcmdzKSk7CisgICAgICAgIG1BcmdzVXNlZCA9IGFsbEFyZ3MudG9BcnJheShuZXcgT2JqZWN0WzBdKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtZXRob2Q4KFN0cmluZyBhcmcxLCBJbnRlZ2VyIGFyZzIpIHsKKyAgICAgICAgLy8gVGhpcyBtZXRob2Qgc2hvdWxkIG5ldmVyIGJlIHN1Y2Nlc3NmdWxseSBpbnZva2VkLCBzaW5jZSBJbnRlZ2VyIHBhcmFtZXRlciB0eXBlcyBhcmUKKyAgICAgICAgLy8gdW5zdXBwb3J0ZWQgZm9yIHRoZSBCdXNpbmVzc0xvZ2ljIHNlcnZpY2UKKyAgICB9CisKKyAgICAvLyB0aHJvdyBBc3NlcnRpb25GYWlsZWRFcnJvcgorICAgIEBJZ25vcmUKKyAgICBwdWJsaWMgdm9pZCBtZXRob2Q5KCkgdGhyb3dzIEFzc2VydGlvbkZhaWxlZEVycm9yIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShmYWxzZSk7CisgICAgfQorCisgICAgLy8gdGhyb3cgQXNzdW1wdGlvblZpb2xhdGVkRXhjZXB0aW9uCisgICAgcHVibGljIHZvaWQgbWV0aG9kMTAoKSB0aHJvd3MgQXNzdW1wdGlvblZpb2xhdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzdW1lVHJ1ZShmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBPdGhlckNsYXNzIHsKKworICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBvdGhlckludm9rZWQgPSBudWxsOworCisgICAgICAgIHB1YmxpYyB2b2lkIG1ldGhvZDEoKSB7CisgICAgICAgICAgICBvdGhlckludm9rZWQgPSBPVEhFUl9NRVRIT0RfMTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsLWF4dC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9CdXNpbmVzc0xvZ2ljVGVzdENhc2VUZXN0LmphdmEgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQnVzaW5lc3NMb2dpY1Rlc3RDYXNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNzc5ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQnVzaW5lc3NMb2dpY1Rlc3RDYXNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWw7CisKK2ltcG9ydCBzdGF0aWMganVuaXQuZnJhbWV3b3JrLkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIGp1bml0LmZyYW1ld29yay5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogVGVzdHMgZm9yIHtAbGluZSBCdXNpbmVzc0xvZ2ljVGVzdENhc2V9LgorICovCitAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIEJ1c2luZXNzTG9naWNUZXN0Q2FzZVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV8xID0gImtleTEiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfMiA9ICJrZXkyIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfMSA9ICJ2YWx1ZTEiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV8yID0gInZhbHVlMiI7CisKKyAgICBEdW1teVRlc3QgbUR1bW15VGVzdDsKKyAgICBEdW1teVRlc3QgbU90aGVyRHVtbXlUZXN0OworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBtRHVtbXlUZXN0ID0gbmV3IER1bW15VGVzdCgpOworICAgICAgICBtT3RoZXJEdW1teVRlc3QgPSBuZXcgRHVtbXlUZXN0KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFwUHV0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1EdW1teVRlc3QubWFwUHV0KCJpbnN0YW5jZU1hcCIsIEtFWV8xLCBWQUxVRV8xKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgibWFwUHV0IGZhaWxlZCBmb3IgaW5zdGFuY2VNYXAiLCBtRHVtbXlUZXN0Lmluc3RhbmNlTWFwLmNvbnRhaW5zS2V5KEtFWV8xKSk7CisgICAgICAgIGFzc2VydEVxdWFscygibWFwUHV0IGZhaWxlZCBmb3IgaW5zdGFuY2VNYXAiLCBtRHVtbXlUZXN0Lmluc3RhbmNlTWFwLmdldChLRVlfMSksIFZBTFVFXzEpOworICAgICAgICBhc3NlcnRUcnVlKCJtYXBQdXQgYWZmZWN0ZWQgd3JvbmcgaW5zdGFuY2UiLCBtT3RoZXJEdW1teVRlc3QuaW5zdGFuY2VNYXAuaXNFbXB0eSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdGF0aWNNYXBQdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbUR1bW15VGVzdC5tYXBQdXQoInN0YXRpY01hcCIsIEtFWV8yLCBWQUxVRV8yKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgibWFwUHV0IGZhaWxlZCBmb3Igc3RhdGljTWFwIiwgbUR1bW15VGVzdC5zdGF0aWNNYXAuY29udGFpbnNLZXkoS0VZXzIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJtYXBQdXQgZmFpbGVkIGZvciBzdGF0aWNNYXAiLCBtRHVtbXlUZXN0LnN0YXRpY01hcC5nZXQoS0VZXzIpLCBWQUxVRV8yKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgibWFwUHV0IG9uIHN0YXRpYyBtYXAgc2hvdWxkIGFmZmVjdCBhbGwgaW5zdGFuY2VzIiwKKyAgICAgICAgICAgICAgICBtT3RoZXJEdW1teVRlc3Quc3RhdGljTWFwLmNvbnRhaW5zS2V5KEtFWV8yKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEdW1teVRlc3QgZXh0ZW5kcyBCdXNpbmVzc0xvZ2ljVGVzdENhc2UgeworICAgICAgICBwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBpbnN0YW5jZU1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IHN0YXRpY01hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC1heHQvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvRGV2aWNlUmVwb3J0VGVzdC5qYXZhIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0RldmljZVJlcG9ydFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjQyYjMyCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwtYXh0L3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0RldmljZVJlcG9ydFRlc3QuamF2YQpAQCAtMCwwICsxLDE1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOworaW1wb3J0IGphdmEubGFuZy5TdHJpbmdCdWlsZGVyOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmpzb24uSlNPTk9iamVjdDsKKworLyoqCisgKiBUZXN0cyBmb3Ige0BsaW5lIERldmljZVJlcG9ydExvZ30uCisgKi8KK3B1YmxpYyBjbGFzcyBEZXZpY2VSZXBvcnRUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgLyoqCisgICAgICogQSBzdHViIG9mIHtAbGluayBJbnN0cnVtZW50YXRpb259CisgICAgICovCisgICAgcHVibGljIGNsYXNzIFRlc3RJbnN0cnVtZW50YXRpb24gZXh0ZW5kcyBJbnN0cnVtZW50YXRpb24geworCisgICAgICAgIHByaXZhdGUgaW50IG1SZXN1bHRDb2RlID0gLTE7CisgICAgICAgIHByaXZhdGUgQnVuZGxlIG1SZXN1bHRzID0gbnVsbDsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2VuZFN0YXR1cyhpbnQgcmVzdWx0Q29kZSwgQnVuZGxlIHJlc3VsdHMpIHsKKyAgICAgICAgICAgIG1SZXN1bHRDb2RlID0gcmVzdWx0Q29kZTsKKyAgICAgICAgICAgIG1SZXN1bHRzID0gcmVzdWx0czsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVNVTFRfQ09ERSA9IDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9LRVkgPSAiQ09NUEFUSUJJTElUWV9URVNUX1JFU1VMVCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfTUVTU0FHRV8xID0gIkZvbyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIFRFU1RfVkFMVUVfMSA9IDM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzdWx0VHlwZSBURVNUX1RZUEVfMSA9IFJlc3VsdFR5cGUuSElHSEVSX0JFVFRFUjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXN1bHRVbml0IFRFU1RfVU5JVF8xID0gUmVzdWx0VW5pdC5TQ09SRTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9NRVNTQUdFXzIgPSAiQmFyIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUgVEVTVF9WQUxVRV8yID0gNTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXN1bHRUeXBlIFRFU1RfVFlQRV8yID0gUmVzdWx0VHlwZS5MT1dFUl9CRVRURVI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzdWx0VW5pdCBURVNUX1VOSVRfMiA9IFJlc3VsdFVuaXQuQ09VTlQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfTUVTU0FHRV8zID0gIlNhbXBsZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIFRFU1RfVkFMVUVfMyA9IDc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzdWx0VHlwZSBURVNUX1RZUEVfMyA9IFJlc3VsdFR5cGUuTE9XRVJfQkVUVEVSOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFJlc3VsdFVuaXQgVEVTVF9VTklUXzMgPSBSZXN1bHRVbml0LkNPVU5UOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX01FU1NBR0VfNCA9ICJNZXNzYWdlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUgVEVTVF9WQUxVRV80ID0gOTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXN1bHRUeXBlIFRFU1RfVFlQRV80ID0gUmVzdWx0VHlwZS5MT1dFUl9CRVRURVI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzdWx0VW5pdCBURVNUX1VOSVRfNCA9IFJlc3VsdFVuaXQuQ09VTlQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUE9SVF9OQU1FXzEgPSAiVGVzdFJlcG9ydDEiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBPUlRfTkFNRV8yID0gIlRlc3RSZXBvcnQyIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSRUFNX05BTUVfMSA9ICJTYW1wbGVTdHJlYW0xIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSRUFNX05BTUVfMiA9ICJTYW1wbGVTdHJlYW0yIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSRUFNX05BTUVfMyA9ICJTYW1wbGVTdHJlYW0zIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSRUFNX05BTUVfNCA9ICJTYW1wbGVTdHJlYW00IjsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJtaXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRGV2aWNlUmVwb3J0TG9nIGxvZyA9IG5ldyBEZXZpY2VSZXBvcnRMb2coUkVQT1JUX05BTUVfMSwgU1RSRUFNX05BTUVfMSk7CisgICAgICAgIGxvZy5hZGRWYWx1ZShURVNUX01FU1NBR0VfMSwgVEVTVF9WQUxVRV8xLCBURVNUX1RZUEVfMSwgVEVTVF9VTklUXzEpOworICAgICAgICBsb2cuc2V0U3VtbWFyeShURVNUX01FU1NBR0VfMiwgVEVTVF9WQUxVRV8yLCBURVNUX1RZUEVfMiwgVEVTVF9VTklUXzIpOworICAgICAgICBUZXN0SW5zdHJ1bWVudGF0aW9uIGluc3QgPSBuZXcgVGVzdEluc3RydW1lbnRhdGlvbigpOworICAgICAgICBsb2cuc3VibWl0KGluc3QpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCByZXN1bHQgY29kZSIsIFJFU1VMVF9DT0RFLCBpbnN0Lm1SZXN1bHRDb2RlKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiQnVuZGxlIG1pc3NpbmciLCBpbnN0Lm1SZXN1bHRzKTsKKyAgICAgICAgU3RyaW5nIG1ldHJpY3MgPSBpbnN0Lm1SZXN1bHRzLmdldFN0cmluZyhSRVNVTFRfS0VZKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiTWV0cmljcyBtaXNzaW5nIiwgbWV0cmljcyk7CisgICAgICAgIFJlcG9ydExvZyByZXN1bHQgPSBSZXBvcnRMb2cucGFyc2UobWV0cmljcyk7CisgICAgICAgIGFzc2VydE5vdE51bGwoIk1ldHJpY3MgY291bGQgbm90IGJlIGRlY29kZWQiLCByZXN1bHQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydFRydWUoIkV4dGVybmFsIHN0b3JhZ2UgaXMgbm90IG1vdW50ZWQiLAorICAgICAgICAgICAgICAgIEVudmlyb25tZW50LmdldEV4dGVybmFsU3RvcmFnZVN0YXRlKCkuZXF1YWxzKEVudmlyb25tZW50Lk1FRElBX01PVU5URUQpKTsKKyAgICAgICAgZmluYWwgRmlsZSBkaXIgPSBuZXcgRmlsZShFbnZpcm9ubWVudC5nZXRFeHRlcm5hbFN0b3JhZ2VEaXJlY3RvcnkoKSwgInJlcG9ydC1sb2ctZmlsZXMiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiUmVwb3J0IExvZyBkaXJlY3RvcnkgbWlzc2luZyIsIGRpci5pc0RpcmVjdG9yeSgpIHx8IGRpci5ta2RpcnMoKSk7CisKKyAgICAgICAgLy8gUmVtb3ZlIGZpbGVzIGZyb20gZWFybGllciBwb3NzaWJsZSBydW5zLgorICAgICAgICBGaWxlW10gZmlsZXMgPSBkaXIubGlzdEZpbGVzKCk7CisgICAgICAgIGZvciAoRmlsZSBmaWxlIDogZmlsZXMpIHsKKyAgICAgICAgICAgIGZpbGUuZGVsZXRlKCk7CisgICAgICAgIH0KKworICAgICAgICBUZXN0SW5zdHJ1bWVudGF0aW9uIGluc3QgPSBuZXcgVGVzdEluc3RydW1lbnRhdGlvbigpOworCisgICAgICAgIERldmljZVJlcG9ydExvZyBsb2cxID0gbmV3IERldmljZVJlcG9ydExvZyhSRVBPUlRfTkFNRV8xLCBTVFJFQU1fTkFNRV8xKTsKKyAgICAgICAgbG9nMS5hZGRWYWx1ZShURVNUX01FU1NBR0VfMSwgVEVTVF9WQUxVRV8xLCBURVNUX1RZUEVfMSwgVEVTVF9VTklUXzEpOworICAgICAgICBsb2cxLnNldFN1bW1hcnkoVEVTVF9NRVNTQUdFXzEsIFRFU1RfVkFMVUVfMSwgVEVTVF9UWVBFXzEsIFRFU1RfVU5JVF8xKTsKKyAgICAgICAgbG9nMS5zdWJtaXQoaW5zdCk7CisKKyAgICAgICAgRGV2aWNlUmVwb3J0TG9nIGxvZzIgPSBuZXcgRGV2aWNlUmVwb3J0TG9nKFJFUE9SVF9OQU1FXzEsIFNUUkVBTV9OQU1FXzIpOworICAgICAgICBsb2cyLmFkZFZhbHVlKFRFU1RfTUVTU0FHRV8yLCBURVNUX1ZBTFVFXzIsIFRFU1RfVFlQRV8yLCBURVNUX1VOSVRfMik7CisgICAgICAgIGxvZzIuc2V0U3VtbWFyeShURVNUX01FU1NBR0VfMiwgVEVTVF9WQUxVRV8yLCBURVNUX1RZUEVfMiwgVEVTVF9VTklUXzIpOworICAgICAgICBsb2cyLnN1Ym1pdChpbnN0KTsKKworICAgICAgICBEZXZpY2VSZXBvcnRMb2cgbG9nMyA9IG5ldyBEZXZpY2VSZXBvcnRMb2coUkVQT1JUX05BTUVfMiwgU1RSRUFNX05BTUVfMyk7CisgICAgICAgIGxvZzMuYWRkVmFsdWUoVEVTVF9NRVNTQUdFXzMsIFRFU1RfVkFMVUVfMywgVEVTVF9UWVBFXzMsIFRFU1RfVU5JVF8zKTsKKyAgICAgICAgbG9nMy5zZXRTdW1tYXJ5KFRFU1RfTUVTU0FHRV8zLCBURVNUX1ZBTFVFXzMsIFRFU1RfVFlQRV8zLCBURVNUX1VOSVRfMyk7CisgICAgICAgIGxvZzMuc3VibWl0KGluc3QpOworCisgICAgICAgIERldmljZVJlcG9ydExvZyBsb2c0ID0gbmV3IERldmljZVJlcG9ydExvZyhSRVBPUlRfTkFNRV8yLCBTVFJFQU1fTkFNRV80KTsKKyAgICAgICAgbG9nNC5hZGRWYWx1ZShURVNUX01FU1NBR0VfNCwgVEVTVF9WQUxVRV80LCBURVNUX1RZUEVfNCwgVEVTVF9VTklUXzQpOworICAgICAgICBsb2c0LnNldFN1bW1hcnkoVEVTVF9NRVNTQUdFXzQsIFRFU1RfVkFMVUVfNCwgVEVTVF9UWVBFXzQsIFRFU1RfVU5JVF80KTsKKyAgICAgICAgbG9nNC5zdWJtaXQoaW5zdCk7CisKKyAgICAgICAgRmlsZSBqc29uRmlsZTEgPSBuZXcgRmlsZShkaXIsIFJFUE9SVF9OQU1FXzEgKyAiLnJlcG9ydGxvZy5qc29uIik7CisgICAgICAgIEZpbGUganNvbkZpbGUyID0gbmV3IEZpbGUoZGlyLCBSRVBPUlRfTkFNRV8yICsgIi5yZXBvcnRsb2cuanNvbiIpOworICAgICAgICBhc3NlcnRUcnVlKCJSZXBvcnQgTG9nIG1pc3NpbmciLCBqc29uRmlsZTEuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnRUcnVlKCJSZXBvcnQgTG9nIG1pc3NpbmciLCBqc29uRmlsZTIuZXhpc3RzKCkpOworCisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGpzb25SZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoanNvbkZpbGUxKSk7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgbWV0cmljc0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBTdHJpbmcgbGluZTsKKyAgICAgICAgd2hpbGUgKChsaW5lID0ganNvblJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7CisgICAgICAgICAgICBtZXRyaWNzQnVpbGRlci5hcHBlbmQobGluZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIG1ldHJpY3MgPSBtZXRyaWNzQnVpbGRlci50b1N0cmluZygpLnRyaW0oKTsKKyAgICAgICAgSlNPTk9iamVjdCBqc29uT2JqZWN0ID0gbmV3IEpTT05PYmplY3QobWV0cmljcyk7CisgICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCBtZXRyaWNzIiwKKyAgICAgICAgICAgICAgICBqc29uT2JqZWN0LmdldEpTT05PYmplY3QoU1RSRUFNX05BTUVfMSkuZ2V0RG91YmxlKFRFU1RfTUVTU0FHRV8xKSA9PSBURVNUX1ZBTFVFXzEpOworICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgbWV0cmljcyIsCisgICAgICAgICAgICAgICAganNvbk9iamVjdC5nZXRKU09OT2JqZWN0KFNUUkVBTV9OQU1FXzIpLmdldERvdWJsZShURVNUX01FU1NBR0VfMikgPT0gVEVTVF9WQUxVRV8yKTsKKworICAgICAgICBqc29uUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGpzb25GaWxlMikpOworICAgICAgICBtZXRyaWNzQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIHdoaWxlICgobGluZSA9IGpzb25SZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgbWV0cmljc0J1aWxkZXIuYXBwZW5kKGxpbmUpOworICAgICAgICB9CisgICAgICAgIG1ldHJpY3MgPSBtZXRyaWNzQnVpbGRlci50b1N0cmluZygpLnRyaW0oKTsKKyAgICAgICAganNvbk9iamVjdCA9IG5ldyBKU09OT2JqZWN0KG1ldHJpY3MpOworICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgbWV0cmljcyIsCisgICAgICAgICAgICAgICAganNvbk9iamVjdC5nZXRKU09OT2JqZWN0KFNUUkVBTV9OQU1FXzMpLmdldERvdWJsZShURVNUX01FU1NBR0VfMykgPT0gVEVTVF9WQUxVRV8zKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IG1ldHJpY3MiLAorICAgICAgICAgICAgICAgIGpzb25PYmplY3QuZ2V0SlNPTk9iamVjdChTVFJFQU1fTkFNRV80KS5nZXREb3VibGUoVEVTVF9NRVNTQUdFXzQpID09IFRFU1RfVkFMVUVfNCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2RldmljZS1zaWRlL3V0aWwvQW5kcm9pZC5tayBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsL0FuZHJvaWQubWsKaW5kZXggMjZhMzdlYy4uOTMxYTQ5MyAxMDA2NDQKLS0tIGEvY29tbW9uL2RldmljZS1zaWRlL3V0aWwvQW5kcm9pZC5taworKysgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC9BbmRyb2lkLm1rCkBAIC0yNCwxNSArMjQsMTcgQEAKICAgICBhbmRyb2lkLXN1cHBvcnQtdGVzdCBcCiAgICAgdWItdWlhdXRvbWF0b3IgXAogICAgIG1vY2tpdG8tdGFyZ2V0LW1pbnVzLWp1bml0NCBcCi0gICAgbGVnYWN5LWFuZHJvaWQtdGVzdAorICAgIGFuZHJvaWR4LmFubm90YXRpb25fYW5ub3RhdGlvbgogCi1MT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBcCisgICAgYW5kcm9pZC50ZXN0LnJ1bm5lci5zdHVicyBcCisgICAgYW5kcm9pZC50ZXN0LmJhc2Uuc3R1YnMKIAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIAogTE9DQUxfTU9EVUxFIDo9IGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwKIAotTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorTE9DQUxfU0RLX1ZFUlNJT04gOj0gdGVzdF9jdXJyZW50CiAKIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfSkFWQV9MSUJSQVJZKQogCmRpZmYgLS1naXQgYS9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC9qbmkvQW5kcm9pZC5icCBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsL2puaS9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNjIxNGEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC9qbmkvQW5kcm9pZC5icApAQCAtMCwwICsxLDM4IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjdHNfam5pIiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkN0c0puaU9uTG9hZC5jcHAiLAorICAgICAgICAiYW5kcm9pZF9jdHNfRmlsZVV0aWxzLmNwcCIsCisgICAgICAgICJhbmRyb2lkX2N0c19DcHVGZWF0dXJlcy5jcHAiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibmF0aXZlaGVscGVyX2NvbXBhdF9saWJjKysiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYmRsIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsiY3B1ZmVhdHVyZXMiXSwKKyAgICBzZGtfdmVyc2lvbjogIjE5IiwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV25vLXVudXNlZC1wYXJhbWV0ZXIiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC9qbmkvQW5kcm9pZC5tayBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsL2puaS9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjI3ZDI0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsL2puaS9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEUgOj0gbGliY3RzX2puaQotCi0jIERvbid0IGluY2x1ZGUgdGhpcyBwYWNrYWdlIGluIGFueSBjb25maWd1cmF0aW9uIGJ5IGRlZmF1bHQuCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9TUkNfRklMRVMgOj0gXAotCQlDdHNKbmlPbkxvYWQuY3BwIFwKLQkJYW5kcm9pZF9jdHNfRmlsZVV0aWxzLmNwcCBcCi0JCWFuZHJvaWRfY3RzX0NwdUZlYXR1cmVzLmNwcCBcCi0KLUxPQ0FMX0NfSU5DTFVERVMgOj0gJChKTklfSF9JTkNMVURFKQotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYm5hdGl2ZWhlbHBlcl9jb21wYXRfbGliYysrIGxpYmxvZyBsaWJkbAotTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBjcHVmZWF0dXJlcwotTE9DQUxfU0RLX1ZFUlNJT04gOj0gMTkKLQotTE9DQUxfQ0ZMQUdTIDo9IC1Xbm8tdW51c2VkLXBhcmFtZXRlcgotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9BbVV0aWxzLmphdmEgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9BbVV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNlMTc4YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0FtVXRpbHMuamF2YQpAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKKworcHVibGljIGNsYXNzIEFtVXRpbHMgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQ3RzQW1VdGlscyI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFVNUFNZU19BQ1RJVklUWV9QUk9DRVNTRVMgPSAiZHVtcHN5cyBhY3Rpdml0eSAtLXByb3RvIHByb2Nlc3NlcyI7CisKKyAgICBwcml2YXRlIEFtVXRpbHMoKSB7CisgICAgfQorCisgICAgLyoqIFJ1biAiYWRiIHNoZWxsIGFtIG1ha2UtdWlkLWlkbGUgUEFDS0FHRSIgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcnVuTWFrZVVpZElkbGUoU3RyaW5nIHBhY2thZ2VOYW1lKSB7CisgICAgICAgIFN5c3RlbVV0aWwucnVuU2hlbGxDb21tYW5kRm9yTm9PdXRwdXQoImFtIG1ha2UtdWlkLWlkbGUgIiArIHBhY2thZ2VOYW1lKTsKKyAgICB9CisKKyAgICAvKiogUnVuICJhZGIgc2hlbGwgYW0ga2lsbCBQQUNLQUdFIiAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBydW5LaWxsKFN0cmluZyBwYWNrYWdlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJ1bktpbGwocGFja2FnZU5hbWUsIGZhbHNlIC8qIHdhaXQgKi8pOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBydW5LaWxsKFN0cmluZyBwYWNrYWdlTmFtZSwgYm9vbGVhbiB3YWl0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3lzdGVtVXRpbC5ydW5TaGVsbENvbW1hbmRGb3JOb091dHB1dCgiYW0ga2lsbCAtLXVzZXIgY3VyICIgKyBwYWNrYWdlTmFtZSk7CisKKyAgICAgICAgaWYgKCF3YWl0KSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBUZXN0VXRpbHMud2FpdFVudGlsKCJwYWNrYWdlIHByb2Nlc3Mgd2FzIG5vdCBraWxsZWQ6IiArIHBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICgpIC0+ICFpc1Byb2Nlc3NSdW5uaW5nKHBhY2thZ2VOYW1lKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1Byb2Nlc3NSdW5uaW5nKFN0cmluZyBwYWNrYWdlTmFtZSkgeworICAgICAgICBmaW5hbCBTdHJpbmcgb3V0cHV0ID0gU3lzdGVtVXRpbC5ydW5TaGVsbENvbW1hbmQoInBzIC1BIC1vIE5BTUUiKTsKKyAgICAgICAgU3RyaW5nW10gcGFja2FnZXMgPSBvdXRwdXQuc3BsaXQoIlxcbiIpOworICAgICAgICBmb3IgKGludCBpID0gcGFja2FnZXMubGVuZ3RoIC0xOyBpID49MDsgLS1pKSB7CisgICAgICAgICAgICBpZiAocGFja2FnZXNbaV0uZXF1YWxzKHBhY2thZ2VOYW1lKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKiogUnVuICJhZGIgc2hlbGwgYW0gc2V0LXN0YW5kYnktYnVja2V0IiAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTdGFuZGJ5QnVja2V0KFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHZhbHVlKSB7CisgICAgICAgIFN5c3RlbVV0aWwucnVuU2hlbGxDb21tYW5kRm9yTm9PdXRwdXQoImFtIHNldC1zdGFuZGJ5LWJ1Y2tldCAiICsgcGFja2FnZU5hbWUKKyAgICAgICAgICAgICAgICArICIgIiArIHZhbHVlKTsKKyAgICB9CisKKyAgICAvKiogV2FpdCB1bnRpbCBhbGwgYnJvYWQgcXVldWVzIGFyZSBpZGxlLiAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3YWl0Rm9yQnJvYWRjYXN0SWRsZSgpIHsKKyAgICAgICAgU3lzdGVtVXRpbC5ydW5Db21tYW5kQW5kUHJpbnRPbkxvZ2NhdChUQUcsICJhbSB3YWl0LWZvci1icm9hZGNhc3QtaWRsZSIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0FwaUxldmVsVXRpbC5qYXZhIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQXBpTGV2ZWxVdGlsLmphdmEKaW5kZXggYzMzOTRiNy4uOTQzZWJjNyAxMDA2NDQKLS0tIGEvY29tbW9uL2RldmljZS1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQXBpTGV2ZWxVdGlsLmphdmEKKysrIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQXBpTGV2ZWxVdGlsLmphdmEKQEAgLTQ2LDcgKzQ2LDcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBdExlYXN0KFN0cmluZyB2ZXJzaW9uKSB7Ci0gICAgICAgIHJldHVybiBCdWlsZC5WRVJTSU9OLlNES19JTlQgPiByZXNvbHZlVmVyc2lvblN0cmluZyh2ZXJzaW9uKTsKKyAgICAgICAgcmV0dXJuIEJ1aWxkLlZFUlNJT04uU0RLX0lOVCA+PSByZXNvbHZlVmVyc2lvblN0cmluZyh2ZXJzaW9uKTsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBdE1vc3QoaW50IHZlcnNpb24pIHsKQEAgLTc0LDE3ICs3NCwyMiBAQAogICAgIH0KIAogICAgIHByb3RlY3RlZCBzdGF0aWMgaW50IHJlc29sdmVWZXJzaW9uU3RyaW5nKFN0cmluZyB2ZXJzaW9uU3RyaW5nKSB7CisgICAgICAgIC8vIEF0dGVtcHQgMTogUGFyc2UgdmVyc2lvbiBzdHJpbmcgYXMgYW4gaW50ZWdlciwgZS5nLiAiMjMiIGZvciBNCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gSW50ZWdlci5wYXJzZUludCh2ZXJzaW9uU3RyaW5nKTsgLy8gZS5nLiAiMjQiIGZvciBNCi0gICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBGaWVsZCB2ZXJzaW9uRmllbGQgPSBCdWlsZC5WRVJTSU9OX0NPREVTLmNsYXNzLmdldEZpZWxkKAotICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvblN0cmluZy50b1VwcGVyQ2FzZSgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdmVyc2lvbkZpZWxkLmdldEludChudWxsKTsgLy8gbm8gaW5zdGFuY2UgZm9yIFZFUlNJT05fQ09ERVMsIHVzZSBudWxsCi0gICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHwgTm9TdWNoRmllbGRFeGNlcHRpb24gZTIpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIkZhaWxlZCB0byBwYXJzZSB2ZXJzaW9uIHN0cmluZyAlcyIsIHZlcnNpb25TdHJpbmcpLCBlMik7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gSW50ZWdlci5wYXJzZUludCh2ZXJzaW9uU3RyaW5nKTsKKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsgLyogaWdub3JlIGZvciBhbHRlcm5hdGUgYXBwcm9hY2hlcyBiZWxvdyAqLyB9CisgICAgICAgIC8vIEF0dGVtcHQgMjogRmluZCBtYXRjaGluZyBmaWVsZCBpbiBWZXJzaW9uQ29kZXMgdXRpbGl0eSBjbGFzcywgcmV0dXJuIHZhbHVlCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBGaWVsZCB2ZXJzaW9uRmllbGQgPSBWZXJzaW9uQ29kZXMuY2xhc3MuZ2V0RmllbGQodmVyc2lvblN0cmluZy50b1VwcGVyQ2FzZSgpKTsKKyAgICAgICAgICAgIHJldHVybiB2ZXJzaW9uRmllbGQuZ2V0SW50KG51bGwpOyAvLyBubyBpbnN0YW5jZSBmb3IgVkVSU0lPTl9DT0RFUywgdXNlIG51bGwKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB8IE5vU3VjaEZpZWxkRXhjZXB0aW9uIGUpIHsgLyogaWdub3JlICovIH0KKyAgICAgICAgLy8gQXR0ZW1wdCAzOiBGaW5kIGZpZWxkIHdpdGhpbiBhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT05fQ09ERVMKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEZpZWxkIHZlcnNpb25GaWVsZCA9IEJ1aWxkLlZFUlNJT05fQ09ERVMuY2xhc3MuZ2V0RmllbGQodmVyc2lvblN0cmluZy50b1VwcGVyQ2FzZSgpKTsKKyAgICAgICAgICAgIHJldHVybiB2ZXJzaW9uRmllbGQuZ2V0SW50KG51bGwpOyAvLyBubyBpbnN0YW5jZSBmb3IgVkVSU0lPTl9DT0RFUywgdXNlIG51bGwKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB8IE5vU3VjaEZpZWxkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJGYWlsZWQgdG8gcGFyc2UgdmVyc2lvbiBzdHJpbmcgJXMiLCB2ZXJzaW9uU3RyaW5nKSwgZSk7CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9BcHBPcHNVdGlscy5qYXZhIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQXBwT3BzVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzlkNmRhCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQXBwT3BzVXRpbHMuamF2YQpAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWw7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuQXBwT3BzTWFuYWdlci5NT0RFX0FMTE9XRUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLkFwcE9wc01hbmFnZXIuTU9ERV9ERUZBVUxUOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5BcHBPcHNNYW5hZ2VyLk1PREVfRVJST1JFRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuQXBwT3BzTWFuYWdlci5NT0RFX0lHTk9SRUQ7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BcHBPcHNNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBVdGlsaXRpZXMgZm9yIGNvbnRyb2xsaW5nIEFwcCBPcHMgc2V0dGluZ3MsIGFuZCB0ZXN0aW5nIHdoZXRoZXIgb3BzIGFyZSBsb2dnZWQuCisgKi8KK3B1YmxpYyBjbGFzcyBBcHBPcHNVdGlscyB7CisKKyAgICAvKioKKyAgICAgKiBSZXNldHMgYSBwYWNrYWdlJ3MgYXBwIG9wcyBjb25maWd1cmF0aW9uIHRvIHRoZSBkZXZpY2UgZGVmYXVsdC4gU2VlIEFwcE9wc01hbmFnZXIgZm9yIHRoZQorICAgICAqIGRlZmF1bHQgb3Agc2V0dGluZ3MuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBJdCdzIHJlY29tbWVuZGVkIHRvIGNhbGwgdGhpcyBpbiBzZXRVcCgpIGFuZCB0ZWFyRG93bigpIG9mIHlvdXIgdGVzdCBzbyB0aGUgdGVzdCBzdGFydHMgYW5kCisgICAgICogZW5kcyB3aXRoIGEgcmVwcm9kdWNpYmxlIGRlZmF1bHQgc3RhdGUsIGFuZCBzbyBkb2Vzbid0IGFmZmVjdCBvdGhlciB0ZXN0cy4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFNvbWUgYXBwIG9wcyBhcmUgY29uZmlndXJlZCB0byBiZSBub24tcmVzZXR0YWJsZSwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgc3RhdGUgb2YgdGhlc2Ugd2lsbAorICAgICAqIG5vdCBiZSByZXNldCBldmVuIHdoZW4gY2FsbGluZyB0aGlzIG1ldGhvZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyByZXNldChTdHJpbmcgcGFja2FnZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBydW5Db21tYW5kKCJhcHBvcHMgcmVzZXQgIiArIHBhY2thZ2VOYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBhcHAgb3AgbW9kZSAoZS5nLiBhbGxvd2VkLCBkZW5pZWQpIGZvciBhIHNpbmdsZSBwYWNrYWdlIGFuZCBvcGVyYXRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgc2V0T3BNb2RlKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIG9wU3RyLCBpbnQgbW9kZSkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBtb2RlU3RyOworICAgICAgICBzd2l0Y2ggKG1vZGUpIHsKKyAgICAgICAgICAgIGNhc2UgTU9ERV9BTExPV0VEOgorICAgICAgICAgICAgICAgIG1vZGVTdHIgPSAiYWxsb3ciOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNT0RFX0VSUk9SRUQ6CisgICAgICAgICAgICAgICAgbW9kZVN0ciA9ICJkZW55IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTU9ERV9JR05PUkVEOgorICAgICAgICAgICAgICAgIG1vZGVTdHIgPSAiaWdub3JlIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTU9ERV9ERUZBVUxUOgorICAgICAgICAgICAgICAgIG1vZGVTdHIgPSAiZGVmYXVsdCI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgYXBwIG9wIHR5cGUiKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgY29tbWFuZCA9ICJhcHBvcHMgc2V0ICIgKyBwYWNrYWdlTmFtZSArICIgIiArIG9wU3RyICsgIiAiICsgbW9kZVN0cjsKKyAgICAgICAgcmV0dXJuIHJ1bkNvbW1hbmQoY29tbWFuZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBhcHAgb3AgbW9kZSAoZS5nLiBNT0RFX0FMTE9XRUQsIE1PREVfREVGQVVMVCkgZm9yIGEgc2luZ2xlIHBhY2thZ2UgYW5kIG9wZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRPcE1vZGUoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgb3BTdHIpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgb3BTdGF0ZSA9IGdldE9wU3RhdGUocGFja2FnZU5hbWUsIG9wU3RyKTsKKyAgICAgICAgaWYgKG9wU3RhdGUuY29udGFpbnMoIiBhbGxvdyIpKSB7CisgICAgICAgICAgICByZXR1cm4gTU9ERV9BTExPV0VEOworICAgICAgICB9IGVsc2UgaWYgKG9wU3RhdGUuY29udGFpbnMoIiBkZW55IikpIHsKKyAgICAgICAgICAgIHJldHVybiBNT0RFX0VSUk9SRUQ7CisgICAgICAgIH0gZWxzZSBpZiAob3BTdGF0ZS5jb250YWlucygiIGlnbm9yZSIpKSB7CisgICAgICAgICAgICByZXR1cm4gTU9ERV9JR05PUkVEOworICAgICAgICB9IGVsc2UgaWYgKG9wU3RhdGUuY29udGFpbnMoIiBkZWZhdWx0IikpIHsKKyAgICAgICAgICAgIHJldHVybiBNT0RFX0RFRkFVTFQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVbmV4cGVjdGVkIGFwcCBvcCBtb2RlIHJldHVybmVkICIgKyBvcFN0YXRlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciBhbiBhbGxvd2VkIG9wZXJhdGlvbiBoYXMgYmVlbiBsb2dnZWQgYnkgdGhlIEFwcE9wc01hbmFnZXIgZm9yIGEKKyAgICAgKiBwYWNrYWdlLiBPcGVyYXRpb25zIGFyZSBub3RlZCB3aGVuIHRoZSBhcHAgYXR0ZW1wdHMgdG8gcGVyZm9ybSB0aGVtIGFuZCBjYWxscyBlLmcuCisgICAgICoge0BsaW5rIEFwcE9wc01hbmFnZXIjbm90ZU9wZXJhdGlvbn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3BTdHIgVGhlIHB1YmxpYyBzdHJpbmcgY29uc3RhbnQgb2YgdGhlIG9wZXJhdGlvbiAoZS5nLiBPUFNUUl9SRUFEX1NNUykuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGFsbG93ZWRPcGVyYXRpb25Mb2dnZWQoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgb3BTdHIpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2V0T3BTdGF0ZShwYWNrYWdlTmFtZSwgb3BTdHIpLmNvbnRhaW5zKCIgdGltZT0iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgYSByZWplY3RlZCBvcGVyYXRpb24gaGFzIGJlZW4gbG9nZ2VkIGJ5IHRoZSBBcHBPcHNNYW5hZ2VyIGZvciBhCisgICAgICogcGFja2FnZS4gT3BlcmF0aW9ucyBhcmUgbm90ZWQgd2hlbiB0aGUgYXBwIGF0dGVtcHRzIHRvIHBlcmZvcm0gdGhlbSBhbmQgY2FsbHMgZS5nLgorICAgICAqIHtAbGluayBBcHBPcHNNYW5hZ2VyI25vdGVPcGVyYXRpb259LgorICAgICAqCisgICAgICogQHBhcmFtIG9wU3RyIFRoZSBwdWJsaWMgc3RyaW5nIGNvbnN0YW50IG9mIHRoZSBvcGVyYXRpb24gKGUuZy4gT1BTVFJfUkVBRF9TTVMpLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZWplY3RlZE9wZXJhdGlvbkxvZ2dlZChTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBvcFN0cikKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRPcFN0YXRlKHBhY2thZ2VOYW1lLCBvcFN0cikuY29udGFpbnMoIiByZWplY3RUaW1lPSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGFwcCBvcCBzdGF0ZSBmb3IgYSBwYWNrYWdlLiBJbmNsdWRlcyBpbmZvcm1hdGlvbiBvbiB3aGVuIHRoZSBvcGVyYXRpb24gd2FzIGxhc3QKKyAgICAgKiBhdHRlbXB0ZWQgdG8gYmUgcGVyZm9ybWVkIGJ5IHRoZSBwYWNrYWdlLgorICAgICAqCisgICAgICogRm9ybWF0OiAiU0VORF9TTVM6IGFsbG93OyB0aW1lPSsyM2gxMm01NHM5ODBtcyBhZ287IHJlamVjdFRpbWU9KzFoMTBtMjNzMTgwbXMiCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE9wU3RhdGUoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgb3BTdHIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBydW5Db21tYW5kKCJhcHBvcHMgZ2V0ICIgKyBwYWNrYWdlTmFtZSArICIgIiArIG9wU3RyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcnVuQ29tbWFuZChTdHJpbmcgY29tbWFuZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIFN5c3RlbVV0aWwucnVuU2hlbGxDb21tYW5kKEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLCBjb21tYW5kKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9BcHBTdGFuZGJ5VXRpbHMuamF2YSBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0FwcFN0YW5kYnlVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViOTRiNjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9BcHBTdGFuZGJ5VXRpbHMuamF2YQpAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsOworCitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCitwdWJsaWMgY2xhc3MgQXBwU3RhbmRieVV0aWxzIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkN0c0FwcFN0YW5kYnlVdGlscyI7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGlmIGFwcCBzdGFuZGJ5IGlzIGVuYWJsZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgZW5hYmxlZDsgb3IgZmFsc2UgaWYgZGlzYWJsZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQXBwU3RhbmRieUVuYWJsZWQoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyByZXN1bHQgPSBTeXN0ZW1VdGlsLnJ1blNoZWxsQ29tbWFuZCgKKyAgICAgICAgICAgICAgICAiZHVtcHN5cyB1c2FnZXN0YXRzIGlzLWFwcC1zdGFuZGJ5LWVuYWJsZWQiKS50cmltKCk7CisgICAgICAgIHJldHVybiBCb29sZWFuLnBhcnNlQm9vbGVhbihyZXN1bHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgZW5hYmxlZCBzdGF0ZSBmb3IgYXBwIHN0YW5kYnkgZmVhdHVyZSBmb3IgcnVudGltZSBzd2l0Y2guCisgICAgICoKKyAgICAgKiBBcHAgc3RhbmRieSBmZWF0dXJlIGhhcyAyIHN3aXRjaGVzLiBUaGlzIG9uZSBhZmZlY3RzIHRoZSBzd2l0Y2ggYXQgcnVudGltZS4gSWYgdGhlIGJ1aWxkCisgICAgICogc3dpdGNoIGlzIG9mZiwgZW5hYmxpbmcgdGhlIHJ1bnRpbWUgc3dpdGNoIHdpbGwgbm90IGVuYWJsZSBBcHAgc3RhbmRieS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbmFibGVkIGlmIEFwcCBzdGFuZGJ5IGlzIGVuYWJsZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEFwcFN0YW5kYnlFbmFibGVkQXRSdW50aW1lKGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWUgPSBlbmFibGVkID8gIjEiIDogIjAiOworICAgICAgICBMb2cuZChUQUcsICJTZXR0aW5nIEFwcFN0YW5kYnkgIiArIChlbmFibGVkID8gImVuYWJsZWQiIDogImRpc2FibGVkIikgKyAiIGF0IHJ1bnRpbWUuIik7CisgICAgICAgIFNldHRpbmdzVXRpbHMucHV0R2xvYmFsU2V0dGluZygiYXBwX3N0YW5kYnlfZW5hYmxlZCIsIHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGlmIGFwcCBzdGFuZGJ5IGlzIGVuYWJsZWQgYXQgcnVudGltZS4gTm90ZSB7QGxpbmsgI2lzQXBwU3RhbmRieUVuYWJsZWQoKX0gbWF5IHN0aWxsCisgICAgICogcmV0dXJuIHtAY29kZSBmYWxzZX0gaWYgdGhpcyBtZXRob2QgcmV0dXJucyB7QGNvZGUgdHJ1ZX0sIGJlY2F1c2UgYXBwIHN0YW5kYnkgY2FuIGJlIGRpc2FibGVkCisgICAgICogYXQgYnVpbGQgdGltZSBhcyB3ZWxsLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIGVuYWJsZWQgYXQgcnVudGltZTsgb3IgZmFsc2UgaWYgZGlzYWJsZWQgYXQgcnVudGltZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBcHBTdGFuZGJ5RW5hYmxlZEF0UnVudGltZSgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdCA9CisgICAgICAgICAgICAgICAgU3lzdGVtVXRpbC5ydW5TaGVsbENvbW1hbmQoInNldHRpbmdzIGdldCBnbG9iYWwgYXBwX3N0YW5kYnlfZW5hYmxlZCIpLnRyaW0oKTsKKyAgICAgICAgLy8gZnJhbWV3b3JrIGNvbnNpZGVycyBudWxsIHZhbHVlIGFzIGVuYWJsZWQuCisgICAgICAgIGZpbmFsIGJvb2xlYW4gYm9vbFJlc3VsdCA9IHJlc3VsdC5lcXVhbHMoIjEiKSB8fCByZXN1bHQuZXF1YWxzKCJudWxsIik7CisgICAgICAgIExvZy5kKFRBRywgIkFwcFN0YW5kYnkgaXMgIiArIChib29sUmVzdWx0ID8gImVuYWJsZWQiIDogImRpc2FibGVkIikgKyAiIGF0IHJ1bnRpbWUuIik7CisgICAgICAgIHJldHVybiBib29sUmVzdWx0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0JhdHRlcnlVdGlscy5qYXZhIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQmF0dGVyeVV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEzNTdhMTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9CYXR0ZXJ5VXRpbHMuamF2YQpAQCAtMCwwICsxLDEyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWw7CisKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5TZXR0aW5nc1V0aWxzLnB1dEdsb2JhbFNldHRpbmc7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuVGVzdFV0aWxzLndhaXRVbnRpbDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJhdHRlcnlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuUG93ZXJNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuR2xvYmFsOworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzdW1lOworCitwdWJsaWMgY2xhc3MgQmF0dGVyeVV0aWxzIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkN0c0JhdHRlcnlVdGlscyI7CisKKyAgICBwcml2YXRlIEJhdHRlcnlVdGlscygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEJhdHRlcnlNYW5hZ2VyIGdldEJhdHRlcnlNYW5hZ2VyKCkgeworICAgICAgICByZXR1cm4gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoQmF0dGVyeU1hbmFnZXIuY2xhc3MpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUG93ZXJNYW5hZ2VyIGdldFBvd2VyTWFuYWdlcigpIHsKKyAgICAgICAgcmV0dXJuIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKS5nZXRTeXN0ZW1TZXJ2aWNlKFBvd2VyTWFuYWdlci5jbGFzcyk7CisgICAgfQorCisgICAgLyoqIE1ha2UgdGhlIHRhcmdldCBkZXZpY2UgdGhpbmsgaXQncyBvZmYgY2hhcmdlci4gKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcnVuRHVtcHN5c0JhdHRlcnlVbnBsdWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3lzdGVtVXRpbC5ydW5TaGVsbENvbW1hbmRGb3JOb091dHB1dCgiZHVtcHN5cyBiYXR0ZXJ5IHVucGx1ZyIpOworCisgICAgICAgIExvZy5kKFRBRywgIkJhdHRlcnkgVU5QTFVHR0VEIik7CisgICAgfQorCisgICAgLyoqIFJlc2V0IHtAbGluayAjcnVuRHVtcHN5c0JhdHRlcnlVbnBsdWd9LiAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcnVuRHVtcHN5c0JhdHRlcnlSZXNldCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTeXN0ZW1VdGlsLnJ1blNoZWxsQ29tbWFuZEZvck5vT3V0cHV0KCgiZHVtcHN5cyBiYXR0ZXJ5IHJlc2V0IikpOworCisgICAgICAgIExvZy5kKFRBRywgIkJhdHRlcnkgUkVTRVQiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmFibGUgLyBkaXNhYmxlIGJhdHRlcnkgc2F2ZXIuIE5vdGUge0BsaW5rICNydW5EdW1wc3lzQmF0dGVyeVVucGx1Z30gbXVzdCBoYXZlIGJlZW4KKyAgICAgKiBleGVjdXRlZCBiZWZvcmUgZW5hYmxpbmcgQlMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGVuYWJsZUJhdHRlcnlTYXZlcihib29sZWFuIGVuYWJsZWQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoZW5hYmxlZCkgeworICAgICAgICAgICAgU3lzdGVtVXRpbC5ydW5TaGVsbENvbW1hbmRGb3JOb091dHB1dCgiY21kIHBvd2VyIHNldC1tb2RlIDEiKTsKKyAgICAgICAgICAgIHB1dEdsb2JhbFNldHRpbmcoR2xvYmFsLkxPV19QT1dFUl9NT0RFLCAiMSIpOworICAgICAgICAgICAgd2FpdFVudGlsKCJCYXR0ZXJ5IHNhdmVyIHN0aWxsIG9mZiIsICgpIC0+IGdldFBvd2VyTWFuYWdlcigpLmlzUG93ZXJTYXZlTW9kZSgpKTsKKyAgICAgICAgICAgIHdhaXRVbnRpbCgiTG9jYXRpb24gbW9kZSBzdGlsbCAiICsgZ2V0UG93ZXJNYW5hZ2VyKCkuZ2V0TG9jYXRpb25Qb3dlclNhdmVNb2RlKCksCisgICAgICAgICAgICAgICAgICAgICgpIC0+IChQb3dlck1hbmFnZXIuTE9DQVRJT05fTU9ERV9OT19DSEFOR0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBnZXRQb3dlck1hbmFnZXIoKS5nZXRMb2NhdGlvblBvd2VyU2F2ZU1vZGUoKSkpOworCisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNTAwKTsKKyAgICAgICAgICAgIHdhaXRVbnRpbCgiRm9yY2UgYWxsIGFwcHMgc3RhbmRieSBzdGlsbCBvZmYiLAorICAgICAgICAgICAgICAgICAgICAoKSAtPiBTeXN0ZW1VdGlsLnJ1blNoZWxsQ29tbWFuZCgiZHVtcHN5cyBhbGFybSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbnRhaW5zKCIgRm9yY2UgYWxsIGFwcHMgc3RhbmRieTogdHJ1ZVxuIikpOworCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTeXN0ZW1VdGlsLnJ1blNoZWxsQ29tbWFuZEZvck5vT3V0cHV0KCJjbWQgcG93ZXIgc2V0LW1vZGUgMCIpOworICAgICAgICAgICAgcHV0R2xvYmFsU2V0dGluZyhHbG9iYWwuTE9XX1BPV0VSX01PREVfU1RJQ0tZLCAiMCIpOworICAgICAgICAgICAgd2FpdFVudGlsKCJCYXR0ZXJ5IHNhdmVyIHN0aWxsIG9uIiwgKCkgLT4gIWdldFBvd2VyTWFuYWdlcigpLmlzUG93ZXJTYXZlTW9kZSgpKTsKKyAgICAgICAgICAgIHdhaXRVbnRpbCgiTG9jYXRpb24gbW9kZSBzdGlsbCAiICsgZ2V0UG93ZXJNYW5hZ2VyKCkuZ2V0TG9jYXRpb25Qb3dlclNhdmVNb2RlKCksCisgICAgICAgICAgICAgICAgICAgICgpIC0+IChQb3dlck1hbmFnZXIuTE9DQVRJT05fTU9ERV9OT19DSEFOR0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBnZXRQb3dlck1hbmFnZXIoKS5nZXRMb2NhdGlvblBvd2VyU2F2ZU1vZGUoKSkpOworCisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNTAwKTsKKyAgICAgICAgICAgIHdhaXRVbnRpbCgiRm9yY2UgYWxsIGFwcHMgc3RhbmRieSBzdGlsbCBvbiIsCisgICAgICAgICAgICAgICAgICAgICgpIC0+IFN5c3RlbVV0aWwucnVuU2hlbGxDb21tYW5kKCJkdW1wc3lzIGFsYXJtIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29udGFpbnMoIiBGb3JjZSBhbGwgYXBwcyBzdGFuZGJ5OiBmYWxzZVxuIikpOworICAgICAgICB9CisKKyAgICAgICAgQW1VdGlscy53YWl0Rm9yQnJvYWRjYXN0SWRsZSgpOworICAgICAgICBMb2cuZChUQUcsICJCYXR0ZXJ5IHNhdmVyIHR1cm5lZCAiICsgKGVuYWJsZWQgPyAiT04iIDogIk9GRiIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUdXJuIG9uL29mZiBzY3JlZW4uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHR1cm5PblNjcmVlbihib29sZWFuIG9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG9uKSB7CisgICAgICAgICAgICBTeXN0ZW1VdGlsLnJ1blNoZWxsQ29tbWFuZEZvck5vT3V0cHV0KCJpbnB1dCBrZXlldmVudCBLRVlDT0RFX1dBS0VVUCIpOworICAgICAgICAgICAgd2FpdFVudGlsKCJEZXZpY2Ugc3RpbGwgbm90IGludGVyYWN0aXZlIiwgKCkgLT4gZ2V0UG93ZXJNYW5hZ2VyKCkuaXNJbnRlcmFjdGl2ZSgpKTsKKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3lzdGVtVXRpbC5ydW5TaGVsbENvbW1hbmRGb3JOb091dHB1dCgiaW5wdXQga2V5ZXZlbnQgS0VZQ09ERV9TTEVFUCIpOworICAgICAgICAgICAgd2FpdFVudGlsKCJEZXZpY2Ugc3RpbGwgaW50ZXJhY3RpdmUiLCAoKSAtPiAhZ2V0UG93ZXJNYW5hZ2VyKCkuaXNJbnRlcmFjdGl2ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBBbVV0aWxzLndhaXRGb3JCcm9hZGNhc3RJZGxlKCk7CisgICAgICAgIExvZy5kKFRBRywgIlNjcmVlbiB0dXJuZWQgIiArIChvbiA/ICJPTiIgOiAiT0ZGIikpOworICAgIH0KKworICAgIC8qKiBAcmV0dXJuIHRydWUgaWYgdGhlIGRldmljZSBzdXBwb3J0cyBiYXR0ZXJ5IHNhdmVyLiAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0JhdHRlcnlTYXZlclN1cHBvcnRlZCgpIHsKKyAgICAgICAgZmluYWwgUGFja2FnZU1hbmFnZXIgcG0gPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCkuZ2V0UGFja2FnZU1hbmFnZXIoKTsKKyAgICAgICAgcmV0dXJuICFwbS5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfV0FUQ0gpOworICAgIH0KKworICAgIC8qKiAiQXNzdW1lIiB0aGUgY3VycmVudCBkZXZpY2Ugc3VwcG9ydHMgYmF0dGVyeSBzYXZlci4gKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzdW1lQmF0dGVyeVNhdmVyRmVhdHVyZSgpIHsKKyAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUoIkRldmljZSBkb2Vzbid0IHN1cHBvcnQgYmF0dGVyeSBzYXZlciIsIGlzQmF0dGVyeVNhdmVyU3VwcG9ydGVkKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0JlZm9yZUFmdGVyUnVsZS5qYXZhIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQmVmb3JlQWZ0ZXJSdWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU3NTY3MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0JlZm9yZUFmdGVyUnVsZS5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsOworCitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLlRlc3RSdWxlOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuRGVzY3JpcHRpb247CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMubW9kZWwuU3RhdGVtZW50OworCisvKioKKyAqIEN1c3RvbSBKVW5pdDQgcnVsZSB0aGF0IHByb3ZpZGVzICJiZWZvcmUiIC8gImFmdGVyIiBjYWxsYmFja3MsIHdoaWNoIGlzIHVzZWZ1bCB0byB1c2Ugd2l0aAorICoge0BsaW5rIG9yZy5qdW5pdC5ydWxlcy5SdWxlQ2hhaW59LgorICovCitwdWJsaWMgY2xhc3MgQmVmb3JlQWZ0ZXJSdWxlIGltcGxlbWVudHMgVGVzdFJ1bGUgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdGF0ZW1lbnQgYXBwbHkoU3RhdGVtZW50IGJhc2UsIERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7CisgICAgICAgIHJldHVybiBuZXcgU3RhdGVtZW50KCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGV2YWx1YXRlKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgICAgICAgICAgb25CZWZvcmUoYmFzZSwgZGVzY3JpcHRpb24pOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGJhc2UuZXZhbHVhdGUoKTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBvbkFmdGVyKGJhc2UsIGRlc2NyaXB0aW9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgb25CZWZvcmUoU3RhdGVtZW50IGJhc2UsIERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkFmdGVyKFN0YXRlbWVudCBiYXNlLCBEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIFRocm93YWJsZSB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2RldmljZS1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQmxvY2tlZE51bWJlclNlcnZpY2UuamF2YSBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0Jsb2NrZWROdW1iZXJTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYwYzA3OAotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0Jsb2NrZWROdW1iZXJTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnByb3ZpZGVyLkJsb2NrZWROdW1iZXJDb250cmFjdC5CbG9ja2VkTnVtYmVycy5DT0xVTU5fT1JJR0lOQUxfTlVNQkVSOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnByb3ZpZGVyLkJsb2NrZWROdW1iZXJDb250cmFjdC5CbG9ja2VkTnVtYmVycy5DT05URU5UX1VSSTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkludGVudFNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlc3VsdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKy8qKgorICogQSBzZXJ2aWNlIHRvIGhhbmRsZSBpbnRlcmFjdGlvbnMgd2l0aCB0aGUgQmxvY2tlZE51bWJlclByb3ZpZGVyLiBUaGUgQmxvY2tlZE51bWJlclByb3ZpZGVyCisgKiBjYW4gb25seSBiZSBhY2Nlc3NlZCBieSB0aGUgcHJpbWFyeSB1c2VyLiBUaGlzIHNlcnZpY2UgY2FuIGJlIHJ1biBhcyBhIHNpbmdsZXRvbiBzZXJ2aWNlCisgKiB3aGljaCB3aWxsIHRoZW4gYmUgYWJsZSB0byBhY2Nlc3MgdGhlIEJsb2NrZWROdW1iZXJQcm92aWRlciBmcm9tIGEgdGVzdCBydW5uaW5nIGluIGEKKyAqIHNlY29uZGFyeSB1c2VyLgorICovCitwdWJsaWMgY2xhc3MgQmxvY2tlZE51bWJlclNlcnZpY2UgZXh0ZW5kcyBJbnRlbnRTZXJ2aWNlIHsKKworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5TRVJUX0FDVElPTiA9ICJhbmRyb2lkLnRlbGVjb20uY3RzLkluc2VydEJsb2NrZWROdW1iZXIiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFX0FDVElPTiA9ICJhbmRyb2lkLnRlbGVjb20uY3RzLkRlbGV0ZUJsb2NrZWROdW1iZXIiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEhPTkVfTlVNQkVSX0VYVFJBID0gIm51bWJlciI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBVUklfRVhUUkEgPSAidXJpIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFJPV1NfRVhUUkEgPSAicm93cyI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRfUkVDRUlWRVJfRVhUUkEgPSAicmVzdWx0UmVjZWl2ZXIiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJDdHNCbG9ja051bWJlclN2YyI7CisKKyAgICBwcml2YXRlIENvbnRlbnRSZXNvbHZlciBtQ29udGVudFJlc29sdmVyOworCisgICAgcHVibGljIEJsb2NrZWROdW1iZXJTZXJ2aWNlKCkgeworICAgICAgICBzdXBlcihCbG9ja2VkTnVtYmVyU2VydmljZS5jbGFzcy5nZXROYW1lKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uSGFuZGxlSW50ZW50KEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgTG9nLmkoVEFHLCAiU3RhcnRpbmcgQmxvY2tlZE51bWJlclNlcnZpY2Ugc2VydmljZTogIiArIGludGVudCk7CisgICAgICAgIGlmIChpbnRlbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEJ1bmRsZSBidW5kbGU7CisgICAgICAgIG1Db250ZW50UmVzb2x2ZXIgPSBnZXRDb250ZW50UmVzb2x2ZXIoKTsKKyAgICAgICAgc3dpdGNoIChpbnRlbnQuZ2V0QWN0aW9uKCkpIHsKKyAgICAgICAgICAgIGNhc2UgSU5TRVJUX0FDVElPTjoKKyAgICAgICAgICAgICAgICBidW5kbGUgPSBpbnNlcnRCbG9ja2VkTnVtYmVyKGludGVudC5nZXRTdHJpbmdFeHRyYShQSE9ORV9OVU1CRVJfRVhUUkEpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgREVMRVRFX0FDVElPTjoKKyAgICAgICAgICAgICAgICBidW5kbGUgPSBkZWxldGVCbG9ja2VkTnVtYmVyKFVyaS5wYXJzZShpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoVVJJX0VYVFJBKSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBidW5kbGUgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgUmVzdWx0UmVjZWl2ZXIgcmVjZWl2ZXIgPSBpbnRlbnQuZ2V0UGFyY2VsYWJsZUV4dHJhKFJFU1VMVF9SRUNFSVZFUl9FWFRSQSk7CisgICAgICAgIHJlY2VpdmVyLnNlbmQoMCwgYnVuZGxlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEJ1bmRsZSBpbnNlcnRCbG9ja2VkTnVtYmVyKFN0cmluZyBudW1iZXIpIHsKKyAgICAgICAgTG9nLmkoVEFHLCAiaW5zZXJ0QmxvY2tlZE51bWJlcjogIiArIG51bWJlcik7CisKKyAgICAgICAgQ29udGVudFZhbHVlcyBjdiA9IG5ldyBDb250ZW50VmFsdWVzKCk7CisgICAgICAgIGN2LnB1dChDT0xVTU5fT1JJR0lOQUxfTlVNQkVSLCBudW1iZXIpOworICAgICAgICBVcmkgdXJpID0gbUNvbnRlbnRSZXNvbHZlci5pbnNlcnQoQ09OVEVOVF9VUkksIGN2KTsKKyAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgYnVuZGxlLnB1dFN0cmluZyhVUklfRVhUUkEsIHVyaS50b1N0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIGJ1bmRsZTsKKyAgICB9CisKKyAgICBwcml2YXRlIEJ1bmRsZSBkZWxldGVCbG9ja2VkTnVtYmVyKFVyaSB1cmkpIHsKKyAgICAgICAgTG9nLmkoVEFHLCAiZGVsZXRlQmxvY2tlZE51bWJlcjogIiArIHVyaSk7CisKKyAgICAgICAgaW50IHJvd3MgPSBtQ29udGVudFJlc29sdmVyLmRlbGV0ZSh1cmksIG51bGwsIG51bGwpOworICAgICAgICBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOworICAgICAgICBidW5kbGUucHV0SW50KFJPV1NfRVhUUkEsIHJvd3MpOworICAgICAgICByZXR1cm4gYnVuZGxlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0Jsb2NrZWROdW1iZXJVdGlsLmphdmEgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9CbG9ja2VkTnVtYmVyVXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1YTBjZTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9CbG9ja2VkTnVtYmVyVXRpbC5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWw7CisKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5CbG9ja2VkTnVtYmVyU2VydmljZS5ERUxFVEVfQUNUSU9OOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkJsb2NrZWROdW1iZXJTZXJ2aWNlLklOU0VSVF9BQ1RJT047CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQmxvY2tlZE51bWJlclNlcnZpY2UuUEhPTkVfTlVNQkVSX0VYVFJBOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkJsb2NrZWROdW1iZXJTZXJ2aWNlLlJFU1VMVF9SRUNFSVZFUl9FWFRSQTsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5CbG9ja2VkTnVtYmVyU2VydmljZS5ST1dTX0VYVFJBOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkJsb2NrZWROdW1iZXJTZXJ2aWNlLlVSSV9FWFRSQTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlc3VsdFJlY2VpdmVyOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2VtYXBob3JlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCisvKioKKyAqIFV0aWxpdHkgZm9yIHN0YXJ0aW5nIHRoZSBibG9ja2VkIG51bWJlciBzZXJ2aWNlLgorICovCitwdWJsaWMgY2xhc3MgQmxvY2tlZE51bWJlclV0aWwgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRJTUVPVVQgPSAyOworCisgICAgcHJpdmF0ZSBCbG9ja2VkTnVtYmVyVXRpbCgpIHt9CisKKyAgICAvKiogSW5zZXJ0IGEgcGhvbmUgbnVtYmVyIGludG8gdGhlIGJsb2NrZWQgbnVtYmVyIHByb3ZpZGVyIGFuZCByZXR1cm5zIHRoZSByZXN1bHRpbmcgVXJpLiAqLworICAgIHB1YmxpYyBzdGF0aWMgVXJpIGluc2VydEJsb2NrZWROdW1iZXIoQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcGhvbmVOdW1iZXIpIHsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoSU5TRVJUX0FDVElPTik7CisgICAgICAgIGludGVudC5wdXRFeHRyYShQSE9ORV9OVU1CRVJfRVhUUkEsIHBob25lTnVtYmVyKTsKKworICAgICAgICByZXR1cm4gVXJpLnBhcnNlKHJ1bkJsb2NrZWROdW1iZXJTZXJ2aWNlKGNvbnRleHQsIGludGVudCkuZ2V0U3RyaW5nKFVSSV9FWFRSQSkpOworICAgIH0KKworICAgIC8qKiBSZW1vdmUgYSBudW1iZXIgZnJvbSB0aGUgYmxvY2tlZCBudW1iZXIgcHJvdmlkZXIgYW5kIHJldHVybnMgdGhlIG51bWJlciBvZiByb3dzIGRlbGV0ZWQuICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgZGVsZXRlQmxvY2tlZE51bWJlcihDb250ZXh0IGNvbnRleHQsIFVyaSB1cmkpIHsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoREVMRVRFX0FDVElPTik7CisgICAgICAgIGludGVudC5wdXRFeHRyYShVUklfRVhUUkEsIHVyaS50b1N0cmluZygpKTsKKworICAgICAgICByZXR1cm4gcnVuQmxvY2tlZE51bWJlclNlcnZpY2UoY29udGV4dCwgaW50ZW50KS5nZXRJbnQoUk9XU19FWFRSQSk7CisgICAgfQorCisgICAgLyoqIFN0YXJ0IHRoZSBibG9ja2VkIG51bWJlciBzZXJ2aWNlLiAqLworICAgIHN0YXRpYyBCdW5kbGUgcnVuQmxvY2tlZE51bWJlclNlcnZpY2UoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIC8vIFRlbXBvcmFyaWx5IGFsbG93IGJhY2tncm91bmQgc2VydmljZQorICAgICAgICBTeXN0ZW1VdGlsLnJ1blNoZWxsQ29tbWFuZCgiY21kIGRldmljZWlkbGUgdGVtcHdoaXRlbGlzdCAiICsgY29udGV4dC5nZXRQYWNrYWdlTmFtZSgpKTsKKworICAgICAgICBmaW5hbCBTZW1hcGhvcmUgc2VtYXBob3JlID0gbmV3IFNlbWFwaG9yZSgwKTsKKyAgICAgICAgZmluYWwgQnVuZGxlIHJlc3VsdCA9IG5ldyBCdW5kbGUoKTsKKworICAgICAgICBSZXN1bHRSZWNlaXZlciByZWNlaXZlciA9IG5ldyBSZXN1bHRSZWNlaXZlcihuZXcgSGFuZGxlcihMb29wZXIuZ2V0TWFpbkxvb3BlcigpKSkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvblJlY2VpdmVSZXN1bHQoaW50IHJlc3VsdENvZGUsIEJ1bmRsZSByZXN1bHREYXRhKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0LnB1dEFsbChyZXN1bHREYXRhKTsKKyAgICAgICAgICAgICAgICBzZW1hcGhvcmUucmVsZWFzZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBpbnRlbnQucHV0RXh0cmEoUkVTVUxUX1JFQ0VJVkVSX0VYVFJBLCByZWNlaXZlcik7CisgICAgICAgIGludGVudC5zZXRDb21wb25lbnQobmV3IENvbXBvbmVudE5hbWUoY29udGV4dCwgQmxvY2tlZE51bWJlclNlcnZpY2UuY2xhc3MpKTsKKworICAgICAgICBjb250ZXh0LnN0YXJ0U2VydmljZShpbnRlbnQpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBUZXN0Q2FzZS5hc3NlcnRUcnVlKHNlbWFwaG9yZS50cnlBY3F1aXJlKFRJTUVPVVQsIFRpbWVVbml0LlNFQ09ORFMpKTsKKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgVGVzdENhc2UuZmFpbCgiVGltZWQgb3V0IHdhaXRpbmcgZm9yIHJlc3VsdCBmcm9tIEJsb2NrZWROdW1iZXJTZXJ2aWNlIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9CbG9ja2luZ0Jyb2FkY2FzdFJlY2VpdmVyLmphdmEgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9CbG9ja2luZ0Jyb2FkY2FzdFJlY2VpdmVyLmphdmEKaW5kZXggNTFhM2YxNC4uYzI2ZGRkMCAxMDA3NTUKLS0tIGEvY29tbW9uL2RldmljZS1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQmxvY2tpbmdCcm9hZGNhc3RSZWNlaXZlci5qYXZhCisrKyBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0Jsb2NraW5nQnJvYWRjYXN0UmVjZWl2ZXIuamF2YQpAQCAtMTksNyArMTksNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk51bGxhYmxlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5BcnJheUJsb2NraW5nUXVldWU7CkBAIC03OSw2ICs3OSwxOSBAQAogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBXYWl0IHVudGlsIHRoZSBicm9hZGNhc3QgYW5kIHJldHVybiB0aGUgcmVjZWl2ZWQgYnJvYWRjYXN0IGludGVudC4ge0Bjb2RlIG51bGx9IGlzIHJldHVybmVkCisgICAgICogaWYgbm8gYnJvYWRjYXN0IHdpdGggZXhwZWN0ZWQgYWN0aW9uIGlzIHJlY2VpdmVkIHdpdGhpbiB0aGUgZ2l2ZW4gdGltZW91dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQE51bGxhYmxlIEludGVudCBhd2FpdEZvckJyb2FkY2FzdChsb25nIHRpbWVvdXRNaWxsaXMpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBtQmxvY2tpbmdRdWV1ZS5wb2xsKHRpbWVvdXRNaWxsaXMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIndhaXRGb3JCcm9hZGNhc3QgZ2V0IGludGVycnVwdGVkOiAiLCBlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyUXVpZXRseSgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG1Db250ZXh0LnVucmVnaXN0ZXJSZWNlaXZlcih0aGlzKTsKZGlmZiAtLWdpdCBhL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0Jyb2FkY2FzdFJwY0Jhc2UuamF2YSBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0Jyb2FkY2FzdFJwY0Jhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzJlN2QzCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQnJvYWRjYXN0UnBjQmFzZS5qYXZhCkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY1JlZmVyZW5jZTsKKworLyoqCisgKiBCYXNlIGNsYXNzIHRvIGhlbHAgYnJvYWRjYXN0LWJhc2VkIFJQQy4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEJyb2FkY2FzdFJwY0Jhc2U8VFJlcXVlc3QsIFRSZXNwb25zZT4geworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQnJvYWRjYXN0UnBjIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gVkVSQk9TRSA9IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpOworCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fUkVRVUVTVCA9ICJBQ1RJT05fUkVRVUVTVCI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9QQVlMT0FEID0gIkVYVFJBX1BBWUxPQUQiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfRVhDRVBUSU9OID0gIkVYVFJBX0VYQ0VQVElPTiI7CisKKyAgICBzdGF0aWMgSGFuZGxlciBzTWFpbkhhbmRsZXIgPSBuZXcgSGFuZGxlcihMb29wZXIuZ2V0TWFpbkxvb3BlcigpKTsKKworICAgIC8qKiBJbXBsZW1lbnQgaW4gYSBzdWJjbGFzcyAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBieXRlW10gcmVxdWVzdFRvQnl0ZXMoVFJlcXVlc3QgcmVxdWVzdCk7CisKKyAgICAvKiogSW1wbGVtZW50IGluIGEgc3ViY2xhc3MgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgVFJlc3BvbnNlIGJ5dGVzVG9SZXNwb25zZShieXRlW10gYnl0ZXMpOworCisgICAgcHVibGljIFRSZXNwb25zZSBpbnZva2UoQ29tcG9uZW50TmFtZSB0YXJnZXRSZWNlaXZlciwgVFJlcXVlc3QgcmVxdWVzdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIENyZWF0ZSBhIHJlcXVlc3QgaW50ZW50LgorICAgICAgICBMb2cuaShUQUcsICJTZW5kaW5nIHRvOiAiICsgdGFyZ2V0UmVjZWl2ZXIgKyAoVkVSQk9TRSA/ICJcblJlcXVlc3Q6ICIgKyByZXF1ZXN0IDogIiIpKTsKKworICAgICAgICBmaW5hbCBJbnRlbnQgcmVxdWVzdEludGVudCA9IG5ldyBJbnRlbnQoQUNUSU9OX1JFUVVFU1QpCisgICAgICAgICAgICAgICAgLnNldENvbXBvbmVudCh0YXJnZXRSZWNlaXZlcikKKyAgICAgICAgICAgICAgICAuYWRkRmxhZ3MoSW50ZW50LkZMQUdfUkVDRUlWRVJfRk9SRUdST1VORCkKKyAgICAgICAgICAgICAgICAucHV0RXh0cmEoRVhUUkFfUEFZTE9BRCwgcmVxdWVzdFRvQnl0ZXMocmVxdWVzdCkpOworCisgICAgICAgIC8vIFNlbmQgaXQuCisgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworICAgICAgICBmaW5hbCBBdG9taWNSZWZlcmVuY2U8QnVuZGxlPiByZXNwb25zZUJ1bmRsZSA9IG5ldyBBdG9taWNSZWZlcmVuY2U8PigpOworCisgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKS5zZW5kT3JkZXJlZEJyb2FkY2FzdCgKKyAgICAgICAgICAgICAgICByZXF1ZXN0SW50ZW50LCBudWxsLCBuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZUJ1bmRsZS5zZXQoZ2V0UmVzdWx0RXh0cmFzKGZhbHNlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sIHNNYWluSGFuZGxlciwgMCwgbnVsbCwgbnVsbCk7CisKKyAgICAgICAgLy8gV2FpdCBmb3IgYSByZXBseSBhbmQgY2hlY2sgaXQuCisgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVzcG9uc2VBcnJpdmVkID0gbGF0Y2guYXdhaXQoNjAsIFRpbWVVbml0LlNFQ09ORFMpOworICAgICAgICBhc3NlcnRUcnVlKCJEaWRuJ3QgcmVjZWl2ZSBicm9hZGNhc3QgcmVzdWx0LiIsIHJlc3BvbnNlQXJyaXZlZCk7CisKKyAgICAgICAgLy8gVE9ETyBJZiByZXNwb25zZUFycml2ZWQgaXMgZmFsc2UsIHByaW50IGlmIHRoZSBwYWNrYWdlIC8gY29tcG9uZW50IGlzIGluc3RhbGxlZD8KKworICAgICAgICBhc3NlcnROb3ROdWxsKCJEaWRuJ3QgcmVjZWl2ZSByZXN1bHQgZXh0cmFzIiwgcmVzcG9uc2VCdW5kbGUuZ2V0KCkpOworCisgICAgICAgIGZpbmFsIFN0cmluZyBleGNlcHRpb24gPSByZXNwb25zZUJ1bmRsZS5nZXQoKS5nZXRTdHJpbmcoRVhUUkFfRVhDRVBUSU9OKTsKKyAgICAgICAgaWYgKGV4Y2VwdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBmYWlsKCJUYXJnZXQgdGhyb3cgZXhjZXB0aW9uOiByZWNlaXZlcj0iICsgdGFyZ2V0UmVjZWl2ZXIKKyAgICAgICAgICAgICAgICAgICAgKyAiXG5FeGNlcHRpb246ICIgKyBleGNlcHRpb24pOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgYnl0ZVtdIHJlc3VsdFBheWxvYWQgPSByZXNwb25zZUJ1bmRsZS5nZXQoKS5nZXRCeXRlQXJyYXkoRVhUUkFfUEFZTE9BRCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoIkRpZG4ndCByZWNlaXZlIHJlc3VsdCBwYXlsb2FkIiwgcmVzdWx0UGF5bG9hZCk7CisKKyAgICAgICAgTG9nLmkoVEFHLCAiUmVzcG9uc2UgcmVjZWl2ZWQ6ICIgKyAoVkVSQk9TRSA/IHJlc3VsdFBheWxvYWQudG9TdHJpbmcoKSA6ICIiKSk7CisKKyAgICAgICAgcmV0dXJuIGJ5dGVzVG9SZXNwb25zZShyZXN1bHRQYXlsb2FkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCYXNlIGNsYXNzIGZvciBhIHJlY2VpdmVyIGZvciBhIGJyb2FkY2FzdC1iYXNlZCBSUEMuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBSZWNlaXZlckJhc2U8VFJlcXVlc3QsIFRSZXNwb25zZT4gZXh0ZW5kcyBCcm9hZGNhc3RSZWNlaXZlciB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgZmluYWwgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoQUNUSU9OX1JFUVVFU1QsIGludGVudC5nZXRBY3Rpb24oKSk7CisKKyAgICAgICAgICAgIC8vIFBhcnNlIHRoZSByZXF1ZXN0LgorICAgICAgICAgICAgZmluYWwgVFJlcXVlc3QgcmVxdWVzdCA9IGJ5dGVzVG9SZXF1ZXN0KGludGVudC5nZXRCeXRlQXJyYXlFeHRyYShFWFRSQV9QQVlMT0FEKSk7CisKKyAgICAgICAgICAgIExvZy5pKFRBRywgIlJlcXVlc3QgcmVjZWl2ZWQ6ICIgKyAoVkVSQk9TRSA/IHJlcXVlc3QudG9TdHJpbmcoKSA6ICIiKSk7CisKKyAgICAgICAgICAgIFRocm93YWJsZSBleGNlcHRpb24gPSBudWxsOworCisgICAgICAgICAgICAvLyBIYW5kbGUgaXQgYW5kIGdlbmVyYXRlIGEgcmVzcG9uc2UuCisgICAgICAgICAgICBUUmVzcG9uc2UgcmVzcG9uc2UgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXNwb25zZSA9IGhhbmRsZVJlcXVlc3QoY29udGV4dCwgcmVxdWVzdCk7CisgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiUmVzcG9uc2UgZ2VuZXJhdGVkOiAiICsgKFZFUkJPU0UgPyByZXNwb25zZS50b1N0cmluZygpIDogIiIpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICAgICAgZXhjZXB0aW9uID0gZTsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJFeGNlcHRpb24gdGhyb3duOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBTZW5kIGJhY2suCisgICAgICAgICAgICBmaW5hbCBCdW5kbGUgZXh0cmFzID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgaWYgKHJlc3BvbnNlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBleHRyYXMucHV0Qnl0ZUFycmF5KEVYVFJBX1BBWUxPQUQsIHJlc3BvbnNlVG9CeXRlcyhyZXNwb25zZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZXh0cmFzLnB1dFN0cmluZyhFWFRSQV9FWENFUFRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb24udG9TdHJpbmcoKSArICJcbiIgKyBMb2cuZ2V0U3RhY2tUcmFjZVN0cmluZyhleGNlcHRpb24pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldFJlc3VsdEV4dHJhcyhleHRyYXMpOworICAgICAgICB9CisKKyAgICAgICAgLyoqIEltcGxlbWVudCBpbiBhIHN1YmNsYXNzICovCisgICAgICAgIHByb3RlY3RlZCBhYnN0cmFjdCBUUmVzcG9uc2UgaGFuZGxlUmVxdWVzdChDb250ZXh0IGNvbnRleHQsIFRSZXF1ZXN0IHJlcXVlc3QpCisgICAgICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbjsKKworICAgICAgICAvKiogSW1wbGVtZW50IGluIGEgc3ViY2xhc3MgKi8KKyAgICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IGJ5dGVbXSByZXNwb25zZVRvQnl0ZXMoVFJlc3BvbnNlIHJlc3BvbnNlKTsKKworICAgICAgICAvKiogSW1wbGVtZW50IGluIGEgc3ViY2xhc3MgKi8KKyAgICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IFRSZXF1ZXN0IGJ5dGVzVG9SZXF1ZXN0KGJ5dGVbXSBieXRlcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2RldmljZS1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQnVuZGxlVXRpbHMuamF2YSBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0J1bmRsZVV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRhNjQxZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0J1bmRsZVV0aWxzLmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWw7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKKworcHVibGljIGNsYXNzIEJ1bmRsZVV0aWxzIHsKKyAgICBwcml2YXRlIEJ1bmRsZVV0aWxzKCkgeworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQnVuZGxlIG1ha2VCdW5kbGUoT2JqZWN0Li4uIGtleXNBbmRWYWx1ZXMpIHsKKyAgICAgICAgaWYgKChrZXlzQW5kVmFsdWVzLmxlbmd0aCAlIDIpICE9IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkFyZ3VtZW50IGNvdW50IG5vdCBldmVuLiIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGtleXNBbmRWYWx1ZXMubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGZpbmFsIEJ1bmRsZSByZXQgPSBuZXcgQnVuZGxlKCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IGtleXNBbmRWYWx1ZXMubGVuZ3RoIC0gMjsgaSA+PSAwOyBpIC09IDIpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBrZXkgPSBrZXlzQW5kVmFsdWVzW2ldLnRvU3RyaW5nKCk7CisgICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUgPSBrZXlzQW5kVmFsdWVzW2kgKyAxXTsKKworICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXQucHV0U3RyaW5nKGtleSwgbnVsbCk7CisKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuKSB7CisgICAgICAgICAgICAgICAgcmV0LnB1dEJvb2xlYW4oa2V5LCAoQm9vbGVhbikgdmFsdWUpOworCisgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgSW50ZWdlcikgeworICAgICAgICAgICAgICAgIHJldC5wdXRJbnQoa2V5LCAoSW50ZWdlcikgdmFsdWUpOworCisgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7CisgICAgICAgICAgICAgICAgcmV0LnB1dFN0cmluZyhrZXksIChTdHJpbmcpIHZhbHVlKTsKKworICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEJ1bmRsZSkgeworICAgICAgICAgICAgICAgIHJldC5wdXRCdW5kbGUoa2V5LCAoQnVuZGxlKSB2YWx1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiVHlwZSBub3Qgc3VwcG9ydGVkIHlldDogIiArIHZhbHVlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0J1c2luZXNzTG9naWNDb25kaXRpb25hbFRlc3RDYXNlLmphdmEgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9CdXNpbmVzc0xvZ2ljQ29uZGl0aW9uYWxUZXN0Q2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMmNhYTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9CdXNpbmVzc0xvZ2ljQ29uZGl0aW9uYWxUZXN0Q2FzZS5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsOworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKKworLyoqCisgKiAgRGV2aWNlLXNpZGUgYmFzZSBjbGFzcyBmb3IgdGVzdHMgbGV2ZXJhZ2luZyB0aGUgQnVzaW5lc3MgTG9naWMgc2VydmljZSBmb3IgcnVsZXMgdGhhdCBhcmUKKyAqICBjb25kaXRpb25hbGx5IGFkZGVkIGJhc2VkIG9uIHRoZSBkZXZpY2UgY2hhcmFjdGVyaXN0aWNzLgorICovCitwdWJsaWMgY2xhc3MgQnVzaW5lc3NMb2dpY0NvbmRpdGlvbmFsVGVzdENhc2UgZXh0ZW5kcyBCdXNpbmVzc0xvZ2ljVGVzdENhc2UgeworCisgICAgQE92ZXJyaWRlCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIGhhbmRsZUJ1c2luZXNzTG9naWMoKSB7CisgICAgICAgIHN1cGVyLmxvYWRCdXNpbmVzc0xvZ2ljKCk7CisgICAgICAgIGVuc3VyZUF1dGhlbnRpY2F0ZWQoKTsKKyAgICAgICAgc3VwZXIuZXhlY3V0ZUJ1c2luZXNzTG9naWMoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBlbnN1cmVBdXRoZW50aWNhdGVkKCkgeworICAgICAgICBpZiAoIW1DYW5SZWFkQnVzaW5lc3NMb2dpYykgeworICAgICAgICAgICAgLy8gc3VwZXIgY2xhc3MgaGFuZGxlcyB0aGUgY29uZGl0aW9uIHRoYXQgdGhlIHNlcnZpY2UgaXMgdW5hdmFpbGFibGUuCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW1CdXNpbmVzc0xvZ2ljLm1Db25kaXRpb25hbFRlc3RzRW5hYmxlZCkgeworICAgICAgICAgICAgc2tpcFRlc3QoIkV4ZWN1dGlvbiBvZiBkZXZpY2Ugc3BlY2lmaWMgdGVzdHMgaXMgbm90IGVuYWJsZWQuICIKKyAgICAgICAgICAgICAgICAgICAgKyAiRW5hYmxlIHdpdGggJy0tY29uZGl0aW9uYWwtYnVzaW5lc3MtbG9naWMtdGVzdHMtZW5hYmxlZCciKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtQnVzaW5lc3NMb2dpYy5pc0F1dGhvcml6ZWQoKSkgeworICAgICAgICAgICAgLy8gUnVuIHRlc3QgYXMgbm9ybWFsLgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBtZXNzYWdlID0gbUJ1c2luZXNzTG9naWMuZ2V0QXV0aGVudGljYXRpb25TdGF0dXNNZXNzYWdlKCk7CisKKyAgICAgICAgLy8gRmFpbCB0ZXN0IHNpbmNlIHJlcXVlc3Qgd2FzIG5vdCBhdXRob3JpemVkLgorICAgICAgICBmYWlsVGVzdChTdHJpbmcuZm9ybWF0KCJVbmFibGUgdG8gZXhlY3V0ZSBiZWNhdXNlICVzLiIsIG1lc3NhZ2UpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9CdXNpbmVzc0xvZ2ljRGV2aWNlRXhlY3V0b3IuamF2YSBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0J1c2luZXNzTG9naWNEZXZpY2VFeGVjdXRvci5qYXZhCmluZGV4IGVjOTQwY2UuLjdkN2FhZjAgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0J1c2luZXNzTG9naWNEZXZpY2VFeGVjdXRvci5qYXZhCisrKyBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0J1c2luZXNzTG9naWNEZXZpY2VFeGVjdXRvci5qYXZhCkBAIC0xNyw2ICsxNyw4IEBACiBwYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWw7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKQEAgLTQ3LDYgKzQ5LDMwIEBACiAgICAgICoge0Bpbmhlcml0RG9jfQogICAgICAqLwogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGxvZ0luZm8oU3RyaW5nIGZvcm1hdCwgT2JqZWN0Li4uIGFyZ3MpIHsKKyAgICAgICAgTG9nLmkoTE9HX1RBRywgU3RyaW5nLmZvcm1hdChmb3JtYXQsIGFyZ3MpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgbG9nRGVidWcoU3RyaW5nIGZvcm1hdCwgT2JqZWN0Li4uIGFyZ3MpIHsKKyAgICAgICAgTG9nLmQoTE9HX1RBRywgU3RyaW5nLmZvcm1hdChmb3JtYXQsIGFyZ3MpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFN0cmluZyBmb3JtYXRFeGVjdXRpb25TdHJpbmcoU3RyaW5nIG1ldGhvZCwgU3RyaW5nLi4uIGFyZ3MpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIiVzKCVzKSIsIG1ldGhvZCwgVGV4dFV0aWxzLmpvaW4oIiwgIiwgYXJncykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgUmVzb2x2ZWRNZXRob2QgZ2V0UmVzb2x2ZWRNZXRob2QoQ2xhc3MgY2xzLCBTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nLi4uIGFyZ3MpCiAgICAgICAgICAgICB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CiAgICAgICAgIExpc3Q8TWV0aG9kPiBuYW1lTWF0Y2hlcyA9IGdldE1ldGhvZHNXaXRoTmFtZShjbHMsIG1ldGhvZE5hbWUpOwpkaWZmIC0tZ2l0IGEvY29tbW9uL2RldmljZS1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQnVzaW5lc3NMb2dpY1Rlc3RDYXNlLmphdmEgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9CdXNpbmVzc0xvZ2ljVGVzdENhc2UuamF2YQppbmRleCAyMzE2NjM3Li42NzFkMzNiIDEwMDY0NAotLS0gYS9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9CdXNpbmVzc0xvZ2ljVGVzdENhc2UuamF2YQorKysgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9CdXNpbmVzc0xvZ2ljVGVzdENhc2UuamF2YQpAQCAtNDUsMjEgKzQ1LDE2IEBACiAgICAgLyogVGVzdCBuYW1lIHJ1bGUgdGhhdCB0cmFja3MgdGhlIGN1cnJlbnQgdGVzdCBtZXRob2QgdW5kZXIgZXhlY3V0aW9uICovCiAgICAgQFJ1bGUgcHVibGljIFRlc3ROYW1lIG1UZXN0Q2FzZSA9IG5ldyBUZXN0TmFtZSgpOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgQnVzaW5lc3NMb2dpYyBtQnVzaW5lc3NMb2dpYzsKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIG1DYW5SZWFkQnVzaW5lc3NMb2dpYyA9IHRydWU7Ci0KLSAgICBAQmVmb3JlQ2xhc3MKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJlcGFyZUJ1c2luZXNzTG9naWMoKSB7Ci0gICAgICAgIEZpbGUgYnVzaW5lc3NMb2dpY0ZpbGUgPSBuZXcgRmlsZShCdXNpbmVzc0xvZ2ljLkRFVklDRV9GSUxFKTsKLSAgICAgICAgaWYgKGJ1c2luZXNzTG9naWNGaWxlLmNhblJlYWQoKSkgewotICAgICAgICAgICAgbUJ1c2luZXNzTG9naWMgPSBCdXNpbmVzc0xvZ2ljRmFjdG9yeS5jcmVhdGVGcm9tRmlsZShidXNpbmVzc0xvZ2ljRmlsZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQ2FuUmVhZEJ1c2luZXNzTG9naWMgPSBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KKyAgICBwcm90ZWN0ZWQgQnVzaW5lc3NMb2dpYyBtQnVzaW5lc3NMb2dpYzsKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtQ2FuUmVhZEJ1c2luZXNzTG9naWMgPSB0cnVlOwogCiAgICAgQEJlZm9yZQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGVCdXNpbmVzc0xvZ2ljKCkgeworICAgIHB1YmxpYyB2b2lkIGhhbmRsZUJ1c2luZXNzTG9naWMoKSB7CisgICAgICAgIGxvYWRCdXNpbmVzc0xvZ2ljKCk7CisgICAgICAgIGV4ZWN1dGVCdXNpbmVzc0xvZ2ljKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZUJ1c2luZXNzTG9naWMoKSB7CiAgICAgICAgIFN0cmluZyBtZXRob2ROYW1lID0gbVRlc3RDYXNlLmdldE1ldGhvZE5hbWUoKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJUZXN0IFwiJXNcIiBpcyB1bmFibGUgdG8gZXhlY3V0ZSBhcyBpdCBkZXBlbmRzIG9uIHRoZSBtaXNzaW5nICIKICAgICAgICAgICAgICAgICArICJyZW1vdGUgY29uZmlndXJhdGlvbi4iLCBtZXRob2ROYW1lKSwgbUNhblJlYWRCdXNpbmVzc0xvZ2ljKTsKQEAgLTc1LDYgKzcwLDE1IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcm90ZWN0ZWQgdm9pZCBsb2FkQnVzaW5lc3NMb2dpYygpIHsKKyAgICAgICAgRmlsZSBidXNpbmVzc0xvZ2ljRmlsZSA9IG5ldyBGaWxlKEJ1c2luZXNzTG9naWMuREVWSUNFX0ZJTEUpOworICAgICAgICBpZiAoYnVzaW5lc3NMb2dpY0ZpbGUuY2FuUmVhZCgpKSB7CisgICAgICAgICAgICBtQnVzaW5lc3NMb2dpYyA9IEJ1c2luZXNzTG9naWNGYWN0b3J5LmNyZWF0ZUZyb21GaWxlKGJ1c2luZXNzTG9naWNGaWxlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1DYW5SZWFkQnVzaW5lc3NMb2dpYyA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCiAgICAgcHJvdGVjdGVkIHN0YXRpYyBJbnN0cnVtZW50YXRpb24gZ2V0SW5zdHJ1bWVudGF0aW9uKCkgewogICAgICAgICByZXR1cm4gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2RldmljZS1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQ2FsbGJhY2tBc3NlcnRlci5qYXZhIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQ2FsbGJhY2tBc3NlcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNjE2MWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9DYWxsYmFja0Fzc2VydGVyLmphdmEKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsOworCitpbXBvcnQgc3RhdGljIGp1bml0LmZyYW1ld29yay5Bc3NlcnQuZmFpbDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlOworCisvKioKKyAqIENhbGxiYWNrQXNzZXJ0ZXIgaGVscHMgd2FpdCB1bnRpbCBhIGNhbGxiYWNrIGlzIGNhbGxlZC4KKyAqLworcHVibGljIGNsYXNzIENhbGxiYWNrQXNzZXJ0ZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQ2FsbGJhY2tBc3NlcnRlciI7CisKKyAgICBmaW5hbCBDb3VudERvd25MYXRjaCBtTGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisKKyAgICBDYWxsYmFja0Fzc2VydGVyKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGwgdGhpcyB0byBhc3NlcnQgYSBjYWxsYmFjayBiZSBjYWxsZWQgd2l0aGluIHRoZSBnaXZlbiB0aW1lb3V0LgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGFzc2VydENhbGxlZChTdHJpbmcgbWVzc2FnZSwgaW50IHRpbWVvdXRTZWNvbmRzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChtTGF0Y2guYXdhaXQodGltZW91dFNlY29uZHMsIFRpbWVVbml0LlNFQ09ORFMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmFpbCgiRGlkbid0IHJlY2VpdmUgY2FsbGJhY2s6ICIgKyBtZXNzYWdlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGNsZWFuVXAoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgY2xlYW5VcCgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2UgZm9yIGEgYnJvYWRjYXN0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ2FsbGJhY2tBc3NlcnRlciBmb3JCcm9hZGNhc3QoSW50ZW50RmlsdGVyIGZpbHRlcikgeworICAgICAgICByZXR1cm4gZm9yQnJvYWRjYXN0KGZpbHRlciwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIGZvciBhIGJyb2FkY2FzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENhbGxiYWNrQXNzZXJ0ZXIgZm9yQnJvYWRjYXN0KEludGVudEZpbHRlciBmaWx0ZXIsIFByZWRpY2F0ZTxJbnRlbnQ+IGNoZWNrZXIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCcm9hZGNhc3RBc3NlcnRlcihmaWx0ZXIsIGNoZWNrZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBmb3IgYSBjb250ZW50IGNoYW5nZWQgbm90aWZpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ2FsbGJhY2tBc3NlcnRlciBmb3JDb250ZW50VXJpKFVyaSB3YXRjaFVyaSkgeworICAgICAgICByZXR1cm4gZm9yQ29udGVudFVyaSh3YXRjaFVyaSwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIGZvciBhIGNvbnRlbnQgY2hhbmdlZCBub3RpZmljYXRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDYWxsYmFja0Fzc2VydGVyIGZvckNvbnRlbnRVcmkoVXJpIHdhdGNoVXJpLCBQcmVkaWNhdGU8VXJpPiBjaGVja2VyKSB7CisgICAgICAgIHJldHVybiBuZXcgQ29udGVudE9ic2VydmVyQXNzZXJ0ZXIod2F0Y2hVcmksIGNoZWNrZXIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEJyb2FkY2FzdEFzc2VydGVyIGV4dGVuZHMgQ2FsbGJhY2tBc3NlcnRlciB7CisgICAgICAgIHByaXZhdGUgZmluYWwgQnJvYWRjYXN0UmVjZWl2ZXIgbVJlY2VpdmVyOworCisgICAgICAgIEJyb2FkY2FzdEFzc2VydGVyKEludGVudEZpbHRlciBmaWx0ZXIsIFByZWRpY2F0ZTxJbnRlbnQ+IGNoZWNrZXIpIHsKKyAgICAgICAgICAgIG1SZWNlaXZlciA9IG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaGVja2VyICE9IG51bGwgJiYgIWNoZWNrZXIudGVzdChpbnRlbnQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJJZ25vcmluZyBpbnRlbnQ6ICIgKyBpbnRlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1MYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpLnJlZ2lzdGVyUmVjZWl2ZXIobVJlY2VpdmVyLCBmaWx0ZXIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHZvaWQgY2xlYW5VcCgpIHsKKyAgICAgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKS51bnJlZ2lzdGVyUmVjZWl2ZXIobVJlY2VpdmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENvbnRlbnRPYnNlcnZlckFzc2VydGVyIGV4dGVuZHMgQ2FsbGJhY2tBc3NlcnRlciB7CisgICAgICAgIHByaXZhdGUgZmluYWwgQ29udGVudE9ic2VydmVyIG1PYnNlcnZlcjsKKworICAgICAgICBDb250ZW50T2JzZXJ2ZXJBc3NlcnRlcihVcmkgd2F0Y2hVcmksIFByZWRpY2F0ZTxVcmk+IGNoZWNrZXIpIHsKKyAgICAgICAgICAgIG1PYnNlcnZlciA9IG5ldyBDb250ZW50T2JzZXJ2ZXIobnVsbCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2hhbmdlKGJvb2xlYW4gc2VsZkNoYW5nZSwgVXJpIHVyaSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tlciAhPSBudWxsICYmICFjaGVja2VyLnRlc3QodXJpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiSWdub3Jpbmcgbm90aWZpY2F0aW9uIG9uIFVSSTogIiArIHVyaSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbUxhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCkuZ2V0Q29udGVudFJlc29sdmVyKCkucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoCisgICAgICAgICAgICAgICAgICAgIHdhdGNoVXJpLCB0cnVlLCBtT2JzZXJ2ZXIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHZvaWQgY2xlYW5VcCgpIHsKKyAgICAgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKS5nZXRDb250ZW50UmVzb2x2ZXIoKS51bnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKAorICAgICAgICAgICAgICAgICAgICBtT2JzZXJ2ZXIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2RldmljZS1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQ29ubmVjdGl2aXR5VXRpbHMuamF2YSBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0Nvbm5lY3Rpdml0eVV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDlhMGE4NQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0Nvbm5lY3Rpdml0eVV0aWxzLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWw7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5uZXQuQ29ubmVjdGl2aXR5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbzsKKworcHVibGljIGNsYXNzIENvbm5lY3Rpdml0eVV0aWxzIHsKKyAgICBwcml2YXRlIENvbm5lY3Rpdml0eVV0aWxzKCkgeworICAgIH0KKworICAgIC8qKiBAcmV0dXJuIHRydWUgd2hlbiB0aGUgZGV2aWNlIGhhcyBhIG5ldHdvcmsgY29ubmVjdGlvbi4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNOZXR3b3JrQ29ubmVjdGVkKENvbnRleHQgY29udGV4dCkgeworICAgICAgICBmaW5hbCBOZXR3b3JrSW5mbyBuZXR3b3JrSW5mbyA9IGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb25uZWN0aXZpdHlNYW5hZ2VyLmNsYXNzKQorICAgICAgICAgICAgICAgIC5nZXRBY3RpdmVOZXR3b3JrSW5mbygpOworICAgICAgICByZXR1cm4gKG5ldHdvcmtJbmZvICE9IG51bGwpICYmIG5ldHdvcmtJbmZvLmlzQ29ubmVjdGVkKCk7CisgICAgfQorCisgICAgLyoqIEFzc2VydCB0aGF0IHRoZSBkZXZpY2UgaGFzIGEgbmV0d29yayBjb25uZWN0aW9uLiAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnROZXR3b3JrQ29ubmVjdGVkKENvbnRleHQgY29udGV4dCkgeworICAgICAgICBhc3NlcnRUcnVlKCJOZXR3b3JrIG11c3QgYmUgY29ubmVjdGVkIiwgaXNOZXR3b3JrQ29ubmVjdGVkKGNvbnRleHQpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9DdHNNb3VzZVV0aWwuamF2YSBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0N0c01vdXNlVXRpbC5qYXZhCmluZGV4IGM4OWFmYTMuLjk5MjI4ZmUgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0N0c01vdXNlVXRpbC5qYXZhCisrKyBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0N0c01vdXNlVXRpbC5qYXZhCkBAIC0yNyw4ICsyNyw4IEBACiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogCitpbXBvcnQgb3JnLm1vY2tpdG8uQXJndW1lbnRNYXRjaGVyOwogaW1wb3J0IG9yZy5tb2NraXRvLkluT3JkZXI7Ci1pbXBvcnQgb3JnLm1vY2tpdG8uY29tcGF0LkFyZ3VtZW50TWF0Y2hlcjsKIAogcHVibGljIGZpbmFsIGNsYXNzIEN0c01vdXNlVXRpbCB7CiAKQEAgLTYzLDcgKzYzLDcgQEAKICAgICAgICAgcmV0dXJuIGV2ZW50OwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQWN0aW9uTWF0Y2hlciBleHRlbmRzIEFyZ3VtZW50TWF0Y2hlcjxNb3Rpb25FdmVudD4geworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQWN0aW9uTWF0Y2hlciBpbXBsZW1lbnRzIEFyZ3VtZW50TWF0Y2hlcjxNb3Rpb25FdmVudD4gewogICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtQWN0aW9uOwogCiAgICAgICAgIHB1YmxpYyBBY3Rpb25NYXRjaGVyKGludCBhY3Rpb24pIHsKQEAgLTcxLDggKzcxLDggQEAKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzT2JqZWN0KE9iamVjdCBhY3R1YWwpIHsKLSAgICAgICAgICAgIHJldHVybiAoYWN0dWFsIGluc3RhbmNlb2YgTW90aW9uRXZlbnQpICYmICgoTW90aW9uRXZlbnQpIGFjdHVhbCkuZ2V0QWN0aW9uKCkgPT0gbUFjdGlvbjsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhNb3Rpb25FdmVudCBhY3R1YWwpIHsKKyAgICAgICAgICAgIHJldHVybiBhY3R1YWwuZ2V0QWN0aW9uKCkgPT0gbUFjdGlvbjsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQpAQCAtOTIsMTAgKzkyLDEwIEBACiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlc09iamVjdChPYmplY3QgYWN0dWFsKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3VwZXIubWF0Y2hlc09iamVjdChhY3R1YWwpCi0gICAgICAgICAgICAgICAgICAgICYmICgoaW50KSAoKE1vdGlvbkV2ZW50KSBhY3R1YWwpLmdldFgoKSkgPT0gbVgKLSAgICAgICAgICAgICAgICAgICAgJiYgKChpbnQpICgoTW90aW9uRXZlbnQpIGFjdHVhbCkuZ2V0WSgpKSA9PSBtWTsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhNb3Rpb25FdmVudCBhY3R1YWwpIHsKKyAgICAgICAgICAgIHJldHVybiBzdXBlci5tYXRjaGVzKGFjdHVhbCkKKyAgICAgICAgICAgICAgICAgICAgJiYgKChpbnQpIGFjdHVhbC5nZXRYKCkpID09IG1YCisgICAgICAgICAgICAgICAgICAgICYmICgoaW50KSBhY3R1YWwuZ2V0WSgpKSA9PSBtWTsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvY29tbW9uL2RldmljZS1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvRGV2aWNlUmVwb3J0TG9nLmphdmEgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9EZXZpY2VSZXBvcnRMb2cuamF2YQppbmRleCAxZDg3MmE4Li5kMTcwMjYzIDEwMDY0NAotLS0gYS9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9EZXZpY2VSZXBvcnRMb2cuamF2YQorKysgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9EZXZpY2VSZXBvcnRMb2cuamF2YQpAQCAtMjEsMTAgKzIxLDYgQEAKIGltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlJlcG9ydExvZzsKLQotaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247Ci0KIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKQEAgLTQ0LDE3ICs0MCwyMiBAQAogICAgIHByaXZhdGUgUmVwb3J0TG9nRGV2aWNlSW5mb1N0b3JlIHN0b3JlOwogCiAgICAgcHVibGljIERldmljZVJlcG9ydExvZyhTdHJpbmcgcmVwb3J0TG9nTmFtZSwgU3RyaW5nIHN0cmVhbU5hbWUpIHsKKyAgICAgICAgdGhpcyhyZXBvcnRMb2dOYW1lLCBzdHJlYW1OYW1lLAorICAgICAgICAgICAgICAgIG5ldyBGaWxlKEVudmlyb25tZW50LmdldEV4dGVybmFsU3RvcmFnZURpcmVjdG9yeSgpLCAicmVwb3J0LWxvZy1maWxlcyIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRGV2aWNlUmVwb3J0TG9nKFN0cmluZyByZXBvcnRMb2dOYW1lLCBTdHJpbmcgc3RyZWFtTmFtZSwgRmlsZSBsb2dEaXJlY3RvcnkpIHsKICAgICAgICAgc3VwZXIocmVwb3J0TG9nTmFtZSwgc3RyZWFtTmFtZSk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAvLyBkaXIgdmFsdWUgbXVzdCBtYXRjaCB0aGUgc3JjLWRpciB2YWx1ZSBjb25maWd1cmVkIGluIFJlcG9ydExvZ0NvbGxlY3RvciB0YXJnZXQKLSAgICAgICAgICAgIC8vIHByZXBhcmVyIGluIGN0cy90b29scy9jdHMtdHJhZGVmZWQvcmVzL2NvbmZpZy9jdHMtcHJlY29uZGl0aW9ucy54bWwKLSAgICAgICAgICAgIGZpbmFsIEZpbGUgZGlyID0gbmV3IEZpbGUoRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlRGlyZWN0b3J5KCksICJyZXBvcnQtbG9nLWZpbGVzIik7CisgICAgICAgICAgICAvLyBwcmVwYXJlciBpbiBjdHMvaGFybmVzcy90b29scy9jdHMtdHJhZGVmZWQvcmVzL2NvbmZpZy9jdHMtcHJlY29uZGl0aW9ucy54bWwKICAgICAgICAgICAgIGlmICghRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlU3RhdGUoKS5lcXVhbHMoRW52aXJvbm1lbnQuTUVESUFfTU9VTlRFRCkpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkV4dGVybmFsIHN0b3JhZ2UgaXMgbm90IG1vdW50ZWQiKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIWRpci5ta2RpcnMoKSAmJiAhZGlyLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKCFsb2dEaXJlY3RvcnkuZXhpc3RzKCkgJiYgIWxvZ0RpcmVjdG9yeS5ta2RpcnMoKSkKKyAgICAgICAgICAgICAgICAgICAgfHwgKGxvZ0RpcmVjdG9yeS5leGlzdHMoKSAmJiAhbG9nRGlyZWN0b3J5LmlzRGlyZWN0b3J5KCkpKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDYW5ub3QgY3JlYXRlIGRpcmVjdG9yeSBmb3IgZGV2aWNlIGluZm8gZmlsZXMiKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgRmlsZSBqc29uRmlsZSA9IG5ldyBGaWxlKGRpciwgbVJlcG9ydExvZ05hbWUgKyAiLnJlcG9ydGxvZy5qc29uIik7CisgICAgICAgICAgICAgICAgRmlsZSBqc29uRmlsZSA9IG5ldyBGaWxlKGxvZ0RpcmVjdG9yeSwgbVJlcG9ydExvZ05hbWUgKyAiLnJlcG9ydGxvZy5qc29uIik7CiAgICAgICAgICAgICAgICAgc3RvcmUgPSBuZXcgUmVwb3J0TG9nRGV2aWNlSW5mb1N0b3JlKGpzb25GaWxlLCBtU3RyZWFtTmFtZSk7CiAgICAgICAgICAgICAgICAgc3RvcmUub3BlbigpOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2RldmljZS1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvRHluYW1pY0NvbmZpZ0RldmljZVNpZGUuamF2YSBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0R5bmFtaWNDb25maWdEZXZpY2VTaWRlLmphdmEKaW5kZXggYjUwYjRmNy4uZTdlZTQ5OSAxMDA2NDQKLS0tIGEvY29tbW9uL2RldmljZS1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvRHluYW1pY0NvbmZpZ0RldmljZVNpZGUuamF2YQorKysgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9EeW5hbWljQ29uZmlnRGV2aWNlU2lkZS5qYXZhCkBAIC0xNyw3ICsxNyw2IEBACiBwYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWw7CiAKIGltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIGltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOwogCkBAIC0yOCwxNCArMjcsMTYgQEAKICAqIExvYWQgZHluYW1pYyBjb25maWcgZm9yIGRldmljZSBzaWRlIHRlc3QgY2FzZXMKICAqLwogcHVibGljIGNsYXNzIER5bmFtaWNDb25maWdEZXZpY2VTaWRlIGV4dGVuZHMgRHluYW1pY0NvbmZpZyB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgTE9HX1RBRyA9IER5bmFtaWNDb25maWdEZXZpY2VTaWRlLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKLQogICAgIHB1YmxpYyBEeW5hbWljQ29uZmlnRGV2aWNlU2lkZShTdHJpbmcgbW9kdWxlTmFtZSkgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcyhtb2R1bGVOYW1lLCBuZXcgRmlsZShDT05GSUdfRk9MREVSX09OX0RFVklDRSkpOworICAgIH0KKworICAgIHB1YmxpYyBEeW5hbWljQ29uZmlnRGV2aWNlU2lkZShTdHJpbmcgbW9kdWxlTmFtZSwgRmlsZSBjb25maWdGb2xkZXIpCisgICAgICAgICAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogICAgICAgICBpZiAoIUVudmlyb25tZW50LmdldEV4dGVybmFsU3RvcmFnZVN0YXRlKCkuZXF1YWxzKEVudmlyb25tZW50Lk1FRElBX01PVU5URUQpKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkV4dGVybmFsIHN0b3JhZ2UgaXMgbm90IG1vdW50ZWQiKTsKICAgICAgICAgfQotICAgICAgICBGaWxlIGNvbmZpZ0ZpbGUgPSBnZXRDb25maWdGaWxlKG5ldyBGaWxlKENPTkZJR19GT0xERVJfT05fREVWSUNFKSwgbW9kdWxlTmFtZSk7CisgICAgICAgIEZpbGUgY29uZmlnRmlsZSA9IGdldENvbmZpZ0ZpbGUoY29uZmlnRm9sZGVyLCBtb2R1bGVOYW1lKTsKICAgICAgICAgaW5pdGlhbGl6ZUNvbmZpZyhjb25maWdGaWxlKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9GZWF0dXJlVXRpbC5qYXZhIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvRmVhdHVyZVV0aWwuamF2YQppbmRleCBlYmY4ODFhLi5jOTY4MWQyIDEwMDY0NAotLS0gYS9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9GZWF0dXJlVXRpbC5qYXZhCisrKyBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0ZlYXR1cmVVdGlsLmphdmEKQEAgLTE2LDggKzE2LDEwIEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKIAoraW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5GZWF0dXJlSW5mbzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7CiBpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CiAKQEAgLTI5LDYgKzMxLDcgQEAKICAqLwogcHVibGljIGNsYXNzIEZlYXR1cmVVdGlsIHsKIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVE9NT1RJVkVfRkVBVFVSRSA9ICJhbmRyb2lkLmhhcmR3YXJlLnR5cGUuYXV0b21vdGl2ZSI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVBTkJBQ0tfRkVBVFVSRSA9ICJhbmRyb2lkLnNvZnR3YXJlLmxlYW5iYWNrIjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT1dfUkFNX0ZFQVRVUkUgPSAiYW5kcm9pZC5oYXJkd2FyZS5yYW0ubG93IjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURUxFUEhPTllfRkVBVFVSRSA9ICJhbmRyb2lkLmhhcmR3YXJlLnRlbGVwaG9ueSI7CkBAIC04MiwxNyArODUsMzUgQEAKICAgICAgICAgcmV0dXJuIGhhc1N5c3RlbUZlYXR1cmUoV0FUQ0hfRkVBVFVSRSk7CiAgICAgfQogCisgICAgLyoqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGV2aWNlIGhhcyBmZWF0dXJlIEFVVE9NT1RJVkVfRkVBVFVSRSAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0F1dG9tb3RpdmUoKSB7CisgICAgICAgIHJldHVybiBoYXNTeXN0ZW1GZWF0dXJlKEFVVE9NT1RJVkVfRkVBVFVSRSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVnJIZWFkc2V0KCkgeworICAgICAgICBpbnQgbWFza2VkVWlNb2RlID0gKGdldENvbmZpZ3VyYXRpb24oKS51aU1vZGUgJiBDb25maWd1cmF0aW9uLlVJX01PREVfVFlQRV9NQVNLKTsKKyAgICAgICAgcmV0dXJuIChtYXNrZWRVaU1vZGUgPT0gQ29uZmlndXJhdGlvbi5VSV9NT0RFX1RZUEVfVlJfSEVBRFNFVCk7CisgICAgfQorCiAgICAgLyoqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGV2aWNlIGlzIGEgbG93IHJhbSBkZXZpY2U6Ci0gICAgICogIDEuIEFQSSBsZXZlbCAmZ3Q7PSBPCisgICAgICogIDEuIEFQSSBsZXZlbCAmZ3Q7PSBPX01SMQogICAgICAqICAyLiBkZXZpY2UgaGFzIGZlYXR1cmUgTE9XX1JBTV9GRUFUVVJFCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTG93UmFtKCkgewotICAgICAgICByZXR1cm4gQXBpTGV2ZWxVdGlsLmlzQXRMZWFzdChCdWlsZC5WRVJTSU9OX0NPREVTLk8pICYmCisgICAgICAgIHJldHVybiBBcGlMZXZlbFV0aWwuaXNBdExlYXN0KEJ1aWxkLlZFUlNJT05fQ09ERVMuT19NUjEpICYmCiAgICAgICAgICAgICAgICAgaGFzU3lzdGVtRmVhdHVyZShMT1dfUkFNX0ZFQVRVUkUpOwogICAgIH0KIAorICAgIHByaXZhdGUgc3RhdGljIENvbnRleHQgZ2V0Q29udGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLmdldFRhcmdldENvbnRleHQoKTsKKyAgICB9CisKICAgICBwcml2YXRlIHN0YXRpYyBQYWNrYWdlTWFuYWdlciBnZXRQYWNrYWdlTWFuYWdlcigpIHsKLSAgICAgICAgcmV0dXJuIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLmdldFRhcmdldENvbnRleHQoKS5nZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICByZXR1cm4gZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgQ29uZmlndXJhdGlvbiBnZXRDb25maWd1cmF0aW9uKCkgeworICAgICAgICByZXR1cm4gZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLmdldENvbmZpZ3VyYXRpb24oKTsKICAgICB9CiAKICAgICAvKiogUmV0dXJucyB0cnVlIGlmIHRoZSBkZXZpY2UgaGFzIGZlYXR1cmUgVEVMRVBIT05ZX0ZFQVRVUkUgKi8KZGlmZiAtLWdpdCBhL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL01lZGlhVXRpbHMuamF2YSBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL01lZGlhVXRpbHMuamF2YQppbmRleCBjN2QyZmE1Li4zZWE2YjYzIDEwMDY0NAotLS0gYS9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9NZWRpYVV0aWxzLmphdmEKKysrIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvTWVkaWFVdGlscy5qYXZhCkBAIC0xOTUsNiArMTk1LDEzIEBACiAgICAgICogIC0tLS0tLS0tLS0tLS0tLS0tLS0gSEVMUEVSIE1FVEhPRFMgRk9SIENIRUNLSU5HIENPREVDIFNVUFBPUlQgLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAqLwogCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzR29vZ2xlKFN0cmluZyBjb2RlY05hbWUpIHsKKyAgICAgICAgY29kZWNOYW1lID0gY29kZWNOYW1lLnRvTG93ZXJDYXNlKCk7CisgICAgICAgIHJldHVybiBjb2RlY05hbWUuc3RhcnRzV2l0aCgib214Lmdvb2dsZS4iKQorICAgICAgICAgICAgICAgIHx8IGNvZGVjTmFtZS5zdGFydHNXaXRoKCJjMi5hbmRyb2lkLiIpCisgICAgICAgICAgICAgICAgfHwgY29kZWNOYW1lLnN0YXJ0c1dpdGgoImMyLmdvb2dsZS4iKTsKKyAgICB9CisKICAgICAvLyByZXR1cm5zIHRoZSBsaXN0IG9mIGNvZGVjcyB0aGF0IHN1cHBvcnQgYW55IG9uZSBvZiB0aGUgZm9ybWF0cwogICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGdldENvZGVjTmFtZXMoCiAgICAgICAgICAgICBib29sZWFuIGlzRW5jb2RlciwgQm9vbGVhbiBpc0dvb2csIE1lZGlhRm9ybWF0Li4uIGZvcm1hdHMpIHsKQEAgLTIwNCw4ICsyMTEsNyBAQAogICAgICAgICAgICAgaWYgKGluZm8uaXNFbmNvZGVyKCkgIT0gaXNFbmNvZGVyKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaXNHb29nICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgaW5mby5nZXROYW1lKCkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCJvbXguZ29vZ2xlLiIpICE9IGlzR29vZykgeworICAgICAgICAgICAgaWYgKGlzR29vZyAhPSBudWxsICYmIGlzR29vZ2xlKGluZm8uZ2V0TmFtZSgpKSAhPSBpc0dvb2cpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvY29tbW9uL2RldmljZS1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvTW9yZU1hdGNoZXJzLmphdmEgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9Nb3JlTWF0Y2hlcnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWU2MTBlCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvTW9yZU1hdGNoZXJzLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWw7CisKK2ltcG9ydCBvcmcubW9ja2l0by5Bcmd1bWVudE1hdGNoZXJzOworCitwdWJsaWMgY2xhc3MgTW9yZU1hdGNoZXJzIHsKKyAgICBwcml2YXRlIE1vcmVNYXRjaGVycygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIDxUPiBUIGFueU9yTnVsbChDbGFzczxUPiBjbGF6eikgeworICAgICAgICByZXR1cm4gQXJndW1lbnRNYXRjaGVycy5hcmdUaGF0KHZhbHVlIC0+IHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGFueVN0cmluZ09yTnVsbCgpIHsKKyAgICAgICAgcmV0dXJuIEFyZ3VtZW50TWF0Y2hlcnMuYXJnVGhhdCh2YWx1ZSAtPiB0cnVlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9PbkZhaWx1cmVSdWxlLmphdmEgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9PbkZhaWx1cmVSdWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg1YzE0NQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL09uRmFpbHVyZVJ1bGUuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKKworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVzdFJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5EZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5tb2RlbC5TdGF0ZW1lbnQ7CisKKy8qKgorICogQ3VzdG9tIEpVbml0NCBydWxlIHRoYXQgcHJvdmlkZXMgYSBjYWxsYmFjayB1cG9uIHRlc3QgZmFpbHVyZXMuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBPbkZhaWx1cmVSdWxlIGltcGxlbWVudHMgVGVzdFJ1bGUgeworICAgIHByaXZhdGUgU3RyaW5nIG1Mb2dUYWcgPSAiT25GYWlsdXJlUnVsZSI7CisKKyAgICBwdWJsaWMgT25GYWlsdXJlUnVsZSgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgT25GYWlsdXJlUnVsZShTdHJpbmcgbG9nVGFnKSB7CisgICAgICAgIG1Mb2dUYWcgPSBsb2dUYWc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0YXRlbWVudCBhcHBseShTdGF0ZW1lbnQgYmFzZSwgRGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdGF0ZW1lbnQoKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgZXZhbHVhdGUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBiYXNlLmV2YWx1YXRlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUobUxvZ1RhZywgIlRlc3QgZmFpbGVkOiBkZXNjcmlwdGlvbj0iICsgIGRlc2NyaXB0aW9uICsgIlxuVGhyb3dhYmxlPSIgKyB0KTsKKyAgICAgICAgICAgICAgICAgICAgb25UZXN0RmFpbHVyZShiYXNlLCBkZXNjcmlwdGlvbiwgdCk7CisgICAgICAgICAgICAgICAgICAgIHRocm93IHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIG9uVGVzdEZhaWx1cmUoU3RhdGVtZW50IGJhc2UsIERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLCBUaHJvd2FibGUgdCk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tbW9uL2RldmljZS1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvUGFja2FnZVV0aWwuamF2YSBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1BhY2thZ2VVdGlsLmphdmEKaW5kZXggMjYwZTU2OS4uZTdiNjk3NiAxMDA2NDQKLS0tIGEvY29tbW9uL2RldmljZS1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvUGFja2FnZVV0aWwuamF2YQorKysgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9QYWNrYWdlVXRpbC5qYXZhCkBAIC0zMSw2ICszMSw4IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBQYWNrYWdlVXRpbCB7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gUGFja2FnZVV0aWwuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOworCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNZU1RFTV9BUFBfTUFTSyA9CiAgICAgICAgICAgICBBcHBsaWNhdGlvbkluZm8uRkxBR19TWVNURU0gfCBBcHBsaWNhdGlvbkluZm8uRkxBR19VUERBVEVEX1NZU1RFTV9BUFA7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEhFWF9BUlJBWSA9ICIwMTIzNDU2Nzg5QUJDREVGIi50b0NoYXJBcnJheSgpOwpAQCAtNjksNiArNzEsMTggQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qKiBSZXR1cm5zIHRoZSB2ZXJzaW9uIHN0cmluZyBvZiB0aGUgcGFja2FnZSBuYW1lLCBvciBudWxsIGlmIHRoZSBwYWNrYWdlIGNhbid0IGJlIGZvdW5kICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VmVyc2lvblN0cmluZyhTdHJpbmcgcGFja2FnZU5hbWUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFBhY2thZ2VJbmZvIGluZm8gPSBnZXRQYWNrYWdlTWFuYWdlcigpLmdldFBhY2thZ2VJbmZvKHBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlci5HRVRfTUVUQV9EQVRBKTsKKyAgICAgICAgICAgIHJldHVybiBpbmZvLnZlcnNpb25OYW1lOworICAgICAgICB9IGNhdGNoIChQYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb24gfCBOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJDb3VsZCBub3QgZmluZCB2ZXJzaW9uIHN0cmluZyBmb3IgcGFja2FnZSAiICsgcGFja2FnZU5hbWUpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKICAgICAgKiBDb21wdXRlIHRoZSBzaWduYXR1cmUgU0hBIGRpZ2VzdCBmb3IgYSBwYWNrYWdlLgogICAgICAqIEBwYXJhbSBwYWNrYWdlIHRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIGZvciB3aGljaCB0aGUgc2lnbmF0dXJlIFNIQSBkaWdlc3QgaXMgcmVxdWVzdGVkCkBAIC0xMDAsNCArMTE0LDIxIEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgUGFja2FnZU1hbmFnZXIgZ2V0UGFja2FnZU1hbmFnZXIoKSB7CiAgICAgICAgIHJldHVybiBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKS5nZXRUYXJnZXRDb250ZXh0KCkuZ2V0UGFja2FnZU1hbmFnZXIoKTsKICAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGhhc0RldmljZUZlYXR1cmUoZmluYWwgU3RyaW5nIHJlcXVpcmVkRmVhdHVyZSkgeworICAgICAgICByZXR1cm4gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpCisgICAgICAgICAgICAgICAgLmdldFBhY2thZ2VNYW5hZ2VyKCkKKyAgICAgICAgICAgICAgICAuaGFzU3lzdGVtRmVhdHVyZShyZXF1aXJlZEZlYXR1cmUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJvdGF0aW9uIHN1cHBvcnQgaXMgaW5kaWNhdGVkIGJ5IGV4cGxpY2l0bHkgaGF2aW5nIGJvdGggbGFuZHNjYXBlIGFuZCBwb3J0cmFpdAorICAgICAqIGZlYXR1cmVzIG9yIG5vdCBsaXN0aW5nIGVpdGhlciBhdCBhbGwuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHN1cHBvcnRzUm90YXRpb24oKSB7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gc3VwcG9ydHNMYW5kc2NhcGUgPSBoYXNEZXZpY2VGZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfU0NSRUVOX0xBTkRTQ0FQRSk7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gc3VwcG9ydHNQb3J0cmFpdCA9IGhhc0RldmljZUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9TQ1JFRU5fUE9SVFJBSVQpOworICAgICAgICByZXR1cm4gKHN1cHBvcnRzTGFuZHNjYXBlICYmIHN1cHBvcnRzUG9ydHJhaXQpCisgICAgICAgICAgICAgICAgfHwgKCFzdXBwb3J0c0xhbmRzY2FwZSAmJiAhc3VwcG9ydHNQb3J0cmFpdCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2RldmljZS1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvUGFyY2VsVXRpbHMuamF2YSBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1BhcmNlbFV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNhYTcyMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1BhcmNlbFV0aWxzLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWw7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworCitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOworCitwdWJsaWMgY2xhc3MgUGFyY2VsVXRpbHMgeworICAgIHByaXZhdGUgUGFyY2VsVXRpbHMoKSB7CisgICAgfQorCisgICAgLyoqIENvbnZlcnQgYSBQYXJjZWxhYmxlIGludG8gYSBieXRlW10uICovCisgICAgcHVibGljIHN0YXRpYyBieXRlW10gdG9CeXRlcyhQYXJjZWxhYmxlIHApIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChwKTsKKworICAgICAgICBmaW5hbCBQYXJjZWwgcGFyY2VsID0gUGFyY2VsLm9idGFpbigpOworICAgICAgICBwYXJjZWwud3JpdGVQYXJjZWxhYmxlKHAsIDApOworICAgICAgICBieXRlW10gZGF0YSA9IHBhcmNlbC5tYXJzaGFsbCgpOworICAgICAgICBwYXJjZWwucmVjeWNsZSgpOworCisgICAgICAgIHJldHVybiBkYXRhOworICAgIH0KKworICAgIC8qKiBEZWNvZGUgYSBieXRlW10gaW50byBhIFBhcmNlbGFibGUuICovCisgICAgcHVibGljIHN0YXRpYyA8VCBleHRlbmRzIFBhcmNlbGFibGU+IFQgZnJvbUJ5dGVzKGJ5dGVbXSBkYXRhKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwoZGF0YSk7CisKKyAgICAgICAgZmluYWwgUGFyY2VsIHBhcmNlbCA9IFBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgcGFyY2VsLnVubWFyc2hhbGwoZGF0YSwgMCwgZGF0YS5sZW5ndGgpOworICAgICAgICBwYXJjZWwuc2V0RGF0YVBvc2l0aW9uKDApOworICAgICAgICBUIHJldCA9IHBhcmNlbC5yZWFkUGFyY2VsYWJsZShQYXJjZWxVdGlscy5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgcGFyY2VsLnJlY3ljbGUoKTsKKworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1Byb3BlcnR5VXRpbC5qYXZhIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvUHJvcGVydHlVdGlsLmphdmEKaW5kZXggMDQyNGY2OS4uYjk4YWNlZSAxMDA2NDQKLS0tIGEvY29tbW9uL2RldmljZS1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvUHJvcGVydHlVdGlsLmphdmEKKysrIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvUHJvcGVydHlVdGlsLmphdmEKQEAgLTE2LDggKzE2LDYgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5TeXN0ZW1VdGlsOwotCiBpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKIGltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKIApAQCAtNDIsNiArNDAsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVUlMRF9UWVBFX1BST1BFUlRZID0gInJvLmJ1aWxkLnR5cGUiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNQU5VRkFDVFVSRVJfUFJPUEVSVFkgPSAicm8ucHJvZHVjdC5tYW51ZmFjdHVyZXIiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfREVWX0tFWVMgPSAiZGV2LWtleXMiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWTkRLX1ZFUlNJT04gPSAicm8udm5kay52ZXJzaW9uIjsKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdPT0dMRV9TRVRUSU5HU19RVUVSWSA9CiAgICAgICAgICAgICAiY29udGVudCBxdWVyeSAtLXVyaSBjb250ZW50Oi8vY29tLmdvb2dsZS5zZXR0aW5ncy9wYXJ0bmVyIjsKQEAgLTgxLDYgKzgwLDE5IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhlIFNESyB2ZXJzaW9uIG9mIHRoZSB2ZW5kb3IgcGFydGl0b24gaXMgbmV3ZXIgdGhhbiB0aGUgZ2l2ZW4gQVBJIGxldmVsLgorICAgICAqIElmIHRoZSBwcm9wZXJ0eSBpcyBzZXQgdG8gbm9uLWludGVnZXIgdmFsdWUsIHRoaXMgbWVhbnMgdGhlIHZlbmRvciBwYXJ0aXRpb24gaXMgdXNpbmcKKyAgICAgKiBjdXJyZW50IEFQSSBsZXZlbCBhbmQgdHJ1ZSBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWZW5kb3JBcGlMZXZlbE5ld2VyVGhhbihpbnQgYXBpTGV2ZWwpIHsKKyAgICAgICAgaW50IHZlbmRvckFwaUxldmVsID0gZ2V0UHJvcGVydHlJbnQoVk5ES19WRVJTSU9OKTsKKyAgICAgICAgaWYgKHZlbmRvckFwaUxldmVsID09IElOVF9WQUxVRV9JRl9VTlNFVCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHZlbmRvckFwaUxldmVsID4gYXBpTGV2ZWw7CisgICAgfQorCisgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBtYW51ZmFjdHVyZXIgb2YgdGhpcyBwcm9kdWN0LiBJZiB1bnNldCwgcmV0dXJuIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWFudWZhY3R1cmVyKCkgewpAQCAtMTIxLDYgKzEzMywxOSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgcHJvcGVydHkgdmFsdWUgbWF0Y2hlcyBhIGdpdmVuIHJlZ3VsYXIgZXhwcmVzc2lvbi4gVGhlIG1ldGhvZCB1c2VzCisgICAgICogU3RyaW5nLm1hdGNoZXMoKSwgcmVxdWlyaW5nIGEgY29tcGxldGUgbWF0Y2ggKGkuZS4gZXhwcmVzc2lvbiBtYXRjaGVzIGVudGlyZSB2YWx1ZSBzdHJpbmcpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHByb3BlcnR5TWF0Y2hlcyhTdHJpbmcgcHJvcGVydHksIFN0cmluZyByZWdleCkgeworICAgICAgICBpZiAocmVnZXggPT0gbnVsbCB8fCByZWdleC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIC8vIG51bGwgb3IgZW1wdHkgcGF0dGVybiBpbXBsaWVzIHByb3BlcnR5IGRvZXMgbm90IGV4aXN0CisgICAgICAgICAgICByZXR1cm4gIXByb3BlcnR5RXhpc3RzKHByb3BlcnR5KTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgdmFsdWUgPSBnZXRQcm9wZXJ0eShwcm9wZXJ0eSk7CisgICAgICAgIHJldHVybiAodmFsdWUgPT0gbnVsbCkgPyBmYWxzZSA6IHZhbHVlLm1hdGNoZXMocmVnZXgpOworICAgIH0KKworICAgIC8qKgogICAgICAqIFJldHJpZXZlcyB0aGUgZGVzaXJlZCBpbnRlZ2VyIHByb3BlcnR5LCByZXR1cm5pbmcgSU5UX1ZBTFVFX0lGX1VOU0VUIGlmIG5vdCBmb3VuZC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGludCBnZXRQcm9wZXJ0eUludChTdHJpbmcgcHJvcGVydHkpIHsKZGlmZiAtLWdpdCBhL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1JlcXVpcmVkRmVhdHVyZVJ1bGUuamF2YSBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1JlcXVpcmVkRmVhdHVyZVJ1bGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTY4ZGRjCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvUmVxdWlyZWRGZWF0dXJlUnVsZS5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWw7CisKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLlRlc3RSdWxlOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuRGVzY3JpcHRpb247CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMubW9kZWwuU3RhdGVtZW50OworCisvKioKKyAqIEN1c3RvbSBKVW5pdDQgcnVsZSB0aGF0IGRvZXMgbm90IHJ1biBhIHRlc3QgY2FzZSBpZiB0aGUgZGV2aWNlIGRvZXMgbm90IGhhdmUgYSBnaXZlbiBmZWF0dXJlLgorICovCitwdWJsaWMgY2xhc3MgUmVxdWlyZWRGZWF0dXJlUnVsZSBpbXBsZW1lbnRzIFRlc3RSdWxlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlJlcXVpcmVkRmVhdHVyZVJ1bGUiOworCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUZlYXR1cmU7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1IYXNGZWF0dXJlOworCisgICAgcHVibGljIFJlcXVpcmVkRmVhdHVyZVJ1bGUoU3RyaW5nIGZlYXR1cmUpIHsKKyAgICAgICAgbUZlYXR1cmUgPSBmZWF0dXJlOworICAgICAgICBtSGFzRmVhdHVyZSA9IGhhc0ZlYXR1cmUoZmVhdHVyZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0YXRlbWVudCBhcHBseShTdGF0ZW1lbnQgYmFzZSwgRGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdGF0ZW1lbnQoKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgZXZhbHVhdGUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1IYXNGZWF0dXJlKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInNraXBwaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGRlc2NyaXB0aW9uLmdldENsYXNzTmFtZSgpICsgIiMiICsgZGVzY3JpcHRpb24uZ2V0TWV0aG9kTmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGJlY2F1c2UgZGV2aWNlIGRvZXMgbm90IGhhdmUgZmVhdHVyZSAnIiArIG1GZWF0dXJlICsgIiciKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBiYXNlLmV2YWx1YXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGhhc0ZlYXR1cmUoU3RyaW5nIGZlYXR1cmUpIHsKKyAgICAgICAgcmV0dXJuIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKS5nZXRQYWNrYWdlTWFuYWdlcigpLmhhc1N5c3RlbUZlYXR1cmUoZmVhdHVyZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2RldmljZS1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvU2V0dGluZ3NVdGlscy5qYXZhIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvU2V0dGluZ3NVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNGNiNjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9TZXR0aW5nc1V0aWxzLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWw7CisKK3B1YmxpYyBjbGFzcyBTZXR0aW5nc1V0aWxzIHsKKyAgICBwcml2YXRlIFNldHRpbmdzVXRpbHMoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHV0IGEgZ2xvYmFsIHNldHRpbmcuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHB1dEdsb2JhbFNldHRpbmcoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIC8vIEhtbSwgdGVjaG5pY2FsbHkgd2Ugc2hvdWxkIGVzY2FwZSBhIHZhbHVlLCBidXQgaWYgSSBkbyBsaWtlICcxJywgaXQgd29uJ3Qgd29yay4gPz8KKyAgICAgICAgU3lzdGVtVXRpbC5ydW5TaGVsbENvbW1hbmRGb3JOb091dHB1dCgic2V0dGluZ3MgcHV0IGdsb2JhbCAiICsga2V5ICsgIiAiICsgdmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFB1dCBhIGdsb2JhbCBzZXR0aW5nIGZvciB0aGUgY3VycmVudCAoZm9yZWdyb3VuZCkgdXNlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHV0U2VjdXJlU2V0dGluZyhTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgU3lzdGVtVXRpbC5ydW5TaGVsbENvbW1hbmRGb3JOb091dHB1dCgKKyAgICAgICAgICAgICAgICAic2V0dGluZ3MgLS11c2VyIGN1cnJlbnQgcHV0IHNlY3VyZSAiICsga2V5ICsgIiAiICsgdmFsdWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1N5c3RlbVV0aWwuamF2YSBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1N5c3RlbVV0aWwuamF2YQppbmRleCAyMGI0NjI1Li45Yzc1OTc1IDEwMDY0NAotLS0gYS9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9TeXN0ZW1VdGlsLmphdmEKKysrIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvU3lzdGVtVXRpbC5qYXZhCkBAIC0xNiwxNyArMTYsMjUgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsOwogCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlci5NZW1vcnlJbmZvOwogaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOwogaW1wb3J0IGFuZHJvaWQub3MuU3RhdEZzOworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU7CiAKIHB1YmxpYyBjbGFzcyBTeXN0ZW1VdGlsIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkN0c1N5c3RlbVV0aWwiOworCiAgICAgcHVibGljIHN0YXRpYyBsb25nIGdldEZyZWVEaXNrU2l6ZShDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgZmluYWwgU3RhdEZzIHN0YXRGcyA9IG5ldyBTdGF0RnMoY29udGV4dC5nZXRGaWxlc0RpcigpLmdldEFic29sdXRlUGF0aCgpKTsKICAgICAgICAgcmV0dXJuIChsb25nKXN0YXRGcy5nZXRBdmFpbGFibGVCbG9ja3MoKSAqIHN0YXRGcy5nZXRCbG9ja1NpemUoKTsKQEAgLTU1LDYgKzYzLDExIEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcnVuU2hlbGxDb21tYW5kKEluc3RydW1lbnRhdGlvbiBpbnN0cnVtZW50YXRpb24sIFN0cmluZyBjbWQpCiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBMb2cudihUQUcsICJSdW5uaW5nIGNvbW1hbmQ6ICIgKyBjbWQpOworICAgICAgICBpZiAoY21kLnN0YXJ0c1dpdGgoInBtIGdyYW50ICIpIHx8IGNtZC5zdGFydHNXaXRoKCJwbSByZXZva2UgIikpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVXNlIFVpQXV0b21hdGlvbi5ncmFudFJ1bnRpbWVQZXJtaXNzaW9uKCkgIgorICAgICAgICAgICAgICAgICAgICArICJvciByZXZva2VSdW50aW1lUGVybWlzc2lvbigpIGRpcmVjdGx5LCB3aGljaCBhcmUgbW9yZSByb2J1c3QuIik7CisgICAgICAgIH0KICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgcGZkID0gaW5zdHJ1bWVudGF0aW9uLmdldFVpQXV0b21hdGlvbigpLmV4ZWN1dGVTaGVsbENvbW1hbmQoY21kKTsKICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzUxMl07CiAgICAgICAgIGludCBieXRlc1JlYWQ7CkBAIC02Niw0ICs3OSw2NCBAQAogICAgICAgICBmaXMuY2xvc2UoKTsKICAgICAgICAgcmV0dXJuIHN0ZG91dC50b1N0cmluZygpOwogICAgIH0KKworICAgIC8qKgorICAgICAqIFNpbXBsZXIgdmVyc2lvbiBvZiB7QGxpbmsgI3J1blNoZWxsQ29tbWFuZChJbnN0cnVtZW50YXRpb24sIFN0cmluZyl9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJ1blNoZWxsQ29tbWFuZChTdHJpbmcgY21kKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gcnVuU2hlbGxDb21tYW5kKEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLCBjbWQpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJGYWlsZWQgcmVhZGluZyBjb21tYW5kIG91dHB1dDogIiArIGUpOworICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2FtZSBhcyB7QGxpbmsgI3J1blNoZWxsQ29tbWFuZChTdHJpbmcpfSwgd2l0aCBvcHRpb25hbGx5CisgICAgICogY2hlY2sgdGhlIHJlc3VsdCB1c2luZyB7QGNvZGUgcmVzdWx0Q2hlY2tlcn0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcnVuU2hlbGxDb21tYW5kKFN0cmluZyBjbWQsIFByZWRpY2F0ZTxTdHJpbmc+IHJlc3VsdENoZWNrZXIpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdCA9IHJ1blNoZWxsQ29tbWFuZChjbWQpOworICAgICAgICBpZiAocmVzdWx0Q2hlY2tlciAhPSBudWxsKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJBc3NlcnRpb24gZmFpbGVkLiBDb21tYW5kIHdhczogIiArIGNtZCArICJcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiT3V0cHV0IHdhczpcbiIgKyByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdENoZWNrZXIudGVzdChyZXN1bHQpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNhbWUgYXMge0BsaW5rICNydW5TaGVsbENvbW1hbmQoU3RyaW5nKX0sIGJ1dCBmYWlscyBpZiB0aGUgb3V0cHV0IGlzIG5vdCBlbXB0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBydW5TaGVsbENvbW1hbmRGb3JOb091dHB1dChTdHJpbmcgY21kKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyByZXN1bHQgPSBydW5TaGVsbENvbW1hbmQoY21kKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiQ29tbWFuZCBmYWlsZWQuIENvbW1hbmQgd2FzOiAiICsgY21kICsgIlxuIgorICAgICAgICAgICAgICAgICsgIkRpZG4ndCBleHBlY3QgYW55IG91dHB1dCwgYnV0IHRoZSBvdXRwdXQgd2FzOlxuIiArIHJlc3VsdCwKKyAgICAgICAgICAgICAgICByZXN1bHQubGVuZ3RoKCkgPT0gMCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUnVuIGEgY29tbWFuZCBhbmQgcHJpbnQgdGhlIHJlc3VsdCBvbiBsb2djYXQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHJ1bkNvbW1hbmRBbmRQcmludE9uTG9nY2F0KFN0cmluZyBsb2d0YWcsIFN0cmluZyBjbWQpIHsKKyAgICAgICAgTG9nLmkobG9ndGFnLCAiRXhlY3V0aW5nOiAiICsgY21kKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIG91dHB1dCA9IHJ1blNoZWxsQ29tbWFuZChjbWQpOworICAgICAgICBmb3IgKFN0cmluZyBsaW5lIDogb3V0cHV0LnNwbGl0KCJcXG4iLCAtMSkpIHsKKyAgICAgICAgICAgIExvZy5pKGxvZ3RhZywgbGluZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSdW4gYSBjb21tYW5kIGFuZCByZXR1cm4gdGhlIHNlY3Rpb24gbWF0Y2hpbmcgdGhlIHBhdHRlcm5zLgorICAgICAqCisgICAgICogQHNlZSBUZXh0VXRpbHMjZXh0cmFjdFNlY3Rpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBydW5Db21tYW5kQW5kRXh0cmFjdFNlY3Rpb24oU3RyaW5nIGNtZCwKKyAgICAgICAgICAgIFN0cmluZyBleHRyYWN0aW9uU3RhcnRSZWdleCwgYm9vbGVhbiBzdGFydEluY2x1c2l2ZSwKKyAgICAgICAgICAgIFN0cmluZyBleHRyYWN0aW9uRW5kUmVnZXgsIGJvb2xlYW4gZW5kSW5jbHVzaXZlKSB7CisgICAgICAgIHJldHVybiBUZXh0VXRpbHMuZXh0cmFjdFNlY3Rpb24ocnVuU2hlbGxDb21tYW5kKGNtZCksIGV4dHJhY3Rpb25TdGFydFJlZ2V4LCBzdGFydEluY2x1c2l2ZSwKKyAgICAgICAgICAgICAgICBleHRyYWN0aW9uRW5kUmVnZXgsIGVuZEluY2x1c2l2ZSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2RldmljZS1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvVGVzdFV0aWxzLmphdmEgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9UZXN0VXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzAyODc1Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvVGVzdFV0aWxzLmphdmEKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWw7CisKK2ltcG9ydCBzdGF0aWMganVuaXQuZnJhbWV3b3JrLkFzc2VydC5mYWlsOworCitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitwdWJsaWMgY2xhc3MgVGVzdFV0aWxzIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkN0c1Rlc3RVdGlscyI7CisKKyAgICBwcml2YXRlIFRlc3RVdGlscygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1RJTUVPVVRfU0VDT05EUyA9IDMwOworCisgICAgLyoqIFByaW50IGFuIGVycm9yIGxvZyBhbmQgZmFpbC4gKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZmFpbFdpdGhMb2coU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgTG9nLmUoVEFHLCBtZXNzYWdlKTsKKyAgICAgICAgZmFpbChtZXNzYWdlKTsKKyAgICB9CisKKyAgICBARnVuY3Rpb25hbEludGVyZmFjZQorICAgIHB1YmxpYyBpbnRlcmZhY2UgQm9vbGVhblN1cHBsaWVyV2l0aFRocm93IHsKKyAgICAgICAgYm9vbGVhbiBnZXRBc0Jvb2xlYW4oKSB0aHJvd3MgRXhjZXB0aW9uOworICAgIH0KKworICAgIEBGdW5jdGlvbmFsSW50ZXJmYWNlCisgICAgcHVibGljIGludGVyZmFjZSBSdW5uYWJsZVdpdGhUaHJvdyB7CisgICAgICAgIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXYWl0IHVudGlsIHtAY29kZSBwcmVkaWNhdGV9IGlzIHNhdGlzZmllZCwgb3IgZmFpbCwgd2l0aCB7QGxpbmsgI0RFRkFVTFRfVElNRU9VVF9TRUNPTkRTfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd2FpdFVudGlsKFN0cmluZyBtZXNzYWdlLCBCb29sZWFuU3VwcGxpZXJXaXRoVGhyb3cgcHJlZGljYXRlKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHdhaXRVbnRpbChtZXNzYWdlLCAwLCBwcmVkaWNhdGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdhaXQgdW50aWwge0Bjb2RlIHByZWRpY2F0ZX0gaXMgc2F0aXNmaWVkLCBvciBmYWlsLCB3aXRoIGEgZ2l2ZW4gdGltZW91dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd2FpdFVudGlsKAorICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UsIGludCB0aW1lb3V0U2Vjb25kLCBCb29sZWFuU3VwcGxpZXJXaXRoVGhyb3cgcHJlZGljYXRlKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICh0aW1lb3V0U2Vjb25kIDw9IDApIHsKKyAgICAgICAgICAgIHRpbWVvdXRTZWNvbmQgPSBERUZBVUxUX1RJTUVPVVRfU0VDT05EUzsKKyAgICAgICAgfQorICAgICAgICBpbnQgc2xlZXAgPSAxMjU7CisgICAgICAgIGZpbmFsIGxvbmcgdGltZW91dCA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpICsgdGltZW91dFNlY29uZCAqIDEwMDA7CisgICAgICAgIHdoaWxlIChTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSA8IHRpbWVvdXQpIHsKKyAgICAgICAgICAgIGlmIChwcmVkaWNhdGUuZ2V0QXNCb29sZWFuKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47IC8vIG9rYXkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChzbGVlcCk7CisgICAgICAgICAgICBzbGVlcCAqPSA1OworICAgICAgICAgICAgc2xlZXAgPSBNYXRoLm1pbigyMDAwLCBzbGVlcCk7CisgICAgICAgIH0KKyAgICAgICAgZmFpbFdpdGhMb2coIlRpbWVvdXQ6ICIgKyBtZXNzYWdlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSdW4gYSBSdW5uYWJsZSB7QGNvZGUgcn0sIGFuZCBpZiBpdCB0aHJvd3MsIGFsc28gcnVuIHtAY29kZSBvbkZhaWx1cmV9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBydW5XaXRoRmFpbHVyZUhvb2soUnVubmFibGVXaXRoVGhyb3cgciwgUnVubmFibGVXaXRoVGhyb3cgb25GYWlsdXJlKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiciIpOworICAgICAgICB9CisgICAgICAgIGlmIChvbkZhaWx1cmUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJvbkZhaWx1cmUiKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgci5ydW4oKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHRoKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJDYXVnaHQgZXhjZXB0aW9uOiAiICsgdGgsIHRoKTsKKyAgICAgICAgICAgIG9uRmFpbHVyZS5ydW4oKTsKKyAgICAgICAgICAgIHRocm93IHRoOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9UZXh0VXRpbHMuamF2YSBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1RleHRVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzOWRjOWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9UZXh0VXRpbHMuamF2YQpAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsOworCitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKK3B1YmxpYyBjbGFzcyBUZXh0VXRpbHMgeworICAgIHByaXZhdGUgVGV4dFV0aWxzKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZmlyc3Qgc2VjdGlvbiBpbiB7QGNvZGUgc291cmNlfSBiZXR3ZWVuIHRoZSBsaW5lIG1hdGNoZXMKKyAgICAgKiB7QGNvZGUgZXh0cmFjdGlvblN0YXJ0UmVnZXh9IGFuZCB0aGUgbGluZSBtYXRjaGVzIHtAY29kZSBleHRyYWN0aW9uRW5kUmVnZXh9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4dHJhY3RTZWN0aW9uKFN0cmluZyBzb3VyY2UsCisgICAgICAgICAgICBTdHJpbmcgZXh0cmFjdGlvblN0YXJ0UmVnZXgsIGJvb2xlYW4gc3RhcnRJbmNsdXNpdmUsCisgICAgICAgICAgICBTdHJpbmcgZXh0cmFjdGlvbkVuZFJlZ2V4LCBib29sZWFuIGVuZEluY2x1c2l2ZSkgeworCisgICAgICAgIGZpbmFsIFBhdHRlcm4gc3RhcnQgPSBQYXR0ZXJuLmNvbXBpbGUoZXh0cmFjdGlvblN0YXJ0UmVnZXgpOworICAgICAgICBmaW5hbCBQYXR0ZXJuIGVuZCA9IFBhdHRlcm4uY29tcGlsZShleHRyYWN0aW9uRW5kUmVnZXgpOworCisgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBmaW5hbCBTdHJpbmdbXSBsaW5lcyA9IHNvdXJjZS5zcGxpdCgiXFxuIiwgLTEpOworCisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgZm9yICg7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxpbmUgPSBsaW5lc1tpXTsKKyAgICAgICAgICAgIGlmIChzdGFydC5tYXRjaGVyKGxpbmUpLm1hdGNoZXMoKSkgeworICAgICAgICAgICAgICAgIGlmIChzdGFydEluY2x1c2l2ZSkgeworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQobGluZSk7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnXG4nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yICg7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxpbmUgPSBsaW5lc1tpXTsKKyAgICAgICAgICAgIGlmIChlbmQubWF0Y2hlcihsaW5lKS5tYXRjaGVzKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZW5kSW5jbHVzaXZlKSB7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChsaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCdcbicpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNiLmFwcGVuZChsaW5lKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgnXG4nKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9UaHJlYWRVdGlscy5qYXZhIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvVGhyZWFkVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTQ4NjI4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvVGhyZWFkVXRpbHMuamF2YQpAQCAtMCwwICsxLDI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKKworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBUaHJlYWRVdGlscyB7CisgICAgcHJpdmF0ZSBUaHJlYWRVdGlscygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2xlZXBVbnRpbFJlYWx0aW1lKGxvbmcgcmVhbHRpbWUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBUaHJlYWQuc2xlZXAoTWF0aC5tYXgoMCwgcmVhbHRpbWUgLSBTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1dpZGdldFRlc3RVdGlscy5qYXZhIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvV2lkZ2V0VGVzdFV0aWxzLmphdmEKaW5kZXggZWZmNmM0My4uYTgwZDhiYiAxMDA2NDQKLS0tIGEvY29tbW9uL2RldmljZS1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvV2lkZ2V0VGVzdFV0aWxzLmphdmEKKysrIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvV2lkZ2V0VGVzdFV0aWxzLmphdmEKQEAgLTIwLDggKzIwLDggQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk5vbk51bGw7CitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5OdWxsYWJsZTsKIGltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LkVkaXRhYmxlOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CkBAIC0zOSw3ICszOSw4IEBACiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiAKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LlZpZXdUcmVlT2JzZXJ2ZXIuKjsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LlZpZXdUcmVlT2JzZXJ2ZXIuT25EcmF3TGlzdGVuZXI7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyLk9uR2xvYmFsTGF5b3V0TGlzdGVuZXI7CiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLmhhbWNyZXN0Lk1vY2tpdG9IYW1jcmVzdC5hcmdUaGF0OwogCiAvKioKZGlmZiAtLWdpdCBhL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL2RldmljZXBvbGljeS9wcm92aXNpb25pbmcvU2lsZW50UHJvdmlzaW9uaW5nVGVzdE1hbmFnZXIuamF2YSBiL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL2RldmljZXBvbGljeS9wcm92aXNpb25pbmcvU2lsZW50UHJvdmlzaW9uaW5nVGVzdE1hbmFnZXIuamF2YQppbmRleCAxOTI3OGQwLi4wNWVkZjFhIDEwMDY0NAotLS0gYS9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9kZXZpY2Vwb2xpY3kvcHJvdmlzaW9uaW5nL1NpbGVudFByb3Zpc2lvbmluZ1Rlc3RNYW5hZ2VyLmphdmEKKysrIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvZGV2aWNlcG9saWN5L3Byb3Zpc2lvbmluZy9TaWxlbnRQcm92aXNpb25pbmdUZXN0TWFuYWdlci5qYXZhCkBAIC0xMzAsNyArMTMwLDkgQEAKICAgICAgICAgYnVuZGxlLnB1dFBhcmNlbGFibGUoSW50ZW50LkVYVFJBX0lOVEVOVCwgaW50ZW50KTsKICAgICAgICAgYnVuZGxlLnB1dEJpbmRlcihTdGFydFByb3Zpc2lvbmluZ0FjdGl2aXR5LkVYVFJBX0JPT0xFQU5fQ0FMTEJBQ0ssCiAgICAgICAgICAgICAgICAgbVByb3Zpc2lvbmluZ1Jlc3VsdENhbGxiYWNrLmFzQmluZGVyKCkpOwotICAgICAgICByZXR1cm4gbmV3IEludGVudChtQ29udGV4dCwgU3RhcnRQcm92aXNpb25pbmdBY3Rpdml0eS5jbGFzcykucHV0RXh0cmFzKGJ1bmRsZSk7CisgICAgICAgIHJldHVybiBuZXcgSW50ZW50KG1Db250ZXh0LCBTdGFydFByb3Zpc2lvbmluZ0FjdGl2aXR5LmNsYXNzKQorICAgICAgICAgICAgICAgIC5wdXRFeHRyYXMoYnVuZGxlKQorICAgICAgICAgICAgICAgIC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB3YWtlVXBBbmREaXNtaXNzSW5zZWN1cmVLZXlndWFyZCgpIHsKZGlmZiAtLWdpdCBhL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsL3Rlc3RzL0FuZHJvaWQubWsgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC90ZXN0cy9BbmRyb2lkLm1rCmluZGV4IDEyYmFlYjcuLmEwNzNiOWEgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsL3Rlc3RzL0FuZHJvaWQubWsKKysrIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwvdGVzdHMvQW5kcm9pZC5tawpAQCAtMjQsNCArMjQsNiBAQAogCiBMT0NBTF9NT0RVTEUgOj0gY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC10ZXN0cwogCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CisKIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfSkFWQV9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvY29tbW9uL2RldmljZS1zaWRlL3V0aWwvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQnVzaW5lc3NMb2dpY0RldmljZUV4ZWN1dG9yVGVzdC5qYXZhIGIvY29tbW9uL2RldmljZS1zaWRlL3V0aWwvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQnVzaW5lc3NMb2dpY0RldmljZUV4ZWN1dG9yVGVzdC5qYXZhCmluZGV4IGYyNGQxMWQuLjlmM2NhNDcgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0J1c2luZXNzTG9naWNEZXZpY2VFeGVjdXRvclRlc3QuamF2YQorKysgYi9jb21tb24vZGV2aWNlLXNpZGUvdXRpbC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9CdXNpbmVzc0xvZ2ljRGV2aWNlRXhlY3V0b3JUZXN0LmphdmEKQEAgLTI4LDYgKzI4LDcgQEAKIAogaW1wb3J0IG9yZy5qdW5pdC5Bc3N1bXB0aW9uVmlvbGF0ZWRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApAQCAtMjkyLDYgKzI5Myw3IEBACiAgICAgfQogCiAgICAgLy8gdGhyb3cgQXNzZXJ0aW9uRmFpbGVkRXJyb3IKKyAgICBASWdub3JlCiAgICAgcHVibGljIHZvaWQgbWV0aG9kOSgpIHRocm93cyBBc3NlcnRpb25GYWlsZWRFcnJvciB7CiAgICAgICAgIGFzc2VydFRydWUoZmFsc2UpOwogICAgIH0KZGlmZiAtLWdpdCBhL2NvbW1vbi9ob3N0LXNpZGUvQW5kcm9pZC5tayBiL2NvbW1vbi9ob3N0LXNpZGUvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThiNmFmNy4uMDAwMDAwMAotLS0gYS9jb21tb24vaG9zdC1zaWRlL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotaW5jbHVkZSAkKGNhbGwgYWxsLXN1YmRpci1tYWtlZmlsZXMpCmRpZmYgLS1naXQgYS9jb21tb24vaG9zdC1zaWRlL21hbmlmZXN0LWdlbmVyYXRvci9BbmRyb2lkLm1rIGIvY29tbW9uL2hvc3Qtc2lkZS9tYW5pZmVzdC1nZW5lcmF0b3IvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk3NjMyOS4uMDAwMDAwMAotLS0gYS9jb21tb24vaG9zdC1zaWRlL21hbmlmZXN0LWdlbmVyYXRvci9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLUxPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKLQotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGt4bWwyLTIuMy4wCi0KLUxPQ0FMX0pBUl9NQU5JRkVTVCA6PSBNQU5JRkVTVC5tZgotCi1MT0NBTF9DTEFTU1BBVEggOj0gJChIT1NUX0pES19UT09MU19KQVIpCi0KLUxPQ0FMX01PRFVMRSA6PSBjb21wYXRpYmlsaXR5LW1hbmlmZXN0LWdlbmVyYXRvcgotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1pbmNsdWRlICQoQlVJTERfSE9TVF9KQVZBX0xJQlJBUlkpCi0KLWluY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb21tb24vaG9zdC1zaWRlL21hbmlmZXN0LWdlbmVyYXRvci9NQU5JRkVTVC5tZiBiL2NvbW1vbi9ob3N0LXNpZGUvbWFuaWZlc3QtZ2VuZXJhdG9yL01BTklGRVNULm1mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjYyNjMxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9ob3N0LXNpZGUvbWFuaWZlc3QtZ2VuZXJhdG9yL01BTklGRVNULm1mCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLU1haW4tQ2xhc3M6IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLmdlbmVyYXRvci5NYW5pZmVzdEdlbmVyYXRvcgpkaWZmIC0tZ2l0IGEvY29tbW9uL2hvc3Qtc2lkZS9tYW5pZmVzdC1nZW5lcmF0b3Ivc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL2dlbmVyYXRvci9NYW5pZmVzdEdlbmVyYXRvci5qYXZhIGIvY29tbW9uL2hvc3Qtc2lkZS9tYW5pZmVzdC1nZW5lcmF0b3Ivc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL2dlbmVyYXRvci9NYW5pZmVzdEdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTQ4Y2E5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9ob3N0LXNpZGUvbWFuaWZlc3QtZ2VuZXJhdG9yL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi9nZW5lcmF0b3IvTWFuaWZlc3RHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi5nZW5lcmF0b3I7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5reG1sMi5pby5LWG1sU2VyaWFsaXplcjsKLQotcHVibGljIGNsYXNzIE1hbmlmZXN0R2VuZXJhdG9yIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX01JTl9TREsgPSAiOCI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNBR0UgPSAiVXNhZ2U6ICIKLSAgICAgICAgKyAibWFuaWZlc3QtZ2VuZXJhdG9yIC1uIE5BTUUgLXAgUEFDS0FHRV9OQU1FIC1vIE9VVFBVVF9GSUxFIC1pIElOU1RSVU1FTlRfTkFNRSAiCi0gICAgICAgICsgIlstcyBNSU5fU0RLX1ZFUlNJT05dIFstdCBUQVJHRVRfU0RLX1ZFUlNJT05dIFstciBQRVJNSVNTSU9OXSsgWy1hIEFDVElWSVRZXSsiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNQU5JRkVTVCA9ICJtYW5pZmVzdCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVNfU0RLID0gInVzZXMtc2RrIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFU19QRVJNSVNTSU9OID0gInVzZXMtcGVybWlzc2lvbiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUExJQ0FUSU9OID0gImFwcGxpY2F0aW9uIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5TVFJVTUVOVEFUSU9OID0gImluc3RydW1lbnRhdGlvbiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElWSVRZID0gImFjdGl2aXR5IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFU19MSUJSQVJZID0gInVzZXMtbGlicmFyeSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIFN0cmluZyBwa2dOYW1lID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIGluc3RydW1lbnROYW1lID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIG1pblNkayA9IERFRkFVTFRfTUlOX1NESzsKLSAgICAgICAgU3RyaW5nIHRhcmdldFNkayA9IG51bGw7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBwZXJtaXNzaW9ucyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBMaXN0PFN0cmluZz4gYWN0aXZpdGllcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBMaXN0PFN0cmluZz4gbGlicmFyaWVzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIFN0cmluZyBvdXRwdXQgPSBudWxsOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGggLSAxOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChhcmdzW2ldLmVxdWFscygiLXAiKSkgewotICAgICAgICAgICAgICAgIHBrZ05hbWUgPSBhcmdzWysraV07Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItYSIpKSB7Ci0gICAgICAgICAgICAgICAgYWN0aXZpdGllcy5hZGQoYXJnc1srK2ldKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi1sIikpIHsKLSAgICAgICAgICAgICAgICBsaWJyYXJpZXMuYWRkKGFyZ3NbKytpXSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItbyIpKSB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0ID0gYXJnc1srK2ldOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLWkiKSkgewotICAgICAgICAgICAgICAgIGluc3RydW1lbnROYW1lID0gYXJnc1srK2ldOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLXIiKSkgewotICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zLmFkZChhcmdzWysraV0pOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLXMiKSkgewotICAgICAgICAgICAgICAgIG1pblNkayA9IGFyZ3NbKytpXTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi10IikpIHsKLSAgICAgICAgICAgICAgICB0YXJnZXRTZGsgPSBhcmdzWysraV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocGtnTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBlcnJvcigiTWlzc2luZyBwYWNrYWdlIG5hbWUiKTsKLSAgICAgICAgfSBlbHNlIGlmIChpbnN0cnVtZW50TmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBlcnJvcigiTWlzc2luZyBpbnN0cnVtZW50YXRpb24gbmFtZSIpOwotICAgICAgICB9IGVsc2UgaWYgKGFjdGl2aXRpZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBlcnJvcigiTm8gYWN0aXZpdGllcyIpOwotICAgICAgICB9IGVsc2UgaWYgKG91dHB1dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBlcnJvcigiTWlzc2luZyBvdXRwdXQgZmlsZSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXQgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dHB1dCk7Ci0gICAgICAgICAgZ2VuZXJhdGUob3V0LCBwa2dOYW1lLCBpbnN0cnVtZW50TmFtZSwgbWluU2RrLCB0YXJnZXRTZGssIHBlcm1pc3Npb25zLCBhY3Rpdml0aWVzLAotICAgICAgICAgICAgICAgIGxpYnJhcmllcyk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJDb3VsZG4ndCBjcmVhdGUgbWFuaWZlc3QgZmlsZSIpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChvdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAvLyBJZ25vcmUKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qcGFja2FnZSovIHN0YXRpYyB2b2lkIGdlbmVyYXRlKE91dHB1dFN0cmVhbSBvdXQsIFN0cmluZyBwa2dOYW1lLCBTdHJpbmcgaW5zdHJ1bWVudE5hbWUsCi0gICAgICAgICAgICBTdHJpbmcgbWluU2RrLCBTdHJpbmcgdGFyZ2V0U2RrLCBMaXN0PFN0cmluZz4gcGVybWlzc2lvbnMsIExpc3Q8U3RyaW5nPiBhY3Rpdml0aWVzLAotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGxpYnJhcmllcykKLSAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBTdHJpbmcgbnMgPSBudWxsOwotICAgICAgICBLWG1sU2VyaWFsaXplciBzZXJpYWxpemVyID0gbmV3IEtYbWxTZXJpYWxpemVyKCk7Ci0gICAgICAgIHNlcmlhbGl6ZXIuc2V0T3V0cHV0KG91dCwgIlVURi04Iik7Ci0gICAgICAgIHNlcmlhbGl6ZXIuc3RhcnREb2N1bWVudCgiVVRGLTgiLCB0cnVlKTsKLSAgICAgICAgc2VyaWFsaXplci5zZXRGZWF0dXJlKCJodHRwOi8veG1scHVsbC5vcmcvdjEvZG9jL2ZlYXR1cmVzLmh0bWwjaW5kZW50LW91dHB1dCIsIHRydWUpOwotICAgICAgICBzZXJpYWxpemVyLnN0YXJ0VGFnKG5zLCBNQU5JRkVTVCk7Ci0gICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlKG5zLCAieG1sbnM6YW5kcm9pZCIsICJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiKTsKLSAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUobnMsICJwYWNrYWdlIiwgcGtnTmFtZSk7Ci0gICAgICAgIHNlcmlhbGl6ZXIuc3RhcnRUYWcobnMsIFVTRVNfU0RLKTsKLSAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUobnMsICJhbmRyb2lkOm1pblNka1ZlcnNpb24iLCBtaW5TZGspOwotICAgICAgICBpZiAodGFyZ2V0U2RrICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlKG5zLCAiYW5kcm9pZDp0YXJnZXRTZGtWZXJzaW9uIiwgdGFyZ2V0U2RrKTsKLSAgICAgICAgfQotICAgICAgICBzZXJpYWxpemVyLmVuZFRhZyhucywgVVNFU19TREspOwotICAgICAgICBmb3IgKFN0cmluZyBwZXJtaXNzaW9uIDogcGVybWlzc2lvbnMpIHsKLSAgICAgICAgICAgIHNlcmlhbGl6ZXIuc3RhcnRUYWcobnMsIFVTRVNfUEVSTUlTU0lPTik7Ci0gICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZShucywgImFuZHJvaWQ6bmFtZSIsIHBlcm1pc3Npb24pOwotICAgICAgICAgICAgc2VyaWFsaXplci5lbmRUYWcobnMsIFVTRVNfUEVSTUlTU0lPTik7Ci0gICAgICAgIH0KLSAgICAgICAgc2VyaWFsaXplci5zdGFydFRhZyhucywgQVBQTElDQVRJT04pOwotICAgICAgICBmb3IgKFN0cmluZyBsaWJyYXJ5IDogbGlicmFyaWVzKSB7Ci0gICAgICAgICAgICBzZXJpYWxpemVyLnN0YXJ0VGFnKG5zLCBVU0VTX0xJQlJBUlkpOwotICAgICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUobnMsICJhbmRyb2lkOm5hbWUiLCBsaWJyYXJ5KTsKLSAgICAgICAgICAgIHNlcmlhbGl6ZXIuZW5kVGFnKG5zLCBVU0VTX0xJQlJBUlkpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoU3RyaW5nIGFjdGl2aXR5IDogYWN0aXZpdGllcykgewotICAgICAgICAgICAgc2VyaWFsaXplci5zdGFydFRhZyhucywgQUNUSVZJVFkpOwotICAgICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUobnMsICJhbmRyb2lkOm5hbWUiLCBhY3Rpdml0eSk7Ci0gICAgICAgICAgICBzZXJpYWxpemVyLmVuZFRhZyhucywgQUNUSVZJVFkpOwotICAgICAgICB9Ci0gICAgICAgIHNlcmlhbGl6ZXIuZW5kVGFnKG5zLCBBUFBMSUNBVElPTik7Ci0gICAgICAgIHNlcmlhbGl6ZXIuc3RhcnRUYWcobnMsIElOU1RSVU1FTlRBVElPTik7Ci0gICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlKG5zLCAiYW5kcm9pZDpuYW1lIiwgaW5zdHJ1bWVudE5hbWUpOwotICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZShucywgImFuZHJvaWQ6dGFyZ2V0UGFja2FnZSIsIHBrZ05hbWUpOwotICAgICAgICBzZXJpYWxpemVyLmVuZFRhZyhucywgSU5TVFJVTUVOVEFUSU9OKTsKLSAgICAgICAgc2VyaWFsaXplci5lbmRUYWcobnMsIE1BTklGRVNUKTsKLSAgICAgICAgc2VyaWFsaXplci5lbmREb2N1bWVudCgpOwotICAgICAgICBvdXQuZmx1c2goKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGVycm9yKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihtZXNzYWdlKTsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKFVTQUdFKTsKLSAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2hvc3Qtc2lkZS9tYW5pZmVzdC1nZW5lcmF0b3IvdGVzdHMvQW5kcm9pZC5tayBiL2NvbW1vbi9ob3N0LXNpZGUvbWFuaWZlc3QtZ2VuZXJhdG9yL3Rlc3RzL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MDFmYzguLjAwMDAwMDAKLS0tIGEvY29tbW9uL2hvc3Qtc2lkZS9tYW5pZmVzdC1nZW5lcmF0b3IvdGVzdHMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCi0KLUxPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGNvbXBhdGliaWxpdHktbWFuaWZlc3QtZ2VuZXJhdG9yIGp1bml0LWhvc3QKLQotTE9DQUxfTU9EVUxFIDo9IGNvbXBhdGliaWxpdHktbWFuaWZlc3QtZ2VuZXJhdG9yLXRlc3RzCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLWluY2x1ZGUgJChCVUlMRF9IT1NUX0pBVkFfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2NvbW1vbi9ob3N0LXNpZGUvbWFuaWZlc3QtZ2VuZXJhdG9yL3Rlc3RzL3J1bl90ZXN0cy5zaCBiL2NvbW1vbi9ob3N0LXNpZGUvbWFuaWZlc3QtZ2VuZXJhdG9yL3Rlc3RzL3J1bl90ZXN0cy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzU4NTg5Yy4uMDAwMDAwMAotLS0gYS9jb21tb24vaG9zdC1zaWRlL21hbmlmZXN0LWdlbmVyYXRvci90ZXN0cy9ydW5fdGVzdHMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jIS9iaW4vYmFzaAotCi0jIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotIyBIZWxwZXIgc2NyaXB0IGZvciBydW5uaW5nIHVuaXQgdGVzdHMgZm9yIGNvbXBhdGliaWxpdHkgbGlicmFyaWVzCi0KLUNUU19ESVI9JChkaXJuYW1lICR7MH0pLy4uLy4uLy4uLy4uCi1zb3VyY2UgJHtDVFNfRElSfS90ZXN0X2RlZnMuc2gKLQotSkFSUz0iCi0gICAgY29tcGF0aWJpbGl0eS1tYW5pZmVzdC1nZW5lcmF0b3JcCi0gICAgY29tcGF0aWJpbGl0eS1tYW5pZmVzdC1nZW5lcmF0b3ItdGVzdHMiCi0KLXJ1bl90ZXN0cyAiY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24uZ2VuZXJhdG9yLk1hbmlmZXN0R2VuZXJhdG9yVGVzdCIgIiR7SkFSU30iICIke0B9IgotCmRpZmYgLS1naXQgYS9jb21tb24vaG9zdC1zaWRlL21hbmlmZXN0LWdlbmVyYXRvci90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vZ2VuZXJhdG9yL01hbmlmZXN0R2VuZXJhdG9yVGVzdC5qYXZhIGIvY29tbW9uL2hvc3Qtc2lkZS9tYW5pZmVzdC1nZW5lcmF0b3IvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL2dlbmVyYXRvci9NYW5pZmVzdEdlbmVyYXRvclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVkNTkyNi4uMDAwMDAwMAotLS0gYS9jb21tb24vaG9zdC1zaWRlL21hbmlmZXN0LWdlbmVyYXRvci90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vZ2VuZXJhdG9yL01hbmlmZXN0R2VuZXJhdG9yVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24uZ2VuZXJhdG9yOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotLyoqIFVuaXQgdGVzdHMgZm9yIHtAbGluayBNYW5pZmVzdEdlbmVyYXRvcn0uICovCi1wdWJsaWMgY2xhc3MgTWFuaWZlc3RHZW5lcmF0b3JUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0UgPSAidGVzdC5wYWNrYWdlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5TVFJVTUVOVCA9ICJ0ZXN0LnBhY2thZ2UuVGVzdEluc3RydW1lbnQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNSU5fU0RLID0gIjgiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfU0RLID0gIjkiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNQU5JRkVTVCA9ICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCcgc3RhbmRhbG9uZT0neWVzJyA/PlxyXG4iCi0gICAgICAgICsgIjxtYW5pZmVzdCB4bWxuczphbmRyb2lkPVwiaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkXCIgIgotICAgICAgICArICJwYWNrYWdlPVwidGVzdC5wYWNrYWdlXCI+XHJcbiIKLSAgICAgICAgKyAiICA8dXNlcy1zZGsgYW5kcm9pZDptaW5TZGtWZXJzaW9uPVwiOFwiIGFuZHJvaWQ6dGFyZ2V0U2RrVmVyc2lvbj1cIjlcIiAvPlxyXG4iCi0gICAgICAgICsgIiVzIgotICAgICAgICArICIgIDxhcHBsaWNhdGlvbj5cclxuIgotICAgICAgICArICIlcyIKLSAgICAgICAgKyAiJXMiCi0gICAgICAgICsgIiAgPC9hcHBsaWNhdGlvbj5cclxuIgotICAgICAgICArICIgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPVwidGVzdC5wYWNrYWdlLlRlc3RJbnN0cnVtZW50XCIgIgotICAgICAgICArICJhbmRyb2lkOnRhcmdldFBhY2thZ2U9XCJ0ZXN0LnBhY2thZ2VcIiAvPlxyXG4iCi0gICAgICAgICsgIjwvbWFuaWZlc3Q+IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSTUlTU0lPTiA9ICIgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPVwiJXNcIiAvPlxyXG4iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJNSVNTSU9OX0EgPSAiYW5kcm9pZC5wZXJtaXNzaW9uLlBlcm1pc3Npb25BIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSTUlTU0lPTl9CID0gImFuZHJvaWQucGVybWlzc2lvbi5QZXJtaXNzaW9uQiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElWSVRZID0gIiAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPVwiJXNcIiAvPlxyXG4iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJVklUWV9BID0gInRlc3QucGFja2FnZS5BY3Rpdml0eUEiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJVklUWV9CID0gInRlc3QucGFja2FnZS5BY3Rpdml0eUIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VTX0xJQlJBUlkgPSAiICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPVwiJXNcIiAvPlxyXG4iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSUJSQVJZID0gInRlc3QucnVubmVyLmxpYnJhcnkiOwotCi0gICAgcHVibGljIHZvaWQgdGVzdE1hbmlmZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBwZXJtaXNzaW9ucyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBwZXJtaXNzaW9ucy5hZGQoUEVSTUlTU0lPTl9BKTsKLSAgICAgICAgcGVybWlzc2lvbnMuYWRkKFBFUk1JU1NJT05fQik7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBhY3Rpdml0aWVzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIGFjdGl2aXRpZXMuYWRkKEFDVElWSVRZX0EpOwotICAgICAgICBhY3Rpdml0aWVzLmFkZChBQ1RJVklUWV9CKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGxpYnJhcmllcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBsaWJyYXJpZXMuYWRkKExJQlJBUlkpOwotICAgICAgICBPdXRwdXRTdHJlYW0gb3V0cHV0ID0gbmV3IE91dHB1dFN0cmVhbSgpIHsKLSAgICAgICAgICAgIHByaXZhdGUgU3RyaW5nQnVpbGRlciBzdHJpbmcgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICB0aGlzLnN0cmluZy5hcHBlbmQoKGNoYXIpIGIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdHJpbmcudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgTWFuaWZlc3RHZW5lcmF0b3IuZ2VuZXJhdGUob3V0cHV0LCBQQUNLQUdFLCBJTlNUUlVNRU5ULCBNSU5fU0RLLCBUQVJHRVRfU0RLLAotICAgICAgICAgICAgcGVybWlzc2lvbnMsIGFjdGl2aXRpZXMsIGxpYnJhcmllcyk7Ci0gICAgICAgIFN0cmluZyBwZXJtaXNzaW9uWG1sID0gU3RyaW5nLmZvcm1hdChQRVJNSVNTSU9OLCBQRVJNSVNTSU9OX0EpCi0gICAgICAgICAgICAgICAgKyBTdHJpbmcuZm9ybWF0KFBFUk1JU1NJT04sIFBFUk1JU1NJT05fQik7Ci0gICAgICAgIFN0cmluZyBhY3Rpdml0eVhtbCA9IFN0cmluZy5mb3JtYXQoQUNUSVZJVFksIEFDVElWSVRZX0EpCi0gICAgICAgICAgICAgICAgKyBTdHJpbmcuZm9ybWF0KEFDVElWSVRZLCBBQ1RJVklUWV9CKTsKLSAgICAgICAgU3RyaW5nIGxpYnJhcnlYbWwgPSBTdHJpbmcuZm9ybWF0KFVTRVNfTElCUkFSWSwgTElCUkFSWSk7Ci0gICAgICAgIFN0cmluZyBleHBlY3RlZCA9IFN0cmluZy5mb3JtYXQoTUFOSUZFU1QsIHBlcm1pc3Npb25YbWwsIGxpYnJhcnlYbWwsIGFjdGl2aXR5WG1sKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBtYW5pZmVzdCBvdXRwdXQiLCBleHBlY3RlZCwgb3V0cHV0LnRvU3RyaW5nKCkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9BbmRyb2lkLm1rIGIvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWQyMjVlZC4uMDAwMDAwMAotLS0gYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotaW5jbHVkZSAkKGNhbGwgYWxsLXN1YmRpci1tYWtlZmlsZXMpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9yZXMvY29uZmlnL2NvbW1vbi1jb21wYXRpYmlsaXR5LWNvbmZpZy54bWwgYi9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3Jlcy9jb25maWcvY29tbW9uLWNvbXBhdGliaWxpdHktY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY5MGUyMi4uMDAwMDAwMAotLS0gYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3Jlcy9jb25maWcvY29tbW9uLWNvbXBhdGliaWxpdHktY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29tbW9uIGNvbmZpZyBmb3IgQ29tcGF0aWJpbGl0eSBzdWl0ZXMiPgotICAgIDxvcHRpb24gbmFtZT0iZHluYW1pYy1zaGFyZGluZyIgdmFsdWU9ImZhbHNlIiAvPgotICAgIDxkZXZpY2VfcmVjb3ZlcnkgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5XYWl0RGV2aWNlUmVjb3ZlcnkiIC8+Ci0gICAgPGJ1aWxkX3Byb3ZpZGVyIGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC5idWlsZC5Db21wYXRpYmlsaXR5QnVpbGRQcm92aWRlciIgLz4KLSAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGVzdHR5cGUuQ29tcGF0aWJpbGl0eVRlc3QiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb21wYXRpYmlsaXR5OnRlc3QtYXJnIiB2YWx1ZT0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuQW5kcm9pZEpVbml0VGVzdDpyZXJ1bi1mcm9tLWZpbGU6dHJ1ZSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6dGVzdC1hcmciIHZhbHVlPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5BbmRyb2lkSlVuaXRUZXN0OmZhbGxiYWNrLXRvLXNlcmlhbC1yZXJ1bjpmYWxzZSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6dGVzdC1hcmciIHZhbHVlPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LnRlc3R0eXBlLkxpYmNvcmVUZXN0OnJlcnVuLWZyb20tZmlsZTp0cnVlIiAvPgotICAgIDxvcHRpb24gbmFtZT0iY29tcGF0aWJpbGl0eTp0ZXN0LWFyZyIgdmFsdWU9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkudGVzdHR5cGUuTGliY29yZVRlc3Q6ZmFsbGJhY2stdG8tc2VyaWFsLXJlcnVuOmZhbHNlIiAvPgotCi0gICAgPGxvZ2dlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQubG9nLkZpbGVMb2dnZXIiPgotICAgICAgICA8b3B0aW9uIG5hbWU9ImxvZy1sZXZlbC1kaXNwbGF5IiB2YWx1ZT0iV0FSTiIgLz4KLSAgICA8L2xvZ2dlcj4KLSAgICA8cmVzdWx0X3JlcG9ydGVyIGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC5yZXN1bHQuQ29uc29sZVJlcG9ydGVyIiAvPgotICAgIDxyZXN1bHRfcmVwb3J0ZXIgY2xhc3M9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnJlc3VsdC5SZXN1bHRSZXBvcnRlciIgLz4KLTwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvcmVzL2NvbmZpZy9jdHMtdW5pdC10ZXN0cy54bWwgYi9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3Jlcy9jb25maWcvY3RzLXVuaXQtdGVzdHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWJkYjI1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvcmVzL2NvbmZpZy9jdHMtdW5pdC10ZXN0cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkV4ZWN1dGVzIHRoZSBDVFMgdW5pdCB0ZXN0cyI+Ci0gICAgPG9wdGlvbiBuYW1lPSJudWxsLWRldmljZSIgdmFsdWU9InRydWUiIC8+Ci0gICAgPGJ1aWxkX3Byb3ZpZGVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC5idWlsZC5TdHViQnVpbGRQcm92aWRlciIgLz4KLSAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSG9zdFRlc3QiID4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGFzcyIgdmFsdWU9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLlVuaXRUZXN0cyIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGFzcyIgdmFsdWU9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuSG9zdFVuaXRUZXN0cyIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGFzcyIgdmFsdWU9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuVW5pdFRlc3RzIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9ImNsYXNzIiB2YWx1ZT0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS50cmFkZWZlZC5DdHNUcmFkZWZlZFRlc3QiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iY2xhc3MiIHZhbHVlPSJjb20uZHJhd2VsZW1lbnRzLmRlcXAucnVubmVyLkRlcXBUZXN0UnVubmVyVGVzdCIgLz4KLSAgICA8L3Rlc3Q+Ci0gICAgPGxvZ2dlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQubG9nLkZpbGVMb2dnZXIiIC8+Ci0KLSAgICA8cmVzdWx0X3JlcG9ydGVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC5yZXN1bHQuQ29uc29sZVJlc3VsdFJlcG9ydGVyIj4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJzdXBwcmVzcy1wYXNzZWQtdGVzdHMiIHZhbHVlPSJ0cnVlIiAvPgotICAgIDwvcmVzdWx0X3JlcG9ydGVyPgotICAgIDx0ZW1wbGF0ZS1pbmNsdWRlIG5hbWU9InJlcG9ydGVycyIgZGVmYXVsdD0iZW1wdHkiIC8+Ci08L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3Jlcy9jb25maWcvZXZlcnl0aGluZy54bWwgYi9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3Jlcy9jb25maWcvZXZlcnl0aGluZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzOGFhOGEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9yZXMvY29uZmlnL2V2ZXJ5dGhpbmcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb21tb24gY29uZmlnIGZvciBDb21wYXRpYmlsaXR5IHN1aXRlcyB0byBydW4gYWxsIG1vZHVsZXMiPgotCi0gICAgPGluY2x1ZGUgbmFtZT0iY29tbW9uLWNvbXBhdGliaWxpdHktY29uZmlnIiAvPgotICAgIDxvcHRpb24gbmFtZT0icGxhbiIgdmFsdWU9ImV2ZXJ5dGhpbmciIC8+Ci0KLTwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvcmVzL2NvbmZpZy9tZXRhZGF0YS1jb25maWcueG1sIGIvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9yZXMvY29uZmlnL21ldGFkYXRhLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3ZjFhM2UuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9yZXMvY29uZmlnL21ldGFkYXRhLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249Ik1ldGFkYXRhIHJlc3VsdCByZXBvcnRlciBmb3IgQ29tcGF0aWJpbGl0eSBzdWl0ZXMiPgotICAgIDxyZXN1bHRfcmVwb3J0ZXIgY2xhc3M9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnJlc3VsdC5NZXRhZGF0YVJlcG9ydGVyIiAvPgotPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9yZXMvcmVwb3J0L2NvbXBhdGliaWxpdHlfZmFpbHVyZXMueHNsIGIvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9yZXMvcmVwb3J0L2NvbXBhdGliaWxpdHlfZmFpbHVyZXMueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjA1NWQ4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvcmVzL3JlcG9ydC9jb21wYXRpYmlsaXR5X2ZhaWx1cmVzLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDI4OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhRE9DVFlQRSB4c2w6c3R5bGVzaGVldCBbIDwhRU5USVRZIG5ic3AgIiYjMTYwOyI+IF0+Ci08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMi4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSI+Ci0KLSAgICA8eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBpbmRlbnQ9InllcyIvPgotCi0gICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+Ci0KLSAgICAgICAgPGh0bWw+Ci0gICAgICAgICAgICA8aGVhZD4KLSAgICAgICAgICAgICAgICA8dGl0bGU+VGVzdCBSZXBvcnQ8L3RpdGxlPgotICAgICAgICAgICAgICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci0gICAgICAgICAgICAgICAgICAgIEBpbXBvcnQgImNvbXBhdGliaWxpdHlfcmVzdWx0LmNzcyI7Ci0gICAgICAgICAgICAgICAgPC9zdHlsZT4KLSAgICAgICAgICAgIDwvaGVhZD4KLSAgICAgICAgICAgIDxib2R5PgotICAgICAgICAgICAgICAgIDxkaXY+Ci0gICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0idGl0bGUiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0ibGVmdCI+PGltZyBzcmM9ImxvZ28ucG5nIi8+PC90ZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgICAgICAgIDwvdGFibGU+Ci0gICAgICAgICAgICAgICAgPC9kaXY+Ci0KLSAgICAgICAgICAgICAgICA8ZGl2PgotICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9InN1bW1hcnkiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIyIj5TdW1tYXJ5PC90aD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJyb3d0aXRsZSI+U3VpdGUgLyBQbGFuPC90ZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJSZXN1bHQvQHN1aXRlX25hbWUiLz4gLyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iUmVzdWx0L0BzdWl0ZV9wbGFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJyb3d0aXRsZSI+U3VpdGUgLyBCdWlsZDwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iUmVzdWx0L0BzdWl0ZV92ZXJzaW9uIi8+IC8gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IlJlc3VsdC9Ac3VpdGVfYnVpbGRfbnVtYmVyIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJyb3d0aXRsZSI+SG9zdCBJbmZvPC90ZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdC9Ac3RhcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IlJlc3VsdC9AaG9zdF9uYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iUmVzdWx0L0Bvc19uYW1lIi8+IC0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IlJlc3VsdC9Ab3NfdmVyc2lvbiIvPikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InJvd3RpdGxlIj5TdGFydCB0aW1lIC8gRW5kIFRpbWU8L3RkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IlJlc3VsdC9Ac3RhcnRfZGlzcGxheSIvPiAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJSZXN1bHQvQGVuZF9kaXNwbGF5Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJyb3d0aXRsZSI+VGVzdHMgUGFzc2VkPC90ZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJSZXN1bHQvU3VtbWFyeS9AcGFzcyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0icm93dGl0bGUiPlRlc3RzIEZhaWxlZDwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iUmVzdWx0L1N1bW1hcnkvQGZhaWxlZCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0icm93dGl0bGUiPk1vZHVsZXMgRG9uZTwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iUmVzdWx0L1N1bW1hcnkvQG1vZHVsZXNfZG9uZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0icm93dGl0bGUiPk1vZHVsZXMgVG90YWw8L3RkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IlJlc3VsdC9TdW1tYXJ5L0Btb2R1bGVzX3RvdGFsIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJyb3d0aXRsZSI+RmluZ2VycHJpbnQ8L3RkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IlJlc3VsdC9CdWlsZC9AYnVpbGRfZmluZ2VycHJpbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InJvd3RpdGxlIj5TZWN1cml0eSBQYXRjaDwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iUmVzdWx0L0J1aWxkL0BidWlsZF92ZXJzaW9uX3NlY3VyaXR5X3BhdGNoIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJyb3d0aXRsZSI+UmVsZWFzZSAoU0RLKTwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iUmVzdWx0L0J1aWxkL0BidWlsZF92ZXJzaW9uX3JlbGVhc2UiLz4gKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJSZXN1bHQvQnVpbGQvQGJ1aWxkX3ZlcnNpb25fc2RrIi8+KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0icm93dGl0bGUiPkFCSXM8L3RkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IlJlc3VsdC9CdWlsZC9AYnVpbGRfYWJpcyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgotICAgICAgICAgICAgICAgIDwvZGl2PgotCi0gICAgICAgICAgICAgICAgPCEtLSBIaWdoIGxldmVsIHN1bW1hcnkgb2YgdGVzdCBleGVjdXRpb24gLS0+Ci0gICAgICAgICAgICAgICAgPGJyLz4KLSAgICAgICAgICAgICAgICA8ZGl2PgotICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9InRlc3RzdW1tYXJ5Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+TW9kdWxlPC90aD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+UGFzc2VkPC90aD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+RmFpbGVkPC90aD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+VG90YWwgVGVzdHM8L3RoPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5Eb25lPC90aD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iUmVzdWx0L01vZHVsZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KFRlc3RDYXNlL1Rlc3RbQHJlc3VsdCA9ICdmYWlsJ10pICZndDsgMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGFiaSIvPiYjeEEwOzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiN7JGhyZWZ9Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGFiaSIvPiYjeEEwOzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvYT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJjb3VudChUZXN0Q2FzZS9UZXN0W0ByZXN1bHQgPSAnZmFpbCddKSAmbHQ7IDEiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAYWJpIi8+JiN4QTA7PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwYXNzIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb3VudChUZXN0Q2FzZS9UZXN0W0ByZXN1bHQgPSAnZmFpbCddKSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY291bnQoVGVzdENhc2UvVGVzdFtAcmVzdWx0ID0gJ2ZhaWwnXSkgKyBAcGFzcyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGRvbmUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+IDwhLS0gZW5kIE1vZHVsZSAtLT4KLSAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KLSAgICAgICAgICAgICAgICA8L2Rpdj4KLQotICAgICAgICAgICAgICAgIDxici8+Ci0gICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRldGFpbGVkVGVzdFJlcG9ydCI+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZXN1bHRGaWx0ZXIiIHNlbGVjdD0iJ2ZhaWwnIiAvPgotICAgICAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0KLSAgICAgICAgICAgICAgICA8YnIvPgotICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJpbmNvbXBsZXRlTW9kdWxlcyIgLz4KLQotICAgICAgICAgICAgPC9ib2R5PgotICAgICAgICA8L2h0bWw+Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgICA8eHNsOnRlbXBsYXRlIG5hbWU9ImRldGFpbGVkVGVzdFJlcG9ydCI+Ci0gICAgICAgIDx4c2w6cGFyYW0gbmFtZT0icmVzdWx0RmlsdGVyIiAvPgotICAgICAgICA8ZGl2PgotICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IlJlc3VsdC9Nb2R1bGUiPgotICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJHJlc3VsdEZpbHRlcj0nJwotICAgICAgICAgICAgICAgICAgICAgICAgb3IgY291bnQoVGVzdENhc2UvVGVzdFtAcmVzdWx0PSRyZXN1bHRGaWx0ZXJdKSAmZ3Q7IDAiPgotCi0gICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0idGVzdGRldGFpbHMiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibW9kdWxlIiBjb2xzcGFuPSIzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGFiaSIvPiYjeEEwOzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBuYW1lPSJ7JGhyZWZ9Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGFiaSIvPiYjeEEwOzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvYT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCB3aWR0aD0iMzAlIj5UZXN0PC90aD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggd2lkdGg9IjUlIj5SZXN1bHQ8L3RoPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5EZXRhaWxzPC90aD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJUZXN0Q2FzZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJUZXN0Q2FzZSIgc2VsZWN0PSIuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSB0ZXN0IC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJUZXN0Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkcmVzdWx0RmlsdGVyPScnIG9yIEByZXN1bHQ9JHJlc3VsdEZpbHRlciI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0ZXN0bmFtZSI+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkVGVzdENhc2UvQG5hbWUiLz4jPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC90ZD4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gdGVzdCByZXN1bHRzIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQHJlc3VsdD0ncGFzcyciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InBhc3MiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyBtYXJnaW4tbGVmdDphdXRvOyBtYXJnaW4tcmlnaHQ6YXV0bzsiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcmVzdWx0Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJmYWlsdXJlZGV0YWlscyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJAcmVzdWx0PSdmYWlsJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZmFpbGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsgbWFyZ2luLWxlZnQ6YXV0bzsgbWFyZ2luLXJpZ2h0OmF1dG87Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHJlc3VsdCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZmFpbHVyZWRldGFpbHMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGV0YWlscyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkZhaWx1cmUvQG1lc3NhZ2UiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJAcmVzdWx0PSdub3RfZXhlY3V0ZWQnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJub3RfZXhlY3V0ZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyBtYXJnaW4tbGVmdDphdXRvOyBtYXJnaW4tcmlnaHQ6YXV0bzsiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcmVzdWx0Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJmYWlsdXJlZGV0YWlscyI+PC90ZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+IDwhLS0gZmluaXNoZWQgd2l0aCBhIHJvdyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+IDwhLS0gZW5kIHRlc3QgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KLSAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPiA8IS0tIGVuZCB0ZXN0IE1vZHVsZSAtLT4KLSAgICAgICAgPC9kaXY+Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgICA8eHNsOnRlbXBsYXRlIG5hbWU9ImluY29tcGxldGVNb2R1bGVzIj4KLSAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoUmVzdWx0L1N1bW1hcnkvQG1vZHVsZXNfZG9uZSA9IFJlc3VsdC9TdW1tYXJ5L0Btb2R1bGVzX3RvdGFsKSI+Ci0gICAgICAgICAgICA8ZGl2PgotICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iaW5jb21wbGV0ZW1vZHVsZXMiPgotICAgICAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dGg+SW5jb21wbGV0ZSBNb2R1bGVzPC90aD4KLSAgICAgICAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IlJlc3VsdC9Nb2R1bGUiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJAZG9uZT0nZmFsc2UnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBhYmkiLz4mI3hBMDs8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIG5hbWU9InskaHJlZn0iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAYWJpIi8+JiN4QTA7PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC9hPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+IDwhLS0gZW5kIHRlc3QgTW9kdWxlIC0tPgotICAgICAgICAgICAgICAgIDwvdGFibGU+Ci0gICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgPC94c2w6aWY+Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgICA8IS0tIFRha2UgYSBkZWxpbWl0ZWQgc3RyaW5nIGFuZCBpbnNlcnQgbGluZSBicmVha3MgYWZ0ZXIgYSBzb21lIG51bWJlciBvZiBlbGVtZW50cy4gLS0+Ci0gICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJmb3JtYXREZWxpbWl0ZWRTdHJpbmciPgotICAgICAgICA8eHNsOnBhcmFtIG5hbWU9InN0cmluZyIgLz4KLSAgICAgICAgPHhzbDpwYXJhbSBuYW1lPSJudW1Ub2tlbnNQZXJSb3ciIHNlbGVjdD0iMTAiIC8+Ci0gICAgICAgIDx4c2w6cGFyYW0gbmFtZT0idG9rZW5JbmRleCIgc2VsZWN0PSIxIiAvPgotICAgICAgICA8eHNsOmlmIHRlc3Q9IiRzdHJpbmciPgotICAgICAgICAgICAgPCEtLSBSZXF1aXJlcyB0aGUgbGFzdCBlbGVtZW50IHRvIGFsc28gaGF2ZSBhIGRlbGltaXRlciBhZnRlciBpdC4gLS0+Ci0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InRva2VuIiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoJHN0cmluZywgJzsnKSIgLz4KLSAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdG9rZW4iIC8+Ci0gICAgICAgICAgICA8eHNsOnRleHQ+JiMxNjA7PC94c2w6dGV4dD4KLQotICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkdG9rZW5JbmRleCBtb2QgJG51bVRva2Vuc1BlclJvdyA9IDAiPgotICAgICAgICAgICAgICAgIDxiciAvPgotICAgICAgICAgICAgPC94c2w6aWY+Ci0KLSAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJmb3JtYXREZWxpbWl0ZWRTdHJpbmciPgotICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzdHJpbmciIHNlbGVjdD0ic3Vic3RyaW5nLWFmdGVyKCRzdHJpbmcsICc7JykiIC8+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im51bVRva2Vuc1BlclJvdyIgc2VsZWN0PSIkbnVtVG9rZW5zUGVyUm93IiAvPgotICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ0b2tlbkluZGV4IiBzZWxlY3Q9IiR0b2tlbkluZGV4ICsgMSIgLz4KLSAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgICAgIDwveHNsOmlmPgotICAgIDwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9yZXMvcmVwb3J0L2NvbXBhdGliaWxpdHlfcmVzdWx0LmNzcyBiL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvcmVzL3JlcG9ydC9jb21wYXRpYmlsaXR5X3Jlc3VsdC5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5MTA1NWEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9yZXMvcmVwb3J0L2NvbXBhdGliaWxpdHlfcmVzdWx0LmNzcworKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotYm9keSB7Ci0gIGNvbG9yOiAjMzMzOwotICBmb250LWZhbWlseTogYXJpYWwsc2Fucy1zZXJpZjsKLSAgZm9udC1zaXplOiAxM3B4OwotICBtYXJnaW46IDEwOwotICBwYWRkaW5nOiAxMDsKLX0KLQotLyogUmVwb3J0IGxvZ28gYW5kIGRldmljZSBuYW1lICovCi10YWJsZS50aXRsZSB7Ci0gIGJvcmRlci13aWR0aDogMDsKLSAgbWFyZ2luLWxlZnQ6IGF1dG87Ci0gIG1hcmdpbi1yaWdodDogYXV0bzsKLSAgcGFkZGluZzogNXB4OwotICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwotfQotCi10YWJsZS5zdW1tYXJ5IHsKLSAgYmFja2dyb3VuZC1jb2xvcjogI2Q0ZTlhOTsKLSAgYm9yZGVyOiAwIHNvbGlkICNhNWM2Mzk7Ci0gIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7Ci0gIG1hcmdpbi1sZWZ0OiBhdXRvOwotICBtYXJnaW4tcmlnaHQ6IGF1dG87Ci19Ci0KLXRhYmxlLnN1bW1hcnkgdGggewotICBiYWNrZ3JvdW5kLWNvbG9yOiAjYTVjNjM5OwotICBmb250LXNpemU6IDEuMmVtOwotICBwYWRkaW5nOiAuNWVtOwotfQotCi10YWJsZS5zdW1tYXJ5IHRkIHsKLSAgYm9yZGVyOiAwIGluc2V0ICM4MDgwODA7Ci0gIGZvbnQtc2l6ZTogMWVtOwotICBwYWRkaW5nOiAuNWVtOwotICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwotfQotCi10YWJsZS50ZXN0c3VtbWFyeSB7Ci0gIGJhY2tncm91bmQtY29sb3I6ICNkNGU5YTk7Ci0gIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7Ci0gIG1hcmdpbi1sZWZ0OiBhdXRvOwotICBtYXJnaW4tcmlnaHQ6IGF1dG87Ci19Ci0KLXRhYmxlLnRlc3RzdW1tYXJ5IHRoIHsKLSAgYmFja2dyb3VuZC1jb2xvcjogI2E1YzYzOTsKLSAgYm9yZGVyOiAxcHggb3V0c2V0ICM4MDgwODA7Ci0gIHBhZGRpbmc6IC41ZW07Ci19Ci0KLXRhYmxlLnRlc3RzdW1tYXJ5IHRkIHsKLSAgYm9yZGVyOiAxcHggb3V0c2V0ICNhNWM2Mzk7Ci0gIHBhZGRpbmc6IC41ZW07Ci0gIHRleHQtYWxpZ246IGNlbnRlcjsKLX0KLQotdGFibGUudGVzdGRldGFpbHMgewotICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDRlOWE5OwotICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwotICBib3JkZXItY29sb3I6ICNhNWM2Mzk7Ci0gIGJvcmRlci13aWR0aDogMTsKLSAgbWFyZ2luLWJvdHRvbTogMmVtOwotICBtYXJnaW4tbGVmdDogYXV0bzsKLSAgbWFyZ2luLXJpZ2h0OiBhdXRvOwotICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwotICB3aWR0aDogOTUlOwotfQotCi10YWJsZS50ZXN0ZGV0YWlscyB0aCB7Ci0gIGJhY2tncm91bmQtY29sb3I6ICNhNWM2Mzk7Ci0gIGJvcmRlcjogMXB4IG91dHNldCAjODA4MDgwOwotICBoZWlnaHQ6IDJlbTsKLSAgcGFkZGluZzogLjJlbTsKLX0KLQotdGFibGUudGVzdGRldGFpbHMgdGQgewotICBib3JkZXI6IDFweCBvdXRzZXQgI2E1YzYzOTsKLSAgcGFkZGluZzogLjJlbTsKLSAgdGV4dC1hbGlnbjogbGVmdDsKLSAgdmVydGljYWwtYWxpZ246IHRvcDsKLX0KLQotdGFibGUudGVzdGRldGFpbHMgdGQubW9kdWxlIHsKLSAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsKLSAgYm9yZGVyOiAwOwotICBmb250LXdlaWdodDogYm9sZDsKLX0KLQotdGFibGUuaW5jb21wbGV0ZW1vZHVsZXMgewotICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDRlOWE5OwotICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwotICBtYXJnaW4tbGVmdDogYXV0bzsKLSAgbWFyZ2luLXJpZ2h0OiBhdXRvOwotfQotCi10YWJsZS5pbmNvbXBsZXRlbW9kdWxlcyB0aCB7Ci0gIGJhY2tncm91bmQtY29sb3I6ICNhNWM2Mzk7Ci0gIGJvcmRlcjogMXB4IG91dHNldCAjODA4MDgwOwotICBwYWRkaW5nOiAuNWVtOwotfQotCi10YWJsZS5pbmNvbXBsZXRlbW9kdWxlcyB0ZCB7Ci0gIGJvcmRlcjogMXB4IG91dHNldCAjYTVjNjM5OwotICBwYWRkaW5nOiAuNWVtOwotICB0ZXh0LWFsaWduOiBjZW50ZXI7Ci19Ci0KLS8qIFRlc3QgY2VsbCBkZXRhaWxzICovCi10ZC5mYWlsZWQgewotICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmE1ODU4OwotICBmb250LXdlaWdodDogYm9sZDsKLSAgdGV4dC1hbGlnbjogY2VudGVyOwotICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwotfQotCi10ZC5mYWlsdXJlZGV0YWlscyB7Ci0gIHRleHQtYWxpZ246IGxlZnQ7Ci19Ci0KLXRkLnBhc3MgewotICBtYXJnaW4tbGVmdDogYXV0bzsKLSAgbWFyZ2luLXJpZ2h0OiBhdXRvOwotICB0ZXh0LWFsaWduOiBjZW50ZXI7Ci19Ci0KLXRkLm5vdF9leGVjdXRlZCB7Ci0gIGJhY2tncm91bmQtY29sb3I6ICNhNWM2Mzk7Ci0gIHRleHQtYWxpZ246IGNlbnRlcjsKLSAgdmVydGljYWwtYWxpZ246IHRvcDsKLX0KLQotdGQudGVzdG5hbWUgewotICBib3JkZXI6IDFweCBvdXRzZXQgI2E1YzYzOTsKLSAgb3ZlcmZsb3c6IGhpZGRlbjsKLSAgcGFkZGluZzogMTsKLSAgdGV4dC1hbGlnbjogbGVmdDsKLSAgdmVydGljYWwtYWxpZ246IHRvcDsKLX0KLQotdGQudGVzdGNhc2UgewotICBib3JkZXI6IDFweCBvdXRzZXQgI2E1YzYzOTsKLSAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gIG92ZXJmbG93OiBoaWRkZW47Ci0gIHBhZGRpbmc6IDE7Ci0gIHRleHQtYWxpZ246IGxlZnQ7Ci0gIHZlcnRpY2FsLWFsaWduOiB0b3A7Ci19Ci0KLWRpdi5kZXRhaWxzIHsKLSAgb3ZlcmZsb3c6IGF1dG87Ci0gIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsgICAgICAgLyogY3NzLTMgKi8KLSAgd2hpdGUtc3BhY2U6IC1tb3otcHJlLXdyYXA7ICAvKiBNb3ppbGxhLCBzaW5jZSAxOTk5ICovCi0gIHdoaXRlLXNwYWNlOiAtcHJlLXdyYXA7ICAgICAgLyogT3BlcmEgNC02ICovCi0gIHdoaXRlLXNwYWNlOiAtby1wcmUtd3JhcDsgICAgLyogT3BlcmEgNyAqLwotICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7ICAgICAgIC8qIEludGVybmV0IEV4cGxvcmVyIDUuNSsgKi8KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvcmVzL3JlcG9ydC9jb21wYXRpYmlsaXR5X3Jlc3VsdC54c2QgYi9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3Jlcy9yZXBvcnQvY29tcGF0aWJpbGl0eV9yZXN1bHQueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWJhZTg1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvcmVzL3JlcG9ydC9jb21wYXRpYmlsaXR5X3Jlc3VsdC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08eHM6c2NoZW1hIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vY29tcGF0aWJpbGl0eS5hbmRyb2lkLmNvbS9jb21wYXRpYmlsaXR5X3Jlc3VsdC8xLjE1IgotICAgICAgICAgICB4bWxucz0iaHR0cDovL2NvbXBhdGliaWxpdHkuYW5kcm9pZC5jb20vY29tcGF0aWJpbGl0eV9yZXN1bHQvMS4xNSIKLSAgICAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotCi0gIDx4czplbGVtZW50IG5hbWU9IlJlc3VsdCI+Ci0gICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJTdW1tYXJ5IiB0eXBlPSJzdW1tYXJ5VHlwZSIvPgotICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJNb2R1bGUiIHR5cGU9Im1vZHVsZVR5cGUiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InN0YXJ0IiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZW5kIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icGxhbiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InN1aXRlX25hbWUiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzdWl0ZV92ZXJzaW9uIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICA8L3hzOmVsZW1lbnQ+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InN1bW1hcnlUeXBlIj4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZhaWxlZCIgdHlwZT0ieHM6aW50ZWdlciIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icGFzcyIgdHlwZT0ieHM6aW50ZWdlciIvPgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJtb2R1bGVUeXBlIj4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJUZXN0IiB0eXBlPSJ0ZXN0VHlwZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJhYmkiIHR5cGU9InhzOnN0cmluZyIvPgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9InVuaXRUeXBlIj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLSAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibm9uZSIvPgotICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJtcyIvPgotICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJmcHMiLz4KLSAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ib3BzIi8+Ci0gICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImticHMiLz4KLSAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibWJwcyIvPgotICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJieXRlIi8+Ci0gICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNvdW50Ii8+Ci0gICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InNjb3JlIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9InNjb3JlVHlwZVR5cGUiPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJoaWdoZXItYmV0dGVyIi8+Ci0gICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Imxvd2VyLWJldHRlciIvPgotICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJuZXV0cmFsIi8+Ci0gICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Indhcm5pbmciLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRlc3RUeXBlIj4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJGYWlsdXJlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJTdGFja1RyYWNlIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1lc3NhZ2UiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgPC94czplbGVtZW50PgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iU3VtbWFyeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmRlY2ltYWwiPgotICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1lc3NhZ2UiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzY29yZVR5cGUiIHR5cGU9InNjb3JlVHlwZVR5cGUiIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idW5pdCIgdHlwZT0idW5pdFR5cGUiIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0IiB0eXBlPSJ4czpkZWNpbWFsIiAvPgotICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgPC94czpzaW1wbGVDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgPC94czplbGVtZW50PgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRGV0YWlscyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iVmFsdWVBcnJheSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJWYWx1ZSIgdHlwZT0ieHM6ZGVjaW1hbCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic291cmNlIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtZXNzYWdlIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzY29yZVR5cGUiIHR5cGU9InNjb3JlVHlwZVR5cGUiIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ1bml0IiB0eXBlPSJ1bml0VHlwZSIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgPC94czplbGVtZW50PgotICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlc3VsdCIgdHlwZT0icmVzdWx0VHlwZSIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic3RhcnQiIHR5cGU9InhzOnN0cmluZyIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZW5kIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJyZXN1bHRUeXBlIj4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLSAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0icGFzcyIvPgotICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJmYWlsIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVUeXBlPgotPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3Jlcy9yZXBvcnQvY29tcGF0aWJpbGl0eV9yZXN1bHQueHNsIGIvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9yZXMvcmVwb3J0L2NvbXBhdGliaWxpdHlfcmVzdWx0LnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODcwZjk5NC4uMDAwMDAwMAotLS0gYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3Jlcy9yZXBvcnQvY29tcGF0aWJpbGl0eV9yZXN1bHQueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMjg4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCFET0NUWVBFIHhzbDpzdHlsZXNoZWV0IFsgPCFFTlRJVFkgbmJzcCAiJiMxNjA7Ij4gXT4KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIyLjAiIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIj4KLQotICAgIDx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIGluZGVudD0ieWVzIi8+Ci0KLSAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KLQotICAgICAgICA8aHRtbD4KLSAgICAgICAgICAgIDxoZWFkPgotICAgICAgICAgICAgICAgIDx0aXRsZT5UZXN0IFJlcG9ydDwvdGl0bGU+Ci0gICAgICAgICAgICAgICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLSAgICAgICAgICAgICAgICAgICAgQGltcG9ydCAiY29tcGF0aWJpbGl0eV9yZXN1bHQuY3NzIjsKLSAgICAgICAgICAgICAgICA8L3N0eWxlPgotICAgICAgICAgICAgPC9oZWFkPgotICAgICAgICAgICAgPGJvZHk+Ci0gICAgICAgICAgICAgICAgPGRpdj4KLSAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJ0aXRsZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJsZWZ0Ij48aW1nIHNyYz0ibG9nby5wbmciLz48L3RkPgotICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KLSAgICAgICAgICAgICAgICA8L2Rpdj4KLQotICAgICAgICAgICAgICAgIDxkaXY+Ci0gICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0ic3VtbWFyeSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjIiPlN1bW1hcnk8L3RoPgotICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InJvd3RpdGxlIj5TdWl0ZSAvIFBsYW48L3RkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IlJlc3VsdC9Ac3VpdGVfbmFtZSIvPiAvIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJSZXN1bHQvQHN1aXRlX3BsYW4iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InJvd3RpdGxlIj5TdWl0ZSAvIEJ1aWxkPC90ZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJSZXN1bHQvQHN1aXRlX3ZlcnNpb24iLz4gLyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iUmVzdWx0L0BzdWl0ZV9idWlsZF9udW1iZXIiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InJvd3RpdGxlIj5Ib3N0IEluZm88L3RkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0L0BzdGFydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iUmVzdWx0L0Bob3N0X25hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJSZXN1bHQvQG9zX25hbWUiLz4gLSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iUmVzdWx0L0Bvc192ZXJzaW9uIi8+KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0icm93dGl0bGUiPlN0YXJ0IHRpbWUgLyBFbmQgVGltZTwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iUmVzdWx0L0BzdGFydF9kaXNwbGF5Ii8+IC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IlJlc3VsdC9AZW5kX2Rpc3BsYXkiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InJvd3RpdGxlIj5UZXN0cyBQYXNzZWQ8L3RkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IlJlc3VsdC9TdW1tYXJ5L0BwYXNzIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJyb3d0aXRsZSI+VGVzdHMgRmFpbGVkPC90ZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJSZXN1bHQvU3VtbWFyeS9AZmFpbGVkIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJyb3d0aXRsZSI+TW9kdWxlcyBEb25lPC90ZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJSZXN1bHQvU3VtbWFyeS9AbW9kdWxlc19kb25lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJyb3d0aXRsZSI+TW9kdWxlcyBUb3RhbDwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iUmVzdWx0L1N1bW1hcnkvQG1vZHVsZXNfdG90YWwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InJvd3RpdGxlIj5GaW5nZXJwcmludDwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iUmVzdWx0L0J1aWxkL0BidWlsZF9maW5nZXJwcmludCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0icm93dGl0bGUiPlNlY3VyaXR5IFBhdGNoPC90ZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJSZXN1bHQvQnVpbGQvQGJ1aWxkX3ZlcnNpb25fc2VjdXJpdHlfcGF0Y2giLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InJvd3RpdGxlIj5SZWxlYXNlIChTREspPC90ZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJSZXN1bHQvQnVpbGQvQGJ1aWxkX3ZlcnNpb25fcmVsZWFzZSIvPiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IlJlc3VsdC9CdWlsZC9AYnVpbGRfdmVyc2lvbl9zZGsiLz4pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJyb3d0aXRsZSI+QUJJczwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iUmVzdWx0L0J1aWxkL0BidWlsZF9hYmlzIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgICAgICAgIDwvdGFibGU+Ci0gICAgICAgICAgICAgICAgPC9kaXY+Ci0KLSAgICAgICAgICAgICAgICA8IS0tIEhpZ2ggbGV2ZWwgc3VtbWFyeSBvZiB0ZXN0IGV4ZWN1dGlvbiAtLT4KLSAgICAgICAgICAgICAgICA8YnIvPgotICAgICAgICAgICAgICAgIDxkaXY+Ci0gICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0idGVzdHN1bW1hcnkiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5Nb2R1bGU8L3RoPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5QYXNzZWQ8L3RoPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5GYWlsZWQ8L3RoPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5Ub3RhbCBUZXN0czwvdGg+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPkRvbmU8L3RoPgotICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJSZXN1bHQvTW9kdWxlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBhYmkiLz4mI3hBMDs8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiN7JGhyZWZ9Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGFiaSIvPiYjeEEwOzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvYT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvdW50KFRlc3RDYXNlL1Rlc3RbQHJlc3VsdCA9ICdwYXNzJ10pIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb3VudChUZXN0Q2FzZS9UZXN0W0ByZXN1bHQgPSAnZmFpbCddKSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY291bnQoVGVzdENhc2UvVGVzdCkiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBkb25lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPiA8IS0tIGVuZCBNb2R1bGUgLS0+Ci0gICAgICAgICAgICAgICAgICAgIDwvdGFibGU+Ci0gICAgICAgICAgICAgICAgPC9kaXY+Ci0KLSAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZmlsdGVyZWRSZXN1bHRUZXN0UmVwb3J0Ij4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImhlYWRlciIgc2VsZWN0PSInRmFpbGVkIFRlc3RzJyIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlc3VsdEZpbHRlciIgc2VsZWN0PSInZmFpbCciIC8+Ci0gICAgICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQotICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJmaWx0ZXJlZFJlc3VsdFRlc3RSZXBvcnQiPgotICAgICAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0iaGVhZGVyIiBzZWxlY3Q9IidOb3QgRXhlY3V0ZWQgVGVzdHMnIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVzdWx0RmlsdGVyIiBzZWxlY3Q9Iidub3RfZXhlY3V0ZWQnIiAvPgotICAgICAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0KLSAgICAgICAgICAgICAgICA8YnIvPgotICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkZXRhaWxlZFRlc3RSZXBvcnQiIC8+Ci0KLSAgICAgICAgICAgIDwvYm9keT4KLSAgICAgICAgPC9odG1sPgotICAgIDwveHNsOnRlbXBsYXRlPgotCi0gICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJmaWx0ZXJlZFJlc3VsdFRlc3RSZXBvcnQiPgotICAgICAgICA8eHNsOnBhcmFtIG5hbWU9ImhlYWRlciIgLz4KLSAgICAgICAgPHhzbDpwYXJhbSBuYW1lPSJyZXN1bHRGaWx0ZXIiIC8+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibnVtTWF0Y2hpbmciIHNlbGVjdD0iY291bnQoUmVzdWx0L01vZHVsZS9UZXN0Q2FzZS9UZXN0W0ByZXN1bHQ9JHJlc3VsdEZpbHRlcl0pIiAvPgotICAgICAgICA8eHNsOmlmIHRlc3Q9IiRudW1NYXRjaGluZyAmZ3Q7IDAiPgotICAgICAgICAgICAgPGgyIGFsaWduPSJjZW50ZXIiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaGVhZGVyIiAvPiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRudW1NYXRjaGluZyIvPik8L2gyPgotICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRldGFpbGVkVGVzdFJlcG9ydCI+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlc3VsdEZpbHRlciIgc2VsZWN0PSIkcmVzdWx0RmlsdGVyIi8+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZ1bGxTdGFja1RyYWNlIiBzZWxlY3Q9InRydWUoKSIvPgotICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICAgICAgPC94c2w6aWY+Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgICA8eHNsOnRlbXBsYXRlIG5hbWU9ImRldGFpbGVkVGVzdFJlcG9ydCI+Ci0gICAgICAgIDx4c2w6cGFyYW0gbmFtZT0icmVzdWx0RmlsdGVyIiAvPgotICAgICAgICA8eHNsOnBhcmFtIG5hbWU9ImZ1bGxTdGFja1RyYWNlIiAvPgotICAgICAgICA8ZGl2PgotICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IlJlc3VsdC9Nb2R1bGUiPgotICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJHJlc3VsdEZpbHRlcj0nJwotICAgICAgICAgICAgICAgICAgICAgICAgb3IgY291bnQoVGVzdENhc2UvVGVzdFtAcmVzdWx0PSRyZXN1bHRGaWx0ZXJdKSAmZ3Q7IDAiPgotCi0gICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0idGVzdGRldGFpbHMiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibW9kdWxlIiBjb2xzcGFuPSIzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGFiaSIvPiYjeEEwOzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBuYW1lPSJ7JGhyZWZ9Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGFiaSIvPiYjeEEwOzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvYT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCB3aWR0aD0iMzAlIj5UZXN0PC90aD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggd2lkdGg9IjUlIj5SZXN1bHQ8L3RoPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5EZXRhaWxzPC90aD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJUZXN0Q2FzZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJUZXN0Q2FzZSIgc2VsZWN0PSIuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSB0ZXN0IC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJUZXN0Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkcmVzdWx0RmlsdGVyPScnIG9yIEByZXN1bHQ9JHJlc3VsdEZpbHRlciI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0ZXN0bmFtZSI+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkVGVzdENhc2UvQG5hbWUiLz4jPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC90ZD4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gdGVzdCByZXN1bHRzIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQHJlc3VsdD0ncGFzcyciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InBhc3MiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyBtYXJnaW4tbGVmdDphdXRvOyBtYXJnaW4tcmlnaHQ6YXV0bzsiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcmVzdWx0Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJmYWlsdXJlZGV0YWlscyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJAcmVzdWx0PSdmYWlsJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZmFpbGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsgbWFyZ2luLWxlZnQ6YXV0bzsgbWFyZ2luLXJpZ2h0OmF1dG87Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHJlc3VsdCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZmFpbHVyZWRldGFpbHMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGV0YWlscyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkZnVsbFN0YWNrVHJhY2U9dHJ1ZSgpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJGYWlsdXJlL1N0YWNrVHJhY2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkZhaWx1cmUvQG1lc3NhZ2UiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJAcmVzdWx0PSdub3RfZXhlY3V0ZWQnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJub3RfZXhlY3V0ZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyBtYXJnaW4tbGVmdDphdXRvOyBtYXJnaW4tcmlnaHQ6YXV0bzsiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcmVzdWx0Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJmYWlsdXJlZGV0YWlscyI+PC90ZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+IDwhLS0gZmluaXNoZWQgd2l0aCBhIHJvdyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+IDwhLS0gZW5kIHRlc3QgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KLSAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPiA8IS0tIGVuZCB0ZXN0IE1vZHVsZSAtLT4KLSAgICAgICAgPC9kaXY+Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgICA8IS0tIFRha2UgYSBkZWxpbWl0ZWQgc3RyaW5nIGFuZCBpbnNlcnQgbGluZSBicmVha3MgYWZ0ZXIgYSBzb21lIG51bWJlciBvZiBlbGVtZW50cy4gLS0+Ci0gICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJmb3JtYXREZWxpbWl0ZWRTdHJpbmciPgotICAgICAgICA8eHNsOnBhcmFtIG5hbWU9InN0cmluZyIgLz4KLSAgICAgICAgPHhzbDpwYXJhbSBuYW1lPSJudW1Ub2tlbnNQZXJSb3ciIHNlbGVjdD0iMTAiIC8+Ci0gICAgICAgIDx4c2w6cGFyYW0gbmFtZT0idG9rZW5JbmRleCIgc2VsZWN0PSIxIiAvPgotICAgICAgICA8eHNsOmlmIHRlc3Q9IiRzdHJpbmciPgotICAgICAgICAgICAgPCEtLSBSZXF1aXJlcyB0aGUgbGFzdCBlbGVtZW50IHRvIGFsc28gaGF2ZSBhIGRlbGltaXRlciBhZnRlciBpdC4gLS0+Ci0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InRva2VuIiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoJHN0cmluZywgJzsnKSIgLz4KLSAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdG9rZW4iIC8+Ci0gICAgICAgICAgICA8eHNsOnRleHQ+JiMxNjA7PC94c2w6dGV4dD4KLQotICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkdG9rZW5JbmRleCBtb2QgJG51bVRva2Vuc1BlclJvdyA9IDAiPgotICAgICAgICAgICAgICAgIDxiciAvPgotICAgICAgICAgICAgPC94c2w6aWY+Ci0KLSAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJmb3JtYXREZWxpbWl0ZWRTdHJpbmciPgotICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzdHJpbmciIHNlbGVjdD0ic3Vic3RyaW5nLWFmdGVyKCRzdHJpbmcsICc7JykiIC8+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im51bVRva2Vuc1BlclJvdyIgc2VsZWN0PSIkbnVtVG9rZW5zUGVyUm93IiAvPgotICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ0b2tlbkluZGV4IiBzZWxlY3Q9IiR0b2tlbkluZGV4ICsgMSIgLz4KLSAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgICAgIDwveHNsOmlmPgotICAgIDwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9yZXMvcmVwb3J0L2xvZ28ucG5nIGIvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9yZXMvcmVwb3J0L2xvZ28ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTk3MGIzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvcmVzL3JlcG9ydC9sb2dvLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL2J1aWxkL0NvbXBhdGliaWxpdHlCdWlsZEhlbHBlci5qYXZhIGIvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvYnVpbGQvQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZDFjM2EuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvYnVpbGQvQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLmJ1aWxkOwotCi1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuYnVpbGQuSUJ1aWxkSW5mbzsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5idWlsZC5JRm9sZGVyQnVpbGRJbmZvOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmJ1aWxkLlZlcnNpb25lZEZpbGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudXRpbC5GaWxlVXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEEgc2ltcGxlIGhlbHBlciB0aGF0IHN0b3JlcyBhbmQgcmV0cmlldmVzIGluZm9ybWF0aW9uIGZyb20gYSB7QGxpbmsgSUJ1aWxkSW5mb30uCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX0lEUyA9ICJNT0RVTEVfSURTIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST09UX0RJUiA9ICJST09UX0RJUiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VJVEVfQlVJTEQgPSAiU1VJVEVfQlVJTEQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVSVRFX05BTUUgPSAiU1VJVEVfTkFNRSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VJVEVfRlVMTF9OQU1FID0gIlNVSVRFX0ZVTExfTkFNRSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VJVEVfVkVSU0lPTiA9ICJTVUlURV9WRVJTSU9OIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVUlURV9QTEFOID0gIlNVSVRFX1BMQU4iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVJUX1RJTUVfTVMgPSAiU1RBUlRfVElNRV9NUyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9MSU5FX0FSR1MgPSAiY29tbWFuZF9saW5lX2FyZ3MiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1RfRElSMiA9ICJST09UX0RJUjIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEWU5BTUlDX0NPTkZJR19PVkVSUklERV9VUkwgPSAiRFlOQU1JQ19DT05GSUdfT1ZFUlJJREVfVVJMIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVTSU5FU1NfTE9HSUNfSE9TVF9GSUxFID0gIkJVU0lORVNTX0xPR0lDX0hPU1RfRklMRSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFVFJZX0NPTU1BTkRfTElORV9BUkdTID0gInJldHJ5X2NvbW1hbmRfbGluZV9hcmdzIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxUX0hPU1RfVEVTVENBU0VfRElSID0gIkFORFJPSURfSE9TVF9PVVRfVEVTVENBU0VTIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxUX1RBUkdFVF9URVNUQ0FTRV9ESVIgPSAiQU5EUk9JRF9UQVJHRVRfT1VUX1RFU1RDQVNFUyI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX1BBVEhfUFJFRklYID0gIkRZTkFNSUNfQ09ORklHX0ZJTEU6IjsKLQotICAgIHByaXZhdGUgZmluYWwgSUJ1aWxkSW5mbyBtQnVpbGRJbmZvOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHtAbGluayBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXJ9IHdyYXBwaW5nIHRoZSBnaXZlbiB7QGxpbmsgSUJ1aWxkSW5mb30uCi0gICAgICovCi0gICAgcHVibGljIENvbXBhdGliaWxpdHlCdWlsZEhlbHBlcihJQnVpbGRJbmZvIGJ1aWxkSW5mbykgewotICAgICAgICBtQnVpbGRJbmZvID0gYnVpbGRJbmZvOwotICAgIH0KLQotICAgIHB1YmxpYyBJQnVpbGRJbmZvIGdldEJ1aWxkSW5mbygpIHsKLSAgICAgICAgcmV0dXJuIG1CdWlsZEluZm87Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UmV0cnlDb21tYW5kTGluZUFyZ3MoU3RyaW5nIGNvbW1hbmRMaW5lQXJncykgewotICAgICAgICBtQnVpbGRJbmZvLmFkZEJ1aWxkQXR0cmlidXRlKFJFVFJZX0NPTU1BTkRfTElORV9BUkdTLCBjb21tYW5kTGluZUFyZ3MpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29tbWFuZExpbmVBcmdzKCkgewotICAgICAgICBpZiAobUJ1aWxkSW5mby5nZXRCdWlsZEF0dHJpYnV0ZXMoKS5jb250YWluc0tleShSRVRSWV9DT01NQU5EX0xJTkVfQVJHUykpIHsKLSAgICAgICAgICAgIHJldHVybiBtQnVpbGRJbmZvLmdldEJ1aWxkQXR0cmlidXRlcygpLmdldChSRVRSWV9DT01NQU5EX0xJTkVfQVJHUyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBOT1RFOiB0aGlzIGlzIGEgdGVtcG9yYXJ5IHdvcmthcm91bmQgc2V0IGluIFRlc3RJbnZvY2F0aW9uI2ludm9rZSBpbiB0cmFkZWZlZC4KLSAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBiZSBtb3ZlZCB0byBhIHNlcGFyYXRlIG1ldGhvZCBpbiBhIG5ldyBpbnZvY2F0aW9uIG1ldGFkYXRhIGNsYXNzLgotICAgICAgICAgICAgcmV0dXJuIG1CdWlsZEluZm8uZ2V0QnVpbGRBdHRyaWJ1dGVzKCkuZ2V0KENPTU1BTkRfTElORV9BUkdTKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVjZW50Q29tbWFuZExpbmVBcmdzKCkgewotICAgICAgICByZXR1cm4gbUJ1aWxkSW5mby5nZXRCdWlsZEF0dHJpYnV0ZXMoKS5nZXQoQ09NTUFORF9MSU5FX0FSR1MpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3VpdGVCdWlsZCgpIHsKLSAgICAgICAgcmV0dXJuIG1CdWlsZEluZm8uZ2V0QnVpbGRBdHRyaWJ1dGVzKCkuZ2V0KFNVSVRFX0JVSUxEKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN1aXRlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1CdWlsZEluZm8uZ2V0QnVpbGRBdHRyaWJ1dGVzKCkuZ2V0KFNVSVRFX05BTUUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3VpdGVGdWxsTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1CdWlsZEluZm8uZ2V0QnVpbGRBdHRyaWJ1dGVzKCkuZ2V0KFNVSVRFX0ZVTExfTkFNRSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTdWl0ZVZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiBtQnVpbGRJbmZvLmdldEJ1aWxkQXR0cmlidXRlcygpLmdldChTVUlURV9WRVJTSU9OKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN1aXRlUGxhbigpIHsKLSAgICAgICAgcmV0dXJuIG1CdWlsZEluZm8uZ2V0QnVpbGRBdHRyaWJ1dGVzKCkuZ2V0KFNVSVRFX1BMQU4pOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RHluYW1pY0NvbmZpZ1VybCgpIHsKLSAgICAgICAgcmV0dXJuIG1CdWlsZEluZm8uZ2V0QnVpbGRBdHRyaWJ1dGVzKCkuZ2V0KERZTkFNSUNfQ09ORklHX09WRVJSSURFX1VSTCk7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0U3RhcnRUaW1lKCkgewotICAgICAgICByZXR1cm4gTG9uZy5wYXJzZUxvbmcobUJ1aWxkSW5mby5nZXRCdWlsZEF0dHJpYnV0ZXMoKS5nZXQoU1RBUlRfVElNRV9NUykpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZER5bmFtaWNDb25maWdGaWxlKFN0cmluZyBtb2R1bGVOYW1lLCBGaWxlIGNvbmZpZ0ZpbGUpIHsKLSAgICAgICAgLy8gSWYgaW52b2NhdGlvbiBmYWlscyBhbmQgUmVzdWx0UmVwb3J0ZXIgbmV2ZXIgbW92ZXMgdGhpcyBmaWxlIGludG8gdGhlIHJlc3VsdCwKLSAgICAgICAgLy8gdXNpbmcgc2V0RmlsZSgpIGVuc3VyZXMgQnVpbGRJbmZvIHdpbGwgZGVsZXRlIHVwb24gY2xlYW5VcCgpLgotICAgICAgICBtQnVpbGRJbmZvLnNldEZpbGUoY29uZmlnRmlsZS5nZXROYW1lKCksIGNvbmZpZ0ZpbGUsCi0gICAgICAgICAgICAgICAgQ09ORklHX1BBVEhfUFJFRklYICsgbW9kdWxlTmFtZSAvKiB2ZXJzaW9uICovKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCdXNpbmVzc0xvZ2ljSG9zdEZpbGUoRmlsZSBob3N0RmlsZSkgewotICAgICAgICBtQnVpbGRJbmZvLmFkZEJ1aWxkQXR0cmlidXRlKEJVU0lORVNTX0xPR0lDX0hPU1RfRklMRSwgaG9zdEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1vZHVsZUlkcyhTdHJpbmdbXSBtb2R1bGVJZHMpIHsKLSAgICAgICAgbUJ1aWxkSW5mby5hZGRCdWlsZEF0dHJpYnV0ZShNT0RVTEVfSURTLCBTdHJpbmcuam9pbigiLCIsIG1vZHVsZUlkcykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1hcCBvZiB0aGUgZHluYW1pYyBjb25maWcgZmlsZXMgZG93bmxvYWRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgRmlsZT4gZ2V0RHluYW1pY0NvbmZpZ0ZpbGVzKCkgewotICAgICAgICBNYXA8U3RyaW5nLCBGaWxlPiBjb25maWdNYXAgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgICAgIGZvciAoVmVyc2lvbmVkRmlsZSB2RmlsZSA6IG1CdWlsZEluZm8uZ2V0RmlsZXMoKSkgewotICAgICAgICAgICAgaWYgKHZGaWxlLmdldFZlcnNpb24oKS5zdGFydHNXaXRoKENPTkZJR19QQVRIX1BSRUZJWCkpIHsKLSAgICAgICAgICAgICAgICBjb25maWdNYXAucHV0KAotICAgICAgICAgICAgICAgICAgICAgICAgdkZpbGUuZ2V0VmVyc2lvbigpLnN1YnN0cmluZyhDT05GSUdfUEFUSF9QUkVGSVgubGVuZ3RoKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgdkZpbGUuZ2V0RmlsZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29uZmlnTWFwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgYnVzaW5lc3MgbG9naWMgZmlsZSBoYXMgYmVlbiBzZXQgZm9yIHRoaXMgaW52b2NhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNCdXNpbmVzc0xvZ2ljSG9zdEZpbGUoKSB7Ci0gICAgICAgIHJldHVybiBtQnVpbGRJbmZvLmdldEJ1aWxkQXR0cmlidXRlcygpLmdldChCVVNJTkVTU19MT0dJQ19IT1NUX0ZJTEUpICE9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBhIHtAbGluayBGaWxlfSByZXByZXNlbnRpbmcgdGhlIGZpbGUgY29udGFpbmluZyBidXNpbmVzcyBsb2dpYyBkYXRhIGZvciB0aGlzCi0gICAgICogaW52b2NhdGlvbiwgb3IgbnVsbCBpZiB0aGUgYnVzaW5lc3MgbG9naWMgZmlsZSBoYXMgbm90IGJlZW4gc2V0LgotICAgICAqLwotICAgIHB1YmxpYyBGaWxlIGdldEJ1c2luZXNzTG9naWNIb3N0RmlsZSgpIHsKLSAgICAgICAgcmV0dXJuIChoYXNCdXNpbmVzc0xvZ2ljSG9zdEZpbGUoKSkgPwotICAgICAgICAgICAgICAgIG5ldyBGaWxlKG1CdWlsZEluZm8uZ2V0QnVpbGRBdHRyaWJ1dGVzKCkuZ2V0KEJVU0lORVNTX0xPR0lDX0hPU1RfRklMRSkpIDogbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIGEge0BsaW5rIEZpbGV9IHJlcHJlc2VudGluZyB0aGUgZGlyZWN0b3J5IGhvbGRpbmcgdGhlIENvbXBhdGliaWxpdHkgaW5zdGFsbGF0aW9uCi0gICAgICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gaWYgdGhlIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdAotICAgICAqLwotICAgIHB1YmxpYyBGaWxlIGdldFJvb3REaXIoKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZSBkaXIgPSBudWxsOwotICAgICAgICBpZiAobUJ1aWxkSW5mbyBpbnN0YW5jZW9mIElGb2xkZXJCdWlsZEluZm8pIHsKLSAgICAgICAgICAgIGRpciA9ICgoSUZvbGRlckJ1aWxkSW5mbykgbUJ1aWxkSW5mbykuZ2V0Um9vdERpcigpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkaXIgPT0gbnVsbCB8fCAhZGlyLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBkaXIgPSBuZXcgRmlsZShtQnVpbGRJbmZvLmdldEJ1aWxkQXR0cmlidXRlcygpLmdldChST09UX0RJUikpOwotICAgICAgICAgICAgaWYgKCFkaXIuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICBkaXIgPSBuZXcgRmlsZShtQnVpbGRJbmZvLmdldEJ1aWxkQXR0cmlidXRlcygpLmdldChST09UX0RJUjIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoIWRpci5leGlzdHMoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAiQ29tcGF0aWJpbGl0eSByb290IGRpcmVjdG9yeSAlcyBkb2VzIG5vdCBleGlzdCIsCi0gICAgICAgICAgICAgICAgICAgIGRpci5nZXRBYnNvbHV0ZVBhdGgoKSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkaXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBhIHtAbGluayBGaWxlfSByZXByZXNlbnRpbmcgdGhlICJhbmRyb2lkLTxzdWl0ZT4iIGZvbGRlciBvZiB0aGUgQ29tcGF0aWJpbGl0eQotICAgICAqIGluc3RhbGxhdGlvbgotICAgICAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGlmIHRoZSBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgRmlsZSBnZXREaXIoKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZSBkaXIgPSBuZXcgRmlsZShnZXRSb290RGlyKCksIFN0cmluZy5mb3JtYXQoImFuZHJvaWQtJXMiLCBnZXRTdWl0ZU5hbWUoKS50b0xvd2VyQ2FzZSgpKSk7Ci0gICAgICAgIGlmICghZGlyLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICJDb21wYXRpYmlsaXR5IGluc3RhbGwgZm9sZGVyICVzIGRvZXMgbm90IGV4aXN0IiwKLSAgICAgICAgICAgICAgICAgICAgZGlyLmdldEFic29sdXRlUGF0aCgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRpcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIGEge0BsaW5rIEZpbGV9IHJlcHJlc2VudGluZyB0aGUgcmVzdWx0cyBkaXJlY3RvcnkuCi0gICAgICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gaWYgdGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgaXMgbm90IHZhbGlkLgotICAgICAqLwotICAgIHB1YmxpYyBGaWxlIGdldFJlc3VsdHNEaXIoKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG5ldyBGaWxlKGdldERpcigpLCAicmVzdWx0cyIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gYSB7QGxpbmsgRmlsZX0gcmVwcmVzZW50aW5nIHRoZSByZXN1bHQgZGlyZWN0b3J5IG9mIHRoZSBjdXJyZW50IGludm9jYXRpb24uCi0gICAgICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gaWYgdGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgaXMgbm90IHZhbGlkLgotICAgICAqLwotICAgIHB1YmxpYyBGaWxlIGdldFJlc3VsdERpcigpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbmV3IEZpbGUoZ2V0UmVzdWx0c0RpcigpLAotICAgICAgICAgICAgZ2V0RGlyU3VmZml4KExvbmcucGFyc2VMb25nKG1CdWlsZEluZm8uZ2V0QnVpbGRBdHRyaWJ1dGVzKCkuZ2V0KFNUQVJUX1RJTUVfTVMpKSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gYSB7QGxpbmsgRmlsZX0gcmVwcmVzZW50aW5nIHRoZSBkaXJlY3RvcnkgdG8gc3RvcmUgcmVzdWx0IGxvZ3MuCi0gICAgICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gaWYgdGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgaXMgbm90IHZhbGlkLgotICAgICAqLwotICAgIHB1YmxpYyBGaWxlIGdldExvZ3NEaXIoKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG5ldyBGaWxlKGdldERpcigpLCAibG9ncyIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gYSB7QGxpbmsgRmlsZX0gcmVwcmVzZW50aW5nIHRoZSBkaXJlY3RvcnkgdG8gc3RvcmUgZGVyaXZlZHBsYW4gZmlsZXMuCi0gICAgICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gaWYgdGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgaXMgbm90IHZhbGlkLgotICAgICAqLwotICAgIHB1YmxpYyBGaWxlIGdldFN1YlBsYW5zRGlyKCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgc3ViUGxhbnNEaXIgPSBuZXcgRmlsZShnZXREaXIoKSwgInN1YnBsYW5zIik7Ci0gICAgICAgIGlmICghc3ViUGxhbnNEaXIuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHN1YlBsYW5zRGlyLm1rZGlycygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdWJQbGFuc0RpcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIGEge0BsaW5rIEZpbGV9IHJlcHJlc2VudGluZyB0aGUgZGlyZWN0b3J5IHRvIHN0b3JlIHNjcmVlbnNob3RzIHRha2VuIHdoaWxlIHRlc3RpbmcuCi0gICAgICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gaWYgdGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgaXMgbm90IHZhbGlkLgotICAgICAqLwotICAgIHB1YmxpYyBGaWxlIGdldFNjcmVlbnNob3RzRGlyKCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgc2NyZWVuc2hvdHNEaXIgPSBuZXcgRmlsZShnZXRSZXN1bHREaXIoKSwgInNjcmVlbnNob3RzIik7Ci0gICAgICAgIGlmICghc2NyZWVuc2hvdHNEaXIuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHNjcmVlbnNob3RzRGlyLm1rZGlycygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzY3JlZW5zaG90c0RpcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIGEge0BsaW5rIEZpbGV9IHJlcHJlc2VudGluZyB0aGUgdGVzdCBtb2R1bGVzIGRpcmVjdG9yeS4KLSAgICAgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBpZiB0aGUgZGlyZWN0b3J5IHN0cnVjdHVyZSBpcyBub3QgdmFsaWQuCi0gICAgICovCi0gICAgcHVibGljIEZpbGUgZ2V0VGVzdHNEaXIoKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gV2UgaGF2ZSAzIG9wdGlvbnMgdGhhdCBjYW4gYmUgdGhlIHRlc3QgbW9kdWxlcyBkaXIgKGFuZCB3ZSdyZSBnb2luZwotICAgICAgICAvLyBsb29rIGZvciB0aGVtIGluIHRoZSBmb2xsb3dpbmcgb3JkZXIpOgotICAgICAgICAvLyAgIDEuIC4uL2FuZHJvaWQtKnRzL3Rlc3RjYXNlcy8KLSAgICAgICAgLy8gICAyLiBBTFRfSE9TVF9URVNUQ0FTRV9ESVIKLSAgICAgICAgLy8gICAzLiBBTFRfVEFSR0VUX1RFU1RDQVNFX0RJUiAod2UnbGwgc2tpcCB0aGlzIHNpbmNlIGlmICMyIGZhaWxzLCB0aGlzCi0gICAgICAgIC8vICAgICAgd2lsbCBpbmV2aXRhYmx5IGZhaWwgYXMgd2VsbC4pCi0KLSAgICAgICAgRmlsZSB0ZXN0c0RpciA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0ZXN0c0RpciA9IG5ldyBGaWxlKGdldERpcigpLCAidGVzdGNhc2VzIik7Ci0gICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB8IE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIE9rLCBubyByb290IGRpciBmb3IgdXMgdG8gZ2V0LCBtb3Zpbmcgb24gdG8gdGhlIG5leHQgb3B0aW9uLgotICAgICAgICAgICAgdGVzdHNEaXIgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHRlc3RzRGlyID09IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBhbHRUZXN0c0RpciA9IFN5c3RlbS5nZXRlbnYoKS5nZXQoQUxUX0hPU1RfVEVTVENBU0VfRElSKTsKLSAgICAgICAgICAgIGlmIChhbHRUZXN0c0RpciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGVzdHNEaXIgPSBuZXcgRmlsZShhbHRUZXN0c0Rpcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUaGlzIGp1c3QgbWVhbnMgd2UgaGF2ZSBubyBzaWducyBvZiB3aGVyZSB0byBjaGVjayBmb3IgdGhlIHRlc3QgZGlyLgotICAgICAgICBpZiAodGVzdHNEaXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJObyBDb21wYXRpYmlsaXR5IHRlc3RzIGZvbGRlciBzZXQsIGRpZCB5b3UgcnVuIGx1bmNoPyIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghdGVzdHNEaXIuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgIkNvbXBhdGliaWxpdHkgdGVzdHMgZm9sZGVyICVzIGRvZXMgbm90IGV4aXN0IiwKLSAgICAgICAgICAgICAgICAgICAgdGVzdHNEaXIuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0ZXN0c0RpcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIGEge0BsaW5rIEZpbGV9IHJlcHJlc2VudGluZyB0aGUgdGVzdCBmaWxlIGluIHRoZSB0ZXN0IG1vZHVsZXMgZGlyZWN0b3J5LgotICAgICAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGlmIHRoZSB0ZXN0IGZpbGUgY2Fubm90IGJlIGZvdW5kCi0gICAgICovCi0gICAgcHVibGljIEZpbGUgZ2V0VGVzdEZpbGUoU3RyaW5nIGZpbGVuYW1lKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gV2UgaGF2ZSBhIGxvdCBvZiBwbGFjZXMgdG8gY2hlY2sgZm9yIHRoZSB0ZXN0IGZpbGUuCi0gICAgICAgIC8vICAgMS4gLi4vYW5kcm9pZC0qdHMvdGVzdGNhc2VzLwotICAgICAgICAvLyAgIDIuIEFMVF9IT1NUX1RFU1RDQVNFX0RJUi8KLSAgICAgICAgLy8gICAzLiBBTFRfVEFSR0VUX1RFU1RDQVNFX0RJUi8KLQotICAgICAgICAvLyBPdXIgc2VhcmNoIGRlcGVuZHMgb24gb3VyIHJ1biBlbnYsIGlmIHdlJ3JlIGluICp0cywgdGhlbiB3ZSBvbmx5IHdhbnQKLSAgICAgICAgLy8gdG8gY2hlY2sgIzEuICBJZiB3ZSdyZSBpbiBnZW4gdGYsIHRoZW4gd2Ugb25seSB3YW50IHRvIGNoZWNrICMyLzMuCi0gICAgICAgIC8vIEluICp0cyBtb2RlLCBnZXRUZXN0c0RpciB3aWxsIHJldHVybiAjMSwgaW4gZ2VuIHRmIG1vZGUsIGl0J2xsIHJldHVybgotICAgICAgICAvLyAjMi4gIEluIHRoZSBldmVudCB3ZSdyZSBpbiAqdHMgbW9kZSBhbmQgdGhlIGZpbGUgaXNuJ3QgaW4gIzEsICMyIG9yCi0gICAgICAgIC8vICMzLCB0aGVuIHRoZSB1c2VyIHByb2JhYmx5IG5lZWRzIHRvIHJ1biBsdW5jaCB0byBzZXR1cCB0aGUgZW52LgotICAgICAgICBTdHJpbmcgYWx0VGFyZ2V0VGVzdERpciA9IFN5c3RlbS5nZXRlbnYoKS5nZXQoQUxUX1RBUkdFVF9URVNUQ0FTRV9ESVIpOwotICAgICAgICBpZiAoYWx0VGFyZ2V0VGVzdERpciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBhbHRUYXJnZXRUZXN0RGlyID0gIiI7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nW10gdGVzdERpcnMgPSB7Z2V0VGVzdHNEaXIoKS50b1N0cmluZygpLCBhbHRUYXJnZXRUZXN0RGlyfTsKLQotICAgICAgICBGaWxlIHRlc3RGaWxlOwotICAgICAgICBmb3IgKFN0cmluZyB0ZXN0RGlyOiB0ZXN0RGlycykgewotICAgICAgICAgICAgdGVzdEZpbGUgPSBuZXcgRmlsZShnZXRUZXN0c0RpcigpLCBmaWxlbmFtZSk7Ci0gICAgICAgICAgICBpZiAodGVzdEZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGVzdEZpbGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBUaGUgZmlsZSBtYXkgYmUgaW4gYSBzdWJkaXJlY3Rvcnkgc28gZG8gYSBtb3JlIHRocm91Z2ggc2VhcmNoCi0gICAgICAgICAgICAvLyBpZiBpdCBkaWQgbm90IGV4aXN0LgotICAgICAgICAgICAgdGVzdEZpbGUgPSBGaWxlVXRpbC5maW5kRmlsZShuZXcgRmlsZSh0ZXN0RGlyKSwgZmlsZW5hbWUpOwotICAgICAgICAgICAgaWYgKHRlc3RGaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGVzdEZpbGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgIkNvbXBhdGliaWxpdHkgdGVzdCBmaWxlICVzIGRvZXMgbm90IGV4aXN0IiwgZmlsZW5hbWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIGEge0BsaW5rIEZpbGV9IGluIHRoZSByZXN1bHREaXIgZm9yIGxvZ2dpbmcgaW52b2NhdGlvbiBmYWlsdXJlcwotICAgICAqLwotICAgIHB1YmxpYyBGaWxlIGdldEludm9jYXRpb25GYWlsdXJlRmlsZSgpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbmV3IEZpbGUoZ2V0UmVzdWx0RGlyKCksICJpbnZvY2F0aW9uX2ZhaWx1cmUudHh0Iik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBhIHtAbGluayBGaWxlfSBpbiB0aGUgcmVzdWx0RGlyIGZvciBjb3VudGluZyBleHBlY3RlZCB0ZXN0IHJ1bnMKLSAgICAgKi8KLSAgICBwdWJsaWMgRmlsZSBnZXRUZXN0UnVuc0ZpbGUoKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG5ldyBGaWxlKGdldFJlc3VsdERpcigpLCAidGVzdF9ydW5zLnR4dCIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gYSB7QGxpbmsgU3RyaW5nfSB0byB1c2UgZm9yIGRpcmVjdG9yeSBzdWZmaXhlcyBjcmVhdGVkIGZyb20gdGhlIGdpdmVuIHRpbWUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGlyU3VmZml4KGxvbmcgbWlsbGlzKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS5NTS5kZF9ISC5tbS5zcyIpLmZvcm1hdChuZXcgRGF0ZShtaWxsaXMpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC9idWlsZC9Db21wYXRpYmlsaXR5QnVpbGRQcm92aWRlci5qYXZhIGIvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvYnVpbGQvQ29tcGF0aWJpbGl0eUJ1aWxkUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY1NGQ3OC4uMDAwMDAwMAotLS0gYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC9idWlsZC9Db21wYXRpYmlsaXR5QnVpbGRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC5idWlsZDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmJ1aWxkLkJ1aWxkSW5mbzsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5idWlsZC5CdWlsZFJldHJpZXZhbEVycm9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmJ1aWxkLkRldmljZUJ1aWxkSW5mbzsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5idWlsZC5JQnVpbGRJbmZvOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmJ1aWxkLklCdWlsZFByb3ZpZGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmJ1aWxkLklEZXZpY2VCdWlsZEluZm87Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuYnVpbGQuSURldmljZUJ1aWxkUHJvdmlkZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuYnVpbGQuVmVyc2lvbmVkRmlsZTsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5jb25maWcuT3B0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmNvbmZpZy5PcHRpb24uSW1wb3J0YW5jZTsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5jb25maWcuT3B0aW9uQ2xhc3M7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLkRldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuSVRlc3REZXZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuc3VpdGUuVGVzdFN1aXRlSW5mbzsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC51dGlsLkZpbGVVdGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0vKioKLSAqIEEgc2ltcGxlIHtAbGluayBJQnVpbGRQcm92aWRlcn0gdGhhdCB1c2VzIGEgcHJlLWV4aXN0aW5nIENvbXBhdGliaWxpdHkgaW5zdGFsbC4KLSAqLwotQE9wdGlvbkNsYXNzKGFsaWFzPSJjb21wYXRpYmlsaXR5LWJ1aWxkLXByb3ZpZGVyIikKLXB1YmxpYyBjbGFzcyBDb21wYXRpYmlsaXR5QnVpbGRQcm92aWRlciBpbXBsZW1lbnRzIElEZXZpY2VCdWlsZFByb3ZpZGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gUkVMRUFTRV9CVUlMRCA9IFBhdHRlcm4uY29tcGlsZSgiXltBLVpdezN9XFxkezJ9W0EtWl17MCwxfSQiKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9PVF9ESVIgPSAiUk9PVF9ESVIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVUlURV9CVUlMRCA9ICJTVUlURV9CVUlMRCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNVSVRFX05BTUUgPSAiU1VJVEVfTkFNRSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNVSVRFX0ZVTExfTkFNRSA9ICJTVUlURV9GVUxMX05BTUUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVUlURV9WRVJTSU9OID0gIlNVSVRFX1ZFUlNJT04iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVUlURV9QTEFOID0gIlNVSVRFX1BMQU4iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRfRElSID0gIlJFU1VMVF9ESVIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFSVF9USU1FX01TID0gIlNUQVJUX1RJTUVfTVMiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEWU5BTUlDX0NPTkZJR19PVkVSUklERV9VUkwgPSAiRFlOQU1JQ19DT05GSUdfT1ZFUlJJREVfVVJMIjsKLQotICAgIC8qIEFQSSBLZXkgZm9yIGNvbXBhdGliaWxpdHkgdGVzdCBwcm9qZWN0LCB1c2VkIGZvciBkeW5hbWljIGNvbmZpZ3VyYXRpb24gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBJX0tFWSA9ICJBSXphU3lBYndYNUpSbG1zTGV5Z1kyV1dpaHBJSlBYRkx1ZU9RM1UiOwotCi0gICAgQE9wdGlvbihuYW1lPSJicmFuY2giLCBkZXNjcmlwdGlvbj0iYnVpbGQgYnJhbmNoIG5hbWUgdG8gc3VwcGx5LiIpCi0gICAgcHJpdmF0ZSBTdHJpbmcgbUJyYW5jaCA9IG51bGw7Ci0KLSAgICBAT3B0aW9uKG5hbWUgPSAiYnVpbGQtaWQiLAotICAgICAgICAgICAgZGVzY3JpcHRpb24gPQotICAgICAgICAgICAgICAgICAgICAiYnVpbGQgdmVyc2lvbiBudW1iZXIgdG8gc3VwcGx5LiBPdmVycmlkZSB0aGUgZGVmYXVsdCBjdHMgdmVyc2lvbiBudW1iZXIuIikKLSAgICBwcml2YXRlIFN0cmluZyBtQnVpbGRJZCA9IG51bGw7Ci0KLSAgICBAT3B0aW9uKG5hbWU9ImJ1aWxkLWZsYXZvciIsIGRlc2NyaXB0aW9uPSJidWlsZCBmbGF2b3IgbmFtZSB0byBzdXBwbHkuIikKLSAgICBwcml2YXRlIFN0cmluZyBtQnVpbGRGbGF2b3IgPSBudWxsOwotCi0gICAgQE9wdGlvbihuYW1lPSJidWlsZC1hdHRyaWJ1dGUiLCBkZXNjcmlwdGlvbj0iYnVpbGQgYXR0cmlidXRlcyB0byBzdXBwbHkuIikKLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gbUJ1aWxkQXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwPFN0cmluZyxTdHJpbmc+KCk7Ci0KLSAgICBAT3B0aW9uKG5hbWU9InVzZS1kZXZpY2UtYnVpbGQtaW5mbyIsIGRlc2NyaXB0aW9uPSJCb290c3RyYXAgYnVpbGQgaW5mbyBmcm9tIGRldmljZSIpCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Vc2VEZXZpY2VCdWlsZEluZm8gPSBmYWxzZTsKLQotICAgIEBPcHRpb24obmFtZT0idGVzdC10YWciLCBkZXNjcmlwdGlvbj0idGVzdCB0YWcgbmFtZSB0byBzdXBwbHkuIikKLSAgICBwcml2YXRlIFN0cmluZyBtVGVzdFRhZyA9ICJjdHMiOwotCi0gICAgQE9wdGlvbihuYW1lID0gImR5bmFtaWMtY29uZmlnLXVybCIsCi0gICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICJTcGVjaWZ5IHRoZSB1cmwgZm9yIG92ZXJyaWRlIGNvbmZpZyIpCi0gICAgcHJpdmF0ZSBTdHJpbmcgbVVSTCA9ICJodHRwczovL2FuZHJvaWRwYXJ0bmVyLmdvb2dsZWFwaXMuY29tL3YxL2R5bmFtaWNjb25maWcvIgotICAgICAgICAgICAgKyAic3VpdGVzL3tzdWl0ZS1uYW1lfS9tb2R1bGVzL3ttb2R1bGV9L3ZlcnNpb24ve3ZlcnNpb259P2tleT0iICsgQVBJX0tFWTsKLQotICAgIEBPcHRpb24obmFtZSA9ICJwbGFuIiwKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gInRoZSB0ZXN0IHN1aXRlIHBsYW4gdG8gcnVuLCBzdWNoIGFzIFwiZXZlcnl0aGluZ1wiIG9yIFwiY3RzXCIiLAotICAgICAgICAgICAgaW1wb3J0YW5jZSA9IEltcG9ydGFuY2UuQUxXQVlTKQotICAgIHByaXZhdGUgU3RyaW5nIG1TdWl0ZVBsYW47Ci0KLSAgICAvKioKLSAgICAgKiBVdGlsIG1ldGhvZCB0byBpbmplY3QgYnVpbGQgYXR0cmlidXRlcyBpbnRvIHN1cHBsaWVkIHtAbGluayBJQnVpbGRJbmZvfQotICAgICAqIEBwYXJhbSBidWlsZEluZm8KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaW5qZWN0QnVpbGRBdHRyaWJ1dGVzKElCdWlsZEluZm8gYnVpbGRJbmZvKSB7Ci0gICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnRyeSA6IG1CdWlsZEF0dHJpYnV0ZXMuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgYnVpbGRJbmZvLmFkZEJ1aWxkQXR0cmlidXRlKGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSUJ1aWxkSW5mbyBnZXRCdWlsZCgpIHsKLSAgICAgICAgLy8gQ3JlYXRlIGEgYmxhbmsgQnVpbGRJbmZvIHdoaWNoIHdpbGwgZ2V0IHBvcHVsYXRlZCBsYXRlci4KLSAgICAgICAgU3RyaW5nIHZlcnNpb24gPSBudWxsOwotICAgICAgICBpZiAobUJ1aWxkSWQgIT0gbnVsbCkgewotICAgICAgICAgICAgdmVyc2lvbiA9IG1CdWlsZElkOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdmVyc2lvbiA9IGdldFN1aXRlSW5mb0J1aWxkTnVtYmVyKCk7Ci0gICAgICAgICAgICBpZiAodmVyc2lvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdmVyc2lvbiA9IElCdWlsZEluZm8uVU5LTk9XTl9CVUlMRF9JRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBJQnVpbGRJbmZvIGN0c0J1aWxkID0gbmV3IEJ1aWxkSW5mbyh2ZXJzaW9uLCBtVGVzdFRhZyk7Ci0gICAgICAgIGlmIChtQnJhbmNoICAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjdHNCdWlsZC5zZXRCdWlsZEJyYW5jaChtQnJhbmNoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUJ1aWxkRmxhdm9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIGN0c0J1aWxkLnNldEJ1aWxkRmxhdm9yKG1CdWlsZEZsYXZvcik7Ci0gICAgICAgIH0KLSAgICAgICAgaW5qZWN0QnVpbGRBdHRyaWJ1dGVzKGN0c0J1aWxkKTsKLSAgICAgICAgYWRkQ29tcGF0aWJpbGl0eVN1aXRlSW5mbyhjdHNCdWlsZCk7Ci0gICAgICAgIHJldHVybiBjdHNCdWlsZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElCdWlsZEluZm8gZ2V0QnVpbGQoSVRlc3REZXZpY2UgZGV2aWNlKQotICAgICAgICAgICAgdGhyb3dzIEJ1aWxkUmV0cmlldmFsRXJyb3IsIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghbVVzZURldmljZUJ1aWxkSW5mbykgewotICAgICAgICAgICAgLy8gcmV0dXJuIGEgcmVndWxhciBidWlsZCBpbmZvIHdpdGhvdXQgZXh0cmFjdGluZyBkZXZpY2UgYXR0cmlidXRlcyBpbnRvIHN0YW5kYXJkCi0gICAgICAgICAgICAvLyBidWlsZCBpbmZvIGZpZWxkcwotICAgICAgICAgICAgcmV0dXJuIGdldEJ1aWxkKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTdHJpbmcgYnVpbGRJZCA9IGRldmljZS5nZXRCdWlsZElkKCk7Ci0gICAgICAgICAgICBTdHJpbmcgYnVpbGRGbGF2b3IgPSBkZXZpY2UuZ2V0QnVpbGRGbGF2b3IoKTsKLSAgICAgICAgICAgIElCdWlsZEluZm8gaW5mbyA9IG5ldyBEZXZpY2VCdWlsZEluZm8oYnVpbGRJZCwgbVRlc3RUYWcpOwotICAgICAgICAgICAgaWYgKG1CcmFuY2ggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIGlmIGJyYW5jaCBpcyBub3Qgc3BlY2lmaWVkIHZpYSBwYXJhbSwgbWFrZSBhIHBzZXVkbyBicmFuY2ggbmFtZSBiYXNlZCBvbiBwbGF0Zm9ybQotICAgICAgICAgICAgICAgIC8vIHZlcnNpb24gYW5kIHByb2R1Y3QgaW5mbyBmcm9tIGRldmljZQotICAgICAgICAgICAgICAgIG1CcmFuY2ggPSBTdHJpbmcuZm9ybWF0KCIlcy0lcy0lcy0lcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UuZ2V0UHJvcGVydHkoInJvLnByb2R1Y3QuYnJhbmQiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZS5nZXRQcm9wZXJ0eSgicm8ucHJvZHVjdC5uYW1lIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UuZ2V0UHJvZHVjdFZhcmlhbnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZS5nZXRQcm9wZXJ0eSgicm8uYnVpbGQudmVyc2lvbi5yZWxlYXNlIikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5mby5zZXRCdWlsZEJyYW5jaChtQnJhbmNoKTsKLSAgICAgICAgICAgIGluZm8uc2V0QnVpbGRGbGF2b3IoYnVpbGRGbGF2b3IpOwotICAgICAgICAgICAgU3RyaW5nIGJ1aWxkQWxpYXMgPSBkZXZpY2UuZ2V0QnVpbGRBbGlhcygpOwotICAgICAgICAgICAgaWYgKFJFTEVBU0VfQlVJTEQubWF0Y2hlcihidWlsZEFsaWFzKS5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICBpbmZvLmFkZEJ1aWxkQXR0cmlidXRlKCJidWlsZF9hbGlhcyIsIGJ1aWxkQWxpYXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5qZWN0QnVpbGRBdHRyaWJ1dGVzKGluZm8pOwotICAgICAgICAgICAgYWRkQ29tcGF0aWJpbGl0eVN1aXRlSW5mbyhpbmZvKTsKLSAgICAgICAgICAgIHJldHVybiBpbmZvOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGJ1aWxkTm90VGVzdGVkKElCdWlsZEluZm8gaW5mbykgewotICAgICAgICAvLyBpZ25vcmUKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY2xlYW5VcChJQnVpbGRJbmZvIGluZm8pIHsKLSAgICAgICAgLy8gRXZlcnl0aGluZyBzaG91bGQgaGF2ZSBiZWVuIGNvcGllZCBwcm9wZXJseSB0byByZXN1bHQgZm9sZGVyLCB3ZSBjbGVhbiB1cAotICAgICAgICBpZiAoaW5mbyBpbnN0YW5jZW9mIElEZXZpY2VCdWlsZEluZm8pIHsKLSAgICAgICAgICAgIGZvciAoVmVyc2lvbmVkRmlsZSBmIDogaW5mby5nZXRGaWxlcygpKSB7Ci0gICAgICAgICAgICAgICAgLy8gZG8gbm90IGRlbGV0ZSB0aGUgdGVzdHNkaXIgc2luY2UgaXQncyB0aGUgcmVhbCBDVFMgZm9sZGVyLgotICAgICAgICAgICAgICAgIGlmICghZi5nZXRGaWxlKCkuZXF1YWxzKCgoSURldmljZUJ1aWxkSW5mbykgaW5mbykuZ2V0VGVzdHNEaXIoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgRmlsZVV0aWwucmVjdXJzaXZlRGVsZXRlKGYuZ2V0RmlsZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbmZvLmNsZWFuVXAoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRDb21wYXRpYmlsaXR5U3VpdGVJbmZvKElCdWlsZEluZm8gaW5mbykgewotICAgICAgICBsb25nIHN0YXJ0VGltZU1zID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIGluZm8uYWRkQnVpbGRBdHRyaWJ1dGUoU1VJVEVfQlVJTEQsIGdldFN1aXRlSW5mb0J1aWxkTnVtYmVyKCkpOwotICAgICAgICBpbmZvLmFkZEJ1aWxkQXR0cmlidXRlKFNVSVRFX05BTUUsIGdldFN1aXRlSW5mb05hbWUoKSk7Ci0gICAgICAgIGluZm8uYWRkQnVpbGRBdHRyaWJ1dGUoU1VJVEVfRlVMTF9OQU1FLCBnZXRTdWl0ZUluZm9GdWxsbmFtZSgpKTsKLSAgICAgICAgaW5mby5hZGRCdWlsZEF0dHJpYnV0ZShTVUlURV9WRVJTSU9OLCBnZXRTdWl0ZUluZm9WZXJzaW9uKCkpOwotICAgICAgICBpbmZvLmFkZEJ1aWxkQXR0cmlidXRlKFNVSVRFX1BMQU4sIG1TdWl0ZVBsYW4pOwotICAgICAgICBpbmZvLmFkZEJ1aWxkQXR0cmlidXRlKFNUQVJUX1RJTUVfTVMsIExvbmcudG9TdHJpbmcoc3RhcnRUaW1lTXMpKTsKLSAgICAgICAgaW5mby5hZGRCdWlsZEF0dHJpYnV0ZShSRVNVTFRfRElSLCBnZXREaXJTdWZmaXgoc3RhcnRUaW1lTXMpKTsKLSAgICAgICAgU3RyaW5nIHJvb3REaXJQYXRoID0gZ2V0Um9vdERpclBhdGgoKTsKLSAgICAgICAgaWYgKHJvb3REaXJQYXRoID09IG51bGwgfHwgcm9vdERpclBhdGgudHJpbSgpLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIk1pc3NpbmcgaW5zdGFsbCBwYXRoIHByb3BlcnR5ICVzX1JPT1QiLCBnZXRTdWl0ZUluZm9OYW1lKCkpKTsKLSAgICAgICAgfQotICAgICAgICBGaWxlIHJvb3REaXIgPSBuZXcgRmlsZShyb290RGlyUGF0aCk7Ci0gICAgICAgIGlmICghcm9vdERpci5leGlzdHMoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiUm9vdCBkaXJlY3RvcnkgZG9lc24ndCBleGlzdCAlcyIsIHJvb3REaXIuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKLSAgICAgICAgfQotICAgICAgICBpbmZvLmFkZEJ1aWxkQXR0cmlidXRlKFJPT1RfRElSLCByb290RGlyLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgLy8gRm9yIERldmljZUJ1aWxkSW5mbyB3ZSBwb3B1bGF0ZSB0aGUgdGVzdHNEaXIgZm9sZGVyIG9mIHRoZSBidWlsZCBpbmZvLgotICAgICAgICBpZiAoaW5mbyBpbnN0YW5jZW9mIElEZXZpY2VCdWlsZEluZm8pIHsKLSAgICAgICAgICAgIEZpbGUgdGVzdERpciA9ICBuZXcgRmlsZShyb290RGlyLCBTdHJpbmcuZm9ybWF0KCJhbmRyb2lkLSVzL3Rlc3RjYXNlcy8iLAotICAgICAgICAgICAgICAgICAgICBnZXRTdWl0ZUluZm9OYW1lKCkudG9Mb3dlckNhc2UoKSkpOwotICAgICAgICAgICAgKChJRGV2aWNlQnVpbGRJbmZvKSBpbmZvKS5zZXRUZXN0c0Rpcih0ZXN0RGlyLCAiMCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtVVJMICE9IG51bGwgJiYgIW1VUkwuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBpbmZvLmFkZEJ1aWxkQXR0cmlidXRlKERZTkFNSUNfQ09ORklHX09WRVJSSURFX1VSTCwKLSAgICAgICAgICAgICAgICAgICAgbVVSTC5yZXBsYWNlKCJ7c3VpdGUtbmFtZX0iLCBnZXRTdWl0ZUluZm9OYW1lKCkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIENUU19ST09UIHZhcmlhYmxlIHRoYXQgdGhlIGhhcm5lc3Mgd2FzIHN0YXJ0ZWQgd2l0aC4KLSAgICAgKi8KLSAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICBTdHJpbmcgZ2V0Um9vdERpclBhdGgoKSB7Ci0gICAgICAgIHJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoU3RyaW5nLmZvcm1hdCgiJXNfUk9PVCIsIGdldFN1aXRlSW5mb05hbWUoKSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgU3VpdGVJbmZvIG5hbWUgZ2VuZXJhdGVkIGF0IGJ1aWxkIHRpbWUuIEV4cG9zZWQgZm9yIHRlc3RpbmcuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRTdWl0ZUluZm9OYW1lKCkgewotICAgICAgICByZXR1cm4gVGVzdFN1aXRlSW5mby5nZXRJbnN0YW5jZSgpLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIFN1aXRlSW5mbyBidWlsZCBudW1iZXIgZ2VuZXJhdGVkIGF0IGJ1aWxkIHRpbWUuIEV4cG9zZWQgZm9yIHRlc3RpbmcuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRTdWl0ZUluZm9CdWlsZE51bWJlcigpIHsKLSAgICAgICAgcmV0dXJuIFRlc3RTdWl0ZUluZm8uZ2V0SW5zdGFuY2UoKS5nZXRCdWlsZE51bWJlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgU3VpdGVJbmZvIGZ1bGxuYW1lIGdlbmVyYXRlZCBhdCBidWlsZCB0aW1lLiBFeHBvc2VkIGZvciB0ZXN0aW5nLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0U3VpdGVJbmZvRnVsbG5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBUZXN0U3VpdGVJbmZvLmdldEluc3RhbmNlKCkuZ2V0RnVsbE5hbWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIFN1aXRlSW5mbyB2ZXJzaW9uIGdlbmVyYXRlZCBhdCBidWlsZCB0aW1lLiBFeHBvc2VkIGZvciB0ZXN0aW5nLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0U3VpdGVJbmZvVmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIFRlc3RTdWl0ZUluZm8uZ2V0SW5zdGFuY2UoKS5nZXRWZXJzaW9uKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBhIHtAbGluayBTdHJpbmd9IHRvIHVzZSBmb3IgZGlyZWN0b3J5IHN1ZmZpeGVzIGNyZWF0ZWQgZnJvbSB0aGUgZ2l2ZW4gdGltZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXREaXJTdWZmaXgobG9uZyBtaWxsaXMpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5Lk1NLmRkX0hILm1tLnNzIikuZm9ybWF0KG5ldyBEYXRlKG1pbGxpcykpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL2NvbW1hbmQvQ29tcGF0aWJpbGl0eUNvbnNvbGUuamF2YSBiL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL2NvbW1hbmQvQ29tcGF0aWJpbGl0eUNvbnNvbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJlNjE5Ny4uMDAwMDAwMAotLS0gYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC9jb21tYW5kL0NvbXBhdGliaWxpdHlDb25zb2xlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLmNvbW1hbmQ7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC5idWlsZC5Db21wYXRpYmlsaXR5QnVpbGRIZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQuYnVpbGQuQ29tcGF0aWJpbGl0eUJ1aWxkUHJvdmlkZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQucmVzdWx0LlN1YlBsYW5IZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGVzdHR5cGUuTW9kdWxlUmVwbzsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLklJbnZvY2F0aW9uUmVzdWx0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuUmVzdWx0SGFuZGxlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlRlc3RTdGF0dXM7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuY29tbWFuZC5Db25zb2xlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmNvbmZpZy5BcmdzT3B0aW9uUGFyc2VyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmNvbmZpZy5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmNvbmZpZy5Db25maWd1cmF0aW9uRmFjdG9yeTsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5jb25maWcuSUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuY29uZmlnLklDb25maWd1cmF0aW9uRmFjdG9yeTsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5sb2cuTG9nVXRpbC5DTG9nOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLklSZW1vdGVUZXN0OwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLklSdW50aW1lSGludFByb3ZpZGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLnN1aXRlLlRlc3RTdWl0ZUluZm87Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudXRpbC5BcnJheVV0aWw7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudXRpbC5GaWxlVXRpbDsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC51dGlsLlBhaXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudXRpbC5SZWdleFRyaWU7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudXRpbC5UYWJsZUZvcm1hdHRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC51dGlsLlRpbWVVdGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIEFuIGV4dGVuc2lvbiBvZiBUcmFkZWZlZCdzIGNvbnNvbGUgd2hpY2ggYWRkcyBmZWF0dXJlcyBzcGVjaWZpYyB0byBjb21wYXRpYmlsaXR5IHRlc3RpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wYXRpYmlsaXR5Q29uc29sZSBleHRlbmRzIENvbnNvbGUgewotCi0gICAgLyoqCi0gICAgICogSGFyZCBjb2RlZCBsaXN0IG9mIG1vZHVsZXMgdG8gYmUgZXhjbHVkZWQgZnJvbSBtYW51YWwgbW9kdWxlIHNoYXJkaW5nCi0gICAgICogQHNlZSAjc3BsaXRNb2R1bGVzKGludCkKLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTZXQ8U3RyaW5nPiBNT0RVTEVfU1BMSVRfRVhDTFVTSU9OUyA9IG5ldyBIYXNoU2V0PD4oKTsKLSAgICBzdGF0aWMgewotICAgICAgICBNT0RVTEVfU1BMSVRfRVhDTFVTSU9OUy5hZGQoIkN0c0RlcXBUZXN0Q2FzZXMiKTsKLSAgICB9Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFERF9QQVRURVJOID0gImEoPzpkZCk/IjsKLSAgICBwcml2YXRlIENvbXBhdGliaWxpdHlCdWlsZEhlbHBlciBtQnVpbGRIZWxwZXI7Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICBwcmludExpbmUoU3RyaW5nLmZvcm1hdCgiQW5kcm9pZCAlcyAlcyAoJXMpIiwgVGVzdFN1aXRlSW5mby5nZXRJbnN0YW5jZSgpLmdldEZ1bGxOYW1lKCksCi0gICAgICAgICAgICAgICAgVGVzdFN1aXRlSW5mby5nZXRJbnN0YW5jZSgpLmdldFZlcnNpb24oKSwKLSAgICAgICAgICAgICAgICBUZXN0U3VpdGVJbmZvLmdldEluc3RhbmNlKCkuZ2V0QnVpbGROdW1iZXIoKSkpOwotICAgICAgICBwcmludExpbmUoIlVzZSBcImhlbHBcIiBvciBcImhlbHAgYWxsXCIgdG8gZ2V0IG1vcmUgaW5mb3JtYXRpb24gb24gcnVubmluZyBjb21tYW5kcy4iKTsKLSAgICAgICAgc3VwZXIucnVuKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUgJ2xpc3QgcGxhbnMnLCAnbGlzdCBtb2R1bGVzJyBhbmQgJ2xpc3QgcmVzdWx0cycgY29tbWFuZHMKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRDdXN0b21Db21tYW5kcyhSZWdleFRyaWU8UnVubmFibGU+IHRyaWUsIExpc3Q8U3RyaW5nPiBnZW5lcmljSGVscCwKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gY29tbWFuZEhlbHApIHsKLQotICAgICAgICBnZW5lcmljSGVscC5hZGQoIkVudGVyICdoZWxwIGFkZCcgICAgICAgIGZvciBoZWxwIHdpdGggJ2FkZCBzdWJwbGFuJyBjb21tYW5kcyIpOwotICAgICAgICBnZW5lcmljSGVscC5hZGQoIlx0LS0tLS0gIiArIFRlc3RTdWl0ZUluZm8uZ2V0SW5zdGFuY2UoKS5nZXRGdWxsTmFtZSgpICsgIiB1c2FnZSAtLS0tLSAiKTsKLSAgICAgICAgZ2VuZXJpY0hlbHAuYWRkKCJVc2FnZTogcnVuIDxwbGFuPiBbLS1tb2R1bGUgPG1vZHVsZSBuYW1lPl0gWyBvcHRpb25zIF0iKTsKLSAgICAgICAgZ2VuZXJpY0hlbHAuYWRkKCJFeGFtcGxlOiBydW4gY3RzIC0tbW9kdWxlIEN0c0dlc3R1cmVUZXN0Q2FzZXMgLS1idWdyZXBvcnQtb24tZmFpbHVyZSIpOwotICAgICAgICBnZW5lcmljSGVscC5hZGQoIiIpOwotCi0gICAgICAgIHRyaWUucHV0KG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIGxpc3RQbGFucygpOwotICAgICAgICAgICAgfQotICAgICAgICB9LCBMSVNUX1BBVFRFUk4sICJwKD86bGFucyk/Iik7Ci0gICAgICAgIHRyaWUucHV0KG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIGxpc3RNb2R1bGVzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0sIExJU1RfUEFUVEVSTiwgIm0oPzpvZHVsZXMpPyIpOwotICAgICAgICB0cmllLnB1dChuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBsaXN0UmVzdWx0cygpOwotICAgICAgICAgICAgfQotICAgICAgICB9LCBMSVNUX1BBVFRFUk4sICJyKD86ZXN1bHRzKT8iKTsKLSAgICAgICAgdHJpZS5wdXQobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgbGlzdFN1YlBsYW5zKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0sIExJU1RfUEFUVEVSTiwgInMoPzp1YnBsYW5zKT8iKTsKLSAgICAgICAgdHJpZS5wdXQobmV3IEFyZ1J1bm5hYmxlPENhcHR1cmVMaXN0PigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKENhcHR1cmVMaXN0IGFyZ3MpIHsKLSAgICAgICAgICAgICAgICAvLyBTa2lwIDIgdG9rZW5zIHRvIGdldCBwYXN0IHNwbGl0IGFuZCBtb2R1bGVzIHBhdHRlcm4KLSAgICAgICAgICAgICAgICBTdHJpbmcgYXJnID0gYXJncy5nZXQoMikuZ2V0KDApOwotICAgICAgICAgICAgICAgIGludCBzaGFyZHMgPSBJbnRlZ2VyLnBhcnNlSW50KGFyZyk7Ci0gICAgICAgICAgICAgICAgaWYgKHNoYXJkcyA8PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50TGluZSgibnVtYmVyIG9mIHNoYXJkcyBzaG91bGQgYmUgbW9yZSB0aGFuIDEiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzcGxpdE1vZHVsZXMoc2hhcmRzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSwgInNwbGl0IiwgIm0oPzpvZHVsZXMpPyIsICIoXFxkKykiKTsKLSAgICAgICAgdHJpZS5wdXQobmV3IEFyZ1J1bm5hYmxlPENhcHR1cmVMaXN0PigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKENhcHR1cmVMaXN0IGFyZ3MpIHsKLSAgICAgICAgICAgICAgICAvLyBTa2lwIDIgdG9rZW5zIHRvIGdldCBwYXN0ICJhZGQiIGFuZCAic3VicGxhbiIKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBmbGF0QXJncyA9IG5ldyBTdHJpbmdbYXJncy5zaXplKCkgLSAyXTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMjsgaSA8IGFyZ3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgZmxhdEFyZ3NbaSAtIDJdID0gYXJncy5nZXQoaSkuZ2V0KDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhZGRTdWJQbGFuKGZsYXRBcmdzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSwgQUREX1BBVFRFUk4sICJzKD86dWJwbGFuKT8iLCBudWxsKTsKLSAgICAgICAgdHJpZS5wdXQobmV3IEFyZ1J1bm5hYmxlPENhcHR1cmVMaXN0PigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKENhcHR1cmVMaXN0IGFyZ3MpIHsKLSAgICAgICAgICAgICAgICBwcmludExpbmUoIidhZGQgc3VicGxhbicgcmVxdWlyZXMgcGFyYW1ldGVycywgdXNlICdoZWxwIGFkZCcgdG8gZ2V0IG1vcmUgZGV0YWlscyIpOwotICAgICAgICAgICAgfQotICAgICAgICB9LCBBRERfUEFUVEVSTiwgInMoPzp1YnBsYW4pPyIpOwotICAgICAgICB0cmllLnB1dChuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBwcmludExpbmUoU3RyaW5nLmZvcm1hdCgiQW5kcm9pZCAlcyAlcyAoJXMpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RTdWl0ZUluZm8uZ2V0SW5zdGFuY2UoKS5nZXRGdWxsTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgVGVzdFN1aXRlSW5mby5nZXRJbnN0YW5jZSgpLmdldFZlcnNpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RTdWl0ZUluZm8uZ2V0SW5zdGFuY2UoKS5nZXRCdWlsZE51bWJlcigpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0sICJ2ZXJzaW9uIik7IC8vIG92ZXJyaWRlIHRyYWRlZmVkICd2ZXJzaW9uJyBjb21tYW5kIHRvIHByaW50IHRlc3Qgc3VpdGUgbmFtZSBhbmQgdmVyc2lvbgotCi0gICAgICAgIC8vIGZpbmQgZXhpc3RpbmcgaGVscCBmb3IgJ0xJU1RfUEFUVEVSTicgY29tbWFuZHMsIGFuZCBhcHBlbmQgdGhlc2UgY29tbWFuZHMgaGVscAotICAgICAgICBTdHJpbmcgbGlzdEhlbHAgPSBjb21tYW5kSGVscC5nZXQoTElTVF9QQVRURVJOKTsKLSAgICAgICAgaWYgKGxpc3RIZWxwID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIG5vIGhlbHA/IFVuZXhwZWN0ZWQsIGJ1dCBzb2xkaWVyIG9uCi0gICAgICAgICAgICBsaXN0SGVscCA9IG5ldyBTdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgY29tYmluZWRIZWxwID0gbGlzdEhlbHAgKwotICAgICAgICAgICAgICAgIExJTkVfU0VQQVJBVE9SICsKLSAgICAgICAgICAgICAgICAiXHQtLS0tLSAiICsgVGVzdFN1aXRlSW5mby5nZXRJbnN0YW5jZSgpLmdldEZ1bGxOYW1lKCkKLSAgICAgICAgICAgICAgICArICIgc3BlY2lmaWMgb3B0aW9ucyAtLS0tLSAiICsgTElORV9TRVBBUkFUT1IgKwotICAgICAgICAgICAgICAgICJcdHBbbGFuc10gICAgICAgICAgICAgICBMaXN0IGFsbCBwbGFucyBhdmFpbGFibGUiICsgTElORV9TRVBBUkFUT1IgKwotICAgICAgICAgICAgICAgICJcdG1bb2R1bGVzXSAgICAgICAgICAgICBMaXN0IGFsbCBtb2R1bGVzIGF2YWlsYWJsZSIgKyBMSU5FX1NFUEFSQVRPUiArCi0gICAgICAgICAgICAgICAgIlx0cltlc3VsdHNdICAgICAgICAgICAgIExpc3QgYWxsIHJlc3VsdHMiICsgTElORV9TRVBBUkFUT1I7Ci0gICAgICAgIGNvbW1hbmRIZWxwLnB1dChMSVNUX1BBVFRFUk4sIGNvbWJpbmVkSGVscCk7Ci0KLSAgICAgICAgLy8gVXBkYXRlIGV4aXN0aW5nIFJVTl9QQVRURVJOIHdpdGggQ1RTIHNwZWNpZmljIGV4dHJhIHJ1biBwb3NzaWJpbGl0aWVzLgotICAgICAgICBTdHJpbmcgcnVuSGVscCA9IGNvbW1hbmRIZWxwLmdldChSVU5fUEFUVEVSTik7Ci0gICAgICAgIGlmIChydW5IZWxwID09IG51bGwpIHsKLSAgICAgICAgICAgIHJ1bkhlbHAgPSBuZXcgU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIGNvbWJpbmVkUnVuSGVscCA9IHJ1bkhlbHAgKwotICAgICAgICAgICAgICAgIExJTkVfU0VQQVJBVE9SICsKLSAgICAgICAgICAgICAgICAiXHQtLS0tLSAiICsgVGVzdFN1aXRlSW5mby5nZXRJbnN0YW5jZSgpLmdldEZ1bGxOYW1lKCkKLSAgICAgICAgICAgICAgICArICIgc3BlY2lmaWMgb3B0aW9ucyAtLS0tLSAiICsgTElORV9TRVBBUkFUT1IgKwotICAgICAgICAgICAgICAgICJcdDxwbGFuPiAtLW1vZHVsZS8tbSA8bW9kdWxlPiAgICAgICBSdW4gYSB0ZXN0IG1vZHVsZSIgKyBMSU5FX1NFUEFSQVRPUiArCi0gICAgICAgICAgICAgICAgIlx0PHBsYW4+IC0tbW9kdWxlLy1tIDxtb2R1bGU+IC0tdGVzdC8tdCA8dGVzdF9uYW1lPiAgICBSdW4gYSBzcGVjaWZpYyB0ZXN0IGZyb20iICsKLSAgICAgICAgICAgICAgICAiIHRoZSBtb2R1bGUuIFRlc3QgbmFtZSBjYW4gYmUgPHBhY2thZ2U+LjxjbGFzcz4sIDxwYWNrYWdlPi48Y2xhc3M+IzxtZXRob2Q+IG9yICIKLSAgICAgICAgICAgICAgICArICI8bmF0aXZlX2JpbmFyeV9uYW1lPiIgKyBMSU5FX1NFUEFSQVRPUiArCi0gICAgICAgICAgICAgICAgIlx0XHRBdmFpbGFibGUgT3B0aW9uczoiICsgTElORV9TRVBBUkFUT1IgKwotICAgICAgICAgICAgICAgICJcdFx0XHQtLXNlcmlhbC8tcyA8ZGV2aWNlX2lkPjogVGhlIGRldmljZSB0byBydW4gdGhlIHRlc3Qgb24iICsgTElORV9TRVBBUkFUT1IgKwotICAgICAgICAgICAgICAgICJcdFx0XHQtLWFiaS8tYSA8YWJpPiAgICAgICAgIDogVGhlIEFCSSB0byBydW4gdGhlIHRlc3QgYWdhaW5zdCIgKyBMSU5FX1NFUEFSQVRPUiArCi0gICAgICAgICAgICAgICAgIlx0XHRcdC0tbG9nY2F0LW9uLWZhaWx1cmUgICAgOiBDYXB0dXJlIGxvZ2NhdCB3aGVuIGEgdGVzdCBmYWlscyIKLSAgICAgICAgICAgICAgICArIExJTkVfU0VQQVJBVE9SICsKLSAgICAgICAgICAgICAgICAiXHRcdFx0LS1idWdyZXBvcnQtb24tZmFpbHVyZSA6IENhcHR1cmUgYSBidWdyZXBvcnQgd2hlbiBhIHRlc3QgZmFpbHMiCi0gICAgICAgICAgICAgICAgKyBMSU5FX1NFUEFSQVRPUiArCi0gICAgICAgICAgICAgICAgIlx0XHRcdC0tc2NyZWVuc2hvdC1vbi1mYWlsdXJlOiBDYXB0dXJlIGEgc2NyZWVuc2hvdCB3aGVuIGEgdGVzdCBmYWlscyIKLSAgICAgICAgICAgICAgICArIExJTkVfU0VQQVJBVE9SICsKLSAgICAgICAgICAgICAgICAiXHRcdFx0LS1zaGFyZC1jb3VudCA8c2hhcmRzPjogU2hhcmRzIGEgcnVuIGludG8gdGhlIGdpdmVuIG51bWJlciBvZiBpbmRlcGVuZGVudCAiICsKLSAgICAgICAgICAgICAgICAiY2h1bmtzLCB0byBydW4gb24gbXVsdGlwbGUgZGV2aWNlcyBpbiBwYXJhbGxlbC4iICsgTElORV9TRVBBUkFUT1I7Ci0gICAgICAgIGNvbW1hbmRIZWxwLnB1dChSVU5fUEFUVEVSTiwgY29tYmluZWRSdW5IZWxwKTsKLQotICAgICAgICBjb21tYW5kSGVscC5wdXQoQUREX1BBVFRFUk4sIFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgIiVzIGhlbHA6IiArIExJTkVfU0VQQVJBVE9SICsKLSAgICAgICAgICAgICAgICAiXHRhZGQgc1t1YnBsYW5dOiBjcmVhdGUgYSBzdWJwbGFuIGZyb20gYSBwcmV2aW91cyBzZXNzaW9uIiArIExJTkVfU0VQQVJBVE9SICsKLSAgICAgICAgICAgICAgICAiXHRcdEF2YWlsYWJsZSBPcHRpb25zOiIgKyBMSU5FX1NFUEFSQVRPUiArCi0gICAgICAgICAgICAgICAgIlx0XHRcdC0tc2Vzc2lvbiA8c2Vzc2lvbl9pZD46IFRoZSBzZXNzaW9uIHVzZWQgdG8gY3JlYXRlIGEgc3VicGxhbiIKLSAgICAgICAgICAgICAgICArIExJTkVfU0VQQVJBVE9SICsKLSAgICAgICAgICAgICAgICAiXHRcdFx0LS1uYW1lLy1uIDxzdWJwbGFuX25hbWU+OiBUaGUgbmFtZSBvZiB0aGUgbmV3IHN1YnBsYW4iICsgTElORV9TRVBBUkFUT1IgKwotICAgICAgICAgICAgICAgICJcdFx0XHQtLXJlc3VsdC10eXBlIDxzdGF0dXM+OiBXaGljaCByZXN1bHRzIHRvIGluY2x1ZGUgaW4gdGhlIHN1YnBsYW4uICIKLSAgICAgICAgICAgICAgICArICJPbmUgb2YgcGFzc2VkLCBmYWlsZWQsIG5vdF9leGVjdXRlZC4gUmVwZWF0YWJsZSIgKyBMSU5FX1NFUEFSQVRPUiwKLSAgICAgICAgICAgICAgICBBRERfUEFUVEVSTikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnNvbGVQcm9tcHQoKSB7Ci0gICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlcy10ZiA+ICIsIFRlc3RTdWl0ZUluZm8uZ2V0SW5zdGFuY2UoKS5nZXROYW1lKCkudG9Mb3dlckNhc2UoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGxpc3RNb2R1bGVzKCkgewotICAgICAgICBGaWxlW10gZmlsZXMgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZmlsZXMgPSBnZXRCdWlsZEhlbHBlcigpLmdldFRlc3RzRGlyKCkubGlzdEZpbGVzKG5ldyBNb2R1bGVSZXBvLkNvbmZpZ0ZpbHRlcigpKTsKLSAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHByaW50TGluZShlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmaWxlcyAhPSBudWxsICYmIGZpbGVzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBtb2R1bGVzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICBmb3IgKEZpbGUgbW9kdWxlRmlsZSA6IGZpbGVzKSB7Ci0gICAgICAgICAgICAgICAgbW9kdWxlcy5hZGQoRmlsZVV0aWwuZ2V0QmFzZU5hbWUobW9kdWxlRmlsZS5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQobW9kdWxlcyk7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBtb2R1bGUgOiBtb2R1bGVzKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRMaW5lKG1vZHVsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwcmludExpbmUoIk5vIG1vZHVsZXMgZm91bmQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBsaXN0UGxhbnMoKSB7Ci0gICAgICAgIHByaW50TGluZSgiQXZhaWxhYmxlIHBsYW5zIGluY2x1ZGU6Iik7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25GYWN0b3J5LmdldEluc3RhbmNlKCkucHJpbnRIZWxwKFN5c3RlbS5vdXQpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzcGxpdE1vZHVsZXMoaW50IHNoYXJkcykgewotICAgICAgICBGaWxlW10gZmlsZXMgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZmlsZXMgPSBnZXRCdWlsZEhlbHBlcigpLmdldFRlc3RzRGlyKCkubGlzdEZpbGVzKG5ldyBNb2R1bGVSZXBvLkNvbmZpZ0ZpbHRlcigpKTsKLSAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHByaW50TGluZShlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgICAgIC8vIHBhcnNlIHRocm91Z2ggYWxsIGNvbmZpZyBmaWxlcyB0byBnZXQgcnVudGltZSBoaW50cwotICAgICAgICBpZiAoZmlsZXMgIT0gbnVsbCAmJiBmaWxlcy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICBJQ29uZmlndXJhdGlvbkZhY3RvcnkgY29uZmlnRmFjdG9yeSA9IENvbmZpZ3VyYXRpb25GYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0gICAgICAgICAgICBMaXN0PFBhaXI8U3RyaW5nLCBMb25nPj4gbW9kdWxlUnVudGltZSA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgLy8gcGFyc2UgdGhyb3VnaCBhbGwgY29uZmlnIGZpbGVzIHRvIGNhbGN1bGF0ZSBtb2R1bGUgZXhlY3V0aW9uIHRpbWUKLSAgICAgICAgICAgIGZvciAoRmlsZSBmaWxlIDogZmlsZXMpIHsKLSAgICAgICAgICAgICAgICBJQ29uZmlndXJhdGlvbiBjb25maWcgPSBudWxsOwotICAgICAgICAgICAgICAgIFN0cmluZyBtb2R1bGVOYW1lID0gZmlsZS5nZXROYW1lKCkuc3BsaXQoIlxcLiIpWzBdOwotICAgICAgICAgICAgICAgIGlmIChNT0RVTEVfU1BMSVRfRVhDTFVTSU9OUy5jb250YWlucyhtb2R1bGVOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnID0gY29uZmlnRmFjdG9yeS5jcmVhdGVDb25maWd1cmF0aW9uRnJvbUFyZ3MobmV3IFN0cmluZ1tdewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksCi0gICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvbmZpZ3VyYXRpb25FeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRMaW5lKCJFcnJvciBsb2FkaW5nIGNvbmZpZyBmaWxlOiAiICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgIENMb2cuZShjZSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsb25nIHJ1bnRpbWUgPSAwOwotICAgICAgICAgICAgICAgIGZvciAoSVJlbW90ZVRlc3QgdGVzdCA6IGNvbmZpZy5nZXRUZXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0ZXN0IGluc3RhbmNlb2YgSVJ1bnRpbWVIaW50UHJvdmlkZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWUgKz0gKChJUnVudGltZUhpbnRQcm92aWRlcikgdGVzdCkuZ2V0UnVudGltZUhpbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENMb2cudygiVXNpbmcgZGVmYXVsdCAxbSBydW50aW1lIGVzdGltYXRpb24gZm9yIHRlc3QgdHlwZSAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3QuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZSArPSA2MCAqIDEwMDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbW9kdWxlUnVudGltZS5hZGQobmV3IFBhaXI8U3RyaW5nLCBMb25nPihtb2R1bGVOYW1lLCBydW50aW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBzb3J0IGxpc3QgbW9kdWxlcyBpbiBkZXNjZW5kaW5nIG9yZGVyIG9mIHJ1bnRpbWUgaGludAotICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChtb2R1bGVSdW50aW1lLCBuZXcgQ29tcGFyYXRvcjxQYWlyPFN0cmluZywgTG9uZz4+KCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShQYWlyPFN0cmluZywgTG9uZz4gbzEsIFBhaXI8U3RyaW5nLCBMb25nPiBvMikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbzIuc2Vjb25kLmNvbXBhcmVUbyhvMS5zZWNvbmQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgLy8gcGFydGl0aW9uIGxpc3Qgb2YgbW9kdWxlcyBiYXNlZCBvbiB0aGUgcnVudGltZSBoaW50Ci0gICAgICAgICAgICBMaXN0PExpc3Q8UGFpcjxTdHJpbmcsIExvbmc+Pj4gc3BsaXR0ZWRNb2R1bGVzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNoYXJkczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgc3BsaXR0ZWRNb2R1bGVzLmFkZChuZXcgQXJyYXlMaXN0PD4oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgc2hhcmRJbmRleCA9IDA7Ci0gICAgICAgICAgICBpbnQgaW5jcmVtZW50ID0gMTsKLSAgICAgICAgICAgIGxvbmdbXSBzaGFyZFRpbWVzID0gbmV3IGxvbmdbc2hhcmRzXTsKLSAgICAgICAgICAgIC8vIGdvIHRocm91Z2ggdGhlIHNvcnRlZCBsaXN0LCBkaXN0cmlidXRlIG1vZHVsZXMgaW50byBzaGFyZHMgaW4gemlnLXphZyBwYXR0ZXJuIHRvIGdldAotICAgICAgICAgICAgLy8gYW4gZXZlbiBleGVjdXRpb24gdGltZSBhbW9uZyBzaGFyZHMKLSAgICAgICAgICAgIGZvciAoUGFpcjxTdHJpbmcsIExvbmc+IG1vZHVsZSA6IG1vZHVsZVJ1bnRpbWUpIHsKLSAgICAgICAgICAgICAgICBzcGxpdHRlZE1vZHVsZXMuZ2V0KHNoYXJkSW5kZXgpLmFkZChtb2R1bGUpOwotICAgICAgICAgICAgICAgIC8vIGFsc28gY29sbGVjdCB0b3RhbCBydW50aW1lIHBlciBzaGFyZAotICAgICAgICAgICAgICAgIHNoYXJkVGltZXNbc2hhcmRJbmRleF0gKz0gbW9kdWxlLnNlY29uZDsKLSAgICAgICAgICAgICAgICBzaGFyZEluZGV4ICs9IGluY3JlbWVudDsKLSAgICAgICAgICAgICAgICAvLyB6aWctemFnZ2luZzogZmlyc3QgZGlzdHJpYnV0ZSBtb2R1bGVzIGZyb20gc2hhcmQgMCB0byBOLCB0aGVuIE4gZG93biB0byAwLCByZXBlYXQKLSAgICAgICAgICAgICAgICBpZiAoc2hhcmRJbmRleCA9PSBzaGFyZHMpIHsKLSAgICAgICAgICAgICAgICAgICAgaW5jcmVtZW50ID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgIHNoYXJkSW5kZXggPSBzaGFyZHMgLSAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc2hhcmRJbmRleCA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICBpbmNyZW1lbnQgPSAxOwotICAgICAgICAgICAgICAgICAgICBzaGFyZEluZGV4ID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzaGFyZEluZGV4ID0gMDsKLSAgICAgICAgICAgIC8vIHByaW50IHRoZSBmaW5hbCBzaGFyZWQgbGlzdHMKLSAgICAgICAgICAgIGZvciAoTGlzdDxQYWlyPFN0cmluZywgTG9uZz4+IHNoYXJkZWRNb2R1bGVzIDogc3BsaXR0ZWRNb2R1bGVzKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBsaW5lQnVmZmVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICBsaW5lQnVmZmVyLmFwcGVuZChTdHJpbmcuZm9ybWF0KCJzaGFyZCAjJWQgKCVzKToiLAotICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmRJbmRleCwgVGltZVV0aWwuZm9ybWF0RWxhcHNlZFRpbWUoc2hhcmRUaW1lc1tzaGFyZEluZGV4XSkpKTsKLSAgICAgICAgICAgICAgICBJdGVyYXRvcjxQYWlyPFN0cmluZywgTG9uZz4+IGl0ciA9IHNoYXJkZWRNb2R1bGVzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgbGluZUJ1ZmZlci5hcHBlbmQoaXRyLm5leHQoKS5maXJzdCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbGluZUJ1ZmZlci5hcHBlbmQoJywnKTsKLSAgICAgICAgICAgICAgICAgICAgbGluZUJ1ZmZlci5hcHBlbmQoaXRyLm5leHQoKS5maXJzdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNoYXJkSW5kZXgrKzsKLSAgICAgICAgICAgICAgICBwcmludExpbmUobGluZUJ1ZmZlci50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHByaW50TGluZSgiTm8gbW9kdWxlcyBmb3VuZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGxpc3RSZXN1bHRzKCkgewotICAgICAgICBUYWJsZUZvcm1hdHRlciB0YWJsZUZvcm1hdHRlciA9IG5ldyBUYWJsZUZvcm1hdHRlcigpOwotICAgICAgICBMaXN0PExpc3Q8U3RyaW5nPj4gdGFibGUgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgTGlzdDxJSW52b2NhdGlvblJlc3VsdD4gcmVzdWx0cyA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXN1bHRzID0gUmVzdWx0SGFuZGxlci5nZXRMaWdodFJlc3VsdHMoZ2V0QnVpbGRIZWxwZXIoKS5nZXRSZXN1bHRzRGlyKCkpOwotICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkVycm9yIHdoaWxlIHBhcnNpbmcgcmVzdWx0cyBkaXJlY3RvcnkiLCBlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVzdWx0cy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBJSW52b2NhdGlvblJlc3VsdCByZXN1bHQgPSByZXN1bHRzLmdldChpKTsKLSAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGludm9jYXRpb25JbmZvID0gcmVzdWx0LmdldEludm9jYXRpb25JbmZvKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBpbnZvY2F0aW9uIGF0dHJpYnV0ZXMgYXJlIG5vdCBhbHdheXMgcHJlc2VudCAoZS5nLiBpbiB0aGUgY2FzZSBvZiBoYWx0ZWQgcnVucykKLSAgICAgICAgICAgICAgICAvLyByZXBsYWNlIG51bGwgZW50cmllcyB3aXRoIHRoZSBzdHJpbmcgIlVua25vd24iCi0gICAgICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IGVudHJ5IDogaW52b2NhdGlvbkluZm8uZW50cnlTZXQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnkuZ2V0VmFsdWUoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uSW5mby5wdXQoZW50cnkuZ2V0S2V5KCksICJVbmtub3duIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgbW9kdWxlUHJvZ3Jlc3MgPSBTdHJpbmcuZm9ybWF0KCIlZCBvZiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0TW9kdWxlQ29tcGxldGVDb3VudCgpLCByZXN1bHQuZ2V0TW9kdWxlcygpLnNpemUoKSk7Ci0KLSAgICAgICAgICAgICAgICB0YWJsZS5hZGQoQXJyYXlzLmFzTGlzdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcoaSksCi0gICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKHJlc3VsdC5jb3VudFJlc3VsdHMoVGVzdFN0YXR1cy5QQVNTKSksCi0gICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKHJlc3VsdC5jb3VudFJlc3VsdHMoVGVzdFN0YXR1cy5GQUlMKSksCi0gICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQcm9ncmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbXBhdGliaWxpdHlCdWlsZEhlbHBlci5nZXREaXJTdWZmaXgocmVzdWx0LmdldFN0YXJ0VGltZSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXRUZXN0UGxhbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlVdGlsLmpvaW4oIiwgIiwgcmVzdWx0LmdldERldmljZVNlcmlhbHMoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uSW5mby5nZXQoImJ1aWxkX2lkIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uSW5mby5nZXQoImJ1aWxkX3Byb2R1Y3QiKQotICAgICAgICAgICAgICAgICAgICAgICAgKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGFkZCB0aGUgdGFibGUgaGVhZGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3QKLSAgICAgICAgICAgIHRhYmxlLmFkZCgwLCBBcnJheXMuYXNMaXN0KCJTZXNzaW9uIiwgIlBhc3MiLCAiRmFpbCIsICJNb2R1bGVzIENvbXBsZXRlIiwKLSAgICAgICAgICAgICAgICAiUmVzdWx0IERpcmVjdG9yeSIsICJUZXN0IFBsYW4iLCAiRGV2aWNlIHNlcmlhbChzKSIsICJCdWlsZCBJRCIsICJQcm9kdWN0IikpOwotICAgICAgICAgICAgdGFibGVGb3JtYXR0ZXIuZGlzcGxheVRhYmxlKHRhYmxlLCBuZXcgUHJpbnRXcml0ZXIoU3lzdGVtLm91dCwgdHJ1ZSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcHJpbnRMaW5lKFN0cmluZy5mb3JtYXQoIk5vIHJlc3VsdHMgZm91bmQiKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbGlzdFN1YlBsYW5zKCkgewotICAgICAgICBGaWxlW10gZmlsZXMgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZmlsZXMgPSBnZXRCdWlsZEhlbHBlcigpLmdldFN1YlBsYW5zRGlyKCkubGlzdEZpbGVzKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBwcmludExpbmUoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZmlsZXMgIT0gbnVsbCAmJiBmaWxlcy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICBMaXN0PFN0cmluZz4gc3ViUGxhbnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgIGZvciAoRmlsZSBzdWJQbGFuRmlsZSA6IGZpbGVzKSB7Ci0gICAgICAgICAgICAgICAgc3ViUGxhbnMuYWRkKEZpbGVVdGlsLmdldEJhc2VOYW1lKHN1YlBsYW5GaWxlLmdldE5hbWUoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChzdWJQbGFucyk7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBzdWJQbGFuIDogc3ViUGxhbnMpIHsKLSAgICAgICAgICAgICAgICBwcmludExpbmUoc3ViUGxhbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwcmludExpbmUoIk5vIHN1YnBsYW5zIGZvdW5kIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkU3ViUGxhbihTdHJpbmdbXSBmbGF0QXJncykgewotICAgICAgICBTdWJQbGFuSGVscGVyIGNyZWF0b3IgPSBuZXcgU3ViUGxhbkhlbHBlcigpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQXJnc09wdGlvblBhcnNlciBvcHRpb25QYXJzZXIgPSBuZXcgQXJnc09wdGlvblBhcnNlcihjcmVhdG9yKTsKLSAgICAgICAgICAgIG9wdGlvblBhcnNlci5wYXJzZShBcnJheXMuYXNMaXN0KGZsYXRBcmdzKSk7Ci0gICAgICAgICAgICBjcmVhdG9yLmNyZWF0ZUFuZFNlcmlhbGl6ZVN1YlBsYW4oZ2V0QnVpbGRIZWxwZXIoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcHJpbnRMaW5lKCJFcnJvcjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIHByaW50TGluZShBcmdzT3B0aW9uUGFyc2VyLmdldE9wdGlvbkhlbHAoZmFsc2UsIGNyZWF0b3IpKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIgZ2V0QnVpbGRIZWxwZXIoKSB7Ci0gICAgICAgIGlmIChtQnVpbGRIZWxwZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgQ29tcGF0aWJpbGl0eUJ1aWxkUHJvdmlkZXIgYnVpbGRQcm92aWRlciA9IG5ldyBDb21wYXRpYmlsaXR5QnVpbGRQcm92aWRlcigpOwotICAgICAgICAgICAgbUJ1aWxkSGVscGVyID0gbmV3IENvbXBhdGliaWxpdHlCdWlsZEhlbHBlcihidWlsZFByb3ZpZGVyLmdldEJ1aWxkKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtQnVpbGRIZWxwZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgQ29uc29sZSBjb25zb2xlID0gbmV3IENvbXBhdGliaWxpdHlDb25zb2xlKCk7Ci0gICAgICAgIENvbnNvbGUuc3RhcnRDb25zb2xlKGNvbnNvbGUsIGFyZ3MpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3Jlc3VsdC9Db25zb2xlUmVwb3J0ZXIuamF2YSBiL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3Jlc3VsdC9Db25zb2xlUmVwb3J0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk0NGRhMi4uMDAwMDAwMAotLS0gYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC9yZXN1bHQvQ29uc29sZVJlcG9ydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQucmVzdWx0OwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkxvZy5Mb2dMZXZlbDsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIudGVzdHJ1bm5lci5UZXN0SWRlbnRpZmllcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5idWlsZC5JQnVpbGRJbmZvOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmNvbmZpZy5PcHRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuY29uZmlnLk9wdGlvbkNvcGllcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5pbnZva2VyLklJbnZvY2F0aW9uQ29udGV4dDsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5sb2cuTG9nVXRpbC5DTG9nOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnJlc3VsdC5JU2hhcmRhYmxlTGlzdGVuZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudXRpbC5UaW1lVXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogV3JpdGUgdGVzdCBwcm9ncmVzcyB0byB0aGUgdGVzdCBjb25zb2xlLgotICovCi1wdWJsaWMgY2xhc3MgQ29uc29sZVJlcG9ydGVyIGltcGxlbWVudHMgSVNoYXJkYWJsZUxpc3RlbmVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVTktOT1dOX0RFVklDRSA9ICJ1bmtub3duX2RldmljZSI7Ci0KLSAgICBAT3B0aW9uKG5hbWUgPSAicXVpZXQtb3V0cHV0IiwgZGVzY3JpcHRpb24gPSAiTXV0ZSBkaXNwbGF5IG9mIHRlc3QgcmVzdWx0cy4iKQotICAgIHByaXZhdGUgYm9vbGVhbiBtUXVpZXRPdXRwdXQgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgU3RyaW5nIG1EZXZpY2VTZXJpYWwgPSBVTktOT1dOX0RFVklDRTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVRlc3RGYWlsZWQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbU1vZHVsZUlkOwotICAgIHByaXZhdGUgaW50IG1DdXJyZW50VGVzdE51bTsKLSAgICBwcml2YXRlIGludCBtVG90YWxUZXN0c0luTW9kdWxlOwotICAgIHByaXZhdGUgaW50IG1QYXNzZWRUZXN0czsKLSAgICBwcml2YXRlIGludCBtRmFpbGVkVGVzdHM7Ci0gICAgcHJpdmF0ZSBpbnQgbU5vdEV4ZWN1dGVkVGVzdHM7Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaW52b2NhdGlvblN0YXJ0ZWQoSUludm9jYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgQ0xvZy53KCJJbnZvY2F0aW9uQ29udGV4dCBzaG91bGQgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBJQnVpbGRJbmZvIHByaW1hcnlCdWlsZCA9IGNvbnRleHQuZ2V0QnVpbGRJbmZvcygpLmdldCgwKTsKLQotICAgICAgICAvLyBFc2NhcGUgYW55ICIlIiBzaWducyBpbiB0aGUgZGV2aWNlIHNlcmlhbC4KLSAgICAgICAgbURldmljZVNlcmlhbCA9IHByaW1hcnlCdWlsZC5nZXREZXZpY2VTZXJpYWwoKS5yZXBsYWNlKCIlIiwgIiUlIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHRlc3RSdW5TdGFydGVkKFN0cmluZyBpZCwgaW50IG51bVRlc3RzKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZXBlYXRNb2R1bGUgPSAobU1vZHVsZUlkICE9IG51bGwgJiYgbU1vZHVsZUlkLmVxdWFscyhpZCkpOwotICAgICAgICBtTW9kdWxlSWQgPSBpZDsKLSAgICAgICAgbVRvdGFsVGVzdHNJbk1vZHVsZSA9IG51bVRlc3RzOwotICAgICAgICAvLyBSZXNldCBjb3VudGVycwotICAgICAgICBtQ3VycmVudFRlc3ROdW0gPSAwOwotICAgICAgICBtUGFzc2VkVGVzdHMgPSAwOwotICAgICAgICBtRmFpbGVkVGVzdHMgPSAwOwotICAgICAgICBtTm90RXhlY3V0ZWRUZXN0cyA9IDA7Ci0gICAgICAgIG1UZXN0RmFpbGVkID0gZmFsc2U7Ci0gICAgICAgIGxvZ01lc3NhZ2UoIiVzICVzIHdpdGggJWQgdGVzdCVzIiwgKGlzUmVwZWF0TW9kdWxlKSA/ICJDb250aW51aW5nIiA6ICJTdGFydGluZyIsIGlkLAotICAgICAgICAgICAgICAgIG1Ub3RhbFRlc3RzSW5Nb2R1bGUsIChtVG90YWxUZXN0c0luTW9kdWxlID4gMSkgPyAicyIgOiAiIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFydGVkKFRlc3RJZGVudGlmaWVyIHRlc3QpIHsKLSAgICAgICAgbVRlc3RGYWlsZWQgPSBmYWxzZTsKLSAgICAgICAgbUN1cnJlbnRUZXN0TnVtKys7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHRlc3RGYWlsZWQoVGVzdElkZW50aWZpZXIgdGVzdCwgU3RyaW5nIHRyYWNlKSB7Ci0gICAgICAgIGxvZ1Byb2dyZXNzKCIlcyBmYWlsOiAlcyIsIHRlc3QsIHRyYWNlKTsKLSAgICAgICAgbVRlc3RGYWlsZWQgPSB0cnVlOwotICAgICAgICBtRmFpbGVkVGVzdHMrKzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdGVzdElnbm9yZWQoVGVzdElkZW50aWZpZXIgdGVzdCkgewotICAgICAgICBtQ3VycmVudFRlc3ROdW0tLTsKLSAgICAgICAgbG9nUHJvZ3Jlc3MoIiVzIGlnbm9yZSIsIHRlc3QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXNzdW1wdGlvbkZhaWx1cmUoVGVzdElkZW50aWZpZXIgdGVzdCwgU3RyaW5nIHRyYWNlKSB7Ci0gICAgICAgIGxvZ1Byb2dyZXNzKCIlcyBza2lwIiwgdGVzdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbmRlZChUZXN0SWRlbnRpZmllciB0ZXN0LCBNYXA8U3RyaW5nLCBTdHJpbmc+IHRlc3RNZXRyaWNzKSB7Ci0gICAgICAgIGlmICghbVRlc3RGYWlsZWQpIHsKLSAgICAgICAgICAgIGxvZ1Byb2dyZXNzKCIlcyBwYXNzIiwgdGVzdCk7Ci0gICAgICAgICAgICBtUGFzc2VkVGVzdHMrKzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UnVuRmFpbGVkKFN0cmluZyBlcnJvck1lc3NhZ2UpIHsKLSAgICAgICAgbG9nTWVzc2FnZShlcnJvck1lc3NhZ2UpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHRlc3RSdW5FbmRlZChsb25nIGVsYXBzZWRUaW1lLCBNYXA8U3RyaW5nLCBTdHJpbmc+IG1ldHJpY3MpIHsKLSAgICAgICAgbU5vdEV4ZWN1dGVkVGVzdHMgPSBNYXRoLm1heChtVG90YWxUZXN0c0luTW9kdWxlIC0gbUN1cnJlbnRUZXN0TnVtLCAwKTsKLSAgICAgICAgU3RyaW5nIHN0YXR1cyA9IG1Ob3RFeGVjdXRlZFRlc3RzID4gMCA/ICJmYWlsZWQiIDogImNvbXBsZXRlZCI7Ci0gICAgICAgIGxvZ01lc3NhZ2UoIiVzICVzIGluICVzLiAlZCBwYXNzZWQsICVkIGZhaWxlZCwgJWQgbm90IGV4ZWN1dGVkIiwKLSAgICAgICAgICAgIG1Nb2R1bGVJZCwKLSAgICAgICAgICAgIHN0YXR1cywKLSAgICAgICAgICAgIFRpbWVVdGlsLmZvcm1hdEVsYXBzZWRUaW1lKGVsYXBzZWRUaW1lKSwKLSAgICAgICAgICAgIG1QYXNzZWRUZXN0cywKLSAgICAgICAgICAgIG1GYWlsZWRUZXN0cywKLSAgICAgICAgICAgIG1Ob3RFeGVjdXRlZFRlc3RzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdGVzdFJ1blN0b3BwZWQobG9uZyBlbGFwc2VkVGltZSkgewotICAgICAgICBsb2dNZXNzYWdlKCIlcyBzdG9wcGVkICglcykiLCBtTW9kdWxlSWQsIFRpbWVVdGlsLmZvcm1hdEVsYXBzZWRUaW1lKGVsYXBzZWRUaW1lKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgb3V0IG1lc3NhZ2Ugd2l0aCB0ZXN0IGV4ZWN1dGlvbiBzdGF0dXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGxvZ1Byb2dyZXNzKFN0cmluZyBmb3JtYXQsIE9iamVjdC4uLiBhcmdzKSB7Ci0gICAgICAgIGZvcm1hdCA9IFN0cmluZy5mb3JtYXQoIlslcyAlcyAlc10gJXMiLCBwcm9ncmVzcygpLCBtTW9kdWxlSWQsIG1EZXZpY2VTZXJpYWwsIGZvcm1hdCk7Ci0gICAgICAgIGxvZyhmb3JtYXQsIGFyZ3MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50IG91dCBtZXNzYWdlIHRvIHRoZSBjb25zb2xlCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGxvZ01lc3NhZ2UoU3RyaW5nIGZvcm1hdCwgT2JqZWN0Li4uIGFyZ3MpIHsKLSAgICAgICAgZm9ybWF0ID0gU3RyaW5nLmZvcm1hdCgiWyVzXSAlcyIsIG1EZXZpY2VTZXJpYWwsIGZvcm1hdCk7Ci0gICAgICAgIGxvZyhmb3JtYXQsIGFyZ3MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50IG91dCB0byB0aGUgY29uc29sZSBvciBsb2cgc2lsZW50bHkgd2hlbiBtUXVpZXRPdXRwdXQgaXMgdHJ1ZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgbG9nKFN0cmluZyBmb3JtYXQsIE9iamVjdC4uLiBhcmdzKSB7Ci0gICAgICAgIGlmIChtUXVpZXRPdXRwdXQpIHsKLSAgICAgICAgICAgIENMb2cuaShmb3JtYXQsIGFyZ3MpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQ0xvZy5sb2dBbmREaXNwbGF5KExvZ0xldmVsLklORk8sIGZvcm1hdCwgYXJncyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTaGFyZGFibGVMaXN0ZW5lciBjbG9uZSgpIHsKLSAgICAgICAgQ29uc29sZVJlcG9ydGVyIGNsb25lID0gbmV3IENvbnNvbGVSZXBvcnRlcigpOwotICAgICAgICBPcHRpb25Db3BpZXIuY29weU9wdGlvbnNOb1Rocm93KHRoaXMsIGNsb25lKTsKLSAgICAgICAgcmV0dXJuIGNsb25lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiBhIHN0cmluZyBjb250YWluaW5nIHRoZSBwZXJjZW50YWdlIGNvbXBsZXRlIG9mIG1vZHVsZSB0ZXN0IGV4ZWN1dGlvbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBwcm9ncmVzcygpIHsKLSAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIiVkLyVkIiwgbUN1cnJlbnRUZXN0TnVtLCBtVG90YWxUZXN0c0luTW9kdWxlKTsKLSAgICB9Ci0KLSAgICBTdHJpbmcgZ2V0RGV2aWNlU2VyaWFsKCkgewotICAgICAgICByZXR1cm4gbURldmljZVNlcmlhbDsKLSAgICB9Ci0KLSAgICBib29sZWFuIGdldFRlc3RGYWlsZWQoKSB7Ci0gICAgICAgIHJldHVybiBtVGVzdEZhaWxlZDsKLSAgICB9Ci0KLSAgICBTdHJpbmcgZ2V0TW9kdWxlSWQoKSB7Ci0gICAgICAgIHJldHVybiBtTW9kdWxlSWQ7Ci0gICAgfQotCi0gICAgaW50IGdldEN1cnJlbnRUZXN0TnVtKCkgewotICAgICAgICByZXR1cm4gbUN1cnJlbnRUZXN0TnVtOwotICAgIH0KLQotICAgIGludCBnZXRUb3RhbFRlc3RzSW5Nb2R1bGUoKSB7Ci0gICAgICAgIHJldHVybiBtVG90YWxUZXN0c0luTW9kdWxlOwotICAgIH0KLQotICAgIGludCBnZXRQYXNzZWRUZXN0cygpIHsKLSAgICAgICAgcmV0dXJuIG1QYXNzZWRUZXN0czsKLSAgICB9Ci0KLSAgICBpbnQgZ2V0RmFpbGVkVGVzdHMoKSB7Ci0gICAgICAgIHJldHVybiBtRmFpbGVkVGVzdHM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvcmVzdWx0L0lNb2R1bGVMaXN0ZW5lci5qYXZhIGIvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvcmVzdWx0L0lNb2R1bGVMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTNkMjkzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3Jlc3VsdC9JTW9kdWxlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC5yZXN1bHQ7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5yZXN1bHQuSVRlc3RJbnZvY2F0aW9uTGlzdGVuZXI7Ci0KLS8qKgotICogTGlzdGVuZXIgZm9yIENvbXBhdGliaWxpdHkgdGVzdHMuCi0gKiA8cD4KLSAqIFRoaXMgbGlzdGVuZXIgd3JhcHMgYXJvdW5kIHRoZSBub3JtYWwgbGlzdGVuZXIgdG8gY29udmVydCBmcm9tIG1vZHVsZSBuYW1lIHRvIG1vZHVsZSBpZC4KLSAqLwotcHVibGljIGludGVyZmFjZSBJTW9kdWxlTGlzdGVuZXIgZXh0ZW5kcyBJVGVzdEludm9jYXRpb25MaXN0ZW5lciB7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3Jlc3VsdC9JbnZvY2F0aW9uRmFpbHVyZUhhbmRsZXIuamF2YSBiL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3Jlc3VsdC9JbnZvY2F0aW9uRmFpbHVyZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZmZTNiYS4uMDAwMDAwMAotLS0gYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC9yZXN1bHQvSW52b2NhdGlvbkZhaWx1cmVIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQucmVzdWx0OwotCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQuYnVpbGQuQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmxvZy5Mb2dVdGlsLkNMb2c7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudXRpbC5GaWxlVXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0KLS8qKgotICogQSBoZWxwZXIgY2xhc3MgZm9yIHNldHRpbmcgYW5kIGNoZWNraW5nIHdoZXRoZXIgYW4gaW52b2NhdGlvbiBoYXMgZmFpbGVkLgotICovCi1wdWJsaWMgY2xhc3MgSW52b2NhdGlvbkZhaWx1cmVIYW5kbGVyIHsKLQotICAgIC8qKgotICAgICAqIERldGVybWluZSB3aGV0aGVyIHRoZSBpbnZvY2F0aW9uIGZvciB0aGlzIHNlc3Npb24gaGFzIHByZXZpb3VzbHkgZmFpbGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGJ1aWxkSGVscGVyIHRoZSB7QGxpbmsgQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyfSBmcm9tIHdoaWNoIHRvIHJldHJpZXZlIGludm9jYXRpb24KLSAgICAgKiBmYWlsdXJlIGZpbGUKLSAgICAgKiBAcmV0dXJuIGlmIGludm9jYXRpb24gaGFzIHByZXZpb3VzbHkgZmFpbGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGhhc0ZhaWxlZChmaW5hbCBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIgYnVpbGRIZWxwZXIpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEZpbGUgZiA9IGJ1aWxkSGVscGVyLmdldEludm9jYXRpb25GYWlsdXJlRmlsZSgpOwotICAgICAgICAgICAgcmV0dXJuIChmLmV4aXN0cygpICYmIGYubGVuZ3RoKCkgIT0gMCk7Ci0gICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBDTG9nLmUoIkNvdWxkIG5vdCBmaW5kIGludm9jYXRpb24gZmFpbHVyZSBmaWxlIGZvciBzZXNzaW9uICVzIiwKLSAgICAgICAgICAgICAgICBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIuZ2V0RGlyU3VmZml4KGJ1aWxkSGVscGVyLmdldFN0YXJ0VGltZSgpKSk7Ci0gICAgICAgICAgICBDTG9nLmUoZSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZSB0aGUgY2F1c2Ugb2YgaW52b2NhdGlvbiBmYWlsdXJlIHRvIHRoZSByZXN1bHQncyBpbnZvY2F0aW9uIGZhaWx1cmUgZmlsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBidWlsZEhlbHBlciB0aGUge0BsaW5rIENvbXBhdGliaWxpdHlCdWlsZEhlbHBlcn0gZnJvbSB3aGljaCB0byByZXRyaWV2ZSB0aGUKLSAgICAgKiBpbnZvY2F0aW9uIGZhaWx1cmUgZmlsZQotICAgICAqIEBwYXJhbSBjYXVzZSB0aGUgdGhyb3dhYmxlIHJlc3BvbnNpYmxlIGZvciBpbnZvY2F0aW9uIGZhaWx1cmUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0RmFpbGVkKGZpbmFsIENvbXBhdGliaWxpdHlCdWlsZEhlbHBlciBidWlsZEhlbHBlciwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBGaWxlIGYgPSBidWlsZEhlbHBlci5nZXRJbnZvY2F0aW9uRmFpbHVyZUZpbGUoKTsKLSAgICAgICAgICAgIGlmICghZi5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIGYuY3JlYXRlTmV3RmlsZSgpOwotICAgICAgICAgICAgICAgIEZpbGVVdGlsLndyaXRlVG9GaWxlKGNhdXNlLnRvU3RyaW5nKCksIGYpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBDTG9nLmUoIkV4Y2VwdGlvbiB3aGlsZSB3cml0aW5nIGludm9jYXRpb24gZmFpbHVyZSBmaWxlLiIpOwotICAgICAgICAgICAgQ0xvZy5lKGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvcmVzdWx0L01ldGFkYXRhUmVwb3J0ZXIuamF2YSBiL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3Jlc3VsdC9NZXRhZGF0YVJlcG9ydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4OTRjMmQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvcmVzdWx0L01ldGFkYXRhUmVwb3J0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC5yZXN1bHQ7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC5idWlsZC5Db21wYXRpYmlsaXR5QnVpbGRIZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLnRlc3RydW5uZXIuVGVzdElkZW50aWZpZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuanNvbi5zdHJlYW0uSnNvbldyaXRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5idWlsZC5JQnVpbGRJbmZvOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmNvbmZpZy5PcHRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuY29uZmlnLk9wdGlvbkNvcGllcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5pbnZva2VyLklJbnZvY2F0aW9uQ29udGV4dDsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5sb2cuTG9nVXRpbC5DTG9nOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnJlc3VsdC5JU2hhcmRhYmxlTGlzdGVuZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIFdyaXRlIHRlc3QgbWV0YWRhdGEgdG8gdGhlIHJlc3VsdC9tZXRhZGF0YSBmb2xkZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRhZGF0YVJlcG9ydGVyIGltcGxlbWVudHMgSVNoYXJkYWJsZUxpc3RlbmVyIHsKLQotICAgIEBPcHRpb24obmFtZSA9ICJpbmNsdWRlLWZhaWx1cmUtdGltZSIsIGRlc2NyaXB0aW9uID0gIkluY2x1ZGUgdGltaW5nIGFib3V0IHRlc3RzIHRoYXQgZmFpbGVkLiIpCi0gICAgcHJpdmF0ZSBib29sZWFuIG1JbmNsdWRlRmFpbHVyZXMgPSBmYWxzZTsKLQotICAgIEBPcHRpb24obmFtZSA9ICJtaW4tdGVzdC1kdXJhdGlvbiIsIGRlc2NyaXB0aW9uID0gIklnbm9yZSB0ZXN0IGR1cmF0aW9ucyBsZXNzIHRoYW4gdGhpcy4iLAotICAgICAgICAgICAgaXNUaW1lVmFsID0gdHJ1ZSkKLSAgICBwcml2YXRlIGxvbmcgbU1pblRlc3REdXJhdGlvbiA9IDIgKiAxMDAwOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBX0RJUiA9ICJtZXRhZGF0YSI7Ci0gICAgcHJpdmF0ZSBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIgbUJ1aWxkSGVscGVyOwotICAgIHByaXZhdGUgRmlsZSBtTWV0YWRhdGFEaXI7Ci0gICAgcHJpdmF0ZSBsb25nIG1TdGFydFRpbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbUN1cnJlbnRNb2R1bGU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1UZXN0RmFpbGVkOwotICAgIHByaXZhdGUgQ29sbGVjdGlvbjxUZXN0TWV0YWRhdGE+IG1UZXN0TWV0YWRhdGEgPSBuZXcgTGlua2VkTGlzdDw+KCk7Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTaGFyZGFibGVMaXN0ZW5lciBjbG9uZSgpIHsKLSAgICAgICAgTWV0YWRhdGFSZXBvcnRlciBjbG9uZSA9IG5ldyBNZXRhZGF0YVJlcG9ydGVyKCk7Ci0gICAgICAgIE9wdGlvbkNvcGllci5jb3B5T3B0aW9uc05vVGhyb3codGhpcywgY2xvbmUpOwotICAgICAgICByZXR1cm4gY2xvbmU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGludm9jYXRpb25TdGFydGVkKElJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIElCdWlsZEluZm8gYnVpbGRJbmZvID0gY29udGV4dC5nZXRCdWlsZEluZm9zKCkuZ2V0KDApOwotICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgewotICAgICAgICAgICAgaWYgKG1CdWlsZEhlbHBlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkSGVscGVyID0gbmV3IENvbXBhdGliaWxpdHlCdWlsZEhlbHBlcihidWlsZEluZm8pOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG1NZXRhZGF0YURpciA9IG5ldyBGaWxlKG1CdWlsZEhlbHBlci5nZXRSZXN1bHREaXIoKSwgTUVUQURBVEFfRElSKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTWV0YWRhdGEgRGlyZWN0b3J5IHdhcyBub3QgY3JlYXRlZDogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1ldGFkYXRhRGlyLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdGVzdFJ1blN0YXJ0ZWQoU3RyaW5nIGlkLCBpbnQgbnVtVGVzdHMpIHsKLSAgICAgICAgdGhpcy5tQ3VycmVudE1vZHVsZSA9IGlkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhcnRlZChUZXN0SWRlbnRpZmllciB0ZXN0KSB7Ci0gICAgICAgIG1TdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgbVRlc3RGYWlsZWQgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdGVzdEZhaWxlZChUZXN0SWRlbnRpZmllciB0ZXN0LCBTdHJpbmcgdHJhY2UpIHsKLSAgICAgICAgbVRlc3RGYWlsZWQgPSB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SWdub3JlZChUZXN0SWRlbnRpZmllciB0ZXN0KSB7Ci0gICAgICAgIG1UZXN0RmFpbGVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdGVzdEFzc3VtcHRpb25GYWlsdXJlKFRlc3RJZGVudGlmaWVyIHRlc3QsIFN0cmluZyB0cmFjZSkgewotICAgICAgICBtVGVzdEZhaWxlZCA9IHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbmRlZChUZXN0SWRlbnRpZmllciB0ZXN0LCBNYXA8U3RyaW5nLCBTdHJpbmc+IHRlc3RNZXRyaWNzKSB7Ci0gICAgICAgIGxvbmcgZHVyYXRpb24gPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIG1TdGFydFRpbWU7Ci0gICAgICAgIGlmIChtVGVzdEZhaWxlZCAmJiAhbUluY2x1ZGVGYWlsdXJlcykgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkdXJhdGlvbiA8IG1NaW5UZXN0RHVyYXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIFRlc3RNZXRhZGF0YSBtZXRhZGF0YSA9IG5ldyBUZXN0TWV0YWRhdGEoKTsKLSAgICAgICAgbWV0YWRhdGEudGVzdElkID0gYnVpbGRUZXN0SWQodGVzdCk7Ci0gICAgICAgIG1ldGFkYXRhLnNlY29uZHMgPSBkdXJhdGlvbiAvIDEwMDA7IC8vIGNvbnZlcnQgdG8gc2Vjb25kIGZvciByZXBvcnRpbmcKLSAgICAgICAgbVRlc3RNZXRhZGF0YS5hZGQobWV0YWRhdGEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UnVuRW5kZWQobG9uZyBlbGFwc2VkVGltZSwgTWFwPFN0cmluZywgU3RyaW5nPiBtZXRyaWNzKSB7Ci0gICAgICAgIGlmICghbVRlc3RNZXRhZGF0YS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHRyeVdyaXRlVG9GaWxlKG1CdWlsZEhlbHBlciwgbUN1cnJlbnRNb2R1bGUsIG1NZXRhZGF0YURpciwgbVRlc3RNZXRhZGF0YSk7Ci0gICAgICAgIH0KLSAgICAgICAgbVRlc3RNZXRhZGF0YS5jbGVhcigpOwotICAgIH0KLQotICAgIC8qKiBJbmZvcm1hdGlvbiBhYm91dCBhIHRlc3QncyBleGVjdXRpb24uICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0TWV0YWRhdGEgewotICAgICAgICAvLyBUaGUgaWQgb2YgdGhlIHRlc3QKLSAgICAgICAgU3RyaW5nIHRlc3RJZDsKLSAgICAgICAgLy8gVGhlIGR1cmF0aW9uIG9mIHRoZSB0ZXN0LgotICAgICAgICBsb25nIHNlY29uZHM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGJ1aWxkVGVzdElkKFRlc3RJZGVudGlmaWVyIHRlc3QpIHsKLSAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIiVzLiVzIiwgdGVzdC5nZXRDbGFzc05hbWUoKSwgdGVzdC5nZXRUZXN0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHRyeVdyaXRlVG9GaWxlKAotICAgICAgICAgICAgQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyIGNvbXBhdGliaWxpdHlCdWlsZEhlbHBlciwKLSAgICAgICAgICAgIFN0cmluZyBtb2R1bGVOYW1lLAotICAgICAgICAgICAgRmlsZSBtZXRhZGF0YURpciwKLSAgICAgICAgICAgIENvbGxlY3Rpb248VGVzdE1ldGFkYXRhPiBtZXRhZGF0YXMpIHsKLQotICAgICAgICBtZXRhZGF0YURpci5ta2RpcnMoKTsKLQotICAgICAgICBTdHJpbmcgbW9kdWxlRmlsZU5hbWUgPSBtb2R1bGVOYW1lICsgIi4iICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyAiLmpzb24iOwotICAgICAgICBGaWxlIG1ldGFkYXRhRmlsZSA9IG5ldyBGaWxlKG1ldGFkYXRhRGlyLCBtb2R1bGVGaWxlTmFtZSk7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gYnVpbGRBdHRyaWJ1dGVzID0KLSAgICAgICAgICAgICAgICBjb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIuZ2V0QnVpbGRJbmZvKCkuZ2V0QnVpbGRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIHRyeSAoSnNvbldyaXRlciB3cml0ZXIgPSBuZXcgSnNvbldyaXRlcihuZXcgUHJpbnRXcml0ZXIobWV0YWRhdGFGaWxlKSkpIHsKLSAgICAgICAgICAgIHdyaXRlci5iZWdpbk9iamVjdCgpOwotCi0gICAgICAgICAgICB3cml0ZXIubmFtZSgiZmluZ2VycHJpbnQiKTsKLSAgICAgICAgICAgIHdyaXRlci52YWx1ZShidWlsZEF0dHJpYnV0ZXMuZ2V0KCJjdHM6YnVpbGRfZmluZ2VycHJpbnQiKSk7Ci0KLSAgICAgICAgICAgIHdyaXRlci5uYW1lKCJwcm9kdWN0Iik7Ci0gICAgICAgICAgICB3cml0ZXIudmFsdWUoYnVpbGRBdHRyaWJ1dGVzLmdldCgiY3RzOmJ1aWxkX3Byb2R1Y3QiKSk7Ci0KLSAgICAgICAgICAgIHdyaXRlci5uYW1lKCJidWlsZF9pZCIpOwotICAgICAgICAgICAgd3JpdGVyLnZhbHVlKGJ1aWxkQXR0cmlidXRlcy5nZXQoImN0czpidWlsZF9pZCIpKTsKLQotICAgICAgICAgICAgd3JpdGVyLm5hbWUoInN1aXRlX3ZlcnNpb24iKTsKLSAgICAgICAgICAgIHdyaXRlci52YWx1ZShjb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIuZ2V0U3VpdGVWZXJzaW9uKCkpOwotCi0gICAgICAgICAgICB3cml0ZXIubmFtZSgic3VpdGVfbmFtZSIpOwotICAgICAgICAgICAgd3JpdGVyLnZhbHVlKGNvbXBhdGliaWxpdHlCdWlsZEhlbHBlci5nZXRTdWl0ZU5hbWUoKSk7Ci0KLSAgICAgICAgICAgIHdyaXRlci5uYW1lKCJzdWl0ZV9idWlsZCIpOwotICAgICAgICAgICAgd3JpdGVyLnZhbHVlKGNvbXBhdGliaWxpdHlCdWlsZEhlbHBlci5nZXRTdWl0ZUJ1aWxkKCkpOwotCi0gICAgICAgICAgICB3cml0ZXIubmFtZSgibW9kdWxlX2lkIik7Ci0gICAgICAgICAgICB3cml0ZXIudmFsdWUobW9kdWxlTmFtZSk7Ci0KLSAgICAgICAgICAgIHdyaXRlci5uYW1lKCJ0ZXN0Iik7Ci0gICAgICAgICAgICB3cml0ZXIuYmVnaW5BcnJheSgpOwotICAgICAgICAgICAgZm9yIChUZXN0TWV0YWRhdGEgbWV0YWRhdGEgOiBtZXRhZGF0YXMpIHsKLSAgICAgICAgICAgICAgICB3cml0ZXIuYmVnaW5PYmplY3QoKTsKLSAgICAgICAgICAgICAgICB3cml0ZXIubmFtZSgiaWQiKTsKLSAgICAgICAgICAgICAgICB3cml0ZXIudmFsdWUobWV0YWRhdGEudGVzdElkKTsKLSAgICAgICAgICAgICAgICB3cml0ZXIubmFtZSgic2VjIik7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLnZhbHVlKG1ldGFkYXRhLnNlY29uZHMpOwotICAgICAgICAgICAgICAgIHdyaXRlci5lbmRPYmplY3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdyaXRlci5lbmRBcnJheSgpOwotCi0gICAgICAgICAgICB3cml0ZXIuZW5kT2JqZWN0KCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIENMb2cuZSgiWyVzXSBXaGlsZSBzYXZpbmcgbWV0YWRhdGEuIiwgbWV0YWRhdGFGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICAgIENMb2cuZShlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBDb2xsZWN0aW9uPFRlc3RNZXRhZGF0YT4gZ2V0VGVzdE1ldGFkYXRhKCkgewotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlQ29sbGVjdGlvbihtVGVzdE1ldGFkYXRhKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC9yZXN1bHQvTW9kdWxlTGlzdGVuZXIuamF2YSBiL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3Jlc3VsdC9Nb2R1bGVMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTQwODg3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3Jlc3VsdC9Nb2R1bGVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC5yZXN1bHQ7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5JTW9kdWxlRGVmOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi50ZXN0cnVubmVyLlRlc3RJZGVudGlmaWVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmludm9rZXIuSUludm9jYXRpb25Db250ZXh0OwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmxvZy5Mb2dVdGlsLkNMb2c7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQucmVzdWx0LklUZXN0SW52b2NhdGlvbkxpc3RlbmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnJlc3VsdC5JbnB1dFN0cmVhbVNvdXJjZTsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5yZXN1bHQuTG9nRGF0YVR5cGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQucmVzdWx0LlRlc3RTdW1tYXJ5OwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBMaXN0ZW5lciBmb3IgQ29tcGF0aWJpbGl0eSB0ZXN0IGluZm8uCi0gKiA8cD4KLSAqIFRoaXMgbGlzdGVuZXIgd3JhcHMgYXJvdW5kIHRoZSBub3JtYWwgbGlzdGVuZXIgdG8gY29udmVydCBmcm9tIG1vZHVsZSBuYW1lIHRvIG1vZHVsZSBpZC4KLSAqLwotcHVibGljIGNsYXNzIE1vZHVsZUxpc3RlbmVyIGltcGxlbWVudHMgSU1vZHVsZUxpc3RlbmVyIHsKLQotICAgIHByaXZhdGUgSU1vZHVsZURlZiBtTW9kdWxlOwotICAgIHByaXZhdGUgSVRlc3RJbnZvY2F0aW9uTGlzdGVuZXIgbUxpc3RlbmVyOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG1vZHVsZQotICAgICAqIEBwYXJhbSBsaXN0ZW5lcgotICAgICAqLwotICAgIHB1YmxpYyBNb2R1bGVMaXN0ZW5lcihJTW9kdWxlRGVmIG1vZHVsZSwgSVRlc3RJbnZvY2F0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgbU1vZHVsZSA9IG1vZHVsZTsKLSAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGludm9jYXRpb25TdGFydGVkKElJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIENMb2cuZCgiTW9kdWxlTGlzdGVuZXIuaW52b2NhdGlvblN0YXJ0ZWQoJXMpIiwgY29udGV4dC5nZXRCdWlsZEluZm9zKCkpOwotICAgICAgICBtTGlzdGVuZXIuaW52b2NhdGlvblN0YXJ0ZWQoY29udGV4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHRlc3RSdW5TdGFydGVkKFN0cmluZyBuYW1lLCBpbnQgbnVtVGVzdHMpIHsKLSAgICAgICAgQ0xvZy5kKCJNb2R1bGVMaXN0ZW5lci50ZXN0UnVuU3RhcnRlZCglcywgJWQpIiwgbmFtZSwgbnVtVGVzdHMpOwotICAgICAgICBtTGlzdGVuZXIudGVzdFJ1blN0YXJ0ZWQobU1vZHVsZS5nZXRJZCgpLCBudW1UZXN0cyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFydGVkKFRlc3RJZGVudGlmaWVyIHRlc3QpIHsKLSAgICAgICAgQ0xvZy5kKCJNb2R1bGVMaXN0ZW5lci50ZXN0U3RhcnRlZCglcykiLCB0ZXN0LnRvU3RyaW5nKCkpOwotICAgICAgICBtTGlzdGVuZXIudGVzdFN0YXJ0ZWQodGVzdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbmRlZChUZXN0SWRlbnRpZmllciB0ZXN0LCBNYXA8U3RyaW5nLCBTdHJpbmc+IG1ldHJpY3MpIHsKLSAgICAgICAgQ0xvZy5kKCJNb2R1bGVMaXN0ZW5lci50ZXN0RW5kZWQoJXMsICVzKSIsIHRlc3QudG9TdHJpbmcoKSwgbWV0cmljcy50b1N0cmluZygpKTsKLSAgICAgICAgbUxpc3RlbmVyLnRlc3RFbmRlZCh0ZXN0LCBtZXRyaWNzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdGVzdElnbm9yZWQoVGVzdElkZW50aWZpZXIgdGVzdCkgewotICAgICAgICBDTG9nLmQoIk1vZHVsZUxpc3RlbmVyLnRlc3RJZ25vcmVkKCVzKSIsIHRlc3QudG9TdHJpbmcoKSk7Ci0gICAgICAgIG1MaXN0ZW5lci50ZXN0SWdub3JlZCh0ZXN0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdGVzdEZhaWxlZChUZXN0SWRlbnRpZmllciB0ZXN0LCBTdHJpbmcgdHJhY2UpIHsKLSAgICAgICAgQ0xvZy5kKCJNb2R1bGVMaXN0ZW5lci50ZXN0RmFpbGVkKCVzLCAlcykiLCB0ZXN0LnRvU3RyaW5nKCksIHRyYWNlKTsKLSAgICAgICAgbUxpc3RlbmVyLnRlc3RGYWlsZWQodGVzdCwgdHJhY2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXNzdW1wdGlvbkZhaWx1cmUoVGVzdElkZW50aWZpZXIgdGVzdCwgU3RyaW5nIHRyYWNlKSB7Ci0gICAgICAgIENMb2cuZCgiTW9kdWxlTGlzdGVuZXIudGVzdEFzc3VtcHRpb25GYWlsdXJlKCVzLCAlcykiLCB0ZXN0LnRvU3RyaW5nKCksIHRyYWNlKTsKLSAgICAgICAgbUxpc3RlbmVyLnRlc3RBc3N1bXB0aW9uRmFpbHVyZSh0ZXN0LCB0cmFjZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHRlc3RSdW5TdG9wcGVkKGxvbmcgZWxhcHNlZFRpbWUpIHsKLSAgICAgICAgQ0xvZy5kKCJNb2R1bGVMaXN0ZW5lci50ZXN0UnVuU3RvcHBlZCglZCkiLCBlbGFwc2VkVGltZSk7Ci0gICAgICAgIG1MaXN0ZW5lci50ZXN0UnVuU3RvcHBlZChlbGFwc2VkVGltZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHRlc3RSdW5FbmRlZChsb25nIGVsYXBzZWRUaW1lLCBNYXA8U3RyaW5nLCBTdHJpbmc+IG1ldHJpY3MpIHsKLSAgICAgICAgQ0xvZy5kKCJNb2R1bGVMaXN0ZW5lci50ZXN0UnVuRW5kZWQoJWQsICVzKSIsIGVsYXBzZWRUaW1lLCBtZXRyaWNzLnRvU3RyaW5nKCkpOwotICAgICAgICBtTGlzdGVuZXIudGVzdFJ1bkVuZGVkKGVsYXBzZWRUaW1lLCBtZXRyaWNzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdGVzdFJ1bkZhaWxlZChTdHJpbmcgZXJyb3JNZXNzYWdlKSB7Ci0gICAgICAgIENMb2cuZCgiTW9kdWxlTGlzdGVuZXIudGVzdFJ1bkZhaWxlZCglcykiLCBlcnJvck1lc3NhZ2UpOwotICAgICAgICBtTGlzdGVuZXIudGVzdFJ1bkZhaWxlZChlcnJvck1lc3NhZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVGVzdFN1bW1hcnkgZ2V0U3VtbWFyeSgpIHsKLSAgICAgICAgcmV0dXJuIG1MaXN0ZW5lci5nZXRTdW1tYXJ5KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGludm9jYXRpb25FbmRlZChsb25nIGVsYXBzZWRUaW1lKSB7Ci0gICAgICAgIENMb2cuZCgiTW9kdWxlTGlzdGVuZXIuaW52b2NhdGlvbkVuZGVkKCVkKSIsIGVsYXBzZWRUaW1lKTsKLSAgICAgICAgbUxpc3RlbmVyLmludm9jYXRpb25FbmRlZChlbGFwc2VkVGltZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGludm9jYXRpb25GYWlsZWQoVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIENMb2cuZCgiTW9kdWxlTGlzdGVuZXIuaW52b2NhdGlvbkZhaWxlZCglcykiLCBjYXVzZS50b1N0cmluZygpKTsKLSAgICAgICAgbUxpc3RlbmVyLmludm9jYXRpb25GYWlsZWQoY2F1c2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TG9nKFN0cmluZyBuYW1lLCBMb2dEYXRhVHlwZSB0eXBlLCBJbnB1dFN0cmVhbVNvdXJjZSBzdHJlYW0pIHsKLSAgICAgICAgQ0xvZy5kKCJNb2R1bGVMaXN0ZW5lci50ZXN0TG9nKCVzLCAlcywgJXMpIiwgbmFtZSwgdHlwZS50b1N0cmluZygpLCBzdHJlYW0udG9TdHJpbmcoKSk7Ci0gICAgICAgIG1MaXN0ZW5lci50ZXN0TG9nKG5hbWUsIHR5cGUsIHN0cmVhbSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC9yZXN1bHQvUmVzdWx0UmVwb3J0ZXIuamF2YSBiL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3Jlc3VsdC9SZXN1bHRSZXBvcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjgxNDhjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3Jlc3VsdC9SZXN1bHRSZXBvcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC5yZXN1bHQ7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC5idWlsZC5Db21wYXRpYmlsaXR5QnVpbGRIZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGVzdHR5cGUuQ29tcGF0aWJpbGl0eVRlc3Q7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudXRpbC5SZXRyeVR5cGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DaGVja3N1bVJlcG9ydGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuRGV2aWNlSW5mbzsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLklDYXNlUmVzdWx0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuSUludm9jYXRpb25SZXN1bHQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5JTW9kdWxlUmVzdWx0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuSVRlc3RSZXN1bHQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5JbnZvY2F0aW9uUmVzdWx0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuTWV0cmljc1N0b3JlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuUmVwb3J0TG9nOwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuUmVzdWx0SGFuZGxlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlJlc3VsdFVwbG9hZGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuVGVzdFN0YXR1czsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuTG9nLkxvZ0xldmVsOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi50ZXN0cnVubmVyLlRlc3RJZGVudGlmaWVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmJ1aWxkLklCdWlsZEluZm87Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuY29uZmlnLk9wdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5jb25maWcuT3B0aW9uLkltcG9ydGFuY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuY29uZmlnLk9wdGlvbkNsYXNzOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmNvbmZpZy5PcHRpb25Db3BpZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuaW52b2tlci5JSW52b2NhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQubG9nLkxvZ1V0aWwuQ0xvZzsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5yZXN1bHQuSUxvZ1NhdmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnJlc3VsdC5JTG9nU2F2ZXJMaXN0ZW5lcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5yZXN1bHQuSVNoYXJkYWJsZUxpc3RlbmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnJlc3VsdC5JVGVzdEludm9jYXRpb25MaXN0ZW5lcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5yZXN1bHQuSVRlc3RTdW1tYXJ5TGlzdGVuZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQucmVzdWx0LklucHV0U3RyZWFtU291cmNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnJlc3VsdC5Mb2dEYXRhVHlwZTsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5yZXN1bHQuTG9nRmlsZTsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5yZXN1bHQuTG9nRmlsZVNhdmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnJlc3VsdC5UZXN0U3VtbWFyeTsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC51dGlsLkZpbGVVdGlsOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnV0aWwuU3RyZWFtVXRpbDsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC51dGlsLlRpbWVVdGlsOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnV0aWwuWmlwVXRpbDsKLQotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwotCi1pbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwotCi0vKioKLSAqIENvbGxlY3QgdGVzdCByZXN1bHRzIGZvciBhbiBlbnRpcmUgaW52b2NhdGlvbiBhbmQgb3V0cHV0IHRlc3QgcmVzdWx0cyB0byBkaXNrLgotICovCi1AT3B0aW9uQ2xhc3MoYWxpYXM9InJlc3VsdC1yZXBvcnRlciIpCi1wdWJsaWMgY2xhc3MgUmVzdWx0UmVwb3J0ZXIgaW1wbGVtZW50cyBJTG9nU2F2ZXJMaXN0ZW5lciwgSVRlc3RJbnZvY2F0aW9uTGlzdGVuZXIsCi0gICAgICAgSVRlc3RTdW1tYXJ5TGlzdGVuZXIsIElTaGFyZGFibGVMaXN0ZW5lciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5LTk9XTl9ERVZJQ0UgPSAidW5rbm93bl9kZXZpY2UiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRfS0VZID0gIkNPTVBBVElCSUxJVFlfVEVTVF9SRVNVTFQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVFNfUFJFRklYID0gImN0czoiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVUlMRF9JTkZPID0gQ1RTX1BSRUZJWCArICJidWlsZF8iOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVJTERfQlJBTkQgPSAiYnVpbGRfYnJhbmQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJVSUxEX0RFVklDRSA9ICJidWlsZF9kZXZpY2UiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJVSUxEX0ZJTkdFUlBSSU5UID0gImJ1aWxkX2ZpbmdlcnByaW50IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCVUlMRF9JRCA9ICJidWlsZF9pZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVJTERfTUFOVUZBQ1RVUkVSID0gImJ1aWxkX21hbnVmYWN0dXJlciI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVJTERfTU9ERUwgPSAiYnVpbGRfbW9kZWwiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJVSUxEX1BST0RVQ1QgPSAiYnVpbGRfcHJvZHVjdCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVJTERfVkVSU0lPTl9SRUxFQVNFID0gImJ1aWxkX3ZlcnNpb25fcmVsZWFzZSI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0PFN0cmluZz4gTk9UX1JFVFJZX0ZJTEVTID0gQXJyYXlzLmFzTGlzdCgKLSAgICAgICAgICAgIENoZWNrc3VtUmVwb3J0ZXIuTkFNRSwKLSAgICAgICAgICAgIENoZWNrc3VtUmVwb3J0ZXIuUFJFVl9OQU1FLAotICAgICAgICAgICAgUmVzdWx0SGFuZGxlci5GQUlMVVJFX1JFUE9SVF9OQU1FLAotICAgICAgICAgICAgImRpZmZzIik7Ci0KLSAgICBAT3B0aW9uKG5hbWUgPSBDb21wYXRpYmlsaXR5VGVzdC5SRVRSWV9PUFRJT04sCi0gICAgICAgICAgICBzaG9ydE5hbWUgPSAncicsCi0gICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICJyZXRyeSBhIHByZXZpb3VzIHNlc3Npb24uIiwKLSAgICAgICAgICAgIGltcG9ydGFuY2UgPSBJbXBvcnRhbmNlLklGX1VOU0VUKQotICAgIHByaXZhdGUgSW50ZWdlciBtUmV0cnlTZXNzaW9uSWQgPSBudWxsOwotCi0gICAgQE9wdGlvbihuYW1lID0gQ29tcGF0aWJpbGl0eVRlc3QuUkVUUllfVFlQRV9PUFRJT04sCi0gICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICJ1c2VkIHdpdGggIiArIENvbXBhdGliaWxpdHlUZXN0LlJFVFJZX09QVElPTgotICAgICAgICAgICAgKyAiLCByZXRyeSB0ZXN0cyBvZiBhIGNlcnRhaW4gc3RhdHVzLiBQb3NzaWJsZSB2YWx1ZXMgaW5jbHVkZSBcImZhaWxlZFwiLCAiCi0gICAgICAgICAgICArICJcIm5vdF9leGVjdXRlZFwiLCBhbmQgXCJjdXN0b21cIi4iLAotICAgICAgICAgICAgaW1wb3J0YW5jZSA9IEltcG9ydGFuY2UuSUZfVU5TRVQpCi0gICAgcHJpdmF0ZSBSZXRyeVR5cGUgbVJldHJ5VHlwZSA9IG51bGw7Ci0KLSAgICBAT3B0aW9uKG5hbWUgPSAicmVzdWx0LXNlcnZlciIsIGRlc2NyaXB0aW9uID0gIlNlcnZlciB0byBwdWJsaXNoIHRlc3QgcmVzdWx0cy4iKQotICAgIHByaXZhdGUgU3RyaW5nIG1SZXN1bHRTZXJ2ZXI7Ci0KLSAgICBAT3B0aW9uKG5hbWUgPSAiZGlzYWJsZS1yZXN1bHQtcG9zdGluZyIsIGRlc2NyaXB0aW9uID0gIkRpc2FibGUgcmVzdWx0IHBvc3RpbmcgaW50byByZXBvcnQgc2VydmVyLiIpCi0gICAgcHJpdmF0ZSBib29sZWFuIG1EaXNhYmxlUmVzdWx0UG9zdGluZyA9IGZhbHNlOwotCi0gICAgQE9wdGlvbihuYW1lID0gImluY2x1ZGUtdGVzdC1sb2ctdGFncyIsIGRlc2NyaXB0aW9uID0gIkluY2x1ZGUgdGVzdCBsb2cgdGFncyBpbiByZXBvcnQuIikKLSAgICBwcml2YXRlIGJvb2xlYW4gbUluY2x1ZGVUZXN0TG9nVGFncyA9IGZhbHNlOwotCi0gICAgQE9wdGlvbihuYW1lID0gInVzZS1sb2ctc2F2ZXIiLCBkZXNjcmlwdGlvbiA9ICJBbHNvIHNhdmVzIGdlbmVyYXRlZCByZXN1bHQgd2l0aCBsb2cgc2F2ZXIiKQotICAgIHByaXZhdGUgYm9vbGVhbiBtVXNlTG9nU2F2ZXIgPSBmYWxzZTsKLQotICAgIEBPcHRpb24obmFtZSA9ICJjb21wcmVzcy1sb2dzIiwgZGVzY3JpcHRpb24gPSAiV2hldGhlciBsb2dzIHdpbGwgYmUgc2F2ZWQgd2l0aCBjb21wcmVzc2lvbiIpCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Db21wcmVzc0xvZ3MgPSB0cnVlOwotCi0gICAgcHJpdmF0ZSBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIgbUJ1aWxkSGVscGVyOwotICAgIHByaXZhdGUgRmlsZSBtUmVzdWx0RGlyID0gbnVsbDsKLSAgICBwcml2YXRlIEZpbGUgbUxvZ0RpciA9IG51bGw7Ci0gICAgcHJpdmF0ZSBSZXN1bHRVcGxvYWRlciBtVXBsb2FkZXI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbVJlZmVyZW5jZVVybDsKLSAgICBwcml2YXRlIElMb2dTYXZlciBtTG9nU2F2ZXI7Ci0gICAgcHJpdmF0ZSBpbnQgaW52b2NhdGlvbkVuZGVkQ291bnQgPSAwOwotICAgIHByaXZhdGUgQ291bnREb3duTGF0Y2ggbUZpbmFsaXplZCA9IG51bGw7Ci0KLSAgICBwcm90ZWN0ZWQgSUludm9jYXRpb25SZXN1bHQgbVJlc3VsdCA9IG5ldyBJbnZvY2F0aW9uUmVzdWx0KCk7Ci0gICAgcHJpdmF0ZSBJTW9kdWxlUmVzdWx0IG1DdXJyZW50TW9kdWxlUmVzdWx0OwotICAgIHByaXZhdGUgSUNhc2VSZXN1bHQgbUN1cnJlbnRDYXNlUmVzdWx0OwotICAgIHByaXZhdGUgSVRlc3RSZXN1bHQgbUN1cnJlbnRSZXN1bHQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbURldmljZVNlcmlhbCA9IFVOS05PV05fREVWSUNFOwotICAgIHByaXZhdGUgU2V0PFN0cmluZz4gbU1hc3RlckRldmljZVNlcmlhbHMgPSBuZXcgSGFzaFNldDw+KCk7Ci0gICAgcHJpdmF0ZSBTZXQ8SUJ1aWxkSW5mbz4gbU1hc3RlckJ1aWxkSW5mb3MgPSBuZXcgSGFzaFNldDw+KCk7Ci0KLSAgICAvLyBtQ3VycmVudFRlc3ROdW0gYW5kIG1Ub3RhbFRlc3RzSW5Nb2R1bGUgdHJhY2sgdGhlIHByb2dyZXNzIHdpdGhpbiB0aGUgbW9kdWxlCi0gICAgLy8gTm90ZSB0aGF0IHRoaXMgY291bnQgaXMgbm90IG5lY2Vzc2FyaWx5IGVxdWFsIHRvIHRoZSBjb3VudCBvZiB0ZXN0cyBjb250YWluZWQKLSAgICAvLyBpbiBtQ3VycmVudE1vZHVsZVJlc3VsdCBiZWNhdXNlIG9mIGhvdyBzcGVjaWFsIGNhc2VzIGxpa2UgaWdub3JlZCB0ZXN0cyBhcmUgcmVwb3J0ZWQuCi0gICAgcHJpdmF0ZSBpbnQgbUN1cnJlbnRUZXN0TnVtOwotICAgIHByaXZhdGUgaW50IG1Ub3RhbFRlc3RzSW5Nb2R1bGU7Ci0KLSAgICAvLyBXaGV0aGVyIG1vZHVsZXMgY2FuIGJlIG1hcmtlZCBkb25lIGZvciB0aGlzIGludm9jYXRpb24uIEluaXRpYWxpemVkIGluIGludm9jYXRpb25TdGFydGVkKCkKLSAgICAvLyBWaXNpYmxlIGZvciB1bml0IHRlc3RpbmcKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtQ2FuTWFya0RvbmU7Ci0gICAgLy8gV2hldGhlciB0aGUgY3VycmVudCB0ZXN0IHJ1biBoYXMgZmFpbGVkLiBJZiB0cnVlLCB3ZSB3aWxsIG5vdCBtYXJrIHRoZSBjdXJyZW50IG1vZHVsZSBkb25lCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gbVRlc3RSdW5GYWlsZWQ7Ci0gICAgLy8gV2hldGhlciB0aGUgY3VycmVudCBtb2R1bGUgaGFzIHByZXZpb3VzbHkgYmVlbiBtYXJrZWQgZG9uZQotICAgIHByaXZhdGUgYm9vbGVhbiBtTW9kdWxlV2FzRG9uZTsKLQotICAgIC8vIE51bGxhYmxlLiBJZiBudWxsLCAidGhpcyIgaXMgY29uc2lkZXJlZCB0aGUgbWFzdGVyIGFuZCBtdXN0IGhhbmRsZQotICAgIC8vIHJlc3VsdCBhZ2dyZWdhdGlvbiBhbmQgcmVwb3J0aW5nLiBXaGVuIG5vdCBudWxsLCBpdCBzaG91bGQgZm9yd2FyZCBldmVudHMKLSAgICAvLyB0byB0aGUgbWFzdGVyLgotICAgIHByaXZhdGUgZmluYWwgUmVzdWx0UmVwb3J0ZXIgbU1hc3RlclJlc3VsdFJlcG9ydGVyOwotCi0gICAgcHJpdmF0ZSBMb2dGaWxlU2F2ZXIgbVRlc3RMb2dTYXZlcjsKLQotICAgIC8vIEVsYXBzZWQgdGltZSBmcm9tIGludm9jYXRpb24gc3RhcnRlZCB0byBlbmRlZC4KLSAgICBwcml2YXRlIGxvbmcgbUVsYXBzZWRUaW1lOwotCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgUmVzdWx0UmVwb3J0ZXIoKSB7Ci0gICAgICAgIHRoaXMobnVsbCk7Ci0gICAgICAgIG1GaW5hbGl6ZWQgPSBuZXcgQ291bnREb3duTGF0Y2goMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgc2hhcmQgUmVzdWx0UmVwb3J0ZXIgdGhhdCBmb3J3YXJkcyBtb2R1bGUgcmVzdWx0cyB0byB0aGUKLSAgICAgKiBtYXN0ZXJSZXN1bHRSZXBvcnRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgUmVzdWx0UmVwb3J0ZXIoUmVzdWx0UmVwb3J0ZXIgbWFzdGVyUmVzdWx0UmVwb3J0ZXIpIHsKLSAgICAgICAgbU1hc3RlclJlc3VsdFJlcG9ydGVyID0gbWFzdGVyUmVzdWx0UmVwb3J0ZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGludm9jYXRpb25TdGFydGVkKElJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIElCdWlsZEluZm8gcHJpbWFyeUJ1aWxkID0gY29udGV4dC5nZXRCdWlsZEluZm9zKCkuZ2V0KDApOwotICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgewotICAgICAgICAgICAgaWYgKG1CdWlsZEhlbHBlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkSGVscGVyID0gbmV3IENvbXBhdGliaWxpdHlCdWlsZEhlbHBlcihwcmltYXJ5QnVpbGQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1EZXZpY2VTZXJpYWwgPT0gbnVsbCAmJiBwcmltYXJ5QnVpbGQuZ2V0RGV2aWNlU2VyaWFsKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1EZXZpY2VTZXJpYWwgPSBwcmltYXJ5QnVpbGQuZ2V0RGV2aWNlU2VyaWFsKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ2FuTWFya0RvbmUgPSBjYW5NYXJrRG9uZShtQnVpbGRIZWxwZXIuZ2V0UmVjZW50Q29tbWFuZExpbmVBcmdzKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlzU2hhcmRSZXN1bHRSZXBvcnRlcigpKSB7Ci0gICAgICAgICAgICAvLyBTaGFyZCBSZXN1bHRSZXBvcnRlcnMgZm9yd2FyZCBpbnZvY2F0aW9uU3RhcnRlZCB0byB0aGUgbU1hc3RlclJlc3VsdFJlcG9ydGVyCi0gICAgICAgICAgICBtTWFzdGVyUmVzdWx0UmVwb3J0ZXIuaW52b2NhdGlvblN0YXJ0ZWQoY29udGV4dCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBOT1RFOiBFdmVyeXRoaW5nIGFmdGVyIHRoaXMgbGluZSBvbmx5IGFwcGxpZXMgdG8gdGhlIG1hc3RlciBSZXN1bHRSZXBvcnRlci4KLQotICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgewotICAgICAgICAgICAgaWYgKHByaW1hcnlCdWlsZC5nZXREZXZpY2VTZXJpYWwoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIG1hc3RlciBSZXN1bHRSZXBvcnRlciBjb2xsZWN0cyBhbGwgZGV2aWNlIHNlcmlhbHMgYmVpbmcgdXNlZAotICAgICAgICAgICAgICAgIC8vIGZvciB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbi4KLSAgICAgICAgICAgICAgICBtTWFzdGVyRGV2aWNlU2VyaWFscy5hZGQocHJpbWFyeUJ1aWxkLmdldERldmljZVNlcmlhbCgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVGhlIG1hc3RlciBSZXN1bHRSZXBvcnRlciBjb2xsZWN0cyBhbGwgYnVpbGRJbmZvcy4KLSAgICAgICAgICAgIG1NYXN0ZXJCdWlsZEluZm9zLmFkZChwcmltYXJ5QnVpbGQpOwotCi0gICAgICAgICAgICBpZiAobVJlc3VsdERpciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gRm9yIHRoZSBub24tc2hhcmRpbmcgY2FzZSwgaW52b2NhdGlvblN0YXJ0ZWQgaXMgb25seSBjYWxsZWQgb25jZSwKLSAgICAgICAgICAgICAgICAvLyBidXQgZm9yIHRoZSBzaGFyZGluZyBjYXNlLCB0aGlzIG1pZ2h0IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4KLSAgICAgICAgICAgICAgICAvLyBMb2dpYyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIHJlc3VsdCBkaXJlY3Rvcnkgc2hvdWxkIG5vdCBiZQotICAgICAgICAgICAgICAgIC8vIGludm9rZWQgdHdpY2UgZHVyaW5nIHRoZSBzYW1lIGludm9jYXRpb24uCi0gICAgICAgICAgICAgICAgaW5pdGlhbGl6ZVJlc3VsdERpcmVjdG9yaWVzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgZGlyZWN0b3J5IHN0cnVjdHVyZSB3aGVyZSByZXN1bHRzIGFuZCBsb2dzIHdpbGwgYmUgd3JpdHRlbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVJlc3VsdERpcmVjdG9yaWVzKCkgewotICAgICAgICBkZWJ1ZygiSW5pdGlhbGl6aW5nIHJlc3VsdCBkaXJlY3RvcnkiKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcmVzdWx0IGRpcmVjdG9yeS4gRWl0aGVyIGEgbmV3IGRpcmVjdG9yeSBvciByZXVzaW5nCi0gICAgICAgICAgICAvLyBhbiBleGlzdGluZyBzZXNzaW9uLgotICAgICAgICAgICAgaWYgKG1SZXRyeVNlc3Npb25JZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gT3ZlcndyaXRlIHRoZSBtUmVzdWx0IHdpdGggdGhlIHRlc3QgcmVzdWx0cyBvZiB0aGUgcHJldmlvdXMgc2Vzc2lvbgotICAgICAgICAgICAgICAgIG1SZXN1bHQgPSBSZXN1bHRIYW5kbGVyLmZpbmRSZXN1bHQobUJ1aWxkSGVscGVyLmdldFJlc3VsdHNEaXIoKSwgbVJldHJ5U2Vzc2lvbklkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1SZXN1bHQuc2V0U3RhcnRUaW1lKG1CdWlsZEhlbHBlci5nZXRTdGFydFRpbWUoKSk7Ci0gICAgICAgICAgICBtUmVzdWx0RGlyID0gbUJ1aWxkSGVscGVyLmdldFJlc3VsdERpcigpOwotICAgICAgICAgICAgaWYgKG1SZXN1bHREaXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1SZXN1bHREaXIubWtkaXJzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtUmVzdWx0RGlyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJSZXN1bHQgRGlyZWN0b3J5IHdhcyBub3QgY3JlYXRlZCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghbVJlc3VsdERpci5leGlzdHMoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlJlc3VsdCBEaXJlY3Rvcnkgd2FzIG5vdCBjcmVhdGVkOiAiICsKLSAgICAgICAgICAgICAgICAgICAgbVJlc3VsdERpci5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWJ1ZygiUmVzdWx0cyBEaXJlY3Rvcnk6ICIgKyBtUmVzdWx0RGlyLmdldEFic29sdXRlUGF0aCgpKTsKLQotICAgICAgICBtVXBsb2FkZXIgPSBuZXcgUmVzdWx0VXBsb2FkZXIobVJlc3VsdFNlcnZlciwgbUJ1aWxkSGVscGVyLmdldFN1aXRlTmFtZSgpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1Mb2dEaXIgPSBuZXcgRmlsZShtQnVpbGRIZWxwZXIuZ2V0TG9nc0RpcigpLAotICAgICAgICAgICAgICAgICAgICBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIuZ2V0RGlyU3VmZml4KG1CdWlsZEhlbHBlci5nZXRTdGFydFRpbWUoKSkpOwotICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgQ0xvZy5lKGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtTG9nRGlyICE9IG51bGwgJiYgbUxvZ0Rpci5ta2RpcnMoKSkgewotICAgICAgICAgICAgZGVidWcoIkNyZWF0ZWQgbG9nIGRpciAlcyIsIG1Mb2dEaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtTG9nRGlyID09IG51bGwgfHwgIW1Mb2dEaXIuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiQ291bGQgbm90IGNyZWF0ZSBsb2cgZGlyICVzIiwKLSAgICAgICAgICAgICAgICAgICAgbUxvZ0Rpci5nZXRBYnNvbHV0ZVBhdGgoKSkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtVGVzdExvZ1NhdmVyID09IG51bGwpIHsKLSAgICAgICAgICAgIG1UZXN0TG9nU2F2ZXIgPSBuZXcgTG9nRmlsZVNhdmVyKG1Mb2dEaXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHRlc3RSdW5TdGFydGVkKFN0cmluZyBpZCwgaW50IG51bVRlc3RzKSB7Ci0gICAgICAgIGlmIChtQ3VycmVudE1vZHVsZVJlc3VsdCAhPSBudWxsICYmIG1DdXJyZW50TW9kdWxlUmVzdWx0LmdldElkKCkuZXF1YWxzKGlkKQotICAgICAgICAgICAgICAgICYmIG1DdXJyZW50TW9kdWxlUmVzdWx0LmlzRG9uZSgpKSB7Ci0gICAgICAgICAgICAvLyBNb2R1bGVzIHJ1biB3aXRoIEphckhvc3RUZXN0IHRyZWF0IGVhY2ggdGVzdCBjbGFzcyBhcyBhIHNlcGFyYXRlIG1vZHVsZSwKLSAgICAgICAgICAgIC8vIHJlc3VsdGluZyBpbiBhZGRpdGlvbmFsIHVuZXhwZWN0ZWQgdGVzdCBydW5zLgotICAgICAgICAgICAgLy8gVGhpcyBjYXNlIGV4aXN0cyBvbmx5IGZvciBOCi0gICAgICAgICAgICBtVG90YWxUZXN0c0luTW9kdWxlICs9IG51bVRlc3RzOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gSGFuZGxlIG5vbi1KYXJIb3N0VGVzdCBjYXNlCi0gICAgICAgICAgICBtQ3VycmVudE1vZHVsZVJlc3VsdCA9IG1SZXN1bHQuZ2V0T3JDcmVhdGVNb2R1bGUoaWQpOwotICAgICAgICAgICAgbU1vZHVsZVdhc0RvbmUgPSBtQ3VycmVudE1vZHVsZVJlc3VsdC5pc0RvbmUoKTsKLSAgICAgICAgICAgIG1UZXN0UnVuRmFpbGVkID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAoIW1Nb2R1bGVXYXNEb25lKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2Ugb25seSB3YW50IHRvIHVwZGF0ZSB0ZXN0UnVuIHZhcmlhYmxlcyBpZiB0aGUgSU1vZHVsZVJlc3VsdCBpcyBub3QgeWV0IGRvbmUKLSAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UgbGVhdmUgdGVzdFJ1biB2YXJpYWJsZXMgYWxvbmUgc28gaXNEb25lIGV2YWx1YXRlcyB0byB0cnVlLgotICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudE1vZHVsZVJlc3VsdC5nZXRFeHBlY3RlZFRlc3RSdW5zKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudE1vZHVsZVJlc3VsdC5zZXRFeHBlY3RlZFRlc3RSdW5zKFRlc3RSdW5IYW5kbGVyLmdldFRlc3RSdW5zKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CdWlsZEhlbHBlciwgbUN1cnJlbnRNb2R1bGVSZXN1bHQuZ2V0SWQoKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQ3VycmVudE1vZHVsZVJlc3VsdC5hZGRUZXN0UnVuKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBSZXNldCBjb3VudGVycwotICAgICAgICAgICAgbVRvdGFsVGVzdHNJbk1vZHVsZSA9IG51bVRlc3RzOwotICAgICAgICAgICAgbUN1cnJlbnRUZXN0TnVtID0gMDsKLSAgICAgICAgfQotICAgICAgICBtQ3VycmVudE1vZHVsZVJlc3VsdC5pblByb2dyZXNzKHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhcnRlZChUZXN0SWRlbnRpZmllciB0ZXN0KSB7Ci0gICAgICAgIG1DdXJyZW50Q2FzZVJlc3VsdCA9IG1DdXJyZW50TW9kdWxlUmVzdWx0LmdldE9yQ3JlYXRlUmVzdWx0KHRlc3QuZ2V0Q2xhc3NOYW1lKCkpOwotICAgICAgICBtQ3VycmVudFJlc3VsdCA9IG1DdXJyZW50Q2FzZVJlc3VsdC5nZXRPckNyZWF0ZVJlc3VsdCh0ZXN0LmdldFRlc3ROYW1lKCkudHJpbSgpKTsKLSAgICAgICAgaWYgKG1DdXJyZW50UmVzdWx0LmlzUmV0cnkoKSkgewotICAgICAgICAgICAgbUN1cnJlbnRSZXN1bHQucmVzZXQoKTsgLy8gY2xlYXIgcmVzdWx0IHN0YXR1cyBmb3IgdGhpcyBpbnZvY2F0aW9uCi0gICAgICAgIH0KLSAgICAgICAgbUN1cnJlbnRUZXN0TnVtKys7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbmRlZChUZXN0SWRlbnRpZmllciB0ZXN0LCBNYXA8U3RyaW5nLCBTdHJpbmc+IG1ldHJpY3MpIHsKLSAgICAgICAgaWYgKG1DdXJyZW50UmVzdWx0LmdldFJlc3VsdFN0YXR1cygpID09IFRlc3RTdGF0dXMuRkFJTCkgewotICAgICAgICAgICAgLy8gVGVzdCBoYXMgcHJldmlvdXNseSBmYWlsZWQuCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZGV2aWNlIHRlc3QgY2FuIGhhdmUgcGVyZm9ybWFuY2UgcmVzdWx0cyBpbiB0ZXN0IG1ldHJpY3MKLSAgICAgICAgU3RyaW5nIHBlcmZSZXN1bHQgPSBtZXRyaWNzLmdldChSRVNVTFRfS0VZKTsKLSAgICAgICAgUmVwb3J0TG9nIHJlcG9ydCA9IG51bGw7Ci0gICAgICAgIGlmIChwZXJmUmVzdWx0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmVwb3J0ID0gUmVwb3J0TG9nLnBhcnNlKHBlcmZSZXN1bHQpOwotICAgICAgICAgICAgfSBjYXRjaCAoWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB8IElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gaG9zdCB0ZXN0IHNob3VsZCBiZSBjaGVja2VkIGludG8gTWV0cmljc1N0b3JlLgotICAgICAgICAgICAgcmVwb3J0ID0gTWV0cmljc1N0b3JlLnJlbW92ZVJlc3VsdChtQnVpbGRIZWxwZXIuZ2V0QnVpbGRJbmZvKCksCi0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50TW9kdWxlUmVzdWx0LmdldEFiaSgpLCB0ZXN0LnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtQ3VycmVudFJlc3VsdC5nZXRSZXN1bHRTdGF0dXMoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBPbmx5IGNsYWltIHRoYXQgd2UgcGFzc2VkIHdoZW4gd2UncmUgY2VydGFpbiBvdXIgcmVzdWx0IHdhcwotICAgICAgICAgICAgLy8gbm90IGFueSBvdGhlciBzdGF0ZS4KLSAgICAgICAgICAgIG1DdXJyZW50UmVzdWx0LnBhc3NlZChyZXBvcnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHRlc3RJZ25vcmVkKFRlc3RJZGVudGlmaWVyIHRlc3QpIHsKLSAgICAgICAgbUN1cnJlbnRSZXN1bHQuc2tpcHBlZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmFpbGVkKFRlc3RJZGVudGlmaWVyIHRlc3QsIFN0cmluZyB0cmFjZSkgewotICAgICAgICBtQ3VycmVudFJlc3VsdC5mYWlsZWQodHJhY2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXNzdW1wdGlvbkZhaWx1cmUoVGVzdElkZW50aWZpZXIgdGVzdCwgU3RyaW5nIHRyYWNlKSB7Ci0gICAgICAgIG1DdXJyZW50UmVzdWx0LnNraXBwZWQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdGVzdFJ1blN0b3BwZWQobG9uZyBlbGFwc2VkVGltZSkgewotICAgICAgICAvLyBpZ25vcmUKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdGVzdFJ1bkVuZGVkKGxvbmcgZWxhcHNlZFRpbWUsIE1hcDxTdHJpbmcsIFN0cmluZz4gbWV0cmljcykgewotICAgICAgICBtQ3VycmVudE1vZHVsZVJlc3VsdC5pblByb2dyZXNzKGZhbHNlKTsKLSAgICAgICAgbUN1cnJlbnRNb2R1bGVSZXN1bHQuYWRkUnVudGltZShlbGFwc2VkVGltZSk7Ci0gICAgICAgIGlmICghbU1vZHVsZVdhc0RvbmUgJiYgbUNhbk1hcmtEb25lKSB7Ci0gICAgICAgICAgICBpZiAobVRlc3RSdW5GYWlsZWQpIHsKLSAgICAgICAgICAgICAgICAvLyBzZXQgZG9uZSB0byBmYWxzZSBmb3IgdGVzdCBydW4gZmFpbHVyZXMKLSAgICAgICAgICAgICAgICBtQ3VycmVudE1vZHVsZVJlc3VsdC5zZXREb25lKGZhbHNlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gT25seSBtYXJrIG1vZHVsZSBkb25lIGlmOgotICAgICAgICAgICAgICAgIC8vIC0gc3RhdHVzIG9mIHRoZSBpbnZvY2F0aW9uIGFsbG93cyBpdCAobUNhbk1hcmtEb25lKSwgYW5kCi0gICAgICAgICAgICAgICAgLy8gLSBtb2R1bGUgaGFzIG5vdCBhbHJlYWR5IGJlZW4gbWFya2VkIGRvbmUsIGFuZAotICAgICAgICAgICAgICAgIC8vIC0gbm8gdGVzdCBydW4gZmFpbHVyZSBoYXMgYmVlbiBkZXRlY3RlZAotICAgICAgICAgICAgICAgIG1DdXJyZW50TW9kdWxlUmVzdWx0LnNldERvbmUobUN1cnJlbnRUZXN0TnVtID49IG1Ub3RhbFRlc3RzSW5Nb2R1bGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChpc1NoYXJkUmVzdWx0UmVwb3J0ZXIoKSkgewotICAgICAgICAgICAgLy8gRm9yd2FyZCBtb2R1bGUgcmVzdWx0cyB0byB0aGUgbWFzdGVyLgotICAgICAgICAgICAgbU1hc3RlclJlc3VsdFJlcG9ydGVyLm1lcmdlTW9kdWxlUmVzdWx0KG1DdXJyZW50TW9kdWxlUmVzdWx0KTsKLSAgICAgICAgICAgIG1DdXJyZW50TW9kdWxlUmVzdWx0LnJlc2V0VGVzdFJ1bnMoKTsKLSAgICAgICAgICAgIG1DdXJyZW50TW9kdWxlUmVzdWx0LnJlc2V0UnVudGltZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGlyZWN0bHkgYWRkIGEgbW9kdWxlIHJlc3VsdC4gTm90ZTogdGhpcyBtZXRob2QgaXMgbWVhbnQgdG8gYmUgdXNlZCBieQotICAgICAqIGEgc2hhcmQgUmVzdWx0UmVwb3J0ZXIuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIG1lcmdlTW9kdWxlUmVzdWx0KElNb2R1bGVSZXN1bHQgbW9kdWxlUmVzdWx0KSB7Ci0gICAgICAgIC8vIFRoaXMgbWVyZ2VzIHRoZSByZXN1bHRzIGluIG1vZHVsZVJlc3VsdCB0byBhbnkgZXhpc3RpbmcgcmVzdWx0cyBhbHJlYWR5Ci0gICAgICAgIC8vIGNvbnRhaW5lZCBpbiBtUmVzdWx0LiBUaGlzIGlzIHVzZWZ1bCBmb3IgcmV0cmllcyBhbmQgYWxsb3dzIHRoZSBmaW5hbAotICAgICAgICAvLyByZXBvcnQgZnJvbSBhIHJldHJ5IHRvIGNvbnRhaW4gYWxsIHRlc3QgcmVzdWx0cy4KLSAgICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsKLSAgICAgICAgICAgIG1SZXN1bHQubWVyZ2VNb2R1bGVSZXN1bHQobW9kdWxlUmVzdWx0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UnVuRmFpbGVkKFN0cmluZyBlcnJvck1lc3NhZ2UpIHsKLSAgICAgICAgbVRlc3RSdW5GYWlsZWQgPSB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVGVzdFN1bW1hcnkgZ2V0U3VtbWFyeSgpIHsKLSAgICAgICAgLy8gaWdub3JlCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwdXRTdW1tYXJ5KExpc3Q8VGVzdFN1bW1hcnk+IHN1bW1hcmllcykgewotICAgICAgICAvLyBUaGlzIGlzIHNhZmUgdG8gYmUgaW52b2tlZCBvbiBlaXRoZXIgdGhlIG1hc3RlciBvciBhIHNoYXJkIFJlc3VsdFJlcG9ydGVyLAotICAgICAgICAvLyBidXQgdGhlIHZhbHVlIGFkZGVkIHRvIHRoZSByZXBvcnQgd2lsbCBiZSB0aGF0IG9mIHRoZSBtYXN0ZXIgUmVzdWx0UmVwb3J0ZXIuCi0gICAgICAgIGlmIChzdW1tYXJpZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgbVJlZmVyZW5jZVVybCA9IHN1bW1hcmllcy5nZXQoMCkuZ2V0U3VtbWFyeSgpLmdldFN0cmluZygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGludm9jYXRpb25FbmRlZChsb25nIGVsYXBzZWRUaW1lKSB7Ci0gICAgICAgIGlmIChpc1NoYXJkUmVzdWx0UmVwb3J0ZXIoKSkgewotICAgICAgICAgICAgLy8gU2hhcmQgUmVzdWx0UmVwb3J0ZXJzIHJlcG9ydAotICAgICAgICAgICAgbU1hc3RlclJlc3VsdFJlcG9ydGVyLmludm9jYXRpb25FbmRlZChlbGFwc2VkVGltZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBOT1RFOiBFdmVyeXRoaW5nIGFmdGVyIHRoaXMgbGluZSBvbmx5IGFwcGxpZXMgdG8gdGhlIG1hc3RlciBSZXN1bHRSZXBvcnRlci4KLQotICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgewotICAgICAgICAgICAgLy8gVGhlIG1hc3RlciBSZXN1bHRSZXBvcnRlciB0cmFja3MgdGhlIHByb2dyZXNzIG9mIGFsbCBpbnZvY2F0aW9ucyBhY3Jvc3MKLSAgICAgICAgICAgIC8vIHNoYXJkIFJlc3VsdFJlcG9ydGVycy4gV3JpdGluZyByZXN1bHRzIHNob3VsZCBub3QgcHJvY2VlZCB1bnRpbCBhbGwKLSAgICAgICAgICAgIC8vIFJlc3VsdFJlcG9ydGVycyBoYXZlIGNvbXBsZXRlZC4KLSAgICAgICAgICAgIGlmICgrK2ludm9jYXRpb25FbmRlZENvdW50IDwgbU1hc3RlckJ1aWxkSW5mb3Muc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUVsYXBzZWRUaW1lID0gZWxhcHNlZFRpbWU7Ci0gICAgICAgICAgICBmaW5hbGl6ZVJlc3VsdHMoKTsKLSAgICAgICAgICAgIG1GaW5hbGl6ZWQuY291bnREb3duKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZmluYWxpemVSZXN1bHRzKCkgewotICAgICAgICAvLyBBZGQgYWxsIGRldmljZSBzZXJpYWxzIGludG8gdGhlIHJlc3VsdCB0byBiZSBzZXJpYWxpemVkCi0gICAgICAgIGZvciAoU3RyaW5nIGRldmljZVNlcmlhbCA6IG1NYXN0ZXJEZXZpY2VTZXJpYWxzKSB7Ci0gICAgICAgICAgICBtUmVzdWx0LmFkZERldmljZVNlcmlhbChkZXZpY2VTZXJpYWwpOwotICAgICAgICB9Ci0KLSAgICAgICAgYWRkRGV2aWNlQnVpbGRJbmZvVG9SZXN1bHQoKTsKLQotICAgICAgICBTZXQ8U3RyaW5nPiBhbGxFeHBlY3RlZE1vZHVsZXMgPSBuZXcgSGFzaFNldDw+KCk7Ci0gICAgICAgIGZvciAoSUJ1aWxkSW5mbyBidWlsZEluZm8gOiBtTWFzdGVyQnVpbGRJbmZvcykgewotICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IGVudHJ5IDogYnVpbGRJbmZvLmdldEJ1aWxkQXR0cmlidXRlcygpLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBpZiAoa2V5LmVxdWFscyhDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIuTU9EVUxFX0lEUykgJiYgdmFsdWUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLmFkZEFsbChhbGxFeHBlY3RlZE1vZHVsZXMsIHZhbHVlLnNwbGl0KCIsIikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEluY2x1ZGUgYSByZWNvcmQgaW4gdGhlIHJlcG9ydCBvZiBhbGwgZXhwZWN0ZWQgbW9kdWxlcyBpZHMsIGV2ZW4gaWYgdGhleSB3ZXJlbid0Ci0gICAgICAgIC8vIGV4ZWN1dGVkLgotICAgICAgICBmb3IgKFN0cmluZyBtb2R1bGVJZCA6IGFsbEV4cGVjdGVkTW9kdWxlcykgewotICAgICAgICAgICAgbVJlc3VsdC5nZXRPckNyZWF0ZU1vZHVsZShtb2R1bGVJZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgbW9kdWxlUHJvZ3Jlc3MgPSBTdHJpbmcuZm9ybWF0KCIlZCBvZiAlZCIsCi0gICAgICAgICAgICAgICAgbVJlc3VsdC5nZXRNb2R1bGVDb21wbGV0ZUNvdW50KCksIG1SZXN1bHQuZ2V0TW9kdWxlcygpLnNpemUoKSk7Ci0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gWmlwIHRoZSBmdWxsIHRlc3QgcmVzdWx0cyBkaXJlY3RvcnkuCi0gICAgICAgICAgICBjb3B5RHluYW1pY0NvbmZpZ0ZpbGVzKCk7Ci0gICAgICAgICAgICBjb3B5Rm9ybWF0dGluZ0ZpbGVzKG1SZXN1bHREaXIsIG1CdWlsZEhlbHBlci5nZXRTdWl0ZU5hbWUoKSk7Ci0KLSAgICAgICAgICAgIEZpbGUgcmVzdWx0RmlsZSA9IGdlbmVyYXRlUmVzdWx0WG1sRmlsZSgpOwotICAgICAgICAgICAgaWYgKG1SZXRyeVNlc3Npb25JZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29weVJldHJ5RmlsZXMoUmVzdWx0SGFuZGxlci5nZXRSZXN1bHREaXJlY3RvcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICBtQnVpbGRIZWxwZXIuZ2V0UmVzdWx0c0RpcigpLCBtUmV0cnlTZXNzaW9uSWQpLCBtUmVzdWx0RGlyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZpbGUgemlwcGVkUmVzdWx0cyA9IHppcFJlc3VsdHMobVJlc3VsdERpcik7Ci0gICAgICAgICAgICAvLyBDcmVhdGUgZmFpbHVyZSByZXBvcnQgYWZ0ZXIgemlwIGZpbGUgc28gZXh0cmEgZGF0YSBpcyBub3QgdXBsb2FkZWQKLSAgICAgICAgICAgIEZpbGUgZmFpbHVyZVJlcG9ydCA9IFJlc3VsdEhhbmRsZXIuY3JlYXRlRmFpbHVyZVJlcG9ydChyZXN1bHRGaWxlKTsKLSAgICAgICAgICAgIGlmIChmYWlsdXJlUmVwb3J0LmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgaW5mbygiVGVzdCBSZXN1bHQ6ICVzIiwgZmFpbHVyZVJlcG9ydC5nZXRDYW5vbmljYWxQYXRoKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbmZvKCJUZXN0IFJlc3VsdDogJXMiLCByZXN1bHRGaWxlLmdldENhbm9uaWNhbFBhdGgoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbmZvKCJUZXN0IExvZ3M6ICVzIiwgbUxvZ0Rpci5nZXRDYW5vbmljYWxQYXRoKCkpOwotICAgICAgICAgICAgZGVidWcoIkZ1bGwgUmVzdWx0OiAlcyIsIHppcHBlZFJlc3VsdHMuZ2V0Q2Fub25pY2FsUGF0aCgpKTsKLQotICAgICAgICAgICAgc2F2ZUxvZyhyZXN1bHRGaWxlLCB6aXBwZWRSZXN1bHRzKTsKLQotICAgICAgICAgICAgdXBsb2FkUmVzdWx0KHJlc3VsdEZpbGUpOwotCi0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIHwgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBDTG9nLmUoIlslc10gRXhjZXB0aW9uIHdoaWxlIHNhdmluZyByZXN1bHQgWE1MLiIsIG1EZXZpY2VTZXJpYWwpOwotICAgICAgICAgICAgQ0xvZy5lKGUpOwotICAgICAgICB9Ci0gICAgICAgIC8vIHByaW50IHRoZSBydW4gcmVzdWx0cyBsYXN0LgotICAgICAgICBpbmZvKCJJbnZvY2F0aW9uIGZpbmlzaGVkIGluICVzLiBQQVNTRUQ6ICVkLCBGQUlMRUQ6ICVkLCBNT0RVTEVTOiAlcyIsCi0gICAgICAgICAgICAgICAgVGltZVV0aWwuZm9ybWF0RWxhcHNlZFRpbWUobUVsYXBzZWRUaW1lKSwKLSAgICAgICAgICAgICAgICBtUmVzdWx0LmNvdW50UmVzdWx0cyhUZXN0U3RhdHVzLlBBU1MpLAotICAgICAgICAgICAgICAgIG1SZXN1bHQuY291bnRSZXN1bHRzKFRlc3RTdGF0dXMuRkFJTCksCi0gICAgICAgICAgICAgICAgbW9kdWxlUHJvZ3Jlc3MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBpbnZvY2F0aW9uRmFpbGVkKFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICB3YXJuKCJJbnZvY2F0aW9uIGZhaWxlZDogJXMiLCBjYXVzZSk7Ci0gICAgICAgIEludm9jYXRpb25GYWlsdXJlSGFuZGxlci5zZXRGYWlsZWQobUJ1aWxkSGVscGVyLCBjYXVzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHRlc3RMb2coU3RyaW5nIG5hbWUsIExvZ0RhdGFUeXBlIHR5cGUsIElucHV0U3RyZWFtU291cmNlIHN0cmVhbSkgewotICAgICAgICAvLyBUaGlzIGlzIHNhZmUgdG8gYmUgaW52b2tlZCBvbiBlaXRoZXIgdGhlIG1hc3RlciBvciBhIHNoYXJkIFJlc3VsdFJlcG9ydGVyCi0gICAgICAgIGlmIChpc1NoYXJkUmVzdWx0UmVwb3J0ZXIoKSkgewotICAgICAgICAgICAgLy8gU2hhcmQgUmVzdWx0UmVwb3J0ZXJzIGZvcndhcmQgdGVzdExvZyB0byB0aGUgbU1hc3RlclJlc3VsdFJlcG9ydGVyCi0gICAgICAgICAgICBtTWFzdGVyUmVzdWx0UmVwb3J0ZXIudGVzdExvZyhuYW1lLCB0eXBlLCBzdHJlYW0pOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuYW1lLmVuZHNXaXRoKERldmljZUluZm8uRklMRV9TVUZGSVgpKSB7Ci0gICAgICAgICAgICAvLyBIYW5kbGUgZGV2aWNlIGluZm8gZmlsZSBjYXNlCi0gICAgICAgICAgICB0ZXN0TG9nRGV2aWNlSW5mbyhuYW1lLCBzdHJlYW0pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gSGFuZGxlIGRlZmF1bHQgY2FzZQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBGaWxlIGxvZ0ZpbGUgPSBudWxsOwotICAgICAgICAgICAgICAgIGlmIChtQ29tcHJlc3NMb2dzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBzdHJlYW0uY3JlYXRlSW5wdXRTdHJlYW0oKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nRmlsZSA9IG1UZXN0TG9nU2F2ZXIuc2F2ZUFuZEdaaXBMb2dEYXRhKG5hbWUsIHR5cGUsIGlucHV0U3RyZWFtKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBzdHJlYW0uY3JlYXRlSW5wdXRTdHJlYW0oKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nRmlsZSA9IG1UZXN0TG9nU2F2ZXIuc2F2ZUxvZ0RhdGEobmFtZSwgdHlwZSwgaW5wdXRTdHJlYW0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlYnVnKCJTYXZlZCBsb2dzIGZvciAlcyBpbiAlcyIsIG5hbWUsIGxvZ0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHdhcm4oIkZhaWxlZCB0byB3cml0ZSBsb2cgZm9yICVzIiwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgQ0xvZy5lKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogV3JpdGUgZGV2aWNlLWluZm8gZmlsZXMgdG8gdGhlIHJlc3VsdCwgaW52b2tlZCBvbmx5IGJ5IHRoZSBtYXN0ZXIgcmVzdWx0IHJlcG9ydGVyICovCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RMb2dEZXZpY2VJbmZvKFN0cmluZyBuYW1lLCBJbnB1dFN0cmVhbVNvdXJjZSBzdHJlYW0pIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEZpbGUgZWRpRGlyID0gbmV3IEZpbGUobVJlc3VsdERpciwgRGV2aWNlSW5mby5SRVNVTFRfRElSX05BTUUpOwotICAgICAgICAgICAgZWRpRGlyLm1rZGlycygpOwotICAgICAgICAgICAgRmlsZSBlZGlGaWxlID0gbmV3IEZpbGUoZWRpRGlyLCBuYW1lKTsKLSAgICAgICAgICAgIGlmICghZWRpRmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIC8vIG9ubHkgd3JpdGUgdGhpcyBmaWxlIHRvIHRoZSByZXN1bHRzIGlmIG5vdCBhbHJlYWR5IHByZXNlbnQKLSAgICAgICAgICAgICAgICBGaWxlVXRpbC53cml0ZVRvRmlsZShzdHJlYW0uY3JlYXRlSW5wdXRTdHJlYW0oKSwgZWRpRmlsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHdhcm4oIkZhaWxlZCB0byB3cml0ZSBkZXZpY2UgaW5mbyAlcyB0byByZXN1bHQiLCBuYW1lKTsKLSAgICAgICAgICAgIENMb2cuZShlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TG9nU2F2ZWQoU3RyaW5nIGRhdGFOYW1lLCBMb2dEYXRhVHlwZSBkYXRhVHlwZSwgSW5wdXRTdHJlYW1Tb3VyY2UgZGF0YVN0cmVhbSwKLSAgICAgICAgICAgIExvZ0ZpbGUgbG9nRmlsZSkgewotICAgICAgICAvLyBUaGlzIGlzIHNhZmUgdG8gYmUgaW52b2tlZCBvbiBlaXRoZXIgdGhlIG1hc3RlciBvciBhIHNoYXJkIFJlc3VsdFJlcG9ydGVyCi0gICAgICAgIGlmIChtSW5jbHVkZVRlc3RMb2dUYWdzICYmIG1DdXJyZW50UmVzdWx0ICE9IG51bGwKLSAgICAgICAgICAgICAgICAmJiBkYXRhTmFtZS5zdGFydHNXaXRoKG1DdXJyZW50UmVzdWx0LmdldEZ1bGxOYW1lKCkpKSB7Ci0KLSAgICAgICAgICAgIGlmIChkYXRhVHlwZSA9PSBMb2dEYXRhVHlwZS5CVUdSRVBPUlQpIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudFJlc3VsdC5zZXRCdWdSZXBvcnQobG9nRmlsZS5nZXRVcmwoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGFUeXBlID09IExvZ0RhdGFUeXBlLkxPR0NBVCkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50UmVzdWx0LnNldExvZyhsb2dGaWxlLmdldFVybCgpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YVR5cGUgPT0gTG9nRGF0YVR5cGUuUE5HKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRSZXN1bHQuc2V0U2NyZWVuc2hvdChsb2dGaWxlLmdldFVybCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRMb2dTYXZlcihJTG9nU2F2ZXIgc2F2ZXIpIHsKLSAgICAgICAgLy8gVGhpcyBpcyBzYWZlIHRvIGJlIGludm9rZWQgb24gZWl0aGVyIHRoZSBtYXN0ZXIgb3IgYSBzaGFyZCBSZXN1bHRSZXBvcnRlcgotICAgICAgICBtTG9nU2F2ZXIgPSBzYXZlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXaGVuIGVuYWJsZWQsIHNhdmUgbG9nIGRhdGEgdXNpbmcgbG9nIHNhdmVyCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNhdmVMb2coRmlsZSByZXN1bHRGaWxlLCBGaWxlIHppcHBlZFJlc3VsdHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghbVVzZUxvZ1NhdmVyKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbnVsbDsKLSAgICAgICAgTG9nRmlsZSBsb2dGaWxlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocmVzdWx0RmlsZSk7Ci0gICAgICAgICAgICBsb2dGaWxlID0gbUxvZ1NhdmVyLnNhdmVMb2dEYXRhKCJsb2ctcmVzdWx0IiwgTG9nRGF0YVR5cGUuWE1MLCBmaXMpOwotICAgICAgICAgICAgZGVidWcoIlJlc3VsdCBYTUwgVVJMOiAlcyIsIGxvZ0ZpbGUuZ2V0VXJsKCkpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgIENMb2cuZSgiWyVzXSBlcnJvciBzYXZpbmcgWE1MIHdpdGggbG9nIHNhdmVyIiwgbURldmljZVNlcmlhbCk7Ci0gICAgICAgICAgICBDTG9nLmUoaW9lKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIFN0cmVhbVV0aWwuY2xvc2UoZmlzKTsKLSAgICAgICAgfQotICAgICAgICAvLyBTYXZlIHRoZSBmdWxsIHJlc3VsdHMgZm9sZGVyLgotICAgICAgICBpZiAoemlwcGVkUmVzdWx0cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gemlwUmVzdWx0U3RyZWFtID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgemlwUmVzdWx0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbSh6aXBwZWRSZXN1bHRzKTsKLSAgICAgICAgICAgICAgICBsb2dGaWxlID0gbUxvZ1NhdmVyLnNhdmVMb2dEYXRhKCJyZXN1bHRzIiwgTG9nRGF0YVR5cGUuWklQLCB6aXBSZXN1bHRTdHJlYW0pOwotICAgICAgICAgICAgICAgIGRlYnVnKCJSZXN1bHQgemlwIFVSTDogJXMiLCBsb2dGaWxlLmdldFVybCgpKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgU3RyZWFtVXRpbC5jbG9zZSh6aXBSZXN1bHRTdHJlYW0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBwYXRoIGluIHdoaWNoIGxvZyBzYXZlciBwZXJzaXN0cyBsb2cgZmlsZXMgb3IgbnVsbCBpZgotICAgICAqIGxvZ1NhdmVyIGlzIG5vdCBlbmFibGVkLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGdldExvZ1VybCgpIHsKLSAgICAgICAgaWYgKCFtVXNlTG9nU2F2ZXIgfHwgbUxvZ1NhdmVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1Mb2dTYXZlci5nZXRMb2dSZXBvcnREaXIoKS5nZXRVcmwoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVNoYXJkYWJsZUxpc3RlbmVyIGNsb25lKCkgewotICAgICAgICBSZXN1bHRSZXBvcnRlciBjbG9uZSA9IG5ldyBSZXN1bHRSZXBvcnRlcih0aGlzKTsKLSAgICAgICAgT3B0aW9uQ29waWVyLmNvcHlPcHRpb25zTm9UaHJvdyh0aGlzLCBjbG9uZSk7Ci0gICAgICAgIHJldHVybiBjbG9uZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgcmVzdWx0cyBmaWxlIGNvbXBhdGlibGUgd2l0aCBDVFN2MiAoeG1sKSByZXBvcnQgZm9ybWF0LgotICAgICAqLwotICAgIHByb3RlY3RlZCBGaWxlIGdlbmVyYXRlUmVzdWx0WG1sRmlsZSgpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gUmVzdWx0SGFuZGxlci53cml0ZVJlc3VsdHMobUJ1aWxkSGVscGVyLmdldFN1aXRlTmFtZSgpLAotICAgICAgICAgICAgICAgIG1CdWlsZEhlbHBlci5nZXRTdWl0ZVZlcnNpb24oKSwgbUJ1aWxkSGVscGVyLmdldFN1aXRlUGxhbigpLAotICAgICAgICAgICAgICAgIG1CdWlsZEhlbHBlci5nZXRTdWl0ZUJ1aWxkKCksIG1SZXN1bHQsIG1SZXN1bHREaXIsIG1SZXN1bHQuZ2V0U3RhcnRUaW1lKCksCi0gICAgICAgICAgICAgICAgbUVsYXBzZWRUaW1lICsgbVJlc3VsdC5nZXRTdGFydFRpbWUoKSwgbVJlZmVyZW5jZVVybCwgZ2V0TG9nVXJsKCksCi0gICAgICAgICAgICAgICAgbUJ1aWxkSGVscGVyLmdldENvbW1hbmRMaW5lQXJncygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYnVpbGQgaW5mbyBjb2xsZWN0ZWQgZnJvbSB0aGUgZGV2aWNlIGF0dHJpYnV0ZXMgdG8gdGhlIHJlc3VsdHMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkRGV2aWNlQnVpbGRJbmZvVG9SZXN1bHQoKSB7Ci0gICAgICAgIC8vIEFkZCBhbGwgYnVpbGQgaW5mbyB0byB0aGUgcmVzdWx0IHRvIGJlIHNlcmlhbGl6ZWQKLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBidWlsZFByb3BlcnRpZXMgPSBtYXBCdWlsZEluZm8oKTsKLSAgICAgICAgYWRkQnVpbGRJbmZvVG9SZXN1bHQoYnVpbGRQcm9wZXJ0aWVzLCBtUmVzdWx0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPdmVycmlkZSBzcGVjaWZpYyBidWlsZCBwcm9wZXJ0aWVzIHNvIHRoZSByZXBvcnQgd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGggdGhlCi0gICAgICogYnVpbGQgZmluZ2VycHJpbnQgYmVpbmcgY2VydGlmaWVkLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFkZERldmljZUJ1aWxkSW5mb1RvUmVzdWx0KFN0cmluZyBidWlsZEZpbmdlcnByaW50T3ZlcnJpZGUsCi0gICAgICAgICAgICBTdHJpbmcgbWFudWZhY3R1cmVPdmVycmlkZSwgU3RyaW5nIG1vZGVsT3ZlcnJpZGUpIHsKLQotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGJ1aWxkUHJvcGVydGllcyA9IG1hcEJ1aWxkSW5mbygpOwotCi0gICAgICAgIC8vIEV4dHJhY3QgYW5kIG92ZXJyaWRlIHZhbHVlcyBmcm9tIGJ1aWxkIGZpbmdlcnByaW50LgotICAgICAgICAvLyBCdWlsZCBmaW5nZXJwcmludCBmb3JtYXQ6IGJyYW5kL3Byb2R1Y3QvZGV2aWNlOnZlcnNpb24vYnVpbGRfaWQvdGFncwotICAgICAgICBTdHJpbmcgZmluZ2VycHJpbnRQcmVmaXggPSBidWlsZEZpbmdlcnByaW50T3ZlcnJpZGUuc3BsaXQoIjoiKVswXTsKLSAgICAgICAgU3RyaW5nIGZpbmdlcnByaW50VGFpbCA9IGJ1aWxkRmluZ2VycHJpbnRPdmVycmlkZS5zcGxpdCgiOiIpWzFdOwotICAgICAgICBTdHJpbmcgYnVpbGRJZE92ZXJyaWRlID0gZmluZ2VycHJpbnRUYWlsLnNwbGl0KCIvIilbMV07Ci0gICAgICAgIGJ1aWxkUHJvcGVydGllcy5wdXQoQlVJTERfSUQsIGJ1aWxkSWRPdmVycmlkZSk7Ci0gICAgICAgIFN0cmluZyBicmFuZE92ZXJyaWRlID0gZmluZ2VycHJpbnRQcmVmaXguc3BsaXQoIi8iKVswXTsKLSAgICAgICAgYnVpbGRQcm9wZXJ0aWVzLnB1dChCVUlMRF9CUkFORCwgYnJhbmRPdmVycmlkZSk7Ci0gICAgICAgIFN0cmluZyBkZXZpY2VPdmVycmlkZSA9IGZpbmdlcnByaW50UHJlZml4LnNwbGl0KCIvIilbMl07Ci0gICAgICAgIGJ1aWxkUHJvcGVydGllcy5wdXQoQlVJTERfREVWSUNFLCBkZXZpY2VPdmVycmlkZSk7Ci0gICAgICAgIFN0cmluZyBwcm9kdWN0T3ZlcnJpZGUgPSBmaW5nZXJwcmludFByZWZpeC5zcGxpdCgiLyIpWzFdOwotICAgICAgICBidWlsZFByb3BlcnRpZXMucHV0KEJVSUxEX1BST0RVQ1QsIHByb2R1Y3RPdmVycmlkZSk7Ci0gICAgICAgIFN0cmluZyB2ZXJzaW9uT3ZlcnJpZGUgPSBmaW5nZXJwcmludFRhaWwuc3BsaXQoIi8iKVswXTsKLSAgICAgICAgYnVpbGRQcm9wZXJ0aWVzLnB1dChCVUlMRF9WRVJTSU9OX1JFTEVBU0UsIHZlcnNpb25PdmVycmlkZSk7Ci0gICAgICAgIGJ1aWxkUHJvcGVydGllcy5wdXQoQlVJTERfRklOR0VSUFJJTlQsIGJ1aWxkRmluZ2VycHJpbnRPdmVycmlkZSk7Ci0gICAgICAgIGJ1aWxkUHJvcGVydGllcy5wdXQoQlVJTERfTUFOVUZBQ1RVUkVSLCBtYW51ZmFjdHVyZU92ZXJyaWRlKTsKLSAgICAgICAgYnVpbGRQcm9wZXJ0aWVzLnB1dChCVUlMRF9NT0RFTCwgbW9kZWxPdmVycmlkZSk7Ci0KLSAgICAgICAgLy8gQWRkIG1vZGlmaWVkIHZhbHVlcyB0byByZXN1bHRzLgotICAgICAgICBhZGRCdWlsZEluZm9Ub1Jlc3VsdChidWlsZFByb3BlcnRpZXMsIG1SZXN1bHQpOwotICAgICAgICBtUmVzdWx0LnNldEJ1aWxkRmluZ2VycHJpbnQoYnVpbGRGaW5nZXJwcmludE92ZXJyaWRlKTsKLSAgICB9Ci0gICAgLyoqIEFnZ3JlZ2F0ZSBidWlsZCBpbmZvIGZyb20gbWVtYmVyIGRldmljZSBpbmZvLiAqLwotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcEJ1aWxkSW5mbygpIHsKLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBidWlsZFByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgICAgIGZvciAoSUJ1aWxkSW5mbyBidWlsZEluZm8gOiBtTWFzdGVyQnVpbGRJbmZvcykgewotICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IGVudHJ5IDogYnVpbGRJbmZvLmdldEJ1aWxkQXR0cmlidXRlcygpLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoQlVJTERfSU5GTykpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRQcm9wZXJ0aWVzLnB1dChrZXkuc3Vic3RyaW5nKENUU19QUkVGSVgubGVuZ3RoKCkpLCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWlsZFByb3BlcnRpZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGJ1aWxkIGluZm8gdG8gcmVzdWx0cy4KLSAgICAgKiBAcGFyYW0gYnVpbGRQcm9wZXJ0aWVzIEJ1aWxkIGluZm8gdG8gYWRkLgotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBhZGRCdWlsZEluZm9Ub1Jlc3VsdChNYXA8U3RyaW5nLCBTdHJpbmc+IGJ1aWxkUHJvcGVydGllcywKLSAgICAgICAgICAgIElJbnZvY2F0aW9uUmVzdWx0IGludm9jYXRpb25SZXN1bHQpIHsKLSAgICAgICAgYnVpbGRQcm9wZXJ0aWVzLmVudHJ5U2V0KCkuc3RyZWFtKCkuZm9yRWFjaChlbnRyeSAtPgotICAgICAgICAgICAgICAgIGludm9jYXRpb25SZXN1bHQuYWRkSW52b2NhdGlvbkluZm8oZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGluc3RhbmNlIGlzIGEgc2hhcmQgUmVzdWx0UmVwb3J0ZXIgYW5kIHNob3VsZCBwcm9wYWdhdGUKLSAgICAgKiBjZXJ0YWluIGV2ZW50cyB0byB0aGUgbWFzdGVyLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc1NoYXJkUmVzdWx0UmVwb3J0ZXIoKSB7Ci0gICAgICAgIHJldHVybiBtTWFzdGVyUmVzdWx0UmVwb3J0ZXIgIT0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXaGVuIGVuYWJsZWQsIHVwbG9hZCB0aGUgcmVzdWx0IHRvIGEgc2VydmVyLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB1cGxvYWRSZXN1bHQoRmlsZSByZXN1bHRGaWxlKSB7Ci0gICAgICAgIGlmIChtUmVzdWx0U2VydmVyICE9IG51bGwgJiYgIW1SZXN1bHRTZXJ2ZXIudHJpbSgpLmlzRW1wdHkoKSAmJiAhbURpc2FibGVSZXN1bHRQb3N0aW5nKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGRlYnVnKCJSZXN1bHQgU2VydmVyOiAlZCIsIG1VcGxvYWRlci51cGxvYWRSZXN1bHQocmVzdWx0RmlsZSwgbVJlZmVyZW5jZVVybCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgQ0xvZy5lKCJbJXNdIElPRXhjZXB0aW9uIHdoaWxlIHVwbG9hZGluZyByZXN1bHQuIiwgbURldmljZVNlcmlhbCk7Ci0gICAgICAgICAgICAgICAgQ0xvZy5lKGlvZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgaXQgaXMgc2FmZSB0byBtYXJrIG1vZHVsZXMgYXMgImRvbmUiLCBnaXZlbiB0aGUgaW52b2NhdGlvbiBjb21tYW5kLWxpbmUKLSAgICAgKiBhcmd1bWVudHMuIFJldHVybnMgdHJ1ZSB1bmxlc3MgdGhpcyBpcyBhIHJldHJ5IGFuZCBzcGVjaWZpYyBmaWx0ZXJpbmcgdGVjaG5pcXVlcyBhcmUgYXBwbGllZAotICAgICAqIG9uIHRoZSBjb21tYW5kLWxpbmUsIHN1Y2ggYXM6Ci0gICAgICogICAtLXJldHJ5LXR5cGUgZmFpbGVkCi0gICAgICogICAtLWluY2x1ZGUtZmlsdGVyCi0gICAgICogICAtLWV4Y2x1ZGUtZmlsdGVyCi0gICAgICogICAtdC8tLXRlc3QKLSAgICAgKiAgIC0tc3VicGxhbgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBjYW5NYXJrRG9uZShTdHJpbmcgYXJncykgewotICAgICAgICBpZiAobVJldHJ5U2Vzc2lvbklkID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBhbHdheXMgYWxsb3cgbW9kdWxlcyB0byBiZSBtYXJrZWQgZG9uZSBpZiBub3QgcmV0cnkKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gIShSZXRyeVR5cGUuRkFJTEVELmVxdWFscyhtUmV0cnlUeXBlKQotICAgICAgICAgICAgICAgIHx8IFJldHJ5VHlwZS5DVVNUT00uZXF1YWxzKG1SZXRyeVR5cGUpCi0gICAgICAgICAgICAgICAgfHwgYXJncy5jb250YWlucyhDb21wYXRpYmlsaXR5VGVzdC5JTkNMVURFX0ZJTFRFUl9PUFRJT04pCi0gICAgICAgICAgICAgICAgfHwgYXJncy5jb250YWlucyhDb21wYXRpYmlsaXR5VGVzdC5FWENMVURFX0ZJTFRFUl9PUFRJT04pCi0gICAgICAgICAgICAgICAgfHwgYXJncy5jb250YWlucyhDb21wYXRpYmlsaXR5VGVzdC5TVUJQTEFOX09QVElPTikKLSAgICAgICAgICAgICAgICB8fCBhcmdzLm1hdGNoZXMoU3RyaW5nLmZvcm1hdCgiLiogKC0lc3wtLSVzKSAuKiIsCi0gICAgICAgICAgICAgICAgQ29tcGF0aWJpbGl0eVRlc3QuVEVTVF9PUFRJT05fU0hPUlRfTkFNRSwgQ29tcGF0aWJpbGl0eVRlc3QuVEVTVF9PUFRJT04pKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29weSB0aGUgeG1sIGZvcm1hdHRpbmcgZmlsZXMgc3RvcmVkIGluIHRoaXMgamFyIHRvIHRoZSByZXN1bHRzIGRpcmVjdG9yeQotICAgICAqCi0gICAgICogQHBhcmFtIHJlc3VsdHNEaXIKLSAgICAgKi8KLSAgICBzdGF0aWMgdm9pZCBjb3B5Rm9ybWF0dGluZ0ZpbGVzKEZpbGUgcmVzdWx0c0RpciwgU3RyaW5nIHN1aXRlTmFtZSkgewotICAgICAgICBmb3IgKFN0cmluZyByZXN1bHRGaWxlTmFtZSA6IFJlc3VsdEhhbmRsZXIuUkVTVUxUX1JFU09VUkNFUykgewotICAgICAgICAgICAgSW5wdXRTdHJlYW0gY29uZmlnU3RyZWFtID0gUmVzdWx0SGFuZGxlci5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCIvcmVwb3J0LyVzLSVzIiwgc3VpdGVOYW1lLCByZXN1bHRGaWxlTmFtZSkpOwotICAgICAgICAgICAgaWYgKGNvbmZpZ1N0cmVhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgc3VpdGUgc3BlY2lmaWMgZmlsZXMgYXJlIG5vdCBhdmFpbGFibGUsIGZhbGxiYWNrIHRvIGNvbW1vbi4KLSAgICAgICAgICAgICAgICBjb25maWdTdHJlYW0gPSBSZXN1bHRIYW5kbGVyLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIi9yZXBvcnQvJXMiLCByZXN1bHRGaWxlTmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNvbmZpZ1N0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgRmlsZSByZXN1bHRGaWxlID0gbmV3IEZpbGUocmVzdWx0c0RpciwgcmVzdWx0RmlsZU5hbWUpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGVVdGlsLndyaXRlVG9GaWxlKGNvbmZpZ1N0cmVhbSwgcmVzdWx0RmlsZSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB3YXJuKCJGYWlsZWQgdG8gd3JpdGUgJXMgdG8gZmlsZSIsIHJlc3VsdEZpbGVOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHdhcm4oIkZhaWxlZCB0byBsb2FkICVzIGZyb20gamFyIiwgcmVzdWx0RmlsZU5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogbW92ZSB0aGUgZHluYW1pYyBjb25maWcgZmlsZXMgdG8gdGhlIHJlc3VsdHMgZGlyZWN0b3J5Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNvcHlEeW5hbWljQ29uZmlnRmlsZXMoKSB7Ci0gICAgICAgIEZpbGUgY29uZmlnRGlyID0gbmV3IEZpbGUobVJlc3VsdERpciwgImNvbmZpZyIpOwotICAgICAgICBpZiAoIWNvbmZpZ0Rpci5ta2RpcigpKSB7Ci0gICAgICAgICAgICB3YXJuKCJGYWlsZWQgdG8gbWFrZSBkeW5hbWljIGNvbmZpZyBkaXJlY3RvcnkgXCIlc1wiIGluIHRoZSByZXN1bHQiLAotICAgICAgICAgICAgICAgICAgICBjb25maWdEaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgU2V0PFN0cmluZz4gdW5pcXVlTW9kdWxlcyA9IG5ldyBIYXNoU2V0PD4oKTsKLSAgICAgICAgZm9yIChJQnVpbGRJbmZvIGJ1aWxkSW5mbyA6IG1NYXN0ZXJCdWlsZEluZm9zKSB7Ci0gICAgICAgICAgICBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIgaGVscGVyID0gbmV3IENvbXBhdGliaWxpdHlCdWlsZEhlbHBlcihidWlsZEluZm8pOwotICAgICAgICAgICAgTWFwPFN0cmluZywgRmlsZT4gZGNGaWxlcyA9IGhlbHBlci5nZXREeW5hbWljQ29uZmlnRmlsZXMoKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIG1vZHVsZU5hbWUgOiBkY0ZpbGVzLmtleVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgRmlsZSBzcmNGaWxlID0gZGNGaWxlcy5nZXQobW9kdWxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKCF1bmlxdWVNb2R1bGVzLmNvbnRhaW5zKG1vZHVsZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGhhdmUgbm90IHNlZW4gY29uZmlnIGZvciB0aGlzIG1vZHVsZSB5ZXQsIGNvcHkgaW50byByZXN1bHQKLSAgICAgICAgICAgICAgICAgICAgRmlsZSBkZXN0RmlsZSA9IG5ldyBGaWxlKGNvbmZpZ0RpciwgbW9kdWxlTmFtZSArICIuZHluYW1pYyIpOwotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgRmlsZVV0aWwuY29weUZpbGUoc3JjRmlsZSwgZGVzdEZpbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlTW9kdWxlcy5hZGQobW9kdWxlTmFtZSk7IC8vIEFkZCB0byB1bmlxdWVNb2R1bGVzIGlmIGNvcHkgc3VjY2VlZHMKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgd2FybigiRmFpbHVyZSB3aGVuIGNvcHlpbmcgY29uZmlnIGZpbGUgXCIlc1wiIHRvIFwiJXNcIiBmb3IgbW9kdWxlICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgZGVzdEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIG1vZHVsZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgQ0xvZy5lKGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEZpbGVVdGlsLmRlbGV0ZUZpbGUoc3JjRmlsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWN1cnNpdmVseSBjb3B5IGFueSBvdGhlciBmaWxlcyBmb3VuZCBpbiB0aGUgcHJldmlvdXMgc2Vzc2lvbidzIHJlc3VsdCBkaXJlY3RvcnkgdG8gdGhlCi0gICAgICogbmV3IHJlc3VsdCBkaXJlY3RvcnksIHNvIGxvbmcgYXMgdGhleSBkb24ndCBhbHJlYWR5IGV4aXN0LiBGb3IgZXhhbXBsZSwgYSAic2NyZWVuc2hvdHMiCi0gICAgICogZGlyZWN0b3J5IGdlbmVyYXRlZCBpbiBhIHByZXZpb3VzIHNlc3Npb24gYnkgYSBwYXNzaW5nIHRlc3Qgd2lsbCBub3QgYmUgZ2VuZXJhdGVkIG9uIHJldHJ5Ci0gICAgICogdW5sZXNzIGNvcGllZCBmcm9tIHRoZSBvbGQgcmVzdWx0IGRpcmVjdG9yeS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvbGREaXIKLSAgICAgKiBAcGFyYW0gbmV3RGlyCi0gICAgICovCi0gICAgc3RhdGljIHZvaWQgY29weVJldHJ5RmlsZXMoRmlsZSBvbGREaXIsIEZpbGUgbmV3RGlyKSB7Ci0gICAgICAgIEZpbGVbXSBvbGRDaGlsZHJlbiA9IG9sZERpci5saXN0RmlsZXMoKTsKLSAgICAgICAgZm9yIChGaWxlIG9sZENoaWxkIDogb2xkQ2hpbGRyZW4pIHsKLSAgICAgICAgICAgIGlmIChOT1RfUkVUUllfRklMRVMuY29udGFpbnMob2xkQ2hpbGQuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBkbyBub3QgY29weSB0aGlzIGZpbGUvZGlyZWN0b3J5IG9yIGl0cyBjaGlsZHJlbgotICAgICAgICAgICAgfQotICAgICAgICAgICAgRmlsZSBuZXdDaGlsZCA9IG5ldyBGaWxlKG5ld0Rpciwgb2xkQ2hpbGQuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGlmICghbmV3Q2hpbGQuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIG9sZCBmaWxlIG9yIGRpcmVjdG9yeSBkb2Vzbid0IGV4aXN0IGluIG5ldyBkaXIsIHNpbXBseSBjb3B5IGl0Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9sZENoaWxkLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVVdGlsLnJlY3Vyc2l2ZUNvcHkob2xkQ2hpbGQsIG5ld0NoaWxkKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVVdGlsLmNvcHlGaWxlKG9sZENoaWxkLCBuZXdDaGlsZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdhcm4oIkZhaWxlZCB0byBjb3B5IGZpbGUgXCIlc1wiIGZyb20gcHJldmlvdXMgc2Vzc2lvbiIsIG9sZENoaWxkLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChvbGRDaGlsZC5pc0RpcmVjdG9yeSgpICYmIG5ld0NoaWxkLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgICAgICAvLyBJZiBib3RoIGNoaWxkcmVuIGV4aXN0IGFzIGRpcmVjdG9yaWVzLCBtYWtlIHN1cmUgdGhlIGNoaWxkcmVuIG9mIHRoZSBvbGQgY2hpbGQKLSAgICAgICAgICAgICAgICAvLyBkaXJlY3RvcnkgZXhpc3QgaW4gdGhlIG5ldyBjaGlsZCBkaXJlY3RvcnkuCi0gICAgICAgICAgICAgICAgY29weVJldHJ5RmlsZXMob2xkQ2hpbGQsIG5ld0NoaWxkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFppcCB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIHJlc3VsdHMgZGlyZWN0b3J5LgotICAgICAqCi0gICAgICogQHBhcmFtIHJlc3VsdHNEaXIKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBGaWxlIHppcFJlc3VsdHMoRmlsZSByZXN1bHRzRGlyKSB7Ci0gICAgICAgIEZpbGUgemlwUmVzdWx0RmlsZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBjcmVhdGUgYSBmaWxlIGluIHBhcmVudCBkaXJlY3RvcnksIHdpdGggc2FtZSBuYW1lIGFzIHJlc3VsdHNEaXIKLSAgICAgICAgICAgIHppcFJlc3VsdEZpbGUgPSBuZXcgRmlsZShyZXN1bHRzRGlyLmdldFBhcmVudCgpLCBTdHJpbmcuZm9ybWF0KCIlcy56aXAiLAotICAgICAgICAgICAgICAgICAgICByZXN1bHRzRGlyLmdldE5hbWUoKSkpOwotICAgICAgICAgICAgWmlwVXRpbC5jcmVhdGVaaXAocmVzdWx0c0RpciwgemlwUmVzdWx0RmlsZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHdhcm4oIkZhaWxlZCB0byBjcmVhdGUgemlwIGZvciAlcyIsIHJlc3VsdHNEaXIuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gemlwUmVzdWx0RmlsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgTG9nIGluZm8gdG8gdGhlIGNvbnNvbGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbmZvKFN0cmluZyBmb3JtYXQsIE9iamVjdC4uLiBhcmdzKSB7Ci0gICAgICAgIGxvZyhMb2dMZXZlbC5JTkZPLCBmb3JtYXQsIGFyZ3MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBMb2cgZGVidWcgdG8gdGhlIGNvbnNvbGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBkZWJ1ZyhTdHJpbmcgZm9ybWF0LCBPYmplY3QuLi4gYXJncykgewotICAgICAgICBsb2coTG9nTGV2ZWwuREVCVUcsIGZvcm1hdCwgYXJncyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIExvZyBhIHdhcm5pbmcgdG8gdGhlIGNvbnNvbGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB3YXJuKFN0cmluZyBmb3JtYXQsIE9iamVjdC4uLiBhcmdzKSB7Ci0gICAgICAgIGxvZyhMb2dMZXZlbC5XQVJOLCBmb3JtYXQsIGFyZ3MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvZyBhIG1lc3NhZ2UgdG8gdGhlIGNvbnNvbGUKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGxvZyhMb2dMZXZlbCBsZXZlbCwgU3RyaW5nIGZvcm1hdCwgT2JqZWN0Li4uIGFyZ3MpIHsKLSAgICAgICAgQ0xvZy5sb2dBbmREaXNwbGF5KGxldmVsLCBmb3JtYXQsIGFyZ3MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZvciB0ZXN0aW5nIHB1cnBvc2UuCi0gICAgICovCi0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgcHVibGljIElJbnZvY2F0aW9uUmVzdWx0IGdldFJlc3VsdCgpIHsKLSAgICAgICAgcmV0dXJuIG1SZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSByZXBvcnRlciBpcyBmaW5hbGl6ZWQgYmVmb3JlIHRoZSBlbmQgb2YgdGhlIHRpbWVvdXQuIEZhbHNlIG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICBwdWJsaWMgYm9vbGVhbiB3YWl0Rm9yRmluYWxpemVkKGxvbmcgdGltZW91dCwgVGltZVVuaXQgdW5pdCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG1GaW5hbGl6ZWQuYXdhaXQodGltZW91dCwgdW5pdCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvcmVzdWx0L1N1YlBsYW5IZWxwZXIuamF2YSBiL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3Jlc3VsdC9TdWJQbGFuSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljODdhNzUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvcmVzdWx0L1N1YlBsYW5IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQucmVzdWx0OwotCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQuYnVpbGQuQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRlc3R0eXBlLkNvbXBhdGliaWxpdHlUZXN0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRlc3R0eXBlLklTdWJQbGFuOwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRlc3R0eXBlLlN1YlBsYW47Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudXRpbC5PcHRpb25IZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5JQ2FzZVJlc3VsdDsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLklJbnZvY2F0aW9uUmVzdWx0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuSU1vZHVsZVJlc3VsdDsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLklUZXN0UmVzdWx0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuUmVzdWx0SGFuZGxlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlRlc3RGaWx0ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5UZXN0U3RhdHVzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5Mb2cuTG9nTGV2ZWw7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuY29uZmlnLkFyZ3NPcHRpb25QYXJzZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuY29uZmlnLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuY29uZmlnLk9wdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5jb25maWcuT3B0aW9uLkltcG9ydGFuY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQubG9nLkxvZ1V0aWwuQ0xvZzsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC51dGlsLnhtbC5BYnN0cmFjdFhtbFBhcnNlci5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC51dGlsLlN0cmVhbVV0aWw7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIENsYXNzIGZvciBjcmVhdGluZyBzdWJwbGFucyBmcm9tIGNvbXBhdGliaWxpdHkgcmVzdWx0IFhNTC4KLSAqLwotcHVibGljIGNsYXNzIFN1YlBsYW5IZWxwZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9FWFQgPSAiLnhtbCI7Ci0KLSAgICAvLyBzdHJpbmcgc2lnbmFsbGluZyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYXJhbWV0ZXIgaW4gYSB0ZXN0IG5hbWUKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fU1RBUlQgPSAiWyI7Ci0KLSAgICAvLyByZXN1bHQgdHlwZXMKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVNTRUQgPSAicGFzc2VkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQUlMRUQgPSAiZmFpbGVkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RfRVhFQ1VURUQgPSAibm90X2V4ZWN1dGVkIjsKLSAgICAvLyBzdGF0aWMgbWFwcGluZyBvZiByZXN1bHQgdHlwZXMgdG8gVGVzdFN0YXR1c2VzCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgVGVzdFN0YXR1cz4gU1RBVFVTX01BUDsKLSAgICBzdGF0aWMgewotICAgICAgICBNYXA8U3RyaW5nLCBUZXN0U3RhdHVzPiBzdGF0dXNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFRlc3RTdGF0dXM+KCk7Ci0gICAgICAgIHN0YXR1c01hcC5wdXQoUEFTU0VELCBUZXN0U3RhdHVzLlBBU1MpOwotICAgICAgICBzdGF0dXNNYXAucHV0KEZBSUxFRCwgVGVzdFN0YXR1cy5GQUlMKTsKLSAgICAgICAgU1RBVFVTX01BUCA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChzdGF0dXNNYXApOwotICAgIH0KLQotICAgIEBPcHRpb24gKG5hbWUgPSAibmFtZSIsIHNob3J0TmFtZSA9ICduJywgZGVzY3JpcHRpb24gPSAidGhlIG5hbWUgb2YgdGhlIHN1YnBsYW4gdG8gY3JlYXRlIiwKLSAgICAgICAgICAgIGltcG9ydGFuY2U9SW1wb3J0YW5jZS5JRl9VTlNFVCkKLSAgICBwcml2YXRlIFN0cmluZyBtU3ViUGxhbk5hbWUgPSBudWxsOwotCi0gICAgQE9wdGlvbiAobmFtZSA9ICJzZXNzaW9uIiwgZGVzY3JpcHRpb24gPSAidGhlIHNlc3Npb24gaWQgdG8gZGVyaXZlIGZyb20iLAotICAgICAgICAgICAgaW1wb3J0YW5jZT1JbXBvcnRhbmNlLklGX1VOU0VUKQotICAgIHByaXZhdGUgSW50ZWdlciBtU2Vzc2lvbklkID0gbnVsbDsKLQotICAgIEBPcHRpb24gKG5hbWUgPSAicmVzdWx0LXR5cGUiLAotICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAidGhlIHJlc3VsdCB0eXBlIHRvIGluY2x1ZGUuIE9uZSBvZiBwYXNzZWQsIGZhaWxlZCwgbm90X2V4ZWN1dGVkLiIKLSAgICAgICAgICAgICsgIiBPcHRpb24gbWF5IGJlIHJlcGVhdGVkIiwKLSAgICAgICAgICAgIGltcG9ydGFuY2U9SW1wb3J0YW5jZS5JRl9VTlNFVCkKLSAgICBwcml2YXRlIFNldDxTdHJpbmc+IG1SZXN1bHRUeXBlcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQotICAgIEBPcHRpb24obmFtZSA9IENvbXBhdGliaWxpdHlUZXN0LklOQ0xVREVfRklMVEVSX09QVElPTiwKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gInRoZSBpbmNsdWRlIG1vZHVsZSBmaWx0ZXJzIHRvIGFwcGx5LiIsCi0gICAgICAgICAgICBpbXBvcnRhbmNlID0gSW1wb3J0YW5jZS5ORVZFUikKLSAgICBwcml2YXRlIFNldDxTdHJpbmc+IG1JbmNsdWRlRmlsdGVycyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQotICAgIEBPcHRpb24obmFtZSA9IENvbXBhdGliaWxpdHlUZXN0LkVYQ0xVREVfRklMVEVSX09QVElPTiwKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gInRoZSBleGNsdWRlIG1vZHVsZSBmaWx0ZXJzIHRvIGFwcGx5LiIsCi0gICAgICAgICAgICBpbXBvcnRhbmNlID0gSW1wb3J0YW5jZS5ORVZFUikKLSAgICBwcml2YXRlIFNldDxTdHJpbmc+IG1FeGNsdWRlRmlsdGVycyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQotICAgIEBPcHRpb24obmFtZSA9IENvbXBhdGliaWxpdHlUZXN0Lk1PRFVMRV9PUFRJT04sIHNob3J0TmFtZSA9ICdtJywKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gInRoZSB0ZXN0IG1vZHVsZSB0byBydW4uIiwKLSAgICAgICAgICAgIGltcG9ydGFuY2UgPSBJbXBvcnRhbmNlLk5FVkVSKQotICAgIHByaXZhdGUgU3RyaW5nIG1Nb2R1bGVOYW1lID0gbnVsbDsKLQotICAgIEBPcHRpb24obmFtZSA9IENvbXBhdGliaWxpdHlUZXN0LlRFU1RfT1BUSU9OLCBzaG9ydE5hbWUgPSAndCcsCi0gICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICJ0aGUgdGVzdCB0byBydW4uIiwKLSAgICAgICAgICAgIGltcG9ydGFuY2UgPSBJbXBvcnRhbmNlLk5FVkVSKQotICAgIHByaXZhdGUgU3RyaW5nIG1UZXN0TmFtZSA9IG51bGw7Ci0KLSAgICBAT3B0aW9uKG5hbWUgPSBDb21wYXRpYmlsaXR5VGVzdC5BQklfT1BUSU9OLCBzaG9ydE5hbWUgPSAnYScsCi0gICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICJ0aGUgYWJpIHRvIHRlc3QuIiwKLSAgICAgICAgICAgIGltcG9ydGFuY2UgPSBJbXBvcnRhbmNlLk5FVkVSKQotICAgIHByaXZhdGUgU3RyaW5nIG1BYmlOYW1lID0gbnVsbDsKLQotICAgIEBPcHRpb24obmFtZSA9IENvbXBhdGliaWxpdHlUZXN0LlNVQlBMQU5fT1BUSU9OLAotICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAidGhlIHN1YnBsYW4gdXNlZCBpbiB0aGUgcHJldmlvdXMgc2Vzc2lvbiIsCi0gICAgICAgICAgICBpbXBvcnRhbmNlID0gSW1wb3J0YW5jZS5ORVZFUikKLSAgICBwcml2YXRlIFN0cmluZyBtTGFzdFN1YlBsYW47Ci0KLSAgICBGaWxlIG1TdWJQbGFuRmlsZSA9IG51bGw7Ci0gICAgSUludm9jYXRpb25SZXN1bHQgbVJlc3VsdCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gZW1wdHkge0BsaW5rIFN1YlBsYW5IZWxwZXJ9LgotICAgICAqIDxwLz4KLSAgICAgKiBBbGwge0BsaW5rIE9wdGlvbn0gZmllbGRzIG11c3QgYmUgcG9wdWxhdGVkIHZpYQotICAgICAqIHtAbGluayBjb20uYW5kcm9pZC50cmFkZWZlZC5jb25maWcuQXJnc09wdGlvblBhcnNlcn0KLSAgICAgKi8KLSAgICBwdWJsaWMgU3ViUGxhbkhlbHBlcigpIHt9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSB7QGxpbmsgU3ViUGxhbkhlbHBlcn0gdXNpbmcgdGhlIHNwZWNpZmllZCBvcHRpb24gdmFsdWVzLgotICAgICAqLwotICAgIHB1YmxpYyBTdWJQbGFuSGVscGVyKFN0cmluZyBuYW1lLCBpbnQgc2Vzc2lvbiwgQ29sbGVjdGlvbjxTdHJpbmc+IHJlc3VsdFR5cGVzKSB7Ci0gICAgICAgIG1TdWJQbGFuTmFtZSA9IG5hbWU7Ci0gICAgICAgIG1TZXNzaW9uSWQgPSBzZXNzaW9uOwotICAgICAgICBtUmVzdWx0VHlwZXMuYWRkQWxsKHJlc3VsdFR5cGVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIElTdWJQbGFuIGdldFN1YlBsYW5CeU5hbWUoQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyIGJ1aWxkSGVscGVyLCBTdHJpbmcgbmFtZSkgewotICAgICAgICBpZiAoIW5hbWUuZW5kc1dpdGgoWE1MX0VYVCkpIHsKLSAgICAgICAgICAgIG5hbWUgPSBuYW1lICsgWE1MX0VYVDsgLy8gb25seSBhcHBlbmQgWE1MIGV4dGVuc2lvbiB0byBuYW1lIGlmIG5vdCBhbHJlYWR5IHRoZXJlCi0gICAgICAgIH0KLSAgICAgICAgSW5wdXRTdHJlYW0gc3ViUGxhbklucHV0U3RyZWFtID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEZpbGUgc3ViUGxhbkZpbGUgPSBuZXcgRmlsZShidWlsZEhlbHBlci5nZXRTdWJQbGFuc0RpcigpLCBuYW1lKTsKLSAgICAgICAgICAgIGlmICghc3ViUGxhbkZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiQ291bGQgbm90IHJldHJpZXZlIHN1YnBsYW4gXCIlc1wiIiwgbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3ViUGxhbklucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShzdWJQbGFuRmlsZSk7Ci0gICAgICAgICAgICBJU3ViUGxhbiBzdWJQbGFuID0gbmV3IFN1YlBsYW4oKTsKLSAgICAgICAgICAgIHN1YlBsYW4ucGFyc2Uoc3ViUGxhbklucHV0U3RyZWFtKTsKLSAgICAgICAgICAgIHJldHVybiBzdWJQbGFuOwotICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gfCBQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiVW5hYmxlIHRvIGZpbmQgb3IgcGFyc2Ugc3VicGxhbiAlcyIsIG5hbWUpLCBlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIFN0cmVhbVV0aWwuY2xvc2VTdHJlYW0oc3ViUGxhbklucHV0U3RyZWFtKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgcmVzdWx0IGZyb20gd2hpY2ggdG8gZGVyaXZlIHRoZSBzdWJwbGFuLgotICAgICAqIEBwYXJhbSByZXN1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXN1bHQoSUludm9jYXRpb25SZXN1bHQgcmVzdWx0KSB7Ci0gICAgICAgIG1SZXN1bHQgPSByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGEgcmVzdWx0IHR5cGUgZnJvbSB3aGljaCB0byBkZXJpdmUgdGhlIHN1YnBsYW4uIFBBU1NFRCwgRkFJTEVELCBvciBOT1RfRVhFQ1VURUQKLSAgICAgKiBAcGFyYW0gcmVzdWx0VHlwZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFJlc3VsdFR5cGUoU3RyaW5nIHJlc3VsdFR5cGUpIHsKLSAgICAgICAgbVJlc3VsdFR5cGVzLmFkZChyZXN1bHRUeXBlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW5kIHNlcmlhbGl6ZSBhIHN1YnBsYW4gZGVyaXZlZCBmcm9tIGEgcmVzdWx0LgotICAgICAqIDxwLz4KLSAgICAgKiB7QGxpbmsgT3B0aW9ufSB2YWx1ZXMgbXVzdCBhbGwgYmUgc2V0IGJlZm9yZSB0aGlzIGlzIGNhbGxlZC4KLSAgICAgKiBAcmV0dXJuIHNlcmlhbGl6ZWQgc3VicGxhbiBmaWxlLgotICAgICAqIEB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBGaWxlIGNyZWF0ZUFuZFNlcmlhbGl6ZVN1YlBsYW4oQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyIGJ1aWxkSGVscGVyKQotICAgICAgICAgICAgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgICAgICBJU3ViUGxhbiBzdWJQbGFuID0gY3JlYXRlU3ViUGxhbihidWlsZEhlbHBlcik7Ci0gICAgICAgIGlmIChzdWJQbGFuICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgc3ViUGxhbi5zZXJpYWxpemUobmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKG1TdWJQbGFuRmlsZSkpKTsKLSAgICAgICAgICAgICAgICBDTG9nLmxvZ0FuZERpc3BsYXkoTG9nTGV2ZWwuSU5GTywgIkNyZWF0ZWQgc3VicGxhbiBcIiVzXCIgYXQgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgbVN1YlBsYW5OYW1lLCBtU3ViUGxhbkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBtU3ViUGxhbkZpbGU7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgQ0xvZy5lKCJGYWlsZWQgdG8gY3JlYXRlIHBsYW4gZmlsZSAlcyIsIG1TdWJQbGFuRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgQ0xvZy5lKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHN1YnBsYW4gZGVyaXZlZCBmcm9tIGEgcmVzdWx0LgotICAgICAqIDxwLz4KLSAgICAgKiB7QGxpbmsgT3B0aW9ufSB2YWx1ZXMgbXVzdCBiZSBzZXQgYmVmb3JlIHRoaXMgaXMgY2FsbGVkLgotICAgICAqIEBwYXJhbSBidWlsZAotICAgICAqIEByZXR1cm4gc3VicGxhbgotICAgICAqIEB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBJU3ViUGxhbiBjcmVhdGVTdWJQbGFuKENvbXBhdGliaWxpdHlCdWlsZEhlbHBlciBidWlsZEhlbHBlcikKLSAgICAgICAgICAgIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgc2V0dXBGaWVsZHMoYnVpbGRIZWxwZXIpOwotICAgICAgICBJU3ViUGxhbiBzdWJQbGFuID0gbmV3IFN1YlBsYW4oKTsKLQotICAgICAgICAvLyBhZGQgZmlsdGVycyBmcm9tIHByZXZpb3VzIHNlc3Npb24gdG8gdHJhY2sgd2hpY2ggdGVzdHMgbXVzdCBydW4KLSAgICAgICAgc3ViUGxhbi5hZGRBbGxJbmNsdWRlRmlsdGVycyhtSW5jbHVkZUZpbHRlcnMpOwotICAgICAgICBzdWJQbGFuLmFkZEFsbEV4Y2x1ZGVGaWx0ZXJzKG1FeGNsdWRlRmlsdGVycyk7Ci0gICAgICAgIGlmIChtTGFzdFN1YlBsYW4gIT0gbnVsbCkgewotICAgICAgICAgICAgSVN1YlBsYW4gbGFzdFN1YlBsYW4gPSBTdWJQbGFuSGVscGVyLmdldFN1YlBsYW5CeU5hbWUoYnVpbGRIZWxwZXIsIG1MYXN0U3ViUGxhbik7Ci0gICAgICAgICAgICBzdWJQbGFuLmFkZEFsbEluY2x1ZGVGaWx0ZXJzKGxhc3RTdWJQbGFuLmdldEluY2x1ZGVGaWx0ZXJzKCkpOwotICAgICAgICAgICAgc3ViUGxhbi5hZGRBbGxFeGNsdWRlRmlsdGVycyhsYXN0U3ViUGxhbi5nZXRFeGNsdWRlRmlsdGVycygpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobU1vZHVsZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgYWRkSW5jbHVkZVRvU3ViUGxhbihzdWJQbGFuLCBuZXcgVGVzdEZpbHRlcihtQWJpTmFtZSwgbU1vZHVsZU5hbWUsIG1UZXN0TmFtZSkpOwotICAgICAgICB9Ci0gICAgICAgIFNldDxUZXN0U3RhdHVzPiBzdGF0dXNlc1RvUnVuID0gZ2V0U3RhdHVzZXNUb1J1bigpOwotICAgICAgICBmb3IgKElNb2R1bGVSZXN1bHQgbW9kdWxlIDogbVJlc3VsdC5nZXRNb2R1bGVzKCkpIHsKLSAgICAgICAgICAgIGlmIChzaG91bGRSdW5Nb2R1bGUobW9kdWxlKSkgewotICAgICAgICAgICAgICAgIFRlc3RGaWx0ZXIgbW9kdWxlSW5jbHVkZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRlc3RGaWx0ZXIobW9kdWxlLmdldEFiaSgpLCBtb2R1bGUuZ2V0TmFtZSgpLCBudWxsIC8qdGVzdCovKTsKLSAgICAgICAgICAgICAgICBpZiAoc2hvdWxkUnVuRW50aXJlTW9kdWxlKG1vZHVsZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaW5jbHVkZSBlbnRpcmUgbW9kdWxlCi0gICAgICAgICAgICAgICAgICAgIGFkZEluY2x1ZGVUb1N1YlBsYW4oc3ViUGxhbiwgbW9kdWxlSW5jbHVkZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtUmVzdWx0VHlwZXMuY29udGFpbnMoTk9UX0VYRUNVVEVEKSAmJiAhbW9kdWxlLmlzRG9uZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGFkZCBtb2R1bGUgaW5jbHVkZSBhbmQgdGVzdCBleGNsdWRlcwotICAgICAgICAgICAgICAgICAgICBhZGRJbmNsdWRlVG9TdWJQbGFuKHN1YlBsYW4sIG1vZHVsZUluY2x1ZGUpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKElDYXNlUmVzdWx0IGNhc2VSZXN1bHQgOiBtb2R1bGUuZ2V0UmVzdWx0cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKElUZXN0UmVzdWx0IHRlc3RSZXN1bHQgOiBjYXNlUmVzdWx0LmdldFJlc3VsdHMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RhdHVzZXNUb1J1bi5jb250YWlucyh0ZXN0UmVzdWx0LmdldFJlc3VsdFN0YXR1cygpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0RmlsdGVyIHRlc3RFeGNsdWRlID0gbmV3IFRlc3RGaWx0ZXIobW9kdWxlLmdldEFiaSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZS5nZXROYW1lKCksIHRlc3RSZXN1bHQuZ2V0RnVsbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEV4Y2x1ZGVUb1N1YlBsYW4oc3ViUGxhbiwgdGVzdEV4Y2x1ZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIE5vdC1leGVjdXRlZCB0ZXN0cyBzaG91bGQgbm90IGJlIHJlcnVuIGFuZC9vciB0aGlzIG1vZHVsZSBpcyBjb21wbGV0ZWQKLSAgICAgICAgICAgICAgICAgICAgLy8gSW4gYW55IHN1Y2ggY2FzZSwgaXQgc3VmZmljZXMgdG8gYWRkIGluY2x1ZGVzIGZvciBlYWNoIHRlc3QgdG8gcmVydW4KLSAgICAgICAgICAgICAgICAgICAgZm9yIChJQ2FzZVJlc3VsdCBjYXNlUmVzdWx0IDogbW9kdWxlLmdldFJlc3VsdHMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChJVGVzdFJlc3VsdCB0ZXN0UmVzdWx0IDogY2FzZVJlc3VsdC5nZXRSZXN1bHRzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzZXNUb1J1bi5jb250YWlucyh0ZXN0UmVzdWx0LmdldFJlc3VsdFN0YXR1cygpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0RmlsdGVyIHRlc3RJbmNsdWRlID0gbmV3IFRlc3RGaWx0ZXIobW9kdWxlLmdldEFiaSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZS5nZXROYW1lKCksIHRlc3RSZXN1bHQuZ2V0RnVsbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEluY2x1ZGVUb1N1YlBsYW4oc3ViUGxhbiwgdGVzdEluY2x1ZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gbW9kdWxlIHNob3VsZCBub3QgcnVuLCBleGNsdWRlIGVudGlyZSBtb2R1bGUKLSAgICAgICAgICAgICAgICBUZXN0RmlsdGVyIG1vZHVsZUV4Y2x1ZGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRlc3RGaWx0ZXIobW9kdWxlLmdldEFiaSgpLCBtb2R1bGUuZ2V0TmFtZSgpLCBudWxsIC8qdGVzdCovKTsKLSAgICAgICAgICAgICAgICBhZGRFeGNsdWRlVG9TdWJQbGFuKHN1YlBsYW4sIG1vZHVsZUV4Y2x1ZGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdWJQbGFuOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCB0aGUgaW5jbHVkZSB0ZXN0IGZpbHRlciB0byB0aGUgc3VicGxhbi4gRm9yIGZpbHRlcnMgdGhhdCBzcGVjaWZ5IHRoZSBwYXJhbWV0ZXJzIG9mIGEKLSAgICAgKiB0ZXN0LCBzdHJpcCB0aGUgcGFyYW1ldGVyIHN1ZmZpeCBhbmQgYWRkIHRoZSBpbmNsdWRlLCB3aGljaCB3aWxsIHJ1biB0aGUgdGVzdCB3aXRoIGFsbAotICAgICAqIHBhcmFtZXRlcnMuIElmIEpVbml0IHRlc3QgcnVubmVycyBhcmUgZXh0ZW5kZWQgdG8gaGFuZGxlIGZpbHRlcmluZyBieSBwYXJhbWV0ZXIsIHRoaXMKLSAgICAgKiBzcGVjaWFsIGNhc2UgbWF5IGJlIHJlbW92ZWQuCi0gICAgICovCi0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgc3RhdGljIHZvaWQgYWRkSW5jbHVkZVRvU3ViUGxhbihJU3ViUGxhbiBzdWJQbGFuLCBUZXN0RmlsdGVyIGluY2x1ZGUpIHsKLSAgICAgICAgU3RyaW5nIHRlc3QgPSBpbmNsdWRlLmdldFRlc3QoKTsKLSAgICAgICAgU3RyaW5nIHN0ciA9IGluY2x1ZGUudG9TdHJpbmcoKTsKLSAgICAgICAgaWYgKHRlc3QgPT0gbnVsbCB8fCAhdGVzdC5jb250YWlucyhQQVJBTV9TVEFSVCkpIHsKLSAgICAgICAgICAgIHN1YlBsYW4uYWRkSW5jbHVkZUZpbHRlcihzdHIpOwotICAgICAgICB9IGVsc2UgaWYgKHRlc3QuY29udGFpbnMoUEFSQU1fU1RBUlQpKSB7Ci0gICAgICAgICAgICAvLyBmaWx0ZXIgYXBwbGllcyB0byBwYXJhbWV0ZXJpemVkIHRlc3QsIGluY2x1ZGUgdGVzdCB3aXRob3V0IHBhcmFtZXRlci4KLSAgICAgICAgICAgIHN1YlBsYW4uYWRkSW5jbHVkZUZpbHRlcihzdHIuc3Vic3RyaW5nKDAsIHN0ci5sYXN0SW5kZXhPZihQQVJBTV9TVEFSVCkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCB0aGUgZXhjbHVkZSB0ZXN0IGZpbHRlciB0byB0aGUgc3VicGxhbi4gRm9yIGZpbHRlcnMgdGhhdCBzcGVjaWZ5IHRoZSBwYXJhbWV0ZXJzIG9mIGEKLSAgICAgKiB0ZXN0LCBkbyBub3QgYWRkIHRoZSBleGNsdWRlIGZpbHRlci4gVGhpcyB3aWxsIHByb21wdCB0aGUgdGVzdCB0byBydW4gYWdhaW4gd2l0aCBhbGwKLSAgICAgKiBwYXJhbWV0ZXJzLiBJZiBKVW5pdCB0ZXN0IHJ1bm5lcnMgYXJlIGV4dGVuZGVkIHRvIGhhbmRsZSBmaWx0ZXJpbmcgYnkgcGFyYW1ldGVyLCB0aGlzCi0gICAgICogc3BlY2lhbCBjYXNlIG1heSBiZSByZW1vdmVkLgotICAgICAqLwotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHN0YXRpYyB2b2lkIGFkZEV4Y2x1ZGVUb1N1YlBsYW4oSVN1YlBsYW4gc3ViUGxhbiwgVGVzdEZpbHRlciBleGNsdWRlKSB7Ci0gICAgICAgIFN0cmluZyB0ZXN0ID0gZXhjbHVkZS5nZXRUZXN0KCk7Ci0gICAgICAgIFN0cmluZyBzdHIgPSBleGNsdWRlLnRvU3RyaW5nKCk7Ci0gICAgICAgIGlmICh0ZXN0ID09IG51bGwgfHwgIXRlc3QuY29udGFpbnMoUEFSQU1fU1RBUlQpKSB7Ci0gICAgICAgICAgICBzdWJQbGFuLmFkZEV4Y2x1ZGVGaWx0ZXIoc3RyKTsKLSAgICAgICAgfQotICAgICAgICAvLyBkb24ndCBhZGQgZXhjbHVkZSBmb3IgcGFyYW1ldGVyaXplZCB0ZXN0LCBhcyBydW5uZXJzIGRvIG5vdCBzdXBwb3J0IHRoaXMuCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2hldGhlciBhbnkgdGVzdHMgd2l0aGluIHRoZSBnaXZlbiB7QGxpbmsgSU1vZHVsZVJlc3VsdH0gc2hvdWxkIGJlIHJ1biwgYmFzZWQgb24KLSAgICAgKiB0aGUgY29udGVudCBvZiBtUmVzdWx0VHlwZXMuCi0gICAgICogQHBhcmFtIG1vZHVsZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhdCBsZWFzdCBvbmUgdGVzdCBpbiB0aGUgbW9kdWxlIHNob3VsZCBydW4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gc2hvdWxkUnVuTW9kdWxlKElNb2R1bGVSZXN1bHQgbW9kdWxlKSB7Ci0gICAgICAgIGlmIChtUmVzdWx0VHlwZXMuY29udGFpbnMoTk9UX0VYRUNVVEVEKSAmJiAhbW9kdWxlLmlzRG9uZSgpKSB7Ci0gICAgICAgICAgICAvLyBtb2R1bGUgaGFzIG5vdCBleGVjdXRlZCB0ZXN0cyB0aGF0IHRoZSBzdWJwbGFuIHNob3VsZCBydW4KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoVGVzdFN0YXR1cyBzdGF0dXMgOiBnZXRTdGF0dXNlc1RvUnVuKCkpIHsKLSAgICAgICAgICAgIGlmIChtb2R1bGUuY291bnRSZXN1bHRzKHN0YXR1cykgPiAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdoZXRoZXIgYWxsIHRlc3RzIHdpdGhpbiB0aGUgZ2l2ZW4ge0BsaW5rIElNb2R1bGVSZXN1bHR9IHNob3VsZCBiZSBydW4sIGJhc2VkIG9uCi0gICAgICogdGhlIGNvbnRlbnQgb2YgbVJlc3VsdFR5cGVzLgotICAgICAqIEBwYXJhbSBtb2R1bGUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgZXZlcnkgdGVzdCBpbiB0aGUgbW9kdWxlIHNob3VsZCBydW4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gc2hvdWxkUnVuRW50aXJlTW9kdWxlKElNb2R1bGVSZXN1bHQgbW9kdWxlKSB7Ci0gICAgICAgIGlmICghbVJlc3VsdFR5cGVzLmNvbnRhaW5zKE5PVF9FWEVDVVRFRCkgJiYgIW1vZHVsZS5pc0RvbmUoKSkgewotICAgICAgICAgICAgLy8gbW9kdWxlIGhhcyBub3QgZXhlY3V0ZWQgdGVzdHMgdGhhdCB0aGUgc3VicGxhbiBzaG91bGQgbm90IHJ1bgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIFNldDxUZXN0U3RhdHVzPiBzdGF0dXNlc1RvUnVuID0gZ2V0U3RhdHVzZXNUb1J1bigpOwotICAgICAgICBmb3IgKFRlc3RTdGF0dXMgc3RhdHVzIDogVGVzdFN0YXR1cy52YWx1ZXMoKSkgewotICAgICAgICAgICAgaWYgKCFzdGF0dXNlc1RvUnVuLmNvbnRhaW5zKHN0YXR1cykpIHsKLSAgICAgICAgICAgICAgICAvLyBzdGF0dXMgaXMgYSBUZXN0U3RhdHVzIHdlIGRvbid0IHdhbnQgdG8gcnVuCi0gICAgICAgICAgICAgICAgaWYgKG1vZHVsZS5jb3VudFJlc3VsdHMoc3RhdHVzKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgYSB7QGxpbmsgU2V0fSBvZiB7QGxpbmsgVGVzdFN0YXR1c31lcyB0byBydW4sIGJhc2VkIG9uIHRoZSBjb250ZW50IG9mCi0gICAgICogbVJlc3VsdFR5cGVzLiBEb2VzIG5vdCBhY2NvdW50IGZvciByZXN1bHQgdHlwZSBOT1RfRVhFQ1VURUQsIHNpbmNlIG5vIHN1Y2ggVGVzdFN0YXR1cwotICAgICAqIGV4aXN0cy4KLSAgICAgKiBAcmV0dXJuIHNldCBvZiBUZXN0U3RhdHVzZXMgdG8gcnVuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTZXQ8VGVzdFN0YXR1cz4gZ2V0U3RhdHVzZXNUb1J1bigpIHsKLSAgICAgICAgU2V0PFRlc3RTdGF0dXM+IHN0YXR1c2VzVG9SdW4gPSBuZXcgSGFzaFNldDxUZXN0U3RhdHVzPigpOwotICAgICAgICBmb3IgKFN0cmluZyByZXN1bHRUeXBlIDogbVJlc3VsdFR5cGVzKSB7Ci0gICAgICAgICAgICAvLyBubyB0ZXN0IHN0YXR1cyBleGlzdHMgZm9yIG5vdC1leGVjdXRlZCB0ZXN0cwotICAgICAgICAgICAgaWYgKCFOT1RfRVhFQ1VURUQuZXF1YWxzKHJlc3VsdFR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzZXNUb1J1bi5hZGQoU1RBVFVTX01BUC5nZXQocmVzdWx0VHlwZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXNlc1RvUnVuOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVuc3VyZSB0aGF0IGFsbCB7QE9wdGlvbn1zIGFuZCBmaWVsZHMgYXJlIHBvcHVsYXRlZCB3aXRoIHZhbGlkIHZhbHVlcy4KLSAgICAgKiBAcGFyYW0gYnVpbGRIZWxwZXIKLSAgICAgKiBAdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gaWYgYW55IG9wdGlvbiBoYXMgYW4gaW52YWxpZCB2YWx1ZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXR1cEZpZWxkcyhDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIgYnVpbGRIZWxwZXIpIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG1SZXN1bHQgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG1TZXNzaW9uSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCJNaXNzaW5nIC0tc2Vzc2lvbiBhcmd1bWVudCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtUmVzdWx0ID0gUmVzdWx0SGFuZGxlci5maW5kUmVzdWx0KGJ1aWxkSGVscGVyLmdldFJlc3VsdHNEaXIoKSwgbVNlc3Npb25JZCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1SZXN1bHQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZmluZCBzZXNzaW9uIHdpdGggaWQgJWQiLCBtU2Vzc2lvbklkKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgcmV0cnlDb21tYW5kTGluZUFyZ3MgPSBtUmVzdWx0LmdldENvbW1hbmRMaW5lQXJncygpOwotICAgICAgICBpZiAocmV0cnlDb21tYW5kTGluZUFyZ3MgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyBwYXJzZSB0aGUgY29tbWFuZC1saW5lIHN0cmluZyBmcm9tIHRoZSByZXN1bHQgZmlsZSBhbmQgc2V0IG9wdGlvbnMKLSAgICAgICAgICAgICAgICBBcmdzT3B0aW9uUGFyc2VyIHBhcnNlciA9IG5ldyBBcmdzT3B0aW9uUGFyc2VyKHRoaXMpOwotICAgICAgICAgICAgICAgIHBhcnNlci5wYXJzZShPcHRpb25IZWxwZXIuZ2V0VmFsaWRDbGlBcmdzKHJldHJ5Q29tbWFuZExpbmVBcmdzLCB0aGlzKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtUmVzdWx0VHlwZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAvLyBhZGQgYWxsIHZhbGlkIHZhbHVlcywgaW5jbHVkZSBhbGwgdGVzdHMgb2YgYWxsIHN0YXR1c2VzCi0gICAgICAgICAgICBtUmVzdWx0VHlwZXMuYWRkQWxsKAotICAgICAgICAgICAgICAgICAgICBuZXcgSGFzaFNldDxTdHJpbmc+KEFycmF5cy5hc0xpc3QoUEFTU0VELCBGQUlMRUQsIE5PVF9FWEVDVVRFRCkpKTsKLSAgICAgICAgfQotICAgICAgICAvLyB2YWxpZGF0ZSBhbGwgdGVzdCBzdGF0dXMgdmFsdWVzCi0gICAgICAgIGZvciAoU3RyaW5nIHR5cGUgOiBtUmVzdWx0VHlwZXMpIHsKLSAgICAgICAgICAgIGlmICghdHlwZS5lcXVhbHMoUEFTU0VEKSAmJiAhdHlwZS5lcXVhbHMoRkFJTEVEKSAmJiAhdHlwZS5lcXVhbHMoTk9UX0VYRUNVVEVEKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoInJlc3VsdCB0eXBlICVzIGludmFsaWQiLCB0eXBlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVN1YlBsYW5OYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIG1TdWJQbGFuTmFtZSA9IGNyZWF0ZVBsYW5OYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1TdWJQbGFuRmlsZSA9IG5ldyBGaWxlKGJ1aWxkSGVscGVyLmdldFN1YlBsYW5zRGlyKCksIG1TdWJQbGFuTmFtZSArIFhNTF9FWFQpOwotICAgICAgICAgICAgaWYgKG1TdWJQbGFuRmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIlN1YnBsYW4gJXMgYWxyZWFkeSBleGlzdHMiLAotICAgICAgICAgICAgICAgICAgICAgICAgbVN1YlBsYW5OYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDb3VsZCBub3QgZmluZCBzdWJwbGFucyBkaXJlY3RvcnkiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhlbHBlciB0byBjcmVhdGUgYSBwbGFuIG5hbWUgaWYgbm9uZSBpcyBleHBsaWNpdGx5IHNldAotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZVBsYW5OYW1lKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgc2IuYXBwZW5kKFN0cmluZy5qb2luKCJfIiwgbVJlc3VsdFR5cGVzKSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiXyIpOwotICAgICAgICBpZiAobVNlc3Npb25JZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoSW50ZWdlci50b1N0cmluZyhtU2Vzc2lvbklkKSk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIl8iKTsKLSAgICAgICAgfQotICAgICAgICAvLyB1c2UgdW5pcXVlIHN0YXJ0IHRpbWUgZm9yIG5hbWUKLSAgICAgICAgc2IuYXBwZW5kKENvbXBhdGliaWxpdHlCdWlsZEhlbHBlci5nZXREaXJTdWZmaXgobVJlc3VsdC5nZXRTdGFydFRpbWUoKSkpOwotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC9yZXN1bHQvVGVzdFJ1bkhhbmRsZXIuamF2YSBiL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3Jlc3VsdC9UZXN0UnVuSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDczZWI4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3Jlc3VsdC9UZXN0UnVuSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnJlc3VsdDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLmJ1aWxkLkNvbXBhdGliaWxpdHlCdWlsZEhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5sb2cuTG9nVXRpbC5DTG9nOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnV0aWwuRmlsZVV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLS8qKgotICogQSBoZWxwZXIgY2xhc3MgZm9yIHNldHRpbmcgYW5kIGNoZWNraW5nIHRoZSBudW1iZXIgb2YgZXhwZWN0ZWQgdGVzdCBydW5zLgotICovCi1wdWJsaWMgY2xhc3MgVGVzdFJ1bkhhbmRsZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUF9ERUxJTUlURVIgPSAiLT4iOwotCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgZXhwZWN0ZWQgdGVzdCBydW5zIGZvciB0aGUgbW9kdWxlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnVpbGRIZWxwZXIgdGhlIHtAbGluayBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXJ9IGZyb20gd2hpY2ggdG8gcmV0cmlldmUgaW52b2NhdGlvbgotICAgICAqIGZhaWx1cmUgZmlsZQotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBleHBlY3RlZCB0ZXN0IHJ1bnMsIG9yIDEgaWYgbW9kdWxlIGlzIG5vdCBmb3VuZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFRlc3RSdW5zKGZpbmFsIENvbXBhdGliaWxpdHlCdWlsZEhlbHBlciBidWlsZEhlbHBlciwgU3RyaW5nIGlkKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBGaWxlIGYgPSBidWlsZEhlbHBlci5nZXRUZXN0UnVuc0ZpbGUoKTsKLSAgICAgICAgICAgIGlmICghZi5leGlzdHMoKSB8fCBmLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsgLy8gdGVzdCBydW5zIGZpbGUgZG9lc24ndCBleGlzdCwgZXhwZWN0IG9uZSB0ZXN0IHJ1biBieSBkZWZhdWx0Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgbWFwU3RyaW5nID0gRmlsZVV0aWwucmVhZFN0cmluZ0Zyb21GaWxlKGYpOwotICAgICAgICAgICAgTWFwPFN0cmluZywgSW50ZWdlcj4gbWFwID0gc3RyaW5nVG9NYXAobWFwU3RyaW5nKTsKLSAgICAgICAgICAgIEludGVnZXIgdGVzdFJ1bnMgPSBtYXAuZ2V0KGlkKTsKLSAgICAgICAgICAgIHJldHVybiAodGVzdFJ1bnMgPT0gbnVsbCkgPyAxIDogdGVzdFJ1bnM7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIENMb2cuZSgiQ291bGQgbm90IHJlYWQgdGVzdCBydW4gZmlsZSBmb3Igc2Vzc2lvbiAlcyIsCi0gICAgICAgICAgICAgICAgYnVpbGRIZWxwZXIuZ2V0RGlyU3VmZml4KGJ1aWxkSGVscGVyLmdldFN0YXJ0VGltZSgpKSk7Ci0gICAgICAgICAgICBDTG9nLmUoZSk7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlIHRoZSBudW1iZXIgb2YgZXhwZWN0ZWQgdGVzdCBydW5zIHRvIHRoZSByZXN1bHQncyB0ZXN0IHJ1biBmaWxlLgotICAgICAqCi0gICAgICogQHBhcmFtIGJ1aWxkSGVscGVyIHRoZSB7QGxpbmsgQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyfSB1c2VkIHRvIHdyaXRlIHRoZQotICAgICAqIHRlc3QgcnVuIGZpbGUKLSAgICAgKiBAcGFyYW0gdGVzdFJ1bnMgYSBtYXBwaW5nIG9mIG1vZHVsZSBuYW1lcyB0byBudW1iZXIgb2YgdGVzdCBydW5zIGV4cGVjdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFRlc3RSdW5zKGZpbmFsIENvbXBhdGliaWxpdHlCdWlsZEhlbHBlciBidWlsZEhlbHBlciwKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIEludGVnZXI+IHRlc3RSdW5zKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBGaWxlIGYgPSBidWlsZEhlbHBlci5nZXRUZXN0UnVuc0ZpbGUoKTsKLSAgICAgICAgICAgIGlmICghZi5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIGYuY3JlYXRlTmV3RmlsZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRmlsZVV0aWwud3JpdGVUb0ZpbGUobWFwVG9TdHJpbmcodGVzdFJ1bnMpLCBmKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgQ0xvZy5lKCJFeGNlcHRpb24gd2hpbGUgd3JpdGluZyB0ZXN0IHJ1bnMgZmlsZS4iKTsKLSAgICAgICAgICAgIENMb2cuZShlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBtYXBUb1N0cmluZyhNYXA8U3RyaW5nLCBJbnRlZ2VyPiBtYXApIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCIiKTsKLSAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBJbnRlZ2VyPiBlbnRyeSA6IG1hcC5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiJXMlcyVkXG4iLCBlbnRyeS5nZXRLZXkoKSwgTUFQX0RFTElNSVRFUiwgZW50cnkuZ2V0VmFsdWUoKSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIEludGVnZXI+IHN0cmluZ1RvTWFwKFN0cmluZyBzdHIpIHsKLSAgICAgICAgTWFwPFN0cmluZywgSW50ZWdlcj4gbWFwID0gbmV3IEhhc2hNYXA8PigpOwotICAgICAgICBmb3IgKFN0cmluZyBlbnRyeSA6IHN0ci5zcGxpdCgiXG4iKSkgewotICAgICAgICAgICAgU3RyaW5nW10gcGFydHMgPSBlbnRyeS5zcGxpdChNQVBfREVMSU1JVEVSKTsKLSAgICAgICAgICAgIG1hcC5wdXQocGFydHNbMF0sIEludGVnZXIucGFyc2VJbnQocGFydHNbMV0pKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWFwOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3RhcmdldHByZXAvQXBrSW5zdGFsbGVyLmphdmEgYi9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC90YXJnZXRwcmVwL0Fwa0luc3RhbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjBjODEzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3RhcmdldHByZXAvQXBrSW5zdGFsbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGFyZ2V0cHJlcDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLmJ1aWxkLkNvbXBhdGliaWxpdHlCdWlsZEhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5idWlsZC5JQnVpbGRJbmZvOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmNvbmZpZy5PcHRpb25DbGFzczsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuSVRlc3REZXZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5UYXJnZXRTZXR1cEVycm9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuVGVzdEFwcEluc3RhbGxTZXR1cDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBJbnN0YWxscyBzcGVjaWZpZWQgQVBLcyBmcm9tIENvbXBhdGliaWxpdHkgcmVwb3NpdG9yeS4KLSAqLwotQE9wdGlvbkNsYXNzKGFsaWFzPSJhcGstaW5zdGFsbGVyIikKLXB1YmxpYyBjbGFzcyBBcGtJbnN0YWxsZXIgZXh0ZW5kcyBUZXN0QXBwSW5zdGFsbFNldHVwIHsKLQotICAgIHByaXZhdGUgQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyIG1CdWlsZEhlbHBlciA9IG51bGw7Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0QnVpbGRIZWxwZXIoSUJ1aWxkSW5mbyBidWlsZEluZm8pIHsKLSAgICAgICAgaWYgKG1CdWlsZEhlbHBlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtQnVpbGRIZWxwZXIgPSBuZXcgQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyKGJ1aWxkSW5mbyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgRmlsZSBnZXRUZXN0c0RpcihJQnVpbGRJbmZvIGJ1aWxkSW5mbykgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNldEJ1aWxkSGVscGVyKGJ1aWxkSW5mbyk7Ci0gICAgICAgIHJldHVybiBtQnVpbGRIZWxwZXIuZ2V0VGVzdHNEaXIoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgRmlsZSBnZXRUZXN0RmlsZShJQnVpbGRJbmZvIGJ1aWxkSW5mbywgU3RyaW5nIGZpbGVuYW1lKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgc2V0QnVpbGRIZWxwZXIoYnVpbGRJbmZvKTsKLSAgICAgICAgcmV0dXJuIG1CdWlsZEhlbHBlci5nZXRUZXN0RmlsZShmaWxlbmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBGaWxlIGdldExvY2FsUGF0aEZvckZpbGVuYW1lKElCdWlsZEluZm8gYnVpbGRJbmZvLCBTdHJpbmcgYXBrRmlsZU5hbWUsCi0gICAgICAgICAgICBJVGVzdERldmljZSBkZXZpY2UpIHRocm93cyBUYXJnZXRTZXR1cEVycm9yIHsKLSAgICAgICAgRmlsZSBhcGtGaWxlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFwa0ZpbGUgPSBnZXRUZXN0RmlsZShidWlsZEluZm8sIGFwa0ZpbGVOYW1lKTsKLSAgICAgICAgICAgIGlmICghYXBrRmlsZS5pc0ZpbGUoKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBUYXJnZXRTZXR1cEVycm9yKFN0cmluZy5mb3JtYXQoIiVzIG5vdCBmb3VuZCIsIGFwa0ZpbGVOYW1lKSwgZSwKLSAgICAgICAgICAgICAgICAgICAgZGV2aWNlLmdldERldmljZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFwa0ZpbGU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdGFyZ2V0cHJlcC9BcGtJbnN0cnVtZW50YXRpb25QcmVwYXJlci5qYXZhIGIvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdGFyZ2V0cHJlcC9BcGtJbnN0cnVtZW50YXRpb25QcmVwYXJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjczODY2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3RhcmdldHByZXAvQXBrSW5zdHJ1bWVudGF0aW9uUHJlcGFyZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50YXJnZXRwcmVwOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQuYnVpbGQuQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi50ZXN0cnVubmVyLlRlc3RJZGVudGlmaWVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmJ1aWxkLklCdWlsZEluZm87Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuY29uZmlnLk9wdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5jb25maWcuT3B0aW9uQ2xhc3M7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLkRldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuSVRlc3REZXZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQubG9nLkxvZ1V0aWwuQ0xvZzsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5yZXN1bHQuSVRlc3RJbnZvY2F0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5CdWlsZEVycm9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuSVRhcmdldENsZWFuZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5UYXJnZXRTZXR1cEVycm9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkFuZHJvaWRKVW5pdFRlc3Q7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKLQotLyoqCi0gKiBUYXJnZXQgcHJlcGFyZXIgdGhhdCBpbnN0cnVtZW50cyBhbiBBUEsuCi0gKi8KLUBPcHRpb25DbGFzcyhhbGlhcz0iYXBrLWluc3RydW1lbnRhdGlvbi1wcmVwYXJlciIpCi1wdWJsaWMgY2xhc3MgQXBrSW5zdHJ1bWVudGF0aW9uUHJlcGFyZXIgZXh0ZW5kcyBQcmVjb25kaXRpb25QcmVwYXJlciBpbXBsZW1lbnRzIElUYXJnZXRDbGVhbmVyIHsKLQotICAgIEBPcHRpb24obmFtZSA9ICJhcGsiLCBkZXNjcmlwdGlvbiA9ICJOYW1lIG9mIHRoZSBhcGsgdG8gaW5zdHJ1bWVudCIsIG1hbmRhdG9yeSA9IHRydWUpCi0gICAgcHJvdGVjdGVkIFN0cmluZyBtQXBrRmlsZU5hbWUgPSBudWxsOwotCi0gICAgQE9wdGlvbihuYW1lID0gInBhY2thZ2UiLCBkZXNjcmlwdGlvbiA9ICJOYW1lIG9mIHRoZSBwYWNrYWdlIiwgbWFuZGF0b3J5ID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG1QYWNrYWdlTmFtZSA9IG51bGw7Ci0KLSAgICBwdWJsaWMgZW51bSBXaGVuIHsKLSAgICAgICAgQkVGT1JFLCBBRlRFUiwgQk9USDsKLSAgICB9Ci0KLSAgICBAT3B0aW9uKG5hbWUgPSAid2hlbiIsIGRlc2NyaXB0aW9uID0gIldoZW4gdG8gaW5zdHJ1bWVudCB0aGUgYXBrIiwgbWFuZGF0b3J5ID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgV2hlbiBtV2hlbiA9IG51bGw7Ci0KLSAgICBAT3B0aW9uKG5hbWUgPSAidGhyb3ctZXJyb3IiLCBkZXNjcmlwdGlvbiA9ICJXaGV0aGVyIHRvIHRocm93IGVycm9yIGZvciBkZXZpY2UgdGVzdCBmYWlsdXJlIikKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtVGhyb3dFcnJvciA9IHRydWU7Ci0KLSAgICBwcm90ZWN0ZWQgQ29uY3VycmVudEhhc2hNYXA8VGVzdElkZW50aWZpZXIsIE1hcDxTdHJpbmcsIFN0cmluZz4+IHRlc3RNZXRyaWNzID0KLSAgICAgICAgICAgIG5ldyBDb25jdXJyZW50SGFzaE1hcDw+KCk7Ci0gICAgcHJpdmF0ZSBDb25jdXJyZW50SGFzaE1hcDxUZXN0SWRlbnRpZmllciwgU3RyaW5nPiB0ZXN0RmFpbHVyZXMgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8PigpOwotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJ1bihJVGVzdERldmljZSBkZXZpY2UsIElCdWlsZEluZm8gYnVpbGRJbmZvKSB0aHJvd3MgVGFyZ2V0U2V0dXBFcnJvciwKLSAgICAgICAgICAgIEJ1aWxkRXJyb3IsIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChtV2hlbiA9PSBXaGVuLkFGVEVSKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChpbnN0cnVtZW50KGRldmljZSwgYnVpbGRJbmZvKSkgewotICAgICAgICAgICAgICAgIENMb2cuZCgiVGFyZ2V0IHByZXBhcmF0aW9uIHN1Y2Nlc3NmdWwiKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobVRocm93RXJyb3IpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVGFyZ2V0U2V0dXBFcnJvcigiTm90IGFsbCB0YXJnZXQgcHJlcGFyYXRpb24gc3RlcHMgY29tcGxldGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZS5nZXREZXZpY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFRhcmdldFNldHVwRXJyb3IoIkNvdWxkbid0IGZpbmQgYXBrIHRvIGluc3RydW1lbnQiLCBlLAotICAgICAgICAgICAgICAgICAgICBkZXZpY2UuZ2V0RGV2aWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bihJVGVzdERldmljZSBkZXZpY2UsIElCdWlsZEluZm8gYnVpbGRJbmZvLCBUaHJvd2FibGUgZSkKLSAgICAgICAgICAgIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbikgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtV2hlbiA9PSBXaGVuLkJFRk9SRSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbnN0cnVtZW50KGRldmljZSwgYnVpbGRJbmZvKTsKLSAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUxKSB7Ci0gICAgICAgICAgICBsb2dFcnJvcigiQ291bGRuJ3QgZmluZCBhcGsgdG8gaW5zdHJ1bWVudCIpOwotICAgICAgICAgICAgbG9nRXJyb3IoZTEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGluc3RydW1lbnQoSVRlc3REZXZpY2UgZGV2aWNlLCBJQnVpbGRJbmZvIGJ1aWxkSW5mbykKLSAgICAgICAgICAgIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIElUZXN0SW52b2NhdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRhcmdldFByZXBhcmVyTGlzdGVuZXIoKTsKLSAgICAgICAgQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyIGJ1aWxkSGVscGVyID0gbmV3IENvbXBhdGliaWxpdHlCdWlsZEhlbHBlcihidWlsZEluZm8pOwotCi0gICAgICAgIEZpbGUgYXBrRmlsZSA9IGJ1aWxkSGVscGVyLmdldFRlc3RGaWxlKG1BcGtGaWxlTmFtZSk7Ci0gICAgICAgIGlmICghYXBrRmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCIlcyBub3QgZm91bmQiLCBtQXBrRmlsZU5hbWUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkZXZpY2UuZ2V0QXBwUGFja2FnZUluZm8obVBhY2thZ2VOYW1lKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBsb2dJbmZvKCJQYWNrYWdlICVzIGFscmVhZHkgcHJlc2VudCBvbiB0aGUgZGV2aWNlLCB1bmluc3RhbGxpbmcgLi4uIiwgbVBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgIGRldmljZS51bmluc3RhbGxQYWNrYWdlKG1QYWNrYWdlTmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBsb2dJbmZvKCJJbnN0cnVtZW50aW5nIHBhY2thZ2U6ICVzIiwgbVBhY2thZ2VOYW1lKTsKLSAgICAgICAgQW5kcm9pZEpVbml0VGVzdCBpbnN0clRlc3QgPSBuZXcgQW5kcm9pZEpVbml0VGVzdCgpOwotICAgICAgICBpbnN0clRlc3Quc2V0RGV2aWNlKGRldmljZSk7Ci0gICAgICAgIGluc3RyVGVzdC5zZXRJbnN0YWxsRmlsZShhcGtGaWxlKTsKLSAgICAgICAgaW5zdHJUZXN0LnNldFBhY2thZ2VOYW1lKG1QYWNrYWdlTmFtZSk7Ci0gICAgICAgIGluc3RyVGVzdC5ydW4obGlzdGVuZXIpOwotICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSB0cnVlOwotICAgICAgICBpZiAoIXRlc3RGYWlsdXJlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGZvciAoVGVzdElkZW50aWZpZXIgdGVzdCA6IHRlc3RGYWlsdXJlcy5rZXlTZXQoKSkgewotICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdHJhY2UgPSB0ZXN0RmFpbHVyZXMuZ2V0KHRlc3QpOwotICAgICAgICAgICAgICAgIGlmIChtVGhyb3dFcnJvcikgewotICAgICAgICAgICAgICAgICAgICBsb2dFcnJvcigiVGFyZ2V0IHByZXBhcmF0aW9uIHN0ZXAgJXMgZmFpbGVkLlxuJXMiLCB0ZXN0LmdldFRlc3ROYW1lKCksIHRyYWNlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBsb2dXYXJuaW5nKCJUYXJnZXQgcHJlcGFyYXRpb24gc3RlcCAlcyBmYWlsZWQuXG4lcyIsIHRlc3QuZ2V0VGVzdE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdWNjZXNzOwotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgVGFyZ2V0UHJlcGFyZXJMaXN0ZW5lciBpbXBsZW1lbnRzIElUZXN0SW52b2NhdGlvbkxpc3RlbmVyIHsKLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgdGVzdEVuZGVkKFRlc3RJZGVudGlmaWVyIHRlc3QsIE1hcDxTdHJpbmcsIFN0cmluZz4gbWV0cmljcykgewotICAgICAgICAgICAgdGVzdE1ldHJpY3MucHV0KHRlc3QsIG1ldHJpY3MpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RGYWlsZWQoVGVzdElkZW50aWZpZXIgdGVzdCwgU3RyaW5nIHRyYWNlKSB7Ci0gICAgICAgICAgICB0ZXN0RmFpbHVyZXMucHV0KHRlc3QsIHRyYWNlKTsKLSAgICAgICAgfQotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC90YXJnZXRwcmVwL0Fwa1ByZWNvbmRpdGlvbkNoZWNrLmphdmEgYi9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC90YXJnZXRwcmVwL0Fwa1ByZWNvbmRpdGlvbkNoZWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMGI2YzIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdGFyZ2V0cHJlcC9BcGtQcmVjb25kaXRpb25DaGVjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRhcmdldHByZXA7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5jb25maWcuT3B0aW9uQ2xhc3M7Ci0KLS8qKgotICogUnVucyBhIHByZWNvbmRpdGlvbiB0ZXN0IGJ5IGluc3RydW1lbnRpbmcgYW4gQVBLCi0gKi8KLUBPcHRpb25DbGFzcyhhbGlhcz0iYXBrLXByZWNvbmRpdGlvbi1jaGVjayIpCi1wdWJsaWMgY2xhc3MgQXBrUHJlY29uZGl0aW9uQ2hlY2sgZXh0ZW5kcyBBcGtJbnN0cnVtZW50YXRpb25QcmVwYXJlciB7Ci0KLSAgICBwdWJsaWMgQXBrUHJlY29uZGl0aW9uQ2hlY2soKSB7Ci0gICAgICAgIG1XaGVuID0gV2hlbi5CRUZPUkU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC90YXJnZXRwcmVwL0J1c2luZXNzTG9naWNQcmVwYXJlci5qYXZhIGIvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdGFyZ2V0cHJlcC9CdXNpbmVzc0xvZ2ljUHJlcGFyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q0ZjcwMS4uMDAwMDAwMAotLS0gYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC90YXJnZXRwcmVwL0J1c2luZXNzTG9naWNQcmVwYXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50YXJnZXRwcmVwOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQuYnVpbGQuQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnV0aWwuRHluYW1pY0NvbmZpZ0ZpbGVSZWFkZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5CdXNpbmVzc0xvZ2ljOwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuRmVhdHVyZVV0aWw7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5Qcm9wZXJ0eVV0aWw7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuYnVpbGQuSUJ1aWxkSW5mbzsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5jb25maWcuT3B0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmNvbmZpZy5PcHRpb25DbGFzczsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5JVGVzdERldmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5sb2cuTG9nVXRpbC5DTG9nOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuQnVpbGRFcnJvcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLklUYXJnZXRDbGVhbmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuVGFyZ2V0U2V0dXBFcnJvcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5zdWl0ZS5UZXN0U3VpdGVJbmZvOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnV0aWwuRmlsZVV0aWw7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudXRpbC5NdWx0aU1hcDsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC51dGlsLlN0cmVhbVV0aWw7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudXRpbC5uZXQuSHR0cEhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC51dGlsLm5ldC5JSHR0cEhlbHBlcjsKLQotaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogUHVzaGVzIGJ1c2luZXNzIExvZ2ljIHRvIHRoZSBob3N0IGFuZCB0aGUgdGVzdCBkZXZpY2UsIGZvciB1c2UgYnkgdGVzdCBjYXNlcyBpbiB0aGUgdGVzdCBzdWl0ZS4KLSAqLwotQE9wdGlvbkNsYXNzKGFsaWFzPSJidXNpbmVzcy1sb2dpYy1wcmVwYXJlciIpCi1wdWJsaWMgY2xhc3MgQnVzaW5lc3NMb2dpY1ByZXBhcmVyIGltcGxlbWVudHMgSVRhcmdldENsZWFuZXIgewotCi0gICAgLyogUGxhY2Vob2xkZXIgaW4gdGhlIHNlcnZpY2UgVVJMIGZvciB0aGUgc3VpdGUgdG8gYmUgY29uZmlndXJlZCAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVUlURV9QTEFDRUhPTERFUiA9ICJ7c3VpdGUtbmFtZX0iOwotCi0gICAgLyogU3RyaW5nIGZvciBjcmVhdGluZyBmaWxlcyB0byBzdG9yZSB0aGUgYnVzaW5lc3MgbG9naWMgY29uZmlndXJhdGlvbiBvbiB0aGUgaG9zdCAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX0xPQ0FUSU9OID0gImJ1c2luZXNzLWxvZ2ljIjsKLSAgICAvKiBFeHRlbnNpb24gb2YgYnVzaW5lc3MgbG9naWMgZmlsZXMgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9FWFQgPSAiLmJsIjsKLQotICAgIC8qIER5bmFtaWMgY29uZmlnIGNvbnN0YW50cyAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEWU5BTUlDX0NPTkZJR19GRUFUVVJFU19LRVkgPSAiYnVzaW5lc3NfbG9naWNfZGV2aWNlX2ZlYXR1cmVzIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFlOQU1JQ19DT05GSUdfUFJPUEVSVElFU19LRVkgPSAiYnVzaW5lc3NfbG9naWNfZGV2aWNlX3Byb3BlcnRpZXMiOwotCi0gICAgQE9wdGlvbihuYW1lID0gImJ1c2luZXNzLWxvZ2ljLXVybCIsIGRlc2NyaXB0aW9uID0gIlRoZSBVUkwgdG8gdXNlIHdoZW4gYWNjZXNzaW5nIHRoZSAiICsKLSAgICAgICAgICAgICJidXNpbmVzcyBsb2dpYyBzZXJ2aWNlLCBwYXJhbWV0ZXJzIG5vdCBpbmNsdWRlZCIsIG1hbmRhdG9yeSA9IHRydWUpCi0gICAgcHJpdmF0ZSBTdHJpbmcgbVVybDsKLQotICAgIEBPcHRpb24obmFtZSA9ICJidXNpbmVzcy1sb2dpYy1hcGkta2V5IiwgZGVzY3JpcHRpb24gPSAiVGhlIEFQSSBrZXkgdG8gdXNlIHdoZW4gYWNjZXNzaW5nICIgKwotICAgICAgICAgICAgInRoZSBidXNpbmVzcyBsb2dpYyBzZXJ2aWNlLiIsIG1hbmRhdG9yeSA9IHRydWUpCi0gICAgcHJpdmF0ZSBTdHJpbmcgbUFwaUtleTsKLQotICAgIEBPcHRpb24obmFtZSA9ICJjbGVhbnVwIiwgZGVzY3JpcHRpb24gPSAiV2hldGhlciB0byByZW1vdmUgY29uZmlnIGZpbGVzIGZyb20gdGhlIHRlc3QgIiArCi0gICAgICAgICAgICAidGFyZ2V0IGFmdGVyIHRlc3QgY29tcGxldGlvbi4iKQotICAgIHByaXZhdGUgYm9vbGVhbiBtQ2xlYW51cCA9IHRydWU7Ci0KLSAgICBAT3B0aW9uKG5hbWUgPSAiaWdub3JlLWJ1c2luZXNzLWxvZ2ljLWZhaWx1cmUiLCBkZXNjcmlwdGlvbiA9ICJXaGV0aGVyIHRvIHByb2NlZWQgd2l0aCB0aGUgIiArCi0gICAgICAgICAgICAic3VpdGUgaW52b2NhdGlvbiBpZiByZXRyaWV2YWwgb2YgYnVzaW5lc3MgbG9naWMgZmFpbHMuIikKLSAgICBwcml2YXRlIGJvb2xlYW4gbUlnbm9yZUZhaWx1cmUgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgU3RyaW5nIG1EZXZpY2VGaWxlUHVzaGVkOwotICAgIHByaXZhdGUgU3RyaW5nIG1Ib3N0RmlsZVB1c2hlZDsKLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcChJVGVzdERldmljZSBkZXZpY2UsIElCdWlsZEluZm8gYnVpbGRJbmZvKSB0aHJvd3MgVGFyZ2V0U2V0dXBFcnJvciwgQnVpbGRFcnJvciwKLSAgICAgICAgICAgIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyByZXF1ZXN0U3RyaW5nID0gYnVpbGRSZXF1ZXN0U3RyaW5nKGRldmljZSwgYnVpbGRJbmZvKTsKLSAgICAgICAgLy8gUmV0cmlldmUgYnVzaW5lc3MgbG9naWMgc3RyaW5nIGZyb20gc2VydmljZQotICAgICAgICBTdHJpbmcgYnVzaW5lc3NMb2dpY1N0cmluZyA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBVUkwgcmVxdWVzdCA9IG5ldyBVUkwocmVxdWVzdFN0cmluZyk7Ci0gICAgICAgICAgICBidXNpbmVzc0xvZ2ljU3RyaW5nID0gU3RyZWFtVXRpbC5nZXRTdHJpbmdGcm9tU3RyZWFtKHJlcXVlc3Qub3BlblN0cmVhbSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKG1JZ25vcmVGYWlsdXJlKSB7Ci0gICAgICAgICAgICAgICAgQ0xvZy5lKCJGYWlsZWQgdG8gY29ubmVjdCB0byBidXNpbmVzcyBsb2dpYyBzZXJ2aWNlLlxuUHJvY2VlZGluZyB3aXRoIHRlc3QiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJpbnZvY2F0aW9uLCB0ZXN0cyBkZXBlbmRpbmcgb24gdGhlIHJlbW90ZSBjb25maWd1cmF0aW9uIHdpbGwgZmFpbC5cbiIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRhcmdldFNldHVwRXJyb3IoU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBjb25uZWN0IHRvIGJ1c2luZXNzIGxvZ2ljIHNlcnZpY2UgZm9yIHN1aXRlICVzLlxuSWYgdGhpcyBwcm9ibGVtICIKLSAgICAgICAgICAgICAgICAgICAgKyAicGVyc2lzdHMsIHJlLWludm9raW5nIHdpdGggb3B0aW9uICctLWlnbm9yZS1idXNpbmVzcy1sb2dpYy1mYWlsdXJlJyB3aWxsICIKLSAgICAgICAgICAgICAgICAgICAgKyAiY2F1c2UgdGVzdHMgdG8gZXhlY3V0ZSBhbnl3YXlzICh0aG91Z2ggdGVzdHMgZGVwZW5kaW5nIG9uIHRoZSByZW1vdGUgIgotICAgICAgICAgICAgICAgICAgICArICJjb25maWd1cmF0aW9uIHdpbGwgZmFpbCkuIiwgVGVzdFN1aXRlSW5mby5nZXRJbnN0YW5jZSgpLmdldE5hbWUoKSksIGUsCi0gICAgICAgICAgICAgICAgICAgIGRldmljZS5nZXREZXZpY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIFB1c2ggYnVzaW5lc3MgbG9naWMgc3RyaW5nIHRvIGhvc3QgZmlsZQotICAgICAgICB0cnkgewotICAgICAgICAgICAgRmlsZSBob3N0RmlsZSA9IEZpbGVVdGlsLmNyZWF0ZVRlbXBGaWxlKEZJTEVfTE9DQVRJT04sIEZJTEVfRVhUKTsKLSAgICAgICAgICAgIEZpbGVVdGlsLndyaXRlVG9GaWxlKGJ1c2luZXNzTG9naWNTdHJpbmcsIGhvc3RGaWxlKTsKLSAgICAgICAgICAgIG1Ib3N0RmlsZVB1c2hlZCA9IGhvc3RGaWxlLmdldEFic29sdXRlUGF0aCgpOwotICAgICAgICAgICAgQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyIGJ1aWxkSGVscGVyID0gbmV3IENvbXBhdGliaWxpdHlCdWlsZEhlbHBlcihidWlsZEluZm8pOwotICAgICAgICAgICAgYnVpbGRIZWxwZXIuc2V0QnVzaW5lc3NMb2dpY0hvc3RGaWxlKGhvc3RGaWxlKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFRhcmdldFNldHVwRXJyb3IoU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgIlJldHJpZXZlZCBidXNpbmVzcyBsb2dpYyBmb3Igc3VpdGUgJXMgY291bGQgbm90IGJlIHdyaXR0ZW4gdG8gaG9zdCIsCi0gICAgICAgICAgICAgICAgICAgIFRlc3RTdWl0ZUluZm8uZ2V0SW5zdGFuY2UoKS5nZXROYW1lKCkpLCBkZXZpY2UuZ2V0RGV2aWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgfQotICAgICAgICAvLyBQdXNoIGJ1c2luZXNzIGxvZ2ljIHN0cmluZyB0byBkZXZpY2UgZmlsZQotICAgICAgICByZW1vdmVEZXZpY2VGaWxlKGRldmljZSk7IC8vIHJlbW92ZSBhbnkgZXhpc3RpbmcgYnVzaW5lc3MgbG9naWMgZmlsZSBmcm9tIGRldmljZQotICAgICAgICBpZiAoZGV2aWNlLnB1c2hTdHJpbmcoYnVzaW5lc3NMb2dpY1N0cmluZywgQnVzaW5lc3NMb2dpYy5ERVZJQ0VfRklMRSkpIHsKLSAgICAgICAgICAgIG1EZXZpY2VGaWxlUHVzaGVkID0gQnVzaW5lc3NMb2dpYy5ERVZJQ0VfRklMRTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBUYXJnZXRTZXR1cEVycm9yKFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICJSZXRyaWV2ZWQgYnVzaW5lc3MgbG9naWMgZm9yIHN1aXRlICVzIGNvdWxkIG5vdCBiZSB3cml0dGVuIHRvIGRldmljZSAlcyIsCi0gICAgICAgICAgICAgICAgICAgIFRlc3RTdWl0ZUluZm8uZ2V0SW5zdGFuY2UoKS5nZXROYW1lKCksIGRldmljZS5nZXRTZXJpYWxOdW1iZXIoKSksCi0gICAgICAgICAgICAgICAgICAgIGRldmljZS5nZXREZXZpY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIEhlbHBlciB0byBwb3B1bGF0ZSB0aGUgYnVzaW5lc3MgbG9naWMgc2VydmljZSByZXF1ZXN0IHdpdGggaW5mbyBhYm91dCB0aGUgZGV2aWNlLiAqLwotICAgIHByaXZhdGUgU3RyaW5nIGJ1aWxkUmVxdWVzdFN0cmluZyhJVGVzdERldmljZSBkZXZpY2UsIElCdWlsZEluZm8gYnVpbGRJbmZvKQotICAgICAgICAgICAgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIENvbXBhdGliaWxpdHlCdWlsZEhlbHBlciBidWlsZEhlbHBlciA9IG5ldyBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIoYnVpbGRJbmZvKTsKLSAgICAgICAgU3RyaW5nIGJhc2VVcmwgPSBtVXJsLnJlcGxhY2UoU1VJVEVfUExBQ0VIT0xERVIsIGdldFN1aXRlTmFtZSgpKTsKLSAgICAgICAgTXVsdGlNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtTWFwID0gbmV3IE11bHRpTWFwPD4oKTsKLSAgICAgICAgcGFyYW1NYXAucHV0KCJrZXkiLCBtQXBpS2V5KTsKLSAgICAgICAgcGFyYW1NYXAucHV0KCJzdWl0ZV92ZXJzaW9uIiwgYnVpbGRIZWxwZXIuZ2V0U3VpdGVWZXJzaW9uKCkpOwotICAgICAgICBwYXJhbU1hcC5wdXQoIm9lbSIsIFByb3BlcnR5VXRpbC5nZXRNYW51ZmFjdHVyZXIoZGV2aWNlKSk7Ci0gICAgICAgIGZvciAoU3RyaW5nIGZlYXR1cmUgOiBnZXRCdXNpbmVzc0xvZ2ljRmVhdHVyZXMoZGV2aWNlLCBidWlsZEluZm8pKSB7Ci0gICAgICAgICAgICBwYXJhbU1hcC5wdXQoImZlYXR1cmVzIiwgZmVhdHVyZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChTdHJpbmcgcHJvcGVydHkgOiBnZXRCdXNpbmVzc0xvZ2ljUHJvcGVydGllcyhkZXZpY2UsIGJ1aWxkSW5mbykpIHsKLSAgICAgICAgICAgIHBhcmFtTWFwLnB1dCgicHJvcGVydGllcyIsIHByb3BlcnR5KTsKLSAgICAgICAgfQotICAgICAgICBJSHR0cEhlbHBlciBoZWxwZXIgPSBuZXcgSHR0cEhlbHBlcigpOwotICAgICAgICByZXR1cm4gaGVscGVyLmJ1aWxkVXJsKGJhc2VVcmwsIHBhcmFtTWFwKTsKLSAgICB9Ci0KLSAgICAvKiBHZXQgZGV2aWNlIHByb3BlcnRpZXMgbGlzdCwgd2l0aCBlbGVtZW50IGZvcm1hdCAiPHByb3BlcnR5X25hbWU+Ojxwcm9wZXJ0eV92YWx1ZT4iICovCi0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gZ2V0QnVzaW5lc3NMb2dpY1Byb3BlcnRpZXMoSVRlc3REZXZpY2UgZGV2aWNlLCBJQnVpbGRJbmZvIGJ1aWxkSW5mbykKLSAgICAgICAgICAgIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBMaXN0PFN0cmluZz4gcHJvcGVydGllcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGNsaWVudElkcyA9IFByb3BlcnR5VXRpbC5nZXRDbGllbnRJZHMoZGV2aWNlKTsKLSAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IGlkIDogY2xpZW50SWRzLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgIC8vIGFkZCBjbGllbnQgSURzIHRvIHRoZSBsaXN0IG9mIHByb3BlcnRpZXMKLSAgICAgICAgICAgIHByb3BlcnRpZXMuYWRkKFN0cmluZy5mb3JtYXQoIiVzOiVzIiwgaWQuZ2V0S2V5KCksIGlkLmdldFZhbHVlKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcHJvcGVydHlOYW1lcyA9IER5bmFtaWNDb25maWdGaWxlUmVhZGVyLmdldFZhbHVlc0Zyb21Db25maWcoYnVpbGRJbmZvLAotICAgICAgICAgICAgICAgICAgICBnZXRTdWl0ZU5hbWUoKSwgRFlOQU1JQ19DT05GSUdfUFJPUEVSVElFU19LRVkpOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgbmFtZSA6IHByb3BlcnR5TmFtZXMpIHsKLSAgICAgICAgICAgICAgICAvLyBVc2UgU3RyaW5nLnZhbHVlT2YgaW4gY2FzZSBwcm9wZXJ0eSBpcyB1bmRlZmluZWQgZm9yIHRoZSBkZXZpY2UgKCJudWxsIikKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBTdHJpbmcudmFsdWVPZihkZXZpY2UuZ2V0UHJvcGVydHkobmFtZSkpOwotICAgICAgICAgICAgICAgIHByb3BlcnRpZXMuYWRkKFN0cmluZy5mb3JtYXQoIiVzOiVzIiwgbmFtZSwgdmFsdWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB8IElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIENMb2cuZSgiRmFpbGVkIHRvIHB1bGwgYnVzaW5lc3MgbG9naWMgcHJvcGVydGllcyBmcm9tIGR5bmFtaWMgY29uZmlnIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHByb3BlcnRpZXM7Ci0gICAgfQotCi0gICAgLyogR2V0IGRldmljZSBmZWF0dXJlcyBsaXN0ICovCi0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gZ2V0QnVzaW5lc3NMb2dpY0ZlYXR1cmVzKElUZXN0RGV2aWNlIGRldmljZSwgSUJ1aWxkSW5mbyBidWlsZEluZm8pCi0gICAgICAgICAgICB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBkeW5hbWljQ29uZmlnRmVhdHVyZXMgPSBEeW5hbWljQ29uZmlnRmlsZVJlYWRlci5nZXRWYWx1ZXNGcm9tQ29uZmlnKAotICAgICAgICAgICAgICAgICAgICBidWlsZEluZm8sIGdldFN1aXRlTmFtZSgpLCBEWU5BTUlDX0NPTkZJR19GRUFUVVJFU19LRVkpOwotICAgICAgICAgICAgU2V0PFN0cmluZz4gZGV2aWNlRmVhdHVyZXMgPSBGZWF0dXJlVXRpbC5nZXRBbGxGZWF0dXJlcyhkZXZpY2UpOwotICAgICAgICAgICAgZHluYW1pY0NvbmZpZ0ZlYXR1cmVzLnJldGFpbkFsbChkZXZpY2VGZWF0dXJlcyk7Ci0gICAgICAgICAgICByZXR1cm4gZHluYW1pY0NvbmZpZ0ZlYXR1cmVzOwotICAgICAgICB9IGNhdGNoIChYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHwgSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgQ0xvZy5lKCJGYWlsZWQgdG8gcHVsbCBidXNpbmVzcyBsb2dpYyBmZWF0dXJlcyBmcm9tIGR5bmFtaWMgY29uZmlnIik7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRTdWl0ZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBUZXN0U3VpdGVJbmZvLmdldEluc3RhbmNlKCkuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKElUZXN0RGV2aWNlIGRldmljZSwgSUJ1aWxkSW5mbyBidWlsZEluZm8sIFRocm93YWJsZSBlKQotICAgICAgICAgICAgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIENsZWFuIHVwIGhvc3QgZmlsZQotICAgICAgICBpZiAobUNsZWFudXApIHsKLSAgICAgICAgICAgIGlmIChtSG9zdEZpbGVQdXNoZWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEZpbGVVdGlsLmRlbGV0ZUZpbGUobmV3IEZpbGUobUhvc3RGaWxlUHVzaGVkKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobURldmljZUZpbGVQdXNoZWQgIT0gbnVsbCAmJiAhKGUgaW5zdGFuY2VvZiBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24pKSB7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlRGV2aWNlRmlsZShkZXZpY2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIFJlbW92ZSBidXNpbmVzcyBsb2dpYyBmaWxlIGZyb20gdGhlIGRldmljZSAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVtb3ZlRGV2aWNlRmlsZShJVGVzdERldmljZSBkZXZpY2UpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBkZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZChTdHJpbmcuZm9ybWF0KCJybSAtcmYgJXMiLCBCdXNpbmVzc0xvZ2ljLkRFVklDRV9GSUxFKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdGFyZ2V0cHJlcC9DcmFzaFJlcG9ydGVyLmphdmEgYi9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC90YXJnZXRwcmVwL0NyYXNoUmVwb3J0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE3NDk4ZC4uMDAwMDAwMAotLS0gYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC90YXJnZXRwcmVwL0NyYXNoUmVwb3J0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGFyZ2V0cHJlcDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ3Jhc2hVdGlsczsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuTG9nLkxvZ0xldmVsOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5NdWx0aUxpbmVSZWNlaXZlcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5idWlsZC5JQnVpbGRJbmZvOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5CYWNrZ3JvdW5kRGV2aWNlQWN0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5EZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLklUZXN0RGV2aWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmxvZy5Mb2dVdGlsLkNMb2c7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5JVGFyZ2V0Q2xlYW5lcjsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwotaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKLWltcG9ydCBqYXZhLm5pby5maWxlLmF0dHJpYnV0ZS5Qb3NpeEZpbGVQZXJtaXNzaW9uczsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBvcmcuanNvbi5KU09OQXJyYXk7Ci0KLS8qKgotICogU3RhcnRzIGFuZCBraWxscyB0aGUgY3Jhc2ggcmVwb3J0ZXIgdGhyZWFkLiBUaGlzIHRocmVhZCB1cGxvYWRzIGNyYXNoIHJlc3VsdHMgdG8gZGV2aWNlcyBhcyB0aGV5Ci0gKiBvY2N1cnJpbmcgYWxsb3dpbmcgZm9yIGRldmljZSBzaWRlIGNyYXNoIGFuYWx5c2lzLgotICovCi1wdWJsaWMgY2xhc3MgQ3Jhc2hSZXBvcnRlciBpbXBsZW1lbnRzIElUYXJnZXRDbGVhbmVyIHsKLQotICAgIHByaXZhdGUgQmFja2dyb3VuZERldmljZUFjdGlvbiBtQmFja2dyb3VuZFRocmVhZDsKLQotICAgIC8qKiBVcGxvYWRzIHRoZSBjdXJyZW50IGJ1ZmZlciBvZiBDcmFzaGVzIHRvIHRoZSBwaG9uZSB1bmRlciB0aGUgY3VycmVudCB0ZXN0IG5hbWUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB1cGxvYWQoSVRlc3REZXZpY2UgZGV2aWNlLCBTdHJpbmcgdGVzdG5hbWUsIEpTT05BcnJheSBjcmFzaGVzKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAodGVzdG5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIENMb2cubG9nQW5kRGlzcGxheShMb2dMZXZlbC5FUlJPUiwgIkF0dGVtcHRlZCB1cGxvYWQgd2l0aCBubyB0ZXN0IG5hbWUiKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZCgKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgicm0gLWYgJXMlcyIsIENyYXNoVXRpbHMuREVWSUNFX1BBVEgsIENyYXNoVXRpbHMuTE9DS19GSUxFTkFNRSkpOwotICAgICAgICAgICAgUGF0aCB0bXBQYXRoID0gRmlsZXMuY3JlYXRlVGVtcEZpbGUodGVzdG5hbWUsICIudHh0Iik7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEZpbGVzLnNldFBvc2l4RmlsZVBlcm1pc3Npb25zKAotICAgICAgICAgICAgICAgICAgICAgICAgdG1wUGF0aCwgUG9zaXhGaWxlUGVybWlzc2lvbnMuZnJvbVN0cmluZygicnctci0tci0tIikpOwotICAgICAgICAgICAgICAgIEZpbGUgcmVwb3J0RmlsZSA9IHRtcFBhdGgudG9GaWxlKCk7Ci0gICAgICAgICAgICAgICAgdHJ5IChCdWZmZXJlZFdyaXRlciB3cml0ZXIgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIocmVwb3J0RmlsZSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZShjcmFzaGVzLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZXZpY2UucHVzaEZpbGUocmVwb3J0RmlsZSwgQ3Jhc2hVdGlscy5ERVZJQ0VfUEFUSCArIHRlc3RuYW1lKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgRmlsZXMuZGVsZXRlSWZFeGlzdHModG1wUGF0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZCgKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgidG91Y2ggJXMlcyIsIENyYXNoVXRpbHMuREVWSUNFX1BBVEgsIENyYXNoVXRpbHMuTE9DS19GSUxFTkFNRSkpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiB8IFJ1bnRpbWVFeGNlcHRpb24gfCBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgQ0xvZy5sb2dBbmREaXNwbGF5KExvZ0xldmVsLkVSUk9SLCAiVXBsb2FkIHRvIGRldmljZSBmYWlsZWQiKTsKLSAgICAgICAgICAgIENMb2cubG9nQW5kRGlzcGxheShMb2dMZXZlbC5FUlJPUiwgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIHtAaW5oZXJpdERvY30gKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcChJVGVzdERldmljZSBkZXZpY2UsIElCdWlsZEluZm8gYnVpbGRJbmZvKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBkZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZCgicm0gLXJmICIgKyBDcmFzaFV0aWxzLkRFVklDRV9QQVRIKTsKLSAgICAgICAgICAgIGRldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKCJta2RpciAiICsgQ3Jhc2hVdGlscy5ERVZJQ0VfUEFUSCk7Ci0gICAgICAgIH0gY2F0Y2ggKERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBDTG9nLmxvZ0FuZERpc3BsYXkoCi0gICAgICAgICAgICAgICAgICAgIExvZ0xldmVsLkVSUk9SLAotICAgICAgICAgICAgICAgICAgICAiQ3Jhc2hSZXBvcnRlclRocmVhZCBmYWlsZWQgdG8gc2V0dXAgc3RvcmFnZSBkaXJlY3Rvcnkgb24gZGV2aWNlIik7Ci0gICAgICAgICAgICBDTG9nLmxvZ0FuZERpc3BsYXkoTG9nTGV2ZWwuRVJST1IsIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtQmFja2dyb3VuZFRocmVhZCA9Ci0gICAgICAgICAgICAgICAgbmV3IEJhY2tncm91bmREZXZpY2VBY3Rpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAibG9nY2F0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJDcmFzaFJlcG9ydGVyIGxvZ2NhdCB0aHJlYWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENyYXNoUmVwb3J0ZXJSZWNlaXZlcihkZXZpY2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgMCk7Ci0gICAgICAgIG1CYWNrZ3JvdW5kVGhyZWFkLnN0YXJ0KCk7Ci0gICAgfQotCi0gICAgLyoqIHtAaW5oZXJpdERvY30gKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bihJVGVzdERldmljZSBkZXZpY2UsIElCdWlsZEluZm8gYnVpbGRJbmZvLCBUaHJvd2FibGUgZSkgewotICAgICAgICBpZiAobUJhY2tncm91bmRUaHJlYWQgIT0gbnVsbCkgewotICAgICAgICAgICAgbUJhY2tncm91bmRUaHJlYWQuY2FuY2VsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTY2FucyB0aHJvdWdoIGxpbmVzIHJlY2VpdmVkLCBwYXJzZXMgb3V0IGNyYXNoZXMsIGFuZCBzdG9yZXMgdGhlbSBpbnRvIGEgYnVmZmVyLiBXaGVuIGEgbmV3Ci0gICAgICogdGVzdCBzdGFydGVkIHNpZ25hbCBpcyByZWNlaXZlZCB0aGUgYnVmZmVyZWQgaXMgY2xlYXJlZC4gV2hlbiBhbiB1cGxvYWQgc2lnbmFsIGlzIHJlY2VpdmVkCi0gICAgICogdXBsb2FkcyB0aGUgY3VycmVudCBidWZmZXIgdG8gdGhlIHBob25lLgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgQ3Jhc2hSZXBvcnRlclJlY2VpdmVyIGV4dGVuZHMgTXVsdGlMaW5lUmVjZWl2ZXIgewotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIG1UZXN0TmFtZTsKLSAgICAgICAgcHJpdmF0ZSBKU09OQXJyYXkgbUNyYXNoZXM7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nQnVpbGRlciBtTG9nY2F0Q2h1bmsgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBwcml2YXRlIElUZXN0RGV2aWNlIG1EZXZpY2U7Ci0KLSAgICAgICAgcHVibGljIENyYXNoUmVwb3J0ZXJSZWNlaXZlcihJVGVzdERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgICAgIG1EZXZpY2UgPSBkZXZpY2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0xvZ0xpbmUoU3RyaW5nIGxpbmUpIHsKLSAgICAgICAgICAgIG1Mb2djYXRDaHVuay5hcHBlbmQobGluZSk7Ci0gICAgICAgICAgICBtTG9nY2F0Q2h1bmsuYXBwZW5kKCdcbicpOwotICAgICAgICAgICAgTWF0Y2hlciBtOwotICAgICAgICAgICAgaWYgKChtID0gQ3Jhc2hVdGlscy5zTmV3VGVzdFBhdHRlcm4ubWF0Y2hlcihsaW5lKSkuZmluZCgpKSB7Ci0gICAgICAgICAgICAgICAgbVRlc3ROYW1lID0gbS5ncm91cCgxKTsKLSAgICAgICAgICAgICAgICBtQ3Jhc2hlcyA9IG5ldyBKU09OQXJyYXkoKTsKLSAgICAgICAgICAgICAgICBtTG9nY2F0Q2h1bmsuc2V0TGVuZ3RoKDApOwotICAgICAgICAgICAgfSBlbHNlIGlmIChDcmFzaFV0aWxzLnNFbmRvZkNyYXNoUGF0dGVybi5tYXRjaGVyKGxpbmUpLmZpbmQoKSkgewotICAgICAgICAgICAgICAgIENyYXNoVXRpbHMuYWRkQWxsQ3Jhc2hlcyhtTG9nY2F0Q2h1bmsudG9TdHJpbmcoKSwgbUNyYXNoZXMpOwotICAgICAgICAgICAgICAgIG1Mb2djYXRDaHVuay5zZXRMZW5ndGgoMCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKENyYXNoVXRpbHMuc1VwbG9hZFJlcXVlc3RQYXR0ZXJuLm1hdGNoZXIobGluZSkuZmluZCgpKSB7Ci0gICAgICAgICAgICAgICAgdXBsb2FkKG1EZXZpY2UsIG1UZXN0TmFtZSwgbUNyYXNoZXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NOZXdMaW5lcyhTdHJpbmdbXSBsaW5lcykgewotICAgICAgICAgICAgaWYgKCFpc0NhbmNlbGxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgbGluZSA6IGxpbmVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NMb2dMaW5lKGxpbmUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGxlZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQmFja2dyb3VuZFRocmVhZCA9PSBudWxsIHx8IG1CYWNrZ3JvdW5kVGhyZWFkLmlzQ2FuY2VsbGVkKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC90YXJnZXRwcmVwL0RldmljZUZpbGVDb2xsZWN0b3IuamF2YSBiL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3RhcmdldHByZXAvRGV2aWNlRmlsZUNvbGxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTFhYzI3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3RhcmdldHByZXAvRGV2aWNlRmlsZUNvbGxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRhcmdldHByZXA7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC5idWlsZC5Db21wYXRpYmlsaXR5QnVpbGRIZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGVzdHR5cGUuQ29tcGF0aWJpbGl0eVRlc3Q7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuYnVpbGQuSUJ1aWxkSW5mbzsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5jb25maWcuT3B0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5EZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLklUZXN0RGV2aWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmxvZy5Mb2dVdGlsLkNMb2c7Ci0KLWltcG9ydCBqYXZhLm5pby5maWxlLlBhdGhzOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi0vKioKLSAqIEFuIHtAbGluayBQcmVjb25kaXRpb25QcmVwYXJlcn0gdGhhdCBjb2xsZWN0cyBvbmUgZGV2aWNlIGZpbGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXZpY2VGaWxlQ29sbGVjdG9yIGV4dGVuZHMgUHJlY29uZGl0aW9uUHJlcGFyZXIgewotCi0gICAgQE9wdGlvbihuYW1lID0gQ29tcGF0aWJpbGl0eVRlc3QuU0tJUF9ERVZJQ0VfSU5GT19PUFRJT04sCi0gICAgICAgICAgICBzaG9ydE5hbWUgPSAnZCcsCi0gICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICJXaGV0aGVyIGRldmljZSBpbmZvIGNvbGxlY3Rpb24gc2hvdWxkIGJlIHNraXBwZWQiKQotICAgIHByaXZhdGUgYm9vbGVhbiBtU2tpcERldmljZUluZm8gPSBmYWxzZTsKLQotICAgIEBPcHRpb24obmFtZSA9ICJzcmMtZmlsZSIsIGRlc2NyaXB0aW9uID0gIlRoZSBmaWxlIHBhdGggdG8gY29weSB0byB0aGUgcmVzdWx0cyBkaXIiKQotICAgIHByaXZhdGUgU3RyaW5nIG1TcmNGaWxlOwotCi0gICAgQE9wdGlvbihuYW1lID0gImRlc3QtZmlsZSIsIGRlc2NyaXB0aW9uID0gIlRoZSBkZXN0aW5hdGlvbiBmaWxlIHBhdGggdW5kZXIgdGhlIHJlc3VsdCIpCi0gICAgcHJpdmF0ZSBTdHJpbmcgbURlc3RGaWxlOwotCi0gICAgLyoqCi0gICAgICogSWYgZGV2aWNlLmdldFByb3BlcnR5KGtleSkgaXMgbm90IHZhbHVlIGZvciBhbGwgcHJvcGVydGllcyBsaXN0ZWQsIHRoZSBjb2xsZWN0aW9uIHdpbGwgYmUKLSAgICAgKiBza2lwcGVkLiBJZiB0aGlzIG1hcCBpcyBlbXB0eSwgbVNyY0ZpbGUgd2lsbCBhbHdheXMgYmUgY29sbGVjdGVkLgotICAgICAqCi0gICAgICogVGhpcyBjYW4gYmUgc3BlY2lmaWVkIGJ5IHRoZSBmb2xsb3dpbmcgb3B0aW9uOgotICAgICAqIHtAY29kZSA8b3B0aW9uIG5hbWU9InByb3BlcnR5IiBrZXk9ImZvbyIgdmFsdWU9ImJhciIvPn0KLSAgICAgKi8KLSAgICBAT3B0aW9uKG5hbWUgPSAicHJvcGVydHkiLCBkZXNjcmlwdGlvbiA9ICJydW4gdGhpcyB0ZXN0IG9uIGRldmljZSB3aXRoIHRoaXMgcHJvcGVydHkgdmFsdWUiKQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBtUHJvcGVydHlNYXAgPSBuZXcgSGFzaE1hcDw+KCk7Ci0KLSAgICBwcml2YXRlIEZpbGUgbVJlc3VsdEZpbGU7Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcnVuKElUZXN0RGV2aWNlIGRldmljZSwgSUJ1aWxkSW5mbyBidWlsZEluZm8pIHsKLSAgICAgICAgaWYgKG1Ta2lwRGV2aWNlSW5mbykKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBpZiAoIW1hdGNoUHJvcGVydGllcyhkZXZpY2UpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGNyZWF0ZVJlc3VsdERpcihidWlsZEluZm8pOwotICAgICAgICBpZiAobVJlc3VsdEZpbGUgIT0gbnVsbCAmJiAhbVJlc3VsdEZpbGUuaXNEaXJlY3RvcnkoKSAmJgotICAgICAgICAgICAgbVNyY0ZpbGUgIT0gbnVsbCAmJiAhbVNyY0ZpbGUuaXNFbXB0eSgpKSB7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRldmljZS5kb2VzRmlsZUV4aXN0KG1TcmNGaWxlKSkgewotICAgICAgICAgICAgICAgICAgICBkZXZpY2UucHVsbEZpbGUobVNyY0ZpbGUsIG1SZXN1bHRGaWxlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBDTG9nLncoU3RyaW5nLmZvcm1hdCgiRmlsZSBkb2VzIG5vdCBleGlzdCBvbiBkZXZpY2U6IFwiJXNcIiIsIG1TcmNGaWxlKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBDTG9nLmUoIkNhdWdodCBleGNlcHRpb24gZHVyaW5nIHB1bGwuIik7Ci0gICAgICAgICAgICAgICAgQ0xvZy5lKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVJlc3VsdERpcihJQnVpbGRJbmZvIGJ1aWxkSW5mbykgewotICAgICAgICBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIgYnVpbGRIZWxwZXIgPSBuZXcgQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyKGJ1aWxkSW5mbyk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBGaWxlIHJlc3VsdERpciA9IGJ1aWxkSGVscGVyLmdldFJlc3VsdERpcigpOwotICAgICAgICAgICAgaWYgKG1EZXN0RmlsZSA9PSBudWxsIHx8IG1EZXN0RmlsZS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBtRGVzdEZpbGUgPSBQYXRocy5nZXQobVNyY0ZpbGUpLmdldEZpbGVOYW1lKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1SZXN1bHRGaWxlID0gUGF0aHMuZ2V0KHJlc3VsdERpci5nZXRBYnNvbHV0ZVBhdGgoKSwgbURlc3RGaWxlKS50b0ZpbGUoKTsKLSAgICAgICAgICAgIHJlc3VsdERpciA9IG1SZXN1bHRGaWxlLmdldFBhcmVudEZpbGUoKTsKLSAgICAgICAgICAgIHJlc3VsdERpci5ta2RpcnMoKTsKLSAgICAgICAgICAgIGlmICghcmVzdWx0RGlyLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgICAgICBDTG9nLmUoIiVzIGlzIG5vdCBhIGRpcmVjdG9yeSIsIHJlc3VsdERpci5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZm5mZSkgewotICAgICAgICAgICAgZm5mZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBtYXRjaFByb3BlcnRpZXMoSVRlc3REZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBwcm9wRW50cnkgOiBtUHJvcGVydHlNYXAuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYWN0dWFsVmFsdWUgPSBkZXZpY2UuZ2V0UHJvcGVydHkocHJvcEVudHJ5LmdldEtleSgpKTsKLSAgICAgICAgICAgICAgICBpZiAoIXByb3BFbnRyeS5nZXRWYWx1ZSgpLmVxdWFscyhhY3R1YWxWYWx1ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgQ0xvZy5pKCJTa2lwcGluZyAnJXMnIGJlY2F1c2UgcHJvcGVydHkgZG9lc24ndCBtYXRjaC4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiKGtleT0lcywgZXhwZWN0ZWQ9JXMsIGFjdHVhbD0lcykiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNyY0ZpbGUsIHByb3BFbnRyeS5nZXRLZXkoKSwgcHJvcEVudHJ5LmdldFZhbHVlKCksIGFjdHVhbFZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgQ0xvZy5lKCJDYXVnaHQgZXhjZXB0aW9uIGR1cmluZyBwcm9wZXJ0eSBjaGVjay4iKTsKLSAgICAgICAgICAgICAgICBDTG9nLmUoZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3RhcmdldHByZXAvRGV2aWNlSW5mb0NvbGxlY3Rvci5qYXZhIGIvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdGFyZ2V0cHJlcC9EZXZpY2VJbmZvQ29sbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhODZmZTkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdGFyZ2V0cHJlcC9EZXZpY2VJbmZvQ29sbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGFyZ2V0cHJlcDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRlc3R0eXBlLkNvbXBhdGliaWxpdHlUZXN0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuRGV2aWNlSW5mbzsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkRldmljZVByb3BlcnR5SW5mbzsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5idWlsZC5JQnVpbGRJbmZvOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmNvbmZpZy5PcHRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLkRldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuSVRlc3REZXZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQubG9nLklUZXN0TG9nZ2VyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmxvZy5Mb2dVdGlsLkNMb2c7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQucmVzdWx0LkZpbGVJbnB1dFN0cmVhbVNvdXJjZTsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5yZXN1bHQuSVRlc3RMb2dnZXJSZWNlaXZlcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5yZXN1bHQuTG9nRGF0YVR5cGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5CdWlsZEVycm9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuVGFyZ2V0U2V0dXBFcnJvcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC51dGlsLkZpbGVVdGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLQotLyoqCi0gKiBBbiB7QGxpbmsgQXBrSW5zdHJ1bWVudGF0aW9uUHJlcGFyZXJ9IHRoYXQgY29sbGVjdHMgZGV2aWNlIGluZm8uCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXZpY2VJbmZvQ29sbGVjdG9yIGV4dGVuZHMgQXBrSW5zdHJ1bWVudGF0aW9uUHJlcGFyZXIgaW1wbGVtZW50cyBJVGVzdExvZ2dlclJlY2VpdmVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQkkgPSAicm8ucHJvZHVjdC5jcHUuYWJpIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJJMiA9ICJyby5wcm9kdWN0LmNwdS5hYmkyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJJUyA9ICJyby5wcm9kdWN0LmNwdS5hYmlsaXN0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJJU18zMiA9ICJyby5wcm9kdWN0LmNwdS5hYmlsaXN0MzIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQklTXzY0ID0gInJvLnByb2R1Y3QuY3B1LmFiaWxpc3Q2NCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJPQVJEID0gInJvLnByb2R1Y3QuYm9hcmQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCUkFORCA9ICJyby5wcm9kdWN0LmJyYW5kIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVWSUNFID0gInJvLnByb2R1Y3QuZGV2aWNlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklOR0VSUFJJTlQgPSAicm8uYnVpbGQuZmluZ2VycHJpbnQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJyby5idWlsZC5pZCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1BTlVGQUNUVVJFUiA9ICJyby5wcm9kdWN0Lm1hbnVmYWN0dXJlciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1PREVMID0gInJvLnByb2R1Y3QubW9kZWwiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUID0gInJvLnByb2R1Y3QubmFtZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRkVSRU5DRV9GSU5HRVJQUklOVCA9ICJyby5idWlsZC5yZWZlcmVuY2UuZmluZ2VycHJpbnQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJJQUwgPSAicm8uc2VyaWFsbm8iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdTID0gInJvLmJ1aWxkLnRhZ3MiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFID0gInJvLmJ1aWxkLnR5cGUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX0JBU0VfT1MgPSAicm8uYnVpbGQudmVyc2lvbi5iYXNlX29zIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9SRUxFQVNFID0gInJvLmJ1aWxkLnZlcnNpb24ucmVsZWFzZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fU0RLID0gInJvLmJ1aWxkLnZlcnNpb24uc2RrIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9TRUNVUklUWV9QQVRDSCA9ICJyby5idWlsZC52ZXJzaW9uLnNlY3VyaXR5X3BhdGNoIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9JTkNSRU1FTlRBTCA9ICJyby5idWlsZC52ZXJzaW9uLmluY3JlbWVudGFsIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfVEFHID0gImN0czpidWlsZF8iOwotCi0gICAgQE9wdGlvbihuYW1lID0gQ29tcGF0aWJpbGl0eVRlc3QuU0tJUF9ERVZJQ0VfSU5GT19PUFRJT04sCi0gICAgICAgICAgICBzaG9ydE5hbWUgPSAnZCcsCi0gICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICJXaGV0aGVyIGRldmljZSBpbmZvIGNvbGxlY3Rpb24gc2hvdWxkIGJlIHNraXBwZWQiKQotICAgIHByaXZhdGUgYm9vbGVhbiBtU2tpcERldmljZUluZm8gPSBmYWxzZTsKLQotICAgIEBPcHRpb24obmFtZT0gInNyYy1kaXIiLCBkZXNjcmlwdGlvbiA9ICJUaGUgZGlyZWN0b3J5IHRvIGNvcHkgdG8gdGhlIHJlc3VsdHMgZGlyIikKLSAgICBwcml2YXRlIFN0cmluZyBtU3JjRGlyOwotCi0gICAgQE9wdGlvbihuYW1lID0gImRlc3QtZGlyIiwgZGVzY3JpcHRpb24gPSAiVGhlIGRpcmVjdG9yeSB1bmRlciB0aGUgcmVzdWx0IHRvIHN0b3JlIHRoZSBmaWxlcyIpCi0gICAgcHJpdmF0ZSBTdHJpbmcgbURlc3REaXIgPSBEZXZpY2VJbmZvLlJFU1VMVF9ESVJfTkFNRTsKLQotICAgIEBEZXByZWNhdGVkCi0gICAgQE9wdGlvbihuYW1lID0gInRlbXAtZGlyIiwgZGVzY3JpcHRpb24gPSAiVGhlIGRpcmVjdG9yeSBjb250YWluaW5nIGhvc3Qtc2lkZSBkZXZpY2UgaW5mbyBmaWxlcyIpCi0gICAgcHJpdmF0ZSBTdHJpbmcgbVRlbXBEaXI7Ci0KLSAgICBwcml2YXRlIElUZXN0TG9nZ2VyIG1Mb2dnZXI7Ci0KLSAgICBwdWJsaWMgRGV2aWNlSW5mb0NvbGxlY3RvcigpIHsKLSAgICAgICAgbVdoZW4gPSBXaGVuLkJFRk9SRTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcChJVGVzdERldmljZSBkZXZpY2UsIElCdWlsZEluZm8gYnVpbGRJbmZvKSB0aHJvd3MgVGFyZ2V0U2V0dXBFcnJvciwKLSAgICAgICAgICAgIEJ1aWxkRXJyb3IsIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIERldmljZVByb3BlcnR5SW5mbyBkZXZpY2VQcm9wZXJ0eUluZm8gPSBuZXcgRGV2aWNlUHJvcGVydHlJbmZvKEFCSSwgQUJJMiwgQUJJUywgQUJJU18zMiwKLSAgICAgICAgICAgICAgICBBQklTXzY0LCBCT0FSRCwgQlJBTkQsIERFVklDRSwgRklOR0VSUFJJTlQsIElELCBNQU5VRkFDVFVSRVIsIE1PREVMLCBQUk9EVUNULAotICAgICAgICAgICAgICAgIFJFRkVSRU5DRV9GSU5HRVJQUklOVCwgU0VSSUFMLCBUQUdTLCBUWVBFLCBWRVJTSU9OX0JBU0VfT1MsIFZFUlNJT05fUkVMRUFTRSwKLSAgICAgICAgICAgICAgICBWRVJTSU9OX1NESywgVkVSU0lPTl9TRUNVUklUWV9QQVRDSCwgVkVSU0lPTl9JTkNSRU1FTlRBTCk7Ci0KLSAgICAgICAgLy8gYWRkIGRldmljZSBwcm9wZXJ0aWVzIHRvIHRoZSByZXN1bHQgd2l0aCBhIHByZWZpeCB0YWcgZm9yIGVhY2gga2V5Ci0gICAgICAgIGZvciAoRW50cnk8U3RyaW5nLCBTdHJpbmc+IGVudHJ5IDoKLSAgICAgICAgICAgICAgICBkZXZpY2VQcm9wZXJ0eUluZm8uZ2V0UHJvcGVydHl0TWFwV2l0aFByZWZpeChQUkVGSVhfVEFHKS5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICBidWlsZEluZm8uYWRkQnVpbGRBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldEtleSgpLCBudWxsVG9FbXB0eShkZXZpY2UuZ2V0UHJvcGVydHkoZW50cnkuZ2V0VmFsdWUoKSkpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobVNraXBEZXZpY2VJbmZvKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgcnVuKGRldmljZSwgYnVpbGRJbmZvKTsKLSAgICAgICAgRmlsZSBkZXZpY2VJbmZvRGlyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGRldmljZUluZm9EaXIgPSBGaWxlVXRpbC5jcmVhdGVUZW1wRGlyKERldmljZUluZm8uUkVTVUxUX0RJUl9OQU1FKTsKLSAgICAgICAgICAgIGlmIChkZXZpY2UucHVsbERpcihtU3JjRGlyLCBkZXZpY2VJbmZvRGlyKSkgewotICAgICAgICAgICAgICAgIGZvciAoRmlsZSBkZXZpY2VJbmZvRmlsZSA6IGRldmljZUluZm9EaXIubGlzdEZpbGVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtU291cmNlIHNvdXJjZSA9IG5ldyBGaWxlSW5wdXRTdHJlYW1Tb3VyY2UoZGV2aWNlSW5mb0ZpbGUpOwotICAgICAgICAgICAgICAgICAgICBtTG9nZ2VyLnRlc3RMb2coZGV2aWNlSW5mb0ZpbGUuZ2V0TmFtZSgpLCBMb2dEYXRhVHlwZS5URVhULCBzb3VyY2UpOwotICAgICAgICAgICAgICAgICAgICBzb3VyY2UuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIENMb2cuZSgiRmFpbGVkIHRvIHB1bGwgZGV2aWNlLWluZm8gZmlsZXMgZnJvbSBkZXZpY2UgJXMiLCBkZXZpY2UuZ2V0U2VyaWFsTnVtYmVyKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBDTG9nLmUoIkZhaWxlZCB0byBwdWxsIGRldmljZS1pbmZvIGZpbGVzIGZyb20gZGV2aWNlICVzIiwgZGV2aWNlLmdldFNlcmlhbE51bWJlcigpKTsKLSAgICAgICAgICAgIENMb2cuZShlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIEZpbGVVdGlsLnJlY3Vyc2l2ZURlbGV0ZShkZXZpY2VJbmZvRGlyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFRlc3RMb2dnZXIoSVRlc3RMb2dnZXIgdGVzdExvZ2dlcikgewotICAgICAgICBtTG9nZ2VyID0gdGVzdExvZ2dlcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgbnVsbFRvRW1wdHkoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZSA9PSBudWxsID8gIiIgOiB2YWx1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC90YXJnZXRwcmVwL0R5bmFtaWNDb25maWdQdXNoZXIuamF2YSBiL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3RhcmdldHByZXAvRHluYW1pY0NvbmZpZ1B1c2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDM0ZjNlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3RhcmdldHByZXAvRHluYW1pY0NvbmZpZ1B1c2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50YXJnZXRwcmVwOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQuYnVpbGQuQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuRHluYW1pY0NvbmZpZzsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkR5bmFtaWNDb25maWdIYW5kbGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5Mb2c7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuYnVpbGQuSUJ1aWxkSW5mbzsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5jb25maWcuT3B0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmNvbmZpZy5PcHRpb25DbGFzczsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5JVGVzdERldmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5sb2cuTG9nVXRpbDsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLkJ1aWxkRXJyb3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5JVGFyZ2V0Q2xlYW5lcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlRhcmdldFNldHVwRXJyb3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudXRpbC5TdHJlYW1VdGlsOwotCi1pbXBvcnQgb3JnLmpzb24uSlNPTkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi0vKioKLSAqIFB1c2hlcyBkeW5hbWljIGNvbmZpZyBmaWxlcyBmcm9tIGNvbmZpZyByZXBvc2l0b3J5Ci0gKi8KLUBPcHRpb25DbGFzcyhhbGlhcz0iZHluYW1pYy1jb25maWctcHVzaGVyIikKLXB1YmxpYyBjbGFzcyBEeW5hbWljQ29uZmlnUHVzaGVyIGltcGxlbWVudHMgSVRhcmdldENsZWFuZXIgewotICAgIHB1YmxpYyBlbnVtIFRlc3RUYXJnZXQgewotICAgICAgICBERVZJQ0UsCi0gICAgICAgIEhPU1QKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9IER5bmFtaWNDb25maWdQdXNoZXIuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOwotCi0gICAgQE9wdGlvbihuYW1lID0gImNsZWFudXAiLCBkZXNjcmlwdGlvbiA9ICJXaGV0aGVyIHRvIHJlbW92ZSBjb25maWcgZmlsZXMgZnJvbSB0aGUgdGVzdCAiICsKLSAgICAgICAgICAgICJ0YXJnZXQgYWZ0ZXIgdGVzdCBjb21wbGV0aW9uLiIpCi0gICAgcHJpdmF0ZSBib29sZWFuIG1DbGVhbnVwID0gdHJ1ZTsKLQotICAgIEBPcHRpb24obmFtZT0iY29uZmlnLWZpbGVuYW1lIiwgZGVzY3JpcHRpb24gPSAiVGhlIG1vZHVsZSBuYW1lIGZvciBtb2R1bGUtbGV2ZWwgIiArCi0gICAgICAgICAgICAiY29uZmlndXJhdGlvbnMsIG9yIHRoZSBzdWl0ZSBuYW1lIGZvciBzdWl0ZS1sZXZlbCBjb25maWd1cmF0aW9ucyIsIG1hbmRhdG9yeSA9IHRydWUpCi0gICAgcHJpdmF0ZSBTdHJpbmcgbU1vZHVsZU5hbWU7Ci0KLSAgICBAT3B0aW9uKG5hbWUgPSAidGFyZ2V0IiwgZGVzY3JpcHRpb24gPSAiVGhlIHRlc3QgdGFyZ2V0LCBcImRldmljZVwiIG9yIFwiaG9zdFwiIiwKLSAgICAgICAgICAgIG1hbmRhdG9yeSA9IHRydWUpCi0gICAgcHJpdmF0ZSBUZXN0VGFyZ2V0IG1UYXJnZXQ7Ci0KLSAgICBAT3B0aW9uKG5hbWUgPSAidmVyc2lvbiIsIGRlc2NyaXB0aW9uID0gIlRoZSB2ZXJzaW9uIG9mIHRoZSBjb25maWd1cmF0aW9uIHRvIHJldHJpZXZlICIgKwotICAgICAgICAgICAgImZyb20gdGhlIHNlcnZlciwgZS5nLiBcIjEuMFwiLiBEZWZhdWx0cyB0byBzdWl0ZSB2ZXJzaW9uIHN0cmluZy4iKQotICAgIHByaXZhdGUgU3RyaW5nIG1WZXJzaW9uOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbURldmljZUZpbGVQdXNoZWQ7Ci0KLSAgICB2b2lkIHNldE1vZHVsZU5hbWUoU3RyaW5nIG1vZHVsZU5hbWUpIHsKLSAgICAgICAgbU1vZHVsZU5hbWUgPSBtb2R1bGVOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcChJVGVzdERldmljZSBkZXZpY2UsIElCdWlsZEluZm8gYnVpbGRJbmZvKSB0aHJvd3MgVGFyZ2V0U2V0dXBFcnJvciwgQnVpbGRFcnJvciwKLSAgICAgICAgICAgIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyIGJ1aWxkSGVscGVyID0gbmV3IENvbXBhdGliaWxpdHlCdWlsZEhlbHBlcihidWlsZEluZm8pOwotCi0gICAgICAgIEZpbGUgbG9jYWxDb25maWdGaWxlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGxvY2FsQ29uZmlnRmlsZSA9IGJ1aWxkSGVscGVyLmdldFRlc3RGaWxlKG1Nb2R1bGVOYW1lICsgIi5keW5hbWljIik7Ci0gICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVGFyZ2V0U2V0dXBFcnJvcigiQ2Fubm90IGdldCBsb2NhbCBkeW5hbWljIGNvbmZpZyBmaWxlIGZyb20gdGVzdCBkaXJlY3RvcnkiLAotICAgICAgICAgICAgICAgICAgICBlLCBkZXZpY2UuZ2V0RGV2aWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtVmVyc2lvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtVmVyc2lvbiA9IGJ1aWxkSGVscGVyLmdldFN1aXRlVmVyc2lvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGFwZmVDb25maWdJbkpzb24gPSBudWxsOwotICAgICAgICBTdHJpbmcgb3JpZ2luVXJsID0gYnVpbGRIZWxwZXIuZ2V0RHluYW1pY0NvbmZpZ1VybCgpOwotCi0gICAgICAgIGlmIChvcmlnaW5VcmwgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIHJlcXVlc3RVcmwgPSBvcmlnaW5Vcmw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJlcXVlc3RVcmwgPSBvcmlnaW5VcmwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKCJ7bW9kdWxlfSIsIG1Nb2R1bGVOYW1lKS5yZXBsYWNlKCJ7dmVyc2lvbn0iLCBtVmVyc2lvbik7Ci0gICAgICAgICAgICAgICAgamF2YS5uZXQuVVJMIHJlcXVlc3QgPSBuZXcgVVJMKHJlcXVlc3RVcmwpOwotICAgICAgICAgICAgICAgIGFwZmVDb25maWdJbkpzb24gPSBTdHJlYW1VdGlsLmdldFN0cmluZ0Zyb21TdHJlYW0ocmVxdWVzdC5vcGVuU3RyZWFtKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZ1V0aWwucHJpbnRMb2coTG9nLkxvZ0xldmVsLldBUk4sIExPR19UQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGRvd25sb2FkIGFuZCBwYXJzZSBqc29uIGNvbmZpZyBmcm9tIFVSTCAiICsgcmVxdWVzdFVybCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2dVdGlsLnByaW50TG9nKExvZy5Mb2dMZXZlbC5JTkZPLCBMT0dfVEFHLAotICAgICAgICAgICAgICAgICAgICAiRHluYW1pYyBjb25maWcgb3ZlcnJpZGUgVVJMIGlzIG5vdCBzZXQsIHVzaW5nIGxvY2FsIGNvbmZpZ3VyYXRpb24gdmFsdWVzIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBVc2UgRHluYW1pY0NvbmZpZ0hhbmRsZXIgdG8gbWVyZ2UgbG9jYWwgYW5kIHNlcnZpY2UgY29uZmlndXJhdGlvbiBpbnRvIG9uZSBmaWxlCi0gICAgICAgIEZpbGUgaG9zdEZpbGUgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaG9zdEZpbGUgPSBEeW5hbWljQ29uZmlnSGFuZGxlci5nZXRNZXJnZWREeW5hbWljQ29uZmlnRmlsZSgKLSAgICAgICAgICAgICAgICAgICAgbG9jYWxDb25maWdGaWxlLCBhcGZlQ29uZmlnSW5Kc29uLCBtTW9kdWxlTmFtZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIHwgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB8IEpTT05FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFRhcmdldFNldHVwRXJyb3IoIkNhbm5vdCBnZXQgbWVyZ2VkIGR5bmFtaWMgY29uZmlnIGZpbGUiLCBlLAotICAgICAgICAgICAgICAgICAgICBkZXZpY2UuZ2V0RGV2aWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChUZXN0VGFyZ2V0LkRFVklDRS5lcXVhbHMobVRhcmdldCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBkZXZpY2VEZXN0ID0gU3RyaW5nLmZvcm1hdCgiJXMlcy5keW5hbWljIiwKLSAgICAgICAgICAgICAgICAgICAgRHluYW1pY0NvbmZpZy5DT05GSUdfRk9MREVSX09OX0RFVklDRSwgbU1vZHVsZU5hbWUpOwotICAgICAgICAgICAgaWYgKCFkZXZpY2UucHVzaEZpbGUoaG9zdEZpbGUsIGRldmljZURlc3QpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRhcmdldFNldHVwRXJyb3IoU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcHVzaCBsb2NhbCAnJXMnIHRvIHJlbW90ZSAnJXMnIiwgaG9zdEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VEZXN0KSwgZGV2aWNlLmdldERldmljZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtRGV2aWNlRmlsZVB1c2hlZCA9IGRldmljZURlc3Q7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gYWRkIGhvc3QgZmlsZSB0byBidWlsZAotICAgICAgICBidWlsZEhlbHBlci5hZGREeW5hbWljQ29uZmlnRmlsZShtTW9kdWxlTmFtZSwgaG9zdEZpbGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bihJVGVzdERldmljZSBkZXZpY2UsIElCdWlsZEluZm8gYnVpbGRJbmZvLCBUaHJvd2FibGUgZSkKLSAgICAgICAgICAgIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICAvLyBSZW1vdmUgYW55IGZpbGUgd2UgaGF2ZSBwdXNoZWQgdG8gdGhlIGRldmljZSwgaG9zdCBmaWxlIHdpbGwgYmUgbW92ZWQgdG8gdGhlIHJlc3VsdAotICAgICAgICAvLyBkaXJlY3RvcnkgYnkgUmVzdWx0UmVwb3J0ZXIgdXBvbiBpbnZvY2F0aW9uIGNvbXBsZXRpb24uCi0gICAgICAgIGlmIChtRGV2aWNlRmlsZVB1c2hlZCAhPSBudWxsICYmICEoZSBpbnN0YW5jZW9mIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbikgJiYgbUNsZWFudXApIHsKLSAgICAgICAgICAgIGRldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKCJybSAtciAiICsgbURldmljZUZpbGVQdXNoZWQpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdGFyZ2V0cHJlcC9GaWxlUHVzaGVyLmphdmEgYi9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC90YXJnZXRwcmVwL0ZpbGVQdXNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk3MGM0Zi4uMDAwMDAwMAotLS0gYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC90YXJnZXRwcmVwL0ZpbGVQdXNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50YXJnZXRwcmVwOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQuYnVpbGQuQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5Mb2cuTG9nTGV2ZWw7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuYnVpbGQuSUJ1aWxkSW5mbzsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5jb25maWcuT3B0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmNvbmZpZy5PcHRpb25DbGFzczsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5sb2cuTG9nVXRpbC5DTG9nOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuUHVzaEZpbGVQcmVwYXJlcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JQWJpOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLklBYmlSZWNlaXZlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBQdXNoZXMgc3BlY2lmaWVkIHRlc3RpbmcgYXJ0aWZhY3RzIGZyb20gQ29tcGF0aWJpbGl0eSByZXBvc2l0b3J5LgotICovCi1AT3B0aW9uQ2xhc3MoYWxpYXM9ImZpbGUtcHVzaGVyIikKLXB1YmxpYyBjbGFzcyBGaWxlUHVzaGVyIGV4dGVuZHMgUHVzaEZpbGVQcmVwYXJlciBpbXBsZW1lbnRzIElBYmlSZWNlaXZlciB7Ci0KLSAgICBAT3B0aW9uKG5hbWUgPSAiYXBwZW5kLWJpdG5lc3MiLAotICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAiQXBwZW5kIHRoZSBBQkkncyBiaXRuZXNzIHRvIHRoZSBmaWxlbmFtZS4iKQotICAgIHByaXZhdGUgYm9vbGVhbiBtQXBwZW5kQml0bmVzcyA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIgbUJ1aWxkSGVscGVyID0gbnVsbDsKLQotICAgIHByaXZhdGUgSUFiaSBtQWJpOwotCi0gICAgcHJpdmF0ZSB2b2lkIHNldEJ1aWxkSGVscGVyKElCdWlsZEluZm8gYnVpbGRJbmZvKSB7Ci0gICAgICAgIGlmIChtQnVpbGRIZWxwZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgbUJ1aWxkSGVscGVyID0gbmV3IENvbXBhdGliaWxpdHlCdWlsZEhlbHBlcihidWlsZEluZm8pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEZpbGUgZ2V0VGVzdHNEaXIoSUJ1aWxkSW5mbyBidWlsZEluZm8pIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBzZXRCdWlsZEhlbHBlcihidWlsZEluZm8pOwotICAgICAgICByZXR1cm4gbUJ1aWxkSGVscGVyLmdldFRlc3RzRGlyKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEZpbGUgZ2V0VGVzdEZpbGUoSUJ1aWxkSW5mbyBidWlsZEluZm8sIFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNldEJ1aWxkSGVscGVyKGJ1aWxkSW5mbyk7Ci0gICAgICAgIHJldHVybiBtQnVpbGRIZWxwZXIuZ2V0VGVzdEZpbGUoZmlsZW5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRBYmkoSUFiaSBhYmkpIHsKLSAgICAgICAgbUFiaSA9IGFiaTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElBYmkgZ2V0QWJpKCkgewotICAgICAgICByZXR1cm4gbUFiaTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEZpbGUgcmVzb2x2ZVJlbGF0aXZlRmlsZVBhdGgoSUJ1aWxkSW5mbyBidWlsZEluZm8sIFN0cmluZyBmaWxlTmFtZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgRmlsZSBmID0gZ2V0VGVzdEZpbGUoYnVpbGRJbmZvLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCIlcyVzIiwgZmlsZU5hbWUsIG1BcHBlbmRCaXRuZXNzID8gbUFiaS5nZXRCaXRuZXNzKCkgOiAiIikpOwotICAgICAgICAgICAgQ0xvZy5sb2dBbmREaXNwbGF5KExvZ0xldmVsLklORk8sICJDb3B5aW5nIGZyb20gJXMiLCBmLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICAgIHJldHVybiBmOwotICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC90YXJnZXRwcmVwL0xvY2F0aW9uQ2hlY2suamF2YSBiL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3RhcmdldHByZXAvTG9jYXRpb25DaGVjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDhkZDZmOC4uMDAwMDAwMAotLS0gYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC90YXJnZXRwcmVwL0xvY2F0aW9uQ2hlY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50YXJnZXRwcmVwOwotCi1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuYnVpbGQuSUJ1aWxkSW5mbzsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5jb25maWcuT3B0aW9uQ2xhc3M7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLkRldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuSVRlc3REZXZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5CdWlsZEVycm9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuVGFyZ2V0U2V0dXBFcnJvcjsKLQotLyoqCi0gKiBDaGVja3MgdGhhdCBsb2NhdGlvbiBpcyBlbmFibGVkIGZvciBHUFMgb3IgTmV0d29yayBiZWZvcmUgcnVubmluZyBhIGNvbXBhdGliaWxpdHkgdGVzdAotICovCi1AT3B0aW9uQ2xhc3MoYWxpYXM9ImxvY2F0aW9uLWNoZWNrIikKLXB1YmxpYyBjbGFzcyBMb2NhdGlvbkNoZWNrIGV4dGVuZHMgU2V0dGluZ3NQcmVwYXJlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQVRJT05fU0VUVElORyA9ICJsb2NhdGlvbl9wcm92aWRlcnNfYWxsb3dlZCI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1BTID0gImdwcyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5FVFdPUksgPSAibmV0d29yayI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1BTX0ZFQVRVUkUgPSAiYW5kcm9pZC5oYXJkd2FyZS5sb2NhdGlvbi5ncHMiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBORVRXT1JLX0ZFQVRVUkUgPSAiYW5kcm9pZC5oYXJkd2FyZS5sb2NhdGlvbi5uZXR3b3JrIjsKLQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhc0xvY2F0aW9uRmVhdHVyZShJVGVzdERldmljZSBkZXZpY2UpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgYWRiRmVhdHVyZXMgPSBkZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZCgicG0gbGlzdCBmZWF0dXJlcyIpOwotICAgICAgICByZXR1cm4gKGFkYkZlYXR1cmVzLmNvbnRhaW5zKEdQU19GRUFUVVJFKSB8fCBhZGJGZWF0dXJlcy5jb250YWlucyhORVRXT1JLX0ZFQVRVUkUpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBydW4oSVRlc3REZXZpY2UgZGV2aWNlLCBJQnVpbGRJbmZvIGJ1aWxkSW5mbykgdGhyb3dzIFRhcmdldFNldHVwRXJyb3IsCi0gICAgICAgICAgICBCdWlsZEVycm9yLCBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotCi0gICAgICAgIGlmICghaGFzTG9jYXRpb25GZWF0dXJlKGRldmljZSkpIHsKLSAgICAgICAgICAgIHJldHVybjsgLy8gc2tpcCB0aGlzIHByZWNvbmRpdGlvbiBpZiByZXF1aXJlZCBsb2NhdGlvbiBmZWF0dXJlIGlzIG5vdCBwcmVzZW50Ci0gICAgICAgIH0KLQotICAgICAgICBsb2dJbmZvKCJWZXJpZnlpbmcgbG9jYXRpb24gc2V0dGluZyIpOwotICAgICAgICBtU2V0dGluZ05hbWUgPSBMT0NBVElPTl9TRVRUSU5HOwotICAgICAgICBtU2V0dGluZ1R5cGUgPSBTZXR0aW5nc1ByZXBhcmVyLlNldHRpbmdUeXBlLlNFQ1VSRTsKLSAgICAgICAgbUV4cGVjdGVkU2V0dGluZ1ZhbHVlcy5hZGQoTkVUV09SSyk7Ci0gICAgICAgIG1FeHBlY3RlZFNldHRpbmdWYWx1ZXMuYWRkKEdQUyk7Ci0gICAgICAgIG1FeHBlY3RlZFNldHRpbmdWYWx1ZXMuYWRkKFN0cmluZy5mb3JtYXQoIiVzLCVzIiwgR1BTLCBORVRXT1JLKSk7Ci0gICAgICAgIG1FeHBlY3RlZFNldHRpbmdWYWx1ZXMuYWRkKFN0cmluZy5mb3JtYXQoIiVzLCVzIiwgTkVUV09SSywgR1BTKSk7Ci0gICAgICAgIG1GYWlsdXJlTWVzc2FnZSA9ICJMb2NhdGlvbiBzZXJ2aWNlcyBtdXN0IGJlIGVuYWJsZWQgdmlhIEdQUyBvciBOZXR3b3JrIGluIG9yZGVyIHRvICIgKwotICAgICAgICAgICAgICAgICJzdWNjZXNzZnVsbHkgcnVuIHRoZSB0ZXN0IHN1aXRlIjsKLSAgICAgICAgc3VwZXIucnVuKGRldmljZSwgYnVpbGRJbmZvKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC90YXJnZXRwcmVwL01lZGlhUHJlcGFyZXIuamF2YSBiL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3RhcmdldHByZXAvTWVkaWFQcmVwYXJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDExZjVlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3RhcmdldHByZXAvTWVkaWFQcmVwYXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50YXJnZXRwcmVwOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQuYnVpbGQuQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRhcmdldHByZXAuUHJlY29uZGl0aW9uUHJlcGFyZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudXRpbC5EeW5hbWljQ29uZmlnRmlsZVJlYWRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuSURldmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuTG9nOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi50ZXN0cnVubmVyLlRlc3RJZGVudGlmaWVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmJ1aWxkLklCdWlsZEluZm87Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuY29uZmlnLk9wdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5jb25maWcuT3B0aW9uQ2xhc3M7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLkRldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuSVRlc3REZXZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQubG9nLkxvZ1V0aWw7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQucmVzdWx0LklUZXN0SW52b2NhdGlvbkxpc3RlbmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuQnVpbGRFcnJvcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlRhcmdldFNldHVwRXJyb3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuQW5kcm9pZEpVbml0VGVzdDsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC51dGlsLkZpbGVVdGlsOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnV0aWwuWmlwVXRpbDsKLQotaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOwotCi0vKioKLSAqIEVuc3VyZXMgdGhhdCB0aGUgYXBwcm9wcmlhdGUgbWVkaWEgZmlsZXMgZXhpc3Qgb24gdGhlIGRldmljZQotICovCi1AT3B0aW9uQ2xhc3MoYWxpYXM9Im1lZGlhLXByZXBhcmVyIikKLXB1YmxpYyBjbGFzcyBNZWRpYVByZXBhcmVyIGV4dGVuZHMgUHJlY29uZGl0aW9uUHJlcGFyZXIgewotCi0gICAgQE9wdGlvbihuYW1lID0gImxvY2FsLW1lZGlhLXBhdGgiLAotICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAiQWJzb2x1dGUgcGF0aCBvZiB0aGUgbWVkaWEgZmlsZXMgZGlyZWN0b3J5LCBjb250YWluaW5nIiArCi0gICAgICAgICAgICAiJ2JiYl9zaG9ydCcgYW5kICdiYmJfZnVsbCcgZGlyZWN0b3JpZXMiKQotICAgIHByb3RlY3RlZCBTdHJpbmcgbUxvY2FsTWVkaWFQYXRoID0gbnVsbDsKLQotICAgIEBPcHRpb24obmFtZSA9ICJza2lwLW1lZGlhLWRvd25sb2FkIiwKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gIldoZXRoZXIgdG8gc2tpcCB0aGUgbWVkaWEgZmlsZXMgcHJlY29uZGl0aW9uIikKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtU2tpcE1lZGlhRG93bmxvYWQgPSBmYWxzZTsKLQotICAgIEBPcHRpb24obmFtZSA9ICJtZWRpYS1kb3dubG9hZC1vbmx5IiwKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gIk9ubHkgZG93bmxvYWQgbWVkaWEgZmlsZXM7IGRvIG5vdCBydW4gaW5zdHJ1bWVudGF0aW9uIG9yIGNvcHkgZmlsZXMiKQotICAgIHByb3RlY3RlZCBib29sZWFuIG1NZWRpYURvd25sb2FkT25seSA9IGZhbHNlOwotCi0gICAgQE9wdGlvbihuYW1lID0gImltYWdlcy1vbmx5IiwKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gIk9ubHkgcHVzaCBpbWFnZXMgZmlsZXMgdG8gdGhlIGRldmljZSIpCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gbUltYWdlc09ubHkgPSBmYWxzZTsKLQotICAgIC8qCi0gICAgICogVGhlIHBhdGhuYW1lcyBvZiB0aGUgZGV2aWNlJ3MgZGlyZWN0b3JpZXMgdGhhdCBob2xkIG1lZGlhIGZpbGVzIGZvciB0aGUgdGVzdHMuCi0gICAgICogVGhlc2UgZGVwZW5kIG9uIHRoZSBkZXZpY2UncyBtb3VudCBwb2ludCwgd2hpY2ggaXMgcmV0cmlldmVkIGluIHRoZSBNZWRpYVByZXBhcmVyJ3MgcnVuCi0gICAgICogbWV0aG9kLgotICAgICAqCi0gICAgICogVGhlc2UgZmllbGRzIGFyZSBleHBvc2VkIGZvciB1bml0IHRlc3RpbmcKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG1CYXNlRGV2aWNlU2hvcnREaXI7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBtQmFzZURldmljZUZ1bGxEaXI7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBtQmFzZURldmljZUltYWdlc0RpcjsKLQotICAgIC8qCi0gICAgICogVmFyaWFibGVzIHNldCBieSB0aGUgTWVkaWFQcmVwYXJlckxpc3RlbmVyIGR1cmluZyByZXRyaWV2YWwgb2YgbWF4aW11bSBtZWRpYSBmaWxlCi0gICAgICogcmVzb2x1dGlvbi4gQWZ0ZXIgdGhlIE1lZGlhUHJlcGFyZXJBcHAgaGFzIGJlZW4gaW5zdHJ1bWVudGVkIG9uIHRoZSBkZXZpY2U6Ci0gICAgICoKLSAgICAgKiB0ZXN0TWV0cmljcyBjb250YWlucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZXNvbHV0aW9uCi0gICAgICogdGVzdEZhaWx1cmVzIGNvbnRhaW5zIGEgc3RhY2t0cmFjZSBpZiByZXRyaWV2YWwgb2YgdGhlIHJlc29sdXRpb24gd2FzIHVuc3VjY2Vzc2Z1bAotICAgICAqLwotICAgIHByb3RlY3RlZCBSZXNvbHV0aW9uIG1NYXhSZXMgPSBudWxsOwotICAgIHByb3RlY3RlZCBTdHJpbmcgbUZhaWx1cmVTdGFja1RyYWNlID0gbnVsbDsKLQotICAgIC8qCi0gICAgICogVGhlIGRlZmF1bHQgbmFtZSBvZiBsb2NhbCBkaXJlY3RvcnkgaW50byB3aGljaCBtZWRpYSBmaWxlcyB3aWxsIGJlIGRvd25sb2FkZWQsIGlmIG9wdGlvbgotICAgICAqICJsb2NhbC1tZWRpYS1wYXRoIiBpcyBub3QgcHJvdmlkZWQuIFRoaXMgZGlyZWN0b3J5IHdpbGwgbGl2ZSBpbnNpZGUgdGhlIHRlbXAgZGlyZWN0b3J5LgotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1FRElBX0ZPTERFUl9OQU1FID0gImFuZHJvaWQtY3RzLW1lZGlhIjsKLQotICAgIC8qIFRoZSBrZXkgdXNlZCB0byByZXRyaWV2ZSB0aGUgbWVkaWEgZmlsZXMgVVJMIGZyb20gdGhlIGR5bmFtaWMgY29uZmlndXJhdGlvbiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRURJQV9GSUxFU19VUkxfS0VZID0gIm1lZGlhX2ZpbGVzX3VybCI7Ci0KLSAgICAvKiBGb3IgYSB0YXJnZXQgcHJlcGFyZXIsIHRoZSAibW9kdWxlIiBvZiB0aGUgY29uZmlndXJhdGlvbiBpcyB0aGUgdGVzdCBzdWl0ZSAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEWU5BTUlDX0NPTkZJR19NT0RVTEUgPSAiY3RzIjsKLQotICAgIC8qCi0gICAgICogSW5mbyB1c2VkIHRvIGluc3RhbGwgYW5kIHVuaW5zdGFsbCB0aGUgTWVkaWFQcmVwYXJlckFwcAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBfQVBLID0gIkN0c01lZGlhUHJlcGFyZXJBcHAuYXBrIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQX1BLR19OQU1FID0gImFuZHJvaWQubWVkaWFzdHJlc3MuY3RzLnByZWNvbmRpdGlvbnMuYXBwIjsKLQotICAgIC8qIEtleSB0byByZXRyaWV2ZSByZXNvbHV0aW9uIHN0cmluZyBpbiBtZXRyaWNzIHVwb24gTWVkaWFQcmVwYXJlckxpc3RlbmVyLnRlc3RFbmRlZCgpICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09MVVRJT05fU1RSSU5HX0tFWSA9ICJyZXNvbHV0aW9uIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIk1lZGlhUHJlcGFyZXIiOwotCi0gICAgLyoKLSAgICAgKiBJbiB0aGUgY2FzZSBvZiBNZWRpYVByZXBhcmVyIGVycm9yLCB0aGUgZGVmYXVsdCBtYXhpbXVtIHJlc29sdXRpb24gdG8gcHVzaCB0byB0aGUgZGV2aWNlLgotICAgICAqIFB1c2hpbmcgaGlnaGVyIHJlc29sdXRpb25zIG1heSBsZWFkIHRvIGluc3VmZmljaWVudCBzdG9yYWdlIGZvciBpbnN0YWxsaW5nIHRlc3QgQVBLcy4KLSAgICAgKiBUT0RPKGFhcm9uaG9sZGVuKTogV2hlbiB0aGUgbmV3IGRldGVjdGlvbiBvZiBtYXggcmVzb2x1dGlvbiBpcyBwcm92ZW4gc3RhYmxlLCB0aHJvdwotICAgICAqIGEgVGFyZ2V0U2V0dXBFcnJvciB3aGVuIGRldGVjdGlvbiByZXN1bHRzIGluIGVycm9yCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBSZXNvbHV0aW9uIERFRkFVTFRfTUFYX1JFU09MVVRJT04gPSBuZXcgUmVzb2x1dGlvbig0ODAsIDM2MCk7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFJlc29sdXRpb25bXSBSRVNPTFVUSU9OUyA9IHsKLSAgICAgICAgICAgIG5ldyBSZXNvbHV0aW9uKDE3NiwgMTQ0KSwKLSAgICAgICAgICAgIG5ldyBSZXNvbHV0aW9uKDQ4MCwgMzYwKSwKLSAgICAgICAgICAgIG5ldyBSZXNvbHV0aW9uKDcyMCwgNDgwKSwKLSAgICAgICAgICAgIG5ldyBSZXNvbHV0aW9uKDEyODAsIDcyMCksCi0gICAgICAgICAgICBuZXcgUmVzb2x1dGlvbigxOTIwLCAxMDgwKQotICAgIH07Ci0KLSAgICAvKiogSGVscGVyIGNsYXNzIGZvciBnZW5lcmF0aW5nIGFuZCByZXRyaWV2aW5nIHdpZHRoLWhlaWdodCBwYWlycyAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2xhc3MgUmVzb2x1dGlvbiB7Ci0gICAgICAgIC8vIHJlZ2V4IHRoYXQgbWF0Y2hlcyBhIHJlc29sdXRpb24gc3RyaW5nCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRURVJOID0gIihcXGQrKXgoXFxkKykiOwotICAgICAgICAvLyBncm91cCBpbmRpY2VzIGZvciBhY2Nlc3NpbmcgcmVzb2x1dGlvbiB3aWR0aCBhbmQgaGVpZ2h0IGZyb20gYSBQQVRURVJOLWJhc2VkIE1hdGNoZXIKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdJRFRIX0lOREVYID0gMTsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhFSUdIVF9JTkRFWCA9IDI7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgd2lkdGg7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IGhlaWdodDsKLQotICAgICAgICBwcml2YXRlIFJlc29sdXRpb24oaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgICAgICB0aGlzLndpZHRoID0gd2lkdGg7Ci0gICAgICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgUmVzb2x1dGlvbihTdHJpbmcgcmVzb2x1dGlvbikgewotICAgICAgICAgICAgUGF0dGVybiBwYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKFBBVFRFUk4pOwotICAgICAgICAgICAgTWF0Y2hlciBtYXRjaGVyID0gcGF0dGVybi5tYXRjaGVyKHJlc29sdXRpb24pOwotICAgICAgICAgICAgbWF0Y2hlci5maW5kKCk7Ci0gICAgICAgICAgICB0aGlzLndpZHRoID0gSW50ZWdlci5wYXJzZUludChtYXRjaGVyLmdyb3VwKFdJRFRIX0lOREVYKSk7Ci0gICAgICAgICAgICB0aGlzLmhlaWdodCA9IEludGVnZXIucGFyc2VJbnQobWF0Y2hlci5ncm91cChIRUlHSFRfSU5ERVgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIiVkeCVkIiwgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEZpbGUgZ2V0RGVmYXVsdE1lZGlhRGlyKCkgewotICAgICAgICByZXR1cm4gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpLCBNRURJQV9GT0xERVJfTkFNRSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgYWxsIG5lY2Vzc2FyeSBtZWRpYSBmaWxlcyBleGlzdCBvbiB0aGUgZGV2aWNlLCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgaXMgZXhwb3NlZCBmb3IgdW5pdCB0ZXN0aW5nLgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIG1lZGlhRmlsZXNFeGlzdE9uRGV2aWNlKElUZXN0RGV2aWNlIGRldmljZSkKLSAgICAgICAgICAgIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBpZiAoIW1JbWFnZXNPbmx5KSB7Ci0gICAgICAgICAgICBmb3IgKFJlc29sdXRpb24gcmVzb2x1dGlvbiA6IFJFU09MVVRJT05TKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc29sdXRpb24ud2lkdGggPiBtTWF4UmVzLndpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBubyBuZWVkIHRvIGNoZWNrIGZvciByZXNvbHV0aW9ucyBncmVhdGVyIHRoYW4gdGhpcwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTdHJpbmcgZGV2aWNlU2hvcnRGaWxlUGF0aCA9IG1CYXNlRGV2aWNlU2hvcnREaXIgKyByZXNvbHV0aW9uLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGRldmljZUZ1bGxGaWxlUGF0aCA9IG1CYXNlRGV2aWNlRnVsbERpciArIHJlc29sdXRpb24udG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBpZiAoIWRldmljZS5kb2VzRmlsZUV4aXN0KGRldmljZVNob3J0RmlsZVBhdGgpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCAhZGV2aWNlLmRvZXNGaWxlRXhpc3QoZGV2aWNlRnVsbEZpbGVQYXRoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkZXZpY2UuZG9lc0ZpbGVFeGlzdChtQmFzZURldmljZUltYWdlc0Rpcik7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBBZnRlciBkb3dubG9hZGluZyBhbmQgdW56aXBwaW5nIHRoZSBtZWRpYSBmaWxlcywgbUxvY2FsTWVkaWFQYXRoIG11c3QgYmUgdGhlIHBhdGggdG8gdGhlCi0gICAgICogZGlyZWN0b3J5IGNvbnRhaW5pbmcgJ2JiYl9zaG9ydCcgYW5kICdiYmJfZnVsbCcgZGlyZWN0b3JpZXMsIGFzIGl0IGlzIGRlZmluZWQgaW4gaXRzCi0gICAgICogZGVzY3JpcHRpb24gYXMgYW4gb3B0aW9uLgotICAgICAqIEFmdGVyIGV4dHJhY3Rpb24sIHRoaXMgZGlyZWN0b3J5IGV4aXN0cyBvbmUgbGV2ZWwgYmVsb3cgdGhlIHRoZSBkaXJlY3RvcnkgJ21lZGlhRm9sZGVyJy4KLSAgICAgKiBJZiB0aGUgJ21lZGlhRm9sZGVyJyBjb250YWlucyBhbnl0aGluZyBvdGhlciB0aGFuIGV4YWN0bHkgb25lIHN1YmRpcmVjdG9yeSwgYQotICAgICAqIFRhcmdldFNldHVwRXJyb3IgaXMgdGhyb3duLiBPdGhlcndpc2UsIHRoZSBtTG9jYWxNZWRpYVBhdGggdmFyaWFibGUgaXMgc2V0IHRvIHRoZSBwYXRoIG9mCi0gICAgICogdGhpcyBzdWJkaXJlY3RvcnkuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUxvY2FsTWVkaWFQYXRoKElUZXN0RGV2aWNlIGRldmljZSwgRmlsZSBtZWRpYUZvbGRlcikKLSAgICAgICAgICAgIHRocm93cyBUYXJnZXRTZXR1cEVycm9yIHsKLSAgICAgICAgU3RyaW5nW10gc3ViRGlycyA9IG1lZGlhRm9sZGVyLmxpc3QoKTsKLSAgICAgICAgaWYgKHN1YkRpcnMubGVuZ3RoICE9IDEpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBUYXJnZXRTZXR1cEVycm9yKFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICJVbmV4cGVjdGVkIGNvbnRlbnRzIGluIGRpcmVjdG9yeSAlcyIsIG1lZGlhRm9sZGVyLmdldEFic29sdXRlUGF0aCgpKSwKLSAgICAgICAgICAgICAgICAgICAgZGV2aWNlLmdldERldmljZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgbUxvY2FsTWVkaWFQYXRoID0gbmV3IEZpbGUobWVkaWFGb2xkZXIsIHN1YkRpcnNbMF0pLmdldEFic29sdXRlUGF0aCgpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQ29waWVzIHRoZSBtZWRpYSBmaWxlcyB0byB0aGUgaG9zdCBmcm9tIGEgcHJlZGVmaW5lZCBVUkwuCi0gICAgICoKLSAgICAgKiBTeW5jaHJvbml6ZSB0aGlzIHN0YXRpYyBtZXRob2Qgc28gdGhhdCBtdWx0aXBsZSBzaGFyZHMgd29uJ3QgZG93bmxvYWQvZXh0cmFjdAotICAgICAqIHRoaXMgZmlsZSB0byB0aGUgc2FtZSBsb2NhdGlvbiBvbiB0aGUgaG9zdC4gT25seSBhbiBpc3N1ZSBpbiBBbmRyb2lkIE8gYW5kIGFib3ZlLAotICAgICAqIHdoZXJlIE1lZGlhUHJlcGFyZXIgaXMgdXNlZCBmb3IgbXVsdGlwbGUsIHNoYXJkYWJsZSBtb2R1bGVzLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCBGaWxlIGRvd25sb2FkTWVkaWFUb0hvc3QoSVRlc3REZXZpY2UgZGV2aWNlLCBJQnVpbGRJbmZvIGJ1aWxkSW5mbykKLSAgICAgICAgICAgIHRocm93cyBUYXJnZXRTZXR1cEVycm9yIHsKLSAgICAgICAgLy8gUmV0cmlldmUgZGVmYXVsdCBkaXJlY3RvcnkgZm9yIHN0b3JpbmcgbWVkaWEgZmlsZXMKLSAgICAgICAgRmlsZSBtZWRpYUZvbGRlciA9IGdldERlZmF1bHRNZWRpYURpcigpOwotICAgICAgICBpZiAobWVkaWFGb2xkZXIuZXhpc3RzKCkgJiYgbWVkaWFGb2xkZXIubGlzdCgpLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIC8vIEZvbGRlciBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQgYW5kIHBvcHVsYXRlZCBieSBwcmV2aW91cyBNZWRpYVByZXBhcmVyIHJ1bnMsCi0gICAgICAgICAgICAvLyBhc3N1bWUgYWxsIG5lY2Vzc2FyeSBtZWRpYSBmaWxlcyBleGlzdCBpbnNpZGUuCi0gICAgICAgICAgICByZXR1cm4gbWVkaWFGb2xkZXI7Ci0gICAgICAgIH0KLSAgICAgICAgbWVkaWFGb2xkZXIubWtkaXJzKCk7Ci0gICAgICAgIFVSTCB1cmw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBHZXQgZG93bmxvYWQgVVJMIGZyb20gZHluYW1pYyBjb25maWd1cmF0aW9uIHNlcnZpY2UKLSAgICAgICAgICAgIFN0cmluZyBtZWRpYVVybFN0cmluZyA9IER5bmFtaWNDb25maWdGaWxlUmVhZGVyLmdldFZhbHVlRnJvbUNvbmZpZygKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRJbmZvLCBEWU5BTUlDX0NPTkZJR19NT0RVTEUsIE1FRElBX0ZJTEVTX1VSTF9LRVkpOwotICAgICAgICAgICAgdXJsID0gbmV3IFVSTChtZWRpYVVybFN0cmluZyk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIHwgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVGFyZ2V0U2V0dXBFcnJvcigiVHJvdWJsZSBmaW5kaW5nIG1lZGlhIGZpbGUgZG93bmxvYWQgbG9jYXRpb24gd2l0aCAiICsKLSAgICAgICAgICAgICAgICAgICAgImR5bmFtaWMgY29uZmlndXJhdGlvbiIsIGUsIGRldmljZS5nZXREZXZpY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICB9Ci0gICAgICAgIEZpbGUgbWVkaWFGb2xkZXJaaXAgPSBuZXcgRmlsZShtZWRpYUZvbGRlci5nZXRBYnNvbHV0ZVBhdGgoKSArICIuemlwIik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBMb2dVdGlsLnByaW50TG9nKExvZy5Mb2dMZXZlbC5JTkZPLCBMT0dfVEFHLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJEb3dubG9hZGluZyBtZWRpYSBmaWxlcyBmcm9tICVzIiwgdXJsLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICAgIFVSTENvbm5lY3Rpb24gY29ubiA9IHVybC5vcGVuQ29ubmVjdGlvbigpOwotICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBjb25uLmdldElucHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICBtZWRpYUZvbGRlclppcC5jcmVhdGVOZXdGaWxlKCk7Ci0gICAgICAgICAgICBGaWxlVXRpbC53cml0ZVRvRmlsZShpbiwgbWVkaWFGb2xkZXJaaXApOwotICAgICAgICAgICAgTG9nVXRpbC5wcmludExvZyhMb2cuTG9nTGV2ZWwuSU5GTywgTE9HX1RBRywgIlVuemlwcGluZyBtZWRpYSBmaWxlcyIpOwotICAgICAgICAgICAgWmlwVXRpbC5leHRyYWN0WmlwKG5ldyBaaXBGaWxlKG1lZGlhRm9sZGVyWmlwKSwgbWVkaWFGb2xkZXIpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBGaWxlVXRpbC5yZWN1cnNpdmVEZWxldGUobWVkaWFGb2xkZXIpOwotICAgICAgICAgICAgdGhyb3cgbmV3IFRhcmdldFNldHVwRXJyb3IoIkZhaWxlZCB0byBkb3dubG9hZCBhbmQgb3BlbiBtZWRpYSBmaWxlcyBvbiBob3N0LCB0aGUiCi0gICAgICAgICAgICAgICAgICAgICsgIiBkZXZpY2UgcmVxdWlyZXMgdGhlc2UgbWVkaWEgZmlsZXMgZm9yIENUUyBtZWRpYSB0ZXN0cyIsIGUsCi0gICAgICAgICAgICAgICAgICAgIGRldmljZS5nZXREZXZpY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgRmlsZVV0aWwuZGVsZXRlRmlsZShtZWRpYUZvbGRlclppcCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1lZGlhRm9sZGVyOwotICAgIH0KLQotICAgIC8qCi0gICAgICogUHVzaGVzIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgbWVkaWEgZmlsZXMgdG8gdGhlIGRldmljZSBmb3IgYWxsIGRpcmVjdG9yaWVzIHRoYXQ6Ci0gICAgICogLSBhcmUgbm90IGFscmVhZHkgcHJlc2VudCBvbiB0aGUgZGV2aWNlCi0gICAgICogLSBjb250YWluIHZpZGVvIGZpbGVzIG9mIGEgcmVzb2x1dGlvbiBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGRldmljZSdzCi0gICAgICogICAgICAgbWF4IHZpZGVvIHBsYXliYWNrIHJlc29sdXRpb24KLSAgICAgKiAtIGNvbnRhaW4gaW1hZ2UgZmlsZXMKLSAgICAgKgotICAgICAqIFRoaXMgbWV0aG9kIGlzIGV4cG9zZWQgZm9yIHVuaXQgdGVzdGluZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb3B5TWVkaWFGaWxlcyhJVGVzdERldmljZSBkZXZpY2UpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBpZiAoIW1JbWFnZXNPbmx5KSB7Ci0gICAgICAgICAgICBjb3B5VmlkZW9GaWxlcyhkZXZpY2UpOwotICAgICAgICB9Ci0gICAgICAgIGNvcHlJbWFnZXNGaWxlcyhkZXZpY2UpOwotICAgIH0KLQotICAgIC8vIGNvcHkgdmlkZW8gZmlsZXMgb2YgYSByZXNvbHV0aW9uIDw9IHRoZSBkZXZpY2UncyBtYXhpbXVtIHZpZGVvIHBsYXliYWNrIHJlc29sdXRpb24KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb3B5VmlkZW9GaWxlcyhJVGVzdERldmljZSBkZXZpY2UpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBmb3IgKFJlc29sdXRpb24gcmVzb2x1dGlvbiA6IFJFU09MVVRJT05TKSB7Ci0gICAgICAgICAgICBpZiAocmVzb2x1dGlvbi53aWR0aCA+IG1NYXhSZXMud2lkdGgpIHsKLSAgICAgICAgICAgICAgICBsb2dJbmZvKCJNZWRpYSBmaWxlIGNvcHlpbmcgY29tcGxldGUiKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgZGV2aWNlU2hvcnRGaWxlUGF0aCA9IG1CYXNlRGV2aWNlU2hvcnREaXIgKyByZXNvbHV0aW9uLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBTdHJpbmcgZGV2aWNlRnVsbEZpbGVQYXRoID0gbUJhc2VEZXZpY2VGdWxsRGlyICsgcmVzb2x1dGlvbi50b1N0cmluZygpOwotICAgICAgICAgICAgaWYgKCFkZXZpY2UuZG9lc0ZpbGVFeGlzdChkZXZpY2VTaG9ydEZpbGVQYXRoKSB8fAotICAgICAgICAgICAgICAgICAgICAhZGV2aWNlLmRvZXNGaWxlRXhpc3QoZGV2aWNlRnVsbEZpbGVQYXRoKSkgewotICAgICAgICAgICAgICAgIGxvZ0luZm8oIkNvcHlpbmcgZmlsZXMgb2YgcmVzb2x1dGlvbiAlcyB0byBkZXZpY2UiLCByZXNvbHV0aW9uLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhbFNob3J0RGlyTmFtZSA9ICJiYmJfc2hvcnQvIiArIHJlc29sdXRpb24udG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWxGdWxsRGlyTmFtZSA9ICJiYmJfZnVsbC8iICsgcmVzb2x1dGlvbi50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIEZpbGUgbG9jYWxTaG9ydERpciA9IG5ldyBGaWxlKG1Mb2NhbE1lZGlhUGF0aCwgbG9jYWxTaG9ydERpck5hbWUpOwotICAgICAgICAgICAgICAgIEZpbGUgbG9jYWxGdWxsRGlyID0gbmV3IEZpbGUobUxvY2FsTWVkaWFQYXRoLCBsb2NhbEZ1bGxEaXJOYW1lKTsKLSAgICAgICAgICAgICAgICAvLyBwdXNoIHNob3J0IGRpcmVjdG9yeSBvZiBnaXZlbiByZXNvbHV0aW9uLCBpZiBub3QgcHJlc2VudCBvbiBkZXZpY2UKLSAgICAgICAgICAgICAgICBpZighZGV2aWNlLmRvZXNGaWxlRXhpc3QoZGV2aWNlU2hvcnRGaWxlUGF0aCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZGV2aWNlLnB1c2hEaXIobG9jYWxTaG9ydERpciwgZGV2aWNlU2hvcnRGaWxlUGF0aCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIHB1c2ggZnVsbCBkaXJlY3Rvcnkgb2YgZ2l2ZW4gcmVzb2x1dGlvbiwgaWYgbm90IHByZXNlbnQgb24gZGV2aWNlCi0gICAgICAgICAgICAgICAgaWYoIWRldmljZS5kb2VzRmlsZUV4aXN0KGRldmljZUZ1bGxGaWxlUGF0aCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZGV2aWNlLnB1c2hEaXIobG9jYWxGdWxsRGlyLCBkZXZpY2VGdWxsRmlsZVBhdGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIGNvcHkgaW1hZ2UgZmlsZXMgdG8gdGhlIGRldmljZQotICAgIHByb3RlY3RlZCB2b2lkIGNvcHlJbWFnZXNGaWxlcyhJVGVzdERldmljZSBkZXZpY2UpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBpZiAoIWRldmljZS5kb2VzRmlsZUV4aXN0KG1CYXNlRGV2aWNlSW1hZ2VzRGlyKSkgewotICAgICAgICAgICAgbG9nSW5mbygiQ29weWluZyBpbWFnZXMgZmlsZXMgdG8gZGV2aWNlIik7Ci0gICAgICAgICAgICBkZXZpY2UucHVzaERpcihuZXcgRmlsZShtTG9jYWxNZWRpYVBhdGgsICJpbWFnZXMiKSwgbUJhc2VEZXZpY2VJbWFnZXNEaXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gSW5pdGlhbGl6ZSBkaXJlY3Rvcnkgc3RyaW5ncyB3aGVyZSBtZWRpYSBmaWxlcyBsaXZlIG9uIGRldmljZQotICAgIHByb3RlY3RlZCB2b2lkIHNldE1vdW50UG9pbnQoSVRlc3REZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIFN0cmluZyBtb3VudFBvaW50ID0gZGV2aWNlLmdldE1vdW50UG9pbnQoSURldmljZS5NTlRfRVhURVJOQUxfU1RPUkFHRSk7Ci0gICAgICAgIG1CYXNlRGV2aWNlU2hvcnREaXIgPSBTdHJpbmcuZm9ybWF0KCIlcy90ZXN0L2JiYl9zaG9ydC8iLCBtb3VudFBvaW50KTsKLSAgICAgICAgbUJhc2VEZXZpY2VGdWxsRGlyID0gU3RyaW5nLmZvcm1hdCgiJXMvdGVzdC9iYmJfZnVsbC8iLCBtb3VudFBvaW50KTsKLSAgICAgICAgbUJhc2VEZXZpY2VJbWFnZXNEaXIgPSBTdHJpbmcuZm9ybWF0KCIlcy90ZXN0L2ltYWdlcy8iLCBtb3VudFBvaW50KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBydW4oSVRlc3REZXZpY2UgZGV2aWNlLCBJQnVpbGRJbmZvIGJ1aWxkSW5mbykgdGhyb3dzIFRhcmdldFNldHVwRXJyb3IsCi0gICAgICAgICAgICBCdWlsZEVycm9yLCBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotCi0gICAgICAgIGlmIChtU2tpcE1lZGlhRG93bmxvYWQpIHsKLSAgICAgICAgICAgIGxvZ0luZm8oIlNraXBwaW5nIG1lZGlhIHByZXBhcmF0aW9uIik7Ci0gICAgICAgICAgICByZXR1cm47IC8vIHNraXAgdGhpcyBwcmVjb25kaXRpb24KLSAgICAgICAgfQotICAgICAgICBpZiAoIW1NZWRpYURvd25sb2FkT25seSkgewotICAgICAgICAgICAgc2V0TW91bnRQb2ludChkZXZpY2UpOwotICAgICAgICAgICAgaWYgKCFtSW1hZ2VzT25seSkgewotICAgICAgICAgICAgICAgIHNldE1heFJlcyhkZXZpY2UsIGJ1aWxkSW5mbyk7IC8vIG1heCByZXNvbHV0aW9uIG9ubHkgYXBwbGllcyB0byB2aWRlbyBmaWxlcwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1lZGlhRmlsZXNFeGlzdE9uRGV2aWNlKGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICAvLyBpZiBmaWxlcyBhbHJlYWR5IG9uIGRldmljZSwgZG8gbm90aGluZwotICAgICAgICAgICAgICAgIGxvZ0luZm8oIk1lZGlhIGZpbGVzIGZvdW5kIG9uIHRoZSBkZXZpY2UiKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1Mb2NhbE1lZGlhUGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBPcHRpb24gJ2xvY2FsLW1lZGlhLXBhdGgnIGhhcyBub3QgYmVlbiBkZWZpbmVkCi0gICAgICAgICAgICAvLyBHZXQgZGlyZWN0b3J5IHRvIHN0b3JlIG1lZGlhIGZpbGVzIG9uIHRoaXMgaG9zdAotICAgICAgICAgICAgRmlsZSBtZWRpYUZvbGRlciA9IGRvd25sb2FkTWVkaWFUb0hvc3QoZGV2aWNlLCBidWlsZEluZm8pOwotICAgICAgICAgICAgLy8gc2V0IG1Mb2NhbE1lZGlhUGF0aCB0byBleHRyYWN0aW9uIGxvY2F0aW9uIG9mIG1lZGlhIGZpbGVzCi0gICAgICAgICAgICB1cGRhdGVMb2NhbE1lZGlhUGF0aChkZXZpY2UsIG1lZGlhRm9sZGVyKTsKLSAgICAgICAgfQotICAgICAgICBsb2dJbmZvKCJNZWRpYSBmaWxlcyBsb2NhdGVkIG9uIGhvc3QgYXQ6ICVzIiwgbUxvY2FsTWVkaWFQYXRoKTsKLSAgICAgICAgaWYgKCFtTWVkaWFEb3dubG9hZE9ubHkpIHsKLSAgICAgICAgICAgIGNvcHlNZWRpYUZpbGVzKGRldmljZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBJbml0aWFsaXplIG1heGltdW0gcmVzb2x1dGlvbiBvZiBtZWRpYSBmaWxlcyB0byBjb3B5Ci0gICAgcHJpdmF0ZSB2b2lkIHNldE1heFJlcyhJVGVzdERldmljZSBkZXZpY2UsIElCdWlsZEluZm8gYnVpbGRJbmZvKQotICAgICAgICAgICAgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElUZXN0SW52b2NhdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IE1lZGlhUHJlcGFyZXJMaXN0ZW5lcigpOwotICAgICAgICBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIgYnVpbGRIZWxwZXIgPSBuZXcgQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyKGJ1aWxkSW5mbyk7Ci0gICAgICAgIEZpbGUgYXBrRmlsZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhcGtGaWxlID0gYnVpbGRIZWxwZXIuZ2V0VGVzdEZpbGUoQVBQX0FQSyk7Ci0gICAgICAgICAgICBpZiAoIWFwa0ZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBoYW5kbGUgYm90aCBtaXNzaW5nIHRlc3RzIGRpciBhbmQgbWlzc2luZyBBUEsgaW4gY2F0Y2ggYmxvY2sKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBtTWF4UmVzID0gREVGQVVMVF9NQVhfUkVTT0xVVElPTjsKLSAgICAgICAgICAgIGxvZ1dhcm5pbmcoIkNvdW5kIG5vdCBmaW5kICVzIHRvIGRldGVybWluZSBtYXhpbXVtIHJlc29sdXRpb24sIGNvcHlpbmcgdXAgdG8gJXMiLAotICAgICAgICAgICAgICAgICAgICBBUFBfQVBLLCBERUZBVUxUX01BWF9SRVNPTFVUSU9OLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkZXZpY2UuZ2V0QXBwUGFja2FnZUluZm8oQVBQX1BLR19OQU1FKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBkZXZpY2UudW5pbnN0YWxsUGFja2FnZShBUFBfUEtHX05BTUUpOwotICAgICAgICB9Ci0gICAgICAgIGxvZ0luZm8oIkluc3RydW1lbnRpbmcgcGFja2FnZSAlczoiLCBBUFBfUEtHX05BTUUpOwotICAgICAgICBBbmRyb2lkSlVuaXRUZXN0IGluc3RyVGVzdCA9IG5ldyBBbmRyb2lkSlVuaXRUZXN0KCk7Ci0gICAgICAgIGluc3RyVGVzdC5zZXREZXZpY2UoZGV2aWNlKTsKLSAgICAgICAgaW5zdHJUZXN0LnNldEluc3RhbGxGaWxlKGFwa0ZpbGUpOwotICAgICAgICBpbnN0clRlc3Quc2V0UGFja2FnZU5hbWUoQVBQX1BLR19OQU1FKTsKLSAgICAgICAgaW5zdHJUZXN0LnJ1bihsaXN0ZW5lcik7Ci0gICAgICAgIGlmIChtRmFpbHVyZVN0YWNrVHJhY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgbU1heFJlcyA9IERFRkFVTFRfTUFYX1JFU09MVVRJT047Ci0gICAgICAgICAgICBsb2dXYXJuaW5nKCJSZXRyaWV2aW5nIG1heGltdW0gcmVzb2x1dGlvbiBmYWlsZWQgd2l0aCB0cmFjZTpcbiVzIiwgbUZhaWx1cmVTdGFja1RyYWNlKTsKLSAgICAgICAgICAgIGxvZ1dhcm5pbmcoIkNvcHlpbmcgdXAgdG8gJXMiLCBERUZBVUxUX01BWF9SRVNPTFVUSU9OLnRvU3RyaW5nKCkpOwotICAgICAgICB9IGVsc2UgaWYgKG1NYXhSZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgbU1heFJlcyA9IERFRkFVTFRfTUFYX1JFU09MVVRJT047Ci0gICAgICAgICAgICBsb2dXYXJuaW5nKCJGYWlsZWQgdG8gcHVsbCByZXNvbHV0aW9uIGNhcGFiaWxpdGllcyBmcm9tIGRldmljZSwgY29weWluZyB1cCB0byAlcyIsCi0gICAgICAgICAgICAgICAgICAgIERFRkFVTFRfTUFYX1JFU09MVVRJT04udG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBTcGVjaWFsIGxpc3RlbmVyIGZvciBzZXR0aW5nIE1lZGlhUHJlcGFyZXIgaW5zdGFuY2UgdmFyaWFibGUgdmFsdWVzICovCi0gICAgcHJpdmF0ZSBjbGFzcyBNZWRpYVByZXBhcmVyTGlzdGVuZXIgaW1wbGVtZW50cyBJVGVzdEludm9jYXRpb25MaXN0ZW5lciB7Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RFbmRlZChUZXN0SWRlbnRpZmllciB0ZXN0LCBNYXA8U3RyaW5nLCBTdHJpbmc+IG1ldHJpY3MpIHsKLSAgICAgICAgICAgIFN0cmluZyByZXNTdHJpbmcgPSBtZXRyaWNzLmdldChSRVNPTFVUSU9OX1NUUklOR19LRVkpOwotICAgICAgICAgICAgaWYgKHJlc1N0cmluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbU1heFJlcyA9IG5ldyBSZXNvbHV0aW9uKHJlc1N0cmluZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgdGVzdEZhaWxlZChUZXN0SWRlbnRpZmllciB0ZXN0LCBTdHJpbmcgdHJhY2UpIHsKLSAgICAgICAgICAgIG1GYWlsdXJlU3RhY2tUcmFjZSA9IHRyYWNlOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdGFyZ2V0cHJlcC9OZXR3b3JrQ29ubmVjdGl2aXR5Q2hlY2tlci5qYXZhIGIvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdGFyZ2V0cHJlcC9OZXR3b3JrQ29ubmVjdGl2aXR5Q2hlY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTAzOGZiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3RhcmdldHByZXAvTmV0d29ya0Nvbm5lY3Rpdml0eUNoZWNrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRhcmdldHByZXA7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLk1vbml0b3JpbmdVdGlsczsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5JVGVzdERldmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5sb2cuTG9nVXRpbC5DTG9nOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnN1aXRlLmNoZWNrZXIuSVN5c3RlbVN0YXR1c0NoZWNrZXI7Ci0KLS8qKgotICogQ2hlY2tzIG5ldHdvcmsgY29ubmVjdGl2aXR5IHN0YXR1cyBvbiBkZXZpY2UgYWZ0ZXIgbW9kdWxlIGV4ZWN1dGlvbi4KLSAqLwotcHVibGljIGNsYXNzIE5ldHdvcmtDb25uZWN0aXZpdHlDaGVja2VyIGltcGxlbWVudHMgSVN5c3RlbVN0YXR1c0NoZWNrZXIgewotCi0gICAgLy8gT25seSByZXBvcnQgaXMgYXMgZmFpbGVkIChjYXB0dXJlIGJ1Z3JlcG9ydCkgd2hlbiBzdGF0dXMgZ29lcyBmcm9tIHBhc3MtPiBmYWlsCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc0ZhaWxlZCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHBvc3RFeGVjdXRpb25DaGVjayhJVGVzdERldmljZSBkZXZpY2UpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBpZiAoIU1vbml0b3JpbmdVdGlscy5jaGVja0RldmljZUNvbm5lY3Rpdml0eShkZXZpY2UpKSB7Ci0gICAgICAgICAgICBpZiAobUlzRmFpbGVkKSB7Ci0gICAgICAgICAgICAgICAgQ0xvZy53KCJOZXR3b3JrQ29ubmVjdGl2aXR5Q2hlY2tlciBpcyBzdGlsbCBmYWlsaW5nIG9uICVzLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UuZ2V0U2VyaWFsTnVtYmVyKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUlzRmFpbGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBtSXNGYWlsZWQgPSBmYWxzZTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdGFyZ2V0cHJlcC9QYWNrYWdlRGlzYWJsZXIuamF2YSBiL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3RhcmdldHByZXAvUGFja2FnZURpc2FibGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhN2NlMjIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdGFyZ2V0cHJlcC9QYWNrYWdlRGlzYWJsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRhcmdldHByZXA7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5idWlsZC5JQnVpbGRJbmZvOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmNvbmZpZy5PcHRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuY29uZmlnLk9wdGlvbkNsYXNzOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5EZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLklUZXN0RGV2aWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuQnVpbGRFcnJvcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlRhcmdldFNldHVwRXJyb3I7Ci0KLS8qKgotICogRGlzYWJsZXMgYSBwYWNrYWdlIGlmIGluc3RhbGxlZC4KLSAqLwotQE9wdGlvbkNsYXNzKGFsaWFzPSJwYWNrYWdlLWRpc2FibGVyIikKLXB1YmxpYyBjbGFzcyBQYWNrYWdlRGlzYWJsZXIgZXh0ZW5kcyBQcmVjb25kaXRpb25QcmVwYXJlciB7Ci0KLSAgICBAT3B0aW9uKG5hbWUgPSAicGFja2FnZSIsIGRlc2NyaXB0aW9uID0gIk5hbWUgb2YgdGhlIHBhY2thZ2UiLCBtYW5kYXRvcnkgPSB0cnVlKQotICAgIHByb3RlY3RlZCBTdHJpbmcgbVBhY2thZ2VOYW1lID0gbnVsbDsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJ1bihJVGVzdERldmljZSBkZXZpY2UsIElCdWlsZEluZm8gYnVpbGRJbmZvKQotICAgICAgICAgICAgdGhyb3dzIFRhcmdldFNldHVwRXJyb3IsIEJ1aWxkRXJyb3IsIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKGRldmljZS5nZXRBcHBQYWNrYWdlSW5mbyhtUGFja2FnZU5hbWUpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGxvZ0luZm8oIlBhY2thZ2UgJXMgaW5zdGFsbGVkLCBkaXNhYmxpbmcgLi4uIiwgbVBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgIGRldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKCJwbSBkaXNhYmxlLXVzZXIgIiArIG1QYWNrYWdlTmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC90YXJnZXRwcmVwL1ByZWNvbmRpdGlvblByZXBhcmVyLmphdmEgYi9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC90YXJnZXRwcmVwL1ByZWNvbmRpdGlvblByZXBhcmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0N2I1NmMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdGFyZ2V0cHJlcC9QcmVjb25kaXRpb25QcmVwYXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRhcmdldHByZXA7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5Db21wYXRpYmlsaXR5VGVzdDsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuTG9nOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmJ1aWxkLklCdWlsZEluZm87Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuY29uZmlnLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuY29uZmlnLk9wdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5jb25maWcuT3B0aW9uU2V0dGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5EZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLklUZXN0RGV2aWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmxvZy5Mb2dVdGlsOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmxvZy5Mb2dVdGlsLkNMb2c7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5CdWlsZEVycm9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuSVRhcmdldFByZXBhcmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuVGFyZ2V0U2V0dXBFcnJvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQW4ge0BsaW5rIElUYXJnZXRQcmVwYXJlcn0gdGhhdCBwZXJmb3JtcyBjaGVja3MgYW5kL29yIHRhc2tzIHRvIGVuc3VyZSB0aGUKLSAqIHRoZSBkZXZpY2UgaXMgcmVhZHkgdG8gcnVuIHRoZSB0ZXN0IHN1aXRlLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJlY29uZGl0aW9uUHJlcGFyZXIgaW1wbGVtZW50cyBJVGFyZ2V0UHJlcGFyZXIgewotCi0gICAgQE9wdGlvbihuYW1lID0gQ29tcGF0aWJpbGl0eVRlc3QuU0tJUF9QUkVDT05ESVRJT05TX09QVElPTiwKLSAgICAgICAgICAgIHNob3J0TmFtZSA9ICdvJywKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gIldoZXRoZXIgcHJlY29uZGl0aW9ucyBzaG91bGQgYmUgc2tpcHBlZCIpCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Ta2lwUHJlY29uZGl0aW9ucyA9IGZhbHNlOwotCi0gICAgQE9wdGlvbihuYW1lID0gQ29tcGF0aWJpbGl0eVRlc3QuUFJFQ09ORElUSU9OX0FSR19PUFRJT04sCi0gICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICJ0aGUgYXJndW1lbnRzIHRvIHBhc3MgdG8gYSBwcmVjb25kaXRpb24uIFRoZSBleHBlY3RlZCBmb3JtYXQgaXMiCi0gICAgICAgICAgICAgICAgICAgICsgIlwiPGFyZy1uYW1lPjo8YXJnLXZhbHVlPlwiIikKLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtUHJlY29uZGl0aW9uQXJncyA9IG5ldyBBcnJheUxpc3Q8PigpOwotCi0gICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBtTG9nVGFnID0gZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCk7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcChJVGVzdERldmljZSBkZXZpY2UsIElCdWlsZEluZm8gYnVpbGRJbmZvKSB0aHJvd3MgVGFyZ2V0U2V0dXBFcnJvciwKLSAgICAgICAgICAgIEJ1aWxkRXJyb3IsIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghbVNraXBQcmVjb25kaXRpb25zKSB7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBwcmVjb25kaXRpb25BcmcgOiBtUHJlY29uZGl0aW9uQXJncykgewotICAgICAgICAgICAgICAgIFN0cmluZ1tdIHBhcnRzID0gcHJlY29uZGl0aW9uQXJnLnNwbGl0KCI6Iik7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGFyZ05hbWUgPSBwYXJ0c1swXTsKLSAgICAgICAgICAgICAgICAvLyBJZiBhcmctdmFsdWUgaXMgbm90IHN1cHBsaWVkLCBzZXQgdG8gInRydWUiCi0gICAgICAgICAgICAgICAgU3RyaW5nIGFyZ1ZhbHVlID0gKHBhcnRzLmxlbmd0aCA+IDEpID8gcGFydHNbMV0gOiBCb29sZWFuLnRvU3RyaW5nKHRydWUpOwotICAgICAgICAgICAgICAgIHNldE9wdGlvbihhcmdOYW1lLCBhcmdWYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBydW4oZGV2aWNlLCBidWlsZEluZm8pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldE9wdGlvbihTdHJpbmcgb3B0aW9uLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9wdGlvblNldHRlciBzZXR0ZXIgPSBuZXcgT3B0aW9uU2V0dGVyKHRoaXMpOwotICAgICAgICAgICAgc2V0dGVyLnNldE9wdGlvblZhbHVlKG9wdGlvbiwgdmFsdWUpOwotICAgICAgICB9IGNhdGNoIChDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIENMb2cuaSgiVmFsdWUgJXMgZm9yIG9wdGlvbiAlcyBub3QgYXBwbGljYWJsZSBmb3IgY2xhc3MgJXMiLCB2YWx1ZSwgb3B0aW9uLAotICAgICAgICAgICAgICAgICAgICB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHJ1bihJVGVzdERldmljZSBkZXZpY2UsIElCdWlsZEluZm8gYnVpbGRJbmZvKQotICAgICAgICAgICAgdGhyb3dzIFRhcmdldFNldHVwRXJyb3IsIEJ1aWxkRXJyb3IsIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKLQotICAgIHByb3RlY3RlZCB2b2lkIGxvZ0luZm8oU3RyaW5nIGluZm8pIHsKLSAgICAgICAgTG9nVXRpbC5wcmludExvZyhMb2cuTG9nTGV2ZWwuSU5GTywgbUxvZ1RhZywgaW5mbyk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgbG9nSW5mbyhTdHJpbmcgaW5mb0Zvcm1hdCwgT2JqZWN0Li4uIGFyZ3MpIHsKLSAgICAgICAgTG9nVXRpbC5wcmludExvZyhMb2cuTG9nTGV2ZWwuSU5GTywgbUxvZ1RhZywgU3RyaW5nLmZvcm1hdChpbmZvRm9ybWF0LCBhcmdzKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgbG9nV2FybmluZyhTdHJpbmcgd2FybmluZykgewotICAgICAgICBMb2dVdGlsLnByaW50TG9nKExvZy5Mb2dMZXZlbC5XQVJOLCBtTG9nVGFnLCB3YXJuaW5nKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBsb2dXYXJuaW5nKFN0cmluZyB3YXJuaW5nRm9ybWF0LCBPYmplY3QuLi4gYXJncykgewotICAgICAgICBMb2dVdGlsLnByaW50TG9nKExvZy5Mb2dMZXZlbC5XQVJOLCBtTG9nVGFnLCBTdHJpbmcuZm9ybWF0KHdhcm5pbmdGb3JtYXQsIGFyZ3MpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBsb2dFcnJvcihTdHJpbmcgZXJyb3IpIHsKLSAgICAgICAgTG9nVXRpbC5wcmludExvZyhMb2cuTG9nTGV2ZWwuRVJST1IsIG1Mb2dUYWcsIGVycm9yKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBsb2dFcnJvcihTdHJpbmcgZXJyb3JGb3JtYXQsIE9iamVjdC4uLiBhcmdzKSB7Ci0gICAgICAgIExvZ1V0aWwucHJpbnRMb2coTG9nLkxvZ0xldmVsLkVSUk9SLCBtTG9nVGFnLCBTdHJpbmcuZm9ybWF0KGVycm9yRm9ybWF0LCBhcmdzKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgbG9nRXJyb3IoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgaWYgKHQgIT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLmUobUxvZ1RhZywgdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3RhcmdldHByZXAvUHJvcGVydHlDaGVjay5qYXZhIGIvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdGFyZ2V0cHJlcC9Qcm9wZXJ0eUNoZWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MmMwOTUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdGFyZ2V0cHJlcC9Qcm9wZXJ0eUNoZWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGFyZ2V0cHJlcDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmJ1aWxkLklCdWlsZEluZm87Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuY29uZmlnLk9wdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5jb25maWcuT3B0aW9uQ2xhc3M7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLkRldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuSVRlc3REZXZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5CdWlsZEVycm9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuVGFyZ2V0U2V0dXBFcnJvcjsKLQotLyoqCi0gKiBDaGVja3MgdGhhdCBhIGRldmljZSBwcm9wZXJ0eSBpcyBhcyBleHBlY3RlZAotICovCi1AT3B0aW9uQ2xhc3MoYWxpYXM9InByb3BlcnR5LWNoZWNrIikKLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eUNoZWNrIGV4dGVuZHMgUHJlY29uZGl0aW9uUHJlcGFyZXIgewotCi0gICAgQE9wdGlvbihuYW1lID0gInByb3BlcnR5LW5hbWUiLCBkZXNjcmlwdGlvbiA9ICJUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gY2hlY2siLAotICAgICAgICAgICAgbWFuZGF0b3J5ID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG1Qcm9wZXJ0eU5hbWUgPSBudWxsOwotCi0gICAgQE9wdGlvbihuYW1lID0gImV4cGVjdGVkLXZhbHVlIiwgZGVzY3JpcHRpb24gPSAiVGhlIGV4cGVjdGVkIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSIsCi0gICAgICAgICAgICBtYW5kYXRvcnkgPSB0cnVlKQotICAgIHByb3RlY3RlZCBTdHJpbmcgbUV4cGVjdGVkUHJvcGVydHlWYWx1ZSA9IG51bGw7Ci0KLSAgICBAT3B0aW9uKG5hbWUgPSAidGhyb3ctZXJyb3IiLAotICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAiV2hldGhlciB0byB0aHJvdyBhbiBlcnJvciBmb3IgYW4gdW5leHBlY3RlZCBwcm9wZXJ0eSB2YWx1ZSIpCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gbVRocm93RXJyb3IgPSBmYWxzZTsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJ1bihJVGVzdERldmljZSBkZXZpY2UsIElCdWlsZEluZm8gYnVpbGRJbmZvKSB0aHJvd3MgVGFyZ2V0U2V0dXBFcnJvciwKLSAgICAgICAgICAgIEJ1aWxkRXJyb3IsIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIHByb3BlcnR5VmFsdWUgPSBkZXZpY2UuZ2V0UHJvcGVydHkobVByb3BlcnR5TmFtZSk7Ci0gICAgICAgIGlmIChwcm9wZXJ0eVZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgIGxvZ1dhcm5pbmcoIlByb3BlcnR5IFwiJXNcIiBub3QgZm91bmQgb24gZGV2aWNlLCBjYW5ub3QgdmVyaWZ5IHZhbHVlIFwiJXNcIiAiLAotICAgICAgICAgICAgICAgICAgICBtUHJvcGVydHlOYW1lLCBtRXhwZWN0ZWRQcm9wZXJ0eVZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghbUV4cGVjdGVkUHJvcGVydHlWYWx1ZS5lcXVhbHNJZ25vcmVDYXNlKHByb3BlcnR5VmFsdWUpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gU3RyaW5nLmZvcm1hdCgiRXhwZWN0ZWQgXCIlc1wiIGJ1dCBmb3VuZCBcIiVzXCIgZm9yIHByb3BlcnR5OiAlcyIsCi0gICAgICAgICAgICAgICAgICAgIG1FeHBlY3RlZFByb3BlcnR5VmFsdWUsIHByb3BlcnR5VmFsdWUsIG1Qcm9wZXJ0eU5hbWUpOwotICAgICAgICAgICAgLy8gSGFuZGxlIHVuZXhwZWN0ZWQgcHJvcGVydHkgdmFsdWUgd2l0aCBlaXRoZXIgZXhjZXB0aW9uIG9yIHdhcm5pbmcKLSAgICAgICAgICAgIGlmKG1UaHJvd0Vycm9yKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRhcmdldFNldHVwRXJyb3IobXNnLCBkZXZpY2UuZ2V0RGV2aWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbG9nV2FybmluZyhtc2cpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC90YXJnZXRwcmVwL1JlcG9ydExvZ0NvbGxlY3Rvci5qYXZhIGIvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdGFyZ2V0cHJlcC9SZXBvcnRMb2dDb2xsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDViYjkzOS4uMDAwMDAwMAotLS0gYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC90YXJnZXRwcmVwL1JlcG9ydExvZ0NvbGxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRhcmdldHByZXA7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC5idWlsZC5Db21wYXRpYmlsaXR5QnVpbGRIZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudXRpbC5Db2xsZWN0b3JVdGlsOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmJ1aWxkLklCdWlsZEluZm87Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuY29uZmlnLk9wdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5JVGVzdERldmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5sb2cuTG9nVXRpbC5DTG9nOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuQnVpbGRFcnJvcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLklUYXJnZXRDbGVhbmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuVGFyZ2V0U2V0dXBFcnJvcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC51dGlsLkZpbGVVdGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotCi0vKioKLSAqIEFuIHtAbGluayBJVGFyZ2V0Q2xlYW5lcn0gdGhhdCBwcmVwYXJlcyBhbmQgcHVsbHMgcmVwb3J0IGxvZ3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXBvcnRMb2dDb2xsZWN0b3IgaW1wbGVtZW50cyBJVGFyZ2V0Q2xlYW5lciB7Ci0KLSAgICBAT3B0aW9uKG5hbWU9ICJzcmMtZGlyIiwgZGVzY3JpcHRpb24gPSAiVGhlIGRpcmVjdG9yeSB0byBjb3B5IHRvIHRoZSByZXN1bHRzIGRpciIpCi0gICAgcHJpdmF0ZSBTdHJpbmcgbVNyY0RpcjsKLQotICAgIEBPcHRpb24obmFtZSA9ICJkZXN0LWRpciIsIGRlc2NyaXB0aW9uID0gIlRoZSBkaXJlY3RvcnkgdW5kZXIgdGhlIHJlc3VsdCB0byBzdG9yZSB0aGUgZmlsZXMiKQotICAgIHByaXZhdGUgU3RyaW5nIG1EZXN0RGlyOwotCi0gICAgQE9wdGlvbihuYW1lID0gInRlbXAtZGlyIiwgZGVzY3JpcHRpb24gPSAiVGhlIHRlbXAgZGlyZWN0b3J5IGNvbnRhaW5pbmcgaG9zdC1zaWRlIHJlcG9ydCBsb2dzIikKLSAgICBwcml2YXRlIFN0cmluZyBtVGVtcFJlcG9ydEZvbGRlcjsKLQotICAgIEBPcHRpb24obmFtZSA9ICJkZXZpY2UtZGlyIiwgZGVzY3JpcHRpb24gPSAiQ3JlYXRlIHVuaXF1ZSBkaXJlY3RvcnkgZm9yIGVhY2ggZGV2aWNlIikKLSAgICBwcml2YXRlIGJvb2xlYW4gbURldmljZURpcjsKLQotICAgIHB1YmxpYyBSZXBvcnRMb2dDb2xsZWN0b3IoKSB7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VXAoSVRlc3REZXZpY2UgZGV2aWNlLCBJQnVpbGRJbmZvIGJ1aWxkSW5mbykgdGhyb3dzIFRhcmdldFNldHVwRXJyb3IsCi0gICAgICAgICAgICBCdWlsZEVycm9yLCBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBwcmVwYXJlUmVwb3J0TG9nQ29udGFpbmVycyhkZXZpY2UsIGJ1aWxkSW5mbyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByZXBhcmVSZXBvcnRMb2dDb250YWluZXJzKElUZXN0RGV2aWNlIGRldmljZSwgSUJ1aWxkSW5mbyBidWlsZEluZm8pIHsKLSAgICAgICAgQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyIGJ1aWxkSGVscGVyID0gbmV3IENvbXBhdGliaWxpdHlCdWlsZEhlbHBlcihidWlsZEluZm8pOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgRmlsZSByZXN1bHREaXIgPSBidWlsZEhlbHBlci5nZXRSZXN1bHREaXIoKTsKLSAgICAgICAgICAgIGlmIChtRGVzdERpciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0RGlyID0gbmV3IEZpbGUocmVzdWx0RGlyLCBtRGVzdERpcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXN1bHREaXIubWtkaXJzKCk7Ci0gICAgICAgICAgICBpZiAoIXJlc3VsdERpci5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgQ0xvZy5lKCIlcyBpcyBub3QgYSBkaXJlY3RvcnkiLCByZXN1bHREaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZuZmUpIHsKLSAgICAgICAgICAgIGZuZmUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bihJVGVzdERldmljZSBkZXZpY2UsIElCdWlsZEluZm8gYnVpbGRJbmZvLCBUaHJvd2FibGUgZSkgewotICAgICAgICAvLyBQdWxsIHJlcG9ydCBsb2cgZmlsZXMgZnJvbSBkZXZpY2UuCi0gICAgICAgIENvbXBhdGliaWxpdHlCdWlsZEhlbHBlciBidWlsZEhlbHBlciA9IG5ldyBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIoYnVpbGRJbmZvKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEZpbGUgcmVzdWx0RGlyID0gYnVpbGRIZWxwZXIuZ2V0UmVzdWx0RGlyKCk7Ci0gICAgICAgICAgICBpZiAobURlc3REaXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlc3VsdERpciA9IG5ldyBGaWxlKHJlc3VsdERpciwgbURlc3REaXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVzdWx0RGlyLm1rZGlycygpOwotICAgICAgICAgICAgaWYgKCFyZXN1bHREaXIuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgICAgIENMb2cuZSgiJXMgaXMgbm90IGEgZGlyZWN0b3J5IiwgcmVzdWx0RGlyLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgdG1wRGlyTmFtZSA9IG1UZW1wUmVwb3J0Rm9sZGVyOwotICAgICAgICAgICAgaWYgKG1EZXZpY2VEaXIpIHsKLSAgICAgICAgICAgICAgICB0bXBEaXJOYW1lID0gdG1wRGlyTmFtZS5yZXBsYWNlQWxsKCIvJCIsICIiKTsKLSAgICAgICAgICAgICAgICB0bXBEaXJOYW1lICs9ICItIiArIGRldmljZS5nZXRTZXJpYWxOdW1iZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIEZpbGUgaG9zdFJlcG9ydERpciA9IEZpbGVVdGlsLmNyZWF0ZU5hbWVkVGVtcERpcih0bXBEaXJOYW1lKTsKLSAgICAgICAgICAgIGlmICghaG9zdFJlcG9ydERpci5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgQ0xvZy5lKCIlcyBpcyBub3QgYSBkaXJlY3RvcnkiLCBob3N0UmVwb3J0RGlyLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgcmVzdWx0UGF0aCA9IHJlc3VsdERpci5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgICAgIENvbGxlY3RvclV0aWwucHVsbEZyb21EZXZpY2UoZGV2aWNlLCBtU3JjRGlyLCByZXN1bHRQYXRoKTsKLSAgICAgICAgICAgIENvbGxlY3RvclV0aWwucHVsbEZyb21Ib3N0KGhvc3RSZXBvcnREaXIsIHJlc3VsdERpcik7Ci0gICAgICAgICAgICBDb2xsZWN0b3JVdGlsLnJlZm9ybWF0UmVwZWF0ZWRTdHJlYW1zKHJlc3VsdERpcik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLSAgICAgICAgICAgIGV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3RhcmdldHByZXAvUmVzdWx0RmlsZVB1bGxlci5qYXZhIGIvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdGFyZ2V0cHJlcC9SZXN1bHRGaWxlUHVsbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMmYyMjMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdGFyZ2V0cHJlcC9SZXN1bHRGaWxlUHVsbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRhcmdldHByZXA7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC5idWlsZC5Db21wYXRpYmlsaXR5QnVpbGRIZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuYnVpbGQuSUJ1aWxkSW5mbzsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5jb25maWcuT3B0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmNvbmZpZy5PcHRpb25DbGFzczsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5JVGVzdERldmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5sb2cuTG9nVXRpbC5DTG9nOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuQnVpbGRFcnJvcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLklUYXJnZXRDbGVhbmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuVGFyZ2V0U2V0dXBFcnJvcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIFB1bGxzIGZpbGVzIGZyb20gdGhlIGRldmljZSBhZnRlciBhIHRlc3QgcnVuIGFuZCBwdXRzIHRoZW0gaW50byB0aGUgcmVzdWx0IGZvbGRlci4KLSAqLwotQE9wdGlvbkNsYXNzKGFsaWFzPSJyZXN1bHQtZmlsZS1wdWxsZXIiKQotcHVibGljIGNsYXNzIFJlc3VsdEZpbGVQdWxsZXIgaW1wbGVtZW50cyBJVGFyZ2V0Q2xlYW5lciB7Ci0KLSAgICBAT3B0aW9uKG5hbWU9ImNsZWFyIiwgZGVzY3JpcHRpb24gPSAiV2hldGhlciB0byBjbGVhciB0aGUgc3JjIGZpbGVzIGFuZCBkaXJzIGJlZm9yZSBydW5uaW5nIHRoZSB0ZXN0IikKLSAgICBwcml2YXRlIGJvb2xlYW4gbUNsZWFyU3JjID0gdHJ1ZTsKLQotICAgIEBPcHRpb24obmFtZT0ic3JjLWZpbGUiLCBkZXNjcmlwdGlvbiA9ICJUaGUgZmlsZSB0byBjb3B5IHRvIHRoZSByZXN1bHRzIGRpciIpCi0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbVNyY0ZpbGVzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0KLSAgICBAT3B0aW9uKG5hbWU9InNyYy1kaXIiLCBkZXNjcmlwdGlvbiA9ICJUaGUgZGlyZWN0b3J5IHRvIGNvcHkgdG8gdGhlIHJlc3VsdHMgZGlyIikKLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtU3JjRGlycyA9IG5ldyBBcnJheUxpc3Q8PigpOwotCi0gICAgQE9wdGlvbihuYW1lID0gImRlc3QtZGlyIiwgZGVzY3JpcHRpb24gPSAiVGhlIGRpcmVjdG9yeSB1bmRlciB0aGUgcmVzdWx0IHRvIHN0b3JlIHRoZSBmaWxlcyIpCi0gICAgcHJpdmF0ZSBTdHJpbmcgbURlc3REaXI7Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VXAoSVRlc3REZXZpY2UgZGV2aWNlLCBJQnVpbGRJbmZvIGJ1aWxkSW5mbykgdGhyb3dzIFRhcmdldFNldHVwRXJyb3IsIEJ1aWxkRXJyb3IsCi0gICAgICAgICAgICBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBpZiAobUNsZWFyU3JjKSB7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBmaWxlIDogbVNyY0ZpbGVzKSB7Ci0gICAgICAgICAgICAgICAgZGVsZXRlKGRldmljZSwgZmlsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBkaXIgOiBtU3JjRGlycykgewotICAgICAgICAgICAgICAgIGRlbGV0ZShkZXZpY2UsIGRpcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZGVsZXRlKElUZXN0RGV2aWNlIGRldmljZSwgU3RyaW5nIGZpbGUpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBkZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZChTdHJpbmcuZm9ybWF0KCJybSAtcmYgJXMiLCBmaWxlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKElUZXN0RGV2aWNlIGRldmljZSwgSUJ1aWxkSW5mbyBidWlsZEluZm8sIFRocm93YWJsZSBlKQotICAgICAgICAgICAgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIENvbXBhdGliaWxpdHlCdWlsZEhlbHBlciBidWlsZEhlbHBlciA9IG5ldyBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIoYnVpbGRJbmZvKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEZpbGUgcmVzdWx0RGlyID0gYnVpbGRIZWxwZXIuZ2V0UmVzdWx0RGlyKCk7Ci0gICAgICAgICAgICBpZiAobURlc3REaXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlc3VsdERpciA9IG5ldyBGaWxlKHJlc3VsdERpciwgbURlc3REaXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVzdWx0RGlyLm1rZGlycygpOwotICAgICAgICAgICAgaWYgKCFyZXN1bHREaXIuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgICAgIENMb2cuZSgiJXMgaXMgbm90IGEgZGlyZWN0b3J5IiwgcmVzdWx0RGlyLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgcmVzdWx0UGF0aCA9IHJlc3VsdERpci5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGZpbGUgOiBtU3JjRmlsZXMpIHsKLSAgICAgICAgICAgICAgICBwdWxsKGRldmljZSwgZmlsZSwgcmVzdWx0UGF0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBkaXIgOiBtU3JjRGlycykgewotICAgICAgICAgICAgICAgIHB1bGwoZGV2aWNlLCBkaXIsIHJlc3VsdFBhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZm5mZSkgewotICAgICAgICAgICAgZm5mZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwdWxsKElUZXN0RGV2aWNlIGRldmljZSwgU3RyaW5nIHNyYywgU3RyaW5nIGRlc3QpIHsKLSAgICAgICAgU3RyaW5nIGNvbW1hbmQgPSBTdHJpbmcuZm9ybWF0KCJhZGIgLXMgJXMgcHVsbCAlcyAlcyIsIGRldmljZS5nZXRTZXJpYWxOdW1iZXIoKSwgc3JjLCBkZXN0KTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFByb2Nlc3MgcCA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4ZWMobmV3IFN0cmluZ1tdIHsiL2Jpbi9iYXNoIiwgIi1jIiwgY29tbWFuZH0pOwotICAgICAgICAgICAgaWYgKHAud2FpdEZvcigpICE9IDApIHsKLSAgICAgICAgICAgICAgICBDTG9nLmUoIkZhaWxlZCB0byBydW4gJXMiLCBjb21tYW5kKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIENMb2cuZSgiQ2F1Z2h0IGV4Y2VwdGlvbiBkdXJpbmcgcHVsbC4iKTsKLSAgICAgICAgICAgIENMb2cuZShlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3RhcmdldHByZXAvU2V0dGluZ3NQcmVwYXJlci5qYXZhIGIvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdGFyZ2V0cHJlcC9TZXR0aW5nc1ByZXBhcmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MTUxZjUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdGFyZ2V0cHJlcC9TZXR0aW5nc1ByZXBhcmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRhcmdldHByZXA7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5idWlsZC5JQnVpbGRJbmZvOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmNvbmZpZy5PcHRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuY29uZmlnLk9wdGlvbkNsYXNzOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5EZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLklUZXN0RGV2aWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmxvZy5Mb2dVdGlsLkNMb2c7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5CdWlsZEVycm9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuVGFyZ2V0U2V0dXBFcnJvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQ2hlY2tzIHRoYXQgYSBnaXZlbiBzZXR0aW5nIG9uIHRoZSBkZXZpY2UgaXMgb25lIG9mIHRoZSBnaXZlbiB2YWx1ZXMKLSAqLwotQE9wdGlvbkNsYXNzKGFsaWFzPSJzZXR0aW5ncy1wcmVwYXJlciIpCi1wdWJsaWMgY2xhc3MgU2V0dGluZ3NQcmVwYXJlciBleHRlbmRzIFByZWNvbmRpdGlvblByZXBhcmVyIHsKLQotICAgIHB1YmxpYyBlbnVtIFNldHRpbmdUeXBlIHsKLSAgICAgICAgU0VDVVJFLAotICAgICAgICBHTE9CQUwsCi0gICAgICAgIFNZU1RFTTsKLSAgICB9Ci0KLSAgICAvKiBUaGlzIG9wdGlvbiBtdXN0IGJlIGRlZmluZWQsIGJ1dCBpcyBub3QgZXhwbGljaXRseSBtYXJrZWQgbWFuZGF0b3J5LCBhcyBzdWJjbGFzc2VzIG9mCi0gICAgICogdGhlIFNldHRpbmdzUHJlcGFyZXIgY2xhc3MgY2FuIGRlZmluZSBtU2V0dGluZ05hbWUgYXQgcnVudGltZSAqLwotICAgIEBPcHRpb24obmFtZSA9ICJkZXZpY2Utc2V0dGluZyIsIGRlc2NyaXB0aW9uID0gIlRoZSBzZXR0aW5nIG9uIHRoZSBkZXZpY2UgdG8gYmUgY2hlY2tlZCIpCi0gICAgcHJvdGVjdGVkIFN0cmluZyBtU2V0dGluZ05hbWUgPSBudWxsOwotCi0gICAgLyogVGhpcyBvcHRpb24gbXVzdCBiZSBkZWZpbmVkLCBidXQgaXMgbm90IGV4cGxpY2l0bHkgbWFya2VkIG1hbmRhdG9yeSwgYXMgc3ViY2xhc3NlcyBvZgotICAgICAqIHRoZSBTZXR0aW5nc1ByZXBhcmVyIGNsYXNzIGNhbiBkZWZpbmUgbVNldHRpbmdUeXBlIGF0IHJ1bnRpbWUgKi8KLSAgICBAT3B0aW9uKG5hbWUgPSAic2V0dGluZy10eXBlIiwKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gIklmIHRoZSBzZXR0aW5nIGlzICdzZWN1cmUnLCAnZ2xvYmFsJywgb3IgJ3N5c3RlbSciKQotICAgIHByb3RlY3RlZCBTZXR0aW5nVHlwZSBtU2V0dGluZ1R5cGUgPSBudWxsOwotCi0gICAgQE9wdGlvbihuYW1lID0gInNldC12YWx1ZSIsIGRlc2NyaXB0aW9uID0gIlRoZSB2YWx1ZSB0byBiZSBzZXQgZm9yIHRoZSBzZXR0aW5nIikKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG1TZXRWYWx1ZSA9IG51bGw7Ci0KLSAgICBAT3B0aW9uKG5hbWUgPSAiZXhwZWN0ZWQtdmFsdWVzIiwgZGVzY3JpcHRpb24gPSAiVGhlIHNldCBvZiBleHBlY3RlZCB2YWx1ZXMgb2YgdGhlIHNldHRpbmciKQotICAgIHByb3RlY3RlZCBMaXN0PFN0cmluZz4gbUV4cGVjdGVkU2V0dGluZ1ZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0gICAgQE9wdGlvbihuYW1lID0gImZhaWx1cmUtbWVzc2FnZSIsIGRlc2NyaXB0aW9uID0gIlRoZSB0ZXh0IHByaW50ZWQgZm9yIGFuIHVuZXhwZWN0ZWQgdmFsdWUiKQotICAgIHByb3RlY3RlZCBTdHJpbmcgbUZhaWx1cmVNZXNzYWdlID0gbnVsbDsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJ1bihJVGVzdERldmljZSBkZXZpY2UsIElCdWlsZEluZm8gYnVpbGRJbmZvKSB0aHJvd3MgVGFyZ2V0U2V0dXBFcnJvciwKLSAgICAgICAgICAgIEJ1aWxkRXJyb3IsIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKG1TZXR0aW5nTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVGFyZ2V0U2V0dXBFcnJvcigiVGhlIFwiZGV2aWNlLXNldHRpbmdcIiBvcHRpb24gbXVzdCBiZSBkZWZpbmVkIGZvciB0aGUgIiArCi0gICAgICAgICAgICAgICAgICAgICJTZXR0aW5nc1ByZXBhcmVyIGNsYXNzIiwgZGV2aWNlLmdldERldmljZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVNldHRpbmdUeXBlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBUYXJnZXRTZXR1cEVycm9yKCJUaGUgXCJzZXR0aW5nLXR5cGVcIiBvcHRpb24gbXVzdCBiZSBkZWZpbmVkIGZvciB0aGUgIiArCi0gICAgICAgICAgICAgICAgICAgICJTZXR0aW5nc1ByZXBhcmVyIGNsYXNzIiwgZGV2aWNlLmdldERldmljZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBBdCBsZWFzdCBvbmUgb2YgdGhlIG9wdGlvbnMgInNldC12YWx1ZSIgYW5kICJleHBlY3RlZC12YWx1ZXMiIG11c3QgYmUgc2V0ICovCi0gICAgICAgIGlmIChtU2V0VmFsdWUgPT0gbnVsbCAmJiBtRXhwZWN0ZWRTZXR0aW5nVmFsdWVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFRhcmdldFNldHVwRXJyb3IoIkF0IGxlYXN0IG9uZSBvZiB0aGUgb3B0aW9ucyBcInNldC12YWx1ZVwiIGFuZCAiICsKLSAgICAgICAgICAgICAgICAgICAgIlwiZXhwZWN0ZWQtdmFsdWVzXCIgbXVzdCBiZSBzZXQiLCBkZXZpY2UuZ2V0RGV2aWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBzaGVsbENtZEdldCA9ICghbUV4cGVjdGVkU2V0dGluZ1ZhbHVlcy5pc0VtcHR5KCkpID8KLSAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJzZXR0aW5ncyBnZXQgJXMgJXMiLCBtU2V0dGluZ1R5cGUsIG1TZXR0aW5nTmFtZSkgOiAiIjsKLSAgICAgICAgU3RyaW5nIHNoZWxsQ21kUHV0ID0gKG1TZXRWYWx1ZSAhPSBudWxsKSA/Ci0gICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgic2V0dGluZ3MgcHV0ICVzICVzICVzIiwgbVNldHRpbmdUeXBlLCBtU2V0dGluZ05hbWUsIG1TZXRWYWx1ZSkgOiAiIjsKLQotCi0gICAgICAgIC8qIENhc2UgMTogQm90aCBleHBlY3RlZC12YWx1ZXMgYW5kIHNldC12YWx1ZSBhcmUgZ2l2ZW4gKi8KLSAgICAgICAgaWYgKG1TZXRWYWx1ZSAhPSBudWxsICYmICFtRXhwZWN0ZWRTZXR0aW5nVmFsdWVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgLy8gZmlyc3QgZW5zdXJlIHRoYXQgdGhlIHNldC12YWx1ZSBnaXZlbiBjYW4gYmUgZm91bmQgaW4gZXhwZWN0ZWQtdmFsdWVzCi0gICAgICAgICAgICBpZiAoIW1FeHBlY3RlZFNldHRpbmdWYWx1ZXMuY29udGFpbnMobVNldFZhbHVlKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBUYXJnZXRTZXR1cEVycm9yKFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAic2V0LXZhbHVlIGZvciAlcyBpcyAlcywgYnV0IHZhbHVlIG5vdCBmb3VuZCBpbiBleHBlY3RlZC12YWx1ZXM6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nTmFtZSwgbVNldFZhbHVlLCBtRXhwZWN0ZWRTZXR0aW5nVmFsdWVzLnRvU3RyaW5nKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLmdldERldmljZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgY3VycmVudFNldHRpbmdWYWx1ZSA9IGRldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKHNoZWxsQ21kR2V0KS50cmltKCk7Ci0gICAgICAgICAgICAvLyBvbmx5IGNoYW5nZSB1bmV4cGVjdGVkIHNldHRpbmcgdmFsdWUKLSAgICAgICAgICAgIGlmICghbUV4cGVjdGVkU2V0dGluZ1ZhbHVlcy5jb250YWlucyhjdXJyZW50U2V0dGluZ1ZhbHVlKSkgewotICAgICAgICAgICAgICAgIENMb2cuZCgiQ2hhbmdpbmcgdmFsdWUgZm9yICVzIGZyb20gJXMgdG8gJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdOYW1lLCBjdXJyZW50U2V0dGluZ1ZhbHVlLCBtU2V0VmFsdWUpOwotICAgICAgICAgICAgICAgIGRldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKHNoZWxsQ21kUHV0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIENhc2UgMjogT25seSBzZXQtdmFsdWUgZ2l2ZW4gKi8KLSAgICAgICAgaWYgKG1TZXRWYWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBDTG9nLmQoIlNldHRpbmcgJXMgdG8gdmFsdWUgJXMiLCBtU2V0dGluZ05hbWUsIG1TZXRWYWx1ZSk7Ci0gICAgICAgICAgICBkZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZChzaGVsbENtZFB1dCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBDYXNlIDM6IE9ubHkgZXhwZWN0ZWQtdmFsdWVzIGdpdmVuICovCi0gICAgICAgIFN0cmluZyBjdXJyZW50U2V0dGluZ1ZhbHVlID0gZGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoc2hlbGxDbWRHZXQpLnRyaW0oKTsKLSAgICAgICAgaWYgKCFtRXhwZWN0ZWRTZXR0aW5nVmFsdWVzLmNvbnRhaW5zKGN1cnJlbnRTZXR0aW5nVmFsdWUpKSB7Ci0gICAgICAgICAgICBpZiAobUZhaWx1cmVNZXNzYWdlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtRmFpbHVyZU1lc3NhZ2UgPSBTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgIkRldmljZSBzZXR0aW5nIFwiJXNcIiByZXR1cm5lZCBcIiVzXCIsIG5vdCBmb3VuZCBpbiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ05hbWUsIGN1cnJlbnRTZXR0aW5nVmFsdWUsIG1FeHBlY3RlZFNldHRpbmdWYWx1ZXMudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVGFyZ2V0U2V0dXBFcnJvcihtRmFpbHVyZU1lc3NhZ2UsIGRldmljZS5nZXREZXZpY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC90YXJnZXRwcmVwL1N0YXlBd2FrZVByZXBhcmVyLmphdmEgYi9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC90YXJnZXRwcmVwL1N0YXlBd2FrZVByZXBhcmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhOWJkY2YuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdGFyZ2V0cHJlcC9TdGF5QXdha2VQcmVwYXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRhcmdldHByZXA7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5idWlsZC5JQnVpbGRJbmZvOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmNvbmZpZy5PcHRpb25DbGFzczsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5JVGVzdERldmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLkJ1aWxkRXJyb3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5UYXJnZXRTZXR1cEVycm9yOwotCi0vKioKLSAqIE1vZGlmaWVzIHRoZSAnU3RheSBBd2FrZScgc2V0dGluZyBvZiB0aGUgZGV2aWNlLCBzbyB0aGF0IHRoZSBkZXZpY2UncyBzY3JlZW4gc3RheXMgb24KLSAqIHdoZW5ldmVyIGNoYXJnaW5nIHZpYSBVU0IKLSAqLwotQE9wdGlvbkNsYXNzKGFsaWFzPSJzdGF5LWF3YWtlLXByZXBhcmVyIikKLXB1YmxpYyBjbGFzcyBTdGF5QXdha2VQcmVwYXJlciBleHRlbmRzIFNldHRpbmdzUHJlcGFyZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVlfQVdBS0VfU0VUVElORyA9ICJzdGF5X29uX3doaWxlX3BsdWdnZWRfaW4iOwotCi0gICAgLyoKLSAgICAgKiBWYWx1ZXMgdGhhdCBhcmUgYXBwcm9wcmlhdGUgZm9yIHRoZSAiU3RheSBBd2FrZSIgc2V0dGluZyB3aGlsZSBydW5uaW5nIGNvbXBhdGliaWxpdHkgdGVzdHM6Ci0gICAgICogKHRoZSBzZWNvbmQgYml0IG11c3QgYmUgJ29uJyB0byBhbGxvdyBzY3JlZW4gdG8gc3RheSBhd2FrZSB3aGlsZSBjaGFyZ2luZyB2aWEgVVNCKQotICAgICAqIDIgLSBTdGF5IGF3YWtlIHdoaWxlIGNoYXJnaW5nIHZpYSBVU0IKLSAgICAgKiAzIC0gU3RheSBhd2FrZSB3aGlsZSBjaGFuZ2luZyB2aWEgVVNCIG9yIEFDCi0gICAgICogNiAtIFN0YXkgYXdha2Ugd2hpbGUgY2hhcmdpbmcgdmlhIFVTQiBvciBXaXJlbGVzcwotICAgICAqIDcgLSBTdGF5IGF3YWtlIHdoaWxlIGNoYXJnaW5nIHZpYSBVU0Igb3IgQUMgb3IgV2lyZWxlc3MKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBTVEFZX0FXQUtFX1ZBTFVFUyA9IG5ldyBTdHJpbmdbXSB7IjIiLCAiMyIsICI2IiwgIjcifTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9WQUxVRSA9ICI3IjsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJ1bihJVGVzdERldmljZSBkZXZpY2UsIElCdWlsZEluZm8gYnVpbGRJbmZvKSB0aHJvd3MgVGFyZ2V0U2V0dXBFcnJvciwKLSAgICAgICAgICAgIEJ1aWxkRXJyb3IsIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgbVNldHRpbmdOYW1lID0gU1RBWV9BV0FLRV9TRVRUSU5HOwotICAgICAgICBtU2V0dGluZ1R5cGUgPSBTZXR0aW5nc1ByZXBhcmVyLlNldHRpbmdUeXBlLkdMT0JBTDsKLSAgICAgICAgbVNldFZhbHVlID0gREVGQVVMVF9WQUxVRTsKLSAgICAgICAgZm9yIChTdHJpbmcgdmFsdWUgOiBTVEFZX0FXQUtFX1ZBTFVFUykgewotICAgICAgICAgICAgbUV4cGVjdGVkU2V0dGluZ1ZhbHVlcy5hZGQodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLnJ1bihkZXZpY2UsIGJ1aWxkSW5mbyk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC90YXJnZXRwcmVwL1Rva2VuUmVxdWlyZW1lbnQuamF2YSBiL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3RhcmdldHByZXAvVG9rZW5SZXF1aXJlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWZhZWU5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3RhcmdldHByZXAvVG9rZW5SZXF1aXJlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGFyZ2V0cHJlcDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmJ1aWxkLklCdWlsZEluZm87Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuY29uZmlnLk9wdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5JVGVzdERldmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5sb2cuTG9nVXRpbC5DTG9nOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuQnVpbGRFcnJvcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLklUYXJnZXRQcmVwYXJlcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlRhcmdldFNldHVwRXJyb3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIEFuIHtAbGluayBJVGFyZ2V0UHJlcGFyZXJ9IHRoYXQgYWxsb3dzIGEgdGVzdCBtb2R1bGUgdG8gc3BlY2lmeSB0b2tlbnMgdGhhdCBhIGRldmljZSBtdXN0IGhhdmUKLSAqIHRvIHJ1biB0aGUgdGVzdHMgY29udGFpbmVkLgotICoKLSAqIEEgdG9rZW4gaXMgc3RyaW5nIHRoYXQgaXMgcmVxdWlyZWQgYnkgYSB0ZXN0IG1vZHVsZSBhbmQgZ2l2ZW4gdG8gYSBkZXZpY2UgYnkgdGhlIHVzZXIsIHRoZXkgYXJlCi0gKiB1c2VkIGJ5IHRoZSBzY2hlZHVsZXIgdG8gZW5zdXJlIHRlc3RzIGFyZSBzY2hlZHVsZWQgb24gdGhlIGNvcnJlY3QgZGV2aWNlcy4gRWcgaWYgdGhlIHVzZXIgaXMKLSAqIHNoYXJkaW5nIHRoZSBpbm52b2NhdGlvbiBhY3Jvc3MgMTAgZGV2aWNlcywgdGhleSB3aWxsIG5vdCB3YW50IHRvIHB1dCBhIFNJTSBjYXJkIGluIGV2ZXJ5IGRldmljZSwKLSAqIGluc3RlYWQgdGhleSBjYW4gdXNlIGEgc2luZ2xlIFNJTSBjYXJkIGFuZCB1c2UgdG9rZW5zIHRvIHRlbGwgdGhlIHNjaGVkdWxlciB3aGljaCBkZXZpY2Ugc2hvdWxkCi0gKiBiZSB1c2VkIHRvIHJ1biB0aGUgU0lNIGNhcmQgdGVzdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBUb2tlblJlcXVpcmVtZW50IGltcGxlbWVudHMgSVRhcmdldFByZXBhcmVyIHsKLQotICAgIEBPcHRpb24obmFtZSA9ICJ0b2tlbiIsIGRlc2NyaXB0aW9uID0gIlRoZSB0b2tlbiBhIGRldmljZSBtdXN0IGhhdmUgdG8gcnVuIHRoaXMgbW9kdWxlIikKLSAgICBwcml2YXRlIFNldDxTdHJpbmc+IG1Ub2tlbnMgPSBuZXcgSGFzaFNldDw+KCk7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcChJVGVzdERldmljZSBkZXZpY2UsIElCdWlsZEluZm8gYnVpbGRJbmZvKSB0aHJvd3MgVGFyZ2V0U2V0dXBFcnJvciwKLSAgICAgICAgICAgIEJ1aWxkRXJyb3IsIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIENMb2cuZSgiVG9rZW5SZXF1aXJlbWVudCBpcyBub3QgZXhwZWN0ZWQgdG8gcnVuIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUge0BsaW5rIFNldH0gb2YgdG9rZW5zIHJlcXVpcmVkIGJ5IHRoaXMgbW9kdWxlLgotICAgICAqLwotICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRUb2tlbnMoKSB7Ci0gICAgICAgIHJldHVybiBtVG9rZW5zOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3RhcmdldHByZXAvV2lmaUNoZWNrLmphdmEgYi9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC90YXJnZXRwcmVwL1dpZmlDaGVjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmNmODgwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3RhcmdldHByZXAvV2lmaUNoZWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGFyZ2V0cHJlcDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmJ1aWxkLklCdWlsZEluZm87Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuY29uZmlnLk9wdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5jb25maWcuT3B0aW9uQ2xhc3M7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLkRldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuSVRlc3REZXZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5CdWlsZEVycm9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuVGFyZ2V0U2V0dXBFcnJvcjsKLQotLyoqCi0gKiBUaGlzIHByZXBhcmVyIGVuc3VyZXMgdGhhdCB0aGUgZGV2aWNlIGlzIGNvbm5lY3RlZCB0byBhIG5ldHdvcmsuCi0gKiBUaGUgb3B0aW9ucyAid2lmaS1zc2lkIiBhbmQgIndpZmktcHNrIiBhbGxvdyB1c2VycyBvZiB0aGUgcHJlcGFyZXIgdG8gYXR0ZW1wdCBjb25uZWN0aW9uCi0gKiB0byBhIG5ldHdvcmsuIElmIHRoZSBvcHRpb25zIGFyZSBwcm92aWRlZCwgdGhlIHByZXBhcmVyIGRpc2Nvbm5lY3RzIGFueSBleGlzdGluZyBuZXR3b3JrCi0gKiBjb25uZWN0aW9uLCBhbmQgYXR0ZW1wdHMgdG8gY29ubmVjdCB3aXRoIHRoZSBvcHRpb25zIHByb3ZpZGVkLgotICoKLSAqIEB0aHJvd3MgVGFyZ2V0U2V0dXBFcnJvciBpZiBkZXZpY2UgaXMgbm90IGNvbm5lY3RlZCB0byBhIG5ldHdvcmsgYW5kIG5vIG9wdGlvbnMgYXJlIGdpdmVuLCBvcgotICogaWYgdGhlIGRldmljZSBmYWlscyB0byBjb25uZWN0IHRvIHRoZSBuZXR3b3JrIHNwZWNpZmllZCBpbiB0aGUgb3B0aW9ucwotICovCi1AT3B0aW9uQ2xhc3MoYWxpYXM9IndpZmktY2hlY2siKQotcHVibGljIGNsYXNzIFdpZmlDaGVjayBleHRlbmRzIFByZWNvbmRpdGlvblByZXBhcmVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXSUZJX0ZFQVRVUkUgPSAiYW5kcm9pZC5oYXJkd2FyZS53aWZpIjsKLQotICAgIEBPcHRpb24obmFtZSA9ICJ3aWZpLXNzaWQiLCBkZXNjcmlwdGlvbiA9ICJOYW1lIG9mIHRoZSBXaUZpIG5ldHdvcmsgd2l0aCB3aGljaCB0byBjb25uZWN0IikKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG1XaWZpU3NpZCA9IG51bGw7Ci0KLSAgICBAT3B0aW9uKG5hbWUgPSAid2lmaS1wc2siLAotICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAiVGhlIFdQQS1QU0sgYXNzb2NpYXRlZCB3aXRoIHRoZSB3aWZpLXNzaWQgb3B0aW9uIikKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG1XaWZpUHNrID0gbnVsbDsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNXaWZpRmVhdHVyZShJVGVzdERldmljZSBkZXZpY2UpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgcG1GZWF0dXJlcyA9IGRldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKCJwbSBsaXN0IGZlYXR1cmVzIik7Ci0gICAgICAgIHJldHVybiBwbUZlYXR1cmVzLmNvbnRhaW5zKFdJRklfRkVBVFVSRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJ1bihJVGVzdERldmljZSBkZXZpY2UsIElCdWlsZEluZm8gYnVpbGRJbmZvKSB0aHJvd3MgVGFyZ2V0U2V0dXBFcnJvciwKLSAgICAgICAgICAgIEJ1aWxkRXJyb3IsIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYoIWhhc1dpZmlGZWF0dXJlKGRldmljZSkpIHsKLSAgICAgICAgICAgIHJldHVybjsgLy8gc2tpcCB0aGlzIHByZWNvbmRpdGlvbiBjaGVjayBpZiBkZXZpY2UgZG9lc24ndCBzdXBwb3J0IHdpZmkKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtV2lmaVNzaWQgPT0gbnVsbCkgeyAvLyBubyBjb25uZWN0aW9uIHRvIGNyZWF0ZSwgY2hlY2sgZm9yIGV4aXN0aW5nIGNvbm5lY3Rpdml0eQotICAgICAgICAgICAgaWYgKCFkZXZpY2UuY2hlY2tDb25uZWN0aXZpdHkoKSkgewotICAgICAgICAgICAgICAgIGxvZ0Vycm9yKCJEZXZpY2UgaGFzIG5vIG5ldHdvcmsgY29ubmVjdGlvbiwgbm8gc3NpZCBwcm92aWRlZCwgc29tZSBtb2R1bGVzICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIm9mIENUUyByZXF1aXJlIGFuIGFjdGl2ZSBuZXR3b3JrIGNvbm5lY3Rpb24iKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7IC8vIG5ldHdvcmsgcHJvdmlkZWQgaW4gb3B0aW9ucywgYXR0ZW1wdCB0byBjcmVhdGUgbmV3IGNvbm5lY3Rpb24KLSAgICAgICAgICAgIGxvZ0luZm8oIkF0dGVtcHRpbmcgY29ubmVjdGlvbiB0byBcIiVzXCIiLCBtV2lmaVNzaWQpOwotICAgICAgICAgICAgaWYgKCFkZXZpY2UuY29ubmVjdFRvV2lmaU5ldHdvcmsobVdpZmlTc2lkLCBtV2lmaVBzaykpIHsgLy8gYXR0ZW1wdCBjb25uZWN0aW9uCi0gICAgICAgICAgICAgICAgbG9nRXJyb3IoIlVuYWJsZSB0byBjb25uZWN0IHRvIG5ldHdvcmsgXCIlc1wiLCBzb21lIG1vZHVsZXMgb2YgQ1RTIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZSBhbiBhY3RpdmUgbmV0d29yayBjb25uZWN0aW9uIiwgbVdpZmlTc2lkKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbG9nSW5mbygiV2lmaSBpcyBjb25uZWN0ZWQiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC90ZXN0dHlwZS9CdXNpbmVzc0xvZ2ljSG9zdFRlc3RCYXNlLmphdmEgYi9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC90ZXN0dHlwZS9CdXNpbmVzc0xvZ2ljSG9zdFRlc3RCYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYmQ3MTcuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdGVzdHR5cGUvQnVzaW5lc3NMb2dpY0hvc3RUZXN0QmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRlc3R0eXBlOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzdW1lLmFzc3VtZVRydWU7Ci0KLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwotaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5UZXN0TmFtZTsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLmJ1aWxkLkNvbXBhdGliaWxpdHlCdWlsZEhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkJ1c2luZXNzTG9naWM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5CdXNpbmVzc0xvZ2ljRXhlY3V0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5CdXNpbmVzc0xvZ2ljRmFjdG9yeTsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkJ1c2luZXNzTG9naWNIb3N0RXhlY3V0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQubG9nLkxvZ1V0aWwuQ0xvZzsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiBIb3N0LXNpZGUgYmFzZSBjbGFzcyBmb3IgdGVzdHMgbGV2ZXJhZ2luZyB0aGUgQnVzaW5lc3MgTG9naWMgc2VydmljZS4KLSAqLwotcHVibGljIGNsYXNzIEJ1c2luZXNzTG9naWNIb3N0VGVzdEJhc2UgZXh0ZW5kcyBDb21wYXRpYmlsaXR5SG9zdFRlc3RCYXNlIHsKLQotICAgIC8qIFN0cmluZyBtYXJraW5nIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhcmFtZXRlciBpbiBhIHRlc3QgbmFtZSAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9TVEFSVCA9ICJbIjsKLQotICAgIC8qIFRlc3QgbmFtZSBydWxlIHRoYXQgdHJhY2tzIHRoZSBjdXJyZW50IHRlc3QgbWV0aG9kIHVuZGVyIGV4ZWN1dGlvbiAqLwotICAgIEBSdWxlIHB1YmxpYyBUZXN0TmFtZSBtVGVzdENhc2UgPSBuZXcgVGVzdE5hbWUoKTsKLQotICAgIHByaXZhdGUgc3RhdGljIEJ1c2luZXNzTG9naWMgbUJ1c2luZXNzTG9naWM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtQ2FuUmVhZEJ1c2luZXNzTG9naWMgPSB0cnVlOwotCi0gICAgQEJlZm9yZQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGVCdXNpbmVzc0xvZ2ljKCkgewotICAgICAgICAvLyBCdXNpbmVzcyBsb2dpYyBtdXN0IGJlIHJldHJpZXZlZCBpbiB0aGlzIEBCZWZvcmUgbWV0aG9kLCBzaW5jZSB0aGUgYnVpbGQgaW5mbyBjb250YWlucwotICAgICAgICAvLyB0aGUgbG9jYXRpb24gb2YgdGhlIGJ1c2luZXNzIGxvZ2ljIGZpbGUgYW5kIGNhbm5vdCBiZSByZWZlcmVuY2VkIGZyb20gYSBzdGF0aWMgY29udGV4dAotICAgICAgICBpZiAobUJ1c2luZXNzTG9naWMgPT0gbnVsbCkgewotICAgICAgICAgICAgQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyIGhlbHBlciA9IG5ldyBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIobUJ1aWxkKTsKLSAgICAgICAgICAgIEZpbGUgYnVzaW5lc3NMb2dpY0ZpbGUgPSBoZWxwZXIuZ2V0QnVzaW5lc3NMb2dpY0hvc3RGaWxlKCk7Ci0gICAgICAgICAgICBpZiAoYnVzaW5lc3NMb2dpY0ZpbGUgIT0gbnVsbCAmJiBidXNpbmVzc0xvZ2ljRmlsZS5jYW5SZWFkKCkpIHsKLSAgICAgICAgICAgICAgICBtQnVzaW5lc3NMb2dpYyA9IEJ1c2luZXNzTG9naWNGYWN0b3J5LmNyZWF0ZUZyb21GaWxlKGJ1c2luZXNzTG9naWNGaWxlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUNhblJlYWRCdXNpbmVzc0xvZ2ljID0gZmFsc2U7IC8vIGZhaWxlZCB0byByZXRyaWV2ZSBidXNpbmVzcyBsb2dpYwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSBtVGVzdENhc2UuZ2V0TWV0aG9kTmFtZSgpOwotICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoIlRlc3QgXCIlc1wiIGlzIHVuYWJsZSB0byBleGVjdXRlIGFzIGl0IGRlcGVuZHMgb24gdGhlIG1pc3NpbmcgIgotICAgICAgICAgICAgICAgICsgInJlbW90ZSBjb25maWd1cmF0aW9uLiIsIG1ldGhvZE5hbWUpLCBtQ2FuUmVhZEJ1c2luZXNzTG9naWMpOwotICAgICAgICBpZiAobWV0aG9kTmFtZS5jb250YWlucyhQQVJBTV9TVEFSVCkpIHsKLSAgICAgICAgICAgIC8vIFN0cmlwIHBhcmFtZXRlciBzdWZmaXggKGUuZy4gIlswXSIpIGZyb20gbWV0aG9kIG5hbWUKLSAgICAgICAgICAgIG1ldGhvZE5hbWUgPSBtZXRob2ROYW1lLnN1YnN0cmluZygwLCBtZXRob2ROYW1lLmxhc3RJbmRleE9mKFBBUkFNX1NUQVJUKSk7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIHRlc3ROYW1lID0gU3RyaW5nLmZvcm1hdCgiJXMjJXMiLCB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpLCBtZXRob2ROYW1lKTsKLSAgICAgICAgaWYgKG1CdXNpbmVzc0xvZ2ljLmhhc0xvZ2ljRm9yKHRlc3ROYW1lKSkgewotICAgICAgICAgICAgQ0xvZy5pKCJBcHBseWluZyBidXNpbmVzcyBsb2dpYyBmb3IgdGVzdCBjYXNlOiAiLCB0ZXN0TmFtZSk7Ci0gICAgICAgICAgICBCdXNpbmVzc0xvZ2ljRXhlY3V0b3IgZXhlY3V0b3IgPSBuZXcgQnVzaW5lc3NMb2dpY0hvc3RFeGVjdXRvcihnZXREZXZpY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkLCB0aGlzKTsKLSAgICAgICAgICAgIG1CdXNpbmVzc0xvZ2ljLmFwcGx5TG9naWNGb3IodGVzdE5hbWUsIGV4ZWN1dG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBza2lwVGVzdChTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBhc3N1bWVUcnVlKG1lc3NhZ2UsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZmFpbFRlc3QoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgZmFpbChtZXNzYWdlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC90ZXN0dHlwZS9Db21wYXRpYmlsaXR5SG9zdFRlc3RCYXNlLmphdmEgYi9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC90ZXN0dHlwZS9Db21wYXRpYmlsaXR5SG9zdFRlc3RCYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMjJhMWYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdGVzdHR5cGUvQ29tcGF0aWJpbGl0eUhvc3RUZXN0QmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRlc3R0eXBlOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuYW5ub3RhdGlvbnMuTnVsbGFibGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQuYnVpbGQuQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5Mb2cuTG9nTGV2ZWw7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLnRlc3RydW5uZXIuUmVtb3RlQW5kcm9pZFRlc3RSdW5uZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLnRlc3RydW5uZXIuVGVzdElkZW50aWZpZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLnRlc3RydW5uZXIuVGVzdFJlc3VsdDsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIudGVzdHJ1bm5lci5UZXN0UmVzdWx0LlRlc3RTdGF0dXM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLnRlc3RydW5uZXIuVGVzdFJ1blJlc3VsdDsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5idWlsZC5JQnVpbGRJbmZvOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5EZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLklUZXN0RGV2aWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmxvZy5Mb2dVdGlsLkNMb2c7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQucmVzdWx0LkNvbGxlY3RpbmdUZXN0TGlzdGVuZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSUFiaTsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JQWJpUmVjZWl2ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSUJ1aWxkUmVjZWl2ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSURldmljZVRlc3Q7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudXRpbC5BYmlVdGlsczsKLQotaW1wb3J0IG9yZy5qdW5pdC5Bc3N1bWU7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuaW50ZXJuYWwuQXNzdW1wdGlvblZpb2xhdGVkRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIENvbXBhdGliaWxpdHkgaG9zdCB0ZXN0IGJhc2UgY2xhc3MgZm9yIEpVbml0NCB0ZXN0cy4gRW5hYmxlcyBob3N0LXNpZGUgdGVzdHMgd3JpdHRlbiBpbiBKVW5pdDQKLSAqIHRvIGFjY2VzcyBidWlsZCBhbmQgQUJJIGluZm9ybWF0aW9uLCBhcyB3ZWxsIGFzIGEgcmVmZXJlbmNlIHRvIHRoZSB0ZXN0aW5nIGRldmljZS4gVGhlIGNsYXNzCi0gKiBpbmNsdWRlcyBtZXRob2RzIHRvIGluc3RhbGwgYW5kIHVuaW5zdGFsbCB0ZXN0IHBhY2thZ2VzLCBhcyB3ZWxsIGFzIG1ldGhvZHMgdG8gcnVuIGRldmljZS1zaWRlCi0gKiB0ZXN0cyBhbmQgcmV0cmlldmUgdGhlaXIgcmVzdWx0cy4KLSAqLwotcHVibGljIGNsYXNzIENvbXBhdGliaWxpdHlIb3N0VGVzdEJhc2UgaW1wbGVtZW50cyBJQWJpUmVjZWl2ZXIsIElCdWlsZFJlY2VpdmVyLCBJRGV2aWNlVGVzdCB7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBSlVSID0gImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiOwotCi0gICAgLyoqIFRoZSBidWlsZCB3aWxsIGJlIHVzZWQuICovCi0gICAgcHJvdGVjdGVkIElCdWlsZEluZm8gbUJ1aWxkOwotCi0gICAgLyoqIFRoZSBBQkkgdG8gdXNlLiAqLwotICAgIHByb3RlY3RlZCBJQWJpIG1BYmk7Ci0KLSAgICAvKiogQSByZWZlcmVuY2UgdG8gdGhlIGRldmljZSB1bmRlciB0ZXN0LiAqLwotICAgIHByb3RlY3RlZCBJVGVzdERldmljZSBtRGV2aWNlOwotCi0gICAgLyoqIFRoZSB0ZXN0IHJ1bm5lciB1c2VkIGZvciB0ZXN0IGFwcHMgKi8KLSAgICBwcml2YXRlIFN0cmluZyBtUnVubmVyOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0QWJpKElBYmkgYWJpKSB7Ci0gICAgICAgIG1BYmkgPSBhYmk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElBYmkgZ2V0QWJpKCkgewotICAgICAgICByZXR1cm4gbUFiaTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRCdWlsZChJQnVpbGRJbmZvIGJ1aWxkSW5mbykgewotICAgICAgICAvLyBHZXQgdGhlIGJ1aWxkLCB0aGlzIGlzIHVzZWQgdG8gYWNjZXNzIHRoZSBBUEsuCi0gICAgICAgIG1CdWlsZCA9IGJ1aWxkSW5mbzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElUZXN0RGV2aWNlIGdldERldmljZSgpIHsKLSAgICAgICAgcmV0dXJuIG1EZXZpY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldERldmljZShJVGVzdERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgbURldmljZSA9IGRldmljZTsKLSAgICB9Ci0KLSAgICBAQmVmb3JlCi0gICAgcHVibGljIHZvaWQgYmFzZVNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1SdW5uZXIgPSBBSlVSOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgcnVubmVyIG5hbWUKLSAgICAgKiBAcGFyYW0gcnVubmVyIG9mIHRoZSBkZXZpY2UgdGVzdCBydW5uZXIKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRSdW5uZXIoU3RyaW5nIHJ1bm5lcikgewotICAgICAgICBtUnVubmVyID0gcnVubmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgcnVubmVyIG5hbWUKLSAgICAgKiBAcmV0dXJuIG5hbWUgb2YgdGhlIGRldmljZSB0ZXN0IHJ1bm5lcgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UnVubmVyKCkgewotICAgICAgICByZXR1cm4gbVJ1bm5lcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnN0YWxscyBhIHBhY2thZ2Ugb24gdGhlIGRldmljZQotICAgICAqIEBwYXJhbSBmaWxlTmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byBpbnN0YWxsCi0gICAgICogQHBhcmFtIG9wdGlvbnMgb3B0aW9uYWwgZXh0cmEgYXJndW1lbnRzIHRvIHBhc3MuIFNlZSAnYWRiIHNoZWxsIHBtIGluc3RhbGwgLS1oZWxwJyBmb3IKLSAgICAgKiBhdmFpbGFibGUgb3B0aW9ucwotICAgICAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGlmIGZpbGUgd2l0aCBmaWxlbmFtZSBjYW5ub3QgYmUgZm91bmQKLSAgICAgKiBAdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGluc3RhbGxQYWNrYWdlKFN0cmluZyBmaWxlTmFtZSwgU3RyaW5nLi4uIG9wdGlvbnMpCi0gICAgICAgICAgICB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotCi0gICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBvcHRMaXN0ID0gbmV3IEFycmF5TGlzdDw+KEFycmF5cy5hc0xpc3Qob3B0aW9ucykpOwotICAgICAgICBvcHRMaXN0LmFkZChBYmlVdGlscy5jcmVhdGVBYmlGbGFnKG1BYmkuZ2V0TmFtZSgpKSk7Ci0gICAgICAgIG9wdGlvbnMgPSBvcHRMaXN0LnRvQXJyYXkobmV3IFN0cmluZ1tvcHRMaXN0LnNpemUoKV0pOwotCi0gICAgICAgIENvbXBhdGliaWxpdHlCdWlsZEhlbHBlciBidWlsZEhlbHBlciA9IG5ldyBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIobUJ1aWxkKTsKLSAgICAgICAgRmlsZSB0ZXN0RmlsZSA9IGJ1aWxkSGVscGVyLmdldFRlc3RGaWxlKGZpbGVOYW1lKTsKLSAgICAgICAgLy8gSW5zdGFsbCB0aGUgQVBLIG9uIHRoZSBkZXZpY2UuCi0gICAgICAgIFN0cmluZyBpbnN0YWxsUmVzdWx0ID0gbURldmljZS5pbnN0YWxsUGFja2FnZSh0ZXN0RmlsZSwgdHJ1ZSwgb3B0aW9ucyk7Ci0KLSAgICAgICAgYXNzZXJ0TnVsbChTdHJpbmcuZm9ybWF0KCJGYWlsZWQgdG8gaW5zdGFsbCAlcywgUmVhc29uOiAlcyIsIGZpbGVOYW1lLCBpbnN0YWxsUmVzdWx0KSwKLSAgICAgICAgICAgICAgICBpbnN0YWxsUmVzdWx0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVbmluc3RhbGxzIGEgcGFja2FnZSBvbiB0aGUgZGV2aWNlCi0gICAgICogQHBhcmFtIHBrZ05hbWUgdGhlIEFuZHJvaWQgcGFja2FnZSB0byB1bmluc3RhbGwKLSAgICAgKiBAcmV0dXJuIGEge0BsaW5rIFN0cmluZ30gd2l0aCBhbiBlcnJvciBjb2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBzdWNjZXNzCi0gICAgICogQHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHVuaW5zdGFsbFBhY2thZ2UoU3RyaW5nIHBrZ05hbWUpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbURldmljZS51bmluc3RhbGxQYWNrYWdlKHBrZ05hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyBpZiBhIHBhY2thZ2Ugb2YgYSBnaXZlbiBuYW1lIGlzIGluc3RhbGxlZCBvbiB0aGUgZGV2aWNlCi0gICAgICogQHBhcmFtIHBrZyB0aGUgbmFtZSBvZiB0aGUgcGFja2FnZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGFja2FnZSBpcyBmb3VuZCBvbiB0aGUgZGV2aWNlCi0gICAgICogQHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1BhY2thZ2VJbnN0YWxsZWQoU3RyaW5nIHBrZykgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGZvciAoU3RyaW5nIGluc3RhbGxlZFBhY2thZ2UgOiBtRGV2aWNlLmdldEluc3RhbGxlZFBhY2thZ2VOYW1lcygpKSB7Ci0gICAgICAgICAgICBpZiAocGtnLmVxdWFscyhpbnN0YWxsZWRQYWNrYWdlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJpbnRUZXN0UmVzdWx0KFRlc3RSdW5SZXN1bHQgcnVuUmVzdWx0KSB7Ci0gICAgICAgIGZvciAoTWFwLkVudHJ5PFRlc3RJZGVudGlmaWVyLCBUZXN0UmVzdWx0PiB0ZXN0RW50cnkgOgotICAgICAgICAgICAgICAgICAgICAgcnVuUmVzdWx0LmdldFRlc3RSZXN1bHRzKCkuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgVGVzdFJlc3VsdCB0ZXN0UmVzdWx0ID0gdGVzdEVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBUZXN0U3RhdHVzIHRlc3RTdGF0dXMgPSB0ZXN0UmVzdWx0LmdldFN0YXR1cygpOwotICAgICAgICAgICAgQ0xvZy5sb2dBbmREaXNwbGF5KExvZ0xldmVsLklORk8sCi0gICAgICAgICAgICAgICAgICAgICJUZXN0ICIgKyB0ZXN0RW50cnkuZ2V0S2V5KCkgKyAiOiAiICsgdGVzdFN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAodGVzdFN0YXR1cyAhPSBUZXN0U3RhdHVzLlBBU1NFRCAmJiB0ZXN0U3RhdHVzICE9IFRlc3RTdGF0dXMuQVNTVU1QVElPTl9GQUlMVVJFKSB7Ci0gICAgICAgICAgICAgICAgQ0xvZy5sb2dBbmREaXNwbGF5KExvZ0xldmVsLldBUk4sIHRlc3RSZXN1bHQuZ2V0U3RhY2tUcmFjZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJ1bnMgdGVzdHMgb2YgYSBnaXZlbiBwYWNrYWdlIG9uIHRoZSBkZXZpY2UgYW5kIHJlcG9ydHMgc3VjY2Vzcy4KLSAgICAgKiBAcGFyYW0gcGtnTmFtZSB0aGUgbmFtZSBvZiB0aGUgcGFja2FnZSBjb250YWluaW5nIHRlc3RzCi0gICAgICogQHBhcmFtIHRlc3RDbGFzc05hbWUgdGhlIGNsYXNzIGZyb20gd2hpY2ggdGVzdHMgc2hvdWxkIGJlIGNvbGxlY3RlZC4gVGVzdHMgYXJlIGNvbGxlY3RlZAotICAgICAqIGZyb20gYWxsIHRlc3QgY2xhc3NlcyBpbiB0aGUgcGFja2FnZSBpZiBudWxsCi0gICAgICogQHJldHVybiB0cnVlIGlmIGF0IGxlYXN0IG9uY2UgdGVzdCBydW5zIGFuZCB0aGVyZSBhcmUgbm8gZmFpbHVyZXMKLSAgICAgKiBAdGhyb3dzIEFzc2VydGlvbkVycm9yIGlmIGRldmljZSBmYWlscyB0byBydW4gaW5zdHJ1bWVudGF0aW9uIHRlc3RzCi0gICAgICogQHRocm93cyBBc3N1bXB0aW9uVmlvbGF0ZWRFeGNlcHRpb24gaWYgZWFjaCBkZXZpY2UgdGVzdCBmYWlscyBhbiBhc3N1bXB0aW9uCi0gICAgICogQHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBydW5EZXZpY2VUZXN0cyhTdHJpbmcgcGtnTmFtZSwgQE51bGxhYmxlIFN0cmluZyB0ZXN0Q2xhc3NOYW1lKQotICAgICAgICAgICAgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBydW5EZXZpY2VUZXN0cyhwa2dOYW1lLCB0ZXN0Q2xhc3NOYW1lLCBudWxsIC8qdGVzdE1ldGhvZE5hbWUqLyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUnVucyB0ZXN0cyBvZiBhIGdpdmVuIHBhY2thZ2Ugb24gdGhlIGRldmljZSBhbmQgcmVwb3J0cyBzdWNjZXNzLgotICAgICAqIEBwYXJhbSBwa2dOYW1lIHRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIGNvbnRhaW5pbmcgdGVzdHMKLSAgICAgKiBAcGFyYW0gdGVzdENsYXNzTmFtZSB0aGUgY2xhc3MgZnJvbSB3aGljaCB0ZXN0cyBzaG91bGQgYmUgY29sbGVjdGVkLiBUZXN0cyBhcmUgY29sbGVjdGVkCi0gICAgICogZnJvbSBhbGwgdGVzdCBjbGFzc2VzIGluIHRoZSBwYWNrYWdlIGlmIG51bGwKLSAgICAgKiBAcGFyYW0gdGVzdE1ldGhvZE5hbWUgdGhlIHRlc3QgbWV0aG9kIHRvIHJ1bi4gQWxsIHRlc3RzIGZyb20gdGhlIGNsYXNzIG9yIHBhY2thZ2UgYXJlIHJ1bgotICAgICAqIGlmIG51bGwKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgYXQgbGVhc3Qgb25jZSB0ZXN0IHJ1bnMgYW5kIHRoZXJlIGFyZSBubyBmYWlsdXJlcwotICAgICAqIEB0aHJvd3MgQXNzZXJ0aW9uRXJyb3IgaWYgZGV2aWNlIGZhaWxzIHRvIHJ1biBpbnN0cnVtZW50YXRpb24gdGVzdHMKLSAgICAgKiBAdGhyb3dzIEFzc3VtcHRpb25WaW9sYXRlZEV4Y2VwdGlvbiBpZiBlYWNoIGRldmljZSB0ZXN0IGZhaWxzIGFuIGFzc3VtcHRpb24KLSAgICAgKiBAdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHJ1bkRldmljZVRlc3RzKFN0cmluZyBwa2dOYW1lLCBATnVsbGFibGUgU3RyaW5nIHRlc3RDbGFzc05hbWUsCi0gICAgICAgICAgICBATnVsbGFibGUgU3RyaW5nIHRlc3RNZXRob2ROYW1lKQotICAgICAgICAgICAgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFRlc3RSdW5SZXN1bHQgcnVuUmVzdWx0ID0gZG9SdW5UZXN0cyhwa2dOYW1lLCB0ZXN0Q2xhc3NOYW1lLCB0ZXN0TWV0aG9kTmFtZSk7Ci0gICAgICAgIHByaW50VGVzdFJlc3VsdChydW5SZXN1bHQpOwotICAgICAgICAvLyBhc3N1bWUgbm90IGFsbCB0ZXN0cyBoYXZlIHNraXBwZWQgKGFuZCByZXRocm93IEFzc3VtcHRpb25WaW9sYXRlZEV4Y2VwdGlvbiBpZiBzbykKLSAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUocnVuUmVzdWx0LmdldE51bVRlc3RzKCkgIT0gcnVuUmVzdWx0LmdldE51bVRlc3RzSW5TdGF0ZSgKLSAgICAgICAgICAgICAgICBUZXN0U3RhdHVzLkFTU1VNUFRJT05fRkFJTFVSRSkpOwotICAgICAgICByZXR1cm4gIXJ1blJlc3VsdC5oYXNGYWlsZWRUZXN0cygpICYmIHJ1blJlc3VsdC5nZXROdW1UZXN0cygpID4gMDsKLSAgICB9Ci0KLSAgICAvKiogSGVscGVyIG1ldGhvZCB0byBydW4gdGVzdHMgYW5kIHJldHVybiB0aGUgbGlzdGVuZXIgdGhhdCBjb2xsZWN0ZWQgdGhlIHJlc3VsdHMuICovCi0gICAgcHJpdmF0ZSBUZXN0UnVuUmVzdWx0IGRvUnVuVGVzdHMoCi0gICAgICAgIFN0cmluZyBwa2dOYW1lLCBTdHJpbmcgdGVzdENsYXNzTmFtZSwKLSAgICAgICAgU3RyaW5nIHRlc3RNZXRob2ROYW1lKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgUmVtb3RlQW5kcm9pZFRlc3RSdW5uZXIgdGVzdFJ1bm5lciA9IG5ldyBSZW1vdGVBbmRyb2lkVGVzdFJ1bm5lcigKLSAgICAgICAgICAgIHBrZ05hbWUsIG1SdW5uZXIsIG1EZXZpY2UuZ2V0SURldmljZSgpKTsKLSAgICAgICAgaWYgKHRlc3RDbGFzc05hbWUgIT0gbnVsbCAmJiB0ZXN0TWV0aG9kTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0ZXN0UnVubmVyLnNldE1ldGhvZE5hbWUodGVzdENsYXNzTmFtZSwgdGVzdE1ldGhvZE5hbWUpOwotICAgICAgICB9IGVsc2UgaWYgKHRlc3RDbGFzc05hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgdGVzdFJ1bm5lci5zZXRDbGFzc05hbWUodGVzdENsYXNzTmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBDb2xsZWN0aW5nVGVzdExpc3RlbmVyIGxpc3RlbmVyID0gY3JlYXRlQ29sbGVjdGluZ0xpc3RlbmVyKCk7Ci0gICAgICAgIGFzc2VydFRydWUobURldmljZS5ydW5JbnN0cnVtZW50YXRpb25UZXN0cyh0ZXN0UnVubmVyLCBsaXN0ZW5lcikpOwotICAgICAgICByZXR1cm4gbGlzdGVuZXIuZ2V0Q3VycmVudFJ1blJlc3VsdHMoKTsKLSAgICB9Ci0KLSAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICBwcm90ZWN0ZWQgQ29sbGVjdGluZ1Rlc3RMaXN0ZW5lciBjcmVhdGVDb2xsZWN0aW5nTGlzdGVuZXIoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ29sbGVjdGluZ1Rlc3RMaXN0ZW5lcigpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3Rlc3R0eXBlL0NvbXBhdGliaWxpdHlUZXN0LmphdmEgYi9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC90ZXN0dHlwZS9Db21wYXRpYmlsaXR5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2JmZTgzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3Rlc3R0eXBlL0NvbXBhdGliaWxpdHlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5ODcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGVzdHR5cGU7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC5idWlsZC5Db21wYXRpYmlsaXR5QnVpbGRIZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQucmVzdWx0Lkludm9jYXRpb25GYWlsdXJlSGFuZGxlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC5yZXN1bHQuU3ViUGxhbkhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50YXJnZXRwcmVwLk5ldHdvcmtDb25uZWN0aXZpdHlDaGVja2VyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnV0aWwuUmV0cnlGaWx0ZXJIZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudXRpbC5SZXRyeVR5cGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudXRpbC5VbmlxdWVNb2R1bGVDb3VudFV0aWw7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5JSW52b2NhdGlvblJlc3VsdDsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlJlc3VsdEhhbmRsZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5UZXN0RmlsdGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5Mb2cuTG9nTGV2ZWw7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuYnVpbGQuSUJ1aWxkSW5mbzsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5jb25maWcuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5jb25maWcuT3B0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmNvbmZpZy5PcHRpb24uSW1wb3J0YW5jZTsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5jb25maWcuT3B0aW9uQ2xhc3M7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuY29uZmlnLk9wdGlvbkNvcGllcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5EZXZpY2VVbnJlc3BvbnNpdmVFeGNlcHRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLklUZXN0RGV2aWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmludm9rZXIuSUludm9jYXRpb25Db250ZXh0OwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmludm9rZXIuSW52b2NhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQubG9nLklUZXN0TG9nZ2VyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmxvZy5Mb2dVdGlsLkNMb2c7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQucmVzdWx0LklUZXN0SW52b2NhdGlvbkxpc3RlbmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnJlc3VsdC5JbnB1dFN0cmVhbVNvdXJjZTsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5yZXN1bHQuTG9nRGF0YVR5cGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuc3VpdGUuY2hlY2tlci5JU3lzdGVtU3RhdHVzQ2hlY2tlcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5zdWl0ZS5jaGVja2VyLklTeXN0ZW1TdGF0dXNDaGVja2VyUmVjZWl2ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuQWJpOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLklBYmk7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSUJ1aWxkUmVjZWl2ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSURldmljZVRlc3Q7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSUludm9jYXRpb25Db250ZXh0UmVjZWl2ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSVJlbW90ZVRlc3Q7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSVNoYXJkYWJsZVRlc3Q7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSVN0cmljdFNoYXJkYWJsZVRlc3Q7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSVRlc3RDb2xsZWN0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuc3VpdGUuVGVzdFN1aXRlSW5mbzsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC51dGlsLkFiaUZvcm1hdHRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC51dGlsLkFiaVV0aWxzOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnV0aWwuQXJyYXlVdGlsOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnV0aWwuTXVsdGlNYXA7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudXRpbC5TdHJlYW1VdGlsOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnV0aWwuVGltZVV0aWw7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7Ci0KLS8qKgotICogQSBUZXN0IGZvciBydW5uaW5nIENvbXBhdGliaWxpdHkgU3VpdGVzCi0gKi8KLUBPcHRpb25DbGFzcyhhbGlhcyA9ICJjb21wYXRpYmlsaXR5IikKLXB1YmxpYyBjbGFzcyBDb21wYXRpYmlsaXR5VGVzdCBpbXBsZW1lbnRzIElEZXZpY2VUZXN0LCBJU2hhcmRhYmxlVGVzdCwgSUJ1aWxkUmVjZWl2ZXIsCi0gICAgICAgIElTdHJpY3RTaGFyZGFibGVUZXN0LCBJU3lzdGVtU3RhdHVzQ2hlY2tlclJlY2VpdmVyLCBJVGVzdENvbGxlY3RvciwKLSAgICAgICAgSUludm9jYXRpb25Db250ZXh0UmVjZWl2ZXIgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5DTFVERV9GSUxURVJfT1BUSU9OID0gImluY2x1ZGUtZmlsdGVyIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWENMVURFX0ZJTFRFUl9PUFRJT04gPSAiZXhjbHVkZS1maWx0ZXIiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVQlBMQU5fT1BUSU9OID0gInN1YnBsYW4iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRV9PUFRJT04gPSAibW9kdWxlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX09QVElPTiA9ICJ0ZXN0IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVDT05ESVRJT05fQVJHX09QVElPTiA9ICJwcmVjb25kaXRpb24tYXJnIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfQVJHX09QVElPTiA9ICJtb2R1bGUtYXJnIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0FSR19PUFRJT04gPSAidGVzdC1hcmciOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBURVNUX09QVElPTl9TSE9SVF9OQU1FID0gJ3QnOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFVFJZX09QVElPTiA9ICJyZXRyeSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVUUllfVFlQRV9PUFRJT04gPSAicmV0cnktdHlwZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJJX09QVElPTiA9ICJhYmkiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNIQVJEX09QVElPTiA9ICJzaGFyZHMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNLSVBfREVWSUNFX0lORk9fT1BUSU9OID0gInNraXAtZGV2aWNlLWluZm8iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNLSVBfUFJFQ09ORElUSU9OU19PUFRJT04gPSAic2tpcC1wcmVjb25kaXRpb25zIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTS0lQX0hPU1RfQVJDSF9DSEVDSyA9ICJza2lwLWhvc3QtYXJjaC1jaGVjayI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJTUFSWV9BQklfUlVOID0gInByaW1hcnktYWJpLW9ubHkiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFVklDRV9UT0tFTl9PUFRJT04gPSAiZGV2aWNlLXRva2VuIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dDQVRfT05fRkFJTFVSRV9TSVpFX09QVElPTiA9ICJsb2djYXQtb24tZmFpbHVyZS1zaXplIjsKLQotICAgIC8vIENvbnN0YW50cyBmb3IgY2hlY2tpbmcgaW52b2NhdGlvbiBvciBwcmVjb25kaXRpb25zIHByZXBhcmF0aW9uIGZhaWx1cmUKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTlVNX1BSRVBfQVRURU1QVFMgPSAxMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUlOVVRFU19QRVJfUFJFUF9BVFRFTVBUID0gMjsKLQotICAgIEBPcHRpb24obmFtZSA9IFNVQlBMQU5fT1BUSU9OLAotICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAidGhlIHN1YnBsYW4gdG8gcnVuIiwKLSAgICAgICAgICAgIGltcG9ydGFuY2UgPSBJbXBvcnRhbmNlLklGX1VOU0VUKQotICAgIHByaXZhdGUgU3RyaW5nIG1TdWJQbGFuOwotCi0gICAgQE9wdGlvbihuYW1lID0gSU5DTFVERV9GSUxURVJfT1BUSU9OLAotICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAidGhlIGluY2x1ZGUgbW9kdWxlIGZpbHRlcnMgdG8gYXBwbHkuIiwKLSAgICAgICAgICAgIGltcG9ydGFuY2UgPSBJbXBvcnRhbmNlLkFMV0FZUykKLSAgICBwcml2YXRlIFNldDxTdHJpbmc+IG1JbmNsdWRlRmlsdGVycyA9IG5ldyBIYXNoU2V0PD4oKTsKLQotICAgIEBPcHRpb24obmFtZSA9IEVYQ0xVREVfRklMVEVSX09QVElPTiwKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gInRoZSBleGNsdWRlIG1vZHVsZSBmaWx0ZXJzIHRvIGFwcGx5LiIsCi0gICAgICAgICAgICBpbXBvcnRhbmNlID0gSW1wb3J0YW5jZS5BTFdBWVMpCi0gICAgcHJpdmF0ZSBTZXQ8U3RyaW5nPiBtRXhjbHVkZUZpbHRlcnMgPSBuZXcgSGFzaFNldDw+KCk7Ci0KLSAgICBAT3B0aW9uKG5hbWUgPSBNT0RVTEVfT1BUSU9OLAotICAgICAgICAgICAgc2hvcnROYW1lID0gJ20nLAotICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAidGhlIHRlc3QgbW9kdWxlIHRvIHJ1bi4iLAotICAgICAgICAgICAgaW1wb3J0YW5jZSA9IEltcG9ydGFuY2UuSUZfVU5TRVQpCi0gICAgcHJpdmF0ZSBTdHJpbmcgbU1vZHVsZU5hbWUgPSBudWxsOwotCi0gICAgQE9wdGlvbihuYW1lID0gVEVTVF9PUFRJT04sCi0gICAgICAgICAgICBzaG9ydE5hbWUgPSBURVNUX09QVElPTl9TSE9SVF9OQU1FLAotICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAidGhlIHRlc3QgcnVuLiIsCi0gICAgICAgICAgICBpbXBvcnRhbmNlID0gSW1wb3J0YW5jZS5JRl9VTlNFVCkKLSAgICBwcml2YXRlIFN0cmluZyBtVGVzdE5hbWUgPSBudWxsOwotCi0gICAgQE9wdGlvbihuYW1lID0gUFJFQ09ORElUSU9OX0FSR19PUFRJT04sCi0gICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICJ0aGUgYXJndW1lbnRzIHRvIHBhc3MgdG8gYSBwcmVjb25kaXRpb24uIFRoZSBleHBlY3RlZCBmb3JtYXQgaXMiCi0gICAgICAgICAgICAgICAgICAgICsgIlwiPGFyZy1uYW1lPjo8YXJnLXZhbHVlPlwiIiwKLSAgICAgICAgICAgIGltcG9ydGFuY2UgPSBJbXBvcnRhbmNlLkFMV0FZUykKLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtUHJlY29uZGl0aW9uQXJncyA9IG5ldyBBcnJheUxpc3Q8PigpOwotCi0gICAgQE9wdGlvbihuYW1lID0gTU9EVUxFX0FSR19PUFRJT04sCi0gICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICJ0aGUgYXJndW1lbnRzIHRvIHBhc3MgdG8gYSBtb2R1bGUuIFRoZSBleHBlY3RlZCBmb3JtYXQgaXMiCi0gICAgICAgICAgICAgICAgICAgICsgIlwiPG1vZHVsZS1uYW1lPjo8YXJnLW5hbWU+Ols8YXJnLWtleT46PV08YXJnLXZhbHVlPlwiIiwKLSAgICAgICAgICAgIGltcG9ydGFuY2UgPSBJbXBvcnRhbmNlLkFMV0FZUykKLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtTW9kdWxlQXJncyA9IG5ldyBBcnJheUxpc3Q8PigpOwotCi0gICAgQE9wdGlvbihuYW1lID0gVEVTVF9BUkdfT1BUSU9OLAotICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAidGhlIGFyZ3VtZW50cyB0byBwYXNzIHRvIGEgdGVzdC4gVGhlIGV4cGVjdGVkIGZvcm1hdCBpcyIKLSAgICAgICAgICAgICAgICAgICAgKyAiXCI8dGVzdC1jbGFzcz46PGFyZy1uYW1lPjpbPGFyZy1rZXk+Oj1dPGFyZy12YWx1ZT5cIiIsCi0gICAgICAgICAgICBpbXBvcnRhbmNlID0gSW1wb3J0YW5jZS5BTFdBWVMpCi0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbVRlc3RBcmdzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0KLSAgICBAT3B0aW9uKG5hbWUgPSBSRVRSWV9PUFRJT04sCi0gICAgICAgICAgICBzaG9ydE5hbWUgPSAncicsCi0gICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICJyZXRyeSBhIHByZXZpb3VzIHNlc3Npb24ncyBmYWlsZWQgYW5kIG5vdCBleGVjdXRlZCB0ZXN0cy4iLAotICAgICAgICAgICAgaW1wb3J0YW5jZSA9IEltcG9ydGFuY2UuSUZfVU5TRVQpCi0gICAgcHJpdmF0ZSBJbnRlZ2VyIG1SZXRyeVNlc3Npb25JZCA9IG51bGw7Ci0KLSAgICBAT3B0aW9uKG5hbWUgPSBSRVRSWV9UWVBFX09QVElPTiwKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gInVzZWQgd2l0aCAiICsgUkVUUllfT1BUSU9OICsgIiwgcmV0cnkgdGVzdHMgb2YgYSBjZXJ0YWluIHN0YXR1cy4gIgotICAgICAgICAgICAgKyAiUG9zc2libGUgdmFsdWVzIGluY2x1ZGUgXCJmYWlsZWRcIiwgXCJub3RfZXhlY3V0ZWRcIiwgYW5kIFwiY3VzdG9tXCIuIiwKLSAgICAgICAgICAgIGltcG9ydGFuY2UgPSBJbXBvcnRhbmNlLklGX1VOU0VUKQotICAgIHByaXZhdGUgUmV0cnlUeXBlIG1SZXRyeVR5cGUgPSBudWxsOwotCi0gICAgQE9wdGlvbihuYW1lID0gQUJJX09QVElPTiwKLSAgICAgICAgICAgIHNob3J0TmFtZSA9ICdhJywKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gInRoZSBhYmkgdG8gdGVzdC4iLAotICAgICAgICAgICAgaW1wb3J0YW5jZSA9IEltcG9ydGFuY2UuSUZfVU5TRVQpCi0gICAgcHJpdmF0ZSBTdHJpbmcgbUFiaU5hbWUgPSBudWxsOwotCi0gICAgQE9wdGlvbihuYW1lID0gU0hBUkRfT1BUSU9OLAotICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAic3BsaXQgdGhlIG1vZHVsZXMgdXAgdG8gcnVuIG9uIG11bHRpcGxlIGRldmljZXMgY29uY3VycmVudGx5LiAiCi0gICAgICAgICAgICAgICAgICAgICsgIkRlcHJlY2F0ZWQsIHVzZSAtLXNoYXJkLWNvdW50IGluc3RlYWQuIikKLSAgICBARGVwcmVjYXRlZAotICAgIHByaXZhdGUgaW50IG1TaGFyZHMgPSAxOwotCi0gICAgQE9wdGlvbihuYW1lID0gU0tJUF9ERVZJQ0VfSU5GT19PUFRJT04sCi0gICAgICAgICAgICBzaG9ydE5hbWUgPSAnZCcsCi0gICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICJXaGV0aGVyIGRldmljZSBpbmZvIGNvbGxlY3Rpb24gc2hvdWxkIGJlIHNraXBwZWQiKQotICAgIHByaXZhdGUgYm9vbGVhbiBtU2tpcERldmljZUluZm8gPSBmYWxzZTsKLQotICAgIEBPcHRpb24obmFtZSA9IFNLSVBfSE9TVF9BUkNIX0NIRUNLLAotICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAiV2hldGhlciBob3N0IGFyY2hpdGVjdHVyZSBjaGVjayBzaG91bGQgYmUgc2tpcHBlZCIpCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Ta2lwSG9zdEFyY2hDaGVjayA9IGZhbHNlOwotCi0gICAgQE9wdGlvbihuYW1lID0gU0tJUF9QUkVDT05ESVRJT05TX09QVElPTiwKLSAgICAgICAgICAgIHNob3J0TmFtZSA9ICdvJywKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gIldoZXRoZXIgcHJlY29uZGl0aW9ucyBzaG91bGQgYmUgc2tpcHBlZCIpCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Ta2lwUHJlY29uZGl0aW9ucyA9IGZhbHNlOwotCi0gICAgQE9wdGlvbihuYW1lID0gUFJJTUFSWV9BQklfUlVOLAotICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAiV2hldGhlciB0byBydW4gdGVzdHMgd2l0aCBvbmx5IHRoZSBkZXZpY2UgcHJpbWFyeSBhYmkuICIKLSAgICAgICAgICAgICAgICAgICAgKyAiVGhpcyBvdmVycmlkZSB0aGUgLS1hYmkgb3B0aW9uLiIpCi0gICAgcHJpdmF0ZSBib29sZWFuIG1QcmltYXJ5QWJpUnVuID0gZmFsc2U7Ci0KLSAgICBAT3B0aW9uKG5hbWUgPSBERVZJQ0VfVE9LRU5fT1BUSU9OLAotICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAiSG9sZHMgdGhlIGRldmljZXMnIHRva2VucywgdXNlZCB3aGVuIHNjaGVkdWxpbmcgdGVzdHMgdGhhdCBoYXZlIgotICAgICAgICAgICAgICAgICAgICArICJwcmVyZXF1aXNpdGVzIHN1Y2ggYXMgcmVxdWlyaW5nIGEgU0lNIGNhcmQuIEZvcm1hdCBpcyA8c2VyaWFsPjo8dG9rZW4+IiwKLSAgICAgICAgICAgIGltcG9ydGFuY2UgPSBJbXBvcnRhbmNlLkFMV0FZUykKLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtRGV2aWNlVG9rZW5zID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0KLSAgICBAT3B0aW9uKG5hbWUgPSAiYnVncmVwb3J0LW9uLWZhaWx1cmUiLAotICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAiVGFrZSBhIGJ1Z3JlcG9ydCBvbiBldmVyeSB0ZXN0IGZhaWx1cmUuICIgKwotICAgICAgICAgICAgICAgICAgICAiV2FybmluZzogY2FuIHBvdGVudGlhbGx5IHVzZSBhIGxvdCBvZiBkaXNrIHNwYWNlLiIpCi0gICAgcHJpdmF0ZSBib29sZWFuIG1CdWdSZXBvcnRPbkZhaWx1cmUgPSBmYWxzZTsKLQotICAgIEBPcHRpb24obmFtZSA9ICJsb2djYXQtb24tZmFpbHVyZSIsCi0gICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICJUYWtlIGEgbG9nY2F0IHNuYXBzaG90IG9uIGV2ZXJ5IHRlc3QgZmFpbHVyZS4iKQotICAgIHByaXZhdGUgYm9vbGVhbiBtTG9nY2F0T25GYWlsdXJlID0gZmFsc2U7Ci0KLSAgICBAT3B0aW9uKG5hbWUgPSBMT0dDQVRfT05fRkFJTFVSRV9TSVpFX09QVElPTiwKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gIlRoZSBtYXggbnVtYmVyIG9mIGxvZ2NhdCBkYXRhIGluIGJ5dGVzIHRvIGNhcHR1cmUgd2hlbiAiCi0gICAgICAgICAgICArICItLWxvZ2NhdC1vbi1mYWlsdXJlIGlzIG9uLiBTaG91bGQgYmUgYW4gYW1vdW50IHRoYXQgY2FuIGNvbWZvcnRhYmx5IGZpdCBpbiBtZW1vcnkuIikKLSAgICBwcml2YXRlIGludCBtTWF4TG9nY2F0Qnl0ZXMgPSA1MDAgKiAxMDI0OyAvLyA1MDBLCi0KLSAgICBAT3B0aW9uKG5hbWUgPSAic2NyZWVuc2hvdC1vbi1mYWlsdXJlIiwKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gIlRha2UgYSBzY3JlZW5zaG90IG9uIGV2ZXJ5IHRlc3QgZmFpbHVyZS4iKQotICAgIHByaXZhdGUgYm9vbGVhbiBtU2NyZWVuc2hvdE9uRmFpbHVyZSA9IGZhbHNlOwotCi0gICAgQE9wdGlvbihuYW1lID0gInJlYm9vdC1iZWZvcmUtdGVzdCIsCi0gICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICJSZWJvb3QgdGhlIGRldmljZSBiZWZvcmUgdGhlIHRlc3Qgc3VpdGUgc3RhcnRzLiIpCi0gICAgcHJpdmF0ZSBib29sZWFuIG1SZWJvb3RCZWZvcmVUZXN0ID0gZmFsc2U7Ci0KLSAgICBAT3B0aW9uKG5hbWUgPSAicmVib290LW9uLWZhaWx1cmUiLAotICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAiUmVib290IHRoZSBkZXZpY2UgYWZ0ZXIgZXZlcnkgdGVzdCBmYWlsdXJlLiIpCi0gICAgcHJpdmF0ZSBib29sZWFuIG1SZWJvb3RPbkZhaWx1cmUgPSBmYWxzZTsKLQotICAgIEBPcHRpb24obmFtZSA9ICJyZWJvb3QtcGVyLW1vZHVsZSIsCi0gICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICJSZWJvb3QgdGhlIGRldmljZSBiZWZvcmUgZXZlcnkgbW9kdWxlIHJ1bi4iKQotICAgIHByaXZhdGUgYm9vbGVhbiBtUmVib290UGVyTW9kdWxlID0gZmFsc2U7Ci0KLSAgICBAT3B0aW9uKG5hbWUgPSAic2tpcC1jb25uZWN0aXZpdHktY2hlY2siLAotICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAiRG9uJ3QgdmVyaWZ5IGRldmljZSBjb25uZWN0aXZpdHkgYmV0d2VlbiBtb2R1bGUgZXhlY3V0aW9uLiIpCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Ta2lwQ29ubmVjdGl2aXR5Q2hlY2sgPSBmYWxzZTsKLQotICAgIEBPcHRpb24obmFtZSA9ICJwcmVwYXJlci13aGl0ZWxpc3QiLAotICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAiT25seSBydW4gc3BlY2lmaWMgcHJlcGFyZXJzLiIKLSAgICAgICAgICAgICsgIlNwZWNpZnkgemVybyBvciBtb3JlIElUYXJnZXRQcmVwYXJlcnMgYXMgY2Fub25pY2FsIGNsYXNzIG5hbWVzLiAiCi0gICAgICAgICAgICArICJlLmcuIFwiY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGFyZ2V0cHJlcC5BcGtJbnN0YWxsZXJcIiAiCi0gICAgICAgICAgICArICJJZiBub3Qgc3BlY2lmaWVkLCBhbGwgY29uZmlndXJlZCBwcmVwYXJlcnMgYXJlIHJ1bi4iKQotICAgIHByaXZhdGUgU2V0PFN0cmluZz4gbVByZXBhcmVyV2hpdGVsaXN0ID0gbmV3IEhhc2hTZXQ8PigpOwotCi0gICAgQE9wdGlvbihuYW1lID0gInNraXAtYWxsLXN5c3RlbS1zdGF0dXMtY2hlY2siLAotICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAiV2hldGhlciBhbGwgc3lzdGVtIHN0YXR1cyBjaGVjayBiZXR3ZWVuIG1vZHVsZXMgc2hvdWxkIGJlIHNraXBwZWQiKQotICAgIHByaXZhdGUgYm9vbGVhbiBtU2tpcEFsbFN5c3RlbVN0YXR1c0NoZWNrID0gZmFsc2U7Ci0KLSAgICBAT3B0aW9uKG5hbWUgPSAic2tpcC1zeXN0ZW0tc3RhdHVzLWNoZWNrIiwKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gIkRpc2FibGUgc3BlY2lmaWMgc3lzdGVtIHN0YXR1cyBjaGVja2Vycy4iCi0gICAgICAgICAgICArICJTcGVjaWZ5IHplcm8gb3IgbW9yZSBTeXN0ZW1TdGF0dXNDaGVja2VyIGFzIGNhbm9uaWNhbCBjbGFzcyBuYW1lcy4gZS5nLiAiCi0gICAgICAgICAgICArICJcImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRhcmdldHByZXAuTmV0d29ya0Nvbm5lY3Rpdml0eUNoZWNrZXJcIiAiCi0gICAgICAgICAgICArICJJZiBub3Qgc3BlY2lmaWVkLCBhbGwgY29uZmlndXJlZCBvciB3aGl0ZWxpc3RlZCBzeXN0ZW0gc3RhdHVzIGNoZWNrZXJzIGFyZSBydW4uIikKLSAgICBwcml2YXRlIFNldDxTdHJpbmc+IG1TeXN0ZW1TdGF0dXNDaGVja0JsYWNrbGlzdCA9IG5ldyBIYXNoU2V0PD4oKTsKLQotICAgIEBPcHRpb24obmFtZSA9ICJzeXN0ZW0tc3RhdHVzLWNoZWNrLXdoaXRlbGlzdCIsCi0gICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICJPbmx5IHJ1biBzcGVjaWZpYyBzeXN0ZW0gc3RhdHVzIGNoZWNrZXJzLiIKLSAgICAgICAgICAgICsgIlNwZWNpZnkgemVybyBvciBtb3JlIFN5c3RlbVN0YXR1c0NoZWNrZXIgYXMgY2Fub25pY2FsIGNsYXNzIG5hbWVzLiBlLmcuICIKLSAgICAgICAgICAgICsgIlwiY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGFyZ2V0cHJlcC5OZXR3b3JrQ29ubmVjdGl2aXR5Q2hlY2tlclwiICIKLSAgICAgICAgICAgICsgIklmIG5vdCBzcGVjaWZpZWQsIGFsbCBjb25maWd1cmVkIHN5c3RlbSBzdGF0dXMgY2hlY2tlcnMgYXJlIHJ1bi4iKQotICAgIHByaXZhdGUgU2V0PFN0cmluZz4gbVN5c3RlbVN0YXR1c0NoZWNrV2hpdGVsaXN0ID0gbmV3IEhhc2hTZXQ8PigpOwotCi0gICAgcHJpdmF0ZSBMaXN0PElTeXN0ZW1TdGF0dXNDaGVja2VyPiBtTGlzdENoZWNrZXJzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0KLSAgICBAT3B0aW9uKG5hbWUgPSAiY29sbGVjdC10ZXN0cy1vbmx5IiwKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gIk9ubHkgaW52b2tlIHRoZSBzdWl0ZSB0byBjb2xsZWN0IGxpc3Qgb2YgYXBwbGljYWJsZSB0ZXN0IGNhc2VzLiBBbGwgIgotICAgICAgICAgICAgICAgICAgICArICJ0ZXN0IHJ1biBjYWxsYmFja3Mgd2lsbCBiZSB0cmlnZ2VyZWQsIGJ1dCB0ZXN0IGV4ZWN1dGlvbiB3aWxsIG5vdCBiZSAiCi0gICAgICAgICAgICAgICAgICAgICsgImFjdHVhbGx5IGNhcnJpZWQgb3V0LiIpCi0gICAgcHJpdmF0ZSBCb29sZWFuIG1Db2xsZWN0VGVzdHNPbmx5ID0gbnVsbDsKLQotICAgIEBPcHRpb24obmFtZSA9ICJtb2R1bGUtbWV0YWRhdGEtaW5jbHVkZS1maWx0ZXIiLAotICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAiSW5jbHVkZSBtb2R1bGVzIGZvciBleGVjdXRpb24gYmFzZWQgb24gbWF0Y2hpbmcgb2YgbWV0YWRhdGEgZmllbGRzOiAiCi0gICAgICAgICAgICAgICAgICAgICsgImZvciBhbnkgb2YgdGhlIHNwZWNpZmllZCBmaWx0ZXIgbmFtZSBhbmQgdmFsdWUsIGlmIGEgbW9kdWxlIGhhcyBhIG1ldGFkYXRhICIKLSAgICAgICAgICAgICAgICAgICAgKyAiZmllbGQgd2l0aCB0aGUgc2FtZSBuYW1lIGFuZCB2YWx1ZSwgaXQgd2lsbCBiZSBpbmNsdWRlZC4gV2hlbiBib3RoIG1vZHVsZSAiCi0gICAgICAgICAgICAgICAgICAgICsgImluY2x1c2lvbiBhbmQgZXhjbHVzaW9uIHJ1bGVzIGFyZSBhcHBsaWVkLCBpbmNsdXNpb24gcnVsZXMgd2lsbCBiZSAiCi0gICAgICAgICAgICAgICAgICAgICsgImV2YWx1YXRlZCBmaXJzdC4gVXNpbmcgdGhpcyB0b2dldGhlciB3aXRoIHRlc3QgZmlsdGVyIGluY2x1c2lvbiBydWxlcyBtYXkgIgotICAgICAgICAgICAgICAgICAgICArICJyZXN1bHQgaW4gbm8gdGVzdHMgdG8gZXhlY3V0ZSBpZiB0aGUgcnVsZXMgZG9uJ3Qgb3ZlcmxhcC4iKQotICAgIHByaXZhdGUgTXVsdGlNYXA8U3RyaW5nLCBTdHJpbmc+IG1Nb2R1bGVNZXRhZGF0YUluY2x1ZGVGaWx0ZXIgPSBuZXcgTXVsdGlNYXA8PigpOwotCi0gICAgQE9wdGlvbihuYW1lID0gIm1vZHVsZS1tZXRhZGF0YS1leGNsdWRlLWZpbHRlciIsCi0gICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICJFeGNsdWRlIG1vZHVsZXMgZm9yIGV4ZWN1dGlvbiBiYXNlZCBvbiBtYXRjaGluZyBvZiBtZXRhZGF0YSBmaWVsZHM6ICIKLSAgICAgICAgICAgICAgICAgICAgKyAiZm9yIGFueSBvZiB0aGUgc3BlY2lmaWVkIGZpbHRlciBuYW1lIGFuZCB2YWx1ZSwgaWYgYSBtb2R1bGUgaGFzIGEgbWV0YWRhdGEgIgotICAgICAgICAgICAgICAgICAgICArICJmaWVsZCB3aXRoIHRoZSBzYW1lIG5hbWUgYW5kIHZhbHVlLCBpdCB3aWxsIGJlIGV4Y2x1ZGVkLiBXaGVuIGJvdGggbW9kdWxlICIKLSAgICAgICAgICAgICAgICAgICAgKyAiaW5jbHVzaW9uIGFuZCBleGNsdXNpb24gcnVsZXMgYXJlIGFwcGxpZWQsIGluY2x1c2lvbiBydWxlcyB3aWxsIGJlICIKLSAgICAgICAgICAgICAgICAgICAgKyAiZXZhbHVhdGVkIGZpcnN0LiIpCi0gICAgcHJpdmF0ZSBNdWx0aU1hcDxTdHJpbmcsIFN0cmluZz4gbU1vZHVsZU1ldGFkYXRhRXhjbHVkZUZpbHRlciA9IG5ldyBNdWx0aU1hcDw+KCk7Ci0KLSAgICBwcml2YXRlIGludCBtVG90YWxTaGFyZHM7Ci0gICAgcHJpdmF0ZSBJbnRlZ2VyIG1TaGFyZEluZGV4ID0gbnVsbDsKLSAgICBwcml2YXRlIElNb2R1bGVSZXBvIG1Nb2R1bGVSZXBvOwotICAgIHByaXZhdGUgSVRlc3REZXZpY2UgbURldmljZTsKLSAgICBwcml2YXRlIENvbXBhdGliaWxpdHlCdWlsZEhlbHBlciBtQnVpbGRIZWxwZXI7Ci0KLSAgICAvLyB2YXJpYWJsZXMgdXNlZCBmb3IgbG9jYWwgc2hhcmRpbmcgc2NlbmFyaW8KLSAgICBwcml2YXRlIHN0YXRpYyBDb3VudERvd25MYXRjaCBzUHJlcGFyZWRMYXRjaDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzTG9jYWxTaGFyZGluZyA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNTaGFyZGVkID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIElJbnZvY2F0aW9uQ29udGV4dCBtSW52b2NhdGlvbkNvbnRleHQ7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcge0BsaW5rIENvbXBhdGliaWxpdHlUZXN0fSB0aGF0IHdpbGwgcnVuIHRoZSBkZWZhdWx0IGxpc3Qgb2YKLSAgICAgKiBtb2R1bGVzLgotICAgICAqLwotICAgIHB1YmxpYyBDb21wYXRpYmlsaXR5VGVzdCgpIHsKLSAgICAgICAgdGhpcygxIC8qIHRvdGFsU2hhcmRzICovLCBuZXcgTW9kdWxlUmVwbygpLCAwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcge0BsaW5rIENvbXBhdGliaWxpdHlUZXN0fSB0aGF0IHdpbGwgcnVuIGEgc3VibGlzdCBvZgotICAgICAqIG1vZHVsZXMuCi0gICAgICovCi0gICAgcHVibGljIENvbXBhdGliaWxpdHlUZXN0KGludCB0b3RhbFNoYXJkcywgSU1vZHVsZVJlcG8gbW9kdWxlUmVwbywgSW50ZWdlciBzaGFyZEluZGV4KSB7Ci0gICAgICAgIGlmICh0b3RhbFNoYXJkcyA8IDEpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJNdXN0IGJlIGF0IGxlYXN0IDEgc2hhcmQuIEdpdmVuOiIgKyB0b3RhbFNoYXJkcyk7Ci0gICAgICAgIH0KLSAgICAgICAgbVRvdGFsU2hhcmRzID0gdG90YWxTaGFyZHM7Ci0gICAgICAgIG1Nb2R1bGVSZXBvID0gbW9kdWxlUmVwbzsKLSAgICAgICAgbVNoYXJkSW5kZXggPSBzaGFyZEluZGV4OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVRlc3REZXZpY2UgZ2V0RGV2aWNlKCkgewotICAgICAgICByZXR1cm4gbURldmljZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0RGV2aWNlKElUZXN0RGV2aWNlIGRldmljZSkgewotICAgICAgICBtRGV2aWNlID0gZGV2aWNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRCdWlsZChJQnVpbGRJbmZvIGJ1aWxkSW5mbykgewotICAgICAgICBtQnVpbGRIZWxwZXIgPSBuZXcgQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyKGJ1aWxkSW5mbyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJ1bihJVGVzdEludm9jYXRpb25MaXN0ZW5lciBsaXN0ZW5lcikgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBMaXN0PElTeXN0ZW1TdGF0dXNDaGVja2VyPiBjaGVja2VycyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgLy8gR2V0IHN5c3RlbSBzdGF0dXMgY2hlY2tlcnMKLSAgICAgICAgICAgIGlmIChtU2tpcEFsbFN5c3RlbVN0YXR1c0NoZWNrKSB7Ci0gICAgICAgICAgICAgICAgQ0xvZy5kKCJTa2lwcGluZyBzeXN0ZW0gc3RhdHVzIGNoZWNrZXJzIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNoZWNrU3lzdGVtU3RhdHVzQmxhY2tBbmRXaGl0ZUxpc3QoKTsKLSAgICAgICAgICAgICAgICBmb3IgKElTeXN0ZW1TdGF0dXNDaGVja2VyIGNoZWNrZXIgOiBtTGlzdENoZWNrZXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHNob3VsZEluY2x1ZGVTeXN0ZW1TdGF0dXNDaGVja2VyKGNoZWNrZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGVja2Vycy5hZGQoY2hlY2tlcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIExpbmtlZExpc3Q8SU1vZHVsZURlZj4gbW9kdWxlcyA9IGluaXRpYWxpemVNb2R1bGVSZXBvKCk7Ci0KLSAgICAgICAgICAgIG1FeGNsdWRlRmlsdGVycy5jbGVhcigpOwotICAgICAgICAgICAgbUluY2x1ZGVGaWx0ZXJzLmNsZWFyKCk7Ci0gICAgICAgICAgICAvLyBVcGRhdGUgQnVpbGRJbmZvIGluIGVhY2ggc2hhcmQgdG8gc3RvcmUgdGhlIG9yaWdpbmFsIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgZnJvbQotICAgICAgICAgICAgLy8gdGhlIHNlc3Npb24gdG8gYmUgcmV0cmllZC4gVGhlc2UgYXJndW1lbnRzIHdpbGwgYmUgc2VyaWFsaXplZCBpbiB0aGUgcmVwb3J0IGxhdGVyLgotICAgICAgICAgICAgaWYgKG1SZXRyeVNlc3Npb25JZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9hZFJldHJ5Q29tbWFuZExpbmVBcmdzKG1SZXRyeVNlc3Npb25JZCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGxpc3RlbmVyID0gbmV3IEZhaWx1cmVMaXN0ZW5lcihsaXN0ZW5lciwgZ2V0RGV2aWNlKCksIG1CdWdSZXBvcnRPbkZhaWx1cmUsCi0gICAgICAgICAgICAgICAgICAgIG1Mb2djYXRPbkZhaWx1cmUsIG1TY3JlZW5zaG90T25GYWlsdXJlLCBtUmVib290T25GYWlsdXJlLCBtTWF4TG9nY2F0Qnl0ZXMpOwotICAgICAgICAgICAgaW50IG1vZHVsZUNvdW50ID0gbW9kdWxlcy5zaXplKCk7Ci0gICAgICAgICAgICBpZiAobW9kdWxlQ291bnQgPT0gMCkgewotICAgICAgICAgICAgICAgIENMb2cubG9nQW5kRGlzcGxheShMb2dMZXZlbC5JTkZPLCAiTm8gbW9kdWxlIHRvIHJ1biBvbiAlcy4iLAotICAgICAgICAgICAgICAgICAgICAgICAgbURldmljZS5nZXRTZXJpYWxOdW1iZXIoKSk7Ci0gICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIHVubG9jayBvdGhlciBzaGFyZHMuCi0gICAgICAgICAgICAgICAgaWYgKHNQcmVwYXJlZExhdGNoICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc1ByZXBhcmVkTGF0Y2guY291bnREb3duKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW50IHVuaXF1ZU1vZHVsZUNvdW50ID0gVW5pcXVlTW9kdWxlQ291bnRVdGlsLmNvdW50VW5pcXVlTW9kdWxlcyhtb2R1bGVzKTsKLSAgICAgICAgICAgICAgICBDTG9nLmxvZ0FuZERpc3BsYXkoTG9nTGV2ZWwuSU5GTywgIlN0YXJ0aW5nICVkIHRlc3Qgc3ViLW1vZHVsZSVzIG9uICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuaXF1ZU1vZHVsZUNvdW50LCAodW5pcXVlTW9kdWxlQ291bnQgPiAxKSA/ICJzIiA6ICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRGV2aWNlLmdldFNlcmlhbE51bWJlcigpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1SZWJvb3RCZWZvcmVUZXN0KSB7Ci0gICAgICAgICAgICAgICAgQ0xvZy5kKCJSZWJvb3RpbmcgZGV2aWNlIGJlZm9yZSB0ZXN0IHN0YXJ0cyBhcyByZXF1ZXN0ZWQuIik7Ci0gICAgICAgICAgICAgICAgbURldmljZS5yZWJvb3QoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1Ta2lwQ29ubmVjdGl2aXR5Q2hlY2spIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY2xhenogPSBOZXR3b3JrQ29ubmVjdGl2aXR5Q2hlY2tlci5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCk7Ci0gICAgICAgICAgICAgICAgQ0xvZy5sb2dBbmREaXNwbGF5KExvZ0xldmVsLklORk8sICJcIi0tc2tpcC1jb25uZWN0aXZpdHktY2hlY2tcIiBpcyBkZXByZWNhdGVkLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJwbGVhc2UgdXNlIFwiLS1za2lwLXN5c3RlbS1zdGF0dXMtY2hlY2sgJXNcIiBpbnN0ZWFkIiwgY2xhenopOwotICAgICAgICAgICAgICAgIG1TeXN0ZW1TdGF0dXNDaGVja0JsYWNrbGlzdC5hZGQoY2xhenopOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBTZXQgdmFsdWVzIGFuZCBydW4gcHJlY29uZGl0aW9ucwotICAgICAgICAgICAgYm9vbGVhbiBpc1ByZXBhcmVkID0gdHJ1ZTsgLy8gd2hldGhlciB0aGUgZGV2aWNlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBwcmVwYXJlZAotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgSU1vZHVsZURlZiBtb2R1bGUgPSBtb2R1bGVzLmdldChpKTsKLSAgICAgICAgICAgICAgICBtb2R1bGUuc2V0QnVpbGQobUJ1aWxkSGVscGVyLmdldEJ1aWxkSW5mbygpKTsKLSAgICAgICAgICAgICAgICBtb2R1bGUuc2V0RGV2aWNlKG1EZXZpY2UpOwotICAgICAgICAgICAgICAgIG1vZHVsZS5zZXRQcmVwYXJlcldoaXRlbGlzdChtUHJlcGFyZXJXaGl0ZWxpc3QpOwotICAgICAgICAgICAgICAgIC8vIGRvbid0IHNldCBhIHZhbHVlIGlmIHVuc3BlY2lmaWVkCi0gICAgICAgICAgICAgICAgaWYgKG1Db2xsZWN0VGVzdHNPbmx5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbW9kdWxlLnNldENvbGxlY3RUZXN0c09ubHkobUNvbGxlY3RUZXN0c09ubHkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpc1ByZXBhcmVkICY9IChtb2R1bGUucHJlcGFyZShtU2tpcFByZWNvbmRpdGlvbnMsIG1QcmVjb25kaXRpb25BcmdzKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWlzUHJlcGFyZWQpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJGYWlsZWQgcHJlY29uZGl0aW9ucyBvbiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtRGV2aWNlLmdldFNlcmlhbE51bWJlcigpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUlzTG9jYWxTaGFyZGluZykgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHNQcmVwYXJlZExhdGNoLmNvdW50RG93bigpOwotICAgICAgICAgICAgICAgICAgICBpbnQgYXR0ZW1wdCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlKCFzUHJlcGFyZWRMYXRjaC5hd2FpdChNSU5VVEVTX1BFUl9QUkVQX0FUVEVNUFQsIFRpbWVVbml0Lk1JTlVURVMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0ZW1wdCA+IE5VTV9QUkVQX0FUVEVNUFRTIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludm9jYXRpb25GYWlsdXJlSGFuZGxlci5oYXNGYWlsZWQobUJ1aWxkSGVscGVyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMb2cubG9nQW5kRGlzcGxheShMb2dMZXZlbC5FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmNvcnJlY3QgcHJlcGFyYXRpb24gZGV0ZWN0ZWQsIGV4aXRpbmcgdGVzdCBydW4gZnJvbSAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRGV2aWNlLmdldFNlcmlhbE51bWJlcigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBDTG9nLmxvZ0FuZERpc3BsYXkoTG9nTGV2ZWwuV0FSTiwgIndhaXRpbmcgb24gcHJlY29uZGl0aW9ucyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXR0ZW1wdCsrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBNb2R1bGUgUmVwbyBpcyBub3QgdXNlZnVsIGFueW1vcmUKLSAgICAgICAgICAgIG1Nb2R1bGVSZXBvLnRlYXJEb3duKCk7Ci0gICAgICAgICAgICBtTW9kdWxlUmVwbyA9IG51bGw7Ci0gICAgICAgICAgICAvLyBSdW4gdGhlIHRlc3RzCi0gICAgICAgICAgICB3aGlsZSAoIW1vZHVsZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIHJlbW92ZSB0aGUgbW9kdWxlcyBmcm9tIHRoZSByZWZlcmVuY2UgbGlzdCB3aGVuIHdlIGFyZSBkb25lIHdpdGgKLSAgICAgICAgICAgICAgICAvLyB0aGVtLgotICAgICAgICAgICAgICAgIElNb2R1bGVEZWYgbW9kdWxlID0gbW9kdWxlcy5wb2xsKCk7Ci0gICAgICAgICAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0gICAgICAgICAgICAgICAgaWYgKG1SZWJvb3RQZXJNb2R1bGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCJ1c2VyIi5lcXVhbHMobURldmljZS5nZXRQcm9wZXJ0eSgicm8uYnVpbGQudHlwZSIpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ0xvZy5lKCJyZWJvb3QtcGVyLW1vZHVsZSBzaG91bGQgb25seSBiZSB1c2VkIGR1cmluZyBkZXZlbG9wbWVudCwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInRoaXMgaXMgYVwiIHVzZXJcIiBidWlsZCBkZXZpY2UiKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENMb2cubG9nQW5kRGlzcGxheShMb2dMZXZlbC5JTkZPLCAiUmVib290aW5nIGRldmljZSBiZWZvcmUgc3RhcnRpbmcgbmV4dCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAibW9kdWxlIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRGV2aWNlLnJlYm9vdCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gZXhlY3V0ZSBwcmUgbW9kdWxlIGV4ZWN1dGlvbiBjaGVja2VyCi0gICAgICAgICAgICAgICAgaWYgKGNoZWNrZXJzICE9IG51bGwgJiYgIWNoZWNrZXJzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICBydW5QcmVNb2R1bGVDaGVjayhtb2R1bGUuZ2V0TmFtZSgpLCBjaGVja2VycywgbURldmljZSwgbGlzdGVuZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBJSW52b2NhdGlvbkNvbnRleHQgbW9kdWxlQ29udGV4dCA9IG5ldyBJbnZvY2F0aW9uQ29udGV4dCgpOwotICAgICAgICAgICAgICAgIG1vZHVsZUNvbnRleHQuc2V0Q29uZmlndXJhdGlvbkRlc2NyaXB0b3IobW9kdWxlLmdldENvbmZpZ3VyYXRpb25EZXNjcmlwdG9yKCkpOwotICAgICAgICAgICAgICAgIG1vZHVsZUNvbnRleHQuYWRkSW52b2NhdGlvbkF0dHJpYnV0ZShJTW9kdWxlRGVmLk1PRFVMRV9OQU1FLCBtb2R1bGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBtb2R1bGVDb250ZXh0LmFkZEludm9jYXRpb25BdHRyaWJ1dGUoSU1vZHVsZURlZi5NT0RVTEVfQUJJLAotICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLmdldEFiaSgpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgbUludm9jYXRpb25Db250ZXh0LnNldE1vZHVsZUludm9jYXRpb25Db250ZXh0KG1vZHVsZUNvbnRleHQpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG1vZHVsZS5ydW4obGlzdGVuZXIpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKERldmljZVVucmVzcG9uc2l2ZUV4Y2VwdGlvbiBkdWUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gYmVpbmcgYWJsZSB0byBjYXRjaCBhIERldmljZVVucmVzcG9uc2l2ZUV4Y2VwdGlvbiBoZXJlIGltcGxpZXMgdGhhdCByZWNvdmVyeQotICAgICAgICAgICAgICAgICAgICAvLyB3YXMgc3VjY2Vzc2Z1bCwgYW5kIHRlc3QgZXhlY3V0aW9uIHNob3VsZCBwcm9jZWVkIHRvIG5leHQgbW9kdWxlCi0gICAgICAgICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBzdGFjayA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICAgICAgZHVlLnByaW50U3RhY2tUcmFjZShuZXcgUHJpbnRXcml0ZXIoc3RhY2ssIHRydWUpKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyZWFtVXRpbC5jbG9zZShzdGFjayk7Ci0gICAgICAgICAgICAgICAgICAgIENMb2cudygiSWdub3JlZCBEZXZpY2VVbnJlc3BvbnNpdmVFeGNlcHRpb24gYmVjYXVzZSByZWNvdmVyeSB3YXMgc3VjY2Vzc2Z1bCwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInByb2NlZWRpbmcgd2l0aCBuZXh0IG1vZHVsZS4gU3RhY2sgdHJhY2U6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgQ0xvZy53KCJUaGlzIG1heSBiZSBkdWUgdG8gaW5jb3JyZWN0IHRpbWVvdXQgc2V0dGluZyBvbiBtb2R1bGUgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGNsZWFyIG91dCBtb2R1bGUgaW52b2NhdGlvbiBjb250ZXh0IHNpbmNlIHdlIGFyZSBub3cgZG9uZSB3aXRoIG1vZHVsZQotICAgICAgICAgICAgICAgICAgICAvLyBleGVjdXRpb24KLSAgICAgICAgICAgICAgICAgICAgbUludm9jYXRpb25Db250ZXh0LnNldE1vZHVsZUludm9jYXRpb25Db250ZXh0KG51bGwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsb25nIGR1cmF0aW9uID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKLSAgICAgICAgICAgICAgICBsb25nIGV4cGVjdGVkID0gbW9kdWxlLmdldFJ1bnRpbWVIaW50KCk7Ci0gICAgICAgICAgICAgICAgbG9uZyBkZWx0YSA9IE1hdGguYWJzKGR1cmF0aW9uIC0gZXhwZWN0ZWQpOwotICAgICAgICAgICAgICAgIC8vIFNob3cgd2FybmluZyBpZiBkZWx0YSBpcyBtb3JlIHRoYW4gMTAlIG9mIGV4cGVjdGVkCi0gICAgICAgICAgICAgICAgaWYgKGV4cGVjdGVkID4gMCAmJiAoKGZsb2F0KWRlbHRhIC8gKGZsb2F0KWV4cGVjdGVkKSA+IDAuMWYpIHsKLSAgICAgICAgICAgICAgICAgICAgQ0xvZy5sb2dBbmREaXNwbGF5KExvZ0xldmVsLldBUk4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluYWNjdXJhdGUgcnVudGltZSBoaW50IGZvciAlcywgZXhwZWN0ZWQgJXMgd2FzICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUuZ2V0SWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lVXRpbC5mb3JtYXRFbGFwc2VkVGltZShleHBlY3RlZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZVV0aWwuZm9ybWF0RWxhcHNlZFRpbWUoZHVyYXRpb24pKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGNoZWNrZXJzICE9IG51bGwgJiYgIWNoZWNrZXJzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICBydW5Qb3N0TW9kdWxlQ2hlY2sobW9kdWxlLmdldE5hbWUoKSwgY2hlY2tlcnMsIG1EZXZpY2UsIGxpc3RlbmVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbW9kdWxlID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZuZmUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBtb2R1bGVzIiwgZm5mZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplIG1vZHVsZSByZXBvLgotICAgICAqCi0gICAgICogQHJldHVybiBBIGxpc3Qgb2YgbW9kdWxlIGRlZmluaXRpb24KLSAgICAgKiBAdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIExpbmtlZExpc3Q8SU1vZHVsZURlZj4gaW5pdGlhbGl6ZU1vZHVsZVJlcG8oKQotICAgICAgICAgICAgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gRklYTUU6IEVhY2ggc2hhcmQgd2lsbCBkbyBhIGZ1bGwgaW5pdGlhbGl6YXRpb24gd2hpY2ggaXMgbm90IG9wdGltYWwuIE5lZWQgYSB3YXkKLSAgICAgICAgLy8gdG8gYmUgbW9yZSBzcGVjaWZpYyBvbiB3aGF0IHRvIGluaXRpYWxpemUuCi0gICAgICAgIHN5bmNocm9uaXplZCAobU1vZHVsZVJlcG8pIHsKLSAgICAgICAgICAgIGlmICghbU1vZHVsZVJlcG8uaXNJbml0aWFsaXplZCgpKSB7Ci0gICAgICAgICAgICAgICAgc2V0dXBGaWx0ZXJzKCk7Ci0gICAgICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcmVwb3NpdG9yeSwge0BsaW5rIENvbXBhdGliaWxpdHlCdWlsZEhlbHBlciNnZXRUZXN0c0Rpcn0gY2FuCi0gICAgICAgICAgICAgICAgLy8gdGhyb3cgYSB7QGxpbmsgRmlsZU5vdEZvdW5kRXhjZXB0aW9ufQotICAgICAgICAgICAgICAgIG1Nb2R1bGVSZXBvLmluaXRpYWxpemUobVRvdGFsU2hhcmRzLCBtU2hhcmRJbmRleCwgbUJ1aWxkSGVscGVyLmdldFRlc3RzRGlyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRBYmlzKCksIG1EZXZpY2VUb2tlbnMsIG1UZXN0QXJncywgbU1vZHVsZUFyZ3MsIG1JbmNsdWRlRmlsdGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FeGNsdWRlRmlsdGVycywgbU1vZHVsZU1ldGFkYXRhSW5jbHVkZUZpbHRlciwgbU1vZHVsZU1ldGFkYXRhRXhjbHVkZUZpbHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1CdWlsZEhlbHBlci5nZXRCdWlsZEluZm8oKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIGVudGlyZSBsaXN0IG9mIG1vZHVsZXMgdG8gdGhlIENvbXBhdGliaWxpdHlCdWlsZEhlbHBlciBmb3IgcmVwb3J0aW5nCi0gICAgICAgICAgICAgICAgbUJ1aWxkSGVscGVyLnNldE1vZHVsZUlkcyhtTW9kdWxlUmVwby5nZXRNb2R1bGVJZHMoKSk7Ci0KLSAgICAgICAgICAgICAgICBpbnQgY291bnQgPSBVbmlxdWVNb2R1bGVDb3VudFV0aWwuY291bnRVbmlxdWVNb2R1bGVzKG1Nb2R1bGVSZXBvLmdldFRva2VuTW9kdWxlcygpKQotICAgICAgICAgICAgICAgICAgICAgICAgKyBVbmlxdWVNb2R1bGVDb3VudFV0aWwuY291bnRVbmlxdWVNb2R1bGVzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Nb2R1bGVSZXBvLmdldE5vblRva2VuTW9kdWxlcygpKTsKLSAgICAgICAgICAgICAgICBDTG9nLmxvZ0FuZERpc3BsYXkoTG9nTGV2ZWwuSU5GTywgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKLSAgICAgICAgICAgICAgICBDTG9nLmxvZ0FuZERpc3BsYXkoTG9nTGV2ZWwuSU5GTywgIlN0YXJ0aW5nIGEgcnVuIHdpdGggJXMgdW5pcXVlIG1vZHVsZXMuIiwgY291bnQpOwotICAgICAgICAgICAgICAgIENMb2cubG9nQW5kRGlzcGxheShMb2dMZXZlbC5JTkZPLCAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBDTG9nLmQoIk1vZHVsZVJlcG8gYWxyZWFkeSBpbml0aWFsaXplZC4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEdldCB0aGUgdGVzdHMgdG8gcnVuIGluIHRoaXMgc2hhcmQKLSAgICAgICAgICAgIHJldHVybiBtTW9kdWxlUmVwby5nZXRNb2R1bGVzKGdldERldmljZSgpLmdldFNlcmlhbE51bWJlcigpLCBtU2hhcmRJbmRleCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzZXQgb2YgQUJJcyBzdXBwb3J0ZWQgYnkgYm90aCBDb21wYXRpYmlsaXR5IGFuZCB0aGUgZGV2aWNlIHVuZGVyIHRlc3QKLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHNldCBvZiBBQklzIHRvIHJ1biB0aGUgdGVzdHMgb24KLSAgICAgKiBAdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbgotICAgICAqLwotICAgIFNldDxJQWJpPiBnZXRBYmlzKCkgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFNldDxJQWJpPiBhYmlzID0gbmV3IExpbmtlZEhhc2hTZXQ8PigpOwotICAgICAgICBTZXQ8U3RyaW5nPiBhcmNoQWJpcyA9IGdldEFiaXNGb3JCdWlsZFRhcmdldEFyY2goKTsKLSAgICAgICAgaWYgKG1QcmltYXJ5QWJpUnVuKSB7Ci0gICAgICAgICAgICBpZiAobUFiaU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgcHJpbWFyeSBmcm9tIHRoZSBkZXZpY2UgYW5kIG1ha2UgaXQgdGhlIC0tYWJpIHRvIHJ1bi4KLSAgICAgICAgICAgICAgICBtQWJpTmFtZSA9IG1EZXZpY2UuZ2V0UHJvcGVydHkoInJvLnByb2R1Y3QuY3B1LmFiaSIpLnRyaW0oKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQ0xvZy5kKCJPcHRpb24gLS0lcyBzdXBlcnNlZGVzIHRoZSBvcHRpb24gLS0lcywgdXNpbmcgYWJpOiAlcyIsIEFCSV9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICBQUklNQVJZX0FCSV9SVU4sIG1BYmlOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobUFiaU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gQSBwYXJ0aWN1bGFyIGFiaSB3YXMgcmVxdWVzdGVkLCBpdCBzdGlsbCBuZWVkIHRvIGJlIHN1cHBvcnRlZCBieSB0aGUgYnVpbGQuCi0gICAgICAgICAgICBpZiAoKCFtU2tpcEhvc3RBcmNoQ2hlY2sgJiYgIWFyY2hBYmlzLmNvbnRhaW5zKG1BYmlOYW1lKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgIUFiaVV0aWxzLmlzQWJpU3VwcG9ydGVkQnlDb21wYXRpYmlsaXR5KG1BYmlOYW1lKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiWW91ciBDVFMgaGFzbid0IGJlZW4gYnVpbHQgd2l0aCAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJhYmkgJyVzJyBzdXBwb3J0LCB0aGlzIENUUyBjdXJyZW50bHkgc3VwcG9ydHMgJyVzJy4iLAotICAgICAgICAgICAgICAgICAgICAgICAgbUFiaU5hbWUsIGFyY2hBYmlzKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGFiaXMuYWRkKG5ldyBBYmkobUFiaU5hbWUsIEFiaVV0aWxzLmdldEJpdG5lc3MobUFiaU5hbWUpKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFiaXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBSdW4gb24gYWxsIGFiaSBpbiBjb21tb24gYmV0d2VlbiB0aGUgZGV2aWNlIGFuZCBDVFMuCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gZGV2aWNlQWJpcyA9IEFycmF5cy5hc0xpc3QoQWJpRm9ybWF0dGVyLmdldFN1cHBvcnRlZEFiaXMobURldmljZSwgIiIpKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGFiaSA6IGRldmljZUFiaXMpIHsKLSAgICAgICAgICAgICAgICBpZiAoKG1Ta2lwSG9zdEFyY2hDaGVjayB8fCBhcmNoQWJpcy5jb250YWlucyhhYmkpKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgQWJpVXRpbHMuaXNBYmlTdXBwb3J0ZWRCeUNvbXBhdGliaWxpdHkoYWJpKSkgewotICAgICAgICAgICAgICAgICAgICBhYmlzLmFkZChuZXcgQWJpKGFiaSwgQWJpVXRpbHMuZ2V0Qml0bmVzcyhhYmkpKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQ0xvZy5kKCJhYmkgJyVzJyBpcyBzdXBwb3J0ZWQgYnkgZGV2aWNlIGJ1dCBub3QgYnkgdGhpcyBDVFMgYnVpbGQgKCVzKSwgdGVzdHMgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIndpbGwgbm90IHJ1biBhZ2FpbnN0IGl0LiIsIGFiaSwgYXJjaEFiaXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhYmlzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiTm9uZSBvZiB0aGUgYWJpIHN1cHBvcnRlZCBieSB0aGlzIgotICAgICAgICAgICAgICAgICAgICAgICArICIgQ1RTIGJ1aWxkICgnJXMnKSBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UgKCclcycpLiIsCi0gICAgICAgICAgICAgICAgICAgICAgIGFyY2hBYmlzLCBkZXZpY2VBYmlzKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gYWJpczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgYWJpcyBzdXBwb3J0ZWQgYnkgdGhlIEhvc3QgYnVpbGQgdGFyZ2V0IGFyY2hpdGVjdHVyZS4KLSAgICAgKiBFeHBvc2VkIGZvciB0ZXN0aW5nLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTZXQ8U3RyaW5nPiBnZXRBYmlzRm9yQnVpbGRUYXJnZXRBcmNoKCkgewotICAgICAgICByZXR1cm4gQWJpVXRpbHMuZ2V0QWJpc0ZvckFyY2goVGVzdFN1aXRlSW5mby5nZXRJbnN0YW5jZSgpLmdldFRhcmdldEFyY2goKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgdGhhdCB0aGUgc3lzdGVtIHN0YXR1cyBjaGVja2VyIHNwZWNpZmllZCBieSBvcHRpb24gYXJlIHZhbGlkLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrU3lzdGVtU3RhdHVzQmxhY2tBbmRXaGl0ZUxpc3QoKSB7Ci0gICAgICAgIGZvciAoU3RyaW5nIGNoZWNrZXIgOiBtU3lzdGVtU3RhdHVzQ2hlY2tXaGl0ZWxpc3QpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZShjaGVja2VyKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gZXggPSBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIi0tc3lzdGVtLXN0YXR1cy1jaGVjay13aGl0ZWxpc3QgbXVzdCBjb250YWlucyB2YWxpZCBjbGFzcywgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIlcyB3YXMgbm90IGZvdW5kIiwgY2hlY2tlciksIGUpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmb3IgKFN0cmluZyBjaGVja2VyIDogbVN5c3RlbVN0YXR1c0NoZWNrQmxhY2tsaXN0KSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIENsYXNzLmZvck5hbWUoY2hlY2tlcik7Ci0gICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uRXhjZXB0aW9uIGV4ID0gbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCItLXNraXAtc3lzdGVtLXN0YXR1cy1jaGVjayBtdXN0IGNvbnRhaW5zIHZhbGlkIGNsYXNzLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiVzIHdhcyBub3QgZm91bmQiLCBjaGVja2VyKSwgZSk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVzb2x2ZSB0aGUgaW5jbHVzaW9uIGFuZCBleGNsdXNpb24gbG9naWMgb2Ygc3lzdGVtIHN0YXR1cyBjaGVja2VycwotICAgICAqCi0gICAgICogQHBhcmFtIHMgdGhlIHtAbGluayBJU3lzdGVtU3RhdHVzQ2hlY2tlcn0gdG8gcGVyZm9ybSBmaWx0ZXJpbmcgbG9naWMgb24KLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHtAbGluayBJU3lzdGVtU3RhdHVzQ2hlY2tlcn0gc2hvdWxkIGJlIGluY2x1ZGVkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHNob3VsZEluY2x1ZGVTeXN0ZW1TdGF0dXNDaGVja2VyKElTeXN0ZW1TdGF0dXNDaGVja2VyIHMpIHsKLSAgICAgICAgU3RyaW5nIGNsYXp6ID0gcy5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKTsKLSAgICAgICAgYm9vbGVhbiBzaG91bGRJbmNsdWRlID0gbVN5c3RlbVN0YXR1c0NoZWNrV2hpdGVsaXN0LmlzRW1wdHkoKQotICAgICAgICAgICAgICAgIHx8IG1TeXN0ZW1TdGF0dXNDaGVja1doaXRlbGlzdC5jb250YWlucyhjbGF6eik7Ci0gICAgICAgIGJvb2xlYW4gc2hvdWxkRXhjbHVkZSA9ICFtU3lzdGVtU3RhdHVzQ2hlY2tCbGFja2xpc3QuaXNFbXB0eSgpCi0gICAgICAgICAgICAgICAgJiYgbVN5c3RlbVN0YXR1c0NoZWNrQmxhY2tsaXN0LmNvbnRhaW5zKGNsYXp6KTsKLSAgICAgICAgcmV0dXJuIHNob3VsZEluY2x1ZGUgJiYgIXNob3VsZEV4Y2x1ZGU7Ci0gICAgfQotCi0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgdm9pZCBydW5QcmVNb2R1bGVDaGVjayhTdHJpbmcgbW9kdWxlTmFtZSwgTGlzdDxJU3lzdGVtU3RhdHVzQ2hlY2tlcj4gY2hlY2tlcnMsCi0gICAgICAgICAgICBJVGVzdERldmljZSBkZXZpY2UsIElUZXN0TG9nZ2VyIGxvZ2dlcikgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIENMb2cuaSgiUnVubmluZyBzeXN0ZW0gc3RhdHVzIGNoZWNrZXIgYmVmb3JlIG1vZHVsZSBleGVjdXRpb246ICVzIiwgbW9kdWxlTmFtZSk7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBmYWlsdXJlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBmb3IgKElTeXN0ZW1TdGF0dXNDaGVja2VyIGNoZWNrZXIgOiBjaGVja2VycykgewotICAgICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBjaGVja2VyLnByZUV4ZWN1dGlvbkNoZWNrKGRldmljZSk7Ci0gICAgICAgICAgICBpZiAoIXJlc3VsdCkgewotICAgICAgICAgICAgICAgIGZhaWx1cmVzLmFkZChjaGVja2VyLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICBDTG9nLncoIlN5c3RlbSBzdGF0dXMgY2hlY2tlciBbJXNdIGZhaWxlZCIsIGNoZWNrZXIuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICghZmFpbHVyZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBDTG9nLncoIlRoZXJlIGFyZSBmYWlsZWQgc3lzdGVtIHN0YXR1cyBjaGVja2VyczogJXMgY2FwdHVyaW5nIGEgYnVncmVwb3J0IiwKLSAgICAgICAgICAgICAgICAgICAgZmFpbHVyZXMudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB0cnkgKElucHV0U3RyZWFtU291cmNlIGJ1Z1NvdXJjZSA9IGRldmljZS5nZXRCdWdyZXBvcnQoKSkgewotICAgICAgICAgICAgICAgIGxvZ2dlci50ZXN0TG9nKFN0cmluZy5mb3JtYXQoImJ1Z3JlcG9ydC1jaGVja2VyLXByZS1tb2R1bGUtJXMiLCBtb2R1bGVOYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZ0RhdGFUeXBlLkJVR1JFUE9SVCwgYnVnU291cmNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHZvaWQgcnVuUG9zdE1vZHVsZUNoZWNrKFN0cmluZyBtb2R1bGVOYW1lLCBMaXN0PElTeXN0ZW1TdGF0dXNDaGVja2VyPiBjaGVja2VycywKLSAgICAgICAgICAgIElUZXN0RGV2aWNlIGRldmljZSwgSVRlc3RMb2dnZXIgbG9nZ2VyKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgQ0xvZy5pKCJSdW5uaW5nIHN5c3RlbSBzdGF0dXMgY2hlY2tlciBhZnRlciBtb2R1bGUgZXhlY3V0aW9uOiAlcyIsIG1vZHVsZU5hbWUpOwotICAgICAgICBMaXN0PFN0cmluZz4gZmFpbHVyZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgZm9yIChJU3lzdGVtU3RhdHVzQ2hlY2tlciBjaGVja2VyIDogY2hlY2tlcnMpIHsKLSAgICAgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gY2hlY2tlci5wb3N0RXhlY3V0aW9uQ2hlY2soZGV2aWNlKTsKLSAgICAgICAgICAgIGlmICghcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgZmFpbHVyZXMuYWRkKGNoZWNrZXIuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgIENMb2cudygiU3lzdGVtIHN0YXR1cyBjaGVja2VyIFslc10gZmFpbGVkIiwgY2hlY2tlci5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFmYWlsdXJlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIENMb2cudygiVGhlcmUgYXJlIGZhaWxlZCBzeXN0ZW0gc3RhdHVzIGNoZWNrZXJzOiAlcyBjYXB0dXJpbmcgYSBidWdyZXBvcnQiLAotICAgICAgICAgICAgICAgICAgICBmYWlsdXJlcy50b1N0cmluZygpKTsKLSAgICAgICAgICAgIHRyeSAoSW5wdXRTdHJlYW1Tb3VyY2UgYnVnU291cmNlID0gZGV2aWNlLmdldEJ1Z3JlcG9ydCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRlc3RMb2coU3RyaW5nLmZvcm1hdCgiYnVncmVwb3J0LWNoZWNrZXItcG9zdC1tb2R1bGUtJXMiLCBtb2R1bGVOYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZ0RhdGFUeXBlLkJVR1JFUE9SVCwgYnVnU291cmNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHJldHJ5IGNvbW1hbmQtbGluZSBhcmdzIHRvIGJlIHN0b3JlZCBpbiB0aGUgQnVpbGRJbmZvIGFuZCBzZXJpYWxpemVkIGludG8gdGhlCi0gICAgICogcmVwb3J0IHVwb24gY29tcGxldGlvbiBvZiB0aGUgaW52b2NhdGlvbi4KLSAgICAgKi8KLSAgICB2b2lkIGxvYWRSZXRyeUNvbW1hbmRMaW5lQXJncyhJbnRlZ2VyIHNlc3Npb25JZCkgewotICAgICAgICBJSW52b2NhdGlvblJlc3VsdCByZXN1bHQgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVzdWx0ID0gUmVzdWx0SGFuZGxlci5maW5kUmVzdWx0KG1CdWlsZEhlbHBlci5nZXRSZXN1bHRzRGlyKCksIHNlc3Npb25JZCk7Ci0gICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBXZSBzaG91bGQgbmV2ZXIgcmVhY2ggdGhpcyBwb2ludCwgYmVjYXVzZSB0aGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQKLSAgICAgICAgICAgIC8vIGFmdGVyIHNldHVwRmlsdGVycygpLCBzbyByZXN1bHQgZXhpc3RzIGlmIHdlJ3ZlIGdvdHRlbiB0aGlzIGZhcgotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBBZ2FpbiwgdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZmluZCBzZXNzaW9uIHdpdGggaWQgJWQiLCBzZXNzaW9uSWQpKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgcmV0cnlDb21tYW5kTGluZUFyZ3MgPSByZXN1bHQuZ2V0Q29tbWFuZExpbmVBcmdzKCk7Ci0gICAgICAgIGlmIChyZXRyeUNvbW1hbmRMaW5lQXJncyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQnVpbGRIZWxwZXIuc2V0UmV0cnlDb21tYW5kTGluZUFyZ3MocmV0cnlDb21tYW5kTGluZUFyZ3MpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgaW5jbHVkZS9leGNsdWRlIGZpbHRlcnMgdXAgYmFzZWQgb24gaWYgYSBtb2R1bGUgbmFtZSB3YXMgZ2l2ZW4gb3Igd2hldGhlciB0aGlzIGlzIGEKLSAgICAgKiByZXRyeSBydW4uCi0gICAgICovCi0gICAgdm9pZCBzZXR1cEZpbHRlcnMoKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG1SZXRyeVNlc3Npb25JZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBMb2FkIHRoZSBpbnZvY2F0aW9uIHJlc3VsdAotICAgICAgICAgICAgUmV0cnlGaWx0ZXJIZWxwZXIgaGVscGVyID0gY3JlYXRlUmV0cnlGaWx0ZXJIZWxwZXIobVJldHJ5U2Vzc2lvbklkKTsKLSAgICAgICAgICAgIGhlbHBlci52YWxpZGF0ZUJ1aWxkRmluZ2VycHJpbnQobURldmljZSk7Ci0gICAgICAgICAgICBoZWxwZXIuc2V0Q29tbWFuZExpbmVPcHRpb25zRm9yKHRoaXMpOwotICAgICAgICAgICAgaGVscGVyLnBvcHVsYXRlUmV0cnlGaWx0ZXJzKCk7Ci0gICAgICAgICAgICBtSW5jbHVkZUZpbHRlcnMgPSBoZWxwZXIuZ2V0SW5jbHVkZUZpbHRlcnMoKTsKLSAgICAgICAgICAgIG1FeGNsdWRlRmlsdGVycyA9IGhlbHBlci5nZXRFeGNsdWRlRmlsdGVycygpOwotICAgICAgICAgICAgaGVscGVyLnRlYXJEb3duKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobVN1YlBsYW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIElTdWJQbGFuIHN1YlBsYW4gPSBTdWJQbGFuSGVscGVyLmdldFN1YlBsYW5CeU5hbWUobUJ1aWxkSGVscGVyLCBtU3ViUGxhbik7Ci0gICAgICAgICAgICAgICAgbUluY2x1ZGVGaWx0ZXJzLmFkZEFsbChzdWJQbGFuLmdldEluY2x1ZGVGaWx0ZXJzKCkpOwotICAgICAgICAgICAgICAgIG1FeGNsdWRlRmlsdGVycy5hZGRBbGwoc3ViUGxhbi5nZXRFeGNsdWRlRmlsdGVycygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtTW9kdWxlTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IG1vZHVsZXMgPSBNb2R1bGVSZXBvLmdldE1vZHVsZU5hbWVzTWF0Y2hpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ1aWxkSGVscGVyLmdldFRlc3RzRGlyKCksIG1Nb2R1bGVOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1vZHVsZXMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIk5vIG1vZHVsZXMgZm91bmQgbWF0Y2hpbmcgJXMiLCBtTW9kdWxlTmFtZSkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1vZHVsZXMuc2l6ZSgpID4gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJNdWx0aXBsZSBtb2R1bGVzIGZvdW5kIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgbWF0Y2hpbmcgJXM6XG4lc1xuV2hpY2ggb25lIGRpZCB5b3UgbWVhbj9cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Nb2R1bGVOYW1lLCBBcnJheVV0aWwuam9pbigiXG4iLCBtb2R1bGVzKSkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1vZHVsZSA9IG1vZHVsZXMuZ2V0KDApOwotICAgICAgICAgICAgICAgICAgICAgICAgY2xlYW5GaWx0ZXJzKG1JbmNsdWRlRmlsdGVycywgbW9kdWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFuRmlsdGVycyhtRXhjbHVkZUZpbHRlcnMsIG1vZHVsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSW5jbHVkZUZpbHRlcnMuYWRkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVGVzdEZpbHRlcihtQWJpTmFtZSwgbW9kdWxlLCBtVGVzdE5hbWUpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChtVGVzdE5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiVGVzdCBuYW1lIGdpdmVuIHdpdGhvdXQgbW9kdWxlIG5hbWUuIEFkZCAtLW1vZHVsZSA8bW9kdWxlLW5hbWU+Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBDcmVhdGVzIGEgbmV3IHtAbGluayBSZXRyeUZpbHRlckhlbHBlcn0gZnJvbSBhdHRyaWJ1dGVzIG9mIHRoaXMgb2JqZWN0LiAqLwotICAgIHByb3RlY3RlZCBSZXRyeUZpbHRlckhlbHBlciBjcmVhdGVSZXRyeUZpbHRlckhlbHBlcihJbnRlZ2VyIHJldHJ5U2Vzc2lvbklkKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUmV0cnlGaWx0ZXJIZWxwZXIobUJ1aWxkSGVscGVyLCByZXRyeVNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICBtU3ViUGxhbiwgbUluY2x1ZGVGaWx0ZXJzLCBtRXhjbHVkZUZpbHRlcnMsIG1BYmlOYW1lLCBtTW9kdWxlTmFtZSwgbVRlc3ROYW1lLAotICAgICAgICAgICAgICAgIG1SZXRyeVR5cGUpOwotICAgIH0KLQotICAgIC8qIEhlbHBlciBtZXRob2QgZGVzaWduZWQgdG8gcmVtb3ZlIGZpbHRlcnMgaW4gYSBsaXN0IG5vdCBhcHBsaWNhYmxlIHRvIHRoZSBnaXZlbiBtb2R1bGUgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNsZWFuRmlsdGVycyhTZXQ8U3RyaW5nPiBmaWx0ZXJzLCBTdHJpbmcgbW9kdWxlKSB7Ci0gICAgICAgIFNldDxTdHJpbmc+IGNsZWFuZWRGaWx0ZXJzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICBmb3IgKFN0cmluZyBmaWx0ZXIgOiBmaWx0ZXJzKSB7Ci0gICAgICAgICAgICBpZiAobW9kdWxlLmVxdWFscyhUZXN0RmlsdGVyLmNyZWF0ZUZyb20oZmlsdGVyKS5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgY2xlYW5lZEZpbHRlcnMuYWRkKGZpbHRlcik7IC8vIE1vZHVsZSBuYW1lIG1hdGNoZXMsIGZpbHRlciBwYXNzZXMKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaWx0ZXJzLmNsZWFyKCk7Ci0gICAgICAgIGZpbHRlcnMuYWRkQWxsKGNsZWFuZWRGaWx0ZXJzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENvbGxlY3Rpb248SVJlbW90ZVRlc3Q+IHNwbGl0KCkgewotICAgICAgICBpZiAobVNoYXJkcyA8PSAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBtSXNMb2NhbFNoYXJkaW5nID0gdHJ1ZTsKLSAgICAgICAgTGlzdDxJUmVtb3RlVGVzdD4gc2hhcmRRdWV1ZSA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtU2hhcmRzOyBpKyspIHsKLSAgICAgICAgICAgIENvbXBhdGliaWxpdHlUZXN0IHRlc3QgPSAoQ29tcGF0aWJpbGl0eVRlc3QpIGdldFRlc3RTaGFyZChtU2hhcmRzLCBpKTsKLSAgICAgICAgICAgIHRlc3QubUlzTG9jYWxTaGFyZGluZyA9IHRydWU7Ci0gICAgICAgICAgICBzaGFyZFF1ZXVlLmFkZCh0ZXN0KTsKLSAgICAgICAgfQotICAgICAgICBzUHJlcGFyZWRMYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaChzaGFyZFF1ZXVlLnNpemUoKSk7Ci0gICAgICAgIHJldHVybiBzaGFyZFF1ZXVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ29sbGVjdGlvbjxJUmVtb3RlVGVzdD4gc3BsaXQoaW50IHNoYXJkQ291bnQpIHsKLSAgICAgICAgaWYgKHNoYXJkQ291bnQgPD0gMSB8fCBtSXNTaGFyZGVkKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBtSXNTaGFyZGVkID0gdHJ1ZTsKLSAgICAgICAgTGlzdDxJUmVtb3RlVGVzdD4gc2hhcmRRdWV1ZSA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaGFyZENvdW50OyBpKyspIHsKLSAgICAgICAgICAgIENvbXBhdGliaWxpdHlUZXN0IHRlc3QgPSAoQ29tcGF0aWJpbGl0eVRlc3QpIGdldFRlc3RTaGFyZChzaGFyZENvdW50LCBpKTsKLSAgICAgICAgICAgIHNoYXJkUXVldWUuYWRkKHRlc3QpOwotICAgICAgICAgICAgdGVzdC5tSXNTaGFyZGVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2hhcmRRdWV1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElSZW1vdGVUZXN0IGdldFRlc3RTaGFyZChpbnQgc2hhcmRDb3VudCwgaW50IHNoYXJkSW5kZXgpIHsKLSAgICAgICAgQ29tcGF0aWJpbGl0eVRlc3QgdGVzdCA9IG5ldyBDb21wYXRpYmlsaXR5VGVzdChzaGFyZENvdW50LCBtTW9kdWxlUmVwbywgc2hhcmRJbmRleCk7Ci0gICAgICAgIE9wdGlvbkNvcGllci5jb3B5T3B0aW9uc05vVGhyb3codGhpcywgdGVzdCk7Ci0gICAgICAgIC8vIFNldCB0aGUgc2hhcmQgY291bnQgYmVjYXVzZSB0aGUgY29weSBvcHRpb24gb24gdGhlIHByZXZpb3VzIGxpbmUKLSAgICAgICAgLy8gY29waWVzIG92ZXIgdGhlIG1TaGFyZCB2YWx1ZQotICAgICAgICB0ZXN0Lm1TaGFyZHMgPSAwOwotICAgICAgICByZXR1cm4gdGVzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0U3lzdGVtU3RhdHVzQ2hlY2tlcihMaXN0PElTeXN0ZW1TdGF0dXNDaGVja2VyPiBzeXN0ZW1DaGVja2VycykgewotICAgICAgICBtTGlzdENoZWNrZXJzID0gc3lzdGVtQ2hlY2tlcnM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0Q29sbGVjdFRlc3RzT25seShib29sZWFuIGNvbGxlY3RUZXN0c09ubHkpIHsKLSAgICAgICAgbUNvbGxlY3RUZXN0c09ubHkgPSBjb2xsZWN0VGVzdHNPbmx5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgaW5jbHVkZS1maWx0ZXJzIGZvciB0aGUgY29tcGF0aWJpbGl0eSB0ZXN0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW5jbHVkZUZpbHRlcihTZXQ8U3RyaW5nPiBpbmNsdWRlRmlsdGVycykgewotICAgICAgICBtSW5jbHVkZUZpbHRlcnMuYWRkQWxsKGluY2x1ZGVGaWx0ZXJzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGV4Y2x1ZGUtZmlsdGVycyBmb3IgdGhlIGNvbXBhdGliaWxpdHkgdGVzdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEV4Y2x1ZGVGaWx0ZXIoU2V0PFN0cmluZz4gZXhjbHVkZUZpbHRlcnMpIHsKLSAgICAgICAgbUV4Y2x1ZGVGaWx0ZXJzLmFkZEFsbChleGNsdWRlRmlsdGVycyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0SW52b2NhdGlvbkNvbnRleHQoSUludm9jYXRpb25Db250ZXh0IGludm9jYXRpb25Db250ZXh0KSB7Ci0gICAgICAgIG1JbnZvY2F0aW9uQ29udGV4dCA9IGludm9jYXRpb25Db250ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIG1TdWJQbGFuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRTdWJQbGFuKCkgewotICAgICAgICByZXR1cm4gbVN1YlBsYW47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgbUluY2x1ZGVGaWx0ZXJzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFNldDxTdHJpbmc+IGdldEluY2x1ZGVGaWx0ZXJzKCkgewotICAgICAgICByZXR1cm4gbUluY2x1ZGVGaWx0ZXJzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIG1FeGNsdWRlRmlsdGVycwotICAgICAqLwotICAgIHByb3RlY3RlZCBTZXQ8U3RyaW5nPiBnZXRFeGNsdWRlRmlsdGVycygpIHsKLSAgICAgICAgcmV0dXJuIG1FeGNsdWRlRmlsdGVyczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBtTW9kdWxlTmFtZQotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TW9kdWxlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1Nb2R1bGVOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIG1UZXN0TmFtZQotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VGVzdE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtVGVzdE5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgbU1vZHVsZUFyZ3MKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IGdldE1vZHVsZUFyZ3MoKSB7Ci0gICAgICAgIHJldHVybiBtTW9kdWxlQXJnczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBtVGVzdEFyZ3MKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IGdldFRlc3RBcmdzKCkgewotICAgICAgICByZXR1cm4gbVRlc3RBcmdzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIG1SZXRyeVR5cGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgUmV0cnlUeXBlIGdldFJldHJ5VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG1SZXRyeVR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgbUFiaU5hbWUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEFiaU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtQWJpTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBtRGV2aWNlVG9rZW5zCi0gICAgICovCi0gICAgcHJvdGVjdGVkIExpc3Q8U3RyaW5nPiBnZXREZXZpY2VUb2tlbnMoKSB7Ci0gICAgICAgIHJldHVybiBtRGV2aWNlVG9rZW5zOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIG1Nb2R1bGVNZXRhZGF0YUluY2x1ZGVGaWx0ZXIKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTXVsdGlNYXA8U3RyaW5nLCBTdHJpbmc+IGdldE1vZHVsZU1ldGFkYXRhSW5jbHVkZUZpbHRlcigpIHsKLSAgICAgICAgcmV0dXJuIG1Nb2R1bGVNZXRhZGF0YUluY2x1ZGVGaWx0ZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgbU1vZHVsZU1ldGFkYXRhRXhjbHVkZUZpbHRlcgotICAgICAqLwotICAgIHByb3RlY3RlZCBNdWx0aU1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0TW9kdWxlTWV0YWRhdGFFeGNsdWRlRmlsdGVyKCkgewotICAgICAgICByZXR1cm4gbU1vZHVsZU1ldGFkYXRhRXhjbHVkZUZpbHRlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBtVG90YWxTaGFyZHMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgaW50IGdldFRvdGFsU2hhcmRzKCkgewotICAgICAgICByZXR1cm4gbVRvdGFsU2hhcmRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIG1TaGFyZEluZGV4Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIEludGVnZXIgZ2V0U2hhcmRJbmRleCgpIHsKLSAgICAgICAgcmV0dXJuIG1TaGFyZEluZGV4OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIG1CdWlsZEhlbHBlcgotICAgICAqLwotICAgIHByb3RlY3RlZCBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIgZ2V0QnVpbGRIZWxwZXIoKSB7Ci0gICAgICAgIHJldHVybiBtQnVpbGRIZWxwZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgbUludm9jYXRpb25Db250ZXh0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIElJbnZvY2F0aW9uQ29udGV4dCBnZXRJbnZvY2F0aW9uQ29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIG1JbnZvY2F0aW9uQ29udGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBtTW9kdWxlUmVwbwotICAgICAqLwotICAgIHByb3RlY3RlZCBJTW9kdWxlUmVwbyBnZXRNb2R1bGVSZXBvKCkgewotICAgICAgICByZXR1cm4gbU1vZHVsZVJlcG87Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdGVzdHR5cGUvRmFpbHVyZUxpc3RlbmVyLmphdmEgYi9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC90ZXN0dHlwZS9GYWlsdXJlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJkZGIyMi4uMDAwMDAwMAotLS0gYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC90ZXN0dHlwZS9GYWlsdXJlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGVzdHR5cGU7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIudGVzdHJ1bm5lci5UZXN0SWRlbnRpZmllcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5JVGVzdERldmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5sb2cuTG9nVXRpbC5DTG9nOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnJlc3VsdC5JVGVzdEludm9jYXRpb25MaXN0ZW5lcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5yZXN1bHQuSW5wdXRTdHJlYW1Tb3VyY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQucmVzdWx0LkxvZ0RhdGFUeXBlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnJlc3VsdC5SZXN1bHRGb3J3YXJkZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudXRpbC5SdW5VdGlsOwotCi1wdWJsaWMgY2xhc3MgRmFpbHVyZUxpc3RlbmVyIGV4dGVuZHMgUmVzdWx0Rm9yd2FyZGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX01BWF9MT0dDQVRfQllURVMgPSA1MDAgKiAxMDI0OyAvLyA1MDBLCi0gICAgLyogQXJiaXRyYXJ5IHVwcGVyIGxpbWl0IGZvciBtTWF4TG9nY2F0Qnl0ZXMsIHBlciBiLzMwNzIwODUwICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9HQ0FUX0JZVEVfTElNSVQgPSAyMCAqIDEwMjQgKiAxMDI0OyAvLyAyMCBNQgotCi0gICAgcHJpdmF0ZSBJVGVzdERldmljZSBtRGV2aWNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtQnVnUmVwb3J0T25GYWlsdXJlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtTG9nY2F0T25GYWlsdXJlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtU2NyZWVuc2hvdE9uRmFpbHVyZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVJlYm9vdE9uRmFpbHVyZTsKLSAgICBwcml2YXRlIGludCBtTWF4TG9nY2F0Qnl0ZXM7Ci0KLSAgICBwdWJsaWMgRmFpbHVyZUxpc3RlbmVyKElUZXN0SW52b2NhdGlvbkxpc3RlbmVyIGxpc3RlbmVyLCBJVGVzdERldmljZSBkZXZpY2UsCi0gICAgICAgICAgICBib29sZWFuIGJ1Z1JlcG9ydE9uRmFpbHVyZSwgYm9vbGVhbiBsb2djYXRPbkZhaWx1cmUsIGJvb2xlYW4gc2NyZWVuc2hvdE9uRmFpbHVyZSwKLSAgICAgICAgICAgIGJvb2xlYW4gcmVib290T25GYWlsdXJlLCBpbnQgbWF4TG9nY2F0Qnl0ZXMpIHsKLSAgICAgICAgc3VwZXIobGlzdGVuZXIpOwotICAgICAgICBtRGV2aWNlID0gZGV2aWNlOwotICAgICAgICBtQnVnUmVwb3J0T25GYWlsdXJlID0gYnVnUmVwb3J0T25GYWlsdXJlOwotICAgICAgICBtTG9nY2F0T25GYWlsdXJlID0gbG9nY2F0T25GYWlsdXJlOwotICAgICAgICBtU2NyZWVuc2hvdE9uRmFpbHVyZSA9IHNjcmVlbnNob3RPbkZhaWx1cmU7Ci0gICAgICAgIG1SZWJvb3RPbkZhaWx1cmUgPSByZWJvb3RPbkZhaWx1cmU7Ci0gICAgICAgIGlmIChtYXhMb2djYXRCeXRlcyA8IDAgKSB7Ci0gICAgICAgICAgICBDTG9nLncoIkZhaWx1cmVMaXN0ZW5lciBjb3VsZCBub3Qgc2V0ICVzIHRvICclZCcsIHVzaW5nIGRlZmF1bHQgdmFsdWUgJWQiLAotICAgICAgICAgICAgICAgICAgICBDb21wYXRpYmlsaXR5VGVzdC5MT0dDQVRfT05fRkFJTFVSRV9TSVpFX09QVElPTiwgbWF4TG9nY2F0Qnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgIERFRkFVTFRfTUFYX0xPR0NBVF9CWVRFUyk7Ci0gICAgICAgICAgICBtTWF4TG9nY2F0Qnl0ZXMgPSBERUZBVUxUX01BWF9MT0dDQVRfQllURVM7Ci0gICAgICAgIH0gZWxzZSBpZiAobWF4TG9nY2F0Qnl0ZXMgPiBMT0dDQVRfQllURV9MSU1JVCkgewotICAgICAgICAgICAgQ0xvZy53KCJWYWx1ZSAlZCBmb3IgJXMgZXhjZWVkcyBsaW1pdCAlZCwgdXNpbmcgbGltaXQgdmFsdWUiLCBtYXhMb2djYXRCeXRlcywKLSAgICAgICAgICAgICAgICAgICAgQ29tcGF0aWJpbGl0eVRlc3QuTE9HQ0FUX09OX0ZBSUxVUkVfU0laRV9PUFRJT04sIExPR0NBVF9CWVRFX0xJTUlUKTsKLSAgICAgICAgICAgIG1NYXhMb2djYXRCeXRlcyA9IExPR0NBVF9CWVRFX0xJTUlUOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbU1heExvZ2NhdEJ5dGVzID0gbWF4TG9nY2F0Qnl0ZXM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdGVzdEZhaWxlZChUZXN0SWRlbnRpZmllciB0ZXN0LCBTdHJpbmcgdHJhY2UpIHsKLSAgICAgICAgc3VwZXIudGVzdEZhaWxlZCh0ZXN0LCB0cmFjZSk7Ci0gICAgICAgIENMb2cuaSgiRmFpbHVyZUxpc3RlbmVyLnRlc3RGYWlsZWQgJXMgJWIgJWIgJWIiLAotICAgICAgICAgICAgICAgIHRlc3QudG9TdHJpbmcoKSwgbUJ1Z1JlcG9ydE9uRmFpbHVyZSwgbUxvZ2NhdE9uRmFpbHVyZSwgbVNjcmVlbnNob3RPbkZhaWx1cmUpOwotICAgICAgICBpZiAobVNjcmVlbnNob3RPbkZhaWx1cmUpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdHJ5IChJbnB1dFN0cmVhbVNvdXJjZSBzY3JlZW5Tb3VyY2UgPSBtRGV2aWNlLmdldFNjcmVlbnNob3QoKSkgewotICAgICAgICAgICAgICAgICAgICBzdXBlci50ZXN0TG9nKFN0cmluZy5mb3JtYXQoIiVzLXNjcmVlbnNob3QiLCB0ZXN0LnRvU3RyaW5nKCkpLCBMb2dEYXRhVHlwZS5QTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICBzY3JlZW5Tb3VyY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgQ0xvZy5lKGUpOwotICAgICAgICAgICAgICAgIENMb2cuZSgiRGV2aWNlICVzIGJlY2FtZSB1bmF2YWlsYWJsZSB3aGlsZSBjYXB0dXJpbmcgc2NyZWVuc2hvdCIsCi0gICAgICAgICAgICAgICAgICAgIG1EZXZpY2UuZ2V0U2VyaWFsTnVtYmVyKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChtQnVnUmVwb3J0T25GYWlsdXJlKSB7Ci0gICAgICAgICAgICBpbnQgYXBpID0gLTE7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGFwaSA9IG1EZXZpY2UuZ2V0QXBpTGV2ZWwoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gaWdub3JlLCBpdCB3aWxsIGJlIHJhaXNlZCBsYXRlci4KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhcGkgPCAyNCkgewotICAgICAgICAgICAgICAgIHRyeSAoSW5wdXRTdHJlYW1Tb3VyY2UgZmFsbGJhY2sgPSBtRGV2aWNlLmdldEJ1Z3JlcG9ydCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN1cGVyLnRlc3RMb2coU3RyaW5nLmZvcm1hdCgiJXMtYnVncmVwb3J0IiwgdGVzdC50b1N0cmluZygpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2dEYXRhVHlwZS5CVUdSRVBPUlQsIGZhbGxiYWNrKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRyeSAoSW5wdXRTdHJlYW1Tb3VyY2UgYnVnU291cmNlID0gbURldmljZS5nZXRCdWdyZXBvcnR6KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJ1Z1NvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdXBlci50ZXN0TG9nKFN0cmluZy5mb3JtYXQoIiVzLWJ1Z3JlcG9ydHoiLCB0ZXN0LnRvU3RyaW5nKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2dEYXRhVHlwZS5CVUdSRVBPUlRaLCBidWdTb3VyY2UpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgQ0xvZy5lKCJGYWlsZWQgdG8gY2FwdHVyZSBidWdyZXBvcnQgZm9yICVzIiwgdGVzdC50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobUxvZ2NhdE9uRmFpbHVyZSkgewotICAgICAgICAgICAgLy8gc2xlZXAgMnMgdG8gZW5zdXJlIHRlc3QgZmFpbHVyZSBzdGFjayB0cmFjZSBtYWtlcyBpdCBpbnRvIGxvZ2NhdCBjYXB0dXJlCi0gICAgICAgICAgICBSdW5VdGlsLmdldERlZmF1bHQoKS5zbGVlcCgyICogMTAwMCk7Ci0gICAgICAgICAgICB0cnkgKElucHV0U3RyZWFtU291cmNlIGxvZ1NvdXJjZSA9IG1EZXZpY2UuZ2V0TG9nY2F0KG1NYXhMb2djYXRCeXRlcykpIHsKLSAgICAgICAgICAgICAgICBzdXBlci50ZXN0TG9nKFN0cmluZy5mb3JtYXQoIiVzLWxvZ2NhdCIsIHRlc3QudG9TdHJpbmcoKSksIExvZ0RhdGFUeXBlLkxPR0NBVCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ1NvdXJjZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1SZWJvb3RPbkZhaWx1cmUpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gUmVib290aW5nIG9uIGFsbCBmYWlsdXJlcyBjYW4gaGlkZSBsZWdpdGltYXRlIGlzc3VlcyBhbmQgcGxhdGZvcm0gaW5zdGFiaWxpdGllcywKLSAgICAgICAgICAgICAgICAvLyB0aGVyZWZvcmUgb25seSBhbGxvd2VkIG9uICJ1c2VyLWRlYnVnIiBhbmQgImVuZyIgYnVpbGRzLgotICAgICAgICAgICAgICAgIGlmICgidXNlciIuZXF1YWxzKG1EZXZpY2UuZ2V0UHJvcGVydHkoInJvLmJ1aWxkLnR5cGUiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgQ0xvZy5lKCJSZWJvb3Qtb24tZmFpbHVyZSBzaG91bGQgb25seSBiZSB1c2VkIGR1cmluZyBkZXZlbG9wbWVudCwiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHRoaXMgaXMgYVwiIHVzZXJcIiBidWlsZCBkZXZpY2UiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtRGV2aWNlLnJlYm9vdCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgQ0xvZy5lKGUpOwotICAgICAgICAgICAgICAgIENMb2cuZSgiRGV2aWNlICVzIGJlY2FtZSB1bmF2YWlsYWJsZSB3aGlsZSByZWJvb3RpbmciLAotICAgICAgICAgICAgICAgICAgICAgICAgbURldmljZS5nZXRTZXJpYWxOdW1iZXIoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3Rlc3R0eXBlL0lNb2R1bGVEZWYuamF2YSBiL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3Rlc3R0eXBlL0lNb2R1bGVEZWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EyYzQ0ZC4uMDAwMDAwMAotLS0gYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC90ZXN0dHlwZS9JTW9kdWxlRGVmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGVzdHR5cGU7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5jb25maWcuQ29uZmlndXJhdGlvbkRlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLkRldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5pbnZva2VyLklJbnZvY2F0aW9uQ29udGV4dDsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JQWJpOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLklCdWlsZFJlY2VpdmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLklEZXZpY2VUZXN0OwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLklSZW1vdGVUZXN0OwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLklSdW50aW1lSGludFByb3ZpZGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLklUZXN0Q29sbGVjdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLnN1aXRlLk1vZHVsZURlZmluaXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIENvbnRhaW5lciBmb3IgQ29tcGF0aWJpbGl0eSB0ZXN0IGluZm8uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1vZHVsZURlZiBleHRlbmRzIENvbXBhcmFibGU8SU1vZHVsZURlZj4sIElCdWlsZFJlY2VpdmVyLCBJRGV2aWNlVGVzdCwKLSAgICAgICAgSVJlbW90ZVRlc3QsIElSdW50aW1lSGludFByb3ZpZGVyLCBJVGVzdENvbGxlY3RvciB7Ci0KLSAgICAvKioga2V5IG5hbWVzIHVzZWQgZm9yIHNhdmluZyBtb2R1bGUgaW5mbyBpbnRvIHtAbGluayBJSW52b2NhdGlvbkNvbnRleHR9ICovCi0gICAgLy8gVGhpcyBjdXJyZW50bHkgcmVmZXJlbmNlcyBNb2R1bGVEZWZpbml0aW9uIHNvIHRoYXQgdGhlcmUncyBvbmx5IG9uY2Ugc291cmNlIGZvciBTdHJpbmcKLSAgICAvLyBsaXRlcmFscyBhbmQgbWFraW5nIGl0IGVhc2llciB0byBjb252ZXJnZSBJTW9kdWxlRGVmIGFuZCBNb2R1bGVEZWZpbml0aW9uIGxhdGVyCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTU9EVUxFX05BTUUgPSBNb2R1bGVEZWZpbml0aW9uLk1PRFVMRV9OQU1FOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1PRFVMRV9BQkkgPSBNb2R1bGVEZWZpbml0aW9uLk1PRFVMRV9BQkk7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBuYW1lIG9mIHRoaXMgbW9kdWxlLgotICAgICAqLwotICAgIFN0cmluZyBnZXROYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIGEge0BsaW5rIFN0cmluZ30gdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhpcyBtb2R1bGUuCi0gICAgICovCi0gICAgU3RyaW5nIGdldElkKCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBhYmkgb2YgdGhpcyB0ZXN0IG1vZHVsZS4KLSAgICAgKi8KLSAgICBJQWJpIGdldEFiaSgpOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUge0BsaW5rIFNldH0gb2YgdG9rZW5zIGEgZGV2aWNlIG11c3QgaGF2ZSBpbiBvcmRlciB0byBydW4gdGhpcyBtb2R1bGUuCi0gICAgICovCi0gICAgU2V0PFN0cmluZz4gZ2V0VG9rZW5zKCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgSVJlbW90ZVRlc3R9IHRoYXQgcnVucyB0aGUgdGVzdHMuCi0gICAgICovCi0gICAgSVJlbW90ZVRlc3QgZ2V0VGVzdCgpOwotCi0gICAgLyoqCi0gICAgICogU2V0IGEgbGlzdCBvZiBwcmVwYXJlcnMgdG8gYWxsb3cgdG8gcnVuIGJlZm9yZSBvciBhZnRlciBhIHRlc3QuCi0gICAgICogSWYgdGhpcyBsaXN0IGlzIGVtcHR5LCB0aGVuIGFsbCBjb25maWd1cmVkIHByZXBhcmVycyB3aWxsIHJ1bi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwcmVwYXJlcldoaXRlbGlzdCBsaXN0IGNvbnRhaW5pbmcgdGhlIHNpbXBsZSBuYW1lIG9mIHRoZSBwcmVwYXJlciB0byBydW4uCi0gICAgICovCi0gICAgdm9pZCBzZXRQcmVwYXJlcldoaXRlbGlzdChTZXQ8U3RyaW5nPiBwcmVwYXJlcldoaXRlbGlzdCk7Ci0KLSAgICAvKioKLSAgICAgKiBQdXNoZXMgZHluYW1pYyBjb25maWd1cmF0aW9uLCB0aGVuIHJ1bnMgdGhlIG1vZHVsZSdzIHByZWNvbmRpdGlvbiBjaGVja3MgYW5kIHNldHVwIHRhc2tzLgotICAgICAqIEBwYXJhbSBza2lwUHJlcCB3aGV0aGVyIHByZXBhcmF0aW9uIHNob3VsZCBiZSBza2lwcGVkCi0gICAgICogQHBhcmFtIHByZWNvbmRpdGlvbkFyZ3MgYXJndW1lbnRzIHRvIHNldCBvbiBwcmVjb25kaXRpb24gcHJlcGFyZXJzIGZvciB0aGUgbW9kdWxlLCB0YWtpbmcKLSAgICAgKiBmb3JtYXQgYXJnLW5hbWU6YXJnLXZhbHVlLiBJZiAiYXJnLXZhbHVlIiBpcyB1bnNldCwgdGhlIHZhbHVlIHdpbGwgZGVmYXVsdCB0byAidHJ1ZSIuCi0gICAgICogQHJldHVybiB3aGV0aGVyIHByZXBhcmF0aW9uIHN1Y2NlZWRlZC4KLSAgICAgKi8KLSAgICBib29sZWFuIHByZXBhcmUoYm9vbGVhbiBza2lwUHJlcCwgTGlzdDxTdHJpbmc+IHByZWNvbmRpdGlvbkFyZ3MpCi0gICAgICAgICAgICB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmVzIHRoZSB7QGxpbmsgQ29uZmlndXJhdGlvbkRlc2NyaXB0b3J9IGFzc29jaWF0ZWQgd2l0aCBtb2R1bGUgY29uZmlnCi0gICAgICovCi0gICAgQ29uZmlndXJhdGlvbkRlc2NyaXB0b3IgZ2V0Q29uZmlndXJhdGlvbkRlc2NyaXB0b3IoKTsKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3Rlc3R0eXBlL0lNb2R1bGVSZXBvLmphdmEgYi9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC90ZXN0dHlwZS9JTW9kdWxlUmVwby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGMxYmJlZC4uMDAwMDAwMAotLS0gYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC90ZXN0dHlwZS9JTW9kdWxlUmVwby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRlc3R0eXBlOwotCi1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuYnVpbGQuSUJ1aWxkSW5mbzsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JQWJpOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnV0aWwuTXVsdGlNYXA7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIGFjY2Vzc2luZyB0ZXN0cyBmcm9tIHRoZSBDb21wYXRpYmlsaXR5IHJlcG9zaXRvcnkuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1vZHVsZVJlcG8gewotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgcmVwb3NpdG9yeSBoYXMgYmVlbiBpbml0aWFsaXplZC4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzSW5pdGlhbGl6ZWQoKTsKLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemVzIHRoZSByZXBvc2l0b3J5LgotICAgICAqLwotICAgIHZvaWQgaW5pdGlhbGl6ZShpbnQgc2hhcmRzLCBJbnRlZ2VyIHNoYXJkSW5kZXgsIEZpbGUgdGVzdHNEaXIsIFNldDxJQWJpPiBhYmlzLAotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGRldmljZVRva2VucywgTGlzdDxTdHJpbmc+IHRlc3RBcmdzLCBMaXN0PFN0cmluZz4gbW9kdWxlQXJncywKLSAgICAgICAgICAgIFNldDxTdHJpbmc+IG1JbmNsdWRlRmlsdGVycywgU2V0PFN0cmluZz4gbUV4Y2x1ZGVGaWx0ZXJzLAotICAgICAgICAgICAgTXVsdGlNYXA8U3RyaW5nLCBTdHJpbmc+IG1ldGFkYXRhSW5jbHVkZUZpbHRlcnMsCi0gICAgICAgICAgICBNdWx0aU1hcDxTdHJpbmcsIFN0cmluZz4gbWV0YWRhdGFFeGNsdWRlRmlsdGVycywKLSAgICAgICAgICAgIElCdWlsZEluZm8gYnVpbGRJbmZvKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gYSB7QGxpbmsgTGlua2VkTGlzdH0gb2YgYWxsIG1vZHVsZXMgdG8gcnVuIG9uIHRoZSBkZXZpY2UgcmVmZXJlbmNlZCBieSB0aGUgZ2l2ZW4KLSAgICAgKiBzZXJpYWwuCi0gICAgICovCi0gICAgTGlua2VkTGlzdDxJTW9kdWxlRGVmPiBnZXRNb2R1bGVzKFN0cmluZyBzZXJpYWwsIGludCBzaGFyZEluZGV4KTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBzaGFyZHMgdGhpcyByZXBvIGlzIGluaXRpYWxpemVkIGZvci4KLSAgICAgKi8KLSAgICBpbnQgZ2V0TnVtYmVyT2ZTaGFyZHMoKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIG1vZHVsZXMgd2hpY2ggZG8gbm90IGhhdmUgdG9rZW4gYW5kIGhhdmUgbm90IGJlZW4gYXNzaWduZWQgdG8gYSBkZXZpY2UuCi0gICAgICovCi0gICAgTGlzdDxJTW9kdWxlRGVmPiBnZXROb25Ub2tlbk1vZHVsZXMoKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIG1vZHVsZXMgd2hpY2ggaGF2ZSB0b2tlbiBhbmQgaGF2ZSBub3QgYmVlbiBhc3NpZ25lZCB0byBhIGRldmljZS4KLSAgICAgKi8KLSAgICBMaXN0PElNb2R1bGVEZWY+IGdldFRva2VuTW9kdWxlcygpOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBBbiBhcnJheSBvZiBhbGwgbW9kdWxlIGlkcyBpbiB0aGUgcmVwby4KLSAgICAgKi8KLSAgICBTdHJpbmdbXSBnZXRNb2R1bGVJZHMoKTsKLQotICAgIC8qKgotICAgICAqIENsZWFuIHVwIGFsbCBpbnRlcm5hbCByZWZlcmVuY2VzLgotICAgICAqLwotICAgIHZvaWQgdGVhckRvd24oKTsKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3Rlc3R0eXBlL0lTdWJQbGFuLmphdmEgYi9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC90ZXN0dHlwZS9JU3ViUGxhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGE0MGIyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3Rlc3R0eXBlL0lTdWJQbGFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGVzdHR5cGU7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JVGVzdEZpbHRlclJlY2VpdmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnV0aWwueG1sLkFic3RyYWN0WG1sUGFyc2VyLlBhcnNlRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIGdlbmVyYXRpbmcsIHBhcnNpbmcsIGFuZCByZXRyaWV2aW5nIHN1YnBsYW4gZGF0YS4KLSAqLwotcHVibGljIGludGVyZmFjZSBJU3ViUGxhbiBleHRlbmRzIElUZXN0RmlsdGVyUmVjZWl2ZXIgewotCi0gICAgLyoqCi0gICAgICogUGFyc2UgdGhlIHN1YnBsYW4gZGF0YSBmcm9tIGEgc3RyZWFtIG9mIFhNTCwgcG9wdWxhdGUgY29sbGVjdGlvbnMgb2YgZmlsdGVycyBpbnRlcm5hbGx5LgotICAgICAqIEBwYXJhbSB4bWxJbnB1dFN0cmVhbSB0aGUge0BsaW5rIElucHV0U3RyZWFtfSBjb250YWluaW5nIHN1YnBsYW4gWE1MCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGFyc2UoSW5wdXRTdHJlYW0geG1sSW5wdXRTdHJlYW0pIHRocm93cyBQYXJzZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlIHRoZSBzZXQgb2YgaW5jbHVkZSBmaWx0ZXJzIHByZXZpb3VzbHkgYWRkZWQgb3IgcGFyc2VkIGZyb20gWE1MLgotICAgICAqIEByZXR1cm4gYSBzZXQgb2YgaW5jbHVkZSBmaWx0ZXIgc3RyaW5ncwotICAgICAqLwotICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRJbmNsdWRlRmlsdGVycygpOwotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmUgdGhlIHNldCBvZiBleGNsdWRlIGZpbHRlcnMgcHJldmlvdXNseSBhZGRlZCBvciBwYXJzZWQgZnJvbSBYTUwuCi0gICAgICogQHJldHVybiBhIHNldCBvZiBleGNsdWRlIGZpbHRlciBzdHJpbmdzCi0gICAgICovCi0gICAgcHVibGljIFNldDxTdHJpbmc+IGdldEV4Y2x1ZGVGaWx0ZXJzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXJpYWxpemUgdGhlIGV4aXN0aW5nIGZpbHRlcnMgaW50byBhIHN0cmVhbSBvZiBYTUwsIGFuZCB3cml0ZSB0byBhbiBvdXRwdXQgc3RyZWFtLgotICAgICAqIEBwYXJhbSB4bWxPdXRwdXRTdHJlYW0gdGhlIHtAbGluayBPdXRwdXRTdHJlYW19IHRvIHJlY2VpdmUgc3VicGxhbiBYTUwKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoT3V0cHV0U3RyZWFtIHhtbE91dHB1dFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdGVzdHR5cGUvSmFySG9zdFRlc3QuamF2YSBiL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3Rlc3R0eXBlL0phckhvc3RUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMzMzOWIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdGVzdHR5cGUvSmFySG9zdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGVzdHR5cGU7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC5idWlsZC5Db21wYXRpYmlsaXR5QnVpbGRIZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuYnVpbGQuSUJ1aWxkSW5mbzsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5jb25maWcuT3B0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmNvbmZpZy5PcHRpb24uSW1wb3J0YW5jZTsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmxvZy5Mb2dVdGlsLkNMb2c7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQucmVzdWx0LklUZXN0SW52b2NhdGlvbkxpc3RlbmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnJlc3VsdC5SZXN1bHRGb3J3YXJkZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSG9zdFRlc3Q7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSVJlbW90ZVRlc3Q7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudXRpbC5TdHJlYW1VdGlsOwotCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkphckVudHJ5OwotaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRmlsZTsKLQotLyoqCi0gKiBUZXN0IHJ1bm5lciBmb3IgaG9zdC1zaWRlIEpVbml0IHRlc3RzLgotICovCi1wdWJsaWMgY2xhc3MgSmFySG9zdFRlc3QgZXh0ZW5kcyBIb3N0VGVzdCB7Ci0KLSAgICBAT3B0aW9uKG5hbWU9ImphciIsIGRlc2NyaXB0aW9uPSJUaGUgamFycyBjb250YWluaW5nIHRoZSBKVW5pdCB0ZXN0IGNsYXNzIHRvIHJ1bi4iLAotICAgICAgICAgICAgaW1wb3J0YW5jZSA9IEltcG9ydGFuY2UuSUZfVU5TRVQpCi0gICAgcHJpdmF0ZSBTZXQ8U3RyaW5nPiBtSmFycyA9IG5ldyBIYXNoU2V0PD4oKTsKLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgSG9zdFRlc3QgY3JlYXRlSG9zdFRlc3QoQ2xhc3M8Pz4gY2xhc3NPYmopIHsKLSAgICAgICAgSmFySG9zdFRlc3QgdGVzdCA9IChKYXJIb3N0VGVzdCkgc3VwZXIuY3JlYXRlSG9zdFRlc3QoY2xhc3NPYmopOwotICAgICAgICAvLyBjbGVhbiB0aGUgamFyIG9wdGlvbiBzaW5jZSB3ZSBhcmUgbG9hZGluZyBkaXJlY3RseSBmcm9tIGNsYXNzZXMgYWZ0ZXIuCi0gICAgICAgIHRlc3QubUphcnMgPSBuZXcgSGFzaFNldDw+KCk7Ci0gICAgICAgIHJldHVybiB0ZXN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHtAbGluayBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXJ9IGZyb20gdGhlIGJ1aWxkIGluZm8gcHJvdmlkZWQuCi0gICAgICovCi0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyIGNyZWF0ZUJ1aWxkSGVscGVyKElCdWlsZEluZm8gaW5mbykgewotICAgICAgICByZXR1cm4gbmV3IENvbXBhdGliaWxpdHlCdWlsZEhlbHBlcihpbmZvKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIExpc3Q8Q2xhc3M8Pz4+IGdldENsYXNzZXMoKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICB7Ci0gICAgICAgIExpc3Q8Q2xhc3M8Pz4+IGNsYXNzZXMgPSBzdXBlci5nZXRDbGFzc2VzKCk7Ci0gICAgICAgIENvbXBhdGliaWxpdHlCdWlsZEhlbHBlciBoZWxwZXIgPSBjcmVhdGVCdWlsZEhlbHBlcihnZXRCdWlsZCgpKTsKLSAgICAgICAgZm9yIChTdHJpbmcgamFyTmFtZSA6IG1KYXJzKSB7Ci0gICAgICAgICAgICBKYXJGaWxlIGphckZpbGUgPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSBoZWxwZXIuZ2V0VGVzdEZpbGUoamFyTmFtZSk7Ci0gICAgICAgICAgICAgICAgamFyRmlsZSA9IG5ldyBKYXJGaWxlKGZpbGUpOwotICAgICAgICAgICAgICAgIEVudW1lcmF0aW9uPEphckVudHJ5PiBlID0gamFyRmlsZS5lbnRyaWVzKCk7Ci0gICAgICAgICAgICAgICAgVVJMW10gdXJscyA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBVUkwoU3RyaW5nLmZvcm1hdCgiamFyOmZpbGU6JXMhLyIsIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpKQotICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgVVJMQ2xhc3NMb2FkZXIgY2wgPSBVUkxDbGFzc0xvYWRlci5uZXdJbnN0YW5jZSh1cmxzKTsKLQotICAgICAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEphckVudHJ5IGplID0gZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoamUuaXNEaXJlY3RvcnkoKSB8fCAhamUuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuY2xhc3MiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGplLmdldE5hbWUoKS5jb250YWlucygiJCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZ2V0Q2xhc3NOYW1lKGplLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGFzczw/PiBjbHMgPSBjbC5sb2FkQ2xhc3MoY2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RpZmllcnMgPSBjbHMuZ2V0TW9kaWZpZXJzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKElSZW1vdGVUZXN0LmNsYXNzLmlzQXNzaWduYWJsZUZyb20oY2xzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBUZXN0LmNsYXNzLmlzQXNzaWduYWJsZUZyb20oY2xzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBoYXNKVW5pdDRBbm5vdGF0aW9uKGNscykpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICFNb2RpZmllci5pc1N0YXRpYyhtb2RpZmllcnMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICFNb2RpZmllci5pc1ByaXZhdGUobW9kaWZpZXJzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhTW9kaWZpZXIuaXNQcm90ZWN0ZWQobW9kaWZpZXJzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhTW9kaWZpZXIuaXNJbnRlcmZhY2UobW9kaWZpZXJzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhTW9kaWZpZXIuaXNBYnN0cmFjdChtb2RpZmllcnMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3Nlcy5hZGQoY2xzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjbmZlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJDYW5ub3QgZmluZCB0ZXN0IGNsYXNzICVzIiwgY2xhc3NOYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgQ0xvZy5lKGUpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBTdHJlYW1VdGlsLmNsb3NlKGphckZpbGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjbGFzc2VzOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRDbGFzc05hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgLy8gLTYgYmVjYXVzZSBvZiAuY2xhc3MKLSAgICAgICAgcmV0dXJuIG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUubGVuZ3RoKCkgLSA2KS5yZXBsYWNlKCcvJywgJy4nKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcnVuKElUZXN0SW52b2NhdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IG51bVRlc3RzID0gY291bnRUZXN0Q2FzZXMoKTsKLSAgICAgICAgbG9uZyBzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgbGlzdGVuZXIudGVzdFJ1blN0YXJ0ZWQoZ2V0Q2xhc3MoKS5nZXROYW1lKCksIG51bVRlc3RzKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN1cGVyLnJ1bihuZXcgSG9zdFRlc3RMaXN0ZW5lcihsaXN0ZW5lcikpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgbGlzdGVuZXIudGVzdFJ1bkVuZGVkKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnRUaW1lLCBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyYXBwZXIgbGlzdGVuZXIgdGhhdCBmb3J3YXJkcyBhbGwgZXZlbnRzIGV4Y2VwdCB0ZXN0UnVuU3RhcnRlZCgpIGFuZCB0ZXN0UnVuRW5kZWQoKSB0bwotICAgICAqIHRoZSBlbWJlZGRlZCBsaXN0ZW5lci4gRWFjaCB0ZXN0IGNsYXNzIGluIHRoZSBqYXIgd2lsbCBpbnZva2UgdGhlc2UgZXZlbnRzLCB3aGljaAotICAgICAqIEhvc3RUZXN0TGlzdGVuZXIgd2l0aGhvbGRzIGZyb20gbGlzdGVuZXJzIGZvciBjb25zb2xlIGxvZ2dpbmcgYW5kIHJlc3VsdCByZXBvcnRpbmcuCi0gICAgICovCi0gICAgcHVibGljIGNsYXNzIEhvc3RUZXN0TGlzdGVuZXIgZXh0ZW5kcyBSZXN1bHRGb3J3YXJkZXIgewotCi0gICAgICAgIHB1YmxpYyBIb3N0VGVzdExpc3RlbmVyKElUZXN0SW52b2NhdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgICAgICBzdXBlcihsaXN0ZW5lcik7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICoge0Bpbmhlcml0RG9jfQotICAgICAgICAgKi8KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RSdW5TdGFydGVkKFN0cmluZyBuYW1lLCBpbnQgbnVtVGVzdHMpIHsKLSAgICAgICAgICAgIENMb2cuZCgiSG9zdFRlc3RMaXN0ZW5lci50ZXN0UnVuU3RhcnRlZCglcywgJWQpIiwgbmFtZSwgbnVtVGVzdHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgICAgICovCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0UnVuRW5kZWQobG9uZyBlbGFwc2VkVGltZSwgTWFwPFN0cmluZywgU3RyaW5nPiBtZXRyaWNzKSB7Ci0gICAgICAgICAgICBDTG9nLmQoIkhvc3RUZXN0TGlzdGVuZXIudGVzdFJ1bkVuZGVkKCVkLCAlcykiLCBlbGFwc2VkVGltZSwgbWV0cmljcy50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3Rlc3R0eXBlL01vZHVsZURlZi5qYXZhIGIvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdGVzdHR5cGUvTW9kdWxlRGVmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZGUyNjIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdGVzdHR5cGUvTW9kdWxlRGVmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRlc3R0eXBlOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQucmVzdWx0LklNb2R1bGVMaXN0ZW5lcjsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC5yZXN1bHQuTW9kdWxlTGlzdGVuZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGFyZ2V0cHJlcC5EeW5hbWljQ29uZmlnUHVzaGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRhcmdldHByZXAuUHJlY29uZGl0aW9uUHJlcGFyZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGFyZ2V0cHJlcC5Ub2tlblJlcXVpcmVtZW50OwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmJ1aWxkLklCdWlsZEluZm87Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuY29uZmlnLkNvbmZpZ3VyYXRpb25EZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmNvbmZpZy5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmNvbmZpZy5PcHRpb25TZXR0ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLkRldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuSVRlc3REZXZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQubG9nLkxvZ1V0aWwuQ0xvZzsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5yZXN1bHQuSVRlc3RJbnZvY2F0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQucmVzdWx0LlJlc3VsdEZvcndhcmRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLkJ1aWxkRXJyb3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5JVGFyZ2V0Q2xlYW5lcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLklUYXJnZXRQcmVwYXJlcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlRhcmdldFNldHVwRXJyb3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSUFiaTsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JQWJpUmVjZWl2ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSUJ1aWxkUmVjZWl2ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSURldmljZVRlc3Q7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSVJlbW90ZVRlc3Q7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSVJ1bnRpbWVIaW50UHJvdmlkZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSVRlc3RDb2xsZWN0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSVRlc3RGaWx0ZXJSZWNlaXZlcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC51dGlsLkFiaVV0aWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKLQotLyoqCi0gKiBDb250YWluZXIgZm9yIENvbXBhdGliaWxpdHkgdGVzdCBtb2R1bGUgaW5mby4KLSAqLwotcHVibGljIGNsYXNzIE1vZHVsZURlZiBpbXBsZW1lbnRzIElNb2R1bGVEZWYgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUlkOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1OYW1lOwotICAgIHByaXZhdGUgZmluYWwgSUFiaSBtQWJpOwotICAgIHByaXZhdGUgZmluYWwgU2V0PFN0cmluZz4gbVRva2VucyA9IG5ldyBIYXNoU2V0PD4oKTsKLSAgICBwcml2YXRlIElSZW1vdGVUZXN0IG1UZXN0ID0gbnVsbDsKLSAgICBwcml2YXRlIExpc3Q8SVRhcmdldFByZXBhcmVyPiBtRHluYW1pY0NvbmZpZ1ByZXBhcmVycyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgIHByaXZhdGUgTGlzdDxJVGFyZ2V0UHJlcGFyZXI+IG1QcmVjb25kaXRpb25zID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgcHJpdmF0ZSBMaXN0PElUYXJnZXRQcmVwYXJlcj4gbVByZXBhcmVycyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgIHByaXZhdGUgTGlzdDxJVGFyZ2V0Q2xlYW5lcj4gbUNsZWFuZXJzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgcHJpdmF0ZSBJQnVpbGRJbmZvIG1CdWlsZDsKLSAgICBwcml2YXRlIElUZXN0RGV2aWNlIG1EZXZpY2U7Ci0gICAgcHJpdmF0ZSBTZXQ8U3RyaW5nPiBtUHJlcGFyZXJXaGl0ZWxpc3QgPSBuZXcgSGFzaFNldDw+KCk7Ci0gICAgcHJpdmF0ZSBDb25maWd1cmF0aW9uRGVzY3JpcHRvciBtQ29uZmlndXJhdGlvbkRlc2NyaXB0b3I7Ci0KLSAgICBwdWJsaWMgTW9kdWxlRGVmKFN0cmluZyBuYW1lLCBJQWJpIGFiaSwgSVJlbW90ZVRlc3QgdGVzdCwKLSAgICAgICAgICAgIExpc3Q8SVRhcmdldFByZXBhcmVyPiBwcmVwYXJlcnMsIENvbmZpZ3VyYXRpb25EZXNjcmlwdG9yIGNvbmZpZ3VyYXRpb25EZXNjcmlwdG9yKSB7Ci0gICAgICAgIG1JZCA9IEFiaVV0aWxzLmNyZWF0ZUlkKGFiaS5nZXROYW1lKCksIG5hbWUpOwotICAgICAgICBtTmFtZSA9IG5hbWU7Ci0gICAgICAgIG1BYmkgPSBhYmk7Ci0gICAgICAgIG1UZXN0ID0gdGVzdDsKLSAgICAgICAgbUNvbmZpZ3VyYXRpb25EZXNjcmlwdG9yID0gY29uZmlndXJhdGlvbkRlc2NyaXB0b3I7Ci0gICAgICAgIGluaXRpYWxpemVQcmVwYXJlTGlzdHMocHJlcGFyZXJzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTb3J0IHByZXBhcmVycyBpbnRvIGRpZmZlcmVudCBsaXN0cyBhY2NvcmRpbmcgdG8gdGhlaXIgdHlwZXMKLSAgICAgKgotICAgICAqIEBwYXJhbSBwcmVwYXJlcnMgdGFyZ2V0IHByZXBhcmVycwotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVByZXBhcmVMaXN0cyhMaXN0PElUYXJnZXRQcmVwYXJlcj4gcHJlcGFyZXJzKQotICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIGJvb2xlYW4gaGFzQWJpUmVjZWl2ZXIgPSBmYWxzZTsKLSAgICAgICAgZm9yIChJVGFyZ2V0UHJlcGFyZXIgcHJlcGFyZXIgOiBwcmVwYXJlcnMpIHsKLSAgICAgICAgICAgIGlmIChwcmVwYXJlciBpbnN0YW5jZW9mIElBYmlSZWNlaXZlcikgewotICAgICAgICAgICAgICAgIGhhc0FiaVJlY2VpdmVyID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFNlcGFyYXRlIHByZWNvbmRpdGlvbnMgYW5kIGR5bmFtaWNjb25maWdwdXNoZXJzIGZyb20gb3RoZXIgdGFyZ2V0IHByZXBhcmVycy4KLSAgICAgICAgICAgIGlmIChwcmVwYXJlciBpbnN0YW5jZW9mIFByZWNvbmRpdGlvblByZXBhcmVyKSB7Ci0gICAgICAgICAgICAgICAgbVByZWNvbmRpdGlvbnMuYWRkKHByZXBhcmVyKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocHJlcGFyZXIgaW5zdGFuY2VvZiBEeW5hbWljQ29uZmlnUHVzaGVyKSB7Ci0gICAgICAgICAgICAgICAgbUR5bmFtaWNDb25maWdQcmVwYXJlcnMuYWRkKHByZXBhcmVyKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocHJlcGFyZXIgaW5zdGFuY2VvZiBUb2tlblJlcXVpcmVtZW50KSB7Ci0gICAgICAgICAgICAgICAgbVRva2Vucy5hZGRBbGwoKChUb2tlblJlcXVpcmVtZW50KSBwcmVwYXJlcikuZ2V0VG9rZW5zKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtUHJlcGFyZXJzLmFkZChwcmVwYXJlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocHJlcGFyZXIgaW5zdGFuY2VvZiBJVGFyZ2V0Q2xlYW5lcikgewotICAgICAgICAgICAgICAgIG1DbGVhbmVycy5hZGQoKElUYXJnZXRDbGVhbmVyKSBwcmVwYXJlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gUmV2ZXJzZSBjbGVhbmVyIG9yZGVyCi0gICAgICAgIENvbGxlY3Rpb25zLnJldmVyc2UobUNsZWFuZXJzKTsKLQotICAgICAgICBjaGVja1JlcXVpcmVkSW50ZXJmYWNlcyhoYXNBYmlSZWNlaXZlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgd2hldGhlciByZXF1aXJlZCBpbnRlcmZhY2VzIGFyZSBpbXBsZW1lbnRlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBoYXNBYmlSZWNlaXZlciB3aGV0aGVyIGF0IGxlYXNlIG9uZSBvZiB0aGUgcHJlcGFyZXJzIGlzIEFiaVJlY2VpdmVyCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja1JlcXVpcmVkSW50ZXJmYWNlcyhib29sZWFuIGhhc0FiaVJlY2VpdmVyKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgLy8gUmVxdWlyZWQgaW50ZXJmYWNlczoKLSAgICAgICAgaWYgKCFoYXNBYmlSZWNlaXZlciAmJiAhKG1UZXN0IGluc3RhbmNlb2YgSUFiaVJlY2VpdmVyKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihtVGVzdCArICJkb2VzIG5vdCBpbXBsZW1lbnQgSUFiaVJlY2VpdmVyIgotICAgICAgICAgICAgICAgICAgICArICIgLSBmb3IgbXVsdGktYWJpIHRlc3RpbmcgKDY0Yml0KSIpOwotICAgICAgICB9IGVsc2UgaWYgKCEobVRlc3QgaW5zdGFuY2VvZiBJUnVudGltZUhpbnRQcm92aWRlcikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24obVRlc3QgKyAiIGRvZXMgbm90IGltcGxlbWVudCBJUnVudGltZUhpbnRQcm92aWRlciIKLSAgICAgICAgICAgICAgICAgICAgKyAiIC0gdG8gcHJvdmlkZSBlc3RpbWF0ZXMgb2YgdGVzdCBpbnZvY2F0aW9uIHRpbWUiKTsKLSAgICAgICAgfSBlbHNlIGlmICghKG1UZXN0IGluc3RhbmNlb2YgSVRlc3RDb2xsZWN0b3IpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG1UZXN0ICsgIiBkb2VzIG5vdCBpbXBsZW1lbnQgSVRlc3RDb2xsZWN0b3IiCi0gICAgICAgICAgICAgICAgICAgICsgIiAtIGZvciB0ZXN0IGxpc3QgY29sbGVjdGlvbiIpOwotICAgICAgICB9IGVsc2UgaWYgKCEobVRlc3QgaW5zdGFuY2VvZiBJVGVzdEZpbHRlclJlY2VpdmVyKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihtVGVzdCArICIgZG9lcyBub3QgaW1wbGVtZW50IElUZXN0RmlsdGVyUmVjZWl2ZXIiCi0gICAgICAgICAgICAgICAgICAgICsgIiAtIHRvIGFsbG93IHRlc3RzIHRvIGJlIGZpbHRlcmVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIG1JZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLSAgICAgICAgcmV0dXJuIG1JZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbU5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgbVByZXBhcmVyV2hpdGVsaXN0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIFNldDxTdHJpbmc+IGdldFByZXBhcmVyV2hpdGVsaXN0KCkgewotICAgICAgICByZXR1cm4gbVByZXBhcmVyV2hpdGVsaXN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSUFiaSBnZXRBYmkoKSB7Ci0gICAgICAgIHJldHVybiBtQWJpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0VG9rZW5zKCkgewotICAgICAgICByZXR1cm4gbVRva2VuczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGxvbmcgZ2V0UnVudGltZUhpbnQoKSB7Ci0gICAgICAgIGlmIChtVGVzdCBpbnN0YW5jZW9mIElSdW50aW1lSGludFByb3ZpZGVyKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChJUnVudGltZUhpbnRQcm92aWRlcikgbVRlc3QpLmdldFJ1bnRpbWVIaW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFRpbWVVbml0Lk1JTlVURVMudG9NaWxsaXMoMSk7IC8vIERlZmF1bHQgMSBtaW51dGUuCi0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJUmVtb3RlVGVzdCBnZXRUZXN0KCkgewotICAgICAgICByZXR1cm4gbVRlc3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFByZXBhcmVyV2hpdGVsaXN0KFNldDxTdHJpbmc+IHByZXBhcmVyV2hpdGVsaXN0KSB7Ci0gICAgICAgIG1QcmVwYXJlcldoaXRlbGlzdC5hZGRBbGwocHJlcGFyZXJXaGl0ZWxpc3QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhJTW9kdWxlRGVmIG1vZHVsZURlZikgewotICAgICAgICByZXR1cm4gZ2V0TmFtZSgpLmNvbXBhcmVUbyhtb2R1bGVEZWYuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0QnVpbGQoSUJ1aWxkSW5mbyBidWlsZCkgewotICAgICAgICBtQnVpbGQgPSBidWlsZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElUZXN0RGV2aWNlIGdldERldmljZSgpIHsKLSAgICAgICAgcmV0dXJuIG1EZXZpY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldERldmljZShJVGVzdERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgbURldmljZSA9IGRldmljZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcnVuKElUZXN0SW52b2NhdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgQ0xvZy5kKCJSdW5uaW5nIG1vZHVsZSAlcyIsIHRvU3RyaW5nKCkpOwotICAgICAgICBydW5QcmVwYXJlclNldHVwcygpOwotCi0gICAgICAgIENMb2cuZCgiVGVzdDogJXMiLCBtVGVzdC5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7Ci0gICAgICAgIHByZXBhcmVUZXN0Q2xhc3MoKTsKLQotICAgICAgICBJTW9kdWxlTGlzdGVuZXIgbW9kdWxlTGlzdGVuZXIgPSBuZXcgTW9kdWxlTGlzdGVuZXIodGhpcywgbGlzdGVuZXIpOwotICAgICAgICAvLyBHdWFyYW50ZWUgZXZlbnRzIHRlc3RSdW5TdGFydGVkIGFuZCB0ZXN0UnVuRW5kZWQgaW4gY2FzZSB1bmRlcmx5aW5nIHRlc3QgcnVubmVyIGRvZXMgbm90Ci0gICAgICAgIE1vZHVsZUZpbmlzaGVyIG1vZHVsZUZpbmlzaGVyID0gbmV3IE1vZHVsZUZpbmlzaGVyKG1vZHVsZUxpc3RlbmVyKTsKLSAgICAgICAgbVRlc3QucnVuKG1vZHVsZUZpbmlzaGVyKTsKLSAgICAgICAgbW9kdWxlRmluaXNoZXIuZmluaXNoKCk7Ci0KLSAgICAgICAgLy8gVGVhciBkb3duCi0gICAgICAgIHJ1blByZXBhcmVyVGVhcmRvd25zKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUnVuIHByZXBhcmVycycgdGVhcmRvd24gZnVuY3Rpb25zLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHJ1blByZXBhcmVyVGVhcmRvd25zKCkgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGZvciAoSVRhcmdldENsZWFuZXIgY2xlYW5lciA6IG1DbGVhbmVycykgewotICAgICAgICAgICAgQ0xvZy5kKCJDbGVhbmVyOiAlcyIsIGNsZWFuZXIuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOwotICAgICAgICAgICAgY2xlYW5lci50ZWFyRG93bihtRGV2aWNlLCBtQnVpbGQsIG51bGwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUnVuIHByZXBhcmVycycgc2V0dXAgZnVuY3Rpb25zLgotICAgICAqCi0gICAgICogQHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBydW5QcmVwYXJlclNldHVwcygpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICAvLyBSdW4gRHluYW1pY0NvbmZpZ1B1c2hlciBzZXR1cCBvbmNlIG1vcmUsIGluIGNhc2UgY2xlYW5lciBoYXMgcHJldmlvdXNseQotICAgICAgICAvLyByZW1vdmVkIGR5bmFtaWMgY29uZmlnIGZpbGUgZnJvbSB0aGUgdGFyZ2V0IChzZWUgYi8zMjg3NzgwOSkKLSAgICAgICAgZm9yIChJVGFyZ2V0UHJlcGFyZXIgcHJlcGFyZXIgOiBtRHluYW1pY0NvbmZpZ1ByZXBhcmVycykgewotICAgICAgICAgICAgcnVuUHJlcGFyZXJTZXR1cChwcmVwYXJlcik7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gU2V0dXAKLSAgICAgICAgZm9yIChJVGFyZ2V0UHJlcGFyZXIgcHJlcGFyZXIgOiBtUHJlcGFyZXJzKSB7Ci0gICAgICAgICAgICBydW5QcmVwYXJlclNldHVwKHByZXBhcmVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0ZXN0IGNsYXNzZXMgYXR0cmlidXRlcyBhY2NvcmRpbmcgdG8gdGhlaXIgaW50ZXJmYWNlcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcmVwYXJlVGVzdENsYXNzKCkgewotICAgICAgICBpZiAobVRlc3QgaW5zdGFuY2VvZiBJQWJpUmVjZWl2ZXIpIHsKLSAgICAgICAgICAgICgoSUFiaVJlY2VpdmVyKSBtVGVzdCkuc2V0QWJpKG1BYmkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtVGVzdCBpbnN0YW5jZW9mIElCdWlsZFJlY2VpdmVyKSB7Ci0gICAgICAgICAgICAoKElCdWlsZFJlY2VpdmVyKSBtVGVzdCkuc2V0QnVpbGQobUJ1aWxkKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobVRlc3QgaW5zdGFuY2VvZiBJRGV2aWNlVGVzdCkgewotICAgICAgICAgICAgKChJRGV2aWNlVGVzdCkgbVRlc3QpLnNldERldmljZShtRGV2aWNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBwcmVwYXJlKGJvb2xlYW4gc2tpcFByZXAsIExpc3Q8U3RyaW5nPiBwcmVjb25kaXRpb25BcmdzKQotICAgICAgICAgICAgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGZvciAoSVRhcmdldFByZXBhcmVyIHByZXBhcmVyIDogbUR5bmFtaWNDb25maWdQcmVwYXJlcnMpIHsKLSAgICAgICAgICAgIHJ1blByZXBhcmVyU2V0dXAocHJlcGFyZXIpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoSVRhcmdldFByZXBhcmVyIHByZXBhcmVyIDogbVByZWNvbmRpdGlvbnMpIHsKLSAgICAgICAgICAgIHNldE9wdGlvbihwcmVwYXJlciwgQ29tcGF0aWJpbGl0eVRlc3QuU0tJUF9QUkVDT05ESVRJT05TX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgQm9vbGVhbi50b1N0cmluZyhza2lwUHJlcCkpOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgcHJlY29uZGl0aW9uQXJnIDogcHJlY29uZGl0aW9uQXJncykgewotICAgICAgICAgICAgICAgIHNldE9wdGlvbihwcmVwYXJlciwgQ29tcGF0aWJpbGl0eVRlc3QuUFJFQ09ORElUSU9OX0FSR19PUFRJT04sIHByZWNvbmRpdGlvbkFyZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJ1blByZXBhcmVyU2V0dXAocHJlcGFyZXIpOwotICAgICAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgQ0xvZy5lKCJQcmVjb25kaXRpb24gY2xhc3MgJXMgZmFpbGVkIiwgcHJlcGFyZXIuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcnVuUHJlcGFyZXJTZXR1cChJVGFyZ2V0UHJlcGFyZXIgcHJlcGFyZXIpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgcHJlcGFyZXJOYW1lID0gcHJlcGFyZXIuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCk7Ci0gICAgICAgIGlmICghbVByZXBhcmVyV2hpdGVsaXN0LmlzRW1wdHkoKSAmJiAhbVByZXBhcmVyV2hpdGVsaXN0LmNvbnRhaW5zKHByZXBhcmVyTmFtZSkpIHsKLSAgICAgICAgICAgIENMb2cuZCgiU2tpcHBpbmcgUHJlcGFyZXI6ICVzIHNpbmNlIGl0IGlzIG5vdCBpbiB0aGUgd2hpdGVsaXN0ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgcHJlcGFyZXJOYW1lLCBtUHJlcGFyZXJXaGl0ZWxpc3QpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIENMb2cuZCgiUHJlcGFyZXI6ICVzIiwgcHJlcGFyZXIuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOwotICAgICAgICBpZiAocHJlcGFyZXIgaW5zdGFuY2VvZiBJQWJpUmVjZWl2ZXIpIHsKLSAgICAgICAgICAgICgoSUFiaVJlY2VpdmVyKSBwcmVwYXJlcikuc2V0QWJpKG1BYmkpOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwcmVwYXJlci5zZXRVcChtRGV2aWNlLCBtQnVpbGQpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEVycm9yIGUpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIGZvciBmbGFzaGluZyBuZXcgYnVpbGQKLSAgICAgICAgICAgIENMb2cuZSgiVW5leHBlY3RlZCBCdWlsZEVycm9yIGZyb20gcHJlcGFyZXI6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgcHJlcGFyZXIuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOwotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFRhcmdldFNldHVwRXJyb3IgZSkgewotICAgICAgICAgICAgLy8gbG9nIHByZXBhcmVyIGNsYXNzIHRoZW4gcmV0aHJvdyAmIGxldCBjYWxsZXIgaGFuZGxlCi0gICAgICAgICAgICBDTG9nLmUoIlRhcmdldFNldHVwRXJyb3IgaW4gcHJlcGFyZXI6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgcHJlcGFyZXIuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOwotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0T3B0aW9uKE9iamVjdCB0YXJnZXQsIFN0cmluZyBvcHRpb24sIFN0cmluZyB2YWx1ZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgT3B0aW9uU2V0dGVyIHNldHRlciA9IG5ldyBPcHRpb25TZXR0ZXIodGFyZ2V0KTsKLSAgICAgICAgICAgIHNldHRlci5zZXRPcHRpb25WYWx1ZShvcHRpb24sIHZhbHVlKTsKLSAgICAgICAgfSBjYXRjaCAoQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBDTG9nLmUoZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0Q29sbGVjdFRlc3RzT25seShib29sZWFuIGNvbGxlY3RUZXN0c09ubHkpIHsKLSAgICAgICAgKChJVGVzdENvbGxlY3RvcikgbVRlc3QpLnNldENvbGxlY3RUZXN0c09ubHkoY29sbGVjdFRlc3RzT25seSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBSZXN1bHRGb3J3YXJkZXIgdGhhdCB0cmFja3Mgd2hldGhlciBtZXRob2QgdGVzdFJ1blN0YXJ0ZWQoKSBoYXMgYmVlbiBjYWxsZWQgZm9yIGl0cwotICAgICAqIGxpc3RlbmVyLiBJZiBub3QsIGludm9raW5nIGZpbmlzaCgpIHdpbGwgY2FsbCB0ZXN0UnVuU3RhcnRlZCB3aXRoIDAgdGVzdHMgZm9yIHRoaXMgbW9kdWxlLAotICAgICAqIGFzIHdlbGwgYXMgdGVzdFJ1bkVuZGVkIHdpdGggMCBtcyBlbGFwc2VkLgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgTW9kdWxlRmluaXNoZXIgZXh0ZW5kcyBSZXN1bHRGb3J3YXJkZXIgewotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtRmluaXNoZWQ7Ci0gICAgICAgIHByaXZhdGUgSVRlc3RJbnZvY2F0aW9uTGlzdGVuZXIgbUxpc3RlbmVyOwotCi0gICAgICAgIHB1YmxpYyBNb2R1bGVGaW5pc2hlcihJVGVzdEludm9jYXRpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICAgICAgc3VwZXIobGlzdGVuZXIpOwotICAgICAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7Ci0gICAgICAgICAgICBtRmluaXNoZWQgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICAgICAqLwotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgdGVzdFJ1blN0YXJ0ZWQoU3RyaW5nIG5hbWUsIGludCBudW1UZXN0cykgewotICAgICAgICAgICAgbUxpc3RlbmVyLnRlc3RSdW5TdGFydGVkKG5hbWUsIG51bVRlc3RzKTsKLSAgICAgICAgICAgIG1GaW5pc2hlZCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBmaW5pc2goKSB7Ci0gICAgICAgICAgICBpZiAoIW1GaW5pc2hlZCkgewotICAgICAgICAgICAgICAgIG1MaXN0ZW5lci50ZXN0UnVuU3RhcnRlZChtSWQsIDApOwotICAgICAgICAgICAgICAgIG1MaXN0ZW5lci50ZXN0UnVuRW5kZWQoMCwgQ29sbGVjdGlvbnMuZW1wdHlNYXAoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ29uZmlndXJhdGlvbkRlc2NyaXB0b3IgZ2V0Q29uZmlndXJhdGlvbkRlc2NyaXB0b3IoKSB7Ci0gICAgICAgIHJldHVybiBtQ29uZmlndXJhdGlvbkRlc2NyaXB0b3I7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdGVzdHR5cGUvTW9kdWxlUmVwby5qYXZhIGIvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdGVzdHR5cGUvTW9kdWxlUmVwby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjY3Y2M4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3Rlc3R0eXBlL01vZHVsZVJlcG8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGVzdHR5cGU7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC5idWlsZC5Db21wYXRpYmlsaXR5QnVpbGRIZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQucmVzdWx0LlRlc3RSdW5IYW5kbGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnV0aWwuTGluZWFyUGFydGl0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnV0aWwuVW5pcXVlTW9kdWxlQ291bnRVdGlsOwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuVGVzdEZpbHRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuTG9nLkxvZ0xldmVsOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmJ1aWxkLklCdWlsZEluZm87Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuY29uZmlnLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuY29uZmlnLkNvbmZpZ3VyYXRpb25GYWN0b3J5OwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmNvbmZpZy5JQ29uZmlndXJhdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5jb25maWcuSUNvbmZpZ3VyYXRpb25GYWN0b3J5OwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmxvZy5Mb2dVdGlsLkNMb2c7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSUFiaTsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JQnVpbGRSZWNlaXZlcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JUmVtb3RlVGVzdDsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JU3RyaWN0U2hhcmRhYmxlVGVzdDsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JVGVzdEZpbGVGaWx0ZXJSZWNlaXZlcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JVGVzdEZpbHRlclJlY2VpdmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnV0aWwuQWJpVXRpbHM7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudXRpbC5GaWxlVXRpbDsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC51dGlsLk11bHRpTWFwOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnV0aWwuVGltZVV0aWw7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVuYW1lRmlsdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBSZXRyaWV2ZXMgQ29tcGF0aWJpbGl0eSB0ZXN0IG1vZHVsZSBkZWZpbml0aW9ucyBmcm9tIHRoZSByZXBvc2l0b3J5LgotICovCi1wdWJsaWMgY2xhc3MgTW9kdWxlUmVwbyBpbXBsZW1lbnRzIElNb2R1bGVSZXBvIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfRVhUID0gIi5jb25maWciOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIEludGVnZXI+IEVORElOR19NT0RVTEVTID0gbmV3IEhhc2hNYXA8PigpOwotICAgIHN0YXRpYyB7Ci0gICAgICAvLyBiLzYyNzMyMjk4IHB1dCB0ZXN0RnVsbERpc2sgaW4gdGhlIGVuZCB0byBhY2NvbW1vZGF0ZSBDVFNNZWRpYVN0cmVzc1Rlc3QgdGVtcG9yYWxseQotICAgICAgRU5ESU5HX01PRFVMRVMucHV0KCJDdHNBcHBTZWN1cml0eUhvc3RUZXN0Q2FzZXMiLCAxKTsKLSAgICAgIEVORElOR19NT0RVTEVTLnB1dCgiQ3RzTW9ua2V5VGVzdENhc2VzIiwgMik7Ci0gICAgfQotICAgIC8vIFN5bmNocm9uaXphdGlvbiBvYmplY3RzIGZvciBUb2tlbiBNb2R1bGVzLgotICAgIHByaXZhdGUgaW50IG1Jbml0Q291bnQgPSAwOwotICAgIHByaXZhdGUgU2V0PElNb2R1bGVEZWY+IG1Ub2tlbk1vZHVsZVNjaGVkdWxlZDsKLSAgICBwcml2YXRlIHN0YXRpYyBPYmplY3QgbG9jayA9IG5ldyBPYmplY3QoKTsKLQotICAgIHByaXZhdGUgaW50IG1Ub3RhbFNoYXJkczsKLSAgICBwcml2YXRlIEludGVnZXIgbVNoYXJkSW5kZXg7Ci0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFNldDxTdHJpbmc+PiBtRGV2aWNlVG9rZW5zID0gbmV3IEhhc2hNYXA8PigpOwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+Pj4gbVRlc3RBcmdzID0gbmV3IEhhc2hNYXA8PigpOwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+Pj4gbU1vZHVsZUFyZ3MgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1JbmNsdWRlQWxsOwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgTGlzdDxUZXN0RmlsdGVyPj4gbUluY2x1ZGVGaWx0ZXJzID0gbmV3IEhhc2hNYXA8PigpOwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgTGlzdDxUZXN0RmlsdGVyPj4gbUV4Y2x1ZGVGaWx0ZXJzID0gbmV3IEhhc2hNYXA8PigpOwotICAgIHByaXZhdGUgSUNvbmZpZ3VyYXRpb25GYWN0b3J5IG1Db25maWdGYWN0b3J5ID0gQ29uZmlndXJhdGlvbkZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKLQotICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotICAgIC8vIEhvbGRzIGFsbCB0aGUgdGVzdHMgd2l0aCB0b2tlbnMgd2FpdGluZyB0byBiZSBydW4uIE1lYW5pbmcgdGhlIERVVCBtdXN0IGhhdmUgYSBzcGVjaWZpYyB0b2tlbi4KLSAgICBwcml2YXRlIExpc3Q8SU1vZHVsZURlZj4gbVRva2VuTW9kdWxlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgIHByaXZhdGUgTGlzdDxJTW9kdWxlRGVmPiBtTm9uVG9rZW5Nb2R1bGVzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXROdW1iZXJPZlNoYXJkcygpIHsKLSAgICAgICAgcmV0dXJuIG1Ub3RhbFNoYXJkczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZXZpY2UgdG9rZW5zIG9mIHRoaXMgbW9kdWxlIHJlcG8uIEV4cG9zZWQgZm9yIHRlc3RpbmcuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE1hcDxTdHJpbmcsIFNldDxTdHJpbmc+PiBnZXREZXZpY2VUb2tlbnMoKSB7Ci0gICAgICAgIHJldHVybiBtRGV2aWNlVG9rZW5zOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEge0BsaW5rIEZpbGVuYW1lRmlsdGVyfSB0byBmaW5kIGFsbCBtb2R1bGVzIGluIGEgZGlyZWN0b3J5IHdobyBtYXRjaCB0aGUgZ2l2ZW4gcGF0dGVybi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE5hbWVGaWx0ZXIgaW1wbGVtZW50cyBGaWxlbmFtZUZpbHRlciB7Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbVBhdHRlcm47Ci0KLSAgICAgICAgcHVibGljIE5hbWVGaWx0ZXIoU3RyaW5nIHBhdHRlcm4pIHsKLSAgICAgICAgICAgIG1QYXR0ZXJuID0gcGF0dGVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICAgICAqLwotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZGlyLCBTdHJpbmcgbmFtZSkgewotICAgICAgICAgICAgcmV0dXJuIG5hbWUuY29udGFpbnMobVBhdHRlcm4pICYmIG5hbWUuZW5kc1dpdGgoQ09ORklHX0VYVCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8SU1vZHVsZURlZj4gZ2V0Tm9uVG9rZW5Nb2R1bGVzKCkgewotICAgICAgICByZXR1cm4gbU5vblRva2VuTW9kdWxlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8SU1vZHVsZURlZj4gZ2V0VG9rZW5Nb2R1bGVzKCkgewotICAgICAgICByZXR1cm4gbVRva2VuTW9kdWxlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZ1tdIGdldE1vZHVsZUlkcygpIHsKLSAgICAgICAgU2V0PFN0cmluZz4gbW9kdWxlSWRTZXQgPSBuZXcgSGFzaFNldDw+KCk7Ci0gICAgICAgIGZvciAoSU1vZHVsZURlZiBtb2R1bGVEZWYgOiBtTm9uVG9rZW5Nb2R1bGVzKSB7Ci0gICAgICAgICAgICBtb2R1bGVJZFNldC5hZGQobW9kdWxlRGVmLmdldElkKCkpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoSU1vZHVsZURlZiBtb2R1bGVEZWYgOiBtVG9rZW5Nb2R1bGVzKSB7Ci0gICAgICAgICAgICBtb2R1bGVJZFNldC5hZGQobW9kdWxlRGVmLmdldElkKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtb2R1bGVJZFNldC50b0FycmF5KG5ldyBTdHJpbmdbbW9kdWxlSWRTZXQuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzSW5pdGlhbGl6ZWQoKSB7Ci0gICAgICAgIHJldHVybiBtSW5pdGlhbGl6ZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoaW50IHRvdGFsU2hhcmRzLCBJbnRlZ2VyIHNoYXJkSW5kZXgsIEZpbGUgdGVzdHNEaXIsIFNldDxJQWJpPiBhYmlzLAotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGRldmljZVRva2VucywgTGlzdDxTdHJpbmc+IHRlc3RBcmdzLCBMaXN0PFN0cmluZz4gbW9kdWxlQXJncywKLSAgICAgICAgICAgIFNldDxTdHJpbmc+IGluY2x1ZGVGaWx0ZXJzLCBTZXQ8U3RyaW5nPiBleGNsdWRlRmlsdGVycywKLSAgICAgICAgICAgIE11bHRpTWFwPFN0cmluZywgU3RyaW5nPiBtZXRhZGF0YUluY2x1ZGVGaWx0ZXJzLAotICAgICAgICAgICAgTXVsdGlNYXA8U3RyaW5nLCBTdHJpbmc+IG1ldGFkYXRhRXhjbHVkZUZpbHRlcnMsCi0gICAgICAgICAgICBJQnVpbGRJbmZvIGJ1aWxkSW5mbykgewotICAgICAgICBDTG9nLmQoIkluaXRpYWxpemluZyBNb2R1bGVSZXBvXG5TaGFyZHM6JWRcblRlc3RzIERpcjolc1xuQUJJczolc1xuRGV2aWNlIFRva2Vuczolc1xuIiArCi0gICAgICAgICAgICAgICAgIlRlc3QgQXJnczolc1xuTW9kdWxlIEFyZ3M6JXNcbkluY2x1ZGVzOiVzXG5FeGNsdWRlczolcyIsCi0gICAgICAgICAgICAgICAgdG90YWxTaGFyZHMsIHRlc3RzRGlyLmdldEFic29sdXRlUGF0aCgpLCBhYmlzLCBkZXZpY2VUb2tlbnMsIHRlc3RBcmdzLCBtb2R1bGVBcmdzLAotICAgICAgICAgICAgICAgIGluY2x1ZGVGaWx0ZXJzLCBleGNsdWRlRmlsdGVycyk7Ci0gICAgICAgIG1Jbml0aWFsaXplZCA9IHRydWU7Ci0gICAgICAgIG1Ub3RhbFNoYXJkcyA9IHRvdGFsU2hhcmRzOwotICAgICAgICBtU2hhcmRJbmRleCA9IHNoYXJkSW5kZXg7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobG9jaykgewotICAgICAgICAgICAgaWYgKG1Ub2tlbk1vZHVsZVNjaGVkdWxlZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVRva2VuTW9kdWxlU2NoZWR1bGVkID0gbmV3IEhhc2hTZXQ8PigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChTdHJpbmcgbGluZSA6IGRldmljZVRva2VucykgewotICAgICAgICAgICAgU3RyaW5nW10gcGFydHMgPSBsaW5lLnNwbGl0KCI6Iik7Ci0gICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoID09IDIpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gcGFydHNbMF07Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gcGFydHNbMV07Ci0gICAgICAgICAgICAgICAgU2V0PFN0cmluZz4gbGlzdCA9IG1EZXZpY2VUb2tlbnMuZ2V0KGtleSk7Ci0gICAgICAgICAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBsaXN0ID0gbmV3IEhhc2hTZXQ8PigpOwotICAgICAgICAgICAgICAgICAgICBtRGV2aWNlVG9rZW5zLnB1dChrZXksIGxpc3QpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsaXN0LmFkZCh2YWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJDb3VsZCBub3QgcGFyc2UgZGV2aWNlIHRva2VuOiAlcyIsIGxpbmUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwdXRBcmdzKHRlc3RBcmdzLCBtVGVzdEFyZ3MpOwotICAgICAgICBwdXRBcmdzKG1vZHVsZUFyZ3MsIG1Nb2R1bGVBcmdzKTsKLSAgICAgICAgbUluY2x1ZGVBbGwgPSBpbmNsdWRlRmlsdGVycy5pc0VtcHR5KCk7Ci0gICAgICAgIC8vIEluY2x1ZGUgYWxsIHRoZSBpbmNsdXNpb25zCi0gICAgICAgIGFkZEZpbHRlcnMoaW5jbHVkZUZpbHRlcnMsIG1JbmNsdWRlRmlsdGVycywgYWJpcyk7Ci0gICAgICAgIC8vIEV4Y2x1ZGUgYWxsIHRoZSBleGNsdXNpb25zCi0gICAgICAgIGFkZEZpbHRlcnMoZXhjbHVkZUZpbHRlcnMsIG1FeGNsdWRlRmlsdGVycywgYWJpcyk7Ci0KLSAgICAgICAgRmlsZVtdIGNvbmZpZ0ZpbGVzID0gdGVzdHNEaXIubGlzdEZpbGVzKG5ldyBDb25maWdGaWx0ZXIoKSk7Ci0gICAgICAgIGlmIChjb25maWdGaWxlcy5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiTm8gY29uZmlnIGZpbGVzIGZvdW5kIGluICVzIiwgdGVzdHNEaXIuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKLSAgICAgICAgfQotICAgICAgICBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBzaGFyZGVkVGVzdENvdW50cyA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgZm9yIChGaWxlIGNvbmZpZ0ZpbGUgOiBjb25maWdGaWxlcykgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSBjb25maWdGaWxlLmdldE5hbWUoKS5yZXBsYWNlKENPTkZJR19FWFQsICIiKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIHBhdGhBcmcgPSBuZXcgU3RyaW5nW10geyBjb25maWdGaWxlLmdldEFic29sdXRlUGF0aCgpIH07Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIEludm9rZXMgcGFyc2VyIHRvIHByb2Nlc3MgdGhlIHRlc3QgbW9kdWxlIGNvbmZpZyBmaWxlCi0gICAgICAgICAgICAgICAgLy8gTmVlZCB0byBnZW5lcmF0ZSBhIGRpZmZlcmVudCBjb25maWcgZm9yIGVhY2ggQUJJIGFzIHdlIGNhbm5vdCBndWFyYW50ZWUgdGhlCi0gICAgICAgICAgICAgICAgLy8gY29uZmlncyBhcmUgaWRlbXBvdGVudC4gVGhpcyBob3dldmVyIG1lYW5zIHdlIHBhcnNlIHRoZSBzYW1lIGZpbGUgbXVsdGlwbGUgdGltZXMKLSAgICAgICAgICAgICAgICBmb3IgKElBYmkgYWJpIDogYWJpcykgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaWQgPSBBYmlVdGlscy5jcmVhdGVJZChhYmkuZ2V0TmFtZSgpLCBuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFzaG91bGRSdW5Nb2R1bGUoaWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbW9kdWxlIHNob3VsZCBub3QgcnVuIHRlc3RzIGJhc2VkIG9uIHRoZSBzdGF0ZSBvZiBmaWx0ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2tpcCB0aGlzIG5hbWUvYWJpIGNvbWJpbmF0aW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBJQ29uZmlndXJhdGlvbiBjb25maWcgPSBtQ29uZmlnRmFjdG9yeS5jcmVhdGVDb25maWd1cmF0aW9uRnJvbUFyZ3MocGF0aEFyZyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZmlsdGVyQnlDb25maWdNZXRhZGF0YShjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFJbmNsdWRlRmlsdGVycywgbWV0YWRhdGFFeGNsdWRlRmlsdGVycykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBtb2R1bGUgY29uZmlnIGRpZCBub3QgcGFzcyB0aGUgbWV0YWRhdGEgZmlsdGVycywgaXQncyBleGNsdWRlZAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSBleGVjdXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gYXJncyA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1Nb2R1bGVBcmdzLmNvbnRhaW5zS2V5KG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcmdzLnB1dEFsbChtTW9kdWxlQXJncy5nZXQobmFtZSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtTW9kdWxlQXJncy5jb250YWluc0tleShpZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MucHV0QWxsKG1Nb2R1bGVBcmdzLmdldChpZCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGluamVjdE9wdGlvbnNUb0NvbmZpZyhhcmdzLCBjb25maWcpOwotCi0gICAgICAgICAgICAgICAgICAgIExpc3Q8SVJlbW90ZVRlc3Q+IHRlc3RzID0gY29uZmlnLmdldFRlc3RzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoSVJlbW90ZVRlc3QgdGVzdCA6IHRlc3RzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVwYXJlVGVzdENsYXNzKG5hbWUsIGFiaSwgY29uZmlnLCB0ZXN0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBMaXN0PElSZW1vdGVUZXN0PiBzaGFyZGVkVGVzdHMgPSB0ZXN0czsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1Ub3RhbFNoYXJkcyA+IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZGVkVGVzdHMgPSBzcGxpdFNoYXJkYWJsZVRlc3RzKHRlc3RzLCBidWlsZEluZm8pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzaGFyZGVkVGVzdHMuc2l6ZSgpID4gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmRlZFRlc3RDb3VudHMucHV0KGlkLCBzaGFyZGVkVGVzdHMuc2l6ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmb3IgKElSZW1vdGVUZXN0IHRlc3QgOiBzaGFyZGVkVGVzdHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZE1vZHVsZURlZihuYW1lLCBhYmksIHRlc3QsIHBhdGhBcmcpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiZXJyb3IgcGFyc2luZyBjb25maWcgZmlsZTogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnRmlsZS5nZXROYW1lKCkpLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtRXhjbHVkZUZpbHRlcnMuY2xlYXIoKTsKLSAgICAgICAgVGVzdFJ1bkhhbmRsZXIuc2V0VGVzdFJ1bnMobmV3IENvbXBhdGliaWxpdHlCdWlsZEhlbHBlcihidWlsZEluZm8pLCBzaGFyZGVkVGVzdENvdW50cyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJlcGFyZSB0byBydW4gdGVzdCBjbGFzc2VzLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgbW9kdWxlIG5hbWUKLSAgICAgKiBAcGFyYW0gYWJpIElBYmkgb2JqZWN0IHRoYXQgY29udGFpbnMgYWJpIGluZm9ybWF0aW9uCi0gICAgICogQHBhcmFtIGNvbmZpZyBJQ29uZmlndXJhdGlvbiBvYmplY3QgY3JlYXRlZCBmcm9tIGNvbmZpZyBmaWxlCi0gICAgICogQHBhcmFtIHRlc3QgdGVzdCBjbGFzcwotICAgICAqIEB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHByZXBhcmVUZXN0Q2xhc3MoZmluYWwgU3RyaW5nIG5hbWUsIElBYmkgYWJpLCBJQ29uZmlndXJhdGlvbiBjb25maWcsCi0gICAgICAgICAgICBJUmVtb3RlVGVzdCB0ZXN0KSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSB0ZXN0LmdldENsYXNzKCkuZ2V0TmFtZSgpOwotICAgICAgICBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IHRlc3RBcmdzTWFwID0gbmV3IEhhc2hNYXA8PigpOwotICAgICAgICBpZiAobVRlc3RBcmdzLmNvbnRhaW5zS2V5KGNsYXNzTmFtZSkpIHsKLSAgICAgICAgICAgIHRlc3RBcmdzTWFwLnB1dEFsbChtVGVzdEFyZ3MuZ2V0KGNsYXNzTmFtZSkpOwotICAgICAgICB9Ci0gICAgICAgIGluamVjdE9wdGlvbnNUb0NvbmZpZyh0ZXN0QXJnc01hcCwgY29uZmlnKTsKLSAgICAgICAgYWRkRmlsdGVyc1RvVGVzdCh0ZXN0LCBhYmksIG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhlbHBlciB0byBpbmplY3Qgb3B0aW9ucyB0byBhIGNvbmZpZy4KLSAgICAgKi8KLSAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICB2b2lkIGluamVjdE9wdGlvbnNUb0NvbmZpZyhNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IG9wdGlvbk1hcCwgSUNvbmZpZ3VyYXRpb24gY29uZmlnKQotICAgICAgICAgICAgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb257Ci0gICAgICAgIGZvciAoRW50cnk8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGVudHJ5IDogb3B0aW9uTWFwLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGVudHJ5VmFsdWUgOiBlbnRyeS5nZXRWYWx1ZSgpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGVudHJ5TmFtZSA9IGVudHJ5LmdldEtleSgpOwotICAgICAgICAgICAgICAgIGlmIChlbnRyeVZhbHVlLmNvbnRhaW5zKCI6PSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGVudHJ5VmFsdWUgaXMga2V5LXZhbHVlIHBhaXIKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IGVudHJ5VmFsdWUuc3Vic3RyaW5nKDAsIGVudHJ5VmFsdWUuaW5kZXhPZigiOj0iKSk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGVudHJ5VmFsdWUuc3Vic3RyaW5nKGVudHJ5VmFsdWUuaW5kZXhPZigiOj0iKSArIDIpOwotICAgICAgICAgICAgICAgICAgICBjb25maWcuaW5qZWN0T3B0aW9uVmFsdWUoZW50cnlOYW1lLCBrZXksIHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBlbnRyeVZhbHVlIGlzIGp1c3QgdGhlIGFyZ3VtZW50IHZhbHVlCi0gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5pbmplY3RPcHRpb25WYWx1ZShlbnRyeU5hbWUsIGVudHJ5VmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgTGlzdDxJUmVtb3RlVGVzdD4gc3BsaXRTaGFyZGFibGVUZXN0cyhMaXN0PElSZW1vdGVUZXN0PiB0ZXN0cywgSUJ1aWxkSW5mbyBidWlsZEluZm8pIHsKLSAgICAgICAgQXJyYXlMaXN0PElSZW1vdGVUZXN0PiBzaGFyZGVkTGlzdCA9IG5ldyBBcnJheUxpc3Q8Pih0ZXN0cy5zaXplKCkpOwotICAgICAgICBmb3IgKElSZW1vdGVUZXN0IHRlc3QgOiB0ZXN0cykgewotICAgICAgICAgICAgaWYgKHRlc3QgaW5zdGFuY2VvZiBJQnVpbGRSZWNlaXZlcikgewotICAgICAgICAgICAgICAgICgoSUJ1aWxkUmVjZWl2ZXIpdGVzdCkuc2V0QnVpbGQoYnVpbGRJbmZvKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtU2hhcmRJbmRleCAhPSBudWxsICYmIHRlc3QgaW5zdGFuY2VvZiBJU3RyaWN0U2hhcmRhYmxlVGVzdCkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVRvdGFsU2hhcmRzOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgc2hhcmRlZExpc3QuYWRkKCgoSVN0cmljdFNoYXJkYWJsZVRlc3QpdGVzdCkuZ2V0VGVzdFNoYXJkKG1Ub3RhbFNoYXJkcywgaSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2hhcmRlZExpc3QuYWRkKHRlc3QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzaGFyZGVkTGlzdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkRmlsdGVycyhTZXQ8U3RyaW5nPiBzdHJpbmdGaWx0ZXJzLAotICAgICAgICAgICAgTWFwPFN0cmluZywgTGlzdDxUZXN0RmlsdGVyPj4gZmlsdGVycywgU2V0PElBYmk+IGFiaXMpIHsKLSAgICAgICAgZm9yIChTdHJpbmcgZmlsdGVyU3RyaW5nIDogc3RyaW5nRmlsdGVycykgewotICAgICAgICAgICAgVGVzdEZpbHRlciBmaWx0ZXIgPSBUZXN0RmlsdGVyLmNyZWF0ZUZyb20oZmlsdGVyU3RyaW5nKTsKLSAgICAgICAgICAgIFN0cmluZyBhYmkgPSBmaWx0ZXIuZ2V0QWJpKCk7Ci0gICAgICAgICAgICBpZiAoYWJpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKElBYmkgYSA6IGFiaXMpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkRmlsdGVyKGEuZ2V0TmFtZSgpLCBmaWx0ZXIsIGZpbHRlcnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYWRkRmlsdGVyKGFiaSwgZmlsdGVyLCBmaWx0ZXJzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRGaWx0ZXIoU3RyaW5nIGFiaSwgVGVzdEZpbHRlciBmaWx0ZXIsCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBMaXN0PFRlc3RGaWx0ZXI+PiBmaWx0ZXJzKSB7Ci0gICAgICAgIGdldEZpbHRlcihmaWx0ZXJzLCBBYmlVdGlscy5jcmVhdGVJZChhYmksIGZpbHRlci5nZXROYW1lKCkpKS5hZGQoZmlsdGVyKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIExpc3Q8VGVzdEZpbHRlcj4gZ2V0RmlsdGVyKE1hcDxTdHJpbmcsIExpc3Q8VGVzdEZpbHRlcj4+IGZpbHRlcnMsIFN0cmluZyBpZCkgewotICAgICAgICBMaXN0PFRlc3RGaWx0ZXI+IGZzID0gZmlsdGVycy5nZXQoaWQpOwotICAgICAgICBpZiAoZnMgPT0gbnVsbCkgewotICAgICAgICAgICAgZnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgIGZpbHRlcnMucHV0KGlkLCBmcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZzOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFkZE1vZHVsZURlZihTdHJpbmcgbmFtZSwgSUFiaSBhYmksIElSZW1vdGVUZXN0IHRlc3QsIFN0cmluZ1tdIGNvbmZpZ1BhdGhzKQotICAgICAgICAgICAgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgICAgICAvLyBJbnZva2VzIHBhcnNlciB0byBwcm9jZXNzIHRoZSB0ZXN0IG1vZHVsZSBjb25maWcgZmlsZQotICAgICAgICBJQ29uZmlndXJhdGlvbiBjb25maWcgPSBtQ29uZmlnRmFjdG9yeS5jcmVhdGVDb25maWd1cmF0aW9uRnJvbUFyZ3MoY29uZmlnUGF0aHMpOwotICAgICAgICBhZGRNb2R1bGVEZWYobmV3IE1vZHVsZURlZihuYW1lLCBhYmksIHRlc3QsIGNvbmZpZy5nZXRUYXJnZXRQcmVwYXJlcnMoKSwKLSAgICAgICAgICAgICAgICBjb25maWcuZ2V0Q29uZmlndXJhdGlvbkRlc2NyaXB0aW9uKCkpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRNb2R1bGVEZWYoSU1vZHVsZURlZiBtb2R1bGVEZWYpIHsKLSAgICAgICAgU2V0PFN0cmluZz4gdG9rZW5zID0gbW9kdWxlRGVmLmdldFRva2VucygpOwotICAgICAgICBpZiAodG9rZW5zICE9IG51bGwgJiYgIXRva2Vucy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIG1Ub2tlbk1vZHVsZXMuYWRkKG1vZHVsZURlZik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtTm9uVG9rZW5Nb2R1bGVzLmFkZChtb2R1bGVEZWYpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZEZpbHRlcnNUb1Rlc3QoSVJlbW90ZVRlc3QgdGVzdCwgSUFiaSBhYmksIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIFN0cmluZyBtb2R1bGVJZCA9IEFiaVV0aWxzLmNyZWF0ZUlkKGFiaS5nZXROYW1lKCksIG5hbWUpOwotICAgICAgICBpZiAoISh0ZXN0IGluc3RhbmNlb2YgSVRlc3RGaWx0ZXJSZWNlaXZlcikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgIlRlc3QgaW4gbW9kdWxlICVzIG11c3QgaW1wbGVtZW50IElUZXN0RmlsdGVyUmVjZWl2ZXIuIiwgbW9kdWxlSWQpKTsKLSAgICAgICAgfQotICAgICAgICBMaXN0PFRlc3RGaWx0ZXI+IG1kSW5jbHVkZXMgPSBnZXRGaWx0ZXIobUluY2x1ZGVGaWx0ZXJzLCBtb2R1bGVJZCk7Ci0gICAgICAgIExpc3Q8VGVzdEZpbHRlcj4gbWRFeGNsdWRlcyA9IGdldEZpbHRlcihtRXhjbHVkZUZpbHRlcnMsIG1vZHVsZUlkKTsKLSAgICAgICAgaWYgKCFtZEluY2x1ZGVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgYWRkVGVzdEluY2x1ZGVzKChJVGVzdEZpbHRlclJlY2VpdmVyKSB0ZXN0LCBtZEluY2x1ZGVzLCBuYW1lKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIW1kRXhjbHVkZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBhZGRUZXN0RXhjbHVkZXMoKElUZXN0RmlsdGVyUmVjZWl2ZXIpIHRlc3QsIG1kRXhjbHVkZXMsIG5hbWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZmlsdGVyQnlDb25maWdNZXRhZGF0YShJQ29uZmlndXJhdGlvbiBjb25maWcsCi0gICAgICAgICAgICBNdWx0aU1hcDxTdHJpbmcsIFN0cmluZz4gaW5jbHVkZSwgTXVsdGlNYXA8U3RyaW5nLCBTdHJpbmc+IGV4Y2x1ZGUpIHsKLSAgICAgICAgTXVsdGlNYXA8U3RyaW5nLCBTdHJpbmc+IG1ldGFkYXRhID0gY29uZmlnLmdldENvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbigpLmdldEFsbE1ldGFEYXRhKCk7Ci0gICAgICAgIGJvb2xlYW4gc2hvdWxkSW5jbHVkZSA9IGZhbHNlOwotICAgICAgICBmb3IgKFN0cmluZyBrZXkgOiBpbmNsdWRlLmtleVNldCgpKSB7Ci0gICAgICAgICAgICBTZXQ8U3RyaW5nPiBmaWx0ZXJzID0gbmV3IEhhc2hTZXQ8PihpbmNsdWRlLmdldChrZXkpKTsKLSAgICAgICAgICAgIGlmIChtZXRhZGF0YS5jb250YWluc0tleShrZXkpKSB7Ci0gICAgICAgICAgICAgICAgZmlsdGVycy5yZXRhaW5BbGwobWV0YWRhdGEuZ2V0KGtleSkpOwotICAgICAgICAgICAgICAgIGlmICghZmlsdGVycy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaW5jbHVzaW9uIGZpbHRlciBpcyBub3QgZW1wdHkgYW5kIHRoZXJlJ3MgYXQgbGVhc3Qgb25lIG1hdGNoaW5nIGluY2x1c2lvbgotICAgICAgICAgICAgICAgICAgICAvLyBydWxlIHNvIHRoZXJlJ3Mgbm8gbmVlZCB0byBtYXRjaCBvdGhlciBpbmNsdXNpb24gcnVsZXMKLSAgICAgICAgICAgICAgICAgICAgc2hvdWxkSW5jbHVkZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoIWluY2x1ZGUuaXNFbXB0eSgpICYmICFzaG91bGRJbmNsdWRlKSB7Ci0gICAgICAgICAgICAvLyBpZiBpbmNsdXNpb24gZmlsdGVyIGlzIG5vdCBlbXB0eSBhbmQgd2UgZGlkbid0IGZpbmQgYSBtYXRjaCwgdGhlIG1vZHVsZSB3aWxsIG5vdCBiZQotICAgICAgICAgICAgLy8gaW5jbHVkZWQKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAvLyBOb3cgZXZhbHVhdGUgZXhjbHVzaW9uIHJ1bGVzLCB0aGlzIG9yZGVyaW5nIGFsc28gbWVhbnMgdGhhdCBleGNsdXNpb24gcnVsZXMgbWF5IG92ZXJyaWRlCi0gICAgICAgIC8vIGluY2x1c2lvbiBydWxlczogYSBjb25maWcgYWxyZWFkeSBtYXRjaGVkIGZvciBpbmNsdXNpb24gbWF5IHN0aWxsIGJlIGV4Y2x1ZGVkIGlmIG1hdGNoaW5nCi0gICAgICAgIC8vIHJ1bGVzIGV4aXN0Ci0gICAgICAgIGZvciAoU3RyaW5nIGtleSA6IGV4Y2x1ZGUua2V5U2V0KCkpIHsKLSAgICAgICAgICAgIFNldDxTdHJpbmc+IGZpbHRlcnMgPSBuZXcgSGFzaFNldDw+KGV4Y2x1ZGUuZ2V0KGtleSkpOwotICAgICAgICAgICAgaWYgKG1ldGFkYXRhLmNvbnRhaW5zS2V5KGtleSkpIHsKLSAgICAgICAgICAgICAgICBmaWx0ZXJzLnJldGFpbkFsbChtZXRhZGF0YS5nZXQoa2V5KSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFmaWx0ZXJzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyB3ZSBmb3VuZCBhdCBsZWFzdCBvbmUgbWF0Y2hpbmcgZXhjbHVzaW9uIHJ1bGVzLCBzbyB3ZSBhcmUgZXhjbHVkaW5nIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBtb2R1bGUKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyB3ZSd2ZSBtYXRjaGVkIGF0IGxlYXN0IG9uZSBpbmNsdXNpb24gcnVsZSAoaWYgdGhlcmUncyBhbnkpIEFORCB3ZSBkaWRuJ3QgbWF0Y2ggYW55IG9mIHRoZQotICAgICAgICAvLyBleGNsdXNpb24gcnVsZXMgKGlmIHRoZXJlJ3MgYW55KQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gc2hvdWxkUnVuTW9kdWxlKFN0cmluZyBtb2R1bGVJZCkgewotICAgICAgICBMaXN0PFRlc3RGaWx0ZXI+IG1kSW5jbHVkZXMgPSBnZXRGaWx0ZXIobUluY2x1ZGVGaWx0ZXJzLCBtb2R1bGVJZCk7Ci0gICAgICAgIExpc3Q8VGVzdEZpbHRlcj4gbWRFeGNsdWRlcyA9IGdldEZpbHRlcihtRXhjbHVkZUZpbHRlcnMsIG1vZHVsZUlkKTsKLSAgICAgICAgLy8gaWYgaW5jbHVkaW5nIGFsbCBtb2R1bGVzIG9yIGluY2x1ZGVzIGV4aXN0IGZvciB0aGlzIG1vZHVsZSwgYW5kIHRoZXJlIGFyZSBub3QgZXhjbHVkZXMKLSAgICAgICAgLy8gZm9yIHRoZSBlbnRpcmUgbW9kdWxlLCB0aGlzIG1vZHVsZSBzaG91bGQgYmUgcnVuLgotICAgICAgICByZXR1cm4gKG1JbmNsdWRlQWxsIHx8ICFtZEluY2x1ZGVzLmlzRW1wdHkoKSkgJiYgIWNvbnRhaW5zTW9kdWxlRXhjbHVkZShtZEV4Y2x1ZGVzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkVGVzdEluY2x1ZGVzKElUZXN0RmlsdGVyUmVjZWl2ZXIgdGVzdCwgTGlzdDxUZXN0RmlsdGVyPiBpbmNsdWRlcywKLSAgICAgICAgICAgIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGlmICh0ZXN0IGluc3RhbmNlb2YgSVRlc3RGaWxlRmlsdGVyUmVjZWl2ZXIpIHsKLSAgICAgICAgICAgIEZpbGUgaW5jbHVkZUZpbGUgPSBjcmVhdGVGaWx0ZXJGaWxlKG5hbWUsICIuaW5jbHVkZSIsIGluY2x1ZGVzKTsKLSAgICAgICAgICAgICgoSVRlc3RGaWxlRmlsdGVyUmVjZWl2ZXIpdGVzdCkuc2V0SW5jbHVkZVRlc3RGaWxlKGluY2x1ZGVGaWxlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGFkZCB0ZXN0IGluY2x1ZGVzIG9uZSBhdCBhIHRpbWUKLSAgICAgICAgICAgIGZvciAoVGVzdEZpbHRlciBpbmNsdWRlIDogaW5jbHVkZXMpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZmlsdGVyVGVzdE5hbWUgPSBpbmNsdWRlLmdldFRlc3QoKTsKLSAgICAgICAgICAgICAgICBpZiAoZmlsdGVyVGVzdE5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0ZXN0LmFkZEluY2x1ZGVGaWx0ZXIoZmlsdGVyVGVzdE5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRUZXN0RXhjbHVkZXMoSVRlc3RGaWx0ZXJSZWNlaXZlciB0ZXN0LCBMaXN0PFRlc3RGaWx0ZXI+IGV4Y2x1ZGVzLAotICAgICAgICAgICAgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgaWYgKHRlc3QgaW5zdGFuY2VvZiBJVGVzdEZpbGVGaWx0ZXJSZWNlaXZlcikgewotICAgICAgICAgICAgRmlsZSBleGNsdWRlRmlsZSA9IGNyZWF0ZUZpbHRlckZpbGUobmFtZSwgIi5leGNsdWRlIiwgZXhjbHVkZXMpOwotICAgICAgICAgICAgKChJVGVzdEZpbGVGaWx0ZXJSZWNlaXZlcil0ZXN0KS5zZXRFeGNsdWRlVGVzdEZpbGUoZXhjbHVkZUZpbGUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gYWRkIHRlc3QgZXhjbHVkZXMgb25lIGF0IGEgdGltZQotICAgICAgICAgICAgZm9yIChUZXN0RmlsdGVyIGV4Y2x1ZGUgOiBleGNsdWRlcykgewotICAgICAgICAgICAgICAgIHRlc3QuYWRkRXhjbHVkZUZpbHRlcihleGNsdWRlLmdldFRlc3QoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIEZpbGUgY3JlYXRlRmlsdGVyRmlsZShTdHJpbmcgcHJlZml4LCBTdHJpbmcgc3VmZml4LCBMaXN0PFRlc3RGaWx0ZXI+IGZpbHRlcnMpIHsKLSAgICAgICAgRmlsZSBmaWx0ZXJGaWxlID0gbnVsbDsKLSAgICAgICAgUHJpbnRXcml0ZXIgb3V0ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpbHRlckZpbGUgPSBGaWxlVXRpbC5jcmVhdGVUZW1wRmlsZShwcmVmaXgsIHN1ZmZpeCk7Ci0gICAgICAgICAgICBvdXQgPSBuZXcgUHJpbnRXcml0ZXIoZmlsdGVyRmlsZSk7Ci0gICAgICAgICAgICBmb3IgKFRlc3RGaWx0ZXIgZmlsdGVyIDogZmlsdGVycykgewotICAgICAgICAgICAgICAgIFN0cmluZyBmaWx0ZXJUZXN0ID0gZmlsdGVyLmdldFRlc3QoKTsKLSAgICAgICAgICAgICAgICBpZiAoZmlsdGVyVGVzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGZpbHRlclRlc3QpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG91dC5mbHVzaCgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRmFpbGVkIHRvIGNyZWF0ZSBmaWx0ZXIgZmlsZSIpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKG91dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmlsdGVyRmlsZS5kZWxldGVPbkV4aXQoKTsKLSAgICAgICAgcmV0dXJuIGZpbHRlckZpbGU7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBSZXR1cm5zIHRydWUgaWZmIG9uZSBvciBtb3JlIHRlc3QgZmlsdGVycyBpbiBleGNsdWRlcyBhcHBseSB0byB0aGUgZW50aXJlIG1vZHVsZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gY29udGFpbnNNb2R1bGVFeGNsdWRlKENvbGxlY3Rpb248VGVzdEZpbHRlcj4gZXhjbHVkZXMpIHsKLSAgICAgICAgZm9yIChUZXN0RmlsdGVyIGV4Y2x1ZGUgOiBleGNsdWRlcykgewotICAgICAgICAgICAgaWYgKGV4Y2x1ZGUuZ2V0VGVzdCgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSB7QGxpbmsgRmlsZW5hbWVGaWx0ZXJ9IHRvIGZpbmQgYWxsIHRoZSBjb25maWcgZmlsZXMgaW4gYSBkaXJlY3RvcnkuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb25maWdGaWx0ZXIgaW1wbGVtZW50cyBGaWxlbmFtZUZpbHRlciB7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgICAgICovCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBkaXIsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgICAgICBDTG9nLmQoIiVzLyVzIiwgZGlyLmdldEFic29sdXRlUGF0aCgpLCBuYW1lKTsKLSAgICAgICAgICAgIHJldHVybiBuYW1lLmVuZHNXaXRoKENPTkZJR19FWFQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMaW5rZWRMaXN0PElNb2R1bGVEZWY+IGdldE1vZHVsZXMoU3RyaW5nIHNlcmlhbCwgaW50IHNoYXJkSW5kZXgpIHsKLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydChtTm9uVG9rZW5Nb2R1bGVzLCBuZXcgRXhlY3V0aW9uT3JkZXJDb21wYXJhdG9yKCkpOwotICAgICAgICBMaXN0PElNb2R1bGVEZWY+IG1vZHVsZXMgPSBnZXRTaGFyZChtTm9uVG9rZW5Nb2R1bGVzLCBzaGFyZEluZGV4LCBtVG90YWxTaGFyZHMpOwotICAgICAgICBpZiAobW9kdWxlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtb2R1bGVzID0gbmV3IExpbmtlZExpc3Q8SU1vZHVsZURlZj4oKTsKLSAgICAgICAgfQotICAgICAgICBsb25nIGVzdGltYXRlZFRpbWUgPSAwOwotICAgICAgICBmb3IgKElNb2R1bGVEZWYgZGVmIDogbW9kdWxlcykgewotICAgICAgICAgICAgZXN0aW1hdGVkVGltZSArPSBkZWYuZ2V0UnVudGltZUhpbnQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEZJWE1FOiBUb2tlbiBNb2R1bGVzIGFyZSB0aGUgb25seSBsYXN0IHBhcnQgdGhhdCBpcyBub3QgZGV0ZXJtaW5pc3RpYy4KLSAgICAgICAgc3luY2hyb25pemVkIChsb2NrKSB7Ci0gICAgICAgICAgICAvLyBHZXQgdG9rZW5zIGZyb20gdGhlIGRldmljZQotICAgICAgICAgICAgU2V0PFN0cmluZz4gdG9rZW5zID0gbURldmljZVRva2Vucy5nZXQoc2VyaWFsKTsKLSAgICAgICAgICAgIGlmICh0b2tlbnMgIT0gbnVsbCAmJiAhdG9rZW5zLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIC8vIGlmIGl0IG1hdGNoZXMgYW55IG9mIHRoZSB0b2tlbiBtb2R1bGVzLCBhZGQgdGhlbQotICAgICAgICAgICAgICAgIGZvciAoSU1vZHVsZURlZiBkZWYgOiBtVG9rZW5Nb2R1bGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbVRva2VuTW9kdWxlU2NoZWR1bGVkLmNvbnRhaW5zKGRlZikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbnMuZXF1YWxzKGRlZi5nZXRUb2tlbnMoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVzLmFkZChkZWYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMb2cuZCgiQWRkaW5nICVzIHRvIHNjaGVkdWxlZCB0b2tlbiIsIGRlZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRva2VuTW9kdWxlU2NoZWR1bGVkLmFkZChkZWYpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gdGhlIGxhc3Qgc2hhcmQgZ29pbmcgdGhyb3VnaCBtYXkgYWRkIGV2ZXJ5dGhpbmcgcmVtYWluaW5nLgotICAgICAgICAgICAgaWYgKG1Jbml0Q291bnQgPT0gKG1Ub3RhbFNoYXJkcyAtIDEpICYmCi0gICAgICAgICAgICAgICAgICAgIG1Ub2tlbk1vZHVsZVNjaGVkdWxlZC5zaXplKCkgIT0gbVRva2VuTW9kdWxlcy5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICBtVG9rZW5Nb2R1bGVzLnJlbW92ZUFsbChtVG9rZW5Nb2R1bGVTY2hlZHVsZWQpOwotICAgICAgICAgICAgICAgIGlmIChtVG90YWxTaGFyZHMgIT0gMSkgewotICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IHByaW50IHRoZSB3YXJuaW5ncyBpZiB3ZSBhcmUgc2hhcmRpbmcuCi0gICAgICAgICAgICAgICAgICAgIENMb2cuZSgiQ291bGQgbm90IGZpbmQgYW55IHRva2VuIGZvciAlcy4gQWRkaW5nIHRvIGxhc3Qgc2hhcmQuIiwgbVRva2VuTW9kdWxlcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1vZHVsZXMuYWRkQWxsKG1Ub2tlbk1vZHVsZXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUluaXRDb3VudCsrOwotICAgICAgICB9Ci0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQobW9kdWxlcywgbmV3IEV4ZWN1dGlvbk9yZGVyQ29tcGFyYXRvcigpKTsKLSAgICAgICAgaW50IHVuaXF1ZUNvdW50ID0gVW5pcXVlTW9kdWxlQ291bnRVdGlsLmNvdW50VW5pcXVlTW9kdWxlcyhtb2R1bGVzKTsKLSAgICAgICAgQ0xvZy5sb2dBbmREaXNwbGF5KExvZ0xldmVsLklORk8sICIlcyBydW5uaW5nICVzIHRlc3Qgc3ViLW1vZHVsZXMsIGV4cGVjdGVkIHRvIGNvbXBsZXRlICIKLSAgICAgICAgICAgICAgICArICJpbiAlcy4iLCBzZXJpYWwsIHVuaXF1ZUNvdW50LCBUaW1lVXRpbC5mb3JtYXRFbGFwc2VkVGltZShlc3RpbWF0ZWRUaW1lKSk7Ci0gICAgICAgIENMb2cuZCgibW9kdWxlIGxpc3QgZm9yIHRoaXMgc2hhcmQ6ICVzIiwgbW9kdWxlcyk7Ci0gICAgICAgIExpbmtlZExpc3Q8SU1vZHVsZURlZj4gdGVzdHMgPSBuZXcgTGlua2VkTGlzdDw+KCk7Ci0gICAgICAgIHRlc3RzLmFkZEFsbChtb2R1bGVzKTsKLSAgICAgICAgcmV0dXJuIHRlc3RzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhlbHBlciB0byBsaW5lYXJseSBzcGxpdCB0aGUgbGlzdCBpbnRvIHNoYXJkcyB3aXRoIGJhbGFuY2VkIHJ1bnRpbWVIaW50LgotICAgICAqIEV4cG9zZWQgZm9yIHRlc3RpbmcuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIExpc3Q8SU1vZHVsZURlZj4gZ2V0U2hhcmQoTGlzdDxJTW9kdWxlRGVmPiBmdWxsTGlzdCwgaW50IHNoYXJkSW5kZXgsIGludCB0b3RhbFNoYXJkKSB7Ci0gICAgICAgIExpc3Q8TGlzdDxJTW9kdWxlRGVmPj4gcmVzID0gTGluZWFyUGFydGl0aW9uLnNwbGl0KGZ1bGxMaXN0LCB0b3RhbFNoYXJkKTsKLSAgICAgICAgaWYgKHJlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzaGFyZEluZGV4ID49IHJlcy5zaXplKCkpIHsKLSAgICAgICAgICAgIC8vIElmIHdlIGNvdWxkIG5vdCBzaGFyZCB1cCB0byBleHBlY3RhdGlvbgotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlcy5nZXQoc2hhcmRJbmRleCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUge0BsaW5rIExpc3R9IG9mIG1vZHVsZXMgd2hvc2UgbmFtZSBjb250YWlucyB0aGUgZ2l2ZW4gcGF0dGVybi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRNb2R1bGVOYW1lc01hdGNoaW5nKEZpbGUgZGlyZWN0b3J5LCBTdHJpbmcgcGF0dGVybikgewotICAgICAgICBTdHJpbmdbXSBuYW1lcyA9IGRpcmVjdG9yeS5saXN0KG5ldyBOYW1lRmlsdGVyKHBhdHRlcm4pKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IG1vZHVsZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4obmFtZXMubGVuZ3RoKTsKLSAgICAgICAgZm9yIChTdHJpbmcgbmFtZSA6IG5hbWVzKSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBuYW1lLmluZGV4T2YoQ09ORklHX0VYVCk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPiAwKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1vZHVsZSA9IG5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLSAgICAgICAgICAgICAgICBpZiAobW9kdWxlLmVxdWFscyhwYXR0ZXJuKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBQYXR0ZXJuIHJlcHJlc2VudHMgYSBzaW5nbGUgbW9kdWxlLCBqdXN0IHJldHVybiBhIHNpbmdsZS1pdGVtIGxpc3QKLSAgICAgICAgICAgICAgICAgICAgbW9kdWxlcyA9IG5ldyBBcnJheUxpc3Q8PigxKTsKLSAgICAgICAgICAgICAgICAgICAgbW9kdWxlcy5hZGQobW9kdWxlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vZHVsZXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1vZHVsZXMuYWRkKG1vZHVsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1vZHVsZXM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwdXRBcmdzKExpc3Q8U3RyaW5nPiBhcmdzLAotICAgICAgICAgICAgTWFwPFN0cmluZywgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+Pj4gYXJnc01hcCkgewotICAgICAgICBmb3IgKFN0cmluZyBhcmcgOiBhcmdzKSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBwYXJ0cyA9IGFyZy5zcGxpdCgiOiIpOwotICAgICAgICAgICAgU3RyaW5nIHRhcmdldCA9IHBhcnRzWzBdOwotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBwYXJ0c1sxXTsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZTsKLSAgICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPT0gNCkgewotICAgICAgICAgICAgICAgIC8vIGtleSBhbmQgdmFsdWUgZ2l2ZW4sIGtlZXAgdGhlIHBhaXIgZGVsaW1pdGVkIGJ5ICc6JyBhbmQgc3RvcmVkIGFzIHZhbHVlCi0gICAgICAgICAgICAgICAgdmFsdWUgPSBTdHJpbmcuZm9ybWF0KCIlczolcyIsIHBhcnRzWzJdLCBwYXJ0c1szXSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHZhbHVlID0gcGFydHNbMl07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IG1hcCA9IGFyZ3NNYXAuZ2V0KHRhcmdldCk7Ci0gICAgICAgICAgICBpZiAobWFwID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtYXAgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgICAgICAgICAgICAgYXJnc01hcC5wdXQodGFyZ2V0LCBtYXApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHZhbHVlTGlzdCA9IG1hcC5nZXQobmFtZSk7Ci0gICAgICAgICAgICBpZiAodmFsdWVMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB2YWx1ZUxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgICAgICBtYXAucHV0KG5hbWUsIHZhbHVlTGlzdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YWx1ZUxpc3QuYWRkKHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNvcnQgYnkgbmFtZSBhbmQgdXNlIHJ1bnRpbWVIaW50IGZvciBzZXBhcmF0aW9uLCBzaG9ydGVzdCB0ZXN0IGZpcnN0LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEV4ZWN1dGlvbk9yZGVyQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3I8SU1vZHVsZURlZj4gewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBjb21wYXJlKElNb2R1bGVEZWYgZGVmMSwgSU1vZHVsZURlZiBkZWYyKSB7Ci0gICAgICAgICAgICBpbnQgdmFsdWUxID0gMDsKLSAgICAgICAgICAgIGludCB2YWx1ZTIgPSAwOwotICAgICAgICAgICAgaWYgKEVORElOR19NT0RVTEVTLmNvbnRhaW5zS2V5KGRlZjEuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgIHZhbHVlMSA9IEVORElOR19NT0RVTEVTLmdldChkZWYxLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoRU5ESU5HX01PRFVMRVMuY29udGFpbnNLZXkoZGVmMi5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgdmFsdWUyID0gRU5ESU5HX01PRFVMRVMuZ2V0KGRlZjIuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh2YWx1ZTEgPT0gMCAmJiB2YWx1ZTIgPT0gMCkgewotICAgICAgICAgICAgICAgIGludCB0aW1lID0gKGludCkgTWF0aC5zaWdudW0oZGVmMS5nZXRSdW50aW1lSGludCgpIC0gZGVmMi5nZXRSdW50aW1lSGludCgpKTsKLSAgICAgICAgICAgICAgICBpZiAodGltZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWYxLmdldE5hbWUoKS5jb21wYXJlVG8oZGVmMi5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gdGltZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAoaW50KSBNYXRoLnNpZ251bSh2YWx1ZTEgLSB2YWx1ZTIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgewotICAgICAgICBtTm9uVG9rZW5Nb2R1bGVzLmNsZWFyKCk7Ci0gICAgICAgIG1Ub2tlbk1vZHVsZXMuY2xlYXIoKTsKLSAgICAgICAgbUluY2x1ZGVGaWx0ZXJzLmNsZWFyKCk7Ci0gICAgICAgIG1FeGNsdWRlRmlsdGVycy5jbGVhcigpOwotICAgICAgICBtVGVzdEFyZ3MuY2xlYXIoKTsKLSAgICAgICAgbU1vZHVsZUFyZ3MuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBtQ29uZmlnRmFjdG9yeQotICAgICAqLwotICAgIHByb3RlY3RlZCBJQ29uZmlndXJhdGlvbkZhY3RvcnkgZ2V0Q29uZmlnRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIG1Db25maWdGYWN0b3J5OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3Rlc3R0eXBlL1N1YlBsYW4uamF2YSBiL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3Rlc3R0eXBlL1N1YlBsYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJjNzE1NS4uMDAwMDAwMAotLS0gYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC90ZXN0dHlwZS9TdWJQbGFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRlc3R0eXBlOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5UZXN0RmlsdGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnV0aWwueG1sLkFic3RyYWN0WG1sUGFyc2VyOwotCi1pbXBvcnQgb3JnLmt4bWwyLmlvLktYbWxTZXJpYWxpemVyOwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogQ29udGFpbmVyLCBwYXJzZXIsIGFuZCBnZW5lcmF0b3Igb2YgU3ViUGxhbiBpbmZvLgotICovCi1wdWJsaWMgY2xhc3MgU3ViUGxhbiBleHRlbmRzIEFic3RyYWN0WG1sUGFyc2VyIGltcGxlbWVudHMgSVN1YlBsYW4gewotCi0gICAgcHJpdmF0ZSBmaW5hbCBTZXQ8U3RyaW5nPiBtSW5jbHVkZXM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTZXQ8U3RyaW5nPiBtRXhjbHVkZXM7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5DT0RJTkcgPSAiVVRGLTgiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOUyA9IG51bGw7IC8vIG5hbWVzcGFjZSB1c2VkIGZvciBYTUwgc2VyaWFsaXplcgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX0FUVFIgPSAidmVyc2lvbiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNVQlBMQU5fVkVSU0lPTiA9ICIyLjAiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNVQlBMQU5fVEFHID0gIlN1YlBsYW4iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRSWV9UQUcgPSAiRW50cnkiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWENMVURFX0FUVFIgPSAiZXhjbHVkZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOQ0xVREVfQVRUUiA9ICJpbmNsdWRlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJJX0FUVFIgPSAiYWJpIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9BVFRSID0gIm5hbWUiOwotCi0gICAgcHVibGljIFN1YlBsYW4oKSB7Ci0gICAgICAgIG1JbmNsdWRlcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgbUV4Y2x1ZGVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGRJbmNsdWRlRmlsdGVyKFN0cmluZyBmaWx0ZXIpIHsKLSAgICAgICAgbUluY2x1ZGVzLmFkZChmaWx0ZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGRBbGxJbmNsdWRlRmlsdGVycyhTZXQ8U3RyaW5nPiBmaWx0ZXJzKSB7Ci0gICAgICAgIG1JbmNsdWRlcy5hZGRBbGwoZmlsdGVycyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkZEV4Y2x1ZGVGaWx0ZXIoU3RyaW5nIGZpbHRlcikgewotICAgICAgICBtRXhjbHVkZXMuYWRkKGZpbHRlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkZEFsbEV4Y2x1ZGVGaWx0ZXJzKFNldDxTdHJpbmc+IGZpbHRlcnMpIHsKLSAgICAgICAgbUV4Y2x1ZGVzLmFkZEFsbChmaWx0ZXJzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFNldDxTdHJpbmc+IGdldEluY2x1ZGVGaWx0ZXJzKCkgewotICAgICAgICByZXR1cm4gbmV3IEhhc2hTZXQ8U3RyaW5nPihtSW5jbHVkZXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0RXhjbHVkZUZpbHRlcnMoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSGFzaFNldDxTdHJpbmc+KG1FeGNsdWRlcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShPdXRwdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBLWG1sU2VyaWFsaXplciBzZXJpYWxpemVyID0gbmV3IEtYbWxTZXJpYWxpemVyKCk7Ci0gICAgICAgIHNlcmlhbGl6ZXIuc2V0T3V0cHV0KHN0cmVhbSwgRU5DT0RJTkcpOwotICAgICAgICBzZXJpYWxpemVyLnN0YXJ0RG9jdW1lbnQoRU5DT0RJTkcsIGZhbHNlKTsKLSAgICAgICAgc2VyaWFsaXplci5zZXRGZWF0dXJlKCJodHRwOi8veG1scHVsbC5vcmcvdjEvZG9jL2ZlYXR1cmVzLmh0bWwjaW5kZW50LW91dHB1dCIsIHRydWUpOwotICAgICAgICBzZXJpYWxpemVyLnN0YXJ0VGFnKE5TLCBTVUJQTEFOX1RBRyk7Ci0gICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlKE5TLCBWRVJTSU9OX0FUVFIsIFNVQlBMQU5fVkVSU0lPTik7Ci0KLSAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gc29ydGVkSW5jbHVkZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4obUluY2x1ZGVzKTsKLSAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gc29ydGVkRXhjbHVkZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4obUV4Y2x1ZGVzKTsKLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydChzb3J0ZWRJbmNsdWRlcyk7Ci0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQoc29ydGVkRXhjbHVkZXMpOwotICAgICAgICBmb3IgKFN0cmluZyBpbmNsdWRlIDogc29ydGVkSW5jbHVkZXMpIHsKLSAgICAgICAgICAgIHNlcmlhbGl6ZXIuc3RhcnRUYWcoTlMsIEVOVFJZX1RBRyk7Ci0gICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZShOUywgSU5DTFVERV9BVFRSLCBpbmNsdWRlKTsKLSAgICAgICAgICAgIHNlcmlhbGl6ZXIuZW5kVGFnKE5TLCBFTlRSWV9UQUcpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoU3RyaW5nIGV4Y2x1ZGUgOiBzb3J0ZWRFeGNsdWRlcykgewotICAgICAgICAgICAgc2VyaWFsaXplci5zdGFydFRhZyhOUywgRU5UUllfVEFHKTsKLSAgICAgICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlKE5TLCBFWENMVURFX0FUVFIsIGV4Y2x1ZGUpOwotICAgICAgICAgICAgc2VyaWFsaXplci5lbmRUYWcoTlMsIEVOVFJZX1RBRyk7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXJpYWxpemVyLmVuZFRhZyhOUywgU1VCUExBTl9UQUcpOwotICAgICAgICBzZXJpYWxpemVyLmVuZERvY3VtZW50KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBEZWZhdWx0SGFuZGxlciBjcmVhdGVYbWxIYW5kbGVyKCkgewotICAgICAgICByZXR1cm4gbmV3IEVudHJ5SGFuZGxlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNBWCBjYWxsYmFjayBvYmplY3QuIEhhbmRsZXMgcGFyc2luZyBkYXRhIGZyb20gdGhlIHhtbCB0YWdzLgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgRW50cnlIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgewotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykKLSAgICAgICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGlmIChFTlRSWV9UQUcuZXF1YWxzKGxvY2FsTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgaW5jbHVkZVN0cmluZyA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoSU5DTFVERV9BVFRSKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZXhjbHVkZVN0cmluZyA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoRVhDTFVERV9BVFRSKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5jbHVkZVN0cmluZyAhPSBudWxsICYmIGV4Y2x1ZGVTdHJpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3Qgc3BlY2lmeSBpbmNsdWRlIGFuZCBleGNsdWRlIGZpbHRlciBpbiB0aGUgc2FtZSBlbGVtZW50Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN0cmluZyBhYmlTdHJpbmcgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKEFCSV9BVFRSKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZVN0cmluZyA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoTkFNRV9BVFRSKTsKLQotICAgICAgICAgICAgICAgIGlmIChleGNsdWRlU3RyaW5nID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyc2VGaWx0ZXIoYWJpU3RyaW5nLCBuYW1lU3RyaW5nLCBpbmNsdWRlU3RyaW5nLCBtSW5jbHVkZXMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcnNlRmlsdGVyKGFiaVN0cmluZywgbmFtZVN0cmluZywgZXhjbHVkZVN0cmluZywgbUV4Y2x1ZGVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgcGFyc2VGaWx0ZXIoU3RyaW5nIGFiaSwgU3RyaW5nIG5hbWUsIFN0cmluZyBmaWx0ZXIsIFNldDxTdHJpbmc+IGZpbHRlclNldCkgewotICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBuYW1lIGFuZCBhYmkgYXR0cmlidXRlcywgJ2ZpbHRlcicgc2hvdWxkIGNvbnRhaW4gYWxsIG5lY2Vzc2FyeSBwYXJ0cwotICAgICAgICAgICAgICAgIGZpbHRlclNldC5hZGQoZmlsdGVyKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gJ2ZpbHRlcicgaXMgbmFtZSBvZiB0ZXN0LiBCdWlsZCBUZXN0RmlsdGVyIGFuZCBjb252ZXJ0IGJhY2sgdG8gc3RyaW5nCi0gICAgICAgICAgICAgICAgZmlsdGVyU2V0LmFkZChuZXcgVGVzdEZpbHRlcihhYmksIG5hbWUsIGZpbHRlcikudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC90ZXN0dHlwZS9yZXRyeS9SZXRyeUZhY3RvcnlUZXN0LmphdmEgYi9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC90ZXN0dHlwZS9yZXRyeS9SZXRyeUZhY3RvcnlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwYmY2MzMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdGVzdHR5cGUvcmV0cnkvUmV0cnlGYWN0b3J5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5yZXRyeTsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLmJ1aWxkLkNvbXBhdGliaWxpdHlCdWlsZEhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5Db21wYXRpYmlsaXR5VGVzdDsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5zdWl0ZS5Db21wYXRpYmlsaXR5VGVzdFN1aXRlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnV0aWwuUmV0cnlGaWx0ZXJIZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudXRpbC5SZXRyeVR5cGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuYnVpbGQuSUJ1aWxkSW5mbzsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5jb25maWcuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5jb25maWcuT3B0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmNvbmZpZy5PcHRpb24uSW1wb3J0YW5jZTsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5jb25maWcuT3B0aW9uQ2xhc3M7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuY29uZmlnLk9wdGlvblNldHRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5JVGVzdERldmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5pbnZva2VyLklJbnZvY2F0aW9uQ29udGV4dDsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5sb2cuTG9nVXRpbC5DTG9nOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnJlc3VsdC5JVGVzdEludm9jYXRpb25MaXN0ZW5lcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5zdWl0ZS5jaGVja2VyLklTeXN0ZW1TdGF0dXNDaGVja2VyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnN1aXRlLmNoZWNrZXIuSVN5c3RlbVN0YXR1c0NoZWNrZXJSZWNlaXZlcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JQnVpbGRSZWNlaXZlcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JRGV2aWNlVGVzdDsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JSW52b2NhdGlvbkNvbnRleHRSZWNlaXZlcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JUmVtb3RlVGVzdDsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JU2hhcmRhYmxlVGVzdDsKLQotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBSdW5uZXIgdGhhdCBjcmVhdGVzIGEge0BsaW5rIENvbXBhdGliaWxpdHlUZXN0fSB0byByZS1ydW4gc29tZSBwcmV2aW91cyByZXN1bHRzLgotICogT25seSB0aGUgJ2N0cycgcGxhbiBpcyBzdXBwb3J0ZWQuCi0gKiBUT0RPOiBleHBsb3JlIG90aGVyIG5ldyB3YXkgdG8gYnVpbGQgdGhlIHJldHJ5IChpbnN0ZWFkIG9mIHJlbHlpbmcgb24gb25lIG1hc3NpdmUgcGFpciBvZgotICogaW5jbHVkZS9leGNsdWRlIGZpbHRlcnMpCi0gKi8KLUBPcHRpb25DbGFzcyhhbGlhcyA9ICJjb21wYXRpYmlsaXR5IikKLXB1YmxpYyBjbGFzcyBSZXRyeUZhY3RvcnlUZXN0IGltcGxlbWVudHMgSVJlbW90ZVRlc3QsIElEZXZpY2VUZXN0LCBJQnVpbGRSZWNlaXZlciwKLSAgICAgICAgSVN5c3RlbVN0YXR1c0NoZWNrZXJSZWNlaXZlciwgSUludm9jYXRpb25Db250ZXh0UmVjZWl2ZXIsIElTaGFyZGFibGVUZXN0IHsKLQotICAgIC8qKgotICAgICAqIE1pcnJvciB0aGUge0BsaW5rIENvbXBhdGliaWxpdHlUZXN0fSBvcHRpb25zIGluIG9yZGVyIHRvIGNyZWF0ZSBpdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVRSWV9PUFRJT04gPSAicmV0cnkiOwotICAgIEBPcHRpb24obmFtZSA9IFJFVFJZX09QVElPTiwKLSAgICAgICAgICAgIHNob3J0TmFtZSA9ICdyJywKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gInJldHJ5IGEgcHJldmlvdXMgc2Vzc2lvbidzIGZhaWxlZCBhbmQgbm90IGV4ZWN1dGVkIHRlc3RzLiIsCi0gICAgICAgICAgICBtYW5kYXRvcnkgPSB0cnVlKQotICAgIHByaXZhdGUgSW50ZWdlciBtUmV0cnlTZXNzaW9uSWQgPSBudWxsOwotCi0gICAgQE9wdGlvbihuYW1lID0gQ29tcGF0aWJpbGl0eVRlc3QuU1VCUExBTl9PUFRJT04sCi0gICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICJ0aGUgc3VicGxhbiB0byBydW4iLAotICAgICAgICAgICAgaW1wb3J0YW5jZSA9IEltcG9ydGFuY2UuSUZfVU5TRVQpCi0gICAgcHJvdGVjdGVkIFN0cmluZyBtU3ViUGxhbjsKLQotICAgIEBPcHRpb24obmFtZSA9IENvbXBhdGliaWxpdHlUZXN0LklOQ0xVREVfRklMVEVSX09QVElPTiwKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gInRoZSBpbmNsdWRlIG1vZHVsZSBmaWx0ZXJzIHRvIGFwcGx5LiIsCi0gICAgICAgICAgICBpbXBvcnRhbmNlID0gSW1wb3J0YW5jZS5BTFdBWVMpCi0gICAgcHJvdGVjdGVkIFNldDxTdHJpbmc+IG1JbmNsdWRlRmlsdGVycyA9IG5ldyBIYXNoU2V0PD4oKTsKLQotICAgIEBPcHRpb24obmFtZSA9IENvbXBhdGliaWxpdHlUZXN0LkVYQ0xVREVfRklMVEVSX09QVElPTiwKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gInRoZSBleGNsdWRlIG1vZHVsZSBmaWx0ZXJzIHRvIGFwcGx5LiIsCi0gICAgICAgICAgICBpbXBvcnRhbmNlID0gSW1wb3J0YW5jZS5BTFdBWVMpCi0gICAgcHJvdGVjdGVkIFNldDxTdHJpbmc+IG1FeGNsdWRlRmlsdGVycyA9IG5ldyBIYXNoU2V0PD4oKTsKLQotICAgIEBPcHRpb24obmFtZSA9IENvbXBhdGliaWxpdHlUZXN0LkFCSV9PUFRJT04sCi0gICAgICAgICAgICBzaG9ydE5hbWUgPSAnYScsCi0gICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICJ0aGUgYWJpIHRvIHRlc3QuIiwKLSAgICAgICAgICAgIGltcG9ydGFuY2UgPSBJbXBvcnRhbmNlLklGX1VOU0VUKQotICAgIHByb3RlY3RlZCBTdHJpbmcgbUFiaU5hbWUgPSBudWxsOwotCi0gICAgQE9wdGlvbihuYW1lID0gQ29tcGF0aWJpbGl0eVRlc3QuTU9EVUxFX09QVElPTiwKLSAgICAgICAgICAgIHNob3J0TmFtZSA9ICdtJywKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gInRoZSB0ZXN0IG1vZHVsZSB0byBydW4uIiwKLSAgICAgICAgICAgIGltcG9ydGFuY2UgPSBJbXBvcnRhbmNlLklGX1VOU0VUKQotICAgIHByb3RlY3RlZCBTdHJpbmcgbU1vZHVsZU5hbWUgPSBudWxsOwotCi0gICAgQE9wdGlvbihuYW1lID0gQ29tcGF0aWJpbGl0eVRlc3QuVEVTVF9PUFRJT04sCi0gICAgICAgICAgICBzaG9ydE5hbWUgPSBDb21wYXRpYmlsaXR5VGVzdC5URVNUX09QVElPTl9TSE9SVF9OQU1FLAotICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAidGhlIHRlc3QgcnVuLiIsCi0gICAgICAgICAgICBpbXBvcnRhbmNlID0gSW1wb3J0YW5jZS5JRl9VTlNFVCkKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG1UZXN0TmFtZSA9IG51bGw7Ci0KLSAgICBAT3B0aW9uKG5hbWUgPSBDb21wYXRpYmlsaXR5VGVzdC5SRVRSWV9UWVBFX09QVElPTiwKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gInVzZWQgd2l0aCAiICsgQ29tcGF0aWJpbGl0eVRlc3QuUkVUUllfT1BUSU9OICsgIiwgcmV0cnkgdGVzdHMiCi0gICAgICAgICAgICArICIgb2YgYSBjZXJ0YWluIHN0YXR1cy4gUG9zc2libGUgdmFsdWVzIGluY2x1ZGUgXCJmYWlsZWRcIiBhbmQgXCJub3RfZXhlY3V0ZWRcIi4iLAotICAgICAgICAgICAgaW1wb3J0YW5jZSA9IEltcG9ydGFuY2UuSUZfVU5TRVQpCi0gICAgcHJvdGVjdGVkIFJldHJ5VHlwZSBtUmV0cnlUeXBlID0gbnVsbDsKLQotICAgIHByaXZhdGUgTGlzdDxJU3lzdGVtU3RhdHVzQ2hlY2tlcj4gbVN0YXR1c0NoZWNrZXJzOwotICAgIHByaXZhdGUgSUJ1aWxkSW5mbyBtQnVpbGRJbmZvOwotICAgIHByaXZhdGUgSVRlc3REZXZpY2UgbURldmljZTsKLSAgICBwcml2YXRlIElJbnZvY2F0aW9uQ29udGV4dCBtQ29udGV4dDsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFN5c3RlbVN0YXR1c0NoZWNrZXIoTGlzdDxJU3lzdGVtU3RhdHVzQ2hlY2tlcj4gc3lzdGVtQ2hlY2tlcnMpIHsKLSAgICAgICAgbVN0YXR1c0NoZWNrZXJzID0gc3lzdGVtQ2hlY2tlcnM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0QnVpbGQoSUJ1aWxkSW5mbyBidWlsZEluZm8pIHsKLSAgICAgICAgbUJ1aWxkSW5mbyA9IGJ1aWxkSW5mbzsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXREZXZpY2UoSVRlc3REZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIG1EZXZpY2UgPSBkZXZpY2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElUZXN0RGV2aWNlIGdldERldmljZSgpIHsKLSAgICAgICAgcmV0dXJuIG1EZXZpY2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0SW52b2NhdGlvbkNvbnRleHQoSUludm9jYXRpb25Db250ZXh0IGludm9jYXRpb25Db250ZXh0KSB7Ci0gICAgICAgIG1Db250ZXh0ID0gaW52b2NhdGlvbkNvbnRleHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnVpbGQgYSBDb21wYXRpYmlsaXR5VGVzdCB3aXRoIGFwcHJvcHJpYXRlIGZpbHRlcnMgdG8gcnVuIG9ubHkgdGhlIHRlc3RzIG9mIGludGVyZXN0cy4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBydW4oSVRlc3RJbnZvY2F0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBDb21wYXRpYmlsaXR5VGVzdFN1aXRlIHRlc3QgPSBsb2FkU3VpdGUoKTsKLSAgICAgICAgLy8gcnVuIHRoZSByZXRyeSBydW4uCi0gICAgICAgIHRlc3QucnVuKGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ29sbGVjdGlvbjxJUmVtb3RlVGVzdD4gc3BsaXQoaW50IHNoYXJkQ291bnRIaW50KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDb21wYXRpYmlsaXR5VGVzdFN1aXRlIHRlc3QgPSBsb2FkU3VpdGUoKTsKLSAgICAgICAgICAgIHJldHVybiB0ZXN0LnNwbGl0KHNoYXJkQ291bnRIaW50KTsKLSAgICAgICAgfSBjYXRjaCAoRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIENMb2cuZSgiRmFpbGVkIHRvIHNoYXJkIHRoZSByZXRyeSBydW4uIik7Ci0gICAgICAgICAgICBDTG9nLmUoZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGVscGVyIHRvIGNyZWF0ZSBhIHtAbGluayBDb21wYXRpYmlsaXR5VGVzdFN1aXRlfSBmcm9tIHByZXZpb3VzIHJlc3VsdHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBDb21wYXRpYmlsaXR5VGVzdFN1aXRlIGxvYWRTdWl0ZSgpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICAvLyBDcmVhdGUgYSBjb21wYXRpYmlsaXR5IHRlc3QgYW5kIHNldCBpdCB0byBydW4gb25seSB3aGF0IHdlIHdhbnQuCi0gICAgICAgIENvbXBhdGliaWxpdHlUZXN0U3VpdGUgdGVzdCA9IGNyZWF0ZVRlc3QoKTsKLQotICAgICAgICBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIgYnVpbGRIZWxwZXIgPSBuZXcgQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyKG1CdWlsZEluZm8pOwotICAgICAgICAvLyBDcmVhdGUgdGhlIGhlbHBlciB3aXRoIGFsbCB0aGUgb3B0aW9ucyBuZWVkZWQuCi0gICAgICAgIFJldHJ5RmlsdGVySGVscGVyIGhlbHBlciA9IGNyZWF0ZUZpbHRlckhlbHBlcihidWlsZEhlbHBlcik7Ci0gICAgICAgIC8vIFRPRE86IHdlIGhhdmUgYWNjZXNzIHRvIHRoZSBvcmlnaW5hbCBjb21tYW5kIGxpbmUsIHdlIHNob3VsZCBhY2NvbW1vZGF0ZSBtb3JlIHJlLXJ1bgotICAgICAgICAvLyBzY2VuYXJpbyBsaWtlIHdoZW4gdGhlIG9yaWdpbmFsIGN0cy54bWwgY29uZmlnIHdhcyBub3QgdXNlZC4KLSAgICAgICAgaGVscGVyLnZhbGlkYXRlQnVpbGRGaW5nZXJwcmludChtRGV2aWNlKTsKLSAgICAgICAgaGVscGVyLnNldENvbW1hbmRMaW5lT3B0aW9uc0Zvcih0ZXN0KTsKLSAgICAgICAgaGVscGVyLnNldENvbW1hbmRMaW5lT3B0aW9uc0Zvcih0aGlzKTsKLSAgICAgICAgaGVscGVyLnBvcHVsYXRlUmV0cnlGaWx0ZXJzKCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9wdGlvblNldHRlciBzZXR0ZXIgPSBuZXcgT3B0aW9uU2V0dGVyKHRlc3QpOwotICAgICAgICAgICAgc2V0dGVyLnNldE9wdGlvblZhbHVlKCJjb21wYXRpYmlsaXR5OnRlc3QtYXJnIiwKLSAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkFuZHJvaWRKVW5pdFRlc3Q6cmVydW4tZnJvbS1maWxlOnRydWUiKTsKLSAgICAgICAgICAgIHNldHRlci5zZXRPcHRpb25WYWx1ZSgiY29tcGF0aWJpbGl0eTp0ZXN0LWFyZyIsCi0gICAgICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5BbmRyb2lkSlVuaXRUZXN0OmZhbGxiYWNrLXRvLXNlcmlhbC1yZXJ1bjoiCi0gICAgICAgICAgICAgICAgICAgICsgImZhbHNlIik7Ci0gICAgICAgIH0gY2F0Y2ggKENvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0ZXN0LnNldEluY2x1ZGVGaWx0ZXIoaGVscGVyLmdldEluY2x1ZGVGaWx0ZXJzKCkpOwotICAgICAgICB0ZXN0LnNldEV4Y2x1ZGVGaWx0ZXIoaGVscGVyLmdldEV4Y2x1ZGVGaWx0ZXJzKCkpOwotICAgICAgICB0ZXN0LnNldERldmljZShtRGV2aWNlKTsKLSAgICAgICAgdGVzdC5zZXRCdWlsZChtQnVpbGRJbmZvKTsKLSAgICAgICAgdGVzdC5zZXRTeXN0ZW1TdGF0dXNDaGVja2VyKG1TdGF0dXNDaGVja2Vycyk7Ci0gICAgICAgIHRlc3Quc2V0SW52b2NhdGlvbkNvbnRleHQobUNvbnRleHQpOwotICAgICAgICAvLyBjbGVhbiB0aGUgaGVscGVyCi0gICAgICAgIGhlbHBlci50ZWFyRG93bigpOwotICAgICAgICByZXR1cm4gdGVzdDsKLSAgICB9Ci0KLSAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICBSZXRyeUZpbHRlckhlbHBlciBjcmVhdGVGaWx0ZXJIZWxwZXIoQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyIGJ1aWxkSGVscGVyKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUmV0cnlGaWx0ZXJIZWxwZXIoYnVpbGRIZWxwZXIsIG1SZXRyeVNlc3Npb25JZCwgbVN1YlBsYW4sIG1JbmNsdWRlRmlsdGVycywKLSAgICAgICAgICAgICAgICBtRXhjbHVkZUZpbHRlcnMsIG1BYmlOYW1lLCBtTW9kdWxlTmFtZSwgbVRlc3ROYW1lLCBtUmV0cnlUeXBlKTsKLSAgICB9Ci0KLSAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICBDb21wYXRpYmlsaXR5VGVzdFN1aXRlIGNyZWF0ZVRlc3QoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ29tcGF0aWJpbGl0eVRlc3RTdWl0ZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3Rlc3R0eXBlL3N1aXRlL0NvbXBhdGliaWxpdHlUZXN0U3VpdGUuamF2YSBiL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3Rlc3R0eXBlL3N1aXRlL0NvbXBhdGliaWxpdHlUZXN0U3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI3NGYyMy4uMDAwMDAwMAotLS0gYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC90ZXN0dHlwZS9zdWl0ZS9Db21wYXRpYmlsaXR5VGVzdFN1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRlc3R0eXBlLnN1aXRlOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQuYnVpbGQuQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRlc3R0eXBlLkNvbXBhdGliaWxpdHlUZXN0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRlc3R0eXBlLklTdWJQbGFuOwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRlc3R0eXBlLlN1YlBsYW47Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5UZXN0RmlsdGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmJ1aWxkLklCdWlsZEluZm87Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuY29uZmlnLklDb25maWd1cmF0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmNvbmZpZy5PcHRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuY29uZmlnLk9wdGlvbi5JbXBvcnRhbmNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmNvbmZpZy5PcHRpb25DbGFzczsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5JVGVzdERldmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5sb2cuTG9nVXRpbC5DTG9nOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkFiaTsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JQWJpOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLnN1aXRlLklUZXN0U3VpdGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuc3VpdGUuVGVzdFN1aXRlSW5mbzsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC51dGlsLkFiaUZvcm1hdHRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC51dGlsLkFiaVV0aWxzOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnV0aWwuQXJyYXlVdGlsOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnV0aWwuTXVsdGlNYXA7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudXRpbC54bWwuQWJzdHJhY3RYbWxQYXJzZXIuUGFyc2VFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBBIFRlc3QgZm9yIHJ1bm5pbmcgQ29tcGF0aWJpbGl0eSBUZXN0IFN1aXRlIHdpdGggbmV3IHN1aXRlIHN5c3RlbS4KLSAqLwotQE9wdGlvbkNsYXNzKGFsaWFzID0gImNvbXBhdGliaWxpdHkiKQotcHVibGljIGNsYXNzIENvbXBhdGliaWxpdHlUZXN0U3VpdGUgZXh0ZW5kcyBJVGVzdFN1aXRlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTkNMVURFX0ZJTFRFUl9PUFRJT04gPSAiaW5jbHVkZS1maWx0ZXIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWENMVURFX0ZJTFRFUl9PUFRJT04gPSAiZXhjbHVkZS1maWx0ZXIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVUJQTEFOX09QVElPTiA9ICJzdWJwbGFuIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX09QVElPTiA9ICJtb2R1bGUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX09QVElPTiA9ICJ0ZXN0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX0FSR19PUFRJT04gPSAibW9kdWxlLWFyZyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQVJHX09QVElPTiA9ICJ0ZXN0LWFyZyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFCSV9PUFRJT04gPSAiYWJpIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0tJUF9IT1NUX0FSQ0hfQ0hFQ0sgPSAic2tpcC1ob3N0LWFyY2gtY2hlY2siOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUklNQVJZX0FCSV9SVU4gPSAicHJpbWFyeS1hYmktb25seSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0RVQ1RfQ1BVX0FCSV9LRVkgPSAicm8ucHJvZHVjdC5jcHUuYWJpIjsKLQotICAgIC8vIFRPRE86IHJlbW92ZSB0aGlzIG9wdGlvbiB3aGVuIENvbXBhdGliaWxpdHlUZXN0IGdvZXMgYXdheQotICAgIEBPcHRpb24obmFtZSA9IENvbXBhdGliaWxpdHlUZXN0LlJFVFJZX09QVElPTiwKLSAgICAgICAgICAgIHNob3J0TmFtZSA9ICdyJywKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gIkNvcHkgb2YgLS1yZXRyeSBmcm9tIENvbXBhdGliaWxpdHlUZXN0IHRvIHByZXZlbnQgdXNpbmcgaXQuIikKLSAgICBwcml2YXRlIEludGVnZXIgbVJldHJ5U2Vzc2lvbklkID0gbnVsbDsKLQotICAgIEBPcHRpb24obmFtZSA9IFNVQlBMQU5fT1BUSU9OLAotICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAidGhlIHN1YnBsYW4gdG8gcnVuIiwKLSAgICAgICAgICAgIGltcG9ydGFuY2UgPSBJbXBvcnRhbmNlLklGX1VOU0VUKQotICAgIHByaXZhdGUgU3RyaW5nIG1TdWJQbGFuOwotCi0gICAgQE9wdGlvbihuYW1lID0gSU5DTFVERV9GSUxURVJfT1BUSU9OLAotICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAidGhlIGluY2x1ZGUgbW9kdWxlIGZpbHRlcnMgdG8gYXBwbHkuIiwKLSAgICAgICAgICAgIGltcG9ydGFuY2UgPSBJbXBvcnRhbmNlLkFMV0FZUykKLSAgICBwcml2YXRlIFNldDxTdHJpbmc+IG1JbmNsdWRlRmlsdGVycyA9IG5ldyBIYXNoU2V0PD4oKTsKLQotICAgIEBPcHRpb24obmFtZSA9IEVYQ0xVREVfRklMVEVSX09QVElPTiwKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gInRoZSBleGNsdWRlIG1vZHVsZSBmaWx0ZXJzIHRvIGFwcGx5LiIsCi0gICAgICAgICAgICBpbXBvcnRhbmNlID0gSW1wb3J0YW5jZS5BTFdBWVMpCi0gICAgcHJpdmF0ZSBTZXQ8U3RyaW5nPiBtRXhjbHVkZUZpbHRlcnMgPSBuZXcgSGFzaFNldDw+KCk7Ci0KLSAgICBAT3B0aW9uKG5hbWUgPSBNT0RVTEVfT1BUSU9OLAotICAgICAgICAgICAgc2hvcnROYW1lID0gJ20nLAotICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAidGhlIHRlc3QgbW9kdWxlIHRvIHJ1bi4iLAotICAgICAgICAgICAgaW1wb3J0YW5jZSA9IEltcG9ydGFuY2UuSUZfVU5TRVQpCi0gICAgcHJpdmF0ZSBTdHJpbmcgbU1vZHVsZU5hbWUgPSBudWxsOwotCi0gICAgQE9wdGlvbihuYW1lID0gVEVTVF9PUFRJT04sCi0gICAgICAgICAgICBzaG9ydE5hbWUgPSAndCcsCi0gICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICJ0aGUgdGVzdCB0byBydW4uIiwKLSAgICAgICAgICAgIGltcG9ydGFuY2UgPSBJbXBvcnRhbmNlLklGX1VOU0VUKQotICAgIHByaXZhdGUgU3RyaW5nIG1UZXN0TmFtZSA9IG51bGw7Ci0KLSAgICBAT3B0aW9uKG5hbWUgPSBNT0RVTEVfQVJHX09QVElPTiwKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gInRoZSBhcmd1bWVudHMgdG8gcGFzcyB0byBhIG1vZHVsZS4gVGhlIGV4cGVjdGVkIGZvcm1hdCBpcyIKLSAgICAgICAgICAgICAgICAgICAgKyAiXCI8bW9kdWxlLW5hbWU+OjxhcmctbmFtZT46Wzxhcmcta2V5Pjo9XTxhcmctdmFsdWU+XCIiLAotICAgICAgICAgICAgaW1wb3J0YW5jZSA9IEltcG9ydGFuY2UuQUxXQVlTKQotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1Nb2R1bGVBcmdzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0KLSAgICBAT3B0aW9uKG5hbWUgPSBURVNUX0FSR19PUFRJT04sCi0gICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICJ0aGUgYXJndW1lbnRzIHRvIHBhc3MgdG8gYSB0ZXN0LiBUaGUgZXhwZWN0ZWQgZm9ybWF0IGlzIgotICAgICAgICAgICAgICAgICAgICArICJcIjx0ZXN0LWNsYXNzPjo8YXJnLW5hbWU+Ols8YXJnLWtleT46PV08YXJnLXZhbHVlPlwiIiwKLSAgICAgICAgICAgIGltcG9ydGFuY2UgPSBJbXBvcnRhbmNlLkFMV0FZUykKLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtVGVzdEFyZ3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLQotICAgIEBPcHRpb24obmFtZSA9IEFCSV9PUFRJT04sCi0gICAgICAgICAgICBzaG9ydE5hbWUgPSAnYScsCi0gICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICJ0aGUgYWJpIHRvIHRlc3QuIiwKLSAgICAgICAgICAgIGltcG9ydGFuY2UgPSBJbXBvcnRhbmNlLklGX1VOU0VUKQotICAgIHByaXZhdGUgU3RyaW5nIG1BYmlOYW1lID0gbnVsbDsKLQotICAgIEBPcHRpb24obmFtZSA9IFNLSVBfSE9TVF9BUkNIX0NIRUNLLAotICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAiV2hldGhlciBob3N0IGFyY2hpdGVjdHVyZSBjaGVjayBzaG91bGQgYmUgc2tpcHBlZCIpCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Ta2lwSG9zdEFyY2hDaGVjayA9IGZhbHNlOwotCi0gICAgQE9wdGlvbihuYW1lID0gUFJJTUFSWV9BQklfUlVOLAotICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAiV2hldGhlciB0byBydW4gdGVzdHMgd2l0aCBvbmx5IHRoZSBkZXZpY2UgcHJpbWFyeSBhYmkuICIKLSAgICAgICAgICAgICAgICAgICAgKyAiVGhpcyBvdmVycmlkZSB0aGUgLS1hYmkgb3B0aW9uLiIpCi0gICAgcHJpdmF0ZSBib29sZWFuIG1QcmltYXJ5QWJpUnVuID0gZmFsc2U7Ci0KLSAgICBAT3B0aW9uKG5hbWUgPSAibW9kdWxlLW1ldGFkYXRhLWluY2x1ZGUtZmlsdGVyIiwKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gIkluY2x1ZGUgbW9kdWxlcyBmb3IgZXhlY3V0aW9uIGJhc2VkIG9uIG1hdGNoaW5nIG9mIG1ldGFkYXRhIGZpZWxkczogIgotICAgICAgICAgICAgICAgICAgICArICJmb3IgYW55IG9mIHRoZSBzcGVjaWZpZWQgZmlsdGVyIG5hbWUgYW5kIHZhbHVlLCBpZiBhIG1vZHVsZSBoYXMgYSBtZXRhZGF0YSAiCi0gICAgICAgICAgICAgICAgICAgICsgImZpZWxkIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQgdmFsdWUsIGl0IHdpbGwgYmUgaW5jbHVkZWQuIFdoZW4gYm90aCBtb2R1bGUgIgotICAgICAgICAgICAgICAgICAgICArICJpbmNsdXNpb24gYW5kIGV4Y2x1c2lvbiBydWxlcyBhcmUgYXBwbGllZCwgaW5jbHVzaW9uIHJ1bGVzIHdpbGwgYmUgIgotICAgICAgICAgICAgICAgICAgICArICJldmFsdWF0ZWQgZmlyc3QuIFVzaW5nIHRoaXMgdG9nZXRoZXIgd2l0aCB0ZXN0IGZpbHRlciBpbmNsdXNpb24gcnVsZXMgbWF5ICIKLSAgICAgICAgICAgICAgICAgICAgKyAicmVzdWx0IGluIG5vIHRlc3RzIHRvIGV4ZWN1dGUgaWYgdGhlIHJ1bGVzIGRvbid0IG92ZXJsYXAuIikKLSAgICBwcml2YXRlIE11bHRpTWFwPFN0cmluZywgU3RyaW5nPiBtTW9kdWxlTWV0YWRhdGFJbmNsdWRlRmlsdGVyID0gbmV3IE11bHRpTWFwPD4oKTsKLQotICAgIEBPcHRpb24obmFtZSA9ICJtb2R1bGUtbWV0YWRhdGEtZXhjbHVkZS1maWx0ZXIiLAotICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAiRXhjbHVkZSBtb2R1bGVzIGZvciBleGVjdXRpb24gYmFzZWQgb24gbWF0Y2hpbmcgb2YgbWV0YWRhdGEgZmllbGRzOiAiCi0gICAgICAgICAgICAgICAgICAgICsgImZvciBhbnkgb2YgdGhlIHNwZWNpZmllZCBmaWx0ZXIgbmFtZSBhbmQgdmFsdWUsIGlmIGEgbW9kdWxlIGhhcyBhIG1ldGFkYXRhICIKLSAgICAgICAgICAgICAgICAgICAgKyAiZmllbGQgd2l0aCB0aGUgc2FtZSBuYW1lIGFuZCB2YWx1ZSwgaXQgd2lsbCBiZSBleGNsdWRlZC4gV2hlbiBib3RoIG1vZHVsZSAiCi0gICAgICAgICAgICAgICAgICAgICsgImluY2x1c2lvbiBhbmQgZXhjbHVzaW9uIHJ1bGVzIGFyZSBhcHBsaWVkLCBpbmNsdXNpb24gcnVsZXMgd2lsbCBiZSAiCi0gICAgICAgICAgICAgICAgICAgICsgImV2YWx1YXRlZCBmaXJzdC4iKQotICAgIHByaXZhdGUgTXVsdGlNYXA8U3RyaW5nLCBTdHJpbmc+IG1Nb2R1bGVNZXRhZGF0YUV4Y2x1ZGVGaWx0ZXIgPSBuZXcgTXVsdGlNYXA8PigpOwotCi0gICAgcHJpdmF0ZSBNb2R1bGVSZXBvU3VpdGUgbU1vZHVsZVJlcG8gPSBuZXcgTW9kdWxlUmVwb1N1aXRlKCk7Ci0gICAgcHJpdmF0ZSBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIgbUJ1aWxkSGVscGVyOwotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMaW5rZWRIYXNoTWFwPFN0cmluZywgSUNvbmZpZ3VyYXRpb24+IGxvYWRUZXN0cygpIHsKLSAgICAgICAgaWYgKG1SZXRyeVNlc3Npb25JZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCItLXJldHJ5IGNhbm5vdCBiZSBzcGVjaWZpZWQgd2l0aCBjdHMtc3VpdGUueG1sLiAiCi0gICAgICAgICAgICAgICAgICAgICsgIlVzZSAncnVuIGN0cyAtLXJldHJ5IDxzZXNzaW9uIGlkPicgaW5zdGVhZC4iKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2V0dXBGaWx0ZXJzKCk7Ci0gICAgICAgICAgICBTZXQ8SUFiaT4gYWJpcyA9IGdldEFiaXMoZ2V0RGV2aWNlKCkpOwotICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcmVwb3NpdG9yeSwge0BsaW5rIENvbXBhdGliaWxpdHlCdWlsZEhlbHBlciNnZXRUZXN0c0Rpcn0gY2FuCi0gICAgICAgICAgICAvLyB0aHJvdyBhIHtAbGluayBGaWxlTm90Rm91bmRFeGNlcHRpb259Ci0gICAgICAgICAgICByZXR1cm4gbU1vZHVsZVJlcG8ubG9hZENvbmZpZ3MobUJ1aWxkSGVscGVyLmdldFRlc3RzRGlyKCksCi0gICAgICAgICAgICAgICAgICAgIGFiaXMsIG1UZXN0QXJncywgbU1vZHVsZUFyZ3MsIG1JbmNsdWRlRmlsdGVycywKLSAgICAgICAgICAgICAgICAgICAgbUV4Y2x1ZGVGaWx0ZXJzLCBtTW9kdWxlTWV0YWRhdGFJbmNsdWRlRmlsdGVyLCBtTW9kdWxlTWV0YWRhdGFFeGNsdWRlRmlsdGVyKTsKLSAgICAgICAgfSBjYXRjaCAoRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEJ1aWxkKElCdWlsZEluZm8gYnVpbGRJbmZvKSB7Ci0gICAgICAgIHN1cGVyLnNldEJ1aWxkKGJ1aWxkSW5mbyk7Ci0gICAgICAgIG1CdWlsZEhlbHBlciA9IG5ldyBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIoYnVpbGRJbmZvKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzZXQgb2YgQUJJcyBzdXBwb3J0ZWQgYnkgYm90aCBDb21wYXRpYmlsaXR5IGFuZCB0aGUgZGV2aWNlIHVuZGVyIHRlc3QKLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHNldCBvZiBBQklzIHRvIHJ1biB0aGUgdGVzdHMgb24KLSAgICAgKiBAdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbgotICAgICAqLwotICAgIFNldDxJQWJpPiBnZXRBYmlzKElUZXN0RGV2aWNlIGRldmljZSkgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFNldDxJQWJpPiBhYmlzID0gbmV3IExpbmtlZEhhc2hTZXQ8PigpOwotICAgICAgICBTZXQ8U3RyaW5nPiBhcmNoQWJpcyA9IGdldEFiaXNGb3JCdWlsZFRhcmdldEFyY2goKTsKLSAgICAgICAgaWYgKG1QcmltYXJ5QWJpUnVuKSB7Ci0gICAgICAgICAgICBpZiAobUFiaU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgcHJpbWFyeSBmcm9tIHRoZSBkZXZpY2UgYW5kIG1ha2UgaXQgdGhlIC0tYWJpIHRvIHJ1bi4KLSAgICAgICAgICAgICAgICBtQWJpTmFtZSA9IGRldmljZS5nZXRQcm9wZXJ0eShQUk9EVUNUX0NQVV9BQklfS0VZKS50cmltKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIENMb2cuZCgiT3B0aW9uIC0tJXMgc3VwZXJzZWRlcyB0aGUgb3B0aW9uIC0tJXMsIHVzaW5nIGFiaTogJXMiLCBBQklfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgUFJJTUFSWV9BQklfUlVOLCBtQWJpTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1BYmlOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIEEgcGFydGljdWxhciBhYmkgd2FzIHJlcXVlc3RlZCwgaXQgc3RpbGwgbmVlZHMgdG8gYmUgc3VwcG9ydGVkIGJ5IHRoZSBidWlsZC4KLSAgICAgICAgICAgIGlmICgoIW1Ta2lwSG9zdEFyY2hDaGVjayAmJiAhYXJjaEFiaXMuY29udGFpbnMobUFiaU5hbWUpKSB8fAotICAgICAgICAgICAgICAgICAgICAhQWJpVXRpbHMuaXNBYmlTdXBwb3J0ZWRCeUNvbXBhdGliaWxpdHkobUFiaU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJZb3VyIENUUyBoYXNuJ3QgYmVlbiBidWlsdCB3aXRoICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgImFiaSAnJXMnIHN1cHBvcnQsIHRoaXMgQ1RTIGN1cnJlbnRseSBzdXBwb3J0cyAnJXMnLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtQWJpTmFtZSwgYXJjaEFiaXMpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYWJpcy5hZGQobmV3IEFiaShtQWJpTmFtZSwgQWJpVXRpbHMuZ2V0Qml0bmVzcyhtQWJpTmFtZSkpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gYWJpczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFJ1biBvbiBhbGwgYWJpIGluIGNvbW1vbiBiZXR3ZWVuIHRoZSBkZXZpY2UgYW5kIENUUy4KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBkZXZpY2VBYmlzID0gQXJyYXlzLmFzTGlzdChBYmlGb3JtYXR0ZXIuZ2V0U3VwcG9ydGVkQWJpcyhkZXZpY2UsICIiKSk7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBhYmkgOiBkZXZpY2VBYmlzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKChtU2tpcEhvc3RBcmNoQ2hlY2sgfHwgYXJjaEFiaXMuY29udGFpbnMoYWJpKSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIEFiaVV0aWxzLmlzQWJpU3VwcG9ydGVkQnlDb21wYXRpYmlsaXR5KGFiaSkpIHsKLSAgICAgICAgICAgICAgICAgICAgYWJpcy5hZGQobmV3IEFiaShhYmksIEFiaVV0aWxzLmdldEJpdG5lc3MoYWJpKSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIENMb2cuZCgiYWJpICclcycgaXMgc3VwcG9ydGVkIGJ5IGRldmljZSBidXQgbm90IGJ5IHRoaXMgQ1RTIGJ1aWxkICglcyksIHRlc3RzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJ3aWxsIG5vdCBydW4gYWdhaW5zdCBpdC4iLCBhYmksIGFyY2hBYmlzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYWJpcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIk5vbmUgb2YgdGhlIGFiaSBzdXBwb3J0ZWQgYnkgdGhpcyIKLSAgICAgICAgICAgICAgICAgICAgICAgKyAiIENUUyBidWlsZCAoJyVzJykgYXJlIHN1cHBvcnRlZCBieSB0aGUgZGV2aWNlICgnJXMnKS4iLAotICAgICAgICAgICAgICAgICAgICAgICBhcmNoQWJpcywgZGV2aWNlQWJpcykpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGFiaXM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGFiaXMgc3VwcG9ydGVkIGJ5IHRoZSBIb3N0IGJ1aWxkIHRhcmdldCBhcmNoaXRlY3R1cmUuCi0gICAgICogRXhwb3NlZCBmb3IgdGVzdGluZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU2V0PFN0cmluZz4gZ2V0QWJpc0ZvckJ1aWxkVGFyZ2V0QXJjaCgpIHsKLSAgICAgICAgcmV0dXJuIEFiaVV0aWxzLmdldEFiaXNGb3JBcmNoKFRlc3RTdWl0ZUluZm8uZ2V0SW5zdGFuY2UoKS5nZXRUYXJnZXRBcmNoKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGluY2x1ZGUvZXhjbHVkZSBmaWx0ZXJzIHVwIGJhc2VkIG9uIGlmIGEgbW9kdWxlIG5hbWUgd2FzIGdpdmVuIG9yIHdoZXRoZXIgdGhpcyBpcyBhCi0gICAgICogcmV0cnkgcnVuLgotICAgICAqLwotICAgIHZvaWQgc2V0dXBGaWx0ZXJzKCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChtU3ViUGxhbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEZpbGUgc3ViUGxhbkZpbGUgPSBuZXcgRmlsZShtQnVpbGRIZWxwZXIuZ2V0U3ViUGxhbnNEaXIoKSwgbVN1YlBsYW4gKyAiLnhtbCIpOwotICAgICAgICAgICAgICAgIGlmICghc3ViUGxhbkZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJDb3VsZCBub3QgcmV0cmlldmUgc3VicGxhbiBcIiVzXCIiLCBtU3ViUGxhbikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBzdWJQbGFuSW5wdXRTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHN1YlBsYW5GaWxlKTsKLSAgICAgICAgICAgICAgICBJU3ViUGxhbiBzdWJQbGFuID0gbmV3IFN1YlBsYW4oKTsKLSAgICAgICAgICAgICAgICBzdWJQbGFuLnBhcnNlKHN1YlBsYW5JbnB1dFN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgbUluY2x1ZGVGaWx0ZXJzLmFkZEFsbChzdWJQbGFuLmdldEluY2x1ZGVGaWx0ZXJzKCkpOwotICAgICAgICAgICAgICAgIG1FeGNsdWRlRmlsdGVycy5hZGRBbGwoc3ViUGxhbi5nZXRFeGNsdWRlRmlsdGVycygpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIlVuYWJsZSB0byBmaW5kIG9yIHBhcnNlIHN1YnBsYW4gJXMiLCBtU3ViUGxhbiksIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChtTW9kdWxlTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMaXN0PFN0cmluZz4gbW9kdWxlcyA9IE1vZHVsZVJlcG9TdWl0ZS5nZXRNb2R1bGVOYW1lc01hdGNoaW5nKAotICAgICAgICAgICAgICAgICAgICBtQnVpbGRIZWxwZXIuZ2V0VGVzdHNEaXIoKSwgbU1vZHVsZU5hbWUpOwotICAgICAgICAgICAgaWYgKG1vZHVsZXMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiTm8gbW9kdWxlcyBmb3VuZCBtYXRjaGluZyAlcyIsIG1Nb2R1bGVOYW1lKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1vZHVsZXMuc2l6ZSgpID4gMSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNdWx0aXBsZSBtb2R1bGVzIGZvdW5kIG1hdGNoaW5nICVzOlxuJXNcbldoaWNoIG9uZSBkaWQgeW91IG1lYW4/XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgbU1vZHVsZU5hbWUsIEFycmF5VXRpbC5qb2luKCJcbiIsIG1vZHVsZXMpKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFN0cmluZyBtb2R1bGVOYW1lID0gbW9kdWxlcy5nZXQoMCk7Ci0gICAgICAgICAgICAgICAgY2hlY2tGaWx0ZXJzKG1JbmNsdWRlRmlsdGVycywgbW9kdWxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgY2hlY2tGaWx0ZXJzKG1FeGNsdWRlRmlsdGVycywgbW9kdWxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgbUluY2x1ZGVGaWx0ZXJzLmFkZChuZXcgVGVzdEZpbHRlcihtQWJpTmFtZSwgbW9kdWxlTmFtZSwgbVRlc3ROYW1lKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChtVGVzdE5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIlRlc3QgbmFtZSBnaXZlbiB3aXRob3V0IG1vZHVsZSBuYW1lLiBBZGQgLS1tb2R1bGUgPG1vZHVsZS1uYW1lPiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogSGVscGVyIG1ldGhvZCBkZXNpZ25lZCB0byByZW1vdmUgZmlsdGVycyBpbiBhIGxpc3Qgbm90IGFwcGxpY2FibGUgdG8gdGhlIGdpdmVuIG1vZHVsZSAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tGaWx0ZXJzKFNldDxTdHJpbmc+IGZpbHRlcnMsIFN0cmluZyBtb2R1bGVOYW1lKSB7Ci0gICAgICAgIFNldDxTdHJpbmc+IGNsZWFuZWRGaWx0ZXJzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICBmb3IgKFN0cmluZyBmaWx0ZXIgOiBmaWx0ZXJzKSB7Ci0gICAgICAgICAgICBpZiAobW9kdWxlTmFtZS5lcXVhbHMoVGVzdEZpbHRlci5jcmVhdGVGcm9tKGZpbHRlcikuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgIGNsZWFuZWRGaWx0ZXJzLmFkZChmaWx0ZXIpOyAvLyBNb2R1bGUgbmFtZSBtYXRjaGVzLCBmaWx0ZXIgcGFzc2VzCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmlsdGVycy5jbGVhcigpOwotICAgICAgICBmaWx0ZXJzLmFkZEFsbChjbGVhbmVkRmlsdGVycyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBpbmNsdWRlLWZpbHRlcnMgZm9yIHRoZSBjb21wYXRpYmlsaXR5IHRlc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbmNsdWRlRmlsdGVyKFNldDxTdHJpbmc+IGluY2x1ZGVGaWx0ZXJzKSB7Ci0gICAgICAgIG1JbmNsdWRlRmlsdGVycy5hZGRBbGwoaW5jbHVkZUZpbHRlcnMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgZXhjbHVkZS1maWx0ZXJzIGZvciB0aGUgY29tcGF0aWJpbGl0eSB0ZXN0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXhjbHVkZUZpbHRlcihTZXQ8U3RyaW5nPiBleGNsdWRlRmlsdGVycykgewotICAgICAgICBtRXhjbHVkZUZpbHRlcnMuYWRkQWxsKGV4Y2x1ZGVGaWx0ZXJzKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC90ZXN0dHlwZS9zdWl0ZS9Nb2R1bGVSZXBvU3VpdGUuamF2YSBiL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3Rlc3R0eXBlL3N1aXRlL01vZHVsZVJlcG9TdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODg5MzMwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3Rlc3R0eXBlL3N1aXRlL01vZHVsZVJlcG9TdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5zdWl0ZTsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuVGVzdEZpbHRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5jb25maWcuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5jb25maWcuQ29uZmlndXJhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuY29uZmlnLklDb25maWd1cmF0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmNvbmZpZy5JQ29uZmlndXJhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQubG9nLkxvZ1V0aWwuQ0xvZzsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLklUYXJnZXRQcmVwYXJlcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JQWJpOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLklBYmlSZWNlaXZlcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JUmVtb3RlVGVzdDsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JVGVzdEZpbGVGaWx0ZXJSZWNlaXZlcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JVGVzdEZpbHRlclJlY2VpdmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnV0aWwuQWJpVXRpbHM7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudXRpbC5GaWxlVXRpbDsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC51dGlsLk11bHRpTWFwOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnV0aWwuU3RyZWFtVXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVuYW1lRmlsdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIFJldHJpZXZlcyBDb21wYXRpYmlsaXR5IHRlc3QgbW9kdWxlIGRlZmluaXRpb25zIGZyb20gdGhlIHJlcG9zaXRvcnkuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGVSZXBvU3VpdGUgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19FWFQgPSAiLmNvbmZpZyI7Ci0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+PiBtVGVzdEFyZ3MgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+PiBtTW9kdWxlQXJncyA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUluY2x1ZGVBbGw7Ci0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBMaXN0PFRlc3RGaWx0ZXI+PiBtSW5jbHVkZUZpbHRlcnMgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBMaXN0PFRlc3RGaWx0ZXI+PiBtRXhjbHVkZUZpbHRlcnMgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkZhY3RvcnkgbUNvbmZpZ0ZhY3RvcnkgPSBDb25maWd1cmF0aW9uRmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotCi0gICAgLyoqCi0gICAgICogTWFpbiBsb2FkaW5nIG9mIGNvbmZpZ3VyYXRpb25zLCBsb29raW5nIGludG8gdGVzdGNhc2VzLyBmb2xkZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlua2VkSGFzaE1hcDxTdHJpbmcsIElDb25maWd1cmF0aW9uPiBsb2FkQ29uZmlncyhGaWxlIHRlc3RzRGlyLCBTZXQ8SUFiaT4gYWJpcywKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiB0ZXN0QXJncywgTGlzdDxTdHJpbmc+IG1vZHVsZUFyZ3MsCi0gICAgICAgICAgICBTZXQ8U3RyaW5nPiBpbmNsdWRlRmlsdGVycywgU2V0PFN0cmluZz4gZXhjbHVkZUZpbHRlcnMsCi0gICAgICAgICAgICBNdWx0aU1hcDxTdHJpbmcsIFN0cmluZz4gbWV0YWRhdGFJbmNsdWRlRmlsdGVycywKLSAgICAgICAgICAgIE11bHRpTWFwPFN0cmluZywgU3RyaW5nPiBtZXRhZGF0YUV4Y2x1ZGVGaWx0ZXJzKSB7Ci0gICAgICAgIENMb2cuZCgiSW5pdGlhbGl6aW5nIE1vZHVsZVJlcG9cblRlc3RzIERpcjolc1xuQUJJczolc1xuIiArCi0gICAgICAgICAgICAgICAgIlRlc3QgQXJnczolc1xuTW9kdWxlIEFyZ3M6JXNcbkluY2x1ZGVzOiVzXG5FeGNsdWRlczolcyIsCi0gICAgICAgICAgICAgICAgdGVzdHNEaXIuZ2V0QWJzb2x1dGVQYXRoKCksIGFiaXMsIHRlc3RBcmdzLCBtb2R1bGVBcmdzLAotICAgICAgICAgICAgICAgIGluY2x1ZGVGaWx0ZXJzLCBleGNsdWRlRmlsdGVycyk7Ci0KLSAgICAgICAgTGlua2VkSGFzaE1hcDxTdHJpbmcsIElDb25maWd1cmF0aW9uPiB0b1J1biA9IG5ldyBMaW5rZWRIYXNoTWFwPD4oKTsKLQotICAgICAgICBwdXRBcmdzKHRlc3RBcmdzLCBtVGVzdEFyZ3MpOwotICAgICAgICBwdXRBcmdzKG1vZHVsZUFyZ3MsIG1Nb2R1bGVBcmdzKTsKLSAgICAgICAgbUluY2x1ZGVBbGwgPSBpbmNsdWRlRmlsdGVycy5pc0VtcHR5KCk7Ci0gICAgICAgIC8vIEluY2x1ZGUgYWxsIHRoZSBpbmNsdXNpb25zCi0gICAgICAgIGFkZEZpbHRlcnMoaW5jbHVkZUZpbHRlcnMsIG1JbmNsdWRlRmlsdGVycywgYWJpcyk7Ci0gICAgICAgIC8vIEV4Y2x1ZGUgYWxsIHRoZSBleGNsdXNpb25zCi0gICAgICAgIGFkZEZpbHRlcnMoZXhjbHVkZUZpbHRlcnMsIG1FeGNsdWRlRmlsdGVycywgYWJpcyk7Ci0KLSAgICAgICAgRmlsZVtdIGNvbmZpZ0ZpbGVzID0gdGVzdHNEaXIubGlzdEZpbGVzKG5ldyBDb25maWdGaWx0ZXIoKSk7Ci0gICAgICAgIGlmIChjb25maWdGaWxlcy5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiTm8gY29uZmlnIGZpbGVzIGZvdW5kIGluICVzIiwgdGVzdHNEaXIuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKLSAgICAgICAgfQotICAgICAgICAvLyBFbnN1cmUgc3RhYmxlIGluaXRpYWwgb3JkZXIgb2YgY29uZmlndXJhdGlvbnMuCi0gICAgICAgIExpc3Q8RmlsZT4gbGlzdENvbmZpZ0ZpbGVzID0gQXJyYXlzLmFzTGlzdChjb25maWdGaWxlcyk7Ci0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQobGlzdENvbmZpZ0ZpbGVzKTsKLSAgICAgICAgZm9yIChGaWxlIGNvbmZpZ0ZpbGUgOiBsaXN0Q29uZmlnRmlsZXMpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gY29uZmlnRmlsZS5nZXROYW1lKCkucmVwbGFjZShDT05GSUdfRVhULCAiIik7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBwYXRoQXJnID0gbmV3IFN0cmluZ1tdIHsgY29uZmlnRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSB9OwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyBJbnZva2VzIHBhcnNlciB0byBwcm9jZXNzIHRoZSB0ZXN0IG1vZHVsZSBjb25maWcgZmlsZQotICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gZ2VuZXJhdGUgYSBkaWZmZXJlbnQgY29uZmlnIGZvciBlYWNoIEFCSSBhcyB3ZSBjYW5ub3QgZ3VhcmFudGVlIHRoZQotICAgICAgICAgICAgICAgIC8vIGNvbmZpZ3MgYXJlIGlkZW1wb3RlbnQuIFRoaXMgaG93ZXZlciBtZWFucyB3ZSBwYXJzZSB0aGUgc2FtZSBmaWxlIG11bHRpcGxlIHRpbWVzCi0gICAgICAgICAgICAgICAgZm9yIChJQWJpIGFiaSA6IGFiaXMpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGlkID0gQWJpVXRpbHMuY3JlYXRlSWQoYWJpLmdldE5hbWUoKSwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghc2hvdWxkUnVuTW9kdWxlKGlkKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIG1vZHVsZSBzaG91bGQgbm90IHJ1biB0ZXN0cyBiYXNlZCBvbiB0aGUgc3RhdGUgb2YgZmlsdGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNraXAgdGhpcyBuYW1lL2FiaSBjb21iaW5hdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIElDb25maWd1cmF0aW9uIGNvbmZpZyA9IG1Db25maWdGYWN0b3J5LmNyZWF0ZUNvbmZpZ3VyYXRpb25Gcm9tQXJncyhwYXRoQXJnKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWx0ZXJCeUNvbmZpZ01ldGFkYXRhKGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YUluY2x1ZGVGaWx0ZXJzLCBtZXRhZGF0YUV4Y2x1ZGVGaWx0ZXJzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIG1vZHVsZSBjb25maWcgZGlkIG5vdCBwYXNzIHRoZSBtZXRhZGF0YSBmaWx0ZXJzLCBpdCdzIGV4Y2x1ZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBmcm9tIGV4ZWN1dGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBhcmdzID0gbmV3IEhhc2hNYXA8PigpOwotICAgICAgICAgICAgICAgICAgICBpZiAobU1vZHVsZUFyZ3MuY29udGFpbnNLZXkobmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MucHV0QWxsKG1Nb2R1bGVBcmdzLmdldChuYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1Nb2R1bGVBcmdzLmNvbnRhaW5zS2V5KGlkKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5wdXRBbGwobU1vZHVsZUFyZ3MuZ2V0KGlkKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaW5qZWN0T3B0aW9uc1RvQ29uZmlnKGFyZ3MsIGNvbmZpZyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgTGlzdDxJUmVtb3RlVGVzdD4gdGVzdHMgPSBjb25maWcuZ2V0VGVzdHMoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChJUmVtb3RlVGVzdCB0ZXN0IDogdGVzdHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSB0ZXN0LmdldENsYXNzKCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiB0ZXN0QXJnc01hcCA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVGVzdEFyZ3MuY29udGFpbnNLZXkoY2xhc3NOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RBcmdzTWFwLnB1dEFsbChtVGVzdEFyZ3MuZ2V0KGNsYXNzTmFtZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaW5qZWN0T3B0aW9uc1RvQ29uZmlnKHRlc3RBcmdzTWFwLCBjb25maWcpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWRkRmlsdGVyc1RvVGVzdCh0ZXN0LCBhYmksIG5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlc3QgaW5zdGFuY2VvZiBJQWJpUmVjZWl2ZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElBYmlSZWNlaXZlcil0ZXN0KS5zZXRBYmkoYWJpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBMaXN0PElUYXJnZXRQcmVwYXJlcj4gcHJlcGFyZXJzID0gY29uZmlnLmdldFRhcmdldFByZXBhcmVycygpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKElUYXJnZXRQcmVwYXJlciBwcmVwYXJlciA6IHByZXBhcmVycykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXBhcmVyIGluc3RhbmNlb2YgSUFiaVJlY2VpdmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJQWJpUmVjZWl2ZXIpcHJlcGFyZXIpLnNldEFiaShhYmkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgYWJpIHRvIHRoZSBkZXNjcmlwdGlvbgotICAgICAgICAgICAgICAgICAgICBjb25maWcuZ2V0Q29uZmlndXJhdGlvbkRlc2NyaXB0aW9uKCkuc2V0QWJpKGFiaSk7Ci0gICAgICAgICAgICAgICAgICAgIHRvUnVuLnB1dChpZCwgY29uZmlnKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJFcnJvciBwYXJzaW5nIGNvbmZpZyBmaWxlOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25maWdGaWxlLmdldE5hbWUoKSksIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0b1J1bjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIZWxwZXIgdG8gaW5qZWN0IG9wdGlvbnMgdG8gYSBjb25maWcuCi0gICAgICovCi0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgdm9pZCBpbmplY3RPcHRpb25zVG9Db25maWcoTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBvcHRpb25NYXAsIElDb25maWd1cmF0aW9uIGNvbmZpZykKLSAgICAgICAgICAgIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uewotICAgICAgICBmb3IgKEVudHJ5PFN0cmluZywgTGlzdDxTdHJpbmc+PiBlbnRyeSA6IG9wdGlvbk1hcC5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBlbnRyeVZhbHVlIDogZW50cnkuZ2V0VmFsdWUoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBlbnRyeU5hbWUgPSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgICAgICBpZiAoZW50cnlWYWx1ZS5jb250YWlucygiOj0iKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBlbnRyeVZhbHVlIGlzIGtleS12YWx1ZSBwYWlyCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBlbnRyeVZhbHVlLnN1YnN0cmluZygwLCBlbnRyeVZhbHVlLmluZGV4T2YoIjo9IikpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBlbnRyeVZhbHVlLnN1YnN0cmluZyhlbnRyeVZhbHVlLmluZGV4T2YoIjo9IikgKyAyKTsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnLmluamVjdE9wdGlvblZhbHVlKGVudHJ5TmFtZSwga2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZW50cnlWYWx1ZSBpcyBqdXN0IHRoZSBhcmd1bWVudCB2YWx1ZQotICAgICAgICAgICAgICAgICAgICBjb25maWcuaW5qZWN0T3B0aW9uVmFsdWUoZW50cnlOYW1lLCBlbnRyeVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBmaWx0ZXJCeUNvbmZpZ01ldGFkYXRhKElDb25maWd1cmF0aW9uIGNvbmZpZywKLSAgICAgICAgICAgIE11bHRpTWFwPFN0cmluZywgU3RyaW5nPiBpbmNsdWRlLCBNdWx0aU1hcDxTdHJpbmcsIFN0cmluZz4gZXhjbHVkZSkgewotICAgICAgICBNdWx0aU1hcDxTdHJpbmcsIFN0cmluZz4gbWV0YWRhdGEgPSBjb25maWcuZ2V0Q29uZmlndXJhdGlvbkRlc2NyaXB0aW9uKCkuZ2V0QWxsTWV0YURhdGEoKTsKLSAgICAgICAgYm9vbGVhbiBzaG91bGRJbmNsdWRlID0gZmFsc2U7Ci0gICAgICAgIGZvciAoU3RyaW5nIGtleSA6IGluY2x1ZGUua2V5U2V0KCkpIHsKLSAgICAgICAgICAgIFNldDxTdHJpbmc+IGZpbHRlcnMgPSBuZXcgSGFzaFNldDw+KGluY2x1ZGUuZ2V0KGtleSkpOwotICAgICAgICAgICAgaWYgKG1ldGFkYXRhLmNvbnRhaW5zS2V5KGtleSkpIHsKLSAgICAgICAgICAgICAgICBmaWx0ZXJzLnJldGFpbkFsbChtZXRhZGF0YS5nZXQoa2V5KSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFmaWx0ZXJzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBpbmNsdXNpb24gZmlsdGVyIGlzIG5vdCBlbXB0eSBhbmQgdGhlcmUncyBhdCBsZWFzdCBvbmUgbWF0Y2hpbmcgaW5jbHVzaW9uCi0gICAgICAgICAgICAgICAgICAgIC8vIHJ1bGUgc28gdGhlcmUncyBubyBuZWVkIHRvIG1hdGNoIG90aGVyIGluY2x1c2lvbiBydWxlcwotICAgICAgICAgICAgICAgICAgICBzaG91bGRJbmNsdWRlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICghaW5jbHVkZS5pc0VtcHR5KCkgJiYgIXNob3VsZEluY2x1ZGUpIHsKLSAgICAgICAgICAgIC8vIGlmIGluY2x1c2lvbiBmaWx0ZXIgaXMgbm90IGVtcHR5IGFuZCB3ZSBkaWRuJ3QgZmluZCBhIG1hdGNoLCB0aGUgbW9kdWxlIHdpbGwgbm90IGJlCi0gICAgICAgICAgICAvLyBpbmNsdWRlZAotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIC8vIE5vdyBldmFsdWF0ZSBleGNsdXNpb24gcnVsZXMsIHRoaXMgb3JkZXJpbmcgYWxzbyBtZWFucyB0aGF0IGV4Y2x1c2lvbiBydWxlcyBtYXkgb3ZlcnJpZGUKLSAgICAgICAgLy8gaW5jbHVzaW9uIHJ1bGVzOiBhIGNvbmZpZyBhbHJlYWR5IG1hdGNoZWQgZm9yIGluY2x1c2lvbiBtYXkgc3RpbGwgYmUgZXhjbHVkZWQgaWYgbWF0Y2hpbmcKLSAgICAgICAgLy8gcnVsZXMgZXhpc3QKLSAgICAgICAgZm9yIChTdHJpbmcga2V5IDogZXhjbHVkZS5rZXlTZXQoKSkgewotICAgICAgICAgICAgU2V0PFN0cmluZz4gZmlsdGVycyA9IG5ldyBIYXNoU2V0PD4oZXhjbHVkZS5nZXQoa2V5KSk7Ci0gICAgICAgICAgICBpZiAobWV0YWRhdGEuY29udGFpbnNLZXkoa2V5KSkgewotICAgICAgICAgICAgICAgIGZpbHRlcnMucmV0YWluQWxsKG1ldGFkYXRhLmdldChrZXkpKTsKLSAgICAgICAgICAgICAgICBpZiAoIWZpbHRlcnMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHdlIGZvdW5kIGF0IGxlYXN0IG9uZSBtYXRjaGluZyBleGNsdXNpb24gcnVsZXMsIHNvIHdlIGFyZSBleGNsdWRpbmcgdGhpcwotICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIG1vZHVsZQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIHdlJ3ZlIG1hdGNoZWQgYXQgbGVhc3Qgb25lIGluY2x1c2lvbiBydWxlIChpZiB0aGVyZSdzIGFueSkgQU5EIHdlIGRpZG4ndCBtYXRjaCBhbnkgb2YgdGhlCi0gICAgICAgIC8vIGV4Y2x1c2lvbiBydWxlcyAoaWYgdGhlcmUncyBhbnkpCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBMaXN0fSBvZiBtb2R1bGVzIHdob3NlIG5hbWUgY29udGFpbnMgdGhlIGdpdmVuIHBhdHRlcm4uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gZ2V0TW9kdWxlTmFtZXNNYXRjaGluZyhGaWxlIGRpcmVjdG9yeSwgU3RyaW5nIHBhdHRlcm4pIHsKLSAgICAgICAgU3RyaW5nW10gbmFtZXMgPSBkaXJlY3RvcnkubGlzdChuZXcgRmlsZW5hbWVGaWx0ZXIoKXsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZGlyLCBTdHJpbmcgbmFtZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBuYW1lLmNvbnRhaW5zKHBhdHRlcm4pICYmIG5hbWUuZW5kc1dpdGgoQ09ORklHX0VYVCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBMaXN0PFN0cmluZz4gbW9kdWxlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihuYW1lcy5sZW5ndGgpOwotICAgICAgICBmb3IgKFN0cmluZyBuYW1lIDogbmFtZXMpIHsKLSAgICAgICAgICAgIGludCBpbmRleCA9IG5hbWUuaW5kZXhPZihDT05GSUdfRVhUKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+IDApIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbW9kdWxlID0gbmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotICAgICAgICAgICAgICAgIGlmIChtb2R1bGUuZXF1YWxzKHBhdHRlcm4pKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFBhdHRlcm4gcmVwcmVzZW50cyBhIHNpbmdsZSBtb2R1bGUsIGp1c3QgcmV0dXJuIGEgc2luZ2xlLWl0ZW0gbGlzdAotICAgICAgICAgICAgICAgICAgICBtb2R1bGVzID0gbmV3IEFycmF5TGlzdDw+KDEpOwotICAgICAgICAgICAgICAgICAgICBtb2R1bGVzLmFkZChtb2R1bGUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9kdWxlczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbW9kdWxlcy5hZGQobW9kdWxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbW9kdWxlczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkRmlsdGVycyhTZXQ8U3RyaW5nPiBzdHJpbmdGaWx0ZXJzLAotICAgICAgICAgICAgTWFwPFN0cmluZywgTGlzdDxUZXN0RmlsdGVyPj4gZmlsdGVycywgU2V0PElBYmk+IGFiaXMpIHsKLSAgICAgICAgZm9yIChTdHJpbmcgZmlsdGVyU3RyaW5nIDogc3RyaW5nRmlsdGVycykgewotICAgICAgICAgICAgVGVzdEZpbHRlciBmaWx0ZXIgPSBUZXN0RmlsdGVyLmNyZWF0ZUZyb20oZmlsdGVyU3RyaW5nKTsKLSAgICAgICAgICAgIFN0cmluZyBhYmkgPSBmaWx0ZXIuZ2V0QWJpKCk7Ci0gICAgICAgICAgICBpZiAoYWJpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKElBYmkgYSA6IGFiaXMpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkRmlsdGVyKGEuZ2V0TmFtZSgpLCBmaWx0ZXIsIGZpbHRlcnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYWRkRmlsdGVyKGFiaSwgZmlsdGVyLCBmaWx0ZXJzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRGaWx0ZXIoU3RyaW5nIGFiaSwgVGVzdEZpbHRlciBmaWx0ZXIsCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBMaXN0PFRlc3RGaWx0ZXI+PiBmaWx0ZXJzKSB7Ci0gICAgICAgIGdldEZpbHRlckxpc3QoZmlsdGVycywgQWJpVXRpbHMuY3JlYXRlSWQoYWJpLCBmaWx0ZXIuZ2V0TmFtZSgpKSkuYWRkKGZpbHRlcik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0PFRlc3RGaWx0ZXI+IGdldEZpbHRlckxpc3QoTWFwPFN0cmluZywgTGlzdDxUZXN0RmlsdGVyPj4gZmlsdGVycywgU3RyaW5nIGlkKSB7Ci0gICAgICAgIExpc3Q8VGVzdEZpbHRlcj4gZnMgPSBmaWx0ZXJzLmdldChpZCk7Ci0gICAgICAgIGlmIChmcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBmcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgZmlsdGVycy5wdXQoaWQsIGZzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZnM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZEZpbHRlcnNUb1Rlc3QoSVJlbW90ZVRlc3QgdGVzdCwgSUFiaSBhYmksIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIFN0cmluZyBtb2R1bGVJZCA9IEFiaVV0aWxzLmNyZWF0ZUlkKGFiaS5nZXROYW1lKCksIG5hbWUpOwotICAgICAgICBpZiAoISh0ZXN0IGluc3RhbmNlb2YgSVRlc3RGaWx0ZXJSZWNlaXZlcikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgIlRlc3QgaW4gbW9kdWxlICVzIG11c3QgaW1wbGVtZW50IElUZXN0RmlsdGVyUmVjZWl2ZXIuIiwgbW9kdWxlSWQpKTsKLSAgICAgICAgfQotICAgICAgICBMaXN0PFRlc3RGaWx0ZXI+IG1kSW5jbHVkZXMgPSBnZXRGaWx0ZXJMaXN0KG1JbmNsdWRlRmlsdGVycywgbW9kdWxlSWQpOwotICAgICAgICBMaXN0PFRlc3RGaWx0ZXI+IG1kRXhjbHVkZXMgPSBnZXRGaWx0ZXJMaXN0KG1FeGNsdWRlRmlsdGVycywgbW9kdWxlSWQpOwotICAgICAgICBpZiAoIW1kSW5jbHVkZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBhZGRUZXN0SW5jbHVkZXMoKElUZXN0RmlsdGVyUmVjZWl2ZXIpIHRlc3QsIG1kSW5jbHVkZXMsIG5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghbWRFeGNsdWRlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGFkZFRlc3RFeGNsdWRlcygoSVRlc3RGaWx0ZXJSZWNlaXZlcikgdGVzdCwgbWRFeGNsdWRlcywgbmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gc2hvdWxkUnVuTW9kdWxlKFN0cmluZyBtb2R1bGVJZCkgewotICAgICAgICBMaXN0PFRlc3RGaWx0ZXI+IG1kSW5jbHVkZXMgPSBnZXRGaWx0ZXJMaXN0KG1JbmNsdWRlRmlsdGVycywgbW9kdWxlSWQpOwotICAgICAgICBMaXN0PFRlc3RGaWx0ZXI+IG1kRXhjbHVkZXMgPSBnZXRGaWx0ZXJMaXN0KG1FeGNsdWRlRmlsdGVycywgbW9kdWxlSWQpOwotICAgICAgICAvLyBpZiBpbmNsdWRpbmcgYWxsIG1vZHVsZXMgb3IgaW5jbHVkZXMgZXhpc3QgZm9yIHRoaXMgbW9kdWxlLCBhbmQgdGhlcmUgYXJlIG5vdCBleGNsdWRlcwotICAgICAgICAvLyBmb3IgdGhlIGVudGlyZSBtb2R1bGUsIHRoaXMgbW9kdWxlIHNob3VsZCBiZSBydW4uCi0gICAgICAgIHJldHVybiAobUluY2x1ZGVBbGwgfHwgIW1kSW5jbHVkZXMuaXNFbXB0eSgpKSAmJiAhY29udGFpbnNNb2R1bGVFeGNsdWRlKG1kRXhjbHVkZXMpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRUZXN0SW5jbHVkZXMoSVRlc3RGaWx0ZXJSZWNlaXZlciB0ZXN0LCBMaXN0PFRlc3RGaWx0ZXI+IGluY2x1ZGVzLAotICAgICAgICAgICAgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgaWYgKHRlc3QgaW5zdGFuY2VvZiBJVGVzdEZpbGVGaWx0ZXJSZWNlaXZlcikgewotICAgICAgICAgICAgRmlsZSBpbmNsdWRlRmlsZSA9IGNyZWF0ZUZpbHRlckZpbGUobmFtZSwgIi5pbmNsdWRlIiwgaW5jbHVkZXMpOwotICAgICAgICAgICAgKChJVGVzdEZpbGVGaWx0ZXJSZWNlaXZlcil0ZXN0KS5zZXRJbmNsdWRlVGVzdEZpbGUoaW5jbHVkZUZpbGUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gYWRkIHRlc3QgaW5jbHVkZXMgb25lIGF0IGEgdGltZQotICAgICAgICAgICAgZm9yIChUZXN0RmlsdGVyIGluY2x1ZGUgOiBpbmNsdWRlcykgewotICAgICAgICAgICAgICAgIFN0cmluZyBmaWx0ZXJUZXN0TmFtZSA9IGluY2x1ZGUuZ2V0VGVzdCgpOwotICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJUZXN0TmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRlc3QuYWRkSW5jbHVkZUZpbHRlcihmaWx0ZXJUZXN0TmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFRlc3RFeGNsdWRlcyhJVGVzdEZpbHRlclJlY2VpdmVyIHRlc3QsIExpc3Q8VGVzdEZpbHRlcj4gZXhjbHVkZXMsCi0gICAgICAgICAgICBTdHJpbmcgbmFtZSkgewotICAgICAgICBpZiAodGVzdCBpbnN0YW5jZW9mIElUZXN0RmlsZUZpbHRlclJlY2VpdmVyKSB7Ci0gICAgICAgICAgICBGaWxlIGV4Y2x1ZGVGaWxlID0gY3JlYXRlRmlsdGVyRmlsZShuYW1lLCAiLmV4Y2x1ZGUiLCBleGNsdWRlcyk7Ci0gICAgICAgICAgICAoKElUZXN0RmlsZUZpbHRlclJlY2VpdmVyKXRlc3QpLnNldEV4Y2x1ZGVUZXN0RmlsZShleGNsdWRlRmlsZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBhZGQgdGVzdCBleGNsdWRlcyBvbmUgYXQgYSB0aW1lCi0gICAgICAgICAgICBmb3IgKFRlc3RGaWx0ZXIgZXhjbHVkZSA6IGV4Y2x1ZGVzKSB7Ci0gICAgICAgICAgICAgICAgdGVzdC5hZGRFeGNsdWRlRmlsdGVyKGV4Y2x1ZGUuZ2V0VGVzdCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgRmlsZSBjcmVhdGVGaWx0ZXJGaWxlKFN0cmluZyBwcmVmaXgsIFN0cmluZyBzdWZmaXgsIExpc3Q8VGVzdEZpbHRlcj4gZmlsdGVycykgewotICAgICAgICBGaWxlIGZpbHRlckZpbGUgPSBudWxsOwotICAgICAgICBQcmludFdyaXRlciBvdXQgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZmlsdGVyRmlsZSA9IEZpbGVVdGlsLmNyZWF0ZVRlbXBGaWxlKHByZWZpeCwgc3VmZml4KTsKLSAgICAgICAgICAgIG91dCA9IG5ldyBQcmludFdyaXRlcihmaWx0ZXJGaWxlKTsKLSAgICAgICAgICAgIGZvciAoVGVzdEZpbHRlciBmaWx0ZXIgOiBmaWx0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZpbHRlclRlc3QgPSBmaWx0ZXIuZ2V0VGVzdCgpOwotICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJUZXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oZmlsdGVyVGVzdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3V0LmZsdXNoKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJGYWlsZWQgdG8gY3JlYXRlIGZpbHRlciBmaWxlIik7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBTdHJlYW1VdGlsLmNsb3NlKG91dCk7Ci0gICAgICAgIH0KLSAgICAgICAgZmlsdGVyRmlsZS5kZWxldGVPbkV4aXQoKTsKLSAgICAgICAgcmV0dXJuIGZpbHRlckZpbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmZiBvbmUgb3IgbW9yZSB0ZXN0IGZpbHRlcnMgaW4gZXhjbHVkZXMgYXBwbHkgdG8gdGhlIGVudGlyZSBtb2R1bGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zTW9kdWxlRXhjbHVkZShDb2xsZWN0aW9uPFRlc3RGaWx0ZXI+IGV4Y2x1ZGVzKSB7Ci0gICAgICAgIGZvciAoVGVzdEZpbHRlciBleGNsdWRlIDogZXhjbHVkZXMpIHsKLSAgICAgICAgICAgIGlmIChleGNsdWRlLmdldFRlc3QoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEge0BsaW5rIEZpbGVuYW1lRmlsdGVyfSB0byBmaW5kIGFsbCB0aGUgY29uZmlnIGZpbGVzIGluIGEgZGlyZWN0b3J5LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ29uZmlnRmlsdGVyIGltcGxlbWVudHMgRmlsZW5hbWVGaWx0ZXIgewotCi0gICAgICAgIC8qKgotICAgICAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICAgICAqLwotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZGlyLCBTdHJpbmcgbmFtZSkgewotICAgICAgICAgICAgcmV0dXJuIG5hbWUuZW5kc1dpdGgoQ09ORklHX0VYVCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHB1dEFyZ3MoTGlzdDxTdHJpbmc+IGFyZ3MsCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+PiBhcmdzTWFwKSB7Ci0gICAgICAgIGZvciAoU3RyaW5nIGFyZyA6IGFyZ3MpIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIHBhcnRzID0gYXJnLnNwbGl0KCI6Iik7Ci0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0ID0gcGFydHNbMF07Ci0gICAgICAgICAgICBTdHJpbmcga2V5ID0gcGFydHNbMV07Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBwYXJ0c1syXTsKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gbWFwID0gYXJnc01hcC5nZXQodGFyZ2V0KTsKLSAgICAgICAgICAgIGlmIChtYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgICAgICAgICBhcmdzTWFwLnB1dCh0YXJnZXQsIG1hcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMaXN0PFN0cmluZz4gdmFsdWVMaXN0ID0gbWFwLmdldChrZXkpOwotICAgICAgICAgICAgaWYgKHZhbHVlTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdmFsdWVMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICAgICAgbWFwLnB1dChrZXksIHZhbHVlTGlzdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YWx1ZUxpc3QuYWRkKHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3V0aWwvQ29sbGVjdG9yVXRpbC5qYXZhIGIvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdXRpbC9Db2xsZWN0b3JVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MjAzZGQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdXRpbC9Db2xsZWN0b3JVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudXRpbDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRhcmdldHByZXAuRGV2aWNlSW5mb0NvbGxlY3RvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50YXJnZXRwcmVwLlJlcG9ydExvZ0NvbGxlY3RvcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5JVGVzdERldmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5sb2cuTG9nVXRpbC5DTG9nOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnV0aWwuRmlsZVV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIHtAbGluayBSZXBvcnRMb2dDb2xsZWN0b3J9IGFuZCB7QGxpbmsgRGV2aWNlSW5mb0NvbGxlY3Rvcn0uCi0gKi8KLXB1YmxpYyBjbGFzcyBDb2xsZWN0b3JVdGlsIHsKLQotICAgIHByaXZhdGUgQ29sbGVjdG9yVXRpbCgpIHsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURCX0xTX1BBVFRFUk4gPSAiKFteXFxzXSspXFxzKiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfTUVUUklDU19QQVRURVJOID0gIlxcXCIoW2EtejAtOV9dKilcXFwiOihcXHtbXnt9XSpcXH0pIjsKLQotICAgIC8qKgotICAgICAqIENvcHkgZmlsZXMgZnJvbSBkZXZpY2UgdG8gaG9zdC4KLSAgICAgKiBAcGFyYW0gZGV2aWNlIFRoZSBkZXZpY2UgcmVmZXJlbmNlLgotICAgICAqIEBwYXJhbSBzcmMgVGhlIHNvdXJjZSBkaXJlY3Rvcnkgb24gdGhlIGRldmljZS4KLSAgICAgKiBAcGFyYW0gZGVzdCBUaGUgZGVzdGluYXRpb24gZGlyZWN0b3J5LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwdWxsRnJvbURldmljZShJVGVzdERldmljZSBkZXZpY2UsIFN0cmluZyBzcmMsIFN0cmluZyBkZXN0KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlLmRvZXNGaWxlRXhpc3Qoc3JjKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBsaXN0Q29tbWFuZCA9IFN0cmluZy5mb3JtYXQoImxzICVzIiwgc3JjKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZUxpc3QgPSBkZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZChsaXN0Q29tbWFuZCk7Ci0gICAgICAgICAgICAgICAgUGF0dGVybiBwID0gUGF0dGVybi5jb21waWxlKEFEQl9MU19QQVRURVJOKTsKLSAgICAgICAgICAgICAgICBNYXRjaGVyIG0gPSBwLm1hdGNoZXIoZmlsZUxpc3QpOwotICAgICAgICAgICAgICAgIHdoaWxlIChtLmZpbmQoKSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBtLmdyb3VwKDEpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3JjUGF0aCA9IFN0cmluZy5mb3JtYXQoIiVzJXMiLCBzcmMsIGZpbGVOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgRmlsZSBkZXN0RmlsZSA9IG5ldyBGaWxlKFN0cmluZy5mb3JtYXQoIiVzLyVzIiwgZGVzdCwgZmlsZU5hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgZGV2aWNlLnB1bGxGaWxlKHNyY1BhdGgsIGRlc3RGaWxlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBDTG9nLmUoIkNhdWdodCBleGNlcHRpb24gZHVyaW5nIHB1bGwuIik7Ci0gICAgICAgICAgICBDTG9nLmUoZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb3B5IGZpbGVzIGZyb20gaG9zdCBhbmQgZGVsZXRlIGZyb20gc291cmNlLgotICAgICAqIEBwYXJhbSBzcmMgVGhlIHNvdXJjZSBkaXJlY3RvcnkuCi0gICAgICogQHBhcmFtIGRlc3QgVGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHVsbEZyb21Ib3N0KEZpbGUgc3JjLCBGaWxlIGRlc3QpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChzcmMubGlzdEZpbGVzKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEZpbGVVdGlsLnJlY3Vyc2l2ZUNvcHkoc3JjLCBkZXN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZpbGVVdGlsLnJlY3Vyc2l2ZURlbGV0ZShzcmMpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBDTG9nLmUoIkNhdWdodCBleGNlcHRpb24gZHVyaW5nIHB1bGwuIik7Ci0gICAgICAgICAgICBDTG9nLmUoZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWZvcm1hdCB0ZXN0IG1ldHJpY3MganNvbnMgdG8gY29udmVydCBtdWx0aXBsZSBqc29uIG9iamVjdHMgd2l0aCBpZGVudGljYWwgc3RyZWFtIG5hbWVzIGludG8KLSAgICAgKiBhcnJheXMgb2Ygb2JqZWN0cyAoYi8yODc5MDQ2NykuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVzdWx0RGlyIFRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0ZXN0IG1ldHJpY3MuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlZm9ybWF0UmVwZWF0ZWRTdHJlYW1zKEZpbGUgcmVzdWx0RGlyKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBGaWxlW10gcmVwb3J0TG9ncyA9IHJlc3VsdERpci5saXN0RmlsZXMoKTsKLSAgICAgICAgICAgIGZvciAoRmlsZSByZXBvcnRMb2cgOiByZXBvcnRMb2dzKSB7Ci0gICAgICAgICAgICAgICAgd3JpdGVGaWxlKHJlcG9ydExvZywgcmVmb3JtYXRKc29uU3RyaW5nKHJlYWRGaWxlKHJlcG9ydExvZykpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgQ0xvZy5lKCJDYXVnaHQgZXhjZXB0aW9uIGR1cmluZyByZWZvcm1hdHRpbmcuIik7Ci0gICAgICAgICAgICBDTG9nLmUoZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gcmVhZCBhIGZpbGUuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlYWRGaWxlKEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBzdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgdHJ5IChCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoZmlsZSkpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbGluZTsKLSAgICAgICAgICAgIHdoaWxlICgobGluZSA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc3RyaW5nQnVpbGRlci5hcHBlbmQobGluZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0cmluZ0J1aWxkZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gd3JpdGUgdG8gYSBmaWxlLgotICAgICAqCi0gICAgICogQHBhcmFtIGZpbGUge0BsaW5rIEZpbGV9IHRvIHdyaXRlIHRvLgotICAgICAqIEBwYXJhbSBqc29uU3RyaW5nIFN0cmluZyB0byBiZSB3cml0dGVuLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlRmlsZShGaWxlIGZpbGUsIFN0cmluZyBqc29uU3RyaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBmaWxlLmNyZWF0ZU5ld0ZpbGUoKTsKLSAgICAgICAgdHJ5IChCdWZmZXJlZFdyaXRlciB3cml0ZXIgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIoZmlsZSkpKSB7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGUoanNvblN0cmluZywgMCwganNvblN0cmluZy5sZW5ndGgoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gcmVmb3JtYXQgSlNPTiBzdHJpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ganNvblN0cmluZwotICAgICAqIEByZXR1cm4gdGhlIHJlZm9ybWF0dGVkIEpTT04gc3RyaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlZm9ybWF0SnNvblN0cmluZyhTdHJpbmcganNvblN0cmluZykgewotICAgICAgICBTdHJpbmdCdWlsZGVyIG5ld0pzb25CdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgLy8gQ3JlYXRlIG1hcCBvZiBzdHJlYW0gbmFtZXMgYW5kIGpzb24gb2JqZWN0cy4KLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4ganNvbk1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgUGF0dGVybiBwID0gUGF0dGVybi5jb21waWxlKFRFU1RfTUVUUklDU19QQVRURVJOKTsKLSAgICAgICAgTWF0Y2hlciBtID0gcC5tYXRjaGVyKGpzb25TdHJpbmcpOwotICAgICAgICBpZiAoIW0uZmluZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4ganNvblN0cmluZzsKLSAgICAgICAgfQotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBTdHJpbmcga2V5ID0gbS5ncm91cCgxKTsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IG0uZ3JvdXAoMik7Ci0gICAgICAgICAgICBpZiAoIWpzb25NYXAuY29udGFpbnNLZXkoa2V5KSkgewotICAgICAgICAgICAgICAgIGpzb25NYXAucHV0KGtleSwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAganNvbk1hcC5nZXQoa2V5KS5hZGQodmFsdWUpOwotICAgICAgICB9IHdoaWxlIChtLmZpbmQoKSk7Ci0gICAgICAgIC8vIFJld3JpdGUganNvbiBzdHJpbmcgYXMgYXJyYXlzLgotICAgICAgICBuZXdKc29uQnVpbGRlci5hcHBlbmQoInsiKTsKLSAgICAgICAgYm9vbGVhbiBmaXJzdExpbmUgPSB0cnVlOwotICAgICAgICBmb3IgKFN0cmluZyBrZXkgOiBqc29uTWFwLmtleVNldCgpKSB7Ci0gICAgICAgICAgICBpZiAoIWZpcnN0TGluZSkgewotICAgICAgICAgICAgICAgIG5ld0pzb25CdWlsZGVyLmFwcGVuZCgiLCIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmaXJzdExpbmUgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5ld0pzb25CdWlsZGVyLmFwcGVuZCgiXCIiKS5hcHBlbmQoa2V5KS5hcHBlbmQoIlwiOlsiKTsKLSAgICAgICAgICAgIGJvb2xlYW4gZmlyc3RWYWx1ZSA9IHRydWU7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBzdHJlYW0gOiBqc29uTWFwLmdldChrZXkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFmaXJzdFZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5ld0pzb25CdWlsZGVyLmFwcGVuZCgiLCIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpcnN0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbmV3SnNvbkJ1aWxkZXIuYXBwZW5kKHN0cmVhbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuZXdKc29uQnVpbGRlci5hcHBlbmQoIl0iKTsKLSAgICAgICAgfQotICAgICAgICBuZXdKc29uQnVpbGRlci5hcHBlbmQoIn0iKTsKLSAgICAgICAgcmV0dXJuIG5ld0pzb25CdWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdXRpbC9EeW5hbWljQ29uZmlnRmlsZVJlYWRlci5qYXZhIGIvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdXRpbC9EeW5hbWljQ29uZmlnRmlsZVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmI3ZjNjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3V0aWwvRHluYW1pY0NvbmZpZ0ZpbGVSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudXRpbDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLmJ1aWxkLkNvbXBhdGliaWxpdHlCdWlsZEhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkR5bmFtaWNDb25maWc7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuYnVpbGQuSUJ1aWxkSW5mbzsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5sb2cuTG9nVXRpbC5DTG9nOwotCi1pbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogVXRpbGl0eSB0byByZWFkIHRoZSBkYXRhIGZyb20gYSBkeW5hbWljIGNvbmZpZyBmaWxlLgotICovCi1wdWJsaWMgY2xhc3MgRHluYW1pY0NvbmZpZ0ZpbGVSZWFkZXIgewotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgYSBrZXkgZnJvbSBhIGRvd25sb2FkZWQgZmlsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWxlIFRoZSBmaWxlIGRvd25sb2FkZWQsIGNhbiBiZSByZXRyaWV2ZSB2aWEKLSAgICAgKiAgICAgICAge0BsaW5rIENvbXBhdGliaWxpdHlCdWlsZEhlbHBlciNnZXREeW5hbWljQ29uZmlnRmlsZXMoKX0KLSAgICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgaW5zaWRlIHRoZSBmaWxlIHdoaWNoIHZhbHVlIHdlIHdhbnQgdG8gcmV0dXJuCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB0byB0aGUga2V5IGluIHRoZSBjb25maWcgZmlsZSBwcm92aWRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRWYWx1ZUZyb21Db25maWcoRmlsZSBmaWxlLCBTdHJpbmcga2V5KQotICAgICAgICAgICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBjb25maWdNYXAgPSBEeW5hbWljQ29uZmlnLmNyZWF0ZUNvbmZpZ01hcChmaWxlKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IHNpbmdsZVZhbHVlID0gY29uZmlnTWFwLmdldChrZXkpOwotICAgICAgICBpZiAoc2luZ2xlVmFsdWUgPT0gbnVsbCB8fCBzaW5nbGVWYWx1ZS5zaXplKCkgPT0gMCB8fCBzaW5nbGVWYWx1ZS5zaXplKCkgPiAxKSB7Ci0gICAgICAgICAgICAvLyBrZXkgbXVzdCBleGlzdCBpbiB0aGUgbWFwLCBhbmQgbWFwIHRvIGEgbGlzdCBjb250YWluaW5nIGV4YWN0bHkgb25lIHN0cmluZwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNpbmdsZVZhbHVlLmdldCgwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtdWx0aXBsZSB2YWx1ZXMgb2YgYSBrZXkgZnJvbSBhIGRvd25sb2FkZWQgZmlsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWxlIFRoZSBmaWxlIGRvd25sb2FkZWQsIGNhbiBiZSByZXRyaWV2ZSB2aWEKLSAgICAgKiAgICAgICAge0BsaW5rIENvbXBhdGliaWxpdHlCdWlsZEhlbHBlciNnZXREeW5hbWljQ29uZmlnRmlsZXMoKX0KLSAgICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgaW5zaWRlIHRoZSBmaWxlIHdoaWNoIHZhbHVlcyB3ZSB3YW50IHRvIHJldHVybgotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlcyBhc3NvY2lhdGVkIHRvIHRoZSBrZXkgaW4gdGhlIGNvbmZpZyBmaWxlIHByb3ZpZGVkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IGdldFZhbHVlc0Zyb21Db25maWcoRmlsZSBmaWxlLCBTdHJpbmcga2V5KQotICAgICAgICAgICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIER5bmFtaWNDb25maWcuY3JlYXRlQ29uZmlnTWFwKGZpbGUpLmdldChrZXkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIGEga2V5IGZyb20gdGhlIGJ1aWxkIGluZm8gYW5kIG1vZHVsZSB0YXJnZXRlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmZvIHRoZSB7QGxpbmsgSUJ1aWxkSW5mb30gb2YgdGhlIHJ1bi4KLSAgICAgKiBAcGFyYW0gbW9kdWxlTmFtZSB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlIHdlIG5lZWQgdGhlIGR5bmFtaWMgZmlsZSBmcm9tLgotICAgICAqIEBwYXJhbSBrZXkgdGhlIGtleSBpbnNpZGUgdGhlIGZpbGUgd2hpY2ggdmFsdWUgd2Ugd2FudCB0byByZXR1cm4KLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHRvIHRoZSBrZXkgaW4gdGhlIGR5bmFtaWMgY29uZmlnIGFzc29jaWF0ZWQgd2l0aCB0aGUgbW9kdWxlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFZhbHVlRnJvbUNvbmZpZyhJQnVpbGRJbmZvIGluZm8sIFN0cmluZyBtb2R1bGVOYW1lLCBTdHJpbmcga2V5KQotICAgICAgICAgICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyIGhlbHBlciA9IG5ldyBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIoaW5mbyk7Ci0gICAgICAgIEZpbGUgZHluYW1pY0NvbmZpZyA9IGhlbHBlci5nZXREeW5hbWljQ29uZmlnRmlsZXMoKS5nZXQobW9kdWxlTmFtZSk7Ci0gICAgICAgIGlmIChkeW5hbWljQ29uZmlnID09IG51bGwpIHsKLSAgICAgICAgICAgIENMb2cudygiQ29uZmlnIGZpbGUgJXMsIG5vdCBmb3VuZCBpbiB0aGUgbWFwIG9mIGR5bmFtaWMgY29uZmlncy4iLCBtb2R1bGVOYW1lKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUZyb21Db25maWcoZHluYW1pY0NvbmZpZywga2V5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtdWx0aXBsZSB2YWx1ZXMgb2YgYSBrZXkgZnJvbSB0aGUgYnVpbGQgaW5mbyBhbmQgbW9kdWxlIHRhcmdldGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGluZm8gdGhlIHtAbGluayBJQnVpbGRJbmZvfSBvZiB0aGUgcnVuLgotICAgICAqIEBwYXJhbSBtb2R1bGVOYW1lIHRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgd2UgbmVlZCB0aGUgZHluYW1pYyBmaWxlIGZyb20uCi0gICAgICogQHBhcmFtIGtleSB0aGUga2V5IGluc2lkZSB0aGUgZmlsZSB3aGljaCB2YWx1ZXMgd2Ugd2FudCB0byByZXR1cm4KLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZXMgYXNzb2NpYXRlZCB0byB0aGUga2V5IGluIHRoZSBkeW5hbWljIGNvbmZpZyBhc3NvY2lhdGVkIHdpdGggdGhlIG1vZHVsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRWYWx1ZXNGcm9tQ29uZmlnKElCdWlsZEluZm8gaW5mbywgU3RyaW5nIG1vZHVsZU5hbWUsIFN0cmluZyBrZXkpCi0gICAgICAgICAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIgaGVscGVyID0gbmV3IENvbXBhdGliaWxpdHlCdWlsZEhlbHBlcihpbmZvKTsKLSAgICAgICAgRmlsZSBkeW5hbWljQ29uZmlnID0gaGVscGVyLmdldER5bmFtaWNDb25maWdGaWxlcygpLmdldChtb2R1bGVOYW1lKTsKLSAgICAgICAgaWYgKGR5bmFtaWNDb25maWcgPT0gbnVsbCkgewotICAgICAgICAgICAgQ0xvZy53KCJDb25maWcgZmlsZSAlcywgbm90IGZvdW5kIGluIHRoZSBtYXAgb2YgZHluYW1pYyBjb25maWdzLiIsIG1vZHVsZU5hbWUpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGdldFZhbHVlc0Zyb21Db25maWcoZHluYW1pY0NvbmZpZywga2V5KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC91dGlsL0xpbmVhclBhcnRpdGlvbi5qYXZhIGIvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdXRpbC9MaW5lYXJQYXJ0aXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY5MWU1Ny4uMDAwMDAwMAotLS0gYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC91dGlsL0xpbmVhclBhcnRpdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC51dGlsOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGVzdHR5cGUuSU1vZHVsZURlZjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogSGVscGVyIGZvciB0aGUgc2hhcmQgc3BsaXR0aW5nLiBTcGxpdCBsaW5lYXJseSBhIGxpc3QgaW50byBOIHN1Ymxpc3Qgd2l0aAotICogYXBwcm94aW1hdGVseSB0aGUgc2FtZSB3ZWlnaHQuCi0gKiBUT0RPOiBDYW4gYmUgZ2VuZXJhbGl6ZWQgZm9yIGFueSB3ZWlnaHRlZCBvYmplY3RzLgotICovCi1wdWJsaWMgY2xhc3MgTGluZWFyUGFydGl0aW9uIHsKLQotICAgIC8qKgotICAgICAqIFNwbGl0IGEgbGlzdCBvZiB7QGxpbmsgSU1vZHVsZURlZn0gaW50byBrIHN1YiBsaXN0IGJhc2VkIG9uIHRoZSBydW50aW1lIGhpbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VxIHRoZSBmdWxsIGxpc3Qgb2Yge0BsaW5rIElNb2R1bGVEZWZ9IHRvIGJlIHNwbGl0dGVkCi0gICAgICogQHBhcmFtIGsgdGhlIG51bWJlciBvZiBzdWIgbGlzdCB3ZSBuZWVkLgotICAgICAqIEByZXR1cm4gdGhlIExpc3Qgb2Ygc3VibGlzdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8TGlzdDxJTW9kdWxlRGVmPj4gc3BsaXQoTGlzdDxJTW9kdWxlRGVmPiBzZXEsIGludCBrKSB7Ci0gICAgICAgIEFycmF5TGlzdDxMaXN0PElNb2R1bGVEZWY+PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLQotICAgICAgICBpZiAoayA8PSAwKSB7Ci0gICAgICAgICAgICBBcnJheUxpc3Q8SU1vZHVsZURlZj4gcGFydGl0aW9uID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICBwYXJ0aXRpb24uYWRkQWxsKHNlcSk7Ci0gICAgICAgICAgICByZXN1bHQuYWRkKHBhcnRpdGlvbik7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IG4gPSBzZXEuc2l6ZSgpIC0gMTsKLQotICAgICAgICBpZiAoayA+IG4pIHsKLSAgICAgICAgICAgIGZvciAoSU1vZHVsZURlZiB2YWx1ZSA6IHNlcSkgewotICAgICAgICAgICAgICAgIEFycmF5TGlzdDxJTW9kdWxlRGVmPiBwYXJ0aXRpb24gPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgICAgICBwYXJ0aXRpb24uYWRkKHZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKHBhcnRpdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgaW50W11bXSB0YWJsZSA9IGJ1aWxkUGFydGl0aW9uVGFibGUoc2VxLCBrKTsKLSAgICAgICAgayA9IGsgLSAyOwotCi0gICAgICAgIHdoaWxlIChrID49IDApIHsKLSAgICAgICAgICAgIEFycmF5TGlzdDxJTW9kdWxlRGVmPiBwYXJ0aXRpb24gPSBuZXcgQXJyYXlMaXN0PD4oKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IHRhYmxlW24gLSAxXVtrXSArIDE7IGkgPCBuICsgMTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgcGFydGl0aW9uLmFkZChzZXEuZ2V0KGkpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVzdWx0LmFkZCgwLCBwYXJ0aXRpb24pOwotICAgICAgICAgICAgbiA9IHRhYmxlW24gLSAxXVtrXTsKLSAgICAgICAgICAgIGsgPSBrIC0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIEFycmF5TGlzdDxJTW9kdWxlRGVmPiBwYXJ0aXRpb24gPSBuZXcgQXJyYXlMaXN0PD4oKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG4gKyAxOyBpKyspIHsKLSAgICAgICAgICAgIHBhcnRpdGlvbi5hZGQoc2VxLmdldChpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXN1bHQuYWRkKDAsIHBhcnRpdGlvbik7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlcm5hbCBoZWxwZXIgdG8gYnVpbGQgdGhlIHBhcnRpdGlvbiB0YWJsZSBvZiB0aGUgbGluZWFyIGRpc3RyaWJ1dGlvbiB1c2VkIGZvciBzcGxpdHRpbmcuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50W11bXSBidWlsZFBhcnRpdGlvblRhYmxlKExpc3Q8SU1vZHVsZURlZj4gc2VxLCBpbnQgaykgewotICAgICAgICBpbnQgbiA9IHNlcS5zaXplKCk7Ci0gICAgICAgIGZsb2F0W11bXSB0YWJsZSA9IG5ldyBmbG9hdFtuXVtrXTsKLSAgICAgICAgaW50W11bXSBzb2x1dGlvbiA9IG5ldyBpbnRbbiAtIDFdW2sgLSAxXTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewotICAgICAgICAgICAgdGFibGVbaV1bMF0gPSBzZXEuZ2V0KGkpLmdldFJ1bnRpbWVIaW50KCkgKyAoKGkgPiAwKSA/ICh0YWJsZVtpIC0gMV1bMF0pIDogMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGs7IGorKykgewotICAgICAgICAgICAgdGFibGVbMF1bal0gPSBzZXEuZ2V0KDApLmdldFJ1bnRpbWVIaW50KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IG47IGkrKykgewotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDE7IGogPCBrOyBqKyspIHsKLSAgICAgICAgICAgICAgICB0YWJsZVtpXVtqXSA9IEludGVnZXIuTUFYX1ZBTFVFOwotICAgICAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgaTsgeCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZsb2F0IGNvc3QgPSBNYXRoLm1heCh0YWJsZVt4XVtqIC0gMV0sIHRhYmxlW2ldWzBdIC0gdGFibGVbeF1bMF0pOwotICAgICAgICAgICAgICAgICAgICBpZiAodGFibGVbaV1bal0gPiBjb3N0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZVtpXVtqXSA9IGNvc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzb2x1dGlvbltpIC0gMV1baiAtIDFdID0geDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzb2x1dGlvbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC91dGlsL09wdGlvbkhlbHBlci5qYXZhIGIvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdXRpbC9PcHRpb25IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg0N2Y5Mi4uMDAwMDAwMAotLS0gYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC91dGlsL09wdGlvbkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC51dGlsOwotCi1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuY29uZmlnLk9wdGlvbjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgZm9yIG1hbmlwdWxhdGluZyBmaWVsZHMgd2l0aCBAb3B0aW9uIGFubm90YXRpb25zLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgT3B0aW9uSGVscGVyIHsKLQotICAgIHByaXZhdGUgT3B0aW9uSGVscGVyKCkge30KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUge0BsaW5rIExpc3R9IG9mIHtAbGluayBGaWVsZH0gZW50cmllcyBvbiB0aGUgZ2l2ZW4gb2JqZWN0Ci0gICAgICogdGhhdCBoYXZlIHRoZSB7QGxpbmsgT3B0aW9ufSBhbm5vdGF0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIG9iamVjdCBBbiBvYmplY3Qgd2l0aCBAb3B0aW9uLWFubm90YXRlZCBmaWVsZHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxGaWVsZD4gZ2V0RmllbGRzKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgRmllbGRbXSBjbGFzc0ZpZWxkcyA9IG9iamVjdC5nZXRDbGFzcygpLmdldERlY2xhcmVkRmllbGRzKCk7Ci0gICAgICAgIExpc3Q8RmllbGQ+IG9wdGlvbkZpZWxkcyA9IG5ldyBBcnJheUxpc3Q8RmllbGQ+KCk7Ci0KLSAgICAgICAgZm9yIChGaWVsZCBkZWNsYXJlZEZpZWxkIDogY2xhc3NGaWVsZHMpIHsKLSAgICAgICAgICAgIC8vIGFsbG93IGFjY2VzcyB0byBwcm90ZWN0ZWQgYW5kIHByaXZhdGUgZmllbGRzCi0gICAgICAgICAgICBkZWNsYXJlZEZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0KLSAgICAgICAgICAgIC8vIHN0b3JlIHR5cGUgYW5kIHZhbHVlcyBvbmx5IGluIGFubm90YXRlZCBmaWVsZHMKLSAgICAgICAgICAgIGlmIChkZWNsYXJlZEZpZWxkLmlzQW5ub3RhdGlvblByZXNlbnQoT3B0aW9uLmNsYXNzKSkgewotICAgICAgICAgICAgICAgIG9wdGlvbkZpZWxkcy5hZGQoZGVjbGFyZWRGaWVsZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG9wdGlvbkZpZWxkczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZSBhIHtAbGluayBTZXR9IG9mIHtAbGluayBPcHRpb259IG5hbWVzIHByZXNlbnQgb24gdGhlIGdpdmVuCi0gICAgICogb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIG9iamVjdCBBbiBvYmplY3Qgd2l0aCBAb3B0aW9uLWFubm90YXRlZCBmaWVsZHMuCi0gICAgICovCi0gICAgc3RhdGljIFNldDxTdHJpbmc+IGdldE9wdGlvbk5hbWVzKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgU2V0PFN0cmluZz4gb3B0aW9ucyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgTGlzdDxGaWVsZD4gb3B0aW9uRmllbGRzID0gZ2V0RmllbGRzKG9iamVjdCk7Ci0KLSAgICAgICAgZm9yIChGaWVsZCBkZWNsYXJlZEZpZWxkIDogb3B0aW9uRmllbGRzKSB7Ci0gICAgICAgICAgICBPcHRpb24gb3B0aW9uID0gZGVjbGFyZWRGaWVsZC5nZXRBbm5vdGF0aW9uKE9wdGlvbi5jbGFzcyk7Ci0gICAgICAgICAgICBvcHRpb25zLmFkZChvcHRpb24ubmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gb3B0aW9uczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZSBhIHtAbGluayBTZXR9IG9mIHtAbGluayBPcHRpb259IHNob3J0IG5hbWVzIHByZXNlbnQgb24gdGhlIGdpdmVuCi0gICAgICogb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIG9iamVjdCBBbiBvYmplY3Qgd2l0aCBAb3B0aW9uLWFubm90YXRlZCBmaWVsZHMuCi0gICAgICovCi0gICAgc3RhdGljIFNldDxTdHJpbmc+IGdldE9wdGlvblNob3J0TmFtZXMoT2JqZWN0IG9iamVjdCkgewotICAgICAgICBTZXQ8U3RyaW5nPiBzaG9ydE5hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICBMaXN0PEZpZWxkPiBvcHRpb25GaWVsZHMgPSBnZXRGaWVsZHMob2JqZWN0KTsKLQotICAgICAgICBmb3IgKEZpZWxkIGRlY2xhcmVkRmllbGQgOiBvcHRpb25GaWVsZHMpIHsKLSAgICAgICAgICAgIE9wdGlvbiBvcHRpb24gPSBkZWNsYXJlZEZpZWxkLmdldEFubm90YXRpb24oT3B0aW9uLmNsYXNzKTsKLSAgICAgICAgICAgIGlmIChvcHRpb24uc2hvcnROYW1lKCkgIT0gT3B0aW9uLk5PX1NIT1JUX05BTUUpIHsKLSAgICAgICAgICAgICAgICBzaG9ydE5hbWVzLmFkZChTdHJpbmcudmFsdWVPZihvcHRpb24uc2hvcnROYW1lKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2hvcnROYW1lczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZSBhIHtAbGluayBMaXN0fSBvZiB7QGxpbmsgU3RyaW5nfSBlbnRyaWVzIG9mIHRoZSB2YWxpZAotICAgICAqIGNvbW1hbmQtbGluZSBvcHRpb25zIGZvciB0aGUgZ2l2ZW4ge0BsaW5rIE9iamVjdH0gZnJvbSB0aGUgZ2l2ZW4KLSAgICAgKiBpbnB1dCB7QGxpbmsgU3RyaW5nfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRWYWxpZENsaUFyZ3MoU3RyaW5nIGNvbW1hbmRTdHJpbmcsIE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgU2V0PFN0cmluZz4gb3B0aW9uTmFtZXMgPSBPcHRpb25IZWxwZXIuZ2V0T3B0aW9uTmFtZXMob2JqZWN0KTsKLSAgICAgICAgU2V0PFN0cmluZz4gb3B0aW9uU2hvcnROYW1lcyA9IE9wdGlvbkhlbHBlci5nZXRPcHRpb25TaG9ydE5hbWVzKG9iamVjdCk7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiB2YWxpZENsaUFyZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgICAgICAvLyBnZXQgb3B0aW9uL3ZhbHVlIHN1YnN0cmluZ3MgZnJvbSB0aGUgY29tbWFuZC1saW5lIHN0cmluZwotICAgICAgICAvLyBOLkIuIHRyYWRlZmVkIHJld3JpdGVzIHNvbWUgZXhwcmVzc2lvbnMgZnJvbSBvcHRpb249InZhbHVlIGEgYiIgdG8gIm9wdGlvbj12YWx1ZSBhIGIiCi0gICAgICAgIFN0cmluZyBxdW90ZU1hdGNoaW5nID0gIihcIlteXCJdK1wiKSI7Ci0gICAgICAgIFN0cmluZyBub25TcGFjZWRIeXBlbiA9ICIoKD88IVxccyktKD8hXFxzKSkiOwotICAgICAgICBQYXR0ZXJuIGNsaVBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoCi0gICAgICAgICAgICAvLyBtYXRjaCAtb3B0aW9uPXZhbHVlIG9yIC0tb3B0aW9uPXZhbHVlCi0gICAgICAgICAgICAiKCgtWy1cXHddKyhbID1dIgotICAgICAgICAgICAgLy8gYWxsb3cgLW9wdGlvbiAiLi4uIiwgLW9wdGlvbiB4IHkgeiwgYW5kIC1vcHRpb24geDp5OnogYW5kIC1vcHRpb24geDp5OnoxPXoyCi0gICAgICAgICAgICArICIoIiArIHF1b3RlTWF0Y2hpbmcgKyAifChbXFx3XFwvXFxzOj0uXXwiKyBub25TcGFjZWRIeXBlbiArICIpKykpPyIKLSAgICAgICAgICAgICsgIikpfCIKLSAgICAgICAgICAgIC8vIGFsbG93IGFueXRoaW5nIGluIGRpcmVjdCBxdW90ZXMKLSAgICAgICAgICAgICsgcXVvdGVNYXRjaGluZwotICAgICAgICApOwotICAgICAgICBNYXRjaGVyIG1hdGNoZXIgPSBjbGlQYXR0ZXJuLm1hdGNoZXIoY29tbWFuZFN0cmluZyk7Ci0KLSAgICAgICAgd2hpbGUgKG1hdGNoZXIuZmluZCgpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgb3B0aW9uSW5wdXQgPSBjbGVhbk5hbWVWYWx1ZURlbGltaXRlcihtYXRjaGVyLmdyb3VwKCkpOwotICAgICAgICAgICAgLy8gc3BsaXQgYmV0d2VlbiB0aGUgb3B0aW9uIG5hbWUgYW5kIHZhbHVlCi0gICAgICAgICAgICBTdHJpbmdbXSBrZXlOYW1lVG9rZW5zID0gb3B0aW9uSW5wdXQuc3BsaXQoIiAiLCAyKTsKLSAgICAgICAgICAgIC8vIHJlbW92ZSBpbml0aWFsIGh5cGhlbnMgYW5kIGFueSBzdGFydGluZyBkb3VibGUgcXVvdGUgZnJvbSBvcHRpb24gYXJncwotICAgICAgICAgICAgU3RyaW5nIGtleU5hbWUgPSBrZXlOYW1lVG9rZW5zWzBdLnJlcGxhY2VGaXJzdCgiXlwiPy0tPyIsICIiKTsKLQotICAgICAgICAgICAgLy8gYWRkIHN1YnN0cmluZ3Mgb25seSB3aGVuIHRoZSBvcHRpb25zIGFyZSByZWNvZ25pemVkCi0gICAgICAgICAgICBpZiAob3B0aW9uU2hvcnROYW1lcy5jb250YWlucyhrZXlOYW1lKSB8fCBvcHRpb25OYW1lcy5jb250YWlucyhrZXlOYW1lKSkgewotICAgICAgICAgICAgICAgIC8vIGFkZCB2YWx1ZXMgc2VwYXJhdGVkIGJ5IHNwYWNlcyBvciBpbiBxdW90ZXMgc2VwYXJhdGVseSB0byB0aGUgcmV0dXJuIGFycmF5Ci0gICAgICAgICAgICAgICAgUGF0dGVybiB0b2tlblBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoIihcIi4qXCIpfFteXFxzXSsiKTsKLSAgICAgICAgICAgICAgICBNYXRjaGVyIHRva2VuTWF0Y2hlciA9IHRva2VuUGF0dGVybi5tYXRjaGVyKG9wdGlvbklucHV0KTsKLSAgICAgICAgICAgICAgICB3aGlsZSAodG9rZW5NYXRjaGVyLmZpbmQoKSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdG9rZW4gPSB0b2tlbk1hdGNoZXIuZ3JvdXAoKS5yZXBsYWNlQWxsKCJcIiIsICIiKTsKLSAgICAgICAgICAgICAgICAgICAgdmFsaWRDbGlBcmdzLmFkZCh0b2tlbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWxpZENsaUFyZ3M7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBUaGUgIj0iIHNpZ24gaXMgYSB2YWxpZCBjaGFyYWN0ZXIgd2l0aGluIGFuIG9wdGlvbiB2YWx1ZSAoc3VjaCBhcyBpbiBrZXktdmFsdWUgbWFwIHBhaXJzKS4KLSAgICAgKiBIb3dldmVyLCBpdCBtYXkgYWxzbyBhY3QgYXMgZGVsaW1pdGVyIGJldHdlZW4gdGhlIG9wdGlvbiBuYW1lIGFuZCB2YWx1ZS4gRm9yIHNpbXBsaWNpdHksCi0gICAgICogZW5zdXJlIHRoZSBuYW1lLXZhbHVlIGRlbGltaXRlciBpcyBhIHNwYWNlLCBzbyB0aGF0IHdlIG1heSB0cmVhdCB0aGUgIj0iIGFzIGFueSBvdGhlcgotICAgICAqIGNoYXJhY3RlciBpbiB0aGUgZ2V0VmFsaWRDbGlBcmdzKCkgbG9naWMgYWJvdmUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNsZWFuTmFtZVZhbHVlRGVsaW1pdGVyKFN0cmluZyBvcHRpb25OYW1lVmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG9wdGlvbk5hbWVWYWx1ZS5yZXBsYWNlRmlyc3QoIlsgPV0iLCAiICIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3V0aWwvUmV0cnlGaWx0ZXJIZWxwZXIuamF2YSBiL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3V0aWwvUmV0cnlGaWx0ZXJIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y1MjdkYi4uMDAwMDAwMAotLS0gYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC91dGlsL1JldHJ5RmlsdGVySGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudXRpbDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLmJ1aWxkLkNvbXBhdGliaWxpdHlCdWlsZEhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC5yZXN1bHQuU3ViUGxhbkhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5JU3ViUGxhbjsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5Nb2R1bGVSZXBvOwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuSUludm9jYXRpb25SZXN1bHQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5MaWdodEludm9jYXRpb25SZXN1bHQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5SZXN1bHRIYW5kbGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuVGVzdEZpbHRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5jb25maWcuQXJnc09wdGlvblBhcnNlcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5jb25maWcuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5JVGVzdERldmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC51dGlsLkFycmF5VXRpbDsKLQotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBIZWxwZXIgZm9yIGdlbmVyYXRpbmcgLS1pbmNsdWRlLWZpbHRlciBhbmQgLS1leGNsdWRlLWZpbHRlciB2YWx1ZXMgb24gY29tcGF0aWJpbGl0eSByZXRyeS4KLSAqLwotcHVibGljIGNsYXNzIFJldHJ5RmlsdGVySGVscGVyIHsKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgbVN1YlBsYW47Ci0gICAgcHJvdGVjdGVkIFNldDxTdHJpbmc+IG1JbmNsdWRlRmlsdGVycyA9IG5ldyBIYXNoU2V0PD4oKTsKLSAgICBwcm90ZWN0ZWQgU2V0PFN0cmluZz4gbUV4Y2x1ZGVGaWx0ZXJzID0gbmV3IEhhc2hTZXQ8PigpOwotICAgIHByb3RlY3RlZCBTdHJpbmcgbUFiaU5hbWUgPSBudWxsOwotICAgIHByb3RlY3RlZCBTdHJpbmcgbU1vZHVsZU5hbWUgPSBudWxsOwotICAgIHByb3RlY3RlZCBTdHJpbmcgbVRlc3ROYW1lID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgUmV0cnlUeXBlIG1SZXRyeVR5cGUgPSBudWxsOwotCi0gICAgLyogSW5zdGFuY2UgdmFyaWFibGVzIGhhbmR5IGZvciByZXRyZWl2aW5nIHRoZSByZXN1bHQgdG8gYmUgcmV0cmllZCAqLwotICAgIHByaXZhdGUgQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyIG1CdWlsZCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBpbnQgbVNlc3Npb25JZDsKLQotICAgIC8qIFNldHMgdG8gYmUgcG9wdWxhdGVkIGJ5IHJldHJ5IGxvZ2ljIGFuZCByZXR1cm5lZCBieSBnZXR0ZXIgbWV0aG9kcyAqLwotICAgIHByaXZhdGUgU2V0PFN0cmluZz4gbVJldHJ5SW5jbHVkZXM7Ci0gICAgcHJpdmF0ZSBTZXQ8U3RyaW5nPiBtUmV0cnlFeGNsdWRlczsKLQotICAgIHB1YmxpYyBSZXRyeUZpbHRlckhlbHBlcigpIHt9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYSB7QGxpbmsgUmV0cnlGaWx0ZXJIZWxwZXJ9LiBSZXF1aXJlcyBhIENvbXBhdGliaWxpdHlCdWlsZEhlbHBlciBmb3IKLSAgICAgKiByZXRyaWV2aW5nIHByZXZpb3VzIHNlc3Npb25zIGFuZCB0aGUgSUQgb2YgdGhlIHNlc3Npb24gdG8gcmV0cnkuCi0gICAgICovCi0gICAgcHVibGljIFJldHJ5RmlsdGVySGVscGVyKENvbXBhdGliaWxpdHlCdWlsZEhlbHBlciBidWlsZCwgaW50IHNlc3Npb25JZCkgewotICAgICAgICBtQnVpbGQgPSBidWlsZDsKLSAgICAgICAgbVNlc3Npb25JZCA9IHNlc3Npb25JZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYSB7QGxpbmsgUmV0cnlGaWx0ZXJIZWxwZXJ9LgotICAgICAqCi0gICAgICogQHBhcmFtIGJ1aWxkIGEge0BsaW5rIENvbXBhdGliaWxpdHlCdWlsZEhlbHBlcn0gZGVzY3JpYmluZyB0aGUgYnVpbGQuCi0gICAgICogQHBhcmFtIHNlc3Npb25JZCBUaGUgSUQgb2YgdGhlIHNlc3Npb24gdG8gcmV0cnkuCi0gICAgICogQHBhcmFtIHN1YlBsYW4gVGhlIG5hbWUgb2YgYSBzdWJQbGFuIHRvIGJlIHVzZWQuIENhbiBiZSBudWxsLgotICAgICAqIEBwYXJhbSBpbmNsdWRlRmlsdGVycyBUaGUgaW5jbHVkZSBtb2R1bGUgZmlsdGVycyB0byBhcHBseQotICAgICAqIEBwYXJhbSBleGNsdWRlRmlsdGVycyBUaGUgZXhjbHVkZSBtb2R1bGUgZmlsdGVycyB0byBhcHBseQotICAgICAqIEBwYXJhbSBhYmlOYW1lIFRoZSBuYW1lIG9mIGFiaSB0byB1c2UuIENhbiBiZSBudWxsLgotICAgICAqIEBwYXJhbSBtb2R1bGVOYW1lIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgdG8gcnVuLiBDYW4gYmUgbnVsbC4KLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUgVGhlIG5hbWUgb2YgdGhlIHRlc3QgdG8gcnVuLiBDYW4gYmUgbnVsbC4KLSAgICAgKiBAcGFyYW0gcmV0cnlUeXBlIFRoZSB0eXBlIG9mIHJlc3VsdHMgdG8gcmV0cnkuIENhbiBiZSBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBSZXRyeUZpbHRlckhlbHBlcihDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIgYnVpbGQsIGludCBzZXNzaW9uSWQsIFN0cmluZyBzdWJQbGFuLAotICAgICAgICAgICAgU2V0PFN0cmluZz4gaW5jbHVkZUZpbHRlcnMsIFNldDxTdHJpbmc+IGV4Y2x1ZGVGaWx0ZXJzLCBTdHJpbmcgYWJpTmFtZSwKLSAgICAgICAgICAgIFN0cmluZyBtb2R1bGVOYW1lLCBTdHJpbmcgdGVzdE5hbWUsIFJldHJ5VHlwZSByZXRyeVR5cGUpIHsKLSAgICAgICAgdGhpcyhidWlsZCwgc2Vzc2lvbklkKTsKLSAgICAgICAgbVN1YlBsYW4gPSBzdWJQbGFuOwotICAgICAgICBtSW5jbHVkZUZpbHRlcnMuYWRkQWxsKGluY2x1ZGVGaWx0ZXJzKTsKLSAgICAgICAgbUV4Y2x1ZGVGaWx0ZXJzLmFkZEFsbChleGNsdWRlRmlsdGVycyk7Ci0gICAgICAgIG1BYmlOYW1lID0gYWJpTmFtZTsKLSAgICAgICAgbU1vZHVsZU5hbWUgPSBtb2R1bGVOYW1lOwotICAgICAgICBtVGVzdE5hbWUgPSB0ZXN0TmFtZTsKLSAgICAgICAgbVJldHJ5VHlwZSA9IHJldHJ5VHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaHJvd3MgYW4ge0BsaW5rIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbn0gaWYgdGhlIGRldmljZSBidWlsZCBmaW5nZXJwcmludCBkb2Vzbid0IG1hdGNoCi0gICAgICogdGhlIGZpbmdlcnByaW50IHJlY29yZGVkIGluIHRoZSBwcmV2aW91cyBzZXNzaW9uJ3MgcmVzdWx0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlQnVpbGRGaW5nZXJwcmludChJVGVzdERldmljZSBkZXZpY2UpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgb2xkQnVpbGRGaW5nZXJwcmludCA9IG5ldyBMaWdodEludm9jYXRpb25SZXN1bHQoZ2V0UmVzdWx0KCkpLmdldEJ1aWxkRmluZ2VycHJpbnQoKTsKLSAgICAgICAgU3RyaW5nIGN1cnJlbnRCdWlsZEZpbmdlcnByaW50ID0gZGV2aWNlLmdldFByb3BlcnR5KCJyby5idWlsZC5maW5nZXJwcmludCIpOwotICAgICAgICBpZiAoIW9sZEJ1aWxkRmluZ2VycHJpbnQuZXF1YWxzKGN1cnJlbnRCdWlsZEZpbmdlcnByaW50KSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAiRGV2aWNlIGJ1aWxkIGZpbmdlcnByaW50IG11c3QgbWF0Y2ggJXMgdG8gcmV0cnkgc2Vzc2lvbiAlZCIsCi0gICAgICAgICAgICAgICAgICAgIG9sZEJ1aWxkRmluZ2VycHJpbnQsIG1TZXNzaW9uSWQpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvcHkgYWxsIGFwcGxpY2FibGUgb3B0aW9ucyBmcm9tIGFuIGlucHV0IG9iamVjdCB0byB0aGlzIGluc3RhbmNlIG9mIFJldHJ5RmlsdGVySGVscGVyLgotICAgICAqLwotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHZvaWQgc2V0QWxsT3B0aW9uc0Zyb20oUmV0cnlGaWx0ZXJIZWxwZXIgb2JqKSB7Ci0gICAgICAgIGNsZWFyT3B0aW9ucygpOyAvLyBSZW1vdmUgZXhpc3Rpbmcgb3B0aW9ucyBmaXJzdAotICAgICAgICBtU3ViUGxhbiA9IG9iai5tU3ViUGxhbjsKLSAgICAgICAgbUluY2x1ZGVGaWx0ZXJzLmFkZEFsbChvYmoubUluY2x1ZGVGaWx0ZXJzKTsKLSAgICAgICAgbUV4Y2x1ZGVGaWx0ZXJzLmFkZEFsbChvYmoubUV4Y2x1ZGVGaWx0ZXJzKTsKLSAgICAgICAgbUFiaU5hbWUgPSBvYmoubUFiaU5hbWU7Ci0gICAgICAgIG1Nb2R1bGVOYW1lID0gb2JqLm1Nb2R1bGVOYW1lOwotICAgICAgICBtVGVzdE5hbWUgPSBvYmoubVRlc3ROYW1lOwotICAgICAgICBtUmV0cnlUeXBlID0gb2JqLm1SZXRyeVR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xlYXIgYWxsIG9wdGlvbiB2YWx1ZXMgb2YgdGhpcyBSZXRyeUZpbHRlckhlbHBlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbGVhck9wdGlvbnMoKSB7Ci0gICAgICAgIG1TdWJQbGFuID0gbnVsbDsKLSAgICAgICAgbUluY2x1ZGVGaWx0ZXJzLmNsZWFyKCk7Ci0gICAgICAgIG1FeGNsdWRlRmlsdGVycy5jbGVhcigpOwotICAgICAgICBtTW9kdWxlTmFtZSA9IG51bGw7Ci0gICAgICAgIG1UZXN0TmFtZSA9IG51bGw7Ci0gICAgICAgIG1SZXRyeVR5cGUgPSBudWxsOwotICAgICAgICBtQWJpTmFtZSA9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXNpbmcgY29tbWFuZC1saW5lIGFyZ3VtZW50cyBmcm9tIHRoZSBwcmV2aW91cyBzZXNzaW9uJ3MgcmVzdWx0LCBzZXQgdGhlIGlucHV0IG9iamVjdCdzCi0gICAgICogb3B0aW9uIHZhbHVlcyB0byB0aGUgdmFsdWVzIGFwcGxpZWQgaW4gdGhlIHByZXZpb3VzIHNlc3Npb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29tbWFuZExpbmVPcHRpb25zRm9yKE9iamVjdCBvYmopIHsKLSAgICAgICAgLy8gb25seSBuZWVkIGxpZ2h0IHZlcnNpb24gdG8gcmV0cmlldmUgY29tbWFuZC1saW5lIGFyZ3MKLSAgICAgICAgSUludm9jYXRpb25SZXN1bHQgcmVzdWx0ID0gbmV3IExpZ2h0SW52b2NhdGlvblJlc3VsdChnZXRSZXN1bHQoKSk7Ci0gICAgICAgIFN0cmluZyByZXRyeUNvbW1hbmRMaW5lQXJncyA9IHJlc3VsdC5nZXRDb21tYW5kTGluZUFyZ3MoKTsKLSAgICAgICAgaWYgKHJldHJ5Q29tbWFuZExpbmVBcmdzICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gcGFyc2UgdGhlIGNvbW1hbmQtbGluZSBzdHJpbmcgZnJvbSB0aGUgcmVzdWx0IGZpbGUgYW5kIHNldCBvcHRpb25zCi0gICAgICAgICAgICAgICAgQXJnc09wdGlvblBhcnNlciBwYXJzZXIgPSBuZXcgQXJnc09wdGlvblBhcnNlcihvYmopOwotICAgICAgICAgICAgICAgIHBhcnNlci5wYXJzZShPcHRpb25IZWxwZXIuZ2V0VmFsaWRDbGlBcmdzKHJldHJ5Q29tbWFuZExpbmVBcmdzLCBvYmopKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmUgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlc3VsdCB0byByZXRyeSB1c2luZyB0aGUgaW5zdGFuY2UgdmFyaWFibGVzIHJlZmVyZW5jaW5nCi0gICAgICogdGhlIGJ1aWxkIGFuZCB0aGUgZGVzaXJlZCBzZXNzaW9uIElELiBXaGlsZSBpdCBpcyBmYXN0ZXIgdG8gbG9hZCB0aGlzIHJlc3VsdCBvbmNlIGFuZAotICAgICAqIHN0b3JlIGl0IGFzIGFuIGluc3RhbmNlIHZhcmlhYmxlLCB7QGxpbmsgSUludm9jYXRpb25SZXN1bHR9IG9iamVjdHMgYXJlIGxhcmdlLCBhbmQKLSAgICAgKiBtZW1vcnkgaXMgb2YgZ3JlYXRlciBjb25jZXJuLgotICAgICAqLwotICAgIHB1YmxpYyBJSW52b2NhdGlvblJlc3VsdCBnZXRSZXN1bHQoKSB7Ci0gICAgICAgIElJbnZvY2F0aW9uUmVzdWx0IHJlc3VsdCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBSZXN1bHRIYW5kbGVyLmZpbmRSZXN1bHQobUJ1aWxkLmdldFJlc3VsdHNEaXIoKSwgbVNlc3Npb25JZCk7Ci0gICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBmaW5kIHNlc3Npb24gd2l0aCBpZCAlZCIsIG1TZXNzaW9uSWQpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBvcHVsYXRlIG1SZXRyeUluY2x1ZGVzIGFuZCBtUmV0cnlFeGNsdWRlcyBiYXNlZCBvbiB0aGUgb3B0aW9ucyBhbmQgdGhlIHJlc3VsdCBzZXQgZm9yCi0gICAgICogdGhpcyBpbnN0YW5jZSBvZiBSZXRyeUZpbHRlckhlbHBlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwb3B1bGF0ZVJldHJ5RmlsdGVycygpIHsKLSAgICAgICAgbVJldHJ5SW5jbHVkZXMgPSBuZXcgSGFzaFNldDw+KG1JbmNsdWRlRmlsdGVycyk7IC8vIHJlc2V0IGZvciBlYWNoIHBvcHVsYXRpb24KLSAgICAgICAgbVJldHJ5RXhjbHVkZXMgPSBuZXcgSGFzaFNldDw+KG1FeGNsdWRlRmlsdGVycyk7IC8vIHJlc2V0IGZvciBlYWNoIHBvcHVsYXRpb24KLSAgICAgICAgaWYgKFJldHJ5VHlwZS5DVVNUT00uZXF1YWxzKG1SZXRyeVR5cGUpKSB7Ci0gICAgICAgICAgICBTZXQ8U3RyaW5nPiBjdXN0b21JbmNsdWRlcyA9IG5ldyBIYXNoU2V0PD4obUluY2x1ZGVGaWx0ZXJzKTsKLSAgICAgICAgICAgIFNldDxTdHJpbmc+IGN1c3RvbUV4Y2x1ZGVzID0gbmV3IEhhc2hTZXQ8PihtRXhjbHVkZUZpbHRlcnMpOwotICAgICAgICAgICAgaWYgKG1TdWJQbGFuICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJU3ViUGxhbiByZXRyeVN1YlBsYW4gPSBTdWJQbGFuSGVscGVyLmdldFN1YlBsYW5CeU5hbWUobUJ1aWxkLCBtU3ViUGxhbik7Ci0gICAgICAgICAgICAgICAgY3VzdG9tSW5jbHVkZXMuYWRkQWxsKHJldHJ5U3ViUGxhbi5nZXRJbmNsdWRlRmlsdGVycygpKTsKLSAgICAgICAgICAgICAgICBjdXN0b21FeGNsdWRlcy5hZGRBbGwocmV0cnlTdWJQbGFuLmdldEV4Y2x1ZGVGaWx0ZXJzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSWYgaW5jbHVkZXMgd2VyZSBhZGRlZCwgb25seSB1c2UgdGhvc2UgaW5jbHVkZXMuIEFsc28gdXNlIGV4Y2x1ZGVzIGFkZGVkIGRpcmVjdGx5Ci0gICAgICAgICAgICAvLyBvciBieSBzdWJwbGFuLiBPdGhlcndpc2UsIGRlZmF1bHQgdG8gbm9ybWFsIHJldHJ5LgotICAgICAgICAgICAgaWYgKCFjdXN0b21JbmNsdWRlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBtUmV0cnlJbmNsdWRlcy5jbGVhcigpOwotICAgICAgICAgICAgICAgIG1SZXRyeUluY2x1ZGVzLmFkZEFsbChjdXN0b21JbmNsdWRlcyk7Ci0gICAgICAgICAgICAgICAgbVJldHJ5RXhjbHVkZXMuYWRkQWxsKGN1c3RvbUV4Y2x1ZGVzKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gcmVtb3ZlIGFueSBleHRyYSBmaWx0ZXJpbmcgb3B0aW9ucwotICAgICAgICAvLyBUT0RPKGFhcm9uaG9sZGVuKSByZW1vdmUgbm9uLXBsYW4gaW5jbHVkZXMgKGUuZy4gdGhvc2UgaW4gY3RzLXZlbmRvci1pbnRlcmZhY2UpCi0gICAgICAgIC8vIFRPRE8oYWFyb25ob2xkZW4pIHJlbW92ZSBub24ta25vd24tZmFpbHVyZSBleGNsdWRlcwotICAgICAgICBtTW9kdWxlTmFtZSA9IG51bGw7Ci0gICAgICAgIG1UZXN0TmFtZSA9IG51bGw7Ci0gICAgICAgIG1TdWJQbGFuID0gbnVsbDsKLSAgICAgICAgcG9wdWxhdGVGaWx0ZXJzQnlTdWJQbGFuKCk7Ci0gICAgICAgIHBvcHVsYXRlUHJldmlvdXNTZXNzaW9uRmlsdGVycygpOwotICAgIH0KLQotICAgIC8qIEdlbmVyYXRpb24gb2YgZmlsdGVycyBiYXNlZCBvbiBwcmV2aW91cyBzZXNzaW9ucyBpcyBpbXBsZW1lbnRlZCB0aG9yb3VnaGx5IGluIFN1YlBsYW5IZWxwZXIsCi0gICAgICogYW5kIHJldHJ5IGZpbHRlciBnZW5lcmF0aW9uIGlzIGp1c3QgYSBzdWJzZXQgb2YgdGhlIHVzZSBjYXNlcyBmb3IgdGhlIHN1YnBsYW4gcmV0cnkgbG9naWMuCi0gICAgICogVXNlIHJldHJ5IHR5cGUgdG8gZGV0ZXJtaW5lIHdoaWNoIHJlc3VsdCB0eXBlcyBTdWJQbGFuSGVscGVyIHRhcmdldHMuICovCi0gICAgcHVibGljIHZvaWQgcG9wdWxhdGVGaWx0ZXJzQnlTdWJQbGFuKCkgewotICAgICAgICBTdWJQbGFuSGVscGVyIHJldHJ5UGxhbkNyZWF0b3IgPSBuZXcgU3ViUGxhbkhlbHBlcigpOwotICAgICAgICByZXRyeVBsYW5DcmVhdG9yLnNldFJlc3VsdChnZXRSZXN1bHQoKSk7Ci0gICAgICAgIGlmIChSZXRyeVR5cGUuRkFJTEVELmVxdWFscyhtUmV0cnlUeXBlKSkgewotICAgICAgICAgICAgLy8gcmV0cnkgb25seSBmYWlsZWQgdGVzdHMKLSAgICAgICAgICAgIHJldHJ5UGxhbkNyZWF0b3IuYWRkUmVzdWx0VHlwZShTdWJQbGFuSGVscGVyLkZBSUxFRCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoUmV0cnlUeXBlLk5PVF9FWEVDVVRFRC5lcXVhbHMobVJldHJ5VHlwZSkpewotICAgICAgICAgICAgLy8gcmV0cnkgb25seSBub3QgZXhlY3V0ZWQgdGVzdHMKLSAgICAgICAgICAgIHJldHJ5UGxhbkNyZWF0b3IuYWRkUmVzdWx0VHlwZShTdWJQbGFuSGVscGVyLk5PVF9FWEVDVVRFRCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyByZXRyeSBib3RoIGZhaWxlZCBhbmQgbm90IGV4ZWN1dGVkIHRlc3RzCi0gICAgICAgICAgICByZXRyeVBsYW5DcmVhdG9yLmFkZFJlc3VsdFR5cGUoU3ViUGxhbkhlbHBlci5GQUlMRUQpOwotICAgICAgICAgICAgcmV0cnlQbGFuQ3JlYXRvci5hZGRSZXN1bHRUeXBlKFN1YlBsYW5IZWxwZXIuTk9UX0VYRUNVVEVEKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgSVN1YlBsYW4gcmV0cnlQbGFuID0gcmV0cnlQbGFuQ3JlYXRvci5jcmVhdGVTdWJQbGFuKG1CdWlsZCk7Ci0gICAgICAgICAgICBtUmV0cnlJbmNsdWRlcy5hZGRBbGwocmV0cnlQbGFuLmdldEluY2x1ZGVGaWx0ZXJzKCkpOwotICAgICAgICAgICAgbVJldHJ5RXhjbHVkZXMuYWRkQWxsKHJldHJ5UGxhbi5nZXRFeGNsdWRlRmlsdGVycygpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiAoIkZhaWxlZCB0byBjcmVhdGUgc3VicGxhbiBmb3IgcmV0cnkiLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIFJldHJpZXZlcyB0aGUgb3B0aW9ucyBzZXQgdmlhIGNvbW1hbmQtbGluZSBvbiB0aGUgcHJldmlvdXMgc2Vzc2lvbiwgYW5kIGdlbmVyYXRlcy9hZGRzCi0gICAgICogZmlsdGVycyBhY2NvcmRpbmdseSAqLwotICAgIHByaXZhdGUgdm9pZCBwb3B1bGF0ZVByZXZpb3VzU2Vzc2lvbkZpbHRlcnMoKSB7Ci0gICAgICAgIC8vIFRlbXBvcmFyaWx5IHN0b3JlIG9wdGlvbnMgZnJvbSB0aGlzIGluc3RhbmNlIGluIGFub3RoZXIgaW5zdGFuY2UKLSAgICAgICAgUmV0cnlGaWx0ZXJIZWxwZXIgdG1wSGVscGVyID0gbmV3IFJldHJ5RmlsdGVySGVscGVyKG1CdWlsZCwgbVNlc3Npb25JZCk7Ci0gICAgICAgIHRtcEhlbHBlci5zZXRBbGxPcHRpb25zRnJvbSh0aGlzKTsKLSAgICAgICAgLy8gQ29weSBjb21tYW5kLWxpbmUgYXJncyBmcm9tIHByZXZpb3VzIHNlc3Npb24gdG8gdGhpcyBSZXRyeUZpbHRlckhlbHBlcidzIG9wdGlvbnMKLSAgICAgICAgc2V0Q29tbWFuZExpbmVPcHRpb25zRm9yKHRoaXMpOwotCi0gICAgICAgIG1SZXRyeUluY2x1ZGVzLmFkZEFsbChtSW5jbHVkZUZpbHRlcnMpOwotICAgICAgICBtUmV0cnlFeGNsdWRlcy5hZGRBbGwobUV4Y2x1ZGVGaWx0ZXJzKTsKLSAgICAgICAgaWYgKG1TdWJQbGFuICE9IG51bGwpIHsKLSAgICAgICAgICAgIElTdWJQbGFuIHJldHJ5U3ViUGxhbiA9IFN1YlBsYW5IZWxwZXIuZ2V0U3ViUGxhbkJ5TmFtZShtQnVpbGQsIG1TdWJQbGFuKTsKLSAgICAgICAgICAgIG1SZXRyeUluY2x1ZGVzLmFkZEFsbChyZXRyeVN1YlBsYW4uZ2V0SW5jbHVkZUZpbHRlcnMoKSk7Ci0gICAgICAgICAgICBtUmV0cnlFeGNsdWRlcy5hZGRBbGwocmV0cnlTdWJQbGFuLmdldEV4Y2x1ZGVGaWx0ZXJzKCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtTW9kdWxlTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBtb2R1bGVzID0gTW9kdWxlUmVwby5nZXRNb2R1bGVOYW1lc01hdGNoaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgbUJ1aWxkLmdldFRlc3RzRGlyKCksIG1Nb2R1bGVOYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAobW9kdWxlcy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIk5vIG1vZHVsZXMgZm91bmQgbWF0Y2hpbmcgJXMiLCBtTW9kdWxlTmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobW9kdWxlcy5zaXplKCkgPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTXVsdGlwbGUgbW9kdWxlcyBmb3VuZCBtYXRjaGluZyAlczpcbiVzXG5XaGljaCBvbmUgZGlkIHlvdSBtZWFuP1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTW9kdWxlTmFtZSwgQXJyYXlVdGlsLmpvaW4oIlxuIiwgbW9kdWxlcykpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbW9kdWxlID0gbW9kdWxlcy5nZXQoMCk7Ci0gICAgICAgICAgICAgICAgICAgIGNsZWFuRmlsdGVycyhtUmV0cnlJbmNsdWRlcywgbW9kdWxlKTsKLSAgICAgICAgICAgICAgICAgICAgY2xlYW5GaWx0ZXJzKG1SZXRyeUV4Y2x1ZGVzLCBtb2R1bGUpOwotICAgICAgICAgICAgICAgICAgICBtUmV0cnlJbmNsdWRlcy5hZGQobmV3IFRlc3RGaWx0ZXIobUFiaU5hbWUsIG1vZHVsZSwgbVRlc3ROYW1lKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG1UZXN0TmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJUZXN0IG5hbWUgZ2l2ZW4gd2l0aG91dCBtb2R1bGUgbmFtZS4gQWRkIC0tbW9kdWxlIDxtb2R1bGUtbmFtZT4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENvcHkgb3B0aW9ucyBmb3IgY3VycmVudCBzZXNzaW9uIGJhY2sgdG8gdGhpcyBpbnN0YW5jZQotICAgICAgICBzZXRBbGxPcHRpb25zRnJvbSh0bXBIZWxwZXIpOwotICAgIH0KLQotICAgIC8qIEhlbHBlciBtZXRob2QgZGVzaWduZWQgdG8gcmVtb3ZlIGZpbHRlcnMgaW4gYSBsaXN0IG5vdCBhcHBsaWNhYmxlIHRvIHRoZSBnaXZlbiBtb2R1bGUgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNsZWFuRmlsdGVycyhTZXQ8U3RyaW5nPiBmaWx0ZXJzLCBTdHJpbmcgbW9kdWxlKSB7Ci0gICAgICAgIFNldDxTdHJpbmc+IGNsZWFuZWRGaWx0ZXJzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICBmb3IgKFN0cmluZyBmaWx0ZXIgOiBmaWx0ZXJzKSB7Ci0gICAgICAgICAgICBpZiAobW9kdWxlLmVxdWFscyhUZXN0RmlsdGVyLmNyZWF0ZUZyb20oZmlsdGVyKS5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgY2xlYW5lZEZpbHRlcnMuYWRkKGZpbHRlcik7IC8vIE1vZHVsZSBuYW1lIG1hdGNoZXMsIGZpbHRlciBwYXNzZXMKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaWx0ZXJzLmNsZWFyKCk7Ci0gICAgICAgIGZpbHRlcnMuYWRkQWxsKGNsZWFuZWRGaWx0ZXJzKTsKLSAgICB9Ci0KLSAgICAvKiogUmV0cmlldmUgaW5jbHVkZSBmaWx0ZXJzIHRvIGJlIGFwcGxpZWQgb24gcmV0cnkgKi8KLSAgICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0SW5jbHVkZUZpbHRlcnMoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSGFzaFNldDw+KG1SZXRyeUluY2x1ZGVzKTsKLSAgICB9Ci0KLSAgICAvKiogUmV0cmlldmUgZXhjbHVkZSBmaWx0ZXJzIHRvIGJlIGFwcGxpZWQgb24gcmV0cnkgKi8KLSAgICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0RXhjbHVkZUZpbHRlcnMoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSGFzaFNldDw+KG1SZXRyeUV4Y2x1ZGVzKTsKLSAgICB9Ci0KLSAgICAvKiogQ2xlYXJzIHJldHJ5IGZpbHRlcnMgYW5kIGludGVybmFsIHN0b3JhZ2Ugb2Ygb3B0aW9ucywgZXhjZXB0IGJ1aWxkSW5mbyBhbmQgc2Vzc2lvbiBJRCAqLwotICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgewotICAgICAgICBjbGVhck9wdGlvbnMoKTsKLSAgICAgICAgbVJldHJ5SW5jbHVkZXMgPSBudWxsOwotICAgICAgICBtUmV0cnlFeGNsdWRlcyA9IG51bGw7Ci0gICAgICAgIC8vIGtlZXAgcmVmZXJlbmNlcyB0byBidWlsZEluZm8gYW5kIHNlc3Npb24gSUQKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC91dGlsL1JldHJ5VHlwZS5qYXZhIGIvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdXRpbC9SZXRyeVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVkM2NkNS4uMDAwMDAwMAotLS0gYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC91dGlsL1JldHJ5VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudXRpbDsKLQotLyoqCi0gKiBFbnVtIGZvciAtLXJldHJ5LXR5cGUgb3B0aW9uIHZhbHVlIGluIGNvbXBhdGliaWxpdHkgdGVzdGluZy4KLSAqLwotcHVibGljIGVudW0gUmV0cnlUeXBlIHsKLSAgICBGQUlMRUQsCi0gICAgTk9UX0VYRUNVVEVELAotICAgIENVU1RPTTsKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3V0aWwvVW5pcXVlTW9kdWxlQ291bnRVdGlsLmphdmEgYi9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC91dGlsL1VuaXF1ZU1vZHVsZUNvdW50VXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODAxYWIzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3V0aWwvVW5pcXVlTW9kdWxlQ291bnRVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudXRpbDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRlc3R0eXBlLklNb2R1bGVEZWY7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBVdGlsaXR5IHRvIGNvdW50IHRoZSBudW1iZXIgb2YgdW5pcXVlIG1vZHVsZSBmcm9tIGxpc3Qgb2Yge0BsaW5rIElNb2R1bGVEZWZ9LgotICovCi1wdWJsaWMgY2xhc3MgVW5pcXVlTW9kdWxlQ291bnRVdGlsIHsKLQotICAgIC8qKgotICAgICAqIENvdW50IHRoZSBudW1iZXIgb2YgdW5pcXVlIG1vZHVsZXMgd2l0aGluIHRoZSBsaXN0IHVzaW5nIG1vZHVsZSBpZC4gSWYgdHdvIElNb2R1bGVEZWYgaGF2ZQotICAgICAqIHRoZSBzYW1lIGlkLCB0aGV5IGFyZSBwYXJ0IG9mIHRoZSBzYW1lIG1vZHVsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsaXN0TW9kdWxlcyBsaXN0IG9mIHtAbGluayBJTW9kdWxlRGVmfSB0byBjb3VudCBmcm9tCi0gICAgICogQHJldHVybiB0aGUgY291bnQgb2YgdW5pcXVlIG1vZHVsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGludCBjb3VudFVuaXF1ZU1vZHVsZXMoTGlzdDxJTW9kdWxlRGVmPiBsaXN0TW9kdWxlcykgewotICAgICAgICBIYXNoU2V0PFN0cmluZz4gdW5pcXVlTmFtZXMgPSBuZXcgSGFzaFNldDw+KCk7Ci0gICAgICAgIGZvciAoSU1vZHVsZURlZiBzdWJNb2R1bGUgOiBsaXN0TW9kdWxlcykgewotICAgICAgICAgICAgdW5pcXVlTmFtZXMuYWRkKHN1Yk1vZHVsZS5nZXRJZCgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdW5pcXVlTmFtZXMuc2l6ZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvdGVzdHMvQW5kcm9pZC5tayBiL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvdGVzdHMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYxNTk0YS4uMDAwMDAwMAotLS0gYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3Rlc3RzL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotIyBNYWtlIGEgbW9jayBjb21wYXRpYmlsaXR5IHN1aXRlIHRvIHRlc3QKLUxPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIC4uL3NyYykKLUxPQ0FMX0pBVkFfUkVTT1VSQ0VfRElSUyA6PSAuLi9yZXMKLWluY2x1ZGUgY3RzL2Vycm9yX3Byb25lX3J1bGVzLm1rCi0KLUxPQ0FMX1NVSVRFX0JVSUxEX05VTUJFUiA6PSAyCi1MT0NBTF9TVUlURV9UQVJHRVRfQVJDSCA6PSAkKFRBUkdFVF9BUkNIKQotTE9DQUxfU1VJVEVfTkFNRSA6PSBURVNUUwotTE9DQUxfU1VJVEVfRlVMTE5BTUUgOj0gIkNvbXBhdGliaWxpdHkgVGVzdHMiCi1MT0NBTF9TVUlURV9WRVJTSU9OIDo9IDEKLQotTE9DQUxfTU9EVUxFIDo9IGNvbXBhdGliaWxpdHktbW9jay10cmFkZWZlZAotaW5jbHVkZSBjdHMvZXJyb3JfcHJvbmVfcnVsZXMubWsKLWluY2x1ZGUgJChCVUlMRF9DT01QQVRJQklMSVRZX1NVSVRFKQotCi0jIE1ha2UgdGhlIHRlc3RzCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQotTE9DQUxfSkFWQV9SRVNPVVJDRV9ESVJTIDo9IHJlcwotCi1pbmNsdWRlIGN0cy9lcnJvcl9wcm9uZV9ydWxlcy5tawotTE9DQUxfTU9EVUxFIDo9IGNvbXBhdGliaWxpdHktdHJhZGVmZWQtdGVzdHMKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGVhc3ltb2NrCi0KLUxPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IHRyYWRlZmVkIGNvbXBhdGliaWxpdHktbW9jay10cmFkZWZlZCBqdW5pdC1ob3N0IGNvbXBhdGliaWxpdHktaG9zdC11dGlsCi0KLWluY2x1ZGUgJChCVUlMRF9IT1NUX0pBVkFfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvdGVzdHMvcmVzL3Rlc3R0eXBlL3Rlc3RKYXIxLmphciBiL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvdGVzdHMvcmVzL3Rlc3R0eXBlL3Rlc3RKYXIxLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBkNWJkMi4uMDAwMDAwMAotLS0gYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3Rlc3RzL3Jlcy90ZXN0dHlwZS90ZXN0SmFyMS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3Rlc3RzL3Jlcy90ZXN0dHlwZS90ZXN0SmFyMi5qYXIgYi9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3Rlc3RzL3Jlcy90ZXN0dHlwZS90ZXN0SmFyMi5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0YzMxNzkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC90ZXN0cy9yZXMvdGVzdHR5cGUvdGVzdEphcjIuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC90ZXN0cy9ydW5fdGVzdHMuc2ggYi9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3Rlc3RzL3J1bl90ZXN0cy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWQxOTQwZC4uMDAwMDAwMAotLS0gYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3Rlc3RzL3J1bl90ZXN0cy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSMhL2Jpbi9iYXNoCi0KLSMgQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1DVFNfRElSPSQoZGlybmFtZSAkezB9KS8uLi8uLi8uLi8uLgotc291cmNlICR7Q1RTX0RJUn0vdGVzdF9kZWZzLnNoCi0KLUpBUlM9IgotICAgIGNvbXBhdGliaWxpdHktY29tbW9uLXV0aWwtaG9zdHNpZGVsaWJcCi0gICAgY29tcGF0aWJpbGl0eS1jb21tb24tdXRpbC10ZXN0c1wKLSAgICBjb21wYXRpYmlsaXR5LWhvc3QtdXRpbFwKLSAgICBjb21wYXRpYmlsaXR5LWhvc3QtdXRpbC10ZXN0c1wKLSAgICBjb21wYXRpYmlsaXR5LW1vY2stdHJhZGVmZWRcCi0gICAgY29tcGF0aWJpbGl0eS10cmFkZWZlZC10ZXN0cyIKLQotcnVuX3Rlc3RzICJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC5Vbml0VGVzdHMiICIke0pBUlN9IiAiJHtAfSIKLQpkaWZmIC0tZ2l0IGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvVW5pdFRlc3RzLmphdmEgYi9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC9Vbml0VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFhYTU0Mi4uMDAwMDAwMAotLS0gYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC9Vbml0VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQ7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC5idWlsZC5Db21wYXRpYmlsaXR5QnVpbGRIZWxwZXJUZXN0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLmJ1aWxkLkNvbXBhdGliaWxpdHlCdWlsZFByb3ZpZGVyVGVzdDsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC5jb21tYW5kLkNvbXBhdGliaWxpdHlDb25zb2xlVGVzdDsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC5jb25maWcuQ29uZmlndXJhdGlvbkZhY3RvcnlUZXN0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnByZXN1Ym1pdC5BcGtQYWNrYWdlTmFtZUNoZWNrOwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnByZXN1Ym1pdC5DdHNDb25maWdMb2FkaW5nVGVzdDsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC5wcmVzdWJtaXQuSW50ZWdyYXRpb25UZXN0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnByZXN1Ym1pdC5QcmVzdWJtaXRTZXR1cFZhbGlkYXRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQucHJlc3VibWl0LlZhbGlkYXRlVGVzdHNBYmk7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQucmVzdWx0LkNoZWNrc3VtUmVwb3J0ZXJUZXN0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnJlc3VsdC5Db25zb2xlUmVwb3J0ZXJUZXN0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnJlc3VsdC5NZXRhZGF0YVJlcG9ydGVyVGVzdDsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC5yZXN1bHQuUmVzdWx0UmVwb3J0ZXJCdWlsZEluZm9UZXN0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnJlc3VsdC5SZXN1bHRSZXBvcnRlclRlc3Q7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQucmVzdWx0LlN1YlBsYW5IZWxwZXJUZXN0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRhcmdldHByZXAuTWVkaWFQcmVwYXJlclRlc3Q7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGFyZ2V0cHJlcC5Qcm9wZXJ0eUNoZWNrVGVzdDsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50YXJnZXRwcmVwLlNldHRpbmdzUHJlcGFyZXJUZXN0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRlc3R0eXBlLkNvbXBhdGliaWxpdHlIb3N0VGVzdEJhc2VUZXN0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRlc3R0eXBlLkNvbXBhdGliaWxpdHlUZXN0VGVzdDsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5KYXJIb3N0VGVzdFRlc3Q7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGVzdHR5cGUuTW9kdWxlRGVmVGVzdDsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5Nb2R1bGVSZXBvVGVzdDsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5TdWJQbGFuVGVzdDsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5yZXRyeS5SZXRyeUZhY3RvcnlUZXN0VGVzdDsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5zdWl0ZS5Db21wYXRpYmlsaXR5VGVzdFN1aXRlVGVzdDsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5zdWl0ZS5Nb2R1bGVSZXBvU3VpdGVUZXN0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnV0aWwuQ29sbGVjdG9yVXRpbFRlc3Q7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudXRpbC5EeW5hbWljQ29uZmlnRmlsZVJlYWRlclRlc3Q7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudXRpbC5PcHRpb25IZWxwZXJUZXN0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnV0aWwuUmV0cnlGaWx0ZXJIZWxwZXJUZXN0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnV0aWwuVW5pcXVlTW9kdWxlQ291bnRVdGlsVGVzdDsKLQotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKLWltcG9ydCBvcmcuanVuaXQucnVubmVycy5TdWl0ZTsKLWltcG9ydCBvcmcuanVuaXQucnVubmVycy5TdWl0ZS5TdWl0ZUNsYXNzZXM7Ci0KLS8qKgotICogQSB0ZXN0IHN1aXRlIGZvciBhbGwgY29tcGF0aWJpbGl0eSB0cmFkZWZlZCB1bml0IHRlc3RzLgotICogPHAvPgotICogQWxsIHRlc3RzIGxpc3RlZCBoZXJlIHNob3VsZCBiZSBzZWxmLWNvbnRhaW5lZCwgYW5kIGRvIG5vdCByZXF1aXJlIGFueSBleHRlcm5hbCBkZXBlbmRlbmNpZXMuCi0gKi8KLUBSdW5XaXRoKFN1aXRlLmNsYXNzKQotQFN1aXRlQ2xhc3Nlcyh7Ci0gICAgLy8gYnVpbGQKLSAgICBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXJUZXN0LmNsYXNzLAotICAgIENvbXBhdGliaWxpdHlCdWlsZFByb3ZpZGVyVGVzdC5jbGFzcywKLQotICAgIC8vIGNvbW1hbmQKLSAgICBDb21wYXRpYmlsaXR5Q29uc29sZVRlc3QuY2xhc3MsCi0KLSAgICAvL2NvbmZpZwotICAgIENvbmZpZ3VyYXRpb25GYWN0b3J5VGVzdC5jbGFzcywKLQotICAgIC8vIHByZXN1Ym1pdAotICAgIEFwa1BhY2thZ2VOYW1lQ2hlY2suY2xhc3MsCi0gICAgQ3RzQ29uZmlnTG9hZGluZ1Rlc3QuY2xhc3MsCi0gICAgSW50ZWdyYXRpb25UZXN0LmNsYXNzLAotICAgIFByZXN1Ym1pdFNldHVwVmFsaWRhdGlvbi5jbGFzcywKLSAgICBWYWxpZGF0ZVRlc3RzQWJpLmNsYXNzLAotCi0gICAgLy9yZXN1bHQKLSAgICBDaGVja3N1bVJlcG9ydGVyVGVzdC5jbGFzcywKLSAgICBDb25zb2xlUmVwb3J0ZXJUZXN0LmNsYXNzLAotICAgIE1ldGFkYXRhUmVwb3J0ZXJUZXN0LmNsYXNzLAotICAgIFJlc3VsdFJlcG9ydGVyQnVpbGRJbmZvVGVzdC5jbGFzcywKLSAgICBSZXN1bHRSZXBvcnRlclRlc3QuY2xhc3MsCi0gICAgU3ViUGxhbkhlbHBlclRlc3QuY2xhc3MsCi0KLSAgICAvLyB0YXJnZXRwcmVwCi0gICAgTWVkaWFQcmVwYXJlclRlc3QuY2xhc3MsCi0gICAgUHJvcGVydHlDaGVja1Rlc3QuY2xhc3MsCi0gICAgU2V0dGluZ3NQcmVwYXJlclRlc3QuY2xhc3MsCi0KLSAgICAvLyB0ZXN0dHlwZQotICAgIENvbXBhdGliaWxpdHlIb3N0VGVzdEJhc2VUZXN0LmNsYXNzLAotICAgIENvbXBhdGliaWxpdHlUZXN0VGVzdC5jbGFzcywKLSAgICBKYXJIb3N0VGVzdFRlc3QuY2xhc3MsCi0gICAgTW9kdWxlRGVmVGVzdC5jbGFzcywKLSAgICBNb2R1bGVSZXBvVGVzdC5jbGFzcywKLSAgICBTdWJQbGFuVGVzdC5jbGFzcywKLQotICAgIC8vIHRlc3R0eXBlLnJldHJ5Ci0gICAgUmV0cnlGYWN0b3J5VGVzdFRlc3QuY2xhc3MsCi0KLSAgICAvLyB0ZXN0eXBlLnN1aXRlCi0gICAgQ29tcGF0aWJpbGl0eVRlc3RTdWl0ZVRlc3QuY2xhc3MsCi0gICAgTW9kdWxlUmVwb1N1aXRlVGVzdC5jbGFzcywKLQotICAgIC8vIHV0aWwKLSAgICBDb2xsZWN0b3JVdGlsVGVzdC5jbGFzcywKLSAgICBEeW5hbWljQ29uZmlnRmlsZVJlYWRlclRlc3QuY2xhc3MsCi0gICAgT3B0aW9uSGVscGVyVGVzdC5jbGFzcywKLSAgICBSZXRyeUZpbHRlckhlbHBlclRlc3QuY2xhc3MsCi0gICAgVW5pcXVlTW9kdWxlQ291bnRVdGlsVGVzdC5jbGFzcywKLX0pCi1wdWJsaWMgY2xhc3MgVW5pdFRlc3RzIHsKLSAgICAvLyBlbXB0eSBvbiBwdXJwb3NlCi19CmRpZmYgLS1naXQgYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC9idWlsZC9Db21wYXRpYmlsaXR5QnVpbGRIZWxwZXJUZXN0LmphdmEgYi9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC9idWlsZC9Db21wYXRpYmlsaXR5QnVpbGRIZWxwZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyOWRjYzAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvYnVpbGQvQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLmJ1aWxkOwotCi1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuYnVpbGQuSUJ1aWxkSW5mbzsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5jb25maWcuT3B0aW9uU2V0dGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnV0aWwuRmlsZVV0aWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1RfUFJPUEVSVFkgPSAiVEVTVFNfUk9PVCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVSUxEX05VTUJFUiA9ICIyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VJVEVfTkFNRSA9ICJURVNUUyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNVSVRFX0ZVTExfTkFNRSA9ICJDb21wYXRpYmlsaXR5IFRlc3RzIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VJVEVfVkVSU0lPTiA9ICIxIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VJVEVfUExBTiA9ICJjdHMiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEWU5BTUlDX0NPTkZJR19VUkwgPSAiIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9PVF9ESVJfTkFNRSA9ICJyb290IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFTRV9ESVJfTkFNRSA9ICJhbmRyb2lkLXRlc3RzIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVENBU0VTID0gInRlc3RjYXNlcyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfTElORV9BUkdTID0gImN0cyAtbSBDdHNNb2R1bGVUZXN0Q2FzZXMiOwotCi0gICAgcHJpdmF0ZSBGaWxlIG1Sb290ID0gbnVsbDsKLSAgICBwcml2YXRlIEZpbGUgbUJhc2UgPSBudWxsOwotICAgIHByaXZhdGUgRmlsZSBtVGVzdHMgPSBudWxsOwotICAgIHByaXZhdGUgSUJ1aWxkSW5mbyBtQnVpbGQ7Ci0gICAgcHJpdmF0ZSBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIgbUhlbHBlcjsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1Sb290ID0gRmlsZVV0aWwuY3JlYXRlVGVtcERpcihST09UX0RJUl9OQU1FKTsKLSAgICAgICAgc2V0UHJvcGVydHkobVJvb3QuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICBDb21wYXRpYmlsaXR5QnVpbGRQcm92aWRlciBwcm92aWRlciA9IG5ldyBDb21wYXRpYmlsaXR5QnVpbGRQcm92aWRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRTdWl0ZUluZm9OYW1lKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBTVUlURV9OQU1FOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFN1aXRlSW5mb0J1aWxkTnVtYmVyKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBCVUlMRF9OVU1CRVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0U3VpdGVJbmZvRnVsbG5hbWUoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNVSVRFX0ZVTExfTkFNRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRTdWl0ZUluZm9WZXJzaW9uKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBTVUlURV9WRVJTSU9OOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBPcHRpb25TZXR0ZXIgc2V0dGVyID0gbmV3IE9wdGlvblNldHRlcihwcm92aWRlcik7Ci0gICAgICAgIHNldHRlci5zZXRPcHRpb25WYWx1ZSgicGxhbiIsIFNVSVRFX1BMQU4pOwotICAgICAgICBzZXR0ZXIuc2V0T3B0aW9uVmFsdWUoImR5bmFtaWMtY29uZmlnLXVybCIsIERZTkFNSUNfQ09ORklHX1VSTCk7Ci0gICAgICAgIG1CdWlsZCA9IHByb3ZpZGVyLmdldEJ1aWxkKCk7Ci0gICAgICAgIG1IZWxwZXIgPSBuZXcgQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyKG1CdWlsZCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc2V0UHJvcGVydHkobnVsbCk7Ci0gICAgICAgIEZpbGVVdGlsLnJlY3Vyc2l2ZURlbGV0ZShtUm9vdCk7Ci0gICAgICAgIG1Sb290ID0gbnVsbDsKLSAgICAgICAgbUJhc2UgPSBudWxsOwotICAgICAgICBtVGVzdHMgPSBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVEaXJTdHJ1Y3R1cmUoKSB7Ci0gICAgICAgIG1CYXNlID0gbmV3IEZpbGUobVJvb3QsIEJBU0VfRElSX05BTUUpOwotICAgICAgICBtQmFzZS5ta2RpcnMoKTsKLSAgICAgICAgbVRlc3RzID0gbmV3IEZpbGUobUJhc2UsIFRFU1RDQVNFUyk7Ci0gICAgICAgIG1UZXN0cy5ta2RpcnMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3VpdGVJbmZvTG9hZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzZXRQcm9wZXJ0eShtUm9vdC5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IHN1aXRlIGJ1aWxkIG51bWJlciIsIEJVSUxEX05VTUJFUiwgbUhlbHBlci5nZXRTdWl0ZUJ1aWxkKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBzdWl0ZSBuYW1lIiwgU1VJVEVfTkFNRSwgbUhlbHBlci5nZXRTdWl0ZU5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IHN1aXRlIGZ1bGwgbmFtZSIsIFNVSVRFX0ZVTExfTkFNRSwgbUhlbHBlci5nZXRTdWl0ZUZ1bGxOYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBzdWl0ZSB2ZXJzaW9uIiwgU1VJVEVfVkVSU0lPTiwgbUhlbHBlci5nZXRTdWl0ZVZlcnNpb24oKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFByb3BlcnR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNldFByb3BlcnR5KG51bGwpOwotICAgICAgICBDb21wYXRpYmlsaXR5QnVpbGRQcm92aWRlciBwcm92aWRlciA9IG5ldyBDb21wYXRpYmlsaXR5QnVpbGRQcm92aWRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRTdWl0ZUluZm9OYW1lKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBTVUlURV9OQU1FOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBPcHRpb25TZXR0ZXIgc2V0dGVyID0gbmV3IE9wdGlvblNldHRlcihwcm92aWRlcik7Ci0gICAgICAgIHNldHRlci5zZXRPcHRpb25WYWx1ZSgicGxhbiIsIFNVSVRFX1BMQU4pOwotICAgICAgICBzZXR0ZXIuc2V0T3B0aW9uVmFsdWUoImR5bmFtaWMtY29uZmlnLXVybCIsIERZTkFNSUNfQ09ORklHX1VSTCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBTaG91bGQgZmFpbCB3aXRoIHJvb3QgdW5zZXQKLSAgICAgICAgICAgIG5ldyBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIocHJvdmlkZXIuZ2V0QnVpbGQoKSk7Ci0gICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBmYWlsIGZvciB1bnNldCByb290IHByb3BlcnR5Iik7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvKiBleHBlY3RlZCAqLwotICAgICAgICB9Ci0gICAgICAgIHNldFByb3BlcnR5KG1Sb290LmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgLy8gU2hvdWxkbid0IGZhaWwgd2l0aCByb290IHNldAotICAgICAgICBuZXcgQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyKHByb3ZpZGVyLmdldEJ1aWxkKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNldFByb3BlcnR5KG1Sb290LmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1IZWxwZXIuZ2V0RGlyKCk7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZCBoZWxwZXIgdmFsaWRhdGlvbiBzdWNjZWVkZWQgb24gYW4gaW52YWxpZCBpbnN0YWxsYXRpb24iKTsKLSAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIEV4cGVjdGVkCi0gICAgICAgIH0KLSAgICAgICAgY3JlYXRlRGlyU3RydWN0dXJlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtSGVscGVyLmdldFRlc3RzRGlyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbCgiQnVpbGQgaGVscGVyIHZhbGlkYXRpb24gZmFpbGVkIG9uIGEgdmFsaWQgaW5zdGFsbGF0aW9uIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGlycygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzZXRQcm9wZXJ0eShtUm9vdC5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgIGNyZWF0ZURpclN0cnVjdHVyZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG1Sb290KTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtQnVpbGQpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG1IZWxwZXIuZ2V0Um9vdERpcigpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3Qgcm9vdCBkaXIiLCBtUm9vdC5nZXRBYnNvbHV0ZVBhdGgoKSwKLSAgICAgICAgICAgICAgICBtSGVscGVyLmdldFJvb3REaXIoKS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IGJhc2UgZGlyIiwgbUJhc2UuZ2V0QWJzb2x1dGVQYXRoKCksCi0gICAgICAgICAgICAgICAgbUhlbHBlci5nZXREaXIoKS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IGxvZ3MgZGlyIiwgbmV3IEZpbGUobUJhc2UsICJsb2dzIikuZ2V0QWJzb2x1dGVQYXRoKCksCi0gICAgICAgICAgICAgICAgbUhlbHBlci5nZXRMb2dzRGlyKCkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCB0ZXN0cyBkaXIiLCBtVGVzdHMuZ2V0QWJzb2x1dGVQYXRoKCksCi0gICAgICAgICAgICAgICAgbUhlbHBlci5nZXRUZXN0c0RpcigpLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgcmVzdWx0cyBkaXIiLCBuZXcgRmlsZShtQmFzZSwgInJlc3VsdHMiKS5nZXRBYnNvbHV0ZVBhdGgoKSwKLSAgICAgICAgICAgICAgICBtSGVscGVyLmdldFJlc3VsdHNEaXIoKS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdldENvbW1hbmRMaW5lQXJncygpIHsKLSAgICAgICAgYXNzZXJ0TnVsbChtSGVscGVyLmdldENvbW1hbmRMaW5lQXJncygpKTsKLSAgICAgICAgbUJ1aWxkLmFkZEJ1aWxkQXR0cmlidXRlKCJjb21tYW5kX2xpbmVfYXJncyIsIENPTU1BTkRfTElORV9BUkdTKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKENPTU1BTkRfTElORV9BUkdTLCBtSGVscGVyLmdldENvbW1hbmRMaW5lQXJncygpKTsKLQotICAgICAgICBtQnVpbGQuYWRkQnVpbGRBdHRyaWJ1dGUoImNvbW1hbmRfbGluZV9hcmdzIiwgImN0cyAtLXJldHJ5IDAiKTsKLSAgICAgICAgbUhlbHBlci5zZXRSZXRyeUNvbW1hbmRMaW5lQXJncyhDT01NQU5EX0xJTkVfQVJHUyk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhDT01NQU5EX0xJTkVfQVJHUywgbUhlbHBlci5nZXRDb21tYW5kTGluZUFyZ3MoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNldE1vZHVsZUlkcygpIHsKLSAgICAgICAgbUhlbHBlci5zZXRNb2R1bGVJZHMobmV3IFN0cmluZ1tdIHsibW9kdWxlMSIsICJtb2R1bGUyIn0pOwotCi0gICAgICAgIGFzc2VydEVxdWFscygibW9kdWxlMSxtb2R1bGUyIiwKLSAgICAgICAgICAgIG1CdWlsZC5nZXRCdWlsZEF0dHJpYnV0ZXMoKS5nZXQoQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyLk1PRFVMRV9JRFMpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHRoYXQgYWRkaW5nIGR5bmFtaWMgY29uZmlnIHRvIGJlIHRyYWNrZWQgZm9yIHJlcG9ydGluZyBpcyBiYWNrZWQgYnkge0BsaW5rIEZpbGV9Ci0gICAgICogcmVmZXJlbmNlcyBhbmQgbm90IGFic29sdXRlIHBhdGguIFdoZW4gc2hhcmRpbmcsIHBhdGggYXJlIGludmFsaWRhdGVkIGJ1dCBGaWxlcyBhcmUgY29waWVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGREeW5hbWljRmlsZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZSB0bXBEeW5hbWljRmlsZSA9IEZpbGVVdGlsLmNyZWF0ZVRlbXBGaWxlKCJjdHMtdGVzdC1maWxlIiwgIi5keW5hbWljIik7Ci0gICAgICAgIEZpbGVVdGlsLndyaXRlVG9GaWxlKCJ0ZXN0IHN0cmluZyIsIHRtcER5bmFtaWNGaWxlKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1IZWxwZXIuYWRkRHluYW1pY0NvbmZpZ0ZpbGUoIkN0c01vZHVsZU5hbWUiLCB0bXBEeW5hbWljRmlsZSk7Ci0gICAgICAgICAgICBGaWxlIGN1cnJlbnREeW5hbWljRmlsZSA9IG1IZWxwZXIuZ2V0RHluYW1pY0NvbmZpZ0ZpbGVzKCkuZ2V0KCJDdHNNb2R1bGVOYW1lIik7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGN1cnJlbnREeW5hbWljRmlsZSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHModG1wRHluYW1pY0ZpbGUsIGN1cnJlbnREeW5hbWljRmlsZSk7Ci0gICAgICAgICAgICAvLyBJbiBjYXNlIG9mIHNoYXJkaW5nIHRoZSB1bmRlcmx5aW5nIGJ1aWxkIGluZm8gd2lsbCBiZSBjbG9uZWQsIGFuZCBvbGQgYnVpbGQgY2xlYW5lZC4KLSAgICAgICAgICAgIElCdWlsZEluZm8gY2xvbmUgPSBtQnVpbGQuY2xvbmUoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkLmNsZWFuVXAoKTsKLSAgICAgICAgICAgICAgICAvLyBXaXRoIGNsZWFudXAgdGhlIGN1cnJlbnQgZHluYW1pYyBmaWxlIHRyYWNrZWQgYXJlIGNsZWFuZWQKLSAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShjdXJyZW50RHluYW1pY0ZpbGUuZXhpc3RzKCkpOwotICAgICAgICAgICAgICAgIENvbXBhdGliaWxpdHlCdWlsZEhlbHBlciBoZWxwZXJTaGFyZCA9IG5ldyBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIoY2xvbmUpOwotICAgICAgICAgICAgICAgIEZpbGUgbmV3RHluYW1pY0ZpbGUgPSBoZWxwZXJTaGFyZC5nZXREeW5hbWljQ29uZmlnRmlsZXMoKS5nZXQoIkN0c01vZHVsZU5hbWUiKTsKLSAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKG5ld0R5bmFtaWNGaWxlKTsKLSAgICAgICAgICAgICAgICAvLyB0aGUgY2xvbmVkIGJ1aWxkIGhhcyB0aGUgaW5mb3MgYnV0IGJhY2tlZCBieSBvdGhlciBmaWxlCi0gICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UoCi0gICAgICAgICAgICAgICAgICAgICAgICB0bXBEeW5hbWljRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKS5lcXVhbHMobmV3RHluYW1pY0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKLSAgICAgICAgICAgICAgICAvLyBjb250ZW50IGhhcyBhbHNvIGZvbGxvd2VkLgotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygidGVzdCBzdHJpbmciLCBGaWxlVXRpbC5yZWFkU3RyaW5nRnJvbUZpbGUobmV3RHluYW1pY0ZpbGUpKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgY2xvbmUuY2xlYW5VcCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgRmlsZVV0aWwuZGVsZXRlRmlsZSh0bXBEeW5hbWljRmlsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSAqX1JPT1QgcHJvcGVydHkgb2YgdGhlIGJ1aWxkJ3MgaW5zdGFsbGF0aW9uIGxvY2F0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBzZXQsIG9yIG51bGwgdG8gY2xlYXIgdGhlIHByb3BlcnR5LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgIFN5c3RlbS5jbGVhclByb3BlcnR5KFJPT1RfUFJPUEVSVFkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KFJPT1RfUFJPUEVSVFksIHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL2J1aWxkL0NvbXBhdGliaWxpdHlCdWlsZFByb3ZpZGVyVGVzdC5qYXZhIGIvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvYnVpbGQvQ29tcGF0aWJpbGl0eUJ1aWxkUHJvdmlkZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYzVkYTMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvYnVpbGQvQ29tcGF0aWJpbGl0eUJ1aWxkUHJvdmlkZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQuYnVpbGQ7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5idWlsZC5JQnVpbGRJbmZvOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmJ1aWxkLklEZXZpY2VCdWlsZEluZm87Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuY29uZmlnLk9wdGlvblNldHRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuSVRlc3REZXZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudXRpbC5GaWxlVXRpbDsKLQotaW1wb3J0IG9yZy5lYXN5bW9jay5FYXN5TW9jazsKLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLWltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuSlVuaXQ0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi0vKioKLSAqIFVuaXQgdGVzdHMgZm9yIHtAbGluayBDb21wYXRpYmlsaXR5QnVpbGRQcm92aWRlcn0uCi0gKi8KLUBSdW5XaXRoKEpVbml0NC5jbGFzcykKLXB1YmxpYyBjbGFzcyBDb21wYXRpYmlsaXR5QnVpbGRQcm92aWRlclRlc3QgewotCi0gICAgcHJpdmF0ZSBDb21wYXRpYmlsaXR5QnVpbGRQcm92aWRlciBtUHJvdmlkZXI7Ci0gICAgcHJpdmF0ZSBJVGVzdERldmljZSBtTW9ja0RldmljZTsKLSAgICBwcml2YXRlIEZpbGUgbVJvb3REaXI7Ci0KLSAgICBAQmVmb3JlCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbU1vY2tEZXZpY2UgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElUZXN0RGV2aWNlLmNsYXNzKTsKLSAgICAgICAgbVJvb3REaXIgPSBGaWxlVXRpbC5jcmVhdGVUZW1wRGlyKCJjdHMtcm9vdC1kaXIiKTsKLSAgICAgICAgbVByb3ZpZGVyID0gbmV3IENvbXBhdGliaWxpdHlCdWlsZFByb3ZpZGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBTdHJpbmcgZ2V0Um9vdERpclBhdGgoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1Sb290RGlyLmdldEFic29sdXRlUGF0aCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIH0KLQotICAgIEBBZnRlcgotICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgewotICAgICAgICBGaWxlVXRpbC5yZWN1cnNpdmVEZWxldGUobVJvb3REaXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIGdldHRpbmcgdGhlIGJ1aWxkIGluZm8gd2l0aG91dCB1c2luZyB0aGUgZGV2aWNlIGluZm9ybWF0aW9uLgotICAgICAqLwotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEJhc2VHZXRCdWlsZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBFYXN5TW9jay5yZXBsYXkobU1vY2tEZXZpY2UpOwotICAgICAgICBJQnVpbGRJbmZvIGluZm8gPSBtUHJvdmlkZXIuZ2V0QnVpbGQobU1vY2tEZXZpY2UpOwotICAgICAgICBFYXN5TW9jay52ZXJpZnkobU1vY2tEZXZpY2UpOwotICAgICAgICBhc3NlcnRGYWxzZShpbmZvIGluc3RhbmNlb2YgSURldmljZUJ1aWxkSW5mbyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgYnVpbGRpbmcgYnVpbGQgaW5mb3MgdXNpbmcgdGhlIGRldmljZSBpbmZvcm1hdGlvbi4KLSAgICAgKi8KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RCYXNlR2V0QnVpbGRfd2l0aERldmljZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBPcHRpb25TZXR0ZXIgc2V0dGVyID0gbmV3IE9wdGlvblNldHRlcihtUHJvdmlkZXIpOwotICAgICAgICBzZXR0ZXIuc2V0T3B0aW9uVmFsdWUoInVzZS1kZXZpY2UtYnVpbGQtaW5mbyIsICJ0cnVlIik7Ci0gICAgICAgIHNldHRlci5zZXRPcHRpb25WYWx1ZSgiYnJhbmNoIiwgImJ1aWxkX2JyYW5jaCIpOwotICAgICAgICBFYXN5TW9jay5leHBlY3QobU1vY2tEZXZpY2UuZ2V0QnVpbGRJZCgpKS5hbmRSZXR1cm4oIjg4ODgiKTsKLSAgICAgICAgRWFzeU1vY2suZXhwZWN0KG1Nb2NrRGV2aWNlLmdldEJ1aWxkRmxhdm9yKCkpLmFuZFJldHVybigiZmxhdm9yIik7Ci0gICAgICAgIEVhc3lNb2NrLmV4cGVjdChtTW9ja0RldmljZS5nZXRCdWlsZEFsaWFzKCkpLmFuZFJldHVybigiYWxpYXMiKTsKLSAgICAgICAgRWFzeU1vY2sucmVwbGF5KG1Nb2NrRGV2aWNlKTsKLSAgICAgICAgSUJ1aWxkSW5mbyBpbmZvID0gbVByb3ZpZGVyLmdldEJ1aWxkKG1Nb2NrRGV2aWNlKTsKLSAgICAgICAgRWFzeU1vY2sudmVyaWZ5KG1Nb2NrRGV2aWNlKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShpbmZvIGluc3RhbmNlb2YgSURldmljZUJ1aWxkSW5mbyk7Ci0gICAgICAgIC8vIHRlc3RzIGRpciBzaG91bGQgYmUgcG9wdWxhdGVkCi0gICAgICAgIGFzc2VydE5vdE51bGwoKChJRGV2aWNlQnVpbGRJbmZvKWluZm8pLmdldFRlc3RzRGlyKCkpOwotICAgICAgICAvLyBlbnN1cmUgdGhhdCB0ZXN0cyBkaXIgaXMgbmV2ZXIgY2xlYW4gdXAuCi0gICAgICAgIG1Qcm92aWRlci5jbGVhblVwKGluZm8pOwotICAgICAgICBhc3NlcnROb3ROdWxsKCgoSURldmljZUJ1aWxkSW5mbylpbmZvKS5nZXRUZXN0c0RpcigpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC9jb21tYW5kL0NvbXBhdGliaWxpdHlDb25zb2xlVGVzdC5qYXZhIGIvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvY29tbWFuZC9Db21wYXRpYmlsaXR5Q29uc29sZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI1OTc3NS4uMDAwMDAwMAotLS0gYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC9jb21tYW5kL0NvbXBhdGliaWxpdHlDb25zb2xlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQuY29tbWFuZDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLmJ1aWxkLkNvbXBhdGliaWxpdHlCdWlsZEhlbHBlclRlc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLS8qKgotICogVW5pdCB0ZXN0cyBmb3Ige0BsaW5rIENvbXBhdGliaWxpdHlDb25zb2xlfS4KLSAqLwotcHVibGljIGNsYXNzIENvbXBhdGliaWxpdHlDb25zb2xlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIENvbXBhdGliaWxpdHlCdWlsZEhlbHBlclRlc3Quc2V0UHJvcGVydHkoIi90bXAvZm9vYmFyIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyVGVzdC5zZXRQcm9wZXJ0eShudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvbXB0RXhpc3RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIENvbXBhdGliaWxpdHlDb25zb2xlIGNvbnNvbGUgPSBuZXcgQ29tcGF0aWJpbGl0eUNvbnNvbGUoKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIk5vIHByb21wdCIsIGNvbnNvbGUuZ2V0Q29uc29sZVByb21wdCgpLmlzRW1wdHkoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvY29uZmlnL0NvbmZpZ3VyYXRpb25GYWN0b3J5VGVzdC5qYXZhIGIvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvY29uZmlnL0NvbmZpZ3VyYXRpb25GYWN0b3J5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTU5Mzg3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL2NvbmZpZy9Db25maWd1cmF0aW9uRmFjdG9yeVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC5jb25maWc7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5jb25maWcuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5jb25maWcuQ29uZmlndXJhdGlvbkZhY3Rvcnk7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLS8qKgotICogVW5pdCB0ZXN0cyBmb3Ige0BsaW5rIENvbmZpZ3VyYXRpb25GYWN0b3J5fSBpbXBvcnRlZCBmcm9tIFRyYWRlIEZlZGVyYXRpb24gdG8gY2hlY2sgY3RzCi0gKiBjb25maWd1cmF0aW9uIGxvYWRpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uRmFjdG9yeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIENvbmZpZ3VyYXRpb25GYWN0b3J5IG1Db25maWdGYWN0b3J5OwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgbUNvbmZpZ0ZhY3RvcnkgPSAoQ29uZmlndXJhdGlvbkZhY3RvcnkpIENvbmZpZ3VyYXRpb25GYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2FuaXR5IHRlc3QgdG8gZW5zdXJlIGFsbCBjb25maWcgbmFtZXMgb24gY2xhc3NwYXRoIGFyZSBsb2FkYWJsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TG9hZEFsbENvbmZpZ3MoKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIHdlIGRyeS1ydW4gdGhlIHRlbXBsYXRlcyBvdGhlcndpc2UgaXQgd2lsbCBhbHdheXMgZmFpbC4KLSAgICAgICAgbUNvbmZpZ0ZhY3RvcnkubG9hZEFsbENvbmZpZ3MoZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNhbml0eSB0ZXN0IHRvIGVuc3VyZSBhbGwgY29uZmlncyBvbiBjbGFzc3BhdGggY2FuIGJlIGZ1bGx5IGxvYWRlZCBhbmQgcGFyc2VkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RMb2FkQW5kUHJpbnRBbGxDb25maWdzKCkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgICAgICAvLyBQcmludGluZyB0aGUgaGVscCBpbnZvbHZlcyBtb3JlIGNoZWNrcyBzaW5jZSBpdCB0cmllcyB0byByZXNvbHZlIHRoZSBjb25maWcgb2JqZWN0cy4KLSAgICAgICAgbUNvbmZpZ0ZhY3RvcnkubG9hZEFuZFByaW50QWxsQ29uZmlncygpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC9wcmVzdWJtaXQvQXBrUGFja2FnZU5hbWVDaGVjay5qYXZhIGIvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvcHJlc3VibWl0L0Fwa1BhY2thZ2VOYW1lQ2hlY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJmM2YwNS4uMDAwMDAwMAotLS0gYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC9wcmVzdWJtaXQvQXBrUGFja2FnZU5hbWVDaGVjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC5wcmVzdWJtaXQ7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmNvbmZpZy5Db25maWd1cmF0aW9uRmFjdG9yeTsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5jb25maWcuSUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5JVGFyZ2V0UHJlcGFyZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5UZXN0QXBwSW5zdGFsbFNldHVwOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnV0aWwuQWFwdFBhcnNlcjsKLQotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKLWltcG9ydCBvcmcuanVuaXQucnVubmVycy5KVW5pdDQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlbmFtZUZpbHRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBDbGFzcyB0byB2YWxpZGF0ZSB0ZXN0cyBBcGtzIGluIHRlc3RjYXNlcy8KLSAqLwotQFJ1bldpdGgoSlVuaXQ0LmNsYXNzKQotcHVibGljIGNsYXNzIEFwa1BhY2thZ2VOYW1lQ2hlY2sgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gRVhDRVBUSU9OX0xJU1QgPSBuZXcgSGFzaFNldDw+KCk7Ci0gICAgc3RhdGljIHsKLSAgICAgICAgLy8gVE9ETzogUmVtb3ZlIGV4Y2VwdGlvbiB3aGVuIHRoZWlyIHBhY2thZ2UgaGF2ZSBiZWVuIGZpeGVkLgotICAgICAgICBFWENFUFRJT05fTElTVC5hZGQoImFuZHJvaWQuYXBwLmN0cyIpOwotICAgICAgICBFWENFUFRJT05fTElTVC5hZGQoImFuZHJvaWQuc3lzdGVtdWkuY3RzIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2UgZW5zdXJlIHRoYXQgbm8gYXBrIHdpdGggc2FtZSBwYWNrYWdlIG5hbWVzIG1heSBiZSBpbnN0YWxsZWQuIE90aGVyd2lzZSBpdCBtYXkgcmVzdWx0cyBpbgotICAgICAqIGNvbmZsaWN0cy4KLSAgICAgKi8KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RBcGtQYWNrYWdlTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGN0c1Jvb3QgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIkNUU19ST09UIik7Ci0gICAgICAgIEZpbGUgdGVzdGNhc2VzID0gbmV3IEZpbGUoY3RzUm9vdCwgIi9hbmRyb2lkLWN0cy90ZXN0Y2FzZXMvIik7Ci0gICAgICAgIGlmICghdGVzdGNhc2VzLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoIiVzIGRvZXMgbm90IGV4aXN0cyIsIHRlc3RjYXNlcykpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIEZpbGVbXSBsaXN0Q29uZmlnID0gdGVzdGNhc2VzLmxpc3RGaWxlcyhuZXcgRmlsZW5hbWVGaWx0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGRpciwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgICAgICAgICBpZiAobmFtZS5lbmRzV2l0aCgiLmNvbmZpZyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBhc3NlcnRUcnVlKGxpc3RDb25maWcubGVuZ3RoID4gMCk7Ci0gICAgICAgIC8vIFdlIGNoZWNrIGFsbCBhcGsgaW5zdGFsbGVkIGJ5IGFsbCBtb2R1bGVzCi0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFja2FnZU5hbWVzID0gbmV3IEhhc2hNYXA8PigpOwotCi0gICAgICAgIGZvciAoRmlsZSBjb25maWcgOiBsaXN0Q29uZmlnKSB7Ci0gICAgICAgICAgICBJQ29uZmlndXJhdGlvbiBjID0gQ29uZmlndXJhdGlvbkZhY3RvcnkuZ2V0SW5zdGFuY2UoKQotICAgICAgICAgICAgICAgICAgICAuY3JlYXRlQ29uZmlndXJhdGlvbkZyb21BcmdzKG5ldyBTdHJpbmdbXSB7Y29uZmlnLmdldEFic29sdXRlUGF0aCgpfSk7Ci0gICAgICAgICAgICAvLyBGb3IgZWFjaCBjb25maWcsIHdlIGNoZWNrIGFsbCB0aGUgYXBrIGl0J3MgZ29pbmcgdG8gaW5zdGFsbAotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGFwa05hbWVzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICBmb3IgKElUYXJnZXRQcmVwYXJlciBwcmVwIDogYy5nZXRUYXJnZXRQcmVwYXJlcnMoKSkgewotICAgICAgICAgICAgICAgIGlmIChwcmVwIGluc3RhbmNlb2YgVGVzdEFwcEluc3RhbGxTZXR1cCkgewotICAgICAgICAgICAgICAgICAgICBhcGtOYW1lcy5hZGRBbGwoKChUZXN0QXBwSW5zdGFsbFNldHVwKSBwcmVwKS5nZXRUZXN0c0ZpbGVOYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yIChTdHJpbmcgYXBrTmFtZSA6IGFwa05hbWVzKSB7Ci0gICAgICAgICAgICAgICAgRmlsZSBhcGtGaWxlID0gbmV3IEZpbGUodGVzdGNhc2VzLCBhcGtOYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoIWFwa0ZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCJNb2R1bGUgJXMgaXMgdHJ5aW5nIHRvIGluc3RhbGwgJXMgd2hpY2ggZG9lcyBub3QgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImV4aXN0cyBpbiB0ZXN0Y2FzZXMvIiwgY29uZmlnLmdldE5hbWUoKSwgYXBrRmlsZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBBYXB0UGFyc2VyIHJlcyA9IEFhcHRQYXJzZXIucGFyc2UoYXBrRmlsZSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXMpOwotICAgICAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IHJlcy5nZXRQYWNrYWdlTmFtZSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBwdXQgPSBwYWNrYWdlTmFtZXMucHV0KHBhY2thZ2VOYW1lLCBhcGtOYW1lKTsKLSAgICAgICAgICAgICAgICAvLyBUaGUgcGFja2FnZSBhbHJlYWR5IGV4aXN0cyBhbmQgaXQncyBhIGRpZmZlcmVudCBhcGsKLSAgICAgICAgICAgICAgICBpZiAocHV0ICE9IG51bGwgJiYgIWFwa05hbWUuZXF1YWxzKHB1dCkgJiYgIUVYQ0VQVElPTl9MSVNULmNvbnRhaW5zKHBhY2thZ2VOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoIk1vZHVsZSAlczogUGFja2FnZSBuYW1lICclcycgZnJvbSBhcGsgJyVzJyB3YXMgYWxyZWFkeSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYWRkZWQgYnkgcHJldmlvdXMgYXBrICclcycuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuZ2V0TmFtZSgpLCBwYWNrYWdlTmFtZSwgYXBrTmFtZSwgcHV0KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvcHJlc3VibWl0L0N0c0NvbmZpZ0xvYWRpbmdUZXN0LmphdmEgYi9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC9wcmVzdWJtaXQvQ3RzQ29uZmlnTG9hZGluZ1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNjODJhYzkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvcHJlc3VibWl0L0N0c0NvbmZpZ0xvYWRpbmdUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnByZXN1Ym1pdDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLmJ1aWxkLkNvbXBhdGliaWxpdHlCdWlsZEhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50YXJnZXRwcmVwLkFwa0luc3RhbGxlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5KYXJIb3N0VGVzdDsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5idWlsZC5Gb2xkZXJCdWlsZEluZm87Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuY29uZmlnLkNvbmZpZ3VyYXRpb25EZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmNvbmZpZy5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmNvbmZpZy5Db25maWd1cmF0aW9uRmFjdG9yeTsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5jb25maWcuSUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5JVGFyZ2V0UHJlcGFyZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSG9zdFRlc3Q7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSVJlbW90ZVRlc3Q7Ci0KLWltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZW5hbWVGaWx0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIFRlc3QgdGhhdCBjb25maWd1cmF0aW9uIGluIENUUyBjYW4gbG9hZCBhbmQgaGF2ZSBleHBlY3RlZCBwcm9wZXJ0aWVzLgotICovCi1wdWJsaWMgY2xhc3MgQ3RzQ29uZmlnTG9hZGluZ1Rlc3QgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBX0NPTVBPTkVOVCA9ICJjb21wb25lbnQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IEtOT1dOX0NPTVBPTkVOVFMgPSBuZXcgSGFzaFNldDw+KEFycmF5cy5hc0xpc3QoCi0gICAgICAgICAgICAvLyBtb2RpZmljYXRpb25zIHRvIHRoZSBsaXN0IGJlbG93IG11c3QgYmUgcmV2aWV3ZWQKLSAgICAgICAgICAgICJhYnVzZSIsCi0gICAgICAgICAgICAiYXJ0IiwKLSAgICAgICAgICAgICJhdXRoIiwKLSAgICAgICAgICAgICJhdXRvIiwKLSAgICAgICAgICAgICJiYWNrdXAiLAotICAgICAgICAgICAgImJpb25pYyIsCi0gICAgICAgICAgICAiYmx1ZXRvb3RoIiwKLSAgICAgICAgICAgICJjYW1lcmEiLAotICAgICAgICAgICAgImRlcXAiLAotICAgICAgICAgICAgImRldnRvb2xzIiwKLSAgICAgICAgICAgICJmcmFtZXdvcmsiLAotICAgICAgICAgICAgImdyYXBoaWNzIiwKLSAgICAgICAgICAgICJsaWJjb3JlIiwKLSAgICAgICAgICAgICJsb2NhdGlvbiIsCi0gICAgICAgICAgICAibWVkaWEiLAotICAgICAgICAgICAgIm1ldHJpY3MiLAotICAgICAgICAgICAgIm1pc2MiLAotICAgICAgICAgICAgIm5ldHdvcmtpbmciLAotICAgICAgICAgICAgIm5ldXJhbG5ldHdvcmtzIiwKLSAgICAgICAgICAgICJyZW5kZXJzY3JpcHQiLAotICAgICAgICAgICAgInNlY3VyaXR5IiwKLSAgICAgICAgICAgICJzeXN0ZW1zIiwKLSAgICAgICAgICAgICJzeXN1aSIsCi0gICAgICAgICAgICAidGVsZWNvbSIsCi0gICAgICAgICAgICAidHYiLAotICAgICAgICAgICAgInVpdG9vbGtpdCIsCi0gICAgICAgICAgICAidnIiLAotICAgICAgICAgICAgIndlYnZpZXciCi0gICAgKSk7Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHRoYXQgY29uZmlndXJhdGlvbiBzaGlwcGVkIGluIFRyYWRlZmVkIGNhbiBiZSBwYXJzZWQuCi0gICAgICogLT4gRXhjbHVkZSBkZXByZWNhdGVkIEFwa0luc3RhbGxlci4KLSAgICAgKiAtPiBDaGVjayBpZiBob3N0LXNpZGUgdGVzdHMgYXJlIG5vbiBlbXB0eS4KLSAgICAgKi8KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDb25maWd1cmF0aW9uTG9hZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgY3RzUm9vdCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiQ1RTX1JPT1QiKTsKLSAgICAgICAgRmlsZSB0ZXN0Y2FzZXMgPSBuZXcgRmlsZShjdHNSb290LCAiL2FuZHJvaWQtY3RzL3Rlc3RjYXNlcy8iKTsKLSAgICAgICAgaWYgKCF0ZXN0Y2FzZXMuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiJXMgZG9lcyBub3QgZXhpc3RzIiwgdGVzdGNhc2VzKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgRmlsZVtdIGxpc3RDb25maWcgPSB0ZXN0Y2FzZXMubGlzdEZpbGVzKG5ldyBGaWxlbmFtZUZpbHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZGlyLCBTdHJpbmcgbmFtZSkgewotICAgICAgICAgICAgICAgIGlmIChuYW1lLmVuZHNXaXRoKCIuY29uZmlnIikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGFzc2VydFRydWUobGlzdENvbmZpZy5sZW5ndGggPiAwKTsKLSAgICAgICAgLy8gQ3JlYXRlIGEgRm9sZGVyQnVpbGRJbmZvIHRvIHNpbWlsYXRlIHRoZSBDb21wYXRpYmlsaXR5QnVpbGRQcm92aWRlcgotICAgICAgICBGb2xkZXJCdWlsZEluZm8gc3R1YkZvbGRlciA9IG5ldyBGb2xkZXJCdWlsZEluZm8oIi0xIiwgIi0xIik7Ci0gICAgICAgIHN0dWJGb2xkZXIuc2V0Um9vdERpcihuZXcgRmlsZShjdHNSb290KSk7Ci0gICAgICAgIHN0dWJGb2xkZXIuYWRkQnVpbGRBdHRyaWJ1dGUoQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyLlNVSVRFX05BTUUsICJDVFMiKTsKLSAgICAgICAgLy8gV2UgZXhwZWN0IHRvIGJlIGFibGUgdG8gbG9hZCBldmVyeSBzaW5nbGUgY29uZmlnIGluIHRlc3RjYXNlcy8KLSAgICAgICAgZm9yIChGaWxlIGNvbmZpZyA6IGxpc3RDb25maWcpIHsKLSAgICAgICAgICAgIElDb25maWd1cmF0aW9uIGMgPSBDb25maWd1cmF0aW9uRmFjdG9yeS5nZXRJbnN0YW5jZSgpCi0gICAgICAgICAgICAgICAgICAgIC5jcmVhdGVDb25maWd1cmF0aW9uRnJvbUFyZ3MobmV3IFN0cmluZ1tdIHtjb25maWcuZ2V0QWJzb2x1dGVQYXRoKCl9KTsKLSAgICAgICAgICAgIC8vIEVuc3VyZSB0aGUgZGVwcmVjYXRlZCBBcGtJbnN0YWxsZXIgaXMgbm90IHVzZWQgYW55bW9yZS4KLSAgICAgICAgICAgIGZvciAoSVRhcmdldFByZXBhcmVyIHByZXAgOiBjLmdldFRhcmdldFByZXBhcmVycygpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHByZXAuZ2V0Q2xhc3MoKS5pc0Fzc2lnbmFibGVGcm9tKEFwa0luc3RhbGxlci5jbGFzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiJXM6IFVzZSBjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlN1aXRlQXBrSW5zdGFsbGVyIGluc3RlYWQgb2YgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJjb21tb24udHJhZGVmZWQudGFyZ2V0cHJlcC5BcGtJbnN0YWxsZXIsIG9wdGlvbnMgd2lsbCBiZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJ0aGUgc2FtZS4iLCBjb25maWcpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBXZSBjYW4gZW5zdXJlIHRoYXQgSG9zdCBzaWRlIHRlc3RzIGFyZSBub3QgZW1wdHkuCi0gICAgICAgICAgICBmb3IgKElSZW1vdGVUZXN0IHRlc3QgOiBjLmdldFRlc3RzKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAodGVzdCBpbnN0YW5jZW9mIEhvc3RUZXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIEhvc3RUZXN0IGhvc3RUZXN0ID0gKEhvc3RUZXN0KSB0ZXN0OwotICAgICAgICAgICAgICAgICAgICAvLyBXZSBpbmplY3QgYSBtYWRlIHVwIGZvbGRlciBzbyB0aGF0IGl0IGNhbiBmaW5kIHRoZSB0ZXN0cy4KLSAgICAgICAgICAgICAgICAgICAgaG9zdFRlc3Quc2V0QnVpbGQoc3R1YkZvbGRlcik7Ci0gICAgICAgICAgICAgICAgICAgIGludCB0ZXN0Q291bnQgPSBob3N0VGVzdC5jb3VudFRlc3RDYXNlcygpOwotICAgICAgICAgICAgICAgICAgICBpZiAodGVzdENvdW50ID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCIlczogJXMgcmVwb3J0cyAwIHRlc3QgY2FzZXMuIiwgY29uZmlnLCB0ZXN0KSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDb25maWd1cmF0aW9uRGVzY3JpcHRvciBjZCA9IGMuZ2V0Q29uZmlndXJhdGlvbkRlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChjb25maWcgKyAiOiBjb25maWd1cmF0aW9uIGRlc2NyaXB0b3IgaXMgbnVsbCIsIGNkKTsKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBjb21wb25lbnQgPSBjZC5nZXRNZXRhRGF0YShNRVRBREFUQV9DT01QT05FTlQpOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoU3RyaW5nLmZvcm1hdCgiTWlzc2luZyBtb2R1bGUgbWV0YWRhdGEgZmllbGQgXCJjb21wb25lbnRcIiwgIgotICAgICAgICAgICAgICAgICAgICArICJwbGVhc2UgYWRkIHRoZSBmb2xsb3dpbmcgbGluZSB0byB5b3VyIEFuZHJvaWRUZXN0LnhtbDpcbiIKLSAgICAgICAgICAgICAgICAgICAgKyAiPG9wdGlvbiBuYW1lPVwiY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGFcIiBrZXk9XCJjb21wb25lbnRcIiAiCi0gICAgICAgICAgICAgICAgICAgICsgInZhbHVlPVwiLi4uXCIgLz5cbndoZXJlIFwidmFsdWVcIiBtdXN0IGJlIG9uZSBvZjogJXNcbiIKLSAgICAgICAgICAgICAgICAgICAgKyAiY29uZmlnOiAlcyIsIEtOT1dOX0NPTVBPTkVOVFMsIGNvbmZpZyksCi0gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFN0cmluZy5mb3JtYXQoIk1vZHVsZSBjb25maWcgY29udGFpbnMgbW9yZSB0aGFuIG9uZSBcImNvbXBvbmVudFwiICIKLSAgICAgICAgICAgICAgICAgICAgKyAibWV0YWRhdGEgZmllbGQ6ICVzXG5jb25maWc6ICVzIiwgY29tcG9uZW50LCBjb25maWcpLAotICAgICAgICAgICAgICAgICAgICAxLCBjb21wb25lbnQuc2l6ZSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBjbXAgPSBjb21wb25lbnQuZ2V0KDApOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiTW9kdWxlIGNvbmZpZyBjb250YWlucyB1bmtub3duIFwiY29tcG9uZW50XCIgbWV0YWRhdGEgIgotICAgICAgICAgICAgICAgICAgICArICJmaWVsZCBcIiVzXCIsIHN1cHBvcnRlZCBvbmVzIGFyZTogJXNcbmNvbmZpZzogJXMiLAotICAgICAgICAgICAgICAgICAgICBjbXAsIEtOT1dOX0NPTVBPTkVOVFMsIGNvbmZpZyksIEtOT1dOX0NPTVBPTkVOVFMuY29udGFpbnMoY21wKSk7Ci0gICAgICAgICAgICAvLyBDaGVjayBub3Qtc2hhcmRhYmxlOiBKYXJIb3N0VGVzdCBjYW5ub3QgY3JlYXRlIGVtcHR5IHNoYXJkcyBzbyBpdCBzaG91bGQgbmV2ZXIgbmVlZAotICAgICAgICAgICAgLy8gdG8gYmUgbm90LXNoYXJkYWJsZS4KLSAgICAgICAgICAgIGlmIChjZC5pc05vdFNoYXJkYWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChJUmVtb3RlVGVzdCB0ZXN0IDogYy5nZXRUZXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0ZXN0LmdldENsYXNzKCkuaXNBc3NpZ25hYmxlRnJvbShKYXJIb3N0VGVzdC5jbGFzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJjb25maWc6ICVzLiBKYXJIb3N0VGVzdCBkb2VzIG5vdCBuZWVkIHRoZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJub3Qtc2hhcmRhYmxlIG9wdGlvbi4iLCBjb25maWcuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC9wcmVzdWJtaXQvSW50ZWdyYXRpb25UZXN0LmphdmEgYi9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC9wcmVzdWJtaXQvSW50ZWdyYXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkYmQzYTkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvcHJlc3VibWl0L0ludGVncmF0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzA0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC5wcmVzdWJtaXQ7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLmJ1aWxkLkNvbXBhdGliaWxpdHlCdWlsZEhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC5yZXN1bHQuUmVzdWx0UmVwb3J0ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGVzdHR5cGUuQ29tcGF0aWJpbGl0eVRlc3Q7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGVzdHR5cGUuSU1vZHVsZURlZjsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLklJbnZvY2F0aW9uUmVzdWx0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuVGVzdFN0YXR1czsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIudGVzdHJ1bm5lci5UZXN0SWRlbnRpZmllcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5idWlsZC5JQnVpbGRJbmZvOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmNvbmZpZy5Db25maWd1cmF0aW9uRmFjdG9yeTsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5jb25maWcuT3B0aW9uU2V0dGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5EZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLklUZXN0RGV2aWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmludm9rZXIuSUludm9jYXRpb25Db250ZXh0OwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmludm9rZXIuSW52b2NhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuaW52b2tlci5TaGFyZExpc3RlbmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnJlc3VsdC5JVGVzdEludm9jYXRpb25MaXN0ZW5lcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5yZXN1bHQuUmVzdWx0Rm9yd2FyZGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLklCdWlsZFJlY2VpdmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLklEZXZpY2VUZXN0OwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLklJbnZvY2F0aW9uQ29udGV4dFJlY2VpdmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLklSZW1vdGVUZXN0OwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLnN1aXRlLlRlc3RTdWl0ZUluZm87Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudXRpbC5BYmlVdGlsczsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC51dGlsLkZpbGVVdGlsOwotCi1pbXBvcnQgb3JnLmVhc3ltb2NrLkVhc3lNb2NrOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKLWltcG9ydCBvcmcuanVuaXQucnVubmVycy5KVW5pdDQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwotCi0vKioKLSAqIEludGVncmF0aW9uIHRlc3RzIGJldHdlZW4ge0BsaW5rIENvbXBhdGliaWxpdHlUZXN0fSBhbmQge0BsaW5rIFJlc3VsdFJlcG9ydGVyfSB0byBlbnN1cmUgcHJvcGVyCi0gKiBmbG93IG9mIHJ1biBhbmQgcmVzdWx0cy4KLSAqLwotQFJ1bldpdGgoSlVuaXQ0LmNsYXNzKQotcHVibGljIGNsYXNzIEludGVncmF0aW9uVGVzdCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHID0KLSAgICAgICAgICAgICI8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj1cIkF1dG8gR2VuZXJhdGVkIEZpbGVcIj5cbiIgKwotICAgICAgICAgICAgIjxvcHRpb24gbmFtZT1cImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhXCIga2V5PVwiY29tcG9uZW50XCIgdmFsdWU9XCIlc1wiIC8+XG4iICsKLSAgICAgICAgICAgICI8dGVzdCBjbGFzcz1cImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRlc3R0eXBlLiVzXCI+XG4iICsKLSAgICAgICAgICAgICIgICAgPG9wdGlvbiBuYW1lPVwicmVwb3J0LXRlc3RcIiB2YWx1ZT1cIiVzXCIgLz5cbiIgKwotICAgICAgICAgICAgIiAgICA8b3B0aW9uIG5hbWU9XCJydW4tY29tcGxldGVcIiB2YWx1ZT1cIiVzXCIgLz5cbiIgKwotICAgICAgICAgICAgIiAgICA8b3B0aW9uIG5hbWU9XCJ0ZXN0LWZhaWxcIiB2YWx1ZT1cIiVzXCIgLz5cbiIgKwotICAgICAgICAgICAgIiAgICA8b3B0aW9uIG5hbWU9XCJpbnRlcm5hbC1yZXRyeVwiIHZhbHVlPVwiJXNcIiAvPlxuIiArCi0gICAgICAgICAgICAiPC90ZXN0PlxuIiArCi0gICAgICAgICAgICAiPC9jb25maWd1cmF0aW9uPiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVOQU1FID0gIiVzLmNvbmZpZyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfU1RVQiA9ICJUZXN0U3R1YiI7IC8vIFRlc3Qgc3R1YgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSU1QTEVfVEVTVF9TVFVCID0gIlNpbXBsZVRlc3RTdHViIjsgLy8gU2ltcGxlIHRlc3Qgc3R1YgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1NUVUJfU0hBUkRBQkxFID0gIlRlc3RTdHViU2hhcmRhYmxlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9MSU5FID0gInJ1biBjdHMiOwotCi0gICAgcHJpdmF0ZSBDb21wYXRpYmlsaXR5VGVzdCBtVGVzdDsKLSAgICBwcml2YXRlIFJlc3VsdFJlcG9ydGVyIG1SZXBvcnRlcjsKLSAgICBwcml2YXRlIElUZXN0RGV2aWNlIG1Nb2NrRGV2aWNlOwotICAgIHByaXZhdGUgSUJ1aWxkSW5mbyBtTW9ja0J1aWxkSW5mbzsKLSAgICBwcml2YXRlIElJbnZvY2F0aW9uQ29udGV4dCBtQ29udGV4dDsKLQotICAgIHByaXZhdGUgRmlsZSBtUm9vdERpcjsKLSAgICBwcml2YXRlIEZpbGUgbUFuZHJvaWRGb2xkZXI7Ci0gICAgcHJpdmF0ZSBGaWxlIG1UZXN0RGlyOwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBtQXR0cmlidXRlczsKLQotICAgIEBCZWZvcmUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIG1BdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXA8PigpOwotICAgICAgICBtVGVzdCA9IG5ldyBDb21wYXRpYmlsaXR5VGVzdCgpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHJvdGVjdGVkIFNldDxTdHJpbmc+IGdldEFiaXNGb3JCdWlsZFRhcmdldEFyY2goKSB7Ci0gICAgICAgICAgICAgICAgU2V0PFN0cmluZz4gYWJpcyA9IG5ldyBIYXNoU2V0PD4oKTsKLSAgICAgICAgICAgICAgICBhYmlzLmFkZCgiYXJtNjQtdjhhIik7Ci0gICAgICAgICAgICAgICAgYWJpcy5hZGQoImFybWVhYmktdjdhIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFiaXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIG1SZXBvcnRlciA9IG5ldyBSZXN1bHRSZXBvcnRlcigpOwotICAgICAgICBtTW9ja0RldmljZSA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSVRlc3REZXZpY2UuY2xhc3MpOwotICAgICAgICBtTW9ja0J1aWxkSW5mbyA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUJ1aWxkSW5mby5jbGFzcyk7Ci0gICAgICAgIG1UZXN0LnNldEJ1aWxkKG1Nb2NrQnVpbGRJbmZvKTsKLSAgICAgICAgbVRlc3Quc2V0RGV2aWNlKG1Nb2NrRGV2aWNlKTsKLSAgICAgICAgbVJvb3REaXIgPSBGaWxlVXRpbC5jcmVhdGVUZW1wRGlyKCJmYWtlLWN0cy1yb290LWRpciIpOwotICAgICAgICBtQW5kcm9pZEZvbGRlciA9IEZpbGVVdGlsLmNyZWF0ZVRlbXBEaXIoImFuZHJvaWQtIiwgbVJvb3REaXIpOwotICAgICAgICBtVGVzdERpciA9IG5ldyBGaWxlKG1BbmRyb2lkRm9sZGVyLCAidGVzdGNhc2VzIik7Ci0gICAgICAgIG1UZXN0RGlyLm1rZGlycygpOwotICAgICAgICBTdHJpbmcgc3VpdGVOYW1lID0gbUFuZHJvaWRGb2xkZXIuZ2V0TmFtZSgpLnNwbGl0KCItIilbMV07Ci0gICAgICAgIC8vIENyZWF0ZSBmYWtlIGJ1aWxkIGF0dHJpYnV0ZXMKLSAgICAgICAgbUF0dHJpYnV0ZXMucHV0KENvbXBhdGliaWxpdHlCdWlsZEhlbHBlci5ST09UX0RJUiwgbVJvb3REaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICBtQXR0cmlidXRlcy5wdXQoQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyLlNVSVRFX05BTUUsIHN1aXRlTmFtZSk7Ci0gICAgICAgIG1BdHRyaWJ1dGVzLnB1dChDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIuU1RBUlRfVElNRV9NUywgIjAiKTsKLSAgICAgICAgbUF0dHJpYnV0ZXMucHV0KENvbXBhdGliaWxpdHlCdWlsZEhlbHBlci5TVUlURV9WRVJTSU9OLCAiMTAiKTsKLSAgICAgICAgbUF0dHJpYnV0ZXMucHV0KENvbXBhdGliaWxpdHlCdWlsZEhlbHBlci5TVUlURV9QTEFOLCAiY3RzIik7Ci0gICAgICAgIG1BdHRyaWJ1dGVzLnB1dChDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIuU1VJVEVfQlVJTEQsICJnb29kLWJ1aWxkIik7Ci0gICAgICAgIG1BdHRyaWJ1dGVzLnB1dChDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIuQ09NTUFORF9MSU5FX0FSR1MsIENPTU1BTkRfTElORSk7Ci0KLSAgICAgICAgLy8gdGhlc2UgYXR0cmlidXRlcyBzZWVtcyBuZWNlc3NhcnkgZm9yIHJlLXJ1biwgbm90IGZvciBydW4KLSAgICAgICAgbUF0dHJpYnV0ZXMucHV0KCJjdHM6YnVpbGRfZmluZ2VycHJpbnQiLCAiZmluZ2VycHJpbnQiKTsKLSAgICAgICAgbUF0dHJpYnV0ZXMucHV0KCJjdHM6YnVpbGRfcHJvZHVjdCIsICJwcm9kdWN0Iik7Ci0gICAgICAgIG1BdHRyaWJ1dGVzLnB1dCgiY3RzOmJ1aWxkX2lkIiwgImJpZCIpOwotCi0gICAgICAgIEVhc3lNb2NrLmV4cGVjdChtTW9ja0J1aWxkSW5mby5nZXRCdWlsZEF0dHJpYnV0ZXMoKSkuYW5kU3R1YlJldHVybihtQXR0cmlidXRlcyk7Ci0KLSAgICAgICAgRWFzeU1vY2suZXhwZWN0KG1Nb2NrRGV2aWNlLmdldFNlcmlhbE51bWJlcigpKS5hbmRTdHViUmV0dXJuKCJTRVJJQUwiKTsKLSAgICAgICAgRWFzeU1vY2suZXhwZWN0KG1Nb2NrQnVpbGRJbmZvLmdldERldmljZVNlcmlhbCgpKS5hbmRTdHViUmV0dXJuKCJTRVJJQUwiKTsKLQotICAgICAgICBFYXN5TW9jay5leHBlY3QobU1vY2tCdWlsZEluZm8uZ2V0RmlsZXMoKSkuYW5kU3R1YlJldHVybihDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSk7Ci0KLSAgICAgICAgbUNvbnRleHQgPSBuZXcgSW52b2NhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgbUNvbnRleHQuYWRkQWxsb2NhdGVkRGV2aWNlKCJkZWZhdWx0IiwgbU1vY2tEZXZpY2UpOwotICAgICAgICBtQ29udGV4dC5hZGREZXZpY2VCdWlsZEluZm8oImRlZmF1bHQiLCBtTW9ja0J1aWxkSW5mbyk7Ci0gICAgICAgIG1UZXN0LnNldEludm9jYXRpb25Db250ZXh0KG1Db250ZXh0KTsKLSAgICB9Ci0KLSAgICBAQWZ0ZXIKLSAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKLSAgICAgICAgRmlsZVV0aWwucmVjdXJzaXZlRGVsZXRlKG1Sb290RGlyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBDVFMgY29uZmlndXJhdGlvbiB3aXRoIGEgZmFrZSB0ZXN0cyB0byBleGVyY2lzZSBhbGwgY2FzZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGVzdHNEaXIgVGhlIHRlc3RjYXNlcy8gZGlyIHdoZXJlIHRvIHB1dCB0aGUgbW9kdWxlCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZS4KLSAgICAgKiBAcGFyYW0gbW9kdWxlQ2xhc3MgdGhlIGZha2UgdGVzdCBjbGFzcyB0byB1c2UuCi0gICAgICogQHBhcmFtIHJlcG9ydFRlc3QgVHJ1ZSBpZiB0aGUgdGVzdCByZXBvcnQgc29tZSB0ZXN0cwotICAgICAqIEBwYXJhbSBydW5Db21wbGV0ZSBUcnVlIGlmIHRoZSB0ZXN0IHJ1biBpcyBjb21wbGV0ZQotICAgICAqIEBwYXJhbSBkb2VzT25lVGVzdEZhaWwgVHJ1ZSBpZiBvbmUgb2YgdGhlIHRlc3QgaXMgZ29pbmcgdG8gZmFpbAotICAgICAqIEBwYXJhbSBpbnRlcm5hbFJldHJ5IFRydWUgaWYgdGhlIHRlc3Qgd2lsbCByZXRyeSB0aGUgbW9kdWxlIGl0c2VsZiBvbmNlCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbmZpZyhGaWxlIHRlc3RzRGlyLCBTdHJpbmcgbmFtZSwgU3RyaW5nIG1vZHVsZUNsYXNzLCBib29sZWFuIHJlcG9ydFRlc3QsCi0gICAgICAgICAgICBib29sZWFuIHJ1bkNvbXBsZXRlLCBib29sZWFuIGRvZXNPbmVUZXN0RmFpbCwgYm9vbGVhbiBpbnRlcm5hbFJldHJ5KQotICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBjcmVhdGVDb25maWcodGVzdHNEaXIsIG5hbWUsIG1vZHVsZUNsYXNzLCByZXBvcnRUZXN0LCBydW5Db21wbGV0ZSwgZG9lc09uZVRlc3RGYWlsLAotICAgICAgICAgICAgICAgIGludGVybmFsUmV0cnksICJmb28iKTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIENUUyBjb25maWd1cmF0aW9uIHdpdGggYSBmYWtlIHRlc3RzIHRvIGV4ZXJjaXNlIGFsbCBjYXNlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0ZXN0c0RpciBUaGUgdGVzdGNhc2VzLyBkaXIgd2hlcmUgdG8gcHV0IHRoZSBtb2R1bGUKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlLgotICAgICAqIEBwYXJhbSBtb2R1bGVDbGFzcyB0aGUgZmFrZSB0ZXN0IGNsYXNzIHRvIHVzZS4KLSAgICAgKiBAcGFyYW0gcmVwb3J0VGVzdCBUcnVlIGlmIHRoZSB0ZXN0IHJlcG9ydCBzb21lIHRlc3RzCi0gICAgICogQHBhcmFtIHJ1bkNvbXBsZXRlIFRydWUgaWYgdGhlIHRlc3QgcnVuIGlzIGNvbXBsZXRlCi0gICAgICogQHBhcmFtIGRvZXNPbmVUZXN0RmFpbCBUcnVlIGlmIG9uZSBvZiB0aGUgdGVzdCBpcyBnb2luZyB0byBmYWlsCi0gICAgICogQHBhcmFtIGludGVybmFsUmV0cnkgVHJ1ZSBpZiB0aGUgdGVzdCB3aWxsIHJldHJ5IHRoZSBtb2R1bGUgaXRzZWxmIG9uY2UKLSAgICAgKiBAcGFyYW0gY29tcG9uZW50IHRoZSBwbGF0Zm9ybSBjb21wb25lbnQgbmFtZSB0aGF0IHRoZSBtb2R1bGUgY2FuIGJlIGNhdGVnb3JpemVkIHVuZGVyCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbmZpZyhGaWxlIHRlc3RzRGlyLCBTdHJpbmcgbmFtZSwgU3RyaW5nIG1vZHVsZUNsYXNzLCBib29sZWFuIHJlcG9ydFRlc3QsCi0gICAgICAgICAgICBib29sZWFuIHJ1bkNvbXBsZXRlLCBib29sZWFuIGRvZXNPbmVUZXN0RmFpbCwgYm9vbGVhbiBpbnRlcm5hbFJldHJ5LCBTdHJpbmcgY29tcG9uZW50KQotICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBGaWxlIGNvbmZpZyA9IG5ldyBGaWxlKHRlc3RzRGlyLCBTdHJpbmcuZm9ybWF0KEZJTEVOQU1FLCBuYW1lKSk7Ci0gICAgICAgIEZpbGVVdGlsLmRlbGV0ZUZpbGUoY29uZmlnKTsKLSAgICAgICAgaWYgKCFjb25maWcuY3JlYXRlTmV3RmlsZSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiRmFpbGVkIHRvIGNyZWF0ZSAnJXMnIiwgY29uZmlnLmdldEFic29sdXRlUGF0aCgpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBGaWxlVXRpbC53cml0ZVRvRmlsZShTdHJpbmcuZm9ybWF0KENPTkZJRywgY29tcG9uZW50LCBtb2R1bGVDbGFzcywgcmVwb3J0VGVzdCwgcnVuQ29tcGxldGUsCi0gICAgICAgICAgICAgICAgZG9lc09uZVRlc3RGYWlsLCBpbnRlcm5hbFJldHJ5KSwgY29uZmlnKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaW1wbGUgdGVzdHMgcnVubmluZyBpbiBvbmUgbW9kdWxlIHRoYXQgc2hvdWxkIGJlIG1hcmtlZCBjb21wbGV0ZS4KLSAgICAgKi8KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGVNb2R1bGVSdW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIG1vZHVsZU5hbWUgPSAibW9kdWxlX3J1biI7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBtQWJpID0gImFybTY0LXY4YSI7Ci0gICAgICAgIGNyZWF0ZUNvbmZpZyhtVGVzdERpciwgbW9kdWxlTmFtZSwgVEVTVF9TVFVCLCB0cnVlLCB0cnVlLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIEVhc3lNb2NrLmV4cGVjdChtTW9ja0RldmljZS5nZXRQcm9wZXJ0eSgicm8ucHJvZHVjdC5jcHUuYWJpbGlzdCIpKS5hbmRSZXR1cm4obUFiaSk7Ci0KLSAgICAgICAgbU1vY2tCdWlsZEluZm8uYWRkQnVpbGRBdHRyaWJ1dGUoRWFzeU1vY2suZXEoQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyLk1PRFVMRV9JRFMpLAotICAgICAgICAgICAgICAgIEVhc3lNb2NrLmVxKEFiaVV0aWxzLmNyZWF0ZUlkKG1BYmksIG1vZHVsZU5hbWUpKSk7Ci0gICAgICAgIEVhc3lNb2NrLmV4cGVjdExhc3RDYWxsKCk7Ci0KLSAgICAgICAgRWFzeU1vY2sucmVwbGF5KG1Nb2NrRGV2aWNlLCBtTW9ja0J1aWxkSW5mbyk7Ci0gICAgICAgIG1SZXBvcnRlci5pbnZvY2F0aW9uU3RhcnRlZChtQ29udGV4dCk7Ci0gICAgICAgIG1UZXN0LnJ1bihtUmVwb3J0ZXIpOwotICAgICAgICBtUmVwb3J0ZXIuaW52b2NhdGlvbkVuZGVkKDUwMCk7Ci0gICAgICAgIEVhc3lNb2NrLnZlcmlmeShtTW9ja0RldmljZSwgbU1vY2tCdWlsZEluZm8pOwotICAgICAgICBJSW52b2NhdGlvblJlc3VsdCByZXN1bHQgPSBtUmVwb3J0ZXIuZ2V0UmVzdWx0KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCByZXN1bHQuY291bnRSZXN1bHRzKFRlc3RTdGF0dXMuUEFTUykpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcmVzdWx0LmNvdW50UmVzdWx0cyhUZXN0U3RhdHVzLkZBSUwpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlc3VsdC5nZXRNb2R1bGVzKCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlc3VsdC5nZXRNb2R1bGVDb21wbGV0ZUNvdW50KCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZlcmlmeSB0aGF0IHJlc3VsdCByZXBvcnRlcnMgdGVzdCBydW4gZW5kZWQgY2FsbGJhY2sgY2FuIHJlY2VpdmUgY29tcG9uZW50IG5hbWUgYXMgY29uZmlndXJlZAotICAgICAqIGluIG1vZHVsZSBjb25maWcgbWV0YWRhdGEgZmllbGQuCi0gICAgICovCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlTW9kdWxlUnVuX2NoZWNrTWV0YWRhdGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIG1vZHVsZU5hbWUgPSAiQXdzb21lTW9kdWxlIjsKLSAgICAgICAgZmluYWwgU3RyaW5nIG1BYmkgPSAiYXJtNjQtdjhhIjsKLSAgICAgICAgZmluYWwgU3RyaW5nIGNvbXBvbmVudCA9ICJDcml0aWNhbENvbXBvbmVudCI7Ci0gICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiByZWNlaXZlZENvbXBvbmVudHNUZXN0RW5kZWQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHJlY2VpdmVkTW9kdWxlTmFtZVRlc3RFbmRlZCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gcmVjZWl2ZWRBYmlUZXN0RW5kZWQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHJlY2VpdmVkQ29tcG9uZW50c1Rlc3RSdW5FbmRlZCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gcmVjZWl2ZWRNb2R1bGVOYW1lVGVzdFJ1bkVuZGVkID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiByZWNlaXZlZEFiaVRlc3RSdW5FbmRlZCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBjcmVhdGVDb25maWcobVRlc3REaXIsIG1vZHVsZU5hbWUsIFNJTVBMRV9URVNUX1NUVUIsIHRydWUsIHRydWUsIHRydWUsIGZhbHNlLCBjb21wb25lbnQpOwotICAgICAgICBFYXN5TW9jay5leHBlY3QobU1vY2tEZXZpY2UuZ2V0UHJvcGVydHkoInJvLnByb2R1Y3QuY3B1LmFiaWxpc3QiKSkuYW5kUmV0dXJuKG1BYmkpOwotCi0gICAgICAgIG1Nb2NrQnVpbGRJbmZvLmFkZEJ1aWxkQXR0cmlidXRlKEVhc3lNb2NrLmVxKENvbXBhdGliaWxpdHlCdWlsZEhlbHBlci5NT0RVTEVfSURTKSwKLSAgICAgICAgICAgICAgICBFYXN5TW9jay5lcShBYmlVdGlscy5jcmVhdGVJZChtQWJpLCBtb2R1bGVOYW1lKSkpOwotICAgICAgICBFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpOwotCi0gICAgICAgIEVhc3lNb2NrLnJlcGxheShtTW9ja0RldmljZSwgbU1vY2tCdWlsZEluZm8pOwotICAgICAgICBJVGVzdEludm9jYXRpb25MaXN0ZW5lciBteUxpc3RlbmVyID0gbmV3IElUZXN0SW52b2NhdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHJpdmF0ZSBJSW52b2NhdGlvbkNvbnRleHQgbXlDb250ZXh0OwotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBpbnZvY2F0aW9uU3RhcnRlZChJSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCkgewotICAgICAgICAgICAgICAgIG15Q29udGV4dCA9IGNvbnRleHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RSdW5FbmRlZChsb25nIGVsYXBzZWRUaW1lTWlsbGlzLCBNYXA8U3RyaW5nLCBTdHJpbmc+IHJ1bk1ldHJpY3MpIHsKLSAgICAgICAgICAgICAgICByZWNlaXZlZENvbXBvbmVudHNUZXN0UnVuRW5kZWQuYWRkQWxsKG15Q29udGV4dC5nZXRNb2R1bGVJbnZvY2F0aW9uQ29udGV4dCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29uZmlndXJhdGlvbkRlc2NyaXB0b3IoKS5nZXRNZXRhRGF0YSgiY29tcG9uZW50IikpOwotICAgICAgICAgICAgICAgIHJlY2VpdmVkTW9kdWxlTmFtZVRlc3RSdW5FbmRlZC5hZGRBbGwobXlDb250ZXh0LmdldE1vZHVsZUludm9jYXRpb25Db250ZXh0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBdHRyaWJ1dGVzKCkuZ2V0KElNb2R1bGVEZWYuTU9EVUxFX05BTUUpKTsKLSAgICAgICAgICAgICAgICByZWNlaXZlZEFiaVRlc3RSdW5FbmRlZC5hZGRBbGwobXlDb250ZXh0LmdldE1vZHVsZUludm9jYXRpb25Db250ZXh0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBdHRyaWJ1dGVzKCkuZ2V0KElNb2R1bGVEZWYuTU9EVUxFX0FCSSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0RW5kZWQoVGVzdElkZW50aWZpZXIgdGVzdCwgbG9uZyBlbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHRlc3RNZXRyaWNzKSB7Ci0gICAgICAgICAgICAgICAgcmVjZWl2ZWRDb21wb25lbnRzVGVzdEVuZGVkLmFkZEFsbChteUNvbnRleHQuZ2V0TW9kdWxlSW52b2NhdGlvbkNvbnRleHQoKQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbmZpZ3VyYXRpb25EZXNjcmlwdG9yKCkuZ2V0TWV0YURhdGEoImNvbXBvbmVudCIpKTsKLSAgICAgICAgICAgICAgICByZWNlaXZlZE1vZHVsZU5hbWVUZXN0RW5kZWQuYWRkQWxsKG15Q29udGV4dC5nZXRNb2R1bGVJbnZvY2F0aW9uQ29udGV4dCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QXR0cmlidXRlcygpLmdldChJTW9kdWxlRGVmLk1PRFVMRV9OQU1FKSk7Ci0gICAgICAgICAgICAgICAgcmVjZWl2ZWRBYmlUZXN0RW5kZWQuYWRkQWxsKG15Q29udGV4dC5nZXRNb2R1bGVJbnZvY2F0aW9uQ29udGV4dCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QXR0cmlidXRlcygpLmdldChJTW9kdWxlRGVmLk1PRFVMRV9BQkkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgbXlMaXN0ZW5lci5pbnZvY2F0aW9uU3RhcnRlZChtQ29udGV4dCk7Ci0gICAgICAgIG1UZXN0LnJ1bihteUxpc3RlbmVyKTsKLSAgICAgICAgbXlMaXN0ZW5lci5pbnZvY2F0aW9uRW5kZWQoNTAwKTsKLSAgICAgICAgRWFzeU1vY2sudmVyaWZ5KG1Nb2NrRGV2aWNlLCBtTW9ja0J1aWxkSW5mbyk7Ci0gICAgICAgIC8vIHZlcmlmeSBtZXRhZGF0YSB3YXMgcmV0cmlldmVkIGR1cmluZyB0ZXN0UnVuRW5kZWQgY2FsbGJhY2tzCi0gICAgICAgIGFzc2VydEVxdWFscygiW3Rlc3RSdW5FbmRlZF0gd3JvbmcgbnVtYmVyIG9mIG1ldGFkYXRhIGNvbGxlY3RlZCIsCi0gICAgICAgICAgICAgICAgMSwgcmVjZWl2ZWRDb21wb25lbnRzVGVzdFJ1bkVuZGVkLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiW3Rlc3RSdW5FbmRlZF0gd3JvbmcgY29tcG9uZW50IG1ldGFkYXRhIGZpZWxkIHJlY2VpdmVkIiwKLSAgICAgICAgICAgICAgICBjb21wb25lbnQsIHJlY2VpdmVkQ29tcG9uZW50c1Rlc3RSdW5FbmRlZC5nZXQoMCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlt0ZXN0UnVuRW5kZWRdIHdyb25nIG51bWJlciBvZiBtb2R1bGUgbmFtZSBjb2xsZWN0ZWQiLAotICAgICAgICAgICAgICAgIDEsIHJlY2VpdmVkTW9kdWxlTmFtZVRlc3RSdW5FbmRlZC5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMobW9kdWxlTmFtZSwgcmVjZWl2ZWRNb2R1bGVOYW1lVGVzdFJ1bkVuZGVkLmdldCgwKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiW3Rlc3RFbmRlZF0gd3JvbmcgbnVtYmVyIG9mIG1vZHVsZSBhYmkgY29sbGVjdGVkIiwKLSAgICAgICAgICAgICAgICAxLCByZWNlaXZlZEFiaVRlc3RSdW5FbmRlZC5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMobUFiaSwgcmVjZWl2ZWRBYmlUZXN0UnVuRW5kZWQuZ2V0KDApKTsKLSAgICAgICAgLy8gdmVyaWZ5IG1ldGFkYXRhIHdhcyByZXRyaWV2ZWQgZHVyaW5nIHRlc3RFbmRlZCBjYWxsYmFja3MKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJbdGVzdEVuZGVkXSB3cm9uZyBudW1iZXIgb2YgbWV0YWRhdGEgY29sbGVjdGVkIiwKLSAgICAgICAgICAgICAgICAxLCByZWNlaXZlZENvbXBvbmVudHNUZXN0RW5kZWQuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJbdGVzdEVuZGVkXSB3cm9uZyBjb21wb25lbnQgbWV0YWRhdGEgZmllbGQgcmVjZWl2ZWQiLAotICAgICAgICAgICAgICAgIGNvbXBvbmVudCwgcmVjZWl2ZWRDb21wb25lbnRzVGVzdEVuZGVkLmdldCgwKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiW3Rlc3RFbmRlZF0gd3JvbmcgbnVtYmVyIG9mIG1vZHVsZSBuYW1lIGNvbGxlY3RlZCIsCi0gICAgICAgICAgICAgICAgMSwgcmVjZWl2ZWRNb2R1bGVOYW1lVGVzdEVuZGVkLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhtb2R1bGVOYW1lLCByZWNlaXZlZE1vZHVsZU5hbWVUZXN0RW5kZWQuZ2V0KDApKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJbdGVzdEVuZGVkXSB3cm9uZyBudW1iZXIgb2YgbW9kdWxlIGFiaSBjb2xsZWN0ZWQiLAotICAgICAgICAgICAgICAgIDEsIHJlY2VpdmVkQWJpVGVzdEVuZGVkLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhtQWJpLCByZWNlaXZlZEFiaVRlc3RFbmRlZC5nZXQoMCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNpbXBsZSB0ZXN0cyBydW5uaW5nIGluIG9uZSBtb2R1bGUgdGhhdCBydW4gc29tZSB0ZXN0cyBidXQgbm90IGFsbCBvZiB0aGVtLgotICAgICAqLwotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNpbmdsZU1vZHVsZVJ1bl9pbmNvbXBsZXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBtb2R1bGVOYW1lID0gIm1vZHVsZV9ydW5faW5jb21wbGV0ZSI7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBtQWJpID0gImFybTY0LXY4YSI7Ci0gICAgICAgIGNyZWF0ZUNvbmZpZyhtVGVzdERpciwgbW9kdWxlTmFtZSwgVEVTVF9TVFVCLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBFYXN5TW9jay5leHBlY3QobU1vY2tEZXZpY2UuZ2V0UHJvcGVydHkoInJvLnByb2R1Y3QuY3B1LmFiaWxpc3QiKSkuYW5kUmV0dXJuKG1BYmkpOwotCi0gICAgICAgIG1Nb2NrQnVpbGRJbmZvLmFkZEJ1aWxkQXR0cmlidXRlKEVhc3lNb2NrLmVxKENvbXBhdGliaWxpdHlCdWlsZEhlbHBlci5NT0RVTEVfSURTKSwKLSAgICAgICAgICAgICAgICBFYXN5TW9jay5lcShBYmlVdGlscy5jcmVhdGVJZChtQWJpLCBtb2R1bGVOYW1lKSkpOwotICAgICAgICBFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpOwotCi0gICAgICAgIEVhc3lNb2NrLnJlcGxheShtTW9ja0RldmljZSwgbU1vY2tCdWlsZEluZm8pOwotICAgICAgICBtUmVwb3J0ZXIuaW52b2NhdGlvblN0YXJ0ZWQobUNvbnRleHQpOwotICAgICAgICBtVGVzdC5ydW4obVJlcG9ydGVyKTsKLSAgICAgICAgbVJlcG9ydGVyLmludm9jYXRpb25FbmRlZCg1MDApOwotICAgICAgICBFYXN5TW9jay52ZXJpZnkobU1vY2tEZXZpY2UsIG1Nb2NrQnVpbGRJbmZvKTsKLSAgICAgICAgSUludm9jYXRpb25SZXN1bHQgcmVzdWx0ID0gbVJlcG9ydGVyLmdldFJlc3VsdCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcmVzdWx0LmNvdW50UmVzdWx0cyhUZXN0U3RhdHVzLlBBU1MpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlc3VsdC5jb3VudFJlc3VsdHMoVGVzdFN0YXR1cy5GQUlMKSk7Ci0gICAgICAgIC8vIE1vZHVsZSBzaG91bGQgbm90IGJlIHNlZW4gYXMgY29tcGxldGUuCi0gICAgICAgIGFzc2VydEVxdWFscygxLCByZXN1bHQuZ2V0TW9kdWxlcygpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCByZXN1bHQuZ2V0TW9kdWxlQ29tcGxldGVDb3VudCgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaW1wbGUgdGVzdHMgcnVubmluZyBpbiBvbmUgbW9kdWxlIHRoYXQgc2hvdWxkIGJlIG1hcmtlZCBjb21wbGV0ZSBzaW5jZSBpdCBydW5zIGFsbCBpdHMKLSAgICAgKiB0ZXN0cyBhZnRlciBhbiBpbnRlcm5hbCByZXRyeSAobGlrZSBJbnN0cnVtZW50YXRpb25UZXN0KS4KLSAgICAgKiBGSVhNRTogRml4IHRoZSBleHBlY3RhdGlvbiBvZiB0aGlzIHRlc3QKLSAgICAgKi8KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGVNb2R1bGVSdW5fY29tcGxldGVBZnRlckludGVybmFsUmV0cnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIG1vZHVsZU5hbWUgPSAibW9kdWxlX2NvbXBsZXRlQWZ0ZXJSZXRyeSI7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBtQWJpID0gImFybTY0LXY4YSI7Ci0gICAgICAgIGNyZWF0ZUNvbmZpZyhtVGVzdERpciwgbW9kdWxlTmFtZSwgVEVTVF9TVFVCLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgRWFzeU1vY2suZXhwZWN0KG1Nb2NrRGV2aWNlLmdldFByb3BlcnR5KCJyby5wcm9kdWN0LmNwdS5hYmlsaXN0IikpLmFuZFJldHVybihtQWJpKTsKLQotICAgICAgICBtTW9ja0J1aWxkSW5mby5hZGRCdWlsZEF0dHJpYnV0ZShFYXN5TW9jay5lcShDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIuTU9EVUxFX0lEUyksCi0gICAgICAgICAgICAgICAgRWFzeU1vY2suZXEoQWJpVXRpbHMuY3JlYXRlSWQobUFiaSwgbW9kdWxlTmFtZSkpKTsKLSAgICAgICAgRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKTsKLQotICAgICAgICBFYXN5TW9jay5yZXBsYXkobU1vY2tEZXZpY2UsIG1Nb2NrQnVpbGRJbmZvKTsKLSAgICAgICAgbVJlcG9ydGVyLmludm9jYXRpb25TdGFydGVkKG1Db250ZXh0KTsKLSAgICAgICAgbVRlc3QucnVuKG1SZXBvcnRlcik7Ci0gICAgICAgIG1SZXBvcnRlci5pbnZvY2F0aW9uRW5kZWQoNTAwKTsKLSAgICAgICAgRWFzeU1vY2sudmVyaWZ5KG1Nb2NrRGV2aWNlLCBtTW9ja0J1aWxkSW5mbyk7Ci0gICAgICAgIElJbnZvY2F0aW9uUmVzdWx0IHJlc3VsdCA9IG1SZXBvcnRlci5nZXRSZXN1bHQoKTsKLSAgICAgICAgLy8gRklYTUU6IEFsbCB0ZXN0cyBzaG91bGQgYmUgbWFya2VkIGFzIGV4ZWN1dGVkIGFuZCBub3QgYWdncmVnYXRpbmcgdGhlIGNvdW50LgotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcmVzdWx0LmNvdW50UmVzdWx0cyhUZXN0U3RhdHVzLlBBU1MpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlc3VsdC5jb3VudFJlc3VsdHMoVGVzdFN0YXR1cy5GQUlMKSk7Ci0gICAgICAgIC8vIEZJWE1FOiBNb2R1bGUgc2hvdWxkIGJlIGNvbXBsZXRlIHNpbmNlIGFsbCBpdHMgdGVzdCBoYXZlIHJ1bi4KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlc3VsdC5nZXRNb2R1bGVzKCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHJlc3VsdC5nZXRNb2R1bGVDb21wbGV0ZUNvdW50KCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNpbXBsZSB0ZXN0cyBydW5uaW5nIGluIG9uZSBtb2R1bGUgdGhhdCBydW4gc29tZSB0ZXN0cyBidXQgbm90IGFsbCBvZiB0aGVtLCB0aGVuIHdlCi0gICAgICogYXR0ZW1wdCB0byBydW4gaXQgYWdhaW4gYW5kIHRoZXkgc3RpbGwgZGlkbid0IHJ1bi4KLSAgICAgKiBGSVhNRTogVGhpcyB0ZXN0IGV4cGVjdGF0aW9uIG5lZWRzIHRvIGJlIGZpeGVkCi0gICAgICovCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlTW9kdWxlUnVuX2luY29tcGxldGVfcmVydW5faW5jb21wbGV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBTdHJpbmcgbW9kdWxlTmFtZSA9ICJtb2R1bGVfaW5jb21wbGV0ZV9yZXJ1biI7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBtQWJpID0gImFybTY0LXY4YSI7Ci0gICAgICAgIGNyZWF0ZUNvbmZpZyhtVGVzdERpciwgbW9kdWxlTmFtZSwgVEVTVF9TVFVCLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBFYXN5TW9jay5leHBlY3QobU1vY2tEZXZpY2UuZ2V0UHJvcGVydHkoInJvLnByb2R1Y3QuY3B1LmFiaWxpc3QiKSkuYW5kUmV0dXJuKG1BYmkpOwotCi0gICAgICAgIG1Nb2NrQnVpbGRJbmZvLmFkZEJ1aWxkQXR0cmlidXRlKEVhc3lNb2NrLmVxKENvbXBhdGliaWxpdHlCdWlsZEhlbHBlci5NT0RVTEVfSURTKSwKLSAgICAgICAgICAgICAgICBFYXN5TW9jay5lcShBYmlVdGlscy5jcmVhdGVJZChtQWJpLCBtb2R1bGVOYW1lKSkpOwotICAgICAgICBFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpOwotCi0gICAgICAgIC8vIGV4dHJhIGNhbGxzIGZvciByZXRyeQotICAgICAgICBFYXN5TW9jay5leHBlY3QobU1vY2tEZXZpY2UuZ2V0UHJvcGVydHkoInJvLmJ1aWxkLmZpbmdlcnByaW50IikpLmFuZFJldHVybigiZmluZ2VycHJpbnQiKTsKLSAgICAgICAgRWFzeU1vY2suZXhwZWN0KG1Nb2NrRGV2aWNlLmdldFByb3BlcnR5KCJyby5wcm9kdWN0LmNwdS5hYmlsaXN0IikpLmFuZFJldHVybihtQWJpKTsKLSAgICAgICAgbU1vY2tCdWlsZEluZm8uYWRkQnVpbGRBdHRyaWJ1dGUoRWFzeU1vY2suZXEoQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyLk1PRFVMRV9JRFMpLAotICAgICAgICAgICAgICAgIEVhc3lNb2NrLmVxKEFiaVV0aWxzLmNyZWF0ZUlkKG1BYmksIG1vZHVsZU5hbWUpKSk7Ci0gICAgICAgIEVhc3lNb2NrLmV4cGVjdExhc3RDYWxsKCk7Ci0gICAgICAgIG1Nb2NrQnVpbGRJbmZvLmFkZEJ1aWxkQXR0cmlidXRlKEVhc3lNb2NrLmVxKCJyZXRyeV9jb21tYW5kX2xpbmVfYXJncyIpLAotICAgICAgICAgICAgICAgIEVhc3lNb2NrLmVxKENPTU1BTkRfTElORSkpOwotICAgICAgICBFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpOwotCi0gICAgICAgIEVhc3lNb2NrLnJlcGxheShtTW9ja0RldmljZSwgbU1vY2tCdWlsZEluZm8pOwotICAgICAgICBtUmVwb3J0ZXIuaW52b2NhdGlvblN0YXJ0ZWQobUNvbnRleHQpOwotICAgICAgICBtVGVzdC5ydW4obVJlcG9ydGVyKTsKLSAgICAgICAgbVJlcG9ydGVyLmludm9jYXRpb25FbmRlZCg1MDApOwotCi0gICAgICAgIElJbnZvY2F0aW9uUmVzdWx0IHJlc3VsdCA9IG1SZXBvcnRlci5nZXRSZXN1bHQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlc3VsdC5jb3VudFJlc3VsdHMoVGVzdFN0YXR1cy5QQVNTKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCByZXN1bHQuY291bnRSZXN1bHRzKFRlc3RTdGF0dXMuRkFJTCkpOwotICAgICAgICAvLyBNb2R1bGUgc2hvdWxkIG5vdCBiZSBzZWVuIGFzIGNvbXBsZXRlLgotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcmVzdWx0LmdldE1vZHVsZUNvbXBsZXRlQ291bnQoKSk7Ci0KLSAgICAgICAgLy8gV2UgcmUtcnVuIGl0Ci0gICAgICAgIG1SZXBvcnRlciA9IG5ldyBSZXN1bHRSZXBvcnRlcigpOwotICAgICAgICBtVGVzdCA9IG5ldyBDb21wYXRpYmlsaXR5VGVzdCgpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHJvdGVjdGVkIFNldDxTdHJpbmc+IGdldEFiaXNGb3JCdWlsZFRhcmdldEFyY2goKSB7Ci0gICAgICAgICAgICAgICAgU2V0PFN0cmluZz4gYWJpcyA9IG5ldyBIYXNoU2V0PD4oKTsKLSAgICAgICAgICAgICAgICBhYmlzLmFkZCgiYXJtNjQtdjhhIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFiaXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIG1UZXN0LnNldERldmljZShtTW9ja0RldmljZSk7Ci0gICAgICAgIG1UZXN0LnNldEJ1aWxkKG1Nb2NrQnVpbGRJbmZvKTsKLSAgICAgICAgbVRlc3Quc2V0SW52b2NhdGlvbkNvbnRleHQobUNvbnRleHQpOwotICAgICAgICBPcHRpb25TZXR0ZXIgc2V0dGVyID0gbmV3IE9wdGlvblNldHRlcihtVGVzdCwgbVJlcG9ydGVyKTsKLSAgICAgICAgc2V0dGVyLnNldE9wdGlvblZhbHVlKCJyZXRyeSIsICIwIik7Ci0KLSAgICAgICAgbVJlcG9ydGVyLmludm9jYXRpb25TdGFydGVkKG1Db250ZXh0KTsKLSAgICAgICAgbVRlc3QucnVuKG1SZXBvcnRlcik7Ci0gICAgICAgIG1SZXBvcnRlci5pbnZvY2F0aW9uRW5kZWQoNTAwKTsKLSAgICAgICAgRWFzeU1vY2sudmVyaWZ5KG1Nb2NrRGV2aWNlLCBtTW9ja0J1aWxkSW5mbyk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgcmV0cnkgcmVzdWx0cwotICAgICAgICByZXN1bHQgPSBtUmVwb3J0ZXIuZ2V0UmVzdWx0KCk7Ci0gICAgICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgb25seSBoYXZlIDEgbm90X2V4ZWN1dGVkIGluIHRoZSByZXRyeSB0b28uIFRoZXkgc2hvdWxkIG5vdCBhZ2dyZWdhdGUKLSAgICAgICAgLy8gZnJvbSBvbmUgcnVuIHRvIGFub3RoZXIuCi0gICAgICAgIGFzc2VydEVxdWFscygxLCByZXN1bHQuY291bnRSZXN1bHRzKFRlc3RTdGF0dXMuUEFTUykpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcmVzdWx0LmNvdW50UmVzdWx0cyhUZXN0U3RhdHVzLkZBSUwpKTsKLSAgICAgICAgLy8gTW9kdWxlIHNob3VsZCBub3QgYmUgc2VlbiBhcyBjb21wbGV0ZS4KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlc3VsdC5nZXRNb2R1bGVzKCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHJlc3VsdC5nZXRNb2R1bGVDb21wbGV0ZUNvdW50KCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNpbXBsZSB0ZXN0cyBydW5uaW5nIGluIG9uZSBtb2R1bGUgdGhhdCBydW4gc29tZSB0ZXN0cyBidXQgbm90IGFsbCBvZiB0aGVtLCB3ZSB0aGVuIGF0dGVtcHQKLSAgICAgKiB0byByZXRyeSBydW4gdGhlbSBhbmQgdGhpcyB0aW1lIHRoZSBub3RfZXhlY3V0ZWQgaXMgZXhlY3V0ZWQuCi0gICAgICovCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlTW9kdWxlUnVuX2luY29tcGxldGVfcmVydW5fY29tcGxldGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIG1vZHVsZU5hbWUgPSAibW9kdWxlX2luY29tX3JlcnVuX2NvbXBsZXRlIjsKLSAgICAgICAgZmluYWwgU3RyaW5nIG1BYmkgPSAiYXJtNjQtdjhhIjsKLSAgICAgICAgY3JlYXRlQ29uZmlnKG1UZXN0RGlyLCBtb2R1bGVOYW1lLCBURVNUX1NUVUIsIHRydWUsIGZhbHNlLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIEVhc3lNb2NrLmV4cGVjdChtTW9ja0RldmljZS5nZXRQcm9wZXJ0eSgicm8ucHJvZHVjdC5jcHUuYWJpbGlzdCIpKS5hbmRSZXR1cm4obUFiaSk7Ci0KLSAgICAgICAgbU1vY2tCdWlsZEluZm8uYWRkQnVpbGRBdHRyaWJ1dGUoRWFzeU1vY2suZXEoQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyLk1PRFVMRV9JRFMpLAotICAgICAgICAgICAgICAgIEVhc3lNb2NrLmVxKEFiaVV0aWxzLmNyZWF0ZUlkKG1BYmksIG1vZHVsZU5hbWUpKSk7Ci0gICAgICAgIEVhc3lNb2NrLmV4cGVjdExhc3RDYWxsKCk7Ci0KLSAgICAgICAgLy8gZXh0cmEgY2FsbHMgZm9yIHJldHJ5Ci0gICAgICAgIEVhc3lNb2NrLmV4cGVjdChtTW9ja0RldmljZS5nZXRQcm9wZXJ0eSgicm8uYnVpbGQuZmluZ2VycHJpbnQiKSkuYW5kUmV0dXJuKCJmaW5nZXJwcmludCIpOwotICAgICAgICBFYXN5TW9jay5leHBlY3QobU1vY2tEZXZpY2UuZ2V0UHJvcGVydHkoInJvLnByb2R1Y3QuY3B1LmFiaWxpc3QiKSkuYW5kUmV0dXJuKG1BYmkpOwotICAgICAgICBtTW9ja0J1aWxkSW5mby5hZGRCdWlsZEF0dHJpYnV0ZShFYXN5TW9jay5lcShDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIuTU9EVUxFX0lEUyksCi0gICAgICAgICAgICAgICAgRWFzeU1vY2suZXEoQWJpVXRpbHMuY3JlYXRlSWQobUFiaSwgbW9kdWxlTmFtZSkpKTsKLSAgICAgICAgRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKTsKLSAgICAgICAgbU1vY2tCdWlsZEluZm8uYWRkQnVpbGRBdHRyaWJ1dGUoRWFzeU1vY2suZXEoInJldHJ5X2NvbW1hbmRfbGluZV9hcmdzIiksCi0gICAgICAgICAgICAgICAgRWFzeU1vY2suZXEoQ09NTUFORF9MSU5FKSk7Ci0gICAgICAgIEVhc3lNb2NrLmV4cGVjdExhc3RDYWxsKCk7Ci0KLSAgICAgICAgRWFzeU1vY2sucmVwbGF5KG1Nb2NrRGV2aWNlLCBtTW9ja0J1aWxkSW5mbyk7Ci0gICAgICAgIG1SZXBvcnRlci5pbnZvY2F0aW9uU3RhcnRlZChtQ29udGV4dCk7Ci0gICAgICAgIG1UZXN0LnJ1bihtUmVwb3J0ZXIpOwotICAgICAgICBtUmVwb3J0ZXIuaW52b2NhdGlvbkVuZGVkKDUwMCk7Ci0KLSAgICAgICAgSUludm9jYXRpb25SZXN1bHQgcmVzdWx0ID0gbVJlcG9ydGVyLmdldFJlc3VsdCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcmVzdWx0LmNvdW50UmVzdWx0cyhUZXN0U3RhdHVzLlBBU1MpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlc3VsdC5jb3VudFJlc3VsdHMoVGVzdFN0YXR1cy5GQUlMKSk7Ci0gICAgICAgIC8vIE1vZHVsZSBzaG91bGQgbm90IGJlIHNlZW4gYXMgY29tcGxldGUuCi0gICAgICAgIGFzc2VydEVxdWFscygwLCByZXN1bHQuZ2V0TW9kdWxlQ29tcGxldGVDb3VudCgpKTsKLQotICAgICAgICAvLyBXZSByZXBsYWNlIHRoZSBjb25maWcgYnkgb25lIHRoYXQgcnVucyBhbGwgdGVzdHMgd2l0aG91dCBmYWlsdXJlcy4KLSAgICAgICAgY3JlYXRlQ29uZmlnKG1UZXN0RGlyLCBtb2R1bGVOYW1lLCBURVNUX1NUVUIsIHRydWUsIHRydWUsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIC8vIFVzdWFsbHkgY29uZmlncyBkbyBub3QgY2hhbmdlIGR1cmluZyB0aGUgc2FtZSBzZXNzaW9uIHNvIHdlIGNsZWFyIHRoZSBtYXAgdG8gaGF2ZQotICAgICAgICAvLyB0aGUgbmV3IHZlcnNpb24gb2YgdGhlIGNvbmZpZy4KLSAgICAgICAgKChDb25maWd1cmF0aW9uRmFjdG9yeSlDb25maWd1cmF0aW9uRmFjdG9yeS5nZXRJbnN0YW5jZSgpKS5jbGVhck1hcENvbmZpZygpOwotCi0gICAgICAgIC8vIFdlIHJlLXJ1biBpdAotICAgICAgICBtUmVwb3J0ZXIgPSBuZXcgUmVzdWx0UmVwb3J0ZXIoKTsKLSAgICAgICAgbVRlc3QgPSBuZXcgQ29tcGF0aWJpbGl0eVRlc3QoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHByb3RlY3RlZCBTZXQ8U3RyaW5nPiBnZXRBYmlzRm9yQnVpbGRUYXJnZXRBcmNoKCkgewotICAgICAgICAgICAgICAgIFNldDxTdHJpbmc+IGFiaXMgPSBuZXcgSGFzaFNldDw+KCk7Ci0gICAgICAgICAgICAgICAgYWJpcy5hZGQoImFybTY0LXY4YSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBhYmlzOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBtVGVzdC5zZXREZXZpY2UobU1vY2tEZXZpY2UpOwotICAgICAgICBtVGVzdC5zZXRCdWlsZChtTW9ja0J1aWxkSW5mbyk7Ci0gICAgICAgIG1UZXN0LnNldEludm9jYXRpb25Db250ZXh0KG1Db250ZXh0KTsKLSAgICAgICAgT3B0aW9uU2V0dGVyIHNldHRlciA9IG5ldyBPcHRpb25TZXR0ZXIobVRlc3QsIG1SZXBvcnRlcik7Ci0gICAgICAgIHNldHRlci5zZXRPcHRpb25WYWx1ZSgicmV0cnkiLCAiMCIpOwotCi0gICAgICAgIG1SZXBvcnRlci5pbnZvY2F0aW9uU3RhcnRlZChtQ29udGV4dCk7Ci0gICAgICAgIG1UZXN0LnJ1bihtUmVwb3J0ZXIpOwotICAgICAgICBtUmVwb3J0ZXIuaW52b2NhdGlvbkVuZGVkKDUwMCk7Ci0gICAgICAgIEVhc3lNb2NrLnZlcmlmeShtTW9ja0RldmljZSwgbU1vY2tCdWlsZEluZm8pOwotCi0gICAgICAgIC8vIENoZWNrIHJldHJ5IHJlc3VsdHMKLSAgICAgICAgcmVzdWx0ID0gbVJlcG9ydGVyLmdldFJlc3VsdCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMywgcmVzdWx0LmNvdW50UmVzdWx0cyhUZXN0U3RhdHVzLlBBU1MpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHJlc3VsdC5jb3VudFJlc3VsdHMoVGVzdFN0YXR1cy5GQUlMKSk7Ci0gICAgICAgIC8vIE1vZHVsZSBzaG91bGQgYmUgbWFya2VkIGFzIGNvbXBsZXRlIGFmdGVyIHJldHJ5LgotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcmVzdWx0LmdldE1vZHVsZXMoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcmVzdWx0LmdldE1vZHVsZUNvbXBsZXRlQ291bnQoKSk7Ci0gICAgfQotCi0gICAgLy8gKioqKiogQ2FzZSBmb3Igc2hhcmRpbmcgaW50ZXJhY3Rpb24gKioqKioKLQotICAgIC8qKgotICAgICAqIEhlbHBlciB0byBjcmVhdGUgYSBzaGFyZCBsaXN0ZW5lciB3aXRoIHRoZSBvcmlnaW5hbCByZXBvcnRlciBhcyBtYXN0ZXIuCi0gICAgICovCi0gICAgcHJpdmF0ZSBJVGVzdEludm9jYXRpb25MaXN0ZW5lciBnZXRTaGFyZExpc3RlbmVyKFJlc3VsdFJlcG9ydGVyIG1hc3RlclJlcG9ydGVyKSB7Ci0gICAgICAgIExpc3Q8SVRlc3RJbnZvY2F0aW9uTGlzdGVuZXI+IHNoYXJkTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxJVGVzdEludm9jYXRpb25MaXN0ZW5lcj4oKTsKLSAgICAgICAgU2hhcmRMaXN0ZW5lciBvcmlnQ29uZmlnTGlzdGVuZXIgPSBuZXcgU2hhcmRMaXN0ZW5lcihtYXN0ZXJSZXBvcnRlcik7Ci0gICAgICAgIFJlc3VsdFJlcG9ydGVyIHJlcG9ydGVyQ2xvbmUgPSAoUmVzdWx0UmVwb3J0ZXIpIG1hc3RlclJlcG9ydGVyLmNsb25lKCk7Ci0gICAgICAgIHNoYXJkTGlzdGVuZXJzLmFkZChyZXBvcnRlckNsb25lKTsKLSAgICAgICAgc2hhcmRMaXN0ZW5lcnMuYWRkKG9yaWdDb25maWdMaXN0ZW5lcik7Ci0gICAgICAgIFJlc3VsdEZvcndhcmRlciBzaGFyZCA9IG5ldyBSZXN1bHRGb3J3YXJkZXIoc2hhcmRMaXN0ZW5lcnMpOwotICAgICAgICByZXR1cm4gc2hhcmQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGVscGVyIFRocmVhZCB0byBydW4gdGhlIElTaGFyZGFibGVUZXN0LgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgU2hhcmRUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgewotICAgICAgICBwcml2YXRlIElSZW1vdGVUZXN0IG1TaGFyZFRlc3Q7Ci0gICAgICAgIHByaXZhdGUgUmVzdWx0UmVwb3J0ZXIgbU1hc3RlclJlcG9ydGVyOwotICAgICAgICBwcml2YXRlIElCdWlsZEluZm8gbUJ1aWxkOwotICAgICAgICBwcml2YXRlIElUZXN0RGV2aWNlIG1EZXZpY2U7Ci0gICAgICAgIHByaXZhdGUgSUludm9jYXRpb25Db250ZXh0IG1TaGFyZENvbnRleHQ7Ci0KLSAgICAgICAgcHVibGljIFNoYXJkVGhyZWFkKElSZW1vdGVUZXN0IHRlc3QsIFJlc3VsdFJlcG9ydGVyIG1hc3RlclJlcG9ydGVyLCBJQnVpbGRJbmZvIGJ1aWxkLAotICAgICAgICAgICAgICAgIElUZXN0RGV2aWNlIGRldmljZSwgSUludm9jYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIG1TaGFyZFRlc3QgPSB0ZXN0OwotICAgICAgICAgICAgbU1hc3RlclJlcG9ydGVyID0gbWFzdGVyUmVwb3J0ZXI7Ci0gICAgICAgICAgICBtQnVpbGQgPSBidWlsZDsKLSAgICAgICAgICAgIG1EZXZpY2UgPSBkZXZpY2U7Ci0gICAgICAgICAgICBtU2hhcmRDb250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBJVGVzdEludm9jYXRpb25MaXN0ZW5lciBsaXN0ZW5lciA9IGdldFNoYXJkTGlzdGVuZXIobU1hc3RlclJlcG9ydGVyKTsKLSAgICAgICAgICAgICgoSUJ1aWxkUmVjZWl2ZXIpbVNoYXJkVGVzdCkuc2V0QnVpbGQobUJ1aWxkKTsKLSAgICAgICAgICAgICgoSURldmljZVRlc3QpbVNoYXJkVGVzdCkuc2V0RGV2aWNlKG1EZXZpY2UpOwotICAgICAgICAgICAgKChJSW52b2NhdGlvbkNvbnRleHRSZWNlaXZlciltU2hhcmRUZXN0KS5zZXRJbnZvY2F0aW9uQ29udGV4dChtQ29udGV4dCk7Ci0gICAgICAgICAgICBsaXN0ZW5lci5pbnZvY2F0aW9uU3RhcnRlZChtU2hhcmRDb250ZXh0KTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbVNoYXJkVGVzdC5ydW4obGlzdGVuZXIpOwotICAgICAgICAgICAgfSBjYXRjaCAoRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgbGlzdGVuZXIuaW52b2NhdGlvbkVuZGVkKDUwMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaW1wbGUgdGVzdHMgcnVubmluZyBpbiBvbmUgbW9kdWxlIHRoYXQgc2hvdWxkIGJlIG1hcmtlZCBjb21wbGV0ZSB3aGVuIGVhY2ggc2hhcmQgcnVuIGEgdGVzdAotICAgICAqIGZyb20gdGhlIG1vZHVsZS4gRWFjaCBNb2R1bGUgaXMgZ29pbmcgdG8gcnVuIDEgcGFzcyAxIGZhaWwuIDIgbW9kdWxlcyBhbmQgMiBzaGFyZHMuCi0gICAgICogVXNpbmcgdGhlIHtAbGluayBDb21wYXRpYmlsaXR5VGVzdCNzcGxpdCgpfS4KLSAgICAgKi8KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGVNb2R1bGVSdW5fc2hhcmRlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBTdHJpbmcgbW9kdWxlTmFtZSA9ICJtb2R1bGVfc2hhcmRlZCI7Ci0gICAgICAgIFNldDxTdHJpbmc+IGFiaXMgPSBBYmlVdGlscy5nZXRBYmlzRm9yQXJjaChUZXN0U3VpdGVJbmZvLmdldEluc3RhbmNlKCkuZ2V0VGFyZ2V0QXJjaCgpKTsKLSAgICAgICAgSXRlcmF0b3I8U3RyaW5nPiBpdGUgPSBhYmlzLml0ZXJhdG9yKCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBhYmkxID0gaXRlLm5leHQoKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGFiaTIgPSBpdGUubmV4dCgpOwotICAgICAgICBjcmVhdGVDb25maWcobVRlc3REaXIsIG1vZHVsZU5hbWUsIFRFU1RfU1RVQl9TSEFSREFCTEUsIHRydWUsIHRydWUsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgRWFzeU1vY2suZXhwZWN0KG1Nb2NrRGV2aWNlLmdldFByb3BlcnR5KCJyby5wcm9kdWN0LmNwdS5hYmlsaXN0IikpLmFuZFJldHVybigKLSAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCIlcywlcyIsIGFiaTEsIGFiaTIpKTsKLSAgICAgICAgbU1vY2tCdWlsZEluZm8uYWRkQnVpbGRBdHRyaWJ1dGUoRWFzeU1vY2suZXEoQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyLk1PRFVMRV9JRFMpLAotICAgICAgICAgICAgICAgIEVhc3lNb2NrLmFueU9iamVjdCgpKTsKLSAgICAgICAgRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKTsKLQotICAgICAgICBFYXN5TW9jay5yZXBsYXkobU1vY2tEZXZpY2UsIG1Nb2NrQnVpbGRJbmZvKTsKLQotICAgICAgICBPcHRpb25TZXR0ZXIgc2V0dGVyID0gbmV3IE9wdGlvblNldHRlcihtVGVzdCk7Ci0gICAgICAgIHNldHRlci5zZXRPcHRpb25WYWx1ZSgic2hhcmRzIiwgIjIiKTsKLSAgICAgICAgTGlzdDxJUmVtb3RlVGVzdD4gdGVzdHMgPSAoTGlzdDxJUmVtb3RlVGVzdD4pIG1UZXN0LnNwbGl0KCk7Ci0gICAgICAgIC8vIFdlIGV4cGVjdCAyIHNoYXJkcwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgdGVzdHMuc2l6ZSgpKTsKLQotICAgICAgICBMaXN0PFNoYXJkVGhyZWFkPiB0aHJlYWRzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIC8vIFJ1biBhbGwgc2hhcmRzCi0gICAgICAgIGZvciAoSVJlbW90ZVRlc3QgdGVzdCA6IHRlc3RzKSB7Ci0gICAgICAgICAgICBTaGFyZFRocmVhZCBzdCA9IG5ldyBTaGFyZFRocmVhZCh0ZXN0LCBtUmVwb3J0ZXIsIG1Nb2NrQnVpbGRJbmZvLCBtTW9ja0RldmljZSwKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQpOwotICAgICAgICAgICAgdGhyZWFkcy5hZGQoc3QpOwotICAgICAgICAgICAgc3Quc3RhcnQoKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKFNoYXJkVGhyZWFkIHRocmVhZCA6IHRocmVhZHMpIHsKLSAgICAgICAgICAgIHRocmVhZC5qb2luKDUwMDApOwotICAgICAgICB9Ci0gICAgICAgIC8vIEFsbG93IHNvbWUgdGltZSBmb3IgUmVzdWx0UmVwb3J0IHRvIGZpbmFsaXplIHRoZSByZXN1bHRzIGNvbWluZyBmcm9tIHRoZSB0aHJlYWRzLgotICAgICAgICBib29sZWFuIGZpbmFsaXplZCA9IG1SZXBvcnRlci53YWl0Rm9yRmluYWxpemVkKDIsIFRpbWVVbml0Lk1JTlVURVMpOwotICAgICAgICBhc3NlcnRUcnVlKGZpbmFsaXplZCk7Ci0gICAgICAgIEVhc3lNb2NrLnZlcmlmeShtTW9ja0RldmljZSwgbU1vY2tCdWlsZEluZm8pOwotICAgICAgICAvLyBDaGVjayBhZ2dyZWdhdGVkIHJlc3VsdHMgdG8gbWFrZSBzdXJlIGl0J3MgY29uc2lzdGVudC4KLSAgICAgICAgSUludm9jYXRpb25SZXN1bHQgcmVzdWx0ID0gbVJlcG9ydGVyLmdldFJlc3VsdCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNCwgcmVzdWx0LmNvdW50UmVzdWx0cyhUZXN0U3RhdHVzLlBBU1MpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIHJlc3VsdC5jb3VudFJlc3VsdHMoVGVzdFN0YXR1cy5GQUlMKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCByZXN1bHQuZ2V0TW9kdWxlcygpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCByZXN1bHQuZ2V0TW9kdWxlQ29tcGxldGVDb3VudCgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaW1wbGUgdGVzdHMgcnVubmluZyBpbiBvbmUgbW9kdWxlIHRoYXQgc2hvdWxkIGJlIG1hcmtlZCBpbmNvbXBsZXRlIHdoZW4gc2hhcmRzIGRvIG5vdAotICAgICAqIGNvbXBsZXRlLiBFYWNoIHNoYXJkIGlzIGdvaW5nIHRvIHJ1biAxIHBhc3MgMSBmYWlsIDEgbm90X2V4ZWN1dGVkLgotICAgICAqIFVzaW5nIHRoZSB7QGxpbmsgQ29tcGF0aWJpbGl0eVRlc3Qjc3BsaXQoKX0uCi0gICAgICovCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlTW9kdWxlUnVuX3NoYXJkZWRfaW5jb21wbGV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBTdHJpbmcgbW9kdWxlTmFtZSA9ICJtb2R1bGVfc2hhcmRlZF9pbmNvbXBsZXRlIjsKLSAgICAgICAgU2V0PFN0cmluZz4gYWJpcyA9IEFiaVV0aWxzLmdldEFiaXNGb3JBcmNoKFRlc3RTdWl0ZUluZm8uZ2V0SW5zdGFuY2UoKS5nZXRUYXJnZXRBcmNoKCkpOwotICAgICAgICBJdGVyYXRvcjxTdHJpbmc+IGl0ZSA9IGFiaXMuaXRlcmF0b3IoKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGFiaTEgPSBpdGUubmV4dCgpOwotICAgICAgICBmaW5hbCBTdHJpbmcgYWJpMiA9IGl0ZS5uZXh0KCk7Ci0gICAgICAgIGNyZWF0ZUNvbmZpZyhtVGVzdERpciwgbW9kdWxlTmFtZSwgVEVTVF9TVFVCX1NIQVJEQUJMRSwgdHJ1ZSwgZmFsc2UsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgRWFzeU1vY2suZXhwZWN0KG1Nb2NrRGV2aWNlLmdldFByb3BlcnR5KCJyby5wcm9kdWN0LmNwdS5hYmlsaXN0IikpLmFuZFJldHVybigKLSAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCIlcywlcyIsIGFiaTEsIGFiaTIpKTsKLSAgICAgICAgbU1vY2tCdWlsZEluZm8uYWRkQnVpbGRBdHRyaWJ1dGUoRWFzeU1vY2suZXEoQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyLk1PRFVMRV9JRFMpLAotICAgICAgICAgICAgICAgIEVhc3lNb2NrLmFueU9iamVjdCgpKTsKLSAgICAgICAgRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKTsKLQotICAgICAgICBFYXN5TW9jay5yZXBsYXkobU1vY2tEZXZpY2UsIG1Nb2NrQnVpbGRJbmZvKTsKLSAgICAgICAgT3B0aW9uU2V0dGVyIHNldHRlciA9IG5ldyBPcHRpb25TZXR0ZXIobVRlc3QpOwotICAgICAgICBzZXR0ZXIuc2V0T3B0aW9uVmFsdWUoInNoYXJkcyIsICIyIik7Ci0gICAgICAgIExpc3Q8SVJlbW90ZVRlc3Q+IHRlc3RzID0gKExpc3Q8SVJlbW90ZVRlc3Q+KSBtVGVzdC5zcGxpdCgpOwotICAgICAgICAvLyBXZSBleHBlY3QgMiBzaGFyZHMKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHRlc3RzLnNpemUoKSk7Ci0KLSAgICAgICAgTGlzdDxTaGFyZFRocmVhZD4gdGhyZWFkcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAvLyBSdW4gYWxsIHNoYXJkcwotICAgICAgICBmb3IgKElSZW1vdGVUZXN0IHRlc3QgOiB0ZXN0cykgewotICAgICAgICAgICAgU2hhcmRUaHJlYWQgc3QgPSBuZXcgU2hhcmRUaHJlYWQodGVzdCwgbVJlcG9ydGVyLCBtTW9ja0J1aWxkSW5mbywgbU1vY2tEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgIG1Db250ZXh0KTsKLSAgICAgICAgICAgIHRocmVhZHMuYWRkKHN0KTsKLSAgICAgICAgICAgIHN0LnN0YXJ0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChTaGFyZFRocmVhZCB0aHJlYWQgOiB0aHJlYWRzKSB7Ci0gICAgICAgICAgICB0aHJlYWQuam9pbig1MDAwKTsKLSAgICAgICAgfQotICAgICAgICAvLyBBbGxvdyBzb21lIHRpbWUgZm9yIFJlc3VsdFJlcG9ydCB0byBmaW5hbGl6ZSB0aGUgcmVzdWx0cyBjb21pbmcgZnJvbSB0aGUgdGhyZWFkcy4KLSAgICAgICAgYm9vbGVhbiBmaW5hbGl6ZWQgPSBtUmVwb3J0ZXIud2FpdEZvckZpbmFsaXplZCgyLCBUaW1lVW5pdC5NSU5VVEVTKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShmaW5hbGl6ZWQpOwotICAgICAgICBFYXN5TW9jay52ZXJpZnkobU1vY2tEZXZpY2UsIG1Nb2NrQnVpbGRJbmZvKTsKLSAgICAgICAgLy8gQ2hlY2sgYWdncmVnYXRlZCByZXN1bHRzIHRvIG1ha2Ugc3VyZSBpdCdzIGNvbnNpc3RlbnQuCi0gICAgICAgIElJbnZvY2F0aW9uUmVzdWx0IHJlc3VsdCA9IG1SZXBvcnRlci5nZXRSZXN1bHQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIHJlc3VsdC5jb3VudFJlc3VsdHMoVGVzdFN0YXR1cy5QQVNTKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyg0LCByZXN1bHQuY291bnRSZXN1bHRzKFRlc3RTdGF0dXMuRkFJTCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcmVzdWx0LmdldE1vZHVsZXMoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcmVzdWx0LmdldE1vZHVsZUNvbXBsZXRlQ291bnQoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2ltcGxlIHRlc3RzIHJ1bm5pbmcgaW4gb25lIG1vZHVsZSB0aGF0IHNob3VsZCBiZSBtYXJrZWQgY29tcGxldGUgd2hlbiBlYWNoIHNoYXJkIHJ1biBhIHRlc3QKLSAgICAgKiBmcm9tIHRoZSBtb2R1bGUuCi0gICAgICogV2UgYXJlIGdvaW5nIHRvIHJ1biBvbmx5IG9uZSBvZiB0aGUgc2hhcmQgc2luY2UgSVN0cmljdFNoYXJkYWJsZSBhbGxvd3MgaXQuCi0gICAgICogVXNpbmcgdGhlIHtAbGluayBDb21wYXRpYmlsaXR5VGVzdCNnZXRUZXN0U2hhcmQoaW50LCBpbnQpfS4KLSAgICAgKiBGSVhNRTogRml4IGV4cGVjdGF0aW9uIG9mIHRoaXMgdGVzdC4KLSAgICAgKi8KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGVNb2R1bGVSdW5fc2hhcmRlZF9nZXRUZXN0U2hhcmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIG1vZHVsZU5hbWUgPSAibW9kdWxlX3NoYXJkZWRfZ2V0VGVzdFNoYXJkIjsKLSAgICAgICAgU2V0PFN0cmluZz4gYWJpcyA9IEFiaVV0aWxzLmdldEFiaXNGb3JBcmNoKFRlc3RTdWl0ZUluZm8uZ2V0SW5zdGFuY2UoKS5nZXRUYXJnZXRBcmNoKCkpOwotICAgICAgICBJdGVyYXRvcjxTdHJpbmc+IGl0ZSA9IGFiaXMuaXRlcmF0b3IoKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGFiaTEgPSBpdGUubmV4dCgpOwotICAgICAgICBmaW5hbCBTdHJpbmcgYWJpMiA9IGl0ZS5uZXh0KCk7Ci0gICAgICAgIGNyZWF0ZUNvbmZpZyhtVGVzdERpciwgbW9kdWxlTmFtZSwgVEVTVF9TVFVCX1NIQVJEQUJMRSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBFYXN5TW9jay5leHBlY3QobU1vY2tEZXZpY2UuZ2V0UHJvcGVydHkoInJvLnByb2R1Y3QuY3B1LmFiaWxpc3QiKSkuYW5kUmV0dXJuKAotICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIiVzLCVzIiwgYWJpMSwgYWJpMikpOwotCi0gICAgICAgIFN0cmluZyBleHBlY3RlZEFkZCA9IEFiaVV0aWxzLmNyZWF0ZUlkKGFiaTEsIG1vZHVsZU5hbWUpICsgIiwiCi0gICAgICAgICAgICAgICAgKyBBYmlVdGlscy5jcmVhdGVJZChhYmkyLCBtb2R1bGVOYW1lKTsKLSAgICAgICAgbU1vY2tCdWlsZEluZm8uYWRkQnVpbGRBdHRyaWJ1dGUoRWFzeU1vY2suZXEoQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyLk1PRFVMRV9JRFMpLAotICAgICAgICAgICAgICAgIEVhc3lNb2NrLmFueU9iamVjdCgpKTsKLSAgICAgICAgRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKTsKLSAgICAgICAgbUF0dHJpYnV0ZXMucHV0KENvbXBhdGliaWxpdHlCdWlsZEhlbHBlci5NT0RVTEVfSURTLCBleHBlY3RlZEFkZCk7Ci0KLSAgICAgICAgRWFzeU1vY2sucmVwbGF5KG1Nb2NrRGV2aWNlLCBtTW9ja0J1aWxkSW5mbyk7Ci0KLSAgICAgICAgTGlzdDxJUmVtb3RlVGVzdD4gdGVzdHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgdGVzdHMuYWRkKG1UZXN0LmdldFRlc3RTaGFyZCgzLCAwKSk7Ci0gICAgICAgIC8vIFdlIGFyZSBvbmx5IHJ1bm5pbmcgb25lIG9mIHRoZSBzaGFyZHMgc2luY2UgdGhleSBzaG91bGQgYmUgaW5kZXBlbmRlbnQuCi0gICAgICAgIGFzc2VydEVxdWFscygxLCB0ZXN0cy5zaXplKCkpOwotCi0gICAgICAgICgoSUJ1aWxkUmVjZWl2ZXIpdGVzdHMuZ2V0KDApKS5zZXRCdWlsZChtTW9ja0J1aWxkSW5mbyk7Ci0gICAgICAgICgoSURldmljZVRlc3QpdGVzdHMuZ2V0KDApKS5zZXREZXZpY2UobU1vY2tEZXZpY2UpOwotICAgICAgICAoKElJbnZvY2F0aW9uQ29udGV4dFJlY2VpdmVyKXRlc3RzLmdldCgwKSkuc2V0SW52b2NhdGlvbkNvbnRleHQobUNvbnRleHQpOwotICAgICAgICBtUmVwb3J0ZXIuaW52b2NhdGlvblN0YXJ0ZWQobUNvbnRleHQpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdGVzdHMuZ2V0KDApLnJ1bihtUmVwb3J0ZXIpOwotICAgICAgICB9IGNhdGNoIChEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBtUmVwb3J0ZXIuaW52b2NhdGlvbkVuZGVkKDUwMCk7Ci0gICAgICAgIH0KLSAgICAgICAgRWFzeU1vY2sudmVyaWZ5KG1Nb2NrRGV2aWNlLCBtTW9ja0J1aWxkSW5mbyk7Ci0KLSAgICAgICAgSUludm9jYXRpb25SZXN1bHQgcmVzdWx0ID0gbVJlcG9ydGVyLmdldFJlc3VsdCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcmVzdWx0LmNvdW50UmVzdWx0cyhUZXN0U3RhdHVzLlBBU1MpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHJlc3VsdC5jb3VudFJlc3VsdHMoVGVzdFN0YXR1cy5GQUlMKSk7Ci0gICAgICAgIC8vIEZJWE1FOiBPbmx5IG9uZSBtb2R1bGUgc2hvdWxkIGJlIGV4cGVjdGVkIHNpbmNlIHdpdGhpbiB0aGUgb25lIHNoYXJkIHJlcXVlc3RlZCB0byBydW4KLSAgICAgICAgLy8gb25seSBvbmUgbW9kdWxlIGV4aXN0ZWQuCi0gICAgICAgIGFzc2VydEVxdWFscygyLCByZXN1bHQuZ2V0TW9kdWxlcygpLnNpemUoKSk7Ci0gICAgICAgIC8vIEZJWE1FOiBUaGUgbW9kdWxlIGZvciB0aGUgc2hhcmQgc2hvdWxkIGJlIGNvbXBsZXRlZCBzaW5jZSBhbGwgdGVzdHMgcnVuLgotICAgICAgICAvLyBUZXN0UnVuSGFuZGxlciBpbiB0aGlzIGNhc2UgY3JlYXRlIGFuIGV4cGVjdGF0aW9uIG9mIDMgdGVzdFJ1blN0YXJ0ZWQganVzdCBiZWNhdXNlIG9mCi0gICAgICAgIC8vIHRoZSBudW1iZXIgb2Ygc2hhcmRzLgotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcmVzdWx0LmdldE1vZHVsZUNvbXBsZXRlQ291bnQoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvcHJlc3VibWl0L1ByZXN1Ym1pdFNldHVwVmFsaWRhdGlvbi5qYXZhIGIvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvcHJlc3VibWl0L1ByZXN1Ym1pdFNldHVwVmFsaWRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWI0OGZjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3ByZXN1Ym1pdC9QcmVzdWJtaXRTZXR1cFZhbGlkYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC5wcmVzdWJtaXQ7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5jb25maWcuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5jb25maWcuQ29uZmlndXJhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuY29uZmlnLklDb25maWd1cmF0aW9uRmFjdG9yeTsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5sb2cuTG9nVXRpbC5DTG9nOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0vKioKLSAqIFRlc3RzIHRoYXQgdmFsaWRhdGUgdGhlIENUUyBwcmVzdWJtaXQgc2V0dXAgdG8gZW5zdXJlIG5vIENMIHdpbGwgYnJlYWsgdGhlIHByZXN1Ym1pdCBzZXR1cAotICogaXRzZWxmLgotICovCi1wdWJsaWMgY2xhc3MgUHJlc3VibWl0U2V0dXBWYWxpZGF0aW9uIGV4dGVuZHMgVGVzdENhc2UgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVTVUJNSVRfQ1RTX1VOSVRfVEVTVFMgPSAiY3RzLXVuaXQtdGVzdHMiOwotCi0gICAgLyoqCi0gICAgICogVGVzdCB0aGF0IHRoZSBiYXNlIGN0cyB1bml0IHRlc3RzIGNvbmZpZ3VyYXRpb24gaXMgc3RpbGwgd29ya2luZywgYW5kIGhhcyBhIHJlcG9ydGVyCi0gICAgICogdGVtcGxhdGUgcGxhY2Vob2xkZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEN0c1ByZXN1Ym1pdF91bml0X3Rlc3RzKCkgewotICAgICAgICBJQ29uZmlndXJhdGlvbkZhY3RvcnkgZmFjdG9yeSA9IENvbmZpZ3VyYXRpb25GYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZ1tdIHByZXN1Ym1pdENvbW1hbmQgPSB7UFJFU1VCTUlUX0NUU19VTklUX1RFU1RTLCAiLS10ZW1wbGF0ZTptYXAiLCAicmVwb3J0ZXJzPWVtcHR5In07Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmYWN0b3J5LmNyZWF0ZUNvbmZpZ3VyYXRpb25Gcm9tQXJncyhwcmVzdWJtaXRDb21tYW5kKTsKLSAgICAgICAgfSBjYXRjaCAoQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBDTG9nLmUoZSk7Ci0gICAgICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoIkNvbmZpZ0V4Y2VwdGlvbiAnJXMnOiBPbmUgb2YgeW91ciBjaGFuZ2UgaXMgYnJlYWtpbmcgdGhlIHByZXN1Ym1pdCAiCi0gICAgICAgICAgICAgICAgICAgICsgIkNUUyB1bml0IHRlc3RzIGNvbmZpZ3VyYXRpb24uIiwgZS5nZXRNZXNzYWdlKCkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgdG8gZW5zdXJlIHRoYXQgWmlwIGRlcGVuZGVuY3kgb24gdGhlIEFwYWNoZSBDb21tb25zIENvbXByZXNzIGNvbWluZyBmcm9tIFRyYWRlRmVkIGlzCi0gICAgICogcHJvcGVybHkgc2V0dXAuIFRoaXMgZGVwZW5kZW5jeSBpcyByZXF1aXJlZCBmb3Igc29tZSB1dGlsaXRpZXMgb2YgVHJhZGVGZWQgdG8gd29yay4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGVwZW5kZW5jeUNvbW1vbnNDb21wcmVzcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIgPSBDbGFzc0xvYWRlci5nZXRTeXN0ZW1DbGFzc0xvYWRlcigpOwotICAgICAgICAvLyBUaGlzIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGRlcGVuZGVuY3kgaXNuJ3QgbWV0LgotICAgICAgICBsb2FkZXIubG9hZENsYXNzKCJvcmcuYXBhY2hlLmNvbW1vbnMuY29tcHJlc3MuYXJjaGl2ZXJzLnppcC5aaXBGaWxlIik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvcHJlc3VibWl0L1ZhbGlkYXRlVGVzdHNBYmkuamF2YSBiL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3ByZXN1Ym1pdC9WYWxpZGF0ZVRlc3RzQWJpLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5N2NjZmMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvcHJlc3VibWl0L1ZhbGlkYXRlVGVzdHNBYmkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQucHJlc3VibWl0OwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLnN1aXRlLlRlc3RTdWl0ZUluZm87Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudXRpbC5BYXB0UGFyc2VyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnV0aWwuQWJpVXRpbHM7Ci0KLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLWltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuSlVuaXQ0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZW5hbWVGaWx0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogVGVzdHMgdG8gdmFsaWRhdGUgdGhhdCB0aGUgYnVpbGQgaXMgY29udGFpbmluZyB1c2FibGUgdGVzdCBhcnRpZmFjdC4KLSAqLwotQFJ1bldpdGgoSlVuaXQ0LmNsYXNzKQotcHVibGljIGNsYXNzIFZhbGlkYXRlVGVzdHNBYmkgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gTU9EVUxFX0VYQ0VQVElPTlMgPSBuZXcgSGFzaFNldDw+KCk7Ci0gICAgc3RhdGljIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqICBUaGlzIHBhcnRpY3VsYXIgbW9kdWxlIGlzIHNoaXBwaW5nIGFsbCBpdCdzIGRlcGVuZGVuY2llcyBpbiBhbGwgYWJpcyB3aXRoIHByZWJ1aWx0IHN0dWZmLgotICAgICAgICAgKiAgRXhjbHVkaW5nIGl0IGZvciBub3cgdG8gaGF2ZSB0aGUgdGVzdCBzZXR1cC4KLSAgICAgICAgICovCi0gICAgICAgIE1PRFVMRV9FWENFUFRJT05TLmFkZCgiQ3RzU3BsaXRBcHAiKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogIFRoaXMgbW9kdWxlIHRlc3RzIGZvciBzZWN1cml0eSB2dWxuZXJhYmlsaXRpZXMgd2hlbiBpbnN0YWxsaW5nIGF0dGFja2VyLWRldmlzZWQgQVBLcy4KLSAgICAgICAgICovCi0gICAgICAgIE1PRFVMRV9FWENFUFRJT05TLmFkZCgiQ3RzQ29ycnVwdEFwa1Rlc3RzIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gQklOQVJZX0VYQ0VQVElPTlMgPSBuZXcgSGFzaFNldDw+KCk7Ci0gICAgc3RhdGljIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoaXMgYmluYXJ5IGlzIGEgaG9zdCBzaWRlIGhlbHBlciwgc28gd2UgZG8gbm90IG5lZWQgdG8gY2hlY2sgaXQuCi0gICAgICAgICAqLwotICAgICAgICBCSU5BUllfRVhDRVBUSU9OUy5hZGQoInNlcG9saWN5LWFuYWx5emUiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHRoYXQgYWxsIGFwa3MgaGF2ZSB0aGUgc2FtZSBzdXBwb3J0ZWQgYWJpcy4KLSAgICAgKiBTb21ldGltZXMsIGlmIGEgbW9kdWxlIGlzIG1pc3NpbmcgTE9DQUxfTVVMVElMSUIgOj0gYm90aCwgd2Ugd2lsbCBlbmQgdXAgd2l0aCBvbmx5IG9uZSBvZgotICAgICAqIHRoZSB0d28gYWJpcyByZXF1aXJlZCBhbmQgdGhlIHNlY29uZCBvbmUgd2lsbCBmYWlsLgotICAgICAqLwotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEFwa3NBYmlzKCkgewotICAgICAgICBTdHJpbmcgY3RzUm9vdCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiQ1RTX1JPT1QiKTsKLSAgICAgICAgRmlsZSB0ZXN0Y2FzZXMgPSBuZXcgRmlsZShjdHNSb290LCAiL2FuZHJvaWQtY3RzL3Rlc3RjYXNlcy8iKTsKLSAgICAgICAgaWYgKCF0ZXN0Y2FzZXMuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiJXMgZG9lcyBub3QgZXhpc3RzIiwgdGVzdGNhc2VzKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgRmlsZVtdIGxpc3RBcGtzID0gdGVzdGNhc2VzLmxpc3RGaWxlcyhuZXcgRmlsZW5hbWVGaWx0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGRpciwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBtb2R1bGUgOiBNT0RVTEVfRVhDRVBUSU9OUykgewotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKG1vZHVsZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBuYW1lLmVuZHNXaXRoKCIuYXBrIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBhc3NlcnRUcnVlKGxpc3RBcGtzLmxlbmd0aCA+IDApOwotICAgICAgICBpbnQgbWF4QWJpID0gMDsKLSAgICAgICAgTWFwPFN0cmluZywgSW50ZWdlcj4gYXBrVG9BYmkgPSBuZXcgSGFzaE1hcDw+KCk7Ci0KLSAgICAgICAgZm9yIChGaWxlIHRlc3RBcGsgOiBsaXN0QXBrcykgewotICAgICAgICAgICAgQWFwdFBhcnNlciByZXN1bHQgPSBBYXB0UGFyc2VyLnBhcnNlKHRlc3RBcGspOwotICAgICAgICAgICAgLy8gUmV0cnkgYXMgd2UgaGF2ZSBzZWVuIGZsYWtlIHdpdGggYWFwdCBzb21ldGltZXMuCi0gICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBBYXB0UGFyc2VyLnBhcnNlKHRlc3RBcGspOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIElmIHN0aWxsIGNvdWxkbid0IHBhcnNlIHRoZSBhcGsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCJGYWlsIHRvIHJ1biAnYWFwdCBkdW1wIGJhZGdpbmcgJXMnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0QXBrLmdldEFic29sdXRlUGF0aCgpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gV2Ugb25seSBjaGVjayB0aGUgYXBrIHRoYXQgaGF2ZSBuYXRpdmUgY29kZQotICAgICAgICAgICAgaWYgKCFyZXN1bHQuZ2V0TmF0aXZlQ29kZSgpLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBzdXBwb3J0ZWRBYmlBcGsgPSByZXN1bHQuZ2V0TmF0aXZlQ29kZSgpOwotICAgICAgICAgICAgICAgIFNldDxTdHJpbmc+IGJ1aWxkVGFyZ2V0ID0gQWJpVXRpbHMuZ2V0QWJpc0ZvckFyY2goCi0gICAgICAgICAgICAgICAgICAgICAgICBUZXN0U3VpdGVJbmZvLmdldEluc3RhbmNlKCkuZ2V0VGFyZ2V0QXJjaCgpKTsKLSAgICAgICAgICAgICAgICAvLyBmaXJzdCBjaGVjaywgYWxsIHRoZSBhYmlzIGFyZSBzdXBwb3J0ZWQKLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBhYmkgOiBzdXBwb3J0ZWRBYmlBcGspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFidWlsZFRhcmdldC5jb250YWlucyhhYmkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoImFwayAlcyAlcyBkb2VzIG5vdCBzdXBwb3J0IG91ciBhYmlzIFslc10iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0QXBrLmdldE5hbWUoKSwgc3VwcG9ydGVkQWJpQXBrLCBidWlsZFRhcmdldCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGFwa1RvQWJpLnB1dCh0ZXN0QXBrLmdldE5hbWUoKSwgc3VwcG9ydGVkQWJpQXBrLnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgbWF4QWJpID0gTWF0aC5tYXgobWF4QWJpLCBzdXBwb3J0ZWRBYmlBcGsuc2l6ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFdlIGRvIGEgc2Vjb25kIHBhc3MgdG8gbWFrZSBzdXJlIG5vYm9keSBpcyBzaG9ydCBvbiBhYmkKLSAgICAgICAgZm9yIChFbnRyeTxTdHJpbmcsIEludGVnZXI+IGFwayA6IGFwa1RvQWJpLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgIGlmIChhcGsuZ2V0VmFsdWUoKSA8IG1heEFiaSkgewotICAgICAgICAgICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiYXBrICVzIG9ubHkgaGFzICVzIGFiaSB3aGVuIGl0IHNob3VsZCBoYXZlICVzIiwgYXBrLmdldEtleSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgYXBrLmdldFZhbHVlKCksIG1heEFiaSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCB0aGF0IHdoZW4gQ1RTIGhhcyBtdWx0aXBsZSBhYmlzLCB3ZSBoYXZlIGJpbmFyeSBmb3IgZWFjaCBBQkkuIEluIHRoaXMgY2FzZSB0aGUgYWJpIHdpbGwKLSAgICAgKiBiZSB0aGUgc2FtZSB3aXRoIGRpZmZlcmVudCBiaXRuZXNzIChvbmx5IGNhc2Ugc3VwcG9ydGVkIGJ5IGJ1aWxkIHN5c3RlbSkuCi0gICAgICogPHAvPgotICAgICAqIElmIHRoZXJlIGlzIG9ubHkgb25lIGJpdG5lc3MsIHRoZW4gd2UgY2hlY2sgdGhhdCBpdCdzIHRoZSByaWdodCBvbmUuCi0gICAgICovCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QmluYXJpZXNBYmlzKCkgewotICAgICAgICBTdHJpbmcgY3RzUm9vdCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiQ1RTX1JPT1QiKTsKLSAgICAgICAgRmlsZSB0ZXN0Y2FzZXMgPSBuZXcgRmlsZShjdHNSb290LCAiL2FuZHJvaWQtY3RzL3Rlc3RjYXNlcy8iKTsKLSAgICAgICAgaWYgKCF0ZXN0Y2FzZXMuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiJXMgZG9lcyBub3QgZXhpc3QiLCB0ZXN0Y2FzZXMpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmdbXSBsaXN0QmluYXJpZXMgPSB0ZXN0Y2FzZXMubGlzdChuZXcgRmlsZW5hbWVGaWx0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGRpciwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgICAgICAgICBpZiAobmFtZS5jb250YWlucygiLiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKEJJTkFSWV9FWENFUFRJT05TLmNvbnRhaW5zKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoZGlyLCBuYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFmaWxlLmNhbkV4ZWN1dGUoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShsaXN0QmluYXJpZXMubGVuZ3RoID4gMCk7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBvcmRlcmVkTGlzdCA9IEFycmF5cy5hc0xpc3QobGlzdEJpbmFyaWVzKTsKLSAgICAgICAgLy8gd2Ugc29ydCB0byBoYXZlIGJpbmFyeSBzdGFydGluZyB3aXRoIHNhbWUgbmFtZSwgbmV4dCB0byBlYWNoIG90aGVyLiBUaGUgbGFzdCB0d28KLSAgICAgICAgLy8gY2hhcmFjdGVycyBvZiB0aGVpciBuYW1lIHdpdGggYmUgdGhlIGJpdG5lc3MgKDMyIG9yIDY0KS4KLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydChvcmRlcmVkTGlzdCk7Ci0gICAgICAgIFNldDxTdHJpbmc+IGJ1aWxkVGFyZ2V0ID0gQWJpVXRpbHMuZ2V0QWJpc0ZvckFyY2goCi0gICAgICAgICAgICAgICAgVGVzdFN1aXRlSW5mby5nZXRJbnN0YW5jZSgpLmdldFRhcmdldEFyY2goKSk7Ci0gICAgICAgIC8vIFdlIGV4cGVjdCBvbmUgYmluYXJ5IHBlciBhYmkgb2YgQ1RTLCB0aGV5IHNob3VsZCBiZSBhcHBlbmRlZCB3aXRoIDMyIG9yIDY0Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb3JkZXJlZExpc3Quc2l6ZSgpOyBpPWkgKyBidWlsZFRhcmdldC5zaXplKCkpIHsKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBzdWJTZXQgPSBvcmRlcmVkTGlzdC5zdWJMaXN0KGksIGkgKyBidWlsZFRhcmdldC5zaXplKCkpOwotICAgICAgICAgICAgaWYgKHN1YlNldC5zaXplKCkgPiAxKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGJhc2UgPSBzdWJTZXQuZ2V0KDApLnN1YnN0cmluZygwLCBzdWJTZXQuZ2V0KDApLmxlbmd0aCgpIC0gMik7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzdWJTZXQuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJhc2UsIHN1YlNldC5nZXQoaikuc3Vic3RyaW5nKDAsIHN1YlNldC5nZXQoaikubGVuZ3RoKCkgLSAyKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYml0bmVzcyA9IEFiaVV0aWxzLmdldEJpdG5lc3MoYnVpbGRUYXJnZXQuaXRlcmF0b3IoKS5uZXh0KCkpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoc3ViU2V0LmdldChpKS5lbmRzV2l0aChiaXRuZXNzKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC9yZXN1bHQvQ2hlY2tzdW1SZXBvcnRlclRlc3QuamF2YSBiL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3Jlc3VsdC9DaGVja3N1bVJlcG9ydGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2ZjYjlhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3Jlc3VsdC9DaGVja3N1bVJlcG9ydGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC5yZXN1bHQ7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC5idWlsZC5Db21wYXRpYmlsaXR5QnVpbGRQcm92aWRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNoZWNrc3VtUmVwb3J0ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DaGVja3N1bVJlcG9ydGVyLkNoZWNrc3VtVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLklDYXNlUmVzdWx0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuSUludm9jYXRpb25SZXN1bHQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5JTW9kdWxlUmVzdWx0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuSVRlc3RSZXN1bHQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5SZXBvcnRMb2c7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5UZXN0U3RhdHVzOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmJ1aWxkLklCdWlsZEluZm87Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuY29uZmlnLk9wdGlvblNldHRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5pbnZva2VyLklJbnZvY2F0aW9uQ29udGV4dDsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5pbnZva2VyLkludm9jYXRpb25Db250ZXh0OwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnV0aWwuRmlsZVV0aWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLS8qKgotICogVW5pdCB0ZXN0cyBmb3Ige0BsaW5rIENoZWNrc3VtUmVwb3J0ZXJ9Ci0gKi8KLXB1YmxpYyBjbGFzcyBDaGVja3N1bVJlcG9ydGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBST09UX1BST1BFUlRZID0gIlRFU1RTX1JPT1QiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBST09UX0RJUl9OQU1FID0gInJvb3QiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVUlURV9OQU1FID0gIlRFU1RTIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVJTERfTlVNQkVSID0gIjIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVUlURV9QTEFOID0gImN0cyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0VfRElSX05BTUUgPSAiYW5kcm9pZC10ZXN0cyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RDQVNFUyA9ICJ0ZXN0Y2FzZXMiOwotCi0gICAgcHJpdmF0ZSBDaGVja3N1bVJlcG9ydGVyIG1SZXBvcnRlcjsKLSAgICBwcml2YXRlIEZpbGUgbVJvb3QgPSBudWxsOwotICAgIHByaXZhdGUgSUJ1aWxkSW5mbyBtQnVpbGRJbmZvOwotICAgIHByaXZhdGUgUmVwb3J0TG9nIG1SZXBvcnRMb2cgPSBudWxsOwotICAgIHByaXZhdGUgSUludm9jYXRpb25SZXN1bHQgbUludm9jYXRpb25SZXN1bHQ7Ci0gICAgcHJpdmF0ZSBJTW9kdWxlUmVzdWx0IG1Nb2R1bGVSZXN1bHQ7Ci0gICAgcHJpdmF0ZSBJVGVzdFJlc3VsdCBtRmFpbGVkVGVzdDsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1SZXBvcnRlciA9IG5ldyBDaGVja3N1bVJlcG9ydGVyKDEwMCwgLjAwMSwgKHNob3J0KTEpOwotICAgICAgICBtUm9vdCA9IEZpbGVVdGlsLmNyZWF0ZVRlbXBEaXIoUk9PVF9ESVJfTkFNRSk7Ci0gICAgICAgIEZpbGUgYmFzZURpciA9IG5ldyBGaWxlKG1Sb290LCBCQVNFX0RJUl9OQU1FKTsKLSAgICAgICAgYmFzZURpci5ta2RpcnMoKTsKLSAgICAgICAgRmlsZSB0ZXN0RGlyID0gbmV3IEZpbGUoYmFzZURpciwgVEVTVENBU0VTKTsKLSAgICAgICAgdGVzdERpci5ta2RpcnMoKTsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KFJPT1RfUFJPUEVSVFksIG1Sb290LmdldEFic29sdXRlUGF0aCgpKTsKLQotICAgICAgICBSZXN1bHRSZXBvcnRlciByZXN1bHRSZXBvcnRlciA9IG5ldyBSZXN1bHRSZXBvcnRlcigpOwotICAgICAgICBDb21wYXRpYmlsaXR5QnVpbGRQcm92aWRlciBwcm92aWRlciA9IG5ldyBDb21wYXRpYmlsaXR5QnVpbGRQcm92aWRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRTdWl0ZUluZm9OYW1lKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBTVUlURV9OQU1FOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFN1aXRlSW5mb0J1aWxkTnVtYmVyKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBCVUlMRF9OVU1CRVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0U3VpdGVJbmZvVmVyc2lvbigpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQlVJTERfTlVNQkVSOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBPcHRpb25TZXR0ZXIgc2V0dGVyID0gbmV3IE9wdGlvblNldHRlcihwcm92aWRlcik7Ci0gICAgICAgIHNldHRlci5zZXRPcHRpb25WYWx1ZSgicGxhbiIsIFNVSVRFX1BMQU4pOwotICAgICAgICBzZXR0ZXIuc2V0T3B0aW9uVmFsdWUoImR5bmFtaWMtY29uZmlnLXVybCIsICIiKTsKLSAgICAgICAgbUJ1aWxkSW5mbyA9IHByb3ZpZGVyLmdldEJ1aWxkKCk7Ci0gICAgICAgIElJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0ID0gbmV3IEludm9jYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIGNvbnRleHQuYWRkRGV2aWNlQnVpbGRJbmZvKCJmYWtlRGV2aWNlIiwgbUJ1aWxkSW5mbyk7Ci0KLSAgICAgICAgcmVzdWx0UmVwb3J0ZXIuaW52b2NhdGlvblN0YXJ0ZWQoY29udGV4dCk7Ci0gICAgICAgIG1JbnZvY2F0aW9uUmVzdWx0ID0gcmVzdWx0UmVwb3J0ZXIuZ2V0UmVzdWx0KCk7Ci0gICAgICAgIG1Nb2R1bGVSZXN1bHQgPSBtSW52b2NhdGlvblJlc3VsdC5nZXRPckNyZWF0ZU1vZHVsZSgiTW9kdWxlLTEiKTsKLSAgICAgICAgbU1vZHVsZVJlc3VsdC5zZXREb25lKHRydWUpOwotICAgICAgICBJQ2FzZVJlc3VsdCBjYXNlUmVzdWx0ID0gbU1vZHVsZVJlc3VsdC5nZXRPckNyZWF0ZVJlc3VsdCgiQ2FzZS0xIik7Ci0gICAgICAgIElUZXN0UmVzdWx0IHRlc3QxID0gY2FzZVJlc3VsdC5nZXRPckNyZWF0ZVJlc3VsdCgiVGVzdDEiKTsKLSAgICAgICAgdGVzdDEucGFzc2VkKG1SZXBvcnRMb2cpOwotICAgICAgICBtRmFpbGVkVGVzdCA9IGNhc2VSZXN1bHQuZ2V0T3JDcmVhdGVSZXN1bHQoIlRlc3QyIik7Ci0gICAgICAgIG1GYWlsZWRUZXN0LmZhaWxlZCgic3RhY2stdHJhY2UgLSBlcnJvciBoYXBwZW5lZCIpOwotCi0gICAgICAgIElNb2R1bGVSZXN1bHQgbW9kdWxlUmVzdWx0MiA9IG1JbnZvY2F0aW9uUmVzdWx0LmdldE9yQ3JlYXRlTW9kdWxlKCJNb2R1bGUtMiIpOwotICAgICAgICBJQ2FzZVJlc3VsdCBjYXNlUmVzdWx0MiA9IG1vZHVsZVJlc3VsdDIuZ2V0T3JDcmVhdGVSZXN1bHQoIkNhc2UtMiIpOwotICAgICAgICBtTW9kdWxlUmVzdWx0LnNldERvbmUoZmFsc2UpOwotICAgICAgICBJVGVzdFJlc3VsdCB0ZXN0MyA9IGNhc2VSZXN1bHQyLmdldE9yQ3JlYXRlUmVzdWx0KCJUZXN0MyIpOwotICAgICAgICB0ZXN0My5wYXNzZWQobVJlcG9ydExvZyk7Ci0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtUmVwb3J0ZXIgPSBudWxsOwotICAgICAgICBGaWxlVXRpbC5yZWN1cnNpdmVEZWxldGUobVJvb3QpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdG9yZUFuZFJldHJpZXZlVGVzdFJlc3VsdHMoKSB7Ci0gICAgICAgIG1SZXBvcnRlci5hZGRJbnZvY2F0aW9uKG1JbnZvY2F0aW9uUmVzdWx0KTsKLSAgICAgICAgVmVyaWZ5SW52b2NhdGlvblJlc3VsdHMobUludm9jYXRpb25SZXN1bHQsIG1SZXBvcnRlcik7Ci0gICAgfQotCi0gICAgLyoqKgotICAgICAqIEJ5IGRlZmluaXRpb24gdGhpcyB0ZXN0IGlzIGZsYWt5IHNpbmNlIHRoZSBjaGVja3N1bSBoYXMgYSBmYWxzZSBwb3NpdGl2ZSBwcm9iYWJpbGl0eSBvZiAuMSUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZENoZWNrc3VtcygpIHsKLSAgICAgICAgbVJlcG9ydGVyLmFkZEludm9jYXRpb24obUludm9jYXRpb25SZXN1bHQpOwotICAgICAgICBJTW9kdWxlUmVzdWx0IG1vZHVsZSA9IG1JbnZvY2F0aW9uUmVzdWx0LmdldE1vZHVsZXMoKS5nZXQoMSk7Ci0gICAgICAgIG1vZHVsZS5zZXREb25lKCFtb2R1bGUuaXNEb25lKCkpOwotICAgICAgICBTdHJpbmcgZmluZ2VycHJpbnQgPSBtSW52b2NhdGlvblJlc3VsdC5nZXRCdWlsZEZpbmdlcnByaW50KCk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJDaGVja3N1bSBzaG91bGQgY29udGFpbiBtb2R1bGU6ICIgKyBtb2R1bGUuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgIG1SZXBvcnRlci5jb250YWluc01vZHVsZVJlc3VsdChtb2R1bGUsIGZpbmdlcnByaW50KSk7Ci0KLSAgICAgICAgbUZhaWxlZFRlc3Quc2V0UmVzdWx0U3RhdHVzKFRlc3RTdGF0dXMuUEFTUyk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJDaGVja3N1bSBzaG91bGQgbm90IGNvbnRhaW4gdGVzdDogIiArIG1GYWlsZWRUZXN0LmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICBtUmVwb3J0ZXIuY29udGFpbnNUZXN0UmVzdWx0KG1GYWlsZWRUZXN0LCBtTW9kdWxlUmVzdWx0LCBmaW5nZXJwcmludCkpOwotICAgICAgICBhc3NlcnRGYWxzZSgiTW9kdWxlIGNoZWNrc3VtIHNob3VsZCB2ZXJpZnkgbnVtYmVyIG9mIHRlc3RzIiwKLSAgICAgICAgICAgICAgICBtUmVwb3J0ZXIuY29udGFpbnNNb2R1bGVSZXN1bHQobU1vZHVsZVJlc3VsdCwgZmluZ2VycHJpbnQpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZVNlcmlhbGl6YXRpb24oKSB0aHJvd3MgSU9FeGNlcHRpb24sIENoZWNrc3VtVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIG1SZXBvcnRlci5hZGRJbnZvY2F0aW9uKG1JbnZvY2F0aW9uUmVzdWx0KTsKLQotICAgICAgICBGaWxlIGZpbGUxID0gbmV3IEZpbGUobVJvb3QsICJmaWxlMS50eHQiKTsKLSAgICAgICAgdHJ5IChGaWxlV3JpdGVyIGZpbGVXcml0ZXIgPSBuZXcgRmlsZVdyaXRlcihmaWxlMSwgZmFsc2UpKSB7Ci0gICAgICAgICAgICBmaWxlV3JpdGVyLmFwcGVuZCgiVGhpcyBpcyBhIHRlc3QgZmlsZSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbVJlcG9ydGVyLmFkZERpcmVjdG9yeShtUm9vdCk7Ci0gICAgICAgIG1SZXBvcnRlci5zYXZlVG9GaWxlKG1Sb290KTsKLQotICAgICAgICBDaGVja3N1bVJlcG9ydGVyIHN0b3JlZENoZWNrc3VtID0gQ2hlY2tzdW1SZXBvcnRlci5sb2FkKG1Sb290KTsKLSAgICAgICAgVmVyaWZ5SW52b2NhdGlvblJlc3VsdHMobUludm9jYXRpb25SZXN1bHQsIHN0b3JlZENoZWNrc3VtKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiU2VyaWFsaXppbmcgY2hlY2tzdW0gbWFpbnRhaW5zIGZpbGUgaGFzaCIsCi0gICAgICAgICAgICAgICAgc3RvcmVkQ2hlY2tzdW0uY29udGFpbnNGaWxlKGZpbGUxLCBtUm9vdC5nZXROYW1lKCkpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZUNSQ09wZXJhdGlvbnMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBGaWxlIHN1YkRpcmVjdG9yeSA9IG5ldyBGaWxlKG1Sb290LCAiY2hpbGQiKTsKLSAgICAgICAgc3ViRGlyZWN0b3J5Lm1rZGlyKCk7Ci0gICAgICAgIEZpbGUgZmlsZTEgPSBuZXcgRmlsZShtUm9vdCwgImZpbGUxLnR4dCIpOwotICAgICAgICB0cnkgKEZpbGVXcml0ZXIgZmlsZVdyaXRlciA9IG5ldyBGaWxlV3JpdGVyKGZpbGUxLCBmYWxzZSkpIHsKLSAgICAgICAgICAgIGZpbGVXcml0ZXIuYXBwZW5kKCJUaGlzIGlzIGEgdGVzdCBmaWxlIik7Ci0gICAgICAgIH0KLQotICAgICAgICBGaWxlIGZpbGUyID0gbmV3IEZpbGUoc3ViRGlyZWN0b3J5LCAiZmlsZTIudHh0Iik7Ci0gICAgICAgIHRyeSAoRmlsZVdyaXRlciBmaWxlV3JpdGVyID0gbmV3IEZpbGVXcml0ZXIoZmlsZTIsIGZhbHNlKSkgewotICAgICAgICAgICAgZmlsZVdyaXRlci5hcHBlbmQoIlRoaXMgaXMgYW5vdGhlciB0ZXN0IGZpbGUgd2l0aCBhIGRpZmZlcmVudCBjcmMiKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1SZXBvcnRlci5hZGREaXJlY3RvcnkobVJvb3QpOwotICAgICAgICBTdHJpbmcgZm9sZGVyTmFtZSA9IG1Sb290LmdldE5hbWUoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShtUmVwb3J0ZXIuY29udGFpbnNGaWxlKGZpbGUxLCBmb2xkZXJOYW1lKSk7Ci0gICAgICAgIGFzc2VydFRydWUobVJlcG9ydGVyLmNvbnRhaW5zRmlsZShmaWxlMiwgZm9sZGVyTmFtZSArICIvY2hpbGQiKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJTaG91bGQgbm90IGNvbnRhaW4gbm9uLWV4aXN0ZW50IGZpbGUiLAotICAgICAgICAgICAgICAgIG1SZXBvcnRlci5jb250YWluc0ZpbGUobmV3IEZpbGUobVJvb3QsICJmYWtlLnR4dCIpLCBmb2xkZXJOYW1lKSk7Ci0KLSAgICAgICAgRmlsZSBmaWxlMyA9IG5ldyBGaWxlKG1Sb290LCAiZmlsZTMudHh0Iik7Ci0gICAgICAgIHRyeSAoRmlsZVdyaXRlciBmaWxlV3JpdGVyID0gbmV3IEZpbGVXcml0ZXIoZmlsZTMsIGZhbHNlKSkgewotICAgICAgICAgICAgZmlsZVdyaXRlci5hcHBlbmQoIlRoaXMgaXMgYSB0ZXN0IGZpbGUgYWRkZWQgYWZ0ZXIgY3JjIGNhbGN1bGF0ZWQiKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRGYWxzZSgiU2hvdWxkIG5vdCBjb250YWluIGZpbGUgY3JlYXRlZCBhZnRlciBjcmMgY2FsY3VsYXRlZCIsCi0gICAgICAgICAgICAgICAgbVJlcG9ydGVyLmNvbnRhaW5zRmlsZShmaWxlMywgbVJvb3QgKyAiLyIpKTsKLQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBWZXJpZnlJbnZvY2F0aW9uUmVzdWx0cyhJSW52b2NhdGlvblJlc3VsdCBpbnZvY2F0aW9uLCBDaGVja3N1bVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0gICAgICAgIGZvciAoSU1vZHVsZVJlc3VsdCBtb2R1bGUgOiBpbnZvY2F0aW9uLmdldE1vZHVsZXMoKSkgewotICAgICAgICAgICAgU3RyaW5nIGJ1aWxkRmluZ2VycHJpbnQgPSBpbnZvY2F0aW9uLmdldEJ1aWxkRmluZ2VycHJpbnQoKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIkNoZWNrc3VtIHNob3VsZCBjb250YWluIG1vZHVsZTogIiArIG1vZHVsZS5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgIHJlcG9ydGVyLmNvbnRhaW5zTW9kdWxlUmVzdWx0KG1vZHVsZSwgYnVpbGRGaW5nZXJwcmludCkpOwotICAgICAgICAgICAgZm9yIChJQ2FzZVJlc3VsdCBjYXNlUmVzdWx0IDogbW9kdWxlLmdldFJlc3VsdHMoKSkgewotICAgICAgICAgICAgICAgIGZvciAoSVRlc3RSZXN1bHQgcmVzdWx0IDogY2FzZVJlc3VsdC5nZXRSZXN1bHRzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQ2hlY2tzdW0gc2hvdWxkIGNvbnRhaW4gdGVzdDogIiArIHJlc3VsdC5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZXIuY29udGFpbnNUZXN0UmVzdWx0KHJlc3VsdCwgbW9kdWxlLCBidWlsZEZpbmdlcnByaW50KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvcmVzdWx0L0NvbnNvbGVSZXBvcnRlclRlc3QuamF2YSBiL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3Jlc3VsdC9Db25zb2xlUmVwb3J0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMDJmMWEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvcmVzdWx0L0NvbnNvbGVSZXBvcnRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC5yZXN1bHQ7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIudGVzdHJ1bm5lci5UZXN0SWRlbnRpZmllcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5jb25maWcuT3B0aW9uU2V0dGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmludm9rZXIuSUludm9jYXRpb25Db250ZXh0OwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnV0aWwuQWJpVXRpbHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotLyoqCi0gKiBUZXN0cyBmb3Ige0BsaW5rIENvbnNvbGVSZXBvcnRlcn0uCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25zb2xlUmVwb3J0ZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAiTW9kdWxlTmFtZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUyID0gIk1vZHVsZU5hbWUyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJJID0gIm1pcHM2NCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gQWJpVXRpbHMuY3JlYXRlSWQoQUJJLCBOQU1FKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQyID0gQWJpVXRpbHMuY3JlYXRlSWQoQUJJLCBOQU1FMik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTID0gImFuZHJvaWQudGVzdC5Gb29yQmFyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EXzEgPSAidGVzdEJsYWgxIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EXzIgPSAidGVzdEJsYWgyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EXzMgPSAidGVzdEJsYWgzIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBQ0tfVFJBQ0UgPSAiU29tZXRoaW5nIHNtYWxsIGlzIG5vdCBhbHJpZ2h0XG4gIiArCi0gICAgICAgICAgICAiYXQgZm91ci5iaWcuaW5zZWN0cy5NYXJsZXkuc2luZyhNYXJsZXkuamF2YToxMCkiOwotCi0gICAgcHJpdmF0ZSBDb25zb2xlUmVwb3J0ZXIgbVJlcG9ydGVyOwotICAgIHByaXZhdGUgSUludm9jYXRpb25Db250ZXh0IG1Db250ZXh0OwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbVJlcG9ydGVyID0gbmV3IENvbnNvbGVSZXBvcnRlcigpOwotICAgICAgICBPcHRpb25TZXR0ZXIgc2V0dGVyID0gbmV3IE9wdGlvblNldHRlcihtUmVwb3J0ZXIpOwotICAgICAgICBzZXR0ZXIuc2V0T3B0aW9uVmFsdWUoInF1aWV0LW91dHB1dCIsICJ0cnVlIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbVJlcG9ydGVyID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzdWx0UmVwb3J0aW5nX3NpbmdsZU1vZHVsZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtUmVwb3J0ZXIuaW52b2NhdGlvblN0YXJ0ZWQobUNvbnRleHQpOwotICAgICAgICBtUmVwb3J0ZXIudGVzdFJ1blN0YXJ0ZWQoSUQsIDMpOwotICAgICAgICBydW5UZXN0cygpOwotCi0gICAgICAgIG1SZXBvcnRlci50ZXN0UnVuRW5kZWQoMTAsIG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpKTsKLSAgICAgICAgbVJlcG9ydGVyLmludm9jYXRpb25FbmRlZCgxMCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKElELCBtUmVwb3J0ZXIuZ2V0TW9kdWxlSWQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBtUmVwb3J0ZXIuZ2V0RmFpbGVkVGVzdHMoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBtUmVwb3J0ZXIuZ2V0UGFzc2VkVGVzdHMoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygzLCBtUmVwb3J0ZXIuZ2V0Q3VycmVudFRlc3ROdW0oKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygzLCBtUmVwb3J0ZXIuZ2V0VG90YWxUZXN0c0luTW9kdWxlKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXN1bHRSZXBvcnRpbmdfbXVsdGlwbGVNb2R1bGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1SZXBvcnRlci5pbnZvY2F0aW9uU3RhcnRlZChtQ29udGV4dCk7Ci0gICAgICAgIG1SZXBvcnRlci50ZXN0UnVuU3RhcnRlZChJRCwgMyk7Ci0gICAgICAgIHJ1blRlc3RzKCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKElELCBtUmVwb3J0ZXIuZ2V0TW9kdWxlSWQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBtUmVwb3J0ZXIuZ2V0RmFpbGVkVGVzdHMoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBtUmVwb3J0ZXIuZ2V0UGFzc2VkVGVzdHMoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygzLCBtUmVwb3J0ZXIuZ2V0Q3VycmVudFRlc3ROdW0oKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygzLCBtUmVwb3J0ZXIuZ2V0VG90YWxUZXN0c0luTW9kdWxlKCkpOwotCi0gICAgICAgIC8vIFNob3VsZCByZXNldCBjb3VudGVycwotICAgICAgICBtUmVwb3J0ZXIudGVzdFJ1blN0YXJ0ZWQoSUQyLCAzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKElEMiwgbVJlcG9ydGVyLmdldE1vZHVsZUlkKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVJlcG9ydGVyLmdldEZhaWxlZFRlc3RzKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVJlcG9ydGVyLmdldFBhc3NlZFRlc3RzKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVJlcG9ydGVyLmdldEN1cnJlbnRUZXN0TnVtKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMywgbVJlcG9ydGVyLmdldFRvdGFsVGVzdHNJbk1vZHVsZSgpKTsKLSAgICB9Ci0KLSAgICAvKiogUnVuIDQgdGVzdCwgYnV0IG9uZSBpcyBpZ25vcmVkICovCi0gICAgcHJpdmF0ZSB2b2lkIHJ1blRlc3RzKCkgewotICAgICAgICBUZXN0SWRlbnRpZmllciB0ZXN0MSA9IG5ldyBUZXN0SWRlbnRpZmllcihDTEFTUywgTUVUSE9EXzEpOwotICAgICAgICBtUmVwb3J0ZXIudGVzdFN0YXJ0ZWQodGVzdDEpOwotICAgICAgICBtUmVwb3J0ZXIudGVzdEVuZGVkKHRlc3QxLCBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKG1SZXBvcnRlci5nZXRUZXN0RmFpbGVkKCkpOwotCi0gICAgICAgIFRlc3RJZGVudGlmaWVyIHRlc3QyID0gbmV3IFRlc3RJZGVudGlmaWVyKENMQVNTLCBNRVRIT0RfMik7Ci0gICAgICAgIG1SZXBvcnRlci50ZXN0U3RhcnRlZCh0ZXN0Mik7Ci0gICAgICAgIGFzc2VydEZhbHNlKG1SZXBvcnRlci5nZXRUZXN0RmFpbGVkKCkpOwotICAgICAgICBtUmVwb3J0ZXIudGVzdEZhaWxlZCh0ZXN0MiwgU1RBQ0tfVFJBQ0UpOwotICAgICAgICBhc3NlcnRUcnVlKG1SZXBvcnRlci5nZXRUZXN0RmFpbGVkKCkpOwotCi0gICAgICAgIFRlc3RJZGVudGlmaWVyIHRlc3QzID0gbmV3IFRlc3RJZGVudGlmaWVyKENMQVNTLCBNRVRIT0RfMyk7Ci0gICAgICAgIG1SZXBvcnRlci50ZXN0U3RhcnRlZCh0ZXN0Myk7Ci0gICAgICAgIGFzc2VydEZhbHNlKG1SZXBvcnRlci5nZXRUZXN0RmFpbGVkKCkpOwotICAgICAgICBtUmVwb3J0ZXIudGVzdEZhaWxlZCh0ZXN0MywgU1RBQ0tfVFJBQ0UpOwotICAgICAgICBhc3NlcnRUcnVlKG1SZXBvcnRlci5nZXRUZXN0RmFpbGVkKCkpOwotCi0gICAgICAgIFRlc3RJZGVudGlmaWVyIHRlc3Q0ID0gbmV3IFRlc3RJZGVudGlmaWVyKENMQVNTLCBNRVRIT0RfMyk7Ci0gICAgICAgIG1SZXBvcnRlci50ZXN0U3RhcnRlZCh0ZXN0NCk7Ci0gICAgICAgIGFzc2VydEZhbHNlKG1SZXBvcnRlci5nZXRUZXN0RmFpbGVkKCkpOwotICAgICAgICBtUmVwb3J0ZXIudGVzdElnbm9yZWQodGVzdDQpOwotICAgICAgICBhc3NlcnRGYWxzZShtUmVwb3J0ZXIuZ2V0VGVzdEZhaWxlZCgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC9yZXN1bHQvTWV0YWRhdGFSZXBvcnRlclRlc3QuamF2YSBiL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3Jlc3VsdC9NZXRhZGF0YVJlcG9ydGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjgwZGVjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3Jlc3VsdC9NZXRhZGF0YVJlcG9ydGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnJlc3VsdDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLmJ1aWxkLkNvbXBhdGliaWxpdHlCdWlsZEhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkFiaVV0aWxzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi50ZXN0cnVubmVyLlRlc3RJZGVudGlmaWVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmJ1aWxkLkJ1aWxkSW5mbzsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5idWlsZC5JQnVpbGRJbmZvOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmNvbmZpZy5PcHRpb25TZXR0ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuaW52b2tlci5JSW52b2NhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuaW52b2tlci5JbnZvY2F0aW9uQ29udGV4dDsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC51dGlsLkZpbGVVdGlsOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnV0aWwuUnVuVXRpbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotLyoqCi0gKiBVbml0IFRlc3RzIGZvciB7QGxpbmsgTWV0YWRhdGFSZXBvcnRlcn0KLSAqLwotcHVibGljIGNsYXNzIE1ldGFkYXRhUmVwb3J0ZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTl9URVNUX0RVUkFUSU9OID0gIjEwIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVJTERfTlVNQkVSID0gIjIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBST09UX0RJUl9OQU1FID0gInJvb3QiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNFX0RJUl9OQU1FID0gImFuZHJvaWQtdGVzdHMiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUQ0FTRVMgPSAidGVzdGNhc2VzIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJNb2R1bGVOYW1lIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJJID0gIm1pcHM2NCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gQWJpVXRpbHMuY3JlYXRlSWQoQUJJLCBOQU1FKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1MgPSAiYW5kcm9pZC50ZXN0LkZvb3JCYXIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfMSA9ICJ0ZXN0QmxhaDEiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfMiA9ICJ0ZXN0QmxhaDIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfMyA9ICJ0ZXN0QmxhaDMiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFDS19UUkFDRSA9ICJTb21ldGhpbmcgc21hbGwgaXMgbm90IGFscmlnaHRcbiAiICsKLSAgICAgICAgICAgICJhdCBmb3VyLmJpZy5pbnNlY3RzLk1hcmxleS5zaW5nKE1hcmxleS5qYXZhOjEwKSI7Ci0KLSAgICBwcml2YXRlIE1ldGFkYXRhUmVwb3J0ZXIgbVJlcG9ydGVyOwotICAgIHByaXZhdGUgSUJ1aWxkSW5mbyBtQnVpbGRJbmZvOwotICAgIHByaXZhdGUgSUludm9jYXRpb25Db250ZXh0IG1Db250ZXh0OwotCi0gICAgcHJpdmF0ZSBGaWxlIG1Sb290ID0gbnVsbDsKLSAgICBwcml2YXRlIEZpbGUgbUJhc2UgPSBudWxsOwotICAgIHByaXZhdGUgRmlsZSBtVGVzdHMgPSBudWxsOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbVJlcG9ydGVyID0gbmV3IE1ldGFkYXRhUmVwb3J0ZXIoKTsKLSAgICAgICAgT3B0aW9uU2V0dGVyIHNldHRlciA9IG5ldyBPcHRpb25TZXR0ZXIobVJlcG9ydGVyKTsKLSAgICAgICAgc2V0dGVyLnNldE9wdGlvblZhbHVlKCJtaW4tdGVzdC1kdXJhdGlvbiIsIE1JTl9URVNUX0RVUkFUSU9OKTsKLSAgICAgICAgbVJvb3QgPSBGaWxlVXRpbC5jcmVhdGVUZW1wRGlyKFJPT1RfRElSX05BTUUpOwotICAgICAgICBtQmFzZSA9IG5ldyBGaWxlKG1Sb290LCBCQVNFX0RJUl9OQU1FKTsKLSAgICAgICAgbUJhc2UubWtkaXJzKCk7Ci0gICAgICAgIG1UZXN0cyA9IG5ldyBGaWxlKG1CYXNlLCBURVNUQ0FTRVMpOwotICAgICAgICBtVGVzdHMubWtkaXJzKCk7Ci0gICAgICAgIG1CdWlsZEluZm8gPSBuZXcgQnVpbGRJbmZvKEJVSUxEX05VTUJFUiwgIiIpOwotICAgICAgICBtQnVpbGRJbmZvLmFkZEJ1aWxkQXR0cmlidXRlKENvbXBhdGliaWxpdHlCdWlsZEhlbHBlci5ST09UX0RJUiwgbVJvb3QuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICBtQnVpbGRJbmZvLmFkZEJ1aWxkQXR0cmlidXRlKENvbXBhdGliaWxpdHlCdWlsZEhlbHBlci5TVUlURV9OQU1FLCAidGVzdHMiKTsKLSAgICAgICAgbUJ1aWxkSW5mby5hZGRCdWlsZEF0dHJpYnV0ZShDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIuU1RBUlRfVElNRV9NUywgIjAiKTsKLSAgICAgICAgbUNvbnRleHQgPSBuZXcgSW52b2NhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgbUNvbnRleHQuYWRkRGV2aWNlQnVpbGRJbmZvKCJmYWtlRGV2aWNlIiwgbUJ1aWxkSW5mbyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbVJlcG9ydGVyID0gbnVsbDsKLSAgICAgICAgRmlsZVV0aWwucmVjdXJzaXZlRGVsZXRlKG1Sb290KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHRoYXQgd2hlbiB0ZXN0cyBleGVjdXRlIGZhc3RlciB0aGFuIHRoZSB0aHJlc2hvbGQgd2UgZG8gbm90IHJlcG9ydCB0aGVuLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXN1bHRSZXBvcnRpbmdGYXN0VGVzdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbVJlcG9ydGVyLmludm9jYXRpb25TdGFydGVkKG1Db250ZXh0KTsKLSAgICAgICAgbVJlcG9ydGVyLnRlc3RSdW5TdGFydGVkKElELCAzKTsKLSAgICAgICAgcnVuVGVzdHMoMGwpOwotICAgICAgICBDb2xsZWN0aW9uPE1ldGFkYXRhUmVwb3J0ZXIuVGVzdE1ldGFkYXRhPiBtZXRhZGF0YSA9IG1SZXBvcnRlci5nZXRUZXN0TWV0YWRhdGEoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShtZXRhZGF0YS5pc0VtcHR5KCkpOwotICAgICAgICBtUmVwb3J0ZXIudGVzdFJ1bkVuZGVkKDEwLCBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKSk7Ci0gICAgICAgIG1SZXBvcnRlci5pbnZvY2F0aW9uRW5kZWQoMTApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgdGhhdCB3aGVuIHRlc3RzIGV4ZWN1dGUgc2xvd2VyIHRoYW4gdGhlIGxpbWl0IHdlIHJlcG9ydCB0aGVtIGlmIHRoZXkgcGFzc2VkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXN1bHRSZXBvcnRpbmdTbG93VGVzdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbVJlcG9ydGVyLmludm9jYXRpb25TdGFydGVkKG1Db250ZXh0KTsKLSAgICAgICAgbVJlcG9ydGVyLnRlc3RSdW5TdGFydGVkKElELCAzKTsKLSAgICAgICAgcnVuVGVzdHMoNTBsKTsKLQotICAgICAgICBDb2xsZWN0aW9uPE1ldGFkYXRhUmVwb3J0ZXIuVGVzdE1ldGFkYXRhPiBtZXRhZGF0YSA9IG1SZXBvcnRlci5nZXRUZXN0TWV0YWRhdGEoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG1ldGFkYXRhLnNpemUoKSwgMik7IC8vIFR3byBwYXNzaW5nIHNsb3cgdGVzdHMuCi0KLSAgICAgICAgbVJlcG9ydGVyLnRlc3RSdW5FbmRlZCgxMCwgbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCkpOwotICAgICAgICBtUmVwb3J0ZXIuaW52b2NhdGlvbkVuZGVkKDEwKTsKLSAgICB9Ci0KLSAgICAvKiogUnVuIDQgdGVzdC4gKi8KLSAgICBwcml2YXRlIHZvaWQgcnVuVGVzdHMobG9uZyB3YWl0VGltZSkgewotICAgICAgICBUZXN0SWRlbnRpZmllciB0ZXN0MSA9IG5ldyBUZXN0SWRlbnRpZmllcihDTEFTUywgTUVUSE9EXzEpOwotICAgICAgICBtUmVwb3J0ZXIudGVzdFN0YXJ0ZWQodGVzdDEpOwotICAgICAgICBSdW5VdGlsLmdldERlZmF1bHQoKS5zbGVlcCh3YWl0VGltZSk7Ci0gICAgICAgIG1SZXBvcnRlci50ZXN0RW5kZWQodGVzdDEsIG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpKTsKLQotICAgICAgICBUZXN0SWRlbnRpZmllciB0ZXN0MiA9IG5ldyBUZXN0SWRlbnRpZmllcihDTEFTUywgTUVUSE9EXzIpOwotICAgICAgICBtUmVwb3J0ZXIudGVzdFN0YXJ0ZWQodGVzdDIpOwotICAgICAgICBSdW5VdGlsLmdldERlZmF1bHQoKS5zbGVlcCh3YWl0VGltZSk7Ci0gICAgICAgIG1SZXBvcnRlci50ZXN0RW5kZWQodGVzdDEsIG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpKTsKLQotICAgICAgICBUZXN0SWRlbnRpZmllciB0ZXN0MyA9IG5ldyBUZXN0SWRlbnRpZmllcihDTEFTUywgTUVUSE9EXzMpOwotICAgICAgICBtUmVwb3J0ZXIudGVzdFN0YXJ0ZWQodGVzdDMpOwotICAgICAgICBSdW5VdGlsLmdldERlZmF1bHQoKS5zbGVlcCh3YWl0VGltZSk7Ci0gICAgICAgIG1SZXBvcnRlci50ZXN0RmFpbGVkKHRlc3QzLCBTVEFDS19UUkFDRSk7Ci0gICAgICAgIG1SZXBvcnRlci50ZXN0RW5kZWQodGVzdDMsIG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpKTsKLQotICAgICAgICBUZXN0SWRlbnRpZmllciB0ZXN0NCA9IG5ldyBUZXN0SWRlbnRpZmllcihDTEFTUywgTUVUSE9EXzMpOwotICAgICAgICBtUmVwb3J0ZXIudGVzdFN0YXJ0ZWQodGVzdDQpOwotICAgICAgICBSdW5VdGlsLmdldERlZmF1bHQoKS5zbGVlcCh3YWl0VGltZSk7Ci0gICAgICAgIG1SZXBvcnRlci50ZXN0SWdub3JlZCh0ZXN0NCk7Ci0gICAgICAgIG1SZXBvcnRlci50ZXN0RW5kZWQodGVzdDQsIG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC9yZXN1bHQvUmVzdWx0UmVwb3J0ZXJCdWlsZEluZm9UZXN0LmphdmEgYi9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC9yZXN1bHQvUmVzdWx0UmVwb3J0ZXJCdWlsZEluZm9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNjJjMzYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvcmVzdWx0L1Jlc3VsdFJlcG9ydGVyQnVpbGRJbmZvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQucmVzdWx0OwotCi0KLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLklJbnZvY2F0aW9uUmVzdWx0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuSW52b2NhdGlvblJlc3VsdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBVbml0IHRlc3RzIGZvciB7QGxpbmsgUmVzdWx0UmVwb3J0ZXJ9LCBmb2N1c2VkIG9uIGFiaWxpdHkgdG8gb3ZlcnJpZGUgYnVpbGQgaW5mby4KLSAqLwotcHVibGljIGNsYXNzIFJlc3VsdFJlcG9ydGVyQnVpbGRJbmZvVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RPdmVycmlkZUJ1aWxkUHJvcGVydGllcygpIHsKLSAgICAgICAgUmVzdWx0UmVwb3J0ZXJCdWlsZEluZm9UZXN0ZXIgdGVzdGVyID0gbmV3IFJlc3VsdFJlcG9ydGVyQnVpbGRJbmZvVGVzdGVyKCk7Ci0gICAgICAgIFN0cmluZyBtYW51ZmFjdHVyZSA9ICJjdXN0b21fbWFudWZhY3R1cmUiOwotICAgICAgICBTdHJpbmcgYnJhbmQgPSAiZ29vZ2xlIjsKLSAgICAgICAgU3RyaW5nIHByb2R1Y3QgPSAiZ1Byb2R1Y3QiOwotICAgICAgICBTdHJpbmcgZGV2aWNlID0gImdEZXZpY2UiOwotICAgICAgICBTdHJpbmcgdmVyc2lvbiA9ICJnVmVyc2lvbiI7Ci0gICAgICAgIFN0cmluZyBidWlsZElkID0gIjEyMyI7Ci0gICAgICAgIFN0cmluZyBtb2RlbCA9ICJnTW9kZWwiOwotICAgICAgICBTdHJpbmcgZmluZ2VycHJpbnQgPSBicmFuZCArICIvIiArIHByb2R1Y3QgKyAiLyIgKyBkZXZpY2UgKyAiOiIgKwotICAgICAgICAgICAgICAgIHZlcnNpb24gKyAiLyIgKyBidWlsZElkICsgIi91c2VyZGVidWcta2V5cyI7Ci0KLSAgICAgICAgSUludm9jYXRpb25SZXN1bHQgcmVzdWx0ID0gdGVzdGVyLnRlc3RCdWlsZEluZm9PdmVycmlkZShmaW5nZXJwcmludCwgbWFudWZhY3R1cmUsIG1vZGVsKTsKLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBpbnZvY2F0aW9uSW5mbyA9IHJlc3VsdC5nZXRJbnZvY2F0aW9uSW5mbygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoaW52b2NhdGlvbkluZm8uZ2V0KFJlc3VsdFJlcG9ydGVyLkJVSUxEX0lEKSwgYnVpbGRJZCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhpbnZvY2F0aW9uSW5mby5nZXQoUmVzdWx0UmVwb3J0ZXIuQlVJTERfQlJBTkQpLCBicmFuZCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhpbnZvY2F0aW9uSW5mby5nZXQoUmVzdWx0UmVwb3J0ZXIuQlVJTERfREVWSUNFKSwgZGV2aWNlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGludm9jYXRpb25JbmZvLmdldChSZXN1bHRSZXBvcnRlci5CVUlMRF9QUk9EVUNUKSwgcHJvZHVjdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhpbnZvY2F0aW9uSW5mby5nZXQoUmVzdWx0UmVwb3J0ZXIuQlVJTERfVkVSU0lPTl9SRUxFQVNFKSwgdmVyc2lvbik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhpbnZvY2F0aW9uSW5mby5nZXQoUmVzdWx0UmVwb3J0ZXIuQlVJTERfRklOR0VSUFJJTlQpLCBmaW5nZXJwcmludCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhpbnZvY2F0aW9uSW5mby5nZXQoUmVzdWx0UmVwb3J0ZXIuQlVJTERfTUFOVUZBQ1RVUkVSKSwgbWFudWZhY3R1cmUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoaW52b2NhdGlvbkluZm8uZ2V0KFJlc3VsdFJlcG9ydGVyLkJVSUxEX01PREVMKSwgbW9kZWwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzdWx0UmVwb3J0ZXJCdWlsZEluZm9UZXN0ZXIgZXh0ZW5kcyBSZXN1bHRSZXBvcnRlciB7Ci0KLSAgICAgICAgcHVibGljIFJlc3VsdFJlcG9ydGVyQnVpbGRJbmZvVGVzdGVyKCkgewotICAgICAgICAgICAgbVJlc3VsdCA9IG5ldyBJbnZvY2F0aW9uUmVzdWx0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSUludm9jYXRpb25SZXN1bHQgdGVzdEJ1aWxkSW5mb092ZXJyaWRlKFN0cmluZyBidWlsZEZpbmdlcnByaW50T3ZlcnJpZGUsCi0gICAgICAgICAgICAgICAgU3RyaW5nIG1hbnVmYWN0dXJlT3ZlcnJpZGUsIFN0cmluZyBtb2RlbE92ZXJyaWRlKSB7Ci0gICAgICAgICAgICBhZGREZXZpY2VCdWlsZEluZm9Ub1Jlc3VsdCgKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRGaW5nZXJwcmludE92ZXJyaWRlLCBtYW51ZmFjdHVyZU92ZXJyaWRlLCBtb2RlbE92ZXJyaWRlKTsKLSAgICAgICAgICAgIHJldHVybiBtUmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcEJ1aWxkSW5mbygpIHsKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gYnVpbGRQcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8PigpOwotICAgICAgICAgICAgYnVpbGRQcm9wZXJ0aWVzLnB1dChCVUlMRF9JRCwgQlVJTERfSUQpOwotICAgICAgICAgICAgYnVpbGRQcm9wZXJ0aWVzLnB1dChCVUlMRF9CUkFORCwgQlVJTERfQlJBTkQpOwotICAgICAgICAgICAgYnVpbGRQcm9wZXJ0aWVzLnB1dChCVUlMRF9ERVZJQ0UsIEJVSUxEX0RFVklDRSk7Ci0gICAgICAgICAgICBidWlsZFByb3BlcnRpZXMucHV0KEJVSUxEX1BST0RVQ1QsIEJVSUxEX1BST0RVQ1QpOwotICAgICAgICAgICAgYnVpbGRQcm9wZXJ0aWVzLnB1dChCVUlMRF9WRVJTSU9OX1JFTEVBU0UsIEJVSUxEX1ZFUlNJT05fUkVMRUFTRSk7Ci0gICAgICAgICAgICBidWlsZFByb3BlcnRpZXMucHV0KEJVSUxEX0ZJTkdFUlBSSU5ULCBCVUlMRF9GSU5HRVJQUklOVCk7Ci0gICAgICAgICAgICBidWlsZFByb3BlcnRpZXMucHV0KEJVSUxEX01BTlVGQUNUVVJFUiwgQlVJTERfTUFOVUZBQ1RVUkVSKTsKLSAgICAgICAgICAgIGJ1aWxkUHJvcGVydGllcy5wdXQoQlVJTERfTU9ERUwsIEJVSUxEX01PREVMKTsKLSAgICAgICAgICAgIHJldHVybiBidWlsZFByb3BlcnRpZXM7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC9yZXN1bHQvUmVzdWx0UmVwb3J0ZXJUZXN0LmphdmEgYi9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC9yZXN1bHQvUmVzdWx0UmVwb3J0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNGU5ZGYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvcmVzdWx0L1Jlc3VsdFJlcG9ydGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnJlc3VsdDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLmJ1aWxkLkNvbXBhdGliaWxpdHlCdWlsZEhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC5idWlsZC5Db21wYXRpYmlsaXR5QnVpbGRQcm92aWRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkRldmljZUluZm87Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5JQ2FzZVJlc3VsdDsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLklJbnZvY2F0aW9uUmVzdWx0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuSU1vZHVsZVJlc3VsdDsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLklUZXN0UmVzdWx0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuVGVzdFN0YXR1czsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIudGVzdHJ1bm5lci5UZXN0SWRlbnRpZmllcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5idWlsZC5JQnVpbGRJbmZvOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmNvbmZpZy5PcHRpb25TZXR0ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuaW52b2tlci5JSW52b2NhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuaW52b2tlci5JbnZvY2F0aW9uQ29udGV4dDsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5yZXN1bHQuQnl0ZUFycmF5SW5wdXRTdHJlYW1Tb3VyY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQucmVzdWx0LklucHV0U3RyZWFtU291cmNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnJlc3VsdC5Mb2dEYXRhVHlwZTsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC51dGlsLkFiaVV0aWxzOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnV0aWwuRmlsZVV0aWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlRmlsdGVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIFVuaXQgdGVzdHMgZm9yIHtAbGluayBSZXN1bHRSZXBvcnRlcn0KLSAqLwotcHVibGljIGNsYXNzIFJlc3VsdFJlcG9ydGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBST09UX1BST1BFUlRZID0gIlRFU1RTX1JPT1QiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVUlURV9OQU1FID0gIlRFU1RTIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVJTERfTlVNQkVSID0gIjIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVUlURV9QTEFOID0gImN0cyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERZTkFNSUNfQ09ORklHX1VSTCA9ICIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBST09UX0RJUl9OQU1FID0gInJvb3QiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNFX0RJUl9OQU1FID0gImFuZHJvaWQtdGVzdHMiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUQ0FTRVMgPSAidGVzdGNhc2VzIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJNb2R1bGVOYW1lIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJJID0gIm1pcHM2NCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gQWJpVXRpbHMuY3JlYXRlSWQoQUJJLCBOQU1FKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1MgPSAiYW5kcm9pZC50ZXN0LkZvb3JCYXIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfMSA9ICJ0ZXN0QmxhaDEiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfMiA9ICJ0ZXN0QmxhaDIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfMyA9ICJ0ZXN0QmxhaDMiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUXzEgPSBTdHJpbmcuZm9ybWF0KCIlcyMlcyIsIENMQVNTLCBNRVRIT0RfMSk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfMiA9IFN0cmluZy5mb3JtYXQoIiVzIyVzIiwgQ0xBU1MsIE1FVEhPRF8yKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF8zID0gU3RyaW5nLmZvcm1hdCgiJXMjJXMiLCBDTEFTUywgTUVUSE9EXzMpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFDS19UUkFDRSA9ICJTb21ldGhpbmcgc21hbGwgaXMgbm90IGFscmlnaHRcbiAiICsKLSAgICAgICAgICAgICJhdCBmb3VyLmJpZy5pbnNlY3RzLk1hcmxleS5zaW5nKE1hcmxleS5qYXZhOjEwKSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9ESVIgPSAicmVzdWx0MTIzIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBGT1JNQVRUSU5HX0ZJTEVTID0gewotICAgICAgICAiY29tcGF0aWJpbGl0eV9yZXN1bHQuY3NzIiwKLSAgICAgICAgImNvbXBhdGliaWxpdHlfcmVzdWx0LnhzZCIsCi0gICAgICAgICJjb21wYXRpYmlsaXR5X3Jlc3VsdC54c2wiLAotICAgICAgICAibG9nby5wbmcifTsKLQotICAgIHByaXZhdGUgUmVzdWx0UmVwb3J0ZXIgbVJlcG9ydGVyOwotICAgIHByaXZhdGUgSUJ1aWxkSW5mbyBtQnVpbGRJbmZvOwotICAgIHByaXZhdGUgSUludm9jYXRpb25Db250ZXh0IG1Db250ZXh0OwotICAgIHByaXZhdGUgQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyIG1CdWlsZEhlbHBlcjsKLQotICAgIHByaXZhdGUgRmlsZSBtUm9vdCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBGaWxlIG1CYXNlID0gbnVsbDsKLSAgICBwcml2YXRlIEZpbGUgbVRlc3RzID0gbnVsbDsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1SZXBvcnRlciA9IG5ldyBSZXN1bHRSZXBvcnRlcigpOwotICAgICAgICBtUm9vdCA9IEZpbGVVdGlsLmNyZWF0ZVRlbXBEaXIoUk9PVF9ESVJfTkFNRSk7Ci0gICAgICAgIG1CYXNlID0gbmV3IEZpbGUobVJvb3QsIEJBU0VfRElSX05BTUUpOwotICAgICAgICBtQmFzZS5ta2RpcnMoKTsKLSAgICAgICAgbVRlc3RzID0gbmV3IEZpbGUobUJhc2UsIFRFU1RDQVNFUyk7Ci0gICAgICAgIG1UZXN0cy5ta2RpcnMoKTsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KFJPT1RfUFJPUEVSVFksIG1Sb290LmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgQ29tcGF0aWJpbGl0eUJ1aWxkUHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgQ29tcGF0aWJpbGl0eUJ1aWxkUHJvdmlkZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0U3VpdGVJbmZvTmFtZSgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gU1VJVEVfTkFNRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRTdWl0ZUluZm9CdWlsZE51bWJlcigpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQlVJTERfTlVNQkVSOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFN1aXRlSW5mb1ZlcnNpb24oKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJVSUxEX05VTUJFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgT3B0aW9uU2V0dGVyIHNldHRlciA9IG5ldyBPcHRpb25TZXR0ZXIocHJvdmlkZXIpOwotICAgICAgICBzZXR0ZXIuc2V0T3B0aW9uVmFsdWUoInBsYW4iLCBTVUlURV9QTEFOKTsKLSAgICAgICAgc2V0dGVyLnNldE9wdGlvblZhbHVlKCJkeW5hbWljLWNvbmZpZy11cmwiLCBEWU5BTUlDX0NPTkZJR19VUkwpOwotICAgICAgICBtQnVpbGRJbmZvID0gcHJvdmlkZXIuZ2V0QnVpbGQoKTsKLSAgICAgICAgbUJ1aWxkSGVscGVyID0gbmV3IENvbXBhdGliaWxpdHlCdWlsZEhlbHBlcihtQnVpbGRJbmZvKTsKLSAgICAgICAgbUNvbnRleHQgPSBuZXcgSW52b2NhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgbUNvbnRleHQuYWRkRGV2aWNlQnVpbGRJbmZvKCJmYWtlRGV2aWNlIiwgbUJ1aWxkSW5mbyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbVJlcG9ydGVyID0gbnVsbDsKLSAgICAgICAgRmlsZVV0aWwucmVjdXJzaXZlRGVsZXRlKG1Sb290KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0dXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbVJlcG9ydGVyLmludm9jYXRpb25TdGFydGVkKG1Db250ZXh0KTsKLSAgICAgICAgLy8gU2hvdWxkIGhhdmUgY3JlYXRlZCBhIGRpcmVjdG9yeSBmb3IgdGhlIGxvZ3MKLSAgICAgICAgRmlsZVtdIGNoaWxkcmVuID0gbUJ1aWxkSGVscGVyLmdldExvZ3NEaXIoKS5saXN0RmlsZXMoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRGlkbid0IGNyZWF0ZSBsb2dzIGRpciIsIGNoaWxkcmVuLmxlbmd0aCA9PSAxICYmIGNoaWxkcmVuWzBdLmlzRGlyZWN0b3J5KCkpOwotICAgICAgICAvLyBTaG91bGQgaGF2ZSBjcmVhdGVkIGEgZGlyZWN0b3J5IGZvciB0aGUgcmVzdWx0cwotICAgICAgICBjaGlsZHJlbiA9IG1CdWlsZEhlbHBlci5nZXRSZXN1bHRzRGlyKCkubGlzdEZpbGVzKCk7Ci0gICAgICAgIGFzc2VydFRydWUoIkRpZG4ndCBjcmVhdGUgcmVzdWx0cyBkaXIiLCBjaGlsZHJlbi5sZW5ndGggPT0gMSAmJiBjaGlsZHJlblswXS5pc0RpcmVjdG9yeSgpKTsKLSAgICAgICAgbVJlcG9ydGVyLmludm9jYXRpb25FbmRlZCgxMCk7Ci0gICAgICAgIC8vIFNob3VsZCBoYXZlIGNyZWF0ZWQgYSB6aXAgZmlsZQotICAgICAgICBjaGlsZHJlbiA9IG1CdWlsZEhlbHBlci5nZXRSZXN1bHRzRGlyKCkubGlzdEZpbGVzKG5ldyBGaWxlRmlsdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBwYXRobmFtZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBwYXRobmFtZS5nZXROYW1lKCkuZW5kc1dpdGgoIi56aXAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGFzc2VydFRydWUoIkRpZG4ndCBjcmVhdGUgcmVzdWx0cyB6aXAiLAotICAgICAgICAgICAgICAgIGNoaWxkcmVuLmxlbmd0aCA9PSAxICYmIGNoaWxkcmVuWzBdLmlzRmlsZSgpICYmIGNoaWxkcmVuWzBdLmxlbmd0aCgpID4gMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlc3VsdFJlcG9ydGluZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtUmVwb3J0ZXIuaW52b2NhdGlvblN0YXJ0ZWQobUNvbnRleHQpOwotICAgICAgICBtUmVwb3J0ZXIudGVzdFJ1blN0YXJ0ZWQoSUQsIDIpOwotICAgICAgICBUZXN0SWRlbnRpZmllciB0ZXN0MSA9IG5ldyBUZXN0SWRlbnRpZmllcihDTEFTUywgTUVUSE9EXzEpOwotICAgICAgICBtUmVwb3J0ZXIudGVzdFN0YXJ0ZWQodGVzdDEpOwotICAgICAgICBtUmVwb3J0ZXIudGVzdEVuZGVkKHRlc3QxLCBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKSk7Ci0gICAgICAgIFRlc3RJZGVudGlmaWVyIHRlc3QyID0gbmV3IFRlc3RJZGVudGlmaWVyKENMQVNTLCBNRVRIT0RfMik7Ci0gICAgICAgIG1SZXBvcnRlci50ZXN0U3RhcnRlZCh0ZXN0Mik7Ci0gICAgICAgIG1SZXBvcnRlci50ZXN0RmFpbGVkKHRlc3QyLCBTVEFDS19UUkFDRSk7Ci0gICAgICAgIFRlc3RJZGVudGlmaWVyIHRlc3QzID0gbmV3IFRlc3RJZGVudGlmaWVyKENMQVNTLCBNRVRIT0RfMyk7Ci0gICAgICAgIG1SZXBvcnRlci50ZXN0U3RhcnRlZCh0ZXN0Myk7Ci0gICAgICAgIG1SZXBvcnRlci50ZXN0RmFpbGVkKHRlc3QzLCBTVEFDS19UUkFDRSk7Ci0gICAgICAgIG1SZXBvcnRlci50ZXN0RW5kZWQodGVzdDMsIG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpKTsKLSAgICAgICAgbVJlcG9ydGVyLnRlc3RSdW5FbmRlZCgxMCwgbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCkpOwotICAgICAgICBtUmVwb3J0ZXIuaW52b2NhdGlvbkVuZGVkKDEwKTsKLSAgICAgICAgSUludm9jYXRpb25SZXN1bHQgcmVzdWx0ID0gbVJlcG9ydGVyLmdldFJlc3VsdCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIDEgcGFzcyIsIDEsIHJlc3VsdC5jb3VudFJlc3VsdHMoVGVzdFN0YXR1cy5QQVNTKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRXhwZWN0ZWQgMiBmYWlsdXJlcyIsIDIsIHJlc3VsdC5jb3VudFJlc3VsdHMoVGVzdFN0YXR1cy5GQUlMKSk7Ci0gICAgICAgIExpc3Q8SU1vZHVsZVJlc3VsdD4gbW9kdWxlcyA9IHJlc3VsdC5nZXRNb2R1bGVzKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRXhwZWN0ZWQgMSBtb2R1bGUiLCAxLCBtb2R1bGVzLnNpemUoKSk7Ci0gICAgICAgIElNb2R1bGVSZXN1bHQgbW9kdWxlID0gbW9kdWxlcy5nZXQoMCk7Ci0gICAgICAgIGFzc2VydFRydWUobW9kdWxlLmlzRG9uZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgSUQiLCBJRCwgbW9kdWxlLmdldElkKCkpOwotICAgICAgICBMaXN0PElDYXNlUmVzdWx0PiBjYXNlUmVzdWx0cyA9IG1vZHVsZS5nZXRSZXN1bHRzKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRXhwZWN0ZWQgMSB0ZXN0IGNhc2UiLCAxLCBjYXNlUmVzdWx0cy5zaXplKCkpOwotICAgICAgICBJQ2FzZVJlc3VsdCBjYXNlUmVzdWx0ID0gY2FzZVJlc3VsdHMuZ2V0KDApOwotICAgICAgICBMaXN0PElUZXN0UmVzdWx0PiB0ZXN0UmVzdWx0cyA9IGNhc2VSZXN1bHQuZ2V0UmVzdWx0cygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIDMgdGVzdHMiLCAzLCB0ZXN0UmVzdWx0cy5zaXplKCkpOwotICAgICAgICBJVGVzdFJlc3VsdCByZXN1bHQxID0gY2FzZVJlc3VsdC5nZXRSZXN1bHQoTUVUSE9EXzEpOwotICAgICAgICBhc3NlcnROb3ROdWxsKFN0cmluZy5mb3JtYXQoIkV4cGVjdGVkIHJlc3VsdCBmb3IgJXMiLCBURVNUXzEpLCByZXN1bHQxKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5mb3JtYXQoIkV4cGVjdGVkIHBhc3MgZm9yICVzIiwgVEVTVF8xKSwgVGVzdFN0YXR1cy5QQVNTLAotICAgICAgICAgICAgICAgIHJlc3VsdDEuZ2V0UmVzdWx0U3RhdHVzKCkpOwotICAgICAgICBJVGVzdFJlc3VsdCByZXN1bHQyID0gY2FzZVJlc3VsdC5nZXRSZXN1bHQoTUVUSE9EXzIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKFN0cmluZy5mb3JtYXQoIkV4cGVjdGVkIHJlc3VsdCBmb3IgJXMiLCBURVNUXzIpLCByZXN1bHQyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5mb3JtYXQoIkV4cGVjdGVkIGZhaWwgZm9yICVzIiwgVEVTVF8yKSwgVGVzdFN0YXR1cy5GQUlMLAotICAgICAgICAgICAgICAgIHJlc3VsdDIuZ2V0UmVzdWx0U3RhdHVzKCkpOwotICAgICAgICBJVGVzdFJlc3VsdCByZXN1bHQzID0gY2FzZVJlc3VsdC5nZXRSZXN1bHQoTUVUSE9EXzMpOwotICAgICAgICBhc3NlcnROb3ROdWxsKFN0cmluZy5mb3JtYXQoIkV4cGVjdGVkIHJlc3VsdCBmb3IgJXMiLCBURVNUXzMpLCByZXN1bHQzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5mb3JtYXQoIkV4cGVjdGVkIGZhaWwgZm9yICVzIiwgVEVTVF8zKSwgVGVzdFN0YXR1cy5GQUlMLAotICAgICAgICAgICAgICAgIHJlc3VsdDMuZ2V0UmVzdWx0U3RhdHVzKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBtYWtlVGVzdFJ1bihTdHJpbmdbXSBtZXRob2RzLCBib29sZWFuW10gcGFzc2VzKSB7Ci0gICAgICAgIG1SZXBvcnRlci50ZXN0UnVuU3RhcnRlZChJRCwgbWV0aG9kcy5sZW5ndGgpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgVGVzdElkZW50aWZpZXIgdGVzdCA9IG5ldyBUZXN0SWRlbnRpZmllcihDTEFTUywgbWV0aG9kc1tpXSk7Ci0gICAgICAgICAgICBtUmVwb3J0ZXIudGVzdFN0YXJ0ZWQodGVzdCk7Ci0gICAgICAgICAgICBpZiAoIXBhc3Nlc1tpXSkgewotICAgICAgICAgICAgICAgIG1SZXBvcnRlci50ZXN0RmFpbGVkKHRlc3QsIFNUQUNLX1RSQUNFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1SZXBvcnRlci50ZXN0RW5kZWQodGVzdCwgbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgbVJlcG9ydGVyLnRlc3RSdW5FbmRlZCgxMCwgbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBlYXRlZEV4ZWN1dGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nW10gbWV0aG9kcyA9IG5ldyBTdHJpbmdbXSB7TUVUSE9EXzEsIE1FVEhPRF8yLCBNRVRIT0RfM307Ci0KLSAgICAgICAgbVJlcG9ydGVyLmludm9jYXRpb25TdGFydGVkKG1Db250ZXh0KTsKLQotICAgICAgICBtYWtlVGVzdFJ1bihtZXRob2RzLCBuZXcgYm9vbGVhbltdIHt0cnVlLCBmYWxzZSwgdHJ1ZX0pOwotICAgICAgICBtYWtlVGVzdFJ1bihtZXRob2RzLCBuZXcgYm9vbGVhbltdIHt0cnVlLCBmYWxzZSwgZmFsc2V9KTsKLSAgICAgICAgbWFrZVRlc3RSdW4obWV0aG9kcywgbmV3IGJvb2xlYW5bXSB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0pOwotCi0gICAgICAgIG1SZXBvcnRlci5pbnZvY2F0aW9uRW5kZWQoMTApOwotCi0gICAgICAgIC8vIFZlcmlmaWNhdGlvbgotCi0gICAgICAgIElJbnZvY2F0aW9uUmVzdWx0IHJlc3VsdCA9IG1SZXBvcnRlci5nZXRSZXN1bHQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCAxIHBhc3MiLCAxLCByZXN1bHQuY291bnRSZXN1bHRzKFRlc3RTdGF0dXMuUEFTUykpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIDIgZmFpbHVyZXMiLCAyLCByZXN1bHQuY291bnRSZXN1bHRzKFRlc3RTdGF0dXMuRkFJTCkpOwotICAgICAgICBMaXN0PElNb2R1bGVSZXN1bHQ+IG1vZHVsZXMgPSByZXN1bHQuZ2V0TW9kdWxlcygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIDEgbW9kdWxlIiwgMSwgbW9kdWxlcy5zaXplKCkpOwotICAgICAgICBJTW9kdWxlUmVzdWx0IG1vZHVsZSA9IG1vZHVsZXMuZ2V0KDApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBJRCIsIElELCBtb2R1bGUuZ2V0SWQoKSk7Ci0gICAgICAgIExpc3Q8SUNhc2VSZXN1bHQ+IGNhc2VSZXN1bHRzID0gbW9kdWxlLmdldFJlc3VsdHMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCAxIHRlc3QgY2FzZSIsIDEsIGNhc2VSZXN1bHRzLnNpemUoKSk7Ci0gICAgICAgIElDYXNlUmVzdWx0IGNhc2VSZXN1bHQgPSBjYXNlUmVzdWx0cy5nZXQoMCk7Ci0gICAgICAgIExpc3Q8SVRlc3RSZXN1bHQ+IHRlc3RSZXN1bHRzID0gY2FzZVJlc3VsdC5nZXRSZXN1bHRzKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRXhwZWN0ZWQgMyB0ZXN0cyIsIDMsIHRlc3RSZXN1bHRzLnNpemUoKSk7Ci0KLSAgICAgICAgLy8gVGVzdCAxIGRldGFpbHMKLSAgICAgICAgSVRlc3RSZXN1bHQgcmVzdWx0MSA9IGNhc2VSZXN1bHQuZ2V0UmVzdWx0KE1FVEhPRF8xKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChTdHJpbmcuZm9ybWF0KCJFeHBlY3RlZCByZXN1bHQgZm9yICVzIiwgVEVTVF8xKSwgcmVzdWx0MSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmcuZm9ybWF0KCJFeHBlY3RlZCBwYXNzIGZvciAlcyIsIFRFU1RfMSksIFRlc3RTdGF0dXMuUEFTUywKLSAgICAgICAgICAgICAgICByZXN1bHQxLmdldFJlc3VsdFN0YXR1cygpKTsKLQotICAgICAgICAvLyBUZXN0IDIgZGV0YWlscwotICAgICAgICBJVGVzdFJlc3VsdCByZXN1bHQyID0gY2FzZVJlc3VsdC5nZXRSZXN1bHQoTUVUSE9EXzIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKFN0cmluZy5mb3JtYXQoIkV4cGVjdGVkIHJlc3VsdCBmb3IgJXMiLCBURVNUXzIpLCByZXN1bHQyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5mb3JtYXQoIkV4cGVjdGVkIGZhaWwgZm9yICVzIiwgVEVTVF8yKSwgVGVzdFN0YXR1cy5GQUlMLAotICAgICAgICAgICAgICAgIHJlc3VsdDIuZ2V0UmVzdWx0U3RhdHVzKCkpOwotICAgICAgICAvLyBUT0RPOiBEZWZpbmUgcmVxdWlyZW1lbnQuIFNob3VsZCB0aGlzIHJlc3VsdCBoYXZlIG11bHRpcGxlIHN0YWNrIHRyYWNlcz8KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdDIuZ2V0U3RhY2tUcmFjZSgpLCBTVEFDS19UUkFDRSk7Ci0KLSAgICAgICAgLy8gVGVzdCAzIGRldGFpbHMKLSAgICAgICAgSVRlc3RSZXN1bHQgcmVzdWx0MyA9IGNhc2VSZXN1bHQuZ2V0UmVzdWx0KE1FVEhPRF8zKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChTdHJpbmcuZm9ybWF0KCJFeHBlY3RlZCByZXN1bHQgZm9yICVzIiwgVEVTVF8zKSwgcmVzdWx0Myk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmcuZm9ybWF0KCJFeHBlY3RlZCBmYWlsIGZvciAlcyIsIFRFU1RfMyksIFRlc3RTdGF0dXMuRkFJTCwKLSAgICAgICAgICAgICAgICByZXN1bHQzLmdldFJlc3VsdFN0YXR1cygpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdDMuZ2V0U3RhY2tUcmFjZSgpLCBTVEFDS19UUkFDRSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJldHJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1SZXBvcnRlci5pbnZvY2F0aW9uU3RhcnRlZChtQ29udGV4dCk7Ci0KLSAgICAgICAgLy8gU2V0IHVwIElJbnZvY2F0aW9uUmVzdWx0IHdpdGggZXhpc3RpbmcgcmVzdWx0cyBmcm9tIHByZXZpb3VzIHNlc3Npb24KLSAgICAgICAgbVJlcG9ydGVyLnRlc3RSdW5TdGFydGVkKElELCAyKTsKLSAgICAgICAgSUludm9jYXRpb25SZXN1bHQgaW52b2NhdGlvblJlc3VsdCA9IG1SZXBvcnRlci5nZXRSZXN1bHQoKTsKLSAgICAgICAgSU1vZHVsZVJlc3VsdCBtb2R1bGVSZXN1bHQgPSBpbnZvY2F0aW9uUmVzdWx0LmdldE9yQ3JlYXRlTW9kdWxlKElEKTsKLSAgICAgICAgSUNhc2VSZXN1bHQgY2FzZVJlc3VsdCA9IG1vZHVsZVJlc3VsdC5nZXRPckNyZWF0ZVJlc3VsdChDTEFTUyk7Ci0gICAgICAgIElUZXN0UmVzdWx0IHRlc3RSZXN1bHQxID0gY2FzZVJlc3VsdC5nZXRPckNyZWF0ZVJlc3VsdChNRVRIT0RfMSk7Ci0gICAgICAgIHRlc3RSZXN1bHQxLnNldFJlc3VsdFN0YXR1cyhUZXN0U3RhdHVzLlBBU1MpOwotICAgICAgICB0ZXN0UmVzdWx0MS5zZXRSZXRyeSh0cnVlKTsKLSAgICAgICAgSVRlc3RSZXN1bHQgdGVzdFJlc3VsdDIgPSBjYXNlUmVzdWx0LmdldE9yQ3JlYXRlUmVzdWx0KE1FVEhPRF8yKTsKLSAgICAgICAgdGVzdFJlc3VsdDIuc2V0UmVzdWx0U3RhdHVzKFRlc3RTdGF0dXMuRkFJTCk7Ci0gICAgICAgIHRlc3RSZXN1bHQyLnNldFN0YWNrVHJhY2UoU1RBQ0tfVFJBQ0UpOwotICAgICAgICB0ZXN0UmVzdWx0Mi5zZXRSZXRyeSh0cnVlKTsKLQotICAgICAgICAvLyBGbGlwIHJlc3VsdHMgZm9yIHRoZSBjdXJyZW50IHNlc3Npb24KLSAgICAgICAgVGVzdElkZW50aWZpZXIgdGVzdDEgPSBuZXcgVGVzdElkZW50aWZpZXIoQ0xBU1MsIE1FVEhPRF8xKTsKLSAgICAgICAgbVJlcG9ydGVyLnRlc3RTdGFydGVkKHRlc3QxKTsKLSAgICAgICAgbVJlcG9ydGVyLnRlc3RGYWlsZWQodGVzdDEsIFNUQUNLX1RSQUNFKTsKLSAgICAgICAgbVJlcG9ydGVyLnRlc3RFbmRlZCh0ZXN0MSwgbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCkpOwotICAgICAgICBUZXN0SWRlbnRpZmllciB0ZXN0MiA9IG5ldyBUZXN0SWRlbnRpZmllcihDTEFTUywgTUVUSE9EXzIpOwotICAgICAgICBtUmVwb3J0ZXIudGVzdFN0YXJ0ZWQodGVzdDIpOwotICAgICAgICBtUmVwb3J0ZXIudGVzdEVuZGVkKHRlc3QyLCBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKSk7Ci0KLSAgICAgICAgbVJlcG9ydGVyLnRlc3RSdW5FbmRlZCgxMCwgbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCkpOwotICAgICAgICBtUmVwb3J0ZXIuaW52b2NhdGlvbkVuZGVkKDEwKTsKLQotICAgICAgICAvLyBWZXJpZmljYXRpb24gdGhhdCByZXN1bHRzIGhhdmUgYmVlbiBvdmVyd3JpdHRlbi4KLSAgICAgICAgSUludm9jYXRpb25SZXN1bHQgcmVzdWx0ID0gbVJlcG9ydGVyLmdldFJlc3VsdCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIDEgcGFzcyIsIDEsIHJlc3VsdC5jb3VudFJlc3VsdHMoVGVzdFN0YXR1cy5QQVNTKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRXhwZWN0ZWQgMSBmYWlsdXJlIiwgMSwgcmVzdWx0LmNvdW50UmVzdWx0cyhUZXN0U3RhdHVzLkZBSUwpKTsKLSAgICAgICAgTGlzdDxJTW9kdWxlUmVzdWx0PiBtb2R1bGVzID0gcmVzdWx0LmdldE1vZHVsZXMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCAxIG1vZHVsZSIsIDEsIG1vZHVsZXMuc2l6ZSgpKTsKLSAgICAgICAgSU1vZHVsZVJlc3VsdCBtb2R1bGUgPSBtb2R1bGVzLmdldCgwKTsKLSAgICAgICAgTGlzdDxJQ2FzZVJlc3VsdD4gY2FzZXMgPSBtb2R1bGUuZ2V0UmVzdWx0cygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIDEgdGVzdCBjYXNlIiwgMSwgY2FzZXMuc2l6ZSgpKTsKLSAgICAgICAgSUNhc2VSZXN1bHQgY2FzZTEgPSBjYXNlcy5nZXQoMCk7Ci0gICAgICAgIExpc3Q8SVRlc3RSZXN1bHQ+IHRlc3RSZXN1bHRzID0gY2FzZTEuZ2V0UmVzdWx0cygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIDIgdGVzdHMiLCAyLCB0ZXN0UmVzdWx0cy5zaXplKCkpOwotCi0gICAgICAgIC8vIFRlc3QgMSBkZXRhaWxzCi0gICAgICAgIElUZXN0UmVzdWx0IGZpbmFsVGVzdFJlc3VsdDEgPSBjYXNlMS5nZXRSZXN1bHQoTUVUSE9EXzEpOwotICAgICAgICBhc3NlcnROb3ROdWxsKFN0cmluZy5mb3JtYXQoIkV4cGVjdGVkIHJlc3VsdCBmb3IgJXMiLCBURVNUXzEpLCBmaW5hbFRlc3RSZXN1bHQxKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5mb3JtYXQoIkV4cGVjdGVkIGZhaWwgZm9yICVzIiwgVEVTVF8xKSwgVGVzdFN0YXR1cy5GQUlMLAotICAgICAgICAgICAgICAgIGZpbmFsVGVzdFJlc3VsdDEuZ2V0UmVzdWx0U3RhdHVzKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZmluYWxUZXN0UmVzdWx0MS5nZXRTdGFja1RyYWNlKCksIFNUQUNLX1RSQUNFKTsKLQotICAgICAgICAvLyBUZXN0IDIgZGV0YWlscwotICAgICAgICBJVGVzdFJlc3VsdCBmaW5hbFRlc3RSZXN1bHQyID0gY2FzZTEuZ2V0UmVzdWx0KE1FVEhPRF8yKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChTdHJpbmcuZm9ybWF0KCJFeHBlY3RlZCByZXN1bHQgZm9yICVzIiwgVEVTVF8yKSwgZmluYWxUZXN0UmVzdWx0Mik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmcuZm9ybWF0KCJFeHBlY3RlZCBwYXNzIGZvciAlcyIsIFRFU1RfMiksIFRlc3RTdGF0dXMuUEFTUywKLSAgICAgICAgICAgICAgICBmaW5hbFRlc3RSZXN1bHQyLmdldFJlc3VsdFN0YXR1cygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmV0cnlDYW5TZXREb25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1SZXBvcnRlci5pbnZvY2F0aW9uU3RhcnRlZChtQ29udGV4dCk7Ci0gICAgICAgIC8vIFNldCBtQ2FuTWFya0RvbmUgZGlyZWN0bHkgKG90aGVyd2lzZSB3ZSBtdXN0IGJ1aWxkIHJlc3VsdCBkaXJlY3RvcnksIHdyaXRlIFhNTCwgYW5kCi0gICAgICAgIC8vIHBlcmZvcm0gYWN0dWFsIHJldHJ5KQotICAgICAgICBtUmVwb3J0ZXIubUNhbk1hcmtEb25lID0gdHJ1ZTsKLSAgICAgICAgLy8gU2V0IHVwIElJbnZvY2F0aW9uUmVzdWx0IHdpdGggZXhpc3RpbmcgcmVzdWx0cyBmcm9tIHByZXZpb3VzIHNlc3Npb24KLSAgICAgICAgSUludm9jYXRpb25SZXN1bHQgaW52b2NhdGlvblJlc3VsdCA9IG1SZXBvcnRlci5nZXRSZXN1bHQoKTsKLSAgICAgICAgSU1vZHVsZVJlc3VsdCBtb2R1bGVSZXN1bHQgPSBpbnZvY2F0aW9uUmVzdWx0LmdldE9yQ3JlYXRlTW9kdWxlKElEKTsKLSAgICAgICAgbW9kdWxlUmVzdWx0LmluaXRpYWxpemVEb25lKGZhbHNlKTsKLSAgICAgICAgSUNhc2VSZXN1bHQgY2FzZVJlc3VsdCA9IG1vZHVsZVJlc3VsdC5nZXRPckNyZWF0ZVJlc3VsdChDTEFTUyk7Ci0gICAgICAgIElUZXN0UmVzdWx0IHRlc3RSZXN1bHQxID0gY2FzZVJlc3VsdC5nZXRPckNyZWF0ZVJlc3VsdChNRVRIT0RfMSk7Ci0gICAgICAgIHRlc3RSZXN1bHQxLnNldFJlc3VsdFN0YXR1cyhUZXN0U3RhdHVzLlBBU1MpOwotICAgICAgICB0ZXN0UmVzdWx0MS5zZXRSZXRyeSh0cnVlKTsKLSAgICAgICAgSVRlc3RSZXN1bHQgdGVzdFJlc3VsdDIgPSBjYXNlUmVzdWx0LmdldE9yQ3JlYXRlUmVzdWx0KE1FVEhPRF8yKTsKLSAgICAgICAgdGVzdFJlc3VsdDIuc2V0UmVzdWx0U3RhdHVzKFRlc3RTdGF0dXMuRkFJTCk7Ci0gICAgICAgIHRlc3RSZXN1bHQyLnNldFN0YWNrVHJhY2UoU1RBQ0tfVFJBQ0UpOwotICAgICAgICB0ZXN0UmVzdWx0Mi5zZXRSZXRyeSh0cnVlKTsKLQotICAgICAgICAvLyBBc3N1bWUgbm8gYWRkaXRpb25hbCBmaWx0ZXJpbmcgaXMgYXBwbGllZCB0byByZXRyeSwgYW5kIGFsbCB0ZXN0cyBmb3IgdGhlIG1vZHVsZSBoYXZlCi0gICAgICAgIC8vIGJlZW4gY29sbGVjdGVkLiBUaHVzLCBtb2R1bGUgImRvbmUiIHZhbHVlIHNob3VsZCBzd2l0Y2guCi0gICAgICAgIG1SZXBvcnRlci50ZXN0UnVuU3RhcnRlZChJRCwgMSk7Ci0KLSAgICAgICAgVGVzdElkZW50aWZpZXIgdGVzdDIgPSBuZXcgVGVzdElkZW50aWZpZXIoQ0xBU1MsIE1FVEhPRF8yKTsKLSAgICAgICAgbVJlcG9ydGVyLnRlc3RTdGFydGVkKHRlc3QyKTsKLSAgICAgICAgbVJlcG9ydGVyLnRlc3RFbmRlZCh0ZXN0MiwgbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCkpOwotCi0gICAgICAgIG1SZXBvcnRlci50ZXN0UnVuRW5kZWQoMTAsIG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpKTsKLSAgICAgICAgbVJlcG9ydGVyLmludm9jYXRpb25FbmRlZCgxMCk7Ci0KLSAgICAgICAgLy8gVmVyaWZpY2F0aW9uIHRoYXQgcmVzdWx0cyBoYXZlIGJlZW4gb3ZlcndyaXR0ZW4uCi0gICAgICAgIElJbnZvY2F0aW9uUmVzdWx0IHJlc3VsdCA9IG1SZXBvcnRlci5nZXRSZXN1bHQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCAyIHBhc3MiLCAyLCByZXN1bHQuY291bnRSZXN1bHRzKFRlc3RTdGF0dXMuUEFTUykpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIDAgZmFpbHVyZXMiLCAwLCByZXN1bHQuY291bnRSZXN1bHRzKFRlc3RTdGF0dXMuRkFJTCkpOwotICAgICAgICBMaXN0PElNb2R1bGVSZXN1bHQ+IG1vZHVsZXMgPSByZXN1bHQuZ2V0TW9kdWxlcygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIDEgbW9kdWxlIiwgMSwgbW9kdWxlcy5zaXplKCkpOwotICAgICAgICBJTW9kdWxlUmVzdWx0IG1vZHVsZSA9IG1vZHVsZXMuZ2V0KDApOwotICAgICAgICBhc3NlcnRUcnVlKCJNb2R1bGUgc2hvdWxkIGJlIG1hcmtlZCBkb25lIiwgbW9kdWxlLmlzRG9uZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmV0cnlDYW5ub3RTZXREb25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1SZXBvcnRlci5pbnZvY2F0aW9uU3RhcnRlZChtQ29udGV4dCk7Ci0gICAgICAgIC8vIFNldCBtQ2FuTWFya0RvbmUgZGlyZWN0bHkgKG90aGVyd2lzZSB3ZSBtdXN0IGJ1aWxkIHJlc3VsdCBkaXJlY3RvcnksIHdyaXRlIFhNTCwgYW5kCi0gICAgICAgIC8vIHBlcmZvcm0gYWN0dWFsIHJldHJ5KQotICAgICAgICBtUmVwb3J0ZXIubUNhbk1hcmtEb25lID0gZmFsc2U7Ci0gICAgICAgIC8vIFNldCB1cCBJSW52b2NhdGlvblJlc3VsdCB3aXRoIGV4aXN0aW5nIHJlc3VsdHMgZnJvbSBwcmV2aW91cyBzZXNzaW9uCi0gICAgICAgIElJbnZvY2F0aW9uUmVzdWx0IGludm9jYXRpb25SZXN1bHQgPSBtUmVwb3J0ZXIuZ2V0UmVzdWx0KCk7Ci0gICAgICAgIElNb2R1bGVSZXN1bHQgbW9kdWxlUmVzdWx0ID0gaW52b2NhdGlvblJlc3VsdC5nZXRPckNyZWF0ZU1vZHVsZShJRCk7Ci0gICAgICAgIG1vZHVsZVJlc3VsdC5zZXREb25lKGZhbHNlKTsKLSAgICAgICAgSUNhc2VSZXN1bHQgY2FzZVJlc3VsdCA9IG1vZHVsZVJlc3VsdC5nZXRPckNyZWF0ZVJlc3VsdChDTEFTUyk7Ci0gICAgICAgIElUZXN0UmVzdWx0IHRlc3RSZXN1bHQxID0gY2FzZVJlc3VsdC5nZXRPckNyZWF0ZVJlc3VsdChNRVRIT0RfMSk7Ci0gICAgICAgIHRlc3RSZXN1bHQxLnNldFJlc3VsdFN0YXR1cyhUZXN0U3RhdHVzLlBBU1MpOwotICAgICAgICB0ZXN0UmVzdWx0MS5zZXRSZXRyeSh0cnVlKTsKLSAgICAgICAgSVRlc3RSZXN1bHQgdGVzdFJlc3VsdDIgPSBjYXNlUmVzdWx0LmdldE9yQ3JlYXRlUmVzdWx0KE1FVEhPRF8yKTsKLSAgICAgICAgdGVzdFJlc3VsdDIuc2V0UmVzdWx0U3RhdHVzKFRlc3RTdGF0dXMuRkFJTCk7Ci0gICAgICAgIHRlc3RSZXN1bHQyLnNldFN0YWNrVHJhY2UoU1RBQ0tfVFJBQ0UpOwotICAgICAgICB0ZXN0UmVzdWx0Mi5zZXRSZXRyeSh0cnVlKTsKLQotICAgICAgICAvLyBTaW5jZSB1c2luZyByZXRyeS10eXBlIGZhaWxlZCBvcHRpb24sIHdlIG9ubHkgcnVuIHByZXZpb3VzbHkgZmFpbGVkIHRlc3QKLSAgICAgICAgLy8gYW5kIGRvbid0IHJ1biBhbnkgbm9uLWV4ZWN1dGVkIHRlc3RzLCBzbyBtb2R1bGUgImRvbmUiIHZhbHVlIHNob3VsZCBub3Qgc3dpdGNoLgotICAgICAgICBtUmVwb3J0ZXIudGVzdFJ1blN0YXJ0ZWQoSUQsIDEpOwotCi0gICAgICAgIFRlc3RJZGVudGlmaWVyIHRlc3QyID0gbmV3IFRlc3RJZGVudGlmaWVyKENMQVNTLCBNRVRIT0RfMik7Ci0gICAgICAgIG1SZXBvcnRlci50ZXN0U3RhcnRlZCh0ZXN0Mik7Ci0gICAgICAgIG1SZXBvcnRlci50ZXN0RW5kZWQodGVzdDIsIG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpKTsKLQotICAgICAgICBtUmVwb3J0ZXIudGVzdFJ1bkVuZGVkKDEwLCBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKSk7Ci0gICAgICAgIG1SZXBvcnRlci5pbnZvY2F0aW9uRW5kZWQoMTApOwotCi0gICAgICAgIC8vIFZlcmlmaWNhdGlvbiB0aGF0IHJlc3VsdHMgaGF2ZSBiZWVuIG92ZXJ3cml0dGVuLgotICAgICAgICBJSW52b2NhdGlvblJlc3VsdCByZXN1bHQgPSBtUmVwb3J0ZXIuZ2V0UmVzdWx0KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRXhwZWN0ZWQgMiBwYXNzIiwgMiwgcmVzdWx0LmNvdW50UmVzdWx0cyhUZXN0U3RhdHVzLlBBU1MpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCAwIGZhaWx1cmVzIiwgMCwgcmVzdWx0LmNvdW50UmVzdWx0cyhUZXN0U3RhdHVzLkZBSUwpKTsKLSAgICAgICAgTGlzdDxJTW9kdWxlUmVzdWx0PiBtb2R1bGVzID0gcmVzdWx0LmdldE1vZHVsZXMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCAxIG1vZHVsZSIsIDEsIG1vZHVsZXMuc2l6ZSgpKTsKLSAgICAgICAgSU1vZHVsZVJlc3VsdCBtb2R1bGUgPSBtb2R1bGVzLmdldCgwKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIk1vZHVsZSBzaG91bGQgbm90IGJlIG1hcmtlZCBkb25lIiwgbW9kdWxlLmlzRG9uZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzdWx0UmVwb3J0aW5nX21vZHVsZU5vdERvbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbVJlcG9ydGVyLmludm9jYXRpb25TdGFydGVkKG1Db250ZXh0KTsKLSAgICAgICAgbVJlcG9ydGVyLnRlc3RSdW5TdGFydGVkKElELCAyKTsKLSAgICAgICAgVGVzdElkZW50aWZpZXIgdGVzdDEgPSBuZXcgVGVzdElkZW50aWZpZXIoQ0xBU1MsIE1FVEhPRF8xKTsKLSAgICAgICAgbVJlcG9ydGVyLnRlc3RTdGFydGVkKHRlc3QxKTsKLSAgICAgICAgbVJlcG9ydGVyLnRlc3RFbmRlZCh0ZXN0MSwgbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCkpOwotICAgICAgICBtUmVwb3J0ZXIudGVzdFJ1bkZhaWxlZCgiZXJyb3IiKTsKLSAgICAgICAgbVJlcG9ydGVyLnRlc3RSdW5FbmRlZCgxMCwgbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCkpOwotICAgICAgICBtUmVwb3J0ZXIuaW52b2NhdGlvbkVuZGVkKDEwKTsKLSAgICAgICAgSUludm9jYXRpb25SZXN1bHQgcmVzdWx0ID0gbVJlcG9ydGVyLmdldFJlc3VsdCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIDEgcGFzcyIsIDEsIHJlc3VsdC5jb3VudFJlc3VsdHMoVGVzdFN0YXR1cy5QQVNTKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRXhwZWN0ZWQgMCBmYWlsdXJlcyIsIDAsIHJlc3VsdC5jb3VudFJlc3VsdHMoVGVzdFN0YXR1cy5GQUlMKSk7Ci0gICAgICAgIExpc3Q8SU1vZHVsZVJlc3VsdD4gbW9kdWxlcyA9IHJlc3VsdC5nZXRNb2R1bGVzKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRXhwZWN0ZWQgMSBtb2R1bGUiLCAxLCBtb2R1bGVzLnNpemUoKSk7Ci0gICAgICAgIElNb2R1bGVSZXN1bHQgbW9kdWxlID0gbW9kdWxlcy5nZXQoMCk7Ci0KLSAgICAgICAgLy8gRW5zdXJlIG1vZHVsZSBpcyByZXBvcnRlZCBhcyBub3QgZG9uZQotICAgICAgICBhc3NlcnRGYWxzZShtb2R1bGUuaXNEb25lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBJRCIsIElELCBtb2R1bGUuZ2V0SWQoKSk7Ci0gICAgICAgIExpc3Q8SUNhc2VSZXN1bHQ+IGNhc2VSZXN1bHRzID0gbW9kdWxlLmdldFJlc3VsdHMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCAxIHRlc3QgY2FzZSIsIDEsIGNhc2VSZXN1bHRzLnNpemUoKSk7Ci0gICAgICAgIElDYXNlUmVzdWx0IGNhc2VSZXN1bHQgPSBjYXNlUmVzdWx0cy5nZXQoMCk7Ci0gICAgICAgIExpc3Q8SVRlc3RSZXN1bHQ+IHRlc3RSZXN1bHRzID0gY2FzZVJlc3VsdC5nZXRSZXN1bHRzKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRXhwZWN0ZWQgMSB0ZXN0cyIsIDEsIHRlc3RSZXN1bHRzLnNpemUoKSk7Ci0gICAgICAgIElUZXN0UmVzdWx0IHJlc3VsdDEgPSBjYXNlUmVzdWx0LmdldFJlc3VsdChNRVRIT0RfMSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoU3RyaW5nLmZvcm1hdCgiRXhwZWN0ZWQgcmVzdWx0IGZvciAlcyIsIFRFU1RfMSksIHJlc3VsdDEpOwotICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLmZvcm1hdCgiRXhwZWN0ZWQgcGFzcyBmb3IgJXMiLCBURVNUXzEpLCBUZXN0U3RhdHVzLlBBU1MsCi0gICAgICAgICAgICAgICAgcmVzdWx0MS5nZXRSZXN1bHRTdGF0dXMoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlc3VsdFJlcG9ydGluZ19tb2R1bGVOb3REb25lX25vVGVzdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbVJlcG9ydGVyLmludm9jYXRpb25TdGFydGVkKG1Db250ZXh0KTsKLSAgICAgICAgbVJlcG9ydGVyLnRlc3RSdW5TdGFydGVkKElELCAwKTsKLSAgICAgICAgbVJlcG9ydGVyLnRlc3RSdW5GYWlsZWQoImVycm9yIik7IC8vIHRlc3QgcnVuIGZhaWx1cmUgc2hvdWxkIHByZXZlbnQgbWFya2luZyBtb2R1bGUgImRvbmUiCi0gICAgICAgIG1SZXBvcnRlci50ZXN0UnVuRW5kZWQoMTAsIG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpKTsKLSAgICAgICAgbVJlcG9ydGVyLmludm9jYXRpb25FbmRlZCgxMCk7Ci0gICAgICAgIElJbnZvY2F0aW9uUmVzdWx0IHJlc3VsdCA9IG1SZXBvcnRlci5nZXRSZXN1bHQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCAwIHBhc3MiLCAwLCByZXN1bHQuY291bnRSZXN1bHRzKFRlc3RTdGF0dXMuUEFTUykpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIDAgZmFpbHVyZXMiLCAwLCByZXN1bHQuY291bnRSZXN1bHRzKFRlc3RTdGF0dXMuRkFJTCkpOwotICAgICAgICBMaXN0PElNb2R1bGVSZXN1bHQ+IG1vZHVsZXMgPSByZXN1bHQuZ2V0TW9kdWxlcygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIDEgbW9kdWxlIiwgMSwgbW9kdWxlcy5zaXplKCkpOwotICAgICAgICBJTW9kdWxlUmVzdWx0IG1vZHVsZSA9IG1vZHVsZXMuZ2V0KDApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBJRCIsIElELCBtb2R1bGUuZ2V0SWQoKSk7Ci0gICAgICAgIC8vIEVuc3VyZSBtb2R1bGUgaXMgcmVwb3J0ZWQgYXMgbm90IGRvbmUKLSAgICAgICAgYXNzZXJ0RmFsc2UobW9kdWxlLmlzRG9uZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzdWx0UmVwb3J0aW5nX21vZHVsZURvbmVfbm9UZXN0cygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtUmVwb3J0ZXIuaW52b2NhdGlvblN0YXJ0ZWQobUNvbnRleHQpOwotICAgICAgICBtUmVwb3J0ZXIudGVzdFJ1blN0YXJ0ZWQoSUQsIDApOwotICAgICAgICAvLyBMYWNrIG9mIHRlc3QgcnVuIGZhaWx1cmUgc2hvdWxkIGFsbG93IG1vZHVsZSB0byBiZSBtYXJrZWQgImRvbmUiCi0gICAgICAgIG1SZXBvcnRlci50ZXN0UnVuRW5kZWQoMTAsIG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpKTsKLSAgICAgICAgbVJlcG9ydGVyLmludm9jYXRpb25FbmRlZCgxMCk7Ci0gICAgICAgIElJbnZvY2F0aW9uUmVzdWx0IHJlc3VsdCA9IG1SZXBvcnRlci5nZXRSZXN1bHQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCAwIHBhc3MiLCAwLCByZXN1bHQuY291bnRSZXN1bHRzKFRlc3RTdGF0dXMuUEFTUykpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIDAgZmFpbHVyZXMiLCAwLCByZXN1bHQuY291bnRSZXN1bHRzKFRlc3RTdGF0dXMuRkFJTCkpOwotICAgICAgICBMaXN0PElNb2R1bGVSZXN1bHQ+IG1vZHVsZXMgPSByZXN1bHQuZ2V0TW9kdWxlcygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIDEgbW9kdWxlIiwgMSwgbW9kdWxlcy5zaXplKCkpOwotICAgICAgICBJTW9kdWxlUmVzdWx0IG1vZHVsZSA9IG1vZHVsZXMuZ2V0KDApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBJRCIsIElELCBtb2R1bGUuZ2V0SWQoKSk7Ci0gICAgICAgIC8vIEVuc3VyZSBtb2R1bGUgaXMgcmVwb3J0ZWQgYXMgZG9uZQotICAgICAgICBhc3NlcnRUcnVlKG1vZHVsZS5pc0RvbmUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvcHlGb3JtYXR0aW5nRmlsZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZSByZXN1bHREaXIgPSBuZXcgRmlsZShtQnVpbGRIZWxwZXIuZ2V0UmVzdWx0c0RpcigpLCBSRVNVTFRfRElSKTsKLSAgICAgICAgcmVzdWx0RGlyLm1rZGlycygpOwotICAgICAgICBSZXN1bHRSZXBvcnRlci5jb3B5Rm9ybWF0dGluZ0ZpbGVzKHJlc3VsdERpciwgU1VJVEVfTkFNRSk7Ci0gICAgICAgIGZvciAoU3RyaW5nIGZpbGVuYW1lIDogRk9STUFUVElOR19GSUxFUykgewotICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUocmVzdWx0RGlyLCBmaWxlbmFtZSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoIiVzICglcykgd2FzIG5vdCBjcmVhdGVkIiwgZmlsZW5hbWUsIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpLAotICAgICAgICAgICAgICAgICAgICBmaWxlLmV4aXN0cygpICYmIGZpbGUuaXNGaWxlKCkgJiYgZmlsZS5sZW5ndGgoKSA+IDApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRW5zdXJlIHRoYXQgd2hlbiB7QGxpbmsgUmVzdWx0UmVwb3J0ZXIjdGVzdExvZyhTdHJpbmcsIExvZ0RhdGFUeXBlLCBJbnB1dFN0cmVhbVNvdXJjZSl9IGlzCi0gICAgICogY2FsbGVkLCBhIHNpbmdsZSBpbnZvY2F0aW9uIHJlc3VsdCBmb2xkZXIgaXMgY3JlYXRlZCBhbmQgcG9wdWxhdGVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RUZXN0TG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIElucHV0U3RyZWFtU291cmNlIGZha2VEYXRhID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtU291cmNlKCJ0ZXN0Ii5nZXRCeXRlcygpKTsKLSAgICAgICAgbVJlcG9ydGVyLmludm9jYXRpb25TdGFydGVkKG1Db250ZXh0KTsKLSAgICAgICAgbVJlcG9ydGVyLnRlc3RMb2coInRlc3QxIiwgTG9nRGF0YVR5cGUuTE9HQ0FULCBmYWtlRGF0YSk7Ci0gICAgICAgIC8vIGRhdGUgZm9sZGVyCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBtQnVpbGRIZWxwZXIuZ2V0TG9nc0RpcigpLmxpc3QoKS5sZW5ndGgpOwotICAgICAgICAvLyBpbnZfIGZvbGRlcgotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbUJ1aWxkSGVscGVyLmdldExvZ3NEaXIoKS5saXN0RmlsZXMoKVswXS5saXN0KCkubGVuZ3RoKTsKLSAgICAgICAgLy8gYWN0dWFsIGxvZ3MKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1CdWlsZEhlbHBlci5nZXRMb2dzRGlyKCkubGlzdEZpbGVzKClbMF0ubGlzdEZpbGVzKClbMF0ubGlzdCgpLmxlbmd0aCk7Ci0gICAgICAgIG1SZXBvcnRlci50ZXN0TG9nKCJ0ZXN0MiIsIExvZ0RhdGFUeXBlLkxPR0NBVCwgZmFrZURhdGEpOwotICAgICAgICAvLyBkYXRlIGZvbGRlcgotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbUJ1aWxkSGVscGVyLmdldExvZ3NEaXIoKS5saXN0KCkubGVuZ3RoKTsKLSAgICAgICAgLy8gaW52XyBmb2xkZXIKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1CdWlsZEhlbHBlci5nZXRMb2dzRGlyKCkubGlzdEZpbGVzKClbMF0ubGlzdCgpLmxlbmd0aCk7Ci0gICAgICAgIC8vIGFjdHVhbCBsb2dzCi0gICAgICAgIGFzc2VydEVxdWFscygyLCBtQnVpbGRIZWxwZXIuZ2V0TG9nc0RpcigpLmxpc3RGaWxlcygpWzBdLmxpc3RGaWxlcygpWzBdLmxpc3QoKS5sZW5ndGgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVuc3VyZSB0aGF0IHdoZW4ge0BsaW5rIFJlc3VsdFJlcG9ydGVyI3Rlc3RMb2coU3RyaW5nLCBMb2dEYXRhVHlwZSwgSW5wdXRTdHJlYW1Tb3VyY2UpfSBpcwotICAgICAqIGNhbGxlZCBmb3IgaG9zdC1zaWRlIGRldmljZSBpbmZvLCBhIGRldmljZSBpbmZvIGZpbGUgaXMgY3JlYXRlZCBpbiB0aGUgcmVzdWx0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFRlc3RMb2dXaXRoRGV2aWNlSW5mbygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBJbnB1dFN0cmVhbVNvdXJjZSBmYWtlRGF0YSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbVNvdXJjZSgidGVzdCIuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgIFN0cmluZyBkZXZpY2VJbmZvTmFtZSA9IFN0cmluZy5mb3JtYXQoIlRlc3QlcyIsIERldmljZUluZm8uRklMRV9TVUZGSVgpOwotICAgICAgICBtUmVwb3J0ZXIuaW52b2NhdGlvblN0YXJ0ZWQobUNvbnRleHQpOwotICAgICAgICBtUmVwb3J0ZXIudGVzdExvZyhkZXZpY2VJbmZvTmFtZSwgTG9nRGF0YVR5cGUuVEVYVCwgZmFrZURhdGEpOwotICAgICAgICBGaWxlIGRldmljZUluZm9Gb2xkZXIgPSBuZXcgRmlsZShtQnVpbGRIZWxwZXIuZ2V0UmVzdWx0RGlyKCksIERldmljZUluZm8uUkVTVUxUX0RJUl9OQU1FKTsKLSAgICAgICAgLy8gYXNzZXJ0IGRldmljZSBpbmZvIGZvbGRlciB3YXMgY3JlYXRlZAotICAgICAgICBhc3NlcnRUcnVlKGRldmljZUluZm9Gb2xkZXIuZXhpc3RzKCkpOwotICAgICAgICBGaWxlW10gZGV2aWNlSW5mb0ZpbGVzID0gZGV2aWNlSW5mb0ZvbGRlci5saXN0RmlsZXMoKTsKLSAgICAgICAgLy8gYXNzZXJ0IHRoYXQgb25lIGZpbGUgd2FzIHdyaXR0ZW4gdG8gdGhlIGZvbGRlcgotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZGV2aWNlSW5mb0ZpbGVzLmxlbmd0aCk7Ci0gICAgICAgIEZpbGUgZGV2aWNlSW5mb0ZpbGUgPSBkZXZpY2VJbmZvRmlsZXNbMF07Ci0gICAgICAgIC8vIGFzc2VydCBkZXZpY2UgaW5mbyBmaWxlIGhhcyBiZWVuIG5hbWVkIGNvcnJlY3RseQotICAgICAgICBhc3NlcnRFcXVhbHMoZGV2aWNlSW5mb05hbWUsIGRldmljZUluZm9GaWxlLmdldE5hbWUoKSk7Ci0gICAgICAgIC8vIGFzc2VydCBjb250ZW50cyBvZiB0aGUgZmlsZQotICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3QiLCBGaWxlVXRpbC5yZWFkU3RyaW5nRnJvbUZpbGUoZGV2aWNlSW5mb0ZpbGUpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC9yZXN1bHQvU3ViUGxhbkhlbHBlclRlc3QuamF2YSBiL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3Jlc3VsdC9TdWJQbGFuSGVscGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTEyNDExLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3Jlc3VsdC9TdWJQbGFuSGVscGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnJlc3VsdDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLmJ1aWxkLkNvbXBhdGliaWxpdHlCdWlsZEhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5JU3ViUGxhbjsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5TdWJQbGFuOwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuSUNhc2VSZXN1bHQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5JSW52b2NhdGlvblJlc3VsdDsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLklNb2R1bGVSZXN1bHQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5JVGVzdFJlc3VsdDsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkludm9jYXRpb25SZXN1bHQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5SZXN1bHRIYW5kbGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuVGVzdEZpbHRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlRlc3RTdGF0dXM7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuYnVpbGQuQnVpbGRJbmZvOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmJ1aWxkLklCdWlsZEluZm87Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuY29uZmlnLkFyZ3NPcHRpb25QYXJzZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudXRpbC5BYmlVdGlsczsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC51dGlsLkZpbGVVdGlsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotcHVibGljIGNsYXNzIFN1YlBsYW5IZWxwZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgLy8gVmFsdWVzIHVzZWQgdG8gcG9wdWxhdGUgbW9jayByZXN1bHRzCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNVSVRFX05BTUUgPSAiQ1RTIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VJVEVfVkVSU0lPTiA9ICI1LjAiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVUlURV9QTEFOID0gImN0cyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNVSVRFX0JVSUxEID0gIjEyMzQ1IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9BID0gIk1vZHVsZUEiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0IgPSAiTW9kdWxlQiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFCSSA9ICJtaXBzNjQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9BID0gQWJpVXRpbHMuY3JlYXRlSWQoQUJJLCBOQU1FX0EpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9CID0gQWJpVXRpbHMuY3JlYXRlSWQoQUJJLCBOQU1FX0IpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVUlMRF9JRCA9ICJidWlsZF9pZCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVSUxEX1BST0RVQ1QgPSAiYnVpbGRfcHJvZHVjdCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYQU1QTEVfQlVJTERfSUQgPSAiWFlaIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhBTVBMRV9CVUlMRF9QUk9EVUNUID0gIndvbHZlcmluZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFVklDRV9BID0gImRldmljZTEyMyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFVklDRV9CID0gImRldmljZTQ1NiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX0EgPSAiYW5kcm9pZC50ZXN0LkZvb3IiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19CID0gImFuZHJvaWQudGVzdC5CYXIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfMSA9ICJ0ZXN0QmxhaDEiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfMiA9ICJ0ZXN0QmxhaDIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfMyA9ICJ0ZXN0QmxhaDMiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfNCA9ICJ0ZXN0QmxhaDQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgU1RBUlRfTVMgPSAxNDMxNTg2ODAxMDAwTDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEVORF9NUyA9IDE0MzE2NzMxOTkwMDBMOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZFUkVOQ0VfVVJMPSJodHRwOi8vYW5kcm9pZC5jb20iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVVJMID0iZmlsZTovLy9wYXRoL3RvL2xvZ3MiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX0xJTkVfQVJHUyA9ICJjdHMgLW0gQ3RzTXlNb2R1bGVUZXN0Q2FzZXMiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNQX05BTUUgPSAidGVzdHN1YnBsYW4iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTUF9TRVNTSU9OID0gIjAiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTUF9SRVNVTFRfVFlQRV9GQUlMRUQgPSAiZmFpbGVkIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1BfUkVTVUxUX1RZUEVfTk9UX0VYRUNVVEVEID0gIm5vdF9leGVjdXRlZCI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fU1VGRklYID0gIlswXSI7Ci0KLSAgICBwcml2YXRlIENvbXBhdGliaWxpdHlCdWlsZEhlbHBlciBtQnVpbGRIZWxwZXI7Ci0gICAgcHJpdmF0ZSBTdWJQbGFuSGVscGVyIG1TdWJQbGFuSGVscGVyOwotCi0gICAgcHJpdmF0ZSBGaWxlIG1SZXN1bHRzRGlyID0gbnVsbDsKLSAgICBwcml2YXRlIEZpbGUgbVJlc3VsdERpciA9IG51bGw7Ci0gICAgcHJpdmF0ZSBGaWxlIG1TdWJQbGFuc0RpciA9IG51bGw7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtUmVzdWx0c0RpciA9IEZpbGVVdGlsLmNyZWF0ZVRlbXBEaXIoInJlc3VsdHMiKTsKLSAgICAgICAgbVJlc3VsdERpciA9IEZpbGVVdGlsLmNyZWF0ZVRlbXBEaXIoIjEyMzQ1IiwgbVJlc3VsdHNEaXIpOwotICAgICAgICBtU3ViUGxhbnNEaXIgPSBGaWxlVXRpbC5jcmVhdGVUZW1wRGlyKCJzdWJwbGFucyIpOwotICAgICAgICBtQnVpbGRIZWxwZXIgPSBuZXcgU3BjdE1vY2tDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIobmV3IEJ1aWxkSW5mbygiMCIsICIiLCAiIikpOwotICAgICAgICBwb3B1bGF0ZVJlc3VsdHMoKTsKLQotICAgICAgICBtU3ViUGxhbkhlbHBlciA9IG5ldyBTdWJQbGFuSGVscGVyKCk7Ci0gICAgICAgIEFyZ3NPcHRpb25QYXJzZXIgb3B0aW9uUGFyc2VyID0gbmV3IEFyZ3NPcHRpb25QYXJzZXIobVN1YlBsYW5IZWxwZXIpOwotICAgICAgICBvcHRpb25QYXJzZXIucGFyc2UoQXJyYXlzLmFzTGlzdCgKLSAgICAgICAgICAgICItbiIsIFNQX05BTUUsCi0gICAgICAgICAgICAiLS1zZXNzaW9uIiwgU1BfU0VTU0lPTiwKLSAgICAgICAgICAgICItLXJlc3VsdC10eXBlIiwgU1BfUkVTVUxUX1RZUEVfRkFJTEVELAotICAgICAgICAgICAgIi0tcmVzdWx0LXR5cGUiLCBTUF9SRVNVTFRfVFlQRV9OT1RfRVhFQ1VURUQpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAobVJlc3VsdHNEaXIgIT0gbnVsbCkgewotICAgICAgICAgICAgRmlsZVV0aWwucmVjdXJzaXZlRGVsZXRlKG1SZXN1bHRzRGlyKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobVN1YlBsYW5zRGlyICE9IG51bGwpIHsKLSAgICAgICAgICAgIEZpbGVVdGlsLnJlY3Vyc2l2ZURlbGV0ZShtU3ViUGxhbnNEaXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVN1YlBsYW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSVN1YlBsYW4gcGxhbiA9IG1TdWJQbGFuSGVscGVyLmNyZWF0ZVN1YlBsYW4obUJ1aWxkSGVscGVyKTsKLSAgICAgICAgU2V0PFN0cmluZz4gcGxhbkluY2x1ZGVzID0gcGxhbi5nZXRJbmNsdWRlRmlsdGVycygpOwotICAgICAgICBTZXQ8U3RyaW5nPiBwbGFuRXhjbHVkZXMgPSBwbGFuLmdldEV4Y2x1ZGVGaWx0ZXJzKCk7Ci0gICAgICAgIFRlc3RGaWx0ZXIgbWYxID0gbmV3IFRlc3RGaWx0ZXIoQUJJLCBOQU1FX0EsIG51bGwpOwotICAgICAgICBUZXN0RmlsdGVyIHRmMSA9IG5ldyBUZXN0RmlsdGVyKEFCSSwgTkFNRV9BLCBTdHJpbmcuZm9ybWF0KCIlcyMlcyIsIENMQVNTX0EsIE1FVEhPRF8xKSk7Ci0gICAgICAgIFRlc3RGaWx0ZXIgdGYzID0gbmV3IFRlc3RGaWx0ZXIoQUJJLCBOQU1FX0IsIFN0cmluZy5mb3JtYXQoIiVzIyVzIiwgQ0xBU1NfQiwgTUVUSE9EXzMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShwbGFuSW5jbHVkZXMuY29udGFpbnMoIkN0c015TW9kdWxlVGVzdENhc2VzIikpOyAvLyBjb21tYW5kLWxpbmUgJy1tJyBhcmcKLSAgICAgICAgYXNzZXJ0VHJ1ZShwbGFuSW5jbHVkZXMuY29udGFpbnMobWYxLnRvU3RyaW5nKCkpKTsgLy8gaW5jbHVkZSBtb2R1bGUgd2l0aCBub3QtZXhlY3V0ZWQgdGVzdAotICAgICAgICBhc3NlcnRUcnVlKHBsYW5FeGNsdWRlcy5jb250YWlucyh0ZjEudG9TdHJpbmcoKSkpOyAvLyBleGNsdWRlIHBhc3NpbmcgdGVzdCBpbiB0aGF0IG1vZHVsZQotICAgICAgICBhc3NlcnRUcnVlKHBsYW5JbmNsdWRlcy5jb250YWlucyh0ZjMudG9TdHJpbmcoKSkpOyAvLyBpbmNsdWRlIGZhaWx1cmUgaW4gZXhlY3V0ZWQgbW9kdWxlCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZEluY2x1ZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSVN1YlBsYW4gc3ViUGxhbiA9IG5ldyBTdWJQbGFuKCk7Ci0gICAgICAgIFRlc3RGaWx0ZXIgdGYgPSBuZXcgVGVzdEZpbHRlcihBQkksIE5BTUVfQSwgU3RyaW5nLmZvcm1hdCgiJXMjJXMiLCBDTEFTU19BLCBNRVRIT0RfMSkpOwotICAgICAgICBTdWJQbGFuSGVscGVyLmFkZEluY2x1ZGVUb1N1YlBsYW4oc3ViUGxhbiwgdGYpOwotICAgICAgICBTZXQ8U3RyaW5nPiBpbmNsdWRlcyA9IHN1YlBsYW4uZ2V0SW5jbHVkZUZpbHRlcnMoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShpbmNsdWRlcy5jb250YWlucyh0Zi50b1N0cmluZygpKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZEV4Y2x1ZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSVN1YlBsYW4gc3ViUGxhbiA9IG5ldyBTdWJQbGFuKCk7Ci0gICAgICAgIFRlc3RGaWx0ZXIgdGYgPSBuZXcgVGVzdEZpbHRlcihBQkksIE5BTUVfQSwgU3RyaW5nLmZvcm1hdCgiJXMjJXMiLCBDTEFTU19BLCBNRVRIT0RfMSkpOwotICAgICAgICBTdWJQbGFuSGVscGVyLmFkZEV4Y2x1ZGVUb1N1YlBsYW4oc3ViUGxhbiwgdGYpOwotICAgICAgICBTZXQ8U3RyaW5nPiBleGNsdWRlcyA9IHN1YlBsYW4uZ2V0RXhjbHVkZUZpbHRlcnMoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShleGNsdWRlcy5jb250YWlucyh0Zi50b1N0cmluZygpKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZFBhcmFtZXRlcml6ZWRJbmNsdWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIElTdWJQbGFuIHN1YlBsYW4gPSBuZXcgU3ViUGxhbigpOwotICAgICAgICBUZXN0RmlsdGVyIGZpbHRlcldpdGhTdWZmaXggPSBuZXcgVGVzdEZpbHRlcihBQkksIE5BTUVfQSwKLSAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCIlcyMlcyVzIiwgQ0xBU1NfQSwgTUVUSE9EXzEsIFBBUkFNX1NVRkZJWCkpOwotICAgICAgICBUZXN0RmlsdGVyIGZpbHRlcldpdGhvdXRTdWZmaXggPSBuZXcgVGVzdEZpbHRlcihBQkksIE5BTUVfQSwKLSAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCIlcyMlcyIsIENMQVNTX0EsIE1FVEhPRF8xKSk7Ci0gICAgICAgIFN1YlBsYW5IZWxwZXIuYWRkSW5jbHVkZVRvU3ViUGxhbihzdWJQbGFuLCBmaWx0ZXJXaXRoU3VmZml4KTsKLSAgICAgICAgU2V0PFN0cmluZz4gaW5jbHVkZXMgPSBzdWJQbGFuLmdldEluY2x1ZGVGaWx0ZXJzKCk7Ci0gICAgICAgIGFzc2VydFRydWUoaW5jbHVkZXMuY29udGFpbnMoZmlsdGVyV2l0aG91dFN1ZmZpeC50b1N0cmluZygpKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZFBhcmFtZXRlcml6ZWRFeGNsdWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIElTdWJQbGFuIHN1YlBsYW4gPSBuZXcgU3ViUGxhbigpOwotICAgICAgICBUZXN0RmlsdGVyIGZpbHRlcldpdGhTdWZmaXggPSBuZXcgVGVzdEZpbHRlcihBQkksIE5BTUVfQSwKLSAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCIlcyMlcyVzIiwgQ0xBU1NfQSwgTUVUSE9EXzEsIFBBUkFNX1NVRkZJWCkpOwotICAgICAgICBTdWJQbGFuSGVscGVyLmFkZEV4Y2x1ZGVUb1N1YlBsYW4oc3ViUGxhbiwgZmlsdGVyV2l0aFN1ZmZpeCk7Ci0gICAgICAgIFNldDxTdHJpbmc+IGV4Y2x1ZGVzID0gc3ViUGxhbi5nZXRFeGNsdWRlRmlsdGVycygpOwotICAgICAgICBhc3NlcnRUcnVlKGV4Y2x1ZGVzLmlzRW1wdHkoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlUmVzdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBjb3BpZWQgZnJvbSBSZXN1bHRIYW5kbGVyVGVzdAotICAgICAgICBJSW52b2NhdGlvblJlc3VsdCByZXN1bHQgPSBuZXcgSW52b2NhdGlvblJlc3VsdCgpOwotICAgICAgICByZXN1bHQuc2V0U3RhcnRUaW1lKFNUQVJUX01TKTsKLSAgICAgICAgcmVzdWx0LnNldFRlc3RQbGFuKFNVSVRFX1BMQU4pOwotICAgICAgICByZXN1bHQuYWRkRGV2aWNlU2VyaWFsKERFVklDRV9BKTsKLSAgICAgICAgcmVzdWx0LmFkZERldmljZVNlcmlhbChERVZJQ0VfQik7Ci0gICAgICAgIHJlc3VsdC5hZGRJbnZvY2F0aW9uSW5mbyhCVUlMRF9JRCwgRVhBTVBMRV9CVUlMRF9JRCk7Ci0gICAgICAgIHJlc3VsdC5hZGRJbnZvY2F0aW9uSW5mbyhCVUlMRF9QUk9EVUNULCBFWEFNUExFX0JVSUxEX1BST0RVQ1QpOwotICAgICAgICBJTW9kdWxlUmVzdWx0IG1vZHVsZUEgPSByZXN1bHQuZ2V0T3JDcmVhdGVNb2R1bGUoSURfQSk7Ci0gICAgICAgIG1vZHVsZUEuc2V0RG9uZShmYWxzZSk7Ci0gICAgICAgIElDYXNlUmVzdWx0IG1vZHVsZUFDYXNlID0gbW9kdWxlQS5nZXRPckNyZWF0ZVJlc3VsdChDTEFTU19BKTsKLSAgICAgICAgSVRlc3RSZXN1bHQgbW9kdWxlQVRlc3QxID0gbW9kdWxlQUNhc2UuZ2V0T3JDcmVhdGVSZXN1bHQoTUVUSE9EXzEpOwotICAgICAgICBtb2R1bGVBVGVzdDEuc2V0UmVzdWx0U3RhdHVzKFRlc3RTdGF0dXMuUEFTUyk7Ci0gICAgICAgIElUZXN0UmVzdWx0IG1vZHVsZUFUZXN0MiA9IG1vZHVsZUFDYXNlLmdldE9yQ3JlYXRlUmVzdWx0KE1FVEhPRF8yKTsKLSAgICAgICAgbW9kdWxlQVRlc3QyLnNldFJlc3VsdFN0YXR1cyhudWxsKTsgLy8gbm90IGV4ZWN1dGVkIHRlc3QKLQotICAgICAgICBJTW9kdWxlUmVzdWx0IG1vZHVsZUIgPSByZXN1bHQuZ2V0T3JDcmVhdGVNb2R1bGUoSURfQik7Ci0gICAgICAgIG1vZHVsZUIuc2V0RG9uZSh0cnVlKTsKLSAgICAgICAgSUNhc2VSZXN1bHQgbW9kdWxlQkNhc2UgPSBtb2R1bGVCLmdldE9yQ3JlYXRlUmVzdWx0KENMQVNTX0IpOwotICAgICAgICBJVGVzdFJlc3VsdCBtb2R1bGVCVGVzdDMgPSBtb2R1bGVCQ2FzZS5nZXRPckNyZWF0ZVJlc3VsdChNRVRIT0RfMyk7Ci0gICAgICAgIG1vZHVsZUJUZXN0My5zZXRSZXN1bHRTdGF0dXMoVGVzdFN0YXR1cy5GQUlMKTsKLSAgICAgICAgSVRlc3RSZXN1bHQgbW9kdWxlQlRlc3Q0ID0gbW9kdWxlQkNhc2UuZ2V0T3JDcmVhdGVSZXN1bHQoTUVUSE9EXzQpOwotICAgICAgICBtb2R1bGVCVGVzdDQuc2V0UmVzdWx0U3RhdHVzKFRlc3RTdGF0dXMuUEFTUyk7Ci0KLSAgICAgICAgLy8gU2VyaWFsaXplIHRvIGZpbGUKLSAgICAgICAgUmVzdWx0SGFuZGxlci53cml0ZVJlc3VsdHMoU1VJVEVfTkFNRSwgU1VJVEVfVkVSU0lPTiwgU1VJVEVfUExBTiwgU1VJVEVfQlVJTEQsCi0gICAgICAgICAgICAgICAgcmVzdWx0LCBtUmVzdWx0RGlyLCBTVEFSVF9NUywgRU5EX01TLCBSRUZFUkVOQ0VfVVJMLCBMT0dfVVJMLAotICAgICAgICAgICAgICAgIENPTU1BTkRfTElORV9BUkdTKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFNwY3RNb2NrQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyIGV4dGVuZHMgQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyIHsKLQotICAgICAgICBwdWJsaWMgU3BjdE1vY2tDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIoSUJ1aWxkSW5mbyBidWlsZEluZm8pIHsKLSAgICAgICAgICAgIHN1cGVyKGJ1aWxkSW5mbyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEZpbGUgZ2V0UmVzdWx0c0RpcigpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICAgICAgcmV0dXJuIG1SZXN1bHRzRGlyOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBGaWxlIGdldFN1YlBsYW5zRGlyKCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXR1cm4gbVN1YlBsYW5zRGlyOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdGFyZ2V0cHJlcC9NZWRpYVByZXBhcmVyVGVzdC5qYXZhIGIvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdGFyZ2V0cHJlcC9NZWRpYVByZXBhcmVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTVlYzJhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3RhcmdldHByZXAvTWVkaWFQcmVwYXJlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50YXJnZXRwcmVwOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLklEZXZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuYnVpbGQuQnVpbGRJbmZvOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmJ1aWxkLklCdWlsZEluZm87Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuY29uZmlnLk9wdGlvblNldHRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuSVRlc3REZXZpY2U7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWFzeW1vY2suRWFzeU1vY2s7Ci0KLXB1YmxpYyBjbGFzcyBNZWRpYVByZXBhcmVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHByaXZhdGUgTWVkaWFQcmVwYXJlciBtTWVkaWFQcmVwYXJlcjsKLSAgICBwcml2YXRlIElCdWlsZEluZm8gbU1vY2tCdWlsZEluZm87Ci0gICAgcHJpdmF0ZSBJVGVzdERldmljZSBtTW9ja0RldmljZTsKLSAgICBwcml2YXRlIE9wdGlvblNldHRlciBtT3B0aW9uU2V0dGVyOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgbU1lZGlhUHJlcGFyZXIgPSBuZXcgTWVkaWFQcmVwYXJlcigpOwotICAgICAgICBtTW9ja0RldmljZSA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSVRlc3REZXZpY2UuY2xhc3MpOwotICAgICAgICBtTW9ja0J1aWxkSW5mbyA9IG5ldyBCdWlsZEluZm8oIjAiLCAiIik7Ci0gICAgICAgIG1PcHRpb25TZXR0ZXIgPSBuZXcgT3B0aW9uU2V0dGVyKG1NZWRpYVByZXBhcmVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0TW91bnRQb2ludCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBFYXN5TW9jay5leHBlY3QobU1vY2tEZXZpY2UuZ2V0TW91bnRQb2ludChJRGV2aWNlLk1OVF9FWFRFUk5BTF9TVE9SQUdFKSkuYW5kUmV0dXJuKAotICAgICAgICAgICAgICAgICIvc2RjYXJkIikub25jZSgpOwotICAgICAgICBFYXN5TW9jay5yZXBsYXkobU1vY2tEZXZpY2UpOwotICAgICAgICBtTWVkaWFQcmVwYXJlci5zZXRNb3VudFBvaW50KG1Nb2NrRGV2aWNlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG1NZWRpYVByZXBhcmVyLm1CYXNlRGV2aWNlU2hvcnREaXIsICIvc2RjYXJkL3Rlc3QvYmJiX3Nob3J0LyIpOwotICAgICAgICBhc3NlcnRFcXVhbHMobU1lZGlhUHJlcGFyZXIubUJhc2VEZXZpY2VGdWxsRGlyLCAiL3NkY2FyZC90ZXN0L2JiYl9mdWxsLyIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb3B5TWVkaWFGaWxlcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtTWVkaWFQcmVwYXJlci5tTWF4UmVzID0gTWVkaWFQcmVwYXJlci5ERUZBVUxUX01BWF9SRVNPTFVUSU9OOwotICAgICAgICBtTWVkaWFQcmVwYXJlci5tQmFzZURldmljZVNob3J0RGlyID0gIi9zZGNhcmQvdGVzdC9iYmJfc2hvcnQvIjsKLSAgICAgICAgbU1lZGlhUHJlcGFyZXIubUJhc2VEZXZpY2VGdWxsRGlyID0gIi9zZGNhcmQvdGVzdC9iYmJfZnVsbC8iOwotICAgICAgICBtTWVkaWFQcmVwYXJlci5tQmFzZURldmljZUltYWdlc0RpciA9ICIvc2RjYXJkL3Rlc3QvaW1hZ2VzIjsKLSAgICAgICAgZm9yIChNZWRpYVByZXBhcmVyLlJlc29sdXRpb24gcmVzb2x1dGlvbiA6IE1lZGlhUHJlcGFyZXIuUkVTT0xVVElPTlMpIHsKLSAgICAgICAgICAgIFN0cmluZyBzaG9ydEZpbGUgPSBTdHJpbmcuZm9ybWF0KCIlcyVzIiwgbU1lZGlhUHJlcGFyZXIubUJhc2VEZXZpY2VTaG9ydERpciwKLSAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbi50b1N0cmluZygpKTsKLSAgICAgICAgICAgIFN0cmluZyBmdWxsRmlsZSA9IFN0cmluZy5mb3JtYXQoIiVzJXMiLCBtTWVkaWFQcmVwYXJlci5tQmFzZURldmljZUZ1bGxEaXIsCi0gICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24udG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBFYXN5TW9jay5leHBlY3QobU1vY2tEZXZpY2UuZG9lc0ZpbGVFeGlzdChzaG9ydEZpbGUpKS5hbmRSZXR1cm4odHJ1ZSkub25jZSgpOwotICAgICAgICAgICAgRWFzeU1vY2suZXhwZWN0KG1Nb2NrRGV2aWNlLmRvZXNGaWxlRXhpc3QoZnVsbEZpbGUpKS5hbmRSZXR1cm4odHJ1ZSkub25jZSgpOwotICAgICAgICB9Ci0gICAgICAgIEVhc3lNb2NrLmV4cGVjdChtTW9ja0RldmljZS5kb2VzRmlsZUV4aXN0KG1NZWRpYVByZXBhcmVyLm1CYXNlRGV2aWNlSW1hZ2VzRGlyKSkKLSAgICAgICAgICAgICAgICAuYW5kUmV0dXJuKHRydWUpLmFueVRpbWVzKCk7Ci0gICAgICAgIEVhc3lNb2NrLnJlcGxheShtTW9ja0RldmljZSk7Ci0gICAgICAgIG1NZWRpYVByZXBhcmVyLmNvcHlNZWRpYUZpbGVzKG1Nb2NrRGV2aWNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWVkaWFGaWxlc0V4aXN0T25EZXZpY2VUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1NZWRpYVByZXBhcmVyLm1NYXhSZXMgPSBNZWRpYVByZXBhcmVyLkRFRkFVTFRfTUFYX1JFU09MVVRJT047Ci0gICAgICAgIG1NZWRpYVByZXBhcmVyLm1CYXNlRGV2aWNlU2hvcnREaXIgPSAiL3NkY2FyZC90ZXN0L2JiYl9zaG9ydC8iOwotICAgICAgICBtTWVkaWFQcmVwYXJlci5tQmFzZURldmljZUZ1bGxEaXIgPSAiL3NkY2FyZC90ZXN0L2JiYl9mdWxsLyI7Ci0gICAgICAgIG1NZWRpYVByZXBhcmVyLm1CYXNlRGV2aWNlSW1hZ2VzRGlyID0gIi9zZGNhcmQvdGVzdC9pbWFnZXMiOwotICAgICAgICBmb3IgKE1lZGlhUHJlcGFyZXIuUmVzb2x1dGlvbiByZXNvbHV0aW9uIDogTWVkaWFQcmVwYXJlci5SRVNPTFVUSU9OUykgewotICAgICAgICAgICAgU3RyaW5nIHNob3J0RmlsZSA9IFN0cmluZy5mb3JtYXQoIiVzJXMiLCBtTWVkaWFQcmVwYXJlci5tQmFzZURldmljZVNob3J0RGlyLAotICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgU3RyaW5nIGZ1bGxGaWxlID0gU3RyaW5nLmZvcm1hdCgiJXMlcyIsIG1NZWRpYVByZXBhcmVyLm1CYXNlRGV2aWNlRnVsbERpciwKLSAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbi50b1N0cmluZygpKTsKLSAgICAgICAgICAgIEVhc3lNb2NrLmV4cGVjdChtTW9ja0RldmljZS5kb2VzRmlsZUV4aXN0KHNob3J0RmlsZSkpLmFuZFJldHVybih0cnVlKS5hbnlUaW1lcygpOwotICAgICAgICAgICAgRWFzeU1vY2suZXhwZWN0KG1Nb2NrRGV2aWNlLmRvZXNGaWxlRXhpc3QoZnVsbEZpbGUpKS5hbmRSZXR1cm4odHJ1ZSkuYW55VGltZXMoKTsKLSAgICAgICAgfQotICAgICAgICBFYXN5TW9jay5leHBlY3QobU1vY2tEZXZpY2UuZG9lc0ZpbGVFeGlzdChtTWVkaWFQcmVwYXJlci5tQmFzZURldmljZUltYWdlc0RpcikpCi0gICAgICAgICAgICAgICAgLmFuZFJldHVybih0cnVlKS5hbnlUaW1lcygpOwotICAgICAgICBFYXN5TW9jay5yZXBsYXkobU1vY2tEZXZpY2UpOwotICAgICAgICBhc3NlcnRUcnVlKG1NZWRpYVByZXBhcmVyLm1lZGlhRmlsZXNFeGlzdE9uRGV2aWNlKG1Nb2NrRGV2aWNlKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1lZGlhRmlsZXNFeGlzdE9uRGV2aWNlRmFsc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbU1lZGlhUHJlcGFyZXIubU1heFJlcyA9IE1lZGlhUHJlcGFyZXIuREVGQVVMVF9NQVhfUkVTT0xVVElPTjsKLSAgICAgICAgbU1lZGlhUHJlcGFyZXIubUJhc2VEZXZpY2VTaG9ydERpciA9ICIvc2RjYXJkL3Rlc3QvYmJiX3Nob3J0LyI7Ci0gICAgICAgIFN0cmluZyBmaXJzdEZpbGVDaGVja2VkID0gIi9zZGNhcmQvdGVzdC9iYmJfc2hvcnQvMTc2eDE0NCI7Ci0gICAgICAgIEVhc3lNb2NrLmV4cGVjdChtTW9ja0RldmljZS5kb2VzRmlsZUV4aXN0KGZpcnN0RmlsZUNoZWNrZWQpKS5hbmRSZXR1cm4oZmFsc2UpLm9uY2UoKTsKLSAgICAgICAgRWFzeU1vY2sucmVwbGF5KG1Nb2NrRGV2aWNlKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UobU1lZGlhUHJlcGFyZXIubWVkaWFGaWxlc0V4aXN0T25EZXZpY2UobU1vY2tEZXZpY2UpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2tpcE1lZGlhRG93bmxvYWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbU9wdGlvblNldHRlci5zZXRPcHRpb25WYWx1ZSgic2tpcC1tZWRpYS1kb3dubG9hZCIsICJ0cnVlIik7Ci0gICAgICAgIEVhc3lNb2NrLnJlcGxheSgpOwotICAgICAgICBtTWVkaWFQcmVwYXJlci5ydW4obU1vY2tEZXZpY2UsIG1Nb2NrQnVpbGRJbmZvKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3RhcmdldHByZXAvUHJvcGVydHlDaGVja1Rlc3QuamF2YSBiL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3RhcmdldHByZXAvUHJvcGVydHlDaGVja1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE3ZmRlNi4uMDAwMDAwMAotLS0gYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC90YXJnZXRwcmVwL1Byb3BlcnR5Q2hlY2tUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50YXJnZXRwcmVwOwotCi1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuYnVpbGQuRGV2aWNlQnVpbGRJbmZvOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmJ1aWxkLklEZXZpY2VCdWlsZEluZm87Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuY29uZmlnLk9wdGlvblNldHRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuSVRlc3REZXZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5UYXJnZXRTZXR1cEVycm9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVhc3ltb2NrLkVhc3lNb2NrOwotCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlDaGVja1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIFByb3BlcnR5Q2hlY2sgbVByb3BlcnR5Q2hlY2s7Ci0gICAgcHJpdmF0ZSBJRGV2aWNlQnVpbGRJbmZvIG1Nb2NrQnVpbGRJbmZvOwotICAgIHByaXZhdGUgSVRlc3REZXZpY2UgbU1vY2tEZXZpY2U7Ci0gICAgcHJpdmF0ZSBPcHRpb25TZXR0ZXIgbU9wdGlvblNldHRlcjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWSA9ICJyby5tb2NrLnByb3BlcnR5IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUVUFMX1ZBTFVFID0gIm1vY2tfYWN0dWFsX3ZhbHVlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFEX1ZBTFVFID0gIm1vY2tfYmFkX3ZhbHVlIjsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIG1Qcm9wZXJ0eUNoZWNrID0gbmV3IFByb3BlcnR5Q2hlY2soKTsKLSAgICAgICAgbU1vY2tEZXZpY2UgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElUZXN0RGV2aWNlLmNsYXNzKTsKLSAgICAgICAgbU1vY2tCdWlsZEluZm8gPSBuZXcgRGV2aWNlQnVpbGRJbmZvKCIwIiwgIiIsICIiKTsKLSAgICAgICAgbU9wdGlvblNldHRlciA9IG5ldyBPcHRpb25TZXR0ZXIobVByb3BlcnR5Q2hlY2spOwotICAgICAgICBFYXN5TW9jay5leHBlY3QobU1vY2tEZXZpY2UuZ2V0UHJvcGVydHkoUFJPUEVSVFkpKS5hbmRSZXR1cm4oQUNUVUFMX1ZBTFVFKS5hbnlUaW1lcygpOwotICAgICAgICBFYXN5TW9jay5leHBlY3QobU1vY2tEZXZpY2UuZ2V0RGV2aWNlRGVzY3JpcHRvcigpKS5hbmRSZXR1cm4obnVsbCkuYW55VGltZXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2FybmluZ01hdGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1PcHRpb25TZXR0ZXIuc2V0T3B0aW9uVmFsdWUoInByb3BlcnR5LW5hbWUiLCBQUk9QRVJUWSk7Ci0gICAgICAgIG1PcHRpb25TZXR0ZXIuc2V0T3B0aW9uVmFsdWUoImV4cGVjdGVkLXZhbHVlIiwgQUNUVUFMX1ZBTFVFKTsKLSAgICAgICAgbU9wdGlvblNldHRlci5zZXRPcHRpb25WYWx1ZSgidGhyb3ctZXJyb3IiLCAiZmFsc2UiKTsKLSAgICAgICAgRWFzeU1vY2sucmVwbGF5KG1Nb2NrRGV2aWNlKTsKLSAgICAgICAgbVByb3BlcnR5Q2hlY2sucnVuKG1Nb2NrRGV2aWNlLCBtTW9ja0J1aWxkSW5mbyk7IC8vIG5vIHdhcm5pbmdzIG9yIGVycm9ycwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXYXJuaW5nTWlzbWF0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbU9wdGlvblNldHRlci5zZXRPcHRpb25WYWx1ZSgicHJvcGVydHktbmFtZSIsIFBST1BFUlRZKTsKLSAgICAgICAgbU9wdGlvblNldHRlci5zZXRPcHRpb25WYWx1ZSgiZXhwZWN0ZWQtdmFsdWUiLCBCQURfVkFMVUUpOwotICAgICAgICBtT3B0aW9uU2V0dGVyLnNldE9wdGlvblZhbHVlKCJ0aHJvdy1lcnJvciIsICJmYWxzZSIpOwotICAgICAgICBFYXN5TW9jay5yZXBsYXkobU1vY2tEZXZpY2UpOwotICAgICAgICBtUHJvcGVydHlDaGVjay5ydW4obU1vY2tEZXZpY2UsIG1Nb2NrQnVpbGRJbmZvKTsgLy8gc2hvdWxkIG9ubHkgcHJpbnQgYSB3YXJuaW5nCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVycm9yTWF0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbU9wdGlvblNldHRlci5zZXRPcHRpb25WYWx1ZSgicHJvcGVydHktbmFtZSIsIFBST1BFUlRZKTsKLSAgICAgICAgbU9wdGlvblNldHRlci5zZXRPcHRpb25WYWx1ZSgiZXhwZWN0ZWQtdmFsdWUiLCBBQ1RVQUxfVkFMVUUpOwotICAgICAgICBtT3B0aW9uU2V0dGVyLnNldE9wdGlvblZhbHVlKCJ0aHJvdy1lcnJvciIsICJ0cnVlIik7Ci0gICAgICAgIEVhc3lNb2NrLnJlcGxheShtTW9ja0RldmljZSk7Ci0gICAgICAgIG1Qcm9wZXJ0eUNoZWNrLnJ1bihtTW9ja0RldmljZSwgbU1vY2tCdWlsZEluZm8pOyAvLyBubyB3YXJuaW5ncyBvciBlcnJvcnMKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXJyb3JNaXNtYXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtT3B0aW9uU2V0dGVyLnNldE9wdGlvblZhbHVlKCJwcm9wZXJ0eS1uYW1lIiwgUFJPUEVSVFkpOwotICAgICAgICBtT3B0aW9uU2V0dGVyLnNldE9wdGlvblZhbHVlKCJleHBlY3RlZC12YWx1ZSIsIEJBRF9WQUxVRSk7Ci0gICAgICAgIG1PcHRpb25TZXR0ZXIuc2V0T3B0aW9uVmFsdWUoInRocm93LWVycm9yIiwgInRydWUiKTsKLSAgICAgICAgRWFzeU1vY2sucmVwbGF5KG1Nb2NrRGV2aWNlKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1Qcm9wZXJ0eUNoZWNrLnJ1bihtTW9ja0RldmljZSwgbU1vY2tCdWlsZEluZm8pOyAvLyBleHBlY3RpbmcgVGFyZ2V0U2V0dXBFcnJvcgotICAgICAgICAgICAgZmFpbCgiVGFyZ2V0U2V0dXBFcnJvciBleHBlY3RlZCIpOwotICAgICAgICB9IGNhdGNoIChUYXJnZXRTZXR1cEVycm9yIGUpIHsKLSAgICAgICAgICAgIC8vIEV4cGVjdGVkCi0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3RhcmdldHByZXAvU2V0dGluZ3NQcmVwYXJlclRlc3QuamF2YSBiL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3RhcmdldHByZXAvU2V0dGluZ3NQcmVwYXJlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZiYjM5ZS4uMDAwMDAwMAotLS0gYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC90YXJnZXRwcmVwL1NldHRpbmdzUHJlcGFyZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGFyZ2V0cHJlcDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmJ1aWxkLkJ1aWxkSW5mbzsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5idWlsZC5JQnVpbGRJbmZvOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmNvbmZpZy5PcHRpb25TZXR0ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLklUZXN0RGV2aWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuVGFyZ2V0U2V0dXBFcnJvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lYXN5bW9jay5FYXN5TW9jazsKLQotLyoqCi0gKiBUZXN0cyBmb3Ige0BsaW5rIFNldHRpbmdzUHJlcGFyZXJ9Ci0gKi8KLXB1YmxpYyBjbGFzcyBTZXR0aW5nc1ByZXBhcmVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHByaXZhdGUgU2V0dGluZ3NQcmVwYXJlciBtU2V0dGluZ3NQcmVwYXJlcjsKLSAgICBwcml2YXRlIElCdWlsZEluZm8gbU1vY2tCdWlsZEluZm87Ci0gICAgcHJpdmF0ZSBJVGVzdERldmljZSBtTW9ja0RldmljZTsKLSAgICBwcml2YXRlIE9wdGlvblNldHRlciBtT3B0aW9uU2V0dGVyOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNIRUxMX0NNRF9HRVQgPSAic2V0dGluZ3MgZ2V0IEdMT0JBTCBzdGF5X29uX3doaWxlX3BsdWdnZWRfaW4iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSEVMTF9DTURfUFVUXzcgPSAic2V0dGluZ3MgcHV0IEdMT0JBTCBzdGF5X29uX3doaWxlX3BsdWdnZWRfaW4gNyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNIRUxMX0NNRF9QVVRfOCA9ICJzZXR0aW5ncyBwdXQgR0xPQkFMIHN0YXlfb25fd2hpbGVfcGx1Z2dlZF9pbiA4IjsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIG1TZXR0aW5nc1ByZXBhcmVyID0gbmV3IFNldHRpbmdzUHJlcGFyZXIoKTsKLSAgICAgICAgbU1vY2tEZXZpY2UgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElUZXN0RGV2aWNlLmNsYXNzKTsKLSAgICAgICAgRWFzeU1vY2suZXhwZWN0KG1Nb2NrRGV2aWNlLmdldERldmljZURlc2NyaXB0b3IoKSkuYW5kUmV0dXJuKG51bGwpLmFueVRpbWVzKCk7Ci0gICAgICAgIG1Nb2NrQnVpbGRJbmZvID0gbmV3IEJ1aWxkSW5mbygiMCIsICIiLCAiIik7Ci0gICAgICAgIG1PcHRpb25TZXR0ZXIgPSBuZXcgT3B0aW9uU2V0dGVyKG1TZXR0aW5nc1ByZXBhcmVyKTsKLSAgICAgICAgbU9wdGlvblNldHRlci5zZXRPcHRpb25WYWx1ZSgiZGV2aWNlLXNldHRpbmciLCAic3RheV9vbl93aGlsZV9wbHVnZ2VkX2luIik7Ci0gICAgICAgIG1PcHRpb25TZXR0ZXIuc2V0T3B0aW9uVmFsdWUoInNldHRpbmctdHlwZSIsICJnbG9iYWwiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29ycmVjdE9uZUV4cGVjdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEVhc3lNb2NrLmV4cGVjdChtTW9ja0RldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKFNIRUxMX0NNRF9HRVQpKS5hbmRSZXR1cm4oIlxuM1xuIikub25jZSgpOwotICAgICAgICBtT3B0aW9uU2V0dGVyLnNldE9wdGlvblZhbHVlKCJleHBlY3RlZC12YWx1ZXMiLCAiMyIpOwotICAgICAgICBFYXN5TW9jay5yZXBsYXkobU1vY2tEZXZpY2UpOwotICAgICAgICBtU2V0dGluZ3NQcmVwYXJlci5ydW4obU1vY2tEZXZpY2UsIG1Nb2NrQnVpbGRJbmZvKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29ycmVjdE1hbnlFeHBlY3RlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBFYXN5TW9jay5leHBlY3QobU1vY2tEZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZChTSEVMTF9DTURfR0VUKSkuYW5kUmV0dXJuKCJcbjNcbiIpLm9uY2UoKTsKLSAgICAgICAgbU9wdGlvblNldHRlci5zZXRPcHRpb25WYWx1ZSgiZXhwZWN0ZWQtdmFsdWVzIiwgIjIiKTsKLSAgICAgICAgbU9wdGlvblNldHRlci5zZXRPcHRpb25WYWx1ZSgiZXhwZWN0ZWQtdmFsdWVzIiwgIjMiKTsKLSAgICAgICAgbU9wdGlvblNldHRlci5zZXRPcHRpb25WYWx1ZSgiZXhwZWN0ZWQtdmFsdWVzIiwgIjYiKTsKLSAgICAgICAgbU9wdGlvblNldHRlci5zZXRPcHRpb25WYWx1ZSgiZXhwZWN0ZWQtdmFsdWVzIiwgIjciKTsKLSAgICAgICAgRWFzeU1vY2sucmVwbGF5KG1Nb2NrRGV2aWNlKTsKLSAgICAgICAgbVNldHRpbmdzUHJlcGFyZXIucnVuKG1Nb2NrRGV2aWNlLCBtTW9ja0J1aWxkSW5mbyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEluY29ycmVjdE9uZUV4cGVjdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEVhc3lNb2NrLmV4cGVjdChtTW9ja0RldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKFNIRUxMX0NNRF9HRVQpKS5hbmRSZXR1cm4oIlxuMFxuIikub25jZSgpOwotICAgICAgICBtT3B0aW9uU2V0dGVyLnNldE9wdGlvblZhbHVlKCJleHBlY3RlZC12YWx1ZXMiLCAiMyIpOwotICAgICAgICBFYXN5TW9jay5yZXBsYXkobU1vY2tEZXZpY2UpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbVNldHRpbmdzUHJlcGFyZXIucnVuKG1Nb2NrRGV2aWNlLCBtTW9ja0J1aWxkSW5mbyk7Ci0gICAgICAgICAgICBmYWlsKCJUYXJnZXRTZXR1cEVycm9yIGV4cGVjdGVkIik7Ci0gICAgICAgIH0gY2F0Y2ggKFRhcmdldFNldHVwRXJyb3IgZSkgewotICAgICAgICAgICAgLy9FeHBlY3RlZAotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEluY29ycmVjdE1hbnlFeHBlY3RlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBFYXN5TW9jay5leHBlY3QobU1vY2tEZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZChTSEVMTF9DTURfR0VUKSkuYW5kUmV0dXJuKCJcbjBcbiIpLm9uY2UoKTsKLSAgICAgICAgbU9wdGlvblNldHRlci5zZXRPcHRpb25WYWx1ZSgiZXhwZWN0ZWQtdmFsdWVzIiwgIjIiKTsKLSAgICAgICAgbU9wdGlvblNldHRlci5zZXRPcHRpb25WYWx1ZSgiZXhwZWN0ZWQtdmFsdWVzIiwgIjMiKTsKLSAgICAgICAgbU9wdGlvblNldHRlci5zZXRPcHRpb25WYWx1ZSgiZXhwZWN0ZWQtdmFsdWVzIiwgIjYiKTsKLSAgICAgICAgbU9wdGlvblNldHRlci5zZXRPcHRpb25WYWx1ZSgiZXhwZWN0ZWQtdmFsdWVzIiwgIjciKTsKLSAgICAgICAgRWFzeU1vY2sucmVwbGF5KG1Nb2NrRGV2aWNlKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1TZXR0aW5nc1ByZXBhcmVyLnJ1bihtTW9ja0RldmljZSwgbU1vY2tCdWlsZEluZm8pOwotICAgICAgICAgICAgZmFpbCgiVGFyZ2V0U2V0dXBFcnJvciBleHBlY3RlZCIpOwotICAgICAgICB9IGNhdGNoIChUYXJnZXRTZXR1cEVycm9yIGUpIHsKLSAgICAgICAgICAgIC8vRXhwZWN0ZWQKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb21tYW5kUnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEVhc3lNb2NrLmV4cGVjdChtTW9ja0RldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKFNIRUxMX0NNRF9QVVRfNykpLmFuZFJldHVybigiXG4iKTsKLSAgICAgICAgbU9wdGlvblNldHRlci5zZXRPcHRpb25WYWx1ZSgic2V0LXZhbHVlIiwgIjciKTsKLSAgICAgICAgRWFzeU1vY2sucmVwbGF5KG1Nb2NrRGV2aWNlKTsKLSAgICAgICAgbVNldHRpbmdzUHJlcGFyZXIucnVuKG1Nb2NrRGV2aWNlLCBtTW9ja0J1aWxkSW5mbyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvbW1hbmRSdW5Xcm9uZ1NldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEVhc3lNb2NrLmV4cGVjdChtTW9ja0RldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKFNIRUxMX0NNRF9QVVRfOCkpLmFuZFJldHVybigiXG4iKTsKLSAgICAgICAgbU9wdGlvblNldHRlci5zZXRPcHRpb25WYWx1ZSgic2V0LXZhbHVlIiwgIjgiKTsKLSAgICAgICAgbU9wdGlvblNldHRlci5zZXRPcHRpb25WYWx1ZSgiZXhwZWN0ZWQtdmFsdWVzIiwgIjciKTsKLSAgICAgICAgRWFzeU1vY2sucmVwbGF5KG1Nb2NrRGV2aWNlKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1TZXR0aW5nc1ByZXBhcmVyLnJ1bihtTW9ja0RldmljZSwgbU1vY2tCdWlsZEluZm8pOwotICAgICAgICAgICAgZmFpbCgiVGFyZ2V0U2V0dXBFcnJvciBleHBlY3RlZCIpOwotICAgICAgICB9IGNhdGNoIChUYXJnZXRTZXR1cEVycm9yIGUpIHsKLSAgICAgICAgICAgIC8vRXhwZWN0ZWQKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbmNvcnJlY3RPbmVFeHBlY3RlZENvbW1hbmRSdW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRWFzeU1vY2suZXhwZWN0KG1Nb2NrRGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoU0hFTExfQ01EX0dFVCkpLmFuZFJldHVybigiXG4wXG4iKS5vbmNlKCk7Ci0gICAgICAgIEVhc3lNb2NrLmV4cGVjdChtTW9ja0RldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKFNIRUxMX0NNRF9QVVRfNykpLmFuZFJldHVybigiXG4iKTsKLSAgICAgICAgbU9wdGlvblNldHRlci5zZXRPcHRpb25WYWx1ZSgic2V0LXZhbHVlIiwgIjciKTsKLSAgICAgICAgbU9wdGlvblNldHRlci5zZXRPcHRpb25WYWx1ZSgiZXhwZWN0ZWQtdmFsdWVzIiwgIjciKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3Rlc3R0eXBlL0NvbXBhdGliaWxpdHlIb3N0VGVzdEJhc2VUZXN0LmphdmEgYi9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC90ZXN0dHlwZS9Db21wYXRpYmlsaXR5SG9zdFRlc3RCYXNlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmQwNWZjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3Rlc3R0eXBlL0NvbXBhdGliaWxpdHlIb3N0VGVzdEJhc2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGVzdHR5cGU7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuSURldmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIudGVzdHJ1bm5lci5SZW1vdGVBbmRyb2lkVGVzdFJ1bm5lcjsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIudGVzdHJ1bm5lci5UZXN0SWRlbnRpZmllcjsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIudGVzdHJ1bm5lci5UZXN0UnVuUmVzdWx0OwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmJ1aWxkLklCdWlsZEluZm87Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLklUZXN0RGV2aWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnJlc3VsdC5Db2xsZWN0aW5nVGVzdExpc3RlbmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnJlc3VsdC5JVGVzdEludm9jYXRpb25MaXN0ZW5lcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5yZXN1bHQuSlVuaXQ0UmVzdWx0Rm9yd2FyZGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkRldmljZUpVbml0NENsYXNzUnVubmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLklBYmk7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSUFiaVJlY2VpdmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLklCdWlsZFJlY2VpdmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLklEZXZpY2VUZXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVhc3ltb2NrLkVhc3lNb2NrOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuSlVuaXRDb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUmVxdWVzdDsKLWltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5uZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLS8qKgotICogVGVzdHMgZm9yIHRoZSBDb21wYXRpYmlsaXR5SG9zdFRlc3RCYXNlIGNsYXNzLgotICovCi1wdWJsaWMgY2xhc3MgQ29tcGF0aWJpbGl0eUhvc3RUZXN0QmFzZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVWSUNFX1RFU1RfUEtHID0gImNvbS5hbmRyb2lkLmZvbyI7Ci0KLSAgICBAUnVuV2l0aChEZXZpY2VKVW5pdDRDbGFzc1J1bm5lci5jbGFzcykKLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1vY2tUZXN0IGV4dGVuZHMgQ29tcGF0aWJpbGl0eUhvc3RUZXN0QmFzZSB7Ci0KLSAgICAgICAgQFRlc3QKLSAgICAgICAgcHVibGljIHZvaWQgdGVzdFJ1bkRldmljZVRlc3RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBydW5EZXZpY2VUZXN0cyhERVZJQ0VfVEVTVF9QS0csIG51bGwsIG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBDb2xsZWN0aW5nVGVzdExpc3RlbmVyIGNyZWF0ZUNvbGxlY3RpbmdMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQ29sbGVjdGluZ1Rlc3RMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgVGVzdFJ1blJlc3VsdCBnZXRDdXJyZW50UnVuUmVzdWx0cygpIHsKLSAgICAgICAgICAgICAgICAgICAgVGVzdFJ1blJlc3VsdCByZXN1bHQgPSBuZXcgVGVzdFJ1blJlc3VsdCgpOwotICAgICAgICAgICAgICAgICAgICBUZXN0SWRlbnRpZmllciB0MSA9IG5ldyBUZXN0SWRlbnRpZmllcigiY2xhc3MxIiwgInRlc3QxIik7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC50ZXN0U3RhcnRlZCh0MSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC50ZXN0RW5kZWQodDEsIENvbGxlY3Rpb25zLmVtcHR5TWFwKCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSdW5Nb2NrRGV2aWNlVGVzdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgVGVzdElkZW50aWZpZXIgdGVzdFJ1bkRldmljZVRlc3RzID0KLSAgICAgICAgICAgICAgICBuZXcgVGVzdElkZW50aWZpZXIoTW9ja1Rlc3QuY2xhc3MuZ2V0TmFtZSgpLCAidGVzdFJ1bkRldmljZVRlc3RzIik7Ci0KLSAgICAgICAgSVRlc3RJbnZvY2F0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBFYXN5TW9jay5jcmVhdGVTdHJpY3RNb2NrKElUZXN0SW52b2NhdGlvbkxpc3RlbmVyLmNsYXNzKTsKLSAgICAgICAgSVRlc3REZXZpY2UgZGV2aWNlID0gRWFzeU1vY2suY3JlYXRlTW9jayhJVGVzdERldmljZS5jbGFzcyk7Ci0KLSAgICAgICAgbGlzdGVuZXIudGVzdFN0YXJ0ZWQodGVzdFJ1bkRldmljZVRlc3RzKTsKLSAgICAgICAgRWFzeU1vY2suZXhwZWN0KGRldmljZS5nZXRJRGV2aWNlKCkpLmFuZFJldHVybihFYXN5TW9jay5jcmVhdGVNb2NrKElEZXZpY2UuY2xhc3MpKS5vbmNlKCk7Ci0gICAgICAgIEVhc3lNb2NrLmV4cGVjdChkZXZpY2UucnVuSW5zdHJ1bWVudGF0aW9uVGVzdHMoKFJlbW90ZUFuZHJvaWRUZXN0UnVubmVyKQotICAgICAgICAgICAgICAgIEVhc3lNb2NrLmFueU9iamVjdCgpLCAoQ29sbGVjdGluZ1Rlc3RMaXN0ZW5lcikgRWFzeU1vY2suYW55T2JqZWN0KCkpKS5hbmRSZXR1cm4oCi0gICAgICAgICAgICAgICAgdHJ1ZSkub25jZSgpOwotICAgICAgICBsaXN0ZW5lci50ZXN0RW5kZWQodGVzdFJ1bkRldmljZVRlc3RzLCBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpKTsKLSAgICAgICAgRWFzeU1vY2sucmVwbGF5KGxpc3RlbmVyLCBkZXZpY2UpOwotCi0gICAgICAgIEpVbml0Q29yZSBydW5uZXJDb3JlID0gbmV3IEpVbml0Q29yZSgpOwotICAgICAgICBydW5uZXJDb3JlLmFkZExpc3RlbmVyKG5ldyBKVW5pdDRSZXN1bHRGb3J3YXJkZXIobGlzdGVuZXIpKTsKLSAgICAgICAgUnVubmVyIGNoZWNrUnVubmVyID0gUmVxdWVzdC5hQ2xhc3MoTW9ja1Rlc3QuY2xhc3MpLmdldFJ1bm5lcigpOwotICAgICAgICAoKElEZXZpY2VUZXN0KSBjaGVja1J1bm5lcikuc2V0RGV2aWNlKGRldmljZSk7Ci0gICAgICAgICgoSUJ1aWxkUmVjZWl2ZXIpIGNoZWNrUnVubmVyKS5zZXRCdWlsZChFYXN5TW9jay5jcmVhdGVNb2NrKElCdWlsZEluZm8uY2xhc3MpKTsKLSAgICAgICAgKChJQWJpUmVjZWl2ZXIpIGNoZWNrUnVubmVyKS5zZXRBYmkoRWFzeU1vY2suY3JlYXRlTW9jayhJQWJpLmNsYXNzKSk7Ci0gICAgICAgIHJ1bm5lckNvcmUucnVuKGNoZWNrUnVubmVyKTsKLSAgICAgICAgRWFzeU1vY2sudmVyaWZ5KGxpc3RlbmVyLCBkZXZpY2UpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdGVzdHR5cGUvQ29tcGF0aWJpbGl0eVRlc3RUZXN0LmphdmEgYi9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC90ZXN0dHlwZS9Db21wYXRpYmlsaXR5VGVzdFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY0MDJlMS4uMDAwMDAwMAotLS0gYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC90ZXN0dHlwZS9Db21wYXRpYmlsaXR5VGVzdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGVzdHR5cGU7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5jb25maWcuT3B0aW9uU2V0dGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5EZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLklUZXN0RGV2aWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmxvZy5JVGVzdExvZ2dlcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5yZXN1bHQuQnl0ZUFycmF5SW5wdXRTdHJlYW1Tb3VyY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQucmVzdWx0LklUZXN0SW52b2NhdGlvbkxpc3RlbmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnJlc3VsdC5JbnB1dFN0cmVhbVNvdXJjZTsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5yZXN1bHQuTG9nRGF0YVR5cGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuc3VpdGUuY2hlY2tlci5JU3lzdGVtU3RhdHVzQ2hlY2tlcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JQWJpOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnV0aWwuQWJpVXRpbHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWFzeW1vY2suRWFzeU1vY2s7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogVGVzdCBjbGFzcyBmb3Ige0BsaW5rIENvbXBhdGliaWxpdHlUZXN0fQotICovCi1wdWJsaWMgY2xhc3MgQ29tcGF0aWJpbGl0eVRlc3RUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZBS0VfSE9TVF9BUkNIID0gImFybSI7Ci0gICAgcHJpdmF0ZSBDb21wYXRpYmlsaXR5VGVzdCBtVGVzdDsKLSAgICBwcml2YXRlIElUZXN0RGV2aWNlIG1Nb2NrRGV2aWNlOwotICAgIHByaXZhdGUgSVRlc3RMb2dnZXIgbU1vY2tMb2dnZXI7Ci0gICAgcHJpdmF0ZSBJVGVzdEludm9jYXRpb25MaXN0ZW5lciBtTW9ja0xpc3RlbmVyOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbVRlc3QgPSBuZXcgQ29tcGF0aWJpbGl0eVRlc3QoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHByb3RlY3RlZCBTZXQ8U3RyaW5nPiBnZXRBYmlzRm9yQnVpbGRUYXJnZXRBcmNoKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBBYmlVdGlscy5nZXRBYmlzRm9yQXJjaChGQUtFX0hPU1RfQVJDSCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIG1Nb2NrRGV2aWNlID0gRWFzeU1vY2suY3JlYXRlTW9jayhJVGVzdERldmljZS5jbGFzcyk7Ci0gICAgICAgIG1UZXN0LnNldERldmljZShtTW9ja0RldmljZSk7Ci0gICAgICAgIG1Nb2NrTG9nZ2VyID0gRWFzeU1vY2suY3JlYXRlTW9jayhJVGVzdExvZ2dlci5jbGFzcyk7Ci0gICAgICAgIG1Nb2NrTGlzdGVuZXIgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElUZXN0SW52b2NhdGlvbkxpc3RlbmVyLmNsYXNzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHRoYXQge0BsaW5rIENvbXBhdGliaWxpdHlUZXN0I2dldEFiaXMoKX0gaXMgcmV0dXJuaW5nIGEgcHJvcGVyIGludGVyc2VjdGlvbiBvZiBDVFMKLSAgICAgKiBzdXBwb3J0ZWQgYXJjaGl0ZWN0dXJlcyBhbmQgRGV2aWNlIHN1cHBvcnRlZCBhcmNoaXRlY3R1cmVzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBYmlzKCkgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIEVhc3lNb2NrLmV4cGVjdChtTW9ja0RldmljZS5nZXRQcm9wZXJ0eShFYXN5TW9jay5lcSgicm8ucHJvZHVjdC5jcHUuYWJpbGlzdCIpKSkKLSAgICAgICAgICAgICAgICAuYW5kUmV0dXJuKCJhcm02NC12OGEsYXJtZWFiaS12N2EsYXJtZWFiaSIpOwotICAgICAgICBTZXQ8U3RyaW5nPiBleHBlY3RlZEFiaXMgPSBuZXcgSGFzaFNldDw+KCk7Ci0gICAgICAgIGV4cGVjdGVkQWJpcy5hZGQoImFybTY0LXY4YSIpOwotICAgICAgICBleHBlY3RlZEFiaXMuYWRkKCJhcm1lYWJpLXY3YSIpOwotICAgICAgICBFYXN5TW9jay5yZXBsYXkobU1vY2tEZXZpY2UpOwotICAgICAgICBTZXQ8SUFiaT4gcmVzID0gbVRlc3QuZ2V0QWJpcygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcmVzLnNpemUoKSk7Ci0gICAgICAgIGZvciAoSUFiaSBhYmkgOiByZXMpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhwZWN0ZWRBYmlzLmNvbnRhaW5zKGFiaS5nZXROYW1lKCkpKTsKLSAgICAgICAgfQotICAgICAgICBFYXN5TW9jay52ZXJpZnkobU1vY2tEZXZpY2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgdGhhdCB7QGxpbmsgQ29tcGF0aWJpbGl0eVRlc3QjZ2V0QWJpcygpfSBpcyB0aHJvd2luZyBhbiBleGNlcHRpb24gd2hlbiBub25lIG9mIHRoZQotICAgICAqIENUUyBidWlsZCBzdXBwb3J0ZWQgYWJpIG1hdGNoIHRoZSBkZXZpY2UgYWJpLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBYmlzX25vdFN1cHBvcnRlZCgpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBFYXN5TW9jay5leHBlY3QobU1vY2tEZXZpY2UuZ2V0UHJvcGVydHkoRWFzeU1vY2suZXEoInJvLnByb2R1Y3QuY3B1LmFiaWxpc3QiKSkpCi0gICAgICAgICAgICAgICAgLmFuZFJldHVybigiYXJtZWFiaSIpOwotICAgICAgICBFYXN5TW9jay5yZXBsYXkobU1vY2tEZXZpY2UpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbVRlc3QuZ2V0QWJpcygpOwotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbiIpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJOb25lIG9mIHRoZSBhYmkgc3VwcG9ydGVkIGJ5IHRoaXMgQ1RTIGJ1aWxkICgnW2FybWVhYmktdjdhLCBhcm02NC12OGFdJykiCi0gICAgICAgICAgICAgICAgICAgICsgIiBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UgKCdbYXJtZWFiaV0nKS4iLCBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgRWFzeU1vY2sudmVyaWZ5KG1Nb2NrRGV2aWNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHRoYXQge0BsaW5rIENvbXBhdGliaWxpdHlUZXN0I2dldEFiaXMoKX0gaXMgcmV0dXJuaW5nIG9ubHkgdGhlIGRldmljZSBwcmltYXJ5IGFiaS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QWJpc19wcmltYXJ5QWJpT25seSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBPcHRpb25TZXR0ZXIgc2V0dGVyID0gbmV3IE9wdGlvblNldHRlcihtVGVzdCk7Ci0gICAgICAgIHNldHRlci5zZXRPcHRpb25WYWx1ZShDb21wYXRpYmlsaXR5VGVzdC5QUklNQVJZX0FCSV9SVU4sICJ0cnVlIik7Ci0gICAgICAgIEVhc3lNb2NrLmV4cGVjdChtTW9ja0RldmljZS5nZXRQcm9wZXJ0eShFYXN5TW9jay5lcSgicm8ucHJvZHVjdC5jcHUuYWJpIikpKQotICAgICAgICAgICAgICAgIC5hbmRSZXR1cm4oImFybTY0LXY4YSIpOwotICAgICAgICBTZXQ8U3RyaW5nPiBleHBlY3RlZEFiaXMgPSBuZXcgSGFzaFNldDw+KCk7Ci0gICAgICAgIGV4cGVjdGVkQWJpcy5hZGQoImFybTY0LXY4YSIpOwotICAgICAgICBFYXN5TW9jay5yZXBsYXkobU1vY2tEZXZpY2UpOwotICAgICAgICBTZXQ8SUFiaT4gcmVzID0gbVRlc3QuZ2V0QWJpcygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcmVzLnNpemUoKSk7Ci0gICAgICAgIGZvciAoSUFiaSBhYmkgOiByZXMpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhwZWN0ZWRBYmlzLmNvbnRhaW5zKGFiaS5nZXROYW1lKCkpKTsKLSAgICAgICAgfQotICAgICAgICBFYXN5TW9jay52ZXJpZnkobU1vY2tEZXZpY2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgdGhhdCB7QGxpbmsgQ29tcGF0aWJpbGl0eVRlc3QjZ2V0QWJpcygpfSBpcyB0aHJvd2luZyBhbiBleGNlcHRpb24gaWYgdGhlIHByaW1hcnkKLSAgICAgKiBhYmkgaXMgbm90IHN1cHBvcnRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QWJpc19wcmltYXJ5QWJpT25seV9Ob3RTdXBwb3J0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgT3B0aW9uU2V0dGVyIHNldHRlciA9IG5ldyBPcHRpb25TZXR0ZXIobVRlc3QpOwotICAgICAgICBzZXR0ZXIuc2V0T3B0aW9uVmFsdWUoQ29tcGF0aWJpbGl0eVRlc3QuUFJJTUFSWV9BQklfUlVOLCAidHJ1ZSIpOwotICAgICAgICBFYXN5TW9jay5leHBlY3QobU1vY2tEZXZpY2UuZ2V0UHJvcGVydHkoRWFzeU1vY2suZXEoInJvLnByb2R1Y3QuY3B1LmFiaSIpKSkKLSAgICAgICAgICAgICAgICAuYW5kUmV0dXJuKCJhcm1lYWJpIik7Ci0gICAgICAgIEVhc3lNb2NrLnJlcGxheShtTW9ja0RldmljZSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtVGVzdC5nZXRBYmlzKCk7Ci0gICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uIik7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIllvdXIgQ1RTIGhhc24ndCBiZWVuIGJ1aWx0IHdpdGggYWJpICdhcm1lYWJpJyBzdXBwb3J0LCAiCi0gICAgICAgICAgICAgICAgICAgICsgInRoaXMgQ1RTIGN1cnJlbnRseSBzdXBwb3J0cyAnW2FybWVhYmktdjdhLCBhcm02NC12OGFdJy4iLCBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgRWFzeU1vY2sudmVyaWZ5KG1Nb2NrRGV2aWNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHRoYXQge0BsaW5rIENvbXBhdGliaWxpdHlUZXN0I2dldEFiaXMoKX0gaXMgcmV0dXJuaW5nIHRoZSBsaXN0IG9mIGFiaSBzdXBwb3J0ZWQgYnkKLSAgICAgKiBDb21wYXRpYmlsaXR5IGFuZCB0aGUgZGV2aWNlLCBhbmQgbm90IHRoZSBwYXJ0aWN1bGFyIENUUyBidWlsZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QWJpc19za2lwQ3RzQXJjaENoZWNrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9wdGlvblNldHRlciBzZXR0ZXIgPSBuZXcgT3B0aW9uU2V0dGVyKG1UZXN0KTsKLSAgICAgICAgc2V0dGVyLnNldE9wdGlvblZhbHVlKENvbXBhdGliaWxpdHlUZXN0LlNLSVBfSE9TVF9BUkNIX0NIRUNLLCAidHJ1ZSIpOwotICAgICAgICBFYXN5TW9jay5leHBlY3QobU1vY2tEZXZpY2UuZ2V0UHJvcGVydHkoRWFzeU1vY2suZXEoInJvLnByb2R1Y3QuY3B1LmFiaWxpc3QiKSkpCi0gICAgICAgICAgICAgICAgLmFuZFJldHVybigieDg2XzY0LHg4Nixhcm1lYWJpIik7Ci0gICAgICAgIFNldDxTdHJpbmc+IGV4cGVjdGVkQWJpcyA9IG5ldyBIYXNoU2V0PD4oKTsKLSAgICAgICAgZXhwZWN0ZWRBYmlzLmFkZCgieDg2XzY0Iik7Ci0gICAgICAgIGV4cGVjdGVkQWJpcy5hZGQoIng4NiIpOwotICAgICAgICBFYXN5TW9jay5yZXBsYXkobU1vY2tEZXZpY2UpOwotICAgICAgICBTZXQ8SUFiaT4gcmVzID0gbVRlc3QuZ2V0QWJpcygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcmVzLnNpemUoKSk7Ci0gICAgICAgIGZvciAoSUFiaSBhYmkgOiByZXMpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhwZWN0ZWRBYmlzLmNvbnRhaW5zKGFiaS5nZXROYW1lKCkpKTsKLSAgICAgICAgfQotICAgICAgICBFYXN5TW9jay52ZXJpZnkobU1vY2tEZXZpY2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3Qge0BsaW5rIENvbXBhdGliaWxpdHlUZXN0I2dldEFiaXMoKX0gd2hlbiB3ZSBza2lwIHRoZSBDdHMgc2lkZSBhcmNoaXRlY3R1cmUgY2hlY2sgYW5kCi0gICAgICogd2FudCB0byBydW4geDg2IGFiaS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QWJpc19za2lwQ3RzQXJjaENoZWNrX2FiaVNwZWNpZmllZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBPcHRpb25TZXR0ZXIgc2V0dGVyID0gbmV3IE9wdGlvblNldHRlcihtVGVzdCk7Ci0gICAgICAgIHNldHRlci5zZXRPcHRpb25WYWx1ZShDb21wYXRpYmlsaXR5VGVzdC5TS0lQX0hPU1RfQVJDSF9DSEVDSywgInRydWUiKTsKLSAgICAgICAgc2V0dGVyLnNldE9wdGlvblZhbHVlKENvbXBhdGliaWxpdHlUZXN0LkFCSV9PUFRJT04sICJ4ODYiKTsKLSAgICAgICAgU2V0PFN0cmluZz4gZXhwZWN0ZWRBYmlzID0gbmV3IEhhc2hTZXQ8PigpOwotICAgICAgICBleHBlY3RlZEFiaXMuYWRkKCJ4ODYiKTsKLSAgICAgICAgRWFzeU1vY2sucmVwbGF5KG1Nb2NrRGV2aWNlKTsKLSAgICAgICAgU2V0PElBYmk+IHJlcyA9IG1UZXN0LmdldEFiaXMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlcy5zaXplKCkpOwotICAgICAgICBmb3IgKElBYmkgYWJpIDogcmVzKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4cGVjdGVkQWJpcy5jb250YWlucyhhYmkuZ2V0TmFtZSgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgRWFzeU1vY2sudmVyaWZ5KG1Nb2NrRGV2aWNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHtAbGluayBDb21wYXRpYmlsaXR5VGVzdCNzcGxpdCgpfSB3aGVuIGEgc2hhcmQgbnVtYmVyIGlzIHNwZWNpZmllZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3BsaXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgT3B0aW9uU2V0dGVyIHNldHRlciA9IG5ldyBPcHRpb25TZXR0ZXIobVRlc3QpOwotICAgICAgICBzZXR0ZXIuc2V0T3B0aW9uVmFsdWUoInNoYXJkcyIsICI0Iik7Ci0gICAgICAgIGFzc2VydEVxdWFscyg0LCBtVGVzdC5zcGxpdCgpLnNpemUoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCB7QGxpbmsgQ29tcGF0aWJpbGl0eVRlc3Qjc3BsaXQoKX0gd2hlbiBubyBzaGFyZCBudW1iZXIgaXMgc3BlY2lmaWVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTcGxpdF9ub3RTaGFyZGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0TnVsbChtVGVzdC5zcGxpdCgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHtAbGluayBDb21wYXRpYmlsaXR5VGVzdCNydW5QcmVNb2R1bGVDaGVjayhTdHJpbmcsIExpc3QsIElUZXN0RGV2aWNlLCBJVGVzdExvZ2dlcil9Ci0gICAgICogaXMgc3VjY2Vzc2Z1bCB3aGVuIG5vIHN5c3RlbSBjaGVja2VyIGZhaWxzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RSdW5QcmVNb2R1bGVDaGVjaygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBMaXN0PElTeXN0ZW1TdGF0dXNDaGVja2VyPiBzeXN0ZW1DaGVja2VycyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAvLyBhZGQgMiBpbm9wIHN0YXR1cyBjaGVja2Vycy4KLSAgICAgICAgc3lzdGVtQ2hlY2tlcnMuYWRkKG5ldyBJU3lzdGVtU3RhdHVzQ2hlY2tlcigpIHt9KTsKLSAgICAgICAgc3lzdGVtQ2hlY2tlcnMuYWRkKG5ldyBJU3lzdGVtU3RhdHVzQ2hlY2tlcigpIHt9KTsKLSAgICAgICAgRWFzeU1vY2sucmVwbGF5KG1Nb2NrRGV2aWNlLCBtTW9ja0xvZ2dlcik7Ci0gICAgICAgIG1UZXN0LnJ1blByZU1vZHVsZUNoZWNrKCJGQUtFX01PRFVMRSIsIHN5c3RlbUNoZWNrZXJzLCBtTW9ja0RldmljZSwgbU1vY2tMb2dnZXIpOwotICAgICAgICBFYXN5TW9jay52ZXJpZnkobU1vY2tEZXZpY2UsIG1Nb2NrTG9nZ2VyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHtAbGluayBDb21wYXRpYmlsaXR5VGVzdCNydW5QcmVNb2R1bGVDaGVjayhTdHJpbmcsIExpc3QsIElUZXN0RGV2aWNlLCBJVGVzdExvZ2dlcil9Ci0gICAgICogaXMgZmFpbGluZyBhbmQgbG9nIHRoZSBmYWlsdXJlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RSdW5QcmVNb2R1bGVDaGVja19mYWlsdXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3Q8SVN5c3RlbVN0YXR1c0NoZWNrZXI+IHN5c3RlbUNoZWNrZXJzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIC8vIGFkZCAyIGlub3Agc3RhdHVzIGNoZWNrZXJzLgotICAgICAgICBzeXN0ZW1DaGVja2Vycy5hZGQobmV3IElTeXN0ZW1TdGF0dXNDaGVja2VyKCkge30pOwotICAgICAgICBzeXN0ZW1DaGVja2Vycy5hZGQobmV3IElTeXN0ZW1TdGF0dXNDaGVja2VyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcmVFeGVjdXRpb25DaGVjayhJVGVzdERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgICAgICAgICAvLyBmYWlscwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIElucHV0U3RyZWFtU291cmNlIHJlcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbVNvdXJjZSgiZmFrZSBidWdyZXBvcnQiLmdldEJ5dGVzKCkpOwotICAgICAgICBFYXN5TW9jay5leHBlY3QobU1vY2tEZXZpY2UuZ2V0QnVncmVwb3J0KCkpLmFuZFJldHVybihyZXMpOwotICAgICAgICBtTW9ja0xvZ2dlci50ZXN0TG9nKEVhc3lNb2NrLmVxKCJidWdyZXBvcnQtY2hlY2tlci1wcmUtbW9kdWxlLUZBS0VfTU9EVUxFIiksCi0gICAgICAgICAgICAgICAgRWFzeU1vY2suZXEoTG9nRGF0YVR5cGUuQlVHUkVQT1JUKSwKLSAgICAgICAgICAgICAgICBFYXN5TW9jay5zYW1lKHJlcykpOwotICAgICAgICBFYXN5TW9jay5yZXBsYXkobU1vY2tEZXZpY2UsIG1Nb2NrTG9nZ2VyKTsKLSAgICAgICAgbVRlc3QucnVuUHJlTW9kdWxlQ2hlY2soIkZBS0VfTU9EVUxFIiwgc3lzdGVtQ2hlY2tlcnMsIG1Nb2NrRGV2aWNlLCBtTW9ja0xvZ2dlcik7Ci0gICAgICAgIEVhc3lNb2NrLnZlcmlmeShtTW9ja0RldmljZSwgbU1vY2tMb2dnZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3Qge0BsaW5rIENvbXBhdGliaWxpdHlUZXN0I3J1blBvc3RNb2R1bGVDaGVjayhTdHJpbmcsIExpc3QsIElUZXN0RGV2aWNlLCBJVGVzdExvZ2dlcil9Ci0gICAgICogaXMgc3VjY2Vzc2Z1bCB3aGVuIG5vIHN5c3RlbSBjaGVja2VyIGZhaWxzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RSdW5Qb3N0TW9kdWxlQ2hlY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTGlzdDxJU3lzdGVtU3RhdHVzQ2hlY2tlcj4gc3lzdGVtQ2hlY2tlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgLy8gYWRkIDIgaW5vcCBzdGF0dXMgY2hlY2tlcnMuCi0gICAgICAgIHN5c3RlbUNoZWNrZXJzLmFkZChuZXcgSVN5c3RlbVN0YXR1c0NoZWNrZXIoKSB7fSk7Ci0gICAgICAgIHN5c3RlbUNoZWNrZXJzLmFkZChuZXcgSVN5c3RlbVN0YXR1c0NoZWNrZXIoKSB7fSk7Ci0gICAgICAgIEVhc3lNb2NrLnJlcGxheShtTW9ja0RldmljZSwgbU1vY2tMb2dnZXIpOwotICAgICAgICBtVGVzdC5ydW5Qb3N0TW9kdWxlQ2hlY2soIkZBS0VfTU9EVUxFIiwgc3lzdGVtQ2hlY2tlcnMsIG1Nb2NrRGV2aWNlLCBtTW9ja0xvZ2dlcik7Ci0gICAgICAgIEVhc3lNb2NrLnZlcmlmeShtTW9ja0RldmljZSwgbU1vY2tMb2dnZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3Qge0BsaW5rIENvbXBhdGliaWxpdHlUZXN0I3J1blByZU1vZHVsZUNoZWNrKFN0cmluZywgTGlzdCwgSVRlc3REZXZpY2UsIElUZXN0TG9nZ2VyKX0KLSAgICAgKiBpcyBmYWlsaW5nIGFuZCBsb2cgdGhlIGZhaWx1cmUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFJ1blBvc3RNb2R1bGVDaGVja19mYWlsdXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3Q8SVN5c3RlbVN0YXR1c0NoZWNrZXI+IHN5c3RlbUNoZWNrZXJzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIC8vIGFkZCAyIGlub3Agc3RhdHVzIGNoZWNrZXJzLgotICAgICAgICBzeXN0ZW1DaGVja2Vycy5hZGQobmV3IElTeXN0ZW1TdGF0dXNDaGVja2VyKCkge30pOwotICAgICAgICBzeXN0ZW1DaGVja2Vycy5hZGQobmV3IElTeXN0ZW1TdGF0dXNDaGVja2VyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBwb3N0RXhlY3V0aW9uQ2hlY2soSVRlc3REZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgICAgICAgICAgLy8gZmFpbHMKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBJbnB1dFN0cmVhbVNvdXJjZSByZXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW1Tb3VyY2UoImZha2UgYnVncmVwb3J0Ii5nZXRCeXRlcygpKTsKLSAgICAgICAgRWFzeU1vY2suZXhwZWN0KG1Nb2NrRGV2aWNlLmdldEJ1Z3JlcG9ydCgpKS5hbmRSZXR1cm4ocmVzKTsKLSAgICAgICAgbU1vY2tMb2dnZXIudGVzdExvZyhFYXN5TW9jay5lcSgiYnVncmVwb3J0LWNoZWNrZXItcG9zdC1tb2R1bGUtRkFLRV9NT0RVTEUiKSwKLSAgICAgICAgICAgICAgICBFYXN5TW9jay5lcShMb2dEYXRhVHlwZS5CVUdSRVBPUlQpLAotICAgICAgICAgICAgICAgIEVhc3lNb2NrLnNhbWUocmVzKSk7Ci0gICAgICAgIEVhc3lNb2NrLnJlcGxheShtTW9ja0RldmljZSwgbU1vY2tMb2dnZXIpOwotICAgICAgICBtVGVzdC5ydW5Qb3N0TW9kdWxlQ2hlY2soIkZBS0VfTU9EVUxFIiwgc3lzdGVtQ2hlY2tlcnMsIG1Nb2NrRGV2aWNlLCBtTW9ja0xvZ2dlcik7Ci0gICAgICAgIEVhc3lNb2NrLnZlcmlmeShtTW9ja0RldmljZSwgbU1vY2tMb2dnZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3Qge0BsaW5rIENvbXBhdGliaWxpdHlUZXN0I3J1bihJVGVzdEludm9jYXRpb25MaXN0ZW5lcil9IHJldHVybnMgd2l0aCBubyBmdXJ0aGVyCi0gICAgICogZXhlY3V0aW9uIHdoZW4gdGhlcmUgaXMgbm8gbW9kdWxlIHRvIHJ1bi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UnVuX25vTW9kdWxlcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtVGVzdCA9IG5ldyBDb21wYXRpYmlsaXR5VGVzdCgxLCBuZXcgTW9kdWxlUmVwbygpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIExpbmtlZExpc3Q8SU1vZHVsZURlZj4gZ2V0TW9kdWxlcyhTdHJpbmcgc2VyaWFsLCBpbnQgc2hhcmRJbmRleCkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTGlua2VkTGlzdDxJTW9kdWxlRGVmPigpOwotICAgICAgICAgICAgfQotICAgICAgICB9LCAwKTsKLSAgICAgICAgbVRlc3Quc2V0RGV2aWNlKG1Nb2NrRGV2aWNlKTsKLSAgICAgICAgRWFzeU1vY2suZXhwZWN0KG1Nb2NrRGV2aWNlLmdldFNlcmlhbE51bWJlcigpKS5hbmRSZXR1cm4oIkZBS0VfU0VSSUFMIikudGltZXMoMik7Ci0gICAgICAgIEVhc3lNb2NrLnJlcGxheShtTW9ja0RldmljZSwgbU1vY2tMaXN0ZW5lcik7Ci0gICAgICAgIG1UZXN0LnJ1bihtTW9ja0xpc3RlbmVyKTsKLSAgICAgICAgRWFzeU1vY2sudmVyaWZ5KG1Nb2NrRGV2aWNlLCBtTW9ja0xpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHtAbGluayBDb21wYXRpYmlsaXR5VGVzdCNjaGVja1N5c3RlbVN0YXR1c0JsYWNrQW5kV2hpdGVMaXN0KCl9IGNvcnJlY3RseSB0aHJvd3MKLSAgICAgKiBpZiBhIHN5c3RlbSBzdGF0dXMgaXMgaW52YWxpZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tTeXN0ZW1TdGF0dXNfdGhyb3coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgT3B0aW9uU2V0dGVyIHNldHRlciA9IG5ldyBPcHRpb25TZXR0ZXIobVRlc3QpOwotICAgICAgICBzZXR0ZXIuc2V0T3B0aW9uVmFsdWUoInN5c3RlbS1zdGF0dXMtY2hlY2std2hpdGVsaXN0IiwgImNvbS5kb2VzLm5vdC5leGl0Iik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtVGVzdC5jaGVja1N5c3RlbVN0YXR1c0JsYWNrQW5kV2hpdGVMaXN0KCk7Ci0gICAgICAgICAgICBmYWlsKCJzaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uIik7Ci0gICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKLSAgICAgICAgICAgIC8vIGV4cGVjdGVkLgotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCB7QGxpbmsgQ29tcGF0aWJpbGl0eVRlc3QjY2hlY2tTeXN0ZW1TdGF0dXNCbGFja0FuZFdoaXRlTGlzdCgpfSBkb2VzIG5vdCB0aHJvdwotICAgICAqIGlmIGEgc3lzdGVtIHN0YXR1cyBpcyB2YWxpZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tTeXN0ZW1TdGF0dXNfcGFzcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBPcHRpb25TZXR0ZXIgc2V0dGVyID0gbmV3IE9wdGlvblNldHRlcihtVGVzdCk7Ci0gICAgICAgIHNldHRlci5zZXRPcHRpb25WYWx1ZSgic2tpcC1zeXN0ZW0tc3RhdHVzLWNoZWNrIiwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQudHJhZGVmZWQuc3VpdGUuY2hlY2tlci5LZXlndWFyZFN0YXR1c0NoZWNrZXIiKTsKLSAgICAgICAgbVRlc3QuY2hlY2tTeXN0ZW1TdGF0dXNCbGFja0FuZFdoaXRlTGlzdCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3Rlc3R0eXBlL0phckhvc3RUZXN0VGVzdC5qYXZhIGIvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdGVzdHR5cGUvSmFySG9zdFRlc3RUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNmJjYTAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdGVzdHR5cGUvSmFySG9zdFRlc3RUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRlc3R0eXBlOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQuYnVpbGQuQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmJ1aWxkLkJ1aWxkSW5mbzsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5idWlsZC5JQnVpbGRJbmZvOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmNvbmZpZy5PcHRpb25TZXR0ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLklUZXN0RGV2aWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmxvZy5Mb2dVdGlsLkNMb2c7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSG9zdFRlc3Q7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSVJlbW90ZVRlc3Q7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudXRpbC5GaWxlVXRpbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lYXN5bW9jay5FYXN5TW9jazsKLWltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuSlVuaXQ0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogVW5pdCB0ZXN0cyBmb3Ige0BsaW5rIEphckhvc3RUZXN0fS4KLSAqLwotcHVibGljIGNsYXNzIEphckhvc3RUZXN0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0pBUjEgPSAiL3Rlc3R0eXBlL3Rlc3RKYXIxLmphciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfSkFSMiA9ICIvdGVzdHR5cGUvdGVzdEphcjIuamFyIjsKLSAgICBwcml2YXRlIEphckhvc3RUZXN0IG1UZXN0OwotICAgIHByaXZhdGUgRmlsZSBtVGVzdERpciA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBNb3JlIHRlc3RhYmxlIHZlcnNpb24gb2Yge0BsaW5rIEphckhvc3RUZXN0fQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSmFySG9zdFRlc3RhYmxlIGV4dGVuZHMgSmFySG9zdFRlc3QgewotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgRmlsZSBtVGVzdERpcjsKLSAgICAgICAgcHVibGljIEphckhvc3RUZXN0YWJsZSgpIHt9Ci0KLSAgICAgICAgcHVibGljIEphckhvc3RUZXN0YWJsZShGaWxlIHRlc3REaXIpIHsKLSAgICAgICAgICAgIG1UZXN0RGlyID0gdGVzdERpcjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIgY3JlYXRlQnVpbGRIZWxwZXIoSUJ1aWxkSW5mbyBpbmZvKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IENvbXBhdGliaWxpdHlCdWlsZEhlbHBlcihpbmZvKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIEZpbGUgZ2V0VGVzdHNEaXIoKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1UZXN0RGlyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgbVRlc3QgPSBuZXcgSmFySG9zdFRlc3QoKTsKLSAgICAgICAgbVRlc3REaXIgPSBGaWxlVXRpbC5jcmVhdGVUZW1wRGlyKCJqYXJob3N0ZXN0Iik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGVVdGlsLnJlY3Vyc2l2ZURlbGV0ZShtVGVzdERpcik7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGVscGVyIHRvIHJlYWQgYSBmaWxlIGZyb20gdGhlIHJlcy90ZXN0dHlwZSBkaXJlY3RvcnkgYW5kIHJldHVybiBpdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWxlbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZSBpbiB0aGUgcmVzL3Rlc3R0eXBlIGRpcmVjdG9yeQotICAgICAqIEBwYXJhbSBwYXJlbnREaXIgZGlyIHdoZXJlIHRvIHB1dCB0aGUgamFyLiBOdWxsIGlmIGluIGRlZmF1bHQgdG1wIGRpcmVjdG9yeS4KLSAgICAgKiBAcmV0dXJuIHRoZSBleHRyYWN0ZWQgamFyIGZpbGUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEZpbGUgZ2V0SmFyUmVzb3VyY2UoU3RyaW5nIGZpbGVuYW1lLCBGaWxlIHBhcmVudERpcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgSW5wdXRTdHJlYW0gamFyRmlsZVN0cmVhbSA9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShmaWxlbmFtZSk7Ci0gICAgICAgIEZpbGUgamFyRmlsZSA9IEZpbGVVdGlsLmNyZWF0ZVRlbXBGaWxlKCJ0ZXN0IiwgIi5qYXIiLCBwYXJlbnREaXIpOwotICAgICAgICBGaWxlVXRpbC53cml0ZVRvRmlsZShqYXJGaWxlU3RyZWFtLCBqYXJGaWxlKTsKLSAgICAgICAgcmV0dXJuIGphckZpbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBjbGFzcywgd2UgaGF2ZSB0byBhbm5vdGF0ZSB3aXRoIGZ1bGwgb3JnLmp1bml0LlRlc3QgdG8gYXZvaWQgbmFtZSBjb2xsaXNpb24gaW4gaW1wb3J0LgotICAgICAqLwotICAgIEBSdW5XaXRoKEpVbml0NC5jbGFzcykKLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEp1bml0NFRlc3RDbGFzcyAgewotICAgICAgICBwdWJsaWMgSnVuaXQ0VGVzdENsYXNzKCkge30KLSAgICAgICAgQG9yZy5qdW5pdC5UZXN0Ci0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RQYXNzMSgpIHt9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBjbGFzcywgd2UgaGF2ZSB0byBhbm5vdGF0ZSB3aXRoIGZ1bGwgb3JnLmp1bml0LlRlc3QgdG8gYXZvaWQgbmFtZSBjb2xsaXNpb24gaW4gaW1wb3J0LgotICAgICAqLwotICAgIEBSdW5XaXRoKEpVbml0NC5jbGFzcykKLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEp1bml0NFRlc3RDbGFzczIgIHsKLSAgICAgICAgcHVibGljIEp1bml0NFRlc3RDbGFzczIoKSB7fQotICAgICAgICBAb3JnLmp1bml0LlRlc3QKLSAgICAgICAgcHVibGljIHZvaWQgdGVzdFBhc3MyKCkge30KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHRoYXQge0BsaW5rIEphckhvc3RUZXN0I3NwbGl0KCl9IGluaGVyaXRlZCBmcm9tIHtAbGluayBIb3N0VGVzdH0gaXMgc3RpbGwgZ29vZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3BsaXRfd2l0aG91dEphcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBPcHRpb25TZXR0ZXIgc2V0dGVyID0gbmV3IE9wdGlvblNldHRlcihtVGVzdCk7Ci0gICAgICAgIHNldHRlci5zZXRPcHRpb25WYWx1ZSgiY2xhc3MiLCAiY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGVzdHR5cGUuIgotICAgICAgICAgICAgICAgICsgIkphckhvc3RUZXN0VGVzdCRKdW5pdDRUZXN0Q2xhc3MiKTsKLSAgICAgICAgc2V0dGVyLnNldE9wdGlvblZhbHVlKCJjbGFzcyIsICJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS4iCi0gICAgICAgICAgICAgICAgKyAiSmFySG9zdFRlc3RUZXN0JEp1bml0NFRlc3RDbGFzczIiKTsKLSAgICAgICAgLy8gc2hhckNvdW50IGlzIGlnbm9yZWQ7IHdpbGwgc3BsaXQgYnkgbnVtYmVyIG9mIGNsYXNzZXMKLSAgICAgICAgTGlzdDxJUmVtb3RlVGVzdD4gcmVzID0gKExpc3Q8SVJlbW90ZVRlc3Q+KW1UZXN0LnNwbGl0KDEpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcmVzLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzLmdldCgwKSBpbnN0YW5jZW9mIEphckhvc3RUZXN0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXMuZ2V0KDEpIGluc3RhbmNlb2YgSmFySG9zdFRlc3QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgdGhhdCB7QGxpbmsgSmFySG9zdFRlc3Qjc3BsaXQoKX0gY2FuIHNwbGl0IGNsYXNzZXMgY29taW5nIGZyb20gYSBqYXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFNwbGl0X3dpdGhKYXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZSB0ZXN0SmFyID0gZ2V0SmFyUmVzb3VyY2UoVEVTVF9KQVIxLCBtVGVzdERpcik7Ci0gICAgICAgIG1UZXN0ID0gbmV3IEphckhvc3RUZXN0YWJsZShtVGVzdERpcik7Ci0gICAgICAgIE9wdGlvblNldHRlciBzZXR0ZXIgPSBuZXcgT3B0aW9uU2V0dGVyKG1UZXN0KTsKLSAgICAgICAgc2V0dGVyLnNldE9wdGlvblZhbHVlKCJqYXIiLCB0ZXN0SmFyLmdldE5hbWUoKSk7Ci0gICAgICAgIC8vIHNoYXJDb3VudCBpcyBpZ25vcmVkOyB3aWxsIHNwbGl0IGJ5IG51bWJlciBvZiBjbGFzc2VzCi0gICAgICAgIExpc3Q8SVJlbW90ZVRlc3Q+IHJlcyA9IChMaXN0PElSZW1vdGVUZXN0PiltVGVzdC5zcGxpdCgxKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHJlcy5zaXplKCkpOwotICAgICAgICBhc3NlcnRUcnVlKHJlcy5nZXQoMCkgaW5zdGFuY2VvZiBKYXJIb3N0VGVzdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiW2FuZHJvaWQudWkuY3RzLlRhc2tTd2l0Y2hpbmdUZXN0XSIsCi0gICAgICAgICAgICAgICAgKChKYXJIb3N0VGVzdClyZXMuZ2V0KDApKS5nZXRDbGFzc05hbWVzKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzLmdldCgxKSBpbnN0YW5jZW9mIEphckhvc3RUZXN0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJbYW5kcm9pZC51aS5jdHMuSW5zdGFsbFRpbWVUZXN0XSIsCi0gICAgICAgICAgICAgICAgKChKYXJIb3N0VGVzdClyZXMuZ2V0KDEpKS5nZXRDbGFzc05hbWVzKCkudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCB0aGF0IHtAbGluayBKYXJIb3N0VGVzdCNnZXRUZXN0U2hhcmQoaW50LCBpbnQpfSBjYW4gc3BsaXQgY2xhc3NlcyBjb21pbmcgZnJvbSBhIGphci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0VGVzdFNoYXJkX3dpdGhKYXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZSB0ZXN0SmFyID0gZ2V0SmFyUmVzb3VyY2UoVEVTVF9KQVIyLCBtVGVzdERpcik7Ci0gICAgICAgIG1UZXN0ID0gbmV3IEphckhvc3RUZXN0TG9hZGVyKG1UZXN0RGlyLCB0ZXN0SmFyKTsKLSAgICAgICAgbVRlc3Quc2V0QnVpbGQobmV3IEJ1aWxkSW5mbygpKTsKLSAgICAgICAgSVRlc3REZXZpY2UgZGV2aWNlID0gRWFzeU1vY2suY3JlYXRlTmljZU1vY2soSVRlc3REZXZpY2UuY2xhc3MpOwotICAgICAgICBtVGVzdC5zZXREZXZpY2UoZGV2aWNlKTsKLSAgICAgICAgT3B0aW9uU2V0dGVyIHNldHRlciA9IG5ldyBPcHRpb25TZXR0ZXIobVRlc3QpOwotICAgICAgICBzZXR0ZXIuc2V0T3B0aW9uVmFsdWUoImphciIsIHRlc3RKYXIuZ2V0TmFtZSgpKTsKLSAgICAgICAgLy8gZnVsbCBjbGFzcyBjb3VudCB3aXRob3V0IHNoYXJkaW5nCi0gICAgICAgIGFzc2VydEVxdWFscygyMzgsIG1UZXN0LmNvdW50VGVzdENhc2VzKCkpOwotCi0gICAgICAgIC8vIG9ubHkgb25lIHNoYXJkCi0gICAgICAgIElSZW1vdGVUZXN0IG9uZVNoYXJkID0gbVRlc3QuZ2V0VGVzdFNoYXJkKDEsIDApOwotICAgICAgICBhc3NlcnRUcnVlKG9uZVNoYXJkIGluc3RhbmNlb2YgSmFySG9zdFRlc3QpOwotICAgICAgICAoKEphckhvc3RUZXN0KW9uZVNoYXJkKS5zZXRCdWlsZChuZXcgQnVpbGRJbmZvKCkpOwotICAgICAgICAoKEphckhvc3RUZXN0KW9uZVNoYXJkKS5zZXREZXZpY2UoZGV2aWNlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIzOCwgKChKYXJIb3N0VGVzdClvbmVTaGFyZCkuY291bnRUZXN0Q2FzZXMoKSk7Ci0KLSAgICAgICAgLy8gNSBzaGFyZHMgdG90YWwgdGhlIG51bWJlciBvZiB0ZXN0cy4KLSAgICAgICAgaW50IHRvdGFsID0gMDsKLSAgICAgICAgSVJlbW90ZVRlc3Qgc2hhcmQxID0gbVRlc3QuZ2V0VGVzdFNoYXJkKDUsIDApOwotICAgICAgICBhc3NlcnRUcnVlKHNoYXJkMSBpbnN0YW5jZW9mIEphckhvc3RUZXN0KTsKLSAgICAgICAgKChKYXJIb3N0VGVzdClzaGFyZDEpLnNldEJ1aWxkKG5ldyBCdWlsZEluZm8oKSk7Ci0gICAgICAgICgoSmFySG9zdFRlc3Qpc2hhcmQxKS5zZXREZXZpY2UoZGV2aWNlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDU4LCAoKEphckhvc3RUZXN0KXNoYXJkMSkuY291bnRUZXN0Q2FzZXMoKSk7Ci0gICAgICAgIHRvdGFsICs9ICgoSmFySG9zdFRlc3Qpc2hhcmQxKS5jb3VudFRlc3RDYXNlcygpOwotCi0gICAgICAgIElSZW1vdGVUZXN0IHNoYXJkMiA9IG1UZXN0LmdldFRlc3RTaGFyZCg1LCAxKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzaGFyZDIgaW5zdGFuY2VvZiBKYXJIb3N0VGVzdCk7Ci0gICAgICAgICgoSmFySG9zdFRlc3Qpc2hhcmQyKS5zZXRCdWlsZChuZXcgQnVpbGRJbmZvKCkpOwotICAgICAgICAoKEphckhvc3RUZXN0KXNoYXJkMikuc2V0RGV2aWNlKGRldmljZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyg2MCwgKChKYXJIb3N0VGVzdClzaGFyZDIpLmNvdW50VGVzdENhc2VzKCkpOwotICAgICAgICB0b3RhbCArPSAoKEphckhvc3RUZXN0KXNoYXJkMikuY291bnRUZXN0Q2FzZXMoKTsKLQotICAgICAgICBJUmVtb3RlVGVzdCBzaGFyZDMgPSBtVGVzdC5nZXRUZXN0U2hhcmQoNSwgMik7Ci0gICAgICAgIGFzc2VydFRydWUoc2hhcmQzIGluc3RhbmNlb2YgSmFySG9zdFRlc3QpOwotICAgICAgICAoKEphckhvc3RUZXN0KXNoYXJkMykuc2V0QnVpbGQobmV3IEJ1aWxkSW5mbygpKTsKLSAgICAgICAgKChKYXJIb3N0VGVzdClzaGFyZDMpLnNldERldmljZShkZXZpY2UpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNjAsICgoSmFySG9zdFRlc3Qpc2hhcmQzKS5jb3VudFRlc3RDYXNlcygpKTsKLSAgICAgICAgdG90YWwgKz0gKChKYXJIb3N0VGVzdClzaGFyZDMpLmNvdW50VGVzdENhc2VzKCk7Ci0KLSAgICAgICAgSVJlbW90ZVRlc3Qgc2hhcmQ0ID0gbVRlc3QuZ2V0VGVzdFNoYXJkKDUsIDMpOwotICAgICAgICBhc3NlcnRUcnVlKHNoYXJkNCBpbnN0YW5jZW9mIEphckhvc3RUZXN0KTsKLSAgICAgICAgKChKYXJIb3N0VGVzdClzaGFyZDQpLnNldEJ1aWxkKG5ldyBCdWlsZEluZm8oKSk7Ci0gICAgICAgICgoSmFySG9zdFRlc3Qpc2hhcmQ0KS5zZXREZXZpY2UoZGV2aWNlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDMwLCAoKEphckhvc3RUZXN0KXNoYXJkNCkuY291bnRUZXN0Q2FzZXMoKSk7Ci0gICAgICAgIHRvdGFsICs9ICgoSmFySG9zdFRlc3Qpc2hhcmQ0KS5jb3VudFRlc3RDYXNlcygpOwotCi0gICAgICAgIElSZW1vdGVUZXN0IHNoYXJkNSA9IG1UZXN0LmdldFRlc3RTaGFyZCg1LCA0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzaGFyZDUgaW5zdGFuY2VvZiBKYXJIb3N0VGVzdCk7Ci0gICAgICAgICgoSmFySG9zdFRlc3Qpc2hhcmQ1KS5zZXRCdWlsZChuZXcgQnVpbGRJbmZvKCkpOwotICAgICAgICAoKEphckhvc3RUZXN0KXNoYXJkNSkuc2V0RGV2aWNlKGRldmljZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygzMCwgKChKYXJIb3N0VGVzdClzaGFyZDUpLmNvdW50VGVzdENhc2VzKCkpOwotICAgICAgICB0b3RhbCArPSAoKEphckhvc3RUZXN0KXNoYXJkNSkuY291bnRUZXN0Q2FzZXMoKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoMjM4LCB0b3RhbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdGFibGUgdmVyc2lvbiBvZiB7QGxpbmsgSmFySG9zdFRlc3R9IHRoYXQgYWxsb3dzIGFkZGluZyBqYXIgdG8gY2xhc3NwYXRoIGZvciB0ZXN0aW5nCi0gICAgICogcHVycG9zZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEphckhvc3RUZXN0TG9hZGVyIGV4dGVuZHMgSmFySG9zdFRlc3RhYmxlIHsKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBGaWxlIG1UZXN0SmFyOwotCi0gICAgICAgIHB1YmxpYyBKYXJIb3N0VGVzdExvYWRlcigpIHt9Ci0KLSAgICAgICAgcHVibGljIEphckhvc3RUZXN0TG9hZGVyKEZpbGUgdGVzdERpciwgRmlsZSBqYXIpIHsKLSAgICAgICAgICAgIHN1cGVyKHRlc3REaXIpOwotICAgICAgICAgICAgbVRlc3RKYXIgPSBqYXI7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyIGNyZWF0ZUJ1aWxkSGVscGVyKElCdWlsZEluZm8gaW5mbykgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIoaW5mbykgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyBGaWxlIGdldFRlc3RzRGlyKCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtVGVzdERpcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICB9Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXIoKSB7Ci0gICAgICAgICAgICBDbGFzc0xvYWRlciBjaGlsZCA9IHN1cGVyLmdldENsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNoaWxkID0gbmV3IFVSTENsYXNzTG9hZGVyKEFycmF5cy5hc0xpc3QobVRlc3RKYXIudG9VUkkoKS50b1VSTCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgLnRvQXJyYXkobmV3IFVSTFtde30pLCBzdXBlci5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgQ0xvZy5lKGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNoaWxkOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdGVzdHR5cGUvTW9kdWxlRGVmVGVzdC5qYXZhIGIvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdGVzdHR5cGUvTW9kdWxlRGVmVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjEyZTZlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3Rlc3R0eXBlL01vZHVsZURlZlRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZTsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmNvbmZpZy5Db25maWd1cmF0aW9uRGVzY3JpcHRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnJlc3VsdC5JVGVzdEludm9jYXRpb25MaXN0ZW5lcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLklUYXJnZXRQcmVwYXJlcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5BYmk7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSUFiaTsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JQWJpUmVjZWl2ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSVJlbW90ZVRlc3Q7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSVJ1bnRpbWVIaW50UHJvdmlkZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSVRlc3RDb2xsZWN0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSVRlc3RGaWx0ZXJSZWNlaXZlcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC51dGlsLkFiaVV0aWxzOwotCi1pbXBvcnQgb3JnLmVhc3ltb2NrLkVhc3lNb2NrOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotcHVibGljIGNsYXNzIE1vZHVsZURlZlRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJNb2R1bGVOYW1lIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJJID0gIm1pcHM2NCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gQWJpVXRpbHMuY3JlYXRlSWQoQUJJLCBOQU1FKTsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NvcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSUFiaSBhYmkgPSBuZXcgQWJpKEFCSSwgIiIpOwotICAgICAgICBNb2NrUmVtb3RlVGVzdCBtb2NrVGVzdCA9IG5ldyBNb2NrUmVtb3RlVGVzdCgpOwotICAgICAgICBJTW9kdWxlRGVmIGRlZiA9IG5ldyBNb2R1bGVEZWYoTkFNRSwgYWJpLCBtb2NrVGVzdCwgbmV3IEFycmF5TGlzdDxJVGFyZ2V0UHJlcGFyZXI+KCksCi0gICAgICAgICAgICAgICAgbmV3IENvbmZpZ3VyYXRpb25EZXNjcmlwdG9yKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBJRCIsIElELCBkZWYuZ2V0SWQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IEFCSSIsIEFCSSwgZGVmLmdldEFiaSgpLmdldE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IE5hbWUiLCBOQU1FLCBkZWYuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kdWxlRmluaXNoZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSUFiaSBhYmkgPSBuZXcgQWJpKEFCSSwgIiIpOwotICAgICAgICBNb2NrUmVtb3RlVGVzdCBtb2NrVGVzdCA9IG5ldyBNb2NrUmVtb3RlVGVzdCgpOwotICAgICAgICBJTW9kdWxlRGVmIGRlZiA9IG5ldyBNb2R1bGVEZWYoTkFNRSwgYWJpLCBtb2NrVGVzdCwKLSAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PElUYXJnZXRQcmVwYXJlcj4oKSwgbmV3IENvbmZpZ3VyYXRpb25EZXNjcmlwdG9yKCkpOwotICAgICAgICBJVGVzdEludm9jYXRpb25MaXN0ZW5lciBtb2NrTGlzdGVuZXIgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElUZXN0SW52b2NhdGlvbkxpc3RlbmVyLmNsYXNzKTsKLSAgICAgICAgLy8gbGlzdGVuZXIgc2hvdWxkIHJlY2VpdmUgdGVzdFJ1blN0YXJ0ZWQvdGVzdFJ1bkVuZGVkIGV2ZW50cyBldmVuIGZvciBuby1vcCBydW4oKSBtZXRob2QKLSAgICAgICAgbW9ja0xpc3RlbmVyLnRlc3RSdW5TdGFydGVkKElELCAwKTsKLSAgICAgICAgRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKS5vbmNlKCk7Ci0gICAgICAgIG1vY2tMaXN0ZW5lci50ZXN0UnVuRW5kZWQoMCwgQ29sbGVjdGlvbnMuZW1wdHlNYXAoKSk7Ci0gICAgICAgIEVhc3lNb2NrLmV4cGVjdExhc3RDYWxsKCkub25jZSgpOwotICAgICAgICBFYXN5TW9jay5yZXBsYXkobW9ja0xpc3RlbmVyKTsKLSAgICAgICAgZGVmLnJ1bihtb2NrTGlzdGVuZXIpOwotICAgICAgICBFYXN5TW9jay52ZXJpZnkobW9ja0xpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIE1vY2tSZW1vdGVUZXN0IGltcGxlbWVudHMgSVJlbW90ZVRlc3QsIElUZXN0RmlsdGVyUmVjZWl2ZXIsIElBYmlSZWNlaXZlciwKLSAgICAgICAgICAgIElSdW50aW1lSGludFByb3ZpZGVyLCBJVGVzdENvbGxlY3RvciB7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFN0cmluZz4gbUluY2x1ZGVGaWx0ZXJzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxTdHJpbmc+IG1FeGNsdWRlRmlsdGVycyA9IG5ldyBBcnJheUxpc3Q8PigpOwotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRJbmNsdWRlRmlsdGVyKFN0cmluZyBmaWx0ZXIpIHsKLSAgICAgICAgICAgIG1JbmNsdWRlRmlsdGVycy5hZGQoZmlsdGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRBbGxJbmNsdWRlRmlsdGVycyhTZXQ8U3RyaW5nPiBmaWx0ZXJzKSB7Ci0gICAgICAgICAgICBtSW5jbHVkZUZpbHRlcnMuYWRkQWxsKGZpbHRlcnMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZEV4Y2x1ZGVGaWx0ZXIoU3RyaW5nIGZpbHRlcikgewotICAgICAgICAgICAgbUV4Y2x1ZGVGaWx0ZXJzLmFkZChmaWx0ZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZEFsbEV4Y2x1ZGVGaWx0ZXJzKFNldDxTdHJpbmc+IGZpbHRlcnMpIHsKLSAgICAgICAgICAgIG1FeGNsdWRlRmlsdGVycy5hZGRBbGwoZmlsdGVycyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKElUZXN0SW52b2NhdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIC8vIERvIG5vdGhpbmcKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRBYmkoSUFiaSBhYmkpIHsKLSAgICAgICAgICAgIC8vIERvIG5vdGhpbmcKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgSUFiaSBnZXRBYmkoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgbG9uZyBnZXRSdW50aW1lSGludCgpIHsKLSAgICAgICAgICAgIHJldHVybiAxTDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRDb2xsZWN0VGVzdHNPbmx5KGJvb2xlYW4gc2hvdWxkQ29sbGVjdFRlc3QpIHsKLSAgICAgICAgICAgIC8vIERvIG5vdGhpbmcKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3Rlc3R0eXBlL01vZHVsZVJlcG9UZXN0LmphdmEgYi9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC90ZXN0dHlwZS9Nb2R1bGVSZXBvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTI0NmFlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3Rlc3R0eXBlL01vZHVsZVJlcG9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGVzdHR5cGU7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC5idWlsZC5Db21wYXRpYmlsaXR5QnVpbGRIZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGVzdHR5cGUuTW9kdWxlUmVwby5Db25maWdGaWx0ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuYnVpbGQuSUJ1aWxkSW5mbzsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5jb25maWcuQ29uZmlndXJhdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5jb25maWcuQ29uZmlndXJhdGlvbkRlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuY29uZmlnLklDb25maWd1cmF0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmNvbmZpZy5PcHRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLkRldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5yZXN1bHQuSVRlc3RJbnZvY2F0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5JVGFyZ2V0UHJlcGFyZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuQWJpOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLklBYmk7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSUFiaVJlY2VpdmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLklSZW1vdGVUZXN0OwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLklSdW50aW1lSGludFByb3ZpZGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLklTdHJpY3RTaGFyZGFibGVUZXN0OwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLklUZXN0Q29sbGVjdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLklUZXN0RmlsdGVyUmVjZWl2ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudXRpbC5BYmlVdGlsczsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC51dGlsLkZpbGVVdGlsOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnV0aWwuTXVsdGlNYXA7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWFzeW1vY2suRWFzeU1vY2s7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBVbml0IFRlc3RzIGZvciB7QGxpbmsgTW9kdWxlUmVwb30KLSAqLwotcHVibGljIGNsYXNzIE1vZHVsZVJlcG9UZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRPS0VOID0KLSAgICAgICAgICAgICI8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPVwiY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGFyZ2V0cHJlcC5Ub2tlblJlcXVpcmVtZW50XCI+XG4iCi0gICAgICAgICAgICArICI8b3B0aW9uIG5hbWU9XCJ0b2tlblwiIHZhbHVlPVwiJXNcIiAvPlxuIgotICAgICAgICAgICAgKyAiPC90YXJnZXRfcHJlcGFyZXI+XG4iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUcgPQotICAgICAgICAgICAgIjxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPVwiQXV0byBHZW5lcmF0ZWQgRmlsZVwiPlxuIiArCi0gICAgICAgICAgICAiJXMiICsKLSAgICAgICAgICAgICI8dGVzdCBjbGFzcz1cImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRlc3R0eXBlLiVzXCI+XG4iICsKLSAgICAgICAgICAgICI8b3B0aW9uIG5hbWU9XCJtb2R1bGVcIiB2YWx1ZT1cIiVzXCIgLz4iICsKLSAgICAgICAgICAgICI8L3Rlc3Q+XG4iICsKLSAgICAgICAgICAgICI8L2NvbmZpZ3VyYXRpb24+IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9PQkFSX1RPS0VOID0gImZvb2JhciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUklBTDEgPSAiYWJjIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSSUFMMiA9ICJkZWYiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJJQUwzID0gImdoaSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gU0VSSUFMUyA9IG5ldyBIYXNoU2V0PD4oKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8SUFiaT4gQUJJUyA9IG5ldyBMaW5rZWRIYXNoU2V0PD4oKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0PFN0cmluZz4gREVWSUNFX1RPS0VOUyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExpc3Q8U3RyaW5nPiBURVNUX0FSR1M9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExpc3Q8U3RyaW5nPiBNT0RVTEVfQVJHUyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IElOQ0xVREVTID0gbmV3IEhhc2hTZXQ8PigpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IEVYQ0xVREVTID0gbmV3IEhhc2hTZXQ8PigpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE11bHRpTWFwPFN0cmluZywgU3RyaW5nPiBNRVRBREFUQV9JTkNMVURFUyA9IG5ldyBNdWx0aU1hcDw+KCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTXVsdGlNYXA8U3RyaW5nLCBTdHJpbmc+IE1FVEFEQVRBX0VYQ0xVREVTID0gbmV3IE11bHRpTWFwPD4oKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBGSUxFUyA9IG5ldyBIYXNoU2V0PD4oKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRU5BTUUgPSAiJXMuY29uZmlnIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9PVF9ESVJfQVRUUiA9ICJST09UX0RJUiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNVSVRFX05BTUVfQVRUUiA9ICJTVUlURV9OQU1FIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRfVElNRV9NU19BVFRSID0gIlNUQVJUX1RJTUVfTVMiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQklfMzIgPSAiYXJtZWFiaS12N2EiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQklfNjQgPSAiYXJtNjQtdjhhIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX05BTUVfQSA9ICJGb29Nb2R1bGVBIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX05BTUVfQiA9ICJGb29Nb2R1bGVCIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX05BTUVfQyA9ICJGb29Nb2R1bGVDIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9OX0VYSVNUU19NT0RVTEVfTkFNRSA9ICJOb25FeGlzdE1vZHVsZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0FfMzIgPSBBYmlVdGlscy5jcmVhdGVJZChBQklfMzIsIE1PRFVMRV9OQU1FX0EpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9BXzY0ID0gQWJpVXRpbHMuY3JlYXRlSWQoQUJJXzY0LCBNT0RVTEVfTkFNRV9BKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfQl8zMiA9IEFiaVV0aWxzLmNyZWF0ZUlkKEFCSV8zMiwgTU9EVUxFX05BTUVfQik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0JfNjQgPSBBYmlVdGlscy5jcmVhdGVJZChBQklfNjQsIE1PRFVMRV9OQU1FX0IpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9DXzMyID0gQWJpVXRpbHMuY3JlYXRlSWQoQUJJXzMyLCBNT0RVTEVfTkFNRV9DKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfQ182NCA9IEFiaVV0aWxzLmNyZWF0ZUlkKEFCSV82NCwgTU9EVUxFX05BTUVfQyk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQVJHID0gVGVzdFN0dWIuY2xhc3MuZ2V0TmFtZSgpICsgIjpmb286YmFyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX0FSRyA9ICIlczpibGFoOmZvb2JhciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfU1RVQiA9ICJUZXN0U3R1YiI7IC8vIFRyaXZpYWwgdGVzdCBzdHViCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNIQVJEQUJMRV9URVNUX1NUVUIgPSAiU2hhcmRhYmxlVGVzdFN0dWIiOyAvLyBTaGFyZGFibGUgYW5kIElCdWlsZFJlY2VpdmVyCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFtdIEVYUEVDVEVEX01PRFVMRV9JRFMgPSBuZXcgU3RyaW5nW10gewotICAgICAgICAiYXJtNjQtdjhhIEZvb01vZHVsZUIiLAotICAgICAgICAiYXJtNjQtdjhhIEZvb01vZHVsZUMiLAotICAgICAgICAiYXJtZWFiaS12N2EgRm9vTW9kdWxlQSIsCi0gICAgICAgICJhcm02NC12OGEgRm9vTW9kdWxlQSIsCi0gICAgICAgICJhcm1lYWJpLXY3YSBGb29Nb2R1bGVDIiwKLSAgICAgICAgImFybWVhYmktdjdhIEZvb01vZHVsZUIiCi0gICAgfTsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIFNFUklBTFMuYWRkKFNFUklBTDEpOwotICAgICAgICBTRVJJQUxTLmFkZChTRVJJQUwyKTsKLSAgICAgICAgU0VSSUFMUy5hZGQoU0VSSUFMMyk7Ci0gICAgICAgIEFCSVMuYWRkKG5ldyBBYmkoQUJJXzMyLCAiMzIiKSk7Ci0gICAgICAgIEFCSVMuYWRkKG5ldyBBYmkoQUJJXzY0LCAiNjQiKSk7Ci0gICAgICAgIERFVklDRV9UT0tFTlMuYWRkKFN0cmluZy5mb3JtYXQoIiVzOiVzIiwgU0VSSUFMMywgRk9PQkFSX1RPS0VOKSk7Ci0gICAgICAgIFRFU1RfQVJHUy5hZGQoVEVTVF9BUkcpOwotICAgICAgICBNT0RVTEVfQVJHUy5hZGQoU3RyaW5nLmZvcm1hdChNT0RVTEVfQVJHLCBNT0RVTEVfTkFNRV9BKSk7Ci0gICAgICAgIE1PRFVMRV9BUkdTLmFkZChTdHJpbmcuZm9ybWF0KE1PRFVMRV9BUkcsIE1PRFVMRV9OQU1FX0IpKTsKLSAgICAgICAgTU9EVUxFX0FSR1MuYWRkKFN0cmluZy5mb3JtYXQoTU9EVUxFX0FSRywgTU9EVUxFX05BTUVfQykpOwotICAgICAgICBGSUxFUy5hZGQoU3RyaW5nLmZvcm1hdChGSUxFTkFNRSwgTU9EVUxFX05BTUVfQSkpOwotICAgICAgICBGSUxFUy5hZGQoU3RyaW5nLmZvcm1hdChGSUxFTkFNRSwgTU9EVUxFX05BTUVfQikpOwotICAgICAgICBGSUxFUy5hZGQoU3RyaW5nLmZvcm1hdChGSUxFTkFNRSwgTU9EVUxFX05BTUVfQykpOwotICAgIH0KLSAgICBwcml2YXRlIE1vZHVsZVJlcG8gbVJlcG87Ci0gICAgcHJpdmF0ZSBGaWxlIG1UZXN0c0RpcjsKLSAgICBwcml2YXRlIEZpbGUgbVJvb3REaXI7Ci0gICAgcHJpdmF0ZSBJQnVpbGRJbmZvIG1Nb2NrQnVpbGRJbmZvOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbVRlc3RzRGlyID0gc2V0VXBDb25maWdzKCk7Ci0gICAgICAgIG1SZXBvID0gbmV3IE1vZHVsZVJlcG8oKTsKLSAgICAgICAgbU1vY2tCdWlsZEluZm8gPSBFYXN5TW9jay5jcmVhdGVNb2NrKElCdWlsZEluZm8uY2xhc3MpOwotICAgICAgICAvLyBGbGVzaCBvdXQgdGhlIHJlc3VsdCBkaXJlY3Rvcnkgc3RydWN0dXJlIHNvIE1vZHVsZVJlcG8gY2FuIHdyaXRlIHRvIHRoZSB0ZXN0IHJ1bnMgZmlsZQotICAgICAgICBtUm9vdERpciA9IEZpbGVVdGlsLmNyZWF0ZVRlbXBEaXIoInJvb3QiKTsKLSAgICAgICAgRmlsZSBzdWJSb290RGlyID0gbmV3IEZpbGUobVJvb3REaXIsIFN0cmluZy5mb3JtYXQoImFuZHJvaWQtc3VpdGUiKSk7Ci0gICAgICAgIEZpbGUgcmVzdWx0c0RpciA9IG5ldyBGaWxlKHN1YlJvb3REaXIsICJyZXN1bHRzIik7Ci0gICAgICAgIEZpbGUgcmVzdWx0RGlyID0gbmV3IEZpbGUocmVzdWx0c0RpciwgQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyLmdldERpclN1ZmZpeCgwKSk7Ci0gICAgICAgIHJlc3VsdERpci5ta2RpcnMoKTsKLQotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IG1vY2tCdWlsZEluZm9NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICAgICAgbW9ja0J1aWxkSW5mb01hcC5wdXQoUk9PVF9ESVJfQVRUUiwgbVJvb3REaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICBtb2NrQnVpbGRJbmZvTWFwLnB1dChTVUlURV9OQU1FX0FUVFIsICJzdWl0ZSIpOwotICAgICAgICBtb2NrQnVpbGRJbmZvTWFwLnB1dChTVEFSVF9USU1FX01TX0FUVFIsIExvbmcudG9TdHJpbmcoMCkpOwotICAgICAgICBFYXN5TW9jay5leHBlY3QobU1vY2tCdWlsZEluZm8uZ2V0QnVpbGRBdHRyaWJ1dGVzKCkpLmFuZFJldHVybihtb2NrQnVpbGRJbmZvTWFwKS5hbnlUaW1lcygpOwotICAgICAgICBFYXN5TW9jay5yZXBsYXkobU1vY2tCdWlsZEluZm8pOwotICAgIH0KLQotICAgIHByaXZhdGUgRmlsZSBzZXRVcENvbmZpZ3MoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBGaWxlIHRlc3RzRGlyID0gRmlsZVV0aWwuY3JlYXRlVGVtcERpcigidGVzdGNhc2VzIik7Ci0gICAgICAgIGNyZWF0ZUNvbmZpZyh0ZXN0c0RpciwgTU9EVUxFX05BTUVfQSwgbnVsbCk7Ci0gICAgICAgIGNyZWF0ZUNvbmZpZyh0ZXN0c0RpciwgTU9EVUxFX05BTUVfQiwgbnVsbCk7Ci0gICAgICAgIGNyZWF0ZUNvbmZpZyh0ZXN0c0RpciwgTU9EVUxFX05BTUVfQywgRk9PQkFSX1RPS0VOKTsKLSAgICAgICAgcmV0dXJuIHRlc3RzRGlyOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVDb25maWcoRmlsZSB0ZXN0c0RpciwgU3RyaW5nIG5hbWUsIFN0cmluZyB0b2tlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgY3JlYXRlQ29uZmlnKHRlc3RzRGlyLCBuYW1lLCB0b2tlbiwgVEVTVF9TVFVCKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlQ29uZmlnKEZpbGUgdGVzdHNEaXIsIFN0cmluZyBuYW1lLCBTdHJpbmcgdG9rZW4sIFN0cmluZyBtb2R1bGVDbGFzcykKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgY29uZmlnID0gbmV3IEZpbGUodGVzdHNEaXIsIFN0cmluZy5mb3JtYXQoRklMRU5BTUUsIG5hbWUpKTsKLSAgICAgICAgaWYgKCFjb25maWcuY3JlYXRlTmV3RmlsZSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiRmFpbGVkIHRvIGNyZWF0ZSAnJXMnIiwgY29uZmlnLmdldEFic29sdXRlUGF0aCgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIHByZXBhcmVyID0gIiI7Ci0gICAgICAgIGlmICh0b2tlbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcmVwYXJlciA9IFN0cmluZy5mb3JtYXQoVE9LRU4sIHRva2VuKTsKLSAgICAgICAgfQotICAgICAgICBGaWxlVXRpbC53cml0ZVRvRmlsZShTdHJpbmcuZm9ybWF0KENPTkZJRywgcHJlcGFyZXIsIG1vZHVsZUNsYXNzLCBuYW1lKSwgY29uZmlnKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBGaWxlVXRpbC5yZWN1cnNpdmVEZWxldGUobVRlc3RzRGlyKTsKLSAgICAgICAgdGVhckRvd25Db25maWdzKG1UZXN0c0Rpcik7Ci0gICAgICAgIHRlYXJEb3duQ29uZmlncyhtUm9vdERpcik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlYXJEb3duQ29uZmlncyhGaWxlIHRlc3RzRGlyKSB7Ci0gICAgICAgIEZpbGVVdGlsLnJlY3Vyc2l2ZURlbGV0ZSh0ZXN0c0Rpcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEluaXRpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1SZXBvLmluaXRpYWxpemUoMywgbnVsbCwgbVRlc3RzRGlyLCBBQklTLCBERVZJQ0VfVE9LRU5TLCBURVNUX0FSR1MsIE1PRFVMRV9BUkdTLCBJTkNMVURFUywKLSAgICAgICAgICAgICAgICBFWENMVURFUywgTUVUQURBVEFfSU5DTFVERVMsIE1FVEFEQVRBX0VYQ0xVREVTLCBtTW9ja0J1aWxkSW5mbyk7Ci0gICAgICAgIGFzc2VydFRydWUoIlNob3VsZCBiZSBpbml0aWFsaXplZCIsIG1SZXBvLmlzSW5pdGlhbGl6ZWQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIHNoYXJkcyIsIDMsIG1SZXBvLmdldE51bWJlck9mU2hhcmRzKCkpOwotICAgICAgICBNYXA8U3RyaW5nLCBTZXQ8U3RyaW5nPj4gZGV2aWNlVG9rZW5zID0gbVJlcG8uZ2V0RGV2aWNlVG9rZW5zKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIGRldmljZXMgd2l0aCB0b2tlbnMiLCAxLCBkZXZpY2VUb2tlbnMuc2l6ZSgpKTsKLSAgICAgICAgU2V0PFN0cmluZz4gdG9rZW5zID0gZGV2aWNlVG9rZW5zLmdldChTRVJJQUwzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgdG9rZW5zIiwgMSwgdG9rZW5zLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoIlVuZXhwZWN0ZWQgZGV2aWNlIHRva2VuIiwgdG9rZW5zLmNvbnRhaW5zKEZPT0JBUl9UT0tFTikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiBtb2R1bGVzIiwgNCwgbVJlcG8uZ2V0Tm9uVG9rZW5Nb2R1bGVzKCkuc2l6ZSgpKTsKLSAgICAgICAgTGlzdDxJTW9kdWxlRGVmPiB0b2tlbk1vZHVsZXMgPSBtUmVwby5nZXRUb2tlbk1vZHVsZXMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgbW9kdWxlcyB3aXRoIHRva2VucyIsIDIsIHRva2VuTW9kdWxlcy5zaXplKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRNb2R1bGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1SZXBvLmluaXRpYWxpemUoMSwgbnVsbCwgbVRlc3RzRGlyLCBBQklTLCBERVZJQ0VfVE9LRU5TLCBURVNUX0FSR1MsIE1PRFVMRV9BUkdTLCBJTkNMVURFUywKLSAgICAgICAgICAgICAgICBFWENMVURFUywgTUVUQURBVEFfSU5DTFVERVMsIE1FVEFEQVRBX0VYQ0xVREVTLCBtTW9ja0J1aWxkSW5mbyk7Ci0gICAgICAgIGFzc2VydFRydWUoIlNob3VsZCBiZSBpbml0aWFsaXplZCIsIG1SZXBvLmlzSW5pdGlhbGl6ZWQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIHRva2VucyIsIDIsIG1SZXBvLmdldFRva2VuTW9kdWxlcygpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIHRva2VucyIsIDQsIG1SZXBvLmdldE5vblRva2VuTW9kdWxlcygpLnNpemUoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBzaGFyZGluZyB3aXRoIDIgc2hhcmRzIG9mIHRoZSA0IG5vbiB0b2tlbiBtb2R1bGVzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRNb2R1bGVzU2hhcmRlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtUmVwby5pbml0aWFsaXplKDIsIG51bGwsIG1UZXN0c0RpciwgQUJJUywgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCksIFRFU1RfQVJHUywgTU9EVUxFX0FSR1MsCi0gICAgICAgICAgICAgICAgSU5DTFVERVMsIEVYQ0xVREVTLCBNRVRBREFUQV9JTkNMVURFUywgTUVUQURBVEFfRVhDTFVERVMsIG1Nb2NrQnVpbGRJbmZvKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiU2hvdWxkIGJlIGluaXRpYWxpemVkIiwgbVJlcG8uaXNJbml0aWFsaXplZCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgdG9rZW5zIiwgMiwgbVJlcG8uZ2V0VG9rZW5Nb2R1bGVzKCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgdG9rZW5zIiwgNCwgbVJlcG8uZ2V0Tm9uVG9rZW5Nb2R1bGVzKCkuc2l6ZSgpKTsKLSAgICAgICAgTGlzdDxJTW9kdWxlRGVmPiBzaGFyZDEgPSBtUmVwby5nZXRNb2R1bGVzKFNFUklBTDEsIDApOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgc2hhcmQxLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYXJtZWFiaS12N2EgRm9vTW9kdWxlQSIsIHNoYXJkMS5nZXQoMCkuZ2V0SWQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYXJtNjQtdjhhIEZvb01vZHVsZUEiLCBzaGFyZDEuZ2V0KDEpLmdldElkKCkpOwotICAgICAgICBMaXN0PElNb2R1bGVEZWY+IHNoYXJkMiA9IG1SZXBvLmdldE1vZHVsZXMoU0VSSUFMMiwgMSk7Ci0gICAgICAgIC8vIGxhc3Qgc2hhcmQgZ2V0cyB0aGUgdG9rZW4gbW9kdWxlcyB0b28KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIHNoYXJkMi5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFybWVhYmktdjdhIEZvb01vZHVsZUIiLCBzaGFyZDIuZ2V0KDApLmdldElkKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFybTY0LXY4YSBGb29Nb2R1bGVCIiwgc2hhcmQyLmdldCgxKS5nZXRJZCgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHJ1bm5pbmcgd2l0aCBvbmx5IHRva2VuIG1vZHVsZXMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEdldE1vZHVsZXNfb25seVRva2VuTW9kdWxlcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTZXQ8U3RyaW5nPiBpbmNsdWRlcyA9IG5ldyBIYXNoU2V0PD4oKTsKLSAgICAgICAgaW5jbHVkZXMuYWRkKE1PRFVMRV9OQU1FX0MpOwotICAgICAgICBtUmVwby5pbml0aWFsaXplKDEsIG51bGwsIG1UZXN0c0RpciwgQUJJUywgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCksIFRFU1RfQVJHUywgTU9EVUxFX0FSR1MsCi0gICAgICAgICAgICAgICAgaW5jbHVkZXMsIEVYQ0xVREVTLCBNRVRBREFUQV9JTkNMVURFUywgTUVUQURBVEFfRVhDTFVERVMsIG1Nb2NrQnVpbGRJbmZvKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiU2hvdWxkIGJlIGluaXRpYWxpemVkIiwgbVJlcG8uaXNJbml0aWFsaXplZCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgdG9rZW5zIiwgMiwgbVJlcG8uZ2V0VG9rZW5Nb2R1bGVzKCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgdG9rZW5zIiwgMCwgbVJlcG8uZ2V0Tm9uVG9rZW5Nb2R1bGVzKCkuc2l6ZSgpKTsKLSAgICAgICAgTGlzdDxJTW9kdWxlRGVmPiBtb2R1bGVzID0gbVJlcG8uZ2V0TW9kdWxlcyhTRVJJQUwxLCAwKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtb2R1bGVzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG1vZHVsZXMuc2l6ZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHJ1bm5pbmcgd2l0aCBvbmx5IHRva2VuIG1vZHVsZXMsIHdpdGggc2hhcmRlZCBsb2NhbCBydW4sIHdlIHNwZWNpZnkgYSB0b2tlbiBtb2R1bGUKLSAgICAgKiBmb3IgZWFjaCBkZXZpY2UsIHRlc3RzIHNob3VsZCBnbyBpbiB0aGUgcmlnaHQgcGxhY2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEdldE1vZHVsZXNfVG9rZW5Nb2R1bGVzX211bHRpRGV2aWNlcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBjcmVhdGVDb25maWcobVRlc3RzRGlyLCAiRm9vTW9kdWxlRCIsICJmb29iYXIyIik7Ci0gICAgICAgIFNldDxTdHJpbmc+IGluY2x1ZGVzID0gbmV3IEhhc2hTZXQ8PigpOwotICAgICAgICBpbmNsdWRlcy5hZGQoTU9EVUxFX05BTUVfQyk7Ci0gICAgICAgIGluY2x1ZGVzLmFkZCgiRm9vTW9kdWxlRCIpOwotICAgICAgICBMaXN0PFN0cmluZz4gdG9rZW5zID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIHRva2Vucy5hZGQoU3RyaW5nLmZvcm1hdCgiJXM6JXMiLCBTRVJJQUwxLCBGT09CQVJfVE9LRU4pKTsKLSAgICAgICAgdG9rZW5zLmFkZChTdHJpbmcuZm9ybWF0KCIlczolcyIsIFNFUklBTDIsICJmb29iYXIyIikpOwotICAgICAgICBtUmVwby5pbml0aWFsaXplKDIsIG51bGwsIG1UZXN0c0RpciwgQUJJUywgdG9rZW5zLCBURVNUX0FSR1MsIE1PRFVMRV9BUkdTLAotICAgICAgICAgICAgICAgIGluY2x1ZGVzLCBFWENMVURFUywgTUVUQURBVEFfSU5DTFVERVMsIE1FVEFEQVRBX0VYQ0xVREVTLCBtTW9ja0J1aWxkSW5mbyk7Ci0gICAgICAgIGFzc2VydFRydWUoIlNob3VsZCBiZSBpbml0aWFsaXplZCIsIG1SZXBvLmlzSW5pdGlhbGl6ZWQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIHRva2VucyIsIDQsIG1SZXBvLmdldFRva2VuTW9kdWxlcygpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIHRva2VucyIsIDAsIG1SZXBvLmdldE5vblRva2VuTW9kdWxlcygpLnNpemUoKSk7Ci0gICAgICAgIExpc3Q8SU1vZHVsZURlZj4gbW9kdWxlczEgPSBtUmVwby5nZXRNb2R1bGVzKFNFUklBTDEsIDApOwotICAgICAgICBhc3NlcnROb3ROdWxsKG1vZHVsZXMxKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG1vZHVsZXMxLnNpemUoKSk7Ci0gICAgICAgIC8vIE9ubHkgbW9kdWxlIEMgdG9rZW5zIHdpdGggc2VyaWFsIDEuCi0gICAgICAgIGFzc2VydFRydWUobW9kdWxlczEuZ2V0KDApLmdldElkKCkuY29udGFpbnMoTU9EVUxFX05BTUVfQykpOwotICAgICAgICBhc3NlcnRUcnVlKG1vZHVsZXMxLmdldCgxKS5nZXRJZCgpLmNvbnRhaW5zKE1PRFVMRV9OQU1FX0MpKTsKLSAgICAgICAgTGlzdDxJTW9kdWxlRGVmPiBtb2R1bGVzMiA9IG1SZXBvLmdldE1vZHVsZXMoU0VSSUFMMiwgMSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwobW9kdWxlczIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbW9kdWxlczIuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShtb2R1bGVzMi5nZXQoMCkuZ2V0SWQoKS5jb250YWlucygiRm9vTW9kdWxlRCIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShtb2R1bGVzMi5nZXQoMSkuZ2V0SWQoKS5jb250YWlucygiRm9vTW9kdWxlRCIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHNoYXJkaW5nIHdpdGggNCBzaGFyZHMgb2YgdGhlIDYgbm9uIHRva2VuIG1vZHVsZXMgKyAyIHRva2VuIG1vZHVsZXMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEdldE1vZHVsZXNTaGFyZGVkX3VuZXZlbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBjcmVhdGVDb25maWcobVRlc3RzRGlyLCAiRm9vTW9kdWxlRCIsIG51bGwpOwotICAgICAgICBtUmVwby5pbml0aWFsaXplKDQsIG51bGwsIG1UZXN0c0RpciwgQUJJUywgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCksIFRFU1RfQVJHUywgTU9EVUxFX0FSR1MsCi0gICAgICAgICAgICAgICAgSU5DTFVERVMsIEVYQ0xVREVTLCBNRVRBREFUQV9JTkNMVURFUywgTUVUQURBVEFfRVhDTFVERVMsIG1Nb2NrQnVpbGRJbmZvKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiU2hvdWxkIGJlIGluaXRpYWxpemVkIiwgbVJlcG8uaXNJbml0aWFsaXplZCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgdG9rZW5zIiwgMiwgbVJlcG8uZ2V0VG9rZW5Nb2R1bGVzKCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgdG9rZW5zIiwgNiwgbVJlcG8uZ2V0Tm9uVG9rZW5Nb2R1bGVzKCkuc2l6ZSgpKTsKLQotICAgICAgICBMaXN0PElNb2R1bGVEZWY+IHNoYXJkMSA9IG1SZXBvLmdldE1vZHVsZXMoU0VSSUFMMSwgMCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBzaGFyZDEuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhcm1lYWJpLXY3YSBGb29Nb2R1bGVBIiwgc2hhcmQxLmdldCgwKS5nZXRJZCgpKTsKLQotICAgICAgICBMaXN0PElNb2R1bGVEZWY+IHNoYXJkMiA9IG1SZXBvLmdldE1vZHVsZXMoU0VSSUFMMiwgMSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBzaGFyZDIuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhcm02NC12OGEgRm9vTW9kdWxlQSIsIHNoYXJkMi5nZXQoMCkuZ2V0SWQoKSk7Ci0KLSAgICAgICAgTGlzdDxJTW9kdWxlRGVmPiBzaGFyZDMgPSBtUmVwby5nZXRNb2R1bGVzKFNFUklBTDMsIDIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgc2hhcmQzLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYXJtZWFiaS12N2EgRm9vTW9kdWxlQiIsIHNoYXJkMy5nZXQoMCkuZ2V0SWQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYXJtNjQtdjhhIEZvb01vZHVsZUIiLCBzaGFyZDMuZ2V0KDEpLmdldElkKCkpOwotCi0gICAgICAgIExpc3Q8SU1vZHVsZURlZj4gc2hhcmQ0ID0gbVJlcG8uZ2V0TW9kdWxlcyhTRVJJQUwyLCAzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIHNoYXJkNC5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFybWVhYmktdjdhIEZvb01vZHVsZUMiLCBzaGFyZDQuZ2V0KDApLmdldElkKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFybTY0LXY4YSBGb29Nb2R1bGVDIiwgc2hhcmQ0LmdldCgxKS5nZXRJZCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhcm1lYWJpLXY3YSBGb29Nb2R1bGVEIiwgc2hhcmQ0LmdldCgyKS5nZXRJZCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhcm02NC12OGEgRm9vTW9kdWxlRCIsIHNoYXJkNC5nZXQoMykuZ2V0SWQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvbmZpZ0ZpbHRlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBGaWxlW10gY29uZmlnRmlsZXMgPSBtVGVzdHNEaXIubGlzdEZpbGVzKG5ldyBDb25maWdGaWx0ZXIoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIGNvbmZpZyBmaWxlcyBmb3VuZC4iLCAzLCBjb25maWdGaWxlcy5sZW5ndGgpOwotICAgICAgICBmb3IgKEZpbGUgZmlsZSA6IGNvbmZpZ0ZpbGVzKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoIlVucmVjb2duaXNlZCBmaWxlOiAlcyIsIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpLAotICAgICAgICAgICAgICAgICAgICBGSUxFUy5jb250YWlucyhmaWxlLmdldE5hbWUoKSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEZpbHRlcmluZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTZXQ8U3RyaW5nPiBpbmNsdWRlRmlsdGVycyA9IG5ldyBIYXNoU2V0PD4oKTsKLSAgICAgICAgaW5jbHVkZUZpbHRlcnMuYWRkKE1PRFVMRV9OQU1FX0EpOwotICAgICAgICBTZXQ8U3RyaW5nPiBleGNsdWRlRmlsdGVycyA9IG5ldyBIYXNoU2V0PD4oKTsKLSAgICAgICAgZXhjbHVkZUZpbHRlcnMuYWRkKElEX0FfMzIpOwotICAgICAgICBleGNsdWRlRmlsdGVycy5hZGQoTU9EVUxFX05BTUVfQik7Ci0gICAgICAgIG1SZXBvLmluaXRpYWxpemUoMSwgbnVsbCwgbVRlc3RzRGlyLCBBQklTLCBERVZJQ0VfVE9LRU5TLCBURVNUX0FSR1MsIE1PRFVMRV9BUkdTLAotICAgICAgICAgICAgICAgIGluY2x1ZGVGaWx0ZXJzLCBleGNsdWRlRmlsdGVycywgTUVUQURBVEFfSU5DTFVERVMsIE1FVEFEQVRBX0VYQ0xVREVTLAotICAgICAgICAgICAgICAgIG1Nb2NrQnVpbGRJbmZvKTsKLSAgICAgICAgTGlzdDxJTW9kdWxlRGVmPiBtb2R1bGVzID0gbVJlcG8uZ2V0TW9kdWxlcyhTRVJJQUwxLCAwKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgbnVtYmVyIG9mIG1vZHVsZXMiLCAxLCBtb2R1bGVzLnNpemUoKSk7Ci0gICAgICAgIElNb2R1bGVEZWYgbW9kdWxlID0gbW9kdWxlcy5nZXQoMCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IElEIiwgSURfQV82NCwgbW9kdWxlLmdldElkKCkpOwotICAgICAgICBjaGVja0FyZ3MobW9kdWxlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHRoYXQgZXhjbHVkZWQgbW9kdWxlIHNob3VsZG4ndCBiZSBsb2FkZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEluaXRpYWxpemF0aW9uX0V4Y2x1ZGVNb2R1bGVfU2tpcExvYWRpbmdDb25maWcoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTZXQ8U3RyaW5nPiBleGNsdWRlRmlsdGVycyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgICAgIGV4Y2x1ZGVGaWx0ZXJzLmFkZChOT05fRVhJU1RTX01PRFVMRV9OQU1FKTsKLSAgICAgICAgICAgIG1SZXBvLmluaXRpYWxpemUoMSwgbnVsbCwgbVRlc3RzRGlyLCBBQklTLCBERVZJQ0VfVE9LRU5TLCBURVNUX0FSR1MsCi0gICAgICAgICAgICAgICAgICAgIE1PRFVMRV9BUkdTLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpLCBleGNsdWRlRmlsdGVycywKLSAgICAgICAgICAgICAgICAgICAgTUVUQURBVEFfSU5DTFVERVMsIE1FVEFEQVRBX0VYQ0xVREVTLAotICAgICAgICAgICAgICAgICAgICBtTW9ja0J1aWxkSW5mbyk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJJbml0aWFsaXphdGlvbiBzaG91bGQgbm90IGZhaWwgaWYgbm9uLWV4aXN0aW5nIG1vZHVsZSBpcyBleGNsdWRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCB0aGF0IHtAbGluayBNb2R1bGVSZXBvI2dldE1vZHVsZXMoU3RyaW5nLCBpbnQpfSBoYW5kbGVzIHdlbGwgYWxsIG1vZHVsZSBiZWluZyBmaWx0ZXJlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsdGVyaW5nX2VtcHR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNldDxTdHJpbmc+IGluY2x1ZGVGaWx0ZXJzID0gbmV3IEhhc2hTZXQ8PigpOwotICAgICAgICBTZXQ8U3RyaW5nPiBleGNsdWRlRmlsdGVycyA9IG5ldyBIYXNoU2V0PD4oKTsKLSAgICAgICAgZXhjbHVkZUZpbHRlcnMuYWRkKE1PRFVMRV9OQU1FX0EpOwotICAgICAgICBleGNsdWRlRmlsdGVycy5hZGQoTU9EVUxFX05BTUVfQik7Ci0gICAgICAgIGV4Y2x1ZGVGaWx0ZXJzLmFkZChNT0RVTEVfTkFNRV9DKTsKLSAgICAgICAgbVJlcG8uaW5pdGlhbGl6ZSgxLCBudWxsLCBtVGVzdHNEaXIsIEFCSVMsIERFVklDRV9UT0tFTlMsIFRFU1RfQVJHUywgTU9EVUxFX0FSR1MsCi0gICAgICAgICAgICAgICAgaW5jbHVkZUZpbHRlcnMsIGV4Y2x1ZGVGaWx0ZXJzLAotICAgICAgICAgICAgICAgIE1FVEFEQVRBX0lOQ0xVREVTLCBNRVRBREFUQV9FWENMVURFUywgbU1vY2tCdWlsZEluZm8pOwotICAgICAgICBMaXN0PElNb2R1bGVEZWY+IG1vZHVsZXMgPSBtUmVwby5nZXRNb2R1bGVzKFNFUklBTDEsIDApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBudW1iZXIgb2YgbW9kdWxlcyIsIDAsIG1vZHVsZXMuc2l6ZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2luZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtUmVwby5pbml0aWFsaXplKDEsIG51bGwsIG1UZXN0c0RpciwgQUJJUywgREVWSUNFX1RPS0VOUywgVEVTVF9BUkdTLCBNT0RVTEVfQVJHUywgSU5DTFVERVMsCi0gICAgICAgICAgICAgICAgRVhDTFVERVMsIE1FVEFEQVRBX0lOQ0xVREVTLCBNRVRBREFUQV9FWENMVURFUywgbU1vY2tCdWlsZEluZm8pOwotICAgICAgICBMaXN0PElNb2R1bGVEZWY+IG1vZHVsZXMgPSBtUmVwby5nZXRNb2R1bGVzKFNFUklBTDMsIDApOwotICAgICAgICBTZXQ8U3RyaW5nPiBpZFNldCA9IG5ldyBIYXNoU2V0PD4oKTsKLSAgICAgICAgZm9yIChJTW9kdWxlRGVmIG1vZHVsZSA6IG1vZHVsZXMpIHsKLSAgICAgICAgICAgIGlkU2V0LmFkZChtb2R1bGUuZ2V0SWQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgbnVtYmVyIG9mIElEcyIsIDYsIGlkU2V0LnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoIk1pc3NpbmcgSURfQV8zMiIsIGlkU2V0LmNvbnRhaW5zKElEX0FfMzIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiTWlzc2luZyBJRF9BXzY0IiwgaWRTZXQuY29udGFpbnMoSURfQV82NCkpOwotICAgICAgICBhc3NlcnRUcnVlKCJNaXNzaW5nIElEX0JfMzIiLCBpZFNldC5jb250YWlucyhJRF9CXzMyKSk7Ci0gICAgICAgIGFzc2VydFRydWUoIk1pc3NpbmcgSURfQl82NCIsIGlkU2V0LmNvbnRhaW5zKElEX0JfNjQpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiTWlzc2luZyBJRF9DXzMyIiwgaWRTZXQuY29udGFpbnMoSURfQ18zMikpOwotICAgICAgICBhc3NlcnRUcnVlKCJNaXNzaW5nIElEX0NfNjQiLCBpZFNldC5jb250YWlucyhJRF9DXzY0KSk7Ci0gICAgICAgIGZvciAoSU1vZHVsZURlZiBtb2R1bGUgOiBtb2R1bGVzKSB7Ci0gICAgICAgICAgICBjaGVja0FyZ3MobW9kdWxlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja0FyZ3MoSU1vZHVsZURlZiBtb2R1bGUpIHsKLSAgICAgICAgSVJlbW90ZVRlc3QgdGVzdCA9IG1vZHVsZS5nZXRUZXN0KCk7Ci0gICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCB0ZXN0IHR5cGUiLCB0ZXN0IGluc3RhbmNlb2YgVGVzdFN0dWIpOwotICAgICAgICBUZXN0U3R1YiBzdHViID0gKFRlc3RTdHViKSB0ZXN0OwotICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCB0ZXN0IGFyZyIsICJiYXIiLCBzdHViLm1Gb28pOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBtb2R1bGUgYXJnIiwgImZvb2JhciIsIHN0dWIubUJsYWgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTcGxpdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBjcmVhdGVDb25maWcobVRlc3RzRGlyLCAic2hhcmRlZF8xIiwgbnVsbCwgU0hBUkRBQkxFX1RFU1RfU1RVQik7Ci0gICAgICAgIGNyZWF0ZUNvbmZpZyhtVGVzdHNEaXIsICJzaGFyZGVkXzIiLCBudWxsLCBTSEFSREFCTEVfVEVTVF9TVFVCKTsKLSAgICAgICAgY3JlYXRlQ29uZmlnKG1UZXN0c0RpciwgInNoYXJkZWRfMyIsIG51bGwsIFNIQVJEQUJMRV9URVNUX1NUVUIpOwotICAgICAgICBTZXQ8SUFiaT4gYWJpcyA9IG5ldyBIYXNoU2V0PD4oKTsKLSAgICAgICAgYWJpcy5hZGQobmV3IEFiaShBQklfNjQsICI2NCIpKTsKLSAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gZW1wdHlMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0KLSAgICAgICAgbVJlcG8uaW5pdGlhbGl6ZSgzLCAwLCBtVGVzdHNEaXIsIGFiaXMsIERFVklDRV9UT0tFTlMsIGVtcHR5TGlzdCwgZW1wdHlMaXN0LCBJTkNMVURFUywKLSAgICAgICAgICAgICAgICAgICAgICAgICBFWENMVURFUywgTUVUQURBVEFfSU5DTFVERVMsIE1FVEFEQVRBX0VYQ0xVREVTLCBtTW9ja0J1aWxkSW5mbyk7Ci0KLSAgICAgICAgTGlzdDxJTW9kdWxlRGVmPiBtb2R1bGVzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIG1vZHVsZXMuYWRkQWxsKG1SZXBvLmdldE5vblRva2VuTW9kdWxlcygpKTsKLSAgICAgICAgbW9kdWxlcy5hZGRBbGwobVJlcG8uZ2V0VG9rZW5Nb2R1bGVzKCkpOwotCi0gICAgICAgIGludCBzaGFyZGFibGVDb3VudCA9IDA7Ci0gICAgICAgIGZvciAoSU1vZHVsZURlZiBkZWYgOiBtb2R1bGVzKSB7Ci0gICAgICAgICAgICBJUmVtb3RlVGVzdCB0ZXN0ID0gZGVmLmdldFRlc3QoKTsKLSAgICAgICAgICAgIGlmICh0ZXN0IGluc3RhbmNlb2YgSVN0cmljdFNoYXJkYWJsZVRlc3QpIHsKLSAgICAgICAgICAgICAgICBzaGFyZGFibGVDb3VudCsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscygiU2hhcmRzIHdyb25nIiwgOSwgc2hhcmRhYmxlQ291bnQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRNb2R1bGVJZHMoKSB7Ci0gICAgICAgIG1SZXBvLmluaXRpYWxpemUoMywgbnVsbCwgbVRlc3RzRGlyLCBBQklTLCBERVZJQ0VfVE9LRU5TLCBURVNUX0FSR1MsIE1PRFVMRV9BUkdTLCBJTkNMVURFUywKLSAgICAgICAgICAgICAgICBFWENMVURFUywgTUVUQURBVEFfSU5DTFVERVMsIE1FVEFEQVRBX0VYQ0xVREVTLCBtTW9ja0J1aWxkSW5mbyk7Ci0gICAgICAgIGFzc2VydFRydWUoIlNob3VsZCBiZSBpbml0aWFsaXplZCIsIG1SZXBvLmlzSW5pdGlhbGl6ZWQoKSk7Ci0KLSAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMoRVhQRUNURURfTU9EVUxFX0lEUywgbVJlcG8uZ2V0TW9kdWxlSWRzKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRBcnJheUVxdWFscyhPYmplY3RbXSBleHBlY3RlZCwgT2JqZWN0W10gYWN0dWFsKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KGV4cGVjdGVkKSwgQXJyYXlzLmFzTGlzdChhY3R1YWwpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGNsYXNzIHRvIHByb3ZpZGUgcnVudGltZUhpbnQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBUZXN0UnVudGltZSBpbXBsZW1lbnRzIElSZW1vdGVUZXN0LCBJUnVudGltZUhpbnRQcm92aWRlciwgSUFiaVJlY2VpdmVyLAotICAgICAgICAgICAgSVRlc3RDb2xsZWN0b3IsIElUZXN0RmlsdGVyUmVjZWl2ZXIgewotICAgICAgICBwdWJsaWMgbG9uZyBydW50aW1lSGludCA9IDBsOwotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGxvbmcgZ2V0UnVudGltZUhpbnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gcnVudGltZUhpbnQ7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gaWdub3JlIGFsbCB0aGUgb3RoZXIgY2FsbHMKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bihJVGVzdEludm9jYXRpb25MaXN0ZW5lciBhcmcwKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHt9Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRBbGxFeGNsdWRlRmlsdGVycyhTZXQ8U3RyaW5nPiBhcmcwKSB7fQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgYWRkQWxsSW5jbHVkZUZpbHRlcnMoU2V0PFN0cmluZz4gYXJnMCkge30KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZEV4Y2x1ZGVGaWx0ZXIoU3RyaW5nIGFyZzApIHt9Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRJbmNsdWRlRmlsdGVyKFN0cmluZyBhcmcwKSB7fQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0Q29sbGVjdFRlc3RzT25seShib29sZWFuIGFyZzApIHt9Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRBYmkoSUFiaSBhcmcwKSB7fQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIElBYmkgZ2V0QWJpKCkge3JldHVybiBudWxsO30KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCYWxhbmNlIHRoZSBsb2FkIG9mIHJ1bnRpbWUgb2YgdGhlIG1vZHVsZXMgZm9yIHRoZSBzYW1lIHJ1bnRpbWVoaW50IGV2ZXJ5d2hlcmUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEdldHNoYXJkX2FsbFNhbWVSdW50aW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3Q8SU1vZHVsZURlZj4gdGVzdExpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgVGVzdFJ1bnRpbWUgdGVzdDEgPSBuZXcgVGVzdFJ1bnRpbWUoKTsKLSAgICAgICAgdGVzdDEucnVudGltZUhpbnQgPSAxMDBsOwotICAgICAgICBJTW9kdWxlRGVmIG1vZDEgPSBuZXcgTW9kdWxlRGVmKCJ0ZXN0MSIsIG5ldyBBYmkoImFybSIsICIzMiIpLCB0ZXN0MSwKLSAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PElUYXJnZXRQcmVwYXJlcj4oKSwgbmV3IENvbmZpZ3VyYXRpb25EZXNjcmlwdG9yKCkpOwotICAgICAgICB0ZXN0TGlzdC5hZGQobW9kMSk7Ci0gICAgICAgIFRlc3RSdW50aW1lIHRlc3QyID0gbmV3IFRlc3RSdW50aW1lKCk7Ci0gICAgICAgIHRlc3QyLnJ1bnRpbWVIaW50ID0gMTAwbDsKLSAgICAgICAgSU1vZHVsZURlZiBtb2QyID0gbmV3IE1vZHVsZURlZigidGVzdDIiLCBuZXcgQWJpKCJhcm0iLCAiMzIiKSwgdGVzdDIsCi0gICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxJVGFyZ2V0UHJlcGFyZXI+KCksIG5ldyBDb25maWd1cmF0aW9uRGVzY3JpcHRvcigpKTsKLSAgICAgICAgdGVzdExpc3QuYWRkKG1vZDIpOwotICAgICAgICBUZXN0UnVudGltZSB0ZXN0MyA9IG5ldyBUZXN0UnVudGltZSgpOwotICAgICAgICB0ZXN0My5ydW50aW1lSGludCA9IDEwMGw7Ci0gICAgICAgIElNb2R1bGVEZWYgbW9kMyA9IG5ldyBNb2R1bGVEZWYoInRlc3QzIiwgbmV3IEFiaSgiYXJtIiwgIjMyIiksIHRlc3QzLAotICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8SVRhcmdldFByZXBhcmVyPigpLCBuZXcgQ29uZmlndXJhdGlvbkRlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHRlc3RMaXN0LmFkZChtb2QzKTsKLSAgICAgICAgVGVzdFJ1bnRpbWUgdGVzdDQgPSBuZXcgVGVzdFJ1bnRpbWUoKTsKLSAgICAgICAgdGVzdDQucnVudGltZUhpbnQgPSAxMDBsOwotICAgICAgICBJTW9kdWxlRGVmIG1vZDQgPSBuZXcgTW9kdWxlRGVmKCJ0ZXN0NCIsIG5ldyBBYmkoImFybSIsICIzMiIpLCB0ZXN0NCwKLSAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PElUYXJnZXRQcmVwYXJlcj4oKSwgbmV3IENvbmZpZ3VyYXRpb25EZXNjcmlwdG9yKCkpOwotICAgICAgICB0ZXN0TGlzdC5hZGQobW9kNCk7Ci0gICAgICAgIC8vIGlmIHdlIGRvbid0IHNoYXJkIGV2ZXJ5dGhpbmcgaXMgaW4gb25lIHNoYXJkLgotICAgICAgICBMaXN0PElNb2R1bGVEZWY+IHJlcyA9IG1SZXBvLmdldFNoYXJkKHRlc3RMaXN0LCAwLCAxKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIHJlcy5zaXplKCkpOwotICAgICAgICByZXMgPSBtUmVwby5nZXRTaGFyZCh0ZXN0TGlzdCwgMCwgMik7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCByZXMuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG1vZDEsIHJlcy5nZXQoMCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMobW9kMiwgcmVzLmdldCgxKSk7Ci0gICAgICAgIHJlcyA9IG1SZXBvLmdldFNoYXJkKHRlc3RMaXN0LCAxLCAyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHJlcy5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMobW9kMywgcmVzLmdldCgwKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhtb2Q0LCByZXMuZ2V0KDEpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXaGVuIHJlYWNoaW5nIHNwbGl0dGluZyB0aW1lLCB3ZSBuZWVkIHRvIGVuc3VyZSB0aGF0IGV2ZW4gYWZ0ZXIgYmVzdCBlZmZvcnQsIGlmIHdlIGNhbm5vdAotICAgICAqIHNwbGl0IGludG8gdGhlIHJlcXVlc3RlZCBudW1iZXIgb2Ygc2hhcmRJbmRleCwgd2Ugc2ltcGx5IHJldHVybiBudWxsIHRvIHJlcG9ydCBhbiBlbXB0eQotICAgICAqIHNoYXJkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTaGFyZF9jYW5ub3RTcGxpdE1vcmUoKSB7Ci0gICAgICAgIExpc3Q8SU1vZHVsZURlZj4gdGVzdExpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgVGVzdFJ1bnRpbWUgdGVzdDEgPSBuZXcgVGVzdFJ1bnRpbWUoKTsKLSAgICAgICAgdGVzdDEucnVudGltZUhpbnQgPSAxMDBsOwotICAgICAgICBJTW9kdWxlRGVmIG1vZDEgPSBuZXcgTW9kdWxlRGVmKCJ0ZXN0MSIsIG5ldyBBYmkoImFybSIsICIzMiIpLCB0ZXN0MSwKLSAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PElUYXJnZXRQcmVwYXJlcj4oKSwgbmV3IENvbmZpZ3VyYXRpb25EZXNjcmlwdG9yKCkpOwotICAgICAgICB0ZXN0TGlzdC5hZGQobW9kMSk7Ci0gICAgICAgIExpc3Q8SU1vZHVsZURlZj4gcmVzID0gbVJlcG8uZ2V0U2hhcmQodGVzdExpc3QsIDEsIDIpOwotICAgICAgICBhc3NlcnROdWxsKHJlcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2hlbiB0aGVyZSBhcmUgbm8gbWV0YWRhdGEgYmFzZWQgZmlsdGVycyBzcGVjaWZpZWQsIGNvbmZpZyBzaG91bGQgYmUgaW5jbHVkZWQKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRhZGF0YUZpbHRlcl9lbXB0eUZpbHRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSUNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IENvbmZpZ3VyYXRpb24oImZvbyIsICJiYXIiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiY29uZmlnIG5vdCBpbmNsdWRlZCB3aGVuIG1ldGFkYXRhIGZpbHRlcnMgYXJlIGVtcHR5IiwKLSAgICAgICAgICAgICAgICBtUmVwby5maWx0ZXJCeUNvbmZpZ01ldGFkYXRhKGNvbmZpZywgTUVUQURBVEFfSU5DTFVERVMsIE1FVEFEQVRBX0VYQ0xVREVTKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2hlbiBpbmNsdXNpb24gZmlsdGVyIGlzIHNwZWNpZmllZCwgY29uZmlnIG1hdGNoaW5nIHRoZSBmaWx0ZXIgaXMgaW5jbHVkZWQKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRhZGF0YUZpbHRlcl9tYXRjaEluY2x1ZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSUNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IENvbmZpZ3VyYXRpb24oImZvbyIsICJiYXIiKTsKLSAgICAgICAgQ29uZmlndXJhdGlvbkRlc2NyaXB0b3IgZGVzYyA9IGNvbmZpZy5nZXRDb25maWd1cmF0aW9uRGVzY3JpcHRpb24oKTsKLSAgICAgICAgTXVsdGlNYXA8U3RyaW5nLCBTdHJpbmc+IG1ldGFkYXRhID0gbmV3IE11bHRpTWFwPD4oKTsKLSAgICAgICAgbWV0YWRhdGEucHV0KCJjb21wb25lbnQiLCAiZm9vIik7Ci0gICAgICAgIGRlc2Muc2V0TWV0YURhdGEobWV0YWRhdGEpOwotICAgICAgICBNdWx0aU1hcDxTdHJpbmcsIFN0cmluZz4gaW5jbHVkZUZpbHRlciA9IG5ldyBNdWx0aU1hcDw+KCk7Ci0gICAgICAgIGluY2x1ZGVGaWx0ZXIucHV0KCJjb21wb25lbnQiLCAiZm9vIik7Ci0gICAgICAgIGFzc2VydFRydWUoImNvbmZpZyBub3QgaW5jbHVkZWQgd2l0aCBtYXRjaGluZyBpbmNsdXNpb24gZmlsdGVyIiwKLSAgICAgICAgICAgICAgICBtUmVwby5maWx0ZXJCeUNvbmZpZ01ldGFkYXRhKGNvbmZpZywgaW5jbHVkZUZpbHRlciwgTUVUQURBVEFfRVhDTFVERVMpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXaGVuIGluY2x1c2lvbiBmaWx0ZXIgaXMgc3BlY2lmaWVkLCBjb25maWcgbm90IG1hdGNoaW5nIHRoZSBmaWx0ZXIgaXMgZXhjbHVkZWQKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRhZGF0YUZpbHRlcl9ub01hdGNoSW5jbHVkZV9taXNtYXRjaFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIElDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBDb25maWd1cmF0aW9uKCJmb28iLCAiYmFyIik7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25EZXNjcmlwdG9yIGRlc2MgPSBjb25maWcuZ2V0Q29uZmlndXJhdGlvbkRlc2NyaXB0aW9uKCk7Ci0gICAgICAgIE11bHRpTWFwPFN0cmluZywgU3RyaW5nPiBtZXRhZGF0YSA9IG5ldyBNdWx0aU1hcDw+KCk7Ci0gICAgICAgIG1ldGFkYXRhLnB1dCgiY29tcG9uZW50IiwgImZvbyIpOwotICAgICAgICBkZXNjLnNldE1ldGFEYXRhKG1ldGFkYXRhKTsKLSAgICAgICAgTXVsdGlNYXA8U3RyaW5nLCBTdHJpbmc+IGluY2x1ZGVGaWx0ZXIgPSBuZXcgTXVsdGlNYXA8PigpOwotICAgICAgICBpbmNsdWRlRmlsdGVyLnB1dCgiY29tcG9uZW50IiwgImJhciIpOwotICAgICAgICBhc3NlcnRGYWxzZSgiY29uZmlnIG5vdCBleGNsdWRlZCB3aXRoIG1pc21hdGNoaW5nIGluY2x1c2lvbiBmaWx0ZXIiLAotICAgICAgICAgICAgICAgIG1SZXBvLmZpbHRlckJ5Q29uZmlnTWV0YWRhdGEoY29uZmlnLCBpbmNsdWRlRmlsdGVyLCBNRVRBREFUQV9FWENMVURFUykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdoZW4gaW5jbHVzaW9uIGZpbHRlciBpcyBzcGVjaWZpZWQsIGNvbmZpZyBub3QgbWF0Y2hpbmcgdGhlIGZpbHRlciBpcyBleGNsdWRlZAotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE1ldGFkYXRhRmlsdGVyX25vTWF0Y2hJbmNsdWRlX21pc21hdGNoS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIElDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBDb25maWd1cmF0aW9uKCJmb28iLCAiYmFyIik7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25EZXNjcmlwdG9yIGRlc2MgPSBjb25maWcuZ2V0Q29uZmlndXJhdGlvbkRlc2NyaXB0aW9uKCk7Ci0gICAgICAgIE11bHRpTWFwPFN0cmluZywgU3RyaW5nPiBtZXRhZGF0YSA9IG5ldyBNdWx0aU1hcDw+KCk7Ci0gICAgICAgIG1ldGFkYXRhLnB1dCgiY29tcG9uZW50IiwgImZvbyIpOwotICAgICAgICBkZXNjLnNldE1ldGFEYXRhKG1ldGFkYXRhKTsKLSAgICAgICAgTXVsdGlNYXA8U3RyaW5nLCBTdHJpbmc+IGluY2x1ZGVGaWx0ZXIgPSBuZXcgTXVsdGlNYXA8PigpOwotICAgICAgICBpbmNsdWRlRmlsdGVyLnB1dCgiZ3JvdXAiLCAiYmFyIik7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJjb25maWcgbm90IGV4Y2x1ZGVkIHdpdGggbWlzbWF0Y2hpbmcgaW5jbHVzaW9uIGZpbHRlciIsCi0gICAgICAgICAgICAgICAgbVJlcG8uZmlsdGVyQnlDb25maWdNZXRhZGF0YShjb25maWcsIGluY2x1ZGVGaWx0ZXIsIE1FVEFEQVRBX0VYQ0xVREVTKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2hlbiBleGNsdXNpb24gZmlsdGVyIGlzIHNwZWNpZmllZCwgY29uZmlnIG1hdGNoaW5nIHRoZSBmaWx0ZXIgaXMgZXhjbHVkZWQKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRhZGF0YUZpbHRlcl9tYXRjaEV4Y2x1ZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSUNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IENvbmZpZ3VyYXRpb24oImZvbyIsICJiYXIiKTsKLSAgICAgICAgQ29uZmlndXJhdGlvbkRlc2NyaXB0b3IgZGVzYyA9IGNvbmZpZy5nZXRDb25maWd1cmF0aW9uRGVzY3JpcHRpb24oKTsKLSAgICAgICAgTXVsdGlNYXA8U3RyaW5nLCBTdHJpbmc+IG1ldGFkYXRhID0gbmV3IE11bHRpTWFwPD4oKTsKLSAgICAgICAgbWV0YWRhdGEucHV0KCJjb21wb25lbnQiLCAiZm9vIik7Ci0gICAgICAgIGRlc2Muc2V0TWV0YURhdGEobWV0YWRhdGEpOwotICAgICAgICBNdWx0aU1hcDxTdHJpbmcsIFN0cmluZz4gZXhjbHVkZUZpbHRlciA9IG5ldyBNdWx0aU1hcDw+KCk7Ci0gICAgICAgIGV4Y2x1ZGVGaWx0ZXIucHV0KCJjb21wb25lbnQiLCAiZm9vIik7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJjb25maWcgbm90IGV4Y2x1ZGVkIHdpdGggbWF0Y2hpbmcgZXhjbHVzaW9uIGZpbHRlciIsCi0gICAgICAgICAgICAgICAgbVJlcG8uZmlsdGVyQnlDb25maWdNZXRhZGF0YShjb25maWcsIE1FVEFEQVRBX0lOQ0xVREVTLCBleGNsdWRlRmlsdGVyKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2hlbiBleGNsdXNpb24gZmlsdGVyIGlzIHNwZWNpZmllZCwgY29uZmlnIG5vdCBtYXRjaGluZyB0aGUgZmlsdGVyIGlzIGluY2x1ZGVkCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0YWRhdGFGaWx0ZXJfbm9NYXRjaEV4Y2x1ZGVfbWlzbWF0Y2hLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSUNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IENvbmZpZ3VyYXRpb24oImZvbyIsICJiYXIiKTsKLSAgICAgICAgQ29uZmlndXJhdGlvbkRlc2NyaXB0b3IgZGVzYyA9IGNvbmZpZy5nZXRDb25maWd1cmF0aW9uRGVzY3JpcHRpb24oKTsKLSAgICAgICAgTXVsdGlNYXA8U3RyaW5nLCBTdHJpbmc+IG1ldGFkYXRhID0gbmV3IE11bHRpTWFwPD4oKTsKLSAgICAgICAgbWV0YWRhdGEucHV0KCJjb21wb25lbnQiLCAiZm9vIik7Ci0gICAgICAgIGRlc2Muc2V0TWV0YURhdGEobWV0YWRhdGEpOwotICAgICAgICBNdWx0aU1hcDxTdHJpbmcsIFN0cmluZz4gZXhjbHVkZUZpbHRlciA9IG5ldyBNdWx0aU1hcDw+KCk7Ci0gICAgICAgIGV4Y2x1ZGVGaWx0ZXIucHV0KCJjb21wb25lbnQiLCAiYmFyIik7Ci0gICAgICAgIGFzc2VydFRydWUoImNvbmZpZyBub3QgaW5jbHVkZWQgd2l0aCBtaXNtYXRjaGluZyBleGNsdXNpb24gZmlsdGVyIiwKLSAgICAgICAgICAgICAgICBtUmVwby5maWx0ZXJCeUNvbmZpZ01ldGFkYXRhKGNvbmZpZywgTUVUQURBVEFfSU5DTFVERVMsIGV4Y2x1ZGVGaWx0ZXIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXaGVuIGV4Y2x1c2lvbiBmaWx0ZXIgaXMgc3BlY2lmaWVkLCBjb25maWcgbm90IG1hdGNoaW5nIHRoZSBmaWx0ZXIgaXMgaW5jbHVkZWQKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRhZGF0YUZpbHRlcl9ub01hdGNoRXhjbHVkZV9taXNtYXRjaFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIElDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBDb25maWd1cmF0aW9uKCJmb28iLCAiYmFyIik7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25EZXNjcmlwdG9yIGRlc2MgPSBjb25maWcuZ2V0Q29uZmlndXJhdGlvbkRlc2NyaXB0aW9uKCk7Ci0gICAgICAgIE11bHRpTWFwPFN0cmluZywgU3RyaW5nPiBtZXRhZGF0YSA9IG5ldyBNdWx0aU1hcDw+KCk7Ci0gICAgICAgIG1ldGFkYXRhLnB1dCgiY29tcG9uZW50IiwgImZvbyIpOwotICAgICAgICBkZXNjLnNldE1ldGFEYXRhKG1ldGFkYXRhKTsKLSAgICAgICAgTXVsdGlNYXA8U3RyaW5nLCBTdHJpbmc+IGV4Y2x1ZGVGaWx0ZXIgPSBuZXcgTXVsdGlNYXA8PigpOwotICAgICAgICBleGNsdWRlRmlsdGVyLnB1dCgiZ3JvdXAiLCAiYmFyIik7Ci0gICAgICAgIGFzc2VydFRydWUoImNvbmZpZyBub3QgaW5jbHVkZWQgd2l0aCBtaXNtYXRjaGluZyBleGNsdXNpb24gZmlsdGVyIiwKLSAgICAgICAgICAgICAgICBtUmVwby5maWx0ZXJCeUNvbmZpZ01ldGFkYXRhKGNvbmZpZywgTUVUQURBVEFfSU5DTFVERVMsIGV4Y2x1ZGVGaWx0ZXIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXaGVuIGluY2x1c2lvbiBmaWx0ZXIgaXMgc3BlY2lmaWVkLCBjb25maWcgd2l0aCBvbmUgb2YgdGhlIG1ldGFkYXRhIGZpZWxkIG1hdGNoaW5nIHRoZSBmaWx0ZXIKLSAgICAgKiBpcyBpbmNsdWRlZAotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE1ldGFkYXRhRmlsdGVyX21hdGNoSW5jbHVkZV9tdWx0aXBsZU1ldGFkYXRhRmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSUNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IENvbmZpZ3VyYXRpb24oImZvbyIsICJiYXIiKTsKLSAgICAgICAgQ29uZmlndXJhdGlvbkRlc2NyaXB0b3IgZGVzYyA9IGNvbmZpZy5nZXRDb25maWd1cmF0aW9uRGVzY3JpcHRpb24oKTsKLSAgICAgICAgTXVsdGlNYXA8U3RyaW5nLCBTdHJpbmc+IG1ldGFkYXRhID0gbmV3IE11bHRpTWFwPD4oKTsKLSAgICAgICAgbWV0YWRhdGEucHV0KCJjb21wb25lbnQiLCAiZm9vIik7Ci0gICAgICAgIG1ldGFkYXRhLnB1dCgiY29tcG9uZW50IiwgImJhciIpOwotICAgICAgICBkZXNjLnNldE1ldGFEYXRhKG1ldGFkYXRhKTsKLSAgICAgICAgTXVsdGlNYXA8U3RyaW5nLCBTdHJpbmc+IGluY2x1ZGVGaWx0ZXIgPSBuZXcgTXVsdGlNYXA8PigpOwotICAgICAgICBpbmNsdWRlRmlsdGVyLnB1dCgiY29tcG9uZW50IiwgImZvbyIpOwotICAgICAgICBhc3NlcnRUcnVlKCJjb25maWcgbm90IGluY2x1ZGVkIHdpdGggbWF0Y2hpbmcgaW5jbHVzaW9uIGZpbHRlciIsCi0gICAgICAgICAgICAgICAgbVJlcG8uZmlsdGVyQnlDb25maWdNZXRhZGF0YShjb25maWcsIGluY2x1ZGVGaWx0ZXIsIE1FVEFEQVRBX0VYQ0xVREVTKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2hlbiBleGNsdXNpb24gZmlsdGVyIGlzIHNwZWNpZmllZCwgY29uZmlnIHdpdGggb25lIG9mIHRoZSBtZXRhZGF0YSBmaWVsZCBtYXRjaGluZyB0aGUgZmlsdGVyCi0gICAgICogaXMgZXhjbHVkZWQKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRhZGF0YUZpbHRlcl9tYXRjaEV4Y2x1ZGVfbXVsdGlwbGVNZXRhZGF0YUZpZWxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIElDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBDb25maWd1cmF0aW9uKCJmb28iLCAiYmFyIik7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25EZXNjcmlwdG9yIGRlc2MgPSBjb25maWcuZ2V0Q29uZmlndXJhdGlvbkRlc2NyaXB0aW9uKCk7Ci0gICAgICAgIE11bHRpTWFwPFN0cmluZywgU3RyaW5nPiBtZXRhZGF0YSA9IG5ldyBNdWx0aU1hcDw+KCk7Ci0gICAgICAgIG1ldGFkYXRhLnB1dCgiY29tcG9uZW50IiwgImZvbyIpOwotICAgICAgICBtZXRhZGF0YS5wdXQoImNvbXBvbmVudCIsICJiYXIiKTsKLSAgICAgICAgZGVzYy5zZXRNZXRhRGF0YShtZXRhZGF0YSk7Ci0gICAgICAgIE11bHRpTWFwPFN0cmluZywgU3RyaW5nPiBleGNsdWRlRmlsdGVyID0gbmV3IE11bHRpTWFwPD4oKTsKLSAgICAgICAgZXhjbHVkZUZpbHRlci5wdXQoImNvbXBvbmVudCIsICJmb28iKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoImNvbmZpZyBub3QgZXhjbHVkZWQgd2l0aCBtYXRjaGluZyBleGNsdXNpb24gZmlsdGVyIiwKLSAgICAgICAgICAgICAgICBtUmVwby5maWx0ZXJCeUNvbmZpZ01ldGFkYXRhKGNvbmZpZywgTUVUQURBVEFfSU5DTFVERVMsIGV4Y2x1ZGVGaWx0ZXIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXaGVuIGluY2x1c2lvbiBmaWx0ZXJzIGFyZSBzcGVjaWZpZWQsIGNvbmZpZyB3aXRoIG1ldGFkYXRhIGZpZWxkIG1hdGNoaW5nIG9uZSBvZiB0aGUgZmlsdGVyCi0gICAgICogaXMgaW5jbHVkZWQKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRhZGF0YUZpbHRlcl9tYXRjaEluY2x1ZGVfbXVsdGlwbGVGaWx0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIElDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBDb25maWd1cmF0aW9uKCJmb28iLCAiYmFyIik7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25EZXNjcmlwdG9yIGRlc2MgPSBjb25maWcuZ2V0Q29uZmlndXJhdGlvbkRlc2NyaXB0aW9uKCk7Ci0gICAgICAgIE11bHRpTWFwPFN0cmluZywgU3RyaW5nPiBtZXRhZGF0YSA9IG5ldyBNdWx0aU1hcDw+KCk7Ci0gICAgICAgIG1ldGFkYXRhLnB1dCgiY29tcG9uZW50IiwgImZvbyIpOwotICAgICAgICBkZXNjLnNldE1ldGFEYXRhKG1ldGFkYXRhKTsKLSAgICAgICAgTXVsdGlNYXA8U3RyaW5nLCBTdHJpbmc+IGluY2x1ZGVGaWx0ZXIgPSBuZXcgTXVsdGlNYXA8PigpOwotICAgICAgICBpbmNsdWRlRmlsdGVyLnB1dCgiY29tcG9uZW50IiwgImZvbyIpOwotICAgICAgICBpbmNsdWRlRmlsdGVyLnB1dCgiY29tcG9uZW50IiwgImJhciIpOwotICAgICAgICBhc3NlcnRUcnVlKCJjb25maWcgbm90IGluY2x1ZGVkIHdpdGggbWF0Y2hpbmcgaW5jbHVzaW9uIGZpbHRlciIsCi0gICAgICAgICAgICAgICAgbVJlcG8uZmlsdGVyQnlDb25maWdNZXRhZGF0YShjb25maWcsIGluY2x1ZGVGaWx0ZXIsIE1FVEFEQVRBX0VYQ0xVREVTKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2hlbiBleGNsdXNpb24gZmlsdGVycyBhcmUgc3BlY2lmaWVkLCBjb25maWcgd2l0aCBtZXRhZGF0YSBmaWVsZCBtYXRjaGluZyBvbmUgb2YgdGhlIGZpbHRlcgotICAgICAqIGlzIGV4Y2x1ZGVkCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0YWRhdGFGaWx0ZXJfbWF0Y2hFeGNsdWRlX211bHRpcGxlRmlsdGVycygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBJQ29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgQ29uZmlndXJhdGlvbigiZm9vIiwgImJhciIpOwotICAgICAgICBDb25maWd1cmF0aW9uRGVzY3JpcHRvciBkZXNjID0gY29uZmlnLmdldENvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbigpOwotICAgICAgICBNdWx0aU1hcDxTdHJpbmcsIFN0cmluZz4gbWV0YWRhdGEgPSBuZXcgTXVsdGlNYXA8PigpOwotICAgICAgICBtZXRhZGF0YS5wdXQoImNvbXBvbmVudCIsICJmb28iKTsKLSAgICAgICAgZGVzYy5zZXRNZXRhRGF0YShtZXRhZGF0YSk7Ci0gICAgICAgIE11bHRpTWFwPFN0cmluZywgU3RyaW5nPiBleGNsdWRlRmlsdGVyID0gbmV3IE11bHRpTWFwPD4oKTsKLSAgICAgICAgZXhjbHVkZUZpbHRlci5wdXQoImNvbXBvbmVudCIsICJmb28iKTsKLSAgICAgICAgZXhjbHVkZUZpbHRlci5wdXQoImNvbXBvbmVudCIsICJiYXIiKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoImNvbmZpZyBub3QgZXhjbHVkZWQgd2l0aCBtYXRjaGluZyBleGNsdXNpb24gZmlsdGVyIiwKLSAgICAgICAgICAgICAgICBtUmVwby5maWx0ZXJCeUNvbmZpZ01ldGFkYXRhKGNvbmZpZywgTUVUQURBVEFfSU5DTFVERVMsIGV4Y2x1ZGVGaWx0ZXIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXaGVuIGluY2x1c2lvbiBmaWx0ZXJzIGFyZSBzcGVjaWZpZWQsIGNvbmZpZyB3aXRoIG1ldGFkYXRhIGZpZWxkIG1hdGNoaW5nIG9uZSBvZiB0aGUgZmlsdGVyCi0gICAgICogaXMgaW5jbHVkZWQKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRhZGF0YUZpbHRlcl9tYXRjaEluY2x1ZGVfbXVsdGlwbGVNZXRhZGF0YUFuZEZpbHRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSUNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IENvbmZpZ3VyYXRpb24oImZvbyIsICJiYXIiKTsKLSAgICAgICAgQ29uZmlndXJhdGlvbkRlc2NyaXB0b3IgZGVzYyA9IGNvbmZpZy5nZXRDb25maWd1cmF0aW9uRGVzY3JpcHRpb24oKTsKLSAgICAgICAgTXVsdGlNYXA8U3RyaW5nLCBTdHJpbmc+IG1ldGFkYXRhID0gbmV3IE11bHRpTWFwPD4oKTsKLSAgICAgICAgbWV0YWRhdGEucHV0KCJjb21wb25lbnQiLCAiZm9vMSIpOwotICAgICAgICBtZXRhZGF0YS5wdXQoImdyb3VwIiwgImJhcjEiKTsKLSAgICAgICAgZGVzYy5zZXRNZXRhRGF0YShtZXRhZGF0YSk7Ci0gICAgICAgIE11bHRpTWFwPFN0cmluZywgU3RyaW5nPiBpbmNsdWRlRmlsdGVyID0gbmV3IE11bHRpTWFwPD4oKTsKLSAgICAgICAgaW5jbHVkZUZpbHRlci5wdXQoImNvbXBvbmVudCIsICJmb28xIik7Ci0gICAgICAgIGluY2x1ZGVGaWx0ZXIucHV0KCJncm91cCIsICJiYXIyIik7Ci0gICAgICAgIGFzc2VydFRydWUoImNvbmZpZyBub3QgaW5jbHVkZWQgd2l0aCBtYXRjaGluZyBpbmNsdXNpb24gZmlsdGVyIiwKLSAgICAgICAgICAgICAgICBtUmVwby5maWx0ZXJCeUNvbmZpZ01ldGFkYXRhKGNvbmZpZywgaW5jbHVkZUZpbHRlciwgTUVUQURBVEFfRVhDTFVERVMpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXaGVuIGV4Y2x1c2lvbiBmaWx0ZXJzIGFyZSBzcGVjaWZpZWQsIGNvbmZpZyB3aXRoIG1ldGFkYXRhIGZpZWxkIG1hdGNoaW5nIG9uZSBvZiB0aGUgZmlsdGVyCi0gICAgICogaXMgZXhjbHVkZWQKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRhZGF0YUZpbHRlcl9tYXRjaEV4Y2x1ZGVfbXVsdGlwbGVNZXRhZGF0YUFuZEZpbHRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSUNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IENvbmZpZ3VyYXRpb24oImZvbyIsICJiYXIiKTsKLSAgICAgICAgQ29uZmlndXJhdGlvbkRlc2NyaXB0b3IgZGVzYyA9IGNvbmZpZy5nZXRDb25maWd1cmF0aW9uRGVzY3JpcHRpb24oKTsKLSAgICAgICAgTXVsdGlNYXA8U3RyaW5nLCBTdHJpbmc+IG1ldGFkYXRhID0gbmV3IE11bHRpTWFwPD4oKTsKLSAgICAgICAgbWV0YWRhdGEucHV0KCJjb21wb25lbnQiLCAiZm9vMSIpOwotICAgICAgICBtZXRhZGF0YS5wdXQoImdyb3VwIiwgImJhcjEiKTsKLSAgICAgICAgZGVzYy5zZXRNZXRhRGF0YShtZXRhZGF0YSk7Ci0gICAgICAgIE11bHRpTWFwPFN0cmluZywgU3RyaW5nPiBleGNsdWRlRmlsdGVyID0gbmV3IE11bHRpTWFwPD4oKTsKLSAgICAgICAgZXhjbHVkZUZpbHRlci5wdXQoImNvbXBvbmVudCIsICJmb28xIik7Ci0gICAgICAgIGV4Y2x1ZGVGaWx0ZXIucHV0KCJncm91cCIsICJiYXIyIik7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJjb25maWcgbm90IGV4Y2x1ZGVkIHdpdGggbWF0Y2hpbmcgZXhjbHVzaW9uIGZpbHRlciIsCi0gICAgICAgICAgICAgICAgbVJlcG8uZmlsdGVyQnlDb25maWdNZXRhZGF0YShjb25maWcsIE1FVEFEQVRBX0lOQ0xVREVTLCBleGNsdWRlRmlsdGVyKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2hlbiBpbmNsdXNpb24gYW5kIGV4Y2x1c2lvbiBmaWx0ZXJzIGFyZSBib3RoIHNwZWNpZmllZCwgY29uZmlnIGNhbiBwYXNzIHRocm91Z2ggdGhlIGZpbHRlcnMKLSAgICAgKiBhcyBleHBlY3RlZC4KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRhZGF0YUZpbHRlcl9pbmNsdWRlQW5kRXhjbHVkZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBJQ29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgQ29uZmlndXJhdGlvbigiZm9vIiwgImJhciIpOwotICAgICAgICBDb25maWd1cmF0aW9uRGVzY3JpcHRvciBkZXNjID0gY29uZmlnLmdldENvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbigpOwotICAgICAgICBNdWx0aU1hcDxTdHJpbmcsIFN0cmluZz4gbWV0YWRhdGEgPSBuZXcgTXVsdGlNYXA8PigpOwotICAgICAgICBtZXRhZGF0YS5wdXQoImNvbXBvbmVudCIsICJmb28iKTsKLSAgICAgICAgbWV0YWRhdGEucHV0KCJncm91cCIsICJiYXIxIik7Ci0gICAgICAgIGRlc2Muc2V0TWV0YURhdGEobWV0YWRhdGEpOwotICAgICAgICBNdWx0aU1hcDxTdHJpbmcsIFN0cmluZz4gaW5jbHVkZUZpbHRlciA9IG5ldyBNdWx0aU1hcDw+KCk7Ci0gICAgICAgIGluY2x1ZGVGaWx0ZXIucHV0KCJjb21wb25lbnQiLCAiZm9vIik7Ci0gICAgICAgIE11bHRpTWFwPFN0cmluZywgU3RyaW5nPiBleGNsdWRlRmlsdGVyID0gbmV3IE11bHRpTWFwPD4oKTsKLSAgICAgICAgZXhjbHVkZUZpbHRlci5wdXQoImdyb3VwIiwgImJhcjIiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiY29uZmlnIG5vdCBpbmNsdWRlZCB3aXRoIG1hdGNoaW5nIGluY2x1c2lvbiBhbmQgbWlzbWF0Y2hpbmcgZXhjbHVzaW9uIGZpbHRlcnMiLAotICAgICAgICAgICAgICAgIG1SZXBvLmZpbHRlckJ5Q29uZmlnTWV0YWRhdGEoY29uZmlnLCBpbmNsdWRlRmlsdGVyLCBleGNsdWRlRmlsdGVyKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2hlbiBpbmNsdXNpb24gYW5kIGV4Y2x1c2lvbiBmaWx0ZXJzIGFyZSBib3RoIHNwZWNpZmllZCwgY29uZmlnIGJlIGV4Y2x1ZGVkIGFzIHNwZWNpZmllZAotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE1ldGFkYXRhRmlsdGVyX2luY2x1ZGVUaGVuRXhjbHVkZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBJQ29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgQ29uZmlndXJhdGlvbigiZm9vIiwgImJhciIpOwotICAgICAgICBDb25maWd1cmF0aW9uRGVzY3JpcHRvciBkZXNjID0gY29uZmlnLmdldENvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbigpOwotICAgICAgICBNdWx0aU1hcDxTdHJpbmcsIFN0cmluZz4gbWV0YWRhdGEgPSBuZXcgTXVsdGlNYXA8PigpOwotICAgICAgICBtZXRhZGF0YS5wdXQoImNvbXBvbmVudCIsICJmb28iKTsKLSAgICAgICAgbWV0YWRhdGEucHV0KCJncm91cCIsICJiYXIiKTsKLSAgICAgICAgZGVzYy5zZXRNZXRhRGF0YShtZXRhZGF0YSk7Ci0gICAgICAgIE11bHRpTWFwPFN0cmluZywgU3RyaW5nPiBpbmNsdWRlRmlsdGVyID0gbmV3IE11bHRpTWFwPD4oKTsKLSAgICAgICAgaW5jbHVkZUZpbHRlci5wdXQoImNvbXBvbmVudCIsICJmb28iKTsKLSAgICAgICAgTXVsdGlNYXA8U3RyaW5nLCBTdHJpbmc+IGV4Y2x1ZGVGaWx0ZXIgPSBuZXcgTXVsdGlNYXA8PigpOwotICAgICAgICBleGNsdWRlRmlsdGVyLnB1dCgiZ3JvdXAiLCAiYmFyIik7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJjb25maWcgbm90IGV4Y2x1ZGVkIHdpdGggbWF0Y2hpbmcgaW5jbHVzaW9uIGFuZCBleGNsdXNpb24gZmlsdGVycyIsCi0gICAgICAgICAgICAgICAgbVJlcG8uZmlsdGVyQnlDb25maWdNZXRhZGF0YShjb25maWcsIGluY2x1ZGVGaWx0ZXIsIGV4Y2x1ZGVGaWx0ZXIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RJbmplY3QgaW1wbGVtZW50cyBJUmVtb3RlVGVzdCB7Ci0gICAgICAgIEBPcHRpb24obmFtZSA9ICJzaW1wbGUtc3RyaW5nIikKLSAgICAgICAgcHVibGljIFN0cmluZyB0ZXN0ID0gbnVsbDsKLSAgICAgICAgQE9wdGlvbihuYW1lID0gImxpc3Qtc3RyaW5nIikKLSAgICAgICAgcHVibGljIExpc3Q8U3RyaW5nPiB0ZXN0TGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBAT3B0aW9uKG5hbWUgPSAibWFwLXN0cmluZyIpCi0gICAgICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IHRlc3RNYXAgPSBuZXcgSGFzaE1hcDw+KCk7Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bihJVGVzdEludm9jYXRpb25MaXN0ZW5lciBsaXN0ZW5lcikgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHRoYXQgdGhlIGRpZmZlcmVudCBmb3JtYXQgZm9yIG1vZHVsZS1hcmcgYW5kIHRlc3QtYXJnIGNhbiBwcm9wZXJseSBiZSBwYXNzZWQgdG8gdGhlCi0gICAgICogY29uZmlndXJhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5qZWN0Q29uZmlnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIElDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBDb25maWd1cmF0aW9uKCJmb28iLCAiYmFyIik7Ci0gICAgICAgIFRlc3RJbmplY3QgY2hlY2tlciA9IG5ldyBUZXN0SW5qZWN0KCk7Ci0gICAgICAgIGNvbmZpZy5zZXRUZXN0KGNoZWNrZXIpOwotICAgICAgICBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IG9wdGlvbk1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PigpOwotICAgICAgICBMaXN0PFN0cmluZz4gb3B0aW9uMSA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBvcHRpb24xLmFkZCgidmFsdWUxIik7Ci0gICAgICAgIG9wdGlvbk1hcC5wdXQoInNpbXBsZS1zdHJpbmciLCBvcHRpb24xKTsKLQotICAgICAgICBMaXN0PFN0cmluZz4gb3B0aW9uMiA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBvcHRpb24yLmFkZCgidmFsdWUyIik7Ci0gICAgICAgIG9wdGlvbjIuYWRkKCJ2YWx1ZTMiKTsKLSAgICAgICAgb3B0aW9uMi5hZGQoInNldC1vcHRpb246bW9yZW9wdGlvbiIpOwotICAgICAgICBvcHRpb25NYXAucHV0KCJsaXN0LXN0cmluZyIsIG9wdGlvbjIpOwotCi0gICAgICAgIExpc3Q8U3RyaW5nPiBvcHRpb24zID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIG9wdGlvbjMuYWRkKCJzZXQtb3B0aW9uOj1tb3Jlb3B0aW9uIik7Ci0gICAgICAgIG9wdGlvbk1hcC5wdXQoIm1hcC1zdHJpbmciLCBvcHRpb24zKTsKLQotICAgICAgICBtUmVwby5pbmplY3RPcHRpb25zVG9Db25maWcob3B0aW9uTWFwLCBjb25maWcpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygidmFsdWUxIiwgY2hlY2tlci50ZXN0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9wdGlvbjIsIGNoZWNrZXIudGVzdExpc3QpOwotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHJlc01hcCA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgcmVzTWFwLnB1dCgic2V0LW9wdGlvbiIsICJtb3Jlb3B0aW9uIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXNNYXAsIGNoZWNrZXIudGVzdE1hcCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdGVzdHR5cGUvU2hhcmRhYmxlVGVzdFN0dWIuamF2YSBiL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3Rlc3R0eXBlL1NoYXJkYWJsZVRlc3RTdHViLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNDM5NzIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdGVzdHR5cGUvU2hhcmRhYmxlVGVzdFN0dWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGVzdHR5cGU7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5idWlsZC5JQnVpbGRJbmZvOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmNvbmZpZy5PcHRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLkRldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5yZXN1bHQuSVRlc3RJbnZvY2F0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSUFiaTsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JQWJpUmVjZWl2ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSUJ1aWxkUmVjZWl2ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSVJlbW90ZVRlc3Q7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSVJ1bnRpbWVIaW50UHJvdmlkZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSVNoYXJkYWJsZVRlc3Q7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSVN0cmljdFNoYXJkYWJsZVRlc3Q7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSVRlc3RDb2xsZWN0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSVRlc3RGaWx0ZXJSZWNlaXZlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotcHVibGljIGNsYXNzIFNoYXJkYWJsZVRlc3RTdHViIGltcGxlbWVudHMgSVJlbW90ZVRlc3QsIElTaGFyZGFibGVUZXN0LCBJQnVpbGRSZWNlaXZlciwKLSAgICAgICAgSUFiaVJlY2VpdmVyLCBJUnVudGltZUhpbnRQcm92aWRlciwgSVRlc3RDb2xsZWN0b3IsIElUZXN0RmlsdGVyUmVjZWl2ZXIsCi0gICAgICAgIElTdHJpY3RTaGFyZGFibGVUZXN0IHsKLQotICAgIEBPcHRpb24obmFtZSA9ICJtb2R1bGUiKQotICAgIFN0cmluZyBtTW9kdWxlOwotICAgIEBPcHRpb24obmFtZSA9ICJmb28iKQotICAgIFN0cmluZyBtRm9vOwotICAgIEBPcHRpb24obmFtZSA9ICJibGFoIikKLSAgICBTdHJpbmcgbUJsYWg7Ci0KLSAgICBwdWJsaWMgSUJ1aWxkSW5mbyBtQnVpbGRJbmZvID0gbnVsbDsKLQotICAgIENvbGxlY3Rpb248SVJlbW90ZVRlc3Q+IG1TaGFyZHM7Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0QnVpbGQoSUJ1aWxkSW5mbyBidWlsZEluZm8pIHsKLSAgICAgICAgbUJ1aWxkSW5mbyA9IGJ1aWxkSW5mbzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcnVuKElUZXN0SW52b2NhdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gRG8gbm90aGluZwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ29sbGVjdGlvbjxJUmVtb3RlVGVzdD4gc3BsaXQoKSB7Ci0gICAgICAgIG1TaGFyZHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLSAgICAgICAgICAgIG1TaGFyZHMuYWRkKG5ldyBTaGFyZGFibGVUZXN0U3R1YigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbVNoYXJkczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElSZW1vdGVUZXN0IGdldFRlc3RTaGFyZChpbnQgc2hhcmRDb3VudCwgaW50IHNoYXJkSW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTaGFyZGFibGVUZXN0U3R1YigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEFiaShJQWJpIGFiaSkgewotICAgICAgICAvLyBEbyBub3RoaW5nCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElBYmkgZ2V0QWJpKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgbG9uZyBnZXRSdW50aW1lSGludCgpIHsKLSAgICAgICAgcmV0dXJuIDFMOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldENvbGxlY3RUZXN0c09ubHkoYm9vbGVhbiBzaG91bGRDb2xsZWN0VGVzdCkgewotICAgICAgICAvLyBEbyBub3RoaW5nCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkSW5jbHVkZUZpbHRlcihTdHJpbmcgZmlsdGVyKSB7Ci0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGRBbGxJbmNsdWRlRmlsdGVycyhTZXQ8U3RyaW5nPiBmaWx0ZXJzKSB7Ci0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGRFeGNsdWRlRmlsdGVyKFN0cmluZyBmaWx0ZXIpIHsKLQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkZEFsbEV4Y2x1ZGVGaWx0ZXJzKFNldDxTdHJpbmc+IGZpbHRlcnMpIHsKLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3Rlc3R0eXBlL1NpbXBsZVRlc3RTdHViLmphdmEgYi9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC90ZXN0dHlwZS9TaW1wbGVUZXN0U3R1Yi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzFmOTc4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3Rlc3R0eXBlL1NpbXBsZVRlc3RTdHViLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGVzdHR5cGU7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIudGVzdHJ1bm5lci5UZXN0SWRlbnRpZmllcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5jb25maWcuT3B0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5EZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQucmVzdWx0LklUZXN0SW52b2NhdGlvbkxpc3RlbmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLklBYmk7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSUFiaVJlY2VpdmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLklSZW1vdGVUZXN0OwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLklSdW50aW1lSGludFByb3ZpZGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLklUZXN0Q29sbGVjdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLklUZXN0RmlsdGVyUmVjZWl2ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBBIHRlc3QgU3R1YiB0aGF0IGNhbiBiZSB1c2VkIHRvIGZha2Ugc29tZSBydW5zLgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlVGVzdFN0dWIgaW1wbGVtZW50cyBJUmVtb3RlVGVzdCwgSUFiaVJlY2VpdmVyLCBJUnVudGltZUhpbnRQcm92aWRlciwKLSAgICAgICAgSVRlc3RDb2xsZWN0b3IsIElUZXN0RmlsdGVyUmVjZWl2ZXIgewotCi0gICAgLy8gb3B0aW9ucyBiZWxvdyBhcmUgdW51c2VkCi0gICAgQE9wdGlvbihuYW1lID0gInJlcG9ydC10ZXN0IikKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtUmVwb3J0VGVzdCA9IGZhbHNlOwotICAgIEBPcHRpb24obmFtZSA9ICJydW4tY29tcGxldGUiKQotICAgIHByb3RlY3RlZCBib29sZWFuIG1Jc0NvbXBsZXRlID0gdHJ1ZTsKLSAgICBAT3B0aW9uKG5hbWUgPSAidGVzdC1mYWlsIikKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtRG9lc09uZVRlc3RGYWlsID0gdHJ1ZTsKLSAgICBAT3B0aW9uKG5hbWUgPSAiaW50ZXJuYWwtcmV0cnkiKQotICAgIHByb3RlY3RlZCBib29sZWFuIG1SZXRyeSA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJ1bihJVGVzdEludm9jYXRpb25MaXN0ZW5lciBsaXN0ZW5lcikgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFdlIHJlcG9ydCAxIHBhc3NpbmcgdGVzCi0gICAgICAgIGxpc3RlbmVyLnRlc3RSdW5TdGFydGVkKCJtb2R1bGUtcnVuIiwgMSk7Ci0gICAgICAgIFRlc3RJZGVudGlmaWVyIHRpZCA9IG5ldyBUZXN0SWRlbnRpZmllcigiVGVzdFN0dWIiLCAidGVzdDEiKTsKLSAgICAgICAgbGlzdGVuZXIudGVzdFN0YXJ0ZWQodGlkKTsKLSAgICAgICAgbGlzdGVuZXIudGVzdEVuZGVkKHRpZCwgQ29sbGVjdGlvbnMuZW1wdHlNYXAoKSk7Ci0gICAgICAgIGxpc3RlbmVyLnRlc3RSdW5FbmRlZCgwLCBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRBYmkoSUFiaSBhYmkpIHsKLSAgICAgICAgLy8gRG8gbm90aGluZwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBsb25nIGdldFJ1bnRpbWVIaW50KCkgewotICAgICAgICByZXR1cm4gMUw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0Q29sbGVjdFRlc3RzT25seShib29sZWFuIHNob3VsZENvbGxlY3RUZXN0KSB7Ci0gICAgICAgIC8vIERvIG5vdGhpbmcKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGRJbmNsdWRlRmlsdGVyKFN0cmluZyBmaWx0ZXIpIHsKLQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkZEFsbEluY2x1ZGVGaWx0ZXJzKFNldDxTdHJpbmc+IGZpbHRlcnMpIHsKLQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkZEV4Y2x1ZGVGaWx0ZXIoU3RyaW5nIGZpbHRlcikgewotCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkQWxsRXhjbHVkZUZpbHRlcnMoU2V0PFN0cmluZz4gZmlsdGVycykgewotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdGVzdHR5cGUvU3ViUGxhblRlc3QuamF2YSBiL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3Rlc3R0eXBlL1N1YlBsYW5UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1YjVkZjYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdGVzdHR5cGUvU3ViUGxhblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZTsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuVGVzdEZpbHRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC51dGlsLkZpbGVVdGlsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIFRlc3RzIGZvciB7QGxpbmsgU3ViUGxhbn0KLSAqLwotcHVibGljIGNsYXNzIFN1YlBsYW5UZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFCSSA9ICJhcm1lYWJpLXY3YSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRV9BID0gIk1vZHVsZUEiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfQiA9ICJNb2R1bGVCIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF8xID0gImFuZHJvaWQudGVzdC5Gb28jdGVzdDEiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUXzIgPSAiYW5kcm9pZC50ZXN0LkZvbyN0ZXN0MiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfMyA9ICJhbmRyb2lkLnRlc3QuRm9vI3Rlc3QzIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfQkFTRSA9Ci0gICAgICAgICAgICAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4iICsKLSAgICAgICAgICAgICI8U3ViUGxhbiB2ZXJzaW9uPVwiMi4wXCI+XG4iICsKLSAgICAgICAgICAgICIlc1xuIiArCi0gICAgICAgICAgICAiPC9TdWJQbGFuPiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9FTlRSWSA9ICIgIDxFbnRyeSAlcy8+XG4iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfQVRUUiA9ICIlcz1cIiVzXCIiOwotCi0gICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSVN1YlBsYW4gc3ViUGxhbiA9IG5ldyBTdWJQbGFuKCk7Ci0gICAgICAgIHN1YlBsYW4uYWRkSW5jbHVkZUZpbHRlcihuZXcgVGVzdEZpbHRlcihBQkksIE1PRFVMRV9BLCBURVNUXzEpLnRvU3RyaW5nKCkpOwotICAgICAgICBTZXQ8U3RyaW5nPiBpbmNsdWRlRmlsdGVyU2V0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICBpbmNsdWRlRmlsdGVyU2V0LmFkZChuZXcgVGVzdEZpbHRlcihBQkksIE1PRFVMRV9BLCBURVNUXzIpLnRvU3RyaW5nKCkpOwotICAgICAgICBpbmNsdWRlRmlsdGVyU2V0LmFkZChuZXcgVGVzdEZpbHRlcihBQkksIE1PRFVMRV9BLCBURVNUXzMpLnRvU3RyaW5nKCkpOwotICAgICAgICBzdWJQbGFuLmFkZEFsbEluY2x1ZGVGaWx0ZXJzKGluY2x1ZGVGaWx0ZXJTZXQpOyAvLyBhZGQgbXVsdGlwbGUgaW5jbHVkZSBmaWx0ZXJzIHNpbXVsdGFuZW91c2x5Ci0gICAgICAgIHN1YlBsYW4uYWRkSW5jbHVkZUZpbHRlcihuZXcgVGVzdEZpbHRlcihudWxsLCBNT0RVTEVfQiwgbnVsbCkudG9TdHJpbmcoKSk7Ci0gICAgICAgIHN1YlBsYW4uYWRkRXhjbHVkZUZpbHRlcihuZXcgVGVzdEZpbHRlcihudWxsLCBNT0RVTEVfQiwgVEVTVF8xKS50b1N0cmluZygpKTsKLSAgICAgICAgU2V0PFN0cmluZz4gZXhjbHVkZUZpbHRlclNldCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgZXhjbHVkZUZpbHRlclNldC5hZGQobmV3IFRlc3RGaWx0ZXIobnVsbCwgTU9EVUxFX0IsIFRFU1RfMikudG9TdHJpbmcoKSk7Ci0gICAgICAgIGV4Y2x1ZGVGaWx0ZXJTZXQuYWRkKG5ldyBUZXN0RmlsdGVyKG51bGwsIE1PRFVMRV9CLCBURVNUXzMpLnRvU3RyaW5nKCkpOwotICAgICAgICBzdWJQbGFuLmFkZEFsbEV4Y2x1ZGVGaWx0ZXJzKGV4Y2x1ZGVGaWx0ZXJTZXQpOwotCi0gICAgICAgIC8vIFNlcmlhbGl6ZSB0byBmaWxlCi0gICAgICAgIEZpbGUgc3ViUGxhbkZpbGUgPSBGaWxlVXRpbC5jcmVhdGVUZW1wRmlsZSgidGVzdC1zdWJQbGFuLXNlcmlhbGl6YXRpb24iLCAiLnR4dCIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgT3V0cHV0U3RyZWFtIHN1YlBsYW5PdXRwdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShzdWJQbGFuRmlsZSk7Ci0gICAgICAgICAgICBzdWJQbGFuLnNlcmlhbGl6ZShzdWJQbGFuT3V0cHV0U3RyZWFtKTsKLSAgICAgICAgICAgIHN1YlBsYW5PdXRwdXRTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgIC8vIFBhcnNlIHN1YlBsYW4gYW5kIGFzc2VydCBjb3JyZWN0bmVzcwotICAgICAgICAgICAgY2hlY2tTdWJQbGFuKHN1YlBsYW5GaWxlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIEZpbGVVdGlsLmRlbGV0ZUZpbGUoc3ViUGxhbkZpbGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBhcnNpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZSBwbGFuRmlsZSA9IEZpbGVVdGlsLmNyZWF0ZVRlbXBGaWxlKCJ0ZXN0LXBsYW4tcGFyc2luZyIsICIudHh0Iik7Ci0gICAgICAgIEZpbGVXcml0ZXIgd3JpdGVyID0gbmV3IEZpbGVXcml0ZXIocGxhbkZpbGUpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2V0PFN0cmluZz4gZW50cmllcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgICAgIGVudHJpZXMuYWRkKGdlbmVyYXRlRW50cnlYbWwoQUJJLCBNT0RVTEVfQSwgVEVTVF8xLCB0cnVlKSk7IC8vIGluY2x1ZGUgZm9ybWF0IDEKLSAgICAgICAgICAgIGVudHJpZXMuYWRkKGdlbmVyYXRlRW50cnlYbWwoQUJJLCBNT0RVTEVfQSwgVEVTVF8yLCB0cnVlKSk7Ci0gICAgICAgICAgICBlbnRyaWVzLmFkZChnZW5lcmF0ZUVudHJ5WG1sKG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBUZXN0RmlsdGVyKEFCSSwgTU9EVUxFX0EsIFRFU1RfMykudG9TdHJpbmcoKSwgdHJ1ZSkpOyAvLyBpbmNsdWRlIGZvcm1hdCAyCi0gICAgICAgICAgICBlbnRyaWVzLmFkZChnZW5lcmF0ZUVudHJ5WG1sKG51bGwsIE1PRFVMRV9CLCBudWxsLCB0cnVlKSk7Ci0gICAgICAgICAgICBlbnRyaWVzLmFkZChnZW5lcmF0ZUVudHJ5WG1sKG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBUZXN0RmlsdGVyKG51bGwsIE1PRFVMRV9CLCBURVNUXzEpLnRvU3RyaW5nKCksIGZhbHNlKSk7Ci0gICAgICAgICAgICBlbnRyaWVzLmFkZChnZW5lcmF0ZUVudHJ5WG1sKG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBUZXN0RmlsdGVyKG51bGwsIE1PRFVMRV9CLCBURVNUXzIpLnRvU3RyaW5nKCksIGZhbHNlKSk7Ci0gICAgICAgICAgICBlbnRyaWVzLmFkZChnZW5lcmF0ZUVudHJ5WG1sKG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBUZXN0RmlsdGVyKG51bGwsIE1PRFVMRV9CLCBURVNUXzMpLnRvU3RyaW5nKCksIGZhbHNlKSk7Ci0gICAgICAgICAgICBTdHJpbmcgeG1sID0gU3RyaW5nLmZvcm1hdChYTUxfQkFTRSwgU3RyaW5nLmpvaW4oIlxuIiwgZW50cmllcykpOwotICAgICAgICAgICAgd3JpdGVyLndyaXRlKHhtbCk7Ci0gICAgICAgICAgICB3cml0ZXIuZmx1c2goKTsKLSAgICAgICAgICAgIGNoZWNrU3ViUGxhbihwbGFuRmlsZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKLSAgICAgICAgICAgIEZpbGVVdGlsLmRlbGV0ZUZpbGUocGxhbkZpbGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrU3ViUGxhbihGaWxlIHN1YlBsYW5GaWxlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSW5wdXRTdHJlYW0gc3ViUGxhbklucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShzdWJQbGFuRmlsZSk7Ci0gICAgICAgIElTdWJQbGFuIHN1YlBsYW4gPSBuZXcgU3ViUGxhbigpOwotICAgICAgICBzdWJQbGFuLnBhcnNlKHN1YlBsYW5JbnB1dFN0cmVhbSk7Ci0gICAgICAgIFNldDxTdHJpbmc+IHN1YlBsYW5JbmNsdWRlcyA9IHN1YlBsYW4uZ2V0SW5jbHVkZUZpbHRlcnMoKTsKLSAgICAgICAgU2V0PFN0cmluZz4gc3ViUGxhbkV4Y2x1ZGVzID0gc3ViUGxhbi5nZXRFeGNsdWRlRmlsdGVycygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIDQgaW5jbHVkZXMiLCA0LCBzdWJQbGFuSW5jbHVkZXMuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiTWlzc2luZyBleHBlY3RlZCB0ZXN0IGluY2x1ZGUiLCBzdWJQbGFuSW5jbHVkZXMuY29udGFpbnMoCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RGaWx0ZXIoQUJJLCBNT0RVTEVfQSwgVEVTVF8xKS50b1N0cmluZygpKSk7Ci0gICAgICAgIGFzc2VydFRydWUoIk1pc3NpbmcgZXhwZWN0ZWQgdGVzdCBpbmNsdWRlIiwgc3ViUGxhbkluY2x1ZGVzLmNvbnRhaW5zKAotICAgICAgICAgICAgICAgIG5ldyBUZXN0RmlsdGVyKEFCSSwgTU9EVUxFX0EsIFRFU1RfMikudG9TdHJpbmcoKSkpOwotICAgICAgICBhc3NlcnRUcnVlKCJNaXNzaW5nIGV4cGVjdGVkIHRlc3QgaW5jbHVkZSIsIHN1YlBsYW5JbmNsdWRlcy5jb250YWlucygKLSAgICAgICAgICAgICAgICBuZXcgVGVzdEZpbHRlcihBQkksIE1PRFVMRV9BLCBURVNUXzMpLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiTWlzc2luZyBleHBlY3RlZCBtb2R1bGUgaW5jbHVkZSIsIHN1YlBsYW5JbmNsdWRlcy5jb250YWlucygKLSAgICAgICAgICAgICAgICBuZXcgVGVzdEZpbHRlcihudWxsLCBNT0RVTEVfQiwgbnVsbCkudG9TdHJpbmcoKSkpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiRXhwZWN0ZWQgMyBleGNsdWRlcyIsIDMsIHN1YlBsYW5FeGNsdWRlcy5zaXplKCkpOwotICAgICAgICBhc3NlcnRUcnVlKCJNaXNzaW5nIGV4cGVjdGVkIGV4Y2x1ZGUiLCBzdWJQbGFuRXhjbHVkZXMuY29udGFpbnMoCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RGaWx0ZXIobnVsbCwgTU9EVUxFX0IsIFRFU1RfMSkudG9TdHJpbmcoKSkpOwotICAgICAgICBhc3NlcnRUcnVlKCJNaXNzaW5nIGV4cGVjdGVkIGV4Y2x1ZGUiLCBzdWJQbGFuRXhjbHVkZXMuY29udGFpbnMoCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RGaWx0ZXIobnVsbCwgTU9EVUxFX0IsIFRFU1RfMikudG9TdHJpbmcoKSkpOwotICAgICAgICBhc3NlcnRUcnVlKCJNaXNzaW5nIGV4cGVjdGVkIGV4Y2x1ZGUiLCBzdWJQbGFuRXhjbHVkZXMuY29udGFpbnMoCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RGaWx0ZXIobnVsbCwgTU9EVUxFX0IsIFRFU1RfMykudG9TdHJpbmcoKSkpOwotICAgIH0KLQotICAgIC8vIEhlbHBlciBmb3IgZ2VuZXJhdGluZyBFbnRyeSBYTUwgdGFncwotICAgIHByaXZhdGUgU3RyaW5nIGdlbmVyYXRlRW50cnlYbWwoU3RyaW5nIGFiaSwgU3RyaW5nIG5hbWUsIFN0cmluZyBmaWx0ZXIsIGJvb2xlYW4gaW5jbHVkZSkgewotICAgICAgICBTdHJpbmcgZmlsdGVyVHlwZSA9IChpbmNsdWRlKSA/ICJpbmNsdWRlIiA6ICJleGNsdWRlIjsKLSAgICAgICAgU2V0PFN0cmluZz4gYXR0cmlidXRlcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgaWYgKGZpbHRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVzLmFkZChTdHJpbmcuZm9ybWF0KFhNTF9BVFRSLCBmaWx0ZXJUeXBlLCBmaWx0ZXIpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVzLmFkZChTdHJpbmcuZm9ybWF0KFhNTF9BVFRSLCAibmFtZSIsIG5hbWUpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYWJpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGF0dHJpYnV0ZXMuYWRkKFN0cmluZy5mb3JtYXQoWE1MX0FUVFIsICJhYmkiLCBhYmkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdChYTUxfRU5UUlksIFN0cmluZy5qb2luKCIgIiwgYXR0cmlidXRlcykpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3Rlc3R0eXBlL1Rlc3RTdHViLmphdmEgYi9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC90ZXN0dHlwZS9UZXN0U3R1Yi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTU0ZjMxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3Rlc3R0eXBlL1Rlc3RTdHViLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRlc3R0eXBlOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLnRlc3RydW5uZXIuVGVzdElkZW50aWZpZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuY29uZmlnLk9wdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnJlc3VsdC5JVGVzdEludm9jYXRpb25MaXN0ZW5lcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JQWJpOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLklBYmlSZWNlaXZlcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JUmVtb3RlVGVzdDsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JUnVudGltZUhpbnRQcm92aWRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JVGVzdENvbGxlY3RvcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JVGVzdEZpbHRlclJlY2VpdmVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogQSB0ZXN0IFN0dWIgdGhhdCBjYW4gYmUgdXNlZCB0byBmYWtlIHNvbWUgcnVucy4KLSAqLwotcHVibGljIGNsYXNzIFRlc3RTdHViIGltcGxlbWVudHMgSVJlbW90ZVRlc3QsIElBYmlSZWNlaXZlciwgSVJ1bnRpbWVIaW50UHJvdmlkZXIsIElUZXN0Q29sbGVjdG9yLAotICAgICAgICBJVGVzdEZpbHRlclJlY2VpdmVyIHsKLQotICAgIEBPcHRpb24obmFtZSA9ICJtb2R1bGUiKQotICAgIHByaXZhdGUgU3RyaW5nIG1Nb2R1bGU7Ci0gICAgQE9wdGlvbihuYW1lID0gImZvbyIpCi0gICAgcHJvdGVjdGVkIFN0cmluZyBtRm9vOwotICAgIEBPcHRpb24obmFtZSA9ICJibGFoIikKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG1CbGFoOwotICAgIEBPcHRpb24obmFtZSA9ICJyZXBvcnQtdGVzdCIpCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gbVJlcG9ydFRlc3QgPSBmYWxzZTsKLSAgICBAT3B0aW9uKG5hbWUgPSAicnVuLWNvbXBsZXRlIikKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtSXNDb21wbGV0ZSA9IHRydWU7Ci0gICAgQE9wdGlvbihuYW1lID0gInRlc3QtZmFpbCIpCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gbURvZXNPbmVUZXN0RmFpbCA9IHRydWU7Ci0gICAgQE9wdGlvbihuYW1lID0gImludGVybmFsLXJldHJ5IikKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtUmV0cnkgPSBmYWxzZTsKLQotICAgIHByb3RlY3RlZCBMaXN0PFRlc3RJZGVudGlmaWVyPiBtU2hhcmRlZFRlc3RUb1J1bjsKLSAgICBwcm90ZWN0ZWQgSW50ZWdlciBtU2hhcmRJbmRleCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyBhdHRlbXB0LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB0ZXN0QXR0ZW1wdChJVGVzdEludm9jYXRpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAvLyBXZSByZXBvcnQgMyB0ZXN0czogMiBwYXNzLCAxIGZhaWxlZAotICAgICAgICBsaXN0ZW5lci50ZXN0UnVuU3RhcnRlZCgibW9kdWxlLXJ1biIsIDMpOwotICAgICAgICBUZXN0SWRlbnRpZmllciB0aWQgPSBuZXcgVGVzdElkZW50aWZpZXIoIlRlc3RTdHViIiwgInRlc3QxIik7Ci0gICAgICAgIGxpc3RlbmVyLnRlc3RTdGFydGVkKHRpZCk7Ci0gICAgICAgIGxpc3RlbmVyLnRlc3RFbmRlZCh0aWQsIENvbGxlY3Rpb25zLmVtcHR5TWFwKCkpOwotCi0gICAgICAgIGlmIChtSXNDb21wbGV0ZSkgewotICAgICAgICAgICAgLy8gcG9zc2libHkgc2tpcCB0aGlzIG9uZSB0byBjcmVhdGUgc29tZSBub3RfZXhlY3V0ZWQgY2FzZS4KLSAgICAgICAgICAgIFRlc3RJZGVudGlmaWVyIHRpZDIgPSBuZXcgVGVzdElkZW50aWZpZXIoIlRlc3RTdHViIiwgInRlc3QyIik7Ci0gICAgICAgICAgICBsaXN0ZW5lci50ZXN0U3RhcnRlZCh0aWQyKTsKLSAgICAgICAgICAgIGxpc3RlbmVyLnRlc3RFbmRlZCh0aWQyLCBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFRlc3RJZGVudGlmaWVyIHRpZDMgPSBuZXcgVGVzdElkZW50aWZpZXIoIlRlc3RTdHViIiwgInRlc3QzIik7Ci0gICAgICAgIGxpc3RlbmVyLnRlc3RTdGFydGVkKHRpZDMpOwotICAgICAgICBpZiAobURvZXNPbmVUZXN0RmFpbCkgewotICAgICAgICAgICAgbGlzdGVuZXIudGVzdEZhaWxlZCh0aWQzLCAib3VjaCB0aGlzIGlzIGJhZC4iKTsKLSAgICAgICAgfQotICAgICAgICBsaXN0ZW5lci50ZXN0RW5kZWQodGlkMywgQ29sbGVjdGlvbnMuZW1wdHlNYXAoKSk7Ci0KLSAgICAgICAgbGlzdGVuZXIudGVzdFJ1bkVuZGVkKDAsIENvbGxlY3Rpb25zLmVtcHR5TWFwKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBydW4oSVRlc3RJbnZvY2F0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBpZiAobVJlcG9ydFRlc3QpIHsKLSAgICAgICAgICAgIGlmIChtU2hhcmRlZFRlc3RUb1J1biA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFtUmV0cnkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGVzdEF0dGVtcHQobGlzdGVuZXIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFdlIGZha2UgYW4gaW50ZXJuYWwgcmV0cnkgYnkgY2FsbGluZyB0ZXN0UnVuU3RhcnQvRW5kZWQgYWdhaW4uCi0gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLnRlc3RSdW5TdGFydGVkKCJtb2R1bGUtcnVuIiwgMyk7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLnRlc3RSdW5FbmRlZCgwLCBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpKTsKLSAgICAgICAgICAgICAgICAgICAgdGVzdEF0dGVtcHQobGlzdGVuZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gUnVuIHRoZSBzaGFyZAotICAgICAgICAgICAgICAgIGlmIChtRG9lc09uZVRlc3RGYWlsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLnRlc3RSdW5TdGFydGVkKCJtb2R1bGUtcnVuIiwgbVNoYXJkZWRUZXN0VG9SdW4uc2l6ZSgpICsgMSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIudGVzdFJ1blN0YXJ0ZWQoIm1vZHVsZS1ydW4iLCBtU2hhcmRlZFRlc3RUb1J1bi5zaXplKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChtSXNDb21wbGV0ZSkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKFRlc3RJZGVudGlmaWVyIHRpZCA6IG1TaGFyZGVkVGVzdFRvUnVuKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci50ZXN0U3RhcnRlZCh0aWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIudGVzdEVuZGVkKHRpZCwgQ29sbGVjdGlvbnMuZW1wdHlNYXAoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBUZXN0SWRlbnRpZmllciB0aWQgPSBtU2hhcmRlZFRlc3RUb1J1bi5nZXQoMCk7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLnRlc3RTdGFydGVkKHRpZCk7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLnRlc3RFbmRlZCh0aWQsIENvbGxlY3Rpb25zLmVtcHR5TWFwKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChtRG9lc09uZVRlc3RGYWlsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRlc3RJZGVudGlmaWVyIHRpZCA9IG5ldyBUZXN0SWRlbnRpZmllcigiVGVzdFN0dWIiLCAiZmFpbGVkIiArIG1TaGFyZEluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIudGVzdFN0YXJ0ZWQodGlkKTsKLSAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIudGVzdEZhaWxlZCh0aWQsICJzaGFyZCBmYWlsZWQgdGhpcyBvbmUuIik7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLnRlc3RFbmRlZCh0aWQsIENvbGxlY3Rpb25zLmVtcHR5TWFwKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsaXN0ZW5lci50ZXN0UnVuRW5kZWQoMCwgQ29sbGVjdGlvbnMuZW1wdHlNYXAoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRBYmkoSUFiaSBhYmkpIHsKLSAgICAgICAgLy8gRG8gbm90aGluZwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJQWJpIGdldEFiaSgpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGxvbmcgZ2V0UnVudGltZUhpbnQoKSB7Ci0gICAgICAgIHJldHVybiAxTDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRDb2xsZWN0VGVzdHNPbmx5KGJvb2xlYW4gc2hvdWxkQ29sbGVjdFRlc3QpIHsKLSAgICAgICAgLy8gRG8gbm90aGluZwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkZEluY2x1ZGVGaWx0ZXIoU3RyaW5nIGZpbHRlcikgewotCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkQWxsSW5jbHVkZUZpbHRlcnMoU2V0PFN0cmluZz4gZmlsdGVycykgewotCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkRXhjbHVkZUZpbHRlcihTdHJpbmcgZmlsdGVyKSB7Ci0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGRBbGxFeGNsdWRlRmlsdGVycyhTZXQ8U3RyaW5nPiBmaWx0ZXJzKSB7Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC90ZXN0dHlwZS9UZXN0U3R1YlNoYXJkYWJsZS5qYXZhIGIvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdGVzdHR5cGUvVGVzdFN0dWJTaGFyZGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc4OWI4Mi4uMDAwMDAwMAotLS0gYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC90ZXN0dHlwZS9UZXN0U3R1YlNoYXJkYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRlc3R0eXBlOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLnRlc3RydW5uZXIuVGVzdElkZW50aWZpZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuY29uZmlnLk9wdGlvbkNvcGllcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JUmVtb3RlVGVzdDsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JU3RyaWN0U2hhcmRhYmxlVGVzdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLS8qKgotICogQSB0ZXN0IFN0dWIgdGhhdCBjYW4gYmUgdXNlZCB0byBmYWtlIHNvbWUgcnVucy4KLSAqLwotcHVibGljIGNsYXNzIFRlc3RTdHViU2hhcmRhYmxlIGV4dGVuZHMgVGVzdFN0dWIgaW1wbGVtZW50cyBJU3RyaWN0U2hhcmRhYmxlVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVJlbW90ZVRlc3QgZ2V0VGVzdFNoYXJkKGludCBzaGFyZENvdW50LCBpbnQgc2hhcmRJbmRleCkgewotICAgICAgICBUZXN0U3R1YlNoYXJkYWJsZSB0ZXN0ID0gbmV3IFRlc3RTdHViU2hhcmRhYmxlKCk7Ci0gICAgICAgIE9wdGlvbkNvcGllci5jb3B5T3B0aW9uc05vVGhyb3codGhpcywgdGVzdCk7Ci0gICAgICAgIHRlc3QubVNoYXJkZWRUZXN0VG9SdW4gPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgVGVzdElkZW50aWZpZXIgdGlkID0gbmV3IFRlc3RJZGVudGlmaWVyKCJUZXN0U3R1YiIsICJ0ZXN0IiArIHNoYXJkSW5kZXgpOwotICAgICAgICB0ZXN0Lm1TaGFyZGVkVGVzdFRvUnVuLmFkZCh0aWQpOwotICAgICAgICBpZiAobUlzQ29tcGxldGUgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIFRlc3RJZGVudGlmaWVyIHRpZDIgPSBuZXcgVGVzdElkZW50aWZpZXIoIlRlc3RTdHViIiwgInRlc3QiICsgc2hhcmRJbmRleCArIDEwMCk7Ci0gICAgICAgICAgICB0ZXN0Lm1TaGFyZGVkVGVzdFRvUnVuLmFkZCh0aWQyKTsKLSAgICAgICAgICAgIHRlc3QubUlzQ29tcGxldGUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICB0ZXN0Lm1TaGFyZEluZGV4ID0gc2hhcmRJbmRleDsKLSAgICAgICAgcmV0dXJuIHRlc3Q7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdGVzdHR5cGUvcmV0cnkvUmV0cnlGYWN0b3J5VGVzdFRlc3QuamF2YSBiL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3Rlc3R0eXBlL3JldHJ5L1JldHJ5RmFjdG9yeVRlc3RUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NzYxOWEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdGVzdHR5cGUvcmV0cnkvUmV0cnlGYWN0b3J5VGVzdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGVzdHR5cGUucmV0cnk7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQuYnVpbGQuQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRlc3R0eXBlLkNvbXBhdGliaWxpdHlUZXN0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRlc3R0eXBlLnN1aXRlLkNvbXBhdGliaWxpdHlUZXN0U3VpdGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudXRpbC5SZXRyeUZpbHRlckhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5jb25maWcuSUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuY29uZmlnLk9wdGlvbkNsYXNzOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmNvbmZpZy5PcHRpb25TZXR0ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLkRldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuSVRlc3REZXZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQucmVzdWx0LklUZXN0SW52b2NhdGlvbkxpc3RlbmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLklSZW1vdGVUZXN0OwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLlN0dWJUZXN0OwotCi1pbXBvcnQgb3JnLmVhc3ltb2NrLkVhc3lNb2NrOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLkpVbml0NDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogVW5pdCB0ZXN0cyBmb3Ige0BsaW5rIFJldHJ5RmFjdG9yeVRlc3R9LgotICovCi1AUnVuV2l0aChKVW5pdDQuY2xhc3MpCi1wdWJsaWMgY2xhc3MgUmV0cnlGYWN0b3J5VGVzdFRlc3QgewotCi0gICAgcHJpdmF0ZSBSZXRyeUZhY3RvcnlUZXN0IG1GYWN0b3J5OwotICAgIHByaXZhdGUgSVRlc3RJbnZvY2F0aW9uTGlzdGVuZXIgbU1vY2tMaXN0ZW5lcjsKLSAgICBwcml2YXRlIFJldHJ5RmlsdGVySGVscGVyIG1TcHlGaWx0ZXI7Ci0KLSAgICAvKioKLSAgICAgKiBBIHtAbGluayBDb21wYXRpYmlsaXR5VGVzdH0gdGhhdCBkb2VzIG5vdCBydW4gYW55dGhpbmcuCi0gICAgICovCi0gICAgQE9wdGlvbkNsYXNzKGFsaWFzID0gImNvbXBhdGliaWxpdHkiKQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVm9pZENvbXBhdGliaWxpdHlUZXN0IGV4dGVuZHMgQ29tcGF0aWJpbGl0eVRlc3RTdWl0ZSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgTGlua2VkSGFzaE1hcDxTdHJpbmcsIElDb25maWd1cmF0aW9uPiBsb2FkVGVzdHMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IExpbmtlZEhhc2hNYXA8PigpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBDb2xsZWN0aW9uPElSZW1vdGVUZXN0PiBzcGxpdChpbnQgc2hhcmRDb3VudEhpbnQpIHsKLSAgICAgICAgICAgIExpc3Q8SVJlbW90ZVRlc3Q+IHRlc3RzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNoYXJkQ291bnRIaW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICB0ZXN0cy5hZGQobmV3IFN0dWJUZXN0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRlc3RzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQEJlZm9yZQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgewotICAgICAgICBtU3B5RmlsdGVyID0gbmV3IFJldHJ5RmlsdGVySGVscGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZUJ1aWxkRmluZ2VycHJpbnQoSVRlc3REZXZpY2UgZGV2aWNlKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldENvbW1hbmRMaW5lT3B0aW9uc0ZvcihPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgICAgICAgLy8gZG8gbm90aGluZwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBwb3B1bGF0ZUZpbHRlcnNCeVN1YlBsYW4oKSB7Ci0gICAgICAgICAgICAgICAgLy8gZG8gbm90aGluZwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBtRmFjdG9yeSA9IG5ldyBSZXRyeUZhY3RvcnlUZXN0KCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBSZXRyeUZpbHRlckhlbHBlciBjcmVhdGVGaWx0ZXJIZWxwZXIoQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyIGJ1aWxkSGVscGVyKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1TcHlGaWx0ZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIENvbXBhdGliaWxpdHlUZXN0U3VpdGUgY3JlYXRlVGVzdCgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFZvaWRDb21wYXRpYmlsaXR5VGVzdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBtTW9ja0xpc3RlbmVyID0gRWFzeU1vY2suY3JlYXRlTW9jayhJVGVzdEludm9jYXRpb25MaXN0ZW5lci5jbGFzcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhhdCB0aGUgQ29tcGF0aWJpbGl0eVRlc3QgY3JlYXRlZCBjYW4gcmVjZWl2ZSBhbGwgdGhlIG9wdGlvbnMgd2l0aG91dCB0aHJvd2luZy4KLSAgICAgKi8KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXRyeV9yZWNlaXZlT3B0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9wdGlvblNldHRlciBzZXR0ZXIgPSBuZXcgT3B0aW9uU2V0dGVyKG1GYWN0b3J5KTsKLSAgICAgICAgc2V0dGVyLnNldE9wdGlvblZhbHVlKCJyZXRyeSIsICIxMDU5OSIpOwotICAgICAgICBFYXN5TW9jay5yZXBsYXkobU1vY2tMaXN0ZW5lcik7Ci0gICAgICAgIG1GYWN0b3J5LnJ1bihtTW9ja0xpc3RlbmVyKTsKLSAgICAgICAgRWFzeU1vY2sudmVyaWZ5KG1Nb2NrTGlzdGVuZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFzc2VydCB0aGF0IHRoZSB7QGxpbmsgUmV0cnlGYWN0b3J5VGVzdCNzcGxpdChpbnQpfSBjYWxscyB0aGUKLSAgICAgKiB7QGxpbmsgQ29tcGF0aWJpbGl0eVRlc3RTdWl0ZSNzcGxpdChpbnQpfSBhZnRlciBhcHBseWluZyBhbGwgdGhlIGZpbHRlcnMuCi0gICAgICovCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmV0cnlfc3BsaXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRWFzeU1vY2sucmVwbGF5KG1Nb2NrTGlzdGVuZXIpOwotICAgICAgICBDb2xsZWN0aW9uPElSZW1vdGVUZXN0PiByZXMgPSBtRmFjdG9yeS5zcGxpdCgyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHJlcy5zaXplKCkpOwotICAgICAgICBFYXN5TW9jay52ZXJpZnkobU1vY2tMaXN0ZW5lcik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdGVzdHR5cGUvc3VpdGUvQ29tcGF0aWJpbGl0eVRlc3RTdWl0ZVRlc3QuamF2YSBiL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3Rlc3R0eXBlL3N1aXRlL0NvbXBhdGliaWxpdHlUZXN0U3VpdGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NTY5ZWYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdGVzdHR5cGUvc3VpdGUvQ29tcGF0aWJpbGl0eVRlc3RTdWl0ZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGVzdHR5cGUuc3VpdGU7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGVzdHR5cGUuQ29tcGF0aWJpbGl0eVRlc3Q7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuY29uZmlnLk9wdGlvblNldHRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5JVGVzdERldmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JQWJpOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnV0aWwuQWJpVXRpbHM7Ci0KLWltcG9ydCBvcmcuZWFzeW1vY2suRWFzeU1vY2s7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogVW5pdCB0ZXN0cyBmb3Ige0BsaW5rIENvbXBhdGliaWxpdHlUZXN0U3VpdGV9LgotICovCi1wdWJsaWMgY2xhc3MgQ29tcGF0aWJpbGl0eVRlc3RTdWl0ZVRlc3QgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZBS0VfSE9TVF9BUkNIID0gImFybSI7Ci0gICAgcHJpdmF0ZSBDb21wYXRpYmlsaXR5VGVzdFN1aXRlIG1UZXN0OwotICAgIHByaXZhdGUgSVRlc3REZXZpY2UgbU1vY2tEZXZpY2U7Ci0KLSAgICBAQmVmb3JlCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbVRlc3QgPSBuZXcgQ29tcGF0aWJpbGl0eVRlc3RTdWl0ZSgpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHJvdGVjdGVkIFNldDxTdHJpbmc+IGdldEFiaXNGb3JCdWlsZFRhcmdldEFyY2goKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEFiaVV0aWxzLmdldEFiaXNGb3JBcmNoKEZBS0VfSE9TVF9BUkNIKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgbU1vY2tEZXZpY2UgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElUZXN0RGV2aWNlLmNsYXNzKTsKLSAgICAgICAgbVRlc3Quc2V0RGV2aWNlKG1Nb2NrRGV2aWNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHRoYXQge0BsaW5rIENvbXBhdGliaWxpdHlUZXN0U3VpdGUjZ2V0QWJpcyhJVGVzdERldmljZSl9IGlzIHJldHVybmluZyBhIHByb3BlcgotICAgICAqIGludGVyc2VjdGlvbiBvZiBDVFMgc3VwcG9ydGVkIGFyY2hpdGVjdHVyZXMgYW5kIERldmljZSBzdXBwb3J0ZWQgYXJjaGl0ZWN0dXJlcy4KLSAgICAgKi8KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBYmlzKCkgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIEVhc3lNb2NrLmV4cGVjdChtTW9ja0RldmljZS5nZXRQcm9wZXJ0eShFYXN5TW9jay5lcSgicm8ucHJvZHVjdC5jcHUuYWJpbGlzdCIpKSkKLSAgICAgICAgICAgICAgICAuYW5kUmV0dXJuKCJhcm02NC12OGEsYXJtZWFiaS12N2EsYXJtZWFiaSIpOwotICAgICAgICBTZXQ8U3RyaW5nPiBleHBlY3RlZEFiaXMgPSBuZXcgSGFzaFNldDw+KCk7Ci0gICAgICAgIGV4cGVjdGVkQWJpcy5hZGQoImFybTY0LXY4YSIpOwotICAgICAgICBleHBlY3RlZEFiaXMuYWRkKCJhcm1lYWJpLXY3YSIpOwotICAgICAgICBFYXN5TW9jay5yZXBsYXkobU1vY2tEZXZpY2UpOwotICAgICAgICBTZXQ8SUFiaT4gcmVzID0gbVRlc3QuZ2V0QWJpcyhtTW9ja0RldmljZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCByZXMuc2l6ZSgpKTsKLSAgICAgICAgZm9yIChJQWJpIGFiaSA6IHJlcykgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleHBlY3RlZEFiaXMuY29udGFpbnMoYWJpLmdldE5hbWUoKSkpOwotICAgICAgICB9Ci0gICAgICAgIEVhc3lNb2NrLnZlcmlmeShtTW9ja0RldmljZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCB0aGF0IHtAbGluayBDb21wYXRpYmlsaXR5VGVzdFN1aXRlI2dldEFiaXMoSVRlc3REZXZpY2UpfSBpcyB0aHJvd2luZyBhbiBleGNlcHRpb24gd2hlbgotICAgICAqIG5vbmUgb2YgdGhlIENUUyBidWlsZCBzdXBwb3J0ZWQgYWJpIG1hdGNoIHRoZSBkZXZpY2UgYWJpLgotICAgICAqLwotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEdldEFiaXNfbm90U3VwcG9ydGVkKCkgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIEVhc3lNb2NrLmV4cGVjdChtTW9ja0RldmljZS5nZXRQcm9wZXJ0eShFYXN5TW9jay5lcSgicm8ucHJvZHVjdC5jcHUuYWJpbGlzdCIpKSkKLSAgICAgICAgICAgICAgICAuYW5kUmV0dXJuKCJhcm1lYWJpIik7Ci0gICAgICAgIEVhc3lNb2NrLnJlcGxheShtTW9ja0RldmljZSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtVGVzdC5nZXRBYmlzKG1Nb2NrRGV2aWNlKTsKLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24iKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiTm9uZSBvZiB0aGUgYWJpIHN1cHBvcnRlZCBieSB0aGlzIENUUyBidWlsZCAoJ1thcm1lYWJpLXY3YSwgYXJtNjQtdjhhXScpIgotICAgICAgICAgICAgICAgICAgICArICIgYXJlIHN1cHBvcnRlZCBieSB0aGUgZGV2aWNlICgnW2FybWVhYmldJykuIiwgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgICAgIEVhc3lNb2NrLnZlcmlmeShtTW9ja0RldmljZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCB0aGF0IHtAbGluayBDb21wYXRpYmlsaXR5VGVzdFN1aXRlI2dldEFiaXMoSVRlc3REZXZpY2UpfSBpcyByZXR1cm5pbmcgb25seSB0aGUgZGV2aWNlCi0gICAgICogcHJpbWFyeSBhYmkuCi0gICAgICovCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QWJpc19wcmltYXJ5QWJpT25seSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBPcHRpb25TZXR0ZXIgc2V0dGVyID0gbmV3IE9wdGlvblNldHRlcihtVGVzdCk7Ci0gICAgICAgIHNldHRlci5zZXRPcHRpb25WYWx1ZShDb21wYXRpYmlsaXR5VGVzdC5QUklNQVJZX0FCSV9SVU4sICJ0cnVlIik7Ci0gICAgICAgIEVhc3lNb2NrLmV4cGVjdChtTW9ja0RldmljZS5nZXRQcm9wZXJ0eShFYXN5TW9jay5lcSgicm8ucHJvZHVjdC5jcHUuYWJpIikpKQotICAgICAgICAgICAgICAgIC5hbmRSZXR1cm4oImFybTY0LXY4YSIpOwotICAgICAgICBTZXQ8U3RyaW5nPiBleHBlY3RlZEFiaXMgPSBuZXcgSGFzaFNldDw+KCk7Ci0gICAgICAgIGV4cGVjdGVkQWJpcy5hZGQoImFybTY0LXY4YSIpOwotICAgICAgICBFYXN5TW9jay5yZXBsYXkobU1vY2tEZXZpY2UpOwotICAgICAgICBTZXQ8SUFiaT4gcmVzID0gbVRlc3QuZ2V0QWJpcyhtTW9ja0RldmljZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCByZXMuc2l6ZSgpKTsKLSAgICAgICAgZm9yIChJQWJpIGFiaSA6IHJlcykgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleHBlY3RlZEFiaXMuY29udGFpbnMoYWJpLmdldE5hbWUoKSkpOwotICAgICAgICB9Ci0gICAgICAgIEVhc3lNb2NrLnZlcmlmeShtTW9ja0RldmljZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCB0aGF0IHtAbGluayBDb21wYXRpYmlsaXR5VGVzdFN1aXRlI2dldEFiaXMoSVRlc3REZXZpY2UpfSBpcyB0aHJvd2luZyBhbiBleGNlcHRpb24gaWYKLSAgICAgKiB0aGUgcHJpbWFyeSBhYmkgaXMgbm90IHN1cHBvcnRlZC4KLSAgICAgKi8KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBYmlzX3ByaW1hcnlBYmlPbmx5X05vdFN1cHBvcnRlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBPcHRpb25TZXR0ZXIgc2V0dGVyID0gbmV3IE9wdGlvblNldHRlcihtVGVzdCk7Ci0gICAgICAgIHNldHRlci5zZXRPcHRpb25WYWx1ZShDb21wYXRpYmlsaXR5VGVzdC5QUklNQVJZX0FCSV9SVU4sICJ0cnVlIik7Ci0gICAgICAgIEVhc3lNb2NrLmV4cGVjdChtTW9ja0RldmljZS5nZXRQcm9wZXJ0eShFYXN5TW9jay5lcSgicm8ucHJvZHVjdC5jcHUuYWJpIikpKQotICAgICAgICAgICAgICAgIC5hbmRSZXR1cm4oImFybWVhYmkiKTsKLSAgICAgICAgRWFzeU1vY2sucmVwbGF5KG1Nb2NrRGV2aWNlKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1UZXN0LmdldEFiaXMobU1vY2tEZXZpY2UpOwotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbiIpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJZb3VyIENUUyBoYXNuJ3QgYmVlbiBidWlsdCB3aXRoIGFiaSAnYXJtZWFiaScgc3VwcG9ydCwgIgotICAgICAgICAgICAgICAgICAgICArICJ0aGlzIENUUyBjdXJyZW50bHkgc3VwcG9ydHMgJ1thcm1lYWJpLXY3YSwgYXJtNjQtdjhhXScuIiwgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgICAgIEVhc3lNb2NrLnZlcmlmeShtTW9ja0RldmljZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCB0aGF0IHtAbGluayBDb21wYXRpYmlsaXR5VGVzdFN1aXRlI2dldEFiaXMoSVRlc3REZXZpY2UpfSBpcyByZXR1cm5pbmcgdGhlIGxpc3Qgb2YgYWJpCi0gICAgICogc3VwcG9ydGVkIGJ5IENvbXBhdGliaWxpdHkgYW5kIHRoZSBkZXZpY2UsIGFuZCBub3QgdGhlIHBhcnRpY3VsYXIgQ1RTIGJ1aWxkLgotICAgICAqLwotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEdldEFiaXNfc2tpcEN0c0FyY2hDaGVjaygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBPcHRpb25TZXR0ZXIgc2V0dGVyID0gbmV3IE9wdGlvblNldHRlcihtVGVzdCk7Ci0gICAgICAgIHNldHRlci5zZXRPcHRpb25WYWx1ZShDb21wYXRpYmlsaXR5VGVzdC5TS0lQX0hPU1RfQVJDSF9DSEVDSywgInRydWUiKTsKLSAgICAgICAgRWFzeU1vY2suZXhwZWN0KG1Nb2NrRGV2aWNlLmdldFByb3BlcnR5KEVhc3lNb2NrLmVxKCJyby5wcm9kdWN0LmNwdS5hYmlsaXN0IikpKQotICAgICAgICAgICAgICAgIC5hbmRSZXR1cm4oIng4Nl82NCx4ODYsYXJtZWFiaSIpOwotICAgICAgICBTZXQ8U3RyaW5nPiBleHBlY3RlZEFiaXMgPSBuZXcgSGFzaFNldDw+KCk7Ci0gICAgICAgIGV4cGVjdGVkQWJpcy5hZGQoIng4Nl82NCIpOwotICAgICAgICBleHBlY3RlZEFiaXMuYWRkKCJ4ODYiKTsKLSAgICAgICAgRWFzeU1vY2sucmVwbGF5KG1Nb2NrRGV2aWNlKTsKLSAgICAgICAgU2V0PElBYmk+IHJlcyA9IG1UZXN0LmdldEFiaXMobU1vY2tEZXZpY2UpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcmVzLnNpemUoKSk7Ci0gICAgICAgIGZvciAoSUFiaSBhYmkgOiByZXMpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhwZWN0ZWRBYmlzLmNvbnRhaW5zKGFiaS5nZXROYW1lKCkpKTsKLSAgICAgICAgfQotICAgICAgICBFYXN5TW9jay52ZXJpZnkobU1vY2tEZXZpY2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3Qge0BsaW5rIENvbXBhdGliaWxpdHlUZXN0U3VpdGUjZ2V0QWJpcyhJVGVzdERldmljZSl9IHdoZW4gd2Ugc2tpcCB0aGUgQ3RzIHNpZGUKLSAgICAgKiBhcmNoaXRlY3R1cmUgY2hlY2sgYW5kIHdhbnQgdG8gcnVuIHg4NiBhYmkuCi0gICAgICovCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QWJpc19za2lwQ3RzQXJjaENoZWNrX2FiaVNwZWNpZmllZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBPcHRpb25TZXR0ZXIgc2V0dGVyID0gbmV3IE9wdGlvblNldHRlcihtVGVzdCk7Ci0gICAgICAgIHNldHRlci5zZXRPcHRpb25WYWx1ZShDb21wYXRpYmlsaXR5VGVzdC5TS0lQX0hPU1RfQVJDSF9DSEVDSywgInRydWUiKTsKLSAgICAgICAgc2V0dGVyLnNldE9wdGlvblZhbHVlKENvbXBhdGliaWxpdHlUZXN0LkFCSV9PUFRJT04sICJ4ODYiKTsKLSAgICAgICAgU2V0PFN0cmluZz4gZXhwZWN0ZWRBYmlzID0gbmV3IEhhc2hTZXQ8PigpOwotICAgICAgICBleHBlY3RlZEFiaXMuYWRkKCJ4ODYiKTsKLSAgICAgICAgRWFzeU1vY2sucmVwbGF5KG1Nb2NrRGV2aWNlKTsKLSAgICAgICAgU2V0PElBYmk+IHJlcyA9IG1UZXN0LmdldEFiaXMobU1vY2tEZXZpY2UpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcmVzLnNpemUoKSk7Ci0gICAgICAgIGZvciAoSUFiaSBhYmkgOiByZXMpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhwZWN0ZWRBYmlzLmNvbnRhaW5zKGFiaS5nZXROYW1lKCkpKTsKLSAgICAgICAgfQotICAgICAgICBFYXN5TW9jay52ZXJpZnkobU1vY2tEZXZpY2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3Rlc3R0eXBlL3N1aXRlL01vZHVsZVJlcG9TdWl0ZVRlc3QuamF2YSBiL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3Rlc3R0eXBlL3N1aXRlL01vZHVsZVJlcG9TdWl0ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY3YWZjMC4uMDAwMDAwMAotLS0gYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC90ZXN0dHlwZS9zdWl0ZS9Nb2R1bGVSZXBvU3VpdGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRlc3R0eXBlLnN1aXRlOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5jb25maWcuQ29uZmlndXJhdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5jb25maWcuQ29uZmlndXJhdGlvbkRlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuY29uZmlnLklDb25maWd1cmF0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmNvbmZpZy5PcHRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLkRldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5yZXN1bHQuSVRlc3RJbnZvY2F0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSVJlbW90ZVRlc3Q7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudXRpbC5NdWx0aU1hcDsKLQotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLkpVbml0NDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBVbml0IHRlc3RzIGZvciB7QGxpbmsgTW9kdWxlUmVwb1N1aXRlfS4KLSAqLwotQFJ1bldpdGgoSlVuaXQ0LmNsYXNzKQotcHVibGljIGNsYXNzIE1vZHVsZVJlcG9TdWl0ZVRlc3QgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTXVsdGlNYXA8U3RyaW5nLCBTdHJpbmc+IE1FVEFEQVRBX0lOQ0xVREVTID0gbmV3IE11bHRpTWFwPD4oKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNdWx0aU1hcDxTdHJpbmcsIFN0cmluZz4gTUVUQURBVEFfRVhDTFVERVMgPSBuZXcgTXVsdGlNYXA8PigpOwotICAgIHByaXZhdGUgTW9kdWxlUmVwb1N1aXRlIG1SZXBvOwotCi0gICAgQEJlZm9yZQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgewotICAgICAgICBtUmVwbyA9IG5ldyBNb2R1bGVSZXBvU3VpdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXaGVuIHRoZXJlIGFyZSBubyBtZXRhZGF0YSBiYXNlZCBmaWx0ZXJzIHNwZWNpZmllZCwgY29uZmlnIHNob3VsZCBiZSBpbmNsdWRlZC4KLSAgICAgKi8KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRhZGF0YUZpbHRlcl9lbXB0eUZpbHRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSUNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IENvbmZpZ3VyYXRpb24oImZvbyIsICJiYXIiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiY29uZmlnIG5vdCBpbmNsdWRlZCB3aGVuIG1ldGFkYXRhIGZpbHRlcnMgYXJlIGVtcHR5IiwKLSAgICAgICAgICAgICAgICBtUmVwby5maWx0ZXJCeUNvbmZpZ01ldGFkYXRhKGNvbmZpZywgTUVUQURBVEFfSU5DTFVERVMsIE1FVEFEQVRBX0VYQ0xVREVTKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2hlbiBpbmNsdXNpb24gZmlsdGVyIGlzIHNwZWNpZmllZCwgY29uZmlnIG1hdGNoaW5nIHRoZSBmaWx0ZXIgaXMgaW5jbHVkZWQuCi0gICAgICovCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0YWRhdGFGaWx0ZXJfbWF0Y2hJbmNsdWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIElDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBDb25maWd1cmF0aW9uKCJmb28iLCAiYmFyIik7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25EZXNjcmlwdG9yIGRlc2MgPSBjb25maWcuZ2V0Q29uZmlndXJhdGlvbkRlc2NyaXB0aW9uKCk7Ci0gICAgICAgIE11bHRpTWFwPFN0cmluZywgU3RyaW5nPiBtZXRhZGF0YSA9IG5ldyBNdWx0aU1hcDw+KCk7Ci0gICAgICAgIG1ldGFkYXRhLnB1dCgiY29tcG9uZW50IiwgImZvbyIpOwotICAgICAgICBkZXNjLnNldE1ldGFEYXRhKG1ldGFkYXRhKTsKLSAgICAgICAgTXVsdGlNYXA8U3RyaW5nLCBTdHJpbmc+IGluY2x1ZGVGaWx0ZXIgPSBuZXcgTXVsdGlNYXA8PigpOwotICAgICAgICBpbmNsdWRlRmlsdGVyLnB1dCgiY29tcG9uZW50IiwgImZvbyIpOwotICAgICAgICBhc3NlcnRUcnVlKCJjb25maWcgbm90IGluY2x1ZGVkIHdpdGggbWF0Y2hpbmcgaW5jbHVzaW9uIGZpbHRlciIsCi0gICAgICAgICAgICAgICAgbVJlcG8uZmlsdGVyQnlDb25maWdNZXRhZGF0YShjb25maWcsIGluY2x1ZGVGaWx0ZXIsIE1FVEFEQVRBX0VYQ0xVREVTKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2hlbiBpbmNsdXNpb24gZmlsdGVyIGlzIHNwZWNpZmllZCwgY29uZmlnIG5vdCBtYXRjaGluZyB0aGUgZmlsdGVyIGlzIGV4Y2x1ZGVkCi0gICAgICovCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0YWRhdGFGaWx0ZXJfbm9NYXRjaEluY2x1ZGVfbWlzbWF0Y2hWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBJQ29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgQ29uZmlndXJhdGlvbigiZm9vIiwgImJhciIpOwotICAgICAgICBDb25maWd1cmF0aW9uRGVzY3JpcHRvciBkZXNjID0gY29uZmlnLmdldENvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbigpOwotICAgICAgICBNdWx0aU1hcDxTdHJpbmcsIFN0cmluZz4gbWV0YWRhdGEgPSBuZXcgTXVsdGlNYXA8PigpOwotICAgICAgICBtZXRhZGF0YS5wdXQoImNvbXBvbmVudCIsICJmb28iKTsKLSAgICAgICAgZGVzYy5zZXRNZXRhRGF0YShtZXRhZGF0YSk7Ci0gICAgICAgIE11bHRpTWFwPFN0cmluZywgU3RyaW5nPiBpbmNsdWRlRmlsdGVyID0gbmV3IE11bHRpTWFwPD4oKTsKLSAgICAgICAgaW5jbHVkZUZpbHRlci5wdXQoImNvbXBvbmVudCIsICJiYXIiKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoImNvbmZpZyBub3QgZXhjbHVkZWQgd2l0aCBtaXNtYXRjaGluZyBpbmNsdXNpb24gZmlsdGVyIiwKLSAgICAgICAgICAgICAgICBtUmVwby5maWx0ZXJCeUNvbmZpZ01ldGFkYXRhKGNvbmZpZywgaW5jbHVkZUZpbHRlciwgTUVUQURBVEFfRVhDTFVERVMpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXaGVuIGluY2x1c2lvbiBmaWx0ZXIgaXMgc3BlY2lmaWVkLCBjb25maWcgbm90IG1hdGNoaW5nIHRoZSBmaWx0ZXIgaXMgZXhjbHVkZWQuCi0gICAgICovCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0YWRhdGFGaWx0ZXJfbm9NYXRjaEluY2x1ZGVfbWlzbWF0Y2hLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSUNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IENvbmZpZ3VyYXRpb24oImZvbyIsICJiYXIiKTsKLSAgICAgICAgQ29uZmlndXJhdGlvbkRlc2NyaXB0b3IgZGVzYyA9IGNvbmZpZy5nZXRDb25maWd1cmF0aW9uRGVzY3JpcHRpb24oKTsKLSAgICAgICAgTXVsdGlNYXA8U3RyaW5nLCBTdHJpbmc+IG1ldGFkYXRhID0gbmV3IE11bHRpTWFwPD4oKTsKLSAgICAgICAgbWV0YWRhdGEucHV0KCJjb21wb25lbnQiLCAiZm9vIik7Ci0gICAgICAgIGRlc2Muc2V0TWV0YURhdGEobWV0YWRhdGEpOwotICAgICAgICBNdWx0aU1hcDxTdHJpbmcsIFN0cmluZz4gaW5jbHVkZUZpbHRlciA9IG5ldyBNdWx0aU1hcDw+KCk7Ci0gICAgICAgIGluY2x1ZGVGaWx0ZXIucHV0KCJncm91cCIsICJiYXIiKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoImNvbmZpZyBub3QgZXhjbHVkZWQgd2l0aCBtaXNtYXRjaGluZyBpbmNsdXNpb24gZmlsdGVyIiwKLSAgICAgICAgICAgICAgICBtUmVwby5maWx0ZXJCeUNvbmZpZ01ldGFkYXRhKGNvbmZpZywgaW5jbHVkZUZpbHRlciwgTUVUQURBVEFfRVhDTFVERVMpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXaGVuIGV4Y2x1c2lvbiBmaWx0ZXIgaXMgc3BlY2lmaWVkLCBjb25maWcgbWF0Y2hpbmcgdGhlIGZpbHRlciBpcyBleGNsdWRlZC4KLSAgICAgKi8KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRhZGF0YUZpbHRlcl9tYXRjaEV4Y2x1ZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSUNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IENvbmZpZ3VyYXRpb24oImZvbyIsICJiYXIiKTsKLSAgICAgICAgQ29uZmlndXJhdGlvbkRlc2NyaXB0b3IgZGVzYyA9IGNvbmZpZy5nZXRDb25maWd1cmF0aW9uRGVzY3JpcHRpb24oKTsKLSAgICAgICAgTXVsdGlNYXA8U3RyaW5nLCBTdHJpbmc+IG1ldGFkYXRhID0gbmV3IE11bHRpTWFwPD4oKTsKLSAgICAgICAgbWV0YWRhdGEucHV0KCJjb21wb25lbnQiLCAiZm9vIik7Ci0gICAgICAgIGRlc2Muc2V0TWV0YURhdGEobWV0YWRhdGEpOwotICAgICAgICBNdWx0aU1hcDxTdHJpbmcsIFN0cmluZz4gZXhjbHVkZUZpbHRlciA9IG5ldyBNdWx0aU1hcDw+KCk7Ci0gICAgICAgIGV4Y2x1ZGVGaWx0ZXIucHV0KCJjb21wb25lbnQiLCAiZm9vIik7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJjb25maWcgbm90IGV4Y2x1ZGVkIHdpdGggbWF0Y2hpbmcgZXhjbHVzaW9uIGZpbHRlciIsCi0gICAgICAgICAgICAgICAgbVJlcG8uZmlsdGVyQnlDb25maWdNZXRhZGF0YShjb25maWcsIE1FVEFEQVRBX0lOQ0xVREVTLCBleGNsdWRlRmlsdGVyKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2hlbiBleGNsdXNpb24gZmlsdGVyIGlzIHNwZWNpZmllZCwgY29uZmlnIG5vdCBtYXRjaGluZyB0aGUgZmlsdGVyIGlzIGluY2x1ZGVkLgotICAgICAqLwotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE1ldGFkYXRhRmlsdGVyX25vTWF0Y2hFeGNsdWRlX21pc21hdGNoS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIElDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBDb25maWd1cmF0aW9uKCJmb28iLCAiYmFyIik7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25EZXNjcmlwdG9yIGRlc2MgPSBjb25maWcuZ2V0Q29uZmlndXJhdGlvbkRlc2NyaXB0aW9uKCk7Ci0gICAgICAgIE11bHRpTWFwPFN0cmluZywgU3RyaW5nPiBtZXRhZGF0YSA9IG5ldyBNdWx0aU1hcDw+KCk7Ci0gICAgICAgIG1ldGFkYXRhLnB1dCgiY29tcG9uZW50IiwgImZvbyIpOwotICAgICAgICBkZXNjLnNldE1ldGFEYXRhKG1ldGFkYXRhKTsKLSAgICAgICAgTXVsdGlNYXA8U3RyaW5nLCBTdHJpbmc+IGV4Y2x1ZGVGaWx0ZXIgPSBuZXcgTXVsdGlNYXA8PigpOwotICAgICAgICBleGNsdWRlRmlsdGVyLnB1dCgiY29tcG9uZW50IiwgImJhciIpOwotICAgICAgICBhc3NlcnRUcnVlKCJjb25maWcgbm90IGluY2x1ZGVkIHdpdGggbWlzbWF0Y2hpbmcgZXhjbHVzaW9uIGZpbHRlciIsCi0gICAgICAgICAgICAgICAgbVJlcG8uZmlsdGVyQnlDb25maWdNZXRhZGF0YShjb25maWcsIE1FVEFEQVRBX0lOQ0xVREVTLCBleGNsdWRlRmlsdGVyKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2hlbiBleGNsdXNpb24gZmlsdGVyIGlzIHNwZWNpZmllZCwgY29uZmlnIG5vdCBtYXRjaGluZyB0aGUgZmlsdGVyIGlzIGluY2x1ZGVkLgotICAgICAqLwotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE1ldGFkYXRhRmlsdGVyX25vTWF0Y2hFeGNsdWRlX21pc21hdGNoVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSUNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IENvbmZpZ3VyYXRpb24oImZvbyIsICJiYXIiKTsKLSAgICAgICAgQ29uZmlndXJhdGlvbkRlc2NyaXB0b3IgZGVzYyA9IGNvbmZpZy5nZXRDb25maWd1cmF0aW9uRGVzY3JpcHRpb24oKTsKLSAgICAgICAgTXVsdGlNYXA8U3RyaW5nLCBTdHJpbmc+IG1ldGFkYXRhID0gbmV3IE11bHRpTWFwPD4oKTsKLSAgICAgICAgbWV0YWRhdGEucHV0KCJjb21wb25lbnQiLCAiZm9vIik7Ci0gICAgICAgIGRlc2Muc2V0TWV0YURhdGEobWV0YWRhdGEpOwotICAgICAgICBNdWx0aU1hcDxTdHJpbmcsIFN0cmluZz4gZXhjbHVkZUZpbHRlciA9IG5ldyBNdWx0aU1hcDw+KCk7Ci0gICAgICAgIGV4Y2x1ZGVGaWx0ZXIucHV0KCJncm91cCIsICJiYXIiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiY29uZmlnIG5vdCBpbmNsdWRlZCB3aXRoIG1pc21hdGNoaW5nIGV4Y2x1c2lvbiBmaWx0ZXIiLAotICAgICAgICAgICAgICAgIG1SZXBvLmZpbHRlckJ5Q29uZmlnTWV0YWRhdGEoY29uZmlnLCBNRVRBREFUQV9JTkNMVURFUywgZXhjbHVkZUZpbHRlcikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdoZW4gaW5jbHVzaW9uIGZpbHRlciBpcyBzcGVjaWZpZWQsIGNvbmZpZyB3aXRoIG9uZSBvZiB0aGUgbWV0YWRhdGEgZmllbGQgbWF0Y2hpbmcgdGhlIGZpbHRlcgotICAgICAqIGlzIGluY2x1ZGVkLgotICAgICAqLwotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE1ldGFkYXRhRmlsdGVyX21hdGNoSW5jbHVkZV9tdWx0aXBsZU1ldGFkYXRhRmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSUNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IENvbmZpZ3VyYXRpb24oImZvbyIsICJiYXIiKTsKLSAgICAgICAgQ29uZmlndXJhdGlvbkRlc2NyaXB0b3IgZGVzYyA9IGNvbmZpZy5nZXRDb25maWd1cmF0aW9uRGVzY3JpcHRpb24oKTsKLSAgICAgICAgTXVsdGlNYXA8U3RyaW5nLCBTdHJpbmc+IG1ldGFkYXRhID0gbmV3IE11bHRpTWFwPD4oKTsKLSAgICAgICAgbWV0YWRhdGEucHV0KCJjb21wb25lbnQiLCAiZm9vIik7Ci0gICAgICAgIG1ldGFkYXRhLnB1dCgiY29tcG9uZW50IiwgImJhciIpOwotICAgICAgICBkZXNjLnNldE1ldGFEYXRhKG1ldGFkYXRhKTsKLSAgICAgICAgTXVsdGlNYXA8U3RyaW5nLCBTdHJpbmc+IGluY2x1ZGVGaWx0ZXIgPSBuZXcgTXVsdGlNYXA8PigpOwotICAgICAgICBpbmNsdWRlRmlsdGVyLnB1dCgiY29tcG9uZW50IiwgImZvbyIpOwotICAgICAgICBhc3NlcnRUcnVlKCJjb25maWcgbm90IGluY2x1ZGVkIHdpdGggbWF0Y2hpbmcgaW5jbHVzaW9uIGZpbHRlciIsCi0gICAgICAgICAgICAgICAgbVJlcG8uZmlsdGVyQnlDb25maWdNZXRhZGF0YShjb25maWcsIGluY2x1ZGVGaWx0ZXIsIE1FVEFEQVRBX0VYQ0xVREVTKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2hlbiBleGNsdXNpb24gZmlsdGVyIGlzIHNwZWNpZmllZCwgY29uZmlnIHdpdGggb25lIG9mIHRoZSBtZXRhZGF0YSBmaWVsZCBtYXRjaGluZyB0aGUgZmlsdGVyCi0gICAgICogaXMgZXhjbHVkZWQuCi0gICAgICovCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0YWRhdGFGaWx0ZXJfbWF0Y2hFeGNsdWRlX211bHRpcGxlTWV0YWRhdGFGaWVsZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBJQ29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgQ29uZmlndXJhdGlvbigiZm9vIiwgImJhciIpOwotICAgICAgICBDb25maWd1cmF0aW9uRGVzY3JpcHRvciBkZXNjID0gY29uZmlnLmdldENvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbigpOwotICAgICAgICBNdWx0aU1hcDxTdHJpbmcsIFN0cmluZz4gbWV0YWRhdGEgPSBuZXcgTXVsdGlNYXA8PigpOwotICAgICAgICBtZXRhZGF0YS5wdXQoImNvbXBvbmVudCIsICJmb28iKTsKLSAgICAgICAgbWV0YWRhdGEucHV0KCJjb21wb25lbnQiLCAiYmFyIik7Ci0gICAgICAgIGRlc2Muc2V0TWV0YURhdGEobWV0YWRhdGEpOwotICAgICAgICBNdWx0aU1hcDxTdHJpbmcsIFN0cmluZz4gZXhjbHVkZUZpbHRlciA9IG5ldyBNdWx0aU1hcDw+KCk7Ci0gICAgICAgIGV4Y2x1ZGVGaWx0ZXIucHV0KCJjb21wb25lbnQiLCAiZm9vIik7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJjb25maWcgbm90IGV4Y2x1ZGVkIHdpdGggbWF0Y2hpbmcgZXhjbHVzaW9uIGZpbHRlciIsCi0gICAgICAgICAgICAgICAgbVJlcG8uZmlsdGVyQnlDb25maWdNZXRhZGF0YShjb25maWcsIE1FVEFEQVRBX0lOQ0xVREVTLCBleGNsdWRlRmlsdGVyKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2hlbiBpbmNsdXNpb24gZmlsdGVycyBhcmUgc3BlY2lmaWVkLCBjb25maWcgd2l0aCBtZXRhZGF0YSBmaWVsZCBtYXRjaGluZyBvbmUgb2YgdGhlIGZpbHRlcgotICAgICAqIGlzIGluY2x1ZGVkLgotICAgICAqLwotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE1ldGFkYXRhRmlsdGVyX21hdGNoSW5jbHVkZV9tdWx0aXBsZUZpbHRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSUNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IENvbmZpZ3VyYXRpb24oImZvbyIsICJiYXIiKTsKLSAgICAgICAgQ29uZmlndXJhdGlvbkRlc2NyaXB0b3IgZGVzYyA9IGNvbmZpZy5nZXRDb25maWd1cmF0aW9uRGVzY3JpcHRpb24oKTsKLSAgICAgICAgTXVsdGlNYXA8U3RyaW5nLCBTdHJpbmc+IG1ldGFkYXRhID0gbmV3IE11bHRpTWFwPD4oKTsKLSAgICAgICAgbWV0YWRhdGEucHV0KCJjb21wb25lbnQiLCAiZm9vIik7Ci0gICAgICAgIGRlc2Muc2V0TWV0YURhdGEobWV0YWRhdGEpOwotICAgICAgICBNdWx0aU1hcDxTdHJpbmcsIFN0cmluZz4gaW5jbHVkZUZpbHRlciA9IG5ldyBNdWx0aU1hcDw+KCk7Ci0gICAgICAgIGluY2x1ZGVGaWx0ZXIucHV0KCJjb21wb25lbnQiLCAiZm9vIik7Ci0gICAgICAgIGluY2x1ZGVGaWx0ZXIucHV0KCJjb21wb25lbnQiLCAiYmFyIik7Ci0gICAgICAgIGFzc2VydFRydWUoImNvbmZpZyBub3QgaW5jbHVkZWQgd2l0aCBtYXRjaGluZyBpbmNsdXNpb24gZmlsdGVyIiwKLSAgICAgICAgICAgICAgICBtUmVwby5maWx0ZXJCeUNvbmZpZ01ldGFkYXRhKGNvbmZpZywgaW5jbHVkZUZpbHRlciwgTUVUQURBVEFfRVhDTFVERVMpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXaGVuIGV4Y2x1c2lvbiBmaWx0ZXJzIGFyZSBzcGVjaWZpZWQsIGNvbmZpZyB3aXRoIG1ldGFkYXRhIGZpZWxkIG1hdGNoaW5nIG9uZSBvZiB0aGUgZmlsdGVyCi0gICAgICogaXMgZXhjbHVkZWQuCi0gICAgICovCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0YWRhdGFGaWx0ZXJfbWF0Y2hFeGNsdWRlX211bHRpcGxlRmlsdGVycygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBJQ29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgQ29uZmlndXJhdGlvbigiZm9vIiwgImJhciIpOwotICAgICAgICBDb25maWd1cmF0aW9uRGVzY3JpcHRvciBkZXNjID0gY29uZmlnLmdldENvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbigpOwotICAgICAgICBNdWx0aU1hcDxTdHJpbmcsIFN0cmluZz4gbWV0YWRhdGEgPSBuZXcgTXVsdGlNYXA8PigpOwotICAgICAgICBtZXRhZGF0YS5wdXQoImNvbXBvbmVudCIsICJmb28iKTsKLSAgICAgICAgZGVzYy5zZXRNZXRhRGF0YShtZXRhZGF0YSk7Ci0gICAgICAgIE11bHRpTWFwPFN0cmluZywgU3RyaW5nPiBleGNsdWRlRmlsdGVyID0gbmV3IE11bHRpTWFwPD4oKTsKLSAgICAgICAgZXhjbHVkZUZpbHRlci5wdXQoImNvbXBvbmVudCIsICJmb28iKTsKLSAgICAgICAgZXhjbHVkZUZpbHRlci5wdXQoImNvbXBvbmVudCIsICJiYXIiKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoImNvbmZpZyBub3QgZXhjbHVkZWQgd2l0aCBtYXRjaGluZyBleGNsdXNpb24gZmlsdGVyIiwKLSAgICAgICAgICAgICAgICBtUmVwby5maWx0ZXJCeUNvbmZpZ01ldGFkYXRhKGNvbmZpZywgTUVUQURBVEFfSU5DTFVERVMsIGV4Y2x1ZGVGaWx0ZXIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXaGVuIGluY2x1c2lvbiBmaWx0ZXJzIGFyZSBzcGVjaWZpZWQsIGNvbmZpZyB3aXRoIG1ldGFkYXRhIGZpZWxkIG1hdGNoaW5nIG9uZSBvZiB0aGUgZmlsdGVyCi0gICAgICogaXMgaW5jbHVkZWQuCi0gICAgICovCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0YWRhdGFGaWx0ZXJfbWF0Y2hJbmNsdWRlX211bHRpcGxlTWV0YWRhdGFBbmRGaWx0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIElDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBDb25maWd1cmF0aW9uKCJmb28iLCAiYmFyIik7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25EZXNjcmlwdG9yIGRlc2MgPSBjb25maWcuZ2V0Q29uZmlndXJhdGlvbkRlc2NyaXB0aW9uKCk7Ci0gICAgICAgIE11bHRpTWFwPFN0cmluZywgU3RyaW5nPiBtZXRhZGF0YSA9IG5ldyBNdWx0aU1hcDw+KCk7Ci0gICAgICAgIG1ldGFkYXRhLnB1dCgiY29tcG9uZW50IiwgImZvbzEiKTsKLSAgICAgICAgbWV0YWRhdGEucHV0KCJncm91cCIsICJiYXIxIik7Ci0gICAgICAgIGRlc2Muc2V0TWV0YURhdGEobWV0YWRhdGEpOwotICAgICAgICBNdWx0aU1hcDxTdHJpbmcsIFN0cmluZz4gaW5jbHVkZUZpbHRlciA9IG5ldyBNdWx0aU1hcDw+KCk7Ci0gICAgICAgIGluY2x1ZGVGaWx0ZXIucHV0KCJjb21wb25lbnQiLCAiZm9vMSIpOwotICAgICAgICBpbmNsdWRlRmlsdGVyLnB1dCgiZ3JvdXAiLCAiYmFyMiIpOwotICAgICAgICBhc3NlcnRUcnVlKCJjb25maWcgbm90IGluY2x1ZGVkIHdpdGggbWF0Y2hpbmcgaW5jbHVzaW9uIGZpbHRlciIsCi0gICAgICAgICAgICAgICAgbVJlcG8uZmlsdGVyQnlDb25maWdNZXRhZGF0YShjb25maWcsIGluY2x1ZGVGaWx0ZXIsIE1FVEFEQVRBX0VYQ0xVREVTKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2hlbiBleGNsdXNpb24gZmlsdGVycyBhcmUgc3BlY2lmaWVkLCBjb25maWcgd2l0aCBtZXRhZGF0YSBmaWVsZCBtYXRjaGluZyBvbmUgb2YgdGhlIGZpbHRlcgotICAgICAqIGlzIGV4Y2x1ZGVkLgotICAgICAqLwotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE1ldGFkYXRhRmlsdGVyX21hdGNoRXhjbHVkZV9tdWx0aXBsZU1ldGFkYXRhQW5kRmlsdGVycygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBJQ29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgQ29uZmlndXJhdGlvbigiZm9vIiwgImJhciIpOwotICAgICAgICBDb25maWd1cmF0aW9uRGVzY3JpcHRvciBkZXNjID0gY29uZmlnLmdldENvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbigpOwotICAgICAgICBNdWx0aU1hcDxTdHJpbmcsIFN0cmluZz4gbWV0YWRhdGEgPSBuZXcgTXVsdGlNYXA8PigpOwotICAgICAgICBtZXRhZGF0YS5wdXQoImNvbXBvbmVudCIsICJmb28xIik7Ci0gICAgICAgIG1ldGFkYXRhLnB1dCgiZ3JvdXAiLCAiYmFyMSIpOwotICAgICAgICBkZXNjLnNldE1ldGFEYXRhKG1ldGFkYXRhKTsKLSAgICAgICAgTXVsdGlNYXA8U3RyaW5nLCBTdHJpbmc+IGV4Y2x1ZGVGaWx0ZXIgPSBuZXcgTXVsdGlNYXA8PigpOwotICAgICAgICBleGNsdWRlRmlsdGVyLnB1dCgiY29tcG9uZW50IiwgImZvbzEiKTsKLSAgICAgICAgZXhjbHVkZUZpbHRlci5wdXQoImdyb3VwIiwgImJhcjIiKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoImNvbmZpZyBub3QgZXhjbHVkZWQgd2l0aCBtYXRjaGluZyBleGNsdXNpb24gZmlsdGVyIiwKLSAgICAgICAgICAgICAgICBtUmVwby5maWx0ZXJCeUNvbmZpZ01ldGFkYXRhKGNvbmZpZywgTUVUQURBVEFfSU5DTFVERVMsIGV4Y2x1ZGVGaWx0ZXIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXaGVuIGluY2x1c2lvbiBhbmQgZXhjbHVzaW9uIGZpbHRlcnMgYXJlIGJvdGggc3BlY2lmaWVkLCBjb25maWcgY2FuIHBhc3MgdGhyb3VnaCB0aGUgZmlsdGVycwotICAgICAqIGFzIGV4cGVjdGVkLgotICAgICAqLwotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE1ldGFkYXRhRmlsdGVyX2luY2x1ZGVBbmRFeGNsdWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIElDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBDb25maWd1cmF0aW9uKCJmb28iLCAiYmFyIik7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25EZXNjcmlwdG9yIGRlc2MgPSBjb25maWcuZ2V0Q29uZmlndXJhdGlvbkRlc2NyaXB0aW9uKCk7Ci0gICAgICAgIE11bHRpTWFwPFN0cmluZywgU3RyaW5nPiBtZXRhZGF0YSA9IG5ldyBNdWx0aU1hcDw+KCk7Ci0gICAgICAgIG1ldGFkYXRhLnB1dCgiY29tcG9uZW50IiwgImZvbyIpOwotICAgICAgICBtZXRhZGF0YS5wdXQoImdyb3VwIiwgImJhcjEiKTsKLSAgICAgICAgZGVzYy5zZXRNZXRhRGF0YShtZXRhZGF0YSk7Ci0gICAgICAgIE11bHRpTWFwPFN0cmluZywgU3RyaW5nPiBpbmNsdWRlRmlsdGVyID0gbmV3IE11bHRpTWFwPD4oKTsKLSAgICAgICAgaW5jbHVkZUZpbHRlci5wdXQoImNvbXBvbmVudCIsICJmb28iKTsKLSAgICAgICAgTXVsdGlNYXA8U3RyaW5nLCBTdHJpbmc+IGV4Y2x1ZGVGaWx0ZXIgPSBuZXcgTXVsdGlNYXA8PigpOwotICAgICAgICBleGNsdWRlRmlsdGVyLnB1dCgiZ3JvdXAiLCAiYmFyMiIpOwotICAgICAgICBhc3NlcnRUcnVlKCJjb25maWcgbm90IGluY2x1ZGVkIHdpdGggbWF0Y2hpbmcgaW5jbHVzaW9uIGFuZCBtaXNtYXRjaGluZyBleGNsdXNpb24gZmlsdGVycyIsCi0gICAgICAgICAgICAgICAgbVJlcG8uZmlsdGVyQnlDb25maWdNZXRhZGF0YShjb25maWcsIGluY2x1ZGVGaWx0ZXIsIGV4Y2x1ZGVGaWx0ZXIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXaGVuIGluY2x1c2lvbiBhbmQgZXhjbHVzaW9uIGZpbHRlcnMgYXJlIGJvdGggc3BlY2lmaWVkLCBjb25maWcgYmUgZXhjbHVkZWQgYXMgc3BlY2lmaWVkCi0gICAgICovCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0YWRhdGFGaWx0ZXJfaW5jbHVkZVRoZW5FeGNsdWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIElDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBDb25maWd1cmF0aW9uKCJmb28iLCAiYmFyIik7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25EZXNjcmlwdG9yIGRlc2MgPSBjb25maWcuZ2V0Q29uZmlndXJhdGlvbkRlc2NyaXB0aW9uKCk7Ci0gICAgICAgIE11bHRpTWFwPFN0cmluZywgU3RyaW5nPiBtZXRhZGF0YSA9IG5ldyBNdWx0aU1hcDw+KCk7Ci0gICAgICAgIG1ldGFkYXRhLnB1dCgiY29tcG9uZW50IiwgImZvbyIpOwotICAgICAgICBtZXRhZGF0YS5wdXQoImdyb3VwIiwgImJhciIpOwotICAgICAgICBkZXNjLnNldE1ldGFEYXRhKG1ldGFkYXRhKTsKLSAgICAgICAgTXVsdGlNYXA8U3RyaW5nLCBTdHJpbmc+IGluY2x1ZGVGaWx0ZXIgPSBuZXcgTXVsdGlNYXA8PigpOwotICAgICAgICBpbmNsdWRlRmlsdGVyLnB1dCgiY29tcG9uZW50IiwgImZvbyIpOwotICAgICAgICBNdWx0aU1hcDxTdHJpbmcsIFN0cmluZz4gZXhjbHVkZUZpbHRlciA9IG5ldyBNdWx0aU1hcDw+KCk7Ci0gICAgICAgIGV4Y2x1ZGVGaWx0ZXIucHV0KCJncm91cCIsICJiYXIiKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoImNvbmZpZyBub3QgZXhjbHVkZWQgd2l0aCBtYXRjaGluZyBpbmNsdXNpb24gYW5kIGV4Y2x1c2lvbiBmaWx0ZXJzIiwKLSAgICAgICAgICAgICAgICBtUmVwby5maWx0ZXJCeUNvbmZpZ01ldGFkYXRhKGNvbmZpZywgaW5jbHVkZUZpbHRlciwgZXhjbHVkZUZpbHRlcikpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdEluamVjdCBpbXBsZW1lbnRzIElSZW1vdGVUZXN0IHsKLSAgICAgICAgQE9wdGlvbihuYW1lID0gInNpbXBsZS1zdHJpbmciKQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRlc3QgPSBudWxsOwotICAgICAgICBAT3B0aW9uKG5hbWUgPSAibGlzdC1zdHJpbmciKQotICAgICAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IHRlc3RMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIEBPcHRpb24obmFtZSA9ICJtYXAtc3RyaW5nIikKLSAgICAgICAgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gdGVzdE1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKElUZXN0SW52b2NhdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgdGhhdCB0aGUgZGlmZmVyZW50IGZvcm1hdCBmb3IgbW9kdWxlLWFyZyBhbmQgdGVzdC1hcmcgY2FuIHByb3Blcmx5IGJlIHBhc3NlZCB0byB0aGUKLSAgICAgKiBjb25maWd1cmF0aW9uLgotICAgICAqLwotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEluamVjdENvbmZpZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBJQ29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgQ29uZmlndXJhdGlvbigiZm9vIiwgImJhciIpOwotICAgICAgICBUZXN0SW5qZWN0IGNoZWNrZXIgPSBuZXcgVGVzdEluamVjdCgpOwotICAgICAgICBjb25maWcuc2V0VGVzdChjaGVja2VyKTsKLSAgICAgICAgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBvcHRpb25NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4oKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IG9wdGlvbjEgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgb3B0aW9uMS5hZGQoInZhbHVlMSIpOwotICAgICAgICBvcHRpb25NYXAucHV0KCJzaW1wbGUtc3RyaW5nIiwgb3B0aW9uMSk7Ci0KLSAgICAgICAgTGlzdDxTdHJpbmc+IG9wdGlvbjIgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgb3B0aW9uMi5hZGQoInZhbHVlMiIpOwotICAgICAgICBvcHRpb24yLmFkZCgidmFsdWUzIik7Ci0gICAgICAgIG9wdGlvbjIuYWRkKCJzZXQtb3B0aW9uOm1vcmVvcHRpb24iKTsKLSAgICAgICAgb3B0aW9uTWFwLnB1dCgibGlzdC1zdHJpbmciLCBvcHRpb24yKTsKLQotICAgICAgICBMaXN0PFN0cmluZz4gb3B0aW9uMyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBvcHRpb24zLmFkZCgic2V0LW9wdGlvbjo9bW9yZW9wdGlvbiIpOwotICAgICAgICBvcHRpb25NYXAucHV0KCJtYXAtc3RyaW5nIiwgb3B0aW9uMyk7Ci0KLSAgICAgICAgbVJlcG8uaW5qZWN0T3B0aW9uc1RvQ29uZmlnKG9wdGlvbk1hcCwgY29uZmlnKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlMSIsIGNoZWNrZXIudGVzdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhvcHRpb24yLCBjaGVja2VyLnRlc3RMaXN0KTsKLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiByZXNNYXAgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgICAgIHJlc01hcC5wdXQoInNldC1vcHRpb24iLCAibW9yZW9wdGlvbiIpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzTWFwLCBjaGVja2VyLnRlc3RNYXApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3V0aWwvQ29sbGVjdG9yVXRpbFRlc3QuamF2YSBiL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3V0aWwvQ29sbGVjdG9yVXRpbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YxMzY3MS4uMDAwMDAwMAotLS0gYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC91dGlsL0NvbGxlY3RvclV0aWxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudXRpbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotLyoqCi0gKiBVbml0IHRlc3RzIGZvciB7QGxpbmsgQ29sbGVjdG9yVXRpbH0KLSAqLwotcHVibGljIGNsYXNzIENvbGxlY3RvclV0aWxUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVORk9STUFUVEVEX0pTT04gPSAieyIKLSAgICAgICAgICAgICsgIlwic3RyZWFtX25hbWVfMVwiOiIKLSAgICAgICAgICAgICsgIntcImlkXCI6MSxcImtleTFcIjpcInZhbHVlMVwifSwiCi0gICAgICAgICAgICArICJcInN0cmVhbV9uYW1lXzJcIjoiCi0gICAgICAgICAgICArICJ7XCJpZFwiOjEsXCJrZXkxXCI6XCJ2YWx1ZTNcIn0sIgotICAgICAgICAgICAgKyAiXCJzdHJlYW1fbmFtZV8xXCI6IgotICAgICAgICAgICAgKyAie1wiaWRcIjoyLFwia2V5MVwiOlwidmFsdWUyXCJ9LCIKLSAgICAgICAgICAgICsgIn0iOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRk9STUFUVEVEX0pTT04gPSAieyIKLSAgICAgICAgICAgICsgIlwic3RyZWFtX25hbWVfMlwiOiIKLSAgICAgICAgICAgICsgIlsiCi0gICAgICAgICAgICArICJ7XCJpZFwiOjEsXCJrZXkxXCI6XCJ2YWx1ZTNcIn0iCi0gICAgICAgICAgICArICJdLCIKLSAgICAgICAgICAgICsgIlwic3RyZWFtX25hbWVfMVwiOiIKLSAgICAgICAgICAgICsgIlsiCi0gICAgICAgICAgICArICJ7XCJpZFwiOjEsXCJrZXkxXCI6XCJ2YWx1ZTFcIn0sIgotICAgICAgICAgICAgKyAie1wiaWRcIjoyLFwia2V5MVwiOlwidmFsdWUyXCJ9IgotICAgICAgICAgICAgKyAiXSIKLSAgICAgICAgICAgICsgIn0iOwotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlZm9ybWF0SnNvblN0cmluZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgcmVmb3JtYXR0ZWRKc29uID0gQ29sbGVjdG9yVXRpbC5yZWZvcm1hdEpzb25TdHJpbmcoVU5GT1JNQVRURURfSlNPTik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZWZvcm1hdHRlZEpzb24sIFJFRk9STUFUVEVEX0pTT04pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3V0aWwvRHluYW1pY0NvbmZpZ0ZpbGVSZWFkZXJUZXN0LmphdmEgYi9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC91dGlsL0R5bmFtaWNDb25maWdGaWxlUmVhZGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzVhYmZkLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3V0aWwvRHluYW1pY0NvbmZpZ0ZpbGVSZWFkZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnV0aWw7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQuYnVpbGQuQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmJ1aWxkLkJ1aWxkSW5mbzsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5idWlsZC5JQnVpbGRJbmZvOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnV0aWwuRmlsZVV0aWw7Ci0KLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLWltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuSlVuaXQ0OwotaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBVbml0IHRlc3RzIGZvciB7QGxpbmsgRHluYW1pY0NvbmZpZ0ZpbGVSZWFkZXJ9LgotICovCi1AUnVuV2l0aChKVW5pdDQuY2xhc3MpCi1wdWJsaWMgY2xhc3MgRHluYW1pY0NvbmZpZ0ZpbGVSZWFkZXJUZXN0IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfTkFNRSA9ICJjdHMiOwotICAgIHByaXZhdGUgSUJ1aWxkSW5mbyBtQnVpbGRJbmZvOwotICAgIHByaXZhdGUgRmlsZSBtQ29uZmlnRmlsZTsKLQotICAgIEBCZWZvcmUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtQ29uZmlnRmlsZSA9IEZpbGVVdGlsLmNyZWF0ZVRlbXBGaWxlKCJ0ZW1wLWR5bmFtaWMtY29uZmlnIiwgIi54bWwiKTsKLSAgICAgICAgbUJ1aWxkSW5mbyA9IG5ldyBCdWlsZEluZm8oKTsKLSAgICAgICAgQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyIGhlbHBlciA9IG5ldyBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIobUJ1aWxkSW5mbyk7Ci0gICAgICAgIGhlbHBlci5hZGREeW5hbWljQ29uZmlnRmlsZShNT0RVTEVfTkFNRSwgbUNvbmZpZ0ZpbGUpOwotICAgIH0KLQotICAgIEBBZnRlcgotICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgewotICAgICAgICBGaWxlVXRpbC5kZWxldGVGaWxlKG1Db25maWdGaWxlKTsKLSAgICAgICAgbUJ1aWxkSW5mby5jbGVhblVwKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlRHluYW1pY0NvbmZpZ0ZpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgY29udGVudCA9ICI8ZHluYW1pY0NvbmZpZz5cbiIgKwotICAgICAgICAgICAgIiAgPGVudHJ5IGtleT1cIm1lZGlhX2ZpbGVzX3VybFwiPlxuIiArCi0gICAgICAgICAgICAiICAgIDx2YWx1ZT5zb21lIHZhbHVlPC92YWx1ZT5cbiIgKwotICAgICAgICAgICAgIiAgPC9lbnRyeT5cbiIgKwotICAgICAgICAgICAgIjwvZHluYW1pY0NvbmZpZz4iOwotICAgICAgICBGaWxlVXRpbC53cml0ZVRvRmlsZShjb250ZW50LCBtQ29uZmlnRmlsZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCB3aGVuIHRoZSBkeW5hbWljIGZpbGUgaXMgY29tcGxldGVseSBpbnZhbGlkLgotICAgICAqLwotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEdldFZhbHVlRnJvbUZpbGVfaW52YWxpZEZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIER5bmFtaWNDb25maWdGaWxlUmVhZGVyLmdldFZhbHVlRnJvbUNvbmZpZyhtQ29uZmlnRmlsZSwgImRvZXNub3RleGl0Iik7Ci0gICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uLiIpOwotICAgICAgICB9IGNhdGNoIChYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIGV4cGVjdGVkKSB7Ci0gICAgICAgICAgICAvLyBleHBlY3RlZAotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCB3aGVuIHJlcXVlc3RpbmcgYSBrZXkgbm90IHBhcnQgb2YgdGhlIGR5bmFtaWMgZmlsZS4KLSAgICAgKi8KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZUZyb21GaWxlX2tleU5vdEZvdW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHdyaXRlRHluYW1pY0NvbmZpZ0ZpbGUoKTsKLSAgICAgICAgU3RyaW5nIHJlcyA9IER5bmFtaWNDb25maWdGaWxlUmVhZGVyLmdldFZhbHVlRnJvbUNvbmZpZyhtQ29uZmlnRmlsZSwgImRvZXNub3RleGl0Iik7Ci0gICAgICAgIGFzc2VydE51bGwocmVzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHdoZW4gZ2V0dGluZyB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkuCi0gICAgICovCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVGcm9tRmlsZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB3cml0ZUR5bmFtaWNDb25maWdGaWxlKCk7Ci0gICAgICAgIFN0cmluZyByZXMgPSBEeW5hbWljQ29uZmlnRmlsZVJlYWRlci5nZXRWYWx1ZUZyb21Db25maWcobUNvbmZpZ0ZpbGUsICJtZWRpYV9maWxlc191cmwiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJzb21lIHZhbHVlIiwgcmVzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHdoZW4gZ2V0dGluZyB0aGUgdmFsdWUgdXNpbmcgZGlyZWN0bHkgdGhlIGJ1aWxkIGluZm8gYW5kIG1vZHVsZSBuYW1lLgotICAgICAqLwotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEdldFZhbHVlRnJvbUJ1aWxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHdyaXRlRHluYW1pY0NvbmZpZ0ZpbGUoKTsKLSAgICAgICAgU3RyaW5nIHJlcyA9IER5bmFtaWNDb25maWdGaWxlUmVhZGVyLmdldFZhbHVlRnJvbUNvbmZpZygKLSAgICAgICAgICAgICAgICBtQnVpbGRJbmZvLCBNT0RVTEVfTkFNRSwgIm1lZGlhX2ZpbGVzX3VybCIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInNvbWUgdmFsdWUiLCByZXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3Qgd2hlbiB0cnlpbmcgdG8gZ2V0IGEgdmFsdWUgZnJvbSBhbiB1bmtub3duIG1vZHVsZS4KLSAgICAgKi8KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZUZyb21CdWlsZF9tb2R1bGVOb3RGb3VuZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB3cml0ZUR5bmFtaWNDb25maWdGaWxlKCk7Ci0gICAgICAgIFN0cmluZyByZXMgPSBEeW5hbWljQ29uZmlnRmlsZVJlYWRlci5nZXRWYWx1ZUZyb21Db25maWcoCi0gICAgICAgICAgICAgICAgbUJ1aWxkSW5mbywgIk5PVF9BX01PRFVMRSIsICJtZWRpYV9maWxlc191cmwiKTsKLSAgICAgICAgYXNzZXJ0TnVsbChyZXMpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3V0aWwvT3B0aW9uSGVscGVyVGVzdC5qYXZhIGIvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdXRpbC9PcHRpb25IZWxwZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkZTI4ZGUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdXRpbC9PcHRpb25IZWxwZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnV0aWw7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5jb25maWcuT3B0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmNvbmZpZy5PcHRpb24uSW1wb3J0YW5jZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIFVuaXQgdGVzdHMgZm9yIHtAbGluayBPcHRpb25IZWxwZXJ9Ci0gKi8KLXB1YmxpYyBjbGFzcyBPcHRpb25IZWxwZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQ0xBU1MgPSAidGVzdC1jbGFzcyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQ0xBU1NfU0hPUlROQU1FID0gImMiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0ZJTFRFUiA9ICJ0ZXN0LWZpbHRlciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfTE9HUEFUSCA9ICJ0ZXN0LWxvZ3BhdGgiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX05BTUUgPSAidGVzdC1uYW1lIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9TVUlURSA9ICJ0ZXN0LXN1aXRlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9TVUlURV9TSE9SVE5BTUUgPSAicyI7Ci0KLSAgICBAT3B0aW9uKG5hbWUgPSBURVNUX0NMQVNTLAotICAgICAgICAgICAgc2hvcnROYW1lID0gJ2MnLAotICAgICAgICAgICAgaW1wb3J0YW5jZSA9IEltcG9ydGFuY2UuQUxXQVlTKQotICAgIHByaXZhdGUgU3RyaW5nIG1UZXN0Q2xhc3MgPSBudWxsOwotCi0gICAgQE9wdGlvbihuYW1lID0gVEVTVF9OQU1FLAotICAgICAgICAgICAgaW1wb3J0YW5jZSA9IEltcG9ydGFuY2UuQUxXQVlTKQotICAgIHByaXZhdGUgU3RyaW5nIG1UZXN0TmFtZSA9IG51bGw7Ci0KLSAgICBAT3B0aW9uKG5hbWUgPSBURVNUX1NVSVRFLAotICAgICAgICAgICAgc2hvcnROYW1lID0gJ3MnLAotICAgICAgICAgICAgaW1wb3J0YW5jZSA9IEltcG9ydGFuY2UuQUxXQVlTKQotICAgIHByaXZhdGUgU3RyaW5nIG1UZXN0U3VpdGUgPSBudWxsOwotCi0gICAgQE9wdGlvbihuYW1lID0gVEVTVF9GSUxURVIsCi0gICAgICAgICAgICBpbXBvcnRhbmNlID0gSW1wb3J0YW5jZS5BTFdBWVMpCi0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbUZpbHRlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLQotICAgIEBPcHRpb24obmFtZSA9IFRFU1RfTE9HUEFUSCwKLSAgICAgICAgICAgIGltcG9ydGFuY2UgPSBJbXBvcnRhbmNlLkFMV0FZUykKLSAgICBwcml2YXRlIFN0cmluZyBtTG9nUGF0aCA9IG51bGw7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0T3B0aW9uTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU2V0PFN0cmluZz4gb3B0aW9uTmFtZXMgPSBPcHRpb25IZWxwZXIuZ2V0T3B0aW9uTmFtZXModGhpcyk7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBleHBlY3RlZE5hbWVzID0gQXJyYXlzLmFzTGlzdChURVNUX0NMQVNTLCBURVNUX05BTUUsIFRFU1RfU1VJVEUsCi0gICAgICAgICAgICAgICAgVEVTVF9MT0dQQVRIKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJNaXNzaW5nIG9wdGlvbiBuYW1lcyIsIHRydWUsIG9wdGlvbk5hbWVzLmNvbnRhaW5zQWxsKGV4cGVjdGVkTmFtZXMpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCBmaXZlIGVsZW1lbnRzIiwgNSwgb3B0aW9uTmFtZXMuc2l6ZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0T3B0aW9uU2hvcnROYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTZXQ8U3RyaW5nPiBvcHRpb25TaG9ydE5hbWVzID0gT3B0aW9uSGVscGVyLmdldE9wdGlvblNob3J0TmFtZXModGhpcyk7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBleHBlY3RlZFNob3J0TmFtZXMgPSBBcnJheXMuYXNMaXN0KFRFU1RfQ0xBU1NfU0hPUlROQU1FLCBURVNUX1NVSVRFX1NIT1JUTkFNRSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiTWlzc2luZyBvcHRpb24gc2hvcnRuYW1lcyIsIHRydWUsCi0gICAgICAgICAgICBvcHRpb25TaG9ydE5hbWVzLmNvbnRhaW5zQWxsKGV4cGVjdGVkU2hvcnROYW1lcykpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIHR3byBlbGVtZW50cyIsIDIsIG9wdGlvblNob3J0TmFtZXMuc2l6ZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsaWRDbGlBcmdzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBmYWtlVGVzdENsYXNzID0gIkZvb1Rlc3RDYXNlcyI7Ci0gICAgICAgIFN0cmluZyBmYWtlVGVzdE1ldGhvZCA9ICJhbmRyb2lkLmZvby5mb290ZXN0c3VpdGUuUmVhbFRlc3QjdGVzdFN1cGVyUmVhbCI7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBub1ZhbGlkTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IHZhbGlkU3Vic2V0ID0gQXJyYXlzLmFzTGlzdCgiLS0iICsgVEVTVF9DTEFTUywgImZvb2NsYXNzIiwKLSAgICAgICAgICAgICItIiArIFRFU1RfU1VJVEVfU0hPUlROQU1FLCAiZm9vc3VpdGUiKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGFsbFZhbGlkTmFtZXMgPSBBcnJheXMuYXNMaXN0KCItLSIgKyBURVNUX0NMQVNTLCAiZm9vY2xhc3MiLAotICAgICAgICAgICAgIi0iICsgVEVTVF9TVUlURV9TSE9SVE5BTUUsICJmb29zdWl0ZTpmb28ta2V5PWZvb3ZhbCIsICItLSIgKyBURVNUX05BTUUsICJmb290ZXN0IiwKLSAgICAgICAgICAgICItLSIgKyBURVNUX0xPR1BBVEgsICJwYXRoL3RvL2xvZy1kaXJlY3RvcnkvIik7Ci0KLSAgICAgICAgTGlzdDxTdHJpbmc+IHZhbGlkUXVvdGVTdWJzZXQgPSBBcnJheXMuYXNMaXN0KCItIiArIFRFU1RfQ0xBU1NfU0hPUlROQU1FLCBmYWtlVGVzdENsYXNzLAotICAgICAgICAgICAgIi0tIiArIFRFU1RfTkFNRSArICIgIiArIGZha2VUZXN0TWV0aG9kLCAiLS0iICsgVEVTVF9GSUxURVIsIGZha2VUZXN0Q2xhc3MgKyAiICIKLSAgICAgICAgICAgICsgZmFrZVRlc3RNZXRob2QpOwotICAgICAgICBTdHJpbmdbXSBpbnB1dEFycmF5ID0geyJmb29jdHMgIiwgIi0iLCBURVNUX0NMQVNTX1NIT1JUTkFNRSwgIiAiLCBmYWtlVGVzdENsYXNzLCAiIFwiLS0iLAotICAgICAgICAgICAgVEVTVF9OQU1FLCAiPSIsIGZha2VUZXN0TWV0aG9kLCAiXCIgLXogXCJGQUtFMSBGQUtFMlwiIC0tIiwgVEVTVF9GSUxURVIsICIgXCIiLAotICAgICAgICAgICAgZmFrZVRlc3RDbGFzcywgIiAiLCBmYWtlVGVzdE1ldGhvZCArICJcIiJ9OwotICAgICAgICBTdHJpbmcgaW5wdXRTdHJpbmcgPSBTdHJpbmcuam9pbigiIiwgaW5wdXRBcnJheSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCBubyB2YWxpZCBuYW1lcyIsIG5vVmFsaWROYW1lcywKLSAgICAgICAgICAgIE9wdGlvbkhlbHBlci5nZXRWYWxpZENsaUFyZ3MoInRlc3QgLS1mb28gLWIiLCB0aGlzKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRXhwZWN0ZWQgb25lIGxvbmcgbmFtZSBhbmQgb25lIHNob3J0IG5hbWUiLCB2YWxpZFN1YnNldCwKLSAgICAgICAgICAgIE9wdGlvbkhlbHBlci5nZXRWYWxpZENsaUFyZ3MoInRlc3QgLS0iICsgVEVTVF9DTEFTUyArICIgZm9vY2xhc3MgLWIgZmFrZSIKLSAgICAgICAgICAgICAgICArICIgLXMgZm9vc3VpdGUiLCB0aGlzKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRXhwZWN0ZWQgdHdvIGxvbmcgbmFtZXMgYW5kIG9uZSBzaG9ydCBuYW1lIiwgYWxsVmFsaWROYW1lcywKLSAgICAgICAgICAgIE9wdGlvbkhlbHBlci5nZXRWYWxpZENsaUFyZ3MoInRlc3QgLS0iICsgVEVTVF9DTEFTUyArICIgZm9vY2xhc3MgLWIgZmFrZSIKLSAgICAgICAgICAgICAgICArICIgLXMgZm9vc3VpdGU6Zm9vLWtleT1mb292YWwgLS0iICsgVEVTVF9OQU1FICsgIiBmb290ZXN0IC0tIiArIFRFU1RfTE9HUEFUSAotICAgICAgICAgICAgICAgICsgIiBwYXRoL3RvL2xvZy1kaXJlY3RvcnkvIiwgdGhpcykpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIG1hdGNoaW5nIGFycmF5cyIsIHZhbGlkUXVvdGVTdWJzZXQsCi0gICAgICAgICAgICBPcHRpb25IZWxwZXIuZ2V0VmFsaWRDbGlBcmdzKGlucHV0U3RyaW5nLCB0aGlzKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC91dGlsL1JldHJ5RmlsdGVySGVscGVyVGVzdC5qYXZhIGIvY29tbW9uL2hvc3Qtc2lkZS90cmFkZWZlZC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdHJhZGVmZWQvdXRpbC9SZXRyeUZpbHRlckhlbHBlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI4ZGM5ZS4uMDAwMDAwMAotLS0gYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC91dGlsL1JldHJ5RmlsdGVySGVscGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnV0aWw7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOwotCi1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLkpVbml0NDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogVW5pdCB0ZXN0cyBmb3Ige0BsaW5rIFJldHJ5RmlsdGVySGVscGVyfQotICovCi1AUnVuV2l0aChKVW5pdDQuY2xhc3MpCi1wdWJsaWMgY2xhc3MgUmV0cnlGaWx0ZXJIZWxwZXJUZXN0IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1NUUklORyA9ICJhYmNkIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXRyeVR5cGUgVEVTVF9SRVRSWV9UWVBFID0gUmV0cnlUeXBlLkZBSUxFRDsKLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoYXQgb3B0aW9ucyBjYW4gYmUgaW50ZXJuYWxseSBjb3BpZWQgdXNpbmcKLSAgICAgKiB7QGxpbmsgUmV0cnlGaWx0ZXJIZWxwZXIjc2V0QWxsT3B0aW9uc0Zyb20oUmV0cnlGaWx0ZXJIZWxwZXIpfS4KLSAgICAgKi8KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRBbGxPcHRpb25zRnJvbSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBSZXRyeUZpbHRlckhlbHBlciBoZWxwZXIgPSBuZXcgUmV0cnlGaWx0ZXJIZWxwZXIobnVsbCwgMCk7Ci0gICAgICAgIFJldHJ5RmlsdGVySGVscGVyIG90aGVyT2JqID0gbmV3IFJldHJ5RmlsdGVySGVscGVyKG51bGwsIDAsIFRFU1RfU1RSSU5HLAotICAgICAgICAgICAgICAgIG5ldyBIYXNoU2V0PFN0cmluZz4oKSwgbmV3IEhhc2hTZXQ8U3RyaW5nPigpLCBudWxsICxudWxsLCBudWxsLCBudWxsKTsKLSAgICAgICAgaGVscGVyLnNldEFsbE9wdGlvbnNGcm9tKG90aGVyT2JqKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFRFU1RfU1RSSU5HLCBoZWxwZXIubVN1YlBsYW4pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoYXQgb3B0aW9ucyBjYW4gYmUgY2xlYXJlZCB1c2luZyB7QGxpbmsgUmV0cnlGaWx0ZXJIZWxwZXIjY2xlYXJPcHRpb25zKCl9LgotICAgICAqLwotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENsZWFyT3B0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTZXQ8U3RyaW5nPiBpbmNsdWRlID0gbmV3IEhhc2hTZXQ8PigpOwotICAgICAgICBpbmNsdWRlLmFkZChURVNUX1NUUklORyk7Ci0gICAgICAgIFNldDxTdHJpbmc+IGV4Y2x1ZGUgPSBuZXcgSGFzaFNldDw+KCk7Ci0gICAgICAgIGV4Y2x1ZGUuYWRkKFRFU1RfU1RSSU5HKTsKLSAgICAgICAgUmV0cnlGaWx0ZXJIZWxwZXIgaGVscGVyID0gbmV3IFJldHJ5RmlsdGVySGVscGVyKG51bGwsIDAsIFRFU1RfU1RSSU5HLCBpbmNsdWRlLCBleGNsdWRlLAotICAgICAgICAgICAgICAgIFRFU1RfU1RSSU5HLCBURVNUX1NUUklORywgVEVTVF9TVFJJTkcsIFRFU1RfUkVUUllfVFlQRSk7Ci0gICAgICAgIGhlbHBlci5jbGVhck9wdGlvbnMoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShoZWxwZXIubVN1YlBsYW4gPT0gbnVsbCk7Ci0gICAgICAgIGFzc2VydFRydWUoaGVscGVyLm1JbmNsdWRlRmlsdGVycy5pc0VtcHR5KCkpOwotICAgICAgICBhc3NlcnRUcnVlKGhlbHBlci5tRXhjbHVkZUZpbHRlcnMuaXNFbXB0eSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShoZWxwZXIubUFiaU5hbWUgPT0gbnVsbCk7Ci0gICAgICAgIGFzc2VydFRydWUoaGVscGVyLm1Nb2R1bGVOYW1lID09IG51bGwpOwotICAgICAgICBhc3NlcnRUcnVlKGhlbHBlci5tVGVzdE5hbWUgPT0gbnVsbCk7Ci0gICAgICAgIGFzc2VydFRydWUoaGVscGVyLm1SZXRyeVR5cGUgPT0gbnVsbCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi90cmFkZWZlZC91dGlsL1VuaXF1ZU1vZHVsZUNvdW50VXRpbFRlc3QuamF2YSBiL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3V0aWwvVW5pcXVlTW9kdWxlQ291bnRVdGlsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTIwMTMzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3RyYWRlZmVkL3V0aWwvVW5pcXVlTW9kdWxlQ291bnRVdGlsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnV0aWw7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5JTW9kdWxlRGVmOwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRlc3R0eXBlLk1vZHVsZURlZjsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5UZXN0U3R1YjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5jb25maWcuQ29uZmlndXJhdGlvbkRlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5JVGFyZ2V0UHJlcGFyZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuQWJpOwotCi1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIFVuaXQgdGVzdHMgZm9yIHtAbGluayBVbmlxdWVNb2R1bGVDb3VudFV0aWx9LgotICovCi1wdWJsaWMgY2xhc3MgVW5pcXVlTW9kdWxlQ291bnRVdGlsVGVzdCB7Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDb3VudEVtcHR5TGlzdCgpIHsKLSAgICAgICAgTGlzdDxJTW9kdWxlRGVmPiBlbXB0eUxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIFVuaXF1ZU1vZHVsZUNvdW50VXRpbC5jb3VudFVuaXF1ZU1vZHVsZXMoZW1wdHlMaXN0KSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q291bnRfMnVuaXF1ZXNNb2R1bGVzKCkgewotICAgICAgICBMaXN0PElNb2R1bGVEZWY+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgbGlzdC5hZGQobmV3IE1vZHVsZURlZigibW9kdWxlQSIsIG5ldyBBYmkoImFybTY0IiwgIjY0IiksIG5ldyBUZXN0U3R1YigpLAotICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8SVRhcmdldFByZXBhcmVyPigpLCBuZXcgQ29uZmlndXJhdGlvbkRlc2NyaXB0b3IoKSkpOwotICAgICAgICBsaXN0LmFkZChuZXcgTW9kdWxlRGVmKCJtb2R1bGVBIiwgbmV3IEFiaSgiYXJtMzIiLCAiMzIiKSwgbmV3IFRlc3RTdHViKCksCi0gICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxJVGFyZ2V0UHJlcGFyZXI+KCksIG5ldyBDb25maWd1cmF0aW9uRGVzY3JpcHRvcigpKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBVbmlxdWVNb2R1bGVDb3VudFV0aWwuY291bnRVbmlxdWVNb2R1bGVzKGxpc3QpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDb3VudF8yc3ViTW9kdWxlcygpIHsKLSAgICAgICAgTGlzdDxJTW9kdWxlRGVmPiBsaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIGxpc3QuYWRkKG5ldyBNb2R1bGVEZWYoIm1vZHVsZUEiLCBuZXcgQWJpKCJhcm0zMiIsICIzMiIpLCBuZXcgVGVzdFN0dWIoKSwKLSAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PElUYXJnZXRQcmVwYXJlcj4oKSwgbmV3IENvbmZpZ3VyYXRpb25EZXNjcmlwdG9yKCkpKTsKLSAgICAgICAgbGlzdC5hZGQobmV3IE1vZHVsZURlZigibW9kdWxlQSIsIG5ldyBBYmkoImFybTMyIiwgIjMyIiksIG5ldyBUZXN0U3R1YigpLAotICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8SVRhcmdldFByZXBhcmVyPigpLCBuZXcgQ29uZmlndXJhdGlvbkRlc2NyaXB0b3IoKSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgVW5pcXVlTW9kdWxlQ291bnRVdGlsLmNvdW50VW5pcXVlTW9kdWxlcyhsaXN0KSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q291bnRfbWl4KCkgewotICAgICAgICBMaXN0PElNb2R1bGVEZWY+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgbGlzdC5hZGQobmV3IE1vZHVsZURlZigibW9kdWxlQSIsIG5ldyBBYmkoImFybTY0IiwgIjY0IiksIG5ldyBUZXN0U3R1YigpLAotICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8SVRhcmdldFByZXBhcmVyPigpLCBuZXcgQ29uZmlndXJhdGlvbkRlc2NyaXB0b3IoKSkpOwotICAgICAgICBsaXN0LmFkZChuZXcgTW9kdWxlRGVmKCJtb2R1bGVBIiwgbmV3IEFiaSgiYXJtMzIiLCAiMzIiKSwgbmV3IFRlc3RTdHViKCksCi0gICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxJVGFyZ2V0UHJlcGFyZXI+KCksIG5ldyBDb25maWd1cmF0aW9uRGVzY3JpcHRvcigpKSk7Ci0gICAgICAgIGxpc3QuYWRkKG5ldyBNb2R1bGVEZWYoIm1vZHVsZUMiLCBuZXcgQWJpKCJhcm0zMiIsICIzMiIpLCBuZXcgVGVzdFN0dWIoKSwKLSAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PElUYXJnZXRQcmVwYXJlcj4oKSwgbmV3IENvbmZpZ3VyYXRpb25EZXNjcmlwdG9yKCkpKTsKLSAgICAgICAgbGlzdC5hZGQobmV3IE1vZHVsZURlZigibW9kdWxlQiIsIG5ldyBBYmkoImFybTY0IiwgIjY0IiksIG5ldyBUZXN0U3R1YigpLAotICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8SVRhcmdldFByZXBhcmVyPigpLCBuZXcgQ29uZmlndXJhdGlvbkRlc2NyaXB0b3IoKSkpOwotICAgICAgICBsaXN0LmFkZChuZXcgTW9kdWxlRGVmKCJtb2R1bGVCIiwgbmV3IEFiaSgiYXJtMzIiLCAiMzIiKSwgbmV3IFRlc3RTdHViKCksCi0gICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxJVGFyZ2V0UHJlcGFyZXI+KCksIG5ldyBDb25maWd1cmF0aW9uRGVzY3JpcHRvcigpKSk7Ci0gICAgICAgIGxpc3QuYWRkKG5ldyBNb2R1bGVEZWYoIm1vZHVsZUMiLCBuZXcgQWJpKCJhcm02NCIsICI2NCIpLCBuZXcgVGVzdFN0dWIoKSwKLSAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PElUYXJnZXRQcmVwYXJlcj4oKSwgbmV3IENvbmZpZ3VyYXRpb25EZXNjcmlwdG9yKCkpKTsKLSAgICAgICAgbGlzdC5hZGQobmV3IE1vZHVsZURlZigibW9kdWxlQSIsIG5ldyBBYmkoImFybTMyIiwgIjMyIiksIG5ldyBUZXN0U3R1YigpLAotICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8SVRhcmdldFByZXBhcmVyPigpLCBuZXcgQ29uZmlndXJhdGlvbkRlc2NyaXB0b3IoKSkpOwotICAgICAgICBsaXN0LmFkZChuZXcgTW9kdWxlRGVmKCJtb2R1bGVDIiwgbmV3IEFiaSgiYXJtMzIiLCAiMzIiKSwgbmV3IFRlc3RTdHViKCksCi0gICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxJVGFyZ2V0UHJlcGFyZXI+KCksIG5ldyBDb25maWd1cmF0aW9uRGVzY3JpcHRvcigpKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyg2LCBVbmlxdWVNb2R1bGVDb3VudFV0aWwuY291bnRVbmlxdWVNb2R1bGVzKGxpc3QpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vaG9zdC1zaWRlL3V0aWwvQW5kcm9pZC5tayBiL2NvbW1vbi9ob3N0LXNpZGUvdXRpbC9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2E1YjVkLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9ob3N0LXNpZGUvdXRpbC9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLUxPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKLQotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGNvbXBhdGliaWxpdHktY29tbW9uLXV0aWwtaG9zdHNpZGVsaWIganNvbmxpYgotCi1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGdlbmVyYWwtdGVzdHMKLQotTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0ganNvbi1wcmVidWlsdCB0cmFkZWZlZAotCi1MT0NBTF9NT0RVTEUgOj0gY29tcGF0aWJpbGl0eS1ob3N0LXV0aWwKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLWluY2x1ZGUgY3RzL2Vycm9yX3Byb25lX3J1bGVzLm1rCi1pbmNsdWRlICQoQlVJTERfSE9TVF9KQVZBX0xJQlJBUlkpCi0KLWluY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL2NvbW1vbi9ob3N0LXNpZGUvdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9BcGlMZXZlbFV0aWwuamF2YSBiL2NvbW1vbi9ob3N0LXNpZGUvdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9BcGlMZXZlbFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTlmNTRkYS4uMDAwMDAwMAotLS0gYS9jb21tb24vaG9zdC1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQXBpTGV2ZWxVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWw7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5JVGVzdERldmljZTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotCi0vKioKLSAqIERldmljZS1zaWRlIGNvbXBhdGliaWxpdHkgdXRpbGl0eSBjbGFzcyBmb3IgcmVhZGluZyBkZXZpY2UgQVBJIGxldmVsLgotICovCi1wdWJsaWMgY2xhc3MgQXBpTGV2ZWxVdGlsIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPREVOQU1FID0gInJvLmJ1aWxkLnZlcnNpb24uY29kZW5hbWUiOwotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQmVmb3JlKElUZXN0RGV2aWNlIGRldmljZSwgaW50IHZlcnNpb24pCi0gICAgICAgICAgICB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGRldmljZS5nZXRBcGlMZXZlbCgpIDwgdmVyc2lvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNCZWZvcmUoSVRlc3REZXZpY2UgZGV2aWNlLCBTdHJpbmcgdmVyc2lvbikKLSAgICAgICAgICAgIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZGV2aWNlLmdldEFwaUxldmVsKCkgPCByZXNvbHZlVmVyc2lvblN0cmluZyh2ZXJzaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBZnRlcihJVGVzdERldmljZSBkZXZpY2UsIGludCB2ZXJzaW9uKQotICAgICAgICAgICAgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBkZXZpY2UuZ2V0QXBpTGV2ZWwoKSA+IHZlcnNpb247Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQWZ0ZXIoSVRlc3REZXZpY2UgZGV2aWNlLCBTdHJpbmcgdmVyc2lvbikKLSAgICAgICAgICAgIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZGV2aWNlLmdldEFwaUxldmVsKCkgPiByZXNvbHZlVmVyc2lvblN0cmluZyh2ZXJzaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBdExlYXN0KElUZXN0RGV2aWNlIGRldmljZSwgaW50IHZlcnNpb24pCi0gICAgICAgICAgICB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGRldmljZS5nZXRBcGlMZXZlbCgpID49IHZlcnNpb247Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQXRMZWFzdChJVGVzdERldmljZSBkZXZpY2UsIFN0cmluZyB2ZXJzaW9uKQotICAgICAgICAgICAgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBkZXZpY2UuZ2V0QXBpTGV2ZWwoKSA+PSByZXNvbHZlVmVyc2lvblN0cmluZyh2ZXJzaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBdE1vc3QoSVRlc3REZXZpY2UgZGV2aWNlLCBpbnQgdmVyc2lvbikKLSAgICAgICAgICAgIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZGV2aWNlLmdldEFwaUxldmVsKCkgPD0gdmVyc2lvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBdE1vc3QoSVRlc3REZXZpY2UgZGV2aWNlLCBTdHJpbmcgdmVyc2lvbikKLSAgICAgICAgICAgIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZGV2aWNlLmdldEFwaUxldmVsKCkgPD0gcmVzb2x2ZVZlcnNpb25TdHJpbmcodmVyc2lvbik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0QXBpTGV2ZWwoSVRlc3REZXZpY2UgZGV2aWNlKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGRldmljZS5nZXRBcGlMZXZlbCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb2RlbmFtZUVxdWFscyhJVGVzdERldmljZSBkZXZpY2UsIFN0cmluZyBuYW1lKQotICAgICAgICAgICAgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBkZXZpY2UuZ2V0UHJvcGVydHkoQ09ERU5BTUUpLmVxdWFsc0lnbm9yZUNhc2UobmFtZS50cmltKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb2RlbmFtZVN0YXJ0c1dpdGgoSVRlc3REZXZpY2UgZGV2aWNlLCBTdHJpbmcgcHJlZml4KQotICAgICAgICAgICAgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBkZXZpY2UuZ2V0UHJvcGVydHkoQ09ERU5BTUUpLnN0YXJ0c1dpdGgocHJlZml4KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb2RlbmFtZShJVGVzdERldmljZSBkZXZpY2UpCi0gICAgICAgICAgICB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGRldmljZS5nZXRQcm9wZXJ0eShDT0RFTkFNRSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBpbnQgcmVzb2x2ZVZlcnNpb25TdHJpbmcoU3RyaW5nIHZlcnNpb25TdHJpbmcpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHZlcnNpb25TdHJpbmcpOyAvLyBlLmcuICIyNCIgZm9yIE0KLSAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUxKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEZpZWxkIHZlcnNpb25GaWVsZCA9IFZlcnNpb25Db2Rlcy5jbGFzcy5nZXRGaWVsZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb25TdHJpbmcudG9VcHBlckNhc2UoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHZlcnNpb25GaWVsZC5nZXRJbnQobnVsbCk7IC8vIG5vIGluc3RhbmNlIGZvciBWRVJTSU9OX0NPREVTLCB1c2UgbnVsbAotICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB8IE5vU3VjaEZpZWxkRXhjZXB0aW9uIGUyKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJGYWlsZWQgdG8gcGFyc2UgdmVyc2lvbiBzdHJpbmcgJXMiLCB2ZXJzaW9uU3RyaW5nKSwgZTIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2hvc3Qtc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0J1c2luZXNzTG9naWNIb3N0RXhlY3V0b3IuamF2YSBiL2NvbW1vbi9ob3N0LXNpZGUvdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9CdXNpbmVzc0xvZ2ljSG9zdEV4ZWN1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzYmRlYTEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2hvc3Qtc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0J1c2luZXNzTG9naWNIb3N0RXhlY3V0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWw7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5idWlsZC5JQnVpbGRJbmZvOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5JVGVzdERldmljZTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEV4ZWN1dGUgYnVzaW5lc3MgbG9naWMgbWV0aG9kcyBmb3IgaG9zdCBzaWRlIHRlc3QgY2FzZXMKLSAqLwotcHVibGljIGNsYXNzIEJ1c2luZXNzTG9naWNIb3N0RXhlY3V0b3IgZXh0ZW5kcyBCdXNpbmVzc0xvZ2ljRXhlY3V0b3IgewotCi0gICAgcHJpdmF0ZSBJVGVzdERldmljZSBtRGV2aWNlOwotICAgIHByaXZhdGUgSUJ1aWxkSW5mbyBtQnVpbGQ7Ci0gICAgcHJpdmF0ZSBPYmplY3QgbVRlc3RPYmo7Ci0KLSAgICBwdWJsaWMgQnVzaW5lc3NMb2dpY0hvc3RFeGVjdXRvcihJVGVzdERldmljZSBkZXZpY2UsIElCdWlsZEluZm8gYnVpbGQsIE9iamVjdCB0ZXN0T2JqKSB7Ci0gICAgICAgIG1EZXZpY2UgPSBkZXZpY2U7Ci0gICAgICAgIG1CdWlsZCA9IGJ1aWxkOwotICAgICAgICBtVGVzdE9iaiA9IHRlc3RPYmo7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0VGVzdE9iamVjdCgpIHsKLSAgICAgICAgcmV0dXJuIG1UZXN0T2JqOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgUmVzb2x2ZWRNZXRob2QgZ2V0UmVzb2x2ZWRNZXRob2QoQ2xhc3MgY2xzLCBTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nLi4uIGFyZ3MpCi0gICAgICAgICAgICB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3Q8TWV0aG9kPiBuYW1lTWF0Y2hlcyA9IGdldE1ldGhvZHNXaXRoTmFtZShjbHMsIG1ldGhvZE5hbWUpOwotICAgICAgICBmb3IgKE1ldGhvZCBtIDogbmFtZU1hdGNoZXMpIHsKLSAgICAgICAgICAgIFJlc29sdmVkTWV0aG9kIHJtID0gbmV3IFJlc29sdmVkTWV0aG9kKG0pOwotICAgICAgICAgICAgaW50IHBhcmFtVHlwZXNNYXRjaGVkID0gMDsKLSAgICAgICAgICAgIGludCBhcmdzVXNlZCA9IDA7Ci0gICAgICAgICAgICBDbGFzc1tdIHBhcmFtVHlwZXMgPSBtLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0gICAgICAgICAgICBmb3IgKENsYXNzIHBhcmFtVHlwZSA6IHBhcmFtVHlwZXMpIHsKLSAgICAgICAgICAgICAgICBpZiAoYXJnc1VzZWQgPT0gYXJncy5sZW5ndGggJiYgcGFyYW1UeXBlLmVxdWFscyhTdHJpbmcuY2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFdlJ3ZlIHVzZWQgdXAgYWxsIHN1cHBsaWVkIHN0cmluZyBhcmdzLCBzbyB0aGlzIG1ldGhvZCB3aWxsIG5vdCBtYXRjaC4KLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgcGFyYW1UeXBlIGlzIHRoZSBJVGVzdERldmljZSBvciBJQnVpbGRJbmZvIGNsYXNzLCB3ZSBjYW4gbWF0Y2ggYQotICAgICAgICAgICAgICAgICAgICAvLyBwYXJhbVR5cGUgd2l0aG91dCBuZWVkaW5nIG1vcmUgc3RyaW5nIGFyZ3MuIHNpbWlsYXJseSwgcGFyYW1UeXBlICJTdHJpbmdbXSIKLSAgICAgICAgICAgICAgICAgICAgLy8gY2FuIGJlIG1hdGNoZWQgd2l0aCB6ZXJvIHN0cmluZyBhcmdzLiBJZiB3ZSBhZGQgc3VwcG9ydCBmb3IgbW9yZSBwYXJhbVR5cGVzLAotICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGxvZ2ljIG1heSByZXF1aXJlIGFkanVzdG1lbnQuCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocGFyYW1UeXBlLmVxdWFscyhTdHJpbmcuY2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFR5cGUgIlN0cmluZyIgLS0gc3VwcGx5IHRoZSBuZXh0IGF2YWlsYWJsZSBhcmcKLSAgICAgICAgICAgICAgICAgICAgcm0uYWRkQXJnKGFyZ3NbYXJnc1VzZWQrK10pOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoSVRlc3REZXZpY2UuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShwYXJhbVR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJtLmFkZEFyZyhtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKElCdWlsZEluZm8uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShwYXJhbVR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJtLmFkZEFyZyhtQnVpbGQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1UeXBlLmVxdWFscyhDbGFzcy5mb3JOYW1lKFNUUklOR19BUlJBWV9DTEFTUykpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFR5cGUgIlN0cmluZ1tdIiAob3IgIlN0cmluZy4uLiIpIC0tIHN1cHBseSBhbGwgcmVtYWluaW5nIGFyZ3MKLSAgICAgICAgICAgICAgICAgICAgcm0uYWRkQXJnKEFycmF5cy5jb3B5T2ZSYW5nZShhcmdzLCBhcmdzVXNlZCwgYXJncy5sZW5ndGgpKTsKLSAgICAgICAgICAgICAgICAgICAgYXJnc1VzZWQgKz0gKGFyZ3MubGVuZ3RoIC0gYXJnc1VzZWQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBQYXJhbSB0eXBlIGlzIHVucmVjb2duaXplZCwgdGhpcyBtZXRob2Qgd2lsbCBub3QgbWF0Y2guCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBhcmFtVHlwZXNNYXRjaGVkKys7IC8vIEEgcGFyYW0gdHlwZSBoYXMgYmVlbiBtYXRjaGVkIHdoZW4gcmVhY2hpbmcgdGhpcyBwb2ludC4KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwYXJhbVR5cGVzTWF0Y2hlZCA9PSBwYXJhbVR5cGVzLmxlbmd0aCAmJiBhcmdzVXNlZCA9PSBhcmdzLmxlbmd0aCkgewotICAgICAgICAgICAgICAgIHJldHVybiBybTsgLy8gQXJncyBtYXRjaCwgbWV0aG9kcyBtYXRjaCwgc28gcmV0dXJuIHRoZSBmaXJzdCBtZXRob2QtYXJncyBwYWlyaW5nLgotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gTm90IGEgbWF0Y2gsIHRyeSBhcmdzIGZvciBuZXh0IG1ldGhvZCB0aGF0IG1hdGNoZXMgYnkgbmFtZS4KLSAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICJCdXNpbmVzc0xvZ2ljOiBGYWlsZWQgdG8gaW52b2tlIGFjdGlvbiBtZXRob2QgJXMgd2l0aCBhcmdzOiAlcyIsIG1ldGhvZE5hbWUsCi0gICAgICAgICAgICAgICAgQXJyYXlzLnRvU3RyaW5nKGFyZ3MpKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2hvc3Qtc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0NwdUZlYXR1cmVzLmphdmEgYi9jb21tb24vaG9zdC1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQ3B1RmVhdHVyZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY3ZmFlMi4uMDAwMDAwMAotLS0gYS9jb21tb24vaG9zdC1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQ3B1RmVhdHVyZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5Db2xsZWN0aW5nT3V0cHV0UmVjZWl2ZXI7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5JVGVzdERldmljZTsKLQotLyoqCi0gKiBIb3N0LXNpZGUgdXRpbGl0eSBjbGFzcyBmb3IgcmVhZGluZyBwcm9wZXJ0aWVzIGFuZCBnYXRoZXJpbmcgaW5mb3JtYXRpb24gZm9yIHRlc3RpbmcKLSAqIEFuZHJvaWQgZGV2aWNlIGNvbXBhdGliaWxpdHkuCi0gKi8KLXB1YmxpYyBjbGFzcyBDcHVGZWF0dXJlcyB7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdHJ1ZSBpZiBhcmNoaXRlY3R1cmUgaXMgYXJtNjQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQXJtNjQoSVRlc3REZXZpY2UgZGV2aWNlKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLQotICAgICAgICBDb2xsZWN0aW5nT3V0cHV0UmVjZWl2ZXIgT3V0ID0gbmV3IENvbGxlY3RpbmdPdXRwdXRSZWNlaXZlcigpOwotICAgICAgICBkZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZCgidW5hbWUgLW0iLCBPdXQpOwotICAgICAgICBTdHJpbmcgYXJjaCA9IE91dC5nZXRPdXRwdXQoKS50cmltKCk7Ci0gICAgICAgIHJldHVybiBhcmNoLmNvbnRhaW5zKCJhYXJjaDY0Iik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2hvc3Qtc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0RldmljZUluZm8uamF2YSBiL2NvbW1vbi9ob3N0LXNpZGUvdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9EZXZpY2VJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMzAzZTUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2hvc3Qtc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0RldmljZUluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuSG9zdEluZm9TdG9yZTsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuSVRlc3REZXZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQubG9nLkxvZ1V0aWwuQ0xvZzsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5yZXN1bHQuRmlsZUlucHV0U3RyZWFtU291cmNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnJlc3VsdC5Mb2dEYXRhVHlwZTsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5EZXZpY2VKVW5pdDRDbGFzc1J1bm5lcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5EZXZpY2VKVW5pdDRDbGFzc1J1bm5lci5UZXN0TG9nRGF0YTsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JRGV2aWNlVGVzdDsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC51dGlsLkZpbGVVdGlsOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnV0aWwuU3RyZWFtVXRpbDsKLQotaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiBDb2xsZWN0IGRldmljZSBpbmZvcm1hdGlvbiBmcm9tIGhvc3QgYW5kIHdyaXRlIHRvIGEgSlNPTiBmaWxlLgotICovCi1AUnVuV2l0aChEZXZpY2VKVW5pdDRDbGFzc1J1bm5lci5jbGFzcykKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEZXZpY2VJbmZvIGltcGxlbWVudHMgSURldmljZVRlc3QgewotCi0gICAgLy8gRGVmYXVsdCBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgZm9yIHN0b3JpbmcgZGV2aWNlIGluZm8gZmlsZXMgd2l0aGluIHRoZSByZXN1bHQgZGlyZWN0b3J5Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVUxUX0RJUl9OQU1FID0gImRldmljZS1pbmZvLWZpbGVzIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfU1VGRklYID0gIi5kZXZpY2VpbmZvLmpzb24iOwotCi0gICAgLyoqIEEgcmVmZXJlbmNlIHRvIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC4gKi8KLSAgICBwcm90ZWN0ZWQgSVRlc3REZXZpY2UgbURldmljZTsKLQotICAgIHByaXZhdGUgSG9zdEluZm9TdG9yZSBtU3RvcmU7Ci0KLSAgICBAUnVsZQotICAgIHB1YmxpYyBUZXN0TG9nRGF0YSBtTG9nZ2VyID0gbmV3IFRlc3RMb2dEYXRhKCk7Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElUZXN0RGV2aWNlIGdldERldmljZSgpIHsKLSAgICAgICAgcmV0dXJuIG1EZXZpY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldERldmljZShJVGVzdERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgbURldmljZSA9IGRldmljZTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0RGV2aWNlSW5mbygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgZGV2aWNlSW5mb05hbWUgPSBnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSArIEZJTEVfU1VGRklYOwotICAgICAgICBGaWxlIGpzb25GaWxlID0gbnVsbDsKLSAgICAgICAgRmlsZUlucHV0U3RyZWFtU291cmNlIHNvdXJjZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBqc29uRmlsZSA9IEZpbGVVdGlsLmNyZWF0ZVRlbXBGaWxlKGdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpLCBGSUxFX1NVRkZJWCk7Ci0gICAgICAgICAgICBtU3RvcmUgPSBuZXcgSG9zdEluZm9TdG9yZShqc29uRmlsZSk7Ci0gICAgICAgICAgICBtU3RvcmUub3BlbigpOwotICAgICAgICAgICAgY29sbGVjdERldmljZUluZm8obVN0b3JlKTsKLSAgICAgICAgICAgIG1TdG9yZS5jbG9zZSgpOwotICAgICAgICAgICAgc291cmNlID0gbmV3IEZpbGVJbnB1dFN0cmVhbVNvdXJjZShqc29uRmlsZSk7Ci0gICAgICAgICAgICBtTG9nZ2VyLmFkZFRlc3RMb2coZGV2aWNlSW5mb05hbWUsIExvZ0RhdGFUeXBlLlRFWFQsIHNvdXJjZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBDTG9nLmUoZSk7Ci0gICAgICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoIkZhaWxlZCB0byBjb2xsZWN0IGRldmljZSBpbmZvICglcyk6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgZGV2aWNlSW5mb05hbWUsIGUuZ2V0TWVzc2FnZSgpKSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBGaWxlVXRpbC5kZWxldGVGaWxlKGpzb25GaWxlKTsKLSAgICAgICAgICAgIFN0cmVhbVV0aWwuY2xvc2Uoc291cmNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCB0byBjb2xsZWN0IGRldmljZSBpbmZvcm1hdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBjb2xsZWN0RGV2aWNlSW5mbyhIb3N0SW5mb1N0b3JlIHN0b3JlKSB0aHJvd3MgRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2hvc3Qtc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0R5bmFtaWNDb25maWdIYW5kbGVyLmphdmEgYi9jb21tb24vaG9zdC1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvRHluYW1pY0NvbmZpZ0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg4NDBmZC4uMDAwMDAwMAotLS0gYS9jb21tb24vaG9zdC1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvRHluYW1pY0NvbmZpZ0hhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsOwotCi1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudXRpbC5GaWxlVXRpbDsKLQotaW1wb3J0IG9yZy5qc29uLkpTT05BcnJheTsKLWltcG9ydCBvcmcuanNvbi5KU09ORXhjZXB0aW9uOwotaW1wb3J0IG9yZy5qc29uLkpTT05PYmplY3Q7Ci1pbXBvcnQgb3JnLmpzb24uSlNPTlRva2VuZXI7Ci1pbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRmFjdG9yeTsKLWltcG9ydCBvcmcueG1scHVsbC52MS5YbWxTZXJpYWxpemVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotcHVibGljIGNsYXNzIER5bmFtaWNDb25maWdIYW5kbGVyIHsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBGSUxFX0VYVCA9ICIuZHluYW1pYyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5TID0gbnVsbDsgLy94bWwgY29uc3RhbnQgcmVwcmVzZW50aW5nIG51bGwgbmFtZXNwYWNlCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQ09ESU5HID0gIlVURi04IjsKLQotICAgIHB1YmxpYyBzdGF0aWMgRmlsZSBnZXRNZXJnZWREeW5hbWljQ29uZmlnRmlsZShGaWxlIGxvY2FsQ29uZmlnRmlsZSwgU3RyaW5nIGFwYnNDb25maWdKc29uLAotICAgICAgICAgICAgU3RyaW5nIG1vZHVsZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiwgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgSlNPTkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBsb2NhbENvbmZpZyA9IER5bmFtaWNDb25maWcuY3JlYXRlQ29uZmlnTWFwKGxvY2FsQ29uZmlnRmlsZSk7Ci0gICAgICAgIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gYXBic0NvbmZpZyA9IHBhcnNlSnNvblRvQ29uZmlnTWFwKGFwYnNDb25maWdKc29uKTsKLSAgICAgICAgbG9jYWxDb25maWcucHV0QWxsKGFwYnNDb25maWcpOwotICAgICAgICByZXR1cm4gc3RvcmVNZXJnZWRDb25maWdGaWxlKGxvY2FsQ29uZmlnLCBtb2R1bGVOYW1lKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IHBhcnNlSnNvblRvQ29uZmlnTWFwKFN0cmluZyBhcGJzQ29uZmlnSnNvbikKLSAgICAgICAgICAgIHRocm93cyBKU09ORXhjZXB0aW9uIHsKLQotICAgICAgICBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGNvbmZpZ01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PigpOwotICAgICAgICBpZiAoYXBic0NvbmZpZ0pzb24gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGNvbmZpZ01hcDsKLSAgICAgICAgfQotCi0gICAgICAgIEpTT05PYmplY3Qgcm9vdE9iaiAgPSBuZXcgSlNPTk9iamVjdChuZXcgSlNPTlRva2VuZXIoYXBic0NvbmZpZ0pzb24pKTsKLSAgICAgICAgSlNPTk9iamVjdCBjb25maWdPYmplY3QgPSByb290T2JqLmdldEpTT05PYmplY3QoImR5bmFtaWNDb25maWdFbnRyaWVzIik7Ci0gICAgICAgIEpTT05BcnJheSBrZXlzID0gY29uZmlnT2JqZWN0Lm5hbWVzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcga2V5ID0ga2V5cy5nZXRTdHJpbmcoaSk7Ci0gICAgICAgICAgICBKU09OQXJyYXkganNvblZhbHVlcyA9IGNvbmZpZ09iamVjdC5nZXRKU09OT2JqZWN0KGtleSkuZ2V0SlNPTkFycmF5KCJjb25maWdWYWx1ZXMiKTsKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwganNvblZhbHVlcy5sZW5ndGgoKTsgaiArKykgewotICAgICAgICAgICAgICAgIHZhbHVlcy5hZGQoanNvblZhbHVlcy5nZXRTdHJpbmcoaikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29uZmlnTWFwLnB1dChrZXksIHZhbHVlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbmZpZ01hcDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBGaWxlIHN0b3JlTWVyZ2VkQ29uZmlnRmlsZShNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGNvbmZpZ01hcCwKLSAgICAgICAgICAgIFN0cmluZyBtb2R1bGVOYW1lKSB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCi0gICAgICAgIEZpbGUgbWVyZ2VkQ29uZmlnRmlsZSA9IEZpbGVVdGlsLmNyZWF0ZVRlbXBGaWxlKG1vZHVsZU5hbWUsIEZJTEVfRVhUKTsKLSAgICAgICAgT3V0cHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG1lcmdlZENvbmZpZ0ZpbGUpOwotICAgICAgICBYbWxTZXJpYWxpemVyIHNlcmlhbGl6ZXIgPSBYbWxQdWxsUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1NlcmlhbGl6ZXIoKTsKLSAgICAgICAgc2VyaWFsaXplci5zZXRPdXRwdXQoc3RyZWFtLCBFTkNPRElORyk7Ci0gICAgICAgIHNlcmlhbGl6ZXIuc2V0RmVhdHVyZSgiaHR0cDovL3htbHB1bGwub3JnL3YxL2RvYy9mZWF0dXJlcy5odG1sI2luZGVudC1vdXRwdXQiLCB0cnVlKTsKLSAgICAgICAgc2VyaWFsaXplci5zdGFydERvY3VtZW50KEVOQ09ESU5HLCBmYWxzZSk7Ci0KLSAgICAgICAgc2VyaWFsaXplci5zdGFydFRhZyhOUywgRHluYW1pY0NvbmZpZy5DT05GSUdfVEFHKTsKLSAgICAgICAgZm9yIChTdHJpbmcga2V5IDogY29uZmlnTWFwLmtleVNldCgpKSB7Ci0gICAgICAgICAgICBzZXJpYWxpemVyLnN0YXJ0VGFnKE5TLCBEeW5hbWljQ29uZmlnLkVOVFJZX1RBRyk7Ci0gICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZShOUywgRHluYW1pY0NvbmZpZy5LRVlfQVRUUiwga2V5KTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIHZhbHVlIDogY29uZmlnTWFwLmdldChrZXkpKSB7Ci0gICAgICAgICAgICAgICAgc2VyaWFsaXplci5zdGFydFRhZyhOUywgRHluYW1pY0NvbmZpZy5WQUxVRV9UQUcpOwotICAgICAgICAgICAgICAgIHNlcmlhbGl6ZXIudGV4dCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgc2VyaWFsaXplci5lbmRUYWcoTlMsIER5bmFtaWNDb25maWcuVkFMVUVfVEFHKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlcmlhbGl6ZXIuZW5kVGFnKE5TLCBEeW5hbWljQ29uZmlnLkVOVFJZX1RBRyk7Ci0gICAgICAgIH0KLSAgICAgICAgc2VyaWFsaXplci5lbmRUYWcoTlMsIER5bmFtaWNDb25maWcuQ09ORklHX1RBRyk7Ci0gICAgICAgIHNlcmlhbGl6ZXIuZW5kRG9jdW1lbnQoKTsKLSAgICAgICAgcmV0dXJuIG1lcmdlZENvbmZpZ0ZpbGU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2hvc3Qtc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0R5bmFtaWNDb25maWdIb3N0U2lkZS5qYXZhIGIvY29tbW9uL2hvc3Qtc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0R5bmFtaWNDb25maWdIb3N0U2lkZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWU3YmZiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9ob3N0LXNpZGUvdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9EeW5hbWljQ29uZmlnSG9zdFNpZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWw7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5idWlsZC5JQnVpbGRJbmZvOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmJ1aWxkLlZlcnNpb25lZEZpbGU7Ci0KLWltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBVdGlsaXR5IHRvIGdldCB2YWx1ZSBmcm9tIGEgZHluYW1pYyBjb25maWcgZmlsZS4KLSAqIEBkZXByZWNhdGVkIHVzZSBEeW5hbWljQ29uZmlnRmlsZVJlYWRlciBpbnN0ZWFkLgotICovCi1ARGVwcmVjYXRlZAotcHVibGljIGNsYXNzIER5bmFtaWNDb25maWdIb3N0U2lkZSB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfUEFUSF9QUkVGSVggPSAiRFlOQU1JQ19DT05GSUdfRklMRToiOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgYSBrZXkgZnJvbSBhIGRvd25sb2FkZWQgZmlsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWxlIFRoZSBmaWxlIGRvd25sb2FkZWQsIGNhbiBiZSByZXRyaWV2ZSB2aWEKLSAgICAgKiAgICAgICAge0BsaW5rICNnZXREeW5hbWljQ29uZmlnRmlsZShJQnVpbGRJbmZvLCBTdHJpbmcpfQotICAgICAqIEBwYXJhbSBrZXkgdGhlIGtleSBpbnNpZGUgdGhlIGZpbGUgd2hpY2ggdmFsdWUgd2Ugd2FudCB0byByZXR1cm4KLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHRvIHRoZSBrZXkgaW4gdGhlIGNvbmZpZyBmaWxlIHByb3ZpZGVkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFZhbHVlRnJvbUNvbmZpZyhGaWxlIGZpbGUsIFN0cmluZyBrZXkpCi0gICAgICAgICAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGNvbmZpZ01hcCA9IER5bmFtaWNDb25maWcuY3JlYXRlQ29uZmlnTWFwKGZpbGUpOwotICAgICAgICBMaXN0PFN0cmluZz4gc2luZ2xlVmFsdWUgPSBjb25maWdNYXAuZ2V0KGtleSk7Ci0gICAgICAgIGlmIChzaW5nbGVWYWx1ZSA9PSBudWxsIHx8IHNpbmdsZVZhbHVlLnNpemUoKSA9PSAwIHx8IHNpbmdsZVZhbHVlLnNpemUoKSA+IDEpIHsKLSAgICAgICAgICAgIC8vIGtleSBtdXN0IGV4aXN0IGluIHRoZSBtYXAsIGFuZCBtYXAgdG8gYSBsaXN0IGNvbnRhaW5pbmcgZXhhY3RseSBvbmUgc3RyaW5nCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2luZ2xlVmFsdWUuZ2V0KDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBkeW5hbWljIGNvbmZpZyBmaWxlIGRvd25sb2FkZWQgaW4ge0BsaW5rIER5bmFtaWNDb25maWdQdXNoZXJ9IHRoZSBwYXRoIGlzIHN0b3JlZAotICAgICAqIGluIHRoZSBidWlsZCBpbmZvIHVuZGVyIGEgbW9kdWxlIG5hbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5mbyB0aGUgaW52b2NhdGlvbiB7QGxpbmsgSUJ1aWxkSW5mb30KLSAgICAgKiBAcGFyYW0gbW9kdWxlTmFtZSB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlIG9mIHRoZSBmaWxlLgotICAgICAqIEByZXR1cm4gYSB7QGxpbmsgRmlsZX0gY3JlYXRlZCBmcm9tIHRoZSBkb3dubG9hZGVkIGZpbGUuCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIENvbXBhdGliaWxpdHlCdWlsZEhlbHBlciNnZXREeW5hbWljQ29uZmlnRmlsZXMKLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIHB1YmxpYyBzdGF0aWMgRmlsZSBnZXREeW5hbWljQ29uZmlnRmlsZShJQnVpbGRJbmZvIGluZm8sIFN0cmluZyBtb2R1bGVOYW1lKSB7Ci0gICAgICAgIGZvciAoVmVyc2lvbmVkRmlsZSB2RmlsZSA6IGluZm8uZ2V0RmlsZXMoKSkgewotICAgICAgICAgICAgaWYgKHZGaWxlLmdldFZlcnNpb24oKS5lcXVhbHMoQ09ORklHX1BBVEhfUFJFRklYICsgbW9kdWxlTmFtZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdkZpbGUuZ2V0RmlsZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9ob3N0LXNpZGUvdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9GZWF0dXJlVXRpbC5qYXZhIGIvY29tbW9uL2hvc3Qtc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0ZlYXR1cmVVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ZDI1N2EuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2hvc3Qtc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0ZlYXR1cmVVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5EZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLklUZXN0RGV2aWNlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBIb3N0LXNpZGUgdXRpbGl0eSBjbGFzcyBmb3IgZGV0ZWN0aW5nIHN5c3RlbSBmZWF0dXJlcwotICovCi1wdWJsaWMgY2xhc3MgRmVhdHVyZVV0aWwgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVBTkJBQ0tfRkVBVFVSRSA9ICJhbmRyb2lkLnNvZnR3YXJlLmxlYW5iYWNrIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT1dfUkFNX0ZFQVRVUkUgPSAiYW5kcm9pZC5oYXJkd2FyZS5yYW0ubG93IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURUxFUEhPTllfRkVBVFVSRSA9ICJhbmRyb2lkLmhhcmR3YXJlLnRlbGVwaG9ueSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFZfRkVBVFVSRSA9ICJhbmRyb2lkLmhhcmR3YXJlLnR5cGUudGVsZXZpc2lvbiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FUQ0hfRkVBVFVSRSA9ICJhbmRyb2lkLmhhcmR3YXJlLnR5cGUud2F0Y2giOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVfTUlDUk9QSE9ORSA9ICJhbmRyb2lkLmhhcmR3YXJlLm1pY3JvcGhvbmUiOwotCi0gICAgLyoqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGV2aWNlIGhhcyBhIGdpdmVuIHN5c3RlbSBmZWF0dXJlICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGhhc1N5c3RlbUZlYXR1cmUoSVRlc3REZXZpY2UgZGV2aWNlLCBTdHJpbmcgZmVhdHVyZSkKLSAgICAgICAgICAgIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZGV2aWNlLmhhc0ZlYXR1cmUoZmVhdHVyZSk7Ci0gICAgfQotCi0gICAgLyoqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGV2aWNlIGhhcyBhbnkgZmVhdHVyZSBpbiBhIGdpdmVuIGNvbGxlY3Rpb24gb2Ygc3lzdGVtIGZlYXR1cmVzICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGhhc0FueVN5c3RlbUZlYXR1cmUoSVRlc3REZXZpY2UgZGV2aWNlLCBTdHJpbmcuLi4gZmVhdHVyZXMpCi0gICAgICAgICAgICB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgZm9yIChTdHJpbmcgZmVhdHVyZSA6IGZlYXR1cmVzKSB7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlLmhhc0ZlYXR1cmUoZmVhdHVyZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGV2aWNlIGhhcyBhbGwgZmVhdHVyZXMgaW4gYSBnaXZlbiBjb2xsZWN0aW9uIG9mIHN5c3RlbSBmZWF0dXJlcyAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNBbGxTeXN0ZW1GZWF0dXJlcyhJVGVzdERldmljZSBkZXZpY2UsIFN0cmluZy4uLiBmZWF0dXJlcykKLSAgICAgICAgICAgIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBmb3IgKFN0cmluZyBmZWF0dXJlIDogZmVhdHVyZXMpIHsKLSAgICAgICAgICAgIGlmICghZGV2aWNlLmhhc0ZlYXR1cmUoZmVhdHVyZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqIFJldHVybnMgYWxsIHN5c3RlbSBmZWF0dXJlcyBvZiB0aGUgZGV2aWNlICovCi0gICAgcHVibGljIHN0YXRpYyBTZXQ8U3RyaW5nPiBnZXRBbGxGZWF0dXJlcyhJVGVzdERldmljZSBkZXZpY2UpCi0gICAgICAgICAgICB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgU2V0PFN0cmluZz4gYWxsRmVhdHVyZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgICAgIFN0cmluZyBvdXRwdXQgPSBkZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZCgicG0gbGlzdCBmZWF0dXJlcyIpOwotICAgICAgICBmb3IgKFN0cmluZyBmZWF0dXJlIDogb3V0cHV0LnNwbGl0KCJbXFxyP1xcbl0rIikpIHsKLSAgICAgICAgICAgIGFsbEZlYXR1cmVzLmFkZChmZWF0dXJlLnN1YnN0cmluZygiZmVhdHVyZToiLmxlbmd0aCgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFsbEZlYXR1cmVzOwotICAgIH0KLQotICAgIC8qKiBSZXR1cm5zIHRydWUgaWYgdGhlIGRldmljZSBoYXMgZmVhdHVyZSBUVl9GRUFUVVJFIG9yIGZlYXR1cmUgTEVBTkJBQ0tfRkVBVFVSRSAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RWKElUZXN0RGV2aWNlIGRldmljZSkgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBoYXNBbnlTeXN0ZW1GZWF0dXJlKGRldmljZSwgVFZfRkVBVFVSRSwgTEVBTkJBQ0tfRkVBVFVSRSk7Ci0gICAgfQotCi0gICAgLyoqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGV2aWNlIGhhcyBmZWF0dXJlIFdBVENIX0ZFQVRVUkUgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNXYXRjaChJVGVzdERldmljZSBkZXZpY2UpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gaGFzU3lzdGVtRmVhdHVyZShkZXZpY2UsIFdBVENIX0ZFQVRVUkUpOwotICAgIH0KLQotICAgIC8qKiBSZXR1cm5zIHRydWUgaWYgdGhlIGRldmljZSBpcyBhIGxvdyByYW0gZGV2aWNlOgotICAgICAqICAxLiBBUEkgbGV2ZWwgJmd0Oz0gTwotICAgICAqICAyLiBkZXZpY2UgaGFzIGZlYXR1cmUgTE9XX1JBTV9GRUFUVVJFCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTG93UmFtKElUZXN0RGV2aWNlIGRldmljZSkgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBBcGlMZXZlbFV0aWwuaXNBdExlYXN0KGRldmljZSwgVmVyc2lvbkNvZGVzLk8pICYmCi0gICAgICAgICAgICAgICAgaGFzU3lzdGVtRmVhdHVyZShkZXZpY2UsIExPV19SQU1fRkVBVFVSRSk7Ci0gICAgfQotCi0gICAgLyoqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGV2aWNlIGhhcyBmZWF0dXJlIFRFTEVQSE9OWV9GRUFUVVJFICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGhhc1RlbGVwaG9ueShJVGVzdERldmljZSBkZXZpY2UpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gaGFzU3lzdGVtRmVhdHVyZShkZXZpY2UsIFRFTEVQSE9OWV9GRUFUVVJFKTsKLSAgICB9Ci0KLSAgICAvKiogUmV0dXJucyB0cnVlIGlmIHRoZSBkZXZpY2UgaGFzIGZlYXR1cmUgRkVBVFVSRV9NSUNST1BIT05FICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGhhc01pY3JvcGhvbmUoSVRlc3REZXZpY2UgZGV2aWNlKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGhhc1N5c3RlbUZlYXR1cmUoZGV2aWNlLCBGRUFUVVJFX01JQ1JPUEhPTkUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9ob3N0LXNpZGUvdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9Ib3N0SW5mb1N0b3JlLmphdmEgYi9jb21tb24vaG9zdC1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvSG9zdEluZm9TdG9yZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmExNDlmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9ob3N0LXNpZGUvdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9Ib3N0SW5mb1N0b3JlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWw7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5qc29uLnN0cmVhbS5Kc29uV3JpdGVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIEhvc3RJbmZvU3RvcmUgZXh0ZW5kcyBJbmZvU3RvcmUgewotCi0gICAgcHJvdGVjdGVkIEZpbGUgbUpzb25GaWxlOwotICAgIHByb3RlY3RlZCBKc29uV3JpdGVyIG1Kc29uV3JpdGVyID0gbnVsbDsKLQotICAgIHB1YmxpYyBIb3N0SW5mb1N0b3JlKCkgewotICAgICAgICBtSnNvbkZpbGUgPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBIb3N0SW5mb1N0b3JlKEZpbGUgZmlsZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1Kc29uRmlsZSA9IGZpbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3BlbnMgdGhlIGZpbGUgZm9yIHN0b3JhZ2UgYW5kIGNyZWF0ZXMgdGhlIHdyaXRlci4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvcGVuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShtSnNvbkZpbGUpOwotICAgICAgICBtSnNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0LCBTdGFuZGFyZENoYXJzZXRzLlVURl84KSk7Ci0gICAgICAgIC8vIFRPRE8oYWdhdGhhbWFuKTogcmVtb3ZlIHRvIG1ha2UganNvbiBvdXRwdXQgbGVzcyBwcmV0dHkKLSAgICAgICAgbUpzb25Xcml0ZXIuc2V0SW5kZW50KCIgICIpOwotICAgICAgICBtSnNvbldyaXRlci5iZWdpbk9iamVjdCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsb3NlcyB0aGUgd3JpdGVyLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgbUpzb25Xcml0ZXIuZW5kT2JqZWN0KCk7Ci0JbUpzb25Xcml0ZXIuZmx1c2goKTsKLSAgICAgICAgbUpzb25Xcml0ZXIuY2xvc2UoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydCBhIG5ldyBncm91cCBvZiByZXN1bHQuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3RhcnRHcm91cCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIG1Kc29uV3JpdGVyLmJlZ2luT2JqZWN0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnQgYSBuZXcgZ3JvdXAgb2YgcmVzdWx0IHdpdGggc3BlY2lmaWVkIG5hbWUuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3RhcnRHcm91cChTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgbUpzb25Xcml0ZXIubmFtZShuYW1lKTsKLSAgICAgICAgbUpzb25Xcml0ZXIuYmVnaW5PYmplY3QoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21wbGV0ZSBhZGRpbmcgcmVzdWx0IHRvIHRoZSBsYXN0IHN0YXJ0ZWQgZ3JvdXAuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZW5kR3JvdXAoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBtSnNvbldyaXRlci5lbmRPYmplY3QoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydCBhIG5ldyBhcnJheSBvZiByZXN1bHQuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3RhcnRBcnJheSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIG1Kc29uV3JpdGVyLmJlZ2luQXJyYXkoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydCBhIG5ldyBhcnJheSBvZiByZXN1bHQgd2l0aCBzcGVjaWZpZWQgbmFtZS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdGFydEFycmF5KFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBjaGVja05hbWUobmFtZSk7Ci0gICAgICAgIG1Kc29uV3JpdGVyLm5hbWUobmFtZSk7Ci0gICAgICAgIG1Kc29uV3JpdGVyLmJlZ2luQXJyYXkoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21wbGV0ZSBhZGRpbmcgcmVzdWx0IHRvIHRoZSBsYXN0IHN0YXJ0ZWQgYXJyYXkuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZW5kQXJyYXkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBtSnNvbldyaXRlci5lbmRBcnJheSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBpbnQgdmFsdWUgdG8gdGhlIEluZm9TdG9yZQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkZFJlc3VsdChTdHJpbmcgbmFtZSwgaW50IHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBjaGVja05hbWUobmFtZSk7Ci0gICAgICAgIG1Kc29uV3JpdGVyLm5hbWUobmFtZSk7Ci0gICAgICAgIG1Kc29uV3JpdGVyLnZhbHVlKHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgbG9uZyB2YWx1ZSB0byB0aGUgSW5mb1N0b3JlCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkUmVzdWx0KFN0cmluZyBuYW1lLCBsb25nIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBjaGVja05hbWUobmFtZSk7Ci0gICAgICAgIG1Kc29uV3JpdGVyLm5hbWUobmFtZSk7Ci0gICAgICAgIG1Kc29uV3JpdGVyLnZhbHVlKHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgZmxvYXQgdmFsdWUgdG8gdGhlIEluZm9TdG9yZQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkZFJlc3VsdChTdHJpbmcgbmFtZSwgZmxvYXQgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGNoZWNrTmFtZShuYW1lKTsKLSAgICAgICAgbUpzb25Xcml0ZXIubmFtZShuYW1lKTsKLSAgICAgICAgbUpzb25Xcml0ZXIudmFsdWUodmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBkb3VibGUgdmFsdWUgdG8gdGhlIEluZm9TdG9yZQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkZFJlc3VsdChTdHJpbmcgbmFtZSwgZG91YmxlIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBjaGVja05hbWUobmFtZSk7Ci0gICAgICAgIG1Kc29uV3JpdGVyLm5hbWUobmFtZSk7Ci0gICAgICAgIG1Kc29uV3JpdGVyLnZhbHVlKHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgYm9vbGVhbiB2YWx1ZSB0byB0aGUgSW5mb1N0b3JlCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkUmVzdWx0KFN0cmluZyBuYW1lLCBib29sZWFuIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBjaGVja05hbWUobmFtZSk7Ci0gICAgICAgIG1Kc29uV3JpdGVyLm5hbWUobmFtZSk7Ci0gICAgICAgIG1Kc29uV3JpdGVyLnZhbHVlKHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgU3RyaW5nIHZhbHVlIHRvIHRoZSBJbmZvU3RvcmUKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGRSZXN1bHQoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgY2hlY2tOYW1lKG5hbWUpOwotICAgICAgICBtSnNvbldyaXRlci5uYW1lKG5hbWUpOwotICAgICAgICBtSnNvbldyaXRlci52YWx1ZShjaGVja1N0cmluZyh2YWx1ZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBpbnQgYXJyYXkgdG8gdGhlIEluZm9TdG9yZQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkZEFycmF5UmVzdWx0KFN0cmluZyBuYW1lLCBpbnRbXSBhcnJheSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgY2hlY2tOYW1lKG5hbWUpOwotICAgICAgICBtSnNvbldyaXRlci5uYW1lKG5hbWUpOwotICAgICAgICBtSnNvbldyaXRlci5iZWdpbkFycmF5KCk7Ci0gICAgICAgIGZvciAoaW50IHZhbHVlIDogY2hlY2tBcnJheShhcnJheSkpIHsKLSAgICAgICAgICAgIG1Kc29uV3JpdGVyLnZhbHVlKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBtSnNvbldyaXRlci5lbmRBcnJheSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBsb25nIGFycmF5IHRvIHRoZSBJbmZvU3RvcmUKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGRBcnJheVJlc3VsdChTdHJpbmcgbmFtZSwgbG9uZ1tdIGFycmF5KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBjaGVja05hbWUobmFtZSk7Ci0gICAgICAgIG1Kc29uV3JpdGVyLm5hbWUobmFtZSk7Ci0gICAgICAgIG1Kc29uV3JpdGVyLmJlZ2luQXJyYXkoKTsKLSAgICAgICAgZm9yIChsb25nIHZhbHVlIDogY2hlY2tBcnJheShhcnJheSkpIHsKLSAgICAgICAgICAgIG1Kc29uV3JpdGVyLnZhbHVlKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBtSnNvbldyaXRlci5lbmRBcnJheSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBmbG9hdCBhcnJheSB0byB0aGUgSW5mb1N0b3JlCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkQXJyYXlSZXN1bHQoU3RyaW5nIG5hbWUsIGZsb2F0W10gYXJyYXkpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGNoZWNrTmFtZShuYW1lKTsKLSAgICAgICAgbUpzb25Xcml0ZXIubmFtZShuYW1lKTsKLSAgICAgICAgbUpzb25Xcml0ZXIuYmVnaW5BcnJheSgpOwotICAgICAgICBmb3IgKGZsb2F0IHZhbHVlIDogY2hlY2tBcnJheShhcnJheSkpIHsKLSAgICAgICAgICAgIG1Kc29uV3JpdGVyLnZhbHVlKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBtSnNvbldyaXRlci5lbmRBcnJheSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBkb3VibGUgYXJyYXkgdG8gdGhlIEluZm9TdG9yZQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkZEFycmF5UmVzdWx0KFN0cmluZyBuYW1lLCBkb3VibGVbXSBhcnJheSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgY2hlY2tOYW1lKG5hbWUpOwotICAgICAgICBtSnNvbldyaXRlci5uYW1lKG5hbWUpOwotICAgICAgICBtSnNvbldyaXRlci5iZWdpbkFycmF5KCk7Ci0gICAgICAgIGZvciAoZG91YmxlIHZhbHVlIDogY2hlY2tBcnJheShhcnJheSkpIHsKLSAgICAgICAgICAgIG1Kc29uV3JpdGVyLnZhbHVlKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBtSnNvbldyaXRlci5lbmRBcnJheSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBib29sZWFuIGFycmF5IHRvIHRoZSBJbmZvU3RvcmUKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGRBcnJheVJlc3VsdChTdHJpbmcgbmFtZSwgYm9vbGVhbltdIGFycmF5KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBjaGVja05hbWUobmFtZSk7Ci0gICAgICAgIG1Kc29uV3JpdGVyLm5hbWUobmFtZSk7Ci0gICAgICAgIG1Kc29uV3JpdGVyLmJlZ2luQXJyYXkoKTsKLSAgICAgICAgZm9yIChib29sZWFuIHZhbHVlIDogY2hlY2tBcnJheShhcnJheSkpIHsKLSAgICAgICAgICAgIG1Kc29uV3JpdGVyLnZhbHVlKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBtSnNvbldyaXRlci5lbmRBcnJheSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBMaXN0IG9mIFN0cmluZyB0byB0aGUgSW5mb1N0b3JlCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkTGlzdFJlc3VsdChTdHJpbmcgbmFtZSwgTGlzdDxTdHJpbmc+IGxpc3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGNoZWNrTmFtZShuYW1lKTsKLSAgICAgICAgbUpzb25Xcml0ZXIubmFtZShuYW1lKTsKLSAgICAgICAgbUpzb25Xcml0ZXIuYmVnaW5BcnJheSgpOwotICAgICAgICBmb3IgKFN0cmluZyB2YWx1ZSA6IGNoZWNrU3RyaW5nTGlzdChsaXN0KSkgewotICAgICAgICAgICAgbUpzb25Xcml0ZXIudmFsdWUoY2hlY2tTdHJpbmcodmFsdWUpKTsKLSAgICAgICAgfQotICAgICAgICBtSnNvbldyaXRlci5lbmRBcnJheSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9ob3N0LXNpZGUvdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9NZXRyaWNzUmVwb3J0TG9nLmphdmEgYi9jb21tb24vaG9zdC1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvTWV0cmljc1JlcG9ydExvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDU5NzJkLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9ob3N0LXNpZGUvdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9NZXRyaWNzUmVwb3J0TG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsOwotCi1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuYnVpbGQuSUJ1aWxkSW5mbzsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC51dGlsLkZpbGVVdGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEEge0BsaW5rIFJlcG9ydExvZ30gdGhhdCBjYW4gYmUgdXNlZCB3aXRoIHRoZSBpbiBtZW1vcnkgbWV0cmljcyBzdG9yZSB1c2VkIGZvciBob3N0IHNpZGUgbWV0cmljcy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1ldHJpY3NSZXBvcnRMb2cgZXh0ZW5kcyBSZXBvcnRMb2cgewotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1BYmk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUNsYXNzTWV0aG9kTmFtZTsKLSAgICBwcml2YXRlIGZpbmFsIElCdWlsZEluZm8gbUJ1aWxkSW5mbzsKLQotICAgIC8vIFRlbXBvcmFyeSBmb2xkZXIgbXVzdCBtYXRjaCB0aGUgdGVtcC1kaXIgdmFsdWUgY29uZmlndXJlZCBpbiBSZXBvcnRMb2dDb2xsZWN0b3IgdGFyZ2V0Ci0gICAgLy8gcHJlcGFyZXIgaW4gY3RzL3Rvb2xzL2N0cy10cmFkZWZlZC9yZXMvY29uZmlnL2N0cy1vcmVjb25kaXRpb25zLnhtbAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURU1QT1JBUllfUkVQT1JUX0ZPTERFUiA9ICJ0ZW1wLXJlcG9ydC1sb2dzIjsKLSAgICBwcml2YXRlIFJlcG9ydExvZ0hvc3RJbmZvU3RvcmUgc3RvcmU7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gYnVpbGRJbmZvIHRoZSB0ZXN0IGJ1aWxkIGluZm8uCi0gICAgICogQHBhcmFtIGFiaSBhYmkgdGhlIHRlc3Qgd2FzIHJ1biBvbi4KLSAgICAgKiBAcGFyYW0gY2xhc3NNZXRob2ROYW1lIGNsYXNzIG5hbWUgYW5kIG1ldGhvZCBuYW1lIG9mIHRoZSB0ZXN0IGluIGNsYXNzI21ldGhvZCBmb3JtYXQuCi0gICAgICogICAgICAgIE5vdGUgdGhhdCBSZXBvcnRMb2cuZ2V0Q2xhc3NNZXRob2ROYW1lcygpIHByb3ZpZGUgdGhpcy4KLSAgICAgKiBAcGFyYW0gcmVwb3J0TG9nTmFtZSB0aGUgbmFtZSBvZiB0aGUgcmVwb3J0IGxvZyBmaWxlLiBNZXRyaWNzIHdpbGwgYmUgd3JpdHRlbiBvdXQgdG8gdGhpcy4KLSAgICAgKiBAcGFyYW0gc3RyZWFtTmFtZSB0aGUga2V5IGZvciB0aGUgSlNPTiBvYmplY3Qgb2YgdGhlIHNldCBvZiBtZXRyaWNzIHRvIGJlIGxvZ2dlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWV0cmljc1JlcG9ydExvZyhJQnVpbGRJbmZvIGJ1aWxkSW5mbywgU3RyaW5nIGFiaSwgU3RyaW5nIGNsYXNzTWV0aG9kTmFtZSwKLSAgICAgICAgICAgIFN0cmluZyByZXBvcnRMb2dOYW1lLCBTdHJpbmcgc3RyZWFtTmFtZSkgewotICAgICAgICB0aGlzKGJ1aWxkSW5mbywgYWJpLCBjbGFzc01ldGhvZE5hbWUsIHJlcG9ydExvZ05hbWUsIHN0cmVhbU5hbWUsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gYnVpbGRJbmZvIHRoZSB0ZXN0IGJ1aWxkIGluZm8uCi0gICAgICogQHBhcmFtIGFiaSBhYmkgdGhlIHRlc3Qgd2FzIHJ1biBvbi4KLSAgICAgKiBAcGFyYW0gY2xhc3NNZXRob2ROYW1lIGNsYXNzIG5hbWUgYW5kIG1ldGhvZCBuYW1lIG9mIHRoZSB0ZXN0IGluIGNsYXNzI21ldGhvZCBmb3JtYXQuCi0gICAgICogICAgICAgIE5vdGUgdGhhdCBSZXBvcnRMb2cuZ2V0Q2xhc3NNZXRob2ROYW1lcygpIHByb3ZpZGUgdGhpcy4KLSAgICAgKiBAcGFyYW0gcmVwb3J0TG9nTmFtZSB0aGUgbmFtZSBvZiB0aGUgcmVwb3J0IGxvZyBmaWxlLiBNZXRyaWNzIHdpbGwgYmUgd3JpdHRlbiBvdXQgdG8gdGhpcy4KLSAgICAgKiBAcGFyYW0gc3RyZWFtTmFtZSB0aGUga2V5IGZvciB0aGUgSlNPTiBvYmplY3Qgb2YgdGhlIHNldCBvZiBtZXRyaWNzIHRvIGJlIGxvZ2dlZC4KLSAgICAgKiBAcGFyYW0gZGV2aWNlRGlyIHdoZXRoZXIgdG8gY3JlYXRlIHVuaXF1ZSBkaXJlY3RvcnkgZm9yIGVhY2ggZGV2aWNlCi0gICAgICovCi0gICAgcHVibGljIE1ldHJpY3NSZXBvcnRMb2coSUJ1aWxkSW5mbyBidWlsZEluZm8sIFN0cmluZyBhYmksIFN0cmluZyBjbGFzc01ldGhvZE5hbWUsCi0gICAgICAgICAgICBTdHJpbmcgcmVwb3J0TG9nTmFtZSwgU3RyaW5nIHN0cmVhbU5hbWUsIGJvb2xlYW4gZGV2aWNlRGlyKSB7Ci0gICAgICAgIHN1cGVyKHJlcG9ydExvZ05hbWUsIHN0cmVhbU5hbWUpOwotICAgICAgICBtQnVpbGRJbmZvID0gYnVpbGRJbmZvOwotICAgICAgICBtQWJpID0gYWJpOwotICAgICAgICBtQ2xhc3NNZXRob2ROYW1lID0gY2xhc3NNZXRob2ROYW1lOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIHRtcERpck5hbWUgPSBURU1QT1JBUllfUkVQT1JUX0ZPTERFUjsKLSAgICAgICAgICAgIGlmIChkZXZpY2VEaXIpIHsKLSAgICAgICAgICAgICAgICB0bXBEaXJOYW1lICs9ICItIiArIGJ1aWxkSW5mby5nZXREZXZpY2VTZXJpYWwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIEZpbGUgZGlyID0gRmlsZVV0aWwuY3JlYXRlTmFtZWRUZW1wRGlyKHRtcERpck5hbWUpOwotICAgICAgICAgICAgRmlsZSBqc29uRmlsZSA9IG5ldyBGaWxlKGRpciwgbVJlcG9ydExvZ05hbWUgKyAiLnJlcG9ydGxvZy5qc29uIik7Ci0gICAgICAgICAgICBzdG9yZSA9IG5ldyBSZXBvcnRMb2dIb3N0SW5mb1N0b3JlKGpzb25GaWxlLCBtU3RyZWFtTmFtZSk7Ci0gICAgICAgICAgICBzdG9yZS5vcGVuKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIGRvdWJsZSBtZXRyaWMgdG8gdGhlIHJlcG9ydC4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGRWYWx1ZShTdHJpbmcgc291cmNlLCBTdHJpbmcgbWVzc2FnZSwgZG91YmxlIHZhbHVlLCBSZXN1bHRUeXBlIHR5cGUsCi0gICAgICAgICAgICBSZXN1bHRVbml0IHVuaXQpIHsKLSAgICAgICAgc3VwZXIuYWRkVmFsdWUoc291cmNlLCBtZXNzYWdlLCB2YWx1ZSwgdHlwZSwgdW5pdCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzdG9yZS5hZGRSZXN1bHQobWVzc2FnZSwgdmFsdWUpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBkb3VibGUgbWV0cmljIHRvIHRoZSByZXBvcnQuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkVmFsdWUoU3RyaW5nIG1lc3NhZ2UsIGRvdWJsZSB2YWx1ZSwgUmVzdWx0VHlwZSB0eXBlLCBSZXN1bHRVbml0IHVuaXQpIHsKLSAgICAgICAgc3VwZXIuYWRkVmFsdWUobWVzc2FnZSwgdmFsdWUsIHR5cGUsIHVuaXQpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc3RvcmUuYWRkUmVzdWx0KG1lc3NhZ2UsIHZhbHVlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBkb3VibGUgYXJyYXkgb2YgbWV0cmljcyB0byB0aGUgcmVwb3J0LgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkZFZhbHVlcyhTdHJpbmcgc291cmNlLCBTdHJpbmcgbWVzc2FnZSwgZG91YmxlW10gdmFsdWVzLCBSZXN1bHRUeXBlIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdFVuaXQgdW5pdCkgewotICAgICAgICBzdXBlci5hZGRWYWx1ZXMoc291cmNlLCBtZXNzYWdlLCB2YWx1ZXMsIHR5cGUsIHVuaXQpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc3RvcmUuYWRkQXJyYXlSZXN1bHQobWVzc2FnZSwgdmFsdWVzKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgZG91YmxlIGFycmF5IG9mIG1ldHJpY3MgdG8gdGhlIHJlcG9ydC4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGRWYWx1ZXMoU3RyaW5nIG1lc3NhZ2UsIGRvdWJsZVtdIHZhbHVlcywgUmVzdWx0VHlwZSB0eXBlLCBSZXN1bHRVbml0IHVuaXQpIHsKLSAgICAgICAgc3VwZXIuYWRkVmFsdWVzKG1lc3NhZ2UsIHZhbHVlcywgdHlwZSwgdW5pdCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzdG9yZS5hZGRBcnJheVJlc3VsdChtZXNzYWdlLCB2YWx1ZXMpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYW4gaW50IG1ldHJpYyB0byB0aGUgcmVwb3J0LgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkZFZhbHVlKFN0cmluZyBtZXNzYWdlLCBpbnQgdmFsdWUsIFJlc3VsdFR5cGUgdHlwZSwgUmVzdWx0VW5pdCB1bml0KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzdG9yZS5hZGRSZXN1bHQobWVzc2FnZSwgdmFsdWUpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBsb25nIG1ldHJpYyB0byB0aGUgcmVwb3J0LgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkZFZhbHVlKFN0cmluZyBtZXNzYWdlLCBsb25nIHZhbHVlLCBSZXN1bHRUeXBlIHR5cGUsIFJlc3VsdFVuaXQgdW5pdCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgc3RvcmUuYWRkUmVzdWx0KG1lc3NhZ2UsIHZhbHVlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgZmxvYXQgbWV0cmljIHRvIHRoZSByZXBvcnQuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkVmFsdWUoU3RyaW5nIG1lc3NhZ2UsIGZsb2F0IHZhbHVlLCBSZXN1bHRUeXBlIHR5cGUsIFJlc3VsdFVuaXQgdW5pdCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgc3RvcmUuYWRkUmVzdWx0KG1lc3NhZ2UsIHZhbHVlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgYm9vbGVhbiBtZXRyaWMgdG8gdGhlIHJlcG9ydC4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGRWYWx1ZShTdHJpbmcgbWVzc2FnZSwgYm9vbGVhbiB2YWx1ZSwgUmVzdWx0VHlwZSB0eXBlLCBSZXN1bHRVbml0IHVuaXQpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN0b3JlLmFkZFJlc3VsdChtZXNzYWdlLCB2YWx1ZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIFN0cmluZyBtZXRyaWMgdG8gdGhlIHJlcG9ydC4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGRWYWx1ZShTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIHZhbHVlLCBSZXN1bHRUeXBlIHR5cGUsIFJlc3VsdFVuaXQgdW5pdCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgc3RvcmUuYWRkUmVzdWx0KG1lc3NhZ2UsIHZhbHVlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGFuIGludCBhcnJheSBvZiBtZXRyaWNzIHRvIHRoZSByZXBvcnQuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkVmFsdWVzKFN0cmluZyBtZXNzYWdlLCBpbnRbXSB2YWx1ZXMsIFJlc3VsdFR5cGUgdHlwZSwgUmVzdWx0VW5pdCB1bml0KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzdG9yZS5hZGRBcnJheVJlc3VsdChtZXNzYWdlLCB2YWx1ZXMpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBsb25nIGFycmF5IG9mIG1ldHJpY3MgdG8gdGhlIHJlcG9ydC4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGRWYWx1ZXMoU3RyaW5nIG1lc3NhZ2UsIGxvbmdbXSB2YWx1ZXMsIFJlc3VsdFR5cGUgdHlwZSwgUmVzdWx0VW5pdCB1bml0KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzdG9yZS5hZGRBcnJheVJlc3VsdChtZXNzYWdlLCB2YWx1ZXMpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBmbG9hdCBhcnJheSBvZiBtZXRyaWNzIHRvIHRoZSByZXBvcnQuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkVmFsdWVzKFN0cmluZyBtZXNzYWdlLCBmbG9hdFtdIHZhbHVlcywgUmVzdWx0VHlwZSB0eXBlLCBSZXN1bHRVbml0IHVuaXQpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN0b3JlLmFkZEFycmF5UmVzdWx0KG1lc3NhZ2UsIHZhbHVlcyk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIGJvb2xlYW4gYXJyYXkgb2YgbWV0cmljcyB0byB0aGUgcmVwb3J0LgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkZFZhbHVlcyhTdHJpbmcgbWVzc2FnZSwgYm9vbGVhbltdIHZhbHVlcywgUmVzdWx0VHlwZSB0eXBlLCBSZXN1bHRVbml0IHVuaXQpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN0b3JlLmFkZEFycmF5UmVzdWx0KG1lc3NhZ2UsIHZhbHVlcyk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIFN0cmluZyBMaXN0IG9mIG1ldHJpY3MgdG8gdGhlIHJlcG9ydC4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGRWYWx1ZXMoU3RyaW5nIG1lc3NhZ2UsIExpc3Q8U3RyaW5nPiB2YWx1ZXMsIFJlc3VsdFR5cGUgdHlwZSwgUmVzdWx0VW5pdCB1bml0KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzdG9yZS5hZGRMaXN0UmVzdWx0KG1lc3NhZ2UsIHZhbHVlcyk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgc3VtbWFyeSBkb3VibGUgbWV0cmljIG9mIHRoZSByZXBvcnQuCi0gICAgICoKLSAgICAgKiBOT1RFOiBtZXNzYWdlcyBvdmVyIHtAdmFsdWUgTWV0cmljI01BWF9NRVNTQUdFX0xFTkdUSH0gY2hhcnMgd2lsbCBiZSB0cmltbWVkLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFN1bW1hcnkoU3RyaW5nIG1lc3NhZ2UsIGRvdWJsZSB2YWx1ZSwgUmVzdWx0VHlwZSB0eXBlLCBSZXN1bHRVbml0IHVuaXQpIHsKLSAgICAgICAgc3VwZXIuc2V0U3VtbWFyeShtZXNzYWdlLCB2YWx1ZSwgdHlwZSwgdW5pdCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzdG9yZS5hZGRSZXN1bHQobWVzc2FnZSwgdmFsdWUpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsb3NlcyByZXBvcnQgZmlsZSBhbmQgc3VibWl0cyByZXBvcnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3VibWl0KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgc3RvcmUuY2xvc2UoKTsKLSAgICAgICAgICAgIE1ldHJpY3NTdG9yZS5zdG9yZVJlc3VsdChtQnVpbGRJbmZvLCBtQWJpLCBtQ2xhc3NNZXRob2ROYW1lLCB0aGlzKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vaG9zdC1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvTWV0cmljc1N0b3JlLmphdmEgYi9jb21tb24vaG9zdC1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvTWV0cmljc1N0b3JlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNzA3MjcuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2hvc3Qtc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL01ldHJpY3NTdG9yZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsOwotCi1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuYnVpbGQuSUJ1aWxkSW5mbzsKLQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOwotCi0vKioKLSAqIEEgc2ltcGxlIGluLW1lbW9yeSBzdG9yZSBmb3IgbWV0cmljcyByZXN1bHRzLiBUaGlzIHNob3VsZCBiZSB1c2VkIGZvciBob3N0c2lkZSBtZXRyaWNzIHJlcG9ydGluZy4KLSAqLwotcHVibGljIGNsYXNzIE1ldHJpY3NTdG9yZSB7Ci0KLSAgICAvLyBuZWVkcyBjb25jdXJyZW50IHZlcnNpb24gYXMgdGhlcmUgY2FuIGJlIG11bHRpcGxlIGNsaWVudCBhY2Nlc3NpbmcgdGhpcy4KLSAgICAvLyBCdXQgdGhlcmUgaXMgbm8gYWRkaXRpb25hbCBwcm90ZWN0aW9uIGZvciB0aGUgc2FtZSBrZXkgYXMgdGhhdCBzaG91bGQgbm90IGhhcHBlbi4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb25jdXJyZW50SGFzaE1hcDxTdHJpbmcsIFJlcG9ydExvZz4gbU1hcCA9Ci0gICAgICAgICAgICBuZXcgQ29uY3VycmVudEhhc2hNYXA8U3RyaW5nLCBSZXBvcnRMb2c+KCk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRfVElNRV9UQUcgPSAiU1RBUlRfVElNRV9NUyI7Ci0KLSAgICBwcml2YXRlIE1ldHJpY3NTdG9yZSgpIHt9Ci0KLSAgICAvKioKLSAgICAgKiBTdG9yZXMgYSByZXN1bHQuIEV4aXN0aW5nIHJlc3VsdCB3aXRoIHRoZSBzYW1lIGtleSB3aWxsIGJlIHJlcGxhY2VkLgotICAgICAqIE5vdGUgdGhhdCBrZXkgaXMgZ2VuZXJhdGVkIGluIHRoZSBmb3JtIG9mIHN0YXJ0X3RpbWUjY2xhc3MjbWV0aG9kIG5hbWUuCi0gICAgICogU28gdGhlcmUgc2hvdWxkIGJlIG5vIGNvbmN1cnJlbnQgdGVzdCBmb3IgdGhlIHNhbWUgKHNlcmlhbCwgY2xhc3MsIG1ldGhvZCkuCi0gICAgICogQHBhcmFtIGJ1aWxkSW5mbwotICAgICAqIEBwYXJhbSBhYmkKLSAgICAgKiBAcGFyYW0gY2xhc3NNZXRob2ROYW1lCi0gICAgICogQHBhcmFtIHJlcG9ydExvZyBDb250YWlucyB0aGUgcmVzdWx0IHRvIGJlIHN0b3JlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzdG9yZVJlc3VsdChJQnVpbGRJbmZvIGJ1aWxkSW5mbywgU3RyaW5nIGFiaSwgU3RyaW5nIGNsYXNzTWV0aG9kTmFtZSwKLSAgICAgICAgICAgIFJlcG9ydExvZyByZXBvcnRMb2cpIHsKLSAgICAgICAgU3RyaW5nIHN0YXJ0VGltZSA9IGJ1aWxkSW5mby5nZXRCdWlsZEF0dHJpYnV0ZXMoKS5nZXQoU1RBUlRfVElNRV9UQUcpOwotICAgICAgICBtTWFwLnB1dChnZW5lcmF0ZVRlc3RLZXkoc3RhcnRUaW1lLCBhYmksIGNsYXNzTWV0aG9kTmFtZSksIHJlcG9ydExvZyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcmV0cmlldmVzIGEgbWV0cmljIHJlc3VsdCBmb3IgdGhlIGdpdmVuIGNvbmRpdGlvbiBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIGludGVybmFsCi0gICAgICogc3RvcmFnZS4gSWYgdGhlcmUgaXMgbm8gcmVzdWx0IGZvciB0aGUgZ2l2ZW4gY29uZGl0aW9uLCBpdCB3aWxsIHJldHVybiBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUmVwb3J0TG9nIHJlbW92ZVJlc3VsdChJQnVpbGRJbmZvIGJ1aWxkSW5mbywgU3RyaW5nIGFiaSwgU3RyaW5nIGNsYXNzTWV0aG9kTmFtZSkgewotICAgICAgICBTdHJpbmcgc3RhcnRUaW1lID0gYnVpbGRJbmZvLmdldEJ1aWxkQXR0cmlidXRlcygpLmdldChTVEFSVF9USU1FX1RBRyk7Ci0gICAgICAgIHJldHVybiBtTWFwLnJlbW92ZShnZW5lcmF0ZVRlc3RLZXkoc3RhcnRUaW1lLCBhYmksIGNsYXNzTWV0aG9kTmFtZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGVzdCBrZXkgaW4gdGhlIGZvcm0gb2Ygc3RhcnRfdGltZSNhYmkjY2xhc3NfbmFtZSNtZXRob2RfbmFtZQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZW5lcmF0ZVRlc3RLZXkoU3RyaW5nIHN0YXJ0VGltZSwgU3RyaW5nIGFiaSwgU3RyaW5nIGNsYXNzTWV0aG9kTmFtZSkgewotICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJXMjJXMjJXMiLCBzdGFydFRpbWUsIGFiaSwgY2xhc3NNZXRob2ROYW1lKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vaG9zdC1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvTW9uaXRvcmluZ1V0aWxzLmphdmEgYi9jb21tb24vaG9zdC1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvTW9uaXRvcmluZ1V0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMTZhYzAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2hvc3Qtc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL01vbml0b3JpbmdVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5Mb2cuTG9nTGV2ZWw7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLkRldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuSVRlc3REZXZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQubG9nLkxvZ1V0aWwuQ0xvZzsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5yZXN1bHQuSVRlc3RJbnZvY2F0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQucmVzdWx0LklucHV0U3RyZWFtU291cmNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnJlc3VsdC5Mb2dEYXRhVHlwZTsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC51dGlsLlJ1blV0aWw7Ci0KLS8qKgotICogVXRpbGl0eSBmdW5jdGlvbnMgcmVsYXRlZCB0byBkZXZpY2Ugc3RhdGUgbW9uaXRvcmluZyBkdXJpbmcgY29tcGF0aWJpbGl0eSB0ZXN0LgotICovCi1wdWJsaWMgY2xhc3MgTW9uaXRvcmluZ1V0aWxzIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgQ09OTkVDVElWSVRZX0NIRUNLX1RJTUVfTVMgPSAyMCAqIDEwMDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBDT05ORUNUSVZJVFlfQ0hFQ0tfSU5URVJWQUxfTVMgPSA1ICogMTAwMDsKLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja0RldmljZUNvbm5lY3Rpdml0eShJVGVzdERldmljZSBkZXZpY2UpCi0gICAgICAgICAgICB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICB3aGlsZSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydCA8IENPTk5FQ1RJVklUWV9DSEVDS19USU1FX01TKSB7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlLmNoZWNrQ29ubmVjdGl2aXR5KCkpIHsKLSAgICAgICAgICAgICAgICBDTG9nLmkoIkNvbm5lY3Rpdml0eTogcGFzc2VkIGNoZWNrLiIpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBDTG9nLmxvZ0FuZERpc3BsYXkoTG9nTGV2ZWwuSU5GTywKLSAgICAgICAgICAgICAgICAgICAgICAgICJDb25uZWN0aXZpdHkgY2hlY2sgZmFpbGVkIG9uICVzLCByZXRyeWluZyBpbiAlZG1zIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZS5nZXRTZXJpYWxOdW1iZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIENPTk5FQ1RJVklUWV9DSEVDS19JTlRFUlZBTF9NUyk7Ci0gICAgICAgICAgICAgICAgUnVuVXRpbC5nZXREZWZhdWx0KCkuc2xlZXAoQ09OTkVDVElWSVRZX0NIRUNLX0lOVEVSVkFMX01TKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrRGV2aWNlQ29ubmVjdGl2aXR5KElUZXN0RGV2aWNlIGRldmljZSwgSVRlc3RJbnZvY2F0aW9uTGlzdGVuZXIgbGlzdGVuZXIsCi0gICAgICAgICAgICBTdHJpbmcgdGFnKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFjaGVja0RldmljZUNvbm5lY3Rpdml0eShkZXZpY2UpKSB7Ci0gICAgICAgICAgICBDTG9nLncoIkNvbm5lY3Rpdml0eTogY2hlY2sgZmFpbGVkLiIpOwotICAgICAgICAgICAgSW5wdXRTdHJlYW1Tb3VyY2UgYnVnU291cmNlID0gZGV2aWNlLmdldEJ1Z3JlcG9ydCgpOwotICAgICAgICAgICAgbGlzdGVuZXIudGVzdExvZyhTdHJpbmcuZm9ybWF0KCJidWdyZXBvcnQtY29ubmVjdGl2aXR5LSVzIiwgdGFnKSwKLSAgICAgICAgICAgICAgICAgICAgTG9nRGF0YVR5cGUuVEVYVCwgYnVnU291cmNlKTsKLSAgICAgICAgICAgIGJ1Z1NvdXJjZS5jYW5jZWwoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9ob3N0LXNpZGUvdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9QYWNrYWdlVXRpbC5qYXZhIGIvY29tbW9uL2hvc3Qtc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1BhY2thZ2VVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0ZDdjYjcuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2hvc3Qtc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1BhY2thZ2VVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsOwotCi1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLkRldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuSVRlc3REZXZpY2U7Ci0KLS8qKgotICogSG9zdC1zaWRlIHV0aWxpdHkgY2xhc3MgZm9yIFBhY2thZ2VNYW5hZ2VyLXJlbGF0ZWQgb3BlcmF0aW9ucwotICovCi1wdWJsaWMgY2xhc3MgUGFja2FnZVV0aWwgewotCi0gICAgLyoqIFJldHVybnMgdHJ1ZSBpZiBhIHBhY2thZ2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSBleGlzdHMgb24gdGhlIGRldmljZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBleGlzdHMoSVRlc3REZXZpY2UgZGV2aWNlLCBTdHJpbmcgcGFja2FnZU5hbWUpCi0gICAgICAgICAgICB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGRldmljZS5nZXRJbnN0YWxsZWRQYWNrYWdlTmFtZXMoKS5jb250YWlucyhwYWNrYWdlTmFtZSk7Ci0gICAgfQotCi0gICAgLyoqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYXBwIGZvciB0aGUgZ2l2ZW4gcGFja2FnZSBuYW1lIGlzIGEgc3lzdGVtIGFwcCBmb3IgdGhpcyBkZXZpY2UgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTeXN0ZW1BcHAoSVRlc3REZXZpY2UgZGV2aWNlLCBTdHJpbmcgcGFja2FnZU5hbWUpCi0gICAgICAgICAgICB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGRldmljZS5nZXRBcHBQYWNrYWdlSW5mbyhwYWNrYWdlTmFtZSkuaXNTeXN0ZW1BcHAoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vaG9zdC1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvUHJvcGVydHlVdGlsLmphdmEgYi9jb21tb24vaG9zdC1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvUHJvcGVydHlVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZDg1MmYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2hvc3Qtc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1Byb3BlcnR5VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsOwotCi1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLkRldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuSVRlc3REZXZpY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi0vKioKLSAqIEhvc3Qtc2lkZSB1dGlsaXR5IGNsYXNzIGZvciByZWFkaW5nIHByb3BlcnRpZXMgYW5kIGdhdGhlcmluZyBpbmZvcm1hdGlvbiBmb3IgdGVzdGluZwotICogQW5kcm9pZCBkZXZpY2UgY29tcGF0aWJpbGl0eS4KLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5VXRpbCB7Ci0KLSAgICAvKioKLSAgICAgKiBOYW1lIG9mIHJlYWQtb25seSBwcm9wZXJ0eSBkZXRhaWxpbmcgdGhlIGZpcnN0IEFQSSBsZXZlbCBmb3Igd2hpY2ggdGhlIHByb2R1Y3Qgd2FzCi0gICAgICogc2hpcHBlZC4gUHJvcGVydHkgc2hvdWxkIGJlIHVuZGVmaW5lZCBmb3IgZmFjdG9yeSBST00gcHJvZHVjdHMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklSU1RfQVBJX0xFVkVMID0gInJvLnByb2R1Y3QuZmlyc3RfYXBpX2xldmVsIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVJTERfVEFHU19QUk9QRVJUWSA9ICJyby5idWlsZC50YWdzIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVJTERfVFlQRV9QUk9QRVJUWSA9ICJyby5idWlsZC50eXBlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFOVUZBQ1RVUkVSX1BST1BFUlRZID0gInJvLnByb2R1Y3QubWFudWZhY3R1cmVyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0RFVl9LRVlTID0gImRldi1rZXlzIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdPT0dMRV9TRVRUSU5HU19RVUVSWSA9Ci0gICAgICAgICAgICAiY29udGVudCBxdWVyeSAtLXVyaSBjb250ZW50Oi8vY29tLmdvb2dsZS5zZXR0aW5ncy9wYXJ0bmVyIjsKLQotICAgIC8qKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGRldmljZSBidWlsZCBpcyBhIHVzZXIgYnVpbGQgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNVc2VyQnVpbGQoSVRlc3REZXZpY2UgZGV2aWNlKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHByb3BlcnR5RXF1YWxzKGRldmljZSwgQlVJTERfVFlQRV9QUk9QRVJUWSwgInVzZXIiKTsKLSAgICB9Ci0KLSAgICAvKiogUmV0dXJucyB3aGV0aGVyIHRoZSBkZXZpY2UgYnVpbGQgaXMgdGhlIGZhY3RvcnkgUk9NICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRmFjdG9yeVJPTShJVGVzdERldmljZSBkZXZpY2UpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICAvLyBmaXJzdCBBUEkgbGV2ZWwgcHJvcGVydHkgc2hvdWxkIGJlIHVuZGVmaW5lZCBpZiBhbmQgb25seSBpZiB0aGUgcHJvZHVjdCBpcyBmYWN0b3J5IFJPTS4KLSAgICAgICAgcmV0dXJuIGRldmljZS5nZXRQcm9wZXJ0eShGSVJTVF9BUElfTEVWRUwpID09IG51bGw7Ci0gICAgfQotCi0gICAgLyoqIFJldHVybnMgd2hldGhlciB0aGlzIGJ1aWxkIGlzIGJ1aWx0IHdpdGggZGV2LWtleXMgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEZXZLZXlzQnVpbGQoSVRlc3REZXZpY2UgZGV2aWNlKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGJ1aWxkVGFncyA9IGRldmljZS5nZXRQcm9wZXJ0eShCVUlMRF9UQUdTX1BST1BFUlRZKTsKLSAgICAgICAgZm9yIChTdHJpbmcgdGFnIDogYnVpbGRUYWdzLnNwbGl0KCIsIikpIHsKLSAgICAgICAgICAgIGlmIChUQUdfREVWX0tFWVMuZXF1YWxzKHRhZy50cmltKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgZmlyc3QgQVBJIGxldmVsIGZvciB0aGlzIHByb2R1Y3QuIElmIHRoZSByZWFkLW9ubHkgcHJvcGVydHkgaXMgdW5zZXQsCi0gICAgICogdGhpcyBtZWFucyB0aGUgZmlyc3QgQVBJIGxldmVsIGlzIHRoZSBjdXJyZW50IEFQSSBsZXZlbCwgYW5kIHRoZSBjdXJyZW50IEFQSSBsZXZlbAotICAgICAqIGlzIHJldHVybmVkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldEZpcnN0QXBpTGV2ZWwoSVRlc3REZXZpY2UgZGV2aWNlKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHByb3BTdHJpbmcgPSBkZXZpY2UuZ2V0UHJvcGVydHkoRklSU1RfQVBJX0xFVkVMKTsKLSAgICAgICAgcmV0dXJuIChwcm9wU3RyaW5nID09IG51bGwpID8gZGV2aWNlLmdldEFwaUxldmVsKCkgOiBJbnRlZ2VyLnBhcnNlSW50KHByb3BTdHJpbmcpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgbWFudWZhY3R1cmVyIG9mIHRoaXMgcHJvZHVjdC4gSWYgdW5zZXQsIHJldHVybiBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1hbnVmYWN0dXJlcihJVGVzdERldmljZSBkZXZpY2UpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZGV2aWNlLmdldFByb3BlcnR5KE1BTlVGQUNUVVJFUl9QUk9QRVJUWSk7Ci0gICAgfQotCi0gICAgLyoqIFJldHVybnMgYSBtYXBwaW5nIGZyb20gY2xpZW50IElEIG5hbWVzIHRvIGNsaWVudCBJRCB2YWx1ZXMgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0Q2xpZW50SWRzKElUZXN0RGV2aWNlIGRldmljZSkKLSAgICAgICAgICAgIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBNYXA8U3RyaW5nLFN0cmluZz4gY2xpZW50SWRzID0gbmV3IEhhc2hNYXA8PigpOwotICAgICAgICBTdHJpbmcgcXVlcnlPdXRwdXQgPSBkZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZChHT09HTEVfU0VUVElOR1NfUVVFUlkpOwotICAgICAgICBmb3IgKFN0cmluZyBsaW5lIDogcXVlcnlPdXRwdXQuc3BsaXQoIltcXHI/XFxuXSsiKSkgewotICAgICAgICAgICAgLy8gRXhwZWN0ZWQgbGluZSBmb3JtYXQ6ICJSb3c6IDEgX2lkPTEyMywgbmFtZT08cHJvcGVydHlfbmFtZT4sIHZhbHVlPTxwcm9wZXJ0eV92YWx1ZT4iCi0gICAgICAgICAgICBQYXR0ZXJuIHBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoIm5hbWU9KFthLXpfXSopLCB2YWx1ZT0oLiopJCIpOwotICAgICAgICAgICAgTWF0Y2hlciBtYXRjaGVyID0gcGF0dGVybi5tYXRjaGVyKGxpbmUpOwotICAgICAgICAgICAgaWYgKG1hdGNoZXIuZmluZCgpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBtYXRjaGVyLmdyb3VwKDEpOwotICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IG1hdGNoZXIuZ3JvdXAoMik7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWUuY29udGFpbnMoImNsaWVudF9pZCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNsaWVudElkcy5wdXQobmFtZSwgdmFsdWUpOyAvLyBvbmx5IGFkZCBuYW1lLXZhbHVlIHBhaXIgZm9yIGNsaWVudCBpZHMKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNsaWVudElkczsKLSAgICB9Ci0KLSAgICAvKiogUmV0dXJucyB3aGV0aGVyIHRoZSBwcm9wZXJ0eSBleGlzdHMgb24gdGhpcyBkZXZpY2UgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gcHJvcGVydHlFeGlzdHMoSVRlc3REZXZpY2UgZGV2aWNlLCBTdHJpbmcgcHJvcGVydHkpCi0gICAgICAgICAgICB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGRldmljZS5nZXRQcm9wZXJ0eShwcm9wZXJ0eSkgIT0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKiogUmV0dXJucyB3aGV0aGVyIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyBlcXVhbCB0byBhIGdpdmVuIHN0cmluZyAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwcm9wZXJ0eUVxdWFscyhJVGVzdERldmljZSBkZXZpY2UsIFN0cmluZyBwcm9wZXJ0eSwgU3RyaW5nIHZhbHVlKQotICAgICAgICAgICAgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gIXByb3BlcnR5RXhpc3RzKGRldmljZSwgcHJvcGVydHkpOyAvLyBudWxsIHZhbHVlIGltcGxpZXMgcHJvcGVydHkgZG9lcyBub3QgZXhpc3QKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdmFsdWUuZXF1YWxzKGRldmljZS5nZXRQcm9wZXJ0eShwcm9wZXJ0eSkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9ob3N0LXNpZGUvdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9SZXBvcnRMb2dIb3N0SW5mb1N0b3JlLmphdmEgYi9jb21tb24vaG9zdC1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvUmVwb3J0TG9nSG9zdEluZm9TdG9yZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTg4YzA3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9ob3N0LXNpZGUvdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9SZXBvcnRMb2dIb3N0SW5mb1N0b3JlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmpzb24uc3RyZWFtLkpzb25Xcml0ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudXRpbC5GaWxlVXRpbDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgUmVwb3J0TG9nSG9zdEluZm9TdG9yZSBleHRlbmRzIEhvc3RJbmZvU3RvcmUgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVN0cmVhbU5hbWU7Ci0gICAgcHJpdmF0ZSBGaWxlIHRlbXBKc29uRmlsZTsKLQotICAgIHB1YmxpYyBSZXBvcnRMb2dIb3N0SW5mb1N0b3JlKEZpbGUganNvbkZpbGUsIFN0cmluZyBzdHJlYW1OYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbUpzb25GaWxlID0ganNvbkZpbGU7Ci0gICAgICAgIG1TdHJlYW1OYW1lID0gc3RyZWFtTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSB3cml0ZXIgYW5kIHN0YXJ0cyB0aGUgSlNPTiBPYmplY3QgZm9yIHRoZSBtZXRyaWMgc3RyZWFtLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9wZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAvLyBXcml0ZSBuZXcgbWV0cmljcyB0byBhIHRlbXAgZmlsZSB0byBhdm9pZCBpbnZhbGlkIEpTT04gZmlsZXMgZHVlIHRvIGZhaWxlZCB0ZXN0cy4KLSAgICAgICAgQnVmZmVyZWRXcml0ZXIgZm9ybWF0V3JpdGVyOwotICAgICAgICB0ZW1wSnNvbkZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKG1TdHJlYW1OYW1lLCAiLXRlbXAtcmVwb3J0LWxvZyIpOwotICAgICAgICBmb3JtYXRXcml0ZXIgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIodGVtcEpzb25GaWxlKSk7Ci0gICAgICAgIGlmIChtSnNvbkZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGpzb25SZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIobUpzb25GaWxlKSk7Ci0gICAgICAgICAgICBTdHJpbmcgY3VycmVudExpbmU7Ci0gICAgICAgICAgICBTdHJpbmcgbmV4dExpbmUgPSBqc29uUmVhZGVyLnJlYWRMaW5lKCk7Ci0gICAgICAgICAgICB3aGlsZSAoKGN1cnJlbnRMaW5lID0gbmV4dExpbmUpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBuZXh0TGluZSA9IGpzb25SZWFkZXIucmVhZExpbmUoKTsKLSAgICAgICAgICAgICAgICBpZiAobmV4dExpbmUgPT0gbnVsbCAmJiBjdXJyZW50TGluZS5jaGFyQXQoY3VycmVudExpbmUubGVuZ3RoKCkgLSAxKSA9PSAnfScpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gUmVvcGVuIG92ZXJhbGwgSlNPTiBvYmplY3QgdG8gd3JpdGUgbmV3IG1ldHJpY3MuCi0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRMaW5lID0gY3VycmVudExpbmUuc3Vic3RyaW5nKDAsIGN1cnJlbnRMaW5lLmxlbmd0aCgpIC0gMSkgKyAiLCI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIENvcHkgdG8gdGVtcCBmaWxlIGRpcmVjdGx5IHRvIGF2b2lkIGxhcmdlIG1ldHJpY3Mgc3RyaW5nIGluIG1lbW9yeS4KLSAgICAgICAgICAgICAgICBmb3JtYXRXcml0ZXIud3JpdGUoY3VycmVudExpbmUsIDAsIGN1cnJlbnRMaW5lLmxlbmd0aCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGpzb25SZWFkZXIuY2xvc2UoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvcm1hdFdyaXRlci53cml0ZSgieyIsIDAgLCAxKTsKLSAgICAgICAgfQotICAgICAgICAvLyBTdGFydCBuZXcgSlNPTiBvYmplY3QgZm9yIG5ldyBtZXRyaWNzLgotICAgICAgICBmb3JtYXRXcml0ZXIud3JpdGUoIlwiIiArIG1TdHJlYW1OYW1lICsgIlwiOiIsIDAsIG1TdHJlYW1OYW1lLmxlbmd0aCgpICsgMyk7Ci0gICAgICAgIGZvcm1hdFdyaXRlci5mbHVzaCgpOwotICAgICAgICBmb3JtYXRXcml0ZXIuY2xvc2UoKTsKLSAgICAgICAgbUpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihuZXcgRmlsZVdyaXRlcih0ZW1wSnNvbkZpbGUsIHRydWUpKTsKLSAgICAgICAgbUpzb25Xcml0ZXIuYmVnaW5PYmplY3QoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbG9zZXMgdGhlIHdyaXRlci4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIENsb3NlIEpTT04gV3JpdGVyLgotICAgICAgICBtSnNvbldyaXRlci5lbmRPYmplY3QoKTsKLSAgICAgICAgbUpzb25Xcml0ZXIuY2xvc2UoKTsKLSAgICAgICAgLy8gQ2xvc2Ugb3ZlcmFsbCBKU09OIE9iamVjdC4KLSAgICAgICAgdHJ5IChCdWZmZXJlZFdyaXRlciBmb3JtYXRXcml0ZXIgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIodGVtcEpzb25GaWxlLCB0cnVlKSkpIHsKLSAgICAgICAgICAgIGZvcm1hdFdyaXRlci53cml0ZSgifSIsIDAsIDEpOwotICAgICAgICB9Ci0gICAgICAgIC8vIENvcHkgbWV0cmljcyBmcm9tIHRlbXAgZmlsZSBhbmQgZGVsZXRlIHRlbXAgZmlsZS4KLSAgICAgICAgbUpzb25GaWxlLmNyZWF0ZU5ld0ZpbGUoKTsKLSAgICAgICAgdHJ5ICgKLSAgICAgICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBqc29uUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKHRlbXBKc29uRmlsZSkpOwotICAgICAgICAgICAgICAgIEJ1ZmZlcmVkV3JpdGVyIG1ldHJpY3NXcml0ZXIgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIobUpzb25GaWxlKSkKLSAgICAgICAgKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbGluZTsKLSAgICAgICAgICAgIHdoaWxlICgobGluZSA9IGpzb25SZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIENvcHkgZnJvbSB0ZW1wIGZpbGUgZGlyZWN0bHkgdG8gYXZvaWQgbGFyZ2UgbWV0cmljcyBzdHJpbmcgaW4gbWVtb3J5LgotICAgICAgICAgICAgICAgIG1ldHJpY3NXcml0ZXIud3JpdGUobGluZSwgMCwgbGluZS5sZW5ndGgoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBGaWxlVXRpbC5kZWxldGVGaWxlKHRlbXBKc29uRmlsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vaG9zdC1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvU2hlbGxDb21tYW5kVXRpbC5qYXZhIGIvY29tbW9uL2hvc3Qtc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1NoZWxsQ29tbWFuZFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYyYTlmNS4uMDAwMDAwMAotLS0gYS9jb21tb24vaG9zdC1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvU2hlbGxDb21tYW5kVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWw7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5JVGVzdERldmljZTsKLQotLyoqCi0gKiBEZXZpY2Utc2lkZSBjb21wYXRpYmlsaXR5IHV0aWxpdHkgY2xhc3MgZm9yIGV4ZWN1dGluZyBBREIgc2hlbGwgY29tbWFuZHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTaGVsbENvbW1hbmRVdGlsIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBleGVjdXRlKElUZXN0RGV2aWNlIGRldmljZSwgU3RyaW5nIGNvbW1hbmQpCi0gICAgICAgICAgICB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgZGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoY29tbWFuZCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2hvc3Qtc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1Rlc3RGaWx0ZXIuamF2YSBiL2NvbW1vbi9ob3N0LXNpZGUvdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9UZXN0RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MjIwYTQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2hvc3Qtc2lkZS91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1Rlc3RGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnV0aWwuQWJpVXRpbHM7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIGZpbHRlciBmb3IgaW5jbHVkaW5nIGFuZCBleGNsdWRpbmcgdGVzdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0RmlsdGVyIHsKLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1BYmk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbU5hbWU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVRlc3Q7Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZHMgYSBuZXcge0BsaW5rIFRlc3RGaWx0ZXJ9IGZyb20gdGhlIGdpdmVuIHN0cmluZy4gRmlsdGVycyBjYW4gYmUgaW4gb25lIG9mIGZvdXIgZm9ybXMsCi0gICAgICogdGhlIGluc3RhbmNlIHdpbGwgYmUgaW5pdGlhbGl6ZWQgYXM7Ci0gICAgICogLSJuYW1lIiAgICAgICAgICAgICAgICAgLT4gYWJpID0gbnVsbCwgbmFtZSA9ICJuYW1lIiwgdGVzdCA9IG51bGwKLSAgICAgKiAtIm5hbWUiICJ0ZXN0Li4uIiAgICAgICAtPiBhYmkgPSBudWxsLCBuYW1lID0gIm5hbWUiLCB0ZXN0ID0gInRlc3QuLi4iCi0gICAgICogLSJhYmkiICJuYW1lIiAgICAgICAgICAgLT4gYWJpID0gImFiaSIsIG5hbWUgPSAibmFtZSIsIHRlc3QgPSBudWxsCi0gICAgICogLSJhYmkiICJuYW1lIiAidGVzdC4uLiIgLT4gYWJpID0gImFiaSIsIG5hbWUgPSAibmFtZSIsIHRlc3QgPSAidGVzdC4uLiIKLSAgICAgKgotICAgICAqIFRlc3QgaWRlbnRpZmllciBjYW4gY29udGFpbiBtdWx0aXBsZSBwYXJ0cywgZWcgcGFyYW1ldGVyaXplZCB0ZXN0cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWx0ZXIgdGhlIGZpbHRlciB0byBwYXJzZQotICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBUZXN0RmlsdGVyfQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVGVzdEZpbHRlciBjcmVhdGVGcm9tKFN0cmluZyBmaWx0ZXIpIHsKLSAgICAgICAgaWYgKGZpbHRlci5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkZpbHRlciB3YXMgZW1wdHkiKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmdbXSBwYXJ0cyA9IGZpbHRlci5zcGxpdCgiICIpOwotICAgICAgICBTdHJpbmcgYWJpID0gbnVsbCwgbmFtZSA9IG51bGwsIHRlc3QgPSBudWxsOwotICAgICAgICAvLyBFaXRoZXI6Ci0gICAgICAgIC8vIDxuYW1lPgotICAgICAgICAvLyA8bmFtZT4gPHRlc3Q+Ci0gICAgICAgIC8vIDxhYmk+IDxuYW1lPgotICAgICAgICAvLyA8YWJpPiA8bmFtZT4gPHRlc3Q+Ci0gICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPT0gMSkgewotICAgICAgICAgICAgbmFtZSA9IHBhcnRzWzBdOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAgICAgICAgIGlmIChBYmlVdGlscy5pc0FiaVN1cHBvcnRlZEJ5Q29tcGF0aWJpbGl0eShwYXJ0c1swXSkpIHsKLSAgICAgICAgICAgICAgICBhYmkgPSBwYXJ0c1swXTsKLSAgICAgICAgICAgICAgICBpbmRleCsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbmFtZSA9IHBhcnRzW2luZGV4XTsKLSAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICBwYXJ0cyA9IGZpbHRlci5zcGxpdCgiICIsIGluZGV4ICsgMSk7Ci0gICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoID4gaW5kZXgpIHsKLSAgICAgICAgICAgICAgICB0ZXN0ID0gcGFydHNbaW5kZXhdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdEZpbHRlcihhYmksIG5hbWUsIHRlc3QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFRlc3RGaWx0ZXJ9IGZyb20gdGhlIGdpdmVuIHBhcnRzLgotICAgICAqCi0gICAgICogQHBhcmFtIGFiaSBUaGUgQUJJIG11c3QgYmUgc3VwcG9ydGVkIHtAbGluayBBYmlVdGlscyNpc0FiaVN1cHBvcnRlZEJ5Q29tcGF0aWJpbGl0eShTdHJpbmcpfQotICAgICAqIEBwYXJhbSBuYW1lIFRoZSBtb2R1bGUncyBuYW1lCi0gICAgICogQHBhcmFtIHRlc3QgVGhlIHRlc3QncyBpZGVudGlmaWVyIGVnIDxwYWNrYWdlPi48Y2xhc3M+IzxtZXRob2Q+Ci0gICAgICovCi0gICAgcHVibGljIFRlc3RGaWx0ZXIoU3RyaW5nIGFiaSwgU3RyaW5nIG5hbWUsIFN0cmluZyB0ZXN0KSB7Ci0gICAgICAgIG1BYmkgPSBhYmk7Ci0gICAgICAgIG1OYW1lID0gbmFtZTsKLSAgICAgICAgbVRlc3QgPSB0ZXN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBmaWx0ZXIuIFRoaXMgZnVuY3Rpb24gaXMgdGhlIGludmVyc2Ugb2YKLSAgICAgKiB7QGxpbmsgVGVzdEZpbHRlciNjcmVhdGVGcm9tKFN0cmluZyl9LgotICAgICAqCi0gICAgICogRm9yIGEgdmFsaWQgZmlsdGVyIGY7Ci0gICAgICogPHByZT4KLSAgICAgKiB7QGNvZGUKLSAgICAgKiBuZXcgVGVzdEZpbHRlcihmKS50b1N0cmluZygpLmVxdWFscyhmKQotICAgICAqIH0KLSAgICAgKiA8L3ByZT4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgaWYgKG1BYmkgIT0gbnVsbCkgewotICAgICAgICAgICAgc2IuYXBwZW5kKG1BYmkudHJpbSgpKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiICIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQobU5hbWUudHJpbSgpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobVRlc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgc2IuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICBzYi5hcHBlbmQobVRlc3QudHJpbSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBhYmkgb2YgdGhpcyBmaWx0ZXIsIG9yIG51bGwgaWYgbm90IHNwZWNpZmllZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFiaSgpIHsKLSAgICAgICAgcmV0dXJuIG1BYmk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgbW9kdWxlIG5hbWUgb2YgdGhpcyBmaWx0ZXIsIG9yIG51bGwgaWYgbm90IHNwZWNpZmllZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSB0ZXN0IGlkZW50aWZpZXIgb2YgdGhpcyBmaWx0ZXIsIG9yIG51bGwgaWYgbm90IHNwZWNpZmllZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRlc3QoKSB7Ci0gICAgICAgIHJldHVybiBtVGVzdDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9ob3N0LXNpZGUvdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9WZXJzaW9uQ29kZXMuamF2YSBiL2NvbW1vbi9ob3N0LXNpZGUvdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9WZXJzaW9uQ29kZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI1NGQ4NS4uMDAwMDAwMAotLS0gYS9jb21tb24vaG9zdC1zaWRlL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvVmVyc2lvbkNvZGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKLQotcHVibGljIGNsYXNzIFZlcnNpb25Db2RlcyB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ1VSX0RFVkVMT1BNRU5UID0gMTAwMDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkFTRSA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkFTRV8xXzEgPSAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENVUENBS0UgPSAzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERPTlVUID0gNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFQ0xBSVIgPSA1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVDTEFJUl8wXzEgPSA2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVDTEFJUl9NUjEgPSA3OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZST1lPID0gODsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHSU5HRVJCUkVBRCA9IDk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0lOR0VSQlJFQURfTVIxID0gMTA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSE9ORVlDT01CID0gMTE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSE9ORVlDT01CX01SMSA9IDEyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhPTkVZQ09NQl9NUjIgPSAxMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJQ0VfQ1JFQU1fU0FORFdJQ0ggPSAxNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJQ0VfQ1JFQU1fU0FORFdJQ0hfTVIxID0gMTU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkVMTFlfQkVBTiA9IDE2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpFTExZX0JFQU5fTVIxID0gMTc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkVMTFlfQkVBTl9NUjIgPSAxODsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLSVRLQVQgPSAxOTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLSVRLQVRfV0FUQ0ggPSAyMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0xMSVBPUCA9IDIxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPTExJUE9QX01SMSA9IDIyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE0gPSAyMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOID0gMjQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTl9NUjEgPSAyNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPID0gMjY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT19NUjEgPSAyNzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQID0gQ1VSX0RFVkVMT1BNRU5UOwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2hvc3Qtc2lkZS91dGlsL3Rlc3RzL0FuZHJvaWQubWsgYi9jb21tb24vaG9zdC1zaWRlL3V0aWwvdGVzdHMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc0MWVjNC4uMDAwMDAwMAotLS0gYS9jb21tb24vaG9zdC1zaWRlL3V0aWwvdGVzdHMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCi0KLUxPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGNvbXBhdGliaWxpdHktaG9zdC11dGlsIGVhc3ltb2NrIGp1bml0LWhvc3QganNvbi1wcmVidWlsdCB0cmFkZWZlZAotCi1MT0NBTF9NT0RVTEUgOj0gY29tcGF0aWJpbGl0eS1ob3N0LXV0aWwtdGVzdHMKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLWluY2x1ZGUgY3RzL2Vycm9yX3Byb25lX3J1bGVzLm1rCi1pbmNsdWRlICQoQlVJTERfSE9TVF9KQVZBX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9jb21tb24vaG9zdC1zaWRlL3V0aWwvdGVzdHMvcnVuX3Rlc3RzLnNoIGIvY29tbW9uL2hvc3Qtc2lkZS91dGlsL3Rlc3RzL3J1bl90ZXN0cy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDQ1MTNmOS4uMDAwMDAwMAotLS0gYS9jb21tb24vaG9zdC1zaWRlL3V0aWwvdGVzdHMvcnVuX3Rlc3RzLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyEvYmluL2Jhc2gKLQotIyBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSMgSGVscGVyIHNjcmlwdCBmb3IgcnVubmluZyB1bml0IHRlc3RzIGZvciBjb21wYXRpYmlsaXR5IGxpYnJhcmllcwotCi1DVFNfRElSPSQoZGlybmFtZSAkezB9KS8uLi8uLi8uLi8uLgotc291cmNlICR7Q1RTX0RJUn0vdGVzdF9kZWZzLnNoCi0KLUpBUlM9IgotICAgIGNvbXBhdGliaWxpdHktY29tbW9uLXV0aWwtaG9zdHNpZGVsaWJcCi0gICAgY29tcGF0aWJpbGl0eS1jb21tb24tdXRpbC10ZXN0c1wKLSAgICBjb21wYXRpYmlsaXR5LWhvc3QtdXRpbFwKLSAgICBjb21wYXRpYmlsaXR5LWhvc3QtdXRpbC10ZXN0c1wKLSAgICBjb21wYXRpYmlsaXR5LW1vY2stdHJhZGVmZWRcCi0gICAgY29tcGF0aWJpbGl0eS10cmFkZWZlZC10ZXN0cyIKLQotcnVuX3Rlc3RzICJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkhvc3RVbml0VGVzdHMiICIke0pBUlN9IiAiJHtAfSIKLQpkaWZmIC0tZ2l0IGEvY29tbW9uL2hvc3Qtc2lkZS91dGlsL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0J1c2luZXNzTG9naWNIb3N0RXhlY3V0b3JUZXN0LmphdmEgYi9jb21tb24vaG9zdC1zaWRlL3V0aWwvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQnVzaW5lc3NMb2dpY0hvc3RFeGVjdXRvclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQwZjlkYS4uMDAwMDAwMAotLS0gYS9jb21tb24vaG9zdC1zaWRlL3V0aWwvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQnVzaW5lc3NMb2dpY0hvc3RFeGVjdXRvclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWw7Ci0KLWltcG9ydCBzdGF0aWMganVuaXQuZnJhbWV3b3JrLkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIGp1bml0LmZyYW1ld29yay5Bc3NlcnQuYXNzZXJ0RmFsc2U7Ci1pbXBvcnQgc3RhdGljIGp1bml0LmZyYW1ld29yay5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLWltcG9ydCBzdGF0aWMganVuaXQuZnJhbWV3b3JrLkFzc2VydC5mYWlsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzdW1lLmFzc3VtZVRydWU7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5idWlsZC5JQnVpbGRJbmZvOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5JVGVzdERldmljZTsKLQotaW1wb3J0IG9yZy5lYXN5bW9jay5FYXN5TW9jazsKLWltcG9ydCBvcmcuanVuaXQuQXNzdW1wdGlvblZpb2xhdGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLkpVbml0NDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnRpb25GYWlsZWRFcnJvcjsKLQotLyoqCi0gKiBUZXN0cyBmb3Ige0BsaW5rIEJ1c2luZXNzTG9naWNIb3N0RXhlY3V0b3J9LgotICovCi1AUnVuV2l0aChKVW5pdDQuY2xhc3MpCi1wdWJsaWMgY2xhc3MgQnVzaW5lc3NMb2dpY0hvc3RFeGVjdXRvclRlc3QgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRISVNfQ0xBU1MgPQotICAgICAgICAgICAgImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQnVzaW5lc3NMb2dpY0hvc3RFeGVjdXRvclRlc3QiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfMSA9IFRISVNfQ0xBU1MgKyAiLm1ldGhvZDEiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfMiA9IFRISVNfQ0xBU1MgKyAiLm1ldGhvZDIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfMyA9IFRISVNfQ0xBU1MgKyAiLm1ldGhvZDMiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfNCA9IFRISVNfQ0xBU1MgKyAiLm1ldGhvZDQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfNSA9IFRISVNfQ0xBU1MgKyAiLm1ldGhvZDUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfNiA9IFRISVNfQ0xBU1MgKyAiLm1ldGhvZDYiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfNyA9IFRISVNfQ0xBU1MgKyAiLm1ldGhvZDciOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfOCA9IFRISVNfQ0xBU1MgKyAiLm1ldGhvZDgiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfOSA9IFRISVNfQ0xBU1MgKyAiLm1ldGhvZDkiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfMTAgPSBUSElTX0NMQVNTICsgIi5tZXRob2QxMCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZBS0VfTUVUSE9EID0gVEhJU19DTEFTUyArICIubWV0aG9kRG9lc250RXhpc3QiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdfU1RSSU5HXzEgPSAiYXJnMSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR19TVFJJTkdfMiA9ICJhcmcyIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPVEhFUl9NRVRIT0RfMSA9IFRISVNfQ0xBU1MgKyAiJE90aGVyQ2xhc3MubWV0aG9kMSI7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBtSW52b2tlZCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBPYmplY3RbXSBtQXJnc1VzZWQgPSBudWxsOwotICAgIHByaXZhdGUgSUJ1aWxkSW5mbyBtTW9ja0J1aWxkOwotICAgIHByaXZhdGUgSVRlc3REZXZpY2UgbU1vY2tEZXZpY2U7Ci0gICAgcHJpdmF0ZSBCdXNpbmVzc0xvZ2ljRXhlY3V0b3IgbUV4ZWN1dG9yOwotCi0gICAgQEJlZm9yZQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgewotICAgICAgICBtTW9ja0J1aWxkID0gRWFzeU1vY2suY3JlYXRlTW9jayhJQnVpbGRJbmZvLmNsYXNzKTsKLSAgICAgICAgbU1vY2tEZXZpY2UgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElUZXN0RGV2aWNlLmNsYXNzKTsKLSAgICAgICAgbUV4ZWN1dG9yID0gbmV3IEJ1c2luZXNzTG9naWNIb3N0RXhlY3V0b3IobU1vY2tEZXZpY2UsIG1Nb2NrQnVpbGQsIHRoaXMpOwotICAgICAgICAvLyByZXNldCB0aGUgaW5zdGFuY2UgdmFyaWFibGVzIHRyYWNraW5nIHRoZSBtZXRob2QgaW52b2tlZCBhbmQgdGhlIGFyZ3MgdXNlZAotICAgICAgICBtSW52b2tlZCA9IG51bGw7Ci0gICAgICAgIG1BcmdzVXNlZCA9IG51bGw7Ci0gICAgICAgIC8vIHJlc2V0IHRoZSBPdGhlckNsYXNzIGNsYXNzIHZhcmlhYmxlIHRyYWNraW5nIHRoZSBtZXRob2QgaW52b2tlZAotICAgICAgICBPdGhlckNsYXNzLm90aGVySW52b2tlZCA9IG51bGw7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlTWV0aG9kSW5UaGlzQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbUV4ZWN1dG9yLmludm9rZU1ldGhvZChNRVRIT0RfMSk7Ci0gICAgICAgIC8vIGFzc2VydCB0aGF0IG1JbnZva2VkIHdhcyBzZXQgZm9yIHRoaXMgQnVzaW5lc3NMb2dpY0RldmljZUV4ZWN1dG9yVGVzdCBpbnN0YW5jZQotICAgICAgICBhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byBpbnZva2UgbWV0aG9kIGluIHRoaXMgY2xhc3MiLCBtSW52b2tlZCwgTUVUSE9EXzEpOwotICAgIH0KLQotICAgICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZva2VNZXRob2RJbk90aGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbUV4ZWN1dG9yLmludm9rZU1ldGhvZChPVEhFUl9NRVRIT0RfMSk7Ci0gICAgICAgIC8vIGFzc2VydCB0aGF0IE90aGVyQ2xhc3MubWV0aG9kMSB3YXMgaW52b2tlZCwgYW5kIHN0YXRpYyBmaWVsZCBvZiBPdGhlckNsYXNzIHdhcyBjaGFuZ2VkCi0gICAgICAgIGFzc2VydEVxdWFscygiRmFpbGVkIHRvIGludm9rZSBtZXRob2QgaW4gb3RoZXIgY2xhc3MiLCBPdGhlckNsYXNzLm90aGVySW52b2tlZCwKLSAgICAgICAgICAgICAgICBPVEhFUl9NRVRIT0RfMSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlTWV0aG9kV2l0aFN0cmluZ0FyZ3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbUV4ZWN1dG9yLmludm9rZU1ldGhvZChNRVRIT0RfMiwgQVJHX1NUUklOR18xLCBBUkdfU1RSSU5HXzIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byBpbnZva2UgbWV0aG9kIGluIHRoaXMgY2xhc3MiLCBtSW52b2tlZCwgTUVUSE9EXzIpOwotICAgICAgICAvLyBhc3NlcnQgYm90aCBTdHJpbmcgYXJndW1lbnRzIHdlcmUgY29ycmVjdGx5IHNldCBmb3IgbWV0aG9kMgotICAgICAgICBhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byBzZXQgZmlyc3QgYXJndW1lbnQiLCBtQXJnc1VzZWRbMF0sIEFSR19TVFJJTkdfMSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRmFpbGVkIHRvIHNldCBzZWNvbmQgYXJndW1lbnQiLCBtQXJnc1VzZWRbMV0sIEFSR19TVFJJTkdfMik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlTWV0aG9kV2l0aFN0cmluZ0FuZERldmljZUFyZ3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbUV4ZWN1dG9yLmludm9rZU1ldGhvZChNRVRIT0RfMywgQVJHX1NUUklOR18xKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJGYWlsZWQgdG8gaW52b2tlIG1ldGhvZCBpbiB0aGlzIGNsYXNzIiwgbUludm9rZWQsIE1FVEhPRF8zKTsKLSAgICAgICAgLy8gYXNzZXJ0IHRoYXQgU3RyaW5nIGFyZyBhbmQgSVRlc3REZXZpY2UgYXJnIHdlcmUgY29ycmVjdGx5IHNldCBmb3IgbWV0aG9kMwotICAgICAgICBhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byBzZXQgZmlyc3QgYXJndW1lbnQiLCBtQXJnc1VzZWRbMF0sIEFSR19TVFJJTkdfMSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRmFpbGVkIHRvIHNldCBzZWNvbmQgYXJndW1lbnQiLCBtQXJnc1VzZWRbMV0sIG1Nb2NrRGV2aWNlKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZva2VNZXRob2RXaXRoRGV2aWNlQW5kU3RyaW5nQXJncygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtRXhlY3V0b3IuaW52b2tlTWV0aG9kKE1FVEhPRF80LCBBUkdfU1RSSU5HXzEpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byBpbnZva2UgbWV0aG9kIGluIHRoaXMgY2xhc3MiLCBtSW52b2tlZCwgTUVUSE9EXzQpOwotICAgICAgICAvLyBMaWtlIHRlc3RJbnZva2VNZXRob2RXaXRoU3RyaW5nQW5kRGV2aWNlQXJncywgYnV0IGZsaXAgdGhlIGFyZ3MgZm9yIG1ldGhvZDQKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJGYWlsZWQgdG8gc2V0IGZpcnN0IGFyZ3VtZW50IiwgbUFyZ3NVc2VkWzBdLCBtTW9ja0RldmljZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRmFpbGVkIHRvIHNldCBzZWNvbmQgYXJndW1lbnQiLCBtQXJnc1VzZWRbMV0sIEFSR19TVFJJTkdfMSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlTWV0aG9kV2l0aFN0cmluZ0FycmF5QXJnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1FeGVjdXRvci5pbnZva2VNZXRob2QoTUVUSE9EXzUsIEFSR19TVFJJTkdfMSwgQVJHX1NUUklOR18yKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJGYWlsZWQgdG8gaW52b2tlIG1ldGhvZCBpbiB0aGlzIGNsYXNzIiwgbUludm9rZWQsIE1FVEhPRF81KTsKLSAgICAgICAgLy8gYXNzZXJ0IGJvdGggU3RyaW5nIGFyZ3VtZW50cyB3ZXJlIGNvcnJlY3RseSBzZXQgZm9yIG1ldGhvZDUKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJGYWlsZWQgdG8gc2V0IGZpcnN0IGFyZ3VtZW50IiwgbUFyZ3NVc2VkWzBdLCBBUkdfU1RSSU5HXzEpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byBzZXQgc2Vjb25kIGFyZ3VtZW50IiwgbUFyZ3NVc2VkWzFdLCBBUkdfU1RSSU5HXzIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEludm9rZU1ldGhvZFdpdGhFbXB0eVN0cmluZ0FycmF5QXJnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1FeGVjdXRvci5pbnZva2VNZXRob2QoTUVUSE9EXzUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byBpbnZva2UgbWV0aG9kIGluIHRoaXMgY2xhc3MiLCBtSW52b2tlZCwgTUVUSE9EXzUpOwotICAgICAgICAvLyBhc3NlcnQgbm8gU3RyaW5nIGFyZ3VtZW50cyB3ZXJlIHNldCBmb3IgbWV0aG9kNQotICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdGx5IHNldCBhcmdzIiwgbUFyZ3NVc2VkLmxlbmd0aCwgMCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlTWV0aG9kV2l0aFN0cmluZ0FuZFN0cmluZ0FycmF5QXJncygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtRXhlY3V0b3IuaW52b2tlTWV0aG9kKE1FVEhPRF82LCBBUkdfU1RSSU5HXzEsIEFSR19TVFJJTkdfMik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRmFpbGVkIHRvIGludm9rZSBtZXRob2QgaW4gdGhpcyBjbGFzcyIsIG1JbnZva2VkLCBNRVRIT0RfNik7Ci0gICAgICAgIC8vIGFzc2VydCBib3RoIFN0cmluZyBhcmd1bWVudHMgd2VyZSBjb3JyZWN0bHkgc2V0IGZvciBtZXRob2Q2Ci0gICAgICAgIGFzc2VydEVxdWFscygiRmFpbGVkIHRvIHNldCBmaXJzdCBhcmd1bWVudCIsIG1BcmdzVXNlZFswXSwgQVJHX1NUUklOR18xKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJGYWlsZWQgdG8gc2V0IHNlY29uZCBhcmd1bWVudCIsIG1BcmdzVXNlZFsxXSwgQVJHX1NUUklOR18yKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZva2VNZXRob2RXaXRoQWxsQXJnVHlwZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbUV4ZWN1dG9yLmludm9rZU1ldGhvZChNRVRIT0RfNywgQVJHX1NUUklOR18xLCBBUkdfU1RSSU5HXzIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byBpbnZva2UgbWV0aG9kIGluIHRoaXMgY2xhc3MiLCBtSW52b2tlZCwgTUVUSE9EXzcpOwotICAgICAgICAvLyBhc3NlcnQgYWxsIGFyZ3VtZW50cyB3ZXJlIGNvcnJlY3RseSBzZXQgZm9yIG1ldGhvZDcKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJGYWlsZWQgdG8gc2V0IGZpcnN0IGFyZ3VtZW50IiwgbUFyZ3NVc2VkWzBdLCBBUkdfU1RSSU5HXzEpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byBzZXQgc2Vjb25kIGFyZ3VtZW50IiwgbUFyZ3NVc2VkWzFdLCBtTW9ja0J1aWxkKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJGYWlsZWQgdG8gc2V0IHNlY29uZCBhcmd1bWVudCIsIG1BcmdzVXNlZFsyXSwgbU1vY2tEZXZpY2UpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byBzZXQgdGhpcmQgYXJndW1lbnQiLCBtQXJnc1VzZWRbM10sIEFSR19TVFJJTkdfMik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlT3ZlcmxvYWRlZE1ldGhvZE9uZUFyZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtRXhlY3V0b3IuaW52b2tlTWV0aG9kKE1FVEhPRF8xLCBBUkdfU1RSSU5HXzEpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byBpbnZva2UgbWV0aG9kIGluIHRoaXMgY2xhc3MiLCBtSW52b2tlZCwgTUVUSE9EXzEpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlNldCB3cm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIiwgbUFyZ3NVc2VkLmxlbmd0aCwgMSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRmFpbGVkIHRvIHNldCBmaXJzdCBhcmd1bWVudCIsIG1BcmdzVXNlZFswXSwgQVJHX1NUUklOR18xKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZva2VPdmVybG9hZGVkTWV0aG9kVHdvQXJncygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtRXhlY3V0b3IuaW52b2tlTWV0aG9kKE1FVEhPRF8xLCBBUkdfU1RSSU5HXzEsIEFSR19TVFJJTkdfMik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRmFpbGVkIHRvIGludm9rZSBtZXRob2QgaW4gdGhpcyBjbGFzcyIsIG1JbnZva2VkLCBNRVRIT0RfMSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiU2V0IHdyb25nIG51bWJlciBvZiBhcmd1bWVudHMiLCBtQXJnc1VzZWQubGVuZ3RoLCAyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJGYWlsZWQgdG8gc2V0IGZpcnN0IGFyZ3VtZW50IiwgbUFyZ3NVc2VkWzBdLCBBUkdfU1RSSU5HXzEpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byBzZXQgc2Vjb25kIGFyZ3VtZW50IiwgbUFyZ3NVc2VkWzFdLCBBUkdfU1RSSU5HXzIpOwotICAgIH0KLQotICAgIEBUZXN0KGV4cGVjdGVkID0gUnVudGltZUV4Y2VwdGlvbi5jbGFzcykKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlTm9uRXhpc3RlbnRNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbUV4ZWN1dG9yLmludm9rZU1ldGhvZChGQUtFX01FVEhPRCwgQVJHX1NUUklOR18xLCBBUkdfU1RSSU5HXzIpOwotICAgIH0KLQotICAgIEBUZXN0KGV4cGVjdGVkID0gUnVudGltZUV4Y2VwdGlvbi5jbGFzcykKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlTWV0aG9kVG9vTWFueUFyZ3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbUV4ZWN1dG9yLmludm9rZU1ldGhvZChNRVRIT0RfMywgQVJHX1NUUklOR18xLCBBUkdfU1RSSU5HXzIpOwotICAgIH0KLQotICAgIEBUZXN0KGV4cGVjdGVkID0gUnVudGltZUV4Y2VwdGlvbi5jbGFzcykKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlTWV0aG9kVG9vRmV3QXJncygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtRXhlY3V0b3IuaW52b2tlTWV0aG9kKE1FVEhPRF8yLCBBUkdfU1RSSU5HXzEpOwotICAgIH0KLQotICAgIEBUZXN0KGV4cGVjdGVkID0gUnVudGltZUV4Y2VwdGlvbi5jbGFzcykKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlTWV0aG9kSW5jb21wYXRpYmxlQXJncygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtRXhlY3V0b3IuaW52b2tlTWV0aG9kKE1FVEhPRF84LCBBUkdfU1RSSU5HXzEpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEV4ZWN1dGVDb25kaXRpb25DaGVja1JldHVyblZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydFRydWUoIldyb25nIHJldHVybiB2YWx1ZSIsCi0gICAgICAgICAgICAgICAgbUV4ZWN1dG9yLmV4ZWN1dGVDb25kaXRpb24oTUVUSE9EXzIsIEFSR19TVFJJTkdfMSwgQVJHX1NUUklOR18xKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJXcm9uZyByZXR1cm4gdmFsdWUiLAotICAgICAgICAgICAgICAgIG1FeGVjdXRvci5leGVjdXRlQ29uZGl0aW9uKE1FVEhPRF8yLCBBUkdfU1RSSU5HXzEsIEFSR19TVFJJTkdfMikpOwotICAgIH0KLQotICAgIEBUZXN0KGV4cGVjdGVkID0gUnVudGltZUV4Y2VwdGlvbi5jbGFzcykKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXhlY3V0ZUludmFsaWRDb25kaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbUV4ZWN1dG9yLmV4ZWN1dGVDb25kaXRpb24oTUVUSE9EXzEpOyAvLyBtZXRob2QxIGRvZXMgbm90IHJldHVybiB0eXBlIGJvb2xlYW4KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RFeGVjdXRlQWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1FeGVjdXRvci5leGVjdXRlQWN0aW9uKE1FVEhPRF8yLCBBUkdfU1RSSU5HXzEsIEFSR19TVFJJTkdfMik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRmFpbGVkIHRvIGludm9rZSBtZXRob2QgaW4gdGhpcyBjbGFzcyIsIG1JbnZva2VkLCBNRVRIT0RfMik7Ci0gICAgICAgIC8vIGFzc2VydCBib3RoIFN0cmluZyBhcmd1bWVudHMgd2VyZSBjb3JyZWN0bHkgc2V0IGZvciBtZXRob2QyCi0gICAgICAgIGFzc2VydEVxdWFscygiRmFpbGVkIHRvIHNldCBmaXJzdCBhcmd1bWVudCIsIG1BcmdzVXNlZFswXSwgQVJHX1NUUklOR18xKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJGYWlsZWQgdG8gc2V0IHNlY29uZCBhcmd1bWVudCIsIG1BcmdzVXNlZFsxXSwgQVJHX1NUUklOR18yKTsKLSAgICB9Ci0KLSAgICBAVGVzdChleHBlY3RlZCA9IFJ1bnRpbWVFeGNlcHRpb24uY2xhc3MpCi0gICAgcHVibGljIHZvaWQgdGVzdEV4ZWN1dGVBY3Rpb25UaHJvd0V4Y2VwdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtRXhlY3V0b3IuZXhlY3V0ZUFjdGlvbihNRVRIT0RfOSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXhlY3V0ZUFjdGlvblZpb2xhdGVBc3N1bXB0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtRXhlY3V0b3IuZXhlY3V0ZUFjdGlvbihNRVRIT0RfMTApOwotICAgICAgICAgICAgLy8gSlVuaXQ0IGRvZXNuJ3Qgc3VwcG9ydCBleHBlY3RpbmcgQXNzdW1wdGlvblZpb2xhdGVkRXhjZXB0aW9uIHdpdGggImV4cGVjdGVkIgotICAgICAgICAgICAgLy8gYXR0cmlidXRlIG9uIEBUZXN0IGFubm90YXRpb24sIHNvIHRlc3QgdXNpbmcgQXNzZXJ0LmZhaWwoKQotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgYXNzdW1wdGlvbiBmYWlsdXJlIik7Ci0gICAgICAgIH0gY2F0Y2ggKEFzc3VtcHRpb25WaW9sYXRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBleHBlY3RlZAotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbWV0aG9kMSgpIHsKLSAgICAgICAgbUludm9rZWQgPSBNRVRIT0RfMTsKLSAgICB9Ci0KLSAgICAvLyBvdmVybG9hZGVkIG1ldGhvZCB3aXRoIG9uZSBhcmcKLSAgICBwdWJsaWMgdm9pZCBtZXRob2QxKFN0cmluZyBhcmcxKSB7Ci0gICAgICAgIG1JbnZva2VkID0gTUVUSE9EXzE7Ci0gICAgICAgIG1BcmdzVXNlZCA9IG5ldyBPYmplY3RbXXthcmcxfTsKLSAgICB9Ci0KLSAgICAvLyBvdmVybG9hZGVkIG1ldGhvZCB3aXRoIHR3byBhcmdzCi0gICAgcHVibGljIHZvaWQgbWV0aG9kMShTdHJpbmcgYXJnMSwgU3RyaW5nIGFyZzIpIHsKLSAgICAgICAgbUludm9rZWQgPSBNRVRIT0RfMTsKLSAgICAgICAgbUFyZ3NVc2VkID0gbmV3IE9iamVjdFtde2FyZzEsIGFyZzJ9OwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIG1ldGhvZDIoU3RyaW5nIGFyZzEsIFN0cmluZyBhcmcyKSB7Ci0gICAgICAgIG1JbnZva2VkID0gTUVUSE9EXzI7Ci0gICAgICAgIG1BcmdzVXNlZCA9IG5ldyBPYmplY3RbXXthcmcxLCBhcmcyfTsKLSAgICAgICAgcmV0dXJuIGFyZzEuZXF1YWxzKGFyZzIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG1ldGhvZDMoU3RyaW5nIGFyZzEsIElUZXN0RGV2aWNlIGFyZzIpIHsKLSAgICAgICAgbUludm9rZWQgPSBNRVRIT0RfMzsKLQotICAgICAgICBtQXJnc1VzZWQgPSBuZXcgT2JqZWN0W117YXJnMSwgYXJnMn07Ci0gICAgfQotCi0gICAgLy8gU2FtZSBhcyBtZXRob2QzLCBidXQgZmxpcHBlZCBhcmdzCi0gICAgcHVibGljIHZvaWQgbWV0aG9kNChJVGVzdERldmljZSBhcmcxLCBTdHJpbmcgYXJnMikgewotICAgICAgICBtSW52b2tlZCA9IE1FVEhPRF80OwotICAgICAgICBtQXJnc1VzZWQgPSBuZXcgT2JqZWN0W117YXJnMSwgYXJnMn07Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbWV0aG9kNShTdHJpbmcuLi4gYXJncykgewotICAgICAgICBtSW52b2tlZCA9IE1FVEhPRF81OwotICAgICAgICBtQXJnc1VzZWQgPSBhcmdzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG1ldGhvZDYoU3RyaW5nIGFyZzEsIFN0cmluZy4uLiBtb3JlQXJncykgewotICAgICAgICBtSW52b2tlZCA9IE1FVEhPRF82OwotICAgICAgICBMaXN0PFN0cmluZz4gYWxsQXJncyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBhbGxBcmdzLmFkZChhcmcxKTsKLSAgICAgICAgYWxsQXJncy5hZGRBbGwoQXJyYXlzLmFzTGlzdChtb3JlQXJncykpOwotICAgICAgICBtQXJnc1VzZWQgPSBhbGxBcmdzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbWV0aG9kNyhTdHJpbmcgYXJnMSwgSUJ1aWxkSW5mbyBhcmcyLCBJVGVzdERldmljZSBhcmczLCBTdHJpbmcuLi4gbW9yZUFyZ3MpIHsKLSAgICAgICAgbUludm9rZWQgPSBNRVRIT0RfNzsKLSAgICAgICAgTGlzdDxPYmplY3Q+IGFsbEFyZ3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgYWxsQXJncy5hZGQoYXJnMSk7Ci0gICAgICAgIGFsbEFyZ3MuYWRkKGFyZzIpOwotICAgICAgICBhbGxBcmdzLmFkZChhcmczKTsKLSAgICAgICAgYWxsQXJncy5hZGRBbGwoQXJyYXlzLmFzTGlzdChtb3JlQXJncykpOwotICAgICAgICBtQXJnc1VzZWQgPSBhbGxBcmdzLnRvQXJyYXkobmV3IE9iamVjdFswXSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbWV0aG9kOChTdHJpbmcgYXJnMSwgSW50ZWdlciBhcmcyKSB7Ci0gICAgICAgIC8vIFRoaXMgbWV0aG9kIHNob3VsZCBuZXZlciBiZSBzdWNjZXNzZnVsbHkgaW52b2tlZCwgc2luY2UgSW50ZWdlciBwYXJhbWV0ZXIgdHlwZXMgYXJlCi0gICAgICAgIC8vIHVuc3VwcG9ydGVkIGZvciB0aGUgQnVzaW5lc3NMb2dpYyBzZXJ2aWNlCi0gICAgfQotCi0gICAgLy8gdGhyb3cgQXNzZXJ0aW9uRmFpbGVkRXJyb3IKLSAgICBwdWJsaWMgdm9pZCBtZXRob2Q5KCkgdGhyb3dzIEFzc2VydGlvbkZhaWxlZEVycm9yIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZShmYWxzZSk7Ci0gICAgfQotCi0gICAgLy8gdGhyb3cgQXNzdW1wdGlvblZpb2xhdGVkRXhjZXB0aW9uCi0gICAgcHVibGljIHZvaWQgbWV0aG9kMTAoKSB0aHJvd3MgQXNzdW1wdGlvblZpb2xhdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzdW1lVHJ1ZShmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBPdGhlckNsYXNzIHsKLQotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBvdGhlckludm9rZWQgPSBudWxsOwotCi0gICAgICAgIHB1YmxpYyB2b2lkIG1ldGhvZDEoKSB7Ci0gICAgICAgICAgICBvdGhlckludm9rZWQgPSBPVEhFUl9NRVRIT0RfMTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9ob3N0LXNpZGUvdXRpbC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9EeW5hbWljQ29uZmlnSGFuZGxlclRlc3QuamF2YSBiL2NvbW1vbi9ob3N0LXNpZGUvdXRpbC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9EeW5hbWljQ29uZmlnSGFuZGxlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk5MmQwYS4uMDAwMDAwMAotLS0gYS9jb21tb24vaG9zdC1zaWRlL3V0aWwvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvRHluYW1pY0NvbmZpZ0hhbmRsZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsOwotCi1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudXRpbC5GaWxlVXRpbDsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC51dGlsLlN0cmVhbVV0aWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIFVuaXQgdGVzdHMgZm9yIHtAbGluayBEeW5hbWljQ29uZmlnSGFuZGxlcn0KLSAqLwotcHVibGljIGNsYXNzIER5bmFtaWNDb25maWdIYW5kbGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTF9DT05GSUcgPQotICAgICAgICAgICAgIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cInV0Zi04XCI/PlxuIiArCi0gICAgICAgICAgICAiPGR5bmFtaWNDb25maWc+XG4iICsKLSAgICAgICAgICAgICIgICAgPGVudHJ5IGtleT1cInRlc3QtY29uZmlnLTFcIj5cbiIgKwotICAgICAgICAgICAgIiAgICAgICAgPHZhbHVlPnRlc3QgY29uZmlnIDE8L3ZhbHVlPlxuIiArCi0gICAgICAgICAgICAiICAgIDwvZW50cnk+XG4iICsKLSAgICAgICAgICAgICIgICAgPGVudHJ5IGtleT1cInRlc3QtY29uZmlnLTJcIj5cbiIgKwotICAgICAgICAgICAgIiAgICAgICAgPHZhbHVlPnRlc3QgY29uZmlnIDI8L3ZhbHVlPlxuIiArCi0gICAgICAgICAgICAiICAgIDwvZW50cnk+XG4iICsKLSAgICAgICAgICAgICIgICAgPGVudHJ5IGtleT1cIm92ZXJyaWRlLWNvbmZpZy0yXCI+XG4iICsKLSAgICAgICAgICAgICIgICAgICAgIDx2YWx1ZT50ZXN0IGNvbmZpZyAzPC92YWx1ZT5cbiIgKwotICAgICAgICAgICAgIiAgICA8L2VudHJ5PlxuIiArCi0gICAgICAgICAgICAiICAgIDxlbnRyeSBrZXk9XCJjb25maWctbGlzdFwiPlxuIiArCi0gICAgICAgICAgICAiICAgICAgICA8dmFsdWU+Y29uZmlnMDwvdmFsdWU+XG4iICsKLSAgICAgICAgICAgICIgICAgICAgIDx2YWx1ZT5jb25maWcxPC92YWx1ZT5cbiIgKwotICAgICAgICAgICAgIiAgICAgICAgPHZhbHVlPmNvbmZpZzI8L3ZhbHVlPlxuIiArCi0gICAgICAgICAgICAiICAgICAgICA8dmFsdWU+Y29uZmlnMzwvdmFsdWU+XG4iICsKLSAgICAgICAgICAgICIgICAgICAgIDx2YWx1ZT5jb25maWc0PC92YWx1ZT5cbiIgKwotICAgICAgICAgICAgIiAgICA8L2VudHJ5PlxuIiArCi0gICAgICAgICAgICAiICAgIDxlbnRyeSBrZXk9XCJvdmVycmlkZS1jb25maWctbGlzdC0yXCI+XG4iICsKLSAgICAgICAgICAgICIgICAgICAgIDx2YWx1ZT5BPC92YWx1ZT5cbiIgKwotICAgICAgICAgICAgIiAgICAgICAgPHZhbHVlPkI8L3ZhbHVlPlxuIiArCi0gICAgICAgICAgICAiICAgICAgICA8dmFsdWU+QzwvdmFsdWU+XG4iICsKLSAgICAgICAgICAgICIgICAgICAgIDx2YWx1ZT5EPC92YWx1ZT5cbiIgKwotICAgICAgICAgICAgIiAgICAgICAgPHZhbHVlPkU8L3ZhbHVlPlxuIiArCi0gICAgICAgICAgICAiICAgIDwvZW50cnk+XG4iICsKLSAgICAgICAgICAgICI8L2R5bmFtaWNDb25maWc+XG4iOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9WRVJSSURFX0pTT04gPQotICAgICAgICAgICAgIntcbiIgKwotICAgICAgICAgICAgIiAgXCJkeW5hbWljQ29uZmlnRW50cmllc1wiOiB7XG4iICsKLSAgICAgICAgICAgICIgICAgXCJvdmVycmlkZS1jb25maWctMVwiOiB7XG4iICsKLSAgICAgICAgICAgICIgICAgICBcImNvbmZpZ1ZhbHVlc1wiOiBbXG4iICsKLSAgICAgICAgICAgICIgICAgICAgIFwib3ZlcnJpZGUtY29uZmlnLXZhbC0xXCJcbiIgKwotICAgICAgICAgICAgIiAgICAgIF1cbiIgKwotICAgICAgICAgICAgIiAgICB9LFxuIiArCi0gICAgICAgICAgICAiICAgIFwib3ZlcnJpZGUtY29uZmlnLTJcIjoge1xuIiArCi0gICAgICAgICAgICAiICAgICAgXCJjb25maWdWYWx1ZXNcIjogW1xuIiArCi0gICAgICAgICAgICAiICAgICAgICBcIm92ZXJyaWRlLWNvbmZpZy12YWwtMlwiXG4iICsKLSAgICAgICAgICAgICIgICAgICBdXG4iICsKLSAgICAgICAgICAgICIgICAgfSxcbiIgKwotICAgICAgICAgICAgIiAgICBcIm92ZXJyaWRlLWNvbmZpZy1saXN0LTFcIjoge1xuIiArCi0gICAgICAgICAgICAiICAgICAgXCJjb25maWdWYWx1ZXNcIjogW1xuIiArCi0gICAgICAgICAgICAiICAgICAgICBcIm92ZXJyaWRlLWNvbmZpZy1saXN0LXZhbC0xLTFcIixcbiIgKwotICAgICAgICAgICAgIiAgICAgICAgXCJvdmVycmlkZS1jb25maWctbGlzdC12YWwtMS0yXCJcbiIgKwotICAgICAgICAgICAgIiAgICAgIF1cbiIgKwotICAgICAgICAgICAgIiAgICB9LFxuIiArCi0gICAgICAgICAgICAiICAgIFwib3ZlcnJpZGUtY29uZmlnLWxpc3QtMlwiOiB7XG4iICsKLSAgICAgICAgICAgICIgICAgICBcImNvbmZpZ1ZhbHVlc1wiOiBbXG4iICsKLSAgICAgICAgICAgICIgICAgICAgIFwib3ZlcnJpZGUtY29uZmlnLWxpc3QtdmFsLTItMVwiXG4iICsKLSAgICAgICAgICAgICIgICAgICBdXG4iICsKLSAgICAgICAgICAgICIgICAgfSxcbiIgKwotICAgICAgICAgICAgIiAgICBcIm92ZXJyaWRlLWNvbmZpZy1saXN0LTNcIjoge1xuIiArCi0gICAgICAgICAgICAiICAgICAgXCJjb25maWdWYWx1ZXNcIjogW1xuIiArCi0gICAgICAgICAgICAiICAgICAgXVxuIiArCi0gICAgICAgICAgICAiICAgIH1cbiIgKwotICAgICAgICAgICAgIiAgfVxuIiArCi0gICAgICAgICAgICAifSI7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RHluYW1pY0NvbmZpZ0hhbmRsZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIG1vZHVsZSA9ICJ0ZXN0MSI7Ci0gICAgICAgIEZpbGUgbG9jYWxDb25maWdGaWxlID0gY3JlYXRlRmlsZUZyb21TdHIoTE9DQUxfQ09ORklHLCBtb2R1bGUpOwotICAgICAgICBGaWxlIG1lcmdlZEZpbGUgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbWVyZ2VkRmlsZSA9IER5bmFtaWNDb25maWdIYW5kbGVyCi0gICAgICAgICAgICAgICAgICAgIC5nZXRNZXJnZWREeW5hbWljQ29uZmlnRmlsZShsb2NhbENvbmZpZ0ZpbGUsIE9WRVJSSURFX0pTT04sIG1vZHVsZSk7Ci0KLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gY29uZmlnTWFwID0gRHluYW1pY0NvbmZpZy5jcmVhdGVDb25maWdNYXAobWVyZ2VkRmlsZSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygib3ZlcnJpZGUtY29uZmlnLXZhbC0xIiwgY29uZmlnTWFwLmdldCgib3ZlcnJpZGUtY29uZmlnLTEiKS5nZXQoMCkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb25maWdNYXAuZ2V0KCJvdmVycmlkZS1jb25maWctbGlzdC0xIikKLSAgICAgICAgICAgICAgICAgICAgLmNvbnRhaW5zKCJvdmVycmlkZS1jb25maWctbGlzdC12YWwtMS0xIikpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb25maWdNYXAuZ2V0KCJvdmVycmlkZS1jb25maWctbGlzdC0xIikKLSAgICAgICAgICAgICAgICAgICAgLmNvbnRhaW5zKCJvdmVycmlkZS1jb25maWctbGlzdC12YWwtMS0yIikpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb25maWdNYXAuZ2V0KCJvdmVycmlkZS1jb25maWctbGlzdC0zIikuc2l6ZSgpID09IDApOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3QgY29uZmlnIDEiLCBjb25maWdNYXAuZ2V0KCJ0ZXN0LWNvbmZpZy0xIikuZ2V0KDApKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoY29uZmlnTWFwLmdldCgiY29uZmlnLWxpc3QiKS5jb250YWlucygiY29uZmlnMiIpKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJvdmVycmlkZS1jb25maWctdmFsLTIiLCBjb25maWdNYXAuZ2V0KCJvdmVycmlkZS1jb25maWctMiIpLmdldCgwKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY29uZmlnTWFwLmdldCgib3ZlcnJpZGUtY29uZmlnLWxpc3QtMiIpLnNpemUoKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGNvbmZpZ01hcC5nZXQoIm92ZXJyaWRlLWNvbmZpZy1saXN0LTIiKQotICAgICAgICAgICAgICAgICAgICAuY29udGFpbnMoIm92ZXJyaWRlLWNvbmZpZy1saXN0LXZhbC0yLTEiKSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBGaWxlVXRpbC5kZWxldGVGaWxlKGxvY2FsQ29uZmlnRmlsZSk7Ci0gICAgICAgICAgICBGaWxlVXRpbC5yZWN1cnNpdmVEZWxldGUobWVyZ2VkRmlsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIEZpbGUgY3JlYXRlRmlsZUZyb21TdHIoU3RyaW5nIGNvbmZpZ1N0ciwgU3RyaW5nIG1vZHVsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZSBmaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZShtb2R1bGUsICJkeW5hbWljIik7Ci0gICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOwotICAgICAgICAgICAgc3RyZWFtLndyaXRlKGNvbmZpZ1N0ci5nZXRCeXRlcygpKTsKLSAgICAgICAgICAgIHN0cmVhbS5mbHVzaCgpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgU3RyZWFtVXRpbC5jbG9zZShzdHJlYW0pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmaWxlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9ob3N0LXNpZGUvdXRpbC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9Ib3N0VW5pdFRlc3RzLmphdmEgYi9jb21tb24vaG9zdC1zaWRlL3V0aWwvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvSG9zdFVuaXRUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjQwOGU0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9ob3N0LXNpZGUvdXRpbC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9Ib3N0VW5pdFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKLQotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKLWltcG9ydCBvcmcuanVuaXQucnVubmVycy5TdWl0ZTsKLWltcG9ydCBvcmcuanVuaXQucnVubmVycy5TdWl0ZS5TdWl0ZUNsYXNzZXM7Ci0vKioKLSAqIEEgdGVzdCBzdWl0ZSBmb3IgYWxsIGhvc3QgdXRpbCB1bml0IHRlc3RzLgotICogPHAvPgotICogQWxsIHRlc3RzIGxpc3RlZCBoZXJlIHNob3VsZCBiZSBzZWxmLWNvbnRhaW5lZCwgYW5kIGRvIG5vdCByZXF1aXJlIGFueSBleHRlcm5hbCBkZXBlbmRlbmNpZXMuCi0gKi8KLUBSdW5XaXRoKFN1aXRlLmNsYXNzKQotQFN1aXRlQ2xhc3Nlcyh7Ci0gICAgQnVzaW5lc3NMb2dpY0hvc3RFeGVjdXRvclRlc3QuY2xhc3MsCi0gICAgRHluYW1pY0NvbmZpZ0hhbmRsZXJUZXN0LmNsYXNzLAotICAgIE1vZHVsZVJlc3VsdFRlc3QuY2xhc3MsCi0gICAgVGVzdEZpbHRlclRlc3QuY2xhc3MsCi19KQotcHVibGljIGNsYXNzIEhvc3RVbml0VGVzdHMgewotICAgIC8vIGVtcHR5IG9uIHB1cnBvc2UKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9ob3N0LXNpZGUvdXRpbC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9Nb2R1bGVSZXN1bHRUZXN0LmphdmEgYi9jb21tb24vaG9zdC1zaWRlL3V0aWwvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvTW9kdWxlUmVzdWx0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzRkMTY4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9ob3N0LXNpZGUvdXRpbC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9Nb2R1bGVSZXN1bHRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnV0aWwuQWJpVXRpbHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLS8qKgotICogVW5pdCB0ZXN0cyBmb3Ige0BsaW5rIE1vZHVsZVJlc3VsdH0KLSAqLwotcHVibGljIGNsYXNzIE1vZHVsZVJlc3VsdFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJNb2R1bGVOYW1lIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV8yID0gIk1vZHVsZU5hbWUyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJJID0gIm1pcHM2NCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gQWJpVXRpbHMuY3JlYXRlSWQoQUJJLCBOQU1FKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfMiA9IEFiaVV0aWxzLmNyZWF0ZUlkKEFCSSwgTkFNRV8yKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1MgPSAiYW5kcm9pZC50ZXN0LkZvb3JCYXIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU18yID0gImFuZHJvaWQudGVzdC5Gb29yQmFyMiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF8xID0gInRlc3RCbGFoMSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF8yID0gInRlc3RCbGFoMiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF8zID0gInRlc3RCbGFoMyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQUNLX1RSQUNFID0gIlNvbWV0aGluZyBzbWFsbCBpcyBub3QgYWxyaWdodFxuICIgKwotICAgICAgICAgICAgImF0IGZvdXIuYmlnLmluc2VjdHMuTWFybGV5LnNpbmcoTWFybGV5LmphdmE6MTApIjsKLSAgICBwcml2YXRlIE1vZHVsZVJlc3VsdCBtUmVzdWx0OwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbVJlc3VsdCA9IG5ldyBNb2R1bGVSZXN1bHQoSUQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1SZXN1bHQgPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NvcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgbW9kdWxlIElEIiwgSUQsIG1SZXN1bHQuZ2V0SWQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IG1vZHVsZSBBQkkiLCBBQkksIG1SZXN1bHQuZ2V0QWJpKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBtb2R1bGUgbmFtZSIsIE5BTUUsIG1SZXN1bHQuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzdWx0Q3JlYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSUNhc2VSZXN1bHQgY2FzZVJlc3VsdCA9IG1SZXN1bHQuZ2V0T3JDcmVhdGVSZXN1bHQoQ0xBU1MpOwotICAgICAgICAvLyBTaG91bGQgY3JlYXRlIG9uZQotICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIG9uZSByZXN1bHQiLCAxLCBtUmVzdWx0LmdldFJlc3VsdHMoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCB0ZXN0IHJlc3VsdCIsIG1SZXN1bHQuZ2V0UmVzdWx0cygpLmNvbnRhaW5zKGNhc2VSZXN1bHQpKTsKLSAgICAgICAgLy8gU2hvdWxkIG5vdCBjcmVhdGUgYW5vdGhlciBvbmUKLSAgICAgICAgSUNhc2VSZXN1bHQgY2FzZVJlc3VsdDIgPSBtUmVzdWx0LmdldE9yQ3JlYXRlUmVzdWx0KENMQVNTKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCB0aGUgc2FtZSByZXN1bHQiLCBjYXNlUmVzdWx0LCBjYXNlUmVzdWx0Mik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRXhwZWN0ZWQgb25lIHJlc3VsdCIsIDEsIG1SZXN1bHQuZ2V0UmVzdWx0cygpLnNpemUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvdW50UmVzdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBJQ2FzZVJlc3VsdCB0ZXN0Q2FzZSA9IG1SZXN1bHQuZ2V0T3JDcmVhdGVSZXN1bHQoQ0xBU1MpOwotICAgICAgICB0ZXN0Q2FzZS5nZXRPckNyZWF0ZVJlc3VsdChNRVRIT0RfMSkuZmFpbGVkKFNUQUNLX1RSQUNFKTsKLSAgICAgICAgdGVzdENhc2UuZ2V0T3JDcmVhdGVSZXN1bHQoTUVUSE9EXzIpLmZhaWxlZChTVEFDS19UUkFDRSk7Ci0gICAgICAgIHRlc3RDYXNlLmdldE9yQ3JlYXRlUmVzdWx0KE1FVEhPRF8zKS5wYXNzZWQobnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRXhwZWN0ZWQgdHdvIGZhaWx1cmVzIiwgMiwgbVJlc3VsdC5jb3VudFJlc3VsdHMoVGVzdFN0YXR1cy5GQUlMKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRXhwZWN0ZWQgb25lIHBhc3MiLCAxLCBtUmVzdWx0LmNvdW50UmVzdWx0cyhUZXN0U3RhdHVzLlBBU1MpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWVyZ2VNb2R1bGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSUNhc2VSZXN1bHQgY2FzZVJlc3VsdCA9IG1SZXN1bHQuZ2V0T3JDcmVhdGVSZXN1bHQoQ0xBU1MpOwotICAgICAgICBjYXNlUmVzdWx0LmdldE9yQ3JlYXRlUmVzdWx0KE1FVEhPRF8xKS5mYWlsZWQoU1RBQ0tfVFJBQ0UpOwotICAgICAgICBjYXNlUmVzdWx0LmdldE9yQ3JlYXRlUmVzdWx0KE1FVEhPRF8zKS5wYXNzZWQobnVsbCk7Ci0KLSAgICAgICAgSUNhc2VSZXN1bHQgY2FzZVJlc3VsdDIgPSBtUmVzdWx0LmdldE9yQ3JlYXRlUmVzdWx0KENMQVNTXzIpOwotICAgICAgICBjYXNlUmVzdWx0Mi5nZXRPckNyZWF0ZVJlc3VsdChNRVRIT0RfMSkuZmFpbGVkKFNUQUNLX1RSQUNFKTsKLSAgICAgICAgY2FzZVJlc3VsdDIuZ2V0T3JDcmVhdGVSZXN1bHQoTUVUSE9EXzMpLnBhc3NlZChudWxsKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIHR3byByZXN1bHRzIiwgMiwgbVJlc3VsdC5nZXRSZXN1bHRzKCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgdGVzdCByZXN1bHQiLCBtUmVzdWx0LmdldFJlc3VsdHMoKS5jb250YWlucyhjYXNlUmVzdWx0KSk7Ci0gICAgICAgIGFzc2VydFRydWUoIkV4cGVjdGVkIHRlc3QgcmVzdWx0IiwgbVJlc3VsdC5nZXRSZXN1bHRzKCkuY29udGFpbnMoY2FzZVJlc3VsdDIpKTsKLQotICAgICAgICBNb2R1bGVSZXN1bHQgb3RoZXJSZXN1bHQgPSBuZXcgTW9kdWxlUmVzdWx0KElEKTsKLSAgICAgICAgLy8gU2FtZSBjbGFzcyBidXQgYWxsIHBhc3NpbmcgdGVzdHMKLSAgICAgICAgSUNhc2VSZXN1bHQgb3RoZXJDYXNlUmVzdWx0ID0gb3RoZXJSZXN1bHQuZ2V0T3JDcmVhdGVSZXN1bHQoQ0xBU1MpOwotICAgICAgICBvdGhlckNhc2VSZXN1bHQuZ2V0T3JDcmVhdGVSZXN1bHQoTUVUSE9EXzEpLnBhc3NlZChudWxsKTsKLSAgICAgICAgb3RoZXJDYXNlUmVzdWx0LmdldE9yQ3JlYXRlUmVzdWx0KE1FVEhPRF8yKS5wYXNzZWQobnVsbCk7Ci0gICAgICAgIG90aGVyQ2FzZVJlc3VsdC5nZXRPckNyZWF0ZVJlc3VsdChNRVRIT0RfMykucGFzc2VkKG51bGwpOwotICAgICAgICBvdGhlclJlc3VsdC5zZXREb25lKHRydWUpOwotCi0gICAgICAgIG1SZXN1bHQubWVyZ2VGcm9tKG90aGVyUmVzdWx0KTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIHR3byByZXN1bHRzIiwgMiwgbVJlc3VsdC5nZXRSZXN1bHRzKCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgdGVzdCByZXN1bHQiLCBtUmVzdWx0LmdldFJlc3VsdHMoKS5jb250YWlucyhjYXNlUmVzdWx0KSk7Ci0gICAgICAgIGFzc2VydFRydWUoIkV4cGVjdGVkIHRlc3QgcmVzdWx0IiwgbVJlc3VsdC5nZXRSZXN1bHRzKCkuY29udGFpbnMoY2FzZVJlc3VsdDIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShtUmVzdWx0LmlzRG9uZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0RG9uZSgpIHsKLSAgICAgICAgYXNzZXJ0RmFsc2UobVJlc3VsdC5pc0RvbmUoKSk7Ci0gICAgICAgIG1SZXN1bHQuc2V0RG9uZSh0cnVlKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShtUmVzdWx0LmlzRG9uZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWVyZ2VNb2R1bGVfbWlzbWF0Y2hlZE1vZHVsZUlkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgTW9kdWxlUmVzdWx0IG90aGVyUmVzdWx0ID0gbmV3IE1vZHVsZVJlc3VsdChJRF8yKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1SZXN1bHQubWVyZ2VGcm9tKG90aGVyUmVzdWx0KTsKLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIElsbGVnbEFyZ3VtZW50RXhjZXB0aW9uIik7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleHBlY3RlZCkge30KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vaG9zdC1zaWRlL3V0aWwvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvVGVzdEZpbHRlclRlc3QuamF2YSBiL2NvbW1vbi9ob3N0LXNpZGUvdXRpbC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9UZXN0RmlsdGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzEwOTFiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9ob3N0LXNpZGUvdXRpbC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9UZXN0RmlsdGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0vKioKLSAqIFVuaXQgdGVzdHMgZm9yIHtAbGluayBUZXN0RmlsdGVyfQotICovCi1wdWJsaWMgY2xhc3MgVGVzdEZpbHRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJNb2R1bGVOYW1lIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJJID0gIm1pcHM2NCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1QgPSAiY29tLmFuZHJvaWQuZm9vYmFyLkJsYWgjdGVzdEFsbFRoZVRoaW5ncyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRklMVEVSID0gU3RyaW5nLmZvcm1hdCgiJXMiLCBOQU1FKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJJX05BTUVfRklMVEVSID0gU3RyaW5nLmZvcm1hdCgiJXMgJXMiLCBBQkksIE5BTUUpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1RFU1RfRklMVEVSID0gU3RyaW5nLmZvcm1hdCgiJXMgJXMiLCBOQU1FLCBURVNUKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlVMTF9GSUxURVIgPSBTdHJpbmcuZm9ybWF0KCIlcyAlcyAlcyIsIEFCSSwgTkFNRSwgVEVTVCk7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VOYW1lRmlsdGVyKCkgewotICAgICAgICBUZXN0RmlsdGVyIGZpbHRlciA9IFRlc3RGaWx0ZXIuY3JlYXRlRnJvbShOQU1FX0ZJTFRFUik7Ci0gICAgICAgIGFzc2VydE51bGwoIkluY29ycmVjdCBhYmkiLCBmaWx0ZXIuZ2V0QWJpKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBuYW1lIiwgTkFNRSwgZmlsdGVyLmdldE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydE51bGwoIkluY29ycmVjdCB0ZXN0IiwgZmlsdGVyLmdldFRlc3QoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBhcnNlQWJpTmFtZUZpbHRlcigpIHsKLSAgICAgICAgVGVzdEZpbHRlciBmaWx0ZXIgPSBUZXN0RmlsdGVyLmNyZWF0ZUZyb20oQUJJX05BTUVfRklMVEVSKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgYWJpIiwgQUJJLCBmaWx0ZXIuZ2V0QWJpKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBuYW1lIiwgTkFNRSwgZmlsdGVyLmdldE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydE51bGwoIkluY29ycmVjdCB0ZXN0IiwgZmlsdGVyLmdldFRlc3QoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBhcnNlTmFtZVRlc3RGaWx0ZXIoKSB7Ci0gICAgICAgIFRlc3RGaWx0ZXIgZmlsdGVyID0gVGVzdEZpbHRlci5jcmVhdGVGcm9tKE5BTUVfVEVTVF9GSUxURVIpOwotICAgICAgICBhc3NlcnROdWxsKCJJbmNvcnJlY3QgYWJpIiwgZmlsdGVyLmdldEFiaSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgbmFtZSIsIE5BTUUsIGZpbHRlci5nZXROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCB0ZXN0IiwgVEVTVCwgZmlsdGVyLmdldFRlc3QoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBhcnNlRnVsbEZpbHRlcigpIHsKLSAgICAgICAgVGVzdEZpbHRlciBmaWx0ZXIgPSBUZXN0RmlsdGVyLmNyZWF0ZUZyb20oRlVMTF9GSUxURVIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBhYmkiLCBBQkksIGZpbHRlci5nZXRBYmkoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IG5hbWUiLCBOQU1FLCBmaWx0ZXIuZ2V0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgdGVzdCIsIFRFU1QsIGZpbHRlci5nZXRUZXN0KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVOYW1lRmlsdGVyKCkgewotICAgICAgICBUZXN0RmlsdGVyIGZpbHRlciA9IG5ldyBUZXN0RmlsdGVyKG51bGwsIE5BTUUsIG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBmaWx0ZXIiLCBOQU1FX0ZJTFRFUiwgZmlsdGVyLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVBYmlOYW1lRmlsdGVyKCkgewotICAgICAgICBUZXN0RmlsdGVyIGZpbHRlciA9IG5ldyBUZXN0RmlsdGVyKEFCSSwgTkFNRSwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IGZpbHRlciIsIEFCSV9OQU1FX0ZJTFRFUiwgZmlsdGVyLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVOYW1lVGVzdEZpbHRlcigpIHsKLSAgICAgICAgVGVzdEZpbHRlciBmaWx0ZXIgPSBuZXcgVGVzdEZpbHRlcihudWxsLCBOQU1FLCBURVNUKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZmlsdGVyIiwgTkFNRV9URVNUX0ZJTFRFUiwgZmlsdGVyLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVGdWxsRmlsdGVyKCkgewotICAgICAgICBUZXN0RmlsdGVyIGZpbHRlciA9IG5ldyBUZXN0RmlsdGVyKEFCSSwgTkFNRSwgVEVTVCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IGZpbHRlciIsIEZVTExfRklMVEVSLCBmaWx0ZXIudG9TdHJpbmcoKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdXRpbC9BbmRyb2lkLm1rIGIvY29tbW9uL3V0aWwvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVjNWY1YS4uMDAwMDAwMAotLS0gYS9jb21tb24vdXRpbC9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQnVpbGQgdGhlIGNvbW1vbiB1dGlsaXR5IGxpYnJhcnkgZm9yIHVzZSBkZXZpY2Utc2lkZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfTU9EVUxFIDo9IGNvbXBhdGliaWxpdHktY29tbW9uLXV0aWwtZGV2aWNlc2lkZWxpYgotCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gZ3VhdmEganVuaXQKLQotTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAotCi1pbmNsdWRlICQoQlVJTERfU1RBVElDX0pBVkFfTElCUkFSWSkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCdWlsZCB0aGUgY29tbW9uIHV0aWxpdHkgbGlicmFyeSBmb3IgdXNlIGhvc3Qtc2lkZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9NT0RVTEUgOj0gY29tcGF0aWJpbGl0eS1jb21tb24tdXRpbC1ob3N0c2lkZWxpYgotCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gIGd1YXZhbGliIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganNvbi1wcmVidWlsdCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1bml0LWhvc3QgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBreG1sMi0yLjMuMCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtLXRlc3QtYW5ub3RhdGlvbnMtaG9zdAotaW5jbHVkZSBjdHMvZXJyb3JfcHJvbmVfcnVsZXMubWsKLWluY2x1ZGUgJChCVUlMRF9IT1NUX0pBVkFfTElCUkFSWSkKLQotaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQpkaWZmIC0tZ2l0IGEvY29tbW9uL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQWJpVXRpbHMuamF2YSBiL2NvbW1vbi91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0FiaVV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5YzgyYjcuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQWJpVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIGhhbmRsaW5nIGRldmljZSBBQklzCi0gKi8KLXB1YmxpYyBjbGFzcyBBYmlVdGlscyB7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgdW5pcXVlIGlkIGZyb20gdGhlIGdpdmVuIEFCSSBhbmQgbmFtZS4KLSAgICAgKiBAcGFyYW0gYWJpIFRoZSBBQkkgdG8gdXNlLgotICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIHRvIHVzZS4KLSAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgYSBydW4uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlSWQoU3RyaW5nIGFiaSwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIiVzICVzIiwgYWJpLCBuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBhYmkgcG9ydGlvbiBvZiB0aGUgdGVzdCBpZC4KLSAgICAgKiAgICAgICAgIGUuZy4gYXJtZWFiaS12N2EgYW5kcm9pZC5teXRlc3QgPSBhcm1lYWJpLXY3YQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhcnNlQWJpKFN0cmluZyBpZCkgewotICAgICAgICByZXR1cm4gcGFyc2VJZChpZClbMF07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2VzIGEgdW5pcXVlIGlkIGludG8gdGhlIEFCSSBhbmQgbmFtZS4KLSAgICAgKiBAcGFyYW0gaWQgVGhlIGlkIHRvIHBhcnNlLgotICAgICAqIEByZXR1cm4gYSBzdHJpbmcgYXJyYXkgY29udGFpbmluZyB0aGUgQUJJIGFuZCBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gcGFyc2VJZChTdHJpbmcgaWQpIHsKLSAgICAgICAgaWYgKGlkID09IG51bGwgfHwgIWlkLmNvbnRhaW5zKCIgIikpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10geyIiLCAiIn07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlkLnNwbGl0KCIgIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgdGVzdCBuYW1lIHBvcnRpb24gb2YgdGhlIHRlc3QgaWQuCi0gICAgICogICAgICAgICBlLmcuIGFybWVhYmktdjdhIGFuZHJvaWQubXl0ZXN0ID0gYW5kcm9pZC5teXRlc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBwYXJzZVRlc3ROYW1lKFN0cmluZyBpZCkgewotICAgICAgICByZXR1cm4gcGFyc2VJZChpZClbMV07Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9CdXNpbmVzc0xvZ2ljLmphdmEgYi9jb21tb24vdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9CdXNpbmVzc0xvZ2ljLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkYWIxZWIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQnVzaW5lc3NMb2dpYy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEhlbHBlciBhbmQgY29uc3RhbnRzIGFjY2Vzc2libGUgdG8gaG9zdCBhbmQgZGV2aWNlIGNvbXBvbmVudHMgdGhhdCBlbmFibGUgQnVzaW5lc3MgTG9naWMKLSAqIGNvbmZpZ3VyYXRpb24KLSAqLwotcHVibGljIGNsYXNzIEJ1c2luZXNzTG9naWMgewotCi0gICAgLy8gRGV2aWNlIGxvY2F0aW9uIHRvIHdoaWNoIGJ1c2luZXNzIGxvZ2ljIGRhdGEgaXMgcHVzaGVkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVWSUNFX0ZJTEUgPSAiL3NkY2FyZC9ibCI7Ci0KLSAgICAvKiBBIG1hcCBmcm9tIHRlc3RjYXNlIG5hbWUgdG8gdGhlIGJ1c2luZXNzIGxvZ2ljIHJ1bGVzIGZvciB0aGUgdGVzdCBjYXNlICovCi0gICAgcHJvdGVjdGVkIE1hcDxTdHJpbmcsIExpc3Q8QnVzaW5lc3NMb2dpY1J1bGU+PiBtUnVsZXM7Ci0KLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYnVzaW5lc3MgbG9naWMgZXhpc3RzIGZvciBhIGdpdmVuIHRlc3QgbmFtZQotICAgICAqIEBwYXJhbSB0ZXN0TmFtZSB0aGUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlLCBwcmVmaXhlZCBieSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSwgdGhlbiAnIycuCi0gICAgICogRm9yIGV4YW1wbGUsICJjb20uYW5kcm9pZC5mb28uRm9vVGVzdCN0ZXN0Rm9vIgotICAgICAqIEByZXR1cm4gd2hldGhlciBidXNpbmVzcyBsb2dpYyBleGlzdHMgZm9yIHRoaXMgdGVzdCBmb3IgdGhpcyBzdWl0ZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc0xvZ2ljRm9yKFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBMaXN0PEJ1c2luZXNzTG9naWNSdWxlPiBydWxlcyA9IG1SdWxlcy5nZXQodGVzdE5hbWUpOwotICAgICAgICByZXR1cm4gcnVsZXMgIT0gbnVsbCAmJiAhcnVsZXMuaXNFbXB0eSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFwcGx5IGJ1c2luZXNzIGxvZ2ljIGZvciB0aGUgZ2l2ZW4gdGVzdC4KLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUgdGhlIG5hbWUgb2YgdGhlIHRlc3QgY2FzZSwgcHJlZml4ZWQgYnkgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUsIHRoZW4gJyMnLgotICAgICAqIEZvciBleGFtcGxlLCAiY29tLmFuZHJvaWQuZm9vLkZvb1Rlc3QjdGVzdEZvbyIKLSAgICAgKiBAcGFyYW0gZXhlY3V0b3IgYSB7QGxpbmsgQnVzaW5lc3NMb2dpY0V4ZWN1dG9yfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFwcGx5TG9naWNGb3IoU3RyaW5nIHRlc3ROYW1lLCBCdXNpbmVzc0xvZ2ljRXhlY3V0b3IgZXhlY3V0b3IpIHsKLSAgICAgICAgTGlzdDxCdXNpbmVzc0xvZ2ljUnVsZT4gcnVsZXMgPSBtUnVsZXMuZ2V0KHRlc3ROYW1lKTsKLSAgICAgICAgaWYgKHJ1bGVzID09IG51bGwgfHwgcnVsZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChCdXNpbmVzc0xvZ2ljUnVsZSBydWxlIDogcnVsZXMpIHsKLSAgICAgICAgICAgIC8vIENoZWNrIGNvbmRpdGlvbnMKLSAgICAgICAgICAgIGlmIChydWxlLmludm9rZUNvbmRpdGlvbnMoZXhlY3V0b3IpKSB7Ci0gICAgICAgICAgICAgICAgcnVsZS5pbnZva2VBY3Rpb25zKGV4ZWN1dG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5lc3RlZCBjbGFzcyByZXByZXNlbnRpbmcgYW4gQnVzaW5lc3MgTG9naWMgUnVsZS4gU3RvcmVzIGEgY29sbGVjdGlvbiBvZiBjb25kaXRpb25zCi0gICAgICogYW5kIGFjdGlvbnMgZm9yIGxhdGVyIGludm9rYXRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBCdXNpbmVzc0xvZ2ljUnVsZSB7Ci0KLSAgICAgICAgLyogU3RvcmVkIGNvbmRpdGlvbnMgYW5kIGFjdGlvbnMgKi8KLSAgICAgICAgcHJvdGVjdGVkIExpc3Q8QnVzaW5lc3NMb2dpY1J1bGVDb25kaXRpb24+IG1Db25kaXRpb25zOwotICAgICAgICBwcm90ZWN0ZWQgTGlzdDxCdXNpbmVzc0xvZ2ljUnVsZUFjdGlvbj4gbUFjdGlvbnM7Ci0KLSAgICAgICAgcHVibGljIEJ1c2luZXNzTG9naWNSdWxlKExpc3Q8QnVzaW5lc3NMb2dpY1J1bGVDb25kaXRpb24+IGNvbmRpdGlvbnMsCi0gICAgICAgICAgICAgICAgTGlzdDxCdXNpbmVzc0xvZ2ljUnVsZUFjdGlvbj4gYWN0aW9ucykgewotICAgICAgICAgICAgbUNvbmRpdGlvbnMgPSBjb25kaXRpb25zOwotICAgICAgICAgICAgbUFjdGlvbnMgPSBhY3Rpb25zOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIE1ldGhvZCB0aGF0IGludm9rZXMgYWxsIEJ1c2luZXNzIExvZ2ljIGNvbmRpdGlvbnMgZm9yIHRoaXMgcnVsZSwgYW5kIHJldHVybnMgdHJ1ZQotICAgICAgICAgKiBpZiBhbGwgY29uZGl0aW9ucyBldmFsdWF0ZSB0byB0cnVlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaW52b2tlQ29uZGl0aW9ucyhCdXNpbmVzc0xvZ2ljRXhlY3V0b3IgZXhlY3V0b3IpIHsKLSAgICAgICAgICAgIGZvciAoQnVzaW5lc3NMb2dpY1J1bGVDb25kaXRpb24gY29uZGl0aW9uIDogbUNvbmRpdGlvbnMpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWNvbmRpdGlvbi5pbnZva2UoZXhlY3V0b3IpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBNZXRob2QgdGhhdCBpbnZva2VzIGFsbCBCdXNpbmVzcyBMb2dpYyBhY3Rpb25zIGZvciB0aGlzIHJ1bGUKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIGludm9rZUFjdGlvbnMoQnVzaW5lc3NMb2dpY0V4ZWN1dG9yIGV4ZWN1dG9yKSB7Ci0gICAgICAgICAgICBmb3IgKEJ1c2luZXNzTG9naWNSdWxlQWN0aW9uIGFjdGlvbiA6IG1BY3Rpb25zKSB7Ci0gICAgICAgICAgICAgICAgYWN0aW9uLmludm9rZShleGVjdXRvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOZXN0ZWQgY2xhc3MgcmVwcmVzZW50aW5nIGFuIEJ1c2luZXNzIExvZ2ljIFJ1bGUgQ29uZGl0aW9uLiBTdG9yZXMgdGhlIG5hbWUgb2YgYSBtZXRob2QKLSAgICAgKiB0byBpbnZva2UsIGFzIHdlbGwgYXMgU3RyaW5nIGFyZ3MgdG8gdXNlIGR1cmluZyBpbnZva2F0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgQnVzaW5lc3NMb2dpY1J1bGVDb25kaXRpb24gewotCi0gICAgICAgIC8qIFN0b3JlZCBtZXRob2QgbmFtZSBhbmQgU3RyaW5nIGFyZ3MgKi8KLSAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBtTWV0aG9kTmFtZTsKLSAgICAgICAgcHJvdGVjdGVkIExpc3Q8U3RyaW5nPiBtTWV0aG9kQXJnczsKLSAgICAgICAgLyogV2hldGhlciBvciBub3QgdGhlIGJvb2xlYW4gcmVzdWx0IG9mIHRoaXMgY29uZGl0aW9uIHNob3VsZCBiZSByZXZlcnNlZCAqLwotICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtTmVnYXRlZDsKLQotCi0gICAgICAgIHB1YmxpYyBCdXNpbmVzc0xvZ2ljUnVsZUNvbmRpdGlvbihTdHJpbmcgbWV0aG9kTmFtZSwgTGlzdDxTdHJpbmc+IG1ldGhvZEFyZ3MsCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBuZWdhdGVkKSB7Ci0gICAgICAgICAgICBtTWV0aG9kTmFtZSA9IG1ldGhvZE5hbWU7Ci0gICAgICAgICAgICBtTWV0aG9kQXJncyA9IG1ldGhvZEFyZ3M7Ci0gICAgICAgICAgICBtTmVnYXRlZCA9IG5lZ2F0ZWQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogSW52b2tlIHRoaXMgQnVzaW5lc3MgTG9naWMgY29uZGl0aW9uIHdpdGggYW4gZXhlY3V0b3IuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpbnZva2UoQnVzaW5lc3NMb2dpY0V4ZWN1dG9yIGV4ZWN1dG9yKSB7Ci0gICAgICAgICAgICAvLyBYT1IgdGhlIG5lZ2F0ZWQgYm9vbGVhbiB3aXRoIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIG1ldGhvZAotICAgICAgICAgICAgcmV0dXJuIChtTmVnYXRlZCAhPSBleGVjdXRvci5leGVjdXRlQ29uZGl0aW9uKG1NZXRob2ROYW1lLAotICAgICAgICAgICAgICAgICAgICBtTWV0aG9kQXJncy50b0FycmF5KG5ldyBTdHJpbmdbbU1ldGhvZEFyZ3Muc2l6ZSgpXSkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5lc3RlZCBjbGFzcyByZXByZXNlbnRpbmcgYW4gQnVzaW5lc3MgTG9naWMgUnVsZSBBY3Rpb24uIFN0b3JlcyB0aGUgbmFtZSBvZiBhIG1ldGhvZAotICAgICAqIHRvIGludm9rZSwgYXMgd2VsbCBhcyBTdHJpbmcgYXJncyB0byB1c2UgZHVyaW5nIGludm9rYXRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBCdXNpbmVzc0xvZ2ljUnVsZUFjdGlvbiB7Ci0KLSAgICAgICAgLyogU3RvcmVkIG1ldGhvZCBuYW1lIGFuZCBTdHJpbmcgYXJncyAqLwotICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIG1NZXRob2ROYW1lOwotICAgICAgICBwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IG1NZXRob2RBcmdzOwotCi0gICAgICAgIHB1YmxpYyBCdXNpbmVzc0xvZ2ljUnVsZUFjdGlvbihTdHJpbmcgbWV0aG9kTmFtZSwgTGlzdDxTdHJpbmc+IG1ldGhvZEFyZ3MpIHsKLSAgICAgICAgICAgIG1NZXRob2ROYW1lID0gbWV0aG9kTmFtZTsKLSAgICAgICAgICAgIG1NZXRob2RBcmdzID0gbWV0aG9kQXJnczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBJbnZva2UgdGhpcyBCdXNpbmVzcyBMb2dpYyBhY3Rpb24gd2l0aCBhbiBleGVjdXRvci4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIGludm9rZShCdXNpbmVzc0xvZ2ljRXhlY3V0b3IgZXhlY3V0b3IpIHsKLSAgICAgICAgICAgIGV4ZWN1dG9yLmV4ZWN1dGVBY3Rpb24obU1ldGhvZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgIG1NZXRob2RBcmdzLnRvQXJyYXkobmV3IFN0cmluZ1ttTWV0aG9kQXJncy5zaXplKCldKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9CdXNpbmVzc0xvZ2ljRXhlY3V0b3IuamF2YSBiL2NvbW1vbi91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0J1c2luZXNzTG9naWNFeGVjdXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzQyODU4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0J1c2luZXNzTG9naWNFeGVjdXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5qdW5pdC5Bc3N1bXB0aW9uVmlvbGF0ZWRFeGNlcHRpb247Ci0KLS8qKgotICogUmVzb2x2ZXMgbWV0aG9kcyBwcm92aWRlZCBieSB0aGUgQnVzaW5lc3NMb2dpY1NlcnZpY2UgYW5kIGludm9rZXMgdGhlbQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQnVzaW5lc3NMb2dpY0V4ZWN1dG9yIHsKLQotICAgIC8qKiBTdHJpbmcgcmVwcmVzZW50YXRpb25zIG9mIHRoZSBTdHJpbmcgY2xhc3MgYW5kIFN0cmluZ1tdIGNsYXNzICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSSU5HX0NMQVNTID0gImphdmEubGFuZy5TdHJpbmciOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUklOR19BUlJBWV9DTEFTUyA9ICJbTGphdmEubGFuZy5TdHJpbmc7IjsKLQotICAgIC8qKgotICAgICAqIEV4ZWN1dGUgYSBidXNpbmVzcyBsb2dpYyBjb25kaXRpb24uCi0gICAgICogQHBhcmFtIG1ldGhvZCB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIHRvIGludm9rZS4gTXVzdCBpbmNsdWRlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZQotICAgICAqIGVuY2xvc2luZyBjbGFzcywgZm9sbG93ZWQgYnkgJy4nLCBmb2xsb3dlZCBieSB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kCi0gICAgICogQHBhcmFtIGFyZ3MgdGhlIHN0cmluZyBhcmd1bWVudHMgdG8gc3VwcGx5IHRvIHRoZSBtZXRob2QKLSAgICAgKiBAcmV0dXJuIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIG1ldGhvZCBpbnZva2VkCi0gICAgICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHdoZW4gZmFpbGluZyB0byByZXNvbHZlIG9yIGludm9rZSB0aGUgY29uZGl0aW9uIG1ldGhvZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGV4ZWN1dGVDb25kaXRpb24oU3RyaW5nIG1ldGhvZCwgU3RyaW5nLi4uIGFyZ3MpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiAoQm9vbGVhbikgaW52b2tlTWV0aG9kKG1ldGhvZCwgYXJncyk7Ci0gICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gfCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB8Ci0gICAgICAgICAgICAgICAgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB8IE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAiQnVzaW5lc3NMb2dpYzogRmFpbGVkIHRvIGludm9rZSBjb25kaXRpb24gbWV0aG9kICVzIHdpdGggYXJnczogJXMiLCBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgIEFycmF5cy50b1N0cmluZyhhcmdzKSksIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXhlY3V0ZSBhIGJ1c2luZXNzIGxvZ2ljIGFjdGlvbi4KLSAgICAgKiBAcGFyYW0gbWV0aG9kIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QgdG8gaW52b2tlLiBNdXN0IGluY2x1ZGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlCi0gICAgICogZW5jbG9zaW5nIGNsYXNzLCBmb2xsb3dlZCBieSAnLicsIGZvbGxvd2VkIGJ5IHRoZSBuYW1lIG9mIHRoZSBtZXRob2QKLSAgICAgKiBAcGFyYW0gYXJncyB0aGUgc3RyaW5nIGFyZ3VtZW50cyB0byBzdXBwbHkgdG8gdGhlIG1ldGhvZAotICAgICAqIEB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB3aGVuIGZhaWxpbmcgdG8gcmVzb2x2ZSBvciBpbnZva2UgdGhlIGFjdGlvbiBtZXRob2QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlQWN0aW9uKFN0cmluZyBtZXRob2QsIFN0cmluZy4uLiBhcmdzKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbnZva2VNZXRob2QobWV0aG9kLCBhcmdzKTsKLSAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB8IElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gfCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHwKLSAgICAgICAgICAgICAgICBOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgIkJ1c2luZXNzTG9naWM6IEZhaWxlZCB0byBpbnZva2UgYWN0aW9uIG1ldGhvZCAlcyB3aXRoIGFyZ3M6ICVzIiwgbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICBBcnJheXMudG9TdHJpbmcoYXJncykpLCBlKTsKLSAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBUaGlzIGFjdGlvbiB0aHJvd3MgYW4gZXhjZXB0aW9uLCBzbyB0aHJvdyB0aGUgb3JpZ2luYWwgZXhjZXB0aW9uIChlLmcuCi0gICAgICAgICAgICAvLyBBc3NlcnRpb25GYWlsZWRFcnJvcikgZm9yIGEgbW9yZSByZWFkYWJsZSBzdGFja3RyYWNlLgotICAgICAgICAgICAgVGhyb3dhYmxlIHQgPSBlLmdldENhdXNlKCk7Ci0gICAgICAgICAgICBpZiAoQXNzdW1wdGlvblZpb2xhdGVkRXhjZXB0aW9uLmNsYXNzLmlzSW5zdGFuY2UodCkpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGFuIGFzc3VtcHRpb24gZmFpbHVyZSAocmVnaXN0ZXJlZCBhcyBhICJwYXNzIikgc28gZG9uJ3Qgd3JhcCB0aGlzCi0gICAgICAgICAgICAgICAgLy8gdGhyb3dhYmxlIGluIGEgUnVudGltZUV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIHRocm93IChBc3N1bXB0aW9uVmlvbGF0ZWRFeGNlcHRpb24pIHQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFJ1bnRpbWVFeGNlcHRpb24gcmUgPSBuZXcgUnVudGltZUV4Y2VwdGlvbih0LmdldE1lc3NhZ2UoKSwgdC5nZXRDYXVzZSgpKTsKLSAgICAgICAgICAgICAgICByZS5zZXRTdGFja1RyYWNlKHQuZ2V0U3RhY2tUcmFjZSgpKTsKLSAgICAgICAgICAgICAgICB0aHJvdyByZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEV4ZWN1dGUgYSBidXNpbmVzcyBsb2dpYyBtZXRob2QuCi0gICAgICogQHBhcmFtIG1ldGhvZCB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIHRvIGludm9rZS4gTXVzdCBpbmNsdWRlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZQotICAgICAqIGVuY2xvc2luZyBjbGFzcywgZm9sbG93ZWQgYnkgJy4nLCBmb2xsb3dlZCBieSB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kCi0gICAgICogQHBhcmFtIGFyZ3MgdGhlIHN0cmluZyBhcmd1bWVudHMgdG8gc3VwcGx5IHRvIHRoZSBtZXRob2QKLSAgICAgKiBAcmV0dXJuIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIG1ldGhvZCBpbnZva2VkICh0eXBlIEJvb2xlYW4gaWYgbWV0aG9kIGlzIGEgY29uZGl0aW9uKQotICAgICAqIEB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB3aGVuIGZhaWxpbmcgdG8gcmVzb2x2ZSBvciBpbnZva2UgdGhlIG1ldGhvZAotICAgICAqLwotICAgIHByb3RlY3RlZCBPYmplY3QgaW52b2tlTWV0aG9kKFN0cmluZyBtZXRob2QsIFN0cmluZy4uLiBhcmdzKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwKLSAgICAgICAgICAgIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0gICAgICAgICAgICBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotICAgICAgICAvLyBNZXRob2QgbmFtZXMgc2VydmVkIGJ5IHRoZSBCdXNpbmVzc0xvZ2ljIHNlcnZpY2Ugc2hvdWxkIGFzc3VtZSBmb3JtYXQKLSAgICAgICAgLy8gY2xhc3NuYW1lLm1ldGhvZE5hbWUsIGJ1dCBhbHNvIGhhbmRsZSBmb3JtYXQgY2xhc3NuYW1lI21ldGhvZE5hbWUgc2luY2UgdGVzdCBuYW1lcyB1c2UKLSAgICAgICAgLy8gdGhpcyBmb3JtYXQKLSAgICAgICAgaW50IGluZGV4ID0gKG1ldGhvZC5pbmRleE9mKCcjJykgPT0gLTEpID8gbWV0aG9kLmxhc3RJbmRleE9mKCcuJykgOiBtZXRob2QuaW5kZXhPZignIycpOwotICAgICAgICBpZiAoaW5kZXggPT0gLTEpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkJ1c2luZXNzTG9naWM6IGludmFsaWQgbWV0aG9kIG5hbWUgIgotICAgICAgICAgICAgICAgICAgICArICJcIiVzXCIuIE1ldGhvZCBzdHJpbmcgbXVzdCBpbmNsdWRlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lLiAiCi0gICAgICAgICAgICAgICAgICAgICsgIkZvciBleGFtcGxlLCBcImNvbS5hbmRyb2lkLnBhY2thZ2VuYW1lLkNsYXNzTmFtZS5tZXRob2ROYW1lXCIuIiwgbWV0aG9kKSk7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IG1ldGhvZC5zdWJzdHJpbmcoMCwgaW5kZXgpOwotICAgICAgICBDbGFzcyBjbHMgPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7Ci0gICAgICAgIE9iamVjdCBvYmogPSBjbHMuZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcigpLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIGlmIChnZXRUZXN0T2JqZWN0KCkgIT0gbnVsbCAmJiBjbHMuaXNBc3NpZ25hYmxlRnJvbShnZXRUZXN0T2JqZWN0KCkuZ2V0Q2xhc3MoKSkpIHsKLSAgICAgICAgICAgIC8vIFRoZSBnaXZlbiBtZXRob2QgaXMgYSBtZW1iZXIgb2YgdGhlIHRlc3QgY2xhc3MsIHVzZSB0aGUga25vd24gdGVzdCBjbGFzcyBpbnN0YW5jZQotICAgICAgICAgICAgb2JqID0gZ2V0VGVzdE9iamVjdCgpOwotICAgICAgICB9Ci0gICAgICAgIFJlc29sdmVkTWV0aG9kIHJtID0gZ2V0UmVzb2x2ZWRNZXRob2QoY2xzLCBtZXRob2Quc3Vic3RyaW5nKGluZGV4ICsgMSksIGFyZ3MpOwotICAgICAgICByZXR1cm4gcm0uaW52b2tlKG9iaik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSB0ZXN0IG9iamVjdC4gVGhpcyBtZXRob2QgaXMgbGVmdCBhYnN0cmFjdCwgc2luY2Ugbm9uLWFic3RyYWN0IHN1YmNsYXNzZXMgd2lsbCBzZXQKLSAgICAgKiB0aGUgdGVzdCBvYmplY3QgaW4gdGhlIGNvbnN0cnVjdG9yLgotICAgICAqIEByZXR1cm4gdGhlIHRlc3QgY2FzZSBpbnN0YW5jZQotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBPYmplY3QgZ2V0VGVzdE9iamVjdCgpOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBtZXRob2QgYW5kIGxpc3Qgb2YgYXJndW1lbnRzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNsYXNzLCBtZXRob2QgbmFtZSwgYW5kIHByb3Bvc2VkCi0gICAgICogYXJndW1lbnQgdmFsdWVzLCBpbiB0aGUgZm9ybSBvZiBhIHtAbGluayBSZXNvbHZlZE1ldGhvZH0gb2JqZWN0LiBUaGlzIG9iamVjdCBzdG9yZXMgYWxsCi0gICAgICogaW5mb3JtYXRpb24gcmVxdWlyZWQgdG8gc3VjY2Vzc2Z1bGx5IGludm9rZSB0aGUgbWV0aG9kLiBnZXRSZXNvbHZlZE1ldGhvZCBpcyBsZWZ0IGFic3RyYWN0LAotICAgICAqIHNpbmNlIGFyZ3VtZW50IHR5cGVzIGRpZmZlciBiZXR3ZWVuIGRldmljZS1zaWRlIChlLmcuIENvbnRleHQpIGFuZCBob3N0LXNpZGUKLSAgICAgKiAoZS5nLiBJVGVzdERldmljZSkgaW1wbGVtZW50YXRpb25zIG9mIHRoaXMgY2xhc3MuCi0gICAgICogQHBhcmFtIGNscyB0aGUgQ2xhc3MgdG8gd2hpY2ggdGhlIG1ldGhvZCBiZWxvbmdzCi0gICAgICogQHBhcmFtIG1ldGhvZE5hbWUgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0byBpbnZva2UKLSAgICAgKiBAcGFyYW0gYXJncyB0aGUgc3RyaW5nIGFyZ3VtZW50cyB0byB1c2Ugd2hlbiBpbnZva2luZyB0aGUgbWV0aG9kCi0gICAgICogQHJldHVybiBhIHtAbGluayBSZXNvbHZlZE1ldGhvZH0KLSAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgUmVzb2x2ZWRNZXRob2QgZ2V0UmVzb2x2ZWRNZXRob2QoQ2xhc3MgY2xzLCBTdHJpbmcgbWV0aG9kTmFtZSwKLSAgICAgICAgICAgIFN0cmluZy4uLiBhcmdzKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlIGFsbCBtZXRob2RzIHdpdGhpbiBhIGNsYXNzIHRoYXQgbWF0Y2ggYSBnaXZlbiBuYW1lCi0gICAgICogQHBhcmFtIGNscyB0aGUgY2xhc3MKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbWV0aG9kIG5hbWUKLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBtZXRob2Qgb2JqZWN0cwotICAgICAqLwotICAgIHByb3RlY3RlZCBMaXN0PE1ldGhvZD4gZ2V0TWV0aG9kc1dpdGhOYW1lKENsYXNzIGNscywgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgTGlzdDxNZXRob2Q+IG1ldGhvZExpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgZm9yIChNZXRob2QgbSA6IGNscy5nZXRNZXRob2RzKCkpIHsKLSAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscyhtLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICBtZXRob2RMaXN0LmFkZChtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWV0aG9kTGlzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIZWxwZXIgY2xhc3MgZm9yIHN0b3JpbmcgYSBtZXRob2Qgb2JqZWN0LCBhbmQgYSBsaXN0IG9mIGFyZ3VtZW50cyB0byB1c2Ugd2hlbiBpbnZva2luZyB0aGUKLSAgICAgKiBtZXRob2QuIFRoZSBjbGFzcyBpcyBhbHNvIGVxdWlwcGVkIHdpdGggYW4gImludm9rZSIgbWV0aG9kIGZvciBjb252ZW5pZW5jZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFJlc29sdmVkTWV0aG9kIHsKLSAgICAgICAgcHJpdmF0ZSBNZXRob2QgbU1ldGhvZDsKLSAgICAgICAgTGlzdDxPYmplY3Q+IG1BcmdzOwotCi0gICAgICAgIHB1YmxpYyBSZXNvbHZlZE1ldGhvZChNZXRob2QgbWV0aG9kKSB7Ci0gICAgICAgICAgICBtTWV0aG9kID0gbWV0aG9kOwotICAgICAgICAgICAgbUFyZ3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKiBBZGQgYW4gYXJndW1lbnQgdG8gdGhlIGFyZ3VtZW50IGxpc3QgZm9yIHRoaXMgaW5zdGFuY2UgKi8KLSAgICAgICAgcHVibGljIHZvaWQgYWRkQXJnKE9iamVjdCBhcmcpIHsKLSAgICAgICAgICAgIG1BcmdzLmFkZChhcmcpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqIEludm9rZSB0aGUgc3RvcmVkIG1ldGhvZCB3aXRoIHRoZSBzdG9yZWQgYXJncyBvbiBhIGdpdmVuIG9iamVjdCAqLwotICAgICAgICBwdWJsaWMgT2JqZWN0IGludm9rZShPYmplY3QgaW5zdGFuY2UpIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLAotICAgICAgICAgICAgICAgIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotICAgICAgICAgICAgcmV0dXJuIG1NZXRob2QuaW52b2tlKGluc3RhbmNlLCBtQXJncy50b0FycmF5KCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQnVzaW5lc3NMb2dpY0ZhY3RvcnkuamF2YSBiL2NvbW1vbi91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0J1c2luZXNzTG9naWNGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkM2RiMDEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQnVzaW5lc3NMb2dpY0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsOwotCi1pbXBvcnQgb3JnLmpzb24uSlNPTkFycmF5OwotaW1wb3J0IG9yZy5qc29uLkpTT05FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmpzb24uSlNPTk9iamVjdDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQnVzaW5lc3NMb2dpYy5CdXNpbmVzc0xvZ2ljUnVsZTsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkJ1c2luZXNzTG9naWMuQnVzaW5lc3NMb2dpY1J1bGVBY3Rpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5CdXNpbmVzc0xvZ2ljLkJ1c2luZXNzTG9naWNSdWxlQ29uZGl0aW9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TY2FubmVyOwotCi0vKioKLSAqIEZhY3RvcnkgZm9yIGNyZWF0aW5nIGEge0BsaW5rIEJ1c2luZXNzTG9naWN9Ci0gKi8KLXB1YmxpYyBjbGFzcyBCdXNpbmVzc0xvZ2ljRmFjdG9yeSB7Ci0KLSAgICAvLyBOYW1lIG9mIGxpc3Qgb2JqZWN0IHN0b3JpbmcgdGVzdC1ydWxlcyBwYWlycwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVVNJTkVTU19MT0dJQ19SVUxFU19MSVNUUyA9ICJidXNpbmVzc0xvZ2ljUnVsZXNMaXN0cyI7Ci0gICAgLy8gTmFtZSBvZiB0ZXN0IG5hbWUgc3RyaW5nCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfTkFNRSA9ICJ0ZXN0TmFtZSI7Ci0gICAgLy8gTmFtZSBvZiBydWxlcyBvYmplY3QgKG9uZSAncnVsZXMnIG9iamVjdCB0byBhIHNpbmdsZSB0ZXN0KQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVVNJTkVTU19MT0dJQ19SVUxFUyA9ICJidXNpbmVzc0xvZ2ljUnVsZXMiOwotICAgIC8vIE5hbWUgb2YgcnVsZSBjb25kaXRpb25zIGFycmF5Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJVTEVfQ09ORElUSU9OUyA9ICJydWxlQ29uZGl0aW9ucyI7Ci0gICAgLy8gTmFtZSBvZiBydWxlIGFjdGlvbnMgYXJyYXkKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlVMRV9BQ1RJT05TID0gInJ1bGVBY3Rpb25zIjsKLSAgICAvLyBOYW1lIG9mIG1ldGhvZCBuYW1lIHN0cmluZwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfTkFNRSA9ICJtZXRob2ROYW1lIjsKLSAgICAvLyBOYW1lIG9mIG1ldGhvZCBhcmdzIGFycmF5IG9mIHN0cmluZ3MKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX0FSR1MgPSAibWV0aG9kQXJncyI7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBCdXNpbmVzc0xvZ2ljIGluc3RhbmNlIGZyb20gYSBmaWxlIG9mIGJ1c2luZXNzIGxvZ2ljIGRhdGEsIGZvcm1hdHRlZCBpbiBKU09OLgotICAgICAqIFRoaXMgZm9ybWF0IGlzIGlkZW50aWNhbCB0byB0aGF0IHdoaWNoIGlzIHJlY2VpdmVkIGZyb20gdGhlIEFuZHJvaWQgUGFydG5lciBidXNpbmVzcyBsb2dpYwotICAgICAqIHNlcnZpY2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBCdXNpbmVzc0xvZ2ljIGNyZWF0ZUZyb21GaWxlKEZpbGUgZikgewotICAgICAgICAvLyBQb3B1bGF0ZSB0aGUgbWFwIGZyb20gdGVzdG5hbWUgdG8gYnVzaW5lc3MgcnVsZXMgZm9yIHRoaXMgbmV3IEJ1c2luZXNzTG9naWMgaW5zdGFuY2UKLSAgICAgICAgTWFwPFN0cmluZywgTGlzdDxCdXNpbmVzc0xvZ2ljUnVsZT4+IHJ1bGVzTWFwID0gbmV3IEhhc2hNYXA8PigpOwotICAgICAgICBCdXNpbmVzc0xvZ2ljIGJsID0gbmV3IEJ1c2luZXNzTG9naWMoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyBidXNpbmVzc0xvZ2ljU3RyaW5nID0gcmVhZEZpbGUoZik7Ci0gICAgICAgICAgICBKU09OT2JqZWN0IHJvb3QgPSBuZXcgSlNPTk9iamVjdChidXNpbmVzc0xvZ2ljU3RyaW5nKTsKLSAgICAgICAgICAgIEpTT05BcnJheSBydWxlc0xpc3RzID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcnVsZXNMaXN0cyA9IHJvb3QuZ2V0SlNPTkFycmF5KEJVU0lORVNTX0xPR0lDX1JVTEVTX0xJU1RTKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEpTT05FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGJsLm1SdWxlcyA9IHJ1bGVzTWFwOwotICAgICAgICAgICAgICAgIHJldHVybiBibDsgLy8gbm8gcnVsZXMgZGVmaW5lZCBmb3IgdGhpcyBzdWl0ZSwgbGVhdmUgaW50ZXJuYWwgbWFwIGVtcHR5Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJ1bGVzTGlzdHMubGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgICAgIEpTT05PYmplY3QgcnVsZXNMaXN0ID0gcnVsZXNMaXN0cy5nZXRKU09OT2JqZWN0KGkpOwotICAgICAgICAgICAgICAgIFN0cmluZyB0ZXN0TmFtZSA9IHJ1bGVzTGlzdC5nZXRTdHJpbmcoVEVTVF9OQU1FKTsKLSAgICAgICAgICAgICAgICBMaXN0PEJ1c2luZXNzTG9naWNSdWxlPiBydWxlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgICAgIEpTT05BcnJheSBydWxlc0pTT05BcnJheSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgcnVsZXNKU09OQXJyYXkgPSBydWxlc0xpc3QuZ2V0SlNPTkFycmF5KEJVU0lORVNTX0xPR0lDX1JVTEVTKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChKU09ORXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gbm8gcnVsZXMgZGVmaW5lZCBmb3IgdGhpcyB0ZXN0IGNhc2UKLSAgICAgICAgICAgICAgICAgICAgcnVsZXNNYXAucHV0KHRlc3ROYW1lLCBydWxlcyk7IC8vIGFkZCBlbXB0eSBydWxlIGxpc3QgdG8gaW50ZXJuYWwgbWFwCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBhZHZhbmNlIHRvIG5leHQgdGVzdCBjYXNlCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcnVsZXNKU09OQXJyYXkubGVuZ3RoKCk7IGorKykgewotICAgICAgICAgICAgICAgICAgICBKU09OT2JqZWN0IHJ1bGVKU09OT2JqZWN0ID0gcnVsZXNKU09OQXJyYXkuZ2V0SlNPTk9iamVjdChqKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gQnVpbGQgY29uZGl0aW9ucyBsaXN0Ci0gICAgICAgICAgICAgICAgICAgIExpc3Q8QnVzaW5lc3NMb2dpY1J1bGVDb25kaXRpb24+IHJ1bGVDb25kaXRpb25zID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0UnVsZUNvbmRpdGlvbkxpc3QocnVsZUpTT05PYmplY3QpOwotICAgICAgICAgICAgICAgICAgICAvLyBCdWlsZCBhY3Rpb25zIGxpc3QKLSAgICAgICAgICAgICAgICAgICAgTGlzdDxCdXNpbmVzc0xvZ2ljUnVsZUFjdGlvbj4gcnVsZUFjdGlvbnMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RSdWxlQWN0aW9uTGlzdChydWxlSlNPTk9iamVjdCk7Ci0gICAgICAgICAgICAgICAgICAgIHJ1bGVzLmFkZChuZXcgQnVzaW5lc3NMb2dpY1J1bGUocnVsZUNvbmRpdGlvbnMsIHJ1bGVBY3Rpb25zKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJ1bGVzTWFwLnB1dCh0ZXN0TmFtZSwgcnVsZXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiB8IEpTT05FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkJ1c2luZXNzIExvZ2ljIGZhaWxlZCIsIGUpOwotICAgICAgICB9Ci0gICAgICAgIC8vIFJldHVybiBidXNpbmVzcyBsb2dpYwotICAgICAgICBibC5tUnVsZXMgPSBydWxlc01hcDsKLSAgICAgICAgcmV0dXJuIGJsOwotICAgIH0KLQotICAgIC8qIEV4dHJhY3QgYWxsIEJ1c2luZXNzTG9naWNSdWxlQ29uZGl0aW9ucyBmcm9tIGEgSlNPTiBidXNpbmVzcyBsb2dpYyBydWxlICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxCdXNpbmVzc0xvZ2ljUnVsZUNvbmRpdGlvbj4gZXh0cmFjdFJ1bGVDb25kaXRpb25MaXN0KAotICAgICAgICAgICAgSlNPTk9iamVjdCBydWxlSlNPTk9iamVjdCkgdGhyb3dzIEpTT05FeGNlcHRpb24gewotICAgICAgICBMaXN0PEJ1c2luZXNzTG9naWNSdWxlQ29uZGl0aW9uPiBydWxlQ29uZGl0aW9ucyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAvLyBSdWxlcyBkbyBub3QgcmVxdWlyZSBhIGNvbmRpdGlvbiwgcmV0dXJuIGVtcHR5IGxpc3QgaWYgbm8gY29uZGl0aW9uIGlzIGZvdW5kCi0gICAgICAgIEpTT05BcnJheSBydWxlQ29uZGl0aW9uc0pTT05BcnJheSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBydWxlQ29uZGl0aW9uc0pTT05BcnJheSA9IHJ1bGVKU09OT2JqZWN0LmdldEpTT05BcnJheShSVUxFX0NPTkRJVElPTlMpOwotICAgICAgICB9IGNhdGNoIChKU09ORXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBydWxlQ29uZGl0aW9uczsgLy8gbm8gY29uZGl0aW9ucyBmb3IgdGhpcyBydWxlLCBhcHBseSBpbiBhbGwgY2FzZXMKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJ1bGVDb25kaXRpb25zSlNPTkFycmF5Lmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgIEpTT05PYmplY3QgcnVsZUNvbmRpdGlvbkpTT05PYmplY3QgPSBydWxlQ29uZGl0aW9uc0pTT05BcnJheS5nZXRKU09OT2JqZWN0KGkpOwotICAgICAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSBydWxlQ29uZGl0aW9uSlNPTk9iamVjdC5nZXRTdHJpbmcoTUVUSE9EX05BTUUpOwotICAgICAgICAgICAgYm9vbGVhbiBuZWdhdGVkID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAobWV0aG9kTmFtZS5zdGFydHNXaXRoKCIhIikpIHsKLSAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gbWV0aG9kTmFtZS5zdWJzdHJpbmcoMSk7IC8vIHJlbW92ZSBuZWdhdGlvbiBmcm9tIG1ldGhvZCBuYW1lIHN0cmluZwotICAgICAgICAgICAgICAgIG5lZ2F0ZWQgPSB0cnVlOyAvLyBjaGFuZ2UgIm5lZ2F0ZWQiIHByb3BlcnR5IHRvIHRydWUKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBtZXRob2RBcmdzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICBKU09OQXJyYXkgbWV0aG9kQXJnc0pTT05BcnJheSA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3NKU09OQXJyYXkgPSBydWxlQ29uZGl0aW9uSlNPTk9iamVjdC5nZXRKU09OQXJyYXkoTUVUSE9EX0FSR1MpOwotICAgICAgICAgICAgfSBjYXRjaCAoSlNPTkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gTm8gbWV0aG9kIGFyZ3MgZm9yIHRoaXMgcnVsZSBjb25kaXRpb24sIGFkZCBydWxlIGNvbmRpdGlvbiB3aXRoIGVtcHR5IGFyZ3MgbGlzdAotICAgICAgICAgICAgICAgIHJ1bGVDb25kaXRpb25zLmFkZChuZXcgQnVzaW5lc3NMb2dpY1J1bGVDb25kaXRpb24obWV0aG9kTmFtZSwgbWV0aG9kQXJncywgbmVnYXRlZCkpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBtZXRob2RBcmdzSlNPTkFycmF5Lmxlbmd0aCgpOyBqKyspIHsKLSAgICAgICAgICAgICAgICBtZXRob2RBcmdzLmFkZChtZXRob2RBcmdzSlNPTkFycmF5LmdldFN0cmluZyhqKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBydWxlQ29uZGl0aW9ucy5hZGQobmV3IEJ1c2luZXNzTG9naWNSdWxlQ29uZGl0aW9uKG1ldGhvZE5hbWUsIG1ldGhvZEFyZ3MsIG5lZ2F0ZWQpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcnVsZUNvbmRpdGlvbnM7Ci0gICAgfQotCi0gICAgLyogRXh0cmFjdCBhbGwgQnVzaW5lc3NMb2dpY1J1bGVBY3Rpb25zIGZyb20gYSBKU09OIGJ1c2luZXNzIGxvZ2ljIHJ1bGUgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PEJ1c2luZXNzTG9naWNSdWxlQWN0aW9uPiBleHRyYWN0UnVsZUFjdGlvbkxpc3QoSlNPTk9iamVjdCBydWxlSlNPTk9iamVjdCkKLSAgICAgICAgICAgIHRocm93cyBKU09ORXhjZXB0aW9uIHsKLSAgICAgICAgTGlzdDxCdXNpbmVzc0xvZ2ljUnVsZUFjdGlvbj4gcnVsZUFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgLy8gQWxsIHJ1bGVzIHJlcXVpcmUgYXQgbGVhc3Qgb25lIGFjdGlvbiwgbGluZSBiZWxvdyB0aHJvd3MgSlNPTkV4Y2VwdGlvbiBpZiBub3QKLSAgICAgICAgSlNPTkFycmF5IHJ1bGVBY3Rpb25zSlNPTkFycmF5ID0gcnVsZUpTT05PYmplY3QuZ2V0SlNPTkFycmF5KFJVTEVfQUNUSU9OUyk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcnVsZUFjdGlvbnNKU09OQXJyYXkubGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgSlNPTk9iamVjdCBydWxlQWN0aW9uSlNPTk9iamVjdCA9IHJ1bGVBY3Rpb25zSlNPTkFycmF5LmdldEpTT05PYmplY3QoaSk7Ci0gICAgICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSA9IHJ1bGVBY3Rpb25KU09OT2JqZWN0LmdldFN0cmluZyhNRVRIT0RfTkFNRSk7Ci0gICAgICAgICAgICBMaXN0PFN0cmluZz4gbWV0aG9kQXJncyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgSlNPTkFycmF5IG1ldGhvZEFyZ3NKU09OQXJyYXkgPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtZXRob2RBcmdzSlNPTkFycmF5ID0gcnVsZUFjdGlvbkpTT05PYmplY3QuZ2V0SlNPTkFycmF5KE1FVEhPRF9BUkdTKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEpTT05FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIE5vIG1ldGhvZCBhcmdzIGZvciB0aGlzIHJ1bGUgYWN0aW9uLCBhZGQgcnVsZSBhY3Rpb24gd2l0aCBlbXB0eSBhcmdzIGxpc3QKLSAgICAgICAgICAgICAgICBydWxlQWN0aW9ucy5hZGQobmV3IEJ1c2luZXNzTG9naWNSdWxlQWN0aW9uKG1ldGhvZE5hbWUsIG1ldGhvZEFyZ3MpKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbWV0aG9kQXJnc0pTT05BcnJheS5sZW5ndGgoKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgbWV0aG9kQXJncy5hZGQobWV0aG9kQXJnc0pTT05BcnJheS5nZXRTdHJpbmcoaikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcnVsZUFjdGlvbnMuYWRkKG5ldyBCdXNpbmVzc0xvZ2ljUnVsZUFjdGlvbihtZXRob2ROYW1lLCBtZXRob2RBcmdzKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJ1bGVBY3Rpb25zOwotICAgIH0KLQotICAgIC8qIEV4dHJhY3Qgc3RyaW5nIGZyb20gZmlsZSAqLwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyByZWFkRmlsZShGaWxlIGYpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigoaW50KSBmLmxlbmd0aCgpKTsKLSAgICAgICAgU3RyaW5nIGxpbmVTZXBhcmF0b3IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7Ci0gICAgICAgIHRyeSAoU2Nhbm5lciBzY2FubmVyID0gbmV3IFNjYW5uZXIoZikpIHsKLSAgICAgICAgICAgIHdoaWxlKHNjYW5uZXIuaGFzTmV4dExpbmUoKSkgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChzY2FubmVyLm5leHRMaW5lKCkgKyBsaW5lU2VwYXJhdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQ2FzZVJlc3VsdC5qYXZhIGIvY29tbW9uL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQ2FzZVJlc3VsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2MzMzE4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0Nhc2VSZXN1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogRGF0YSBzdHJ1Y3R1cmUgZm9yIGEgQ29tcGF0aWJpbGl0eSB0ZXN0IGNhc2UgcmVzdWx0LgotICovCi1wdWJsaWMgY2xhc3MgQ2FzZVJlc3VsdCBpbXBsZW1lbnRzIElDYXNlUmVzdWx0IHsKLQotICAgIHByaXZhdGUgU3RyaW5nIG1OYW1lOwotCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBJVGVzdFJlc3VsdD4gbVJlc3VsdHMgPSBuZXcgSGFzaE1hcDw+KCk7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEge0BsaW5rIENhc2VSZXN1bHR9IGZvciB0aGUgZ2l2ZW4gbmFtZSwgZWcgJmx0O3BhY2thZ2UtbmFtZSZndDsuJmx0O2NsYXNzLW5hbWUmZ3Q7Ci0gICAgICovCi0gICAgcHVibGljIENhc2VSZXN1bHQoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgbU5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElUZXN0UmVzdWx0IGdldE9yQ3JlYXRlUmVzdWx0KFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBJVGVzdFJlc3VsdCByZXN1bHQgPSBtUmVzdWx0cy5nZXQodGVzdE5hbWUpOwotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBUZXN0UmVzdWx0KHRoaXMsIHRlc3ROYW1lKTsKLSAgICAgICAgICAgIG1SZXN1bHRzLnB1dCh0ZXN0TmFtZSwgcmVzdWx0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVRlc3RSZXN1bHQgZ2V0UmVzdWx0KFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICByZXR1cm4gbVJlc3VsdHMuZ2V0KHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8SVRlc3RSZXN1bHQ+IGdldFJlc3VsdHMoVGVzdFN0YXR1cyBzdGF0dXMpIHsKLSAgICAgICAgTGlzdDxJVGVzdFJlc3VsdD4gcmVzdWx0cyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBmb3IgKElUZXN0UmVzdWx0IHJlc3VsdCA6IG1SZXN1bHRzLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBpZiAocmVzdWx0LmdldFJlc3VsdFN0YXR1cygpID09IHN0YXR1cykgewotICAgICAgICAgICAgICAgIHJlc3VsdHMuYWRkKHJlc3VsdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMaXN0PElUZXN0UmVzdWx0PiBnZXRSZXN1bHRzKCkgewotICAgICAgICBBcnJheUxpc3Q8SVRlc3RSZXN1bHQ+IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0PD4obVJlc3VsdHMudmFsdWVzKCkpOwotICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHJlc3VsdHMpOwotICAgICAgICByZXR1cm4gcmVzdWx0czsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBjb3VudFJlc3VsdHMoVGVzdFN0YXR1cyBzdGF0dXMpIHsKLSAgICAgICAgaW50IHRvdGFsID0gMDsKLSAgICAgICAgZm9yIChJVGVzdFJlc3VsdCByZXN1bHQgOiBtUmVzdWx0cy52YWx1ZXMoKSkgewotICAgICAgICAgICAgaWYgKHJlc3VsdC5nZXRSZXN1bHRTdGF0dXMoKSA9PSBzdGF0dXMpIHsKLSAgICAgICAgICAgICAgICB0b3RhbCsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0b3RhbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBjb21wYXJlVG8oSUNhc2VSZXN1bHQgYW5vdGhlcikgewotICAgICAgICByZXR1cm4gZ2V0TmFtZSgpLmNvbXBhcmVUbyhhbm90aGVyLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG1lcmdlRnJvbShJQ2FzZVJlc3VsdCBvdGhlckNhc2VSZXN1bHQpIHsKLSAgICAgICAgaWYgKCFvdGhlckNhc2VSZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhnZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgIkNhbm5vdCBtZXJnZSBjYXNlIHJlc3VsdCB3aXRoIG1pc21hdGNoZWQgbmFtZS4gRXhwZWN0ZWQgJXMsIEZvdW5kICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyQ2FzZVJlc3VsdC5nZXROYW1lKCksIGdldE5hbWUoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChJVGVzdFJlc3VsdCBvdGhlclRlc3RSZXN1bHQgOiBvdGhlckNhc2VSZXN1bHQuZ2V0UmVzdWx0cygpKSB7Ci0gICAgICAgICAgICBtUmVzdWx0cy5wdXQob3RoZXJUZXN0UmVzdWx0LmdldE5hbWUoKSwgb3RoZXJUZXN0UmVzdWx0KTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQ2RkVGVzdC5qYXZhIGIvY29tbW9uL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQ2RkVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGVlNjYzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0NkZFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLQotLyoqCi0gKiBNYXJrcyB0aGUgdHlwZSBvZiB0ZXN0IHdpdGggcHVycG9zZSBvZiBhc3NlcnRpbmcgQ0REIHJlcXVpcmVtZW50cy4KLSAqLwotQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKLUBUYXJnZXQoe0VsZW1lbnRUeXBlLk1FVEhPRCwgRWxlbWVudFR5cGUuVFlQRX0pCi1wdWJsaWMgQGludGVyZmFjZSBDZGRUZXN0IHsKLSAgICBTdHJpbmcgcmVxdWlyZW1lbnQoKTsKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0NoZWNrc3VtUmVwb3J0ZXIuamF2YSBiL2NvbW1vbi91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0NoZWNrc3VtUmVwb3J0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UzOWYzOC4uMDAwMDAwMAotLS0gYS9jb21tb24vdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9DaGVja3N1bVJlcG9ydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKLQotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuSm9pbmVyOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5oYXNoLkJsb29tRmlsdGVyOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmhhc2guRnVubmVsczsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXQ7Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dDsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LkRpZ2VzdEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotLyoqKgotICogQ2FsY3VsYXRlIGFuZCBzdG9yZSBjaGVja3N1bSB2YWx1ZXMgZm9yIGZpbGVzIGFuZCB0ZXN0IHJlc3VsdHMKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENoZWNrc3VtUmVwb3J0ZXIgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJjaGVja3N1bS5kYXRhIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVWX05BTUUgPSAiY2hlY2tzdW0ucHJldmlvdXMuZGF0YSI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUgREVGQVVMVF9GUFAgPSAwLjA1OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVBBUkFUT1IgPSAiLyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElEX1NFUEFSQVRPUiA9ICJAIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9TRVBBUkFUT1IgPSAiLiI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBzaG9ydCBDVVJSRU5UX1ZFUlNJT04gPSAxOwotICAgIC8vIFNlcmlhbGl6ZWQgZm9ybWF0IElkIChpZSBtYWdpYyBudW1iZXIpIHVzZWQgdG8gaWRlbnRpZnkgc2VyaWFsaXplZCBkYXRhLgotICAgIHN0YXRpYyBmaW5hbCBzaG9ydCBTRVJJQUxJWkVEX0ZPUk1BVF9DT0RFID0gNjUwOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBCbG9vbUZpbHRlcjxDaGFyU2VxdWVuY2U+IG1SZXN1bHRDaGVja3N1bTsKLSAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBieXRlW10+IG1GaWxlQ2hlY2tzdW07Ci0gICAgcHJpdmF0ZSBmaW5hbCBzaG9ydCBtVmVyc2lvbjsKLQotICAgIC8qKioKLSAgICAgKiBDYWxjdWxhdGUgY2hlY2tzdW0gb2YgdGVzdCByZXN1bHRzIGFuZCBmaWxlcyBpbiByZXN1bHQgZGlyZWN0b3J5IGFuZCB3cml0ZSB0byBkaXNrCi0gICAgICogQHBhcmFtIGRpciB0ZXN0IHJlc3VsdHMgZGlyZWN0b3J5Ci0gICAgICogQHBhcmFtIHJlc3VsdCB0ZXN0IHJlc3VsdHMKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgc3VjY2Vzc2Z1bCwgZmFsc2UgaWYgdW5hYmxlIHRvIGNhbGN1bGF0ZSBvciBzdG9yZSB0aGUgY2hlY2tzdW0KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdHJ5Q3JlYXRlQ2hlY2tzdW0oRmlsZSBkaXIsIElJbnZvY2F0aW9uUmVzdWx0IHJlc3VsdCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW50IHRvdGFsQ291bnQgPSBjb3VudFRlc3RSZXN1bHRzKHJlc3VsdCk7Ci0gICAgICAgICAgICBDaGVja3N1bVJlcG9ydGVyIGNoZWNrc3VtUmVwb3J0ZXIgPQotICAgICAgICAgICAgICAgICAgICBuZXcgQ2hlY2tzdW1SZXBvcnRlcih0b3RhbENvdW50LCBERUZBVUxUX0ZQUCwgQ1VSUkVOVF9WRVJTSU9OKTsKLSAgICAgICAgICAgIGNoZWNrc3VtUmVwb3J0ZXIuYWRkSW52b2NhdGlvbihyZXN1bHQpOwotICAgICAgICAgICAgY2hlY2tzdW1SZXBvcnRlci5hZGREaXJlY3RvcnkoZGlyKTsKLSAgICAgICAgICAgIGNoZWNrc3VtUmVwb3J0ZXIuc2F2ZVRvRmlsZShkaXIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKioKLSAgICAgKiBDcmVhdGUgQ2hlY2tzdW0gUmVwb3J0ZXIgZnJvbSBkYXRhIHNhdmVkIG9uIGRpc2sKLSAgICAgKiBAcGFyYW0gZGlyZWN0b3J5Ci0gICAgICogQHJldHVybgotICAgICAqIEB0aHJvd3MgQ2hlY2tzdW1WYWxpZGF0aW9uRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDaGVja3N1bVJlcG9ydGVyIGxvYWQoRmlsZSBkaXJlY3RvcnkpIHRocm93cyBDaGVja3N1bVZhbGlkYXRpb25FeGNlcHRpb24gewotICAgICAgICBDaGVja3N1bVJlcG9ydGVyIHJlcG9ydGVyID0gbmV3IENoZWNrc3VtUmVwb3J0ZXIoZGlyZWN0b3J5KTsKLSAgICAgICAgaWYgKHJlcG9ydGVyLmdldENhcGFjaXR5KCkgPiAxLjEpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDaGVja3N1bVZhbGlkYXRpb25FeGNlcHRpb24oIkNhcGFjaXR5IGV4Y2VlZGVkLiIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXBvcnRlcjsKLSAgICB9Ci0KLSAgICAvKioqCi0gICAgICogRGVzZXJpYWxpemUgY2hlY2tzdW0gZnJvbSBmaWxlCi0gICAgICogQHBhcmFtIGRpcmVjdG9yeSB0aGUgcGFyZW50IGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBjaGVja3N1bSBmaWxlCi0gICAgICogQHRocm93cyBDaGVja3N1bVZhbGlkYXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgQ2hlY2tzdW1SZXBvcnRlcihGaWxlIGRpcmVjdG9yeSkgdGhyb3dzIENoZWNrc3VtVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGRpcmVjdG9yeSwgQ2hlY2tzdW1SZXBvcnRlci5OQU1FKTsKLSAgICAgICAgdHJ5IChGaWxlSW5wdXRTdHJlYW0gZmlsZVN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShmaWxlU3RyZWFtKTsKLSAgICAgICAgICAgIE9iamVjdElucHV0IG9iamVjdElucHV0ID0gbmV3IE9iamVjdElucHV0U3RyZWFtKG91dHB1dFN0cmVhbSkpIHsKLSAgICAgICAgICAgIHNob3J0IG1hZ2ljTnVtYmVyID0gb2JqZWN0SW5wdXQucmVhZFNob3J0KCk7Ci0gICAgICAgICAgICBzd2l0Y2ggKG1hZ2ljTnVtYmVyKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTRVJJQUxJWkVEX0ZPUk1BVF9DT0RFOgotICAgICAgICAgICAgICAgICAgIG1WZXJzaW9uID0gb2JqZWN0SW5wdXQucmVhZFNob3J0KCk7Ci0gICAgICAgICAgICAgICAgICAgIG1SZXN1bHRDaGVja3N1bSA9IChCbG9vbUZpbHRlcjxDaGFyU2VxdWVuY2U+KSBvYmplY3RJbnB1dC5yZWFkT2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIG1GaWxlQ2hlY2tzdW0gPSAoSGFzaE1hcDxTdHJpbmcsIGJ5dGVbXT4pIG9iamVjdElucHV0LnJlYWRPYmplY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENoZWNrc3VtVmFsaWRhdGlvbkV4Y2VwdGlvbigiVW5rbm93biBmb3JtYXQgb2Ygc2VyaWFsaXplZCBkYXRhLiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENoZWNrc3VtVmFsaWRhdGlvbkV4Y2VwdGlvbigiVW5hYmxlIHRvIGxvYWQgY2hlY2tzdW0gZnJvbSBmaWxlIiwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1WZXJzaW9uID4gQ1VSUkVOVF9WRVJTSU9OKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ2hlY2tzdW1WYWxpZGF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiRmlsZSBjb250YWlucyBhIG5ld2VyIHZlcnNpb24gb2YgQ2hlY2tzdW1SZXBvcnRlciIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqKgotICAgICAqIENyZWF0ZSBuZXcgaW5zdGFuY2Ugb2YgQ2hlY2tzdW1SZXBvcnRlcgotICAgICAqIEBwYXJhbSB0ZXN0Q291bnQgdGhlIG51bWJlciBvZiB0ZXN0IHJlc3VsdHMgdGhhdCB3aWxsIGJlIHN0b3JlZAotICAgICAqIEBwYXJhbSBmcHAgdGhlIGZhbHNlIHBvc2l0aXZlIHBlcmNlbnRhZ2UgZm9yIHJlc3VsdCBsb29rdXAgbWlzc2VzCi0gICAgICovCi0gICAgcHVibGljIENoZWNrc3VtUmVwb3J0ZXIoaW50IHRlc3RDb3VudCwgZG91YmxlIGZwcCwgc2hvcnQgdmVyc2lvbikgewotICAgICAgICBtUmVzdWx0Q2hlY2tzdW0gPSBCbG9vbUZpbHRlci5jcmVhdGUoRnVubmVscy51bmVuY29kZWRDaGFyc0Z1bm5lbCgpLAotICAgICAgICAgICAgICAgIHRlc3RDb3VudCwgZnBwKTsKLSAgICAgICAgbUZpbGVDaGVja3N1bSA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgbVZlcnNpb24gPSB2ZXJzaW9uOwotICAgIH0KLQotICAgIC8qKioKLSAgICAgKiBBZGQgZWFjaCB0ZXN0IHJlc3VsdCBmcm9tIGVhY2ggbW9kdWxlIGFuZCB0ZXN0IGNhc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRJbnZvY2F0aW9uKElJbnZvY2F0aW9uUmVzdWx0IGludm9jYXRpb25SZXN1bHQpIHsKLSAgICAgICAgZm9yIChJTW9kdWxlUmVzdWx0IG1vZHVsZSA6IGludm9jYXRpb25SZXN1bHQuZ2V0TW9kdWxlcygpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgYnVpbGRGaW5nZXJwcmludCA9IGludm9jYXRpb25SZXN1bHQuZ2V0QnVpbGRGaW5nZXJwcmludCgpOwotICAgICAgICAgICAgYWRkTW9kdWxlUmVzdWx0KG1vZHVsZSwgYnVpbGRGaW5nZXJwcmludCk7Ci0gICAgICAgICAgICBmb3IgKElDYXNlUmVzdWx0IGNhc2VSZXN1bHQgOiBtb2R1bGUuZ2V0UmVzdWx0cygpKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChJVGVzdFJlc3VsdCB0ZXN0UmVzdWx0IDogY2FzZVJlc3VsdC5nZXRSZXN1bHRzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkVGVzdFJlc3VsdCh0ZXN0UmVzdWx0LCBtb2R1bGUsIGJ1aWxkRmluZ2VycHJpbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKioKLSAgICAgKiBDYWxjdWxhdGUgQ1JDIG9mIGZpbGUgYW5kIHN0b3JlIHRoZSByZXN1bHQKLSAgICAgKiBAcGFyYW0gZmlsZSBjcmMgY2FsY3VsYXRlZCBvbiB0aGlzIGZpbGUKLSAgICAgKiBAcGFyYW0gcGF0aCBwYXJ0IG9mIHRoZSBrZXkgdG8gaWRlbnRpZnkgdGhlIGZpbGVzIGNyYwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZEZpbGUoRmlsZSBmaWxlLCBTdHJpbmcgcGF0aCkgewotICAgICAgICBieXRlW10gY3JjOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY3JjID0gY2FsY3VsYXRlRmlsZUNoZWNrc3VtKGZpbGUpOwotICAgICAgICB9IGNhdGNoIChDaGVja3N1bVZhbGlkYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgY3JjID0gbmV3IGJ5dGVbMF07Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIGtleSA9IHBhdGggKyBTRVBBUkFUT1IgKyBmaWxlLmdldE5hbWUoKTsKLSAgICAgICAgbUZpbGVDaGVja3N1bS5wdXQoa2V5LCBjcmMpOwotICAgIH0KLQotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zRmlsZShGaWxlIGZpbGUsIFN0cmluZyBwYXRoKSB7Ci0gICAgICAgIFN0cmluZyBrZXkgPSBwYXRoICsgU0VQQVJBVE9SICsgZmlsZS5nZXROYW1lKCk7Ci0gICAgICAgIGlmIChtRmlsZUNoZWNrc3VtLmNvbnRhaW5zS2V5KGtleSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYnl0ZVtdIGNyYyA9IGNhbGN1bGF0ZUZpbGVDaGVja3N1bShmaWxlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXlzLmVxdWFscyhtRmlsZUNoZWNrc3VtLmdldChrZXkpLCBjcmMpOwotICAgICAgICAgICAgfSBjYXRjaCAoQ2hlY2tzdW1WYWxpZGF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKioKLSAgICAgKiBBZGRzIGFsbCBjaGlsZCBmaWxlcyByZWN1cnNpdmVseSB0aHJvdWdoIGFsbCBzdWIgZGlyZWN0b3JpZXMKLSAgICAgKiBAcGFyYW0gZGlyZWN0b3J5IHRhcmdldCB0aGF0IGlzIGRlZXBseSBzZWFyY2hlZCBmb3IgZmlsZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGREaXJlY3RvcnkoRmlsZSBkaXJlY3RvcnkpIHsKLSAgICAgICAgYWRkRGlyZWN0b3J5KGRpcmVjdG9yeSwgZGlyZWN0b3J5LmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgLyoqKgotICAgICAqIEBwYXJhbSBwYXRoIHRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBmcm9tIHRoZSBiYXNlIGRpcmVjdG9yeQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZGREaXJlY3RvcnkoRmlsZSBkaXJlY3RvcnksIFN0cmluZyBwYXRoKSB7Ci0gICAgICAgIGZvcihTdHJpbmcgY2hpbGROYW1lIDogZGlyZWN0b3J5Lmxpc3QoKSkgewotICAgICAgICAgICAgRmlsZSBjaGlsZCA9IG5ldyBGaWxlKGRpcmVjdG9yeSwgY2hpbGROYW1lKTsKLSAgICAgICAgICAgIGlmIChjaGlsZC5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgYWRkRGlyZWN0b3J5KGNoaWxkLCBwYXRoICsgU0VQQVJBVE9SICsgY2hpbGQuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYWRkRmlsZShjaGlsZCwgcGF0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioqCi0gICAgICogQ2FsY3VsYXRlIGNoZWNrc3VtIG9mIHRlc3QgcmVzdWx0IGFuZCBzdG9yZSB0aGUgdmFsdWUKLSAgICAgKiBAcGFyYW0gdGVzdFJlc3VsdCB0aGUgdGFyZ2V0IG9mIHRoZSBjaGVja3N1bQotICAgICAqIEBwYXJhbSBtb2R1bGVSZXN1bHQgdGhlIG1vZHVsZSB0aGF0IGNvbnRhaW5zIHRoZSB0ZXN0IHJlc3VsdAotICAgICAqIEBwYXJhbSBidWlsZEZpbmdlcnByaW50IHRoZSBmaW5nZXJwcmludCB0aGUgdGVzdCBleGVjdXRpb24gaXMgcnVubmluZyBhZ2FpbnN0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkVGVzdFJlc3VsdCgKLSAgICAgICAgSVRlc3RSZXN1bHQgdGVzdFJlc3VsdCwgSU1vZHVsZVJlc3VsdCBtb2R1bGVSZXN1bHQsIFN0cmluZyBidWlsZEZpbmdlcnByaW50KSB7Ci0KLSAgICAgICAgU3RyaW5nIHNpZ25hdHVyZSA9IGdlbmVyYXRlVGVzdFJlc3VsdFNpZ25hdHVyZSh0ZXN0UmVzdWx0LCBtb2R1bGVSZXN1bHQsIGJ1aWxkRmluZ2VycHJpbnQpOwotICAgICAgICBtUmVzdWx0Q2hlY2tzdW0ucHV0KHNpZ25hdHVyZSk7Ci0gICAgfQotCi0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNUZXN0UmVzdWx0KAotICAgICAgICAgICAgSVRlc3RSZXN1bHQgdGVzdFJlc3VsdCwgSU1vZHVsZVJlc3VsdCBtb2R1bGVSZXN1bHQsIFN0cmluZyBidWlsZEZpbmdlcnByaW50KSB7Ci0KLSAgICAgICAgU3RyaW5nIHNpZ25hdHVyZSA9IGdlbmVyYXRlVGVzdFJlc3VsdFNpZ25hdHVyZSh0ZXN0UmVzdWx0LCBtb2R1bGVSZXN1bHQsIGJ1aWxkRmluZ2VycHJpbnQpOwotICAgICAgICByZXR1cm4gbVJlc3VsdENoZWNrc3VtLm1pZ2h0Q29udGFpbihzaWduYXR1cmUpOwotICAgIH0KLQotICAgIC8qKioKLSAgICAgKiBDYWxjdWxhdGUgY2hlY2tzbSBvZiBtb2R1bGUgcmVzdWx0IGFuZCBzdG9yZSB2YWx1ZQotICAgICAqIEBwYXJhbSBtb2R1bGVSZXN1bHQgIHRoZSB0YXJnZXQgb2YgdGhlIGNoZWNrc3VtCi0gICAgICogQHBhcmFtIGJ1aWxkRmluZ2VycHJpbnQgdGhlIGZpbmdlcnByaW50IHRoZSB0ZXN0IGV4ZWN1dGlvbiBpcyBydW5uaW5nIGFnYWluc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRNb2R1bGVSZXN1bHQoSU1vZHVsZVJlc3VsdCBtb2R1bGVSZXN1bHQsIFN0cmluZyBidWlsZEZpbmdlcnByaW50KSB7Ci0gICAgICAgIG1SZXN1bHRDaGVja3N1bS5wdXQoCi0gICAgICAgICAgICAgICAgZ2VuZXJhdGVNb2R1bGVSZXN1bHRTaWduYXR1cmUobW9kdWxlUmVzdWx0LCBidWlsZEZpbmdlcnByaW50KSk7Ci0gICAgICAgIG1SZXN1bHRDaGVja3N1bS5wdXQoCi0gICAgICAgICAgICAgICAgZ2VuZXJhdGVNb2R1bGVTdW1tYXJ5U2lnbmF0dXJlKG1vZHVsZVJlc3VsdCwgYnVpbGRGaW5nZXJwcmludCkpOwotICAgIH0KLQotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHB1YmxpYyBCb29sZWFuIGNvbnRhaW5zTW9kdWxlUmVzdWx0KElNb2R1bGVSZXN1bHQgbW9kdWxlUmVzdWx0LCBTdHJpbmcgYnVpbGRGaW5nZXJwcmludCkgewotICAgICAgICByZXR1cm4gbVJlc3VsdENoZWNrc3VtLm1pZ2h0Q29udGFpbigKLSAgICAgICAgICAgICAgICBnZW5lcmF0ZU1vZHVsZVJlc3VsdFNpZ25hdHVyZShtb2R1bGVSZXN1bHQsIGJ1aWxkRmluZ2VycHJpbnQpKTsKLSAgICB9Ci0KLSAgICAvKioqCi0gICAgICogV3JpdGUgdGhlIGNoZWNrc3VtIGRhdGEgdG8gZGlzay4KLSAgICAgKiBPdmVyd3JpdGVzIGV4aXN0aW5nIGZpbGUKLSAgICAgKiBAcGFyYW0gZGlyZWN0b3J5Ci0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNhdmVUb0ZpbGUoRmlsZSBkaXJlY3RvcnkpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGRpcmVjdG9yeSwgTkFNRSk7Ci0KLSAgICAgICAgdHJ5IChGaWxlT3V0cHV0U3RyZWFtIGZpbGVTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlLCBmYWxzZSk7Ci0gICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShmaWxlU3RyZWFtKTsKLSAgICAgICAgICAgICBPYmplY3RPdXRwdXQgb2JqZWN0T3V0cHV0ID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShvdXRwdXRTdHJlYW0pKSB7Ci0gICAgICAgICAgICBvYmplY3RPdXRwdXQud3JpdGVTaG9ydChTRVJJQUxJWkVEX0ZPUk1BVF9DT0RFKTsKLSAgICAgICAgICAgIG9iamVjdE91dHB1dC53cml0ZVNob3J0KG1WZXJzaW9uKTsKLSAgICAgICAgICAgIG9iamVjdE91dHB1dC53cml0ZU9iamVjdChtUmVzdWx0Q2hlY2tzdW0pOwotICAgICAgICAgICAgb2JqZWN0T3V0cHV0LndyaXRlT2JqZWN0KG1GaWxlQ2hlY2tzdW0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgZG91YmxlIGdldENhcGFjaXR5KCkgewotICAgICAgICAvLyBJZiBkZWZhdWx0IEZQUCBjaGFuZ2VzOgotICAgICAgICAvLyBpbmNyZW1lbnQgdGhlIENVUlJFTlRfVkVSU0lPTiBhbmQgc2V0IHRoZSBkZW5vbWluYXRvciBiYXNlZCBvbiB0aGlzLm1WZXJzaW9uCi0gICAgICAgIHJldHVybiBtUmVzdWx0Q2hlY2tzdW0uZXhwZWN0ZWRGcHAoKSAvIERFRkFVTFRfRlBQOwotICAgIH0KLQotICAgIHN0YXRpYyBTdHJpbmcgZ2VuZXJhdGVUZXN0UmVzdWx0U2lnbmF0dXJlKElUZXN0UmVzdWx0IHRlc3RSZXN1bHQsIElNb2R1bGVSZXN1bHQgbW9kdWxlLAotICAgICAgICAgICAgU3RyaW5nIGJ1aWxkRmluZ2VycHJpbnQpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIFN0cmluZyBzdGFja3RyYWNlID0gdGVzdFJlc3VsdC5nZXRTdGFja1RyYWNlKCk7Ci0KLSAgICAgICAgc3RhY2t0cmFjZSA9IHN0YWNrdHJhY2UgPT0gbnVsbCA/ICIiIDogc3RhY2t0cmFjZS50cmltKCk7Ci0gICAgICAgIC8vIExpbmUgZW5kaW5ncyBmb3Igc3RhY2t0cmFjZXMgYXJlIHNvbWV3aGF0IHVucHJlZGljdGFibGUgYW5kIHRoZXJlIGlzIG5vIG5lZWQgdG8KLSAgICAgICAgLy8gYWN0dWFsbHkgcmVhZCB0aGUgcmVzdWx0IHRoZXkgYXJlIGFsbCByZW1vdmVkIGZvciBjb25zaXN0ZW5jeS4KLSAgICAgICAgc3RhY2t0cmFjZSA9IHN0YWNrdHJhY2UucmVwbGFjZUFsbCgiXFxyP1xcbnxcXHIiLCAiIik7Ci0gICAgICAgIHNiLmFwcGVuZChidWlsZEZpbmdlcnByaW50KS5hcHBlbmQoU0VQQVJBVE9SKQotICAgICAgICAgICAgICAgIC5hcHBlbmQobW9kdWxlLmdldElkKCkpLmFwcGVuZChTRVBBUkFUT1IpCi0gICAgICAgICAgICAgICAgLmFwcGVuZCh0ZXN0UmVzdWx0LmdldEZ1bGxOYW1lKCkpLmFwcGVuZChTRVBBUkFUT1IpCi0gICAgICAgICAgICAgICAgLmFwcGVuZCh0ZXN0UmVzdWx0LmdldFJlc3VsdFN0YXR1cygpLmdldFZhbHVlKCkpLmFwcGVuZChTRVBBUkFUT1IpCi0gICAgICAgICAgICAgICAgLmFwcGVuZChzdGFja3RyYWNlKS5hcHBlbmQoU0VQQVJBVE9SKTsKLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cmluZyBnZW5lcmF0ZVRlc3RSZXN1bHRTaWduYXR1cmUoCi0gICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBzdWl0ZU5hbWUsIFN0cmluZyBjYXNlTmFtZSwgU3RyaW5nIHRlc3ROYW1lLCBTdHJpbmcgYWJpLAotICAgICAgICAgICAgU3RyaW5nIHN0YXR1cywKLSAgICAgICAgICAgIFN0cmluZyBzdGFja3RyYWNlLAotICAgICAgICAgICAgU3RyaW5nIGJ1aWxkRmluZ2VycHJpbnQpIHsKLQotICAgICAgICBTdHJpbmcgdGVzdElkID0gYnVpbGRUZXN0SWQoc3VpdGVOYW1lLCBjYXNlTmFtZSwgdGVzdE5hbWUsIGFiaSk7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCi0gICAgICAgIHN0YWNrdHJhY2UgPSBzdGFja3RyYWNlID09IG51bGwgPyAiIiA6IHN0YWNrdHJhY2UudHJpbSgpOwotICAgICAgICAvLyBMaW5lIGVuZGluZ3MgZm9yIHN0YWNrdHJhY2VzIGFyZSBzb21ld2hhdCB1bnByZWRpY3RhYmxlIGFuZCB0aGVyZSBpcyBubyBuZWVkIHRvCi0gICAgICAgIC8vIGFjdHVhbGx5IHJlYWQgdGhlIHJlc3VsdCB0aGV5IGFyZSBhbGwgcmVtb3ZlZCBmb3IgY29uc2lzdGVuY3kuCi0gICAgICAgIHN0YWNrdHJhY2UgPSBzdGFja3RyYWNlLnJlcGxhY2VBbGwoIlxccj9cXG58XFxyIiwgIiIpOwotICAgICAgICBzYi5hcHBlbmQoYnVpbGRGaW5nZXJwcmludCkKLSAgICAgICAgICAgICAgICAuYXBwZW5kKFNFUEFSQVRPUikKLSAgICAgICAgICAgICAgICAuYXBwZW5kKHBhY2thZ2VOYW1lKQotICAgICAgICAgICAgICAgIC5hcHBlbmQoU0VQQVJBVE9SKQotICAgICAgICAgICAgICAgIC5hcHBlbmQodGVzdElkKQotICAgICAgICAgICAgICAgIC5hcHBlbmQoU0VQQVJBVE9SKQotICAgICAgICAgICAgICAgIC5hcHBlbmQoc3RhdHVzKQotICAgICAgICAgICAgICAgIC5hcHBlbmQoU0VQQVJBVE9SKQotICAgICAgICAgICAgICAgIC5hcHBlbmQoc3RhY2t0cmFjZSkKLSAgICAgICAgICAgICAgICAuYXBwZW5kKFNFUEFSQVRPUik7Ci0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBidWlsZFRlc3RJZCgKLSAgICAgICAgICAgIFN0cmluZyBzdWl0ZU5hbWUsIFN0cmluZyBjYXNlTmFtZSwgU3RyaW5nIHRlc3ROYW1lLCBTdHJpbmcgYWJpKSB7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gSm9pbmVyLm9uKE5BTUVfU0VQQVJBVE9SKS5za2lwTnVsbHMoKS5qb2luKAotICAgICAgICAgICAgICAgIFN0cmluZ3MuZW1wdHlUb051bGwoc3VpdGVOYW1lKSwKLSAgICAgICAgICAgICAgICBTdHJpbmdzLmVtcHR5VG9OdWxsKGNhc2VOYW1lKSwKLSAgICAgICAgICAgICAgICBTdHJpbmdzLmVtcHR5VG9OdWxsKHRlc3ROYW1lKSk7Ci0gICAgICAgIHJldHVybiBKb2luZXIub24oSURfU0VQQVJBVE9SKS5za2lwTnVsbHMoKS5qb2luKAotICAgICAgICAgICAgICAgIFN0cmluZ3MuZW1wdHlUb051bGwobmFtZSksCi0gICAgICAgICAgICAgICAgU3RyaW5ncy5lbXB0eVRvTnVsbChhYmkpKTsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZW5lcmF0ZU1vZHVsZVJlc3VsdFNpZ25hdHVyZShJTW9kdWxlUmVzdWx0IG1vZHVsZSwKLSAgICAgICAgICAgIFN0cmluZyBidWlsZEZpbmdlcnByaW50KSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBzYi5hcHBlbmQoYnVpbGRGaW5nZXJwcmludCkuYXBwZW5kKFNFUEFSQVRPUikKLSAgICAgICAgICAgICAgICAuYXBwZW5kKG1vZHVsZS5nZXRJZCgpKS5hcHBlbmQoU0VQQVJBVE9SKQotICAgICAgICAgICAgICAgIC5hcHBlbmQobW9kdWxlLmlzRG9uZSgpKS5hcHBlbmQoU0VQQVJBVE9SKQotICAgICAgICAgICAgICAgIC5hcHBlbmQobW9kdWxlLmNvdW50UmVzdWx0cyhUZXN0U3RhdHVzLkZBSUwpKTsKLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdlbmVyYXRlTW9kdWxlU3VtbWFyeVNpZ25hdHVyZShJTW9kdWxlUmVzdWx0IG1vZHVsZSwKLSAgICAgICAgICAgIFN0cmluZyBidWlsZEZpbmdlcnByaW50KSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBzYi5hcHBlbmQoYnVpbGRGaW5nZXJwcmludCkuYXBwZW5kKFNFUEFSQVRPUikKLSAgICAgICAgICAgICAgICAuYXBwZW5kKG1vZHVsZS5nZXRJZCgpKS5hcHBlbmQoU0VQQVJBVE9SKQotICAgICAgICAgICAgICAgIC5hcHBlbmQobW9kdWxlLmNvdW50UmVzdWx0cyhUZXN0U3RhdHVzLkZBSUwpKTsKLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgc3RhdGljIGJ5dGVbXSBjYWxjdWxhdGVGaWxlQ2hlY2tzdW0oRmlsZSBmaWxlKSB0aHJvd3MgQ2hlY2tzdW1WYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQotICAgICAgICB0cnkgKEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOwotICAgICAgICAgICAgIElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oZmlzKSkgewotICAgICAgICAgICAgTWVzc2FnZURpZ2VzdCBoYXNoU3VtID0gTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZSgiU0hBLTI1NiIpOwotICAgICAgICAgICAgaW50IGNudDsKLSAgICAgICAgICAgIGludCBidWZmZXJTaXplID0gODE5MjsKLSAgICAgICAgICAgIGJ5dGUgW10gYnVmZmVyID0gbmV3IGJ5dGVbYnVmZmVyU2l6ZV07Ci0gICAgICAgICAgICB3aGlsZSAoKGNudCA9IGlucHV0U3RyZWFtLnJlYWQoYnVmZmVyKSkgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBoYXNoU3VtLnVwZGF0ZShidWZmZXIsIDAsIGNudCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJ5dGVbXSBwYXJ0aWFsSGFzaCA9IG5ldyBieXRlWzMyXTsKLSAgICAgICAgICAgIGhhc2hTdW0uZGlnZXN0KHBhcnRpYWxIYXNoLCAwLCAzMik7Ci0gICAgICAgICAgICByZXR1cm4gcGFydGlhbEhhc2g7Ci0gICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ2hlY2tzdW1WYWxpZGF0aW9uRXhjZXB0aW9uKCJVbmFibGUgdG8gaGFzaCBmaWxlLiIsIGUpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ2hlY2tzdW1WYWxpZGF0aW9uRXhjZXB0aW9uKCJVbmFibGUgdG8gaGFzaCBmaWxlLiIsIGUpOwotICAgICAgICB9IGNhdGNoIChEaWdlc3RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENoZWNrc3VtVmFsaWRhdGlvbkV4Y2VwdGlvbigiVW5hYmxlIHRvIGhhc2ggZmlsZS4iLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGNvdW50VGVzdFJlc3VsdHMoSUludm9jYXRpb25SZXN1bHQgaW52b2NhdGlvbikgewotICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICBmb3IgKElNb2R1bGVSZXN1bHQgbW9kdWxlIDogaW52b2NhdGlvbi5nZXRNb2R1bGVzKCkpIHsKLSAgICAgICAgICAgIC8vIFR3byBlbnRyaWVzIHBlciBtb2R1bGUgKHJlc3VsdCAmIHN1bW1hcnkpCi0gICAgICAgICAgICBjb3VudCArPSAyOwotICAgICAgICAgICAgZm9yIChJQ2FzZVJlc3VsdCBjYXNlUmVzdWx0IDogbW9kdWxlLmdldFJlc3VsdHMoKSkgewotICAgICAgICAgICAgICAgIGNvdW50ICs9IGNhc2VSZXN1bHQuZ2V0UmVzdWx0cygpLnNpemUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY291bnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBDaGVja3N1bVZhbGlkYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotICAgICAgICBwdWJsaWMgQ2hlY2tzdW1WYWxpZGF0aW9uRXhjZXB0aW9uKFN0cmluZyBkZXRhaWxNZXNzYWdlKSB7Ci0gICAgICAgICAgICBzdXBlcihkZXRhaWxNZXNzYWdlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBDaGVja3N1bVZhbGlkYXRpb25FeGNlcHRpb24oU3RyaW5nIGRldGFpbE1lc3NhZ2UsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKLSAgICAgICAgICAgIHN1cGVyKGRldGFpbE1lc3NhZ2UsIHRocm93YWJsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9DcmFzaFV0aWxzLmphdmEgYi9jb21tb24vdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9DcmFzaFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMDUzMWMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQ3Jhc2hVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci1pbXBvcnQgb3JnLmpzb24uSlNPTkFycmF5OwotaW1wb3J0IG9yZy5qc29uLkpTT05FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmpzb24uSlNPTk9iamVjdDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotLyoqIENvbnRhaW5zIGhlbHBlciBmdW5jdGlvbnMgYW5kIHNoYXJlZCBjb25zdGFudHMgZm9yIGNyYXNoIHBhcnNpbmcuICovCi1wdWJsaWMgY2xhc3MgQ3Jhc2hVdGlscyB7Ci0gICAgLy8gdXNlZCB0byBvbmx5IGRldGVjdCBhY3R1YWwgYWRkcmVzc2VzIGluc3RlYWQgb2YgbnVsbHB0ciBhbmQgb3RoZXIgdW5saWtlbHkgdmFsdWVzCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIE1JTl9DUkFTSF9BRERSID0gbmV3IEJpZ0ludGVnZXIoIjgwMDAiLCAxNik7Ci0KLSAgICAvLyBNYXRjaGVzIHRoZSBlbmQgb2YgYSBjcmFzaAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGF0dGVybiBzRW5kb2ZDcmFzaFBhdHRlcm4gPQotICAgICAgICAgICAgUGF0dGVybi5jb21waWxlKCJERUJVR1xccys/Olxccys/YmFja3RyYWNlOiIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFVklDRV9QQVRIID0gIi9kYXRhL2xvY2FsL3RtcC9DcmFzaFBhcnNlclJlc3VsdHMvIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NLX0ZJTEVOQU1FID0gImxvY2tGaWxlLmxvYyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVBMT0FEX1JFUVVFU1QgPSAiUGxlYXNlIHVwbG9hZCBhIHJlc3VsdCBmaWxlIHRvIHN0YWdlZnJpZ2h0IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhdHRlcm4gc1VwbG9hZFJlcXVlc3RQYXR0ZXJuID0KLSAgICAgICAgICAgIFBhdHRlcm4uY29tcGlsZShVUExPQURfUkVRVUVTVCk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1RFU1RfQUxFUlQgPSAiTmV3IHRlc3Qgc3RhcnRpbmcgd2l0aCBuYW1lOiAiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGF0dGVybiBzTmV3VGVzdFBhdHRlcm4gPQotICAgICAgICAgICAgUGF0dGVybi5jb21waWxlKE5FV19URVNUX0FMRVJUICsgIihcXHcrPylcXCguKj9cXCkiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSUdOQUwgPSAic2lnbmFsIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIm5hbWUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0NFU1MgPSAicHJvY2VzcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUElEID0gInBpZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElEID0gInRpZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFVTFRfQUREUkVTUyA9ICJmYXVsdGFkZHJlc3MiOwotICAgIC8vIE1hdGNoZXMgdGhlIHNtYWxsZXN0IGJsb2IgdGhhdCBoYXMgdGhlIGFwcHJvcHJpYXRlIGhlYWRlciBhbmQgZm9vdGVyCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBzQ3Jhc2hCbG9iUGF0dGVybiA9Ci0gICAgICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoIkRFQlVHXFxzKz86KCBbKl17M30pKz8uKj9ERUJVR1xccys/Olxccys/YmFja3RyYWNlOiIsIFBhdHRlcm4uRE9UQUxMKTsKLSAgICAvLyBNYXRjaGVzIHByb2Nlc3MgaWQgYW5kIG5hbWUgbGluZSBhbmQgY2FwdHVyZXMgdGhlbQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gc1BpZHRpZE5hbWVQYXR0ZXJuID0KLSAgICAgICAgICAgIFBhdHRlcm4uY29tcGlsZSgicGlkOiAoXFxkKz8pLCB0aWQ6IChcXGQrPyksIG5hbWU6IChbXlxcc10rP1xccys/KSo/Pj4+ICguKj8pIDw8PCIpOwotICAgIC8vIE1hdGNoZXMgZmF1bHQgYWRkcmVzcyBhbmQgc2lnbmFsIHR5cGUgbGluZQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gc0ZhdWx0TGluZVBhdHRlcm4gPQotICAgICAgICAgICAgUGF0dGVybi5jb21waWxlKAotICAgICAgICAgICAgICAgICAgICAiXFx3Kz8gXFxkKz8gXFwoKC4qPylcXCksIGNvZGUgLSo/XFxkKz8gXFwoLio/XFwpLCBmYXVsdCBhZGRyICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIoPzoweChcXHB7WERpZ2l0fSspfC0rKSIpOwotICAgIC8vIE1hdGNoZXMgdGhlIGFib3J0IG1lc3NhZ2UgbGluZSBpZiBpdCBjb250YWlucyBDSEVDS18KLSAgICBwcml2YXRlIHN0YXRpYyBQYXR0ZXJuIHNBYm9ydE1lc3NhZ2VDaGVja1BhdHRlcm4gPQotICAgICAgICAgICAgUGF0dGVybi5jb21waWxlKCIoP2kpQWJvcnQgbWVzc2FnZS4qP0NIRUNLXyIpOwotCi0gICAgLyoqCi0gICAgICogcmV0dXJucyB0cnVlIGlmIHRoZSBzaWduYWwgaXMgYSBzZWdtZW50YXRpb24gZmF1bHQgb3IgYnVzIGVycm9yLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NlY3VyaXR5U2lnbmFsKEpTT05PYmplY3QgY3Jhc2gpIHRocm93cyBKU09ORXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGNyYXNoLmdldFN0cmluZyhTSUdOQUwpLnRvTG93ZXJDYXNlKCkubWF0Y2hlcygic2lnKHNlZ3Z8YnVzKSIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHJldHVybnMgdGhlIGZpbGVuYW1lIG9mIHRoZSBwcm9jZXNzLgotICAgICAqIGUuZy4gIi9zeXN0ZW0vYmluL21lZGlhc2VydmVyIiByZXR1cm5zICJtZWRpYXNlcnZlciIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQcm9jZXNzRmlsZU5hbWUoSlNPTk9iamVjdCBjcmFzaCkgdGhyb3dzIEpTT05FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbmV3IEZpbGUoY3Jhc2guZ2V0U3RyaW5nKFBST0NFU1MpKS5nZXROYW1lKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gaW5wdXQgaGFzIGEge0BsaW5rIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ3Jhc2h9IHRoYXQKLSAgICAgKiBzaG91bGQgZmFpbCBhbiBzdHMgdGVzdAotICAgICAqCi0gICAgICogQHBhcmFtIHByb2Nlc3NQYXR0ZXJucyBsaXN0IG9mIHBhdHRlcm5zIHRoYXQgbWF0Y2ggYXBwbGljYWJsZSBwcm9jZXNzIG5hbWVzCi0gICAgICogQHBhcmFtIGNoZWNrTWluQWRkciBpZiB0aGUgbWluaW11bSBmYXVsdCBhZGRyZXNzIHNob3VsZCBiZSByZXNwZWN0ZWQKLSAgICAgKiBAcGFyYW0gY3Jhc2hlcyBsaXN0IG9mIGNyYXNoZXMgdG8gY2hlY2sKLSAgICAgKiBAcmV0dXJuIGlmIGEgY3Jhc2ggaXMgc2VyaW91cyBlbm91Z2ggdG8gZmFpbCBhbiBzdHMgdGVzdAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzZWN1cml0eUNyYXNoRGV0ZWN0ZWQoCi0gICAgICAgICAgICBKU09OQXJyYXkgY3Jhc2hlcywgYm9vbGVhbiBjaGVja01pbkFkZHIsIFBhdHRlcm4uLi4gcHJvY2Vzc1BhdHRlcm5zKSB7Ci0gICAgICAgIHJldHVybiBtYXRjaFNlY3VyaXR5Q3Jhc2hlcyhjcmFzaGVzLCBjaGVja01pbkFkZHIsIHByb2Nlc3NQYXR0ZXJucykubGVuZ3RoKCkgPiAwOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQmlnSW50ZWdlciBnZXRCaWdJbnRlZ2VyKEpTT05PYmplY3Qgc291cmNlLCBTdHJpbmcgbmFtZSkgdGhyb3dzIEpTT05FeGNlcHRpb24gewotICAgICAgICBpZiAoc291cmNlLmlzTnVsbChuYW1lKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIGludFN0cmluZyA9IHNvdXJjZS5nZXRTdHJpbmcobmFtZSk7Ci0gICAgICAgIEJpZ0ludGVnZXIgdmFsdWUgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdmFsdWUgPSBuZXcgQmlnSW50ZWdlcihpbnRTdHJpbmcsIDE2KTsKLSAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHt9Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmVzIHdoaWNoIGdpdmVuIGlucHV0cyBoYXZlIGEge0BsaW5rIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ3Jhc2h9IHRoYXQKLSAgICAgKiBzaG91bGQgZmFpbCBhbiBzdHMgdGVzdAotICAgICAqCi0gICAgICogQHBhcmFtIHByb2Nlc3NQYXR0ZXJucyBsaXN0IG9mIHBhdHRlcm5zIHRoYXQgbWF0Y2ggYXBwbGljYWJsZSBwcm9jZXNzIG5hbWVzCi0gICAgICogQHBhcmFtIGNoZWNrTWluQWRkciBpZiB0aGUgbWluaW11bSBmYXVsdCBhZGRyZXNzIHNob3VsZCBiZSByZXNwZWN0ZWQKLSAgICAgKiBAcGFyYW0gY3Jhc2hlcyBsaXN0IG9mIGNyYXNoZXMgdG8gY2hlY2sKLSAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGNyYXNoZXMgc2VyaW91cyBlbm91Z2ggdG8gZmFpbCBhbiBzdHMgdGVzdAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSlNPTkFycmF5IG1hdGNoU2VjdXJpdHlDcmFzaGVzKAotICAgICAgICAgICAgSlNPTkFycmF5IGNyYXNoZXMsIGJvb2xlYW4gY2hlY2tNaW5BZGRyLCBQYXR0ZXJuLi4uIHByb2Nlc3NQYXR0ZXJucykgewotICAgICAgICBKU09OQXJyYXkgc2VjdXJpdHlDcmFzaGVzID0gbmV3IEpTT05BcnJheSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNyYXNoZXMubGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBKU09OT2JqZWN0IGNyYXNoID0gY3Jhc2hlcy5nZXRKU09OT2JqZWN0KGkpOwotICAgICAgICAgICAgICAgIGlmICghbWF0Y2hlc0FueShnZXRQcm9jZXNzRmlsZU5hbWUoY3Jhc2gpLCBwcm9jZXNzUGF0dGVybnMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIWlzU2VjdXJpdHlTaWduYWwoY3Jhc2gpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIGZhdWx0QWRkcmVzcyA9IGdldEJpZ0ludGVnZXIoY3Jhc2gsIEZBVUxUX0FERFJFU1MpOwotICAgICAgICAgICAgICAgIGlmIChjaGVja01pbkFkZHIgJiYgZmF1bHRBZGRyZXNzICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIGZhdWx0QWRkcmVzcy5jb21wYXJlVG8oTUlOX0NSQVNIX0FERFIpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2VjdXJpdHlDcmFzaGVzLnB1dChjcmFzaCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChKU09ORXhjZXB0aW9uIHwgTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkge30KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2VjdXJpdHlDcmFzaGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHJldHVybnMgdHJ1ZSBpZiB0aGUgaW5wdXQgbWF0Y2hlcyBhbnkgb2YgdGhlIHBhdHRlcm5zLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gbWF0Y2hlc0FueShTdHJpbmcgaW5wdXQsIFBhdHRlcm4uLi4gcGF0dGVybnMpIHsKLSAgICAgICAgZm9yIChQYXR0ZXJuIHAgOiBwYXR0ZXJucykgewotICAgICAgICAgICAgaWYgKHAubWF0Y2hlcihpbnB1dCkubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKiBBZGRzIGFsbCBjcmFzaGVzIGZvdW5kIGluIHRoZSBpbnB1dCBhcyBKU09OT2JqZWN0cyB0byB0aGUgZ2l2ZW4gSlNPTkFycmF5ICovCi0gICAgcHVibGljIHN0YXRpYyBKU09OQXJyYXkgYWRkQWxsQ3Jhc2hlcyhTdHJpbmcgaW5wdXQsIEpTT05BcnJheSBjcmFzaGVzKSB7Ci0gICAgICAgIE1hdGNoZXIgY3Jhc2hCbG9iRmluZGVyID0gc0NyYXNoQmxvYlBhdHRlcm4ubWF0Y2hlcihpbnB1dCk7Ci0gICAgICAgIHdoaWxlIChjcmFzaEJsb2JGaW5kZXIuZmluZCgpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgY3Jhc2hTdHIgPSBjcmFzaEJsb2JGaW5kZXIuZ3JvdXAoMCk7Ci0gICAgICAgICAgICBpbnQgdGlkID0gMDsKLSAgICAgICAgICAgIGludCBwaWQgPSAwOwotICAgICAgICAgICAgQmlnSW50ZWdlciBmYXVsdEFkZHJlc3MgPSBudWxsOwotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBudWxsOwotICAgICAgICAgICAgU3RyaW5nIHByb2Nlc3MgPSBudWxsOwotICAgICAgICAgICAgU3RyaW5nIHNpZ25hbCA9IG51bGw7Ci0KLSAgICAgICAgICAgIE1hdGNoZXIgcGlkdGlkTmFtZU1hdGNoZXIgPSBzUGlkdGlkTmFtZVBhdHRlcm4ubWF0Y2hlcihjcmFzaFN0cik7Ci0gICAgICAgICAgICBpZiAocGlkdGlkTmFtZU1hdGNoZXIuZmluZCgpKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgcGlkID0gSW50ZWdlci5wYXJzZUludChwaWR0aWROYW1lTWF0Y2hlci5ncm91cCgxKSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHt9Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgdGlkID0gSW50ZWdlci5wYXJzZUludChwaWR0aWROYW1lTWF0Y2hlci5ncm91cCgyKSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHt9Ci0gICAgICAgICAgICAgICAgbmFtZSA9IHBpZHRpZE5hbWVNYXRjaGVyLmdyb3VwKDMpLnRyaW0oKTsKLSAgICAgICAgICAgICAgICBwcm9jZXNzID0gcGlkdGlkTmFtZU1hdGNoZXIuZ3JvdXAoNCkudHJpbSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBNYXRjaGVyIGZhdWx0TGluZU1hdGNoZXIgPSBzRmF1bHRMaW5lUGF0dGVybi5tYXRjaGVyKGNyYXNoU3RyKTsKLSAgICAgICAgICAgIGlmIChmYXVsdExpbmVNYXRjaGVyLmZpbmQoKSkgewotICAgICAgICAgICAgICAgIHNpZ25hbCA9IGZhdWx0TGluZU1hdGNoZXIuZ3JvdXAoMSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZhdWx0QWRkck1hdGNoID0gZmF1bHRMaW5lTWF0Y2hlci5ncm91cCgyKTsKLSAgICAgICAgICAgICAgICBpZiAoZmF1bHRBZGRyTWF0Y2ggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHRBZGRyZXNzID0gbmV3IEJpZ0ludGVnZXIoZmF1bHRBZGRyTWF0Y2gsIDE2KTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHt9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFzQWJvcnRNZXNzYWdlQ2hlY2tQYXR0ZXJuLm1hdGNoZXIoY3Jhc2hTdHIpLmZpbmQoKSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIEpTT05PYmplY3QgY3Jhc2ggPSBuZXcgSlNPTk9iamVjdCgpOwotICAgICAgICAgICAgICAgICAgICBjcmFzaC5wdXQoUElELCBwaWQpOwotICAgICAgICAgICAgICAgICAgICBjcmFzaC5wdXQoVElELCB0aWQpOwotICAgICAgICAgICAgICAgICAgICBjcmFzaC5wdXQoTkFNRSwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGNyYXNoLnB1dChQUk9DRVNTLCBwcm9jZXNzKTsKLSAgICAgICAgICAgICAgICAgICAgY3Jhc2gucHV0KEZBVUxUX0FERFJFU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHRBZGRyZXNzID09IG51bGwgPyBudWxsIDogZmF1bHRBZGRyZXNzLnRvU3RyaW5nKDE2KSk7Ci0gICAgICAgICAgICAgICAgICAgIGNyYXNoLnB1dChTSUdOQUwsIHNpZ25hbCk7Ci0gICAgICAgICAgICAgICAgICAgIGNyYXNoZXMucHV0KGNyYXNoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChKU09ORXhjZXB0aW9uIGUpIHt9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNyYXNoZXM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvRGV2aWNlUHJvcGVydHlJbmZvLmphdmEgYi9jb21tb24vdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9EZXZpY2VQcm9wZXJ0eUluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRhYjYxZS4uMDAwMDAwMAotLS0gYS9jb21tb24vdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9EZXZpY2VQcm9wZXJ0eUluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIGZvciBjb2xsZWN0aW5nIGRldmljZSBpbmZvcm1hdGlvbi4gVGhpcyBpcyB1c2VkIHRvIGVuZm9yY2UKLSAqIGNvbnNpc3RlbnQgcHJvcGVydHkgY29sbGVjdGlvbiBob3N0LXNpZGUgYW5kIGRldmljZS1zaWRlIGZvciBDVFMgcmVwb3J0cy4KLSAqCi0gKiBOb3RlIHRoYXQgcHJvcGVydGllcyBhY3Jvc3Mgc291cmNlcyBjYW4gZGlmZmVyLCBlLmcuIHtAY29kZSBhbmRyb2lkLm9zLkJ1aWxkfQotICogcHJvcGVydGllcyBzb21ldGltZXMgZGV2aWF0ZSBmcm9tIHRoZSByZWFkLW9ubHkgcHJvcGVydGllcyB0aGF0IHRoZXkncmUgYmFzZWQKLSAqIG9uLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRGV2aWNlUHJvcGVydHlJbmZvIHsKLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1BYmk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUFiaTI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUFiaXM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUFiaXMzMjsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQWJpczY0OwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Cb2FyZDsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQnJhbmQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbURldmljZTsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtRmluZ2VycHJpbnQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUlkOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1NYW51ZmFjdHVyZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbU1vZGVsOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Qcm9kdWN0OwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1SZWZlcmVuY2VGaW5nZXJwcmludDsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtU2VyaWFsOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1UYWdzOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1UeXBlOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1WZXJzaW9uQmFzZU9zOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1WZXJzaW9uUmVsZWFzZTsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtVmVyc2lvblNkazsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtVmVyc2lvblNlY3VyaXR5UGF0Y2g7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVZlcnNpb25JbmNyZW1lbnRhbDsKLQotICAgIHB1YmxpYyBEZXZpY2VQcm9wZXJ0eUluZm8oU3RyaW5nIGFiaSwgU3RyaW5nIGFiaTIsIFN0cmluZyBhYmlzLCBTdHJpbmcgYWJpczMyLCBTdHJpbmcgYWJpczY0LAotICAgICAgICAgICAgU3RyaW5nIGJvYXJkLCBTdHJpbmcgYnJhbmQsIFN0cmluZyBkZXZpY2UsIFN0cmluZyBmaW5nZXJwcmludCwgU3RyaW5nIGlkLAotICAgICAgICAgICAgU3RyaW5nIG1hbnVmYWN0dXJlciwgU3RyaW5nIG1vZGVsLCBTdHJpbmcgcHJvZHVjdCwgU3RyaW5nIHJlZmVyZW5jZUZpZ2VycHJpbnQsCi0gICAgICAgICAgICBTdHJpbmcgc2VyaWFsLCBTdHJpbmcgdGFncywgU3RyaW5nIHR5cGUsIFN0cmluZyB2ZXJzaW9uQmFzZU9zLCBTdHJpbmcgdmVyc2lvblJlbGVhc2UsCi0gICAgICAgICAgICBTdHJpbmcgdmVyc2lvblNkaywgU3RyaW5nIHZlcnNpb25TZWN1cml0eVBhdGNoLCBTdHJpbmcgdmVyc2lvbkluY3JlbWVudGFsKSB7Ci0gICAgICAgIG1BYmkgPSBhYmk7Ci0gICAgICAgIG1BYmkyID0gYWJpMjsKLSAgICAgICAgbUFiaXMgPSBhYmlzOwotICAgICAgICBtQWJpczMyID0gYWJpczMyOwotICAgICAgICBtQWJpczY0ID0gYWJpczY0OwotICAgICAgICBtQm9hcmQgPSBib2FyZDsKLSAgICAgICAgbUJyYW5kID0gYnJhbmQ7Ci0gICAgICAgIG1EZXZpY2UgPSBkZXZpY2U7Ci0gICAgICAgIG1GaW5nZXJwcmludCA9IGZpbmdlcnByaW50OwotICAgICAgICBtSWQgPSBpZDsKLSAgICAgICAgbU1hbnVmYWN0dXJlciA9IG1hbnVmYWN0dXJlcjsKLSAgICAgICAgbU1vZGVsID0gbW9kZWw7Ci0gICAgICAgIG1Qcm9kdWN0ID0gcHJvZHVjdDsKLSAgICAgICAgbVJlZmVyZW5jZUZpbmdlcnByaW50ID0gcmVmZXJlbmNlRmlnZXJwcmludDsKLSAgICAgICAgbVNlcmlhbCA9IHNlcmlhbDsKLSAgICAgICAgbVRhZ3MgPSB0YWdzOwotICAgICAgICBtVHlwZSA9IHR5cGU7Ci0gICAgICAgIG1WZXJzaW9uQmFzZU9zID0gdmVyc2lvbkJhc2VPczsKLSAgICAgICAgbVZlcnNpb25SZWxlYXNlID0gdmVyc2lvblJlbGVhc2U7Ci0gICAgICAgIG1WZXJzaW9uU2RrID0gdmVyc2lvblNkazsKLSAgICAgICAgbVZlcnNpb25TZWN1cml0eVBhdGNoID0gdmVyc2lvblNlY3VyaXR5UGF0Y2g7Ci0gICAgICAgIG1WZXJzaW9uSW5jcmVtZW50YWwgPSB2ZXJzaW9uSW5jcmVtZW50YWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGEge0Bjb2RlIE1hcH0gd2l0aCBwcm9wZXJ0eSBrZXlzIHByZXBlbmRlZCB3aXRoIGEgZ2l2ZW4gcHJlZml4Ci0gICAgICogc3RyaW5nLiBUaGlzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgdG8gZ2VuZXJhdGUgZW50cmllcyBmb3IKLSAgICAgKiB7QGNvZGV9IEJ1aWxkIHRhZyBhdHRyaWJ1dGVzIGluIENUUyB0ZXN0IHJlc3VsdHMuCi0gICAgICovCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0UHJvcGVydHl0TWFwV2l0aFByZWZpeChTdHJpbmcgcHJlZml4KSB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydHlNYXAgPSBuZXcgSGFzaE1hcDw+KCk7Ci0KLSAgICAgICAgcHJvcGVydHlNYXAucHV0KHByZWZpeCArICJhYmkiLCBtQWJpKTsKLSAgICAgICAgcHJvcGVydHlNYXAucHV0KHByZWZpeCArICJhYmkyIiwgbUFiaTIpOwotICAgICAgICBwcm9wZXJ0eU1hcC5wdXQocHJlZml4ICsgImFiaXMiLCBtQWJpcyk7Ci0gICAgICAgIHByb3BlcnR5TWFwLnB1dChwcmVmaXggKyAiYWJpc18zMiIsIG1BYmlzMzIpOwotICAgICAgICBwcm9wZXJ0eU1hcC5wdXQocHJlZml4ICsgImFiaXNfNjQiLCBtQWJpczY0KTsKLSAgICAgICAgcHJvcGVydHlNYXAucHV0KHByZWZpeCArICJib2FyZCIsIG1Cb2FyZCk7Ci0gICAgICAgIHByb3BlcnR5TWFwLnB1dChwcmVmaXggKyAiYnJhbmQiLCBtQnJhbmQpOwotICAgICAgICBwcm9wZXJ0eU1hcC5wdXQocHJlZml4ICsgImRldmljZSIsIG1EZXZpY2UpOwotICAgICAgICBwcm9wZXJ0eU1hcC5wdXQocHJlZml4ICsgImZpbmdlcnByaW50IiwgbUZpbmdlcnByaW50KTsKLSAgICAgICAgcHJvcGVydHlNYXAucHV0KHByZWZpeCArICJpZCIsIG1JZCk7Ci0gICAgICAgIHByb3BlcnR5TWFwLnB1dChwcmVmaXggKyAibWFudWZhY3R1cmVyIiwgbU1hbnVmYWN0dXJlcik7Ci0gICAgICAgIHByb3BlcnR5TWFwLnB1dChwcmVmaXggKyAibW9kZWwiLCBtTW9kZWwpOwotICAgICAgICBwcm9wZXJ0eU1hcC5wdXQocHJlZml4ICsgInByb2R1Y3QiLCBtUHJvZHVjdCk7Ci0gICAgICAgIHByb3BlcnR5TWFwLnB1dChwcmVmaXggKyAicmVmZXJlbmNlX2ZpbmdlcnByaW50IiwgbVJlZmVyZW5jZUZpbmdlcnByaW50KTsKLSAgICAgICAgcHJvcGVydHlNYXAucHV0KHByZWZpeCArICJzZXJpYWwiLCBtU2VyaWFsKTsKLSAgICAgICAgcHJvcGVydHlNYXAucHV0KHByZWZpeCArICJ0YWdzIiwgbVRhZ3MpOwotICAgICAgICBwcm9wZXJ0eU1hcC5wdXQocHJlZml4ICsgInR5cGUiLCBtVHlwZSk7Ci0gICAgICAgIHByb3BlcnR5TWFwLnB1dChwcmVmaXggKyAidmVyc2lvbl9iYXNlX29zIiwgbVZlcnNpb25CYXNlT3MpOwotICAgICAgICBwcm9wZXJ0eU1hcC5wdXQocHJlZml4ICsgInZlcnNpb25fcmVsZWFzZSIsIG1WZXJzaW9uUmVsZWFzZSk7Ci0gICAgICAgIHByb3BlcnR5TWFwLnB1dChwcmVmaXggKyAidmVyc2lvbl9zZGsiLCBtVmVyc2lvblNkayk7Ci0gICAgICAgIHByb3BlcnR5TWFwLnB1dChwcmVmaXggKyAidmVyc2lvbl9zZWN1cml0eV9wYXRjaCIsIG1WZXJzaW9uU2VjdXJpdHlQYXRjaCk7Ci0gICAgICAgIHByb3BlcnR5TWFwLnB1dChwcmVmaXggKyAidmVyc2lvbl9pbmNyZW1lbnRhbCIsIG1WZXJzaW9uSW5jcmVtZW50YWwpOwotCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eU1hcDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0R5bmFtaWNDb25maWcuamF2YSBiL2NvbW1vbi91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0R5bmFtaWNDb25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVmYzVlMS4uMDAwMDAwMAotLS0gYS9jb21tb24vdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9EeW5hbWljQ29uZmlnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKLQotaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7Ci1pbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRmFjdG9yeTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogTG9hZCBkeW5hbWljIGNvbmZpZyBmb3IgdGVzdCBjYXNlcwotICovCi1wdWJsaWMgY2xhc3MgRHluYW1pY0NvbmZpZyB7Ci0KLSAgICAvL1hNTCBjb25zdGFudAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5TID0gbnVsbDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfVEFHID0gImR5bmFtaWNDb25maWciOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVFJZX1RBRyA9ICJlbnRyeSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfVEFHID0gInZhbHVlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQVRUUiA9ICJrZXkiOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENPTkZJR19GT0xERVJfT05fREVWSUNFID0gIi9zZGNhcmQvZHluYW1pYy1jb25maWctZmlsZXMvIjsKLQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IG1EeW5hbWljQ29uZmlnTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+KCk7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ29uZmlnKEZpbGUgZmlsZSkgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgbUR5bmFtaWNDb25maWdNYXAgPSBjcmVhdGVDb25maWdNYXAoZmlsZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZShTdHJpbmcga2V5KSB7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBzaW5nbGVWYWx1ZSA9IG1EeW5hbWljQ29uZmlnTWFwLmdldChrZXkpOwotICAgICAgICBpZiAoc2luZ2xlVmFsdWUgPT0gbnVsbCB8fCBzaW5nbGVWYWx1ZS5zaXplKCkgPT0gMCB8fCBzaW5nbGVWYWx1ZS5zaXplKCkgPiAxKSB7Ci0gICAgICAgICAgICAvLyBrZXkgbXVzdCBleGlzdCBpbiB0aGUgbWFwLCBhbmQgbWFwIHRvIGEgbGlzdCBjb250YWluaW5nIGV4YWN0bHkgb25lIHN0cmluZwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNpbmdsZVZhbHVlLmdldCgwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFZhbHVlcyhTdHJpbmcga2V5KSB7Ci0gICAgICAgIHJldHVybiBtRHluYW1pY0NvbmZpZ01hcC5nZXQoa2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2V0PFN0cmluZz4ga2V5U2V0KCkgewotICAgICAgICByZXR1cm4gbUR5bmFtaWNDb25maWdNYXAua2V5U2V0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBGaWxlIGdldENvbmZpZ0ZpbGUoRmlsZSBjb25maWdGb2xkZXIsIFN0cmluZyBtb2R1bGVOYW1lKQotICAgICAgICAgICAgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgY29uZmlnID0gIG5ldyBGaWxlKGNvbmZpZ0ZvbGRlciwgU3RyaW5nLmZvcm1hdCgiJXMuZHluYW1pYyIsIG1vZHVsZU5hbWUpKTsKLSAgICAgICAgaWYgKCFjb25maWcuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiQ2Fubm90IGZpbmQgJXMuZHluYW1pYyIsIG1vZHVsZU5hbWUpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29uZmlnOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBjcmVhdGVDb25maWdNYXAoRmlsZSBmaWxlKQotICAgICAgICAgICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQotICAgICAgICBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGR5bmFtaWNDb25maWdNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4oKTsKLSAgICAgICAgWG1sUHVsbFBhcnNlciBwYXJzZXIgPSBYbWxQdWxsUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1B1bGxQYXJzZXIoKTsKLSAgICAgICAgcGFyc2VyLnNldElucHV0KG5ldyBJbnB1dFN0cmVhbVJlYWRlcihuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpKSk7Ci0gICAgICAgIHBhcnNlci5uZXh0VGFnKCk7Ci0gICAgICAgIHBhcnNlci5yZXF1aXJlKFhtbFB1bGxQYXJzZXIuU1RBUlRfVEFHLCBOUywgQ09ORklHX1RBRyk7Ci0KLSAgICAgICAgd2hpbGUgKHBhcnNlci5uZXh0VGFnKCkgPT0gWG1sUHVsbFBhcnNlci5TVEFSVF9UQUcpIHsKLSAgICAgICAgICAgIHBhcnNlci5yZXF1aXJlKFhtbFB1bGxQYXJzZXIuU1RBUlRfVEFHLCBOUywgRU5UUllfVEFHKTsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoTlMsIEtFWV9BVFRSKTsKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiB2YWx1ZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgIHdoaWxlIChwYXJzZXIubmV4dFRhZygpID09IFhtbFB1bGxQYXJzZXIuU1RBUlRfVEFHKSB7Ci0gICAgICAgICAgICAgICAgcGFyc2VyLnJlcXVpcmUoWG1sUHVsbFBhcnNlci5TVEFSVF9UQUcsIE5TLCBWQUxVRV9UQUcpOwotICAgICAgICAgICAgICAgIHZhbHVlTGlzdC5hZGQocGFyc2VyLm5leHRUZXh0KCkpOwotICAgICAgICAgICAgICAgIHBhcnNlci5yZXF1aXJlKFhtbFB1bGxQYXJzZXIuRU5EX1RBRywgTlMsIFZBTFVFX1RBRyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwYXJzZXIucmVxdWlyZShYbWxQdWxsUGFyc2VyLkVORF9UQUcsIE5TLCBFTlRSWV9UQUcpOwotICAgICAgICAgICAgaWYgKGtleSAhPSBudWxsICYmICFrZXkuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgZHluYW1pY0NvbmZpZ01hcC5wdXQoa2V5LCB2YWx1ZUxpc3QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcGFyc2VyLnJlcXVpcmUoWG1sUHVsbFBhcnNlci5FTkRfVEFHLCBOUywgQ09ORklHX1RBRyk7Ci0gICAgICAgIHJldHVybiBkeW5hbWljQ29uZmlnTWFwOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0ZpbGVVdGlsLmphdmEgYi9jb21tb24vdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9GaWxlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTk5MTJiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0ZpbGVVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLS8qKgotICogQSBoZWxwZXIgY2xhc3MgZm9yIGZpbGUgcmVsYXRlZCBvcGVyYXRpb25zCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlVXRpbCB7Ci0KLSAgICAvKioKLSAgICAgKiBSZWN1cnNpdmVseSBkZWxldGUgZ2l2ZW4gZmlsZSBvciBkaXJlY3RvcnkgYW5kIGFsbCBpdHMgY29udGVudHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcm9vdERpciB0aGUgZGlyZWN0b3J5IG9yIGZpbGUgdG8gYmUgZGVsZXRlZDsgY2FuIGJlIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVjdXJzaXZlRGVsZXRlKEZpbGUgcm9vdERpcikgewotICAgICAgICBpZiAocm9vdERpciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAocm9vdERpci5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgRmlsZVtdIGNoaWxkRmlsZXMgPSByb290RGlyLmxpc3RGaWxlcygpOwotICAgICAgICAgICAgICAgIGlmIChjaGlsZEZpbGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChGaWxlIGNoaWxkIDogY2hpbGRGaWxlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJzaXZlRGVsZXRlKGNoaWxkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJvb3REaXIuZGVsZXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIGhlbHBlciBtZXRob2QgZm9yIHdyaXRpbmcgc3RyZWFtIGRhdGEgdG8gZmlsZQotICAgICAqCi0gICAgICogQHBhcmFtIGlucHV0IHRoZSB1bmJ1ZmZlcmVkIGlucHV0IHN0cmVhbQotICAgICAqIEBwYXJhbSBkZXN0RmlsZSB0aGUgZGVzdCBmaWxlIHRvIHdyaXRlIHRvCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlVG9GaWxlKElucHV0U3RyZWFtIGlucHV0LCBGaWxlIGRlc3RGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBJbnB1dFN0cmVhbSBvcmlnU3RyZWFtID0gbnVsbDsKLSAgICAgICAgT3V0cHV0U3RyZWFtIGRlc3RTdHJlYW0gPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgb3JpZ1N0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGlucHV0KTsKLSAgICAgICAgICAgIGRlc3RTdHJlYW0gPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oZGVzdEZpbGUpKTsKLSAgICAgICAgICAgIFN0cmVhbVV0aWwuY29weVN0cmVhbXMob3JpZ1N0cmVhbSwgZGVzdFN0cmVhbSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBvcmlnU3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICBkZXN0U3RyZWFtLmZsdXNoKCk7Ci0gICAgICAgICAgICBkZXN0U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0lDYXNlUmVzdWx0LmphdmEgYi9jb21tb24vdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9JQ2FzZVJlc3VsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTA0ZDY5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0lDYXNlUmVzdWx0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIERhdGEgc3RydWN0dXJlIGZvciBhIENvbXBhdGliaWxpdHkgdGVzdCBjYXNlIHJlc3VsdC4KLSAqLwotcHVibGljIGludGVyZmFjZSBJQ2FzZVJlc3VsdCBleHRlbmRzIENvbXBhcmFibGU8SUNhc2VSZXN1bHQ+IHsKLQotICAgIFN0cmluZyBnZXROYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEge0BsaW5rIElUZXN0UmVzdWx0fSBmb3IgdGhlIGdpdmVuIHRlc3QsIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXNuJ3QgZXhpc3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUgdGhlIG5hbWUgb2YgdGhlIHRlc3QgZWcgJmx0O21ldGhvZC1uYW1lJmd0OwotICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBJVGVzdFJlc3VsdH0gb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKi8KLSAgICBJVGVzdFJlc3VsdCBnZXRPckNyZWF0ZVJlc3VsdChTdHJpbmcgdGVzdE5hbWUpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUge0BsaW5rIElUZXN0UmVzdWx0fSBmb3IgZ2l2ZW4gdGVzdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0ZXN0TmFtZSB0aGUgbmFtZSBvZiB0aGUgdGVzdCBlZyAmbHQ7bWV0aG9kLW5hbWUmZ3Q7Ci0gICAgICogQHJldHVybiB0aGUge0BsaW5rIElUZXN0UmVzdWx0fSBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqLwotICAgIElUZXN0UmVzdWx0IGdldFJlc3VsdChTdHJpbmcgdGVzdE5hbWUpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyBhbGwgcmVzdWx0cyBzb3J0ZWQgYnkgbmFtZS4KLSAgICAgKi8KLSAgICBMaXN0PElUZXN0UmVzdWx0PiBnZXRSZXN1bHRzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGFsbCByZXN1bHRzIHdoaWNoIGhhdmUgdGhlIGdpdmVuIHN0YXR1cy4KLSAgICAgKi8KLSAgICBMaXN0PElUZXN0UmVzdWx0PiBnZXRSZXN1bHRzKFRlc3RTdGF0dXMgc3RhdHVzKTsKLQotICAgIC8qKgotICAgICAqIENvdW50cyB0aGUgbnVtYmVyIG9mIHJlc3VsdHMgd2hpY2ggaGF2ZSB0aGUgZ2l2ZW4gc3RhdHVzLgotICAgICAqLwotICAgIGludCBjb3VudFJlc3VsdHMoVGVzdFN0YXR1cyBzdGF0dXMpOwotCi0gICAgLyoqCi0gICAgICogTWVyZ2UgdGhlIGNhc2UgcmVzdWx0cyBmcm9tIG90aGVyQ2FzZVJlc3VsdCBpbnRvIHRoaXMgY2FzZVJlc3VsdC4KLSAgICAgKi8KLSAgICB2b2lkIG1lcmdlRnJvbShJQ2FzZVJlc3VsdCBvdGhlckNhc2VSZXN1bHQpOwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvSUludm9jYXRpb25SZXN1bHQuamF2YSBiL2NvbW1vbi91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0lJbnZvY2F0aW9uUmVzdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ZWNhMmQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvSUludm9jYXRpb25SZXN1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBhIHRoZSByZXN1bHQgb2YgYSBzaW5nbGUgQ29tcGF0aWJpbGl0eSBpbnZvY2F0aW9uLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElJbnZvY2F0aW9uUmVzdWx0IHsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHN0YXJ0aW5nIHRpbWVzdGFtcC4KLSAgICAgKi8KLSAgICBsb25nIGdldFN0YXJ0VGltZSgpOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHRpbWUgdGhlIHN0YXJ0aW5nIHRpbWVzdGFtcAotICAgICAqLwotICAgIHZvaWQgc2V0U3RhcnRUaW1lKGxvbmcgdGltZSk7Ci0KLSAgICAvKioKLSAgICAgKiBDb3VudCB0aGUgbnVtYmVyIG9mIHJlc3VsdHMgd2l0aCBnaXZlbiBzdGF0dXMuCi0gICAgICovCi0gICAgaW50IGNvdW50UmVzdWx0cyhUZXN0U3RhdHVzIHJlc3VsdCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgdGVzdHMgdGhhdCBoYXZlIG5vdCBiZWVuIGV4ZWN1dGVkIGluIHRoaXMgbW9kdWxlUmVzdWx0LgotICAgICAqLwotICAgIGludCBnZXROb3RFeGVjdXRlZCgpOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHBsYW4gdGhlIHBsYW4gYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVzdWx0LgotICAgICAqLwotICAgIHZvaWQgc2V0VGVzdFBsYW4oU3RyaW5nIHBsYW4pOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgdGVzdCBwbGFuIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlc3VsdC4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0VGVzdFBsYW4oKTsKLQotICAgIC8qKgotICAgICAqIEFkZHMgdGhlIGdpdmVuIGRldmljZSBzZXJpYWwgdG8gdGhlIHJlc3VsdC4KLSAgICAgKi8KLSAgICB2b2lkIGFkZERldmljZVNlcmlhbChTdHJpbmcgc2VyaWFsKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIGRldmljZSBzZXJpYWxzIGFzc29jaWF0ZWQgd2l0aCByZXN1bHQuCi0gICAgICovCi0gICAgU2V0PFN0cmluZz4gZ2V0RGV2aWNlU2VyaWFscygpOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUge0BsaW5rIElNb2R1bGVSZXN1bHR9IGZvciB0aGUgZ2l2ZW4gaWQsIGNyZWF0aW5nIG9uZSBpZiBpdCBkb2Vzbid0IGV4aXN0Ci0gICAgICovCi0gICAgSU1vZHVsZVJlc3VsdCBnZXRPckNyZWF0ZU1vZHVsZShTdHJpbmcgaWQpOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUge0BsaW5rIElNb2R1bGVSZXN1bHR9cyBzb3J0ZWQgYnkgaWQuCi0gICAgICovCi0gICAgTGlzdDxJTW9kdWxlUmVzdWx0PiBnZXRNb2R1bGVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBNZXJnZXMgYSBtb2R1bGUgcmVzdWx0IHRvIHRoZSBpbnZvY2F0aW9uIHJlc3VsdC4KLSAgICAgKi8KLSAgICB2b2lkIG1lcmdlTW9kdWxlUmVzdWx0KElNb2R1bGVSZXN1bHQgbW9kdWxlUmVzdWx0KTsKLQotICAgIC8qKgotICAgICAqIEFkZHMgdGhlIGdpdmVuIGludm9jYXRpb24gaW5mbyB0byB0aGUgcmVzdWx0LgotICAgICAqLwotICAgIHZvaWQgYWRkSW52b2NhdGlvbkluZm8oU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHtAbGluayBNYXB9IG9mIGludm9jYXRpb24gaW5mbyBjb2xsZWN0ZWQuCi0gICAgICovCi0gICAgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRJbnZvY2F0aW9uSW5mbygpOwotCi0gICAgLyoqCi0gICAgICogIFNldCB0aGUgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgdG8gdGhlIHJ1biBjb21tYW5kLgotICAgICAqLwotICAgIHZvaWQgc2V0Q29tbWFuZExpbmVBcmdzKFN0cmluZyBzZXRDb21tYW5kTGluZUFyZ3MpOwotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmUgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgdG8gdGhlIHJ1biBjb21tYW5kLgotICAgICAqLwotICAgIFN0cmluZyBnZXRDb21tYW5kTGluZUFyZ3MoKTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBidWlsZEZpbmdlcnByaW50IHRoZSBidWlsZCBmaW5nZXJwcmludCBhc3NvY2lhdGVkIHdpdGggdGhpcyByZXN1bHQuCi0gICAgICovCi0gICAgdm9pZCBzZXRCdWlsZEZpbmdlcnByaW50KFN0cmluZyBidWlsZEZpbmdlcnByaW50KTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIGRldmljZSBidWlsZCBmaW5nZXJwcmludCBhc3NvY2lhdGVkIHdpdGggcmVzdWx0LgotICAgICAqLwotICAgIFN0cmluZyBnZXRCdWlsZEZpbmdlcnByaW50KCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBjb21wbGV0ZWQgdGVzdCBtb2R1bGVzIGZvciB0aGlzIGludm9jYXRpb24uCi0gICAgICovCi0gICAgaW50IGdldE1vZHVsZUNvbXBsZXRlQ291bnQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybiBzdGF0dXMgb2YgY2hlY2tzdW0gZnJvbSBwcmV2aW91cyBzZXNzaW9uCi0gICAgICovCi0gICAgUmV0cnlDaGVja3N1bVN0YXR1cyBnZXRSZXRyeUNoZWNrc3VtU3RhdHVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgc3RhdHVzIG9mIGNoZWNrc3VtIGZyb20gcHJldmlvdXMgc2Vzc2lvbgotICAgICAqLwotICAgIHZvaWQgc2V0UmV0cnlDaGVja3N1bVN0YXR1cyhSZXRyeUNoZWNrc3VtU3RhdHVzIHJldHJ5U3RhdHVzKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgZGlyZWN0b3J5IG9mIHRoZSBwcmV2aW91cyBzZXNzaW9ucyByZXN1bHRzCi0gICAgICovCi0gICAgRmlsZSBnZXRSZXRyeURpcmVjdG9yeSgpOwotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBkaXJlY3Rvcnkgb2YgdGhlIHByZXZpb3VzIHNlc3Npb25zIHJlc3VsdHMKLSAgICAgKi8KLSAgICB2b2lkIHNldFJldHJ5RGlyZWN0b3J5KEZpbGUgcmVzdWx0RGlyKTsKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvSU1vZHVsZVJlc3VsdC5qYXZhIGIvY29tbW9uL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvSU1vZHVsZVJlc3VsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWJmMTgxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0lNb2R1bGVSZXN1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIERhdGEgc3RydWN0dXJlIGZvciBhIENvbXBhdGliaWxpdHkgdGVzdCBtb2R1bGUgcmVzdWx0LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNb2R1bGVSZXN1bHQgZXh0ZW5kcyBDb21wYXJhYmxlPElNb2R1bGVSZXN1bHQ+IHsKLQotICAgIFN0cmluZyBnZXRJZCgpOwotCi0gICAgU3RyaW5nIGdldE5hbWUoKTsKLQotICAgIFN0cmluZyBnZXRBYmkoKTsKLQotICAgIHZvaWQgYWRkUnVudGltZShsb25nIGVsYXBzZWRUaW1lKTsKLQotICAgIHZvaWQgcmVzZXRSdW50aW1lKCk7Ci0KLSAgICBsb25nIGdldFJ1bnRpbWUoKTsKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgZXN0aW1hdGUgb2Ygbm90LWV4ZWN1dGVkIHRlc3RzIGZvciB0aGlzIG1vZHVsZS4gVGhpcyBlc3RpbWF0ZSBpcyBhIG1heGltdW0KLSAgICAgKiBub3QtZXhlY3V0ZWQgY291bnQsIGFzc3VtaW5nIGFsbCB0ZXN0IHJ1bnMgaGF2ZSBiZWVuIHN0YXJ0ZWQuCi0gICAgICogQHJldHVybiBlc3RpbWF0ZSBvZiBub3QtZXhlY3V0ZWQgdGVzdHMKLSAgICAgKi8KLSAgICBpbnQgZ2V0Tm90RXhlY3V0ZWQoKTsKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgZXN0aW1hdGUgb2Ygbm90LWV4ZWN1dGVkIHRlc3RzIGZvciB0aGlzIG1vZHVsZS4gVGhpcyBlc3RpbWF0ZSBpcyBhIG1heGltdW0KLSAgICAgKiBub3QtZXhlY3V0ZWQgY291bnQsIGFzc3VtaW5nIGFsbCB0ZXN0IHJ1bnMgaGF2ZSBiZWVuIHN0YXJ0ZWQuCi0gICAgICogQHBhcmFtIGVzdGltYXRlIG9mIG5vdC1leGVjdXRlZCB0ZXN0cwotICAgICAqLwotICAgIHZvaWQgc2V0Tm90RXhlY3V0ZWQoaW50IG51bVRlc3RzKTsKLQotICAgIC8qKgotICAgICAqIFdoZXRoZXIgYWxsIGV4cGVjdGVkIHRlc3RzIGhhdmUgYmVlbiBleGVjdXRlZCBhbmQgYWxsIGV4cGVjdGVkIHRlc3QgcnVucyBoYXZlIGJlZW4gc2VlbgotICAgICAqIGFuZCBjb21wbGV0ZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBjb21wcmVoZW5zaXZlIGNvbXBsZXRlbmVzcyBzdGF0dXMgb2YgdGhlIG1vZHVsZQotICAgICAqLwotICAgIGJvb2xlYW4gaXNEb25lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBXaGV0aGVyIGFsbCBleHBlY3RlZCB0ZXN0cyBoYXZlIGJlZW4gZXhlY3V0ZWQgZm9yIHRoZSB0ZXN0IHJ1bnMgc2VlbiBzbyBmYXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBjb21wbGV0ZW5lc3Mgc3RhdHVzIG9mIHRoZSBtb2R1bGUgc28gZmFyCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0RvbmVTb0ZhcigpOwotCi0gICAgLyoqCi0gICAgICogRXhwbGljaXRseSBzZXRzIHRoZSAiZG9uZSIgc3RhdHVzIGZvciB0aGlzIG1vZHVsZS4gVG8gYmUgdXNlZCB3aGVuIGNvbnN0cnVjdGluZyB0aGlzCi0gICAgICogaW5zdGFuY2UgZnJvbSBhbiBYTUwgcmVwb3J0LiBUaGUgZG9uZSBzdGF0dXMgZm9yIGFuIHtAbGluayBJTW9kdWxlUmVzdWx0fSBjYW4gYmUgY2hhbmdlZAotICAgICAqIGluZGlzY3JpbWluYXRlbHkgYnkgbWV0aG9kIHNldERvbmUoYm9vbGVhbikgaW1tZWRpYXRlbHkgYWZ0ZXIgYSBjYWxsIHRvIGluaXRpYWxpemVEb25lLAotICAgICAqIHdoZXJlYXMgdGhlIHN0YXR1cyBtYXkgb25seSBiZSBzd2l0Y2hlZCB0byBmYWxzZSBpbW1lZGlhdGVseSBhZnRlciBhIGNhbGwgdG8gc2V0RG9uZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkb25lIHRoZSBpbml0aWFsIGNvbXBsZXRlbmVzcyBzdGF0dXMgb2YgdGhlIG1vZHVsZQotICAgICAqLwotICAgIHZvaWQgaW5pdGlhbGl6ZURvbmUoYm9vbGVhbiBkb25lKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlICJkb25lIiBzdGF0dXMgZm9yIHRoaXMgbW9kdWxlLiBUbyBiZSB1c2VkIGFmdGVyIGVhY2ggdGVzdCBydW4gZm9yIHRoZSBtb2R1bGUuCi0gICAgICogQWZ0ZXIgc2V0RG9uZSBpcyB1c2VkIG9uY2UsIHN1YnNlcXVlbnQgY2FsbHMgdG8gc2V0RG9uZSB3aWxsIEFORCB0aGUgZ2l2ZW4gdmFsdWUgd2l0aCB0aGUKLSAgICAgKiBleGlzdGluZyBkb25lIHN0YXR1cyB2YWx1ZS4gVGh1cyBhIG1vZHVsZSB3aXRoICJkb25lIiBhbHJlYWR5IHNldCB0byBmYWxzZSBjYW5ub3QgYmUgbWFya2VkCi0gICAgICogZG9uZSB1bmxlc3MgcmUtaW5pdGlhbGl6ZWQgKHNlZSBpbml0aWFsaXplRG9uZSkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZG9uZSB0aGUgY29tcGxldGVuZXNzIHN0YXR1cyBvZiB0aGUgbW9kdWxlIGZvciBhIHRlc3QgcnVuCi0gICAgICovCi0gICAgdm9pZCBzZXREb25lKGJvb2xlYW4gZG9uZSk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSAiaW4tcHJvZ3Jlc3MiIHN0YXR1cyBmb3IgdGhpcyBtb2R1bGUuIFVzZWZ1bCBmb3IgdHJhY2tpbmcgY29tcGxldGlvbiBvZiB0aGUgbW9kdWxlCi0gICAgICogaW4gdGhlIGNhc2UgdGhhdCBhIHRlc3QgcnVuIGJlZ2lucyBidXQgbmV2ZXIgZW5kcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpblByb2dyZXNzIHdoZXRoZXIgdGhlIG1vZHVsZSBpcyBjdXJyZW50bHkgaW4gcHJvZ3Jlc3MKLSAgICAgKi8KLSAgICB2b2lkIGluUHJvZ3Jlc3MoYm9vbGVhbiBpblByb2dyZXNzKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBleHBlY3RlZCB0ZXN0IHJ1bnMgZm9yIHRoaXMgbW9kdWxlIGluIHRoaXMgaW52b2NhdGlvbgotICAgICAqLwotICAgIGludCBnZXRFeHBlY3RlZFRlc3RSdW5zKCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdGhlIG51bWJlciBvZiBleHBlY3RlZCB0ZXN0IHJ1bnMgZm9yIHRoaXMgbW9kdWxlIGluIHRoaXMgaW52b2NhdGlvbgotICAgICAqLwotICAgIHZvaWQgc2V0RXhwZWN0ZWRUZXN0UnVucyhpbnQgbnVtUnVucyk7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgdGVzdCBydW5zIHNlZW4gZm9yIHRoaXMgbW9kdWxlIGluIHRoaXMgaW52b2NhdGlvbgotICAgICAqLwotICAgIGludCBnZXRUZXN0UnVucygpOwotCi0gICAgLyoqCi0gICAgICogQWRkcyB0byB0aGUgY291bnQgb2YgdGVzdCBydW5zIHNlZW4gZm9yIHRoaXMgbW9kdWxlIGluIHRoaXMgaW52b2NhdGlvbgotICAgICAqLwotICAgIHZvaWQgYWRkVGVzdFJ1bigpOwotCi0gICAgLyoqCi0gICAgICogUmVzZXQgdGhlIGNvdW50IG9mIHRlc3QgcnVucyBzZWVuIGZvciB0aGlzIG1vZHVsZSBpbiB0aGlzIGludm9jYXRpb24uIFNob3VsZCBiZSBwZXJmb3JtZWQKLSAgICAgKiBhZnRlciBtZXJnaW5nIHRoZSBtb2R1bGUgaW50byBhbm90aGVyIG1vZHVsZSwgc28gdGhhdCBmdXR1cmUgbWVyZ2VzIGRvIG5vdCBkb3VibGUtY291bnQgdGhlCi0gICAgICogc2FtZSB0ZXN0IHJ1bnMuCi0gICAgICovCi0gICAgdm9pZCByZXNldFRlc3RSdW5zKCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEge0BsaW5rIElDYXNlUmVzdWx0fSBmb3IgdGhlIGdpdmVuIHRlc3RjYXNlLCBjcmVhdGluZyBpdCBpZiBpdCBkb2Vzbid0IGV4aXN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGNhc2VOYW1lIHRoZSBuYW1lIG9mIHRoZSB0ZXN0Y2FzZSBlZyAmbHQ7cGFja2FnZS1uYW1lJmd0OyZsdDtjbGFzcy1uYW1lJmd0OwotICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBJQ2FzZVJlc3VsdH0gb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKi8KLSAgICBJQ2FzZVJlc3VsdCBnZXRPckNyZWF0ZVJlc3VsdChTdHJpbmcgY2FzZU5hbWUpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUge0BsaW5rIElDYXNlUmVzdWx0fSByZXN1bHQgZm9yIGdpdmVuIHRlc3RjYXNlLgotICAgICAqCi0gICAgICogQHBhcmFtIGNhc2VOYW1lIHRoZSBuYW1lIG9mIHRoZSB0ZXN0Y2FzZSBlZyAmbHQ7cGFja2FnZS1uYW1lJmd0OyZsdDtjbGFzcy1uYW1lJmd0OwotICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBJVGVzdFJlc3VsdH0gb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKi8KLSAgICBJQ2FzZVJlc3VsdCBnZXRSZXN1bHQoU3RyaW5nIGNhc2VOYW1lKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgYWxsIHJlc3VsdHMgc29ydGVkIGJ5IG5hbWUuCi0gICAgICovCi0gICAgTGlzdDxJQ2FzZVJlc3VsdD4gZ2V0UmVzdWx0cygpOwotCi0gICAgLyoqCi0gICAgICogQ291bnRzIHRoZSBudW1iZXIgb2YgcmVzdWx0cyB3aGljaCBoYXZlIHRoZSBnaXZlbiBzdGF0dXMuCi0gICAgICovCi0gICAgaW50IGNvdW50UmVzdWx0cyhUZXN0U3RhdHVzIHN0YXR1cyk7Ci0KLSAgICAvKioKLSAgICAgKiBNZXJnZSB0aGUgbW9kdWxlIHJlc3VsdHMgZnJvbSBvdGhlck1vZHVsZVJlc3VsdCBpbnRvIHRoaXMgbW9kdWxlUmVzdWx0LgotICAgICAqLwotICAgIHZvaWQgbWVyZ2VGcm9tKElNb2R1bGVSZXN1bHQgb3RoZXJNb2R1bGVSZXN1bHQpOwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvSVRlc3RSZXN1bHQuamF2YSBiL2NvbW1vbi91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0lUZXN0UmVzdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1Yzk1ZTguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvSVRlc3RSZXN1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgc2luZ2xlIHRlc3QgcmVzdWx0LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUZXN0UmVzdWx0IGV4dGVuZHMgQ29tcGFyYWJsZTxJVGVzdFJlc3VsdD4gewotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgbmFtZSBvZiB0aGlzIHRlc3QgcmVzdWx0LgotICAgICAqLwotICAgIFN0cmluZyBnZXROYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBmdWxsIG5hbWUgb2YgdGhpcyB0ZXN0IHJlc3VsdCwgaWUKLSAgICAgKiAmbHQ7cGFja2FnZS1uYW1lJmd0Oy4mbHQ7Y2xhc3MtbmFtZSZndDsjJmx0O21ldGhvZC1uYW1lJmd0OwotICAgICAqLwotICAgIFN0cmluZyBnZXRGdWxsTmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUge0BsaW5rIFRlc3RTdGF0dXN9IG9mIHRoaXMgcmVzdWx0LgotICAgICAqLwotICAgIFRlc3RTdGF0dXMgZ2V0UmVzdWx0U3RhdHVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB7QGxpbmsgVGVzdFN0YXR1c30gb2YgdGhlIHJlc3VsdCBhbmQgdXBkYXRlcyB0aGUgZW5kIHRpbWUgb2YgdGhlIHRlc3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RhdHVzIFRoZSB7QGxpbmsgVGVzdFN0YXR1c30gb2YgdGhpcyByZXN1bHQuCi0gICAgICovCi0gICAgdm9pZCBzZXRSZXN1bHRTdGF0dXMoVGVzdFN0YXR1cyBzdGF0dXMpOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgZmFpbHVyZSBtZXNzYWdlIHRvIGRpc3BsYXkKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0TWVzc2FnZSgpOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gZGlzcGxheSB3aGljaCBkZXNjcmliZXMgdGhlIGZhaWx1cmUKLSAgICAgKi8KLSAgICB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgc3RhY2sgdHJhY2UgZ2VuZXJhdGVkIGJ5IHRoZSBmYWlsdXJlCi0gICAgICovCi0gICAgU3RyaW5nIGdldFN0YWNrVHJhY2UoKTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBzdGFja1RyYWNlIHRoZSBzdGFjayB0cmFjZSBnZW5lcmF0ZWQgYnkgdGhlIGZhaWx1cmUuCi0gICAgICovCi0gICAgdm9pZCBzZXRTdGFja1RyYWNlKFN0cmluZyBzdGFja1RyYWNlKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIG1ldHJpY3MgcmVwb3J0LgotICAgICAqLwotICAgIFJlcG9ydExvZyBnZXRSZXBvcnRMb2coKTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSByZXBvcnQgdGhlIG1ldHJpY3MgcmVwb3J0LgotICAgICAqLwotICAgIHZvaWQgc2V0UmVwb3J0TG9nKFJlcG9ydExvZyByZXBvcnQpOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgcGF0aCBvZiB0aGUgYnVnIHJlcG9ydCBnZW5lcmF0ZWQgb2YgdGhlIGZhaWx1cmUuCi0gICAgICovCi0gICAgU3RyaW5nIGdldEJ1Z1JlcG9ydCgpOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHBhdGggdGhlIHBhdGggb2YgdGhlIGJ1ZyByZXBvcnQgZ2VuZXJhdGVkIG9mIHRoZSBmYWlsdXJlLgotICAgICAqLwotICAgIHZvaWQgc2V0QnVnUmVwb3J0KFN0cmluZyBwYXRoKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHBhdGggb2YgdGhlIGxvZyBmaWxlIGdlbmVyYXRlZCBvZiB0aGUgZmFpbHVyZS4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0TG9nKCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aCBvZiB0aGUgbG9nIGZpbGUgZ2VuZXJhdGVkIG9mIHRoZSBmYWlsdXJlLgotICAgICAqLwotICAgIHZvaWQgc2V0TG9nKFN0cmluZyBwYXRoKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHBhdGggb2YgdGhlIHNjcmVlbnNob3QgZmlsZSBnZW5lcmF0ZWQgb2YgdGhlIGZhaWx1cmUuCi0gICAgICovCi0gICAgU3RyaW5nIGdldFNjcmVlbnNob3QoKTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIG9mIHRoZSBzY3JlZW5zaG90IGZpbGUgZ2VuZXJhdGVkIG9mIHRoZSBmYWlsdXJlLgotICAgICAqLwotICAgIHZvaWQgc2V0U2NyZWVuc2hvdChTdHJpbmcgcGF0aCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXBvcnQgdGhlIHRlc3QgYXMgYSBmYWlsdXJlLgotICAgICAqCi0gICAgICogQHBhcmFtIHRyYWNlIHRoZSBzdGFja3RyYWNlIG9mIHRoZSBmYWlsdXJlLgotICAgICAqLwotICAgIHZvaWQgZmFpbGVkKFN0cmluZyB0cmFjZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXBvcnQgdGhhdCB0aGUgdGVzdCBoYXMgY29tcGxldGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIHJlcG9ydCBBIHJlcG9ydCBnZW5lcmF0ZWQgYnkgdGhlIHRlc3QsIG9yIG51bGwuCi0gICAgICovCi0gICAgdm9pZCBwYXNzZWQoUmVwb3J0TG9nIHJlcG9ydCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXBvcnQgdGhhdCB0aGUgdGVzdCB3YXMgc2tpcHBlZC4KLSAgICAgKgotICAgICAqIFRoaXMgbWVhbnMgdGhhdCB0aGUgdGVzdCBpcyBub3QgY29uc2lkZXJlZCBhcHByb3ByaWF0ZSBmb3IgdGhlCi0gICAgICogY3VycmVudCBkZXZpY2UsIGFuZCB0aHVzIGlzIG5ldmVyIGF0dGVtcHRlZC4gVGhlIHRlc3QgZG9lcyBub3QgcmVxdWlyZSBleGVjdXRpb24sCi0gICAgICogYW5kIG5vdGhpbmcgbW9yZSBuZWVkcyB0byBiZSBkb25lLgotICAgICAqLwotICAgIHZvaWQgc2tpcHBlZCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmVzIHdoZXRoZXIgZXhlY3V0aW9uIGZvciB0aGlzIHRlc3QgcmVzdWx0IGhhcyBiZWVuIGRldGVybWluZWQgdW5uZWNlc3NhcnkuCi0gICAgICovCi0gICAgYm9vbGVhbiBpc1NraXBwZWQoKTsKLQotICAgIC8qKgotICAgICAqIFJlc2V0cyB0aGUgcmVzdWx0LgotICAgICAqLwotICAgIHZvaWQgcmVzZXQoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciB0aGUgdGVzdCByZXN1bHQgc3RhdHVzIGhhcyBiZWVuIGdlbmVyYXRlZCBmcm9tIGEgcHJldmlvdXMgdGVzdGluZyBzZXNzaW9uLgotICAgICAqLwotICAgIHZvaWQgc2V0UmV0cnkoYm9vbGVhbiBpc1JldHJ5KTsKLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlcyB3aGV0aGVyIHRoZSB0ZXN0IHJlc3VsdCBzdGF0dXMgaGFzIGJlZW4gZ2VuZXJhdGVkIGZyb20gYSBwcmV2aW91cyB0ZXN0aW5nIHNlc3Npb24uCi0gICAgICovCi0gICAgYm9vbGVhbiBpc1JldHJ5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBDbGVhciB0aGUgZXhpc3RpbmcgcmVzdWx0IGFuZCBkZWZhdWx0IHRvICdmYWlsZWQnCi0gICAgICovCi0gICAgdm9pZCByZW1vdmVSZXN1bHQoKTsKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0luZm9TdG9yZS5qYXZhIGIvY29tbW9uL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvSW5mb1N0b3JlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YTQxMWUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvSW5mb1N0b3JlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBJbmZvU3RvcmUgewotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1NUUklOR19MRU5HVEggPSAxMDAwOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE1BWF9BUlJBWV9MRU5HVEggPSAxMDAwOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE1BWF9MSVNUX0xFTkdUSCA9IDEwMDA7Ci0KLSAgICAvKioKLSAgICAgKiBPcGVucyB0aGUgZmlsZSBmb3Igc3RvcmFnZSBhbmQgY3JlYXRlcyB0aGUgd3JpdGVyLgotICAgICAqLwotICAgIGFic3RyYWN0IHZvaWQgb3BlbigpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIENsb3NlcyB0aGUgd3JpdGVyLgotICAgICAqLwotICAgIGFic3RyYWN0IHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydCBhIG5ldyBncm91cCBvZiByZXN1bHQuCi0gICAgICovCi0gICAgYWJzdHJhY3Qgdm9pZCBzdGFydEdyb3VwKCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogU3RhcnQgYSBuZXcgZ3JvdXAgb2YgcmVzdWx0IHdpdGggc3BlY2lmaWVkIG5hbWUuCi0gICAgICovCi0gICAgYWJzdHJhY3Qgdm9pZCBzdGFydEdyb3VwKFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBDb21wbGV0ZSBhZGRpbmcgcmVzdWx0IHRvIHRoZSBsYXN0IHN0YXJ0ZWQgZ3JvdXAuCi0gICAgICovCi0gICAgYWJzdHJhY3Qgdm9pZCBlbmRHcm91cCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFN0YXJ0IGEgbmV3IGFycmF5IG9mIHJlc3VsdC4KLSAgICAgKi8KLSAgICBhYnN0cmFjdCB2b2lkIHN0YXJ0QXJyYXkoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydCBhIG5ldyBhcnJheSBvZiByZXN1bHQgd2l0aCBzcGVjaWZpZWQgbmFtZS4KLSAgICAgKi8KLSAgICBhYnN0cmFjdCB2b2lkIHN0YXJ0QXJyYXkoU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIENvbXBsZXRlIGFkZGluZyByZXN1bHQgdG8gdGhlIGxhc3Qgc3RhcnRlZCBhcnJheS4KLSAgICAgKi8KLSAgICBhYnN0cmFjdCB2b2lkIGVuZEFycmF5KCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIGludCB2YWx1ZSB0byB0aGUgSW5mb1N0b3JlCi0gICAgICovCi0gICAgYWJzdHJhY3Qgdm9pZCBhZGRSZXN1bHQoU3RyaW5nIG5hbWUsIGludCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIGxvbmcgdmFsdWUgdG8gdGhlIEluZm9TdG9yZQotICAgICAqLwotICAgIGFic3RyYWN0IHZvaWQgYWRkUmVzdWx0KFN0cmluZyBuYW1lLCBsb25nIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgZmxvYXQgdmFsdWUgdG8gdGhlIEluZm9TdG9yZQotICAgICAqLwotICAgIGFic3RyYWN0IHZvaWQgYWRkUmVzdWx0KFN0cmluZyBuYW1lLCBmbG9hdCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIGRvdWJsZSB2YWx1ZSB0byB0aGUgSW5mb1N0b3JlCi0gICAgICovCi0gICAgYWJzdHJhY3Qgdm9pZCBhZGRSZXN1bHQoU3RyaW5nIG5hbWUsIGRvdWJsZSB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIGJvb2xlYW4gdmFsdWUgdG8gdGhlIEluZm9TdG9yZQotICAgICAqLwotICAgIGFic3RyYWN0IHZvaWQgYWRkUmVzdWx0KFN0cmluZyBuYW1lLCBib29sZWFuIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgU3RyaW5nIHZhbHVlIHRvIHRoZSBJbmZvU3RvcmUKLSAgICAgKi8KLSAgICBhYnN0cmFjdCB2b2lkIGFkZFJlc3VsdChTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgaW50IGFycmF5IHRvIHRoZSBJbmZvU3RvcmUKLSAgICAgKi8KLSAgICBhYnN0cmFjdCB2b2lkIGFkZEFycmF5UmVzdWx0KFN0cmluZyBuYW1lLCBpbnRbXSBhcnJheSkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIGxvbmcgYXJyYXkgdG8gdGhlIEluZm9TdG9yZQotICAgICAqLwotICAgIGFic3RyYWN0IHZvaWQgYWRkQXJyYXlSZXN1bHQoU3RyaW5nIG5hbWUsIGxvbmdbXSBhcnJheSkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIGZsb2F0IGFycmF5IHRvIHRoZSBJbmZvU3RvcmUKLSAgICAgKi8KLSAgICBhYnN0cmFjdCB2b2lkIGFkZEFycmF5UmVzdWx0KFN0cmluZyBuYW1lLCBmbG9hdFtdIGFycmF5KSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgZG91YmxlIGFycmF5IHRvIHRoZSBJbmZvU3RvcmUKLSAgICAgKi8KLSAgICBhYnN0cmFjdCB2b2lkIGFkZEFycmF5UmVzdWx0KFN0cmluZyBuYW1lLCBkb3VibGVbXSBhcnJheSkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIGJvb2xlYW4gYXJyYXkgdG8gdGhlIEluZm9TdG9yZQotICAgICAqLwotICAgIGFic3RyYWN0IHZvaWQgYWRkQXJyYXlSZXN1bHQoU3RyaW5nIG5hbWUsIGJvb2xlYW5bXSBhcnJheSkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIExpc3Qgb2YgU3RyaW5nIHRvIHRoZSBJbmZvU3RvcmUKLSAgICAgKi8KLSAgICBhYnN0cmFjdCB2b2lkIGFkZExpc3RSZXN1bHQoU3RyaW5nIG5hbWUsIExpc3Q8U3RyaW5nPiBsaXN0KSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGludFtdIGNoZWNrQXJyYXkoaW50W10gdmFsdWVzKSB7Ci0gICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID4gTUFYX0FSUkFZX0xFTkdUSCkgewotICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5jb3B5T2YodmFsdWVzLCBNQVhfQVJSQVlfTEVOR1RIKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiB2YWx1ZXM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGxvbmdbXSBjaGVja0FycmF5KGxvbmdbXSB2YWx1ZXMpIHsKLSAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPiBNQVhfQVJSQVlfTEVOR1RIKSB7Ci0gICAgICAgICAgICByZXR1cm4gQXJyYXlzLmNvcHlPZih2YWx1ZXMsIE1BWF9BUlJBWV9MRU5HVEgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHZhbHVlczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmxvYXRbXSBjaGVja0FycmF5KGZsb2F0W10gdmFsdWVzKSB7Ci0gICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID4gTUFYX0FSUkFZX0xFTkdUSCkgewotICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5jb3B5T2YodmFsdWVzLCBNQVhfQVJSQVlfTEVOR1RIKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiB2YWx1ZXM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGRvdWJsZVtdIGNoZWNrQXJyYXkoZG91YmxlW10gdmFsdWVzKSB7Ci0gICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID4gTUFYX0FSUkFZX0xFTkdUSCkgewotICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5jb3B5T2YodmFsdWVzLCBNQVhfQVJSQVlfTEVOR1RIKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiB2YWx1ZXM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW5bXSBjaGVja0FycmF5KGJvb2xlYW5bXSB2YWx1ZXMpIHsKLSAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPiBNQVhfQVJSQVlfTEVOR1RIKSB7Ci0gICAgICAgICAgICByZXR1cm4gQXJyYXlzLmNvcHlPZih2YWx1ZXMsIE1BWF9BUlJBWV9MRU5HVEgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHZhbHVlczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgTGlzdDxTdHJpbmc+IGNoZWNrU3RyaW5nTGlzdChMaXN0PFN0cmluZz4gbGlzdCkgewotICAgICAgICBpZiAobGlzdC5zaXplKCkgPiBNQVhfTElTVF9MRU5HVEgpIHsKLSAgICAgICAgICAgIHJldHVybiBsaXN0LnN1Ykxpc3QoMCwgTUFYX0xJU1RfTEVOR1RIKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBjaGVja1N0cmluZyhTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCgpID4gTUFYX1NUUklOR19MRU5HVEgpIHsKLSAgICAgICAgICAgIHJldHVybiB2YWx1ZS5zdWJzdHJpbmcoMCwgTUFYX1NUUklOR19MRU5HVEgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBjaGVja05hbWUoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc0RvdWJsZU5hTk9ySW5maW5pdGUoRG91YmxlIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBEb3VibGUuaXNOYU4odmFsdWUpIHx8IERvdWJsZS5pc0luZmluaXRlKHZhbHVlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9JbnZvY2F0aW9uUmVzdWx0LmphdmEgYi9jb21tb24vdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9JbnZvY2F0aW9uUmVzdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMWMyN2QuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvSW52b2NhdGlvblJlc3VsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBEYXRhIHN0cnVjdHVyZSBmb3IgdGhlIGRldGFpbGVkIENvbXBhdGliaWxpdHkgdGVzdCByZXN1bHRzLgotICovCi1wdWJsaWMgY2xhc3MgSW52b2NhdGlvblJlc3VsdCBpbXBsZW1lbnRzIElJbnZvY2F0aW9uUmVzdWx0IHsKLQotICAgIHByaXZhdGUgbG9uZyBtVGltZXN0YW1wOwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgSU1vZHVsZVJlc3VsdD4gbU1vZHVsZVJlc3VsdHMgPSBuZXcgTGlua2VkSGFzaE1hcDw+KCk7Ci0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IG1JbnZvY2F0aW9uSW5mbyA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICBwcml2YXRlIFNldDxTdHJpbmc+IG1TZXJpYWxzID0gbmV3IEhhc2hTZXQ8PigpOwotICAgIHByaXZhdGUgU3RyaW5nIG1CdWlsZEZpbmdlcnByaW50OwotICAgIHByaXZhdGUgU3RyaW5nIG1UZXN0UGxhbjsKLSAgICBwcml2YXRlIFN0cmluZyBtQ29tbWFuZExpbmVBcmdzOwotICAgIHByaXZhdGUgaW50IG1Ob3RFeGVjdXRlZCA9IDA7Ci0gICAgcHJpdmF0ZSBSZXRyeUNoZWNrc3VtU3RhdHVzIG1SZXRyeUNoZWNrc3VtU3RhdHVzID0gUmV0cnlDaGVja3N1bVN0YXR1cy5Ob3RSZXRyeTsKLSAgICBwcml2YXRlIEZpbGUgbVJldHJ5RGlyZWN0b3J5ID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGlzdDxJTW9kdWxlUmVzdWx0PiBnZXRNb2R1bGVzKCkgewotICAgICAgICBBcnJheUxpc3Q8SU1vZHVsZVJlc3VsdD4gbW9kdWxlcyA9IG5ldyBBcnJheUxpc3Q8PihtTW9kdWxlUmVzdWx0cy52YWx1ZXMoKSk7Ci0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQobW9kdWxlcyk7Ci0gICAgICAgIHJldHVybiBtb2R1bGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGNvdW50UmVzdWx0cyhUZXN0U3RhdHVzIHJlc3VsdCkgewotICAgICAgICBpbnQgdG90YWwgPSAwOwotICAgICAgICBmb3IgKElNb2R1bGVSZXN1bHQgbSA6IG1Nb2R1bGVSZXN1bHRzLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICB0b3RhbCArPSBtLmNvdW50UmVzdWx0cyhyZXN1bHQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0b3RhbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXROb3RFeGVjdXRlZCgpIHsKLSAgICAgICAgaW50IG51bVRlc3RzID0gMDsKLSAgICAgICAgZm9yIChJTW9kdWxlUmVzdWx0IG1vZHVsZSA6IG1Nb2R1bGVSZXN1bHRzLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBudW1UZXN0cyArPSBtb2R1bGUuZ2V0Tm90RXhlY3V0ZWQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVtVGVzdHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJTW9kdWxlUmVzdWx0IGdldE9yQ3JlYXRlTW9kdWxlKFN0cmluZyBpZCkgewotICAgICAgICBJTW9kdWxlUmVzdWx0IG1vZHVsZVJlc3VsdCA9IG1Nb2R1bGVSZXN1bHRzLmdldChpZCk7Ci0gICAgICAgIGlmIChtb2R1bGVSZXN1bHQgPT0gbnVsbCkgewotICAgICAgICAgICAgbW9kdWxlUmVzdWx0ID0gbmV3IE1vZHVsZVJlc3VsdChpZCk7Ci0gICAgICAgICAgICBtTW9kdWxlUmVzdWx0cy5wdXQoaWQsIG1vZHVsZVJlc3VsdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1vZHVsZVJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgbWVyZ2VNb2R1bGVSZXN1bHQoSU1vZHVsZVJlc3VsdCBtb2R1bGVSZXN1bHQpIHsKLSAgICAgICAgLy8gTWVyZ2UgdGhlIG1vZHVsZVJlc3VsdCB3aXRoIGFueSBleGlzdGluZyBtb2R1bGUgcmVzdWx0Ci0gICAgICAgIElNb2R1bGVSZXN1bHQgZXhpc3RpbmdNb2R1bGVSZXN1bHQgPSBnZXRPckNyZWF0ZU1vZHVsZShtb2R1bGVSZXN1bHQuZ2V0SWQoKSk7Ci0gICAgICAgIGV4aXN0aW5nTW9kdWxlUmVzdWx0Lm1lcmdlRnJvbShtb2R1bGVSZXN1bHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGRJbnZvY2F0aW9uSW5mbyhTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgbUludm9jYXRpb25JbmZvLnB1dChrZXksIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0SW52b2NhdGlvbkluZm8oKSB7Ci0gICAgICAgIHJldHVybiBtSW52b2NhdGlvbkluZm87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFN0YXJ0VGltZShsb25nIHRpbWUpIHsKLSAgICAgICAgbVRpbWVzdGFtcCA9IHRpbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBsb25nIGdldFN0YXJ0VGltZSgpIHsKLSAgICAgICAgcmV0dXJuIG1UaW1lc3RhbXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFRlc3RQbGFuKFN0cmluZyBwbGFuKSB7Ci0gICAgICAgIG1UZXN0UGxhbiA9IHBsYW47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGVzdFBsYW4oKSB7Ci0gICAgICAgIHJldHVybiBtVGVzdFBsYW47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkZERldmljZVNlcmlhbChTdHJpbmcgc2VyaWFsKSB7Ci0gICAgICAgIG1TZXJpYWxzLmFkZChzZXJpYWwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0RGV2aWNlU2VyaWFscygpIHsKLSAgICAgICAgcmV0dXJuIG1TZXJpYWxzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRDb21tYW5kTGluZUFyZ3MoU3RyaW5nIGNvbW1hbmRMaW5lQXJncykgewotICAgICAgICBtQ29tbWFuZExpbmVBcmdzID0gY29tbWFuZExpbmVBcmdzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbW1hbmRMaW5lQXJncygpIHsKLSAgICAgICAgcmV0dXJuIG1Db21tYW5kTGluZUFyZ3M7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0QnVpbGRGaW5nZXJwcmludChTdHJpbmcgYnVpbGRGaW5nZXJwcmludCkgewotICAgICAgICBtQnVpbGRGaW5nZXJwcmludCA9IGJ1aWxkRmluZ2VycHJpbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QnVpbGRGaW5nZXJwcmludCgpIHsKLSAgICAgICAgcmV0dXJuIG1CdWlsZEZpbmdlcnByaW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldE1vZHVsZUNvbXBsZXRlQ291bnQoKSB7Ci0gICAgICAgIGludCBjb21wbGV0ZU1vZHVsZXMgPSAwOwotICAgICAgICBmb3IgKElNb2R1bGVSZXN1bHQgbW9kdWxlIDogbU1vZHVsZVJlc3VsdHMudmFsdWVzKCkpIHsKLSAgICAgICAgICAgIGlmIChtb2R1bGUuaXNEb25lKCkpIHsKLSAgICAgICAgICAgICAgICBjb21wbGV0ZU1vZHVsZXMrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29tcGxldGVNb2R1bGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmV0cnlDaGVja3N1bVN0YXR1cyBnZXRSZXRyeUNoZWNrc3VtU3RhdHVzKCkgewotICAgICAgICByZXR1cm4gbVJldHJ5Q2hlY2tzdW1TdGF0dXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFJldHJ5Q2hlY2tzdW1TdGF0dXMoUmV0cnlDaGVja3N1bVN0YXR1cyByZXRyeVN0YXR1cykgewotICAgICAgICBtUmV0cnlDaGVja3N1bVN0YXR1cyA9IHJldHJ5U3RhdHVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRmlsZSBnZXRSZXRyeURpcmVjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIG1SZXRyeURpcmVjdG9yeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0UmV0cnlEaXJlY3RvcnkoRmlsZSByZXN1bHREaXIpIHsKLSAgICAgICAgbVJldHJ5RGlyZWN0b3J5ID0gcmVzdWx0RGlyOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0tleVZhbHVlQXJnc1BhcnNlci5qYXZhIGIvY29tbW9uL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvS2V5VmFsdWVBcmdzUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyYTJiMTguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvS2V5VmFsdWVBcmdzUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLS8qKgotICogUGFyc2VzIGFuIGFycmF5IG9mIGFyZ3VtZW50cyBpbnRvIGEgSGFzaE1hcC4KLSAqCi0gKiBUaGlzIGNsYXNzIGFzc3VtZWQgdGhlIGFyZ3VtZW50cyBhcmUgaW4gdGhlIGZvcm0gIi08a2V5PiA8dmFsdWU+IC4uLiIKLSAqLwotcHVibGljIGNsYXNzIEtleVZhbHVlQXJnc1BhcnNlciB7Ci0KLSAgICBwcml2YXRlIEtleVZhbHVlQXJnc1BhcnNlcigpIHt9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcnNlKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgZmluYWwgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgIFN0cmluZyBrZXkgPSBudWxsOwotICAgICAgICBmb3IgKFN0cmluZyBzIDogYXJncykgewotICAgICAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFzLnN0YXJ0c1dpdGgoIi0iKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW52YWxpZCBLZXk6ICIgKyBzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAga2V5ID0gczsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbWFwLnB1dChrZXksIHMpOwotICAgICAgICAgICAgICAgIGtleSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGtleSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTGVmdCBvdmVyIGtleSIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtYXA7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvTGlnaHRJbnZvY2F0aW9uUmVzdWx0LmphdmEgYi9jb21tb24vdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9MaWdodEludm9jYXRpb25SZXN1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M3MDA4ZS4uMDAwMDAwMAotLS0gYS9jb21tb24vdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9MaWdodEludm9jYXRpb25SZXN1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBEYXRhIHN0cnVjdHVyZSBmb3Igc3RvcmluZyBmaW5hbGl6ZWQgQ29tcGF0aWJpbGl0eSB0ZXN0IHJlc3VsdHMgd2l0aCBtaW5pbXVtIG1lbW9yeS4KLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc3RvcmVzIG9ubHkgZW5vdWdoIE1vZHVsZVJlc3VsdCBpbmZvcm1hdGlvbiB0byByZXR1cm4gZW1wdHkgbW9kdWxlcwotICogb2YgdGhlIGNvcnJlY3QgaWRzIChuYW1lcyBhbmQgYWJpcykgdXBvbiB7QGxpbmsgSUludm9jYXRpb25SZXN1bHR9J3MgZ2V0TW9kdWxlcygpIG1ldGhvZC4KLSAqLwotcHVibGljIGNsYXNzIExpZ2h0SW52b2NhdGlvblJlc3VsdCBpbXBsZW1lbnRzIElJbnZvY2F0aW9uUmVzdWx0IHsKLQotICAgIHByaXZhdGUgbG9uZyBtVGltZXN0YW1wOwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBtSW52b2NhdGlvbkluZm87Ci0gICAgcHJpdmF0ZSBTZXQ8U3RyaW5nPiBtU2VyaWFsczsKLSAgICBwcml2YXRlIFN0cmluZyBtQnVpbGRGaW5nZXJwcmludDsKLSAgICBwcml2YXRlIFN0cmluZyBtVGVzdFBsYW47Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbUNvbW1hbmRMaW5lQXJnczsKLSAgICBwcml2YXRlIGludCBtTm90RXhlY3V0ZWQ7Ci0gICAgcHJpdmF0ZSBpbnQgbU1vZHVsZUNvbXBsZXRlQ291bnQ7Ci0gICAgcHJpdmF0ZSBSZXRyeUNoZWNrc3VtU3RhdHVzIG1SZXRyeUNoZWNrc3VtU3RhdHVzOwotICAgIHByaXZhdGUgRmlsZSBtUmV0cnlEaXJlY3Rvcnk7Ci0gICAgcHJpdmF0ZSBTZXQ8U3RyaW5nPiBtTW9kdWxlSWRzOwotICAgIHByaXZhdGUgTWFwPFRlc3RTdGF0dXMsIEludGVnZXI+IG1SZXN1bHRDb3VudHM7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IHRha2VzIGEgcmVmZXJlbmNlIHRvIGFuIGV4aXN0aW5nIHJlc3VsdCAobGlnaHQgb3IgY29tcGxldGUpIGFuZAotICAgICAqIGluaXRpYWxpemVzIGluc3RhbmNlIHZhcmlhYmxlcyBhY2NvcmRpbmdseS4gVGhpcyBjbGFzcyBtdXN0IE5PVCBzYXZlIGFueSByZWZlcmVuY2UgdG8gdGhlCi0gICAgICogcmVzdWx0IHBhcmFtIHRvIHJlbWFpbiBsaWdodHdlaWdodC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlnaHRJbnZvY2F0aW9uUmVzdWx0KElJbnZvY2F0aW9uUmVzdWx0IHJlc3VsdCkgewotICAgICAgICBtVGltZXN0YW1wID0gcmVzdWx0LmdldFN0YXJ0VGltZSgpOwotICAgICAgICBtSW52b2NhdGlvbkluZm8gPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4ocmVzdWx0LmdldEludm9jYXRpb25JbmZvKCkpOwotICAgICAgICBtU2VyaWFscyA9IG5ldyBIYXNoU2V0PFN0cmluZz4ocmVzdWx0LmdldERldmljZVNlcmlhbHMoKSk7Ci0gICAgICAgIG1CdWlsZEZpbmdlcnByaW50ID0gcmVzdWx0LmdldEJ1aWxkRmluZ2VycHJpbnQoKTsKLSAgICAgICAgbVRlc3RQbGFuID0gcmVzdWx0LmdldFRlc3RQbGFuKCk7Ci0gICAgICAgIG1Db21tYW5kTGluZUFyZ3MgPSByZXN1bHQuZ2V0Q29tbWFuZExpbmVBcmdzKCk7Ci0gICAgICAgIG1Ob3RFeGVjdXRlZCA9IHJlc3VsdC5nZXROb3RFeGVjdXRlZCgpOwotICAgICAgICBtTW9kdWxlQ29tcGxldGVDb3VudCA9IHJlc3VsdC5nZXRNb2R1bGVDb21wbGV0ZUNvdW50KCk7Ci0gICAgICAgIG1SZXRyeUNoZWNrc3VtU3RhdHVzID0gUmV0cnlDaGVja3N1bVN0YXR1cy5Ob3RSZXRyeTsKLSAgICAgICAgbVJldHJ5RGlyZWN0b3J5ID0gcmVzdWx0LmdldFJldHJ5RGlyZWN0b3J5KCk7Ci0gICAgICAgIG1Nb2R1bGVJZHMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgICAgIGZvciAoSU1vZHVsZVJlc3VsdCBtb2R1bGUgOiByZXN1bHQuZ2V0TW9kdWxlcygpKSB7Ci0gICAgICAgICAgICBtTW9kdWxlSWRzLmFkZChtb2R1bGUuZ2V0SWQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgbVJlc3VsdENvdW50cyA9IG5ldyBIYXNoTWFwPFRlc3RTdGF0dXMsIEludGVnZXI+KCk7Ci0gICAgICAgIGZvciAoVGVzdFN0YXR1cyBzdGF0dXMgOiBUZXN0U3RhdHVzLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBtUmVzdWx0Q291bnRzLnB1dChzdGF0dXMsIHJlc3VsdC5jb3VudFJlc3VsdHMoc3RhdHVzKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8SU1vZHVsZVJlc3VsdD4gZ2V0TW9kdWxlcygpIHsKLSAgICAgICAgTGlzdDxJTW9kdWxlUmVzdWx0PiBtb2R1bGVzID0gbmV3IEFycmF5TGlzdDxJTW9kdWxlUmVzdWx0PigpOwotICAgICAgICBmb3IgKFN0cmluZyBpZCA6IG1Nb2R1bGVJZHMpIHsKLSAgICAgICAgICAgIG1vZHVsZXMuYWRkKG5ldyBNb2R1bGVSZXN1bHQoaWQpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbW9kdWxlczsgLy8gcmV0dXJuIGVtcHR5IG1vZHVsZXMKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBjb3VudFJlc3VsdHMoVGVzdFN0YXR1cyByZXN1bHQpIHsKLSAgICAgICAgcmV0dXJuIG1SZXN1bHRDb3VudHMuZ2V0KHJlc3VsdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0Tm90RXhlY3V0ZWQoKSB7Ci0gICAgICAgIHJldHVybiBtTm90RXhlY3V0ZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJTW9kdWxlUmVzdWx0IGdldE9yQ3JlYXRlTW9kdWxlKFN0cmluZyBpZCkgewotICAgICAgICBtTW9kdWxlSWRzLmFkZChpZCk7Ci0gICAgICAgIHJldHVybiBuZXcgTW9kdWxlUmVzdWx0KGlkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgbWVyZ2VNb2R1bGVSZXN1bHQoSU1vZHVsZVJlc3VsdCBtb2R1bGVSZXN1bHQpIHsKLSAgICAgICAgbU1vZHVsZUlkcy5hZGQobW9kdWxlUmVzdWx0LmdldElkKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGRJbnZvY2F0aW9uSW5mbyhTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgbUludm9jYXRpb25JbmZvLnB1dChrZXksIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0SW52b2NhdGlvbkluZm8oKSB7Ci0gICAgICAgIHJldHVybiBtSW52b2NhdGlvbkluZm87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFN0YXJ0VGltZShsb25nIHRpbWUpIHsKLSAgICAgICAgbVRpbWVzdGFtcCA9IHRpbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBsb25nIGdldFN0YXJ0VGltZSgpIHsKLSAgICAgICAgcmV0dXJuIG1UaW1lc3RhbXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFRlc3RQbGFuKFN0cmluZyBwbGFuKSB7Ci0gICAgICAgIG1UZXN0UGxhbiA9IHBsYW47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGVzdFBsYW4oKSB7Ci0gICAgICAgIHJldHVybiBtVGVzdFBsYW47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkZERldmljZVNlcmlhbChTdHJpbmcgc2VyaWFsKSB7Ci0gICAgICAgIG1TZXJpYWxzLmFkZChzZXJpYWwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0RGV2aWNlU2VyaWFscygpIHsKLSAgICAgICAgcmV0dXJuIG1TZXJpYWxzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRDb21tYW5kTGluZUFyZ3MoU3RyaW5nIGNvbW1hbmRMaW5lQXJncykgewotICAgICAgICBtQ29tbWFuZExpbmVBcmdzID0gY29tbWFuZExpbmVBcmdzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbW1hbmRMaW5lQXJncygpIHsKLSAgICAgICAgcmV0dXJuIG1Db21tYW5kTGluZUFyZ3M7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0QnVpbGRGaW5nZXJwcmludChTdHJpbmcgYnVpbGRGaW5nZXJwcmludCkgewotICAgICAgICBtQnVpbGRGaW5nZXJwcmludCA9IGJ1aWxkRmluZ2VycHJpbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QnVpbGRGaW5nZXJwcmludCgpIHsKLSAgICAgICAgcmV0dXJuIG1CdWlsZEZpbmdlcnByaW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldE1vZHVsZUNvbXBsZXRlQ291bnQoKSB7Ci0gICAgICAgIHJldHVybiBtTW9kdWxlQ29tcGxldGVDb3VudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJldHJ5Q2hlY2tzdW1TdGF0dXMgZ2V0UmV0cnlDaGVja3N1bVN0YXR1cygpIHsKLSAgICAgICAgcmV0dXJuIG1SZXRyeUNoZWNrc3VtU3RhdHVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRSZXRyeUNoZWNrc3VtU3RhdHVzKFJldHJ5Q2hlY2tzdW1TdGF0dXMgcmV0cnlTdGF0dXMpIHsKLSAgICAgICAgbVJldHJ5Q2hlY2tzdW1TdGF0dXMgPSByZXRyeVN0YXR1czsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEZpbGUgZ2V0UmV0cnlEaXJlY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBtUmV0cnlEaXJlY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFJldHJ5RGlyZWN0b3J5KEZpbGUgcmVzdWx0RGlyKSB7Ci0gICAgICAgIG1SZXRyeURpcmVjdG9yeSA9IHJlc3VsdERpcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9NZWFzdXJlUnVuLmphdmEgYi9jb21tb24vdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9NZWFzdXJlUnVuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiODkwNWYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvTWVhc3VyZVJ1bi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIG1lYXN1cmluZyB0aW1lIGZvciBlYWNoIHJ1bi4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE1lYXN1cmVSdW4gewotICAgIC8qKgotICAgICAqICBDYWxsZWQgYmVmb3JlIGVhY2ggcnVuLiBub3QgaW5jbHVkZWQgaW4gdGltZSBtZWFzdXJlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwcmVwYXJlKGludCBpKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gZGVmYXVsdCBlbXB0eSBpbXBsZW1lbnRhdGlvbgotICAgIH0KLQotICAgIGFic3RyYWN0IHB1YmxpYyB2b2lkIHJ1bihpbnQgaSkgdGhyb3dzIEV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL01lYXN1cmVUaW1lLmphdmEgYi9jb21tb24vdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9NZWFzdXJlVGltZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDJiOTZhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL01lYXN1cmVUaW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsOwotCi0vKioKLSAqIFByb3ZpZGVzIGEgbWVjaGFuaXNtIHRvIG1lYXN1cmUgdGhlIHRpbWUgdGFrZW4gdG8gcnVuIGEgcGllY2Ugb2YgY29kZS4KLSAqCi0gKiBUaGUgY29kZSB3aWxsIGJlIHJ1biBtdWx0aXBsZSB0aW1lcyBhbmQgdGhlIHRpbWUgdGFrZW4gYnkgZWFjaCBydW4gd2lsbCByZXR1cm5lZC4KLSAqLwotcHVibGljIGNsYXNzIE1lYXN1cmVUaW1lIHsKLSAgICAvKioKLSAgICAgKiBtZWFzdXJlIHRpbWUgdGFrZW4gZm9yIGVhY2ggcnVuIGZvciBnaXZlbiBjb3VudAotICAgICAqIEBwYXJhbSBjb3VudAotICAgICAqIEBwYXJhbSBydW4KLSAgICAgKiBAcmV0dXJuIGFycmF5IG9mIHRpbWUgdGFrZW4gaW4gZWFjaCBydW4gaW4gbXNlYy4KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlW10gbWVhc3VyZShpbnQgY291bnQsIE1lYXN1cmVSdW4gcnVuKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZG91YmxlW10gcmVzdWx0ID0gbmV3IGRvdWJsZVtjb3VudF07Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBydW4ucHJlcGFyZShpKTsKLSAgICAgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIHJ1bi5ydW4oaSk7Ci0gICAgICAgICAgICBsb25nIGVuZCA9ICBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIHJlc3VsdFtpXSA9IGVuZCAtIHN0YXJ0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvTWV0cmljc1htbFNlcmlhbGl6ZXIuamF2YSBiL2NvbW1vbi91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL01ldHJpY3NYbWxTZXJpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlODY5NmIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvTWV0cmljc1htbFNlcmlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKLQotaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFNlcmlhbGl6ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vL1RPRE8oc3R1YXJ0c2NvdHQpOiBEZWxldGUgZmlsZSBmb3IgdjIsIFJlcG9ydExvZyBjYW4gc2VyaWFsaXplIGl0c2VsZi4KLS8qKgotICogU2VyaWFsaXplIE1ldHJpYyBkYXRhIGZyb20ge0BsaW5rIFJlcG9ydExvZ30gaW50byBjb21wYXRpYmlsaXR5IHJlcG9ydCBmcmllbmRseSBYTUwKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1ldHJpY3NYbWxTZXJpYWxpemVyIHsKLQotICAgIHByaXZhdGUgZmluYWwgWG1sU2VyaWFsaXplciBtWG1sU2VyaWFsaXplcjsKLQotICAgIHB1YmxpYyBNZXRyaWNzWG1sU2VyaWFsaXplcihYbWxTZXJpYWxpemVyIHhtbFNlcmlhbGl6ZXIpIHsKLSAgICAgICAgdGhpcy5tWG1sU2VyaWFsaXplciA9IHhtbFNlcmlhbGl6ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VyaWFsaXplKFJlcG9ydExvZyByZXBvcnRMb2cpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChyZXBvcnRMb2cgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIFJlcG9ydExvZy5NZXRyaWMgc3VtbWFyeSA9IHJlcG9ydExvZy5nZXRTdW1tYXJ5KCk7Ci0gICAgICAgIC8vIDxTdW1tYXJ5IG1lc3NhZ2U9IkF2ZXJhZ2UiIHNjb3JlVHlwZT0ibG93ZXJfYmV0dGVyIiB1bml0PSJtcyI+MTk1LjI8L1N1bW1hcnk+Ci0gICAgICAgIGlmIChzdW1tYXJ5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1YbWxTZXJpYWxpemVyLnN0YXJ0VGFnKG51bGwsICJTdW1tYXJ5Iik7Ci0gICAgICAgICAgICBtWG1sU2VyaWFsaXplci5hdHRyaWJ1dGUobnVsbCwgIm1lc3NhZ2UiLCBzdW1tYXJ5LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBtWG1sU2VyaWFsaXplci5hdHRyaWJ1dGUobnVsbCwgInNjb3JlVHlwZSIsIHN1bW1hcnkuZ2V0VHlwZSgpLnRvUmVwb3J0U3RyaW5nKCkpOwotICAgICAgICAgICAgbVhtbFNlcmlhbGl6ZXIuYXR0cmlidXRlKG51bGwsICJ1bml0Iiwgc3VtbWFyeS5nZXRVbml0KCkudG9SZXBvcnRTdHJpbmcoKSk7Ci0gICAgICAgICAgICBtWG1sU2VyaWFsaXplci50ZXh0KERvdWJsZS50b1N0cmluZyhzdW1tYXJ5LmdldFZhbHVlcygpWzBdKSk7Ci0gICAgICAgICAgICBtWG1sU2VyaWFsaXplci5lbmRUYWcobnVsbCwgIlN1bW1hcnkiKTsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb21tb24vdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9Nb2R1bGVSZXN1bHQuamF2YSBiL2NvbW1vbi91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL01vZHVsZVJlc3VsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzg2YTFlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL01vZHVsZVJlc3VsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBEYXRhIHN0cnVjdHVyZSBmb3IgYSBDb21wYXRpYmlsaXR5IHRlc3QgbW9kdWxlIHJlc3VsdC4KLSAqLwotcHVibGljIGNsYXNzIE1vZHVsZVJlc3VsdCBpbXBsZW1lbnRzIElNb2R1bGVSZXN1bHQgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbUlkOwotICAgIHByaXZhdGUgbG9uZyBtUnVudGltZSA9IDA7Ci0KLSAgICAvKiBWYXJpYWJsZXMgcmVsYXRlZCB0byBjb21wbGV0aW9uIG9mIHRoZSBtb2R1bGUgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbURvbmUgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUhhdmVTZXREb25lID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1JblByb2dyZXNzID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBpbnQgbUV4cGVjdGVkVGVzdFJ1bnMgPSAwOwotICAgIHByaXZhdGUgaW50IG1BY3R1YWxUZXN0UnVucyA9IDA7Ci0gICAgcHJpdmF0ZSBpbnQgbU5vdEV4ZWN1dGVkID0gMDsKLQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgSUNhc2VSZXN1bHQ+IG1SZXN1bHRzID0gbmV3IEhhc2hNYXA8PigpOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHtAbGluayBNb2R1bGVSZXN1bHR9IGZvciB0aGUgZ2l2ZW4gaWQsIGNyZWF0ZWQgd2l0aAotICAgICAqIHtAbGluayBBYmlVdGlscyNjcmVhdGVJZChTdHJpbmcsIFN0cmluZyl9Ci0gICAgICovCi0gICAgcHVibGljIE1vZHVsZVJlc3VsdChTdHJpbmcgaWQpIHsKLSAgICAgICAgbUlkID0gaWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzRG9uZSgpIHsKLSAgICAgICAgcmV0dXJuIG1Eb25lICYmICFtSW5Qcm9ncmVzcyAmJiAobUFjdHVhbFRlc3RSdW5zID49IG1FeHBlY3RlZFRlc3RSdW5zKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNEb25lU29GYXIoKSB7Ci0gICAgICAgIHJldHVybiBtRG9uZSAmJiAhbUluUHJvZ3Jlc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemVEb25lKGJvb2xlYW4gZG9uZSkgewotICAgICAgICBtRG9uZSA9IGRvbmU7Ci0gICAgICAgIG1IYXZlU2V0RG9uZSA9IGZhbHNlOwotICAgICAgICBpZiAobURvbmUpIHsKLSAgICAgICAgICAgIG1Ob3RFeGVjdXRlZCA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0RG9uZShib29sZWFuIGRvbmUpIHsKLSAgICAgICAgaWYgKG1IYXZlU2V0RG9uZSkgewotICAgICAgICAgICAgbURvbmUgJj0gZG9uZTsgLy8gSWYgd2UndmUgYWxyZWFkeSBzZXQgZG9uZSBmb3IgdGhpcyBpbnN0YW5jZSwgQU5EIHRoZSByZWNlaXZlZCB2YWx1ZQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbURvbmUgPSBkb25lOyAvLyBJZiBkb25lIGhhcyBvbmx5IGJlZW4gaW5pdGlhbGl6ZWQsIG92ZXJ3cml0ZSB0aGUgZXhpc3RpbmcgdmFsdWUKLSAgICAgICAgfQotICAgICAgICBtSGF2ZVNldERvbmUgPSB0cnVlOwotICAgICAgICBpZiAobURvbmUpIHsKLSAgICAgICAgICAgIG1Ob3RFeGVjdXRlZCA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaW5Qcm9ncmVzcyhib29sZWFuIGluUHJvZ3Jlc3MpIHsKLSAgICAgICAgbUluUHJvZ3Jlc3MgPSBpblByb2dyZXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldEV4cGVjdGVkVGVzdFJ1bnMoKSB7Ci0gICAgICAgIHJldHVybiBtRXhwZWN0ZWRUZXN0UnVuczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0RXhwZWN0ZWRUZXN0UnVucyhpbnQgbnVtUnVucykgewotICAgICAgICBtRXhwZWN0ZWRUZXN0UnVucyA9IG51bVJ1bnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0VGVzdFJ1bnMoKSB7Ci0gICAgICAgIHJldHVybiBtQWN0dWFsVGVzdFJ1bnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkZFRlc3RSdW4oKSB7Ci0gICAgICAgIG1BY3R1YWxUZXN0UnVucysrOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZXNldFRlc3RSdW5zKCkgewotICAgICAgICBtQWN0dWFsVGVzdFJ1bnMgPSAwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldE5vdEV4ZWN1dGVkKCkgewotICAgICAgICByZXR1cm4gbU5vdEV4ZWN1dGVkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXROb3RFeGVjdXRlZChpbnQgbnVtVGVzdHMpIHsKLSAgICAgICAgbU5vdEV4ZWN1dGVkID0gbnVtVGVzdHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgIHJldHVybiBtSWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIEFiaVV0aWxzLnBhcnNlVGVzdE5hbWUobUlkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRBYmkoKSB7Ci0gICAgICAgIHJldHVybiBBYmlVdGlscy5wYXJzZUFiaShtSWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGRSdW50aW1lKGxvbmcgZWxhcHNlZFRpbWUpIHsKLSAgICAgICAgbVJ1bnRpbWUgKz0gZWxhcHNlZFRpbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJlc2V0UnVudGltZSgpIHsKLSAgICAgICAgbVJ1bnRpbWUgPSAwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgbG9uZyBnZXRSdW50aW1lKCkgewotICAgICAgICByZXR1cm4gbVJ1bnRpbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJQ2FzZVJlc3VsdCBnZXRPckNyZWF0ZVJlc3VsdChTdHJpbmcgY2FzZU5hbWUpIHsKLSAgICAgICAgSUNhc2VSZXN1bHQgcmVzdWx0ID0gbVJlc3VsdHMuZ2V0KGNhc2VOYW1lKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBuZXcgQ2FzZVJlc3VsdChjYXNlTmFtZSk7Ci0gICAgICAgICAgICBtUmVzdWx0cy5wdXQoY2FzZU5hbWUsIHJlc3VsdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElDYXNlUmVzdWx0IGdldFJlc3VsdChTdHJpbmcgY2FzZU5hbWUpIHsKLSAgICAgICAgcmV0dXJuIG1SZXN1bHRzLmdldChjYXNlTmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMaXN0PElDYXNlUmVzdWx0PiBnZXRSZXN1bHRzKCkgewotICAgICAgICBBcnJheUxpc3Q8SUNhc2VSZXN1bHQ+IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0PD4obVJlc3VsdHMudmFsdWVzKCkpOwotICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHJlc3VsdHMpOwotICAgICAgICByZXR1cm4gcmVzdWx0czsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBjb3VudFJlc3VsdHMoVGVzdFN0YXR1cyBzdGF0dXMpIHsKLSAgICAgICAgaW50IHRvdGFsID0gMDsKLSAgICAgICAgZm9yIChJQ2FzZVJlc3VsdCByZXN1bHQgOiBtUmVzdWx0cy52YWx1ZXMoKSkgewotICAgICAgICAgICAgdG90YWwgKz0gcmVzdWx0LmNvdW50UmVzdWx0cyhzdGF0dXMpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0b3RhbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBjb21wYXJlVG8oSU1vZHVsZVJlc3VsdCBhbm90aGVyKSB7Ci0gICAgICAgIHJldHVybiBnZXRJZCgpLmNvbXBhcmVUbyhhbm90aGVyLmdldElkKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBtZXJnZUZyb20oSU1vZHVsZVJlc3VsdCBvdGhlck1vZHVsZVJlc3VsdCkgewotICAgICAgICBpZiAoIW90aGVyTW9kdWxlUmVzdWx0LmdldElkKCkuZXF1YWxzKGdldElkKCkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgIkNhbm5vdCBtZXJnZSBtb2R1bGUgcmVzdWx0IHdpdGggbWlzbWF0Y2hlZCBpZC4gRXhwZWN0ZWQgJXMsIEZvdW5kICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyTW9kdWxlUmVzdWx0LmdldElkKCksIGdldElkKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMubVJ1bnRpbWUgKz0gb3RoZXJNb2R1bGVSZXN1bHQuZ2V0UnVudGltZSgpOwotICAgICAgICB0aGlzLm1Ob3RFeGVjdXRlZCArPSBvdGhlck1vZHVsZVJlc3VsdC5nZXROb3RFeGVjdXRlZCgpOwotICAgICAgICAvLyBvbmx5IHRvdWNoIHZhcmlhYmxlcyByZWxhdGVkIHRvICdkb25lJyBzdGF0dXMgaWYgdGhpcyBtb2R1bGUgaXMgbm90IGFscmVhZHkgZG9uZQotICAgICAgICBpZiAoIWlzRG9uZSgpKSB7Ci0gICAgICAgICAgICB0aGlzLnNldERvbmUob3RoZXJNb2R1bGVSZXN1bHQuaXNEb25lU29GYXIoKSk7Ci0gICAgICAgICAgICB0aGlzLm1BY3R1YWxUZXN0UnVucyArPSBvdGhlck1vZHVsZVJlc3VsdC5nZXRUZXN0UnVucygpOwotICAgICAgICAgICAgLy8gZXhwZWN0ZWQgdGVzdCBydW5zIGFyZSB0aGUgc2FtZSBhY3Jvc3Mgc2hhcmRzLCBleGNlcHQgZm9yIHNoYXJkcyB0aGF0IGRvIG5vdCBydW4KLSAgICAgICAgICAgIC8vIHRoaXMgbW9kdWxlIGF0IGxlYXN0IG9uY2UgKGZvciB3aGljaCB0aGUgdmFsdWUgaXMgbm90IHlldCBzZXQpLgotICAgICAgICAgICAgdGhpcy5tRXhwZWN0ZWRUZXN0UnVucyA9IG90aGVyTW9kdWxlUmVzdWx0LmdldEV4cGVjdGVkVGVzdFJ1bnMoKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKElDYXNlUmVzdWx0IG90aGVyQ2FzZVJlc3VsdCA6IG90aGVyTW9kdWxlUmVzdWx0LmdldFJlc3VsdHMoKSkgewotICAgICAgICAgICAgSUNhc2VSZXN1bHQgY2FzZVJlc3VsdCA9IGdldE9yQ3JlYXRlUmVzdWx0KG90aGVyQ2FzZVJlc3VsdC5nZXROYW1lKCkpOwotICAgICAgICAgICAgY2FzZVJlc3VsdC5tZXJnZUZyb20ob3RoZXJDYXNlUmVzdWx0KTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL011bHRpcGFydEZvcm0uamF2YSBiL2NvbW1vbi91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL011bHRpcGFydEZvcm0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMxMTQ5Mi4uMDAwMDAwMAotLS0gYS9jb21tb24vdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9NdWx0aXBhcnRGb3JtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEubmV0Lkh0dHBVUkxDb25uZWN0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKiogQnVpbGRzIGEgbXVsdGlwYXJ0IGZvcm0gYW5kIHN1Ym1pdHMgaXQuICovCi1jbGFzcyBNdWx0aXBhcnRGb3JtIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX0RBVEFfQk9VTkRBUlkgPSAiQzc1STU1dTNSM3AwcjczciI7Ci0KLSAgICAvKiBwYWNrYWdlICovIGZpbmFsIFN0cmluZyBtU2VydmVyVXJsOwotICAgIC8qIHBhY2thZ2UgKi8gZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBtRm9ybVZhbHVlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotICAgIC8qIHBhY2thZ2UgKi8gU3RyaW5nIG1OYW1lOwotICAgIC8qIHBhY2thZ2UgKi8gU3RyaW5nIG1GaWxlTmFtZTsKLSAgICAvKiBwYWNrYWdlICovIGJ5dGVbXSBtRGF0YTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgbXVsdGktcGFydCBmb3JtIHdpdGggdGhlIGdpdmVuIHNlcnZlclVybC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTXVsdGlwYXJ0Rm9ybShTdHJpbmcgc2VydmVyVXJsKSB7Ci0gICAgICAgIG1TZXJ2ZXJVcmwgPSBzZXJ2ZXJVcmw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIGtleSB2YWx1ZSBhdHRyaWJ1dGUgdG8gdGhlIGZvcm0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgYXR0cmlidXRlJ3MgdmFsdWUuCi0gICAgICogQHJldHVybiB0aGUge0BsaW5rIE11bHRpcGFydEZvcm19IGZvciBlYXN5IGNoYWluaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBNdWx0aXBhcnRGb3JtIGFkZEZvcm1WYWx1ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIG1Gb3JtVmFsdWVzLnB1dChuYW1lLCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgdGhlIGZpbGUgYXMgdGhlIHBheWxvYWQgb2YgdGhlIGZvcm0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiBhdHRyaWJ1dGUKLSAgICAgKiBAcGFyYW0gZmlsZU5hbWUgVGhlIGZpbGUncyBuYW1lCi0gICAgICogQHBhcmFtIGRhdGEgVGhlIGZpbGUncyBkYXRhCi0gICAgICogQHJldHVybiB0aGUge0BsaW5rIE11bHRpcGFydEZvcm19IGZvciBlYXN5IGNoYWluaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBNdWx0aXBhcnRGb3JtIGFkZEZvcm1GaWxlKFN0cmluZyBuYW1lLCBTdHJpbmcgZmlsZU5hbWUsIGJ5dGVbXSBkYXRhKSB7Ci0gICAgICAgIG1OYW1lID0gbmFtZTsKLSAgICAgICAgbUZpbGVOYW1lID0gZmlsZU5hbWU7Ci0gICAgICAgIG1EYXRhID0gZGF0YTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3VibWl0cyB0aGUgZm9ybSB0byB0aGUgc2VydmVyIHVybC4KLSAgICAgKgotICAgICAqIFRoaXMgd2lsbCBoYW5kbGUgYSByZWRpcmVjdGlvbiBmcm9tIHRoZSBzZXJ2ZXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHJlc3BvbnNlIGNvZGUKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIGludCBzdWJtaXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gc3VibWl0Rm9ybShtU2VydmVyVXJsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gc2VydmVyVXJsIHRvIHBvc3QgdGhlIGRhdGEgdG8KLSAgICAgKiBAcmV0dXJuIHJlc3BvbnNlIGNvZGUKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgc3VibWl0Rm9ybShTdHJpbmcgc2VydmVyVXJsKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBIdHRwVVJMQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKHNlcnZlclVybCk7Ci0gICAgICAgICAgICBjb25uZWN0aW9uID0gKEh0dHBVUkxDb25uZWN0aW9uKSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKLSAgICAgICAgICAgIGNvbm5lY3Rpb24uc2V0SW5zdGFuY2VGb2xsb3dSZWRpcmVjdHMoZmFsc2UpOwotICAgICAgICAgICAgY29ubmVjdGlvbi5zZXRSZXF1ZXN0TWV0aG9kKCJQT1NUIik7Ci0gICAgICAgICAgICBjb25uZWN0aW9uLnNldERvT3V0cHV0KHRydWUpOwotICAgICAgICAgICAgY29ubmVjdGlvbi5zZXRSZXF1ZXN0UHJvcGVydHkoIkNvbnRlbnQtVHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICJtdWx0aXBhcnQvZm9ybS1kYXRhOyBib3VuZGFyeT0iICsgRk9STV9EQVRBX0JPVU5EQVJZKTsKLQotICAgICAgICAgICAgYnl0ZVtdIGJvZHkgPSBnZXRDb250ZW50Qm9keSgpOwotICAgICAgICAgICAgY29ubmVjdGlvbi5zZXRSZXF1ZXN0UHJvcGVydHkoIkNvbnRlbnQtTGVuZ3RoIiwgSW50ZWdlci50b1N0cmluZyhib2R5Lmxlbmd0aCkpOwotCi0gICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3V0cHV0ID0gY29ubmVjdGlvbi5nZXRPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0LndyaXRlKGJvZHkpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBvdXRwdXQuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gT3BlbiB0aGUgc3RyZWFtIHRvIGdldCBhIHJlc3BvbnNlLiBPdGhlcndpc2UgcmVxdWVzdCB3aWxsIGJlIGNhbmNlbGxlZC4KLSAgICAgICAgICAgIElucHV0U3RyZWFtIGlucHV0ID0gY29ubmVjdGlvbi5nZXRJbnB1dFN0cmVhbSgpOwotICAgICAgICAgICAgaW5wdXQuY2xvc2UoKTsKLQotICAgICAgICAgICAgaW50IHJlc3BvbnNlID0gY29ubmVjdGlvbi5nZXRSZXNwb25zZUNvZGUoKTsKLSAgICAgICAgICAgIGlmIChyZXNwb25zZSA9PSAzMDIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3VibWl0Rm9ybShjb25uZWN0aW9uLmdldEhlYWRlckZpZWxkKCJMb2NhdGlvbiIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXNwb25zZTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChjb25uZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb25uZWN0aW9uLmRpc2Nvbm5lY3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIHBhY2thZ2UgKi8gYnl0ZVtdIGdldENvbnRlbnRCb2R5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ5dGVPdXRwdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IG5ldyBQcmludFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKGJ5dGVPdXRwdXQpKTsKLSAgICAgICAgd3JpdGVyLnByaW50bG4oKTsKLQotICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gZm9ybVZhbHVlIDogbUZvcm1WYWx1ZXMuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgd3JpdGVGb3JtRmllbGQod3JpdGVyLCBmb3JtVmFsdWUuZ2V0S2V5KCksIGZvcm1WYWx1ZS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtRGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB3cml0ZUZvcm1GaWxlSGVhZGVyKHdyaXRlciwgbU5hbWUsIG1GaWxlTmFtZSk7Ci0gICAgICAgICAgICB3cml0ZXIuZmx1c2goKTsgLy8gTXVzdCBmbHVzaCBoZXJlIGJlZm9yZSB3cml0aW5nIHRvIHRoZSBieXRlIHN0cmVhbSEKLSAgICAgICAgICAgIGJ5dGVPdXRwdXQud3JpdGUobURhdGEpOwotICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oKTsKLSAgICAgICAgfQotICAgICAgICB3cml0ZXIuYXBwZW5kKCItLSIpLmFwcGVuZChGT1JNX0RBVEFfQk9VTkRBUlkpLnByaW50bG4oIi0tIik7Ci0gICAgICAgIHdyaXRlci5mbHVzaCgpOwotICAgICAgICB3cml0ZXIuY2xvc2UoKTsKLSAgICAgICAgcmV0dXJuIGJ5dGVPdXRwdXQudG9CeXRlQXJyYXkoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgd3JpdGVGb3JtRmllbGQoUHJpbnRXcml0ZXIgd3JpdGVyLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHdyaXRlci5hcHBlbmQoIi0tIikucHJpbnRsbihGT1JNX0RBVEFfQk9VTkRBUlkpOwotICAgICAgICB3cml0ZXIuYXBwZW5kKCJDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9XCIiKS5hcHBlbmQobmFtZSkucHJpbnRsbigiXCIiKTsKLSAgICAgICAgd3JpdGVyLnByaW50bG4oKTsKLSAgICAgICAgd3JpdGVyLnByaW50bG4odmFsdWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB3cml0ZUZvcm1GaWxlSGVhZGVyKFByaW50V3JpdGVyIHdyaXRlciwgU3RyaW5nIG5hbWUsIFN0cmluZyBmaWxlTmFtZSkgewotICAgICAgICB3cml0ZXIuYXBwZW5kKCItLSIpLnByaW50bG4oRk9STV9EQVRBX0JPVU5EQVJZKTsKLSAgICAgICAgd3JpdGVyLmFwcGVuZCgiQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPVwiIikuYXBwZW5kKG5hbWUpOwotICAgICAgICB3cml0ZXIuYXBwZW5kKCJcIjsgZmlsZW5hbWU9XCIiKS5hcHBlbmQoZmlsZU5hbWUpLnByaW50bG4oIlwiIik7Ci0gICAgICAgIHdyaXRlci5wcmludGxuKCJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtZ3ppcCIpOwotICAgICAgICB3cml0ZXIucHJpbnRsbigiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmluYXJ5Iik7Ci0gICAgICAgIHdyaXRlci5wcmludGxuKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvUmVhZEVsZi5qYXZhIGIvY29tbW9uL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvUmVhZEVsZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDFmZGY2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1JlYWRFbGYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEEgcG9vciBtYW4ncyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcmVhZGVsZiBjb21tYW5kLiBUaGlzIHByb2dyYW0gaXMgZGVzaWduZWQgdG8gcGFyc2UgRUxGCi0gKiAoRXhlY3V0YWJsZSBhbmQgTGlua2FibGUgRm9ybWF0KSBmaWxlcy4KLSAqLwotLy8gVG9EbzogY29uc29saWRhdGUgd2l0aCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsCi1wdWJsaWMgY2xhc3MgUmVhZEVsZiBpbXBsZW1lbnRzIEF1dG9DbG9zZWFibGUgewotICAgIC8qKiBUaGUgbWFnaWMgdmFsdWVzIGZvciB0aGUgRUxGIGlkZW50aWZpY2F0aW9uLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBFTEZNQUcgPSB7Ci0gICAgICAgIChieXRlKSAweDdGLCAoYnl0ZSkgJ0UnLCAoYnl0ZSkgJ0wnLCAoYnl0ZSkgJ0YnLAotICAgIH07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRUlfTklERU5UID0gMTY7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRUlfQ0xBU1MgPSA0OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFSV9EQVRBID0gNTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTV8zODYgPSAzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTV9NSVBTID0gODsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRU1fQVJNID0gNDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVNX1g4Nl82NCA9IDYyOwotICAgIC8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUXVhbGNvbW1fSGV4YWdvbgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTV9RRFNQNiA9IDE2NDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRU1fQUFSQ0g2NCA9IDE4MzsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTEZDTEFTUzMyID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRUxGQ0xBU1M2NCA9IDI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRUxGREFUQTJMU0IgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTEZEQVRBMk1TQiA9IDI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZfQ1VSUkVOVCA9IDE7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFBUX0xPQUQgPSAxOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNIVF9TWU1UQUIgPSAyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSFRfU1RSVEFCID0gMzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0hUX0RZTkFNSUMgPSA2OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSFRfRFlOU1lNID0gMTE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNIVF9HTlVfVkVSREVGID0gMHg2ZmZmZmZmZDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0hUX0dOVV9WRVJORUVEID0gMHg2ZmZmZmZmZTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0hUX0dOVV9WRVJTWU0gPSAweDZmZmZmZmZmOwotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBTeW1ib2wgewotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEJfTE9DQUwgPSAwOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEJfR0xPQkFMID0gMTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RCX1dFQUsgPSAyOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEJfTE9QUk9DID0gMTM7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQl9ISVBST0MgPSAxNTsKLQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVFRfTk9UWVBFID0gMDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RUX09CSkVDVCA9IDE7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUVF9GVU5DID0gMjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RUX1NFQ1RJT04gPSAzOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVFRfRklMRSA9IDQ7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUVF9DT01NT04gPSA1OwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVFRfVExTID0gNjsKLQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE5fVU5ERUYgPSAwOwotCi0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgbmFtZTsKLSAgICAgICAgcHVibGljIGZpbmFsIGludCBiaW5kOwotICAgICAgICBwdWJsaWMgZmluYWwgaW50IHR5cGU7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgc2huZHg7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBsb25nIHZhbHVlOwotICAgICAgICBwdWJsaWMgZmluYWwgbG9uZyBzaXplOwotICAgICAgICBwdWJsaWMgZmluYWwgaW50IG90aGVyOwotCi0gICAgICAgIHB1YmxpYyBWZXJOZWVkIG1WZXJOZWVkOwotICAgICAgICBwdWJsaWMgVmVyRGVmIG1WZXJEZWY7Ci0KLSAgICAgICAgU3ltYm9sKFN0cmluZyBuYW1lLCBpbnQgc3RfaW5mbywgaW50IHN0X3NobmR4LCBsb25nIHN0X3ZhbHVlLCBsb25nIHN0X3NpemUsIGludCBzdF9vdGhlcikgewotICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgICAgIHRoaXMuYmluZCA9IChzdF9pbmZvID4+IDQpICYgMHgwRjsKLSAgICAgICAgICAgIHRoaXMudHlwZSA9IHN0X2luZm8gJiAweDBGOwotICAgICAgICAgICAgdGhpcy5zaG5keCA9IHN0X3NobmR4OwotICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHN0X3ZhbHVlOwotICAgICAgICAgICAgdGhpcy5zaXplID0gc3Rfc2l6ZTsKLSAgICAgICAgICAgIHRoaXMub3RoZXIgPSBzdF9vdGhlcjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICIlcywgJXMsICVzLCAlcywgJXMsICVzIiwKLSAgICAgICAgICAgICAgICAgICAgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgdG9CaW5kKCksCi0gICAgICAgICAgICAgICAgICAgIHRvVHlwZSgpLAotICAgICAgICAgICAgICAgICAgICB0b1NobmR4KCksCi0gICAgICAgICAgICAgICAgICAgIGdldEV4dGVybmFsTGliRmlsZU5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0RXh0ZXJuYWxMaWJOYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdG9CaW5kKCkgewotICAgICAgICAgICAgc3dpdGNoIChiaW5kKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTVEJfTE9DQUw6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAiTE9DQUwiOwotICAgICAgICAgICAgICAgIGNhc2UgU1RCX0dMT0JBTDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJHTE9CQUwiOwotICAgICAgICAgICAgICAgIGNhc2UgU1RCX1dFQUs6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAiV0VBSyI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gIlNUQl8/Pz8gKCIgKyBiaW5kICsgIikiOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdG9UeXBlKCkgewotICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTVFRfTk9UWVBFOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gIk5PVFlQRSI7Ci0gICAgICAgICAgICAgICAgY2FzZSBTVFRfT0JKRUNUOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gIk9CSkVDVCI7Ci0gICAgICAgICAgICAgICAgY2FzZSBTVFRfRlVOQzoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJGVU5DIjsKLSAgICAgICAgICAgICAgICBjYXNlIFNUVF9TRUNUSU9OOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlNFQ1RJT04iOwotICAgICAgICAgICAgICAgIGNhc2UgU1RUX0ZJTEU6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAiRklMRSI7Ci0gICAgICAgICAgICAgICAgY2FzZSBTVFRfQ09NTU9OOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkNPTU1PTiI7Ci0gICAgICAgICAgICAgICAgY2FzZSBTVFRfVExTOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlRMUyI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gIlNUVF8/Pz8gKCIgKyB0eXBlICsgIikiOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdG9TaG5keCgpIHsKLSAgICAgICAgICAgIGlmIChzaG5keCA9PSBTSE5fVU5ERUYpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIlVOREVGIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZihzaG5keCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpZiBhIHN5bWJvbCBpcyBub3QgZGVmaW5lIGxvY2FsbHkKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNHbG9iYWxVbmQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKGJpbmQgIT0gU1RCX0xPQ0FMICYmIHNobmR4ID09IFNITl9VTkRFRik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpZiBhIHN5bWJvbCBpcyBleHRlcm4KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNFeHRlcm4oKSB7Ci0gICAgICAgICAgICByZXR1cm4gKGJpbmQgIT0gU1RCX0xPQ0FMICYmIHNobmR4ICE9IFNITl9VTkRFRik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEV4dGVybmFsTGliRmlsZU5hbWUoKSB7Ci0gICAgICAgICAgICBpZiAobVZlck5lZWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtVmVyTmVlZC52bl9maWxlX25hbWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXh0ZXJuYWxMaWJOYW1lKCkgewotICAgICAgICAgICAgaWYgKG1WZXJOZWVkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbVZlck5lZWQudm5fdmVybmF1eFswXS52bmFfbGliX25hbWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0RXh0ZXJuYWxMaWJWZXIoKSB7Ci0gICAgICAgICAgICBpZiAobVZlck5lZWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtVmVyTmVlZC52bl92ZXJuYXV4WzBdLnZuYV9vdGhlcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyRGVmTGliTmFtZSgpIHsKLSAgICAgICAgICAgIGlmIChtVmVyRGVmICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbVZlckRlZi52ZF92ZXJkYXV4WzBdLnZkYV9saWJfbmFtZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRWZXJEZWZWZXJzaW9uKCkgewotICAgICAgICAgICAgaWYgKG1WZXJEZWYgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtVmVyRGVmLnZkX3ZlcnNpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNlY0hlYWRlciB7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBsb25nIHNoX25hbWU7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBsb25nIHNoX3R5cGU7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBsb25nIHNoX2ZsYWdzOwotICAgICAgICBwdWJsaWMgZmluYWwgbG9uZyBzaF9hZGRyOwotICAgICAgICBwdWJsaWMgZmluYWwgbG9uZyBzaF9vZmZzZXQ7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBsb25nIHNoX3NpemU7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBsb25nIHNoX2xpbms7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBsb25nIHNoX2luZm87Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBsb25nIHNoX2FkZHJhbGlnbjsKLSAgICAgICAgcHVibGljIGZpbmFsIGxvbmcgc2hfZW50c2l6ZTsKLQotICAgICAgICBTZWNIZWFkZXIoCi0gICAgICAgICAgICAgICAgbG9uZyBuYW1lLAotICAgICAgICAgICAgICAgIGxvbmcgdHlwZSwKLSAgICAgICAgICAgICAgICBsb25nIGZsYWdzLAotICAgICAgICAgICAgICAgIGxvbmcgYWRkciwKLSAgICAgICAgICAgICAgICBsb25nIG9mZnNldCwKLSAgICAgICAgICAgICAgICBsb25nIHNpemUsCi0gICAgICAgICAgICAgICAgbG9uZyBsaW5rLAotICAgICAgICAgICAgICAgIGxvbmcgaW5mbywKLSAgICAgICAgICAgICAgICBsb25nIGFkZHJhbGlnbiwKLSAgICAgICAgICAgICAgICBsb25nIGVudHNpemUpIHsKLSAgICAgICAgICAgIHRoaXMuc2hfbmFtZSA9IG5hbWU7Ci0gICAgICAgICAgICB0aGlzLnNoX3R5cGUgPSB0eXBlOwotICAgICAgICAgICAgdGhpcy5zaF9mbGFncyA9IGZsYWdzOwotICAgICAgICAgICAgdGhpcy5zaF9hZGRyID0gYWRkcjsKLSAgICAgICAgICAgIHRoaXMuc2hfb2Zmc2V0ID0gb2Zmc2V0OwotICAgICAgICAgICAgdGhpcy5zaF9zaXplID0gc2l6ZTsKLSAgICAgICAgICAgIHRoaXMuc2hfbGluayA9IGxpbms7Ci0gICAgICAgICAgICB0aGlzLnNoX2luZm8gPSBpbmZvOwotICAgICAgICAgICAgdGhpcy5zaF9hZGRyYWxpZ24gPSBhZGRyYWxpZ247Ci0gICAgICAgICAgICB0aGlzLnNoX2VudHNpemUgPSBlbnRzaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgIiVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkIiwKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5zaF9uYW1lLAotICAgICAgICAgICAgICAgICAgICB0aGlzLnNoX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hfZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5zaF9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5zaF9saW5rLAotICAgICAgICAgICAgICAgICAgICB0aGlzLnNoX2luZm8sCi0gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hfYWRkcmFsaWduLAotICAgICAgICAgICAgICAgICAgICB0aGlzLnNoX2VudHNpemUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBWZXJOZWVkIHsKLSAgICAgICAgcHVibGljIGZpbmFsIGludCB2bl92ZXJzaW9uOwotICAgICAgICBwdWJsaWMgZmluYWwgaW50IHZuX2NudDsKLSAgICAgICAgcHVibGljIGZpbmFsIGxvbmcgdm5fZmlsZTsKLSAgICAgICAgcHVibGljIGZpbmFsIGxvbmcgdm5fYXV4OwotICAgICAgICBwdWJsaWMgZmluYWwgbG9uZyB2bl9uZXh0OwotICAgICAgICBwdWJsaWMgU3RyaW5nIHZuX2ZpbGVfbmFtZTsKLSAgICAgICAgcHVibGljIFZlck5BdXhbXSB2bl92ZXJuYXV4OwotCi0gICAgICAgIFZlck5lZWQoU3RyaW5nIGZpbGVfbmFtZSwgU3RyaW5nIGxpYl9uYW1lLCBpbnQgbmR4KSB7Ci0gICAgICAgICAgICB0aGlzLnZuX2ZpbGVfbmFtZSA9IGZpbGVfbmFtZS50b0xvd2VyQ2FzZSgpOwotICAgICAgICAgICAgdGhpcy52bl92ZXJuYXV4ID0gbmV3IFZlck5BdXhbMV07Ci0gICAgICAgICAgICB0aGlzLnZuX3Zlcm5hdXhbMF0gPSBuZXcgVmVyTkF1eChsaWJfbmFtZSwgbmR4KTsKLQotICAgICAgICAgICAgdGhpcy52bl92ZXJzaW9uID0gMDsKLSAgICAgICAgICAgIHRoaXMudm5fY250ID0gMDsKLSAgICAgICAgICAgIHRoaXMudm5fZmlsZSA9IDA7Ci0gICAgICAgICAgICB0aGlzLnZuX2F1eCA9IDA7Ci0gICAgICAgICAgICB0aGlzLnZuX25leHQgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgVmVyTmVlZChpbnQgdmVyLCBpbnQgY250LCBsb25nIGZpbGUsIGxvbmcgYXV4LCBsb25nIG5leHQpIHsKLSAgICAgICAgICAgIHRoaXMudm5fdmVyc2lvbiA9IHZlcjsKLSAgICAgICAgICAgIHRoaXMudm5fY250ID0gY250OwotICAgICAgICAgICAgdGhpcy52bl9maWxlID0gZmlsZTsKLSAgICAgICAgICAgIHRoaXMudm5fYXV4ID0gYXV4OwotICAgICAgICAgICAgdGhpcy52bl9uZXh0ID0gbmV4dDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgU3RyaW5nIHZlcm5hdXhTdHIgPSAiIjsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy52bl9jbnQ7IGkrKykgewotICAgICAgICAgICAgICAgIHZlcm5hdXhTdHIgKz0gU3RyaW5nLmZvcm1hdCgiICAgICVzXG4iLCB0aGlzLnZuX3Zlcm5hdXhbaV0udG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgIiVzLCAlZCwgJWQsICVkLCAlZCwgJWQgXG4lcyIsCi0gICAgICAgICAgICAgICAgICAgIHRoaXMudm5fZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICB0aGlzLnZuX3ZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgIHRoaXMudm5fY250LAotICAgICAgICAgICAgICAgICAgICB0aGlzLnZuX2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgIHRoaXMudm5fYXV4LAotICAgICAgICAgICAgICAgICAgICB0aGlzLnZuX25leHQsCi0gICAgICAgICAgICAgICAgICAgIHZlcm5hdXhTdHIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBWZXJOQXV4IHsKLSAgICAgICAgcHVibGljIGZpbmFsIGxvbmcgdm5hX2hhc2g7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgdm5hX2ZsYWdzOwotICAgICAgICBwdWJsaWMgZmluYWwgaW50IHZuYV9vdGhlcjsKLSAgICAgICAgcHVibGljIGZpbmFsIGxvbmcgdm5hX25hbWU7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBsb25nIHZuYV9uZXh0OwotICAgICAgICBwdWJsaWMgU3RyaW5nIHZuYV9saWJfbmFtZTsKLQotICAgICAgICBWZXJOQXV4KFN0cmluZyBsaWJfbmFtZSwgaW50IG5keCkgewotICAgICAgICAgICAgdGhpcy52bmFfbGliX25hbWUgPSBsaWJfbmFtZTsKLQotICAgICAgICAgICAgdGhpcy52bmFfaGFzaCA9IDA7Ci0gICAgICAgICAgICB0aGlzLnZuYV9mbGFncyA9IDA7Ci0gICAgICAgICAgICB0aGlzLnZuYV9vdGhlciA9IG5keDsKLSAgICAgICAgICAgIHRoaXMudm5hX25hbWUgPSAwOwotICAgICAgICAgICAgdGhpcy52bmFfbmV4dCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBWZXJOQXV4KGxvbmcgaGFzaCwgaW50IGZsYWdzLCBpbnQgb3RoZXIsIGxvbmcgbmFtZSwgbG9uZyBuZXh0KSB7Ci0gICAgICAgICAgICB0aGlzLnZuYV9oYXNoID0gaGFzaDsKLSAgICAgICAgICAgIHRoaXMudm5hX2ZsYWdzID0gZmxhZ3M7Ci0gICAgICAgICAgICB0aGlzLnZuYV9vdGhlciA9IG90aGVyOwotICAgICAgICAgICAgdGhpcy52bmFfbmFtZSA9IG5hbWU7Ci0gICAgICAgICAgICB0aGlzLnZuYV9uZXh0ID0gbmV4dDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICIlcywgJWQsICVkLCAlZCwgJWQsICVkIiwKLSAgICAgICAgICAgICAgICAgICAgdGhpcy52bmFfbGliX25hbWUsCi0gICAgICAgICAgICAgICAgICAgIHRoaXMudm5hX2hhc2gsCi0gICAgICAgICAgICAgICAgICAgIHRoaXMudm5hX2ZsYWdzLAotICAgICAgICAgICAgICAgICAgICB0aGlzLnZuYV9vdGhlciwKLSAgICAgICAgICAgICAgICAgICAgdGhpcy52bmFfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgdGhpcy52bmFfbmV4dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFZlckRlZiB7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgdmRfdmVyc2lvbjsKLSAgICAgICAgcHVibGljIGZpbmFsIGludCB2ZF9mbGFnczsKLSAgICAgICAgcHVibGljIGZpbmFsIGludCB2ZF9uZHg7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgdmRfY250OwotICAgICAgICBwdWJsaWMgZmluYWwgbG9uZyB2ZF9oYXNoOwotICAgICAgICBwdWJsaWMgZmluYWwgbG9uZyB2ZF9hdXg7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBsb25nIHZkX25leHQ7Ci0gICAgICAgIHB1YmxpYyBWZXJEQXV4W10gdmRfdmVyZGF1eDsKLQotICAgICAgICBWZXJEZWYoU3RyaW5nIGxpYl9uYW1lKSB7Ci0gICAgICAgICAgICB0aGlzLnZkX3ZlcmRhdXggPSBuZXcgVmVyREF1eFsxXTsKLSAgICAgICAgICAgIHRoaXMudmRfdmVyZGF1eFswXSA9IG5ldyBWZXJEQXV4KGxpYl9uYW1lKTsKLQotICAgICAgICAgICAgdGhpcy52ZF92ZXJzaW9uID0gMDsKLSAgICAgICAgICAgIHRoaXMudmRfZmxhZ3MgPSAwOwotICAgICAgICAgICAgdGhpcy52ZF9uZHggPSAwOwotICAgICAgICAgICAgdGhpcy52ZF9jbnQgPSAwOwotICAgICAgICAgICAgdGhpcy52ZF9oYXNoID0gMDsKLSAgICAgICAgICAgIHRoaXMudmRfYXV4ID0gMDsKLSAgICAgICAgICAgIHRoaXMudmRfbmV4dCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBWZXJEZWYoaW50IHZlciwgaW50IGZsYWdzLCBpbnQgbmR4LCBpbnQgY250LCBsb25nIGhhc2gsIGxvbmcgYXV4LCBsb25nIG5leHQpIHsKLSAgICAgICAgICAgIHRoaXMudmRfdmVyc2lvbiA9IHZlcjsKLSAgICAgICAgICAgIHRoaXMudmRfZmxhZ3MgPSBmbGFnczsKLSAgICAgICAgICAgIHRoaXMudmRfbmR4ID0gbmR4OwotICAgICAgICAgICAgdGhpcy52ZF9jbnQgPSBjbnQ7Ci0gICAgICAgICAgICB0aGlzLnZkX2hhc2ggPSBoYXNoOwotICAgICAgICAgICAgdGhpcy52ZF9hdXggPSBhdXg7Ci0gICAgICAgICAgICB0aGlzLnZkX25leHQgPSBuZXh0OwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdlN0ciA9ICIiOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLnZkX2NudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgdlN0ciArPSBTdHJpbmcuZm9ybWF0KCIgICAgJXNcbiIsIHRoaXMudmRfdmVyZGF1eFtpXS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAiJXMsICVkLCAlZCwgJWQsICVkLCAlZCBcbiVzIiwKLSAgICAgICAgICAgICAgICAgICAgdGhpcy52ZF92ZXJkYXV4WzBdLnZkYV9saWJfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgdGhpcy52ZF92ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICB0aGlzLnZkX2ZsYWdzLAotICAgICAgICAgICAgICAgICAgICB0aGlzLnZkX25keCwKLSAgICAgICAgICAgICAgICAgICAgdGhpcy52ZF9jbnQsCi0gICAgICAgICAgICAgICAgICAgIHRoaXMudmRfaGFzaCwKLSAgICAgICAgICAgICAgICAgICAgdlN0cik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFZlckRBdXggewotICAgICAgICBwdWJsaWMgZmluYWwgbG9uZyB2ZGFfbmFtZTsKLSAgICAgICAgcHVibGljIGZpbmFsIGxvbmcgdmRhX25leHQ7Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgdmRhX2xpYl9uYW1lOwotCi0gICAgICAgIFZlckRBdXgoU3RyaW5nIGxpYl9uYW1lKSB7Ci0gICAgICAgICAgICB0aGlzLnZkYV9saWJfbmFtZSA9IGxpYl9uYW1lLnRvTG93ZXJDYXNlKCk7Ci0KLSAgICAgICAgICAgIHRoaXMudmRhX25hbWUgPSAwOwotICAgICAgICAgICAgdGhpcy52ZGFfbmV4dCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBWZXJEQXV4KGxvbmcgbmFtZSwgbG9uZyBuZXh0KSB7Ci0gICAgICAgICAgICB0aGlzLnZkYV9uYW1lID0gbmFtZTsKLSAgICAgICAgICAgIHRoaXMudmRhX25leHQgPSBuZXh0OwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJXMsICVkLCAlZCIsIHRoaXMudmRhX2xpYl9uYW1lLCB0aGlzLnZkYV9uYW1lLCB0aGlzLnZkYV9uZXh0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1QYXRoOwotICAgIHByaXZhdGUgZmluYWwgUmFuZG9tQWNjZXNzRmlsZSBtRmlsZTsKLSAgICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBtQnVmZmVyID0gbmV3IGJ5dGVbNTEyXTsKLSAgICBwcml2YXRlIGludCBtRW5kaWFuOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNEeW5hbWljOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNQSUU7Ci0gICAgcHJpdmF0ZSBpbnQgbVR5cGU7Ci0gICAgcHJpdmF0ZSBpbnQgbUFkZHJTaXplOwotCi0gICAgLyoqIFN5bWJvbCBUYWJsZSBvZmZzZXQgKi8KLSAgICBwcml2YXRlIGxvbmcgbVN5bVRhYk9mZnNldDsKLQotICAgIC8qKiBTeW1ib2wgVGFibGUgc2l6ZSAqLwotICAgIHByaXZhdGUgbG9uZyBtU3ltVGFiU2l6ZTsKLQotICAgIC8qKiBTeW1ib2wgZW50cnkgY291bnQgKi8KLSAgICBwcml2YXRlIGludCBtU3ltRW50Q250OwotCi0gICAgLyoqIER5bmFtaWMgU3ltYm9sIFRhYmxlIG9mZnNldCAqLwotICAgIHByaXZhdGUgbG9uZyBtRHluU3ltT2Zmc2V0OwotCi0gICAgLyoqIER5bmFtaWMgU3ltYm9sIFRhYmxlIHNpemUgKi8KLSAgICBwcml2YXRlIGxvbmcgbUR5blN5bVNpemU7Ci0KLSAgICAvKiogRHluYW1pYyBlbnRyeSBjb3VudCAqLwotICAgIHByaXZhdGUgaW50IG1EeW5TeW1FbnRDbnQ7Ci0KLSAgICAvKiogU2VjdGlvbiBIZWFkZXIgU3RyaW5nIFRhYmxlIG9mZnNldCAqLwotICAgIHByaXZhdGUgbG9uZyBtU2hTdHJUYWJPZmZzZXQ7Ci0KLSAgICAvKiogU2VjdGlvbiBIZWFkZXIgU3RyaW5nIFRhYmxlIHNpemUgKi8KLSAgICBwcml2YXRlIGxvbmcgbVNoU3RyVGFiU2l6ZTsKLQotICAgIC8qKiBTdHJpbmcgVGFibGUgb2Zmc2V0ICovCi0gICAgcHJpdmF0ZSBsb25nIG1TdHJUYWJPZmZzZXQ7Ci0KLSAgICAvKiogU3RyaW5nIFRhYmxlIHNpemUgKi8KLSAgICBwcml2YXRlIGxvbmcgbVN0clRhYlNpemU7Ci0KLSAgICAvKiogRHluYW1pYyBTdHJpbmcgVGFibGUgb2Zmc2V0ICovCi0gICAgcHJpdmF0ZSBsb25nIG1EeW5TdHJPZmZzZXQ7Ci0KLSAgICAvKiogRHluYW1pYyBTdHJpbmcgVGFibGUgc2l6ZSAqLwotICAgIHByaXZhdGUgbG9uZyBtRHluU3RyU2l6ZTsKLQotICAgIC8qKiBEeW5hbWljIFN0cmluZyBUYWJsZSBvZmZzZXQgKi8KLSAgICBwcml2YXRlIGxvbmcgbUR5bmFtaWNUYWJPZmZzZXQ7Ci0KLSAgICAvKiogRHluYW1pYyBTdHJpbmcgVGFibGUgc2l6ZSAqLwotICAgIHByaXZhdGUgbG9uZyBtRHluYW1pY1RhYlNpemU7Ci0KLSAgICAvKiogVmVyc2lvbiBTeW1ib2xzIFRhYmxlIG9mZnNldCAqLwotICAgIHByaXZhdGUgbG9uZyBtVmVyU3ltVGFiT2Zmc2V0OwotCi0gICAgLyoqIFZlcnNpb24gU3ltYm9scyBUYWJsZSBzaXplICovCi0gICAgcHJpdmF0ZSBsb25nIG1WZXJTeW1UYWJTaXplOwotCi0gICAgLyoqIFZlcnNpb24gTmVlZHMgVGFibGUgb2Zmc2V0ICovCi0gICAgcHJpdmF0ZSBsb25nIG1WZXJOZWVkVGFiT2Zmc2V0OwotCi0gICAgLyoqIFZlcnNpb24gRGVmaW5pdGlvbiBUYWJsZSBzaXplICovCi0gICAgcHJpdmF0ZSBsb25nIG1WZXJOZWVkVGFiU2l6ZTsKLQotICAgIHByaXZhdGUgaW50IG1WZXJOZWVkRW50cnlDbnQ7Ci0KLSAgICAvKiogVmVyc2lvbiBEZWZpbml0aW9uIFRhYmxlIG9mZnNldCAqLwotICAgIHByaXZhdGUgbG9uZyBtVmVyRGVmVGFiT2Zmc2V0OwotCi0gICAgLyoqIFZlcnNpb24gTmVlZHMgVGFibGUgc2l6ZSAqLwotICAgIHByaXZhdGUgbG9uZyBtVmVyRGVmVGFiU2l6ZTsKLQotICAgIHByaXZhdGUgaW50IG1WZXJEZWZFbnRyeUNudDsKLQotICAgIC8qKiBTeW1ib2wgVGFibGUgc3ltYm9sIG5hbWVzICovCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTeW1ib2w+IG1TeW1ib2xzOwotCi0gICAgLyoqIFN5bWJvbCBUYWJsZSBzeW1ib2wgYXJyYXkgKi8KLSAgICBwcml2YXRlIFN5bWJvbFtdIG1TeW1BcnI7Ci0KLSAgICAvKiogRHluYW1pYyBTeW1ib2wgVGFibGUgc3ltYm9sIG5hbWVzICovCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTeW1ib2w+IG1EeW5hbWljU3ltYm9sczsKLQotICAgIC8qKiBEeW5hbWljIFN5bWJvbCBUYWJsZSBzeW1ib2wgYXJyYXkgKi8KLSAgICBwcml2YXRlIFN5bWJvbFtdIG1EeW5TeW1BcnI7Ci0KLSAgICAvKiogVmVyc2lvbiBTeW1ib2xzIFRhYmxlICovCi0gICAgcHJpdmF0ZSBpbnRbXSBtVmVyU3ltOwotCi0gICAgLyoqIFZlcnNpb24gTmVlZGVkIFRhYmxlICovCi0gICAgcHJpdmF0ZSBWZXJOZWVkW10gbVZlck5lZWRBcnI7Ci0KLSAgICAvKiogVmVyc2lvbiBEZWZpbml0aW9uIFRhYmxlICovCi0gICAgcHJpdmF0ZSBWZXJEZWZbXSBtVmVyRGVmQXJyOwotCi0gICAgcHVibGljIHN0YXRpYyBSZWFkRWxmIHJlYWQoRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbmV3IFJlYWRFbGYoZmlsZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZm9yIChTdHJpbmcgYXJnIDogYXJncykgewotICAgICAgICAgICAgUmVhZEVsZiByZSA9IFJlYWRFbGYucmVhZChuZXcgRmlsZShhcmcpKTsKLSAgICAgICAgICAgIHJlLmdldER5bmFtaWNTeW1ib2woIngiKTsKLSAgICAgICAgICAgIHJlLmdldFN5bWJvbCgieCIpOwotCi0gICAgICAgICAgICBTeW1ib2xbXSBzeW1BcnI7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj09PVN5bWJvbD09PSIpOwotICAgICAgICAgICAgc3ltQXJyID0gcmUuZ2V0U3ltQXJyKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN5bUFyci5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihTdHJpbmcuZm9ybWF0KCIlOHg6ICVzIiwgaSwgc3ltQXJyW2ldLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPT09RHluYW1pYyBTeW1ib2w9PT0iKTsKLSAgICAgICAgICAgIHN5bUFyciA9IHJlLmdldER5blN5bUFycigpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzeW1BcnIubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAocmUubVZlck5lZWRFbnRyeUNudCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJTh4OiAlcywgJXMsICVzIC0gJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bUFycltpXS50b1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltQXJyW2ldLmdldEV4dGVybmFsTGliTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltQXJyW2ldLmdldEV4dGVybmFsTGliRmlsZU5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bUFycltpXS5nZXRFeHRlcm5hbExpYlZlcigpKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJTh4OiAlcywgJXMgLSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltQXJyW2ldLnRvU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1BcnJbaV0uZ2V0VmVyRGVmTGliTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltQXJyW2ldLmdldFZlckRlZlZlcnNpb24oKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgU3ltYm9sPiBnZXRTeW1ib2xzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG1TeW1ib2xzID09IG51bGwpIHsKLSAgICAgICAgICAgIGdldFN5bWJvbCgiIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1TeW1ib2xzOwotICAgIH0KLQotICAgIHB1YmxpYyBTeW1ib2xbXSBnZXRTeW1BcnIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAobVN5bUFyciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBnZXRTeW1ib2woIiIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtU3ltQXJyOwotICAgIH0KLQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBTeW1ib2w+IGdldER5bmFtaWNTeW1ib2xzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG1EeW5hbWljU3ltYm9scyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBnZXREeW5hbWljU3ltYm9sKCIiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbUR5bmFtaWNTeW1ib2xzOwotICAgIH0KLQotICAgIHB1YmxpYyBTeW1ib2xbXSBnZXREeW5TeW1BcnIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAobUR5blN5bUFyciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBnZXREeW5hbWljU3ltYm9sKCIiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbUR5blN5bUFycjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0R5bmFtaWMoKSB7Ci0gICAgICAgIHJldHVybiBtSXNEeW5hbWljOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG1UeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUElFKCkgewotICAgICAgICByZXR1cm4gbUlzUElFOwotICAgIH0KLQotICAgIHByaXZhdGUgUmVhZEVsZihGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIG1QYXRoID0gZmlsZS5nZXRQYXRoKCk7Ci0gICAgICAgIG1GaWxlID0gbmV3IFJhbmRvbUFjY2Vzc0ZpbGUoZmlsZSwgInIiKTsKLQotICAgICAgICBpZiAobUZpbGUubGVuZ3RoKCkgPCBFSV9OSURFTlQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRvbyBzbWFsbCB0byBiZSBhbiBFTEYgZmlsZTogIiArIGZpbGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVhZEhlYWRlcigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgbUZpbGUuY2xvc2UoKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaWdub3JlZCkgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNsb3NlKCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWRIZWFkZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBtRmlsZS5zZWVrKDApOwotICAgICAgICBtRmlsZS5yZWFkRnVsbHkobUJ1ZmZlciwgMCwgRUlfTklERU5UKTsKLQotICAgICAgICBpZiAobUJ1ZmZlclswXSAhPSBFTEZNQUdbMF0KLSAgICAgICAgICAgICAgICB8fCBtQnVmZmVyWzFdICE9IEVMRk1BR1sxXQotICAgICAgICAgICAgICAgIHx8IG1CdWZmZXJbMl0gIT0gRUxGTUFHWzJdCi0gICAgICAgICAgICAgICAgfHwgbUJ1ZmZlclszXSAhPSBFTEZNQUdbM10pIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgRUxGIGZpbGU6ICIgKyBtUGF0aCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZWxmQ2xhc3MgPSBtQnVmZmVyW0VJX0NMQVNTXTsKLSAgICAgICAgaWYgKGVsZkNsYXNzID09IEVMRkNMQVNTMzIpIHsKLSAgICAgICAgICAgIG1BZGRyU2l6ZSA9IDQ7Ci0gICAgICAgIH0gZWxzZSBpZiAoZWxmQ2xhc3MgPT0gRUxGQ0xBU1M2NCkgewotICAgICAgICAgICAgbUFkZHJTaXplID0gODsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiSW52YWxpZCBFTEYgRUlfQ0xBU1M6ICIgKyBlbGZDbGFzcyArICI6ICIgKyBtUGF0aCk7Ci0gICAgICAgIH0KLQotICAgICAgICBtRW5kaWFuID0gbUJ1ZmZlcltFSV9EQVRBXTsKLSAgICAgICAgaWYgKG1FbmRpYW4gPT0gRUxGREFUQTJMU0IpIHsKLSAgICAgICAgfSBlbHNlIGlmIChtRW5kaWFuID09IEVMRkRBVEEyTVNCKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlVuc3VwcG9ydGVkIEVMRkRBVEEyTVNCIGZpbGU6ICIgKyBtUGF0aCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkludmFsaWQgRUxGIEVJX0RBVEE6ICIgKyBtRW5kaWFuICsgIjogIiArIG1QYXRoKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1UeXBlID0gcmVhZEhhbGYoKTsKLQotICAgICAgICBpbnQgZV9tYWNoaW5lID0gcmVhZEhhbGYoKTsKLSAgICAgICAgaWYgKGVfbWFjaGluZSAhPSBFTV8zODYKLSAgICAgICAgICAgICAgICAmJiBlX21hY2hpbmUgIT0gRU1fWDg2XzY0Ci0gICAgICAgICAgICAgICAgJiYgZV9tYWNoaW5lICE9IEVNX0FBUkNINjQKLSAgICAgICAgICAgICAgICAmJiBlX21hY2hpbmUgIT0gRU1fQVJNCi0gICAgICAgICAgICAgICAgJiYgZV9tYWNoaW5lICE9IEVNX01JUFMKLSAgICAgICAgICAgICAgICAmJiBlX21hY2hpbmUgIT0gRU1fUURTUDYpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiSW52YWxpZCBFTEYgZV9tYWNoaW5lOiAiICsgZV9tYWNoaW5lICsgIjogIiArIG1QYXRoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFiaVRlc3QgcmVsaWVzIG9uIHVzIHJlamVjdGluZyBhbnkgdW5zdXBwb3J0ZWQgY29tYmluYXRpb25zLgotICAgICAgICBpZiAoKGVfbWFjaGluZSA9PSBFTV8zODYgJiYgZWxmQ2xhc3MgIT0gRUxGQ0xBU1MzMikKLSAgICAgICAgICAgICAgICB8fCAoZV9tYWNoaW5lID09IEVNX1g4Nl82NCAmJiBlbGZDbGFzcyAhPSBFTEZDTEFTUzY0KQotICAgICAgICAgICAgICAgIHx8IChlX21hY2hpbmUgPT0gRU1fQUFSQ0g2NCAmJiBlbGZDbGFzcyAhPSBFTEZDTEFTUzY0KQotICAgICAgICAgICAgICAgIHx8IChlX21hY2hpbmUgPT0gRU1fQVJNICYmIGVsZkNsYXNzICE9IEVMRkNMQVNTMzIpCi0gICAgICAgICAgICAgICAgfHwgKGVfbWFjaGluZSA9PSBFTV9RRFNQNiAmJiBlbGZDbGFzcyAhPSBFTEZDTEFTUzMyKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBlX21hY2hpbmUvRUlfQ0xBU1MgRUxGIGNvbWJpbmF0aW9uOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlX21hY2hpbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIvIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZWxmQ2xhc3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1QYXRoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvbmcgZV92ZXJzaW9uID0gcmVhZFdvcmQoKTsKLSAgICAgICAgaWYgKGVfdmVyc2lvbiAhPSBFVl9DVVJSRU5UKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkludmFsaWQgZV92ZXJzaW9uOiAiICsgZV92ZXJzaW9uICsgIjogIiArIG1QYXRoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvbmcgZV9lbnRyeSA9IHJlYWRBZGRyKCk7Ci0KLSAgICAgICAgbG9uZyBwaF9vZmYgPSByZWFkT2ZmKCk7Ci0gICAgICAgIGxvbmcgc2hfb2ZmID0gcmVhZE9mZigpOwotCi0gICAgICAgIGxvbmcgZV9mbGFncyA9IHJlYWRXb3JkKCk7Ci0gICAgICAgIGludCBlX2Voc2l6ZSA9IHJlYWRIYWxmKCk7Ci0gICAgICAgIGludCBlX3BoZW50c2l6ZSA9IHJlYWRIYWxmKCk7Ci0gICAgICAgIGludCBlX3BobnVtID0gcmVhZEhhbGYoKTsKLSAgICAgICAgaW50IGVfc2hlbnRzaXplID0gcmVhZEhhbGYoKTsKLSAgICAgICAgaW50IGVfc2hudW0gPSByZWFkSGFsZigpOwotICAgICAgICBpbnQgZV9zaHN0cm5keCA9IHJlYWRIYWxmKCk7Ci0KLSAgICAgICAgcmVhZFNlY3Rpb25IZWFkZXJzKHNoX29mZiwgZV9zaG51bSwgZV9zaGVudHNpemUsIGVfc2hzdHJuZHgpOwotICAgICAgICByZWFkUHJvZ3JhbUhlYWRlcnMocGhfb2ZmLCBlX3BobnVtLCBlX3BoZW50c2l6ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWRTZWN0aW9uSGVhZGVycyhsb25nIHNoX29mZiwgaW50IGVfc2hudW0sIGludCBlX3NoZW50c2l6ZSwgaW50IGVfc2hzdHJuZHgpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAvLyBSZWFkIHRoZSBTZWN0aW9uIEhlYWRlciBTdHJpbmcgVGFibGUgb2Zmc2V0IGZpcnN0LgotICAgICAgICB7Ci0gICAgICAgICAgICBtRmlsZS5zZWVrKHNoX29mZiArIGVfc2hzdHJuZHggKiBlX3NoZW50c2l6ZSk7Ci0KLSAgICAgICAgICAgIGxvbmcgc2hfbmFtZSA9IHJlYWRXb3JkKCk7Ci0gICAgICAgICAgICBsb25nIHNoX3R5cGUgPSByZWFkV29yZCgpOwotICAgICAgICAgICAgbG9uZyBzaF9mbGFncyA9IHJlYWRYKG1BZGRyU2l6ZSk7Ci0gICAgICAgICAgICBsb25nIHNoX2FkZHIgPSByZWFkQWRkcigpOwotICAgICAgICAgICAgbG9uZyBzaF9vZmZzZXQgPSByZWFkT2ZmKCk7Ci0gICAgICAgICAgICBsb25nIHNoX3NpemUgPSByZWFkWChtQWRkclNpemUpOwotICAgICAgICAgICAgLy8gLi4uCi0KLSAgICAgICAgICAgIGlmIChzaF90eXBlID09IFNIVF9TVFJUQUIpIHsKLSAgICAgICAgICAgICAgICBtU2hTdHJUYWJPZmZzZXQgPSBzaF9vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgbVNoU3RyVGFiU2l6ZSA9IHNoX3NpemU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVfc2hudW07ICsraSkgewotICAgICAgICAgICAgLy8gRG9uJ3QgYm90aGVyIHRvIHJlLXJlYWQgdGhlIFNlY3Rpb24gSGVhZGVyIFN0clRhYi4KLSAgICAgICAgICAgIGlmIChpID09IGVfc2hzdHJuZHgpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUZpbGUuc2VlayhzaF9vZmYgKyBpICogZV9zaGVudHNpemUpOwotCi0gICAgICAgICAgICBsb25nIHNoX25hbWUgPSByZWFkV29yZCgpOwotICAgICAgICAgICAgbG9uZyBzaF90eXBlID0gcmVhZFdvcmQoKTsKLSAgICAgICAgICAgIGxvbmcgc2hfZmxhZ3MgPSByZWFkWChtQWRkclNpemUpOwotICAgICAgICAgICAgbG9uZyBzaF9hZGRyID0gcmVhZEFkZHIoKTsKLSAgICAgICAgICAgIGxvbmcgc2hfb2Zmc2V0ID0gcmVhZE9mZigpOwotICAgICAgICAgICAgbG9uZyBzaF9zaXplID0gcmVhZFgobUFkZHJTaXplKTsKLSAgICAgICAgICAgIGxvbmcgc2hfbGluayA9IHJlYWRXb3JkKCk7Ci0gICAgICAgICAgICBsb25nIHNoX2luZm8gPSByZWFkV29yZCgpOwotICAgICAgICAgICAgbG9uZyBzaF9hZGRyYWxpZ24gPSByZWFkWChtQWRkclNpemUpOwotICAgICAgICAgICAgOwotICAgICAgICAgICAgbG9uZyBzaF9lbnRzaXplID0gcmVhZFgobUFkZHJTaXplKTsKLSAgICAgICAgICAgIDsKLQotICAgICAgICAgICAgaWYgKHNoX3R5cGUgPT0gU0hUX1NZTVRBQiB8fCBzaF90eXBlID09IFNIVF9EWU5TWU0pIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc3ltVGFiTmFtZSA9IHJlYWRTaFN0clRhYkVudHJ5KHNoX25hbWUpOwotICAgICAgICAgICAgICAgIGlmICgiLnN5bXRhYiIuZXF1YWxzKHN5bVRhYk5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TeW1UYWJPZmZzZXQgPSBzaF9vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgIG1TeW1UYWJTaXplID0gc2hfc2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgbVN5bUVudENudCA9IChpbnQpIChzaF9zaXplIC8gc2hfZW50c2l6ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiLmR5bnN5bSIuZXF1YWxzKHN5bVRhYk5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1EeW5TeW1PZmZzZXQgPSBzaF9vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgIG1EeW5TeW1TaXplID0gc2hfc2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgbUR5blN5bUVudENudCA9IChpbnQpIChzaF9zaXplIC8gc2hfZW50c2l6ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcywgJWQsICVkLCAlZCwgJWQsICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltVGFiTmFtZSwgc2hfb2Zmc2V0LCBzaF9zaXplLCBzaF9saW5rLCBzaF9pbmZvLCBzaF9lbnRzaXplKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHNoX3R5cGUgPT0gU0hUX1NUUlRBQikgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzdHJUYWJOYW1lID0gcmVhZFNoU3RyVGFiRW50cnkoc2hfbmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKCIuc3RydGFiIi5lcXVhbHMoc3RyVGFiTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbVN0clRhYk9mZnNldCA9IHNoX29mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgbVN0clRhYlNpemUgPSBzaF9zaXplOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIi5keW5zdHIiLmVxdWFscyhzdHJUYWJOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBtRHluU3RyT2Zmc2V0ID0gc2hfb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICBtRHluU3RyU2l6ZSA9IHNoX3NpemU7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzLCAlZCwgJWQsICVkLCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJUYWJOYW1lLCBzaF9vZmZzZXQsIHNoX3NpemUsIHNoX2xpbmssIHNoX2luZm8pKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHNoX3R5cGUgPT0gU0hUX0RZTkFNSUMpIHsKLSAgICAgICAgICAgICAgICBtSXNEeW5hbWljID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc3RyVGFiTmFtZSA9IHJlYWRTaFN0clRhYkVudHJ5KHNoX25hbWUpOwotICAgICAgICAgICAgICAgIG1EeW5hbWljVGFiT2Zmc2V0ID0gc2hfb2Zmc2V0OwotICAgICAgICAgICAgICAgIG1EeW5hbWljVGFiU2l6ZSA9IHNoX3NpemU7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKAotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzLCAlZCwgJWQsICVkLCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0clRhYk5hbWUsIHNoX29mZnNldCwgc2hfc2l6ZSwgc2hfbGluaywgc2hfaW5mbykpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzaF90eXBlID09IFNIVF9HTlVfVkVSU1lNKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHN0clRhYk5hbWUgPSByZWFkU2hTdHJUYWJFbnRyeShzaF9uYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoIi5nbnUudmVyc2lvbiIuZXF1YWxzKHN0clRhYk5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1WZXJTeW1UYWJPZmZzZXQgPSBzaF9vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgIG1WZXJTeW1UYWJTaXplID0gc2hfc2l6ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKAotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzLCAlZCwgJWQsICVkLCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0clRhYk5hbWUsIHNoX29mZnNldCwgc2hfc2l6ZSwgc2hfbGluaywgc2hfaW5mbykpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzaF90eXBlID09IFNIVF9HTlVfVkVSTkVFRCkgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzdHJUYWJOYW1lID0gcmVhZFNoU3RyVGFiRW50cnkoc2hfbmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKCIuZ251LnZlcnNpb25fciIuZXF1YWxzKHN0clRhYk5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1WZXJOZWVkVGFiT2Zmc2V0ID0gc2hfb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICBtVmVyTmVlZFRhYlNpemUgPSBzaF9zaXplOwotICAgICAgICAgICAgICAgICAgICBtVmVyTmVlZEVudHJ5Q250ID0gKGludCkgc2hfaW5mbzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKAotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzLCAlZCwgJWQsICVkLCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0clRhYk5hbWUsIHNoX29mZnNldCwgc2hfc2l6ZSwgc2hfbGluaywgc2hfaW5mbykpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzaF90eXBlID09IFNIVF9HTlVfVkVSREVGKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHN0clRhYk5hbWUgPSByZWFkU2hTdHJUYWJFbnRyeShzaF9uYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoIi5nbnUudmVyc2lvbl9kIi5lcXVhbHMoc3RyVGFiTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbVZlckRlZlRhYk9mZnNldCA9IHNoX29mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgbVZlckRlZlRhYlNpemUgPSBzaF9zaXplOwotICAgICAgICAgICAgICAgICAgICBtVmVyRGVmRW50cnlDbnQgPSAoaW50KSBzaF9pbmZvOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMsICVkLCAlZCwgJWQsICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyVGFiTmFtZSwgc2hfb2Zmc2V0LCBzaF9zaXplLCBzaF9saW5rLCBzaF9pbmZvKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVhZFByb2dyYW1IZWFkZXJzKGxvbmcgcGhfb2ZmLCBpbnQgZV9waG51bSwgaW50IGVfcGhlbnRzaXplKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVfcGhudW07ICsraSkgewotICAgICAgICAgICAgbUZpbGUuc2VlayhwaF9vZmYgKyBpICogZV9waGVudHNpemUpOwotCi0gICAgICAgICAgICBsb25nIHBfdHlwZSA9IHJlYWRXb3JkKCk7Ci0gICAgICAgICAgICBpZiAocF90eXBlID09IFBUX0xPQUQpIHsKLSAgICAgICAgICAgICAgICBpZiAobUFkZHJTaXplID09IDgpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gT25seSBpbiBFbGY2NF9waGRyOyBpbiBFbGYzMl9waGRyIHBfZmxhZ3MgaXMgYXQgdGhlIGVuZC4KLSAgICAgICAgICAgICAgICAgICAgbG9uZyBwX2ZsYWdzID0gcmVhZFdvcmQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbG9uZyBwX29mZnNldCA9IHJlYWRPZmYoKTsKLSAgICAgICAgICAgICAgICBsb25nIHBfdmFkZHIgPSByZWFkQWRkcigpOwotICAgICAgICAgICAgICAgIC8vIC4uLgotCi0gICAgICAgICAgICAgICAgaWYgKHBfdmFkZHIgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBtSXNQSUUgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIFN5bWJvbD4gcmVhZFN5bWJvbFRhYmxlKAotICAgICAgICAgICAgU3ltYm9sW10gc3ltQXJyLAotICAgICAgICAgICAgYm9vbGVhbiBpc0R5blN5bSwKLSAgICAgICAgICAgIGxvbmcgc3ltU3RyT2Zmc2V0LAotICAgICAgICAgICAgbG9uZyBzeW1TdHJTaXplLAotICAgICAgICAgICAgbG9uZyB0YWJsZU9mZnNldCwKLSAgICAgICAgICAgIGxvbmcgdGFibGVTaXplKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsIFN5bWJvbD4gcmVzdWx0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTeW1ib2w+KCk7Ci0gICAgICAgIG1GaWxlLnNlZWsodGFibGVPZmZzZXQpOwotICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgIHdoaWxlIChtRmlsZS5nZXRGaWxlUG9pbnRlcigpIDwgdGFibGVPZmZzZXQgKyB0YWJsZVNpemUpIHsKLSAgICAgICAgICAgIGxvbmcgc3RfbmFtZSA9IHJlYWRXb3JkKCk7Ci0gICAgICAgICAgICBpbnQgc3RfaW5mbzsKLSAgICAgICAgICAgIGludCBzdF9zaG5keDsKLSAgICAgICAgICAgIGxvbmcgc3RfdmFsdWU7Ci0gICAgICAgICAgICBsb25nIHN0X3NpemU7Ci0gICAgICAgICAgICBpbnQgc3Rfb3RoZXI7Ci0gICAgICAgICAgICBpZiAobUFkZHJTaXplID09IDgpIHsKLSAgICAgICAgICAgICAgICBzdF9pbmZvID0gcmVhZEJ5dGUoKTsKLSAgICAgICAgICAgICAgICBzdF9vdGhlciA9IHJlYWRCeXRlKCk7Ci0gICAgICAgICAgICAgICAgc3Rfc2huZHggPSByZWFkSGFsZigpOwotICAgICAgICAgICAgICAgIHN0X3ZhbHVlID0gcmVhZEFkZHIoKTsKLSAgICAgICAgICAgICAgICBzdF9zaXplID0gcmVhZFgobUFkZHJTaXplKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3RfdmFsdWUgPSByZWFkQWRkcigpOwotICAgICAgICAgICAgICAgIHN0X3NpemUgPSByZWFkV29yZCgpOwotICAgICAgICAgICAgICAgIHN0X2luZm8gPSByZWFkQnl0ZSgpOwotICAgICAgICAgICAgICAgIHN0X290aGVyID0gcmVhZEJ5dGUoKTsKLSAgICAgICAgICAgICAgICBzdF9zaG5keCA9IHJlYWRIYWxmKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBzeW1OYW1lOwotICAgICAgICAgICAgaWYgKHN0X25hbWUgPT0gMCkgewotICAgICAgICAgICAgICAgIHN5bU5hbWUgPSAiIjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3ltTmFtZSA9IHJlYWRTdHJUYWJFbnRyeShzeW1TdHJPZmZzZXQsIHN5bVN0clNpemUsIHN0X25hbWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTeW1ib2wgc3ltID0gbmV3IFN5bWJvbChzeW1OYW1lLCBzdF9pbmZvLCBzdF9zaG5keCwgc3RfdmFsdWUsIHN0X3NpemUsIHN0X290aGVyKTsKLSAgICAgICAgICAgIGlmIChzeW1OYW1lLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQucHV0KHN5bU5hbWUsIHN5bSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaXNEeW5TeW0pIHsKLSAgICAgICAgICAgICAgICBpZiAobVZlck5lZWRFbnRyeUNudCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN5bS50eXBlID09IFN5bWJvbC5TVFRfTk9UWVBFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzeW0ubVZlck5lZWQgPSBtVmVyTmVlZEFyclswXTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN5bS5tVmVyTmVlZCA9IGdldFZlck5lZWQobVZlclN5bVtpXSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1WZXJEZWZFbnRyeUNudCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgc3ltLm1WZXJEZWYgPSBtVmVyRGVmQXJyW21WZXJTeW1baV1dOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN5bUFycltpXSA9IHN5bTsKLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgfQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCi0gICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJJbmZvIHJlYWRTeW1ib2xUYWJsZTogJXMsIGlzRHluU3ltICViLCBzeW1ib2wjICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QYXRoLCBpc0R5blN5bSwgc3ltQXJyLmxlbmd0aCkpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIHJlYWRTaFN0clRhYkVudHJ5KGxvbmcgc3RyT2Zmc2V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAobVNoU3RyVGFiT2Zmc2V0ID09IDAgfHwgc3RyT2Zmc2V0IDwgMCB8fCBzdHJPZmZzZXQgPj0gbVNoU3RyVGFiU2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlYWRTdHJpbmcobVNoU3RyVGFiT2Zmc2V0ICsgc3RyT2Zmc2V0KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyByZWFkU3RyVGFiRW50cnkobG9uZyB0YWJsZU9mZnNldCwgbG9uZyB0YWJsZVNpemUsIGxvbmcgc3RyT2Zmc2V0KQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHRhYmxlT2Zmc2V0ID09IDAgfHwgc3RyT2Zmc2V0IDwgMCB8fCBzdHJPZmZzZXQgPj0gdGFibGVTaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVhZFN0cmluZyh0YWJsZU9mZnNldCArIHN0ck9mZnNldCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgcmVhZER5blN0clRhYkVudHJ5KGxvbmcgc3RyT2Zmc2V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAobUR5blN0ck9mZnNldCA9PSAwIHx8IHN0ck9mZnNldCA8IDAgfHwgc3RyT2Zmc2V0ID49IG1EeW5TdHJTaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVhZFN0cmluZyhtRHluU3RyT2Zmc2V0ICsgc3RyT2Zmc2V0KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludFtdIGdldFZlclN5bSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChtVmVyU3ltID09IG51bGwpIHsKLSAgICAgICAgICAgIG1GaWxlLnNlZWsobVZlclN5bVRhYk9mZnNldCk7Ci0gICAgICAgICAgICBpbnQgY250ID0gKGludCkgbVZlclN5bVRhYlNpemUgLyAyOwotICAgICAgICAgICAgbVZlclN5bSA9IG5ldyBpbnRbY250XTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY250OyBpKyspIHsKLSAgICAgICAgICAgICAgICBtVmVyU3ltW2ldID0gcmVhZEhhbGYoKTsKLSAgICAgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbihTdHJpbmcuZm9ybWF0KCIlZCwgJWQiLCBpLCBtVmVyU3ltW2ldKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1WZXJTeW07Ci0gICAgfQotCi0gICAgcHVibGljIFZlck5lZWQgZ2V0VmVyTmVlZChpbnQgbmR4KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAvLyB2bmFfb3RoZXIgQ29udGFpbnMgdmVyc2lvbiBpbmRleCB1bmlxdWUgZm9yIHRoZSBmaWxlIHdoaWNoIGlzIHVzZWQgaW4gdGhlIHZlcnNpb24gc3ltYm9sIHRhYmxlLgotICAgICAgICBpZiAobmR4IDwgMikgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMubVZlck5lZWRBcnJbbmR4XTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSAyOyBpIDwgdGhpcy5tVmVyTmVlZEVudHJ5Q250ICsgMjsgaSsrKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHRoaXMubVZlck5lZWRBcnJbaV0udm5fY250OyBqKyspIHsKLSAgICAgICAgICAgICAgICBpZiAodGhpcy5tVmVyTmVlZEFycltpXS52bl92ZXJuYXV4W2pdLnZuYV9vdGhlciA9PSBuZHgpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubVZlck5lZWRBcnJbaV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihTdHJpbmcuZm9ybWF0KCJubyBWZXJOZWVkIGZvdW5kOiAlZCIsIG5keCkpOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFZlck5lZWRbXSBnZXRWZXJOZWVkQXJyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG1WZXJOZWVkQXJyID09IG51bGwpIHsKLSAgICAgICAgICAgIG1WZXJOZWVkQXJyID0gbmV3IFZlck5lZWRbbVZlck5lZWRFbnRyeUNudCArIDJdOwotCi0gICAgICAgICAgICAvLyBTSFRfR05VX3ZlcnN5bSAwOiBsb2NhbAotICAgICAgICAgICAgbVZlck5lZWRBcnJbMF0gPSBuZXcgVmVyTmVlZCgiKmxvY2FsKiIsICIqbG9jYWwqIiwgMCk7Ci0gICAgICAgICAgICAvLyBIVF9HTlVfdmVyc3ltIDE6IGdsb2JhbAotICAgICAgICAgICAgbVZlck5lZWRBcnJbMV0gPSBuZXcgVmVyTmVlZCgiKmdsb2JhbCoiLCAiKmdsb2JhbCoiLCAxKTsKLQotICAgICAgICAgICAgbG9uZyBpZHggPSBtVmVyTmVlZFRhYk9mZnNldDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAyOyBpIDwgbVZlck5lZWRFbnRyeUNudCArIDI7IGkrKykgewotICAgICAgICAgICAgICAgIG1GaWxlLnNlZWsoaWR4KTsKLSAgICAgICAgICAgICAgICBtVmVyTmVlZEFycltpXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVmVyTmVlZChyZWFkSGFsZigpLCByZWFkSGFsZigpLCByZWFkV29yZCgpLCByZWFkV29yZCgpLCByZWFkV29yZCgpKTsKLSAgICAgICAgICAgICAgICBtVmVyTmVlZEFycltpXS52bl9maWxlX25hbWUgPSByZWFkRHluU3RyVGFiRW50cnkobVZlck5lZWRBcnJbaV0udm5fZmlsZSkudG9Mb3dlckNhc2UoKTsKLQotICAgICAgICAgICAgICAgIG1WZXJOZWVkQXJyW2ldLnZuX3Zlcm5hdXggPSBuZXcgVmVyTkF1eFttVmVyTmVlZEFycltpXS52bl9jbnRdOwotICAgICAgICAgICAgICAgIGxvbmcgaWR4QXV4ID0gaWR4ICsgbVZlck5lZWRBcnJbaV0udm5fYXV4OwotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbVZlck5lZWRBcnJbaV0udm5fY250OyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgbUZpbGUuc2VlayhpZHhBdXgpOwotICAgICAgICAgICAgICAgICAgICBtVmVyTmVlZEFycltpXS52bl92ZXJuYXV4W2pdID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVmVyTkF1eChyZWFkV29yZCgpLCByZWFkSGFsZigpLCByZWFkSGFsZigpLCByZWFkV29yZCgpLCByZWFkV29yZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgbVZlck5lZWRBcnJbaV0udm5fdmVybmF1eFtqXS52bmFfbGliX25hbWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWREeW5TdHJUYWJFbnRyeShtVmVyTmVlZEFycltpXS52bl92ZXJuYXV4W2pdLnZuYV9uYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWR4QXV4ICs9IG1WZXJOZWVkQXJyW2ldLnZuX3Zlcm5hdXhbal0udm5hX25leHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlkeCArPSBtVmVyTmVlZEFycltpXS52bl9uZXh0OwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihtVmVyTmVlZEFycltpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbVZlck5lZWRBcnI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBWZXJEZWZbXSBnZXRWZXJEZWYoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAobVZlckRlZkFyciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtVmVyRGVmQXJyID0gbmV3IFZlckRlZlttVmVyRGVmRW50cnlDbnQgKyAyXTsKLQotICAgICAgICAgICAgLy8gU0hUX0dOVV92ZXJzeW0gMDogbG9jYWwKLSAgICAgICAgICAgIG1WZXJEZWZBcnJbMF0gPSBuZXcgVmVyRGVmKCIqbG9jYWwqIik7Ci0gICAgICAgICAgICAvLyBIVF9HTlVfdmVyc3ltIDE6IGdsb2JhbAotICAgICAgICAgICAgbVZlckRlZkFyclsxXSA9IG5ldyBWZXJEZWYoIipnbG9iYWwqIik7Ci0KLSAgICAgICAgICAgIGxvbmcgaWR4ID0gbVZlckRlZlRhYk9mZnNldDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAyOyBpIDwgbVZlckRlZkVudHJ5Q250ICsgMjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbUZpbGUuc2VlayhpZHgpOwotICAgICAgICAgICAgICAgIG1WZXJEZWZBcnJbaV0gPQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFZlckRlZigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEhhbGYoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEhhbGYoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEhhbGYoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEhhbGYoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZFdvcmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZFdvcmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZFdvcmQoKSk7Ci0KLSAgICAgICAgICAgICAgICBtVmVyRGVmQXJyW2ldLnZkX3ZlcmRhdXggPSBuZXcgVmVyREF1eFttVmVyRGVmQXJyW2ldLnZkX2NudF07Ci0gICAgICAgICAgICAgICAgbG9uZyBpZHhBdXggPSBpZHggKyBtVmVyRGVmQXJyW2ldLnZkX2F1eDsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG1WZXJEZWZBcnJbaV0udmRfY250OyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgbUZpbGUuc2VlayhpZHhBdXgpOwotICAgICAgICAgICAgICAgICAgICBtVmVyRGVmQXJyW2ldLnZkX3ZlcmRhdXhbal0gPSBuZXcgVmVyREF1eChyZWFkV29yZCgpLCByZWFkV29yZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgbVZlckRlZkFycltpXS52ZF92ZXJkYXV4W2pdLnZkYV9saWJfbmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZER5blN0clRhYkVudHJ5KG1WZXJEZWZBcnJbaV0udmRfdmVyZGF1eFtqXS52ZGFfbmFtZSkudG9Mb3dlckNhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgaWR4QXV4ICs9IG1WZXJEZWZBcnJbaV0udmRfdmVyZGF1eFtqXS52ZGFfbmV4dDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWR4ICs9IG1WZXJEZWZBcnJbaV0udmRfbmV4dDsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obVZlckRlZkFycltpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1WZXJEZWZBcnI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgcmVhZEhhbGYoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gKGludCkgcmVhZFgoMik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBsb25nIHJlYWRXb3JkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHJlYWRYKDQpOwotICAgIH0KLQotICAgIHByaXZhdGUgbG9uZyByZWFkT2ZmKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHJlYWRYKG1BZGRyU2l6ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBsb25nIHJlYWRBZGRyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHJlYWRYKG1BZGRyU2l6ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBsb25nIHJlYWRYKGludCBieXRlQ291bnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIG1GaWxlLnJlYWRGdWxseShtQnVmZmVyLCAwLCBieXRlQ291bnQpOwotCi0gICAgICAgIGludCBhbnN3ZXIgPSAwOwotICAgICAgICBpZiAobUVuZGlhbiA9PSBFTEZEQVRBMkxTQikgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IGJ5dGVDb3VudCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgYW5zd2VyID0gKGFuc3dlciA8PCA4KSB8IChtQnVmZmVyW2ldICYgMHhmZik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgTiA9IGJ5dGVDb3VudCAtIDE7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSBOOyArK2kpIHsKLSAgICAgICAgICAgICAgICBhbnN3ZXIgPSAoYW5zd2VyIDw8IDgpIHwgKG1CdWZmZXJbaV0gJiAweGZmKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBhbnN3ZXI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgcmVhZFN0cmluZyhsb25nIG9mZnNldCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgbG9uZyBvcmlnaW5hbE9mZnNldCA9IG1GaWxlLmdldEZpbGVQb2ludGVyKCk7Ci0gICAgICAgIG1GaWxlLnNlZWsob2Zmc2V0KTsKLSAgICAgICAgbUZpbGUucmVhZEZ1bGx5KG1CdWZmZXIsIDAsIChpbnQpIE1hdGgubWluKG1CdWZmZXIubGVuZ3RoLCBtRmlsZS5sZW5ndGgoKSAtIG9mZnNldCkpOwotICAgICAgICBtRmlsZS5zZWVrKG9yaWdpbmFsT2Zmc2V0KTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1CdWZmZXIubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgIGlmIChtQnVmZmVyW2ldID09IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhtQnVmZmVyLCAwLCBpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IHJlYWRCeXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG1GaWxlLnJlYWQoKSAmIDB4ZmY7Ci0gICAgfQotCi0gICAgcHVibGljIFN5bWJvbCBnZXRTeW1ib2woU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgaWYgKG1TeW1ib2xzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbVN5bUFyciA9IG5ldyBTeW1ib2xbbVN5bUVudENudF07Ci0gICAgICAgICAgICAgICAgbVN5bWJvbHMgPQotICAgICAgICAgICAgICAgICAgICAgICAgcmVhZFN5bWJvbFRhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3ltQXJyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0clRhYk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0clRhYlNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TeW1UYWJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TeW1UYWJTaXplKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbVN5bWJvbHMuZ2V0KG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTeW1ib2wgZ2V0RHluYW1pY1N5bWJvbChTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG1EeW5hbWljU3ltYm9scyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGludFtdIHZlclNteUFyciA9IHRoaXMuZ2V0VmVyU3ltKCk7Ci0gICAgICAgICAgICAgICAgVmVyTmVlZFtdIHZlck5lZWRBcnIgPSB0aGlzLmdldFZlck5lZWRBcnIoKTsKLSAgICAgICAgICAgICAgICBWZXJEZWZbXSB2ZXJEZWZBcnIgPSB0aGlzLmdldFZlckRlZigpOwotICAgICAgICAgICAgICAgIG1EeW5TeW1BcnIgPSBuZXcgU3ltYm9sW21EeW5TeW1FbnRDbnRdOwotICAgICAgICAgICAgICAgIG1EeW5hbWljU3ltYm9scyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWFkU3ltYm9sVGFibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EeW5TeW1BcnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EeW5TdHJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EeW5TdHJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRHluU3ltT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRHluU3ltU2l6ZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1EeW5hbWljU3ltYm9scy5nZXQobmFtZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvUmVwb3J0TG9nLmphdmEgYi9jb21tb24vdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9SZXBvcnRMb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhiMWQ3Ni4uMDAwMDAwMAotLS0gYS9jb21tb24vdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9SZXBvcnRMb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsOwotCi1pbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKLWltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJGYWN0b3J5OwotaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFNlcmlhbGl6ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgdG8gYWRkIHJlc3VsdHMgdG8gdGhlIHJlcG9ydC4KLSAqLwotcHVibGljIGNsYXNzIFJlcG9ydExvZyBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5DT0RJTkcgPSAiVVRGLTgiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFID0gIm9yZy5reG1sMi5pby5LWG1sUGFyc2VyLG9yZy5reG1sMi5pby5LWG1sU2VyaWFsaXplciI7Ci0KLSAgICAvLyBYTUwgY29uc3RhbnRzCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVFJJQ19UQUcgPSAiTWV0cmljIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9BVFRSID0gIm1lc3NhZ2UiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQ09SRVRZUEVfQVRUUiA9ICJzY29yZV90eXBlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NPUkVVTklUX0FUVFIgPSAic2NvcmVfdW5pdCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNPVVJDRV9BVFRSID0gInNvdXJjZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNVTU1BUllfVEFHID0gIlN1bW1hcnkiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9UQUcgPSAiVmFsdWUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX05BTUUgPSAiZGVmYXVsdCI7Ci0KLSAgICBwcm90ZWN0ZWQgTWV0cmljIG1TdW1tYXJ5OwotICAgIHByb3RlY3RlZCBTdHJpbmcgbVJlcG9ydExvZ05hbWU7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBtU3RyZWFtTmFtZTsKLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWV0cmljIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9TT1VSQ0VfTEVOR1RIID0gMjAwOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX01FU1NBR0VfTEVOR1RIID0gMjAwOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX05VTV9WQUxVRVMgPSAxMDAwOwotICAgICAgICBTdHJpbmcgbVNvdXJjZTsKLSAgICAgICAgU3RyaW5nIG1NZXNzYWdlOwotICAgICAgICBkb3VibGVbXSBtVmFsdWVzOwotICAgICAgICBSZXN1bHRUeXBlIG1UeXBlOwotICAgICAgICBSZXN1bHRVbml0IG1Vbml0OwotCi0gICAgICAgIE1ldHJpYyhTdHJpbmcgc291cmNlLCBTdHJpbmcgbWVzc2FnZSwgZG91YmxlIHZhbHVlLCBSZXN1bHRUeXBlIHR5cGUsIFJlc3VsdFVuaXQgdW5pdCkgewotICAgICAgICAgICAgdGhpcyhzb3VyY2UsIG1lc3NhZ2UsIG5ldyBkb3VibGVbXSB7IHZhbHVlIH0sIHR5cGUsIHVuaXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYSBtZXRyaWMgYXJyYXkgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIHJlcG9ydC4gRWFjaCBvYmplY3QgaGFzIGEgbWVzc2FnZQotICAgICAgICAgKiBkZXNjcmliaW5nIGl0cyB2YWx1ZXMgYW5kIGVudW1zIHRvIGludGVycHJldCB0aGVtLiBJbiBhZGRpdGlvbiwgZWFjaCByZXN1bHQgYWxzbyBpbmNsdWRlcwotICAgICAgICAgKiBjbGFzcywgbWV0aG9kIGFuZCBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdGVzdCB3aGljaCBhZGRlZCB0aGlzIHJlc3VsdCB3aGljaCBpcwotICAgICAgICAgKiBjb2xsZWN0ZWQgYnkgbG9va2luZyBhdCB0aGUgc3RhY2sgdHJhY2UuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBtZXNzYWdlIEEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIHZhbHVlcwotICAgICAgICAgKiBAcGFyYW0gdmFsdWVzIEFuIGFycmF5IG9mIHRoZSB2YWx1ZXMKLSAgICAgICAgICogQHBhcmFtIHR5cGUgUmVwcmVzZW50cyBob3cgdG8gaW50ZXJwcmV0IHRoZSB2YWx1ZXMgKGVnLiBBIGxvd2VyIHNjb3JlIGlzIGJldHRlcikKLSAgICAgICAgICogQHBhcmFtIHVuaXQgUmVwcmVzZW50cyB0aGUgdW5pdCBpbiB3aGljaCB0aGUgdmFsdWVzIGFyZSAoZWcuIE1pbGxpc2Vjb25kcykKLSAgICAgICAgICovCi0gICAgICAgIE1ldHJpYyhTdHJpbmcgc291cmNlLCBTdHJpbmcgbWVzc2FnZSwgZG91YmxlW10gdmFsdWVzLCBSZXN1bHRUeXBlIHR5cGUsIFJlc3VsdFVuaXQgdW5pdCkgewotICAgICAgICAgICAgaW50IHNvdXJjZUxlbmd0aCA9IHNvdXJjZS5sZW5ndGgoKTsKLSAgICAgICAgICAgIGlmIChzb3VyY2VMZW5ndGggPiBNQVhfU09VUkNFX0xFTkdUSCkgewotICAgICAgICAgICAgICAgIC8vIFN1YnN0cmluZyB0byB0aGUgZW5kCi0gICAgICAgICAgICAgICAgbVNvdXJjZSA9IHNvdXJjZS5zdWJzdHJpbmcoc291cmNlTGVuZ3RoIC0gTUFYX1NPVVJDRV9MRU5HVEgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtU291cmNlID0gc291cmNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IG1lc3NhZ2VMZW5ndGggPSBtZXNzYWdlLmxlbmd0aCgpOwotICAgICAgICAgICAgaWYgKG1lc3NhZ2VMZW5ndGggPiBNQVhfTUVTU0FHRV9MRU5HVEgpIHsKLSAgICAgICAgICAgICAgICAvLyBTdWJzdHJpbmcgZnJvbSB0aGUgc3RhcnQKLSAgICAgICAgICAgICAgICBtTWVzc2FnZSA9IG1lc3NhZ2Uuc3Vic3RyaW5nKDAsIE1BWF9NRVNTQUdFX0xFTkdUSCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1NZXNzYWdlID0gbWVzc2FnZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCB2YWx1ZXNMZW5ndGggPSB2YWx1ZXMubGVuZ3RoOwotICAgICAgICAgICAgaWYgKHZhbHVlc0xlbmd0aCA+IE1BWF9OVU1fVkFMVUVTKSB7Ci0gICAgICAgICAgICAgICAgLy8gU3ViYXJyYXkgZnJvbSB0aGUgc3RhcnQKLSAgICAgICAgICAgICAgICBtVmFsdWVzID0gQXJyYXlzLmNvcHlPZih2YWx1ZXMsIE1BWF9OVU1fVkFMVUVTKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVZhbHVlcyA9IHZhbHVlczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1UeXBlID0gdHlwZTsKLSAgICAgICAgICAgIG1Vbml0ID0gdW5pdDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U291cmNlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Tb3VyY2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbU1lc3NhZ2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgZG91YmxlW10gZ2V0VmFsdWVzKCkgewotICAgICAgICAgICAgcmV0dXJuIG1WYWx1ZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgUmVzdWx0VHlwZSBnZXRUeXBlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1UeXBlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFJlc3VsdFVuaXQgZ2V0VW5pdCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtVW5pdDsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgc2VyaWFsaXplKFhtbFNlcmlhbGl6ZXIgc2VyaWFsaXplcikKLSAgICAgICAgICAgICAgICB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHNlcmlhbGl6ZXIuc3RhcnRUYWcobnVsbCwgTUVUUklDX1RBRyk7Ci0gICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZShudWxsLCBTT1VSQ0VfQVRUUiwgZ2V0U291cmNlKCkpOwotICAgICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUobnVsbCwgTUVTU0FHRV9BVFRSLCBnZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUobnVsbCwgU0NPUkVUWVBFX0FUVFIsIGdldFR5cGUoKS50b1JlcG9ydFN0cmluZygpKTsKLSAgICAgICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlKG51bGwsIFNDT1JFVU5JVF9BVFRSLCBnZXRVbml0KCkudG9SZXBvcnRTdHJpbmcoKSk7Ci0gICAgICAgICAgICBmb3IgKGRvdWJsZSBkIDogZ2V0VmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICBzZXJpYWxpemVyLnN0YXJ0VGFnKG51bGwsIFZBTFVFX1RBRyk7Ci0gICAgICAgICAgICAgICAgc2VyaWFsaXplci50ZXh0KERvdWJsZS50b1N0cmluZyhkKSk7Ci0gICAgICAgICAgICAgICAgc2VyaWFsaXplci5lbmRUYWcobnVsbCwgVkFMVUVfVEFHKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlcmlhbGl6ZXIuZW5kVGFnKG51bGwsIE1FVFJJQ19UQUcpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdGljIE1ldHJpYyBwYXJzZShYbWxQdWxsUGFyc2VyIHBhcnNlcikKLSAgICAgICAgICAgICAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgcGFyc2VyLnJlcXVpcmUoWG1sUHVsbFBhcnNlci5TVEFSVF9UQUcsIG51bGwsIE1FVFJJQ19UQUcpOwotICAgICAgICAgICAgU3RyaW5nIHNvdXJjZSA9IHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCBTT1VSQ0VfQVRUUik7Ci0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCBNRVNTQUdFX0FUVFIpOwotICAgICAgICAgICAgUmVzdWx0VHlwZSB0eXBlID0gUmVzdWx0VHlwZS5wYXJzZVJlcG9ydFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsIFNDT1JFVFlQRV9BVFRSKSk7Ci0gICAgICAgICAgICBSZXN1bHRVbml0IHVuaXQgPSBSZXN1bHRVbml0LnBhcnNlUmVwb3J0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgU0NPUkVVTklUX0FUVFIpKTsKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiB2YWx1ZXNMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICB3aGlsZSAocGFyc2VyLm5leHRUYWcoKSA9PSBYbWxQdWxsUGFyc2VyLlNUQVJUX1RBRykgewotICAgICAgICAgICAgICAgIHBhcnNlci5yZXF1aXJlKFhtbFB1bGxQYXJzZXIuU1RBUlRfVEFHLCBudWxsLCBWQUxVRV9UQUcpOwotICAgICAgICAgICAgICAgIHZhbHVlc0xpc3QuYWRkKHBhcnNlci5uZXh0VGV4dCgpKTsKLSAgICAgICAgICAgICAgICBwYXJzZXIucmVxdWlyZShYbWxQdWxsUGFyc2VyLkVORF9UQUcsIG51bGwsIFZBTFVFX1RBRyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgbGVuZ3RoID0gdmFsdWVzTGlzdC5zaXplKCk7Ci0gICAgICAgICAgICBkb3VibGVbXSB2YWx1ZXMgPSBuZXcgZG91YmxlW2xlbmd0aF07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgdmFsdWVzW2ldID0gRG91YmxlLnBhcnNlRG91YmxlKHZhbHVlc0xpc3QuZ2V0KGkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBhcnNlci5yZXF1aXJlKFhtbFB1bGxQYXJzZXIuRU5EX1RBRywgbnVsbCwgTUVUUklDX1RBRyk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IE1ldHJpYyhzb3VyY2UsIG1lc3NhZ2UsIHZhbHVlcywgdHlwZSwgdW5pdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVwb3J0TG9nKCkgewotICAgICAgICBtUmVwb3J0TG9nTmFtZSA9IERFRkFVTFRfTkFNRTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVwb3J0TG9nKFN0cmluZyByZXBvcnRMb2dOYW1lLCBTdHJpbmcgc3RyZWFtTmFtZSkgewotICAgICAgICBtUmVwb3J0TG9nTmFtZSA9IHJlcG9ydExvZ05hbWU7Ci0gICAgICAgIG1TdHJlYW1OYW1lID0gc3RyZWFtTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgZG91YmxlIGFycmF5IG9mIG1ldHJpY3MgdG8gdGhlIHJlcG9ydC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRWYWx1ZXMoU3RyaW5nIG1lc3NhZ2UsIGRvdWJsZVtdIHZhbHVlcywgUmVzdWx0VHlwZSB0eXBlLCBSZXN1bHRVbml0IHVuaXQpIHsKLSAgICAgICAgLy8gRG8gbm90aGluZy4gU3ViY2xhc3NlcyBtYXkgaW1wbGVtZW50IHVzaW5nIEluZm9TdG9yZSB0byB3cml0ZSBtZXRyaWNzIHRvIGZpbGVzLgotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBkb3VibGUgYXJyYXkgb2YgbWV0cmljcyB0byB0aGUgcmVwb3J0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFZhbHVlcyhTdHJpbmcgc291cmNlLCBTdHJpbmcgbWVzc2FnZSwgZG91YmxlW10gdmFsdWVzLCBSZXN1bHRUeXBlIHR5cGUsCi0gICAgICAgICAgICBSZXN1bHRVbml0IHVuaXQpIHsKLSAgICAgICAgLy8gRG8gbm90aGluZy4gU3ViY2xhc3NlcyBtYXkgaW1wbGVtZW50IHVzaW5nIEluZm9TdG9yZSB0byB3cml0ZSBtZXRyaWNzIHRvIGZpbGVzLgotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBkb3VibGUgbWV0cmljIHRvIHRoZSByZXBvcnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkVmFsdWUoU3RyaW5nIG1lc3NhZ2UsIGRvdWJsZSB2YWx1ZSwgUmVzdWx0VHlwZSB0eXBlLCBSZXN1bHRVbml0IHVuaXQpIHsKLSAgICAgICAgLy8gRG8gbm90aGluZy4gU3ViY2xhc3NlcyBtYXkgaW1wbGVtZW50IHVzaW5nIEluZm9TdG9yZSB0byB3cml0ZSBtZXRyaWNzIHRvIGZpbGVzLgotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBkb3VibGUgbWV0cmljIHRvIHRoZSByZXBvcnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkVmFsdWUoU3RyaW5nIHNvdXJjZSwgU3RyaW5nIG1lc3NhZ2UsIGRvdWJsZSB2YWx1ZSwgUmVzdWx0VHlwZSB0eXBlLAotICAgICAgICAgICAgUmVzdWx0VW5pdCB1bml0KSB7Ci0gICAgICAgIC8vIERvIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IGltcGxlbWVudCB1c2luZyBJbmZvU3RvcmUgdG8gd3JpdGUgbWV0cmljcyB0byBmaWxlcy4KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGFuIGludCBtZXRyaWMgdG8gdGhlIHJlcG9ydC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRWYWx1ZShTdHJpbmcgbWVzc2FnZSwgaW50IHZhbHVlLCBSZXN1bHRUeXBlIHR5cGUsIFJlc3VsdFVuaXQgdW5pdCkgewotICAgICAgICAvLyBEbyBub3RoaW5nLiBTdWJjbGFzc2VzIG1heSBpbXBsZW1lbnQgdXNpbmcgSW5mb1N0b3JlIHRvIHdyaXRlIG1ldHJpY3MgdG8gZmlsZXMuCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIGxvbmcgbWV0cmljIHRvIHRoZSByZXBvcnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkVmFsdWUoU3RyaW5nIG1lc3NhZ2UsIGxvbmcgdmFsdWUsIFJlc3VsdFR5cGUgdHlwZSwgUmVzdWx0VW5pdCB1bml0KSB7Ci0gICAgICAgIC8vIERvIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IGltcGxlbWVudCB1c2luZyBJbmZvU3RvcmUgdG8gd3JpdGUgbWV0cmljcyB0byBmaWxlcy4KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgZmxvYXQgbWV0cmljIHRvIHRoZSByZXBvcnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkVmFsdWUoU3RyaW5nIG1lc3NhZ2UsIGZsb2F0IHZhbHVlLCBSZXN1bHRUeXBlIHR5cGUsIFJlc3VsdFVuaXQgdW5pdCkgewotICAgICAgICAvLyBEbyBub3RoaW5nLiBTdWJjbGFzc2VzIG1heSBpbXBsZW1lbnQgdXNpbmcgSW5mb1N0b3JlIHRvIHdyaXRlIG1ldHJpY3MgdG8gZmlsZXMuCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIGJvb2xlYW4gbWV0cmljIHRvIHRoZSByZXBvcnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkVmFsdWUoU3RyaW5nIG1lc3NhZ2UsIGJvb2xlYW4gdmFsdWUsIFJlc3VsdFR5cGUgdHlwZSwgUmVzdWx0VW5pdCB1bml0KSB7Ci0gICAgICAgIC8vIERvIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IGltcGxlbWVudCB1c2luZyBJbmZvU3RvcmUgdG8gd3JpdGUgbWV0cmljcyB0byBmaWxlcy4KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgU3RyaW5nIG1ldHJpYyB0byB0aGUgcmVwb3J0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFZhbHVlKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgdmFsdWUsIFJlc3VsdFR5cGUgdHlwZSwgUmVzdWx0VW5pdCB1bml0KSB7Ci0gICAgICAgIC8vIERvIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IGltcGxlbWVudCB1c2luZyBJbmZvU3RvcmUgdG8gd3JpdGUgbWV0cmljcyB0byBmaWxlcy4KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGFuIGludCBhcnJheSBvZiBtZXRyaWNzIHRvIHRoZSByZXBvcnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkVmFsdWVzKFN0cmluZyBtZXNzYWdlLCBpbnRbXSB2YWx1ZXMsIFJlc3VsdFR5cGUgdHlwZSwgUmVzdWx0VW5pdCB1bml0KSB7Ci0gICAgICAgIC8vIERvIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IGltcGxlbWVudCB1c2luZyBJbmZvU3RvcmUgdG8gd3JpdGUgbWV0cmljcyB0byBmaWxlcy4KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgbG9uZyBhcnJheSBvZiBtZXRyaWNzIHRvIHRoZSByZXBvcnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkVmFsdWVzKFN0cmluZyBtZXNzYWdlLCBsb25nW10gdmFsdWVzLCBSZXN1bHRUeXBlIHR5cGUsIFJlc3VsdFVuaXQgdW5pdCkgewotICAgICAgICAvLyBEbyBub3RoaW5nLiBTdWJjbGFzc2VzIG1heSBpbXBsZW1lbnQgdXNpbmcgSW5mb1N0b3JlIHRvIHdyaXRlIG1ldHJpY3MgdG8gZmlsZXMuCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIGZsb2F0IGFycmF5IG9mIG1ldHJpY3MgdG8gdGhlIHJlcG9ydC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRWYWx1ZXMoU3RyaW5nIG1lc3NhZ2UsIGZsb2F0W10gdmFsdWVzLCBSZXN1bHRUeXBlIHR5cGUsIFJlc3VsdFVuaXQgdW5pdCkgewotICAgICAgICAvLyBEbyBub3RoaW5nLiBTdWJjbGFzc2VzIG1heSBpbXBsZW1lbnQgdXNpbmcgSW5mb1N0b3JlIHRvIHdyaXRlIG1ldHJpY3MgdG8gZmlsZXMuCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIGJvb2xlYW4gYXJyYXkgb2YgbWV0cmljcyB0byB0aGUgcmVwb3J0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFZhbHVlcyhTdHJpbmcgbWVzc2FnZSwgYm9vbGVhbltdIHZhbHVlcywgUmVzdWx0VHlwZSB0eXBlLCBSZXN1bHRVbml0IHVuaXQpIHsKLSAgICAgICAgLy8gRG8gbm90aGluZy4gU3ViY2xhc3NlcyBtYXkgaW1wbGVtZW50IHVzaW5nIEluZm9TdG9yZSB0byB3cml0ZSBtZXRyaWNzIHRvIGZpbGVzLgotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBTdHJpbmcgTGlzdCBvZiBtZXRyaWNzIHRvIHRoZSByZXBvcnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkVmFsdWVzKFN0cmluZyBtZXNzYWdlLCBMaXN0PFN0cmluZz4gdmFsdWVzLCBSZXN1bHRUeXBlIHR5cGUsIFJlc3VsdFVuaXQgdW5pdCkgewotICAgICAgICAvLyBEbyBub3RoaW5nLiBTdWJjbGFzc2VzIG1heSBpbXBsZW1lbnQgdXNpbmcgSW5mb1N0b3JlIHRvIHdyaXRlIG1ldHJpY3MgdG8gZmlsZXMuCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGVsZW0KLSAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovIHZvaWQgc2V0U3VtbWFyeShNZXRyaWMgZWxlbSkgewotICAgICAgICBtU3VtbWFyeSA9IGVsZW07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZG91YmxlIG1ldHJpYyBzdW1tYXJ5IG9mIHRoZSByZXBvcnQuCi0gICAgICoKLSAgICAgKiBOT1RFOiBtZXNzYWdlcyBvdmVyIHtAdmFsdWUgTWV0cmljI01BWF9NRVNTQUdFX0xFTkdUSH0gY2hhcnMgd2lsbCBiZSB0cmltbWVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFN1bW1hcnkoU3RyaW5nIG1lc3NhZ2UsIGRvdWJsZSB2YWx1ZSwgUmVzdWx0VHlwZSB0eXBlLCBSZXN1bHRVbml0IHVuaXQpIHsKLSAgICAgICAgc2V0U3VtbWFyeShuZXcgTWV0cmljKFN0YWNrdHJhY2UuZ2V0VGVzdENhbGxlckNsYXNzTWV0aG9kTmFtZUxpbmVOdW1iZXIoKSwgbWVzc2FnZSwgdmFsdWUsCi0gICAgICAgICAgICAgICAgdHlwZSwgdW5pdCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXRyaWMgZ2V0U3VtbWFyeSgpIHsKLSAgICAgICAgcmV0dXJuIG1TdW1tYXJ5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlcmlhbGl6ZXMgYSBnaXZlbiB7QGxpbmsgUmVwb3J0TG9nfSB0byBhIFN0cmluZy4KLSAgICAgKiBAdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcmlhbGl6ZShSZXBvcnRMb2cgcmVwb3J0bG9nKSB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwKLSAgICAgICAgICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBieXRlQXJyYXlPdXRwdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIFhtbFNlcmlhbGl6ZXIgc2VyaWFsaXplciA9IFhtbFB1bGxQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKFRZUEUsIG51bGwpLm5ld1NlcmlhbGl6ZXIoKTsKLSAgICAgICAgc2VyaWFsaXplci5zZXRPdXRwdXQoYnl0ZUFycmF5T3V0cHV0U3RyZWFtLCBFTkNPRElORyk7Ci0gICAgICAgIHNlcmlhbGl6ZXIuc3RhcnREb2N1bWVudChFTkNPRElORywgdHJ1ZSk7Ci0gICAgICAgIHNlcmlhbGl6ZXIuc2V0RmVhdHVyZSgiaHR0cDovL3htbHB1bGwub3JnL3YxL2RvYy9mZWF0dXJlcy5odG1sI2luZGVudC1vdXRwdXQiLCB0cnVlKTsKLSAgICAgICAgc2VyaWFsaXplKHNlcmlhbGl6ZXIsIHJlcG9ydGxvZyk7Ci0gICAgICAgIHNlcmlhbGl6ZXIuZW5kRG9jdW1lbnQoKTsKLSAgICAgICAgcmV0dXJuIGJ5dGVBcnJheU91dHB1dFN0cmVhbS50b1N0cmluZyhFTkNPRElORyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VyaWFsaXplcyBhIGdpdmVuIHtAbGluayBSZXBvcnRMb2d9IHRvIFhNTC4KLSAgICAgKiBAcGFyYW0gc2VyaWFsaXplcgotICAgICAqIEBwYXJhbSByZXBvcnRMb2cKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNlcmlhbGl6ZShYbWxTZXJpYWxpemVyIHNlcmlhbGl6ZXIsIFJlcG9ydExvZyByZXBvcnRMb2cpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAocmVwb3J0TG9nID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1ldHJpY3MgcmVwb3J0cyB3YXMgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIE1ldHJpYyBzdW1tYXJ5ID0gcmVwb3J0TG9nLmdldFN1bW1hcnkoKTsKLSAgICAgICAgLy8gU3VtbWFyeSBpcyBvcHRpb25hbC4gRGV0YWlscyBhcmUgbm90IGluY2x1ZGVkIGluIHJlc3VsdCByZXBvcnQuCi0gICAgICAgIGlmIChzdW1tYXJ5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNlcmlhbGl6ZXIuc3RhcnRUYWcobnVsbCwgU1VNTUFSWV9UQUcpOwotICAgICAgICAgICAgc3VtbWFyeS5zZXJpYWxpemUoc2VyaWFsaXplcik7Ci0gICAgICAgICAgICBzZXJpYWxpemVyLmVuZFRhZyhudWxsLCBTVU1NQVJZX1RBRyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZXMgYSB7QGxpbmsgUmVwb3J0TG9nfSBmcm9tIHRoZSBnaXZlbiBzdHJpbmcuCi0gICAgICogQHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUmVwb3J0TG9nIHBhcnNlKFN0cmluZyByZXN1bHQpIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCl7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNZXRyaWNzIHN0cmluZyB3YXMgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXN1bHQudHJpbSgpLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgLy8gRW1wdHkgcmVwb3J0LgotICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXBvcnRMb2coKTsKLSAgICAgICAgfQotICAgICAgICBYbWxQdWxsUGFyc2VyRmFjdG9yeSBmYWN0b3J5ID0gWG1sUHVsbFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgWG1sUHVsbFBhcnNlciBwYXJzZXIgPSBmYWN0b3J5Lm5ld1B1bGxQYXJzZXIoKTsKLSAgICAgICAgcGFyc2VyLnNldElucHV0KG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShyZXN1bHQuZ2V0Qnl0ZXMoRU5DT0RJTkcpKSwgRU5DT0RJTkcpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcGFyc2VyLm5leHRUYWcoKTsKLSAgICAgICAgfSBjYXRjaCAoWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBFbXB0eSBSZXBvcnQuCi0gICAgICAgICAgICByZXR1cm4gbmV3IFJlcG9ydExvZygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwYXJzZShwYXJzZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlcyBhIHtAbGluayBSZXBvcnRMb2d9IGZyb20gdGhlIGdpdmVuIFhNTCBwYXJzZXIuCi0gICAgICogQHBhcmFtIHBhcnNlcgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFJlcG9ydExvZyBwYXJzZShYbWxQdWxsUGFyc2VyIHBhcnNlcikgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcGFyc2VyLnJlcXVpcmUoWG1sUHVsbFBhcnNlci5TVEFSVF9UQUcsIG51bGwsIFNVTU1BUllfVEFHKTsKLSAgICAgICAgcGFyc2VyLm5leHRUYWcoKTsKLSAgICAgICAgUmVwb3J0TG9nIHJlcG9ydCA9IG5ldyBSZXBvcnRMb2coKTsKLSAgICAgICAgcmVwb3J0LnNldFN1bW1hcnkoTWV0cmljLnBhcnNlKHBhcnNlcikpOwotICAgICAgICBwYXJzZXIubmV4dFRhZygpOwotICAgICAgICBwYXJzZXIucmVxdWlyZShYbWxQdWxsUGFyc2VyLkVORF9UQUcsIG51bGwsIFNVTU1BUllfVEFHKTsKLSAgICAgICAgcmV0dXJuIHJlcG9ydDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9SZXN1bHRIYW5kbGVyLmphdmEgYi9jb21tb24vdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9SZXN1bHRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYTZlMDUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvUmVzdWx0SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTc2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DaGVja3N1bVJlcG9ydGVyLkNoZWNrc3VtVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLQotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKLQotaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7Ci1pbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRmFjdG9yeTsKLWltcG9ydCBvcmcueG1scHVsbC52MS5YbWxTZXJpYWxpemVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOwotaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZVN5c3RlbXM7Ci1pbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKLWltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7Ci1pbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOwotLyoqCi0gKiBIYW5kbGVzIGNvbnZlcnNpb24gb2YgcmVzdWx0cyB0by9mcm9tIGZpbGVzLgotICovCi1wdWJsaWMgY2xhc3MgUmVzdWx0SGFuZGxlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5DT0RJTkcgPSAiVVRGLTgiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFID0gIm9yZy5reG1sMi5pby5LWG1sUGFyc2VyLG9yZy5reG1sMi5pby5LWG1sU2VyaWFsaXplciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5TID0gbnVsbDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVUxUX0ZJTEVfVkVSU0lPTiA9ICI1LjAiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUkVTVUxUX0ZJTEVfTkFNRSA9ICJ0ZXN0X3Jlc3VsdC54bWwiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBSUxVUkVfUkVQT1JUX05BTUUgPSAidGVzdF9yZXN1bHRfZmFpbHVyZXMuaHRtbCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZBSUxVUkVfWFNMX0ZJTEVfTkFNRSA9ICJjb21wYXRpYmlsaXR5X2ZhaWx1cmVzLnhzbCI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFJFU1VMVF9SRVNPVVJDRVMgPSB7Ci0gICAgICAgICJjb21wYXRpYmlsaXR5X3Jlc3VsdC5jc3MiLAotICAgICAgICAiY29tcGF0aWJpbGl0eV9yZXN1bHQueHNkIiwKLSAgICAgICAgImNvbXBhdGliaWxpdHlfcmVzdWx0LnhzbCIsCi0gICAgICAgICJsb2dvLnBuZyIKLSAgICB9OwotCi0gICAgLy8gWE1MIGNvbnN0YW50cwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQklfQVRUUiA9ICJhYmkiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVUdSRVBPUlRfVEFHID0gIkJ1Z1JlcG9ydCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVSUxEX0ZJTkdFUlBSSU5UID0gImJ1aWxkX2ZpbmdlcnByaW50IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVJTERfSUQgPSAiYnVpbGRfaWQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVUlMRF9QUk9EVUNUID0gImJ1aWxkX3Byb2R1Y3QiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVUlMRF9UQUcgPSAiQnVpbGQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDQVNFX1RBRyA9ICJUZXN0Q2FzZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfTElORV9BUkdTID0gImNvbW1hbmRfbGluZV9hcmdzIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVWSUNFU19BVFRSID0gImRldmljZXMiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBET05FX0FUVFIgPSAiZG9uZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVORF9ESVNQTEFZX1RJTUVfQVRUUiA9ICJlbmRfZGlzcGxheSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVORF9USU1FX0FUVFIgPSAiZW5kIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFJTEVEX0FUVFIgPSAiZmFpbGVkIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFJTFVSRV9UQUcgPSAiRmFpbHVyZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhPU1RfTkFNRV9BVFRSID0gImhvc3RfbmFtZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfVkVORE9SX0FUVFIgPSAiamF2YV92ZW5kb3IiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX1ZFUlNJT05fQVRUUiA9ICJqYXZhX3ZlcnNpb24iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dDQVRfVEFHID0gIkxvZ2NhdCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19VUkxfQVRUUiA9ICJsb2dfdXJsIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9BVFRSID0gIm1lc3NhZ2UiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfVEFHID0gIk1vZHVsZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRVNfRE9ORV9BVFRSID0gIm1vZHVsZXNfZG9uZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRVNfVE9UQUxfQVRUUiA9ICJtb2R1bGVzX3RvdGFsIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9BVFRSID0gIm5hbWUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPU19BUkNIX0FUVFIgPSAib3NfYXJjaCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9TX05BTUVfQVRUUiA9ICJvc19uYW1lIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1NfVkVSU0lPTl9BVFRSID0gIm9zX3ZlcnNpb24iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVNTX0FUVFIgPSAicGFzcyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUE9SVF9WRVJTSU9OX0FUVFIgPSAicmVwb3J0X3ZlcnNpb24iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZFUkVOQ0VfVVJMX0FUVFIgPSAicmVmZXJlbmNlX3VybCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9BVFRSID0gInJlc3VsdCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9UQUcgPSAiUmVzdWx0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlVOVElNRV9BVFRSID0gInJ1bnRpbWUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQ1JFRU5TSE9UX1RBRyA9ICJTY3JlZW5zaG90IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0tJUFBFRF9BVFRSID0gInNraXBwZWQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFDS19UQUcgPSAiU3RhY2tUcmFjZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVJUX0RJU1BMQVlfVElNRV9BVFRSID0gInN0YXJ0X2Rpc3BsYXkiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFSVF9USU1FX0FUVFIgPSAic3RhcnQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVUlURV9OQU1FX0FUVFIgPSAic3VpdGVfbmFtZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNVSVRFX1BMQU5fQVRUUiA9ICJzdWl0ZV9wbGFuIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VJVEVfVkVSU0lPTl9BVFRSID0gInN1aXRlX3ZlcnNpb24iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVUlURV9CVUlMRF9BVFRSID0gInN1aXRlX2J1aWxkX251bWJlciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNVTU1BUllfVEFHID0gIlN1bW1hcnkiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1RBRyA9ICJUZXN0IjsKLQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBJSW52b2NhdGlvblJlc3VsdHMgdGhhdCBjYW4gYmUgcXVlcmllZCBmb3IgZ2VuZXJhbCByZXBvcnRpbmcgaW5mb3JtYXRpb24sIGJ1dCB0aGF0Ci0gICAgICogZG8gbm90IHN0b3JlIHVuZGVybHlpbmcgbW9kdWxlIGRhdGEuIFVzZWZ1bCBmb3Igc3VtbWFyaXppbmcgaW52b2NhdGlvbiBoaXN0b3J5LgotICAgICAqIEBwYXJhbSByZXN1bHRzRGlyCi0gICAgICogQHBhcmFtIHVzZUNoZWNrc3VtCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PElJbnZvY2F0aW9uUmVzdWx0PiBnZXRMaWdodFJlc3VsdHMoRmlsZSByZXN1bHRzRGlyKSB7Ci0gICAgICAgIExpc3Q8SUludm9jYXRpb25SZXN1bHQ+IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgTGlzdDxGaWxlPiBmaWxlcyA9IGdldFJlc3VsdERpcmVjdG9yaWVzKHJlc3VsdHNEaXIpOwotICAgICAgICBmb3IgKEZpbGUgcmVzdWx0RGlyIDogZmlsZXMpIHsKLSAgICAgICAgICAgIElJbnZvY2F0aW9uUmVzdWx0IHJlc3VsdCA9IGdldFJlc3VsdEZyb21EaXIocmVzdWx0RGlyLCBmYWxzZSk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXN1bHRzLmFkZChuZXcgTGlnaHRJbnZvY2F0aW9uUmVzdWx0KHJlc3VsdCkpOwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IG51bGw7IC8vIGVuc3VyZSBhbGwgcmVmZXJlbmNlcyBhcmUgcmVtb3ZlZCB0byBmcmVlIG1lbW9yeQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIFNvcnQgdGhlIHRhYmxlIGVudHJpZXMgb24gZWFjaCBlbnRyeSdzIHRpbWVzdGFtcC4KLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydChyZXN1bHRzLCAgKHJlc3VsdDEsIHJlc3VsdDIpIC0+IExvbmcuY29tcGFyZSgKLSAgICAgICAgICAgICAgICByZXN1bHQxLmdldFN0YXJ0VGltZSgpLAotICAgICAgICAgICAgICAgIHJlc3VsdDIuZ2V0U3RhcnRUaW1lKCkpKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHJlc3VsdERpcgotICAgICAqIEByZXR1cm4gYW4gSUludm9jYXRpb25SZXN1bHQgZm9yIHRoaXMgcmVzdWx0LCBvciBudWxsIHVwb24gZXJyb3IKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElJbnZvY2F0aW9uUmVzdWx0IGdldFJlc3VsdEZyb21EaXIoRmlsZSByZXN1bHREaXIpIHsKLSAgICAgICAgcmV0dXJuIGdldFJlc3VsdEZyb21EaXIocmVzdWx0RGlyLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHJlc3VsdERpcgotICAgICAqIEBwYXJhbSB1c2VDaGVja3N1bQotICAgICAqIEByZXR1cm4gYW4gSUludm9jYXRpb25SZXN1bHQgZm9yIHRoaXMgcmVzdWx0LCBvciBudWxsIHVwb24gZXJyb3IKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElJbnZvY2F0aW9uUmVzdWx0IGdldFJlc3VsdEZyb21EaXIoRmlsZSByZXN1bHREaXIsIEJvb2xlYW4gdXNlQ2hlY2tzdW0pIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEZpbGUgcmVzdWx0RmlsZSA9IG5ldyBGaWxlKHJlc3VsdERpciwgVEVTVF9SRVNVTFRfRklMRV9OQU1FKTsKLSAgICAgICAgICAgIGlmICghcmVzdWx0RmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQm9vbGVhbiBpbnZvY2F0aW9uVXNlQ2hlY2tzdW0gPSB1c2VDaGVja3N1bTsKLSAgICAgICAgICAgIElJbnZvY2F0aW9uUmVzdWx0IGludm9jYXRpb24gPSBuZXcgSW52b2NhdGlvblJlc3VsdCgpOwotICAgICAgICAgICAgaW52b2NhdGlvbi5zZXRSZXRyeURpcmVjdG9yeShyZXN1bHREaXIpOwotICAgICAgICAgICAgQ2hlY2tzdW1SZXBvcnRlciBjaGVja3N1bVJlcG9ydGVyID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChpbnZvY2F0aW9uVXNlQ2hlY2tzdW0pIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBjaGVja3N1bVJlcG9ydGVyID0gQ2hlY2tzdW1SZXBvcnRlci5sb2FkKHJlc3VsdERpcik7Ci0gICAgICAgICAgICAgICAgICAgIGludm9jYXRpb24uc2V0UmV0cnlDaGVja3N1bVN0YXR1cyhSZXRyeUNoZWNrc3VtU3RhdHVzLlJldHJ5V2l0aENoZWNrc3VtKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChDaGVja3N1bVZhbGlkYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBVbmFibGUgdG8gcmVhZCBjaGVja3N1bSBmb3JtIHByZXZpb3VzIGV4ZWN1dGlvbgotICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uLnNldFJldHJ5Q2hlY2tzdW1TdGF0dXMoUmV0cnlDaGVja3N1bVN0YXR1cy5SZXRyeVdpdGhvdXRDaGVja3N1bSk7Ci0gICAgICAgICAgICAgICAgICAgIGludm9jYXRpb25Vc2VDaGVja3N1bSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFhtbFB1bGxQYXJzZXJGYWN0b3J5IGZhY3RvcnkgPSBYbWxQdWxsUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgWG1sUHVsbFBhcnNlciBwYXJzZXIgPSBmYWN0b3J5Lm5ld1B1bGxQYXJzZXIoKTsKLSAgICAgICAgICAgIHBhcnNlci5zZXRJbnB1dChuZXcgRmlsZVJlYWRlcihyZXN1bHRGaWxlKSk7Ci0KLSAgICAgICAgICAgIHBhcnNlci5uZXh0VGFnKCk7Ci0gICAgICAgICAgICBwYXJzZXIucmVxdWlyZShYbWxQdWxsUGFyc2VyLlNUQVJUX1RBRywgTlMsIFJFU1VMVF9UQUcpOwotICAgICAgICAgICAgaW52b2NhdGlvbi5zZXRTdGFydFRpbWUoTG9uZy52YWx1ZU9mKAotICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoTlMsIFNUQVJUX1RJTUVfQVRUUikpKTsKLSAgICAgICAgICAgIGludm9jYXRpb24uc2V0VGVzdFBsYW4ocGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKE5TLCBTVUlURV9QTEFOX0FUVFIpKTsKLSAgICAgICAgICAgIGludm9jYXRpb24uc2V0Q29tbWFuZExpbmVBcmdzKHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShOUywgQ09NTUFORF9MSU5FX0FSR1MpKTsKLSAgICAgICAgICAgIFN0cmluZyBkZXZpY2VMaXN0ID0gcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKE5TLCBERVZJQ0VTX0FUVFIpOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgZGV2aWNlIDogZGV2aWNlTGlzdC5zcGxpdCgiLCIpKSB7Ci0gICAgICAgICAgICAgICAgaW52b2NhdGlvbi5hZGREZXZpY2VTZXJpYWwoZGV2aWNlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcGFyc2VyLm5leHRUYWcoKTsKLSAgICAgICAgICAgIHBhcnNlci5yZXF1aXJlKFhtbFB1bGxQYXJzZXIuU1RBUlRfVEFHLCBOUywgQlVJTERfVEFHKTsKLSAgICAgICAgICAgIGludm9jYXRpb24uYWRkSW52b2NhdGlvbkluZm8oQlVJTERfSUQsIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShOUywgQlVJTERfSUQpKTsKLSAgICAgICAgICAgIGludm9jYXRpb24uYWRkSW52b2NhdGlvbkluZm8oQlVJTERfUFJPRFVDVCwgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKE5TLAotICAgICAgICAgICAgICAgICAgICBCVUlMRF9QUk9EVUNUKSk7Ci0gICAgICAgICAgICBpbnZvY2F0aW9uLnNldEJ1aWxkRmluZ2VycHJpbnQocGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKE5TLCBCVUlMRF9GSU5HRVJQUklOVCkpOwotCi0gICAgICAgICAgICAvLyBUT0RPKHN0dWFydHNjb3R0KTogbWF5IHdhbnQgdG8gcmVsb2FkIHRoZXNlIGluY2FzZSB0aGUgcmV0cnkgd2FzIGRvbmUgd2l0aAotICAgICAgICAgICAgLy8gLS1za2lwLWRldmljZS1pbmZvIGZsYWcKLSAgICAgICAgICAgIHBhcnNlci5uZXh0VGFnKCk7Ci0gICAgICAgICAgICBwYXJzZXIucmVxdWlyZShYbWxQdWxsUGFyc2VyLkVORF9UQUcsIE5TLCBCVUlMRF9UQUcpOwotICAgICAgICAgICAgcGFyc2VyLm5leHRUYWcoKTsKLSAgICAgICAgICAgIHBhcnNlci5yZXF1aXJlKFhtbFB1bGxQYXJzZXIuU1RBUlRfVEFHLCBOUywgU1VNTUFSWV9UQUcpOwotICAgICAgICAgICAgcGFyc2VyLm5leHRUYWcoKTsKLSAgICAgICAgICAgIHBhcnNlci5yZXF1aXJlKFhtbFB1bGxQYXJzZXIuRU5EX1RBRywgTlMsIFNVTU1BUllfVEFHKTsKLSAgICAgICAgICAgIHdoaWxlIChwYXJzZXIubmV4dFRhZygpID09IFhtbFB1bGxQYXJzZXIuU1RBUlRfVEFHKSB7Ci0gICAgICAgICAgICAgICAgcGFyc2VyLnJlcXVpcmUoWG1sUHVsbFBhcnNlci5TVEFSVF9UQUcsIE5TLCBNT0RVTEVfVEFHKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShOUywgTkFNRV9BVFRSKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYWJpID0gcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKE5TLCBBQklfQVRUUik7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1vZHVsZUlkID0gQWJpVXRpbHMuY3JlYXRlSWQoYWJpLCBuYW1lKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIGRvbmUgPSBCb29sZWFuLnBhcnNlQm9vbGVhbihwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoTlMsIERPTkVfQVRUUikpOwotICAgICAgICAgICAgICAgIElNb2R1bGVSZXN1bHQgbW9kdWxlID0gaW52b2NhdGlvbi5nZXRPckNyZWF0ZU1vZHVsZShtb2R1bGVJZCk7Ci0gICAgICAgICAgICAgICAgbW9kdWxlLmluaXRpYWxpemVEb25lKGRvbmUpOwotICAgICAgICAgICAgICAgIGxvbmcgcnVudGltZSA9IExvbmcucGFyc2VMb25nKHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShOUywgUlVOVElNRV9BVFRSKSk7Ci0gICAgICAgICAgICAgICAgbW9kdWxlLmFkZFJ1bnRpbWUocnVudGltZSk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHBhcnNlci5uZXh0VGFnKCkgPT0gWG1sUHVsbFBhcnNlci5TVEFSVF9UQUcpIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyc2VyLnJlcXVpcmUoWG1sUHVsbFBhcnNlci5TVEFSVF9UQUcsIE5TLCBDQVNFX1RBRyk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjYXNlTmFtZSA9IHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShOUywgTkFNRV9BVFRSKTsKLSAgICAgICAgICAgICAgICAgICAgSUNhc2VSZXN1bHQgdGVzdENhc2UgPSBtb2R1bGUuZ2V0T3JDcmVhdGVSZXN1bHQoY2FzZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAocGFyc2VyLm5leHRUYWcoKSA9PSBYbWxQdWxsUGFyc2VyLlNUQVJUX1RBRykgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLnJlcXVpcmUoWG1sUHVsbFBhcnNlci5TVEFSVF9UQUcsIE5TLCBURVNUX1RBRyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGVzdE5hbWUgPSBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoTlMsIE5BTUVfQVRUUik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJVGVzdFJlc3VsdCB0ZXN0ID0gdGVzdENhc2UuZ2V0T3JDcmVhdGVSZXN1bHQodGVzdE5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShOUywgUkVTVUxUX0FUVFIpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNraXBwZWQgPSBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoTlMsIFNLSVBQRURfQVRUUik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2tpcHBlZCAhPSBudWxsICYmIEJvb2xlYW4ucGFyc2VCb29sZWFuKHNraXBwZWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFyayB0ZXN0IHBhc3NlZCBhbmQgc2tpcHBlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Quc2tpcHBlZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGFwcGx5IHJlc3VsdCBzdGF0dXMgZGlyZWN0bHkgaWYgdGVzdCB3YXMgbm90IHNraXBwZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0LnNldFJlc3VsdFN0YXR1cyhUZXN0U3RhdHVzLmdldFN0YXR1cyhyZXN1bHQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Quc2V0UmV0cnkodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocGFyc2VyLm5leHRUYWcoKSA9PSBYbWxQdWxsUGFyc2VyLlNUQVJUX1RBRykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZXIuZ2V0TmFtZSgpLmVxdWFscyhGQUlMVVJFX1RBRykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdC5zZXRNZXNzYWdlKHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShOUywgTUVTU0FHRV9BVFRSKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZXIubmV4dFRhZygpID09IFhtbFB1bGxQYXJzZXIuU1RBUlRfVEFHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIucmVxdWlyZShYbWxQdWxsUGFyc2VyLlNUQVJUX1RBRywgTlMsIFNUQUNLX1RBRyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0LnNldFN0YWNrVHJhY2UocGFyc2VyLm5leHRUZXh0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLnJlcXVpcmUoWG1sUHVsbFBhcnNlci5FTkRfVEFHLCBOUywgU1RBQ0tfVEFHKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5uZXh0VGFnKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLnJlcXVpcmUoWG1sUHVsbFBhcnNlci5FTkRfVEFHLCBOUywgRkFJTFVSRV9UQUcpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyc2VyLmdldE5hbWUoKS5lcXVhbHMoQlVHUkVQT1JUX1RBRykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdC5zZXRCdWdSZXBvcnQocGFyc2VyLm5leHRUZXh0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIucmVxdWlyZShYbWxQdWxsUGFyc2VyLkVORF9UQUcsIE5TLCBCVUdSRVBPUlRfVEFHKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnNlci5nZXROYW1lKCkuZXF1YWxzKExPR0NBVF9UQUcpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Quc2V0TG9nKHBhcnNlci5uZXh0VGV4dCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLnJlcXVpcmUoWG1sUHVsbFBhcnNlci5FTkRfVEFHLCBOUywgTE9HQ0FUX1RBRyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJzZXIuZ2V0TmFtZSgpLmVxdWFscyhTQ1JFRU5TSE9UX1RBRykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdC5zZXRTY3JlZW5zaG90KHBhcnNlci5uZXh0VGV4dCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLnJlcXVpcmUoWG1sUHVsbFBhcnNlci5FTkRfVEFHLCBOUywgU0NSRUVOU0hPVF9UQUcpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Quc2V0UmVwb3J0TG9nKFJlcG9ydExvZy5wYXJzZShwYXJzZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIucmVxdWlyZShYbWxQdWxsUGFyc2VyLkVORF9UQUcsIE5TLCBURVNUX1RBRyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBCb29sZWFuIGNoZWNrc3VtTWlzbWF0Y2ggPSBpbnZvY2F0aW9uVXNlQ2hlY2tzdW0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhY2hlY2tzdW1SZXBvcnRlci5jb250YWluc1Rlc3RSZXN1bHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3QsIG1vZHVsZSwgaW52b2NhdGlvbi5nZXRCdWlsZEZpbmdlcnByaW50KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrc3VtTWlzbWF0Y2gpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0LnJlbW92ZVJlc3VsdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBhcnNlci5yZXF1aXJlKFhtbFB1bGxQYXJzZXIuRU5EX1RBRywgTlMsIENBU0VfVEFHKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcGFyc2VyLnJlcXVpcmUoWG1sUHVsbFBhcnNlci5FTkRfVEFHLCBOUywgTU9EVUxFX1RBRyk7Ci0gICAgICAgICAgICAgICAgQm9vbGVhbiBjaGVja3N1bU1pc21hdGNoID0gaW52b2NhdGlvblVzZUNoZWNrc3VtCi0gICAgICAgICAgICAgICAgICAgICYmICFjaGVja3N1bVJlcG9ydGVyLmNvbnRhaW5zTW9kdWxlUmVzdWx0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZSwgaW52b2NhdGlvbi5nZXRCdWlsZEZpbmdlcnByaW50KCkpOwotICAgICAgICAgICAgICAgIGlmIChjaGVja3N1bU1pc21hdGNoKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1vZHVsZS5pbml0aWFsaXplRG9uZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGFyc2VyLnJlcXVpcmUoWG1sUHVsbFBhcnNlci5FTkRfVEFHLCBOUywgUkVTVUxUX1RBRyk7Ci0gICAgICAgICAgICByZXR1cm4gaW52b2NhdGlvbjsKLSAgICAgICAgfSBjYXRjaCAoWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB8IElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSByZXN1bHQKLSAgICAgKiBAcGFyYW0gcmVzdWx0RGlyCi0gICAgICogQHBhcmFtIHN0YXJ0VGltZQotICAgICAqIEBwYXJhbSByZWZlcmVuY2VVcmwgQSBudWxsYWJsZSBzdHJpbmcgdGhhdCBjYW4gY29udGFpbiBhIFVSTCB0byBhIHJlbGF0ZWQgZGF0YQotICAgICAqIEBwYXJhbSBsb2dVcmwgQSBudWxsYWJsZSBzdHJpbmcgdGhhdCBjYW4gY29udGFpbiBhIFVSTCB0byByZWxhdGVkIGxvZyBmaWxlcwotICAgICAqIEBwYXJhbSBjb21tYW5kTGluZUFyZ3MgQSBzdHJpbmcgY29udGFpbmluZyB0aGUgYXJndW1lbnRzIHRvIHRoZSBydW4gY29tbWFuZAotICAgICAqIEByZXR1cm4gVGhlIHJlc3VsdCBmaWxlIGNyZWF0ZWQuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRmlsZSB3cml0ZVJlc3VsdHMoU3RyaW5nIHN1aXRlTmFtZSwgU3RyaW5nIHN1aXRlVmVyc2lvbiwgU3RyaW5nIHN1aXRlUGxhbiwKLSAgICAgICAgICAgIFN0cmluZyBzdWl0ZUJ1aWxkLCBJSW52b2NhdGlvblJlc3VsdCByZXN1bHQsIEZpbGUgcmVzdWx0RGlyLAotICAgICAgICAgICAgbG9uZyBzdGFydFRpbWUsIGxvbmcgZW5kVGltZSwgU3RyaW5nIHJlZmVyZW5jZVVybCwgU3RyaW5nIGxvZ1VybCwKLSAgICAgICAgICAgIFN0cmluZyBjb21tYW5kTGluZUFyZ3MpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBwYXNzZWQgPSByZXN1bHQuY291bnRSZXN1bHRzKFRlc3RTdGF0dXMuUEFTUyk7Ci0gICAgICAgIGludCBmYWlsZWQgPSByZXN1bHQuY291bnRSZXN1bHRzKFRlc3RTdGF0dXMuRkFJTCk7Ci0gICAgICAgIEZpbGUgcmVzdWx0RmlsZSA9IG5ldyBGaWxlKHJlc3VsdERpciwgVEVTVF9SRVNVTFRfRklMRV9OQU1FKTsKLSAgICAgICAgT3V0cHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHJlc3VsdEZpbGUpOwotICAgICAgICBYbWxTZXJpYWxpemVyIHNlcmlhbGl6ZXIgPSBYbWxQdWxsUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZShUWVBFLCBudWxsKS5uZXdTZXJpYWxpemVyKCk7Ci0gICAgICAgIHNlcmlhbGl6ZXIuc2V0T3V0cHV0KHN0cmVhbSwgRU5DT0RJTkcpOwotICAgICAgICBzZXJpYWxpemVyLnN0YXJ0RG9jdW1lbnQoRU5DT0RJTkcsIGZhbHNlKTsKLSAgICAgICAgc2VyaWFsaXplci5zZXRGZWF0dXJlKCJodHRwOi8veG1scHVsbC5vcmcvdjEvZG9jL2ZlYXR1cmVzLmh0bWwjaW5kZW50LW91dHB1dCIsIHRydWUpOwotICAgICAgICBzZXJpYWxpemVyLnByb2Nlc3NpbmdJbnN0cnVjdGlvbigKLSAgICAgICAgICAgICAgICAieG1sLXN0eWxlc2hlZXQgdHlwZT1cInRleHQveHNsXCIgaHJlZj1cImNvbXBhdGliaWxpdHlfcmVzdWx0LnhzbFwiIik7Ci0gICAgICAgIHNlcmlhbGl6ZXIuc3RhcnRUYWcoTlMsIFJFU1VMVF9UQUcpOwotICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZShOUywgU1RBUlRfVElNRV9BVFRSLCBTdHJpbmcudmFsdWVPZihzdGFydFRpbWUpKTsKLSAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUoTlMsIEVORF9USU1FX0FUVFIsIFN0cmluZy52YWx1ZU9mKGVuZFRpbWUpKTsKLSAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUoTlMsIFNUQVJUX0RJU1BMQVlfVElNRV9BVFRSLCB0b1JlYWRhYmxlRGF0ZVN0cmluZyhzdGFydFRpbWUpKTsKLSAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUoTlMsIEVORF9ESVNQTEFZX1RJTUVfQVRUUiwgdG9SZWFkYWJsZURhdGVTdHJpbmcoZW5kVGltZSkpOwotCi0gICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlKE5TLCBTVUlURV9OQU1FX0FUVFIsIHN1aXRlTmFtZSk7Ci0gICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlKE5TLCBTVUlURV9WRVJTSU9OX0FUVFIsIHN1aXRlVmVyc2lvbik7Ci0gICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlKE5TLCBTVUlURV9QTEFOX0FUVFIsIHN1aXRlUGxhbik7Ci0gICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlKE5TLCBTVUlURV9CVUlMRF9BVFRSLCBzdWl0ZUJ1aWxkKTsKLSAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUoTlMsIFJFUE9SVF9WRVJTSU9OX0FUVFIsIFJFU1VMVF9GSUxFX1ZFUlNJT04pOwotICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZShOUywgQ09NTUFORF9MSU5FX0FSR1MsIG51bGxUb0VtcHR5KGNvbW1hbmRMaW5lQXJncykpOwotCi0gICAgICAgIGlmIChyZWZlcmVuY2VVcmwgIT0gbnVsbCkgewotICAgICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUoTlMsIFJFRkVSRU5DRV9VUkxfQVRUUiwgcmVmZXJlbmNlVXJsKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsb2dVcmwgIT0gbnVsbCkgewotICAgICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUoTlMsIExPR19VUkxfQVRUUiwgbG9nVXJsKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIERldmljZSBJbmZvCi0gICAgICAgIFNldDxTdHJpbmc+IGRldmljZXMgPSByZXN1bHQuZ2V0RGV2aWNlU2VyaWFscygpOwotICAgICAgICBTdHJpbmdCdWlsZGVyIGRldmljZUxpc3QgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgZm9yIChTdHJpbmcgZGV2aWNlIDogZGV2aWNlcykgewotICAgICAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlTGlzdC5hcHBlbmQoIiwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRldmljZUxpc3QuYXBwZW5kKGRldmljZSk7Ci0gICAgICAgIH0KLSAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUoTlMsIERFVklDRVNfQVRUUiwgZGV2aWNlTGlzdC50b1N0cmluZygpKTsKLQotICAgICAgICAvLyBIb3N0IEluZm8KLSAgICAgICAgU3RyaW5nIGhvc3ROYW1lID0gIiI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBob3N0TmFtZSA9IEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLmdldEhvc3ROYW1lKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGlnbm9yZWQpIHt9Ci0gICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlKE5TLCBIT1NUX05BTUVfQVRUUiwgaG9zdE5hbWUpOwotICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZShOUywgT1NfTkFNRV9BVFRSLCBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKSk7Ci0gICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlKE5TLCBPU19WRVJTSU9OX0FUVFIsIFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MudmVyc2lvbiIpKTsKLSAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUoTlMsIE9TX0FSQ0hfQVRUUiwgU3lzdGVtLmdldFByb3BlcnR5KCJvcy5hcmNoIikpOwotICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZShOUywgSkFWQV9WRU5ET1JfQVRUUiwgU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnZlbmRvciIpKTsKLSAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUoTlMsIEpBVkFfVkVSU0lPTl9BVFRSLCBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEudmVyc2lvbiIpKTsKLQotICAgICAgICAvLyBCdWlsZCBJbmZvCi0gICAgICAgIHNlcmlhbGl6ZXIuc3RhcnRUYWcoTlMsIEJVSUxEX1RBRyk7Ci0gICAgICAgIGZvciAoRW50cnk8U3RyaW5nLCBTdHJpbmc+IGVudHJ5IDogcmVzdWx0LmdldEludm9jYXRpb25JbmZvKCkuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUoTlMsIGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIGlmIChTdHJpbmdzLmlzTnVsbE9yRW1wdHkocmVzdWx0LmdldEJ1aWxkRmluZ2VycHJpbnQoKSkgJiYKLSAgICAgICAgICAgICAgICBlbnRyeS5nZXRLZXkoKS5lcXVhbHMoQlVJTERfRklOR0VSUFJJTlQpKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LnNldEJ1aWxkRmluZ2VycHJpbnQoZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc2VyaWFsaXplci5lbmRUYWcoTlMsIEJVSUxEX1RBRyk7Ci0KLSAgICAgICAgLy8gU3VtbWFyeQotICAgICAgICBzZXJpYWxpemVyLnN0YXJ0VGFnKE5TLCBTVU1NQVJZX1RBRyk7Ci0gICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlKE5TLCBQQVNTX0FUVFIsIEludGVnZXIudG9TdHJpbmcocGFzc2VkKSk7Ci0gICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlKE5TLCBGQUlMRURfQVRUUiwgSW50ZWdlci50b1N0cmluZyhmYWlsZWQpKTsKLSAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUoTlMsIE1PRFVMRVNfRE9ORV9BVFRSLAotICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcocmVzdWx0LmdldE1vZHVsZUNvbXBsZXRlQ291bnQoKSkpOwotICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZShOUywgTU9EVUxFU19UT1RBTF9BVFRSLAotICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcocmVzdWx0LmdldE1vZHVsZXMoKS5zaXplKCkpKTsKLSAgICAgICAgc2VyaWFsaXplci5lbmRUYWcoTlMsIFNVTU1BUllfVEFHKTsKLQotICAgICAgICAvLyBSZXN1bHRzCi0gICAgICAgIGZvciAoSU1vZHVsZVJlc3VsdCBtb2R1bGUgOiByZXN1bHQuZ2V0TW9kdWxlcygpKSB7Ci0gICAgICAgICAgICBzZXJpYWxpemVyLnN0YXJ0VGFnKE5TLCBNT0RVTEVfVEFHKTsKLSAgICAgICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlKE5TLCBOQU1FX0FUVFIsIG1vZHVsZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUoTlMsIEFCSV9BVFRSLCBtb2R1bGUuZ2V0QWJpKCkpOwotICAgICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUoTlMsIFJVTlRJTUVfQVRUUiwgU3RyaW5nLnZhbHVlT2YobW9kdWxlLmdldFJ1bnRpbWUoKSkpOwotICAgICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUoTlMsIERPTkVfQVRUUiwgQm9vbGVhbi50b1N0cmluZyhtb2R1bGUuaXNEb25lKCkpKTsKLSAgICAgICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlKE5TLCBQQVNTX0FUVFIsCi0gICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobW9kdWxlLmNvdW50UmVzdWx0cyhUZXN0U3RhdHVzLlBBU1MpKSk7Ci0gICAgICAgICAgICBmb3IgKElDYXNlUmVzdWx0IGNyIDogbW9kdWxlLmdldFJlc3VsdHMoKSkgewotICAgICAgICAgICAgICAgIHNlcmlhbGl6ZXIuc3RhcnRUYWcoTlMsIENBU0VfVEFHKTsKLSAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZShOUywgTkFNRV9BVFRSLCBjci5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIGZvciAoSVRlc3RSZXN1bHQgciA6IGNyLmdldFJlc3VsdHMoKSkgewotICAgICAgICAgICAgICAgICAgICBUZXN0U3RhdHVzIHN0YXR1cyA9IHIuZ2V0UmVzdWx0U3RhdHVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIHRlc3Qgd2FzIG5vdCBleGVjdXRlZCwgZG9uJ3QgcmVwb3J0Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplci5zdGFydFRhZyhOUywgVEVTVF9UQUcpOwotICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZShOUywgUkVTVUxUX0FUVFIsIHN0YXR1cy5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUoTlMsIE5BTUVfQVRUUiwgci5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoci5pc1NraXBwZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUoTlMsIFNLSVBQRURfQVRUUiwgQm9vbGVhbi50b1N0cmluZyh0cnVlKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSByLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplci5zdGFydFRhZyhOUywgRkFJTFVSRV9UQUcpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUoTlMsIE1FU1NBR0VfQVRUUiwgbWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3RhY2tUcmFjZSA9IHIuZ2V0U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrVHJhY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZXIuc3RhcnRUYWcoTlMsIFNUQUNLX1RBRyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplci50ZXh0KHN0YWNrVHJhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZXIuZW5kVGFnKE5TLCBTVEFDS19UQUcpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplci5lbmRUYWcoTlMsIEZBSUxVUkVfVEFHKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYnVncmVwb3J0ID0gci5nZXRCdWdSZXBvcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJ1Z3JlcG9ydCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVyLnN0YXJ0VGFnKE5TLCBCVUdSRVBPUlRfVEFHKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZXIudGV4dChidWdyZXBvcnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplci5lbmRUYWcoTlMsIEJVR1JFUE9SVF9UQUcpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBsb2djYXQgPSByLmdldExvZygpOwotICAgICAgICAgICAgICAgICAgICBpZiAobG9nY2F0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZXIuc3RhcnRUYWcoTlMsIExPR0NBVF9UQUcpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplci50ZXh0KGxvZ2NhdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmVuZFRhZyhOUywgTE9HQ0FUX1RBRyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNjcmVlbnNob3QgPSByLmdldFNjcmVlbnNob3QoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNjcmVlbnNob3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplci5zdGFydFRhZyhOUywgU0NSRUVOU0hPVF9UQUcpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplci50ZXh0KHNjcmVlbnNob3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplci5lbmRUYWcoTlMsIFNDUkVFTlNIT1RfVEFHKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBSZXBvcnRMb2cgcmVwb3J0ID0gci5nZXRSZXBvcnRMb2coKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlcG9ydCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBSZXBvcnRMb2cuc2VyaWFsaXplKHNlcmlhbGl6ZXIsIHJlcG9ydCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplci5lbmRUYWcoTlMsIFRFU1RfVEFHKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2VyaWFsaXplci5lbmRUYWcoTlMsIENBU0VfVEFHKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlcmlhbGl6ZXIuZW5kVGFnKE5TLCBNT0RVTEVfVEFHKTsKLSAgICAgICAgfQotICAgICAgICBzZXJpYWxpemVyLmVuZERvY3VtZW50KCk7Ci0gICAgICAgIGNyZWF0ZUNoZWNrc3VtKHJlc3VsdERpciwgcmVzdWx0KTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdEZpbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGUgaHRtbCByZXBvcnQgbGlzdGluZyBhbiBmYWlsZWQgdGVzdHMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEZpbGUgY3JlYXRlRmFpbHVyZVJlcG9ydChGaWxlIGlucHV0WG1sKSB7Ci0gICAgICAgIEZpbGUgZmFpbHVyZVJlcG9ydCA9IG5ldyBGaWxlKGlucHV0WG1sLmdldFBhcmVudEZpbGUoKSwgRkFJTFVSRV9SRVBPUlRfTkFNRSk7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0geHNsU3RyZWFtID0gUmVzdWx0SGFuZGxlci5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKAotICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIi9yZXBvcnQvJXMiLCBGQUlMVVJFX1hTTF9GSUxFX05BTUUpKTsKLSAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmFpbHVyZVJlcG9ydCkpIHsKLQotICAgICAgICAgICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdUcmFuc2Zvcm1lcigKLSAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmVhbVNvdXJjZSh4c2xTdHJlYW0pKTsKLSAgICAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgU3RyZWFtU291cmNlKGlucHV0WG1sKSwgbmV3IFN0cmVhbVJlc3VsdChvdXRwdXRTdHJlYW0pKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gfCBUcmFuc2Zvcm1lckV4Y2VwdGlvbiBpZ25vcmVkKSB7IH0KLSAgICAgICAgcmV0dXJuIGZhaWx1cmVSZXBvcnQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjcmVhdGVDaGVja3N1bShGaWxlIHJlc3VsdERpciwgSUludm9jYXRpb25SZXN1bHQgaW52b2NhdGlvblJlc3VsdCkgewotICAgICAgICBSZXRyeUNoZWNrc3VtU3RhdHVzIHJldHJ5U3RhdHVzID0gaW52b2NhdGlvblJlc3VsdC5nZXRSZXRyeUNoZWNrc3VtU3RhdHVzKCk7Ci0gICAgICAgIHN3aXRjaCAocmV0cnlTdGF0dXMpIHsKLSAgICAgICAgICAgIGNhc2UgTm90UmV0cnk6IGNhc2UgUmV0cnlXaXRoQ2hlY2tzdW06Ci0gICAgICAgICAgICAgICAgLy8gRG8gbm90IGRpc3J1cHQgdGhlIHByb2Nlc3MgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIGdlbmVyYXRpbmcgY2hlY2tzdW0uCi0gICAgICAgICAgICAgICAgQ2hlY2tzdW1SZXBvcnRlci50cnlDcmVhdGVDaGVja3N1bShyZXN1bHREaXIsIGludm9jYXRpb25SZXN1bHQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBSZXRyeVdpdGhvdXRDaGVja3N1bToKLSAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcHJldmlvdXMgcnVuIGhhcyBhbiBpbnZhbGlkIGNoZWNrc3VtIGZpbGUsCi0gICAgICAgICAgICAgICAgLy8gY29weSBpdCBpbnRvIGN1cnJlbnQgcmVzdWx0cyBmb2xkZXIgZm9yIGZ1dHVyZSB0cm91Ymxlc2hvb3RpbmcKLSAgICAgICAgICAgICAgICBGaWxlIHJldHJ5RGlyZWN0b3J5ID0gaW52b2NhdGlvblJlc3VsdC5nZXRSZXRyeURpcmVjdG9yeSgpOwotICAgICAgICAgICAgICAgIFBhdGggcmV0cnlDaGVja3N1bSA9IEZpbGVTeXN0ZW1zLmdldERlZmF1bHQoKS5nZXRQYXRoKAotICAgICAgICAgICAgICAgICAgICAgICAgcmV0cnlEaXJlY3RvcnkuZ2V0QWJzb2x1dGVQYXRoKCksIENoZWNrc3VtUmVwb3J0ZXIuTkFNRSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFyZXRyeUNoZWNrc3VtLnRvRmlsZSgpLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlmIG5vIGNoZWNrc3VtIGZpbGUsIGNoZWNrIGZvciBhIGNvcHkgZnJvbSBhIHByZXZpb3VzIHJldHJ5Ci0gICAgICAgICAgICAgICAgICAgIHJldHJ5Q2hlY2tzdW0gPSBGaWxlU3lzdGVtcy5nZXREZWZhdWx0KCkuZ2V0UGF0aCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRyeURpcmVjdG9yeS5nZXRBYnNvbHV0ZVBhdGgoKSwgQ2hlY2tzdW1SZXBvcnRlci5QUkVWX05BTUUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChyZXRyeUNoZWNrc3VtLnRvRmlsZSgpLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGUgY2hlY2tzdW1Db3B5ID0gbmV3IEZpbGUocmVzdWx0RGlyLCBDaGVja3N1bVJlcG9ydGVyLlBSRVZfTkFNRSk7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSAoRmlsZU91dHB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShjaGVja3N1bUNvcHkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGaWxlcy5jb3B5KHJldHJ5Q2hlY2tzdW0sIHN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdCBkaXNydXB0IHRoZSBwcm9jZXNzIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBjb3B5aW5nIGNoZWNrc3VtCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEZpbmQgdGhlIElJbnZvY2F0aW9uUmVzdWx0IGZvciB0aGUgZ2l2ZW4gc2Vzc2lvbklkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSUludm9jYXRpb25SZXN1bHQgZmluZFJlc3VsdChGaWxlIHJlc3VsdHNEaXIsIEludGVnZXIgc2Vzc2lvbklkKQotICAgICAgICAgICAgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBmaW5kUmVzdWx0KHJlc3VsdHNEaXIsIHNlc3Npb25JZCwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmluZCB0aGUgSUludm9jYXRpb25SZXN1bHQgZm9yIHRoZSBnaXZlbiBzZXNzaW9uSWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgSUludm9jYXRpb25SZXN1bHQgZmluZFJlc3VsdCgKLSAgICAgICAgICAgIEZpbGUgcmVzdWx0c0RpciwgSW50ZWdlciBzZXNzaW9uSWQsIEJvb2xlYW4gdXNlQ2hlY2tzdW0pIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBpZiAoc2Vzc2lvbklkIDwgMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJJbnZhbGlkIHNlc3Npb24gaWQgWyVkXSAiLCBzZXNzaW9uSWQpKTsKLSAgICAgICAgfQotICAgICAgICBGaWxlIHJlc3VsdERpciA9IGdldFJlc3VsdERpcmVjdG9yeShyZXN1bHRzRGlyLCBzZXNzaW9uSWQpOwotICAgICAgICBJSW52b2NhdGlvblJlc3VsdCByZXN1bHQgPSBnZXRSZXN1bHRGcm9tRGlyKHJlc3VsdERpciwgdXNlQ2hlY2tzdW0pOwotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkNvdWxkIG5vdCBmaW5kIHNlc3Npb24gWyVkXSIsIHNlc3Npb25JZCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSByZXN1bHQgZGlyZWN0b3J5IGZvciB0aGUgZ2l2ZW4gc2Vzc2lvbklkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRmlsZSBnZXRSZXN1bHREaXJlY3RvcnkoRmlsZSByZXN1bHRzRGlyLCBJbnRlZ2VyIHNlc3Npb25JZCkgewotICAgICAgICBpZiAoc2Vzc2lvbklkIDwgMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJJbnZhbGlkIHNlc3Npb24gaWQgWyVkXSAiLCBzZXNzaW9uSWQpKTsKLSAgICAgICAgfQotICAgICAgICBMaXN0PEZpbGU+IGFsbFJlc3VsdERpcnMgPSBnZXRSZXN1bHREaXJlY3RvcmllcyhyZXN1bHRzRGlyKTsKLSAgICAgICAgaWYgKHNlc3Npb25JZCA+PSBhbGxSZXN1bHREaXJzLnNpemUoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJJbnZhbGlkIHNlc3Npb24gaWQgWyVkXSwgcmVzdWx0cyIgKwotICAgICAgICAgICAgICAgICAgICAiZGlyZWN0b3J5IGNvbnRhaW5zIG9ubHkgJWQgcmVzdWx0cyIsIHNlc3Npb25JZCwgYWxsUmVzdWx0RGlycy5zaXplKCkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYWxsUmVzdWx0RGlycy5nZXQoc2Vzc2lvbklkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBsaXN0IG9mIGNoaWxkIGRpcmVjdG9yaWVzIHRoYXQgY29udGFpbiB0ZXN0IGludm9jYXRpb24gcmVzdWx0cwotICAgICAqIEBwYXJhbSByZXN1bHRzRGlyIHRoZSByb290IHRlc3QgcmVzdWx0IGRpcmVjdG9yeQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8RmlsZT4gZ2V0UmVzdWx0RGlyZWN0b3JpZXMoRmlsZSByZXN1bHRzRGlyKSB7Ci0gICAgICAgIExpc3Q8RmlsZT4gZGlyZWN0b3J5TGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBGaWxlW10gZmlsZXMgPSByZXN1bHRzRGlyLmxpc3RGaWxlcygpOwotICAgICAgICBpZiAoZmlsZXMgPT0gbnVsbCB8fCBmaWxlcy5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgLy8gTm8gcmVzdWx0cywganVzdCByZXR1cm4gdGhlIGVtcHR5IGxpc3QKLSAgICAgICAgICAgIHJldHVybiBkaXJlY3RvcnlMaXN0OwotICAgICAgICB9Ci0gICAgICAgIGZvciAoRmlsZSByZXN1bHREaXIgOiBmaWxlcykgewotICAgICAgICAgICAgaWYgKCFyZXN1bHREaXIuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gT25seSBpbmNsdWRlIGlmIGl0IGNvbnRhaW4gcmVzdWx0cyBmaWxlCi0gICAgICAgICAgICBGaWxlIHJlc3VsdEZpbGUgPSBuZXcgRmlsZShyZXN1bHREaXIsIFRFU1RfUkVTVUxUX0ZJTEVfTkFNRSk7Ci0gICAgICAgICAgICBpZiAoIXJlc3VsdEZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRpcmVjdG9yeUxpc3QuYWRkKHJlc3VsdERpcik7Ci0gICAgICAgIH0KLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydChkaXJlY3RvcnlMaXN0LCAoZDEsIGQyKSAtPiBkMS5nZXROYW1lKCkuY29tcGFyZVRvKGQyLmdldE5hbWUoKSkpOwotICAgICAgICByZXR1cm4gZGlyZWN0b3J5TGlzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGdpdmVuIHRpbWUgYXMgYSB7QGxpbmsgU3RyaW5nfSBzdWl0YWJsZSBmb3IgZGlzcGxheWluZy4KLSAgICAgKiA8cC8+Ci0gICAgICogRXhhbXBsZTogRnJpIEF1ZyAyMCAxNToxMzowMyBQRFQgMjAxMAotICAgICAqCi0gICAgICogQHBhcmFtIHRpbWUgdGhlIGVwb2NoIHRpbWUgaW4gbXMgc2luY2UgbWlkbmlnaHQgSmFuIDEsIDE5NzAKLSAgICAgKi8KLSAgICBzdGF0aWMgU3RyaW5nIHRvUmVhZGFibGVEYXRlU3RyaW5nKGxvbmcgdGltZSkgewotICAgICAgICBTaW1wbGVEYXRlRm9ybWF0IGRhdGVGb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiRUVFIE1NTSBkZCBISDptbTpzcyB6enogeXl5eSIpOwotICAgICAgICByZXR1cm4gZGF0ZUZvcm1hdC5mb3JtYXQobmV3IERhdGUodGltZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdoZW4gbnVsbGFibGUgaXMgbnVsbCwgcmV0dXJuIGFuIGVtcHR5IHN0cmluZy4gT3RoZXJ3aXNlLCByZXR1cm4gdGhlIHZhbHVlIGluIG51bGxhYmxlLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBudWxsVG9FbXB0eShTdHJpbmcgbnVsbGFibGUpIHsKLSAgICAgICAgcmV0dXJuIG51bGxhYmxlID09IG51bGwgPyAiIiA6IG51bGxhYmxlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1Jlc3VsdFR5cGUuamF2YSBiL2NvbW1vbi91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1Jlc3VsdFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQwYTVmYS4uMDAwMDAwMAotLS0gYS9jb21tb24vdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9SZXN1bHRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsOwotCi0vKioKLSAqIEVudW0gZm9yIGRpc3Rpbmd1aXNoaW5nIHJlc3VsdHMuCi0gKi8KLXB1YmxpYyBlbnVtIFJlc3VsdFR5cGUgewotICAgIC8qKiBMb3dlciBzY29yZSBpcyBiZXR0ZXIuICovCi0gICAgTE9XRVJfQkVUVEVSLAotICAgIC8qKiBIaWdoZXIgc2NvcmUgaXMgYmV0dGVyLiAqLwotICAgIEhJR0hFUl9CRVRURVIsCi0gICAgLyoqIFRoaXMgdmFsdWUgaXMgbm90IGRpcmVjdGx5IGNvcnJlbGF0ZWQgd2l0aCBzY29yZS4gKi8KLSAgICBORVVUUkFMLAotICAgIC8qKiBQcmVzZW5jZSBvZiB0aGlzIHR5cGUgcmVxdWlyZXMgc29tZSBhdHRlbnRpb24gYWx0aG91Z2ggaXQgbWF5IG5vdCBiZSBhbiBlcnJvci4gKi8KLSAgICBXQVJOSU5HOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBhIHN0cmluZyB0byBiZSB1c2VkIGluIHRoZSByZXBvcnQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1JlcG9ydFN0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIG5hbWUoKS50b0xvd2VyQ2FzZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSB7QGxpbmsgUmVzdWx0VHlwZX0gZ2l2ZW4gYSBzdHJpbmcgZnJvbSB0aGUgcmVwb3J0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUmVzdWx0VHlwZSBwYXJzZVJlcG9ydFN0cmluZyhTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIFJlc3VsdFR5cGUudmFsdWVPZih2YWx1ZS50b1VwcGVyQ2FzZSgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9SZXN1bHRVbml0LmphdmEgYi9jb21tb24vdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9SZXN1bHRVbml0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYWVjYmIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvUmVzdWx0VW5pdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKLQotLyoqCi0gKiBFbnVtIGZvciByZXByZXNlbnRpbmcgdGhlIHVuaXQgb2YgcmVzdWx0cy4KLSAqLwotcHVibGljIGVudW0gUmVzdWx0VW5pdCB7Ci0gICAgLyoqIGZvciB2YWx1ZSB3aXRoIG5vIHVuaXQgKi8KLSAgICBOT05FLAotICAgIC8qKiBtaWxsaS1zZWNvbmRzICovCi0gICAgTVMsCi0gICAgLyoqIGZyYW1lcyBwZXIgc2Vjb25kICovCi0gICAgRlBTLAotICAgIC8qKiBvcGVyYXRpb25zIHBlciBzZWNvbmQgKi8KLSAgICBPUFMsCi0gICAgLyoqIGtpbG8tYnl0ZXMtcGVyLXNlY29uZCwgbm90IGJpdHMtcGVyLXNlY29uZCAqLwotICAgIEtCUFMsCi0gICAgLyoqIG1lZ2EtYnl0ZXMtcGVyLXNlY29uZCAqLwotICAgIE1CUFMsCi0gICAgLyoqIGFtb3VudCBvZiBkYXRhLCBieXRlcyAqLwotICAgIEJZVEUsCi0gICAgLyoqIHRlbGwgaG93IG1hbnkgdGltZXMgaXQgZGlkIGhhcHBlbi4gKi8KLSAgICBDT1VOVCwKLSAgICAvKiogdW5pdCBmb3IgYmVuY2htYXJraW5nIHdpdGggZ2VuZXJpYyBzY29yZS4gKi8KLSAgICBTQ09SRSwKLSAgICAvKiogcmFkaWFuICovCi0gICAgUkFESUFOOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBhIHN0cmluZyB0byBiZSB1c2VkIGluIHRoZSByZXBvcnQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1JlcG9ydFN0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIG5hbWUoKS50b0xvd2VyQ2FzZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSB7QGxpbmsgUmVzdWx0VW5pdH0gZ2l2ZW4gYSBzdHJpbmcgZnJvbSB0aGUgcmVwb3J0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUmVzdWx0VW5pdCBwYXJzZVJlcG9ydFN0cmluZyhTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIFJlc3VsdFVuaXQudmFsdWVPZih2YWx1ZS50b1VwcGVyQ2FzZSgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9SZXN1bHRVcGxvYWRlci5qYXZhIGIvY29tbW9uL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvUmVzdWx0VXBsb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM0ODI4NC4uMDAwMDAwMAotLS0gYS9jb21tb24vdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9SZXN1bHRVcGxvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLnppcC5HWklQT3V0cHV0U3RyZWFtOwotCi0vKioKLSAqIFVwbG9hZHMgYSByZXN1bHQgdGhyb3VnaCBhIEhUVFAgUE9TVCBtdWx0aXBhcnQvZm9ybS1kYXRhIHJlcXVlc3QgY29udGFpbmluZwotICogdGhlIHRlc3QgcmVzdWx0IFhNTC4KLSAqLwotcHVibGljIGNsYXNzIFJlc3VsdFVwbG9hZGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVNVTFRfWE1MX0JZVEVTID0gNTAwICogMTAyNDsKLQotICAgIC8qIHBhY2thZ2UgKi8gTXVsdGlwYXJ0Rm9ybSBtTXVsdGlwYXJ0Rm9ybTsKLQotICAgIHB1YmxpYyBSZXN1bHRVcGxvYWRlcihTdHJpbmcgc2VydmVyVXJsLCBTdHJpbmcgc3VpdGVOYW1lKSB7Ci0gICAgICAgIG1NdWx0aXBhcnRGb3JtID0gbmV3IE11bHRpcGFydEZvcm0oc2VydmVyVXJsKS5hZGRGb3JtVmFsdWUoInN1aXRlIiwgc3VpdGVOYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGxvYWRzIHRoZSBnaXZlbiBmaWxlIHRvIHRoZSBzZXJ2ZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVwb3J0RmlsZSBUaGUgZmlsZSB0byB1cGxvYWQuCi0gICAgICogQHBhcmFtIHJlZmVyZW5jZVVybCBBIHJlZmVyZW5jZSB1cmwgdG8gdXNlLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IHVwbG9hZFJlc3VsdChGaWxlIHJlcG9ydEZpbGUsIFN0cmluZyByZWZlcmVuY2VVcmwpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIElucHV0U3RyZWFtIGlucHV0ID0gbmV3IEZpbGVJbnB1dFN0cmVhbShyZXBvcnRGaWxlKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ5dGVbXSBkYXRhID0gZ2V0Qnl0ZXMoaW5wdXQpOwotICAgICAgICAgICAgbU11bHRpcGFydEZvcm0uYWRkRm9ybUZpbGUoInJlc3VsdFhtbCIsICJ0ZXN0LXJlc3VsdC54bWwuZ3oiLCBkYXRhKTsKLSAgICAgICAgICAgIGlmIChyZWZlcmVuY2VVcmwgIT0gbnVsbCAmJiAhcmVmZXJlbmNlVXJsLnRyaW0oKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBtTXVsdGlwYXJ0Rm9ybS5hZGRGb3JtVmFsdWUoInJlZmVyZW5jZVVybCIsIHJlZmVyZW5jZVVybCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbU11bHRpcGFydEZvcm0uc3VibWl0KCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpbnB1dC5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGdldEJ5dGVzKElucHV0U3RyZWFtIGlucHV0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnl0ZU91dHB1dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oUkVTVUxUX1hNTF9CWVRFUyk7Ci0gICAgICAgIEdaSVBPdXRwdXRTdHJlYW0gZ3ppcE91dHB1dCA9IG5ldyBHWklQT3V0cHV0U3RyZWFtKGJ5dGVPdXRwdXQpOwotICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbMTAyNF07Ci0gICAgICAgIGludCBjb3VudDsKLSAgICAgICAgd2hpbGUgKChjb3VudCA9IGlucHV0LnJlYWQoYnVmZmVyKSkgPiAwKSB7Ci0gICAgICAgICAgICBnemlwT3V0cHV0LndyaXRlKGJ1ZmZlciwgMCwgY291bnQpOwotICAgICAgICB9Ci0gICAgICAgIGd6aXBPdXRwdXQuY2xvc2UoKTsKLSAgICAgICAgcmV0dXJuIGJ5dGVPdXRwdXQudG9CeXRlQXJyYXkoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1JldHJ5Q2hlY2tzdW1TdGF0dXMuamF2YSBiL2NvbW1vbi91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1JldHJ5Q2hlY2tzdW1TdGF0dXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg2YWIzNy4uMDAwMDAwMAotLS0gYS9jb21tb24vdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9SZXRyeUNoZWNrc3VtU3RhdHVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKLQotCi1wdWJsaWMgZW51bSBSZXRyeUNoZWNrc3VtU3RhdHVzIHsKLSAgICBOb3RSZXRyeSwKLSAgICBSZXRyeVdpdGhDaGVja3N1bSwKLSAgICBSZXRyeVdpdGhvdXRDaGVja3N1bQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvU3RhY2t0cmFjZS5qYXZhIGIvY29tbW9uL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvU3RhY2t0cmFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2JmOWNhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1N0YWNrdHJhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKLQotLyoqCi0gKiBIZWxwZXIgbWV0aG9kcyBmb3IgZGVhbGluZyB3aXRoIHN0YWNrIHRyYWNlcwotICovCi1wdWJsaWMgY2xhc3MgU3RhY2t0cmFjZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0FGRVRZX0RFUFRIID0gNDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9QT1NURklYID0gIlRlc3QiOwotCi0gICAgcHJpdmF0ZSBTdGFja3RyYWNlKCkge30KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gY2xhc3NuYW1lI21ldGhvZG5hbWUgZnJvbSBjYWxsIHN0YWNrIG9mIHRoZSBjdXJyZW50IHRocmVhZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRlc3RDYWxsZXJDbGFzc01ldGhvZE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRUZXN0Q2FsbGVyQ2xhc3NNZXRob2ROYW1lKGZhbHNlIC8qaW5jbHVkZUxpbmVOdW1iZXIqLyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBjbGFzc25hbWUjbWV0aG9kbmFtZSBmcm9tIGNhbGwgc3RhY2sgb2YgdGhlIGN1cnJlbnQgdGhyZWFkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VGVzdENhbGxlckNsYXNzTWV0aG9kTmFtZUxpbmVOdW1iZXIoKSB7Ci0gICAgICAgIHJldHVybiBnZXRUZXN0Q2FsbGVyQ2xhc3NNZXRob2ROYW1lKHRydWUgLyppbmNsdWRlTGluZU51bWJlciovKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIGNsYXNzbmFtZSNtZXRob2RuYW1lIGZyb20gY2FsbCBzdGFjayBvZiB0aGUgY3VycmVudCB0aHJlYWQKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VGVzdENhbGxlckNsYXNzTWV0aG9kTmFtZShib29sZWFuIGluY2x1ZGVMaW5lTnVtYmVyKSB7Ci0gICAgICAgIFN0YWNrVHJhY2VFbGVtZW50W10gZWxlbWVudHMgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldFN0YWNrVHJhY2UoKTsKLSAgICAgICAgLy8gTG9vayBmb3IgdGhlIGZpcnN0IGNsYXNzIG5hbWUgaW4gdGhlIGVsZW1lbnRzIGFycmF5IHRoYXQgZW5kcyB3aXRoIFRlc3QKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKGVsZW1lbnRzW2ldLmdldENsYXNzTmFtZSgpLmVuZHNXaXRoKFRFU1RfUE9TVEZJWCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYnVpbGRDbGFzc01ldGhvZE5hbWUoZWxlbWVudHMsIGksIGluY2x1ZGVMaW5lTnVtYmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFVzZSBhIHJlYXNvbmFibGUgZGVmYXVsdCBpZiB0aGUgdGVzdCBuYW1lIGlzbid0IGZvdW5kCi0gICAgICAgIHJldHVybiBidWlsZENsYXNzTWV0aG9kTmFtZShlbGVtZW50cywgU0FGRVRZX0RFUFRILCBpbmNsdWRlTGluZU51bWJlcik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGJ1aWxkQ2xhc3NNZXRob2ROYW1lKAotICAgICAgICAgICAgU3RhY2tUcmFjZUVsZW1lbnRbXSBlbGVtZW50cywgaW50IGRlcHRoLCBib29sZWFuIGluY2x1ZGVMaW5lTnVtYmVyKSB7Ci0gICAgICAgIGRlcHRoID0gTWF0aC5taW4oZGVwdGgsIGVsZW1lbnRzLmxlbmd0aCAtIDEpOwotICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBidWlsZGVyLmFwcGVuZChlbGVtZW50c1tkZXB0aF0uZ2V0Q2xhc3NOYW1lKCkpLmFwcGVuZCgiIyIpCi0gICAgICAgICAgICAgICAgLmFwcGVuZChlbGVtZW50c1tkZXB0aF0uZ2V0TWV0aG9kTmFtZSgpKTsKLSAgICAgICAgaWYgKGluY2x1ZGVMaW5lTnVtYmVyKSB7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiOiIpLmFwcGVuZChlbGVtZW50c1tkZXB0aF0uZ2V0TGluZU51bWJlcigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1N0YXQuamF2YSBiL2NvbW1vbi91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1N0YXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc0ODQ0MC4uMDAwMDAwMAotLS0gYS9jb21tb24vdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9TdGF0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLS8qKgotICogVXRpbGl0aWVzIGZvciBkb2luZyBzdGF0aXN0aWNzCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGF0IHsKLSAgICAvKioKLSAgICAgKiBQcml2YXRlIGNvbnN0cnVjdG9yIGZvciBzdGF0aWMgY2xhc3MuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdGF0KCkge30KLQotICAgIC8qKgotICAgICAqIENvbGxlY3Rpb24gb2Ygc3RhdGlzdGljYWwgcHJvcGVydGlycyBsaWtlIGF2ZXJhZ2UsIG1heCwgbWluLCBhbmQgc3RkZGV2Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdGF0UmVzdWx0IHsKLSAgICAgICAgcHVibGljIGRvdWJsZSBtQXZlcmFnZTsKLSAgICAgICAgcHVibGljIGRvdWJsZSBtTWluOwotICAgICAgICBwdWJsaWMgZG91YmxlIG1NYXg7Ci0gICAgICAgIHB1YmxpYyBkb3VibGUgbVN0ZGRldjsKLSAgICAgICAgcHVibGljIGludCBtRGF0YUNvdW50OwotICAgICAgICBwdWJsaWMgU3RhdFJlc3VsdChkb3VibGUgYXZlcmFnZSwgZG91YmxlIG1pbiwgZG91YmxlIG1heCwgZG91YmxlIHN0ZGRldiwgaW50IGRhdGFDb3VudCkgewotICAgICAgICAgICAgbUF2ZXJhZ2UgPSBhdmVyYWdlOwotICAgICAgICAgICAgbU1pbiA9IG1pbjsKLSAgICAgICAgICAgIG1NYXggPSBtYXg7Ci0gICAgICAgICAgICBtU3RkZGV2ID0gc3RkZGV2OwotICAgICAgICAgICAgbURhdGFDb3VudCA9IGRhdGFDb3VudDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGN1bGF0ZSBzdGF0aXN0aWNzIHByb3BlcnRpZXMgbGlrZXMgYXZlcmFnZSwgbWluLCBtYXgsIGFuZCBzdGRkZXYgZm9yIHRoZSBnaXZlbiBhcnJheQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RhdFJlc3VsdCBnZXRTdGF0KGRvdWJsZVtdIGRhdGEpIHsKLSAgICAgICAgZG91YmxlIGF2ZXJhZ2UgPSBkYXRhWzBdOwotICAgICAgICBkb3VibGUgbWluID0gZGF0YVswXTsKLSAgICAgICAgZG91YmxlIG1heCA9IGRhdGFbMF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgYXZlcmFnZSArPSBkYXRhW2ldOwotICAgICAgICAgICAgaWYgKGRhdGFbaV0gPiBtYXgpIHsKLSAgICAgICAgICAgICAgICBtYXggPSBkYXRhW2ldOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGRhdGFbaV0gPCBtaW4pIHsKLSAgICAgICAgICAgICAgICBtaW4gPSBkYXRhW2ldOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGF2ZXJhZ2UgLz0gZGF0YS5sZW5ndGg7Ci0gICAgICAgIGRvdWJsZSBzdW1PZlNxdWFyZXMgPSAwLjA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZG91YmxlIGRpZmYgPSBhdmVyYWdlIC0gZGF0YVtpXTsKLSAgICAgICAgICAgIHN1bU9mU3F1YXJlcyArPSBkaWZmICogZGlmZjsKLSAgICAgICAgfQotICAgICAgICBkb3VibGUgdmFyaWFuY2UgPSBzdW1PZlNxdWFyZXMgLyAoZGF0YS5sZW5ndGggLSAxKTsKLSAgICAgICAgZG91YmxlIHN0ZGRldiA9IE1hdGguc3FydCh2YXJpYW5jZSk7Ci0gICAgICAgIHJldHVybiBuZXcgU3RhdFJlc3VsdChhdmVyYWdlLCBtaW4sIG1heCwgc3RkZGV2LCBkYXRhLmxlbmd0aCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsY3VsYXRlIHN0YXRpc3RpY3MgcHJvcGVydGllcyBsaWtlcyBhdmVyYWdlLCBtaW4sIG1heCwgYW5kIHN0ZGRldiBmb3IgdGhlIGdpdmVuIGFycmF5Ci0gICAgICogd2hpbGUgcmVqZWN0aW5nIG91dGxpZXIgKy8tIG1lZGlhbiAqIHJlamVjdGlvblRocmVzaG9sZC4KLSAgICAgKiByZWplY3Rpb25UaHJlc2hvbGQgc2hvdWxkIGJlIGJpZ2dlciB0aGFuIDAuMCBhbmQgYmUgbG93ZXJ0aGFuIDEuMAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RhdFJlc3VsdCBnZXRTdGF0V2l0aE91dGxpZXJSZWplY3Rpb24oZG91YmxlW10gZGF0YSwgZG91YmxlIHJlamVjdGlvblRocmVzaG9sZCkgewotICAgICAgICBkb3VibGVbXSBkYXRhQ29waWVkID0gQXJyYXlzLmNvcHlPZihkYXRhLCBkYXRhLmxlbmd0aCk7Ci0gICAgICAgIEFycmF5cy5zb3J0KGRhdGFDb3BpZWQpOwotICAgICAgICBpbnQgbWVkaWFuSW5kZXggPSBkYXRhQ29waWVkLmxlbmd0aCAvIDI7Ci0gICAgICAgIGRvdWJsZSBtZWRpYW47Ci0gICAgICAgIGlmIChkYXRhQ29waWVkLmxlbmd0aCAlIDIgPT0gMSkgewotICAgICAgICAgICAgbWVkaWFuID0gZGF0YUNvcGllZFttZWRpYW5JbmRleF07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtZWRpYW4gPSAoZGF0YUNvcGllZFttZWRpYW5JbmRleCAtIDFdICsgZGF0YUNvcGllZFttZWRpYW5JbmRleF0pIC8gMi4wOwotICAgICAgICB9Ci0gICAgICAgIGRvdWJsZSB0aHJlc2hvbGRNaW4gPSBtZWRpYW4gKiAoMS4wIC0gcmVqZWN0aW9uVGhyZXNob2xkKTsKLSAgICAgICAgZG91YmxlIHRocmVzaG9sZE1heCA9IG1lZGlhbiAqICgxLjAgKyByZWplY3Rpb25UaHJlc2hvbGQpOwotCi0gICAgICAgIGRvdWJsZVtdIHZhbGlkRGF0YSA9IG5ldyBkb3VibGVbZGF0YS5sZW5ndGhdOwotICAgICAgICBpbnQgaW5kZXggPSAwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmICgoZGF0YVtpXSA+IHRocmVzaG9sZE1pbikgJiYgKGRhdGFbaV0gPCB0aHJlc2hvbGRNYXgpKSB7Ci0gICAgICAgICAgICAgICAgdmFsaWREYXRhW2luZGV4XSA9IGRhdGFbaV07Ci0gICAgICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFRPRE8gcmVwb3J0IHJlamVjdGVkIGRhdGEKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZ2V0U3RhdChBcnJheXMuY29weU9mKHZhbGlkRGF0YSwgaW5kZXgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiByZXR1cm4gdGhlIGF2ZXJhZ2UgdmFsdWUgb2YgdGhlIHBhc3NlZCBhcnJheQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIGdldEF2ZXJhZ2UoZG91YmxlW10gZGF0YSkgewotICAgICAgICBkb3VibGUgc3VtID0gZGF0YVswXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBzdW0gKz0gZGF0YVtpXTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VtIC8gZGF0YS5sZW5ndGg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcmV0dXJuIHRoZSBtaW5pbXVtIHZhbHVlIG9mIHRoZSBwYXNzZWQgYXJyYXkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBnZXRNaW4oZG91YmxlW10gZGF0YSkgewotICAgICAgICBkb3VibGUgbWluID0gZGF0YVswXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoZGF0YVtpXSA8IG1pbikgewotICAgICAgICAgICAgICAgIG1pbiA9IGRhdGFbaV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1pbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiByZXR1cm4gdGhlIG1heGltdW0gdmFsdWUgb2YgdGhlIHBhc3NlZCBhcnJheQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIGdldE1heChkb3VibGVbXSBkYXRhKSB7Ci0gICAgICAgIGRvdWJsZSBtYXggPSBkYXRhWzBdOwotICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChkYXRhW2ldID4gbWF4KSB7Ci0gICAgICAgICAgICAgICAgbWF4ID0gZGF0YVtpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWF4OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGN1bGF0ZSByYXRlIHBlciBzZWMgZm9yIGdpdmVuIGNoYW5nZSBoYXBwZW5lZCBkdXJpbmcgZ2l2ZW4gdGltZUluTVNlYy4KLSAgICAgKiB0aW1lSW5TZWMgd2l0aCAwIHZhbHVlIHdpbGwgYmUgY2hhbmdlZCB0byBzbWFsbCB2YWx1ZSB0byBwcmV2ZW50IGRpdmlkZSBieSB6ZXJvLgotICAgICAqIEBwYXJhbSBjaGFuZ2UgdG90YWwgY2hhbmdlIG9mIHF1YWxpdHkgZm9yIHRoZSBnaXZlbiBkdXJhdGlvbiB0aW1lSW5NU2VjLgotICAgICAqIEBwYXJhbSB0aW1lSW5NU2VjCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBkb3VibGUgY2FsY1JhdGVQZXJTZWMoZG91YmxlIGNoYW5nZSwgZG91YmxlIHRpbWVJbk1TZWMpIHsKLSAgICAgICAgaWYgKHRpbWVJbk1TZWMgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIGNoYW5nZSAqIDEwMDAuMCAvIDAuMDAxOyAvLyBkbyBub3QgYWxsb3cgemVybwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGNoYW5nZSAqIDEwMDAuMCAvIHRpbWVJbk1TZWM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBhcnJheSB2ZXJzaW9uIG9mIGNhbGNSYXRlUGVyU2VjQXJyYXkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGRvdWJsZVtdIGNhbGNSYXRlUGVyU2VjQXJyYXkoZG91YmxlIGNoYW5nZSwgZG91YmxlW10gdGltZUluTVNlYykgewotICAgICAgICBkb3VibGVbXSByZXN1bHQgPSBuZXcgZG91YmxlW3RpbWVJbk1TZWMubGVuZ3RoXTsKLSAgICAgICAgY2hhbmdlICo9IDEwMDAuMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aW1lSW5NU2VjLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAodGltZUluTVNlY1tpXSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gY2hhbmdlIC8gMC4wMDE7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlc3VsdFtpXSA9IGNoYW5nZSAvIHRpbWVJbk1TZWNbaV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSA5NXRoIHBlcmNlbnRpbGUgdXNpbmcgbmVhcmVzdCByYW5rIGFsZ29yaXRobS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBnZXQ5NVBlcmNlbnRpbGVWYWx1ZShkb3VibGVbXSB2YWx1ZXMpIHsKLSAgICAgICAgQXJyYXlzLnNvcnQodmFsdWVzKTsKLSAgICAgICAgLy8gemVyby1iYXNlZCBhcnJheSBpbmRleAotICAgICAgICBpbnQgaW5kZXggPSAoaW50KSBNYXRoLnJvdW5kKHZhbHVlcy5sZW5ndGggKiAwLjk1ICsgLjUpIC0gMTsKLSAgICAgICAgcmV0dXJuIHZhbHVlc1tpbmRleF07Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9TdHJlYW1VdGlsLmphdmEgYi9jb21tb24vdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9TdHJlYW1VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjZWY1YzkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvU3RyZWFtVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLQotCi1wdWJsaWMgY2xhc3MgU3RyZWFtVXRpbCB7Ci0KLSAgICAvLyAxNksgYnVmZmVyIHNpemUKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVGRkVSX1NJWkUgPSAxNiAqIDEwMjQ7Ci0gICAgLyoqCi0gICAgICogQ29waWVzIGNvbnRlbnRzIG9mIG9yaWdTdHJlYW0gdG8gZGVzdFN0cmVhbS4KLSAgICAgKiA8cC8+Ci0gICAgICogUmVjb21tZW5kZWQgdG8gcHJvdmlkZSBhIGJ1ZmZlcmVkIHN0cmVhbSBmb3IgaW5wdXQgYW5kIG91dHB1dAotICAgICAqCi0gICAgICogQHBhcmFtIGluU3RyZWFtIHRoZSB7QGxpbmsgSW5wdXRTdHJlYW19Ci0gICAgICogQHBhcmFtIG91dFN0cmVhbSB0aGUge0BsaW5rIE91dHB1dFN0cmVhbX0KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNvcHlTdHJlYW1zKElucHV0U3RyZWFtIGluU3RyZWFtLCBPdXRwdXRTdHJlYW0gb3V0U3RyZWFtKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW0JVRkZFUl9TSVpFXTsKLSAgICAgICAgaW50IHNpemUgPSAtMTsKLSAgICAgICAgd2hpbGUgKChzaXplID0gaW5TdHJlYW0ucmVhZChidWYpKSAhPSAtMSkgewotICAgICAgICAgICAgb3V0U3RyZWFtLndyaXRlKGJ1ZiwgMCwgc2l6ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1Rlc3RSZXN1bHQuamF2YSBiL2NvbW1vbi91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1Rlc3RSZXN1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThhOGI0Yy4uMDAwMDAwMAotLS0gYS9jb21tb24vdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9UZXN0UmVzdWx0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWw7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIHNpbmdsZSB0ZXN0IHJlc3VsdC4KLSAqLwotcHVibGljIGNsYXNzIFRlc3RSZXN1bHQgaW1wbGVtZW50cyBJVGVzdFJlc3VsdCB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIElDYXNlUmVzdWx0IG1QYXJlbnQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVRlc3ROYW1lOwotICAgIHByaXZhdGUgVGVzdFN0YXR1cyBtUmVzdWx0OwotICAgIHByaXZhdGUgU3RyaW5nIG1NZXNzYWdlOwotICAgIHByaXZhdGUgU3RyaW5nIG1TdGFja1RyYWNlOwotICAgIHByaXZhdGUgUmVwb3J0TG9nIG1SZXBvcnQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbUJ1Z1JlcG9ydDsKLSAgICBwcml2YXRlIFN0cmluZyBtTG9nOwotICAgIHByaXZhdGUgU3RyaW5nIG1TY3JlZW5zaG90OwotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNSZXRyeTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVNraXBwZWQ7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSB7QGxpbmsgVGVzdFJlc3VsdH0gZm9yIHRoZSBnaXZlbiB0ZXN0IG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIFRlc3RSZXN1bHQoSUNhc2VSZXN1bHQgcGFyZW50LCBTdHJpbmcgbmFtZSkgewotICAgICAgICBtUGFyZW50ID0gcGFyZW50OwotICAgICAgICBtVGVzdE5hbWUgPSBuYW1lOwotICAgICAgICByZXNldCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtVGVzdE5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RnVsbE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlcyMlcyIsIG1QYXJlbnQuZ2V0TmFtZSgpLCBnZXROYW1lKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVGVzdFN0YXR1cyBnZXRSZXN1bHRTdGF0dXMoKSB7Ci0gICAgICAgIHJldHVybiBtUmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRSZXN1bHRTdGF0dXMoVGVzdFN0YXR1cyBzdGF0dXMpIHsKLSAgICAgICAgbVJlc3VsdCA9IHN0YXR1czsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewotICAgICAgICByZXR1cm4gbU1lc3NhZ2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgbU1lc3NhZ2UgPSBtZXNzYWdlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0YWNrVHJhY2UoKSB7Ci0gICAgICAgIHJldHVybiBtU3RhY2tUcmFjZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0U3RhY2tUcmFjZShTdHJpbmcgc3RhY2tUcmFjZSkgewotICAgICAgICBtU3RhY2tUcmFjZSA9IHNhbml0aXplU3RhY2tUcmFjZShzdGFja1RyYWNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJlcG9ydExvZyBnZXRSZXBvcnRMb2coKSB7Ci0gICAgICAgIHJldHVybiBtUmVwb3J0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRSZXBvcnRMb2coUmVwb3J0TG9nIHJlcG9ydCkgewotICAgICAgICBtUmVwb3J0ID0gcmVwb3J0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldEJ1Z1JlcG9ydCgpIHsKLSAgICAgICAgcmV0dXJuIG1CdWdSZXBvcnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEJ1Z1JlcG9ydChTdHJpbmcgcGF0aCkgewotICAgICAgICBtQnVnUmVwb3J0ID0gcGF0aDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRMb2coKSB7Ci0gICAgICAgIHJldHVybiBtTG9nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRMb2coU3RyaW5nIHBhdGgpIHsKLSAgICAgICAgbUxvZyA9IHBhdGg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2NyZWVuc2hvdCgpIHsKLSAgICAgICAgcmV0dXJuIG1TY3JlZW5zaG90OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRTY3JlZW5zaG90KFN0cmluZyBwYXRoKSB7Ci0gICAgICAgIG1TY3JlZW5zaG90ID0gcGF0aDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZmFpbGVkKFN0cmluZyB0cmFjZSkgewotICAgICAgICBtU2tpcHBlZCA9IGZhbHNlOwotICAgICAgICBzZXRSZXN1bHRTdGF0dXMoVGVzdFN0YXR1cy5GQUlMKTsKLSAgICAgICAgaW50IGluZGV4ID0gdHJhY2UuaW5kZXhPZignXG4nKTsKLSAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgLy8gVHJhY2UgaXMgYSBzaW5nbGUgbGluZSwganVzdCBzZXQgdGhlIG1lc3NhZ2UgdG8gYmUgdGhlIHNhbWUgYXMgdGhlIHN0YWNrdHJhY2UuCi0gICAgICAgICAgICBzZXRNZXNzYWdlKHRyYWNlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNldE1lc3NhZ2UodHJhY2Uuc3Vic3RyaW5nKDAsIGluZGV4KSk7Ci0gICAgICAgIH0KLSAgICAgICAgc2V0U3RhY2tUcmFjZSh0cmFjZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHBhc3NlZChSZXBvcnRMb2cgcmVwb3J0KSB7Ci0gICAgICAgIG1Ta2lwcGVkID0gZmFsc2U7Ci0gICAgICAgIGlmIChnZXRSZXN1bHRTdGF0dXMoKSAhPSBUZXN0U3RhdHVzLkZBSUwpIHsKLSAgICAgICAgICAgIHNldFJlc3VsdFN0YXR1cyhUZXN0U3RhdHVzLlBBU1MpOwotICAgICAgICAgICAgaWYgKHJlcG9ydCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2V0UmVwb3J0TG9nKHJlcG9ydCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcHBlZCgpIHsKLSAgICAgICAgaWYgKGdldFJlc3VsdFN0YXR1cygpID09IG51bGwpIHsKLSAgICAgICAgICAgIG1Ta2lwcGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIHNldFJlc3VsdFN0YXR1cyhUZXN0U3RhdHVzLlBBU1MpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzU2tpcHBlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1Ta2lwcGVkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKLSAgICAgICAgbVJlc3VsdCA9IG51bGw7Ci0gICAgICAgIG1NZXNzYWdlID0gbnVsbDsKLSAgICAgICAgbVN0YWNrVHJhY2UgPSBudWxsOwotICAgICAgICBtUmVwb3J0ID0gbnVsbDsKLSAgICAgICAgbUJ1Z1JlcG9ydCA9IG51bGw7Ci0gICAgICAgIG1Mb2cgPSBudWxsOwotICAgICAgICBtU2NyZWVuc2hvdCA9IG51bGw7Ci0gICAgICAgIG1Jc1JldHJ5ID0gZmFsc2U7Ci0gICAgICAgIG1Ta2lwcGVkID0gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFJldHJ5KGJvb2xlYW4gaXNSZXRyeSkgewotICAgICAgICBtSXNSZXRyeSA9IGlzUmV0cnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzUmV0cnkoKSB7Ci0gICAgICAgIHJldHVybiBtSXNSZXRyeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUmVzdWx0KCkgewotICAgICAgICBzZXRSZXN1bHRTdGF0dXMoVGVzdFN0YXR1cy5GQUlMKTsKLSAgICAgICAgc2V0U3RhY2tUcmFjZSgiIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKElUZXN0UmVzdWx0IGFub3RoZXIpIHsKLSAgICAgICAgcmV0dXJuIGdldE5hbWUoKS5jb21wYXJlVG8oYW5vdGhlci5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0cmlwIG91dCBhbnkgaW52YWxpZCBYTUwgY2hhcmFjdGVycyB0aGF0IG1pZ2h0IGNhdXNlIHRoZSByZXBvcnQgdG8gYmUgdW52aWV3YWJsZS4KLSAgICAgKiBodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sLyNkdC1jaGFyYWN0ZXIKLSAgICAgKi8KLSAgICBzdGF0aWMgU3RyaW5nIHNhbml0aXplU3RhY2tUcmFjZShTdHJpbmcgdHJhY2UpIHsKLSAgICAgICAgaWYgKHRyYWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cmFjZS5yZXBsYWNlQWxsKCJbXlxcdTAwMDlcXHUwMDBBXFx1MDAwRFxcdTAwMjAtXFx1RDdGRlxcdUUwMDAtXFx1RkZGRF0iLCAiIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvVGVzdFN0YXR1cy5qYXZhIGIvY29tbW9uL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvVGVzdFN0YXR1cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTliMTcwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1Rlc3RTdGF0dXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsOwotCi0vKioKLSAqIEFuIGVudW0gb2YgcG9zc2libGUgdGVzdCBzdGF0dXNlcy4KLSAqLwotcHVibGljIGVudW0gVGVzdFN0YXR1cyB7Ci0gICAgUEFTUygicGFzcyIpLAotICAgIEZBSUwoImZhaWwiKTsKLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1WYWx1ZTsKLQotICAgIHByaXZhdGUgVGVzdFN0YXR1cyhTdHJpbmcgc3RvcmVkVmFsdWUpIHsKLSAgICAgICAgbVZhbHVlID0gc3RvcmVkVmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB0ZXN0IHN0YXR1cyB0aGF0IHNob3VsZCBiZSBzdG9yZWQgaW4KLSAgICAgKiB4bWwKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotICAgICAgIHJldHVybiBtVmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmluZCB0aGUge0BsaW5rIFRlc3RTdGF0dXN9IGNvcnJlc3BvbmRpbmcgdG8gZ2l2ZW4gc3RyaW5nIHZhbHVlCi0gICAgICogPHAvPgotICAgICAqIFBlcmZvcm1zIGEgY2FzZSBpbnNlbnNpdGl2ZSBzZWFyY2gKLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBUZXN0U3RhdHVzfSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCBjb3VsZCBub3QgYmUgZm91bmQKLSAgICAgKi8KLSAgICBzdGF0aWMgVGVzdFN0YXR1cyBnZXRTdGF0dXMoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIGZvciAoVGVzdFN0YXR1cyBzdGF0dXMgOiBUZXN0U3RhdHVzLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBpZiAodmFsdWUuY29tcGFyZVRvSWdub3JlQ2FzZShzdGF0dXMuZ2V0VmFsdWUoKSkgPT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvVGVzdFN1aXRlRmlsdGVyLmphdmEgYi9jb21tb24vdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9UZXN0U3VpdGVGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk4YmM2ZC4uMDAwMDAwMAotLS0gYS9jb21tb24vdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9UZXN0U3VpdGVGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0UmVzdWx0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotcHVibGljIGNsYXNzIFRlc3RTdWl0ZUZpbHRlciB7Ci0KLSAgICBwcml2YXRlIFRlc3RTdWl0ZUZpbHRlcigpIHt9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3RTdWl0ZSBjcmVhdGVTdWl0ZShMaXN0PENsYXNzPD8+PiBjbGFzc2VzLCBTZXQ8U3RyaW5nPiBpbmNsdWRlcywKLSAgICAgICAgICAgIFNldDxTdHJpbmc+IGV4Y2x1ZGVzKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRmlsdGVyYWJsZVRlc3RTdWl0ZShjbGFzc2VzLCBpbmNsdWRlcywgZXhjbHVkZXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEge0BsaW5rIFRlc3RTdWl0ZX0gdGhhdCBjYW4gZmlsdGVyIHdoaWNoIHRlc3RzIHJ1biwgZ2l2ZW4gdGhlIGluY2x1ZGUgYW5kIGV4Y2x1ZGUgZmlsdGVycy4KLSAgICAgKgotICAgICAqIFRoaXMgaGFkIHRvIGJlIHByaXZhdGUgaW5uZXIgY2xhc3MgYmVjYXVzZSB0aGUgdGVzdCBydW5uZXIgd291bGQgZmluZCBpdCBhbmQgdGhpbmsgaXQgd2FzIGEKLSAgICAgKiBzdWl0ZSBvZiB0ZXN0cywgYnV0IGl0IGhhcyBubyB0ZXN0cyBpbiBpdCwgY2F1c2luZyBhIGNyYXNoLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEZpbHRlcmFibGVUZXN0U3VpdGUgZXh0ZW5kcyBUZXN0U3VpdGUgewotCi0gICAgICAgIHByaXZhdGUgU2V0PFN0cmluZz4gbUluY2x1ZGVzOwotICAgICAgICBwcml2YXRlIFNldDxTdHJpbmc+IG1FeGNsdWRlczsKLQotICAgICAgICBwdWJsaWMgRmlsdGVyYWJsZVRlc3RTdWl0ZShMaXN0PENsYXNzPD8+PiBjbGFzc2VzLCBTZXQ8U3RyaW5nPiBpbmNsdWRlcywKLSAgICAgICAgICAgICAgICBTZXQ8U3RyaW5nPiBleGNsdWRlcykgewotICAgICAgICAgICAgc3VwZXIoY2xhc3Nlcy50b0FycmF5KG5ldyBDbGFzczw/PltjbGFzc2VzLnNpemUoKV0pKTsKLSAgICAgICAgICAgIG1JbmNsdWRlcyA9IGluY2x1ZGVzOwotICAgICAgICAgICAgbUV4Y2x1ZGVzID0gZXhjbHVkZXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICoge0Bpbmhlcml0RG9jfQotICAgICAgICAgKi8KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgY291bnRUZXN0Q2FzZXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gY291bnRUZXN0cyh0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgaW50IGNvdW50VGVzdHMoVGVzdCB0ZXN0KSB7Ci0gICAgICAgICAgICBpZiAodGVzdCBpbnN0YW5jZW9mIFRlc3RTdWl0ZSkgewotICAgICAgICAgICAgICAgIC8vIElmIHRoZSB0ZXN0IGlzIGEgc3VpdGUgaXQgY291bGQgY29udGFpbiBtdWx0aXBsZSB0ZXN0cywgdGhlc2UgbmVlZCB0byBiZSBzcGxpdAotICAgICAgICAgICAgICAgIC8vIG91dCBpbnRvIHNlcGFyYXRlIHRlc3RzIHNvIHRoZXkgY2FuIGJlIGZpbHRlcmVkCi0gICAgICAgICAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gKFRlc3RTdWl0ZSkgdGVzdDsKLSAgICAgICAgICAgICAgICBFbnVtZXJhdGlvbjxUZXN0PiBlbnVtZXJhdG9yID0gc3VpdGUudGVzdHMoKTsKLSAgICAgICAgICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICAgICAgICAgIHdoaWxlIChlbnVtZXJhdG9yLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGNvdW50VGVzdHMoZW51bWVyYXRvci5uZXh0RWxlbWVudCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvdW50OwotICAgICAgICAgICAgfSBlbHNlIGlmIChzaG91bGRSdW4odGVzdCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgICAgICovCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBydW5UZXN0KFRlc3QgdGVzdCwgVGVzdFJlc3VsdCByZXN1bHQpIHsKLSAgICAgICAgICAgIHJ1blRlc3RzKHRlc3QsIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgcnVuVGVzdHMoVGVzdCB0ZXN0LCBUZXN0UmVzdWx0IHJlc3VsdCkgewotICAgICAgICAgICAgaWYgKHRlc3QgaW5zdGFuY2VvZiBUZXN0U3VpdGUpIHsKLSAgICAgICAgICAgICAgICAvLyBJZiB0aGUgdGVzdCBpcyBhIHN1aXRlIGl0IGNvdWxkIGNvbnRhaW4gbXVsdGlwbGUgdGVzdHMsIHRoZXNlIG5lZWQgdG8gYmUgc3BsaXQKLSAgICAgICAgICAgICAgICAvLyBvdXQgaW50byBzZXBhcmF0ZSB0ZXN0cyBzbyB0aGV5IGNhbiBiZSBmaWx0ZXJlZAotICAgICAgICAgICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IChUZXN0U3VpdGUpIHRlc3Q7Ci0gICAgICAgICAgICAgICAgRW51bWVyYXRpb248VGVzdD4gZW51bWVyYXRvciA9IHN1aXRlLnRlc3RzKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGVudW1lcmF0b3IuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcnVuVGVzdHMoZW51bWVyYXRvci5uZXh0RWxlbWVudCgpLCByZXN1bHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hvdWxkUnVuKHRlc3QpKSB7Ci0gICAgICAgICAgICAgICAgdGVzdC5ydW4ocmVzdWx0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBzaG91bGRSdW4oVGVzdCB0ZXN0KSB7Ci0gICAgICAgICAgICBTdHJpbmcgZnVsbE5hbWUgPSB0ZXN0LnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBTdHJpbmdbXSBwYXJ0cyA9IGZ1bGxOYW1lLnNwbGl0KCJbXFwoXFwpXSIpOwotICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IHBhcnRzWzFdOwotICAgICAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSBTdHJpbmcuZm9ybWF0KCIlcyMlcyIsIGNsYXNzTmFtZSwgcGFydHNbMF0pOwotICAgICAgICAgICAgaW50IGluZGV4ID0gY2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0gICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBpbmRleCA8IDAgPyAiIiA6IGNsYXNzTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCi0gICAgICAgICAgICBpZiAobUV4Y2x1ZGVzLmNvbnRhaW5zKHBhY2thZ2VOYW1lKSkgewotICAgICAgICAgICAgICAgIC8vIFNraXAgcGFja2FnZSBiZWNhdXNlIGl0IHdhcyBleGNsdWRlZAotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtRXhjbHVkZXMuY29udGFpbnMoY2xhc3NOYW1lKSkgewotICAgICAgICAgICAgICAgIC8vIFNraXAgY2xhc3MgYmVjYXVzZSBpdCB3YXMgZXhjbHVkZWQKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUV4Y2x1ZGVzLmNvbnRhaW5zKG1ldGhvZE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgLy8gU2tpcCBtZXRob2QgYmVjYXVzZSBpdCB3YXMgZXhjbHVkZWQKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbUluY2x1ZGVzLmlzRW1wdHkoKQotICAgICAgICAgICAgICAgICAgICB8fCBtSW5jbHVkZXMuY29udGFpbnMobWV0aG9kTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgfHwgbUluY2x1ZGVzLmNvbnRhaW5zKGNsYXNzTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgfHwgbUluY2x1ZGVzLmNvbnRhaW5zKHBhY2thZ2VOYW1lKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1ZlbmRvckludGVyZmFjZVRlc3QuamF2YSBiL2NvbW1vbi91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1ZlbmRvckludGVyZmFjZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJjYWYwYy4uMDAwMDAwMAotLS0gYS9jb21tb24vdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9WZW5kb3JJbnRlcmZhY2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci0KLS8qKgotICogQW5ub3RhdGlvbiBtYXJraW5nIGEgdGVzdCBjYXNlIGFzIHBhcnQgb2YgdGhlIGN0cy12ZW5kb3ItaW50ZXJmYWNlIHBsYW4gZm9yIFZUUydzIENUUyBvbgotICogQU9TUCByZXF1aXJlbWVudC4KLSAqIDxwPgotICogVGVzdCBjbGFzc2VzIGFuZCB0ZXN0IGNhc2VzIG1hcmtlZCB3aXRoIHRoaXMgYW5ub3RhdGlvbiB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZQotICogY3RzLXZlbmRvci1pbnRlcmZhY2UgcGxhbgotICogYnkgZGVmYXVsdC4KLSAqLwotQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKLUBUYXJnZXQoe0VsZW1lbnRUeXBlLk1FVEhPRCwgRWxlbWVudFR5cGUuVFlQRX0pCi1wdWJsaWMgQGludGVyZmFjZSBWZW5kb3JJbnRlcmZhY2VUZXN0IHsKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1ppcFV0aWwuamF2YSBiL2NvbW1vbi91dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1ppcFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ0ZmQ0Ni4uMDAwMDAwMAotLS0gYS9jb21tb24vdXRpbC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9aaXBVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBPdXRwdXRTdHJlYW07Ci0KLXB1YmxpYyBjbGFzcyBaaXBVdGlsIHsKLQotICAgIC8qKgotICAgICAqIFV0aWxpdHkgbWV0aG9kIHRvIGNyZWF0ZSBhIHppcCBmaWxlIGNvbnRhaW5pbmcgdGhlIGdpdmVuIGRpcmVjdG9yeSBhbmQKLSAgICAgKiBhbGwgaXRzIGNvbnRlbnRzLgotICAgICAqCi0gICAgICogQHBhcmFtIGRpciB0aGUgZGlyZWN0b3J5IHRvIHppcAotICAgICAqIEBwYXJhbSB6aXBGaWxlIHRoZSB6aXAgZmlsZSB0byBjcmVhdGUgLSBpdCBzaG91bGQgbm90IGFscmVhZHkgZXhpc3QKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGZhaWxlZCB0byBjcmVhdGUgemlwIGZpbGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlWmlwKEZpbGUgZGlyLCBGaWxlIHppcEZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFppcE91dHB1dFN0cmVhbSBvdXQgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmaWxlU3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oemlwRmlsZSk7Ci0gICAgICAgICAgICBvdXQgPSBuZXcgWmlwT3V0cHV0U3RyZWFtKG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShmaWxlU3RyZWFtKSk7Ci0gICAgICAgICAgICBhZGRUb1ppcChvdXQsIGRpciwgbmV3IExpbmtlZExpc3Q8U3RyaW5nPigpKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgemlwRmlsZS5kZWxldGUoKTsKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgemlwRmlsZS5kZWxldGUoKTsKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBvdXQuY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlY3Vyc2l2ZWx5IGFkZHMgZ2l2ZW4gZmlsZSBhbmQgaXRzIGNvbnRlbnRzIHRvIFppcE91dHB1dFN0cmVhbQotICAgICAqCi0gICAgICogQHBhcmFtIG91dCB0aGUge0BsaW5rIFppcE91dHB1dFN0cmVhbX0KLSAgICAgKiBAcGFyYW0gZmlsZSB0aGUge0BsaW5rIEZpbGV9IHRvIGFkZCB0byB0aGUgc3RyZWFtCi0gICAgICogQHBhcmFtIHJlbGF0aXZlUGF0aFNlZ3MgdGhlIHJlbGF0aXZlIHBhdGggb2YgZmlsZSwgaW5jbHVkaW5nIHNlcGFyYXRvcnMKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGZhaWxlZCB0byBhZGQgZmlsZSB0byB6aXAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkVG9aaXAoWmlwT3V0cHV0U3RyZWFtIG91dCwgRmlsZSBmaWxlLCBMaXN0PFN0cmluZz4gcmVsYXRpdmVQYXRoU2VncykKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJlbGF0aXZlUGF0aFNlZ3MuYWRkKGZpbGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgLy8gbm90ZTogaXQgYXBwZWFycyBldmVuIG9uIHdpbmRvd3MsIFppcEVudHJ5IGV4cGVjdHMgJy8nIGFzIGEgcGF0aCBzZXBhcmF0b3IKLSAgICAgICAgICAgIHJlbGF0aXZlUGF0aFNlZ3MuYWRkKCIvIik7Ci0gICAgICAgIH0KLSAgICAgICAgWmlwRW50cnkgemlwRW50cnkgPSBuZXcgWmlwRW50cnkoYnVpbGRQYXRoKHJlbGF0aXZlUGF0aFNlZ3MpKTsKLSAgICAgICAgb3V0LnB1dE5leHRFbnRyeSh6aXBFbnRyeSk7Ci0gICAgICAgIGlmIChmaWxlLmlzRmlsZSgpKSB7Ci0gICAgICAgICAgICB3cml0ZVRvU3RyZWFtKGZpbGUsIG91dCk7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0LmNsb3NlRW50cnkoKTsKLSAgICAgICAgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgLy8gcmVjdXJzaXZlbHkgYWRkIGNvbnRlbnRzCi0gICAgICAgICAgICBGaWxlW10gc3ViRmlsZXMgPSBmaWxlLmxpc3RGaWxlcygpOwotICAgICAgICAgICAgaWYgKHN1YkZpbGVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiQ291bGQgbm90IHJlYWQgZGlyZWN0b3J5ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoRmlsZSBzdWJGaWxlIDogc3ViRmlsZXMpIHsKLSAgICAgICAgICAgICAgICBhZGRUb1ppcChvdXQsIHN1YkZpbGUsIHJlbGF0aXZlUGF0aFNlZ3MpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSBwYXRoIHNlcGFyYXRvcgotICAgICAgICAgICAgcmVsYXRpdmVQYXRoU2Vncy5yZW1vdmUocmVsYXRpdmVQYXRoU2Vncy5zaXplKCktMSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gcmVtb3ZlIHRoZSBsYXN0IHNlZ21lbnQsIGFkZGVkIGF0IGJlZ2lubmluZyBvZiBtZXRob2QKLSAgICAgICAgcmVsYXRpdmVQYXRoU2Vncy5yZW1vdmUocmVsYXRpdmVQYXRoU2Vncy5zaXplKCktMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnVpbGRzIGEgZmlsZSBzeXN0ZW0gcGF0aCBmcm9tIGEgc3RhY2sgb2YgcmVsYXRpdmUgcGF0aCBzZWdtZW50cwotICAgICAqCi0gICAgICogQHBhcmFtIHJlbGF0aXZlUGF0aFNlZ3MgdGhlIGxpc3Qgb2YgcmVsYXRpdmUgcGF0aHMKLSAgICAgKiBAcmV0dXJuIGEge0BsaW5rIFN0cmluZ30gY29udGFpbmluZyBhbGwgcmVsYXRpdmVQYXRoU2VncwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBidWlsZFBhdGgoTGlzdDxTdHJpbmc+IHJlbGF0aXZlUGF0aFNlZ3MpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBwYXRoQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGZvciAoU3RyaW5nIHNlZ21lbnQgOiByZWxhdGl2ZVBhdGhTZWdzKSB7Ci0gICAgICAgICAgICBwYXRoQnVpbGRlci5hcHBlbmQoc2VnbWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBhdGhCdWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGVscGVyIG1ldGhvZCB0byB3cml0ZSBpbnB1dCBmaWxlIGNvbnRlbnRzIHRvIG91dHB1dCBzdHJlYW0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmlsZSB0aGUgaW5wdXQge0BsaW5rIEZpbGV9Ci0gICAgICogQHBhcmFtIG91dCB0aGUge0BsaW5rIE91dHB1dFN0cmVhbX0KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlVG9TdHJlYW0oRmlsZSBmaWxlLCBPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbnB1dFN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSkpOwotICAgICAgICAgICAgU3RyZWFtVXRpbC5jb3B5U3RyZWFtcyhpbnB1dFN0cmVhbSwgb3V0KTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlucHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi91dGlsL3Rlc3RzL0FuZHJvaWQubWsgYi9jb21tb24vdXRpbC90ZXN0cy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWQwMjljLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi91dGlsL3Rlc3RzL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCi0KLUxPQ0FMX0pBVkFfUkVTT1VSQ0VfRElSUyA6PSByZXMKLQotTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0ganVuaXQtaG9zdCBreG1sMi0yLjMuMCB0cmFkZWZlZCBjb21wYXRpYmlsaXR5LWNvbW1vbi11dGlsLWhvc3RzaWRlbGliCi0KLUxPQ0FMX01PRFVMRSA6PSBjb21wYXRpYmlsaXR5LWNvbW1vbi11dGlsLXRlc3RzCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi1pbmNsdWRlIGN0cy9lcnJvcl9wcm9uZV9ydWxlcy5tawotaW5jbHVkZSAkKEJVSUxEX0hPU1RfSkFWQV9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvY29tbW9uL3V0aWwvdGVzdHMvcmVzL2xvZ2NhdC50eHQgYi9jb21tb24vdXRpbC90ZXN0cy9yZXMvbG9nY2F0LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlkMTBkMC4uMDAwMDAwMAotLS0gYS9jb21tb24vdXRpbC90ZXN0cy9yZXMvbG9nY2F0LnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDMzNiArMCwwIEBACi0tLS0tLS0tLS0gYmVnaW5uaW5nIG9mIHN5c3RlbQotMDktMDMgMTc6NDc6NTkuNDkwICA3MDM5ICA3MDU0IEQgQXRDa3BkQ21kSGFuZGxlcjogRGUtcXVlaW5nIGNvbW1hbmQKLS0tLS0tLS0tLSBiZWdpbm5pbmcgb2YgY3Jhc2gKLTA5LTAzIDE3OjQ4OjA1LjYyNyAxMTA3MSAxMTE4OSBGIGxpYmMgICAgOiBGYXRhbCBzaWduYWwgMTEgKFNJR1NFR1YpLCBjb2RlIDEsIGZhdWx0IGFkZHIgMHhlOTM4MDAwMCBpbiB0aWQgMTExODkgKEF1ZGlvT3V0X0QpCi0wOS0wMyAxNzo0ODowNS43MDcgICAzNTkgICAzNTkgVyAgICAgICAgIDogZGVidWdnZXJkOiBoYW5kbGluZyByZXF1ZXN0OiBwaWQ9MTEwNzEgdWlkPTEwNDEgZ2lkPTEwMDUgdGlkPTExMTg5Ci0wOS0wMyAxNzo0ODowNS43OTYgIDcwNzIgIDcwNzIgRiBERUJVRyAgIDogKioqICoqKiAqKiogKioqICoqKiAqKiogKioqICoqKiAqKiogKioqICoqKiAqKiogKioqICoqKiAqKiogKioqCi0wOS0wMyAxNzo0ODowNS43OTYgIDcwNzIgIDcwNzIgRiBERUJVRyAgIDogQnVpbGQgZmluZ2VycHJpbnQ6ICdnb29nbGUvYW5nbGVyL2FuZ2xlcjo3LjEuMS9ONEYyNlQvMzY4NzMzMTp1c2VyZGVidWcvZGV2LWtleXMnCi0wOS0wMyAxNzo0ODowNS43OTYgIDcwNzIgIDcwNzIgRiBERUJVRyAgIDogUmV2aXNpb246ICcwJwotMDktMDMgMTc6NDg6MDUuNzk2ICA3MDcyICA3MDcyIEYgREVCVUcgICA6IEFCSTogJ2FybScKLTA5LTAzIDE3OjQ4OjA1Ljc5NiAgNzA3MiAgNzA3MiBGIERFQlVHICAgOiBwaWQ6IDExMDcxLCB0aWQ6IDExMTg5LCBuYW1lOiBBdWRpb091dF9EICA+Pj4gL3N5c3RlbS9iaW4vYXVkaW9zZXJ2ZXIgPDw8Ci0wOS0wMyAxNzo0ODowNS43OTcgIDcwNzIgIDcwNzIgRiBERUJVRyAgIDogc2lnbmFsIDExIChTSUdTRUdWKSwgY29kZSAxIChTRUdWX01BUEVSUiksIGZhdWx0IGFkZHIgMHhlOTM4MDAwMAotMDktMDMgMTc6NDg6MDUuNzk3ICA3MDcyICA3MDcyIEYgREVCVUcgICA6ICAgICByMCBlOWU3YTI0MCAgcjEgZTkzODAwMDAgIHIyIDAwMDAwMTcwICByMyAwMDAwMDAwMAotMDktMDMgMTc6NDg6MDUuNzk3ICA3MDcyICA3MDcyIEYgREVCVUcgICA6ICAgICByNCAwMDAwMDAwMiAgcjUgMDAwMDAwMDAgIHI2IGVjMWUxZjI1ICByNyBlYjZmODAwMAotMDktMDMgMTc6NDg6MDUuNzk3ICA3MDcyICA3MDcyIEYgREVCVUcgICA6ICAgICByOCAwMDAwMDAwMCAgcjkgZWIxMDUyMDQgIHNsIDAwMDAwMDAwICBmcCAwMDAwMDNjMAotMDktMDMgMTc6NDg6MDUuNzk3ICA3MDcyICA3MDcyIEYgREVCVUcgICA6ICAgICBpcCBlYmQzZGYxOCAgc3AgZWFmODA2ODggIGxyIGVjMWUxZjQxICBwYyBlYmQzOGRkNiAgY3BzciAyMDAwMDAzMAotMDktMDMgMTc6NDg6MDUuODA1ICA3MDcyICA3MDcyIEYgREVCVUcgICA6Ci0wOS0wMyAxNzo0ODowNS44MDUgIDcwNzIgIDcwNzIgRiBERUJVRyAgIDogYmFja3RyYWNlOgotMDktMDMgMTc6NDg6MDUuODA2ICA3MDcyICA3MDcyIEYgREVCVUcgICA6ICAgICAjMDAgcGMgMDAwMDJkZDYgIC9zeXN0ZW0vbGliL2xpYmF1ZGlvdXRpbHMuc28gKG1lbWNweV90b19mbG9hdF9mcm9tX2kxNis1KQotMDktMDMgMTc6NDg6MDUuODA2ICA3MDcyICA3MDcyIEYgREVCVUcgICA6ICAgICAjMDEgcGMgMDAwNDBmM2QgIC9zeXN0ZW0vbGliL2xpYmF1ZGlvZmxpbmdlci5zbwotMDktMDMgMTc6NDg6MDUuODA2ICA3MDcyICA3MDcyIEYgREVCVUcgICA6ICAgICAjMDIgcGMgMDAwNDA3OTkgIC9zeXN0ZW0vbGliL2xpYmF1ZGlvZmxpbmdlci5zbwotMDktMDMgMTc6NDg6MDUuODA2ICA3MDcyICA3MDcyIEYgREVCVUcgICA6ICAgICAjMDMgcGMgMDAwMTExNzggIC9zeXN0ZW0vbGliL2xpYmF1ZGlvZmxpbmdlci5zbwotMDktMDMgMTc6NDg6MDUuODA2ICA3MDcyICA3MDcyIEYgREVCVUcgICA6ICAgICAjMDQgcGMgMDAwMzE4MGIgIC9zeXN0ZW0vbGliL2xpYmF1ZGlvZmxpbmdlci5zbwotMDktMDMgMTc6NDg6MDUuODA2ICA3MDcyICA3MDcyIEYgREVCVUcgICA6ICAgICAjMDUgcGMgMDAwMmZlNTcgIC9zeXN0ZW0vbGliL2xpYmF1ZGlvZmxpbmdlci5zbwotMDktMDMgMTc6NDg6MDUuODA2ICA3MDcyICA3MDcyIEYgREVCVUcgICA6ICAgICAjMDYgcGMgMDAwMGUzNDUgIC9zeXN0ZW0vbGliL2xpYnV0aWxzLnNvIChfWk43YW5kcm9pZDZUaHJlYWQxMV90aHJlYWRMb29wRVB2KzE0MCkKLTA5LTAzIDE3OjQ4OjA1LjgwNiAgNzA3MiAgNzA3MiBGIERFQlVHICAgOiAgICAgIzA3IHBjIDAwMDQ3MGIzICAvc3lzdGVtL2xpYi9saWJjLnNvIChfWkwxNV9fcHRocmVhZF9zdGFydFB2KzIyKQotMDktMDMgMTc6NDg6MDUuODA2ICA3MDcyICA3MDcyIEYgREVCVUcgICA6ICAgICAjMDggcGMgMDAwMTllM2QgIC9zeXN0ZW0vbGliL2xpYmMuc28gKF9fc3RhcnRfdGhyZWFkKzYpCi0wOS0wMyAxNzo0ODowNS45NjcgMTEyNzIgMTE1NjggVyBOYXRpdmVDcmFzaExpc3RlbmVyOiBDb3VsZG4ndCBmaW5kIFByb2Nlc3NSZWNvcmQgZm9yIHBpZCAxMTA3MQotMDktMDMgMTc6NDg6MDUuOTY5ICAgMzU5ICAgMzU5IFcgICAgICAgICA6IGRlYnVnZ2VyZDogcmVzdW1pbmcgdGFyZ2V0IDExMDcxCi0wOS0wMyAxNzo0ODowNS45ODEgMTEyNzIgMTEzMDcgSSBCb290UmVjZWl2ZXI6IENvcHlpbmcgL2RhdGEvdG9tYnN0b25lcy90b21ic3RvbmVfMDEgdG8gRHJvcEJveCAoU1lTVEVNX1RPTUJTVE9ORSkKLTA5LTAzIDE3OjQ4OjA2LjA2NyAgIDM5NCAgIDM5NCBJIFNlcnZpY2VNYW5hZ2VyOiBzZXJ2aWNlICdtZWRpYS5zb3VuZF90cmlnZ2VyX2h3JyBkaWVkCi0wNi0xNSAxOTo1NzozMy42MDcgMTI3MzYgMTI3NjEgRCBQZXJtaXNzaW9uQ2FjaGU6IGNoZWNraW5nIGFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfQVVESU9fU0VUVElOR1MgZm9yIHVpZD0xMDE5NyA9PiBncmFudGVkICg2OTggdXMpCi0tLS0tLS0tLS0gYmVnaW5uaW5nIG9mIGNyYXNoCi0wNi0xNSAxOTo1NzozMy42MDcgMTI3MzYgMTI3NjEgRiBsaWJjICAgIDogRmF0YWwgc2lnbmFsIDExIChTSUdTRUdWKSwgY29kZSAxLCBmYXVsdCBhZGRyIDB4MCBpbiB0aWQgMTI3NjEgKEJpbmRlcjoxMjczNl8yKQotMDYtMTUgMTk6NTc6MzMuNjA4ICAgMzc5ICAgMzc5IFcgICAgICAgICA6IGRlYnVnZ2VyZDogaGFuZGxpbmcgcmVxdWVzdDogcGlkPTEyNzM2IHVpZD0xMDQxIGdpZD0xMDA1IHRpZD0xMjc2MQotMDYtMTUgMTk6NTc6MzMuNjcwIDI2MTkyIDI2MTkyIEYgREVCVUcgICA6ICoqKiAqKiogKioqICoqKiAqKiogKioqICoqKiAqKiogKioqICoqKiAqKiogKioqICoqKiAqKiogKioqICoqKgotMDYtMTUgMTk6NTc6MzMuNjcwIDI2MTkyIDI2MTkyIEYgREVCVUcgICA6IEJ1aWxkIGZpbmdlcnByaW50OiAnZ29vZ2xlL2J1bGxoZWFkL2J1bGxoZWFkOjcuMS4yL04yRzQ4Qy80MTA0MDEwOnVzZXJkZWJ1Zy9kZXYta2V5cycKLTA2LTE1IDE5OjU3OjMzLjY3MCAyNjE5MiAyNjE5MiBGIERFQlVHICAgOiBSZXZpc2lvbjogJ3Jldl8xLjAnCi0wNi0xNSAxOTo1NzozMy42NzAgMjYxOTIgMjYxOTIgRiBERUJVRyAgIDogQUJJOiAnYXJtJwotMDYtMTUgMTk6NTc6MzMuNjcwIDI2MTkyIDI2MTkyIEYgREVCVUcgICA6IHBpZDogMTI3MzYsIHRpZDogMTI3NjEsIG5hbWU6IEJpbmRlcjoxMjczNl8yICA+Pj4gL3N5c3RlbS9iaW4vYXVkaW9zZXJ2ZXIgPDw8Ci0wNi0xNSAxOTo1NzozMy42NzAgMjYxOTIgMjYxOTIgRiBERUJVRyAgIDogc2lnbmFsIDExIChTSUdTRUdWKSwgY29kZSAxIChTRUdWX01BUEVSUiksIGZhdWx0IGFkZHIgMHgwCi0wNi0xNSAxOTo1NzozMy42NzAgMjYxOTIgMjYxOTIgRiBERUJVRyAgIDogICAgIHIwIDAwMDAwMDAwICByMSAwMDAwMDAwMCAgcjIgMDAwMDAwNWYgIHIzIDAwMDAwMDAwCi0wNi0xNSAxOTo1NzozMy42NzAgMjYxOTIgMjYxOTIgRiBERUJVRyAgIDogICAgIHI0IGZmZmZmZmZmICByNSAwMDAwMDAwMCAgcjYgZjE0ZjkwMDAgIHI3IDAwMDAwMDAxCi0wNi0xNSAxOTo1NzozMy42NzAgMjYxOTIgMjYxOTIgRiBERUJVRyAgIDogICAgIHI4IDAwMDAwMDA0ICByOSBmMzM1MzExNCAgc2wgZjMzMTM5MDAgIGZwIDAwMDAwMDAwCi0wNi0xNSAxOTo1NzozMy42NzAgMjYxOTIgMjYxOTIgRiBERUJVRyAgIDogICAgIGlwIGYzYmQ0ZDg4ICBzcCBmMTI3ZDljOCAgbHIgZjNiOWNiYzUgIHBjIGYzYjY1YWY0ICBjcHNyIDYwMDAwMDMwCi0wNi0xNSAxOTo1NzozMy42NzYgMjYxOTIgMjYxOTIgRiBERUJVRyAgIDoKLTA2LTE1IDE5OjU3OjMzLjY3NiAyNjE5MiAyNjE5MiBGIERFQlVHICAgOiBiYWNrdHJhY2U6Ci0wNi0xNSAxOTo1NzozMy42NzcgMjYxOTIgMjYxOTIgRiBERUJVRyAgIDogICAgICMwMCBwYyAwMDAxOGFmNCAgL3N5c3RlbS9saWIvbGliYy5zbyAoc3RybGVuKzcxKQotMDYtMTUgMTk6NTc6MzMuNjc3IDI2MTkyIDI2MTkyIEYgREVCVUcgICA6ICAgICAjMDEgcGMgMDAwNGZiYzEgIC9zeXN0ZW0vbGliL2xpYmMuc28gKF9fc3RybGVuX2Noays0KQotMDYtMTUgMTk6NTc6MzMuNjc3IDI2MTkyIDI2MTkyIEYgREVCVUcgICA6ICAgICAjMDIgcGMgMDAwMGM1OTkgIC9zeXN0ZW0vbGliL2xpYnV0aWxzLnNvIChfWk43YW5kcm9pZDdTdHJpbmc4QzJFUEtjKzEyKQotMDYtMTUgMTk6NTc6MzMuNjc3IDI2MTkyIDI2MTkyIEYgREVCVUcgICA6ICAgICAjMDMgcGMgMDAwMmZkYmYgIC9zeXN0ZW0vbGliL2xpYmF1ZGlvcG9saWN5bWFuYWdlcmRlZmF1bHQuc28gKF9aTks3YW5kcm9pZDE4SHdNb2R1bGVDb2xsZWN0aW9uMTlnZXREZXZpY2VEZXNjcmlwdG9yRWpQS2NTMl9iKzQ1OCkKLTA2LTE1IDE5OjU3OjMzLjY3NyAyNjE5MiAyNjE5MiBGIERFQlVHICAgOiAgICAgIzA0IHBjIDAwMDFkZTQ3ICAvc3lzdGVtL2xpYi9saWJhdWRpb3BvbGljeW1hbmFnZXJkZWZhdWx0LnNvIChfWk43YW5kcm9pZDE4QXVkaW9Qb2xpY3lNYW5hZ2VyMjdzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnRFajI0YXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90UEtjUzNfKzE3OCkKLTA2LTE1IDE5OjU3OjMzLjY3NyAyNjE5MiAyNjE5MiBGIERFQlVHICAgOiAgICAgIzA1IHBjIDAwMDBhMDA5ICAvc3lzdGVtL2xpYi9saWJhdWRpb3BvbGljeXNlcnZpY2Uuc28KLTA2LTE1IDE5OjU3OjMzLjY3NyAyNjE5MiAyNjE5MiBGIERFQlVHICAgOiAgICAgIzA2IHBjIDAwMGEwMWE1ICAvc3lzdGVtL2xpYi9saWJtZWRpYS5zbyAoX1pON2FuZHJvaWQyMEJuQXVkaW9Qb2xpY3lTZXJ2aWNlMTBvblRyYW5zYWN0RWpSS05TXzZQYXJjZWxFUFMxX2orMTI1NikKLTA2LTE1IDE5OjU3OjMzLjY3NyAyNjE5MiAyNjE5MiBGIERFQlVHICAgOiAgICAgIzA3IHBjIDAwMDM1OWMzICAvc3lzdGVtL2xpYi9saWJiaW5kZXIuc28gKF9aTjdhbmRyb2lkN0JCaW5kZXI4dHJhbnNhY3RFalJLTlNfNlBhcmNlbEVQUzFfais3MCkKLTA2LTE1IDE5OjU3OjMzLjY3NyAyNjE5MiAyNjE5MiBGIERFQlVHICAgOiAgICAgIzA4IHBjIDAwMDNkMWJiICAvc3lzdGVtL2xpYi9saWJiaW5kZXIuc28gKF9aTjdhbmRyb2lkMTRJUENUaHJlYWRTdGF0ZTE0ZXhlY3V0ZUNvbW1hbmRFaSs3MDIpCi0wNi0xNSAxOTo1NzozMy42NzcgMjYxOTIgMjYxOTIgRiBERUJVRyAgIDogICAgICMwOSBwYyAwMDAzY2UwNyAgL3N5c3RlbS9saWIvbGliYmluZGVyLnNvIChfWk43YW5kcm9pZDE0SVBDVGhyZWFkU3RhdGUyMGdldEFuZEV4ZWN1dGVDb21tYW5kRXYrMTE0KQotMDYtMTUgMTk6NTc6MzMuNjc3IDI2MTkyIDI2MTkyIEYgREVCVUcgICA6ICAgICAjMTAgcGMgMDAwM2QzMWIgIC9zeXN0ZW0vbGliL2xpYmJpbmRlci5zbyAoX1pON2FuZHJvaWQxNElQQ1RocmVhZFN0YXRlMTRqb2luVGhyZWFkUG9vbEViKzQ2KQotMDYtMTUgMTk6NTc6MzMuNjc4IDI2MTkyIDI2MTkyIEYgREVCVUcgICA6ICAgICAjMTEgcGMgMDAwNGY4YzUgIC9zeXN0ZW0vbGliL2xpYmJpbmRlci5zbwotMDYtMTUgMTk6NTc6MzMuNjc4IDI2MTkyIDI2MTkyIEYgREVCVUcgICA6ICAgICAjMTIgcGMgMDAwMGUzNDUgIC9zeXN0ZW0vbGliL2xpYnV0aWxzLnNvIChfWk43YW5kcm9pZDZUaHJlYWQxMV90aHJlYWRMb29wRVB2KzE0MCkKLTA2LTE1IDE5OjU3OjMzLjY3OCAyNjE5MiAyNjE5MiBGIERFQlVHICAgOiAgICAgIzEzIHBjIDAwMDQ3MGIzICAvc3lzdGVtL2xpYi9saWJjLnNvIChfWkwxNV9fcHRocmVhZF9zdGFydFB2KzIyKQotMDYtMTUgMTk6NTc6MzMuNjc4IDI2MTkyIDI2MTkyIEYgREVCVUcgICA6ICAgICAjMTQgcGMgMDAwMTllM2QgIC9zeXN0ZW0vbGliL2xpYmMuc28gKF9fc3RhcnRfdGhyZWFkKzYpCi0wNi0xNSAxOTo1NzozMy44MzkgICA5MzQgIDI5OTEgVyBOYXRpdmVDcmFzaExpc3RlbmVyOiBDb3VsZG4ndCBmaW5kIFByb2Nlc3NSZWNvcmQgZm9yIHBpZCAxMjczNgotMDYtMTUgMTk6NTc6MzMuODQ2ICAgOTM0ICAgOTUyIEkgQm9vdFJlY2VpdmVyOiBDb3B5aW5nIC9kYXRhL3RvbWJzdG9uZXMvdG9tYnN0b25lXzAxIHRvIERyb3BCb3ggKFNZU1RFTV9UT01CU1RPTkUpCi0wNi0xNSAxOTo1NzozNS4xMzAgMjYyMDEgMjYyMjcgRiBsaWJjICAgIDogRmF0YWwgc2lnbmFsIDExIChTSUdTRUdWKSwgY29kZSAxLCBmYXVsdCBhZGRyIDB4MCBpbiB0aWQgMjYyMjcgKEJpbmRlcjoyNjIwMV8zKQotMDYtMTUgMTk6NTc6MzUuMTMwIDI2MjAxIDI2MjI4IEQgUGVybWlzc2lvbkNhY2hlOiBjaGVja2luZyBhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX0FVRElPX1NFVFRJTkdTIGZvciB1aWQ9MTAwMCA9PiBncmFudGVkICgzMTggdXMpCi0wNi0xNSAxOTo1NzozNS4xMzAgICAzNzkgICAzNzkgVyAgICAgICAgIDogZGVidWdnZXJkOiBoYW5kbGluZyByZXF1ZXN0OiBwaWQ9MjYyMDEgdWlkPTEwNDEgZ2lkPTEwMDUgdGlkPTI2MjI3Ci0wNi0xNSAxOTo1NzozNS4xMzEgMjYyMDEgMjYyMTIgRCBhdWRpb19od19wcmltYXJ5OiBzZWxlY3RfZGV2aWNlczogY2hhbmdpbmcgdXNlIGNhc2UgbG93LWxhdGVuY3ktcGxheWJhY2sgb3V0cHV0IGRldmljZSBmcm9tKDA6IG5vbmUsIGFjZGIgLTEpIHRvICgyOiBzcGVha2VyLCBhY2RiIDE0KQotMDYtMTUgMTk6NTc6MzUuMTkxIDI2MjMwIDI2MjMwIEYgREVCVUcgICA6ICoqKiAqKiogKioqICoqKiAqKiogKioqICoqKiAqKiogKioqICoqKiAqKiogKioqICoqKiAqKiogKioqICoqKgotMDYtMTUgMTk6NTc6MzUuMTkxIDI2MjMwIDI2MjMwIEYgREVCVUcgICA6IEJ1aWxkIGZpbmdlcnByaW50OiAnZ29vZ2xlL2J1bGxoZWFkL2J1bGxoZWFkOjcuMS4yL04yRzQ4Qy80MTA0MDEwOnVzZXJkZWJ1Zy9kZXYta2V5cycKLTA2LTE1IDE5OjU3OjM1LjE5MSAyNjIzMCAyNjIzMCBGIERFQlVHICAgOiBSZXZpc2lvbjogJ3Jldl8xLjAnCi0wNi0xNSAxOTo1NzozNS4xOTEgMjYyMzAgMjYyMzAgRiBERUJVRyAgIDogQUJJOiAnYXJtJwotMDYtMTUgMTk6NTc6MzUuMTkxIDI2MjMwIDI2MjMwIEYgREVCVUcgICA6IHBpZDogMjYyMDEsIHRpZDogMjYyMjcsIG5hbWU6IEJpbmRlcjoyNjIwMV8zICA+Pj4gL3N5c3RlbS9iaW4vYXVkaW9zZXJ2ZXIgPDw8Ci0wNi0xNSAxOTo1NzozNS4xOTEgMjYyMzAgMjYyMzAgRiBERUJVRyAgIDogc2lnbmFsIDExIChTSUdTRUdWKSwgY29kZSAxIChTRUdWX01BUEVSUiksIGZhdWx0IGFkZHIgMHgwCi0wNi0xNSAxOTo1NzozNS4xOTEgMjYyMzAgMjYyMzAgRiBERUJVRyAgIDogICAgIHIwIDAwMDAwMDAwICByMSAwMDAwMDAwMCAgcjIgMDAwMDAwNWYgIHIzIDAwMDAwMDAwCi0wNi0xNSAxOTo1NzozNS4xOTEgMjYyMzAgMjYyMzAgRiBERUJVRyAgIDogICAgIHI0IGZmZmZmZmZmICByNSAwMDAwMDAwMCAgcjYgZTQ5YmIwMDAgIHI3IDAwMDAwMDAxCi0wNi0xNSAxOTo1NzozNS4xOTEgMjYyMzAgMjYyMzAgRiBERUJVRyAgIDogICAgIHI4IDAwMDAwMDA0ICByOSBlNmI1MzExNCAgc2wgZTZiMTM5MDAgIGZwIDAwMDAwMDAwCi0wNi0xNSAxOTo1NzozNS4xOTEgMjYyMzAgMjYyMzAgRiBERUJVRyAgIDogICAgIGlwIGU3NDZiZDg4ICBzcCBlNGMwMDljOCAgbHIgZTc0MzNiYzUgIHBjIGU3M2ZjYWY0ICBjcHNyIDYwMDAwMDMwCi0wNi0xNSAxOTo1NzozNS4xOTUgMjYyMzAgMjYyMzAgRiBERUJVRyAgIDoKLTA2LTE1IDE5OjU3OjM1LjE5NSAyNjIzMCAyNjIzMCBGIERFQlVHICAgOiBiYWNrdHJhY2U6Ci0wNi0xNSAxOTo1NzozNS4xOTUgMjYyMzAgMjYyMzAgRiBERUJVRyAgIDogICAgICMwMCBwYyAwMDAxOGFmNCAgL3N5c3RlbS9saWIvbGliYy5zbyAoc3RybGVuKzcxKQotMDYtMTUgMTk6NTc6MzUuMTk1IDI2MjMwIDI2MjMwIEYgREVCVUcgICA6ICAgICAjMDEgcGMgMDAwNGZiYzEgIC9zeXN0ZW0vbGliL2xpYmMuc28gKF9fc3RybGVuX2Noays0KQotMDYtMTUgMTk6NTc6MzUuMTk1IDI2MjMwIDI2MjMwIEYgREVCVUcgICA6ICAgICAjMDIgcGMgMDAwMGM1OTkgIC9zeXN0ZW0vbGliL2xpYnV0aWxzLnNvIChfWk43YW5kcm9pZDdTdHJpbmc4QzJFUEtjKzEyKQotMDYtMTUgMTk6NTc6MzUuMTk1IDI2MjMwIDI2MjMwIEYgREVCVUcgICA6ICAgICAjMDMgcGMgMDAwMmZkYmYgIC9zeXN0ZW0vbGliL2xpYmF1ZGlvcG9saWN5bWFuYWdlcmRlZmF1bHQuc28gKF9aTks3YW5kcm9pZDE4SHdNb2R1bGVDb2xsZWN0aW9uMTlnZXREZXZpY2VEZXNjcmlwdG9yRWpQS2NTMl9iKzQ1OCkKLTA2LTE1IDE5OjU3OjM1LjE5NiAyNjIzMCAyNjIzMCBGIERFQlVHICAgOiAgICAgIzA0IHBjIDAwMDFkZTQ3ICAvc3lzdGVtL2xpYi9saWJhdWRpb3BvbGljeW1hbmFnZXJkZWZhdWx0LnNvIChfWk43YW5kcm9pZDE4QXVkaW9Qb2xpY3lNYW5hZ2VyMjdzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnRFajI0YXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90UEtjUzNfKzE3OCkKLTA2LTE1IDE5OjU3OjM1LjE5NiAyNjIzMCAyNjIzMCBGIERFQlVHICAgOiAgICAgIzA1IHBjIDAwMDBhMDA5ICAvc3lzdGVtL2xpYi9saWJhdWRpb3BvbGljeXNlcnZpY2Uuc28KLTA2LTE1IDE5OjU3OjM1LjE5NiAyNjIzMCAyNjIzMCBGIERFQlVHICAgOiAgICAgIzA2IHBjIDAwMGEwMWE1ICAvc3lzdGVtL2xpYi9saWJtZWRpYS5zbyAoX1pON2FuZHJvaWQyMEJuQXVkaW9Qb2xpY3lTZXJ2aWNlMTBvblRyYW5zYWN0RWpSS05TXzZQYXJjZWxFUFMxX2orMTI1NikKLTA2LTE1IDE5OjU3OjM1LjE5NiAyNjIzMCAyNjIzMCBGIERFQlVHICAgOiAgICAgIzA3IHBjIDAwMDM1OWMzICAvc3lzdGVtL2xpYi9saWJiaW5kZXIuc28gKF9aTjdhbmRyb2lkN0JCaW5kZXI4dHJhbnNhY3RFalJLTlNfNlBhcmNlbEVQUzFfais3MCkKLTA2LTE1IDE5OjU3OjM1LjE5NiAyNjIzMCAyNjIzMCBGIERFQlVHICAgOiAgICAgIzA4IHBjIDAwMDNkMWJiICAvc3lzdGVtL2xpYi9saWJiaW5kZXIuc28gKF9aTjdhbmRyb2lkMTRJUENUaHJlYWRTdGF0ZTE0ZXhlY3V0ZUNvbW1hbmRFaSs3MDIpCi0wNi0xNSAxOTo1NzozNS4xOTYgMjYyMzAgMjYyMzAgRiBERUJVRyAgIDogICAgICMwOSBwYyAwMDAzY2UwNyAgL3N5c3RlbS9saWIvbGliYmluZGVyLnNvIChfWk43YW5kcm9pZDE0SVBDVGhyZWFkU3RhdGUyMGdldEFuZEV4ZWN1dGVDb21tYW5kRXYrMTE0KQotMDYtMTUgMTk6NTc6MzUuMTk2IDI2MjMwIDI2MjMwIEYgREVCVUcgICA6ICAgICAjMTAgcGMgMDAwM2QzMWIgIC9zeXN0ZW0vbGliL2xpYmJpbmRlci5zbyAoX1pON2FuZHJvaWQxNElQQ1RocmVhZFN0YXRlMTRqb2luVGhyZWFkUG9vbEViKzQ2KQotMDYtMTUgMTk6NTc6MzUuMTk2IDI2MjMwIDI2MjMwIEYgREVCVUcgICA6ICAgICAjMTEgcGMgMDAwNGY4YzUgIC9zeXN0ZW0vbGliL2xpYmJpbmRlci5zbwotMDYtMTUgMTk6NTc6MzUuMTk2IDI2MjMwIDI2MjMwIEYgREVCVUcgICA6ICAgICAjMTIgcGMgMDAwMGUzNDUgIC9zeXN0ZW0vbGliL2xpYnV0aWxzLnNvIChfWk43YW5kcm9pZDZUaHJlYWQxMV90aHJlYWRMb29wRVB2KzE0MCkKLTA2LTE1IDE5OjU3OjM1LjE5NiAyNjIzMCAyNjIzMCBGIERFQlVHICAgOiAgICAgIzEzIHBjIDAwMDQ3MGIzICAvc3lzdGVtL2xpYi9saWJjLnNvIChfWkwxNV9fcHRocmVhZF9zdGFydFB2KzIyKQotMDYtMTUgMTk6NTc6MzUuMTk2IDI2MjMwIDI2MjMwIEYgREVCVUcgICA6ICAgICAjMTQgcGMgMDAwMTllM2QgIC9zeXN0ZW0vbGliL2xpYmMuc28gKF9fc3RhcnRfdGhyZWFkKzYpCi0wNi0xNSAxOTo1NzozNS4zNDYgICA5MzQgIDI5OTEgVyBOYXRpdmVDcmFzaExpc3RlbmVyOiBDb3VsZG4ndCBmaW5kIFByb2Nlc3NSZWNvcmQgZm9yIHBpZCAyNjIwMQotMDYtMTUgMTk6NTc6MzUuMzQ2IDI2MjMwIDI2MjMwIEUgICAgICAgICA6IEFNIGRhdGEgd3JpdGUgZmFpbGVkOiBCcm9rZW4gcGlwZQotMDYtMTUgMTk6NTc6NDAuNjA1IDI2MjQ2IDI2MjYxIEQgYXVkaW9faHdfcHJpbWFyeTogZW5hYmxlX3NuZF9kZXZpY2U6IHNuZF9kZXZpY2UoNzg6IHZpLWZlZWRiYWNrKQotMDYtMTUgMTk6NTc6NDAuNjA2IDI2MjQ2IDI2MjYxIEQgYXVkaW9faHdfcHJpbWFyeTogZW5hYmxlX2F1ZGlvX3JvdXRlOiB1c2VjYXNlKDIxKSBhcHBseSBhbmQgdXBkYXRlIG1peGVyIHBhdGg6IHNwa3ItdmktcmVjb3JkCi0wNi0xNSAxOTo1Nzo0MC42NzMgMjYyODMgMjYyODMgRiBERUJVRyAgIDogKioqICoqKiAqKiogKioqICoqKiAqKiogKioqICoqKiAqKiogKioqICoqKiAqKiogKioqICoqKiAqKiogKioqCi0wNi0xNSAxOTo1Nzo0MC42NzQgMjYyODMgMjYyODMgRiBERUJVRyAgIDogQnVpbGQgZmluZ2VycHJpbnQ6ICdnb29nbGUvYnVsbGhlYWQvYnVsbGhlYWQ6Ny4xLjIvTjJHNDhDLzQxMDQwMTA6dXNlcmRlYnVnL2Rldi1rZXlzJwotMDYtMTUgMTk6NTc6NDAuNjc0IDI2MjgzIDI2MjgzIEYgREVCVUcgICA6IFJldmlzaW9uOiAncmV2XzEuMCcKLTA2LTE1IDE5OjU3OjQwLjY3NCAyNjI4MyAyNjI4MyBGIERFQlVHICAgOiBBQkk6ICdhcm0nCi0wNi0xNSAxOTo1Nzo0MC42NzQgMjYyODMgMjYyODMgRiBERUJVRyAgIDogcGlkOiAyNjI0NiwgdGlkOiAyNjI4MiwgbmFtZTogQmluZGVyOjI2MjQ2XzUgID4+PiAvc3lzdGVtL2Jpbi9hdWRpb3NlcnZlciA8PDwKLTA2LTE1IDE5OjU3OjQwLjY3NCAyNjI4MyAyNjI4MyBGIERFQlVHICAgOiBzaWduYWwgMTEgKFNJR1NFR1YpLCBjb2RlIDEgKFNFR1ZfTUFQRVJSKSwgZmF1bHQgYWRkciAweDAKLTA2LTE1IDE5OjU3OjQwLjY3NCAyNjI4MyAyNjI4MyBGIERFQlVHICAgOiAgICAgcjAgMDAwMDAwMDAgIHIxIDAwMDAwMDAwICByMiAwMDAwMDA1ZiAgcjMgMDAwMDAwMDAKLTA2LTE1IDE5OjU3OjQwLjY3NCAyNjI4MyAyNjI4MyBGIERFQlVHICAgOiAgICAgcjQgZmZmZmZmZmYgIHI1IDAwMDAwMDAwICByNiBlYjc1MDAwMCAgcjcgMDAwMDAwMDEKLTA2LTE1IDE5OjU3OjQwLjY3NCAyNjI4MyAyNjI4MyBGIERFQlVHICAgOiAgICAgcjggMDAwMDAwMDQgIHI5IGVkOTUzMTE0ICBzbCBlZDkxMzkwMCAgZnAgMDAwMDAwMDAKLTA2LTE1IDE5OjU3OjQwLjY3NCAyNjI4MyAyNjI4MyBGIERFQlVHICAgOiAgICAgaXAgZWRhOGJkODggIHNwIGViNGZkOWM4ICBsciBlZGE1M2JjNSAgcGMgZWRhMWNhZjQgIGNwc3IgNjAwMDAwMzAKLTA2LTE1IDE5OjU3OjQwLjY3OSAyNjI4MyAyNjI4MyBGIERFQlVHICAgOgotMDYtMTUgMTk6NTc6NDAuNjc5IDI2MjgzIDI2MjgzIEYgREVCVUcgICA6IGJhY2t0cmFjZToKLTA2LTE1IDE5OjU3OjQwLjY3OSAyNjI4MyAyNjI4MyBGIERFQlVHICAgOiAgICAgIzAwIHBjIDAwMDE4YWY0ICAvc3lzdGVtL2xpYi9saWJjLnNvIChzdHJsZW4rNzEpCi0wNi0xNSAxOTo1Nzo0MC42NzkgMjYyODMgMjYyODMgRiBERUJVRyAgIDogICAgICMwMSBwYyAwMDA0ZmJjMSAgL3N5c3RlbS9saWIvbGliYy5zbyAoX19zdHJsZW5fY2hrKzQpCi0wNi0xNSAxOTo1Nzo0MC42NzkgMjYyODMgMjYyODMgRiBERUJVRyAgIDogICAgICMwMiBwYyAwMDAwYzU5OSAgL3N5c3RlbS9saWIvbGlidXRpbHMuc28gKF9aTjdhbmRyb2lkN1N0cmluZzhDMkVQS2MrMTIpCi0wNi0xNSAxOTo1Nzo0MC42NzkgMjYyODMgMjYyODMgRiBERUJVRyAgIDogICAgICMwMyBwYyAwMDAyZmRiZiAgL3N5c3RlbS9saWIvbGliYXVkaW9wb2xpY3ltYW5hZ2VyZGVmYXVsdC5zbyAoX1pOSzdhbmRyb2lkMThId01vZHVsZUNvbGxlY3Rpb24xOWdldERldmljZURlc2NyaXB0b3JFalBLY1MyX2IrNDU4KQotMDYtMTUgMTk6NTc6NDAuNjc5IDI2MjgzIDI2MjgzIEYgREVCVUcgICA6ICAgICAjMDQgcGMgMDAwMWRlNDcgIC9zeXN0ZW0vbGliL2xpYmF1ZGlvcG9saWN5bWFuYWdlcmRlZmF1bHQuc28gKF9aTjdhbmRyb2lkMThBdWRpb1BvbGljeU1hbmFnZXIyN3NldERldmljZUNvbm5lY3Rpb25TdGF0ZUludEVqMjRhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3RQS2NTM18rMTc4KQotMDYtMTUgMTk6NTc6NDAuNjc5IDI2MjgzIDI2MjgzIEYgREVCVUcgICA6ICAgICAjMDUgcGMgMDAwMGEwMDkgIC9zeXN0ZW0vbGliL2xpYmF1ZGlvcG9saWN5c2VydmljZS5zbwotMDYtMTUgMTk6NTc6NDAuNjgwIDI2MjgzIDI2MjgzIEYgREVCVUcgICA6ICAgICAjMDYgcGMgMDAwYTAxYTUgIC9zeXN0ZW0vbGliL2xpYm1lZGlhLnNvIChfWk43YW5kcm9pZDIwQm5BdWRpb1BvbGljeVNlcnZpY2UxMG9uVHJhbnNhY3RFalJLTlNfNlBhcmNlbEVQUzFfaisxMjU2KQotMDYtMTUgMTk6NTc6NDAuNjgwIDI2MjgzIDI2MjgzIEYgREVCVUcgICA6ICAgICAjMDcgcGMgMDAwMzU5YzMgIC9zeXN0ZW0vbGliL2xpYmJpbmRlci5zbyAoX1pON2FuZHJvaWQ3QkJpbmRlcjh0cmFuc2FjdEVqUktOU182UGFyY2VsRVBTMV9qKzcwKQotMDYtMTUgMTk6NTc6NDAuNjgwIDI2MjgzIDI2MjgzIEYgREVCVUcgICA6ICAgICAjMDggcGMgMDAwM2QxYmIgIC9zeXN0ZW0vbGliL2xpYmJpbmRlci5zbyAoX1pON2FuZHJvaWQxNElQQ1RocmVhZFN0YXRlMTRleGVjdXRlQ29tbWFuZEVpKzcwMikKLTA2LTE1IDE5OjU3OjQwLjY4MCAyNjI4MyAyNjI4MyBGIERFQlVHICAgOiAgICAgIzA5IHBjIDAwMDNjZTA3ICAvc3lzdGVtL2xpYi9saWJiaW5kZXIuc28gKF9aTjdhbmRyb2lkMTRJUENUaHJlYWRTdGF0ZTIwZ2V0QW5kRXhlY3V0ZUNvbW1hbmRFdisxMTQpCi0wNi0xNSAxOTo1Nzo0MC42ODAgMjYyODMgMjYyODMgRiBERUJVRyAgIDogICAgICMxMCBwYyAwMDAzZDMxYiAgL3N5c3RlbS9saWIvbGliYmluZGVyLnNvIChfWk43YW5kcm9pZDE0SVBDVGhyZWFkU3RhdGUxNGpvaW5UaHJlYWRQb29sRWIrNDYpCi0wNi0xNSAxOTo1Nzo0MC42ODAgMjYyODMgMjYyODMgRiBERUJVRyAgIDogICAgICMxMSBwYyAwMDA0ZjhjNSAgL3N5c3RlbS9saWIvbGliYmluZGVyLnNvCi0wNi0xNSAxOTo1Nzo0MC42ODAgMjYyODMgMjYyODMgRiBERUJVRyAgIDogICAgICMxMiBwYyAwMDAwZTM0NSAgL3N5c3RlbS9saWIvbGlidXRpbHMuc28gKF9aTjdhbmRyb2lkNlRocmVhZDExX3RocmVhZExvb3BFUHYrMTQwKQotMDYtMTUgMTk6NTc6NDAuNjgwIDI2MjgzIDI2MjgzIEYgREVCVUcgICA6ICAgICAjMTMgcGMgMDAwNDcwYjMgIC9zeXN0ZW0vbGliL2xpYmMuc28gKF9aTDE1X19wdGhyZWFkX3N0YXJ0UHYrMjIpCi0wNi0xNSAxOTo1Nzo0MC42ODAgMjYyODMgMjYyODMgRiBERUJVRyAgIDogICAgICMxNCBwYyAwMDAxOWUzZCAgL3N5c3RlbS9saWIvbGliYy5zbyAoX19zdGFydF90aHJlYWQrNikKLTA2LTE1IDE5OjU3OjQwLjg4MiAgIDkzNCAgMjk5MSBXIE5hdGl2ZUNyYXNoTGlzdGVuZXI6IENvdWxkbid0IGZpbmQgUHJvY2Vzc1JlY29yZCBmb3IgcGlkIDI2MjQ2Ci0wNi0xNSAxOTo1Nzo0MC44ODkgICA5MzQgICA5NTIgSSBCb290UmVjZWl2ZXI6IENvcHlpbmcgL2RhdGEvdG9tYnN0b25lcy90b21ic3RvbmVfMDMgdG8gRHJvcEJveCAoU1lTVEVNX1RPTUJTVE9ORSkKLTA5LTIzIDAxOjU1OjQzLjAyMiAgIDI0NSAgIDI0NSBGIGluc3RhbGxkOiB1dGlscy5jcHA6NjddIENoZWNrIGZhaWxlZDogaXNfdmFsaWRfcGFja2FnZV9uYW1lKHBhY2thZ2VfbmFtZSkgPT0gMAotLS0tLS0tLS0tIGJlZ2lubmluZyBvZiBjcmFzaAotMDktMjMgMDE6NTU6NDMuMDIyICAgMjQ1ICAgMjQ1IEYgbGliYyAgICA6IEZhdGFsIHNpZ25hbCA2IChTSUdBQlJUKSwgY29kZSAtNiBpbiB0aWQgMjQ1IChpbnN0YWxsZCkKLTA5LTIzIDAxOjU1OjQzLjAyMiAgIDE2NiAgIDE2NiBXICAgICAgICAgOiBkZWJ1Z2dlcmQ6IGhhbmRsaW5nIHJlcXVlc3Q6IHBpZD0yNDUgdWlkPTAgZ2lkPTAgdGlkPTI0NQotMDktMjMgMDE6NTU6NDMuMDI2ICAgNTQ2ICAgNTQ2IEUgICAgICAgICA6IGRlYnVnZ2VyZDogVW5hYmxlIHRvIGNvbm5lY3QgdG8gYWN0aXZpdHkgbWFuYWdlciAoY29ubmVjdCBmYWlsZWQ6IENvbm5lY3Rpb24gcmVmdXNlZCkKLTA5LTIzIDAxOjU1OjQzLjA3NiAgIDU0NiAgIDU0NiBGIERFQlVHICAgOiAqKiogKioqICoqKiAqKiogKioqICoqKiAqKiogKioqICoqKiAqKiogKioqICoqKiAqKiogKioqICoqKiAqKioKLTA5LTIzIDAxOjU1OjQzLjA3NiAgIDU0NiAgIDU0NiBGIERFQlVHICAgOiBCdWlsZCBmaW5nZXJwcmludDogJ2dvb2dsZS9yeXUvZHJhZ29uOjcuMS4yL04yRzQ4Qy80MTA0MDEwOnVzZXJkZWJ1Zy9kZXYta2V5cycKLTA5LTIzIDAxOjU1OjQzLjA3NiAgIDU0NiAgIDU0NiBGIERFQlVHICAgOiBSZXZpc2lvbjogJzAnCi0wOS0yMyAwMTo1NTo0My4wNzYgICA1NDYgICA1NDYgRiBERUJVRyAgIDogQUJJOiAnYXJtNjQnCi0wOS0yMyAwMTo1NTo0My4wNzcgICA1NDYgICA1NDYgRiBERUJVRyAgIDogcGlkOiAyNDUsIHRpZDogMjQ1LCBuYW1lOiBpbnN0YWxsZCAgPj4+IC9zeXN0ZW0vYmluL2luc3RhbGxkIDw8PAotMDktMjMgMDE6NTU6NDMuMDc3ICAgNTQ2ICAgNTQ2IEYgREVCVUcgICA6IHNpZ25hbCA2IChTSUdBQlJUKSwgY29kZSAtNiAoU0lfVEtJTEwpLCBmYXVsdCBhZGRyIC0tLS0tLS0tCi0wOS0yMyAwMTo1NTo0My4wNzcgICA1NDYgICA1NDYgRiBERUJVRyAgIDogQWJvcnQgbWVzc2FnZTogJ3V0aWxzLmNwcDo2N10gQ2hlY2sgZmFpbGVkOiBpc192YWxpZF9wYWNrYWdlX25hbWUocGFja2FnZV9uYW1lKSA9PSAwICcKLTA5LTIzIDAxOjU1OjQzLjA3NyAgIDU0NiAgIDU0NiBGIERFQlVHICAgOiAgICAgeDAgICAwMDAwMDAwMDAwMDAwMDAwICB4MSAgIDAwMDAwMDAwMDAwMDAwZjUgIHgyICAgMDAwMDAwMDAwMDAwMDAwNiAgeDMgICAwMDAwMDAwMDAwMDAwMDA4Ci0wOS0yMyAwMTo1NTo0My4wNzggICA1NDYgICA1NDYgRiBERUJVRyAgIDogICAgIHg0ICAgMDAwMDAwMDAwMDAwMDAwMCAgeDUgICAwMDAwMDAwMDAwMDAwMDAwICB4NiAgIDAwMDAwMDc2YTQxNzIwMDAgIHg3ICAgMDAwMDAwMDAwMDAwMDAwMAotMDktMjMgMDE6NTU6NDMuMDc4ICAgNTQ2ICAgNTQ2IEYgREVCVUcgICA6ICAgICB4OCAgIDAwMDAwMDAwMDAwMDAwODMgIHg5ICAgZmZmZmZmZmZmZmZmZmZkZiAgeDEwICAwMDAwMDAwMDAwMDAwMDAwICB4MTEgIDAwMDAwMDAwMDAwMDAwMDEKLTA5LTIzIDAxOjU1OjQzLjA3OCAgIDU0NiAgIDU0NiBGIERFQlVHICAgOiAgICAgeDEyICAwMDAwMDAwMDAwMDAwMDE4ICB4MTMgIDAwMDAwMDAwMDAwMDAwMDAgIHgxNCAgMDAwMDAwMDAwMDAwMDAwMCAgeDE1ICAwMDAxNTdkZTk1YjM2NWYwCi0wOS0yMyAwMTo1NTo0My4wNzggICA1NDYgICA1NDYgRiBERUJVRyAgIDogICAgIHgxNiAgMDAwMDAwNzZhNDA5OWVlMCAgeDE3ICAwMDAwMDA3NmE0MDQzYjI0ICB4MTggIDAwMDAwMDAwMDAwMDAwMDAgIHgxOSAgMDAwMDAwNzZhNDIyN2I0MAotMDktMjMgMDE6NTU6NDMuMDc4ICAgNTQ2ICAgNTQ2IEYgREVCVUcgICA6ICAgICB4MjAgIDAwMDAwMDAwMDAwMDAwMDYgIHgyMSAgMDAwMDAwNzZhNDIyN2E5OCAgeDIyICAwMDAwMDAwMDAwMDAwMDE0ICB4MjMgIDAwMDAwMDAwMDAwMDAwMDUKLTA5LTIzIDAxOjU1OjQzLjA3OCAgIDU0NiAgIDU0NiBGIERFQlVHICAgOiAgICAgeDI0ICAwMDAwMDA3NmEzODM0MDQwICB4MjUgIDAwMDAwMDAwMDAwMDAwMDAgIHgyNiAgMDAwMDAwMDAwMDAwMDAwNSAgeDI3ICAwMDAwMDAwMDAwMDAwMDA2Ci0wOS0yMyAwMTo1NTo0My4wNzggICA1NDYgICA1NDYgRiBERUJVRyAgIDogICAgIHgyOCAgMDAwMDAwN2ZmOGE3Nzg3OSAgeDI5ICAwMDAwMDA3ZmY4YTc3N2YwICB4MzAgIDAwMDAwMDc2YTQwNDBmNTAKLTA5LTIzIDAxOjU1OjQzLjA3OCAgIDU0NiAgIDU0NiBGIERFQlVHICAgOiAgICAgc3AgICAwMDAwMDA3ZmY4YTc3N2QwICBwYyAgIDAwMDAwMDc2YTQwNDNiMmMgIHBzdGF0ZSAwMDAwMDAwMDYwMDAwMDAwCi0wOS0yMyAwMTo1NTo0My4wODEgICA1NDYgICA1NDYgRiBERUJVRyAgIDoKLTA5LTIzIDAxOjU1OjQzLjA4MSAgIDU0NiAgIDU0NiBGIERFQlVHICAgOiBiYWNrdHJhY2U6Ci0wOS0yMyAwMTo1NTo0My4wODEgICA1NDYgICA1NDYgRiBERUJVRyAgIDogICAgICMwMCBwYyAwMDAwMDAwMDAwMDZiYjJjICAvc3lzdGVtL2xpYjY0L2xpYmMuc28gKHRna2lsbCs4KQotMDktMjMgMDE6NTU6NDMuMDgxICAgNTQ2ICAgNTQ2IEYgREVCVUcgICA6ICAgICAjMDEgcGMgMDAwMDAwMDAwMDA2OGY0YyAgL3N5c3RlbS9saWI2NC9saWJjLnNvIChwdGhyZWFkX2tpbGwrNjQpCi0wOS0yMyAwMTo1NTo0My4wODEgICA1NDYgICA1NDYgRiBERUJVRyAgIDogICAgICMwMiBwYyAwMDAwMDAwMDAwMDIzZjU4ICAvc3lzdGVtL2xpYjY0L2xpYmMuc28gKHJhaXNlKzI0KQotMDktMjMgMDE6NTU6NDMuMDgxICAgNTQ2ICAgNTQ2IEYgREVCVUcgICA6ICAgICAjMDMgcGMgMDAwMDAwMDAwMDAxYzgxMCAgL3N5c3RlbS9saWI2NC9saWJjLnNvIChhYm9ydCs1MikKLTA5LTIzIDAxOjU1OjQzLjA4MSAgIDU0NiAgIDU0NiBGIERFQlVHICAgOiAgICAgIzA0IHBjIDAwMDAwMDAwMDAwMDYwOWMgIC9zeXN0ZW0vbGliNjQvbGliYmFzZS5zbyAoX1pON2FuZHJvaWQ0YmFzZTEwTG9nTWVzc2FnZUQxRXYrMTA4NCkKLTA5LTIzIDAxOjU1OjQzLjA4MiAgIDU0NiAgIDU0NiBGIERFQlVHICAgOiAgICAgIzA1IHBjIDAwMDAwMDAwMDAwMWJiZDQgIC9zeXN0ZW0vYmluL2luc3RhbGxkCi0wOS0yMyAwMTo1NTo0My4wODIgICA1NDYgICA1NDYgRiBERUJVRyAgIDogICAgICMwNiBwYyAwMDAwMDAwMDAwMDFiZTM4ICAvc3lzdGVtL2Jpbi9pbnN0YWxsZAotMDktMjMgMDE6NTU6NDMuMDgyICAgNTQ2ICAgNTQ2IEYgREVCVUcgICA6ICAgICAjMDcgcGMgMDAwMDAwMDAwMDAwN2YwOCAgL3N5c3RlbS9iaW4vaW5zdGFsbGQKLTA5LTIzIDAxOjU1OjQzLjA4MiAgIDU0NiAgIDU0NiBGIERFQlVHICAgOiAgICAgIzA4IHBjIDAwMDAwMDAwMDAwMDViZDQgIC9zeXN0ZW0vYmluL2luc3RhbGxkCi0wOS0yMyAwMTo1NTo0My4wODIgICA1NDYgICA1NDYgRiBERUJVRyAgIDogICAgICMwOSBwYyAwMDAwMDAwMDAwMDFhNTk0ICAvc3lzdGVtL2xpYjY0L2xpYmMuc28gKF9fbGliY19pbml0Kzg4KQotMDktMjMgMDE6NTU6NDMuMDgyICAgNTQ2ICAgNTQ2IEYgREVCVUcgICA6ICAgICAjMTAgcGMgMDAwMDAwMDAwMDAwNDgxOCAgL3N5c3RlbS9iaW4vaW5zdGFsbGQKLTA5LTIzIDAxOjU1OjQzLjA5MyAgIDE2NiAgIDE2NiBXICAgICAgICAgOiBkZWJ1Z2dlcmQ6IHJlc3VtaW5nIHRhcmdldCAyNDUKLTA5LTIzIDAxOjU1OjQzLjEzMiAgIDUxNiAgIDUxNiBFIEluc3RhbGxlckNvbm5lY3Rpb246IHJlYWQgZXhjZXB0aW9uCi0wOS0yMyAwMTo1NTo0My4xMzIgICA1MTYgICA1MTYgSSBJbnN0YWxsZXJDb25uZWN0aW9uOiBkaXNjb25uZWN0aW5nLi4uCi0wOS0yMyAwMTo1NTo0OC40OTQgICA1MTYgICA1MzcgVyBXaW5kb3dNYW5hZ2VyOiBBcHAgZnJlZXplIHRpbWVvdXQgZXhwaXJlZC4KLTA5LTIzIDAxOjU1OjUyLjA1OCAgIDE2MyAgIDE2MyBXIGF1ZGl0ZCAgOiB0eXBlPTE0MDQgYXVkaXQoMC4wOjQpOiBlbmZvcmNpbmc9MCBvbGRfZW5mb3JjaW5nPTEgYXVpZD00Mjk0OTY3Mjk1IHNlcz00Mjk0OTY3Mjk1Ci0tLS0tLS0tLS0gYmVnaW5uaW5nIG9mIG1haW4KLTExLTAzIDAyOjU5OjQ4LjUwNSAgODA0OSAgODA0OSBJIHN0YWdlZnJpZ2h0OiB0eXBlPTE0MDAgYXVkaXQoMC4wOjEzMCk6IGF2YzogZGVuaWVkIHsgcmVhZCB9IGZvciBwYXRoPSIvZGF0YS9kYXRhL3Rlc3QxLm1wNCIgZGV2PSJzZGEzNSIgaW5vPTg2ODk2NyBzY29udGV4dD11OnI6ZHJtc2VydmVyOnMwIHRjb250ZXh0PXU6b2JqZWN0X3I6c3lzdGVtX2RhdGFfZmlsZTpzMCB0Y2xhc3M9ZmlsZSBwZXJtaXNzaXZlPTEKLTExLTAzIDAyOjU5OjQ4LjUwNSAgMzkzOSAgMzkzOSBJIGNoYXR0eSAgOiB1aWQ9MTAwNDAodTBfYTQwKSBjb20uZ29vZ2xlLmFuZHJvaWQuc2V0dXB3aXphcmQgZXhwaXJlIDUyNTI4IGxpbmVzCi0xMS0wMyAwMjo1OTo0OC41NTkgIDgwNDkgIDgwNTQgSSBPTVhDbGllbnQ6IFRyZWJsZSBJT214IG9idGFpbmVkCi0tLS0tLS0tLS0gYmVnaW5uaW5nIG9mIGNyYXNoCi0xMS0wMyAwMjo1OTo0OC44OTIgIDYzNzEgIDgwNzIgRiBERUJVRyAgIDogKioqICoqKiAqKiogKioqICoqKiAqKiogKioqICoqKiAqKiogKioqICoqKiAqKiogKioqICoqKiAqKiogKioqCi0xMS0wMyAwMjo1OTo0OC44OTIgIDYzNzEgIDgwNzIgRiBERUJVRyAgIDogQnVpbGQgZmluZ2VycHJpbnQ6ICdnb29nbGUvbWFybGluL21hcmxpbjo4LjAuMC9PQy9tc3BlY3QxMTAyMTcxMTp1c2VyZGVidWcvZGV2LWtleXMnCi0xMS0wMyAwMjo1OTo0OC44OTIgIDYzNzEgIDgwNzIgRiBERUJVRyAgIDogUmV2aXNpb246ICcwJwotMTEtMDMgMDI6NTk6NDguODkyICA2MzcxICA4MDcyIEYgREVCVUcgICA6IEFCSTogJ2FybScKLTExLTAzIDAyOjU5OjQ4Ljg5MiAgNjM3MSAgODA3MiBGIERFQlVHICAgOiBwaWQ6IDYzNzEsIHRpZDogODA3MiwgbmFtZTogbWVkaWEuY29kZWMgID4+PiBvbXhAMS4wLXNlcnZpY2UgPDw8Ci0xMS0wMyAwMjo1OTo0OC44OTIgIDYzNzEgIDgwNzIgRiBERUJVRyAgIDogc2lnbmFsIDExIChTSUdTRUdWKSwgY29kZSAxIChTRUdWX01BUEVSUiksIGZhdWx0IGFkZHIgMHhlZDAwMDAwMAotMTEtMDMgMDI6NTk6NDguOTAwICA2MzcxICA4MDcyIEYgREVCVUcgICA6ICAgICByMCBlY2ZmZGJhMCAgcjEgZWQwMDAwMDAgIHIyIGQ0NDg1NGMwICByMyAwMDAwMDA3MAotMTEtMDMgMDI6NTk6NDguOTAwICA2MzcxICA4MDcyIEYgREVCVUcgICA6ICAgICByNCAwMDAwMDA3MCAgcjUgMDAwMDIxYTAgIHI2IDAwMDAwMDcwICByNyAwMDAwMDA3MAotMTEtMDMgMDI6NTk6NDguOTAwICA2MzcxICA4MDcyIEYgREVCVUcgICA6ICAgICByOCAwMDAwMDA0MCAgcjkgZmZjMmIyNzggIHNsIGZmZmZkZTcwICBmcCAwMDAwMDA2MAotMTEtMDMgMDI6NTk6NDguOTAwICA2MzcxICA4MDcyIEYgREVCVUcgICA6ICAgICBpcCBmZmZmZmZhMCAgc3AgZDJmZmY2MjAgIGxyIDAwMDA0MzA4ICBwYyBlZDFjMGU3YyAgY3BzciBhMDBmMDAxMAotMTEtMDMgMDI6NTk6NDguOTAxICA2MzcxICA4MDcyIEYgREVCVUcgICA6Ci0xMS0wMyAwMjo1OTo0OC45MDEgIDYzNzEgIDgwNzIgRiBERUJVRyAgIDogYmFja3RyYWNlOgotMTEtMDMgMDI6NTk6NDguOTAxICA2MzcxICA4MDcyIEYgREVCVUcgICA6ICAgICAjMDAgcGMgMDAwMzRlN2MgIC9zeXN0ZW0vbGliL2xpYnN0YWdlZnJpZ2h0X3NvZnRfaGV2Y2RlYy5zbwotLS0tLS0tLS0tIGJlZ2lubmluZyBvZiBzeXN0ZW0KLTExLTAzIDAyOjU5OjQ4LjkwNSAgMTEzNSAgMTE1NSBJIEJvb3RSZWNlaXZlcjogQ29weWluZyAvZGF0YS90b21ic3RvbmVzL3RvbWJzdG9uZV8wMyB0byBEcm9wQm94IChTWVNURU1fVE9NQlNUT05FKQotMDUtMDQgMjE6NTk6MjMuNjk1ICA5MzYzICA5MzYzIEkgY3Jhc2hfZHVtcDY0OiBwZXJmb3JtaW5nIGR1bXAgb2YgcHJvY2VzcyA4MzczICh0YXJnZXQgdGlkID0gODQxNCkKLTA1LTA0IDIxOjU5OjIzLjY5NSAgOTM2MyAgOTM2MyBGIERFQlVHICAgOiAqKiogKioqICoqKiAqKiogKioqICoqKiAqKiogKioqICoqKiAqKiogKioqICoqKiAqKiogKioqICoqKiAqKioKLTA1LTA0IDIxOjU5OjIzLjY5NiAgOTM2MyAgOTM2MyBGIERFQlVHICAgOiBCdWlsZCBmaW5nZXJwcmludDogJ2dvb2dsZS90YWltZW4vdGFpbWVuOjguMS4wL09QTTIuMTcxMDI2LjAwNi5BMS80NzU2MjI4OnVzZXJkZWJ1Zy9kZXYta2V5cycKLTA1LTA0IDIxOjU5OjIzLjY5NiAgOTM2MyAgOTM2MyBGIERFQlVHICAgOiBSZXZpc2lvbjogJ3Jldl8xMCcKLTA1LTA0IDIxOjU5OjIzLjY5NiAgOTM2MyAgOTM2MyBGIERFQlVHICAgOiBBQkk6ICdhcm02NCcKLTA1LTA0IDIxOjU5OjIzLjY5NiAgOTM2MyAgOTM2MyBGIERFQlVHICAgOiBwaWQ6IDgzNzMsIHRpZDogODQxNCwgbmFtZTogYnR1IG1lc3NhZ2UgbG9vICA+Pj4gY29tLmFuZHJvaWQuYmx1ZXRvb3RoIDw8PAotMDUtMDQgMjE6NTk6MjMuNjk2ICA5MzYzICA5MzYzIEYgREVCVUcgICA6IHNpZ25hbCA2IChTSUdBQlJUKSwgY29kZSAtNiAoU0lfVEtJTEwpLCBmYXVsdCBhZGRyIC0tLS0tLS0tCi0wNS0wNCAyMTo1OToyMy43MDAgIDkzNjMgIDkzNjMgRiBERUJVRyAgIDogQWJvcnQgbWVzc2FnZTogJ1tGQVRBTDphbGxvY2F0aW9uX3RyYWNrZXIuY2MoMTQzKV0gQ2hlY2sgZmFpbGVkOiBtYXBfZW50cnkgIT0gYWxsb2NhdGlvbnMuZW5kKCkuCi0wNS0wNCAyMTo1OToyMy43MDAgIDkzNjMgIDkzNjMgRiBERUJVRyAgIDogJwotMDUtMDQgMjE6NTk6MjMuNzAwICA5MzYzICA5MzYzIEYgREVCVUcgICA6ICAgICB4MCAgIDAwMDAwMDAwMDAwMDAwMDAgIHgxICAgMDAwMDAwMDAwMDAwMjBkZSAgeDIgICAwMDAwMDAwMDAwMDAwMDA2ICB4MyAgIDAwMDAwMDAwMDAwMDAwMDgKLTA1LTA0IDIxOjU5OjIzLjcwMSAgOTM2MyAgOTM2MyBGIERFQlVHICAgOiAgICAgeDQgICA2MTNhNGM0MTU0NDE0NjViICB4NSAgIDYxM2E0YzQxNTQ0MTQ2NWIgIHg2ICAgNjEzYTRjNDE1NDQxNDY1YiAgeDcgICA2ZjY5NzQ2MTYzNmY2YzZjCi0wNS0wNCAyMTo1OToyMy43MDEgIDkzNjMgIDkzNjMgRiBERUJVRyAgIDogICAgIHg4ICAgMDAwMDAwMDAwMDAwMDA4MyAgeDkgICAwMDAwMDAwMDEwMDAwMDAwICB4MTAgIDAwMDAwMDcwM2E3YTdjODAgIHgxMSAgMDAwMDAwMDAwMDAwMDAwMQotMDUtMDQgMjE6NTk6MjMuNzAxICA5MzYzICA5MzYzIEYgREVCVUcgICA6ICAgICB4MTIgIDc0NmU2NTVmNzA2MTZkMjAgIHgxMyAgNmM2MTIwM2QyMTIwNzk3MiAgeDE0ICBmZjAwMDAwMDAwMDAwMDAwICB4MTUgIGZmZmZmZmZmZmZmZmZmZmYKLTA1LTA0IDIxOjU5OjIzLjcwMSAgOTM2MyAgOTM2MyBGIERFQlVHICAgOiAgICAgeDE2ICAwMDAwMDA2MzgwZjRhZmE4ICB4MTcgIDAwMDAwMDcwZDIwYWY1MmMgIHgxOCAgMDAwMDAwMDAwMDAwMDAwMCAgeDE5ICAwMDAwMDAwMDAwMDAyMGI1Ci0wNS0wNCAyMTo1OToyMy43MDEgIDkzNjMgIDkzNjMgRiBERUJVRyAgIDogICAgIHgyMCAgMDAwMDAwMDAwMDAwMjBkZSAgeDIxICAwMDAwMDAwMDAwMDAwMDgzICB4MjIgIDAwMDAwMDcwM2E3YTk1ODggIHgyMyAgMDAwMDAwNzAzYjhlZTAwMAotMDUtMDQgMjE6NTk6MjMuNzAxICA5MzYzICA5MzYzIEYgREVCVUcgICA6ICAgICB4MjQgIDAwMDAwMDcwM2E3YTdkMDEgIHgyNSAgMDAwMDAwNzAzYTdhOTU4OCAgeDI2ICAwMDAwMDA3MDNiYzdkOTQ4ICB4MjcgIDAwMDAwMDcwNDg0YzkyZDgKLTA1LTA0IDIxOjU5OjIzLjcwMSAgOTM2MyAgOTM2MyBGIERFQlVHICAgOiAgICAgeDI4ICAwMDAwMDAwMDAwMDAwMDA2ICB4MjkgIDAwMDAwMDcwM2E3YTdjYzAgIHgzMCAgMDAwMDAwNzBkMjA2NDc2MAotMDUtMDQgMjE6NTk6MjMuNzAxICA5MzYzICA5MzYzIEYgREVCVUcgICA6ICAgICBzcCAgIDAwMDAwMDcwM2E3YTdjODAgIHBjICAgMDAwMDAwNzBkMjA2NDc4OCAgcHN0YXRlIDAwMDAwMDAwNjAwMDAwMDAKLTA1LTA0IDIxOjU5OjIzLjc0MiAgOTM2MyAgOTM2MyBGIERFQlVHICAgOgotMDUtMDQgMjE6NTk6MjMuNzQyICA5MzYzICA5MzYzIEYgREVCVUcgICA6IGJhY2t0cmFjZToKLTA1LTA0IDIxOjU5OjIzLjc0MyAgOTM2MyAgOTM2MyBGIERFQlVHICAgOiAgICAgIzAwIHBjIDAwMDAwMDAwMDAwMWQ3ODggIC9zeXN0ZW0vbGliNjQvbGliYy5zbyAoYWJvcnQrMTIwKQotMDUtMDQgMjE6NTk6MjMuNzQzICA5MzYzICA5MzYzIEYgREVCVUcgICA6ICAgICAjMDEgcGMgMDAwMDAwMDAwMDA4MzQ3MCAgL3N5c3RlbS9saWI2NC9saWJjaHJvbWUuc28gKGJhc2U6OmRlYnVnOjpCcmVha0RlYnVnZ2VyKCkrMjApCi0wNS0wNCAyMTo1OToyMy43NDMgIDkzNjMgIDkzNjMgRiBERUJVRyAgIDogICAgICMwMiBwYyAwMDAwMDAwMDAwMDlhZmZjICAvc3lzdGVtL2xpYjY0L2xpYmNocm9tZS5zbyAobG9nZ2luZzo6TG9nTWVzc2FnZTo6fkxvZ01lc3NhZ2UoKSsxMDY4KQotMDUtMDQgMjE6NTk6MjMuNzQzICA5MzYzICA5MzYzIEYgREVCVUcgICA6ICAgICAjMDMgcGMgMDAwMDAwMDAwMDE5OTEzMCAgL3N5c3RlbS9saWI2NC9ody9ibHVldG9vdGguZGVmYXVsdC5zbyAoYWxsb2NhdGlvbl90cmFja2VyX25vdGlmeV9mcmVlKHVuc2lnbmVkIGNoYXIsIHZvaWQqKSs3MjApCi0wNS0wNCAyMTo1OToyMy43NDMgIDkzNjMgIDkzNjMgRiBERUJVRyAgIDogICAgICMwNCBwYyAwMDAwMDAwMDAwMTk5ODRjICAvc3lzdGVtL2xpYjY0L2h3L2JsdWV0b290aC5kZWZhdWx0LnNvIChvc2lfZnJlZSh2b2lkKikrMjApCi0wNS0wNCAyMTo1OToyMy43NDMgIDkzNjMgIDkzNjMgRiBERUJVRyAgIDogICAgICMwNSBwYyAwMDAwMDAwMDAwMTYzZjFjICAvc3lzdGVtL2xpYjY0L2h3L2JsdWV0b290aC5kZWZhdWx0LnNvIChsMmNfZmNyX2NsZWFudXAodF9sMmNfY2NiKikrOTIpCi0wNS0wNCAyMTo1OToyMy43NDMgIDkzNjMgIDkzNjMgRiBERUJVRyAgIDogICAgICMwNiBwYyAwMDAwMDAwMDAwMTZhZGM4ICAvc3lzdGVtL2xpYjY0L2h3L2JsdWV0b290aC5kZWZhdWx0LnNvIChsMmN1X3JlbGVhc2VfY2NiKHRfbDJjX2NjYiopKzE3NikKLTA1LTA0IDIxOjU5OjIzLjc0MyAgOTM2MyAgOTM2MyBGIERFQlVHICAgOiAgICAgIzA3IHBjIDAwMDAwMDAwMDAxNjJlYTAgIC9zeXN0ZW0vbGliNjQvaHcvYmx1ZXRvb3RoLmRlZmF1bHQuc28gKGwyY19jc21fZXhlY3V0ZSh0X2wyY19jY2IqLCB1bnNpZ25lZCBzaG9ydCwgdm9pZCopKzE4NTIpCi0wNS0wNCAyMTo1OToyMy43NDMgIDkzNjMgIDkzNjMgRiBERUJVRyAgIDogICAgICMwOCBwYyAwMDAwMDAwMDAwMTVlNGY0ICAvc3lzdGVtL2xpYjY0L2h3L2JsdWV0b290aC5kZWZhdWx0LnNvIChMMkNBX0Rpc2Nvbm5lY3RSc3AodW5zaWduZWQgc2hvcnQpKzkyKQotMDUtMDQgMjE6NTk6MjMuNzQzICA5MzYzICA5MzYzIEYgREVCVUcgICA6ICAgICAjMDkgcGMgMDAwMDAwMDAwMDE4MzhiMCAgL3N5c3RlbS9saWI2NC9ody9ibHVldG9vdGguZGVmYXVsdC5zbyAoc2RwX2Rpc2Nvbm5lY3RfaW5kKHVuc2lnbmVkIHNob3J0LCBib29sKSs1MikKLTA1LTA0IDIxOjU5OjIzLjc0MyAgOTM2MyAgOTM2MyBGIERFQlVHICAgOiAgICAgIzEwIHBjIDAwMDAwMDAwMDAxNjM1NzQgIC9zeXN0ZW0vbGliNjQvaHcvYmx1ZXRvb3RoLmRlZmF1bHQuc28gKGwyY19jc21fZXhlY3V0ZSh0X2wyY19jY2IqLCB1bnNpZ25lZCBzaG9ydCwgdm9pZCopKzM2MDApCi0wNS0wNCAyMTo1OToyMy43NDMgIDkzNjMgIDkzNjMgRiBERUJVRyAgIDogICAgICMxMSBwYyAwMDAwMDAwMDAwMTY5Zjk0ICAvc3lzdGVtL2xpYjY0L2h3L2JsdWV0b290aC5kZWZhdWx0LnNvIChsMmNfcmN2X2FjbF9kYXRhKEJUX0hEUiopKzM5ODApCi0wNS0wNCAyMTo1OToyMy43NDMgIDkzNjMgIDkzNjMgRiBERUJVRyAgIDogICAgICMxMiBwYyAwMDAwMDAwMDAwMDg0OWNjICAvc3lzdGVtL2xpYjY0L2xpYmNocm9tZS5zbyAoYmFzZTo6ZGVidWc6OlRhc2tBbm5vdGF0b3I6OlJ1blRhc2soY2hhciBjb25zdCosIGJhc2U6OlBlbmRpbmdUYXNrIGNvbnN0JikrMTg4KQotMDUtMDQgMjE6NTk6MjMuNzQzICA5MzYzICA5MzYzIEYgREVCVUcgICA6ICAgICAjMTMgcGMgMDAwMDAwMDAwMDA5ZWZhNCAgL3N5c3RlbS9saWI2NC9saWJjaHJvbWUuc28gKGJhc2U6Ok1lc3NhZ2VMb29wOjpSdW5UYXNrKGJhc2U6OlBlbmRpbmdUYXNrIGNvbnN0JikrNDQ0KQotMDUtMDQgMjE6NTk6MjMuNzQzICA5MzYzICA5MzYzIEYgREVCVUcgICA6ICAgICAjMTQgcGMgMDAwMDAwMDAwMDA5ZjI2YyAgL3N5c3RlbS9saWI2NC9saWJjaHJvbWUuc28gKGJhc2U6Ok1lc3NhZ2VMb29wOjpEZWZlck9yUnVuUGVuZGluZ1Rhc2soYmFzZTo6UGVuZGluZ1Rhc2spKzUyKQotMDUtMDQgMjE6NTk6MjMuNzQzICA5MzYzICA5MzYzIEYgREVCVUcgICA6ICAgICAjMTUgcGMgMDAwMDAwMDAwMDA5ZjY5OCAgL3N5c3RlbS9saWI2NC9saWJjaHJvbWUuc28gKGJhc2U6Ok1lc3NhZ2VMb29wOjpEb1dvcmsoKSszNTYpCi0wNS0wNCAyMTo1OToyMy43NDMgIDkzNjMgIDkzNjMgRiBERUJVRyAgIDogICAgICMxNiBwYyAwMDAwMDAwMDAwMGEwOGE4ICAvc3lzdGVtL2xpYjY0L2xpYmNocm9tZS5zbyAoYmFzZTo6TWVzc2FnZVB1bXBEZWZhdWx0OjpSdW4oYmFzZTo6TWVzc2FnZVB1bXA6OkRlbGVnYXRlKikrMjIwKQotMDUtMDQgMjE6NTk6MjMuNzQzICA5MzYzICA5MzYzIEYgREVCVUcgICA6ICAgICAjMTcgcGMgMDAwMDAwMDAwMDBiYTEyNCAgL3N5c3RlbS9saWI2NC9saWJjaHJvbWUuc28gKGJhc2U6OlJ1bkxvb3A6OlJ1bigpKzEzNikKLTA1LTA0IDIxOjU5OjIzLjc0MyAgOTM2MyAgOTM2MyBGIERFQlVHICAgOiAgICAgIzE4IHBjIDAwMDAwMDAwMDAxMzg2NjAgIC9zeXN0ZW0vbGliNjQvaHcvYmx1ZXRvb3RoLmRlZmF1bHQuc28gKGJ0dV9tZXNzYWdlX2xvb3BfcnVuKHZvaWQqKSsyNDgpCi0wNS0wNCAyMTo1OToyMy43NDMgIDkzNjMgIDkzNjMgRiBERUJVRyAgIDogICAgICMxOSBwYyAwMDAwMDAwMDAwMWEyNGZjICAvc3lzdGVtL2xpYjY0L2h3L2JsdWV0b290aC5kZWZhdWx0LnNvICh3b3JrX3F1ZXVlX3JlYWRfY2Iodm9pZCopKzkyKQotMDUtMDQgMjE6NTk6MjMuNzQzICA5MzYzICA5MzYzIEYgREVCVUcgICA6ICAgICAjMjAgcGMgMDAwMDAwMDAwMDFhMDc1OCAgL3N5c3RlbS9saWI2NC9ody9ibHVldG9vdGguZGVmYXVsdC5zbyAocnVuX3JlYWN0b3IocmVhY3Rvcl90KiwgaW50KSszMjApCi0wNS0wNCAyMTo1OToyMy43NDMgIDkzNjMgIDkzNjMgRiBERUJVRyAgIDogICAgICMyMSBwYyAwMDAwMDAwMDAwMWEwNWVjICAvc3lzdGVtL2xpYjY0L2h3L2JsdWV0b290aC5kZWZhdWx0LnNvIChyZWFjdG9yX3N0YXJ0KHJlYWN0b3JfdCopKzg0KQotMDUtMDQgMjE6NTk6MjMuNzQzICA5MzYzICA5MzYzIEYgREVCVUcgICA6ICAgICAjMjIgcGMgMDAwMDAwMDAwMDFhMWY5NCAgL3N5c3RlbS9saWI2NC9ody9ibHVldG9vdGguZGVmYXVsdC5zbyAocnVuX3RocmVhZCh2b2lkKikrMTg0KQotMDUtMDQgMjE6NTk6MjMuNzQzICA5MzYzICA5MzYzIEYgREVCVUcgICA6ICAgICAjMjMgcGMgMDAwMDAwMDAwMDA2N2Q4MCAgL3N5c3RlbS9saWI2NC9saWJjLnNvIChfX3B0aHJlYWRfc3RhcnQodm9pZCopKzM2KQotMDUtMDQgMjE6NTk6MjMuNzQzICA5MzYzICA5MzYzIEYgREVCVUcgICA6ICAgICAjMjQgcGMgMDAwMDAwMDAwMDAxZWMxOCAgL3N5c3RlbS9saWI2NC9saWJjLnNvIChfX3N0YXJ0X3RocmVhZCs2OCkKLTEtMjUgMTk6NDc6MzUuNDE3ICA4MDgwIDExNjY1IEYgTVBFRzRFeHRyYWN0b3I6IGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRFeHRyYWN0b3IuY3BwOjY4NTMgQ0hFQ0tfRVEoICh1bnNpZ25lZClwdHJbMF0sMXUpIGZhaWxlZDogMTI5IHZzLiAxCi0xMS0yNSAxOTo0NzozNS40MTcgIDgwODAgMTE2NjUgRiBsaWJjICAgIDogRmF0YWwgc2lnbmFsIDYgKFNJR0FCUlQpLCBjb2RlIC02IGluIHRpZCAxMTY2NSAoZ2VuZXJpYykKLTExLTI1IDE5OjQ3OjM1LjQ4NyAgIDk0MCAgIDk0MCBGIERFQlVHICAgOiAqKiogKioqICoqKiAqKiogKioqICoqKiAqKiogKioqICoqKiAqKiogKioqICoqKiAqKiogKioqICoqKiAqKioKLTExLTI1IDE5OjQ3OjM1LjQ4NyAgIDk0MCAgIDk0MCBGIERFQlVHICAgOiBCdWlsZCBmaW5nZXJwcmludDogJ3NhbXN1bmcvaGVybzJxbHRlemMvaGVybzJxbHRlY2huOjYuMC4xL01NQjI5TS9HOTM1MFpDVTJBUEo2OnVzZXIvcmVsZWFzZS1rZXlzJwotMTEtMjUgMTk6NDc6MzUuNDg3ICAgOTQwICAgOTQwIEYgREVCVUcgICA6IFJldmlzaW9uOiAnMTUnCi0xMS0yNSAxOTo0NzozNS40ODcgICA5NDAgICA5NDAgRiBERUJVRyAgIDogQUJJOiAnYXJtJwotMTEtMjUgMTk6NDc6MzUuNDg3ICAgOTQwICAgOTQwIEYgREVCVUcgICA6IHBpZDogODA4MCwgdGlkOiAxMTY2NSwgbmFtZTogZ2VuZXJpYyAgPj4+IC9zeXN0ZW0vYmluL21lZGlhc2VydmVyIDw8PAotMTEtMjUgMTk6NDc6MzUuNDg3ICAgOTQwICAgOTQwIEYgREVCVUcgICA6IHNpZ25hbCA2IChTSUdBQlJUKSwgY29kZSAtNiAoU0lfVEtJTEwpLCBmYXVsdCBhZGRyIC0tLS0tLS0tCi0xMS0yNSAxOTo0NzozNS41NzcgICA5NDAgICA5NDAgRiBERUJVRyAgIDogQWJvcnQgbWVzc2FnZTogJ2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRFeHRyYWN0b3IuY3BwOjY4NTMgQ0hFQ0tfRVEoICh1bnNpZ25lZClwdHJbMF0sMXUpIGZhaWxlZDogMTI5IHZzLiAxJwotMTEtMjUgMTk6NDc6MzUuNTc3ICAgOTQwICAgOTQwIEYgREVCVUcgICA6ICAgICByMCAwMDAwMDAwMCAgcjEgMDAwMDJkOTEgIHIyIDAwMDAwMDA2ICByMyBlYjIzZjk3OAotMTEtMjUgMTk6NDc6MzUuNTc3ICAgOTQwICAgOTQwIEYgREVCVUcgICA6ICAgICByNCBlYjIzZjk4MCAgcjUgZWIyM2Y5MzAgIHI2IDAwMDAwMDA5ICByNyAwMDAwMDEwYwotMTEtMjUgMTk6NDc6MzUuNTc3ICAgOTQwICAgOTQwIEYgREVCVUcgICA6ICAgICByOCBlOWU5MTE0MCAgcjkgMDAwMDAwMDAgIHNsIDAwMDAwMDAwICBmcCAwMDAwMDNkMwotMTEtMjUgMTk6NDc6MzUuNTc3ICAgOTQwICAgOTQwIEYgREVCVUcgICA6ICAgICBpcCAwMDAwMDAwNiAgc3AgZWIyM2RiNzAgIGxyIGY3MDEzMTNkICBwYyBmNzAxNTUzOCAgY3BzciA0MDAxMDAxMAotMTEtMjUgMTk6NDc6MzUuNTk3ICAgOTQwICAgOTQwIEYgREVCVUcgICA6Ci0xMS0yNSAxOTo0NzozNS41OTcgICA5NDAgICA5NDAgRiBERUJVRyAgIDogYmFja3RyYWNlOgotMTEtMjUgMTk6NDc6MzUuNTk3ICAgOTQwICAgOTQwIEYgREVCVUcgICA6ICAgICAjMDAgcGMgMDAwNDI1MzggIC9zeXN0ZW0vbGliL2xpYmMuc28gKHRna2lsbCsxMikKLTExLTI1IDE5OjQ3OjM1LjU5NyAgIDk0MCAgIDk0MCBGIERFQlVHICAgOiAgICAgIzAxIHBjIDAwMDQwMTM5ICAvc3lzdGVtL2xpYi9saWJjLnNvIChwdGhyZWFkX2tpbGwrMzIpCi0xMS0yNSAxOTo0NzozNS41OTcgICA5NDAgICA5NDAgRiBERUJVRyAgIDogICAgICMwMiBwYyAwMDAxYzc4MyAgL3N5c3RlbS9saWIvbGliYy5zbyAocmFpc2UrMTApCi0xMS0yNSAxOTo0NzozNS41OTcgICA5NDAgICA5NDAgRiBERUJVRyAgIDogICAgICMwMyBwYyAwMDAxOTlmMSAgL3N5c3RlbS9saWIvbGliYy5zbyAoX19saWJjX2FuZHJvaWRfYWJvcnQrMzQpCi0xMS0yNSAxOTo0NzozNS41OTcgICA5NDAgICA5NDAgRiBERUJVRyAgIDogICAgICMwNCBwYyAwMDAxNzVhYyAgL3N5c3RlbS9saWIvbGliYy5zbyAoYWJvcnQrNCkKLTExLTI1IDE5OjQ3OjM1LjU5NyAgIDk0MCAgIDk0MCBGIERFQlVHICAgOiAgICAgIzA1IHBjIDAwMDA4NWU3ICAvc3lzdGVtL2xpYi9saWJjdXRpbHMuc28gKF9fYW5kcm9pZF9sb2dfYXNzZXJ0Kzg2KQotMTEtMjUgMTk6NDc6MzUuNTk3ICAgOTQwICAgOTQwIEYgREVCVUcgICA6ICAgICAjMDYgcGMgMDAwYzFmNDkgIC9zeXN0ZW0vbGliL2xpYnN0YWdlZnJpZ2h0LnNvIChfWk43YW5kcm9pZDE0TVBFRzRFeHRyYWN0b3IyNWF2Y2NfZ2V0Q29kZWNTcGVjaWZpY0luZm9FUk5TXzJzcElOU183QUJ1ZmZlckVFRVBLY2orMzkyKQotMTEtMjUgMTk6NDc6MzUuNTk3ICAgOTQwICAgOTQwIEYgREVCVUcgICA6ICAgICAjMDcgcGMgMDAwYzIxM2YgIC9zeXN0ZW0vbGliL2xpYnN0YWdlZnJpZ2h0LnNvIChfWk43YW5kcm9pZDE0TVBFRzRFeHRyYWN0b3IxNWNoZWNrQ29uZmlnRGF0YUVqUktOU18yc3BJTlNfOE1ldGFEYXRhRUVFKzIxOCkKLTExLTI1IDE5OjQ3OjM1LjU5NyAgIDk0MCAgIDk0MCBGIERFQlVHICAgOiAgICAgIzA4IHBjIDAwMGJiZDI1ICAvc3lzdGVtL2xpYi9saWJzdGFnZWZyaWdodC5zbyAoX1pON2FuZHJvaWQxNE1QRUc0RXh0cmFjdG9yMTJjaGVja1N1cHBvcnRFalJLTlNfMnNwSU5TXzhNZXRhRGF0YUVFRSsxMzYpCi0xMS0yNSAxOTo0NzozNS41OTcgICA5NDAgICA5NDAgRiBERUJVRyAgIDogICAgICMwOSBwYyAwMDBiYTU1NSAgL3N5c3RlbS9saWIvbGlic3RhZ2VmcmlnaHQuc28gKF9aTjdhbmRyb2lkMTRNUEVHNEV4dHJhY3RvcjEwcGFyc2VDaHVua0VQeGkrMTMwNjApCi0xMS0yNSAxOTo0NzozNS41OTcgICA5NDAgICA5NDAgRiBERUJVRyAgIDogICAgICMxMCBwYyAwMDBiYTMyZCAgL3N5c3RlbS9saWIvbGlic3RhZ2VmcmlnaHQuc28gKF9aTjdhbmRyb2lkMTRNUEVHNEV4dHJhY3RvcjEwcGFyc2VDaHVua0VQeGkrMTI1MDgpCi0xMS0yNSAxOTo0NzozNS41OTcgICA5NDAgICA5NDAgRiBERUJVRyAgIDogICAgICMxMSBwYyAwMDBiOGE2ZiAgL3N5c3RlbS9saWIvbGlic3RhZ2VmcmlnaHQuc28gKF9aTjdhbmRyb2lkMTRNUEVHNEV4dHJhY3RvcjEwcGFyc2VDaHVua0VQeGkrNjE3NCkKLTExLTI1IDE5OjQ3OjM1LjU5NyAgIDk0MCAgIDk0MCBGIERFQlVHICAgOiAgICAgIzEyIHBjIDAwMGI4YTZmICAvc3lzdGVtL2xpYi9saWJzdGFnZWZyaWdodC5zbyAoX1pON2FuZHJvaWQxNE1QRUc0RXh0cmFjdG9yMTBwYXJzZUNodW5rRVB4aSs2MTc0KQotMTEtMjUgMTk6NDc6MzUuNTk3ICAgOTQwICAgOTQwIEYgREVCVUcgICA6ICAgICAjMTMgcGMgMDAwYjhhNmYgIC9zeXN0ZW0vbGliL2xpYnN0YWdlZnJpZ2h0LnNvIChfWk43YW5kcm9pZDE0TVBFRzRFeHRyYWN0b3IxMHBhcnNlQ2h1bmtFUHhpKzYxNzQpCi0xMS0yNSAxOTo0NzozNS41OTcgICA5NDAgICA5NDAgRiBERUJVRyAgIDogICAgICMxNCBwYyAwMDBiOGE2ZiAgL3N5c3RlbS9saWIvbGlic3RhZ2VmcmlnaHQuc28gKF9aTjdhbmRyb2lkMTRNUEVHNEV4dHJhY3RvcjEwcGFyc2VDaHVua0VQeGkrNjE3NCkKLTExLTI1IDE5OjQ3OjM1LjU5NyAgIDk0MCAgIDk0MCBGIERFQlVHICAgOiAgICAgIzE1IHBjIDAwMGI4YTZmICAvc3lzdGVtL2xpYi9saWJzdGFnZWZyaWdodC5zbyAoX1pON2FuZHJvaWQxNE1QRUc0RXh0cmFjdG9yMTBwYXJzZUNodW5rRVB4aSs2MTc0KQotMTEtMjUgMTk6NDc6MzUuNTk3ICAgOTQwICAgOTQwIEYgREVCVUcgICA6ICAgICAjMTYgcGMgMDAwYjZlM2IgIC9zeXN0ZW0vbGliL2xpYnN0YWdlZnJpZ2h0LnNvIChfWk43YW5kcm9pZDE0TVBFRzRFeHRyYWN0b3IxMnJlYWRNZXRhRGF0YUV2Kzk0KQotMTEtMjUgMTk6NDc6MzUuNTk3ICAgOTQwICAgOTQwIEYgREVCVUcgICA6ICAgICAjMTcgcGMgMDAwYjZkYWYgIC9zeXN0ZW0vbGliL2xpYnN0YWdlZnJpZ2h0LnNvIChfWk43YW5kcm9pZDE0TVBFRzRFeHRyYWN0b3IxMWdldE1ldGFEYXRhRXYrMTApCi0xMS0yNSAxOTo0NzozNS41OTcgICA5NDAgICA5NDAgRiBERUJVRyAgIDogICAgICMxOCBwYyAwMDA4OGM1MyAgL3N5c3RlbS9saWIvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlLnNvIChfWk43YW5kcm9pZDhOdVBsYXllcjEzR2VuZXJpY1NvdXJjZTE4aW5pdEZyb21EYXRhU291cmNlRXYrMzg2KQotMTEtMjUgMTk6NDc6MzUuNTk3ICAgOTQwICAgOTQwIEYgREVCVUcgICA6ICAgICAjMTkgcGMgMDAwODliNDMgIC9zeXN0ZW0vbGliL2xpYm1lZGlhcGxheWVyc2VydmljZS5zbyAoX1pON2FuZHJvaWQ4TnVQbGF5ZXIxM0dlbmVyaWNTb3VyY2UxNG9uUHJlcGFyZUFzeW5jRXYrMjM4KQotMTEtMjUgMTk6NDc6MzUuNTk3ICAgOTQwICAgOTQwIEYgREVCVUcgICA6ICAgICAjMjAgcGMgMDAwMGI0MDUgIC9zeXN0ZW0vbGliL2xpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24uc28gKF9aTjdhbmRyb2lkOEFIYW5kbGVyMTRkZWxpdmVyTWVzc2FnZUVSS05TXzJzcElOU184QU1lc3NhZ2VFRUUrMTYpCi0xMS0yNSAxOTo0NzozNS41OTcgICA5NDAgICA5NDAgRiBERUJVRyAgIDogICAgICMyMSBwYyAwMDAwZDQyMyAgL3N5c3RlbS9saWIvbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbi5zbyAoX1pON2FuZHJvaWQ4QU1lc3NhZ2U3ZGVsaXZlckV2KzU0KQotMTEtMjUgMTk6NDc6MzUuNTk3ICAgOTQwICAgOTQwIEYgREVCVUcgICA6ICAgICAjMjIgcGMgMDAwMGJlMjkgIC9zeXN0ZW0vbGliL2xpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24uc28gKF9aTjdhbmRyb2lkN0FMb29wZXI0bG9vcEV2KzIyNCkKLTExLTI1IDE5OjQ3OjM1LjU5NyAgIDk0MCAgIDk0MCBGIERFQlVHICAgOiAgICAgIzIzIHBjIDAwMDEwMTFkICAvc3lzdGVtL2xpYi9saWJ1dGlscy5zbyAoX1pON2FuZHJvaWQ2VGhyZWFkMTFfdGhyZWFkTG9vcEVQdisxMTIpCi0xMS0yNSAxOTo0NzozNS41OTcgICA5NDAgICA5NDAgRiBERUJVRyAgIDogICAgICMyNCBwYyAwMDAzZmEzYiAgL3N5c3RlbS9saWIvbGliYy5zbyAoX1pMMTVfX3B0aHJlYWRfc3RhcnRQdiszMCkKLTExLTI1IDE5OjQ3OjM1LjU5NyAgIDk0MCAgIDk0MCBGIERFQlVHICAgOiAgICAgIzI1IHBjIDAwMDFhMDg1ICAvc3lzdGVtL2xpYi9saWJjLnNvIChfX3N0YXJ0X3RocmVhZCs2KQotMTEtMjUgMTk6NDc6MzUuODM3ICAgOTQwICAgOTQwIEYgREVCVUcgICA6Ci0xMS0yNSAxOTo0NzozNS44MzcgICA5NDAgICA5NDAgRiBERUJVRyAgIDogVG9tYnN0b25lIHdyaXR0ZW4gdG86IC9kYXRhL3RvbWJzdG9uZXMvdG9tYnN0b25lXzAxCi0tLS0tLS0tLS0gYmVnaW5uaW5nIG9mIGNyYXNoCi0wOS0wMyAxNzo0ODowNS42MjcgMTEwNzEgMTExODkgRiBsaWJjICAgIDogRmF0YWwgc2lnbmFsIDExIChTSUdTRUdWKSwgY29kZSAxLCBmYXVsdCBhZGRyIDB4ZTkzODAwMDAgaW4gdGlkIDExMTg5IChzeW50aGV0aWNfdGhyZWFkKQotMDktMDMgMTc6NDg6MDUuNzA3ICAgMzU5ICAgMzU5IFcgICAgICAgICA6IGRlYnVnZ2VyZDogaGFuZGxpbmcgcmVxdWVzdDogcGlkPTExMDcxIHVpZD0xMDQxIGdpZD0xMDA1IHRpZD0xMTE4OQotMDktMDMgMTc6NDg6MDUuNzk2ICA3MDcyICA3MDcyIEYgREVCVUcgICA6ICoqKiAqKiogKioqICoqKiAqKiogKioqICoqKiAqKiogKioqICoqKiAqKiogKioqICoqKiAqKiogKioqICoqKgotMDktMDMgMTc6NDg6MDUuNzk2ICA3MDcyICA3MDcyIEYgREVCVUcgICA6IEJ1aWxkIGZpbmdlcnByaW50OiAnZ29vZ2xlL2FuZ2xlci9hbmdsZXI6Ny4xLjEvTjRGMjZULzM2ODczMzE6dXNlcmRlYnVnL2Rldi1rZXlzJwotMDktMDMgMTc6NDg6MDUuNzk2ICA3MDcyICA3MDcyIEYgREVCVUcgICA6IFJldmlzaW9uOiAnMCcKLTA5LTAzIDE3OjQ4OjA1Ljc5NiAgNzA3MiAgNzA3MiBGIERFQlVHICAgOiBBQkk6ICdhcm0nCi0wOS0wMyAxNzo0ODowNS43OTYgIDcwNzIgIDcwNzIgRiBERUJVRyAgIDogcGlkOiAxMTA3MSwgdGlkOiAxMTE4OSwgbmFtZTogc3ludGhldGljX3RocmVhZCAgPj4+IHN5bnRoZXRpY19wcm9jZXNzXzAgPDw8Ci0wOS0wMyAxNzo0ODowNS43OTcgIDcwNzIgIDcwNzIgRiBERUJVRyAgIDogc2lnbmFsIDExIChTSUdTRUdWKSwgY29kZSAxIChTRUdWX01BUEVSUiksIGZhdWx0IGFkZHIgMHhlOTM4MDAwMAotMDktMDMgMTc6NDg6MDUuNzk3ICA3MDcyICA3MDcyIEYgREVCVUcgICA6ICAgICByMCBlOWU3YTI0MCAgcjEgZTkzODAwMDAgIHIyIDAwMDAwMTcwICByMyAwMDAwMDAwMAotMDktMDMgMTc6NDg6MDUuNzk3ICA3MDcyICA3MDcyIEYgREVCVUcgICA6ICAgICByNCAwMDAwMDAwMiAgcjUgMDAwMDAwMDAgIHI2IGVjMWUxZjI1ICByNyBlYjZmODAwMAotMDktMDMgMTc6NDg6MDUuNzk3ICA3MDcyICA3MDcyIEYgREVCVUcgICA6ICAgICByOCAwMDAwMDAwMCAgcjkgZWIxMDUyMDQgIHNsIDAwMDAwMDAwICBmcCAwMDAwMDNjMAotMDktMDMgMTc6NDg6MDUuNzk3ICA3MDcyICA3MDcyIEYgREVCVUcgICA6ICAgICBpcCBlYmQzZGYxOCAgc3AgZWFmODA2ODggIGxyIGVjMWUxZjQxICBwYyBlYmQzOGRkNiAgY3BzciAyMDAwMDAzMAotMDktMDMgMTc6NDg6MDUuODA1ICA3MDcyICA3MDcyIEYgREVCVUcgICA6Ci0wOS0wMyAxNzo0ODowNS44MDUgIDcwNzIgIDcwNzIgRiBERUJVRyAgIDogYmFja3RyYWNlOgotMDktMDMgMTc6NDg6MDUuODA2ICA3MDcyICA3MDcyIEYgREVCVUcgICA6ICAgICAjMDAgcGMgMDAwMDJkZDYgIC9zeXN0ZW0vbGliL2xpYmF1ZGlvdXRpbHMuc28gKG1lbWNweV90b19mbG9hdF9mcm9tX2kxNis1KQotMDktMDMgMTc6NDg6MDUuODA2ICA3MDcyICA3MDcyIEYgREVCVUcgICA6ICAgICAjMDEgcGMgMDAwNDBmM2QgIC9zeXN0ZW0vbGliL2xpYmF1ZGlvZmxpbmdlci5zbwotMDktMDMgMTc6NDg6MDUuODA2ICA3MDcyICA3MDcyIEYgREVCVUcgICA6ICAgICAjMDIgcGMgMDAwNDA3OTkgIC9zeXN0ZW0vbGliL2xpYmF1ZGlvZmxpbmdlci5zbwotMDktMDMgMTc6NDg6MDUuODA2ICA3MDcyICA3MDcyIEYgREVCVUcgICA6ICAgICAjMDMgcGMgMDAwMTExNzggIC9zeXN0ZW0vbGliL2xpYmF1ZGlvZmxpbmdlci5zbwotMDktMDMgMTc6NDg6MDUuODA2ICA3MDcyICA3MDcyIEYgREVCVUcgICA6ICAgICAjMDQgcGMgMDAwMzE4MGIgIC9zeXN0ZW0vbGliL2xpYmF1ZGlvZmxpbmdlci5zbwotMDktMDMgMTc6NDg6MDUuODA2ICA3MDcyICA3MDcyIEYgREVCVUcgICA6ICAgICAjMDUgcGMgMDAwMmZlNTcgIC9zeXN0ZW0vbGliL2xpYmF1ZGlvZmxpbmdlci5zbwotMDktMDMgMTc6NDg6MDUuODA2ICA3MDcyICA3MDcyIEYgREVCVUcgICA6ICAgICAjMDYgcGMgMDAwMGUzNDUgIC9zeXN0ZW0vbGliL2xpYnV0aWxzLnNvIChfWk43YW5kcm9pZDZUaHJlYWQxMV90aHJlYWRMb29wRVB2KzE0MCkKLTA5LTAzIDE3OjQ4OjA1LjgwNiAgNzA3MiAgNzA3MiBGIERFQlVHICAgOiAgICAgIzA3IHBjIDAwMDQ3MGIzICAvc3lzdGVtL2xpYi9saWJjLnNvIChfWkwxNV9fcHRocmVhZF9zdGFydFB2KzIyKQotMDktMDMgMTc6NDg6MDUuODA2ICA3MDcyICA3MDcyIEYgREVCVUcgICA6ICAgICAjMDggcGMgMDAwMTllM2QgIC9zeXN0ZW0vbGliL2xpYmMuc28gKF9fc3RhcnRfdGhyZWFkKzYpCi0wOS0wMyAxNzo0ODowNS45NjcgMTEyNzIgMTE1NjggVyBOYXRpdmVDcmFzaExpc3RlbmVyOiBDb3VsZG4ndCBmaW5kIFByb2Nlc3NSZWNvcmQgZm9yIHBpZCAxMTA3MQotMDktMDMgMTc6NDg6MDUuOTY5ICAgMzU5ICAgMzU5IFcgICAgICAgICA6IGRlYnVnZ2VyZDogcmVzdW1pbmcgdGFyZ2V0IDExMDcxCi0wOS0wMyAxNzo0ODowNS45ODEgMTEyNzIgMTEzMDcgSSBCb290UmVjZWl2ZXI6IENvcHlpbmcgL2RhdGEvdG9tYnN0b25lcy90b21ic3RvbmVfMDEgdG8gRHJvcEJveCAoU1lTVEVNX1RPTUJTVE9ORSkKLTA5LTAzIDE3OjQ4OjA2LjA2NyAgIDM5NCAgIDM5NCBJIFNlcnZpY2VNYW5hZ2VyOiBzZXJ2aWNlICdtZWRpYS5zb3VuZF90cmlnZ2VyX2h3JyBkaWVkCi0wNi0xNSAxOTo1NzozMy42MDcgMTI3MzYgMTI3NjEgRCBQZXJtaXNzaW9uQ2FjaGU6IGNoZWNraW5nIGFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfQVVESU9fU0VUVElOR1MgZm9yIHVpZD0xMDE5NyA9PiBncmFudGVkICg2OTggdXMpCi0tLS0tLS0tLS0gYmVnaW5uaW5nIG9mIGNyYXNoCi0wNi0xNSAxOTo1NzozMy42MDcgMTI3MzYgMTI3NjEgRiBsaWJjICAgIDogRmF0YWwgc2lnbmFsIDExIChTSUdTRUdWKSwgY29kZSAxLCBmYXVsdCBhZGRyIDB4MCBpbiB0aWQgMTI3NjEgKHN5bnRoZXRpY190aHJlYWQpCi0wNi0xNSAxOTo1NzozMy42MDggICAzNzkgICAzNzkgVyAgICAgICAgIDogZGVidWdnZXJkOiBoYW5kbGluZyByZXF1ZXN0OiBwaWQ9MTI3MzYgdWlkPTEwNDEgZ2lkPTEwMDUgdGlkPTEyNzYxCi0wNi0xNSAxOTo1NzozMy42NzAgMjYxOTIgMjYxOTIgRiBERUJVRyAgIDogKioqICoqKiAqKiogKioqICoqKiAqKiogKioqICoqKiAqKiogKioqICoqKiAqKiogKioqICoqKiAqKiogKioqCi0wNi0xNSAxOTo1NzozMy42NzAgMjYxOTIgMjYxOTIgRiBERUJVRyAgIDogQnVpbGQgZmluZ2VycHJpbnQ6ICdnb29nbGUvYnVsbGhlYWQvYnVsbGhlYWQ6Ny4xLjIvTjJHNDhDLzQxMDQwMTA6dXNlcmRlYnVnL2Rldi1rZXlzJwotMDYtMTUgMTk6NTc6MzMuNjcwIDI2MTkyIDI2MTkyIEYgREVCVUcgICA6IFJldmlzaW9uOiAncmV2XzEuMCcKLTA2LTE1IDE5OjU3OjMzLjY3MCAyNjE5MiAyNjE5MiBGIERFQlVHICAgOiBBQkk6ICdhcm0nCi0wNi0xNSAxOTo1NzozMy42NzAgMjYxOTIgMjYxOTIgRiBERUJVRyAgIDogcGlkOiAxMjczNiwgdGlkOiAxMjc2MSwgbmFtZTogc3ludGhldGljX3RocmVhZCAgPj4+IHN5bnRoZXRpY19wcm9jZXNzXzEgPDw8Ci0wNi0xNSAxOTo1NzozMy42NzAgMjYxOTIgMjYxOTIgRiBERUJVRyAgIDogc2lnbmFsIDExIChTSUdTRUdWKSwgY29kZSAxIChTRUdWX01BUEVSUiksIGZhdWx0IGFkZHIgMHgwCi0wNi0xNSAxOTo1NzozMy42NzAgMjYxOTIgMjYxOTIgRiBERUJVRyAgIDogICAgIHIwIDAwMDAwMDAwICByMSAwMDAwMDAwMCAgcjIgMDAwMDAwNWYgIHIzIDAwMDAwMDAwCi0wNi0xNSAxOTo1NzozMy42NzAgMjYxOTIgMjYxOTIgRiBERUJVRyAgIDogICAgIHI0IGZmZmZmZmZmICByNSAwMDAwMDAwMCAgcjYgZjE0ZjkwMDAgIHI3IDAwMDAwMDAxCi0wNi0xNSAxOTo1NzozMy42NzAgMjYxOTIgMjYxOTIgRiBERUJVRyAgIDogICAgIHI4IDAwMDAwMDA0ICByOSBmMzM1MzExNCAgc2wgZjMzMTM5MDAgIGZwIDAwMDAwMDAwCi0wNi0xNSAxOTo1NzozMy42NzAgMjYxOTIgMjYxOTIgRiBERUJVRyAgIDogICAgIGlwIGYzYmQ0ZDg4ICBzcCBmMTI3ZDljOCAgbHIgZjNiOWNiYzUgIHBjIGYzYjY1YWY0ICBjcHNyIDYwMDAwMDMwCi0wNi0xNSAxOTo1NzozMy42NzYgMjYxOTIgMjYxOTIgRiBERUJVRyAgIDoKLTA2LTE1IDE5OjU3OjMzLjY3NiAyNjE5MiAyNjE5MiBGIERFQlVHICAgOiBiYWNrdHJhY2U6Ci0wNi0xNSAxOTo1NzozMy42NzcgMjYxOTIgMjYxOTIgRiBERUJVRyAgIDogICAgICMwMCBwYyAwMDAxOGFmNCAgL3N5c3RlbS9saWIvbGliYy5zbyAoc3RybGVuKzcxKQotMDYtMTUgMTk6NTc6MzMuNjc3IDI2MTkyIDI2MTkyIEYgREVCVUcgICA6ICAgICAjMDEgcGMgMDAwNGZiYzEgIC9zeXN0ZW0vbGliL2xpYmMuc28gKF9fc3RybGVuX2Noays0KQotMDYtMTUgMTk6NTc6MzMuNjc3IDI2MTkyIDI2MTkyIEYgREVCVUcgICA6ICAgICAjMDIgcGMgMDAwMGM1OTkgIC9zeXN0ZW0vbGliL2xpYnV0aWxzLnNvIChfWk43YW5kcm9pZDdTdHJpbmc4QzJFUEtjKzEyKQotMDYtMTUgMTk6NTc6MzMuNjc3IDI2MTkyIDI2MTkyIEYgREVCVUcgICA6ICAgICAjMDMgcGMgMDAwMmZkYmYgIC9zeXN0ZW0vbGliL2xpYmF1ZGlvcG9saWN5bWFuYWdlcmRlZmF1bHQuc28gKF9aTks3YW5kcm9pZDE4SHdNb2R1bGVDb2xsZWN0aW9uMTlnZXREZXZpY2VEZXNjcmlwdG9yRWpQS2NTMl9iKzQ1OCkKLTA2LTE1IDE5OjU3OjMzLjY3NyAyNjE5MiAyNjE5MiBGIERFQlVHICAgOiAgICAgIzA0IHBjIDAwMDFkZTQ3ICAvc3lzdGVtL2xpYi9saWJhdWRpb3BvbGljeW1hbmFnZXJkZWZhdWx0LnNvIChfWk43YW5kcm9pZDE4QXVkaW9Qb2xpY3lNYW5hZ2VyMjdzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnRFajI0YXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90UEtjUzNfKzE3OCkKLTA2LTE1IDE5OjU3OjMzLjY3NyAyNjE5MiAyNjE5MiBGIERFQlVHICAgOiAgICAgIzA1IHBjIDAwMDBhMDA5ICAvc3lzdGVtL2xpYi9saWJhdWRpb3BvbGljeXNlcnZpY2Uuc28KLTA2LTE1IDE5OjU3OjMzLjY3NyAyNjE5MiAyNjE5MiBGIERFQlVHICAgOiAgICAgIzA2IHBjIDAwMGEwMWE1ICAvc3lzdGVtL2xpYi9saWJtZWRpYS5zbyAoX1pON2FuZHJvaWQyMEJuQXVkaW9Qb2xpY3lTZXJ2aWNlMTBvblRyYW5zYWN0RWpSS05TXzZQYXJjZWxFUFMxX2orMTI1NikKLTA2LTE1IDE5OjU3OjMzLjY3NyAyNjE5MiAyNjE5MiBGIERFQlVHICAgOiAgICAgIzA3IHBjIDAwMDM1OWMzICAvc3lzdGVtL2xpYi9saWJiaW5kZXIuc28gKF9aTjdhbmRyb2lkN0JCaW5kZXI4dHJhbnNhY3RFalJLTlNfNlBhcmNlbEVQUzFfais3MCkKLTA2LTE1IDE5OjU3OjMzLjY3NyAyNjE5MiAyNjE5MiBGIERFQlVHICAgOiAgICAgIzA4IHBjIDAwMDNkMWJiICAvc3lzdGVtL2xpYi9saWJiaW5kZXIuc28gKF9aTjdhbmRyb2lkMTRJUENUaHJlYWRTdGF0ZTE0ZXhlY3V0ZUNvbW1hbmRFaSs3MDIpCi0wNi0xNSAxOTo1NzozMy42NzcgMjYxOTIgMjYxOTIgRiBERUJVRyAgIDogICAgICMwOSBwYyAwMDAzY2UwNyAgL3N5c3RlbS9saWIvbGliYmluZGVyLnNvIChfWk43YW5kcm9pZDE0SVBDVGhyZWFkU3RhdGUyMGdldEFuZEV4ZWN1dGVDb21tYW5kRXYrMTE0KQotMDYtMTUgMTk6NTc6MzMuNjc3IDI2MTkyIDI2MTkyIEYgREVCVUcgICA6ICAgICAjMTAgcGMgMDAwM2QzMWIgIC9zeXN0ZW0vbGliL2xpYmJpbmRlci5zbyAoX1pON2FuZHJvaWQxNElQQ1RocmVhZFN0YXRlMTRqb2luVGhyZWFkUG9vbEViKzQ2KQotMDYtMTUgMTk6NTc6MzMuNjc4IDI2MTkyIDI2MTkyIEYgREVCVUcgICA6ICAgICAjMTEgcGMgMDAwNGY4YzUgIC9zeXN0ZW0vbGliL2xpYmJpbmRlci5zbwotMDYtMTUgMTk6NTc6MzMuNjc4IDI2MTkyIDI2MTkyIEYgREVCVUcgICA6ICAgICAjMTIgcGMgMDAwMGUzNDUgIC9zeXN0ZW0vbGliL2xpYnV0aWxzLnNvIChfWk43YW5kcm9pZDZUaHJlYWQxMV90aHJlYWRMb29wRVB2KzE0MCkKLTA2LTE1IDE5OjU3OjMzLjY3OCAyNjE5MiAyNjE5MiBGIERFQlVHICAgOiAgICAgIzEzIHBjIDAwMDQ3MGIzICAvc3lzdGVtL2xpYi9saWJjLnNvIChfWkwxNV9fcHRocmVhZF9zdGFydFB2KzIyKQotMDYtMTUgMTk6NTc6MzMuNjc4IDI2MTkyIDI2MTkyIEYgREVCVUcgICA6ICAgICAjMTQgcGMgMDAwMTllM2QgIC9zeXN0ZW0vbGliL2xpYmMuc28gKF9fc3RhcnRfdGhyZWFkKzYpCi0wNi0xNSAxOTo1NzozMy44MzkgICA5MzQgIDI5OTEgVyBOYXRpdmVDcmFzaExpc3RlbmVyOiBDb3VsZG4ndCBmaW5kIFByb2Nlc3NSZWNvcmQgZm9yIHBpZCAxMjczNgotMDYtMTUgMTk6NTc6MzMuODQ2ICAgOTM0ICAgOTUyIEkgQm9vdFJlY2VpdmVyOiBDb3B5aW5nIC9kYXRhL3RvbWJzdG9uZXMvdG9tYnN0b25lXzAxIHRvIERyb3BCb3ggKFNZU1RFTV9UT01CU1RPTkUpCi0KZGlmZiAtLWdpdCBhL2NvbW1vbi91dGlsL3Rlc3RzL3J1bl90ZXN0cy5zaCBiL2NvbW1vbi91dGlsL3Rlc3RzL3J1bl90ZXN0cy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDA0NTAxNC4uMDAwMDAwMAotLS0gYS9jb21tb24vdXRpbC90ZXN0cy9ydW5fdGVzdHMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jIS9iaW4vYmFzaAotCi0jIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotQ1RTX0RJUj0kKGRpcm5hbWUgJHswfSkvLi4vLi4vLi4KLXNvdXJjZSAke0NUU19ESVJ9L3Rlc3RfZGVmcy5zaAotCi1KQVJTPSIKLSAgICBjb21wYXRpYmlsaXR5LWNvbW1vbi11dGlsLWhvc3RzaWRlbGliXAotICAgIGNvbXBhdGliaWxpdHktY29tbW9uLXV0aWwtdGVzdHNcCi0gICAgY29tcGF0aWJpbGl0eS1ob3N0LXV0aWxcCi0gICAgY29tcGF0aWJpbGl0eS1ob3N0LXV0aWwtdGVzdHNcCi0gICAgY29tcGF0aWJpbGl0eS1tb2NrLXRyYWRlZmVkXAotICAgIGNvbXBhdGliaWxpdHktdHJhZGVmZWQtdGVzdHMiCi0KLXJ1bl90ZXN0cyAiY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5Vbml0VGVzdHMiICIke0pBUlN9IiAiJHtAfSIKLQpkaWZmIC0tZ2l0IGEvY29tbW9uL3V0aWwvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQnVzaW5lc3NMb2dpY1Rlc3QuamF2YSBiL2NvbW1vbi91dGlsL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0J1c2luZXNzTG9naWNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5YjUyMzkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3V0aWwvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvQnVzaW5lc3NMb2dpY1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsOwotCi1pbXBvcnQgc3RhdGljIGp1bml0LmZyYW1ld29yay5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0LmFzc2VydEZhbHNlOwotaW1wb3J0IHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0LmFzc2VydFRydWU7Ci0KLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLWltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuSlVuaXQ0OwotCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5CdXNpbmVzc0xvZ2ljLkJ1c2luZXNzTG9naWNSdWxlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQnVzaW5lc3NMb2dpYy5CdXNpbmVzc0xvZ2ljUnVsZUFjdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkJ1c2luZXNzTG9naWMuQnVzaW5lc3NMb2dpY1J1bGVDb25kaXRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudXRpbC5GaWxlVXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBVbml0IHRlc3RzIGZvciB7QGxpbmsgQnVzaW5lc3NMb2dpY30KLSAqLwotQFJ1bldpdGgoSlVuaXQ0LmNsYXNzKQotcHVibGljIGNsYXNzIEJ1c2luZXNzTG9naWNUZXN0IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT1JSRUNUX0xPR0lDID0KLSAgICAgICAgICAgICJ7XG4iICsKLSAgICAgICAgICAgICIgIFwibmFtZVwiOiBcImJ1c2luZXNzTG9naWMvc3VpdGVzL2d0c1wiLFxuIiArCi0gICAgICAgICAgICAiICBcImJ1c2luZXNzTG9naWNSdWxlc0xpc3RzXCI6IFtcbiIgKwotICAgICAgICAgICAgIiAgICB7XG4iICsKLSAgICAgICAgICAgICIgICAgICBcInRlc3ROYW1lXCI6IFwidGVzdENhc2VOYW1lMVwiLFxuIiArCi0gICAgICAgICAgICAiICAgICAgXCJidXNpbmVzc0xvZ2ljUnVsZXNcIjogW1xuIiArCi0gICAgICAgICAgICAiICAgICAgICB7XG4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgXCJydWxlQ29uZGl0aW9uc1wiOiBbXG4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICB7XG4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICAgIFwibWV0aG9kTmFtZVwiOiBcImNvbmRpdGlvbk1ldGhvZE5hbWUxXCIsXG4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICAgIFwibWV0aG9kQXJnc1wiOiBbXG4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICAgICAgXCJhcmcxXCJcbiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgICAgXVxuIiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgfVxuIiArCi0gICAgICAgICAgICAiICAgICAgICAgIF0sXG4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgXCJydWxlQWN0aW9uc1wiOiBbXG4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICB7XG4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICAgIFwibWV0aG9kTmFtZVwiOiBcImFjdGlvbk1ldGhvZE5hbWUxXCIsXG4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICAgIFwibWV0aG9kQXJnc1wiOiBbXG4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICAgICAgXCJhcmcxXCIsXG4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICAgICAgXCJhcmcyXCJcbiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgICAgXVxuIiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgfVxuIiArCi0gICAgICAgICAgICAiICAgICAgICAgIF1cbiIgKwotICAgICAgICAgICAgIiAgICAgICAgfVxuIiArCi0gICAgICAgICAgICAiICAgICAgXVxuIiArCi0gICAgICAgICAgICAiICAgIH0sXG4iICsKLSAgICAgICAgICAgICIgICAge1xuIiArCi0gICAgICAgICAgICAiICAgICAgXCJ0ZXN0TmFtZVwiOiBcInRlc3RDYXNlTmFtZTJcIixcbiIgKwotICAgICAgICAgICAgIiAgICAgIFwiYnVzaW5lc3NMb2dpY1J1bGVzXCI6IFtcbiIgKwotICAgICAgICAgICAgIiAgICAgICAge1xuIiArCi0gICAgICAgICAgICAiICAgICAgICAgIFwicnVsZUNvbmRpdGlvbnNcIjogW1xuIiArCi0gICAgICAgICAgICAiICAgICAgICAgICAge1xuIiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgICBcIm1ldGhvZE5hbWVcIjogXCJjb25kaXRpb25NZXRob2ROYW1lMVwiLFxuIiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgICBcIm1ldGhvZEFyZ3NcIjogW1xuIiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgICAgIFwiYXJnMVwiXG4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICAgIF1cbiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgIH1cbiIgKwotICAgICAgICAgICAgIiAgICAgICAgICBdLFxuIiArCi0gICAgICAgICAgICAiICAgICAgICAgIFwicnVsZUFjdGlvbnNcIjogW1xuIiArCi0gICAgICAgICAgICAiICAgICAgICAgICAge1xuIiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgICBcIm1ldGhvZE5hbWVcIjogXCJhY3Rpb25NZXRob2ROYW1lMVwiLFxuIiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgICBcIm1ldGhvZEFyZ3NcIjogW1xuIiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgICAgIFwiYXJnMVwiLFxuIiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgICAgIFwiYXJnMlwiXG4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICAgIF1cbiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgIH1cbiIgKwotICAgICAgICAgICAgIiAgICAgICAgICBdXG4iICsKLSAgICAgICAgICAgICIgICAgICAgIH0sXG4iICsKLSAgICAgICAgICAgICIgICAgICAgIHtcbiIgKwotICAgICAgICAgICAgIiAgICAgICAgICBcInJ1bGVDb25kaXRpb25zXCI6IFtcbiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgIHtcbiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgICAgXCJtZXRob2ROYW1lXCI6IFwiY29uZGl0aW9uTWV0aG9kTmFtZTFcIixcbiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgICAgXCJtZXRob2RBcmdzXCI6IFtcbiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgICAgICBcImFyZzFcIlxuIiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgICBdXG4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICB9LFxuIiArCi0gICAgICAgICAgICAiICAgICAgICAgICAge1xuIiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgICBcIm1ldGhvZE5hbWVcIjogXCIhY29uZGl0aW9uTWV0aG9kTmFtZTJcIixcbiIgKyAvLyB1c2UgbmVnYXRpb24KLSAgICAgICAgICAgICIgICAgICAgICAgICAgIFwibWV0aG9kQXJnc1wiOiBbXG4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICAgICAgXCJhcmcyXCJcbiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgICAgXVxuIiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgfVxuIiArCi0gICAgICAgICAgICAiICAgICAgICAgIF0sXG4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgXCJydWxlQWN0aW9uc1wiOiBbXG4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICB7XG4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICAgIFwibWV0aG9kTmFtZVwiOiBcImFjdGlvbk1ldGhvZE5hbWUxXCIsXG4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICAgIFwibWV0aG9kQXJnc1wiOiBbXG4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICAgICAgXCJhcmcxXCIsXG4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgICAgICAgXCJhcmcyXCJcbiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgICAgXVxuIiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgfSxcbiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgIHtcbiIgKwotICAgICAgICAgICAgIiAgICAgICAgICAgICAgXCJtZXRob2ROYW1lXCI6IFwiYWN0aW9uTWV0aG9kTmFtZTJcIlxuIiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgfVxuIiArCi0gICAgICAgICAgICAiICAgICAgICAgIF1cbiIgKwotICAgICAgICAgICAgIiAgICAgICAgfVxuIiArCi0gICAgICAgICAgICAiICAgICAgXVxuIiArCi0gICAgICAgICAgICAiICAgIH0sXG4iICsKLSAgICAgICAgICAgICIgICAge1xuIiArCi0gICAgICAgICAgICAiICAgICAgXCJ0ZXN0TmFtZVwiOiBcInRlc3RDYXNlTmFtZTNcIlxuIiArCi0gICAgICAgICAgICAiICAgIH1cbiIgKwotICAgICAgICAgICAgIiAgXVxuIiArCi0gICAgICAgICAgICAifSI7Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDb3JyZWN0TG9naWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZSBmaWxlID0gY3JlYXRlRmlsZUZyb21TdHIoQ09SUkVDVF9MT0dJQyk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBCdXNpbmVzc0xvZ2ljIGJsID0gQnVzaW5lc3NMb2dpY0ZhY3RvcnkuY3JlYXRlRnJvbUZpbGUoZmlsZSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiBidXNpbmVzcyBsb2dpYyBydWxlIGxpc3RzIiwgMywgYmwubVJ1bGVzLnNpemUoKSk7Ci0KLSAgICAgICAgICAgIExpc3Q8QnVzaW5lc3NMb2dpY1J1bGU+IHJ1bGVMaXN0MSA9IGJsLm1SdWxlcy5nZXQoInRlc3RDYXNlTmFtZTEiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIHJ1bGVzIGluIGZpcnN0IHJ1bGUgbGlzdCIsIDEsIHJ1bGVMaXN0MS5zaXplKCkpOwotICAgICAgICAgICAgQnVzaW5lc3NMb2dpY1J1bGUgcnVsZTEgPSBydWxlTGlzdDEuZ2V0KDApOwotICAgICAgICAgICAgTGlzdDxCdXNpbmVzc0xvZ2ljUnVsZUNvbmRpdGlvbj4gcnVsZTFDb25kaXRpb25zID0gcnVsZTEubUNvbmRpdGlvbnM7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiBjb25kaXRpb25zIiwgMSwgcnVsZTFDb25kaXRpb25zLnNpemUoKSk7Ci0gICAgICAgICAgICBCdXNpbmVzc0xvZ2ljUnVsZUNvbmRpdGlvbiBydWxlMUNvbmRpdGlvbiA9IHJ1bGUxQ29uZGl0aW9ucy5nZXQoMCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIldyb25nIG1ldGhvZCBuYW1lIGZvciBidXNpbmVzcyBsb2dpYyBydWxlIGNvbmRpdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICJjb25kaXRpb25NZXRob2ROYW1lMSIsIHJ1bGUxQ29uZGl0aW9uLm1NZXRob2ROYW1lKTsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKCJXcm9uZyBuZWdhdGlvbiB2YWx1ZSBmb3IgYnVzaW5lc3MgbG9naWMgcnVsZSBjb25kaXRpb24iLAotICAgICAgICAgICAgICAgICAgICBydWxlMUNvbmRpdGlvbi5tTmVnYXRlZCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIldyb25nIGFyZyBzdHJpbmcgY291bnQgZm9yIGJ1c2luZXNzIGxvZ2ljIHJ1bGUgY29uZGl0aW9uIiwgMSwKLSAgICAgICAgICAgICAgICAgICAgcnVsZTFDb25kaXRpb24ubU1ldGhvZEFyZ3Muc2l6ZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiV3JvbmcgYXJnIGZvciBidXNpbmVzcyBsb2dpYyBydWxlIGNvbmRpdGlvbiIsICJhcmcxIiwKLSAgICAgICAgICAgICAgICAgICAgcnVsZTFDb25kaXRpb24ubU1ldGhvZEFyZ3MuZ2V0KDApKTsKLSAgICAgICAgICAgIExpc3Q8QnVzaW5lc3NMb2dpY1J1bGVBY3Rpb24+IHJ1bGUxQWN0aW9ucyA9IHJ1bGUxLm1BY3Rpb25zOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgYWN0aW9ucyIsIDEsIHJ1bGUxQWN0aW9ucy5zaXplKCkpOwotICAgICAgICAgICAgQnVzaW5lc3NMb2dpY1J1bGVBY3Rpb24gcnVsZTFBY3Rpb24gPSBydWxlMUFjdGlvbnMuZ2V0KDApOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBtZXRob2QgbmFtZSBmb3IgYnVzaW5lc3MgbG9naWMgcnVsZSBhY3Rpb24iLAotICAgICAgICAgICAgICAgICAgICAiYWN0aW9uTWV0aG9kTmFtZTEiLCBydWxlMUFjdGlvbi5tTWV0aG9kTmFtZSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIldyb25nIGFyZyBzdHJpbmcgY291bnQgZm9yIGJ1c2luZXNzIGxvZ2ljIHJ1bGUgYWN0aW9uIiwgMiwKLSAgICAgICAgICAgICAgICAgICAgcnVsZTFBY3Rpb24ubU1ldGhvZEFyZ3Muc2l6ZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiV3JvbmcgYXJnIGZvciBidXNpbmVzcyBsb2dpYyBydWxlIGFjdGlvbiIsICJhcmcxIiwKLSAgICAgICAgICAgICAgICAgICAgcnVsZTFBY3Rpb24ubU1ldGhvZEFyZ3MuZ2V0KDApKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiV3JvbmcgYXJnIGZvciBidXNpbmVzcyBsb2dpYyBydWxlIGFjdGlvbiIsICJhcmcyIiwKLSAgICAgICAgICAgICAgICAgICAgcnVsZTFBY3Rpb24ubU1ldGhvZEFyZ3MuZ2V0KDEpKTsKLQotICAgICAgICAgICAgTGlzdDxCdXNpbmVzc0xvZ2ljUnVsZT4gcnVsZUxpc3QyID0gYmwubVJ1bGVzLmdldCgidGVzdENhc2VOYW1lMiIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgcnVsZXMgaW4gc2Vjb25kIHJ1bGUgbGlzdCIsIDIsIHJ1bGVMaXN0Mi5zaXplKCkpOwotICAgICAgICAgICAgQnVzaW5lc3NMb2dpY1J1bGUgcnVsZTIgPSBydWxlTGlzdDIuZ2V0KDApOwotICAgICAgICAgICAgTGlzdDxCdXNpbmVzc0xvZ2ljUnVsZUNvbmRpdGlvbj4gcnVsZTJDb25kaXRpb25zID0gcnVsZTIubUNvbmRpdGlvbnM7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiBjb25kaXRpb25zIiwgMSwgcnVsZTJDb25kaXRpb25zLnNpemUoKSk7Ci0gICAgICAgICAgICBCdXNpbmVzc0xvZ2ljUnVsZUNvbmRpdGlvbiBydWxlMkNvbmRpdGlvbiA9IHJ1bGUyQ29uZGl0aW9ucy5nZXQoMCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIldyb25nIG1ldGhvZCBuYW1lIGZvciBidXNpbmVzcyBsb2dpYyBydWxlIGNvbmRpdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICJjb25kaXRpb25NZXRob2ROYW1lMSIsIHJ1bGUyQ29uZGl0aW9uLm1NZXRob2ROYW1lKTsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKCJXcm9uZyBuZWdhdGlvbiB2YWx1ZSBmb3IgYnVzaW5lc3MgbG9naWMgcnVsZSBjb25kaXRpb24iLAotICAgICAgICAgICAgICAgICAgICBydWxlMkNvbmRpdGlvbi5tTmVnYXRlZCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIldyb25nIGFyZyBzdHJpbmcgY291bnQgZm9yIGJ1c2luZXNzIGxvZ2ljIHJ1bGUgY29uZGl0aW9uIiwgMSwKLSAgICAgICAgICAgICAgICAgICAgcnVsZTJDb25kaXRpb24ubU1ldGhvZEFyZ3Muc2l6ZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiV3JvbmcgYXJnIGZvciBidXNpbmVzcyBsb2dpYyBydWxlIGNvbmRpdGlvbiIsICJhcmcxIiwKLSAgICAgICAgICAgICAgICAgICAgcnVsZTJDb25kaXRpb24ubU1ldGhvZEFyZ3MuZ2V0KDApKTsKLSAgICAgICAgICAgIExpc3Q8QnVzaW5lc3NMb2dpY1J1bGVBY3Rpb24+IHJ1bGUyQWN0aW9ucyA9IHJ1bGUyLm1BY3Rpb25zOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgYWN0aW9ucyIsIDEsIHJ1bGUyQWN0aW9ucy5zaXplKCkpOwotICAgICAgICAgICAgQnVzaW5lc3NMb2dpY1J1bGVBY3Rpb24gcnVsZTJBY3Rpb24gPSBydWxlMkFjdGlvbnMuZ2V0KDApOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBtZXRob2QgbmFtZSBmb3IgYnVzaW5lc3MgbG9naWMgcnVsZSBhY3Rpb24iLAotICAgICAgICAgICAgICAgICAgICAiYWN0aW9uTWV0aG9kTmFtZTEiLCBydWxlMkFjdGlvbi5tTWV0aG9kTmFtZSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIldyb25nIGFyZyBzdHJpbmcgY291bnQgZm9yIGJ1c2luZXNzIGxvZ2ljIHJ1bGUgYWN0aW9uIiwgMiwKLSAgICAgICAgICAgICAgICAgICAgcnVsZTJBY3Rpb24ubU1ldGhvZEFyZ3Muc2l6ZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiV3JvbmcgYXJnIGZvciBidXNpbmVzcyBsb2dpYyBydWxlIGFjdGlvbiIsICJhcmcxIiwKLSAgICAgICAgICAgICAgICAgICAgcnVsZTJBY3Rpb24ubU1ldGhvZEFyZ3MuZ2V0KDApKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiV3JvbmcgYXJnIGZvciBidXNpbmVzcyBsb2dpYyBydWxlIGFjdGlvbiIsICJhcmcyIiwKLSAgICAgICAgICAgICAgICAgICAgcnVsZTJBY3Rpb24ubU1ldGhvZEFyZ3MuZ2V0KDEpKTsKLSAgICAgICAgICAgIEJ1c2luZXNzTG9naWNSdWxlIHJ1bGUzID0gcnVsZUxpc3QyLmdldCgxKTsKLSAgICAgICAgICAgIExpc3Q8QnVzaW5lc3NMb2dpY1J1bGVDb25kaXRpb24+IHJ1bGUzQ29uZGl0aW9ucyA9IHJ1bGUzLm1Db25kaXRpb25zOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgY29uZGl0aW9ucyIsIDIsIHJ1bGUzQ29uZGl0aW9ucy5zaXplKCkpOwotICAgICAgICAgICAgQnVzaW5lc3NMb2dpY1J1bGVDb25kaXRpb24gcnVsZTNDb25kaXRpb24xID0gcnVsZTNDb25kaXRpb25zLmdldCgwKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiV3JvbmcgbWV0aG9kIG5hbWUgZm9yIGJ1c2luZXNzIGxvZ2ljIHJ1bGUgY29uZGl0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgImNvbmRpdGlvbk1ldGhvZE5hbWUxIiwgcnVsZTNDb25kaXRpb24xLm1NZXRob2ROYW1lKTsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKCJXcm9uZyBuZWdhdGlvbiB2YWx1ZSBmb3IgYnVzaW5lc3MgbG9naWMgcnVsZSBjb25kaXRpb24iLAotICAgICAgICAgICAgICAgICAgICBydWxlM0NvbmRpdGlvbjEubU5lZ2F0ZWQpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBhcmcgc3RyaW5nIGNvdW50IGZvciBidXNpbmVzcyBsb2dpYyBydWxlIGNvbmRpdGlvbiIsIDEsCi0gICAgICAgICAgICAgICAgICAgIHJ1bGUzQ29uZGl0aW9uMS5tTWV0aG9kQXJncy5zaXplKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBhcmcgZm9yIGJ1c2luZXNzIGxvZ2ljIHJ1bGUgY29uZGl0aW9uIiwgImFyZzEiLAotICAgICAgICAgICAgICAgICAgICBydWxlM0NvbmRpdGlvbjEubU1ldGhvZEFyZ3MuZ2V0KDApKTsKLSAgICAgICAgICAgIEJ1c2luZXNzTG9naWNSdWxlQ29uZGl0aW9uIHJ1bGUzQ29uZGl0aW9uMiA9IHJ1bGUzQ29uZGl0aW9ucy5nZXQoMSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIldyb25nIG1ldGhvZCBuYW1lIGZvciBidXNpbmVzcyBsb2dpYyBydWxlIGNvbmRpdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICJjb25kaXRpb25NZXRob2ROYW1lMiIsIHJ1bGUzQ29uZGl0aW9uMi5tTWV0aG9kTmFtZSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJXcm9uZyBuZWdhdGlvbiB2YWx1ZSBmb3IgYnVzaW5lc3MgbG9naWMgcnVsZSBjb25kaXRpb24iLAotICAgICAgICAgICAgICAgICAgICBydWxlM0NvbmRpdGlvbjIubU5lZ2F0ZWQpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBhcmcgc3RyaW5nIGNvdW50IGZvciBidXNpbmVzcyBsb2dpYyBydWxlIGNvbmRpdGlvbiIsIDEsCi0gICAgICAgICAgICAgICAgICAgIHJ1bGUzQ29uZGl0aW9uMi5tTWV0aG9kQXJncy5zaXplKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBhcmcgZm9yIGJ1c2luZXNzIGxvZ2ljIHJ1bGUgY29uZGl0aW9uIiwgImFyZzIiLAotICAgICAgICAgICAgICAgICAgICBydWxlM0NvbmRpdGlvbjIubU1ldGhvZEFyZ3MuZ2V0KDApKTsKLSAgICAgICAgICAgIExpc3Q8QnVzaW5lc3NMb2dpY1J1bGVBY3Rpb24+IHJ1bGUzQWN0aW9ucyA9IHJ1bGUzLm1BY3Rpb25zOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgYWN0aW9ucyIsIDIsIHJ1bGUzQWN0aW9ucy5zaXplKCkpOwotICAgICAgICAgICAgQnVzaW5lc3NMb2dpY1J1bGVBY3Rpb24gcnVsZTNBY3Rpb24xID0gcnVsZTNBY3Rpb25zLmdldCgwKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiV3JvbmcgbWV0aG9kIG5hbWUgZm9yIGJ1c2luZXNzIGxvZ2ljIHJ1bGUgYWN0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgImFjdGlvbk1ldGhvZE5hbWUxIiwgcnVsZTNBY3Rpb24xLm1NZXRob2ROYW1lKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiV3JvbmcgYXJnIHN0cmluZyBjb3VudCBmb3IgYnVzaW5lc3MgbG9naWMgcnVsZSBhY3Rpb24iLCAyLAotICAgICAgICAgICAgICAgICAgICBydWxlM0FjdGlvbjEubU1ldGhvZEFyZ3Muc2l6ZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiV3JvbmcgYXJnIGZvciBidXNpbmVzcyBsb2dpYyBydWxlIGFjdGlvbiIsICJhcmcxIiwKLSAgICAgICAgICAgICAgICAgICAgcnVsZTNBY3Rpb24xLm1NZXRob2RBcmdzLmdldCgwKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIldyb25nIGFyZyBmb3IgYnVzaW5lc3MgbG9naWMgcnVsZSBhY3Rpb24iLCAiYXJnMiIsCi0gICAgICAgICAgICAgICAgICAgIHJ1bGUzQWN0aW9uMS5tTWV0aG9kQXJncy5nZXQoMSkpOwotICAgICAgICAgICAgQnVzaW5lc3NMb2dpY1J1bGVBY3Rpb24gcnVsZTNBY3Rpb24yID0gcnVsZTNBY3Rpb25zLmdldCgxKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiV3JvbmcgbWV0aG9kIG5hbWUgZm9yIGJ1c2luZXNzIGxvZ2ljIHJ1bGUgYWN0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgImFjdGlvbk1ldGhvZE5hbWUyIiwgcnVsZTNBY3Rpb24yLm1NZXRob2ROYW1lKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiV3JvbmcgYXJnIHN0cmluZyBjb3VudCBmb3IgYnVzaW5lc3MgbG9naWMgcnVsZSBhY3Rpb24iLCAwLAotICAgICAgICAgICAgICAgICAgICBydWxlM0FjdGlvbjIubU1ldGhvZEFyZ3Muc2l6ZSgpKTsKLQotICAgICAgICAgICAgTGlzdDxCdXNpbmVzc0xvZ2ljUnVsZT4gcnVsZUxpc3QzID0gYmwubVJ1bGVzLmdldCgidGVzdENhc2VOYW1lMyIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgcnVsZXMgaW4gdGhpcmQgcnVsZSBsaXN0IiwgMCwgcnVsZUxpc3QzLnNpemUoKSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBGaWxlVXRpbC5kZWxldGVGaWxlKGZpbGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRlc3QoZXhwZWN0ZWQgPSBSdW50aW1lRXhjZXB0aW9uLmNsYXNzKQotICAgIHB1YmxpYyB2b2lkIHRlc3RMb2dpY1dpdGhXcm9uZ05vZGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgZmlsZSA9IGNyZWF0ZUZpbGVGcm9tU3RyKENPUlJFQ1RfTE9HSUMucmVwbGFjZSgidGVzdE5hbWUiLCAidGVzdE5hbTMiKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBCdXNpbmVzc0xvZ2ljIGJsID0gQnVzaW5lc3NMb2dpY0ZhY3RvcnkuY3JlYXRlRnJvbUZpbGUoZmlsZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBGaWxlVXRpbC5kZWxldGVGaWxlKGZpbGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgRmlsZSBjcmVhdGVGaWxlRnJvbVN0cihTdHJpbmcgYmxTdHJpbmcpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgZmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoInRlc3QiLCAiYmwiKTsKLSAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKTsKLSAgICAgICAgc3RyZWFtLndyaXRlKGJsU3RyaW5nLmdldEJ5dGVzKCkpOwotICAgICAgICBzdHJlYW0uZmx1c2goKTsKLSAgICAgICAgc3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgIHJldHVybiBmaWxlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi91dGlsL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0Nhc2VSZXN1bHRUZXN0LmphdmEgYi9jb21tb24vdXRpbC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9DYXNlUmVzdWx0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGI3NGMwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi91dGlsL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0Nhc2VSZXN1bHRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotLyoqCi0gKiBVbml0IHRlc3RzIGZvciB7QGxpbmsgQ2FzZVJlc3VsdH0KLSAqLwotcHVibGljIGNsYXNzIENhc2VSZXN1bHRUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTID0gImFuZHJvaWQudGVzdC5Gb29yQmFyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EXzEgPSAidGVzdEJsYWgxIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EXzIgPSAidGVzdEJsYWgyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EXzMgPSAidGVzdEJsYWgzIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRSA9ICJTb21ldGhpbmcgc21hbGwgaXMgbm90IGFscmlnaHQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFDS19UUkFDRSA9ICJTb21ldGhpbmcgc21hbGwgaXMgbm90IGFscmlnaHRcbiAiICsKLSAgICAgICAgICAgICJhdCBmb3VyLmJpZy5pbnNlY3RzLk1hcmxleS5zaW5nKE1hcmxleS5qYXZhOjEwKSI7Ci0gICAgcHJpdmF0ZSBDYXNlUmVzdWx0IG1SZXN1bHQ7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtUmVzdWx0ID0gbmV3IENhc2VSZXN1bHQoQ0xBU1MpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1SZXN1bHQgPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NvcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgY2FzZSBuYW1lIiwgQ0xBU1MsIG1SZXN1bHQuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzdWx0Q3JlYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSVRlc3RSZXN1bHQgdGVzdFJlc3VsdCA9IG1SZXN1bHQuZ2V0T3JDcmVhdGVSZXN1bHQoTUVUSE9EXzEpOwotICAgICAgICAvLyBTaG91bGQgY3JlYXRlIG9uZQotICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIG9uZSByZXN1bHQiLCAxLCBtUmVzdWx0LmdldFJlc3VsdHMoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCB0ZXN0IHJlc3VsdCIsIG1SZXN1bHQuZ2V0UmVzdWx0cygpLmNvbnRhaW5zKHRlc3RSZXN1bHQpKTsKLSAgICAgICAgLy8gU2hvdWxkIG5vdCBjcmVhdGUgYW5vdGhlciBvbmUKLSAgICAgICAgSVRlc3RSZXN1bHQgdGVzdFJlc3VsdDIgPSBtUmVzdWx0LmdldE9yQ3JlYXRlUmVzdWx0KE1FVEhPRF8xKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCB0aGUgc2FtZSByZXN1bHQiLCB0ZXN0UmVzdWx0LCB0ZXN0UmVzdWx0Mik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRXhwZWN0ZWQgb25lIHJlc3VsdCIsIDEsIG1SZXN1bHQuZ2V0UmVzdWx0cygpLnNpemUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlc3VsdFJlcG9ydGluZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBJVGVzdFJlc3VsdCB0ZXN0UmVzdWx0ID0gbVJlc3VsdC5nZXRPckNyZWF0ZVJlc3VsdChNRVRIT0RfMSk7Ci0gICAgICAgIHRlc3RSZXN1bHQuZmFpbGVkKFNUQUNLX1RSQUNFKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCBzdGF0dXMgdG8gYmUgc2V0IiwgVGVzdFN0YXR1cy5GQUlMLCB0ZXN0UmVzdWx0LmdldFJlc3VsdFN0YXR1cygpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCBtZXNzYWdlIHRvIGJlIHNldCIsIE1FU1NBR0UsIHRlc3RSZXN1bHQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCBzdGFjayB0byBiZSBzZXQiLCBTVEFDS19UUkFDRSwgdGVzdFJlc3VsdC5nZXRTdGFja1RyYWNlKCkpOwotICAgICAgICB0ZXN0UmVzdWx0ID0gbVJlc3VsdC5nZXRPckNyZWF0ZVJlc3VsdChNRVRIT0RfMik7Ci0gICAgICAgIHRlc3RSZXN1bHQucGFzc2VkKG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIHN0YXR1cyB0byBiZSBzZXQiLCBUZXN0U3RhdHVzLlBBU1MsIHRlc3RSZXN1bHQuZ2V0UmVzdWx0U3RhdHVzKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIHR3byByZXN1bHRzIiwgMiwgbVJlc3VsdC5nZXRSZXN1bHRzKCkuc2l6ZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q291bnRSZXN1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1SZXN1bHQuZ2V0T3JDcmVhdGVSZXN1bHQoTUVUSE9EXzEpLmZhaWxlZChTVEFDS19UUkFDRSk7Ci0gICAgICAgIG1SZXN1bHQuZ2V0T3JDcmVhdGVSZXN1bHQoTUVUSE9EXzIpLmZhaWxlZChTVEFDS19UUkFDRSk7Ci0gICAgICAgIG1SZXN1bHQuZ2V0T3JDcmVhdGVSZXN1bHQoTUVUSE9EXzMpLnBhc3NlZChudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCB0d28gZmFpbHVyZXMiLCAyLCBtUmVzdWx0LmNvdW50UmVzdWx0cyhUZXN0U3RhdHVzLkZBSUwpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCBvbmUgcGFzcyIsIDEsIG1SZXN1bHQuY291bnRSZXN1bHRzKFRlc3RTdGF0dXMuUEFTUykpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXJnZUNhc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbVJlc3VsdC5nZXRPckNyZWF0ZVJlc3VsdChNRVRIT0RfMSkuZmFpbGVkKFNUQUNLX1RSQUNFKTsKLSAgICAgICAgbVJlc3VsdC5nZXRPckNyZWF0ZVJlc3VsdChNRVRIT0RfMikucGFzc2VkKG51bGwpOwotCi0gICAgICAgIC8vIFNhbWUgY2FzZSBhbm90aGVyIHRlc3QgYW5kIHBhc3NpbmcgcmVzdWx0cyBpbiBtZXRob2QgMgotICAgICAgICBDYXNlUmVzdWx0IG90aGVyUmVzdWx0ID0gbmV3IENhc2VSZXN1bHQoQ0xBU1MpOwotICAgICAgICBvdGhlclJlc3VsdC5nZXRPckNyZWF0ZVJlc3VsdChNRVRIT0RfMSkucGFzc2VkKG51bGwpOwotICAgICAgICBvdGhlclJlc3VsdC5nZXRPckNyZWF0ZVJlc3VsdChNRVRIT0RfMikucGFzc2VkKG51bGwpOwotICAgICAgICBvdGhlclJlc3VsdC5nZXRPckNyZWF0ZVJlc3VsdChNRVRIT0RfMykuZmFpbGVkKFNUQUNLX1RSQUNFKTsKLQotICAgICAgICBtUmVzdWx0Lm1lcmdlRnJvbShvdGhlclJlc3VsdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRXhwZWN0ZWQgb25lIHJlc3VsdCIsIDMsIG1SZXN1bHQuZ2V0UmVzdWx0cygpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRXhwZWN0ZWQgb25lIGZhaWx1cmVzIiwgMSwgbVJlc3VsdC5jb3VudFJlc3VsdHMoVGVzdFN0YXR1cy5GQUlMKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRXhwZWN0ZWQgdHdvIHBhc3MiLCAyLCBtUmVzdWx0LmNvdW50UmVzdWx0cyhUZXN0U3RhdHVzLlBBU1MpKTsKLSAgICB9Ci0KLSAgICAgcHVibGljIHZvaWQgdGVzdE1lcmdlQ2FzZV9wYXNzVG9GYWlsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1SZXN1bHQuZ2V0T3JDcmVhdGVSZXN1bHQoTUVUSE9EXzEpLnBhc3NlZChudWxsKTsKLQotICAgICAgICAvLyBTYW1lIGNhc2UgYW5vdGhlciB0ZXN0IGFuZCBwYXNzaW5nIHJlc3VsdHMgaW4gbWV0aG9kIDIKLSAgICAgICAgQ2FzZVJlc3VsdCBvdGhlclJlc3VsdCA9IG5ldyBDYXNlUmVzdWx0KENMQVNTKTsKLSAgICAgICAgb3RoZXJSZXN1bHQuZ2V0T3JDcmVhdGVSZXN1bHQoTUVUSE9EXzEpLnBhc3NlZChudWxsKTsKLSAgICAgICAgb3RoZXJSZXN1bHQuZ2V0T3JDcmVhdGVSZXN1bHQoTUVUSE9EXzIpLnBhc3NlZChudWxsKTsKLSAgICAgICAgb3RoZXJSZXN1bHQuZ2V0T3JDcmVhdGVSZXN1bHQoTUVUSE9EXzMpLmZhaWxlZChTVEFDS19UUkFDRSk7Ci0KLSAgICAgICAgbVJlc3VsdC5tZXJnZUZyb20ob3RoZXJSZXN1bHQpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiRXhwZWN0ZWQgb25lIHJlc3VsdCIsIDMsIG1SZXN1bHQuZ2V0UmVzdWx0cygpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRXhwZWN0ZWQgb25lIGZhaWx1cmVzIiwgMSwgbVJlc3VsdC5jb3VudFJlc3VsdHMoVGVzdFN0YXR1cy5GQUlMKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRXhwZWN0ZWQgdHdvIHBhc3MiLCAyLCBtUmVzdWx0LmNvdW50UmVzdWx0cyhUZXN0U3RhdHVzLlBBU1MpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWVyZ2VDYXNlX21pc21hdGNoZWRNb2R1bGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgQ2FzZVJlc3VsdCBvdGhlclJlc3VsdCA9IG5ldyBDYXNlUmVzdWx0KENMQVNTICsgImZvbyIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbVJlc3VsdC5tZXJnZUZyb20ob3RoZXJSZXN1bHQpOwotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgSWxsZWdsQXJndW1lbnRFeGNlcHRpb24iKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4cGVjdGVkKSB7fQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi91dGlsL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0NyYXNoVXRpbHNUZXN0LmphdmEgYi9jb21tb24vdXRpbC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9DcmFzaFV0aWxzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTM4YjdiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi91dGlsL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0NyYXNoVXRpbHNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IG9yZy5qc29uLkpTT05BcnJheTsKLWltcG9ydCBvcmcuanNvbi5KU09ORXhjZXB0aW9uOwotaW1wb3J0IG9yZy5qc29uLkpTT05PYmplY3Q7Ci1pbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKLWltcG9ydCBvcmcuanVuaXQucnVubmVycy5KVW5pdDQ7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLS8qKiBVbml0IHRlc3RzIGZvciB7QGxpbmsgQ3Jhc2hVdGlsc30uICovCi1AUnVuV2l0aChKVW5pdDQuY2xhc3MpCi1wdWJsaWMgY2xhc3MgQ3Jhc2hVdGlsc1Rlc3QgewotCi0gICAgcHJpdmF0ZSBKU09OQXJyYXkgbUNyYXNoZXM7Ci0KLSAgICBAQmVmb3JlCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB0cnkgKEJ1ZmZlcmVkUmVhZGVyIHR4dFJlYWRlciA9Ci0gICAgICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkUmVhZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IElucHV0U3RyZWFtUmVhZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbSgibG9nY2F0LnR4dCIpKSkpIHsKLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBpbnB1dCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgIFN0cmluZyB0bXA7Ci0gICAgICAgICAgICB3aGlsZSAoKHRtcCA9IHR4dFJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW5wdXQuYXBwZW5kKHRtcCArICJcbiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNyYXNoZXMgPSBDcmFzaFV0aWxzLmFkZEFsbENyYXNoZXMoaW5wdXQudG9TdHJpbmcoKSwgbmV3IEpTT05BcnJheSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEdldEFsbENyYXNoZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSlNPTkFycmF5IGV4cGVjdGVkUmVzdWx0cyA9IG5ldyBKU09OQXJyYXkoKTsKLSAgICAgICAgZXhwZWN0ZWRSZXN1bHRzLnB1dChjcmVhdGVDcmFzaEpzb24oCi0gICAgICAgICAgICAgICAgMTEwNzEsIDExMTg5LCAiQXVkaW9PdXRfRCIsICIvc3lzdGVtL2Jpbi9hdWRpb3NlcnZlciIsICJlOTM4MDAwMCIsICJTSUdTRUdWIikpOwotICAgICAgICBleHBlY3RlZFJlc3VsdHMucHV0KGNyZWF0ZUNyYXNoSnNvbigKLSAgICAgICAgICAgICAgICAxMjczNiwgMTI3NjEsICJCaW5kZXI6MTI3MzZfMiIsICIvc3lzdGVtL2Jpbi9hdWRpb3NlcnZlciIsICIwIiwgIlNJR1NFR1YiKSk7Ci0gICAgICAgIGV4cGVjdGVkUmVzdWx0cy5wdXQoY3JlYXRlQ3Jhc2hKc29uKAotICAgICAgICAgICAgICAgIDI2MjAxLCAyNjIyNywgIkJpbmRlcjoyNjIwMV8zIiwgIi9zeXN0ZW0vYmluL2F1ZGlvc2VydmVyIiwgIjAiLCAiU0lHU0VHViIpKTsKLSAgICAgICAgZXhwZWN0ZWRSZXN1bHRzLnB1dChjcmVhdGVDcmFzaEpzb24oCi0gICAgICAgICAgICAgICAgMjYyNDYsIDI2MjgyLCAiQmluZGVyOjI2MjQ2XzUiLCAiL3N5c3RlbS9iaW4vYXVkaW9zZXJ2ZXIiLCAiMCIsICJTSUdTRUdWIikpOwotICAgICAgICBleHBlY3RlZFJlc3VsdHMucHV0KGNyZWF0ZUNyYXNoSnNvbigKLSAgICAgICAgICAgICAgICAyNDUsIDI0NSwgImluc3RhbGxkIiwgIi9zeXN0ZW0vYmluL2luc3RhbGxkIiwgbnVsbCwgIlNJR0FCUlQiKSk7Ci0gICAgICAgIGV4cGVjdGVkUmVzdWx0cy5wdXQoY3JlYXRlQ3Jhc2hKc29uKAotICAgICAgICAgICAgICAgIDYzNzEsIDgwNzIsICJtZWRpYS5jb2RlYyIsICJvbXhAMS4wLXNlcnZpY2UiLCAiZWQwMDAwMDAiLCAiU0lHU0VHViIpKTsKLSAgICAgICAgZXhwZWN0ZWRSZXN1bHRzLnB1dChjcmVhdGVDcmFzaEpzb24oCi0gICAgICAgICAgICAgICAgODM3MywgODQxNCwgImxvbyIsICJjb20uYW5kcm9pZC5ibHVldG9vdGgiLCBudWxsLCAiU0lHQUJSVCIpKTsKLSAgICAgICAgZXhwZWN0ZWRSZXN1bHRzLnB1dChjcmVhdGVDcmFzaEpzb24oCi0gICAgICAgICAgICAgICAgMTEwNzEsIDExMTg5LCAic3ludGhldGljX3RocmVhZCIsICJzeW50aGV0aWNfcHJvY2Vzc18wIiwgImU5MzgwMDAwIiwgIlNJR1NFR1YiKSk7Ci0gICAgICAgIGV4cGVjdGVkUmVzdWx0cy5wdXQoY3JlYXRlQ3Jhc2hKc29uKAotICAgICAgICAgICAgICAgIDEyNzM2LCAxMjc2MSwgInN5bnRoZXRpY190aHJlYWQiLCAic3ludGhldGljX3Byb2Nlc3NfMSIsICIwIiwgIlNJR1NFR1YiKSk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhtQ3Jhc2hlcy50b1N0cmluZygpLCBleHBlY3RlZFJlc3VsdHMudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIEpTT05PYmplY3QgY3JlYXRlQ3Jhc2hKc29uKAotICAgICAgICAgICAgaW50IHBpZCwgaW50IHRpZCwgU3RyaW5nIG5hbWUsIFN0cmluZyBwcm9jZXNzLCBTdHJpbmcgZmF1bHRhZGRyZXNzLCBTdHJpbmcgc2lnbmFsKSB7Ci0gICAgICAgIEpTT05PYmplY3QganNvbiA9IG5ldyBKU09OT2JqZWN0KCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBqc29uLnB1dChDcmFzaFV0aWxzLlBJRCwgcGlkKTsKLSAgICAgICAgICAgIGpzb24ucHV0KENyYXNoVXRpbHMuVElELCB0aWQpOwotICAgICAgICAgICAganNvbi5wdXQoQ3Jhc2hVdGlscy5OQU1FLCBuYW1lKTsKLSAgICAgICAgICAgIGpzb24ucHV0KENyYXNoVXRpbHMuUFJPQ0VTUywgcHJvY2Vzcyk7Ci0gICAgICAgICAgICBqc29uLnB1dChDcmFzaFV0aWxzLkZBVUxUX0FERFJFU1MsIGZhdWx0YWRkcmVzcyk7Ci0gICAgICAgICAgICBqc29uLnB1dChDcmFzaFV0aWxzLlNJR05BTCwgc2lnbmFsKTsKLSAgICAgICAgfSBjYXRjaCAoSlNPTkV4Y2VwdGlvbiBlKSB7fQotICAgICAgICByZXR1cm4ganNvbjsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZENyYXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKENyYXNoVXRpbHMuc2VjdXJpdHlDcmFzaERldGVjdGVkKG1DcmFzaGVzLCB0cnVlLAotICAgICAgICAgICAgICAgIFBhdHRlcm4uY29tcGlsZSgic3ludGhldGljX3Byb2Nlc3NfMCIpKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWlzc2luZ05hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKENyYXNoVXRpbHMuc2VjdXJpdHlDcmFzaERldGVjdGVkKG1DcmFzaGVzLCB0cnVlLAotICAgICAgICAgICAgICAgIFBhdHRlcm4uY29tcGlsZSgiIikpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTSUdBQlJUKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShDcmFzaFV0aWxzLnNlY3VyaXR5Q3Jhc2hEZXRlY3RlZChtQ3Jhc2hlcywgdHJ1ZSwKLSAgICAgICAgICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoImluc3RhbGxkIikpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RGYXVsdEFkZHJlc3NCZWxvd01pbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoQ3Jhc2hVdGlscy5zZWN1cml0eUNyYXNoRGV0ZWN0ZWQobUNyYXNoZXMsIHRydWUsCi0gICAgICAgICAgICAgICAgUGF0dGVybi5jb21waWxlKCJzeW50aGV0aWNfcHJvY2Vzc18xIikpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RJZ25vcmVNaW5BZGRyZXNzQ2hlY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoQ3Jhc2hVdGlscy5zZWN1cml0eUNyYXNoRGV0ZWN0ZWQobUNyYXNoZXMsIGZhbHNlLAotICAgICAgICAgICAgICAgIFBhdHRlcm4uY29tcGlsZSgic3ludGhldGljX3Byb2Nlc3NfMSIpKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QmFkQWJvcnRNZXNzYWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShDcmFzaFV0aWxzLnNlY3VyaXR5Q3Jhc2hEZXRlY3RlZChtQ3Jhc2hlcywgdHJ1ZSwKLSAgICAgICAgICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoImdlbmVyaWMiKSkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEdvb2RBbmRCYWRDcmFzaGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKENyYXNoVXRpbHMuc2VjdXJpdHlDcmFzaERldGVjdGVkKG1DcmFzaGVzLCB0cnVlLAotICAgICAgICAgICAgICAgIFBhdHRlcm4uY29tcGlsZSgic3ludGhldGljX3Byb2Nlc3NfMCIpLCBQYXR0ZXJuLmNvbXBpbGUoImdlbmVyaWMiKSkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE51bGxGYXVsdEFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSlNPTkFycmF5IGNyYXNoZXMgPSBuZXcgSlNPTkFycmF5KCk7Ci0gICAgICAgIGNyYXNoZXMucHV0KGNyZWF0ZUNyYXNoSnNvbig4MzczLCA4NDE0LCAibG9vIiwgImNvbS5hbmRyb2lkLmJsdWV0b290aCIsIG51bGwsICJTSUdTRUdWIikpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShDcmFzaFV0aWxzLnNlY3VyaXR5Q3Jhc2hEZXRlY3RlZChjcmFzaGVzLCB0cnVlLAotICAgICAgICAgICAgICAgIFBhdHRlcm4uY29tcGlsZSgiY29tXFwuYW5kcm9pZFxcLmJsdWV0b290aCIpKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3V0aWwvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvRHluYW1pY0NvbmZpZ1Rlc3QuamF2YSBiL2NvbW1vbi91dGlsL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0R5bmFtaWNDb25maWdUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZWY3MzMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3V0aWwvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvRHluYW1pY0NvbmZpZ1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsOwotCi1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudXRpbC5GaWxlVXRpbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLS8qKgotICogVW5pdCB0ZXN0cyBmb3Ige0BsaW5rIER5bmFtaWNDb25maWd9Ci0gKi8KLXB1YmxpYyBjbGFzcyBEeW5hbWljQ29uZmlnVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09SUkVDVF9DT05GSUcgPQotICAgICAgICAgICAgIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cInV0Zi04XCI/PlxuIiArCi0gICAgICAgICAgICAiPGR5bmFtaWNDb25maWc+XG4iICsKLSAgICAgICAgICAgICIgICAgPGVudHJ5IGtleT1cInRlc3QtY29uZmlnLTFcIj5cbiIgKwotICAgICAgICAgICAgIiAgICAgICAgPHZhbHVlPnRlc3QgY29uZmlnIDE8L3ZhbHVlPlxuIiArCi0gICAgICAgICAgICAiICAgIDwvZW50cnk+XG4iICsKLSAgICAgICAgICAgICIgICAgPGVudHJ5IGtleT1cInRlc3QtY29uZmlnLTJcIj5cbiIgKwotICAgICAgICAgICAgIiAgICAgICAgPHZhbHVlPnRlc3Rjb25maWcyPC92YWx1ZT5cbiIgKwotICAgICAgICAgICAgIiAgICA8L2VudHJ5PlxuIiArCi0gICAgICAgICAgICAiICAgIDxlbnRyeSBrZXk9XCJjb25maWctbGlzdFwiPlxuIiArCi0gICAgICAgICAgICAiICAgICAgICA8dmFsdWU+Y29uZmlnMDwvdmFsdWU+XG4iICsKLSAgICAgICAgICAgICIgICAgICAgIDx2YWx1ZT5jb25maWcxPC92YWx1ZT5cbiIgKwotICAgICAgICAgICAgIiAgICAgICAgPHZhbHVlPmNvbmZpZzI8L3ZhbHVlPlxuIiArCi0gICAgICAgICAgICAiICAgICAgICA8dmFsdWU+Y29uZmlnMzwvdmFsdWU+XG4iICsKLSAgICAgICAgICAgICIgICAgICAgIDx2YWx1ZT5jb25maWc0PC92YWx1ZT5cbiIgKwotICAgICAgICAgICAgIiAgICA8L2VudHJ5PlxuIiArCi0gICAgICAgICAgICAiICAgIDxlbnRyeSBrZXk9XCJjb25maWctbGlzdC0yXCI+XG4iICsKLSAgICAgICAgICAgICIgICAgICAgIDx2YWx1ZT5BPC92YWx1ZT5cbiIgKwotICAgICAgICAgICAgIiAgICAgICAgPHZhbHVlPkI8L3ZhbHVlPlxuIiArCi0gICAgICAgICAgICAiICAgICAgICA8dmFsdWU+QzwvdmFsdWU+XG4iICsKLSAgICAgICAgICAgICIgICAgICAgIDx2YWx1ZT5EPC92YWx1ZT5cbiIgKwotICAgICAgICAgICAgIiAgICAgICAgPHZhbHVlPkU8L3ZhbHVlPlxuIiArCi0gICAgICAgICAgICAiICAgIDwvZW50cnk+XG4iICsKLSAgICAgICAgICAgICI8L2R5bmFtaWNDb25maWc+XG4iOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19XUk9OR19OT0RFX05BTUUgPQotICAgICAgICAgICAgIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cInV0Zi04XCI/PlxuIiArCi0gICAgICAgICAgICAiPGR5bmFtaWNDc29uZmlnPlxuIiArICAvL1RoZSBub2RlIG5hbWUgZHluYW1pY0NvbmZpZyBpcyBpbnRlbnRpb25hbGx5IG1pc3R5cGVkCi0gICAgICAgICAgICAiICAgIDxlbnRyeSBrZXk9XCJ0ZXN0LWNvbmZpZy0xXCI+XG4iICsKLSAgICAgICAgICAgICIgICAgICAgIDx2YWx1ZT50ZXN0IGNvbmZpZyAxPC92YWx1ZT5cbiIgKwotICAgICAgICAgICAgIiAgICA8L2VudHJ5PlxuIiArCi0gICAgICAgICAgICAiICAgIDxlbnRyeSBrZXk9XCJ0ZXN0LWNvbmZpZy0yXCI+XG4iICsKLSAgICAgICAgICAgICIgICAgICAgIDx2YWx1ZT50ZXN0Y29uZmlnMjwvdmFsdWU+XG4iICsKLSAgICAgICAgICAgICIgICAgPC9lbnRyeT5cbiIgKwotICAgICAgICAgICAgIiAgICA8ZW50cnkga2V5PVwiY29uZmlnLWxpc3RcIj5cbiIgKwotICAgICAgICAgICAgIiAgICAgICAgPHZhbHVlPk5ldmVybW9yZTwvdmFsdWU+XG4iICsKLSAgICAgICAgICAgICIgICAgICAgIDx2YWx1ZT5QdWNrPC92YWx1ZT5cbiIgKwotICAgICAgICAgICAgIiAgICAgICAgPHZhbHVlPlpldXM8L3ZhbHVlPlxuIiArCi0gICAgICAgICAgICAiICAgICAgICA8dmFsdWU+RWFydGggU2hha2VyPC92YWx1ZT5cbiIgKwotICAgICAgICAgICAgIiAgICAgICAgPHZhbHVlPlZlbmdlZnVsIFNwaXJpdDwvdmFsdWU+XG4iICsKLSAgICAgICAgICAgICIgICAgPC9lbnRyeT5cbiIgKwotICAgICAgICAgICAgIiAgICA8ZW50cnkga2V5PVwiY29uZmlnLWxpc3QtMlwiPlxuIiArCi0gICAgICAgICAgICAiICAgICAgICA8dmFsdWU+QTwvdmFsdWU+XG4iICsKLSAgICAgICAgICAgICIgICAgICAgIDx2YWx1ZT5CPC92YWx1ZT5cbiIgKwotICAgICAgICAgICAgIiAgICAgICAgPHZhbHVlPkM8L3ZhbHVlPlxuIiArCi0gICAgICAgICAgICAiICAgICAgICA8dmFsdWU+RDwvdmFsdWU+XG4iICsKLSAgICAgICAgICAgICIgICAgICAgIDx2YWx1ZT5FPC92YWx1ZT5cbiIgKwotICAgICAgICAgICAgIiAgICA8L2VudHJ5PlxuIiArCi0gICAgICAgICAgICAiPC9keW5hbWljQ29uZmlnPlxuIjsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb3JyZWN0Q29uZmlnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIER5bmFtaWNDb25maWcgY29uZmlnID0gbmV3IER5bmFtaWNDb25maWcoKTsKLSAgICAgICAgRmlsZSBmaWxlID0gY3JlYXRlRmlsZUZyb21TdHIoQ09SUkVDVF9DT05GSUcpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29uZmlnLmluaXRpYWxpemVDb25maWcoZmlsZSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIldyb25nIENvbmZpZyIsIGNvbmZpZy5nZXRWYWx1ZSgidGVzdC1jb25maWctMSIpLCAidGVzdCBjb25maWcgMSIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBDb25maWciLCBjb25maWcuZ2V0VmFsdWUoInRlc3QtY29uZmlnLTIiKSwgInRlc3Rjb25maWcyIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIldyb25nIENvbmZpZyBMaXN0IiwgY29uZmlnLmdldFZhbHVlcygiY29uZmlnLWxpc3QiKS5nZXQoMCksICJjb25maWcwIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIldyb25nIENvbmZpZyBMaXN0IiwgY29uZmlnLmdldFZhbHVlcygiY29uZmlnLWxpc3QiKS5nZXQoMiksICJjb25maWcyIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIldyb25nIENvbmZpZyBMaXN0IiwgY29uZmlnLmdldFZhbHVlcygiY29uZmlnLWxpc3QtMiIpLmdldCgyKSwgIkMiKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIEZpbGVVdGlsLmRlbGV0ZUZpbGUoZmlsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uZmlnV2l0aFdyb25nTm9kZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRHluYW1pY0NvbmZpZyBjb25maWcgPSBuZXcgRHluYW1pY0NvbmZpZygpOwotICAgICAgICBGaWxlIGZpbGUgPSBjcmVhdGVGaWxlRnJvbVN0cihDT05GSUdfV1JPTkdfTk9ERV9OQU1FKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbmZpZy5pbml0aWFsaXplQ29uZmlnKGZpbGUpOwotICAgICAgICAgICAgZmFpbCgiQ2Fubm90IGRldGVjdCBlcnJvciB3aGVuIGNvbmZpZyBmaWxlIGhhcyB3cm9uZyBub2RlIG5hbWUiKTsKLSAgICAgICAgfSBjYXRjaCAoWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvL2V4cGVjdGVkCi0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBGaWxlVXRpbC5kZWxldGVGaWxlKGZpbGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBGaWxlIGNyZWF0ZUZpbGVGcm9tU3RyKFN0cmluZyBjb25maWdTdHIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgZmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoInRlc3QiLCAiZHluYW1pYyIpOwotICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOwotICAgICAgICBzdHJlYW0ud3JpdGUoY29uZmlnU3RyLmdldEJ5dGVzKCkpOwotICAgICAgICBzdHJlYW0uZmx1c2goKTsKLSAgICAgICAgc3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgIHJldHVybiBmaWxlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi91dGlsL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0xpZ2h0SW52b2NhdGlvblJlc3VsdFRlc3QuamF2YSBiL2NvbW1vbi91dGlsL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL0xpZ2h0SW52b2NhdGlvblJlc3VsdFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQwYzg3ZS4uMDAwMDAwMAotLS0gYS9jb21tb24vdXRpbC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9MaWdodEludm9jYXRpb25SZXN1bHRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsOwotCi1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudXRpbC5GaWxlVXRpbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiBVbml0IHRlc3RzIGZvciB7QGxpbmsgTGlnaHRJbnZvY2F0aW9uUmVzdWx0fQotICovCi1wdWJsaWMgY2xhc3MgTGlnaHRJbnZvY2F0aW9uUmVzdWx0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHByaXZhdGUgRmlsZSByZXN1bHRzRGlyOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcmVzdWx0c0RpciA9IEZpbGVVdGlsLmNyZWF0ZVRlbXBEaXIoInJlc3VsdHMiKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBGaWxlVXRpbC5yZWN1cnNpdmVEZWxldGUocmVzdWx0c0Rpcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdExpZ2h0SW52b2NhdGlvblJlc3VsdEluc3RhdGlhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZSByZXN1bHREaXIgPSBSZXN1bHRIYW5kbGVyVGVzdC53cml0ZVJlc3VsdERpcihyZXN1bHRzRGlyKTsKLSAgICAgICAgSUludm9jYXRpb25SZXN1bHQgZnVsbFJlc3VsdCA9IFJlc3VsdEhhbmRsZXIuZ2V0UmVzdWx0RnJvbURpcihyZXN1bHREaXIpOwotICAgICAgICBMaWdodEludm9jYXRpb25SZXN1bHQgbGlnaHRSZXN1bHQgPSBuZXcgTGlnaHRJbnZvY2F0aW9uUmVzdWx0KGZ1bGxSZXN1bHQpOwotICAgICAgICAvLyBFbnN1cmUgdGhhdCBsaWdodCByZXN1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgdXNlIGEgcmVmZXJlbmNlIHRvIHRoZSBmdWxsIHJlc3VsdAotICAgICAgICBmdWxsUmVzdWx0ID0gbnVsbDsKLSAgICAgICAgUmVzdWx0SGFuZGxlclRlc3QuY2hlY2tMaWdodFJlc3VsdChsaWdodFJlc3VsdCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3V0aWwvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvTWV0cmljc1htbFNlcmlhbGl6ZXJUZXN0LmphdmEgYi9jb21tb24vdXRpbC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9NZXRyaWNzWG1sU2VyaWFsaXplclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJiYjQ3OS4uMDAwMDAwMAotLS0gYS9jb21tb24vdXRpbC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9NZXRyaWNzWG1sU2VyaWFsaXplclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJGYWN0b3J5OwotaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFNlcmlhbGl6ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vL1RPRE8oc3R1YXJ0c2NvdHQpOiBEZWxldGUgZmlsZSBmb3IgdjIsIFJlcG9ydExvZyBjYW4gc2VyaWFsaXplIGl0c2VsZi4KLS8qKgotICogVW5pdCB0ZXN0cyBmb3Ige0BsaW5rIE1ldHJpY3NYbWxTZXJpYWxpemVyfQotICovCi1wdWJsaWMgY2xhc3MgTWV0cmljc1htbFNlcmlhbGl6ZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgc3RhdGljIGNsYXNzIExvY2FsUmVwb3J0TG9nIGV4dGVuZHMgUmVwb3J0TG9nIHt9Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlW10gVkFMVUVTID0gbmV3IGRvdWJsZVtdIHsxLCAxMSwgMjEsIDEyMTEsIDExMTIyMX07Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUiA9ICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSd1dGYtOCcgc3RhbmRhbG9uZT0neWVzJyA/PiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUEVDVEVEX1hNTCA9IEhFQURFUgotICAgICAgICAgICAgKyAiPFN1bW1hcnkgbWVzc2FnZT1cIlNhbXBsZVwiIHNjb3JlVHlwZT1cImhpZ2hlcl9iZXR0ZXJcIiB1bml0PVwiYnl0ZVwiPjEuMDwvU3VtbWFyeT4iOwotCi0gICAgcHJpdmF0ZSBMb2NhbFJlcG9ydExvZyBtTG9jYWxSZXBvcnRMb2c7Ci0gICAgcHJpdmF0ZSBNZXRyaWNzWG1sU2VyaWFsaXplciBtTWV0cmljc1htbFNlcmlhbGl6ZXI7Ci0gICAgcHJpdmF0ZSBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gbUJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLSAgICBwcml2YXRlIFhtbFNlcmlhbGl6ZXIgeG1sU2VyaWFsaXplcjsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1Mb2NhbFJlcG9ydExvZyA9IG5ldyBMb2NhbFJlcG9ydExvZygpOwotICAgICAgICBtQnl0ZUFycmF5T3V0cHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICBYbWxQdWxsUGFyc2VyRmFjdG9yeSBmYWN0b3J5ID0gWG1sUHVsbFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UobnVsbCwgbnVsbCk7Ci0gICAgICAgIHhtbFNlcmlhbGl6ZXIgPSBmYWN0b3J5Lm5ld1NlcmlhbGl6ZXIoKTsKLSAgICAgICAgeG1sU2VyaWFsaXplci5zZXRPdXRwdXQobUJ5dGVBcnJheU91dHB1dFN0cmVhbSwgInV0Zi04Iik7Ci0KLSAgICAgICAgdGhpcy5tTWV0cmljc1htbFNlcmlhbGl6ZXIgPSBuZXcgTWV0cmljc1htbFNlcmlhbGl6ZXIoeG1sU2VyaWFsaXplcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6ZV9udWxsKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgeG1sU2VyaWFsaXplci5zdGFydERvY3VtZW50KCJ1dGYtOCIsIHRydWUpOwotICAgICAgICBtTWV0cmljc1htbFNlcmlhbGl6ZXIuc2VyaWFsaXplKG51bGwpOwotICAgICAgICB4bWxTZXJpYWxpemVyLmVuZERvY3VtZW50KCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKEhFQURFUi5sZW5ndGgoKSwgbUJ5dGVBcnJheU91dHB1dFN0cmVhbS50b0J5dGVBcnJheSgpLmxlbmd0aCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6ZV9ub0RhdGEoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB4bWxTZXJpYWxpemVyLnN0YXJ0RG9jdW1lbnQoInV0Zi04IiwgdHJ1ZSk7Ci0gICAgICAgIG1NZXRyaWNzWG1sU2VyaWFsaXplci5zZXJpYWxpemUobUxvY2FsUmVwb3J0TG9nKTsKLSAgICAgICAgeG1sU2VyaWFsaXplci5lbmREb2N1bWVudCgpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyhIRUFERVIubGVuZ3RoKCksIG1CeXRlQXJyYXlPdXRwdXRTdHJlYW0udG9CeXRlQXJyYXkoKS5sZW5ndGgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBtTG9jYWxSZXBvcnRMb2cuc2V0U3VtbWFyeSgiU2FtcGxlIiwgMS4wLCBSZXN1bHRUeXBlLkhJR0hFUl9CRVRURVIsIFJlc3VsdFVuaXQuQllURSk7Ci0gICAgICAgIG1Mb2NhbFJlcG9ydExvZy5hZGRWYWx1ZXMoIkRldGFpbHMiLCBWQUxVRVMsIFJlc3VsdFR5cGUuTkVVVFJBTCwgUmVzdWx0VW5pdC5GUFMpOwotCi0gICAgICAgIHhtbFNlcmlhbGl6ZXIuc3RhcnREb2N1bWVudCgidXRmLTgiLCB0cnVlKTsKLSAgICAgICAgbU1ldHJpY3NYbWxTZXJpYWxpemVyLnNlcmlhbGl6ZShtTG9jYWxSZXBvcnRMb2cpOwotICAgICAgICB4bWxTZXJpYWxpemVyLmVuZERvY3VtZW50KCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKEVYUEVDVEVEX1hNTCwgbUJ5dGVBcnJheU91dHB1dFN0cmVhbS50b1N0cmluZygidXRmLTgiKSk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbW1vbi91dGlsL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL011bHRpcGFydEZvcm1UZXN0LmphdmEgYi9jb21tb24vdXRpbC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9NdWx0aXBhcnRGb3JtVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDk2MzA4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi91dGlsL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL011bHRpcGFydEZvcm1UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi0vKioKLSAqIFVuaXQgdGVzdHMgZm9yIHtAbGluayBNdWx0aXBhcnRGb3JtfQotICovCi1wdWJsaWMgY2xhc3MgTXVsdGlwYXJ0Rm9ybVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkVSX1VSTCA9ICJodHRwOi8vMTI3LjAuMC4xOjU1NTUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBaSVBfQVJSQVkgPSB7Ci0gICAgICAgICAgICAweGEsIDB4MmQsIDB4MmQsIDB4NDMsIDB4MzcsIDB4MzUsIDB4NDksIDB4MzUsIDB4MzUsIDB4NzUsIDB4MzMsIDB4NTIsIDB4MzMsIDB4NzAsIDB4MzAsCi0gICAgICAgICAgICAweDcyLCAweDM3LCAweDMzLCAweDcyLCAweGEsIDB4NDMsIDB4NmYsIDB4NmUsIDB4NzQsIDB4NjUsIDB4NmUsIDB4NzQsIDB4MmQsIDB4NDQsIDB4NjksCi0gICAgICAgICAgICAweDczLCAweDcwLCAweDZmLCAweDczLCAweDY5LCAweDc0LCAweDY5LCAweDZmLCAweDZlLCAweDNhLCAweDIwLCAweDY2LCAweDZmLCAweDcyLAotICAgICAgICAgICAgMHg2ZCwgMHgyZCwgMHg2NCwgMHg2MSwgMHg3NCwgMHg2MSwgMHgzYiwgMHgyMCwgMHg2ZSwgMHg2MSwgMHg2ZCwgMHg2NSwgMHgzZCwgMHgyMiwKLSAgICAgICAgICAgIDB4NjYsIDB4NmYsIDB4NmYsIDB4MjIsIDB4YSwgMHhhLCAweDYyLCAweDYxLCAweDcyLCAweGEsIDB4MmQsIDB4MmQsIDB4NDMsIDB4MzcsIDB4MzUsCi0gICAgICAgICAgICAweDQ5LCAweDM1LCAweDM1LCAweDc1LCAweDMzLCAweDUyLCAweDMzLCAweDcwLCAweDMwLCAweDcyLCAweDM3LCAweDMzLCAweDcyLCAweGEsIDB4NDMsCi0gICAgICAgICAgICAweDZmLCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDc0LCAweDJkLCAweDQ0LCAweDY5LCAweDczLCAweDcwLCAweDZmLCAweDczLCAweDY5LAotICAgICAgICAgICAgMHg3NCwgMHg2OSwgMHg2ZiwgMHg2ZSwgMHgzYSwgMHgyMCwgMHg2NiwgMHg2ZiwgMHg3MiwgMHg2ZCwgMHgyZCwgMHg2NCwgMHg2MSwgMHg3NCwKLSAgICAgICAgICAgIDB4NjEsIDB4M2IsIDB4MjAsIDB4NmUsIDB4NjEsIDB4NmQsIDB4NjUsIDB4M2QsIDB4MjIsIDB4NjIsIDB4NmMsIDB4NjEsIDB4NjgsIDB4MjIsCi0gICAgICAgICAgICAweDNiLCAweDIwLCAweDY2LCAweDY5LCAweDZjLCAweDY1LCAweDZlLCAweDYxLCAweDZkLCAweDY1LCAweDNkLCAweDIyLCAweDYyLCAweDZjLAotICAgICAgICAgICAgMHg2MSwgMHg2OCwgMHgyZSwgMHg3OCwgMHg2ZCwgMHg2YywgMHgyZSwgMHg2NywgMHg3YSwgMHgyMiwgMHhhLCAweDQzLCAweDZmLCAweDZlLCAweDc0LAotICAgICAgICAgICAgMHg2NSwgMHg2ZSwgMHg3NCwgMHgyZCwgMHg1NCwgMHg3OSwgMHg3MCwgMHg2NSwgMHgzYSwgMHgyMCwgMHg2MSwgMHg3MCwgMHg3MCwgMHg2YywKLSAgICAgICAgICAgIDB4NjksIDB4NjMsIDB4NjEsIDB4NzQsIDB4NjksIDB4NmYsIDB4NmUsIDB4MmYsIDB4NzgsIDB4MmQsIDB4NjcsIDB4N2EsIDB4NjksIDB4NzAsIDB4YSwKLSAgICAgICAgICAgIDB4NDMsIDB4NmYsIDB4NmUsIDB4NzQsIDB4NjUsIDB4NmUsIDB4NzQsIDB4MmQsIDB4NTQsIDB4NzIsIDB4NjEsIDB4NmUsIDB4NzMsIDB4NjYsCi0gICAgICAgICAgICAweDY1LCAweDcyLCAweDJkLCAweDQ1LCAweDZlLCAweDYzLCAweDZmLCAweDY0LCAweDY5LCAweDZlLCAweDY3LCAweDNhLCAweDIwLCAweDYyLAotICAgICAgICAgICAgMHg2OSwgMHg2ZSwgMHg2MSwgMHg3MiwgMHg3OSwgMHhhLCAweGEsIDB4NjIsIDB4NmMsIDB4NjEsIDB4NjgsIDB4YSwgMHgyZCwgMHgyZCwgMHg0MywKLSAgICAgICAgICAgIDB4MzcsIDB4MzUsIDB4NDksIDB4MzUsIDB4MzUsIDB4NzUsIDB4MzMsIDB4NTIsIDB4MzMsIDB4NzAsIDB4MzAsIDB4NzIsIDB4MzcsIDB4MzMsCi0gICAgICAgICAgICAweDcyLCAweDJkLCAweDJkLCAweGEsCi0gICAgfTsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb250ZW50Qm9keSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNdWx0aXBhcnRGb3JtIGZvcm0gPSBuZXcgTXVsdGlwYXJ0Rm9ybShTRVJWRVJfVVJMKTsKLSAgICAgICAgZm9ybS5hZGRGb3JtVmFsdWUoImZvbyIsICJiYXIiKTsKLSAgICAgICAgZm9ybS5hZGRGb3JtRmlsZSgiYmxhaCIsICJibGFoLnhtbC5neiIsICJibGFoIi5nZXRCeXRlcygpKTsKLSAgICAgICAgYnl0ZVtdIGRhdGEgPSBmb3JtLmdldENvbnRlbnRCb2R5KCk7Ci0gICAgICAgIGFzc2VydFRydWUoIk5vIGRhdGEiLCBkYXRhLmxlbmd0aCA+IDApOwotICAgICAgICBhc3NlcnRUcnVlKCJXcm9uZyBkYXRhIiwgQXJyYXlzLmVxdWFscyhaSVBfQVJSQVksIGRhdGEpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdXRpbC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9SZXBvcnRMb2dUZXN0LmphdmEgYi9jb21tb24vdXRpbC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9SZXBvcnRMb2dUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYTVmMmQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3V0aWwvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvUmVwb3J0TG9nVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuUmVwb3J0TG9nLk1ldHJpYzsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLS8qKgotICogVW5pdCB0ZXN0cyBmb3Ige0BsaW5rIFJlcG9ydExvZ30KLSAqLwotcHVibGljIGNsYXNzIFJlcG9ydExvZ1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09VUkNFID0gIlNvdXJjZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0UgPSAiTWVzc2FnZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlW10gVkFMVUVTID0gbmV3IGRvdWJsZVtdIHsuMSwgMTI0LCA0NzM2LCA4MzUuNjgzLCA5OCwgMzk1fTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1hNTCA9Ci0gICAgICAgICAgICAiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnIHN0YW5kYWxvbmU9J3llcycgPz4iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVU1NQVJZX1hNTCA9Ci0gICAgICAgICAgICBIRUFERVJfWE1MICsgIlxyXG4iICsKLSAgICAgICAgICAgICI8U3VtbWFyeT5cclxuIiArCi0gICAgICAgICAgICAiICA8TWV0cmljIHNvdXJjZT1cImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuUmVwb3J0TG9nVGVzdCMlc1wiICIKLSAgICAgICAgICAgICsgIm1lc3NhZ2U9XCJTYW1wbGVcIiBzY29yZV90eXBlPVwiaGlnaGVyX2JldHRlclwiIHNjb3JlX3VuaXQ9XCJieXRlXCI+XHJcbiIgKwotICAgICAgICAgICAgIiAgICA8VmFsdWU+MS4wPC9WYWx1ZT5cclxuIiArCi0gICAgICAgICAgICAiICA8L01ldHJpYz5cclxuIiArCi0gICAgICAgICAgICAiPC9TdW1tYXJ5PiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZVTExfWE1MID0gU1VNTUFSWV9YTUw7Ci0KLSAgICBwcml2YXRlIFJlcG9ydExvZyBtUmVwb3J0TG9nOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbVJlcG9ydExvZyA9IG5ldyBSZXBvcnRMb2coKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXplX251bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFJlcG9ydExvZy5zZXJpYWxpemUobnVsbCk7Ci0gICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gd2hlbiBzZXJpYWxpemluZyBhbiBlbXB0eSByZXBvcnQiKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIEV4cGVjdGVkCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXplX25vRGF0YSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBSZXBvcnRMb2cuc2VyaWFsaXplKG1SZXBvcnRMb2cpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemVfc3VtbWFyeU9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbVJlcG9ydExvZy5zZXRTdW1tYXJ5KCJTYW1wbGUiLCAxLjAsIFJlc3VsdFR5cGUuSElHSEVSX0JFVFRFUiwgUmVzdWx0VW5pdC5CWVRFKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5mb3JtYXQoU1VNTUFSWV9YTUwsICJ0ZXN0U2VyaWFsaXplX3N1bW1hcnlPbmx5OjY2IiksCi0gICAgICAgICAgICAgICAgUmVwb3J0TG9nLnNlcmlhbGl6ZShtUmVwb3J0TG9nKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6ZV9kZXRhaWxPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1SZXBvcnRMb2cuYWRkVmFsdWVzKCJEZXRhaWxzIiwgVkFMVUVTLCBSZXN1bHRUeXBlLk5FVVRSQUwsIFJlc3VsdFVuaXQuRlBTKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEhFQURFUl9YTUwsIFJlcG9ydExvZy5zZXJpYWxpemUobVJlcG9ydExvZykpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemVfZnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtUmVwb3J0TG9nLnNldFN1bW1hcnkoIlNhbXBsZSIsIDEuMCwgUmVzdWx0VHlwZS5ISUdIRVJfQkVUVEVSLCBSZXN1bHRVbml0LkJZVEUpOwotICAgICAgICBtUmVwb3J0TG9nLmFkZFZhbHVlcygiRGV0YWlscyIsIFZBTFVFUywgUmVzdWx0VHlwZS5ORVVUUkFMLCBSZXN1bHRVbml0LkZQUyk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmcuZm9ybWF0KEZVTExfWE1MLCAidGVzdFNlcmlhbGl6ZV9mdWxsOjc3IiksCi0gICAgICAgICAgICAgICAgUmVwb3J0TG9nLnNlcmlhbGl6ZShtUmVwb3J0TG9nKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBhcnNlX251bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFJlcG9ydExvZy5wYXJzZSgoU3RyaW5nKSBudWxsKTsKLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3aGVuIHBhc3NpbmcgYSBudWxsIHJlcG9ydCIpOwotICAgICAgICB9IGNhdGNoKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBFeHBlY3RlZAotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBhcnNlX25vRGF0YSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBSZXBvcnRMb2cgcmVwb3J0ID0gUmVwb3J0TG9nLnBhcnNlKEhFQURFUl9YTUwpOwotICAgICAgICBhc3NlcnROdWxsKHJlcG9ydC5nZXRTdW1tYXJ5KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZV9zdW1tYXJ5T25seSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBSZXBvcnRMb2cgcmVwb3J0ID0gUmVwb3J0TG9nLnBhcnNlKFN0cmluZy5mb3JtYXQoU1VNTUFSWV9YTUwsICJ0ZXN0UGFyc2Vfc3VtbWFyeU9ubHk6MTI1IikpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJlcG9ydCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiU2FtcGxlIiwgcmVwb3J0LmdldFN1bW1hcnkoKS5nZXRNZXNzYWdlKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZV9mdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFJlcG9ydExvZyByZXBvcnQgPSBSZXBvcnRMb2cucGFyc2UoU3RyaW5nLmZvcm1hdChGVUxMX1hNTCwgInRlc3RQYXJzZV9mdWxsOjE0MCIpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXBvcnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlNhbXBsZSIsIHJlcG9ydC5nZXRTdW1tYXJ5KCkuZ2V0TWVzc2FnZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TGltaXRzX3NvdXJjZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBTaG91bGQgcGFzcyB3aXRoIGEgc2hvcnQgc291cmNlLgotICAgICAgICBNZXRyaWMgbWV0cmljID0gbmV3IE1ldHJpYyhTT1VSQ0UsIE1FU1NBR0UsIDEuMCwgUmVzdWx0VHlwZS5ISUdIRVJfQkVUVEVSLCBSZXN1bHRVbml0LkJZVEUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIG1lc3NhZ2UgdG8gYmUgb2siLCBTT1VSQ0UsIG1ldHJpYy5nZXRTb3VyY2UoKSk7Ci0gICAgICAgIC8vIE1ha2UgYSBsb25nIHNvdXJjZS4KLSAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIC8vIDQwIHggIlNvdXJjZSIgPSAyNDAgY2hhcmFjdGVyIHN0cmluZwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQwOyBpKyspIHNiLmFwcGVuZChTT1VSQ0UpOwotICAgICAgICBTdHJpbmcgc291cmNlID0gc2IudG9TdHJpbmcoKTsKLSAgICAgICAgLy8gU2hvdWxkIGJlIHRyaW1tZWQgYmVjYXVzZSBzb3VyY2UgaXMgdG9vIGxvbmcuCi0gICAgICAgIG1ldHJpYyA9IG5ldyBNZXRyaWMoc291cmNlLCBNRVNTQUdFLCAxLjAsIFJlc3VsdFR5cGUuSElHSEVSX0JFVFRFUiwgUmVzdWx0VW5pdC5CWVRFKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCBzb3VyY2UgdG8gYmUgdHJpbW1lZCIsIHNvdXJjZS5zdWJzdHJpbmcoc291cmNlLmxlbmd0aCgpIC0gMjAwKSwKLSAgICAgICAgICAgICAgICBtZXRyaWMuZ2V0U291cmNlKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RMaW1pdHNfbWVzc2FnZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBTaG91bGQgcGFzcyB3aXRoIGEgc2hvcnQgbWVzc2FnZS4KLSAgICAgICAgTWV0cmljIG1ldHJpYyA9IG5ldyBNZXRyaWMoU09VUkNFLCBNRVNTQUdFLCAxLjAsIFJlc3VsdFR5cGUuSElHSEVSX0JFVFRFUiwgUmVzdWx0VW5pdC5CWVRFKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCBtZXNzYWdlIHRvIGJlIG9rIiwgTUVTU0FHRSwgbWV0cmljLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIC8vIE1ha2UgYSBsb25nIG1lc3NhZ2UuCi0gICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAvLyA0MCB4ICJNZXNzYWdlIiA9IDI4MCBjaGFyYWN0ZXIgc3RyaW5nCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDA7IGkrKykgc2IuYXBwZW5kKE1FU1NBR0UpOwotICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IHNiLnRvU3RyaW5nKCk7Ci0gICAgICAgIC8vIFNob3VsZCBiZSB0cmltbWVkIGJlY2F1c2UgbWVzc2FnZSBpcyB0b28gbG9uZy4KLSAgICAgICAgbWV0cmljID0gbmV3IE1ldHJpYyhTT1VSQ0UsIG1lc3NhZ2UsIDEuMCwgUmVzdWx0VHlwZS5ISUdIRVJfQkVUVEVSLCBSZXN1bHRVbml0LkJZVEUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIG1lc3NhZ2UgdG8gYmUgdHJpbW1lZCIsIG1lc3NhZ2Uuc3Vic3RyaW5nKDAsIDIwMCksCi0gICAgICAgICAgICAgICAgbWV0cmljLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdExpbWl0c192YWx1ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gU2hvdWxkIHBhc3Mgd2l0aCBhIHNtYWxsIGFycmF5LgotICAgICAgICBNZXRyaWMgbWV0cmljID0gbmV3IE1ldHJpYyhTT1VSQ0UsIE1FU1NBR0UsIFZBTFVFUywgUmVzdWx0VHlwZS5ISUdIRVJfQkVUVEVSLAotICAgICAgICAgICAgICAgIFJlc3VsdFVuaXQuQllURSk7Ci0gICAgICAgIGFzc2VydFRydWUoIkV4cGVjdGVkIHZhbHVlcyB0byBiZSBvayIsIEFycmF5cy5lcXVhbHMoVkFMVUVTLCBtZXRyaWMuZ2V0VmFsdWVzKCkpKTsKLSAgICAgICAgLy8gTWFrZSBhIGJpZyBhcnJheS4KLSAgICAgICAgZG91YmxlW10gdmFsdWVzID0gbmV3IGRvdWJsZVsxMDAxXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHZhbHVlc1tpXSA9IGk7Ci0gICAgICAgIC8vIFNob3VsZCBiZSB0cmltbWVkIGJlY2F1c2UgYXJyYXkgaXMgdG9vIGJpZy4KLSAgICAgICAgbWV0cmljID0gbmV3IE1ldHJpYyhTT1VSQ0UsIE1FU1NBR0UsIHZhbHVlcywgUmVzdWx0VHlwZS5ISUdIRVJfQkVUVEVSLCBSZXN1bHRVbml0LkJZVEUpOwotICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCB2YWx1ZXMgdG8gYmUgdHJpbW1lZCIsIEFycmF5cy5lcXVhbHMoQXJyYXlzLmNvcHlPZih2YWx1ZXMsIDEwMDApLAotICAgICAgICAgICAgICAgIG1ldHJpYy5nZXRWYWx1ZXMoKSkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3V0aWwvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvUmVzdWx0SGFuZGxlclRlc3QuamF2YSBiL2NvbW1vbi91dGlsL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1Jlc3VsdEhhbmRsZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMmRiOGUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3V0aWwvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvUmVzdWx0SGFuZGxlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsOwotCi1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudXRpbC5GaWxlVXRpbDsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC51dGlsLkFiaVV0aWxzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOwotaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIFVuaXQgdGVzdHMgZm9yIHtAbGluayBSZXN1bHRIYW5kbGVyfQotICovCi1wdWJsaWMgY2xhc3MgUmVzdWx0SGFuZGxlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VJVEVfTkFNRSA9ICJDVFMiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVUlURV9WRVJTSU9OID0gIjUuMCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNVSVRFX1BMQU4gPSAiY3RzIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VJVEVfQlVJTEQgPSAiMTIzNDUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBPUlRfVkVSU0lPTiA9ICI1LjAiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPU19OQU1FID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9TX1ZFUlNJT04gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLnZlcnNpb24iKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1NfQVJDSCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MuYXJjaCIpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX1ZFTkRPUiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS52ZW5kb3IiKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9WRVJTSU9OID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnZlcnNpb24iKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9BID0gIk1vZHVsZUEiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0IgPSAiTW9kdWxlQiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERPTkVfQSA9ICJmYWxzZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERPTkVfQiA9ICJ0cnVlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlVOVElNRV9BID0gIjEwMCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJVTlRJTUVfQiA9ICIyMDAiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQkkgPSAibWlwczY0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfQSA9IEFiaVV0aWxzLmNyZWF0ZUlkKEFCSSwgTkFNRV9BKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfQiA9IEFiaVV0aWxzLmNyZWF0ZUlkKEFCSSwgTkFNRV9CKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVUlMRF9JRCA9ICJidWlsZF9pZCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVSUxEX1BST0RVQ1QgPSAiYnVpbGRfcHJvZHVjdCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYQU1QTEVfQlVJTERfSUQgPSAiWFlaIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhBTVBMRV9CVUlMRF9QUk9EVUNUID0gIndvbHZlcmluZSI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVWSUNFX0EgPSAiZGV2aWNlMTIzIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVWSUNFX0IgPSAiZGV2aWNlNDU2IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVWSUNFUyA9ICJkZXZpY2U0NTYsZGV2aWNlMTIzIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfQSA9ICJhbmRyb2lkLnRlc3QuRm9vciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX0IgPSAiYW5kcm9pZC50ZXN0LkJhciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF8xID0gInRlc3RCbGFoMSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF8yID0gInRlc3RCbGFoMiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF8zID0gInRlc3RCbGFoMyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF80ID0gInRlc3RCbGFoNCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF81ID0gInRlc3RCbGFoNSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNVTU1BUllfU09VUkNFID0gU3RyaW5nLmZvcm1hdCgiJXMjJXM6MjAiLCBDTEFTU19CLCBNRVRIT0RfNCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNVTU1BUllfTUVTU0FHRSA9ICJIZWFkbGluZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIFNVTU1BUllfVkFMVUUgPSA5MDAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFID0gIlNvbWV0aGluZyBzbWFsbCBpcyBub3QgYWxyaWdodCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQUNLX1RSQUNFID0gIlNvbWV0aGluZyBzbWFsbCBpcyBub3QgYWxyaWdodFxuICIgKwotICAgICAgICAgICAgImF0IGZvdXIuYmlnLmluc2VjdHMuTWFybGV5LnNpbmcoTWFybGV5LmphdmE6MTApIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVHX1JFUE9SVCA9ICJodHRwczovL2Nuc3ZpZXdlci5jb3JwLmdvb2dsZS5jb20vY25zL2J1Z3JlcG9ydC50eHQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dDQVQgPSAiaHR0cHM6Ly9jbnN2aWV3ZXIuY29ycC5nb29nbGUuY29tL2Nucy9sb2djYXQuZ3oiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQ1JFRU5TSE9UID0gImh0dHBzOi8vY25zdmlld2VyLmNvcnAuZ29vZ2xlLmNvbS9zY3JlZW5zaG90LnBuZyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBTVEFSVF9NUyA9IDE0MzE1ODY4MDEwMDBMOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgRU5EX01TID0gMTQzMTY3MzE5OTAwMEw7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVJUX0RJU1BMQVkgPSAiRnJpIEF1ZyAyMCAxNToxMzowMyBQRFQgMjAxMCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVORF9ESVNQTEFZID0gIkZyaSBBdWcgMjAgMTU6MTM6MDQgUERUIDIwMTAiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRkVSRU5DRV9VUkw9Imh0dHA6Ly9hbmRyb2lkLmNvbSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19VUkwgPSJmaWxlOi8vL3BhdGgvdG8vbG9ncyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfTElORV9BUkdTID0gImN0cyAtbSBDdHNNeU1vZHVsZVRlc3RDYXNlcyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9CQVNFID0KLSAgICAgICAgICAgICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCcgc3RhbmRhbG9uZT0nbm8nID8+IiArCi0gICAgICAgICAgICAiPD94bWwtc3R5bGVzaGVldCB0eXBlPVwidGV4dC94c2xcIiBocmVmPVwiY29tcGF0aWJpbGl0eV9yZXN1bHQueHNsXCI/PlxuIiArCi0gICAgICAgICAgICAiPFJlc3VsdCBzdGFydD1cIiVkXCIgZW5kPVwiJWRcIiBzdGFydF9kaXNwbGF5PVwiJXNcIiIgKwotICAgICAgICAgICAgImVuZF9kaXNwbGF5PVwiJXNcIiBzdWl0ZV9uYW1lPVwiJXNcIiBzdWl0ZV92ZXJzaW9uPVwiJXNcIiAiICsKLSAgICAgICAgICAgICJzdWl0ZV9wbGFuPVwiJXNcIiBzdWl0ZV9idWlsZF9udW1iZXI9XCIlc1wiIHJlcG9ydF92ZXJzaW9uPVwiJXNcIiAiICsKLSAgICAgICAgICAgICJkZXZpY2VzPVwiJXNcIiBob3N0X25hbWU9XCIlc1wiIiArCi0gICAgICAgICAgICAib3NfbmFtZT1cIiVzXCIgb3NfdmVyc2lvbj1cIiVzXCIgb3NfYXJjaD1cIiVzXCIgamF2YV92ZW5kb3I9XCIlc1wiIiArCi0gICAgICAgICAgICAiamF2YV92ZXJzaW9uPVwiJXNcIiByZWZlcmVuY2VfdXJsPVwiJXNcIiBsb2dfdXJsPVwiJXNcIiIgKwotICAgICAgICAgICAgImNvbW1hbmRfbGluZV9hcmdzPVwiJXNcIj5cbiIgKwotICAgICAgICAgICAgIiVzJXMlcyIgKwotICAgICAgICAgICAgIjwvUmVzdWx0PiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9CVUlMRF9JTkZPID0KLSAgICAgICAgICAgICIgIDxCdWlsZCBidWlsZF9maW5nZXJwcmludD1cIiVzXCIgIiArIEJVSUxEX0lEICsgIj1cIiVzXCIgIiArCi0gICAgICAgICAgICAgICBCVUlMRF9QUk9EVUNUICsgIj1cIiVzXCIgLz5cbiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9TVU1NQVJZID0KLSAgICAgICAgICAgICIgIDxTdW1tYXJ5IHBhc3M9XCIlZFwiIGZhaWxlZD1cIiVkXCIgIiArCi0gICAgICAgICAgICAibW9kdWxlc19kb25lPVwiMVwiIG1vZHVsZXNfdG90YWw9XCIxXCIgLz5cbiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9NT0RVTEUgPQotICAgICAgICAgICAgIiAgPE1vZHVsZSBuYW1lPVwiJXNcIiBhYmk9XCIlc1wiIGRldmljZT1cIiVzXCIgcnVudGltZT1cIiVzXCIgZG9uZT1cIiVzXCI+XG4iICsKLSAgICAgICAgICAgICIlcyIgKwotICAgICAgICAgICAgIiAgPC9Nb2R1bGU+XG4iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfQ0FTRSA9Ci0gICAgICAgICAgICAiICAgIDxUZXN0Q2FzZSBuYW1lPVwiJXNcIj5cbiIgKwotICAgICAgICAgICAgIiVzIiArCi0gICAgICAgICAgICAiICAgIDwvVGVzdENhc2U+XG4iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfVEVTVF9QQVNTID0KLSAgICAgICAgICAgICIgICAgICA8VGVzdCByZXN1bHQ9XCJwYXNzXCIgbmFtZT1cIiVzXCIvPlxuIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1RFU1RfU0tJUCA9Ci0gICAgICAgICAgICAiICAgICAgPFRlc3QgcmVzdWx0PVwicGFzc1wiIG5hbWU9XCIlc1wiIHNraXBwZWQ9XCJ0cnVlXCIvPlxuIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1RFU1RfRkFJTCA9Ci0gICAgICAgICAgICAiICAgICAgPFRlc3QgcmVzdWx0PVwiZmFpbFwiIG5hbWU9XCIlc1wiPlxuIiArCi0gICAgICAgICAgICAiICAgICAgICA8RmFpbHVyZSBtZXNzYWdlPVwiJXNcIj5cbiIgKwotICAgICAgICAgICAgIiAgICAgICAgICA8U3RhY2tUcmFjZT4lczwvU3RhY2tUcmFjZT5cbiIgKwotICAgICAgICAgICAgIiAgICAgICAgPC9GYWlsdXJlPlxuIiArCi0gICAgICAgICAgICAiICAgICAgICA8QnVnUmVwb3J0PiVzPC9CdWdSZXBvcnQ+XG4iICsKLSAgICAgICAgICAgICIgICAgICAgIDxMb2djYXQ+JXM8L0xvZ2NhdD5cbiIgKwotICAgICAgICAgICAgIiAgICAgICAgPFNjcmVlbnNob3Q+JXM8L1NjcmVlbnNob3Q+XG4iICsKLSAgICAgICAgICAgICIgICAgICA8L1Rlc3Q+XG4iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfVEVTVF9SRVNVTFQgPQotICAgICAgICAgICAgIiAgICAgIDxUZXN0IHJlc3VsdD1cInBhc3NcIiBuYW1lPVwiJXNcIj5cbiIgKwotICAgICAgICAgICAgIiAgICAgICAgPFN1bW1hcnk+XG4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgPE1ldHJpYyBzb3VyY2U9XCIlc1wiIG1lc3NhZ2U9XCIlc1wiIHNjb3JlX3R5cGU9XCIlc1wiIHNjb3JlX3VuaXQ9XCIlc1wiPlxuIiArCi0gICAgICAgICAgICAiICAgICAgICAgICAgIDxWYWx1ZT4lczwvVmFsdWU+XG4iICsKLSAgICAgICAgICAgICIgICAgICAgICAgPC9NZXRyaWM+XG4iICsKLSAgICAgICAgICAgICIgICAgICAgIDwvU3VtbWFyeT5cbiIgKwotICAgICAgICAgICAgIiAgICAgIDwvVGVzdD5cbiI7Ci0gICAgcHJpdmF0ZSBGaWxlIHJlc3VsdHNEaXIgPSBudWxsOwotICAgIHByaXZhdGUgRmlsZSByZXN1bHREaXIgPSBudWxsOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcmVzdWx0c0RpciA9IEZpbGVVdGlsLmNyZWF0ZVRlbXBEaXIoInJlc3VsdHMiKTsKLSAgICAgICAgcmVzdWx0RGlyID0gRmlsZVV0aWwuY3JlYXRlVGVtcERpcigiMTIzNDUiLCByZXN1bHRzRGlyKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBGaWxlVXRpbC5yZWN1cnNpdmVEZWxldGUocmVzdWx0c0Rpcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSUludm9jYXRpb25SZXN1bHQgcmVzdWx0ID0gbmV3IEludm9jYXRpb25SZXN1bHQoKTsKLSAgICAgICAgcmVzdWx0LnNldFN0YXJ0VGltZShTVEFSVF9NUyk7Ci0gICAgICAgIHJlc3VsdC5zZXRUZXN0UGxhbihTVUlURV9QTEFOKTsKLSAgICAgICAgcmVzdWx0LmFkZERldmljZVNlcmlhbChERVZJQ0VfQSk7Ci0gICAgICAgIHJlc3VsdC5hZGREZXZpY2VTZXJpYWwoREVWSUNFX0IpOwotICAgICAgICByZXN1bHQuYWRkSW52b2NhdGlvbkluZm8oQlVJTERfSUQsIEVYQU1QTEVfQlVJTERfSUQpOwotICAgICAgICByZXN1bHQuYWRkSW52b2NhdGlvbkluZm8oQlVJTERfUFJPRFVDVCwgRVhBTVBMRV9CVUlMRF9QUk9EVUNUKTsKLSAgICAgICAgLy8gTW9kdWxlIEE6IHRlc3QxIHBhc3NlcywgdGVzdDIgbm90IGV4ZWN1dGVkCi0gICAgICAgIElNb2R1bGVSZXN1bHQgbW9kdWxlQSA9IHJlc3VsdC5nZXRPckNyZWF0ZU1vZHVsZShJRF9BKTsKLSAgICAgICAgbW9kdWxlQS5zZXREb25lKGZhbHNlKTsKLSAgICAgICAgbW9kdWxlQS5hZGRSdW50aW1lKEludGVnZXIucGFyc2VJbnQoUlVOVElNRV9BKSk7Ci0gICAgICAgIElDYXNlUmVzdWx0IG1vZHVsZUFDYXNlID0gbW9kdWxlQS5nZXRPckNyZWF0ZVJlc3VsdChDTEFTU19BKTsKLSAgICAgICAgSVRlc3RSZXN1bHQgbW9kdWxlQVRlc3QxID0gbW9kdWxlQUNhc2UuZ2V0T3JDcmVhdGVSZXN1bHQoTUVUSE9EXzEpOwotICAgICAgICBtb2R1bGVBVGVzdDEuc2V0UmVzdWx0U3RhdHVzKFRlc3RTdGF0dXMuUEFTUyk7Ci0gICAgICAgIElUZXN0UmVzdWx0IG1vZHVsZUFUZXN0MiA9IG1vZHVsZUFDYXNlLmdldE9yQ3JlYXRlUmVzdWx0KE1FVEhPRF8yKTsKLSAgICAgICAgbW9kdWxlQVRlc3QyLnNldFJlc3VsdFN0YXR1cyhudWxsKTsgLy8gbm90IGV4ZWN1dGVkIHRlc3QKLSAgICAgICAgLy8gTW9kdWxlIEI6IHRlc3QzIGZhaWxzLCB0ZXN0NCBwYXNzZXMgd2l0aCByZXBvcnQgbG9nLCB0ZXN0NSBwYXNzZXMgd2l0aCBza2lwCi0gICAgICAgIElNb2R1bGVSZXN1bHQgbW9kdWxlQiA9IHJlc3VsdC5nZXRPckNyZWF0ZU1vZHVsZShJRF9CKTsKLSAgICAgICAgbW9kdWxlQi5zZXREb25lKHRydWUpOwotICAgICAgICBtb2R1bGVCLmFkZFJ1bnRpbWUoSW50ZWdlci5wYXJzZUludChSVU5USU1FX0IpKTsKLSAgICAgICAgSUNhc2VSZXN1bHQgbW9kdWxlQkNhc2UgPSBtb2R1bGVCLmdldE9yQ3JlYXRlUmVzdWx0KENMQVNTX0IpOwotICAgICAgICBJVGVzdFJlc3VsdCBtb2R1bGVCVGVzdDMgPSBtb2R1bGVCQ2FzZS5nZXRPckNyZWF0ZVJlc3VsdChNRVRIT0RfMyk7Ci0gICAgICAgIG1vZHVsZUJUZXN0My5zZXRSZXN1bHRTdGF0dXMoVGVzdFN0YXR1cy5GQUlMKTsKLSAgICAgICAgbW9kdWxlQlRlc3QzLnNldE1lc3NhZ2UoTUVTU0FHRSk7Ci0gICAgICAgIG1vZHVsZUJUZXN0My5zZXRTdGFja1RyYWNlKFNUQUNLX1RSQUNFKTsKLSAgICAgICAgbW9kdWxlQlRlc3QzLnNldEJ1Z1JlcG9ydChCVUdfUkVQT1JUKTsKLSAgICAgICAgbW9kdWxlQlRlc3QzLnNldExvZyhMT0dDQVQpOwotICAgICAgICBtb2R1bGVCVGVzdDMuc2V0U2NyZWVuc2hvdChTQ1JFRU5TSE9UKTsKLSAgICAgICAgSVRlc3RSZXN1bHQgbW9kdWxlQlRlc3Q0ID0gbW9kdWxlQkNhc2UuZ2V0T3JDcmVhdGVSZXN1bHQoTUVUSE9EXzQpOwotICAgICAgICBtb2R1bGVCVGVzdDQuc2V0UmVzdWx0U3RhdHVzKFRlc3RTdGF0dXMuUEFTUyk7Ci0gICAgICAgIFJlcG9ydExvZyByZXBvcnQgPSBuZXcgUmVwb3J0TG9nKCk7Ci0gICAgICAgIFJlcG9ydExvZy5NZXRyaWMgc3VtbWFyeSA9IG5ldyBSZXBvcnRMb2cuTWV0cmljKFNVTU1BUllfU09VUkNFLCBTVU1NQVJZX01FU1NBR0UsCi0gICAgICAgICAgICAgICAgU1VNTUFSWV9WQUxVRSwgUmVzdWx0VHlwZS5ISUdIRVJfQkVUVEVSLCBSZXN1bHRVbml0LlNDT1JFKTsKLSAgICAgICAgcmVwb3J0LnNldFN1bW1hcnkoc3VtbWFyeSk7Ci0gICAgICAgIG1vZHVsZUJUZXN0NC5zZXRSZXBvcnRMb2cocmVwb3J0KTsKLSAgICAgICAgSVRlc3RSZXN1bHQgbW9kdWxlQlRlc3Q1ID0gbW9kdWxlQkNhc2UuZ2V0T3JDcmVhdGVSZXN1bHQoTUVUSE9EXzUpOwotICAgICAgICBtb2R1bGVCVGVzdDUuc2tpcHBlZCgpOwotCi0gICAgICAgIC8vIFNlcmlhbGl6ZSB0byBmaWxlCi0gICAgICAgIFJlc3VsdEhhbmRsZXIud3JpdGVSZXN1bHRzKFNVSVRFX05BTUUsIFNVSVRFX1ZFUlNJT04sIFNVSVRFX1BMQU4sIFNVSVRFX0JVSUxELAotICAgICAgICAgICAgICAgIHJlc3VsdCwgcmVzdWx0RGlyLCBTVEFSVF9NUywgRU5EX01TLCBSRUZFUkVOQ0VfVVJMLCBMT0dfVVJMLAotICAgICAgICAgICAgICAgIENPTU1BTkRfTElORV9BUkdTKTsKLQotICAgICAgICAvLyBQYXJzZSB0aGUgcmVzdWx0cyBhbmQgYXNzZXJ0IGNvcnJlY3RuZXNzCi0gICAgICAgIGNoZWNrUmVzdWx0KFJlc3VsdEhhbmRsZXIuZ2V0UmVzdWx0RnJvbURpcihyZXN1bHREaXIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2luZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBGaWxlIHJlc3VsdERpciA9IHdyaXRlUmVzdWx0RGlyKHJlc3VsdHNEaXIpOwotICAgICAgICAvLyBQYXJzZSB0aGUgcmVzdWx0cyBhbmQgYXNzZXJ0IGNvcnJlY3RuZXNzCi0gICAgICAgIGNoZWNrUmVzdWx0KFJlc3VsdEhhbmRsZXIuZ2V0UmVzdWx0RnJvbURpcihyZXN1bHREaXIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TGlnaHRSZXN1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgcmVzdWx0RGlyID0gd3JpdGVSZXN1bHREaXIocmVzdWx0c0Rpcik7Ci0gICAgICAgIExpc3Q8SUludm9jYXRpb25SZXN1bHQ+IGxpZ2h0UmVzdWx0cyA9IFJlc3VsdEhhbmRsZXIuZ2V0TGlnaHRSZXN1bHRzKHJlc3VsdHNEaXIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIG9uZSByZXN1bHQiLCAxLCBsaWdodFJlc3VsdHMuc2l6ZSgpKTsKLSAgICAgICAgSUludm9jYXRpb25SZXN1bHQgbGlnaHRSZXN1bHQgPSBsaWdodFJlc3VsdHMuZ2V0KDApOwotICAgICAgICBjaGVja0xpZ2h0UmVzdWx0KGxpZ2h0UmVzdWx0KTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEhlbHBlciB0byB3cml0ZSBhIHJlc3VsdCB0byB0aGUgcmVzdWx0cyBkaXIsIGZvciB0ZXN0aW5nLgotICAgICAqIEByZXR1cm4gdGhlIHdyaXR0ZW4gcmVzdWx0RGlyCi0gICAgICovCi0gICAgc3RhdGljIEZpbGUgd3JpdGVSZXN1bHREaXIoRmlsZSByZXN1bHRzRGlyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBGaWxlIHJlc3VsdERpciA9IG51bGw7Ci0gICAgICAgIEZpbGVXcml0ZXIgd3JpdGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlc3VsdERpciA9IEZpbGVVdGlsLmNyZWF0ZVRlbXBEaXIoIjEyMzQ1IiwgcmVzdWx0c0Rpcik7Ci0gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIHJlc3VsdCBmaWxlCi0gICAgICAgICAgICBGaWxlIHJlc3VsdEZpbGUgPSBuZXcgRmlsZShyZXN1bHREaXIsIFJlc3VsdEhhbmRsZXIuVEVTVF9SRVNVTFRfRklMRV9OQU1FKTsKLSAgICAgICAgICAgIHdyaXRlciA9IG5ldyBGaWxlV3JpdGVyKHJlc3VsdEZpbGUpOwotICAgICAgICAgICAgU3RyaW5nIGJ1aWxkSW5mbyA9IFN0cmluZy5mb3JtYXQoWE1MX0JVSUxEX0lORk8sIERFVklDRV9BLAotICAgICAgICAgICAgICAgICAgICBFWEFNUExFX0JVSUxEX0lELCBFWEFNUExFX0JVSUxEX1BST0RVQ1QpOwotICAgICAgICAgICAgU3RyaW5nIHN1bW1hcnkgPSBTdHJpbmcuZm9ybWF0KFhNTF9TVU1NQVJZLCAyLCAxKTsKLSAgICAgICAgICAgIFN0cmluZyBtb2R1bGVBVGVzdCA9IFN0cmluZy5mb3JtYXQoWE1MX1RFU1RfUEFTUywgTUVUSE9EXzEpOwotICAgICAgICAgICAgU3RyaW5nIG1vZHVsZUFDYXNlcyA9IFN0cmluZy5mb3JtYXQoWE1MX0NBU0UsIENMQVNTX0EsIG1vZHVsZUFUZXN0KTsKLSAgICAgICAgICAgIFN0cmluZyBtb2R1bGVBID0gU3RyaW5nLmZvcm1hdChYTUxfTU9EVUxFLCBOQU1FX0EsIEFCSSwgREVWSUNFX0EsIFJVTlRJTUVfQSwgRE9ORV9BLAotICAgICAgICAgICAgICAgICAgICBtb2R1bGVBQ2FzZXMpOwotICAgICAgICAgICAgU3RyaW5nIG1vZHVsZUJUZXN0MyA9IFN0cmluZy5mb3JtYXQoWE1MX1RFU1RfRkFJTCwgTUVUSE9EXzMsIE1FU1NBR0UsIFNUQUNLX1RSQUNFLAotICAgICAgICAgICAgICAgICAgICBCVUdfUkVQT1JULCBMT0dDQVQsIFNDUkVFTlNIT1QpOwotICAgICAgICAgICAgU3RyaW5nIG1vZHVsZUJUZXN0NCA9IFN0cmluZy5mb3JtYXQoWE1MX1RFU1RfUkVTVUxULCBNRVRIT0RfNCwgU1VNTUFSWV9TT1VSQ0UsCi0gICAgICAgICAgICAgICAgICAgIFNVTU1BUllfTUVTU0FHRSwgUmVzdWx0VHlwZS5ISUdIRVJfQkVUVEVSLnRvUmVwb3J0U3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgIFJlc3VsdFVuaXQuU0NPUkUudG9SZXBvcnRTdHJpbmcoKSwgRG91YmxlLnRvU3RyaW5nKFNVTU1BUllfVkFMVUUpKTsKLSAgICAgICAgICAgIFN0cmluZyBtb2R1bGVCVGVzdDUgPSBTdHJpbmcuZm9ybWF0KFhNTF9URVNUX1NLSVAsIE1FVEhPRF81KTsKLSAgICAgICAgICAgIFN0cmluZyBtb2R1bGVCVGVzdHMgPSBTdHJpbmcuam9pbigiIiwgbW9kdWxlQlRlc3QzLCBtb2R1bGVCVGVzdDQsIG1vZHVsZUJUZXN0NSk7Ci0gICAgICAgICAgICBTdHJpbmcgbW9kdWxlQkNhc2VzID0gU3RyaW5nLmZvcm1hdChYTUxfQ0FTRSwgQ0xBU1NfQiwgbW9kdWxlQlRlc3RzKTsKLSAgICAgICAgICAgIFN0cmluZyBtb2R1bGVCID0gU3RyaW5nLmZvcm1hdChYTUxfTU9EVUxFLCBOQU1FX0IsIEFCSSwgREVWSUNFX0IsIFJVTlRJTUVfQiwgRE9ORV9CLAotICAgICAgICAgICAgICAgICAgICBtb2R1bGVCQ2FzZXMpOwotICAgICAgICAgICAgU3RyaW5nIG1vZHVsZXMgPSBTdHJpbmcuam9pbigiIiwgbW9kdWxlQSwgbW9kdWxlQik7Ci0gICAgICAgICAgICBTdHJpbmcgaG9zdE5hbWUgPSAiIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaG9zdE5hbWUgPSBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKS5nZXRIb3N0TmFtZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gaWdub3JlZCkge30KLSAgICAgICAgICAgIFN0cmluZyBvdXRwdXQgPSBTdHJpbmcuZm9ybWF0KFhNTF9CQVNFLCBTVEFSVF9NUywgRU5EX01TLCBTVEFSVF9ESVNQTEFZLCBFTkRfRElTUExBWSwKLSAgICAgICAgICAgICAgICAgICAgU1VJVEVfTkFNRSwgU1VJVEVfVkVSU0lPTiwgU1VJVEVfUExBTiwgU1VJVEVfQlVJTEQsIFJFUE9SVF9WRVJTSU9OLCBERVZJQ0VTLAotICAgICAgICAgICAgICAgICAgICBob3N0TmFtZSwgT1NfTkFNRSwgT1NfVkVSU0lPTiwgT1NfQVJDSCwgSkFWQV9WRU5ET1IsCi0gICAgICAgICAgICAgICAgICAgIEpBVkFfVkVSU0lPTiwgUkVGRVJFTkNFX1VSTCwgTE9HX1VSTCwgQ09NTUFORF9MSU5FX0FSR1MsCi0gICAgICAgICAgICAgICAgICAgIGJ1aWxkSW5mbywgc3VtbWFyeSwgbW9kdWxlcyk7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGUob3V0cHV0KTsKLSAgICAgICAgICAgIHdyaXRlci5mbHVzaCgpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHdyaXRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdERpcjsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBjaGVja0xpZ2h0UmVzdWx0KElJbnZvY2F0aW9uUmVzdWx0IGxpZ2h0UmVzdWx0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCAzIHBhc3NlcyIsIDMsIGxpZ2h0UmVzdWx0LmNvdW50UmVzdWx0cyhUZXN0U3RhdHVzLlBBU1MpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCAxIGZhaWx1cmUiLCAxLCBsaWdodFJlc3VsdC5jb3VudFJlc3VsdHMoVGVzdFN0YXR1cy5GQUlMKSk7Ci0KLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBidWlsZEluZm8gPSBsaWdodFJlc3VsdC5nZXRJbnZvY2F0aW9uSW5mbygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBCdWlsZCBJRCIsIEVYQU1QTEVfQlVJTERfSUQsIGJ1aWxkSW5mby5nZXQoQlVJTERfSUQpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgQnVpbGQgUHJvZHVjdCIsCi0gICAgICAgICAgICBFWEFNUExFX0JVSUxEX1BST0RVQ1QsIGJ1aWxkSW5mby5nZXQoQlVJTERfUFJPRFVDVCkpOwotCi0gICAgICAgIFNldDxTdHJpbmc+IHNlcmlhbHMgPSBsaWdodFJlc3VsdC5nZXREZXZpY2VTZXJpYWxzKCk7Ci0gICAgICAgIGFzc2VydFRydWUoIk1pc3NpbmcgZGV2aWNlIiwgc2VyaWFscy5jb250YWlucyhERVZJQ0VfQSkpOwotICAgICAgICBhc3NlcnRUcnVlKCJNaXNzaW5nIGRldmljZSIsIHNlcmlhbHMuY29udGFpbnMoREVWSUNFX0IpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCAyIGRldmljZXMiLCAyLCBzZXJpYWxzLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCBkZXZpY2VzIiwgc2VyaWFscy5jb250YWlucyhERVZJQ0VfQSkgJiYgc2VyaWFscy5jb250YWlucyhERVZJQ0VfQikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBzdGFydCB0aW1lIiwgU1RBUlRfTVMsIGxpZ2h0UmVzdWx0LmdldFN0YXJ0VGltZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgdGVzdCBwbGFuIiwgU1VJVEVfUExBTiwgbGlnaHRSZXN1bHQuZ2V0VGVzdFBsYW4oKSk7Ci0gICAgICAgIExpc3Q8SU1vZHVsZVJlc3VsdD4gbW9kdWxlcyA9IGxpZ2h0UmVzdWx0LmdldE1vZHVsZXMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCAxIGNvbXBsZXRlZCBtb2R1bGUiLCAxLCBsaWdodFJlc3VsdC5nZXRNb2R1bGVDb21wbGV0ZUNvdW50KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIDIgdG90YWwgbW9kdWxlcyIsIDIsIG1vZHVsZXMuc2l6ZSgpKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBjaGVja1Jlc3VsdChJSW52b2NhdGlvblJlc3VsdCByZXN1bHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIDMgcGFzc2VzIiwgMywgcmVzdWx0LmNvdW50UmVzdWx0cyhUZXN0U3RhdHVzLlBBU1MpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCAxIGZhaWx1cmUiLCAxLCByZXN1bHQuY291bnRSZXN1bHRzKFRlc3RTdGF0dXMuRkFJTCkpOwotCi0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gYnVpbGRJbmZvID0gcmVzdWx0LmdldEludm9jYXRpb25JbmZvKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IEJ1aWxkIElEIiwgRVhBTVBMRV9CVUlMRF9JRCwgYnVpbGRJbmZvLmdldChCVUlMRF9JRCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBCdWlsZCBQcm9kdWN0IiwKLSAgICAgICAgICAgIEVYQU1QTEVfQlVJTERfUFJPRFVDVCwgYnVpbGRJbmZvLmdldChCVUlMRF9QUk9EVUNUKSk7Ci0KLSAgICAgICAgU2V0PFN0cmluZz4gc2VyaWFscyA9IHJlc3VsdC5nZXREZXZpY2VTZXJpYWxzKCk7Ci0gICAgICAgIGFzc2VydFRydWUoIk1pc3NpbmcgZGV2aWNlIiwgc2VyaWFscy5jb250YWlucyhERVZJQ0VfQSkpOwotICAgICAgICBhc3NlcnRUcnVlKCJNaXNzaW5nIGRldmljZSIsIHNlcmlhbHMuY29udGFpbnMoREVWSUNFX0IpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCAyIGRldmljZXMiLCAyLCBzZXJpYWxzLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCBkZXZpY2VzIiwgc2VyaWFscy5jb250YWlucyhERVZJQ0VfQSkgJiYgc2VyaWFscy5jb250YWlucyhERVZJQ0VfQikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBzdGFydCB0aW1lIiwgU1RBUlRfTVMsIHJlc3VsdC5nZXRTdGFydFRpbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IHRlc3QgcGxhbiIsIFNVSVRFX1BMQU4sIHJlc3VsdC5nZXRUZXN0UGxhbigpKTsKLQotICAgICAgICBMaXN0PElNb2R1bGVSZXN1bHQ+IG1vZHVsZXMgPSByZXN1bHQuZ2V0TW9kdWxlcygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIDIgbW9kdWxlcyIsIDIsIG1vZHVsZXMuc2l6ZSgpKTsKLQotICAgICAgICBJTW9kdWxlUmVzdWx0IG1vZHVsZUEgPSBtb2R1bGVzLmdldCgwKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCAxIHBhc3MiLCAxLCBtb2R1bGVBLmNvdW50UmVzdWx0cyhUZXN0U3RhdHVzLlBBU1MpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCAwIGZhaWx1cmVzIiwgMCwgbW9kdWxlQS5jb3VudFJlc3VsdHMoVGVzdFN0YXR1cy5GQUlMKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IEFCSSIsIEFCSSwgbW9kdWxlQS5nZXRBYmkoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IG5hbWUiLCBOQU1FX0EsIG1vZHVsZUEuZ2V0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgSUQiLCBJRF9BLCBtb2R1bGVBLmdldElkKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBydW50aW1lIiwgSW50ZWdlci5wYXJzZUludChSVU5USU1FX0EpLCBtb2R1bGVBLmdldFJ1bnRpbWUoKSk7Ci0gICAgICAgIExpc3Q8SUNhc2VSZXN1bHQ+IG1vZHVsZUFDYXNlcyA9IG1vZHVsZUEuZ2V0UmVzdWx0cygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIDEgdGVzdCBjYXNlIiwgMSwgbW9kdWxlQUNhc2VzLnNpemUoKSk7Ci0gICAgICAgIElDYXNlUmVzdWx0IG1vZHVsZUFDYXNlID0gbW9kdWxlQUNhc2VzLmdldCgwKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgbmFtZSIsIENMQVNTX0EsIG1vZHVsZUFDYXNlLmdldE5hbWUoKSk7Ci0gICAgICAgIExpc3Q8SVRlc3RSZXN1bHQ+IG1vZHVsZUFSZXN1bHRzID0gbW9kdWxlQUNhc2UuZ2V0UmVzdWx0cygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIDEgcmVzdWx0IiwgMSwgbW9kdWxlQVJlc3VsdHMuc2l6ZSgpKTsKLSAgICAgICAgSVRlc3RSZXN1bHQgbW9kdWxlQVRlc3QxID0gbW9kdWxlQVJlc3VsdHMuZ2V0KDApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBuYW1lIiwgTUVUSE9EXzEsIG1vZHVsZUFUZXN0MS5nZXROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCByZXN1bHQiLCBUZXN0U3RhdHVzLlBBU1MsIG1vZHVsZUFUZXN0MS5nZXRSZXN1bHRTdGF0dXMoKSk7Ci0gICAgICAgIGFzc2VydE51bGwoIlVuZXhwZWN0ZWQgYnVncmVwb3J0IiwgbW9kdWxlQVRlc3QxLmdldEJ1Z1JlcG9ydCgpKTsKLSAgICAgICAgYXNzZXJ0TnVsbCgiVW5leHBlY3RlZCBsb2ciLCBtb2R1bGVBVGVzdDEuZ2V0TG9nKCkpOwotICAgICAgICBhc3NlcnROdWxsKCJVbmV4cGVjdGVkIHNjcmVlbnNob3QiLCBtb2R1bGVBVGVzdDEuZ2V0U2NyZWVuc2hvdCgpKTsKLSAgICAgICAgYXNzZXJ0TnVsbCgiVW5leHBlY3RlZCBtZXNzYWdlIiwgbW9kdWxlQVRlc3QxLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIGFzc2VydE51bGwoIlVuZXhwZWN0ZWQgc3RhY2sgdHJhY2UiLCBtb2R1bGVBVGVzdDEuZ2V0U3RhY2tUcmFjZSgpKTsKLSAgICAgICAgYXNzZXJ0TnVsbCgiVW5leHBlY3RlZCByZXBvcnQiLCBtb2R1bGVBVGVzdDEuZ2V0UmVwb3J0TG9nKCkpOwotCi0gICAgICAgIElNb2R1bGVSZXN1bHQgbW9kdWxlQiA9IG1vZHVsZXMuZ2V0KDEpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIDIgcGFzc2VzIiwgMiwgbW9kdWxlQi5jb3VudFJlc3VsdHMoVGVzdFN0YXR1cy5QQVNTKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRXhwZWN0ZWQgMSBmYWlsdXJlIiwgMSwgbW9kdWxlQi5jb3VudFJlc3VsdHMoVGVzdFN0YXR1cy5GQUlMKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IEFCSSIsIEFCSSwgbW9kdWxlQi5nZXRBYmkoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IG5hbWUiLCBOQU1FX0IsIG1vZHVsZUIuZ2V0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgSUQiLCBJRF9CLCBtb2R1bGVCLmdldElkKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBydW50aW1lIiwgSW50ZWdlci5wYXJzZUludChSVU5USU1FX0IpLCBtb2R1bGVCLmdldFJ1bnRpbWUoKSk7Ci0gICAgICAgIExpc3Q8SUNhc2VSZXN1bHQ+IG1vZHVsZUJDYXNlcyA9IG1vZHVsZUIuZ2V0UmVzdWx0cygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIDEgdGVzdCBjYXNlIiwgMSwgbW9kdWxlQkNhc2VzLnNpemUoKSk7Ci0gICAgICAgIElDYXNlUmVzdWx0IG1vZHVsZUJDYXNlID0gbW9kdWxlQkNhc2VzLmdldCgwKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgbmFtZSIsIENMQVNTX0IsIG1vZHVsZUJDYXNlLmdldE5hbWUoKSk7Ci0gICAgICAgIExpc3Q8SVRlc3RSZXN1bHQ+IG1vZHVsZUJSZXN1bHRzID0gbW9kdWxlQkNhc2UuZ2V0UmVzdWx0cygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIDMgcmVzdWx0cyIsIDMsIG1vZHVsZUJSZXN1bHRzLnNpemUoKSk7Ci0gICAgICAgIElUZXN0UmVzdWx0IG1vZHVsZUJUZXN0MyA9IG1vZHVsZUJSZXN1bHRzLmdldCgwKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgbmFtZSIsIE1FVEhPRF8zLCBtb2R1bGVCVGVzdDMuZ2V0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgcmVzdWx0IiwgVGVzdFN0YXR1cy5GQUlMLCBtb2R1bGVCVGVzdDMuZ2V0UmVzdWx0U3RhdHVzKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBidWdyZXBvcnQiLCBCVUdfUkVQT1JULCBtb2R1bGVCVGVzdDMuZ2V0QnVnUmVwb3J0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBsb2ciLCBMT0dDQVQsIG1vZHVsZUJUZXN0My5nZXRMb2coKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IHNjcmVlbnNob3QiLCBTQ1JFRU5TSE9ULCBtb2R1bGVCVGVzdDMuZ2V0U2NyZWVuc2hvdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgbWVzc2FnZSIsIE1FU1NBR0UsIG1vZHVsZUJUZXN0My5nZXRNZXNzYWdlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBzdGFjayB0cmFjZSIsIFNUQUNLX1RSQUNFLCBtb2R1bGVCVGVzdDMuZ2V0U3RhY2tUcmFjZSgpKTsKLSAgICAgICAgYXNzZXJ0TnVsbCgiVW5leHBlY3RlZCByZXBvcnQiLCBtb2R1bGVCVGVzdDMuZ2V0UmVwb3J0TG9nKCkpOwotICAgICAgICBJVGVzdFJlc3VsdCBtb2R1bGVCVGVzdDQgPSBtb2R1bGVCUmVzdWx0cy5nZXQoMSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IG5hbWUiLCBNRVRIT0RfNCwgbW9kdWxlQlRlc3Q0LmdldE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IHJlc3VsdCIsIFRlc3RTdGF0dXMuUEFTUywgbW9kdWxlQlRlc3Q0LmdldFJlc3VsdFN0YXR1cygpKTsKLSAgICAgICAgYXNzZXJ0TnVsbCgiVW5leHBlY3RlZCBidWdyZXBvcnQiLCBtb2R1bGVCVGVzdDQuZ2V0QnVnUmVwb3J0KCkpOwotICAgICAgICBhc3NlcnROdWxsKCJVbmV4cGVjdGVkIGxvZyIsIG1vZHVsZUJUZXN0NC5nZXRMb2coKSk7Ci0gICAgICAgIGFzc2VydE51bGwoIlVuZXhwZWN0ZWQgc2NyZWVuc2hvdCIsIG1vZHVsZUJUZXN0NC5nZXRTY3JlZW5zaG90KCkpOwotICAgICAgICBhc3NlcnROdWxsKCJVbmV4cGVjdGVkIG1lc3NhZ2UiLCBtb2R1bGVCVGVzdDQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgYXNzZXJ0TnVsbCgiVW5leHBlY3RlZCBzdGFjayB0cmFjZSIsIG1vZHVsZUJUZXN0NC5nZXRTdGFja1RyYWNlKCkpOwotICAgICAgICBSZXBvcnRMb2cgcmVwb3J0ID0gbW9kdWxlQlRlc3Q0LmdldFJlcG9ydExvZygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJFeHBlY3RlZCByZXBvcnQiLCByZXBvcnQpOwotICAgICAgICBSZXBvcnRMb2cuTWV0cmljIHN1bW1hcnkgPSByZXBvcnQuZ2V0U3VtbWFyeSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJFeHBlY3RlZCByZXBvcnQgc3VtbWFyeSIsIHN1bW1hcnkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBzb3VyY2UiLCBTVU1NQVJZX1NPVVJDRSwgc3VtbWFyeS5nZXRTb3VyY2UoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IG1lc3NhZ2UiLCBTVU1NQVJZX01FU1NBR0UsIHN1bW1hcnkuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgdHlwZSIsIFJlc3VsdFR5cGUuSElHSEVSX0JFVFRFUiwgc3VtbWFyeS5nZXRUeXBlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCB1bml0IiwgUmVzdWx0VW5pdC5TQ09SRSwgc3VtbWFyeS5nZXRVbml0KCkpOwotICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgdmFsdWVzIiwgQXJyYXlzLmVxdWFscyhuZXcgZG91YmxlW10geyBTVU1NQVJZX1ZBTFVFIH0sCi0gICAgICAgICAgICAgICAgc3VtbWFyeS5nZXRWYWx1ZXMoKSkpOwotICAgICAgICBJVGVzdFJlc3VsdCBtb2R1bGVCVGVzdDUgPSBtb2R1bGVCUmVzdWx0cy5nZXQoMik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IG5hbWUiLCBNRVRIT0RfNSwgbW9kdWxlQlRlc3Q1LmdldE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IHJlc3VsdCIsIFRlc3RTdGF0dXMuUEFTUywgbW9kdWxlQlRlc3Q1LmdldFJlc3VsdFN0YXR1cygpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgc2tpcHBlZCIsIG1vZHVsZUJUZXN0NS5pc1NraXBwZWQoKSk7Ci0gICAgICAgIGFzc2VydE51bGwoIlVuZXhwZWN0ZWQgYnVncmVwb3J0IiwgbW9kdWxlQlRlc3Q1LmdldEJ1Z1JlcG9ydCgpKTsKLSAgICAgICAgYXNzZXJ0TnVsbCgiVW5leHBlY3RlZCBsb2ciLCBtb2R1bGVCVGVzdDUuZ2V0TG9nKCkpOwotICAgICAgICBhc3NlcnROdWxsKCJVbmV4cGVjdGVkIHNjcmVlbnNob3QiLCBtb2R1bGVCVGVzdDUuZ2V0U2NyZWVuc2hvdCgpKTsKLSAgICAgICAgYXNzZXJ0TnVsbCgiVW5leHBlY3RlZCBtZXNzYWdlIiwgbW9kdWxlQlRlc3Q1LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIGFzc2VydE51bGwoIlVuZXhwZWN0ZWQgc3RhY2sgdHJhY2UiLCBtb2R1bGVCVGVzdDUuZ2V0U3RhY2tUcmFjZSgpKTsKLSAgICAgICAgYXNzZXJ0TnVsbCgiVW5leHBlY3RlZCByZXBvcnQiLCBtb2R1bGVCVGVzdDUuZ2V0UmVwb3J0TG9nKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi91dGlsL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1N0YXRUZXN0LmphdmEgYi9jb21tb24vdXRpbC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9TdGF0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTUzZDQ4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi91dGlsL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1N0YXRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5TdGF0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotLyoqCi0gKiBVbml0IHRlc3RzIGZvciB0aGUge0BsaW5rIFN0YXR9IGNsYXNzLgotICovCi1wdWJsaWMgY2xhc3MgU3RhdFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHtAbGluayBTdGF0I2dldDk1UGVyY2VudGlsZVZhbHVlKGRvdWJsZVtdKX0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEdldDk1UGVyY2VudGlsZVZhbHVlKCkgewotICAgICAgICBkb3VibGVbXSB2YWx1ZXMgPSBuZXcgZG91YmxlWzEwMF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKLSAgICAgICAgICAgIHZhbHVlc1tpXSA9IGk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDk1LCAoaW50KSBTdGF0LmdldDk1UGVyY2VudGlsZVZhbHVlKHZhbHVlcykpOwotCi0gICAgICAgIHZhbHVlcyA9IG5ldyBkb3VibGVbMTAwMF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7Ci0gICAgICAgICAgICB2YWx1ZXNbaV0gPSBpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscyg5NTAsIChpbnQpIFN0YXQuZ2V0OTVQZXJjZW50aWxlVmFsdWUodmFsdWVzKSk7Ci0KLSAgICAgICAgdmFsdWVzID0gbmV3IGRvdWJsZVsxMDBdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKSB7Ci0gICAgICAgICAgICB2YWx1ZXNbaV0gPSBpICogaTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRFcXVhbHMoOTUgKiA5NSwgKGludCkgU3RhdC5nZXQ5NVBlcmNlbnRpbGVWYWx1ZSh2YWx1ZXMpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHtAbGluayBTdGF0I2dldEF2ZXJhZ2UoZG91YmxlW10pfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QXZlcmFnZSgpIHsKLSAgICAgICAgZG91YmxlW10gdmFsdWVzID0gbmV3IGRvdWJsZVtdezAsIDEsIDIsIDMsIDR9OwotICAgICAgICBkb3VibGUgYXZlcmFnZSA9IFN0YXQuZ2V0QXZlcmFnZSh2YWx1ZXMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMi4wLCBhdmVyYWdlLCAwLjAwMDAxKTsKLQotICAgICAgICB2YWx1ZXMgPSBuZXcgZG91YmxlW117MSwgMiwgMywgNCwgNX07Ci0gICAgICAgIGF2ZXJhZ2UgPSBTdGF0LmdldEF2ZXJhZ2UodmFsdWVzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDMuMCwgYXZlcmFnZSwgMC4wMDAwMSk7Ci0KLSAgICAgICAgdmFsdWVzID0gbmV3IGRvdWJsZVtdezAsIDEsIDQsIDksIDE2fTsKLSAgICAgICAgYXZlcmFnZSA9IFN0YXQuZ2V0QXZlcmFnZSh2YWx1ZXMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNi4wLCBhdmVyYWdlLCAwLjAwMDAxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHN0YW5kYXJkIGRldmlhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U3RhbmRhcmREZXZpYXRpb24oKSB7Ci0gICAgICAgIGRvdWJsZVtdIHZhbHVlcyA9IG5ldyBkb3VibGVbXXswLCAxLCAyLCAzLCA0fTsKLSAgICAgICAgZG91YmxlIHN0ZGRldiA9IFN0YXQuZ2V0U3RhdCh2YWx1ZXMpLm1TdGRkZXY7Ci0gICAgICAgIGFzc2VydEVxdWFscyhNYXRoLnNxcnQoMi41KSwgc3RkZGV2LCAwLjAwMDAxKTsKLQotICAgICAgICB2YWx1ZXMgPSBuZXcgZG91YmxlW117MSwgMiwgMywgNCwgNX07Ci0gICAgICAgIHN0ZGRldiA9IFN0YXQuZ2V0U3RhdCh2YWx1ZXMpLm1TdGRkZXY7Ci0gICAgICAgIGFzc2VydEVxdWFscyhNYXRoLnNxcnQoMi41KSwgc3RkZGV2LCAwLjAwMDAxKTsKLQotICAgICAgICB2YWx1ZXMgPSBuZXcgZG91YmxlW117MCwgMiwgNCwgNiwgOH07Ci0gICAgICAgIHN0ZGRldiA9IFN0YXQuZ2V0U3RhdCh2YWx1ZXMpLm1TdGRkZXY7Ci0gICAgICAgIGFzc2VydEVxdWFscyhNYXRoLnNxcnQoMTAuMCksIHN0ZGRldiwgMC4wMDAwMSk7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi91dGlsL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1Rlc3RSZXN1bHRUZXN0LmphdmEgYi9jb21tb24vdXRpbC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9UZXN0UmVzdWx0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTQ0MzFlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi91dGlsL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1Rlc3RSZXN1bHRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0vKioKLSAqIFVuaXQgdGVzdHMgZm9yIHtAbGluayBUZXN0UmVzdWx0fQotICovCi1wdWJsaWMgY2xhc3MgVGVzdFJlc3VsdFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1MgPSAiYW5kcm9pZC50ZXN0LkZvb3JCYXIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfMSA9ICJ0ZXN0QmxhaDEiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUXzEgPSBTdHJpbmcuZm9ybWF0KCIlcyMlcyIsIENMQVNTLCBNRVRIT0RfMSk7Ci0gICAgcHJpdmF0ZSBDYXNlUmVzdWx0IG1DYXNlOwotICAgIHByaXZhdGUgVGVzdFJlc3VsdCBtUmVzdWx0OwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbUNhc2UgPSBuZXcgQ2FzZVJlc3VsdChDTEFTUyk7Ci0gICAgICAgIG1SZXN1bHQgPSBuZXcgVGVzdFJlc3VsdChtQ2FzZSwgTUVUSE9EXzEpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1SZXN1bHQgPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NvcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgdGVzdCBuYW1lIiwgTUVUSE9EXzEsIG1SZXN1bHQuZ2V0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZnVsbCBuYW1lIiwgVEVTVF8xLCBtUmVzdWx0LmdldEZ1bGxOYW1lKCkpOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbW1vbi91dGlsL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1VuaXRUZXN0cy5qYXZhIGIvY29tbW9uL3V0aWwvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvVW5pdFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MDZhODcuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3V0aWwvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvVW5pdFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbDsKLQotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKLWltcG9ydCBvcmcuanVuaXQucnVubmVycy5TdWl0ZTsKLWltcG9ydCBvcmcuanVuaXQucnVubmVycy5TdWl0ZS5TdWl0ZUNsYXNzZXM7Ci0KLS8qKgotICogQSB0ZXN0IHN1aXRlIGZvciBhbGwgdXRpbCB1bml0IHRlc3RzLgotICogPHAvPgotICogQWxsIHRlc3RzIGxpc3RlZCBoZXJlIHNob3VsZCBiZSBzZWxmLWNvbnRhaW5lZCwgYW5kIGRvIG5vdCByZXF1aXJlIGFueSBleHRlcm5hbCBkZXBlbmRlbmNpZXMuCi0gKi8KLUBSdW5XaXRoKFN1aXRlLmNsYXNzKQotQFN1aXRlQ2xhc3Nlcyh7Ci0gICAgQnVzaW5lc3NMb2dpY1Rlc3QuY2xhc3MsCi0gICAgQ2FzZVJlc3VsdFRlc3QuY2xhc3MsCi0gICAgQ3Jhc2hVdGlsc1Rlc3QuY2xhc3MsCi0gICAgRHluYW1pY0NvbmZpZ1Rlc3QuY2xhc3MsCi0gICAgTGlnaHRJbnZvY2F0aW9uUmVzdWx0VGVzdC5jbGFzcywKLSAgICBNZXRyaWNzWG1sU2VyaWFsaXplclRlc3QuY2xhc3MsCi0gICAgTXVsdGlwYXJ0Rm9ybVRlc3QuY2xhc3MsCi0gICAgUmVwb3J0TG9nVGVzdC5jbGFzcywKLSAgICBSZXN1bHRIYW5kbGVyVGVzdC5jbGFzcywKLSAgICBTdGF0VGVzdC5jbGFzcywKLSAgICBUZXN0UmVzdWx0VGVzdC5jbGFzcywKLX0pCi1wdWJsaWMgY2xhc3MgVW5pdFRlc3RzIHsKLSAgICAvLyBlbXB0eSBvbiBwdXJwb3NlCi19CmRpZmYgLS1naXQgYS9lcnJvcl9wcm9uZV9ydWxlcy5tayBiL2Vycm9yX3Byb25lX3J1bGVzLm1rCmluZGV4IDI1ZDkzNDQuLjMzMzgyZGQgMTAwNjQ0Ci0tLSBhL2Vycm9yX3Byb25lX3J1bGVzLm1rCisrKyBiL2Vycm9yX3Byb25lX3J1bGVzLm1rCkBAIC0yMSw2ICsyMSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIC1YZXA6R2V0Q2xhc3NPbkNsYXNzOkVSUk9SIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgLVhlcDpJZGVudGl0eUJpbmFyeUV4cHJlc3Npb246RVJST1IgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAtWGVwOkpVbml0M1Rlc3ROb3RSdW46RVJST1IgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAtWGVwOkpVbml0NENsYXNzVXNlZEluSlVuaXQzOkVSUk9SIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgLVhlcDpKVW5pdEFtYmlndW91c1Rlc3RDbGFzczpFUlJPUiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgIC1YZXA6TWlzc2luZ0ZhaWw6RVJST1IgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAtWGVwOk1pc3NpbmdPdmVycmlkZTpFUlJPUiBcCmRpZmYgLS1naXQgYS9lcnJvcl9wcm9uZV9ydWxlc190ZXN0cy5tayBiL2Vycm9yX3Byb25lX3J1bGVzX3Rlc3RzLm1rCmluZGV4IGQxNzgyOGQuLmE4ZDg4YjAgMTAwNjQ0Ci0tLSBhL2Vycm9yX3Byb25lX3J1bGVzX3Rlc3RzLm1rCisrKyBiL2Vycm9yX3Byb25lX3J1bGVzX3Rlc3RzLm1rCkBAIC0xNyw5ICsxNywxNCBAQAogIyBHb2FsIGlzIHRvIGV2ZW50dWFsbHkgbWVyZ2Ugd2l0aCBlcnJvcl9wcm9uZV9ydWxlcy5tawogTE9DQUxfRVJST1JfUFJPTkVfRkxBR1M6PSAtWGVwOkFycmF5VG9TdHJpbmc6RVJST1IgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAtWGVwOkNvbGxlY3Rpb25JbmNvbXBhdGlibGVUeXBlOkVSUk9SIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLVhlcDpFcXVhbHNJbmNvbXBhdGlibGVUeXBlOkVSUk9SIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgLVhlcDpFcXVhbHNOYU46RVJST1IgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAtWGVwOkZvcm1hdFN0cmluZzpFUlJPUiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIC1YZXA6SWRlbnRpdHlCaW5hcnlFeHByZXNzaW9uOkVSUk9SIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgLVhlcDpKVW5pdDNUZXN0Tm90UnVuOkVSUk9SIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLVhlcDpKVW5pdDRDbGFzc1VzZWRJbkpVbml0MzpFUlJPUiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIC1YZXA6SlVuaXRBbWJpZ3VvdXNUZXN0Q2xhc3M6RVJST1IgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAtWGVwOk1pc3NpbmdGYWlsOkVSUk9SIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgLVhlcDpTaXplR3JlYXRlclRoYW5PckVxdWFsc1plcm86RVJST1IgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAtWGVwOlRyeUZhaWxUaHJvd2FibGU6RVJST1IKIApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hYWRiL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2FhZGIvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYwYTk2Ny4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL2FhZGIvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLUxPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLSMgT25seSBjb21waWxlIHNvdXJjZSBqYXZhIGZpbGVzIGluIHRoaXMgYXBrLgotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQotCi0jIEFkYiB0ZXN0IGNhc2VzLCBidXQgbmFtZSAnYWFkYicgZW5zdXJlcyBhZGIgdGVzdHMgcnVuIGJlZm9yZSBhbGwgb3RoZXIgbW9kdWxlcyBkZXBlbmRpbmcgb24gYWRiCi1MT0NBTF9NT0RVTEUgOj0gQ3RzQWFkYkhvc3RUZXN0Q2FzZXMKLQotTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gY3RzLXRyYWRlZmVkIHRyYWRlZmVkCi0KLUxPQ0FMX0NUU19URVNUX1BBQ0tBR0UgOj0gYW5kcm9pZC5hYWRiCi0KLSMgdGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCi0KLWluY2x1ZGUgJChCVUlMRF9DVFNfSE9TVF9KQVZBX0xJQlJBUlkpCi0KLSMgQnVpbGQgdGhlIHRlc3QgQVBLcyB1c2luZyB0aGVpciBvd24gbWFrZWZpbGVzCi1pbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FhZGIvQW5kcm9pZFRlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9hYWRiL0FuZHJvaWRUZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIyNGRmMi4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL2FhZGIvQW5kcm9pZFRlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIHRoZSBDVFMgYWFkYiBob3N0IHRlc3RzIj4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9Im1pc2MiIC8+Ci0gICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRlc3R0eXBlLkphckhvc3RUZXN0Ij4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJqYXIiIHZhbHVlPSJDdHNBYWRiSG9zdFRlc3RDYXNlcy5qYXIiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0icnVudGltZS1oaW50IiB2YWx1ZT0iNW0zMHMiIC8+Ci0gICAgPC90ZXN0PgotPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hYWRiL3NyYy9hbmRyb2lkL2FhZGIvY3RzL1Rlc3REZXZpY2VGdW5jVGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9hYWRiL3NyYy9hbmRyb2lkL2FhZGIvY3RzL1Rlc3REZXZpY2VGdW5jVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTcwMjMyLi4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvYWFkYi9zcmMvYW5kcm9pZC9hYWRiL2N0cy9UZXN0RGV2aWNlRnVuY1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5hYWRiLmN0czsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5JRGV2aWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5EZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLklUZXN0RGV2aWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5UZXN0RGV2aWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmxvZy5Mb2dVdGlsLkNMb2c7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQucmVzdWx0LklucHV0U3RyZWFtU291cmNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkRldmljZVRlc3RDYXNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnV0aWwuRmlsZVV0aWw7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudXRpbC5SdW5VdGlsOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnV0aWwuU3RyZWFtVXRpbDsKLQotaW1wb3J0IGphdmEuYXd0LmltYWdlLkJ1ZmZlcmVkSW1hZ2U7Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgamF2YXguaW1hZ2Vpby5JbWFnZUlPOwotCi0vKioKLSAqIEZ1bmN0aW9uYWwgdGVzdHMgZm9yIGFkYiBjb25uZWN0aW9uCi0gKiA8cC8+Ci0gKiBSZXF1aXJlcyBhIHBoeXNpY2FsIGRldmljZSB0byBiZSBjb25uZWN0ZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0RGV2aWNlRnVuY1Rlc3QgZXh0ZW5kcyBEZXZpY2VUZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIElUZXN0RGV2aWNlIG1UZXN0RGV2aWNlOwotICAgIC8qKiBFeHBlY3QgYnVncmVwb3J0cyB0byBiZSBhdCBsZWFzdCBhIG1lZy4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgbU1pbkJ1Z3JlcG9ydEJ5dGVzID0gMTAyNCAqIDEwMjQ7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBtVGVzdERldmljZSA9IGdldERldmljZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNpbXBsZSB0ZXN0Y2FzZSB0byBlbnN1cmUgdGhhdCB0aGUgZ3JhYmJpbmcgYSBidWdyZXBvcnQgZnJvbSBhIHJlYWwgVGVzdERldmljZSB3b3Jrcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QnVncmVwb3J0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIElucHV0U3RyZWFtU291cmNlIGJ1Z3JlcG9ydCA9IG1UZXN0RGV2aWNlLmdldEJ1Z3JlcG9ydCgpOwotICAgICAgICBJbnB1dFN0cmVhbSBidWdyZXBvcnREYXRhID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1Z3JlcG9ydERhdGEgPSBidWdyZXBvcnQuY3JlYXRlSW5wdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIFN0cmluZyBkYXRhID0gU3RyZWFtVXRpbC5nZXRTdHJpbmdGcm9tU3RyZWFtKGJ1Z3JlcG9ydERhdGEpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJFeHBlY3RlZCBhdCBsZWFzdCAlZCBjaGFyYWN0ZXJzOyBvbmx5IHNhdyAlZCIsCi0gICAgICAgICAgICAgICAgICAgIG1NaW5CdWdyZXBvcnRCeXRlcywgZGF0YS5sZW5ndGgoKSksIGRhdGEubGVuZ3RoKCkgPj0gbU1pbkJ1Z3JlcG9ydEJ5dGVzKTsKLSAgICAgICAgICAgIC8vIFRPRE86IGNoZWNrIHRoZSBjYXB0dXJlZCByZXBvcnQgbW9yZSBleHRlbnNpdmVseSwgcGVyaGFwcyB1c2luZyBsb2dhbmFseXNpcwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgU3RyZWFtVXRpbC5jYW5jZWwoYnVncmVwb3J0KTsKLSAgICAgICAgICAgIFN0cmVhbVV0aWwuY2xvc2UoYnVncmVwb3J0RGF0YSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaW1wbGUgbm9ybWFsIGNhc2UgdGVzdCBmb3IKLSAgICAgKiB7QGxpbmsgVGVzdERldmljZSNleGVjdXRlU2hlbGxDb21tYW5kKFN0cmluZyl9LgotICAgICAqIDxwLz4KLSAgICAgKiBEbyBhICdzaGVsbCBscycgY29tbWFuZCwgYW5kIHZlcmlmeSAvZGF0YSBhbmQgL3N5c3RlbSBhcmUgbGlzdGVkIGluIHJlc3VsdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXhlY3V0ZVNoZWxsQ29tbWFuZCgpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBDTG9nLmkoInRlc3RFeGVjdXRlU2hlbGxDb21tYW5kIik7Ci0gICAgICAgIGFzc2VydFNpbXBsZVNoZWxsQ29tbWFuZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZlcmlmeSB0aGF0IGEgc2ltcGxlIHtAbGluayBUZXN0RGV2aWNlI2V4ZWN1dGVTaGVsbENvbW1hbmQoU3RyaW5nKX0gY29tbWFuZCBpcyBzdWNjZXNzZnVsLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRTaW1wbGVTaGVsbENvbW1hbmQoKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAJLy8gQ2hlY2sgZm9yIGV4cGVjdGVkIGNvbnRlbnRzIG9mIGRldmljZSdzIHJvb3QgZGlyZWN0b3J5Ci0gICAgICAgIGZpbmFsIFN0cmluZyBvdXRwdXQgPSBtVGVzdERldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKCJscyAvIik7Ci0gICAgICAgIGFzc2VydFRydWUob3V0cHV0LmNvbnRhaW5zKCJkYXRhIikpOwotICAgICAgICBhc3NlcnRUcnVlKG91dHB1dC5jb250YWlucygic3lzdGVtIikpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUHVzaCBhbmQgdGhlbiBwdWxsIGEgZmlsZSBmcm9tIGRldmljZSwgYW5kIHZlcmlmeSBjb250ZW50cyBhcmUgYXMgZXhwZWN0ZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFB1c2hQdWxsX25vcm1hbCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgQ0xvZy5pKCJ0ZXN0UHVzaFB1bGwiKTsKLSAgICAgICAgRmlsZSB0bXBGaWxlID0gbnVsbDsKLSAgICAgICAgRmlsZSB0bXBEZXN0RmlsZSA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBkZXZpY2VGaWxlUGF0aCA9IG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRtcEZpbGUgPSBjcmVhdGVUZW1wVGVzdEZpbGUobnVsbCk7Ci0gICAgICAgICAgICBTdHJpbmcgZXh0ZXJuYWxTdG9yZVBhdGggPSBtVGVzdERldmljZS5nZXRNb3VudFBvaW50KElEZXZpY2UuTU5UX0VYVEVSTkFMX1NUT1JBR0UpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChleHRlcm5hbFN0b3JlUGF0aCk7Ci0gICAgICAgICAgICBkZXZpY2VGaWxlUGF0aCA9IFN0cmluZy5mb3JtYXQoIiVzLyVzIiwgZXh0ZXJuYWxTdG9yZVBhdGgsICJ0bXBfdGVzdFB1c2hQdWxsLnR4dCIpOwotICAgICAgICAgICAgLy8gZW5zdXJlIGZpbGUgZG9lcyBub3QgYWxyZWFkeSBleGlzdAotICAgICAgICAgICAgbVRlc3REZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZChTdHJpbmcuZm9ybWF0KCJybSAlcyIsIGRldmljZUZpbGVQYXRoKSk7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZShTdHJpbmcuZm9ybWF0KCIlcyBleGlzdHMiLCBkZXZpY2VGaWxlUGF0aCksCi0gICAgICAgICAgICAgICAgICAgIG1UZXN0RGV2aWNlLmRvZXNGaWxlRXhpc3QoZGV2aWNlRmlsZVBhdGgpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtVGVzdERldmljZS5wdXNoRmlsZSh0bXBGaWxlLCBkZXZpY2VGaWxlUGF0aCkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtVGVzdERldmljZS5kb2VzRmlsZUV4aXN0KGRldmljZUZpbGVQYXRoKSk7Ci0gICAgICAgICAgICB0bXBEZXN0RmlsZSA9IEZpbGVVdGlsLmNyZWF0ZVRlbXBGaWxlKCJ0bXAiLCAidHh0Iik7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1UZXN0RGV2aWNlLnB1bGxGaWxlKGRldmljZUZpbGVQYXRoLCB0bXBEZXN0RmlsZSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb21wYXJlRmlsZXModG1wRmlsZSwgdG1wRGVzdEZpbGUpKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIEZpbGVVdGlsLmRlbGV0ZUZpbGUodG1wRGVzdEZpbGUpOwotICAgICAgICAgICAgRmlsZVV0aWwuZGVsZXRlRmlsZSh0bXBGaWxlKTsKLSAgICAgICAgICAgIGlmIChkZXZpY2VGaWxlUGF0aCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVRlc3REZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZChTdHJpbmcuZm9ybWF0KCJybSAlcyIsIGRldmljZUZpbGVQYXRoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQdXNoIGFuZCB0aGVuIHB1bGwgYSBmaWxlIGZyb20gZGV2aWNlLCBhbmQgdmVyaWZ5IGNvbnRlbnRzIGFyZSBhcyBleHBlY3RlZC4KLSAgICAgKiA8cCAvPgotICAgICAqIFRoaXMgdmFyaWFudCBvZiB0aGUgdGVzdCB1c2VzICIke0VYVEVSTkFMX1NUT1JBR0V9IiBpbiB0aGUgcGF0aG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFB1c2hQdWxsX2V4dFN0b3JhZ2VWYXJpYWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgQ0xvZy5pKCJ0ZXN0UHVzaFB1bGwiKTsKLSAgICAgICAgRmlsZSB0bXBGaWxlID0gbnVsbDsKLSAgICAgICAgRmlsZSB0bXBEZXN0RmlsZSA9IG51bGw7Ci0gICAgICAgIEZpbGUgdG1wRGVzdEZpbGUyID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIGRldmljZUZpbGVQYXRoID0gbnVsbDsKLSAgICAgICAgZmluYWwgU3RyaW5nIGZpbGVuYW1lID0gInRtcF90ZXN0UHVzaFB1bGwudHh0IjsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgdG1wRmlsZSA9IGNyZWF0ZVRlbXBUZXN0RmlsZShudWxsKTsKLSAgICAgICAgICAgIFN0cmluZyBleHRlcm5hbFN0b3JlUGF0aCA9ICIke0VYVEVSTkFMX1NUT1JBR0V9IjsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZXh0ZXJuYWxTdG9yZVBhdGgpOwotICAgICAgICAgICAgZGV2aWNlRmlsZVBhdGggPSBTdHJpbmcuZm9ybWF0KCIlcy8lcyIsIGV4dGVybmFsU3RvcmVQYXRoLCBmaWxlbmFtZSk7Ci0gICAgICAgICAgICAvLyBlbnN1cmUgZmlsZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0Ci0gICAgICAgICAgICBtVGVzdERldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKFN0cmluZy5mb3JtYXQoInJtICVzIiwgZGV2aWNlRmlsZVBhdGgpKTsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKFN0cmluZy5mb3JtYXQoIiVzIGV4aXN0cyIsIGRldmljZUZpbGVQYXRoKSwKLSAgICAgICAgICAgICAgICAgICAgbVRlc3REZXZpY2UuZG9lc0ZpbGVFeGlzdChkZXZpY2VGaWxlUGF0aCkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKG1UZXN0RGV2aWNlLnB1c2hGaWxlKHRtcEZpbGUsIGRldmljZUZpbGVQYXRoKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1UZXN0RGV2aWNlLmRvZXNGaWxlRXhpc3QoZGV2aWNlRmlsZVBhdGgpKTsKLSAgICAgICAgICAgIHRtcERlc3RGaWxlID0gRmlsZVV0aWwuY3JlYXRlVGVtcEZpbGUoInRtcCIsICJ0eHQiKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobVRlc3REZXZpY2UucHVsbEZpbGUoZGV2aWNlRmlsZVBhdGgsIHRtcERlc3RGaWxlKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGNvbXBhcmVGaWxlcyh0bXBGaWxlLCB0bXBEZXN0RmlsZSkpOwotCi0gICAgICAgICAgICB0bXBEZXN0RmlsZTIgPSBtVGVzdERldmljZS5wdWxsRmlsZUZyb21FeHRlcm5hbChmaWxlbmFtZSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHRtcERlc3RGaWxlMik7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGNvbXBhcmVGaWxlcyh0bXBGaWxlLCB0bXBEZXN0RmlsZTIpKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIEZpbGVVdGlsLmRlbGV0ZUZpbGUodG1wRGVzdEZpbGUpOwotICAgICAgICAgICAgRmlsZVV0aWwuZGVsZXRlRmlsZSh0bXBEZXN0RmlsZTIpOwotICAgICAgICAgICAgRmlsZVV0aWwuZGVsZXRlRmlsZSh0bXBGaWxlKTsKLSAgICAgICAgICAgIGlmIChkZXZpY2VGaWxlUGF0aCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVRlc3REZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZChTdHJpbmcuZm9ybWF0KCJybSAlcyIsIGRldmljZUZpbGVQYXRoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHB1bGxpbmcgYSBmaWxlIGZyb20gZGV2aWNlIHRoYXQgZG9lcyBub3QgZXhpc3QuCi0gICAgICogPHAvPgotICAgICAqIEV4cGVjdCB7QGxpbmsgVGVzdERldmljZSNwdWxsRmlsZShTdHJpbmcpfSB0byByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFB1bGxfbm9leGlzdCgpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBDTG9nLmkoInRlc3RQdWxsX25vZXhpc3QiKTsKLQotICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIHJvb3QgcGF0aCBpcyB2YWxpZAotICAgICAgICBTdHJpbmcgZXh0ZXJuYWxTdG9yZVBhdGggPSAgbVRlc3REZXZpY2UuZ2V0TW91bnRQb2ludChJRGV2aWNlLk1OVF9FWFRFUk5BTF9TVE9SQUdFKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChleHRlcm5hbFN0b3JlUGF0aCk7Ci0gICAgICAgIFN0cmluZyBkZXZpY2VGaWxlUGF0aCA9IFN0cmluZy5mb3JtYXQoIiVzLyVzIiwgZXh0ZXJuYWxTdG9yZVBhdGgsICJ0aGlzZmlsZWRvZXNudGV4aXN0Iik7Ci0gICAgICAgIGFzc2VydEZhbHNlKFN0cmluZy5mb3JtYXQoIiVzIGV4aXN0cyIsIGRldmljZUZpbGVQYXRoKSwKLSAgICAgICAgICAgICAgICBtVGVzdERldmljZS5kb2VzRmlsZUV4aXN0KGRldmljZUZpbGVQYXRoKSk7Ci0gICAgICAgIGFzc2VydE51bGwobVRlc3REZXZpY2UucHVsbEZpbGUoZGV2aWNlRmlsZVBhdGgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEZpbGUgY3JlYXRlVGVtcFRlc3RGaWxlKEZpbGUgZGlyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBGaWxlIHRtcEZpbGUgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZpbGVDb250ZW50cyA9ICJ0aGlzIGlzIHRoZSB0ZXN0IGZpbGUgY29udGVudHMiOwotICAgICAgICAgICAgdG1wRmlsZSA9IEZpbGVVdGlsLmNyZWF0ZVRlbXBGaWxlKCJ0bXAiLCAiLnR4dCIsIGRpcik7Ci0gICAgICAgICAgICBGaWxlVXRpbC53cml0ZVRvRmlsZShmaWxlQ29udGVudHMsIHRtcEZpbGUpOwotICAgICAgICAgICAgcmV0dXJuIHRtcEZpbGU7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIEZpbGVVdGlsLmRlbGV0ZUZpbGUodG1wRmlsZSk7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXRpbGl0eSBtZXRob2QgdG8gZG8gYnl0ZS13aXNlIGNvbnRlbnQgY29tcGFyaXNvbiBvZiB0d28gZmlsZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGNvbXBhcmVGaWxlcyhGaWxlIGZpbGUxLCBGaWxlIGZpbGUyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBCdWZmZXJlZElucHV0U3RyZWFtIHN0cmVhbTEgPSBudWxsOwotICAgICAgICBCdWZmZXJlZElucHV0U3RyZWFtIHN0cmVhbTIgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzdHJlYW0xID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlMSkpOwotICAgICAgICAgICAgc3RyZWFtMiA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZTIpKTsKLSAgICAgICAgICAgIGJvb2xlYW4gZW9mID0gZmFsc2U7Ci0gICAgICAgICAgICB3aGlsZSAoIWVvZikgewotICAgICAgICAgICAgICAgIGludCBieXRlMSA9IHN0cmVhbTEucmVhZCgpOwotICAgICAgICAgICAgICAgIGludCBieXRlMiA9IHN0cmVhbTIucmVhZCgpOwotICAgICAgICAgICAgICAgIGlmIChieXRlMSAhPSBieXRlMikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVvZiA9IGJ5dGUxID09IC0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoc3RyZWFtMSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc3RyZWFtMS5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHN0cmVhbTIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN0cmVhbTIuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3Qgc3luY2luZyBhIHNpbmdsZSBmaWxlIHVzaW5nIHtAbGluayBUZXN0RGV2aWNlI3N5bmNGaWxlcyhGaWxlLCBTdHJpbmcpfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3luY0ZpbGVzX25vcm1hbCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBkb1Rlc3RTeW5jRmlsZXMobVRlc3REZXZpY2UuZ2V0TW91bnRQb2ludChJRGV2aWNlLk1OVF9FWFRFUk5BTF9TVE9SQUdFKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBzeW5jaW5nIGEgc2luZ2xlIGZpbGUgdXNpbmcge0BsaW5rIFRlc3REZXZpY2Ujc3luY0ZpbGVzKEZpbGUsIFN0cmluZyl9LgotICAgICAqIDxwIC8+Ci0gICAgICogVGhpcyB2YXJpYW50IG9mIHRoZSB0ZXN0IHVzZXMgIiR7RVhURVJOQUxfU1RPUkFHRX0iIGluIHRoZSBwYXRobmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3luY0ZpbGVzX2V4dFN0b3JhZ2VWYXJpYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBkb1Rlc3RTeW5jRmlsZXMoIiR7RVhURVJOQUxfU1RPUkFHRX0iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHN5bmNpbmcgYSBzaW5nbGUgZmlsZSB1c2luZyB7QGxpbmsgVGVzdERldmljZSNzeW5jRmlsZXMoRmlsZSwgU3RyaW5nKX0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZG9UZXN0U3luY0ZpbGVzKFN0cmluZyBleHRlcm5hbFN0b3JlUGF0aCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBleHBlY3RlZERldmljZUZpbGVQYXRoID0gbnVsbDsKLQotICAgICAgICAvLyBjcmVhdGUgdGVtcCBkaXIgd2l0aCBvbmUgdGVtcCBmaWxlCi0gICAgICAgIEZpbGUgdG1wRGlyID0gRmlsZVV0aWwuY3JlYXRlVGVtcERpcigidG1wIik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBGaWxlIHRtcEZpbGUgPSBjcmVhdGVUZW1wVGVzdEZpbGUodG1wRGlyKTsKLSAgICAgICAgICAgIC8vIHNldCBsYXN0IG1vZGlmaWVkIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGltZSwgd2UgZG8gdGhpcyBzbyB0aGF0IGl0IGRvZXMKLSAgICAgICAgICAgIC8vIG5vdCBnZXQgcGlja2VkIHVwIHdoZW4gd2Ugc3luIGZvciB0aGUgMm5kIHRpbWUuCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHRtcEZpbGUuc2V0TGFzdE1vZGlmaWVkKDEpKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZXh0ZXJuYWxTdG9yZVBhdGgpOwotICAgICAgICAgICAgZXhwZWN0ZWREZXZpY2VGaWxlUGF0aCA9IFN0cmluZy5mb3JtYXQoIiVzLyVzLyVzIiwgZXh0ZXJuYWxTdG9yZVBhdGgsCi0gICAgICAgICAgICAgICAgICAgIHRtcERpci5nZXROYW1lKCksIHRtcEZpbGUuZ2V0TmFtZSgpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtVGVzdERldmljZS5zeW5jRmlsZXModG1wRGlyLCBleHRlcm5hbFN0b3JlUGF0aCkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtVGVzdERldmljZS5kb2VzRmlsZUV4aXN0KGV4cGVjdGVkRGV2aWNlRmlsZVBhdGgpKTsKLQotICAgICAgICAgICAgLy8gZ2V0ICdscyAtbCcgYXR0cmlidXRlcyBvZiBmaWxlIHdoaWNoIGluY2x1ZGVzIHRpbWVzdGFtcAotICAgICAgICAgICAgU3RyaW5nIG9yaWdUbXBGaWxlU3RhbXAgPSBtVGVzdERldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKFN0cmluZy5mb3JtYXQoImxzIC1sICVzIiwKLSAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWREZXZpY2VGaWxlUGF0aCkpOwotICAgICAgICAgICAgLy8gbm93IGNyZWF0ZSBhbm90aGVyIGZpbGUgYW5kIHZlcmlmeSB0aGF0IGlzIHN5bmNlZAotICAgICAgICAgICAgRmlsZSB0bXBGaWxlMiA9IGNyZWF0ZVRlbXBUZXN0RmlsZSh0bXBEaXIpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0bXBGaWxlMi5zZXRMYXN0TW9kaWZpZWQoMSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtVGVzdERldmljZS5zeW5jRmlsZXModG1wRGlyLCBleHRlcm5hbFN0b3JlUGF0aCkpOwotICAgICAgICAgICAgU3RyaW5nIGV4cGVjdGVkRGV2aWNlRmlsZVBhdGgyID0gU3RyaW5nLmZvcm1hdCgiJXMvJXMvJXMiLCBleHRlcm5hbFN0b3JlUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgdG1wRGlyLmdldE5hbWUoKSwgdG1wRmlsZTIuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobVRlc3REZXZpY2UuZG9lc0ZpbGVFeGlzdChleHBlY3RlZERldmljZUZpbGVQYXRoMikpOwotCi0gICAgICAgICAgICAvLyB2ZXJpZnkgMXN0IGZpbGUgdGltZXN0YW1wIGRpZCBub3QgY2hhbmdlLCAoaS5lLiBpdCBkaWRuJ3QgZ2V0IHN5bmNlZCBhZ2FpbikKLSAgICAgICAgICAgIFN0cmluZyB1bmNoYW5nZWRUbXBGaWxlU3RhbXAgPSBtVGVzdERldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKFN0cmluZy5mb3JtYXQoImxzIC1sICVzIiwKLSAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWREZXZpY2VGaWxlUGF0aCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG9yaWdUbXBGaWxlU3RhbXAsIHVuY2hhbmdlZFRtcEZpbGVTdGFtcCk7Ci0KLSAgICAgICAgICAgIC8vIG5vdyBtb2RpZnkgMXN0IGZpbGUgYW5kIHZlcmlmeSBpdCBkb2VzIGNoYW5nZSByZW1vdGVseQotICAgICAgICAgICAgU3RyaW5nIHRlc3RTdHJpbmcgPSAiYmxhaCI7Ci0gICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRtcEZpbGUpOwotICAgICAgICAgICAgc3RyZWFtLndyaXRlKHRlc3RTdHJpbmcuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKLQotICAgICAgICAgICAgLy8gU2V0IHRoZSB1cGRhdGUgdGltZSB0byBiZSBmYXIgaW4gdGhlIGZ1dHVyZSBmb3JjaW5nIGl0IHRvIGJlIHBpY2tlZCB1cCBmb3Igc3luYy4KLSAgICAgICAgICAgIGFzc2VydFRydWUodG1wRmlsZS5zZXRMYXN0TW9kaWZpZWQoTG9uZy5NQVhfVkFMVUUpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobVRlc3REZXZpY2Uuc3luY0ZpbGVzKHRtcERpciwgZXh0ZXJuYWxTdG9yZVBhdGgpKTsKLSAgICAgICAgICAgIFN0cmluZyB0bXBGaWxlQ29udGVudHMgPSBtVGVzdERldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKFN0cmluZy5mb3JtYXQoImNhdCAlcyIsCi0gICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkRGV2aWNlRmlsZVBhdGgpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUodG1wRmlsZUNvbnRlbnRzLmNvbnRhaW5zKHRlc3RTdHJpbmcpKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChleHBlY3RlZERldmljZUZpbGVQYXRoICE9IG51bGwgJiYgZXh0ZXJuYWxTdG9yZVBhdGggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIG5vdGUgdGhhdCBleHBlY3RlZERldmljZUZpbGVQYXRoIGhhcyBleHRlcm5hbFN0b3JlUGF0aCBwcmVwZW5kZWQgYXQgZGVmaW5pdGlvbgotICAgICAgICAgICAgICAgIG1UZXN0RGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoU3RyaW5nLmZvcm1hdCgicm0gLXIgJXMiLCBleHBlY3RlZERldmljZUZpbGVQYXRoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGaWxlVXRpbC5yZWN1cnNpdmVEZWxldGUodG1wRGlyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgcHVzaGluZyBhIGRpcmVjdG9yeQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RQdXNoRGlyKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgZXhwZWN0ZWREZXZpY2VGaWxlUGF0aCA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBleHRlcm5hbFN0b3JlUGF0aCA9IG51bGw7Ci0gICAgICAgIEZpbGUgcm9vdERpciA9IEZpbGVVdGlsLmNyZWF0ZVRlbXBEaXIoInRtcCIpOwotICAgICAgICAvLyBjcmVhdGUgdGVtcCBkaXIgd2l0aCBvbmUgdGVtcCBmaWxlCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBGaWxlIHRtcERpciA9IEZpbGVVdGlsLmNyZWF0ZVRlbXBEaXIoInRtcCIsIHJvb3REaXIpOwotICAgICAgICAgICAgRmlsZSB0bXBGaWxlID0gY3JlYXRlVGVtcFRlc3RGaWxlKHRtcERpcik7Ci0gICAgICAgICAgICBleHRlcm5hbFN0b3JlUGF0aCA9IG1UZXN0RGV2aWNlLmdldE1vdW50UG9pbnQoSURldmljZS5NTlRfRVhURVJOQUxfU1RPUkFHRSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGV4dGVybmFsU3RvcmVQYXRoKTsKLSAgICAgICAgICAgIGV4cGVjdGVkRGV2aWNlRmlsZVBhdGggPSBTdHJpbmcuZm9ybWF0KCIlcy8lcy8lcyIsIGV4dGVybmFsU3RvcmVQYXRoLAotICAgICAgICAgICAgICAgICAgICB0bXBEaXIuZ2V0TmFtZSgpLCB0bXBGaWxlLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUobVRlc3REZXZpY2UucHVzaERpcihyb290RGlyLCBleHRlcm5hbFN0b3JlUGF0aCkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtVGVzdERldmljZS5kb2VzRmlsZUV4aXN0KGV4cGVjdGVkRGV2aWNlRmlsZVBhdGgpKTsKLQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGV4cGVjdGVkRGV2aWNlRmlsZVBhdGggIT0gbnVsbCAmJiBleHRlcm5hbFN0b3JlUGF0aCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVRlc3REZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZChTdHJpbmcuZm9ybWF0KCJybSAtciAlcy8lcyIsIGV4dGVybmFsU3RvcmVQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWREZXZpY2VGaWxlUGF0aCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRmlsZVV0aWwucmVjdXJzaXZlRGVsZXRlKHJvb3REaXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQmFzaWMgdGVzdCBmb3Ige0BsaW5rIFRlc3REZXZpY2UjZ2V0U2NyZWVuc2hvdCgpfS4KLSAgICAgKiA8cC8+Ci0gICAgICogR3JhYiBhIHNjcmVlbnNob3QgYW5kIHBlcmZvcm0gYSBjdXJzb3J5IHNpemUgY2hlY2sgdG8gZW5zdXJlIGl0cyB2YWxpZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U2NyZWVuc2hvdCgpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgSW5wdXRTdHJlYW1Tb3VyY2Ugc291cmNlID0gZ2V0RGV2aWNlKCkuZ2V0U2NyZWVuc2hvdCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNvdXJjZSk7Ci0gICAgICAgIElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gc291cmNlLmNyZWF0ZUlucHV0U3RyZWFtKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBCdWZmZXJlZEltYWdlIHNjcmVlbnNob3RJbWFnZSA9IEltYWdlSU8ucmVhZChpbnB1dFN0cmVhbSk7Ci0gICAgICAgICAgICBDTG9nLmkoInRlc3RHZXRTY3JlZW5zaG90IHc9JWQsIGg9JWQiLAotICAgICAgICAgICAgICAgICAgICBzY3JlZW5zaG90SW1hZ2UuZ2V0V2lkdGgoKSwgc2NyZWVuc2hvdEltYWdlLmdldEhlaWdodCgpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc2NyZWVuc2hvdEltYWdlLmdldFdpZHRoKCkgPiAwKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc2NyZWVuc2hvdEltYWdlLmdldEhlaWdodCgpID4gMCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBTdHJlYW1VdGlsLmNhbmNlbChzb3VyY2UpOwotICAgICAgICAgICAgU3RyZWFtVXRpbC5jbG9zZShpbnB1dFN0cmVhbSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCYXNpYyB0ZXN0IGZvciB7QGxpbmsgVGVzdERldmljZSNnZXRMb2djYXQoaW50KX0uCi0gICAgICogPHAvPgotICAgICAqIER1bXBzIGEgYnVuY2ggb2YgbWVzc2FnZXMgdG8gbG9nY2F0LCBjYWxscyBnZXRMb2djYXQoKSwgYW5kIHZlcmlmaWVzIHNpemUgb2YgY2FwdHVyZSBmaWxlIGlzCi0gICAgICogZXF1YWwgdG8gcHJvdmlkZWQgZGF0YS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TG9nY2F0X3NpemUoKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIENMb2cuaSgidGVzdEdldExvZ2NhdF9zaXplIik7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKLSAgICAgICAgICAgIGdldERldmljZSgpLmV4ZWN1dGVTaGVsbENvbW1hbmQoU3RyaW5nLmZvcm1hdCgibG9nIHRlc3RHZXRMb2djYXRfc2l6ZSBsb2cgZHVtcCAlZCIsIGkpKTsKLSAgICAgICAgfQotICAgICAgICBib29sZWFuIHBhc3NlZCA9IGZhbHNlOwotICAgICAgICBpbnQgcmV0cnkgPSAwOwotICAgICAgICB3aGlsZSAoIXBhc3NlZCkgewotICAgICAgICAgICAgLy8gc2xlZXAgYSBzbWFsbCBhbW91bnQgb2YgdGltZSB0byBlbnN1cmUgbGFzdCBsb2cgbWVzc2FnZSBtYWtlcyBpdCBpbnRvIGNhcHR1cmUKLSAgICAgICAgICAgIFJ1blV0aWwuZ2V0RGVmYXVsdCgpLnNsZWVwKDEwKTsKLSAgICAgICAgICAgIElucHV0U3RyZWFtU291cmNlIHNvdXJjZSA9IGdldERldmljZSgpLmdldExvZ2NhdCgxMDAgKiAxMDI0KTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoc291cmNlKTsKLSAgICAgICAgICAgIEZpbGUgdG1wVHh0RmlsZSA9IEZpbGVVdGlsLmNyZWF0ZVRlbXBGaWxlKCJsb2djYXQiLCAiLnR4dCIpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBGaWxlVXRpbC53cml0ZVRvRmlsZShzb3VyY2UuY3JlYXRlSW5wdXRTdHJlYW0oKSwgdG1wVHh0RmlsZSk7Ci0gICAgICAgICAgICAgICAgQ0xvZy5pKCJDcmVhdGVkIGZpbGUgYXQgJXMiLCB0bXBUeHRGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICAgICAgICAvLyBlbnN1cmUgbGFzdCBsb2cgbWVzc2FnZSBpcyBwcmVzZW50IGluIGxvZwotICAgICAgICAgICAgICAgIFN0cmluZyBzID0gRmlsZVV0aWwucmVhZFN0cmluZ0Zyb21GaWxlKHRtcFR4dEZpbGUpOwotICAgICAgICAgICAgICAgIGlmIChzLmNvbnRhaW5zKCJ0ZXN0R2V0TG9nY2F0X3NpemUgbG9nIGR1bXAgOTkiKSkgewotICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgRmlsZVV0aWwuZGVsZXRlRmlsZSh0bXBUeHRGaWxlKTsKLSAgICAgICAgICAgICAgICBzb3VyY2UuY2FuY2VsKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXRyeSsrOwotICAgICAgICAgICAgaWYgKChyZXRyeSA+IDEwMCkgJiYgIXBhc3NlZCkgewotICAgICAgICAgICAgICAgIGZhaWwoImxhc3QgbG9nIG1lc3NhZ2UgaXMgbm90IGluIGNhcHR1cmVkIGxvZ2NhdCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hYWRiL3NyYy9hbmRyb2lkL2FhZGIvY3RzL1Rlc3REZXZpY2VTdHJlc3NUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2FhZGIvc3JjL2FuZHJvaWQvYWFkYi9jdHMvVGVzdERldmljZVN0cmVzc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YyZmZhOC4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL2FhZGIvc3JjL2FuZHJvaWQvYWFkYi9jdHMvVGVzdERldmljZVN0cmVzc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLmFhZGIuY3RzOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLklEZXZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLkRldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuSVRlc3REZXZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLlRlc3REZXZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuRGV2aWNlVGVzdENhc2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudXRpbC5GaWxlVXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqIExvbmcgcnVubmluZyBmdW5jdGlvbmFsIHRlc3RzIGZvciB7QGxpbmsgVGVzdERldmljZX0gdGhhdCB2ZXJpZnkgYW4gb3BlcmF0aW9uIGNhbiBiZSBydW4KLSAqIG1hbnkgdGltZXMgaW4gc2VxdWVuY2UKLSAqIDxwLz4KLSAqIFJlcXVpcmVzIGEgcGh5c2ljYWwgZGV2aWNlIHRvIGJlIGNvbm5lY3RlZC4KLSAqLwotcHVibGljIGNsYXNzIFRlc3REZXZpY2VTdHJlc3NUZXN0IGV4dGVuZHMgRGV2aWNlVGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRFU1RfRklMRV9DT1VOVD0gMjAwOwotICAgIHByaXZhdGUgaW50IG1JdGVyYXRpb25zID0gMjU7Ci0gICAgcHJpdmF0ZSBJVGVzdERldmljZSBtVGVzdERldmljZTsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIG1UZXN0RGV2aWNlID0gZ2V0RGV2aWNlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBGaWxlIGNyZWF0ZVRlbXBUZXN0RmlsZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBGaWxlIHRtcERpciA9IG51bGw7Ci0gICAgICAgIEZpbGUgdG1wRmlsZSA9IG51bGw7Ci0KLSAgICAgICAgdG1wRGlyID0gRmlsZVV0aWwuY3JlYXRlVGVtcERpcigidGVzdERpciIpOwotCi0gICAgICAgIGZpbmFsIFN0cmluZyBmaWxlQ29udGVudHMgPSAidGhpcyBpcyB0aGUgdGVzdCBmaWxlIGNvbnRlbnRzIjsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBURVNUX0ZJTEVfQ09VTlQ7IGkrKykgewotICAgICAgICAgICAgdG1wRmlsZSA9IEZpbGVVdGlsLmNyZWF0ZVRlbXBGaWxlKFN0cmluZy5mb3JtYXQoInRtcF8lZCIsIGkpLCAiLnR4dCIsIHRtcERpcik7Ci0gICAgICAgICAgICBGaWxlVXRpbC53cml0ZVRvRmlsZShmaWxlQ29udGVudHMsIHRtcEZpbGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0bXBEaXI7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdHJlc3MgdGVzdCB0byBwdXNoIGEgZm9sZGVyIHdoaWNoIGNvbnRhaW5zIDIwMCB0ZXh0IGZpbGUgdG8gZGV2aWNlCi0gICAgICogaW50ZXJuYWwgc3RvcmFnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHVzaEZvbGRlcldpdGhNYW55RmlsZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24sIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgdG1wRGlyID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIGRldmljZUZpbGVQYXRoID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIGV4dGVybmFsU3RvcmVQYXRoID0gbVRlc3REZXZpY2UuZ2V0TW91bnRQb2ludChJRGV2aWNlLk1OVF9FWFRFUk5BTF9TVE9SQUdFKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChleHRlcm5hbFN0b3JlUGF0aCk7Ci0gICAgICAgIGRldmljZUZpbGVQYXRoID0gU3RyaW5nLmZvcm1hdCgiJXMvJXMiLCBleHRlcm5hbFN0b3JlUGF0aCwgInRlc3REaXIiKTsKLQotICAgICAgICAvLyBzdGFydCB0aGUgc3RyZXNzIHRlc3QKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgdGVzdCBmb2xkZXIgYW5kIG1ha2Ugc3VyZSB0aGUgdGVzdCBmb2xkZXIgZG9lc24ndCBleGlzdCBpbgotICAgICAgICAgICAgLy8gZGV2aWNlIGJlZm9yZSB0aGUgdGVzdCBzdGFydC4KLSAgICAgICAgICAgIHRtcERpciA9IGNyZWF0ZVRlbXBUZXN0RmlsZXMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUl0ZXJhdGlvbnM7IGkrKykgewotICAgICAgICAgICAgICAgIG1UZXN0RGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoU3RyaW5nLmZvcm1hdCgicm0gLXIgJXMiLCBkZXZpY2VGaWxlUGF0aCkpOwotICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKFN0cmluZy5mb3JtYXQoIiVzIGV4aXN0cyIsIGRldmljZUZpbGVQYXRoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UZXN0RGV2aWNlLmRvZXNGaWxlRXhpc3QoZGV2aWNlRmlsZVBhdGgpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKG1UZXN0RGV2aWNlLnB1c2hEaXIodG1wRGlyLCBkZXZpY2VGaWxlUGF0aCkpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUobVRlc3REZXZpY2UuZG9lc0ZpbGVFeGlzdChkZXZpY2VGaWxlUGF0aCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgRmlsZVV0aWwucmVjdXJzaXZlRGVsZXRlKHRtcERpcik7Ci0gICAgICAgICAgICBtVGVzdERldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKFN0cmluZy5mb3JtYXQoInJtIC1yICVzIiwgZGV2aWNlRmlsZVBhdGgpKTsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKFN0cmluZy5mb3JtYXQoIiVzIGV4aXN0cyIsIGRldmljZUZpbGVQYXRoKSwKLSAgICAgICAgICAgICAgICAgICAgbVRlc3REZXZpY2UuZG9lc0ZpbGVFeGlzdChkZXZpY2VGaWxlUGF0aCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hYmlvdmVycmlkZS9BbmRyb2lkVGVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2FiaW92ZXJyaWRlL0FuZHJvaWRUZXN0LnhtbAppbmRleCAxOGIwMDYzLi45OWY3MzFjIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2FiaW92ZXJyaWRlL0FuZHJvaWRUZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2FiaW92ZXJyaWRlL0FuZHJvaWRUZXN0LnhtbApAQCAtMTQsNiArMTQsNyBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIEFiaU92ZXJyaWRlIGhvc3QgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9IndlYnZpZXciIC8+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CiAgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYWJpb3ZlcnJpZGUvYXBwL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2FiaW92ZXJyaWRlL2FwcC9BbmRyb2lkLm1rCmluZGV4IGEyNDZmNzIuLmQ2MDE2ZGQgMTAwNzU1Ci0tLSBhL2hvc3RzaWRldGVzdHMvYWJpb3ZlcnJpZGUvYXBwL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9hYmlvdmVycmlkZS9hcHAvQW5kcm9pZC5tawpAQCAtMjcsNyArMjcsMTAgQEAKIAogTE9DQUxfTVVMVElMSUIgOj0gYm90aAogCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbCBjdHN0ZXN0cnVubmVyCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAorICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0IFwKKyAgICBjdHN0ZXN0cnVubmVyLWF4dCBcCisKIAogTE9DQUxfSk5JX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3RzYWJpb3ZlcnJpZGUKIApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hYmlvdmVycmlkZS9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvYWJpb3ZlcnJpZGUvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggYzQyZDNhOC4uNjEzNTczMiAxMDA3NTUKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hYmlvdmVycmlkZS9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2FiaW92ZXJyaWRlL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0xOSw2ICsxOSw4IEBACiAgICAgcGFja2FnZT0iYW5kcm9pZC5hYmlvdmVycmlkZS5hcHAiPgogCiAgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6dXNlMzJiaXRBYmk9InRydWUiIGFuZHJvaWQ6bXVsdGlBcmNoPSJ0cnVlIj4KKyAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CisKICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLkFiaU92ZXJyaWRlQWN0aXZpdHkiID4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYWJpb3ZlcnJpZGUvYXBwL2puaS9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9hYmlvdmVycmlkZS9hcHAvam5pL0FuZHJvaWQubWsKaW5kZXggYzUwMDEwMC4uZTg3MjViZCAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hYmlvdmVycmlkZS9hcHAvam5pL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9hYmlvdmVycmlkZS9hcHAvam5pL0FuZHJvaWQubWsKQEAgLTI2LDkgKzI2LDEwIEBACiBMT0NBTF9DX0lOQ0xVREVTIDo9ICQoSk5JX0hfSU5DTFVERSkKIAogIyBJZ25vcmUgdW51c2VkIHBhcmFtZXRlcnMuCi1MT0NBTF9DRkxBR1MgKz0gLVduby11bnVzZWQtcGFyYW1ldGVyCitMT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdlcnJvciAtV25vLXVudXNlZC1wYXJhbWV0ZXIKIAotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJuYXRpdmVoZWxwZXJfY29tcGF0X2xpYmMrKyBsaWJsb2cgbGliZGwKLUxPQ0FMX0NYWF9TVEwgOj0gbm9uZQorTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJuYXRpdmVoZWxwZXJfY29tcGF0X2xpYmMrKworTE9DQUxfTkRLX1NUTF9WQVJJQU5UIDo9IG5vbmUKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKIAogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9BbmRyb2lkLm1rCmluZGV4IDJhOGM4MTkuLjU5ZWY3NWUgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L0FuZHJvaWQubWsKQEAgLTIzLDEyICsyMywxNCBAQAogCiBMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBjdHMtdHJhZGVmZWQgdHJhZGVmZWQgY29tcGF0aWJpbGl0eS1ob3N0LXV0aWwKIAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IHRydXRoLWhvc3QtcHJlYnVpbHQKKwogTE9DQUxfSkFWQV9SRVNPVVJDRV9ESVJTIDo9IHJlcwogCiBMT0NBTF9DVFNfVEVTVF9QQUNLQUdFIDo9IGFuZHJvaWQuYXBwc2VjdXJpdHkKIAogIyB0YWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzIGN0c19pbnN0YW50CiAKIExPQ0FMX1JFUVVJUkVEX01PRFVMRVMgOj0gXAogCUN0c0NvcnJ1cHRBcGtUZXN0c19iNzEzNjA5OTkgXApAQCAtMzgsNCArNDAsNCBAQAogaW5jbHVkZSAkKEJVSUxEX0NUU19IT1NUX0pBVkFfTElCUkFSWSkKIAogIyBCdWlsZCB0aGUgdGVzdCBBUEtzIHVzaW5nIHRoZWlyIG93biBtYWtlZmlsZXMKLWluY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKK2luY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L0FuZHJvaWRUZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvQW5kcm9pZFRlc3QueG1sCmluZGV4IDZhOWI1NTcuLjIxMDlhNDcgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvQW5kcm9pZFRlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciB0aGUgQ1RTIEFwcCBTZWN1cml0eSBob3N0IHRlc3RzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iZnJhbWV3b3JrIiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImFuZHJvaWQuYXBwc2VjdXJpdHkuY3RzLkFwcFNlY3VyaXR5UHJlcGFyZXIiIC8+CiAgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRlc3R0eXBlLkphckhvc3RUZXN0IiA+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Jlcy9wa2dzaWd2ZXJpZnkvUkVBRE1FLnR4dCBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvcmVzL3BrZ3NpZ3ZlcmlmeS9SRUFETUUudHh0CmluZGV4IGZjYTJiMTEuLmYzMGVlYzUgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvcmVzL3BrZ3NpZ3ZlcmlmeS9SRUFETUUudHh0CisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvcmVzL3BrZ3NpZ3ZlcmlmeS9SRUFETUUudHh0CkBAIC0xLDMgKzEsMjYgQEAKIEFQS3MgaW4gdGhpcyBkaXJlY3RvcnkgYXJlIHVzZWQgYnkgUGtnSW5zdGFsbFNpZ25hdHVyZVZlcmlmaWNhdGlvblRlc3QuCi1TZWUgdGhhdCBjbGFzcyBmb3IgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRoZXNlIEFQS3Mgd2VyZSBnZW5lcmF0ZWQuCitTZWUgdGhhdCBjbGFzcyBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGVpciB1c2UuCiAKK0luIGdlbmVyYWwsIHRoZXkgYXJlIGRpZmZlcmVudGx5IHNpZ25lZCBmb3JtcyBvZiB0aGUgdGlueWFwcCBBUEsgYW5kIGZvbGxvdwordGhlIGZvbGxvd2luZyBuYW1pbmcgc2NoZW1lOgorCiske3ZlcnNpb259LXdpdGgtJHtzaWduaW5nLWFsZ29yaXRobX0tJHtPSUQtcGFyYW1zfS0ke2tleXNpemV9LSR7ZXh0cmFfaW5mb30KKword2hlcmUgc29tZSBmaWVsZHMgbWF5IG5vdCBiZSBwcmVzZW50LCBidXQgaGF2ZSB0aGUgZm9sbG93aW5nIG1lYW5pbmc6CisKK3ZlcnNpb246IGRlbm90ZXMgd2hpY2ggQVBLIFNpZ25hdHVyZSBTY2hlbWUgKHYxLCB2MiwgYW5kL29yIHYzKSB3YXMgdXNlZAorc2lnbmluZy1hbGdvcml0aG06IGluZGljYXRlcyBob3cgdGhlIHNpZ25hdHVyZSB3YXMgZ2VuZXJhdGVkCitPSUQtcGFyYW1zOiBQS0kgb2JqZWN0IGlkZW50aWZpZXJzIGluZGljYXRpbmcgaG93IHRvIHVzZSB0aGUgcHJvdmlkZWQga2V5CisgIHRvIGdlbmVyYXRlIHRoZSBzaWduYXR1cmUuICBTZWUsIGUuZy4gcmZjMzI3OSBhbmQgcmZjNDA1NS4KK2tleXNpemU6IHRoZSBzaXplIG9mIHRoZSBrZXkgdXNlZCBmb3Igc2lnbmluZworZXh0cmFfaW5mbzogYWRkaXRpb25hbCBub3RlcyB0byBkaXN0aW5ndWlzaCBwYWNrYWdlcy4gQ3VycmVudGx5IHRoaXMgZGVub3RlcworICB3aGljaCB0ZXN0IGNlcnRpZmljYXRlcyB3ZXJlIHVzZWQgdG8gZ2VuZXJhdGUgYSBwcm9vZi1vZi1yb3RhdGlvbiBvYmplY3QsCisgIGlmIG9uZSBleGlzdHMsIGluY2x1ZGVkIGluIHRoZSBzaWduaW5nIGJsb2NrIG9mIHRoZSBBUEssIGFzIHdlbGwgYXMgdGhlCisgIGNhcGFiaWxpdGllcyBvZiB0aG9zZSBjZXJ0aWZpY2F0ZXMgYWNjb3JkaW5nIHRvIEFQSyBTaWduYXR1cmUgU2NoZW1lIHYzLgorCitHZW5lcmF0aW9uIG9mIHRoZXNlIGFwa3Mgd2FzIHBlcmZvcm1lZCB1c2luZyB0aGUgYXBrc2lnbmVyIGNvbW1hbmQtbGluZSB0b29sLAord2hpY2ggbGl2ZXMgYXQgdG9vbHMvYXBrc2lnL3NyYy9hcGtzaWduZXIvamF2YS9jb20vYW5kcm9pZC9hcGtzaWduZXIvIGluIHRoZQorYW5kcm9pZCBzb3VyY2UgdHJlZS4gIFBsZWFzZSByZWZlciB0byB0aGUgdXNhZ2UgaW5zdHJ1Y3Rpb25zIHRoZXJlIGZvciBob3cgdG8KK3NpZ24gQVBLcyB1c2luZyBkaWZmZXJlbnQga2V5c3RvcmVzLCBwcm92aWRlcnMsIGV0Yy4gIEluIHBhcnRpY3VsYXIsIHNvbWUgb2YKK3RoZSBBUEtzIGluIHRoaXMgZGlyZWN0b3J5IHdlcmUgZ2VuZXJhdGVkIGJ5IG1vZGlmeWluZyB0aGUgYXBrc2lnIGxpYnJhcnkgKHNlZQorUkVBRE1FIGluIHRvb2xzL2Fwa3NpZy8pIHRvIGNyZWF0ZSBpbnZhbGlkIG9yIHVuc3VwcG9ydGVkIG91dGNvbWVzLgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9yZXMvcGtnc2lndmVyaWZ5L3YxLW9ubHktd2l0aC10YW1wZXJlZC1jbGFzc2VzLWRleC5hcGsgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Jlcy9wa2dzaWd2ZXJpZnkvdjEtb25seS13aXRoLXRhbXBlcmVkLWNsYXNzZXMtZGV4LmFwawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2MzNTZlCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9yZXMvcGtnc2lndmVyaWZ5L3YxLW9ubHktd2l0aC10YW1wZXJlZC1jbGFzc2VzLWRleC5hcGsKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9yZXMvcGtnc2lndmVyaWZ5L3YzLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC0xLXBlcm1jbGktY29tcGFuaW9uLmFwayBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvcmVzL3BrZ3NpZ3ZlcmlmeS92My1yc2EtcGtjczEtc2hhMjU2LTIwNDgtMS1wZXJtY2xpLWNvbXBhbmlvbi5hcGsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVlYWM4YwotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvcmVzL3BrZ3NpZ3ZlcmlmeS92My1yc2EtcGtjczEtc2hhMjU2LTIwNDgtMS1wZXJtY2xpLWNvbXBhbmlvbi5hcGsKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9yZXMvcGtnc2lndmVyaWZ5L3YzLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC0xLXBlcm1kZWYuYXBrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9yZXMvcGtnc2lndmVyaWZ5L3YzLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC0xLXBlcm1kZWYuYXBrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYjNkMWYKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Jlcy9wa2dzaWd2ZXJpZnkvdjMtcnNhLXBrY3MxLXNoYTI1Ni0yMDQ4LTEtcGVybWRlZi5hcGsKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9yZXMvcGtnc2lndmVyaWZ5L3YzLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC0xLXNoYXJlZFVpZC5hcGsgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Jlcy9wa2dzaWd2ZXJpZnkvdjMtcnNhLXBrY3MxLXNoYTI1Ni0yMDQ4LTEtc2hhcmVkVWlkLmFwawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTZjMDNiCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9yZXMvcGtnc2lndmVyaWZ5L3YzLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC0xLXNoYXJlZFVpZC5hcGsKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9yZXMvcGtnc2lndmVyaWZ5L3YzLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC0xLmFwayBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvcmVzL3BrZ3NpZ3ZlcmlmeS92My1yc2EtcGtjczEtc2hhMjU2LTIwNDgtMS5hcGsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMyMGI1ZAotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvcmVzL3BrZ3NpZ3ZlcmlmeS92My1yc2EtcGtjczEtc2hhMjU2LTIwNDgtMS5hcGsKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9yZXMvcGtnc2lndmVyaWZ5L3YzLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC0xX1BfYW5kXzJfUXBsdXMuYXBrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9yZXMvcGtnc2lndmVyaWZ5L3YzLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC0xX1BfYW5kXzJfUXBsdXMuYXBrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NjNhNGEKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Jlcy9wa2dzaWd2ZXJpZnkvdjMtcnNhLXBrY3MxLXNoYTI1Ni0yMDQ4LTFfUF9hbmRfMl9RcGx1cy5hcGsKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9yZXMvcGtnc2lndmVyaWZ5L3YzLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC0xX2FuZF8yLmFwayBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvcmVzL3BrZ3NpZ3ZlcmlmeS92My1yc2EtcGtjczEtc2hhMjU2LTIwNDgtMV9hbmRfMi5hcGsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE0NTc1MAotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvcmVzL3BrZ3NpZ3ZlcmlmeS92My1yc2EtcGtjczEtc2hhMjU2LTIwNDgtMV9hbmRfMi5hcGsKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9yZXMvcGtnc2lndmVyaWZ5L3YzLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC0yLXBlcm1jbGktY29tcGFuaW9uLmFwayBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvcmVzL3BrZ3NpZ3ZlcmlmeS92My1yc2EtcGtjczEtc2hhMjU2LTIwNDgtMi1wZXJtY2xpLWNvbXBhbmlvbi5hcGsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNiNGE0MAotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvcmVzL3BrZ3NpZ3ZlcmlmeS92My1yc2EtcGtjczEtc2hhMjU2LTIwNDgtMi1wZXJtY2xpLWNvbXBhbmlvbi5hcGsKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9yZXMvcGtnc2lndmVyaWZ5L3YzLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC0yLXBlcm1kZWYuYXBrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9yZXMvcGtnc2lndmVyaWZ5L3YzLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC0yLXBlcm1kZWYuYXBrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNzg1ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Jlcy9wa2dzaWd2ZXJpZnkvdjMtcnNhLXBrY3MxLXNoYTI1Ni0yMDQ4LTItcGVybWRlZi5hcGsKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9yZXMvcGtnc2lndmVyaWZ5L3YzLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC0yLXNoYXJlZFVpZC5hcGsgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Jlcy9wa2dzaWd2ZXJpZnkvdjMtcnNhLXBrY3MxLXNoYTI1Ni0yMDQ4LTItc2hhcmVkVWlkLmFwawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDBjYmEzCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9yZXMvcGtnc2lndmVyaWZ5L3YzLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC0yLXNoYXJlZFVpZC5hcGsKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9yZXMvcGtnc2lndmVyaWZ5L3YzLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC0yLXdpdGgtcG9yXzFfMi1mdWxsLWFuZC1yb2xsLWNhcHMuYXBrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9yZXMvcGtnc2lndmVyaWZ5L3YzLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC0yLXdpdGgtcG9yXzFfMi1mdWxsLWFuZC1yb2xsLWNhcHMuYXBrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjOGYxNDAKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Jlcy9wa2dzaWd2ZXJpZnkvdjMtcnNhLXBrY3MxLXNoYTI1Ni0yMDQ4LTItd2l0aC1wb3JfMV8yLWZ1bGwtYW5kLXJvbGwtY2Fwcy5hcGsKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9yZXMvcGtnc2lndmVyaWZ5L3YzLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC0yLXdpdGgtcG9yXzFfMi1mdWxsLWNhcHMtcGVybWNsaS1jb21wYW5pb24uYXBrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9yZXMvcGtnc2lndmVyaWZ5L3YzLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC0yLXdpdGgtcG9yXzFfMi1mdWxsLWNhcHMtcGVybWNsaS1jb21wYW5pb24uYXBrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNmYxZTQKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Jlcy9wa2dzaWd2ZXJpZnkvdjMtcnNhLXBrY3MxLXNoYTI1Ni0yMDQ4LTItd2l0aC1wb3JfMV8yLWZ1bGwtY2Fwcy1wZXJtY2xpLWNvbXBhbmlvbi5hcGsKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9yZXMvcGtnc2lndmVyaWZ5L3YzLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC0yLXdpdGgtcG9yXzFfMi1mdWxsLWNhcHMtcGVybWRlZi5hcGsgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Jlcy9wa2dzaWd2ZXJpZnkvdjMtcnNhLXBrY3MxLXNoYTI1Ni0yMDQ4LTItd2l0aC1wb3JfMV8yLWZ1bGwtY2Fwcy1wZXJtZGVmLmFwawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGIzNDIzCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9yZXMvcGtnc2lndmVyaWZ5L3YzLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC0yLXdpdGgtcG9yXzFfMi1mdWxsLWNhcHMtcGVybWRlZi5hcGsKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9yZXMvcGtnc2lndmVyaWZ5L3YzLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC0yLXdpdGgtcG9yXzFfMi1mdWxsLWNhcHMtc2hhcmVkVWlkLWNvbXBhbmlvbi5hcGsgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Jlcy9wa2dzaWd2ZXJpZnkvdjMtcnNhLXBrY3MxLXNoYTI1Ni0yMDQ4LTItd2l0aC1wb3JfMV8yLWZ1bGwtY2Fwcy1zaGFyZWRVaWQtY29tcGFuaW9uLmFwawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTVlZWU0Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9yZXMvcGtnc2lndmVyaWZ5L3YzLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC0yLXdpdGgtcG9yXzFfMi1mdWxsLWNhcHMtc2hhcmVkVWlkLWNvbXBhbmlvbi5hcGsKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9yZXMvcGtnc2lndmVyaWZ5L3YzLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC0yLXdpdGgtcG9yXzFfMi1mdWxsLWNhcHMuYXBrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9yZXMvcGtnc2lndmVyaWZ5L3YzLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC0yLXdpdGgtcG9yXzFfMi1mdWxsLWNhcHMuYXBrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZGMwZmUKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Jlcy9wa2dzaWd2ZXJpZnkvdjMtcnNhLXBrY3MxLXNoYTI1Ni0yMDQ4LTItd2l0aC1wb3JfMV8yLWZ1bGwtY2Fwcy5hcGsKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9yZXMvcGtnc2lndmVyaWZ5L3YzLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC0yLXdpdGgtcG9yXzFfMi1uby1wZXJtLWNhcC1wZXJtY2xpLWNvbXBhbmlvbi5hcGsgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Jlcy9wa2dzaWd2ZXJpZnkvdjMtcnNhLXBrY3MxLXNoYTI1Ni0yMDQ4LTItd2l0aC1wb3JfMV8yLW5vLXBlcm0tY2FwLXBlcm1jbGktY29tcGFuaW9uLmFwawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDNlOTdiCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9yZXMvcGtnc2lndmVyaWZ5L3YzLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC0yLXdpdGgtcG9yXzFfMi1uby1wZXJtLWNhcC1wZXJtY2xpLWNvbXBhbmlvbi5hcGsKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9yZXMvcGtnc2lndmVyaWZ5L3YzLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC0yLXdpdGgtcG9yXzFfMi1uby1wZXJtLWNhcC1wZXJtZGVmLmFwayBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvcmVzL3BrZ3NpZ3ZlcmlmeS92My1yc2EtcGtjczEtc2hhMjU2LTIwNDgtMi13aXRoLXBvcl8xXzItbm8tcGVybS1jYXAtcGVybWRlZi5hcGsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U5OTAxZAotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvcmVzL3BrZ3NpZ3ZlcmlmeS92My1yc2EtcGtjczEtc2hhMjU2LTIwNDgtMi13aXRoLXBvcl8xXzItbm8tcGVybS1jYXAtcGVybWRlZi5hcGsKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9yZXMvcGtnc2lndmVyaWZ5L3YzLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC0yLXdpdGgtcG9yXzFfMi1uby1zaFVpZC1jYXAtc2hhcmVkVWlkLWNvbXBhbmlvbi5hcGsgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Jlcy9wa2dzaWd2ZXJpZnkvdjMtcnNhLXBrY3MxLXNoYTI1Ni0yMDQ4LTItd2l0aC1wb3JfMV8yLW5vLXNoVWlkLWNhcC1zaGFyZWRVaWQtY29tcGFuaW9uLmFwawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWU1MDNjCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9yZXMvcGtnc2lndmVyaWZ5L3YzLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC0yLXdpdGgtcG9yXzFfMi1uby1zaFVpZC1jYXAtc2hhcmVkVWlkLWNvbXBhbmlvbi5hcGsKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9yZXMvcGtnc2lndmVyaWZ5L3YzLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC0yLXdpdGgtcG9yXzFfMl8yLWZ1bGwtY2Fwcy5hcGsgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Jlcy9wa2dzaWd2ZXJpZnkvdjMtcnNhLXBrY3MxLXNoYTI1Ni0yMDQ4LTItd2l0aC1wb3JfMV8yXzItZnVsbC1jYXBzLmFwawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzZkMjQzCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9yZXMvcGtnc2lndmVyaWZ5L3YzLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC0yLXdpdGgtcG9yXzFfMl8yLWZ1bGwtY2Fwcy5hcGsKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9yZXMvcGtnc2lndmVyaWZ5L3YzLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC0yLXdpdGhfcG9yXzFfMi1uby1wZXJtLWNhcC1wZXJtZGVmLWNvbXBhbmlvbi5hcGsgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Jlcy9wa2dzaWd2ZXJpZnkvdjMtcnNhLXBrY3MxLXNoYTI1Ni0yMDQ4LTItd2l0aF9wb3JfMV8yLW5vLXBlcm0tY2FwLXBlcm1kZWYtY29tcGFuaW9uLmFwawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjA4YTc5Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9yZXMvcGtnc2lndmVyaWZ5L3YzLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC0yLXdpdGhfcG9yXzFfMi1uby1wZXJtLWNhcC1wZXJtZGVmLWNvbXBhbmlvbi5hcGsKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9yZXMvcGtnc2lndmVyaWZ5L3YzLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC0yLXdpdGhfcG9yXzFfMi1wZXJtZGVmLWNvbXBhbmlvbi5hcGsgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Jlcy9wa2dzaWd2ZXJpZnkvdjMtcnNhLXBrY3MxLXNoYTI1Ni0yMDQ4LTItd2l0aF9wb3JfMV8yLXBlcm1kZWYtY29tcGFuaW9uLmFwawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzNhZTVlCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9yZXMvcGtnc2lndmVyaWZ5L3YzLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC0yLXdpdGhfcG9yXzFfMi1wZXJtZGVmLWNvbXBhbmlvbi5hcGsKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9yZXMvcGtnc2lndmVyaWZ5L3YzLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC0zLXdpdGgtcG9yXzFfMi1mdWxsLWNhcHMuYXBrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9yZXMvcGtnc2lndmVyaWZ5L3YzLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC0zLXdpdGgtcG9yXzFfMi1mdWxsLWNhcHMuYXBrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYzk0NTAKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Jlcy9wa2dzaWd2ZXJpZnkvdjMtcnNhLXBrY3MxLXNoYTI1Ni0yMDQ4LTMtd2l0aC1wb3JfMV8yLWZ1bGwtY2Fwcy5hcGsKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9yZXMvcGtnc2lndmVyaWZ5L3YzLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC0zLXdpdGgtcG9yXzFfMl8zLWZ1bGwtY2Fwcy5hcGsgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Jlcy9wa2dzaWd2ZXJpZnkvdjMtcnNhLXBrY3MxLXNoYTI1Ni0yMDQ4LTMtd2l0aC1wb3JfMV8yXzMtZnVsbC1jYXBzLmFwawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmRkYTIwCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9yZXMvcGtnc2lndmVyaWZ5L3YzLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC0zLXdpdGgtcG9yXzFfMl8zLWZ1bGwtY2Fwcy5hcGsKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9yZXMvcGtnc2lndmVyaWZ5L3YzLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC0zLXdpdGgtcG9yXzJfMy1mdWxsLWNhcHMuYXBrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9yZXMvcGtnc2lndmVyaWZ5L3YzLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC0zLXdpdGgtcG9yXzJfMy1mdWxsLWNhcHMuYXBrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzOTljNjAKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Jlcy9wa2dzaWd2ZXJpZnkvdjMtcnNhLXBrY3MxLXNoYTI1Ni0yMDQ4LTMtd2l0aC1wb3JfMl8zLWZ1bGwtY2Fwcy5hcGsKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9zcmMvYW5kcm9pZC9hcHBzZWN1cml0eS9jdHMvQWRvcHRhYmxlSG9zdFRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvc3JjL2FuZHJvaWQvYXBwc2VjdXJpdHkvY3RzL0Fkb3B0YWJsZUhvc3RUZXN0LmphdmEKaW5kZXggYWZkNzI0NS4uMmU3ODI3MiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9zcmMvYW5kcm9pZC9hcHBzZWN1cml0eS9jdHMvQWRvcHRhYmxlSG9zdFRlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3NyYy9hbmRyb2lkL2FwcHNlY3VyaXR5L2N0cy9BZG9wdGFibGVIb3N0VGVzdC5qYXZhCkBAIC0yMywxMyArMjMsMTggQEAKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHBzZWN1cml0eS5jdHMuU3BsaXRUZXN0cy5DTEFTUzsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHBzZWN1cml0eS5jdHMuU3BsaXRUZXN0cy5QS0c7CiAKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5idWlsZC5JQnVpbGRJbmZvOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLkNvbGxlY3RpbmdPdXRwdXRSZWNlaXZlcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkRldmljZVRlc3RDYXNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLklBYmk7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSUFiaVJlY2VpdmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLklCdWlsZFJlY2VpdmVyOworaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkRldmljZUpVbml0NENsYXNzUnVubmVyOworaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLmp1bml0NC5CYXNlSG9zdEpVbml0NFRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CkBAIC0zNyw0NSArNDIsNTkgQEAKIC8qKgogICogU2V0IG9mIHRlc3RzIHRoYXQgdmVyaWZ5IGJlaGF2aW9yIG9mIGFkb3B0ZWQgc3RvcmFnZSBtZWRpYSwgaWYgc3VwcG9ydGVkLgogICovCi1wdWJsaWMgY2xhc3MgQWRvcHRhYmxlSG9zdFRlc3QgZXh0ZW5kcyBEZXZpY2VUZXN0Q2FzZSBpbXBsZW1lbnRzIElBYmlSZWNlaXZlciwgSUJ1aWxkUmVjZWl2ZXIgewotICAgIHByaXZhdGUgSUFiaSBtQWJpOwotICAgIHByaXZhdGUgSUJ1aWxkSW5mbyBtQ3RzQnVpbGQ7CitAUnVuV2l0aChEZXZpY2VKVW5pdDRDbGFzc1J1bm5lci5jbGFzcykKK3B1YmxpYyBjbGFzcyBBZG9wdGFibGVIb3N0VGVzdCBleHRlbmRzIEJhc2VIb3N0SlVuaXQ0VGVzdCB7CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRBYmkoSUFiaSBhYmkpIHsKLSAgICAgICAgbUFiaSA9IGFiaTsKLSAgICB9CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVBVFVSRV9BRE9QVEFCTEVfU1RPUkFHRSA9ICJmZWF0dXJlOmFuZHJvaWQuc29mdHdhcmUuYWRvcHRhYmxlX3N0b3JhZ2UiOwogCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0QnVpbGQoSUJ1aWxkSW5mbyBidWlsZEluZm8pIHsKLSAgICAgICAgbUN0c0J1aWxkID0gYnVpbGRJbmZvOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0KLSAgICAgICAgVXRpbHMucHJlcGFyZVNpbmdsZVVzZXIoZ2V0RGV2aWNlKCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG1BYmkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG1DdHNCdWlsZCk7CisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFN0YXJ0IGFsbCBwb3NzaWJsZSB1c2VycyB0byBtYWtlIHN1cmUgdGhlaXIgc3RvcmFnZSBpcyB1bmxvY2tlZAorICAgICAgICBVdGlscy5wcmVwYXJlTXVsdGlwbGVVc2VycyhnZXREZXZpY2UoKSwgSW50ZWdlci5NQVhfVkFMVUUpOwogCiAgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoUEtHKTsKKworICAgICAgICAvLyBFbmFibGUgYSB2aXJ0dWFsIGRpc2sgdG8gZ2l2ZSB1cyB0aGUgYmVzdCBzaG90IGF0IGJlaW5nIGFibGUgdG8gcGFzcworICAgICAgICAvLyB0aGUgdmFyaW91cyB0ZXN0cyBiZWxvdy4gVGhpcyBoZWxwcyB2ZXJpZnkgZGV2aWNlcyB0aGF0IG1heSBub3QKKyAgICAgICAgLy8gY3VycmVudGx5IGhhdmUgYW4gU0QgY2FyZCBpbnNlcnRlZC4KKyAgICAgICAgaWYgKGlzU3VwcG9ydGVkRGV2aWNlKCkpIHsKKyAgICAgICAgICAgIGdldERldmljZSgpLmV4ZWN1dGVTaGVsbENvbW1hbmQoInNtIHNldC12aXJ0dWFsLWRpc2sgdHJ1ZSIpOworICAgICAgICB9CiAgICAgfQogCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLQorICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoUEtHKTsKKworICAgICAgICBpZiAoaXNTdXBwb3J0ZWREZXZpY2UoKSkgeworICAgICAgICAgICAgZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZCgic20gc2V0LXZpcnR1YWwtZGlzayBmYWxzZSIpOworICAgICAgICB9CiAgICAgfQogCisgICAgLyoqCisgICAgICogRW5zdXJlIHRoYXQgd2UgaGF2ZSBjb25zaXN0ZW5jeSBiZXR3ZWVuIHRoZSBmZWF0dXJlIGZsYWcgYW5kIHdoYXQgd2UKKyAgICAgKiBzbmlmZmVkIGZyb20gdGhlIHVuZGVybHlpbmcgZnN0YWIuCisgICAgICovCisgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gVE9ETzogTmVlZHMgcG9ydGluZyB0byBpbnN0YW50CisgICAgcHVibGljIHZvaWQgdGVzdEZlYXR1cmVDb25zaXN0ZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaGFzRmVhdHVyZSA9IGhhc0ZlYXR1cmUoKTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBoYXNGc3RhYiA9IGhhc0ZzdGFiKCk7CisgICAgICAgIGlmIChoYXNGZWF0dXJlICE9IGhhc0ZzdGFiKSB7CisgICAgICAgICAgICBmYWlsKCJJbmNvbnNpc3RlbnQgYWRvcHRhYmxlIHN0b3JhZ2Ugc3RhdHVzOyBmZWF0dXJlIGNsYWltcyAiICsgaGFzRmVhdHVyZQorICAgICAgICAgICAgICAgICAgICArICIgYnV0IGZzdGFiIGNsYWltcyAiICsgaGFzRnN0YWIpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gVE9ETzogTmVlZHMgcG9ydGluZyB0byBpbnN0YW50CiAgICAgcHVibGljIHZvaWQgdGVzdEFwcHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFoYXNBZG9wdGFibGUoKSkgcmV0dXJuOworICAgICAgICBpZiAoIWlzU3VwcG9ydGVkRGV2aWNlKCkpIHJldHVybjsKICAgICAgICAgZmluYWwgU3RyaW5nIGRpc2tJZCA9IGdldEFkb3B0aW9uRGlzaygpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGFiaSA9IG1BYmkuZ2V0TmFtZSgpOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGFiaSA9IGdldEFiaSgpLmdldE5hbWUoKTsKICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBhcGsgPSBBQklfVE9fQVBLLmdldChhYmkpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiRmFpbGVkIHRvIGZpbmQgQVBLIGZvciBBQkkgIiArIGFiaSwgYXBrKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKCJGYWlsZWQgdG8gZmluZCBBUEsgZm9yIEFCSSAiICsgYWJpLCBhcGspOwogCiAgICAgICAgICAgICAvLyBJbnN0YWxsIHNpbXBsZSBhcHAgb24gaW50ZXJuYWwKICAgICAgICAgICAgIG5ldyBJbnN0YWxsTXVsdGlwbGUoKS51c2VOYXR1cmFsQWJpKCkuYWRkQXBrKEFQSykuYWRkQXBrKGFwaykucnVuKCk7CkBAIC05OCw2ICsxMTcsMTggQEAKICAgICAgICAgICAgIC8vIFVubW91bnQsIHJlbW91bnQgYW5kIHZlcmlmeQogICAgICAgICAgICAgZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZCgic20gdW5tb3VudCAiICsgdm9sLnZvbElkKTsKICAgICAgICAgICAgIGdldERldmljZSgpLmV4ZWN1dGVTaGVsbENvbW1hbmQoInNtIG1vdW50ICIgKyB2b2wudm9sSWQpOworCisgICAgICAgICAgICBpbnQgYXR0ZW1wdCA9IDA7CisgICAgICAgICAgICBTdHJpbmcgcGtnUGF0aCA9IGdldERldmljZSgpLmV4ZWN1dGVTaGVsbENvbW1hbmQoInBtIHBhdGggIiArIFBLRyk7CisgICAgICAgICAgICB3aGlsZSAoKHBrZ1BhdGggPT0gbnVsbCB8fCBwa2dQYXRoLmlzRW1wdHkoKSkgJiYgYXR0ZW1wdCsrIDwgMTUpIHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7CisgICAgICAgICAgICAgICAgcGtnUGF0aCA9IGdldERldmljZSgpLmV4ZWN1dGVTaGVsbENvbW1hbmQoInBtIHBhdGggIiArIFBLRyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwa2dQYXRoID09IG51bGwgfHwgcGtnUGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIlBhY2thZ2Ugbm90IHJlYWR5IHlldCIpOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBydW5EZXZpY2VUZXN0cyhQS0csIENMQVNTLCAidGVzdERhdGFOb3RJbnRlcm5hbCIpOwogICAgICAgICAgICAgcnVuRGV2aWNlVGVzdHMoUEtHLCBDTEFTUywgInRlc3REYXRhUmVhZCIpOwogICAgICAgICAgICAgcnVuRGV2aWNlVGVzdHMoUEtHLCBDTEFTUywgInRlc3ROYXRpdmUiKTsKQEAgLTExOSw4ICsxNTAsMTAgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBUZXN0CisgICAgQEFwcE1vZGVGdWxsIC8vIFRPRE86IE5lZWRzIHBvcnRpbmcgdG8gaW5zdGFudAogICAgIHB1YmxpYyB2b2lkIHRlc3RQcmltYXJ5U3RvcmFnZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIWhhc0Fkb3B0YWJsZSgpKSByZXR1cm47CisgICAgICAgIGlmICghaXNTdXBwb3J0ZWREZXZpY2UoKSkgcmV0dXJuOwogICAgICAgICBmaW5hbCBTdHJpbmcgZGlza0lkID0gZ2V0QWRvcHRpb25EaXNrKCk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgb3JpZ2luYWxWb2wgPSBnZXREZXZpY2UoKQpAQCAtMjE4LDggKzI1MSwxMCBAQAogICAgICAqIFZlcmlmeSB0aGF0IHdlIGNhbiBpbnN0YWxsIGJvdGggbmV3IGFuZCBpbmhlcml0ZWQgcGFja2FnZXMgZGlyZWN0bHkgb24KICAgICAgKiBhZG9wdGVkIHZvbHVtZXMuCiAgICAgICovCisgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gVE9ETzogTmVlZHMgcG9ydGluZyB0byBpbnN0YW50CiAgICAgcHVibGljIHZvaWQgdGVzdFBhY2thZ2VJbnN0YWxsZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFoYXNBZG9wdGFibGUoKSkgcmV0dXJuOworICAgICAgICBpZiAoIWlzU3VwcG9ydGVkRGV2aWNlKCkpIHJldHVybjsKICAgICAgICAgZmluYWwgU3RyaW5nIGRpc2tJZCA9IGdldEFkb3B0aW9uRGlzaygpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZCgic20gcGFydGl0aW9uICIgKyBkaXNrSWQgKyAiIHByaXZhdGUiKSk7CkBAIC0yNDYsOCArMjgxLDEwIEBACiAgICAgICogVmVyaWZ5IGJlaGF2aW9yIHdoZW4gY2hhbmdlcyBvY2N1ciB3aGlsZSBhZG9wdGVkIGRldmljZSBpcyBlamVjdGVkIGFuZAogICAgICAqIHJldHVybmVkIGF0IGEgbGF0ZXIgdGltZS4KICAgICAgKi8KKyAgICBAVGVzdAorICAgIEBBcHBNb2RlRnVsbCAvLyBUT0RPOiBOZWVkcyBwb3J0aW5nIHRvIGluc3RhbnQKICAgICBwdWJsaWMgdm9pZCB0ZXN0RWplY3RlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIWhhc0Fkb3B0YWJsZSgpKSByZXR1cm47CisgICAgICAgIGlmICghaXNTdXBwb3J0ZWREZXZpY2UoKSkgcmV0dXJuOwogICAgICAgICBmaW5hbCBTdHJpbmcgZGlza0lkID0gZ2V0QWRvcHRpb25EaXNrKCk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBhc3NlcnRFbXB0eShnZXREZXZpY2UoKS5leGVjdXRlU2hlbGxDb21tYW5kKCJzbSBwYXJ0aXRpb24gIiArIGRpc2tJZCArICIgcHJpdmF0ZSIpKTsKQEAgLTI5MSw3ICszMjgsMTUgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNBZG9wdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNTdXBwb3J0ZWREZXZpY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGhhc0ZlYXR1cmUoKSB8fCBoYXNGc3RhYigpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBoYXNGZWF0dXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXREZXZpY2UoKS5oYXNGZWF0dXJlKEZFQVRVUkVfQURPUFRBQkxFX1NUT1JBR0UpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBoYXNGc3RhYigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICByZXR1cm4gQm9vbGVhbi5wYXJzZUJvb2xlYW4oZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZCgic20gaGFzLWFkb3B0YWJsZSIpLnRyaW0oKSk7CiAgICAgfQogCkBAIC0zMzUsMTEgKzM4MCw2IEBACiAgICAgICAgIGdldERldmljZSgpLmV4ZWN1dGVTaGVsbENvbW1hbmQoInNtIGZvcmdldCBhbGwiKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgcnVuRGV2aWNlVGVzdHMoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgdGVzdENsYXNzTmFtZSwgU3RyaW5nIHRlc3RNZXRob2ROYW1lKQotICAgICAgICAgICAgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFV0aWxzLnJ1bkRldmljZVRlc3RzKGdldERldmljZSgpLCBwYWNrYWdlTmFtZSwgdGVzdENsYXNzTmFtZSwgdGVzdE1ldGhvZE5hbWUpOwotICAgIH0KLQogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0U3VjY2VzcyhTdHJpbmcgc3RyKSB7CiAgICAgICAgIGlmIChzdHIgPT0gbnVsbCB8fCAhc3RyLnN0YXJ0c1dpdGgoIlN1Y2Nlc3MiKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJFeHBlY3RlZCBzdWNjZXNzIHN0cmluZyBidXQgZm91bmQgIiArIHN0cik7CkBAIC0zNjcsNyArNDA3LDcgQEAKIAogICAgIHByaXZhdGUgY2xhc3MgSW5zdGFsbE11bHRpcGxlIGV4dGVuZHMgQmFzZUluc3RhbGxNdWx0aXBsZTxJbnN0YWxsTXVsdGlwbGU+IHsKICAgICAgICAgcHVibGljIEluc3RhbGxNdWx0aXBsZSgpIHsKLSAgICAgICAgICAgIHN1cGVyKGdldERldmljZSgpLCBtQ3RzQnVpbGQsIG1BYmkpOworICAgICAgICAgICAgc3VwZXIoZ2V0RGV2aWNlKCksIGdldEJ1aWxkKCksIGdldEFiaSgpKTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvc3JjL2FuZHJvaWQvYXBwc2VjdXJpdHkvY3RzL0FwcFNlY3VyaXR5UHJlcGFyZXIuamF2YSBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvc3JjL2FuZHJvaWQvYXBwc2VjdXJpdHkvY3RzL0FwcFNlY3VyaXR5UHJlcGFyZXIuamF2YQppbmRleCA5MGI4OWFmLi43NThlNmFmIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3NyYy9hbmRyb2lkL2FwcHNlY3VyaXR5L2N0cy9BcHBTZWN1cml0eVByZXBhcmVyLmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9zcmMvYW5kcm9pZC9hcHBzZWN1cml0eS9jdHMvQXBwU2VjdXJpdHlQcmVwYXJlci5qYXZhCkBAIC0yOSw3ICsyOSw2IEBACiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5JVGFyZ2V0Q2xlYW5lcjsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLklUYXJnZXRQcmVwYXJlcjsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlRhcmdldFNldHVwRXJyb3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudXRpbC5TdHJlYW1VdGlsOwogCiAvKioKICAqIENyZWF0ZXMgc2Vjb25kYXJ5IGFuZCB0ZXJ0aWFyeSB1c2VycyBmb3IgdXNlIGR1cmluZyBhIHRlc3Qgc3VpdGUuCkBAIC01NiwxMSArNTUsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIkNyZWF0ZWQgc2Vjb25kYXJ5IHVzZXIgIiArIGRldmljZS5jcmVhdGVVc2VyKCJDVFNfIiArIFN5c3RlbS5uYW5vVGltZSgpKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbVNvdXJjZSBsb2djYXQgPSBkZXZpY2UuZ2V0TG9nY2F0RHVtcCgpOwotICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRyeSAoSW5wdXRTdHJlYW1Tb3VyY2UgbG9nY2F0ID0gZGV2aWNlLmdldExvZ2NhdER1bXAoKSkgewogICAgICAgICAgICAgICAgIG1Mb2dnZXIudGVzdExvZygiQXBwU2VjdXJpdHlQcmVwX2ZhaWxlZF9jcmVhdGVfdXNlciIsIExvZ0RhdGFUeXBlLkxPR0NBVCwgbG9nY2F0KTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgU3RyZWFtVXRpbC5jYW5jZWwobG9nY2F0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRocm93IG5ldyBUYXJnZXRTZXR1cEVycm9yKCJGYWlsZWQgdG8gY3JlYXRlIHVzZXIuIiwgZSwgZGV2aWNlLmdldERldmljZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIH0KQEAgLTc1LDggKzcxLDEwIEBACiAgICAgcHJpdmF0ZSB2b2lkIHJlbW92ZVNlY29uZGFyeVVzZXJzKElUZXN0RGV2aWNlIGRldmljZSkgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIGludFtdIHVzZXJJZHMgPSBVdGlscy5nZXRBbGxVc2VycyhkZXZpY2UpOwogICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IHVzZXJJZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGRldmljZS5yZW1vdmVVc2VyKHVzZXJJZHNbaV0pOwotICAgICAgICAgICAgQ0xvZy5sb2dBbmREaXNwbGF5KExvZ0xldmVsLklORk8sICJEZXN0cm95ZWQgc2Vjb25kYXJ5IHVzZXIgIiArIHVzZXJJZHNbaV0pOworICAgICAgICAgICAgaWYgKGRldmljZS5nZXRDdXJyZW50VXNlcigpICE9IHVzZXJJZHNbaV0pIHsKKyAgICAgICAgICAgICAgICBkZXZpY2UucmVtb3ZlVXNlcih1c2VySWRzW2ldKTsKKyAgICAgICAgICAgICAgICBDTG9nLmxvZ0FuZERpc3BsYXkoTG9nTGV2ZWwuSU5GTywgIkRlc3Ryb3llZCBzZWNvbmRhcnkgdXNlciAiICsgdXNlcklkc1tpXSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvc3JjL2FuZHJvaWQvYXBwc2VjdXJpdHkvY3RzL0FwcFNlY3VyaXR5VGVzdHMuamF2YSBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvc3JjL2FuZHJvaWQvYXBwc2VjdXJpdHkvY3RzL0FwcFNlY3VyaXR5VGVzdHMuamF2YQppbmRleCA5MGRiYWY4Li5mOGY4NjZkIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3NyYy9hbmRyb2lkL2FwcHNlY3VyaXR5L2N0cy9BcHBTZWN1cml0eVRlc3RzLmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9zcmMvYW5kcm9pZC9hcHBzZWN1cml0eS9jdHMvQXBwU2VjdXJpdHlUZXN0cy5qYXZhCkBAIC0xNiwzNCArMTYsMzIgQEAKIAogcGFja2FnZSBhbmRyb2lkLmFwcHNlY3VyaXR5LmN0czsKIAoraW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC5idWlsZC5Db21wYXRpYmlsaXR5QnVpbGRIZWxwZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkxvZzsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5idWlsZC5JQnVpbGRJbmZvOwogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5EZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuRGV2aWNlVGVzdENhc2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSUFiaTsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JQWJpUmVjZWl2ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSUJ1aWxkUmVjZWl2ZXI7CitpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuRGV2aWNlSlVuaXQ0Q2xhc3NSdW5uZXI7CitpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuanVuaXQ0LkJhc2VIb3N0SlVuaXQ0VGVzdDsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC51dGlsLkFiaVV0aWxzOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnV0aWwuUnVuVXRpbDsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ2RkVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIAotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5FT0ZFeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIC8qKgogICogU2V0IG9mIHRlc3RzIHRoYXQgdmVyaWZ5IHZhcmlvdXMgc2VjdXJpdHkgY2hlY2tzIGludm9sdmluZyBtdWx0aXBsZSBhcHBzIGFyZQogICogcHJvcGVybHkgZW5mb3JjZWQuCiAgKi8KLXB1YmxpYyBjbGFzcyBBcHBTZWN1cml0eVRlc3RzIGV4dGVuZHMgRGV2aWNlVGVzdENhc2UgaW1wbGVtZW50cyBJQWJpUmVjZWl2ZXIsIElCdWlsZFJlY2VpdmVyIHsKK0BSdW5XaXRoKERldmljZUpVbml0NENsYXNzUnVubmVyLmNsYXNzKQorcHVibGljIGNsYXNzIEFwcFNlY3VyaXR5VGVzdHMgZXh0ZW5kcyBCYXNlSG9zdEpVbml0NFRlc3QgewogCiAgICAgLy8gdGVzdFNoYXJlZFVpZERpZmZlcmVudENlcnRzIGNvbnN0YW50cwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSEFSRURfVUlfQVBLID0gIkN0c1NoYXJlZFVpZEluc3RhbGwuYXBrIjsKQEAgLTg4LDQwICs4NiwyMyBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiQXBwU2VjdXJpdHlUZXN0cyI7CiAKLSAgICBwcml2YXRlIElBYmkgbUFiaTsKLSAgICBwcml2YXRlIElCdWlsZEluZm8gbUN0c0J1aWxkOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0QWJpKElBYmkgYWJpKSB7Ci0gICAgICAgIG1BYmkgPSBhYmk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEJ1aWxkKElCdWlsZEluZm8gYnVpbGRJbmZvKSB7Ci0gICAgICAgIG1DdHNCdWlsZCA9IGJ1aWxkSW5mbzsKLSAgICB9Ci0KICAgICBwcml2YXRlIEZpbGUgZ2V0VGVzdEFwcEZpbGUoU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyIGJ1aWxkSGVscGVyID0gbmV3IENvbXBhdGliaWxpdHlCdWlsZEhlbHBlcihtQ3RzQnVpbGQpOworICAgICAgICBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIgYnVpbGRIZWxwZXIgPSBuZXcgQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyKGdldEJ1aWxkKCkpOwogICAgICAgICByZXR1cm4gYnVpbGRIZWxwZXIuZ2V0VGVzdEZpbGUoZmlsZU5hbWUpOwogICAgIH0KIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0KKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgVXRpbHMucHJlcGFyZVNpbmdsZVVzZXIoZ2V0RGV2aWNlKCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG1DdHNCdWlsZCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoZ2V0QnVpbGQoKSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogVGVzdCB0aGF0IGFuIGFwcCB0aGF0IGRlY2xhcmVzIHRoZSBzYW1lIHNoYXJlZCB1aWQgYXMgYW4gZXhpc3RpbmcgYXBwLCBjYW5ub3QgYmUgaW5zdGFsbGVkCiAgICAgICogaWYgaXQgaXMgc2lnbmVkIHdpdGggYSBkaWZmZXJlbnQgY2VydGlmaWNhdGUuCiAgICAgICovCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjkuMi9DLTAtMiIpCisgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gVE9ETzogTmVlZHMgcG9ydGluZyB0byBpbnN0YW50CiAgICAgcHVibGljIHZvaWQgdGVzdFNoYXJlZFVpZERpZmZlcmVudENlcnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIExvZy5pKExPR19UQUcsICJpbnN0YWxsaW5nIGFwa3Mgd2l0aCBzaGFyZWQgdWlkLCBidXQgZGlmZmVyZW50IGNlcnRzIik7CiAgICAgICAgIHRyeSB7CkBAIC0xMjksNyArMTEwLDcgQEAKICAgICAgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoU0hBUkVEX1VJX1BLRyk7CiAgICAgICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKFNIQVJFRF9VSV9ESUZGX0NFUlRfUEtHKTsKIAotICAgICAgICAgICAgU3RyaW5nW10gb3B0aW9ucyA9IHtBYmlVdGlscy5jcmVhdGVBYmlGbGFnKG1BYmkuZ2V0TmFtZSgpKX07CisgICAgICAgICAgICBTdHJpbmdbXSBvcHRpb25zID0ge0FiaVV0aWxzLmNyZWF0ZUFiaUZsYWcoZ2V0QWJpKCkuZ2V0TmFtZSgpKX07CiAgICAgICAgICAgICBTdHJpbmcgaW5zdGFsbFJlc3VsdCA9IGdldERldmljZSgpLmluc3RhbGxQYWNrYWdlKGdldFRlc3RBcHBGaWxlKFNIQVJFRF9VSV9BUEspLAogICAgICAgICAgICAgICAgICAgICBmYWxzZSwgb3B0aW9ucyk7CiAgICAgICAgICAgICBhc3NlcnROdWxsKFN0cmluZy5mb3JtYXQoImZhaWxlZCB0byBpbnN0YWxsIHNoYXJlZCB1aWQgYXBwLCBSZWFzb246ICVzIiwgaW5zdGFsbFJlc3VsdCksCkBAIC0xNTAsMTMgKzEzMSwxNSBAQAogICAgICAqIFRlc3QgdGhhdCBhbiBhcHAgdXBkYXRlIGNhbm5vdCBiZSBpbnN0YWxsZWQgb3ZlciBhbiBleGlzdGluZyBhcHAgaWYgaXQgaGFzIGEgZGlmZmVyZW50CiAgICAgICogY2VydGlmaWNhdGUuCiAgICAgICovCisgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gVE9ETzogTmVlZHMgcG9ydGluZyB0byBpbnN0YW50CiAgICAgcHVibGljIHZvaWQgdGVzdEFwcFVwZ3JhZGVEaWZmZXJlbnRDZXJ0cygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBMb2cuaShMT0dfVEFHLCAiaW5zdGFsbGluZyBhcHAgdXBncmFkZSB3aXRoIGRpZmZlcmVudCBjZXJ0cyIpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgLy8gY2xlYW51cCB0ZXN0IGFwcCB0aGF0IG1pZ2h0IGJlIGluc3RhbGxlZCBmcm9tIHByZXZpb3VzIHBhcnRpYWwgdGVzdCBydW4KICAgICAgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoU0lNUExFX0FQUF9QS0cpOwogCi0gICAgICAgICAgICBTdHJpbmdbXSBvcHRpb25zID0ge0FiaVV0aWxzLmNyZWF0ZUFiaUZsYWcobUFiaS5nZXROYW1lKCkpfTsKKyAgICAgICAgICAgIFN0cmluZ1tdIG9wdGlvbnMgPSB7QWJpVXRpbHMuY3JlYXRlQWJpRmxhZyhnZXRBYmkoKS5nZXROYW1lKCkpfTsKICAgICAgICAgICAgIFN0cmluZyBpbnN0YWxsUmVzdWx0ID0gZ2V0RGV2aWNlKCkuaW5zdGFsbFBhY2thZ2UoZ2V0VGVzdEFwcEZpbGUoU0lNUExFX0FQUF9BUEspLAogICAgICAgICAgICAgICAgICAgICBmYWxzZSwgb3B0aW9ucyk7CiAgICAgICAgICAgICBhc3NlcnROdWxsKFN0cmluZy5mb3JtYXQoImZhaWxlZCB0byBpbnN0YWxsIHNpbXBsZSBhcHAuIFJlYXNvbjogJXMiLCBpbnN0YWxsUmVzdWx0KSwKQEAgLTE3NSw2ICsxNTgsOCBAQAogICAgIC8qKgogICAgICAqIFRlc3QgdGhhdCBhbiBhcHAgY2Fubm90IGFjY2VzcyBhbm90aGVyIGFwcCdzIHByaXZhdGUgZGF0YS4KICAgICAgKi8KKyAgICBAVGVzdAorICAgIEBBcHBNb2RlRnVsbCAvLyBUT0RPOiBOZWVkcyBwb3J0aW5nIHRvIGluc3RhbnQKICAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwRmFpbEFjY2Vzc1ByaXZhdGVEYXRhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIExvZy5pKExPR19UQUcsICJpbnN0YWxsaW5nIGFwcCB0aGF0IGF0dGVtcHRzIHRvIGFjY2VzcyBhbm90aGVyIGFwcCdzIHByaXZhdGUgZGF0YSIpOwogICAgICAgICB0cnkgewpAQCAtMTgyLDIwICsxNjcsMjEgQEAKICAgICAgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoQVBQX1dJVEhfREFUQV9QS0cpOwogICAgICAgICAgICAgZ2V0RGV2aWNlKCkudW5pbnN0YWxsUGFja2FnZShBUFBfQUNDRVNTX0RBVEFfUEtHKTsKIAotICAgICAgICAgICAgU3RyaW5nW10gb3B0aW9ucyA9IHtBYmlVdGlscy5jcmVhdGVBYmlGbGFnKG1BYmkuZ2V0TmFtZSgpKX07CisgICAgICAgICAgICBTdHJpbmdbXSBvcHRpb25zID0ge0FiaVV0aWxzLmNyZWF0ZUFiaUZsYWcoZ2V0QWJpKCkuZ2V0TmFtZSgpKX07CiAgICAgICAgICAgICBTdHJpbmcgaW5zdGFsbFJlc3VsdCA9IGdldERldmljZSgpLmluc3RhbGxQYWNrYWdlKGdldFRlc3RBcHBGaWxlKEFQUF9XSVRIX0RBVEFfQVBLKSwKICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIG9wdGlvbnMpOwogICAgICAgICAgICAgYXNzZXJ0TnVsbChTdHJpbmcuZm9ybWF0KCJmYWlsZWQgdG8gaW5zdGFsbCBhcHAgd2l0aCBkYXRhLiBSZWFzb246ICVzIiwgaW5zdGFsbFJlc3VsdCksCiAgICAgICAgICAgICAgICAgICAgIGluc3RhbGxSZXN1bHQpOwogICAgICAgICAgICAgLy8gcnVuIGFwcHdpdGhkYXRhJ3MgdGVzdHMgdG8gY3JlYXRlIHByaXZhdGUgZGF0YQotICAgICAgICAgICAgcnVuRGV2aWNlVGVzdHMoQVBQX1dJVEhfREFUQV9QS0csIEFQUF9XSVRIX0RBVEFfQ0xBU1MsIEFQUF9XSVRIX0RBVEFfQ1JFQVRFX01FVEhPRCk7CisgICAgICAgICAgICBydW5EZXZpY2VUZXN0c0FzQ3VycmVudFVzZXIoCisgICAgICAgICAgICAgICAgICAgIEFQUF9XSVRIX0RBVEFfUEtHLCBBUFBfV0lUSF9EQVRBX0NMQVNTLCBBUFBfV0lUSF9EQVRBX0NSRUFURV9NRVRIT0QpOwogCiAgICAgICAgICAgICBpbnN0YWxsUmVzdWx0ID0gZ2V0RGV2aWNlKCkuaW5zdGFsbFBhY2thZ2UoZ2V0VGVzdEFwcEZpbGUoQVBQX0FDQ0VTU19EQVRBX0FQSyksCiAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBvcHRpb25zKTsKICAgICAgICAgICAgIGFzc2VydE51bGwoU3RyaW5nLmZvcm1hdCgiZmFpbGVkIHRvIGluc3RhbGwgYXBwIGFjY2VzcyBkYXRhLiBSZWFzb246ICVzIiwKICAgICAgICAgICAgICAgICAgICAgaW5zdGFsbFJlc3VsdCksIGluc3RhbGxSZXN1bHQpOwogICAgICAgICAgICAgLy8gcnVuIGFwcGFjY2Vzc2RhdGEncyB0ZXN0cyB3aGljaCBhdHRlbXB0IHRvIGFjY2VzcyBhcHB3aXRoZGF0YSdzIHByaXZhdGUgZGF0YQotICAgICAgICAgICAgcnVuRGV2aWNlVGVzdHMoQVBQX0FDQ0VTU19EQVRBX1BLRyk7CisgICAgICAgICAgICBydW5EZXZpY2VUZXN0c0FzQ3VycmVudFVzZXIoQVBQX0FDQ0VTU19EQVRBX1BLRyk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKEFQUF9XSVRIX0RBVEFfUEtHKTsKICAgICAgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoQVBQX0FDQ0VTU19EQVRBX1BLRyk7CkBAIC0yMDUsMTkgKzE5MSwyMiBAQAogICAgIC8qKgogICAgICAqIFRlc3QgdGhhdCB1bmluc3RhbGwgb2YgYW4gYXBwIHJlbW92ZXMgaXRzIHByaXZhdGUgZGF0YS4KICAgICAgKi8KKyAgICBAVGVzdAorICAgIEBBcHBNb2RlRnVsbCAvLyBUT0RPOiBOZWVkcyBwb3J0aW5nIHRvIGluc3RhbnQKICAgICBwdWJsaWMgdm9pZCB0ZXN0VW5pbnN0YWxsUmVtb3Zlc0RhdGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgTG9nLmkoTE9HX1RBRywgIlVuaW5zdGFsbGluZyBhcHAsIHZlcmlmeWluZyBkYXRhIGlzIHJlbW92ZWQuIik7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAvLyBjbGVhbnVwIHRlc3QgYXBwIHRoYXQgbWlnaHQgYmUgaW5zdGFsbGVkIGZyb20gcHJldmlvdXMgcGFydGlhbCB0ZXN0IHJ1bgogICAgICAgICAgICAgZ2V0RGV2aWNlKCkudW5pbnN0YWxsUGFja2FnZShBUFBfV0lUSF9EQVRBX1BLRyk7CiAKLSAgICAgICAgICAgIFN0cmluZ1tdIG9wdGlvbnMgPSB7QWJpVXRpbHMuY3JlYXRlQWJpRmxhZyhtQWJpLmdldE5hbWUoKSl9OworICAgICAgICAgICAgU3RyaW5nW10gb3B0aW9ucyA9IHtBYmlVdGlscy5jcmVhdGVBYmlGbGFnKGdldEFiaSgpLmdldE5hbWUoKSl9OwogICAgICAgICAgICAgU3RyaW5nIGluc3RhbGxSZXN1bHQgPSBnZXREZXZpY2UoKS5pbnN0YWxsUGFja2FnZShnZXRUZXN0QXBwRmlsZShBUFBfV0lUSF9EQVRBX0FQSyksCiAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBvcHRpb25zKTsKICAgICAgICAgICAgIGFzc2VydE51bGwoU3RyaW5nLmZvcm1hdCgiZmFpbGVkIHRvIGluc3RhbGwgYXBwIHdpdGggZGF0YS4gUmVhc29uOiAlcyIsIGluc3RhbGxSZXN1bHQpLAogICAgICAgICAgICAgICAgICAgICBpbnN0YWxsUmVzdWx0KTsKICAgICAgICAgICAgIC8vIHJ1biBhcHB3aXRoZGF0YSdzIHRlc3RzIHRvIGNyZWF0ZSBwcml2YXRlIGRhdGEKLSAgICAgICAgICAgIHJ1bkRldmljZVRlc3RzKEFQUF9XSVRIX0RBVEFfUEtHLCBBUFBfV0lUSF9EQVRBX0NMQVNTLCBBUFBfV0lUSF9EQVRBX0NSRUFURV9NRVRIT0QpOworICAgICAgICAgICAgcnVuRGV2aWNlVGVzdHNBc0N1cnJlbnRVc2VyKAorICAgICAgICAgICAgICAgICAgICBBUFBfV0lUSF9EQVRBX1BLRywgQVBQX1dJVEhfREFUQV9DTEFTUywgQVBQX1dJVEhfREFUQV9DUkVBVEVfTUVUSE9EKTsKIAogICAgICAgICAgICAgZ2V0RGV2aWNlKCkudW5pbnN0YWxsUGFja2FnZShBUFBfV0lUSF9EQVRBX1BLRyk7CiAKQEAgLTIyNiw3ICsyMTUsNyBAQAogICAgICAgICAgICAgYXNzZXJ0TnVsbChTdHJpbmcuZm9ybWF0KCJmYWlsZWQgdG8gaW5zdGFsbCBhcHAgd2l0aCBkYXRhIHNlY29uZCB0aW1lLiBSZWFzb246ICVzIiwKICAgICAgICAgICAgICAgICAgICAgaW5zdGFsbFJlc3VsdCksIGluc3RhbGxSZXN1bHQpOwogICAgICAgICAgICAgLy8gcnVuIGFwcHdpdGhkYXRhJ3MgJ2NoZWNrIGlmIGZpbGUgZXhpc3RzJyB0ZXN0Ci0gICAgICAgICAgICBydW5EZXZpY2VUZXN0cyhBUFBfV0lUSF9EQVRBX1BLRywgQVBQX1dJVEhfREFUQV9DTEFTUywKKyAgICAgICAgICAgIHJ1bkRldmljZVRlc3RzQXNDdXJyZW50VXNlcihBUFBfV0lUSF9EQVRBX1BLRywgQVBQX1dJVEhfREFUQV9DTEFTUywKICAgICAgICAgICAgICAgICAgICAgQVBQX1dJVEhfREFUQV9DSEVDS19OT0VYSVNUX01FVEhPRCk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKEFQUF9XSVRIX0RBVEFfUEtHKTsKQEAgLTIzNiw2ICsyMjUsOCBAQAogICAgIC8qKgogICAgICAqIFRlc3QgdGhhdCBhbiBhcHAgY2Fubm90IGluc3RydW1lbnQgYW5vdGhlciBhcHAgdGhhdCBpcyBzaWduZWQgd2l0aCBkaWZmZXJlbnQgY2VydGlmaWNhdGUuCiAgICAgICovCisgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gVE9ETzogTmVlZHMgcG9ydGluZyB0byBpbnN0YW50CiAgICAgcHVibGljIHZvaWQgdGVzdEluc3RydW1lbnRhdGlvbkRpZmZDZXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIExvZy5pKExPR19UQUcsICJpbnN0YWxsaW5nIGFwcCB0aGF0IGF0dGVtcHRzIHRvIGluc3RydW1lbnQgYW5vdGhlciBhcHAiKTsKICAgICAgICAgdHJ5IHsKQEAgLTI0Myw3ICsyMzQsNyBAQAogICAgICAgICAgICAgZ2V0RGV2aWNlKCkudW5pbnN0YWxsUGFja2FnZShUQVJHRVRfSU5TVFJVTUVOVF9QS0cpOwogICAgICAgICAgICAgZ2V0RGV2aWNlKCkudW5pbnN0YWxsUGFja2FnZShJTlNUUlVNRU5UX0RJRkZfQ0VSVF9QS0cpOwogCi0gICAgICAgICAgICBTdHJpbmdbXSBvcHRpb25zID0ge0FiaVV0aWxzLmNyZWF0ZUFiaUZsYWcobUFiaS5nZXROYW1lKCkpfTsKKyAgICAgICAgICAgIFN0cmluZ1tdIG9wdGlvbnMgPSB7QWJpVXRpbHMuY3JlYXRlQWJpRmxhZyhnZXRBYmkoKS5nZXROYW1lKCkpfTsKICAgICAgICAgICAgIFN0cmluZyBpbnN0YWxsUmVzdWx0ID0gZ2V0RGV2aWNlKCkuaW5zdGFsbFBhY2thZ2UoCiAgICAgICAgICAgICAgICAgICAgIGdldFRlc3RBcHBGaWxlKFRBUkdFVF9JTlNUUlVNRU5UX0FQSyksIGZhbHNlLCBvcHRpb25zKTsKICAgICAgICAgICAgIGFzc2VydE51bGwoU3RyaW5nLmZvcm1hdCgiZmFpbGVkIHRvIGluc3RhbGwgdGFyZ2V0IGluc3RydW1lbnRhdGlvbiBhcHAuIFJlYXNvbjogJXMiLApAQCAtMjU4LDcgKzI0OSw3IEBACiAgICAgICAgICAgICAvLyBydW4gSU5TVFJVTUVOVF9ESUZGX0NFUlRfUEtHIHRlc3RzCiAgICAgICAgICAgICAvLyB0aGlzIHRlc3Qgd2lsbCBhdHRlbXB0IHRvIGNhbGwgc3RhcnRJbnN0cnVtZW50YXRpb24gZGlyZWN0bHkgYW5kIHZlcmlmeQogICAgICAgICAgICAgLy8gU2VjdXJpdHlFeGNlcHRpb24gaXMgdGhyb3duCi0gICAgICAgICAgICBydW5EZXZpY2VUZXN0cyhJTlNUUlVNRU5UX0RJRkZfQ0VSVF9QS0cpOworICAgICAgICAgICAgcnVuRGV2aWNlVGVzdHNBc0N1cnJlbnRVc2VyKElOU1RSVU1FTlRfRElGRl9DRVJUX1BLRyk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKFRBUkdFVF9JTlNUUlVNRU5UX1BLRyk7CiAgICAgICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKElOU1RSVU1FTlRfRElGRl9DRVJUX1BLRyk7CkBAIC0yNjksNiArMjYwLDggQEAKICAgICAgKiBUZXN0IHRoYXQgYW4gYXBwIGNhbm5vdCB1c2UgYSBzaWduYXR1cmUtZW5mb3JjZWQgcGVybWlzc2lvbiBpZiBpdCBpcyBzaWduZWQgd2l0aCBhIGRpZmZlcmVudAogICAgICAqIGNlcnRpZmljYXRlIHRoYW4gdGhlIGFwcCB0aGF0IGRlY2xhcmVkIHRoZSBwZXJtaXNzaW9uLgogICAgICAqLworICAgIEBUZXN0CisgICAgQEFwcE1vZGVGdWxsIC8vIFRPRE86IE5lZWRzIHBvcnRpbmcgdG8gaW5zdGFudAogICAgIHB1YmxpYyB2b2lkIHRlc3RQZXJtaXNzaW9uRGlmZkNlcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgTG9nLmkoTE9HX1RBRywgImluc3RhbGxpbmcgYXBwIHRoYXQgYXR0ZW1wdHMgdG8gdXNlIHBlcm1pc3Npb24gb2YgYW5vdGhlciBhcHAiKTsKICAgICAgICAgdHJ5IHsKQEAgLTI3Nyw3ICsyNzAsNyBAQAogICAgICAgICAgICAgZ2V0RGV2aWNlKCkudW5pbnN0YWxsUGFja2FnZShERUNMQVJFX1BFUk1JU1NJT05fQ09NUEFUX1BLRyk7CiAgICAgICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKFBFUk1JU1NJT05fRElGRl9DRVJUX1BLRyk7CiAKLSAgICAgICAgICAgIFN0cmluZ1tdIG9wdGlvbnMgPSB7QWJpVXRpbHMuY3JlYXRlQWJpRmxhZyhtQWJpLmdldE5hbWUoKSl9OworICAgICAgICAgICAgU3RyaW5nW10gb3B0aW9ucyA9IHtBYmlVdGlscy5jcmVhdGVBYmlGbGFnKGdldEFiaSgpLmdldE5hbWUoKSl9OwogICAgICAgICAgICAgU3RyaW5nIGluc3RhbGxSZXN1bHQgPSBnZXREZXZpY2UoKS5pbnN0YWxsUGFja2FnZSgKICAgICAgICAgICAgICAgICAgICAgZ2V0VGVzdEFwcEZpbGUoREVDTEFSRV9QRVJNSVNTSU9OX0FQSyksIGZhbHNlLCBvcHRpb25zKTsKICAgICAgICAgICAgIGFzc2VydE51bGwoU3RyaW5nLmZvcm1hdCgiZmFpbGVkIHRvIGluc3RhbGwgZGVjbGFyZSBwZXJtaXNzaW9uIGFwcC4gUmVhc29uOiAlcyIsCkBAIC0yOTQsNyArMjg3LDcgQEAKICAgICAgICAgICAgIGFzc2VydE51bGwoU3RyaW5nLmZvcm1hdCgiZmFpbGVkIHRvIGluc3RhbGwgcGVybWlzc2lvbiBhcHAgd2l0aCBkaWZmIGNlcnQuIFJlYXNvbjogJXMiLAogICAgICAgICAgICAgICAgICAgICBpbnN0YWxsUmVzdWx0KSwgaW5zdGFsbFJlc3VsdCk7CiAgICAgICAgICAgICAvLyBydW4gUEVSTUlTU0lPTl9ESUZGX0NFUlRfUEtHIHRlc3RzIHdoaWNoIHRyeSB0byBhY2Nlc3MgdGhlIHBlcm1pc3Npb24KLSAgICAgICAgICAgIHJ1bkRldmljZVRlc3RzKFBFUk1JU1NJT05fRElGRl9DRVJUX1BLRyk7CisgICAgICAgICAgICBydW5EZXZpY2VUZXN0c0FzQ3VycmVudFVzZXIoUEVSTUlTU0lPTl9ESUZGX0NFUlRfUEtHKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoREVDTEFSRV9QRVJNSVNTSU9OX1BLRyk7CiAgICAgICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKERFQ0xBUkVfUEVSTUlTU0lPTl9DT01QQVRfUEtHKTsKQEAgLTMwNSwxOCArMjk4LDIyIEBACiAgICAgLyoqCiAgICAgICogVGVzdHMgdGhhdCBhbiBhcmJpdHJhcnkgZmlsZSBjYW5ub3QgYmUgaW5zdGFsbGVkIHVzaW5nIHRoZSAnY21kJyBjb21tYW5kLgogICAgICAqLworICAgIEBUZXN0CisgICAgQEFwcE1vZGVGdWxsIC8vIFRPRE86IE5lZWRzIHBvcnRpbmcgdG8gaW5zdGFudAogICAgIHB1YmxpYyB2b2lkIHRlc3RBZGJJbnN0YWxsRmlsZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBTdHJpbmcgb3V0cHV0ID0gZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZCgKICAgICAgICAgICAgICAgICAiY21kIHBhY2thZ2UgaW5zdGFsbCAtUyAxMDI0IC9kYXRhL2xvY2FsL3RtcC9mb28uYXBrIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRXJyb3IgdGV4dCIsICJFcnJvcjogQVBLIGNvbnRlbnQgbXVzdCBiZSBzdHJlYW1lZFxuIiwgb3V0cHV0KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRXJyb3IgdGV4dCIsIG91dHB1dC5jb250YWlucygiRXJyb3IiKSk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHJ1bkRldmljZVRlc3RzKFN0cmluZyBwYWNrYWdlTmFtZSkgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFV0aWxzLnJ1bkRldmljZVRlc3RzKGdldERldmljZSgpLCBwYWNrYWdlTmFtZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJ1bkRldmljZVRlc3RzKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHRlc3RDbGFzc05hbWUsIFN0cmluZyB0ZXN0TWV0aG9kTmFtZSkKKyAgICBwcml2YXRlIHZvaWQgcnVuRGV2aWNlVGVzdHNBc0N1cnJlbnRVc2VyKFN0cmluZyBwYWNrYWdlTmFtZSkKICAgICAgICAgICAgIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBVdGlscy5ydW5EZXZpY2VUZXN0cyhnZXREZXZpY2UoKSwgcGFja2FnZU5hbWUsIHRlc3RDbGFzc05hbWUsIHRlc3RNZXRob2ROYW1lKTsKKyAgICAgICAgVXRpbHMucnVuRGV2aWNlVGVzdHNBc0N1cnJlbnRVc2VyKGdldERldmljZSgpLCBwYWNrYWdlTmFtZSwgbnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJ1bkRldmljZVRlc3RzQXNDdXJyZW50VXNlcigKKyAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIG1ldGhvZE5hbWUpCisgICAgICAgICAgICAgICAgICAgIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24geworICAgICAgICBVdGlscy5ydW5EZXZpY2VUZXN0c0FzQ3VycmVudFVzZXIoZ2V0RGV2aWNlKCksIHBhY2thZ2VOYW1lLCBjbGFzc05hbWUsIG1ldGhvZE5hbWUpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvc3JjL2FuZHJvaWQvYXBwc2VjdXJpdHkvY3RzL0FwcGxpY2F0aW9uVmlzaWJpbGl0eVRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvc3JjL2FuZHJvaWQvYXBwc2VjdXJpdHkvY3RzL0FwcGxpY2F0aW9uVmlzaWJpbGl0eVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWM1YmQxCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9zcmMvYW5kcm9pZC9hcHBzZWN1cml0eS9jdHMvQXBwbGljYXRpb25WaXNpYmlsaXR5VGVzdC5qYXZhCkBAIC0wLDAgKzEsMjkxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYXBwc2VjdXJpdHkuY3RzOworCitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOworaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkRldmljZUpVbml0NENsYXNzUnVubmVyOworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIFRlc3RzIHRoZSB2aXNpYmlsaXR5IG9mIGluc3RhbGxlZCBhcHBsaWNhdGlvbnMuCisgKi8KK0BSdW5XaXRoKERldmljZUpVbml0NENsYXNzUnVubmVyLmNsYXNzKQorcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uVmlzaWJpbGl0eVRlc3QgZXh0ZW5kcyBCYXNlQXBwU2VjdXJpdHlUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUSU5ZX0FQSyA9ICJDdHNQa2dJbnN0YWxsVGlueUFwcC5hcGsiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUSU5ZX1BLRyA9ICJhbmRyb2lkLmFwcHNlY3VyaXR5LmN0cy50aW55YXBwIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1dJVEhfUEVSTUlTU0lPTl9BUEsgPQorICAgICAgICAgICAgIkN0c0FwcGxpY2F0aW9uVmlzaWJpbGl0eUNyb3NzVXNlckFwcC5hcGsiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1dJVEhfUEVSTUlTU0lPTl9QS0cgPQorICAgICAgICAgICAgImNvbS5hbmRyb2lkLmN0cy5hcHBsaWNhdGlvbnZpc2liaWxpdHkiOworCisgICAgcHJpdmF0ZSBpbnRbXSBtVXNlcnM7CisgICAgcHJpdmF0ZSBTdHJpbmcgbU9sZFZlcmlmaWVyVmFsdWU7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXBQYWNrYWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1Vc2VycyA9IFV0aWxzLnByZXBhcmVNdWx0aXBsZVVzZXJzKGdldERldmljZSgpLCAyKTsKKyAgICAgICAgbU9sZFZlcmlmaWVyVmFsdWUgPQorICAgICAgICAgICAgICAgIGdldERldmljZSgpLmV4ZWN1dGVTaGVsbENvbW1hbmQoInNldHRpbmdzIGdldCBnbG9iYWwgcGFja2FnZV92ZXJpZmllcl9lbmFibGUiKTsKKyAgICAgICAgZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZCgic2V0dGluZ3MgcHV0IGdsb2JhbCBwYWNrYWdlX3ZlcmlmaWVyX2VuYWJsZSAwIik7CisgICAgfQorCisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZ2V0RGV2aWNlKCkudW5pbnN0YWxsUGFja2FnZShURVNUX1dJVEhfUEVSTUlTU0lPTl9QS0cpOworICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKFRJTllfUEtHKTsKKyAgICAgICAgZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZCgic2V0dGluZ3MgcHV0IGdsb2JhbCBwYWNrYWdlX3ZlcmlmaWVyX2VuYWJsZSAiCisgICAgICAgICAgICAgICAgKyBtT2xkVmVyaWZpZXJWYWx1ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwocmVhc29uID0gImluc3RhbnQgYXBwbGljYXRpb25zIGNhbm5vdCBiZSBncmFudGVkIElOVEVSQUNUX0FDUk9TU19VU0VSUyIpCisgICAgcHVibGljIHZvaWQgdGVzdFBhY2thZ2VMaXN0Q3Jvc3NVc2VyR3JhbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFtU3VwcG9ydHNNdWx0aVVzZXIpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGludCBpbnN0YWxsVXNlcklkID0gZ2V0SW5zdGFsbFVzZXJJZCgpOworICAgICAgICBmaW5hbCBpbnQgdGVzdFVzZXJJZCA9IGdldFRlc3RVc2VySWQoKTsKKworICAgICAgICBpbnN0YWxsVGVzdEFwcEZvclVzZXIoVElOWV9BUEssIGluc3RhbGxVc2VySWQpOworICAgICAgICBpbnN0YWxsVGVzdEFwcEZvclVzZXIoVEVTVF9XSVRIX1BFUk1JU1NJT05fQVBLLCB0ZXN0VXNlcklkKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgZ3JhbnRDbWQgPSAicG0gZ3JhbnQiCisgICAgICAgICAgICAgICAgKyAiIGNvbS5hbmRyb2lkLmN0cy5hcHBsaWNhdGlvbnZpc2liaWxpdHkiCisgICAgICAgICAgICAgICAgKyAiIGFuZHJvaWQucGVybWlzc2lvbi5JTlRFUkFDVF9BQ1JPU1NfVVNFUlMiOworICAgICAgICBnZXREZXZpY2UoKS5leGVjdXRlU2hlbGxDb21tYW5kKGdyYW50Q21kKTsKKyAgICAgICAgVXRpbHMucnVuRGV2aWNlVGVzdHMoCisgICAgICAgICAgICAgICAgZ2V0RGV2aWNlKCksCisgICAgICAgICAgICAgICAgVEVTVF9XSVRIX1BFUk1JU1NJT05fUEtHLAorICAgICAgICAgICAgICAgICIuQXBwbGljYXRpb25WaXNpYmlsaXR5Q3Jvc3NVc2VyVGVzdCIsCisgICAgICAgICAgICAgICAgInRlc3RQYWNrYWdlVmlzaWJpbGl0eV9jdXJyZW50VXNlciIsCisgICAgICAgICAgICAgICAgdGVzdFVzZXJJZCk7CisgICAgICAgIFV0aWxzLnJ1bkRldmljZVRlc3RzKAorICAgICAgICAgICAgICAgIGdldERldmljZSgpLAorICAgICAgICAgICAgICAgIFRFU1RfV0lUSF9QRVJNSVNTSU9OX1BLRywKKyAgICAgICAgICAgICAgICAiLkFwcGxpY2F0aW9uVmlzaWJpbGl0eUNyb3NzVXNlclRlc3QiLAorICAgICAgICAgICAgICAgICJ0ZXN0UGFja2FnZVZpc2liaWxpdHlfYW55VXNlckNyb3NzVXNlckdyYW50IiwKKyAgICAgICAgICAgICAgICB0ZXN0VXNlcklkKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBBcHBNb2RlRnVsbChyZWFzb24gPSAiaW5zdGFudCBhcHBsaWNhdGlvbnMgY2Fubm90IHNlZSBhbnkgb3RoZXIgYXBwbGljYXRpb24iKQorICAgIHB1YmxpYyB2b2lkIHRlc3RQYWNrYWdlTGlzdENyb3NzVXNlck5vR3JhbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFtU3VwcG9ydHNNdWx0aVVzZXIpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGludCBpbnN0YWxsVXNlcklkID0gZ2V0SW5zdGFsbFVzZXJJZCgpOworICAgICAgICBmaW5hbCBpbnQgdGVzdFVzZXJJZCA9IGdldFRlc3RVc2VySWQoKTsKKworICAgICAgICBpbnN0YWxsVGVzdEFwcEZvclVzZXIoVElOWV9BUEssIGluc3RhbGxVc2VySWQpOworICAgICAgICBpbnN0YWxsVGVzdEFwcEZvclVzZXIoVEVTVF9XSVRIX1BFUk1JU1NJT05fQVBLLCB0ZXN0VXNlcklkKTsKKworICAgICAgICBVdGlscy5ydW5EZXZpY2VUZXN0cygKKyAgICAgICAgICAgICAgICBnZXREZXZpY2UoKSwKKyAgICAgICAgICAgICAgICBURVNUX1dJVEhfUEVSTUlTU0lPTl9QS0csCisgICAgICAgICAgICAgICAgIi5BcHBsaWNhdGlvblZpc2liaWxpdHlDcm9zc1VzZXJUZXN0IiwKKyAgICAgICAgICAgICAgICAidGVzdFBhY2thZ2VWaXNpYmlsaXR5X2N1cnJlbnRVc2VyIiwKKyAgICAgICAgICAgICAgICB0ZXN0VXNlcklkKTsKKyAgICAgICAgVXRpbHMucnVuRGV2aWNlVGVzdHMoCisgICAgICAgICAgICAgICAgZ2V0RGV2aWNlKCksCisgICAgICAgICAgICAgICAgVEVTVF9XSVRIX1BFUk1JU1NJT05fUEtHLAorICAgICAgICAgICAgICAgICIuQXBwbGljYXRpb25WaXNpYmlsaXR5Q3Jvc3NVc2VyVGVzdCIsCisgICAgICAgICAgICAgICAgInRlc3RQYWNrYWdlVmlzaWJpbGl0eV9hbnlVc2VyQ3Jvc3NVc2VyTm9HcmFudCIsCisgICAgICAgICAgICAgICAgdGVzdFVzZXJJZCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwocmVhc29uID0gImluc3RhbnQgYXBwbGljYXRpb25zIGNhbm5vdCBiZSBncmFudGVkIElOVEVSQUNUX0FDUk9TU19VU0VSUyIpCisgICAgcHVibGljIHZvaWQgdGVzdFBhY2thZ2VMaXN0T3RoZXJVc2VyQ3Jvc3NVc2VyR3JhbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFtU3VwcG9ydHNNdWx0aVVzZXIpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGludCBpbnN0YWxsVXNlcklkID0gZ2V0SW5zdGFsbFVzZXJJZCgpOworICAgICAgICBmaW5hbCBpbnQgdGVzdFVzZXJJZCA9IGdldFRlc3RVc2VySWQoKTsKKyAgICAgICAgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiB0ZXN0QXJncyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgdGVzdEFyZ3MucHV0KCJ0ZXN0VXNlciIsIEludGVnZXIudG9TdHJpbmcoaW5zdGFsbFVzZXJJZCkpOworCisgICAgICAgIGluc3RhbGxUZXN0QXBwRm9yVXNlcihUSU5ZX0FQSywgaW5zdGFsbFVzZXJJZCk7CisgICAgICAgIGluc3RhbGxUZXN0QXBwRm9yVXNlcihURVNUX1dJVEhfUEVSTUlTU0lPTl9BUEssIHRlc3RVc2VySWQpOworCisgICAgICAgIGZpbmFsIFN0cmluZyBncmFudENtZCA9ICJwbSBncmFudCIKKyAgICAgICAgICAgICAgICArICIgY29tLmFuZHJvaWQuY3RzLmFwcGxpY2F0aW9udmlzaWJpbGl0eSIKKyAgICAgICAgICAgICAgICArICIgYW5kcm9pZC5wZXJtaXNzaW9uLklOVEVSQUNUX0FDUk9TU19VU0VSUyI7CisgICAgICAgIGdldERldmljZSgpLmV4ZWN1dGVTaGVsbENvbW1hbmQoZ3JhbnRDbWQpOworICAgICAgICBVdGlscy5ydW5EZXZpY2VUZXN0cygKKyAgICAgICAgICAgICAgICBnZXREZXZpY2UoKSwKKyAgICAgICAgICAgICAgICBURVNUX1dJVEhfUEVSTUlTU0lPTl9QS0csCisgICAgICAgICAgICAgICAgIi5BcHBsaWNhdGlvblZpc2liaWxpdHlDcm9zc1VzZXJUZXN0IiwKKyAgICAgICAgICAgICAgICAidGVzdFBhY2thZ2VWaXNpYmlsaXR5X290aGVyVXNlckdyYW50IiwKKyAgICAgICAgICAgICAgICB0ZXN0VXNlcklkLAorICAgICAgICAgICAgICAgIHRlc3RBcmdzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBBcHBNb2RlRnVsbChyZWFzb24gPSAiaW5zdGFudCBhcHBsaWNhdGlvbnMgY2Fubm90IHNlZSBhbnkgb3RoZXIgYXBwbGljYXRpb24iKQorICAgIHB1YmxpYyB2b2lkIHRlc3RQYWNrYWdlTGlzdE90aGVyVXNlckNyb3NzVXNlck5vR3JhbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFtU3VwcG9ydHNNdWx0aVVzZXIpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGludCBpbnN0YWxsVXNlcklkID0gZ2V0SW5zdGFsbFVzZXJJZCgpOworICAgICAgICBmaW5hbCBpbnQgdGVzdFVzZXJJZCA9IGdldFRlc3RVc2VySWQoKTsKKyAgICAgICAgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiB0ZXN0QXJncyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgdGVzdEFyZ3MucHV0KCJ0ZXN0VXNlciIsIEludGVnZXIudG9TdHJpbmcoaW5zdGFsbFVzZXJJZCkpOworCisgICAgICAgIGluc3RhbGxUZXN0QXBwRm9yVXNlcihUSU5ZX0FQSywgaW5zdGFsbFVzZXJJZCk7CisgICAgICAgIGluc3RhbGxUZXN0QXBwRm9yVXNlcihURVNUX1dJVEhfUEVSTUlTU0lPTl9BUEssIHRlc3RVc2VySWQpOworCisgICAgICAgIFV0aWxzLnJ1bkRldmljZVRlc3RzKAorICAgICAgICAgICAgICAgIGdldERldmljZSgpLAorICAgICAgICAgICAgICAgIFRFU1RfV0lUSF9QRVJNSVNTSU9OX1BLRywKKyAgICAgICAgICAgICAgICAiLkFwcGxpY2F0aW9uVmlzaWJpbGl0eUNyb3NzVXNlclRlc3QiLAorICAgICAgICAgICAgICAgICJ0ZXN0UGFja2FnZVZpc2liaWxpdHlfb3RoZXJVc2VyTm9HcmFudCIsCisgICAgICAgICAgICAgICAgdGVzdFVzZXJJZCwKKyAgICAgICAgICAgICAgICB0ZXN0QXJncyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwocmVhc29uID0gImluc3RhbnQgYXBwbGljYXRpb25zIGNhbm5vdCBiZSBncmFudGVkIElOVEVSQUNUX0FDUk9TU19VU0VSUyIpCisgICAgcHVibGljIHZvaWQgdGVzdEFwcGxpY2F0aW9uTGlzdENyb3NzVXNlckdyYW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghbVN1cHBvcnRzTXVsdGlVc2VyKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBpbnQgaW5zdGFsbFVzZXJJZCA9IGdldEluc3RhbGxVc2VySWQoKTsKKyAgICAgICAgZmluYWwgaW50IHRlc3RVc2VySWQgPSBnZXRUZXN0VXNlcklkKCk7CisKKyAgICAgICAgaW5zdGFsbFRlc3RBcHBGb3JVc2VyKFRJTllfQVBLLCBpbnN0YWxsVXNlcklkKTsKKyAgICAgICAgaW5zdGFsbFRlc3RBcHBGb3JVc2VyKFRFU1RfV0lUSF9QRVJNSVNTSU9OX0FQSywgdGVzdFVzZXJJZCk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGdyYW50Q21kID0gInBtIGdyYW50IgorICAgICAgICAgICAgICAgICsgIiBjb20uYW5kcm9pZC5jdHMuYXBwbGljYXRpb252aXNpYmlsaXR5IgorICAgICAgICAgICAgICAgICsgIiBhbmRyb2lkLnBlcm1pc3Npb24uSU5URVJBQ1RfQUNST1NTX1VTRVJTIjsKKyAgICAgICAgZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZChncmFudENtZCk7CisgICAgICAgIFV0aWxzLnJ1bkRldmljZVRlc3RzKAorICAgICAgICAgICAgICAgIGdldERldmljZSgpLAorICAgICAgICAgICAgICAgIFRFU1RfV0lUSF9QRVJNSVNTSU9OX1BLRywKKyAgICAgICAgICAgICAgICAiLkFwcGxpY2F0aW9uVmlzaWJpbGl0eUNyb3NzVXNlclRlc3QiLAorICAgICAgICAgICAgICAgICJ0ZXN0QXBwbGljYXRpb25WaXNpYmlsaXR5X2N1cnJlbnRVc2VyIiwKKyAgICAgICAgICAgICAgICB0ZXN0VXNlcklkKTsKKyAgICAgICAgVXRpbHMucnVuRGV2aWNlVGVzdHMoCisgICAgICAgICAgICAgICAgZ2V0RGV2aWNlKCksCisgICAgICAgICAgICAgICAgVEVTVF9XSVRIX1BFUk1JU1NJT05fUEtHLAorICAgICAgICAgICAgICAgICIuQXBwbGljYXRpb25WaXNpYmlsaXR5Q3Jvc3NVc2VyVGVzdCIsCisgICAgICAgICAgICAgICAgInRlc3RBcHBsaWNhdGlvblZpc2liaWxpdHlfYW55VXNlckNyb3NzVXNlckdyYW50IiwKKyAgICAgICAgICAgICAgICB0ZXN0VXNlcklkKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBBcHBNb2RlRnVsbChyZWFzb24gPSAiaW5zdGFudCBhcHBsaWNhdGlvbnMgY2Fubm90IHNlZSBhbnkgb3RoZXIgYXBwbGljYXRpb24iKQorICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBsaWNhdGlvbkxpc3RDcm9zc1VzZXJOb0dyYW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghbVN1cHBvcnRzTXVsdGlVc2VyKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBpbnQgaW5zdGFsbFVzZXJJZCA9IGdldEluc3RhbGxVc2VySWQoKTsKKyAgICAgICAgZmluYWwgaW50IHRlc3RVc2VySWQgPSBnZXRUZXN0VXNlcklkKCk7CisKKyAgICAgICAgaW5zdGFsbFRlc3RBcHBGb3JVc2VyKFRJTllfQVBLLCBpbnN0YWxsVXNlcklkKTsKKyAgICAgICAgaW5zdGFsbFRlc3RBcHBGb3JVc2VyKFRFU1RfV0lUSF9QRVJNSVNTSU9OX0FQSywgdGVzdFVzZXJJZCk7CisKKyAgICAgICAgVXRpbHMucnVuRGV2aWNlVGVzdHMoCisgICAgICAgICAgICAgICAgZ2V0RGV2aWNlKCksCisgICAgICAgICAgICAgICAgVEVTVF9XSVRIX1BFUk1JU1NJT05fUEtHLAorICAgICAgICAgICAgICAgICIuQXBwbGljYXRpb25WaXNpYmlsaXR5Q3Jvc3NVc2VyVGVzdCIsCisgICAgICAgICAgICAgICAgInRlc3RBcHBsaWNhdGlvblZpc2liaWxpdHlfY3VycmVudFVzZXIiLAorICAgICAgICAgICAgICAgIHRlc3RVc2VySWQpOworICAgICAgICBVdGlscy5ydW5EZXZpY2VUZXN0cygKKyAgICAgICAgICAgICAgICBnZXREZXZpY2UoKSwKKyAgICAgICAgICAgICAgICBURVNUX1dJVEhfUEVSTUlTU0lPTl9QS0csCisgICAgICAgICAgICAgICAgIi5BcHBsaWNhdGlvblZpc2liaWxpdHlDcm9zc1VzZXJUZXN0IiwKKyAgICAgICAgICAgICAgICAidGVzdEFwcGxpY2F0aW9uVmlzaWJpbGl0eV9hbnlVc2VyQ3Jvc3NVc2VyTm9HcmFudCIsCisgICAgICAgICAgICAgICAgdGVzdFVzZXJJZCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwocmVhc29uID0gImluc3RhbnQgYXBwbGljYXRpb25zIGNhbm5vdCBiZSBncmFudGVkIElOVEVSQUNUX0FDUk9TU19VU0VSUyIpCisgICAgcHVibGljIHZvaWQgdGVzdEFwcGxpY2F0aW9uTGlzdE90aGVyVXNlckNyb3NzVXNlckdyYW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghbVN1cHBvcnRzTXVsdGlVc2VyKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBpbnQgaW5zdGFsbFVzZXJJZCA9IGdldEluc3RhbGxVc2VySWQoKTsKKyAgICAgICAgZmluYWwgaW50IHRlc3RVc2VySWQgPSBnZXRUZXN0VXNlcklkKCk7CisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gdGVzdEFyZ3MgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIHRlc3RBcmdzLnB1dCgidGVzdFVzZXIiLCBJbnRlZ2VyLnRvU3RyaW5nKGluc3RhbGxVc2VySWQpKTsKKworICAgICAgICBpbnN0YWxsVGVzdEFwcEZvclVzZXIoVElOWV9BUEssIGluc3RhbGxVc2VySWQpOworICAgICAgICBpbnN0YWxsVGVzdEFwcEZvclVzZXIoVEVTVF9XSVRIX1BFUk1JU1NJT05fQVBLLCB0ZXN0VXNlcklkKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgZ3JhbnRDbWQgPSAicG0gZ3JhbnQiCisgICAgICAgICAgICAgICAgKyAiIGNvbS5hbmRyb2lkLmN0cy5hcHBsaWNhdGlvbnZpc2liaWxpdHkiCisgICAgICAgICAgICAgICAgKyAiIGFuZHJvaWQucGVybWlzc2lvbi5JTlRFUkFDVF9BQ1JPU1NfVVNFUlMiOworICAgICAgICBnZXREZXZpY2UoKS5leGVjdXRlU2hlbGxDb21tYW5kKGdyYW50Q21kKTsKKyAgICAgICAgVXRpbHMucnVuRGV2aWNlVGVzdHMoCisgICAgICAgICAgICAgICAgZ2V0RGV2aWNlKCksCisgICAgICAgICAgICAgICAgVEVTVF9XSVRIX1BFUk1JU1NJT05fUEtHLAorICAgICAgICAgICAgICAgICIuQXBwbGljYXRpb25WaXNpYmlsaXR5Q3Jvc3NVc2VyVGVzdCIsCisgICAgICAgICAgICAgICAgInRlc3RBcHBsaWNhdGlvblZpc2liaWxpdHlfb3RoZXJVc2VyR3JhbnQiLAorICAgICAgICAgICAgICAgIHRlc3RVc2VySWQsCisgICAgICAgICAgICAgICAgdGVzdEFyZ3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgQEFwcE1vZGVGdWxsKHJlYXNvbiA9ICJpbnN0YW50IGFwcGxpY2F0aW9ucyBjYW5ub3Qgc2VlIGFueSBvdGhlciBhcHBsaWNhdGlvbiIpCisgICAgcHVibGljIHZvaWQgdGVzdEFwcGxpY2F0aW9uTGlzdE90aGVyVXNlckNyb3NzVXNlck5vR3JhbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFtU3VwcG9ydHNNdWx0aVVzZXIpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGludCBpbnN0YWxsVXNlcklkID0gZ2V0SW5zdGFsbFVzZXJJZCgpOworICAgICAgICBmaW5hbCBpbnQgdGVzdFVzZXJJZCA9IGdldFRlc3RVc2VySWQoKTsKKyAgICAgICAgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiB0ZXN0QXJncyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgdGVzdEFyZ3MucHV0KCJ0ZXN0VXNlciIsIEludGVnZXIudG9TdHJpbmcoaW5zdGFsbFVzZXJJZCkpOworCisgICAgICAgIGluc3RhbGxUZXN0QXBwRm9yVXNlcihUSU5ZX0FQSywgaW5zdGFsbFVzZXJJZCk7CisgICAgICAgIGluc3RhbGxUZXN0QXBwRm9yVXNlcihURVNUX1dJVEhfUEVSTUlTU0lPTl9BUEssIHRlc3RVc2VySWQpOworCisgICAgICAgIFV0aWxzLnJ1bkRldmljZVRlc3RzKAorICAgICAgICAgICAgICAgIGdldERldmljZSgpLAorICAgICAgICAgICAgICAgIFRFU1RfV0lUSF9QRVJNSVNTSU9OX1BLRywKKyAgICAgICAgICAgICAgICAiLkFwcGxpY2F0aW9uVmlzaWJpbGl0eUNyb3NzVXNlclRlc3QiLAorICAgICAgICAgICAgICAgICJ0ZXN0QXBwbGljYXRpb25WaXNpYmlsaXR5X290aGVyVXNlck5vR3JhbnQiLAorICAgICAgICAgICAgICAgIHRlc3RVc2VySWQsCisgICAgICAgICAgICAgICAgdGVzdEFyZ3MpOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGdldEluc3RhbGxVc2VySWQoKSB7CisgICAgICAgIHJldHVybiBtVXNlcnNbMF07CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgZ2V0VGVzdFVzZXJJZCgpIHsKKyAgICAgICAgcmV0dXJuIG1Vc2Vyc1sxXTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3NyYy9hbmRyb2lkL2FwcHNlY3VyaXR5L2N0cy9CYXNlQXBwU2VjdXJpdHlUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3NyYy9hbmRyb2lkL2FwcHNlY3VyaXR5L2N0cy9CYXNlQXBwU2VjdXJpdHlUZXN0LmphdmEKaW5kZXggOTIwZTBhNS4uYzQ2M2Q1YSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9zcmMvYW5kcm9pZC9hcHBzZWN1cml0eS9jdHMvQmFzZUFwcFNlY3VyaXR5VGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvc3JjL2FuZHJvaWQvYXBwc2VjdXJpdHkvY3RzL0Jhc2VBcHBTZWN1cml0eVRlc3QuamF2YQpAQCAtMTcsNjEgKzE3LDQ0IEBACiBwYWNrYWdlIGFuZHJvaWQuYXBwc2VjdXJpdHkuY3RzOwogCiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQuYnVpbGQuQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmJ1aWxkLklCdWlsZEluZm87CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLkRldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5EZXZpY2VUZXN0Q2FzZTsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JQnVpbGRSZWNlaXZlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5qdW5pdDQuQmFzZUhvc3RKVW5pdDRUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIAogLyoqCiAgKiBCYXNlIGNsYXNzLgogICovCi1wdWJsaWMgY2xhc3MgQmFzZUFwcFNlY3VyaXR5VGVzdCBleHRlbmRzIERldmljZVRlc3RDYXNlIGltcGxlbWVudHMgSUJ1aWxkUmVjZWl2ZXIgewotICAgIHByb3RlY3RlZCBJQnVpbGRJbmZvIG1CdWlsZEluZm87CithYnN0cmFjdCBjbGFzcyBCYXNlQXBwU2VjdXJpdHlUZXN0IGV4dGVuZHMgQmFzZUhvc3RKVW5pdDRUZXN0IHsKIAogICAgIC8qKiBXaGV0aGVyIG11bHRpLXVzZXIgaXMgc3VwcG9ydGVkLiAqLwogICAgIHByb3RlY3RlZCBib29sZWFuIG1TdXBwb3J0c011bHRpVXNlcjsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtSXNTcGxpdFN5c3RlbVVzZXI7CiAgICAgcHJvdGVjdGVkIGludCBtUHJpbWFyeVVzZXJJZDsKICAgICAvKiogVXNlcnMgd2Ugc2hvdWxkbid0IGRlbGV0ZSBpbiB0aGUgdGVzdHMgKi8KICAgICBwcml2YXRlIEFycmF5TGlzdDxJbnRlZ2VyPiBtRml4ZWRVc2VyczsKIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEJ1aWxkKElCdWlsZEluZm8gYnVpbGRJbmZvKSB7Ci0gICAgICAgIG1CdWlsZEluZm8gPSBidWlsZEluZm87Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtQnVpbGRJbmZvKTsgLy8gZW5zdXJlIGJ1aWxkIGhhcyBiZWVuIHNldCBiZWZvcmUgdGVzdCBpcyBydW4uCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGdldEJ1aWxkKCkpOyAvLyBlbnN1cmUgYnVpbGQgaGFzIGJlZW4gc2V0IGJlZm9yZSB0ZXN0IGlzIHJ1bi4KIAogICAgICAgICBtU3VwcG9ydHNNdWx0aVVzZXIgPSBnZXREZXZpY2UoKS5nZXRNYXhOdW1iZXJPZlVzZXJzU3VwcG9ydGVkKCkgPiAxOwotICAgICAgICBtSXNTcGxpdFN5c3RlbVVzZXIgPSBjaGVja0lmU3BsaXRTeXN0ZW1Vc2VyKCk7CiAgICAgICAgIG1QcmltYXJ5VXNlcklkID0gZ2V0RGV2aWNlKCkuZ2V0UHJpbWFyeVVzZXJJZCgpOwogICAgICAgICBtRml4ZWRVc2VycyA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgICBtRml4ZWRVc2Vycy5hZGQobVByaW1hcnlVc2VySWQpOwogICAgICAgICBpZiAobVByaW1hcnlVc2VySWQgIT0gVXRpbHMuVVNFUl9TWVNURU0pIHsKICAgICAgICAgICAgIG1GaXhlZFVzZXJzLmFkZChVdGlscy5VU0VSX1NZU1RFTSk7CiAgICAgICAgIH0KLSAgICAgICAgZ2V0RGV2aWNlKCkuc3dpdGNoVXNlcihtUHJpbWFyeVVzZXJJZCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrSWZTcGxpdFN5c3RlbVVzZXIoKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIGNvbW1hbmRPdXB1dCA9IGdldERldmljZSgpLmV4ZWN1dGVTaGVsbENvbW1hbmQoCi0gICAgICAgICAgICAgICAgImdldHByb3Agcm8uZncuc3lzdGVtX3VzZXJfc3BsaXQiKTsKLSAgICAgICAgcmV0dXJuICJ5Ii5lcXVhbHMoY29tbWFuZE91cHV0KSB8fCAieWVzIi5lcXVhbHMoY29tbWFuZE91cHV0KQotICAgICAgICAgICAgICAgIHx8ICIxIi5lcXVhbHMoY29tbWFuZE91cHV0KSB8fCAidHJ1ZSIuZXF1YWxzKGNvbW1hbmRPdXB1dCkKLSAgICAgICAgICAgICAgICB8fCAib24iLmVxdWFscyhjb21tYW5kT3VwdXQpOwogICAgIH0KIAogICAgIHByb3RlY3RlZCB2b2lkIGluc3RhbGxUZXN0QXBwRm9yVXNlcihTdHJpbmcgYXBrLCBpbnQgdXNlcklkKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKHVzZXJJZCA8IDApIHsKICAgICAgICAgICAgIHVzZXJJZCA9IG1QcmltYXJ5VXNlcklkOwogICAgICAgICB9Ci0gICAgICAgIENvbXBhdGliaWxpdHlCdWlsZEhlbHBlciBidWlsZEhlbHBlciA9IG5ldyBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIobUJ1aWxkSW5mbyk7Ci0gICAgICAgIGFzc2VydE51bGwoZ2V0RGV2aWNlKCkuaW5zdGFsbFBhY2thZ2VGb3JVc2VyKAorICAgICAgICBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIgYnVpbGRIZWxwZXIgPSBuZXcgQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyKGdldEJ1aWxkKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0TnVsbChnZXREZXZpY2UoKS5pbnN0YWxsUGFja2FnZUZvclVzZXIoCiAgICAgICAgICAgICAgICAgYnVpbGRIZWxwZXIuZ2V0VGVzdEZpbGUoYXBrKSwgdHJ1ZSwgZmFsc2UsIHVzZXJJZCwgIi10IikpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9zcmMvYW5kcm9pZC9hcHBzZWN1cml0eS9jdHMvQ2xhc3Nsb2FkZXJTcGxpdHNUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3NyYy9hbmRyb2lkL2FwcHNlY3VyaXR5L2N0cy9DbGFzc2xvYWRlclNwbGl0c1Rlc3QuamF2YQppbmRleCBlMjkxNzcxLi5lZGNiZDk3IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3NyYy9hbmRyb2lkL2FwcHNlY3VyaXR5L2N0cy9DbGFzc2xvYWRlclNwbGl0c1Rlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3NyYy9hbmRyb2lkL2FwcHNlY3VyaXR5L2N0cy9DbGFzc2xvYWRlclNwbGl0c1Rlc3QuamF2YQpAQCAtMTUsMTEgKzE1LDE5IEBACiAgKi8KIHBhY2thZ2UgYW5kcm9pZC5hcHBzZWN1cml0eS5jdHM7CiAKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5idWlsZC5JQnVpbGRJbmZvOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkRldmljZVRlc3RDYXNlOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uOworaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkRldmljZUpVbml0NENsYXNzUnVubmVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLklCdWlsZFJlY2VpdmVyOworaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLmp1bml0NC5CYXNlSG9zdEpVbml0NFRlc3Q7CiAKLXB1YmxpYyBjbGFzcyBDbGFzc2xvYWRlclNwbGl0c1Rlc3QgZXh0ZW5kcyBEZXZpY2VUZXN0Q2FzZSBpbXBsZW1lbnRzIElCdWlsZFJlY2VpdmVyIHsKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKK0BSdW5XaXRoKERldmljZUpVbml0NENsYXNzUnVubmVyLmNsYXNzKQorcHVibGljIGNsYXNzIENsYXNzbG9hZGVyU3BsaXRzVGVzdCBleHRlbmRzIEJhc2VIb3N0SlVuaXQ0VGVzdCBpbXBsZW1lbnRzIElCdWlsZFJlY2VpdmVyIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEtHID0gImNvbS5hbmRyb2lkLmN0cy5jbGFzc2xvYWRlcnNwbGl0YXBwIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9DTEFTUyA9IFBLRyArICIuU3BsaXRBcHBUZXN0IjsKIApAQCAtMzksNTQgKzQ3LDU4IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFQS19GRUFUVVJFX0EgPSAiQ3RzQ2xhc3Nsb2FkZXJTcGxpdEFwcEZlYXR1cmVBLmFwayI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFQS19GRUFUVVJFX0IgPSAiQ3RzQ2xhc3Nsb2FkZXJTcGxpdEFwcEZlYXR1cmVCLmFwayI7CiAKLSAgICBwcml2YXRlIElCdWlsZEluZm8gbUJ1aWxkSW5mbzsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0KKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgVXRpbHMucHJlcGFyZVNpbmdsZVVzZXIoZ2V0RGV2aWNlKCkpOwogICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKFBLRyk7CiAgICAgfQogCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKFBLRyk7CiAgICAgfQogCisgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gVE9ETzogTmVlZHMgcG9ydGluZyB0byBpbnN0YW50CiAgICAgcHVibGljIHZvaWQgdGVzdEJhc2VDbGFzc0xvYWRlcigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBuZXcgSW5zdGFsbE11bHRpcGxlKCkuYWRkQXBrKEFQS19CQVNFKS5ydW4oKTsKLSAgICAgICAgVXRpbHMucnVuRGV2aWNlVGVzdHMoZ2V0RGV2aWNlKCksIFBLRywgVEVTVF9DTEFTUywgInRlc3RCYXNlQ2xhc3NMb2FkZXIiKTsKKyAgICAgICAgcnVuRGV2aWNlVGVzdHNBc0N1cnJlbnRVc2VyKFBLRywgVEVTVF9DTEFTUywgInRlc3RCYXNlQ2xhc3NMb2FkZXIiKTsKICAgICB9CiAKKyAgICBAVGVzdAorICAgIEBBcHBNb2RlRnVsbCAvLyBUT0RPOiBOZWVkcyBwb3J0aW5nIHRvIGluc3RhbnQKICAgICBwdWJsaWMgdm9pZCB0ZXN0RmVhdHVyZUFDbGFzc0xvYWRlcigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBuZXcgSW5zdGFsbE11bHRpcGxlKCkuYWRkQXBrKEFQS19CQVNFKS5hZGRBcGsoQVBLX0ZFQVRVUkVfQSkucnVuKCk7Ci0gICAgICAgIFV0aWxzLnJ1bkRldmljZVRlc3RzKGdldERldmljZSgpLCBQS0csIFRFU1RfQ0xBU1MsICJ0ZXN0QmFzZUNsYXNzTG9hZGVyIik7Ci0gICAgICAgIFV0aWxzLnJ1bkRldmljZVRlc3RzKGdldERldmljZSgpLCBQS0csIFRFU1RfQ0xBU1MsICJ0ZXN0RmVhdHVyZUFDbGFzc0xvYWRlciIpOworICAgICAgICBydW5EZXZpY2VUZXN0c0FzQ3VycmVudFVzZXIoUEtHLCBURVNUX0NMQVNTLCAidGVzdEJhc2VDbGFzc0xvYWRlciIpOworICAgICAgICBydW5EZXZpY2VUZXN0c0FzQ3VycmVudFVzZXIoUEtHLCBURVNUX0NMQVNTLCAidGVzdEZlYXR1cmVBQ2xhc3NMb2FkZXIiKTsKICAgICB9CiAKKyAgICBAVGVzdAorICAgIEBBcHBNb2RlRnVsbCAvLyBUT0RPOiBOZWVkcyBwb3J0aW5nIHRvIGluc3RhbnQKICAgICBwdWJsaWMgdm9pZCB0ZXN0RmVhdHVyZUJDbGFzc0xvYWRlcigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBuZXcgSW5zdGFsbE11bHRpcGxlKCkuYWRkQXBrKEFQS19CQVNFKS5hZGRBcGsoQVBLX0ZFQVRVUkVfQSkuYWRkQXBrKEFQS19GRUFUVVJFX0IpLnJ1bigpOwotICAgICAgICBVdGlscy5ydW5EZXZpY2VUZXN0cyhnZXREZXZpY2UoKSwgUEtHLCBURVNUX0NMQVNTLCAidGVzdEJhc2VDbGFzc0xvYWRlciIpOwotICAgICAgICBVdGlscy5ydW5EZXZpY2VUZXN0cyhnZXREZXZpY2UoKSwgUEtHLCBURVNUX0NMQVNTLCAidGVzdEZlYXR1cmVBQ2xhc3NMb2FkZXIiKTsKLSAgICAgICAgVXRpbHMucnVuRGV2aWNlVGVzdHMoZ2V0RGV2aWNlKCksIFBLRywgVEVTVF9DTEFTUywgInRlc3RGZWF0dXJlQkNsYXNzTG9hZGVyIik7CisgICAgICAgIHJ1bkRldmljZVRlc3RzQXNDdXJyZW50VXNlcihQS0csIFRFU1RfQ0xBU1MsICJ0ZXN0QmFzZUNsYXNzTG9hZGVyIik7CisgICAgICAgIHJ1bkRldmljZVRlc3RzQXNDdXJyZW50VXNlcihQS0csIFRFU1RfQ0xBU1MsICJ0ZXN0RmVhdHVyZUFDbGFzc0xvYWRlciIpOworICAgICAgICBydW5EZXZpY2VUZXN0c0FzQ3VycmVudFVzZXIoUEtHLCBURVNUX0NMQVNTLCAidGVzdEZlYXR1cmVCQ2xhc3NMb2FkZXIiKTsKICAgICB9CiAKKyAgICBAVGVzdAorICAgIEBBcHBNb2RlRnVsbCAvLyBUT0RPOiBOZWVkcyBwb3J0aW5nIHRvIGluc3RhbnQKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVjZWl2ZXJDbGFzc0xvYWRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgbmV3IEluc3RhbGxNdWx0aXBsZSgpLmFkZEFwayhBUEtfQkFTRSkuYWRkQXBrKEFQS19GRUFUVVJFX0EpLmFkZEFwayhBUEtfRkVBVFVSRV9CKS5ydW4oKTsKLSAgICAgICAgVXRpbHMucnVuRGV2aWNlVGVzdHMoZ2V0RGV2aWNlKCksIFBLRywgVEVTVF9DTEFTUywgInRlc3RCYXNlQ2xhc3NMb2FkZXIiKTsKLSAgICAgICAgVXRpbHMucnVuRGV2aWNlVGVzdHMoZ2V0RGV2aWNlKCksIFBLRywgVEVTVF9DTEFTUywgInRlc3RBbGxSZWNlaXZlcnMiKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRCdWlsZChJQnVpbGRJbmZvIGJ1aWxkSW5mbykgewotICAgICAgICBtQnVpbGRJbmZvID0gYnVpbGRJbmZvOworICAgICAgICBydW5EZXZpY2VUZXN0c0FzQ3VycmVudFVzZXIoUEtHLCBURVNUX0NMQVNTLCAidGVzdEJhc2VDbGFzc0xvYWRlciIpOworICAgICAgICBydW5EZXZpY2VUZXN0c0FzQ3VycmVudFVzZXIoUEtHLCBURVNUX0NMQVNTLCAidGVzdEFsbFJlY2VpdmVycyIpOwogICAgIH0KIAogICAgIHByaXZhdGUgY2xhc3MgSW5zdGFsbE11bHRpcGxlIGV4dGVuZHMgQmFzZUluc3RhbGxNdWx0aXBsZTxJbnN0YWxsTXVsdGlwbGU+IHsKICAgICAgICAgcHVibGljIEluc3RhbGxNdWx0aXBsZSgpIHsKLSAgICAgICAgICAgIHN1cGVyKGdldERldmljZSgpLCBtQnVpbGRJbmZvLCBudWxsKTsKKyAgICAgICAgICAgIHN1cGVyKGdldERldmljZSgpLCBnZXRCdWlsZCgpLCBudWxsKTsKICAgICAgICAgfQogICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBydW5EZXZpY2VUZXN0c0FzQ3VycmVudFVzZXIoCisgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyB0ZXN0Q2xhc3NOYW1lLCBTdHJpbmcgdGVzdE1ldGhvZE5hbWUpCisgICAgICAgICAgICAgICAgICAgIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24geworICAgICAgICBVdGlscy5ydW5EZXZpY2VUZXN0c0FzQ3VycmVudFVzZXIoZ2V0RGV2aWNlKCksIHBhY2thZ2VOYW1lLCB0ZXN0Q2xhc3NOYW1lLCB0ZXN0TWV0aG9kTmFtZSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9zcmMvYW5kcm9pZC9hcHBzZWN1cml0eS9jdHMvQ29ycnVwdEFwa1Rlc3RzLmphdmEgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3NyYy9hbmRyb2lkL2FwcHNlY3VyaXR5L2N0cy9Db3JydXB0QXBrVGVzdHMuamF2YQppbmRleCA4YWM1MGFmLi44NTE2YzczIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3NyYy9hbmRyb2lkL2FwcHNlY3VyaXR5L2N0cy9Db3JydXB0QXBrVGVzdHMuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3NyYy9hbmRyb2lkL2FwcHNlY3VyaXR5L2N0cy9Db3JydXB0QXBrVGVzdHMuamF2YQpAQCAtMjAsNiArMjAsNyBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIAoraW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIGltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuTG9nLkxvZ0xldmVsOwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLmJ1aWxkLkNvbXBhdGliaWxpdHlCdWlsZEhlbHBlcjsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5idWlsZC5JQnVpbGRJbmZvOwpAQCAtNDAsNiArNDEsNyBAQAogICogU2V0IG9mIHRlc3RzIHRoYXQgdmVyaWZ5IHRoYXQgY29ycnVwdCBBUEtzIGFyZSBwcm9wZXJseSByZWplY3RlZCBieSBQYWNrYWdlTWFuYWdlciBhbmQKICAqIGRvIG5vdCBjYXVzZSB0aGUgc3lzdGVtIHRvIGNyYXNoLgogICovCitAQXBwTW9kZUZ1bGwocmVhc29uID0gInRoZSBjb3JydXB0IEFQS3Mgd2VyZSBwcm92aWRlZCBhcy1pcyBhbmQgd2UgY2Fubm90IG1vZGlmeSB0aGVtIHRvIGNvbXBseSB3aXRoIGluc3RhbnQgbW9kZSIpCiBwdWJsaWMgY2xhc3MgQ29ycnVwdEFwa1Rlc3RzIGV4dGVuZHMgRGV2aWNlVGVzdENhc2UgaW1wbGVtZW50cyBJQnVpbGRSZWNlaXZlciB7CiAKICAgICBwcml2YXRlIElCdWlsZEluZm8gbUJ1aWxkSW5mbzsKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvc3JjL2FuZHJvaWQvYXBwc2VjdXJpdHkvY3RzL0RpcmVjdEJvb3RIb3N0VGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9zcmMvYW5kcm9pZC9hcHBzZWN1cml0eS9jdHMvRGlyZWN0Qm9vdEhvc3RUZXN0LmphdmEKaW5kZXggZGRlYzQ4Ny4uNGRjNzY4YSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9zcmMvYW5kcm9pZC9hcHBzZWN1cml0eS9jdHMvRGlyZWN0Qm9vdEhvc3RUZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9zcmMvYW5kcm9pZC9hcHBzZWN1cml0eS9jdHMvRGlyZWN0Qm9vdEhvc3RUZXN0LmphdmEKQEAgLTE2LDE1ICsxNiwyMSBAQAogCiBwYWNrYWdlIGFuZHJvaWQuYXBwc2VjdXJpdHkuY3RzOwogCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOwogaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5BZGJDb21tYW5kUmVqZWN0ZWRFeGNlcHRpb247CiBpbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkNvbGxlY3RpbmdPdXRwdXRSZWNlaXZlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuTG9nOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmJ1aWxkLklCdWlsZEluZm87CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLkRldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5EZXZpY2VUZXN0Q2FzZTsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JQWJpOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLklBYmlSZWNlaXZlcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JQnVpbGRSZWNlaXZlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5EZXZpY2VKVW5pdDRDbGFzc1J1bm5lcjsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5qdW5pdDQuQmFzZUhvc3RKVW5pdDRUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCiAvKioKICAqIFNldCBvZiB0ZXN0cyB0aGF0IHZlcmlmeSBiZWhhdmlvciBvZiBkaXJlY3QgYm9vdCwgaWYgc3VwcG9ydGVkLgpAQCAtMzIsNTggKzM4LDM4IEBACiAgKiBOb3RlIHRoYXQgdGhlc2UgdGVzdHMgZHJpdmUgUElOIHNldHVwIG1hbnVhbGx5IGluc3RlYWQgb2YgcmVseWluZyBvbiBkZXZpY2UKICAqIGFkbWluaXN0cmF0b3JzLCB3aGljaCBhcmUgbm90IHN1cHBvcnRlZCBieSBhbGwgZGV2aWNlcy4KICAqLwotcHVibGljIGNsYXNzIERpcmVjdEJvb3RIb3N0VGVzdCBleHRlbmRzIERldmljZVRlc3RDYXNlIGltcGxlbWVudHMgSUFiaVJlY2VpdmVyLCBJQnVpbGRSZWNlaXZlciB7CitAUnVuV2l0aChEZXZpY2VKVW5pdDRDbGFzc1J1bm5lci5jbGFzcykKK3B1YmxpYyBjbGFzcyBEaXJlY3RCb290SG9zdFRlc3QgZXh0ZW5kcyBCYXNlSG9zdEpVbml0NFRlc3QgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRGlyZWN0Qm9vdEhvc3RUZXN0IjsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQS0cgPSAiY29tLmFuZHJvaWQuY3RzLmVuY3J5cHRpb25hcHAiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTUyA9ICIuRW5jcnlwdGlvbkFwcFRlc3QiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTUyA9IFBLRyArICIuRW5jcnlwdGlvbkFwcFRlc3QiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUEsgPSAiQ3RzRW5jcnlwdGlvbkFwcC5hcGsiOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9USEVSX0FQSyA9ICJDdHNTcGxpdEFwcC5hcGsiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPVEhFUl9QS0cgPSAiY29tLmFuZHJvaWQuY3RzLnNwbGl0YXBwIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1RIRVJfQ0xBU1MgPSAiLlNwbGl0QXBwVGVzdCI7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9ERV9OQVRJVkUgPSAibmF0aXZlIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9ERV9FTVVMQVRFRCA9ICJlbXVsYXRlZCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1PREVfTk9ORSA9ICJub25lIjsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX0RFVklDRV9BRE1JTiA9ICJmZWF0dXJlOmFuZHJvaWQuc29mdHdhcmUuZGV2aWNlX2FkbWluXG4iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX0FVVE9NT1RJVkUgPSAiZmVhdHVyZTphbmRyb2lkLmhhcmR3YXJlLnR5cGUuYXV0b21vdGl2ZVxuIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVBVFVSRV9ERVZJQ0VfQURNSU4gPSAiZmVhdHVyZTphbmRyb2lkLnNvZnR3YXJlLmRldmljZV9hZG1pbiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVfQVVUT01PVElWRSA9ICJmZWF0dXJlOmFuZHJvaWQuaGFyZHdhcmUudHlwZS5hdXRvbW90aXZlIjsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgU0hVVERPV05fVElNRV9NUyA9IDMwICogMTAwMDsKIAotICAgIHByaXZhdGUgU3RyaW5nIG1GZWF0dXJlTGlzdCA9IG51bGw7Ci0KLSAgICBwcml2YXRlIGludFtdIG1Vc2VyczsKLSAgICBwcml2YXRlIElBYmkgbUFiaTsKLSAgICBwcml2YXRlIElCdWlsZEluZm8gbUN0c0J1aWxkOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0QWJpKElBYmkgYWJpKSB7Ci0gICAgICAgIG1BYmkgPSBhYmk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0QnVpbGQoSUJ1aWxkSW5mbyBidWlsZEluZm8pIHsKLSAgICAgICAgbUN0c0J1aWxkID0gYnVpbGRJbmZvOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0KLSAgICAgICAgbVVzZXJzID0gVXRpbHMucHJlcGFyZVNpbmdsZVVzZXIoZ2V0RGV2aWNlKCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG1BYmkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG1DdHNCdWlsZCk7CisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFV0aWxzLnByZXBhcmVTaW5nbGVVc2VyKGdldERldmljZSgpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChnZXRBYmkoKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoZ2V0QnVpbGQoKSk7CiAKICAgICAgICAgZ2V0RGV2aWNlKCkudW5pbnN0YWxsUGFja2FnZShQS0cpOwogICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKE9USEVSX1BLRyk7CiAgICAgfQogCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLQorICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoUEtHKTsKICAgICAgICAgZ2V0RGV2aWNlKCkudW5pbnN0YWxsUGFja2FnZShPVEhFUl9QS0cpOwogICAgIH0KQEAgLTkxLDYgKzc3LDggQEAKICAgICAvKioKICAgICAgKiBBdXRvbW90aXZlIGRldmljZXMgTVVTVCBzdXBwb3J0IG5hdGl2ZSBGQkUuCiAgICAgICovCisgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gVE9ETzogTmVlZHMgcG9ydGluZyB0byBpbnN0YW50CiAgICAgcHVibGljIHZvaWQgdGVzdEF1dG9tb3RpdmVOYXRpdmVGYmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFpc1N1cHBvcnRlZERldmljZSgpKSB7CiAgICAgICAgICAgICBMb2cudihUQUcsICJEZXZpY2Ugbm90IHN1cHBvcnRlZDsgc2tpcHBpbmcgdGVzdCIpOwpAQCAtMTA3LDYgKzk1LDggQEAKICAgICAvKioKICAgICAgKiBJZiBkZXZpY2UgaGFzIG5hdGl2ZSBGQkUsIHZlcmlmeSBsaWZlY3ljbGUuCiAgICAgICovCisgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gVE9ETzogTmVlZHMgcG9ydGluZyB0byBpbnN0YW50CiAgICAgcHVibGljIHZvaWQgdGVzdERpcmVjdEJvb3ROYXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFpc1N1cHBvcnRlZERldmljZSgpKSB7CiAgICAgICAgICAgICBMb2cudihUQUcsICJEZXZpY2Ugbm90IHN1cHBvcnRlZDsgc2tpcHBpbmcgdGVzdCIpOwpAQCAtMTIyLDYgKzExMiw4IEBACiAgICAgLyoqCiAgICAgICogSWYgZGV2aWNlIGRvZXNuJ3QgaGF2ZSBuYXRpdmUgRkJFLCBlbmFibGUgZW11bGF0aW9uIGFuZCB2ZXJpZnkgbGlmZWN5Y2xlLgogICAgICAqLworICAgIEBUZXN0CisgICAgQEFwcE1vZGVGdWxsIC8vIFRPRE86IE5lZWRzIHBvcnRpbmcgdG8gaW5zdGFudAogICAgIHB1YmxpYyB2b2lkIHRlc3REaXJlY3RCb290RW11bGF0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFpc1N1cHBvcnRlZERldmljZSgpKSB7CiAgICAgICAgICAgICBMb2cudihUQUcsICJEZXZpY2Ugbm90IHN1cHBvcnRlZDsgc2tpcHBpbmcgdGVzdCIpOwpAQCAtMTM3LDYgKzEyOSw4IEBACiAgICAgLyoqCiAgICAgICogSWYgZGV2aWNlIGRvZXNuJ3QgaGF2ZSBuYXRpdmUgRkJFLCB2ZXJpZnkgbm9ybWFsIGxpZmVjeWNsZS4KICAgICAgKi8KKyAgICBAVGVzdAorICAgIEBBcHBNb2RlRnVsbCAvLyBUT0RPOiBOZWVkcyBwb3J0aW5nIHRvIGluc3RhbnQKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGlyZWN0Qm9vdE5vbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFpc1N1cHBvcnRlZERldmljZSgpKSB7CiAgICAgICAgICAgICBMb2cudihUQUcsICJEZXZpY2Ugbm90IHN1cHBvcnRlZDsgc2tpcHBpbmcgdGVzdCIpOwpAQCAtMTU4LDEyICsxNTIsMTMgQEAKIAogICAgICAgICAgICAgLy8gVG8gcmVjZWl2ZSBib290IGJyb2FkY2FzdHMsIGtpY2sgb3VyIG90aGVyIGFwcCBvdXQgb2Ygc3RvcHBlZCBzdGF0ZQogICAgICAgICAgICAgZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZCgiYW0gc3RhcnQgLWEgYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iCisgICAgICAgICAgICAgICAgICAgICsgIiAtLXVzZXIgY3VycmVudCIKICAgICAgICAgICAgICAgICAgICAgKyAiIC1jIGFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIGNvbS5hbmRyb2lkLmN0cy5zcGxpdGFwcC8uTXlBY3Rpdml0eSIpOwogCiAgICAgICAgICAgICAvLyBHaXZlIGVub3VnaCB0aW1lIGZvciBQYWNrYWdlTWFuYWdlciB0byBwZXJzaXN0IHN0b3BwZWQgc3RhdGUKICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxNTAwMCk7CiAKLSAgICAgICAgICAgIHJ1bkRldmljZVRlc3RzKFBLRywgQ0xBU1MsICJ0ZXN0U2V0VXAiLCBtVXNlcnMpOworICAgICAgICAgICAgcnVuRGV2aWNlVGVzdHNBc0N1cnJlbnRVc2VyKFBLRywgQ0xBU1MsICJ0ZXN0U2V0VXAiKTsKIAogICAgICAgICAgICAgLy8gR2l2ZSBlbm91Z2ggdGltZSBmb3Igdm9sZCB0byB1cGRhdGUga2V5cwogICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDE1MDAwKTsKQEAgLTE4MywxNiArMTc4LDE2IEBACiAKICAgICAgICAgICAgIGlmIChkb1Rlc3QpIHsKICAgICAgICAgICAgICAgICBpZiAoTU9ERV9OT05FLmVxdWFscyhtb2RlKSkgewotICAgICAgICAgICAgICAgICAgICBydW5EZXZpY2VUZXN0cyhQS0csIENMQVNTLCAidGVzdFZlcmlmeVVubG9ja2VkQW5kRGlzbWlzcyIsIG1Vc2Vycyk7CisgICAgICAgICAgICAgICAgICAgIHJ1bkRldmljZVRlc3RzQXNDdXJyZW50VXNlcihQS0csIENMQVNTLCAidGVzdFZlcmlmeVVubG9ja2VkQW5kRGlzbWlzcyIpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJ1bkRldmljZVRlc3RzKFBLRywgQ0xBU1MsICJ0ZXN0VmVyaWZ5TG9ja2VkQW5kRGlzbWlzcyIsIG1Vc2Vycyk7CisgICAgICAgICAgICAgICAgICAgIHJ1bkRldmljZVRlc3RzQXNDdXJyZW50VXNlcihQS0csIENMQVNTLCAidGVzdFZlcmlmeUxvY2tlZEFuZERpc21pc3MiKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHNlY3VyZSBsb2NrIHNjcmVlbnMgYW5kIHRlYXIgZG93biB0ZXN0IGFwcAotICAgICAgICAgICAgICAgIHJ1bkRldmljZVRlc3RzKFBLRywgQ0xBU1MsICJ0ZXN0VGVhckRvd24iLCBtVXNlcnMpOworICAgICAgICAgICAgICAgIHJ1bkRldmljZVRlc3RzQXNDdXJyZW50VXNlcihQS0csIENMQVNTLCAidGVzdFRlYXJEb3duIik7CiAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoUEtHKTsKIApAQCAtMjA5LDEyICsyMDQsMTAgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBydW5EZXZpY2VUZXN0cyhTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyB0ZXN0Q2xhc3NOYW1lLCBTdHJpbmcgdGVzdE1ldGhvZE5hbWUsCi0gICAgICAgICAgICBpbnQuLi4gdXNlcnMpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBmb3IgKGludCB1c2VyIDogdXNlcnMpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgInJ1bkRldmljZVRlc3RzICIgKyB0ZXN0TWV0aG9kTmFtZSArICIgdSIgKyB1c2VyKTsKLSAgICAgICAgICAgIFV0aWxzLnJ1bkRldmljZVRlc3RzKGdldERldmljZSgpLCBwYWNrYWdlTmFtZSwgdGVzdENsYXNzTmFtZSwgdGVzdE1ldGhvZE5hbWUsIHVzZXIpOwotICAgICAgICB9CisgICAgcHJpdmF0ZSB2b2lkIHJ1bkRldmljZVRlc3RzQXNDdXJyZW50VXNlcigKKyAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHRlc3RDbGFzc05hbWUsIFN0cmluZyB0ZXN0TWV0aG9kTmFtZSkKKyAgICAgICAgICAgICAgICB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKKyAgICAgICAgVXRpbHMucnVuRGV2aWNlVGVzdHNBc0N1cnJlbnRVc2VyKGdldERldmljZSgpLCBwYWNrYWdlTmFtZSwgdGVzdENsYXNzTmFtZSwgdGVzdE1ldGhvZE5hbWUpOwogICAgIH0KIAogICAgIHByaXZhdGUgU3RyaW5nIGdldEZiZU1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTIzNiwyMCArMjI5LDEyIEBACiAgICAgICAgIHJldHVybiAiMSIuZXF1YWxzKG91dHB1dCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhc1N5c3RlbUZlYXR1cmUoZmluYWwgU3RyaW5nIGZlYXR1cmUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAobUZlYXR1cmVMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIG1GZWF0dXJlTGlzdCA9IGdldERldmljZSgpLmV4ZWN1dGVTaGVsbENvbW1hbmQoInBtIGxpc3QgZmVhdHVyZXMiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtRmVhdHVyZUxpc3QuY29udGFpbnMoZmVhdHVyZSk7Ci0gICAgfQotCiAgICAgcHJpdmF0ZSBib29sZWFuIGlzU3VwcG9ydGVkRGV2aWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBoYXNTeXN0ZW1GZWF0dXJlKEZFQVRVUkVfREVWSUNFX0FETUlOKTsKKyAgICAgICAgcmV0dXJuIGdldERldmljZSgpLmhhc0ZlYXR1cmUoRkVBVFVSRV9ERVZJQ0VfQURNSU4pOwogICAgIH0KIAogICAgIHByaXZhdGUgYm9vbGVhbiBpc0F1dG9tb3RpdmVEZXZpY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGhhc1N5c3RlbUZlYXR1cmUoRkVBVFVSRV9BVVRPTU9USVZFKTsKKyAgICAgICAgcmV0dXJuIGdldERldmljZSgpLmhhc0ZlYXR1cmUoRkVBVFVSRV9BVVRPTU9USVZFKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgd2FpdEZvckJvb3RDb21wbGV0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTI2OSw3ICsyNTQsNyBAQAogCiAgICAgcHJpdmF0ZSBjbGFzcyBJbnN0YWxsTXVsdGlwbGUgZXh0ZW5kcyBCYXNlSW5zdGFsbE11bHRpcGxlPEluc3RhbGxNdWx0aXBsZT4gewogICAgICAgICBwdWJsaWMgSW5zdGFsbE11bHRpcGxlKCkgewotICAgICAgICAgICAgc3VwZXIoZ2V0RGV2aWNlKCksIG1DdHNCdWlsZCwgbUFiaSk7CisgICAgICAgICAgICBzdXBlcihnZXREZXZpY2UoKSwgZ2V0QnVpbGQoKSwgZ2V0QWJpKCkpOwogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9zcmMvYW5kcm9pZC9hcHBzZWN1cml0eS9jdHMvRG9jdW1lbnRzVGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9zcmMvYW5kcm9pZC9hcHBzZWN1cml0eS9jdHMvRG9jdW1lbnRzVGVzdC5qYXZhCmluZGV4IDZmM2I4Y2QuLjY1MzBlOTYgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvc3JjL2FuZHJvaWQvYXBwc2VjdXJpdHkvY3RzL0RvY3VtZW50c1Rlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3NyYy9hbmRyb2lkL2FwcHNlY3VyaXR5L2N0cy9Eb2N1bWVudHNUZXN0LmphdmEKQEAgLTE2LDEyICsxNiwxNCBAQAogCiBwYWNrYWdlIGFuZHJvaWQuYXBwc2VjdXJpdHkuY3RzOwogCitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLmJ1aWxkLkNvbXBhdGliaWxpdHlCdWlsZEhlbHBlcjsKIAogLyoqCiAgKiBTZXQgb2YgdGVzdHMgdGhhdCB2ZXJpZnkgYmVoYXZpb3Igb2YKICAqIHtAbGluayBhbmRyb2lkLnByb3ZpZGVyLkRvY3VtZW50c0NvbnRyYWN0fSBhbmQgcmVsYXRlZCBpbnRlbnRzLgogICovCitAQXBwTW9kZUZ1bGwgLy8gVE9ETzogTmVlZHMgcG9ydGluZyB0byBpbnN0YW50CiBwdWJsaWMgY2xhc3MgRG9jdW1lbnRzVGVzdCBleHRlbmRzIERvY3VtZW50c1Rlc3RDYXNlIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPVklERVJfUEtHID0gImNvbS5hbmRyb2lkLmN0cy5kb2N1bWVudHByb3ZpZGVyIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPVklERVJfQVBLID0gIkN0c0RvY3VtZW50UHJvdmlkZXIuYXBrIjsKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvc3JjL2FuZHJvaWQvYXBwc2VjdXJpdHkvY3RzL0RvY3VtZW50c1Rlc3RDYXNlLmphdmEgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3NyYy9hbmRyb2lkL2FwcHNlY3VyaXR5L2N0cy9Eb2N1bWVudHNUZXN0Q2FzZS5qYXZhCmluZGV4IDZlMDNjZGYuLjFhZjA2NTAgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvc3JjL2FuZHJvaWQvYXBwc2VjdXJpdHkvY3RzL0RvY3VtZW50c1Rlc3RDYXNlLmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9zcmMvYW5kcm9pZC9hcHBzZWN1cml0eS9jdHMvRG9jdW1lbnRzVGVzdENhc2UuamF2YQpAQCAtNjQsNyArNjQsOCBAQAogCiAgICAgcHVibGljIHZvaWQgcnVuRGV2aWNlVGVzdHMoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgdGVzdENsYXNzTmFtZSwgU3RyaW5nIHRlc3RNZXRob2ROYW1lKQogICAgICAgICAgICAgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFV0aWxzLnJ1bkRldmljZVRlc3RzKGdldERldmljZSgpLCBwYWNrYWdlTmFtZSwgdGVzdENsYXNzTmFtZSwgdGVzdE1ldGhvZE5hbWUpOworICAgICAgICBVdGlscy5ydW5EZXZpY2VUZXN0cyhnZXREZXZpY2UoKSwgcGFja2FnZU5hbWUsIHRlc3RDbGFzc05hbWUsIHRlc3RNZXRob2ROYW1lLAorICAgICAgICAgICAgICAgIGdldERldmljZSgpLmdldEN1cnJlbnRVc2VyKCkpOwogICAgIH0KIAogICAgIHByb3RlY3RlZCB2b2lkIHJlaW5zdGFsbENsaWVudFBhY2thZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvc3JjL2FuZHJvaWQvYXBwc2VjdXJpdHkvY3RzL0VwaGVtZXJhbFRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvc3JjL2FuZHJvaWQvYXBwc2VjdXJpdHkvY3RzL0VwaGVtZXJhbFRlc3QuamF2YQppbmRleCBhODMzZDczLi41MzhiYzAwIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3NyYy9hbmRyb2lkL2FwcHNlY3VyaXR5L2N0cy9FcGhlbWVyYWxUZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9zcmMvYW5kcm9pZC9hcHBzZWN1cml0eS9jdHMvRXBoZW1lcmFsVGVzdC5qYXZhCkBAIC0xNiw2ICsxNiw3IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5hcHBzZWN1cml0eS5jdHM7CiAKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQuYnVpbGQuQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmJ1aWxkLklCdWlsZEluZm87CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLkRldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKQEAgLTMwLDEyICszMSwxMCBAQAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNkZFRlc3Q7Ci0KIC8qKgogICogVGVzdHMgZm9yIGVwaGVtZXJhbCBwYWNrYWdlcy4KICAqLwotQENkZFRlc3QocmVxdWlyZW1lbnQ9IjMuMTUvQy0wLTEsQy0wLTIsQy0wLTMsQy0wLTQiKQorQEFwcE1vZGVGdWxsIC8vIEFscmVhZHkgaGFuZGxlcyBpbnN0YW50IGluc3RhbGxzIHdoZW4gbmVlZGVkLgogcHVibGljIGNsYXNzIEVwaGVtZXJhbFRlc3QgZXh0ZW5kcyBEZXZpY2VUZXN0Q2FzZQogICAgICAgICBpbXBsZW1lbnRzIElBYmlSZWNlaXZlciwgSUJ1aWxkUmVjZWl2ZXIgewogCkBAIC01OSw2ICs1OCwxMCBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVTkVYUE9TRURfQVBLID0gIkN0c0VwaGVtZXJhbFRlc3RzVW5leHBvc2VkQXBwLmFwayI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVORVhQT1NFRF9QS0cgPSAiY29tLmFuZHJvaWQuY3RzLnVuZXhwb3NlZGFwcCI7CiAKKyAgICAvLyBhbiBhcHBsaWNhdGlvbiB0aGF0IGdldHMgdXBncmFkZWQgZnJvbSAnaW5zdGFudCcgdG8gJ2Z1bGwnCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVQR1JBREVEX0FQSyA9ICJDdHNJbnN0YW50VXBncmFkZUFwcC5hcGsiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUEdSQURFRF9QS0cgPSAiY29tLmFuZHJvaWQuY3RzLmluc3RhbnR1cGdyYWRlYXBwIjsKKwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0NMQVNTID0gIi5DbGllbnRUZXN0IjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCVklFV19URVNUX0NMQVNTID0gIi5XZWJWaWV3VGVzdCI7CiAKQEAgLTExNyw5ICsxMjAsMTQgQEAKICAgICAgICAgbUJ1aWxkSW5mbyA9IGJ1aWxkSW5mbzsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBzdXBlci5zZXRVcCgpOwogCisgICAgICAgIGlmIChpc0RldmljZVVuc3VwcG9ydGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCiAgICAgICAgIFV0aWxzLnByZXBhcmVTaW5nbGVVc2VyKGdldERldmljZSgpKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChtQWJpKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChtQnVpbGRJbmZvKTsKQEAgLTEyOSw5NSArMTM3LDE0NiBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpc0RldmljZVVuc3VwcG9ydGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogICAgICAgICB1bmluc3RhbGxUZXN0UGFja2FnZXMoKTsKICAgICAgICAgc3VwZXIudGVhckRvd24oKTsKICAgICB9CiAKLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iMy4xNS9DLTAtMixDLTAtMyIpCiAgICAgcHVibGljIHZvaWQgdGVzdE5vcm1hbFF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpc0RldmljZVVuc3VwcG9ydGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogICAgICAgICBydW5EZXZpY2VUZXN0cyhOT1JNQUxfUEtHLCBURVNUX0NMQVNTLCAidGVzdFF1ZXJ5Iik7CiAgICAgfQogCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjMuMTUvQy0wLTIsQy0wLTMiKQogICAgIHB1YmxpYyB2b2lkIHRlc3ROb3JtYWxTdGFydE5vcm1hbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoaXNEZXZpY2VVbnN1cHBvcnRlZCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KICAgICAgICAgcnVuRGV2aWNlVGVzdHMoTk9STUFMX1BLRywgVEVTVF9DTEFTUywgInRlc3RTdGFydE5vcm1hbCIpOwogICAgIH0KIAotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSIzLjE1L0MtMC0yL0MtMC0zIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9ybWFsU3RhcnRFcGhlbWVyYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGlzRGV2aWNlVW5zdXBwb3J0ZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAgICAgICAgIHJ1bkRldmljZVRlc3RzKE5PUk1BTF9QS0csIFRFU1RfQ0xBU1MsICJ0ZXN0U3RhcnRFcGhlbWVyYWwiKTsKICAgICB9CiAKLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iMy4xNS9DLTAtMixDLTAtMyIpCiAgICAgcHVibGljIHZvaWQgdGVzdEVwaGVtZXJhbFF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpc0RldmljZVVuc3VwcG9ydGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogICAgICAgICBydW5EZXZpY2VUZXN0cyhFUEhFTUVSQUxfMV9QS0csIFRFU1RfQ0xBU1MsICJ0ZXN0UXVlcnkiKTsKICAgICB9CiAKLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iMy4xNS9DLTAtMixDLTAtMyIpCiAgICAgcHVibGljIHZvaWQgdGVzdEVwaGVtZXJhbFN0YXJ0Tm9ybWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpc0RldmljZVVuc3VwcG9ydGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogICAgICAgICBydW5EZXZpY2VUZXN0cyhFUEhFTUVSQUxfMV9QS0csIFRFU1RfQ0xBU1MsICJ0ZXN0U3RhcnROb3JtYWwiKTsKICAgICB9CiAKICAgICAvLyBlYWNoIGNvbm5lY3Rpb24gdG8gYW4gZXhwb3NlZCBjb21wb25lbnQgbmVlZHMgdG8gcnVuIGluIGl0cyBvd24gdGVzdCB0bwogICAgIC8vIGF2b2lkIHNoYXJpbmcgc3RhdGUuIG9uY2UgYW4gaW5zdGFudCBhcHAgaXMgZXhwb3NlZCB0byBhIGNvbXBvbmVudCwgaXQncwogICAgIC8vIGV4cG9zZWQgdW50aWwgdGhlIGRldmljZSByZXN0YXJ0cyBvciB0aGUgaW5zdGFudCBhcHAgaXMgcmVtb3ZlZC4KLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iMy4xNS9DLTAtMixDLTAtMyIpCiAgICAgcHVibGljIHZvaWQgdGVzdEVwaGVtZXJhbFN0YXJ0RXhwb3NlZDAxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpc0RldmljZVVuc3VwcG9ydGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogICAgICAgICBydW5EZXZpY2VUZXN0cyhFUEhFTUVSQUxfMV9QS0csIFRFU1RfQ0xBU1MsICJ0ZXN0U3RhcnRFeHBvc2VkMDEiKTsKICAgICB9Ci0KLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iMy4xNS9DLTAtMixDLTAtMyIpCiAgICAgcHVibGljIHZvaWQgdGVzdEVwaGVtZXJhbFN0YXJ0RXhwb3NlZDAyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpc0RldmljZVVuc3VwcG9ydGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogICAgICAgICBydW5EZXZpY2VUZXN0cyhFUEhFTUVSQUxfMV9QS0csIFRFU1RfQ0xBU1MsICJ0ZXN0U3RhcnRFeHBvc2VkMDIiKTsKICAgICB9Ci0KLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iMy4xNS9DLTAtMixDLTAtMyIpCiAgICAgcHVibGljIHZvaWQgdGVzdEVwaGVtZXJhbFN0YXJ0RXhwb3NlZDAzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpc0RldmljZVVuc3VwcG9ydGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogICAgICAgICBydW5EZXZpY2VUZXN0cyhFUEhFTUVSQUxfMV9QS0csIFRFU1RfQ0xBU1MsICJ0ZXN0U3RhcnRFeHBvc2VkMDMiKTsKICAgICB9Ci0KLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iMy4xNS9DLTAtMixDLTAtMyIpCiAgICAgcHVibGljIHZvaWQgdGVzdEVwaGVtZXJhbFN0YXJ0RXhwb3NlZDA0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpc0RldmljZVVuc3VwcG9ydGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogICAgICAgICBydW5EZXZpY2VUZXN0cyhFUEhFTUVSQUxfMV9QS0csIFRFU1RfQ0xBU1MsICJ0ZXN0U3RhcnRFeHBvc2VkMDQiKTsKICAgICB9Ci0KLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iMy4xNS9DLTAtMixDLTAtMyIpCiAgICAgcHVibGljIHZvaWQgdGVzdEVwaGVtZXJhbFN0YXJ0RXhwb3NlZDA1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpc0RldmljZVVuc3VwcG9ydGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogICAgICAgICBydW5EZXZpY2VUZXN0cyhFUEhFTUVSQUxfMV9QS0csIFRFU1RfQ0xBU1MsICJ0ZXN0U3RhcnRFeHBvc2VkMDUiKTsKICAgICB9Ci0KLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iQy0wLTIsQy0wLTMiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RFcGhlbWVyYWxTdGFydEV4cG9zZWQwNigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoaXNEZXZpY2VVbnN1cHBvcnRlZCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KICAgICAgICAgcnVuRGV2aWNlVGVzdHMoRVBIRU1FUkFMXzFfUEtHLCBURVNUX0NMQVNTLCAidGVzdFN0YXJ0RXhwb3NlZDA2Iik7CiAgICAgfQotCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IkMtMC0yLEMtMC0zIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0RXBoZW1lcmFsU3RhcnRFeHBvc2VkMDcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGlzRGV2aWNlVW5zdXBwb3J0ZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAgICAgICAgIHJ1bkRldmljZVRlc3RzKEVQSEVNRVJBTF8xX1BLRywgVEVTVF9DTEFTUywgInRlc3RTdGFydEV4cG9zZWQwNyIpOwogICAgIH0KLQotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSJDLTAtMixDLTAtMyIpCiAgICAgcHVibGljIHZvaWQgdGVzdEVwaGVtZXJhbFN0YXJ0RXhwb3NlZDA4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpc0RldmljZVVuc3VwcG9ydGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogICAgICAgICBydW5EZXZpY2VUZXN0cyhFUEhFTUVSQUxfMV9QS0csIFRFU1RfQ0xBU1MsICJ0ZXN0U3RhcnRFeHBvc2VkMDgiKTsKICAgICB9Ci0KLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iQy0wLTIsQy0wLTMiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RFcGhlbWVyYWxTdGFydEV4cG9zZWQwOSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoaXNEZXZpY2VVbnN1cHBvcnRlZCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KICAgICAgICAgcnVuRGV2aWNlVGVzdHMoRVBIRU1FUkFMXzFfUEtHLCBURVNUX0NMQVNTLCAidGVzdFN0YXJ0RXhwb3NlZDA5Iik7CiAgICAgfQotCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IkMtMC0yLEMtMC0zIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0RXBoZW1lcmFsU3RhcnRFeHBvc2VkMTAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGlzRGV2aWNlVW5zdXBwb3J0ZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAgICAgICAgIHJ1bkRldmljZVRlc3RzKEVQSEVNRVJBTF8xX1BLRywgVEVTVF9DTEFTUywgInRlc3RTdGFydEV4cG9zZWQxMCIpOwogICAgIH0KIAotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSIzLjE1L0MtMC0yLEMtMC0zIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0RXBoZW1lcmFsU3RhcnRFcGhlbWVyYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGlzRGV2aWNlVW5zdXBwb3J0ZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAgICAgICAgIHJ1bkRldmljZVRlc3RzKEVQSEVNRVJBTF8xX1BLRywgVEVTVF9DTEFTUywgInRlc3RTdGFydEVwaGVtZXJhbCIpOwogICAgIH0KIAotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSIzLjE1L0MtMC0zIikKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXBoZW1lcmFsR2V0SW5zdGFsbGVyMDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGlzRGV2aWNlVW5zdXBwb3J0ZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGluc3RhbGxFcGhlbWVyYWxBcHAoRVBIRU1FUkFMXzFfQVBLLCAiY29tLmFuZHJvaWQuY3RzLm5vcm1hbGFwcCIpOworICAgICAgICBydW5EZXZpY2VUZXN0cyhFUEhFTUVSQUxfMV9QS0csIFRFU1RfQ0xBU1MsICJ0ZXN0R2V0SW5zdGFsbGVyMDEiKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdEVwaGVtZXJhbEdldEluc3RhbGxlcjAyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpc0RldmljZVVuc3VwcG9ydGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpbnN0YWxsQXBwKE5PUk1BTF9BUEssICJjb20uYW5kcm9pZC5jdHMubm9ybWFsYXBwIik7CisgICAgICAgIGluc3RhbGxFcGhlbWVyYWxBcHAoRVBIRU1FUkFMXzFfQVBLLCAiY29tLmFuZHJvaWQuY3RzLm5vcm1hbGFwcCIpOworICAgICAgICBydW5EZXZpY2VUZXN0cyhFUEhFTUVSQUxfMV9QS0csIFRFU1RfQ0xBU1MsICJ0ZXN0R2V0SW5zdGFsbGVyMDIiKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdEVwaGVtZXJhbEdldEluc3RhbGxlcjAzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpc0RldmljZVVuc3VwcG9ydGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpbnN0YWxsQXBwKE5PUk1BTF9BUEssICJjb20uYW5kcm9pZC5jdHMubm9ybWFsYXBwIik7CisgICAgICAgIHJ1bkRldmljZVRlc3RzKEVQSEVNRVJBTF8xX1BLRywgVEVTVF9DTEFTUywgInRlc3RHZXRJbnN0YWxsZXIwMyIpOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHRlc3RFeHBvc2VkU3lzdGVtQWN0aXZpdGllcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoaXNEZXZpY2VVbnN1cHBvcnRlZCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KICAgICAgICAgZm9yIChNYXA8U3RyaW5nLCBTdHJpbmc+IHRlc3RBcmdzIDogRVhQRUNURURfRVhQT1NFRF9JTlRFTlRTKSB7CiAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGV4cG9zZWQgPSBpc0ludGVudEV4cG9zZWQodGVzdEFyZ3MpOwogICAgICAgICAgICAgaWYgKGV4cG9zZWQpIHsKQEAgLTIyOSwyOCArMjg4LDEzNSBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RCdWlsZFNlcmlhbFVua25vd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGlzRGV2aWNlVW5zdXBwb3J0ZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAgICAgICAgIHJ1bkRldmljZVRlc3RzKEVQSEVNRVJBTF8xX1BLRywgVEVTVF9DTEFTUywgInRlc3RCdWlsZFNlcmlhbFVua25vd24iKTsKICAgICB9CiAKLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iMy4xNS9DLTAtNCIpCiAgICAgcHVibGljIHZvaWQgdGVzdFBhY2thZ2VJbmZvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpc0RldmljZVVuc3VwcG9ydGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogICAgICAgICBydW5EZXZpY2VUZXN0cyhFUEhFTUVSQUxfMV9QS0csIFRFU1RfQ0xBU1MsICJ0ZXN0UGFja2FnZUluZm8iKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWN0aXZpdHlJbmZvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpc0RldmljZVVuc3VwcG9ydGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBydW5EZXZpY2VUZXN0cyhFUEhFTUVSQUxfMV9QS0csIFRFU1RfQ0xBU1MsICJ0ZXN0QWN0aXZpdHlJbmZvIik7CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgdGVzdFdlYlZpZXdMb2FkcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoaXNEZXZpY2VVbnN1cHBvcnRlZCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KICAgICAgICAgcnVuRGV2aWNlVGVzdHMoRVBIRU1FUkFMXzFfUEtHLCBXRUJWSUVXX1RFU1RfQ0xBU1MsICJ0ZXN0V2ViVmlld0xvYWRzIik7CiAgICAgfQogCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjMuMTUvQy0wLTEiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsUGVybWlzc2lvbk5vdEdyYW50ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGlzRGV2aWNlVW5zdXBwb3J0ZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAgICAgICAgIHJ1bkRldmljZVRlc3RzKEVQSEVNRVJBTF8xX1BLRywgVEVTVF9DTEFTUywgInRlc3RJbnN0YWxsUGVybWlzc2lvbk5vdEdyYW50ZWQiKTsKICAgICB9CiAKLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iMy4xNS9DLTAtMSIpCiAgICAgcHVibGljIHZvaWQgdGVzdEluc3RhbGxQZXJtaXNzaW9uR3JhbnRlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoaXNEZXZpY2VVbnN1cHBvcnRlZCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KICAgICAgICAgcnVuRGV2aWNlVGVzdHMoRVBIRU1FUkFMXzFfUEtHLCBURVNUX0NMQVNTLCAidGVzdEluc3RhbGxQZXJtaXNzaW9uR3JhbnRlZCIpOwogICAgIH0KIAorICAgIC8qKiBUZXN0IGZvciBhbmRyb2lkLnBlcm1pc3Npb24uSU5TVEFOVF9BUFBfRk9SRUdST1VORF9TRVJWSUNFICovCisgICAgcHVibGljIHZvaWQgdGVzdFN0YXJ0Rm9yZWdyb25kU2VydmljZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoaXNEZXZpY2VVbnN1cHBvcnRlZCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSB0ZXN0IHBhY2thZ2UgZG9lcyBub3QgaGF2ZSBJTlNUQU5UX0FQUF9GT1JFR1JPVU5EX1NFUlZJQ0UKKyAgICAgICAgZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZCgiY21kIHBhY2thZ2UgcmV2b2tlICIgKyBFUEhFTUVSQUxfMV9QS0cKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBhbmRyb2lkLnBlcm1pc3Npb24uSU5TVEFOVF9BUFBfRk9SRUdST1VORF9TRVJWSUNFIik7CisgICAgICAgIHJ1bkRldmljZVRlc3RzKEVQSEVNRVJBTF8xX1BLRywgVEVTVF9DTEFTUywgInRlc3RTdGFydEZvcmVncm91bmRTZXJ2aWNlIik7CisgICAgfQorCisgICAgLyoqIFRlc3QgZm9yIGFuZHJvaWQucGVybWlzc2lvbi5SRUNPUkRfQVVESU8gKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVjb3JkQXVkaW9QZXJtaXNzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpc0RldmljZVVuc3VwcG9ydGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBydW5EZXZpY2VUZXN0cyhFUEhFTUVSQUxfMV9QS0csIFRFU1RfQ0xBU1MsICJ0ZXN0UmVjb3JkQXVkaW9QZXJtaXNzaW9uIik7CisgICAgfQorCisgICAgLyoqIFRlc3QgZm9yIGFuZHJvaWQucGVybWlzc2lvbi5DQU1FUkEgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FtZXJhUGVybWlzc2lvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoaXNEZXZpY2VVbnN1cHBvcnRlZCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgcnVuRGV2aWNlVGVzdHMoRVBIRU1FUkFMXzFfUEtHLCBURVNUX0NMQVNTLCAidGVzdENhbWVyYVBlcm1pc3Npb24iKTsKKyAgICB9CisKKyAgICAvKiogVGVzdCBmb3IgYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfUEhPTkVfTlVNQkVSUyAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkUGhvbmVOdW1iZXJzUGVybWlzc2lvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoaXNEZXZpY2VVbnN1cHBvcnRlZCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgcnVuRGV2aWNlVGVzdHMoRVBIRU1FUkFMXzFfUEtHLCBURVNUX0NMQVNTLCAidGVzdFJlYWRQaG9uZU51bWJlcnNQZXJtaXNzaW9uIik7CisgICAgfQorCisgICAgLyoqIFRlc3QgZm9yIGFuZHJvaWQucGVybWlzc2lvbi5BQ0NFU1NfQ09BUlNFX0xPQ0FUSU9OICovCisgICAgcHVibGljIHZvaWQgdGVzdEFjY2Vzc0NvYXJzZUxvY2F0aW9uUGVybWlzc2lvbigpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBpZiAoaXNEZXZpY2VVbnN1cHBvcnRlZCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgcnVuRGV2aWNlVGVzdHMoRVBIRU1FUkFMXzFfUEtHLCBURVNUX0NMQVNTLCAidGVzdEFjY2Vzc0NvYXJzZUxvY2F0aW9uUGVybWlzc2lvbiIpOworICAgIH0KKworICAgIC8qKiBUZXN0IGZvciBhbmRyb2lkLnBlcm1pc3Npb24uTkVUV09SSyAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnRlcm5ldFBlcm1pc3Npb24oKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgaWYgKGlzRGV2aWNlVW5zdXBwb3J0ZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHJ1bkRldmljZVRlc3RzKEVQSEVNRVJBTF8xX1BLRywgVEVTVF9DTEFTUywgInRlc3RJbnRlcm5ldFBlcm1pc3Npb24iKTsKKyAgICB9CisKKyAgICAvKiogVGVzdCBmb3IgYW5kcm9pZC5wZXJtaXNzaW9uLlZJQlJBVEUgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmlicmF0ZVBlcm1pc3Npb24oKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgaWYgKGlzRGV2aWNlVW5zdXBwb3J0ZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHJ1bkRldmljZVRlc3RzKEVQSEVNRVJBTF8xX1BLRywgVEVTVF9DTEFTUywgInRlc3RWaWJyYXRlUGVybWlzc2lvbiIpOworICAgIH0KKworICAgIC8qKiBUZXN0IGZvciBhbmRyb2lkLnBlcm1pc3Npb24uV0FLRV9MT0NLICovCisgICAgcHVibGljIHZvaWQgdGVzdFdha2VMb2NrUGVybWlzc2lvbigpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBpZiAoaXNEZXZpY2VVbnN1cHBvcnRlZCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgcnVuRGV2aWNlVGVzdHMoRVBIRU1FUkFMXzFfUEtHLCBURVNUX0NMQVNTLCAidGVzdFdha2VMb2NrUGVybWlzc2lvbiIpOworICAgIH0KKworICAgIC8qKiBUZXN0IGZvciBzZWFyY2ggbWFuYWdlciAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTZWFyY2hhYmxlSW5mbygpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBpZiAoaXNEZXZpY2VVbnN1cHBvcnRlZCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgcnVuRGV2aWNlVGVzdHMoRVBIRU1FUkFMXzFfUEtHLCBURVNUX0NMQVNTLCAidGVzdEdldFNlYXJjaGFibGVJbmZvIik7CisgICAgfQorCisgICAgLyoqIFRlc3QgZm9yIHVwZ3JhZGUgZnJvbSBpbnN0YW50IC0tPiBmdWxsICovCisgICAgcHVibGljIHZvaWQgdGVzdEluc3RhbnRBcHBVcGdyYWRlKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGlmIChpc0RldmljZVVuc3VwcG9ydGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpbnN0YWxsRXBoZW1lcmFsQXBwKFVQR1JBREVEX0FQSyk7CisgICAgICAgIHJ1bkRldmljZVRlc3RzKFVQR1JBREVEX1BLRywgVEVTVF9DTEFTUywgInRlc3RJbnN0YW50QXBwbGljYXRpb25Xcml0ZVByZWZlcmVuY2VzIik7CisgICAgICAgIHJ1bkRldmljZVRlc3RzKFVQR1JBREVEX1BLRywgVEVTVF9DTEFTUywgInRlc3RJbnN0YW50QXBwbGljYXRpb25Xcml0ZUZpbGUiKTsKKyAgICAgICAgaW5zdGFsbEZ1bGxBcHAoVVBHUkFERURfQVBLKTsKKyAgICAgICAgcnVuRGV2aWNlVGVzdHMoVVBHUkFERURfUEtHLCBURVNUX0NMQVNTLCAidGVzdEZ1bGxBcHBsaWNhdGlvblJlYWRQcmVmZXJlbmNlcyIpOworICAgICAgICBydW5EZXZpY2VUZXN0cyhVUEdSQURFRF9QS0csIFRFU1RfQ0xBU1MsICJ0ZXN0RnVsbEFwcGxpY2F0aW9uUmVhZEZpbGUiKTsKKyAgICB9CisKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBtYWtlQXJncygKICAgICAgICAgICAgIFN0cmluZyBhY3Rpb24sIFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1pbWVUeXBlKSB7CiAgICAgICAgIGlmIChhY3Rpb24gPT0gbnVsbCB8fCBhY3Rpb24ubGVuZ3RoKCkgPT0gMCkgewpAQCAtMjY3LDYgKzQzMywxOSBAQAogICAgICAgICByZXR1cm4gdGVzdEFyZ3M7CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gc1Vuc3VwcG9ydGVkRmVhdHVyZXMgPSB7CisgICAgICAgICAgICAiZmVhdHVyZTphbmRyb2lkLmhhcmR3YXJlLnR5cGUud2F0Y2giLAorICAgICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUudHlwZS5lbWJlZGRlZCIsCisgICAgfTsKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNEZXZpY2VVbnN1cHBvcnRlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmb3IgKFN0cmluZyB1bnN1cHBvcnRlZEZlYXR1cmUgOiBzVW5zdXBwb3J0ZWRGZWF0dXJlcykgeworICAgICAgICAgICAgaWYgKGdldERldmljZSgpLmhhc0ZlYXR1cmUodW5zdXBwb3J0ZWRGZWF0dXJlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKICAgICBwcml2YXRlIGJvb2xlYW4gaXNJbnRlbnRFeHBvc2VkKE1hcDxTdHJpbmcsIFN0cmluZz4gdGVzdEFyZ3MpCiAgICAgICAgICAgICB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgU3RyaW5nQnVmZmVyIGNvbW1hbmQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CkBAIC0yOTYsMTIgKzQ3NSwxNCBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIHJ1bkRldmljZVRlc3RzKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHRlc3RDbGFzc05hbWUsIFN0cmluZyB0ZXN0TWV0aG9kTmFtZSkKICAgICAgICAgICAgIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBVdGlscy5ydW5EZXZpY2VUZXN0cyhnZXREZXZpY2UoKSwgcGFja2FnZU5hbWUsIHRlc3RDbGFzc05hbWUsIHRlc3RNZXRob2ROYW1lKTsKKyAgICAgICAgVXRpbHMucnVuRGV2aWNlVGVzdHMoZ2V0RGV2aWNlKCksIHBhY2thZ2VOYW1lLCB0ZXN0Q2xhc3NOYW1lLCB0ZXN0TWV0aG9kTmFtZSwKKyAgICAgICAgICAgICAgICBnZXREZXZpY2UoKS5nZXRDdXJyZW50VXNlcigpKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgcnVuRGV2aWNlVGVzdHMoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgdGVzdENsYXNzTmFtZSwgU3RyaW5nIHRlc3RNZXRob2ROYW1lLAogICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiB0ZXN0QXJncykgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFV0aWxzLnJ1bkRldmljZVRlc3RzKGdldERldmljZSgpLCBwYWNrYWdlTmFtZSwgdGVzdENsYXNzTmFtZSwgdGVzdE1ldGhvZE5hbWUsIHRlc3RBcmdzKTsKKyAgICAgICAgVXRpbHMucnVuRGV2aWNlVGVzdHMoZ2V0RGV2aWNlKCksIHBhY2thZ2VOYW1lLCB0ZXN0Q2xhc3NOYW1lLCB0ZXN0TWV0aG9kTmFtZSwKKyAgICAgICAgICAgICAgICBnZXREZXZpY2UoKS5nZXRDdXJyZW50VXNlcigpLCB0ZXN0QXJncyk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGluc3RhbGxBcHAoU3RyaW5nIGFwaykgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0zMDksMTEgKzQ5MCwyOCBAQAogICAgICAgICBhc3NlcnROdWxsKGdldERldmljZSgpLmluc3RhbGxQYWNrYWdlKGJ1aWxkSGVscGVyLmdldFRlc3RGaWxlKGFwayksIGZhbHNlKSk7CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIGluc3RhbGxBcHAoU3RyaW5nIGFwaywgU3RyaW5nIGluc3RhbGxlcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENvbXBhdGliaWxpdHlCdWlsZEhlbHBlciBidWlsZEhlbHBlciA9IG5ldyBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIobUJ1aWxkSW5mbyk7CisgICAgICAgIGFzc2VydE51bGwoZ2V0RGV2aWNlKCkuaW5zdGFsbFBhY2thZ2UoYnVpbGRIZWxwZXIuZ2V0VGVzdEZpbGUoYXBrKSwgZmFsc2UsCisgICAgICAgICAgICAgICAgIi1pIiwgaW5zdGFsbGVyKSk7CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIGluc3RhbGxFcGhlbWVyYWxBcHAoU3RyaW5nIGFwaykgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIENvbXBhdGliaWxpdHlCdWlsZEhlbHBlciBidWlsZEhlbHBlciA9IG5ldyBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIobUJ1aWxkSW5mbyk7CiAgICAgICAgIGFzc2VydE51bGwoZ2V0RGV2aWNlKCkuaW5zdGFsbFBhY2thZ2UoYnVpbGRIZWxwZXIuZ2V0VGVzdEZpbGUoYXBrKSwgZmFsc2UsICItLWVwaGVtZXJhbCIpKTsKICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgaW5zdGFsbEVwaGVtZXJhbEFwcChTdHJpbmcgYXBrLCBTdHJpbmcgaW5zdGFsbGVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyIGJ1aWxkSGVscGVyID0gbmV3IENvbXBhdGliaWxpdHlCdWlsZEhlbHBlcihtQnVpbGRJbmZvKTsKKyAgICAgICAgYXNzZXJ0TnVsbChnZXREZXZpY2UoKS5pbnN0YWxsUGFja2FnZShidWlsZEhlbHBlci5nZXRUZXN0RmlsZShhcGspLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAiLS1lcGhlbWVyYWwiLCAiLWkiLCBpbnN0YWxsZXIpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5zdGFsbEZ1bGxBcHAoU3RyaW5nIGFwaykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENvbXBhdGliaWxpdHlCdWlsZEhlbHBlciBidWlsZEhlbHBlciA9IG5ldyBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIobUJ1aWxkSW5mbyk7CisgICAgICAgIGFzc2VydE51bGwoZ2V0RGV2aWNlKCkuaW5zdGFsbFBhY2thZ2UoYnVpbGRIZWxwZXIuZ2V0VGVzdEZpbGUoYXBrKSwgdHJ1ZSwgIi0tZnVsbCIpKTsKKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgaW5zdGFsbFRlc3RQYWNrYWdlcygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBpbnN0YWxsQXBwKE5PUk1BTF9BUEspOwogICAgICAgICBpbnN0YWxsQXBwKFVORVhQT1NFRF9BUEspOwpAQCAtMzI4LDUgKzUyNiw2IEBACiAgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoSU1QTElDSVRfUEtHKTsKICAgICAgICAgZ2V0RGV2aWNlKCkudW5pbnN0YWxsUGFja2FnZShFUEhFTUVSQUxfMV9QS0cpOwogICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKEVQSEVNRVJBTF8yX1BLRyk7CisgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoVVBHUkFERURfUEtHKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3NyYy9hbmRyb2lkL2FwcHNlY3VyaXR5L2N0cy9FeHRlcm5hbFN0b3JhZ2VIb3N0VGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9zcmMvYW5kcm9pZC9hcHBzZWN1cml0eS9jdHMvRXh0ZXJuYWxTdG9yYWdlSG9zdFRlc3QuamF2YQppbmRleCBiOTcxMmExLi5jMmEwNTMxIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3NyYy9hbmRyb2lkL2FwcHNlY3VyaXR5L2N0cy9FeHRlcm5hbFN0b3JhZ2VIb3N0VGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvc3JjL2FuZHJvaWQvYXBwc2VjdXJpdHkvY3RzL0V4dGVybmFsU3RvcmFnZUhvc3RUZXN0LmphdmEKQEAgLTE2LDI0ICsxNiwzMyBAQAogCiBwYWNrYWdlIGFuZHJvaWQuYXBwc2VjdXJpdHkuY3RzOwogCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQuYnVpbGQuQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5Mb2c7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuYnVpbGQuSUJ1aWxkSW5mbzsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkRldmljZVRlc3RDYXNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLklBYmk7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSUFiaVJlY2VpdmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLklCdWlsZFJlY2VpdmVyOworaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkRldmljZUpVbml0NENsYXNzUnVubmVyOworaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLmp1bml0NC5CYXNlSG9zdEpVbml0NFRlc3Q7CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudXRpbC5BYmlVdGlsczsKIAoraW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIC8qKgogICogU2V0IG9mIHRlc3RzIHRoYXQgdmVyaWZ5IGJlaGF2aW9yIG9mIGV4dGVybmFsIHN0b3JhZ2UgZGV2aWNlcy4KICAqLwotcHVibGljIGNsYXNzIEV4dGVybmFsU3RvcmFnZUhvc3RUZXN0IGV4dGVuZHMgRGV2aWNlVGVzdENhc2UKLSAgICAgICAgaW1wbGVtZW50cyBJQWJpUmVjZWl2ZXIsIElCdWlsZFJlY2VpdmVyIHsKK0BSdW5XaXRoKERldmljZUpVbml0NENsYXNzUnVubmVyLmNsYXNzKQorcHVibGljIGNsYXNzIEV4dGVybmFsU3RvcmFnZUhvc3RUZXN0IGV4dGVuZHMgQmFzZUhvc3RKVW5pdDRUZXN0IHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkV4dGVybmFsU3RvcmFnZUhvc3RUZXN0IjsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NT05fQ0xBU1MgPQpAQCAtNDEsNTkgKzUwLDQyIEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ORV9BUEsgPSAiQ3RzRXh0ZXJuYWxTdG9yYWdlQXBwLmFwayI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PTkVfUEtHID0gImNvbS5hbmRyb2lkLmN0cy5leHRlcm5hbHN0b3JhZ2VhcHAiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT05FX0NMQVNTID0gIi5FeHRlcm5hbFN0b3JhZ2VUZXN0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ORV9DTEFTUyA9IE5PTkVfUEtHICsgIi5FeHRlcm5hbFN0b3JhZ2VUZXN0IjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVBRF9BUEsgPSAiQ3RzUmVhZEV4dGVybmFsU3RvcmFnZUFwcC5hcGsiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUFEX1BLRyA9ICJjb20uYW5kcm9pZC5jdHMucmVhZGV4dGVybmFsc3RvcmFnZWFwcCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQURfQ0xBU1MgPSAiLlJlYWRFeHRlcm5hbFN0b3JhZ2VUZXN0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVBRF9DTEFTUyA9IFJFQURfUEtHICsgIi5SZWFkRXh0ZXJuYWxTdG9yYWdlVGVzdCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdSSVRFX0FQSyA9ICJDdHNXcml0ZUV4dGVybmFsU3RvcmFnZUFwcC5hcGsiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXUklURV9QS0cgPSAiY29tLmFuZHJvaWQuY3RzLndyaXRlZXh0ZXJuYWxzdG9yYWdlYXBwIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1JJVEVfQ0xBU1MgPSAiLldyaXRlRXh0ZXJuYWxTdG9yYWdlVGVzdCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdSSVRFX0NMQVNTID0gV1JJVEVfUEtHICsgIi5Xcml0ZUV4dGVybmFsU3RvcmFnZVRlc3QiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNVUxUSVVTRVJfQVBLID0gIkN0c011bHRpVXNlclN0b3JhZ2VBcHAuYXBrIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVVMVElVU0VSX1BLRyA9ICJjb20uYW5kcm9pZC5jdHMubXVsdGl1c2Vyc3RvcmFnZWFwcCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1VTFRJVVNFUl9DTEFTUyA9ICIuTXVsdGlVc2VyU3RvcmFnZVRlc3QiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNVUxUSVVTRVJfQ0xBU1MgPSBNVUxUSVVTRVJfUEtHICsgIi5NdWx0aVVzZXJTdG9yYWdlVGVzdCI7CiAKICAgICBwcml2YXRlIGludFtdIG1Vc2VyczsKLSAgICBwcml2YXRlIElBYmkgbUFiaTsKLSAgICBwcml2YXRlIElCdWlsZEluZm8gbUN0c0J1aWxkOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0QWJpKElBYmkgYWJpKSB7Ci0gICAgICAgIG1BYmkgPSBhYmk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0QnVpbGQoSUJ1aWxkSW5mbyBidWlsZEluZm8pIHsKLSAgICAgICAgbUN0c0J1aWxkID0gYnVpbGRJbmZvOwotICAgIH0KIAogICAgIHByaXZhdGUgRmlsZSBnZXRUZXN0QXBwRmlsZShTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIgYnVpbGRIZWxwZXIgPSBuZXcgQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyKG1DdHNCdWlsZCk7CisgICAgICAgIENvbXBhdGliaWxpdHlCdWlsZEhlbHBlciBidWlsZEhlbHBlciA9IG5ldyBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIoZ2V0QnVpbGQoKSk7CiAgICAgICAgIHJldHVybiBidWlsZEhlbHBlci5nZXRUZXN0RmlsZShmaWxlTmFtZSk7CiAgICAgfQogCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLQorICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBtVXNlcnMgPSBVdGlscy5wcmVwYXJlTXVsdGlwbGVVc2VycyhnZXREZXZpY2UoKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwobUFiaSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwobUN0c0J1aWxkKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgICAgICBhc3NlcnROb3ROdWxsKGdldEFiaSgpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChnZXRCdWlsZCgpKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBWZXJpZnkgdGhhdCBhcHAgd2l0aCBubyBleHRlcm5hbCBzdG9yYWdlIHBlcm1pc3Npb25zIHdvcmtzIGNvcnJlY3RseS4KICAgICAgKi8KKyAgICBAVGVzdAorICAgIEBBcHBNb2RlRnVsbCAvLyBUT0RPOiBOZWVkcyBwb3J0aW5nIHRvIGluc3RhbnQKICAgICBwdWJsaWMgdm9pZCB0ZXN0RXh0ZXJuYWxTdG9yYWdlTm9uZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICB0cnkgewogICAgICAgICAgICAgd2lwZVByaW1hcnlFeHRlcm5hbFN0b3JhZ2UoKTsKIAogICAgICAgICAgICAgZ2V0RGV2aWNlKCkudW5pbnN0YWxsUGFja2FnZShOT05FX1BLRyk7Ci0gICAgICAgICAgICBTdHJpbmdbXSBvcHRpb25zID0ge0FiaVV0aWxzLmNyZWF0ZUFiaUZsYWcobUFiaS5nZXROYW1lKCkpfTsKKyAgICAgICAgICAgIFN0cmluZ1tdIG9wdGlvbnMgPSB7QWJpVXRpbHMuY3JlYXRlQWJpRmxhZyhnZXRBYmkoKS5nZXROYW1lKCkpfTsKICAgICAgICAgICAgIGFzc2VydE51bGwoZ2V0RGV2aWNlKCkuaW5zdGFsbFBhY2thZ2UoZ2V0VGVzdEFwcEZpbGUoTk9ORV9BUEspLCBmYWxzZSwgb3B0aW9ucykpOwogCiAgICAgICAgICAgICBmb3IgKGludCB1c2VyIDogbVVzZXJzKSB7CkBAIC0xMTAsMTIgKzEwMiwxNCBAQAogICAgICAqIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jUkVBRF9FWFRFUk5BTF9TVE9SQUdFfSB3b3JrcwogICAgICAqIGNvcnJlY3RseS4KICAgICAgKi8KKyAgICBAVGVzdAorICAgIEBBcHBNb2RlRnVsbCAvLyBUT0RPOiBOZWVkcyBwb3J0aW5nIHRvIGluc3RhbnQKICAgICBwdWJsaWMgdm9pZCB0ZXN0RXh0ZXJuYWxTdG9yYWdlUmVhZCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICB0cnkgewogICAgICAgICAgICAgd2lwZVByaW1hcnlFeHRlcm5hbFN0b3JhZ2UoKTsKIAogICAgICAgICAgICAgZ2V0RGV2aWNlKCkudW5pbnN0YWxsUGFja2FnZShSRUFEX1BLRyk7Ci0gICAgICAgICAgICBTdHJpbmdbXSBvcHRpb25zID0ge0FiaVV0aWxzLmNyZWF0ZUFiaUZsYWcobUFiaS5nZXROYW1lKCkpfTsKKyAgICAgICAgICAgIFN0cmluZ1tdIG9wdGlvbnMgPSB7QWJpVXRpbHMuY3JlYXRlQWJpRmxhZyhnZXRBYmkoKS5nZXROYW1lKCkpfTsKICAgICAgICAgICAgIGFzc2VydE51bGwoZ2V0RGV2aWNlKCkuaW5zdGFsbFBhY2thZ2UoZ2V0VGVzdEFwcEZpbGUoUkVBRF9BUEspLCBmYWxzZSwgb3B0aW9ucykpOwogCiAgICAgICAgICAgICBmb3IgKGludCB1c2VyIDogbVVzZXJzKSB7CkBAIC0xMzIsMTIgKzEyNiwxNCBAQAogICAgICAqIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jV1JJVEVfRVhURVJOQUxfU1RPUkFHRX0gd29ya3MKICAgICAgKiBjb3JyZWN0bHkuCiAgICAgICovCisgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gVE9ETzogTmVlZHMgcG9ydGluZyB0byBpbnN0YW50CiAgICAgcHVibGljIHZvaWQgdGVzdEV4dGVybmFsU3RvcmFnZVdyaXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICB3aXBlUHJpbWFyeUV4dGVybmFsU3RvcmFnZSgpOwogCiAgICAgICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKFdSSVRFX1BLRyk7Ci0gICAgICAgICAgICBTdHJpbmdbXSBvcHRpb25zID0ge0FiaVV0aWxzLmNyZWF0ZUFiaUZsYWcobUFiaS5nZXROYW1lKCkpfTsKKyAgICAgICAgICAgIFN0cmluZ1tdIG9wdGlvbnMgPSB7QWJpVXRpbHMuY3JlYXRlQWJpRmxhZyhnZXRBYmkoKS5nZXROYW1lKCkpfTsKICAgICAgICAgICAgIGFzc2VydE51bGwoZ2V0RGV2aWNlKCkuaW5zdGFsbFBhY2thZ2UoZ2V0VGVzdEFwcEZpbGUoV1JJVEVfQVBLKSwgZmFsc2UsIG9wdGlvbnMpKTsKIAogICAgICAgICAgICAgZm9yIChpbnQgdXNlciA6IG1Vc2VycykgewpAQCAtMTUzLDYgKzE0OSw4IEBACiAgICAgICogVmVyaWZ5IHRoYXQgYXBwIHdpdGggV1JJVEVfRVhURVJOQUwgY2FuIGxlYXZlIGdpZnRzIGluIGV4dGVybmFsIHN0b3JhZ2UKICAgICAgKiBkaXJlY3RvcmllcyBiZWxvbmdpbmcgdG8gb3RoZXIgYXBwcywgYW5kIHRob3NlIGFwcHMgY2FuIHJlYWQuCiAgICAgICovCisgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gVE9ETzogTmVlZHMgcG9ydGluZyB0byBpbnN0YW50CiAgICAgcHVibGljIHZvaWQgdGVzdEV4dGVybmFsU3RvcmFnZUdpZnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICB3aXBlUHJpbWFyeUV4dGVybmFsU3RvcmFnZSgpOwpAQCAtMTYwLDIwICsxNTgsMjAgQEAKICAgICAgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoTk9ORV9QS0cpOwogICAgICAgICAgICAgZ2V0RGV2aWNlKCkudW5pbnN0YWxsUGFja2FnZShSRUFEX1BLRyk7CiAgICAgICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKFdSSVRFX1BLRyk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBvcHRpb25zID0ge0FiaVV0aWxzLmNyZWF0ZUFiaUZsYWcobUFiaS5nZXROYW1lKCkpfTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIG9wdGlvbnMgPSB7QWJpVXRpbHMuY3JlYXRlQWJpRmxhZyhnZXRBYmkoKS5nZXROYW1lKCkpfTsKIAogICAgICAgICAgICAgLy8gV2UgcHVycG9zZWZ1bGx5IGRlbGF5IHRoZSBpbnN0YWxsYXRpb24gb2YgdGhlIHJlYWRpbmcgYXBwcyB0bwogICAgICAgICAgICAgLy8gdmVyaWZ5IHRoYXQgdGhlIGRhZW1vbiBjb3JyZWN0bHkgaW52YWxpZGF0ZXMgYW55IGNhY2hlcy4KICAgICAgICAgICAgIGFzc2VydE51bGwoZ2V0RGV2aWNlKCkuaW5zdGFsbFBhY2thZ2UoZ2V0VGVzdEFwcEZpbGUoV1JJVEVfQVBLKSwgZmFsc2UsIG9wdGlvbnMpKTsKICAgICAgICAgICAgIGZvciAoaW50IHVzZXIgOiBtVXNlcnMpIHsKLSAgICAgICAgICAgICAgICBydW5EZXZpY2VUZXN0cyhXUklURV9QS0csICIuV3JpdGVHaWZ0VGVzdCIsIHVzZXIpOworICAgICAgICAgICAgICAgIHJ1bkRldmljZVRlc3RzKFdSSVRFX1BLRywgV1JJVEVfUEtHICsgIi5Xcml0ZUdpZnRUZXN0IiwgdXNlcik7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGFzc2VydE51bGwoZ2V0RGV2aWNlKCkuaW5zdGFsbFBhY2thZ2UoZ2V0VGVzdEFwcEZpbGUoTk9ORV9BUEspLCBmYWxzZSwgb3B0aW9ucykpOwogICAgICAgICAgICAgYXNzZXJ0TnVsbChnZXREZXZpY2UoKS5pbnN0YWxsUGFja2FnZShnZXRUZXN0QXBwRmlsZShSRUFEX0FQSyksIGZhbHNlLCBvcHRpb25zKSk7CiAgICAgICAgICAgICBmb3IgKGludCB1c2VyIDogbVVzZXJzKSB7Ci0gICAgICAgICAgICAgICAgcnVuRGV2aWNlVGVzdHMoUkVBRF9QS0csICIuUmVhZEdpZnRUZXN0IiwgdXNlcik7Ci0gICAgICAgICAgICAgICAgcnVuRGV2aWNlVGVzdHMoTk9ORV9QS0csICIuR2lmdFRlc3QiLCB1c2VyKTsKKyAgICAgICAgICAgICAgICBydW5EZXZpY2VUZXN0cyhSRUFEX1BLRywgUkVBRF9QS0cgKyAiLlJlYWRHaWZ0VGVzdCIsIHVzZXIpOworICAgICAgICAgICAgICAgIHJ1bkRldmljZVRlc3RzKE5PTkVfUEtHLCBOT05FX1BLRyArICIuR2lmdFRlc3QiLCB1c2VyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoTk9ORV9QS0cpOwpAQCAtMTg2LDYgKzE4NCw4IEBACiAgICAgICogVGVzdCBtdWx0aS11c2VyIGVtdWxhdGVkIHN0b3JhZ2UgZW52aXJvbm1lbnQsIGVuc3VyaW5nIHRoYXQgZWFjaCB1c2VyIGhhcwogICAgICAqIGlzb2xhdGVkIHN0b3JhZ2UuCiAgICAgICovCisgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gVE9ETzogTmVlZHMgcG9ydGluZyB0byBpbnN0YW50CiAgICAgcHVibGljIHZvaWQgdGVzdE11bHRpVXNlclN0b3JhZ2VJc29sYXRlZCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICB0cnkgewogICAgICAgICAgICAgaWYgKG1Vc2Vycy5sZW5ndGggPT0gMSkgewpAQCAtMTk4LDcgKzE5OCw3IEBACiAKICAgICAgICAgICAgIC8vIEluc3RhbGwgb3VyIHRlc3QgYXBwCiAgICAgICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKE1VTFRJVVNFUl9QS0cpOwotICAgICAgICAgICAgU3RyaW5nW10gb3B0aW9ucyA9IHtBYmlVdGlscy5jcmVhdGVBYmlGbGFnKG1BYmkuZ2V0TmFtZSgpKX07CisgICAgICAgICAgICBTdHJpbmdbXSBvcHRpb25zID0ge0FiaVV0aWxzLmNyZWF0ZUFiaUZsYWcoZ2V0QWJpKCkuZ2V0TmFtZSgpKX07CiAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaW5zdGFsbFJlc3VsdCA9IGdldERldmljZSgpCiAgICAgICAgICAgICAgICAgICAgIC5pbnN0YWxsUGFja2FnZShnZXRUZXN0QXBwRmlsZShNVUxUSVVTRVJfQVBLKSwgZmFsc2UsIG9wdGlvbnMpOwogICAgICAgICAgICAgYXNzZXJ0TnVsbCgiRmFpbGVkIHRvIGluc3RhbGw6ICIgKyBpbnN0YWxsUmVzdWx0LCBpbnN0YWxsUmVzdWx0KTsKQEAgLTIzMSw2ICsyMzEsOCBAQAogICAgICAqIFRlc3QgdGhhdCBhcHBzIHdpdGggcmVhZCBwZXJtaXNzaW9ucyBzZWUgdGhlIGFwcHJvcHJpYXRlIHBlcm1pc3Npb25zCiAgICAgICogd2hlbiBhcHBzIHdpdGggci93IHBlcm1pc3Npb24gbGV2ZWxzIG1vdmUgYXJvdW5kIHRoZWlyIGZpbGVzLgogICAgICAqLworICAgIEBUZXN0CisgICAgQEFwcE1vZGVGdWxsIC8vIFRPRE86IE5lZWRzIHBvcnRpbmcgdG8gaW5zdGFudAogICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aVZpZXdNb3ZlQ29uc2lzdGVuY3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHdpcGVQcmltYXJ5RXh0ZXJuYWxTdG9yYWdlKCk7CkBAIC0yMzgsMzIgKzI0MCwzMiBAQAogICAgICAgICAgICAgZ2V0RGV2aWNlKCkudW5pbnN0YWxsUGFja2FnZShOT05FX1BLRyk7CiAgICAgICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKFJFQURfUEtHKTsKICAgICAgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoV1JJVEVfUEtHKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIG9wdGlvbnMgPSB7QWJpVXRpbHMuY3JlYXRlQWJpRmxhZyhtQWJpLmdldE5hbWUoKSl9OworICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gb3B0aW9ucyA9IHtBYmlVdGlscy5jcmVhdGVBYmlGbGFnKGdldEFiaSgpLmdldE5hbWUoKSl9OwogCiAgICAgICAgICAgICBhc3NlcnROdWxsKGdldERldmljZSgpLmluc3RhbGxQYWNrYWdlKGdldFRlc3RBcHBGaWxlKFdSSVRFX0FQSyksIGZhbHNlLCBvcHRpb25zKSk7CiAgICAgICAgICAgICBhc3NlcnROdWxsKGdldERldmljZSgpLmluc3RhbGxQYWNrYWdlKGdldFRlc3RBcHBGaWxlKFJFQURfQVBLKSwgZmFsc2UsIG9wdGlvbnMpKTsKIAogICAgICAgICAgICAgZm9yIChpbnQgdXNlciA6IG1Vc2VycykgewotICAgICAgICAgICAgICAgIHJ1bkRldmljZVRlc3RzKFJFQURfUEtHLCAiLlJlYWRNdWx0aVZpZXdUZXN0IiwgInRlc3RGb2xkZXJTZXR1cCIsIHVzZXIpOworICAgICAgICAgICAgICAgIHJ1bkRldmljZVRlc3RzKFJFQURfUEtHLCBSRUFEX1BLRyArICIuUmVhZE11bHRpVmlld1Rlc3QiLCAidGVzdEZvbGRlclNldHVwIiwgdXNlcik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBmb3IgKGludCB1c2VyIDogbVVzZXJzKSB7Ci0gICAgICAgICAgICAgICAgcnVuRGV2aWNlVGVzdHMoUkVBRF9QS0csICIuUmVhZE11bHRpVmlld1Rlc3QiLCAidGVzdFJXQWNjZXNzIiwgdXNlcik7CisgICAgICAgICAgICAgICAgcnVuRGV2aWNlVGVzdHMoUkVBRF9QS0csIFJFQURfUEtHICsgIi5SZWFkTXVsdGlWaWV3VGVzdCIsICJ0ZXN0UldBY2Nlc3MiLCB1c2VyKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgZm9yIChpbnQgdXNlciA6IG1Vc2VycykgewotICAgICAgICAgICAgICAgIHJ1bkRldmljZVRlc3RzKFdSSVRFX1BLRywgIi5Xcml0ZU11bHRpVmlld1Rlc3QiLCAidGVzdE1vdmVBd2F5IiwgdXNlcik7CisgICAgICAgICAgICAgICAgcnVuRGV2aWNlVGVzdHMoV1JJVEVfUEtHLCBXUklURV9QS0cgKyAiLldyaXRlTXVsdGlWaWV3VGVzdCIsICJ0ZXN0TW92ZUF3YXkiLCB1c2VyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZvciAoaW50IHVzZXIgOiBtVXNlcnMpIHsKLSAgICAgICAgICAgICAgICBydW5EZXZpY2VUZXN0cyhSRUFEX1BLRywgIi5SZWFkTXVsdGlWaWV3VGVzdCIsICJ0ZXN0Uk9BY2Nlc3MiLCB1c2VyKTsKKyAgICAgICAgICAgICAgICBydW5EZXZpY2VUZXN0cyhSRUFEX1BLRywgUkVBRF9QS0cgKyAiLlJlYWRNdWx0aVZpZXdUZXN0IiwgInRlc3RST0FjY2VzcyIsIHVzZXIpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBmb3IgZnVzZSBmaWxlIHN5c3RlbQogICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDAwKTsKICAgICAgICAgICAgIGZvciAoaW50IHVzZXIgOiBtVXNlcnMpIHsKLSAgICAgICAgICAgICAgICBydW5EZXZpY2VUZXN0cyhXUklURV9QS0csICIuV3JpdGVNdWx0aVZpZXdUZXN0IiwgInRlc3RNb3ZlQmFjayIsIHVzZXIpOworICAgICAgICAgICAgICAgIHJ1bkRldmljZVRlc3RzKFdSSVRFX1BLRywgV1JJVEVfUEtHICsgIi5Xcml0ZU11bHRpVmlld1Rlc3QiLCAidGVzdE1vdmVCYWNrIiwgdXNlcik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBmb3IgKGludCB1c2VyIDogbVVzZXJzKSB7Ci0gICAgICAgICAgICAgICAgcnVuRGV2aWNlVGVzdHMoUkVBRF9QS0csICIuUmVhZE11bHRpVmlld1Rlc3QiLCAidGVzdFJXQWNjZXNzIiwgdXNlcik7CisgICAgICAgICAgICAgICAgcnVuRGV2aWNlVGVzdHMoUkVBRF9QS0csIFJFQURfUEtHICsgIi5SZWFkTXVsdGlWaWV3VGVzdCIsICJ0ZXN0UldBY2Nlc3MiLCB1c2VyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoTk9ORV9QS0cpOwpAQCAtMjczLDEzICsyNzUsMTUgQEAKICAgICB9CiAKICAgICAvKiogVmVyaWZ5IHRoYXQgYXBwIHdpdGhvdXQgUkVBRF9FWFRFUk5BTCBjYW4gcGxheSBkZWZhdWx0IFVSSXMgaW4gZXh0ZXJuYWwgc3RvcmFnZS4gKi8KKyAgICBAVGVzdAorICAgIEBBcHBNb2RlRnVsbCAvLyBUT0RPOiBOZWVkcyBwb3J0aW5nIHRvIGluc3RhbnQKICAgICBwdWJsaWMgdm9pZCB0ZXN0RXh0ZXJuYWxTdG9yYWdlUmVhZERlZmF1bHRVcmlzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICB3aXBlUHJpbWFyeUV4dGVybmFsU3RvcmFnZSgpOwogCiAgICAgICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKE5PTkVfUEtHKTsKICAgICAgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoV1JJVEVfUEtHKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIG9wdGlvbnMgPSB7QWJpVXRpbHMuY3JlYXRlQWJpRmxhZyhtQWJpLmdldE5hbWUoKSl9OworICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gb3B0aW9ucyA9IHtBYmlVdGlscy5jcmVhdGVBYmlGbGFnKGdldEFiaSgpLmdldE5hbWUoKSl9OwogCiAgICAgICAgICAgICBhc3NlcnROdWxsKGdldERldmljZSgpLmluc3RhbGxQYWNrYWdlKGdldFRlc3RBcHBGaWxlKFdSSVRFX0FQSyksIGZhbHNlLCBvcHRpb25zKSk7CiAgICAgICAgICAgICBhc3NlcnROdWxsKGdldERldmljZSgpLmluc3RhbGxQYWNrYWdlKGdldFRlc3RBcHBGaWxlKE5PTkVfQVBLKSwgZmFsc2UsIG9wdGlvbnMpKTsKQEAgLTMwMyw2ICszMDcsNDYgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qKgorICAgICAqIEZvciBzZWN1cml0eSByZWFzb25zLCB0aGUgc2hlbGwgdXNlciBjYW5ub3QgYWNjZXNzIHRoZSBzaGFyZWQgc3RvcmFnZSBvZgorICAgICAqIHNlY29uZGFyeSB1c2Vycy4gSW5zdGVhZCwgZGV2ZWxvcGVycyBzaG91bGQgdXNlIHRoZSB7QGNvZGUgY29udGVudH0gc2hlbGwKKyAgICAgKiB0b29sIHRvIHJlYWQvd3JpdGUgZmlsZXMgaW4gdGhvc2UgbG9jYXRpb25zLgorICAgICAqLworICAgIEBUZXN0CisgICAgQEFwcE1vZGVGdWxsIC8vIFRPRE86IE5lZWRzIHBvcnRpbmcgdG8gaW5zdGFudAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZWNvbmRhcnlVc2Vyc0luYWNjZXNzaWJsZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBMaXN0PFN0cmluZz4gbW91bnRzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGZvciAoU3RyaW5nIGxpbmUgOiBnZXREZXZpY2UoKS5leGVjdXRlU2hlbGxDb21tYW5kKCJjYXQgL3Byb2MvbW91bnRzIikuc3BsaXQoIlxuIikpIHsKKyAgICAgICAgICAgIFN0cmluZ1tdIHNwbGl0ID0gbGluZS5zcGxpdCgiICIpOworICAgICAgICAgICAgaWYgKHNwbGl0WzFdLnN0YXJ0c1dpdGgoIi9zdG9yYWdlLyIpIHx8IHNwbGl0WzFdLnN0YXJ0c1dpdGgoIi9tbnQvIikpIHsKKyAgICAgICAgICAgICAgICBtb3VudHMuYWRkKHNwbGl0WzFdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IHVzZXIgOiBtVXNlcnMpIHsKKyAgICAgICAgICAgIFN0cmluZyBwcm9iZSA9ICIvc2RjYXJkLy4uLyIgKyB1c2VyOworICAgICAgICAgICAgaWYgKHVzZXIgPT0gVXRpbHMuVVNFUl9TWVNURU0pIHsKKyAgICAgICAgICAgICAgICAvLyBQcmltYXJ5IHVzZXIgc2hvdWxkIGFsd2F5cyBiZSB2aXNpYmxlLiBTa2lwIGNoZWNraW5nIHJhdworICAgICAgICAgICAgICAgIC8vIG1vdW50IHBvaW50cywgc2luY2Ugd2UnZCBnZXQgZmFsc2UtcG9zaXRpdmVzIGZvciBwaHlzaWNhbAorICAgICAgICAgICAgICAgIC8vIGRldmljZXMgdGhhdCBhcmVuJ3QgbXVsdGktdXNlciBhd2FyZS4KKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHByb2JlLCBhY2Nlc3MocHJvYmUpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gU2Vjb25kYXJ5IHVzZXIgc2hvdWxkIG5ldmVyIGJlIHZpc2libGUuCisgICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UocHJvYmUsIGFjY2Vzcyhwcm9iZSkpOworICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIG1vdW50IDogbW91bnRzKSB7CisgICAgICAgICAgICAgICAgICAgIHByb2JlID0gbW91bnQgKyAiLyIgKyB1c2VyOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShwcm9iZSwgYWNjZXNzKHByb2JlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGFjY2VzcyhTdHJpbmcgcGF0aCkgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIGxvbmcgbm9uY2UgPSBTeXN0ZW0ubmFub1RpbWUoKTsKKyAgICAgICAgcmV0dXJuIGdldERldmljZSgpLmV4ZWN1dGVTaGVsbENvbW1hbmQoImxzIC1sYSAiICsgcGF0aCArICIgJiYgZWNobyAiICsgbm9uY2UpCisgICAgICAgICAgICAgICAgLmNvbnRhaW5zKExvbmcudG9TdHJpbmcobm9uY2UpKTsKKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgZW5hYmxlV3JpdGVTZXR0aW5ncyhTdHJpbmcgcGFja2FnZU5hbWUsIGludCB1c2VySWQpCiAgICAgICAgICAgICB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nQnVpbGRlciBjbWQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwpAQCAtMzI2LDExICszNzAsMTEgQEAKIAogICAgIHByaXZhdGUgdm9pZCBydW5EZXZpY2VUZXN0cyhTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyB0ZXN0Q2xhc3NOYW1lLCBpbnQgdXNlcklkKQogICAgICAgICAgICAgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFV0aWxzLnJ1bkRldmljZVRlc3RzKGdldERldmljZSgpLCBwYWNrYWdlTmFtZSwgdGVzdENsYXNzTmFtZSwgdXNlcklkKTsKKyAgICAgICAgcnVuRGV2aWNlVGVzdHMoZ2V0RGV2aWNlKCksIHBhY2thZ2VOYW1lLCB0ZXN0Q2xhc3NOYW1lLCBudWxsLCB1c2VySWQsIG51bGwpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBydW5EZXZpY2VUZXN0cyhTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyB0ZXN0Q2xhc3NOYW1lLCBTdHJpbmcgdGVzdE1ldGhvZE5hbWUsCiAgICAgICAgICAgICBpbnQgdXNlcklkKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgVXRpbHMucnVuRGV2aWNlVGVzdHMoZ2V0RGV2aWNlKCksIHBhY2thZ2VOYW1lLCB0ZXN0Q2xhc3NOYW1lLCB0ZXN0TWV0aG9kTmFtZSwgdXNlcklkKTsKKyAgICAgICAgcnVuRGV2aWNlVGVzdHMoZ2V0RGV2aWNlKCksIHBhY2thZ2VOYW1lLCB0ZXN0Q2xhc3NOYW1lLCB0ZXN0TWV0aG9kTmFtZSwgdXNlcklkLCBudWxsKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3NyYy9hbmRyb2lkL2FwcHNlY3VyaXR5L2N0cy9JbnN0YW50QXBwVXNlclRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvc3JjL2FuZHJvaWQvYXBwc2VjdXJpdHkvY3RzL0luc3RhbnRBcHBVc2VyVGVzdC5qYXZhCmluZGV4IDQ2MDllOGEuLmFhNzk5OGIgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvc3JjL2FuZHJvaWQvYXBwc2VjdXJpdHkvY3RzL0luc3RhbnRBcHBVc2VyVGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvc3JjL2FuZHJvaWQvYXBwc2VjdXJpdHkvY3RzL0luc3RhbnRBcHBVc2VyVGVzdC5qYXZhCkBAIC0xNiw2ICsxNiw3IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5hcHBzZWN1cml0eS5jdHM7CiAKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQuYnVpbGQuQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmJ1aWxkLklCdWlsZEluZm87CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLkRldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKQEAgLTI5LDYgKzMwLDcgQEAKIC8qKgogICogVGVzdHMgZm9yIGVwaGVtZXJhbCBwYWNrYWdlcy4KICAqLworQEFwcE1vZGVGdWxsIC8vIEFscmVhZHkgaGFuZGxlcyBpbnN0YW50IGluc3RhbGxzIHdoZW4gbmVlZGVkLgogcHVibGljIGNsYXNzIEluc3RhbnRBcHBVc2VyVGVzdCBleHRlbmRzIERldmljZVRlc3RDYXNlCiAgICAgICAgIGltcGxlbWVudHMgSUFiaVJlY2VpdmVyLCBJQnVpbGRSZWNlaXZlciB7CiAKQEAgLTU0LDYgKzU2LDcgQEAKICAgICAvKiogVXNlcnMgd2Ugc2hvdWxkbid0IGRlbGV0ZSBpbiB0aGUgdGVzdHMgKi8KICAgICBwcml2YXRlIEFycmF5TGlzdDxJbnRlZ2VyPiBtRml4ZWRVc2VyczsKICAgICBwcml2YXRlIGludFtdIG1UZXN0VXNlciA9IG5ldyBpbnRbMl07CisgICAgcHJpdmF0ZSBpbnQgbVN0YXJ0aW5nVXNlcjsKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldEFiaShJQWJpIGFiaSkgewpAQCAtODEsNiArODQsNyBAQAogICAgICAgICAgICAgaWYgKG1QcmltYXJ5VXNlcklkICE9IFVTRVJfU1lTVEVNKSB7CiAgICAgICAgICAgICAgICAgbUZpeGVkVXNlcnMuYWRkKFVTRVJfU1lTVEVNKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TdGFydGluZ1VzZXIgPSBnZXREZXZpY2UoKS5nZXRDdXJyZW50VXNlcigpOwogICAgICAgICAgICAgZ2V0RGV2aWNlKCkuc3dpdGNoVXNlcihtUHJpbWFyeVVzZXJJZCk7CiAKICAgICAgICAgICAgIG1UZXN0VXNlclswXSA9IHVzZXJzWzFdOwpAQCAtOTUsNiArOTksNyBAQAogICAgICAgICBpZiAobVN1cHBvcnRzTXVsdGlVc2VyKSB7CiAgICAgICAgICAgICB1bmluc3RhbGxUZXN0UGFja2FnZXMoKTsKICAgICAgICAgfQorICAgICAgICBnZXREZXZpY2UoKS5zd2l0Y2hVc2VyKG1TdGFydGluZ1VzZXIpOwogICAgICAgICBzdXBlci50ZWFyRG93bigpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9zcmMvYW5kcm9pZC9hcHBzZWN1cml0eS9jdHMvSW5zdGFudENvb2tpZUhvc3RUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3NyYy9hbmRyb2lkL2FwcHNlY3VyaXR5L2N0cy9JbnN0YW50Q29va2llSG9zdFRlc3QuamF2YQppbmRleCA1MWZhNzdiLi4wZmM0MWFiIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3NyYy9hbmRyb2lkL2FwcHNlY3VyaXR5L2N0cy9JbnN0YW50Q29va2llSG9zdFRlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3NyYy9hbmRyb2lkL2FwcHNlY3VyaXR5L2N0cy9JbnN0YW50Q29va2llSG9zdFRlc3QuamF2YQpAQCAtMTYsNiArMTYsNyBAQAogCiBwYWNrYWdlIGFuZHJvaWQuYXBwc2VjdXJpdHkuY3RzOwogCitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLmJ1aWxkLkNvbXBhdGliaWxpdHlCdWlsZEhlbHBlcjsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5idWlsZC5JQnVpbGRJbmZvOwogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5EZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb247CkBAIC0yNSw2ICsyNiw3IEBACiAvKioKICAqIFRlc3RzIGZvciB0aGUgaW5zdGFudCBjb29raWUgQVBJcwogICovCitAQXBwTW9kZUZ1bGwgLy8gQWxyZWFkeSBoYW5kbGVzIGluc3RhbnQgaW5zdGFsbHMgd2hlbiBuZWVkZWQuCiBwdWJsaWMgY2xhc3MgSW5zdGFudENvb2tpZUhvc3RUZXN0IGV4dGVuZHMgRGV2aWNlVGVzdENhc2UgaW1wbGVtZW50cyBJQnVpbGRSZWNlaXZlciB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOU1RBTlRfQ09PS0lFX0FQUF9BUEsgPSAiQ3RzSW5zdGFudENvb2tpZUFwcC5hcGsiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlNUQU5UX0NPT0tJRV9BUFBfUEtHID0gInRlc3QuaW5zdGFudC5jb29raWUiOwpAQCAtMzIsNiArMzQsOSBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlNUQU5UX0NPT0tJRV9BUFBfQVBLXzIgPSAiQ3RzSW5zdGFudENvb2tpZUFwcDIuYXBrIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5TVEFOVF9DT09LSUVfQVBQX1BLR18yID0gInRlc3QuaW5zdGFudC5jb29raWUiOwogCisgICAgLy8gV2FpdCB0aW1lIGluIG1zZWMgdG8gbWFrZSBzdXJlIHRoZSBjb29raWUgaXMgc3RvcmVkIG9uIGRpc2suCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdBSVRfQ09PS0lFX1NUT1JFRCA9IDEwMDA7CisKICAgICBwcml2YXRlIENvbXBhdGliaWxpdHlCdWlsZEhlbHBlciBtQnVpbGRIZWxwZXI7CiAKICAgICBAT3ZlcnJpZGUKQEAgLTY2LDYgKzcxLDcgQEAKICAgICAgICAgICAgICAgICAidGVzdENvb2tpZVBlcnNpc3RlZEFjcm9zc0luc3RhbnRJbnN0YWxsczEiKTsKICAgICAgICAgdW5pbnN0YWxsUGFja2FnZShJTlNUQU5UX0NPT0tJRV9BUFBfUEtHKTsKICAgICAgICAgYXNzZXJ0TnVsbChpbnN0YWxsUGFja2FnZShJTlNUQU5UX0NPT0tJRV9BUFBfQVBLLCBmYWxzZSwgdHJ1ZSkpOworICAgICAgICBUaHJlYWQuc2xlZXAoV0FJVF9DT09LSUVfU1RPUkVEKTsKICAgICAgICAgcnVuRGV2aWNlVGVzdHMoSU5TVEFOVF9DT09LSUVfQVBQX1BLRywgInRlc3QuaW5zdGFudC5jb29raWUuQ29va2llVGVzdCIsCiAgICAgICAgICAgICAgICAgInRlc3RDb29raWVQZXJzaXN0ZWRBY3Jvc3NJbnN0YW50SW5zdGFsbHMyIik7CiAgICAgfQpAQCAtNzUsNiArODEsNyBAQAogICAgICAgICBydW5EZXZpY2VUZXN0cyhJTlNUQU5UX0NPT0tJRV9BUFBfUEtHLCAidGVzdC5pbnN0YW50LmNvb2tpZS5Db29raWVUZXN0IiwKICAgICAgICAgICAgICAgICAidGVzdENvb2tpZVBlcnNpc3RlZFVwZ3JhZGVGcm9tSW5zdGFudDEiKTsKICAgICAgICAgYXNzZXJ0TnVsbChpbnN0YWxsUGFja2FnZShJTlNUQU5UX0NPT0tJRV9BUFBfQVBLLCB0cnVlLCBmYWxzZSkpOworICAgICAgICBUaHJlYWQuc2xlZXAoV0FJVF9DT09LSUVfU1RPUkVEKTsKICAgICAgICAgcnVuRGV2aWNlVGVzdHMoSU5TVEFOVF9DT09LSUVfQVBQX1BLRywgInRlc3QuaW5zdGFudC5jb29raWUuQ29va2llVGVzdCIsCiAgICAgICAgICAgICAgICAgInRlc3RDb29raWVQZXJzaXN0ZWRVcGdyYWRlRnJvbUluc3RhbnQyIik7CiAgICAgfQpAQCAtODUsNiArOTIsNyBAQAogICAgICAgICAgICAgICAgICJ0ZXN0Q29va2llUmVzZXRPbk5vbkluc3RhbnRSZWluc3RhbGwxIik7CiAgICAgICAgIHVuaW5zdGFsbFBhY2thZ2UoSU5TVEFOVF9DT09LSUVfQVBQX1BLRyk7CiAgICAgICAgIGFzc2VydE51bGwoaW5zdGFsbFBhY2thZ2UoSU5TVEFOVF9DT09LSUVfQVBQX0FQSywgdHJ1ZSwgZmFsc2UpKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKFdBSVRfQ09PS0lFX1NUT1JFRCk7CiAgICAgICAgIHJ1bkRldmljZVRlc3RzKElOU1RBTlRfQ09PS0lFX0FQUF9QS0csICJ0ZXN0Lmluc3RhbnQuY29va2llLkNvb2tpZVRlc3QiLAogICAgICAgICAgICAgICAgICJ0ZXN0Q29va2llUmVzZXRPbk5vbkluc3RhbnRSZWluc3RhbGwyIik7CiAgICAgfQpAQCAtOTUsNiArMTAzLDcgQEAKICAgICAgICAgICAgICAgICAidGVzdENvb2tpZVBlcnNpc3RlZEFjcm9zc0luc3RhbnRJbnN0YWxsczEiKTsKICAgICAgICAgdW5pbnN0YWxsUGFja2FnZShJTlNUQU5UX0NPT0tJRV9BUFBfUEtHKTsKICAgICAgICAgYXNzZXJ0TnVsbChpbnN0YWxsUGFja2FnZShJTlNUQU5UX0NPT0tJRV9BUFBfQVBLXzIsIHRydWUsIHRydWUpKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKFdBSVRfQ09PS0lFX1NUT1JFRCk7CiAgICAgICAgIHJ1bkRldmljZVRlc3RzKElOU1RBTlRfQ09PS0lFX0FQUF9QS0dfMiwgInRlc3QuaW5zdGFudC5jb29raWUuQ29va2llVGVzdCIsCiAgICAgICAgICAgICAgICAgInRlc3RDb29raWVQZXJzaXN0ZWRBY3Jvc3NJbnN0YW50SW5zdGFsbHMyIik7CiAgICAgfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9zcmMvYW5kcm9pZC9hcHBzZWN1cml0eS9jdHMvSXNvbGF0ZWRTcGxpdHNUZXN0cy5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9zcmMvYW5kcm9pZC9hcHBzZWN1cml0eS9jdHMvSXNvbGF0ZWRTcGxpdHNUZXN0cy5qYXZhCmluZGV4IDg3OTVmZTguLmE5YWM5YjAgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvc3JjL2FuZHJvaWQvYXBwc2VjdXJpdHkvY3RzL0lzb2xhdGVkU3BsaXRzVGVzdHMuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3NyYy9hbmRyb2lkL2FwcHNlY3VyaXR5L2N0cy9Jc29sYXRlZFNwbGl0c1Rlc3RzLmphdmEKQEAgLTE1LDEwICsxNSwxMyBAQAogICovCiBwYWNrYWdlIGFuZHJvaWQuYXBwc2VjdXJpdHkuY3RzOwogCitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOwogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmJ1aWxkLklCdWlsZEluZm87CitpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLkRldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5EZXZpY2VUZXN0Q2FzZTsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JQnVpbGRSZWNlaXZlcjsKIAorQEFwcE1vZGVGdWxsIC8vIFRPRE86IE5lZWRzIHBvcnRpbmcgdG8gaW5zdGFudAogcHVibGljIGNsYXNzIElzb2xhdGVkU3BsaXRzVGVzdHMgZXh0ZW5kcyBEZXZpY2VUZXN0Q2FzZSBpbXBsZW1lbnRzIElCdWlsZFJlY2VpdmVyIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEtHID0gImNvbS5hbmRyb2lkLmN0cy5pc29sYXRlZHNwbGl0YXBwIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9DTEFTUyA9IFBLRyArICIuU3BsaXRBcHBUZXN0IjsKQEAgLTU2LDEyICs1OSwxMiBAQAogCiAgICAgcHVibGljIHZvaWQgdGVzdEluc3RhbGxCYXNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIG5ldyBJbnN0YWxsTXVsdGlwbGUoKS5hZGRBcGsoQVBLX0JBU0UpLnJ1bigpOwotICAgICAgICBVdGlscy5ydW5EZXZpY2VUZXN0cyhnZXREZXZpY2UoKSwgUEtHLCBURVNUX0NMQVNTLCAic2hvdWxkTG9hZERlZmF1bHQiKTsKKyAgICAgICAgcnVuRGV2aWNlVGVzdHNBc0N1cnJlbnRVc2VyKFBLRywgVEVTVF9DTEFTUywgInNob3VsZExvYWREZWZhdWx0Iik7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdEluc3RhbGxCYXNlQW5kQ29uZmlnU3BsaXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgbmV3IEluc3RhbGxNdWx0aXBsZSgpLmFkZEFwayhBUEtfQkFTRSkuYWRkQXBrKEFQS19CQVNFX3BsKS5ydW4oKTsKLSAgICAgICAgVXRpbHMucnVuRGV2aWNlVGVzdHMoZ2V0RGV2aWNlKCksIFBLRywgVEVTVF9DTEFTUywgInNob3VsZExvYWRQb2xpc2hMb2NhbGUiKTsKKyAgICAgICAgcnVuRGV2aWNlVGVzdHNBc0N1cnJlbnRVc2VyKFBLRywgVEVTVF9DTEFTUywgInNob3VsZExvYWRQb2xpc2hMb2NhbGUiKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbE1pc3NpbmdEZXBlbmRlbmN5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC03MCw1MiArNzMsNTIgQEAKIAogICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsT25lRmVhdHVyZVNwbGl0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIG5ldyBJbnN0YWxsTXVsdGlwbGUoKS5hZGRBcGsoQVBLX0JBU0UpLmFkZEFwayhBUEtfRkVBVFVSRV9BKS5ydW4oKTsKLSAgICAgICAgVXRpbHMucnVuRGV2aWNlVGVzdHMoZ2V0RGV2aWNlKCksIFBLRywgVEVTVF9DTEFTUywgInNob3VsZExvYWREZWZhdWx0Iik7Ci0gICAgICAgIFV0aWxzLnJ1bkRldmljZVRlc3RzKGdldERldmljZSgpLCBQS0csIFRFU1RfQ0xBU1MsICJzaG91bGRMb2FkRmVhdHVyZUFEZWZhdWx0Iik7Ci0gICAgICAgIFV0aWxzLnJ1bkRldmljZVRlc3RzKGdldERldmljZSgpLCBQS0csIFRFU1RfQ0xBU1MsICJzaG91bGRMb2FkRmVhdHVyZUFSZWNlaXZlcnMiKTsKKyAgICAgICAgcnVuRGV2aWNlVGVzdHNBc0N1cnJlbnRVc2VyKFBLRywgVEVTVF9DTEFTUywgInNob3VsZExvYWREZWZhdWx0Iik7CisgICAgICAgIHJ1bkRldmljZVRlc3RzQXNDdXJyZW50VXNlcihQS0csIFRFU1RfQ0xBU1MsICJzaG91bGRMb2FkRmVhdHVyZUFEZWZhdWx0Iik7CisgICAgICAgIHJ1bkRldmljZVRlc3RzQXNDdXJyZW50VXNlcihQS0csIFRFU1RfQ0xBU1MsICJzaG91bGRMb2FkRmVhdHVyZUFSZWNlaXZlcnMiKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbE9uZUZlYXR1cmVTcGxpdEFuZENvbmZpZ1NwbGl0cygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBuZXcgSW5zdGFsbE11bHRpcGxlKCkuYWRkQXBrKEFQS19CQVNFKS5hZGRBcGsoQVBLX0ZFQVRVUkVfQSkuYWRkQXBrKEFQS19CQVNFX3BsKQogICAgICAgICAgICAgICAgIC5hZGRBcGsoQVBLX0ZFQVRVUkVfQV9wbCkucnVuKCk7Ci0gICAgICAgIFV0aWxzLnJ1bkRldmljZVRlc3RzKGdldERldmljZSgpLCBQS0csIFRFU1RfQ0xBU1MsICJzaG91bGRMb2FkUG9saXNoTG9jYWxlIik7Ci0gICAgICAgIFV0aWxzLnJ1bkRldmljZVRlc3RzKGdldERldmljZSgpLCBQS0csIFRFU1RfQ0xBU1MsICJzaG91bGRMb2FkRmVhdHVyZUFQb2xpc2hMb2NhbGUiKTsKKyAgICAgICAgcnVuRGV2aWNlVGVzdHNBc0N1cnJlbnRVc2VyKFBLRywgVEVTVF9DTEFTUywgInNob3VsZExvYWRQb2xpc2hMb2NhbGUiKTsKKyAgICAgICAgcnVuRGV2aWNlVGVzdHNBc0N1cnJlbnRVc2VyKFBLRywgVEVTVF9DTEFTUywgInNob3VsZExvYWRGZWF0dXJlQVBvbGlzaExvY2FsZSIpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsRGVwZW5kZW50RmVhdHVyZVNwbGl0cygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBuZXcgSW5zdGFsbE11bHRpcGxlKCkuYWRkQXBrKEFQS19CQVNFKS5hZGRBcGsoQVBLX0ZFQVRVUkVfQSkuYWRkQXBrKEFQS19GRUFUVVJFX0IpLnJ1bigpOwotICAgICAgICBVdGlscy5ydW5EZXZpY2VUZXN0cyhnZXREZXZpY2UoKSwgUEtHLCBURVNUX0NMQVNTLCAic2hvdWxkTG9hZERlZmF1bHQiKTsKLSAgICAgICAgVXRpbHMucnVuRGV2aWNlVGVzdHMoZ2V0RGV2aWNlKCksIFBLRywgVEVTVF9DTEFTUywgInNob3VsZExvYWRGZWF0dXJlQURlZmF1bHQiKTsKLSAgICAgICAgVXRpbHMucnVuRGV2aWNlVGVzdHMoZ2V0RGV2aWNlKCksIFBLRywgVEVTVF9DTEFTUywgInNob3VsZExvYWRGZWF0dXJlQkRlZmF1bHQiKTsKLSAgICAgICAgVXRpbHMucnVuRGV2aWNlVGVzdHMoZ2V0RGV2aWNlKCksIFBLRywgVEVTVF9DTEFTUywgInNob3VsZExvYWRGZWF0dXJlQUFuZEJSZWNlaXZlcnMiKTsKKyAgICAgICAgcnVuRGV2aWNlVGVzdHNBc0N1cnJlbnRVc2VyKFBLRywgVEVTVF9DTEFTUywgInNob3VsZExvYWREZWZhdWx0Iik7CisgICAgICAgIHJ1bkRldmljZVRlc3RzQXNDdXJyZW50VXNlcihQS0csIFRFU1RfQ0xBU1MsICJzaG91bGRMb2FkRmVhdHVyZUFEZWZhdWx0Iik7CisgICAgICAgIHJ1bkRldmljZVRlc3RzQXNDdXJyZW50VXNlcihQS0csIFRFU1RfQ0xBU1MsICJzaG91bGRMb2FkRmVhdHVyZUJEZWZhdWx0Iik7CisgICAgICAgIHJ1bkRldmljZVRlc3RzQXNDdXJyZW50VXNlcihQS0csIFRFU1RfQ0xBU1MsICJzaG91bGRMb2FkRmVhdHVyZUFBbmRCUmVjZWl2ZXJzIik7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdEluc3RhbGxEZXBlbmRlbnRGZWF0dXJlU3BsaXRzQW5kQ29uZmlnU3BsaXRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIG5ldyBJbnN0YWxsTXVsdGlwbGUoKS5hZGRBcGsoQVBLX0JBU0UpLmFkZEFwayhBUEtfRkVBVFVSRV9BKS5hZGRBcGsoQVBLX0ZFQVRVUkVfQikKICAgICAgICAgICAgICAgICAuYWRkQXBrKEFQS19CQVNFX3BsKS5hZGRBcGsoQVBLX0ZFQVRVUkVfQV9wbCkuYWRkQXBrKEFQS19GRUFUVVJFX0JfcGwpLnJ1bigpOwotICAgICAgICBVdGlscy5ydW5EZXZpY2VUZXN0cyhnZXREZXZpY2UoKSwgUEtHLCBURVNUX0NMQVNTLCAic2hvdWxkTG9hZFBvbGlzaExvY2FsZSIpOwotICAgICAgICBVdGlscy5ydW5EZXZpY2VUZXN0cyhnZXREZXZpY2UoKSwgUEtHLCBURVNUX0NMQVNTLCAic2hvdWxkTG9hZEZlYXR1cmVBUG9saXNoTG9jYWxlIik7Ci0gICAgICAgIFV0aWxzLnJ1bkRldmljZVRlc3RzKGdldERldmljZSgpLCBQS0csIFRFU1RfQ0xBU1MsICJzaG91bGRMb2FkRmVhdHVyZUJQb2xpc2hMb2NhbGUiKTsKKyAgICAgICAgcnVuRGV2aWNlVGVzdHNBc0N1cnJlbnRVc2VyKFBLRywgVEVTVF9DTEFTUywgInNob3VsZExvYWRQb2xpc2hMb2NhbGUiKTsKKyAgICAgICAgcnVuRGV2aWNlVGVzdHNBc0N1cnJlbnRVc2VyKFBLRywgVEVTVF9DTEFTUywgInNob3VsZExvYWRGZWF0dXJlQVBvbGlzaExvY2FsZSIpOworICAgICAgICBydW5EZXZpY2VUZXN0c0FzQ3VycmVudFVzZXIoUEtHLCBURVNUX0NMQVNTLCAic2hvdWxkTG9hZEZlYXR1cmVCUG9saXNoTG9jYWxlIik7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdEluc3RhbGxBbGxGZWF0dXJlU3BsaXRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIG5ldyBJbnN0YWxsTXVsdGlwbGUoKS5hZGRBcGsoQVBLX0JBU0UpLmFkZEFwayhBUEtfRkVBVFVSRV9BKS5hZGRBcGsoQVBLX0ZFQVRVUkVfQikKICAgICAgICAgICAgICAgICAuYWRkQXBrKEFQS19GRUFUVVJFX0MpLnJ1bigpOwotICAgICAgICBVdGlscy5ydW5EZXZpY2VUZXN0cyhnZXREZXZpY2UoKSwgUEtHLCBURVNUX0NMQVNTLCAic2hvdWxkTG9hZERlZmF1bHQiKTsKLSAgICAgICAgVXRpbHMucnVuRGV2aWNlVGVzdHMoZ2V0RGV2aWNlKCksIFBLRywgVEVTVF9DTEFTUywgInNob3VsZExvYWRGZWF0dXJlQURlZmF1bHQiKTsKLSAgICAgICAgVXRpbHMucnVuRGV2aWNlVGVzdHMoZ2V0RGV2aWNlKCksIFBLRywgVEVTVF9DTEFTUywgInNob3VsZExvYWRGZWF0dXJlQkRlZmF1bHQiKTsKLSAgICAgICAgVXRpbHMucnVuRGV2aWNlVGVzdHMoZ2V0RGV2aWNlKCksIFBLRywgVEVTVF9DTEFTUywgInNob3VsZExvYWRGZWF0dXJlQ0RlZmF1bHQiKTsKLSAgICAgICAgVXRpbHMucnVuRGV2aWNlVGVzdHMoZ2V0RGV2aWNlKCksIFBLRywgVEVTVF9DTEFTUywgInNob3VsZExvYWRGZWF0dXJlQUFuZEJBbmRDUmVjZWl2ZXJzIik7CisgICAgICAgIHJ1bkRldmljZVRlc3RzQXNDdXJyZW50VXNlcihQS0csIFRFU1RfQ0xBU1MsICJzaG91bGRMb2FkRGVmYXVsdCIpOworICAgICAgICBydW5EZXZpY2VUZXN0c0FzQ3VycmVudFVzZXIoUEtHLCBURVNUX0NMQVNTLCAic2hvdWxkTG9hZEZlYXR1cmVBRGVmYXVsdCIpOworICAgICAgICBydW5EZXZpY2VUZXN0c0FzQ3VycmVudFVzZXIoUEtHLCBURVNUX0NMQVNTLCAic2hvdWxkTG9hZEZlYXR1cmVCRGVmYXVsdCIpOworICAgICAgICBydW5EZXZpY2VUZXN0c0FzQ3VycmVudFVzZXIoUEtHLCBURVNUX0NMQVNTLCAic2hvdWxkTG9hZEZlYXR1cmVDRGVmYXVsdCIpOworICAgICAgICBydW5EZXZpY2VUZXN0c0FzQ3VycmVudFVzZXIoUEtHLCBURVNUX0NMQVNTLCAic2hvdWxkTG9hZEZlYXR1cmVBQW5kQkFuZENSZWNlaXZlcnMiKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbEFsbEZlYXR1cmVTcGxpdHNBbmRDb25maWdTcGxpdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgbmV3IEluc3RhbGxNdWx0aXBsZSgpLmFkZEFwayhBUEtfQkFTRSkuYWRkQXBrKEFQS19GRUFUVVJFX0EpLmFkZEFwayhBUEtfRkVBVFVSRV9CKQogICAgICAgICAgICAgICAgIC5hZGRBcGsoQVBLX0ZFQVRVUkVfQykuYWRkQXBrKEFQS19CQVNFX3BsKS5hZGRBcGsoQVBLX0ZFQVRVUkVfQV9wbCkKICAgICAgICAgICAgICAgICAuYWRkQXBrKEFQS19GRUFUVVJFX0NfcGwpLnJ1bigpOwotICAgICAgICBVdGlscy5ydW5EZXZpY2VUZXN0cyhnZXREZXZpY2UoKSwgUEtHLCBURVNUX0NMQVNTLCAic2hvdWxkTG9hZERlZmF1bHQiKTsKLSAgICAgICAgVXRpbHMucnVuRGV2aWNlVGVzdHMoZ2V0RGV2aWNlKCksIFBLRywgVEVTVF9DTEFTUywgInNob3VsZExvYWRGZWF0dXJlQURlZmF1bHQiKTsKLSAgICAgICAgVXRpbHMucnVuRGV2aWNlVGVzdHMoZ2V0RGV2aWNlKCksIFBLRywgVEVTVF9DTEFTUywgInNob3VsZExvYWRGZWF0dXJlQkRlZmF1bHQiKTsKLSAgICAgICAgVXRpbHMucnVuRGV2aWNlVGVzdHMoZ2V0RGV2aWNlKCksIFBLRywgVEVTVF9DTEFTUywgInNob3VsZExvYWRGZWF0dXJlQ0RlZmF1bHQiKTsKKyAgICAgICAgcnVuRGV2aWNlVGVzdHNBc0N1cnJlbnRVc2VyKFBLRywgVEVTVF9DTEFTUywgInNob3VsZExvYWREZWZhdWx0Iik7CisgICAgICAgIHJ1bkRldmljZVRlc3RzQXNDdXJyZW50VXNlcihQS0csIFRFU1RfQ0xBU1MsICJzaG91bGRMb2FkRmVhdHVyZUFEZWZhdWx0Iik7CisgICAgICAgIHJ1bkRldmljZVRlc3RzQXNDdXJyZW50VXNlcihQS0csIFRFU1RfQ0xBU1MsICJzaG91bGRMb2FkRmVhdHVyZUJEZWZhdWx0Iik7CisgICAgICAgIHJ1bkRldmljZVRlc3RzQXNDdXJyZW50VXNlcihQS0csIFRFU1RfQ0xBU1MsICJzaG91bGRMb2FkRmVhdHVyZUNEZWZhdWx0Iik7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xMjgsNCArMTMxLDEwIEBACiAgICAgICAgICAgICBzdXBlcihnZXREZXZpY2UoKSwgbUJ1aWxkSW5mbywgbnVsbCk7CiAgICAgICAgIH0KICAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcnVuRGV2aWNlVGVzdHNBc0N1cnJlbnRVc2VyKAorICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgdGVzdENsYXNzTmFtZSwgU3RyaW5nIHRlc3RNZXRob2ROYW1lKQorICAgICAgICAgICAgICAgIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24geworICAgICAgICBVdGlscy5ydW5EZXZpY2VUZXN0c0FzQ3VycmVudFVzZXIoZ2V0RGV2aWNlKCksIHBhY2thZ2VOYW1lLCB0ZXN0Q2xhc3NOYW1lLCB0ZXN0TWV0aG9kTmFtZSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9zcmMvYW5kcm9pZC9hcHBzZWN1cml0eS9jdHMvS2V5U2V0SG9zdFRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvc3JjL2FuZHJvaWQvYXBwc2VjdXJpdHkvY3RzL0tleVNldEhvc3RUZXN0LmphdmEKaW5kZXggMzU3NDE5MS4uODhjODJmNyAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9zcmMvYW5kcm9pZC9hcHBzZWN1cml0eS9jdHMvS2V5U2V0SG9zdFRlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3NyYy9hbmRyb2lkL2FwcHNlY3VyaXR5L2N0cy9LZXlTZXRIb3N0VGVzdC5qYXZhCkBAIC0xNiwxOCArMTYsMTggQEAKIAogcGFja2FnZSBhbmRyb2lkLmFwcHNlY3VyaXR5LmN0czsKIAoraW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLmJ1aWxkLkNvbXBhdGliaWxpdHlCdWlsZEhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuTG9nOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5Mb2cuTG9nTGV2ZWw7CiBpbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLnRlc3RydW5uZXIuUmVtb3RlQW5kcm9pZFRlc3RSdW5uZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLnRlc3RydW5uZXIuVGVzdElkZW50aWZpZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLnRlc3RydW5uZXIuVGVzdFJlc3VsdDsKIGltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIudGVzdHJ1bm5lci5UZXN0UmVzdWx0LlRlc3RTdGF0dXM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLnRlc3RydW5uZXIuVGVzdFJ1blJlc3VsdDsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5idWlsZC5JQnVpbGRJbmZvOwogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5EZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb247CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLklUZXN0RGV2aWNlOwogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnJlc3VsdC5Db2xsZWN0aW5nVGVzdExpc3RlbmVyOworaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnJlc3VsdC5UZXN0RGVzY3JpcHRpb247CitpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQucmVzdWx0LlRlc3RSZXN1bHQ7CitpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQucmVzdWx0LlRlc3RSdW5SZXN1bHQ7CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuRGV2aWNlVGVzdENhc2U7CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSUJ1aWxkUmVjZWl2ZXI7CiAKQEAgLTM4LDkgKzM4LDEwIEBACiAvKioKICAqIFRlc3RzIGZvciBLZXlzZXQgYmFzZWQgZmVhdHVyZXMuCiAgKi8KK0BBcHBNb2RlRnVsbCAvLyBUT0RPOiBOZWVkcyBwb3J0aW5nIHRvIGluc3RhbnQKIHB1YmxpYyBjbGFzcyBLZXlTZXRIb3N0VGVzdCBleHRlbmRzIERldmljZVRlc3RDYXNlIGltcGxlbWVudHMgSUJ1aWxkUmVjZWl2ZXIgewogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJVTk5FUiA9ICJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlVOTkVSID0gImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciI7CiAKICAgICAvKiBwYWNrYWdlIHdpdGggZGV2aWNlLXNpZGUgdGVzdHMgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZU0VUX1RFU1RfUEtHID0gImNvbS5hbmRyb2lkLmN0cy5rZXlzZXRzLnRlc3RhcHAiOwpAQCAtMTE5LDcgKzEyMCw3IEBACiAKICAgICAgICAgICAgIC8qIGJ1aWxkIGEgbWVhbmluZ2Z1bCBlcnJvciBtZXNzYWdlICovCiAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGVycm9yQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCJvbi1kZXZpY2UgdGVzdHMgZmFpbGVkOlxuIik7Ci0gICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxUZXN0SWRlbnRpZmllciwgVGVzdFJlc3VsdD4gcmVzdWx0RW50cnkgOgorICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8VGVzdERlc2NyaXB0aW9uLCBUZXN0UmVzdWx0PiByZXN1bHRFbnRyeSA6CiAgICAgICAgICAgICAgICAgcmVzdWx0LmdldFRlc3RSZXN1bHRzKCkuZW50cnlTZXQoKSkgewogICAgICAgICAgICAgICAgIGlmICghcmVzdWx0RW50cnkuZ2V0VmFsdWUoKS5nZXRTdGF0dXMoKS5lcXVhbHMoVGVzdFN0YXR1cy5QQVNTRUQpKSB7CiAgICAgICAgICAgICAgICAgICAgIGVycm9yQnVpbGRlci5hcHBlbmQocmVzdWx0RW50cnkuZ2V0S2V5KCkudG9TdHJpbmcoKSk7CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3NyYy9hbmRyb2lkL2FwcHNlY3VyaXR5L2N0cy9NYWpvclZlcnNpb25UZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3NyYy9hbmRyb2lkL2FwcHNlY3VyaXR5L2N0cy9NYWpvclZlcnNpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEyYTc1MwotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvc3JjL2FuZHJvaWQvYXBwc2VjdXJpdHkvY3RzL01ham9yVmVyc2lvblRlc3QuamF2YQpAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hcHBzZWN1cml0eS5jdHM7CisKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CitpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQuYnVpbGQuQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmJ1aWxkLklCdWlsZEluZm87CitpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLkRldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5EZXZpY2VUZXN0Q2FzZTsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JQWJpOworaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLklBYmlSZWNlaXZlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JQnVpbGRSZWNlaXZlcjsKKworLyoqCisgKiBUZXN0IHRoYXQgaW5zdGFsbCBvZiBhcHBzIHVzaW5nIG1ham9yIHZlcnNpb24gY29kZXMgaXMgYmVpbmcgaGFuZGxlZCBwcm9wZXJseS4KKyAqLworQEFwcE1vZGVGdWxsIC8vIFRPRE86IE5lZWRzIHBvcnRpbmcgdG8gaW5zdGFudAorcHVibGljIGNsYXNzIE1ham9yVmVyc2lvblRlc3QgZXh0ZW5kcyBEZXZpY2VUZXN0Q2FzZSBpbXBsZW1lbnRzIElBYmlSZWNlaXZlciwgSUJ1aWxkUmVjZWl2ZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQS0cgPSAiY29tLmFuZHJvaWQuY3RzLm1ham9ydmVyc2lvbiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFQS18wMDAwMDAwMDAwMDBmZmZmID0gIkN0c01ham9yVmVyc2lvbjAwMDAwMDAwMDAwMGZmZmYuYXBrIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBLXzAwMDAwMDAwZmZmZmZmZmYgPSAiQ3RzTWFqb3JWZXJzaW9uMDAwMDAwMDBmZmZmZmZmZi5hcGsiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUEtfMDAwMDAwZmYwMDAwMDAwMCA9ICJDdHNNYWpvclZlcnNpb24wMDAwMDBmZjAwMDAwMDAwLmFwayI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFQS18wMDAwMDBmZmZmZmZmZmZmID0gIkN0c01ham9yVmVyc2lvbjAwMDAwMGZmZmZmZmZmZmYuYXBrIjsKKworICAgIHByaXZhdGUgSUFiaSBtQWJpOworICAgIHByaXZhdGUgQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyIG1CdWlsZEhlbHBlcjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldEFiaShJQWJpIGFiaSkgeworICAgICAgICBtQWJpID0gYWJpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldEJ1aWxkKElCdWlsZEluZm8gYnVpbGRJbmZvKSB7CisgICAgICAgIG1CdWlsZEhlbHBlciA9IG5ldyBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIoYnVpbGRJbmZvKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworCisgICAgICAgIFV0aWxzLnByZXBhcmVTaW5nbGVVc2VyKGdldERldmljZSgpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtQWJpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtQnVpbGRIZWxwZXIpOworCisgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoUEtHKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci50ZWFyRG93bigpOworCisgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoUEtHKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbE1pbm9yVmVyc2lvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnROdWxsKGdldERldmljZSgpLmluc3RhbGxQYWNrYWdlKAorICAgICAgICAgICAgICAgIG1CdWlsZEhlbHBlci5nZXRUZXN0RmlsZShBUEtfMDAwMDAwMDAwMDAwZmZmZiksIGZhbHNlLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRUcnVlKGdldERldmljZSgpLmdldEluc3RhbGxlZFBhY2thZ2VOYW1lcygpLmNvbnRhaW5zKFBLRykpOworICAgICAgICBydW5EZXZpY2VUZXN0c0FzQ3VycmVudFVzZXIoInRlc3RDaGVja1ZlcnNpb24iKTsKKyAgICAgICAgZ2V0RGV2aWNlKCkudW5pbnN0YWxsUGFja2FnZShQS0cpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsTWFqb3JWZXJzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydE51bGwoZ2V0RGV2aWNlKCkuaW5zdGFsbFBhY2thZ2UoCisgICAgICAgICAgICAgICAgbUJ1aWxkSGVscGVyLmdldFRlc3RGaWxlKEFQS18wMDAwMDBmZjAwMDAwMDAwKSwgZmFsc2UsIGZhbHNlKSk7CisgICAgICAgIGFzc2VydFRydWUoZ2V0RGV2aWNlKCkuZ2V0SW5zdGFsbGVkUGFja2FnZU5hbWVzKCkuY29udGFpbnMoUEtHKSk7CisgICAgICAgIHJ1bkRldmljZVRlc3RzQXNDdXJyZW50VXNlcigidGVzdENoZWNrVmVyc2lvbiIpOworICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKFBLRyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEluc3RhbGxVcGRhdGVBY3Jvc3NNaW5vck1ham9yVmVyc2lvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnROdWxsKGdldERldmljZSgpLmluc3RhbGxQYWNrYWdlKAorICAgICAgICAgICAgICAgIG1CdWlsZEhlbHBlci5nZXRUZXN0RmlsZShBUEtfMDAwMDAwMDAwMDAwZmZmZiksIGZhbHNlLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRUcnVlKGdldERldmljZSgpLmdldEluc3RhbGxlZFBhY2thZ2VOYW1lcygpLmNvbnRhaW5zKFBLRykpOworICAgICAgICBydW5EZXZpY2VUZXN0c0FzQ3VycmVudFVzZXIoInRlc3RDaGVja1ZlcnNpb24iKTsKKyAgICAgICAgYXNzZXJ0TnVsbChnZXREZXZpY2UoKS5pbnN0YWxsUGFja2FnZSgKKyAgICAgICAgICAgICAgICBtQnVpbGRIZWxwZXIuZ2V0VGVzdEZpbGUoQVBLXzAwMDAwMDAwZmZmZmZmZmYpLCB0cnVlLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRUcnVlKGdldERldmljZSgpLmdldEluc3RhbGxlZFBhY2thZ2VOYW1lcygpLmNvbnRhaW5zKFBLRykpOworICAgICAgICBydW5EZXZpY2VUZXN0c0FzQ3VycmVudFVzZXIoInRlc3RDaGVja1ZlcnNpb24iKTsKKyAgICAgICAgYXNzZXJ0TnVsbChnZXREZXZpY2UoKS5pbnN0YWxsUGFja2FnZSgKKyAgICAgICAgICAgICAgICBtQnVpbGRIZWxwZXIuZ2V0VGVzdEZpbGUoQVBLXzAwMDAwMGZmMDAwMDAwMDApLCB0cnVlLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRUcnVlKGdldERldmljZSgpLmdldEluc3RhbGxlZFBhY2thZ2VOYW1lcygpLmNvbnRhaW5zKFBLRykpOworICAgICAgICBydW5EZXZpY2VUZXN0c0FzQ3VycmVudFVzZXIoInRlc3RDaGVja1ZlcnNpb24iKTsKKyAgICAgICAgYXNzZXJ0TnVsbChnZXREZXZpY2UoKS5pbnN0YWxsUGFja2FnZSgKKyAgICAgICAgICAgICAgICBtQnVpbGRIZWxwZXIuZ2V0VGVzdEZpbGUoQVBLXzAwMDAwMGZmZmZmZmZmZmYpLCB0cnVlLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRUcnVlKGdldERldmljZSgpLmdldEluc3RhbGxlZFBhY2thZ2VOYW1lcygpLmNvbnRhaW5zKFBLRykpOworICAgICAgICBydW5EZXZpY2VUZXN0c0FzQ3VycmVudFVzZXIoInRlc3RDaGVja1ZlcnNpb24iKTsKKyAgICAgICAgZ2V0RGV2aWNlKCkudW5pbnN0YWxsUGFja2FnZShQS0cpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsRG93bmdyYWRlQWNyb3NzTWFqb3JNaW5vclZlcnNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0TnVsbChnZXREZXZpY2UoKS5pbnN0YWxsUGFja2FnZSgKKyAgICAgICAgICAgICAgICBtQnVpbGRIZWxwZXIuZ2V0VGVzdEZpbGUoQVBLXzAwMDAwMGZmZmZmZmZmZmYpLCBmYWxzZSwgZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShnZXREZXZpY2UoKS5nZXRJbnN0YWxsZWRQYWNrYWdlTmFtZXMoKS5jb250YWlucyhQS0cpKTsKKyAgICAgICAgcnVuRGV2aWNlVGVzdHNBc0N1cnJlbnRVc2VyKCJ0ZXN0Q2hlY2tWZXJzaW9uIik7CisgICAgICAgIGFzc2VydEVxdWFscygiSU5TVEFMTF9GQUlMRURfVkVSU0lPTl9ET1dOR1JBREUiLCBnZXREZXZpY2UoKS5pbnN0YWxsUGFja2FnZSgKKyAgICAgICAgICAgICAgICBtQnVpbGRIZWxwZXIuZ2V0VGVzdEZpbGUoQVBLXzAwMDAwMDAwZmZmZmZmZmYpLCB0cnVlLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRUcnVlKGdldERldmljZSgpLmdldEluc3RhbGxlZFBhY2thZ2VOYW1lcygpLmNvbnRhaW5zKFBLRykpOworICAgICAgICBydW5EZXZpY2VUZXN0c0FzQ3VycmVudFVzZXIoInRlc3RDaGVja1ZlcnNpb24iKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJTlNUQUxMX0ZBSUxFRF9WRVJTSU9OX0RPV05HUkFERSIsIGdldERldmljZSgpLmluc3RhbGxQYWNrYWdlKAorICAgICAgICAgICAgICAgIG1CdWlsZEhlbHBlci5nZXRUZXN0RmlsZShBUEtfMDAwMDAwZmYwMDAwMDAwMCksIHRydWUsIGZhbHNlKSk7CisgICAgICAgIGFzc2VydFRydWUoZ2V0RGV2aWNlKCkuZ2V0SW5zdGFsbGVkUGFja2FnZU5hbWVzKCkuY29udGFpbnMoUEtHKSk7CisgICAgICAgIHJ1bkRldmljZVRlc3RzQXNDdXJyZW50VXNlcigidGVzdENoZWNrVmVyc2lvbiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIklOU1RBTExfRkFJTEVEX1ZFUlNJT05fRE9XTkdSQURFIiwgZ2V0RGV2aWNlKCkuaW5zdGFsbFBhY2thZ2UoCisgICAgICAgICAgICAgICAgbUJ1aWxkSGVscGVyLmdldFRlc3RGaWxlKEFQS18wMDAwMDAwMDAwMDBmZmZmKSwgdHJ1ZSwgZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShnZXREZXZpY2UoKS5nZXRJbnN0YWxsZWRQYWNrYWdlTmFtZXMoKS5jb250YWlucyhQS0cpKTsKKyAgICAgICAgcnVuRGV2aWNlVGVzdHNBc0N1cnJlbnRVc2VyKCJ0ZXN0Q2hlY2tWZXJzaW9uIik7CisgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoUEtHKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcnVuRGV2aWNlVGVzdHNBc0N1cnJlbnRVc2VyKFN0cmluZyB0ZXN0TWV0aG9kTmFtZSkKKyAgICAgICAgICAgIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24geworICAgICAgICBydW5EZXZpY2VUZXN0c0FzQ3VycmVudFVzZXIoUEtHLCBQS0cgKyAiLlZlcnNpb25UZXN0IiwgdGVzdE1ldGhvZE5hbWUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBydW5EZXZpY2VUZXN0c0FzQ3VycmVudFVzZXIoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgdGVzdENsYXNzTmFtZSwgU3RyaW5nIHRlc3RNZXRob2ROYW1lKQorICAgICAgICAgICAgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7CisgICAgICAgIFV0aWxzLnJ1bkRldmljZVRlc3RzQXNDdXJyZW50VXNlcihnZXREZXZpY2UoKSwgcGFja2FnZU5hbWUsIHRlc3RDbGFzc05hbWUsIHRlc3RNZXRob2ROYW1lKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3NyYy9hbmRyb2lkL2FwcHNlY3VyaXR5L2N0cy9PdmVybGF5SG9zdFRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvc3JjL2FuZHJvaWQvYXBwc2VjdXJpdHkvY3RzL092ZXJsYXlIb3N0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZDY4NzcKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3NyYy9hbmRyb2lkL2FwcHNlY3VyaXR5L2N0cy9PdmVybGF5SG9zdFRlc3QuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5hcHBzZWN1cml0eS5jdHM7CisKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CitpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQuYnVpbGQuQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmJ1aWxkLklCdWlsZEluZm87CitpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuRGV2aWNlVGVzdENhc2U7CitpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSUJ1aWxkUmVjZWl2ZXI7CisKK0BBcHBNb2RlRnVsbCAvLyBUT0RPOiBOZWVkcyBwb3J0aW5nIHRvIGluc3RhbnQKK3B1YmxpYyBjbGFzcyBPdmVybGF5SG9zdFRlc3QgZXh0ZW5kcyBEZXZpY2VUZXN0Q2FzZSBpbXBsZW1lbnRzIElCdWlsZFJlY2VpdmVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEtHID0gImNvbS5hbmRyb2lkLmN0cy5vdmVybGF5YXBwIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBLID0gIkN0c092ZXJsYXlBcHAuYXBrIjsKKyAgICBwcml2YXRlIENvbXBhdGliaWxpdHlCdWlsZEhlbHBlciBtQnVpbGRIZWxwZXI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKFBLRyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZ2V0RGV2aWNlKCkudW5pbnN0YWxsUGFja2FnZShQS0cpOworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldEJ1aWxkKElCdWlsZEluZm8gYnVpbGRJbmZvKSB7CisgICAgICAgIG1CdWlsZEhlbHBlciA9IG5ldyBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIoYnVpbGRJbmZvKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbGluZ092ZXJsYXlIYXNOb0VmZmVjdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRGYWxzZShnZXREZXZpY2UoKS5nZXRJbnN0YWxsZWRQYWNrYWdlTmFtZXMoKS5jb250YWlucyhQS0cpKTsKKworICAgICAgICAvLyBUcnkgdG8gaW5zdGFsbCB0aGUgb3ZlcmxheSwgYnV0IGV4cGVjdCBhbiBlcnJvci4KKyAgICAgICAgYXNzZXJ0Tm90TnVsbChnZXREZXZpY2UoKS5pbnN0YWxsUGFja2FnZShtQnVpbGRIZWxwZXIuZ2V0VGVzdEZpbGUoQVBLKSwgZmFsc2UsIGZhbHNlKSk7CisKKyAgICAgICAgLy8gVGhlIGluc3RhbGwgc2hvdWxkIGhhdmUgZmFpbGVkLgorICAgICAgICBhc3NlcnRGYWxzZShnZXREZXZpY2UoKS5nZXRJbnN0YWxsZWRQYWNrYWdlTmFtZXMoKS5jb250YWlucyhQS0cpKTsKKworICAgICAgICAvLyBUaGUgcGFja2FnZSBvZiB0aGUgaW5zdGFsbGVkIG92ZXJsYXkgc2hvdWxkIG5vdCBhcHBlYXIgaW4gdGhlIG92ZXJsYXkgbWFuYWdlciBsaXN0LgorICAgICAgICBhc3NlcnRGYWxzZShnZXREZXZpY2UoKS5leGVjdXRlU2hlbGxDb21tYW5kKCJjbWQgb3ZlcmxheSBsaXN0IikuY29udGFpbnMoUEtHKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3NyYy9hbmRyb2lkL2FwcHNlY3VyaXR5L2N0cy9QYWNrYWdlUmVzb2x1dGlvbkhvc3RUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3NyYy9hbmRyb2lkL2FwcHNlY3VyaXR5L2N0cy9QYWNrYWdlUmVzb2x1dGlvbkhvc3RUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMzN2Q5NwotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvc3JjL2FuZHJvaWQvYXBwc2VjdXJpdHkvY3RzL1BhY2thZ2VSZXNvbHV0aW9uSG9zdFRlc3QuamF2YQpAQCAtMCwwICsxLDgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYXBwc2VjdXJpdHkuY3RzOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC5idWlsZC5Db21wYXRpYmlsaXR5QnVpbGRIZWxwZXI7CitpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLkRldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5EZXZpY2VKVW5pdDRDbGFzc1J1bm5lcjsKKworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKKworLyoqCisgKiBUZXN0cyBmb3IgcGFja2FnZSByZXNvbHV0aW9uLgorICovCitAUnVuV2l0aChEZXZpY2VKVW5pdDRDbGFzc1J1bm5lci5jbGFzcykKK3B1YmxpYyBjbGFzcyBQYWNrYWdlUmVzb2x1dGlvbkhvc3RUZXN0IGV4dGVuZHMgQmFzZUFwcFNlY3VyaXR5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElOWV9BUEsgPSAiQ3RzT3JkZXJlZEFjdGl2aXR5QXBwLmFwayI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRJTllfUEtHID0gImFuZHJvaWQuYXBwc2VjdXJpdHkuY3RzLm9yZGVyZWRhY3Rpdml0eSI7CisKKyAgICBwcml2YXRlIFN0cmluZyBtT2xkVmVyaWZpZXJWYWx1ZTsKKyAgICBwcml2YXRlIENvbXBhdGliaWxpdHlCdWlsZEhlbHBlciBtQnVpbGRIZWxwZXI7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgZ2V0RGV2aWNlKCkudW5pbnN0YWxsUGFja2FnZShUSU5ZX1BLRyk7CisgICAgICAgIG1CdWlsZEhlbHBlciA9IG5ldyBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIoZ2V0QnVpbGQoKSk7CisgICAgfQorCisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZ2V0RGV2aWNlKCkudW5pbnN0YWxsUGFja2FnZShUSU5ZX1BLRyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gVE9ETzogTmVlZHMgcG9ydGluZyB0byBpbnN0YW50CisgICAgcHVibGljIHZvaWQgdGVzdFJlc29sdmVPcmRlcmVkQWN0aXZpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZ2V0RGV2aWNlKCkuaW5zdGFsbFBhY2thZ2UobUJ1aWxkSGVscGVyLmdldFRlc3RGaWxlKFRJTllfQVBLKSwgdHJ1ZSk7CisgICAgICAgIFV0aWxzLnJ1bkRldmljZVRlc3RzQXNDdXJyZW50VXNlcihnZXREZXZpY2UoKSwgVElOWV9QS0csCisgICAgICAgICAgICAgICAgIi5QYWNrYWdlUmVzb2x1dGlvblRlc3QiLCAicXVlcnlBY3Rpdml0eU9yZGVyZWQiKTsKKyAgICAgICAgZ2V0RGV2aWNlKCkudW5pbnN0YWxsUGFja2FnZShUSU5ZX1BLRyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gVE9ETzogTmVlZHMgcG9ydGluZyB0byBpbnN0YW50CisgICAgcHVibGljIHZvaWQgdGVzdFJlc29sdmVPcmRlcmVkU2VydmljZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBnZXREZXZpY2UoKS5pbnN0YWxsUGFja2FnZShtQnVpbGRIZWxwZXIuZ2V0VGVzdEZpbGUoVElOWV9BUEspLCB0cnVlKTsKKyAgICAgICAgVXRpbHMucnVuRGV2aWNlVGVzdHNBc0N1cnJlbnRVc2VyKGdldERldmljZSgpLCBUSU5ZX1BLRywKKyAgICAgICAgICAgICAgICAiLlBhY2thZ2VSZXNvbHV0aW9uVGVzdCIsICJxdWVyeVNlcnZpY2VPcmRlcmVkIik7CisgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoVElOWV9QS0cpOworICAgIH0KKworICAgIEBUZXN0CisgICAgQEFwcE1vZGVGdWxsIC8vIFRPRE86IE5lZWRzIHBvcnRpbmcgdG8gaW5zdGFudAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlT3JkZXJlZFJlY2VpdmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGdldERldmljZSgpLmluc3RhbGxQYWNrYWdlKG1CdWlsZEhlbHBlci5nZXRUZXN0RmlsZShUSU5ZX0FQSyksIHRydWUpOworICAgICAgICBVdGlscy5ydW5EZXZpY2VUZXN0c0FzQ3VycmVudFVzZXIoZ2V0RGV2aWNlKCksIFRJTllfUEtHLAorICAgICAgICAgICAgICAgICIuUGFja2FnZVJlc29sdXRpb25UZXN0IiwgInF1ZXJ5UmVjZWl2ZXJPcmRlcmVkIik7CisgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoVElOWV9QS0cpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvc3JjL2FuZHJvaWQvYXBwc2VjdXJpdHkvY3RzL1BhY2thZ2VWaXNpYmlsaXR5VGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9zcmMvYW5kcm9pZC9hcHBzZWN1cml0eS9jdHMvUGFja2FnZVZpc2liaWxpdHlUZXN0LmphdmEKaW5kZXggMDMzZjI1Ny4uZmZjZTYxMyAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9zcmMvYW5kcm9pZC9hcHBzZWN1cml0eS9jdHMvUGFja2FnZVZpc2liaWxpdHlUZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9zcmMvYW5kcm9pZC9hcHBzZWN1cml0eS9jdHMvUGFja2FnZVZpc2liaWxpdHlUZXN0LmphdmEKQEAgLTE2LDExICsxNiwyMiBAQAogCiBwYWNrYWdlIGFuZHJvaWQuYXBwc2VjdXJpdHkuY3RzOwogCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uOworaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkRldmljZUpVbml0NENsYXNzUnVubmVyOworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCiAvKioKICAqIFRlc3RzIGZvciB2aXNpYmlsaXR5IG9mIHBhY2thZ2VzIGluc3RhbGxlZCBpbiBvbmUgdXNlciwgaW4gYSBkaWZmZXJlbnQgdXNlci4KICAqLworQFJ1bldpdGgoRGV2aWNlSlVuaXQ0Q2xhc3NSdW5uZXIuY2xhc3MpCiBwdWJsaWMgY2xhc3MgUGFja2FnZVZpc2liaWxpdHlUZXN0IGV4dGVuZHMgQmFzZUFwcFNlY3VyaXR5VGVzdCB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElOWV9BUEsgPSAiQ3RzUGtnSW5zdGFsbFRpbnlBcHAuYXBrIjsKQEAgLTM1LDggKzQ2LDggQEAKICAgICBwcml2YXRlIGludFtdIG1Vc2VyczsKICAgICBwcml2YXRlIFN0cmluZyBtT2xkVmVyaWZpZXJWYWx1ZTsKIAotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwUGFja2FnZSgpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIG1Vc2VycyA9IFV0aWxzLnByZXBhcmVNdWx0aXBsZVVzZXJzKGdldERldmljZSgpKTsKICAgICAgICAgbU9sZFZlcmlmaWVyVmFsdWUgPQpAQCAtNDcsMTQgKzU4LDE2IEBACiAgICAgICAgIGluc3RhbGxUZXN0QXBwRm9yVXNlcihURVNUX0FQSywgbVByaW1hcnlVc2VySWQpOwogICAgIH0KIAorICAgIEBBZnRlcgogICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoVEVTVF9QS0cpOwogICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKFRJTllfUEtHKTsKICAgICAgICAgZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZCgic2V0dGluZ3MgcHV0IGdsb2JhbCBwYWNrYWdlX3ZlcmlmaWVyX2VuYWJsZSAiCiAgICAgICAgICAgICAgICAgKyBtT2xkVmVyaWZpZXJWYWx1ZSk7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CiAgICAgfQogCisgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gVE9ETzogTmVlZHMgcG9ydGluZyB0byBpbnN0YW50CiAgICAgcHVibGljIHZvaWQgdGVzdFVuaW5zdGFsbGVkUGFja2FnZVZpc2liaWxpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFtU3VwcG9ydHNNdWx0aVVzZXIpIHsKICAgICAgICAgICAgIHJldHVybjsKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvc3JjL2FuZHJvaWQvYXBwc2VjdXJpdHkvY3RzL1Blcm1pc3Npb25zSG9zdFRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvc3JjL2FuZHJvaWQvYXBwc2VjdXJpdHkvY3RzL1Blcm1pc3Npb25zSG9zdFRlc3QuamF2YQppbmRleCA2MjBlODgxLi5lMDRiZjBhIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3NyYy9hbmRyb2lkL2FwcHNlY3VyaXR5L2N0cy9QZXJtaXNzaW9uc0hvc3RUZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9zcmMvYW5kcm9pZC9hcHBzZWN1cml0eS9jdHMvUGVybWlzc2lvbnNIb3N0VGVzdC5qYXZhCkBAIC0xNiw4ICsxNiwxMCBAQAogCiBwYWNrYWdlIGFuZHJvaWQuYXBwc2VjdXJpdHkuY3RzOwogCitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5QcmVzdWJtaXQ7CisKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC5idWlsZC5Db21wYXRpYmlsaXR5QnVpbGRIZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DZGRUZXN0OwogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmJ1aWxkLklCdWlsZEluZm87CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLkRldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5EZXZpY2VUZXN0Q2FzZTsKQEAgLTI5LDYgKzMxLDcgQEAKICAqIFNldCBvZiB0ZXN0cyB0aGF0IHZlcmlmeSBiZWhhdmlvciBvZiBydW50aW1lIHBlcm1pc3Npb25zLCBpbmNsdWRpbmcgYm90aAogICogZHluYW1pYyBncmFudGluZyBhbmQgYmVoYXZpb3Igb2YgbGVnYWN5IGFwcHMuCiAgKi8KK0BBcHBNb2RlRnVsbCAvLyBUT0RPOiBOZWVkcyBwb3J0aW5nIHRvIGluc3RhbnQKIHB1YmxpYyBjbGFzcyBQZXJtaXNzaW9uc0hvc3RUZXN0IGV4dGVuZHMgRGV2aWNlVGVzdENhc2UgaW1wbGVtZW50cyBJQWJpUmVjZWl2ZXIsIElCdWlsZFJlY2VpdmVyIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFU19QRVJNSVNTSU9OX1BLRyA9ICJjb20uYW5kcm9pZC5jdHMudXNlcGVybWlzc2lvbiI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVTQ0FMQVRFX1BFUk1JU1NJT05fUEtHID0gImNvbS5hbmRyb2lkLmN0cy5lc2NhbGF0ZS5wZXJtaXNzaW9uIjsKQEAgLTQ3LDYgKzUwLDEwIEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFQS19FU0NMQVRFX1RPX1JVTlRJTUVfUEVSTUlTU0lPTlMgPQogICAgICAgICAgICAgIkN0c0VzY2FsYXRlVG9SdW50aW1lUGVybWlzc2lvbnMuYXBrIjsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUEtfQUNDRVNTX1NFUklBTF9MRUdBQ1kgPSAiQ3RzQWNjZXNzU2VyaWFsTGVnYWN5LmFwayI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFQS19BQ0NFU1NfU0VSSUFMX01PREVSTiA9ICJDdHNBY2Nlc3NTZXJpYWxNb2Rlcm4uYXBrIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDRVNTX1NFUklBTF9QS0cgPSAiYW5kcm9pZC5vcy5jdHMiOworCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNDUkVFTl9PRkZfVElNRU9VVF9OUyA9ICJzeXN0ZW0iOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQ1JFRU5fT0ZGX1RJTUVPVVRfS0VZID0gInNjcmVlbl9vZmZfdGltZW91dCI7CiAgICAgcHJpdmF0ZSBTdHJpbmcgbVNjcmVlblRpbWVvdXRCZWZvcmVUZXN0OwpAQCAtNzUsNiArODIsNyBAQAogICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKFVTRVNfUEVSTUlTU0lPTl9QS0cpOwogICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKEVTQ0FMQVRFX1BFUk1JU1NJT05fUEtHKTsKICAgICAgICAgZ2V0RGV2aWNlKCkudW5pbnN0YWxsUGFja2FnZShQRVJNSVNTSU9OX1BPTElDWV8yNV9QS0cpOworICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKEFDQ0VTU19TRVJJQUxfUEtHKTsKIAogICAgICAgICAvLyBTZXQgc2NyZWVuIHRpbWVvdXQgdG8gMzAgbWluIHRvIG5vdCB0aW1lb3V0IHdoaWxlIHdhaXRpbmcgZm9yIFVJIHRvIGNoYW5nZQogICAgICAgICBtU2NyZWVuVGltZW91dEJlZm9yZVRlc3QgPSBnZXREZXZpY2UoKS5nZXRTZXR0aW5nKFNDUkVFTl9PRkZfVElNRU9VVF9OUywKQEAgLTk2LDYgKzEwNCw3IEBACiAgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoVVNFU19QRVJNSVNTSU9OX1BLRyk7CiAgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoRVNDQUxBVEVfUEVSTUlTU0lPTl9QS0cpOwogICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKFBFUk1JU1NJT05fUE9MSUNZXzI1X1BLRyk7CisgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoQUNDRVNTX1NFUklBTF9QS0cpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RGYWlsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0xNjgsNyArMTc3LDYgQEAKICAgICAgICAgICAgICAgICAidGVzdEdyYW50ZWQiKTsKICAgICB9CiAKLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iOS4xL0MtMC0zIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW50ZXJhY3RpdmVHcmFudDIzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGFzc2VydE51bGwoZ2V0RGV2aWNlKCkuaW5zdGFsbFBhY2thZ2UobUJ1aWxkSGVscGVyLmdldFRlc3RGaWxlKEFQS18yMyksIGZhbHNlLCBmYWxzZSkpOwogICAgICAgICBydW5EZXZpY2VUZXN0cyhVU0VTX1BFUk1JU1NJT05fUEtHLCAiY29tLmFuZHJvaWQuY3RzLnVzZXBlcm1pc3Npb24uVXNlUGVybWlzc2lvblRlc3QyMyIsCkBAIC0yNjcsNiArMjc1LDcgQEAKICAgICAgICAgICAgICAgICAidGVzdFJlcXVlc3ROb25FeGlzdGVudFBlcm1pc3Npb24iKTsKICAgICB9CiAKKyAgICBAUHJlc3VibWl0CiAgICAgcHVibGljIHZvaWQgdGVzdFJlcXVlc3RQZXJtaXNzaW9uRnJvbVR3b0dyb3VwczIzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGFzc2VydE51bGwoZ2V0RGV2aWNlKCkuaW5zdGFsbFBhY2thZ2UobUJ1aWxkSGVscGVyLmdldFRlc3RGaWxlKEFQS18yMyksIGZhbHNlLCBmYWxzZSkpOwogICAgICAgICBydW5EZXZpY2VUZXN0cyhVU0VTX1BFUk1JU1NJT05fUEtHLCAiY29tLmFuZHJvaWQuY3RzLnVzZXBlcm1pc3Npb24uVXNlUGVybWlzc2lvblRlc3QyMyIsCkBAIC0zNDksOCArMzU4LDUxIEBACiAgICAgICAgICAgICAgICAgInRlc3ROb1Byb3RlY3Rpb25GbGFnc0FkZGVkVG9Ob25TaWduYXR1cmVQcm90ZWN0aW9uUGVybWlzc2lvbnMiKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGVnYWN5QXBwQWNjZXNzU2VyaWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydE51bGwoZ2V0RGV2aWNlKCkuaW5zdGFsbFBhY2thZ2UobUJ1aWxkSGVscGVyLmdldFRlc3RGaWxlKAorICAgICAgICAgICAgICAgIEFQS19QRVJNSVNTSU9OX1BPTElDWV8yNSksIGZhbHNlLCBmYWxzZSkpOworICAgICAgICBydW5EZXZpY2VUZXN0cyhQRVJNSVNTSU9OX1BPTElDWV8yNV9QS0csCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmN0cy5wZXJtaXNzaW9uLnBvbGljeS5QZXJtaXNzaW9uUG9saWN5VGVzdDI1IiwKKyAgICAgICAgICAgICAgICAidGVzdE5vUHJvdGVjdGlvbkZsYWdzQWRkZWRUb05vblNpZ25hdHVyZVByb3RlY3Rpb25QZXJtaXNzaW9ucyIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsUGVybWlzc2lvblJlcXVlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0TnVsbChnZXREZXZpY2UoKS5pbnN0YWxsUGFja2FnZShtQnVpbGRIZWxwZXIuZ2V0VGVzdEZpbGUoQVBLXzIzKSwgZmFsc2UsIGZhbHNlKSk7CisgICAgICAgIHJ1bkRldmljZVRlc3RzKFVTRVNfUEVSTUlTU0lPTl9QS0csICJjb20uYW5kcm9pZC5jdHMudXNlcGVybWlzc2lvbi5Vc2VQZXJtaXNzaW9uVGVzdDIzIiwKKyAgICAgICAgICAgICAgICAidGVzdE51bGxQZXJtaXNzaW9uUmVxdWVzdCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsQW5kUmVhbFBlcm1pc3Npb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0TnVsbChnZXREZXZpY2UoKS5pbnN0YWxsUGFja2FnZShtQnVpbGRIZWxwZXIuZ2V0VGVzdEZpbGUoQVBLXzIzKSwgZmFsc2UsIGZhbHNlKSk7CisgICAgICAgIHJ1bkRldmljZVRlc3RzKFVTRVNfUEVSTUlTU0lPTl9QS0csICJjb20uYW5kcm9pZC5jdHMudXNlcGVybWlzc2lvbi5Vc2VQZXJtaXNzaW9uVGVzdDIzIiwKKyAgICAgICAgICAgICAgICAidGVzdE51bGxBbmRSZWFsUGVybWlzc2lvbiIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkUGVybWlzc2lvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnROdWxsKGdldERldmljZSgpLmluc3RhbGxQYWNrYWdlKG1CdWlsZEhlbHBlci5nZXRUZXN0RmlsZShBUEtfMjMpLCBmYWxzZSwgZmFsc2UpKTsKKyAgICAgICAgcnVuRGV2aWNlVGVzdHMoVVNFU19QRVJNSVNTSU9OX1BLRywgImNvbS5hbmRyb2lkLmN0cy51c2VwZXJtaXNzaW9uLlVzZVBlcm1pc3Npb25UZXN0MjMiLAorICAgICAgICAgICAgICAgICJ0ZXN0SW52YWxpZFBlcm1pc3Npb24iKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxBY2Nlc3NQb2xpY3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gVmVyaWZ5IGxlZ2FjeSBhcHAgYmVoYXZpb3IKKyAgICAgICAgYXNzZXJ0TnVsbChnZXREZXZpY2UoKS5pbnN0YWxsUGFja2FnZShtQnVpbGRIZWxwZXIuZ2V0VGVzdEZpbGUoCisgICAgICAgICAgICAgICAgQVBLX0FDQ0VTU19TRVJJQUxfTEVHQUNZKSwgZmFsc2UsIGZhbHNlKSk7CisgICAgICAgIHJ1bkRldmljZVRlc3RzKEFDQ0VTU19TRVJJQUxfUEtHLAorICAgICAgICAgICAgICAgICJhbmRyb2lkLm9zLmN0cy5BY2Nlc3NTZXJpYWxMZWdhY3lUZXN0IiwKKyAgICAgICAgICAgICAgICAidGVzdEFjY2Vzc1NlcmlhbE5vUGVybWlzc2lvbk5lZWRlZCIpOworCisgICAgICAgIC8vIFZlcmlmeSBtb2Rlcm4gYXBwIGJlaGF2aW9yCisgICAgICAgIGFzc2VydE51bGwoZ2V0RGV2aWNlKCkuaW5zdGFsbFBhY2thZ2UobUJ1aWxkSGVscGVyLmdldFRlc3RGaWxlKAorICAgICAgICAgICAgICAgIEFQS19BQ0NFU1NfU0VSSUFMX01PREVSTiksIHRydWUsIGZhbHNlKSk7CisgICAgICAgIHJ1bkRldmljZVRlc3RzKEFDQ0VTU19TRVJJQUxfUEtHLAorICAgICAgICAgICAgICAgICJhbmRyb2lkLm9zLmN0cy5BY2Nlc3NTZXJpYWxNb2Rlcm5UZXN0IiwKKyAgICAgICAgICAgICAgICAidGVzdEFjY2Vzc1NlcmlhbFBlcm1pc3Npb25OZWVkZWQiKTsKKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgcnVuRGV2aWNlVGVzdHMoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgdGVzdENsYXNzTmFtZSwgU3RyaW5nIHRlc3RNZXRob2ROYW1lKQogICAgICAgICAgICAgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFV0aWxzLnJ1bkRldmljZVRlc3RzKGdldERldmljZSgpLCBwYWNrYWdlTmFtZSwgdGVzdENsYXNzTmFtZSwgdGVzdE1ldGhvZE5hbWUpOworICAgICAgICBVdGlscy5ydW5EZXZpY2VUZXN0c0FzQ3VycmVudFVzZXIoZ2V0RGV2aWNlKCksIHBhY2thZ2VOYW1lLCB0ZXN0Q2xhc3NOYW1lLCB0ZXN0TWV0aG9kTmFtZSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9zcmMvYW5kcm9pZC9hcHBzZWN1cml0eS9jdHMvUGtnSW5zdGFsbFNpZ25hdHVyZVZlcmlmaWNhdGlvblRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvc3JjL2FuZHJvaWQvYXBwc2VjdXJpdHkvY3RzL1BrZ0luc3RhbGxTaWduYXR1cmVWZXJpZmljYXRpb25UZXN0LmphdmEKaW5kZXggZjMyNDU3My4uODNhMjJjZiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9zcmMvYW5kcm9pZC9hcHBzZWN1cml0eS9jdHMvUGtnSW5zdGFsbFNpZ25hdHVyZVZlcmlmaWNhdGlvblRlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3NyYy9hbmRyb2lkL2FwcHNlY3VyaXR5L2N0cy9Qa2dJbnN0YWxsU2lnbmF0dXJlVmVyaWZpY2F0aW9uVGVzdC5qYXZhCkBAIC0xNiwxNiArMTYsMTggQEAKIAogcGFja2FnZSBhbmRyb2lkLmFwcHNlY3VyaXR5LmN0czsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ2RkVGVzdDsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlNlY3VyaXR5VGVzdDsKIAoraW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLmJ1aWxkLkNvbXBhdGliaWxpdHlCdWlsZEhlbHBlcjsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5idWlsZC5JQnVpbGRJbmZvOwogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5EZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb247CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuRGV2aWNlVGVzdENhc2U7CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSUJ1aWxkUmVjZWl2ZXI7CiAKLWltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuU2VjdXJpdHlUZXN0OwogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CkBAIC0zNSwxMCArMzcsMTQgQEAKIC8qKgogICogVGVzdHMgZm9yIEFQSyBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIGR1cmluZyBpbnN0YWxsYXRpb24uCiAgKi8KLUBDZGRUZXN0KHJlcXVpcmVtZW50PSI0L0MtMC0yIikKK0BBcHBNb2RlRnVsbCAvLyBUT0RPOiBOZWVkcyBwb3J0aW5nIHRvIGluc3RhbnQKIHB1YmxpYyBjbGFzcyBQa2dJbnN0YWxsU2lnbmF0dXJlVmVyaWZpY2F0aW9uVGVzdCBleHRlbmRzIERldmljZVRlc3RDYXNlIGltcGxlbWVudHMgSUJ1aWxkUmVjZWl2ZXIgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUEtHID0gImFuZHJvaWQuYXBwc2VjdXJpdHkuY3RzLnRpbnlhcHAiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QQU5JT05fVEVTVF9QS0cgPSAiYW5kcm9pZC5hcHBzZWN1cml0eS5jdHMudGlueWFwcF9jb21wYW5pb24iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERVZJQ0VfVEVTVFNfQVBLID0gIkN0c1YzU2lnbmluZ1NjaGVtZVJvdGF0aW9uVGVzdC5hcGsiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERVZJQ0VfVEVTVFNfUEtHID0gImFuZHJvaWQuYXBwc2VjdXJpdHkuY3RzLnYzcm90YXRpb250ZXN0cyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFVklDRV9URVNUU19DTEFTUyA9IERFVklDRV9URVNUU19QS0cgKyAiLlYzUm90YXRpb25UZXN0IjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9BUEtfUkVTT1VSQ0VfUFJFRklYID0gIi9wa2dzaWd2ZXJpZnkvIjsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERTQV9LRVlfTkFNRVMgPSB7IjEwMjQiLCAiMjA0OCIsICIzMDcyIn07CkBAIC02MSwxMiArNjcsMTQgQEAKICAgICAgICAgVXRpbHMucHJlcGFyZVNpbmdsZVVzZXIoZ2V0RGV2aWNlKCkpOwogICAgICAgICBhc3NlcnROb3ROdWxsKG1DdHNCdWlsZCk7CiAgICAgICAgIHVuaW5zdGFsbFBhY2thZ2UoKTsKKyAgICAgICAgdW5pbnN0YWxsQ29tcGFuaW9uUGFja2FnZSgpOworICAgICAgICBpbnN0YWxsRGV2aWNlVGVzdFBrZygpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB1bmluc3RhbGxQYWNrYWdlKCk7CisgICAgICAgICAgICB1bmluc3RhbGxQYWNrYWdlcygpOwogICAgICAgICB9IGNhdGNoIChEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gaWdub3JlZCkgewogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgc3VwZXIudGVhckRvd24oKTsKQEAgLTIzNyw2ICsyNDUsMTYgQEAKICAgICAgICAgICAgICAgICApOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsVjFTaWduYXR1cmVPbmx5RG9lc05vdFZlcmlmeSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBBUEsgc2lnbmVkIHdpdGggdjEgc2NoZW1lIG9ubHksIGJ1dCBub3QgYWxsIGRpZ2VzdHMgbWF0Y2ggdGhvc2UgcmVjb3JkZWQgaW4KKyAgICAgICAgLy8gTUVUQS1JTkYvTUFOSUZFU1QuTUYuCisgICAgICAgIFN0cmluZyBlcnJvciA9ICJNRVRBLUlORi9NQU5JRkVTVC5NRiBoYXMgaW52YWxpZCBkaWdlc3QiOworCisgICAgICAgIC8vIEJpdGZsaXAgaW4gY2xhc3Nlcy5kZXggb2Ygb3RoZXJ3aXNlIGdvb2QgZmlsZS4KKyAgICAgICAgYXNzZXJ0SW5zdGFsbEZhaWxzV2l0aEVycm9yKAorICAgICAgICAgICAgICAgICJ2MS1vbmx5LXdpdGgtdGFtcGVyZWQtY2xhc3Nlcy1kZXguYXBrIiwgZXJyb3IpOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsVjJTaWduYXR1cmVEb2VzTm90VmVyaWZ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIEFQSyBzaWduZWQgd2l0aCB2MiBzY2hlbWUgb25seSwgYnV0IHRoZSBzaWduYXR1cmUgb3ZlciBzaWduZWQtZGF0YSBkb2VzIG5vdCB2ZXJpZnkuCiAgICAgICAgIFN0cmluZyBlcnJvciA9ICJzaWduYXR1cmUgZGlkIG5vdCB2ZXJpZnkiOwpAQCAtNDcyLDkgKzQ5MCwxMCBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsRXBoZW1lcmFsUmVxdWlyZXNWMlNpZ25hdHVyZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgZXhwZWN0ZWROb1NpZ0Vycm9yID0gIk5vIEFQSyBTaWduYXR1cmUgU2NoZW1lIHYyIHNpZ25hdHVyZSBpbiBlcGhlbWVyYWwgcGFja2FnZSI7Ci0gICAgICAgIGFzc2VydEluc3RhbGxFcGhlbWVyYWxGYWlsc1dpdGhFcnJvcigidW5zaWduZWQtZXBoZW1lcmFsLmFwayIsIGV4cGVjdGVkTm9TaWdFcnJvcik7Ci0gICAgICAgIGFzc2VydEluc3RhbGxFcGhlbWVyYWxGYWlsc1dpdGhFcnJvcigidjEtb25seS1lcGhlbWVyYWwuYXBrIiwgZXhwZWN0ZWROb1NpZ0Vycm9yKTsKKyAgICAgICAgYXNzZXJ0SW5zdGFsbEVwaGVtZXJhbEZhaWxzV2l0aEVycm9yKCJ1bnNpZ25lZC1lcGhlbWVyYWwuYXBrIiwKKyAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGNvbGxlY3QgY2VydGlmaWNhdGVzIik7CisgICAgICAgIGFzc2VydEluc3RhbGxFcGhlbWVyYWxGYWlsc1dpdGhFcnJvcigidjEtb25seS1lcGhlbWVyYWwuYXBrIiwKKyAgICAgICAgICAgICAgICAibXVzdCBiZSBzaWduZWQgd2l0aCBBUEsgU2lnbmF0dXJlIFNjaGVtZSB2MiBvciBncmVhdGVyIik7CiAgICAgICAgIGFzc2VydEluc3RhbGxFcGhlbWVyYWxTdWNjZWVkcygidjItb25seS1lcGhlbWVyYWwuYXBrIik7CiAgICAgICAgIGFzc2VydEluc3RhbGxFcGhlbWVyYWxTdWNjZWVkcygidjEtdjItZXBoZW1lcmFsLmFwayIpOyAvLyBzaWduZWQgd2l0aCBib3RoIHNjaGVtZXMKICAgICB9CkBAIC01MDIsNiArNTIxLDI0MyBAQAogICAgICAgICBhc3NlcnRJbnN0YWxsRmFpbHNXaXRoRXJyb3IoInYyLW9ubHktc3RhcnRzLXdpdGgtZGV4LW1hZ2ljLmFwayIsIGVycm9yKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbFYzS2V5Um90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gdGVzdHMgdGhhdCBhIHYzIHNpZ25lZCBBUEsgd2l0aCBSU0Ega2V5IGNhbiByb3RhdGUgdG8gYSBuZXcga2V5CisgICAgICAgIGFzc2VydEluc3RhbGxTdWNjZWVkcygidjMtcnNhLXBrY3MxLXNoYTI1Ni0yMDQ4LTEuYXBrIik7CisgICAgICAgIGFzc2VydEluc3RhbGxTdWNjZWVkcygidjMtcnNhLXBrY3MxLXNoYTI1Ni0yMDQ4LTItd2l0aC1wb3JfMV8yLWZ1bGwtY2Fwcy5hcGsiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbFYzS2V5Um90YXRpb25Ub0FuY2VzdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHRlc3RzIHRoYXQgYSB2MyBzaWduZWQgQVBLIHdpdGggUlNBIGtleSBjYW5ub3QgYmUgdXBncmFkZWQgYnkgb25lIG9mIGl0cyBwYXN0IGNlcnRzCisgICAgICAgIGFzc2VydEluc3RhbGxTdWNjZWVkcygidjMtcnNhLXBrY3MxLXNoYTI1Ni0yMDQ4LTItd2l0aC1wb3JfMV8yLWZ1bGwtY2Fwcy5hcGsiKTsKKyAgICAgICAgYXNzZXJ0SW5zdGFsbEZhaWxzKCJ2My1yc2EtcGtjczEtc2hhMjU2LTIwNDgtMS5hcGsiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbFYzS2V5Um90YXRpb25Ub0FuY2VzdG9yV2l0aFJvbGxiYWNrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHRlc3RzIHRoYXQgYSB2MyBzaWduZWQgQVBLIHdpdGggUlNBIGtleSBjYW4gYmUgdXBncmFkZWQgYnkgb25lIG9mIGl0cyBwYXN0IGNlcnRzIGlmIGl0CisgICAgICAgIC8vIGhhcyBncmFudGVkIHRoYXQgY2VydCB0aGUgcm9sbGJhY2sgY2FwYWJpbGl0eQorICAgICAgICBhc3NlcnRJbnN0YWxsU3VjY2VlZHMoInYzLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC0yLXdpdGgtcG9yXzFfMi1mdWxsLWFuZC1yb2xsLWNhcHMuYXBrIik7CisgICAgICAgIGFzc2VydEluc3RhbGxTdWNjZWVkcygidjMtcnNhLXBrY3MxLXNoYTI1Ni0yMDQ4LTEuYXBrIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEluc3RhbGxWM0tleVJvdGF0aW9uTXVsdGlwbGVIb3BzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHRlc3RzIHRoYXQgYSB2MyBzaWduZWQgQVBLIHdpdGggUlNBIGtleSBjYW4gcm90YXRlIHRvIGEgbmV3IGtleSB3aGljaCBpcyB0aGUgcmVzdWx0IG9mCisgICAgICAgIC8vIG11bHRpcGxlIHJvdGF0aW9ucyBmcm9tIHRoZSBvcmlnaW5hbDogQVBLIHNpZ25lZCB3aXRoIGtleSAxIGNhbiBiZSB1cGRhdGVkIGJ5IGtleSAzLCB3aGVuCisgICAgICAgIC8vIGtleXMgd2VyZTogMSAtPiAyIC0+IDMKKyAgICAgICAgYXNzZXJ0SW5zdGFsbFN1Y2NlZWRzKCJ2My1yc2EtcGtjczEtc2hhMjU2LTIwNDgtMS5hcGsiKTsKKyAgICAgICAgYXNzZXJ0SW5zdGFsbFN1Y2NlZWRzKCJ2My1yc2EtcGtjczEtc2hhMjU2LTIwNDgtMy13aXRoLXBvcl8xXzJfMy1mdWxsLWNhcHMuYXBrIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEluc3RhbGxWM1BvclNpZ25lck1pc21hdGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHRlc3RzIHRoYXQgYW4gQVBLIHdpdGggYSBwcm9vZi1vZi1yb3RhdGlvbiBzdHJ1Y3QgdGhhdCBkb2Vzbid0IGluY2x1ZGUgdGhlIGN1cnJlbnQKKyAgICAgICAgLy8gc2lnbmluZyBjZXJ0aWZpY2F0ZSBmYWlscyB0byBpbnN0YWxsCisgICAgICAgIGFzc2VydEluc3RhbGxGYWlscygidjMtcnNhLXBrY3MxLXNoYTI1Ni0yMDQ4LTMtd2l0aC1wb3JfMV8yLWZ1bGwtY2Fwcy5hcGsiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbFYzS2V5Um90YXRpb25Xcm9uZ1BvcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyB0ZXN0cyB0aGF0IGEgdmFsaWQgQVBLIHdpdGggYSBwcm9vZi1vZi1yb3RhdGlvbiByZWNvcmQgY2FuJ3QgdXBncmFkZSBhbiBBUEsgd2l0aCBhCisgICAgICAgIC8vIHNpZ25pbmcgY2VydGlmaWNhdGUgdGhhdCBpc24ndCBpbiB0aGUgcHJvb2Ytb2Ytcm90YXRpb24gcmVjb3JkCisgICAgICAgIGFzc2VydEluc3RhbGxTdWNjZWVkcygidjMtcnNhLXBrY3MxLXNoYTI1Ni0yMDQ4LTEuYXBrIik7CisgICAgICAgIGFzc2VydEluc3RhbGxGYWlscygidjMtcnNhLXBrY3MxLXNoYTI1Ni0yMDQ4LTMtd2l0aC1wb3JfMl8zLWZ1bGwtY2Fwcy5hcGsiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbFYzS2V5Um90YXRpb25TaGFyZWRVaWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gdGVzdHMgdGhhdCBhIHYzIHNpZ25lZCBzaGFyZWRVaWQgQVBLIGNhbiBzdGlsbCBiZSBzaGFyZWRVaWQgd2l0aCBhcHBzIHdpdGggaXRzIG9sZGVyCisgICAgICAgIC8vIHNpZ25pbmcgY2VydGlmaWNhdGUsIGlmIGl0IHNvIGRlc2lyZXMKKyAgICAgICAgYXNzZXJ0SW5zdGFsbFN1Y2NlZWRzKCJ2My1yc2EtcGtjczEtc2hhMjU2LTIwNDgtMS1zaGFyZWRVaWQuYXBrIik7CisgICAgICAgIGFzc2VydEluc3RhbGxTdWNjZWVkcygKKyAgICAgICAgICAgICAgICAidjMtcnNhLXBrY3MxLXNoYTI1Ni0yMDQ4LTItd2l0aC1wb3JfMV8yLWZ1bGwtY2Fwcy1zaGFyZWRVaWQtY29tcGFuaW9uLmFwayIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsVjNLZXlSb3RhdGlvbk9sZGVyU2hhcmVkVWlkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gdGVzdHMgdGhhdCBhIHNoYXJlZFVpZCBBUEsgY2FuIHN0aWxsIGluc3RhbGwgd2l0aCBhbm90aGVyIGFwcCB0aGF0IGlzIHNpZ25lZCBieSBhIG5ld2VyCisgICAgICAgIC8vIHNpZ25pbmcgY2VydGlmaWNhdGUsIGJ1dCB3aGljaCBhbGxvd3Mgc2hhcmVkVWlkIHdpdGggdGhlIG9sZGVyIG9uZQorICAgICAgICBhc3NlcnRJbnN0YWxsU3VjY2VlZHMoCisgICAgICAgICAgICAgICAgInYzLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC0yLXdpdGgtcG9yXzFfMi1mdWxsLWNhcHMtc2hhcmVkVWlkLWNvbXBhbmlvbi5hcGsiKTsKKyAgICAgICAgYXNzZXJ0SW5zdGFsbFN1Y2NlZWRzKCJ2My1yc2EtcGtjczEtc2hhMjU2LTIwNDgtMS1zaGFyZWRVaWQuYXBrIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEluc3RhbGxWM0tleVJvdGF0aW9uU2hhcmVkVWlkTm9DYXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gdGVzdHMgdGhhdCBhIHYzIHNpZ25lZCBzaGFyZWRVaWQgQVBLIGNhbm5vdCBiZSBzaGFyZWRVaWQgd2l0aCBhcHBzIHdpdGggaXRzIG9sZGVyCisgICAgICAgIC8vIHNpZ25pbmcgY2VydGlmaWNhdGUsIHdoZW4gaXQgaGFzIG5vdCBncmFudGVkIHRoYXQgY2VydGlmaWNhdGUgdGhlIHNoYXJlZFVpZCBjYXBhYmlsaXR5CisgICAgICAgIGFzc2VydEluc3RhbGxTdWNjZWVkcygidjMtcnNhLXBrY3MxLXNoYTI1Ni0yMDQ4LTEtc2hhcmVkVWlkLmFwayIpOworICAgICAgICBhc3NlcnRJbnN0YWxsRmFpbHMoCisgICAgICAgICAgICAgICAgInYzLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC0yLXdpdGgtcG9yXzFfMi1uby1zaFVpZC1jYXAtc2hhcmVkVWlkLWNvbXBhbmlvbi5hcGsiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbFYzS2V5Um90YXRpb25PbGRlclNoYXJlZFVpZE5vQ2FwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHRlc3RzIHRoYXQgYSBzaGFyZWRVaWQgQVBLIHNpZ25lZCB3aXRoIGFuIG9sZCBjZXJ0aWZpY2F0ZSBjYW5ub3QgaW5zdGFsbCB3aXRoCisgICAgICAgIC8vIGFuIGFwcCBoYXZpbmcgYSBwcm9vZi1vZi1yb3RhdGlvbiBzdHJ1Y3R1cmUgdGhhdCBoYXNuJ3QgZ3JhbnRlZCB0aGUgb2xkZXIKKyAgICAgICAgLy8gY2VydGlmaWNhdGUgdGhlIHNoYXJlZFVpZCBjYXBhYmlsaXR5CisgICAgICAgIGFzc2VydEluc3RhbGxTdWNjZWVkcygKKyAgICAgICAgICAgICAgICAidjMtcnNhLXBrY3MxLXNoYTI1Ni0yMDQ4LTItd2l0aC1wb3JfMV8yLW5vLXNoVWlkLWNhcC1zaGFyZWRVaWQtY29tcGFuaW9uLmFwayIpOworICAgICAgICBhc3NlcnRJbnN0YWxsRmFpbHMoInYzLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC0xLXNoYXJlZFVpZC5hcGsiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbFYzTm9Sb3RhdGlvblNoYXJlZFVpZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyB0ZXN0cyB0aGF0IGEgc2hhcmVkVWlkIEFQSyBzaWduZWQgd2l0aCBhIG5ldyBjZXJ0aWZpY2F0ZSBpbnN0YWxscyB3aXRoCisgICAgICAgIC8vIGFuIGFwcCBoYXZpbmcgYSBwcm9vZi1vZi1yb3RhdGlvbiBzdHJ1Y3R1cmUgdGhhdCBoYXNuJ3QgZ3JhbnRlZCBhbiBvbGRlcgorICAgICAgICAvLyBjZXJ0aWZpY2F0ZSB0aGUgc2hhcmVkVWlkIGNhcGFiaWxpdHkKKyAgICAgICAgYXNzZXJ0SW5zdGFsbFN1Y2NlZWRzKAorICAgICAgICAgICAgICAgICJ2My1yc2EtcGtjczEtc2hhMjU2LTIwNDgtMi13aXRoLXBvcl8xXzItbm8tc2hVaWQtY2FwLXNoYXJlZFVpZC1jb21wYW5pb24uYXBrIik7CisgICAgICAgIGFzc2VydEluc3RhbGxTdWNjZWVkcygidjMtcnNhLXBrY3MxLXNoYTI1Ni0yMDQ4LTItc2hhcmVkVWlkLmFwayIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsVjNLZXlSb3RhdGlvblNpZ1Blcm0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gdGVzdHMgdGhhdCBhIHYzIHNpZ25lZCBBUEsgY2FuIHN0aWxsIGdldCBhIHNpZ25hdHVyZSBwZXJtaXNzaW9uIGZyb20gYW4gYXBwIHdpdGggaXRzCisgICAgICAgIC8vIG9sZGVyIHNpZ25pbmcgY2VydGlmaWNhdGUuCisgICAgICAgIGFzc2VydEluc3RhbGxTdWNjZWVkcygidjMtcnNhLXBrY3MxLXNoYTI1Ni0yMDQ4LTEtcGVybWRlZi5hcGsiKTsKKyAgICAgICAgYXNzZXJ0SW5zdGFsbFN1Y2NlZWRzKAorICAgICAgICAgICAgICAgICJ2My1yc2EtcGtjczEtc2hhMjU2LTIwNDgtMi13aXRoLXBvcl8xXzItZnVsbC1jYXBzLXBlcm1jbGktY29tcGFuaW9uLmFwayIpOworICAgICAgICBVdGlscy5ydW5EZXZpY2VUZXN0cyhnZXREZXZpY2UoKSwgREVWSUNFX1RFU1RTX1BLRywgREVWSUNFX1RFU1RTX0NMQVNTLCAidGVzdEhhc1Blcm0iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbFYzS2V5Um90YXRpb25PbGRlclNpZ1Blcm0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gdGVzdHMgdGhhdCBhbiBhcGsgd2l0aCBhbiBvbGRlciBzaWduaW5nIGNlcnRpZmljYXRlIHRoYW4gdGhlIG9uZSB3aGljaCBkZWZpbmVzIGEKKyAgICAgICAgLy8gc2lnbmF0dXJlIHBlcm1pc3Npb24gaXQgd2FudHMgZ2V0cyB0aGUgcGVybWlzc2lvbiBpZiB0aGUgZGVmaW5pbmcgQVBLIGdyYW50cyB0aGUKKyAgICAgICAgLy8gY2FwYWJpbGl0eQorICAgICAgICBhc3NlcnRJbnN0YWxsU3VjY2VlZHMoCisgICAgICAgICAgICAgICAgInYzLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC0yLXdpdGgtcG9yXzFfMi1mdWxsLWNhcHMtcGVybWRlZi5hcGsiKTsKKyAgICAgICAgYXNzZXJ0SW5zdGFsbFN1Y2NlZWRzKCJ2My1yc2EtcGtjczEtc2hhMjU2LTIwNDgtMS1wZXJtY2xpLWNvbXBhbmlvbi5hcGsiKTsKKyAgICAgICAgVXRpbHMucnVuRGV2aWNlVGVzdHMoZ2V0RGV2aWNlKCksIERFVklDRV9URVNUU19QS0csIERFVklDRV9URVNUU19DTEFTUywgInRlc3RIYXNQZXJtIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEluc3RhbGxWM0tleVJvdGF0aW9uU2lnUGVybU5vQ2FwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHRlc3RzIHRoYXQgYW4gQVBLIHNpZ25lZCBieSBhbiBvbGRlciBzaWduaW5nIGNlcnRpZmljYXRlIGlzIHVuYWJsZSB0byBnZXQgYSByZXF1ZXN0ZWQKKyAgICAgICAgLy8gc2lnbmF0dXJlIHBlcm1pc3Npb24gd2hlbiB0aGUgZGVmaW5pbmcgQVBLIGhhcyByb3RhdGVkIHRvIGEgbmV3ZXIgc2lnbmluZyBjZXJ0aWZpY2lhdGUKKyAgICAgICAgLy8gYW5kIGRvZXMgbm90IGdyYW50IHRoZSBwZXJtaXNzaW9uIGNhcGFiaWxpdHkgdG8gdGhlIG9sZGVyIGNlcnQKKyAgICAgICAgYXNzZXJ0SW5zdGFsbFN1Y2NlZWRzKCJ2My1yc2EtcGtjczEtc2hhMjU2LTIwNDgtMi13aXRoLXBvcl8xXzItbm8tcGVybS1jYXAtcGVybWRlZi5hcGsiKTsKKyAgICAgICAgYXNzZXJ0SW5zdGFsbFN1Y2NlZWRzKCJ2My1yc2EtcGtjczEtc2hhMjU2LTIwNDgtMS1wZXJtY2xpLWNvbXBhbmlvbi5hcGsiKTsKKyAgICAgICAgVXRpbHMucnVuRGV2aWNlVGVzdHMoZ2V0RGV2aWNlKCksIERFVklDRV9URVNUU19QS0csIERFVklDRV9URVNUU19DTEFTUywgInRlc3RIYXNOb1Blcm0iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbFYzS2V5Um90YXRpb25PbGRlclNpZ1Blcm1Ob0NhcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyB0ZXN0cyB0aGF0IGFuIEFQSyBzaWduZWQgYnkgYSBuZXdlciBzaWduaW5nIGNlcnRpZmljYXRlIHRoYW4gdGhlIEFQSyB3aGljaCBkZWZpbmVzIGEKKyAgICAgICAgLy8gc2lnbmF0dXJlIHBlcm1pc3Npb24gaXMgYWJsZSB0byBnZXQgdGhhdCBwZXJtaXNzaW9uLCBldmVuIGlmIHRoZSBuZXdlciBBUEsgZG9lcyBub3QKKyAgICAgICAgLy8gZ3JhbnQgdGhlIHBlcm1pc3Npb24gY2FwYWJpbGl0eSB0byB0aGUgb2xkZXIgc2lnbmluZyBjZXJ0aWZpY2F0ZS4KKyAgICAgICAgYXNzZXJ0SW5zdGFsbFN1Y2NlZWRzKCJ2My1yc2EtcGtjczEtc2hhMjU2LTIwNDgtMS1wZXJtZGVmLmFwayIpOworICAgICAgICBhc3NlcnRJbnN0YWxsU3VjY2VlZHMoCisgICAgICAgICAgICAgICAgInYzLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC0yLXdpdGgtcG9yXzFfMi1uby1wZXJtLWNhcC1wZXJtY2xpLWNvbXBhbmlvbi5hcGsiKTsKKyAgICAgICAgVXRpbHMucnVuRGV2aWNlVGVzdHMoZ2V0RGV2aWNlKCksIERFVklDRV9URVNUU19QS0csIERFVklDRV9URVNUU19DTEFTUywgInRlc3RIYXNQZXJtIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEluc3RhbGxWM05vUm90YXRpb25TaWdQZXJtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IGFuIEFQSywgd2hpY2ggd2FudHMgdG8gdXNlIGEgc2lnbmF0dXJlIHBlcm1pc3Npb24gZGVmaW5lZCBieSBhbiBBUEssIHdoaWNoCisgICAgICAgIC8vIGhhcyBub3QgZ3JhbnRlZCB0aGF0IGNhcGFiaWxpdHkgdG8gb2xkZXIgc2lnbmluZyBjZXJ0aWZpY2F0ZXMsIGNhbiBzdGlsbCBpbnN0YWxsCisgICAgICAgIGFzc2VydEluc3RhbGxTdWNjZWVkcygidjMtcnNhLXBrY3MxLXNoYTI1Ni0yMDQ4LTItd2l0aC1wb3JfMV8yLW5vLXBlcm0tY2FwLXBlcm1kZWYuYXBrIik7CisgICAgICAgIGFzc2VydEluc3RhbGxTdWNjZWVkcygidjMtcnNhLXBrY3MxLXNoYTI1Ni0yMDQ4LTItcGVybWNsaS1jb21wYW5pb24uYXBrIik7CisgICAgICAgIFV0aWxzLnJ1bkRldmljZVRlc3RzKGdldERldmljZSgpLCBERVZJQ0VfVEVTVFNfUEtHLCBERVZJQ0VfVEVTVFNfQ0xBU1MsICJ0ZXN0SGFzUGVybSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsVjNTaWdQZXJtRG91YmxlRGVmTmV3ZXJTdWNjZWVkcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCBpZiBhbiBhcHAgZGVmaW5lcyBhIHNpZ25hdHVyZSBwZXJtaXNzaW9uIGFscmVhZHkgZGVmaW5lZCBieSBhbm90aGVyIGFwcCwKKyAgICAgICAgLy8gaXQgc3VjY2Vzc2Z1bGx5IGluc3RhbGxzIGlmIHRoZSBvdGhlciBhcHAncyBzaWduaW5nIGNlcnQgaXMgaW4gaXRzIHBhc3Qgc2lnbmluZyBjZXJ0cyBhbmQKKyAgICAgICAgLy8gdGhlIHNpZ25hdHVyZSBwZXJtaXNzaW9uIGNhcGFiaWxpdHkgaXMgZ3JhbnRlZAorICAgICAgICBhc3NlcnRJbnN0YWxsU3VjY2VlZHMoInYzLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC0xLXBlcm1kZWYuYXBrIik7CisgICAgICAgIGFzc2VydEluc3RhbGxTdWNjZWVkcygidjMtcnNhLXBrY3MxLXNoYTI1Ni0yMDQ4LTItd2l0aF9wb3JfMV8yLXBlcm1kZWYtY29tcGFuaW9uLmFwayIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsVjNTaWdQZXJtRG91YmxlRGVmT2xkZXJTdWNjZWVkcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCBpZiBhbiBhcHAgZGVmaW5lcyBhIHNpZ25hdHVyZSBwZXJtaXNzaW9uIGFscmVhZHkgZGVmaW5lZCBieSBhbm90aGVyIGFwcCwKKyAgICAgICAgLy8gaXQgc3VjY2Vzc2Z1bGx5IGluc3RhbGxzIGlmIGl0IGlzIGluIHRoZSBvdGhlciBhcHAncyBwYXN0IHNpZ25pbmcgY2VydHMgYW5kIHRoZSBzaWduYXR1cmUKKyAgICAgICAgLy8gcGVybWlzc2lvbiBjYXBhYmlsaXR5IGlzIGdyYW50ZWQKKyAgICAgICAgYXNzZXJ0SW5zdGFsbFN1Y2NlZWRzKCJ2My1yc2EtcGtjczEtc2hhMjU2LTIwNDgtMi13aXRoX3Bvcl8xXzItcGVybWRlZi1jb21wYW5pb24uYXBrIik7CisgICAgICAgIGFzc2VydEluc3RhbGxTdWNjZWVkcygidjMtcnNhLXBrY3MxLXNoYTI1Ni0yMDQ4LTEtcGVybWRlZi5hcGsiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbFYzU2lnUGVybURvdWJsZURlZk5ld2VyTm9DYXBGYWlscygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCBpZiBhbiBhcHAgZGVmaW5lcyBhIHNpZ25hdHVyZSBwZXJtaXNzaW9uIGFscmVhZHkgZGVmaW5lZCBieSBhbm90aGVyIGFwcCwKKyAgICAgICAgLy8gaXQgZmFpbHMgdG8gaW5zdGFsbCBpZiB0aGUgb3RoZXIgYXBwJ3Mgc2lnbmluZyBjZXJ0IGlzIGluIGl0cyBwYXN0IHNpZ25pbmcgY2VydHMgYnV0IHRoZQorICAgICAgICAvLyBzaWduYXR1cmUgcGVybWlzc2lvbiBjYXBhYmlsaXR5IGlzIG5vdCBncmFudGVkCisgICAgICAgIGFzc2VydEluc3RhbGxTdWNjZWVkcygidjMtcnNhLXBrY3MxLXNoYTI1Ni0yMDQ4LTEtcGVybWRlZi5hcGsiKTsKKyAgICAgICAgYXNzZXJ0SW5zdGFsbEZhaWxzKAorICAgICAgICAgICAgICAgICJ2My1yc2EtcGtjczEtc2hhMjU2LTIwNDgtMi13aXRoX3Bvcl8xXzItbm8tcGVybS1jYXAtcGVybWRlZi1jb21wYW5pb24uYXBrIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEluc3RhbGxWM1NpZ1Blcm1Eb3VibGVEZWZPbGRlck5vQ2FwRmFpbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgaWYgYW4gYXBwIGRlZmluZXMgYSBzaWduYXR1cmUgcGVybWlzc2lvbiBhbHJlYWR5IGRlZmluZWQgYnkgYW5vdGhlciBhcHAsCisgICAgICAgIC8vIGl0IGZhaWxzIHRvIGluc3RhbGwgaWYgaXQgaXMgaW4gdGhlIG90aGVyIGFwcCdzIHBhc3Qgc2lnbmluZyBjZXJ0cyBidXQgdGhlIHNpZ25hdHVyZQorICAgICAgICAvLyBwZXJtaXNzaW9uIGNhcGFiaWxpdHkgaXMgbm90IGdyYW50ZWQKKyAgICAgICAgYXNzZXJ0SW5zdGFsbFN1Y2NlZWRzKAorICAgICAgICAgICAgICAgICJ2My1yc2EtcGtjczEtc2hhMjU2LTIwNDgtMi13aXRoX3Bvcl8xXzItbm8tcGVybS1jYXAtcGVybWRlZi1jb21wYW5pb24uYXBrIik7CisgICAgICAgIGFzc2VydEluc3RhbGxGYWlscygidjMtcnNhLXBrY3MxLXNoYTI1Ni0yMDQ4LTEtcGVybWRlZi5hcGsiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbFYzU2lnUGVybURvdWJsZURlZlNhbWVOb0NhcFN1Y2NlZWRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IGlmIGFuIGFwcCBkZWZpbmVzIGEgc2lnbmF0dXJlIHBlcm1pc3Npb24gYWxyZWFkeSBkZWZpbmVkIGJ5IGFub3RoZXIgYXBwLAorICAgICAgICAvLyBpdCBpbnN0YWxscyBzdWNjZXNzZnVsbHkgd2hlbiBzaWduZWQgYnkgdGhlIHNhbWUgY2VydGlmaWNhdGUsIGV2ZW4gaWYgdGhlIG9yaWdpbmFsIGFwcAorICAgICAgICAvLyBkb2VzIG5vdCBncmFudCBzaWduYXR1cmUgY2FwYWJpbGl0aWVzIHRvIGl0cyBwYXN0IGNlcnRzCisgICAgICAgIGFzc2VydEluc3RhbGxTdWNjZWVkcygKKyAgICAgICAgICAgICAgICAidjMtcnNhLXBrY3MxLXNoYTI1Ni0yMDQ4LTItd2l0aF9wb3JfMV8yLW5vLXBlcm0tY2FwLXBlcm1kZWYtY29tcGFuaW9uLmFwayIpOworICAgICAgICBhc3NlcnRJbnN0YWxsU3VjY2VlZHMoInYzLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC0yLXBlcm1kZWYuYXBrIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEluc3RhbGxWM0tleVJvdGF0aW9uR2V0U2lnbmF0dXJlcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyB0ZXN0cyB0aGF0IGEgUGFja2FnZUluZm8gdy9HRVRfU0lHTkFUVVJFUyBmbGFnIHJldHVybnMgdGhlIG9sZGVyIGNlcnQKKyAgICAgICAgYXNzZXJ0SW5zdGFsbFN1Y2NlZWRzKCJ2My1yc2EtcGtjczEtc2hhMjU2LTIwNDgtMi13aXRoLXBvcl8xXzItZnVsbC1jYXBzLmFwayIpOworICAgICAgICBVdGlscy5ydW5EZXZpY2VUZXN0cygKKyAgICAgICAgICAgICAgICBnZXREZXZpY2UoKSwgREVWSUNFX1RFU1RTX1BLRywgREVWSUNFX1RFU1RTX0NMQVNTLCAidGVzdEdldFNpZ25hdHVyZXNTaG93c09sZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsVjNLZXlSb3RhdGlvbkdldFNpZ25pbmdDZXJ0aWZpY2F0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gdGVzdHMgdGhhdCBhIFBhY2thZ2VJbmZvIHcvR0VUX1NJR05JTkdfQ0VSVElGSUNBVEVTIGZsYWcgcmV0dXJucyB0aGUgb2xkIGFuZCBuZXcgY2VydHMKKyAgICAgICAgYXNzZXJ0SW5zdGFsbFN1Y2NlZWRzKCJ2My1yc2EtcGtjczEtc2hhMjU2LTIwNDgtMi13aXRoLXBvcl8xXzItZnVsbC1jYXBzLmFwayIpOworICAgICAgICBVdGlscy5ydW5EZXZpY2VUZXN0cygKKyAgICAgICAgICAgICAgICBnZXREZXZpY2UoKSwgREVWSUNFX1RFU1RTX1BLRywgREVWSUNFX1RFU1RTX0NMQVNTLAorICAgICAgICAgICAgICAgICJ0ZXN0R2V0U2lnbmluZ0NlcnRpZmljYXRlc1Nob3dzQWxsIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEluc3RhbGxWM0tleVJvdGF0aW9uSGFzU2lnbmluZ0NlcnRpZmljYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHRlc3RzIHRoYXQgaGFzU2lnbmluZ0NlcnRpZmljYXRlKCkgcmVjb2duaXplcyBwYXN0IGFuZCBjdXJyZW50IHNpZ25pbmcgY2VydHMKKyAgICAgICAgYXNzZXJ0SW5zdGFsbFN1Y2NlZWRzKCJ2My1yc2EtcGtjczEtc2hhMjU2LTIwNDgtMi13aXRoLXBvcl8xXzItZnVsbC1jYXBzLmFwayIpOworICAgICAgICBVdGlscy5ydW5EZXZpY2VUZXN0cygKKyAgICAgICAgICAgICAgICBnZXREZXZpY2UoKSwgREVWSUNFX1RFU1RTX1BLRywgREVWSUNFX1RFU1RTX0NMQVNTLAorICAgICAgICAgICAgICAgICJ0ZXN0SGFzU2lnbmluZ0NlcnRpZmljYXRlIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEluc3RhbGxWM0tleVJvdGF0aW9uSGFzU2lnbmluZ0NlcnRpZmljYXRlU2hhMjU2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHRlc3RzIHRoYXQgaGFzU2lnbmluZ0NlcnRpZmljYXRlKCkgcmVjb2duaXplcyBwYXN0IGFuZCBjdXJyZW50IHNpZ25pbmcgY2VydHMgYnkgc2hhMjU2CisgICAgICAgIGFzc2VydEluc3RhbGxTdWNjZWVkcygidjMtcnNhLXBrY3MxLXNoYTI1Ni0yMDQ4LTItd2l0aC1wb3JfMV8yLWZ1bGwtY2Fwcy5hcGsiKTsKKyAgICAgICAgVXRpbHMucnVuRGV2aWNlVGVzdHMoCisgICAgICAgICAgICAgICAgZ2V0RGV2aWNlKCksIERFVklDRV9URVNUU19QS0csIERFVklDRV9URVNUU19DTEFTUywKKyAgICAgICAgICAgICAgICAidGVzdEhhc1NpZ25pbmdDZXJ0aWZpY2F0ZVNoYTI1NiIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsVjNLZXlSb3RhdGlvbkhhc1NpZ25pbmdDZXJ0aWZpY2F0ZUJ5VWlkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHRlc3RzIHRoYXQgaGFzU2lnbmluZ0NlcnRpZmljYXRlKCkgcmVjb2duaXplcyBwYXN0IGFuZCBjdXJyZW50IHNpZ25pbmcgY2VydHMgYnkgdWlkCisgICAgICAgIGFzc2VydEluc3RhbGxTdWNjZWVkcygidjMtcnNhLXBrY3MxLXNoYTI1Ni0yMDQ4LTItd2l0aC1wb3JfMV8yLWZ1bGwtY2Fwcy5hcGsiKTsKKyAgICAgICAgVXRpbHMucnVuRGV2aWNlVGVzdHMoCisgICAgICAgICAgICAgICAgZ2V0RGV2aWNlKCksIERFVklDRV9URVNUU19QS0csIERFVklDRV9URVNUU19DTEFTUywKKyAgICAgICAgICAgICAgICAidGVzdEhhc1NpZ25pbmdDZXJ0aWZpY2F0ZUJ5VWlkIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEluc3RhbGxWM0tleVJvdGF0aW9uSGFzU2lnbmluZ0NlcnRpZmljYXRlQnlVaWRTaGEyNTYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gdGVzdHMgdGhhdCBoYXNTaWduaW5nQ2VydGlmaWNhdGUoKSByZWNvZ25pemVzIHBhc3QgYW5kIGN1cnJlbnQgc2lnbmluZyBjZXJ0cyBieSB1aWQKKyAgICAgICAgLy8gYW5kIHNoYTI1NgorICAgICAgICBhc3NlcnRJbnN0YWxsU3VjY2VlZHMoInYzLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC0yLXdpdGgtcG9yXzFfMi1mdWxsLWNhcHMuYXBrIik7CisgICAgICAgIFV0aWxzLnJ1bkRldmljZVRlc3RzKAorICAgICAgICAgICAgICAgIGdldERldmljZSgpLCBERVZJQ0VfVEVTVFNfUEtHLCBERVZJQ0VfVEVTVFNfQ0xBU1MsCisgICAgICAgICAgICAgICAgInRlc3RIYXNTaWduaW5nQ2VydGlmaWNhdGVCeVVpZFNoYTI1NiIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsVjNLZXlSb3RhdGlvbkhhc0R1cGxpY2F0ZVNpZ25pbmdDZXJ0aWZpY2F0ZUhpc3RvcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gdGVzdHMgdGhhdCBhbiBhcHAncyBwcm9vZi1vZi1yb3RhdGlvbiBzaWduaW5nIGhpc3RvcnkgY2Fubm90IGNvbnRhaW4gdGhlIHNhbWUgY2VydGlmaWNhdGUKKyAgICAgICAgLy8gbW9yZSB0aGFuIG9uY2UuCisgICAgICAgIGFzc2VydEluc3RhbGxGYWlscygidjMtcnNhLXBrY3MxLXNoYTI1Ni0yMDQ4LTItd2l0aC1wb3JfMV8yXzItZnVsbC1jYXBzLmFwayIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsVjNIYXNNdWx0aXBsZVNpZ25lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gdGVzdHMgdGhhdCBhbiBhcHAgY2FuJ3QgYmUgc2lnbmVkIGJ5IG11bHRpcGxlIHNpZ25lcnMgd2hlbiB1c2luZyB2MyBzaWduYXR1cmUgc2NoZW1lCisgICAgICAgIGFzc2VydEluc3RhbGxGYWlscygidjMtcnNhLXBrY3MxLXNoYTI1Ni0yMDQ4LTFfYW5kXzIuYXBrIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEluc3RhbGxWM0hhc011bHRpcGxlUGxhdGZvcm1TaWduZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHRlc3RzIHRoYXQgYW4gYXBwIGNhbiBiZSBzaWduZWQgYnkgbXVsdGlwbGUgdjMgc2lnbmVycyBpZiB0aGV5IHRhcmdldCBkaWZmZXJlbnQgcGxhdGZvcm0KKyAgICAgICAgLy8gdmVyc2lvbnMKKyAgICAgICAgYXNzZXJ0SW5zdGFsbFN1Y2NlZWRzKCJ2My1yc2EtcGtjczEtc2hhMjU2LTIwNDgtMV9QX2FuZF8yX1FwbHVzLmFwayIpOworICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCBhc3NlcnRJbnN0YWxsU3VjY2VlZHMoU3RyaW5nIGFwa0ZpbGVuYW1lSW5SZXNvdXJjZXMpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBTdHJpbmcgaW5zdGFsbFJlc3VsdCA9IGluc3RhbGxQYWNrYWdlRnJvbVJlc291cmNlKGFwa0ZpbGVuYW1lSW5SZXNvdXJjZXMpOwogICAgICAgICBpZiAoaW5zdGFsbFJlc3VsdCAhPSBudWxsKSB7CkBAIC01NzgsNiArODM0LDEzIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgaW5zdGFsbERldmljZVRlc3RQa2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyIGJ1aWxkSGVscGVyID0gbmV3IENvbXBhdGliaWxpdHlCdWlsZEhlbHBlcihtQ3RzQnVpbGQpOworICAgICAgICBGaWxlIGFwayA9IGJ1aWxkSGVscGVyLmdldFRlc3RGaWxlKERFVklDRV9URVNUU19BUEspOworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gZ2V0RGV2aWNlKCkuaW5zdGFsbFBhY2thZ2UoYXBrLCB0cnVlKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiZmFpbGVkIHRvIGluc3RhbGwgIiArIERFVklDRV9URVNUU19BUEsgKyAiLCBSZWFzb246ICIgKyByZXN1bHQsIHJlc3VsdCk7CisgICAgfQorCiAgICAgcHJpdmF0ZSBTdHJpbmcgaW5zdGFsbFBhY2thZ2VGcm9tUmVzb3VyY2UoU3RyaW5nIGFwa0ZpbGVuYW1lSW5SZXNvdXJjZXMsIGJvb2xlYW4gZXBoZW1lcmFsKQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewogICAgICAgICAvLyBJVGVzdERldmljZS5pbnN0YWxsUGFja2FnZSBBUEkgcmVxdWlyZXMgdGhlIEFQSyB0byBiZSBpbnN0YWxsIHRvIGJlIGEgRmlsZS4gV2UgdGh1cwpAQCAtNjIxLDQgKzg4NCwxOCBAQAogICAgIHByaXZhdGUgU3RyaW5nIHVuaW5zdGFsbFBhY2thZ2UoKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoVEVTVF9QS0cpOwogICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIHVuaW5zdGFsbENvbXBhbmlvblBhY2thZ2UoKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoQ09NUEFOSU9OX1RFU1RfUEtHKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyB1bmluc3RhbGxEZXZpY2VUZXN0UGFja2FnZSgpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2V0RGV2aWNlKCkudW5pbnN0YWxsUGFja2FnZShERVZJQ0VfVEVTVFNfUEtHKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdW5pbnN0YWxsUGFja2FnZXMoKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKKyAgICAgICAgdW5pbnN0YWxsUGFja2FnZSgpOworICAgICAgICB1bmluc3RhbGxDb21wYW5pb25QYWNrYWdlKCk7CisgICAgICAgIHVuaW5zdGFsbERldmljZVRlc3RQYWNrYWdlKCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9zcmMvYW5kcm9pZC9hcHBzZWN1cml0eS9jdHMvUHJpdmlsZWdlZFVwZGF0ZVRlc3RzLmphdmEgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3NyYy9hbmRyb2lkL2FwcHNlY3VyaXR5L2N0cy9Qcml2aWxlZ2VkVXBkYXRlVGVzdHMuamF2YQppbmRleCA2MzBmMzUxLi44Y2MxNDFkIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3NyYy9hbmRyb2lkL2FwcHNlY3VyaXR5L2N0cy9Qcml2aWxlZ2VkVXBkYXRlVGVzdHMuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3NyYy9hbmRyb2lkL2FwcHNlY3VyaXR5L2N0cy9Qcml2aWxlZ2VkVXBkYXRlVGVzdHMuamF2YQpAQCAtMTYsMjAgKzE2LDQ0IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5hcHBzZWN1cml0eS5jdHM7CiAKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CisKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC5idWlsZC5Db21wYXRpYmlsaXR5QnVpbGRIZWxwZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkxvZzsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5idWlsZC5JQnVpbGRJbmZvOwogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5EZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb247CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLklUZXN0RGV2aWNlOworaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLm1ldHJpY3MucHJvdG8uTWV0cmljTWVhc3VyZW1lbnQuTWV0cmljOworaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnJlc3VsdC5JVGVzdEludm9jYXRpb25MaXN0ZW5lcjsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5yZXN1bHQuVGVzdERlc2NyaXB0aW9uOworaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkFuZHJvaWRKVW5pdFRlc3Q7CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuRGV2aWNlVGVzdENhc2U7CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSUFiaTsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JQWJpUmVjZWl2ZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSUJ1aWxkUmVjZWl2ZXI7CitpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSW5zdHJ1bWVudGF0aW9uVGVzdDsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC51dGlsLkFiaUZvcm1hdHRlcjsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC51dGlsLkFiaVV0aWxzOwogCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKIC8qKgogICogVGVzdHMgdGhhdCB2ZXJpZnkgaW50ZW50IGZpbHRlcnMuCiAgKi8KK0BBcHBNb2RlRnVsbChyZWFzb249Ikluc3RhbnQgYXBwbGljYXRpb25zIGNhbiBuZXZlciBiZSBzeXN0ZW0gb3IgcHJpdmlsZWdlZCIpCiBwdWJsaWMgY2xhc3MgUHJpdmlsZWdlZFVwZGF0ZVRlc3RzIGV4dGVuZHMgRGV2aWNlVGVzdENhc2UgaW1wbGVtZW50cyBJQWJpUmVjZWl2ZXIsIElCdWlsZFJlY2VpdmVyIHsKKyAgICAvLy0tLS0tLS0tLS0gQkVHSU46IFRvIGhhbmRsZSB1cGRhdGVkIHRhcmdldCBTREs7IHJlbW92ZSBhcyBiLzEyODQzNjc1NyAtLS0tLS0tLS0tCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNISU1fVVBEQVRFX05FV19BUEsgPSAiQ3RzU2hpbVByaXZVcGdyYWRlUHJlYnVpbHRfdjI4LmFwayI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNISU1fVVBEQVRFX05FV19GQUlMX0FQSyA9ICJDdHNTaGltUHJpdlVwZ3JhZGVXcm9uZ1NIQVByZWJ1aWx0X3YyOC5hcGsiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1BSRVBBUkVSX0FQSyA9ICJDdHNQcml2aWxlZ2VkVXBkYXRlUHJlcGFyZXIuYXBrIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9QUkVQQVJFUl9QS0cgPSAiY29tLmFuZHJvaWQuY3RzLnByaXZpbGVnZWR1cGRhdGUucHJlcGFyZXIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfU0RLX01FVEhPRCA9ICJnZXRUYXJnZXRTZGsiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfU0RLX0tFWSA9ICJ0YXJnZXRfc2RrIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9UQVJHRVRfU0RLID0gMjQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5FV19UQVJHRVRfU0RLID0gMjg7CisgICAgcHJpdmF0ZSBpbnQgbVRhcmdldFNkayA9IDA7CisgICAgLy8tLS0tLS0tLS0tIEVORDogVG8gaGFuZGxlIHVwZGF0ZWQgdGFyZ2V0IFNESzsgcmVtb3ZlIGFzIGIvMTI4NDM2NzU3IC0tLS0tLS0tLS0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlByaXZpbGVnZWRVcGRhdGVUZXN0cyI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNISU1fUEtHID0gImNvbS5hbmRyb2lkLmN0cy5wcml2LmN0c3NoaW0iOwogICAgIC8qKiBQYWNrYWdlIG5hbWUgb2YgdGhlIHRlc3RzIHRvIGJlIHJ1biAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1BLRyA9ICJjb20uYW5kcm9pZC5jdHMucHJpdmlsZWdlZHVwZGF0ZSI7CkBAIC00OSw2ICs3MywxMSBAQAogICAgIHByaXZhdGUgSUFiaSBtQWJpOwogICAgIHByaXZhdGUgQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyIG1CdWlsZEhlbHBlcjsKIAorICAgIHByaXZhdGUgYm9vbGVhbiBpc0RlZmF1bHRBYmkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGRlZmF1bHRBYmkgPSBBYmlGb3JtYXR0ZXIuZ2V0RGVmYXVsdEFiaShnZXREZXZpY2UoKSwgbUFiaS5nZXRCaXRuZXNzKCkpOworICAgICAgICByZXR1cm4gbUFiaS5nZXROYW1lKCkuZXF1YWxzKGRlZmF1bHRBYmkpOworICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldEFiaShJQWJpIGFiaSkgewogICAgICAgICBtQWJpID0gYWJpOwpAQCAtNzIsNiArMTAxLDEwIEBACiAKICAgICAgICAgYXNzZXJ0TnVsbChnZXREZXZpY2UoKS5pbnN0YWxsUGFja2FnZShtQnVpbGRIZWxwZXIuZ2V0VGVzdEZpbGUoVEVTVF9BUEspLCBmYWxzZSkpOwogICAgICAgICBnZXREZXZpY2UoKS5leGVjdXRlU2hlbGxDb21tYW5kKCJwbSBlbmFibGUgIiArIFNISU1fUEtHKTsKKyAgICAgICAgaWYgKG1UYXJnZXRTZGsgPT0gMCkgeworICAgICAgICAgICAgbVRhcmdldFNkayA9IERFRkFVTFRfVEFSR0VUX1NESzsKKyAgICAgICAgICAgIHNldFRhcmdldFNkaygpOworICAgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC04Niw3ICsxMTksNyBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RQcml2aWxlZ2VkQXBwVXBncmFkZVJlc3RyaWN0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZ2V0RGV2aWNlKCkudW5pbnN0YWxsUGFja2FnZShTSElNX1BLRyk7CiAgICAgICAgIGFzc2VydEVxdWFscyhSRVNUUklDVEVEX1VQR1JBREVfRkFJTFVSRSwgZ2V0RGV2aWNlKCkuaW5zdGFsbFBhY2thZ2UoCi0gICAgICAgICAgICAgICAgbUJ1aWxkSGVscGVyLmdldFRlc3RGaWxlKFNISU1fVVBEQVRFX0ZBSUxfQVBLKSwgdHJ1ZSkpOworICAgICAgICAgICAgICAgIG1CdWlsZEhlbHBlci5nZXRUZXN0RmlsZShnZXRVcGRhdGVBcGsodHJ1ZSkpLCB0cnVlKSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdFN5c3RlbUFwcFByaW9yaXRpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTk4LDExICsxMzEsMTYgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHJpdmlsZWdlZEFwcFVwZ3JhZGVQcmlvcml0aWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghaXNEZWZhdWx0QWJpKCkpIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIlNraXBwaW5nIHRlc3QgZm9yIG5vbi1kZWZhdWx0IGFiaS4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCiAgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoU0hJTV9QS0cpOwogICAgICAgICAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGFzc2VydE51bGwoZ2V0RGV2aWNlKCkuaW5zdGFsbFBhY2thZ2UoCi0gICAgICAgICAgICAgICAgICAgIG1CdWlsZEhlbHBlci5nZXRUZXN0RmlsZShTSElNX1VQREFURV9BUEspLCB0cnVlKSk7CisgICAgICAgICAgICAgICAgICAgIG1CdWlsZEhlbHBlci5nZXRUZXN0RmlsZShnZXRVcGRhdGVBcGsoZmFsc2UpKSwgdHJ1ZSkpOwogICAgICAgICAgICAgcnVuRGV2aWNlVGVzdHMoVEVTVF9QS0csICIuUHJpdmlsZWdlZFVwZGF0ZVRlc3QiLCAidGVzdFByaXZpbGVnZWRBcHBVcGdyYWRlUHJpb3JpdGllcyIpOwogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgZ2V0RGV2aWNlKCkudW5pbnN0YWxsUGFja2FnZShTSElNX1BLRyk7CkBAIC0xMTcsMTEgKzE1NSwxNiBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3REaXNhYmxlVXBkYXRlZFN5c3RlbUFwcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIWlzRGVmYXVsdEFiaSgpKSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJTa2lwcGluZyB0ZXN0IGZvciBub24tZGVmYXVsdCBhYmkuIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKwogICAgICAgICBnZXREZXZpY2UoKS5leGVjdXRlU2hlbGxDb21tYW5kKCJwbSBlbmFibGUgIiArIFNISU1fUEtHKTsKICAgICAgICAgcnVuRGV2aWNlVGVzdHMoVEVTVF9QS0csICIuUHJpdmlsZWdlZEFwcERpc2FibGVUZXN0IiwgInRlc3RQcml2QXBwQW5kRW5hYmxlZCIpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgYXNzZXJ0TnVsbChnZXREZXZpY2UoKS5pbnN0YWxsUGFja2FnZSgKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkSGVscGVyLmdldFRlc3RGaWxlKFNISU1fVVBEQVRFX0FQSyksIHRydWUpKTsKKyAgICAgICAgICAgICAgICAgICAgbUJ1aWxkSGVscGVyLmdldFRlc3RGaWxlKGdldFVwZGF0ZUFwayhmYWxzZSkpLCB0cnVlKSk7CiAgICAgICAgICAgICBnZXREZXZpY2UoKS5leGVjdXRlU2hlbGxDb21tYW5kKCJwbSBkaXNhYmxlLXVzZXIgIiArIFNISU1fUEtHKTsKICAgICAgICAgICAgIHJ1bkRldmljZVRlc3RzKFRFU1RfUEtHLCAiLlByaXZpbGVnZWRBcHBEaXNhYmxlVGVzdCIsICJ0ZXN0VXBkYXRlZFByaXZBcHBBbmREaXNhYmxlZCIpOwogICAgICAgICAgICAgZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZCgicG0gZW5hYmxlICIgKyBTSElNX1BLRyk7CkBAIC0xMzUsNCArMTc4LDQzIEBACiAgICAgICAgICAgICB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKICAgICAgICAgVXRpbHMucnVuRGV2aWNlVGVzdHMoZ2V0RGV2aWNlKCksIHBhY2thZ2VOYW1lLCB0ZXN0Q2xhc3NOYW1lLCB0ZXN0TWV0aG9kTmFtZSk7CiAgICAgfQorCisgICAgLy8tLS0tLS0tLS0tIEJFR0lOOiBUbyBoYW5kbGUgdXBkYXRlZCB0YXJnZXQgU0RLOyByZW1vdmUgYXMgYi8xMjg0MzY3NTcgLS0tLS0tLS0tLQorICAgIHByaXZhdGUgU3RyaW5nIGdldFVwZGF0ZUFwayhib29sZWFuIGZhaWwpIHsKKyAgICAgICAgaWYgKG1UYXJnZXRTZGsgPT0gTkVXX1RBUkdFVF9TREspIHsKKyAgICAgICAgICAgIGlmIChmYWlsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFNISU1fVVBEQVRFX05FV19GQUlMX0FQSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBTSElNX1VQREFURV9ORVdfQVBLOworICAgICAgICB9CisgICAgICAgIGlmIChmYWlsKSB7CisgICAgICAgICAgICByZXR1cm4gU0hJTV9VUERBVEVfRkFJTF9BUEs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFNISU1fVVBEQVRFX0FQSzsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0VGFyZ2V0U2RrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIElUZXN0SW52b2NhdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRhcmdldFNka0xpc3RlbmVyKCk7CisgICAgICAgIEFuZHJvaWRKVW5pdFRlc3QgaW5zdHJUZXN0ID0gbmV3IEFuZHJvaWRKVW5pdFRlc3QoKTsKKyAgICAgICAgaW5zdHJUZXN0LnNldEluc3RhbGxGaWxlKG1CdWlsZEhlbHBlci5nZXRUZXN0RmlsZShURVNUX1BSRVBBUkVSX0FQSykpOworICAgICAgICBpbnN0clRlc3Quc2V0RGV2aWNlKGdldERldmljZSgpKTsKKyAgICAgICAgaW5zdHJUZXN0LnNldFBhY2thZ2VOYW1lKFRFU1RfUFJFUEFSRVJfUEtHKTsKKyAgICAgICAgaW5zdHJUZXN0LnJ1bihsaXN0ZW5lcik7CisgICAgfQorCisgICAgLyogU3BlY2lhbCBsaXN0ZW5lciB0byByZXRyaWV2ZSB0aGUgdGFyZ2V0IHNkayBmb3IgdGhlIGN0cyBzaGltICovCisgICAgcHJpdmF0ZSBjbGFzcyBUYXJnZXRTZGtMaXN0ZW5lciBpbXBsZW1lbnRzIElUZXN0SW52b2NhdGlvbkxpc3RlbmVyIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RFbmRlZChUZXN0RGVzY3JpcHRpb24gdGVzdCwgSGFzaE1hcDxTdHJpbmcsIE1ldHJpYz4gbWV0cmljcykgeworICAgICAgICAgICAgZmluYWwgTWV0cmljIHRhcmdldE1ldHJpYyA9IG1ldHJpY3MuZ2V0KFRBUkdFVF9TREtfS0VZKTsKKyAgICAgICAgICAgIGlmICh0YXJnZXRNZXRyaWMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVRhcmdldFNkayA9IEludGVnZXIucGFyc2VJbnQodGFyZ2V0TWV0cmljLmdldE1lYXN1cmVtZW50cygpLmdldFNpbmdsZVN0cmluZygpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBpZ25vcmUpIHsgfQorICAgICAgICB9CisgICAgfQorICAgIC8vLS0tLS0tLS0tLSBFTkQ6IFRvIGhhbmRsZSB1cGRhdGVkIHRhcmdldCBTREs7IHJlbW92ZSBhcyBiLzEyODQzNjc1NyAtLS0tLS0tLS0tCisKIH0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvc3JjL2FuZHJvaWQvYXBwc2VjdXJpdHkvY3RzL1Njb3BlZERpcmVjdG9yeUFjY2Vzc1Rlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvc3JjL2FuZHJvaWQvYXBwc2VjdXJpdHkvY3RzL1Njb3BlZERpcmVjdG9yeUFjY2Vzc1Rlc3QuamF2YQppbmRleCA4ODliMjBiLi5iNDBkODA2IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3NyYy9hbmRyb2lkL2FwcHNlY3VyaXR5L2N0cy9TY29wZWREaXJlY3RvcnlBY2Nlc3NUZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9zcmMvYW5kcm9pZC9hcHBzZWN1cml0eS9jdHMvU2NvcGVkRGlyZWN0b3J5QWNjZXNzVGVzdC5qYXZhCkBAIC0xNiw5ICsxNiwxMiBAQAogCiBwYWNrYWdlIGFuZHJvaWQuYXBwc2VjdXJpdHkuY3RzOwogCitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOworCiAvKioKICAqIFNldCBvZiB0ZXN0cyB0aGF0IHZlcmlmeSBiZWhhdmlvciBvZiB0aGUgU2NvcGVkIERpcmVjdG9yeSBhY2Nlc3MgQVBJLgogICovCitAQXBwTW9kZUZ1bGwgLy8gVE9ETzogTmVlZHMgcG9ydGluZyB0byBpbnN0YW50CiBwdWJsaWMgY2xhc3MgU2NvcGVkRGlyZWN0b3J5QWNjZXNzVGVzdCBleHRlbmRzIERvY3VtZW50c1Rlc3RDYXNlIHsKIAogICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkUGF0aCgpIHRocm93cyBFeGNlcHRpb24gewpAQCAtNTgsNCArNjEsMTIgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGVuaWVzT25jZUZvckFsbCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBydW5EZXZpY2VUZXN0cyhDTElFTlRfUEtHLCAiLlNjb3BlZERpcmVjdG9yeUFjY2Vzc0NsaWVudFRlc3QiLCAidGVzdERlbmllc09uY2VGb3JBbGwiKTsKICAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzZXREb05vdEFza0FnYWluKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJ1bkRldmljZVRlc3RzKENMSUVOVF9QS0csICIuU2NvcGVkRGlyZWN0b3J5QWNjZXNzQ2xpZW50VGVzdCIsICJ0ZXN0UmVzZXREb05vdEFza0FnYWluIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlc2V0R3JhbnRlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBydW5EZXZpY2VUZXN0cyhDTElFTlRfUEtHLCAiLlNjb3BlZERpcmVjdG9yeUFjY2Vzc0NsaWVudFRlc3QiLCAidGVzdFJlc2V0R3JhbnRlZCIpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvc3JjL2FuZHJvaWQvYXBwc2VjdXJpdHkvY3RzL1NwbGl0VGVzdHMuamF2YSBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvc3JjL2FuZHJvaWQvYXBwc2VjdXJpdHkvY3RzL1NwbGl0VGVzdHMuamF2YQppbmRleCA5NDc0YmE4Li4wODg0ODE4IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3NyYy9hbmRyb2lkL2FwcHNlY3VyaXR5L2N0cy9TcGxpdFRlc3RzLmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9zcmMvYW5kcm9pZC9hcHBzZWN1cml0eS9jdHMvU3BsaXRUZXN0cy5qYXZhCkBAIC0xNiw2ICsxNiw4IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5hcHBzZWN1cml0eS5jdHM7CiAKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVJbnN0YW50OwogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmJ1aWxkLklCdWlsZEluZm87CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLkRldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5EZXZpY2VUZXN0Q2FzZTsKQEAgLTM0LDcgKzM2LDggQEAKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEFQS19OT19SRVNUQVJUX0ZFQVRVUkUgPSAiQ3RzTm9SZXN0YXJ0RmVhdHVyZS5hcGsiOwogCiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBQS0cgPSAiY29tLmFuZHJvaWQuY3RzLnNwbGl0YXBwIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTID0gIi5TcGxpdEFwcFRlc3QiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1MgPSBQS0cgKyAiLlNwbGl0QXBwVGVzdCI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19OT19SRVNUQVJUID0gUEtHX05PX1JFU1RBUlQgKyAiLk5vUmVzdGFydFRlc3QiOwogCiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBBUEsgPSAiQ3RzU3BsaXRBcHAuYXBrIjsKIApAQCAtMTExLDYwICsxMTQsMTQ5IEBACiAgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoUEtHX05PX1JFU1RBUlQpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGVCYXNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG5ldyBJbnN0YWxsTXVsdGlwbGUoKS5hZGRBcGsoQVBLKS5ydW4oKTsKLSAgICAgICAgcnVuRGV2aWNlVGVzdHMoUEtHLCBDTEFTUywgInRlc3RTaW5nbGVCYXNlIik7CisgICAgQEFwcE1vZGVJbnN0YW50CisgICAgcHVibGljIHZvaWQgdGVzdFNpbmdsZUJhc2VJbnN0YW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RTaW5nbGVCYXNlKHRydWUpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHRlc3REZW5zaXR5U2luZ2xlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG5ldyBJbnN0YWxsTXVsdGlwbGUoKS5hZGRBcGsoQVBLKS5hZGRBcGsoQVBLX21kcGkpLnJ1bigpOwotICAgICAgICBydW5EZXZpY2VUZXN0cyhQS0csIENMQVNTLCAidGVzdERlbnNpdHlTaW5nbGUiKTsKKyAgICBAQXBwTW9kZUZ1bGwKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlQmFzZUZ1bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdFNpbmdsZUJhc2UoZmFsc2UpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHRlc3REZW5zaXR5QWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHJpdmF0ZSB2b2lkIHRlc3RTaW5nbGVCYXNlKGJvb2xlYW4gaW5zdGFudCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG5ldyBJbnN0YWxsTXVsdGlwbGUoKS5hZGRBcGsoQVBLKQorICAgICAgICAgICAgICAgIC5hZGRBcmcoaW5zdGFudCA/ICItLWluc3RhbnQiIDogIiIpLnJ1bigpOworICAgICAgICBydW5EZXZpY2VUZXN0c0FzQ3VycmVudFVzZXIoUEtHLCBDTEFTUywgInRlc3RTaW5nbGVCYXNlIik7CisgICAgfQorCisgICAgQEFwcE1vZGVJbnN0YW50CisgICAgcHVibGljIHZvaWQgdGVzdERlbnNpdHlTaW5nbGVJbnN0YW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3REZW5zaXR5U2luZ2xlKHRydWUpOworICAgIH0KKworICAgIEBBcHBNb2RlRnVsbAorICAgIHB1YmxpYyB2b2lkIHRlc3REZW5zaXR5U2luZ2xlRnVsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0RGVuc2l0eVNpbmdsZShmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3REZW5zaXR5U2luZ2xlKGJvb2xlYW4gaW5zdGFudCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG5ldyBJbnN0YWxsTXVsdGlwbGUoKS5hZGRBcGsoQVBLKS5hZGRBcGsoQVBLX21kcGkpCisgICAgICAgICAgICAgICAgLmFkZEFyZyhpbnN0YW50ID8gIi0taW5zdGFudCIgOiAiIikucnVuKCk7CisgICAgICAgIHJ1bkRldmljZVRlc3RzQXNDdXJyZW50VXNlcihQS0csIENMQVNTLCAidGVzdERlbnNpdHlTaW5nbGUiKTsKKyAgICB9CisKKyAgICBAQXBwTW9kZUluc3RhbnQKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVuc2l0eUFsbEluc3RhbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdERlbnNpdHlBbGwodHJ1ZSk7CisgICAgfQorCisgICAgQEFwcE1vZGVGdWxsCisgICAgcHVibGljIHZvaWQgdGVzdERlbnNpdHlBbGxGdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3REZW5zaXR5QWxsKGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdERlbnNpdHlBbGwoYm9vbGVhbiBpbnN0YW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgbmV3IEluc3RhbGxNdWx0aXBsZSgpLmFkZEFwayhBUEspLmFkZEFwayhBUEtfbWRwaSkuYWRkQXBrKEFQS19oZHBpKS5hZGRBcGsoQVBLX3hoZHBpKQotICAgICAgICAgICAgICAgIC5hZGRBcGsoQVBLX3h4aGRwaSkucnVuKCk7Ci0gICAgICAgIHJ1bkRldmljZVRlc3RzKFBLRywgQ0xBU1MsICJ0ZXN0RGVuc2l0eUFsbCIpOworICAgICAgICAgICAgICAgIC5hZGRBcGsoQVBLX3h4aGRwaSkuYWRkQXJnKGluc3RhbnQgPyAiLS1pbnN0YW50IiA6ICIiKS5ydW4oKTsKKyAgICAgICAgcnVuRGV2aWNlVGVzdHNBc0N1cnJlbnRVc2VyKFBLRywgQ0xBU1MsICJ0ZXN0RGVuc2l0eUFsbCIpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIEluc3RhbGwgZmlyc3Qgd2l0aCBsb3ctcmVzb2x1dGlvbiByZXNvdXJjZXMsIHRoZW4gYWRkIGEgc3BsaXQgdGhhdCBvZmZlcnMKICAgICAgKiBoaWdoZXItcmVzb2x1dGlvbiByZXNvdXJjZXMuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdERlbnNpdHlCZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG5ldyBJbnN0YWxsTXVsdGlwbGUoKS5hZGRBcGsoQVBLKS5hZGRBcGsoQVBLX21kcGkpLnJ1bigpOwotICAgICAgICBydW5EZXZpY2VUZXN0cyhQS0csIENMQVNTLCAidGVzdERlbnNpdHlCZXN0MSIpOworICAgIEBBcHBNb2RlSW5zdGFudAorICAgIHB1YmxpYyB2b2lkIHRlc3REZW5zaXR5QmVzdEluc3RhbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdERlbnNpdHlCZXN0KHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluc3RhbGwgZmlyc3Qgd2l0aCBsb3ctcmVzb2x1dGlvbiByZXNvdXJjZXMsIHRoZW4gYWRkIGEgc3BsaXQgdGhhdCBvZmZlcnMKKyAgICAgKiBoaWdoZXItcmVzb2x1dGlvbiByZXNvdXJjZXMuCisgICAgICovCisgICAgQEFwcE1vZGVGdWxsCisgICAgcHVibGljIHZvaWQgdGVzdERlbnNpdHlCZXN0RnVsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0RGVuc2l0eUJlc3QoZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0RGVuc2l0eUJlc3QoYm9vbGVhbiBpbnN0YW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbmV3IEluc3RhbGxNdWx0aXBsZSgpLmFkZEFwayhBUEspLmFkZEFwayhBUEtfbWRwaSkKKyAgICAgICAgICAgICAgICAuYWRkQXJnKGluc3RhbnQgPyAiLS1pbnN0YW50IiA6ICIiKS5ydW4oKTsKKyAgICAgICAgcnVuRGV2aWNlVGVzdHNBc0N1cnJlbnRVc2VyKFBLRywgQ0xBU1MsICJ0ZXN0RGVuc2l0eUJlc3QxIik7CiAKICAgICAgICAgLy8gTm93IHNwbGljZSBpbiBhbiBhZGRpdGlvbmFsIHNwbGl0IHdoaWNoIG9mZmVycyBiZXR0ZXIgcmVzb3VyY2VzCi0gICAgICAgIG5ldyBJbnN0YWxsTXVsdGlwbGUoKS5pbmhlcml0RnJvbShQS0cpLmFkZEFwayhBUEtfeHhoZHBpKS5ydW4oKTsKLSAgICAgICAgcnVuRGV2aWNlVGVzdHMoUEtHLCBDTEFTUywgInRlc3REZW5zaXR5QmVzdDIiKTsKKyAgICAgICAgbmV3IEluc3RhbGxNdWx0aXBsZSgpLmluaGVyaXRGcm9tKFBLRykuYWRkQXBrKEFQS194eGhkcGkpCisgICAgICAgICAgICAgICAgLmFkZEFyZyhpbnN0YW50ID8gIi0taW5zdGFudCIgOiAiIikucnVuKCk7CisgICAgICAgIHJ1bkRldmljZVRlc3RzQXNDdXJyZW50VXNlcihQS0csIENMQVNTLCAidGVzdERlbnNpdHlCZXN0MiIpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFZlcmlmeSB0aGF0IGFuIEFQSS1iYXNlZCBzcGxpdCBjYW4gY2hhbmdlIGVuYWJsZWQvZGlzYWJsZWQgc3RhdGUgb2YKICAgICAgKiBtYW5pZmVzdCBlbGVtZW50cy4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXBpKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG5ldyBJbnN0YWxsTXVsdGlwbGUoKS5hZGRBcGsoQVBLKS5hZGRBcGsoQVBLX3Y3KS5ydW4oKTsKLSAgICAgICAgcnVuRGV2aWNlVGVzdHMoUEtHLCBDTEFTUywgInRlc3RBcGkiKTsKKyAgICBAQXBwTW9kZUluc3RhbnQKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXBpSW5zdGFudCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0QXBpKHRydWUpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHRlc3RMb2NhbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbmV3IEluc3RhbGxNdWx0aXBsZSgpLmFkZEFwayhBUEspLmFkZEFwayhBUEtfZGUpLmFkZEFwayhBUEtfZnIpLnJ1bigpOwotICAgICAgICBydW5EZXZpY2VUZXN0cyhQS0csIENMQVNTLCAidGVzdExvY2FsZSIpOworICAgIC8qKgorICAgICAqIFZlcmlmeSB0aGF0IGFuIEFQSS1iYXNlZCBzcGxpdCBjYW4gY2hhbmdlIGVuYWJsZWQvZGlzYWJsZWQgc3RhdGUgb2YKKyAgICAgKiBtYW5pZmVzdCBlbGVtZW50cy4KKyAgICAgKi8KKyAgICBAQXBwTW9kZUZ1bGwKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXBpRnVsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0QXBpKGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdEFwaShib29sZWFuIGluc3RhbnQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBuZXcgSW5zdGFsbE11bHRpcGxlKCkuYWRkQXBrKEFQSykuYWRkQXBrKEFQS192NykKKyAgICAgICAgICAgICAgICAuYWRkQXJnKGluc3RhbnQgPyAiLS1pbnN0YW50IiA6ICIiKS5ydW4oKTsKKyAgICAgICAgcnVuRGV2aWNlVGVzdHNBc0N1cnJlbnRVc2VyKFBLRywgQ0xBU1MsICJ0ZXN0QXBpIik7CisgICAgfQorCisgICAgQEFwcE1vZGVJbnN0YW50CisgICAgcHVibGljIHZvaWQgdGVzdExvY2FsZUluc3RhbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdExvY2FsZSh0cnVlKTsKKyAgICB9CisKKyAgICBAQXBwTW9kZUZ1bGwKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9jYWxlRnVsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0TG9jYWxlKGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdExvY2FsZShib29sZWFuIGluc3RhbnQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBuZXcgSW5zdGFsbE11bHRpcGxlKCkuYWRkQXBrKEFQSykuYWRkQXBrKEFQS19kZSkuYWRkQXBrKEFQS19mcikKKyAgICAgICAgICAgICAgICAuYWRkQXJnKGluc3RhbnQgPyAiLS1pbnN0YW50IiA6ICIiKS5ydW4oKTsKKyAgICAgICAgcnVuRGV2aWNlVGVzdHNBc0N1cnJlbnRVc2VyKFBLRywgQ0xBU1MsICJ0ZXN0TG9jYWxlIik7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogSW5zdGFsbCB0ZXN0IGFwcCB3aXRoIDxlbT5zaW5nbGU8L2VtPiBzcGxpdCB0aGF0IGV4YWN0bHkgbWF0Y2hlcyB0aGUKICAgICAgKiBjdXJyZW50bHkgYWN0aXZlIEFCSS4gVGhpcyBhbHNvIGV4cGxpY2l0bHkgZm9yY2VzIEFCSSB3aGVuIGluc3RhbGxpbmcuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE5hdGl2ZVNpbmdsZSgpIHRocm93cyBFeGNlcHRpb24geworICAgIEBBcHBNb2RlSW5zdGFudAorICAgIHB1YmxpYyB2b2lkIHRlc3ROYXRpdmVTaW5nbGVJbnN0YW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3ROYXRpdmVTaW5nbGUodHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5zdGFsbCB0ZXN0IGFwcCB3aXRoIDxlbT5zaW5nbGU8L2VtPiBzcGxpdCB0aGF0IGV4YWN0bHkgbWF0Y2hlcyB0aGUKKyAgICAgKiBjdXJyZW50bHkgYWN0aXZlIEFCSS4gVGhpcyBhbHNvIGV4cGxpY2l0bHkgZm9yY2VzIEFCSSB3aGVuIGluc3RhbGxpbmcuCisgICAgICovCisgICAgQEFwcE1vZGVGdWxsCisgICAgcHVibGljIHZvaWQgdGVzdE5hdGl2ZVNpbmdsZUZ1bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdE5hdGl2ZVNpbmdsZShmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3ROYXRpdmVTaW5nbGUoYm9vbGVhbiBpbnN0YW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgU3RyaW5nIGFiaSA9IG1BYmkuZ2V0TmFtZSgpOwogICAgICAgICBmaW5hbCBTdHJpbmcgYXBrID0gQUJJX1RPX0FQSy5nZXQoYWJpKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiRmFpbGVkIHRvIGZpbmQgQVBLIGZvciBBQkkgIiArIGFiaSwgYXBrKTsKIAotICAgICAgICBuZXcgSW5zdGFsbE11bHRpcGxlKCkuYWRkQXBrKEFQSykuYWRkQXBrKGFwaykucnVuKCk7Ci0gICAgICAgIHJ1bkRldmljZVRlc3RzKFBLRywgQ0xBU1MsICJ0ZXN0TmF0aXZlIik7CisgICAgICAgIG5ldyBJbnN0YWxsTXVsdGlwbGUoKS5hZGRBcGsoQVBLKS5hZGRBcGsoYXBrKQorICAgICAgICAgICAgICAgIC5hZGRBcmcoaW5zdGFudCA/ICItLWluc3RhbnQiIDogIiIpLnJ1bigpOworICAgICAgICBydW5EZXZpY2VUZXN0c0FzQ3VycmVudFVzZXIoUEtHLCBDTEFTUywgInRlc3ROYXRpdmUiKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE3MywyNiArMjY1LDQ4IEBACiAgICAgICogaW5zdGFsbGluZywgaW5zdGVhZCBleGVyY2lzaW5nIHRoZSBzeXN0ZW0ncyBhYmlsaXR5IHRvIGNob29zZSB0aGUgQUJJCiAgICAgICogdGhyb3VnaCBpbnNwZWN0aW9uIG9mIHRoZSBpbnN0YWxsZWQgYXBwLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3ROYXRpdmVTaW5nbGVOYXR1cmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgQEFwcE1vZGVJbnN0YW50CisgICAgcHVibGljIHZvaWQgdGVzdE5hdGl2ZVNpbmdsZU5hdHVyYWxJbnN0YW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3ROYXRpdmVTaW5nbGVOYXR1cmFsKHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluc3RhbGwgdGVzdCBhcHAgd2l0aCA8ZW0+c2luZ2xlPC9lbT4gc3BsaXQgdGhhdCBleGFjdGx5IG1hdGNoZXMgdGhlCisgICAgICogY3VycmVudGx5IGFjdGl2ZSBBQkkuIFRoaXMgdmFyaWFudCA8ZW0+ZG9lcyBub3Q8L2VtPiBmb3JjZSB0aGUgQUJJIHdoZW4KKyAgICAgKiBpbnN0YWxsaW5nLCBpbnN0ZWFkIGV4ZXJjaXNpbmcgdGhlIHN5c3RlbSdzIGFiaWxpdHkgdG8gY2hvb3NlIHRoZSBBQkkKKyAgICAgKiB0aHJvdWdoIGluc3BlY3Rpb24gb2YgdGhlIGluc3RhbGxlZCBhcHAuCisgICAgICovCisgICAgQEFwcE1vZGVGdWxsCisgICAgcHVibGljIHZvaWQgdGVzdE5hdGl2ZVNpbmdsZU5hdHVyYWxGdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3ROYXRpdmVTaW5nbGVOYXR1cmFsKGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdE5hdGl2ZVNpbmdsZU5hdHVyYWwoYm9vbGVhbiBpbnN0YW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgU3RyaW5nIGFiaSA9IG1BYmkuZ2V0TmFtZSgpOwogICAgICAgICBmaW5hbCBTdHJpbmcgYXBrID0gQUJJX1RPX0FQSy5nZXQoYWJpKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiRmFpbGVkIHRvIGZpbmQgQVBLIGZvciBBQkkgIiArIGFiaSwgYXBrKTsKIAotICAgICAgICBuZXcgSW5zdGFsbE11bHRpcGxlKCkudXNlTmF0dXJhbEFiaSgpLmFkZEFwayhBUEspLmFkZEFwayhhcGspLnJ1bigpOwotICAgICAgICBydW5EZXZpY2VUZXN0cyhQS0csIENMQVNTLCAidGVzdE5hdGl2ZSIpOworICAgICAgICBuZXcgSW5zdGFsbE11bHRpcGxlKCkudXNlTmF0dXJhbEFiaSgpLmFkZEFwayhBUEspLmFkZEFwayhhcGspCisgICAgICAgICAgICAgICAgLmFkZEFyZyhpbnN0YW50ID8gIi0taW5zdGFudCIgOiAiIikucnVuKCk7CisgICAgICAgIHJ1bkRldmljZVRlc3RzQXNDdXJyZW50VXNlcihQS0csIENMQVNTLCAidGVzdE5hdGl2ZSIpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIEluc3RhbGwgdGVzdCBhcHAgd2l0aCA8ZW0+YWxsPC9lbT4gcG9zc2libGUgQUJJIHNwbGl0cy4gVGhpcyBhbHNvCiAgICAgICogZXhwbGljaXRseSBmb3JjZXMgQUJJIHdoZW4gaW5zdGFsbGluZy4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmF0aXZlQWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIEluc3RhbGxNdWx0aXBsZSBpbnN0ID0gbmV3IEluc3RhbGxNdWx0aXBsZSgpLmFkZEFwayhBUEspOwotICAgICAgICBmb3IgKFN0cmluZyBhcGsgOiBBQklfVE9fQVBLLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBpbnN0LmFkZEFwayhhcGspOwotICAgICAgICB9Ci0gICAgICAgIGluc3QucnVuKCk7Ci0gICAgICAgIHJ1bkRldmljZVRlc3RzKFBLRywgQ0xBU1MsICJ0ZXN0TmF0aXZlIik7CisgICAgQEFwcE1vZGVJbnN0YW50CisgICAgcHVibGljIHZvaWQgdGVzdE5hdGl2ZUFsbEluc3RhbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdE5hdGl2ZUFsbCh0cnVlLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5zdGFsbCB0ZXN0IGFwcCB3aXRoIDxlbT5hbGw8L2VtPiBwb3NzaWJsZSBBQkkgc3BsaXRzLiBUaGlzIGFsc28KKyAgICAgKiBleHBsaWNpdGx5IGZvcmNlcyBBQkkgd2hlbiBpbnN0YWxsaW5nLgorICAgICAqLworICAgIEBBcHBNb2RlRnVsbAorICAgIHB1YmxpYyB2b2lkIHRlc3ROYXRpdmVBbGxGdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3ROYXRpdmVBbGwoZmFsc2UsIGZhbHNlKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIwMSwxMDMgKzMxNSwyOTkgQEAKICAgICAgKiBzeXN0ZW0ncyBhYmlsaXR5IHRvIGNob29zZSB0aGUgQUJJIHRocm91Z2ggaW5zcGVjdGlvbiBvZiB0aGUgaW5zdGFsbGVkCiAgICAgICogYXBwLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3ROYXRpdmVBbGxOYXR1cmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIEluc3RhbGxNdWx0aXBsZSBpbnN0ID0gbmV3IEluc3RhbGxNdWx0aXBsZSgpLnVzZU5hdHVyYWxBYmkoKS5hZGRBcGsoQVBLKTsKKyAgICBAQXBwTW9kZUluc3RhbnQKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmF0aXZlQWxsTmF0dXJhbEluc3RhbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdE5hdGl2ZUFsbCh0cnVlLCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnN0YWxsIHRlc3QgYXBwIHdpdGggPGVtPmFsbDwvZW0+IHBvc3NpYmxlIEFCSSBzcGxpdHMuIFRoaXMgdmFyaWFudAorICAgICAqIDxlbT5kb2VzIG5vdDwvZW0+IGZvcmNlIHRoZSBBQkkgd2hlbiBpbnN0YWxsaW5nLCBpbnN0ZWFkIGV4ZXJjaXNpbmcgdGhlCisgICAgICogc3lzdGVtJ3MgYWJpbGl0eSB0byBjaG9vc2UgdGhlIEFCSSB0aHJvdWdoIGluc3BlY3Rpb24gb2YgdGhlIGluc3RhbGxlZAorICAgICAqIGFwcC4KKyAgICAgKi8KKyAgICBAQXBwTW9kZUZ1bGwKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmF0aXZlQWxsTmF0dXJhbEZ1bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdE5hdGl2ZUFsbChmYWxzZSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3ROYXRpdmVBbGwoYm9vbGVhbiBpbnN0YW50LCBib29sZWFuIG5hdHVyYWwpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBJbnN0YWxsTXVsdGlwbGUgaW5zdCA9IG5ldyBJbnN0YWxsTXVsdGlwbGUoKS5hZGRBcGsoQVBLKTsKICAgICAgICAgZm9yIChTdHJpbmcgYXBrIDogQUJJX1RPX0FQSy52YWx1ZXMoKSkgewogICAgICAgICAgICAgaW5zdC5hZGRBcGsoYXBrKTsKICAgICAgICAgfQorICAgICAgICBpZiAoaW5zdGFudCkgeworICAgICAgICAgICAgaW5zdC5hZGRBcmcoIi0taW5zdGFudCIpOworICAgICAgICB9CisgICAgICAgIGlmIChuYXR1cmFsKSB7CisgICAgICAgICAgICBpbnN0LnVzZU5hdHVyYWxBYmkoKTsKKyAgICAgICAgfQogICAgICAgICBpbnN0LnJ1bigpOwotICAgICAgICBydW5EZXZpY2VUZXN0cyhQS0csIENMQVNTLCAidGVzdE5hdGl2ZSIpOworICAgICAgICBydW5EZXZpY2VUZXN0c0FzQ3VycmVudFVzZXIoUEtHLCBDTEFTUywgInRlc3ROYXRpdmUiKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RHVwbGljYXRlQmFzZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBuZXcgSW5zdGFsbE11bHRpcGxlKCkuYWRkQXBrKEFQSykuYWRkQXBrKEFQSykucnVuRXhwZWN0aW5nRmFpbHVyZSgpOworICAgIEBBcHBNb2RlSW5zdGFudAorICAgIHB1YmxpYyB2b2lkIHRlc3REdXBsaWNhdGVCYXNlSW5zdGFudCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0RHVwbGljYXRlQmFzZSh0cnVlKTsKICAgICB9CiAKKyAgICBAQXBwTW9kZUZ1bGwKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RHVwbGljYXRlQmFzZUZ1bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdER1cGxpY2F0ZUJhc2UoZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0RHVwbGljYXRlQmFzZShib29sZWFuIGluc3RhbnQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBuZXcgSW5zdGFsbE11bHRpcGxlKCkuYWRkQXBrKEFQSykuYWRkQXBrKEFQSykKKyAgICAgICAgICAgICAgICAuYWRkQXJnKGluc3RhbnQgPyAiLS1pbnN0YW50IiA6ICIiKS5ydW5FeHBlY3RpbmdGYWlsdXJlKCk7CisgICAgfQorCisgICAgQEFwcE1vZGVJbnN0YW50CiAgICAgcHVibGljIHZvaWQgdGVzdER1cGxpY2F0ZVNwbGl0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG5ldyBJbnN0YWxsTXVsdGlwbGUoKS5hZGRBcGsoQVBLKS5hZGRBcGsoQVBLX3Y3KS5hZGRBcGsoQVBLX3Y3KS5ydW5FeHBlY3RpbmdGYWlsdXJlKCk7CisgICAgICAgIHRlc3REdXBsaWNhdGVTcGxpdCh0cnVlKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGlmZkNlcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbmV3IEluc3RhbGxNdWx0aXBsZSgpLmFkZEFwayhBUEspLmFkZEFwayhBUEtfRElGRl9DRVJUX3Y3KS5ydW5FeHBlY3RpbmdGYWlsdXJlKCk7CisgICAgQEFwcE1vZGVGdWxsCisgICAgcHVibGljIHZvaWQgdGVzdER1cGxpY2F0ZVNwbGl0RnVsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0RHVwbGljYXRlU3BsaXQoZmFsc2UpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHRlc3REaWZmQ2VydEluaGVyaXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbmV3IEluc3RhbGxNdWx0aXBsZSgpLmFkZEFwayhBUEspLnJ1bigpOwotICAgICAgICBuZXcgSW5zdGFsbE11bHRpcGxlKCkuaW5oZXJpdEZyb20oUEtHKS5hZGRBcGsoQVBLX0RJRkZfQ0VSVF92NykucnVuRXhwZWN0aW5nRmFpbHVyZSgpOworICAgIHByaXZhdGUgdm9pZCB0ZXN0RHVwbGljYXRlU3BsaXQoYm9vbGVhbiBpbnN0YW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbmV3IEluc3RhbGxNdWx0aXBsZSgpLmFkZEFwayhBUEspLmFkZEFwayhBUEtfdjcpLmFkZEFwayhBUEtfdjcpCisgICAgICAgICAgICAgICAgLmFkZEFyZyhpbnN0YW50ID8gIi0taW5zdGFudCIgOiAiIikucnVuRXhwZWN0aW5nRmFpbHVyZSgpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHRlc3REaWZmVmVyc2lvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBuZXcgSW5zdGFsbE11bHRpcGxlKCkuYWRkQXBrKEFQSykuYWRkQXBrKEFQS19ESUZGX1ZFUlNJT05fdjcpLnJ1bkV4cGVjdGluZ0ZhaWx1cmUoKTsKKyAgICBAQXBwTW9kZUluc3RhbnQKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlmZkNlcnRJbnN0YW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3REaWZmQ2VydCh0cnVlKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGlmZlZlcnNpb25Jbmhlcml0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG5ldyBJbnN0YWxsTXVsdGlwbGUoKS5hZGRBcGsoQVBLKS5ydW4oKTsKLSAgICAgICAgbmV3IEluc3RhbGxNdWx0aXBsZSgpLmluaGVyaXRGcm9tKFBLRykuYWRkQXBrKEFQS19ESUZGX1ZFUlNJT05fdjcpLnJ1bkV4cGVjdGluZ0ZhaWx1cmUoKTsKKyAgICBAQXBwTW9kZUZ1bGwKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlmZkNlcnRGdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3REaWZmQ2VydChmYWxzZSk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgdGVzdERpZmZSZXZpc2lvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBuZXcgSW5zdGFsbE11bHRpcGxlKCkuYWRkQXBrKEFQSykuYWRkQXBrKEFQS19ESUZGX1JFVklTSU9OX3Y3KS5ydW4oKTsKLSAgICAgICAgcnVuRGV2aWNlVGVzdHMoUEtHLCBDTEFTUywgInRlc3RSZXZpc2lvbjBfMTIiKTsKKyAgICBwcml2YXRlIHZvaWQgdGVzdERpZmZDZXJ0KGJvb2xlYW4gaW5zdGFudCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG5ldyBJbnN0YWxsTXVsdGlwbGUoKS5hZGRBcGsoQVBLKS5hZGRBcGsoQVBLX0RJRkZfQ0VSVF92NykKKyAgICAgICAgICAgICAgICAuYWRkQXJnKGluc3RhbnQgPyAiLS1pbnN0YW50IiA6ICIiKS5ydW5FeHBlY3RpbmdGYWlsdXJlKCk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgdGVzdERpZmZSZXZpc2lvbkluaGVyaXRCYXNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG5ldyBJbnN0YWxsTXVsdGlwbGUoKS5hZGRBcGsoQVBLKS5hZGRBcGsoQVBLX3Y3KS5ydW4oKTsKLSAgICAgICAgcnVuRGV2aWNlVGVzdHMoUEtHLCBDTEFTUywgInRlc3RSZXZpc2lvbjBfMCIpOwotICAgICAgICBuZXcgSW5zdGFsbE11bHRpcGxlKCkuaW5oZXJpdEZyb20oUEtHKS5hZGRBcGsoQVBLX0RJRkZfUkVWSVNJT05fdjcpLnJ1bigpOwotICAgICAgICBydW5EZXZpY2VUZXN0cyhQS0csIENMQVNTLCAidGVzdFJldmlzaW9uMF8xMiIpOworICAgIEBBcHBNb2RlSW5zdGFudAorICAgIHB1YmxpYyB2b2lkIHRlc3REaWZmQ2VydEluaGVyaXRJbnN0YW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3REaWZmQ2VydEluaGVyaXQodHJ1ZSk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgdGVzdERpZmZSZXZpc2lvbkluaGVyaXRTcGxpdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBuZXcgSW5zdGFsbE11bHRpcGxlKCkuYWRkQXBrKEFQSykuYWRkQXBrKEFQS192NykucnVuKCk7Ci0gICAgICAgIHJ1bkRldmljZVRlc3RzKFBLRywgQ0xBU1MsICJ0ZXN0UmV2aXNpb24wXzAiKTsKLSAgICAgICAgbmV3IEluc3RhbGxNdWx0aXBsZSgpLmluaGVyaXRGcm9tKFBLRykuYWRkQXBrKEFQS19ESUZGX1JFVklTSU9OKS5ydW4oKTsKLSAgICAgICAgcnVuRGV2aWNlVGVzdHMoUEtHLCBDTEFTUywgInRlc3RSZXZpc2lvbjEyXzAiKTsKKyAgICBAQXBwTW9kZUZ1bGwKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlmZkNlcnRJbmhlcml0RnVsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0RGlmZkNlcnRJbmhlcml0KGZhbHNlKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGlmZlJldmlzaW9uRG93bmdyYWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG5ldyBJbnN0YWxsTXVsdGlwbGUoKS5hZGRBcGsoQVBLKS5hZGRBcGsoQVBLX0RJRkZfUkVWSVNJT05fdjcpLnJ1bigpOwotICAgICAgICBuZXcgSW5zdGFsbE11bHRpcGxlKCkuaW5oZXJpdEZyb20oUEtHKS5hZGRBcGsoQVBLX3Y3KS5ydW5FeHBlY3RpbmdGYWlsdXJlKCk7CisgICAgcHJpdmF0ZSB2b2lkIHRlc3REaWZmQ2VydEluaGVyaXQoYm9vbGVhbiBpbnN0YW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbmV3IEluc3RhbGxNdWx0aXBsZSgpLmFkZEFwayhBUEspIC5hZGRBcmcoaW5zdGFudCA/ICItLWluc3RhbnQiIDogIiIpLnJ1bigpOworICAgICAgICBuZXcgSW5zdGFsbE11bHRpcGxlKCkuaW5oZXJpdEZyb20oUEtHKS5hZGRBcGsoQVBLX0RJRkZfQ0VSVF92NykKKyAgICAgICAgICAgICAgICAuYWRkQXJnKGluc3RhbnQgPyAiLS1pbnN0YW50IiA6ICIiKS5ydW5FeHBlY3RpbmdGYWlsdXJlKCk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgdGVzdEZlYXR1cmVCYXNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG5ldyBJbnN0YWxsTXVsdGlwbGUoKS5hZGRBcGsoQVBLKS5hZGRBcGsoQVBLX0ZFQVRVUkUpLnJ1bigpOwotICAgICAgICBydW5EZXZpY2VUZXN0cyhQS0csIENMQVNTLCAidGVzdEZlYXR1cmVCYXNlIik7CisgICAgQEFwcE1vZGVJbnN0YW50CisgICAgcHVibGljIHZvaWQgdGVzdERpZmZWZXJzaW9uSW5zdGFudCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0RGlmZlZlcnNpb24odHJ1ZSk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgdGVzdEZlYXR1cmVBcGkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbmV3IEluc3RhbGxNdWx0aXBsZSgpLmFkZEFwayhBUEspLmFkZEFwayhBUEtfRkVBVFVSRSkuYWRkQXBrKEFQS19GRUFUVVJFX3Y3KS5ydW4oKTsKLSAgICAgICAgcnVuRGV2aWNlVGVzdHMoUEtHLCBDTEFTUywgInRlc3RGZWF0dXJlQXBpIik7CisgICAgQEFwcE1vZGVGdWxsCisgICAgcHVibGljIHZvaWQgdGVzdERpZmZWZXJzaW9uRnVsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0RGlmZlZlcnNpb24oZmFsc2UpOwogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCB0ZXN0RGlmZlZlcnNpb24oYm9vbGVhbiBpbnN0YW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbmV3IEluc3RhbGxNdWx0aXBsZSgpLmFkZEFwayhBUEspLmFkZEFwayhBUEtfRElGRl9WRVJTSU9OX3Y3KQorICAgICAgICAgICAgICAgIC5hZGRBcmcoaW5zdGFudCA/ICItLWluc3RhbnQiIDogIiIpLnJ1bkV4cGVjdGluZ0ZhaWx1cmUoKTsKKyAgICB9CisKKyAgICBAQXBwTW9kZUluc3RhbnQKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlmZlZlcnNpb25Jbmhlcml0SW5zdGFudCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0RGlmZlZlcnNpb25Jbmhlcml0KHRydWUpOworICAgIH0KKworICAgIEBBcHBNb2RlRnVsbAorICAgIHB1YmxpYyB2b2lkIHRlc3REaWZmVmVyc2lvbkluaGVyaXRGdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3REaWZmVmVyc2lvbkluaGVyaXQoZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0RGlmZlZlcnNpb25Jbmhlcml0KGJvb2xlYW4gaW5zdGFudCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG5ldyBJbnN0YWxsTXVsdGlwbGUoKS5hZGRBcGsoQVBLKS5hZGRBcmcoaW5zdGFudCA/ICItLWluc3RhbnQiIDogIiIpLnJ1bigpOworICAgICAgICBuZXcgSW5zdGFsbE11bHRpcGxlKCkuaW5oZXJpdEZyb20oUEtHKS5hZGRBcGsoQVBLX0RJRkZfVkVSU0lPTl92NykKKyAgICAgICAgICAgICAgICAuYWRkQXJnKGluc3RhbnQgPyAiLS1pbnN0YW50IiA6ICIiKS5ydW5FeHBlY3RpbmdGYWlsdXJlKCk7CisgICAgfQorCisgICAgQEFwcE1vZGVJbnN0YW50CisgICAgcHVibGljIHZvaWQgdGVzdERpZmZSZXZpc2lvbkluc3RhbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdERpZmZSZXZpc2lvbih0cnVlKTsKKyAgICB9CisKKyAgICBAQXBwTW9kZUZ1bGwKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlmZlJldmlzaW9uRnVsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0RGlmZlJldmlzaW9uKGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdERpZmZSZXZpc2lvbihib29sZWFuIGluc3RhbnQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBuZXcgSW5zdGFsbE11bHRpcGxlKCkuYWRkQXBrKEFQSykuYWRkQXBrKEFQS19ESUZGX1JFVklTSU9OX3Y3KQorICAgICAgICAgICAgICAgIC5hZGRBcmcoaW5zdGFudCA/ICItLWluc3RhbnQiIDogIiIpLnJ1bigpOworICAgICAgICBydW5EZXZpY2VUZXN0c0FzQ3VycmVudFVzZXIoUEtHLCBDTEFTUywgInRlc3RSZXZpc2lvbjBfMTIiKTsKKyAgICB9CisKKyAgICBAQXBwTW9kZUluc3RhbnQKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlmZlJldmlzaW9uSW5oZXJpdEJhc2VJbnN0YW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3REaWZmUmV2aXNpb25Jbmhlcml0QmFzZSh0cnVlKTsKKyAgICB9CisKKyAgICBAQXBwTW9kZUZ1bGwKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlmZlJldmlzaW9uSW5oZXJpdEJhc2VGdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3REaWZmUmV2aXNpb25Jbmhlcml0QmFzZShmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3REaWZmUmV2aXNpb25Jbmhlcml0QmFzZShib29sZWFuIGluc3RhbnQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBuZXcgSW5zdGFsbE11bHRpcGxlKCkuYWRkQXBrKEFQSykuYWRkQXBrKEFQS192NykKKyAgICAgICAgICAgICAgICAuYWRkQXJnKGluc3RhbnQgPyAiLS1pbnN0YW50IiA6ICIiKS5ydW4oKTsKKyAgICAgICAgcnVuRGV2aWNlVGVzdHNBc0N1cnJlbnRVc2VyKFBLRywgQ0xBU1MsICJ0ZXN0UmV2aXNpb24wXzAiKTsKKyAgICAgICAgbmV3IEluc3RhbGxNdWx0aXBsZSgpLmluaGVyaXRGcm9tKFBLRykuYWRkQXBrKEFQS19ESUZGX1JFVklTSU9OX3Y3KQorICAgICAgICAgICAgICAgIC5hZGRBcmcoaW5zdGFudCA/ICItLWluc3RhbnQiIDogIiIpLnJ1bigpOworICAgICAgICBydW5EZXZpY2VUZXN0c0FzQ3VycmVudFVzZXIoUEtHLCBDTEFTUywgInRlc3RSZXZpc2lvbjBfMTIiKTsKKyAgICB9CisKKyAgICBAQXBwTW9kZUluc3RhbnQKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlmZlJldmlzaW9uSW5oZXJpdFNwbGl0SW5zdGFudCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0RGlmZlJldmlzaW9uSW5oZXJpdFNwbGl0KHRydWUpOworICAgIH0KKworICAgIEBBcHBNb2RlRnVsbAorICAgIHB1YmxpYyB2b2lkIHRlc3REaWZmUmV2aXNpb25Jbmhlcml0U3BsaXRGdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3REaWZmUmV2aXNpb25Jbmhlcml0U3BsaXQoZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0RGlmZlJldmlzaW9uSW5oZXJpdFNwbGl0KGJvb2xlYW4gaW5zdGFudCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG5ldyBJbnN0YWxsTXVsdGlwbGUoKS5hZGRBcGsoQVBLKS5hZGRBcGsoQVBLX3Y3KQorICAgICAgICAgICAgICAgIC5hZGRBcmcoaW5zdGFudCA/ICItLWluc3RhbnQiIDogIiIpLnJ1bigpOworICAgICAgICBydW5EZXZpY2VUZXN0c0FzQ3VycmVudFVzZXIoUEtHLCBDTEFTUywgInRlc3RSZXZpc2lvbjBfMCIpOworICAgICAgICBuZXcgSW5zdGFsbE11bHRpcGxlKCkuaW5oZXJpdEZyb20oUEtHKS5hZGRBcGsoQVBLX0RJRkZfUkVWSVNJT04pCisgICAgICAgICAgICAgICAgLmFkZEFyZyhpbnN0YW50ID8gIi0taW5zdGFudCIgOiAiIikucnVuKCk7CisgICAgICAgIHJ1bkRldmljZVRlc3RzQXNDdXJyZW50VXNlcihQS0csIENMQVNTLCAidGVzdFJldmlzaW9uMTJfMCIpOworICAgIH0KKworICAgIEBBcHBNb2RlSW5zdGFudAorICAgIHB1YmxpYyB2b2lkIHRlc3REaWZmUmV2aXNpb25Eb3duZ3JhZGVJbnN0YW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3REaWZmUmV2aXNpb25Eb3duZ3JhZGUodHJ1ZSk7CisgICAgfQorCisgICAgQEFwcE1vZGVGdWxsCisgICAgcHVibGljIHZvaWQgdGVzdERpZmZSZXZpc2lvbkRvd25ncmFkZUZ1bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdERpZmZSZXZpc2lvbkRvd25ncmFkZShmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3REaWZmUmV2aXNpb25Eb3duZ3JhZGUoYm9vbGVhbiBpbnN0YW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbmV3IEluc3RhbGxNdWx0aXBsZSgpLmFkZEFwayhBUEspLmFkZEFwayhBUEtfRElGRl9SRVZJU0lPTl92NykKKyAgICAgICAgICAgICAgICAuYWRkQXJnKGluc3RhbnQgPyAiLS1pbnN0YW50IiA6ICIiKS5ydW4oKTsKKyAgICAgICAgbmV3IEluc3RhbGxNdWx0aXBsZSgpLmluaGVyaXRGcm9tKFBLRykuYWRkQXBrKEFQS192NykKKyAgICAgICAgICAgICAgICAuYWRkQXJnKGluc3RhbnQgPyAiLS1pbnN0YW50IiA6ICIiKS5ydW5FeHBlY3RpbmdGYWlsdXJlKCk7CisgICAgfQorCisgICAgQEFwcE1vZGVJbnN0YW50CisgICAgcHVibGljIHZvaWQgdGVzdEZlYXR1cmVCYXNlSW5zdGFudCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0RmVhdHVyZUJhc2UodHJ1ZSk7CisgICAgfQorCisgICAgQEFwcE1vZGVGdWxsCisgICAgcHVibGljIHZvaWQgdGVzdEZlYXR1cmVCYXNlRnVsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0RmVhdHVyZUJhc2UoZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0RmVhdHVyZUJhc2UoYm9vbGVhbiBpbnN0YW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbmV3IEluc3RhbGxNdWx0aXBsZSgpLmFkZEFwayhBUEspLmFkZEFwayhBUEtfRkVBVFVSRSkKKyAgICAgICAgICAgICAgICAuYWRkQXJnKGluc3RhbnQgPyAiLS1pbnN0YW50IiA6ICIiKS5ydW4oKTsKKyAgICAgICAgcnVuRGV2aWNlVGVzdHNBc0N1cnJlbnRVc2VyKFBLRywgQ0xBU1MsICJ0ZXN0RmVhdHVyZUJhc2UiKTsKKyAgICB9CisKKyAgICBAQXBwTW9kZUluc3RhbnQKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmVhdHVyZUFwaUluc3RhbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdEZlYXR1cmVBcGlJbnN0YW50KHRydWUpOworICAgIH0KKworICAgIEBBcHBNb2RlRnVsbAorICAgIHB1YmxpYyB2b2lkIHRlc3RGZWF0dXJlQXBpRnVsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0RmVhdHVyZUFwaUluc3RhbnQoZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0RmVhdHVyZUFwaUluc3RhbnQoYm9vbGVhbiBpbnN0YW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbmV3IEluc3RhbGxNdWx0aXBsZSgpLmFkZEFwayhBUEspLmFkZEFwayhBUEtfRkVBVFVSRSkuYWRkQXBrKEFQS19GRUFUVVJFX3Y3KQorICAgICAgICAgICAgICAgIC5hZGRBcmcoaW5zdGFudCA/ICItLWluc3RhbnQiIDogIiIpLnJ1bigpOworICAgICAgICBydW5EZXZpY2VUZXN0c0FzQ3VycmVudFVzZXIoUEtHLCBDTEFTUywgInRlc3RGZWF0dXJlQXBpIik7CisgICAgfQorCisgICAgQEFwcE1vZGVGdWxsCisgICAgQEFwcE1vZGVJbnN0YW50CiAgICAgcHVibGljIHZvaWQgdGVzdEluaGVyaXRVcGRhdGVkQmFzZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBUT0RPOiBmbGVzaCBvdXQgdGhpcyB0ZXN0CiAgICAgfQogCisgICAgQEFwcE1vZGVGdWxsCisgICAgQEFwcE1vZGVJbnN0YW50CiAgICAgcHVibGljIHZvaWQgdGVzdEluaGVyaXRVcGRhdGVkU3BsaXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVE9ETzogZmxlc2ggb3V0IHRoaXMgdGVzdAogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHRlc3RGZWF0dXJlV2l0aG91dFJlc3RhcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBAQXBwTW9kZUluc3RhbnQKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmVhdHVyZVdpdGhvdXRSZXN0YXJ0SW5zdGFudCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0RmVhdHVyZVdpdGhvdXRSZXN0YXJ0KHRydWUpOworICAgIH0KKworICAgIEBBcHBNb2RlRnVsbAorICAgIHB1YmxpYyB2b2lkIHRlc3RGZWF0dXJlV2l0aG91dFJlc3RhcnRGdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RGZWF0dXJlV2l0aG91dFJlc3RhcnQoZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0RmVhdHVyZVdpdGhvdXRSZXN0YXJ0KGJvb2xlYW4gaW5zdGFudCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIG5ldyBJbnN0YWxsTXVsdGlwbGUoKS5hZGRBcGsoQVBLKS5ydW4oKTsKLSAgICAgICAgbmV3IEluc3RhbGxNdWx0aXBsZSgpLmFkZEFwayhBUEtfTk9fUkVTVEFSVF9CQVNFKS5ydW4oKTsKLSAgICAgICAgcnVuRGV2aWNlVGVzdHMoUEtHLCBDTEFTUywgInRlc3RCYXNlSW5zdGFsbGVkIik7CisKKyAgICAgICAgbmV3IEluc3RhbGxNdWx0aXBsZSgpLmFkZEFwayhBUEtfTk9fUkVTVEFSVF9CQVNFKQorICAgICAgICAgICAgICAgIC5hZGRBcmcoaW5zdGFudCA/ICItLWluc3RhbnQiIDogIiIpLnJ1bigpOworCisgICAgICAgIGlmIChpbnN0YW50KSB7CisgICAgICAgICAgICAvLyBQb2tlIHRoZSBmdWxsIGFwcCBzbyBpdCBjYW4gc2VlIHRoZSBpbnN0YW50IGFwcC4KKyAgICAgICAgICAgIHJ1bkRldmljZVRlc3RzQXNDdXJyZW50VXNlcihQS0dfTk9fUkVTVEFSVCwgQ0xBU1NfTk9fUkVTVEFSVCwgInRlc3RQb2tlRnVsbEFwcCIpOworICAgICAgICB9CisKKyAgICAgICAgcnVuRGV2aWNlVGVzdHNBc0N1cnJlbnRVc2VyKFBLRywgQ0xBU1MsICJ0ZXN0QmFzZUluc3RhbGxlZCIpOworCiAgICAgICAgIG5ldyBJbnN0YWxsTXVsdGlwbGUoKQorICAgICAgICAgICAgICAgIC5hZGRBcmcoaW5zdGFudCA/ICItLWluc3RhbnQiIDogIiIpCiAgICAgICAgICAgICAgICAgLmFkZEFyZygiLS1kb250LWtpbGwiKQogICAgICAgICAgICAgICAgIC5pbmhlcml0RnJvbShQS0dfTk9fUkVTVEFSVCkKICAgICAgICAgICAgICAgICAuYWRkQXBrKEFQS19OT19SRVNUQVJUX0ZFQVRVUkUpCiAgICAgICAgICAgICAgICAgLnJ1bigpOwotICAgICAgICBydW5EZXZpY2VUZXN0cyhQS0csIENMQVNTLCAidGVzdEZlYXR1cmVJbnN0YWxsZWQiKTsKKyAgICAgICAgcnVuRGV2aWNlVGVzdHNBc0N1cnJlbnRVc2VyKFBLRywgQ0xBU1MsICJ0ZXN0RmVhdHVyZUluc3RhbGxlZCIpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFZlcmlmeSB0aGF0IGluc3RhbGxpbmcgYSBuZXcgdmVyc2lvbiBvZiBhcHAgd2lwZXMgY29kZSBjYWNoZS4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJDb2RlQ2FjaGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbmV3IEluc3RhbGxNdWx0aXBsZSgpLmFkZEFwayhBUEspLnJ1bigpOwotICAgICAgICBydW5EZXZpY2VUZXN0cyhQS0csIENMQVNTLCAidGVzdENvZGVDYWNoZVdyaXRlIik7Ci0gICAgICAgIG5ldyBJbnN0YWxsTXVsdGlwbGUoKS5hZGRBcmcoIi1yIikuYWRkQXBrKEFQS19ESUZGX1ZFUlNJT04pLnJ1bigpOwotICAgICAgICBydW5EZXZpY2VUZXN0cyhQS0csIENMQVNTLCAidGVzdENvZGVDYWNoZVJlYWQiKTsKKyAgICBAQXBwTW9kZUluc3RhbnQKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJDb2RlQ2FjaGVJbnN0YW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RDbGVhckNvZGVDYWNoZSh0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWZXJpZnkgdGhhdCBpbnN0YWxsaW5nIGEgbmV3IHZlcnNpb24gb2YgYXBwIHdpcGVzIGNvZGUgY2FjaGUuCisgICAgICovCisgICAgQEFwcE1vZGVGdWxsCisgICAgcHVibGljIHZvaWQgdGVzdENsZWFyQ29kZUNhY2hlRnVsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0Q2xlYXJDb2RlQ2FjaGUoZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0Q2xlYXJDb2RlQ2FjaGUoYm9vbGVhbiBpbnN0YW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbmV3IEluc3RhbGxNdWx0aXBsZSgpLmFkZEFwayhBUEspCisgICAgICAgICAgICAgICAgLmFkZEFyZyhpbnN0YW50ID8gIi0taW5zdGFudCIgOiAiIikucnVuKCk7CisgICAgICAgIHJ1bkRldmljZVRlc3RzQXNDdXJyZW50VXNlcihQS0csIENMQVNTLCAidGVzdENvZGVDYWNoZVdyaXRlIik7CisgICAgICAgIG5ldyBJbnN0YWxsTXVsdGlwbGUoKS5hZGRBcmcoIi1yIikuYWRkQXBrKEFQS19ESUZGX1ZFUlNJT04pCisgICAgICAgICAgICAgICAgLmFkZEFyZyhpbnN0YW50ID8gIi0taW5zdGFudCIgOiAiIikucnVuKCk7CisgICAgICAgIHJ1bkRldmljZVRlc3RzQXNDdXJyZW50VXNlcihQS0csIENMQVNTLCAidGVzdENvZGVDYWNoZVJlYWQiKTsKICAgICB9CiAKICAgICBwcml2YXRlIGNsYXNzIEluc3RhbGxNdWx0aXBsZSBleHRlbmRzIEJhc2VJbnN0YWxsTXVsdGlwbGU8SW5zdGFsbE11bHRpcGxlPiB7CkBAIC0zMDYsOCArNjE2LDkgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHJ1bkRldmljZVRlc3RzKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHRlc3RDbGFzc05hbWUsIFN0cmluZyB0ZXN0TWV0aG9kTmFtZSkKLSAgICAgICAgICAgIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBVdGlscy5ydW5EZXZpY2VUZXN0cyhnZXREZXZpY2UoKSwgcGFja2FnZU5hbWUsIHRlc3RDbGFzc05hbWUsIHRlc3RNZXRob2ROYW1lKTsKKyAgICBwdWJsaWMgdm9pZCBydW5EZXZpY2VUZXN0c0FzQ3VycmVudFVzZXIoCisgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyB0ZXN0Q2xhc3NOYW1lLCBTdHJpbmcgdGVzdE1ldGhvZE5hbWUpCisgICAgICAgICAgICAgICAgICAgIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24geworICAgICAgICBVdGlscy5ydW5EZXZpY2VUZXN0c0FzQ3VycmVudFVzZXIoZ2V0RGV2aWNlKCksIHBhY2thZ2VOYW1lLCB0ZXN0Q2xhc3NOYW1lLCB0ZXN0TWV0aG9kTmFtZSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9zcmMvYW5kcm9pZC9hcHBzZWN1cml0eS9jdHMvU3RvcmFnZUhvc3RUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3NyYy9hbmRyb2lkL2FwcHNlY3VyaXR5L2N0cy9TdG9yYWdlSG9zdFRlc3QuamF2YQppbmRleCA2YmY3MWNmLi43YzY0MzI0IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3NyYy9hbmRyb2lkL2FwcHNlY3VyaXR5L2N0cy9TdG9yYWdlSG9zdFRlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3NyYy9hbmRyb2lkL2FwcHNlY3VyaXR5L2N0cy9TdG9yYWdlSG9zdFRlc3QuamF2YQpAQCAtMTYsOSArMTYsMTQgQEAKIAogcGFja2FnZSBhbmRyb2lkLmFwcHNlY3VyaXR5LmN0czsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRlc3R0eXBlLkNvbXBhdGliaWxpdHlIb3N0VGVzdEJhc2U7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOworaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi50ZXN0cnVubmVyLlRlc3RSZXN1bHQuVGVzdFN0YXR1czsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uOworaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnJlc3VsdC5UZXN0RGVzY3JpcHRpb247CitpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQucmVzdWx0LlRlc3RSZXN1bHQ7CitpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQucmVzdWx0LlRlc3RSdW5SZXN1bHQ7CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuRGV2aWNlSlVuaXQ0Q2xhc3NSdW5uZXI7CitpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuanVuaXQ0LkJhc2VIb3N0SlVuaXQ0VGVzdDsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnRpb25GYWlsZWRFcnJvcjsKIApAQCAtMjcsMTMgKzMyLDEzIEBACiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogLyoqCiAgKiBUZXN0cyB0aGF0IGV4ZXJjaXNlIHZhcmlvdXMgc3RvcmFnZSBBUElzLgogICovCiBAUnVuV2l0aChEZXZpY2VKVW5pdDRDbGFzc1J1bm5lci5jbGFzcykKLXB1YmxpYyBjbGFzcyBTdG9yYWdlSG9zdFRlc3QgZXh0ZW5kcyBDb21wYXRpYmlsaXR5SG9zdFRlc3RCYXNlIHsKK3B1YmxpYyBjbGFzcyBTdG9yYWdlSG9zdFRlc3QgZXh0ZW5kcyBCYXNlSG9zdEpVbml0NFRlc3QgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQS0dfU1RBVFMgPSAiY29tLmFuZHJvaWQuY3RzLnN0b3JhZ2VzdGF0c2FwcCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBLR19BID0gImNvbS5hbmRyb2lkLmN0cy5zdG9yYWdlYXBwX2EiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQS0dfQiA9ICJjb20uYW5kcm9pZC5jdHMuc3RvcmFnZWFwcF9iIjsKQEAgLTY5LDExICs3NCwxMyBAQAogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFZlcmlmeVF1b3RhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFV0aWxzLnJ1bkRldmljZVRlc3RzKGdldERldmljZSgpLCBQS0dfU1RBVFMsIENMQVNTX1NUQVRTLCAidGVzdFZlcmlmeVF1b3RhIik7CisgICAgQEFwcE1vZGVGdWxsIC8vIFRPRE86IE5lZWRzIHBvcnRpbmcgdG8gaW5zdGFudAorICAgIHB1YmxpYyB2b2lkIHRlc3RWZXJpZnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgVXRpbHMucnVuRGV2aWNlVGVzdHMoZ2V0RGV2aWNlKCksIFBLR19TVEFUUywgQ0xBU1NfU1RBVFMsICJ0ZXN0VmVyaWZ5Iik7CiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gVE9ETzogTmVlZHMgcG9ydGluZyB0byBpbnN0YW50CiAgICAgcHVibGljIHZvaWQgdGVzdFZlcmlmeUFwcFN0YXRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGZvciAoaW50IHVzZXIgOiBtVXNlcnMpIHsKICAgICAgICAgICAgIHJ1bkRldmljZVRlc3RzKFBLR19BLCBDTEFTUywgInRlc3RBbGxvY2F0ZSIsIHVzZXIpOwpAQCAtOTIsNiArOTksNyBAQAogICAgIH0KIAogICAgIEBUZXN0CisgICAgQEFwcE1vZGVGdWxsIC8vIFRPRE86IE5lZWRzIHBvcnRpbmcgdG8gaW5zdGFudAogICAgIHB1YmxpYyB2b2lkIHRlc3RWZXJpZnlBcHBRdW90YSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBmb3IgKGludCB1c2VyIDogbVVzZXJzKSB7CiAgICAgICAgICAgICBydW5EZXZpY2VUZXN0cyhQS0dfQSwgQ0xBU1MsICJ0ZXN0VmVyaWZ5UXVvdGFBcGkiLCB1c2VyKTsKQEAgLTk5LDYgKzEwNyw3IEBACiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gVE9ETzogTmVlZHMgcG9ydGluZyB0byBpbnN0YW50CiAgICAgcHVibGljIHZvaWQgdGVzdFZlcmlmeUFwcEFsbG9jYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGZvciAoaW50IHVzZXIgOiBtVXNlcnMpIHsKICAgICAgICAgICAgIHJ1bkRldmljZVRlc3RzKFBLR19BLCBDTEFTUywgInRlc3RWZXJpZnlBbGxvY2F0ZUFwaSIsIHVzZXIpOwpAQCAtMTA2LDYgKzExNSw3IEBACiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gVE9ETzogTmVlZHMgcG9ydGluZyB0byBpbnN0YW50CiAgICAgcHVibGljIHZvaWQgdGVzdFZlcmlmeVN1bW1hcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZm9yIChpbnQgdXNlciA6IG1Vc2VycykgewogICAgICAgICAgICAgcnVuRGV2aWNlVGVzdHMoUEtHX1NUQVRTLCBDTEFTU19TVEFUUywgInRlc3RWZXJpZnlTdW1tYXJ5IiwgdXNlcik7CkBAIC0xMTMsNiArMTIzLDcgQEAKICAgICB9CiAKICAgICBAVGVzdAorICAgIEBBcHBNb2RlRnVsbCAvLyBUT0RPOiBOZWVkcyBwb3J0aW5nIHRvIGluc3RhbnQKICAgICBwdWJsaWMgdm9pZCB0ZXN0VmVyaWZ5U3RhdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZm9yIChpbnQgdXNlciA6IG1Vc2VycykgewogICAgICAgICAgICAgcnVuRGV2aWNlVGVzdHMoUEtHX1NUQVRTLCBDTEFTU19TVEFUUywgInRlc3RWZXJpZnlTdGF0cyIsIHVzZXIpOwpAQCAtMTIwLDYgKzEzMSw3IEBACiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gVE9ETzogTmVlZHMgcG9ydGluZyB0byBpbnN0YW50CiAgICAgcHVibGljIHZvaWQgdGVzdFZlcmlmeVN0YXRzTXVsdGlwbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZm9yIChpbnQgdXNlciA6IG1Vc2VycykgewogICAgICAgICAgICAgcnVuRGV2aWNlVGVzdHMoUEtHX0EsIENMQVNTLCAidGVzdEFsbG9jYXRlIiwgdXNlcik7CkBAIC0xMzQsNiArMTQ2LDcgQEAKICAgICB9CiAKICAgICBAVGVzdAorICAgIEBBcHBNb2RlRnVsbCAvLyBUT0RPOiBOZWVkcyBwb3J0aW5nIHRvIGluc3RhbnQKICAgICBwdWJsaWMgdm9pZCB0ZXN0VmVyaWZ5U3RhdHNFeHRlcm5hbCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBmb3IgKGludCB1c2VyIDogbVVzZXJzKSB7CiAgICAgICAgICAgICBydW5EZXZpY2VUZXN0cyhQS0dfU1RBVFMsIENMQVNTX1NUQVRTLCAidGVzdFZlcmlmeVN0YXRzRXh0ZXJuYWwiLCB1c2VyKTsKQEAgLTE0MSw2ICsxNTQsNyBAQAogICAgIH0KIAogICAgIEBUZXN0CisgICAgQEFwcE1vZGVGdWxsIC8vIFRPRE86IE5lZWRzIHBvcnRpbmcgdG8gaW5zdGFudAogICAgIHB1YmxpYyB2b2lkIHRlc3RWZXJpZnlTdGF0c0V4dGVybmFsQ29uc2lzdGVudCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBmb3IgKGludCB1c2VyIDogbVVzZXJzKSB7CiAgICAgICAgICAgICBydW5EZXZpY2VUZXN0cyhQS0dfU1RBVFMsIENMQVNTX1NUQVRTLCAidGVzdFZlcmlmeVN0YXRzRXh0ZXJuYWxDb25zaXN0ZW50IiwgdXNlcik7CkBAIC0xNDgsNiArMTYyLDcgQEAKICAgICB9CiAKICAgICBAVGVzdAorICAgIEBBcHBNb2RlRnVsbCAvLyBUT0RPOiBOZWVkcyBwb3J0aW5nIHRvIGluc3RhbnQKICAgICBwdWJsaWMgdm9pZCB0ZXN0VmVyaWZ5Q2F0ZWdvcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZm9yIChpbnQgdXNlciA6IG1Vc2VycykgewogICAgICAgICAgICAgcnVuRGV2aWNlVGVzdHMoUEtHX1NUQVRTLCBDTEFTU19TVEFUUywgInRlc3RWZXJpZnlDYXRlZ29yeSIsIHVzZXIpOwpAQCAtMTU1LDYgKzE3MCw3IEBACiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gVE9ETzogTmVlZHMgcG9ydGluZyB0byBpbnN0YW50CiAgICAgcHVibGljIHZvaWQgdGVzdENhY2hlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRvIG1ha2UgdGhlIGNhY2hlIGNsZWFyaW5nIGxvZ2ljIGVhc2llciB0byB2ZXJpZnksIGlnbm9yZSBhbnkgY2FjaGUKICAgICAgICAgLy8gYW5kIGxvdyBzcGFjZSByZXNlcnZlZCBzcGFjZS4KQEAgLTE4MSw2ICsxOTcsNyBAQAogICAgIH0KIAogICAgIEBUZXN0CisgICAgQEFwcE1vZGVGdWxsIC8vIFRPRE86IE5lZWRzIHBvcnRpbmcgdG8gaW5zdGFudAogICAgIHB1YmxpYyB2b2lkIHRlc3RGdWxsRGlzaygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBDbGVhciBhbGwgb3RoZXIgY2FjaGVkIGFuZCBleHRlcm5hbCBzdG9yYWdlIGRhdGEgdG8gZ2l2ZSBvdXJzZWx2ZXMgYQogICAgICAgICAvLyBjbGVhbiBzbGF0ZSB0byB0ZXN0IGFnYWluc3QKQEAgLTIzOSw3ICsyNTYsMjIgQEAKIAogICAgIHB1YmxpYyB2b2lkIHJ1bkRldmljZVRlc3RzKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHRlc3RDbGFzc05hbWUsIFN0cmluZyB0ZXN0TWV0aG9kTmFtZSwKICAgICAgICAgICAgIGludCB1c2VySWQpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBVdGlscy5ydW5EZXZpY2VUZXN0cyhnZXREZXZpY2UoKSwgcGFja2FnZU5hbWUsIHRlc3RDbGFzc05hbWUsIHRlc3RNZXRob2ROYW1lLCB1c2VySWQsIG51bGwsCi0gICAgICAgICAgICAgICAgMjBMLCBUaW1lVW5pdC5NSU5VVEVTKTsKKyAgICAgICAgaWYgKCFydW5EZXZpY2VUZXN0cyhnZXREZXZpY2UoKSwgcGFja2FnZU5hbWUsIHRlc3RDbGFzc05hbWUsIHRlc3RNZXRob2ROYW1lLCB1c2VySWQsIDIwICogNjAgKiAxMDAwTCkpIHsKKyAgICAgICAgICAgIFRlc3RSdW5SZXN1bHQgcmVzID0gZ2V0TGFzdERldmljZVJ1blJlc3VsdHMoKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgZXJyb3JCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoIm9uLWRldmljZSB0ZXN0cyBmYWlsZWQ6XG4iKTsKKyAgICAgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxUZXN0RGVzY3JpcHRpb24sIFRlc3RSZXN1bHQ+IHJlc3VsdEVudHJ5IDoKKyAgICAgICAgICAgICAgICAgICAgcmVzLmdldFRlc3RSZXN1bHRzKCkuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdEVudHJ5LmdldFZhbHVlKCkuZ2V0U3RhdHVzKCkuZXF1YWxzKFRlc3RTdGF0dXMuUEFTU0VEKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JCdWlsZGVyLmFwcGVuZChyZXN1bHRFbnRyeS5nZXRLZXkoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQnVpbGRlci5hcHBlbmQoIjpcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JCdWlsZGVyLmFwcGVuZChyZXN1bHRFbnRyeS5nZXRWYWx1ZSgpLmdldFN0YWNrVHJhY2UoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGVycm9yQnVpbGRlci50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxlZEVycm9yKCJFcnJvciB3aGVuIHJ1bm5pbmcgZGV2aWNlIHRlc3RzLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9zcmMvYW5kcm9pZC9hcHBzZWN1cml0eS9jdHMvVXNlc0xpYnJhcnlIb3N0VGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9zcmMvYW5kcm9pZC9hcHBzZWN1cml0eS9jdHMvVXNlc0xpYnJhcnlIb3N0VGVzdC5qYXZhCmluZGV4IDRhZmViOWJmLi43YWMzZWZiIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3NyYy9hbmRyb2lkL2FwcHNlY3VyaXR5L2N0cy9Vc2VzTGlicmFyeUhvc3RUZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9zcmMvYW5kcm9pZC9hcHBzZWN1cml0eS9jdHMvVXNlc0xpYnJhcnlIb3N0VGVzdC5qYXZhCkBAIC0xNiw2ICsxNiw3IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5hcHBzZWN1cml0eS5jdHM7CiAKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQuYnVpbGQuQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmJ1aWxkLklCdWlsZEluZm87CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLkRldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKQEAgLTI4LDYgKzI5LDcgQEAKICAqIFNldCBvZiB0ZXN0cyB0aGF0IHZlcmlmeSBiZWhhdmlvciBvZiBydW50aW1lIHBlcm1pc3Npb25zLCBpbmNsdWRpbmcgYm90aAogICogZHluYW1pYyBncmFudGluZyBhbmQgYmVoYXZpb3Igb2YgbGVnYWN5IGFwcHMuCiAgKi8KK0BBcHBNb2RlRnVsbCAvLyBUT0RPOiBOZWVkcyBwb3J0aW5nIHRvIGluc3RhbnQKIHB1YmxpYyBjbGFzcyBVc2VzTGlicmFyeUhvc3RUZXN0IGV4dGVuZHMgRGV2aWNlVGVzdENhc2UgaW1wbGVtZW50cyBJQWJpUmVjZWl2ZXIsIElCdWlsZFJlY2VpdmVyIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEtHID0gImNvbS5hbmRyb2lkLmN0cy51c2VzbGlicmFyeSI7CiAKQEAgLTY3LDIxICs2OSwyMiBAQAogCiAgICAgcHVibGljIHZvaWQgdGVzdFVzZXNMaWJyYXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGFzc2VydE51bGwoZ2V0RGV2aWNlKCkuaW5zdGFsbFBhY2thZ2UobUJ1aWxkSGVscGVyLmdldFRlc3RGaWxlKEFQSyksIGZhbHNlLCBmYWxzZSkpOwotICAgICAgICBydW5EZXZpY2VUZXN0cyhQS0csICIuVXNlc0xpYnJhcnlUZXN0IiwgInRlc3RVc2VzTGlicmFyeSIpOworICAgICAgICBydW5EZXZpY2VUZXN0c0FzQ3VycmVudFVzZXIoUEtHLCAiLlVzZXNMaWJyYXJ5VGVzdCIsICJ0ZXN0VXNlc0xpYnJhcnkiKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0TWlzc2luZ0xpYnJhcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0TnVsbChnZXREZXZpY2UoKS5pbnN0YWxsUGFja2FnZShtQnVpbGRIZWxwZXIuZ2V0VGVzdEZpbGUoQVBLKSwgZmFsc2UsIGZhbHNlKSk7Ci0gICAgICAgIHJ1bkRldmljZVRlc3RzKFBLRywgIi5Vc2VzTGlicmFyeVRlc3QiLCAidGVzdE1pc3NpbmdMaWJyYXJ5Iik7CisgICAgICAgIHJ1bkRldmljZVRlc3RzQXNDdXJyZW50VXNlcihQS0csICIuVXNlc0xpYnJhcnlUZXN0IiwgInRlc3RNaXNzaW5nTGlicmFyeSIpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3REdXBsaWNhdGVMaWJyYXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGFzc2VydE51bGwoZ2V0RGV2aWNlKCkuaW5zdGFsbFBhY2thZ2UobUJ1aWxkSGVscGVyLmdldFRlc3RGaWxlKEFQSyksIGZhbHNlLCBmYWxzZSkpOwotICAgICAgICBydW5EZXZpY2VUZXN0cyhQS0csICIuVXNlc0xpYnJhcnlUZXN0IiwgInRlc3REdXBsaWNhdGVMaWJyYXJ5Iik7CisgICAgICAgIHJ1bkRldmljZVRlc3RzQXNDdXJyZW50VXNlcihQS0csICIuVXNlc0xpYnJhcnlUZXN0IiwgInRlc3REdXBsaWNhdGVMaWJyYXJ5Iik7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHJ1bkRldmljZVRlc3RzKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHRlc3RDbGFzc05hbWUsIFN0cmluZyB0ZXN0TWV0aG9kTmFtZSkKLSAgICAgICAgICAgIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBVdGlscy5ydW5EZXZpY2VUZXN0cyhnZXREZXZpY2UoKSwgcGFja2FnZU5hbWUsIHRlc3RDbGFzc05hbWUsIHRlc3RNZXRob2ROYW1lKTsKKyAgICBwcml2YXRlIHZvaWQgcnVuRGV2aWNlVGVzdHNBc0N1cnJlbnRVc2VyKAorICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgdGVzdENsYXNzTmFtZSwgU3RyaW5nIHRlc3RNZXRob2ROYW1lKQorICAgICAgICAgICAgICAgICAgICB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKKyAgICAgICAgVXRpbHMucnVuRGV2aWNlVGVzdHNBc0N1cnJlbnRVc2VyKGdldERldmljZSgpLCBwYWNrYWdlTmFtZSwgdGVzdENsYXNzTmFtZSwgdGVzdE1ldGhvZE5hbWUpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvc3JjL2FuZHJvaWQvYXBwc2VjdXJpdHkvY3RzL1V0aWxzLmphdmEgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3NyYy9hbmRyb2lkL2FwcHNlY3VyaXR5L2N0cy9VdGlscy5qYXZhCmluZGV4IDY3ZWUwOTEuLmZkYTY1NTEgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvc3JjL2FuZHJvaWQvYXBwc2VjdXJpdHkvY3RzL1V0aWxzLmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9zcmMvYW5kcm9pZC9hcHBzZWN1cml0eS9jdHMvVXRpbHMuamF2YQpAQCAtMTcsMTMgKzE3LDEzIEBACiBwYWNrYWdlIGFuZHJvaWQuYXBwc2VjdXJpdHkuY3RzOwogCiBpbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLnRlc3RydW5uZXIuUmVtb3RlQW5kcm9pZFRlc3RSdW5uZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLnRlc3RydW5uZXIuVGVzdElkZW50aWZpZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLnRlc3RydW5uZXIuVGVzdFJlc3VsdDsKIGltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIudGVzdHJ1bm5lci5UZXN0UmVzdWx0LlRlc3RTdGF0dXM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLnRlc3RydW5uZXIuVGVzdFJ1blJlc3VsdDsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5JVGVzdERldmljZTsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5yZXN1bHQuQ29sbGVjdGluZ1Rlc3RMaXN0ZW5lcjsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5yZXN1bHQuVGVzdERlc2NyaXB0aW9uOworaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnJlc3VsdC5UZXN0UmVzdWx0OworaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnJlc3VsdC5UZXN0UnVuUmVzdWx0OwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwpAQCAtMzIsMjQgKzMyLDE3IEBACiBwdWJsaWMgY2xhc3MgVXRpbHMgewogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVTRVJfU1lTVEVNID0gMDsKIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBydW5EZXZpY2VUZXN0cyhJVGVzdERldmljZSBkZXZpY2UsIFN0cmluZyBwYWNrYWdlTmFtZSkKLSAgICAgICAgICAgIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBydW5EZXZpY2VUZXN0cyhkZXZpY2UsIHBhY2thZ2VOYW1lLCBudWxsLCBudWxsLCBVU0VSX1NZU1RFTSwgbnVsbCk7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIHJ1bkRldmljZVRlc3RzQXNDdXJyZW50VXNlcihJVGVzdERldmljZSBkZXZpY2UsIFN0cmluZyBwYWNrYWdlTmFtZSwKKyAgICAgICAgICAgIFN0cmluZyB0ZXN0Q2xhc3NOYW1lLCBTdHJpbmcgdGVzdE1ldGhvZE5hbWUpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24geworICAgICAgICBydW5EZXZpY2VUZXN0cyhkZXZpY2UsIHBhY2thZ2VOYW1lLCB0ZXN0Q2xhc3NOYW1lLCB0ZXN0TWV0aG9kTmFtZSwgZGV2aWNlLmdldEN1cnJlbnRVc2VyKCksCisgICAgICAgICAgICAgICAgbnVsbCk7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJ1bkRldmljZVRlc3RzKElUZXN0RGV2aWNlIGRldmljZSwgU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgdXNlcklkKQotICAgICAgICAgICAgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJ1bkRldmljZVRlc3RzKGRldmljZSwgcGFja2FnZU5hbWUsIG51bGwsIG51bGwsIHVzZXJJZCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJ1bkRldmljZVRlc3RzKElUZXN0RGV2aWNlIGRldmljZSwgU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgdGVzdENsYXNzTmFtZSkKLSAgICAgICAgICAgIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBydW5EZXZpY2VUZXN0cyhkZXZpY2UsIHBhY2thZ2VOYW1lLCB0ZXN0Q2xhc3NOYW1lLCBudWxsLCBVU0VSX1NZU1RFTSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJ1bkRldmljZVRlc3RzKElUZXN0RGV2aWNlIGRldmljZSwgU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgdGVzdENsYXNzTmFtZSwKLSAgICAgICAgICAgIGludCB1c2VySWQpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBydW5EZXZpY2VUZXN0cyhkZXZpY2UsIHBhY2thZ2VOYW1lLCB0ZXN0Q2xhc3NOYW1lLCBudWxsLCB1c2VySWQsIG51bGwpOworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBydW5EZXZpY2VUZXN0c0FzQ3VycmVudFVzZXIoSVRlc3REZXZpY2UgZGV2aWNlLCBTdHJpbmcgcGFja2FnZU5hbWUsCisgICAgICAgICAgICBTdHJpbmcgdGVzdENsYXNzTmFtZSwgU3RyaW5nIHRlc3RNZXRob2ROYW1lLCBNYXA8U3RyaW5nLCBTdHJpbmc+IHRlc3RBcmdzKQorICAgICAgICAgICAgICAgICAgICB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKKyAgICAgICAgcnVuRGV2aWNlVGVzdHMoZGV2aWNlLCBwYWNrYWdlTmFtZSwgdGVzdENsYXNzTmFtZSwgdGVzdE1ldGhvZE5hbWUsIGRldmljZS5nZXRDdXJyZW50VXNlcigpLAorICAgICAgICAgICAgICAgIHRlc3RBcmdzKTsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgcnVuRGV2aWNlVGVzdHMoSVRlc3REZXZpY2UgZGV2aWNlLCBTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyB0ZXN0Q2xhc3NOYW1lLApAQCAtODQsNyArNzcsNyBAQAogICAgICAgICAgICAgdGVzdENsYXNzTmFtZSA9IHBhY2thZ2VOYW1lICsgdGVzdENsYXNzTmFtZTsKICAgICAgICAgfQogICAgICAgICBSZW1vdGVBbmRyb2lkVGVzdFJ1bm5lciB0ZXN0UnVubmVyID0gbmV3IFJlbW90ZUFuZHJvaWRUZXN0UnVubmVyKHBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIiwgZGV2aWNlLmdldElEZXZpY2UoKSk7CisgICAgICAgICAgICAgICAgImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIsIGRldmljZS5nZXRJRGV2aWNlKCkpOwogICAgICAgICAvLyB0aW1lb3V0X21zZWMgaXMgdGhlIHRpbWVvdXQgcGVyIHRlc3QgZm9yIGluc3RydW1lbnRhdGlvbgogICAgICAgICB0ZXN0UnVubmVyLmFkZEluc3RydW1lbnRhdGlvbkFyZygidGltZW91dF9tc2VjIiwgTG9uZy50b1N0cmluZyh1bml0LnRvTWlsbGlzKHRpbWVvdXQpKSk7CiAgICAgICAgIGlmICh0ZXN0Q2xhc3NOYW1lICE9IG51bGwgJiYgdGVzdE1ldGhvZE5hbWUgIT0gbnVsbCkgewpAQCAtMTEzLDcgKzEwNiw3IEBACiAgICAgICAgIGlmIChyZXN1bHQuaGFzRmFpbGVkVGVzdHMoKSkgewogICAgICAgICAgICAgLy8gYnVpbGQgYSBtZWFuaW5nZnVsIGVycm9yIG1lc3NhZ2UKICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgZXJyb3JCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoIm9uLWRldmljZSB0ZXN0cyBmYWlsZWQ6XG4iKTsKLSAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFRlc3RJZGVudGlmaWVyLCBUZXN0UmVzdWx0PiByZXN1bHRFbnRyeSA6CisgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxUZXN0RGVzY3JpcHRpb24sIFRlc3RSZXN1bHQ+IHJlc3VsdEVudHJ5IDoKICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0VGVzdFJlc3VsdHMoKS5lbnRyeVNldCgpKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHRFbnRyeS5nZXRWYWx1ZSgpLmdldFN0YXR1cygpLmVxdWFscyhUZXN0U3RhdHVzLlBBU1NFRCkpIHsKICAgICAgICAgICAgICAgICAgICAgZXJyb3JCdWlsZGVyLmFwcGVuZChyZXN1bHRFbnRyeS5nZXRLZXkoKS50b1N0cmluZygpKTsKQEAgLTE0NywxMCArMTQwLDExIEBACiAgICAgcHVibGljIHN0YXRpYyBpbnRbXSBwcmVwYXJlTXVsdGlwbGVVc2VycyhJVGVzdERldmljZSBkZXZpY2UsIGludCBtYXhVc2VycykKICAgICAgICAgICAgIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewogICAgICAgICBmaW5hbCBpbnRbXSB1c2VySWRzID0gZ2V0QWxsVXNlcnMoZGV2aWNlKTsKKyAgICAgICAgaW50IGN1cnJlbnRVc2VySWQgPSBkZXZpY2UuZ2V0Q3VycmVudFVzZXIoKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCB1c2VySWRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICBpZiAoaSA8IG1heFVzZXJzKSB7CiAgICAgICAgICAgICAgICAgZGV2aWNlLnN0YXJ0VXNlcih1c2VySWRzW2ldKTsKLSAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHVzZXJJZHNbaV0gIT0gY3VycmVudFVzZXJJZCkgewogICAgICAgICAgICAgICAgIGRldmljZS5zdG9wVXNlcih1c2VySWRzW2ldKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvQWNjZXNzU2VyaWFsTGVnYWN5L0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9BY2Nlc3NTZXJpYWxMZWdhY3kvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTBkZDA3Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvQWNjZXNzU2VyaWFsTGVnYWN5L0FuZHJvaWQubWsKQEAgLTAsMCArMSwzNiBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCisgICAgYW5kcm9pZHgudGVzdC5ydWxlcyBcCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0FjY2Vzc1NlcmlhbExlZ2FjeQorTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworCitMT0NBTF9QUk9HVUFSRF9FTkFCTEVEIDo9IGRpc2FibGVkCisKK0xPQ0FMX0RFWF9QUkVPUFQgOj0gZmFsc2UKKworaW5jbHVkZSAkKEJVSUxEX0NUU19TVVBQT1JUX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9BY2Nlc3NTZXJpYWxMZWdhY3kvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0FjY2Vzc1NlcmlhbExlZ2FjeS9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ODc0NzQKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9BY2Nlc3NTZXJpYWxMZWdhY3kvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgICoKKyAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgICoKKyAgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAqCisgICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgcGFja2FnZT0iYW5kcm9pZC5vcy5jdHMiPgorICAgIDx1c2VzLXNkayBhbmRyb2lkOm1pblNka1ZlcnNpb249IjI3IiBhbmRyb2lkOnRhcmdldFNka1ZlcnNpb249IjI3IiAvPgorCisgICAgPGFwcGxpY2F0aW9uLz4KKworICAgIDxpbnN0cnVtZW50YXRpb24KKyAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLm9zLmN0cyIgLz4KKworPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0FjY2Vzc1NlcmlhbExlZ2FjeS9zcmMvYW5kcm9pZC9vcy9jdHMvQWNjZXNzU2VyaWFsTGVnYWN5VGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvQWNjZXNzU2VyaWFsTGVnYWN5L3NyYy9hbmRyb2lkL29zL2N0cy9BY2Nlc3NTZXJpYWxMZWdhY3lUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRkOTdjMwotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0FjY2Vzc1NlcmlhbExlZ2FjeS9zcmMvYW5kcm9pZC9vcy9jdHMvQWNjZXNzU2VyaWFsTGVnYWN5VGVzdC5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQub3MuY3RzOworCitpbXBvcnQgc3RhdGljIGp1bml0LmZyYW1ld29yay5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMganVuaXQuZnJhbWV3b3JrLkFzc2VydC5mYWlsOworCitpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBUZXN0IHRoYXQgbGVnYWN5IGFwcHMgY2FuIGFjY2VzcyB0aGUgZGV2aWNlIHNlcmlhbCB3aXRob3V0IHRoZSBwaG9uZSBwZXJtaXNzaW9uLgorICovCitwdWJsaWMgY2xhc3MgQWNjZXNzU2VyaWFsTGVnYWN5VGVzdCB7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzU2VyaWFsTm9QZXJtaXNzaW9uTmVlZGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIEJ1aWxkLlNFUklBTCBzaG91bGQgcHJvdmlkZSB0aGUgZGV2aWNlIHNlcmlhbCBmb3IgbGVnYWN5IGFwcHMuCisgICAgICAgIC8vIFdlIGRvbid0IGtub3cgdGhlIHNlcmlhbCBidXQga25vdyB0aGF0IGl0IHNob3VsZCBub3QgYmUgdGhlIGR1bW15CisgICAgICAgIC8vIHZhbHVlIHJldHVybmVkIHRvIHVuYXV0aG9yaXplZCBjYWxsZXJzLCBzbyBtYWtlIHN1cmUgbm90IHRoYXQgdmFsdWUKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiQnVpbGQuU0VSSUFMIG11c3QgYmUgdmlzaWJsZSB0byBsZWdhY3kgYXBwcyIsCisgICAgICAgICAgICAgICAgIUJ1aWxkLlVOS05PV04uZXF1YWxzKEJ1aWxkLlNFUklBTCkpOworCisgICAgICAgIC8vIFdlIGRvbid0IGhhdmUgdGhlIFJFQURfUEhPTkVfU1RBVEUgcGVybWlzc2lvbiwgc28gdGhpcyBzaG91bGQgdGhyb3cKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEJ1aWxkLmdldFNlcmlhbCgpOworICAgICAgICAgICAgZmFpbCgiZ2V0U2VyaWFsKCkgbXVzdCBiZSBnYXRlZCBvbiB0aGUgUkVBRF9QSE9ORV9TVEFURSBwZXJtaXNzaW9uIik7CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8qIGV4cGVjdGVkICovCisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9BY2Nlc3NTZXJpYWxNb2Rlcm4vQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0FjY2Vzc1NlcmlhbE1vZGVybi9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkODkzYWEKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9BY2Nlc3NTZXJpYWxNb2Rlcm4vQW5kcm9pZC5tawpAQCAtMCwwICsxLDM3IEBACisjCisjIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKKyAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBcCisgICAgYW5kcm9pZHgudGVzdC5ydWxlcyBcCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0FjY2Vzc1NlcmlhbE1vZGVybgorTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworCitMT0NBTF9QUk9HVUFSRF9FTkFCTEVEIDo9IGRpc2FibGVkCisKK0xPQ0FMX0RFWF9QUkVPUFQgOj0gZmFsc2UKKworaW5jbHVkZSAkKEJVSUxEX0NUU19TVVBQT1JUX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9BY2Nlc3NTZXJpYWxNb2Rlcm4vQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0FjY2Vzc1NlcmlhbE1vZGVybi9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZjdhOGYKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9BY2Nlc3NTZXJpYWxNb2Rlcm4vQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDMyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgICoKKyAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgICoKKyAgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAqCisgICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgcGFja2FnZT0iYW5kcm9pZC5vcy5jdHMiPgorICAgIDx1c2VzLXNkayBhbmRyb2lkOm1pblNka1ZlcnNpb249IjI3IiBhbmRyb2lkOnRhcmdldFNka1ZlcnNpb249IjI4IiAvPgorCisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX1BIT05FX1NUQVRFIiAvPgorCisgICAgPGFwcGxpY2F0aW9uPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPGluc3RydW1lbnRhdGlvbgorICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQub3MuY3RzIiAvPgorCis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvQWNjZXNzU2VyaWFsTW9kZXJuL3NyYy9hbmRyb2lkL29zL2N0cy9BY2Nlc3NTZXJpYWxNb2Rlcm5UZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9BY2Nlc3NTZXJpYWxNb2Rlcm4vc3JjL2FuZHJvaWQvb3MvY3RzL0FjY2Vzc1NlcmlhbE1vZGVyblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzgzMmNmCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvQWNjZXNzU2VyaWFsTW9kZXJuL3NyYy9hbmRyb2lkL29zL2N0cy9BY2Nlc3NTZXJpYWxNb2Rlcm5UZXN0LmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5vcy5jdHM7CisKK2ltcG9ydCBzdGF0aWMganVuaXQuZnJhbWV3b3JrLkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0LmZhaWw7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIFRlc3QgdGhhdCBsZWdhY3kgYXBwcyBjYW4gYWNjZXNzIHRoZSBkZXZpY2Ugc2VyaWFsIHdpdGhvdXQgdGhlIHBob25lIHBlcm1pc3Npb24uCisgKi8KK3B1YmxpYyBjbGFzcyBBY2Nlc3NTZXJpYWxNb2Rlcm5UZXN0IHsKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NTZXJpYWxQZXJtaXNzaW9uTmVlZGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIEJ1aWxkLlNFUklBTCBzaG91bGQgbm90IHByb3ZpZGUgdGhlIGRldmljZSBzZXJpYWwgZm9yIG1vZGVybiBhcHBzLgorICAgICAgICAvLyBXZSBkb24ndCBrbm93IHRoZSBzZXJpYWwgYnV0IGtub3cgdGhhdCBpdCBzaG91bGQgYmUgdGhlIGR1bW15CisgICAgICAgIC8vIHZhbHVlIHJldHVybmVkIHRvIHVuYXV0aG9yaXplZCBjYWxsZXJzLCBzbyBtYWtlIHN1cmUgdGhhdCB2YWx1ZQorICAgICAgICBhc3NlcnRUcnVlKCJCdWlsZC5TRVJJQUwgbXVzdCBub3Qgd29yayBmb3IgbW9kZXJuIGFwcHMiLAorICAgICAgICAgICAgICAgIEJ1aWxkLlVOS05PV04uZXF1YWxzKEJ1aWxkLlNFUklBTCkpOworCisgICAgICAgIC8vIFdlIGRvbid0IGhhdmUgdGhlIHJlYWQgcGhvbmUgc3RhdGUgcGVybWlzc2lvbiwgc28gdGhpcyBzaG91bGQgdGhyb3cKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEJ1aWxkLmdldFNlcmlhbCgpOworICAgICAgICAgICAgZmFpbCgiZ2V0U2VyaWFsKCkgbXVzdCBiZSBnYXRlZCBvbiB0aGUgUkVBRF9QSE9ORV9TVEFURSBwZXJtaXNzaW9uIik7CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8qIGV4cGVjdGVkICovCisgICAgICAgIH0KKworICAgICAgICAvLyBOb3cgZ3JhbnQgb3Vyc2VsdmVzIFJFQURfUEhPTkVfU1RBVEUKKyAgICAgICAgZ3JhbnRSZWFkUGhvbmVTdGF0ZVBlcm1pc3Npb24oKTsKKworICAgICAgICAvLyBCdWlsZC5TRVJJQUwgc2hvdWxkIG5vdCBwcm92aWRlIHRoZSBkZXZpY2Ugc2VyaWFsIGZvciBtb2Rlcm4gYXBwcy4KKyAgICAgICAgYXNzZXJ0VHJ1ZSgiQnVpbGQuU0VSSUFMIG11c3Qgbm90IHdvcmsgZm9yIG1vZGVybiBhcHBzIiwKKyAgICAgICAgICAgICAgICBCdWlsZC5VTktOT1dOLmVxdWFscyhCdWlsZC5TRVJJQUwpKTsKKworICAgICAgICAvLyBXZSBoYXZlIHRoZSBSRUFEX1BIT05FX1NUQVRFIHBlcm1pc3Npb24sIHNvIHRoaXMgc2hvdWxkIG5vdCB0aHJvdworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQnVpbGQuZ2V0U2VyaWFsKCkgbXVzdCB3b3JrIGZvciBhcHBzIGhvbGRpbmcgUkVBRF9QSE9ORV9TVEFURSIsCisgICAgICAgICAgICAgICAgICAgICFCdWlsZC5VTktOT1dOLmVxdWFscyhCdWlsZC5nZXRTZXJpYWwoKSkpOworICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJnZXRTZXJpYWwoKSBtdXN0IGJlIGdhdGVkIG9uIHRoZSBSRUFEX1BIT05FX1NUQVRFIHBlcm1pc3Npb24iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBncmFudFJlYWRQaG9uZVN0YXRlUGVybWlzc2lvbigpIHsKKyAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VWlBdXRvbWF0aW9uKCkuZ3JhbnRSdW50aW1lUGVybWlzc2lvbigKKyAgICAgICAgICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCkuZ2V0UGFja2FnZU5hbWUoKSwKKyAgICAgICAgICAgICAgICBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uUkVBRF9QSE9ORV9TVEFURSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvQXBwQWNjZXNzRGF0YS9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvQXBwQWNjZXNzRGF0YS9BbmRyb2lkLm1rCmluZGV4IDJlNjkxMWQuLmI1NTY1NmUgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0FwcEFjY2Vzc0RhdGEvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9BcHBBY2Nlc3NEYXRhL0FuZHJvaWQubWsKQEAgLTIxLDcgKzIxLDkgQEAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIAogTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQtc3VwcG9ydC10ZXN0IGxlZ2FjeS1hbmRyb2lkLXRlc3QKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkeC50ZXN0LnJ1bGVzCisKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNBcHBBY2Nlc3NEYXRhCiAKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0FwcEFjY2Vzc0RhdGEvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0FwcEFjY2Vzc0RhdGEvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBmZmMxMDRlLi5kNDdiNGJkIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9BcHBBY2Nlc3NEYXRhL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvQXBwQWNjZXNzRGF0YS9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yMiwxMSArMjIsMTMgQEAKICAgICBjcmVhdGVkIGJ5IGNvbS5hbmRyb2lkLmN0cy5hcHB3aXRoZGF0YS4KICAgICAtLT4KIAorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uSU5URVJORVQiLz4KKwogICAgIDxhcHBsaWNhdGlvbj4KICAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CiAgICAgPC9hcHBsaWNhdGlvbj4KIAotICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5hbmRyb2lkLmN0cy5hcHBhY2Nlc3NkYXRhIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iVGVzdCB0byBjcmVhdGUgYXBwIGRhdGEuIi8+CiA8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvQXBwQWNjZXNzRGF0YS9zcmMvY29tL2FuZHJvaWQvY3RzL2FwcGFjY2Vzc2RhdGEvQWNjZXNzUHJpdmF0ZURhdGFUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9BcHBBY2Nlc3NEYXRhL3NyYy9jb20vYW5kcm9pZC9jdHMvYXBwYWNjZXNzZGF0YS9BY2Nlc3NQcml2YXRlRGF0YVRlc3QuamF2YQppbmRleCAwODY3OTY4Li43YTY0NTgzIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9BcHBBY2Nlc3NEYXRhL3NyYy9jb20vYW5kcm9pZC9jdHMvYXBwYWNjZXNzZGF0YS9BY2Nlc3NQcml2YXRlRGF0YVRlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9BcHBBY2Nlc3NEYXRhL3NyYy9jb20vYW5kcm9pZC9jdHMvYXBwYWNjZXNzZGF0YS9BY2Nlc3NQcml2YXRlRGF0YVRlc3QuamF2YQpAQCAtMTYsMTcgKzE2LDI1IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuY3RzLmFwcGFjY2Vzc2RhdGE7CiAKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQXBwbGljYXRpb25JbmZvOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuTmFtZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQubmV0LlRyYWZmaWNTdGF0czsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CisKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm87Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7CitpbXBvcnQgamF2YS5uZXQuU29ja2V0QWRkcmVzczsKIAogLyoqCiAgKiBUZXN0IHRoYXQgYW5vdGhlciBhcHAncyBwcml2YXRlIGRhdGEgY2Fubm90IGJlIGFjY2Vzc2VkLCB3aGlsZSBpdHMgcHVibGljIGRhdGEgY2FuLgpAQCAtNTEsNiArNTksMTAgQEAKICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElDX0ZJTEVfTkFNRSA9ICJwdWJsaWNfZmlsZS50eHQiOwogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFFUQUdVSURfU1RBVFNfRklMRSA9ICIvcHJvYy9uZXQveHRfcXRhZ3VpZC9zdGF0cyI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVcmkgUFJJVkFURV9UQVJHRVQgPSBVcmkucGFyc2UoImNvbnRlbnQ6Ly9jb20uYW5kcm9pZC5jdHMuYXBwd2l0aGRhdGEvIik7CisKICAgICAvKioKICAgICAgKiBUZXN0cyB0aGF0IGFub3RoZXIgYXBwJ3MgcHJpdmF0ZSBkYXRhIGNhbm5vdCBiZSBhY2Nlc3NlZC4gSXQgaW5jbHVkZXMgZmlsZQogICAgICAqIGFuZCBkZXRhaWxlZCB0cmFmZmljIHN0YXRzLgpAQCAtNjgsNyArODAsNiBAQAogICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gfCBTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAvLyBleHBlY3RlZAogICAgICAgICB9Ci0gICAgICAgIGFjY2Vzc1ByaXZhdGVUcmFmZmljU3RhdHMoKTsKICAgICB9CiAKICAgICBwcml2YXRlIEFwcGxpY2F0aW9uSW5mbyBnZXRBcHBsaWNhdGlvbkluZm8oU3RyaW5nIHBhY2thZ2VOYW1lKSB7CkBAIC05Nyw3ICsxMDgsMTUgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBhY2Nlc3NQcml2YXRlVHJhZmZpY1N0YXRzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzUHJvY1F0YWd1aWRUcmFmZmljU3RhdHNGYWlsZWQoKSB7CisgICAgICAgIC8vIEZvciB1bnRydXN0ZWQgYXBwIHdpdGggU0RLIFAgb3IgYWJvdmUsIHByb2MvbmV0L3h0X3F0YWd1aWQgZmlsZXMgYXJlIG5vIGxvbmcgcmVhZGFibGUuCisgICAgICAgIC8vIFRoZXkgY2FuIG9ubHkgcmVhZCB0aGVpciBvd24gc3RhdHMgZnJvbSBUcmFmZmljU3RhdHMgQVBJLiBUaGUgdGVzdCBmb3IgVHJhZmZpY1N0YXRzIEFQSQorICAgICAgICAvLyB3aWxsIGVuc3VyZSB0aGV5IGNhbm5vdCByZWFkIG90aGVyIGFwcHMgc3RhdHMuCisgICAgICAgIGFzc2VydEZhbHNlKCJ1bnRydXN0ZWQgYXBwIHNob3VsZCBub3QgYmUgYWJsZSB0byByZWFkIHF0YWd1aWQgcHJvZmlsZSIsCisgICAgICAgICAgICBuZXcgRmlsZShRVEFHVUlEX1NUQVRTX0ZJTEUpLmNhblJlYWQoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFjY2Vzc1ByaXZhdGVUcmFmZmljU3RhdHMoKSB7CiAgICAgICAgIGludCBvdGhlckFwcFVpZCA9IC0xOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgb3RoZXJBcHBVaWQgPSBnZXRDb250ZXh0KCkKQEAgLTEwNiwxOSArMTI1LDUzIEBACiAgICAgICAgIH0gY2F0Y2ggKE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBmYWlsKCJXYXMgbm90IGFibGUgdG8gZmluZCBvdGhlciBhcHAiKTsKICAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGludCBVTlNVUFBPUlRFRCA9IC0xOworICAgICAgICBhc3NlcnRFcXVhbHMoVU5TVVBQT1JURUQsIFRyYWZmaWNTdGF0cy5nZXRVaWRSeEJ5dGVzKG90aGVyQXBwVWlkKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhVTlNVUFBPUlRFRCwgVHJhZmZpY1N0YXRzLmdldFVpZFJ4UGFja2V0cyhvdGhlckFwcFVpZCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoVU5TVVBQT1JURUQsIFRyYWZmaWNTdGF0cy5nZXRVaWRUeEJ5dGVzKG90aGVyQXBwVWlkKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhVTlNVUFBPUlRFRCwgVHJhZmZpY1N0YXRzLmdldFVpZFR4UGFja2V0cyhvdGhlckFwcFVpZCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RUcmFmZmljU3RhdHNTdGF0c1VpZFNlbGYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgaW50IHVpZCA9IGFuZHJvaWQub3MuUHJvY2Vzcy5teVVpZCgpOworICAgICAgICBmaW5hbCBsb25nIHJ4YiA9IFRyYWZmaWNTdGF0cy5nZXRVaWRSeEJ5dGVzKHVpZCk7CisgICAgICAgIGZpbmFsIGxvbmcgcnhwID0gVHJhZmZpY1N0YXRzLmdldFVpZFJ4UGFja2V0cyh1aWQpOworICAgICAgICBmaW5hbCBsb25nIHR4YiA9IFRyYWZmaWNTdGF0cy5nZXRVaWRUeEJ5dGVzKHVpZCk7CisgICAgICAgIGZpbmFsIGxvbmcgdHhwID0gVHJhZmZpY1N0YXRzLmdldFVpZFR4UGFja2V0cyh1aWQpOworCisgICAgICAgIC8vIFN0YXJ0IHJlbW90ZSBzZXJ2ZXIKKyAgICAgICAgZmluYWwgaW50IHBvcnQgPSBnZXRDb250ZXh0KCkuZ2V0Q29udGVudFJlc29sdmVyKCkuY2FsbChQUklWQVRFX1RBUkdFVCwgInN0YXJ0IiwgbnVsbCwgbnVsbCkKKyAgICAgICAgICAgICAgICAuZ2V0SW50KCJwb3J0Iik7CisKKyAgICAgICAgLy8gVHJ5IHRhbGtpbmcgdG8gdGhlbSwgYnV0IHNoaWZ0IGJsYW1lCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBxdGFndWlkUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKCIvcHJvYy9uZXQveHRfcXRhZ3VpZC9zdGF0cyIpKTsKLSAgICAgICAgICAgIFN0cmluZyBsaW5lOwotICAgICAgICAgICAgd2hpbGUgKChsaW5lID0gcXRhZ3VpZFJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHRva2Vuc1tdID0gbGluZS5zcGxpdCgiICIpOwotICAgICAgICAgICAgICAgIGlmICh0b2tlbnMubGVuZ3RoID4gMyAmJiB0b2tlbnNbM10uZXF1YWxzKFN0cmluZy52YWx1ZU9mKG90aGVyQXBwVWlkKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlUHJpdmF0ZURhdGFUZXN0OnRlc3RDcmVhdGVQcml2YXRlRGF0YSBlbnN1cmVzIHdlIGNhbiBhY2Nlc3Mgb3VyIG93biBzdGF0cyBkYXRhCi0gICAgICAgICAgICAgICAgICAgIGZhaWwoIk90aGVyIGFwcHMgZGV0YWlsZWQgdHJhZmZpYyBzdGF0cyBsZWFrZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBxdGFndWlkUmVhZGVyLmNsb3NlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJXYXMgbm90IGFibGUgdG8gYWNjZXNzIHF0YWd1aWQvc3RhdHM6ICIgKyBlKTsKKyAgICAgICAgICAgIGZpbmFsIFNvY2tldCBzb2NrZXQgPSBuZXcgU29ja2V0KCk7CisgICAgICAgICAgICBzb2NrZXQuc2V0VGNwTm9EZWxheSh0cnVlKTsKKworICAgICAgICAgICAgQnVuZGxlIGV4dHJhcyA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgICAgIGV4dHJhcy5wdXRQYXJjZWxhYmxlKCJmZCIsIFBhcmNlbEZpbGVEZXNjcmlwdG9yLmZyb21Tb2NrZXQoc29ja2V0KSk7CisgICAgICAgICAgICBnZXRDb250ZXh0KCkuZ2V0Q29udGVudFJlc29sdmVyKCkuY2FsbChQUklWQVRFX1RBUkdFVCwgInRhZyIsIG51bGwsIGV4dHJhcyk7CisKKyAgICAgICAgICAgIHNvY2tldC5jb25uZWN0KG5ldyBJbmV0U29ja2V0QWRkcmVzcygibG9jYWxob3N0IiwgcG9ydCkpOworCisgICAgICAgICAgICBzb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCkud3JpdGUoNDIpOworICAgICAgICAgICAgc29ja2V0LmdldE91dHB1dFN0cmVhbSgpLmZsdXNoKCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgdmFsID0gc29ja2V0LmdldElucHV0U3RyZWFtKCkucmVhZCgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDQyLCB2YWwpOworICAgICAgICAgICAgc29ja2V0LmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZ2V0Q29udGV4dCgpLmdldENvbnRlbnRSZXNvbHZlcigpLmNhbGwoUFJJVkFURV9UQVJHRVQsICJzdG9wIiwgbnVsbCwgbnVsbCk7CiAgICAgICAgIH0KKworICAgICAgICBTeXN0ZW1DbG9jay5zbGVlcCgxMDAwKTsKKworICAgICAgICAvLyBTaW5jZSB3ZSBzaGlmdGVkIGJsYW1lLCBvdXIgc3RhdHMgc2hvdWxkbid0IGhhdmUgY2hhbmdlZAorICAgICAgICBhc3NlcnRFcXVhbHMocnhiLCBUcmFmZmljU3RhdHMuZ2V0VWlkUnhCeXRlcyh1aWQpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJ4cCwgVHJhZmZpY1N0YXRzLmdldFVpZFJ4UGFja2V0cyh1aWQpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHR4YiwgVHJhZmZpY1N0YXRzLmdldFVpZFR4Qnl0ZXModWlkKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0eHAsIFRyYWZmaWNTdGF0cy5nZXRVaWRUeFBhY2tldHModWlkKSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvQXBwV2l0aERhdGEvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0FwcFdpdGhEYXRhL0FuZHJvaWQubWsKaW5kZXggM2QxMWE4My4uMjk2NmM0OCAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvQXBwV2l0aERhdGEvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9BcHBXaXRoRGF0YS9BbmRyb2lkLm1rCkBAIC0yMSw3ICsyMSw5IEBACiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKIExPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLXN1cHBvcnQtdGVzdCBsZWdhY3ktYW5kcm9pZC10ZXN0CitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZHgudGVzdC5ydWxlcworCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicwogCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzQXBwV2l0aERhdGEKIApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvQXBwV2l0aERhdGEvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0FwcFdpdGhEYXRhL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggNTk4ZWJlNy4uY2Y5ZDQwNCAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvQXBwV2l0aERhdGEvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9BcHBXaXRoRGF0YS9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yMywxMSArMjMsMTcgQEAKICAgICAtLT4KIAogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uSU5URVJORVQiIC8+CisKICAgICA8YXBwbGljYXRpb24+CiAgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgorCisgICAgICAgIDxwcm92aWRlcgorICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5jdHMuYXBwd2l0aGRhdGEuTXlQcm92aWRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6YXV0aG9yaXRpZXM9ImNvbS5hbmRyb2lkLmN0cy5hcHB3aXRoZGF0YSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiIC8+CiAgICAgPC9hcHBsaWNhdGlvbj4KIAotICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5hbmRyb2lkLmN0cy5hcHB3aXRoZGF0YSIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IlRlc3QgdG8gY3JlYXRlIGFwcCBkYXRhLiIvPgogPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0FwcFdpdGhEYXRhL3NyYy9jb20vYW5kcm9pZC9jdHMvYXBwd2l0aGRhdGEvQ3JlYXRlUHJpdmF0ZURhdGFUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9BcHBXaXRoRGF0YS9zcmMvY29tL2FuZHJvaWQvY3RzL2FwcHdpdGhkYXRhL0NyZWF0ZVByaXZhdGVEYXRhVGVzdC5qYXZhCmluZGV4IGYzNzg3ZTguLjI3OWQ4NzggMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0FwcFdpdGhEYXRhL3NyYy9jb20vYW5kcm9pZC9jdHMvYXBwd2l0aGRhdGEvQ3JlYXRlUHJpdmF0ZURhdGFUZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvQXBwV2l0aERhdGEvc3JjL2NvbS9hbmRyb2lkL2N0cy9hcHB3aXRoZGF0YS9DcmVhdGVQcml2YXRlRGF0YVRlc3QuamF2YQpAQCAtODksNyArODksNiBAQAogCiAgICAgICAgIHdyaXRlVG9QcmVmZXJlbmNlcygpOwogICAgICAgICB3cml0ZVRvRGF0YWJhc2UoKTsKLSAgICAgICAgY3JlYXRlVHJhZmZpY1N0YXRzV2l0aFRhZ3MoKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgYWNjZXNzUHVibGljRGF0YSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC0xNjksNzYgKzE2OCw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgYWNjZXNzT3duVHJhZmZpY1N0YXRzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgaW50IG93bkFwcFVpZCA9IGdldENvbnRleHQoKS5nZXRBcHBsaWNhdGlvbkluZm8oKS51aWQ7Ci0KLSAgICAgICAgYm9vbGVhbiBmb3VuZE93bkRldGFpbGVkU3RhdHMgPSBmYWxzZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHF0YWd1aWRSZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoIi9wcm9jL25ldC94dF9xdGFndWlkL3N0YXRzIikpOwotICAgICAgICAgICAgU3RyaW5nIGxpbmU7Ci0gICAgICAgICAgICB3aGlsZSAoKGxpbmUgPSBxdGFndWlkUmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdG9rZW5zW10gPSBsaW5lLnNwbGl0KCIgIik7Ci0gICAgICAgICAgICAgICAgaWYgKHRva2Vucy5sZW5ndGggPiAzICYmIHRva2Vuc1szXS5lcXVhbHMoU3RyaW5nLnZhbHVlT2Yob3duQXBwVWlkKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCF0b2tlbnNbMl0uZXF1YWxzKCIweDAiKSkgewotICAgICAgICAgICAgICAgICAgICAgIGZvdW5kT3duRGV0YWlsZWRTdGF0cyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBxdGFndWlkUmVhZGVyLmNsb3NlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJXYXMgbm90IGFibGUgdG8gYWNjZXNzIHF0YWd1aWQvc3RhdHM6ICIgKyBlKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKCJXYXMgZXhwZWN0aW5nIHRvIGZpbmQgb3duIHRyYWZmaWMgc3RhdHMiLCBmb3VuZE93bkRldGFpbGVkU3RhdHMpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVUcmFmZmljU3RhdHNXaXRoVGFncygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gVHJhbnNmZXIgMU1CIG9mIGRhdGEgYWNyb3NzIGFuIGV4cGxpY2l0bHkgbG9jYWxob3N0IHNvY2tldC4KLSAgICAgICAgZmluYWwgaW50IGJ5dGVDb3VudCA9IDEwMjQ7Ci0gICAgICAgIGZpbmFsIGludCBwYWNrZXRDb3VudCA9IDEwMjQ7Ci0KLSAgICAgICAgZmluYWwgU2VydmVyU29ja2V0IHNlcnZlciA9IG5ldyBTZXJ2ZXJTb2NrZXQoMCk7Ci0gICAgICAgIG5ldyBUaHJlYWQoIkNyZWF0ZVByaXZhdGVEYXRhVGVzdC5jcmVhdGVUcmFmZmljU3RhdHNXaXRoVGFncyIpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIFNvY2tldCBzb2NrZXQgPSBuZXcgU29ja2V0KCJsb2NhbGhvc3QiLCBzZXJ2ZXIuZ2V0TG9jYWxQb3J0KCkpOwotICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBlYWNoIHdyaXRlKCkrZmx1c2goKSB0dXJucyBpbnRvIGEgcGFja2V0OgotICAgICAgICAgICAgICAgICAgICAvLyBkaXNhYmxlIE5hZ2xlLgotICAgICAgICAgICAgICAgICAgICBzb2NrZXQuc2V0VGNwTm9EZWxheSh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dCA9IHNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW2J5dGVDb3VudF07Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFja2V0Q291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgVHJhZmZpY1N0YXRzLnNldFRocmVhZFN0YXRzVGFnKGkgJSAxMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBUcmFmZmljU3RhdHMudGFnU29ja2V0KHNvY2tldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dC5mbHVzaCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG91dC5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICBzb2NrZXQuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJpbyBleGNlcHRpb24iICsgZSwgZmFsc2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfS5zdGFydCgpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTb2NrZXQgc29ja2V0ID0gc2VydmVyLmFjY2VwdCgpOwotICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBzb2NrZXQuZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtieXRlQ291bnRdOwotICAgICAgICAgICAgaW50IHJlYWQgPSAwOwotICAgICAgICAgICAgd2hpbGUgKHJlYWQgPCBieXRlQ291bnQgKiBwYWNrZXRDb3VudCkgewotICAgICAgICAgICAgICAgIGludCBuID0gaW4ucmVhZChidWYpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIlVuZXhwZWN0ZWQgRU9GIiwgbiA+IDApOwotICAgICAgICAgICAgICAgIHJlYWQgKz0gbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHNlcnZlci5jbG9zZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgYWNjZXNzT3duVHJhZmZpY1N0YXRzKCk7Ci0gICAgfQotCiAgICAgc3RhdGljIGNsYXNzIFRlc3REYXRhYmFzZU9wZW5IZWxwZXIgZXh0ZW5kcyBTUUxpdGVPcGVuSGVscGVyIHsKIAogICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIF9JRCA9ICJfaWQiOwpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvQXBwV2l0aERhdGEvc3JjL2NvbS9hbmRyb2lkL2N0cy9hcHB3aXRoZGF0YS9NeVByb3ZpZGVyLmphdmEgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9BcHBXaXRoRGF0YS9zcmMvY29tL2FuZHJvaWQvY3RzL2FwcHdpdGhkYXRhL015UHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWJkNTljCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvQXBwV2l0aERhdGEvc3JjL2NvbS9hbmRyb2lkL2N0cy9hcHB3aXRoZGF0YS9NeVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5hcHB3aXRoZGF0YTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5uZXQuVHJhZmZpY1N0YXRzOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGFuZHJvaWQuc3lzdGVtLk9zOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlNlcnZlclNvY2tldDsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7CisKK3B1YmxpYyBjbGFzcyBNeVByb3ZpZGVyIGV4dGVuZHMgQ29udGVudFByb3ZpZGVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkNUUyI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEN1cnNvciBxdWVyeShVcmkgdXJpLCBTdHJpbmdbXSBwcm9qZWN0aW9uLCBTdHJpbmcgc2VsZWN0aW9uLCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzLAorICAgICAgICAgICAgU3RyaW5nIHNvcnRPcmRlcikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoVXJpIHVyaSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVXJpIGluc2VydChVcmkgdXJpLCBDb250ZW50VmFsdWVzIHZhbHVlcykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGRlbGV0ZShVcmkgdXJpLCBTdHJpbmcgc2VsZWN0aW9uLCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgdXBkYXRlKFVyaSB1cmksIENvbnRlbnRWYWx1ZXMgdmFsdWVzLCBTdHJpbmcgc2VsZWN0aW9uLCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCdW5kbGUgY2FsbChTdHJpbmcgbWV0aG9kLCBTdHJpbmcgYXJnLCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgIExvZy52KFRBRywgImNhbGwoKSAiICsgbWV0aG9kKTsKKyAgICAgICAgc3dpdGNoIChtZXRob2QpIHsKKyAgICAgICAgICAgIGNhc2UgInN0YXJ0IjogeworICAgICAgICAgICAgICAgIHNlcnZlciA9IG5ldyBFY2hvU2VydmVyKCk7CisgICAgICAgICAgICAgICAgc2VydmVyLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgZXh0cmFzID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgICAgIGV4dHJhcy5wdXRJbnQoInBvcnQiLCBzZXJ2ZXIuc2VydmVyLmdldExvY2FsUG9ydCgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXh0cmFzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSAic3RvcCI6IHsKKyAgICAgICAgICAgICAgICBzZXJ2ZXIuaGFsdCgpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSAidGFnIjogeworICAgICAgICAgICAgICAgIGZpbmFsIGludCB1aWQgPSBPcy5nZXR1aWQoKTsKKyAgICAgICAgICAgICAgICBMb2cudihUQUcsICJNeSBVSUQgaXMgIiArIHVpZCk7CisgICAgICAgICAgICAgICAgVHJhZmZpY1N0YXRzLnNldFRocmVhZFN0YXRzVWlkKHVpZCk7CisgICAgICAgICAgICAgICAgaWYgKFRyYWZmaWNTdGF0cy5nZXRUaHJlYWRTdGF0c1VpZCgpICE9IHVpZCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIlRyYWZmaWNTdGF0cyBVSUQgbWlzbWF0Y2ghIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHBmZCA9IGV4dHJhcy5nZXRQYXJjZWxhYmxlKCJmZCIpOworICAgICAgICAgICAgICAgICAgICBUcmFmZmljU3RhdHMudGFnRmlsZURlc2NyaXB0b3IocGZkLmdldEZpbGVEZXNjcmlwdG9yKCkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgVHJhZmZpY1N0YXRzLmNsZWFyVGhyZWFkU3RhdHNVaWQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIEVjaG9TZXJ2ZXIgc2VydmVyOworCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRWNob1NlcnZlciBleHRlbmRzIFRocmVhZCB7CisgICAgICAgIGZpbmFsIFNlcnZlclNvY2tldCBzZXJ2ZXI7CisgICAgICAgIHZvbGF0aWxlIGJvb2xlYW4gaGFsdGVkID0gZmFsc2U7CisKKyAgICAgICAgcHVibGljIEVjaG9TZXJ2ZXIoKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNlcnZlciA9IG5ldyBTZXJ2ZXJTb2NrZXQoMCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBoYWx0KCkgeworICAgICAgICAgICAgaGFsdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc2VydmVyLmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgd2hpbGUgKCFoYWx0ZWQpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTb2NrZXQgc29ja2V0ID0gc2VydmVyLmFjY2VwdCgpOworICAgICAgICAgICAgICAgICAgICBzb2NrZXQuc2V0VGNwTm9EZWxheSh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHZhbCA9IHNvY2tldC5nZXRJbnB1dFN0cmVhbSgpLnJlYWQoKTsKKyAgICAgICAgICAgICAgICAgICAgc29ja2V0LmdldE91dHB1dFN0cmVhbSgpLndyaXRlKHZhbCk7CisgICAgICAgICAgICAgICAgICAgIHNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKS5mbHVzaCgpOworICAgICAgICAgICAgICAgICAgICBzb2NrZXQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvQXBwbGljYXRpb25WaXNpYmlsaXR5Q3Jvc3NVc2VyQXBwL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9BcHBsaWNhdGlvblZpc2liaWxpdHlDcm9zc1VzZXJBcHAvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzBkZTQyCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvQXBwbGljYXRpb25WaXNpYmlsaXR5Q3Jvc3NVc2VyQXBwL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzNiBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCisjIERvbid0IGluY2x1ZGUgdGhpcyBwYWNrYWdlIGluIGFueSB0YXJnZXQKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCisjIFdoZW4gYnVpbHQsIGV4cGxpY2l0bHkgcHV0IGl0IGluIHRoZSBkYXRhIHBhcnRpdGlvbi4KK0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCisKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCisgICAgYW5kcm9pZHgudGVzdC5ydWxlcworCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCisKKyMgdGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNBcHBsaWNhdGlvblZpc2liaWxpdHlDcm9zc1VzZXJBcHAKKworTE9DQUxfU0RLX1ZFUlNJT04gOj0gdGVzdF9jdXJyZW50CisKK2luY2x1ZGUgJChCVUlMRF9DVFNfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0FwcGxpY2F0aW9uVmlzaWJpbGl0eUNyb3NzVXNlckFwcC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvQXBwbGljYXRpb25WaXNpYmlsaXR5Q3Jvc3NVc2VyQXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk1YWUyNgotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0FwcGxpY2F0aW9uVmlzaWJpbGl0eUNyb3NzVXNlckFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMjcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLmN0cy5hcHBsaWNhdGlvbnZpc2liaWxpdHkiPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uSU5URVJBQ1RfQUNST1NTX1VTRVJTIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uSU5URVJBQ1RfQUNST1NTX1VTRVJTX0ZVTEwiIC8+CisgICAgPGFwcGxpY2F0aW9uPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmFuZHJvaWQuY3RzLmFwcGxpY2F0aW9udmlzaWJpbGl0eSIKKyAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IlRlc3QgdG8gY2hlY2sgYXBwbGljYXRpb24gdmlzaWJpbGl0eSBmb3IgYW4gYXBwIHdpdGggY3Jvc3MgdXNlciBwZXJtaXNzaW9uLiIvPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0FwcGxpY2F0aW9uVmlzaWJpbGl0eUNyb3NzVXNlckFwcC9zcmMvY29tL2FuZHJvaWQvY3RzL2FwcGxpY2F0aW9udmlzaWJpbGl0eS9BcHBsaWNhdGlvblZpc2liaWxpdHlDcm9zc1VzZXJUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9BcHBsaWNhdGlvblZpc2liaWxpdHlDcm9zc1VzZXJBcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy9hcHBsaWNhdGlvbnZpc2liaWxpdHkvQXBwbGljYXRpb25WaXNpYmlsaXR5Q3Jvc3NVc2VyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZGZhZDkKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9BcHBsaWNhdGlvblZpc2liaWxpdHlDcm9zc1VzZXJBcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy9hcHBsaWNhdGlvbnZpc2liaWxpdHkvQXBwbGljYXRpb25WaXNpYmlsaXR5Q3Jvc3NVc2VyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuY3RzLmFwcGxpY2F0aW9udmlzaWJpbGl0eTsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuTUFUQ0hfS05PV05fUEFDS0FHRVM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQXBwbGljYXRpb25JbmZvOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlSW5mbzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuSlVuaXQ0OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK0BSdW5XaXRoKEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBBcHBsaWNhdGlvblZpc2liaWxpdHlDcm9zc1VzZXJUZXN0IHsKKyAgICBwcml2YXRlIFN0cmluZyBUSU5ZX1BLRyA9ICJhbmRyb2lkLmFwcHNlY3VyaXR5LmN0cy50aW55YXBwIjsKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbUNvbnRleHQgPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCk7CisgICAgfQorCisgICAgLyoqIFRlc3RzIGdldHRpbmcgaW5zdGFsbGVkIHBhY2thZ2VzIGZvciB0aGUgY3VycmVudCB1c2VyICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFja2FnZVZpc2liaWxpdHlfY3VycmVudFVzZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUGFja2FnZU1hbmFnZXIgcG0gPSBtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICBmaW5hbCBMaXN0PFBhY2thZ2VJbmZvPiBwYWNrYWdlTGlzdCA9CisgICAgICAgICAgICAgICAgcG0uZ2V0SW5zdGFsbGVkUGFja2FnZXNBc1VzZXIoMCwgbUNvbnRleHQuZ2V0VXNlcklkKCkpOworICAgICAgICBhc3NlcnRGYWxzZShpc0FwcEluUGFja2FnZUxpc3QoVElOWV9QS0csIHBhY2thZ2VMaXN0KSk7CisgICAgfQorCisgICAgLyoqIFRlc3RzIGdldHRpbmcgaW5zdGFsbGVkIHBhY2thZ2VzIGZvciBhbGwgdXNlcnMsIHdpdGggY3Jvc3MgdXNlciBwZXJtaXNzaW9uIGdyYW50ZWQgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYWNrYWdlVmlzaWJpbGl0eV9hbnlVc2VyQ3Jvc3NVc2VyR3JhbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUGFja2FnZU1hbmFnZXIgcG0gPSBtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICBmaW5hbCBMaXN0PFBhY2thZ2VJbmZvPiBwYWNrYWdlTGlzdCA9CisgICAgICAgICAgICAgICAgcG0uZ2V0SW5zdGFsbGVkUGFja2FnZXNBc1VzZXIoTUFUQ0hfS05PV05fUEFDS0FHRVMsIG1Db250ZXh0LmdldFVzZXJJZCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShpc0FwcEluUGFja2FnZUxpc3QoVElOWV9QS0csIHBhY2thZ2VMaXN0KSk7CisgICAgfQorCisgICAgLyoqIFRlc3RzIGdldHRpbmcgaW5zdGFsbGVkIHBhY2thZ2VzIGZvciBhbGwgdXNlcnMsIHdpdGggY3Jvc3MgdXNlciBwZXJtaXNzaW9uIHJldm9rZWQgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYWNrYWdlVmlzaWJpbGl0eV9hbnlVc2VyQ3Jvc3NVc2VyTm9HcmFudCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBQYWNrYWdlTWFuYWdlciBwbSA9IG1Db250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBMaXN0PFBhY2thZ2VJbmZvPiBwYWNrYWdlTGlzdCA9CisgICAgICAgICAgICAgICAgICAgIHBtLmdldEluc3RhbGxlZFBhY2thZ2VzQXNVc2VyKE1BVENIX0tOT1dOX1BBQ0tBR0VTLCBtQ29udGV4dC5nZXRVc2VySWQoKSk7CisgICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSByZWNlaXZlZCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBpZ25vcmUpIHt9CisgICAgfQorCisgICAgLyoqIFRlc3RzIGdldHRpbmcgaW5zdGFsbGVkIHBhY2thZ2VzIGZvciBhbm90aGVyIHVzZXIsIHdpdGggY3Jvc3MgdXNlciBwZXJtaXNzaW9uIGdyYW50ZWQgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYWNrYWdlVmlzaWJpbGl0eV9vdGhlclVzZXJHcmFudCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBQYWNrYWdlTWFuYWdlciBwbSA9IG1Db250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgIGZpbmFsIExpc3Q8UGFja2FnZUluZm8+IHBhY2thZ2VMaXN0ID0KKyAgICAgICAgICAgICAgICBwbS5nZXRJbnN0YWxsZWRQYWNrYWdlc0FzVXNlcigwLCBnZXRUZXN0VXNlcigpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShpc0FwcEluUGFja2FnZUxpc3QoVElOWV9QS0csIHBhY2thZ2VMaXN0KSk7CisgICAgfQorCisgICAgLyoqIFRlc3RzIGdldHRpbmcgaW5zdGFsbGVkIHBhY2thZ2VzIGZvciBhbm90aGVyIHVzZXIsIHdpdGggY3Jvc3MgdXNlciBwZXJtaXNzaW9uIHJldm9rZWQgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYWNrYWdlVmlzaWJpbGl0eV9vdGhlclVzZXJOb0dyYW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFBhY2thZ2VNYW5hZ2VyIHBtID0gbUNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8UGFja2FnZUluZm8+IHBhY2thZ2VMaXN0ID0KKyAgICAgICAgICAgICAgICAgICAgcG0uZ2V0SW5zdGFsbGVkUGFja2FnZXNBc1VzZXIoMCwgZ2V0VGVzdFVzZXIoKSk7CisgICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSByZWNlaXZlZCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBpZ25vcmUpIHt9CisgICAgfQorCisgICAgLyoqIFRlc3RzIGdldHRpbmcgaW5zdGFsbGVkIGFwcGxpY2F0aW9ucyBmb3IgdGhlIGN1cnJlbnQgdXNlciAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFwcGxpY2F0aW9uVmlzaWJpbGl0eV9jdXJyZW50VXNlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBQYWNrYWdlTWFuYWdlciBwbSA9IG1Db250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgIGZpbmFsIExpc3Q8QXBwbGljYXRpb25JbmZvPiBhcHBsaWNhdGlvbkxpc3QgPQorICAgICAgICAgICAgICAgIHBtLmdldEluc3RhbGxlZEFwcGxpY2F0aW9uc0FzVXNlcigwLCBtQ29udGV4dC5nZXRVc2VySWQoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGlzQXBwSW5BcHBsaWNhdGlvbkxpc3QoVElOWV9QS0csIGFwcGxpY2F0aW9uTGlzdCkpOworICAgIH0KKworICAgIC8qKiBUZXN0cyBnZXR0aW5nIGluc3RhbGxlZCBhcHBsaWNhdGlvbnMgZm9yIGFsbCB1c2Vycywgd2l0aCBjcm9zcyB1c2VyIHBlcm1pc3Npb24gZ3JhbnRlZCAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFwcGxpY2F0aW9uVmlzaWJpbGl0eV9hbnlVc2VyQ3Jvc3NVc2VyR3JhbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUGFja2FnZU1hbmFnZXIgcG0gPSBtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICBmaW5hbCBMaXN0PEFwcGxpY2F0aW9uSW5mbz4gYXBwbGljYXRpb25MaXN0ID0KKyAgICAgICAgICAgICAgICBwbS5nZXRJbnN0YWxsZWRBcHBsaWNhdGlvbnNBc1VzZXIoTUFUQ0hfS05PV05fUEFDS0FHRVMsIG1Db250ZXh0LmdldFVzZXJJZCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShpc0FwcEluQXBwbGljYXRpb25MaXN0KFRJTllfUEtHLCBhcHBsaWNhdGlvbkxpc3QpKTsKKyAgICB9CisKKyAgICAvKiogVGVzdHMgZ2V0dGluZyBpbnN0YWxsZWQgYXBwbGljYXRpb25zIGZvciBhbGwgdXNlcnMsIHdpdGggY3Jvc3MgdXNlciBwZXJtaXNzaW9uIHJldm9rZWQgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBsaWNhdGlvblZpc2liaWxpdHlfYW55VXNlckNyb3NzVXNlck5vR3JhbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUGFja2FnZU1hbmFnZXIgcG0gPSBtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgTGlzdDxBcHBsaWNhdGlvbkluZm8+IGFwcGxpY2F0aW9uTGlzdCA9CisgICAgICAgICAgICAgICAgICAgIHBtLmdldEluc3RhbGxlZEFwcGxpY2F0aW9uc0FzVXNlcihNQVRDSF9LTk9XTl9QQUNLQUdFUywgbUNvbnRleHQuZ2V0VXNlcklkKCkpOworICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBzZWN1cml0eSBleGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gaWdub3JlKSB7fQorICAgIH0KKworICAgIC8qKiBUZXN0cyBnZXR0aW5nIGluc3RhbGxlZCBhcHBsaWNhdGlvbnMgZm9yIGFub3RoZXIgdXNlciwgd2l0aCBjcm9zcyB1c2VyIHBlcm1pc3Npb24gZ3JhbnRlZCAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFwcGxpY2F0aW9uVmlzaWJpbGl0eV9vdGhlclVzZXJHcmFudCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBQYWNrYWdlTWFuYWdlciBwbSA9IG1Db250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgIGZpbmFsIExpc3Q8QXBwbGljYXRpb25JbmZvPiBhcHBsaWNhdGlvbkxpc3QgPQorICAgICAgICAgICAgICAgIHBtLmdldEluc3RhbGxlZEFwcGxpY2F0aW9uc0FzVXNlcigwLCBnZXRUZXN0VXNlcigpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShpc0FwcEluQXBwbGljYXRpb25MaXN0KFRJTllfUEtHLCBhcHBsaWNhdGlvbkxpc3QpKTsKKyAgICB9CisKKyAgICAvKiogVGVzdHMgZ2V0dGluZyBpbnN0YWxsZWQgYXBwbGljYXRpb25zIGZvciBhbm90aGVyIHVzZXIsIHdpdGggY3Jvc3MgdXNlciBwZXJtaXNzaW9uIHJldm9rZWQgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBsaWNhdGlvblZpc2liaWxpdHlfb3RoZXJVc2VyTm9HcmFudCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBQYWNrYWdlTWFuYWdlciBwbSA9IG1Db250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBMaXN0PEFwcGxpY2F0aW9uSW5mbz4gYXBwbGljYXRpb25MaXN0ID0KKyAgICAgICAgICAgICAgICAgICAgcG0uZ2V0SW5zdGFsbGVkQXBwbGljYXRpb25zQXNVc2VyKDAsIGdldFRlc3RVc2VyKCkpOworICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBzZWN1cml0eSBleGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gaWdub3JlKSB7fQorICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc0FwcEluUGFja2FnZUxpc3QoU3RyaW5nIHBhY2thZ2VOYW1lLAorICAgICAgICAgICAgTGlzdDxQYWNrYWdlSW5mbz4gcGFja2FnZUxpc3QpIHsKKyAgICAgICAgZm9yIChQYWNrYWdlSW5mbyBwa2dJbmZvIDogcGFja2FnZUxpc3QpIHsKKyAgICAgICAgICAgIGlmIChwa2dJbmZvLnBhY2thZ2VOYW1lLmVxdWFscyhwYWNrYWdlTmFtZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzQXBwSW5BcHBsaWNhdGlvbkxpc3QoCisgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUsIExpc3Q8QXBwbGljYXRpb25JbmZvPiBhcHBsaWNhdGlvbkxpc3QpIHsKKyAgICAgICAgZm9yIChBcHBsaWNhdGlvbkluZm8gYXBwSW5mbyA6IGFwcGxpY2F0aW9uTGlzdCkgeworICAgICAgICAgICAgaWYgKGFwcEluZm8ucGFja2FnZU5hbWUuZXF1YWxzKHBhY2thZ2VOYW1lKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBnZXRUZXN0VXNlcigpIHsKKyAgICAgICAgZmluYWwgQnVuZGxlIHRlc3RBcmd1bWVudHMgPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRBcmd1bWVudHMoKTsKKyAgICAgICAgaWYgKHRlc3RBcmd1bWVudHMuY29udGFpbnNLZXkoInRlc3RVc2VyIikpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQodGVzdEFyZ3VtZW50cy5nZXRTdHJpbmcoInRlc3RVc2VyIikpOworICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlnbm9yZSkge30KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUNvbnRleHQuZ2V0VXNlcklkKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvQ2xhc3NMb2FkZXJTcGxpdEFwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvQ2xhc3NMb2FkZXJTcGxpdEFwcC9BbmRyb2lkLm1rCmluZGV4IDFhZGYwZjguLjc2MWZjZTggMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0NsYXNzTG9hZGVyU3BsaXRBcHAvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9DbGFzc0xvYWRlclNwbGl0QXBwL0FuZHJvaWQubWsKQEAgLTIzLDcgKzIzLDcgQEAKIExPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKIExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiBMT0NBTF9FWFBPUlRfUEFDS0FHRV9SRVNPVVJDRVMgOj0gdHJ1ZQotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGN0c3Rlc3RydW5uZXIgYW5kcm9pZC1zdXBwb3J0LXRlc3QKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjdHN0ZXN0cnVubmVyLWF4dCBhbmRyb2lkeC50ZXN0LnJ1bGVzCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvQ2xhc3NMb2FkZXJTcGxpdEFwcC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvQ2xhc3NMb2FkZXJTcGxpdEFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDA1ZjQ1NzMuLjIzODNmMGIgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0NsYXNzTG9hZGVyU3BsaXRBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9DbGFzc0xvYWRlclNwbGl0QXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTM2LDcgKzM2LDcgQEAKIAogICAgIDwvYXBwbGljYXRpb24+CiAKLSAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5hbmRyb2lkLmN0cy5jbGFzc2xvYWRlcnNwbGl0YXBwIiAvPgogCiA8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvQ2xhc3NMb2FkZXJTcGxpdEFwcC9mZWF0dXJlX2EvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0NsYXNzTG9hZGVyU3BsaXRBcHAvZmVhdHVyZV9hL0FuZHJvaWQubWsKaW5kZXggMjY4MzEyOC4uZjM3YmU0NCAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvQ2xhc3NMb2FkZXJTcGxpdEFwcC9mZWF0dXJlX2EvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9DbGFzc0xvYWRlclNwbGl0QXBwL2ZlYXR1cmVfYS9BbmRyb2lkLm1rCkBAIC0yMiw2ICsyMiw3IEBACiBMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cwogTE9DQUxfRVhQT1JUX1BBQ0tBR0VfUkVTT1VSQ0VTIDo9IHRydWUKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNDbGFzc2xvYWRlclNwbGl0QXBwRmVhdHVyZUEKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtc3ViZGlyLWphdmEtZmlsZXMpCiAKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0NsYXNzTG9hZGVyU3BsaXRBcHAvZmVhdHVyZV9iL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9DbGFzc0xvYWRlclNwbGl0QXBwL2ZlYXR1cmVfYi9BbmRyb2lkLm1rCmluZGV4IGExYjQzZWEuLjMyNjJlMTUgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0NsYXNzTG9hZGVyU3BsaXRBcHAvZmVhdHVyZV9iL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvQ2xhc3NMb2FkZXJTcGxpdEFwcC9mZWF0dXJlX2IvQW5kcm9pZC5tawpAQCAtMjEsNiArMjEsNyBAQAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKIExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzQ2xhc3Nsb2FkZXJTcGxpdEFwcEZlYXR1cmVCCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLXN1YmRpci1qYXZhLWZpbGVzKQogCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9DbGFzc0xvYWRlclNwbGl0QXBwL3NyYy9jb20vYW5kcm9pZC9jdHMvY2xhc3Nsb2FkZXJzcGxpdGFwcC9TcGxpdEFwcFRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0NsYXNzTG9hZGVyU3BsaXRBcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy9jbGFzc2xvYWRlcnNwbGl0YXBwL1NwbGl0QXBwVGVzdC5qYXZhCmluZGV4IDU0NDgyYTguLmNiZTMzMzggMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0NsYXNzTG9hZGVyU3BsaXRBcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy9jbGFzc2xvYWRlcnNwbGl0YXBwL1NwbGl0QXBwVGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0NsYXNzTG9hZGVyU3BsaXRBcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy9jbGFzc2xvYWRlcnNwbGl0YXBwL1NwbGl0QXBwVGVzdC5qYXZhCkBAIC0yNCwxMiArMjQsMTEgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiAKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKQEAgLTM4LDcgKzM3LDYgQEAKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMubW9kZWwuU3RhdGVtZW50OwogCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db21wbGV0YWJsZUZ1dHVyZTsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKIApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRGVjbGFyZU5vdFJ1bnRpbWVQZXJtaXNzaW9ucy9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRGVjbGFyZU5vdFJ1bnRpbWVQZXJtaXNzaW9ucy9BbmRyb2lkLm1rCmluZGV4IGRiZjUyODQuLjZhZjllNzIgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0RlY2xhcmVOb3RSdW50aW1lUGVybWlzc2lvbnMvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9EZWNsYXJlTm90UnVudGltZVBlcm1pc3Npb25zL0FuZHJvaWQubWsKQEAgLTIxLDYgKzIxLDcgQEAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNEZWNsYXJlTm9uUnVudGltZVBlcm1pc3Npb25zCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CiAKIExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiAKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0RvY3VtZW50Q2xpZW50L0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Eb2N1bWVudENsaWVudC9BbmRyb2lkLm1rCmluZGV4IDBhNTU4MzQuLjA0ZTE4NzAgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0RvY3VtZW50Q2xpZW50L0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRG9jdW1lbnRDbGllbnQvQW5kcm9pZC5tawpAQCAtMjAsNyArMjAsOSBAQAogCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwogTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQtc3VwcG9ydC10ZXN0IGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwgY3RzdGVzdHJ1bm5lciB1Yi11aWF1dG9tYXRvcgorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWR4LnRlc3QucnVsZXMgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgY3RzdGVzdHJ1bm5lci1heHQgdWItdWlhdXRvbWF0b3IKKworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lci5zdHVicyBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicwogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0RvY3VtZW50Q2xpZW50L0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Eb2N1bWVudENsaWVudC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDAwNjRlMTUuLmM5MGE2ZjYgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0RvY3VtZW50Q2xpZW50L0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRG9jdW1lbnRDbGllbnQvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjEsNiArMjEsNiBAQAogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuTXlBY3Rpdml0eSIgLz4KICAgICA8L2FwcGxpY2F0aW9uPgogICAgIDxpbnN0cnVtZW50YXRpb24KLSAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5jdHMuZG9jdW1lbnRjbGllbnQiIC8+CiA8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRG9jdW1lbnRDbGllbnQvc3JjL2NvbS9hbmRyb2lkL2N0cy9kb2N1bWVudGNsaWVudC9Eb2N1bWVudHNDbGllbnRUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Eb2N1bWVudENsaWVudC9zcmMvY29tL2FuZHJvaWQvY3RzL2RvY3VtZW50Y2xpZW50L0RvY3VtZW50c0NsaWVudFRlc3QuamF2YQppbmRleCBlODVlMTY3Li41MDMyYWQzIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Eb2N1bWVudENsaWVudC9zcmMvY29tL2FuZHJvaWQvY3RzL2RvY3VtZW50Y2xpZW50L0RvY3VtZW50c0NsaWVudFRlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Eb2N1bWVudENsaWVudC9zcmMvY29tL2FuZHJvaWQvY3RzL2RvY3VtZW50Y2xpZW50L0RvY3VtZW50c0NsaWVudFRlc3QuamF2YQpAQCAtMTAxLDYgKzEwMSwxNSBAQAogICAgICAgICBhc3NlcnRUcnVlKCJGaXJzdCBsaXN0IGl0ZW0iLAogICAgICAgICAgICAgICAgIG5ldyBVaU9iamVjdChkb2NMaXN0LmNoaWxkU2VsZWN0b3IobmV3IFVpU2VsZWN0b3IoKSkpLndhaXRGb3JFeGlzdHMoVElNRU9VVCkpOwogCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvL0VuZm9ybmNlIHRvIHNldCB0aGUgbGlzdCBtb2RlCisgICAgICAgICAgICAvL0JlY2F1c2UgVWlTY3JvbGxhYmxlIGNhbid0IHJlYWNoIHRoZSByZWFsIGJvdHRvbSAod2hlbiBXRUJfTElOS0FCTEVfRklMRSBpdGVtKSBpbiBncmlkIG1vZGUgd2hlbiBzY3JlZW4gbGFuZHNjYXBlIG1vZGUKKyAgICAgICAgICAgIG5ldyBVaU9iamVjdChuZXcgVWlTZWxlY3RvcigpLnJlc291cmNlSWQoImNvbS5hbmRyb2lkLmRvY3VtZW50c3VpOmlkL29wdGlvbl9tZW51X2xpc3QiKSkuY2xpY2soKTsKKyAgICAgICAgICAgIG1EZXZpY2Uud2FpdEZvcklkbGUoKTsKKyAgICAgICAgfWNhdGNoIChVaU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgLy9kbyBub3RoaW5nLCBhbHJlYWR5IGJlIGluIGxpc3QgbW9kZS4KKyAgICAgICAgfQorCiAgICAgICAgIC8vIE5vdyBzY3JvbGwgYXJvdW5kIHRvIGZpbmQgb3VyIGl0ZW0KICAgICAgICAgbmV3IFVpU2Nyb2xsYWJsZShkb2NMaXN0KS5zY3JvbGxJbnRvVmlldyhuZXcgVWlTZWxlY3RvcigpLnRleHQobGFiZWwpKTsKICAgICAgICAgcmV0dXJuIG5ldyBVaU9iamVjdChkb2NMaXN0LmNoaWxkU2VsZWN0b3IobmV3IFVpU2VsZWN0b3IoKS50ZXh0KGxhYmVsKSkpOwpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRG9jdW1lbnRDbGllbnQvc3JjL2NvbS9hbmRyb2lkL2N0cy9kb2N1bWVudGNsaWVudC9Eb2N1bWVudHNDbGllbnRUZXN0Q2FzZS5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRG9jdW1lbnRDbGllbnQvc3JjL2NvbS9hbmRyb2lkL2N0cy9kb2N1bWVudGNsaWVudC9Eb2N1bWVudHNDbGllbnRUZXN0Q2FzZS5qYXZhCmluZGV4IDY4ZTU1NGQuLmFmY2FhZTAgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0RvY3VtZW50Q2xpZW50L3NyYy9jb20vYW5kcm9pZC9jdHMvZG9jdW1lbnRjbGllbnQvRG9jdW1lbnRzQ2xpZW50VGVzdENhc2UuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Eb2N1bWVudENsaWVudC9zcmMvY29tL2FuZHJvaWQvY3RzL2RvY3VtZW50Y2xpZW50L0RvY3VtZW50c0NsaWVudFRlc3RDYXNlLmphdmEKQEAgLTYwLDYgKzYwLDEwIEBACiAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgc3VwZXIuc2V0VXAoKTsKIAorICAgICAgICAvLyBXYWtlIHVwIHRoZSBkZXZpY2UgYW5kIGRpc21pc3MgdGhlIGtleWd1YXJkIGJlZm9yZSB0aGUgdGVzdCBzdGFydHMuCisgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoImlucHV0IGtleWV2ZW50IEtFWUNPREVfV0FLRVVQIik7CisgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoIndtIGRpc21pc3Mta2V5Z3VhcmQiKTsKKwogICAgICAgICBDb25maWd1cmF0b3IuZ2V0SW5zdGFuY2UoKS5zZXRUb29sVHlwZShNb3Rpb25FdmVudC5UT09MX1RZUEVfRklOR0VSKTsKIAogICAgICAgICAvLyBEaXNhYmxlIElNRSdzIHRvIGF2b2lkIHZpcnR1YWwga2V5Ym9hcmRzIGZyb20gc2hvd2luZyB1cC4gT2NjYXNpb25hbGx5IElNRSBkcmF3cyBzb21lIFVJCkBAIC0xNDAsNiArMTQ0LDIwIEBACiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAorICAgIHByb3RlY3RlZCBib29sZWFuIHN1cHBvcnRlZEhhcmR3YXJlRm9yU2NvcGVkRGlyZWN0b3J5QWNjZXNzKCkgeworICAgICAgICBmaW5hbCBQYWNrYWdlTWFuYWdlciBwbSA9IGdldEluc3RydW1lbnRhdGlvbigpLmdldENvbnRleHQoKS5nZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICBpZiAocG0uaGFzU3lzdGVtRmVhdHVyZSgiYW5kcm9pZC5oYXJkd2FyZS50eXBlLndhdGNoIikKKyAgICAgICAgICAgICAgICB8fCBwbS5oYXNTeXN0ZW1GZWF0dXJlKCJhbmRyb2lkLmhhcmR3YXJlLnR5cGUuYXV0b21vdGl2ZSIpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNUZWxldmlzaW9uKCkgeworICAgICAgICBmaW5hbCBQYWNrYWdlTWFuYWdlciBwbSA9IGdldEluc3RydW1lbnRhdGlvbigpLmdldENvbnRleHQoKS5nZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICByZXR1cm4gcG0uaGFzU3lzdGVtRmVhdHVyZSgiYW5kcm9pZC5oYXJkd2FyZS50eXBlLnRlbGV2aXNpb24iKTsKKyAgICB9CisKICAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRBY3Rpdml0eUZhaWxlZCgpIHsKICAgICAgICAgZmluYWwgUmVzdWx0IHJlc3VsdCA9IG1BY3Rpdml0eS5nZXRSZXN1bHQoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKFJFUVVFU1RfQ09ERSwgcmVzdWx0LnJlcXVlc3RDb2RlKTsKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0RvY3VtZW50Q2xpZW50L3NyYy9jb20vYW5kcm9pZC9jdHMvZG9jdW1lbnRjbGllbnQvU2NvcGVkRGlyZWN0b3J5QWNjZXNzQ2xpZW50VGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRG9jdW1lbnRDbGllbnQvc3JjL2NvbS9hbmRyb2lkL2N0cy9kb2N1bWVudGNsaWVudC9TY29wZWREaXJlY3RvcnlBY2Nlc3NDbGllbnRUZXN0LmphdmEKaW5kZXggZGVjODc2OS4uMTM1YTBmNyAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRG9jdW1lbnRDbGllbnQvc3JjL2NvbS9hbmRyb2lkL2N0cy9kb2N1bWVudGNsaWVudC9TY29wZWREaXJlY3RvcnlBY2Nlc3NDbGllbnRUZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRG9jdW1lbnRDbGllbnQvc3JjL2NvbS9hbmRyb2lkL2N0cy9kb2N1bWVudGNsaWVudC9TY29wZWREaXJlY3RvcnlBY2Nlc3NDbGllbnRUZXN0LmphdmEKQEAgLTMyLDEzICszMiwxNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwogaW1wb3J0IGFuZHJvaWQub3Muc3RvcmFnZS5TdG9yYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm9zLnN0b3JhZ2UuU3RvcmFnZVZvbHVtZTsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkRvY3VtZW50c0NvbnRyYWN0OwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuRG9jdW1lbnRzQ29udHJhY3QuRG9jdW1lbnQ7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKIGltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC51aWF1dG9tYXRvci5CeTsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC51aWF1dG9tYXRvci5CeVNlbGVjdG9yOwogaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLlVpT2JqZWN0OworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLlVpT2JqZWN0MjsKIGltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC51aWF1dG9tYXRvci5VaU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLlVpU2VsZWN0b3I7CiBpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QudWlhdXRvbWF0b3IuVW50aWw7CkBAIC03Nyw3ICs4MSw3IEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRQYXRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghc3VwcG9ydGVkSGFyZHdhcmUoKSkgcmV0dXJuOworICAgICAgICBpZiAoIXN1cHBvcnRlZEhhcmR3YXJlRm9yU2NvcGVkRGlyZWN0b3J5QWNjZXNzKCkpIHJldHVybjsKIAogICAgICAgICBmb3IgKFN0b3JhZ2VWb2x1bWUgdm9sdW1lIDogZ2V0Vm9sdW1lcygpKSB7CiAgICAgICAgICAgICBvcGVuRXh0ZXJuYWxEaXJlY3RvcnlJbnZhbGlkUGF0aCh2b2x1bWUsICIiKTsKQEAgLTg5LDcgKzkzLDcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0VXNlclJlamVjdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0ZWRIYXJkd2FyZSgpKSByZXR1cm47CisgICAgICAgIGlmICghc3VwcG9ydGVkSGFyZHdhcmVGb3JTY29wZWREaXJlY3RvcnlBY2Nlc3MoKSkgcmV0dXJuOwogCiAgICAgICAgIGZvciAoU3RvcmFnZVZvbHVtZSB2b2x1bWUgOiBnZXRWb2x1bWVzKCkpIHsKICAgICAgICAgICAgIC8vIFRlc3RzIHVzZXIgY2xpY2tpbmcgREVOWSBidXR0b24sIGZvciBhbGwgdmFsaWQgZGlyZWN0b3JpZXMuCkBAIC0xMTQsNyArMTE4LDcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0VXNlckFjY2VwdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0ZWRIYXJkd2FyZSgpKSByZXR1cm47CisgICAgICAgIGlmICghc3VwcG9ydGVkSGFyZHdhcmVGb3JTY29wZWREaXJlY3RvcnlBY2Nlc3MoKSkgcmV0dXJuOwogCiAgICAgICAgIGZvciAoU3RvcmFnZVZvbHVtZSB2b2x1bWUgOiBnZXRWb2x1bWVzKCkpIHsKICAgICAgICAgICAgIHVzZXJBY2NlcHRzVGVzdCh2b2x1bWUsIERJUkVDVE9SWV9QSUNUVVJFUyk7CkBAIC0xMjUsNyArMTI5LDcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0VXNlckFjY2VwdHNOZXdEaXJlY3RvcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0ZWRIYXJkd2FyZSgpKSByZXR1cm47CisgICAgICAgIGlmICghc3VwcG9ydGVkSGFyZHdhcmVGb3JTY29wZWREaXJlY3RvcnlBY2Nlc3MoKSkgcmV0dXJuOwogCiAgICAgICAgIC8vIFRPRE86IGZpZ3VyZSBvdXQgYSBiZXR0ZXIgd2F5IHRvIHJlbW92ZSB0aGUgZGlyZWN0b3J5LgogICAgICAgICBmaW5hbCBTdHJpbmcgY29tbWFuZCA9ICJybSAtcmYgL3NkY2FyZC8iICsgRElSRUNUT1JZX1BJQ1RVUkVTOwpAQCAtMTM3LDcgKzE0MSw3IEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdE5vdEFza2VkQWdhaW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0ZWRIYXJkd2FyZSgpKSByZXR1cm47CisgICAgICAgIGlmICghc3VwcG9ydGVkSGFyZHdhcmVGb3JTY29wZWREaXJlY3RvcnlBY2Nlc3MoKSkgcmV0dXJuOwogCiAgICAgICAgIGZvciAoU3RvcmFnZVZvbHVtZSB2b2x1bWUgOiBnZXRWb2x1bWVzKCkpIHsKICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2b2x1bWVEZXNjID0gdm9sdW1lLmdldERlc2NyaXB0aW9uKGdldEluc3RydW1lbnRhdGlvbigpLmdldENvbnRleHQoKSk7CkBAIC0xNTcsNyArMTYxLDcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90QXNrZWRBZ2Fpbk9uUm9vdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIXN1cHBvcnRlZEhhcmR3YXJlKCkpIHJldHVybjsKKyAgICAgICAgaWYgKCFzdXBwb3J0ZWRIYXJkd2FyZUZvclNjb3BlZERpcmVjdG9yeUFjY2VzcygpKSByZXR1cm47CiAKICAgICAgICAgZm9yIChTdG9yYWdlVm9sdW1lIHZvbHVtZSA6IGdldFZvbHVtZXMoKSkgewogICAgICAgICAgICAgaWYgKHZvbHVtZS5pc1ByaW1hcnkoKSkgY29udGludWU7CkBAIC0xODUsNyArMTg5LDcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGVuaWVzT25jZUJ1dEFsbG93c0Fza2luZ0FnYWluKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghc3VwcG9ydGVkSGFyZHdhcmUoKSlyZXR1cm47CisgICAgICAgIGlmICghc3VwcG9ydGVkSGFyZHdhcmVGb3JTY29wZWREaXJlY3RvcnlBY2Nlc3MoKSlyZXR1cm47CiAKICAgICAgICAgZmluYWwgU3RyaW5nW10gZGlycyA9IHsgRElSRUNUT1JZX0RDSU0sIERJUkVDVE9SWV9ST09UIH07CiAgICAgICAgIGZvciAoU3RvcmFnZVZvbHVtZSB2b2x1bWUgOiBnZXRWb2x1bWVzKCkpIHsKQEAgLTIxMCw3ICsyMTQsNyBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3REZW5pZXNPbmNlRm9yQWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghc3VwcG9ydGVkSGFyZHdhcmUoKSkgcmV0dXJuOworICAgICAgICBpZiAoIXN1cHBvcnRlZEhhcmR3YXJlRm9yU2NvcGVkRGlyZWN0b3J5QWNjZXNzKCkpIHJldHVybjsKIAogICAgICAgICBmaW5hbCBTdHJpbmdbXSBkaXJzID0ge0RJUkVDVE9SWV9QSUNUVVJFUywgRElSRUNUT1JZX1JPT1R9OwogICAgICAgICBmb3IgKFN0b3JhZ2VWb2x1bWUgdm9sdW1lIDogZ2V0Vm9sdW1lcygpKSB7CkBAIC0yNDYsMTMgKzI1MCwxMyBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVQYWNrYWdlU3RlcDFVc2VyRGVuaWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghc3VwcG9ydGVkSGFyZHdhcmUoKSkgcmV0dXJuOworICAgICAgICBpZiAoIXN1cHBvcnRlZEhhcmR3YXJlRm9yU2NvcGVkRGlyZWN0b3J5QWNjZXNzKCkpIHJldHVybjsKIAogICAgICAgICBkZW5pZXNPbmNlRm9yQWxsVGVzdChnZXRQcmltYXJ5Vm9sdW1lKCksIERJUkVDVE9SWV9OT1RJRklDQVRJT05TKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlUGFja2FnZVN0ZXAyVXNlckFjY2VwdHNEb05vdENsZWFyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghc3VwcG9ydGVkSGFyZHdhcmUoKSkgcmV0dXJuOworICAgICAgICBpZiAoIXN1cHBvcnRlZEhhcmR3YXJlRm9yU2NvcGVkRGlyZWN0b3J5QWNjZXNzKCkpIHJldHVybjsKIAogICAgICAgICB1c2VyQWNjZXB0c1Rlc3QoZ2V0UHJpbWFyeVZvbHVtZSgpLCBESVJFQ1RPUllfTk9USUZJQ0FUSU9OUyk7CiAgICAgfQpAQCAtMjg1LDYgKzI4OSwxNyBAQAogICAgICAgICBmaW5hbCBTdHJpbmcgdm9sdW1lRGVzYyA9IHZvbHVtZS5nZXREZXNjcmlwdGlvbihjb250ZXh0KTsKICAgICAgICAgZmluYWwgSW50ZW50IGRhdGEgPSBhc3NlcnRBY3Rpdml0eVN1Y2NlZWRlZCgic2hvdWxkIGhhdmUgYWxyZWFkeSBncmFudGVkICIKICAgICAgICAgICAgICAgICArICJwZXJtaXNzaW9uIHRvICIgKyB2b2x1bWVEZXNjICsgIiBhbmQgIiArIGRpcmVjdG9yeU5hbWUpOworCisgICAgICAgIHJldHVybiBhc3NlcnRQZXJtaXNzaW9uR3JhbnRlZChkYXRhKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBc3NlcnRzIGEgcGVybWlzc2lvbiB3YXMgZWZmZWN0aXZlbHkgZ3JhbnRlZCBieSB1c2luZyBpdCB0byB3cml0ZSBkb2NzLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgZ3JhbnRlZCBVUkkuCisgICAgICovCisgICAgcHJpdmF0ZSBVcmkgYXNzZXJ0UGVybWlzc2lvbkdyYW50ZWQoSW50ZW50IGRhdGEpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBDb250ZXh0IGNvbnRleHQgPSBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRDb250ZXh0KCk7CiAgICAgICAgIGZpbmFsIFVyaSBncmFudGVkVXJpID0gZGF0YS5nZXREYXRhKCk7CiAKICAgICAgICAgLy8gVGVzdCBncmFudGVkIHBlcm1pc3Npb24gZGlyZWN0bHkgYnkgcGVyc2lzdGluZyBpdC4uLgpAQCAtMzE3LDYgKzMzMiwxMDggQEAKICAgICAgICAgcmV0dXJuIGdyYW50ZWRVcmk7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgdGVzdFJlc2V0RG9Ob3RBc2tBZ2FpbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIXN1cHBvcnRlZEhhcmR3YXJlRm9yU2NvcGVkRGlyZWN0b3J5QWNjZXNzKCkpIHJldHVybjsKKworICAgICAgICBmaW5hbCBTdG9yYWdlVm9sdW1lIHZvbHVtZSA9IGdldFByaW1hcnlWb2x1bWUoKTsKKyAgICAgICAgLy8gVE9ETzogaWRlYWxseSBpdCBzaG91bGQgdGVzdCBhbGwgZGlyZWN0b3JpZXMsIGJ1dCB0aGF0IHdvdWxkIGJlIHRvbyBzbG93LCBhbmQgd291bGQKKyAgICAgICAgLy8gcmVxdWlyZSBhIG1vcmUgc29waGlzdGljYXRlZCB3YXkgdG8gZ2V0IHRoZSB0b2dnbGUgb2JqZWN0IChmb3IgZXhhbXBsZSwgaXQgbWlnaHQgcmVxdWlyZQorICAgICAgICAvLyBzY3JvbGxpbmcgb24gZGV2aWNlcyB3aXRoIHNtYWxsIHNjcmVlbnMpCisgICAgICAgIGZpbmFsIFN0cmluZyBkaXIgPSBESVJFQ1RPUllfRE9DVU1FTlRTOworCisgICAgICAgIC8vIEZpcnN0LCB0cmlnZ2VycyBpdC4KKyAgICAgICAgZGVuaWVzT25jZUZvckFsbFRlc3Qodm9sdW1lLCBkaXIpOworCisgICAgICAgIC8vIFRoZW4gcmVzZXQgaXQgdXNpbmcgc2V0dGluZ3MuCisKKyAgICAgICAgLy8gTGF1bmNoIHNjcmVlbi4KKyAgICAgICAgbGF1bmNoRGlyZWN0b3J5QWNjZXNzU2V0dGluZ3NTY3JlZW5BbmRTZWxlY3RBcHAoKTsKKworICAgICAgICAvLyBUb2dnbGUgcGVybWlzc2lvbiBmb3IgZGlyLgorICAgICAgICBmaW5hbCBib29sZWFuIGdvdEl0ID0gbURldmljZS53YWl0KFVudGlsLmhhc09iamVjdChCeS50ZXh0KGRpcikpLCBUSU1FT1VUKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgib2JqZWN0IHdpdGggdGV4dCcoIiArIGRpciArICInKSBub3QgdmlzaWJsZSB5ZXQiLCBnb3RJdCk7CisgICAgICAgIC8vIFRPRE86IGZpbmQgYSBiZXR0ZXIgd2F5IHRvIGdldCB0aGUgdG9nZ2xlIHJhdGhlciB0aGVuIGdldHRpbmcgYWxsCisgICAgICAgIFVpT2JqZWN0MiB0b2dnbGUgPSBnZXRVbmlxdWVUb2dnbGUoKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoInRvZ2dsZSBmb3IgJyIgKyBkaXIgKyAiJyBzaG91bGQgbm90IGJlIGNoZWNrZWQiLCB0b2dnbGUuaXNDaGVja2VkKCkpOworICAgICAgICB0b2dnbGUuY2xpY2soKTsKKyAgICAgICAgdG9nZ2xlID0gZ2V0VW5pcXVlVG9nZ2xlKCk7CisgICAgICAgIGFzc2VydFRydWUoInRvZ2dsZSBmb3IgJyIgKyBkaXIgKyAiJyBzaG91bGQgYmUgY2hlY2tlZCIsIHRvZ2dsZS5pc0NoZWNrZWQoKSk7CisKKyAgICAgICAgLy8gQ2xvc2UgYXBwIHNjcmVlbi4KKyAgICAgICAgbURldmljZS5wcmVzc0JhY2soKTsKKyAgICAgICAgaWYgKCFpc1RlbGV2aXNpb24oKSkgeworICAgICAgICAgICAgLy8gQ2xvc2UgbWFpbiBzY3JlZW4uCisgICAgICAgICAgICBtRGV2aWNlLnByZXNzQmFjaygpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRmluYWxseSwgbWFrZSBzdXJlIGl0J3MgcmVzZXQgYnkgcmVxdWVzdGluZyBpdCBhZ2Fpbi4KKyAgICAgICAgc2VuZE9wZW5FeHRlcm5hbERpcmVjdG9yeUludGVudCh2b2x1bWUsIGRpcik7CisgICAgICAgIGZpbmFsIEludGVudCBuZXdEYXRhID0gYXNzZXJ0QWN0aXZpdHlTdWNjZWVkZWQoInNob3VsZCBoYXZlIGFscmVhZHkgZ3JhbnRlZCAiCisgICAgICAgICAgICAgICAgKyAicGVybWlzc2lvbiB0byAiICsgdm9sdW1lKyAiIGFuZCAiICsgZGlyKTsKKyAgICAgICAgYXNzZXJ0UGVybWlzc2lvbkdyYW50ZWQobmV3RGF0YSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlc2V0R3JhbnRlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIXN1cHBvcnRlZEhhcmR3YXJlRm9yU2NvcGVkRGlyZWN0b3J5QWNjZXNzKCkpIHJldHVybjsKKworICAgICAgICBmaW5hbCBTdG9yYWdlVm9sdW1lIHZvbHVtZSA9IGdldFByaW1hcnlWb2x1bWUoKTsKKyAgICAgICAgLy8gVE9ETzogaWRlYWxseSBpdCBzaG91bGQgdGVzdCBhbGwgZGlyZWN0b3JpZXMsIGJ1dCB0aGF0IHdvdWxkIGJlIHRvbyBzbG93LCBhbmQgd291bGQKKyAgICAgICAgLy8gcmVxdWlyZSBhIG1vcmUgc29waGlzdGljYXRlZCB3YXkgdG8gZ2V0IHRoZSB0b2dnbGUgb2JqZWN0IChmb3IgZXhhbXBsZSwgaXQgbWlnaHQgcmVxdWlyZQorICAgICAgICAvLyBzY3JvbGxpbmcgb24gZGV2aWNlcyB3aXRoIHNtYWxsIHNjcmVlbnMpCisgICAgICAgIGZpbmFsIFN0cmluZyBkaXIgPSBESVJFQ1RPUllfRE9DVU1FTlRTOworCisgICAgICAgIC8vIEZpcnN0LCBncmFudHMgaXQKKyAgICAgICAgdXNlckFjY2VwdHNUZXN0KHZvbHVtZSwgZGlyKTsKKworICAgICAgICAvLyBUaGVuIHJldm9rZSBpdCB1c2luZyBzZXR0aW5ncy4KKworICAgICAgICAvLyBMYXVuY2ggc2NyZWVuLgorICAgICAgICBsYXVuY2hEaXJlY3RvcnlBY2Nlc3NTZXR0aW5nc1NjcmVlbkFuZFNlbGVjdEFwcCgpOworCisgICAgICAgIC8vIFRvZ2dsZSBwZXJtaXNzaW9uIGZvciBkaXIuCisgICAgICAgIGZpbmFsIGJvb2xlYW4gZ290SXQgPSBtRGV2aWNlLndhaXQoVW50aWwuaGFzT2JqZWN0KEJ5LnRleHQoZGlyKSksIFRJTUVPVVQpOworICAgICAgICBhc3NlcnRUcnVlKCJvYmplY3Qgd2l0aCB0ZXh0JygiICsgZGlyICsgIicpIG5vdCB2aXNpYmxlIHlldCIsIGdvdEl0KTsKKyAgICAgICAgLy8gVE9ETzogZmluZCBhIGJldHRlciB3YXkgdG8gZ2V0IHRoZSB0b2dnbGUgcmF0aGVyIHRoZW4gZ2V0dGluZyBhbGwKKyAgICAgICAgVWlPYmplY3QyIHRvZ2dsZSA9IGdldFVuaXF1ZVRvZ2dsZSgpOworICAgICAgICBhc3NlcnRUcnVlKCJ0b2dnbGUgZm9yICciICsgZGlyICsgIicgc2hvdWxkIGJlIGNoZWNrZWQiLCB0b2dnbGUuaXNDaGVja2VkKCkpOworICAgICAgICB0b2dnbGUuY2xpY2soKTsKKyAgICAgICAgdG9nZ2xlID0gZ2V0VW5pcXVlVG9nZ2xlKCk7CisgICAgICAgIGFzc2VydEZhbHNlKCJ0b2dnbGUgZm9yICciICsgZGlyICsgIicgc2hvdWxkIG5vdCBiZSBjaGVja2VkIiwgdG9nZ2xlLmlzQ2hlY2tlZCgpKTsKKworICAgICAgICAvLyBDbG9zZSBhcHAgc2NyZWVuLgorICAgICAgICBtRGV2aWNlLnByZXNzQmFjaygpOworICAgICAgICBpZiAoIWlzVGVsZXZpc2lvbigpKSB7CisgICAgICAgICAgICAvLyBDbG9zZSBtYWluIHNjcmVlbi4KKyAgICAgICAgICAgIG1EZXZpY2UucHJlc3NCYWNrKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBUaGVuIHRyaWVzIGFnYWluIC0gc2hvdWxkIGJlIGRlbmllZC4KKyAgICAgICAgc2VuZE9wZW5FeHRlcm5hbERpcmVjdG9yeUludGVudCh2b2x1bWUsIGRpcik7CisgICAgICAgIGFzc2VydEFjdGl2aXR5RmFpbGVkKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBVaU9iamVjdDIgZ2V0VW5pcXVlVG9nZ2xlKCkgeworICAgICAgICBMaXN0PFVpT2JqZWN0Mj4gdG9nZ2xlcyA9IG1EZXZpY2UuZmluZE9iamVjdHMoQnkucmVzKCJhbmRyb2lkOmlkL3N3aXRjaF93aWRnZXQiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygic2hvdWxkIGhhdmUganVzdCBvbmUgdG9nZ2xlOiAiICsgdG9nZ2xlcywgMSwgdG9nZ2xlcy5zaXplKCkpOworICAgICAgICByZXR1cm4gdG9nZ2xlcy5nZXQoMCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGxhdW5jaERpcmVjdG9yeUFjY2Vzc1NldHRpbmdzU2NyZWVuQW5kU2VsZWN0QXBwKCkgeworICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChTZXR0aW5ncy5BQ1RJT05fU1RPUkFHRV9WT0xVTUVfQUNDRVNTX1NFVFRJTkdTKQorICAgICAgICAgICAgICAgIC5zZXRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyApOworICAgICAgICBmaW5hbCBDb250ZXh0IGNvbnRleHQgPSBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRDb250ZXh0KCk7CisgICAgICAgIGNvbnRleHQuc3RhcnRBY3Rpdml0eShpbnRlbnQpOworCisgICAgICAgIC8vIFNlbGVjdCBhcHAuCisgICAgICAgIGZpbmFsIFN0cmluZyBhcHBMYWJlbCA9IGNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKS5nZXRBcHBsaWNhdGlvbkxhYmVsKAorICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0QXBwbGljYXRpb25JbmZvKCkpLnRvU3RyaW5nKCk7CisgICAgICAgIGZpbmFsIEJ5U2VsZWN0b3IgYnlBcHBMYWJlbCA9IEJ5LnRleHQoYXBwTGFiZWwpOworICAgICAgICBib29sZWFuIGdvdEl0ID0gbURldmljZS53YWl0KFVudGlsLmhhc09iamVjdChieUFwcExhYmVsKSwgVElNRU9VVCk7CisgICAgICAgIGFzc2VydFRydWUoIm9iamVjdCB3aXRoIHRleHQnKCIgKyBhcHBMYWJlbCArICInKSBub3QgdmlzaWJsZSB5ZXQiLCBnb3RJdCk7CisgICAgICAgIGZpbmFsIFVpT2JqZWN0MiBhcHBSb3cgPSBtRGV2aWNlLmZpbmRPYmplY3QoYnlBcHBMYWJlbCk7CisgICAgICAgIGFwcFJvdy5jbGljaygpOworICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCBvcGVuRXh0ZXJuYWxEaXJlY3RvcnlJbnZhbGlkUGF0aChTdG9yYWdlVm9sdW1lIHZvbHVtZSwgU3RyaW5nIGRpcmVjdG9yeU5hbWUpIHsKICAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IHZvbHVtZS5jcmVhdGVBY2Nlc3NJbnRlbnQoZGlyZWN0b3J5TmFtZSk7CiAgICAgICAgIGFzc2VydE51bGwoInNob3VsZCBub3QgZ2V0IGludGVudCBmb3Igdm9sdW1lICciICsgdm9sdW1lICsgIicgYW5kIGRpcmVjdG9yeSAnIgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRG9jdW1lbnRQcm92aWRlci9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRG9jdW1lbnRQcm92aWRlci9BbmRyb2lkLm1rCmluZGV4IDc2MDllMzMuLmE0NDU0NjYgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0RvY3VtZW50UHJvdmlkZXIvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Eb2N1bWVudFByb3ZpZGVyL0FuZHJvaWQubWsKQEAgLTIwLDcgKzIwLDEyIEBACiAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCiBMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50Ci1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC1zdXBwb3J0LXRlc3QgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbCBjdHN0ZXN0cnVubmVyIHViLXVpYXV0b21hdG9yCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAorICAgIGFuZHJvaWR4LnRlc3QucnVsZXMgXAorICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0IFwKKyAgICBjdHN0ZXN0cnVubmVyLWF4dCBcCisgICAgdWItdWlhdXRvbWF0b3IgXAorCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRG9jdW1lbnRQcm92aWRlci9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRG9jdW1lbnRQcm92aWRlci9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDg5NGVmZjEuLjZlMTQwZDcgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0RvY3VtZW50UHJvdmlkZXIvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Eb2N1bWVudFByb3ZpZGVyL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTE3LDYgKzE3LDggQEAKIDxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCiAgICAgICAgICAgcGFja2FnZT0iY29tLmFuZHJvaWQuY3RzLmRvY3VtZW50cHJvdmlkZXIiPgogICAgIDxhcHBsaWNhdGlvbj4KKyAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CisKICAgICAgICAgPHByb3ZpZGVyIGFuZHJvaWQ6bmFtZT0iLk15RG9jdW1lbnRzUHJvdmlkZXIiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDphdXRob3JpdGllcz0iY29tLmFuZHJvaWQuY3RzLmRvY3VtZW50cHJvdmlkZXIiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0VuY3J5cHRpb25BcHAvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0VuY3J5cHRpb25BcHAvQW5kcm9pZC5tawppbmRleCBhNGE5NDM2Li40NGFhMjQyIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9FbmNyeXB0aW9uQXBwL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRW5jcnlwdGlvbkFwcC9BbmRyb2lkLm1rCkBAIC0yMCw3ICsyMCw5IEBACiAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCiBMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50Ci1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC1zdXBwb3J0LXRlc3QgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbCBjdHN0ZXN0cnVubmVyIHViLXVpYXV0b21hdG9yCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZHgudGVzdC5ydWxlcyBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBjdHN0ZXN0cnVubmVyLWF4dCB1Yi11aWF1dG9tYXRvcgorCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicwogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0VuY3J5cHRpb25BcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0VuY3J5cHRpb25BcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBkYTNjOWU0Li4xMjMxODc0IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9FbmNyeXB0aW9uQXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRW5jcnlwdGlvbkFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC04Miw3ICs4Miw3IEBACiAgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgogICAgIDwvYXBwbGljYXRpb24+CiAKLSAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5hbmRyb2lkLmN0cy5lbmNyeXB0aW9uYXBwIiAvPgogCiA8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRW5jcnlwdGlvbkFwcC9zcmMvY29tL2FuZHJvaWQvY3RzL2VuY3J5cHRpb25hcHAvRW5jcnlwdGlvbkFwcFRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0VuY3J5cHRpb25BcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy9lbmNyeXB0aW9uYXBwL0VuY3J5cHRpb25BcHBUZXN0LmphdmEKaW5kZXggYTdkN2M4ZC4uMzhjZGIzYyAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRW5jcnlwdGlvbkFwcC9zcmMvY29tL2FuZHJvaWQvY3RzL2VuY3J5cHRpb25hcHAvRW5jcnlwdGlvbkFwcFRlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9FbmNyeXB0aW9uQXBwL3NyYy9jb20vYW5kcm9pZC9jdHMvZW5jcnlwdGlvbmFwcC9FbmNyeXB0aW9uQXBwVGVzdC5qYXZhCkBAIC0yOCw2ICsyOCw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkNvbXBvbmVudEluZm87CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5FbnZpcm9ubWVudDsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwogaW1wb3J0IGFuZHJvaWQub3MuVXNlck1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKQEAgLTIxMyw2ICsyMTQsMTQgQEAKICAgICAgICAgYXNzZXJ0UXVlcnkoMSwgTUFUQ0hfRElSRUNUX0JPT1RfQVdBUkUpOwogICAgICAgICBhc3NlcnRRdWVyeSgxLCBNQVRDSF9ESVJFQ1RfQk9PVF9VTkFXQVJFKTsKICAgICAgICAgYXNzZXJ0UXVlcnkoMiwgTUFUQ0hfRElSRUNUX0JPT1RfQVdBUkUgfCBNQVRDSF9ESVJFQ1RfQk9PVF9VTkFXQVJFKTsKKworICAgICAgICBpZiAoRW52aXJvbm1lbnQuaXNFeHRlcm5hbFN0b3JhZ2VFbXVsYXRlZCgpKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoRW52aXJvbm1lbnQuTUVESUFfVU5NT1VOVEVELCBFbnZpcm9ubWVudC5nZXRFeHRlcm5hbFN0b3JhZ2VTdGF0ZSgpKTsKKworICAgICAgICAgICAgZmluYWwgRmlsZSBleHBlY3RlZCA9IG51bGw7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIG1DZS5nZXRFeHRlcm5hbENhY2hlRGlyKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBtRGUuZ2V0RXh0ZXJuYWxDYWNoZURpcigpKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGFzc2VydFVubG9ja2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0yNDcsNiArMjU2LDE1IEBACiAgICAgICAgIGFzc2VydFF1ZXJ5KDEsIE1BVENIX0RJUkVDVF9CT09UX0FXQVJFKTsKICAgICAgICAgYXNzZXJ0UXVlcnkoMSwgTUFUQ0hfRElSRUNUX0JPT1RfVU5BV0FSRSk7CiAgICAgICAgIGFzc2VydFF1ZXJ5KDIsIE1BVENIX0RJUkVDVF9CT09UX0FXQVJFIHwgTUFUQ0hfRElSRUNUX0JPT1RfVU5BV0FSRSk7CisKKyAgICAgICAgaWYgKEVudmlyb25tZW50LmlzRXh0ZXJuYWxTdG9yYWdlRW11bGF0ZWQoKSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEVudmlyb25tZW50Lk1FRElBX01PVU5URUQsIEVudmlyb25tZW50LmdldEV4dGVybmFsU3RvcmFnZVN0YXRlKCkpOworCisgICAgICAgICAgICBmaW5hbCBGaWxlIGV4cGVjdGVkID0gbmV3IEZpbGUoCisgICAgICAgICAgICAgICAgICAgICIvc2RjYXJkL0FuZHJvaWQvZGF0YS9jb20uYW5kcm9pZC5jdHMuZW5jcnlwdGlvbmFwcC9jYWNoZSIpOworICAgICAgICAgICAgYXNzZXJ0Q2Fub25pY2FsRXF1YWxzKGV4cGVjdGVkLCBtQ2UuZ2V0RXh0ZXJuYWxDYWNoZURpcigpKTsKKyAgICAgICAgICAgIGFzc2VydENhbm9uaWNhbEVxdWFscyhleHBlY3RlZCwgbURlLmdldEV4dGVybmFsQ2FjaGVEaXIoKSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgYXNzZXJ0UXVlcnkoaW50IGNvdW50LCBpbnQgZmxhZ3MpIHRocm93cyBFeGNlcHRpb24gewpAQCAtMjY1LDYgKzI4MywxMCBAQAogICAgICAgICBhc3NlcnRHZXQodmlzaWJsZSwgdHJ1ZSwgZmxhZ3MpOwogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBhc3NlcnRDYW5vbmljYWxFcXVhbHMoRmlsZSBleHBlY3RlZCwgRmlsZSBhY3R1YWwpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuZ2V0Q2Fub25pY2FsRmlsZSgpLCBhY3R1YWwuZ2V0Q2Fub25pY2FsRmlsZSgpKTsKKyAgICB9CisKICAgICBwcml2YXRlIENvbXBvbmVudE5hbWUgYnVpbGROYW1lKFN0cmluZyBwcmVmaXgsIFN0cmluZyB0eXBlKSB7CiAgICAgICAgIHJldHVybiBuZXcgQ29tcG9uZW50TmFtZShURVNUX1BLRywgVEVTVF9QS0cgKyAiLiIgKyBwcmVmaXggKyB0eXBlKTsKICAgICB9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9FcGhlbWVyYWxUZXN0QXBwL0VwaGVtZXJhbEFwcDEvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0VwaGVtZXJhbFRlc3RBcHAvRXBoZW1lcmFsQXBwMS9BbmRyb2lkLm1rCmluZGV4IGFhZWI4YzAuLjc3N2JkNjUgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0VwaGVtZXJhbFRlc3RBcHAvRXBoZW1lcmFsQXBwMS9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0VwaGVtZXJhbFRlc3RBcHAvRXBoZW1lcmFsQXBwMS9BbmRyb2lkLm1rCkBAIC0xNywxNCArMTcsMTMgQEAKIExPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCi1MT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzIGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwogTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKICAgICBjdHMtYWlhLXV0aWwgXAotICAgIGFuZHJvaWQtc3VwcG9ydC10ZXN0IFwKLSAgICBsZWdhY3ktYW5kcm9pZC10ZXN0IFwKLQljdHNkZXZpY2V1dGlsbGVnYWN5IFwKLQljdHN0ZXN0cnVubmVyCisgICAgYW5kcm9pZHgudGVzdC5ydWxlcyBcCisgICAgY3RzZGV2aWNldXRpbGxlZ2FjeS1heHQgXAorICAgIGN0c3Rlc3RydW5uZXItYXh0CiAKICMgdGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKIExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCkBAIC0zMyw2ICszMiw3IEBACiBMT0NBTF9SRVNPVVJDRV9ESVIgOj0gJChMT0NBTF9QQVRIKS9yZXMKIAogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0VwaGVtZXJhbFRlc3RzRXBoZW1lcmFsQXBwMQorTE9DQUxfUFJJVkFURV9QTEFURk9STV9BUElTIDo9IHRydWUKIAogTE9DQUxfUFJPR1VBUkRfRU5BQkxFRCA6PSBkaXNhYmxlZAogTE9DQUxfREVYX1BSRU9QVCA6PSBmYWxzZQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRXBoZW1lcmFsVGVzdEFwcC9FcGhlbWVyYWxBcHAxL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9FcGhlbWVyYWxUZXN0QXBwL0VwaGVtZXJhbEFwcDEvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBlZDNjM2NmLi5mOTY2YjNkIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9FcGhlbWVyYWxUZXN0QXBwL0VwaGVtZXJhbEFwcDEvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9FcGhlbWVyYWxUZXN0QXBwL0VwaGVtZXJhbEFwcDEvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjEsMTMgKzIxLDIyIEBACiAgICAgICAgIGFuZHJvaWQ6bWluU2RrVmVyc2lvbj0iMjUiIC8+CiAKICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuYWxhcm0ucGVybWlzc2lvbi5TRVRfQUxBUk0iIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5BQ0NFU1NfQ09BUlNFX0xPQ0FUSU9OIi8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5BQ0NFU1NfTkVUV09SS19TVEFURSIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkNBTUVSQSIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLklOU1RBTlRfQVBQX0ZPUkVHUk9VTkRfU0VSVklDRSIgLz4KICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLklOVEVSTkVUIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVDT1JEX0FVRElPIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVBRF9QSE9ORV9OVU1CRVJTIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uVklCUkFURSIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldBS0VfTE9DSyIgLz4KKwogICAgIDxhcHBsaWNhdGlvbgogICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2FwcF9uYW1lIj4KICAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CiAgICAgICAgIDxhY3Rpdml0eQogICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSIuRXBoZW1lcmFsQWN0aXZpdHkiCi0gICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5Ob0Rpc3BsYXkiPgorICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuTm9EaXNwbGF5IiA+CiAgICAgICAgICAgICA8IS0tIFRFU1Q6IG5vcm1hbCBhcHAgY2FuIHN0YXJ0IHcvbyBrbm93aW5nIGFib3V0IHRoaXMgYWN0aXZpdHkgLS0+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlZJRVciIC8+CkBAIC00OSw4ICs1OCwzMiBAQAogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5jdHMuZXBoZW1lcmFsdGVzdC5TVEFSVF9FUEhFTUVSQUwiIC8+CiAgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuREVGQVVMVCIgLz4KICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uU0VBUkNIIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9ImRlZmF1bHQtdXJsIgorICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZhbHVlPSJodHRwczovL2VwaGVtZXJhbGFwcDEuY3RzLmFuZHJvaWQuY29tL3NlYXJjaCIgLz4KKyAgICAgICAgICAgIDxtZXRhLWRhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFwcC5zZWFyY2hhYmxlIgorICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnJlc291cmNlPSJAeG1sL3NlYXJjaGFibGUiIC8+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSIuRXBoZW1lcmFsUmVzdWx0IgorICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuTm9EaXNwbGF5IiA+CisgICAgICAgICAgICA8IS0tIFRFU1Q6IGFsbG93IHNlbmRpbmcgcmVzdWx0cyBmcm9tIG90aGVyIGluc3RhbnQgYXBwcyAtLT4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uVklFVyIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5ERUZBVUxUIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkJST1dTQUJMRSIgLz4KKyAgICAgICAgICAgICAgICA8ZGF0YSBhbmRyb2lkOnNjaGVtZT0iaHR0cHMiIC8+CisgICAgICAgICAgICAgICAgPGRhdGEgYW5kcm9pZDpob3N0PSJjdHMuZ29vZ2xlLmNvbSIgLz4KKyAgICAgICAgICAgICAgICA8ZGF0YSBhbmRyb2lkOnBhdGg9Ii9yZXN1bHQiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgICAgIDxwcm92aWRlciBhbmRyb2lkOm5hbWU9Ii5TZWFyY2hTdWdnZXN0aW9uUHJvdmlkZXIiCisgICAgICAgICAgICBhbmRyb2lkOmF1dGhvcml0aWVzPSJjb20uYW5kcm9pZC5jdHMuZXBoZW1lcmFsYXBwMS5TZWFyY2giIC8+CisKKyAgICAgICAgPGFjdGl2aXR5CiAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9Ii5FcGhlbWVyYWxBY3Rpdml0eTIiCiAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5Ob0Rpc3BsYXkiPgogICAgICAgICAgICAgPCEtLSBURVNUOiBlcGhlbWVyYWwgYXBwcyBjYW4gc3RhcnQgdGhpcyBhY3Rpdml0eSB1c2luZyBkaXJlY3RlZCBpbnRlbnQgLS0+CkBAIC04OCw5ICsxMjEsMTAgQEAKICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuY3RzLmVwaGVtZXJhbHRlc3QuUVVFUlkiIC8+CiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgIDwvcHJvdmlkZXI+CisgICAgICAgIDxzZXJ2aWNlIGFuZHJvaWQ6bmFtZT0iLlNvbWVTZXJ2aWNlIi8+CiAgICAgPC9hcHBsaWNhdGlvbj4KIAogICAgIDxpbnN0cnVtZW50YXRpb24KLSAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5jdHMuZXBoZW1lcmFsYXBwMSIgLz4KIDwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9FcGhlbWVyYWxUZXN0QXBwL0VwaGVtZXJhbEFwcDEvcmVzL3htbC9zZWFyY2hhYmxlLnhtbCBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0VwaGVtZXJhbFRlc3RBcHAvRXBoZW1lcmFsQXBwMS9yZXMveG1sL3NlYXJjaGFibGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMzg2YzcKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9FcGhlbWVyYWxUZXN0QXBwL0VwaGVtZXJhbEFwcDEvcmVzL3htbC9zZWFyY2hhYmxlLnhtbApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VhcmNoYWJsZSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9hcHBfbmFtZSIKKyAgICBhbmRyb2lkOnNlYXJjaFN1Z2dlc3RBdXRob3JpdHk9ImNvbS5hbmRyb2lkLmN0cy5lcGhlbWVyYWxhcHAxLlNlYXJjaCIKKyAgICBhbmRyb2lkOnNlYXJjaFN1Z2dlc3RTZWxlY3Rpb249IiA/IiA+Cis8L3NlYXJjaGFibGU+CisKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0VwaGVtZXJhbFRlc3RBcHAvRXBoZW1lcmFsQXBwMS9zcmMvY29tL2FuZHJvaWQvY3RzL2VwaGVtZXJhbGFwcDEvQ2xpZW50VGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRXBoZW1lcmFsVGVzdEFwcC9FcGhlbWVyYWxBcHAxL3NyYy9jb20vYW5kcm9pZC9jdHMvZXBoZW1lcmFsYXBwMS9DbGllbnRUZXN0LmphdmEKaW5kZXggOGVjZDg2MC4uNTg1NjVlYSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRXBoZW1lcmFsVGVzdEFwcC9FcGhlbWVyYWxBcHAxL3NyYy9jb20vYW5kcm9pZC9jdHMvZXBoZW1lcmFsYXBwMS9DbGllbnRUZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRXBoZW1lcmFsVGVzdEFwcC9FcGhlbWVyYWxBcHAxL3NyYy9jb20vYW5kcm9pZC9jdHMvZXBoZW1lcmFsYXBwMS9DbGllbnRUZXN0LmphdmEKQEAgLTE2LDE0ICsxNiwyNCBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5lcGhlbWVyYWxhcHAxOwogCitpbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuQXVkaW9Gb3JtYXQuQ0hBTk5FTF9JTl9NT05POworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLkF1ZGlvRm9ybWF0LkVOQ09ESU5HX1BDTV8xNkJJVDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5NZWRpYVJlY29yZGVyLkF1ZGlvU291cmNlLk1JQzsKKworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaGFzSXRlbXM7CiBpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7Ci1pbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMubnVsbFZhbHVlOwogaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLm5vdE51bGxWYWx1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5udWxsVmFsdWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKIGltcG9ydCBhbmRyb2lkLk1hbmlmZXN0OwotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb25DaGFubmVsOworaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbk1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5hcHAuU2VhcmNoTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5TZWFyY2hhYmxlSW5mbzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQWN0aXZpdHlOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CkBAIC0zMSwyMiArNDEsMzMgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LlNlcnZpY2VDb25uZWN0aW9uOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm87CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VJbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUHJvdmlkZXJJbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5SZXNvbHZlSW5mbzsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FtZXJhRGV2aWNlOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYW1lcmFNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uQ3JpdGVyaWE7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbk1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1JlY29yZDsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Db25uZWN0aXZpdHlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXJUaHJlYWQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXIuU2VydmljZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ2FsZW5kYXJDb250cmFjdDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3Q7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NZWRpYVN0b3JlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwotaW1wb3J0IGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0Q2FzZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlBvd2VyTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlBvd2VyTWFuYWdlci5XYWtlTG9jazsKK2ltcG9ydCBhbmRyb2lkLm9zLlZpYnJhdGlvbkVmZmVjdDsKK2ltcG9ydCBhbmRyb2lkLm9zLlZpYnJhdG9yOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlBob25lU3RhdGVMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5UZWxlcGhvbnlNYW5hZ2VyOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogCiBpbXBvcnQgY29tLmFuZHJvaWQuY3RzLnV0aWwuVGVzdFJlc3VsdDsKIApAQCAtNTUsMTAgKzc2LDEwIEBACiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXJ2aWNlQ29uZmlndXJhdGlvbkVycm9yOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlN5bmNocm9ub3VzUXVldWU7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiAKQEAgLTc2LDYgKzk3LDggQEAKICAgICAvKiogQWN0aW9uIHRvIHN0YXJ0IHByaXZhdGUgZXBoZW1lcmFsIHRlc3QgYWN0aXZpdGllcyAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fU1RBUlRfRVBIRU1FUkFMX1BSSVZBVEUgPQogICAgICAgICAgICAgImNvbS5hbmRyb2lkLmN0cy5lcGhlbWVyYWx0ZXN0LlNUQVJUX0VQSEVNRVJBTF9QUklWQVRFIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1NUQVJUX0VQSEVNRVJBTF9BQ1RJVklUWSA9CisgICAgICAgICAgICAiY29tLmFuZHJvaWQuY3RzLmVwaGVtZXJhbHRlc3QuU1RBUlRfT1RIRVJfRVBIRU1FUkFMIjsKICAgICAvKiogQWN0aW9uIHRvIHF1ZXJ5IGZvciB0ZXN0IGFjdGl2aXRpZXMgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1FVRVJZID0KICAgICAgICAgICAgICJjb20uYW5kcm9pZC5jdHMuZXBoZW1lcmFsdGVzdC5RVUVSWSI7CkBAIC04NSw2ICsxMDgsNyBAQAogICAgICAgICAgICAgImNvbS5hbmRyb2lkLmN0cy5lcGhlbWVyYWx0ZXN0LkVYVFJBX0FDVElWSVRZX1JFU1VMVCI7CiAKICAgICBwcml2YXRlIEJyb2FkY2FzdFJlY2VpdmVyIG1SZWNlaXZlcjsKKyAgICBwcml2YXRlIFBob25lU3RhdGVMaXN0ZW5lciBtUGhvbmVTdGF0ZUxpc3RlbmVyOwogICAgIHByaXZhdGUgZmluYWwgU3luY2hyb25vdXNRdWV1ZTxUZXN0UmVzdWx0PiBtUmVzdWx0UXVldWUgPSBuZXcgU3luY2hyb25vdXNRdWV1ZTw+KCk7CiAKICAgICBAQmVmb3JlCkBAIC0xNzMsNiArMTk3LDUyIEBACiAgICAgICAgICAgICAgICAgICAgIGlzKGZhbHNlKSk7CiAgICAgICAgIH0KIAorICAgICAgICAvLyBxdWVyeSBvd24gZXBoZW1lcmFsIGFwcGxpY2F0aW9uIGFjdGl2aXRpZXMgd2l0aCBhIHdlYiBVUkkKKyAgICAgICAgeworICAgICAgICAgICAgZmluYWwgSW50ZW50IHF1ZXJ5SW50ZW50ID0gbmV3IEludGVudChJbnRlbnQuQUNUSU9OX1ZJRVcpOworICAgICAgICAgICAgcXVlcnlJbnRlbnQuYWRkQ2F0ZWdvcnkoSW50ZW50LkNBVEVHT1JZX0JST1dTQUJMRSk7CisgICAgICAgICAgICBxdWVyeUludGVudC5zZXREYXRhKFVyaS5wYXJzZSgiaHR0cHM6Ly9jdHMuZ29vZ2xlLmNvbS9lcGhlbWVyYWwiKSk7CisgICAgICAgICAgICBmaW5hbCBMaXN0PFJlc29sdmVJbmZvPiByZXNvbHZlSW5mbyA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKQorICAgICAgICAgICAgICAgICAgICAuZ2V0UGFja2FnZU1hbmFnZXIoKS5xdWVyeUludGVudEFjdGl2aXRpZXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlJbnRlbnQsIFBhY2thZ2VNYW5hZ2VyLkdFVF9SRVNPTFZFRF9GSUxURVIpOworICAgICAgICAgICAgaWYgKHJlc29sdmVJbmZvID09IG51bGwgfHwgcmVzb2x2ZUluZm8uc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJkaWRuJ3QgcmVzb2x2ZSBhbnkgaW50ZW50cyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChSZXNvbHZlSW5mbyBpbmZvOiByZXNvbHZlSW5mbykgeworICAgICAgICAgICAgICAgIGFzc2VydFRoYXQoaW5mby5maWx0ZXIsIGlzKG5vdE51bGxWYWx1ZSgpKSk7CisgICAgICAgICAgICAgICAgaWYgKGhhbmRsZXNBbGxXZWJEYXRhKGluZm8uZmlsdGVyKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXNzZXJ0VGhhdChpbmZvLmFjdGl2aXR5SW5mby5wYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzKCJjb20uYW5kcm9pZC5jdHMuZXBoZW1lcmFsYXBwMSIpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUaGF0KGluZm8uYWN0aXZpdHlJbmZvLm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBpcygiY29tLmFuZHJvaWQuY3RzLmVwaGVtZXJhbGFwcDEuRXBoZW1lcmFsQWN0aXZpdHkiKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VGhhdChpbmZvLmlzSW5zdGFudEFwcEF2YWlsYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzKHRydWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHF1ZXJ5IG90aGVyIGVwaGVtZXJhbCBhcHBsaWNhdGlvbiBhY3Rpdml0aWVzIHdpdGggYSB3ZWIgVVJJCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbmFsIEludGVudCBxdWVyeUludGVudCA9IG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9WSUVXKTsKKyAgICAgICAgICAgIHF1ZXJ5SW50ZW50LmFkZENhdGVnb3J5KEludGVudC5DQVRFR09SWV9CUk9XU0FCTEUpOworICAgICAgICAgICAgcXVlcnlJbnRlbnQuc2V0RGF0YShVcmkucGFyc2UoImh0dHBzOi8vY3RzLmdvb2dsZS5jb20vb3RoZXIiKSk7CisgICAgICAgICAgICBmaW5hbCBMaXN0PFJlc29sdmVJbmZvPiByZXNvbHZlSW5mbyA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKQorICAgICAgICAgICAgICAgICAgICAuZ2V0UGFja2FnZU1hbmFnZXIoKS5xdWVyeUludGVudEFjdGl2aXRpZXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlJbnRlbnQsIFBhY2thZ2VNYW5hZ2VyLkdFVF9SRVNPTFZFRF9GSUxURVIpOworICAgICAgICAgICAgaWYgKHJlc29sdmVJbmZvID09IG51bGwgfHwgcmVzb2x2ZUluZm8uc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJkaWRuJ3QgcmVzb2x2ZSBhbnkgaW50ZW50cyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChSZXNvbHZlSW5mbyBpbmZvOiByZXNvbHZlSW5mbykgeworICAgICAgICAgICAgICAgIGFzc2VydFRoYXQoaW5mby5maWx0ZXIsIGlzKG5vdE51bGxWYWx1ZSgpKSk7CisgICAgICAgICAgICAgICAgaWYgKGhhbmRsZXNBbGxXZWJEYXRhKGluZm8uZmlsdGVyKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmFpbCgicmVzb2x1dGlvbiBzaG91bGQgaGF2ZSBvbmx5IG1hdGNoZWQgYnJvd3NlcnMiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHF1ZXJ5IHNlcnZpY2VzCiAgICAgICAgIHsKICAgICAgICAgICAgIGZpbmFsIEludGVudCBxdWVyeUludGVudCA9IG5ldyBJbnRlbnQoQUNUSU9OX1FVRVJZKTsKICAgICAgICAgICAgIGZpbmFsIExpc3Q8UmVzb2x2ZUluZm8+IHJlc29sdmVJbmZvID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkKQEAgLTE5Myw2ICsyNjMsNyBAQAogICAgICAgICAgICAgICAgICAgICBpcyhmYWxzZSkpOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gcXVlcnkgc2VydmljZXM7IGRpcmVjdGVkIHBhY2thZ2UKICAgICAgICAgewogICAgICAgICAgICAgZmluYWwgSW50ZW50IHF1ZXJ5SW50ZW50ID0gbmV3IEludGVudChBQ1RJT05fUVVFUlkpOwogICAgICAgICAgICAgcXVlcnlJbnRlbnQuc2V0UGFja2FnZSgiY29tLmFuZHJvaWQuY3RzLmVwaGVtZXJhbGFwcDEiKTsKQEAgLTIwOCw2ICsyNzksNyBAQAogICAgICAgICAgICAgICAgICAgICBpcygiY29tLmFuZHJvaWQuY3RzLmVwaGVtZXJhbGFwcDEuRXBoZW1lcmFsU2VydmljZSIpKTsKICAgICAgICAgfQogCisgICAgICAgIC8vIHF1ZXJ5IHNlcnZpY2VzOyBkaXJlY3RlZCBjb21wb25lbnQKICAgICAgICAgewogICAgICAgICAgICAgZmluYWwgSW50ZW50IHF1ZXJ5SW50ZW50ID0gbmV3IEludGVudChBQ1RJT05fUVVFUlkpOwogICAgICAgICAgICAgcXVlcnlJbnRlbnQuc2V0Q29tcG9uZW50KApAQCAtMzIwLDcgKzM5Miw4IEBACiAgICAgcHVibGljIHZvaWQgdGVzdFN0YXJ0Tm9ybWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIHN0YXJ0IHRoZSBub3JtYWwgYWN0aXZpdHkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpbmFsIEludGVudCBzdGFydE5vcm1hbEludGVudCA9IG5ldyBJbnRlbnQoQUNUSU9OX1NUQVJUX05PUk1BTCk7CisgICAgICAgICAgICBmaW5hbCBJbnRlbnQgc3RhcnROb3JtYWxJbnRlbnQgPSBuZXcgSW50ZW50KEFDVElPTl9TVEFSVF9OT1JNQUwpCisgICAgICAgICAgICAgICAgICAgIC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7CiAgICAgICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeQogICAgICAgICAgICAgICAgICAgICAuZ2V0Q29udGV4dCgpLnN0YXJ0QWN0aXZpdHkoc3RhcnROb3JtYWxJbnRlbnQsIG51bGwgLypvcHRpb25zKi8pOwogICAgICAgICAgICAgZmluYWwgVGVzdFJlc3VsdCB0ZXN0UmVzdWx0ID0gZ2V0UmVzdWx0KCk7CkBAIC0zMzAsNyArNDAzLDggQEAKIAogICAgICAgICAvLyBzdGFydCB0aGUgbm9ybWFsIGFjdGl2aXR5OyBkaXJlY3RlZCBwYWNrYWdlCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaW5hbCBJbnRlbnQgc3RhcnROb3JtYWxJbnRlbnQgPSBuZXcgSW50ZW50KEFDVElPTl9TVEFSVF9OT1JNQUwpOworICAgICAgICAgICAgZmluYWwgSW50ZW50IHN0YXJ0Tm9ybWFsSW50ZW50ID0gbmV3IEludGVudChBQ1RJT05fU1RBUlRfTk9STUFMKQorICAgICAgICAgICAgICAgICAgICAuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOwogICAgICAgICAgICAgc3RhcnROb3JtYWxJbnRlbnQuc2V0UGFja2FnZSgiY29tLmFuZHJvaWQuY3RzLm5vcm1hbGFwcCIpOwogICAgICAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkKICAgICAgICAgICAgICAgICAgICAgLmdldENvbnRleHQoKS5zdGFydEFjdGl2aXR5KHN0YXJ0Tm9ybWFsSW50ZW50LCBudWxsIC8qb3B0aW9ucyovKTsKQEAgLTM0MSw3ICs0MTUsOCBAQAogCiAgICAgICAgIC8vIHN0YXJ0IHRoZSBub3JtYWwgYWN0aXZpdHk7IGRpcmVjdGVkIGNvbXBvbmVudAogICAgICAgICB0cnkgewotICAgICAgICAgICAgZmluYWwgSW50ZW50IHN0YXJ0Tm9ybWFsSW50ZW50ID0gbmV3IEludGVudChBQ1RJT05fU1RBUlRfTk9STUFMKTsKKyAgICAgICAgICAgIGZpbmFsIEludGVudCBzdGFydE5vcm1hbEludGVudCA9IG5ldyBJbnRlbnQoQUNUSU9OX1NUQVJUX05PUk1BTCkKKyAgICAgICAgICAgICAgICAgICAgLmFkZEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLKTsKICAgICAgICAgICAgIHN0YXJ0Tm9ybWFsSW50ZW50LnNldENvbXBvbmVudChuZXcgQ29tcG9uZW50TmFtZSgKICAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmN0cy5ub3JtYWxhcHAiLCAiY29tLmFuZHJvaWQuY3RzLm5vcm1hbGFwcC5Ob3JtYWxBY3Rpdml0eSIpKTsKICAgICAgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5CkBAIC0zNTUsNyArNDMwLDggQEAKIC8vICAgICAgIHRoZSBub3JtYWwgYXBwIGFuZCBjaHJvbWU7IGZvciB3aGljaCB0aGVyZSBpcyBubyBlYXN5IHNvbHV0aW9uLgogLy8gICAgICAgIC8vIHN0YXJ0IHRoZSBub3JtYWwgYWN0aXZpdHk7IHVzaW5nIFZJRVcvQlJPV1NBQkxFCiAvLyAgICAgICAgewotLy8gICAgICAgICAgICBmaW5hbCBJbnRlbnQgc3RhcnRWaWV3SW50ZW50ID0gbmV3IEludGVudChJbnRlbnQuQUNUSU9OX1ZJRVcpOworLy8gICAgICAgICAgICBmaW5hbCBJbnRlbnQgc3RhcnRWaWV3SW50ZW50ID0gbmV3IEludGVudChJbnRlbnQuQUNUSU9OX1ZJRVcpCisvLyAgICAgICAgICAgICAgICAgICAgLmFkZEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLKTsKIC8vICAgICAgICAgICAgc3RhcnRWaWV3SW50ZW50LmFkZENhdGVnb3J5KEludGVudC5DQVRFR09SWV9CUk9XU0FCTEUpOwogLy8gICAgICAgICAgICBzdGFydFZpZXdJbnRlbnQuc2V0RGF0YShVcmkucGFyc2UoImh0dHBzOi8vY3RzLmdvb2dsZS5jb20vbm9ybWFsIikpOwogLy8gICAgICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCkuc3RhcnRBY3Rpdml0eShzdGFydFZpZXdJbnRlbnQsIG51bGwgLypvcHRpb25zKi8pOwpAQCAtNDIzLDcgKzQ5OSw4IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhcnRFeHBvc2VkMDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gc3RhcnQgdGhlIGV4cGxpY2l0bHkgZXhwb3NlZCBhY3Rpdml0eQotICAgICAgICBmaW5hbCBJbnRlbnQgc3RhcnRFeHBvc2VkSW50ZW50ID0gbmV3IEludGVudChBQ1RJT05fU1RBUlRfRVhQT1NFRCk7CisgICAgICAgIGZpbmFsIEludGVudCBzdGFydEV4cG9zZWRJbnRlbnQgPSBuZXcgSW50ZW50KEFDVElPTl9TVEFSVF9FWFBPU0VEKQorICAgICAgICAgICAgICAgIC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7CiAgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5CiAgICAgICAgICAgICAgICAgLmdldENvbnRleHQoKS5zdGFydEFjdGl2aXR5KHN0YXJ0RXhwb3NlZEludGVudCwgbnVsbCAvKm9wdGlvbnMqLyk7CiAgICAgICAgIGZpbmFsIFRlc3RSZXN1bHQgdGVzdFJlc3VsdCA9IGdldFJlc3VsdCgpOwpAQCAtNDQyLDcgKzUxOSw4IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhcnRFeHBvc2VkMDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gc3RhcnQgdGhlIGV4cGxpY2l0bHkgZXhwb3NlZCBhY3Rpdml0eTsgZGlyZWN0ZWQgcGFja2FnZQotICAgICAgICBmaW5hbCBJbnRlbnQgc3RhcnRFeHBvc2VkSW50ZW50ID0gbmV3IEludGVudChBQ1RJT05fU1RBUlRfRVhQT1NFRCk7CisgICAgICAgIGZpbmFsIEludGVudCBzdGFydEV4cG9zZWRJbnRlbnQgPSBuZXcgSW50ZW50KEFDVElPTl9TVEFSVF9FWFBPU0VEKQorICAgICAgICAgICAgICAgIC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7CiAgICAgICAgIHN0YXJ0RXhwb3NlZEludGVudC5zZXRQYWNrYWdlKCJjb20uYW5kcm9pZC5jdHMubm9ybWFsYXBwIik7CiAgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5CiAgICAgICAgICAgICAgICAgLmdldENvbnRleHQoKS5zdGFydEFjdGl2aXR5KHN0YXJ0RXhwb3NlZEludGVudCwgbnVsbCAvKm9wdGlvbnMqLyk7CkBAIC00NjIsNyArNTQwLDggQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFydEV4cG9zZWQwMygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBzdGFydCB0aGUgZXhwbGljaXRseSBleHBvc2VkIGFjdGl2aXR5OyBkaXJlY3RlZCBjb21wb25lbnQKLSAgICAgICAgZmluYWwgSW50ZW50IHN0YXJ0RXhwb3NlZEludGVudCA9IG5ldyBJbnRlbnQoQUNUSU9OX1NUQVJUX0VYUE9TRUQpOworICAgICAgICBmaW5hbCBJbnRlbnQgc3RhcnRFeHBvc2VkSW50ZW50ID0gbmV3IEludGVudChBQ1RJT05fU1RBUlRfRVhQT1NFRCkKKyAgICAgICAgICAgICAgICAuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOwogICAgICAgICBzdGFydEV4cG9zZWRJbnRlbnQuc2V0Q29tcG9uZW50KG5ldyBDb21wb25lbnROYW1lKAogICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5jdHMubm9ybWFsYXBwIiwgImNvbS5hbmRyb2lkLmN0cy5ub3JtYWxhcHAuRXhwb3NlZEFjdGl2aXR5IikpOwogICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeQpAQCAtNDg0LDcgKzU2Myw4IEBACiAgICAgcHVibGljIHZvaWQgdGVzdFN0YXJ0RXhwb3NlZDA0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIHN0YXJ0IHRoZSBpbXBsaWNpdGx5IGV4cG9zZWQgYWN0aXZpdHk7IGRpcmVjdGVkIHBhY2thZ2UKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpbmFsIEludGVudCBzdGFydEV4cG9zZWRJbnRlbnQgPSBuZXcgSW50ZW50KEludGVudC5BQ1RJT05fVklFVyk7CisgICAgICAgICAgICBmaW5hbCBJbnRlbnQgc3RhcnRFeHBvc2VkSW50ZW50ID0gbmV3IEludGVudChJbnRlbnQuQUNUSU9OX1ZJRVcpCisgICAgICAgICAgICAgICAgICAgIC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7CiAgICAgICAgICAgICBzdGFydEV4cG9zZWRJbnRlbnQuc2V0UGFja2FnZSgiY29tLmFuZHJvaWQuY3RzLmltcGxpY2l0YXBwIik7CiAgICAgICAgICAgICBzdGFydEV4cG9zZWRJbnRlbnQuYWRkQ2F0ZWdvcnkoSW50ZW50LkNBVEVHT1JZX0JST1dTQUJMRSk7CiAgICAgICAgICAgICBzdGFydEV4cG9zZWRJbnRlbnQuc2V0RGF0YShVcmkucGFyc2UoImh0dHBzOi8vY3RzLmdvb2dsZS5jb20vaW1wbGljaXQiKSk7CkBAIC00OTgsNyArNTc4LDggQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhcnRFeHBvc2VkMDUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gc3RhcnQgdGhlIGltcGxpY2l0bHkgZXhwb3NlZCBhY3Rpdml0eTsgZGlyZWN0ZWQgY29tcG9uZW50CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaW5hbCBJbnRlbnQgc3RhcnRFeHBvc2VkSW50ZW50ID0gbmV3IEludGVudChJbnRlbnQuQUNUSU9OX1ZJRVcpOworICAgICAgICAgICAgZmluYWwgSW50ZW50IHN0YXJ0RXhwb3NlZEludGVudCA9IG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9WSUVXKQorICAgICAgICAgICAgICAgICAgICAuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOwogICAgICAgICAgICAgc3RhcnRFeHBvc2VkSW50ZW50LnNldENvbXBvbmVudChuZXcgQ29tcG9uZW50TmFtZSgKICAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmN0cy5pbXBsaWNpdGFwcCIsCiAgICAgICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5jdHMuaW1wbGljaXRhcHAuSW1wbGljaXRBY3Rpdml0eSIpKTsKQEAgLTUxMyw3ICs1OTQsOCBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFN0YXJ0RXhwb3NlZDA2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIHN0YXJ0IHRoZSBleHBvc2VkIHNlcnZpY2U7IGRpcmVjdGVkIHBhY2thZ2UKLSAgICAgICAgZmluYWwgSW50ZW50IHN0YXJ0RXhwb3NlZEludGVudCA9IG5ldyBJbnRlbnQoQUNUSU9OX1NUQVJUX0VYUE9TRUQpOworICAgICAgICBmaW5hbCBJbnRlbnQgc3RhcnRFeHBvc2VkSW50ZW50ID0gbmV3IEludGVudChBQ1RJT05fU1RBUlRfRVhQT1NFRCkKKyAgICAgICAgICAgICAgICAuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOwogICAgICAgICBzdGFydEV4cG9zZWRJbnRlbnQuc2V0UGFja2FnZSgiY29tLmFuZHJvaWQuY3RzLm5vcm1hbGFwcCIpOwogICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCkuc3RhcnRGb3JlZ3JvdW5kU2VydmljZShzdGFydEV4cG9zZWRJbnRlbnQpOwogICAgICAgICBmaW5hbCBUZXN0UmVzdWx0IHRlc3RSZXN1bHQgPSBnZXRSZXN1bHQoKTsKQEAgLTY0Miw3ICs3MjQsOCBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFydEVwaGVtZXJhbCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBzdGFydCB0aGUgZXBoZW1lcmFsIGFjdGl2aXR5CiAgICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIEludGVudCBzdGFydEVwaGVtZXJhbEludGVudCA9IG5ldyBJbnRlbnQoQUNUSU9OX1NUQVJUX0VQSEVNRVJBTCk7CisgICAgICAgICAgICBmaW5hbCBJbnRlbnQgc3RhcnRFcGhlbWVyYWxJbnRlbnQgPSBuZXcgSW50ZW50KEFDVElPTl9TVEFSVF9FUEhFTUVSQUwpCisgICAgICAgICAgICAgICAgICAgIC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7CiAgICAgICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeQogICAgICAgICAgICAgICAgICAgICAuZ2V0Q29udGV4dCgpLnN0YXJ0QWN0aXZpdHkoc3RhcnRFcGhlbWVyYWxJbnRlbnQsIG51bGwgLypvcHRpb25zKi8pOwogICAgICAgICAgICAgZmluYWwgVGVzdFJlc3VsdCB0ZXN0UmVzdWx0ID0gZ2V0UmVzdWx0KCk7CkBAIC02NTgsNyArNzQxLDggQEAKIAogICAgICAgICAvLyBzdGFydCB0aGUgZXBoZW1lcmFsIGFjdGl2aXR5OyBkaXJlY3RlZCBwYWNrYWdlCiAgICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIEludGVudCBzdGFydEVwaGVtZXJhbEludGVudCA9IG5ldyBJbnRlbnQoQUNUSU9OX1NUQVJUX0VQSEVNRVJBTCk7CisgICAgICAgICAgICBmaW5hbCBJbnRlbnQgc3RhcnRFcGhlbWVyYWxJbnRlbnQgPSBuZXcgSW50ZW50KEFDVElPTl9TVEFSVF9FUEhFTUVSQUwpCisgICAgICAgICAgICAgICAgICAgIC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7CiAgICAgICAgICAgICBzdGFydEVwaGVtZXJhbEludGVudC5zZXRQYWNrYWdlKCJjb20uYW5kcm9pZC5jdHMuZXBoZW1lcmFsYXBwMSIpOwogICAgICAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkKICAgICAgICAgICAgICAgICAgICAgLmdldENvbnRleHQoKS5zdGFydEFjdGl2aXR5KHN0YXJ0RXBoZW1lcmFsSW50ZW50LCBudWxsIC8qb3B0aW9ucyovKTsKQEAgLTY3NSw3ICs3NTksOCBAQAogCiAgICAgICAgIC8vIHN0YXJ0IHRoZSBlcGhlbWVyYWwgYWN0aXZpdHk7IGRpcmVjdGVkIGNvbXBvbmVudAogICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBJbnRlbnQgc3RhcnRFcGhlbWVyYWxJbnRlbnQgPSBuZXcgSW50ZW50KEFDVElPTl9TVEFSVF9FUEhFTUVSQUwpOworICAgICAgICAgICAgZmluYWwgSW50ZW50IHN0YXJ0RXBoZW1lcmFsSW50ZW50ID0gbmV3IEludGVudChBQ1RJT05fU1RBUlRfRVBIRU1FUkFMKQorICAgICAgICAgICAgICAgICAgICAuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOwogICAgICAgICAgICAgc3RhcnRFcGhlbWVyYWxJbnRlbnQuc2V0Q29tcG9uZW50KAogICAgICAgICAgICAgICAgICAgICBuZXcgQ29tcG9uZW50TmFtZSgiY29tLmFuZHJvaWQuY3RzLmVwaGVtZXJhbGFwcDEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5jdHMuZXBoZW1lcmFsYXBwMS5FcGhlbWVyYWxBY3Rpdml0eSIpKTsKQEAgLTY5NCw3ICs3NzksOCBAQAogCiAgICAgICAgIC8vIHN0YXJ0IGEgcHJpdmF0ZSBlcGhlbWVyYWwgYWN0aXZpdHkKICAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSW50ZW50IHN0YXJ0RXBoZW1lcmFsSW50ZW50ID0gbmV3IEludGVudChBQ1RJT05fU1RBUlRfRVBIRU1FUkFMX1BSSVZBVEUpOworICAgICAgICAgICAgZmluYWwgSW50ZW50IHN0YXJ0RXBoZW1lcmFsSW50ZW50ID0gbmV3IEludGVudChBQ1RJT05fU1RBUlRfRVBIRU1FUkFMX1BSSVZBVEUpCisgICAgICAgICAgICAgICAgICAgIC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7CiAgICAgICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeQogICAgICAgICAgICAgICAgICAgICAuZ2V0Q29udGV4dCgpLnN0YXJ0QWN0aXZpdHkoc3RhcnRFcGhlbWVyYWxJbnRlbnQsIG51bGwgLypvcHRpb25zKi8pOwogICAgICAgICAgICAgZmluYWwgVGVzdFJlc3VsdCB0ZXN0UmVzdWx0ID0gZ2V0UmVzdWx0KCk7CkBAIC03MTAsNyArNzk2LDggQEAKIAogICAgICAgICAvLyBzdGFydCBhIHByaXZhdGUgZXBoZW1lcmFsIGFjdGl2aXR5OyBkaXJlY3RlZCBwYWNrYWdlCiAgICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIEludGVudCBzdGFydEVwaGVtZXJhbEludGVudCA9IG5ldyBJbnRlbnQoQUNUSU9OX1NUQVJUX0VQSEVNRVJBTF9QUklWQVRFKTsKKyAgICAgICAgICAgIGZpbmFsIEludGVudCBzdGFydEVwaGVtZXJhbEludGVudCA9IG5ldyBJbnRlbnQoQUNUSU9OX1NUQVJUX0VQSEVNRVJBTF9QUklWQVRFKQorICAgICAgICAgICAgICAgICAgICAuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOwogICAgICAgICAgICAgc3RhcnRFcGhlbWVyYWxJbnRlbnQuc2V0UGFja2FnZSgiY29tLmFuZHJvaWQuY3RzLmVwaGVtZXJhbGFwcDEiKTsKICAgICAgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5CiAgICAgICAgICAgICAgICAgICAgIC5nZXRDb250ZXh0KCkuc3RhcnRBY3Rpdml0eShzdGFydEVwaGVtZXJhbEludGVudCwgbnVsbCAvKm9wdGlvbnMqLyk7CkBAIC03MjcsNyArODE0LDggQEAKIAogICAgICAgICAvLyBzdGFydCBhIHByaXZhdGUgZXBoZW1lcmFsIGFjdGl2aXR5OyBkaXJlY3RlZCBjb21wb25lbnQKICAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSW50ZW50IHN0YXJ0RXBoZW1lcmFsSW50ZW50ID0gbmV3IEludGVudChBQ1RJT05fU1RBUlRfRVBIRU1FUkFMX1BSSVZBVEUpOworICAgICAgICAgICAgZmluYWwgSW50ZW50IHN0YXJ0RXBoZW1lcmFsSW50ZW50ID0gbmV3IEludGVudChBQ1RJT05fU1RBUlRfRVBIRU1FUkFMX1BSSVZBVEUpCisgICAgICAgICAgICAgICAgICAgIC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7CiAgICAgICAgICAgICBzdGFydEVwaGVtZXJhbEludGVudC5zZXRDb21wb25lbnQoCiAgICAgICAgICAgICAgICAgICAgIG5ldyBDb21wb25lbnROYW1lKCJjb20uYW5kcm9pZC5jdHMuZXBoZW1lcmFsYXBwMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmN0cy5lcGhlbWVyYWxhcHAxLkVwaGVtZXJhbEFjdGl2aXR5MiIpKTsKQEAgLTc0NiwxMiArODM0LDEzIEBACiAKICAgICAgICAgLy8gc3RhcnQgYSBwcml2YXRlIGVwaGVtZXJhbCBhY3Rpdml0eTsgZGlyZWN0ZWQgY29tcG9uZW50CiAgICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIEludGVudCBzdGFydEVwaGVtZXJhbEludGVudCA9IG5ldyBJbnRlbnQoKTsKKyAgICAgICAgICAgIGZpbmFsIEludGVudCBzdGFydEVwaGVtZXJhbEludGVudCA9IG5ldyBJbnRlbnQoKQorICAgICAgICAgICAgICAgICAgICAuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOwogICAgICAgICAgICAgc3RhcnRFcGhlbWVyYWxJbnRlbnQuc2V0Q29tcG9uZW50KAogICAgICAgICAgICAgICAgICAgICBuZXcgQ29tcG9uZW50TmFtZSgiY29tLmFuZHJvaWQuY3RzLmVwaGVtZXJhbGFwcDEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5jdHMuZXBoZW1lcmFsYXBwMS5FcGhlbWVyYWxBY3Rpdml0eTMiKSk7CiAgICAgICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeQotICAgICAgICAgICAgLmdldENvbnRleHQoKS5zdGFydEFjdGl2aXR5KHN0YXJ0RXBoZW1lcmFsSW50ZW50LCBudWxsIC8qb3B0aW9ucyovKTsKKyAgICAgICAgICAgICAgICAgICAgLmdldENvbnRleHQoKS5zdGFydEFjdGl2aXR5KHN0YXJ0RXBoZW1lcmFsSW50ZW50LCBudWxsIC8qb3B0aW9ucyovKTsKICAgICAgICAgICAgIGZpbmFsIFRlc3RSZXN1bHQgdGVzdFJlc3VsdCA9IGdldFJlc3VsdCgpOwogICAgICAgICAgICAgYXNzZXJ0VGhhdCh0ZXN0UmVzdWx0LmdldFBhY2thZ2VOYW1lKCksCiAgICAgICAgICAgICAgICAgICAgIGlzKCJjb20uYW5kcm9pZC5jdHMuZXBoZW1lcmFsYXBwMSIpKTsKQEAgLTc2Myw2ICs4NTIsNTIgQEAKICAgICAgICAgICAgICAgICAgICAgaXMobnVsbFZhbHVlKCkpKTsKICAgICAgICAgfQogCisgICAgICAgIC8vIHN0YXJ0IGFuIGVwaGVtZXJhbCBhY3Rpdml0eTsgVklFVyAvIEJST1dTQUJMRSBpbnRlbnQKKyAgICAgICAgeworICAgICAgICAgICAgZmluYWwgSW50ZW50IHN0YXJ0RXBoZW1lcmFsSW50ZW50ID0gbmV3IEludGVudChJbnRlbnQuQUNUSU9OX1ZJRVcpCisgICAgICAgICAgICAgICAgICAgIC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7CisgICAgICAgICAgICBzdGFydEVwaGVtZXJhbEludGVudC5hZGRDYXRlZ29yeShJbnRlbnQuQ0FURUdPUllfQlJPV1NBQkxFKTsKKyAgICAgICAgICAgIHN0YXJ0RXBoZW1lcmFsSW50ZW50LnNldERhdGEoVXJpLnBhcnNlKCJodHRwczovL2N0cy5nb29nbGUuY29tL290aGVyIikpOworICAgICAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkKKyAgICAgICAgICAgICAgICAgICAgLmdldENvbnRleHQoKS5zdGFydEFjdGl2aXR5KHN0YXJ0RXBoZW1lcmFsSW50ZW50LCBudWxsIC8qb3B0aW9ucyovKTsKKyAgICAgICAgICAgIGZpbmFsIFRlc3RSZXN1bHQgdGVzdFJlc3VsdCA9IGdldFJlc3VsdCgpOworICAgICAgICAgICAgYXNzZXJ0VGhhdCh0ZXN0UmVzdWx0LmdldFBhY2thZ2VOYW1lKCksCisgICAgICAgICAgICAgICAgICAgIGlzKCJjb20uYW5kcm9pZC5jdHMuZXBoZW1lcmFsYXBwMiIpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQodGVzdFJlc3VsdC5nZXRDb21wb25lbnROYW1lKCksCisgICAgICAgICAgICAgICAgICAgIGlzKCJFcGhlbWVyYWxBY3Rpdml0eSIpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQodGVzdFJlc3VsdC5nZXRJbnRlbnQoKS5nZXRBY3Rpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgaXMoSW50ZW50LkFDVElPTl9WSUVXKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KHRlc3RSZXN1bHQuZ2V0SW50ZW50KCkuZ2V0Q2F0ZWdvcmllcygpLAorICAgICAgICAgICAgICAgICAgICBoYXNJdGVtcyhJbnRlbnQuQ0FURUdPUllfQlJPV1NBQkxFKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KHRlc3RSZXN1bHQuZ2V0SW50ZW50KCkuZ2V0RGF0YSgpLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgIGlzKCJodHRwczovL2N0cy5nb29nbGUuY29tL290aGVyIikpOworICAgICAgICAgICAgYXNzZXJ0VGhhdCh0ZXN0UmVzdWx0LmdldFN0YXR1cygpLAorICAgICAgICAgICAgICAgICAgICBpcygiUEFTUyIpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQodGVzdFJlc3VsdC5nZXRFeGNlcHRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgaXMobnVsbFZhbHVlKCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHN0YXJ0IGFuIGVwaGVtZXJhbCBhY3Rpdml0eTsgRVhURVJOQUwgZmxhZworICAgICAgICB7CisgICAgICAgICAgICBmaW5hbCBJbnRlbnQgc3RhcnRFcGhlbWVyYWxJbnRlbnQgPSBuZXcgSW50ZW50KEFDVElPTl9TVEFSVF9FUEhFTUVSQUxfQUNUSVZJVFkpCisgICAgICAgICAgICAgICAgICAgIC5zZXRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyB8IEludGVudC5GTEFHX0FDVElWSVRZX01BVENIX0VYVEVSTkFMKTsKKyAgICAgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKS5zdGFydEFjdGl2aXR5KAorICAgICAgICAgICAgICAgICAgICBzdGFydEVwaGVtZXJhbEludGVudCwgbnVsbCAvKm9wdGlvbnMqLyk7CisgICAgICAgICAgICBmaW5hbCBUZXN0UmVzdWx0IHRlc3RSZXN1bHQgPSBnZXRSZXN1bHQoKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQodGVzdFJlc3VsdC5nZXRQYWNrYWdlTmFtZSgpLAorICAgICAgICAgICAgICAgICAgICBpcygiY29tLmFuZHJvaWQuY3RzLmVwaGVtZXJhbGFwcDIiKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KHRlc3RSZXN1bHQuZ2V0Q29tcG9uZW50TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICBpcygiRXBoZW1lcmFsQWN0aXZpdHkiKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KHRlc3RSZXN1bHQuZ2V0SW50ZW50KCkuZ2V0QWN0aW9uKCksCisgICAgICAgICAgICAgICAgICAgIGlzKEFDVElPTl9TVEFSVF9FUEhFTUVSQUxfQUNUSVZJVFkpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQodGVzdFJlc3VsdC5nZXRJbnRlbnQoKS5nZXREYXRhKCksCisgICAgICAgICAgICAgICAgICAgIGlzKG51bGxWYWx1ZSgpKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KHRlc3RSZXN1bHQuZ2V0U3RhdHVzKCksCisgICAgICAgICAgICAgICAgICAgIGlzKCJQQVNTIikpOworICAgICAgICAgICAgYXNzZXJ0VGhhdCh0ZXN0UmVzdWx0LmdldEV4Y2VwdGlvbigpLAorICAgICAgICAgICAgICAgICAgICBpcyhudWxsVmFsdWUoKSkpOworICAgICAgICB9CisKICAgICAgICAgLy8gc3RhcnQgdGhlIGVwaGVtZXJhbCBzZXJ2aWNlOyBkaXJlY3RlZCBwYWNrYWdlCiAgICAgICAgIHsKICAgICAgICAgICAgIGZpbmFsIEludGVudCBzdGFydEVwaGVtZXJhbEludGVudCA9IG5ldyBJbnRlbnQoQUNUSU9OX1NUQVJUX0VQSEVNRVJBTCk7CkBAIC05MjksNiArMTA2NCw3MyBAQAogICAgIH0KIAogICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFjdGl2aXR5SW5mbygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBvd24gcGFja2FnZSBpbmZvCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbmFsIENvbXBvbmVudE5hbWUgY29tcG9uZW50ID0gbmV3IENvbXBvbmVudE5hbWUoCisgICAgICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5jdHMuZXBoZW1lcmFsYXBwMSIsCisgICAgICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5jdHMuZXBoZW1lcmFsYXBwMS5FcGhlbWVyYWxBY3Rpdml0eSIpOworICAgICAgICAgICAgZmluYWwgQWN0aXZpdHlJbmZvIGluZm8gPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCkuZ2V0UGFja2FnZU1hbmFnZXIoKQorICAgICAgICAgICAgICAgIC5nZXRBY3Rpdml0eUluZm8oY29tcG9uZW50LCAwKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaW5mby5wYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgaXMoImNvbS5hbmRyb2lkLmN0cy5lcGhlbWVyYWxhcHAxIikpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZXhwb3NlZCBhcHBsaWNhdGlvbiBwYWNrYWdlIGluZm8KKyAgICAgICAgeworICAgICAgICAgICAgZmluYWwgQ29tcG9uZW50TmFtZSBjb21wb25lbnQgPSBuZXcgQ29tcG9uZW50TmFtZSgKKyAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmN0cy5ub3JtYWxhcHAiLAorICAgICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuY3RzLm5vcm1hbGFwcC5FeHBvc2VkQWN0aXZpdHkiKTsKKyAgICAgICAgICAgIGZpbmFsIEFjdGl2aXR5SW5mbyBpbmZvID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VNYW5hZ2VyKCkKKyAgICAgICAgICAgICAgICAuZ2V0QWN0aXZpdHlJbmZvKGNvbXBvbmVudCwgMCk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGluZm8ucGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgIGlzKCJjb20uYW5kcm9pZC5jdHMubm9ybWFsYXBwIikpOworICAgICAgICB9CisKKyAgICAgICAgLy8gaW1wbGljaXRseSBleHBvc2VkIGFwcGxpY2F0aW9uIHBhY2thZ2UgaW5mbyBub3QgYWNjZXNzaWJsZQorICAgICAgICB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZpbmFsIENvbXBvbmVudE5hbWUgY29tcG9uZW50ID0gbmV3IENvbXBvbmVudE5hbWUoCisgICAgICAgICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuY3RzLm5vcm1hbGFwcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuY3RzLm5vcm1hbGFwcC5Ob3JtYWxXZWJBY3Rpdml0eSIpOworICAgICAgICAgICAgICAgIGZpbmFsIEFjdGl2aXR5SW5mbyBpbmZvID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VNYW5hZ2VyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBY3Rpdml0eUluZm8oY29tcG9uZW50LCAwKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJJbnN0YW50IGFwcHMgc2hvdWxkIG5vdCBiZSBhYmxlIHRvIGFjY2VzcyBBY3Rpdml0eUluZm8gZm9yIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGFuIGFjdGl2aXR5IHRoYXQgaW1wbGljaXRseSBleHBvc2VzIGl0c2VsZiB0byBJbnN0YW50IEFwcHMuIik7CisgICAgICAgICAgICB9IGNhdGNoIChQYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHVuZXhwb3NlZCBhcHBsaWNhdGlvbiBwYWNrYWdlIGluZm8gbm90IGFjY2Vzc2libGUKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmaW5hbCBDb21wb25lbnROYW1lIGNvbXBvbmVudCA9IG5ldyBDb21wb25lbnROYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmN0cy5ub3JtYWxhcHAiLAorICAgICAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmN0cy5ub3JtYWxhcHAuTm9ybWFsQWN0aXZpdHkiKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBBY3Rpdml0eUluZm8gaW5mbyA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKS5nZXRQYWNrYWdlTWFuYWdlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QWN0aXZpdHlJbmZvKGNvbXBvbmVudCwgMCk7CisgICAgICAgICAgICAgICAgZmFpbCgiSW5zdGFudCBhcHBzIHNob3VsZCBub3QgYmUgYWJsZSB0byBhY2Nlc3MgQWN0aXZpdHlJbmZvIGZvciIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBhbiBhY3Rpdml0eSB0aGF0IGRvZXMgbm90IGV4cG9zZSBpdHNlbGYgdG8gSW5zdGFudCBBcHBzLiIpOworICAgICAgICAgICAgfSBjYXRjaCAoUGFja2FnZU1hbmFnZXIuTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBpbnN0YW50IGFwcGxpY2F0aW9uICh3aXRoIHZpc2libGVUb0luc3RhbnRBcHAgY29tcG9uZW50KSBwYWNrYWdlIGluZm8gbm90IGFjY2Vzc2libGUKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmaW5hbCBDb21wb25lbnROYW1lIGNvbXBvbmVudCA9IG5ldyBDb21wb25lbnROYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmN0cy5lcGhlbWVyYWxhcHAyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5jdHMuZXBoZW1lcmFsYXBwMi5FeHBvc2VkQWN0aXZpdHkiKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBBY3Rpdml0eUluZm8gaW5mbyA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKS5nZXRQYWNrYWdlTWFuYWdlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QWN0aXZpdHlJbmZvKGNvbXBvbmVudCwgMCk7CisgICAgICAgICAgICAgICAgZmFpbCgiSW5zdGFudCBhcHBzIHNob3VsZCBub3QgYmUgYWJsZSB0byBhY2Nlc3MgQWN0aXZpdHlJbmZvIGZvciIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBhbm90aGVyIEluc3RhbnQgQXBwLiIpOworICAgICAgICAgICAgfSBjYXRjaCAoUGFja2FnZU1hbmFnZXIuTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsUGVybWlzc2lvbk5vdEdyYW50ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0VGhhdChJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCkKICAgICAgICAgICAgICAgICAgICAgLmNoZWNrQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oTWFuaWZlc3QucGVybWlzc2lvbi5TRVRfQUxBUk0pLApAQCAtOTU4LDYgKzExNjAsMjQ4IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRJbnN0YWxsZXIwMSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyB0ZXN0IHdlIGNhbiByZWFkIG91ciBvd24gaW5zdGFsbGVyCisgICAgICAgIGZpbmFsIFN0cmluZyBpbnN0YWxsZXJQYWNrYWdlTmFtZSA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKS5nZXRQYWNrYWdlTWFuYWdlcigpCisgICAgICAgICAgICAgICAgLmdldEluc3RhbGxlclBhY2thZ2VOYW1lKCJjb20uYW5kcm9pZC5jdHMuZXBoZW1lcmFsYXBwMSIpOworICAgICAgICBhc3NlcnRUaGF0KGluc3RhbGxlclBhY2thZ2VOYW1lLCBpcygiY29tLmFuZHJvaWQuY3RzLm5vcm1hbGFwcCIpKTsKKyAgICB9CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SW5zdGFsbGVyMDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gdGVzdCB3ZSBjYW4gcmVhZCBzb21lb25lIGVsc2UncyBpbnN0YWxsZXIgaWYgdGhleSdyZSBleHBvc2VkIHRvIGluc3RhbnQgYXBwbGljYXRpb25zCisgICAgICAgIGZpbmFsIFN0cmluZyBpbnN0YWxsZXJQYWNrYWdlTmFtZSA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKS5nZXRQYWNrYWdlTWFuYWdlcigpCisgICAgICAgICAgICAgICAgLmdldEluc3RhbGxlclBhY2thZ2VOYW1lKCJjb20uYW5kcm9pZC5jdHMubm9ybWFsYXBwIik7CisgICAgICAgIGFzc2VydFRoYXQoaW5zdGFsbGVyUGFja2FnZU5hbWUsIGlzKCJjb20uYW5kcm9pZC5jdHMubm9ybWFsYXBwIikpOworICAgIH0KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRJbnN0YWxsZXIwMygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyB0ZXN0IHdlIGNhbid0IHJlYWQgaW5zdGFsbGVyIGlmIHRoZXkncmUgbm90IGV4cG9zZWQgdG8gaW5zdGFudCBhcHBsaWNhdGlvbnMKKyAgICAgICAgZmluYWwgU3RyaW5nIGluc3RhbGxlclBhY2thZ2VOYW1lID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VNYW5hZ2VyKCkKKyAgICAgICAgICAgICAgICAuZ2V0SW5zdGFsbGVyUGFja2FnZU5hbWUoImNvbS5hbmRyb2lkLmN0cy51bmV4cG9zZWRhcHAiKTsKKyAgICAgICAgYXNzZXJ0VGhhdChpbnN0YWxsZXJQYWNrYWdlTmFtZSwgaXMobnVsbFZhbHVlKCkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFydEZvcmVncm91bmRTZXJ2aWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKTsKKyAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoY29udGV4dCwgU29tZVNlcnZpY2UuY2xhc3MpOworCisgICAgICAgIC8vIENyZWF0ZSBhIG5vdGlmaWNhdGlvbiBjaGFubmVsIGZvciB0aGUgZm9yZWdyb3VuZCBub3RpZmljYXRpb24KKyAgICAgICAgZmluYWwgTm90aWZpY2F0aW9uQ2hhbm5lbCBjaGFubmVsID0gbmV3IE5vdGlmaWNhdGlvbkNoYW5uZWwoImZvbyIsICJmb28iLAorICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbk1hbmFnZXIuSU1QT1JUQU5DRV9ERUZBVUxUKTsKKyAgICAgICAgZmluYWwgTm90aWZpY2F0aW9uTWFuYWdlciBub3RpZmljYXRpb25NYW5hZ2VyID0gY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKAorICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbk1hbmFnZXIuY2xhc3MpOworICAgICAgICBub3RpZmljYXRpb25NYW5hZ2VyLmNyZWF0ZU5vdGlmaWNhdGlvbkNoYW5uZWwoY2hhbm5lbCk7CisKKyAgICAgICAgLy8gU2hvdWxkbid0IGJlIGFibGUgdG8gc3RhcnQgd2l0aG91dCBhIHBlcm1pc3Npb24KKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2gxID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworICAgICAgICBTb21lU2VydmljZS5zZXRPblN0YXJ0Q29tbWFuZENhbGxiYWNrKChpbnQgcmVzdWx0KSAtPiB7CisgICAgICAgICAgICBhc3NlcnRTYW1lKCJTaG91bGRuJ3QgYmUgYWJsZSB0byBzdGFydCB3aXRob3V0ICIKKyAgICAgICAgICAgICAgICAgICAgKyAiIElOU1RBTlRfQVBQX0ZPUkVHUk9VTkRfU0VSVklDRSBwZXJtaXNzaW9uIiwgMCwgcmVzdWx0KTsKKyAgICAgICAgICAgIGxhdGNoMS5jb3VudERvd24oKTsKKyAgICAgICAgfSk7CisgICAgICAgIGNvbnRleHQuc3RhcnRGb3JlZ3JvdW5kU2VydmljZShpbnRlbnQpOworICAgICAgICBsYXRjaDEuYXdhaXQoNSwgVGltZVVuaXQuU0VDT05EUyk7CisKKyAgICAgICAgLy8gTm93IGdyYW50IG91cnNlbHZlcyBJTlNUQU5UX0FQUF9GT1JFR1JPVU5EX1NFUlZJQ0UKKyAgICAgICAgZ3JhbnRJbnN0YW50QXBwRm9yZWdyb3VuZFNlcnZpY2VQZXJtaXNzaW9uKCk7CisKKyAgICAgICAgLy8gU2hvdWxkIGJlIGFibGUgdG8gc3RhcnQgd2l0aCBhIHBlcm1pc3Npb24KKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2gyID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworICAgICAgICBTb21lU2VydmljZS5zZXRPblN0YXJ0Q29tbWFuZENhbGxiYWNrKChpbnQgcmVzdWx0KSAtPiB7CisgICAgICAgICAgICBhc3NlcnRTYW1lKCJTaG91bGQgYmUgYWJsZSB0byBzdGFydCB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgKyAiIElOU1RBTlRfQVBQX0ZPUkVHUk9VTkRfU0VSVklDRSBwZXJtaXNzaW9uIiwgMSwgcmVzdWx0KTsKKyAgICAgICAgICAgIGxhdGNoMi5jb3VudERvd24oKTsKKyAgICAgICAgfSk7CisgICAgICAgIGNvbnRleHQuc3RhcnRGb3JlZ3JvdW5kU2VydmljZShpbnRlbnQpOworICAgICAgICBsYXRjaDIuYXdhaXQoNSwgVGltZVVuaXQuU0VDT05EUyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVjb3JkQXVkaW9QZXJtaXNzaW9uKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGZpbmFsIEF1ZGlvUmVjb3JkIHJlY29yZCA9CisgICAgICAgICAgICAgICAgbmV3IEF1ZGlvUmVjb3JkKE1JQywgODAwMCwgQ0hBTk5FTF9JTl9NT05PLCBFTkNPRElOR19QQ01fMTZCSVQsIDQwOTYpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0VGhhdCgiYXVkaW8gcmVjb3JkIG5vdCBpbml0aWFsaXplZCIsCisgICAgICAgICAgICAgICAgICAgIHJlY29yZC5nZXRTdGF0ZSgpLCBpcyhBdWRpb1JlY29yZC5TVEFURV9JTklUSUFMSVpFRCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcmVjb3JkLnJlbGVhc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRQaG9uZU51bWJlcnNQZXJtaXNzaW9uKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKTsKKyAgICAgICAgaWYgKCFjb250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCkuaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX1RFTEVQSE9OWSkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBUZWxlcGhvbnlNYW5hZ2VyIHRlbGVwaG9ueU1hbmFnZXIgPQorICAgICAgICAgICAgICAgICAgICAoVGVsZXBob255TWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuVEVMRVBIT05ZX1NFUlZJQ0UpOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5tYnIgPSB0ZWxlcGhvbnlNYW5hZ2VyLmdldExpbmUxTnVtYmVyKCk7CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlBlcm1pc3Npb24gbm90IGdyYW50ZWQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFjY2Vzc0NvYXJzZUxvY2F0aW9uUGVybWlzc2lvbigpIHsKKyAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0ID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpOworCisgICAgICAgIGZpbmFsIExvY2F0aW9uTWFuYWdlciBsb2NhdGlvbk1hbmFnZXIgPQorICAgICAgICAgICAgICAgIChMb2NhdGlvbk1hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkxPQ0FUSU9OX1NFUlZJQ0UpOworCisgICAgICAgIGZpbmFsIENyaXRlcmlhIGNyaXRlcmlhID0gbmV3IENyaXRlcmlhKCk7CisgICAgICAgIGNyaXRlcmlhLnNldEFjY3VyYWN5KENyaXRlcmlhLkFDQ1VSQUNZX0NPQVJTRSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBiZXN0UHJvdmlkZXIgPSBsb2NhdGlvbk1hbmFnZXIuZ2V0QmVzdFByb3ZpZGVyKGNyaXRlcmlhLCBmYWxzZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJvdmlkZXIgPQorICAgICAgICAgICAgICAgICAgICBiZXN0UHJvdmlkZXIgPT0gbnVsbCA/IExvY2F0aW9uTWFuYWdlci5ORVRXT1JLX1BST1ZJREVSIDogYmVzdFByb3ZpZGVyOworICAgICAgICAgICAgbG9jYXRpb25NYW5hZ2VyLmdldExhc3RLbm93bkxvY2F0aW9uKHByb3ZpZGVyKTsKKyAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiUGVybWlzc2lvbiBub3QgZ3JhbnRlZC4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENhbWVyYVBlcm1pc3Npb24oKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0ID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpOworICAgICAgICBmaW5hbCBDYW1lcmFNYW5hZ2VyIG1hbmFnZXIgPQorICAgICAgICAgICAgICAgIChDYW1lcmFNYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5DQU1FUkFfU0VSVklDRSk7CisgICAgICAgIGZpbmFsIFN0cmluZ1tdIGNhbWVyYUlkcyA9IG1hbmFnZXIuZ2V0Q2FtZXJhSWRMaXN0KCk7CisgICAgICAgIGlmIChjYW1lcmFJZHMubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICAgICAgZmluYWwgSGFuZGxlclRocmVhZCBiYWNrZ3JvdW5kVGhyZWFkID0gbmV3IEhhbmRsZXJUaHJlYWQoImNhbWVyYV9iZyIpOworICAgICAgICBiYWNrZ3JvdW5kVGhyZWFkLnN0YXJ0KCk7CisgICAgICAgIGZpbmFsIENhbWVyYURldmljZS5TdGF0ZUNhbGxiYWNrIGNhbGxiYWNrID0gbmV3IENhbWVyYURldmljZS5TdGF0ZUNhbGxiYWNrKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbk9wZW5lZChDYW1lcmFEZXZpY2UgY2FtZXJhKSB7CisgICAgICAgICAgICAgICAgbGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICAgICAgY2FtZXJhLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRGlzY29ubmVjdGVkKENhbWVyYURldmljZSBjYW1lcmEpIHsKKyAgICAgICAgICAgICAgICBjYW1lcmEuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihDYW1lcmFEZXZpY2UgY2FtZXJhLCBpbnQgZXJyb3IpIHsKKyAgICAgICAgICAgICAgICBjYW1lcmEuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgbWFuYWdlci5vcGVuQ2FtZXJhKGNhbWVyYUlkc1swXSwgY2FsbGJhY2ssIG5ldyBIYW5kbGVyKGJhY2tncm91bmRUaHJlYWQuZ2V0TG9vcGVyKCkpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChsYXRjaC5hd2FpdCgxMDAwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpLCBpcyh0cnVlKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW50ZXJuZXRQZXJtaXNzaW9uKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGZpbmFsIENvbm5lY3Rpdml0eU1hbmFnZXIgbWFuYWdlciA9IChDb25uZWN0aXZpdHlNYW5hZ2VyKSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCkKKyAgICAgICAgICAgICAgICAuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkNPTk5FQ1RJVklUWV9TRVJWSUNFKTsKKyAgICAgICAgbWFuYWdlci5yZXBvcnROZXR3b3JrQ29ubmVjdGl2aXR5KG51bGwsIGZhbHNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWaWJyYXRlUGVybWlzc2lvbigpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBmaW5hbCBWaWJyYXRvciB2aWJyYXRvciA9IChWaWJyYXRvcikgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpCisgICAgICAgICAgICAgICAgLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5WSUJSQVRPUl9TRVJWSUNFKTsKKyAgICAgICAgZmluYWwgVmlicmF0aW9uRWZmZWN0IGVmZmVjdCA9CisgICAgICAgICAgICAgICAgVmlicmF0aW9uRWZmZWN0LmNyZWF0ZU9uZVNob3QoMTAwLCBWaWJyYXRpb25FZmZlY3QuREVGQVVMVF9BTVBMSVRVREUpOworICAgICAgICB2aWJyYXRvci52aWJyYXRlKGVmZmVjdCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2FrZUxvY2tQZXJtaXNzaW9uKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIFdha2VMb2NrIHdha2VMb2NrID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIFBvd2VyTWFuYWdlciBwb3dlck1hbmFnZXIgPSAoUG93ZXJNYW5hZ2VyKSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCkKKyAgICAgICAgICAgICAgICAgICAgLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5QT1dFUl9TRVJWSUNFKTsKKyAgICAgICAgICAgIHdha2VMb2NrID0gcG93ZXJNYW5hZ2VyLm5ld1dha2VMb2NrKFBvd2VyTWFuYWdlci5QQVJUSUFMX1dBS0VfTE9DSywgInRlc3QiKTsKKyAgICAgICAgICAgIHdha2VMb2NrLmFjcXVpcmUoKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmICh3YWtlTG9jayAhPSBudWxsICYmICB3YWtlTG9jay5pc0hlbGQoKSkgeworICAgICAgICAgICAgICAgIHdha2VMb2NrLnJlbGVhc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFNlYXJjaGFibGVJbmZvKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGZpbmFsIFNlYXJjaE1hbmFnZXIgc2VhcmNoTWFuYWdlciA9IChTZWFyY2hNYW5hZ2VyKSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCkKKyAgICAgICAgICAgICAgICAuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlNFQVJDSF9TRVJWSUNFKTsKKyAgICAgICAgaWYgKHNlYXJjaE1hbmFnZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIGdldCBzZWFyY2hhYmxlIGluZm8gZm9yIGEgY29tcG9uZW50IGluIG91cnNlbGY7IHBhc3MKKyAgICAgICAgeworICAgICAgICAgICAgZmluYWwgU2VhcmNoYWJsZUluZm8gaW5mbyA9IHNlYXJjaE1hbmFnZXIuZ2V0U2VhcmNoYWJsZUluZm8oCisgICAgICAgICAgICAgICAgICAgIG5ldyBDb21wb25lbnROYW1lKCJjb20uYW5kcm9pZC5jdHMuZXBoZW1lcmFsYXBwMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmN0cy5lcGhlbWVyYWxhcHAxLkVwaGVtZXJhbEFjdGl2aXR5IikpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChpbmZvLCBpcyhub3ROdWxsVmFsdWUoKSkpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChpbmZvLmdldFNlYXJjaEFjdGl2aXR5KCksCisgICAgICAgICAgICAgICAgICAgIGlzKGVxdWFsVG8oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENvbXBvbmVudE5hbWUoImNvbS5hbmRyb2lkLmN0cy5lcGhlbWVyYWxhcHAxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5jdHMuZXBoZW1lcmFsYXBwMS5FcGhlbWVyYWxBY3Rpdml0eSIpKSkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZ2V0IHNlYXJjaGFibGUgaW5mbyBmb3IgYSBjb21wb25lbnQgaW4gYSBkaWZmZXJlbnQgaW5zdGFudCBhcHBsaWNhdGlvbjsgZmFpbAorICAgICAgICB7CisgICAgICAgICAgICBmaW5hbCBTZWFyY2hhYmxlSW5mbyBpbmZvID0gc2VhcmNoTWFuYWdlci5nZXRTZWFyY2hhYmxlSW5mbygKKyAgICAgICAgICAgICAgICAgICAgbmV3IENvbXBvbmVudE5hbWUoImNvbS5hbmRyb2lkLmN0cy5lcGhlbWVyYWxhcHAyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuY3RzLmVwaGVtZXJhbGFwcDIuRXBoZW1lcmFsQWN0aXZpdHkiKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGluZm8sIGlzKG51bGxWYWx1ZSgpKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBnZXQgc2VhcmNoYWJsZSBpbmZvIGZvciBhbiBleHBvc2VkIGluIGEgZnVsbCBhcHBsaWNhdGlvbjsgcGFzcworICAgICAgICB7CisgICAgICAgICAgICBmaW5hbCBTZWFyY2hhYmxlSW5mbyBpbmZvID0gc2VhcmNoTWFuYWdlci5nZXRTZWFyY2hhYmxlSW5mbygKKyAgICAgICAgICAgICAgICAgICAgbmV3IENvbXBvbmVudE5hbWUoImNvbS5hbmRyb2lkLmN0cy5ub3JtYWxhcHAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5jdHMubm9ybWFsYXBwLkV4cG9zZWRBY3Rpdml0eSIpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaW5mbywgaXMobm90TnVsbFZhbHVlKCkpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaW5mby5nZXRTZWFyY2hBY3Rpdml0eSgpLAorICAgICAgICAgICAgICAgICAgICBpcyhlcXVhbFRvKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb21wb25lbnROYW1lKCJjb20uYW5kcm9pZC5jdHMubm9ybWFsYXBwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5jdHMubm9ybWFsYXBwLkV4cG9zZWRBY3Rpdml0eSIpKSkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZ2V0IHNlYXJjaGFibGUgaW5mbyBmb3IgYW4gdW5leHBvc2VkIGNvbXBvbmVudCBpbiBhIGZ1bGwgYXBwbGljYXRpb247IGZhaWwKKyAgICAgICAgeworICAgICAgICAgICAgZmluYWwgU2VhcmNoYWJsZUluZm8gaW5mbyA9IHNlYXJjaE1hbmFnZXIuZ2V0U2VhcmNoYWJsZUluZm8oCisgICAgICAgICAgICAgICAgICAgIG5ldyBDb21wb25lbnROYW1lKCJjb20uYW5kcm9pZC5jdHMubm9ybWFsYXBwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuY3RzLm5vcm1hbGFwcC5Ob3JtYWxBY3Rpdml0eSIpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaW5mbywgaXMobnVsbFZhbHVlKCkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGUgZ2l2ZW4gZmlsdGVyIGhhbmRsZXMgYWxsIHdlYiBVUkxzLCByZWdhcmRsZXNzIG9mIGhvc3QuICovCisgICAgcHJpdmF0ZSBib29sZWFuIGhhbmRsZXNBbGxXZWJEYXRhKEludGVudEZpbHRlciBmaWx0ZXIpIHsKKyAgICAgICAgcmV0dXJuIGZpbHRlci5oYXNDYXRlZ29yeShJbnRlbnQuQ0FURUdPUllfQVBQX0JST1dTRVIpIHx8CisgICAgICAgICAgICAgICAgKGhhbmRsZXNXZWJVcmlzKGZpbHRlcikgJiYgZmlsdGVyLmNvdW50RGF0YUF1dGhvcml0aWVzKCkgPT0gMCk7CisgICAgfQorCisgICAgLyoqIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoZSBnaXZlbiBmaWx0ZXIgaGFuZGxlcyBhdCBsZWFzdCBvbmUgd2ViIFVSTC4gKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaGFuZGxlc1dlYlVyaXMoSW50ZW50RmlsdGVyIGZpbHRlcikgeworICAgICAgICAvLyBSZXF1aXJlIEFDVElPTl9WSUVXLCBDQVRFR09SWV9CUk9XU0VBQkxFLCBhbmQgYXQgbGVhc3Qgb25lIHNjaGVtZQorICAgICAgICBpZiAoIWZpbHRlci5oYXNBY3Rpb24oSW50ZW50LkFDVElPTl9WSUVXKQorICAgICAgICAgICAgfHwgIWZpbHRlci5oYXNDYXRlZ29yeShJbnRlbnQuQ0FURUdPUllfQlJPV1NBQkxFKQorICAgICAgICAgICAgfHwgZmlsdGVyLmNvdW50RGF0YVNjaGVtZXMoKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgLy8gTm93IGFsbG93IG9ubHkgdGhlIHNjaGVtZXMgImh0dHAiIGFuZCAiaHR0cHMiCisgICAgICAgIGZpbmFsIEl0ZXJhdG9yPFN0cmluZz4gc2NoZW1lc0l0ZXJhdG9yID0gZmlsdGVyLnNjaGVtZXNJdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoc2NoZW1lc0l0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHNjaGVtZSA9IHNjaGVtZXNJdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzV2ViU2NoZW1lID0gImh0dHAiLmVxdWFscyhzY2hlbWUpIHx8ICJodHRwcyIuZXF1YWxzKHNjaGVtZSk7CisgICAgICAgICAgICBpZiAoaXNXZWJTY2hlbWUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCiAgICAgcHJpdmF0ZSBUZXN0UmVzdWx0IGdldFJlc3VsdCgpIHsKICAgICAgICAgZmluYWwgVGVzdFJlc3VsdCByZXN1bHQ7CiAgICAgICAgIHRyeSB7CkBAIC05NzEsNiArMTQxNSwxMiBAQAogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAorICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZ3JhbnRJbnN0YW50QXBwRm9yZWdyb3VuZFNlcnZpY2VQZXJtaXNzaW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VWlBdXRvbWF0aW9uKCkuZ3JhbnRSdW50aW1lUGVybWlzc2lvbigKKyAgICAgICAgICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCkuZ2V0UGFja2FnZU5hbWUoKSwKKyAgICAgICAgICAgICAgICBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uSU5TVEFOVF9BUFBfRk9SRUdST1VORF9TRVJWSUNFKTsKKyAgICB9CisKICAgICBwcml2YXRlIHN0YXRpYyBJbnRlbnQgbWFrZUludGVudChTdHJpbmcgYWN0aW9uLCBTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtaW1lVHlwZSkgewogICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChhY3Rpb24pOwogICAgICAgICBpZiAoY2F0ZWdvcnkgIT0gbnVsbCkgewpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRXBoZW1lcmFsVGVzdEFwcC9FcGhlbWVyYWxBcHAxL3NyYy9jb20vYW5kcm9pZC9jdHMvZXBoZW1lcmFsYXBwMS9FcGhlbWVyYWxBY3Rpdml0eS5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRXBoZW1lcmFsVGVzdEFwcC9FcGhlbWVyYWxBcHAxL3NyYy9jb20vYW5kcm9pZC9jdHMvZXBoZW1lcmFsYXBwMS9FcGhlbWVyYWxBY3Rpdml0eS5qYXZhCmluZGV4IGJjMjlhZjkuLjIxMzY3MDAgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0VwaGVtZXJhbFRlc3RBcHAvRXBoZW1lcmFsQXBwMS9zcmMvY29tL2FuZHJvaWQvY3RzL2VwaGVtZXJhbGFwcDEvRXBoZW1lcmFsQWN0aXZpdHkuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9FcGhlbWVyYWxUZXN0QXBwL0VwaGVtZXJhbEFwcDEvc3JjL2NvbS9hbmRyb2lkL2N0cy9lcGhlbWVyYWxhcHAxL0VwaGVtZXJhbEFjdGl2aXR5LmphdmEKQEAgLTE3LDEyICsxNywxNCBAQAogcGFja2FnZSBjb20uYW5kcm9pZC5jdHMuZXBoZW1lcmFsYXBwMTsKIAogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuYXBwLlNlYXJjaE1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZUluZm87CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlJlc29sdmVJbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2VhcmNoUmVjZW50U3VnZ2VzdGlvbnM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy51dGlsLlRlc3RSZXN1bHQ7CkBAIC0zNCw5ICszNiwxOCBAQAogICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKIAorICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ICA9IGdldEludGVudCgpOworICAgICAgICBpZiAoSW50ZW50LkFDVElPTl9TRUFSQ0guZXF1YWxzKGludGVudC5nZXRBY3Rpb24oKSkpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBxdWVyeSA9IGludGVudC5nZXRTdHJpbmdFeHRyYShTZWFyY2hNYW5hZ2VyLlFVRVJZKTsKKyAgICAgICAgICAgIGZpbmFsIFNlYXJjaFJlY2VudFN1Z2dlc3Rpb25zIHN1Z2dlc3Rpb25zID0gbmV3IFNlYXJjaFJlY2VudFN1Z2dlc3Rpb25zKHRoaXMsCisgICAgICAgICAgICAgICAgICAgIFNlYXJjaFN1Z2dlc3Rpb25Qcm92aWRlci5BVVRIT1JJVFksIFNlYXJjaFN1Z2dlc3Rpb25Qcm92aWRlci5NT0RFKTsKKyAgICAgICAgICAgIHN1Z2dlc3Rpb25zLnNhdmVSZWNlbnRRdWVyeShxdWVyeSwgbnVsbCk7CisgICAgICAgIH0KKwogICAgICAgICBUZXN0UmVzdWx0LmdldEJ1aWxkZXIoKQogICAgICAgICAgICAgICAgIC5zZXRQYWNrYWdlTmFtZSgiY29tLmFuZHJvaWQuY3RzLmVwaGVtZXJhbGFwcDEiKQogICAgICAgICAgICAgICAgIC5zZXRDb21wb25lbnROYW1lKCJFcGhlbWVyYWxBY3Rpdml0eSIpCisgICAgICAgICAgICAgICAgLnNldEludGVudChnZXRJbnRlbnQoKSkKICAgICAgICAgICAgICAgICAuc2V0U3RhdHVzKCJQQVNTIikKICAgICAgICAgICAgICAgICAuYnVpbGQoKQogICAgICAgICAgICAgICAgIC5icm9hZGNhc3QodGhpcyk7CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9FcGhlbWVyYWxUZXN0QXBwL0VwaGVtZXJhbEFwcDEvc3JjL2NvbS9hbmRyb2lkL2N0cy9lcGhlbWVyYWxhcHAxL0VwaGVtZXJhbEFjdGl2aXR5Mi5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRXBoZW1lcmFsVGVzdEFwcC9FcGhlbWVyYWxBcHAxL3NyYy9jb20vYW5kcm9pZC9jdHMvZXBoZW1lcmFsYXBwMS9FcGhlbWVyYWxBY3Rpdml0eTIuamF2YQppbmRleCA5NTJiMmY2Ni4uYTBhMTcwZCAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRXBoZW1lcmFsVGVzdEFwcC9FcGhlbWVyYWxBcHAxL3NyYy9jb20vYW5kcm9pZC9jdHMvZXBoZW1lcmFsYXBwMS9FcGhlbWVyYWxBY3Rpdml0eTIuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9FcGhlbWVyYWxUZXN0QXBwL0VwaGVtZXJhbEFwcDEvc3JjL2NvbS9hbmRyb2lkL2N0cy9lcGhlbWVyYWxhcHAxL0VwaGVtZXJhbEFjdGl2aXR5Mi5qYXZhCkBAIC0zNSw2ICszNSw3IEBACiAgICAgICAgIFRlc3RSZXN1bHQuZ2V0QnVpbGRlcigpCiAgICAgICAgICAgICAgICAgLnNldFBhY2thZ2VOYW1lKCJjb20uYW5kcm9pZC5jdHMuZXBoZW1lcmFsYXBwMSIpCiAgICAgICAgICAgICAgICAgLnNldENvbXBvbmVudE5hbWUoIkVwaGVtZXJhbEFjdGl2aXR5MiIpCisgICAgICAgICAgICAgICAgLnNldEludGVudChnZXRJbnRlbnQoKSkKICAgICAgICAgICAgICAgICAuc2V0U3RhdHVzKCJQQVNTIikKICAgICAgICAgICAgICAgICAuYnVpbGQoKQogICAgICAgICAgICAgICAgIC5icm9hZGNhc3QodGhpcyk7CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9FcGhlbWVyYWxUZXN0QXBwL0VwaGVtZXJhbEFwcDEvc3JjL2NvbS9hbmRyb2lkL2N0cy9lcGhlbWVyYWxhcHAxL0VwaGVtZXJhbEFjdGl2aXR5My5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRXBoZW1lcmFsVGVzdEFwcC9FcGhlbWVyYWxBcHAxL3NyYy9jb20vYW5kcm9pZC9jdHMvZXBoZW1lcmFsYXBwMS9FcGhlbWVyYWxBY3Rpdml0eTMuamF2YQppbmRleCAyODczNGRkLi4xMjY3NTc3IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9FcGhlbWVyYWxUZXN0QXBwL0VwaGVtZXJhbEFwcDEvc3JjL2NvbS9hbmRyb2lkL2N0cy9lcGhlbWVyYWxhcHAxL0VwaGVtZXJhbEFjdGl2aXR5My5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0VwaGVtZXJhbFRlc3RBcHAvRXBoZW1lcmFsQXBwMS9zcmMvY29tL2FuZHJvaWQvY3RzL2VwaGVtZXJhbGFwcDEvRXBoZW1lcmFsQWN0aXZpdHkzLmphdmEKQEAgLTM1LDYgKzM1LDcgQEAKICAgICAgICAgVGVzdFJlc3VsdC5nZXRCdWlsZGVyKCkKICAgICAgICAgICAgICAgICAuc2V0UGFja2FnZU5hbWUoImNvbS5hbmRyb2lkLmN0cy5lcGhlbWVyYWxhcHAxIikKICAgICAgICAgICAgICAgICAuc2V0Q29tcG9uZW50TmFtZSgiRXBoZW1lcmFsQWN0aXZpdHkzIikKKyAgICAgICAgICAgICAgICAuc2V0SW50ZW50KGdldEludGVudCgpKQogICAgICAgICAgICAgICAgIC5zZXRTdGF0dXMoIlBBU1MiKQogICAgICAgICAgICAgICAgIC5idWlsZCgpCiAgICAgICAgICAgICAgICAgLmJyb2FkY2FzdCh0aGlzKTsKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0VwaGVtZXJhbFRlc3RBcHAvRXBoZW1lcmFsQXBwMS9zcmMvY29tL2FuZHJvaWQvY3RzL2VwaGVtZXJhbGFwcDEvRXBoZW1lcmFsUmVzdWx0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9FcGhlbWVyYWxUZXN0QXBwL0VwaGVtZXJhbEFwcDEvc3JjL2NvbS9hbmRyb2lkL2N0cy9lcGhlbWVyYWxhcHAxL0VwaGVtZXJhbFJlc3VsdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExZmFkNTAKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9FcGhlbWVyYWxUZXN0QXBwL0VwaGVtZXJhbEFwcDEvc3JjL2NvbS9hbmRyb2lkL2N0cy9lcGhlbWVyYWxhcHAxL0VwaGVtZXJhbFJlc3VsdC5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5lcGhlbWVyYWxhcHAxOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuU2VhcmNoTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlSW5mbzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUmVzb2x2ZUluZm87CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLk5hbWVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZWFyY2hSZWNlbnRTdWdnZXN0aW9uczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgY29tLmFuZHJvaWQuY3RzLnV0aWwuVGVzdFJlc3VsdDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgRXBoZW1lcmFsUmVzdWx0IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ICA9IGdldEludGVudCgpOworICAgICAgICBpZiAoSW50ZW50LkFDVElPTl9WSUVXLmVxdWFscyhpbnRlbnQuZ2V0QWN0aW9uKCkpCisgICAgICAgICAgICAgICAgJiYgaW50ZW50Lmhhc0V4dHJhKFRlc3RSZXN1bHQuRVhUUkFfVEVTVF9SRVNVTFQpKSB7CisgICAgICAgICAgICAoKFRlc3RSZXN1bHQpIGludGVudC5nZXRQYXJjZWxhYmxlRXh0cmEoVGVzdFJlc3VsdC5FWFRSQV9URVNUX1JFU1VMVCkpLmJyb2FkY2FzdCh0aGlzKTsKKyAgICAgICAgfQorICAgICAgICBmaW5pc2goKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9FcGhlbWVyYWxUZXN0QXBwL0VwaGVtZXJhbEFwcDEvc3JjL2NvbS9hbmRyb2lkL2N0cy9lcGhlbWVyYWxhcHAxL0VwaGVtZXJhbFNlcnZpY2UuamF2YSBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0VwaGVtZXJhbFRlc3RBcHAvRXBoZW1lcmFsQXBwMS9zcmMvY29tL2FuZHJvaWQvY3RzL2VwaGVtZXJhbGFwcDEvRXBoZW1lcmFsU2VydmljZS5qYXZhCmluZGV4IGQ2NDk5OTQuLjg2ZGVkYzYgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0VwaGVtZXJhbFRlc3RBcHAvRXBoZW1lcmFsQXBwMS9zcmMvY29tL2FuZHJvaWQvY3RzL2VwaGVtZXJhbGFwcDEvRXBoZW1lcmFsU2VydmljZS5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0VwaGVtZXJhbFRlc3RBcHAvRXBoZW1lcmFsQXBwMS9zcmMvY29tL2FuZHJvaWQvY3RzL2VwaGVtZXJhbGFwcDEvRXBoZW1lcmFsU2VydmljZS5qYXZhCkBAIC00MSw2ICs0MSw3IEBACiAgICAgICAgICAgICAgICAgLnNldFBhY2thZ2VOYW1lKCJjb20uYW5kcm9pZC5jdHMuZXBoZW1lcmFsYXBwMSIpCiAgICAgICAgICAgICAgICAgLnNldENvbXBvbmVudE5hbWUoIkVwaGVtZXJhbFNlcnZpY2UiKQogICAgICAgICAgICAgICAgIC5zZXRNZXRob2ROYW1lKCJvbkJpbmQiKQorICAgICAgICAgICAgICAgIC5zZXRJbnRlbnQoaW50ZW50KQogICAgICAgICAgICAgICAgIC5zZXRTdGF0dXMoIlBBU1MiKQogICAgICAgICAgICAgICAgIC5idWlsZCgpCiAgICAgICAgICAgICAgICAgLmJyb2FkY2FzdCh0aGlzKTsKQEAgLTUzLDYgKzU0LDcgQEAKICAgICAgICAgICAgICAgICAuc2V0UGFja2FnZU5hbWUoImNvbS5hbmRyb2lkLmN0cy5lcGhlbWVyYWxhcHAxIikKICAgICAgICAgICAgICAgICAuc2V0Q29tcG9uZW50TmFtZSgiRXBoZW1lcmFsU2VydmljZSIpCiAgICAgICAgICAgICAgICAgLnNldE1ldGhvZE5hbWUoIm9uU3RhcnRDb21tYW5kIikKKyAgICAgICAgICAgICAgICAuc2V0SW50ZW50KGludGVudCkKICAgICAgICAgICAgICAgICAuc2V0U3RhdHVzKCJQQVNTIikKICAgICAgICAgICAgICAgICAuYnVpbGQoKQogICAgICAgICAgICAgICAgIC5icm9hZGNhc3QodGhpcyk7CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9FcGhlbWVyYWxUZXN0QXBwL0VwaGVtZXJhbEFwcDEvc3JjL2NvbS9hbmRyb2lkL2N0cy9lcGhlbWVyYWxhcHAxL1NlYXJjaFN1Z2dlc3Rpb25Qcm92aWRlci5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRXBoZW1lcmFsVGVzdEFwcC9FcGhlbWVyYWxBcHAxL3NyYy9jb20vYW5kcm9pZC9jdHMvZXBoZW1lcmFsYXBwMS9TZWFyY2hTdWdnZXN0aW9uUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGRkODM2Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRXBoZW1lcmFsVGVzdEFwcC9FcGhlbWVyYWxBcHAxL3NyYy9jb20vYW5kcm9pZC9jdHMvZXBoZW1lcmFsYXBwMS9TZWFyY2hTdWdnZXN0aW9uUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5jdHMuZXBoZW1lcmFsYXBwMTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5TZWFyY2hSZWNlbnRTdWdnZXN0aW9uc1Byb3ZpZGVyOworCitwdWJsaWMgY2xhc3MgU2VhcmNoU3VnZ2VzdGlvblByb3ZpZGVyIGV4dGVuZHMgU2VhcmNoUmVjZW50U3VnZ2VzdGlvbnNQcm92aWRlciB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUSE9SSVRZID0gImNvbS5hbmRyb2lkLmN0cy5lcGhlbWVyYWxhcHAxLlNlYXJjaCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERSA9IERBVEFCQVNFX01PREVfUVVFUklFUzsKKworICAgIHB1YmxpYyBTZWFyY2hTdWdnZXN0aW9uUHJvdmlkZXIoKSB7CisgICAgICAgIHNldHVwU3VnZ2VzdGlvbnMoQVVUSE9SSVRZLCBNT0RFKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9FcGhlbWVyYWxUZXN0QXBwL0VwaGVtZXJhbEFwcDEvc3JjL2NvbS9hbmRyb2lkL2N0cy9lcGhlbWVyYWxhcHAxL1NvbWVTZXJ2aWNlLmphdmEgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9FcGhlbWVyYWxUZXN0QXBwL0VwaGVtZXJhbEFwcDEvc3JjL2NvbS9hbmRyb2lkL2N0cy9lcGhlbWVyYWxhcHAxL1NvbWVTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE2MDY3YQotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0VwaGVtZXJhbFRlc3RBcHAvRXBoZW1lcmFsQXBwMS9zcmMvY29tL2FuZHJvaWQvY3RzL2VwaGVtZXJhbGFwcDEvU29tZVNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5jdHMuZXBoZW1lcmFsYXBwMTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5TZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworCitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkludENvbnN1bWVyOworCitwdWJsaWMgY2xhc3MgU29tZVNlcnZpY2UgZXh0ZW5kcyBTZXJ2aWNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBJbnRDb25zdW1lciBzQ2FsbGJhY2s7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0T25TdGFydENvbW1hbmRDYWxsYmFjayhJbnRDb25zdW1lciBjYWxsYmFjaykgeworICAgICAgICBzQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSUJpbmRlciBvbkJpbmQoSW50ZW50IGludGVudCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IG9uU3RhcnRDb21tYW5kKEludGVudCBpbnRlbnQsIGludCBmbGFncywgaW50IHN0YXJ0SWQpIHsKKyAgICAgICAgZmluYWwgTm90aWZpY2F0aW9uLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBOb3RpZmljYXRpb24uQnVpbGRlcih0aGlzLCAiZm9vIikKKyAgICAgICAgICAgICAgICAuc2V0U21hbGxJY29uKGFuZHJvaWQuUi5kcmF3YWJsZS5zeW1fZGVmX2FwcF9pY29uKQorICAgICAgICAgICAgICAgIC5zZXRDb250ZW50VGl0bGUoImZvbyIpCisgICAgICAgICAgICAgICAgLnNldFdoZW4oU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpCisgICAgICAgICAgICAgICAgLnNldE9uZ29pbmcodHJ1ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdGFydEZvcmVncm91bmQoMSwgYnVpbGRlci5idWlsZCgpKTsKKyAgICAgICAgICAgIHN0b3BTZWxmKHN0YXJ0SWQpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgc0NhbGxiYWNrLmFjY2VwdCgwKTsKKyAgICAgICAgICAgIHJldHVybiBTVEFSVF9OT1RfU1RJQ0tZOworICAgICAgICB9CisgICAgICAgIHNDYWxsYmFjay5hY2NlcHQoMSk7CisgICAgICAgIHJldHVybiBTVEFSVF9OT1RfU1RJQ0tZOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0VwaGVtZXJhbFRlc3RBcHAvRXBoZW1lcmFsQXBwMi9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRXBoZW1lcmFsVGVzdEFwcC9FcGhlbWVyYWxBcHAyL0FuZHJvaWQubWsKaW5kZXggNGYwZWU2Yy4uNTM1ZDY3YyAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRXBoZW1lcmFsVGVzdEFwcC9FcGhlbWVyYWxBcHAyL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRXBoZW1lcmFsVGVzdEFwcC9FcGhlbWVyYWxBcHAyL0FuZHJvaWQubWsKQEAgLTE3LDE1ICsxNywyMiBAQAogTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIuc3R1YnMgYW5kcm9pZC50ZXN0LmJhc2Uuc3R1YnMKIExPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC1zdXBwb3J0LXRlc3QKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCisgICAgY3RzLWFpYS11dGlsIFwKKyAgICBhbmRyb2lkeC50ZXN0LnJ1bGVzIFwKKyAgICBjdHNkZXZpY2V1dGlsbGVnYWN5LWF4dCBcCisgICAgY3RzdGVzdHJ1bm5lci1heHQKIAogIyB0YWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAogTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKIAorTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogTE9DQUxfUkVTT1VSQ0VfRElSIDo9ICQoTE9DQUxfUEFUSCkvcmVzCiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNFcGhlbWVyYWxUZXN0c0VwaGVtZXJhbEFwcDIKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKIAogTE9DQUxfUFJPR1VBUkRfRU5BQkxFRCA6PSBkaXNhYmxlZAogTE9DQUxfREVYX1BSRU9QVCA6PSBmYWxzZQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRXBoZW1lcmFsVGVzdEFwcC9FcGhlbWVyYWxBcHAyL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9FcGhlbWVyYWxUZXN0QXBwL0VwaGVtZXJhbEFwcDIvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA3OGMyODJiLi40ZTgzYzM0IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9FcGhlbWVyYWxUZXN0QXBwL0VwaGVtZXJhbEFwcDIvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9FcGhlbWVyYWxUZXN0QXBwL0VwaGVtZXJhbEFwcDIvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtNDMsNyArNDMsMjIgQEAKICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuY3RzLmVwaGVtZXJhbHRlc3QuU1RBUlRfRVBIRU1FUkFMIiAvPgogICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkRFRkFVTFQiIC8+CiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlciBhbmRyb2lkOnByaW9yaXR5PSIwIj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuY3RzLmVwaGVtZXJhbHRlc3QuU1RBUlRfT1RIRVJfRVBIRU1FUkFMIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkRFRkFVTFQiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlNFQVJDSCIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJkZWZhdWx0LXVybCIKKyAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp2YWx1ZT0iaHR0cHM6Ly9lcGhlbWVyYWxhcHAyLmN0cy5hbmRyb2lkLmNvbS9zZWFyY2giIC8+CisgICAgICAgICAgICA8bWV0YS1kYXRhCisgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hcHAuc2VhcmNoYWJsZSIKKyAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpyZXNvdXJjZT0iQHhtbC9zZWFyY2hhYmxlIiAvPgogICAgICAgICA8L2FjdGl2aXR5PgorICAgICAgICA8cHJvdmlkZXIgYW5kcm9pZDpuYW1lPSIuU2VhcmNoU3VnZ2VzdGlvblByb3ZpZGVyIgorICAgICAgICAgICAgYW5kcm9pZDphdXRob3JpdGllcz0iY29tLmFuZHJvaWQuY3RzLmVwaGVtZXJhbGFwcDIuU2VhcmNoIiAvPgorCiAKICAgICAgICAgPCEtLSBUaGlzIHNob3VsZCBzdGlsbCBub3QgYmUgdmlzaWJsZSB0byBvdGhlciBJbnN0YW50IEFwcHMgLS0+CiAgICAgICAgIDxhY3Rpdml0eQpAQCAtNjMsNiArNzgsNiBAQAogICAgIDwvYXBwbGljYXRpb24+CiAKICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmFuZHJvaWQuY3RzLmVwaGVtZXJhbGFwcDIiIC8+CiA8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRXBoZW1lcmFsVGVzdEFwcC9FcGhlbWVyYWxBcHAyL3Jlcy94bWwvc2VhcmNoYWJsZS54bWwgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9FcGhlbWVyYWxUZXN0QXBwL0VwaGVtZXJhbEFwcDIvcmVzL3htbC9zZWFyY2hhYmxlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2ExMGZiCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRXBoZW1lcmFsVGVzdEFwcC9FcGhlbWVyYWxBcHAyL3Jlcy94bWwvc2VhcmNoYWJsZS54bWwKQEAgLTAsMCArMSwyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlYXJjaGFibGUgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYXBwX25hbWUiCisgICAgYW5kcm9pZDpzZWFyY2hTdWdnZXN0QXV0aG9yaXR5PSJjb20uYW5kcm9pZC5jdHMuZXBoZW1lcmFsYXBwMi5TZWFyY2giCisgICAgYW5kcm9pZDpzZWFyY2hTdWdnZXN0U2VsZWN0aW9uPSIgPyIgPgorPC9zZWFyY2hhYmxlPgorCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9FcGhlbWVyYWxUZXN0QXBwL0VwaGVtZXJhbEFwcDIvc3JjL2NvbS9hbmRyb2lkL2N0cy9lcGhlbWVyYWxhcHAyL0VwaGVtZXJhbEFjdGl2aXR5LmphdmEgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9FcGhlbWVyYWxUZXN0QXBwL0VwaGVtZXJhbEFwcDIvc3JjL2NvbS9hbmRyb2lkL2N0cy9lcGhlbWVyYWxhcHAyL0VwaGVtZXJhbEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg1YmMxOQotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0VwaGVtZXJhbFRlc3RBcHAvRXBoZW1lcmFsQXBwMi9zcmMvY29tL2FuZHJvaWQvY3RzL2VwaGVtZXJhbGFwcDIvRXBoZW1lcmFsQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5jdHMuZXBoZW1lcmFsYXBwMjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuYXBwLlNlYXJjaE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZUluZm87CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlJlc29sdmVJbmZvOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2VhcmNoUmVjZW50U3VnZ2VzdGlvbnM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy51dGlsLlRlc3RSZXN1bHQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIEVwaGVtZXJhbEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgZmluYWwgSW50ZW50IGludGVudCAgPSBnZXRJbnRlbnQoKTsKKyAgICAgICAgaWYgKEludGVudC5BQ1RJT05fU0VBUkNILmVxdWFscyhpbnRlbnQuZ2V0QWN0aW9uKCkpKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcXVlcnkgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoU2VhcmNoTWFuYWdlci5RVUVSWSk7CisgICAgICAgICAgICBmaW5hbCBTZWFyY2hSZWNlbnRTdWdnZXN0aW9ucyBzdWdnZXN0aW9ucyA9IG5ldyBTZWFyY2hSZWNlbnRTdWdnZXN0aW9ucyh0aGlzLAorICAgICAgICAgICAgICAgICAgICBTZWFyY2hTdWdnZXN0aW9uUHJvdmlkZXIuQVVUSE9SSVRZLCBTZWFyY2hTdWdnZXN0aW9uUHJvdmlkZXIuTU9ERSk7CisgICAgICAgICAgICBzdWdnZXN0aW9ucy5zYXZlUmVjZW50UXVlcnkocXVlcnksIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgVGVzdFJlc3VsdC5nZXRCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0UGFja2FnZU5hbWUoImNvbS5hbmRyb2lkLmN0cy5lcGhlbWVyYWxhcHAyIikKKyAgICAgICAgICAgICAgICAuc2V0Q29tcG9uZW50TmFtZSgiRXBoZW1lcmFsQWN0aXZpdHkiKQorICAgICAgICAgICAgICAgIC5zZXRJbnRlbnQoZ2V0SW50ZW50KCkpCisgICAgICAgICAgICAgICAgLnNldFN0YXR1cygiUEFTUyIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkKKyAgICAgICAgICAgICAgICAuc3RhcnRBY3Rpdml0eSh0aGlzLCBVcmkucGFyc2UoImh0dHBzOi8vY3RzLmdvb2dsZS5jb20vcmVzdWx0IikpOworICAgICAgICBmaW5pc2goKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9FcGhlbWVyYWxUZXN0QXBwL0VwaGVtZXJhbEFwcDIvc3JjL2NvbS9hbmRyb2lkL2N0cy9lcGhlbWVyYWxhcHAyL0VwaGVtZXJhbFByb3ZpZGVyLmphdmEgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9FcGhlbWVyYWxUZXN0QXBwL0VwaGVtZXJhbEFwcDIvc3JjL2NvbS9hbmRyb2lkL2N0cy9lcGhlbWVyYWxhcHAyL0VwaGVtZXJhbFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA2NjRmZQotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0VwaGVtZXJhbFRlc3RBcHAvRXBoZW1lcmFsQXBwMi9zcmMvY29tL2FuZHJvaWQvY3RzL2VwaGVtZXJhbGFwcDIvRXBoZW1lcmFsUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5jdHMuZXBoZW1lcmFsYXBwMjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuVXJpTWF0Y2hlcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkNoYXJBcnJheUJ1ZmZlcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkNvbnRlbnRPYnNlcnZlcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFTZXRPYnNlcnZlcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLk1hdHJpeEN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CisKK3B1YmxpYyBjbGFzcyBFcGhlbWVyYWxQcm92aWRlciBleHRlbmRzIENvbnRlbnRQcm92aWRlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVXJpTWF0Y2hlciBzVXJpTWF0Y2hlciA9IG5ldyBVcmlNYXRjaGVyKFVyaU1hdGNoZXIuTk9fTUFUQ0gpOworICAgIHN0YXRpYyB7CisgICAgICAgIHNVcmlNYXRjaGVyLmFkZFVSSSgiY29tLmFuZHJvaWQuY3RzLmVwaGVtZXJhbGFwcDIucHJvdmlkZXIiLCAidGFibGUiLCAxKTsKKyAgICB9CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gc0NvbHVtbk5hbWVzID0geyAiX0lEIiwgIm5hbWUiIH07CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWF0cml4Q3Vyc29yIHNDdXJzb3IgPSBuZXcgTWF0cml4Q3Vyc29yKHNDb2x1bW5OYW1lcywgMSk7CisgICAgc3RhdGljIHsKKyAgICAgICAgc0N1cnNvci5uZXdSb3coKS5hZGQoMSkuYWRkKCJJbnN0YW50QXBwUHJvdmlkZXIiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEN1cnNvciBxdWVyeShVcmkgdXJpLCBTdHJpbmdbXSBwcm9qZWN0aW9uLCBTdHJpbmcgc2VsZWN0aW9uLCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzLAorICAgICAgICAgICAgU3RyaW5nIHNvcnRPcmRlcikgeworICAgICAgICByZXR1cm4gKHNVcmlNYXRjaGVyLm1hdGNoKHVyaSkgIT0gMSkgPyBudWxsIDogc0N1cnNvcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoVXJpIHVyaSkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVXJpIGluc2VydChVcmkgdXJpLCBDb250ZW50VmFsdWVzIHZhbHVlcykgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGRlbGV0ZShVcmkgdXJpLCBTdHJpbmcgc2VsZWN0aW9uLCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgdXBkYXRlKFVyaSB1cmksIENvbnRlbnRWYWx1ZXMgdmFsdWVzLCBTdHJpbmcgc2VsZWN0aW9uLCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRXBoZW1lcmFsVGVzdEFwcC9FcGhlbWVyYWxBcHAyL3NyYy9jb20vYW5kcm9pZC9jdHMvZXBoZW1lcmFsYXBwMi9TZWFyY2hTdWdnZXN0aW9uUHJvdmlkZXIuamF2YSBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0VwaGVtZXJhbFRlc3RBcHAvRXBoZW1lcmFsQXBwMi9zcmMvY29tL2FuZHJvaWQvY3RzL2VwaGVtZXJhbGFwcDIvU2VhcmNoU3VnZ2VzdGlvblByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZiZTEyOAotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0VwaGVtZXJhbFRlc3RBcHAvRXBoZW1lcmFsQXBwMi9zcmMvY29tL2FuZHJvaWQvY3RzL2VwaGVtZXJhbGFwcDIvU2VhcmNoU3VnZ2VzdGlvblByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY3RzLmVwaGVtZXJhbGFwcDI7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2VhcmNoUmVjZW50U3VnZ2VzdGlvbnNQcm92aWRlcjsKKworcHVibGljIGNsYXNzIFNlYXJjaFN1Z2dlc3Rpb25Qcm92aWRlciBleHRlbmRzIFNlYXJjaFJlY2VudFN1Z2dlc3Rpb25zUHJvdmlkZXIgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVEhPUklUWSA9ICJjb20uYW5kcm9pZC5jdHMuZXBoZW1lcmFsYXBwMi5TZWFyY2giOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREUgPSBEQVRBQkFTRV9NT0RFX1FVRVJJRVM7CisKKyAgICBwdWJsaWMgU2VhcmNoU3VnZ2VzdGlvblByb3ZpZGVyKCkgeworICAgICAgICBzZXR1cFN1Z2dlc3Rpb25zKEFVVEhPUklUWSwgTU9ERSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRXBoZW1lcmFsVGVzdEFwcC9JbXBsaWNpdGx5RXhwb3NlZEFwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRXBoZW1lcmFsVGVzdEFwcC9JbXBsaWNpdGx5RXhwb3NlZEFwcC9BbmRyb2lkLm1rCmluZGV4IDMxYTQ1YjAuLjg1MDAwNzcgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0VwaGVtZXJhbFRlc3RBcHAvSW1wbGljaXRseUV4cG9zZWRBcHAvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9FcGhlbWVyYWxUZXN0QXBwL0ltcGxpY2l0bHlFeHBvc2VkQXBwL0FuZHJvaWQubWsKQEAgLTIwLDggKzIwLDcgQEAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCiBMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAogICAgIGN0cy1haWEtdXRpbCBcCi0gICAgYW5kcm9pZC1zdXBwb3J0LXRlc3QgXAotICAgIGxlZ2FjeS1hbmRyb2lkLXRlc3QKKyAgICBhbmRyb2lkeC50ZXN0LnJ1bGVzCiAKICMgdGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKIExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCkBAIC0zMCw2ICsyOSw3IEBACiBMT0NBTF9SRVNPVVJDRV9ESVIgOj0gJChMT0NBTF9QQVRIKS9yZXMKIAogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0VwaGVtZXJhbFRlc3RzSW1wbGljaXRBcHAKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKIAogTE9DQUxfUFJPR1VBUkRfRU5BQkxFRCA6PSBkaXNhYmxlZAogTE9DQUxfREVYX1BSRU9QVCA6PSBmYWxzZQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRXBoZW1lcmFsVGVzdEFwcC9JbXBsaWNpdGx5RXhwb3NlZEFwcC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRXBoZW1lcmFsVGVzdEFwcC9JbXBsaWNpdGx5RXhwb3NlZEFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGYyMDJhMGEuLmQ5MTM2ZDUgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0VwaGVtZXJhbFRlc3RBcHAvSW1wbGljaXRseUV4cG9zZWRBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9FcGhlbWVyYWxUZXN0QXBwL0ltcGxpY2l0bHlFeHBvc2VkQXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTM4LDYgKzM4LDYgQEAKICAgICA8L2FwcGxpY2F0aW9uPgogCiAgICAgPGluc3RydW1lbnRhdGlvbgotICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5hbmRyb2lkLmN0cy5pbXBsaWNpdGFwcCIgLz4KIDwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9FcGhlbWVyYWxUZXN0QXBwL05vcm1hbEFwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRXBoZW1lcmFsVGVzdEFwcC9Ob3JtYWxBcHAvQW5kcm9pZC5tawppbmRleCA0M2RlYjgyLi4zZTQxYzFiIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9FcGhlbWVyYWxUZXN0QXBwL05vcm1hbEFwcC9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0VwaGVtZXJhbFRlc3RBcHAvTm9ybWFsQXBwL0FuZHJvaWQubWsKQEAgLTIwLDggKzIwLDkgQEAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCiBMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAogICAgIGN0cy1haWEtdXRpbCBcCi0gICAgYW5kcm9pZC1zdXBwb3J0LXRlc3QgXAotICAgIGxlZ2FjeS1hbmRyb2lkLXRlc3QKKyAgICBhbmRyb2lkeC50ZXN0LnJ1bGVzCisKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCiAKICMgdGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKIExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCkBAIC0zMCw2ICszMSw3IEBACiBMT0NBTF9SRVNPVVJDRV9ESVIgOj0gJChMT0NBTF9QQVRIKS9yZXMKIAogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0VwaGVtZXJhbFRlc3RzTm9ybWFsQXBwCitMT0NBTF9TREtfVkVSU0lPTiA6PSBzeXN0ZW1fY3VycmVudAogCiBMT0NBTF9QUk9HVUFSRF9FTkFCTEVEIDo9IGRpc2FibGVkCiBMT0NBTF9ERVhfUFJFT1BUIDo9IGZhbHNlCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9FcGhlbWVyYWxUZXN0QXBwL05vcm1hbEFwcC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRXBoZW1lcmFsVGVzdEFwcC9Ob3JtYWxBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA0YzI3ZGJhLi5lNTc3MjYwIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9FcGhlbWVyYWxUZXN0QXBwL05vcm1hbEFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0VwaGVtZXJhbFRlc3RBcHAvTm9ybWFsQXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTE5LDYgKzE5LDcgQEAKICAgICA8dXNlcy1zZGsKICAgICAgICAgYW5kcm9pZDptaW5TZGtWZXJzaW9uPSIyNCIgLz4KIAorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uV1JJVEVfU0VDVVJFX1NFVFRJTkdTIi8+CiAgICAgPGFwcGxpY2F0aW9uCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYXBwX25hbWUiPgogICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KQEAgLTM1LDYgKzM2LDE0IEBACiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLmN0cy5lcGhlbWVyYWx0ZXN0LlNUQVJUX05PUk1BTCIgLz4KICAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5ERUZBVUxUIiAvPgogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5TRUFSQ0giIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0iZGVmYXVsdC11cmwiCisgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmFsdWU9Imh0dHBzOi8vbm9ybWFsYXBwLmN0cy5hbmRyb2lkLmNvbS9zZWFyY2giIC8+CisgICAgICAgICAgICA8bWV0YS1kYXRhCisgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hcHAuc2VhcmNoYWJsZSIKKyAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpyZXNvdXJjZT0iQHhtbC9zZWFyY2hhYmxlIiAvPgogICAgICAgICA8L2FjdGl2aXR5PgogICAgICAgICA8YWN0aXZpdHkKICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iLk5vcm1hbFdlYkFjdGl2aXR5IgpAQCAtNjMsNyArNzIsMTcgQEAKICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuY3RzLmVwaGVtZXJhbHRlc3QuU1RBUlRfRVhQT1NFRCIgLz4KICAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5ERUZBVUxUIiAvPgogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5TRUFSQ0giIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0iZGVmYXVsdC11cmwiCisgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmFsdWU9Imh0dHBzOi8vbm9ybWFsYXBwLmN0cy5hbmRyb2lkLmNvbS9zZWFyY2giIC8+CisgICAgICAgICAgICA8bWV0YS1kYXRhCisgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hcHAuc2VhcmNoYWJsZSIKKyAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpyZXNvdXJjZT0iQHhtbC9zZWFyY2hhYmxlIiAvPgogICAgICAgICA8L2FjdGl2aXR5PgorICAgICAgICA8cHJvdmlkZXIgYW5kcm9pZDpuYW1lPSIuU2VhcmNoU3VnZ2VzdGlvblByb3ZpZGVyIgorICAgICAgICAgICAgYW5kcm9pZDphdXRob3JpdGllcz0iY29tLmFuZHJvaWQuY3RzLm5vcm1hbGFwcC5TZWFyY2giIC8+CiAKICAgICAgICAgPHNlcnZpY2UKICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iLk5vcm1hbFNlcnZpY2UiPgpAQCAtMTEzLDYgKzEzMiw2IEBACiAgICAgPC9hcHBsaWNhdGlvbj4KIAogICAgIDxpbnN0cnVtZW50YXRpb24KLSAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5jdHMubm9ybWFsYXBwIiAvPgogPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0VwaGVtZXJhbFRlc3RBcHAvTm9ybWFsQXBwL3Jlcy94bWwvc2VhcmNoYWJsZS54bWwgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9FcGhlbWVyYWxUZXN0QXBwL05vcm1hbEFwcC9yZXMveG1sL3NlYXJjaGFibGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZWMyZjAKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9FcGhlbWVyYWxUZXN0QXBwL05vcm1hbEFwcC9yZXMveG1sL3NlYXJjaGFibGUueG1sCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWFyY2hhYmxlIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2FwcF9uYW1lIgorICAgIGFuZHJvaWQ6c2VhcmNoU3VnZ2VzdEF1dGhvcml0eT0iY29tLmFuZHJvaWQuY3RzLm5vcm1hbGFwcC5TZWFyY2giCisgICAgYW5kcm9pZDpzZWFyY2hTdWdnZXN0U2VsZWN0aW9uPSIgPyIgPgorPC9zZWFyY2hhYmxlPgorCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9FcGhlbWVyYWxUZXN0QXBwL05vcm1hbEFwcC9zcmMvY29tL2FuZHJvaWQvY3RzL25vcm1hbGFwcC9DbGllbnRUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9FcGhlbWVyYWxUZXN0QXBwL05vcm1hbEFwcC9zcmMvY29tL2FuZHJvaWQvY3RzL25vcm1hbGFwcC9DbGllbnRUZXN0LmphdmEKaW5kZXggY2Q1YWMwZS4uM2E5OWYzMjUgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0VwaGVtZXJhbFRlc3RBcHAvTm9ybWFsQXBwL3NyYy9jb20vYW5kcm9pZC9jdHMvbm9ybWFsYXBwL0NsaWVudFRlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9FcGhlbWVyYWxUZXN0QXBwL05vcm1hbEFwcC9zcmMvY29tL2FuZHJvaWQvY3RzL25vcm1hbGFwcC9DbGllbnRUZXN0LmphdmEKQEAgLTE2LDYgKzE2LDcgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5jdHMubm9ybWFsYXBwOwogCitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaGFzSXRlbXM7CiBpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CiBpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMubm90TnVsbFZhbHVlOwogaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLm51bGxWYWx1ZTsKQEAgLTI1LDE2ICsyNiwxNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5BY3Rpdml0eU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUmVzb2x2ZUluZm87CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwotaW1wb3J0IGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0Q2FzZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU2VjdXJlOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogCiBpbXBvcnQgY29tLmFuZHJvaWQuY3RzLnV0aWwuVGVzdFJlc3VsdDsKIApAQCAtMjkzLDcgKzI5NSw4IEBACiAgICAgcHVibGljIHZvaWQgdGVzdFN0YXJ0Tm9ybWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIHN0YXJ0IHRoZSBub3JtYWwgYWN0aXZpdHkKICAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSW50ZW50IHN0YXJ0Tm9ybWFsSW50ZW50ID0gbmV3IEludGVudChBQ1RJT05fU1RBUlRfTk9STUFMX0FDVElWSVRZKTsKKyAgICAgICAgICAgIGZpbmFsIEludGVudCBzdGFydE5vcm1hbEludGVudCA9IG5ldyBJbnRlbnQoQUNUSU9OX1NUQVJUX05PUk1BTF9BQ1RJVklUWSkKKyAgICAgICAgICAgICAgICAgICAgLnNldEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLKTsKICAgICAgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKS5zdGFydEFjdGl2aXR5KHN0YXJ0Tm9ybWFsSW50ZW50LCBudWxsIC8qb3B0aW9ucyovKTsKICAgICAgICAgICAgIGZpbmFsIFRlc3RSZXN1bHQgdGVzdFJlc3VsdCA9IGdldFJlc3VsdCgpOwogICAgICAgICAgICAgYXNzZXJ0VGhhdCh0ZXN0UmVzdWx0LmdldFBhY2thZ2VOYW1lKCksCkBAIC0zMDYsNyArMzA5LDggQEAKIAogICAgICAgICAvLyBzdGFydCB0aGUgbm9ybWFsIGFjdGl2aXR5OyBkaXJlY3RlZCBwYWNrYWdlCiAgICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIEludGVudCBzdGFydE5vcm1hbEludGVudCA9IG5ldyBJbnRlbnQoQUNUSU9OX1NUQVJUX05PUk1BTF9BQ1RJVklUWSk7CisgICAgICAgICAgICBmaW5hbCBJbnRlbnQgc3RhcnROb3JtYWxJbnRlbnQgPSBuZXcgSW50ZW50KEFDVElPTl9TVEFSVF9OT1JNQUxfQUNUSVZJVFkpCisgICAgICAgICAgICAgICAgICAgIC5zZXRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7CiAgICAgICAgICAgICBzdGFydE5vcm1hbEludGVudC5zZXRQYWNrYWdlKCJjb20uYW5kcm9pZC5jdHMubm9ybWFsYXBwIik7CiAgICAgICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCkuc3RhcnRBY3Rpdml0eShzdGFydE5vcm1hbEludGVudCwgbnVsbCAvKm9wdGlvbnMqLyk7CiAgICAgICAgICAgICBmaW5hbCBUZXN0UmVzdWx0IHRlc3RSZXN1bHQgPSBnZXRSZXN1bHQoKTsKQEAgLTMyMCw3ICszMjQsOCBAQAogCiAgICAgICAgIC8vIHN0YXJ0IHRoZSBub3JtYWwgYWN0aXZpdHk7IGRpcmVjdGVkIGNvbXBvbmVudAogICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBJbnRlbnQgc3RhcnROb3JtYWxJbnRlbnQgPSBuZXcgSW50ZW50KEFDVElPTl9TVEFSVF9OT1JNQUxfQUNUSVZJVFkpOworICAgICAgICAgICAgZmluYWwgSW50ZW50IHN0YXJ0Tm9ybWFsSW50ZW50ID0gbmV3IEludGVudChBQ1RJT05fU1RBUlRfTk9STUFMX0FDVElWSVRZKQorICAgICAgICAgICAgICAgICAgICAuc2V0RmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOwogICAgICAgICAgICAgc3RhcnROb3JtYWxJbnRlbnQuc2V0Q29tcG9uZW50KG5ldyBDb21wb25lbnROYW1lKAogICAgICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuY3RzLm5vcm1hbGFwcCIsICJjb20uYW5kcm9pZC5jdHMubm9ybWFsYXBwLk5vcm1hbEFjdGl2aXR5IikpOwogICAgICAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpLnN0YXJ0QWN0aXZpdHkoc3RhcnROb3JtYWxJbnRlbnQsIG51bGwgLypvcHRpb25zKi8pOwpAQCAtMzU0LDkgKzM1OSwxMCBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhcnRFcGhlbWVyYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gc3RhcnQgdGhlIGVwaGVtZXJhbCBhY3Rpdml0eQorICAgICAgICAvLyBzdGFydCB0aGUgZXBoZW1lcmFsIGFjdGl2aXR5OyBubyBFWFRFUk5BTCBmbGFnCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaW5hbCBJbnRlbnQgc3RhcnRFcGhlbWVyYWxJbnRlbnQgPSBuZXcgSW50ZW50KEFDVElPTl9TVEFSVF9FUEhFTUVSQUxfQUNUSVZJVFkpOworICAgICAgICAgICAgZmluYWwgSW50ZW50IHN0YXJ0RXBoZW1lcmFsSW50ZW50ID0gbmV3IEludGVudChBQ1RJT05fU1RBUlRfRVBIRU1FUkFMX0FDVElWSVRZKQorICAgICAgICAgICAgICAgICAgICAuc2V0RmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOwogICAgICAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpLnN0YXJ0QWN0aXZpdHkoCiAgICAgICAgICAgICAgICAgICAgIHN0YXJ0RXBoZW1lcmFsSW50ZW50LCBudWxsIC8qb3B0aW9ucyovKTsKICAgICAgICAgICAgIGZpbmFsIFRlc3RSZXN1bHQgdGVzdFJlc3VsdCA9IGdldFJlc3VsdCgpOwpAQCAtMzY0LDkgKzM3MCwyMiBAQAogICAgICAgICB9IGNhdGNoIChBY3Rpdml0eU5vdEZvdW5kRXhjZXB0aW9uIGV4cGVjdGVkKSB7CiAgICAgICAgIH0KIAotICAgICAgICAvLyBzdGFydCB0aGUgZXBoZW1lcmFsIGFjdGl2aXR5OyBkaXJlY3RlZCBwYWNrYWdlCisgICAgICAgIC8vIHN0YXJ0IHRoZSBlcGhlbWVyYWwgYWN0aXZpdHk7IEVYVEVSTkFMIGZsYWcKKyAgICAgICAgeworICAgICAgICAgICAgZmluYWwgSW50ZW50IHN0YXJ0RXBoZW1lcmFsSW50ZW50ID0gbmV3IEludGVudChBQ1RJT05fU1RBUlRfRVBIRU1FUkFMX0FDVElWSVRZKQorICAgICAgICAgICAgICAgICAgICAuc2V0RmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0sgfCBJbnRlbnQuRkxBR19BQ1RJVklUWV9NQVRDSF9FWFRFUk5BTCk7CisgICAgICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCkuc3RhcnRBY3Rpdml0eSgKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRFcGhlbWVyYWxJbnRlbnQsIG51bGwgLypvcHRpb25zKi8pOworICAgICAgICAgICAgZmluYWwgVGVzdFJlc3VsdCB0ZXN0UmVzdWx0ID0gZ2V0UmVzdWx0KCk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KCJjb20uYW5kcm9pZC5jdHMuZXBoZW1lcmFsYXBwMSIsIGlzKHRlc3RSZXN1bHQuZ2V0UGFja2FnZU5hbWUoKSkpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChBQ1RJT05fU1RBUlRfRVBIRU1FUkFMX0FDVElWSVRZLCBpcyh0ZXN0UmVzdWx0LmdldEludGVudCgpLmdldEFjdGlvbigpKSk7CisgICAgICAgIH0KKworCisgICAgICAgIC8vIHN0YXJ0IHRoZSBlcGhlbWVyYWwgYWN0aXZpdHk7IGRpcmVjdGVkIHBhY2thZ2UsIG5vIEVYVEVSTkFMIGZsYWcKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpbmFsIEludGVudCBzdGFydEVwaGVtZXJhbEludGVudCA9IG5ldyBJbnRlbnQoQUNUSU9OX1NUQVJUX0VQSEVNRVJBTF9BQ1RJVklUWSk7CisgICAgICAgICAgICBmaW5hbCBJbnRlbnQgc3RhcnRFcGhlbWVyYWxJbnRlbnQgPSBuZXcgSW50ZW50KEFDVElPTl9TVEFSVF9FUEhFTUVSQUxfQUNUSVZJVFkpCisgICAgICAgICAgICAgICAgICAgIC5zZXRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7CiAgICAgICAgICAgICBzdGFydEVwaGVtZXJhbEludGVudC5zZXRQYWNrYWdlKCJjb20uYW5kcm9pZC5jdHMuZXBoZW1lcmFsYXBwMSIpOwogICAgICAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpLnN0YXJ0QWN0aXZpdHkoCiAgICAgICAgICAgICAgICAgICAgIHN0YXJ0RXBoZW1lcmFsSW50ZW50LCBudWxsIC8qb3B0aW9ucyovKTsKQEAgLTM3NSw5ICszOTQsMjIgQEAKICAgICAgICAgfSBjYXRjaCAoQWN0aXZpdHlOb3RGb3VuZEV4Y2VwdGlvbiBleHBlY3RlZCkgewogICAgICAgICB9CiAKKyAgICAgICAgLy8gc3RhcnQgdGhlIGVwaGVtZXJhbCBhY3Rpdml0eTsgZGlyZWN0ZWQgcGFja2FnZSwgaW5jbHVkZXMgRVhURVJOQUwgZmxhZworICAgICAgICB7CisgICAgICAgICAgICBmaW5hbCBJbnRlbnQgc3RhcnRFcGhlbWVyYWxJbnRlbnQgPSBuZXcgSW50ZW50KEFDVElPTl9TVEFSVF9FUEhFTUVSQUxfQUNUSVZJVFkpCisgICAgICAgICAgICAgICAgICAgIC5zZXRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyB8IEludGVudC5GTEFHX0FDVElWSVRZX01BVENIX0VYVEVSTkFMKTsKKyAgICAgICAgICAgIHN0YXJ0RXBoZW1lcmFsSW50ZW50LnNldFBhY2thZ2UoImNvbS5hbmRyb2lkLmN0cy5lcGhlbWVyYWxhcHAxIik7CisgICAgICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCkuc3RhcnRBY3Rpdml0eSgKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRFcGhlbWVyYWxJbnRlbnQsIG51bGwgLypvcHRpb25zKi8pOworICAgICAgICAgICAgZmluYWwgVGVzdFJlc3VsdCB0ZXN0UmVzdWx0ID0gZ2V0UmVzdWx0KCk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KCJjb20uYW5kcm9pZC5jdHMuZXBoZW1lcmFsYXBwMSIsIGlzKHRlc3RSZXN1bHQuZ2V0UGFja2FnZU5hbWUoKSkpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChBQ1RJT05fU1RBUlRfRVBIRU1FUkFMX0FDVElWSVRZLCBpcyh0ZXN0UmVzdWx0LmdldEludGVudCgpLmdldEFjdGlvbigpKSk7CisgICAgICAgIH0KKwogICAgICAgICAvLyBzdGFydCB0aGUgZXBoZW1lcmFsIGFjdGl2aXR5OyBkaXJlY3RlZCBjb21wb25lbnQKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpbmFsIEludGVudCBzdGFydEVwaGVtZXJhbEludGVudCA9IG5ldyBJbnRlbnQoQUNUSU9OX1NUQVJUX0VQSEVNRVJBTF9BQ1RJVklUWSk7CisgICAgICAgICAgICBmaW5hbCBJbnRlbnQgc3RhcnRFcGhlbWVyYWxJbnRlbnQgPSBuZXcgSW50ZW50KEFDVElPTl9TVEFSVF9FUEhFTUVSQUxfQUNUSVZJVFkpCisgICAgICAgICAgICAgICAgICAgIC5zZXRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7CiAgICAgICAgICAgICBzdGFydEVwaGVtZXJhbEludGVudC5zZXRDb21wb25lbnQoCiAgICAgICAgICAgICAgICAgICAgIG5ldyBDb21wb25lbnROYW1lKCJjb20uYW5kcm9pZC5jdHMuZXBoZW1lcmFsYXBwMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmN0cy5lcGhlbWVyYWxhcHAxLkVwaGVtZXJhbEFjdGl2aXR5IikpOwpAQCAtMzkwLDcgKzQyMiw4IEBACiAKICAgICAgICAgLy8gc3RhcnQgdGhlIGVwaGVtZXJhbCBhY3Rpdml0eTsgdXNpbmcgVklFVy9CUk9XU0FCTEUKICAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSW50ZW50IHN0YXJ0Vmlld0ludGVudCA9IG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9WSUVXKTsKKyAgICAgICAgICAgIGZpbmFsIEludGVudCBzdGFydFZpZXdJbnRlbnQgPSBuZXcgSW50ZW50KEludGVudC5BQ1RJT05fVklFVykKKyAgICAgICAgICAgICAgICAgICAgLnNldEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLKTsKICAgICAgICAgICAgIHN0YXJ0Vmlld0ludGVudC5hZGRDYXRlZ29yeShJbnRlbnQuQ0FURUdPUllfQlJPV1NBQkxFKTsKICAgICAgICAgICAgIHN0YXJ0Vmlld0ludGVudC5zZXREYXRhKFVyaS5wYXJzZSgiaHR0cHM6Ly9jdHMuZ29vZ2xlLmNvbS9lcGhlbWVyYWwiKSk7CiAgICAgICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCkuc3RhcnRBY3Rpdml0eSgKQEAgLTM5OCwxMyArNDMxLDU1IEBACiAgICAgICAgICAgICBmaW5hbCBUZXN0UmVzdWx0IHRlc3RSZXN1bHQgPSBnZXRSZXN1bHQoKTsKICAgICAgICAgICAgIGFzc2VydFRoYXQoImNvbS5hbmRyb2lkLmN0cy5lcGhlbWVyYWxhcHAxIiwgaXModGVzdFJlc3VsdC5nZXRQYWNrYWdlTmFtZSgpKSk7CiAgICAgICAgICAgICBhc3NlcnRUaGF0KCJFcGhlbWVyYWxBY3Rpdml0eSIsIGlzKHRlc3RSZXN1bHQuZ2V0Q29tcG9uZW50TmFtZSgpKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KEludGVudC5BQ1RJT05fVklFVywgaXModGVzdFJlc3VsdC5nZXRJbnRlbnQoKS5nZXRBY3Rpb24oKSkpOworICAgICAgICAgICAgYXNzZXJ0VGhhdCh0ZXN0UmVzdWx0LmdldEludGVudCgpLmdldENhdGVnb3JpZXMoKSwgaGFzSXRlbXMoSW50ZW50LkNBVEVHT1JZX0JST1dTQUJMRSkpOworICAgICAgICAgICAgYXNzZXJ0VGhhdCgiaHR0cHM6Ly9jdHMuZ29vZ2xlLmNvbS9lcGhlbWVyYWwiLAorICAgICAgICAgICAgICAgICAgICBpcyh0ZXN0UmVzdWx0LmdldEludGVudCgpLmdldERhdGEoKS50b1N0cmluZygpKSk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBDb250ZW50UmVzb2x2ZXIgY29udGVudFJlc29sdmVyID0KKyAgICAgICAgICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCkuZ2V0Q29udGVudFJlc29sdmVyKCk7CisgICAgICAgIGZpbmFsIGludCBvcmlnaW5hbFNldHRpbmcgPSBTZWN1cmUuZ2V0SW50KGNvbnRlbnRSZXNvbHZlciwgU2VjdXJlLklOU1RBTlRfQVBQU19FTkFCTEVELCAxKTsKKyAgICAgICAgU2VjdXJlLnB1dEludChjb250ZW50UmVzb2x2ZXIsIFNlY3VyZS5JTlNUQU5UX0FQUFNfRU5BQkxFRCwgMCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIHN0YXJ0IHRoZSBlcGhlbWVyYWwgYWN0aXZpdHk7IHVzaW5nIFZJRVcvQlJPV1NBQkxFIHdpdGggc2V0dGluZyBkaXNhYmxlZAorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmaW5hbCBJbnRlbnQgc3RhcnRWaWV3SW50ZW50ID0gbmV3IEludGVudChJbnRlbnQuQUNUSU9OX1ZJRVcpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOworICAgICAgICAgICAgICAgIHN0YXJ0Vmlld0ludGVudC5hZGRDYXRlZ29yeShJbnRlbnQuQ0FURUdPUllfQlJPV1NBQkxFKTsKKyAgICAgICAgICAgICAgICBzdGFydFZpZXdJbnRlbnQuc2V0RGF0YShVcmkucGFyc2UoImh0dHBzOi8vY3RzLmdvb2dsZS5jb20vZXBoZW1lcmFsIikpOworICAgICAgICAgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKS5zdGFydEFjdGl2aXR5KAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRWaWV3SW50ZW50LCBudWxsIC8qb3B0aW9ucyovKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBUZXN0UmVzdWx0IHRlc3RSZXN1bHQgPSBnZXRSZXN1bHQoKTsKKyAgICAgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgICAgICB9IGNhdGNoIChUZXN0UmVzdWx0Tm90Rm91bmRFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgICAgICAgICAvLyB3ZSBzaG91bGRuJ3QgcmVzb2x2ZSB0byBvdXIgaW5zdGFudCBhcHAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gc3RhcnQgdGhlIGVwaGVtZXJhbCBhY3Rpdml0eTsgRVhURVJOQUwgZmxhZyB3aXRoIHNldHRpbmcgZGlzYWJsZWQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBJbnRlbnQgc3RhcnRFcGhlbWVyYWxJbnRlbnQgPSBuZXcgSW50ZW50KEFDVElPTl9TVEFSVF9FUEhFTUVSQUxfQUNUSVZJVFkpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBJbnRlbnQuRkxBR19BQ1RJVklUWV9NQVRDSF9FWFRFUk5BTCk7CisgICAgICAgICAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpLnN0YXJ0QWN0aXZpdHkoCisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydEVwaGVtZXJhbEludGVudCwgbnVsbCAvKm9wdGlvbnMqLyk7CisgICAgICAgICAgICAgICAgZmluYWwgVGVzdFJlc3VsdCB0ZXN0UmVzdWx0ID0gZ2V0UmVzdWx0KCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VGhhdCgiY29tLmFuZHJvaWQuY3RzLmVwaGVtZXJhbGFwcDEiLCBpcyh0ZXN0UmVzdWx0LmdldFBhY2thZ2VOYW1lKCkpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUaGF0KEFDVElPTl9TVEFSVF9FUEhFTUVSQUxfQUNUSVZJVFksIGlzKHRlc3RSZXN1bHQuZ2V0SW50ZW50KCkuZ2V0QWN0aW9uKCkpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgU2VjdXJlLnB1dEludChjb250ZW50UmVzb2x2ZXIsIFNlY3VyZS5JTlNUQU5UX0FQUFNfRU5BQkxFRCwgb3JpZ2luYWxTZXR0aW5nKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIGNvbm5lY3QgdG8gdGhlIGluc3RhbnQgYXBwIHByb3ZpZGVyCiAgICAgICAgIHsKICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcm92aWRlciA9ICJjb250ZW50Oi8vY29tLmFuZHJvaWQuY3RzLmVwaGVtZXJhbGFwcDEucHJvdmlkZXIvdGFibGUiOwotICAgICAgICAgICAgZmluYWwgQ3Vyc29yIHRlc3RDdXJzb3IgPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeQotICAgICAgICAgICAgICAgICAgICAuZ2V0Q29udGV4dCgpLmdldENvbnRlbnRSZXNvbHZlcigpLnF1ZXJ5KAorICAgICAgICAgICAgZmluYWwgQ3Vyc29yIHRlc3RDdXJzb3IgPSBjb250ZW50UmVzb2x2ZXIucXVlcnkoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXJpLnBhcnNlKHByb3ZpZGVyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsIC8qcHJvamVjdGlvbiovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgLypzZWxlY3Rpb24qLywKQEAgLTQyMiwxMSArNDk3LDE4IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKICAgICAgICAgfQogICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkFjdGl2aXR5IGRpZG4ndCByZWNlaXZlIGEgUmVzdWx0IGluIDUgc2Vjb25kcyIpOworICAgICAgICAgICAgdGhyb3cgbmV3IFRlc3RSZXN1bHROb3RGb3VuZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkFjdGl2aXR5IGRpZG4ndCByZWNlaXZlIGEgUmVzdWx0IGluIDUgc2Vjb25kcyIpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGVzdFJlc3VsdE5vdEZvdW5kRXhjZXB0aW9uIGV4dGVuZHMgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgcHVibGljIFRlc3RSZXN1bHROb3RGb3VuZEV4Y2VwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKKyAgICAgICAgICAgIHN1cGVyKGRlc2NyaXB0aW9uKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEFjdGl2aXR5QnJvYWRjYXN0UmVjZWl2ZXIgZXh0ZW5kcyBCcm9hZGNhc3RSZWNlaXZlciB7CiAgICAgICAgIHByaXZhdGUgZmluYWwgU3luY2hyb25vdXNRdWV1ZTxUZXN0UmVzdWx0PiBtUXVldWU7CiAgICAgICAgIHB1YmxpYyBBY3Rpdml0eUJyb2FkY2FzdFJlY2VpdmVyKFN5bmNocm9ub3VzUXVldWU8VGVzdFJlc3VsdD4gcXVldWUpIHsKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0VwaGVtZXJhbFRlc3RBcHAvTm9ybWFsQXBwL3NyYy9jb20vYW5kcm9pZC9jdHMvbm9ybWFsYXBwL05vcm1hbEFjdGl2aXR5LmphdmEgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9FcGhlbWVyYWxUZXN0QXBwL05vcm1hbEFwcC9zcmMvY29tL2FuZHJvaWQvY3RzL25vcm1hbGFwcC9Ob3JtYWxBY3Rpdml0eS5qYXZhCmluZGV4IDMzOGExYjQuLjg5NzNhZWEgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0VwaGVtZXJhbFRlc3RBcHAvTm9ybWFsQXBwL3NyYy9jb20vYW5kcm9pZC9jdHMvbm9ybWFsYXBwL05vcm1hbEFjdGl2aXR5LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRXBoZW1lcmFsVGVzdEFwcC9Ob3JtYWxBcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy9ub3JtYWxhcHAvTm9ybWFsQWN0aXZpdHkuamF2YQpAQCAtMTcsMTIgKzE3LDE0IEBACiBwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5ub3JtYWxhcHA7CiAKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5TZWFyY2hNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VJbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5SZXNvbHZlSW5mbzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuTmFtZU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNlYXJjaFJlY2VudFN1Z2dlc3Rpb25zOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5jdHMudXRpbC5UZXN0UmVzdWx0OwpAQCAtMzYsNiArMzgsMTQgQEAKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CiAKKyAgICAgICAgZmluYWwgSW50ZW50IGludGVudCAgPSBnZXRJbnRlbnQoKTsKKyAgICAgICAgaWYgKEludGVudC5BQ1RJT05fU0VBUkNILmVxdWFscyhpbnRlbnQuZ2V0QWN0aW9uKCkpKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcXVlcnkgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoU2VhcmNoTWFuYWdlci5RVUVSWSk7CisgICAgICAgICAgICBmaW5hbCBTZWFyY2hSZWNlbnRTdWdnZXN0aW9ucyBzdWdnZXN0aW9ucyA9IG5ldyBTZWFyY2hSZWNlbnRTdWdnZXN0aW9ucyh0aGlzLAorICAgICAgICAgICAgICAgICAgICBTZWFyY2hTdWdnZXN0aW9uUHJvdmlkZXIuQVVUSE9SSVRZLCBTZWFyY2hTdWdnZXN0aW9uUHJvdmlkZXIuTU9ERSk7CisgICAgICAgICAgICBzdWdnZXN0aW9ucy5zYXZlUmVjZW50UXVlcnkocXVlcnksIG51bGwpOworICAgICAgICB9CisKICAgICAgICAgYm9vbGVhbiBjYW5BY2Nlc3NJbnN0YW50QXBwID0gZmFsc2U7CiAgICAgICAgIFN0cmluZyBleGNlcHRpb24gPSBudWxsOwogICAgICAgICB0cnkgewpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRXBoZW1lcmFsVGVzdEFwcC9Ob3JtYWxBcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy9ub3JtYWxhcHAvU2VhcmNoU3VnZ2VzdGlvblByb3ZpZGVyLmphdmEgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9FcGhlbWVyYWxUZXN0QXBwL05vcm1hbEFwcC9zcmMvY29tL2FuZHJvaWQvY3RzL25vcm1hbGFwcC9TZWFyY2hTdWdnZXN0aW9uUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWM1MjdiCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRXBoZW1lcmFsVGVzdEFwcC9Ob3JtYWxBcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy9ub3JtYWxhcHAvU2VhcmNoU3VnZ2VzdGlvblByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY3RzLm5vcm1hbGFwcDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5TZWFyY2hSZWNlbnRTdWdnZXN0aW9uc1Byb3ZpZGVyOworCitwdWJsaWMgY2xhc3MgU2VhcmNoU3VnZ2VzdGlvblByb3ZpZGVyIGV4dGVuZHMgU2VhcmNoUmVjZW50U3VnZ2VzdGlvbnNQcm92aWRlciB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUSE9SSVRZID0gImNvbS5hbmRyb2lkLmN0cy5ub3JtYWxhcHAuU2VhcmNoIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFID0gREFUQUJBU0VfTU9ERV9RVUVSSUVTOworCisgICAgcHVibGljIFNlYXJjaFN1Z2dlc3Rpb25Qcm92aWRlcigpIHsKKyAgICAgICAgc2V0dXBTdWdnZXN0aW9ucyhBVVRIT1JJVFksIE1PREUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0VwaGVtZXJhbFRlc3RBcHAvVW5leHBvc2VkQXBwL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9FcGhlbWVyYWxUZXN0QXBwL1VuZXhwb3NlZEFwcC9BbmRyb2lkLm1rCmluZGV4IDVmYTM3NjUuLmQ4ZTkyMzQgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0VwaGVtZXJhbFRlc3RBcHAvVW5leHBvc2VkQXBwL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRXBoZW1lcmFsVGVzdEFwcC9VbmV4cG9zZWRBcHAvQW5kcm9pZC5tawpAQCAtMTgsNyArMTgsNyBAQAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC1zdXBwb3J0LXRlc3QKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkeC50ZXN0LnJ1bGVzCiAKICMgdGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKIExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCkBAIC0yNiw2ICsyNiw3IEBACiBMT0NBTF9SRVNPVVJDRV9ESVIgOj0gJChMT0NBTF9QQVRIKS9yZXMKIAogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0VwaGVtZXJhbFRlc3RzVW5leHBvc2VkQXBwCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CiAKIExPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKIExPQ0FMX0RFWF9QUkVPUFQgOj0gZmFsc2UKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0VwaGVtZXJhbFRlc3RBcHAvVW5leHBvc2VkQXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9FcGhlbWVyYWxUZXN0QXBwL1VuZXhwb3NlZEFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDM5YzY5ODEuLjE4MjBlYjAgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0VwaGVtZXJhbFRlc3RBcHAvVW5leHBvc2VkQXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRXBoZW1lcmFsVGVzdEFwcC9VbmV4cG9zZWRBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjUsNiArMjUsNiBAQAogICAgIDwvYXBwbGljYXRpb24+CiAKICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmFuZHJvaWQuY3RzLnVuZXhwb3NlZGFwcCIgLz4KIDwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9FcGhlbWVyYWxUZXN0QXBwL1VzZXJBcHAvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0VwaGVtZXJhbFRlc3RBcHAvVXNlckFwcC9BbmRyb2lkLm1rCmluZGV4IDEyMDZlNTYuLjZkNTg4OTEgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0VwaGVtZXJhbFRlc3RBcHAvVXNlckFwcC9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0VwaGVtZXJhbFRlc3RBcHAvVXNlckFwcC9BbmRyb2lkLm1rCkBAIC0yMCw4ICsyMCw3IEBACiBMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwogTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKICAgICBjdHMtYWlhLXV0aWwgXAotICAgIGFuZHJvaWQtc3VwcG9ydC10ZXN0IFwKLSAgICBsZWdhY3ktYW5kcm9pZC10ZXN0CisgICAgYW5kcm9pZHgudGVzdC5ydWxlcwogCiAjIHRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0CiBMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cwpAQCAtMzAsNiArMjksNyBAQAogTE9DQUxfUkVTT1VSQ0VfRElSIDo9ICQoTE9DQUxfUEFUSCkvcmVzCiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNFcGhlbWVyYWxUZXN0c1VzZXJBcHAKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKIAogTE9DQUxfUFJPR1VBUkRfRU5BQkxFRCA6PSBkaXNhYmxlZAogTE9DQUxfREVYX1BSRU9QVCA6PSBmYWxzZQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRXBoZW1lcmFsVGVzdEFwcC9Vc2VyQXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9FcGhlbWVyYWxUZXN0QXBwL1VzZXJBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBmYmFjZjk1Li45NDFjNGIwNiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRXBoZW1lcmFsVGVzdEFwcC9Vc2VyQXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRXBoZW1lcmFsVGVzdEFwcC9Vc2VyQXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTM0LDYgKzM0LDYgQEAKICAgICA8L2FwcGxpY2F0aW9uPgogCiAgICAgPGluc3RydW1lbnRhdGlvbgotICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5hbmRyb2lkLmN0cy51c2VyYXBwIiAvPgogPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0VwaGVtZXJhbFRlc3RBcHAvVXNlckFwcFRlc3QvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0VwaGVtZXJhbFRlc3RBcHAvVXNlckFwcFRlc3QvQW5kcm9pZC5tawppbmRleCBmNDQ2MTQwLi5hZmIwMTZjIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9FcGhlbWVyYWxUZXN0QXBwL1VzZXJBcHBUZXN0L0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRXBoZW1lcmFsVGVzdEFwcC9Vc2VyQXBwVGVzdC9BbmRyb2lkLm1rCkBAIC0xOSw4ICsxOSw3IEBACiAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCiBMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAotICAgIGFuZHJvaWQtc3VwcG9ydC10ZXN0IFwKLSAgICBsZWdhY3ktYW5kcm9pZC10ZXN0CisgICAgYW5kcm9pZHgudGVzdC5ydWxlcwogCiAjIHRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0CiBMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cwpAQCAtMjksNiArMjgsNyBAQAogTE9DQUxfUkVTT1VSQ0VfRElSIDo9ICQoTE9DQUxfUEFUSCkvcmVzCiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNFcGhlbWVyYWxUZXN0c1VzZXJBcHBUZXN0CitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CiAKIExPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKIExPQ0FMX0RFWF9QUkVPUFQgOj0gZmFsc2UKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0VwaGVtZXJhbFRlc3RBcHAvVXNlckFwcFRlc3QvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0VwaGVtZXJhbFRlc3RBcHAvVXNlckFwcFRlc3QvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCAwZTU5YTFkLi4wOWJhYzRjIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9FcGhlbWVyYWxUZXN0QXBwL1VzZXJBcHBUZXN0L0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRXBoZW1lcmFsVGVzdEFwcC9Vc2VyQXBwVGVzdC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yNyw2ICsyNyw2IEBACiAgICAgPC9hcHBsaWNhdGlvbj4KIAogICAgIDxpbnN0cnVtZW50YXRpb24KLSAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5jdHMudXNlcmFwcHRlc3QiIC8+CiA8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRXBoZW1lcmFsVGVzdEFwcC9Vc2VyQXBwVGVzdC9zcmMvY29tL2FuZHJvaWQvY3RzL3VzZXJhcHB0ZXN0L0NsaWVudFRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0VwaGVtZXJhbFRlc3RBcHAvVXNlckFwcFRlc3Qvc3JjL2NvbS9hbmRyb2lkL2N0cy91c2VyYXBwdGVzdC9DbGllbnRUZXN0LmphdmEKaW5kZXggZWQwMzhlZS4uODZlY2FmYSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRXBoZW1lcmFsVGVzdEFwcC9Vc2VyQXBwVGVzdC9zcmMvY29tL2FuZHJvaWQvY3RzL3VzZXJhcHB0ZXN0L0NsaWVudFRlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9FcGhlbWVyYWxUZXN0QXBwL1VzZXJBcHBUZXN0L3NyYy9jb20vYW5kcm9pZC9jdHMvdXNlcmFwcHRlc3QvQ2xpZW50VGVzdC5qYXZhCkBAIC0yMiw4ICsyMiw5IEBACiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5SZXNvbHZlSW5mbzsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0VwaGVtZXJhbFRlc3RBcHAvdXRpbC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRXBoZW1lcmFsVGVzdEFwcC91dGlsL0FuZHJvaWQubWsKaW5kZXggZmMxYmQ4My4uZGYyOWMwMyAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRXBoZW1lcmFsVGVzdEFwcC91dGlsL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRXBoZW1lcmFsVGVzdEFwcC91dGlsL0FuZHJvaWQubWsKQEAgLTIzLDUgKzIzLDcgQEAKIAogTE9DQUxfTU9EVUxFIDo9IGN0cy1haWEtdXRpbAogCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CisKIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfSkFWQV9MSUJSQVJZKQogCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9FcGhlbWVyYWxUZXN0QXBwL3V0aWwvc3JjL2NvbS9hbmRyb2lkL2N0cy91dGlsL1Rlc3RSZXN1bHQuamF2YSBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0VwaGVtZXJhbFRlc3RBcHAvdXRpbC9zcmMvY29tL2FuZHJvaWQvY3RzL3V0aWwvVGVzdFJlc3VsdC5qYXZhCmluZGV4IGRkMzI2ZDAuLjYzMmRlZDkgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0VwaGVtZXJhbFRlc3RBcHAvdXRpbC9zcmMvY29tL2FuZHJvaWQvY3RzL3V0aWwvVGVzdFJlc3VsdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0VwaGVtZXJhbFRlc3RBcHAvdXRpbC9zcmMvY29tL2FuZHJvaWQvY3RzL3V0aWwvVGVzdFJlc3VsdC5qYXZhCkBAIC0xOCwxMSArMTgsOSBAQAogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOwotaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZS5DcmVhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIAogcHVibGljIGNsYXNzIFRlc3RSZXN1bHQgaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9URVNUX1JFU1VMVCA9CkBAIC0zNSw2ICszMyw3IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbU1ldGhvZE5hbWU7CiAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVN0YXR1czsKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtRXhjZXB0aW9uOworICAgIHByaXZhdGUgZmluYWwgSW50ZW50IG1JbnRlbnQ7CiAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1JbnN0YW50QXBwUGFja2FnZUluZm9FeHBvc2VkOwogCiAgICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKQEAgLTYxLDYgKzYwLDEwIEBACiAgICAgICAgIHJldHVybiBtSW5zdGFudEFwcFBhY2thZ2VJbmZvRXhwb3NlZDsKICAgICB9CiAKKyAgICBwdWJsaWMgSW50ZW50IGdldEludGVudCgpIHsKKyAgICAgICAgcmV0dXJuIG1JbnRlbnQ7CisgICAgfQorCiAgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIGdldEJ1aWxkZXIoKSB7CiAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpOwogICAgIH0KQEAgLTczLDEzICs3NiwyMyBAQAogICAgICAgICBjb250ZXh0LnNlbmRCcm9hZGNhc3QoYnJvYWRjYXN0SW50ZW50KTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBzdGFydEFjdGl2aXR5KENvbnRleHQgY29udGV4dCwgVXJpIHVyaSkgeworICAgICAgICBmaW5hbCBJbnRlbnQgYnJvYWRjYXN0SW50ZW50ID0gbmV3IEludGVudChJbnRlbnQuQUNUSU9OX1ZJRVcpOworICAgICAgICBicm9hZGNhc3RJbnRlbnQuYWRkQ2F0ZWdvcnkoSW50ZW50LkNBVEVHT1JZX0JST1dTQUJMRSk7CisgICAgICAgIGJyb2FkY2FzdEludGVudC5wdXRFeHRyYShFWFRSQV9URVNUX1JFU1VMVCwgdGhpcyk7CisgICAgICAgIGJyb2FkY2FzdEludGVudC5zZXREYXRhKHVyaSk7CisgICAgICAgIGNvbnRleHQuc3RhcnRBY3Rpdml0eShicm9hZGNhc3RJbnRlbnQpOworICAgIH0KKwogICAgIHByaXZhdGUgVGVzdFJlc3VsdChTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBjb21wb25lbnROYW1lLCBTdHJpbmcgbWV0aG9kTmFtZSwKLSAgICAgICAgICAgIFN0cmluZyBzdGF0dXMsIFN0cmluZyBleGNlcHRpb24sIGJvb2xlYW4gZXBoZW1lcmFsUGFja2FnZUluZm9FeHBvc2VkKSB7CisgICAgICAgICAgICBTdHJpbmcgc3RhdHVzLCBTdHJpbmcgZXhjZXB0aW9uLCBJbnRlbnQgaW50ZW50LAorICAgICAgICAgICAgYm9vbGVhbiBlcGhlbWVyYWxQYWNrYWdlSW5mb0V4cG9zZWQpIHsKICAgICAgICAgbVBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU7CiAgICAgICAgIG1Db21wb25lbnROYW1lID0gY29tcG9uZW50TmFtZTsKICAgICAgICAgbU1ldGhvZE5hbWUgPSBtZXRob2ROYW1lOwogICAgICAgICBtU3RhdHVzID0gc3RhdHVzOwogICAgICAgICBtRXhjZXB0aW9uID0gZXhjZXB0aW9uOworICAgICAgICBtSW50ZW50ID0gaW50ZW50OwogICAgICAgICBtSW5zdGFudEFwcFBhY2thZ2VJbmZvRXhwb3NlZCA9IGVwaGVtZXJhbFBhY2thZ2VJbmZvRXhwb3NlZDsKICAgICB9CiAKQEAgLTk1LDcgKzEwOCw4IEBACiAgICAgICAgIGRlc3Qud3JpdGVTdHJpbmcobU1ldGhvZE5hbWUpOwogICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1TdGF0dXMpOwogICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1FeGNlcHRpb24pOwotICAgICAgICBkZXN0LndyaXRlQm9vbGVhbihtSW5zdGFudEFwcFBhY2thZ2VJbmZvRXhwb3NlZCk7CisgICAgICAgIGRlc3Qud3JpdGVQYXJjZWxhYmxlKG1JbnRlbnQsIDAgLyogZmxhZ3MgKi8pOworICAgICAgICBkZXN0LndyaXRlSW50KG1JbnN0YW50QXBwUGFja2FnZUluZm9FeHBvc2VkID8gMSA6IDApOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ3JlYXRvcjxUZXN0UmVzdWx0PiBDUkVBVE9SID0gbmV3IENyZWF0b3I8VGVzdFJlc3VsdD4oKSB7CkBAIC0xMTMsNyArMTI3LDggQEAKICAgICAgICAgbU1ldGhvZE5hbWUgPSBzb3VyY2UucmVhZFN0cmluZygpOwogICAgICAgICBtU3RhdHVzID0gc291cmNlLnJlYWRTdHJpbmcoKTsKICAgICAgICAgbUV4Y2VwdGlvbiA9IHNvdXJjZS5yZWFkU3RyaW5nKCk7Ci0gICAgICAgIG1JbnN0YW50QXBwUGFja2FnZUluZm9FeHBvc2VkID0gc291cmNlLnJlYWRCb29sZWFuKCk7CisgICAgICAgIG1JbnRlbnQgPSBzb3VyY2UucmVhZFBhcmNlbGFibGUoT2JqZWN0LmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOworICAgICAgICBtSW5zdGFudEFwcFBhY2thZ2VJbmZvRXhwb3NlZCA9IHNvdXJjZS5yZWFkSW50KCkgIT0gMDsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXIgewpAQCAtMTIyLDYgKzEzNyw3IEBACiAgICAgICAgIHByaXZhdGUgU3RyaW5nIG1ldGhvZE5hbWU7CiAgICAgICAgIHByaXZhdGUgU3RyaW5nIHN0YXR1czsKICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZXhjZXB0aW9uOworICAgICAgICBwcml2YXRlIEludGVudCBpbnRlbnQ7CiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpbnN0YW50QXBwUGFja2FnZUluZm9FeHBvc2VkOwogCiAgICAgICAgIHByaXZhdGUgQnVpbGRlcigpIHsKQEAgLTE1MCw5ICsxNjYsMTMgQEAKICAgICAgICAgICAgIGluc3RhbnRBcHBQYWNrYWdlSW5mb0V4cG9zZWQgPSBfaW5zdGFudEFwcFBhY2thZ2VJbmZvRXhwb3NlZDsKICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICB9CisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldEludGVudChJbnRlbnQgX2ludGVudCkgeworICAgICAgICAgICAgaW50ZW50ID0gX2ludGVudDsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CiAgICAgICAgIHB1YmxpYyBUZXN0UmVzdWx0IGJ1aWxkKCkgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXN0UmVzdWx0KHBhY2thZ2VOYW1lLCBjb21wb25lbnROYW1lLCBtZXRob2ROYW1lLAotICAgICAgICAgICAgICAgICAgICBzdGF0dXMsIGV4Y2VwdGlvbiwgaW5zdGFudEFwcFBhY2thZ2VJbmZvRXhwb3NlZCk7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cywgZXhjZXB0aW9uLCBpbnRlbnQsIGluc3RhbnRBcHBQYWNrYWdlSW5mb0V4cG9zZWQpOwogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRXNjYWxhdGVUb1J1bnRpbWVQZXJtaXNzaW9ucy9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRXNjYWxhdGVUb1J1bnRpbWVQZXJtaXNzaW9ucy9BbmRyb2lkLm1rCmluZGV4IGNkM2MwNGUuLmM4MjY0OGMgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0VzY2FsYXRlVG9SdW50aW1lUGVybWlzc2lvbnMvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Fc2NhbGF0ZVRvUnVudGltZVBlcm1pc3Npb25zL0FuZHJvaWQubWsKQEAgLTIwLDExICsyMCwxMiBAQAogCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwogCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC1zdXBwb3J0LXRlc3QKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkeC50ZXN0LnJ1bGVzCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIAogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0VzY2FsYXRlVG9SdW50aW1lUGVybWlzc2lvbnMKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKIAogTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKIApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRXNjYWxhdGVUb1J1bnRpbWVQZXJtaXNzaW9ucy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRXNjYWxhdGVUb1J1bnRpbWVQZXJtaXNzaW9ucy9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDE5OGJiMzkuLjFhYzI3OTAgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0VzY2FsYXRlVG9SdW50aW1lUGVybWlzc2lvbnMvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Fc2NhbGF0ZVRvUnVudGltZVBlcm1pc3Npb25zL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTMyLDcgKzMyLDcgQEAKIAogCiAgICAgPGluc3RydW1lbnRhdGlvbgotICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5hbmRyb2lkLmN0cy5lc2NhbGF0ZS5wZXJtaXNzaW9uIiAvPgogCiA8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRXNjYWxhdGVUb1J1bnRpbWVQZXJtaXNzaW9ucy9zcmMvY29tL2FuZHJvaWQvY3RzL2VzY2FsYXRlcGVybWlzc2lvbi9QZXJtaXNzaW9uRXNjYWxhdGlvblRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0VzY2FsYXRlVG9SdW50aW1lUGVybWlzc2lvbnMvc3JjL2NvbS9hbmRyb2lkL2N0cy9lc2NhbGF0ZXBlcm1pc3Npb24vUGVybWlzc2lvbkVzY2FsYXRpb25UZXN0LmphdmEKaW5kZXggYmJlOGUwMi4uY2ZjY2M3OCAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRXNjYWxhdGVUb1J1bnRpbWVQZXJtaXNzaW9ucy9zcmMvY29tL2FuZHJvaWQvY3RzL2VzY2FsYXRlcGVybWlzc2lvbi9QZXJtaXNzaW9uRXNjYWxhdGlvblRlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Fc2NhbGF0ZVRvUnVudGltZVBlcm1pc3Npb25zL3NyYy9jb20vYW5kcm9pZC9jdHMvZXNjYWxhdGVwZXJtaXNzaW9uL1Blcm1pc3Npb25Fc2NhbGF0aW9uVGVzdC5qYXZhCkBAIC0xNiwxNyArMTYsMTkgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5jdHMuZXNjYWxhdGVwZXJtaXNzaW9uOwogCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBlcm1pc3Npb25JbmZvOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKLQogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFNhbWU7CiAKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGVybWlzc2lvbkluZm87CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBjb20uYW5kcm9pZC5jdHMuZXNjYWxhdGUucGVybWlzc2lvbi5NYW5pZmVzdDsKIAoraW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKKwogQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKIHB1YmxpYyBjbGFzcyBQZXJtaXNzaW9uRXNjYWxhdGlvblRlc3QgewogICAgIEBUZXN0CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9FeHRlcm5hbFN0b3JhZ2VBcHAvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0V4dGVybmFsU3RvcmFnZUFwcC9BbmRyb2lkLm1rCmluZGV4IDQ3ZDQ2OGUuLjBiMjMyZmIgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0V4dGVybmFsU3RvcmFnZUFwcC9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0V4dGVybmFsU3RvcmFnZUFwcC9BbmRyb2lkLm1rCkBAIC0xOCw3ICsxOCw5IEBACiAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCiBMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50Ci1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC1zdXBwb3J0LXRlc3QgbGVnYWN5LWFuZHJvaWQtdGVzdAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWR4LnRlc3QucnVsZXMKKworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LmJhc2Uuc3R1YnMKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0V4dGVybmFsU3RvcmFnZUFwcApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvRXh0ZXJuYWxTdG9yYWdlQXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9FeHRlcm5hbFN0b3JhZ2VBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA5OGZlOTJhLi4zN2Q0MjNmIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9FeHRlcm5hbFN0b3JhZ2VBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9FeHRlcm5hbFN0b3JhZ2VBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMTYsMTEgKzE2LDExIEBACiA8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgogICAgICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLmN0cy5leHRlcm5hbHN0b3JhZ2VhcHAiPgogCi0gICAgPGFwcGxpY2F0aW9uPgorICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOnVzZXNDbGVhcnRleHRUcmFmZmljPSJ0cnVlIj4KICAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CiAgICAgPC9hcHBsaWNhdGlvbj4KIAotICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmFuZHJvaWQuY3RzLmV4dGVybmFsc3RvcmFnZWFwcCIgLz4KIAogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uSU5URVJORVQiIC8+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9JbnN0YW50Q29va2llQXBwL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9JbnN0YW50Q29va2llQXBwL0FuZHJvaWQubWsKaW5kZXggMWY5MDYzYy4uYjExM2Y4ZiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvSW5zdGFudENvb2tpZUFwcC9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0luc3RhbnRDb29raWVBcHAvQW5kcm9pZC5tawpAQCAtMjIsOSArMjIsMTAgQEAKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC1zdXBwb3J0LXRlc3QKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkeC50ZXN0LnJ1bGVzCiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNJbnN0YW50Q29va2llQXBwCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CiAKIExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiAKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0luc3RhbnRDb29raWVBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0luc3RhbnRDb29raWVBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCAzMWY2NTNkLi5kOWIyMGMxIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9JbnN0YW50Q29va2llQXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvSW5zdGFudENvb2tpZUFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yMyw3ICsyMyw3IEBACiAgICAgPGFwcGxpY2F0aW9uLz4KIAogICAgIDxpbnN0cnVtZW50YXRpb24KLSAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJ0ZXN0Lmluc3RhbnQuY29va2llIiAvPgogCiA8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvSW5zdGFudENvb2tpZUFwcC9zcmMvdGVzdC9pbnN0YW50L2Nvb2tpZS9Db29raWVUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9JbnN0YW50Q29va2llQXBwL3NyYy90ZXN0L2luc3RhbnQvY29va2llL0Nvb2tpZVRlc3QuamF2YQppbmRleCA3NzQyOTZiLi5lYzQxYmYzIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9JbnN0YW50Q29va2llQXBwL3NyYy90ZXN0L2luc3RhbnQvY29va2llL0Nvb2tpZVRlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9JbnN0YW50Q29va2llQXBwL3NyYy90ZXN0L2luc3RhbnQvY29va2llL0Nvb2tpZVRlc3QuamF2YQpAQCAtMTYsMTcgKzE2LDE5IEBACiAKIHBhY2thZ2UgdGVzdC5pbnN0YW50LmNvb2tpZTsKIAotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLWltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7Ci0KIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwogCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworCiBAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQogcHVibGljIGNsYXNzIENvb2tpZVRlc3QgewogICAgIEBUZXN0CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9JbnN0YW50Q29va2llQXBwMi9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvSW5zdGFudENvb2tpZUFwcDIvQW5kcm9pZC5tawppbmRleCBiMTU0YWUyLi43YzFkNzA5NSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvSW5zdGFudENvb2tpZUFwcDIvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9JbnN0YW50Q29va2llQXBwMi9BbmRyb2lkLm1rCkBAIC0yMiw5ICsyMiwxMCBAQAogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLXN1cHBvcnQtdGVzdAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWR4LnRlc3QucnVsZXMKIAogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0luc3RhbnRDb29raWVBcHAyCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CiAKIExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiAKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0luc3RhbnRDb29raWVBcHAyL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9JbnN0YW50Q29va2llQXBwMi9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDMxZjY1M2QuLmQ5YjIwYzEgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0luc3RhbnRDb29raWVBcHAyL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvSW5zdGFudENvb2tpZUFwcDIvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjMsNyArMjMsNyBAQAogICAgIDxhcHBsaWNhdGlvbi8+CiAKICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0idGVzdC5pbnN0YW50LmNvb2tpZSIgLz4KIAogPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0luc3RhbnRDb29raWVBcHAyL3NyYy90ZXN0L2luc3RhbnQvY29va2llL0Nvb2tpZVRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0luc3RhbnRDb29raWVBcHAyL3NyYy90ZXN0L2luc3RhbnQvY29va2llL0Nvb2tpZVRlc3QuamF2YQppbmRleCBkYTE0OTJmLi5jNDM2NjgyIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9JbnN0YW50Q29va2llQXBwMi9zcmMvdGVzdC9pbnN0YW50L2Nvb2tpZS9Db29raWVUZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvSW5zdGFudENvb2tpZUFwcDIvc3JjL3Rlc3QvaW5zdGFudC9jb29raWUvQ29va2llVGVzdC5qYXZhCkBAIC0xNiwxNyArMTYsMTYgQEAKIAogcGFja2FnZSB0ZXN0Lmluc3RhbnQuY29va2llOwogCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKLQogQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKIHB1YmxpYyBjbGFzcyBDb29raWVUZXN0IHsKICAgICBAVGVzdApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvSW5zdGFudFVwZ3JhZGVBcHAvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0luc3RhbnRVcGdyYWRlQXBwL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUwNzUyYQotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0luc3RhbnRVcGdyYWRlQXBwL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzOSBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIuc3R1YnMgYW5kcm9pZC50ZXN0LmJhc2Uuc3R1YnMKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAorICAgIGN0cy1haWEtdXRpbCBcCisgICAgYW5kcm9pZHgudGVzdC5ydWxlcyBcCisgICAgY3RzZGV2aWNldXRpbGxlZ2FjeS1heHQgXAorICAgIGN0c3Rlc3RydW5uZXItYXh0CisKKyMgdGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0luc3RhbnRVcGdyYWRlQXBwCitMT0NBTF9QUklWQVRFX1BMQVRGT1JNX0FQSVMgOj0gdHJ1ZQorCitMT0NBTF9QUk9HVUFSRF9FTkFCTEVEIDo9IGRpc2FibGVkCitMT0NBTF9ERVhfUFJFT1BUIDo9IGZhbHNlCisKK2luY2x1ZGUgJChCVUlMRF9DVFNfU1VQUE9SVF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvSW5zdGFudFVwZ3JhZGVBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0luc3RhbnRVcGdyYWRlQXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU3YzJhNwotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0luc3RhbnRVcGdyYWRlQXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwzMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp0b29scz0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vdG9vbHMiCisgICAgcGFja2FnZT0iY29tLmFuZHJvaWQuY3RzLmluc3RhbnR1cGdyYWRlYXBwIgorICAgIGFuZHJvaWQ6dGFyZ2V0U2FuZGJveFZlcnNpb249IjIiPgorICAgIDwhLS0gTk9URTogTXVzdCB0YXJnZXQgMjYgaW4gb3JkZXIgdG8gaGF2ZSB0aGUgY29ycmVjdCBkZWZhdWx0IHNlbGludXggY29udGV4dCAtLT4KKyAgICA8dXNlcy1zZGsKKyAgICAgICAgYW5kcm9pZDptaW5TZGtWZXJzaW9uPSIyNSIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRTZGtWZXJzaW9uPSIyNiIgLz4KKworICAgIDxhcHBsaWNhdGlvbgorICAgICAgICBhbmRyb2lkOmxhYmVsPSJJbnN0YW50VXBncmFkZUFwcCI+CisgICAgPC9hcHBsaWNhdGlvbj4KKworICAgIDxpbnN0cnVtZW50YXRpb24KKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmFuZHJvaWQuY3RzLmluc3RhbnR1cGdyYWRlYXBwIiAvPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0luc3RhbnRVcGdyYWRlQXBwL3NyYy9jb20vYW5kcm9pZC9jdHMvaW5zdGFudHVwZ3JhZGVhcHAvQ2xpZW50VGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvSW5zdGFudFVwZ3JhZGVBcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy9pbnN0YW50dXBncmFkZWFwcC9DbGllbnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjllZmYxYQotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0luc3RhbnRVcGdyYWRlQXBwL3NyYy9jb20vYW5kcm9pZC9jdHMvaW5zdGFudHVwZ3JhZGVhcHAvQ2xpZW50VGVzdC5qYXZhCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5pbnN0YW50dXBncmFkZWFwcDsKKworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlczsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKKworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKKworQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBDbGllbnRUZXN0IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkluc3RhbnRVcGdyYWRlQXBwIjsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEluc3RhbnRBcHBsaWNhdGlvbldyaXRlUHJlZmVyZW5jZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gb25seSBkb25lIGluIHRoZSBjb250ZXh0IG9mIGFuIGluc3RhbnQgYXBwbGljYXRpb24KKyAgICAgICAgYXNzZXJ0VHJ1ZShJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCkuZ2V0UGFja2FnZU1hbmFnZXIoKS5pc0luc3RhbnRBcHAoKSk7CisgICAgICAgIGZpbmFsIFNoYXJlZFByZWZlcmVuY2VzIHByZWZXcml0ZXIgPQorICAgICAgICAgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKS5nZXRTaGFyZWRQcmVmZXJlbmNlcygicHJlZmVyZW5jZXMiLCAwKTsKKyAgICAgICAgcHJlZldyaXRlci5lZGl0KCkucHV0U3RyaW5nKCJ0ZXN0IiwgInZhbHVlIikuY29tbWl0KCk7CisgICAgfQorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZ1bGxBcHBsaWNhdGlvblJlYWRQcmVmZXJlbmNlcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBvbmx5IGRvbmUgaW4gdGhlIGNvbnRleHQgb2YgYW4gZnVsbCBhcHBsaWNhdGlvbgorICAgICAgICBhc3NlcnRGYWxzZShJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCkuZ2V0UGFja2FnZU1hbmFnZXIoKS5pc0luc3RhbnRBcHAoKSk7CisgICAgICAgIGZpbmFsIFNoYXJlZFByZWZlcmVuY2VzIHByZWZSZWFkZXIgPQorICAgICAgICAgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKS5nZXRTaGFyZWRQcmVmZXJlbmNlcygicHJlZmVyZW5jZXMiLCAwKTsKKyAgICAgICAgYXNzZXJ0VGhhdChwcmVmUmVhZGVyLmdldFN0cmluZygidGVzdCIsICJkZWZhdWx0IiksIGlzKCJ2YWx1ZSIpKTsKKyAgICB9CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFudEFwcGxpY2F0aW9uV3JpdGVGaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIG9ubHkgZG9uZSBpbiB0aGUgY29udGV4dCBvZiBhbiBpbnN0YW50IGFwcGxpY2F0aW9uCisgICAgICAgIGFzc2VydFRydWUoSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VNYW5hZ2VyKCkuaXNJbnN0YW50QXBwKCkpOworICAgICAgICB0cnkgKEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkKKyAgICAgICAgICAgICAgICAuZ2V0Q29udGV4dCgpLm9wZW5GaWxlT3V0cHV0KCJ0ZXN0LnR4dCIsIENvbnRleHQuTU9ERV9QUklWQVRFKSkgeworICAgICAgICAgICAgZm9zLndyaXRlKCJNeVRlc3QiLmdldEJ5dGVzKCkpOworICAgICAgICB9CisgICAgfQorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZ1bGxBcHBsaWNhdGlvblJlYWRGaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIG9ubHkgZG9uZSBpbiB0aGUgY29udGV4dCBvZiBhbiBmdWxsIGFwcGxpY2F0aW9uCisgICAgICAgIGFzc2VydEZhbHNlKEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKS5nZXRQYWNrYWdlTWFuYWdlcigpLmlzSW5zdGFudEFwcCgpKTsKKyAgICAgICAgdHJ5IChGaWxlSW5wdXRTdHJlYW0gZmlzID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkKKyAgICAgICAgICAgICAgICAuZ2V0Q29udGV4dCgpLm9wZW5GaWxlSW5wdXQoInRlc3QudHh0IikpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICBmaW5hbCBieXRlW10gYiA9IG5ldyBieXRlWzEwMjRdOworICAgICAgICAgICAgaW50IGNvdW50OworICAgICAgICAgICAgd2hpbGUgKChjb3VudCA9IGZpcy5yZWFkKGIpKSAhPSAtMSkgeworICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQobmV3IFN0cmluZyhiLCAwLCBjb3VudCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0VGhhdChidWZmZXIudG9TdHJpbmcoKSwgaXMoIk15VGVzdCIpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0luc3RydW1lbnRhdGlvbkFwcERpZmZDZXJ0L0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9JbnN0cnVtZW50YXRpb25BcHBEaWZmQ2VydC9BbmRyb2lkLm1rCmluZGV4IGE0OGFiYmYuLmE5Nzc0MTYgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0luc3RydW1lbnRhdGlvbkFwcERpZmZDZXJ0L0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvSW5zdHJ1bWVudGF0aW9uQXBwRGlmZkNlcnQvQW5kcm9pZC5tawpAQCAtMjEsNyArMjEsOSBAQAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogCiBMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50Ci1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC1zdXBwb3J0LXRlc3QgbGVnYWN5LWFuZHJvaWQtdGVzdAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWR4LnRlc3QucnVsZXMKKworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LmJhc2Uuc3R1YnMKIAogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0luc3RydW1lbnRhdGlvbkFwcERpZmZDZXJ0CiAKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0luc3RydW1lbnRhdGlvbkFwcERpZmZDZXJ0L0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9JbnN0cnVtZW50YXRpb25BcHBEaWZmQ2VydC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGE5NThjNGMuLjQ5YzEwZGEgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0luc3RydW1lbnRhdGlvbkFwcERpZmZDZXJ0L0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvSW5zdHJ1bWVudGF0aW9uQXBwRGlmZkNlcnQvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMzQsNyArMzQsNyBAQAogICAgIEEgc2VsZi1pbnN0cnVtZW50aW5nIHRlc3QgcnVubmVyLCB0aGF0IHdpbGwgdHJ5IHRvIHN0YXJ0IHRoZSBhYm92ZSBpbnN0cnVtZW50YXRpb24gYW5kCiAgICAgdmVyaWZ5IGl0IGZhaWxzLgogICAgICAtLT4KLSAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5jdHMuaW5zdHJ1bWVudGF0aW9uZGlmZmNlcnRhcHAiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJUZXN0IGZvciBpbnN0cnVtZW50YXRpb24gd2l0aCBkaWZmZXJlbnQgY2VydCIgLz4KIDwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Jc29sYXRlZFNwbGl0QXBwL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Jc29sYXRlZFNwbGl0QXBwL0FuZHJvaWQubWsKaW5kZXggMDgzNDY0Mi4uODM3M2Q5ZSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvSXNvbGF0ZWRTcGxpdEFwcC9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0lzb2xhdGVkU3BsaXRBcHAvQW5kcm9pZC5tawpAQCAtMTgsMjAgKzE4LDI1IEBACiAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzSXNvbGF0ZWRTcGxpdEFwcAogTE9DQUxfVVNFX0FBUFQyIDo9IHRydWUKIExPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi1MT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CiBMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cwotTE9DQUxfRVhQT1JUX1BBQ0tBR0VfUkVTT1VSQ0VTIDo9IHRydWUKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjdHN0ZXN0cnVubmVyIGFuZHJvaWQtc3VwcG9ydC10ZXN0CitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CiAKKyMgRmVhdHVyZSBzcGxpdHMgYXJlIGRlcGVuZGVudCBvbiB0aGlzIGJhc2UsIHNvIGl0IG11c3QgYmUgZXhwb3J0ZWQuCitMT0NBTF9FWFBPUlRfUEFDS0FHRV9SRVNPVVJDRVMgOj0gdHJ1ZQorCisjIE1ha2Ugc3VyZSBvdXIgdGVzdCBsb2NhbGUgcG9saXNoIGlzIG5vdCBzdHJpcHBlZC4KK0xPQ0FMX0FBUFRfSU5DTFVERV9BTExfUkVTT1VSQ0VTIDo9IHRydWUKKworTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGN0c3Rlc3RydW5uZXItYXh0IGFuZHJvaWR4LnRlc3QucnVsZXMKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIAotTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0lzb2xhdGVkU3BsaXRBcHAKKyMgR2VuZXJhdGUgYSBsb2NhbGUgc3BsaXQuCiBMT0NBTF9QQUNLQUdFX1NQTElUUyA6PSBwbAogCi0jIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0Ci0KIGluY2x1ZGUgJChCVUlMRF9DVFNfU1VQUE9SVF9QQUNLQUdFKQogCisjIEJ1aWxkIHRoZSBvdGhlciBzcGxpdHMuCiBpbmNsdWRlICQoY2FsbCBmaXJzdC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0lzb2xhdGVkU3BsaXRBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0lzb2xhdGVkU3BsaXRBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCAyZjNhMzc0Li41MGMxYTRkIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Jc29sYXRlZFNwbGl0QXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvSXNvbGF0ZWRTcGxpdEFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0zOSw3ICszOSw3IEBACiAKICAgICA8L2FwcGxpY2F0aW9uPgogCi0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5jdHMuaXNvbGF0ZWRzcGxpdGFwcCIgLz4KIAogPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0lzb2xhdGVkU3BsaXRBcHAvZmVhdHVyZV9hL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Jc29sYXRlZFNwbGl0QXBwL2ZlYXR1cmVfYS9BbmRyb2lkLm1rCmluZGV4IDQ4YjRlM2IuLmMwODk2NjAgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0lzb2xhdGVkU3BsaXRBcHAvZmVhdHVyZV9hL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvSXNvbGF0ZWRTcGxpdEFwcC9mZWF0dXJlX2EvQW5kcm9pZC5tawpAQCAtMTcsMjAgKzE3LDMzIEBACiBMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzSXNvbGF0ZWRTcGxpdEFwcEZlYXR1cmVBCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CiBMT0NBTF9VU0VfQUFQVDIgOj0gdHJ1ZQogTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKIExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCisKKyMgRmVhdHVyZSBzcGxpdHMgYXJlIGRlcGVuZGVudCBvbiB0aGlzIHNwbGl0LCBzbyBpdCBtdXN0IGJlIGV4cG9ydGVkLgogTE9DQUxfRVhQT1JUX1BBQ0tBR0VfUkVTT1VSQ0VTIDo9IHRydWUKLUxPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNJc29sYXRlZFNwbGl0QXBwRmVhdHVyZUEKKworIyBNYWtlIHN1cmUgb3VyIHRlc3QgbG9jYWxlIHBvbGlzaCBpcyBub3Qgc3RyaXBwZWQuCitMT0NBTF9BQVBUX0lOQ0xVREVfQUxMX1JFU09VUkNFUyA6PSB0cnVlCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLXN1YmRpci1qYXZhLWZpbGVzKQogCisjIEdlbmVyYXRlIGEgbG9jYWxlIHNwbGl0LgogTE9DQUxfUEFDS0FHRV9TUExJVFMgOj0gcGwKIAorIyBDb2RlIGFuZCByZXNvdXJjZSBkZXBlbmRlbmN5IG9uIHRoZSBiYXNlLgogTE9DQUxfQVBLX0xJQlJBUklFUyA6PSBDdHNJc29sYXRlZFNwbGl0QXBwCiBMT0NBTF9SRVNfTElCUkFSSUVTIDo9ICQoTE9DQUxfQVBLX0xJQlJBUklFUykKIAotTE9DQUxfQUFQVF9GTEFHUyArPSAtLWN1c3RvbS1wYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5pc29sYXRlZHNwbGl0YXBwLmZlYXR1cmVfYQorIyBBbHRob3VnaCBmZWF0dXJlIHNwbGl0cyB1c2UgdW5pcXVlIHJlc291cmNlIHBhY2thZ2UgbmFtZXMsIHRoZXkgbXVzdCBhbGwKKyMgaGF2ZSB0aGUgc2FtZSBtYW5pZmVzdCBwYWNrYWdlIG5hbWUgdG8gYmUgY29uc2lkZXJlZCBvbmUgYXBwLgorTE9DQUxfQUFQVF9GTEFHUyArPSAtLXJlbmFtZS1tYW5pZmVzdC1wYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5pc29sYXRlZHNwbGl0YXBwCisKKyMgQXNzaWduIGEgdW5pcXVlIHBhY2thZ2UgSUQgdG8gdGhpcyBmZWF0dXJlIHNwbGl0LiBTaW5jZSB0aGVzZSBhcmUgaXNvbGF0ZWQgc3BsaXRzLAorIyBpdCBtdXN0IG9ubHkgYmUgdW5pcXVlIGFjcm9zcyBhIGRlcGVuZGVuY3kgY2hhaW4uCiBMT0NBTF9BQVBUX0ZMQUdTICs9IC0tcGFja2FnZS1pZCAweDgwCiAKIGluY2x1ZGUgJChCVUlMRF9DVFNfU1VQUE9SVF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvSXNvbGF0ZWRTcGxpdEFwcC9mZWF0dXJlX2EvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0lzb2xhdGVkU3BsaXRBcHAvZmVhdHVyZV9hL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggZDNhZWQxZC4uOTU4YjhkMCAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvSXNvbGF0ZWRTcGxpdEFwcC9mZWF0dXJlX2EvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Jc29sYXRlZFNwbGl0QXBwL2ZlYXR1cmVfYS9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0xNSwxNyArMTUsMTcgQEAKIC0tPgogCiA8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5jdHMuaXNvbGF0ZWRzcGxpdGFwcCIKKyAgICAgICAgcGFja2FnZT0iY29tLmFuZHJvaWQuY3RzLmlzb2xhdGVkc3BsaXRhcHAuZmVhdHVyZV9hIgogICAgICAgICBmZWF0dXJlU3BsaXQ9ImZlYXR1cmVfYSI+CiAKICAgICA8YXBwbGljYXRpb24+Ci0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5mZWF0dXJlX2EuRmVhdHVyZUFBY3Rpdml0eSI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5GZWF0dXJlQUFjdGl2aXR5Ij4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KICAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KICAgICAgICAgPC9hY3Rpdml0eT4KLSAgICAgICAgPHJlY2VpdmVyIGFuZHJvaWQ6bmFtZT0iLmZlYXR1cmVfYS5GZWF0dXJlQVJlY2VpdmVyIj4KKyAgICAgICAgPHJlY2VpdmVyIGFuZHJvaWQ6bmFtZT0iLkZlYXR1cmVBUmVjZWl2ZXIiPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLmN0cy5pc29sYXRlZHNwbGl0YXBwLkFDVElPTiIgLz4KICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0lzb2xhdGVkU3BsaXRBcHAvZmVhdHVyZV9iL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Jc29sYXRlZFNwbGl0QXBwL2ZlYXR1cmVfYi9BbmRyb2lkLm1rCmluZGV4IDY0YjVmYzMuLjQyZmQ0Y2MgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0lzb2xhdGVkU3BsaXRBcHAvZmVhdHVyZV9iL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvSXNvbGF0ZWRTcGxpdEFwcC9mZWF0dXJlX2IvQW5kcm9pZC5tawpAQCAtMTcsMTkgKzE3LDMwIEBACiBMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzSXNvbGF0ZWRTcGxpdEFwcEZlYXR1cmVCCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CiBMT0NBTF9VU0VfQUFQVDIgOj0gdHJ1ZQogTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKIExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCi1MT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzSXNvbGF0ZWRTcGxpdEFwcEZlYXR1cmVCCisKKyMgTWFrZSBzdXJlIG91ciB0ZXN0IGxvY2FsZSBwb2xpc2ggaXMgbm90IHN0cmlwcGVkLgorTE9DQUxfQUFQVF9JTkNMVURFX0FMTF9SRVNPVVJDRVMgOj0gdHJ1ZQogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1zdWJkaXItamF2YS1maWxlcykKIAorIyBHZW5lcmF0ZSBhIGxvY2FsZSBzcGxpdC4KIExPQ0FMX1BBQ0tBR0VfU1BMSVRTIDo9IHBsCiAKKyMgQ29kZSBhbmQgcmVzb3VyY2UgZGVwZW5kZW5jeSBvbiB0aGUgYmFzZSBhbmQgZmVhdHVyZSBBLgogTE9DQUxfQVBLX0xJQlJBUklFUyA6PSBDdHNJc29sYXRlZFNwbGl0QXBwIEN0c0lzb2xhdGVkU3BsaXRBcHBGZWF0dXJlQQogTE9DQUxfUkVTX0xJQlJBUklFUyA6PSAkKExPQ0FMX0FQS19MSUJSQVJJRVMpCiAKLUxPQ0FMX0FBUFRfRkxBR1MgOj0gLS1jdXN0b20tcGFja2FnZSBjb20uYW5kcm9pZC5jdHMuaXNvbGF0ZWRzcGxpdGFwcC5mZWF0dXJlX2IKKyMgQWx0aG91Z2ggZmVhdHVyZSBzcGxpdHMgdXNlIHVuaXF1ZSByZXNvdXJjZSBwYWNrYWdlIG5hbWVzLCB0aGV5IG11c3QgYWxsCisjIGhhdmUgdGhlIHNhbWUgbWFuaWZlc3QgcGFja2FnZSBuYW1lIHRvIGJlIGNvbnNpZGVyZWQgb25lIGFwcC4KK0xPQ0FMX0FBUFRfRkxBR1MgOj0gLS1yZW5hbWUtbWFuaWZlc3QtcGFja2FnZSBjb20uYW5kcm9pZC5jdHMuaXNvbGF0ZWRzcGxpdGFwcAorCisjIEFzc2lnbiBhIHVuaXF1ZSBwYWNrYWdlIElEIHRvIHRoaXMgZmVhdHVyZSBzcGxpdC4gU2luY2UgdGhlc2UgYXJlIGlzb2xhdGVkIHNwbGl0cywKKyMgaXQgbXVzdCBvbmx5IGJlIHVuaXF1ZSBhY3Jvc3MgYSBkZXBlbmRlbmN5IGNoYWluLgogTE9DQUxfQUFQVF9GTEFHUyArPSAtLXBhY2thZ2UtaWQgMHg4MQogCiBpbmNsdWRlICQoQlVJTERfQ1RTX1NVUFBPUlRfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0lzb2xhdGVkU3BsaXRBcHAvZmVhdHVyZV9iL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Jc29sYXRlZFNwbGl0QXBwL2ZlYXR1cmVfYi9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDAwYzJkNmMuLmQ4OWExZjIgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0lzb2xhdGVkU3BsaXRBcHAvZmVhdHVyZV9iL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvSXNvbGF0ZWRTcGxpdEFwcC9mZWF0dXJlX2IvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMTUsMTkgKzE1LDE5IEBACiAtLT4KIAogPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgcGFja2FnZT0iY29tLmFuZHJvaWQuY3RzLmlzb2xhdGVkc3BsaXRhcHAiCisgICAgICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLmN0cy5pc29sYXRlZHNwbGl0YXBwLmZlYXR1cmVfYiIKICAgICAgICAgZmVhdHVyZVNwbGl0PSJmZWF0dXJlX2IiPgogCiAgICAgPHVzZXMtc3BsaXQgYW5kcm9pZDpuYW1lPSJmZWF0dXJlX2EiIC8+CiAKICAgICA8YXBwbGljYXRpb24+Ci0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5mZWF0dXJlX2IuRmVhdHVyZUJBY3Rpdml0eSI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5GZWF0dXJlQkFjdGl2aXR5Ij4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KICAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KICAgICAgICAgPC9hY3Rpdml0eT4KLSAgICAgICAgPHJlY2VpdmVyIGFuZHJvaWQ6bmFtZT0iLmZlYXR1cmVfYi5GZWF0dXJlQlJlY2VpdmVyIj4KKyAgICAgICAgPHJlY2VpdmVyIGFuZHJvaWQ6bmFtZT0iLkZlYXR1cmVCUmVjZWl2ZXIiPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLmN0cy5pc29sYXRlZHNwbGl0YXBwLkFDVElPTiIgLz4KICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0lzb2xhdGVkU3BsaXRBcHAvZmVhdHVyZV9jL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Jc29sYXRlZFNwbGl0QXBwL2ZlYXR1cmVfYy9BbmRyb2lkLm1rCmluZGV4IGYyMWQxZDAuLmQ3ZjY2ODcgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0lzb2xhdGVkU3BsaXRBcHAvZmVhdHVyZV9jL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvSXNvbGF0ZWRTcGxpdEFwcC9mZWF0dXJlX2MvQW5kcm9pZC5tawpAQCAtMTcsMTkgKzE3LDMwIEBACiBMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzSXNvbGF0ZWRTcGxpdEFwcEZlYXR1cmVDCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CiBMT0NBTF9VU0VfQUFQVDIgOj0gdHJ1ZQogTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKIExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCi1MT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzSXNvbGF0ZWRTcGxpdEFwcEZlYXR1cmVDCisKKyMgTWFrZSBzdXJlIG91ciB0ZXN0IGxvY2FsZSBwb2xpc2ggaXMgbm90IHN0cmlwcGVkLgorTE9DQUxfQUFQVF9JTkNMVURFX0FMTF9SRVNPVVJDRVMgOj0gdHJ1ZQogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1zdWJkaXItamF2YS1maWxlcykKIAorIyBHZW5lcmF0ZSBhIGxvY2FsZSBzcGxpdC4KIExPQ0FMX1BBQ0tBR0VfU1BMSVRTIDo9IHBsCiAKKyMgQ29kZSBhbmQgcmVzb3VyY2UgZGVwZW5kZW5jeSBvbiB0aGUgYmFzZS4KIExPQ0FMX0FQS19MSUJSQVJJRVMgOj0gQ3RzSXNvbGF0ZWRTcGxpdEFwcAogTE9DQUxfUkVTX0xJQlJBUklFUyA6PSAkKExPQ0FMX0FQS19MSUJSQVJJRVMpCiAKLUxPQ0FMX0FBUFRfRkxBR1MgOj0gLS1jdXN0b20tcGFja2FnZSBjb20uYW5kcm9pZC5jdHMuaXNvbGF0ZWRzcGxpdGFwcC5mZWF0dXJlX2MKLUxPQ0FMX0FBUFRfRkxBR1MgKz0gLS1wYWNrYWdlLWlkIDB4ODIKKyMgQWx0aG91Z2ggZmVhdHVyZSBzcGxpdHMgdXNlIHVuaXF1ZSByZXNvdXJjZSBwYWNrYWdlIG5hbWVzLCB0aGV5IG11c3QgYWxsCisjIGhhdmUgdGhlIHNhbWUgbWFuaWZlc3QgcGFja2FnZSBuYW1lIHRvIGJlIGNvbnNpZGVyZWQgb25lIGFwcC4KK0xPQ0FMX0FBUFRfRkxBR1MgOj0gLS1yZW5hbWUtbWFuaWZlc3QtcGFja2FnZSBjb20uYW5kcm9pZC5jdHMuaXNvbGF0ZWRzcGxpdGFwcAorCisjIFVzZSB0aGUgc2FtZSBwYWNrYWdlIElEIGFzIGZlYXR1cmUgQSwgc2luY2UgdGhpcyBpcyBhbiBpc29sYXRlZCBzcGxpdCBhbmQKKyMgd2lsbCBub3QgYmUgbG9hZGVkIHRvZ2V0aGVyIHdpdGggZmVhdHVyZSBBLgorTE9DQUxfQUFQVF9GTEFHUyArPSAtLXBhY2thZ2UtaWQgMHg4MAogCiBpbmNsdWRlICQoQlVJTERfQ1RTX1NVUFBPUlRfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0lzb2xhdGVkU3BsaXRBcHAvZmVhdHVyZV9jL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Jc29sYXRlZFNwbGl0QXBwL2ZlYXR1cmVfYy9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGFjM2E1N2YuLjY0YjA4N2MgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0lzb2xhdGVkU3BsaXRBcHAvZmVhdHVyZV9jL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvSXNvbGF0ZWRTcGxpdEFwcC9mZWF0dXJlX2MvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMTUsMTcgKzE1LDE3IEBACiAtLT4KIAogPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgcGFja2FnZT0iY29tLmFuZHJvaWQuY3RzLmlzb2xhdGVkc3BsaXRhcHAiCisgICAgICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLmN0cy5pc29sYXRlZHNwbGl0YXBwLmZlYXR1cmVfYyIKICAgICAgICAgZmVhdHVyZVNwbGl0PSJmZWF0dXJlX2MiPgogCiAgICAgPGFwcGxpY2F0aW9uPgotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuZmVhdHVyZV9jLkZlYXR1cmVDQWN0aXZpdHkiPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuRmVhdHVyZUNBY3Rpdml0eSI+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CiAgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgIDwvYWN0aXZpdHk+Ci0gICAgICAgIDxyZWNlaXZlciBhbmRyb2lkOm5hbWU9Ii5mZWF0dXJlX2MuRmVhdHVyZUNSZWNlaXZlciI+CisgICAgICAgIDxyZWNlaXZlciBhbmRyb2lkOm5hbWU9Ii5GZWF0dXJlQ1JlY2VpdmVyIj4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5jdHMuaXNvbGF0ZWRzcGxpdGFwcC5BQ1RJT04iIC8+CiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Jc29sYXRlZFNwbGl0QXBwL3NyYy9jb20vYW5kcm9pZC9jdHMvaXNvbGF0ZWRzcGxpdGFwcC9TcGxpdEFwcFRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0lzb2xhdGVkU3BsaXRBcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy9pc29sYXRlZHNwbGl0YXBwL1NwbGl0QXBwVGVzdC5qYXZhCmluZGV4IDJmNmFmMTMuLjMwMGY5NzggMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0lzb2xhdGVkU3BsaXRBcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy9pc29sYXRlZHNwbGl0YXBwL1NwbGl0QXBwVGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL0lzb2xhdGVkU3BsaXRBcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy9pc29sYXRlZHNwbGl0YXBwL1NwbGl0QXBwVGVzdC5qYXZhCkBAIC0yNyw5ICsyNywxMCBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiAKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKQEAgLTQ1LDE1ICs0NiwyMCBAQAogQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKIHB1YmxpYyBjbGFzcyBTcGxpdEFwcFRlc3QgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFID0gImNvbS5hbmRyb2lkLmN0cy5pc29sYXRlZHNwbGl0YXBwIjsKKwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbXBvbmVudE5hbWUgRkVBVFVSRV9BX0FDVElWSVRZID0KICAgICAgICAgICAgIENvbXBvbmVudE5hbWUuY3JlYXRlUmVsYXRpdmUoUEFDS0FHRSwgIi5mZWF0dXJlX2EuRmVhdHVyZUFBY3Rpdml0eSIpOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbXBvbmVudE5hbWUgRkVBVFVSRV9CX0FDVElWSVRZID0KICAgICAgICAgICAgIENvbXBvbmVudE5hbWUuY3JlYXRlUmVsYXRpdmUoUEFDS0FHRSwgIi5mZWF0dXJlX2IuRmVhdHVyZUJBY3Rpdml0eSIpOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbXBvbmVudE5hbWUgRkVBVFVSRV9DX0FDVElWSVRZID0KICAgICAgICAgICAgIENvbXBvbmVudE5hbWUuY3JlYXRlUmVsYXRpdmUoUEFDS0FHRSwgIi5mZWF0dXJlX2MuRmVhdHVyZUNBY3Rpdml0eSIpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX0FfU1RSSU5HID0gUEFDS0FHRSArICI6c3RyaW5nL2ZlYXR1cmVfYV9zdHJpbmciOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX0JfU1RSSU5HID0gUEFDS0FHRSArICI6c3RyaW5nL2ZlYXR1cmVfYl9zdHJpbmciOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX0NfU1RSSU5HID0gUEFDS0FHRSArICI6c3RyaW5nL2ZlYXR1cmVfY19zdHJpbmciOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVfQV9TVFJJTkcgPQorICAgICAgICAgICAgImNvbS5hbmRyb2lkLmN0cy5pc29sYXRlZHNwbGl0YXBwLmZlYXR1cmVfYTpzdHJpbmcvZmVhdHVyZV9hX3N0cmluZyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVfQl9TVFJJTkcgPQorICAgICAgICAgICAgImNvbS5hbmRyb2lkLmN0cy5pc29sYXRlZHNwbGl0YXBwLmZlYXR1cmVfYjpzdHJpbmcvZmVhdHVyZV9iX3N0cmluZyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVfQ19TVFJJTkcgPQorICAgICAgICAgICAgImNvbS5hbmRyb2lkLmN0cy5pc29sYXRlZHNwbGl0YXBwLmZlYXR1cmVfYzpzdHJpbmcvZmVhdHVyZV9jX3N0cmluZyI7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb25maWd1cmF0aW9uIFBMID0gbmV3IENvbmZpZ3VyYXRpb24oKTsKICAgICBzdGF0aWMgewpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvTWFqb3JWZXJzaW9uQXBwL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9NYWpvclZlcnNpb25BcHAvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDQ3Y2E1Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvTWFqb3JWZXJzaW9uQXBwL0FuZHJvaWQubWsKQEAgLTAsMCArMSwyMSBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworaW5jbHVkZSAkKGNhbGwgZmlyc3QtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9NYWpvclZlcnNpb25BcHAvVmVyc2lvbjAwMDAwMDAwMDAwMGZmZmYvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL01ham9yVmVyc2lvbkFwcC9WZXJzaW9uMDAwMDAwMDAwMDAwZmZmZi9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNjQ2OTYKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9NYWpvclZlcnNpb25BcHAvVmVyc2lvbjAwMDAwMDAwMDAwMGZmZmYvQW5kcm9pZC5tawpAQCAtMCwwICsxLDM3IEBACisjIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIC4uL3NyYy1jb21tb24pICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQorCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZHgudGVzdC5ydWxlcworCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNNYWpvclZlcnNpb24wMDAwMDAwMDAwMDBmZmZmCisKKyMgdGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCisKKyMgc2lnbiB0aGlzIGFwcCB3aXRoIGEgZGlmZmVyZW50IGNlcnQgdGhhbiBDdHNTaW1wbGVBcHBJbnN0YWxsRGlmZkNlcnQKK0xPQ0FMX0NFUlRJRklDQVRFIDo9IGN0cy9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L2NlcnRzL2N0cy10ZXN0a2V5MQorCitMT0NBTF9ERVhfUFJFT1BUIDo9IGZhbHNlCisKK2luY2x1ZGUgJChCVUlMRF9DVFNfU1VQUE9SVF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvTWFqb3JWZXJzaW9uQXBwL1ZlcnNpb24wMDAwMDAwMDAwMDBmZmZmL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9NYWpvclZlcnNpb25BcHAvVmVyc2lvbjAwMDAwMDAwMDAwMGZmZmYvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDY5ZGZhCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvTWFqb3JWZXJzaW9uQXBwL1ZlcnNpb24wMDAwMDAwMDAwMDBmZmZmL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLmN0cy5tYWpvcnZlcnNpb24iCisgICAgICAgIGFuZHJvaWQ6dmVyc2lvbkNvZGVNYWpvcj0iMHgwMDAwMDAwMCIgYW5kcm9pZDp2ZXJzaW9uQ29kZT0iMHgwMDAwZmZmZiI+CisKKyAgICA8YXBwbGljYXRpb24vPgorCisgICAgPGluc3RydW1lbnRhdGlvbgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5jdHMubWFqb3J2ZXJzaW9uIiAvPgorCis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvTWFqb3JWZXJzaW9uQXBwL1ZlcnNpb24wMDAwMDAwMDAwMDBmZmZmL3NyYy9jb20vYW5kcm9pZC9jdHMvbWFqb3J2ZXJzaW9uL1ZlcnNpb25Db25zdGFudHMuamF2YSBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL01ham9yVmVyc2lvbkFwcC9WZXJzaW9uMDAwMDAwMDAwMDAwZmZmZi9zcmMvY29tL2FuZHJvaWQvY3RzL21ham9ydmVyc2lvbi9WZXJzaW9uQ29uc3RhbnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZlOWZlZAotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL01ham9yVmVyc2lvbkFwcC9WZXJzaW9uMDAwMDAwMDAwMDAwZmZmZi9zcmMvY29tL2FuZHJvaWQvY3RzL21ham9ydmVyc2lvbi9WZXJzaW9uQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSwyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY3RzLm1ham9ydmVyc2lvbjsKKworcHVibGljIGNsYXNzIFZlcnNpb25Db25zdGFudHMgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBQQUNLQUdFX1ZFUlNJT04gPSAweDAwMDAwMDAwMDAwMGZmZmZMOworfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvTWFqb3JWZXJzaW9uQXBwL1ZlcnNpb24wMDAwMDAwMGZmZmZmZmZmL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9NYWpvclZlcnNpb25BcHAvVmVyc2lvbjAwMDAwMDAwZmZmZmZmZmYvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWU1Y2ViCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvTWFqb3JWZXJzaW9uQXBwL1ZlcnNpb24wMDAwMDAwMGZmZmZmZmZmL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzNyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCAuLi9zcmMtY29tbW9uKSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKKworTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWR4LnRlc3QucnVsZXMKKworTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzTWFqb3JWZXJzaW9uMDAwMDAwMDBmZmZmZmZmZgorCisjIHRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0CitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworCisjIHNpZ24gdGhpcyBhcHAgd2l0aCBhIGRpZmZlcmVudCBjZXJ0IHRoYW4gQ3RzU2ltcGxlQXBwSW5zdGFsbERpZmZDZXJ0CitMT0NBTF9DRVJUSUZJQ0FURSA6PSBjdHMvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9jZXJ0cy9jdHMtdGVzdGtleTEKKworTE9DQUxfREVYX1BSRU9QVCA6PSBmYWxzZQorCitpbmNsdWRlICQoQlVJTERfQ1RTX1NVUFBPUlRfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL01ham9yVmVyc2lvbkFwcC9WZXJzaW9uMDAwMDAwMDBmZmZmZmZmZi9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvTWFqb3JWZXJzaW9uQXBwL1ZlcnNpb24wMDAwMDAwMGZmZmZmZmZmL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI5ZmM5ZQotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL01ham9yVmVyc2lvbkFwcC9WZXJzaW9uMDAwMDAwMDBmZmZmZmZmZi9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5jdHMubWFqb3J2ZXJzaW9uIgorICAgICAgICBhbmRyb2lkOnZlcnNpb25Db2RlTWFqb3I9IjB4MDAwMDAwMDAiIGFuZHJvaWQ6dmVyc2lvbkNvZGU9IjB4ZmZmZmZmZmYiPgorCisgICAgPGFwcGxpY2F0aW9uLz4KKworICAgIDxpbnN0cnVtZW50YXRpb24KKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmFuZHJvaWQuY3RzLm1ham9ydmVyc2lvbiIgLz4KKworPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL01ham9yVmVyc2lvbkFwcC9WZXJzaW9uMDAwMDAwMDBmZmZmZmZmZi9zcmMvY29tL2FuZHJvaWQvY3RzL21ham9ydmVyc2lvbi9WZXJzaW9uQ29uc3RhbnRzLmphdmEgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9NYWpvclZlcnNpb25BcHAvVmVyc2lvbjAwMDAwMDAwZmZmZmZmZmYvc3JjL2NvbS9hbmRyb2lkL2N0cy9tYWpvcnZlcnNpb24vVmVyc2lvbkNvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjOWE2MmIKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9NYWpvclZlcnNpb25BcHAvVmVyc2lvbjAwMDAwMDAwZmZmZmZmZmYvc3JjL2NvbS9hbmRyb2lkL2N0cy9tYWpvcnZlcnNpb24vVmVyc2lvbkNvbnN0YW50cy5qYXZhCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5tYWpvcnZlcnNpb247CisKK3B1YmxpYyBjbGFzcyBWZXJzaW9uQ29uc3RhbnRzIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgUEFDS0FHRV9WRVJTSU9OID0gMHgwMDAwMDAwMGZmZmZmZmZmTDsKK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL01ham9yVmVyc2lvbkFwcC9WZXJzaW9uMDAwMDAwZmYwMDAwMDAwMC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvTWFqb3JWZXJzaW9uQXBwL1ZlcnNpb24wMDAwMDBmZjAwMDAwMDAwL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYxMTdhOQotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL01ham9yVmVyc2lvbkFwcC9WZXJzaW9uMDAwMDAwZmYwMDAwMDAwMC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzcgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgLi4vc3JjLWNvbW1vbikgJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCisKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkeC50ZXN0LnJ1bGVzCisKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c01ham9yVmVyc2lvbjAwMDAwMGZmMDAwMDAwMDAKKworIyB0YWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKKworIyBzaWduIHRoaXMgYXBwIHdpdGggYSBkaWZmZXJlbnQgY2VydCB0aGFuIEN0c1NpbXBsZUFwcEluc3RhbGxEaWZmQ2VydAorTE9DQUxfQ0VSVElGSUNBVEUgOj0gY3RzL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvY2VydHMvY3RzLXRlc3RrZXkxCisKK0xPQ0FMX0RFWF9QUkVPUFQgOj0gZmFsc2UKKworaW5jbHVkZSAkKEJVSUxEX0NUU19TVVBQT1JUX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9NYWpvclZlcnNpb25BcHAvVmVyc2lvbjAwMDAwMGZmMDAwMDAwMDAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL01ham9yVmVyc2lvbkFwcC9WZXJzaW9uMDAwMDAwZmYwMDAwMDAwMC9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjYWZhOTIKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9NYWpvclZlcnNpb25BcHAvVmVyc2lvbjAwMDAwMGZmMDAwMDAwMDAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgcGFja2FnZT0iY29tLmFuZHJvaWQuY3RzLm1ham9ydmVyc2lvbiIKKyAgICAgICAgYW5kcm9pZDp2ZXJzaW9uQ29kZU1ham9yPSIweDAwMDAwMGZmIiBhbmRyb2lkOnZlcnNpb25Db2RlPSIweDAwMDAwMDAwIj4KKworICAgIDxhcHBsaWNhdGlvbi8+CisKKyAgICA8aW5zdHJ1bWVudGF0aW9uCisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5hbmRyb2lkLmN0cy5tYWpvcnZlcnNpb24iIC8+CisKKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9NYWpvclZlcnNpb25BcHAvVmVyc2lvbjAwMDAwMGZmMDAwMDAwMDAvc3JjL2NvbS9hbmRyb2lkL2N0cy9tYWpvcnZlcnNpb24vVmVyc2lvbkNvbnN0YW50cy5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvTWFqb3JWZXJzaW9uQXBwL1ZlcnNpb24wMDAwMDBmZjAwMDAwMDAwL3NyYy9jb20vYW5kcm9pZC9jdHMvbWFqb3J2ZXJzaW9uL1ZlcnNpb25Db25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTEwMTM5Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvTWFqb3JWZXJzaW9uQXBwL1ZlcnNpb24wMDAwMDBmZjAwMDAwMDAwL3NyYy9jb20vYW5kcm9pZC9jdHMvbWFqb3J2ZXJzaW9uL1ZlcnNpb25Db25zdGFudHMuamF2YQpAQCAtMCwwICsxLDIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5jdHMubWFqb3J2ZXJzaW9uOworCitwdWJsaWMgY2xhc3MgVmVyc2lvbkNvbnN0YW50cyB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIFBBQ0tBR0VfVkVSU0lPTiA9IDB4MDAwMDAwZmYwMDAwMDAwMEw7Cit9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9NYWpvclZlcnNpb25BcHAvVmVyc2lvbjAwMDAwMGZmZmZmZmZmZmYvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL01ham9yVmVyc2lvbkFwcC9WZXJzaW9uMDAwMDAwZmZmZmZmZmZmZi9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmODA4NDMKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9NYWpvclZlcnNpb25BcHAvVmVyc2lvbjAwMDAwMGZmZmZmZmZmZmYvQW5kcm9pZC5tawpAQCAtMCwwICsxLDM3IEBACisjIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIC4uL3NyYy1jb21tb24pICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQorCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZHgudGVzdC5ydWxlcworCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNNYWpvclZlcnNpb24wMDAwMDBmZmZmZmZmZmZmCisKKyMgdGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCisKKyMgc2lnbiB0aGlzIGFwcCB3aXRoIGEgZGlmZmVyZW50IGNlcnQgdGhhbiBDdHNTaW1wbGVBcHBJbnN0YWxsRGlmZkNlcnQKK0xPQ0FMX0NFUlRJRklDQVRFIDo9IGN0cy9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L2NlcnRzL2N0cy10ZXN0a2V5MQorCitMT0NBTF9ERVhfUFJFT1BUIDo9IGZhbHNlCisKK2luY2x1ZGUgJChCVUlMRF9DVFNfU1VQUE9SVF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvTWFqb3JWZXJzaW9uQXBwL1ZlcnNpb24wMDAwMDBmZmZmZmZmZmZmL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9NYWpvclZlcnNpb25BcHAvVmVyc2lvbjAwMDAwMGZmZmZmZmZmZmYvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGE2ZDYzCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvTWFqb3JWZXJzaW9uQXBwL1ZlcnNpb24wMDAwMDBmZmZmZmZmZmZmL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLmN0cy5tYWpvcnZlcnNpb24iCisgICAgICAgIGFuZHJvaWQ6dmVyc2lvbkNvZGVNYWpvcj0iMHgwMDAwMDBmZiIgYW5kcm9pZDp2ZXJzaW9uQ29kZT0iMHhmZmZmZmZmZiI+CisKKyAgICA8YXBwbGljYXRpb24vPgorCisgICAgPGluc3RydW1lbnRhdGlvbgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5jdHMubWFqb3J2ZXJzaW9uIiAvPgorCis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvTWFqb3JWZXJzaW9uQXBwL1ZlcnNpb24wMDAwMDBmZmZmZmZmZmZmL3NyYy9jb20vYW5kcm9pZC9jdHMvbWFqb3J2ZXJzaW9uL1ZlcnNpb25Db25zdGFudHMuamF2YSBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL01ham9yVmVyc2lvbkFwcC9WZXJzaW9uMDAwMDAwZmZmZmZmZmZmZi9zcmMvY29tL2FuZHJvaWQvY3RzL21ham9ydmVyc2lvbi9WZXJzaW9uQ29uc3RhbnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVhZDk5NgotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL01ham9yVmVyc2lvbkFwcC9WZXJzaW9uMDAwMDAwZmZmZmZmZmZmZi9zcmMvY29tL2FuZHJvaWQvY3RzL21ham9ydmVyc2lvbi9WZXJzaW9uQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSwyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY3RzLm1ham9ydmVyc2lvbjsKKworcHVibGljIGNsYXNzIFZlcnNpb25Db25zdGFudHMgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBQQUNLQUdFX1ZFUlNJT04gPSAweDAwMDAwMGZmZmZmZmZmZmZMOworfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvTWFqb3JWZXJzaW9uQXBwL3NyYy1jb21tb24vY29tL2FuZHJvaWQvY3RzL21ham9ydmVyc2lvbi9WZXJzaW9uVGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvTWFqb3JWZXJzaW9uQXBwL3NyYy1jb21tb24vY29tL2FuZHJvaWQvY3RzL21ham9ydmVyc2lvbi9WZXJzaW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMWE3MjQKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9NYWpvclZlcnNpb25BcHAvc3JjLWNvbW1vbi9jb20vYW5kcm9pZC9jdHMvbWFqb3J2ZXJzaW9uL1ZlcnNpb25UZXN0LmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY3RzLm1ham9ydmVyc2lvbjsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlSW5mbzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKK0BSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgVmVyc2lvblRlc3QgeworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENoZWNrVmVyc2lvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBQYWNrYWdlTWFuYWdlciBwbSA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKS5nZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICBQYWNrYWdlSW5mbyBwaSA9IHBtLmdldFBhY2thZ2VJbmZvKEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKS5nZXRQYWNrYWdlTmFtZSgpLAorICAgICAgICAgICAgICAgIDApOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5hbmRyb2lkLmN0cy5tYWpvcnZlcnNpb24iLAorICAgICAgICAgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKS5nZXRQYWNrYWdlTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFZlcnNpb25Db25zdGFudHMuUEFDS0FHRV9WRVJTSU9OLCBwaS5nZXRMb25nVmVyc2lvbkNvZGUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvTXVsdGlVc2VyU3RvcmFnZUFwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvTXVsdGlVc2VyU3RvcmFnZUFwcC9BbmRyb2lkLm1rCmluZGV4IDA3NDQ4MzQuLmE1ODA3ZjAgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL011bHRpVXNlclN0b3JhZ2VBcHAvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9NdWx0aVVzZXJTdG9yYWdlQXBwL0FuZHJvaWQubWsKQEAgLTE4LDcgKzE4LDkgQEAKIAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKIExPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLXN1cHBvcnQtdGVzdCBsZWdhY3ktYW5kcm9pZC10ZXN0CitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZHgudGVzdC5ydWxlcworCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicwogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpIFwKICAgICAuLi9FeHRlcm5hbFN0b3JhZ2VBcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy9leHRlcm5hbHN0b3JhZ2VhcHAvQ29tbW9uRXh0ZXJuYWxTdG9yYWdlVGVzdC5qYXZhCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9NdWx0aVVzZXJTdG9yYWdlQXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9NdWx0aVVzZXJTdG9yYWdlQXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggOGI1OTlmMi4uY2I3Y2Y1YyAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvTXVsdGlVc2VyU3RvcmFnZUFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL011bHRpVXNlclN0b3JhZ2VBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjAsNyArMjAsNyBAQAogICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KICAgICA8L2FwcGxpY2F0aW9uPgogCi0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5jdHMubXVsdGl1c2Vyc3RvcmFnZWFwcCIgLz4KIAogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uV1JJVEVfRVhURVJOQUxfU1RPUkFHRSIgLz4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL05vUmVzdGFydEFwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvTm9SZXN0YXJ0QXBwL0FuZHJvaWQubWsKaW5kZXggMzJmMzZkMC4uMTc5N2M3NSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvTm9SZXN0YXJ0QXBwL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvTm9SZXN0YXJ0QXBwL0FuZHJvaWQubWsKQEAgLTIwLDE0ICsyMCwxOSBAQAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogTE9DQUxfUkVTT1VSQ0VfRElSIDo9ICQoTE9DQUxfUEFUSCkvcmVzCiAKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkeC50ZXN0LnJ1bGVzCisKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNOb1Jlc3RhcnRCYXNlCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CiAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMgY3RzX2luc3RhbnQKIAogTE9DQUxfUFJPR1VBUkRfRU5BQkxFRCA6PSBkaXNhYmxlZAogTE9DQUxfREVYX1BSRU9QVCA6PSBmYWxzZQogCitMT0NBTF9TREtfVkVSU0lPTiA6PSB0ZXN0X2N1cnJlbnQKKwogaW5jbHVkZSAkKEJVSUxEX0NUU19TVVBQT1JUX1BBQ0tBR0UpCiAKIApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvTm9SZXN0YXJ0QXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Ob1Jlc3RhcnRBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA3MTQwMzMzLi4wZDJkZWQ1IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Ob1Jlc3RhcnRBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Ob1Jlc3RhcnRBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMTYsMjAgKzE2LDIxIEBACiA8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgogICAgIHhtbG5zOnRvb2xzPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS90b29scyIKICAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5jdHMubm9yZXN0YXJ0IgorICAgIGFuZHJvaWQ6dGFyZ2V0U2FuZGJveFZlcnNpb249IjIiCiAgICAgdG9vbHM6aWdub3JlPSJNaXNzaW5nVmVyc2lvbiIgPgogCi0gICAgPHVzZXMtc2RrCi0gICAgICAgIGFuZHJvaWQ6bWluU2RrVmVyc2lvbj0iOCIKLSAgICAgICAgYW5kcm9pZDp0YXJnZXRTZGtWZXJzaW9uPSIyMyIgLz4KLQogICAgIDxhcHBsaWNhdGlvbgogICAgICAgICB0b29sczppZ25vcmU9IkFsbG93QmFja3VwLE1pc3NpbmdBcHBsaWNhdGlvbkljb24iID4KICAgICAgICAgPGFjdGl2aXR5CiAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9Ii5Ob1Jlc3RhcnRBY3Rpdml0eSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF1bmNoTW9kZT0ic2luZ2xlVG9wIiA+CisgICAgICAgICAgICBhbmRyb2lkOmxhdW5jaE1vZGU9InNpbmdsZVRvcCI+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KLSAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuY3RzLm5vcmVzdGFydC5TVEFSVCIgLz4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlZJRVciIC8+CiAgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuREVGQVVMVCIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5CUk9XU0FCTEUiIC8+CisgICAgICAgICAgICAgICAgPGRhdGEgYW5kcm9pZDpzY2hlbWU9Imh0dHBzIiAvPgorICAgICAgICAgICAgICAgIDxkYXRhIGFuZHJvaWQ6aG9zdD0iZm9vLmNvbSIgLz4KKyAgICAgICAgICAgICAgICA8ZGF0YSBhbmRyb2lkOnBhdGg9Ii9iYXIiIC8+CiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CkBAIC0zNyw0ICszOCw4IEBACiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgICAgICA8L2FjdGl2aXR5PgogICAgIDwvYXBwbGljYXRpb24+CisKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmFuZHJvaWQuY3RzLm5vcmVzdGFydCIgLz4KKwogPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL05vUmVzdGFydEFwcC9mZWF0dXJlL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Ob1Jlc3RhcnRBcHAvZmVhdHVyZS9BbmRyb2lkLm1rCmluZGV4IDYyNmMwYmUuLjM1NThlYjcgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL05vUmVzdGFydEFwcC9mZWF0dXJlL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvTm9SZXN0YXJ0QXBwL2ZlYXR1cmUvQW5kcm9pZC5tawpAQCAtMjEsOSArMjEsMTAgQEAKIExPQ0FMX1JFU09VUkNFX0RJUiA6PSAkKExPQ0FMX1BBVEgpL3JlcwogCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzTm9SZXN0YXJ0RmVhdHVyZQorTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAogCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzIGN0c19pbnN0YW50CiAKIExPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKIExPQ0FMX0RFWF9QUkVPUFQgOj0gZmFsc2UKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL05vUmVzdGFydEFwcC9mZWF0dXJlL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Ob1Jlc3RhcnRBcHAvZmVhdHVyZS9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGIyZmEzZTguLmY5OGNiMGQgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL05vUmVzdGFydEFwcC9mZWF0dXJlL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvTm9SZXN0YXJ0QXBwL2ZlYXR1cmUvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMTYsMTMgKzE2LDEwIEBACiA8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgogICAgIHhtbG5zOnRvb2xzPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS90b29scyIKICAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5jdHMubm9yZXN0YXJ0IgorICAgIGFuZHJvaWQ6dGFyZ2V0U2FuZGJveFZlcnNpb249IjIiCiAgICAgc3BsaXQ9ImZlYXR1cmUiCiAgICAgdG9vbHM6aWdub3JlPSJNaXNzaW5nVmVyc2lvbiIgPgogCi0gICAgPHVzZXMtc2RrCi0gICAgICAgIGFuZHJvaWQ6bWluU2RrVmVyc2lvbj0iOCIKLSAgICAgICAgYW5kcm9pZDp0YXJnZXRTZGtWZXJzaW9uPSIyMyIgLz4KLQogICAgIDxhcHBsaWNhdGlvbgogICAgICAgICBhbmRyb2lkOmFsbG93QmFja3VwPSJmYWxzZSIKICAgICAgICAgdG9vbHM6aWdub3JlPSJNaXNzaW5nQXBwbGljYXRpb25JY29uIiA+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Ob1Jlc3RhcnRBcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy9ub3Jlc3RhcnQvTm9SZXN0YXJ0QWN0aXZpdHkuamF2YSBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL05vUmVzdGFydEFwcC9zcmMvY29tL2FuZHJvaWQvY3RzL25vcmVzdGFydC9Ob1Jlc3RhcnRBY3Rpdml0eS5qYXZhCmluZGV4IDI2ZDU3MTIuLjA5ZWE4YmQgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL05vUmVzdGFydEFwcC9zcmMvY29tL2FuZHJvaWQvY3RzL25vcmVzdGFydC9Ob1Jlc3RhcnRBY3Rpdml0eS5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL05vUmVzdGFydEFwcC9zcmMvY29tL2FuZHJvaWQvY3RzL25vcmVzdGFydC9Ob1Jlc3RhcnRBY3Rpdml0eS5qYXZhCkBAIC0xNiwzNSArMTYsMzggQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5jdHMubm9yZXN0YXJ0OwogCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUNhbGxiYWNrOwogaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy5ub3Jlc3RhcnQuUjsKIAogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiAKIHB1YmxpYyBjbGFzcyBOb1Jlc3RhcnRBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKLSAgICBwcml2YXRlIGludCBtQ3JlYXRlQ291bnQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHNDcmVhdGVDb3VudDsKICAgICBwcml2YXRlIGludCBtTmV3SW50ZW50Q291bnQ7CiAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CiAgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0Lm5vX3Jlc3RhcnRfYWN0aXZpdHkpOwotICAgICAgICBtQ3JlYXRlQ291bnQrKzsKLSAgICAgICAgc2VuZEJyb2FkY2FzdCgpOworICAgICAgICBzQ3JlYXRlQ291bnQrKzsKKyAgICAgICAgZmluYWwgUmVtb3RlQ2FsbGJhY2sgY2FsbGJhY2sgPSBnZXRJbnRlbnQoKS5nZXRQYXJjZWxhYmxlRXh0cmEoIlJFU1BPTlNFIik7CisgICAgICAgIHNlbmRSZXNwb25zZShjYWxsYmFjayk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25OZXdJbnRlbnQoSW50ZW50IGludGVudCkgewogICAgICAgICBzdXBlci5vbk5ld0ludGVudChpbnRlbnQpOwogICAgICAgICBtTmV3SW50ZW50Q291bnQrKzsKLSAgICAgICAgc2VuZEJyb2FkY2FzdCgpOworICAgICAgICBmaW5hbCBSZW1vdGVDYWxsYmFjayBjYWxsYmFjayA9IGludGVudC5nZXRQYXJjZWxhYmxlRXh0cmEoIlJFU1BPTlNFIik7CisgICAgICAgIHNlbmRSZXNwb25zZShjYWxsYmFjayk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHNlbmRCcm9hZGNhc3QoKSB7Ci0gICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KCJjb20uYW5kcm9pZC5jdHMubm9yZXN0YXJ0LkJST0FEQ0FTVCIpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoIkNSRUFURV9DT1VOVCIsIG1DcmVhdGVDb3VudCk7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYSgiTkVXX0lOVEVOVF9DT1VOVCIsIG1OZXdJbnRlbnRDb3VudCk7Ci0gICAgICAgIHNlbmRCcm9hZGNhc3QoaW50ZW50KTsKKyAgICBwcml2YXRlIHZvaWQgc2VuZFJlc3BvbnNlKFJlbW90ZUNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIGZpbmFsIEJ1bmRsZSBwYXlsb2FkID0gbmV3IEJ1bmRsZSgpOworICAgICAgICBwYXlsb2FkLnB1dEludCgiQ1JFQVRFX0NPVU5UIiwgc0NyZWF0ZUNvdW50KTsKKyAgICAgICAgcGF5bG9hZC5wdXRJbnQoIk5FV19JTlRFTlRfQ09VTlQiLCBtTmV3SW50ZW50Q291bnQpOworICAgICAgICBjYWxsYmFjay5zZW5kUmVzdWx0KHBheWxvYWQpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL05vUmVzdGFydEFwcC9zcmMvY29tL2FuZHJvaWQvY3RzL25vcmVzdGFydC9Ob1Jlc3RhcnRUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Ob1Jlc3RhcnRBcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy9ub3Jlc3RhcnQvTm9SZXN0YXJ0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ODJlZDcKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Ob1Jlc3RhcnRBcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy9ub3Jlc3RhcnQvTm9SZXN0YXJ0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5ub3Jlc3RhcnQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworCitAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIE5vUmVzdGFydFRlc3QgeworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBva2VGdWxsQXBwKCkgeworICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOworICAgICAgICBpbnRlbnQuc2V0Q2xhc3NOYW1lKCJjb20uYW5kcm9pZC5jdHMuc3BsaXRhcHAiLCAiY29tLmFuZHJvaWQuY3RzLnNwbGl0YXBwLk15QWN0aXZpdHkiKTsKKyAgICAgICAgaW50ZW50LmFkZENhdGVnb3J5KEludGVudC5DQVRFR09SWV9ERUZBVUxUKTsKKyAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLKTsKKyAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpLnN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9PcmRlcmVkQWN0aXZpdHlBcHAvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL09yZGVyZWRBY3Rpdml0eUFwcC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ODRjNjAKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9PcmRlcmVkQWN0aXZpdHlBcHAvQW5kcm9pZC5tawpAQCAtMCwwICsxLDMwIEBACisjIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkeC50ZXN0LnJ1bGVzCisjIHRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0CitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQorTE9DQUxfU0RLX1ZFUlNJT04gOj0gMjMKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNPcmRlcmVkQWN0aXZpdHlBcHAKK0xPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKK0xPQ0FMX0RFWF9QUkVPUFQgOj0gZmFsc2UKKworaW5jbHVkZSAkKEJVSUxEX0NUU19TVVBQT1JUX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9PcmRlcmVkQWN0aXZpdHlBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL09yZGVyZWRBY3Rpdml0eUFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZWZmZjIKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9PcmRlcmVkQWN0aXZpdHlBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDEzNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIHBhY2thZ2U9ImFuZHJvaWQuYXBwc2VjdXJpdHkuY3RzLm9yZGVyZWRhY3Rpdml0eSIKKyAgICAgICAgYW5kcm9pZDp2ZXJzaW9uQ29kZT0iMTAiCisgICAgICAgIGFuZHJvaWQ6dmVyc2lvbk5hbWU9IjEuMCI+CisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYXBwX25hbWUiPgorICAgICAgICA8IS0tIEFjdGl2aXRpZXMgdXNlZCBmb3IgcXVlcmllcyAtLT4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLk9yZGVyQWN0aXZpdHkyIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JkZXI9IjIiPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmN0cy5pbnRlbnQuYWN0aW9uLk9SREVSRUQiIC8+CisgICAgICAgICAgICAgICAgPGRhdGEgYW5kcm9pZDpzY2hlbWU9Imh0dHBzIgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aG9zdD0id3d3Lmdvb2dsZS5jb20iCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYXRoUHJlZml4PSIvY3RzL3BhY2thZ2UiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5PcmRlckFjdGl2aXR5MSI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOm9yZGVyPSIxIj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5jdHMuaW50ZW50LmFjdGlvbi5PUkRFUkVEIiAvPgorICAgICAgICAgICAgICAgIDxkYXRhIGFuZHJvaWQ6c2NoZW1lPSJodHRwcyIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmhvc3Q9Ind3dy5nb29nbGUuY29tIgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGF0aD0iL2N0cy9wYWNrYWdlcmVzb2x1dGlvbiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLk9yZGVyQWN0aXZpdHlEZWZhdWx0Ij4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDwhLS0gZGVmYXVsdCBvcmRlciAtLT4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5jdHMuaW50ZW50LmFjdGlvbi5PUkRFUkVEIiAvPgorICAgICAgICAgICAgICAgIDxkYXRhIGFuZHJvaWQ6c2NoZW1lPSJodHRwcyIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmhvc3Q9Ind3dy5nb29nbGUuY29tIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuT3JkZXJBY3Rpdml0eTMiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpvcmRlcj0iMyI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuY3RzLmludGVudC5hY3Rpb24uT1JERVJFRCIgLz4KKyAgICAgICAgICAgICAgICA8ZGF0YSBhbmRyb2lkOnNjaGVtZT0iaHR0cHMiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpob3N0PSJ3d3cuZ29vZ2xlLmNvbSIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhdGhQcmVmaXg9Ii9jdHMiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPCEtLSBTZXJ2aWNlcyB1c2VkIGZvciBxdWVyaWVzIC0tPgorICAgICAgICA8c2VydmljZSBhbmRyb2lkOm5hbWU9Ii5PcmRlclNlcnZpY2VEZWZhdWx0Ij4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDwhLS0gZGVmYXVsdCBvcmRlciAtLT4KKyAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuY3RzLmludGVudC5hY3Rpb24uT1JERVJFRCIgLz4KKyAgICAgICAgICAgICAgICA8ZGF0YSBhbmRyb2lkOnNjaGVtZT0iaHR0cHMiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpob3N0PSJ3d3cuZ29vZ2xlLmNvbSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9zZXJ2aWNlPgorICAgICAgICA8c2VydmljZSBhbmRyb2lkOm5hbWU9Ii5PcmRlclNlcnZpY2UyIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JkZXI9IjIiPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmN0cy5pbnRlbnQuYWN0aW9uLk9SREVSRUQiIC8+CisgICAgICAgICAgICAgICAgPGRhdGEgYW5kcm9pZDpzY2hlbWU9Imh0dHBzIgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aG9zdD0id3d3Lmdvb2dsZS5jb20iCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYXRoUHJlZml4PSIvY3RzL3BhY2thZ2UiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvc2VydmljZT4KKyAgICAgICAgPHNlcnZpY2UgYW5kcm9pZDpuYW1lPSIuT3JkZXJTZXJ2aWNlMyI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOm9yZGVyPSIzIj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5jdHMuaW50ZW50LmFjdGlvbi5PUkRFUkVEIiAvPgorICAgICAgICAgICAgICAgIDxkYXRhIGFuZHJvaWQ6c2NoZW1lPSJodHRwcyIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmhvc3Q9Ind3dy5nb29nbGUuY29tIgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGF0aFByZWZpeD0iL2N0cyIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9zZXJ2aWNlPgorICAgICAgICA8c2VydmljZSBhbmRyb2lkOm5hbWU9Ii5PcmRlclNlcnZpY2UxIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JkZXI9IjEiPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmN0cy5pbnRlbnQuYWN0aW9uLk9SREVSRUQiIC8+CisgICAgICAgICAgICAgICAgPGRhdGEgYW5kcm9pZDpzY2hlbWU9Imh0dHBzIgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aG9zdD0id3d3Lmdvb2dsZS5jb20iCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYXRoPSIvY3RzL3BhY2thZ2VyZXNvbHV0aW9uIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L3NlcnZpY2U+CisKKyAgICAgICAgPCEtLSBCcm9hZGNhc3QgcmVjZWl2ZXJzIHVzZWQgZm9yIHF1ZXJpZXMgLS0+CisgICAgICAgIDxyZWNlaXZlciBhbmRyb2lkOm5hbWU9Ii5PcmRlclJlY2VpdmVyMyI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOm9yZGVyPSIzIj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5jdHMuaW50ZW50LmFjdGlvbi5PUkRFUkVEIiAvPgorICAgICAgICAgICAgICAgIDxkYXRhIGFuZHJvaWQ6c2NoZW1lPSJodHRwcyIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmhvc3Q9Ind3dy5nb29nbGUuY29tIgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGF0aFByZWZpeD0iL2N0cyIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9yZWNlaXZlcj4KKyAgICAgICAgPHJlY2VpdmVyIGFuZHJvaWQ6bmFtZT0iLk9yZGVyUmVjZWl2ZXJEZWZhdWx0Ij4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDwhLS0gZGVmYXVsdCBvcmRlciAtLT4KKyAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuY3RzLmludGVudC5hY3Rpb24uT1JERVJFRCIgLz4KKyAgICAgICAgICAgICAgICA8ZGF0YSBhbmRyb2lkOnNjaGVtZT0iaHR0cHMiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpob3N0PSJ3d3cuZ29vZ2xlLmNvbSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9yZWNlaXZlcj4KKyAgICAgICAgPHJlY2VpdmVyIGFuZHJvaWQ6bmFtZT0iLk9yZGVyUmVjZWl2ZXIxIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JkZXI9IjEiPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmN0cy5pbnRlbnQuYWN0aW9uLk9SREVSRUQiIC8+CisgICAgICAgICAgICAgICAgPGRhdGEgYW5kcm9pZDpzY2hlbWU9Imh0dHBzIgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aG9zdD0id3d3Lmdvb2dsZS5jb20iCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYXRoPSIvY3RzL3BhY2thZ2VyZXNvbHV0aW9uIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L3JlY2VpdmVyPgorICAgICAgICA8cmVjZWl2ZXIgYW5kcm9pZDpuYW1lPSIuT3JkZXJSZWNlaXZlcjIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpvcmRlcj0iMiI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuY3RzLmludGVudC5hY3Rpb24uT1JERVJFRCIgLz4KKyAgICAgICAgICAgICAgICA8ZGF0YSBhbmRyb2lkOnNjaGVtZT0iaHR0cHMiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpob3N0PSJ3d3cuZ29vZ2xlLmNvbSIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhdGhQcmVmaXg9Ii9jdHMvcGFja2FnZSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9yZWNlaXZlcj4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmFwcHNlY3VyaXR5LmN0cy5vcmRlcmVkYWN0aXZpdHkiIC8+Cis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvT3JkZXJlZEFjdGl2aXR5QXBwL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9PcmRlcmVkQWN0aXZpdHlBcHAvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGQ1YTk1Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvT3JkZXJlZEFjdGl2aXR5QXBwL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPHJlc291cmNlcz4KKyAgICA8c3RyaW5nIG5hbWU9ImFwcF9uYW1lIj5UaW55IEFwcCBmb3IgQ1RTPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL09yZGVyZWRBY3Rpdml0eUFwcC9zcmMvYW5kcm9pZC9hcHBzZWN1cml0eS9jdHMvb3JkZXJlZGFjdGl2aXR5L1BhY2thZ2VSZXNvbHV0aW9uVGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvT3JkZXJlZEFjdGl2aXR5QXBwL3NyYy9hbmRyb2lkL2FwcHNlY3VyaXR5L2N0cy9vcmRlcmVkYWN0aXZpdHkvUGFja2FnZVJlc29sdXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNlM2ZhMgotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL09yZGVyZWRBY3Rpdml0eUFwcC9zcmMvYW5kcm9pZC9hcHBzZWN1cml0eS9jdHMvb3JkZXJlZGFjdGl2aXR5L1BhY2thZ2VSZXNvbHV0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYXBwc2VjdXJpdHkuY3RzLm9yZGVyZWRhY3Rpdml0eTsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlJlc29sdmVJbmZvOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIFBhY2thZ2VSZXNvbHV0aW9uVGVzdCB7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBxdWVyeUFjdGl2aXR5T3JkZXJlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBQYWNrYWdlTWFuYWdlciBwbSA9CisgICAgICAgICAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KCJhbmRyb2lkLmN0cy5pbnRlbnQuYWN0aW9uLk9SREVSRUQiKTsKKyAgICAgICAgaW50ZW50LnNldERhdGEoVXJpLnBhcnNlKCJodHRwczovL3d3dy5nb29nbGUuY29tL2N0cy9wYWNrYWdlcmVzb2x1dGlvbiIpKTsKKyAgICAgICAgZmluYWwgTGlzdDxSZXNvbHZlSW5mbz4gcmVzb2x2ZSA9IHBtLnF1ZXJ5SW50ZW50QWN0aXZpdGllcyhpbnRlbnQsIDAgLypmbGFncyovKTsKKworICAgICAgICBhc3NlcnROb3ROdWxsKHJlc29sdmUpOworICAgICAgICBhc3NlcnRFcXVhbHMoNCwgcmVzb2x2ZS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFuZHJvaWQuYXBwc2VjdXJpdHkuY3RzLm9yZGVyZWRhY3Rpdml0eS5PcmRlckFjdGl2aXR5MyIsCisgICAgICAgICAgICAgICAgcmVzb2x2ZS5nZXQoMCkuYWN0aXZpdHlJbmZvLm5hbWUpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFuZHJvaWQuYXBwc2VjdXJpdHkuY3RzLm9yZGVyZWRhY3Rpdml0eS5PcmRlckFjdGl2aXR5MiIsCisgICAgICAgICAgICAgICAgcmVzb2x2ZS5nZXQoMSkuYWN0aXZpdHlJbmZvLm5hbWUpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFuZHJvaWQuYXBwc2VjdXJpdHkuY3RzLm9yZGVyZWRhY3Rpdml0eS5PcmRlckFjdGl2aXR5MSIsCisgICAgICAgICAgICAgICAgcmVzb2x2ZS5nZXQoMikuYWN0aXZpdHlJbmZvLm5hbWUpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFuZHJvaWQuYXBwc2VjdXJpdHkuY3RzLm9yZGVyZWRhY3Rpdml0eS5PcmRlckFjdGl2aXR5RGVmYXVsdCIsCisgICAgICAgICAgICAgICAgcmVzb2x2ZS5nZXQoMykuYWN0aXZpdHlJbmZvLm5hbWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcXVlcnlTZXJ2aWNlT3JkZXJlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBQYWNrYWdlTWFuYWdlciBwbSA9CisgICAgICAgICAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KCJhbmRyb2lkLmN0cy5pbnRlbnQuYWN0aW9uLk9SREVSRUQiKTsKKyAgICAgICAgaW50ZW50LnNldERhdGEoVXJpLnBhcnNlKCJodHRwczovL3d3dy5nb29nbGUuY29tL2N0cy9wYWNrYWdlcmVzb2x1dGlvbiIpKTsKKyAgICAgICAgZmluYWwgTGlzdDxSZXNvbHZlSW5mbz4gcmVzb2x2ZSA9IHBtLnF1ZXJ5SW50ZW50U2VydmljZXMoaW50ZW50LCAwIC8qZmxhZ3MqLyk7CisgICAgICAgIAorICAgICAgICBhc3NlcnROb3ROdWxsKHJlc29sdmUpOworICAgICAgICBhc3NlcnRFcXVhbHMoNCwgcmVzb2x2ZS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFuZHJvaWQuYXBwc2VjdXJpdHkuY3RzLm9yZGVyZWRhY3Rpdml0eS5PcmRlclNlcnZpY2UzIiwKKyAgICAgICAgICAgICAgICByZXNvbHZlLmdldCgwKS5zZXJ2aWNlSW5mby5uYW1lKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhbmRyb2lkLmFwcHNlY3VyaXR5LmN0cy5vcmRlcmVkYWN0aXZpdHkuT3JkZXJTZXJ2aWNlMiIsCisgICAgICAgICAgICAgICAgcmVzb2x2ZS5nZXQoMSkuc2VydmljZUluZm8ubmFtZSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYW5kcm9pZC5hcHBzZWN1cml0eS5jdHMub3JkZXJlZGFjdGl2aXR5Lk9yZGVyU2VydmljZTEiLAorICAgICAgICAgICAgICAgIHJlc29sdmUuZ2V0KDIpLnNlcnZpY2VJbmZvLm5hbWUpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFuZHJvaWQuYXBwc2VjdXJpdHkuY3RzLm9yZGVyZWRhY3Rpdml0eS5PcmRlclNlcnZpY2VEZWZhdWx0IiwKKyAgICAgICAgICAgICAgICByZXNvbHZlLmdldCgzKS5zZXJ2aWNlSW5mby5uYW1lKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHF1ZXJ5UmVjZWl2ZXJPcmRlcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFBhY2thZ2VNYW5hZ2VyIHBtID0KKyAgICAgICAgICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKS5nZXRDb250ZXh0KCkuZ2V0UGFja2FnZU1hbmFnZXIoKTsKKyAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoImFuZHJvaWQuY3RzLmludGVudC5hY3Rpb24uT1JERVJFRCIpOworICAgICAgICBpbnRlbnQuc2V0RGF0YShVcmkucGFyc2UoImh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vY3RzL3BhY2thZ2VyZXNvbHV0aW9uIikpOworICAgICAgICBmaW5hbCBMaXN0PFJlc29sdmVJbmZvPiByZXNvbHZlID0gcG0ucXVlcnlCcm9hZGNhc3RSZWNlaXZlcnMoaW50ZW50LCAwIC8qZmxhZ3MqLyk7CisgICAgICAgIAorICAgICAgICBhc3NlcnROb3ROdWxsKHJlc29sdmUpOworICAgICAgICBhc3NlcnRFcXVhbHMoNCwgcmVzb2x2ZS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFuZHJvaWQuYXBwc2VjdXJpdHkuY3RzLm9yZGVyZWRhY3Rpdml0eS5PcmRlclJlY2VpdmVyMyIsCisgICAgICAgICAgICAgICAgcmVzb2x2ZS5nZXQoMCkuYWN0aXZpdHlJbmZvLm5hbWUpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFuZHJvaWQuYXBwc2VjdXJpdHkuY3RzLm9yZGVyZWRhY3Rpdml0eS5PcmRlclJlY2VpdmVyMiIsCisgICAgICAgICAgICAgICAgcmVzb2x2ZS5nZXQoMSkuYWN0aXZpdHlJbmZvLm5hbWUpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFuZHJvaWQuYXBwc2VjdXJpdHkuY3RzLm9yZGVyZWRhY3Rpdml0eS5PcmRlclJlY2VpdmVyMSIsCisgICAgICAgICAgICAgICAgcmVzb2x2ZS5nZXQoMikuYWN0aXZpdHlJbmZvLm5hbWUpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFuZHJvaWQuYXBwc2VjdXJpdHkuY3RzLm9yZGVyZWRhY3Rpdml0eS5PcmRlclJlY2VpdmVyRGVmYXVsdCIsCisgICAgICAgICAgICAgICAgcmVzb2x2ZS5nZXQoMykuYWN0aXZpdHlJbmZvLm5hbWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL092ZXJsYXlBcHAvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL092ZXJsYXlBcHAvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTM2NmE1Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvT3ZlcmxheUFwcC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjggQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c092ZXJsYXlBcHAKKworIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAoraW5jbHVkZSAkKEJVSUxEX0NUU19TVVBQT1JUX1BBQ0tBR0UpCisKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL092ZXJsYXlBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL092ZXJsYXlBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzAzNmIyCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvT3ZlcmxheUFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iY29tLmFuZHJvaWQuY3RzLm92ZXJsYXlhcHAiPgorICAgIDxvdmVybGF5IGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZCIgLz4KKworICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmhhc0NvZGU9ImZhbHNlIiAvPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL092ZXJsYXlBcHAvcmVzL3ZhbHVlcy92YWx1ZXMueG1sIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvT3ZlcmxheUFwcC9yZXMvdmFsdWVzL3ZhbHVlcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk1YTQzZQotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL092ZXJsYXlBcHAvcmVzL3ZhbHVlcy92YWx1ZXMueG1sCkBAIC0wLDAgKzEsMTkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxyZXNvdXJjZXM+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWwiPkZvcmdldCBhYm91dCBpdCE8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvUGFja2FnZUFjY2Vzc0FwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvUGFja2FnZUFjY2Vzc0FwcC9BbmRyb2lkLm1rCmluZGV4IGRmYTcwM2EuLmUyZjllMTIgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1BhY2thZ2VBY2Nlc3NBcHAvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9QYWNrYWdlQWNjZXNzQXBwL0FuZHJvaWQubWsKQEAgLTIyLDcgKzIyLDcgQEAKIExPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCiAKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCi0gICAgYW5kcm9pZC1zdXBwb3J0LXRlc3QgXAorICAgIGFuZHJvaWR4LnRlc3QucnVsZXMgXAogICAgIHViLXVpYXV0b21hdG9yCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1BhY2thZ2VBY2Nlc3NBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1BhY2thZ2VBY2Nlc3NBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA4NTU4YjczLi4wZTQxNmQ5IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9QYWNrYWdlQWNjZXNzQXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvUGFja2FnZUFjY2Vzc0FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yMCw3ICsyMCw3IEBACiAgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgogICAgIDwvYXBwbGljYXRpb24+CiAKLSAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5jdHMucGFja2FnZWFjY2Vzc2FwcCIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IlRlc3QgdG8gY2hlY2sgcGFja2FnZSB2aXNpYmlsaXR5LiIvPgogPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1BhY2thZ2VBY2Nlc3NBcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy9wYWNrYWdlYWNjZXNzYXBwL1BhY2thZ2VBY2Nlc3NUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9QYWNrYWdlQWNjZXNzQXBwL3NyYy9jb20vYW5kcm9pZC9jdHMvcGFja2FnZWFjY2Vzc2FwcC9QYWNrYWdlQWNjZXNzVGVzdC5qYXZhCmluZGV4IGFkNjQ4MDYuLmRjMzNlZTMgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1BhY2thZ2VBY2Nlc3NBcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy9wYWNrYWdlYWNjZXNzYXBwL1BhY2thZ2VBY2Nlc3NUZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvUGFja2FnZUFjY2Vzc0FwcC9zcmMvY29tL2FuZHJvaWQvY3RzL3BhY2thZ2VhY2Nlc3NhcHAvUGFja2FnZUFjY2Vzc1Rlc3QuamF2YQpAQCAtMTUsOCArMTUsNiBAQAogICovCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5wYWNrYWdlYWNjZXNzYXBwOwogCi1pbXBvcnQgc3RhdGljIGp1bml0LmZyYW1ld29yay5Bc3NlcnQuYXNzZXJ0RmFsc2U7Ci0KIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKQEAgLTI0LDEyICsyMiwxMiBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlSW5mbzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLk5hbWVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKIGltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC51aWF1dG9tYXRvci5VaURldmljZTsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotaW1wb3J0IG9yZy5qdW5pdC5pbnRlcm5hbC5ydW5uZXJzLnN0YXRlbWVudHMuRmFpbDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuSlVuaXQ0OwogCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9QZXJtaXNzaW9uRGVjbGFyZUFwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvUGVybWlzc2lvbkRlY2xhcmVBcHAvQW5kcm9pZC5tawppbmRleCAxODRiNzNmLi44NTIxMDkzIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9QZXJtaXNzaW9uRGVjbGFyZUFwcC9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1Blcm1pc3Npb25EZWNsYXJlQXBwL0FuZHJvaWQubWsKQEAgLTIxLDcgKzIxLDcgQEAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIAogTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQtc3VwcG9ydC10ZXN0CitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZHgudGVzdC5ydWxlcwogCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzUGVybWlzc2lvbkRlY2xhcmVBcHAKIApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvUGVybWlzc2lvbkRlY2xhcmVBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1Blcm1pc3Npb25EZWNsYXJlQXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggYWQ3YTY0MC4uYTQ2ZjIxNCAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvUGVybWlzc2lvbkRlY2xhcmVBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9QZXJtaXNzaW9uRGVjbGFyZUFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0zMSwxMCArMzEsOSBAQAogICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuY3RzLnBlcm1pc3Npb25Ob3JtYWwiIC8+CiAKICAgICA8YXBwbGljYXRpb24+Ci0gICAgICAgIDxyZWNlaXZlciBhbmRyb2lkOm5hbWU9IkdyYW50VXJpUGVybWlzc2lvbiIgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSI+Ci0gICAgICAgIDwvcmVjZWl2ZXI+Ci0gICAgICAgIDxyZWNlaXZlciBhbmRyb2lkOm5hbWU9IlNldEluc3RhbGxlclBhY2thZ2UiIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiPgotICAgICAgICA8L3JlY2VpdmVyPgorICAgICAgICA8cHJvdmlkZXIgYW5kcm9pZDpuYW1lPSJVdGlsc1Byb3ZpZGVyIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6YXV0aG9yaXRpZXM9ImNvbS5hbmRyb2lkLmN0cy5wZXJtaXNzaW9uZGVjbGFyZWFwcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIiAvPgogCiAgICAgICAgIDwhLS0gTmVlZCBhIHdheSBmb3IgYW5vdGhlciBhcHAgdG8gdHJ5IHRvIGFjY2VzcyB0aGUgcGVybWlzc2lvbi4gU28gY3JlYXRlIGEgY29udGVudAogICAgICAgICBwcm92aWRlciB3aGljaCBpcyBlbmZvcmNlZCBieSB0aGUgcGVybWlzc2lvbiAtLT4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1Blcm1pc3Npb25EZWNsYXJlQXBwL3NyYy9jb20vYW5kcm9pZC9jdHMvcGVybWlzc2lvbmRlY2xhcmVhcHAvR3JhbnRVcmlQZXJtaXNzaW9uLmphdmEgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9QZXJtaXNzaW9uRGVjbGFyZUFwcC9zcmMvY29tL2FuZHJvaWQvY3RzL3Blcm1pc3Npb25kZWNsYXJlYXBwL0dyYW50VXJpUGVybWlzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmUxZGZmLi4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1Blcm1pc3Npb25EZWNsYXJlQXBwL3NyYy9jb20vYW5kcm9pZC9jdHMvcGVybWlzc2lvbmRlY2xhcmVhcHAvR3JhbnRVcmlQZXJtaXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuY3RzLnBlcm1pc3Npb25kZWNsYXJlYXBwOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LlVyaVBlcm1pc3Npb247Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIEdyYW50VXJpUGVybWlzc2lvbiBleHRlbmRzIEJyb2FkY2FzdFJlY2VpdmVyIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fR1JBTlRfVVJJID0gImdyYW50VXJpIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fUkVWT0tFX1VSSSA9ICJyZXZva2VVcmkiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TVEFSVF9BQ1RJVklUWSA9ICJzdGFydEFjdGl2aXR5IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fU1RBUlRfU0VSVklDRSA9ICJzdGFydFNlcnZpY2UiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9WRVJJRllfT1VUR09JTkdfUEVSU0lTVEVEID0gInZlcmlmeU91dGdvaW5nUGVyc2lzdGVkIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1BBQ0tBR0VfTkFNRSA9ICJwYWNrYWdlTmFtZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfSU5URU5UID0gSW50ZW50LkVYVFJBX0lOVEVOVDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9VUkkgPSAidXJpIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9NT0RFID0gIm1vZGUiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1VDQ0VTUyA9IDEwMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGQUlMVVJFID0gMTAwOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGFjdGlvbiA9IGludGVudC5nZXRBY3Rpb24oKTsKLSAgICAgICAgICAgIGlmIChBQ1RJT05fR1JBTlRfVVJJLmVxdWFscyhhY3Rpb24pKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgVXJpIHVyaSA9IGludGVudC5nZXRQYXJjZWxhYmxlRXh0cmEoRVhUUkFfVVJJKTsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmdyYW50VXJpUGVybWlzc2lvbihpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoRVhUUkFfUEFDS0FHRV9OQU1FKSwgdXJpLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50ZW50LmdldEludEV4dHJhKEVYVFJBX01PREUsIDApKTsKLQotICAgICAgICAgICAgfSBlbHNlIGlmIChBQ1RJT05fUkVWT0tFX1VSSS5lcXVhbHMoYWN0aW9uKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIFVyaSB1cmkgPSBpbnRlbnQuZ2V0UGFyY2VsYWJsZUV4dHJhKEVYVFJBX1VSSSk7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5yZXZva2VVcmlQZXJtaXNzaW9uKHVyaSwgaW50ZW50LmdldEludEV4dHJhKEVYVFJBX01PREUsIDApKTsKLQotICAgICAgICAgICAgfSBlbHNlIGlmIChBQ1RJT05fU1RBUlRfQUNUSVZJVFkuZXF1YWxzKGFjdGlvbikpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJbnRlbnQgbmV3SW50ZW50ID0gaW50ZW50LmdldFBhcmNlbGFibGVFeHRyYShFWFRSQV9JTlRFTlQpOwotICAgICAgICAgICAgICAgIG5ld0ludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5zdGFydEFjdGl2aXR5KG5ld0ludGVudCk7Ci0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoQUNUSU9OX1NUQVJUX1NFUlZJQ0UuZXF1YWxzKGFjdGlvbikpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJbnRlbnQgbmV3SW50ZW50ID0gaW50ZW50LmdldFBhcmNlbGFibGVFeHRyYShFWFRSQV9JTlRFTlQpOwotICAgICAgICAgICAgICAgIGNvbnRleHQuc3RhcnRTZXJ2aWNlKG5ld0ludGVudCk7Ci0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoQUNUSU9OX1ZFUklGWV9PVVRHT0lOR19QRVJTSVNURUQuZXF1YWxzKGFjdGlvbikpIHsKLSAgICAgICAgICAgICAgICB2ZXJpZnlPdXRnb2luZ1BlcnNpc3RlZChjb250ZXh0LCBpbnRlbnQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaXNPcmRlcmVkQnJvYWRjYXN0KCkpIHsKLSAgICAgICAgICAgICAgICBzZXRSZXN1bHRDb2RlKFNVQ0NFU1MpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuaSgiR3JhbnRVcmlQZXJtaXNzaW9uIiwgIlNlY3VyaXR5IGV4Y2VwdGlvbiIsIGUpOwotICAgICAgICAgICAgaWYgKGlzT3JkZXJlZEJyb2FkY2FzdCgpKSB7Ci0gICAgICAgICAgICAgICAgc2V0UmVzdWx0Q29kZShGQUlMVVJFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlPdXRnb2luZ1BlcnNpc3RlZChDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgZmluYWwgVXJpIHVyaSA9IGludGVudC5nZXRQYXJjZWxhYmxlRXh0cmEoRVhUUkFfVVJJKTsKLSAgICAgICAgZmluYWwgTGlzdDxVcmlQZXJtaXNzaW9uPiBwZXJtcyA9IGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCkKLSAgICAgICAgICAgICAgICAuZ2V0T3V0Z29pbmdQZXJzaXN0ZWRVcmlQZXJtaXNzaW9ucygpOwotICAgICAgICBpZiAodXJpICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFNob3VsZCBoYXZlIGEgc2luZ2xlIHBlcnNpc3RlZCBwZXJtCi0gICAgICAgICAgICBpZiAocGVybXMuc2l6ZSgpICE9IDEpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oIk1pc3NpbmcgZ3JhbnQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIFVyaVBlcm1pc3Npb24gcGVybSA9IHBlcm1zLmdldCgwKTsKLSAgICAgICAgICAgIGlmICghcGVybS5nZXRVcmkoKS5lcXVhbHModXJpKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCAiICsgdXJpICsgIiBidXQgZm91bmQgIiArIHBlcm0uZ2V0VXJpKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gU2hvdWxkIGhhdmUgemVybyBwZXJzaXN0ZWQgcGVybXMKLSAgICAgICAgICAgIGlmIChwZXJtcy5zaXplKCkgIT0gMCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigiVW5leHBlY3RlZCBncmFudCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvUGVybWlzc2lvbkRlY2xhcmVBcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy9wZXJtaXNzaW9uZGVjbGFyZWFwcC9TZXRJbnN0YWxsZXJQYWNrYWdlLmphdmEgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9QZXJtaXNzaW9uRGVjbGFyZUFwcC9zcmMvY29tL2FuZHJvaWQvY3RzL3Blcm1pc3Npb25kZWNsYXJlYXBwL1NldEluc3RhbGxlclBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWEwNmQ4Yy4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9QZXJtaXNzaW9uRGVjbGFyZUFwcC9zcmMvY29tL2FuZHJvaWQvY3RzL3Blcm1pc3Npb25kZWNsYXJlYXBwL1NldEluc3RhbGxlclBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5wZXJtaXNzaW9uZGVjbGFyZWFwcDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLXB1YmxpYyBjbGFzcyBTZXRJbnN0YWxsZXJQYWNrYWdlIGV4dGVuZHMgQnJvYWRjYXN0UmVjZWl2ZXIgewotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgU3RyaW5nIHRhcmdldFBhY2thZ2UgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoInRhcmdldCIpOwotICAgICAgICBTdHJpbmcgaW5zdGFsbGVyUGFja2FnZSA9IGludGVudC5nZXRTdHJpbmdFeHRyYSgiaW5zdGFsbGVyIik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCkuc2V0SW5zdGFsbGVyUGFja2FnZU5hbWUodGFyZ2V0UGFja2FnZSwgaW5zdGFsbGVyUGFja2FnZSk7Ci0gICAgICAgICAgICBpZiAoaXNPcmRlcmVkQnJvYWRjYXN0KCkpIHsKLSAgICAgICAgICAgICAgICBzZXRSZXN1bHRDb2RlKDEwMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5pKCJTZXRJbnN0YWxsZXJQYWNrYWdlIiwgIlNlY3VyaXR5IGV4Y2VwdGlvbiIsIGUpOwotICAgICAgICAgICAgaWYgKGlzT3JkZXJlZEJyb2FkY2FzdCgpKSB7Ci0gICAgICAgICAgICAgICAgc2V0UmVzdWx0Q29kZSgxMDApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvUGVybWlzc2lvbkRlY2xhcmVBcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy9wZXJtaXNzaW9uZGVjbGFyZWFwcC9VdGlsc1Byb3ZpZGVyLmphdmEgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9QZXJtaXNzaW9uRGVjbGFyZUFwcC9zcmMvY29tL2FuZHJvaWQvY3RzL3Blcm1pc3Npb25kZWNsYXJlYXBwL1V0aWxzUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTIzZDhmCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvUGVybWlzc2lvbkRlY2xhcmVBcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy9wZXJtaXNzaW9uZGVjbGFyZWFwcC9VdGlsc1Byb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5wZXJtaXNzaW9uZGVjbGFyZWFwcDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5DbGlwYm9hcmRNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuVXJpUGVybWlzc2lvbjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIFV0aWxzUHJvdmlkZXIgZXh0ZW5kcyBDb250ZW50UHJvdmlkZXIgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIFVSSSA9IFVyaS5wYXJzZSgiY29udGVudDovL2NvbS5hbmRyb2lkLmN0cy5wZXJtaXNzaW9uZGVjbGFyZWFwcC8iKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9HUkFOVF9VUkkgPSAiZ3JhbnRVcmkiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9SRVZPS0VfVVJJID0gInJldm9rZVVyaSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1NUQVJUX0FDVElWSVRZID0gInN0YXJ0QWN0aXZpdHkiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TVEFSVF9TRVJWSUNFID0gInN0YXJ0U2VydmljZSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1ZFUklGWV9PVVRHT0lOR19QRVJTSVNURUQgPSAidmVyaWZ5T3V0Z29pbmdQZXJzaXN0ZWQiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TRVRfUFJJTUFSWV9DTElQID0gInNldFByaW1hcnlDbGlwIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fQ0xFQVJfUFJJTUFSWV9DTElQID0gImNsZWFyUHJpbWFyeUNsaXAiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TRVRfSU5TVEFMTEVSX1BBQ0tBR0VfTkFNRSA9ICJzZXRJbnN0YWxsZXJQYWNrYWdlTmFtZSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9QQUNLQUdFX05BTUUgPSAicGFja2FnZU5hbWUiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0lOU1RBTExFUl9QQUNLQUdFX05BTUUgPSAiaW5zdGFsbGVyUGFja2FnZU5hbWUiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0lOVEVOVCA9IEludGVudC5FWFRSQV9JTlRFTlQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfVVJJID0gInVyaSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfTU9ERSA9ICJtb2RlIjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCdW5kbGUgY2FsbChTdHJpbmcgbWV0aG9kLCBTdHJpbmcgYXJnLCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCA9IGdldENvbnRleHQoKTsKKyAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IGV4dHJhcy5nZXRQYXJjZWxhYmxlKEludGVudC5FWFRSQV9JTlRFTlQpOworICAgICAgICBmaW5hbCBTdHJpbmcgYWN0aW9uID0gaW50ZW50LmdldEFjdGlvbigpOworCisgICAgICAgIGZpbmFsIGxvbmcgdG9rZW4gPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChBQ1RJT05fR1JBTlRfVVJJLmVxdWFscyhhY3Rpb24pKSB7CisgICAgICAgICAgICAgICAgZmluYWwgVXJpIHVyaSA9IGludGVudC5nZXRQYXJjZWxhYmxlRXh0cmEoRVhUUkFfVVJJKTsKKyAgICAgICAgICAgICAgICBjb250ZXh0LmdyYW50VXJpUGVybWlzc2lvbihpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoRVhUUkFfUEFDS0FHRV9OQU1FKSwgdXJpLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ZW50LmdldEludEV4dHJhKEVYVFJBX01PREUsIDApKTsKKworICAgICAgICAgICAgfSBlbHNlIGlmIChBQ1RJT05fUkVWT0tFX1VSSS5lcXVhbHMoYWN0aW9uKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIFVyaSB1cmkgPSBpbnRlbnQuZ2V0UGFyY2VsYWJsZUV4dHJhKEVYVFJBX1VSSSk7CisgICAgICAgICAgICAgICAgY29udGV4dC5yZXZva2VVcmlQZXJtaXNzaW9uKHVyaSwgaW50ZW50LmdldEludEV4dHJhKEVYVFJBX01PREUsIDApKTsKKworICAgICAgICAgICAgfSBlbHNlIGlmIChBQ1RJT05fU1RBUlRfQUNUSVZJVFkuZXF1YWxzKGFjdGlvbikpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBJbnRlbnQgbmV3SW50ZW50ID0gaW50ZW50LmdldFBhcmNlbGFibGVFeHRyYShFWFRSQV9JTlRFTlQpOworICAgICAgICAgICAgICAgIG5ld0ludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7CisgICAgICAgICAgICAgICAgY29udGV4dC5zdGFydEFjdGl2aXR5KG5ld0ludGVudCk7CisKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoQUNUSU9OX1NUQVJUX1NFUlZJQ0UuZXF1YWxzKGFjdGlvbikpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBJbnRlbnQgbmV3SW50ZW50ID0gaW50ZW50LmdldFBhcmNlbGFibGVFeHRyYShFWFRSQV9JTlRFTlQpOworICAgICAgICAgICAgICAgIGNvbnRleHQuc3RhcnRTZXJ2aWNlKG5ld0ludGVudCk7CisKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoQUNUSU9OX1ZFUklGWV9PVVRHT0lOR19QRVJTSVNURUQuZXF1YWxzKGFjdGlvbikpIHsKKyAgICAgICAgICAgICAgICB2ZXJpZnlPdXRnb2luZ1BlcnNpc3RlZChjb250ZXh0LCBpbnRlbnQpOworCisgICAgICAgICAgICB9IGVsc2UgaWYgKEFDVElPTl9TRVRfUFJJTUFSWV9DTElQLmVxdWFscyhhY3Rpb24pKSB7CisgICAgICAgICAgICAgICAgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENsaXBib2FyZE1hbmFnZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJpbWFyeUNsaXAoaW50ZW50LmdldENsaXBEYXRhKCkpOworCisgICAgICAgICAgICB9IGVsc2UgaWYgKEFDVElPTl9DTEVBUl9QUklNQVJZX0NMSVAuZXF1YWxzKGFjdGlvbikpIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ2xpcGJvYXJkTWFuYWdlci5jbGFzcykuY2xlYXJQcmltYXJ5Q2xpcCgpOworCisgICAgICAgICAgICB9IGVsc2UgaWYgKEFDVElPTl9TRVRfSU5TVEFMTEVSX1BBQ0tBR0VfTkFNRS5lcXVhbHMoYWN0aW9uKSkgeworICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKS5zZXRJbnN0YWxsZXJQYWNrYWdlTmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVudC5nZXRTdHJpbmdFeHRyYShFWFRSQV9QQUNLQUdFX05BTUUpLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ZW50LmdldFN0cmluZ0V4dHJhKEVYVFJBX0lOU1RBTExFUl9QQUNLQUdFX05BTUUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIEJpbmRlci5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5T3V0Z29pbmdQZXJzaXN0ZWQoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIGZpbmFsIFVyaSB1cmkgPSBpbnRlbnQuZ2V0UGFyY2VsYWJsZUV4dHJhKEVYVFJBX1VSSSk7CisgICAgICAgIGZpbmFsIExpc3Q8VXJpUGVybWlzc2lvbj4gcGVybXMgPSBjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpCisgICAgICAgICAgICAgICAgLmdldE91dGdvaW5nUGVyc2lzdGVkVXJpUGVybWlzc2lvbnMoKTsKKyAgICAgICAgaWYgKHVyaSAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBTaG91bGQgaGF2ZSBhIHNpbmdsZSBwZXJzaXN0ZWQgcGVybQorICAgICAgICAgICAgaWYgKHBlcm1zLnNpemUoKSAhPSAxKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCJNaXNzaW5nIGdyYW50Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBVcmlQZXJtaXNzaW9uIHBlcm0gPSBwZXJtcy5nZXQoMCk7CisgICAgICAgICAgICBpZiAoIXBlcm0uZ2V0VXJpKCkuZXF1YWxzKHVyaSkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgIiArIHVyaSArICIgYnV0IGZvdW5kICIgKyBwZXJtLmdldFVyaSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFNob3VsZCBoYXZlIHplcm8gcGVyc2lzdGVkIHBlcm1zCisgICAgICAgICAgICBpZiAocGVybXMuc2l6ZSgpICE9IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oIlVuZXhwZWN0ZWQgZ3JhbnQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ3Vyc29yIHF1ZXJ5KFVyaSB1cmksIFN0cmluZ1tdIHByb2plY3Rpb24sIFN0cmluZyBzZWxlY3Rpb24sIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MsCisgICAgICAgICAgICBTdHJpbmcgc29ydE9yZGVyKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZShVcmkgdXJpKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBVcmkgaW5zZXJ0KFVyaSB1cmksIENvbnRlbnRWYWx1ZXMgdmFsdWVzKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZGVsZXRlKFVyaSB1cmksIFN0cmluZyBzZWxlY3Rpb24sIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCB1cGRhdGUoVXJpIHVyaSwgQ29udGVudFZhbHVlcyB2YWx1ZXMsIFN0cmluZyBzZWxlY3Rpb24sIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvUGVybWlzc2lvbkRlY2xhcmVBcHBDb21wYXQvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1Blcm1pc3Npb25EZWNsYXJlQXBwQ29tcGF0L0FuZHJvaWQubWsKaW5kZXggYTVjMjI3YS4uNWY0ODA5OSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvUGVybWlzc2lvbkRlY2xhcmVBcHBDb21wYXQvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9QZXJtaXNzaW9uRGVjbGFyZUFwcENvbXBhdC9BbmRyb2lkLm1rCkBAIC0yMSw3ICsyMSw3IEBACiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKIExPQ0FMX1NES19WRVJTSU9OIDo9IDE2Ci1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC1zdXBwb3J0LXRlc3QKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkeC50ZXN0LnJ1bGVzCiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNQZXJtaXNzaW9uRGVjbGFyZUFwcENvbXBhdAogCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9QZXJtaXNzaW9uUG9saWN5MjUvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1Blcm1pc3Npb25Qb2xpY3kyNS9BbmRyb2lkLm1rCmluZGV4IDkyMDZiNmYuLmQ5M2RjMjUgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1Blcm1pc3Npb25Qb2xpY3kyNS9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1Blcm1pc3Npb25Qb2xpY3kyNS9BbmRyb2lkLm1rCkBAIC0yMSwxNSArMjEsMTQgQEAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCiAKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCi0gICAgYW5kcm9pZC1zdXBwb3J0LXRlc3QgXAotICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwgXAotICAgIGN0c3Rlc3RydW5uZXIgXAotCi1MT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBsZWdhY3ktYW5kcm9pZC10ZXN0CisgICAgYW5kcm9pZHgudGVzdC5ydWxlcyBcCisgICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgXAorICAgIGN0c3Rlc3RydW5uZXItYXh0IFwKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzUGVybWlzc2lvblBvbGljeVRlc3QyNQorTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAogCiBMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cwogCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9QZXJtaXNzaW9uUG9saWN5MjUvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1Blcm1pc3Npb25Qb2xpY3kyNS9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDEwNDg0ZmIuLjU3MzNmODkgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1Blcm1pc3Npb25Qb2xpY3kyNS9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1Blcm1pc3Npb25Qb2xpY3kyNS9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yNCw3ICsyNCw3IEBACiAgICAgPC9hcHBsaWNhdGlvbj4KIAogICAgIDxpbnN0cnVtZW50YXRpb24KLSAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5jdHMucGVybWlzc2lvbi5wb2xpY3kiIC8+CiAKIDwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9QZXJtaXNzaW9uUG9saWN5MjUvc3JjL2NvbS9hbmRyb2lkL2N0cy9wZXJtaXNzaW9uL3BvbGljeS9QZXJtaXNzaW9uUG9saWN5VGVzdDI1LmphdmEgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9QZXJtaXNzaW9uUG9saWN5MjUvc3JjL2NvbS9hbmRyb2lkL2N0cy9wZXJtaXNzaW9uL3BvbGljeS9QZXJtaXNzaW9uUG9saWN5VGVzdDI1LmphdmEKaW5kZXggMmRiMWY0MS4uZDlkZGUxMiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvUGVybWlzc2lvblBvbGljeTI1L3NyYy9jb20vYW5kcm9pZC9jdHMvcGVybWlzc2lvbi9wb2xpY3kvUGVybWlzc2lvblBvbGljeVRlc3QyNS5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1Blcm1pc3Npb25Qb2xpY3kyNS9zcmMvY29tL2FuZHJvaWQvY3RzL3Blcm1pc3Npb24vcG9saWN5L1Blcm1pc3Npb25Qb2xpY3lUZXN0MjUuamF2YQpAQCAtMjIsNyArMjIsOSBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlSW5mbzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBlcm1pc3Npb25JbmZvOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCiAvKioKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1ByaXZpbGVnZWRVcGRhdGVBcHAvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1ByaXZpbGVnZWRVcGRhdGVBcHAvQW5kcm9pZC5tawppbmRleCBlODZmYWU5Li4yY2VkMmI5IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Qcml2aWxlZ2VkVXBkYXRlQXBwL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvUHJpdmlsZWdlZFVwZGF0ZUFwcC9BbmRyb2lkLm1rCkBAIC0yMyw3ICsyMyw4IEBACiAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCiBMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50Ci1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC1zdXBwb3J0LXRlc3QgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbCBjdHN0ZXN0cnVubmVyCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZHgudGVzdC5ydWxlcyBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBjdHN0ZXN0cnVubmVyLWF4dAorTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LmJhc2Uuc3R1YnMKICMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKIExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiBMT0NBTF9QUk9HVUFSRF9FTkFCTEVEIDo9IGRpc2FibGVkCkBAIC00OCw5ICs0OSwzMCBAQAogTE9DQUxfQ0VSVElGSUNBVEUgOj0gUFJFU0lHTkVECiBMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cwogCi1teV9hcmNocyA6PSBhcm0geDg2Ci1teV9zcmNfYXJjaCA6PSAkKGNhbGwgZ2V0LXByZWJ1aWx0LXNyYy1hcmNoLCAkKG15X2FyY2hzKSkKLUxPQ0FMX1JFUExBQ0VfUFJFQlVJTFRfQVBLX0lOU1RBTExFRCA6PSAkKExPQ0FMX1BBVEgpL2Fway8kKG15X3NyY19hcmNoKS9DdHNTaGltUHJpdlVwZ3JhZGUuYXBrCisjIFRoZSAnYXJtJyBhcGsgaGFzIGJvdGggYXJtIGFuZCBhcm02NCBzbydzLiBTYW1lIGZvciB4ODYveDg2XzY0LgorbXlfYXBrX2RpciA6PSAkKHN1YnN0IGFybTY0LGFybSwkKFRBUkdFVF9BUkNIKSkKK215X2Fwa19kaXIgOj0gJChzdWJzdCB4ODZfNjQseDg2LCQobXlfYXBrX2RpcikpCitMT0NBTF9SRVBMQUNFX1BSRUJVSUxUX0FQS19JTlNUQUxMRUQgOj0gJChMT0NBTF9QQVRIKS9hcGsvJChteV9hcGtfZGlyKS9DdHNTaGltUHJpdlVwZ3JhZGUuYXBrCisKK2luY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgVmFyaWFudDogUHJpdmlsZWdlZCBhcHAgdXBncmFkZQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFIDo9IEN0c1NoaW1Qcml2VXBncmFkZVByZWJ1aWx0X3YyOAorTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBBUFBTCitMT0NBTF9CVUlMVF9NT0RVTEVfU1RFTSA6PSBwYWNrYWdlLmFwaworIyBNYWtlIHN1cmUgdGhlIGJ1aWxkIHN5c3RlbSBkb2Vzbid0IHRyeSB0byByZXNpZ24gdGhlIEFQSworTE9DQUxfQ0VSVElGSUNBVEUgOj0gUFJFU0lHTkVECitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworCisjIFRoZSAnYXJtJyBhcGsgaGFzIGJvdGggYXJtIGFuZCBhcm02NCBzbydzLiBTYW1lIGZvciB4ODYveDg2XzY0LgorbXlfYXBrX2RpciA6PSAkKHN1YnN0IGFybTY0LGFybSwkKFRBUkdFVF9BUkNIKSkKK215X2Fwa19kaXIgOj0gJChzdWJzdCB4ODZfNjQseDg2LCQobXlfYXBrX2RpcikpCitMT0NBTF9SRVBMQUNFX1BSRUJVSUxUX0FQS19JTlNUQUxMRUQgOj0gJChMT0NBTF9QQVRIKS9hcGsvJChteV9hcGtfZGlyKS9DdHNTaGltUHJpdlVwZ3JhZGVfdjI4LmFwawogCiBpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCiAKQEAgLTY3LDggKzg5LDI1IEBACiBMT0NBTF9DRVJUSUZJQ0FURSA6PSBQUkVTSUdORUQKIExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiAKLW15X2FyY2hzIDo9IGFybSB4ODYKLW15X3NyY19hcmNoIDo9ICQoY2FsbCBnZXQtcHJlYnVpbHQtc3JjLWFyY2gsICQobXlfYXJjaHMpKQotTE9DQUxfUkVQTEFDRV9QUkVCVUlMVF9BUEtfSU5TVEFMTEVEIDo9ICQoTE9DQUxfUEFUSCkvYXBrLyQobXlfc3JjX2FyY2gpL0N0c1NoaW1Qcml2VXBncmFkZVdyb25nU0hBLmFwaworTE9DQUxfUkVQTEFDRV9QUkVCVUlMVF9BUEtfSU5TVEFMTEVEIDo9ICQoTE9DQUxfUEFUSCkvYXBrLyQobXlfYXBrX2RpcikvQ3RzU2hpbVByaXZVcGdyYWRlV3JvbmdTSEEuYXBrCiAKIGluY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgVmFyaWFudDogUHJpdmlsZWdlZCBhcHAgdXBncmFkZSAod3JvbmcgU0hBKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFIDo9IEN0c1NoaW1Qcml2VXBncmFkZVdyb25nU0hBUHJlYnVpbHRfdjI4CitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEFQUFMKK0xPQ0FMX0JVSUxUX01PRFVMRV9TVEVNIDo9IHBhY2thZ2UuYXBrCisjIE1ha2Ugc3VyZSB0aGUgYnVpbGQgc3lzdGVtIGRvZXNuJ3QgdHJ5IHRvIHJlc2lnbiB0aGUgQVBLCitMT0NBTF9DRVJUSUZJQ0FURSA6PSBQUkVTSUdORUQKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCisKK0xPQ0FMX1JFUExBQ0VfUFJFQlVJTFRfQVBLX0lOU1RBTExFRCA6PSAkKExPQ0FMX1BBVEgpL2Fway8kKG15X2Fwa19kaXIpL0N0c1NoaW1Qcml2VXBncmFkZVdyb25nU0hBX3YyOC5hcGsKKworaW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQorCitteV9hcGtfZGlyIDo9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Qcml2aWxlZ2VkVXBkYXRlQXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Qcml2aWxlZ2VkVXBkYXRlQXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggNThmMzRiOS4uOTUxNjliNiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvUHJpdmlsZWdlZFVwZGF0ZUFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1ByaXZpbGVnZWRVcGRhdGVBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjMsNyArMjMsNyBAQAogICAgIDwvYXBwbGljYXRpb24+CiAKICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmFuZHJvaWQuY3RzLnByaXZpbGVnZWR1cGRhdGUiIC8+CiAKIDwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Qcml2aWxlZ2VkVXBkYXRlQXBwL2Fway9hcm0vQ3RzU2hpbVByaXZVcGdyYWRlV3JvbmdTSEFfdjI4LmFwayBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1ByaXZpbGVnZWRVcGRhdGVBcHAvYXBrL2FybS9DdHNTaGltUHJpdlVwZ3JhZGVXcm9uZ1NIQV92MjguYXBrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmYWYyZDQKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Qcml2aWxlZ2VkVXBkYXRlQXBwL2Fway9hcm0vQ3RzU2hpbVByaXZVcGdyYWRlV3JvbmdTSEFfdjI4LmFwawpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Qcml2aWxlZ2VkVXBkYXRlQXBwL2Fway9hcm0vQ3RzU2hpbVByaXZVcGdyYWRlX3YyOC5hcGsgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Qcml2aWxlZ2VkVXBkYXRlQXBwL2Fway9hcm0vQ3RzU2hpbVByaXZVcGdyYWRlX3YyOC5hcGsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNmNmYxOQotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1ByaXZpbGVnZWRVcGRhdGVBcHAvYXBrL2FybS9DdHNTaGltUHJpdlVwZ3JhZGVfdjI4LmFwawpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Qcml2aWxlZ2VkVXBkYXRlQXBwL2Fway94ODYvQ3RzU2hpbVByaXZVcGdyYWRlV3JvbmdTSEFfdjI4LmFwayBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1ByaXZpbGVnZWRVcGRhdGVBcHAvYXBrL3g4Ni9DdHNTaGltUHJpdlVwZ3JhZGVXcm9uZ1NIQV92MjguYXBrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ZTA4MjYKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Qcml2aWxlZ2VkVXBkYXRlQXBwL2Fway94ODYvQ3RzU2hpbVByaXZVcGdyYWRlV3JvbmdTSEFfdjI4LmFwawpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Qcml2aWxlZ2VkVXBkYXRlQXBwL2Fway94ODYvQ3RzU2hpbVByaXZVcGdyYWRlX3YyOC5hcGsgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Qcml2aWxlZ2VkVXBkYXRlQXBwL2Fway94ODYvQ3RzU2hpbVByaXZVcGdyYWRlX3YyOC5hcGsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBjYzhiNgotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1ByaXZpbGVnZWRVcGRhdGVBcHAvYXBrL3g4Ni9DdHNTaGltUHJpdlVwZ3JhZGVfdjI4LmFwawpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Qcml2aWxlZ2VkVXBkYXRlUHJlcGFyZXIvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1ByaXZpbGVnZWRVcGRhdGVQcmVwYXJlci9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZDJiODIKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Qcml2aWxlZ2VkVXBkYXRlUHJlcGFyZXIvQW5kcm9pZC5tawpAQCAtMCwwICsxLDM1IEBACisjCisjIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorI0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLXN1cHBvcnQtdGVzdCBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsIGN0c3Rlc3RydW5uZXIKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsCisjTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LmJhc2Uuc3R1YnMKKyMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9QUk9HVUFSRF9FTkFCTEVEIDo9IGRpc2FibGVkCitMT0NBTF9ERVhfUFJFT1BUIDo9IGZhbHNlCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzUHJpdmlsZWdlZFVwZGF0ZVByZXBhcmVyCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKKworaW5jbHVkZSAkKEJVSUxEX0NUU19QQUNLQUdFKQorCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Qcml2aWxlZ2VkVXBkYXRlUHJlcGFyZXIvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1ByaXZpbGVnZWRVcGRhdGVQcmVwYXJlci9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNmZkOTQKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Qcml2aWxlZ2VkVXBkYXRlUHJlcGFyZXIvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDI5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5jdHMucHJpdmlsZWdlZHVwZGF0ZS5wcmVwYXJlciI+CisKKyAgICA8YXBwbGljYXRpb24+CisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgorICAgIDwvYXBwbGljYXRpb24+CisKKyAgICA8aW5zdHJ1bWVudGF0aW9uCisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5jdHMucHJpdmlsZWdlZHVwZGF0ZS5wcmVwYXJlciIgLz4KKworPC9tYW5pZmVzdD4KKwpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvUHJpdmlsZWdlZFVwZGF0ZVByZXBhcmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvcHJpdmlsZWdlZHVwZGF0ZS9wcmVwYXJlci9Qcml2aWxlZ2VkVXBkYXRlVGVzdFByZXBhcmVyLmphdmEgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Qcml2aWxlZ2VkVXBkYXRlUHJlcGFyZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9wcml2aWxlZ2VkdXBkYXRlL3ByZXBhcmVyL1ByaXZpbGVnZWRVcGRhdGVUZXN0UHJlcGFyZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmRhZjNhCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvUHJpdmlsZWdlZFVwZGF0ZVByZXBhcmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvcHJpdmlsZWdlZHVwZGF0ZS9wcmVwYXJlci9Qcml2aWxlZ2VkVXBkYXRlVGVzdFByZXBhcmVyLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY3RzLnByaXZpbGVnZWR1cGRhdGUucHJlcGFyZXI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb247CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VJbmZvOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5KVW5pdDQ7CisKK0BSdW5XaXRoKEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBQcml2aWxlZ2VkVXBkYXRlVGVzdFByZXBhcmVyIHsKKyAgICAvKiogUGFja2FnZSBuYW1lIG9mIHRoZSBwcml2aWxlZ2VkIENUUyBzaGltICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSVZJTEVHRURfU0hJTV9QS0cgPSAiY29tLmFuZHJvaWQuY3RzLnByaXYuY3Rzc2hpbSI7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGdldFRhcmdldFNkaygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBJbnN0cnVtZW50YXRpb24gaW5zdCA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpOworICAgICAgICBmaW5hbCBQYWNrYWdlTWFuYWdlciBwbSA9IGluc3QuZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgIGZpbmFsIFBhY2thZ2VJbmZvIHBpID0gcG0uZ2V0UGFja2FnZUluZm8oUFJJVklMRUdFRF9TSElNX1BLRywgMCk7CisgICAgICAgIGZpbmFsIEJ1bmRsZSB0YXJnZXRTZGtCdW5kbGUgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgIHRhcmdldFNka0J1bmRsZS5wdXRTdHJpbmcoInRhcmdldF9zZGsiLCBJbnRlZ2VyLnRvU3RyaW5nKHBpLmFwcGxpY2F0aW9uSW5mby50YXJnZXRTZGtWZXJzaW9uKSk7CisgICAgICAgIGluc3Quc2VuZFN0YXR1cygyLCB0YXJnZXRTZGtCdW5kbGUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1JlYWRFeHRlcm5hbFN0b3JhZ2VBcHAvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1JlYWRFeHRlcm5hbFN0b3JhZ2VBcHAvQW5kcm9pZC5tawppbmRleCA0ZjgyOGFkLi4xZWNjNWE0IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9SZWFkRXh0ZXJuYWxTdG9yYWdlQXBwL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvUmVhZEV4dGVybmFsU3RvcmFnZUFwcC9BbmRyb2lkLm1rCkBAIC0xOCw3ICsxOCw5IEBACiAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCiBMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50Ci1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC1zdXBwb3J0LXRlc3QgbGVnYWN5LWFuZHJvaWQtdGVzdAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWR4LnRlc3QucnVsZXMKKworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lci5zdHVicyBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicwogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpIFwKICAgICAuLi9FeHRlcm5hbFN0b3JhZ2VBcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy9leHRlcm5hbHN0b3JhZ2VhcHAvQ29tbW9uRXh0ZXJuYWxTdG9yYWdlVGVzdC5qYXZhCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9SZWFkRXh0ZXJuYWxTdG9yYWdlQXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9SZWFkRXh0ZXJuYWxTdG9yYWdlQXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggMDM4ODRjOS4uNDcxM2JlYiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvUmVhZEV4dGVybmFsU3RvcmFnZUFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1JlYWRFeHRlcm5hbFN0b3JhZ2VBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjAsNyArMjAsNyBAQAogICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KICAgICA8L2FwcGxpY2F0aW9uPgogCi0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5jdHMucmVhZGV4dGVybmFsc3RvcmFnZWFwcCIgLz4KIAogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVBRF9FWFRFUk5BTF9TVE9SQUdFIiAvPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvU2hhcmVkVWlkSW5zdGFsbC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvU2hhcmVkVWlkSW5zdGFsbC9BbmRyb2lkLm1rCmluZGV4IDIyNDY0YmQuLjMzMWRjMmUgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1NoYXJlZFVpZEluc3RhbGwvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9TaGFyZWRVaWRJbnN0YWxsL0FuZHJvaWQubWsKQEAgLTIxLDcgKzIxLDcgQEAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIAogTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQtc3VwcG9ydC10ZXN0CitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZHgudGVzdC5ydWxlcwogCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzU2hhcmVkVWlkSW5zdGFsbAogCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9TaGFyZWRVaWRJbnN0YWxsRGlmZkNlcnQvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1NoYXJlZFVpZEluc3RhbGxEaWZmQ2VydC9BbmRyb2lkLm1rCmluZGV4IGE3M2QwZmMuLjlkYzMzNWUgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1NoYXJlZFVpZEluc3RhbGxEaWZmQ2VydC9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1NoYXJlZFVpZEluc3RhbGxEaWZmQ2VydC9BbmRyb2lkLm1rCkBAIC0yMSw3ICsyMSw3IEBACiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKIExPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLXN1cHBvcnQtdGVzdAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWR4LnRlc3QucnVsZXMKIAogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c1NoYXJlZFVpZEluc3RhbGxEaWZmQ2VydAogCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9TaW1wbGVBcHBJbnN0YWxsL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9TaW1wbGVBcHBJbnN0YWxsL0FuZHJvaWQubWsKaW5kZXggNzE4MGExMC4uMTNhMGI2MyAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvU2ltcGxlQXBwSW5zdGFsbC9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1NpbXBsZUFwcEluc3RhbGwvQW5kcm9pZC5tawpAQCAtMjEsNyArMjEsNyBAQAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogCiBMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50Ci1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC1zdXBwb3J0LXRlc3QKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkeC50ZXN0LnJ1bGVzCiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNTaW1wbGVBcHBJbnN0YWxsCiAKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1NpbXBsZUFwcEluc3RhbGxEaWZmQ2VydC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvU2ltcGxlQXBwSW5zdGFsbERpZmZDZXJ0L0FuZHJvaWQubWsKaW5kZXggYmNkOGE0ZS4uMjFlODNjMiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvU2ltcGxlQXBwSW5zdGFsbERpZmZDZXJ0L0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvU2ltcGxlQXBwSW5zdGFsbERpZmZDZXJ0L0FuZHJvaWQubWsKQEAgLTIxLDcgKzIxLDcgQEAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIAogTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQtc3VwcG9ydC10ZXN0CitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZHgudGVzdC5ydWxlcwogCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzU2ltcGxlQXBwSW5zdGFsbERpZmZDZXJ0CiAKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1NwbGl0QXBwL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9TcGxpdEFwcC9BbmRyb2lkLm1rCmluZGV4IDkzNDE5NDkuLjBlNzdhMmQgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1NwbGl0QXBwL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvU3BsaXRBcHAvQW5kcm9pZC5tawpAQCAtMTksMTYgKzE5LDE4IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLUxPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLXN1cHBvcnQtdGVzdCBsZWdhY3ktYW5kcm9pZC10ZXN0CitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZHgudGVzdC5ydWxlcworCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzIGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIAogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c1NwbGl0QXBwCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CiBMT0NBTF9QQUNLQUdFX1NQTElUUyA6PSBtZHBpLXY0IGhkcGktdjQgeGhkcGktdjQgeHhoZHBpLXY0IHY3IGZyIGRlCiAKICMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cyBjdHNfaW5zdGFudAogCiBMT0NBTF9BU1NFVF9ESVIgOj0gJChMT0NBTF9QQVRIKS9hc3NldHMKIApAQCAtMzgsNiArNDAsOCBAQAogTE9DQUxfUFJPR1VBUkRfRU5BQkxFRCA6PSBkaXNhYmxlZAogTE9DQUxfREVYX1BSRU9QVCA6PSBmYWxzZQogCitMT0NBTF9TREtfVkVSU0lPTiA6PSB0ZXN0X2N1cnJlbnQKKwogaW5jbHVkZSAkKEJVSUxEX0NUU19TVVBQT1JUX1BBQ0tBR0UpCiAKIApAQCAtNDgsNyArNTIsOSBAQAogCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwogTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQtc3VwcG9ydC10ZXN0IGxlZ2FjeS1hbmRyb2lkLXRlc3QKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkeC50ZXN0LnJ1bGVzCisKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIuc3R1YnMgYW5kcm9pZC50ZXN0LmJhc2Uuc3R1YnMKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogCkBAIC01Niw3ICs2Miw3IEBACiBMT0NBTF9QQUNLQUdFX1NQTElUUyA6PSB2NwogCiAjIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0Ci1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMgY3RzX2luc3RhbnQKIAogTE9DQUxfTUFOSUZFU1RfRklMRSA6PSByZXZpc2lvbi9BbmRyb2lkTWFuaWZlc3QueG1sCiBMT0NBTF9DRVJUSUZJQ0FURSA6PSBjdHMvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9jZXJ0cy9jdHMtdGVzdGtleTEKQEAgLTY1LDYgKzcxLDggQEAKIExPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKIExPQ0FMX0RFWF9QUkVPUFQgOj0gZmFsc2UKIAorTE9DQUxfU0RLX1ZFUlNJT04gOj0gdGVzdF9jdXJyZW50CisKIGluY2x1ZGUgJChCVUlMRF9DVFNfU1VQUE9SVF9QQUNLQUdFKQogCiAKQEAgLTc1LDcgKzgzLDkgQEAKIAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKIExPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLXN1cHBvcnQtdGVzdCBsZWdhY3ktYW5kcm9pZC10ZXN0CitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZHgudGVzdC5ydWxlcworCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzIGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIApAQCAtODMsNyArOTMsNyBAQAogTE9DQUxfUEFDS0FHRV9TUExJVFMgOj0gdjcKIAogIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzIGN0c19pbnN0YW50CiAKIExPQ0FMX0NFUlRJRklDQVRFIDo9IGN0cy9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L2NlcnRzL2N0cy10ZXN0a2V5MQogTE9DQUxfQUFQVF9GTEFHUyA6PSAtLXZlcnNpb24tY29kZSAxMDEgLS12ZXJzaW9uLW5hbWUgT25lSHVuZHJlZE9uZSAtLXJlcGxhY2UtdmVyc2lvbgpAQCAtOTEsNiArMTAxLDggQEAKIExPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKIExPQ0FMX0RFWF9QUkVPUFQgOj0gZmFsc2UKIAorTE9DQUxfU0RLX1ZFUlNJT04gOj0gdGVzdF9jdXJyZW50CisKIGluY2x1ZGUgJChCVUlMRF9DVFNfU1VQUE9SVF9QQUNLQUdFKQogCiAKQEAgLTEwMSw3ICsxMTMsOSBAQAogCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwogTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQtc3VwcG9ydC10ZXN0IGxlZ2FjeS1hbmRyb2lkLXRlc3QKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkeC50ZXN0LnJ1bGVzCisKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIuc3R1YnMgYW5kcm9pZC50ZXN0LmJhc2Uuc3R1YnMKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogCkBAIC0xMDksNyArMTIzLDcgQEAKIExPQ0FMX1BBQ0tBR0VfU1BMSVRTIDo9IHY3CiAKICMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cyBjdHNfaW5zdGFudAogCiBMT0NBTF9DRVJUSUZJQ0FURSA6PSBjdHMvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9jZXJ0cy9jdHMtdGVzdGtleTIKIExPQ0FMX0FBUFRfRkxBR1MgOj0gLS12ZXJzaW9uLWNvZGUgMTAwIC0tdmVyc2lvbi1uYW1lIE9uZUh1bmRyZWQgLS1yZXBsYWNlLXZlcnNpb24KQEAgLTExNyw2ICsxMzEsOCBAQAogTE9DQUxfUFJPR1VBUkRfRU5BQkxFRCA6PSBkaXNhYmxlZAogTE9DQUxfREVYX1BSRU9QVCA6PSBmYWxzZQogCitMT0NBTF9TREtfVkVSU0lPTiA6PSB0ZXN0X2N1cnJlbnQKKwogaW5jbHVkZSAkKEJVSUxEX0NUU19TVVBQT1JUX1BBQ0tBR0UpCiAKIApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvU3BsaXRBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1NwbGl0QXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggZDlkY2ViOC4uY2IwMWQyYiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvU3BsaXRBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9TcGxpdEFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0xNSwxMyArMTUsMTggQEAKIC0tPgogCiA8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5jdHMuc3BsaXRhcHAiPgorICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLmN0cy5zcGxpdGFwcCIKKyAgICBhbmRyb2lkOnRhcmdldFNhbmRib3hWZXJzaW9uPSIyIj4KKworICAgIDwhLS0gVE9ETyhiLzczMzY1NjExKSBSZW1vdmUgdGFyZ2V0U2RrVmVyc2lvbiBvbmNlIEVuY3J5cHRpb25BcHAgdGVzdHMKKyAgICAgICAgIGFyZSBmaXhlZCB0byBubyBsb25nZXIgYWNjZXNzIFNwbGl0QXBwJ3MgZGF0YSBieSBwYXRoLiAtLT4KKyAgICA8dXNlcy1zZGsgYW5kcm9pZDptaW5TZGtWZXJzaW9uPSIyMSIgYW5kcm9pZDp0YXJnZXRTZGtWZXJzaW9uPSIyNyIgLz4KIAogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQ0FNRVJBIiAvPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVDRUlWRV9CT09UX0NPTVBMRVRFRCIgLz4KIAogICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJTcGxpdEFwcCI+Ci0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5NeUFjdGl2aXR5Ij4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLk15QWN0aXZpdHkiIGFuZHJvaWQ6dmlzaWJsZVRvSW5zdGFudEFwcHM9InRydWUiPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgogICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgpAQCAtNDgsNyArNTMsNyBAQAogICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KICAgICA8L2FwcGxpY2F0aW9uPgogCi0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5jdHMuc3BsaXRhcHAiIC8+CiAKIDwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9TcGxpdEFwcC9mZWF0dXJlL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9TcGxpdEFwcC9mZWF0dXJlL0FuZHJvaWQubWsKaW5kZXggYTI0OGI3MS4uNDZhYmIzYyAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvU3BsaXRBcHAvZmVhdHVyZS9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1NwbGl0QXBwL2ZlYXR1cmUvQW5kcm9pZC5tawpAQCAtMTksNiArMTksNyBAQAogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1zdWJkaXItamF2YS1maWxlcykKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNTcGxpdEFwcEZlYXR1cmUKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKIExPQ0FMX1BBQ0tBR0VfU1BMSVRTIDo9IHY3CiAKIExPQ0FMX0FTU0VUX0RJUiA6PSAkKExPQ0FMX1BBVEgpL2Fzc2V0cwpAQCAtMjksNyArMzAsNyBAQAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKIAogIyB0YWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzIGN0c19pbnN0YW50CiAKIGZlYXR1cmVPZiA6PSBDdHNTcGxpdEFwcAogZmVhdHVyZU9mQXBrIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsQVBQUywkKGZlYXR1cmVPZikpL3BhY2thZ2UuYXBrCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9TcGxpdEFwcC9saWJzL2FybTY0LXY4YS9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvU3BsaXRBcHAvbGlicy9hcm02NC12OGEvQW5kcm9pZC5tawppbmRleCBiYWQzOWZiLi5lMmUwNTljIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9TcGxpdEFwcC9saWJzL2FybTY0LXY4YS9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1NwbGl0QXBwL2xpYnMvYXJtNjQtdjhhL0FuZHJvaWQubWsKQEAgLTE5LDExICsxOSwxMiBAQAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNTcGxpdEFwcF9hcm02NC12OGEKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKIAogTE9DQUxfSkFWQV9SRVNPVVJDRV9ESVJTIDo9IHJhdwogCiAjIHRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0Ci1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMgY3RzX2luc3RhbnQKIAogTE9DQUxfQ0VSVElGSUNBVEUgOj0gY3RzL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvY2VydHMvY3RzLXRlc3RrZXkxCiBMT0NBTF9BQVBUX0ZMQUdTIDo9IC0tdmVyc2lvbi1jb2RlIDEwMCAtLXJlcGxhY2UtdmVyc2lvbgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvU3BsaXRBcHAvbGlicy9hcm1lYWJpLXY3YS9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvU3BsaXRBcHAvbGlicy9hcm1lYWJpLXY3YS9BbmRyb2lkLm1rCmluZGV4IDk5NTEwOTguLmZmODI3YjkgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1NwbGl0QXBwL2xpYnMvYXJtZWFiaS12N2EvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9TcGxpdEFwcC9saWJzL2FybWVhYmktdjdhL0FuZHJvaWQubWsKQEAgLTE5LDExICsxOSwxMiBAQAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNTcGxpdEFwcF9hcm1lYWJpLXY3YQorTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAogCiBMT0NBTF9KQVZBX1JFU09VUkNFX0RJUlMgOj0gcmF3CiAKICMgdGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cyBjdHNfaW5zdGFudAogCiBMT0NBTF9DRVJUSUZJQ0FURSA6PSBjdHMvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9jZXJ0cy9jdHMtdGVzdGtleTEKIExPQ0FMX0FBUFRfRkxBR1MgOj0gLS12ZXJzaW9uLWNvZGUgMTAwIC0tcmVwbGFjZS12ZXJzaW9uCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9TcGxpdEFwcC9saWJzL2FybWVhYmkvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1NwbGl0QXBwL2xpYnMvYXJtZWFiaS9BbmRyb2lkLm1rCmluZGV4IGY2ZWZjZDYuLjI5YmM4NTkgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1NwbGl0QXBwL2xpYnMvYXJtZWFiaS9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1NwbGl0QXBwL2xpYnMvYXJtZWFiaS9BbmRyb2lkLm1rCkBAIC0xOSwxMSArMTksMTIgQEAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzU3BsaXRBcHBfYXJtZWFiaQorTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAogCiBMT0NBTF9KQVZBX1JFU09VUkNFX0RJUlMgOj0gcmF3CiAKICMgdGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cyBjdHNfaW5zdGFudAogCiBMT0NBTF9DRVJUSUZJQ0FURSA6PSBjdHMvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9jZXJ0cy9jdHMtdGVzdGtleTEKIExPQ0FMX0FBUFRfRkxBR1MgOj0gLS12ZXJzaW9uLWNvZGUgMTAwIC0tcmVwbGFjZS12ZXJzaW9uCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9TcGxpdEFwcC9saWJzL21pcHMvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1NwbGl0QXBwL2xpYnMvbWlwcy9BbmRyb2lkLm1rCmluZGV4IGFhMmRlMDYuLjNjNmNjMjIgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1NwbGl0QXBwL2xpYnMvbWlwcy9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1NwbGl0QXBwL2xpYnMvbWlwcy9BbmRyb2lkLm1rCkBAIC0xOSwxMSArMTksMTIgQEAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzU3BsaXRBcHBfbWlwcworTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAogCiBMT0NBTF9KQVZBX1JFU09VUkNFX0RJUlMgOj0gcmF3CiAKICMgdGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cyBjdHNfaW5zdGFudAogCiBMT0NBTF9DRVJUSUZJQ0FURSA6PSBjdHMvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9jZXJ0cy9jdHMtdGVzdGtleTEKIExPQ0FMX0FBUFRfRkxBR1MgOj0gLS12ZXJzaW9uLWNvZGUgMTAwIC0tcmVwbGFjZS12ZXJzaW9uCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9TcGxpdEFwcC9saWJzL21pcHM2NC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvU3BsaXRBcHAvbGlicy9taXBzNjQvQW5kcm9pZC5tawppbmRleCBjZDRlYWZjLi5hY2I1NDVmIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9TcGxpdEFwcC9saWJzL21pcHM2NC9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1NwbGl0QXBwL2xpYnMvbWlwczY0L0FuZHJvaWQubWsKQEAgLTE5LDExICsxOSwxMiBAQAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNTcGxpdEFwcF9taXBzNjQKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKIAogTE9DQUxfSkFWQV9SRVNPVVJDRV9ESVJTIDo9IHJhdwogCiAjIHRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0Ci1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMgY3RzX2luc3RhbnQKIAogTE9DQUxfQ0VSVElGSUNBVEUgOj0gY3RzL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvY2VydHMvY3RzLXRlc3RrZXkxCiBMT0NBTF9BQVBUX0ZMQUdTIDo9IC0tdmVyc2lvbi1jb2RlIDEwMCAtLXJlcGxhY2UtdmVyc2lvbgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvU3BsaXRBcHAvbGlicy94ODYvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1NwbGl0QXBwL2xpYnMveDg2L0FuZHJvaWQubWsKaW5kZXggMmQ3ZDAwOC4uOGYzYjM4MSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvU3BsaXRBcHAvbGlicy94ODYvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9TcGxpdEFwcC9saWJzL3g4Ni9BbmRyb2lkLm1rCkBAIC0xOSwxMSArMTksMTIgQEAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzU3BsaXRBcHBfeDg2CitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CiAKIExPQ0FMX0pBVkFfUkVTT1VSQ0VfRElSUyA6PSByYXcKIAogIyB0YWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzIGN0c19pbnN0YW50CiAKIExPQ0FMX0NFUlRJRklDQVRFIDo9IGN0cy9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L2NlcnRzL2N0cy10ZXN0a2V5MQogTE9DQUxfQUFQVF9GTEFHUyA6PSAtLXZlcnNpb24tY29kZSAxMDAgLS1yZXBsYWNlLXZlcnNpb24KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1NwbGl0QXBwL2xpYnMveDg2XzY0L0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9TcGxpdEFwcC9saWJzL3g4Nl82NC9BbmRyb2lkLm1rCmluZGV4IDI5MWEzYzYuLjc2ZWYwNTAgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1NwbGl0QXBwL2xpYnMveDg2XzY0L0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvU3BsaXRBcHAvbGlicy94ODZfNjQvQW5kcm9pZC5tawpAQCAtMTksMTEgKzE5LDEyIEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c1NwbGl0QXBwX3g4Nl82NAorTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAogCiBMT0NBTF9KQVZBX1JFU09VUkNFX0RJUlMgOj0gcmF3CiAKICMgdGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cyBjdHNfaW5zdGFudAogCiBMT0NBTF9DRVJUSUZJQ0FURSA6PSBjdHMvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9jZXJ0cy9jdHMtdGVzdGtleTEKIExPQ0FMX0FBUFRfRkxBR1MgOj0gLS12ZXJzaW9uLWNvZGUgMTAwIC0tcmVwbGFjZS12ZXJzaW9uCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9TcGxpdEFwcC9yZXZpc2lvbi9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvU3BsaXRBcHAvcmV2aXNpb24vQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA4ZTA1M2JhLi5kMmJkMWRhIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9TcGxpdEFwcC9yZXZpc2lvbi9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1NwbGl0QXBwL3JldmlzaW9uL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTE2LDcgKzE2LDggQEAKIAogPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKICAgICAgICAgcGFja2FnZT0iY29tLmFuZHJvaWQuY3RzLnNwbGl0YXBwIgotICAgICAgICBhbmRyb2lkOnJldmlzaW9uQ29kZT0iMTIiPgorICAgICAgICBhbmRyb2lkOnJldmlzaW9uQ29kZT0iMTIiCisgICAgICAgIGFuZHJvaWQ6dGFyZ2V0U2FuZGJveFZlcnNpb249IjIiPgogCiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5DQU1FUkEiIC8+CiAKQEAgLTM4LDcgKzM5LDcgQEAKICAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CiAgICAgPC9hcHBsaWNhdGlvbj4KIAotICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmFuZHJvaWQuY3RzLnNwbGl0YXBwIiAvPgogCiA8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvU3BsaXRBcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy9zcGxpdGFwcC9NeUFjdGl2aXR5LmphdmEgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9TcGxpdEFwcC9zcmMvY29tL2FuZHJvaWQvY3RzL3NwbGl0YXBwL015QWN0aXZpdHkuamF2YQppbmRleCA5YjlmMDFjLi5jYzg3NWJkIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9TcGxpdEFwcC9zcmMvY29tL2FuZHJvaWQvY3RzL3NwbGl0YXBwL015QWN0aXZpdHkuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9TcGxpdEFwcC9zcmMvY29tL2FuZHJvaWQvY3RzL3NwbGl0YXBwL015QWN0aXZpdHkuamF2YQpAQCAtMTcsNiArMTcsMTIgQEAKIHBhY2thZ2UgY29tLmFuZHJvaWQuY3RzLnNwbGl0YXBwOwogCiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiAKIHB1YmxpYyBjbGFzcyBNeUFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgZmluaXNoKCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvU3BsaXRBcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy9zcGxpdGFwcC9TcGxpdEFwcFRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1NwbGl0QXBwL3NyYy9jb20vYW5kcm9pZC9jdHMvc3BsaXRhcHAvU3BsaXRBcHBUZXN0LmphdmEKaW5kZXggN2E2OTNlOC4uMzI4OGFjYSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvU3BsaXRBcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy9zcGxpdGFwcC9TcGxpdEFwcFRlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9TcGxpdEFwcC9zcmMvY29tL2FuZHJvaWQvY3RzL3NwbGl0YXBwL1NwbGl0QXBwVGVzdC5qYXZhCkBAIC0xOSwxMCArMTksOCBAQAogaW1wb3J0IHN0YXRpYyBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyLkVORF9ET0NVTUVOVDsKIGltcG9ydCBzdGF0aWMgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlci5TVEFSVF9UQUc7CiAKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm87CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VJbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKQEAgLTM1LDEyICszMywxMiBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuQ29uZGl0aW9uVmFyaWFibGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5FbnZpcm9ubWVudDsKLWltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOwotaW1wb3J0IGFuZHJvaWQub3MuU3RhdEZzOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlQ2FsbGJhY2s7CiBpbXBvcnQgYW5kcm9pZC5zeXN0ZW0uT3M7Ci1pbXBvcnQgYW5kcm9pZC5zeXN0ZW0uT3NDb25zdGFudHM7CiBpbXBvcnQgYW5kcm9pZC5zeXN0ZW0uU3RydWN0U3RhdDsKIGltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwogaW1wb3J0IGFuZHJvaWQudGVzdC5Nb3JlQXNzZXJ0czsKQEAgLTU0LDcgKzUyLDYgQEAKIGltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZURlc2NyaXB0b3I7CiBpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC0zMDksMjIgKzMwNiw3IEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdEJhc2VJbnN0YWxsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgQ29uZGl0aW9uVmFyaWFibGUgY3YgPSBuZXcgQ29uZGl0aW9uVmFyaWFibGUoKTsKLSAgICAgICAgZmluYWwgQnJvYWRjYXN0UmVjZWl2ZXIgciA9IG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgewotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBpbnRlbnQuZ2V0SW50RXh0cmEoIkNSRUFURV9DT1VOVCIsIC0xKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGludGVudC5nZXRJbnRFeHRyYSgiTkVXX0lOVEVOVF9DT1VOVCIsIC0xKSk7Ci0gICAgICAgICAgICAgICAgY3Yub3BlbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBmaW5hbCBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEludGVudEZpbHRlcigiY29tLmFuZHJvaWQuY3RzLm5vcmVzdGFydC5CUk9BRENBU1QiKTsKLSAgICAgICAgZ2V0Q29udGV4dCgpLnJlZ2lzdGVyUmVjZWl2ZXIociwgZmlsdGVyKTsKLSAgICAgICAgZmluYWwgSW50ZW50IGkgPSBuZXcgSW50ZW50KCJjb20uYW5kcm9pZC5jdHMubm9yZXN0YXJ0LlNUQVJUIik7Ci0gICAgICAgIGkuYWRkQ2F0ZWdvcnkoSW50ZW50LkNBVEVHT1JZX0RFRkFVTFQpOwotICAgICAgICBnZXRDb250ZXh0KCkuc3RhcnRBY3Rpdml0eShpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjdi5ibG9jaygyMDAwTCkpOwotICAgICAgICBnZXRDb250ZXh0KCkudW5yZWdpc3RlclJlY2VpdmVyKHIpOworICAgICAgICBsYXVuY2hCYXNlQWN0aXZpdHkoMSwgMCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0zMzQsMjIgKzMxNiwyNyBAQAogICAgICAqIGRvbmUgaW4ge0BsaW5rICN0ZXN0QmFzZUluc3RhbGxlZCgpfS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB0ZXN0RmVhdHVyZUluc3RhbGxlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBsYXVuY2hCYXNlQWN0aXZpdHkoMSwgMSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGxhdW5jaEJhc2VBY3Rpdml0eShpbnQgZXhwZWN0ZWRDcmVhdGVDb3VudCwgaW50IGV4cGVjdGVkTmV3SW50ZW50Q291bnQpIHsKICAgICAgICAgZmluYWwgQ29uZGl0aW9uVmFyaWFibGUgY3YgPSBuZXcgQ29uZGl0aW9uVmFyaWFibGUoKTsKLSAgICAgICAgZmluYWwgQnJvYWRjYXN0UmVjZWl2ZXIgciA9IG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgewotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBpbnRlbnQuZ2V0SW50RXh0cmEoIkNSRUFURV9DT1VOVCIsIC0xKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGludGVudC5nZXRJbnRFeHRyYSgiTkVXX0lOVEVOVF9DT1VOVCIsIC0xKSk7Ci0gICAgICAgICAgICAgICAgY3Yub3BlbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBmaW5hbCBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEludGVudEZpbHRlcigiY29tLmFuZHJvaWQuY3RzLm5vcmVzdGFydC5CUk9BRENBU1QiKTsKLSAgICAgICAgZ2V0Q29udGV4dCgpLnJlZ2lzdGVyUmVjZWl2ZXIociwgZmlsdGVyKTsKLSAgICAgICAgZmluYWwgSW50ZW50IGkgPSBuZXcgSW50ZW50KCJjb20uYW5kcm9pZC5jdHMubm9yZXN0YXJ0LlNUQVJUIik7CisKKyAgICAgICAgZmluYWwgSW50ZW50IGkgPSBuZXcgSW50ZW50KEludGVudC5BQ1RJT05fVklFVyk7CisgICAgICAgIGkuc2V0UGFja2FnZSgiY29tLmFuZHJvaWQuY3RzLm5vcmVzdGFydCIpOwogICAgICAgICBpLmFkZENhdGVnb3J5KEludGVudC5DQVRFR09SWV9ERUZBVUxUKTsKKyAgICAgICAgaS5hZGRDYXRlZ29yeShJbnRlbnQuQ0FURUdPUllfQlJPV1NBQkxFKTsKKyAgICAgICAgaS5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7CisgICAgICAgIGkuc2V0RGF0YShVcmkucGFyc2UoImh0dHBzOi8vZm9vLmNvbS9iYXIiKSk7CisKKyAgICAgICAgaS5wdXRFeHRyYSgiUkVTUE9OU0UiLCBuZXcgUmVtb3RlQ2FsbGJhY2soKEJ1bmRsZSByZXN1bHQpIC0+IHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZENyZWF0ZUNvdW50LCByZXN1bHQuZ2V0SW50KCJDUkVBVEVfQ09VTlQiLCAtMSkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkTmV3SW50ZW50Q291bnQsIHJlc3VsdC5nZXRJbnQoIk5FV19JTlRFTlRfQ09VTlQiLCAtMSkpOworICAgICAgICAgICAgY3Yub3BlbigpOworICAgICAgICB9KSk7CisKICAgICAgICAgZ2V0Q29udGV4dCgpLnN0YXJ0QWN0aXZpdHkoaSk7CiAgICAgICAgIGFzc2VydFRydWUoY3YuYmxvY2soMjAwMEwpKTsKLSAgICAgICAgZ2V0Q29udGV4dCgpLnVucmVnaXN0ZXJSZWNlaXZlcihyKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0RmVhdHVyZUFwaSgpIHRocm93cyBFeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvU3RvcmFnZUFwcC9zcmMvY29tL2FuZHJvaWQvY3RzL3N0b3JhZ2VhcHAvU3RvcmFnZVRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1N0b3JhZ2VBcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy9zdG9yYWdlYXBwL1N0b3JhZ2VUZXN0LmphdmEKaW5kZXggOWQwZGVjNi4uMjNlNGM5ZiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvU3RvcmFnZUFwcC9zcmMvY29tL2FuZHJvaWQvY3RzL3N0b3JhZ2VhcHAvU3RvcmFnZVRlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9TdG9yYWdlQXBwL3NyYy9jb20vYW5kcm9pZC9jdHMvc3RvcmFnZWFwcC9TdG9yYWdlVGVzdC5qYXZhCkBAIC0xNiw2ICsxNiw4IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuY3RzLnN0b3JhZ2VhcHA7CiAKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5vcy5zdG9yYWdlLlN0b3JhZ2VNYW5hZ2VyLlVVSURfREVGQVVMVDsKKwogaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jdHMuc3RvcmFnZWFwcC5VdGlscy5DQUNIRV9BTEw7CiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmN0cy5zdG9yYWdlYXBwLlV0aWxzLkNBQ0hFX0VYVDsKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY3RzLnN0b3JhZ2VhcHAuVXRpbHMuQ0FDSEVfSU5UOwpAQCAtMjYsNyArMjgsNiBAQAogaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jdHMuc3RvcmFnZWFwcC5VdGlscy5hc3NlcnRNb3N0bHlFcXVhbHM7CiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmN0cy5zdG9yYWdlYXBwLlV0aWxzLmdldFNpemVNYW51YWw7CiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmN0cy5zdG9yYWdlYXBwLlV0aWxzLm1ha2VVbmlxdWVGaWxlOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jdHMuc3RvcmFnZWFwcC5VdGlscy5zaG91bGRIYXZlUXVvdGE7CiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmN0cy5zdG9yYWdlYXBwLlV0aWxzLnVzZVNwYWNlOwogCiBpbXBvcnQgYW5kcm9pZC5hcHAudXNhZ2UuU3RvcmFnZVN0YXRzOwpAQCAtMzksNyArNDAsNiBAQAogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3I7CiBpbXBvcnQgYW5kcm9pZC5vcy5Vc2VySGFuZGxlOwogaW1wb3J0IGFuZHJvaWQub3Muc3RvcmFnZS5TdG9yYWdlTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnN5c3RlbS5PczsKIGltcG9ydCBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdENhc2U7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CkBAIC01OSwxNyArNTksMTAgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0RnVsbERpc2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHNob3VsZEhhdmVRdW90YShPcy51bmFtZSgpKSkgeworICAgICAgICBmaW5hbCBTdG9yYWdlU3RhdHNNYW5hZ2VyIHN0YXRzID0gZ2V0Q29udGV4dCgpCisgICAgICAgICAgICAgICAgLmdldFN5c3RlbVNlcnZpY2UoU3RvcmFnZVN0YXRzTWFuYWdlci5jbGFzcyk7CisgICAgICAgIGlmIChzdGF0cy5pc1Jlc2VydmVkU3VwcG9ydGVkKFVVSURfREVGQVVMVCkpIHsKICAgICAgICAgICAgIGZpbmFsIEZpbGUgZGF0YURpciA9IGdldENvbnRleHQoKS5nZXREYXRhRGlyKCk7Ci0KLSAgICAgICAgICAgIC8vIFByZS1mbGlnaHQgdG8gc2VlIGlmIHdlIGhhdmUgZW5vdWdoIGRpc2sgc3BhY2UgdG8gdGVzdCB3aXRoCi0gICAgICAgICAgICBmaW5hbCBsb25nIHRvdGFsID0gZGF0YURpci5nZXRUb3RhbFNwYWNlKCk7Ci0gICAgICAgICAgICBmaW5hbCBsb25nIGZyZWUgPSBkYXRhRGlyLmdldEZyZWVTcGFjZSgpOwotICAgICAgICAgICAgZmluYWwgbG9uZyByZXF1aXJlZCA9ICgodG90YWwgKiA5KSAvIDEwKSArIE1CX0lOX0JZVEVTOwotICAgICAgICAgICAgaWYgKGZyZWUgPCByZXF1aXJlZCkgewotICAgICAgICAgICAgICAgIGZhaWwoIlNraXBwaW5nIGZ1bGwgZGlzayB0ZXN0OyBvbmx5IGZvdW5kICIgKyBmcmVlICsgIiBmcmVlIG91dCBvZiAiICsgdG90YWwpOwotICAgICAgICAgICAgfQotCiAgICAgICAgICAgICBIb2FyZGVyLmRvQmxvY2tzKGRhdGFEaXIsIHRydWUpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZmFpbCgiU2tpcHBpbmcgZnVsbCBkaXNrIHRlc3QgZHVlIHRvIG1pc3NpbmcgcXVvdGEgc3VwcG9ydCIpOwpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvU3RvcmFnZUFwcC9zcmMvY29tL2FuZHJvaWQvY3RzL3N0b3JhZ2VhcHAvVXRpbHMuamF2YSBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1N0b3JhZ2VBcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy9zdG9yYWdlYXBwL1V0aWxzLmphdmEKaW5kZXggNjkwOGFkOC4uNzU5MTViNiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvU3RvcmFnZUFwcC9zcmMvY29tL2FuZHJvaWQvY3RzL3N0b3JhZ2VhcHAvVXRpbHMuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9TdG9yYWdlQXBwL3NyYy9jb20vYW5kcm9pZC9jdHMvc3RvcmFnZWFwcC9VdGlscy5qYXZhCkBAIC0xNTAsNyArMTUwLDkgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBsb25nIGdldEFsbG9jYXRlZFNpemUoRmlsZSBmKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIE9zLmxzdGF0KGYuZ2V0QWJzb2x1dGVQYXRoKCkpLnN0X2Jsb2NrcyAqIDUxMjsKKyAgICAgICAgcmV0dXJuIE9zLmxzdGF0KGYuZ2V0QWJzb2x1dGVQYXRoKCkpLnN0X2Jsb2NrcyAqIDUxMiAvCisgICAgICAgICAgICAgICBPcy5sc3RhdChmLmdldEFic29sdXRlUGF0aCgpKS5zdF9ibGtzaXplICoKKyAgICAgICAgICAgICAgIE9zLmxzdGF0KGYuZ2V0QWJzb2x1dGVQYXRoKCkpLnN0X2Jsa3NpemUgOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkZWxldGVDb250ZW50cyhGaWxlIGRpcikgewpAQCAtMTY5LDMwICsxNzEsNiBAQAogICAgICAgICByZXR1cm4gc3VjY2VzczsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2hvdWxkSGF2ZVF1b3RhKFN0cnVjdFV0c25hbWUgdW5hbWUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0cnkgKEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKCIvcHJvYy9tb3VudHMiKSkpIHsKLSAgICAgICAgICAgIFN0cmluZyBsaW5lOwotICAgICAgICAgICAgd2hpbGUgKChsaW5lID0gYnIucmVhZExpbmUoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIGZpZWxkcyA9IGxpbmUuc3BsaXQoIiAiKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdGFyZ2V0ID0gZmllbGRzWzFdOwotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmb3JtYXQgPSBmaWVsZHNbMl07Ci0KLSAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LmVxdWFscygiL2RhdGEiKSAmJiAhZm9ybWF0LmVxdWFscygiZXh0NCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkFzc3VtaW5nIG5vIHF1b3RhIHN1cHBvcnQgYmVjYXVzZSAvZGF0YSBpcyAiICsgZm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIE1hdGNoZXIgbWF0Y2hlciA9IFBhdHRlcm4uY29tcGlsZSgiKFxcZCspXFwuKFxcZCspIikubWF0Y2hlcih1bmFtZS5yZWxlYXNlKTsKLSAgICAgICAgaWYgKCFtYXRjaGVyLmZpbmQoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRmFpbGVkIHRvIHBhcnNlIHZlcnNpb246ICIgKyB1bmFtZS5yZWxlYXNlKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBpbnQgbWFqb3IgPSBJbnRlZ2VyLnBhcnNlSW50KG1hdGNoZXIuZ3JvdXAoMSkpOwotICAgICAgICBmaW5hbCBpbnQgbWlub3IgPSBJbnRlZ2VyLnBhcnNlSW50KG1hdGNoZXIuZ3JvdXAoMikpOwotICAgICAgICByZXR1cm4gKG1ham9yID4gMyB8fCAobWFqb3IgPT0gMyAmJiBtaW5vciA+PSAxOCkpOwotICAgIH0KLQogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2dDb21tYW5kKFN0cmluZy4uLiBjbWQpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBmaW5hbCBQcm9jZXNzIHByb2MgPSBuZXcgUHJvY2Vzc0J1aWxkZXIoY21kKS5yZWRpcmVjdEVycm9yU3RyZWFtKHRydWUpLnN0YXJ0KCk7CiAKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1N0b3JhZ2VBcHBBL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9TdG9yYWdlQXBwQS9BbmRyb2lkLm1rCmluZGV4IGYzZDdkMzUuLmYyYjcxMTcgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1N0b3JhZ2VBcHBBL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvU3RvcmFnZUFwcEEvQW5kcm9pZC5tawpAQCAtMTcsOCArMTcsMTAgQEAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQtc3VwcG9ydC10ZXN0IGxlZ2FjeS1hbmRyb2lkLXRlc3QKK0xPQ0FMX1NES19WRVJTSU9OIDo9IHRlc3RfY3VycmVudAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWR4LnRlc3QucnVsZXMKKworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LmJhc2Uuc3R1YnMKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgLi4vU3RvcmFnZUFwcC9zcmMvKQogCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9TdG9yYWdlQXBwQS9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvU3RvcmFnZUFwcEEvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA2ODhiYjlkLi5iYjUwNTRlIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9TdG9yYWdlQXBwQS9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1N0b3JhZ2VBcHBBL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTI1LDcgKzI1LDcgQEAKICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiIC8+CiAgICAgPC9hcHBsaWNhdGlvbj4KIAotICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmFuZHJvaWQuY3RzLnN0b3JhZ2VhcHBfYSIgLz4KIAogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVBRF9FWFRFUk5BTF9TVE9SQUdFIiAvPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvU3RvcmFnZUFwcEIvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1N0b3JhZ2VBcHBCL0FuZHJvaWQubWsKaW5kZXggNWY4NTQ1OS4uNzZiZmNlNiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvU3RvcmFnZUFwcEIvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9TdG9yYWdlQXBwQi9BbmRyb2lkLm1rCkBAIC0xNyw4ICsxNywxMCBAQAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi1MT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50Ci1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC1zdXBwb3J0LXRlc3QgbGVnYWN5LWFuZHJvaWQtdGVzdAorTE9DQUxfU0RLX1ZFUlNJT04gOj0gdGVzdF9jdXJyZW50CitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZHgudGVzdC5ydWxlcworCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicwogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCAuLi9TdG9yYWdlQXBwL3NyYy8pCiAKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1N0b3JhZ2VBcHBCL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9TdG9yYWdlQXBwQi9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDJlNzczOWMuLmFhMDlhMjQgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1N0b3JhZ2VBcHBCL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvU3RvcmFnZUFwcEIvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjUsNyArMjUsNyBAQAogICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIgLz4KICAgICA8L2FwcGxpY2F0aW9uPgogCi0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5jdHMuc3RvcmFnZWFwcF9iIiAvPgogCiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX0VYVEVSTkFMX1NUT1JBR0UiIC8+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9TdG9yYWdlU3RhdHNBcHAvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1N0b3JhZ2VTdGF0c0FwcC9BbmRyb2lkLm1rCmluZGV4IGI1YzMwZmIuLjJlOWYwMGUgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1N0b3JhZ2VTdGF0c0FwcC9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1N0b3JhZ2VTdGF0c0FwcC9BbmRyb2lkLm1rCkBAIC0xOCw3ICsxOCw5IEBACiAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCiBMT0NBTF9TREtfVkVSU0lPTiA6PSB0ZXN0X2N1cnJlbnQKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLXN1cHBvcnQtdGVzdCB1Yi11aWF1dG9tYXRvciBsZWdhY3ktYW5kcm9pZC10ZXN0CitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZHgudGVzdC5ydWxlcyB1Yi11aWF1dG9tYXRvcgorCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicwogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpIFwKIAkkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIC4uL1N0b3JhZ2VBcHAvc3JjKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvU3RvcmFnZVN0YXRzQXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9TdG9yYWdlU3RhdHNBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCAwYzRkOWQyLi4zNzFlNDM2IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9TdG9yYWdlU3RhdHNBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9TdG9yYWdlU3RhdHNBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjAsNyArMjAsNyBAQAogICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KICAgICA8L2FwcGxpY2F0aW9uPgogCi0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5jdHMuc3RvcmFnZXN0YXRzYXBwIiAvPgogCiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX0VYVEVSTkFMX1NUT1JBR0UiIC8+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9TdG9yYWdlU3RhdHNBcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy9zdG9yYWdlc3RhdHNhcHAvU3RvcmFnZVN0YXRzVGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvU3RvcmFnZVN0YXRzQXBwL3NyYy9jb20vYW5kcm9pZC9jdHMvc3RvcmFnZXN0YXRzYXBwL1N0b3JhZ2VTdGF0c1Rlc3QuamF2YQppbmRleCA4NDcwYmJiLi43YjFhYmVjIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9TdG9yYWdlU3RhdHNBcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy9zdG9yYWdlc3RhdHNhcHAvU3RvcmFnZVN0YXRzVGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1N0b3JhZ2VTdGF0c0FwcC9zcmMvY29tL2FuZHJvaWQvY3RzL3N0b3JhZ2VzdGF0c2FwcC9TdG9yYWdlU3RhdHNUZXN0LmphdmEKQEAgLTIxLDcgKzIxLDYgQEAKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY3RzLnN0b3JhZ2VhcHAuVXRpbHMuQ0FDSEVfQUxMOwogaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jdHMuc3RvcmFnZWFwcC5VdGlscy5DT0RFX0FMTDsKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY3RzLnN0b3JhZ2VhcHAuVXRpbHMuREFUQV9BTEw7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmN0cy5zdG9yYWdlYXBwLlV0aWxzLktCX0lOX0JZVEVTOwogaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jdHMuc3RvcmFnZWFwcC5VdGlscy5NQl9JTl9CWVRFUzsKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY3RzLnN0b3JhZ2VhcHAuVXRpbHMuUEtHX0E7CiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmN0cy5zdG9yYWdlYXBwLlV0aWxzLlBLR19COwpAQCAtMzEsNyArMzAsNiBAQAogaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jdHMuc3RvcmFnZWFwcC5VdGlscy5nZXRTaXplTWFudWFsOwogaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jdHMuc3RvcmFnZWFwcC5VdGlscy5sb2dDb21tYW5kOwogaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jdHMuc3RvcmFnZWFwcC5VdGlscy5tYWtlVW5pcXVlRmlsZTsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY3RzLnN0b3JhZ2VhcHAuVXRpbHMuc2hvdWxkSGF2ZVF1b3RhOwogaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jdHMuc3RvcmFnZWFwcC5VdGlscy51c2VGYWxsb2NhdGU7CiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmN0cy5zdG9yYWdlYXBwLlV0aWxzLnVzZVNwYWNlOwogaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jdHMuc3RvcmFnZWFwcC5VdGlscy51c2VXcml0ZTsKQEAgLTQ3LDEzICs0NSwxMiBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkFwcGxpY2F0aW9uSW5mbzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OwogaW1wb3J0IGFuZHJvaWQub3MuVXNlckhhbmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLnN0b3JhZ2UuU3RvcmFnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QudWlhdXRvbWF0b3IuVWlEZXZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5zeXN0ZW0uT3M7Ci1pbXBvcnQgYW5kcm9pZC5zeXN0ZW0uU3RydWN0VXRzbmFtZTsKIGltcG9ydCBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdENhc2U7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTXV0YWJsZUxvbmc7CkBAIC03NywxOSArNzQsMjIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXF1aXJlIHRoYXQgcXVvdGEgc3VwcG9ydCBiZSBmdWxseSBlbmFibGVkIG9uIGtlcm5lbCAzLjE4IG9yIG5ld2VyLiBUaGlzCi0gICAgICogdGVzdCB2ZXJpZmllcyB0aGF0IGJvdGgga2VybmVsIG9wdGlvbnMgYW5kIHRoZSBmc3RhYiAncXVvdGEnIG9wdGlvbiBhcmUKLSAgICAgKiBlbmFibGVkLgorICAgICAqIFJlcXVpcmUgdGhhdCBxdW90YSBzdXBwb3J0IGJlIGZ1bGx5IGVuYWJsZWQgb24gZGV2aWNlcyB0aGF0IGZpcnN0IHNoaXAKKyAgICAgKiB3aXRoIFAuIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGF0IGJvdGgga2VybmVsIG9wdGlvbnMgYW5kIHRoZSBmc3RhYiAncXVvdGEnCisgICAgICogb3B0aW9uIGFyZSBlbmFibGVkLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RWZXJpZnlRdW90YSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBTdHJ1Y3RVdHNuYW1lIHVuYW1lID0gT3MudW5hbWUoKTsKLSAgICAgICAgaWYgKHNob3VsZEhhdmVRdW90YSh1bmFtZSkpIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmVyaWZ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLkZJUlNUX1NES19JTlQgPj0gQnVpbGQuVkVSU0lPTl9DT0RFUy5QKSB7CiAgICAgICAgICAgICBmaW5hbCBTdG9yYWdlU3RhdHNNYW5hZ2VyIHN0YXRzID0gZ2V0Q29udGV4dCgpCiAgICAgICAgICAgICAgICAgICAgIC5nZXRTeXN0ZW1TZXJ2aWNlKFN0b3JhZ2VTdGF0c01hbmFnZXIuY2xhc3MpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiWW91J3JlIHJ1bm5pbmcga2VybmVsIDMuMTggb3IgbmV3ZXIgKCIgKyB1bmFtZS5yZWxlYXNlICsgIikgd2hpY2ggIgotICAgICAgICAgICAgICAgICAgICArICJtZWFucyB0aGF0IENPTkZJR19RVU9UQSwgQ09ORklHX1FGTVRfVjIsIENPTkZJR19RVU9UQUNUTCBhbmQgdGhlICIKLSAgICAgICAgICAgICAgICAgICAgKyAiJ3F1b3RhJyBmc3RhYiBvcHRpb24gb24gL2RhdGEgYXJlIHJlcXVpcmVkIiwKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkRldmljZXMgdGhhdCBmaXJzdCBzaGlwIHdpdGggUCBvciBuZXdlciBtdXN0IGVuYWJsZSBxdW90YXMgdG8gIgorICAgICAgICAgICAgICAgICAgICArICJzdXBwb3J0IFN0b3JhZ2VTdGF0c01hbmFnZXIgQVBJcy4gWW91IG1heSBuZWVkIHRvIGVuYWJsZSB0aGUgIgorICAgICAgICAgICAgICAgICAgICArICJDT05GSUdfUVVPVEEsIENPTkZJR19RRk1UX1YyLCBDT05GSUdfUVVPVEFDVEwga2VybmVsIG9wdGlvbnMgIgorICAgICAgICAgICAgICAgICAgICArICJhbmQgYWRkIHRoZSAncXVvdGEnIGZzdGFiIG9wdGlvbiBvbiAvZGF0YS4iLAogICAgICAgICAgICAgICAgICAgICBzdGF0cy5pc1F1b3RhU3VwcG9ydGVkKFVVSURfREVGQVVMVCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRGV2aWNlcyB0aGF0IGZpcnN0IHNoaXAgd2l0aCBQIG9yIG5ld2VyIG11c3QgZW5hYmxlIHJlc2dpZCB0byAiCisgICAgICAgICAgICAgICAgICAgICsgInByZXNlcnZlIHN5c3RlbSBzdGFiaWxpdHkgaW4gdGhlIGZhY2Ugb2YgYWJ1c2l2ZSBhcHBzLiIsCisgICAgICAgICAgICAgICAgICAgIHN0YXRzLmlzUmVzZXJ2ZWRTdXBwb3J0ZWQoVVVJRF9ERUZBVUxUKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE0MSw3ICsxNDEsNyBAQAogICAgICAgICBmaW5hbCBTdG9yYWdlU3RhdHMgYXMgPSBzdGF0cy5xdWVyeVN0YXRzRm9yVWlkKFVVSURfREVGQVVMVCwgYS51aWQpOwogICAgICAgICBmaW5hbCBTdG9yYWdlU3RhdHMgYnMgPSBzdGF0cy5xdWVyeVN0YXRzRm9yVWlkKFVVSURfREVGQVVMVCwgYi51aWQpOwogCi0gICAgICAgIGFzc2VydE1vc3RseUVxdWFscyhEQVRBX0FMTCAqIDIsIGFzLmdldERhdGFCeXRlcygpLCA2MDAgKiBLQl9JTl9CWVRFUyk7CisgICAgICAgIGFzc2VydE1vc3RseUVxdWFscyhEQVRBX0FMTCAqIDIsIGFzLmdldERhdGFCeXRlcygpKTsKICAgICAgICAgYXNzZXJ0TW9zdGx5RXF1YWxzKENBQ0hFX0FMTCAqIDIsIGFzLmdldENhY2hlQnl0ZXMoKSk7CiAKICAgICAgICAgYXNzZXJ0TW9zdGx5RXF1YWxzKERBVEFfQUxMLCBicy5nZXREYXRhQnl0ZXMoKSk7CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9UYXJnZXRJbnN0cnVtZW50YXRpb25BcHAvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1RhcmdldEluc3RydW1lbnRhdGlvbkFwcC9BbmRyb2lkLm1rCmluZGV4IGZlYTA4NzguLjQ5YmIzMWEgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1RhcmdldEluc3RydW1lbnRhdGlvbkFwcC9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1RhcmdldEluc3RydW1lbnRhdGlvbkFwcC9BbmRyb2lkLm1rCkBAIC0yMSw3ICsyMSw3IEBACiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKIExPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLXN1cHBvcnQtdGVzdAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWR4LnRlc3QucnVsZXMKIAogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c1RhcmdldEluc3RydW1lbnRhdGlvbkFwcAogCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Vc2VQZXJtaXNzaW9uQXBwMjIvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1VzZVBlcm1pc3Npb25BcHAyMi9BbmRyb2lkLm1rCmluZGV4IDJiNmMyYjAuLmY3Mzg2YTMgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1VzZVBlcm1pc3Npb25BcHAyMi9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1VzZVBlcm1pc3Npb25BcHAyMi9BbmRyb2lkLm1rCkBAIC0yMCwxMiArMjAsMTIgQEAKIAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCi0gICAgYW5kcm9pZC1zdXBwb3J0LXRlc3QgXAotICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwgXAotICAgIGN0c3Rlc3RydW5uZXIgXAorICAgIGFuZHJvaWR4LnRlc3QucnVsZXMgXAorICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0IFwKKyAgICBjdHN0ZXN0cnVubmVyLWF4dCBcCiAgICAgdWItdWlhdXRvbWF0b3IKIAotTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gbGVnYWN5LWFuZHJvaWQtdGVzdAorTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LmJhc2Uuc3R1YnMKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKSBcCiAgICAgLi4vRXh0ZXJuYWxTdG9yYWdlQXBwL3NyYy9jb20vYW5kcm9pZC9jdHMvZXh0ZXJuYWxzdG9yYWdlYXBwL0NvbW1vbkV4dGVybmFsU3RvcmFnZVRlc3QuamF2YSBcCkBAIC0zMyw2ICszMyw3IEBACiAgICAgLi4vVXNlUGVybWlzc2lvbkFwcDIzL3NyYy9jb20vYW5kcm9pZC9jdHMvdXNlcGVybWlzc2lvbi9CYXNlUGVybWlzc2lvbnNUZXN0LmphdmEKIAogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c1VzZVBlcm1pc3Npb25BcHAyMgorTE9DQUxfUFJJVkFURV9QTEFURk9STV9BUElTIDo9IHRydWUKIAogIyB0YWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAogTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1VzZVBlcm1pc3Npb25BcHAyMi9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvVXNlUGVybWlzc2lvbkFwcDIyL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggZWJiMGNiZi4uMTQyNGM3YyAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvVXNlUGVybWlzc2lvbkFwcDIyL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvVXNlUGVybWlzc2lvbkFwcDIyL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTcxLDcgKzcxLDcgQEAKICAgICA8L2FwcGxpY2F0aW9uPgogCiAgICAgPGluc3RydW1lbnRhdGlvbgotICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5hbmRyb2lkLmN0cy51c2VwZXJtaXNzaW9uIiAvPgogCiA8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvVXNlUGVybWlzc2lvbkFwcDIzL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Vc2VQZXJtaXNzaW9uQXBwMjMvQW5kcm9pZC5tawppbmRleCAzMDUzNTljLi43MzgwYWQxIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Vc2VQZXJtaXNzaW9uQXBwMjMvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Vc2VQZXJtaXNzaW9uQXBwMjMvQW5kcm9pZC5tawpAQCAtMjAsMTcgKzIwLDE4IEBACiAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCiBMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAotICAgIGFuZHJvaWQtc3VwcG9ydC10ZXN0IFwKLSAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsIFwKLSAgICBjdHN0ZXN0cnVubmVyIFwKKyAgICBhbmRyb2lkeC50ZXN0LnJ1bGVzIFwKKyAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBcCisgICAgY3RzdGVzdHJ1bm5lci1heHQgXAogICAgIHViLXVpYXV0b21hdG9yCiAKLUxPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGxlZ2FjeS1hbmRyb2lkLXRlc3QKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykgXAogICAgIC4uL0V4dGVybmFsU3RvcmFnZUFwcC9zcmMvY29tL2FuZHJvaWQvY3RzL2V4dGVybmFsc3RvcmFnZWFwcC9Db21tb25FeHRlcm5hbFN0b3JhZ2VUZXN0LmphdmEKIAogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c1VzZVBlcm1pc3Npb25BcHAyMworTE9DQUxfUFJJVkFURV9QTEFURk9STV9BUElTIDo9IHRydWUKIAogIyB0YWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAogTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1VzZVBlcm1pc3Npb25BcHAyMy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvVXNlUGVybWlzc2lvbkFwcDIzL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggNzFlYWRhYS4uZmM5ZmVkZCAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvVXNlUGVybWlzc2lvbkFwcDIzL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvVXNlUGVybWlzc2lvbkFwcDIzL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTY2LDExICs2NiwxMyBAQAogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQk9EWV9TRU5TT1JTIi8+CiAKICAgICA8YXBwbGljYXRpb24+CisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgorCiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLmN0cy51c2VwZXJtaXNzaW9uLkJhc2VQZXJtaXNzaW9uQWN0aXZpdHkiIC8+CiAgICAgPC9hcHBsaWNhdGlvbj4KIAogICAgIDxpbnN0cnVtZW50YXRpb24KLSAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5jdHMudXNlcGVybWlzc2lvbiIgLz4KIAogPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1VzZVBlcm1pc3Npb25BcHAyMy9zcmMvY29tL2FuZHJvaWQvY3RzL3VzZXBlcm1pc3Npb24vQmFzZVBlcm1pc3Npb25zVGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvVXNlUGVybWlzc2lvbkFwcDIzL3NyYy9jb20vYW5kcm9pZC9jdHMvdXNlcGVybWlzc2lvbi9CYXNlUGVybWlzc2lvbnNUZXN0LmphdmEKaW5kZXggZDBjYTYxNy4uNjhlYzdjYyAxMDA3NTUKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvVXNlUGVybWlzc2lvbkFwcDIzL3NyYy9jb20vYW5kcm9pZC9jdHMvdXNlcGVybWlzc2lvbi9CYXNlUGVybWlzc2lvbnNUZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvVXNlUGVybWlzc2lvbkFwcDIzL3NyYy9jb20vYW5kcm9pZC9jdHMvdXNlcGVybWlzc2lvbi9CYXNlUGVybWlzc2lvbnNUZXN0LmphdmEKQEAgLTMyLDE0ICszMiwxMyBAQAogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC51aWF1dG9tYXRvci5CeTsKIGltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC51aWF1dG9tYXRvci5VaURldmljZTsKIGltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC51aWF1dG9tYXRvci5VaU9iamVjdDsKIGltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC51aWF1dG9tYXRvci5VaU9iamVjdDI7CiBpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QudWlhdXRvbWF0b3IuVWlTY3JvbGxhYmxlOwogaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLlVpU2VsZWN0b3I7CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QudWlhdXRvbWF0b3IuVW50aWw7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkFycmF5TWFwOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50OwpAQCAtNDgsNiArNDcsOSBAQAogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNjcm9sbFZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuU3dpdGNoOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKIAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CkBAIC02Miw3NCArNjQsMTMgQEAKIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlUGVybWlzc2lvbnNUZXN0IHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExBVEZPUk1fUEFDS0FHRV9OQU1FID0gImFuZHJvaWQiOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBJRExFX1RJTUVPVVRfTUlMTElTID0gNTAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgR0xPQkFMX1RJTUVPVVRfTUlMTElTID0gNTAwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIElETEVfVElNRU9VVF9NSUxMSVMgPSAxMDAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgR0xPQkFMX1RJTUVPVVRfTUlMTElTID0gMTAwMDA7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFJFVFJZX1RJTUVPVVQgPSAzICogR0xPQkFMX1RJTUVPVVRfTUlMTElTOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkJhc2VQZXJtaXNzaW9uc1Rlc3QiOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiBzUGVybWlzc2lvblRvTGFiZWxSZXNOYW1lTWFwID0gbmV3IEFycmF5TWFwPD4oKTsKLSAgICBzdGF0aWMgewotICAgICAgICAvLyBDb250YWN0cwotICAgICAgICBzUGVybWlzc2lvblRvTGFiZWxSZXNOYW1lTWFwLnB1dChNYW5pZmVzdC5wZXJtaXNzaW9uLlJFQURfQ09OVEFDVFMsCi0gICAgICAgICAgICAgICAgIkBhbmRyb2lkOnN0cmluZy9wZXJtZ3JvdXBsYWJfY29udGFjdHMiKTsKLSAgICAgICAgc1Blcm1pc3Npb25Ub0xhYmVsUmVzTmFtZU1hcC5wdXQoTWFuaWZlc3QucGVybWlzc2lvbi5XUklURV9DT05UQUNUUywKLSAgICAgICAgICAgICAgICAiQGFuZHJvaWQ6c3RyaW5nL3Blcm1ncm91cGxhYl9jb250YWN0cyIpOwotICAgICAgICAvLyBDYWxlbmRhcgotICAgICAgICBzUGVybWlzc2lvblRvTGFiZWxSZXNOYW1lTWFwLnB1dChNYW5pZmVzdC5wZXJtaXNzaW9uLlJFQURfQ0FMRU5EQVIsCi0gICAgICAgICAgICAgICAgIkBhbmRyb2lkOnN0cmluZy9wZXJtZ3JvdXBsYWJfY2FsZW5kYXIiKTsKLSAgICAgICAgc1Blcm1pc3Npb25Ub0xhYmVsUmVzTmFtZU1hcC5wdXQoTWFuaWZlc3QucGVybWlzc2lvbi5XUklURV9DQUxFTkRBUiwKLSAgICAgICAgICAgICAgICAiQGFuZHJvaWQ6c3RyaW5nL3Blcm1ncm91cGxhYl9jYWxlbmRhciIpOwotICAgICAgICAvLyBTTVMKLSAgICAgICAgc1Blcm1pc3Npb25Ub0xhYmVsUmVzTmFtZU1hcC5wdXQoTWFuaWZlc3QucGVybWlzc2lvbi5TRU5EX1NNUywKLSAgICAgICAgICAgICAgICAiQGFuZHJvaWQ6c3RyaW5nL3Blcm1ncm91cGxhYl9zbXMiKTsKLSAgICAgICAgc1Blcm1pc3Npb25Ub0xhYmVsUmVzTmFtZU1hcC5wdXQoTWFuaWZlc3QucGVybWlzc2lvbi5SRUNFSVZFX1NNUywKLSAgICAgICAgICAgICAgICAiQGFuZHJvaWQ6c3RyaW5nL3Blcm1ncm91cGxhYl9zbXMiKTsKLSAgICAgICAgc1Blcm1pc3Npb25Ub0xhYmVsUmVzTmFtZU1hcC5wdXQoTWFuaWZlc3QucGVybWlzc2lvbi5SRUFEX1NNUywKLSAgICAgICAgICAgICAgICAiQGFuZHJvaWQ6c3RyaW5nL3Blcm1ncm91cGxhYl9zbXMiKTsKLSAgICAgICAgc1Blcm1pc3Npb25Ub0xhYmVsUmVzTmFtZU1hcC5wdXQoTWFuaWZlc3QucGVybWlzc2lvbi5SRUNFSVZFX1dBUF9QVVNILAotICAgICAgICAgICAgICAgICJAYW5kcm9pZDpzdHJpbmcvcGVybWdyb3VwbGFiX3NtcyIpOwotICAgICAgICBzUGVybWlzc2lvblRvTGFiZWxSZXNOYW1lTWFwLnB1dChNYW5pZmVzdC5wZXJtaXNzaW9uLlJFQ0VJVkVfTU1TLAotICAgICAgICAgICAgICAgICJAYW5kcm9pZDpzdHJpbmcvcGVybWdyb3VwbGFiX3NtcyIpOwotICAgICAgICBzUGVybWlzc2lvblRvTGFiZWxSZXNOYW1lTWFwLnB1dCgiYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfQ0VMTF9CUk9BRENBU1RTIiwKLSAgICAgICAgICAgICAgICAiQGFuZHJvaWQ6c3RyaW5nL3Blcm1ncm91cGxhYl9zbXMiKTsKLSAgICAgICAgLy8gU3RvcmFnZQotICAgICAgICBzUGVybWlzc2lvblRvTGFiZWxSZXNOYW1lTWFwLnB1dChNYW5pZmVzdC5wZXJtaXNzaW9uLlJFQURfRVhURVJOQUxfU1RPUkFHRSwKLSAgICAgICAgICAgICAgICAiQGFuZHJvaWQ6c3RyaW5nL3Blcm1ncm91cGxhYl9zdG9yYWdlIik7Ci0gICAgICAgIHNQZXJtaXNzaW9uVG9MYWJlbFJlc05hbWVNYXAucHV0KE1hbmlmZXN0LnBlcm1pc3Npb24uV1JJVEVfRVhURVJOQUxfU1RPUkFHRSwKLSAgICAgICAgICAgICAgICAiQGFuZHJvaWQ6c3RyaW5nL3Blcm1ncm91cGxhYl9zdG9yYWdlIik7Ci0gICAgICAgIC8vIExvY2F0aW9uCi0gICAgICAgIHNQZXJtaXNzaW9uVG9MYWJlbFJlc05hbWVNYXAucHV0KE1hbmlmZXN0LnBlcm1pc3Npb24uQUNDRVNTX0ZJTkVfTE9DQVRJT04sCi0gICAgICAgICAgICAgICAgIkBhbmRyb2lkOnN0cmluZy9wZXJtZ3JvdXBsYWJfbG9jYXRpb24iKTsKLSAgICAgICAgc1Blcm1pc3Npb25Ub0xhYmVsUmVzTmFtZU1hcC5wdXQoTWFuaWZlc3QucGVybWlzc2lvbi5BQ0NFU1NfQ09BUlNFX0xPQ0FUSU9OLAotICAgICAgICAgICAgICAgICJAYW5kcm9pZDpzdHJpbmcvcGVybWdyb3VwbGFiX2xvY2F0aW9uIik7Ci0gICAgICAgIC8vIFBob25lCi0gICAgICAgIHNQZXJtaXNzaW9uVG9MYWJlbFJlc05hbWVNYXAucHV0KE1hbmlmZXN0LnBlcm1pc3Npb24uUkVBRF9QSE9ORV9TVEFURSwKLSAgICAgICAgICAgICAgICAiQGFuZHJvaWQ6c3RyaW5nL3Blcm1ncm91cGxhYl9waG9uZSIpOwotICAgICAgICBzUGVybWlzc2lvblRvTGFiZWxSZXNOYW1lTWFwLnB1dChNYW5pZmVzdC5wZXJtaXNzaW9uLkNBTExfUEhPTkUsCi0gICAgICAgICAgICAgICAgIkBhbmRyb2lkOnN0cmluZy9wZXJtZ3JvdXBsYWJfcGhvbmUiKTsKLSAgICAgICAgc1Blcm1pc3Npb25Ub0xhYmVsUmVzTmFtZU1hcC5wdXQoImFuZHJvaWQucGVybWlzc2lvbi5BQ0NFU1NfSU1TX0NBTExfU0VSVklDRSIsCi0gICAgICAgICAgICAgICAgIkBhbmRyb2lkOnN0cmluZy9wZXJtZ3JvdXBsYWJfcGhvbmUiKTsKLSAgICAgICAgc1Blcm1pc3Npb25Ub0xhYmVsUmVzTmFtZU1hcC5wdXQoTWFuaWZlc3QucGVybWlzc2lvbi5SRUFEX0NBTExfTE9HLAotICAgICAgICAgICAgICAgICJAYW5kcm9pZDpzdHJpbmcvcGVybWdyb3VwbGFiX3Bob25lIik7Ci0gICAgICAgIHNQZXJtaXNzaW9uVG9MYWJlbFJlc05hbWVNYXAucHV0KE1hbmlmZXN0LnBlcm1pc3Npb24uV1JJVEVfQ0FMTF9MT0csCi0gICAgICAgICAgICAgICAgIkBhbmRyb2lkOnN0cmluZy9wZXJtZ3JvdXBsYWJfcGhvbmUiKTsKLSAgICAgICAgc1Blcm1pc3Npb25Ub0xhYmVsUmVzTmFtZU1hcC5wdXQoTWFuaWZlc3QucGVybWlzc2lvbi5BRERfVk9JQ0VNQUlMLAotICAgICAgICAgICAgICAgICJAYW5kcm9pZDpzdHJpbmcvcGVybWdyb3VwbGFiX3Bob25lIik7Ci0gICAgICAgIHNQZXJtaXNzaW9uVG9MYWJlbFJlc05hbWVNYXAucHV0KE1hbmlmZXN0LnBlcm1pc3Npb24uVVNFX1NJUCwKLSAgICAgICAgICAgICAgICAiQGFuZHJvaWQ6c3RyaW5nL3Blcm1ncm91cGxhYl9waG9uZSIpOwotICAgICAgICBzUGVybWlzc2lvblRvTGFiZWxSZXNOYW1lTWFwLnB1dChNYW5pZmVzdC5wZXJtaXNzaW9uLlBST0NFU1NfT1VUR09JTkdfQ0FMTFMsCi0gICAgICAgICAgICAgICAgIkBhbmRyb2lkOnN0cmluZy9wZXJtZ3JvdXBsYWJfcGhvbmUiKTsKLSAgICAgICAgLy8gTWljcm9waG9uZQotICAgICAgICBzUGVybWlzc2lvblRvTGFiZWxSZXNOYW1lTWFwLnB1dChNYW5pZmVzdC5wZXJtaXNzaW9uLlJFQ09SRF9BVURJTywKLSAgICAgICAgICAgICAgICAiQGFuZHJvaWQ6c3RyaW5nL3Blcm1ncm91cGxhYl9taWNyb3Bob25lIik7Ci0gICAgICAgIC8vIENhbWVyYQotICAgICAgICBzUGVybWlzc2lvblRvTGFiZWxSZXNOYW1lTWFwLnB1dChNYW5pZmVzdC5wZXJtaXNzaW9uLkNBTUVSQSwKLSAgICAgICAgICAgICAgICAiQGFuZHJvaWQ6c3RyaW5nL3Blcm1ncm91cGxhYl9jYW1lcmEiKTsKLSAgICAgICAgLy8gQm9keSBzZW5zb3JzCi0gICAgICAgIHNQZXJtaXNzaW9uVG9MYWJlbFJlc05hbWVNYXAucHV0KE1hbmlmZXN0LnBlcm1pc3Npb24uQk9EWV9TRU5TT1JTLAotICAgICAgICAgICAgICAgICJAYW5kcm9pZDpzdHJpbmcvcGVybWdyb3VwbGFiX3NlbnNvcnMiKTsKLSAgICB9CiAKICAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CiAgICAgcHJpdmF0ZSBSZXNvdXJjZXMgbVBsYXRmb3JtUmVzb3VyY2VzOwpAQCAtMTY4LDYgKzEwOSwxNDMgQEAKICAgICAgICAgcmV0dXJuIGFjdGl2aXR5OwogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBpbml0UGVybWlzc2lvblRvTGFiZWxNYXAoYm9vbGVhbiBwZXJtaXNzaW9uUmV2aWV3TW9kZSkgeworICAgICAgICBpZiAoIXBlcm1pc3Npb25SZXZpZXdNb2RlKSB7CisgICAgICAgICAgICAvLyBDb250YWN0cworICAgICAgICAgICAgc1Blcm1pc3Npb25Ub0xhYmVsUmVzTmFtZU1hcC5wdXQoCisgICAgICAgICAgICAgICAgICAgIE1hbmlmZXN0LnBlcm1pc3Npb24uUkVBRF9DT05UQUNUUywgIkBhbmRyb2lkOnN0cmluZy9wZXJtZ3JvdXBsYWJfY29udGFjdHMiKTsKKyAgICAgICAgICAgIHNQZXJtaXNzaW9uVG9MYWJlbFJlc05hbWVNYXAucHV0KAorICAgICAgICAgICAgICAgICAgICBNYW5pZmVzdC5wZXJtaXNzaW9uLldSSVRFX0NPTlRBQ1RTLCAiQGFuZHJvaWQ6c3RyaW5nL3Blcm1ncm91cGxhYl9jb250YWN0cyIpOworICAgICAgICAgICAgLy8gQ2FsZW5kYXIKKyAgICAgICAgICAgIHNQZXJtaXNzaW9uVG9MYWJlbFJlc05hbWVNYXAucHV0KAorICAgICAgICAgICAgICAgICAgICBNYW5pZmVzdC5wZXJtaXNzaW9uLlJFQURfQ0FMRU5EQVIsICJAYW5kcm9pZDpzdHJpbmcvcGVybWdyb3VwbGFiX2NhbGVuZGFyIik7CisgICAgICAgICAgICBzUGVybWlzc2lvblRvTGFiZWxSZXNOYW1lTWFwLnB1dCgKKyAgICAgICAgICAgICAgICAgICAgTWFuaWZlc3QucGVybWlzc2lvbi5XUklURV9DQUxFTkRBUiwgIkBhbmRyb2lkOnN0cmluZy9wZXJtZ3JvdXBsYWJfY2FsZW5kYXIiKTsKKyAgICAgICAgICAgIC8vIFNNUworICAgICAgICAgICAgc1Blcm1pc3Npb25Ub0xhYmVsUmVzTmFtZU1hcC5wdXQoCisgICAgICAgICAgICAgICAgICAgIE1hbmlmZXN0LnBlcm1pc3Npb24uU0VORF9TTVMsICJAYW5kcm9pZDpzdHJpbmcvcGVybWdyb3VwbGFiX3NtcyIpOworICAgICAgICAgICAgc1Blcm1pc3Npb25Ub0xhYmVsUmVzTmFtZU1hcC5wdXQoCisgICAgICAgICAgICAgICAgICAgIE1hbmlmZXN0LnBlcm1pc3Npb24uUkVDRUlWRV9TTVMsICJAYW5kcm9pZDpzdHJpbmcvcGVybWdyb3VwbGFiX3NtcyIpOworICAgICAgICAgICAgc1Blcm1pc3Npb25Ub0xhYmVsUmVzTmFtZU1hcC5wdXQoCisgICAgICAgICAgICAgICAgICAgIE1hbmlmZXN0LnBlcm1pc3Npb24uUkVBRF9TTVMsICJAYW5kcm9pZDpzdHJpbmcvcGVybWdyb3VwbGFiX3NtcyIpOworICAgICAgICAgICAgc1Blcm1pc3Npb25Ub0xhYmVsUmVzTmFtZU1hcC5wdXQoCisgICAgICAgICAgICAgICAgICAgIE1hbmlmZXN0LnBlcm1pc3Npb24uUkVDRUlWRV9XQVBfUFVTSCwgIkBhbmRyb2lkOnN0cmluZy9wZXJtZ3JvdXBsYWJfc21zIik7CisgICAgICAgICAgICBzUGVybWlzc2lvblRvTGFiZWxSZXNOYW1lTWFwLnB1dCgKKyAgICAgICAgICAgICAgICAgICAgTWFuaWZlc3QucGVybWlzc2lvbi5SRUNFSVZFX01NUywgIkBhbmRyb2lkOnN0cmluZy9wZXJtZ3JvdXBsYWJfc21zIik7CisgICAgICAgICAgICBzUGVybWlzc2lvblRvTGFiZWxSZXNOYW1lTWFwLnB1dCgKKyAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX0NFTExfQlJPQURDQVNUUyIsICJAYW5kcm9pZDpzdHJpbmcvcGVybWdyb3VwbGFiX3NtcyIpOworICAgICAgICAgICAgLy8gU3RvcmFnZQorICAgICAgICAgICAgc1Blcm1pc3Npb25Ub0xhYmVsUmVzTmFtZU1hcC5wdXQoCisgICAgICAgICAgICAgICAgICAgIE1hbmlmZXN0LnBlcm1pc3Npb24uUkVBRF9FWFRFUk5BTF9TVE9SQUdFLAorICAgICAgICAgICAgICAgICAgICAiQGFuZHJvaWQ6c3RyaW5nL3Blcm1ncm91cGxhYl9zdG9yYWdlIik7CisgICAgICAgICAgICBzUGVybWlzc2lvblRvTGFiZWxSZXNOYW1lTWFwLnB1dCgKKyAgICAgICAgICAgICAgICAgICAgTWFuaWZlc3QucGVybWlzc2lvbi5XUklURV9FWFRFUk5BTF9TVE9SQUdFLAorICAgICAgICAgICAgICAgICAgICAiQGFuZHJvaWQ6c3RyaW5nL3Blcm1ncm91cGxhYl9zdG9yYWdlIik7CisgICAgICAgICAgICAvLyBMb2NhdGlvbgorICAgICAgICAgICAgc1Blcm1pc3Npb25Ub0xhYmVsUmVzTmFtZU1hcC5wdXQoCisgICAgICAgICAgICAgICAgICAgIE1hbmlmZXN0LnBlcm1pc3Npb24uQUNDRVNTX0ZJTkVfTE9DQVRJT04sCisgICAgICAgICAgICAgICAgICAgICJAYW5kcm9pZDpzdHJpbmcvcGVybWdyb3VwbGFiX2xvY2F0aW9uIik7CisgICAgICAgICAgICBzUGVybWlzc2lvblRvTGFiZWxSZXNOYW1lTWFwLnB1dCgKKyAgICAgICAgICAgICAgICAgICAgTWFuaWZlc3QucGVybWlzc2lvbi5BQ0NFU1NfQ09BUlNFX0xPQ0FUSU9OLAorICAgICAgICAgICAgICAgICAgICAiQGFuZHJvaWQ6c3RyaW5nL3Blcm1ncm91cGxhYl9sb2NhdGlvbiIpOworICAgICAgICAgICAgLy8gUGhvbmUKKyAgICAgICAgICAgIHNQZXJtaXNzaW9uVG9MYWJlbFJlc05hbWVNYXAucHV0KAorICAgICAgICAgICAgICAgICAgICBNYW5pZmVzdC5wZXJtaXNzaW9uLlJFQURfUEhPTkVfU1RBVEUsICJAYW5kcm9pZDpzdHJpbmcvcGVybWdyb3VwbGFiX3Bob25lIik7CisgICAgICAgICAgICBzUGVybWlzc2lvblRvTGFiZWxSZXNOYW1lTWFwLnB1dCgKKyAgICAgICAgICAgICAgICAgICAgTWFuaWZlc3QucGVybWlzc2lvbi5DQUxMX1BIT05FLCAiQGFuZHJvaWQ6c3RyaW5nL3Blcm1ncm91cGxhYl9waG9uZSIpOworICAgICAgICAgICAgc1Blcm1pc3Npb25Ub0xhYmVsUmVzTmFtZU1hcC5wdXQoCisgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX0lNU19DQUxMX1NFUlZJQ0UiLAorICAgICAgICAgICAgICAgICAgICAiQGFuZHJvaWQ6c3RyaW5nL3Blcm1ncm91cGxhYl9waG9uZSIpOworICAgICAgICAgICAgc1Blcm1pc3Npb25Ub0xhYmVsUmVzTmFtZU1hcC5wdXQoCisgICAgICAgICAgICAgICAgICAgIE1hbmlmZXN0LnBlcm1pc3Npb24uUkVBRF9DQUxMX0xPRywgIkBhbmRyb2lkOnN0cmluZy9wZXJtZ3JvdXBsYWJfcGhvbmUiKTsKKyAgICAgICAgICAgIHNQZXJtaXNzaW9uVG9MYWJlbFJlc05hbWVNYXAucHV0KAorICAgICAgICAgICAgICAgICAgICBNYW5pZmVzdC5wZXJtaXNzaW9uLldSSVRFX0NBTExfTE9HLCAiQGFuZHJvaWQ6c3RyaW5nL3Blcm1ncm91cGxhYl9waG9uZSIpOworICAgICAgICAgICAgc1Blcm1pc3Npb25Ub0xhYmVsUmVzTmFtZU1hcC5wdXQoCisgICAgICAgICAgICAgICAgICAgIE1hbmlmZXN0LnBlcm1pc3Npb24uQUREX1ZPSUNFTUFJTCwgIkBhbmRyb2lkOnN0cmluZy9wZXJtZ3JvdXBsYWJfcGhvbmUiKTsKKyAgICAgICAgICAgIHNQZXJtaXNzaW9uVG9MYWJlbFJlc05hbWVNYXAucHV0KAorICAgICAgICAgICAgICAgICAgICBNYW5pZmVzdC5wZXJtaXNzaW9uLlVTRV9TSVAsICJAYW5kcm9pZDpzdHJpbmcvcGVybWdyb3VwbGFiX3Bob25lIik7CisgICAgICAgICAgICBzUGVybWlzc2lvblRvTGFiZWxSZXNOYW1lTWFwLnB1dCgKKyAgICAgICAgICAgICAgICAgICAgTWFuaWZlc3QucGVybWlzc2lvbi5QUk9DRVNTX09VVEdPSU5HX0NBTExTLAorICAgICAgICAgICAgICAgICAgICAiQGFuZHJvaWQ6c3RyaW5nL3Blcm1ncm91cGxhYl9waG9uZSIpOworICAgICAgICAgICAgLy8gTWljcm9waG9uZQorICAgICAgICAgICAgc1Blcm1pc3Npb25Ub0xhYmVsUmVzTmFtZU1hcC5wdXQoCisgICAgICAgICAgICAgICAgICAgIE1hbmlmZXN0LnBlcm1pc3Npb24uUkVDT1JEX0FVRElPLCAiQGFuZHJvaWQ6c3RyaW5nL3Blcm1ncm91cGxhYl9taWNyb3Bob25lIik7CisgICAgICAgICAgICAvLyBDYW1lcmEKKyAgICAgICAgICAgIHNQZXJtaXNzaW9uVG9MYWJlbFJlc05hbWVNYXAucHV0KAorICAgICAgICAgICAgICAgICAgICBNYW5pZmVzdC5wZXJtaXNzaW9uLkNBTUVSQSwgIkBhbmRyb2lkOnN0cmluZy9wZXJtZ3JvdXBsYWJfY2FtZXJhIik7CisgICAgICAgICAgICAvLyBCb2R5IHNlbnNvcnMKKyAgICAgICAgICAgIHNQZXJtaXNzaW9uVG9MYWJlbFJlc05hbWVNYXAucHV0KAorICAgICAgICAgICAgICAgICAgICBNYW5pZmVzdC5wZXJtaXNzaW9uLkJPRFlfU0VOU09SUywgIkBhbmRyb2lkOnN0cmluZy9wZXJtZ3JvdXBsYWJfc2Vuc29ycyIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gQ29udGFjdHMKKyAgICAgICAgICAgIHNQZXJtaXNzaW9uVG9MYWJlbFJlc05hbWVNYXAucHV0KAorICAgICAgICAgICAgICAgICAgICBNYW5pZmVzdC5wZXJtaXNzaW9uLlJFQURfQ09OVEFDVFMsICJAYW5kcm9pZDpzdHJpbmcvcGVybWxhYl9yZWFkQ29udGFjdHMiKTsKKyAgICAgICAgICAgIHNQZXJtaXNzaW9uVG9MYWJlbFJlc05hbWVNYXAucHV0KAorICAgICAgICAgICAgICAgICAgICBNYW5pZmVzdC5wZXJtaXNzaW9uLldSSVRFX0NPTlRBQ1RTLCAiQGFuZHJvaWQ6c3RyaW5nL3Blcm1sYWJfd3JpdGVDb250YWN0cyIpOworICAgICAgICAgICAgLy8gQ2FsZW5kYXIKKyAgICAgICAgICAgIHNQZXJtaXNzaW9uVG9MYWJlbFJlc05hbWVNYXAucHV0KAorICAgICAgICAgICAgICAgICAgICBNYW5pZmVzdC5wZXJtaXNzaW9uLlJFQURfQ0FMRU5EQVIsICJAYW5kcm9pZDpzdHJpbmcvcGVybWdyb3VwbGFiX2NhbGVuZGFyIik7CisgICAgICAgICAgICBzUGVybWlzc2lvblRvTGFiZWxSZXNOYW1lTWFwLnB1dCgKKyAgICAgICAgICAgICAgICAgICAgTWFuaWZlc3QucGVybWlzc2lvbi5XUklURV9DQUxFTkRBUiwgIkBhbmRyb2lkOnN0cmluZy9wZXJtZ3JvdXBsYWJfY2FsZW5kYXIiKTsKKyAgICAgICAgICAgIC8vIFNNUworICAgICAgICAgICAgc1Blcm1pc3Npb25Ub0xhYmVsUmVzTmFtZU1hcC5wdXQoCisgICAgICAgICAgICAgICAgICAgIE1hbmlmZXN0LnBlcm1pc3Npb24uU0VORF9TTVMsICJAYW5kcm9pZDpzdHJpbmcvcGVybWxhYl9zZW5kU21zIik7CisgICAgICAgICAgICBzUGVybWlzc2lvblRvTGFiZWxSZXNOYW1lTWFwLnB1dCgKKyAgICAgICAgICAgICAgICAgICAgTWFuaWZlc3QucGVybWlzc2lvbi5SRUNFSVZFX1NNUywgIkBhbmRyb2lkOnN0cmluZy9wZXJtbGFiX3JlY2VpdmVTbXMiKTsKKyAgICAgICAgICAgIHNQZXJtaXNzaW9uVG9MYWJlbFJlc05hbWVNYXAucHV0KAorICAgICAgICAgICAgICAgICAgICBNYW5pZmVzdC5wZXJtaXNzaW9uLlJFQURfU01TLCAiQGFuZHJvaWQ6c3RyaW5nL3Blcm1sYWJfcmVhZFNtcyIpOworICAgICAgICAgICAgc1Blcm1pc3Npb25Ub0xhYmVsUmVzTmFtZU1hcC5wdXQoCisgICAgICAgICAgICAgICAgICAgIE1hbmlmZXN0LnBlcm1pc3Npb24uUkVDRUlWRV9XQVBfUFVTSCwgIkBhbmRyb2lkOnN0cmluZy9wZXJtbGFiX3JlY2VpdmVXYXBQdXNoIik7CisgICAgICAgICAgICBzUGVybWlzc2lvblRvTGFiZWxSZXNOYW1lTWFwLnB1dCgKKyAgICAgICAgICAgICAgICAgICAgTWFuaWZlc3QucGVybWlzc2lvbi5SRUNFSVZFX01NUywgIkBhbmRyb2lkOnN0cmluZy9wZXJtbGFiX3JlY2VpdmVNbXMiKTsKKyAgICAgICAgICAgIHNQZXJtaXNzaW9uVG9MYWJlbFJlc05hbWVNYXAucHV0KAorICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfQ0VMTF9CUk9BRENBU1RTIiwKKyAgICAgICAgICAgICAgICAgICAgIkBhbmRyb2lkOnN0cmluZy9wZXJtbGFiX3JlYWRDZWxsQnJvYWRjYXN0cyIpOworICAgICAgICAgICAgLy8gU3RvcmFnZQorICAgICAgICAgICAgc1Blcm1pc3Npb25Ub0xhYmVsUmVzTmFtZU1hcC5wdXQoCisgICAgICAgICAgICAgICAgICAgIE1hbmlmZXN0LnBlcm1pc3Npb24uUkVBRF9FWFRFUk5BTF9TVE9SQUdFLAorICAgICAgICAgICAgICAgICAgICAiQGFuZHJvaWQ6c3RyaW5nL3Blcm1ncm91cGxhYl9zdG9yYWdlIik7CisgICAgICAgICAgICBzUGVybWlzc2lvblRvTGFiZWxSZXNOYW1lTWFwLnB1dCgKKyAgICAgICAgICAgICAgICAgICAgTWFuaWZlc3QucGVybWlzc2lvbi5XUklURV9FWFRFUk5BTF9TVE9SQUdFLAorICAgICAgICAgICAgICAgICAgICAiQGFuZHJvaWQ6c3RyaW5nL3Blcm1ncm91cGxhYl9zdG9yYWdlIik7CisgICAgICAgICAgICAvLyBMb2NhdGlvbgorICAgICAgICAgICAgc1Blcm1pc3Npb25Ub0xhYmVsUmVzTmFtZU1hcC5wdXQoCisgICAgICAgICAgICAgICAgICAgIE1hbmlmZXN0LnBlcm1pc3Npb24uQUNDRVNTX0ZJTkVfTE9DQVRJT04sCisgICAgICAgICAgICAgICAgICAgICJAYW5kcm9pZDpzdHJpbmcvcGVybWdyb3VwbGFiX2xvY2F0aW9uIik7CisgICAgICAgICAgICBzUGVybWlzc2lvblRvTGFiZWxSZXNOYW1lTWFwLnB1dCgKKyAgICAgICAgICAgICAgICAgICAgTWFuaWZlc3QucGVybWlzc2lvbi5BQ0NFU1NfQ09BUlNFX0xPQ0FUSU9OLAorICAgICAgICAgICAgICAgICAgICAiQGFuZHJvaWQ6c3RyaW5nL3Blcm1ncm91cGxhYl9sb2NhdGlvbiIpOworICAgICAgICAgICAgLy8gUGhvbmUKKyAgICAgICAgICAgIHNQZXJtaXNzaW9uVG9MYWJlbFJlc05hbWVNYXAucHV0KAorICAgICAgICAgICAgICAgICAgICBNYW5pZmVzdC5wZXJtaXNzaW9uLlJFQURfUEhPTkVfU1RBVEUsICJAYW5kcm9pZDpzdHJpbmcvcGVybWxhYl9yZWFkUGhvbmVTdGF0ZSIpOworICAgICAgICAgICAgc1Blcm1pc3Npb25Ub0xhYmVsUmVzTmFtZU1hcC5wdXQoCisgICAgICAgICAgICAgICAgICAgIE1hbmlmZXN0LnBlcm1pc3Npb24uQ0FMTF9QSE9ORSwgIkBhbmRyb2lkOnN0cmluZy9wZXJtbGFiX2NhbGxQaG9uZSIpOworICAgICAgICAgICAgc1Blcm1pc3Npb25Ub0xhYmVsUmVzTmFtZU1hcC5wdXQoCisgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX0lNU19DQUxMX1NFUlZJQ0UiLAorICAgICAgICAgICAgICAgICAgICAiQGFuZHJvaWQ6c3RyaW5nL3Blcm1sYWJfYWNjZXNzSW1zQ2FsbFNlcnZpY2UiKTsKKyAgICAgICAgICAgIHNQZXJtaXNzaW9uVG9MYWJlbFJlc05hbWVNYXAucHV0KAorICAgICAgICAgICAgICAgICAgICBNYW5pZmVzdC5wZXJtaXNzaW9uLlJFQURfQ0FMTF9MT0csICJAYW5kcm9pZDpzdHJpbmcvcGVybWxhYl9yZWFkQ2FsbExvZyIpOworICAgICAgICAgICAgc1Blcm1pc3Npb25Ub0xhYmVsUmVzTmFtZU1hcC5wdXQoCisgICAgICAgICAgICAgICAgICAgIE1hbmlmZXN0LnBlcm1pc3Npb24uV1JJVEVfQ0FMTF9MT0csICJAYW5kcm9pZDpzdHJpbmcvcGVybWxhYl93cml0ZUNhbGxMb2ciKTsKKyAgICAgICAgICAgIHNQZXJtaXNzaW9uVG9MYWJlbFJlc05hbWVNYXAucHV0KAorICAgICAgICAgICAgICAgICAgICBNYW5pZmVzdC5wZXJtaXNzaW9uLkFERF9WT0lDRU1BSUwsICJAYW5kcm9pZDpzdHJpbmcvcGVybWxhYl9hZGRWb2ljZW1haWwiKTsKKyAgICAgICAgICAgIHNQZXJtaXNzaW9uVG9MYWJlbFJlc05hbWVNYXAucHV0KAorICAgICAgICAgICAgICAgICAgICBNYW5pZmVzdC5wZXJtaXNzaW9uLlVTRV9TSVAsICJAYW5kcm9pZDpzdHJpbmcvcGVybWxhYl91c2Vfc2lwIik7CisgICAgICAgICAgICBzUGVybWlzc2lvblRvTGFiZWxSZXNOYW1lTWFwLnB1dCgKKyAgICAgICAgICAgICAgICAgICAgTWFuaWZlc3QucGVybWlzc2lvbi5QUk9DRVNTX09VVEdPSU5HX0NBTExTLAorICAgICAgICAgICAgICAgICAgICAiQGFuZHJvaWQ6c3RyaW5nL3Blcm1sYWJfcHJvY2Vzc091dGdvaW5nQ2FsbHMiKTsKKyAgICAgICAgICAgIC8vIE1pY3JvcGhvbmUKKyAgICAgICAgICAgIHNQZXJtaXNzaW9uVG9MYWJlbFJlc05hbWVNYXAucHV0KAorICAgICAgICAgICAgICAgICAgICBNYW5pZmVzdC5wZXJtaXNzaW9uLlJFQ09SRF9BVURJTywgIkBhbmRyb2lkOnN0cmluZy9wZXJtZ3JvdXBsYWJfbWljcm9waG9uZSIpOworICAgICAgICAgICAgLy8gQ2FtZXJhCisgICAgICAgICAgICBzUGVybWlzc2lvblRvTGFiZWxSZXNOYW1lTWFwLnB1dCgKKyAgICAgICAgICAgICAgICAgICAgTWFuaWZlc3QucGVybWlzc2lvbi5DQU1FUkEsICJAYW5kcm9pZDpzdHJpbmcvcGVybWdyb3VwbGFiX2NhbWVyYSIpOworICAgICAgICAgICAgLy8gQm9keSBzZW5zb3JzCisgICAgICAgICAgICBzUGVybWlzc2lvblRvTGFiZWxSZXNOYW1lTWFwLnB1dCgKKyAgICAgICAgICAgICAgICAgICAgTWFuaWZlc3QucGVybWlzc2lvbi5CT0RZX1NFTlNPUlMsICJAYW5kcm9pZDpzdHJpbmcvcGVybWdyb3VwbGFiX3NlbnNvcnMiKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIEBCZWZvcmUKICAgICBwdWJsaWMgdm9pZCBiZWZvcmVUZXN0KCkgewogICAgICAgICBtQ29udGV4dCA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldFRhcmdldENvbnRleHQoKTsKQEAgLTE3OCw3ICsyNTYsOSBAQAogICAgICAgICAgICAgLyogY2Fubm90IGhhcHBlbiAqLwogICAgICAgICB9CiAKLSAgICAgICAgbVdhdGNoID0gbUNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKS5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfV0FUQ0gpOworICAgICAgICBQYWNrYWdlTWFuYWdlciBwYWNrYWdlTWFuYWdlciA9IG1Db250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgIG1XYXRjaCA9IHBhY2thZ2VNYW5hZ2VyLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9XQVRDSCk7CisgICAgICAgIGluaXRQZXJtaXNzaW9uVG9MYWJlbE1hcChwYWNrYWdlTWFuYWdlci5pc1Blcm1pc3Npb25SZXZpZXdNb2RlRW5hYmxlZCgpKTsKIAogICAgICAgICBVaU9iamVjdDIgYnV0dG9uID0gZ2V0VWlEZXZpY2UoKS5maW5kT2JqZWN0KEJ5LnRleHQoIkNsb3NlIikpOwogICAgICAgICBpZiAoYnV0dG9uICE9IG51bGwpIHsKQEAgLTI1Myw2ICszMzMsNyBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIHNjcm9sbFRvQm90dG9tSWZXYXRjaCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBpZiAobVdhdGNoKSB7CisgICAgICAgICAgICBnZXRVaURldmljZSgpLndhaXQoVW50aWwuZmluZE9iamVjdChCeS5jbGF6eihTY3JvbGxWaWV3LmNsYXNzKSksIEdMT0JBTF9USU1FT1VUX01JTExJUyk7CiAgICAgICAgICAgICBVaVNjcm9sbGFibGUgc2Nyb2xsYWJsZSA9CiAgICAgICAgICAgICAgICAgICAgIG5ldyBVaVNjcm9sbGFibGUobmV3IFVpU2VsZWN0b3IoKS5jbGFzc05hbWUoU2Nyb2xsVmlldy5jbGFzcykpOwogICAgICAgICAgICAgaWYgKHNjcm9sbGFibGUuZXhpc3RzKCkpIHsKQEAgLTI3OCw2ICszNTksNyBAQAogICAgICAgICAvLyBPcGVuIHRoZSBhcHAgZGV0YWlscyBzZXR0aW5ncwogICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChTZXR0aW5ncy5BQ1RJT05fQVBQTElDQVRJT05fREVUQUlMU19TRVRUSU5HUyk7CiAgICAgICAgIGludGVudC5hZGRDYXRlZ29yeShJbnRlbnQuQ0FURUdPUllfREVGQVVMVCk7CisgICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7CiAgICAgICAgIGludGVudC5zZXREYXRhKFVyaS5wYXJzZSgicGFja2FnZToiICsgbUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSkpOwogICAgICAgICBzdGFydEFjdGl2aXR5KGludGVudCk7CiAKQEAgLTI5MSw3ICszNzMsNyBAQAogICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gcGVybUl0ZW1WaWV3ID0gZmluZENvbGxlY3Rpb25JdGVtKHBlcm1MYWJlbFZpZXcpOwogICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiUGVybWlzc2lvbnMgaXRlbSBzaG91bGQgYmUgcHJlc2VudCIsIHBlcm1JdGVtVmlldyk7CiAKLSAgICAgICAgY2xpY2socGVybUl0ZW1WaWV3KTsKKyAgICAgICAgY2xpY2socGVybUl0ZW1WaWV3LCB0cnVlKTsKIAogICAgICAgICB3YWl0Rm9ySWRsZSgpOwogCkBAIC0zMTIsMTUgKzM5NCwxNyBAQAogICAgICAgICAgICAgaWYgKGdyYW50ZWQgIT0gd2FzR3JhbnRlZCkgewogICAgICAgICAgICAgICAgIC8vIFRvZ2dsZSB0aGUgcGVybWlzc2lvbgogCisgICAgICAgICAgICAgICAgYm9vbGVhbiB3aWxsU2hvd1BvcHVwID0gKHdhc0dyYW50ZWQgJiYgbGVnYWN5QXBwKTsKKwogICAgICAgICAgICAgICAgIGlmICghaXRlbVZpZXcuZ2V0QWN0aW9uTGlzdCgpLmNvbnRhaW5zKEFjY2Vzc2liaWxpdHlBY3Rpb24uQUNUSU9OX0NMSUNLKSkgewotICAgICAgICAgICAgICAgICAgICBjbGljayh0b2dnbGVWaWV3KTsKKyAgICAgICAgICAgICAgICAgICAgY2xpY2sodG9nZ2xlVmlldywgd2lsbFNob3dQb3B1cCk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY2xpY2soaXRlbVZpZXcpOworICAgICAgICAgICAgICAgICAgICBjbGljayhpdGVtVmlldywgd2lsbFNob3dQb3B1cCk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgd2FpdEZvcklkbGUoKTsKIAotICAgICAgICAgICAgICAgIGlmICh3YXNHcmFudGVkICYmIGxlZ2FjeUFwcCkgeworICAgICAgICAgICAgICAgIGlmICh3aWxsU2hvd1BvcHVwKSB7CiAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFRvQm90dG9tSWZXYXRjaCgpOwogICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRDb250ZXh0KCkuZ2V0UGFja2FnZU1hbmFnZXIoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQZXJtaXNzaW9uQ29udHJvbGxlclBhY2thZ2VOYW1lKCk7CkBAIC0zNTgsNiArNDQyLDcgQEAKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0Q29udGV4dCgpLnN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkNhbm5vdCBzdGFydCBhY3Rpdml0eTogIiArIGludGVudCwgZSk7CiAgICAgICAgICAgICAgICAgZmFpbCgiQ2Fubm90IHN0YXJ0IGFjdGl2aXR5OiAiICsgaW50ZW50KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSwgKEFjY2Vzc2liaWxpdHlFdmVudCBldmVudCkgLT4gZXZlbnQuZ2V0RXZlbnRUeXBlKCkKQEAgLTQwMCw3ICs0ODUsOSBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY2hpbGQuZ2V0QWN0aW9uTGlzdCgpLmNvbnRhaW5zKEFjY2Vzc2liaWxpdHlBY3Rpb24uQUNUSU9OX1NDUk9MTF9GT1JXQVJEKSkgeworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY2hpbGQuZ2V0QWN0aW9uTGlzdCgpLmNvbnRhaW5zKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlBY3Rpb24uQUNUSU9OX1NDUk9MTF9GT1JXQVJEKSB8fCBjaGlsZC5nZXRBY3Rpb25MaXN0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29udGFpbnMoQWNjZXNzaWJpbGl0eUFjdGlvbi5BQ1RJT05fU0NST0xMX0RPV04pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxGb3J3YXJkKGNoaWxkKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGdldE5vZGVUaW1lZCgoKSAtPiBmaW5kQnlUZXh0KGNoaWxkLCB0ZXh0KSwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7CkBAIC00NTksMjAgKzU0NiwyMyBAQAogICAgICAgICB3YWl0Rm9ySWRsZSgpOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2xpY2soQWNjZXNzaWJpbGl0eU5vZGVJbmZvIG5vZGUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRVaUF1dG9tYXRpb24oKS5leGVjdXRlQW5kV2FpdEZvckV2ZW50KAotICAgICAgICAgICAgICAgICgpIC0+IG5vZGUucGVyZm9ybUFjdGlvbihBY2Nlc3NpYmlsaXR5Tm9kZUluZm8uQUNUSU9OX0NMSUNLKSwKLSAgICAgICAgICAgICAgICAoQWNjZXNzaWJpbGl0eUV2ZW50IGV2ZW50KSAtPiBldmVudC5nZXRFdmVudFR5cGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgPT0gQWNjZXNzaWJpbGl0eUV2ZW50LlRZUEVfV0lORE9XX0NPTlRFTlRfQ0hBTkdFRAotICAgICAgICAgICAgICAgICAgICAgICAgfHwgZXZlbnQuZ2V0RXZlbnRUeXBlKCkgPT0gQWNjZXNzaWJpbGl0eUV2ZW50LlRZUEVfV0lORE9XU19DSEFOR0VELAotICAgICAgICAgICAgICAgIEdMT0JBTF9USU1FT1VUX01JTExJUyk7CisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjbGljayhBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gbm9kZSwgYm9vbGVhbiBhd2FpdFdpbmRvd3NDaGFuZ2VkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpLmdldFVpQXV0b21hdGlvbigpLmV4ZWN1dGVBbmRXYWl0Rm9yRXZlbnQoCisgICAgICAgICAgICAgICAgICAgICgpIC0+IG5vZGUucGVyZm9ybUFjdGlvbihBY2Nlc3NpYmlsaXR5Tm9kZUluZm8uQUNUSU9OX0NMSUNLKSwKKyAgICAgICAgICAgICAgICAgICAgKEFjY2Vzc2liaWxpdHlFdmVudCBldmVudCkgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldEV2ZW50VHlwZSgpID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF3YWl0V2luZG93c0NoYW5nZWQgPyBBY2Nlc3NpYmlsaXR5RXZlbnQuVFlQRV9XSU5ET1dTX0NIQU5HRUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEFjY2Vzc2liaWxpdHlFdmVudC5UWVBFX1dJTkRPV19DT05URU5UX0NIQU5HRUQpCisgICAgICAgICAgICAgICAgICAgICwgR0xPQkFMX1RJTUVPVVRfTUlMTElTKTsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gZmluZENvbGxlY3Rpb25JdGVtKEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBjdXJyZW50KQogICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyByZXN1bHQgPSBjdXJyZW50OwogICAgICAgICB3aGlsZSAocmVzdWx0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChyZXN1bHQuZ2V0Q29sbGVjdGlvbkl0ZW1JbmZvKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gTm9kZXMgdGhhdCBhcmUgaW4gdGhlIGhpZXJhcmNoeSBidXQgbm90IHlldCBvbiBzY3JlZW4gbWF5IG5vdCBoYXZlIGNvbGxlY3Rpb24gaXRlbQorICAgICAgICAgICAgLy8gaW5mbyBwb3B1bGF0ZWQuIFVzZSBhIHBhcmVudCB3aXRoIGNvbGxlY3Rpb24gaW5mbyBhcyBhbiBpbmRpY2F0b3IgaW4gdGhvc2UgY2FzZXMuCisgICAgICAgICAgICBpZiAocmVzdWx0LmdldENvbGxlY3Rpb25JdGVtSW5mbygpICE9IG51bGwgfHwgaGFzQ29sbGVjdGlvbkFzUGFyZW50KHJlc3VsdCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmdldFBhcmVudCgpOwpAQCAtNDgwLDYgKzU3MCwxMCBAQAogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGhhc0NvbGxlY3Rpb25Bc1BhcmVudChBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gbm9kZSkgeworICAgICAgICByZXR1cm4gbm9kZS5nZXRQYXJlbnQoKSAhPSBudWxsICYmIG5vZGUuZ2V0UGFyZW50KCkuZ2V0Q29sbGVjdGlvbkluZm8oKSAhPSBudWxsOworICAgIH0KKwogICAgIHByaXZhdGUgc3RhdGljIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBmaW5kU3dpdGNoKEFjY2Vzc2liaWxpdHlOb2RlSW5mbyByb290KSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKFN3aXRjaC5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKHJvb3QuZ2V0Q2xhc3NOYW1lKCkudG9TdHJpbmcoKSkpIHsKICAgICAgICAgICAgIHJldHVybiByb290OwpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvVXNlUGVybWlzc2lvbkFwcDIzL3NyYy9jb20vYW5kcm9pZC9jdHMvdXNlcGVybWlzc2lvbi9Vc2VQZXJtaXNzaW9uVGVzdDIzLmphdmEgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Vc2VQZXJtaXNzaW9uQXBwMjMvc3JjL2NvbS9hbmRyb2lkL2N0cy91c2VwZXJtaXNzaW9uL1VzZVBlcm1pc3Npb25UZXN0MjMuamF2YQppbmRleCBiNGVkMDlmLi43OWMwM2ZiIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Vc2VQZXJtaXNzaW9uQXBwMjMvc3JjL2NvbS9hbmRyb2lkL2N0cy91c2VwZXJtaXNzaW9uL1VzZVBlcm1pc3Npb25UZXN0MjMuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Vc2VQZXJtaXNzaW9uQXBwMjMvc3JjL2NvbS9hbmRyb2lkL2N0cy91c2VwZXJtaXNzaW9uL1VzZVBlcm1pc3Npb25UZXN0MjMuamF2YQpAQCAtMTcsNiArMTcsNyBAQAogcGFja2FnZSBjb20uYW5kcm9pZC5jdHMudXNlcGVybWlzc2lvbjsKIAogaW1wb3J0IHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0LmFzc2VydEVxdWFsczsKKwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY3RzLmV4dGVybmFsc3RvcmFnZWFwcC5Db21tb25FeHRlcm5hbFN0b3JhZ2VUZXN0LmFzc2VydERpck5vQWNjZXNzOwpAQCAtMjgsNiArMjksNyBAQAogaW1wb3J0IGFuZHJvaWQuTWFuaWZlc3Q7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQub3MuRW52aXJvbm1lbnQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCkBAIC00Nyw2ICs0OSw3IEBACiAgICAgICAgIG1XYXRjaCA9IHBtLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9XQVRDSCk7CiAgICAgfQogCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RmFpbCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBmYWlsKCJFeHBlY3RlZCIpOwogICAgIH0KQEAgLTQ1MCw3ICs0NTMsNyBAQAogICAgICAgICAgICAgICAgIE1hbmlmZXN0LnBlcm1pc3Npb24uV1JJVEVfQ0FMRU5EQVIKICAgICAgICAgfTsKIAotICAgICAgICAvLyBSZXF1ZXN0IHRoZSBwZXJtaXNzaW9uIGFuZCBkbyBub3RoaW5nCisgICAgICAgIC8vIFJlcXVlc3QgdGhlIHBlcm1pc3Npb24gYW5kIGFsbG93IGl0CiAgICAgICAgIEJhc2VQZXJtaXNzaW9uQWN0aXZpdHkuUmVzdWx0IHJlc3VsdCA9IHJlcXVlc3RQZXJtaXNzaW9ucyhwZXJtaXNzaW9ucywKICAgICAgICAgICAgICAgICBSRVFVRVNUX0NPREVfUEVSTUlTU0lPTlMsIEJhc2VQZXJtaXNzaW9uQWN0aXZpdHkuY2xhc3MsICgpIC0+IHsKICAgICAgICAgICAgIHRyeSB7CkBAIC00NjMsOSArNDY2LDI0IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0pOwogCi0gICAgICAgIC8vIEV4cGVjdCB0aGUgcGVybWlzc2lvbiBpcyBub3QgZ3JhbnRlZAorICAgICAgICAvLyBFeHBlY3QgdGhlIHBlcm1pc3Npb24gYXJlIHJlcG9ydGVkIGFzIGdyYW50ZWQKICAgICAgICAgYXNzZXJ0UGVybWlzc2lvblJlcXVlc3RSZXN1bHQocmVzdWx0LCBSRVFVRVNUX0NPREVfUEVSTUlTU0lPTlMsCiAgICAgICAgICAgICAgICAgcGVybWlzc2lvbnMsIG5ldyBib29sZWFuW10ge3RydWUsIHRydWV9KTsKKworICAgICAgICAvLyBUaGUgcGVybWlzc2lvbnMgYXJlIGdyYW50ZWQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFBhY2thZ2VNYW5hZ2VyLlBFUk1JU1NJT05fR1JBTlRFRCwgZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0Q29udGV4dCgpCisgICAgICAgICAgICAgICAgLmNoZWNrU2VsZlBlcm1pc3Npb24oTWFuaWZlc3QucGVybWlzc2lvbi5XUklURV9DT05UQUNUUykpOworICAgICAgICBhc3NlcnRFcXVhbHMoUGFja2FnZU1hbmFnZXIuUEVSTUlTU0lPTl9HUkFOVEVELCBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRDb250ZXh0KCkKKyAgICAgICAgICAgICAgICAuY2hlY2tTZWxmUGVybWlzc2lvbihNYW5pZmVzdC5wZXJtaXNzaW9uLldSSVRFX0NBTEVOREFSKSk7CisKKyAgICAgICAgLy8gSW4gQVBJIDwgTl9NUjEgYWxsIHBlcm1pc3Npb25zIG9mIGEgZ3JvdXAgYXJlIGdyYW50ZWQuIEkuZS4gdGhlIGdyYW50IHdhcyAiZXhwYW5kZWQiCisgICAgICAgIGFzc2VydEVxdWFscyhQYWNrYWdlTWFuYWdlci5QRVJNSVNTSU9OX0dSQU5URUQsIGdldEluc3RydW1lbnRhdGlvbigpLmdldENvbnRleHQoKQorICAgICAgICAgICAgICAgIC5jaGVja1NlbGZQZXJtaXNzaW9uKE1hbmlmZXN0LnBlcm1pc3Npb24uUkVBRF9DQUxFTkRBUikpOworCisgICAgICAgIC8vIEV2ZW4gdGhlIGNvbnRhY3RzIGdyb3VwIHdhcyBleHBhbmRlZCwgdGhlIHJlYWQtY2FsZW5kYXIgcGVybWlzc2lvbiBpcyBub3QgaW4gdGhlCisgICAgICAgIC8vIG1hbmlmZXN0LCBoZW5jZSBub3QgZ3JhbnRlZC4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKFBhY2thZ2VNYW5hZ2VyLlBFUk1JU1NJT05fREVOSUVELCBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRDb250ZXh0KCkKKyAgICAgICAgICAgICAgICAuY2hlY2tTZWxmUGVybWlzc2lvbihNYW5pZmVzdC5wZXJtaXNzaW9uLlJFQURfQ09OVEFDVFMpKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtNTM0LDYgKzU1Miw3NiBAQAogICAgICAgICBhc3NlcnRBbGxQZXJtaXNzaW9uc0dyYW50U3RhdGUoUGFja2FnZU1hbmFnZXIuUEVSTUlTU0lPTl9HUkFOVEVEKTsKICAgICB9CiAKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsUGVybWlzc2lvblJlcXVlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nW10gcGVybWlzc2lvbnMgPSBuZXcgU3RyaW5nW10ge251bGx9OworCisgICAgICAgIC8vIEdvIHRocm91Z2ggbm9ybWFsIGdyYW50IGZsb3cKKyAgICAgICAgQmFzZVBlcm1pc3Npb25BY3Rpdml0eS5SZXN1bHQgcmVzdWx0ID0gcmVxdWVzdFBlcm1pc3Npb25zKHBlcm1pc3Npb25zLAorICAgICAgICAgICAgICAgIFJFUVVFU1RfQ09ERV9QRVJNSVNTSU9OUywKKyAgICAgICAgICAgICAgICBCYXNlUGVybWlzc2lvbkFjdGl2aXR5LmNsYXNzLAorICAgICAgICAgICAgICAgICgpIC0+IHsgLyogZW1wdHkgKi8gfSk7CisKKyAgICAgICAgYXNzZXJ0UGVybWlzc2lvblJlcXVlc3RSZXN1bHQocmVzdWx0LCBSRVFVRVNUX0NPREVfUEVSTUlTU0lPTlMsCisgICAgICAgICAgICAgICAgcGVybWlzc2lvbnMsIG5ldyBib29sZWFuW10ge2ZhbHNlfSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TnVsbEFuZFJlYWxQZXJtaXNzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBkb24ndCBoYXZlIHRoZSBwZXJtaXNzaW9ucworICAgICAgICBhc3NlcnRFcXVhbHMoUGFja2FnZU1hbmFnZXIuUEVSTUlTU0lPTl9ERU5JRUQsIGdldEluc3RydW1lbnRhdGlvbigpLmdldENvbnRleHQoKQorICAgICAgICAgICAgICAgIC5jaGVja1NlbGZQZXJtaXNzaW9uKE1hbmlmZXN0LnBlcm1pc3Npb24uV1JJVEVfQ09OVEFDVFMpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFBhY2thZ2VNYW5hZ2VyLlBFUk1JU1NJT05fREVOSUVELCBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRDb250ZXh0KCkKKyAgICAgICAgICAgICAgICAuY2hlY2tTZWxmUGVybWlzc2lvbihNYW5pZmVzdC5wZXJtaXNzaW9uLldSSVRFX0VYVEVSTkFMX1NUT1JBR0UpKTsKKworICAgICAgICBTdHJpbmdbXSBwZXJtaXNzaW9ucyA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICBNYW5pZmVzdC5wZXJtaXNzaW9uLldSSVRFX0NPTlRBQ1RTLAorICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgTWFuaWZlc3QucGVybWlzc2lvbi5XUklURV9FWFRFUk5BTF9TVE9SQUdFCisgICAgICAgIH07CisKKyAgICAgICAgLy8gUmVxdWVzdCB0aGUgcGVybWlzc2lvbiBhbmQgYWxsb3cgaXQKKyAgICAgICAgQmFzZVBlcm1pc3Npb25BY3Rpdml0eS5SZXN1bHQgcmVzdWx0ID0gcmVxdWVzdFBlcm1pc3Npb25zKHBlcm1pc3Npb25zLAorICAgICAgICAgICAgICAgIFJFUVVFU1RfQ09ERV9QRVJNSVNTSU9OUywgQmFzZVBlcm1pc3Npb25BY3Rpdml0eS5jbGFzcywgKCkgLT4geworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2xpY2tBbGxvd0J1dHRvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VWlEZXZpY2UoKS53YWl0Rm9ySWRsZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgY2xpY2tBbGxvd0J1dHRvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VWlEZXZpY2UoKS53YWl0Rm9ySWRsZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAvLyBFeHBlY3QgdGhlIHBlcm1pc3Npb24gYXJlIHJlcG9ydGVkIGFzIGdyYW50ZWQKKyAgICAgICAgYXNzZXJ0UGVybWlzc2lvblJlcXVlc3RSZXN1bHQocmVzdWx0LCBSRVFVRVNUX0NPREVfUEVSTUlTU0lPTlMsCisgICAgICAgICAgICAgICAgcGVybWlzc2lvbnMsIG5ldyBib29sZWFuW10ge2ZhbHNlLCB0cnVlLCBmYWxzZSwgdHJ1ZX0pOworCisgICAgICAgIC8vIFRoZSBwZXJtaXNzaW9ucyBhcmUgZ3JhbnRlZAorICAgICAgICBhc3NlcnRFcXVhbHMoUGFja2FnZU1hbmFnZXIuUEVSTUlTU0lPTl9HUkFOVEVELCBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRDb250ZXh0KCkKKyAgICAgICAgICAgICAgICAuY2hlY2tTZWxmUGVybWlzc2lvbihNYW5pZmVzdC5wZXJtaXNzaW9uLldSSVRFX0NPTlRBQ1RTKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhQYWNrYWdlTWFuYWdlci5QRVJNSVNTSU9OX0dSQU5URUQsIGdldEluc3RydW1lbnRhdGlvbigpLmdldENvbnRleHQoKQorICAgICAgICAgICAgICAgIC5jaGVja1NlbGZQZXJtaXNzaW9uKE1hbmlmZXN0LnBlcm1pc3Npb24uV1JJVEVfRVhURVJOQUxfU1RPUkFHRSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRQZXJtaXNzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1tdIHBlcm1pc3Npb25zID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRDb250ZXh0KCkuZ2V0UGFja2FnZU5hbWUoKSArICIuYWJhZG5hbWUiCisgICAgICAgIH07CisKKyAgICAgICAgLy8gUmVxdWVzdCB0aGUgcGVybWlzc2lvbiBhbmQgYWxsb3cgaXQKKyAgICAgICAgQmFzZVBlcm1pc3Npb25BY3Rpdml0eS5SZXN1bHQgcmVzdWx0ID0gcmVxdWVzdFBlcm1pc3Npb25zKHBlcm1pc3Npb25zLAorICAgICAgICAgICAgICAgIFJFUVVFU1RfQ09ERV9QRVJNSVNTSU9OUywKKyAgICAgICAgICAgICAgICBCYXNlUGVybWlzc2lvbkFjdGl2aXR5LmNsYXNzLAorICAgICAgICAgICAgICAgICgpIC0+IHsgLyogZW1wdHkgKi8gfSk7CisKKyAgICAgICAgLy8gRXhwZWN0IHRoZSBwZXJtaXNzaW9ucyBpcyBub3QgZ3JhbnRlZAorICAgICAgICBhc3NlcnRQZXJtaXNzaW9uUmVxdWVzdFJlc3VsdChyZXN1bHQsIFJFUVVFU1RfQ09ERV9QRVJNSVNTSU9OUywKKyAgICAgICAgICAgICAgICBwZXJtaXNzaW9ucywgbmV3IGJvb2xlYW5bXSB7ZmFsc2V9KTsKKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgYXNzZXJ0QWxsUGVybWlzc2lvbnNSZXZva2VkKCkgewogICAgICAgICBhc3NlcnRBbGxQZXJtaXNzaW9uc0dyYW50U3RhdGUoUGFja2FnZU1hbmFnZXIuUEVSTUlTU0lPTl9ERU5JRUQpOwogICAgIH0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1VzZVBlcm1pc3Npb25BcHAyNS9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvVXNlUGVybWlzc2lvbkFwcDI1L0FuZHJvaWQubWsKaW5kZXggYWM0ZjI3Mi4uOTRkM2MwYSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvVXNlUGVybWlzc2lvbkFwcDI1L0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvVXNlUGVybWlzc2lvbkFwcDI1L0FuZHJvaWQubWsKQEAgLTIwLDE2ICsyMCwxOSBAQAogCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwogTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKLSAgICBhbmRyb2lkLXN1cHBvcnQtdGVzdCBcCi0gICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbCBcCi0gICAgY3RzdGVzdHJ1bm5lciBcCisgICAgYW5kcm9pZHgudGVzdC5ydWxlcyBcCisgICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgXAorICAgIGN0c3Rlc3RydW5uZXItYXh0IFwKICAgICB1Yi11aWF1dG9tYXRvcgogCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicworCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCAuLi9Vc2VQZXJtaXNzaW9uQXBwMjMvc3JjKSBcCiAgICAgLi4vRXh0ZXJuYWxTdG9yYWdlQXBwL3NyYy9jb20vYW5kcm9pZC9jdHMvZXh0ZXJuYWxzdG9yYWdlYXBwL0NvbW1vbkV4dGVybmFsU3RvcmFnZVRlc3QuamF2YQogTE9DQUxfUkVTT1VSQ0VfRElSIDo9IGN0cy9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Vc2VQZXJtaXNzaW9uQXBwMjMvcmVzCiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNVc2VQZXJtaXNzaW9uQXBwMjUKK0xPQ0FMX1BSSVZBVEVfUExBVEZPUk1fQVBJUyA6PSB0cnVlCiAKICMgdGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKIExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Vc2VQZXJtaXNzaW9uQXBwMjUvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1VzZVBlcm1pc3Npb25BcHAyNS9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGFjYWVlYjAuLjJhODQ0ZTUgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1VzZVBlcm1pc3Npb25BcHAyNS9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1VzZVBlcm1pc3Npb25BcHAyNS9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC02NywxMSArNjcsMTMgQEAKICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkJPRFlfU0VOU09SUyIvPgogCiAgICAgPGFwcGxpY2F0aW9uPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKwogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5jdHMudXNlcGVybWlzc2lvbi5CYXNlUGVybWlzc2lvbkFjdGl2aXR5IiAvPgogICAgIDwvYXBwbGljYXRpb24+CiAKICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmFuZHJvaWQuY3RzLnVzZXBlcm1pc3Npb24iIC8+CiAKIDwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Vc2VQZXJtaXNzaW9uQXBwMjYvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1VzZVBlcm1pc3Npb25BcHAyNi9BbmRyb2lkLm1rCmluZGV4IDcwNjQyODguLjA3OTZkNDUgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1VzZVBlcm1pc3Npb25BcHAyNi9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1VzZVBlcm1pc3Npb25BcHAyNi9BbmRyb2lkLm1rCkBAIC0yMCw5ICsyMCw5IEBACiAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCiBMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAotICAgIGFuZHJvaWQtc3VwcG9ydC10ZXN0IFwKLSAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsIFwKLSAgICBjdHN0ZXN0cnVubmVyIFwKKyAgICBhbmRyb2lkeC50ZXN0LnJ1bGVzIFwKKyAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBcCisgICAgY3RzdGVzdHJ1bm5lci1heHQgXAogICAgIHViLXVpYXV0b21hdG9yCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykgXApAQCAtMzEsNiArMzEsNyBAQAogTE9DQUxfUkVTT1VSQ0VfRElSIDo9IGN0cy9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Vc2VQZXJtaXNzaW9uQXBwMjMvcmVzCiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNVc2VQZXJtaXNzaW9uQXBwMjYKK0xPQ0FMX1BSSVZBVEVfUExBVEZPUk1fQVBJUyA6PSB0cnVlCiAKICMgdGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKIExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Vc2VQZXJtaXNzaW9uQXBwMjYvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1VzZVBlcm1pc3Npb25BcHAyNi9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDg0NWU0M2QuLjg2Mzk0NjQgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1VzZVBlcm1pc3Npb25BcHAyNi9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1VzZVBlcm1pc3Npb25BcHAyNi9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yNCwxMSArMjQsMTMgQEAKICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlJFQ0VJVkVfU01TIiAvPgogCiAgICAgPGFwcGxpY2F0aW9uPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKwogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5jdHMudXNlcGVybWlzc2lvbi5CYXNlUGVybWlzc2lvbkFjdGl2aXR5IiAvPgogICAgIDwvYXBwbGljYXRpb24+CiAKICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmFuZHJvaWQuY3RzLnVzZXBlcm1pc3Npb24iIC8+CiAKIDwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Vc2VQZXJtaXNzaW9uQXBwTGF0ZXN0L0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Vc2VQZXJtaXNzaW9uQXBwTGF0ZXN0L0FuZHJvaWQubWsKaW5kZXggNjJhMTVlNC4uYjA4NGNlNyAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvVXNlUGVybWlzc2lvbkFwcExhdGVzdC9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1VzZVBlcm1pc3Npb25BcHBMYXRlc3QvQW5kcm9pZC5tawpAQCAtMjAsOSArMjAsOSBAQAogCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwogTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKLSAgICBhbmRyb2lkLXN1cHBvcnQtdGVzdCBcCi0gICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbCBcCi0gICAgY3RzdGVzdHJ1bm5lciBcCisgICAgYW5kcm9pZHgudGVzdC5ydWxlcyBcCisgICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgXAorICAgIGN0c3Rlc3RydW5uZXItYXh0IFwKICAgICB1Yi11aWF1dG9tYXRvcgogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCAuLi9Vc2VQZXJtaXNzaW9uQXBwMjYvc3JjKSAgXApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvVXNlUGVybWlzc2lvbkFwcExhdGVzdC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvVXNlUGVybWlzc2lvbkFwcExhdGVzdC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGNhYzY3OTAuLjBiOGY5YWYgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1VzZVBlcm1pc3Npb25BcHBMYXRlc3QvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Vc2VQZXJtaXNzaW9uQXBwTGF0ZXN0L0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTIzLDExICsyMywxMyBAQAogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVDRUlWRV9TTVMiIC8+CiAKICAgICA8YXBwbGljYXRpb24+CisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgorCiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLmN0cy51c2VwZXJtaXNzaW9uLkJhc2VQZXJtaXNzaW9uQWN0aXZpdHkiIC8+CiAgICAgPC9hcHBsaWNhdGlvbj4KIAogICAgIDxpbnN0cnVtZW50YXRpb24KLSAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5jdHMudXNlcGVybWlzc2lvbiIgLz4KIAogPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1VzZVBlcm1pc3Npb25EaWZmQ2VydC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvVXNlUGVybWlzc2lvbkRpZmZDZXJ0L0FuZHJvaWQubWsKaW5kZXggNDk4ZThjYS4uOTIzMzYwNSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvVXNlUGVybWlzc2lvbkRpZmZDZXJ0L0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvVXNlUGVybWlzc2lvbkRpZmZDZXJ0L0FuZHJvaWQubWsKQEAgLTE5LDEwICsxOSwxMiBAQAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKSBcCi0gICAgLi4vUGVybWlzc2lvbkRlY2xhcmVBcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy9wZXJtaXNzaW9uZGVjbGFyZWFwcC9HcmFudFVyaVBlcm1pc3Npb24uamF2YQorICAgIC4uL1Blcm1pc3Npb25EZWNsYXJlQXBwL3NyYy9jb20vYW5kcm9pZC9jdHMvcGVybWlzc2lvbmRlY2xhcmVhcHAvVXRpbHNQcm92aWRlci5qYXZhCiAKIExPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLXN1cHBvcnQtdGVzdCBsZWdhY3ktYW5kcm9pZC10ZXN0CitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZHgudGVzdC5ydWxlcworCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicwogCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzVXNlUGVybWlzc2lvbkRpZmZDZXJ0CiAKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1VzZVBlcm1pc3Npb25EaWZmQ2VydC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvVXNlUGVybWlzc2lvbkRpZmZDZXJ0L0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggN2FjZjk4Zi4uZTU4N2UwOSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvVXNlUGVybWlzc2lvbkRpZmZDZXJ0L0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvVXNlUGVybWlzc2lvbkRpZmZDZXJ0L0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTM4LDUgKzM4LDUgQEAKICAgICA8L2FwcGxpY2F0aW9uPgogCiAgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5hbmRyb2lkLmN0cy51c2VzcGVybWlzc2lvbmRpZmZjZXJ0YXBwIgotICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIi8+CisgICAgICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIvPgogPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1VzZVBlcm1pc3Npb25EaWZmQ2VydC9zcmMvY29tL2FuZHJvaWQvY3RzL3VzZXNwZXJtaXNzaW9uZGlmZmNlcnRhcHAvQWNjZXNzUGVybWlzc2lvbldpdGhEaWZmU2lnVGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvVXNlUGVybWlzc2lvbkRpZmZDZXJ0L3NyYy9jb20vYW5kcm9pZC9jdHMvdXNlc3Blcm1pc3Npb25kaWZmY2VydGFwcC9BY2Nlc3NQZXJtaXNzaW9uV2l0aERpZmZTaWdUZXN0LmphdmEKaW5kZXggZjJjYmM2Yy4uMzU1ZGU4YyAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvVXNlUGVybWlzc2lvbkRpZmZDZXJ0L3NyYy9jb20vYW5kcm9pZC9jdHMvdXNlc3Blcm1pc3Npb25kaWZmY2VydGFwcC9BY2Nlc3NQZXJtaXNzaW9uV2l0aERpZmZTaWdUZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvVXNlUGVybWlzc2lvbkRpZmZDZXJ0L3NyYy9jb20vYW5kcm9pZC9jdHMvdXNlc3Blcm1pc3Npb25kaWZmY2VydGFwcC9BY2Nlc3NQZXJtaXNzaW9uV2l0aERpZmZTaWdUZXN0LmphdmEKQEAgLTE2LDIxICsxNiwzMyBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy51c2VzcGVybWlzc2lvbmRpZmZjZXJ0YXBwOwogCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jdHMucGVybWlzc2lvbmRlY2xhcmVhcHAuVXRpbHNQcm92aWRlci5BQ1RJT05fQ0xFQVJfUFJJTUFSWV9DTElQOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jdHMucGVybWlzc2lvbmRlY2xhcmVhcHAuVXRpbHNQcm92aWRlci5BQ1RJT05fR1JBTlRfVVJJOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jdHMucGVybWlzc2lvbmRlY2xhcmVhcHAuVXRpbHNQcm92aWRlci5BQ1RJT05fUkVWT0tFX1VSSTsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY3RzLnBlcm1pc3Npb25kZWNsYXJlYXBwLlV0aWxzUHJvdmlkZXIuQUNUSU9OX1NFVF9QUklNQVJZX0NMSVA7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmN0cy5wZXJtaXNzaW9uZGVjbGFyZWFwcC5VdGlsc1Byb3ZpZGVyLkFDVElPTl9TVEFSVF9BQ1RJVklUWTsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY3RzLnBlcm1pc3Npb25kZWNsYXJlYXBwLlV0aWxzUHJvdmlkZXIuQUNUSU9OX1NUQVJUX1NFUlZJQ0U7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmN0cy5wZXJtaXNzaW9uZGVjbGFyZWFwcC5VdGlsc1Byb3ZpZGVyLkFDVElPTl9WRVJJRllfT1VUR09JTkdfUEVSU0lTVEVEOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jdHMucGVybWlzc2lvbmRlY2xhcmVhcHAuVXRpbHNQcm92aWRlci5FWFRSQV9JTlRFTlQ7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmN0cy5wZXJtaXNzaW9uZGVjbGFyZWFwcC5VdGlsc1Byb3ZpZGVyLkVYVFJBX01PREU7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmN0cy5wZXJtaXNzaW9uZGVjbGFyZWFwcC5VdGlsc1Byb3ZpZGVyLkVYVFJBX1BBQ0tBR0VfTkFNRTsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY3RzLnBlcm1pc3Npb25kZWNsYXJlYXBwLlV0aWxzUHJvdmlkZXIuRVhUUkFfVVJJOworCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNsaXBEYXRhOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5DbGlwYm9hcmRNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuVXJpUGVybWlzc2lvbjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNhbGVuZGFyQ29udHJhY3Q7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0OwogaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy5wZXJtaXNzaW9uZGVjbGFyZWFwcC5HcmFudFVyaVBlcm1pc3Npb247CitpbXBvcnQgY29tLmFuZHJvaWQuY3RzLnBlcm1pc3Npb25kZWNsYXJlYXBwLlV0aWxzUHJvdmlkZXI7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwpAQCAtNDIsOSArNTQsNiBAQAogICogQWNjZXNzZXMgYXBwIGN0cy90ZXN0cy9hcHBzZWN1cml0eS10ZXN0cy90ZXN0LWFwcHMvUGVybWlzc2lvbkRlY2xhcmVBcHAvLi4uCiAgKi8KIHB1YmxpYyBjbGFzcyBBY2Nlc3NQZXJtaXNzaW9uV2l0aERpZmZTaWdUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wb25lbnROYW1lIEdSQU5UX1VSSV9QRVJNX0NPTVAKLSAgICAgICAgICAgID0gbmV3IENvbXBvbmVudE5hbWUoImNvbS5hbmRyb2lkLmN0cy5wZXJtaXNzaW9uZGVjbGFyZWFwcCIsCi0gICAgICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5jdHMucGVybWlzc2lvbmRlY2xhcmVhcHAuR3JhbnRVcmlQZXJtaXNzaW9uIik7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVXJpIFBFUk1fVVJJID0gVXJpLnBhcnNlKCJjb250ZW50Oi8vY3RzcGVybWlzc2lvbndpdGhzaWduYXR1cmUiKTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVcmkgUEVSTV9VUklfR1JBTlRJTkcgPSBVcmkucGFyc2UoImNvbnRlbnQ6Ly9jdHNwZXJtaXNzaW9ud2l0aHNpZ25hdHVyZWdyYW50aW5nIik7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVXJpIFBFUk1fVVJJX1BBVEggPSBVcmkucGFyc2UoImNvbnRlbnQ6Ly9jdHNwZXJtaXNzaW9ud2l0aHNpZ25hdHVyZXBhdGgiKTsKQEAgLTU4LDYgKzY3LDIwIEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUEVDVEVEX01JTUVfVFlQRV9BTUJJR1VPVVMgPSAiZ290L3RoZVVuc3BlY2lmaWVkTUlNRSI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVXJpIEFNQklHVU9VU19VUkkgPSBVcmkucGFyc2UoImNvbnRlbnQ6Ly9jdHNhbWJpZ3VvdXNwcm92aWRlciIpOwogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVXJpW10gR1JBTlRBQkxFID0gbmV3IFVyaVtdIHsKKyAgICAgICAgICAgIFVyaS53aXRoQXBwZW5kZWRQYXRoKFBFUk1fVVJJX0dSQU5USU5HLCAiZm9vIiksCisgICAgICAgICAgICBVcmkud2l0aEFwcGVuZGVkUGF0aChQUklWX1VSSV9HUkFOVElORywgImZvbyIpLAorICAgICAgICAgICAgVXJpLndpdGhBcHBlbmRlZFBhdGgoUEVSTV9VUklfUEFUSCwgImZvbyIpLAorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVcmlbXSBOT1RfR1JBTlRBQkxFID0gbmV3IFVyaVtdIHsKKyAgICAgICAgICAgIFVyaS53aXRoQXBwZW5kZWRQYXRoKFBFUk1fVVJJLCAiZm9vIiksCisgICAgICAgICAgICBVcmkud2l0aEFwcGVuZGVkUGF0aChQUklWX1VSSSwgImZvbyIpLAorICAgICAgICAgICAgVXJpLndpdGhBcHBlbmRlZFBhdGgoUEVSTV9VUklfUEFUSF9SRVNUUklDVElORywgImZvbyIpLAorICAgICAgICAgICAgQ2FsZW5kYXJDb250cmFjdC5DT05URU5UX1VSSSwKKyAgICAgICAgICAgIENvbnRhY3RzQ29udHJhY3QuQVVUSE9SSVRZX1VSSSwKKyAgICB9OworCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgc3VwZXIudGVhckRvd24oKTsKQEAgLTgzLDYgKzEwNiwxMCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFJlYWRpbmdDbGlwTm90QWxsb3dlZChDbGlwRGF0YSBjbGlwKSB7CisgICAgICAgIGFzc2VydFJlYWRpbmdDbGlwTm90QWxsb3dlZChjbGlwLCBudWxsKTsKKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgYXNzZXJ0UmVhZGluZ0NsaXBOb3RBbGxvd2VkKENsaXBEYXRhIGNsaXAsIFN0cmluZyBtc2cpIHsKICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGNsaXAuZ2V0SXRlbUNvdW50KCk7IGkrKykgewogICAgICAgICAgICAgQ2xpcERhdGEuSXRlbSBpdGVtID0gY2xpcC5nZXRJdGVtQXQoaSk7CkBAIC0xODMsNiArMjEwLDEwIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0V3JpdGluZ0NsaXBOb3RBbGxvd2VkKENsaXBEYXRhIGNsaXApIHsKKyAgICAgICAgYXNzZXJ0V3JpdGluZ0NsaXBOb3RBbGxvd2VkKGNsaXAsIG51bGwpOworICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCBhc3NlcnRXcml0aW5nQ2xpcE5vdEFsbG93ZWQoQ2xpcERhdGEgY2xpcCwgU3RyaW5nIG1zZykgewogICAgICAgICBmb3IgKGludCBpPTA7IGk8Y2xpcC5nZXRJdGVtQ291bnQoKTsgaSsrKSB7CiAgICAgICAgICAgICBDbGlwRGF0YS5JdGVtIGl0ZW0gPSBjbGlwLmdldEl0ZW1BdChpKTsKQEAgLTQzNSw3NiArNDY2LDYgQEAKICAgICAgICAgICAgICAgICBJbnRlbnQuRkxBR19HUkFOVF9XUklURV9VUklfUEVSTUlTU0lPTik7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgR3JhbnRSZXN1bHRSZWNlaXZlciBleHRlbmRzIEJyb2FkY2FzdFJlY2VpdmVyIHsKLSAgICAgICAgYm9vbGVhbiBtSGF2ZVJlc3VsdCA9IGZhbHNlOwotICAgICAgICBib29sZWFuIG1Hb29kUmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gbVN1Y2NlZWRlZCA9IGZhbHNlOwotICAgICAgICBzdGF0aWMgZmluYWwgaW50IFRJTUVPVVRfTVMgPSAzMDAwMDsKLSAgICAgICAgCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgICAgICBtSGF2ZVJlc3VsdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChnZXRSZXN1bHRDb2RlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBHcmFudFVyaVBlcm1pc3Npb24uRkFJTFVSRToKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Hb29kUmVzdWx0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdWNjZWVkZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEdyYW50VXJpUGVybWlzc2lvbi5TVUNDRVNTOgotICAgICAgICAgICAgICAgICAgICAgICAgbUdvb2RSZXN1bHQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgbVN1Y2NlZWRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Hb29kUmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbm90aWZ5QWxsKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHZvaWQgYXNzZXJ0U3VjY2VzcyhTdHJpbmcgZmFpbHVyZU1lc3NhZ2UpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgc3RhcnRUaW1lID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKCFtSGF2ZVJlc3VsdCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgd2FpdChUSU1FT1VUX01TKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSA+PSAoc3RhcnRUaW1lICsgVElNRU9VVF9NUykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaW1lb3V0Iik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFtR29vZFJlc3VsdCkgewotICAgICAgICAgICAgICAgICAgICBmYWlsKCJCcm9hZGNhc3QgcmVjZWl2ZXIgZGlkIG5vdCByZXR1cm4gZ29vZCByZXN1bHQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFtU3VjY2VlZGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZhaWwoZmFpbHVyZU1lc3NhZ2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdm9pZCBhc3NlcnRGYWlsdXJlKFN0cmluZyBmYWlsdXJlTWVzc2FnZSkgewotICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgbG9uZyBzdGFydFRpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoIW1IYXZlUmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3YWl0KFRJTUVPVVRfTVMpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpID49IChzdGFydFRpbWUgKyBUSU1FT1VUX01TKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRpbWVvdXQiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIW1Hb29kUmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGZhaWwoIkJyb2FkY2FzdCByZWNlaXZlciBkaWQgbm90IHJldHVybiBnb29kIHJlc3VsdCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobVN1Y2NlZWRlZCkgewotICAgICAgICAgICAgICAgICAgICBmYWlsKGZhaWx1cmVNZXNzYWdlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBwcml2YXRlIHZvaWQgZ3JhbnRVcmlQZXJtaXNzaW9uRmFpbChVcmkgdXJpLCBpbnQgbW9kZSwgYm9vbGVhbiBzZXJ2aWNlKSB7CiAgICAgICAgIFVyaSBncmFudERhdGFVcmkgPSBVcmkud2l0aEFwcGVuZGVkUGF0aCh1cmksICJkYXRhIik7CiAgICAgICAgIEludGVudCBncmFudEludGVudCA9IG5ldyBJbnRlbnQoKTsKQEAgLTUxMywyNiArNDc0LDI2IEBACiAgICAgICAgIGdyYW50SW50ZW50LnNldENsYXNzKGdldENvbnRleHQoKSwKICAgICAgICAgICAgICAgICBzZXJ2aWNlID8gUmVjZWl2ZVVyaVNlcnZpY2UuY2xhc3MgOiBSZWNlaXZlVXJpQWN0aXZpdHkuY2xhc3MpOwogICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOwotICAgICAgICBpbnRlbnQuc2V0Q29tcG9uZW50KEdSQU5UX1VSSV9QRVJNX0NPTVApOwotICAgICAgICBpbnRlbnQuc2V0QWN0aW9uKHNlcnZpY2UgPyBHcmFudFVyaVBlcm1pc3Npb24uQUNUSU9OX1NUQVJUX1NFUlZJQ0UKLSAgICAgICAgICAgICAgICA6IEdyYW50VXJpUGVybWlzc2lvbi5BQ1RJT05fU1RBUlRfQUNUSVZJVFkpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoR3JhbnRVcmlQZXJtaXNzaW9uLkVYVFJBX0lOVEVOVCwgZ3JhbnRJbnRlbnQpOwotICAgICAgICBHcmFudFJlc3VsdFJlY2VpdmVyIHJlY2VpdmVyID0gbmV3IEdyYW50UmVzdWx0UmVjZWl2ZXIoKTsKLSAgICAgICAgZ2V0Q29udGV4dCgpLnNlbmRPcmRlcmVkQnJvYWRjYXN0KGludGVudCwgbnVsbCwgcmVjZWl2ZXIsIG51bGwsIDAsIG51bGwsIG51bGwpOwotICAgICAgICByZWNlaXZlci5hc3NlcnRGYWlsdXJlKCJBYmxlIHRvIGdyYW50IFVSSSBwZXJtaXNzaW9uIHRvICIgKyBncmFudERhdGFVcmkgKyAiIHdoZW4gc2hvdWxkIG5vdCIpOworICAgICAgICBpbnRlbnQuc2V0QWN0aW9uKHNlcnZpY2UgPyBBQ1RJT05fU1RBUlRfU0VSVklDRSA6IEFDVElPTl9TVEFSVF9BQ1RJVklUWSk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShFWFRSQV9JTlRFTlQsIGdyYW50SW50ZW50KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNhbGwoaW50ZW50KTsKKyAgICAgICAgICAgIGZhaWwoIkFibGUgdG8gZ3JhbnQgVVJJIHBlcm1pc3Npb24gdG8gIiArIGdyYW50RGF0YVVyaSArICIgd2hlbiBzaG91bGQgbm90Iik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CiAKICAgICAgICAgZ3JhbnRJbnRlbnQgPSBtYWtlQ2xpcEludGVudCh1cmksIG1vZGUpOwogICAgICAgICBncmFudEludGVudC5zZXRDbGFzcyhnZXRDb250ZXh0KCksCiAgICAgICAgICAgICAgICAgc2VydmljZSA/IFJlY2VpdmVVcmlTZXJ2aWNlLmNsYXNzIDogUmVjZWl2ZVVyaUFjdGl2aXR5LmNsYXNzKTsKICAgICAgICAgaW50ZW50ID0gbmV3IEludGVudCgpOwotICAgICAgICBpbnRlbnQuc2V0Q29tcG9uZW50KEdSQU5UX1VSSV9QRVJNX0NPTVApOwotICAgICAgICBpbnRlbnQuc2V0QWN0aW9uKHNlcnZpY2UgPyBHcmFudFVyaVBlcm1pc3Npb24uQUNUSU9OX1NUQVJUX1NFUlZJQ0UKLSAgICAgICAgICAgICAgICA6IEdyYW50VXJpUGVybWlzc2lvbi5BQ1RJT05fU1RBUlRfQUNUSVZJVFkpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoR3JhbnRVcmlQZXJtaXNzaW9uLkVYVFJBX0lOVEVOVCwgZ3JhbnRJbnRlbnQpOwotICAgICAgICByZWNlaXZlciA9IG5ldyBHcmFudFJlc3VsdFJlY2VpdmVyKCk7Ci0gICAgICAgIGdldENvbnRleHQoKS5zZW5kT3JkZXJlZEJyb2FkY2FzdChpbnRlbnQsIG51bGwsIHJlY2VpdmVyLCBudWxsLCAwLCBudWxsLCBudWxsKTsKLSAgICAgICAgcmVjZWl2ZXIuYXNzZXJ0RmFpbHVyZSgiQWJsZSB0byBncmFudCBVUkkgcGVybWlzc2lvbiB0byAiICsgZ3JhbnRJbnRlbnQuZ2V0Q2xpcERhdGEoKQotICAgICAgICAgICAgICAgICsgIiB3aGVuIHNob3VsZCBub3QiKTsKKyAgICAgICAgaW50ZW50LnNldEFjdGlvbihzZXJ2aWNlID8gQUNUSU9OX1NUQVJUX1NFUlZJQ0UgOiBBQ1RJT05fU1RBUlRfQUNUSVZJVFkpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoRVhUUkFfSU5URU5ULCBncmFudEludGVudCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjYWxsKGludGVudCk7CisgICAgICAgICAgICBmYWlsKCJBYmxlIHRvIGdyYW50IFVSSSBwZXJtaXNzaW9uIHRvICIgKyBncmFudEludGVudC5nZXRDbGlwRGF0YSgpCisgICAgICAgICAgICAgICAgICAgICsgIiB3aGVuIHNob3VsZCBub3QiKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgZG9UZXN0R3JhbnRVcmlQZXJtaXNzaW9uRmFpbChVcmkgdXJpKSB7CkBAIC01OTIsNiArNTUzLDEyIEBACiAgICAgICAgIGRvVGVzdEdyYW50VXJpUGVybWlzc2lvbkZhaWwoVXJpLndpdGhBcHBlbmRlZFBhdGgoUFJJVl9VUklfR1JBTlRJTkcsICJpbnZhbGlkIikpOwogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBjYWxsKEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgZmluYWwgQnVuZGxlIGV4dHJhcyA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgZXh0cmFzLnB1dFBhcmNlbGFibGUoSW50ZW50LkVYVFJBX0lOVEVOVCwgaW50ZW50KTsKKyAgICAgICAgZ2V0Q29udGV4dCgpLmdldENvbnRlbnRSZXNvbHZlcigpLmNhbGwoVXRpbHNQcm92aWRlci5VUkksICIiLCAiIiwgZXh0cmFzKTsKKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgZ3JhbnRDbGlwVXJpUGVybWlzc2lvbihDbGlwRGF0YSBjbGlwLCBpbnQgbW9kZSwgYm9vbGVhbiBzZXJ2aWNlKSB7CiAgICAgICAgIEludGVudCBncmFudEludGVudCA9IG5ldyBJbnRlbnQoKTsKICAgICAgICAgaWYgKGNsaXAuZ2V0SXRlbUNvdW50KCkgPT0gMSkgewpAQCAtNjEwLDMzICs1NzcsMzkgQEAKICAgICAgICAgZ3JhbnRJbnRlbnQuc2V0Q2xhc3MoZ2V0Q29udGV4dCgpLAogICAgICAgICAgICAgICAgIHNlcnZpY2UgPyBSZWNlaXZlVXJpU2VydmljZS5jbGFzcyA6IFJlY2VpdmVVcmlBY3Rpdml0eS5jbGFzcyk7CiAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KCk7Ci0gICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19SRUNFSVZFUl9GT1JFR1JPVU5EKTsKLSAgICAgICAgaW50ZW50LnNldENvbXBvbmVudChHUkFOVF9VUklfUEVSTV9DT01QKTsKLSAgICAgICAgaW50ZW50LnNldEFjdGlvbihzZXJ2aWNlID8gR3JhbnRVcmlQZXJtaXNzaW9uLkFDVElPTl9TVEFSVF9TRVJWSUNFCi0gICAgICAgICAgICAgICAgOiBHcmFudFVyaVBlcm1pc3Npb24uQUNUSU9OX1NUQVJUX0FDVElWSVRZKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKEdyYW50VXJpUGVybWlzc2lvbi5FWFRSQV9JTlRFTlQsIGdyYW50SW50ZW50KTsKLSAgICAgICAgZ2V0Q29udGV4dCgpLnNlbmRCcm9hZGNhc3QoaW50ZW50KTsKKyAgICAgICAgaW50ZW50LnNldEFjdGlvbihzZXJ2aWNlID8gQUNUSU9OX1NUQVJUX1NFUlZJQ0UgOiBBQ1RJT05fU1RBUlRfQUNUSVZJVFkpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoRVhUUkFfSU5URU5ULCBncmFudEludGVudCk7CisgICAgICAgIGNhbGwoaW50ZW50KTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgZ3JhbnRDbGlwVXJpUGVybWlzc2lvblZpYUNvbnRleHQoVXJpIHVyaSwgaW50IG1vZGUpIHsKICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoKTsKLSAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX1JFQ0VJVkVSX0ZPUkVHUk9VTkQpOwotICAgICAgICBpbnRlbnQuc2V0Q29tcG9uZW50KEdSQU5UX1VSSV9QRVJNX0NPTVApOwotICAgICAgICBpbnRlbnQuc2V0QWN0aW9uKEdyYW50VXJpUGVybWlzc2lvbi5BQ1RJT05fR1JBTlRfVVJJKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKEdyYW50VXJpUGVybWlzc2lvbi5FWFRSQV9QQUNLQUdFX05BTUUsIGdldENvbnRleHQoKS5nZXRQYWNrYWdlTmFtZSgpKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKEdyYW50VXJpUGVybWlzc2lvbi5FWFRSQV9VUkksIHVyaSk7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShHcmFudFVyaVBlcm1pc3Npb24uRVhUUkFfTU9ERSwgbW9kZSk7Ci0gICAgICAgIGdldENvbnRleHQoKS5zZW5kQnJvYWRjYXN0KGludGVudCk7CisgICAgICAgIGludGVudC5zZXRBY3Rpb24oQUNUSU9OX0dSQU5UX1VSSSk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShFWFRSQV9QQUNLQUdFX05BTUUsIGdldENvbnRleHQoKS5nZXRQYWNrYWdlTmFtZSgpKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKEVYVFJBX1VSSSwgdXJpKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKEVYVFJBX01PREUsIG1vZGUpOworICAgICAgICBjYWxsKGludGVudCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHJldm9rZUNsaXBVcmlQZXJtaXNzaW9uVmlhQ29udGV4dChVcmkgdXJpLCBpbnQgbW9kZSkgewogICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOwotICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfUkVDRUlWRVJfRk9SRUdST1VORCk7Ci0gICAgICAgIGludGVudC5zZXRDb21wb25lbnQoR1JBTlRfVVJJX1BFUk1fQ09NUCk7Ci0gICAgICAgIGludGVudC5zZXRBY3Rpb24oR3JhbnRVcmlQZXJtaXNzaW9uLkFDVElPTl9SRVZPS0VfVVJJKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKEdyYW50VXJpUGVybWlzc2lvbi5FWFRSQV9VUkksIHVyaSk7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShHcmFudFVyaVBlcm1pc3Npb24uRVhUUkFfTU9ERSwgbW9kZSk7Ci0gICAgICAgIGdldENvbnRleHQoKS5zZW5kQnJvYWRjYXN0KGludGVudCk7CisgICAgICAgIGludGVudC5zZXRBY3Rpb24oQUNUSU9OX1JFVk9LRV9VUkkpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoRVhUUkFfVVJJLCB1cmkpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoRVhUUkFfTU9ERSwgbW9kZSk7CisgICAgICAgIGNhbGwoaW50ZW50KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0UHJpbWFyeUNsaXAoQ2xpcERhdGEgY2xpcCkgeworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOworICAgICAgICBpbnRlbnQuc2V0QWN0aW9uKEFDVElPTl9TRVRfUFJJTUFSWV9DTElQKTsKKyAgICAgICAgaW50ZW50LnNldENsaXBEYXRhKGNsaXApOworICAgICAgICBjYWxsKGludGVudCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNsZWFyUHJpbWFyeUNsaXAoKSB7CisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KCk7CisgICAgICAgIGludGVudC5zZXRBY3Rpb24oQUNUSU9OX0NMRUFSX1BSSU1BUllfQ0xJUCk7CisgICAgICAgIGNhbGwoaW50ZW50KTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgYXNzZXJ0UmVhZGluZ0NsaXBBbGxvd2VkKENsaXBEYXRhIGNsaXApIHsKQEAgLTE0MDksMTIgKzEzODIsOSBAQAogCiAgICAgICAgIC8vIEFuZCBhc3NlcnQgcmVtb3RlCiAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KCk7Ci0gICAgICAgIGludGVudC5zZXRDb21wb25lbnQoR1JBTlRfVVJJX1BFUk1fQ09NUCk7Ci0gICAgICAgIGludGVudC5zZXRBY3Rpb24oR3JhbnRVcmlQZXJtaXNzaW9uLkFDVElPTl9WRVJJRllfT1VUR09JTkdfUEVSU0lTVEVEKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKEdyYW50VXJpUGVybWlzc2lvbi5FWFRSQV9VUkksIHVyaSk7Ci0gICAgICAgIEdyYW50UmVzdWx0UmVjZWl2ZXIgcmVjZWl2ZXIgPSBuZXcgR3JhbnRSZXN1bHRSZWNlaXZlcigpOwotICAgICAgICBnZXRDb250ZXh0KCkuc2VuZE9yZGVyZWRCcm9hZGNhc3QoaW50ZW50LCBudWxsLCByZWNlaXZlciwgbnVsbCwgMCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIHJlY2VpdmVyLmFzc2VydFN1Y2Nlc3MoInVuZXhwZWN0ZWQgb3V0Z29pbmcgcGVyc2lzdGVkIFVyaSBzdGF0dXMiKTsKKyAgICAgICAgaW50ZW50LnNldEFjdGlvbihBQ1RJT05fVkVSSUZZX09VVEdPSU5HX1BFUlNJU1RFRCk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShFWFRSQV9VUkksIHVyaSk7CisgICAgICAgIGNhbGwoaW50ZW50KTsKICAgICB9CiAKICAgICAvKioKQEAgLTE1MzgsNyArMTUwOCw2IEBACiAgICAgICAgIGdyYW50Q2xpcFVyaVBlcm1pc3Npb25WaWFDb250ZXh0KHRhcmdldE1lb3csIEludGVudC5GTEFHX0dSQU5UX1JFQURfVVJJX1BFUk1JU1NJT04KICAgICAgICAgICAgICAgICB8IEludGVudC5GTEFHX0dSQU5UX1BSRUZJWF9VUklfUEVSTUlTU0lPTik7CiAgICAgICAgIGdyYW50Q2xpcFVyaVBlcm1pc3Npb25WaWFDb250ZXh0KHRhcmdldE1lb3csIEludGVudC5GTEFHX0dSQU5UX1dSSVRFX1VSSV9QRVJNSVNTSU9OKTsKLSAgICAgICAgU3lzdGVtQ2xvY2suc2xlZXAoMjAwMCk7CiAKICAgICAgICAgbG9uZyBiZWZvcmUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgICAgICAgcmVzb2x2ZXIudGFrZVBlcnNpc3RhYmxlVXJpUGVybWlzc2lvbih0YXJnZXRNZW93Q2F0LCBJbnRlbnQuRkxBR19HUkFOVF9XUklURV9VUklfUEVSTUlTU0lPTik7CkBAIC0xNTU1LDcgKzE1MjQsNiBAQAogCiAgICAgICAgIC8vIFJldm9rZSBhbnlvbmUgd2l0aCB3cml0ZSB1bmRlciBtZW93CiAgICAgICAgIHJldm9rZUNsaXBVcmlQZXJtaXNzaW9uVmlhQ29udGV4dCh0YXJnZXRNZW93LCBJbnRlbnQuRkxBR19HUkFOVF9XUklURV9VUklfUEVSTUlTU0lPTik7Ci0gICAgICAgIFN5c3RlbUNsb2NrLnNsZWVwKDIwMDApOwogCiAgICAgICAgIC8vIFRoaXMgc2hvdWxkIGhhdmUgbnVrZWQgcGVyc2lzdGVkIHBlcm1pc3Npb24gYXQgbG93ZXIgbGV2ZWwsIGJ1dCBpdAogICAgICAgICAvLyBzaG91bG5kJ3QgaGF2ZSB0b3VjaGVkIG91ciBwcmVmaXggcmVhZC4KQEAgLTE1NjksNyArMTUzNyw2IEBACiAKICAgICAgICAgLy8gUmV2b2tpbmcgcmVhZCBhdCB0b3Agb2YgdHJlZSBzaG91bGQgbnVrZSBldmVyeXRoaW5nIGVsc2UKICAgICAgICAgcmV2b2tlQ2xpcFVyaVBlcm1pc3Npb25WaWFDb250ZXh0KHRhcmdldCwgSW50ZW50LkZMQUdfR1JBTlRfUkVBRF9VUklfUEVSTUlTU0lPTik7Ci0gICAgICAgIFN5c3RlbUNsb2NrLnNsZWVwKDIwMDApOwogICAgICAgICBhc3NlcnRSZWFkaW5nQ2xpcE5vdEFsbG93ZWQoY2xpcCwgInJlYWRpbmcgc2hvdWxkIGhhdmUgZmFpbGVkIik7CiAgICAgICAgIGFzc2VydFJlYWRpbmdDbGlwTm90QWxsb3dlZChjbGlwTWVvdywgInJlYWRpbmcgc2hvdWxkIGhhdmUgZmFpbGVkIik7CiAgICAgICAgIGFzc2VydFJlYWRpbmdDbGlwTm90QWxsb3dlZChjbGlwTWVvd0NhdCwgInJlYWRpbmcgc2hvdWxkIGhhdmUgZmFpbGVkIik7CkBAIC0xNjA3LDcgKzE1NzQsNiBAQAogICAgICAgICBncmFudENsaXBVcmlQZXJtaXNzaW9uVmlhQ29udGV4dCh0YXJnZXRNZW93LCBJbnRlbnQuRkxBR19HUkFOVF9SRUFEX1VSSV9QRVJNSVNTSU9OCiAgICAgICAgICAgICAgICAgfCBJbnRlbnQuRkxBR19HUkFOVF9QUkVGSVhfVVJJX1BFUk1JU1NJT04pOwogICAgICAgICBncmFudENsaXBVcmlQZXJtaXNzaW9uVmlhQ29udGV4dCh0YXJnZXRNZW93LCBJbnRlbnQuRkxBR19HUkFOVF9XUklURV9VUklfUEVSTUlTU0lPTik7Ci0gICAgICAgIFN5c3RlbUNsb2NrLnNsZWVwKDIwMDApOwogCiAgICAgICAgIGxvbmcgYmVmb3JlID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAgICAgICAgIHJlc29sdmVyLnRha2VQZXJzaXN0YWJsZVVyaVBlcm1pc3Npb24odGFyZ2V0TWVvd0NhdCwgSW50ZW50LkZMQUdfR1JBTlRfV1JJVEVfVVJJX1BFUk1JU1NJT04pOwpAQCAtMTY0NSw0ICsxNjExLDU2IEBACiAgICAgICAgIGFzc2VydFdyaXRpbmdDbGlwTm90QWxsb3dlZChjbGlwTWVvd0NhdCwgIndyaXRpbmcgc2hvdWxkIGhhdmUgZmFpbGVkIik7CiAgICAgICAgIGFzc2VydE5vUGVyc2lzdGVkVXJpUGVybWlzc2lvbigpOwogICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDbGlwYm9hcmRXaXRoUGVybWlzc2lvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmb3IgKFVyaSB0YXJnZXQgOiBHUkFOVEFCTEUpIHsKKyAgICAgICAgICAgIGZpbmFsIENsaXBEYXRhIGNsaXAgPSBtYWtlU2luZ2xlQ2xpcERhdGEodGFyZ2V0KTsKKworICAgICAgICAgICAgLy8gTm9ybWFsbHkgd2UgY2FuJ3Qgc2VlIHRoZSB1bmRlcmx5aW5nIGNsaXAgZGF0YQorICAgICAgICAgICAgYXNzZXJ0UmVhZGluZ0NsaXBOb3RBbGxvd2VkKGNsaXApOworICAgICAgICAgICAgYXNzZXJ0V3JpdGluZ0NsaXBOb3RBbGxvd2VkKGNsaXApOworCisgICAgICAgICAgICAvLyBCdXQgaWYgc29tZW9uZSBwdXRzIGl0IG9uIHRoZSBjbGlwYm9hcmQsIHdlIGNhbiByZWFkIGl0CisgICAgICAgICAgICBzZXRQcmltYXJ5Q2xpcChjbGlwKTsKKyAgICAgICAgICAgIGZpbmFsIENsaXBEYXRhIGNsaXBGcm9tQ2xpcGJvYXJkID0gZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoQ2xpcGJvYXJkTWFuYWdlci5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgLmdldFByaW1hcnlDbGlwKCk7CisgICAgICAgICAgICBhc3NlcnRDbGlwRGF0YUVxdWFscyhjbGlwLCBjbGlwRnJvbUNsaXBib2FyZCk7CisgICAgICAgICAgICBhc3NlcnRSZWFkaW5nQ2xpcEFsbG93ZWQoY2xpcEZyb21DbGlwYm9hcmQpOworICAgICAgICAgICAgYXNzZXJ0V3JpdGluZ0NsaXBOb3RBbGxvd2VkKGNsaXBGcm9tQ2xpcGJvYXJkKTsKKworICAgICAgICAgICAgLy8gQW5kIGlmIGNsaXBib2FyZCBpcyBjbGVhcmVkLCB3ZSBsb3NlIGFjY2VzcworICAgICAgICAgICAgY2xlYXJQcmltYXJ5Q2xpcCgpOworICAgICAgICAgICAgYXNzZXJ0UmVhZGluZ0NsaXBOb3RBbGxvd2VkKGNsaXBGcm9tQ2xpcGJvYXJkKTsKKyAgICAgICAgICAgIGFzc2VydFdyaXRpbmdDbGlwTm90QWxsb3dlZChjbGlwRnJvbUNsaXBib2FyZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xpcGJvYXJkV2l0aG91dFBlcm1pc3Npb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChVcmkgdGFyZ2V0IDogTk9UX0dSQU5UQUJMRSkgeworICAgICAgICAgICAgZmluYWwgQ2xpcERhdGEgY2xpcCA9IG1ha2VTaW5nbGVDbGlwRGF0YSh0YXJnZXQpOworCisgICAgICAgICAgICAvLyBDYW4ndCBzZWUgaXQgZGlyZWN0bHkKKyAgICAgICAgICAgIGFzc2VydFJlYWRpbmdDbGlwTm90QWxsb3dlZChjbGlwKTsKKyAgICAgICAgICAgIGFzc2VydFdyaXRpbmdDbGlwTm90QWxsb3dlZChjbGlwKTsKKworICAgICAgICAgICAgLy8gQ2FuJ3QgcHV0IG9uIGNsaXBib2FyZCBpZiB3ZSBkb24ndCBvd24gaXQKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc2V0UHJpbWFyeUNsaXAoY2xpcCk7CisgICAgICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBhYmlsaXR5IHRvIHB1dCBwcm90ZWN0ZWQgZGF0YSAiICsgY2xpcCArICIgb24gY2xpcGJvYXJkISIpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydENsaXBEYXRhRXF1YWxzKENsaXBEYXRhIGV4cGVjdGVkLCBDbGlwRGF0YSBhY3R1YWwpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmdldEl0ZW1Db3VudCgpLCBhY3R1YWwuZ2V0SXRlbUNvdW50KCkpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkLmdldEl0ZW1Db3VudCgpOyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIENsaXBEYXRhLkl0ZW0gZXhwZWN0ZWRJdGVtID0gZXhwZWN0ZWQuZ2V0SXRlbUF0KGkpOworICAgICAgICAgICAgZmluYWwgQ2xpcERhdGEuSXRlbSBhY3R1YWxJdGVtID0gYWN0dWFsLmdldEl0ZW1BdChpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZEl0ZW0uZ2V0VGV4dCgpLCBhY3R1YWxJdGVtLmdldFRleHQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRJdGVtLmdldEh0bWxUZXh0KCksIGFjdHVhbEl0ZW0uZ2V0SHRtbFRleHQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRJdGVtLmdldEludGVudCgpLCBhY3R1YWxJdGVtLmdldEludGVudCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZEl0ZW0uZ2V0VXJpKCksIGFjdHVhbEl0ZW0uZ2V0VXJpKCkpOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvVXNlUGVybWlzc2lvbkRpZmZDZXJ0L3NyYy9jb20vYW5kcm9pZC9jdHMvdXNlc3Blcm1pc3Npb25kaWZmY2VydGFwcC9Nb2RpZnlJbnN0YWxsZXJQYWNrYWdlVGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvVXNlUGVybWlzc2lvbkRpZmZDZXJ0L3NyYy9jb20vYW5kcm9pZC9jdHMvdXNlc3Blcm1pc3Npb25kaWZmY2VydGFwcC9Nb2RpZnlJbnN0YWxsZXJQYWNrYWdlVGVzdC5qYXZhCmluZGV4IDk4OWUyNGIuLmYzZTUwMDIgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1VzZVBlcm1pc3Npb25EaWZmQ2VydC9zcmMvY29tL2FuZHJvaWQvY3RzL3VzZXNwZXJtaXNzaW9uZGlmZmNlcnRhcHAvTW9kaWZ5SW5zdGFsbGVyUGFja2FnZVRlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Vc2VQZXJtaXNzaW9uRGlmZkNlcnQvc3JjL2NvbS9hbmRyb2lkL2N0cy91c2VzcGVybWlzc2lvbmRpZmZjZXJ0YXBwL01vZGlmeUluc3RhbGxlclBhY2thZ2VUZXN0LmphdmEKQEAgLTE2LDE1ICsxNiwxNiBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy51c2VzcGVybWlzc2lvbmRpZmZjZXJ0YXBwOwogCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jdHMucGVybWlzc2lvbmRlY2xhcmVhcHAuVXRpbHNQcm92aWRlci5BQ1RJT05fU0VUX0lOU1RBTExFUl9QQUNLQUdFX05BTUU7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmN0cy5wZXJtaXNzaW9uZGVjbGFyZWFwcC5VdGlsc1Byb3ZpZGVyLkVYVFJBX0lOU1RBTExFUl9QQUNLQUdFX05BTUU7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmN0cy5wZXJtaXNzaW9uZGVjbGFyZWFwcC5VdGlsc1Byb3ZpZGVyLkVYVFJBX1BBQ0tBR0VfTkFNRTsKKwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy5wZXJtaXNzaW9uZGVjbGFyZWFwcC5VdGlsc1Byb3ZpZGVyOwogCiAvKioKICAqIFRlc3RzIHRoYXQgb25lIGFwcGxpY2F0aW9uIGNhbiBhbmQgY2FuIG5vdCBtb2RpZnkgdGhlIGluc3RhbGxlciBwYWNrYWdlCkBAIC0zMyw4NSArMzQsMTkgQEAKICAqIEFjY2Vzc2VzIGFwcCBjdHMvdGVzdHMvYXBwc2VjdXJpdHktdGVzdHMvdGVzdC1hcHBzL1Blcm1pc3Npb25EZWNsYXJlQXBwLy4uLgogICovCiBwdWJsaWMgY2xhc3MgTW9kaWZ5SW5zdGFsbGVyUGFja2FnZVRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgewotICAgIHN0YXRpYyBmaW5hbCBDb21wb25lbnROYW1lIFNFVF9JTlNUQUxMRVJfUEFDS0FHRV9DT01QCi0gICAgICAgICAgICA9IG5ldyBDb21wb25lbnROYW1lKCJjb20uYW5kcm9pZC5jdHMucGVybWlzc2lvbmRlY2xhcmVhcHAiLAotICAgICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuY3RzLnBlcm1pc3Npb25kZWNsYXJlYXBwLlNldEluc3RhbGxlclBhY2thZ2UiKTsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE9USEVSX1BBQ0tBR0UgPSAiY29tLmFuZHJvaWQuY3RzLnBlcm1pc3Npb25kZWNsYXJlYXBwIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE1ZX1BBQ0tBR0UgPSAiY29tLmFuZHJvaWQuY3RzLnVzZXNwZXJtaXNzaW9uZGlmZmNlcnRhcHAiOwogCi0gICAgc3RhdGljIGNsYXNzIFNldEluc3RhbGxlclBhY2thZ2VSZWNlaXZlciBleHRlbmRzIEJyb2FkY2FzdFJlY2VpdmVyIHsKLSAgICAgICAgYm9vbGVhbiBtSGF2ZVJlc3VsdCA9IGZhbHNlOwotICAgICAgICBib29sZWFuIG1Hb29kUmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gbVN1Y2NlZWRlZCA9IGZhbHNlOwotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgICAgICBtSGF2ZVJlc3VsdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChnZXRSZXN1bHRDb2RlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtR29vZFJlc3VsdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3VjY2VlZGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDE6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtR29vZFJlc3VsdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3VjY2VlZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgbUdvb2RSZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBub3RpZnlBbGwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgYXNzZXJ0U3VjY2VzcyhTdHJpbmcgZmFpbHVyZU1lc3NhZ2UpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgc3RhcnRUaW1lID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKCFtSGF2ZVJlc3VsdCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgd2FpdCg1MDAwKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSA+PSAoc3RhcnRUaW1lKzUwMDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGltZW91dCIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghbUdvb2RSZXN1bHQpIHsKLSAgICAgICAgICAgICAgICAgICAgZmFpbCgiQnJvYWRjYXN0IHJlY2VpdmVyIGRpZCBub3QgcmV0dXJuIGdvb2QgcmVzdWx0Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghbVN1Y2NlZWRlZCkgewotICAgICAgICAgICAgICAgICAgICBmYWlsKGZhaWx1cmVNZXNzYWdlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGFzc2VydEZhaWx1cmUoU3RyaW5nIGZhaWx1cmVNZXNzYWdlKSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBsb25nIHN0YXJ0VGltZSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgIHdoaWxlICghbUhhdmVSZXN1bHQpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdhaXQoNTAwMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkgPj0gKHN0YXJ0VGltZSs1MDAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRpbWVvdXQiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIW1Hb29kUmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGZhaWwoIkJyb2FkY2FzdCByZWNlaXZlciBkaWQgbm90IHJldHVybiBnb29kIHJlc3VsdCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobVN1Y2NlZWRlZCkgewotICAgICAgICAgICAgICAgICAgICBmYWlsKGZhaWx1cmVNZXNzYWdlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBQYWNrYWdlTWFuYWdlciBnZXRQYWNrYWdlTWFuYWdlcigpIHsKICAgICAgICAgcmV0dXJuIGdldENvbnRleHQoKS5nZXRQYWNrYWdlTWFuYWdlcigpOwogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBjYWxsKEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgZmluYWwgQnVuZGxlIGV4dHJhcyA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgZXh0cmFzLnB1dFBhcmNlbGFibGUoSW50ZW50LkVYVFJBX0lOVEVOVCwgaW50ZW50KTsKKyAgICAgICAgZ2V0Q29udGV4dCgpLmdldENvbnRlbnRSZXNvbHZlcigpLmNhbGwoVXRpbHNQcm92aWRlci5VUkksICIiLCAiIiwgZXh0cmFzKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBUZXN0IHRoYXQgd2UgY2FuIHNldCB0aGUgaW5zdGFsbGVyIHBhY2thZ2UgbmFtZS4KICAgICAgKi8KQEAgLTE4MiwxMiArMTE3LDEwIEBACiAKICAgICAgICAgLy8gSGF2ZSB0aGUgb3RoZXIgcGFja2FnZSBzZXQgdGhlIGluc3RhbGxlciwgdW5kZXIgaXRzIGNlcnQuCiAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KCk7Ci0gICAgICAgIGludGVudC5zZXRDb21wb25lbnQoU0VUX0lOU1RBTExFUl9QQUNLQUdFX0NPTVApOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoInRhcmdldCIsIE9USEVSX1BBQ0tBR0UpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoImluc3RhbGxlciIsIE9USEVSX1BBQ0tBR0UpOwotICAgICAgICBTZXRJbnN0YWxsZXJQYWNrYWdlUmVjZWl2ZXIgcmVjZWl2ZXIgPSBuZXcgU2V0SW5zdGFsbGVyUGFja2FnZVJlY2VpdmVyKCk7Ci0gICAgICAgIGdldENvbnRleHQoKS5zZW5kT3JkZXJlZEJyb2FkY2FzdChpbnRlbnQsIG51bGwsIHJlY2VpdmVyLCBudWxsLCAwLCBudWxsLCBudWxsKTsKLSAgICAgICAgcmVjZWl2ZXIuYXNzZXJ0U3VjY2VzcygiRmFpbHVyZSBpbml0aWFsaXppbmcgd2l0aCBvdGhlciBpbnN0YWxsZXIiKTsKKyAgICAgICAgaW50ZW50LnNldEFjdGlvbihBQ1RJT05fU0VUX0lOU1RBTExFUl9QQUNLQUdFX05BTUUpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoRVhUUkFfUEFDS0FHRV9OQU1FLCBPVEhFUl9QQUNLQUdFKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKEVYVFJBX0lOU1RBTExFUl9QQUNLQUdFX05BTUUsIE9USEVSX1BBQ0tBR0UpOworICAgICAgICBjYWxsKGludGVudCk7CiAKICAgICAgICAgYXNzZXJ0RXF1YWxzKE9USEVSX1BBQ0tBR0UsIGdldFBhY2thZ2VNYW5hZ2VyKCkuZ2V0SW5zdGFsbGVyUGFja2FnZU5hbWUoT1RIRVJfUEFDS0FHRSkpOwogCkBAIC0yMDEsMTEgKzEzNCwxMCBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoT1RIRVJfUEFDS0FHRSwgZ2V0UGFja2FnZU1hbmFnZXIoKS5nZXRJbnN0YWxsZXJQYWNrYWdlTmFtZShPVEhFUl9QQUNLQUdFKSk7CiAKICAgICAgICAgLy8gTm93IGNsZWFyIHRoZSBpbnN0YWxsZXIKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJ0YXJnZXQiLCBPVEhFUl9QQUNLQUdFKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJpbnN0YWxsZXIiLCAoU3RyaW5nKW51bGwpOwotICAgICAgICByZWNlaXZlciA9IG5ldyBTZXRJbnN0YWxsZXJQYWNrYWdlUmVjZWl2ZXIoKTsKLSAgICAgICAgZ2V0Q29udGV4dCgpLnNlbmRPcmRlcmVkQnJvYWRjYXN0KGludGVudCwgbnVsbCwgcmVjZWl2ZXIsIG51bGwsIDAsIG51bGwsIG51bGwpOwotICAgICAgICByZWNlaXZlci5hc3NlcnRTdWNjZXNzKCJGYWlsdXJlIGNsZWFyaW5nIG90aGVyIGluc3RhbGxlciIpOworICAgICAgICBpbnRlbnQuc2V0QWN0aW9uKEFDVElPTl9TRVRfSU5TVEFMTEVSX1BBQ0tBR0VfTkFNRSk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShFWFRSQV9QQUNLQUdFX05BTUUsIE9USEVSX1BBQ0tBR0UpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoRVhUUkFfSU5TVEFMTEVSX1BBQ0tBR0VfTkFNRSwgKFN0cmluZyludWxsKTsKKyAgICAgICAgY2FsbChpbnRlbnQpOwogCiAgICAgICAgIGFzc2VydEVxdWFscyhudWxsLCBnZXRQYWNrYWdlTWFuYWdlcigpLmdldEluc3RhbGxlclBhY2thZ2VOYW1lKE9USEVSX1BBQ0tBR0UpKTsKICAgICB9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Vc2VzTGlicmFyeUFwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvVXNlc0xpYnJhcnlBcHAvQW5kcm9pZC5tawppbmRleCAyZDY3ZDYyLi5mM2QzZDMxIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Vc2VzTGlicmFyeUFwcC9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1VzZXNMaWJyYXJ5QXBwL0FuZHJvaWQubWsKQEAgLTIwLDcgKzIwLDkgQEAKIAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKIExPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLXN1cHBvcnQtdGVzdCBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsIGN0c3Rlc3RydW5uZXIgdWItdWlhdXRvbWF0b3IKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkeC50ZXN0LnJ1bGVzIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0IGN0c3Rlc3RydW5uZXItYXh0IHViLXVpYXV0b21hdG9yCisKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykgXAogICAgIC4uL0V4dGVybmFsU3RvcmFnZUFwcC9zcmMvY29tL2FuZHJvaWQvY3RzL2V4dGVybmFsc3RvcmFnZWFwcC9Db21tb25FeHRlcm5hbFN0b3JhZ2VUZXN0LmphdmEKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1VzZXNMaWJyYXJ5QXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Vc2VzTGlicmFyeUFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDQ1NTdhZjAuLjRiMzdkMDggMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1VzZXNMaWJyYXJ5QXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvVXNlc0xpYnJhcnlBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjEsNiArMjEsNiBAQAogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuTXlBY3Rpdml0eSIgLz4KICAgICA8L2FwcGxpY2F0aW9uPgogICAgIDxpbnN0cnVtZW50YXRpb24KLSAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5jdHMudXNlc2xpYnJhcnkiIC8+CiA8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvVjNTaWduaW5nU2NoZW1lUm90YXRpb24vQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1YzU2lnbmluZ1NjaGVtZVJvdGF0aW9uL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU2ZjI5NgotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1YzU2lnbmluZ1NjaGVtZVJvdGF0aW9uL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCisjIHRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0CitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQorTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWR4LnRlc3QucnVsZXMKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzVjNTaWduaW5nU2NoZW1lUm90YXRpb25UZXN0CitMT0NBTF9ERVhfUFJFT1BUIDo9IGZhbHNlCisKK2luY2x1ZGUgJChCVUlMRF9DVFNfU1VQUE9SVF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvVjNTaWduaW5nU2NoZW1lUm90YXRpb24vQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1YzU2lnbmluZ1NjaGVtZVJvdGF0aW9uL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFmZmZjZAotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1YzU2lnbmluZ1NjaGVtZVJvdGF0aW9uL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwyNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIHBhY2thZ2U9ImFuZHJvaWQuYXBwc2VjdXJpdHkuY3RzLnYzcm90YXRpb250ZXN0cyI+CisgICAgPGFwcGxpY2F0aW9uPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPGluc3RydW1lbnRhdGlvbgorICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuYXBwc2VjdXJpdHkuY3RzLnYzcm90YXRpb250ZXN0cyIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiIC8+Cis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvVjNTaWduaW5nU2NoZW1lUm90YXRpb24vc3JjL2FuZHJvaWQvYXBwc2VjdXJpdHkvY3RzL3Yzcm90YXRpb250ZXN0cy9WM1JvdGF0aW9uVGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvVjNTaWduaW5nU2NoZW1lUm90YXRpb24vc3JjL2FuZHJvaWQvYXBwc2VjdXJpdHkvY3RzL3Yzcm90YXRpb250ZXN0cy9WM1JvdGF0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZTk4ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9WM1NpZ25pbmdTY2hlbWVSb3RhdGlvbi9zcmMvYW5kcm9pZC9hcHBzZWN1cml0eS9jdHMvdjNyb3RhdGlvbnRlc3RzL1YzUm90YXRpb25UZXN0LmphdmEKQEAgLTAsMCArMSwyMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYXBwc2VjdXJpdHkuY3RzLnYzcm90YXRpb250ZXN0czsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlSW5mbzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlNpZ25hdHVyZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLk92ZXJyaWRlOworCisvKioKKyAqIE9uLWRldmljZSB0ZXN0cyBmb3IgQVBLIFNpZ25hdHVyZSBTY2hlbWUgdjMgYmFzZWQgc2lnbmluZyBjZXJ0aWZpY2F0ZSByb3RhdGlvbgorICovCitwdWJsaWMgY2xhc3MgVjNSb3RhdGlvblRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBLRyA9ICJhbmRyb2lkLmFwcHNlY3VyaXR5LmN0cy50aW55YXBwIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUEFOSU9OX1BLRyA9ICJhbmRyb2lkLmFwcHNlY3VyaXR5LmN0cy50aW55YXBwX2NvbXBhbmlvbiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUk1JU1NJT05fTkFNRSA9ICJhbmRyb2lkLmFwcHNlY3VyaXR5LmN0cy50aW55YXBwLnBlcm0iOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJUlNUX0NFUlRfSEVYID0KKyAgICAgICAgICAgICIzMDgyMDM3NzMwODIwMjVmYTAwMzAyMDEwMjAyMDQzNTdmN2E5NzMwMGQwNjA5MmE4NjQ4ODZmNzBkMDEwMTBiMDUwMDMwNmMzMTBiMzAwOTA2MDM1NSIKKyAgICAgICAgICAgICsgIjA0MDYxMzAyNTU1MzMxMGIzMDA5MDYwMzU1MDQwODEzMDI0MzQxMzExNjMwMTQwNjAzNTUwNDA3MTMwZDRkNmY3NTZlNzQ2MTY5NmUyMDU2Njk2NSIKKyAgICAgICAgICAgICsgIjc3MzExMDMwMGUwNjAzNTUwNDBhMTMwNzQxNmU2NDcyNmY2OTY0MzExMDMwMGUwNjAzNTUwNDBiMTMwNzU1NmU2YjZlNmY3NzZlMzExNDMwMTIwNiIKKyAgICAgICAgICAgICsgIjAzNTUwNDAzMTMwYjQ3NzI2NTY1NmUyMDQ0NzI2ZjY5NjQzMDFlMTcwZDMxMzgzMDMxMzMzMTMxMzgzMDMzMzEzNDVhMTcwZDM0MzUzMDM2MzEzOCIKKyAgICAgICAgICAgICsgIjMxMzgzMDMzMzEzNDVhMzA2YzMxMGIzMDA5MDYwMzU1MDQwNjEzMDI1NTUzMzEwYjMwMDkwNjAzNTUwNDA4MTMwMjQzNDEzMTE2MzAxNDA2MDM1NSIKKyAgICAgICAgICAgICsgIjA0MDcxMzBkNGQ2Zjc1NmU3NDYxNjk2ZTIwNTY2OTY1NzczMTEwMzAwZTA2MDM1NTA0MGExMzA3NDE2ZTY0NzI2ZjY5NjQzMTEwMzAwZTA2MDM1NSIKKyAgICAgICAgICAgICsgIjA0MGIxMzA3NTU2ZTZiNmU2Zjc3NmUzMTE0MzAxMjA2MDM1NTA0MDMxMzBiNDc3MjY1NjU2ZTIwNDQ3MjZmNjk2NDMwODIwMTIyMzAwZDA2MDkyYSIKKyAgICAgICAgICAgICsgIjg2NDg4NmY3MGQwMTAxMDEwNTAwMDM4MjAxMGYwMDMwODIwMTBhMDI4MjAxMDEwMGJjZTA1MTc5NzhkYjZlMWViMDI1NWI0NzA0YzEwZmNhMzFiOCIKKyAgICAgICAgICAgICsgImQ4Yjc0NjVkMTUxMmEzNjcxMmY0MjUwMDkxNDNkNDE4NzQzY2JkZTljOWY3ZGYyMTk5MDdmZmYzNzZlNDQyOTg0NjJmYjE0ZjVkZDdkMGVkZDQ2ZSIKKyAgICAgICAgICAgICsgImQ3NjRmOTNlODJiMjc3MTQ2ZjEwMDYxNmM0ZDkzZTk3Mjc5YWVmZGNmNDQ5YTVmZjAwMGViNzI0NDU4MTYwMzljN2FmZGNkOTM0MGYzOWZjNWYwYiIKKyAgICAgICAgICAgICsgImI0ZDBlNmM0ZDY3YTBlYzg3NmJmMjgwMDdjZjcwOTY2NzI1MDE0MjM4NTI0OGFmODljNWZhODdiOGVmOWNjMTI3MDU3N2IxNzIxYzIzNWJkZGU5NyIKKyAgICAgICAgICAgICsgIjg3YzA0NTM2NzA2OTQ3MTkzZDM4ZDI0NGM4YzY1OTBlNTRjOTBiMzg0MzUwNmIzZTE5YzVmMmMyMmMzOGExYTI4OTNjNzQ5YWQ0ZGRjZTY3Yjg2ZiIKKyAgICAgICAgICAgICsgImY1ZGNkN2RkMGQ2MzI2NWZhNTAwMzZmNGJmMzFmMjhmMmI0YzA2N2ZiNThjOTVlMDlhYjZjMTY4NmMyNTdjMzczMDYxNjY1OWIzNTJiOTY2ZWQ2NiIKKyAgICAgICAgICAgICsgImQ5Mzk1MmM2MDU2M2M5ZDg2M2FhMzdjMDk3ZjY0NmQ1NWM4MjViNDUwZjUxMWVjYTM5MTk4Y2Q3MDIwMzAxMDAwMWEzMjEzMDFmMzAxZDA2MDM1NSIKKyAgICAgICAgICAgICsgIjFkMGUwNDE2MDQxNDgzMTA3NGUzMTczZTUxZmJkMmFjOGVkOGM2NjgxZjYxZWNhODEzMTgzMDBkMDYwOTJhODY0ODg2ZjcwZDAxMDEwYjA1MDAwMyIKKyAgICAgICAgICAgICsgIjgyMDEwMTAwMWZhNDEyNjE4NjU5ZjQwMzk1ZTM4Njk4Y2Q4YjdjYTk0MjVmNjNlMjMxZTM5YTZjOGUyOTA5YWY5NTFiYmRjNWU2MzA3ODEzZTI1ZSIKKyAgICAgICAgICAgICsgIjMxNTAyNTc4YTU2YjZlNmYwODQ0MmE0MDBkZTE5NDQ5ZjFjN2Y4NzM1N2U1NTE5MWZkN2YzMGI4NzM1ZTEyOThkNGM2NjhiOWNkZTU2M2UxNDNkNCIKKyAgICAgICAgICAgICsgIjcyYmY4MDA1NDQzZDhlZTM4NmY5NTUxMzZhZDBhYTE2ZGRhN2Y1Yjk3N2RjMGRlZTg1OGY5NTRhZmYyYWU0ZDc0NzMyNTlmYjFiMWFjYzFkNjE2MSIKKyAgICAgICAgICAgICsgIjQ5YjEyNjU5MzcxYWUwMjk4MjIyOTc0YmUxMDgxNzE1NjI3OWM5ZGQ4ZjZjYWU1MjY1YmYxNWI2M2ZhOWYwODRlNzg5ZDA2YjNhOWI4NmQ4Mjc0OSIKKyAgICAgICAgICAgICsgImM5NTc5M2FjZGVkMjRiMzIxYTMxY2MyMGZkMTI3NzRjN2IyMDczMjVkZjUwYzJlZmNiNzhhNWNmOTc0OWY2MmFhZmQ4NmQzMDMyNTQ4ODBhNDQ3NiIKKyAgICAgICAgICAgICsgImE2NzgwMTQ1MmU4MmQxZTZjOTFhZWI5N2NhODM3YTkxYmNlZmQ4MzI0ZmNhNDkxZGU0ZWY2NDhkODBjNmQ3NGY0YjY2NTMzNjg0MDQwZGRhZDU1MCIKKyAgICAgICAgICAgICsgIjBmZjE0MGVkY2RhY2YwYTQiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFQ09ORF9DRVJUX0hFWCA9CisgICAgICAgICAgICAiMzA4MjAzN2IzMDgyMDI2M2EwMDMwMjAxMDIwMjA0NGM0YTY0NGEzMDBkMDYwOTJhODY0ODg2ZjcwZDAxMDEwYjA1MDAzMDZlMzEwYjMwMDkwNjAzNTUiCisgICAgICAgICAgICArICIwNDA2MTMwMjU1NTMzMTBiMzAwOTA2MDM1NTA0MDgxMzAyNDM0MTMxMTYzMDE0MDYwMzU1MDQwNzEzMGQ0ZDZmNzU2ZTc0NjE2OTZlMjA1NjY5NjUiCisgICAgICAgICAgICArICI3NzMxMTAzMDBlMDYwMzU1MDQwYTEzMDc0MTZlNjQ3MjZmNjk2NDMxMTAzMDBlMDYwMzU1MDQwYjEzMDc1NTZlNmI2ZTZmNzc2ZTMxMTYzMDE0MDYiCisgICAgICAgICAgICArICIwMzU1MDQwMzEzMGQ0NzcyNjU2NTZlNjU3MjIwNDQ3MjZmNjk2NDMwMWUxNzBkMzEzODMwMzEzMzMxMzEzODMwMzUzMzM4NWExNzBkMzQzNTMwMzYiCisgICAgICAgICAgICArICIzMTM4MzEzODMwMzUzMzM4NWEzMDZlMzEwYjMwMDkwNjAzNTUwNDA2MTMwMjU1NTMzMTBiMzAwOTA2MDM1NTA0MDgxMzAyNDM0MTMxMTYzMDE0MDYiCisgICAgICAgICAgICArICIwMzU1MDQwNzEzMGQ0ZDZmNzU2ZTc0NjE2OTZlMjA1NjY5NjU3NzMxMTAzMDBlMDYwMzU1MDQwYTEzMDc0MTZlNjQ3MjZmNjk2NDMxMTAzMDBlMDYiCisgICAgICAgICAgICArICIwMzU1MDQwYjEzMDc1NTZlNmI2ZTZmNzc2ZTMxMTYzMDE0MDYwMzU1MDQwMzEzMGQ0NzcyNjU2NTZlNjU3MjIwNDQ3MjZmNjk2NDMwODIwMTIyMzAiCisgICAgICAgICAgICArICIwZDA2MDkyYTg2NDg4NmY3MGQwMTAxMDEwNTAwMDM4MjAxMGYwMDMwODIwMTBhMDI4MjAxMDEwMGE0ZjM3NDFlZGYwNGUzMmU3MDQ3YWFhZGMyY2UiCisgICAgICAgICAgICArICJkZTAxNjRhMjg0NzE0OWFhN2ZhZDA1NGRhYjU5ZTcwYzEwNzhkZDJkNTk0NmNlYzY0ODA5Zjc5NTUxMzk1NDc4YjA4ZjNlMDI4NmQ0NTJmYTM5YjkiCisgICAgICAgICAgICArICJlNjgwNGU5NjVhNDQyMTBhNjFiZDVjZmUzYzhhYzBlYzg2MDE3YzBlOTEyNjAyNDhkYWExZmQ3YTExYjFiMWI1MTkyMTZhNDBkMDJkYjQ5ZTc1NGEiCisgICAgICAgICAgICArICI2MzgwMzU3YzQ1ZWYxNTMxOTk2ZTRjMzdjMTNlMmY1MDdmM2E5Mjk2ZWI1MjIzNTI0OGQwMTcyZWZlNGVkN2JhYzUzN2ZlMjQzNWYwM2Q2NmM1ZTMiCisgICAgICAgICAgICArICJlNWNiZjYwZDc3ZjMwODhiYzIyNzE4ZGVkMDkwMDlkNjQxNDEwNmQxMzAxZDFhNWFiZjcxYWE1ZGM2NDY5YmI3M2IyOWIyY2M5YzA5YjljNDJlOGYiCisgICAgICAgICAgICArICI4ZTgxZTdmYzliMjRhZDFjYjBjM2UyZTI4MzJkMDU3MGJkZWI4N2EzZmY4ZjQ5YWFlMDViMDMxNjRmYjNjMjI1NzQ1YjcwMTM0YzZiN2FhZjA4MWYiCisgICAgICAgICAgICArICI1MTQwNTg3NzZiZDI4YTBjMGExNTJiZjQ1YjNlZGRjN2YyYzRhYWVkNGVhY2UwY2FiNjdlZjQ2NTAyMTMzMDNmMDIwMzAxMDAwMWEzMjEzMDFmMzAiCisgICAgICAgICAgICArICIxZDA2MDM1NTFkMGUwNDE2MDQxNGYwYzNkYWNmMDJkOTU4MzIwMGQ0ZDM4NmE0MDM0MWFlZTgyZGQ4NTkzMDBkMDYwOTJhODY0ODg2ZjcwZDAxMDEiCisgICAgICAgICAgICArICIwYjA1MDAwMzgyMDEwMTAwM2E2M2E5M2JlOTg2NzQwMTU4NTc0MjM5MzEwZTk4N2NkY2RjODZmNzM1ODY3Nzg5YzJiNTZmOGZmYTdjZTkwMWE5ZjIiCisgICAgICAgICAgICArICIyYjBjMzc0ZDM0NWFhOTk2YTM3Yzc0NzQ4MjRkYmY3MjE4NmQxZWVkYWE2YWFlMDU3NGZkMTk5NmY1MDFkZWYzMmU2MjcwM2VlNDAxMGE3MDU4ZGYiCisgICAgICAgICAgICArICJmMGQ2MDhkZjExNzZiZGJlOTNlYmQzOTEwMTcyZmMxNDYzMDdkMDk2MWE1N2Q5NTgwNmVlYWJjMWU1NGI4MTI3M2Q5NDQ5ZjBmNjg1MTEyODgzNzciCisgICAgICAgICAgICArICJjODJmODdhMDMyZDEzNzkyNjAzNjVlZjgzYzkzZjFiZjRjMGFmOTU5YjQyNjc5NGM1NThjMDM1N2ZlNjEyNzFlZDBmYjA1NGU5MTZlMGJhYjg2MDAiCisgICAgICAgICAgICArICIzYmNjMTZjZTUzZjdkMmM4ZDA1YjgzMDcyMTE1YjBmYjJjNjcxYzIyNjY4MTNmMWE0MDdjYTkxMWM0N2YyNzY2NWRlYmZhNjNiYzRlNDA3MTczMGEiCisgICAgICAgICAgICArICJhNDc3YWNiZTZlZWNjOGQ1NzU1MTFiMmI3N2EzNTUxZjA0MGNjZjIxNzkyZjc0Y2Q5NWM4NGUzZmY4N2FkMDM4NTFkYjgxZDE2NGM4MzY4MzBlMzEiCisgICAgICAgICAgICArICI4MjA4YTUyZGNkYzc3ZTM3NmY3M2I5NmQiOworCisgICAgcHVibGljIHZvaWQgdGVzdEhhc1Blcm0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUGFja2FnZU1hbmFnZXIgcG0gPSBnZXRDb250ZXh0KCkuZ2V0UGFja2FnZU1hbmFnZXIoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShQRVJNSVNTSU9OX05BTUUgKyAiIG5vdCBncmFudGVkIHRvICIgKyBDT01QQU5JT05fUEtHLAorICAgICAgICAgICAgICAgIHBtLmNoZWNrUGVybWlzc2lvbihQRVJNSVNTSU9OX05BTUUsIENPTVBBTklPTl9QS0cpCisgICAgICAgICAgICAgICAgICAgICAgICA9PSBQYWNrYWdlTWFuYWdlci5QRVJNSVNTSU9OX0dSQU5URUQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNOb1Blcm0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUGFja2FnZU1hbmFnZXIgcG0gPSBnZXRDb250ZXh0KCkuZ2V0UGFja2FnZU1hbmFnZXIoKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoUEVSTUlTU0lPTl9OQU1FICsgIiBncmFudGVkIHRvICIgKyBDT01QQU5JT05fUEtHLAorICAgICAgICAgICAgICAgIHBtLmNoZWNrUGVybWlzc2lvbihQRVJNSVNTSU9OX05BTUUsIENPTVBBTklPTl9QS0cpCisgICAgICAgICAgICAgICAgICAgICAgICA9PSBQYWNrYWdlTWFuYWdlci5QRVJNSVNTSU9OX0dSQU5URUQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTaWduYXR1cmVzU2hvd3NPbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gdG8gcHJldmVudCBicmVha2FnZSBkdWUgdG8gc2lnbmluZyBjZXJ0aWZpY2F0ZSByb3RhdGlvbiwgd2UgcmVwb3J0IHRoZSBvbGRlc3Qgc2lnbmluZworICAgICAgICAvLyBjZXJ0aWZpY2F0ZSBpbiB0aGUgbm93LWRlcHJlY2F0ZWQgUGFja2FnZUluZm8gc2lnbmF0dXJlcyBmaWVsZC4gIE1ha2Ugc3VyZSB0aGF0IHdoZW4KKyAgICAgICAgLy8gcm90YXRpbmcsIGl0IHN0aWxsIGRpc3BsYXlzIHRoZSBvbGRlciBjZXJ0LgorICAgICAgICBQYWNrYWdlTWFuYWdlciBwbSA9IGdldENvbnRleHQoKS5nZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICBQYWNrYWdlSW5mbyBwaSA9IHBtLmdldFBhY2thZ2VJbmZvKFBLRywgUGFja2FnZU1hbmFnZXIuR0VUX1NJR05BVFVSRVMpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJGYWlsZWQgdG8gZ2V0IHNpZ25hdHVyZXMgaW4gUGFja2FnZUluZm8gb2YgIiArIFBLRywgcGkuc2lnbmF0dXJlcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiUGFja2FnZUluZm8gZm9yICIgKyBQS0cgKyAiY29udGFpbnMgbXVsdGlwbGUgZW50cmllcyIsCisgICAgICAgICAgICAgICAgMSwgcGkuc2lnbmF0dXJlcy5sZW5ndGgpOworICAgICAgICBhc3NlcnRFcXVhbHMoInNpZ25hdHVyZSBtaXNtYXRjaCBmb3IgIiArIFBLRyArICIsIGV4cGVjdGVkIG9sZCBzaWduaW5nIGNlcnRpZmljYXRlIiwKKyAgICAgICAgICAgICAgICBwaS5zaWduYXR1cmVzWzBdLnRvQ2hhcnNTdHJpbmcoKSwgRklSU1RfQ0VSVF9IRVgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTaWduaW5nQ2VydGlmaWNhdGVzU2hvd3NBbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gbWFrZSBzdXJlIG91ciBzaGlueSBuZXcgR0VUX1NJR05BVFVSRVMgcmVwbGFjZW1lbnQgZG9lcyBpdHMgam9iLiAgSXQgc2hvdWxkIHJldHVybiBhbGwgb2YKKyAgICAgICAgLy8gdGhlIGNlcnRpZmljYXRlcyBpbiBhbiBhcHAncyBwcm92aWRlZCBoaXN0b3J5LCBpbmNsdWRpbmcgaXRzIGN1cnJlbnQgb25lCisgICAgICAgIFBhY2thZ2VNYW5hZ2VyIHBtID0gZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgIFBhY2thZ2VJbmZvIHBpID0gcG0uZ2V0UGFja2FnZUluZm8oUEtHLCBQYWNrYWdlTWFuYWdlci5HRVRfU0lHTklOR19DRVJUSUZJQ0FURVMpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJGYWlsZWQgdG8gZ2V0IHNpZ25hdHVyZXMgaW4gUGFja2FnZUluZm8gb2YgIiArIFBLRywKKyAgICAgICAgICAgICAgICBwaS5zaWduaW5nSW5mbyk7CisgICAgICAgIGFzc2VydEZhbHNlKCJNdWx0aXBsZSBzaWduaW5nIGNlcnRpZmljYXRlcyBmb3VuZCBpbiBzaWduaW5nIGNlcnRpZmljYXRlIGhpc3RvcnkgZm9yICIgKyBQS0csCisgICAgICAgICAgICAgICAgcGkuc2lnbmluZ0luZm8uaGFzTXVsdGlwbGVTaWduZXJzKCkpOworICAgICAgICBTaWduYXR1cmVbXSBzaWduaW5nSGlzdG9yeSA9IHBpLnNpZ25pbmdJbmZvLmdldFNpZ25pbmdDZXJ0aWZpY2F0ZUhpc3RvcnkoKTsKKyAgICAgICAgaW50IG51bVNpZ25pbmdTZXRzID0gc2lnbmluZ0hpc3RvcnkubGVuZ3RoOworICAgICAgICBhc3NlcnRFcXVhbHMoIlBhY2thZ2VJbmZvIGZvciAiICsgUEtHICsgImNvbnRhaW5zIHRoZSB3cm9uZyBudW1iZXIgb2Ygc2lnbmluZyBjZXJ0aWZpY2F0ICIKKyAgICAgICAgICAgICAgICArICIgcm90YXRpb25zLiAgRXhwZWN0ZWQgMiAoY29ycmVzcG9uZGluZyB0byBvbmUgcm90YXRpb24pLiBGb3VuZDogIgorICAgICAgICAgICAgICAgICsgbnVtU2lnbmluZ1NldHMsIDIsIG51bVNpZ25pbmdTZXRzKTsKKyAgICAgICAgLy8gY2hlY2sgdG8gc2VlIGlmIHdlIG1hdGNoIHRoZSBjZXJ0cyBmb3Igd2hpY2ggd2UncmUgbG9va2luZworICAgICAgICBib29sZWFuIG1hdGNoZWRGaXJzdCA9IGZhbHNlOworICAgICAgICBib29sZWFuIG1hdGNoZWRTZWNvbmQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TaWduaW5nU2V0czsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgcmVwb3J0ZWRDZXJ0ID0gc2lnbmluZ0hpc3RvcnlbaV0udG9DaGFyc1N0cmluZygpOworICAgICAgICAgICAgaWYgKEZJUlNUX0NFUlRfSEVYLmVxdWFscyhyZXBvcnRlZENlcnQpKSB7CisgICAgICAgICAgICAgICAgbWF0Y2hlZEZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoU0VDT05EX0NFUlRfSEVYLmVxdWFscyhyZXBvcnRlZENlcnQpKSB7CisgICAgICAgICAgICAgICAgbWF0Y2hlZFNlY29uZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZSgiT2xkIHNpZ25pbmcgY2VydGlmaWNhdGUgbm90IGZvdW5kIGZvciAiICsgUEtHICsgIiBleHBlY3RlZCAiCisgICAgICAgICAgICAgICAgKyBGSVJTVF9DRVJUX0hFWCwgbWF0Y2hlZEZpcnN0KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiQ3VycmVudCBzaWduaW5nIGNlcnRpZmljYXRlIG5vdCBmb3VuZCBmb3IgIiArIFBLRyArICIgZXhwZWN0ZWQgIgorICAgICAgICAgICAgICAgICsgU0VDT05EX0NFUlRfSEVYLCBtYXRjaGVkU2Vjb25kKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzU2lnbmluZ0NlcnRpZmljYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IGhhc1NpZ25pbmdDZXJ0aWZpY2F0ZSgpIHJlcG9ydHMgdGhhdCBib3RoIGNlcnRpZmljYXRlcyBpbiB0aGUgc2lnbmluZworICAgICAgICAvLyBoaXN0b3J5IGFyZSBwcmVzZW50CisgICAgICAgIFBhY2thZ2VNYW5hZ2VyIHBtID0gZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgIGJ5dGVbXSBmaXJzdENlcnRCeXRlcyA9IGZyb21IZXhUb0J5dGVBcnJheShGSVJTVF9DRVJUX0hFWCk7CisgICAgICAgIGFzc2VydFRydWUoIk9sZCBzaWduaW5nIGNlcnRpZmljYXRlIG5vdCBmb3VuZCBmb3IgIiArIFBLRywKKyAgICAgICAgICAgICAgIHBtLmhhc1NpZ25pbmdDZXJ0aWZpY2F0ZShQS0csIGZpcnN0Q2VydEJ5dGVzLCBQYWNrYWdlTWFuYWdlci5DRVJUX0lOUFVUX1JBV19YNTA5KSk7CisgICAgICAgIGJ5dGVbXSBzZWNvbmRDZXJ0Qnl0ZXMgPSBmcm9tSGV4VG9CeXRlQXJyYXkoU0VDT05EX0NFUlRfSEVYKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiQ3VycmVudCBzaWduaW5nIGNlcnRpZmljYXRlIG5vdCBmb3VuZCBmb3IgIiArIFBLRywKKyAgICAgICAgICAgICAgICBwbS5oYXNTaWduaW5nQ2VydGlmaWNhdGUoUEtHLCBzZWNvbmRDZXJ0Qnl0ZXMsIFBhY2thZ2VNYW5hZ2VyLkNFUlRfSU5QVVRfUkFXX1g1MDkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzU2lnbmluZ0NlcnRpZmljYXRlU2hhMjU2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IGhhc1NpZ25pbmdDZXJ0aWZpY2F0ZSgpIHJlcG9ydHMgdGhhdCBib3RoIGNlcnRpZmljYXRlcyBpbiB0aGUgc2lnbmluZworICAgICAgICAvLyBoaXN0b3J5IGFyZSBwcmVzZW50CisgICAgICAgIFBhY2thZ2VNYW5hZ2VyIHBtID0gZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgIGJ5dGVbXSBmaXJzdENlcnRCeXRlcyA9IGNvbXB1dGVTaGEyNTZEaWdlc3RCeXRlcyhmcm9tSGV4VG9CeXRlQXJyYXkoRklSU1RfQ0VSVF9IRVgpKTsKKworICAgICAgICBhc3NlcnRUcnVlKCJPbGQgc2lnbmluZyBjZXJ0aWZpY2F0ZSBub3QgZm91bmQgZm9yICIgKyBQS0csCisgICAgICAgICAgICAgICAgcG0uaGFzU2lnbmluZ0NlcnRpZmljYXRlKFBLRywgZmlyc3RDZXJ0Qnl0ZXMsIFBhY2thZ2VNYW5hZ2VyLkNFUlRfSU5QVVRfU0hBMjU2KSk7CisgICAgICAgIGJ5dGVbXSBzZWNvbmRDZXJ0Qnl0ZXMgPSBjb21wdXRlU2hhMjU2RGlnZXN0Qnl0ZXMoZnJvbUhleFRvQnl0ZUFycmF5KFNFQ09ORF9DRVJUX0hFWCkpOworICAgICAgICBhc3NlcnRUcnVlKCJDdXJyZW50IHNpZ25pbmcgY2VydGlmaWNhdGUgbm90IGZvdW5kIGZvciAiICsgUEtHLAorICAgICAgICAgICAgICAgIHBtLmhhc1NpZ25pbmdDZXJ0aWZpY2F0ZShQS0csIHNlY29uZENlcnRCeXRlcywgUGFja2FnZU1hbmFnZXIuQ0VSVF9JTlBVVF9TSEEyNTYpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzU2lnbmluZ0NlcnRpZmljYXRlQnlVaWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgaGFzU2lnbmluZ0NlcnRpZmljYXRlKCkgcmVwb3J0cyB0aGF0IGJvdGggY2VydGlmaWNhdGVzIGluIHRoZSBzaWduaW5nCisgICAgICAgIC8vIGhpc3RvcnkgYXJlIHByZXNlbnQKKyAgICAgICAgUGFja2FnZU1hbmFnZXIgcG0gPSBnZXRDb250ZXh0KCkuZ2V0UGFja2FnZU1hbmFnZXIoKTsKKyAgICAgICAgaW50IHVpZCA9IHBtLmdldFBhY2thZ2VVaWQoUEtHLCAwKTsKKyAgICAgICAgYnl0ZVtdIGZpcnN0Q2VydEJ5dGVzID0gZnJvbUhleFRvQnl0ZUFycmF5KEZJUlNUX0NFUlRfSEVYKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiT2xkIHNpZ25pbmcgY2VydGlmaWNhdGUgbm90IGZvdW5kIGZvciAiICsgUEtHLAorICAgICAgICAgICAgICAgIHBtLmhhc1NpZ25pbmdDZXJ0aWZpY2F0ZSh1aWQsIGZpcnN0Q2VydEJ5dGVzLCBQYWNrYWdlTWFuYWdlci5DRVJUX0lOUFVUX1JBV19YNTA5KSk7CisgICAgICAgIGJ5dGVbXSBzZWNvbmRDZXJ0Qnl0ZXMgPSBmcm9tSGV4VG9CeXRlQXJyYXkoU0VDT05EX0NFUlRfSEVYKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiQ3VycmVudCBzaWduaW5nIGNlcnRpZmljYXRlIG5vdCBmb3VuZCBmb3IgIiArIFBLRywKKyAgICAgICAgICAgICAgICBwbS5oYXNTaWduaW5nQ2VydGlmaWNhdGUodWlkLCBzZWNvbmRDZXJ0Qnl0ZXMsIFBhY2thZ2VNYW5hZ2VyLkNFUlRfSU5QVVRfUkFXX1g1MDkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzU2lnbmluZ0NlcnRpZmljYXRlQnlVaWRTaGEyNTYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgaGFzU2lnbmluZ0NlcnRpZmljYXRlKCkgcmVwb3J0cyB0aGF0IGJvdGggY2VydGlmaWNhdGVzIGluIHRoZSBzaWduaW5nCisgICAgICAgIC8vIGhpc3RvcnkgYXJlIHByZXNlbnQKKyAgICAgICAgUGFja2FnZU1hbmFnZXIgcG0gPSBnZXRDb250ZXh0KCkuZ2V0UGFja2FnZU1hbmFnZXIoKTsKKyAgICAgICAgaW50IHVpZCA9IHBtLmdldFBhY2thZ2VVaWQoUEtHLCAwKTsKKyAgICAgICAgYnl0ZVtdIGZpcnN0Q2VydEJ5dGVzID0gY29tcHV0ZVNoYTI1NkRpZ2VzdEJ5dGVzKGZyb21IZXhUb0J5dGVBcnJheShGSVJTVF9DRVJUX0hFWCkpOworCisgICAgICAgIGFzc2VydFRydWUoIk9sZCBzaWduaW5nIGNlcnRpZmljYXRlIG5vdCBmb3VuZCBmb3IgIiArIFBLRywKKyAgICAgICAgICAgICAgICBwbS5oYXNTaWduaW5nQ2VydGlmaWNhdGUodWlkLCBmaXJzdENlcnRCeXRlcywgUGFja2FnZU1hbmFnZXIuQ0VSVF9JTlBVVF9TSEEyNTYpKTsKKyAgICAgICAgYnl0ZVtdIHNlY29uZENlcnRCeXRlcyA9IGNvbXB1dGVTaGEyNTZEaWdlc3RCeXRlcyhmcm9tSGV4VG9CeXRlQXJyYXkoU0VDT05EX0NFUlRfSEVYKSk7CisgICAgICAgIGFzc2VydFRydWUoIkN1cnJlbnQgc2lnbmluZyBjZXJ0aWZpY2F0ZSBub3QgZm91bmQgZm9yICIgKyBQS0csCisgICAgICAgICAgICAgICAgcG0uaGFzU2lnbmluZ0NlcnRpZmljYXRlKHVpZCwgc2Vjb25kQ2VydEJ5dGVzLCBQYWNrYWdlTWFuYWdlci5DRVJUX0lOUFVUX1NIQTI1NikpOworICAgIH0KKworICAgIHByaXZhdGUgIHN0YXRpYyBieXRlW10gZnJvbUhleFRvQnl0ZUFycmF5KFN0cmluZyBzdHIpIHsKKyAgICAgICAgaWYgKHN0ciA9PSBudWxsIHx8IHN0ci5sZW5ndGgoKSA9PSAwIHx8IHN0ci5sZW5ndGgoKSAlIDIgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBjaGFyW10gY2hhcnMgPSBzdHIudG9DaGFyQXJyYXkoKTsKKyAgICAgICAgZmluYWwgaW50IGNoYXJMZW5ndGggPSBjaGFycy5sZW5ndGg7CisgICAgICAgIGZpbmFsIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW2NoYXJMZW5ndGggLyAyXTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBieXRlc1tpXSA9CisgICAgICAgICAgICAgICAgICAgIChieXRlKSgoKGdldEluZGV4KGNoYXJzW2kgKiAyXSkgPDwgNCkgJiAweEYwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKGdldEluZGV4KGNoYXJzW2kgKiAyICsgMV0pICYgMHgwRikpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBieXRlczsKKyAgICB9CisKKyAgICAvLyBjb3B5IG9mIEJ5dGVTdHJpbmdVdGlscyAtIGxvd2VyY2FzZSB2ZXJzaW9uICh0byBtYXRjaCBpbnB1dHMpCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldEluZGV4KGNoYXIgYykgeworICAgICAgICBmaW5hbCBjaGFyW10gSEVYX0FSUkFZID0gIjAxMjM0NTY3ODlhYmNkZWYiLnRvQ2hhckFycmF5KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgSEVYX0FSUkFZLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoSEVYX0FSUkFZW2ldID09IGMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGNvbXB1dGVTaGEyNTZEaWdlc3RCeXRlcyhieXRlW10gZGF0YSkgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CisgICAgICAgIE1lc3NhZ2VEaWdlc3QgbWVzc2FnZURpZ2VzdCA9IE1lc3NhZ2VEaWdlc3QuZ2V0SW5zdGFuY2UoIlNIQTI1NiIpOworICAgICAgICBtZXNzYWdlRGlnZXN0LnVwZGF0ZShkYXRhKTsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VEaWdlc3QuZGlnZXN0KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvV3JpdGVFeHRlcm5hbFN0b3JhZ2VBcHAvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1dyaXRlRXh0ZXJuYWxTdG9yYWdlQXBwL0FuZHJvaWQubWsKaW5kZXggODU3NGQ2My4uOWFkYjYwYiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvV3JpdGVFeHRlcm5hbFN0b3JhZ2VBcHAvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Xcml0ZUV4dGVybmFsU3RvcmFnZUFwcC9BbmRyb2lkLm1rCkBAIC0xOSw5ICsxOSwxMCBAQAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKIExPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCi0JYW5kcm9pZC1zdXBwb3J0LXRlc3QgXAotCWNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwgXAotCWxlZ2FjeS1hbmRyb2lkLXRlc3QKKwlhbmRyb2lkeC50ZXN0LnJ1bGVzIFwKKwljb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dAorCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzIGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykgXAogICAgIC4uL0V4dGVybmFsU3RvcmFnZUFwcC9zcmMvY29tL2FuZHJvaWQvY3RzL2V4dGVybmFsc3RvcmFnZWFwcC9Db21tb25FeHRlcm5hbFN0b3JhZ2VUZXN0LmphdmEKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1dyaXRlRXh0ZXJuYWxTdG9yYWdlQXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Xcml0ZUV4dGVybmFsU3RvcmFnZUFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDM3ZTM5ZTkuLjQ3ZmI4YzEgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1dyaXRlRXh0ZXJuYWxTdG9yYWdlQXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvV3JpdGVFeHRlcm5hbFN0b3JhZ2VBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjAsNyArMjAsNyBAQAogICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KICAgICA8L2FwcGxpY2F0aW9uPgogCi0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5jdHMud3JpdGVleHRlcm5hbHN0b3JhZ2VhcHAiIC8+CiAKICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0VYVEVSTkFMX1NUT1JBR0UiIC8+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Xcml0ZUV4dGVybmFsU3RvcmFnZUFwcC9zcmMvY29tL2FuZHJvaWQvY3RzL3dyaXRlZXh0ZXJuYWxzdG9yYWdlYXBwL1dyaXRlRXh0ZXJuYWxTdG9yYWdlVGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvV3JpdGVFeHRlcm5hbFN0b3JhZ2VBcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy93cml0ZWV4dGVybmFsc3RvcmFnZWFwcC9Xcml0ZUV4dGVybmFsU3RvcmFnZVRlc3QuamF2YQppbmRleCA4MWNmN2IzLi4yODM0Y2JhIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Xcml0ZUV4dGVybmFsU3RvcmFnZUFwcC9zcmMvY29tL2FuZHJvaWQvY3RzL3dyaXRlZXh0ZXJuYWxzdG9yYWdlYXBwL1dyaXRlRXh0ZXJuYWxTdG9yYWdlVGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1dyaXRlRXh0ZXJuYWxTdG9yYWdlQXBwL3NyYy9jb20vYW5kcm9pZC9jdHMvd3JpdGVleHRlcm5hbHN0b3JhZ2VhcHAvV3JpdGVFeHRlcm5hbFN0b3JhZ2VUZXN0LmphdmEKQEAgLTg3LDExICs4NywxNSBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RXcml0ZUV4dGVybmFsU3RvcmFnZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBsb25nIHRlc3RWYWx1ZSA9IDEyMzQ1MDAwOwogICAgICAgICBhc3NlcnRFeHRlcm5hbFN0b3JhZ2VNb3VudGVkKCk7CiAKICAgICAgICAgLy8gV3JpdGUgYSB2YWx1ZSBhbmQgbWFrZSBzdXJlIHdlIGNhbiByZWFkIGl0IGJhY2sKICAgICAgICAgd3JpdGVJbnQoVEVTVF9GSUxFLCAzMik7CiAgICAgICAgIGFzc2VydEVxdWFscyhyZWFkSW50KFRFU1RfRklMRSksIDMyKTsKKworICAgICAgICBhc3NlcnRUcnVlKCJNdXN0IGJlIGFibGUgdG8gc2V0IGxhc3QgbW9kaWZpZWQiLCBURVNUX0ZJTEUuc2V0TGFzdE1vZGlmaWVkKHRlc3RWYWx1ZSkpOworICAgICAgICBhc3NlcnRFcXVhbHModGVzdFZhbHVlLCBURVNUX0ZJTEUubGFzdE1vZGlmaWVkKCkpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RXcml0ZUV4dGVybmFsU3RvcmFnZURpcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTE2NCw2ICsxNjgsNyBAQAogICAgICAgICBmaW5hbCBGaWxlIG90aGVyQ2FjaGUgPSBuZXcgRmlsZShvdXJDYWNoZS5nZXRBYnNvbHV0ZVBhdGgoKQogICAgICAgICAgICAgICAgIC5yZXBsYWNlKGdldENvbnRleHQoKS5nZXRQYWNrYWdlTmFtZSgpLCBQQUNLQUdFX05PTkUpKTsKICAgICAgICAgZGVsZXRlQ29udGVudHMob3RoZXJDYWNoZSk7CisgICAgICAgIG90aGVyQ2FjaGUuZGVsZXRlKCk7CiAKICAgICAgICAgYXNzZXJ0VHJ1ZShvdGhlckNhY2hlLm1rZGlycygpKTsKICAgICAgICAgYXNzZXJ0RGlyUmVhZFdyaXRlQWNjZXNzKG90aGVyQ2FjaGUpOwpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvV3JpdGVFeHRlcm5hbFN0b3JhZ2VBcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy93cml0ZWV4dGVybmFsc3RvcmFnZWFwcC9Xcml0ZU11bHRpVmlld1Rlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL1dyaXRlRXh0ZXJuYWxTdG9yYWdlQXBwL3NyYy9jb20vYW5kcm9pZC9jdHMvd3JpdGVleHRlcm5hbHN0b3JhZ2VhcHAvV3JpdGVNdWx0aVZpZXdUZXN0LmphdmEKaW5kZXggZGIxYzcyMS4uZTQ4YzMxOSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMvV3JpdGVFeHRlcm5hbFN0b3JhZ2VBcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy93cml0ZWV4dGVybmFsc3RvcmFnZWFwcC9Xcml0ZU11bHRpVmlld1Rlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9Xcml0ZUV4dGVybmFsU3RvcmFnZUFwcC9zcmMvY29tL2FuZHJvaWQvY3RzL3dyaXRlZXh0ZXJuYWxzdG9yYWdlYXBwL1dyaXRlTXVsdGlWaWV3VGVzdC5qYXZhCkBAIC0yMSwxMCArMjEsMTEgQEAKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY3RzLmV4dGVybmFsc3RvcmFnZWFwcC5Db21tb25FeHRlcm5hbFN0b3JhZ2VUZXN0LlBBQ0tBR0VfUkVBRDsKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY3RzLmV4dGVybmFsc3RvcmFnZWFwcC5Db21tb25FeHRlcm5hbFN0b3JhZ2VUZXN0LmFzc2VydEZpbGVSZWFkV3JpdGVBY2Nlc3M7CiAKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwogaW1wb3J0IGFuZHJvaWQuc3lzdGVtLk9zOwogCiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKLQoraW1wb3J0IGFuZHJvaWQudGV4dC5mb3JtYXQuRGF0ZVV0aWxzOwogCiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIApAQCAtNjUsNiArNjYsOSBAQAogCiAgICAgICAgIE9zLnJlbmFtZShvdXJUZXN0RGlyLmdldEFic29sdXRlUGF0aCgpLCBvdGhlclRlc3REaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwogCisgICAgICAgIC8vIFNpdCBhcm91bmQgbG9uZyBlbm91Z2ggZm9yIFZGUyBjYWNoZSB0byBleHBpcmUKKyAgICAgICAgU3lzdGVtQ2xvY2suc2xlZXAoMTUgKiBEYXRlVXRpbHMuU0VDT05EX0lOX01JTExJUyk7CisKICAgICAgICAgYXNzZXJ0Tm90RXF1YWwoT3MuZ2V0dWlkKCksIE9zLnN0YXQob3RoZXJDYWNoZS5nZXRBYnNvbHV0ZVBhdGgoKSkuc3RfdWlkKTsKICAgICAgICAgYXNzZXJ0Tm90RXF1YWwoT3MuZ2V0dWlkKCksIE9zLnN0YXQob3RoZXJUZXN0RGlyLmdldEFic29sdXRlUGF0aCgpKS5zdF91aWQpOwogICAgICAgICBhc3NlcnROb3RFcXVhbChPcy5nZXR1aWQoKSwgT3Muc3RhdChhZnRlckZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpLnN0X3VpZCk7CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9rZXlzZXRzL21hbEJhZEtleS9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMva2V5c2V0cy9tYWxCYWRLZXkvQW5kcm9pZC5tawppbmRleCA0NmE2YjM3Li44ZTA1YjYzIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9rZXlzZXRzL21hbEJhZEtleS9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL2tleXNldHMvbWFsQmFkS2V5L0FuZHJvaWQubWsKQEAgLTIyLDcgKzIyLDcgQEAKIAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKIExPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLXN1cHBvcnQtdGVzdAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWR4LnRlc3QucnVsZXMKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNLZXlTZXRTaWduaW5nQUJhZFVwZ3JhZGVCCiBMT0NBTF9DRVJUSUZJQ0FURSA6PSBjdHMvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9jZXJ0cy9rZXlzZXRzL2N0cy1rZXlzZXQtdGVzdC1hCiBMT0NBTF9ERVhfUFJFT1BUIDo9IGZhbHNlCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9rZXlzZXRzL21hbE5vRGVmL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9rZXlzZXRzL21hbE5vRGVmL0FuZHJvaWQubWsKaW5kZXggOTAxOGZkYi4uYTVkYjUwMyAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMva2V5c2V0cy9tYWxOb0RlZi9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL2tleXNldHMvbWFsTm9EZWYvQW5kcm9pZC5tawpAQCAtMjIsNyArMjIsNyBAQAogCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwogTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQtc3VwcG9ydC10ZXN0CitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZHgudGVzdC5ydWxlcwogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0tleVNldFNpZ25pbmdBTm9EZWZVcGdyYWRlQgogTE9DQUxfQ0VSVElGSUNBVEUgOj0gY3RzL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvY2VydHMva2V5c2V0cy9jdHMta2V5c2V0LXRlc3QtYQogTE9DQUxfREVYX1BSRU9QVCA6PSBmYWxzZQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMva2V5c2V0cy9tYWxPbmVEZWYvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL2tleXNldHMvbWFsT25lRGVmL0FuZHJvaWQubWsKaW5kZXggOThhMzFiOS4uNGU0ZWU1YyAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMva2V5c2V0cy9tYWxPbmVEZWYvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9rZXlzZXRzL21hbE9uZURlZi9BbmRyb2lkLm1rCkBAIC0yMiw3ICsyMiw3IEBACiAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCiBMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50Ci1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC1zdXBwb3J0LXRlc3QKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkeC50ZXN0LnJ1bGVzCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzS2V5U2V0U2lnbmluZ0NCYWRBVXBncmFkZUFCCiBMT0NBTF9DRVJUSUZJQ0FURSA6PSBjdHMvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9jZXJ0cy9rZXlzZXRzL2N0cy1rZXlzZXQtdGVzdC1jCiBMT0NBTF9ERVhfUFJFT1BUIDo9IGZhbHNlCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9rZXlzZXRzL3Blcm1EZWYvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL2tleXNldHMvcGVybURlZi9BbmRyb2lkLm1rCmluZGV4IDVjZjIxYjQuLjc2Y2E1NjAgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL2tleXNldHMvcGVybURlZi9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL2tleXNldHMvcGVybURlZi9BbmRyb2lkLm1rCkBAIC0xOSw3ICsxOSw3IEBACiAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCiBMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50Ci1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC1zdXBwb3J0LXRlc3QKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkeC50ZXN0LnJ1bGVzCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzS2V5U2V0UGVybURlZlNpZ25pbmdBCiBMT0NBTF9DRVJUSUZJQ0FURSA6PSBjdHMvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9jZXJ0cy9rZXlzZXRzL2N0cy1rZXlzZXQtdGVzdC1hCiBMT0NBTF9ERVhfUFJFT1BUIDo9IGZhbHNlCkBAIC0zMyw3ICszMyw3IEBACiAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCiBMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50Ci1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC1zdXBwb3J0LXRlc3QKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkeC50ZXN0LnJ1bGVzCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzS2V5U2V0UGVybURlZlNpZ25pbmdCCiBMT0NBTF9DRVJUSUZJQ0FURSA6PSBjdHMvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9jZXJ0cy9rZXlzZXRzL2N0cy1rZXlzZXQtdGVzdC1iCiBMT0NBTF9ERVhfUFJFT1BUIDo9IGZhbHNlCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9rZXlzZXRzL3Blcm1Vc2UvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL2tleXNldHMvcGVybVVzZS9BbmRyb2lkLm1rCmluZGV4IDEwYzQxMDEuLjE5ZGJhNjEgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL2tleXNldHMvcGVybVVzZS9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL2tleXNldHMvcGVybVVzZS9BbmRyb2lkLm1rCkBAIC0xOSw3ICsxOSw3IEBACiAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCiBMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50Ci1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC1zdXBwb3J0LXRlc3QKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkeC50ZXN0LnJ1bGVzCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzS2V5U2V0UGVybVVzZVNpZ25pbmdBCiBMT0NBTF9DRVJUSUZJQ0FURSA6PSBjdHMvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9jZXJ0cy9rZXlzZXRzL2N0cy1rZXlzZXQtdGVzdC1hCiBMT0NBTF9ERVhfUFJFT1BUIDo9IGZhbHNlCkBAIC0zNCw3ICszNCw3IEBACiAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCiBMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50Ci1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC1zdXBwb3J0LXRlc3QKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkeC50ZXN0LnJ1bGVzCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzS2V5U2V0UGVybVVzZVNpZ25pbmdCCiBMT0NBTF9DRVJUSUZJQ0FURSA6PSBjdHMvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9jZXJ0cy9rZXlzZXRzL2N0cy1rZXlzZXQtdGVzdC1iCiBMT0NBTF9ERVhfUFJFT1BUIDo9IGZhbHNlCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9rZXlzZXRzL3Rlc3RBcHAvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL2tleXNldHMvdGVzdEFwcC9BbmRyb2lkLm1rCmluZGV4IDkwN2FlMzYuLmZlMjI3NzcgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL2tleXNldHMvdGVzdEFwcC9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL2tleXNldHMvdGVzdEFwcC9BbmRyb2lkLm1rCkBAIC0yMiw3ICsyMiw4IEBACiBMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQtc3VwcG9ydC10ZXN0IGxlZ2FjeS1hbmRyb2lkLXRlc3QKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkeC50ZXN0LnJ1bGVzCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicwogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0tleVNldFRlc3RBcHAKIExPQ0FMX0RFWF9QUkVPUFQgOj0gZmFsc2UKIApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMva2V5c2V0cy90ZXN0QXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9rZXlzZXRzL3Rlc3RBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCAzOGVkZjVmLi5lNGY2NTY3IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9rZXlzZXRzL3Rlc3RBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9rZXlzZXRzL3Rlc3RBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjEsNSArMjEsNSBAQAogCiAgICAgPGluc3RydW1lbnRhdGlvbgogICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5hbmRyb2lkLmN0cy5rZXlzZXRzLnRlc3RhcHAiCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIgLz4KKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiIC8+CiA8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMva2V5c2V0cy91QS9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMva2V5c2V0cy91QS9BbmRyb2lkLm1rCmluZGV4IGQ0N2Y2YmMuLmNiMDhiNDQgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL2tleXNldHMvdUEvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9rZXlzZXRzL3VBL0FuZHJvaWQubWsKQEAgLTE4LDcgKzE4LDcgQEAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKIExPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLXN1cHBvcnQtdGVzdAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWR4LnRlc3QucnVsZXMKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNLZXlTZXRTaWduaW5nQVVwZ3JhZGVBCiBMT0NBTF9DRVJUSUZJQ0FURSA6PSBjdHMvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9jZXJ0cy9rZXlzZXRzL2N0cy1rZXlzZXQtdGVzdC1hCiBMT0NBTF9ERVhfUFJFT1BUIDo9IGZhbHNlCkBAIC0zMSw3ICszMSw3IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIExPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCiBMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50Ci1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC1zdXBwb3J0LXRlc3QKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkeC50ZXN0LnJ1bGVzCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzS2V5U2V0U2lnbmluZ0JVcGdyYWRlQQogTE9DQUxfQ0VSVElGSUNBVEUgOj0gY3RzL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvY2VydHMva2V5c2V0cy9jdHMta2V5c2V0LXRlc3QtYgogTE9DQUxfREVYX1BSRU9QVCA6PSBmYWxzZQpAQCAtNDQsNyArNDQsNyBAQAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwogTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQtc3VwcG9ydC10ZXN0CitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZHgudGVzdC5ydWxlcwogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0tleVNldFNpZ25pbmdFY0FVcGdyYWRlQQogTE9DQUxfQ0VSVElGSUNBVEUgOj0gY3RzL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvY2VydHMva2V5c2V0cy9jdHMta2V5c2V0LXRlc3QtZWMtYQogTE9DQUxfREVYX1BSRU9QVCA6PSBmYWxzZQpAQCAtNTcsNyArNTcsNyBAQAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwogTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQtc3VwcG9ydC10ZXN0CitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZHgudGVzdC5ydWxlcwogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0tleVNldFNpZ25pbmdBQW5kQlVwZ3JhZGVBCiBMT0NBTF9DRVJUSUZJQ0FURSA6PSBjdHMvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9jZXJ0cy9rZXlzZXRzL2N0cy1rZXlzZXQtdGVzdC1hCiBMT0NBTF9BRERJVElPTkFMX0NFUlRJRklDQVRFUyA6PSBjdHMvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9jZXJ0cy9rZXlzZXRzL2N0cy1rZXlzZXQtdGVzdC1iCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9rZXlzZXRzL3VBQi9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMva2V5c2V0cy91QUIvQW5kcm9pZC5tawppbmRleCA4NzY1NWRkLi4zZGQ0NzQ3IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9rZXlzZXRzL3VBQi9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL2tleXNldHMvdUFCL0FuZHJvaWQubWsKQEAgLTIyLDcgKzIyLDcgQEAKIAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKIExPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLXN1cHBvcnQtdGVzdAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWR4LnRlc3QucnVsZXMKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNLZXlTZXRTaWduaW5nQVVwZ3JhZGVBQW5kQgogTE9DQUxfQ0VSVElGSUNBVEUgOj0gY3RzL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvY2VydHMva2V5c2V0cy9jdHMta2V5c2V0LXRlc3QtYQogTE9DQUxfREVYX1BSRU9QVCA6PSBmYWxzZQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMva2V5c2V0cy91QXVCL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9rZXlzZXRzL3VBdUIvQW5kcm9pZC5tawppbmRleCA3NjQ4ODZhLi43NTk4YzViIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9rZXlzZXRzL3VBdUIvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9rZXlzZXRzL3VBdUIvQW5kcm9pZC5tawpAQCAtMjIsNyArMjIsNyBAQAogCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwogTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQtc3VwcG9ydC10ZXN0CitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZHgudGVzdC5ydWxlcwogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0tleVNldFNpZ25pbmdBVXBncmFkZUFPckIKIExPQ0FMX0NFUlRJRklDQVRFIDo9IGN0cy9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L2NlcnRzL2tleXNldHMvY3RzLWtleXNldC10ZXN0LWEKIExPQ0FMX0RFWF9QUkVPUFQgOj0gZmFsc2UKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL2tleXNldHMvdUIvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL2tleXNldHMvdUIvQW5kcm9pZC5tawppbmRleCBkMDk2MGM0Li44MmVmYzJjIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9rZXlzZXRzL3VCL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMva2V5c2V0cy91Qi9BbmRyb2lkLm1rCkBAIC0xOSw3ICsxOSw3IEBACiAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCiBMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50Ci1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC1zdXBwb3J0LXRlc3QKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkeC50ZXN0LnJ1bGVzCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzS2V5U2V0U2lnbmluZ0FVcGdyYWRlQgogTE9DQUxfQ0VSVElGSUNBVEUgOj0gY3RzL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvY2VydHMva2V5c2V0cy9jdHMta2V5c2V0LXRlc3QtYQogTE9DQUxfREVYX1BSRU9QVCA6PSBmYWxzZQpAQCAtMzQsNyArMzQsNyBAQAogCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwogTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQtc3VwcG9ydC10ZXN0CitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZHgudGVzdC5ydWxlcwogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0tleVNldFNpZ25pbmdCVXBncmFkZUIKIExPQ0FMX0NFUlRJRklDQVRFIDo9IGN0cy9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L2NlcnRzL2tleXNldHMvY3RzLWtleXNldC10ZXN0LWIKIExPQ0FMX0RFWF9QUkVPUFQgOj0gZmFsc2UKQEAgLTQ5LDcgKzQ5LDcgQEAKIAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKIExPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLXN1cHBvcnQtdGVzdAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWR4LnRlc3QucnVsZXMKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNLZXlTZXRTaWduaW5nQUFuZENVcGdyYWRlQgogTE9DQUxfQ0VSVElGSUNBVEUgOj0gY3RzL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvY2VydHMva2V5c2V0cy9jdHMta2V5c2V0LXRlc3QtYQogTE9DQUxfQURESVRJT05BTF9DRVJUSUZJQ0FURVMgOj0gY3RzL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvY2VydHMva2V5c2V0cy9jdHMta2V5c2V0LXRlc3QtYwpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMva2V5c2V0cy91QnNoYXJlZFVzZXIvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL2tleXNldHMvdUJzaGFyZWRVc2VyL0FuZHJvaWQubWsKaW5kZXggYzZjZWMxMy4uYzY1NjM3ZiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMva2V5c2V0cy91QnNoYXJlZFVzZXIvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9rZXlzZXRzL3VCc2hhcmVkVXNlci9BbmRyb2lkLm1rCkBAIC0xOSw3ICsxOSw3IEBACiAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCiBMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50Ci1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC1zdXBwb3J0LXRlc3QKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkeC50ZXN0LnJ1bGVzCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzS2V5U2V0U2hhcmVkVXNlclNpZ25pbmdBVXBncmFkZUIKIExPQ0FMX0NFUlRJRklDQVRFIDo9IGN0cy9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L2NlcnRzL2tleXNldHMvY3RzLWtleXNldC10ZXN0LWEKIExPQ0FMX0RFWF9QUkVPUFQgOj0gZmFsc2UKQEAgLTM0LDcgKzM0LDcgQEAKIAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKIExPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLXN1cHBvcnQtdGVzdAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWR4LnRlc3QucnVsZXMKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNLZXlTZXRTaGFyZWRVc2VyU2lnbmluZ0JVcGdyYWRlQgogTE9DQUxfQ0VSVElGSUNBVEUgOj0gY3RzL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvY2VydHMva2V5c2V0cy9jdHMta2V5c2V0LXRlc3QtYgogTE9DQUxfREVYX1BSRU9QVCA6PSBmYWxzZQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMva2V5c2V0cy91RWNBL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9rZXlzZXRzL3VFY0EvQW5kcm9pZC5tawppbmRleCBlN2RlMDE5Li5lN2M5YjZkIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9rZXlzZXRzL3VFY0EvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9rZXlzZXRzL3VFY0EvQW5kcm9pZC5tawpAQCAtMjIsNyArMjIsNyBAQAogCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwogTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQtc3VwcG9ydC10ZXN0CitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZHgudGVzdC5ydWxlcwogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0tleVNldFNpZ25pbmdBVXBncmFkZUVjQQogTE9DQUxfQ0VSVElGSUNBVEUgOj0gY3RzL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvY2VydHMva2V5c2V0cy9jdHMta2V5c2V0LXRlc3QtYQogTE9DQUxfREVYX1BSRU9QVCA6PSBmYWxzZQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMva2V5c2V0cy91Tm9uZS9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS90ZXN0LWFwcHMva2V5c2V0cy91Tm9uZS9BbmRyb2lkLm1rCmluZGV4IGQ1NGE1OWIuLmU2YzgzMGIgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvdGVzdC1hcHBzL2tleXNldHMvdU5vbmUvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L3Rlc3QtYXBwcy9rZXlzZXRzL3VOb25lL0FuZHJvaWQubWsKQEAgLTIyLDcgKzIyLDcgQEAKIAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKIExPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLXN1cHBvcnQtdGVzdAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWR4LnRlc3QucnVsZXMKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNLZXlTZXRTaWduaW5nQVVwZ3JhZGVOb25lCiBMT0NBTF9DRVJUSUZJQ0FURSA6PSBjdHMvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9jZXJ0cy9rZXlzZXRzL2N0cy1rZXlzZXQtdGVzdC1hCiBMT0NBTF9ERVhfUFJFT1BUIDo9IGZhbHNlCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2F0cmFjZS9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9hdHJhY2UvQW5kcm9pZC5tawppbmRleCA1OWQ1ZTU2Li4wYzg0MTM0IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2F0cmFjZS9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvYXRyYWNlL0FuZHJvaWQubWsKQEAgLTIxLDEzICsyMSwxNiBAQAogIyBNdXN0IG1hdGNoIHRoZSBwYWNrYWdlIG5hbWUgaW4gQ3RzVGVzdENhc2VMaXN0Lm1rCiBMT0NBTF9NT0RVTEUgOj0gQ3RzQXRyYWNlSG9zdFRlc3RDYXNlcwogCi1MT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBjdHMtdHJhZGVmZWQgdHJhZGVmZWQgY29tcGF0aWJpbGl0eS1ob3N0LXV0aWwKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGN0cy10cmFkZWZlZCB0cmFkZWZlZAogCiBMT0NBTF9DVFNfVEVTVF9QQUNLQUdFIDo9IGFuZHJvaWQuaG9zdC5hdHJhY2UKIAogIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAogTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKIAorIyBFbmZvcmNlIHB1YmxpYyAvIHRlc3QgYXBpIG9ubHkKK0xPQ0FMX1NES19WRVJTSU9OIDo9IHRlc3RfY3VycmVudAorCiBpbmNsdWRlICQoQlVJTERfQ1RTX0hPU1RfSkFWQV9MSUJSQVJZKQogCiBpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2F0cmFjZS9BbmRyb2lkVGVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2F0cmFjZS9BbmRyb2lkVGVzdC54bWwKaW5kZXggODI2MjIzMi4uZWNhYTE3YSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hdHJhY2UvQW5kcm9pZFRlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvYXRyYWNlL0FuZHJvaWRUZXN0LnhtbApAQCAtMTQsNiArMTQsNyBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIGF0cmFjZSBob3N0IHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJ1aXRvb2xraXQiIC8+CiAgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRlc3R0eXBlLkphckhvc3RUZXN0IiA+CiAgICAgICAgIDxvcHRpb24gbmFtZT0iamFyIiB2YWx1ZT0iQ3RzQXRyYWNlSG9zdFRlc3RDYXNlcy5qYXIiIC8+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2F0cmFjZS9BdHJhY2VUZXN0QXBwL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2F0cmFjZS9BdHJhY2VUZXN0QXBwL0FuZHJvaWQubWsKaW5kZXggNGI1NTBkYi4uMzNlMDc3MyAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9hdHJhY2UvQXRyYWNlVGVzdEFwcC9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvYXRyYWNlL0F0cmFjZVRlc3RBcHAvQW5kcm9pZC5tawpAQCAtMjEsNyArMjEsNyBAQAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogCiBMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50Ci1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC1zdXBwb3J0LXRlc3QKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkeC50ZXN0LnJ1bGVzCiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNBdHJhY2VUZXN0QXBwCiAKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYXRyYWNlL3NyYy9hbmRyb2lkL2F0cmFjZS9jdHMvQXRyYWNlSG9zdFRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvYXRyYWNlL3NyYy9hbmRyb2lkL2F0cmFjZS9jdHMvQXRyYWNlSG9zdFRlc3QuamF2YQppbmRleCA4MDJhZmZiLi4zYzYwODdjIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2F0cmFjZS9zcmMvYW5kcm9pZC9hdHJhY2UvY3RzL0F0cmFjZUhvc3RUZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9hdHJhY2Uvc3JjL2FuZHJvaWQvYXRyYWNlL2N0cy9BdHJhY2VIb3N0VGVzdC5qYXZhCkBAIC0yNCw4ICsyNCw2IEBACiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuRGV2aWNlVGVzdENhc2U7CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSUJ1aWxkUmVjZWl2ZXI7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNkZFRlc3Q7Ci0KIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLlJlYWRlcjsKQEAgLTE0NSw3ICsxNDMsNiBAQAogICAgICAgICAgICAgInZpZGVvIiwKICAgICAgICAgICAgICJjYW1lcmEiLAogICAgICAgICAgICAgImhhbCIsCi0gICAgICAgICAgICAiYXBwIiwKICAgICAgICAgICAgICJyZXMiLAogICAgICAgICAgICAgImRhbHZpayIsCiAgICAgICAgICAgICAicnMiLApAQCAtMTU2LDcgKzE1Myw2IEBACiAgICAgLyoqCiAgICAgICogVGVzdHMgdGhhdCBhdHJhY2UgZXhpc3RzIGFuZCBpcyBydW5uYWJsZSB3aXRoIG5vIGFyZ3MKICAgICAgKi8KLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iNi4xL0MtMC05IikKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlUnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZyBvdXRwdXQgPSBnZXREZXZpY2UoKS5leGVjdXRlU2hlbGxDb21tYW5kKCJhdHJhY2UiKTsKICAgICAgICAgU3RyaW5nW10gbGluZXMgPSBvdXRwdXQuc3BsaXQoIlxccj9cXG4iKTsKQEAgLTE3Miw3ICsxNjgsNiBAQAogICAgIC8qKgogICAgICAqIFRlc3RzIHRoZSBvdXRwdXQgb2YgImF0cmFjZSAtLWxpc3RfY2F0ZWdvcmllcyIgdG8gZW5zdXJlIHJlcXVpcmVkIGNhdGVnb3JpZXMgZXhpc3QuCiAgICAgICovCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjYuMS9DLTAtOSIpCiAgICAgcHVibGljIHZvaWQgdGVzdENhdGVnb3JpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIG91dHB1dCA9IGdldERldmljZSgpLmV4ZWN1dGVTaGVsbENvbW1hbmQoImF0cmFjZSAtLWxpc3RfY2F0ZWdvcmllcyIpOwogICAgICAgICBTdHJpbmdbXSBjYXRlZ29yaWVzID0gb3V0cHV0LnNwbGl0KCJcXHI/XFxuIik7CkBAIC0xOTksNyArMTk0LDYgQEAKICAgICAvKioKICAgICAgKiBUZXN0cyB0aGF0IGF0cmFjZSBjYXB0dXJlcyBhcHAgbGF1bmNoLCBpbmNsdWRpbmcgYXBwIGxldmVsIHRyYWNpbmcKICAgICAgKi8KLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iNi4xL0MtMC05IikKICAgICBwdWJsaWMgdm9pZCB0ZXN0VHJhY2luZ0NvbnRlbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIGF0cmFjZU91dHB1dCA9IG51bGw7CiAgICAgICAgIHRyeSB7CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2JhY2t1cC9BbGxvd0JhY2t1cC9CYWNrdXBBbGxvd2VkQXBwL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2JhY2t1cC9BbGxvd0JhY2t1cC9CYWNrdXBBbGxvd2VkQXBwL0FuZHJvaWQubWsKaW5kZXggYWE5YTIyYy4uYmNkYjI1NiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9iYWNrdXAvQWxsb3dCYWNrdXAvQmFja3VwQWxsb3dlZEFwcC9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvYmFja3VwL0FsbG93QmFja3VwL0JhY2t1cEFsbG93ZWRBcHAvQW5kcm9pZC5tawpAQCAtMjUsNyArMjUsNyBAQAogCiBMT0NBTF9QUk9HVUFSRF9FTkFCTEVEIDo9IGRpc2FibGVkCiAKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLXN1cHBvcnQtdGVzdAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWR4LnRlc3QucnVsZXMKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgLi4vc3JjKQogCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2JhY2t1cC9BbGxvd0JhY2t1cC9CYWNrdXBBbGxvd2VkQXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2JhY2t1cC9BbGxvd0JhY2t1cC9CYWNrdXBBbGxvd2VkQXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggZDRkZTAxZC4uYzc5Yjg3YyAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9iYWNrdXAvQWxsb3dCYWNrdXAvQmFja3VwQWxsb3dlZEFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvYmFja3VwL0FsbG93QmFja3VwL0JhY2t1cEFsbG93ZWRBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjMsNyArMjMsNyBAQAogICAgIDwvYXBwbGljYXRpb24+CiAKICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5jdHMuYmFja3VwLmJhY2t1cG5vdGFsbG93ZWRhcHAiIC8+CiAKIDwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2JhY2t1cC9BbGxvd0JhY2t1cC9CYWNrdXBOb3RBbGxvd2VkQXBwL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2JhY2t1cC9BbGxvd0JhY2t1cC9CYWNrdXBOb3RBbGxvd2VkQXBwL0FuZHJvaWQubWsKaW5kZXggYzIxOGEyOC4uYTJhMDQwYyAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9iYWNrdXAvQWxsb3dCYWNrdXAvQmFja3VwTm90QWxsb3dlZEFwcC9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvYmFja3VwL0FsbG93QmFja3VwL0JhY2t1cE5vdEFsbG93ZWRBcHAvQW5kcm9pZC5tawpAQCAtMjUsNyArMjUsNyBAQAogCiBMT0NBTF9QUk9HVUFSRF9FTkFCTEVEIDo9IGRpc2FibGVkCiAKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLXN1cHBvcnQtdGVzdAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWR4LnRlc3QucnVsZXMKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgLi4vc3JjKQogCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2JhY2t1cC9BbGxvd0JhY2t1cC9CYWNrdXBOb3RBbGxvd2VkQXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2JhY2t1cC9BbGxvd0JhY2t1cC9CYWNrdXBOb3RBbGxvd2VkQXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggNWZjNzFhMS4uNTdlZmU3YyAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9iYWNrdXAvQWxsb3dCYWNrdXAvQmFja3VwTm90QWxsb3dlZEFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvYmFja3VwL0FsbG93QmFja3VwL0JhY2t1cE5vdEFsbG93ZWRBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjQsNyArMjQsNyBAQAogICAgIDwvYXBwbGljYXRpb24+CiAKICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5jdHMuYmFja3VwLmJhY2t1cG5vdGFsbG93ZWRhcHAiIC8+CiAKIDwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2JhY2t1cC9BbGxvd0JhY2t1cC9zcmMvQWxsb3dCYWNrdXBUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2JhY2t1cC9BbGxvd0JhY2t1cC9zcmMvQWxsb3dCYWNrdXBUZXN0LmphdmEKaW5kZXggNjQzYjU5NC4uZjBjMzRkNSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9iYWNrdXAvQWxsb3dCYWNrdXAvc3JjL0FsbG93QmFja3VwVGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvYmFja3VwL0FsbG93QmFja3VwL3NyYy9BbGxvd0JhY2t1cFRlc3QuamF2YQpAQCAtMTYsMTUgKzE2LDE2IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5jdHMuYmFja3VwLmJhY2t1cG5vdGFsbG93ZWRhcHA7CiAKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0VGFyZ2V0Q29udGV4dDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRUYXJnZXRDb250ZXh0OwogCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2JhY2t1cC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9iYWNrdXAvQW5kcm9pZC5tawppbmRleCAxZmFlYzU5Li5mZDViM2M2IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2JhY2t1cC9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvYmFja3VwL0FuZHJvaWQubWsKQEAgLTIxLDcgKzIxLDcgQEAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCiAKICMgdGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGFyY3RzIGN0cyB2dHMgZ2VuZXJhbC10ZXN0cwogCiBMT0NBTF9NT0RVTEUgOj0gQ3RzQmFja3VwSG9zdFRlc3RDYXNlcwogCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2JhY2t1cC9BbmRyb2lkVGVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2JhY2t1cC9BbmRyb2lkVGVzdC54bWwKaW5kZXggMzE0YTkyZTMuLmI3OGNkMDcgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYmFja3VwL0FuZHJvaWRUZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2JhY2t1cC9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDcgKzE0LDExIEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgQmFja3VwIGhvc3QgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImJhY2t1cCIgLz4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlN3aXRjaFVzZXJUYXJnZXRQcmVwYXJlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0idXNlci10eXBlIiB2YWx1ZT0ic3lzdGVtIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJDdHNGdWxsYmFja3VwQXBwLmFwayIgLz4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYmFja3VwL0Z1bGxCYWNrdXBPbmx5L0Z1bGxCYWNrdXBPbmx5RmFsc2VOb0FnZW50QXBwL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2JhY2t1cC9GdWxsQmFja3VwT25seS9GdWxsQmFja3VwT25seUZhbHNlTm9BZ2VudEFwcC9BbmRyb2lkLm1rCmluZGV4IDYxNTVmZmIuLmIyZWMyM2QgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYmFja3VwL0Z1bGxCYWNrdXBPbmx5L0Z1bGxCYWNrdXBPbmx5RmFsc2VOb0FnZW50QXBwL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9iYWNrdXAvRnVsbEJhY2t1cE9ubHkvRnVsbEJhY2t1cE9ubHlGYWxzZU5vQWdlbnRBcHAvQW5kcm9pZC5tawpAQCAtMjUsNyArMjUsNyBAQAogCiBMT0NBTF9QUk9HVUFSRF9FTkFCTEVEIDo9IGRpc2FibGVkCiAKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLXN1cHBvcnQtdGVzdAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWR4LnRlc3QucnVsZXMKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgLi4vc3JjKQogCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2JhY2t1cC9GdWxsQmFja3VwT25seS9GdWxsQmFja3VwT25seUZhbHNlTm9BZ2VudEFwcC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9iYWNrdXAvRnVsbEJhY2t1cE9ubHkvRnVsbEJhY2t1cE9ubHlGYWxzZU5vQWdlbnRBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBjMDA2NzFmLi5iNGIxY2FlIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2JhY2t1cC9GdWxsQmFja3VwT25seS9GdWxsQmFja3VwT25seUZhbHNlTm9BZ2VudEFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvYmFja3VwL0Z1bGxCYWNrdXBPbmx5L0Z1bGxCYWNrdXBPbmx5RmFsc2VOb0FnZW50QXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTI1LDcgKzI1LDcgQEAKICAgICA8L2FwcGxpY2F0aW9uPgogCiAgICAgPGluc3RydW1lbnRhdGlvbgotICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuY3RzLmJhY2t1cC5mdWxsYmFja3Vwb25seWFwcCIgLz4KIAogPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYmFja3VwL0Z1bGxCYWNrdXBPbmx5L0Z1bGxCYWNrdXBPbmx5RmFsc2VXaXRoQWdlbnRBcHAvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvYmFja3VwL0Z1bGxCYWNrdXBPbmx5L0Z1bGxCYWNrdXBPbmx5RmFsc2VXaXRoQWdlbnRBcHAvQW5kcm9pZC5tawppbmRleCA2MmI5ODYwLi5lYWVhZmU4IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2JhY2t1cC9GdWxsQmFja3VwT25seS9GdWxsQmFja3VwT25seUZhbHNlV2l0aEFnZW50QXBwL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9iYWNrdXAvRnVsbEJhY2t1cE9ubHkvRnVsbEJhY2t1cE9ubHlGYWxzZVdpdGhBZ2VudEFwcC9BbmRyb2lkLm1rCkBAIC0yNSw3ICsyNSw3IEBACiAKIExPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKIAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQtc3VwcG9ydC10ZXN0CitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZHgudGVzdC5ydWxlcwogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCAuLi9zcmMpCiAKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYmFja3VwL0Z1bGxCYWNrdXBPbmx5L0Z1bGxCYWNrdXBPbmx5RmFsc2VXaXRoQWdlbnRBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvYmFja3VwL0Z1bGxCYWNrdXBPbmx5L0Z1bGxCYWNrdXBPbmx5RmFsc2VXaXRoQWdlbnRBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCAwMzU1NWQ0Li5kMDBhOTg0IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2JhY2t1cC9GdWxsQmFja3VwT25seS9GdWxsQmFja3VwT25seUZhbHNlV2l0aEFnZW50QXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9iYWNrdXAvRnVsbEJhY2t1cE9ubHkvRnVsbEJhY2t1cE9ubHlGYWxzZVdpdGhBZ2VudEFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yNiw3ICsyNiw3IEBACiAgICAgPC9hcHBsaWNhdGlvbj4KIAogICAgIDxpbnN0cnVtZW50YXRpb24KLSAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmN0cy5iYWNrdXAuZnVsbGJhY2t1cG9ubHlhcHAiIC8+CiAKIDwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2JhY2t1cC9GdWxsQmFja3VwT25seS9GdWxsQmFja3VwT25seVRydWVXaXRoQWdlbnRBcHAvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvYmFja3VwL0Z1bGxCYWNrdXBPbmx5L0Z1bGxCYWNrdXBPbmx5VHJ1ZVdpdGhBZ2VudEFwcC9BbmRyb2lkLm1rCmluZGV4IDgyNTdlYTcuLjg5ZDE2ZTggMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYmFja3VwL0Z1bGxCYWNrdXBPbmx5L0Z1bGxCYWNrdXBPbmx5VHJ1ZVdpdGhBZ2VudEFwcC9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvYmFja3VwL0Z1bGxCYWNrdXBPbmx5L0Z1bGxCYWNrdXBPbmx5VHJ1ZVdpdGhBZ2VudEFwcC9BbmRyb2lkLm1rCkBAIC0yNSw3ICsyNSw3IEBACiAKIExPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKIAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQtc3VwcG9ydC10ZXN0CitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZHgudGVzdC5ydWxlcwogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCAuLi9zcmMpCiAKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYmFja3VwL0Z1bGxCYWNrdXBPbmx5L0Z1bGxCYWNrdXBPbmx5VHJ1ZVdpdGhBZ2VudEFwcC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9iYWNrdXAvRnVsbEJhY2t1cE9ubHkvRnVsbEJhY2t1cE9ubHlUcnVlV2l0aEFnZW50QXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggOWI5MDU5Mi4uMDRkM2EzZjcgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYmFja3VwL0Z1bGxCYWNrdXBPbmx5L0Z1bGxCYWNrdXBPbmx5VHJ1ZVdpdGhBZ2VudEFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvYmFja3VwL0Z1bGxCYWNrdXBPbmx5L0Z1bGxCYWNrdXBPbmx5VHJ1ZVdpdGhBZ2VudEFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yNyw3ICsyNyw3IEBACiAgICAgPC9hcHBsaWNhdGlvbj4KIAogICAgIDxpbnN0cnVtZW50YXRpb24KLSAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmN0cy5iYWNrdXAuZnVsbGJhY2t1cG9ubHlhcHAiIC8+CiAKIDwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2JhY2t1cC9GdWxsQmFja3VwT25seS9zcmMvRnVsbEJhY2t1cE9ubHlUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2JhY2t1cC9GdWxsQmFja3VwT25seS9zcmMvRnVsbEJhY2t1cE9ubHlUZXN0LmphdmEKaW5kZXggMTdhN2UyYy4uYmFmZDg3ZiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9iYWNrdXAvRnVsbEJhY2t1cE9ubHkvc3JjL0Z1bGxCYWNrdXBPbmx5VGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvYmFja3VwL0Z1bGxCYWNrdXBPbmx5L3NyYy9GdWxsQmFja3VwT25seVRlc3QuamF2YQpAQCAtMTYsMTUgKzE2LDE2IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5jdHMuYmFja3VwLmZ1bGxiYWNrdXBvbmx5YXBwOwogCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldFRhcmdldENvbnRleHQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0VGFyZ2V0Q29udGV4dDsKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9iYWNrdXAvS2V5VmFsdWVBcHAvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvYmFja3VwL0tleVZhbHVlQXBwL0FuZHJvaWQubWsKaW5kZXggZDAzZjg1Zi4uNzY3MWRjZiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9iYWNrdXAvS2V5VmFsdWVBcHAvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL2JhY2t1cC9LZXlWYWx1ZUFwcC9BbmRyb2lkLm1rCkBAIC0yNSw3ICsyNSw3IEBACiAKIExPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKIAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQtc3VwcG9ydC10ZXN0CitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZHgudGVzdC5ydWxlcwogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYmFja3VwL0tleVZhbHVlQXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2JhY2t1cC9LZXlWYWx1ZUFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGNjYTkxYTUuLjI2MmQ3Y2MgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYmFja3VwL0tleVZhbHVlQXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9iYWNrdXAvS2V5VmFsdWVBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjYsNyArMjYsNyBAQAogICAgIDwvYXBwbGljYXRpb24+CiAKICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5jdHMuYmFja3VwLmtleXZhbHVlcmVzdG9yZWFwcCIgLz4KIAogPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYmFja3VwL0tleVZhbHVlQXBwL3NyYy9hbmRyb2lkL2N0cy9iYWNrdXAva2V5dmFsdWVyZXN0b3JlYXBwL0tleVZhbHVlQmFja3VwUmVzdG9yZVRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvYmFja3VwL0tleVZhbHVlQXBwL3NyYy9hbmRyb2lkL2N0cy9iYWNrdXAva2V5dmFsdWVyZXN0b3JlYXBwL0tleVZhbHVlQmFja3VwUmVzdG9yZVRlc3QuamF2YQppbmRleCA3NmYzZGUyLi5hNmQ4MjVhIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2JhY2t1cC9LZXlWYWx1ZUFwcC9zcmMvYW5kcm9pZC9jdHMvYmFja3VwL2tleXZhbHVlcmVzdG9yZWFwcC9LZXlWYWx1ZUJhY2t1cFJlc3RvcmVUZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9iYWNrdXAvS2V5VmFsdWVBcHAvc3JjL2FuZHJvaWQvY3RzL2JhY2t1cC9rZXl2YWx1ZXJlc3RvcmVhcHAvS2V5VmFsdWVCYWNrdXBSZXN0b3JlVGVzdC5qYXZhCkBAIC0xNyw3ICsxNyw4IEBACiBwYWNrYWdlIGFuZHJvaWQuY3RzLmJhY2t1cC5rZXl2YWx1ZXJlc3RvcmVhcHA7CiAKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LkNvbnRleHQuTU9ERV9QUklWQVRFOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRUYXJnZXRDb250ZXh0OworCitpbXBvcnQgc3RhdGljIGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0VGFyZ2V0Q29udGV4dDsKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwpAQCAtMzAsOSArMzEsMTAgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkFmdGVyOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CkBAIC0xNDAsNyArMTQyLDggQEAKICAgICAgICAgbVNoYXJlZFByZWZUZXN0U3VjY2VzcyA9IGZhbHNlOwogICAgICAgICBtU2hhcmVkUHJlZkFjdGl2aXR5SW50ZW50ID0gbmV3IEludGVudCgpCiAgICAgICAgICAgICAgICAgLnNldENsYXNzTmFtZShTSEFSRURfUFJFRkVSRU5DRVNfUkVTVE9SRV9QQUNLQUdFX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICBTSEFSRURfUFJFRkVSRU5DRVNfUkVTVE9SRV9BQ1RJVklUWV9OQU1FKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNIQVJFRF9QUkVGRVJFTkNFU19SRVNUT1JFX0FDVElWSVRZX05BTUUpCisgICAgICAgICAgICAgICAgLmFkZEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLKTsKICAgICAgICAgbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtU2hhcmVkUHJlZmVuY2VzUmVjZWl2ZXIsIG5ldyBJbnRlbnRGaWx0ZXIoUkVTVUxUX0FDVElPTikpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9iYWNrdXAvUmVzdG9yZUFueVZlcnNpb24vTmV3VmVyc2lvbkFwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9iYWNrdXAvUmVzdG9yZUFueVZlcnNpb24vTmV3VmVyc2lvbkFwcC9BbmRyb2lkLm1rCmluZGV4IDBhMGVmYmEuLmM1YmIxMGEgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYmFja3VwL1Jlc3RvcmVBbnlWZXJzaW9uL05ld1ZlcnNpb25BcHAvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL2JhY2t1cC9SZXN0b3JlQW55VmVyc2lvbi9OZXdWZXJzaW9uQXBwL0FuZHJvaWQubWsKQEAgLTI1LDcgKzI1LDcgQEAKIAogTE9DQUxfUFJPR1VBUkRfRU5BQkxFRCA6PSBkaXNhYmxlZAogCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC1zdXBwb3J0LXRlc3QKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkeC50ZXN0LnJ1bGVzCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIC4uL3NyYykKIApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9iYWNrdXAvUmVzdG9yZUFueVZlcnNpb24vTmV3VmVyc2lvbkFwcC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9iYWNrdXAvUmVzdG9yZUFueVZlcnNpb24vTmV3VmVyc2lvbkFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGM5Mjg0YmEuLmYyNjQzMWYgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYmFja3VwL1Jlc3RvcmVBbnlWZXJzaW9uL05ld1ZlcnNpb25BcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2JhY2t1cC9SZXN0b3JlQW55VmVyc2lvbi9OZXdWZXJzaW9uQXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTI3LDcgKzI3LDcgQEAKICAgICA8L2FwcGxpY2F0aW9uPgogCiAgICAgPGluc3RydW1lbnRhdGlvbgotICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuY3RzLmJhY2t1cC5yZXN0b3JlYW55dmVyc2lvbmFwcCIgLz4KIAogPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYmFja3VwL1Jlc3RvcmVBbnlWZXJzaW9uL05vUmVzdG9yZUFueVZlcnNpb25BcHAvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvYmFja3VwL1Jlc3RvcmVBbnlWZXJzaW9uL05vUmVzdG9yZUFueVZlcnNpb25BcHAvQW5kcm9pZC5tawppbmRleCA5NGQ5Mzc2Li44YjBlZWVkIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2JhY2t1cC9SZXN0b3JlQW55VmVyc2lvbi9Ob1Jlc3RvcmVBbnlWZXJzaW9uQXBwL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9iYWNrdXAvUmVzdG9yZUFueVZlcnNpb24vTm9SZXN0b3JlQW55VmVyc2lvbkFwcC9BbmRyb2lkLm1rCkBAIC0yNSw3ICsyNSw3IEBACiAKIExPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKIAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQtc3VwcG9ydC10ZXN0CitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZHgudGVzdC5ydWxlcwogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCAuLi9zcmMpCiAKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYmFja3VwL1Jlc3RvcmVBbnlWZXJzaW9uL05vUmVzdG9yZUFueVZlcnNpb25BcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvYmFja3VwL1Jlc3RvcmVBbnlWZXJzaW9uL05vUmVzdG9yZUFueVZlcnNpb25BcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCAwZDA1Yjk5Li42Zjk5ZjEwIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2JhY2t1cC9SZXN0b3JlQW55VmVyc2lvbi9Ob1Jlc3RvcmVBbnlWZXJzaW9uQXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9iYWNrdXAvUmVzdG9yZUFueVZlcnNpb24vTm9SZXN0b3JlQW55VmVyc2lvbkFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yNyw3ICsyNyw3IEBACiAgICAgPC9hcHBsaWNhdGlvbj4KIAogICAgIDxpbnN0cnVtZW50YXRpb24KLSAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmN0cy5iYWNrdXAucmVzdG9yZWFueXZlcnNpb25hcHAiIC8+CiAKIDwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2JhY2t1cC9SZXN0b3JlQW55VmVyc2lvbi9SZXN0b3JlQW55VmVyc2lvbkFwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9iYWNrdXAvUmVzdG9yZUFueVZlcnNpb24vUmVzdG9yZUFueVZlcnNpb25BcHAvQW5kcm9pZC5tawppbmRleCA4MTY1MmE3Li4wNzI4NTM1IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2JhY2t1cC9SZXN0b3JlQW55VmVyc2lvbi9SZXN0b3JlQW55VmVyc2lvbkFwcC9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvYmFja3VwL1Jlc3RvcmVBbnlWZXJzaW9uL1Jlc3RvcmVBbnlWZXJzaW9uQXBwL0FuZHJvaWQubWsKQEAgLTI1LDcgKzI1LDcgQEAKIAogTE9DQUxfUFJPR1VBUkRfRU5BQkxFRCA6PSBkaXNhYmxlZAogCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC1zdXBwb3J0LXRlc3QKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkeC50ZXN0LnJ1bGVzCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIC4uL3NyYykKIApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9iYWNrdXAvUmVzdG9yZUFueVZlcnNpb24vUmVzdG9yZUFueVZlcnNpb25BcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvYmFja3VwL1Jlc3RvcmVBbnlWZXJzaW9uL1Jlc3RvcmVBbnlWZXJzaW9uQXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggNTdmZGYxZi4uYTRhNWU5YyAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9iYWNrdXAvUmVzdG9yZUFueVZlcnNpb24vUmVzdG9yZUFueVZlcnNpb25BcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2JhY2t1cC9SZXN0b3JlQW55VmVyc2lvbi9SZXN0b3JlQW55VmVyc2lvbkFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yOCw3ICsyOCw3IEBACiAgICAgPC9hcHBsaWNhdGlvbj4KIAogICAgIDxpbnN0cnVtZW50YXRpb24KLSAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmN0cy5iYWNrdXAucmVzdG9yZWFueXZlcnNpb25hcHAiIC8+CiAKIDwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2JhY2t1cC9SZXN0b3JlQW55VmVyc2lvbi9zcmMvUmVzdG9yZUFueVZlcnNpb25UZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2JhY2t1cC9SZXN0b3JlQW55VmVyc2lvbi9zcmMvUmVzdG9yZUFueVZlcnNpb25UZXN0LmphdmEKaW5kZXggMWRiZGIwNS4uMzY0NjI0NyAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9iYWNrdXAvUmVzdG9yZUFueVZlcnNpb24vc3JjL1Jlc3RvcmVBbnlWZXJzaW9uVGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvYmFja3VwL1Jlc3RvcmVBbnlWZXJzaW9uL3NyYy9SZXN0b3JlQW55VmVyc2lvblRlc3QuamF2YQpAQCAtMTcsMjggKzE3LDI0IEBACiBwYWNrYWdlIGFuZHJvaWQuY3RzLmJhY2t1cC5yZXN0b3JlYW55dmVyc2lvbmFwcDsKIAogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dC5NT0RFX1BSSVZBVEU7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldFRhcmdldENvbnRleHQ7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRUYXJnZXRDb250ZXh0OwogCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZUluZm87CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLk5hbWVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7Ci0KIC8qKgogICogRGV2aWNlIHNpZGUgcm91dGluZXMgdG8gYmUgaW52b2tlZCBieSB0aGUgaG9zdCBzaWRlIFJlc3RvcmVBbnlWZXJzaW9uSG9zdFNpZGVUZXN0LiBUaGVzZQogICogYXJlIG5vdCBkZXNpZ25lZCB0byBiZSBjYWxsZWQgaW4gYW55IG90aGVyIHdheSwgYXMgdGhleSByZWx5IG9uIHN0YXRlIHNldCB1cCBieSB0aGUgaG9zdCBzaWRlCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2JhY2t1cC9TaGFyZWRQcmVmZXJlbmNlc1Jlc3RvcmVBcHAvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvYmFja3VwL1NoYXJlZFByZWZlcmVuY2VzUmVzdG9yZUFwcC9BbmRyb2lkLm1rCmluZGV4IDRlNGYwYmUuLjE5NjY0MTQgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYmFja3VwL1NoYXJlZFByZWZlcmVuY2VzUmVzdG9yZUFwcC9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvYmFja3VwL1NoYXJlZFByZWZlcmVuY2VzUmVzdG9yZUFwcC9BbmRyb2lkLm1rCkBAIC0yNSw3ICsyNSw3IEBACiAKIExPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKIAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQtc3VwcG9ydC10ZXN0CitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZHgudGVzdC5ydWxlcwogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYmFja3VwL1NoYXJlZFByZWZlcmVuY2VzUmVzdG9yZUFwcC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9iYWNrdXAvU2hhcmVkUHJlZmVyZW5jZXNSZXN0b3JlQXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggMWNmNmRhNS4uZTJlYjdjNSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9iYWNrdXAvU2hhcmVkUHJlZmVyZW5jZXNSZXN0b3JlQXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9iYWNrdXAvU2hhcmVkUHJlZmVyZW5jZXNSZXN0b3JlQXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTM1LDcgKzM1LDcgQEAKICAgICA8L2FwcGxpY2F0aW9uPgogCiAgICAgPGluc3RydW1lbnRhdGlvbgotICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuY3RzLmJhY2t1cC5zaGFyZWRwcmVmcmVzdG9yZWFwcCIgLz4KIAogPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYmFja3VwL1N1Y2Nlc3NOb3RpZmljYXRpb25BcHAvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvYmFja3VwL1N1Y2Nlc3NOb3RpZmljYXRpb25BcHAvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmRiMTNkCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9iYWNrdXAvU3VjY2Vzc05vdGlmaWNhdGlvbkFwcC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzkgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworIyBEb24ndCBpbmNsdWRlIHRoaXMgcGFja2FnZSBpbiBhbnkgdGFyZ2V0CitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworIyBXaGVuIGJ1aWx0LCBleHBsaWNpdGx5IHB1dCBpdCBpbiB0aGUgZGF0YSBwYXJ0aXRpb24uCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQorCitMT0NBTF9ERVhfUFJFT1BUIDo9IGZhbHNlCisKK0xPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKKworTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWR4LnRlc3QucnVsZXMKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQorCisjIHRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0CitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0JhY2t1cFN1Y2Nlc3NOb3RpZmljYXRpb25BcHAKKworTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYmFja3VwL1N1Y2Nlc3NOb3RpZmljYXRpb25BcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvYmFja3VwL1N1Y2Nlc3NOb3RpZmljYXRpb25BcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDdiMGUxCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9iYWNrdXAvU3VjY2Vzc05vdGlmaWNhdGlvbkFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgIH4gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAgfgorICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgfgorICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIH4KKyAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAgLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iYW5kcm9pZC5jdHMuYmFja3VwLnN1Y2Nlc3Nub3RpZmljYXRpb25hcHAiPgorCisgICAgPGFwcGxpY2F0aW9uPgorICAgICAgICA8cmVjZWl2ZXIgYW5kcm9pZDpuYW1lPSIuU3VjY2Vzc05vdGlmaWNhdGlvblJlY2VpdmVyIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uQkFDS1VQX0ZJTklTSEVEIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L3JlY2VpdmVyPgorICAgIDwvYXBwbGljYXRpb24+CisKKyAgICA8aW5zdHJ1bWVudGF0aW9uCisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuY3RzLmJhY2t1cC5zdWNjZXNzbm90aWZpY2F0aW9uYXBwIiAvPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYmFja3VwL1N1Y2Nlc3NOb3RpZmljYXRpb25BcHAvc3JjL2FuZHJvaWQvY3RzL2JhY2t1cC9zdWNjZXNzbm90aWZpY2F0aW9uYXBwL1N1Y2Nlc3NOb3RpZmljYXRpb25SZWNlaXZlci5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9iYWNrdXAvU3VjY2Vzc05vdGlmaWNhdGlvbkFwcC9zcmMvYW5kcm9pZC9jdHMvYmFja3VwL3N1Y2Nlc3Nub3RpZmljYXRpb25hcHAvU3VjY2Vzc05vdGlmaWNhdGlvblJlY2VpdmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEyMjE1MQotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvYmFja3VwL1N1Y2Nlc3NOb3RpZmljYXRpb25BcHAvc3JjL2FuZHJvaWQvY3RzL2JhY2t1cC9zdWNjZXNzbm90aWZpY2F0aW9uYXBwL1N1Y2Nlc3NOb3RpZmljYXRpb25SZWNlaXZlci5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5jdHMuYmFja3VwLnN1Y2Nlc3Nub3RpZmljYXRpb25hcHA7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKKworcHVibGljIGNsYXNzIFN1Y2Nlc3NOb3RpZmljYXRpb25SZWNlaXZlciBleHRlbmRzIEJyb2FkY2FzdFJlY2VpdmVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFDS1VQX0ZJTklTSEVEX0FDVElPTiA9ICJhbmRyb2lkLmludGVudC5hY3Rpb24uQkFDS1VQX0ZJTklTSEVEIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFDS1VQX0ZJTklTSEVEX1BBQ0tBR0VfRVhUUkEgPSAicGFja2FnZU5hbWUiOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICBpZiAoIUJBQ0tVUF9GSU5JU0hFRF9BQ1RJT04uZXF1YWxzKGludGVudC5nZXRBY3Rpb24oKSkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBTdHJpbmcgcGFja2FnZU5hbWUgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoQkFDS1VQX0ZJTklTSEVEX1BBQ0tBR0VfRVhUUkEpOworICAgICAgICBpZiAocGFja2FnZU5hbWUgPT0gbnVsbCB8fCBwYWNrYWdlTmFtZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBjb250ZXh0LmdldFNoYXJlZFByZWZlcmVuY2VzKFN1Y2Nlc3NOb3RpZmljYXRpb25UZXN0LlBSRUZTX0ZJTEUsIENvbnRleHQuTU9ERV9QUklWQVRFKQorICAgICAgICAgICAgICAgIC5lZGl0KCkucHV0Qm9vbGVhbihwYWNrYWdlTmFtZSwgdHJ1ZSkuY29tbWl0KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9iYWNrdXAvU3VjY2Vzc05vdGlmaWNhdGlvbkFwcC9zcmMvYW5kcm9pZC9jdHMvYmFja3VwL3N1Y2Nlc3Nub3RpZmljYXRpb25hcHAvU3VjY2Vzc05vdGlmaWNhdGlvblRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvYmFja3VwL1N1Y2Nlc3NOb3RpZmljYXRpb25BcHAvc3JjL2FuZHJvaWQvY3RzL2JhY2t1cC9zdWNjZXNzbm90aWZpY2F0aW9uYXBwL1N1Y2Nlc3NOb3RpZmljYXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZjOTM1YwotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvYmFja3VwL1N1Y2Nlc3NOb3RpZmljYXRpb25BcHAvc3JjL2FuZHJvaWQvY3RzL2JhY2t1cC9zdWNjZXNzbm90aWZpY2F0aW9uYXBwL1N1Y2Nlc3NOb3RpZmljYXRpb25UZXN0LmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmN0cy5iYWNrdXAuc3VjY2Vzc25vdGlmaWNhdGlvbmFwcDsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldFRhcmdldENvbnRleHQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworCitAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIFN1Y2Nlc3NOb3RpZmljYXRpb25UZXN0IHsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGU19GSUxFID0gImFuZHJvaWQuY3RzLmJhY2t1cC5zdWNjZXNzbm90aWZpY2F0aW9uYXBwLlBSRUZTIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1ZBTFVFX1JFU1RPUkVfQVBQX1BBQ0tBR0UgPQorICAgICAgICAgICAgImFuZHJvaWQuY3RzLmJhY2t1cC5rZXl2YWx1ZXJlc3RvcmVhcHAiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGVUxMQkFDS1VQT05MWV9BUFBfUEFDS0FHRSA9ICJhbmRyb2lkLmN0cy5iYWNrdXAuZnVsbGJhY2t1cG9ubHlhcHAiOworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBjbGVhckJhY2t1cFN1Y2Nlc3NOb3RpZmljYXRpb25zUmVjZWl2ZWQoKSB7CisgICAgICAgIGdldFRhcmdldENvbnRleHQoKS5nZXRTaGFyZWRQcmVmZXJlbmNlcyhQUkVGU19GSUxFLCBDb250ZXh0Lk1PREVfUFJJVkFURSkuZWRpdCgpLmNsZWFyKCkKKyAgICAgICAgICAgICAgICAuY29tbWl0KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB2ZXJpZnlCYWNrdXBTdWNjZXNzTm90aWZpY2F0aW9uUmVjZWl2ZWRGb3JLZXlWYWx1ZUFwcCgpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShnZXRUYXJnZXRDb250ZXh0KCkuZ2V0U2hhcmVkUHJlZmVyZW5jZXMoUFJFRlNfRklMRSwgQ29udGV4dC5NT0RFX1BSSVZBVEUpCisgICAgICAgICAgICAgICAgLmdldEJvb2xlYW4oS0VZX1ZBTFVFX1JFU1RPUkVfQVBQX1BBQ0tBR0UsIGZhbHNlKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB2ZXJpZnlCYWNrdXBTdWNjZXNzTm90aWZpY2F0aW9uUmVjZWl2ZWRGb3JGdWxsQmFja3VwQXBwKCkgeworICAgICAgICBhc3NlcnRUcnVlKGdldFRhcmdldENvbnRleHQoKS5nZXRTaGFyZWRQcmVmZXJlbmNlcyhQUkVGU19GSUxFLCBDb250ZXh0Lk1PREVfUFJJVkFURSkKKyAgICAgICAgICAgICAgICAuZ2V0Qm9vbGVhbihGVUxMQkFDS1VQT05MWV9BUFBfUEFDS0FHRSwgZmFsc2UpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2JhY2t1cC9mdWxsYmFja3VwYXBwL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2JhY2t1cC9mdWxsYmFja3VwYXBwL0FuZHJvaWQubWsKaW5kZXggOTZmOTAzMi4uOTFjNmQ1ZSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9iYWNrdXAvZnVsbGJhY2t1cGFwcC9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvYmFja3VwL2Z1bGxiYWNrdXBhcHAvQW5kcm9pZC5tawpAQCAtMjUsMTIgKzI1LDEyIEBACiAKIExPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKIAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQtc3VwcG9ydC10ZXN0CitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZHgudGVzdC5ydWxlcwogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKICMgdGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGFyY3RzIGN0cyB2dHMgZ2VuZXJhbC10ZXN0cwogCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzRnVsbGJhY2t1cEFwcAogCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2JhY2t1cC9mdWxsYmFja3VwYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2JhY2t1cC9mdWxsYmFja3VwYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggNThmOTMwNi4uNmFiM2Y2OCAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9iYWNrdXAvZnVsbGJhY2t1cGFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvYmFja3VwL2Z1bGxiYWNrdXBhcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjIsNyArMjIsNyBAQAogICAgIDwvYXBwbGljYXRpb24+CiAKICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5jdHMuYmFja3VwLmZ1bGxiYWNrdXBhcHAiIC8+CiAKIDwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2JhY2t1cC9mdWxsYmFja3VwYXBwL3NyYy9hbmRyb2lkL2N0cy9iYWNrdXAvZnVsbGJhY2t1cGFwcC9GdWxsYmFja3VwVGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9iYWNrdXAvZnVsbGJhY2t1cGFwcC9zcmMvYW5kcm9pZC9jdHMvYmFja3VwL2Z1bGxiYWNrdXBhcHAvRnVsbGJhY2t1cFRlc3QuamF2YQppbmRleCBlZTQ5Yjg3Li5mYzA3YWQ2IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2JhY2t1cC9mdWxsYmFja3VwYXBwL3NyYy9hbmRyb2lkL2N0cy9iYWNrdXAvZnVsbGJhY2t1cGFwcC9GdWxsYmFja3VwVGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvYmFja3VwL2Z1bGxiYWNrdXBhcHAvc3JjL2FuZHJvaWQvY3RzL2JhY2t1cC9mdWxsYmFja3VwYXBwL0Z1bGxiYWNrdXBUZXN0LmphdmEKQEAgLTE2LDE1ICsxNiwxNiBAQAogCiBwYWNrYWdlIGFuZHJvaWQuY3RzLmJhY2t1cC5mdWxsYmFja3VwYXBwOwogCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldFRhcmdldENvbnRleHQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0VGFyZ2V0Q29udGV4dDsKIAotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2JhY2t1cC9pbmNsdWRlZXhjbHVkZWFwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9iYWNrdXAvaW5jbHVkZWV4Y2x1ZGVhcHAvQW5kcm9pZC5tawppbmRleCBhNmQyNThlLi4wOGRkYmQ4IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2JhY2t1cC9pbmNsdWRlZXhjbHVkZWFwcC9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvYmFja3VwL2luY2x1ZGVleGNsdWRlYXBwL0FuZHJvaWQubWsKQEAgLTI1LDEyICsyNSwxMiBAQAogCiBMT0NBTF9QUk9HVUFSRF9FTkFCTEVEIDo9IGRpc2FibGVkCiAKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLXN1cHBvcnQtdGVzdAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWR4LnRlc3QucnVsZXMKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogCiAjIHRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0Ci1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBhcmN0cyBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKIAogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0luY2x1ZGVFeGNsdWRlQXBwCiAKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYmFja3VwL2luY2x1ZGVleGNsdWRlYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2JhY2t1cC9pbmNsdWRlZXhjbHVkZWFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDM3MjZlY2EuLjAzNjczOTcgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYmFja3VwL2luY2x1ZGVleGNsdWRlYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9iYWNrdXAvaW5jbHVkZWV4Y2x1ZGVhcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjMsNyArMjMsNyBAQAogICAgIDwvYXBwbGljYXRpb24+CiAKICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5jdHMuYmFja3VwLmluY2x1ZGVleGNsdWRlYXBwIiAvPgogCiA8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9iYWNrdXAvaW5jbHVkZWV4Y2x1ZGVhcHAvcmVzL3htbC9teV9iYWNrdXBfcnVsZXMueG1sIGIvaG9zdHNpZGV0ZXN0cy9iYWNrdXAvaW5jbHVkZWV4Y2x1ZGVhcHAvcmVzL3htbC9teV9iYWNrdXBfcnVsZXMueG1sCmluZGV4IGRjYTUxZjUuLjBjZGJlYTkgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvYmFja3VwL2luY2x1ZGVleGNsdWRlYXBwL3Jlcy94bWwvbXlfYmFja3VwX3J1bGVzLnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2JhY2t1cC9pbmNsdWRlZXhjbHVkZWFwcC9yZXMveG1sL215X2JhY2t1cF9ydWxlcy54bWwKQEAgLTEwLDQgKzEwLDUgQEAKICAgICA8ZXhjbHVkZSBkb21haW49ImV4dGVybmFsIiBwYXRoPSJleGNsdWRlX2ZvbGRlciIvPgogICAgIDxpbmNsdWRlIGRvbWFpbj0icm9vdCIgcGF0aD0iZmlsZV90b19pbmNsdWRlIi8+CiAgICAgPGV4Y2x1ZGUgZG9tYWluPSJyb290IiBwYXRoPSJmaWxlX3RvX2V4Y2x1ZGUiLz4KKyAgICA8aW5jbHVkZSBkb21haW49InJvb3QiIHJlcXVpcmVGbGFncz0iZmFrZUNsaWVudFNpZGVFbmNyeXB0aW9uIiBwYXRoPSJmYWtlX2VuY3J5cHRpb25fZmlsZSIgLz4KIDwvZnVsbC1iYWNrdXAtY29udGVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2JhY2t1cC9pbmNsdWRlZXhjbHVkZWFwcC9zcmMvYW5kcm9pZC9jdHMvYmFja3VwL2luY2x1ZGVleGNsdWRlYXBwL0luY2x1ZGVFeGNsdWRlVGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9iYWNrdXAvaW5jbHVkZWV4Y2x1ZGVhcHAvc3JjL2FuZHJvaWQvY3RzL2JhY2t1cC9pbmNsdWRlZXhjbHVkZWFwcC9JbmNsdWRlRXhjbHVkZVRlc3QuamF2YQppbmRleCA4M2I5MzJiLi5mNDZlM2YyIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2JhY2t1cC9pbmNsdWRlZXhjbHVkZWFwcC9zcmMvYW5kcm9pZC9jdHMvYmFja3VwL2luY2x1ZGVleGNsdWRlYXBwL0luY2x1ZGVFeGNsdWRlVGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvYmFja3VwL2luY2x1ZGVleGNsdWRlYXBwL3NyYy9hbmRyb2lkL2N0cy9iYWNrdXAvaW5jbHVkZWV4Y2x1ZGVhcHAvSW5jbHVkZUV4Y2x1ZGVUZXN0LmphdmEKQEAgLTE2LDE2ICsxNiwxNyBAQAogCiBwYWNrYWdlIGFuZHJvaWQuY3RzLmJhY2t1cC5pbmNsdWRlZXhjbHVkZWFwcDsKIAotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRUYXJnZXRDb250ZXh0OworaW1wb3J0IHN0YXRpYyBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldFRhcmdldENvbnRleHQ7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXM7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKQEAgLTU2LDYgKzU3LDcgQEAKIAogICAgIHByaXZhdGUgTGlzdDxGaWxlPiBtSW5jbHVkZUZpbGVzOwogICAgIHByaXZhdGUgTGlzdDxGaWxlPiBtRXhjbHVkZUZpbGVzOworICAgIHByaXZhdGUgTGlzdDxGaWxlPiBtUmVxdWlyZUZha2VDbGllbnRTaWRlRW5jcnlwdGlvbkZpbGVzOwogCiAgICAgcHJpdmF0ZSBTaGFyZWRQcmVmZXJlbmNlcyBtSW5jbHVkZVNoYXJlZFByZWY7CiAgICAgcHJpdmF0ZSBTaGFyZWRQcmVmZXJlbmNlcyBtRXhjbHVkZVNoYXJlZFByZWY7CkBAIC02OCwxMCArNzAsMTEgQEAKIAogICAgIHByaXZhdGUgdm9pZCBzZXR1cEZpbGVzKCkgewogCi0gICAgICAgIC8vIFdlIGFkZCBhbGwgdGhlIGZpbGVzIHdlIGV4cGVjdCB0byBiZSBiYWNrZWQgdXAgYWNjb3JpbmcgdG8gcmVzL215X2JhY2t1cF9ydWxlcy54bWwgdG8KKyAgICAgICAgLy8gV2UgYWRkIGFsbCB0aGUgZmlsZXMgd2UgZXhwZWN0IHRvIGJlIGJhY2tlZCB1cCBhY2NvcmRpbmcgdG8gcmVzL215X2JhY2t1cF9ydWxlcy54bWwgdG8KICAgICAgICAgLy8gdGhlIG1JbmNsdWRlRmlsZXMgbGlzdCwgYW5kIGFsbCBmaWxlcyBleHBlY3RlZCBub3QgdG8gYmUgdG8gbUV4Y2x1ZGVGaWxlcy4KLSAgICAgICAgbUluY2x1ZGVGaWxlcyA9IG5ldyBBcnJheUxpc3Q8RmlsZT4oKTsKLSAgICAgICAgbUV4Y2x1ZGVGaWxlcyA9IG5ldyBBcnJheUxpc3Q8RmlsZT4oKTsKKyAgICAgICAgbUluY2x1ZGVGaWxlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBtRXhjbHVkZUZpbGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIG1SZXF1aXJlRmFrZUNsaWVudFNpZGVFbmNyeXB0aW9uRmlsZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAogICAgICAgICAvLyBGaWxlcyBpbiB0aGUgbm9ybWFsIGZpbGVzIGRpcmVjdG9yeS4KICAgICAgICAgRmlsZSBmaWxlc0RpciA9IG1Db250ZXh0LmdldEZpbGVzRGlyKCk7CkBAIC05NCw2ICs5Nyw3IEBACiAgICAgICAgIEZpbGUgcm9vdERpciA9IG1Db250ZXh0LmdldERhdGFEaXIoKTsKICAgICAgICAgbUluY2x1ZGVGaWxlcy5hZGQobmV3IEZpbGUocm9vdERpciwgImZpbGVfdG9faW5jbHVkZSIpKTsKICAgICAgICAgbUV4Y2x1ZGVGaWxlcy5hZGQobmV3IEZpbGUocm9vdERpciwgImZpbGVfdG9fZXhjbHVkZSIpKTsKKyAgICAgICAgbVJlcXVpcmVGYWtlQ2xpZW50U2lkZUVuY3J5cHRpb25GaWxlcy5hZGQobmV3IEZpbGUocm9vdERpciwgImZha2VfZW5jcnlwdGlvbl9maWxlIikpOwogCiAgICAgICAgIC8vIFNldCB1cCBTaGFyZWRQcmVmZXJlbmNlcwogICAgICAgICBtSW5jbHVkZVNoYXJlZFByZWYgPQpAQCAtMTQ0LDYgKzE0OCwxNiBAQAogICAgICAgICBjaGVja0V4Y2x1ZGVTaGFyZWRQcmVmRG9Ob3RFeGlzdCgpOwogICAgIH0KIAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgY2hlY2tSZXN0b3JlZENsaWVudFNpZGVFbmNyeXB0aW9uRmlsZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgY2hlY2tSZXF1aXJlRmFrZUNsaWVudFNpZGVFbmNyeXB0aW9uRmlsZXNEb0V4aXN0KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBjaGVja0RpZE5vdFJlc3RvcmVDbGllbnRTaWRlRW5jcnlwdGlvbkZpbGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGNoZWNrUmVxdWlyZUZha2VDbGllbnRTaWRlRW5jcnlwdGlvbkZpbGVzRG9Ob3RFeGlzdCgpOworICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZUZpbGVzKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgLy8gQWRkIGRhdGEgdG8gYWxsIHRoZSBmaWxlcyB3ZSBjcmVhdGVkCkBAIC0xNTMsNiArMTY3LDkgQEAKICAgICAgICAgICAgIGZvciAoRmlsZSBmaWxlIDogbUV4Y2x1ZGVGaWxlcykgewogICAgICAgICAgICAgICAgIGFkZERhdGEoZmlsZSk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKEZpbGUgZmlsZSA6IG1SZXF1aXJlRmFrZUNsaWVudFNpZGVFbmNyeXB0aW9uRmlsZXMpIHsKKyAgICAgICAgICAgICAgICBhZGREYXRhKGZpbGUpOworICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBmYWlsKCJVbmFibGUgdG8gZ2VuZXJhdGUgZmlsZXM6ICIgKyBlKTsKICAgICAgICAgfQpAQCAtMTY1LDYgKzE4Miw5IEBACiAgICAgICAgIGZvciAoRmlsZSBmaWxlIDogbUV4Y2x1ZGVGaWxlcykgewogICAgICAgICAgICAgZmlsZS5kZWxldGUoKTsKICAgICAgICAgfQorICAgICAgICBmb3IgKEZpbGUgZmlsZSA6IG1SZXF1aXJlRmFrZUNsaWVudFNpZGVFbmNyeXB0aW9uRmlsZXMpIHsKKyAgICAgICAgICAgIGZpbGUuZGVsZXRlKCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgYWRkRGF0YShGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC0xODUsNiArMjA1LDkgQEAKICAgICAgICAgZm9yIChGaWxlIGZpbGU6IG1FeGNsdWRlRmlsZXMpIHsKICAgICAgICAgICAgIGFzc2VydFRydWUoIkZpbGUgZGlkIHVuZXhwZWN0ZWRseSBub3QgZXhpc3Q6ICIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpLCBmaWxlLmV4aXN0cygpKTsKICAgICAgICAgfQorICAgICAgICBmb3IgKEZpbGUgZmlsZSA6IG1SZXF1aXJlRmFrZUNsaWVudFNpZGVFbmNyeXB0aW9uRmlsZXMpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkZpbGUgZGlkIHVuZXhwZWN0ZWRseSBub3QgZXhpc3Q6ICIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpLCBmaWxlLmV4aXN0cygpKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBjaGVja05vRmlsZXNFeGlzdCgpIHsKQEAgLTE5NCw2ICsyMTcsOSBAQAogICAgICAgICBmb3IgKEZpbGUgZmlsZTogbUV4Y2x1ZGVGaWxlcykgewogICAgICAgICAgICAgYXNzZXJ0RmFsc2UoIkZpbGUgZGlkIHVuZXhwZWN0ZWRseSBleGlzdDogIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGZpbGUuZXhpc3RzKCkpOwogICAgICAgICB9CisgICAgICAgIGZvciAoRmlsZSBmaWxlIDogbVJlcXVpcmVGYWtlQ2xpZW50U2lkZUVuY3J5cHRpb25GaWxlcykgeworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoIkZpbGUgZGlkIHVuZXhwZWN0ZWRseSBleGlzdDogIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGZpbGUuZXhpc3RzKCkpOworICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGNoZWNrRXhjbHVkZUZpbGVzRG9Ob3RFeGlzdCgpIHsKQEAgLTIxMCw2ICsyMzYsMjAgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBjaGVja1JlcXVpcmVGYWtlQ2xpZW50U2lkZUVuY3J5cHRpb25GaWxlc0RvRXhpc3QoKSB7CisgICAgICAgIGZvciAoRmlsZSBmaWxlOiBtUmVxdWlyZUZha2VDbGllbnRTaWRlRW5jcnlwdGlvbkZpbGVzKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJGaWxlIGV4cGVjdGVkIHRvIGJlIHJlc3RvcmVkIGRpZCBub3QgZXhpc3Q6ICIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpLAorICAgICAgICAgICAgICAgICAgICBmaWxlLmV4aXN0cygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja1JlcXVpcmVGYWtlQ2xpZW50U2lkZUVuY3J5cHRpb25GaWxlc0RvTm90RXhpc3QoKSB7CisgICAgICAgIGZvciAoRmlsZSBmaWxlOiBtUmVxdWlyZUZha2VDbGllbnRTaWRlRW5jcnlwdGlvbkZpbGVzKSB7CisgICAgICAgICAgICBhc3NlcnRGYWxzZSgiRmlsZSBleHBlY3RlZCBub3QgdG8gYmUgcmVzdG9yZWQgZGlkIGV4aXN0OiAiICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgZmlsZS5leGlzdHMoKSk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVTaGFyZWRQcmVmcygpIHsKICAgICAgICAgU2hhcmVkUHJlZmVyZW5jZXMuRWRpdG9yIGVkaXRvciA9IG1JbmNsdWRlU2hhcmVkUHJlZi5lZGl0KCk7CiAgICAgICAgIGVkaXRvci5wdXRJbnQoU0hBUkVEX1BSRUZfS0VZMSwgU0hBUkVEX1BSRUZfVkFMVUUxKTsKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYmFja3VwL3NyYy9hbmRyb2lkL2N0cy9iYWNrdXAvQWxsb3dCYWNrdXBIb3N0U2lkZVRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvYmFja3VwL3NyYy9hbmRyb2lkL2N0cy9iYWNrdXAvQWxsb3dCYWNrdXBIb3N0U2lkZVRlc3QuamF2YQppbmRleCA0ZjQ2OTM2Li43MzM3M2QzIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2JhY2t1cC9zcmMvYW5kcm9pZC9jdHMvYmFja3VwL0FsbG93QmFja3VwSG9zdFNpZGVUZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9iYWNrdXAvc3JjL2FuZHJvaWQvY3RzL2JhY2t1cC9BbGxvd0JhY2t1cEhvc3RTaWRlVGVzdC5qYXZhCkBAIC0xNiw3ICsxNiw3IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5jdHMuYmFja3VwOwogCi1pbXBvcnQgc3RhdGljIGp1bml0LmZyYW1ld29yay5Bc3NlcnQuYXNzZXJ0TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwogCiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLkRldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5sb2cuTG9nVXRpbC5DTG9nOwpAQCAtNjIsNiArNjIsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTExPV0JBQ0tVUF9BUFBfQVBLID0gIkJhY2t1cEFsbG93ZWRBcHAuYXBrIjsKIAogICAgIEBBZnRlcgorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CiAKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYmFja3VwL3NyYy9hbmRyb2lkL2N0cy9iYWNrdXAvQmFzZUJhY2t1cEhvc3RTaWRlVGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9iYWNrdXAvc3JjL2FuZHJvaWQvY3RzL2JhY2t1cC9CYXNlQmFja3VwSG9zdFNpZGVUZXN0LmphdmEKaW5kZXggYWNkYjQyMy4uOWM5MzFkYSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9iYWNrdXAvc3JjL2FuZHJvaWQvY3RzL2JhY2t1cC9CYXNlQmFja3VwSG9zdFNpZGVUZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9iYWNrdXAvc3JjL2FuZHJvaWQvY3RzL2JhY2t1cC9CYXNlQmFja3VwSG9zdFNpZGVUZXN0LmphdmEKQEAgLTE2LDE1ICsxNiwxMyBAQAogCiBwYWNrYWdlIGFuZHJvaWQuY3RzLmJhY2t1cDsKIAotaW1wb3J0IHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0LmFzc2VydFRydWU7Ci0KIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3N1bWUuYXNzdW1lVHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGVzdHR5cGUuQ29tcGF0aWJpbGl0eUhvc3RUZXN0QmFzZTsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmxvZy5Mb2dVdGlsLkNMb2c7CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuRGV2aWNlSlVuaXQ0Q2xhc3NSdW5uZXI7CitpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuanVuaXQ0LkJhc2VIb3N0SlVuaXQ0VGVzdDsKIAogaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwpAQCAtMzgsMTggKzM2LDE4IEBACiAgKiBCYXNlIGNsYXNzIGZvciBDVFMgYmFja3VwL3Jlc3RvcmUgaG9zdHNpZGUgdGVzdHMKICAqLwogQFJ1bldpdGgoRGV2aWNlSlVuaXQ0Q2xhc3NSdW5uZXIuY2xhc3MpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZUJhY2t1cEhvc3RTaWRlVGVzdCBleHRlbmRzIENvbXBhdGliaWxpdHlIb3N0VGVzdEJhc2UgeworcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VCYWNrdXBIb3N0U2lkZVRlc3QgZXh0ZW5kcyBCYXNlSG9zdEpVbml0NFRlc3QgewogICAgIHByb3RlY3RlZCBib29sZWFuIG1Jc0JhY2t1cFN1cHBvcnRlZDsKIAogICAgIC8qKiBWYWx1ZSBvZiBQYWNrYWdlTWFuYWdlci5GRUFUVVJFX0JBQ0tVUCAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX0JBQ0tVUCA9ICJhbmRyb2lkLnNvZnR3YXJlLmJhY2t1cCI7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQUxfVFJBTlNQT1JUID0KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTF9UUkFOU1BPUlQgPQogICAgICAgICAgICAgImFuZHJvaWQvY29tLmFuZHJvaWQuaW50ZXJuYWwuYmFja3VwLkxvY2FsVHJhbnNwb3J0IjsKIAogICAgIEBCZWZvcmUKICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24sIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1Jc0JhY2t1cFN1cHBvcnRlZCA9IG1EZXZpY2UuaGFzRmVhdHVyZSgiZmVhdHVyZToiICsgRkVBVFVSRV9CQUNLVVApOworICAgICAgICBtSXNCYWNrdXBTdXBwb3J0ZWQgPSBnZXREZXZpY2UoKS5oYXNGZWF0dXJlKCJmZWF0dXJlOiIgKyBGRUFUVVJFX0JBQ0tVUCk7CiAgICAgICAgIGlmICghbUlzQmFja3VwU3VwcG9ydGVkKSB7CiAgICAgICAgICAgICBDTG9nLmkoImFuZHJvaWQuc29mdHdhcmUuYmFja3VwIGZlYXR1cmUgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIGRldmljZSIpOwogICAgICAgICAgICAgcmV0dXJuOwpAQCAtNzEsNyArNjksNyBAQAogICAgICAqIEV4ZWN1dGUgc2hlbGwgY29tbWFuZCAiYm1nciBiYWNrdXBub3cgPHBhY2thZ2VOYW1lPiIgYW5kIHJldHVybiBvdXRwdXQgZnJvbSB0aGlzIGNvbW1hbmQuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIFN0cmluZyBiYWNrdXBOb3coU3RyaW5nIHBhY2thZ2VOYW1lKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG1EZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZCgiYm1nciBiYWNrdXBub3cgIiArIHBhY2thZ2VOYW1lKTsKKyAgICAgICAgcmV0dXJuIGdldERldmljZSgpLmV4ZWN1dGVTaGVsbENvbW1hbmQoImJtZ3IgYmFja3Vwbm93ICIgKyBwYWNrYWdlTmFtZSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC05NiwxNCArOTQsMTQgQEAKICAgICAgKiBFeGVjdXRlIHNoZWxsIGNvbW1hbmQgImJtZ3IgcmVzdG9yZSA8cGFja2FnZU5hbWU+IiBhbmQgcmV0dXJuIG91dHB1dCBmcm9tIHRoaXMgY29tbWFuZC4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlc3RvcmUoU3RyaW5nIHBhY2thZ2VOYW1lKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG1EZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZCgiYm1nciByZXN0b3JlICIgKyBwYWNrYWdlTmFtZSk7CisgICAgICAgIHJldHVybiBnZXREZXZpY2UoKS5leGVjdXRlU2hlbGxDb21tYW5kKCJibWdyIHJlc3RvcmUgIiArIHBhY2thZ2VOYW1lKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBBdHRlbXB0cyB0byBjbGVhciB0aGUgZGV2aWNlIGxvZy4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBjbGVhckxvZ2NhdCgpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBtRGV2aWNlLmV4ZWN1dGVBZGJDb21tYW5kKCJsb2djYXQiLCAiLWMiKTsKKyAgICAgICAgZ2V0RGV2aWNlKCkuZXhlY3V0ZUFkYkNvbW1hbmQoImxvZ2NhdCIsICItYyIpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTc0LDcgKzE3Miw3IEBACiAKICAgICBwcm90ZWN0ZWQgdm9pZCBzdGFydEFjdGl2aXR5SW5QYWNrYWdlQW5kV2FpdChTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBjbGFzc05hbWUpCiAgICAgICAgICAgICB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgbURldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKFN0cmluZy5mb3JtYXQoCisgICAgICAgIGdldERldmljZSgpLmV4ZWN1dGVTaGVsbENvbW1hbmQoU3RyaW5nLmZvcm1hdCgKICAgICAgICAgICAgICAgICAiYW0gc3RhcnQgLVcgLWEgYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4gLW4gJXMvJXMuJXMiLCBwYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICBjbGFzc05hbWUpKTsKQEAgLTE4NywxOSArMTg1LDE5IEBACiAgICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIGNsZWFyQmFja3VwRGF0YUluTG9jYWxUcmFuc3BvcnQoU3RyaW5nIHBhY2thZ2VOYW1lKQogICAgICAgICAgICAgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIG1EZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZChTdHJpbmcuZm9ybWF0KCJibWdyIHdpcGUgJXMgJXMiLCBMT0NBTF9UUkFOU1BPUlQsIHBhY2thZ2VOYW1lKSk7CisgICAgICAgIGdldERldmljZSgpLmV4ZWN1dGVTaGVsbENvbW1hbmQoU3RyaW5nLmZvcm1hdCgiYm1nciB3aXBlICVzICVzIiwgTE9DQUxfVFJBTlNQT1JULCBwYWNrYWdlTmFtZSkpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIENsZWFycyBwYWNrYWdlIGRhdGEKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBjbGVhclBhY2thZ2VEYXRhKFN0cmluZyBwYWNrYWdlTmFtZSkgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIG1EZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZChTdHJpbmcuZm9ybWF0KCJwbSBjbGVhciAlcyIsIHBhY2thZ2VOYW1lKSk7CisgICAgICAgIGdldERldmljZSgpLmV4ZWN1dGVTaGVsbENvbW1hbmQoU3RyaW5nLmZvcm1hdCgicG0gY2xlYXIgJXMiLCBwYWNrYWdlTmFtZSkpOwogICAgIH0KIAotICAgIHByaXZhdGUgYm9vbGVhbiBpc0JhY2t1cEVuYWJsZWQoKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0JhY2t1cEVuYWJsZWQoKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKICAgICAgICAgYm9vbGVhbiBpc0VuYWJsZWQ7Ci0gICAgICAgIFN0cmluZyBvdXRwdXQgPSBtRGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoImJtZ3IgZW5hYmxlZCIpOworICAgICAgICBTdHJpbmcgb3V0cHV0ID0gZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZCgiYm1nciBlbmFibGVkIik7CiAgICAgICAgIFBhdHRlcm4gcGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiXkJhY2t1cCBNYW5hZ2VyIGN1cnJlbnRseSAoZW5hYmxlZHxkaXNhYmxlZCkkIik7CiAgICAgICAgIE1hdGNoZXIgbWF0Y2hlciA9IHBhdHRlcm4ubWF0Y2hlcihvdXRwdXQudHJpbSgpKTsKICAgICAgICAgaWYgKG1hdGNoZXIuZmluZCgpKSB7CkBAIC0yMTAsOCArMjA4LDggQEAKICAgICAgICAgcmV0dXJuIGlzRW5hYmxlZDsKICAgICB9CiAKLSAgICBwcml2YXRlIFN0cmluZyBnZXRDdXJyZW50VHJhbnNwb3J0KCkgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBvdXRwdXQgPSBtRGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoImJtZ3IgbGlzdCB0cmFuc3BvcnRzIik7CisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXJyZW50VHJhbnNwb3J0KCkgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBvdXRwdXQgPSBnZXREZXZpY2UoKS5leGVjdXRlU2hlbGxDb21tYW5kKCJibWdyIGxpc3QgdHJhbnNwb3J0cyIpOwogICAgICAgICBQYXR0ZXJuIHBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoIlxcKiAoLiopIik7CiAgICAgICAgIE1hdGNoZXIgbWF0Y2hlciA9IHBhdHRlcm4ubWF0Y2hlcihvdXRwdXQpOwogICAgICAgICBpZiAobWF0Y2hlci5maW5kKCkpIHsKQEAgLTIyMCw0ICsyMTgsMTcgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJub24tcGFyc2FibGUgb3V0cHV0IHNldHRpbmcgYm1nciB0cmFuc3BvcnQ6ICIgKyBvdXRwdXQpOwogICAgICAgICB9CiAgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldExvY2FsVHJhbnNwb3J0UGFyYW1ldGVycyhTdHJpbmcgcGFyYW1ldGVycykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGdldERldmljZSgpLmV4ZWN1dGVTaGVsbENvbW1hbmQoInNldHRpbmdzIHB1dCBzZWN1cmUgYmFja3VwX2xvY2FsX3RyYW5zcG9ydF9wYXJhbWV0ZXJzICIKKyAgICAgICAgICAgICAgICArIHBhcmFtZXRlcnMpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGVuYWJsZUZha2VFbmNyeXB0aW9uT25UcmFuc3BvcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc2V0TG9jYWxUcmFuc3BvcnRQYXJhbWV0ZXJzKCJmYWtlX2VuY3J5cHRpb25fZmxhZz10cnVlIik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgZGlzYWJsZUZha2VFbmNyeXB0aW9uT25UcmFuc3BvcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc2V0TG9jYWxUcmFuc3BvcnRQYXJhbWV0ZXJzKCJmYWtlX2VuY3J5cHRpb25fZmxhZz1mYWxzZSIpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYmFja3VwL3NyYy9hbmRyb2lkL2N0cy9iYWNrdXAvRnVsbEJhY2t1cE9ubHlIb3N0U2lkZVRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvYmFja3VwL3NyYy9hbmRyb2lkL2N0cy9iYWNrdXAvRnVsbEJhY2t1cE9ubHlIb3N0U2lkZVRlc3QuamF2YQppbmRleCA4OWNmZTQwLi42NTg5OTkzIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2JhY2t1cC9zcmMvYW5kcm9pZC9jdHMvYmFja3VwL0Z1bGxCYWNrdXBPbmx5SG9zdFNpZGVUZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9iYWNrdXAvc3JjL2FuZHJvaWQvY3RzL2JhY2t1cC9GdWxsQmFja3VwT25seUhvc3RTaWRlVGVzdC5qYXZhCkBAIC0xNiw3ICsxNiw3IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5jdHMuYmFja3VwOwogCi1pbXBvcnQgc3RhdGljIGp1bml0LmZyYW1ld29yay5Bc3NlcnQuYXNzZXJ0TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwogCiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLkRldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5sb2cuTG9nVXRpbC5DTG9nOwpAQCAtNzYsNiArNzYsNyBAQAogCiAKICAgICBAQWZ0ZXIKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBzdXBlci50ZWFyRG93bigpOwogCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2JhY2t1cC9zcmMvYW5kcm9pZC9jdHMvYmFja3VwL0Z1bGxiYWNrdXBSdWxlc0hvc3RTaWRlVGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9iYWNrdXAvc3JjL2FuZHJvaWQvY3RzL2JhY2t1cC9GdWxsYmFja3VwUnVsZXNIb3N0U2lkZVRlc3QuamF2YQppbmRleCBhNTA4ZDQ3Li5jNjUzOGQwIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2JhY2t1cC9zcmMvYW5kcm9pZC9jdHMvYmFja3VwL0Z1bGxiYWNrdXBSdWxlc0hvc3RTaWRlVGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvYmFja3VwL3NyYy9hbmRyb2lkL2N0cy9iYWNrdXAvRnVsbGJhY2t1cFJ1bGVzSG9zdFNpZGVUZXN0LmphdmEKQEAgLTE2LDEyICsxNiwxMSBAQAogCiBwYWNrYWdlIGFuZHJvaWQuY3RzLmJhY2t1cDsKIAotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci0KIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5sb2cuTG9nVXRpbC5DTG9nOwogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkRldmljZUpVbml0NENsYXNzUnVubmVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmxvZy5Mb2dVdGlsLkNMb2c7CiAKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCkBAIC00NSw2ICs0NCwxMSBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTkNMVURFX0VYQ0xVREVfREVWSUNFX1RFU1RfQ0xBU1NfTkFNRSA9CiAgICAgICAgICAgICBJTkNMVURFX0VYQ0xVREVfVEVTVFNfQVBQX05BTUUgKyAiLkluY2x1ZGVFeGNsdWRlVGVzdCI7CiAKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkaXNhYmxlRmFrZUVuY3J5cHRpb25PblRyYW5zcG9ydCgpOworICAgIH0KKwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE5vQmFja3VwRm9sZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghbUlzQmFja3VwU3VwcG9ydGVkKSB7CkBAIC04Nyw4ICs5MSw4IEBACiAgICAgICAgICAgICAgICAgImNyZWF0ZUZpbGVzIik7CiAKICAgICAgICAgLy8gRG8gYSBiYWNrdXAKLSAgICAgICAgU3RyaW5nIGJhY2t1cG5vd091dHB1dCA9IGJhY2t1cE5vdyhJTkNMVURFX0VYQ0xVREVfVEVTVFNfQVBQX05BTUUpOwotICAgICAgICBhc3NlcnRCYWNrdXBJc1N1Y2Nlc3NmdWwoSU5DTFVERV9FWENMVURFX1RFU1RTX0FQUF9OQU1FLCBiYWNrdXBub3dPdXRwdXQpOworICAgICAgICBTdHJpbmcgYmFja3VwTm93T3V0cHV0ID0gYmFja3VwTm93KElOQ0xVREVfRVhDTFVERV9URVNUU19BUFBfTkFNRSk7CisgICAgICAgIGFzc2VydEJhY2t1cElzU3VjY2Vzc2Z1bChJTkNMVURFX0VYQ0xVREVfVEVTVFNfQVBQX05BTUUsIGJhY2t1cE5vd091dHB1dCk7CiAKICAgICAgICAgLy8gRGVsZXRlIHRoZSBmaWxlcwogICAgICAgICBjaGVja0RldmljZVRlc3QoSU5DTFVERV9FWENMVURFX1RFU1RTX0FQUF9OQU1FLCBJTkNMVURFX0VYQ0xVREVfREVWSUNFX1RFU1RfQ0xBU1NfTkFNRSwKQEAgLTEwMiw0ICsxMDYsNjYgQEAKICAgICAgICAgY2hlY2tEZXZpY2VUZXN0KElOQ0xVREVfRVhDTFVERV9URVNUU19BUFBfTkFNRSwgSU5DTFVERV9FWENMVURFX0RFVklDRV9URVNUX0NMQVNTX05BTUUsCiAgICAgICAgICAgICAgICAgImNoZWNrUmVzdG9yZWRGaWxlcyIpOwogICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcXVpcmVGYWtlRW5jcnlwdGlvbkZsYWdfaW5jbHVkZXNGaWxlSWZGYWtlRW5jcnlwdGlvbkVuYWJsZWQoKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghbUlzQmFja3VwU3VwcG9ydGVkKSB7CisgICAgICAgICAgICBDTG9nLmkoImFuZHJvaWQuc29mdHdhcmUuYmFja3VwIGZlYXR1cmUgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIGRldmljZSIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZW5hYmxlRmFrZUVuY3J5cHRpb25PblRyYW5zcG9ydCgpOworCisgICAgICAgIC8vIEdlbmVyYXRlIHRoZSBmaWxlcyB0aGF0IGFyZSBnb2luZyB0byBiZSBiYWNrZWQgdXAuCisgICAgICAgIGNoZWNrRGV2aWNlVGVzdChJTkNMVURFX0VYQ0xVREVfVEVTVFNfQVBQX05BTUUsIElOQ0xVREVfRVhDTFVERV9ERVZJQ0VfVEVTVF9DTEFTU19OQU1FLAorICAgICAgICAgICAgICAgICJjcmVhdGVGaWxlcyIpOworCisgICAgICAgIC8vIERvIGEgYmFja3VwCisgICAgICAgIFN0cmluZyBiYWNrdXBOb3dPdXRwdXQgPSBiYWNrdXBOb3coSU5DTFVERV9FWENMVURFX1RFU1RTX0FQUF9OQU1FKTsKKyAgICAgICAgYXNzZXJ0QmFja3VwSXNTdWNjZXNzZnVsKElOQ0xVREVfRVhDTFVERV9URVNUU19BUFBfTkFNRSwgYmFja3VwTm93T3V0cHV0KTsKKworICAgICAgICAvLyBEZWxldGUgdGhlIGZpbGVzCisgICAgICAgIGNoZWNrRGV2aWNlVGVzdChJTkNMVURFX0VYQ0xVREVfVEVTVFNfQVBQX05BTUUsIElOQ0xVREVfRVhDTFVERV9ERVZJQ0VfVEVTVF9DTEFTU19OQU1FLAorICAgICAgICAgICAgICAgICJkZWxldGVGaWxlc0FmdGVyQmFja3VwIik7CisKKyAgICAgICAgLy8gRG8gYSByZXN0b3JlCisgICAgICAgIFN0cmluZyByZXN0b3JlT3V0cHV0ID0gcmVzdG9yZShJTkNMVURFX0VYQ0xVREVfVEVTVFNfQVBQX05BTUUpOworICAgICAgICBhc3NlcnRSZXN0b3JlSXNTdWNjZXNzZnVsKHJlc3RvcmVPdXRwdXQpOworCisgICAgICAgIC8vIENoZWNrIHRoYXQgdGhlIGNsaWVudC1zaWRlIGVuY3J5cHRpb24gZmlsZXMgd2VyZSByZXN0b3JlZAorICAgICAgICBjaGVja0RldmljZVRlc3QoSU5DTFVERV9FWENMVURFX1RFU1RTX0FQUF9OQU1FLCBJTkNMVURFX0VYQ0xVREVfREVWSUNFX1RFU1RfQ0xBU1NfTkFNRSwKKyAgICAgICAgICAgICAgICAiY2hlY2tSZXN0b3JlZENsaWVudFNpZGVFbmNyeXB0aW9uRmlsZXMiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1aXJlRmFrZUVuY3J5cHRpb25GbGFnX2V4Y2x1ZGVzRmlsZUlmRmFrZUVuY3J5cHRpb25EaXNhYmxlZCgpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFtSXNCYWNrdXBTdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgIENMb2cuaSgiYW5kcm9pZC5zb2Z0d2FyZS5iYWNrdXAgZmVhdHVyZSBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgZGV2aWNlIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBkaXNhYmxlRmFrZUVuY3J5cHRpb25PblRyYW5zcG9ydCgpOworCisgICAgICAgIC8vIEdlbmVyYXRlIHRoZSBmaWxlcyB0aGF0IGFyZSBnb2luZyB0byBiZSBiYWNrZWQgdXAuCisgICAgICAgIGNoZWNrRGV2aWNlVGVzdChJTkNMVURFX0VYQ0xVREVfVEVTVFNfQVBQX05BTUUsIElOQ0xVREVfRVhDTFVERV9ERVZJQ0VfVEVTVF9DTEFTU19OQU1FLAorICAgICAgICAgICAgICAgICJjcmVhdGVGaWxlcyIpOworCisgICAgICAgIC8vIERvIGEgYmFja3VwCisgICAgICAgIFN0cmluZyBiYWNrdXBOb3dPdXRwdXQgPSBiYWNrdXBOb3coSU5DTFVERV9FWENMVURFX1RFU1RTX0FQUF9OQU1FKTsKKyAgICAgICAgYXNzZXJ0QmFja3VwSXNTdWNjZXNzZnVsKElOQ0xVREVfRVhDTFVERV9URVNUU19BUFBfTkFNRSwgYmFja3VwTm93T3V0cHV0KTsKKworICAgICAgICAvLyBEZWxldGUgdGhlIGZpbGVzCisgICAgICAgIGNoZWNrRGV2aWNlVGVzdChJTkNMVURFX0VYQ0xVREVfVEVTVFNfQVBQX05BTUUsIElOQ0xVREVfRVhDTFVERV9ERVZJQ0VfVEVTVF9DTEFTU19OQU1FLAorICAgICAgICAgICAgICAgICJkZWxldGVGaWxlc0FmdGVyQmFja3VwIik7CisKKyAgICAgICAgLy8gRG8gYSByZXN0b3JlCisgICAgICAgIFN0cmluZyByZXN0b3JlT3V0cHV0ID0gcmVzdG9yZShJTkNMVURFX0VYQ0xVREVfVEVTVFNfQVBQX05BTUUpOworICAgICAgICBhc3NlcnRSZXN0b3JlSXNTdWNjZXNzZnVsKHJlc3RvcmVPdXRwdXQpOworCisgICAgICAgIC8vIENoZWNrIHRoYXQgdGhlIGNsaWVudC1zaWRlIGVuY3J5cHRpb24gZmlsZXMgd2VyZSBub3QgcmVzdG9yZWQKKyAgICAgICAgY2hlY2tEZXZpY2VUZXN0KElOQ0xVREVfRVhDTFVERV9URVNUU19BUFBfTkFNRSwgSU5DTFVERV9FWENMVURFX0RFVklDRV9URVNUX0NMQVNTX05BTUUsCisgICAgICAgICAgICAgICAgImNoZWNrRGlkTm90UmVzdG9yZUNsaWVudFNpZGVFbmNyeXB0aW9uRmlsZXMiKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2JhY2t1cC9zcmMvYW5kcm9pZC9jdHMvYmFja3VwL0tleVZhbHVlQmFja3VwUmVzdG9yZUhvc3RTaWRlVGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9iYWNrdXAvc3JjL2FuZHJvaWQvY3RzL2JhY2t1cC9LZXlWYWx1ZUJhY2t1cFJlc3RvcmVIb3N0U2lkZVRlc3QuamF2YQppbmRleCBhMWY0OTI3Li41Y2U4NmQ5IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2JhY2t1cC9zcmMvYW5kcm9pZC9jdHMvYmFja3VwL0tleVZhbHVlQmFja3VwUmVzdG9yZUhvc3RTaWRlVGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvYmFja3VwL3NyYy9hbmRyb2lkL2N0cy9iYWNrdXAvS2V5VmFsdWVCYWNrdXBSZXN0b3JlSG9zdFNpZGVUZXN0LmphdmEKQEAgLTE2LDcgKzE2LDcgQEAKIAogcGFja2FnZSBhbmRyb2lkLmN0cy5iYWNrdXA7CiAKLWltcG9ydCBzdGF0aWMganVuaXQuZnJhbWV3b3JrLkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CiAKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmxvZy5Mb2dVdGlsLkNMb2c7CkBAIC0yNyw4ICsyNyw2IEBACiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci0KIC8qKgogICogVGVzdCBmb3IgY2hlY2tpbmcgdGhhdCBrZXkvdmFsdWUgYmFja3VwIGFuZCByZXN0b3JlIHdvcmtzIGNvcnJlY3RseS4KICAqIEl0IGludGVyYWN0cyB3aXRoIHRoZSBhcHAgdGhhdCBzYXZlcyB2YWx1ZXMgaW4gZGlmZmVyZW50IHNoYXJlZCBwcmVmZXJlbmNlcyBhbmQgZmlsZXMuCkBAIC02MCw2ICs1OCw3IEBACiAKIAogICAgIEBCZWZvcmUKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBzdXBlci5zZXRVcCgpOwogICAgICAgICBpbnN0YWxsUGFja2FnZShLRVlfVkFMVUVfUkVTVE9SRV9BUFBfQVBLKTsKQEAgLTcwLDYgKzY5LDcgQEAKICAgICB9CiAKICAgICBAQWZ0ZXIKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBzdXBlci50ZWFyRG93bigpOwogCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2JhY2t1cC9zcmMvYW5kcm9pZC9jdHMvYmFja3VwL1Jlc3RvcmVBbnlWZXJzaW9uSG9zdFNpZGVUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2JhY2t1cC9zcmMvYW5kcm9pZC9jdHMvYmFja3VwL1Jlc3RvcmVBbnlWZXJzaW9uSG9zdFNpZGVUZXN0LmphdmEKaW5kZXggN2MxZjM3Yi4uYTYyZWFiOCAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9iYWNrdXAvc3JjL2FuZHJvaWQvY3RzL2JhY2t1cC9SZXN0b3JlQW55VmVyc2lvbkhvc3RTaWRlVGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvYmFja3VwL3NyYy9hbmRyb2lkL2N0cy9iYWNrdXAvUmVzdG9yZUFueVZlcnNpb25Ib3N0U2lkZVRlc3QuamF2YQpAQCAtMTYsMjMgKzE2LDE3IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5jdHMuYmFja3VwOwogCi1pbXBvcnQgc3RhdGljIGp1bml0LmZyYW1ld29yay5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0LmFzc2VydE51bGw7Ci1pbXBvcnQgc3RhdGljIGp1bml0LmZyYW1ld29yay5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzdW1lLmFzc3VtZVRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5EZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb247CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQubG9nLkxvZ1V0aWwuQ0xvZzsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlRhcmdldFNldHVwRXJyb3I7CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuRGV2aWNlSlVuaXQ0Q2xhc3NSdW5uZXI7CiAKIGltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLQogLyoqCiAgKiBUZXN0IGNoZWNraW5nIHRoYXQgcmVzdG9yZUFueVZlcnNpb24gbWFuaWZlc3QgZmxhZyBpcyByZXNwZWN0ZWQgYnkgYmFja3VwIG1hbmFnZXIuCiAgKgpAQCAtNjIsNiArNTYsNyBAQAogICAgICAgICAgICAgIkN0c0JhY2t1cFJlc3RvcmVBbnlWZXJzaW9uTm9SZXN0b3JlQXBwLmFwayI7CiAKICAgICBAQWZ0ZXIKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBzdXBlci50ZWFyRG93bigpOwogCkBAIC0xNTcsMjEgKzE1MiwyMSBAQAogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBpbnN0YWxsUmVzdG9yZUFueVZlcnNpb25BcHAoKQotICAgICAgICAgICAgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24sIFRhcmdldFNldHVwRXJyb3IgewogICAgICAgICBpbnN0YWxsUGFja2FnZShSRVNUT1JFX0FOWV9WRVJTSU9OX0FQUF9BUEssICItZCIsICItciIpOwogCiAgICAgICAgIGNoZWNrUmVzdG9yZUFueVZlcnNpb25EZXZpY2VUZXN0KCJjaGVja0FwcFZlcnNpb25Jc09sZCIpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBpbnN0YWxsTm9SZXN0b3JlQW55VmVyc2lvbkFwcCgpCi0gICAgICAgICAgICB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICAgICAgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiwgVGFyZ2V0U2V0dXBFcnJvciB7CiAgICAgICAgIGluc3RhbGxQYWNrYWdlKE5PX1JFU1RPUkVfQU5ZX1ZFUlNJT05fQVBLLCAiLWQiLCAiLXIiKTsKIAogICAgICAgICBjaGVja1Jlc3RvcmVBbnlWZXJzaW9uRGV2aWNlVGVzdCgiY2hlY2tBcHBWZXJzaW9uSXNPbGQiKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgaW5zdGFsbE5ld1ZlcnNpb25BcHAoKQotICAgICAgICAgICAgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24sIFRhcmdldFNldHVwRXJyb3IgewogICAgICAgICBpbnN0YWxsUGFja2FnZShSRVNUT1JFX0FOWV9WRVJTSU9OX1VQREFURV9BUEssICItZCIsICItciIpOwogCiAgICAgICAgIGNoZWNrUmVzdG9yZUFueVZlcnNpb25EZXZpY2VUZXN0KCJjaGVja0FwcFZlcnNpb25Jc05ldyIpOwpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9iYWNrdXAvc3JjL2FuZHJvaWQvY3RzL2JhY2t1cC9TdWNjZXNzTm90aWZpY2F0aW9uSG9zdFNpZGVUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2JhY2t1cC9zcmMvYW5kcm9pZC9jdHMvYmFja3VwL1N1Y2Nlc3NOb3RpZmljYXRpb25Ib3N0U2lkZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTRlM2JjCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9iYWNrdXAvc3JjL2FuZHJvaWQvY3RzL2JhY2t1cC9TdWNjZXNzTm90aWZpY2F0aW9uSG9zdFNpZGVUZXN0LmphdmEKQEAgLTAsMCArMSwyMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5jdHMuYmFja3VwOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5EZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb247CitpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQubG9nLkxvZ1V0aWwuQ0xvZzsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5EZXZpY2VKVW5pdDRDbGFzc1J1bm5lcjsKKworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBUZXN0cyBmb3IgY2hlY2tpbmcgdGhhdCBhbiBvYnNlcnZlciBhcHAgaXMgbm90aWZpZWQgYnkgYSBicm9hZGNhc3QgSW50ZW50IHdoZW5ldmVyIGEgYmFja3VwCisgKiBzdWNjZWVkcy4KKyAqCisgKiBOQjogVGhlIHRlc3RzIHVzZSAiYm1nciBiYWNrdXBub3ciIGZvciBiYWNrdXAsIHdoaWNoIHdvcmtzIG9uIE4rIGRldmljZXMuCisgKi8KK0BSdW5XaXRoKERldmljZUpVbml0NENsYXNzUnVubmVyLmNsYXNzKQorcHVibGljIGNsYXNzIFN1Y2Nlc3NOb3RpZmljYXRpb25Ib3N0U2lkZVRlc3QgZXh0ZW5kcyBCYXNlQmFja3VwSG9zdFNpZGVUZXN0IHsKKworICAgIC8qKiBUaGUgbmFtZSBvZiB0aGUgcGFja2FnZSB0aGF0IGEga2V5L3ZhbHVlIGJhY2t1cCB3aWxsIGJlIHJ1biBmb3IgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1ZBTFVFX0JBQ0tVUF9BUFBfUEFDS0FHRSA9CisgICAgICAgICAgICAiYW5kcm9pZC5jdHMuYmFja3VwLmtleXZhbHVlcmVzdG9yZWFwcCI7CisKKyAgICAvKiogVGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgdGhhdCBhIGZ1bGwgYmFja3VwIHdpbGwgYmUgcnVuIGZvciAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGVUxMX0JBQ0tVUF9BUFBfUEFDS0FHRSA9ICJhbmRyb2lkLmN0cy5iYWNrdXAuZnVsbGJhY2t1cG9ubHlhcHAiOworCisgICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRoYXQgb2JzZXJ2ZXMgYmFja3VwIHJlc3VsdHMuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNVQ0NFU1NfTk9USUZJQ0FUSU9OX0FQUF9QQUNLQUdFID0KKyAgICAgICAgICAgICJhbmRyb2lkLmN0cy5iYWNrdXAuc3VjY2Vzc25vdGlmaWNhdGlvbmFwcCI7CisKKyAgICAvKiogVGhlIG5hbWUgb2YgdGhlIGRldmljZSBzaWRlIHRlc3QgY2xhc3MgaW4gdGhlIEFQSyB0aGF0IGEga2V5L3ZhbHVlIGJhY2t1cCB3aWxsIGJlIHJ1biBmb3IgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1ZBTFVFX0JBQ0tVUF9ERVZJQ0VfVEVTVF9OQU1FID0KKyAgICAgICAgICAgIEtFWV9WQUxVRV9CQUNLVVBfQVBQX1BBQ0tBR0UgKyAiLktleVZhbHVlQmFja3VwUmVzdG9yZVRlc3QiOworCisgICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBkZXZpY2Ugc2lkZSB0ZXN0IGNsYXNzIGluIHRoZSBBUEsgdGhhdCBhIGZ1bGwgYmFja3VwIHdpbGwgYmUgcnVuIGZvciAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGVUxMX0JBQ0tVUF9ERVZJQ0VfVEVTVF9DTEFTU19OQU1FID0KKyAgICAgICAgICAgIEZVTExfQkFDS1VQX0FQUF9QQUNLQUdFICsgIi5GdWxsQmFja3VwT25seVRlc3QiOworCisgICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBkZXZpY2Ugc2lkZSB0ZXN0IGNsYXNzIGluIHRoZSBBUEsgdGhhdCBvYnNlcnZlcyBiYWNrdXAgcmVzdWx0cyAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVUNDRVNTX05PVElGSUNBVElPTl9ERVZJQ0VfVEVTVF9OQU1FID0KKyAgICAgICAgICAgIFNVQ0NFU1NfTk9USUZJQ0FUSU9OX0FQUF9QQUNLQUdFICsgIi5TdWNjZXNzTm90aWZpY2F0aW9uVGVzdCI7CisKKyAgICAvKiogVGhlIG5hbWUgb2YgdGhlIEFQSyB0aGF0IGEga2V5L3ZhbHVlIGJhY2t1cCB3aWxsIGJlIHJ1biBmb3IgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1ZBTFVFX0JBQ0tVUF9BUFBfQVBLID0gIkN0c0tleVZhbHVlQmFja3VwUmVzdG9yZUFwcC5hcGsiOworCisgICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBBUEsgdGhhdCBhIGZ1bGwgYmFja3VwIHdpbGwgYmUgcnVuIGZvciAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGVUxMX0JBQ0tVUF9BUFBfQVBLID0gIkZ1bGxCYWNrdXBPbmx5RmFsc2VXaXRoQWdlbnRBcHAuYXBrIjsKKworICAgIC8qKiBUaGUgbmFtZSBvZiB0aGUgQVBLIHRoYXQgb2JzZXJ2ZXMgYmFja3VwIHJlc3VsdHMgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VDQ0VTU19OT1RJRklDQVRJT05fQVBQX0FQSyA9CisgICAgICAgICAgICAiQ3RzQmFja3VwU3VjY2Vzc05vdGlmaWNhdGlvbkFwcC5hcGsiOworCisgICAgLyoqIFNlY3VyZSBzZXR0aW5nIHRoYXQgaG9sZHMgdGhlIGJhY2t1cCBtYW5hZ2VyIGNvbmZpZ3VyYXRpb24gYXMga2V5LXZhbHVlIHBhaXJzICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJBQ0tVUF9NQU5BR0VSX0NPTlNUQU5UU19QUkVGID0gImJhY2t1cF9tYW5hZ2VyX2NvbnN0YW50cyI7CisKKyAgICAvKiogS2V5IGZvciBzcGVjaWZ5aW5nIHRoZSBhcHBzIHRoYXQgdGhlIGJhY2t1cCBtYW5hZ2VyIHNob3VsZCBub3RpZnkgb2Ygc3VjY2Vzc2Z1bCBiYWNrdXBzICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJBQ0tVUF9GSU5JU0hFRF9OT1RJRklDQVRJT05fUkVDRUlWRVJTID0KKyAgICAgICAgICAgICJiYWNrdXBfZmluaXNoZWRfbm90aWZpY2F0aW9uX3JlY2VpdmVycyI7CisKKyAgICAvKiogVGhlIG9yaWdpbmFsIGJhY2t1cCBtYW5hZ2VyIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBwcml2YXRlIFN0cmluZyBtT3JpZ2luYWxCYWNrdXBNYW5hZ2VyQ29uc3RhbnRzID0gbnVsbDsKKworICAgIEBCZWZvcmUKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworCisgICAgICAgIGlmICghbUlzQmFja3VwU3VwcG9ydGVkKSB7CisgICAgICAgICAgICBDTG9nLmkoImFuZHJvaWQuc29mdHdhcmUuYmFja3VwIGZlYXR1cmUgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIGRldmljZSIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaW5zdGFsbFBhY2thZ2UoS0VZX1ZBTFVFX0JBQ0tVUF9BUFBfQVBLKTsKKyAgICAgICAgaW5zdGFsbFBhY2thZ2UoRlVMTF9CQUNLVVBfQVBQX0FQSyk7CisKKyAgICAgICAgaW5zdGFsbFBhY2thZ2UoU1VDQ0VTU19OT1RJRklDQVRJT05fQVBQX0FQSyk7CisgICAgICAgIGNoZWNrRGV2aWNlVGVzdCgiY2xlYXJCYWNrdXBTdWNjZXNzTm90aWZpY2F0aW9uc1JlY2VpdmVkIik7CisgICAgICAgIGFkZEJhY2t1cEZpbmlzaGVkTm90aWZpY2F0aW9uUmVjZWl2ZXIoKTsKKyAgICB9CisKKyAgICBAQWZ0ZXIKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci50ZWFyRG93bigpOworCisgICAgICAgIGlmICghbUlzQmFja3VwU3VwcG9ydGVkKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICByZXN0b3JlQmFja3VwRmluaXNoZWROb3RpZmljYXRpb25SZWNlaXZlcnMoKTsKKyAgICAgICAgYXNzZXJ0TnVsbCh1bmluc3RhbGxQYWNrYWdlKFNVQ0NFU1NfTk9USUZJQ0FUSU9OX0FQUF9QQUNLQUdFKSk7CisKKyAgICAgICAgLy8gQ2xlYXIgYmFja3VwIGRhdGEgYW5kIHVuaW5zdGFsbCB0aGUgcGFja2FnZSAoaW4gdGhhdCBvcmRlciEpCisgICAgICAgIGNsZWFyQmFja3VwRGF0YUluTG9jYWxUcmFuc3BvcnQoS0VZX1ZBTFVFX0JBQ0tVUF9BUFBfUEFDS0FHRSk7CisgICAgICAgIGFzc2VydE51bGwodW5pbnN0YWxsUGFja2FnZShLRVlfVkFMVUVfQkFDS1VQX0FQUF9QQUNLQUdFKSk7CisKKyAgICAgICAgY2xlYXJCYWNrdXBEYXRhSW5Mb2NhbFRyYW5zcG9ydChGVUxMX0JBQ0tVUF9BUFBfUEFDS0FHRSk7CisgICAgICAgIGFzc2VydE51bGwodW5pbnN0YWxsUGFja2FnZShGVUxMX0JBQ0tVUF9BUFBfUEFDS0FHRSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhhdCB0aGUgb2JzZXJ2ZXIgYXBwIGlzIG5vdGlmaWVkIHdoZW4gYSBrZXkvdmFsdWUgYmFja3VwIHN1Y2NlZWRzLgorICAgICAqCisgICAgICogVGVzdCBsb2dpYzoKKyAgICAgKiAgIDEuIENoYW5nZSBhIHRlc3QgYXBwJ3MgZGF0YSwgdHJpZ2dlciBhIGtleS92YWx1ZSBiYWNrdXAgYW5kIHdhaXQgZm9yIGl0IHRvIGNvbXBsZXRlLgorICAgICAqICAgMi4gVmVyaWZ5IHRoYXQgdGhlIG9ic2VydmVyIGFwcCB3YXMgaW5mb3JtZWQgYWJvdXQgdGhlIGJhY2t1cC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdWNjZXNzTm90aWZpY2F0aW9uRm9yS2V5VmFsdWVCYWNrdXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFtSXNCYWNrdXBTdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGNoZWNrRGV2aWNlVGVzdChLRVlfVkFMVUVfQkFDS1VQX0FQUF9QQUNLQUdFLCBLRVlfVkFMVUVfQkFDS1VQX0RFVklDRV9URVNUX05BTUUsCisgICAgICAgICAgICAgICAgInNhdmVTaGFyZWRQcmVmZXJlbmNlc0FuZE5vdGlmeUJhY2t1cE1hbmFnZXIiKTsKKyAgICAgICAgYmFja3VwTm93QW5kQXNzZXJ0U3VjY2VzcyhLRVlfVkFMVUVfQkFDS1VQX0FQUF9QQUNLQUdFKTsKKworICAgICAgICBjaGVja0RldmljZVRlc3QoInZlcmlmeUJhY2t1cFN1Y2Nlc3NOb3RpZmljYXRpb25SZWNlaXZlZEZvcktleVZhbHVlQXBwIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0aGF0IHRoZSBvYnNlcnZlciBhcHAgaXMgbm90aWZpZWQgd2hlbiBhIGZ1bGwgYmFja3VwIHN1Y2NlZWRzLgorICAgICAqCisgICAgICogVGVzdCBsb2dpYzoKKyAgICAgKiAgIDEuIENoYW5nZSBhIHRlc3QgYXBwJ3MgZGF0YSwgdHJpZ2dlciBhIGZ1bGwgYmFja3VwIGFuZCB3YWl0IGZvciBpdCB0byBjb21wbGV0ZS4KKyAgICAgKiAgIDIuIFZlcmlmeSB0aGF0IHRoZSBvYnNlcnZlciBhcHAgd2FzIGluZm9ybWVkIGFib3V0IHRoZSBiYWNrdXAuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3VjY2Vzc05vdGlmaWNhdGlvbkZvckZ1bGxCYWNrdXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFtSXNCYWNrdXBTdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGNoZWNrRGV2aWNlVGVzdChGVUxMX0JBQ0tVUF9BUFBfUEFDS0FHRSwgRlVMTF9CQUNLVVBfREVWSUNFX1RFU1RfQ0xBU1NfTkFNRSwgImNyZWF0ZUZpbGVzIik7CisgICAgICAgIGJhY2t1cE5vd0FuZEFzc2VydFN1Y2Nlc3MoRlVMTF9CQUNLVVBfQVBQX1BBQ0tBR0UpOworCisgICAgICAgIGNoZWNrRGV2aWNlVGVzdCgidmVyaWZ5QmFja3VwU3VjY2Vzc05vdGlmaWNhdGlvblJlY2VpdmVkRm9yRnVsbEJhY2t1cEFwcCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluc3RydWN0cyB0aGUgYmFja3VwIG1hbmFnZXIgdG8gbm90aWZ5IHRoZSBvYnNlcnZlciBhcHAgd2hlbmV2ZXIgYSBiYWNrdXAgc3VjY2VlZHMuIFRoZSBvbGQKKyAgICAgKiBiYWNrdXAgbWFuYWdlciBjb25maWd1cmF0aW9uIGlzIHN0b3JlZCBpbiBhIG1lbWJlciB2YXJpYWJsZSBhbmQgY2FuIGJlIHJlc3RvcmVkIGJ5IGNhbGxpbmcKKyAgICAgKiB7QGxpbmsgcmVzdG9yZUJhY2t1cEZpbmlzaGVkTm90aWZpY2F0aW9uUmVjZWl2ZXJzfS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYWRkQmFja3VwRmluaXNoZWROb3RpZmljYXRpb25SZWNlaXZlcigpCisgICAgICAgICAgICB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKKyAgICAgICAgbU9yaWdpbmFsQmFja3VwTWFuYWdlckNvbnN0YW50cyA9IGdldERldmljZSgpLmV4ZWN1dGVTaGVsbENvbW1hbmQoU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAic2V0dGluZ3MgZ2V0IHNlY3VyZSAlcyIsIEJBQ0tVUF9NQU5BR0VSX0NPTlNUQU5UU19QUkVGKSkudHJpbSgpOworICAgICAgICBpZiAoIm51bGwiLmVxdWFscyhtT3JpZ2luYWxCYWNrdXBNYW5hZ2VyQ29uc3RhbnRzKSkgeworICAgICAgICAgICAgbU9yaWdpbmFsQmFja3VwTWFuYWdlckNvbnN0YW50cyA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGJhY2t1cE1hbmFnZXJDb25zdGFudHMgPSBudWxsOworCisgICAgICAgIGlmIChtT3JpZ2luYWxCYWNrdXBNYW5hZ2VyQ29uc3RhbnRzID09IG51bGwgfHwgbU9yaWdpbmFsQmFja3VwTWFuYWdlckNvbnN0YW50cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGJhY2t1cE1hbmFnZXJDb25zdGFudHMgPQorICAgICAgICAgICAgICAgICAgICBCQUNLVVBfRklOSVNIRURfTk9USUZJQ0FUSU9OX1JFQ0VJVkVSUyArICI9IiArIFNVQ0NFU1NfTk9USUZJQ0FUSU9OX0FQUF9QQUNLQUdFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGtleVZhbHVlUGFpcnMgPQorICAgICAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PD4oQXJyYXlzLmFzTGlzdChtT3JpZ2luYWxCYWNrdXBNYW5hZ2VyQ29uc3RhbnRzLnNwbGl0KCIsIikpKTsKKyAgICAgICAgICAgIGJvb2xlYW4gcHJlc2VudCA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlWYWx1ZVBhaXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGtleVZhbHVlUGFpciA9IGtleVZhbHVlUGFpcnMuZ2V0KGkpOworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIGZpZWxkcyA9IGtleVZhbHVlUGFpci5zcGxpdCgiPSIpOworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBrZXkgPSBmaWVsZHNbMF0udHJpbSgpOworICAgICAgICAgICAgICAgIGlmIChCQUNLVVBfRklOSVNIRURfTk9USUZJQ0FUSU9OX1JFQ0VJVkVSUy5lcXVhbHMoa2V5KSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRzLmxlbmd0aCA9PSAxIHx8IGZpZWxkc1sxXS50cmltKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZVBhaXJzLnNldChpLCBrZXkgKyAiPSIgKyBTVUNDRVNTX05PVElGSUNBVElPTl9BUFBfUEFDS0FHRSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSB2YWx1ZXMgPSBmaWVsZHNbMV0uc3BsaXQoIjoiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgdmFsdWVzLmxlbmd0aDsgKytqKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFNVQ0NFU1NfTk9USUZJQ0FUSU9OX0FQUF9QQUNLQUdFLmVxdWFscyh2YWx1ZXNbal0udHJpbSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcmVzZW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5VmFsdWVQYWlycy5zZXQoaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVZhbHVlUGFpciArICI6IiArIFNVQ0NFU1NfTk9USUZJQ0FUSU9OX0FQUF9QQUNLQUdFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwcmVzZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFwcmVzZW50KSB7CisgICAgICAgICAgICAgICAga2V5VmFsdWVQYWlycy5hZGQoQkFDS1VQX0ZJTklTSEVEX05PVElGSUNBVElPTl9SRUNFSVZFUlMgKyAiPSIgKworICAgICAgICAgICAgICAgICAgICAgICAgU1VDQ0VTU19OT1RJRklDQVRJT05fQVBQX1BBQ0tBR0UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYmFja3VwTWFuYWdlckNvbnN0YW50cyA9IFN0cmluZy5qb2luKCIsIiwga2V5VmFsdWVQYWlycyk7CisgICAgICAgIH0KKyAgICAgICAgc2V0QmFja3VwTWFuYWdlckNvbnN0YW50cyhiYWNrdXBNYW5hZ2VyQ29uc3RhbnRzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXN0b3JlcyB0aGUgYmFja3VwIG1hbmFnZXIgY29uZmlndXJhdGlvbiBzdG9yZWQgYnkgYSBwcmV2aW91cyBjYWxsIHRvCisgICAgICoge0BsaW5rIGFkZEJhY2t1cEZpbmlzaGVkTm90aWZpY2F0aW9uUmVjZWl2ZXJ9LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZXN0b3JlQmFja3VwRmluaXNoZWROb3RpZmljYXRpb25SZWNlaXZlcnMoKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKKyAgICAgICAgc2V0QmFja3VwTWFuYWdlckNvbnN0YW50cyhtT3JpZ2luYWxCYWNrdXBNYW5hZ2VyQ29uc3RhbnRzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0QmFja3VwTWFuYWdlckNvbnN0YW50cyhTdHJpbmcgYmFja3VwTWFuYWdlckNvbnN0YW50cykKKyAgICAgICAgICAgIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24geworICAgICAgICBnZXREZXZpY2UoKS5leGVjdXRlU2hlbGxDb21tYW5kKFN0cmluZy5mb3JtYXQoInNldHRpbmdzIHB1dCBzZWN1cmUgJXMgJXMiLAorICAgICAgICAgICAgICAgIEJBQ0tVUF9NQU5BR0VSX0NPTlNUQU5UU19QUkVGLCBiYWNrdXBNYW5hZ2VyQ29uc3RhbnRzKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrRGV2aWNlVGVzdChTdHJpbmcgbWV0aG9kTmFtZSkgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7CisgICAgICAgIGNoZWNrRGV2aWNlVGVzdChTVUNDRVNTX05PVElGSUNBVElPTl9BUFBfUEFDS0FHRSwgU1VDQ0VTU19OT1RJRklDQVRJT05fREVWSUNFX1RFU1RfTkFNRSwKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2Jvb3RzdGF0cy9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9ib290c3RhdHMvQW5kcm9pZC5tawppbmRleCA1OGZjZmUyLi44N2JmZjE5IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2Jvb3RzdGF0cy9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvYm9vdHN0YXRzL0FuZHJvaWQubWsKQEAgLTIwLDggKzIwLDggQEAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIAogTE9DQUxfTU9EVUxFIDo9IEN0c0Jvb3RTdGF0c1Rlc3RDYXNlcwotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGhvc3QtZnJhbWV3b3JrLXByb3RvcwotTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gY3RzLXRyYWRlZmVkIHRyYWRlZmVkIGNvbXBhdGliaWxpdHktaG9zdC11dGlsIGhvc3QtbGlicHJvdG9idWYtamF2YS1mdWxsCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gZnJhbWV3b3JrLXByb3RvcworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gY3RzLXRyYWRlZmVkIHRyYWRlZmVkIGNvbXBhdGliaWxpdHktaG9zdC11dGlsIGxpYnByb3RvYnVmLWphdmEtZnVsbAogCiBMT0NBTF9DVFNfVEVTVF9QQUNLQUdFIDo9IGFuZHJvaWQuYm9vdHN0YXRzCiAKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvYm9vdHN0YXRzL0FuZHJvaWRUZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvYm9vdHN0YXRzL0FuZHJvaWRUZXN0LnhtbAppbmRleCA2ZDFiZTdkLi41Y2FjNTQ4IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2Jvb3RzdGF0cy9BbmRyb2lkVGVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9ib290c3RhdHMvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciB0aGUgQ1RTIEJvb3QgU3RhdHMgaG9zdCB0ZXN0cyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9InN5c3VpIiAvPgogICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5KYXJIb3N0VGVzdCIgPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImphciIgdmFsdWU9IkN0c0Jvb3RTdGF0c1Rlc3RDYXNlcy5qYXIiIC8+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2Jvb3RzdGF0cy9zcmMvYW5kcm9pZC9ib290c3RhdHMvY3RzL0Jvb3RTdGF0c0hvc3RUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2Jvb3RzdGF0cy9zcmMvYW5kcm9pZC9ib290c3RhdHMvY3RzL0Jvb3RTdGF0c0hvc3RUZXN0LmphdmEKaW5kZXggNzVlM2ZkNS4uN2Q3MjU3ZiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9ib290c3RhdHMvc3JjL2FuZHJvaWQvYm9vdHN0YXRzL2N0cy9Cb290U3RhdHNIb3N0VGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvYm9vdHN0YXRzL3NyYy9hbmRyb2lkL2Jvb3RzdGF0cy9jdHMvQm9vdFN0YXRzSG9zdFRlc3QuamF2YQpAQCAtMTYsMTEgKzE2LDEyIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5ib290c3RhdHMuY3RzOwogCitpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQubG9nLkxvZ1V0aWwuQ0xvZzsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5sb2dnaW5nLm5hbm8uTWV0cmljc1Byb3RvLk1ldHJpY3NFdmVudDsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5EZXZpY2VUZXN0Q2FzZTsKLQogaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7CiAKKwogLyoqCiAgKiBTZXQgb2YgdGVzdHMgdGhhdCB2ZXJpZnkgc3RhdGlzdGljcyBjb2xsZWN0aW9uIGR1cmluZyBib290LgogICovCkBAIC0yOCw2ICsyOSwxMyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQm9vdFN0YXRzSG9zdFRlc3QiOwogCiAgICAgcHVibGljIHZvaWQgdGVzdEJvb3RTdGF0cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBpbnQgYXBpTGV2ZWwgPSBnZXREZXZpY2UoKS5nZXRBcGlMZXZlbCgpOworICAgICAgICBpZiAoYXBpTGV2ZWwgPCAyNiAvKiBCdWlsZC5WRVJTSU9OX0NPREVTLk8gKi8pIHsKKyAgICAgICAgICAgIENMb2cuaShUQUcsICJTa2lwcGluZyB0ZXN0IGJlY2F1c2UgYm9vdCB0aW1lIG1ldHJpY3Mgd2VyZSBpbnRyb2R1Y2VkIgorICAgICAgICAgICAgICAgICsgIiBpbiBBbmRyb2lkIDguMC4gQ3VycmVudCBBUEkgTGV2ZWwgIiArIGFwaUxldmVsKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCiAgICAgICAgIGxvbmcgc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAgICAgICAgIC8vIENsZWFyIGJ1ZmZlciB0byBtYWtlIGl0IGVhc2llciB0byBmaW5kIG5ldyBsb2dzCiAgICAgICAgIGdldERldmljZSgpLmV4ZWN1dGVTaGVsbENvbW1hbmQoImxvZ2NhdCAtLWJ1ZmZlcj1ldmVudHMgLS1jbGVhciIpOwpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9jb21waWxhdGlvbi9BbmRyb2lkVGVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2NvbXBpbGF0aW9uL0FuZHJvaWRUZXN0LnhtbAppbmRleCA5Y2M5MDY2Li5mZTE3YWM4IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2NvbXBpbGF0aW9uL0FuZHJvaWRUZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2NvbXBpbGF0aW9uL0FuZHJvaWRUZXN0LnhtbApAQCAtMTQsNyArMTQsOCBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIENvbXBpbGF0aW9uIFRlc3QiPgotICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0ibGliY29yZSIgLz4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgorICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iYXJ0IiAvPgogICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5KYXJIb3N0VGVzdCIgPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImphciIgdmFsdWU9IkN0c0NvbXBpbGF0aW9uVGVzdENhc2VzLmphciIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJydW50aW1lLWhpbnQiIHZhbHVlPSI5bTQ1cyIgLz4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvY29tcGlsYXRpb24vYXNzZXRzL3ByaW1hcnkucHJvZi50eHQgYi9ob3N0c2lkZXRlc3RzL2NvbXBpbGF0aW9uL2Fzc2V0cy9wcmltYXJ5LnByb2YudHh0CmluZGV4IDBhOGJkZWQuLmZkNTUyNjIgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvY29tcGlsYXRpb24vYXNzZXRzL3ByaW1hcnkucHJvZi50eHQKKysrIGIvaG9zdHNpZGV0ZXN0cy9jb21waWxhdGlvbi9hc3NldHMvcHJpbWFyeS5wcm9mLnR4dApAQCAtMSwxMDMgKzEsMTAzIEBACiBMYW5kcm9pZC9jdHMvY29tcGlsYXRpb24vQ29tcGlsYXRpb25UYXJnZXRBY3Rpdml0eTsKLUxhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTAoKUkKLUxhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTEoKUkKLUxhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTIoKUkKLUxhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTMoKUkKLUxhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTQoKUkKLUxhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTUoKUkKLUxhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTYoKUkKLUxhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTcoKUkKLUxhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTgoKUkKLUxhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTkoKUkKLUxhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTEwKClJCi1MYW5kcm9pZC9jdHMvY29tcGlsYXRpb24vQ29tcGlsYXRpb25UYXJnZXRBY3Rpdml0eTstPm0xMSgpSQotTGFuZHJvaWQvY3RzL2NvbXBpbGF0aW9uL0NvbXBpbGF0aW9uVGFyZ2V0QWN0aXZpdHk7LT5tMTIoKUkKLUxhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTEzKClJCi1MYW5kcm9pZC9jdHMvY29tcGlsYXRpb24vQ29tcGlsYXRpb25UYXJnZXRBY3Rpdml0eTstPm0xNCgpSQotTGFuZHJvaWQvY3RzL2NvbXBpbGF0aW9uL0NvbXBpbGF0aW9uVGFyZ2V0QWN0aXZpdHk7LT5tMTUoKUkKLUxhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTE2KClJCi1MYW5kcm9pZC9jdHMvY29tcGlsYXRpb24vQ29tcGlsYXRpb25UYXJnZXRBY3Rpdml0eTstPm0xNygpSQotTGFuZHJvaWQvY3RzL2NvbXBpbGF0aW9uL0NvbXBpbGF0aW9uVGFyZ2V0QWN0aXZpdHk7LT5tMTgoKUkKLUxhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTE5KClJCi1MYW5kcm9pZC9jdHMvY29tcGlsYXRpb24vQ29tcGlsYXRpb25UYXJnZXRBY3Rpdml0eTstPm0yMCgpSQotTGFuZHJvaWQvY3RzL2NvbXBpbGF0aW9uL0NvbXBpbGF0aW9uVGFyZ2V0QWN0aXZpdHk7LT5tMjEoKUkKLUxhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTIyKClJCi1MYW5kcm9pZC9jdHMvY29tcGlsYXRpb24vQ29tcGlsYXRpb25UYXJnZXRBY3Rpdml0eTstPm0yMygpSQotTGFuZHJvaWQvY3RzL2NvbXBpbGF0aW9uL0NvbXBpbGF0aW9uVGFyZ2V0QWN0aXZpdHk7LT5tMjQoKUkKLUxhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTI1KClJCi1MYW5kcm9pZC9jdHMvY29tcGlsYXRpb24vQ29tcGlsYXRpb25UYXJnZXRBY3Rpdml0eTstPm0yNigpSQotTGFuZHJvaWQvY3RzL2NvbXBpbGF0aW9uL0NvbXBpbGF0aW9uVGFyZ2V0QWN0aXZpdHk7LT5tMjcoKUkKLUxhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTI4KClJCi1MYW5kcm9pZC9jdHMvY29tcGlsYXRpb24vQ29tcGlsYXRpb25UYXJnZXRBY3Rpdml0eTstPm0yOSgpSQotTGFuZHJvaWQvY3RzL2NvbXBpbGF0aW9uL0NvbXBpbGF0aW9uVGFyZ2V0QWN0aXZpdHk7LT5tMzAoKUkKLUxhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTMxKClJCi1MYW5kcm9pZC9jdHMvY29tcGlsYXRpb24vQ29tcGlsYXRpb25UYXJnZXRBY3Rpdml0eTstPm0zMigpSQotTGFuZHJvaWQvY3RzL2NvbXBpbGF0aW9uL0NvbXBpbGF0aW9uVGFyZ2V0QWN0aXZpdHk7LT5tMzMoKUkKLUxhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTM0KClJCi1MYW5kcm9pZC9jdHMvY29tcGlsYXRpb24vQ29tcGlsYXRpb25UYXJnZXRBY3Rpdml0eTstPm0zNSgpSQotTGFuZHJvaWQvY3RzL2NvbXBpbGF0aW9uL0NvbXBpbGF0aW9uVGFyZ2V0QWN0aXZpdHk7LT5tMzYoKUkKLUxhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTM3KClJCi1MYW5kcm9pZC9jdHMvY29tcGlsYXRpb24vQ29tcGlsYXRpb25UYXJnZXRBY3Rpdml0eTstPm0zOCgpSQotTGFuZHJvaWQvY3RzL2NvbXBpbGF0aW9uL0NvbXBpbGF0aW9uVGFyZ2V0QWN0aXZpdHk7LT5tMzkoKUkKLUxhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTQwKClJCi1MYW5kcm9pZC9jdHMvY29tcGlsYXRpb24vQ29tcGlsYXRpb25UYXJnZXRBY3Rpdml0eTstPm00MSgpSQotTGFuZHJvaWQvY3RzL2NvbXBpbGF0aW9uL0NvbXBpbGF0aW9uVGFyZ2V0QWN0aXZpdHk7LT5tNDIoKUkKLUxhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTQzKClJCi1MYW5kcm9pZC9jdHMvY29tcGlsYXRpb24vQ29tcGlsYXRpb25UYXJnZXRBY3Rpdml0eTstPm00NCgpSQotTGFuZHJvaWQvY3RzL2NvbXBpbGF0aW9uL0NvbXBpbGF0aW9uVGFyZ2V0QWN0aXZpdHk7LT5tNDUoKUkKLUxhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTQ2KClJCi1MYW5kcm9pZC9jdHMvY29tcGlsYXRpb24vQ29tcGlsYXRpb25UYXJnZXRBY3Rpdml0eTstPm00NygpSQotTGFuZHJvaWQvY3RzL2NvbXBpbGF0aW9uL0NvbXBpbGF0aW9uVGFyZ2V0QWN0aXZpdHk7LT5tNDgoKUkKLUxhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTQ5KClJCi1MYW5kcm9pZC9jdHMvY29tcGlsYXRpb24vQ29tcGlsYXRpb25UYXJnZXRBY3Rpdml0eTstPm01MCgpSQotTGFuZHJvaWQvY3RzL2NvbXBpbGF0aW9uL0NvbXBpbGF0aW9uVGFyZ2V0QWN0aXZpdHk7LT5tNTEoKUkKLUxhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTUyKClJCi1MYW5kcm9pZC9jdHMvY29tcGlsYXRpb24vQ29tcGlsYXRpb25UYXJnZXRBY3Rpdml0eTstPm01MygpSQotTGFuZHJvaWQvY3RzL2NvbXBpbGF0aW9uL0NvbXBpbGF0aW9uVGFyZ2V0QWN0aXZpdHk7LT5tNTQoKUkKLUxhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTU1KClJCi1MYW5kcm9pZC9jdHMvY29tcGlsYXRpb24vQ29tcGlsYXRpb25UYXJnZXRBY3Rpdml0eTstPm01NigpSQotTGFuZHJvaWQvY3RzL2NvbXBpbGF0aW9uL0NvbXBpbGF0aW9uVGFyZ2V0QWN0aXZpdHk7LT5tNTcoKUkKLUxhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTU4KClJCi1MYW5kcm9pZC9jdHMvY29tcGlsYXRpb24vQ29tcGlsYXRpb25UYXJnZXRBY3Rpdml0eTstPm01OSgpSQotTGFuZHJvaWQvY3RzL2NvbXBpbGF0aW9uL0NvbXBpbGF0aW9uVGFyZ2V0QWN0aXZpdHk7LT5tNjAoKUkKLUxhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTYxKClJCi1MYW5kcm9pZC9jdHMvY29tcGlsYXRpb24vQ29tcGlsYXRpb25UYXJnZXRBY3Rpdml0eTstPm02MigpSQotTGFuZHJvaWQvY3RzL2NvbXBpbGF0aW9uL0NvbXBpbGF0aW9uVGFyZ2V0QWN0aXZpdHk7LT5tNjMoKUkKLUxhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTY0KClJCi1MYW5kcm9pZC9jdHMvY29tcGlsYXRpb24vQ29tcGlsYXRpb25UYXJnZXRBY3Rpdml0eTstPm02NSgpSQotTGFuZHJvaWQvY3RzL2NvbXBpbGF0aW9uL0NvbXBpbGF0aW9uVGFyZ2V0QWN0aXZpdHk7LT5tNjYoKUkKLUxhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTY3KClJCi1MYW5kcm9pZC9jdHMvY29tcGlsYXRpb24vQ29tcGlsYXRpb25UYXJnZXRBY3Rpdml0eTstPm02OCgpSQotTGFuZHJvaWQvY3RzL2NvbXBpbGF0aW9uL0NvbXBpbGF0aW9uVGFyZ2V0QWN0aXZpdHk7LT5tNjkoKUkKLUxhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTcwKClJCi1MYW5kcm9pZC9jdHMvY29tcGlsYXRpb24vQ29tcGlsYXRpb25UYXJnZXRBY3Rpdml0eTstPm03MSgpSQotTGFuZHJvaWQvY3RzL2NvbXBpbGF0aW9uL0NvbXBpbGF0aW9uVGFyZ2V0QWN0aXZpdHk7LT5tNzIoKUkKLUxhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTczKClJCi1MYW5kcm9pZC9jdHMvY29tcGlsYXRpb24vQ29tcGlsYXRpb25UYXJnZXRBY3Rpdml0eTstPm03NCgpSQotTGFuZHJvaWQvY3RzL2NvbXBpbGF0aW9uL0NvbXBpbGF0aW9uVGFyZ2V0QWN0aXZpdHk7LT5tNzUoKUkKLUxhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTc2KClJCi1MYW5kcm9pZC9jdHMvY29tcGlsYXRpb24vQ29tcGlsYXRpb25UYXJnZXRBY3Rpdml0eTstPm03NygpSQotTGFuZHJvaWQvY3RzL2NvbXBpbGF0aW9uL0NvbXBpbGF0aW9uVGFyZ2V0QWN0aXZpdHk7LT5tNzgoKUkKLUxhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTc5KClJCi1MYW5kcm9pZC9jdHMvY29tcGlsYXRpb24vQ29tcGlsYXRpb25UYXJnZXRBY3Rpdml0eTstPm04MCgpSQotTGFuZHJvaWQvY3RzL2NvbXBpbGF0aW9uL0NvbXBpbGF0aW9uVGFyZ2V0QWN0aXZpdHk7LT5tODEoKUkKLUxhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTgyKClJCi1MYW5kcm9pZC9jdHMvY29tcGlsYXRpb24vQ29tcGlsYXRpb25UYXJnZXRBY3Rpdml0eTstPm04MygpSQotTGFuZHJvaWQvY3RzL2NvbXBpbGF0aW9uL0NvbXBpbGF0aW9uVGFyZ2V0QWN0aXZpdHk7LT5tODQoKUkKLUxhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTg1KClJCi1MYW5kcm9pZC9jdHMvY29tcGlsYXRpb24vQ29tcGlsYXRpb25UYXJnZXRBY3Rpdml0eTstPm04NigpSQotTGFuZHJvaWQvY3RzL2NvbXBpbGF0aW9uL0NvbXBpbGF0aW9uVGFyZ2V0QWN0aXZpdHk7LT5tODcoKUkKLUxhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTg4KClJCi1MYW5kcm9pZC9jdHMvY29tcGlsYXRpb24vQ29tcGlsYXRpb25UYXJnZXRBY3Rpdml0eTstPm04OSgpSQotTGFuZHJvaWQvY3RzL2NvbXBpbGF0aW9uL0NvbXBpbGF0aW9uVGFyZ2V0QWN0aXZpdHk7LT5tOTAoKUkKLUxhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTkxKClJCi1MYW5kcm9pZC9jdHMvY29tcGlsYXRpb24vQ29tcGlsYXRpb25UYXJnZXRBY3Rpdml0eTstPm05MigpSQotTGFuZHJvaWQvY3RzL2NvbXBpbGF0aW9uL0NvbXBpbGF0aW9uVGFyZ2V0QWN0aXZpdHk7LT5tOTMoKUkKLUxhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTk0KClJCi1MYW5kcm9pZC9jdHMvY29tcGlsYXRpb24vQ29tcGlsYXRpb25UYXJnZXRBY3Rpdml0eTstPm05NSgpSQotTGFuZHJvaWQvY3RzL2NvbXBpbGF0aW9uL0NvbXBpbGF0aW9uVGFyZ2V0QWN0aXZpdHk7LT5tOTYoKUkKLUxhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTk3KClJCi1MYW5kcm9pZC9jdHMvY29tcGlsYXRpb24vQ29tcGlsYXRpb25UYXJnZXRBY3Rpdml0eTstPm05OCgpSQotTGFuZHJvaWQvY3RzL2NvbXBpbGF0aW9uL0NvbXBpbGF0aW9uVGFyZ2V0QWN0aXZpdHk7LT5tOTkoKUkKLUxhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTEwMCgpSQotTGFuZHJvaWQvY3RzL2NvbXBpbGF0aW9uL0NvbXBpbGF0aW9uVGFyZ2V0QWN0aXZpdHk7LT5tMTAxKClJClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorU0hMYW5kcm9pZC9jdHMvY29tcGlsYXRpb24vQ29tcGlsYXRpb25UYXJnZXRBY3Rpdml0eTstPm0wKClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTEoKUkKK1NITGFuZHJvaWQvY3RzL2NvbXBpbGF0aW9uL0NvbXBpbGF0aW9uVGFyZ2V0QWN0aXZpdHk7LT5tMigpSQorU0hMYW5kcm9pZC9jdHMvY29tcGlsYXRpb24vQ29tcGlsYXRpb25UYXJnZXRBY3Rpdml0eTstPm0zKClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTQoKUkKK1NITGFuZHJvaWQvY3RzL2NvbXBpbGF0aW9uL0NvbXBpbGF0aW9uVGFyZ2V0QWN0aXZpdHk7LT5tNSgpSQorU0hMYW5kcm9pZC9jdHMvY29tcGlsYXRpb24vQ29tcGlsYXRpb25UYXJnZXRBY3Rpdml0eTstPm02KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTcoKUkKK1NITGFuZHJvaWQvY3RzL2NvbXBpbGF0aW9uL0NvbXBpbGF0aW9uVGFyZ2V0QWN0aXZpdHk7LT5tOCgpSQorU0hMYW5kcm9pZC9jdHMvY29tcGlsYXRpb24vQ29tcGlsYXRpb25UYXJnZXRBY3Rpdml0eTstPm05KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTEwKClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTExKClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTEyKClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTEzKClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTE0KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTE1KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTE2KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTE3KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTE4KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTE5KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTIwKClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTIxKClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTIyKClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTIzKClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTI0KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTI1KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTI2KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTI3KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTI4KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTI5KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTMwKClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTMxKClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTMyKClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTMzKClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTM0KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTM1KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTM2KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTM3KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTM4KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTM5KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTQwKClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTQxKClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTQyKClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTQzKClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTQ0KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTQ1KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTQ2KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTQ3KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTQ4KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTQ5KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTUwKClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTUxKClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTUyKClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTUzKClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTU0KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTU1KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTU2KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTU3KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTU4KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTU5KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTYwKClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTYxKClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTYyKClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTYzKClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTY0KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTY1KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTY2KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTY3KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTY4KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTY5KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTcwKClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTcxKClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTcyKClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTczKClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTc0KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTc1KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTc2KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTc3KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTc4KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTc5KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTgwKClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTgxKClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTgyKClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTgzKClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTg0KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTg1KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTg2KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTg3KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTg4KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTg5KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTkwKClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTkxKClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTkyKClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTkzKClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTk0KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTk1KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTk2KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTk3KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTk4KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTk5KClJCitTSExhbmRyb2lkL2N0cy9jb21waWxhdGlvbi9Db21waWxhdGlvblRhcmdldEFjdGl2aXR5Oy0+bTEwMCgpSQorU0hMYW5kcm9pZC9jdHMvY29tcGlsYXRpb24vQ29tcGlsYXRpb25UYXJnZXRBY3Rpdml0eTstPm0xMDEoKUkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2NvbXBpbGF0aW9uL3NyYy9hbmRyb2lkL2N0cy9jb21waWxhdGlvbi9BZGJSb290RGVwZW5kZW50Q29tcGlsYXRpb25UZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2NvbXBpbGF0aW9uL3NyYy9hbmRyb2lkL2N0cy9jb21waWxhdGlvbi9BZGJSb290RGVwZW5kZW50Q29tcGlsYXRpb25UZXN0LmphdmEKaW5kZXggMWY1ZDY2OS4uNTkxZGNiNCAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9jb21waWxhdGlvbi9zcmMvYW5kcm9pZC9jdHMvY29tcGlsYXRpb24vQWRiUm9vdERlcGVuZGVudENvbXBpbGF0aW9uVGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvY29tcGlsYXRpb24vc3JjL2FuZHJvaWQvY3RzL2NvbXBpbGF0aW9uL0FkYlJvb3REZXBlbmRlbnRDb21waWxhdGlvblRlc3QuamF2YQpAQCAtMjc0LDE5ICsyNzQsMTUgQEAKICAgICAgICAgZXhlY3V0ZVB1c2goYXBrRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgdGFyZ2V0UGF0aEFwaywgdGFyZ2V0RGlyKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIHB1c2ggQVBLIGZyb20gIiwgZG9lc0ZpbGVFeGlzdCh0YXJnZXRQYXRoQXBrKSk7CiAgICAgICAgIC8vIFJ1biBwcm9mbWFuIHRvIGNyZWF0ZSB0aGUgcmVhbCBwcm9maWxlIG9uIGRldmljZS4KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyBwYXRoU3BlYyA9IGV4ZWN1dGVTdVNoZWxsQWRiQ29tbWFuZCgxLCAicG0iLCAicGF0aCIsIEFQUExJQ0FUSU9OX1BBQ0tBR0UpWzBdOwotICAgICAgICAgICAgcGF0aFNwZWMgPSBwYXRoU3BlYy5yZXBsYWNlKCJwYWNrYWdlOiIsICIiKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIkZhaWxlZCBmaW5kIEFQSyAiICsgcGF0aFNwZWMsIGRvZXNGaWxlRXhpc3QocGF0aFNwZWMpKTsKLSAgICAgICAgICAgIGV4ZWN1dGVTdVNoZWxsQWRiQ29tbWFuZCgKKyAgICAgICAgU3RyaW5nIHBhdGhTcGVjID0gZXhlY3V0ZVN1U2hlbGxBZGJDb21tYW5kKDEsICJwbSIsICJwYXRoIiwgQVBQTElDQVRJT05fUEFDS0FHRSlbMF07CisgICAgICAgIHBhdGhTcGVjID0gcGF0aFNwZWMucmVwbGFjZSgicGFja2FnZToiLCAiIik7CisgICAgICAgIGFzc2VydFRydWUoIkZhaWxlZCBmaW5kIEFQSyAiICsgcGF0aFNwZWMsIGRvZXNGaWxlRXhpc3QocGF0aFNwZWMpKTsKKyAgICAgICAgZXhlY3V0ZVN1U2hlbGxBZGJDb21tYW5kKAogICAgICAgICAgICAgICAgICJwcm9mbWFuIiwKICAgICAgICAgICAgICAgICAiLS1jcmVhdGUtcHJvZmlsZS1mcm9tPSIgKyB0YXJnZXRQYXRoVGVtcCwKICAgICAgICAgICAgICAgICAiLS1hcGs9IiArIHBhdGhTcGVjLAogICAgICAgICAgICAgICAgICItLWRleC1sb2NhdGlvbj0iICsgcGF0aFNwZWMsCiAgICAgICAgICAgICAgICAgIi0tcmVmZXJlbmNlLXByb2ZpbGUtZmlsZT0iICsgdGFyZ2V0UGF0aCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIGUudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KICAgICAgICAgZXhlY3V0ZVN1U2hlbGxBZGJDb21tYW5kKDAsICJjaG93biIsIG93bmVyLCB0YXJnZXRQYXRoKTsKICAgICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGZpbGUgd2FzIHdyaXR0ZW4gc3VjY2Vzc2Z1bGx5CiAgICAgICAgIGFzc2VydFRydWUoImZhaWxlZCB0byBjcmVhdGUgcHJvZmlsZSBmaWxlIiwgZG9lc0ZpbGVFeGlzdCh0YXJnZXRQYXRoKSk7CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2NvbnRlbnQvQW5kcm9pZFRlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9jb250ZW50L0FuZHJvaWRUZXN0LnhtbAppbmRleCBhY2NmMmE1Li5iYWRiZGE3IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2NvbnRlbnQvQW5kcm9pZFRlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvY29udGVudC9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIHRoZSBDVFMgQ29udGVudCBob3N0IHRlc3RzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iZnJhbWV3b3JrIiAvPgogICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5KYXJIb3N0VGVzdCIgPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImphciIgdmFsdWU9IkN0c1N5bmNDb250ZW50SG9zdFRlc3RDYXNlcy5qYXIiIC8+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2NvbnRlbnQvc3JjL2FuZHJvaWQvY29udGVudC9jdHMvU3luY0FkYXB0ZXJBY2NvdW50QWNjZXNzSG9zdFRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvY29udGVudC9zcmMvYW5kcm9pZC9jb250ZW50L2N0cy9TeW5jQWRhcHRlckFjY291bnRBY2Nlc3NIb3N0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmY5ZDEwLi4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvY29udGVudC9zcmMvYW5kcm9pZC9jb250ZW50L2N0cy9TeW5jQWRhcHRlckFjY291bnRBY2Nlc3NIb3N0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuY29udGVudC5jdHM7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcHNlY3VyaXR5LmN0cy5VdGlsczsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC5idWlsZC5Db21wYXRpYmlsaXR5QnVpbGRIZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuYnVpbGQuSUJ1aWxkSW5mbzsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkRldmljZVRlc3RDYXNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLklBYmk7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSUFiaVJlY2VpdmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLklCdWlsZFJlY2VpdmVyOwotCi0vKioKLSAqIFNldCBvZiB0ZXN0cyB0aGF0IHZlcmlmeSBiZWhhdmlvciBvZiB0aGUgY29udGVudCBmcmFtZXdvcmsuCi0gKi8KLXB1YmxpYyBjbGFzcyBTeW5jQWRhcHRlckFjY291bnRBY2Nlc3NIb3N0VGVzdCBleHRlbmRzIERldmljZVRlc3RDYXNlCi0gICAgICAgIGltcGxlbWVudHMgSUFiaVJlY2VpdmVyLCBJQnVpbGRSZWNlaXZlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ09VTlRfQUNDRVNTX1RFU1RTX09USEVSX0NFUlRfQVBLID0KLSAgICAgICAgICAgICJDdHNTeW5jQWNjb3VudEFjY2Vzc090aGVyQ2VydFRlc3RDYXNlcy5hcGsiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NPVU5UX0FDQ0VTU19URVNUU19PVEhFUl9DRVJUX1BLRyA9Ci0gICAgICAgICAgICAiY29tLmFuZHJvaWQuY3RzLmNvbnRlbnQiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ09VTlRfQUNDRVNTX1RFU1RTX1NBTUVfQ0VSVF9BUEsgPQotICAgICAgICAgICAgIkN0c1N5bmNBY2NvdW50QWNjZXNzU2FtZUNlcnRUZXN0Q2FzZXMuYXBrIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDT1VOVF9BQ0NFU1NfVEVTVFNfU0FNRV9DRVJUX1BLRyA9Ci0gICAgICAgICAgICAiY29tLmFuZHJvaWQuY3RzLmNvbnRlbnQiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUVUJTX0FQSyA9Ci0gICAgICAgICAgICAiQ3RzU3luY0FjY291bnRBY2Nlc3NTdHVicy5hcGsiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVFVCU19QS0cgPQotICAgICAgICAgICAgImNvbS5hbmRyb2lkLmN0cy5zdHViIjsKLQotICAgIHByaXZhdGUgSUFiaSBtQWJpOwotICAgIHByaXZhdGUgQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyIG1CdWlsZEhlbHBlcjsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEFiaShJQWJpIGFiaSkgewotICAgICAgICBtQWJpID0gYWJpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEJ1aWxkKElCdWlsZEluZm8gYnVpbGRJbmZvKSB7Ci0gICAgICAgIG1CdWlsZEhlbHBlciA9IG5ldyBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIoYnVpbGRJbmZvKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKFNUVUJTX1BLRyk7Ci0KLSAgICAgICAgYXNzZXJ0TnVsbChnZXREZXZpY2UoKS5pbnN0YWxsUGFja2FnZShtQnVpbGRIZWxwZXIKLSAgICAgICAgICAgICAgICAuZ2V0VGVzdEZpbGUoU1RVQlNfQVBLKSwgZmFsc2UsIGZhbHNlKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICAgICAgZ2V0RGV2aWNlKCkudW5pbnN0YWxsUGFja2FnZShTVFVCU19QS0cpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTYW1lQ2VydEF1dGhlbnRpY2F0b3JDYW5TZWVBY2NvdW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoQUNDT1VOVF9BQ0NFU1NfVEVTVFNfU0FNRV9DRVJUX1BLRyk7Ci0KLSAgICAgICAgYXNzZXJ0TnVsbChnZXREZXZpY2UoKS5pbnN0YWxsUGFja2FnZShtQnVpbGRIZWxwZXIuZ2V0VGVzdEZpbGUoCi0gICAgICAgICAgICAgICAgQUNDT1VOVF9BQ0NFU1NfVEVTVFNfU0FNRV9DRVJUX0FQSyksIGZhbHNlLCBmYWxzZSkpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcnVuRGV2aWNlVGVzdHMoQUNDT1VOVF9BQ0NFU1NfVEVTVFNfU0FNRV9DRVJUX1BLRywKLSAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmN0cy5jb250ZW50LkN0c1N5bmNBY2NvdW50QWNjZXNzU2FtZUNlcnRUZXN0Q2FzZXMiLAotICAgICAgICAgICAgICAgICAgICAidGVzdEFjY291bnRBY2Nlc3Nfc2FtZUNlcnRBc0F1dGhlbnRpY2F0b3JDYW5TZWVBY2NvdW50Iik7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKEFDQ09VTlRfQUNDRVNTX1RFU1RTX1NBTUVfQ0VSVF9QS0cpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE90aGVyQ2VydEF1dGhlbnRpY2F0b3JDYW5TZWVBY2NvdW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoQUNDT1VOVF9BQ0NFU1NfVEVTVFNfT1RIRVJfQ0VSVF9QS0cpOwotCi0gICAgICAgIGFzc2VydE51bGwoZ2V0RGV2aWNlKCkuaW5zdGFsbFBhY2thZ2UobUJ1aWxkSGVscGVyLmdldFRlc3RGaWxlKAotICAgICAgICAgICAgICAgIEFDQ09VTlRfQUNDRVNTX1RFU1RTX09USEVSX0NFUlRfQVBLKSwgZmFsc2UsIGZhbHNlKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBydW5EZXZpY2VUZXN0cyhBQ0NPVU5UX0FDQ0VTU19URVNUU19PVEhFUl9DRVJUX1BLRywKLSAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmN0cy5jb250ZW50LkN0c1N5bmNBY2NvdW50QWNjZXNzT3RoZXJDZXJ0VGVzdENhc2VzIiwKLSAgICAgICAgICAgICAgICAgICAgInRlc3RBY2NvdW50QWNjZXNzX290aGVyQ2VydEFzQXV0aGVudGljYXRvckNhbk5vdFNlZUFjY291bnQiKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoQUNDT1VOVF9BQ0NFU1NfVEVTVFNfT1RIRVJfQ0VSVF9QS0cpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJ1bkRldmljZVRlc3RzKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHRlc3RDbGFzc05hbWUsIFN0cmluZyB0ZXN0TWV0aG9kTmFtZSkKLSAgICAgICAgICAgIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBVdGlscy5ydW5EZXZpY2VUZXN0cyhnZXREZXZpY2UoKSwgcGFja2FnZU5hbWUsIHRlc3RDbGFzc05hbWUsIHRlc3RNZXRob2ROYW1lKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2NvbnRlbnQvdGVzdC1hcHBzL0N0c1N5bmNBY2NvdW50QWNjZXNzT3RoZXJDZXJ0VGVzdHMvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvY29udGVudC90ZXN0LWFwcHMvQ3RzU3luY0FjY291bnRBY2Nlc3NPdGhlckNlcnRUZXN0cy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTZkYTk0Li4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvY29udGVudC90ZXN0LWFwcHMvQ3RzU3luY0FjY291bnRBY2Nlc3NPdGhlckNlcnRUZXN0cy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLQotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKLSAgICBhbmRyb2lkLXN1cHBvcnQtdGVzdCBcCi0gICAgY3RzdGVzdHJ1bm5lciBcCi0gICAgdWItdWlhdXRvbWF0b3IgXAotICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwKLQotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKSBcCi0gIC4uL0N0c1N5bmNBY2NvdW50QWNjZXNzU2FtZUNlcnRUZXN0cy9zcmMvY29tL2FuZHJvaWQvY3RzL2NvbnRlbnQvU3R1YkFjdGl2aXR5LmphdmEgXAotICAuLi9DdHNTeW5jQWNjb3VudEFjY2Vzc1NhbWVDZXJ0VGVzdHMvc3JjL2NvbS9hbmRyb2lkL2N0cy9jb250ZW50L1N5bmNBZGFwdGVyLmphdmEgXAotICAuLi9DdHNTeW5jQWNjb3VudEFjY2Vzc1NhbWVDZXJ0VGVzdHMvc3JjL2NvbS9hbmRyb2lkL2N0cy9jb250ZW50L1N5bmNTZXJ2aWNlLmphdmEgXAotICAuLi9DdHNTeW5jQWNjb3VudEFjY2Vzc1NhbWVDZXJ0VGVzdHMvc3JjL2NvbS9hbmRyb2lkL2N0cy9jb250ZW50L0ZsYWt5VGVzdFJ1bGUuamF2YQotCi1MT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzU3luY0FjY291bnRBY2Nlc3NPdGhlckNlcnRUZXN0Q2FzZXMKLQotTE9DQUxfQ0VSVElGSUNBVEUgOj0gY3RzL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvY2VydHMvY3RzLXRlc3RrZXkyCi0KLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCi0KLUxPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKLQotTE9DQUxfREVYX1BSRU9QVCA6PSBmYWxzZQotCi1pbmNsdWRlICQoQlVJTERfQ1RTX1NVUFBPUlRfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvY29udGVudC90ZXN0LWFwcHMvQ3RzU3luY0FjY291bnRBY2Nlc3NPdGhlckNlcnRUZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9jb250ZW50L3Rlc3QtYXBwcy9DdHNTeW5jQWNjb3VudEFjY2Vzc090aGVyQ2VydFRlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5OGE3NWIuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9jb250ZW50L3Rlc3QtYXBwcy9DdHNTeW5jQWNjb3VudEFjY2Vzc090aGVyQ2VydFRlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5jdHMuY29udGVudCI+Ci0KLSAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkFDQ0VTU19ORVRXT1JLX1NUQVRFIi8+Ci0KLSAgICA8YXBwbGljYXRpb24+Ci0gICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgotCi0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5TdHViQWN0aXZpdHkiLz4KLQotICAgICAgICA8c2VydmljZSBhbmRyb2lkOm5hbWU9Ii5TeW5jU2VydmljZSI+Ci0gICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KLSAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5jb250ZW50LlN5bmNBZGFwdGVyIi8+Ci0gICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+Ci0gICAgICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5jb250ZW50LlN5bmNBZGFwdGVyIgotICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cmVzb3VyY2U9IkB4bWwvc3luY2FkYXB0ZXIiIC8+Ci0gICAgICAgIDwvc2VydmljZT4KLQotICAgIDwvYXBwbGljYXRpb24+Ci0KLSAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKLSAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5jdHMuY29udGVudCIgLz4KLQotPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvY29udGVudC90ZXN0LWFwcHMvQ3RzU3luY0FjY291bnRBY2Nlc3NPdGhlckNlcnRUZXN0cy9zcmMvY29tL2FuZHJvaWQvY3RzL2NvbnRlbnQvQ3RzU3luY0FjY291bnRBY2Nlc3NPdGhlckNlcnRUZXN0Q2FzZXMuamF2YSBiL2hvc3RzaWRldGVzdHMvY29udGVudC90ZXN0LWFwcHMvQ3RzU3luY0FjY291bnRBY2Nlc3NPdGhlckNlcnRUZXN0cy9zcmMvY29tL2FuZHJvaWQvY3RzL2NvbnRlbnQvQ3RzU3luY0FjY291bnRBY2Nlc3NPdGhlckNlcnRUZXN0Q2FzZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZkNzM4Ni4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL2NvbnRlbnQvdGVzdC1hcHBzL0N0c1N5bmNBY2NvdW50QWNjZXNzT3RoZXJDZXJ0VGVzdHMvc3JjL2NvbS9hbmRyb2lkL2N0cy9jb250ZW50L0N0c1N5bmNBY2NvdW50QWNjZXNzT3RoZXJDZXJ0VGVzdENhc2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuY3RzLmNvbnRlbnQ7Ci0KLWltcG9ydCBhbmRyb2lkLmFjY291bnRzLkFjY291bnQ7Ci1pbXBvcnQgYW5kcm9pZC5hY2NvdW50cy5BY2NvdW50TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyQ2xpZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU3luY1JlcXVlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LlN5bmNSZXN1bHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LmN0cy5GbGFreVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5uZXQuQ29ubmVjdGl2aXR5TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbzsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC51aWF1dG9tYXRvci5CeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC51aWF1dG9tYXRvci5VaURldmljZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC51aWF1dG9tYXRvci5VaU9iamVjdDI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QudWlhdXRvbWF0b3IuVW50aWw7Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlJ1bGU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bGVzLlRlc3RSdWxlOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBzdGF0aWMganVuaXQuZnJhbWV3b3JrLkFzc2VydC5hc3NlcnRGYWxzZTsKLWltcG9ydCBzdGF0aWMganVuaXQuZnJhbWV3b3JrLkFzc2VydC5hc3NlcnRUcnVlOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5TeXN0ZW1VdGlsOwotCi0vKioKLSAqIFRlc3RzIHdoZXRoZXIgYSBzeW5jIGFkYXB0ZXIgY2FuIGFjY2VzcyBhY2NvdW50cy4KLSAqLwotQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKLXB1YmxpYyBjbGFzcyBDdHNTeW5jQWNjb3VudEFjY2Vzc090aGVyQ2VydFRlc3RDYXNlcyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBTWU5DX1RJTUVPVVRfTUlMTElTID0gMjAwMDA7IC8vIDIwIHNlYwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVUlfVElNRU9VVF9NSUxMSVMgPSA1MDAwOyAvLyA1IHNlYwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gUEVSTUlTU0lPTl9SRVFVRVNURUQgPSBQYXR0ZXJuLmNvbXBpbGUoIl5QZXJtaXNzaW9uIHJlcXVlc3RlZC4qIik7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT0tFTl9UWVBFX1JFTU9WRV9BQ0NPVU5UUyA9ICJUT0tFTl9UWVBFX1JFTU9WRV9BQ0NPVU5UUyI7Ci0KLSAgICBAUnVsZQotICAgIHB1YmxpYyBmaW5hbCBUZXN0UnVsZSBtRmxha3lUZXN0UnVsZSA9IG5ldyBGbGFreVRlc3RSdWxlKDMpOwotCi0gICAgQEJlZm9yZQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFsbG93U3luY0FkYXB0ZXJSdW5JbkJhY2tncm91bmRBbmREYXRhSW5CYWNrZ3JvdW5kKCk7Ci0gICAgfQotCi0gICAgQEFmdGVyCi0gICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZGlzYWxsb3dTeW5jQWRhcHRlclJ1bkluQmFja2dyb3VuZEFuZERhdGFJbkJhY2tncm91bmQoKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RBY2NvdW50QWNjZXNzX290aGVyQ2VydEFzQXV0aGVudGljYXRvckNhbk5vdFNlZUFjY291bnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFoYXNEYXRhQ29ubmVjdGlvbigpIHx8ICFoYXNOb3RpZmljYXRpb25TdXBwb3J0KCkgfHwgaXNSdW5uaW5nSW5WUigpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChnZXRDb250ZXh0KCksIFN0dWJBY3Rpdml0eS5jbGFzcyk7Ci0gICAgICAgIEFjdGl2aXR5IGFjdGl2aXR5ID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkuc3RhcnRBY3Rpdml0eVN5bmMoaW50ZW50KTsKLQotICAgICAgICBBY2NvdW50TWFuYWdlciBhY2NvdW50TWFuYWdlciA9IGdldENvbnRleHQoKS5nZXRTeXN0ZW1TZXJ2aWNlKEFjY291bnRNYW5hZ2VyLmNsYXNzKTsKLSAgICAgICAgQnVuZGxlIHJlc3VsdCA9IGFjY291bnRNYW5hZ2VyLmFkZEFjY291bnQoImNvbS5zdHViIiwgbnVsbCwgbnVsbCwgbnVsbCwgYWN0aXZpdHksCi0gICAgICAgICAgICAgICAgbnVsbCwgbnVsbCkuZ2V0UmVzdWx0KCk7Ci0KLSAgICAgICAgQWNjb3VudCBhZGRlZEFjY291bnQgPSBuZXcgQWNjb3VudCgKLSAgICAgICAgICAgICAgICByZXN1bHQuZ2V0U3RyaW5nKEFjY291bnRNYW5hZ2VyLktFWV9BQ0NPVU5UX05BTUUpLAotICAgICAgICAgICAgICAgIHJlc3VsdC5nZXRTdHJpbmcoQWNjb3VudE1hbmFnZXIuS0VZX0FDQ09VTlRfVFlQRSkpOwotCi0gICAgICAgIHdhaXRGb3JTeW5jTWFuYWdlckFjY291bnRDaGFuZ2VVcGRhdGUoKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7Ci0KLSAgICAgICAgICAgIFN5bmNBZGFwdGVyLnNldE9uUGVyZm9ybVN5bmNEZWxlZ2F0ZSgoQWNjb3VudCBhY2NvdW50LCBCdW5kbGUgZXh0cmFzLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXV0aG9yaXR5LCBDb250ZW50UHJvdmlkZXJDbGllbnQgcHJvdmlkZXIsIFN5bmNSZXN1bHQgc3luY1Jlc3VsdCkKLSAgICAgICAgICAgICAgICAgICAgLT4gbGF0Y2guY291bnREb3duKCkpOwotCi0gICAgICAgICAgICBCdW5kbGUgZXh0cmFzID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgZXh0cmFzLnB1dEJvb2xlYW4oQ29udGVudFJlc29sdmVyLlNZTkNfRVhUUkFTX0RPX05PVF9SRVRSWSwgdHJ1ZSk7Ci0gICAgICAgICAgICBleHRyYXMucHV0Qm9vbGVhbihDb250ZW50UmVzb2x2ZXIuU1lOQ19FWFRSQVNfUFJJT1JJVFksIHRydWUpOwotICAgICAgICAgICAgZXh0cmFzLmdldEJvb2xlYW4oQ29udGVudFJlc29sdmVyLlNZTkNfRVhUUkFTX0lHTk9SRV9TRVRUSU5HUywgdHJ1ZSk7Ci0gICAgICAgICAgICBTeW5jUmVxdWVzdCByZXF1ZXN0ID0gbmV3IFN5bmNSZXF1ZXN0LkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgICAgICAuc2V0U3luY0FkYXB0ZXIobnVsbCwgImNvbS5hbmRyb2lkLmN0cy5zdHViLnByb3ZpZGVyIikKLSAgICAgICAgICAgICAgICAgICAgLnN5bmNPbmNlKCkKLSAgICAgICAgICAgICAgICAgICAgLnNldEV4dHJhcyhleHRyYXMpCi0gICAgICAgICAgICAgICAgICAgIC5zZXRFeHBlZGl0ZWQodHJ1ZSkKLSAgICAgICAgICAgICAgICAgICAgLnNldE1hbnVhbCh0cnVlKQotICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLSAgICAgICAgICAgIENvbnRlbnRSZXNvbHZlci5yZXF1ZXN0U3luYyhyZXF1ZXN0KTsKLQotICAgICAgICAgICAgYXNzZXJ0RmFsc2UobGF0Y2guYXdhaXQoU1lOQ19USU1FT1VUX01JTExJUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7Ci0KLSAgICAgICAgICAgIFVpRGV2aWNlIHVpRGV2aWNlID0gZ2V0VWlEZXZpY2UoKTsKLSAgICAgICAgICAgIGlmIChpc1dhdGNoKCkpIHsKLSAgICAgICAgICAgICAgICBVaU9iamVjdDIgbm90aWZpY2F0aW9uID0gZmluZFBlcm1pc3Npb25Ob3RpZmljYXRpb25JblN0cmVhbSh1aURldmljZSk7Ci0gICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLmNsaWNrKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHVpRGV2aWNlLm9wZW5Ob3RpZmljYXRpb24oKTsKLSAgICAgICAgICAgICAgICB1aURldmljZS53YWl0KFVudGlsLmhhc09iamVjdChCeS50ZXh0KFBFUk1JU1NJT05fUkVRVUVTVEVEKSksCi0gICAgICAgICAgICAgICAgICAgICAgICBVSV9USU1FT1VUX01JTExJUyk7Ci0KLSAgICAgICAgICAgICAgICB1aURldmljZS5maW5kT2JqZWN0KEJ5LnRleHQoUEVSTUlTU0lPTl9SRVFVRVNURUQpKS5jbGljaygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1aURldmljZS53YWl0KFVudGlsLmhhc09iamVjdChCeS50ZXh0KCJBTExPVyIpKSwKLSAgICAgICAgICAgICAgICAgICAgVUlfVElNRU9VVF9NSUxMSVMpOwotCi0gICAgICAgICAgICB1aURldmljZS5maW5kT2JqZWN0KEJ5LnRleHQoIkFMTE9XIikpLmNsaWNrKCk7Ci0KLSAgICAgICAgICAgIENvbnRlbnRSZXNvbHZlci5yZXF1ZXN0U3luYyhyZXF1ZXN0KTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShsYXRjaC5hd2FpdChTWU5DX1RJTUVPVVRfTUlMTElTLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIC8vIEFzayB0aGUgZGlmZmVyZW50bHkgc2lnbmVkIGF1dGhlbnRpY2F0b3IgdG8gZHJvcCBhbGwgYWNjb3VudHMKLSAgICAgICAgICAgIGFjY291bnRNYW5hZ2VyLmdldEF1dGhUb2tlbihhZGRlZEFjY291bnQsIFRPS0VOX1RZUEVfUkVNT1ZFX0FDQ09VTlRTLAotICAgICAgICAgICAgICAgICAgICBudWxsLCBmYWxzZSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICBhY3Rpdml0eS5maW5pc2goKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgVWlPYmplY3QyIGZpbmRQZXJtaXNzaW9uTm90aWZpY2F0aW9uSW5TdHJlYW0oVWlEZXZpY2UgdWlEZXZpY2UpIHsKLSAgICAgICAgdWlEZXZpY2UucHJlc3NIb21lKCk7Ci0gICAgICAgIHN3aXBlVXAodWlEZXZpY2UpOwotICAgICAgICBpZiAodWlEZXZpY2UuaGFzT2JqZWN0KEJ5LnRleHQoIlBlcm1pc3Npb24gcmVxdWVzdGVkIikpKSB7Ci0gICAgICAgICAgcmV0dXJuIHVpRGV2aWNlLmZpbmRPYmplY3QoQnkudGV4dCgiUGVybWlzc2lvbiByZXF1ZXN0ZWQiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgewotICAgICAgICAgIGlmICghc3dpcGVVcCh1aURldmljZSkpIHsKLSAgICAgICAgICAgIC8vIFdlIGhhdmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gYW5kIG5vdCBmb3VuZCB0aGUgdGFyZ2V0LgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmICh1aURldmljZS5oYXNPYmplY3QoQnkudGV4dCgiUGVybWlzc2lvbiByZXF1ZXN0ZWQiKSkpIHsKLSAgICAgICAgICAgIHJldHVybiB1aURldmljZS5maW5kT2JqZWN0KEJ5LnRleHQoIlBlcm1pc3Npb24gcmVxdWVzdGVkIikpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gc3dpcGVVcChVaURldmljZSB1aURldmljZSkgewotICAgICAgICBpbnQgd2lkdGggPSB1aURldmljZS5nZXREaXNwbGF5V2lkdGgoKTsKLSAgICAgICAgaW50IGhlaWdodCA9IHVpRGV2aWNlLmdldERpc3BsYXlIZWlnaHQoKTsKLSAgICAgICAgcmV0dXJuIHVpRGV2aWNlLnN3aXBlKAotICAgICAgICAgICAgd2lkdGggLyAyIC8qIHN0YXJ0WCAqLywKLSAgICAgICAgICAgIGhlaWdodCAtIDEgLyogc3RhcnRZICovLAotICAgICAgICAgICAgd2lkdGggLyAyIC8qIGVuZFggKi8sCi0gICAgICAgICAgICAxIC8qIGVuZFkgKi8sCi0gICAgICAgICAgICA1MCAvKiBudW1iZXJPZlN0ZXBzICovKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNXYXRjaCgpIHsKLSAgICAgICAgcmV0dXJuIChnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0Q29uZmlndXJhdGlvbigpLnVpTW9kZQotICAgICAgICAgICAgICAgICYgQ29uZmlndXJhdGlvbi5VSV9NT0RFX1RZUEVfTUFTSykgPT0gQ29uZmlndXJhdGlvbi5VSV9NT0RFX1RZUEVfV0FUQ0g7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDb250ZXh0IGdldENvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKS5nZXRDb250ZXh0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBVaURldmljZSBnZXRVaURldmljZSgpIHsKLSAgICAgICAgcmV0dXJuIFVpRGV2aWNlLmdldEluc3RhbmNlKEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgd2FpdEZvclN5bmNNYW5hZ2VyQWNjb3VudENoYW5nZVVwZGF0ZSgpIHsKLSAgICAgICAgLy8gV2FpdCBmb3IgdGhlIHN5bmMgbWFuYWdlciB0byBiZSBub3RpZmllZCBmb3IgdGhlIG5ldyBhY2NvdW50LgotICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5LCB0aGVyZSBpcyBubyB3YXkgdG8gZGV0ZWN0IHRoaXMgZXZlbnQsIHNpZ2guLi4KLSAgICAgICAgU3lzdGVtQ2xvY2suc2xlZXAoU1lOQ19USU1FT1VUX01JTExJUyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhc0RhdGFDb25uZWN0aW9uKCkgewotICAgICAgICBDb25uZWN0aXZpdHlNYW5hZ2VyIGNvbm5lY3Rpdml0eU1hbmFnZXIgPSBnZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZSgKLSAgICAgICAgICAgICAgICBDb25uZWN0aXZpdHlNYW5hZ2VyLmNsYXNzKTsKLSAgICAgICAgTmV0d29ya0luZm8gYWN0aXZlTmV0d29yayA9IGNvbm5lY3Rpdml0eU1hbmFnZXIuZ2V0QWN0aXZlTmV0d29ya0luZm8oKTsKLSAgICAgICAgcmV0dXJuIGFjdGl2ZU5ldHdvcmsgIT0gbnVsbCAmJiBhY3RpdmVOZXR3b3JrLmlzQ29ubmVjdGVkT3JDb25uZWN0aW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhc05vdGlmaWNhdGlvblN1cHBvcnQoKSB7Ci0gICAgICAgIGZpbmFsIFBhY2thZ2VNYW5hZ2VyIG1hbmFnZXIgPSBnZXRDb250ZXh0KCkuZ2V0UGFja2FnZU1hbmFnZXIoKTsKLSAgICAgICAgcmV0dXJuICFtYW5hZ2VyLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9MRUFOQkFDSykKLSAgICAgICAgICAgICAgICAmJiAhbWFuYWdlci5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfRU1CRURERUQpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhbGxvd1N5bmNBZGFwdGVyUnVuSW5CYWNrZ3JvdW5kQW5kRGF0YUluQmFja2dyb3VuZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIEFsbG93IHVzIHRvIHJ1biBpbiB0aGUgYmFja2dyb3VuZAotICAgICAgICBTeXN0ZW1VdGlsLnJ1blNoZWxsQ29tbWFuZChJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKSwKLSAgICAgICAgICAgICAgICAiY21kIGRldmljZWlkbGUgd2hpdGVsaXN0ICsiICsgZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VOYW1lKCkpOwotICAgICAgICAvLyBBbGxvdyB1cyB0byB1c2UgZGF0YSBpbiB0aGUgYmFja2dyb3VuZAotICAgICAgICBTeXN0ZW1VdGlsLnJ1blNoZWxsQ29tbWFuZChJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKSwKLSAgICAgICAgICAgICAgICAiY21kIG5ldHBvbGljeSBhZGQgcmVzdHJpY3QtYmFja2dyb3VuZC13aGl0ZWxpc3QgIiArIFByb2Nlc3MubXlVaWQoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRpc2FsbG93U3luY0FkYXB0ZXJSdW5JbkJhY2tncm91bmRBbmREYXRhSW5CYWNrZ3JvdW5kKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gQWxsb3cgdXMgdG8gcnVuIGluIHRoZSBiYWNrZ3JvdW5kCi0gICAgICAgIFN5c3RlbVV0aWwucnVuU2hlbGxDb21tYW5kKEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLAotICAgICAgICAgICAgICAgICJjbWQgZGV2aWNlaWRsZSB3aGl0ZWxpc3QgLSIgKyBnZXRDb250ZXh0KCkuZ2V0UGFja2FnZU5hbWUoKSk7Ci0gICAgICAgIC8vIEFsbG93IHVzIHRvIHVzZSBkYXRhIGluIHRoZSBiYWNrZ3JvdW5kCi0gICAgICAgIFN5c3RlbVV0aWwucnVuU2hlbGxDb21tYW5kKEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLAotICAgICAgICAgICAgICAgICJjbWQgbmV0cG9saWN5IHJlbW92ZSByZXN0cmljdC1iYWNrZ3JvdW5kLXdoaXRlbGlzdCAiICsgUHJvY2Vzcy5teVVpZCgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNSdW5uaW5nSW5WUigpIHsKLSAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0ID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0VGFyZ2V0Q29udGV4dCgpOwotICAgICAgICByZXR1cm4gKChjb250ZXh0LmdldFJlc291cmNlcygpLmdldENvbmZpZ3VyYXRpb24oKS51aU1vZGUgJgotICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLlVJX01PREVfVFlQRV9NQVNLKSA9PSBDb25maWd1cmF0aW9uLlVJX01PREVfVFlQRV9WUl9IRUFEU0VUKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvY29udGVudC90ZXN0LWFwcHMvQ3RzU3luY0FjY291bnRBY2Nlc3NTYW1lQ2VydFRlc3RzL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2NvbnRlbnQvdGVzdC1hcHBzL0N0c1N5bmNBY2NvdW50QWNjZXNzU2FtZUNlcnRUZXN0cy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTc5ZTk2Li4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvY29udGVudC90ZXN0LWFwcHMvQ3RzU3luY0FjY291bnRBY2Nlc3NTYW1lQ2VydFRlc3RzL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAotICAgIGFuZHJvaWQtc3VwcG9ydC10ZXN0IFwKLSAgICBjdHN0ZXN0cnVubmVyIFwKLSAgICB1Yi11aWF1dG9tYXRvciBcCi0gICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbAotCi1MT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCi0KLUxPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNTeW5jQWNjb3VudEFjY2Vzc1NhbWVDZXJ0VGVzdENhc2VzCi0KLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCi0KLUxPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKLQotTE9DQUxfREVYX1BSRU9QVCA6PSBmYWxzZQotCi1pbmNsdWRlICQoQlVJTERfQ1RTX1NVUFBPUlRfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvY29udGVudC90ZXN0LWFwcHMvQ3RzU3luY0FjY291bnRBY2Nlc3NTYW1lQ2VydFRlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2NvbnRlbnQvdGVzdC1hcHBzL0N0c1N5bmNBY2NvdW50QWNjZXNzU2FtZUNlcnRUZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWNkMjdkLi4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvY29udGVudC90ZXN0LWFwcHMvQ3RzU3luY0FjY291bnRBY2Nlc3NTYW1lQ2VydFRlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5jdHMuY29udGVudCI+Ci0KLSAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkFDQ0VTU19ORVRXT1JLX1NUQVRFIi8+Ci0KLSAgICA8YXBwbGljYXRpb24+Ci0gICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgotCi0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5TdHViQWN0aXZpdHkiLz4KLQotICAgICAgICA8c2VydmljZSBhbmRyb2lkOm5hbWU9Ii5TeW5jU2VydmljZSI+Ci0gICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KLSAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5jb250ZW50LlN5bmNBZGFwdGVyIi8+Ci0gICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+Ci0gICAgICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5jb250ZW50LlN5bmNBZGFwdGVyIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cmVzb3VyY2U9IkB4bWwvc3luY2FkYXB0ZXIiIC8+Ci0gICAgICAgIDwvc2VydmljZT4KLQotICAgIDwvYXBwbGljYXRpb24+Ci0KLSAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKLSAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5jdHMuY29udGVudCIgLz4KLQotPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvY29udGVudC90ZXN0LWFwcHMvQ3RzU3luY0FjY291bnRBY2Nlc3NTYW1lQ2VydFRlc3RzL3Jlcy94bWwvc3luY2FkYXB0ZXIueG1sIGIvaG9zdHNpZGV0ZXN0cy9jb250ZW50L3Rlc3QtYXBwcy9DdHNTeW5jQWNjb3VudEFjY2Vzc1NhbWVDZXJ0VGVzdHMvcmVzL3htbC9zeW5jYWRhcHRlci54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NWExOWEuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9jb250ZW50L3Rlc3QtYXBwcy9DdHNTeW5jQWNjb3VudEFjY2Vzc1NhbWVDZXJ0VGVzdHMvcmVzL3htbC9zeW5jYWRhcHRlci54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08c3luYy1hZGFwdGVyCi0gICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6Y29udGVudEF1dGhvcml0eT0iY29tLmFuZHJvaWQuY3RzLnN0dWIucHJvdmlkZXIiCi0gICAgYW5kcm9pZDphY2NvdW50VHlwZT0iY29tLnN0dWIiCi0gICAgYW5kcm9pZDp1c2VyVmlzaWJsZT0iZmFsc2UiCi0gICAgYW5kcm9pZDpzdXBwb3J0c1VwbG9hZGluZz0iZmFsc2UiCi0gICAgYW5kcm9pZDphbGxvd1BhcmFsbGVsU3luY3M9ImZhbHNlIgotICAgIGFuZHJvaWQ6aXNBbHdheXNTeW5jYWJsZT0idHJ1ZSI+Ci08L3N5bmMtYWRhcHRlcj4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvY29udGVudC90ZXN0LWFwcHMvQ3RzU3luY0FjY291bnRBY2Nlc3NTYW1lQ2VydFRlc3RzL3NyYy9jb20vYW5kcm9pZC9jdHMvY29udGVudC9DdHNTeW5jQWNjb3VudEFjY2Vzc1NhbWVDZXJ0VGVzdENhc2VzLmphdmEgYi9ob3N0c2lkZXRlc3RzL2NvbnRlbnQvdGVzdC1hcHBzL0N0c1N5bmNBY2NvdW50QWNjZXNzU2FtZUNlcnRUZXN0cy9zcmMvY29tL2FuZHJvaWQvY3RzL2NvbnRlbnQvQ3RzU3luY0FjY291bnRBY2Nlc3NTYW1lQ2VydFRlc3RDYXNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRkMDcyLi4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvY29udGVudC90ZXN0LWFwcHMvQ3RzU3luY0FjY291bnRBY2Nlc3NTYW1lQ2VydFRlc3RzL3NyYy9jb20vYW5kcm9pZC9jdHMvY29udGVudC9DdHNTeW5jQWNjb3VudEFjY2Vzc1NhbWVDZXJ0VGVzdENhc2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuY3RzLmNvbnRlbnQ7Ci0KLWltcG9ydCBzdGF0aWMganVuaXQuZnJhbWV3b3JrLkFzc2VydC5hc3NlcnRUcnVlOwotCi1pbXBvcnQgYW5kcm9pZC5hY2NvdW50cy5BY2NvdW50OwotaW1wb3J0IGFuZHJvaWQuYWNjb3VudHMuQWNjb3VudE1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlckNsaWVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LlN5bmNSZXF1ZXN0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5TeW5jUmVzdWx0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5jdHMuRmxha3lUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuQ29ubmVjdGl2aXR5TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbzsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuUnVsZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLWltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVzdFJ1bGU7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuU3lzdGVtVXRpbDsKLQotLyoqCi0gKiBUZXN0cyB3aGV0aGVyIGEgc3luYyBhZGFwdGVyIGNhbiBhY2Nlc3MgYWNjb3VudHMuCi0gKi8KLUBSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCi1wdWJsaWMgY2xhc3MgQ3RzU3luY0FjY291bnRBY2Nlc3NTYW1lQ2VydFRlc3RDYXNlcyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBTWU5DX1RJTUVPVVRfTUlMTElTID0gMjAwMDA7IC8vIDIwIHNlYwotCi0gICAgQFJ1bGUKLSAgICBwdWJsaWMgZmluYWwgVGVzdFJ1bGUgbUZsYWt5VGVzdFRSdWxlID0gbmV3IEZsYWt5VGVzdFJ1bGUoMyk7Ci0KLSAgICBAQmVmb3JlCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYWxsb3dTeW5jQWRhcHRlclJ1bkluQmFja2dyb3VuZEFuZERhdGFJbkJhY2tncm91bmQoKTsKLSAgICB9Ci0KLSAgICBAQWZ0ZXIKLSAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBkaXNhbGxvd1N5bmNBZGFwdGVyUnVuSW5CYWNrZ3JvdW5kQW5kRGF0YUluQmFja2dyb3VuZCgpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEFjY291bnRBY2Nlc3Nfc2FtZUNlcnRBc0F1dGhlbnRpY2F0b3JDYW5TZWVBY2NvdW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghaGFzRGF0YUNvbm5lY3Rpb24oKSB8fCAhaGFzTm90aWZpY2F0aW9uU3VwcG9ydCgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChnZXRDb250ZXh0KCksIFN0dWJBY3Rpdml0eS5jbGFzcyk7Ci0gICAgICAgIEFjdGl2aXR5IGFjdGl2aXR5ID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkuc3RhcnRBY3Rpdml0eVN5bmMoaW50ZW50KTsKLQotICAgICAgICBBY2NvdW50TWFuYWdlciBhY2NvdW50TWFuYWdlciA9IGdldENvbnRleHQoKS5nZXRTeXN0ZW1TZXJ2aWNlKEFjY291bnRNYW5hZ2VyLmNsYXNzKTsKLSAgICAgICAgQnVuZGxlIHJlc3VsdCA9IGFjY291bnRNYW5hZ2VyLmFkZEFjY291bnQoImNvbS5zdHViIiwgbnVsbCwgbnVsbCwgbnVsbCwgYWN0aXZpdHksCi0gICAgICAgICAgICAgICAgbnVsbCwgbnVsbCkuZ2V0UmVzdWx0KCk7Ci0KLSAgICAgICAgQWNjb3VudCBhZGRlZEFjY291bnQgPSBuZXcgQWNjb3VudCgKLSAgICAgICAgICAgICAgICByZXN1bHQuZ2V0U3RyaW5nKEFjY291bnRNYW5hZ2VyLktFWV9BQ0NPVU5UX05BTUUpLAotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldFN0cmluZyhBY2NvdW50TWFuYWdlci5LRVlfQUNDT1VOVF9UWVBFKSk7Ci0KLSAgICAgICAgd2FpdEZvclN5bmNNYW5hZ2VyQWNjb3VudENoYW5nZVVwZGF0ZSgpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKLQotICAgICAgICAgICAgU3luY0FkYXB0ZXIuc2V0T25QZXJmb3JtU3luY0RlbGVnYXRlKChBY2NvdW50IGFjY291bnQsIEJ1bmRsZSBleHRyYXMsCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdXRob3JpdHksIENvbnRlbnRQcm92aWRlckNsaWVudCBwcm92aWRlciwgU3luY1Jlc3VsdCBzeW5jUmVzdWx0KQotICAgICAgICAgICAgICAgICAgICAtPiBsYXRjaC5jb3VudERvd24oKSk7Ci0KLSAgICAgICAgICAgIEJ1bmRsZSBleHRyYXMgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICBleHRyYXMucHV0Qm9vbGVhbihDb250ZW50UmVzb2x2ZXIuU1lOQ19FWFRSQVNfRE9fTk9UX1JFVFJZLCB0cnVlKTsKLSAgICAgICAgICAgIGV4dHJhcy5wdXRCb29sZWFuKENvbnRlbnRSZXNvbHZlci5TWU5DX0VYVFJBU19QUklPUklUWSwgdHJ1ZSk7Ci0gICAgICAgICAgICBleHRyYXMuZ2V0Qm9vbGVhbihDb250ZW50UmVzb2x2ZXIuU1lOQ19FWFRSQVNfSUdOT1JFX1NFVFRJTkdTLCB0cnVlKTsKLSAgICAgICAgICAgIFN5bmNSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgU3luY1JlcXVlc3QuQnVpbGRlcigpCi0gICAgICAgICAgICAgICAgICAgIC5zZXRTeW5jQWRhcHRlcihudWxsLCAiY29tLmFuZHJvaWQuY3RzLnN0dWIucHJvdmlkZXIiKQotICAgICAgICAgICAgICAgICAgICAuc3luY09uY2UoKQotICAgICAgICAgICAgICAgICAgICAuc2V0RXh0cmFzKGV4dHJhcykKLSAgICAgICAgICAgICAgICAgICAgLnNldEV4cGVkaXRlZCh0cnVlKQotICAgICAgICAgICAgICAgICAgICAuc2V0TWFudWFsKHRydWUpCi0gICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICAgICAgICAgICAgQ29udGVudFJlc29sdmVyLnJlcXVlc3RTeW5jKHJlcXVlc3QpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGxhdGNoLmF3YWl0KFNZTkNfVElNRU9VVF9NSUxMSVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgYWNjb3VudE1hbmFnZXIucmVtb3ZlQWNjb3VudChhZGRlZEFjY291bnQsIGFjdGl2aXR5LCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgIGFjdGl2aXR5LmZpbmlzaCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDb250ZXh0IGdldENvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKS5nZXRDb250ZXh0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHdhaXRGb3JTeW5jTWFuYWdlckFjY291bnRDaGFuZ2VVcGRhdGUoKSB7Ci0gICAgICAgIC8vIFdhaXQgZm9yIHRoZSBzeW5jIG1hbmFnZXIgdG8gYmUgbm90aWZpZWQgZm9yIHRoZSBuZXcgYWNjb3VudC4KLSAgICAgICAgLy8gVW5mb3J0dW5hdGVseSwgdGhlcmUgaXMgbm8gd2F5IHRvIGRldGVjdCB0aGlzIGV2ZW50LCBzaWdoLi4uCi0gICAgICAgIFN5c3RlbUNsb2NrLnNsZWVwKFNZTkNfVElNRU9VVF9NSUxMSVMpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNEYXRhQ29ubmVjdGlvbigpIHsKLSAgICAgICAgQ29ubmVjdGl2aXR5TWFuYWdlciBjb25uZWN0aXZpdHlNYW5hZ2VyID0gZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoCi0gICAgICAgICAgICAgICAgQ29ubmVjdGl2aXR5TWFuYWdlci5jbGFzcyk7Ci0gICAgICAgIE5ldHdvcmtJbmZvIGFjdGl2ZU5ldHdvcmsgPSBjb25uZWN0aXZpdHlNYW5hZ2VyLmdldEFjdGl2ZU5ldHdvcmtJbmZvKCk7Ci0gICAgICAgIHJldHVybiBhY3RpdmVOZXR3b3JrICE9IG51bGwgJiYgYWN0aXZlTmV0d29yay5pc0Nvbm5lY3RlZE9yQ29ubmVjdGluZygpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNOb3RpZmljYXRpb25TdXBwb3J0KCkgewotICAgICAgICByZXR1cm4gIWdldENvbnRleHQoKS5nZXRQYWNrYWdlTWFuYWdlcigpCi0gICAgICAgICAgICAgICAgLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9MRUFOQkFDSyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFsbG93U3luY0FkYXB0ZXJSdW5JbkJhY2tncm91bmRBbmREYXRhSW5CYWNrZ3JvdW5kKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gQWxsb3cgdXMgdG8gcnVuIGluIHRoZSBiYWNrZ3JvdW5kCi0gICAgICAgIFN5c3RlbVV0aWwucnVuU2hlbGxDb21tYW5kKEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLAotICAgICAgICAgICAgICAgICJjbWQgZGV2aWNlaWRsZSB3aGl0ZWxpc3QgKyIgKyBnZXRDb250ZXh0KCkuZ2V0UGFja2FnZU5hbWUoKSk7Ci0gICAgICAgIC8vIEFsbG93IHVzIHRvIHVzZSBkYXRhIGluIHRoZSBiYWNrZ3JvdW5kCi0gICAgICAgIFN5c3RlbVV0aWwucnVuU2hlbGxDb21tYW5kKEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLAotICAgICAgICAgICAgICAgICJjbWQgbmV0cG9saWN5IGFkZCByZXN0cmljdC1iYWNrZ3JvdW5kLXdoaXRlbGlzdCAiICsgUHJvY2Vzcy5teVVpZCgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZGlzYWxsb3dTeW5jQWRhcHRlclJ1bkluQmFja2dyb3VuZEFuZERhdGFJbkJhY2tncm91bmQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAvLyBBbGxvdyB1cyB0byBydW4gaW4gdGhlIGJhY2tncm91bmQKLSAgICAgICAgU3lzdGVtVXRpbC5ydW5TaGVsbENvbW1hbmQoSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCksCi0gICAgICAgICAgICAgICAgImNtZCBkZXZpY2VpZGxlIHdoaXRlbGlzdCAtIiArIGdldENvbnRleHQoKS5nZXRQYWNrYWdlTmFtZSgpKTsKLSAgICAgICAgLy8gQWxsb3cgdXMgdG8gdXNlIGRhdGEgaW4gdGhlIGJhY2tncm91bmQKLSAgICAgICAgU3lzdGVtVXRpbC5ydW5TaGVsbENvbW1hbmQoSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCksCi0gICAgICAgICAgICAgICAgImNtZCBuZXRwb2xpY3kgcmVtb3ZlIHJlc3RyaWN0LWJhY2tncm91bmQtd2hpdGVsaXN0ICIgKyBQcm9jZXNzLm15VWlkKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvY29udGVudC90ZXN0LWFwcHMvQ3RzU3luY0FjY291bnRBY2Nlc3NTYW1lQ2VydFRlc3RzL3NyYy9jb20vYW5kcm9pZC9jdHMvY29udGVudC9GbGFreVRlc3RSdWxlLmphdmEgYi9ob3N0c2lkZXRlc3RzL2NvbnRlbnQvdGVzdC1hcHBzL0N0c1N5bmNBY2NvdW50QWNjZXNzU2FtZUNlcnRUZXN0cy9zcmMvY29tL2FuZHJvaWQvY3RzL2NvbnRlbnQvRmxha3lUZXN0UnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTY2NGYxLi4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvY29udGVudC90ZXN0LWFwcHMvQ3RzU3luY0FjY291bnRBY2Nlc3NTYW1lQ2VydFRlc3RzL3NyYy9jb20vYW5kcm9pZC9jdHMvY29udGVudC9GbGFreVRlc3RSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5jb250ZW50LmN0czsKLQotaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5UZXN0UnVsZTsKLWltcG9ydCBvcmcuanVuaXQucnVubmVyLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLm1vZGVsLlN0YXRlbWVudDsKLQotLyoqCi0gKiBSdWxlIGZvciBydW5uaW5nIGZsYWt5IHRlc3RzIHRoYXQgcnVucyB0aGUgdGVzdCB1cCB0byBhdHRlbXB0Ci0gKiBjb3VudCBhbmQgaWYgb25lIHJ1biBzdWNjZWVkcyByZXBvcnRzIHRoZSB0ZXN0cyBhcyBwYXNzaW5nLgotICovCi0vLyBUT0RPOiBNb3ZlIHRoaXMgcHVwcHkgaW4gYSBjb21tb24gcGxhY2UsIHNvIHBwbCBjYW4gdXNlIGl0LgotcHVibGljIGNsYXNzIEZsYWt5VGVzdFJ1bGUgaW1wbGVtZW50cyBUZXN0UnVsZSB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUF0dGVtcHRDb3VudDsKLQotICAgIHB1YmxpYyBGbGFreVRlc3RSdWxlKGludCBhdHRlbXB0Q291bnQpIHsKLSAgICAgICAgbUF0dGVtcHRDb3VudCA9IGF0dGVtcHRDb3VudDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RhdGVtZW50IGFwcGx5KFN0YXRlbWVudCBzdGF0ZW1lbnQsIERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RhdGVtZW50KCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBldmFsdWF0ZSgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICAgICAgICAgIFRocm93YWJsZSB0aHJvd2FibGUgPSBudWxsOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUF0dGVtcHRDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuZXZhbHVhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93YWJsZSA9IHQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGhyb3cgdGhyb3dhYmxlOwotICAgICAgICAgICAgfTsKLSAgICAgICAgfTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2NvbnRlbnQvdGVzdC1hcHBzL0N0c1N5bmNBY2NvdW50QWNjZXNzU2FtZUNlcnRUZXN0cy9zcmMvY29tL2FuZHJvaWQvY3RzL2NvbnRlbnQvU3luY0FkYXB0ZXIuamF2YSBiL2hvc3RzaWRldGVzdHMvY29udGVudC90ZXN0LWFwcHMvQ3RzU3luY0FjY291bnRBY2Nlc3NTYW1lQ2VydFRlc3RzL3NyYy9jb20vYW5kcm9pZC9jdHMvY29udGVudC9TeW5jQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTNhMDcwLi4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvY29udGVudC90ZXN0LWFwcHMvQ3RzU3luY0FjY291bnRBY2Nlc3NTYW1lQ2VydFRlc3RzL3NyYy9jb20vYW5kcm9pZC9jdHMvY29udGVudC9TeW5jQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuY3RzLmNvbnRlbnQ7Ci0KLWltcG9ydCBhbmRyb2lkLmFjY291bnRzLkFjY291bnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkFic3RyYWN0VGhyZWFkZWRTeW5jQWRhcHRlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyQ2xpZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5TeW5jUmVzdWx0OwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgU3luY0FkYXB0ZXIgZXh0ZW5kcyBBYnN0cmFjdFRocmVhZGVkU3luY0FkYXB0ZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBzTG9jayA9IG5ldyBPYmplY3QoKTsKLQotICAgIHByaXZhdGUgc3RhdGljIE9uUGVyZm9ybVN5bmNEZWxlZ2F0ZSBzT25QZXJmb3JtU3luY0RlbGVnYXRlOwotCi0gICAgcHVibGljIGludGVyZmFjZSBPblBlcmZvcm1TeW5jRGVsZWdhdGUgewotICAgICAgICB2b2lkIG9uUGVyZm9ybVN5bmMoQWNjb3VudCBhY2NvdW50LCBCdW5kbGUgZXh0cmFzLCBTdHJpbmcgYXV0aG9yaXR5LAotICAgICAgICAgICAgICAgIENvbnRlbnRQcm92aWRlckNsaWVudCBwcm92aWRlciwgU3luY1Jlc3VsdCBzeW5jUmVzdWx0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0T25QZXJmb3JtU3luY0RlbGVnYXRlKE9uUGVyZm9ybVN5bmNEZWxlZ2F0ZSBkZWxlZ2F0ZSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKHNMb2NrKSB7Ci0gICAgICAgICAgICBzT25QZXJmb3JtU3luY0RlbGVnYXRlID0gZGVsZWdhdGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3luY0FkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBib29sZWFuIGF1dG9Jbml0aWFsaXplKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGF1dG9Jbml0aWFsaXplKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblBlcmZvcm1TeW5jKEFjY291bnQgYWNjb3VudCwgQnVuZGxlIGV4dHJhcywgU3RyaW5nIGF1dGhvcml0eSwKLSAgICAgICAgICAgIENvbnRlbnRQcm92aWRlckNsaWVudCBwcm92aWRlciwgU3luY1Jlc3VsdCBzeW5jUmVzdWx0KSB7Ci0gICAgICAgIE9uUGVyZm9ybVN5bmNEZWxlZ2F0ZSBkZWxlZ2F0ZTsKLSAgICAgICAgc3luY2hyb25pemVkIChzTG9jaykgewotICAgICAgICAgICAgZGVsZWdhdGUgPSBzT25QZXJmb3JtU3luY0RlbGVnYXRlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkZWxlZ2F0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBkZWxlZ2F0ZS5vblBlcmZvcm1TeW5jKGFjY291bnQsIGV4dHJhcywgYXV0aG9yaXR5LCBwcm92aWRlciwgc3luY1Jlc3VsdCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2NvbnRlbnQvdGVzdC1hcHBzL0N0c1N5bmNBY2NvdW50QWNjZXNzU2FtZUNlcnRUZXN0cy9zcmMvY29tL2FuZHJvaWQvY3RzL2NvbnRlbnQvU3luY1NlcnZpY2UuamF2YSBiL2hvc3RzaWRldGVzdHMvY29udGVudC90ZXN0LWFwcHMvQ3RzU3luY0FjY291bnRBY2Nlc3NTYW1lQ2VydFRlc3RzL3NyYy9jb20vYW5kcm9pZC9jdHMvY29udGVudC9TeW5jU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGRhODJjLi4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvY29udGVudC90ZXN0LWFwcHMvQ3RzU3luY0FjY291bnRBY2Nlc3NTYW1lQ2VydFRlc3RzL3NyYy9jb20vYW5kcm9pZC9jdHMvY29udGVudC9TeW5jU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuY3RzLmNvbnRlbnQ7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5TZXJ2aWNlOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwotCi1wdWJsaWMgY2xhc3MgU3luY1NlcnZpY2UgZXh0ZW5kcyBTZXJ2aWNlIHsKLSAgICBwcml2YXRlIFN5bmNBZGFwdGVyIG1JbnN0YW5jZTsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKCkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZSgpOwotICAgICAgICBtSW5zdGFuY2UgPSBuZXcgU3luY0FkYXB0ZXIodGhpcywgZmFsc2UpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJQmluZGVyIG9uQmluZChJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgIHJldHVybiBtSW5zdGFuY2UuZ2V0U3luY0FkYXB0ZXJCaW5kZXIoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2NvbnRlbnQvdGVzdC1hcHBzL0N0c1N5bmNJbnZhbGlkQWNjb3VudEF1dGhvcml0eVRlc3RDYXNlcy9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9jb250ZW50L3Rlc3QtYXBwcy9DdHNTeW5jSW52YWxpZEFjY291bnRBdXRob3JpdHlUZXN0Q2FzZXMvQW5kcm9pZC5tawppbmRleCA5MmU4Y2RmLi4xOTZlNmM4IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2NvbnRlbnQvdGVzdC1hcHBzL0N0c1N5bmNJbnZhbGlkQWNjb3VudEF1dGhvcml0eVRlc3RDYXNlcy9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvY29udGVudC90ZXN0LWFwcHMvQ3RzU3luY0ludmFsaWRBY2NvdW50QXV0aG9yaXR5VGVzdENhc2VzL0FuZHJvaWQubWsKQEAgLTIwLDExICsyMCwxMiBAQAogCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwogCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC1zdXBwb3J0LXRlc3QgY3RzdGVzdHJ1bm5lcgorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWR4LnRlc3QucnVsZXMgY3RzdGVzdHJ1bm5lci1heHQKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzU3luY0ludmFsaWRBY2NvdW50QXV0aG9yaXR5VGVzdENhc2VzCitMT0NBTF9QUklWQVRFX1BMQVRGT1JNX0FQSVMgOj0gdHJ1ZQogCiBMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cwogCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2NvbnRlbnQvdGVzdC1hcHBzL0N0c1N5bmNJbnZhbGlkQWNjb3VudEF1dGhvcml0eVRlc3RDYXNlcy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9jb250ZW50L3Rlc3QtYXBwcy9DdHNTeW5jSW52YWxpZEFjY291bnRBdXRob3JpdHlUZXN0Q2FzZXMvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA0NmMzNGY2Li5lZDJkOGRjIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2NvbnRlbnQvdGVzdC1hcHBzL0N0c1N5bmNJbnZhbGlkQWNjb3VudEF1dGhvcml0eVRlc3RDYXNlcy9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvY29udGVudC90ZXN0LWFwcHMvQ3RzU3luY0ludmFsaWRBY2NvdW50QXV0aG9yaXR5VGVzdENhc2VzL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTM5LDYgKzM5LDYgQEAKICAgICA8L2FwcGxpY2F0aW9uPgogCiAgICAgPGluc3RydW1lbnRhdGlvbgotICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuY29udGVudC5zeW5jLmN0cyIgLz4KIDwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2NvbnRlbnQvdGVzdC1hcHBzL0N0c1N5bmNJbnZhbGlkQWNjb3VudEF1dGhvcml0eVRlc3RDYXNlcy9zcmMvYW5kcm9pZC9jb250ZW50L3N5bmMvY3RzL0ludmFsaWRTeW5jQXV0aG9yaXRpZXNEZXZpY2VUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2NvbnRlbnQvdGVzdC1hcHBzL0N0c1N5bmNJbnZhbGlkQWNjb3VudEF1dGhvcml0eVRlc3RDYXNlcy9zcmMvYW5kcm9pZC9jb250ZW50L3N5bmMvY3RzL0ludmFsaWRTeW5jQXV0aG9yaXRpZXNEZXZpY2VUZXN0LmphdmEKaW5kZXggZjkxYTM1OC4uNzM1NzQ1NiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9jb250ZW50L3Rlc3QtYXBwcy9DdHNTeW5jSW52YWxpZEFjY291bnRBdXRob3JpdHlUZXN0Q2FzZXMvc3JjL2FuZHJvaWQvY29udGVudC9zeW5jL2N0cy9JbnZhbGlkU3luY0F1dGhvcml0aWVzRGV2aWNlVGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvY29udGVudC90ZXN0LWFwcHMvQ3RzU3luY0ludmFsaWRBY2NvdW50QXV0aG9yaXR5VGVzdENhc2VzL3NyYy9hbmRyb2lkL2NvbnRlbnQvc3luYy9jdHMvSW52YWxpZFN5bmNBdXRob3JpdGllc0RldmljZVRlc3QuamF2YQpAQCAtMjMsOCArMjMsOSBAQAogaW1wb3J0IGFuZHJvaWQuYWNjb3VudHMuQWNjb3VudE1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2NvbnRlbnQvdGVzdC1hcHBzL1N5bmNBY2NvdW50QWNjZXNzU3R1YnMvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvY29udGVudC90ZXN0LWFwcHMvU3luY0FjY291bnRBY2Nlc3NTdHVicy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGI2ZmEyLi4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvY29udGVudC90ZXN0LWFwcHMvU3luY0FjY291bnRBY2Nlc3NTdHVicy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLQotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQotCi1MT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzU3luY0FjY291bnRBY2Nlc3NTdHVicwotCi1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cwotCi1MT0NBTF9QUk9HVUFSRF9FTkFCTEVEIDo9IGRpc2FibGVkCi0KLUxPQ0FMX0RFWF9QUkVPUFQgOj0gZmFsc2UKLQotaW5jbHVkZSAkKEJVSUxEX0NUU19TVVBQT1JUX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2NvbnRlbnQvdGVzdC1hcHBzL1N5bmNBY2NvdW50QWNjZXNzU3R1YnMvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvY29udGVudC90ZXN0LWFwcHMvU3luY0FjY291bnRBY2Nlc3NTdHVicy9BbmRyb2lkTWFuaWZlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmM0ZmI0Li4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvY29udGVudC90ZXN0LWFwcHMvU3luY0FjY291bnRBY2Nlc3NTdHVicy9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgcGFja2FnZT0iY29tLmFuZHJvaWQuY3RzLnN0dWIiPgotCi0gICAgPGFwcGxpY2F0aW9uPgotICAgICAgICA8c2VydmljZQotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iLlN0dWJBdXRoZW50aWNhdG9yIj4KLSAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgotICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFjY291bnRzLkFjY291bnRBdXRoZW50aWNhdG9yIi8+Ci0gICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+Ci0gICAgICAgICAgICA8bWV0YS1kYXRhCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFjY291bnRzLkFjY291bnRBdXRoZW50aWNhdG9yIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cmVzb3VyY2U9IkB4bWwvYXV0aGVudGljYXRvciIgLz4KLSAgICAgICAgPC9zZXJ2aWNlPgotCi0gICAgICAgIDxwcm92aWRlcgotICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSIuU3R1YlByb3ZpZGVyIgotICAgICAgICAgICAgYW5kcm9pZDphdXRob3JpdGllcz0iY29tLmFuZHJvaWQuY3RzLnN0dWIucHJvdmlkZXIiCi0gICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDpzeW5jYWJsZT0idHJ1ZSI+Ci0gICAgICAgIDwvcHJvdmlkZXI+Ci0KLSAgICA8L2FwcGxpY2F0aW9uPgotCi08L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9jb250ZW50L3Rlc3QtYXBwcy9TeW5jQWNjb3VudEFjY2Vzc1N0dWJzL3NyYy9jb20vYW5kcm9pZC9jdHMvc3R1Yi9TdHViQXV0aGVudGljYXRvci5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9jb250ZW50L3Rlc3QtYXBwcy9TeW5jQWNjb3VudEFjY2Vzc1N0dWJzL3NyYy9jb20vYW5kcm9pZC9jdHMvc3R1Yi9TdHViQXV0aGVudGljYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWM5ZDIxLi4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvY29udGVudC90ZXN0LWFwcHMvU3luY0FjY291bnRBY2Nlc3NTdHVicy9zcmMvY29tL2FuZHJvaWQvY3RzL3N0dWIvU3R1YkF1dGhlbnRpY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5jdHMuc3R1YjsKLQotaW1wb3J0IGFuZHJvaWQuYWNjb3VudHMuQWJzdHJhY3RBY2NvdW50QXV0aGVudGljYXRvcjsKLWltcG9ydCBhbmRyb2lkLmFjY291bnRzLkFjY291bnQ7Ci1pbXBvcnQgYW5kcm9pZC5hY2NvdW50cy5BY2NvdW50QXV0aGVudGljYXRvclJlc3BvbnNlOwotaW1wb3J0IGFuZHJvaWQuYWNjb3VudHMuQWNjb3VudE1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5hY2NvdW50cy5OZXR3b3JrRXJyb3JFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5hcHAuU2VydmljZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKLQotcHVibGljIGNsYXNzIFN0dWJBdXRoZW50aWNhdG9yIGV4dGVuZHMgU2VydmljZSB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9LRU5fVFlQRV9SRU1PVkVfQUNDT1VOVFMgPSAiVE9LRU5fVFlQRV9SRU1PVkVfQUNDT1VOVFMiOwotCi0gICAgcHJpdmF0ZSBBdXRoZW50aWNhdG9yIG1BdXRoZW50aWNhdG9yOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25DcmVhdGUoKSB7Ci0gICAgICAgIG1BdXRoZW50aWNhdG9yID0gbmV3IEF1dGhlbnRpY2F0b3IodGhpcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElCaW5kZXIgb25CaW5kKEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgcmV0dXJuIG1BdXRoZW50aWNhdG9yLmdldElCaW5kZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgY2xhc3MgQXV0aGVudGljYXRvciBleHRlbmRzIEFic3RyYWN0QWNjb3VudEF1dGhlbnRpY2F0b3IgewotICAgICAgICBwdWJsaWMgQXV0aGVudGljYXRvcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOwotICAgICAgICAgICAgcmVtb3ZlQWNjb3VudHMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQnVuZGxlIGVkaXRQcm9wZXJ0aWVzKEFjY291bnRBdXRoZW50aWNhdG9yUmVzcG9uc2UgcmVzcG9uc2UsCi0gICAgICAgICAgICAgICAgU3RyaW5nIGFjY291bnRUeXBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQnVuZGxlIGFkZEFjY291bnQoQWNjb3VudEF1dGhlbnRpY2F0b3JSZXNwb25zZSByZXNwb25zZSwKLSAgICAgICAgICAgICAgICBTdHJpbmcgYWNjb3VudFR5cGUsIFN0cmluZyB0b2tlblR5cGUsIFN0cmluZ1tdIHN0cmluZ3MsCi0gICAgICAgICAgICAgICAgQnVuZGxlIGJ1bmRsZSkgdGhyb3dzIE5ldHdvcmtFcnJvckV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBBY2NvdW50TWFuYWdlciBhY2NvdW50TWFuYWdlciA9IGdldFN5c3RlbVNlcnZpY2UoQWNjb3VudE1hbmFnZXIuY2xhc3MpOwotICAgICAgICAgICAgYWNjb3VudE1hbmFnZXIuYWRkQWNjb3VudEV4cGxpY2l0bHkobmV3IEFjY291bnQoImZvbyIsIGFjY291bnRUeXBlKSwgImJhciIsIG51bGwpOwotCi0gICAgICAgICAgICBCdW5kbGUgcmVzdWx0ID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgcmVzdWx0LnB1dFN0cmluZyhBY2NvdW50TWFuYWdlci5LRVlfQUNDT1VOVF9OQU1FLCAiZm9vIik7Ci0gICAgICAgICAgICByZXN1bHQucHV0U3RyaW5nKEFjY291bnRNYW5hZ2VyLktFWV9BQ0NPVU5UX1RZUEUsIGFjY291bnRUeXBlKTsKLSAgICAgICAgICAgIHJlc3BvbnNlLm9uUmVzdWx0KHJlc3VsdCk7Ci0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCdW5kbGUgY29uZmlybUNyZWRlbnRpYWxzKEFjY291bnRBdXRoZW50aWNhdG9yUmVzcG9uc2UgcmVzcG9uc2UsCi0gICAgICAgICAgICAgICAgQWNjb3VudCBhY2NvdW50LCBCdW5kbGUgYnVuZGxlKSB0aHJvd3MgTmV0d29ya0Vycm9yRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCdW5kbGUgZ2V0QXV0aFRva2VuKEFjY291bnRBdXRoZW50aWNhdG9yUmVzcG9uc2UgcmVzcG9uc2UsCi0gICAgICAgICAgICAgICAgQWNjb3VudCBhY2NvdW50LCBTdHJpbmcgdHlwZSwgQnVuZGxlIGJ1bmRsZSkgdGhyb3dzIE5ldHdvcmtFcnJvckV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAoVE9LRU5fVFlQRV9SRU1PVkVfQUNDT1VOVFMuZXF1YWxzKHR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlQWNjb3VudHMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXV0aFRva2VuTGFiZWwoU3RyaW5nIHRva2VuTmFtZSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJ1bmRsZSB1cGRhdGVDcmVkZW50aWFscyhBY2NvdW50QXV0aGVudGljYXRvclJlc3BvbnNlIHJlc3BvbnNlLAotICAgICAgICAgICAgICAgIEFjY291bnQgYWNjb3VudCwgU3RyaW5nIHRva2VuVHlwZSwgQnVuZGxlIGJ1bmRsZSkKLSAgICAgICAgICAgICAgICB0aHJvd3MgTmV0d29ya0Vycm9yRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCdW5kbGUgaGFzRmVhdHVyZXMoQWNjb3VudEF1dGhlbnRpY2F0b3JSZXNwb25zZSByZXNwb25zZSwKLSAgICAgICAgICAgICAgICBBY2NvdW50IGFjY291bnQsIFN0cmluZ1tdIG9wdGlvbnMpIHRocm93cyBOZXR3b3JrRXJyb3JFeGNlcHRpb24gewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJ1bmRsZSBnZXRBY2NvdW50UmVtb3ZhbEFsbG93ZWQoQWNjb3VudEF1dGhlbnRpY2F0b3JSZXNwb25zZSByZXNwb25zZSwKLSAgICAgICAgICAgICAgICBBY2NvdW50IGFjY291bnQpIHRocm93cyBOZXR3b3JrRXJyb3JFeGNlcHRpb24gewotICAgICAgICAgICAgQnVuZGxlIHJlc3VsdCA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIHJlc3VsdC5wdXRCb29sZWFuKEFjY291bnRNYW5hZ2VyLktFWV9CT09MRUFOX1JFU1VMVCwgdHJ1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHJlbW92ZUFjY291bnRzKCkgewotICAgICAgICAgICAgQWNjb3VudE1hbmFnZXIgYWNjb3VudE1hbmFnZXIgPSBnZXRTeXN0ZW1TZXJ2aWNlKEFjY291bnRNYW5hZ2VyLmNsYXNzKTsKLSAgICAgICAgICAgIGZvciAoQWNjb3VudCBhY2NvdW50IDogYWNjb3VudE1hbmFnZXIuZ2V0QWNjb3VudHMoKSkgewotICAgICAgICAgICAgICAgIGFjY291bnRNYW5hZ2VyLnJlbW92ZUFjY291bnRFeHBsaWNpdGx5KGFjY291bnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9jcHB0b29scy9BbmRyb2lkVGVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2NwcHRvb2xzL0FuZHJvaWRUZXN0LnhtbAppbmRleCA5NGExMTU0Li42ZTYwMDgwIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2NwcHRvb2xzL0FuZHJvaWRUZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2NwcHRvb2xzL0FuZHJvaWRUZXN0LnhtbApAQCAtMTQsNiArMTQsNyBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIENQUCBob3N0IHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJkZXZ0b29scyIgLz4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2VpZGxlL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2RldmljZWlkbGUvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzNkNzBmCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2VpZGxlL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMiBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEUgOj0gQ3RzRGV2aWNlSWRsZUhvc3RUZXN0Q2FzZXMKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQorCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBjdHMtdHJhZGVmZWQgdHJhZGVmZWQgY29tcGF0aWJpbGl0eS1ob3N0LXV0aWwKKworTE9DQUxfQ1RTX1RFU1RfUEFDS0FHRSA6PSBhbmRyb2lkLmRldmljZWlkbGUKKworIyB0YWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKKworaW5jbHVkZSAkKEJVSUxEX0NUU19IT1NUX0pBVkFfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlaWRsZS9BbmRyb2lkVGVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2RldmljZWlkbGUvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlY2FkZTkKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZWlkbGUvQW5kcm9pZFRlc3QueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciB0aGUgQ1RTIENvbnRlbnQgaG9zdCB0ZXN0cyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KKyAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImZyYW1ld29yayIgLz4KKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGVzdHR5cGUuSmFySG9zdFRlc3QiID4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJqYXIiIHZhbHVlPSJDdHNEZXZpY2VJZGxlSG9zdFRlc3RDYXNlcy5qYXIiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVudGltZS1oaW50IiB2YWx1ZT0iMW0iIC8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2VpZGxlL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlaWRsZS9EZXZpY2VJZGxlV2hpdGVsaXN0VGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2VpZGxlL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlaWRsZS9EZXZpY2VJZGxlV2hpdGVsaXN0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkYmExOTYKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZWlkbGUvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2VpZGxlL0RldmljZUlkbGVXaGl0ZWxpc3RUZXN0LmphdmEKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY3RzLmRldmljZWlkbGU7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOworCitpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLkRldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5sb2cuTG9nVXRpbDsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5EZXZpY2VKVW5pdDRDbGFzc1J1bm5lcjsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5qdW5pdDQuQmFzZUhvc3RKVW5pdDRUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5Bc3N1bWU7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFRlc3RzIHRoYXQgaXQgaXMgcG9zc2libGUgdG8gcmVtb3ZlIGFwcHMgZnJvbSB0aGUgc3lzdGVtIHdoaXRlbGlzdAorICovCitAUnVuV2l0aChEZXZpY2VKVW5pdDRDbGFzc1J1bm5lci5jbGFzcykKK3B1YmxpYyBjbGFzcyBEZXZpY2VJZGxlV2hpdGVsaXN0VGVzdCBleHRlbmRzIEJhc2VIb3N0SlVuaXQ0VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVWSUNFX0lETEVfQ09NTUFORF9QUkVGSVggPSAiY21kIGRldmljZWlkbGUgc3lzLXdoaXRlbGlzdCAiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNFVF9TWVNfV0hJVEVMSVNUX0NPTU1BTkQgPSAiY21kIGRldmljZWlkbGUgc3lzLXdoaXRlbGlzdCByZXNldCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1dfU1lTX1dISVRFTElTVF9DT01NQU5EID0gREVWSUNFX0lETEVfQ09NTUFORF9QUkVGSVg7CisKKyAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtT3JpZ2luYWxTeXN0ZW1XaGl0ZWxpc3Q7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZChSRVNFVF9TWVNfV0hJVEVMSVNUX0NPTU1BTkQpOworICAgICAgICBtT3JpZ2luYWxTeXN0ZW1XaGl0ZWxpc3QgPSBnZXRTeXN0ZW1XaGl0ZWxpc3QoKTsKKyAgICAgICAgaWYgKG1PcmlnaW5hbFN5c3RlbVdoaXRlbGlzdC5zaXplKCkgPCAxKSB7CisgICAgICAgICAgICBMb2dVdGlsLkNMb2cudygiTm8gcGFja2FnZXMgZm91bmQgaW4gc3lzdGVtIHdoaXRlbGlzdCIpOworICAgICAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUoZmFsc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZChSRVNFVF9TWVNfV0hJVEVMSVNUX0NPTU1BTkQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZUZyb21TeXNXaGl0ZWxpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHBhY2thZ2VUb1JlbW92ZSA9IG1PcmlnaW5hbFN5c3RlbVdoaXRlbGlzdC5nZXQoMCk7CisgICAgICAgIGdldERldmljZSgpLmV4ZWN1dGVTaGVsbENvbW1hbmQoREVWSUNFX0lETEVfQ09NTUFORF9QUkVGSVggKyAiLSIgKyBwYWNrYWdlVG9SZW1vdmUpOworICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gbmV3V2hpdGVsaXN0ID0gZ2V0U3lzdGVtV2hpdGVsaXN0KCk7CisgICAgICAgIGFzc2VydEZhbHNlKCJQYWNrYWdlICIgKyBwYWNrYWdlVG9SZW1vdmUgKyAiIG5vdCByZW1vdmVkIGZyb20gd2hpdGVsaXN0IiwKKyAgICAgICAgICAgICAgICBuZXdXaGl0ZWxpc3QuY29udGFpbnMocGFja2FnZVRvUmVtb3ZlKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3Zlc1BlcnNpc3RlZEFjcm9zc1JlYm9vdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtT3JpZ2luYWxTeXN0ZW1XaGl0ZWxpc3Quc2l6ZSgpOyBpKz0yKSB7CisgICAgICAgICAgICAvLyByZW1vdmUgb2RkIGluZGV4ZWQgcGFja2FnZXMgZnJvbSB0aGUgd2hpdGVsaXN0CisgICAgICAgICAgICBnZXREZXZpY2UoKS5leGVjdXRlU2hlbGxDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICBERVZJQ0VfSURMRV9DT01NQU5EX1BSRUZJWCArICItIiArIG1PcmlnaW5hbFN5c3RlbVdoaXRlbGlzdC5nZXQoaSkpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiB3aGl0ZWxpc3RCZWZvcmVSZWJvb3QgPSBnZXRTeXN0ZW1XaGl0ZWxpc3QoKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKDEwXzAwMCk7IC8vIHdyaXRlIHRvIGRpc2sgaGFwcGVucyBhZnRlciA1IHNlY29uZHMKKyAgICAgICAgZ2V0RGV2aWNlKCkucmVib290KCk7CisgICAgICAgIFRocmVhZC5zbGVlcCg1XzAwMCk7IC8vIHRvIG1ha2Ugc3VyZSBzZXJ2aWNlIGlzIGluaXRpYWxpemVkCisgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiB3aGl0ZWxpc3RBZnRlclJlYm9vdCA9IGdldFN5c3RlbVdoaXRlbGlzdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMod2hpdGVsaXN0QmVmb3JlUmVib290LnNpemUoKSwgd2hpdGVsaXN0QWZ0ZXJSZWJvb3Quc2l6ZSgpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3aGl0ZWxpc3RCZWZvcmVSZWJvb3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUod2hpdGVsaXN0QWZ0ZXJSZWJvb3QuY29udGFpbnMod2hpdGVsaXN0QmVmb3JlUmVib290LmdldChpKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gZ2V0U3lzdGVtV2hpdGVsaXN0KCkgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBvdXRwdXQgPSBnZXREZXZpY2UoKS5leGVjdXRlU2hlbGxDb21tYW5kKFNIT1dfU1lTX1dISVRFTElTVF9DT01NQU5EKS50cmltKCk7CisgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBwYWNrYWdlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBmb3IgKFN0cmluZyBsaW5lIDogb3V0cHV0LnNwbGl0KCJcbiIpKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgaSA9IGxpbmUuaW5kZXhPZignLCcpOworICAgICAgICAgICAgcGFja2FnZXMuYWRkKGxpbmUuc3Vic3RyaW5nKDAsIGkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGFja2FnZXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L0FuZHJvaWQubWsKaW5kZXggOWNiZDQ5ZS4uZjlhODYxYyAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9BbmRyb2lkLm1rCkBAIC0yNyw3ICsyNywxMCBAQAogTE9DQUxfQ1RTX1RFU1RfUEFDS0FHRSA6PSBhbmRyb2lkLmFkbWluaG9zdHNpZGUKIAogIyB0YWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIGFyY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCisKKyMgTmVlZCB0aGUgZGVwZW5kZW5jeSB0byBidWlsZC9ydW4gdGhlIG1vZHVsZSBzb2xlbHkgYnkgYXRlc3QuCitMT0NBTF9BRERJVElPTkFMX0RFUEVOREVOQ0lFUyA6PSAkKFRBUkdFVF9PVVRfVEVTVENBU0VTKS9jdHMtY3VycmVudC1hcGkvY3VycmVudC5hcGkKIAogaW5jbHVkZSAkKEJVSUxEX0NUU19IT1NUX0pBVkFfTElCUkFSWSkKIApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvQW5kcm9pZFRlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvQW5kcm9pZFRlc3QueG1sCmluZGV4IDUxNzExZGQuLjZmYzM4YzggMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L0FuZHJvaWRUZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIHRoZSBDVFMgRGV2aWNlIFBvbGljeSBob3N0IHRlc3RzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iZnJhbWV3b3JrIiAvPgogCiAgICAgPCEtLSBQdXNoIHRoZSBsaXN0IG9mIHB1YmxpYyBBUElzIHRvIGRldmljZSAtLT4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9BY2NvdW50Q2hlY2svQXV0aC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0FjY291bnRDaGVjay9BdXRoL0FuZHJvaWQubWsKaW5kZXggMDg3MzMzNC4uYjIyM2IzNyAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0FjY291bnRDaGVjay9BdXRoL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0FjY291bnRDaGVjay9BdXRoL0FuZHJvaWQubWsKQEAgLTI4LDEzICsyOCwxMiBAQAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogCiBMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAotICAgIGFuZHJvaWQtc3VwcG9ydC12NCAgXAotICAgIGN0c3Rlc3RydW5uZXIgIFwKKyAgICBhbmRyb2lkeC5sZWdhY3lfbGVnYWN5LXN1cHBvcnQtdjQgIFwKKyAgICBjdHN0ZXN0cnVubmVyLWF4dCAgXAogICAgIHViLXVpYXV0b21hdG9yICBcCi0gICAgYW5kcm9pZC1zdXBwb3J0LXRlc3QgXAotICAgIGxlZ2FjeS1hbmRyb2lkLXRlc3QKKyAgICBhbmRyb2lkeC50ZXN0LnJ1bGVzCiAKLUxPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGxlZ2FjeS1hbmRyb2lkLXRlc3QKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCiAKIExPQ0FMX1NES19WRVJTSU9OIDo9IHRlc3RfY3VycmVudAogCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvQWNjb3VudENoZWNrL0F1dGgvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9BY2NvdW50Q2hlY2svQXV0aC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDFmNDg4ZTUuLjdhZjY1NDYgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9BY2NvdW50Q2hlY2svQXV0aC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9BY2NvdW50Q2hlY2svQXV0aC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yNyw2ICsyNyw4IEBACiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5NQU5BR0VfQUNDT1VOVFMiIC8+CiAKICAgICA8YXBwbGljYXRpb24+CisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgorCiAgICAgICAgIDxzZXJ2aWNlIGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuY3RzLmRldmljZXBvbGljeS5hY2NvdW50Y2hlY2suVGVzdEF1dGhlbnRpY2F0b3IiCiAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIj4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgpAQCAtMzksNyArNDEsNyBAQAogICAgIDwvYXBwbGljYXRpb24+CiAKICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmFuZHJvaWQuY3RzLmRldmljZXBvbGljeS5hY2NvdW50Y2hlY2suYXV0aCIgLz4KIDwvbWFuaWZlc3Q+CiAKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9BY2NvdW50Q2hlY2svTm9uVGVzdE9ubHlPd25lci9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0FjY291bnRDaGVjay9Ob25UZXN0T25seU93bmVyL0FuZHJvaWQubWsKaW5kZXggYThjMGRiZS4uMDA2NThlMSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0FjY291bnRDaGVjay9Ob25UZXN0T25seU93bmVyL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0FjY291bnRDaGVjay9Ob25UZXN0T25seU93bmVyL0FuZHJvaWQubWsKQEAgLTI3LDcgKzI3LDcgQEAKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgLi4vc3JjLW93bmVyKQogCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC1zdXBwb3J0LXY0IGN0c3Rlc3RydW5uZXIgdWItdWlhdXRvbWF0b3IgYW5kcm9pZC1zdXBwb3J0LXRlc3QKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkeC5sZWdhY3lfbGVnYWN5LXN1cHBvcnQtdjQgY3RzdGVzdHJ1bm5lci1heHQgdWItdWlhdXRvbWF0b3IgYW5kcm9pZHgudGVzdC5ydWxlcwogCiBMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CiAKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9BY2NvdW50Q2hlY2svVGVzdE9ubHlPd25lci9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0FjY291bnRDaGVjay9UZXN0T25seU93bmVyL0FuZHJvaWQubWsKaW5kZXggYzUwMmZlOC4uMGNjOGRlYiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0FjY291bnRDaGVjay9UZXN0T25seU93bmVyL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0FjY291bnRDaGVjay9UZXN0T25seU93bmVyL0FuZHJvaWQubWsKQEAgLTI3LDcgKzI3LDcgQEAKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgLi4vc3JjLW93bmVyKQogCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC1zdXBwb3J0LXY0IGN0c3Rlc3RydW5uZXIgdWItdWlhdXRvbWF0b3IgYW5kcm9pZC1zdXBwb3J0LXRlc3QKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkeC5sZWdhY3lfbGVnYWN5LXN1cHBvcnQtdjQgY3RzdGVzdHJ1bm5lci1heHQgdWItdWlhdXRvbWF0b3IgYW5kcm9pZHgudGVzdC5ydWxlcwogCiBMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CiAKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9BY2NvdW50Q2hlY2svVGVzdE9ubHlPd25lclVwZGF0ZS9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0FjY291bnRDaGVjay9UZXN0T25seU93bmVyVXBkYXRlL0FuZHJvaWQubWsKaW5kZXggYzA1ZDlkMS4uZmQ0MDQ5OCAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0FjY291bnRDaGVjay9UZXN0T25seU93bmVyVXBkYXRlL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0FjY291bnRDaGVjay9UZXN0T25seU93bmVyVXBkYXRlL0FuZHJvaWQubWsKQEAgLTI3LDcgKzI3LDcgQEAKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgLi4vc3JjLW93bmVyKQogCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC1zdXBwb3J0LXY0IGN0c3Rlc3RydW5uZXIgdWItdWlhdXRvbWF0b3IgYW5kcm9pZC1zdXBwb3J0LXRlc3QKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkeC5sZWdhY3lfbGVnYWN5LXN1cHBvcnQtdjQgY3RzdGVzdHJ1bm5lci1heHQgdWItdWlhdXRvbWF0b3IgYW5kcm9pZHgudGVzdC5ydWxlcwogCiBMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CiAKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9BY2NvdW50Q2hlY2svVGVzdGVyL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvQWNjb3VudENoZWNrL1Rlc3Rlci9BbmRyb2lkLm1rCmluZGV4IGQ2NmM2YmQuLmE4NGI1YmMgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9BY2NvdW50Q2hlY2svVGVzdGVyL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0FjY291bnRDaGVjay9UZXN0ZXIvQW5kcm9pZC5tawpAQCAtMjcsNyArMjcsNyBAQAogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLXN1cHBvcnQtdjQgY3RzdGVzdHJ1bm5lciB1Yi11aWF1dG9tYXRvciBhbmRyb2lkLXN1cHBvcnQtdGVzdAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWR4LmxlZ2FjeV9sZWdhY3ktc3VwcG9ydC12NCBjdHN0ZXN0cnVubmVyLWF4dCB1Yi11aWF1dG9tYXRvciBhbmRyb2lkeC50ZXN0LnJ1bGVzCiAKIExPQ0FMX1NES19WRVJTSU9OIDo9IHRlc3RfY3VycmVudAogCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvQWNjb3VudENoZWNrL1Rlc3Rlci9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0FjY291bnRDaGVjay9UZXN0ZXIvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBhNmVhNGFhLi5mZTVmYjJkYyAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0FjY291bnRDaGVjay9UZXN0ZXIvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvQWNjb3VudENoZWNrL1Rlc3Rlci9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0zOCw3ICszOCw3IEBACiAgICAgPC9hcHBsaWNhdGlvbj4KIAogICAgIDxpbnN0cnVtZW50YXRpb24KLSAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5jdHMuZGV2aWNlcG9saWN5LmFjY291bnRjaGVjay5hdXRoIiAvPgogPC9tYW5pZmVzdD4KIApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0FjY291bnRNYW5hZ2VtZW50L0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvQWNjb3VudE1hbmFnZW1lbnQvQW5kcm9pZC5tawppbmRleCBiN2Q5OWJmLi4yY2U2YzVkIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvQWNjb3VudE1hbmFnZW1lbnQvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvQWNjb3VudE1hbmFnZW1lbnQvQW5kcm9pZC5tawpAQCAtMTcsNyArMTcsNyBAQAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKICMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGFyY3RzIGN0cyB2dHMgZ2VuZXJhbC10ZXN0cwogCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzQWNjb3VudE1hbmFnZW1lbnREZXZpY2VQb2xpY3lBcHAKIApAQCAtMjgsMTEgKzI4LDEyIEBACiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCi0gICAgYW5kcm9pZC1zdXBwb3J0LXY0IFwKLSAgICBjdHN0ZXN0cnVubmVyIFwKKyAgICBhbmRyb2lkeC5sZWdhY3lfbGVnYWN5LXN1cHBvcnQtdjQgXAorICAgIGN0c3Rlc3RydW5uZXItYXh0IFwKICAgICB1Yi11aWF1dG9tYXRvciBcCi0gICAgYW5kcm9pZC1zdXBwb3J0LXRlc3QgXAotICAgIGxlZ2FjeS1hbmRyb2lkLXRlc3QKKyAgICBhbmRyb2lkeC50ZXN0LnJ1bGVzCisKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCiAKIExPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKIApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0FjY291bnRNYW5hZ2VtZW50L0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvQWNjb3VudE1hbmFnZW1lbnQvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBiMWUxYjUzLi5jOTUxZDJhIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvQWNjb3VudE1hbmFnZW1lbnQvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvQWNjb3VudE1hbmFnZW1lbnQvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjIsNiArMjIsOCBAQAogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uTUFOQUdFX0FDQ09VTlRTIiAvPgogCiAgICAgPGFwcGxpY2F0aW9uPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKwogICAgICAgICA8c2VydmljZSBhbmRyb2lkOm5hbWU9Ii5Nb2NrQWNjb3VudFNlcnZpY2UiIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYWNjb3VudHMuQWNjb3VudEF1dGhlbnRpY2F0b3IiIC8+CkBAIC0zMyw3ICszNSw3IEBACiAgICAgPC9hcHBsaWNhdGlvbj4KIAogICAgIDxpbnN0cnVtZW50YXRpb24KLSAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5jdHMuZGV2aWNlcG9saWN5LmFjY291bnRtYW5hZ2VtZW50IgogICAgICAgICBhbmRyb2lkOmxhYmVsPSJBY2NvdW50IHBvbGljeSBDVFMgVGVzdHMiIC8+CiA8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0FwcFJlc3RyaWN0aW9uc1RhcmdldEFwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0FwcFJlc3RyaWN0aW9uc1RhcmdldEFwcC9BbmRyb2lkLm1rCmluZGV4IDgxYjYzYjIuLjc4Nzk1Y2YgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9BcHBSZXN0cmljdGlvbnNUYXJnZXRBcHAvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvQXBwUmVzdHJpY3Rpb25zVGFyZ2V0QXBwL0FuZHJvaWQubWsKQEAgLTI3LDYgKzI3LDYgQEAKIExPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKIAogIyB0YWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gYXJjdHMgY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiAKIGluY2x1ZGUgJChCVUlMRF9DVFNfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9Bc3Npc3RhbnQvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9Bc3Npc3RhbnQvQW5kcm9pZC5tawppbmRleCA4NjE0NGEyLi42YjE2ZDQwIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvQXNzaXN0YW50L0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0Fzc2lzdGFudC9BbmRyb2lkLm1rCkBAIC0yOSw3ICsyOSwxMSBAQAogCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzRGV2aWNlUG9saWN5QXNzaXN0QXBwCiAKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA9IGFuZHJvaWQtc3VwcG9ydC12NCBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsIGFuZHJvaWQtc3VwcG9ydC10ZXN0CitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAorICAgIGFuZHJvaWR4LmxlZ2FjeV9sZWdhY3ktc3VwcG9ydC12NCBcCisgICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgXAorICAgIGFuZHJvaWR4LnRlc3QucnVsZXMgXAorCiAKIExPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKIApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0Fzc2lzdGFudC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0Fzc2lzdGFudC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDVmYzIwZGUuLmY0ZDQyYWEgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9Bc3Npc3RhbnQvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvQXNzaXN0YW50L0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTE5LDYgKzE5LDggQEAKICAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5jdHMuZGV2aWNlcG9saWN5LmFzc2lzdGFwcCIgPgogCiAgICAgPGFwcGxpY2F0aW9uPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKwogCiAgICAgICAgIDxzZXJ2aWNlIGFuZHJvaWQ6bmFtZT0iLk15SW50ZXJhY3Rpb25TZXJ2aWNlIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0IHZvaWNlIGludGVyYWN0aW9uIHNlcnZpY2UiCkBAIC00MSw4ICs0Myw4IEBACiAgICAgPC9hcHBsaWNhdGlvbj4KIAogICAgIDxpbnN0cnVtZW50YXRpb24KLSAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5jdHMuZGV2aWNlcG9saWN5LmFzc2lzdGFwcCIKICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkFzc2lzdGFudCByZWxhdGVkIGRldmljZSBwb2xpY3kgQ1RTIiAvPgogCi08L21hbmlmZXN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvQXV0b2ZpbGxBcHAvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9BdXRvZmlsbEFwcC9BbmRyb2lkLm1rCmluZGV4IDUyMmIxOTYuLjgwYThiNjAgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9BdXRvZmlsbEFwcC9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9BdXRvZmlsbEFwcC9BbmRyb2lkLm1rCkBAIC0zMiw2ICszMiw2IEBACiBMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CiAKICMgdGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGFyY3RzIGN0cyB2dHMgZ2VuZXJhbC10ZXN0cwogCiBpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvQXV0b2ZpbGxBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9BdXRvZmlsbEFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGNmNmI2ZTguLjcxMWY5ODQgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9BdXRvZmlsbEFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9BdXRvZmlsbEFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yOCw3ICsyOCw3IEBACiAKICAgICAgICAgPHNlcnZpY2UKICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iLlNpbXBsZUF1dG9maWxsU2VydmljZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6cGVybWlzc2lvbj0iYW5kcm9pZC5wZXJtaXNzaW9uLkJJTkRfQVVUT0ZJTEwiID4KKyAgICAgICAgICAgIGFuZHJvaWQ6cGVybWlzc2lvbj0iYW5kcm9pZC5wZXJtaXNzaW9uLkJJTkRfQVVUT0ZJTExfU0VSVklDRSIgPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc2VydmljZS5hdXRvZmlsbC5BdXRvZmlsbFNlcnZpY2UiIC8+CiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvQ2VydEluc3RhbGxlci9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0NlcnRJbnN0YWxsZXIvQW5kcm9pZC5tawppbmRleCAyM2ViMWY3Li44NjQ0MGZjIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvQ2VydEluc3RhbGxlci9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9DZXJ0SW5zdGFsbGVyL0FuZHJvaWQubWsKQEAgLTI0LDcgKzI0LDcgQEAKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogCi1MT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzCiAKIExPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKIApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0NvcnBPd25lZE1hbmFnZWRQcm9maWxlL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvQ29ycE93bmVkTWFuYWdlZFByb2ZpbGUvQW5kcm9pZC5tawppbmRleCBjODg3MmI0Li5jMmZkYjVmIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvQ29ycE93bmVkTWFuYWdlZFByb2ZpbGUvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvQ29ycE93bmVkTWFuYWdlZFByb2ZpbGUvQW5kcm9pZC5tawpAQCAtMzIsOSArMzIsOSBAQAogCiBMT0NBTF9BSURMX0lOQ0xVREVTIDo9ICQoTE9DQUxfUEFUSCkvc3JjCiAKLUxPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIgY3RzLWp1bml0CitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzIGN0cy1qdW5pdCBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicwogCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY3RzdGVzdHJ1bm5lciBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY3RzdGVzdHJ1bm5lci1heHQgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQKIAogTE9DQUxfU0RLX1ZFUlNJT04gOj0gdGVzdF9jdXJyZW50CiAKQEAgLTU3LDkgKzU3LDkgQEAKIAogTE9DQUxfQUlETF9JTkNMVURFUyA6PSAkKExPQ0FMX1BBVEgpL3NyYwogCi1MT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyIGN0cy1qdW5pdAorTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lci5zdHVicyBjdHMtanVuaXQgYW5kcm9pZC50ZXN0LmJhc2Uuc3R1YnMKIAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGN0c3Rlc3RydW5uZXIgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGN0c3Rlc3RydW5uZXItYXh0IGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0CiAKIExPQ0FMX1NES19WRVJTSU9OIDo9IHRlc3RfY3VycmVudAogCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvQ29ycE93bmVkTWFuYWdlZFByb2ZpbGUvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9Db3JwT3duZWRNYW5hZ2VkUHJvZmlsZS9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDgyMGYxYmUuLmYyM2E2OTIgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9Db3JwT3duZWRNYW5hZ2VkUHJvZmlsZS9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9Db3JwT3duZWRNYW5hZ2VkUHJvZmlsZS9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC00Nyw3ICs0Nyw3IEBACiAgICAgICAgIDwvc2VydmljZT4KICAgICA8L2FwcGxpY2F0aW9uPgogCi0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmFuZHJvaWQuY3RzLmNvbXAiCiAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJDb3JwIG93bmVkIG1hbmFnZWQgcHJvZmlsZSBDVFMgdGVzdHMiLz4KIDwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvQ29ycE93bmVkTWFuYWdlZFByb2ZpbGUvc3JjL2NvbS9hbmRyb2lkL2N0cy9jb21wL0lDcm9zc1VzZXJTZXJ2aWNlLmFpZGwgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvQ29ycE93bmVkTWFuYWdlZFByb2ZpbGUvc3JjL2NvbS9hbmRyb2lkL2N0cy9jb21wL0lDcm9zc1VzZXJTZXJ2aWNlLmFpZGwKaW5kZXggYmM4ZDNkMy4uOTM4ZWUwNyAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0NvcnBPd25lZE1hbmFnZWRQcm9maWxlL3NyYy9jb20vYW5kcm9pZC9jdHMvY29tcC9JQ3Jvc3NVc2VyU2VydmljZS5haWRsCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9Db3JwT3duZWRNYW5hZ2VkUHJvZmlsZS9zcmMvY29tL2FuZHJvaWQvY3RzL2NvbXAvSUNyb3NzVXNlclNlcnZpY2UuYWlkbApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9Db3JwT3duZWRNYW5hZ2VkUHJvZmlsZS9zcmMvY29tL2FuZHJvaWQvY3RzL2NvbXAvTWFuYWdlbWVudFRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9Db3JwT3duZWRNYW5hZ2VkUHJvZmlsZS9zcmMvY29tL2FuZHJvaWQvY3RzL2NvbXAvTWFuYWdlbWVudFRlc3QuamF2YQppbmRleCBiNzIyMGJlLi5mNjI2N2NhIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvQ29ycE93bmVkTWFuYWdlZFByb2ZpbGUvc3JjL2NvbS9hbmRyb2lkL2N0cy9jb21wL01hbmFnZW1lbnRUZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0NvcnBPd25lZE1hbmFnZWRQcm9maWxlL3NyYy9jb20vYW5kcm9pZC9jdHMvY29tcC9NYW5hZ2VtZW50VGVzdC5qYXZhCkBAIC0xOSw2ICsxOSw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5Vc2VySGFuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuVXNlck1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLnRlc3QuTW9yZUFzc2VydHM7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CkBAIC05Nyw0ICs5OCwyNSBAQAogICAgICAgICBNb3JlQXNzZXJ0cy5hc3NlcnRFbXB0eShtRGV2aWNlUG9saWN5TWFuYWdlci5nZXRCaW5kRGV2aWNlQWRtaW5UYXJnZXRVc2VycygKICAgICAgICAgICAgICAgICBBZG1pblJlY2VpdmVyLmdldENvbXBvbmVudE5hbWUobUNvbnRleHQpKSk7CiAgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENhbm5vdFN0YXJ0TWFuYWdlZFByb2ZpbGVJbkJhY2tncm91bmQoKSB7CisgICAgICAgIFVzZXJIYW5kbGUgcHJvZmlsZVVzZXJIYW5kbGUgPSBVdGlscy5nZXRPdGhlclByb2ZpbGUobUNvbnRleHQpOworICAgICAgICBhc3NlcnROb3ROdWxsKHByb2ZpbGVVc2VySGFuZGxlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFVzZXJNYW5hZ2VyLlVTRVJfT1BFUkFUSU9OX0VSUk9SX01BTkFHRURfUFJPRklMRSwKKyAgICAgICAgICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5zdGFydFVzZXJJbkJhY2tncm91bmQoQWRtaW5SZWNlaXZlci5nZXRDb21wb25lbnROYW1lKG1Db250ZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVVc2VySGFuZGxlKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENhbm5vdFN0b3BNYW5hZ2VkUHJvZmlsZSgpIHsKKyAgICAgICAgVXNlckhhbmRsZSBwcm9maWxlVXNlckhhbmRsZSA9IFV0aWxzLmdldE90aGVyUHJvZmlsZShtQ29udGV4dCk7CisgICAgICAgIGFzc2VydE5vdE51bGwocHJvZmlsZVVzZXJIYW5kbGUpOworICAgICAgICBhc3NlcnRFcXVhbHMoVXNlck1hbmFnZXIuVVNFUl9PUEVSQVRJT05fRVJST1JfTUFOQUdFRF9QUk9GSUxFLAorICAgICAgICAgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnN0b3BVc2VyKEFkbWluUmVjZWl2ZXIuZ2V0Q29tcG9uZW50TmFtZShtQ29udGV4dCksCisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlVXNlckhhbmRsZSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDYW5ub3RMb2dvdXRNYW5hZ2VkUHJvZmlsZSgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFVzZXJNYW5hZ2VyLlVTRVJfT1BFUkFUSU9OX0VSUk9SX01BTkFHRURfUFJPRklMRSwKKyAgICAgICAgICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5sb2dvdXRVc2VyKEFkbWluUmVjZWl2ZXIuZ2V0Q29tcG9uZW50TmFtZShtQ29udGV4dCkpKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvQ29ycE93bmVkTWFuYWdlZFByb2ZpbGUvc3JjL2NvbS9hbmRyb2lkL2N0cy9jb21wL1V0aWxzLmphdmEgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvQ29ycE93bmVkTWFuYWdlZFByb2ZpbGUvc3JjL2NvbS9hbmRyb2lkL2N0cy9jb21wL1V0aWxzLmphdmEKaW5kZXggNDlmN2UxZS4uNDM1MDhjMSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0NvcnBPd25lZE1hbmFnZWRQcm9maWxlL3NyYy9jb20vYW5kcm9pZC9jdHMvY29tcC9VdGlscy5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9Db3JwT3duZWRNYW5hZ2VkUHJvZmlsZS9zcmMvY29tL2FuZHJvaWQvY3RzL2NvbXAvVXRpbHMuamF2YQpAQCAtMTksNyArMTksNyBAQAogaW1wb3J0IGFuZHJvaWQub3MuUHJvY2VzczsKIGltcG9ydCBhbmRyb2lkLm9zLlVzZXJIYW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5Vc2VyTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk51bGxhYmxlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9Dcm9zc1Byb2ZpbGVBcHBzVGVzdC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0Nyb3NzUHJvZmlsZUFwcHNUZXN0L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIzOWY2YwotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9Dcm9zc1Byb2ZpbGVBcHBzVGVzdC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNDEgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0Nyb3NzUHJvZmlsZUFwcHNUZXN0cworCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCisKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGN0cy1qdW5pdAorCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgPSBcCisJYW5kcm9pZHgubGVnYWN5X2xlZ2FjeS1zdXBwb3J0LXY0IFwKKwljdHN0ZXN0cnVubmVyLWF4dCBcCisJYW5kcm9pZHgudGVzdC5ydWxlcyBcCisJdHJ1dGgtcHJlYnVpbHQgXAorCXViLXVpYXV0b21hdG9yCisKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKKworIyB0YWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKKworaW5jbHVkZSAkKEJVSUxEX0NUU19QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0Nyb3NzUHJvZmlsZUFwcHNUZXN0L0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvQ3Jvc3NQcm9maWxlQXBwc1Rlc3QvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODlmNTRjCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0Nyb3NzUHJvZmlsZUFwcHNUZXN0L0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSw0NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5jdHMuY3Jvc3Nwcm9maWxlYXBwc3Rlc3QiPgorCisgICAgPHVzZXMtc2RrIGFuZHJvaWQ6bWluU2RrVmVyc2lvbj0iMjEiIGFuZHJvaWQ6dGFyZ2V0U2RrVmVyc2lvbj0iMjUiLz4KKworICAgIDxhcHBsaWNhdGlvbj4KKyAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5NYWluQWN0aXZpdHkiIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIi8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5ERUZBVUxUIi8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLk5vbk1haW5BY3Rpdml0eSIgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIvPgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5Ob25FeHBvcnRlZEFjdGl2aXR5IiBhbmRyb2lkOmV4cG9ydGVkPSJmYWxzZSI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkRFRkFVTFQiLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmFuZHJvaWQuY3RzLmNyb3NzcHJvZmlsZWFwcHN0ZXN0IgorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iTGF1bmNoZXIgQXBwcyBDVFMgVGVzdHMiLz4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvQ3Jvc3NQcm9maWxlQXBwc1Rlc3QvcmVzL2xheW91dC9tYWluLnhtbCBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9Dcm9zc1Byb2ZpbGVBcHBzVGVzdC9yZXMvbGF5b3V0L21haW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3N2Q4OTAKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvQ3Jvc3NQcm9maWxlQXBwc1Rlc3QvcmVzL2xheW91dC9tYWluLnhtbApAQCAtMCwwICsxLDI3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCI+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC91c2VyX3RleHR2aWV3IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAvPgorCis8L0xpbmVhckxheW91dD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvQ3Jvc3NQcm9maWxlQXBwc1Rlc3Qvc3JjL2NvbS9hbmRyb2lkL2N0cy9jcm9zc3Byb2ZpbGVhcHBzdGVzdC9Dcm9zc1Byb2ZpbGVBcHBzTm9uVGFyZ2V0VXNlclRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9Dcm9zc1Byb2ZpbGVBcHBzVGVzdC9zcmMvY29tL2FuZHJvaWQvY3RzL2Nyb3NzcHJvZmlsZWFwcHN0ZXN0L0Nyb3NzUHJvZmlsZUFwcHNOb25UYXJnZXRVc2VyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NDI1OWUKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvQ3Jvc3NQcm9maWxlQXBwc1Rlc3Qvc3JjL2NvbS9hbmRyb2lkL2N0cy9jcm9zc3Byb2ZpbGVhcHBzdGVzdC9Dcm9zc1Byb2ZpbGVBcHBzTm9uVGFyZ2V0VXNlclRlc3QuamF2YQpAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuY3RzLmNyb3NzcHJvZmlsZWFwcHN0ZXN0OworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLnRydXRoLlRydXRoLmFzc2VydFRoYXQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQ3Jvc3NQcm9maWxlQXBwczsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlVzZXJIYW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5Vc2VyTWFuYWdlcjsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogVGVzdCB0aGF0IHJ1bnMge0BsaW5rIENyb3NzUHJvZmlsZUFwcHN9IEFQSXMgYWdhaW5zdCBub24tdmFsaWQgdGFyZ2V0IHVzZXIuCisgKi8KK0BSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgQ3Jvc3NQcm9maWxlQXBwc05vblRhcmdldFVzZXJUZXN0IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVEFSR0VUX1VTRVIgPSAiVEFSR0VUX1VTRVIiOworCisgICAgcHJpdmF0ZSBDcm9zc1Byb2ZpbGVBcHBzIG1Dcm9zc1Byb2ZpbGVBcHBzOworICAgIHByaXZhdGUgVXNlckhhbmRsZSBtVGFyZ2V0VXNlcjsKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0dXBDcm9zc1Byb2ZpbGVBcHBzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1Db250ZXh0ID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpOworICAgICAgICBtQ3Jvc3NQcm9maWxlQXBwcyA9IG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ3Jvc3NQcm9maWxlQXBwcy5jbGFzcyk7CisgICAgfQorCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHJlYWRUYXJnZXRVc2VyKCkgeworICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCk7CisgICAgICAgIEJ1bmRsZSBhcmd1bWVudHMgPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRBcmd1bWVudHMoKTsKKyAgICAgICAgVXNlck1hbmFnZXIgdXNlck1hbmFnZXIgPSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoVXNlck1hbmFnZXIuY2xhc3MpOworICAgICAgICBmaW5hbCBpbnQgdXNlclNuID0gSW50ZWdlci5wYXJzZUludChhcmd1bWVudHMuZ2V0U3RyaW5nKFBBUkFNX1RBUkdFVF9VU0VSKSk7CisgICAgICAgIG1UYXJnZXRVc2VyID0gdXNlck1hbmFnZXIuZ2V0VXNlckZvclNlcmlhbE51bWJlcih1c2VyU24pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRhcmdldFVzZXJJc05vdEluR2V0VGFyZ2V0UHJvZmlsZXMoKSB7CisgICAgICAgIExpc3Q8VXNlckhhbmRsZT4gdGFyZ2V0UHJvZmlsZXMgPSBtQ3Jvc3NQcm9maWxlQXBwcy5nZXRUYXJnZXRVc2VyUHJvZmlsZXMoKTsKKyAgICAgICAgYXNzZXJ0VGhhdCh0YXJnZXRQcm9maWxlcykuZG9lc05vdENvbnRhaW4obVRhcmdldFVzZXIpOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gU2VjdXJpdHlFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdENhbm5vdFN0YXJ0QWN0aXZpdHkoKSB7CisgICAgICAgIG1Dcm9zc1Byb2ZpbGVBcHBzLnN0YXJ0TWFpbkFjdGl2aXR5KAorICAgICAgICAgICAgICAgIE1haW5BY3Rpdml0eS5nZXRDb21wb25lbnROYW1lKG1Db250ZXh0KSwgbVRhcmdldFVzZXIpOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gU2VjdXJpdHlFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdENhbm5vdEdldFByb2ZpbGVTd2l0Y2hpbmdMYWJlbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtQ3Jvc3NQcm9maWxlQXBwcy5nZXRQcm9maWxlU3dpdGNoaW5nTGFiZWwobVRhcmdldFVzZXIpOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gU2VjdXJpdHlFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdENhbm5vdEdldFByb2ZpbGVTd2l0Y2hpbmdJY29uRHJhd2FibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbUNyb3NzUHJvZmlsZUFwcHMuZ2V0UHJvZmlsZVN3aXRjaGluZ0ljb25EcmF3YWJsZShtVGFyZ2V0VXNlcik7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvQ3Jvc3NQcm9maWxlQXBwc1Rlc3Qvc3JjL2NvbS9hbmRyb2lkL2N0cy9jcm9zc3Byb2ZpbGVhcHBzdGVzdC9Dcm9zc1Byb2ZpbGVBcHBzVGFyZ2V0VXNlclRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9Dcm9zc1Byb2ZpbGVBcHBzVGVzdC9zcmMvY29tL2FuZHJvaWQvY3RzL2Nyb3NzcHJvZmlsZWFwcHN0ZXN0L0Nyb3NzUHJvZmlsZUFwcHNUYXJnZXRVc2VyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYTFhZTgKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvQ3Jvc3NQcm9maWxlQXBwc1Rlc3Qvc3JjL2NvbS9hbmRyb2lkL2N0cy9jcm9zc3Byb2ZpbGVhcHBzdGVzdC9Dcm9zc1Byb2ZpbGVBcHBzVGFyZ2V0VXNlclRlc3QuamF2YQpAQCAtMCwwICsxLDE0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5jcm9zc3Byb2ZpbGVhcHBzdGVzdDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi50cnV0aC5UcnV0aC5hc3NlcnRUaGF0OworCitpbXBvcnQgc3RhdGljIGp1bml0LmZyYW1ld29yay5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5Dcm9zc1Byb2ZpbGVBcHBzOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuVXNlckhhbmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlVzZXJNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLkJ5OworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLlVpRGV2aWNlOworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLlVpT2JqZWN0MjsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC51aWF1dG9tYXRvci5VbnRpbDsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCisvKioKKyAqIFRlc3QgdGhhdCBydW5zIHtAbGluayBDcm9zc1Byb2ZpbGVBcHBzfSBBUElzIGFnYWluc3QgdmFsaWQgdGFyZ2V0IHVzZXIuCisgKi8KK0BSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgQ3Jvc3NQcm9maWxlQXBwc1RhcmdldFVzZXJUZXN0IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVEFSR0VUX1VTRVIgPSAiVEFSR0VUX1VTRVIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9VU0VSX1RFWFRWSUVXID0KKyAgICAgICAgICAgICJjb20uYW5kcm9pZC5jdHMuY3Jvc3Nwcm9maWxlYXBwc3Rlc3Q6aWQvdXNlcl90ZXh0dmlldyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBUSU1FT1VUX1dBSVRfVUkgPSBUaW1lVW5pdC5TRUNPTkRTLnRvTWlsbGlzKDEwKTsKKworICAgIHByaXZhdGUgQ3Jvc3NQcm9maWxlQXBwcyBtQ3Jvc3NQcm9maWxlQXBwczsKKyAgICBwcml2YXRlIFVzZXJIYW5kbGUgbVRhcmdldFVzZXI7CisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgVWlEZXZpY2UgbURldmljZTsKKyAgICBwcml2YXRlIGxvbmcgbVVzZXJTZXJpYWxOdW1iZXI7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0dXBDcm9zc1Byb2ZpbGVBcHBzKCkgeworICAgICAgICBtQ29udGV4dCA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKTsKKyAgICAgICAgbUNyb3NzUHJvZmlsZUFwcHMgPSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENyb3NzUHJvZmlsZUFwcHMuY2xhc3MpOworICAgIH0KKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCB3YWtldXBEZXZpY2VBbmRQcmVzc0hvbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbURldmljZSA9IFVpRGV2aWNlLmdldEluc3RhbmNlKEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpKTsKKyAgICAgICAgbURldmljZS53YWtlVXAoKTsKKyAgICAgICAgbURldmljZS5wcmVzc01lbnUoKTsKKyAgICAgICAgbURldmljZS5wcmVzc0hvbWUoKTsKKyAgICB9CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgcmVhZFRhcmdldFVzZXIoKSB7CisgICAgICAgIENvbnRleHQgY29udGV4dCA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKTsKKyAgICAgICAgQnVuZGxlIGFyZ3VtZW50cyA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEFyZ3VtZW50cygpOworICAgICAgICBVc2VyTWFuYWdlciB1c2VyTWFuYWdlciA9IGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShVc2VyTWFuYWdlci5jbGFzcyk7CisgICAgICAgIG1Vc2VyU2VyaWFsTnVtYmVyID0gTG9uZy5wYXJzZUxvbmcoYXJndW1lbnRzLmdldFN0cmluZyhQQVJBTV9UQVJHRVRfVVNFUikpOworICAgICAgICBtVGFyZ2V0VXNlciA9IHVzZXJNYW5hZ2VyLmdldFVzZXJGb3JTZXJpYWxOdW1iZXIobVVzZXJTZXJpYWxOdW1iZXIpOworICAgICAgICBhc3NlcnROb3ROdWxsKG1UYXJnZXRVc2VyKTsKKyAgICB9CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCBwcmVzc0hvbWUoKSB7CisgICAgICAgIG1EZXZpY2UucHJlc3NIb21lKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGFyZ2V0VXNlcklzSW5nZXRUYXJnZXRVc2VyUHJvZmlsZXMoKSB7CisgICAgICAgIExpc3Q8VXNlckhhbmRsZT4gdGFyZ2V0UHJvZmlsZXMgPSBtQ3Jvc3NQcm9maWxlQXBwcy5nZXRUYXJnZXRVc2VyUHJvZmlsZXMoKTsKKyAgICAgICAgYXNzZXJ0VGhhdCh0YXJnZXRQcm9maWxlcykuY29udGFpbnMobVRhcmdldFVzZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZlcmlmeSB3ZSBzdWNjZWVkIHRvIHN0YXJ0IHRoZSBhY3Rpdml0eSBpbiBhbm90aGVyIHByb2ZpbGUgYnkgY2hlY2tpbmcgVUkgZWxlbWVudC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDYW5TdGFydE1haW5BY3Rpdml0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtQ3Jvc3NQcm9maWxlQXBwcy5zdGFydE1haW5BY3Rpdml0eSgKKyAgICAgICAgICAgICAgICBNYWluQWN0aXZpdHkuZ2V0Q29tcG9uZW50TmFtZShtQ29udGV4dCksIG1UYXJnZXRVc2VyKTsKKworICAgICAgICAvLyBMb29rIGZvciB0aGUgdGV4dCB2aWV3IHRvIHZlcmlmeSB0aGF0IE1haW5BY3Rpdml0eSBpcyBzdGFydGVkLgorICAgICAgICBVaU9iamVjdDIgdGV4dFZpZXcgPSBtRGV2aWNlLndhaXQoCisgICAgICAgICAgICAgICAgVW50aWwuZmluZE9iamVjdChCeS5yZXMoSURfVVNFUl9URVhUVklFVykpLAorICAgICAgICAgICAgICAgIFRJTUVPVVRfV0FJVF9VSSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoIkZhaWxlZCB0byBzdGFydCBhY3Rpdml0eSBpbiB0YXJnZXQgdXNlciIsIHRleHRWaWV3KTsKKyAgICAgICAgLy8gTG9vayBmb3IgdGhlIHRleHQgaW4gdGV4dHZpZXcsIGl0IHNob3VsZCBiZSB0aGUgc2VyaWFsIG51bWJlciBvZiB0YXJnZXQgdXNlci4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJBY3Rpdml0eSBpcyBzdGFydGVkIGluIHdyb25nIHVzZXIiLAorICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKG1Vc2VyU2VyaWFsTnVtYmVyKSwKKyAgICAgICAgICAgICAgICB0ZXh0Vmlldy5nZXRUZXh0KCkpOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gU2VjdXJpdHlFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdENhbm5vdFN0YXJ0Tm90RXhwb3J0ZWRBY3Rpdml0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtQ3Jvc3NQcm9maWxlQXBwcy5zdGFydE1haW5BY3Rpdml0eSgKKyAgICAgICAgICAgICAgICBOb25FeHBvcnRlZEFjdGl2aXR5LmdldENvbXBvbmVudE5hbWUobUNvbnRleHQpLCBtVGFyZ2V0VXNlcik7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBTZWN1cml0eUV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2Fubm90U3RhcnROb25NYWluQWN0aXZpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbUNyb3NzUHJvZmlsZUFwcHMuc3RhcnRNYWluQWN0aXZpdHkoCisgICAgICAgICAgICAgICAgTm9uTWFpbkFjdGl2aXR5LmdldENvbXBvbmVudE5hbWUobUNvbnRleHQpLCBtVGFyZ2V0VXNlcik7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBTZWN1cml0eUV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2Fubm90U3RhcnRBY3Rpdml0eUluT3RoZXJQYWNrYWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1Dcm9zc1Byb2ZpbGVBcHBzLnN0YXJ0TWFpbkFjdGl2aXR5KG5ldyBDb21wb25lbnROYW1lKAorICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5jdHMubGF1bmNoZXJhcHBzLnNpbXBsZWFwcCIsCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmN0cy5sYXVuY2hlcmFwcHMuc2ltcGxlYXBwLlNpbXBsZUFjdGl2aXR5IiksCisgICAgICAgICAgICAgICAgbVRhcmdldFVzZXIKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRQcm9maWxlU3dpdGNoaW5nTGFiZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtQ3Jvc3NQcm9maWxlQXBwcy5nZXRQcm9maWxlU3dpdGNoaW5nTGFiZWwobVRhcmdldFVzZXIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRQcm9maWxlU3dpdGNoaW5nSWNvbkRyYXdhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydE5vdE51bGwobUNyb3NzUHJvZmlsZUFwcHMuZ2V0UHJvZmlsZVN3aXRjaGluZ0ljb25EcmF3YWJsZShtVGFyZ2V0VXNlcikpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0Nyb3NzUHJvZmlsZUFwcHNUZXN0L3NyYy9jb20vYW5kcm9pZC9jdHMvY3Jvc3Nwcm9maWxlYXBwc3Rlc3QvTWFpbkFjdGl2aXR5LmphdmEgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvQ3Jvc3NQcm9maWxlQXBwc1Rlc3Qvc3JjL2NvbS9hbmRyb2lkL2N0cy9jcm9zc3Byb2ZpbGVhcHBzdGVzdC9NYWluQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTM3ZTgwCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0Nyb3NzUHJvZmlsZUFwcHNUZXN0L3NyYy9jb20vYW5kcm9pZC9jdHMvY3Jvc3Nwcm9maWxlYXBwc3Rlc3QvTWFpbkFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY3RzLmNyb3NzcHJvZmlsZWFwcHN0ZXN0OworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOworaW1wb3J0IGFuZHJvaWQub3MuVXNlck1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworaW1wb3J0IGphdmEubGFuZy5PdmVycmlkZTsKKworLyoqCisgKiBBbiBkdW1teSBhY3Rpdml0eSB0aGF0IGRpc3BsYXlzIHRoZSBzZXJpYWwgbnVtYmVyIG9mIHRoZSB1c2VyIHRoYXQgaXQgaXMgcnVubmluZyBpbnRvLgorICovCitwdWJsaWMgY2xhc3MgTWFpbkFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5tYWluKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblN0YXJ0KCkgeworICAgICAgICBzdXBlci5vblN0YXJ0KCk7CisgICAgICAgIFRleHRWaWV3IHRleHRWaWV3ID0gZmluZFZpZXdCeUlkKFIuaWQudXNlcl90ZXh0dmlldyk7CisgICAgICAgIHRleHRWaWV3LnNldFRleHQoTG9uZy50b1N0cmluZyhnZXRDdXJyZW50VXNlclNlcmlhbE51bWJlcigpKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBDb21wb25lbnROYW1lIGdldENvbXBvbmVudE5hbWUoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBuZXcgQ29tcG9uZW50TmFtZShjb250ZXh0LCBNYWluQWN0aXZpdHkuY2xhc3MpOworICAgIH0KKworICAgIHByaXZhdGUgbG9uZyBnZXRDdXJyZW50VXNlclNlcmlhbE51bWJlcigpIHsKKyAgICAgICAgVXNlck1hbmFnZXIgdXNlck1hbmFnZXIgPSBnZXRTeXN0ZW1TZXJ2aWNlKFVzZXJNYW5hZ2VyLmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIHVzZXJNYW5hZ2VyLmdldFNlcmlhbE51bWJlckZvclVzZXIoUHJvY2Vzcy5teVVzZXJIYW5kbGUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0Nyb3NzUHJvZmlsZUFwcHNUZXN0L3NyYy9jb20vYW5kcm9pZC9jdHMvY3Jvc3Nwcm9maWxlYXBwc3Rlc3QvTm9uRXhwb3J0ZWRBY3Rpdml0eS5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0Nyb3NzUHJvZmlsZUFwcHNUZXN0L3NyYy9jb20vYW5kcm9pZC9jdHMvY3Jvc3Nwcm9maWxlYXBwc3Rlc3QvTm9uRXhwb3J0ZWRBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NzY2OTQKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvQ3Jvc3NQcm9maWxlQXBwc1Rlc3Qvc3JjL2NvbS9hbmRyb2lkL2N0cy9jcm9zc3Byb2ZpbGVhcHBzdGVzdC9Ob25FeHBvcnRlZEFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5jcm9zc3Byb2ZpbGVhcHBzdGVzdDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworCitwdWJsaWMgY2xhc3MgTm9uRXhwb3J0ZWRBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIHB1YmxpYyBzdGF0aWMgQ29tcG9uZW50TmFtZSBnZXRDb21wb25lbnROYW1lKENvbnRleHQgY29udGV4dCApeworICAgICAgICByZXR1cm4gbmV3IENvbXBvbmVudE5hbWUoY29udGV4dCwgTm9uRXhwb3J0ZWRBY3Rpdml0eS5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0Nyb3NzUHJvZmlsZUFwcHNUZXN0L3NyYy9jb20vYW5kcm9pZC9jdHMvY3Jvc3Nwcm9maWxlYXBwc3Rlc3QvTm9uTWFpbkFjdGl2aXR5LmphdmEgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvQ3Jvc3NQcm9maWxlQXBwc1Rlc3Qvc3JjL2NvbS9hbmRyb2lkL2N0cy9jcm9zc3Byb2ZpbGVhcHBzdGVzdC9Ob25NYWluQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmVjNDY2Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0Nyb3NzUHJvZmlsZUFwcHNUZXN0L3NyYy9jb20vYW5kcm9pZC9jdHMvY3Jvc3Nwcm9maWxlYXBwc3Rlc3QvTm9uTWFpbkFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5jcm9zc3Byb2ZpbGVhcHBzdGVzdDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworCitwdWJsaWMgY2xhc3MgTm9uTWFpbkFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgcHVibGljIHN0YXRpYyBDb21wb25lbnROYW1lIGdldENvbXBvbmVudE5hbWUoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBuZXcgQ29tcG9uZW50TmFtZShjb250ZXh0LCBOb25NYWluQWN0aXZpdHkuY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9DdXN0b21pemF0aW9uQXBwL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvQ3VzdG9taXphdGlvbkFwcC9BbmRyb2lkLm1rCmluZGV4IDFlNmUyZjEuLmMwNmE5ODQgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9DdXN0b21pemF0aW9uQXBwL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0N1c3RvbWl6YXRpb25BcHAvQW5kcm9pZC5tawpAQCAtMTYsNyArMTYsNyBAQAogCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gYXJjdHMgY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNDdXN0b21pemF0aW9uQXBwCiAKQEAgLTI2LDggKzI2LDEyIEBACiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQtc3VwcG9ydC10ZXN0IGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCisgICAgYW5kcm9pZHgudGVzdC5ydWxlcyBcCisgICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgXAorCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicwogCiBMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CiAKLWluY2x1ZGUgJChCVUlMRF9DVFNfUEFDS0FHRSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvQ3VzdG9taXphdGlvbkFwcC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0N1c3RvbWl6YXRpb25BcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA0YjIwODI5Li5hM2IwNTA3IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvQ3VzdG9taXphdGlvbkFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9DdXN0b21pemF0aW9uQXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTIzLDEwICsyMywxMSBAQAogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uU0VUX1dBTExQQVBFUiIgLz4KIAogICAgIDxhcHBsaWNhdGlvbj4KKyAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CiAgICAgPC9hcHBsaWNhdGlvbj4KIAogICAgIDxpbnN0cnVtZW50YXRpb24KLSAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5jdHMuY3VzdG9taXphdGlvbmFwcCIKICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ3VzdG9taXphdGlvbiBDVFMgVGVzdHMiIC8+CiAKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZWxlZ2F0ZUFwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RlbGVnYXRlQXBwL0FuZHJvaWQubWsKaW5kZXggYTQ2ZWVkOC4uMGViOTA0YSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RlbGVnYXRlQXBwL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RlbGVnYXRlQXBwL0FuZHJvaWQubWsKQEAgLTI0LDE3ICsyNCwxNiBAQAogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKLUxPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIgY3RzLWp1bml0CitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzIGN0cy1qdW5pdCBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicwogCiBMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgPSBcCi0gICAgYW5kcm9pZC1zdXBwb3J0LXY0IFwKLSAgICBjdHN0ZXN0cnVubmVyIFwKLSAgICBhbmRyb2lkLXN1cHBvcnQtdGVzdCBcCi0gICAgbGVnYWN5LWFuZHJvaWQtdGVzdAorICAgIGFuZHJvaWR4LmxlZ2FjeV9sZWdhY3ktc3VwcG9ydC12NCBcCisgICAgY3RzdGVzdHJ1bm5lci1heHQgXAorICAgIGFuZHJvaWR4LnRlc3QucnVsZXMKIAogTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAogCiAjIHRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0Ci1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBhcmN0cyBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKIAogaW5jbHVkZSAkKEJVSUxEX0NUU19QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RlbGVnYXRlQXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGVsZWdhdGVBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBjYzEzOWE0Li5hM2Y4MTU3IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGVsZWdhdGVBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGVsZWdhdGVBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjQsNyArMjQsNyBAQAogICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSI+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAgICAgPC9hcHBsaWNhdGlvbj4KLSAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5jdHMuZGVsZWdhdGUiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJEZWxlZ2F0aW9uIENUUyBUZXN0cyIvPgogPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBZG1pbi9hcGkyMy9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFkbWluL2FwaTIzL0FuZHJvaWQubWsKaW5kZXggYThmNGYwNS4uMDY2M2U3YyAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFkbWluL2FwaTIzL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFkbWluL2FwaTIzL0FuZHJvaWQubWsKQEAgLTI3LDExICsyNywxMCBAQAogTE9DQUxfUkVTT1VSQ0VfRElSICs9ICQoTE9DQUxfUEFUSCkvLi4vcmVzCiAKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCi0gICAgY3RzdGVzdHJ1bm5lciBcCi0gICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbCBcCi0gICAgbGVnYWN5LWFuZHJvaWQtdGVzdAorICAgIGN0c3Rlc3RydW5uZXItYXh0IFwKKyAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dAogCi1MT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBsZWdhY3ktYW5kcm9pZC10ZXN0CitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzIGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCiAKIExPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKIApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFkbWluL2FwaTIzL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQWRtaW4vYXBpMjMvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBkNzBiMjJkLi44ZTJmZGMyIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQWRtaW4vYXBpMjMvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQWRtaW4vYXBpMjMvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtNDYsNyArNDYsNyBAQAogCiAgICAgPC9hcHBsaWNhdGlvbj4KIAotICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5hbmRyb2lkLmN0cy5kZXZpY2VhZG1pbjIzIgogICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iRGV2aWNlIEFkbWluIENUUyB0ZXN0cyIvPgogPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBZG1pbi9hcGkyNC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFkbWluL2FwaTI0L0FuZHJvaWQubWsKaW5kZXggNGUyY2ZiNi4uYTdkYTQ2MSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFkbWluL2FwaTI0L0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFkbWluL2FwaTI0L0FuZHJvaWQubWsKQEAgLTI3LDE1ICsyNywxNCBAQAogTE9DQUxfUkVTT1VSQ0VfRElSICs9ICQoTE9DQUxfUEFUSCkvLi4vcmVzCiAKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCi0gICAgY3RzdGVzdHJ1bm5lciBcCi0gICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbCBcCi0gICAgbGVnYWN5LWFuZHJvaWQtdGVzdAorICAgIGN0c3Rlc3RydW5uZXItYXh0IFwKKyAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dAogCi1MT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBsZWdhY3ktYW5kcm9pZC10ZXN0CitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzIGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCiAKIExPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKIAogIyB0YWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gYXJjdHMgY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiAKIGluY2x1ZGUgJChCVUlMRF9DVFNfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBZG1pbi9hcGkyNC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFkbWluL2FwaTI0L0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggZTJkNzg1Yy4uMzBiZDZkYyAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFkbWluL2FwaTI0L0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFkbWluL2FwaTI0L0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTQ2LDcgKzQ2LDcgQEAKIAogICAgIDwvYXBwbGljYXRpb24+CiAKLSAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5jdHMuZGV2aWNlYWRtaW4yNCIKICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkRldmljZSBBZG1pbiBDVFMgdGVzdHMiLz4KIDwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQWRtaW4vc3JjL2NvbS5hbmRyb2lkLmN0cy5kZXZpY2VhZG1pbi9EZXZpY2VBZG1pblBhc3N3b3JkVGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFkbWluL3NyYy9jb20uYW5kcm9pZC5jdHMuZGV2aWNlYWRtaW4vRGV2aWNlQWRtaW5QYXNzd29yZFRlc3QuamF2YQppbmRleCAyNmQ4OWMwLi43MTRjZTEwIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQWRtaW4vc3JjL2NvbS5hbmRyb2lkLmN0cy5kZXZpY2VhZG1pbi9EZXZpY2VBZG1pblBhc3N3b3JkVGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBZG1pbi9zcmMvY29tLmFuZHJvaWQuY3RzLmRldmljZWFkbWluL0RldmljZUFkbWluUGFzc3dvcmRUZXN0LmphdmEKQEAgLTY3LDI0ICs2NywyOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydEhhc1Bhc3N3b3JkKCkgeworICAgIHByaXZhdGUgYm9vbGVhbiB3YWl0VW50aWxQYXNzd29yZFN0YXRlKGJvb2xlYW4gZXhwZWN0ZWQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIGludCBjdXJyZW50UXVhbGl0eSA9IGRwbS5nZXRQYXNzd29yZFF1YWxpdHkobUFkbWluQ29tcG9uZW50KTsKICAgICAgICAgZHBtLnNldFBhc3N3b3JkUXVhbGl0eShtQWRtaW5Db21wb25lbnQsIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9TT01FVEhJTkcpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiTm8gcGFzc3dvcmQgc2V0IiwgZHBtLmlzQWN0aXZlUGFzc3dvcmRTdWZmaWNpZW50KCkpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgZHBtLnNldFBhc3N3b3JkUXVhbGl0eShtQWRtaW5Db21wb25lbnQsIGN1cnJlbnRRdWFsaXR5KTsKKworICAgICAgICBpbnQgbnVtVHJpZXMgPSA1OworICAgICAgICBib29sZWFuIHJlc3VsdCA9IGRwbS5pc0FjdGl2ZVBhc3N3b3JkU3VmZmljaWVudCgpOworICAgICAgICB3aGlsZSAoKG51bVRyaWVzID4gMCkgJiYgKHJlc3VsdCAhPSBleHBlY3RlZCkpIHsKKyAgICAgICAgICAgIG51bVRyaWVzID0gbnVtVHJpZXMgLSAxOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMCk7CisgICAgICAgICAgICByZXN1bHQgPSBkcG0uaXNBY3RpdmVQYXNzd29yZFN1ZmZpY2llbnQoKTsKICAgICAgICAgfQorCisgICAgICAgIGRwbS5zZXRQYXNzd29yZFF1YWxpdHkobUFkbWluQ29tcG9uZW50LCBjdXJyZW50UXVhbGl0eSk7CisgICAgICAgIHJldHVybiBleHBlY3RlZCA9PSByZXN1bHQ7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydE5vUGFzc3dvcmQoKSB7Ci0gICAgICAgIGZpbmFsIGludCBjdXJyZW50UXVhbGl0eSA9IGRwbS5nZXRQYXNzd29yZFF1YWxpdHkobUFkbWluQ29tcG9uZW50KTsKLSAgICAgICAgZHBtLnNldFBhc3N3b3JkUXVhbGl0eShtQWRtaW5Db21wb25lbnQsIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9TT01FVEhJTkcpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0RmFsc2UoIlBhc3N3b3JkIGlzIHNldCIsIGRwbS5pc0FjdGl2ZVBhc3N3b3JkU3VmZmljaWVudCgpKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGRwbS5zZXRQYXNzd29yZFF1YWxpdHkobUFkbWluQ29tcG9uZW50LCBjdXJyZW50UXVhbGl0eSk7Ci0gICAgICAgIH0KKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0SGFzUGFzc3dvcmQoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBhc3NlcnRUcnVlKCJObyBwYXNzd29yZCBzZXQiLCB3YWl0VW50aWxQYXNzd29yZFN0YXRlKHRydWUpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0Tm9QYXNzd29yZCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydFRydWUoIlBhc3N3b3JkIGlzIHNldCIsIHdhaXRVbnRpbFBhc3N3b3JkU3RhdGUoZmFsc2UpKTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBZG1pblNlcnZpY2UvcGFja2FnZTEvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBZG1pblNlcnZpY2UvcGFja2FnZTEvQW5kcm9pZC5tawppbmRleCA3MmQyYmIwLi4yNjg5NjA3IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQWRtaW5TZXJ2aWNlL3BhY2thZ2UxL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFkbWluU2VydmljZS9wYWNrYWdlMS9BbmRyb2lkLm1rCkBAIC0yNiw3ICsyNiw5IEBACiAKIExPQ0FMX1JFU09VUkNFX0RJUiArPSAkKExPQ0FMX1BBVEgpLy4uL3JlcwogCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY3RzdGVzdHJ1bm5lciBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY3RzdGVzdHJ1bm5lci1heHQgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQKKworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LmJhc2Uuc3R1YnMKIAogTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAogCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQWRtaW5TZXJ2aWNlL3BhY2thZ2UxL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQWRtaW5TZXJ2aWNlL3BhY2thZ2UxL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggNDdmM2M2YS4uZDJiNGIwYyAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFkbWluU2VydmljZS9wYWNrYWdlMS9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBZG1pblNlcnZpY2UvcGFja2FnZTEvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtNDEsNiArNDEsNiBAQAogCiAgICAgPC9hcHBsaWNhdGlvbj4KIAotICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5hbmRyb2lkLmN0cy5kZXZpY2VhZG1pbnNlcnZpY2UiIC8+CiA8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFkbWluU2VydmljZS9wYWNrYWdlMi9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFkbWluU2VydmljZS9wYWNrYWdlMi9BbmRyb2lkLm1rCmluZGV4IGUyZjliOGQuLjQ3MjZiOGQgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBZG1pblNlcnZpY2UvcGFja2FnZTIvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQWRtaW5TZXJ2aWNlL3BhY2thZ2UyL0FuZHJvaWQubWsKQEAgLTI2LDcgKzI2LDkgQEAKIAogTE9DQUxfUkVTT1VSQ0VfRElSICs9ICQoTE9DQUxfUEFUSCkvLi4vcmVzCiAKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjdHN0ZXN0cnVubmVyIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjdHN0ZXN0cnVubmVyLWF4dCBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dAorCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicwogCiBMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CiAKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBZG1pblNlcnZpY2UvcGFja2FnZTIvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBZG1pblNlcnZpY2UvcGFja2FnZTIvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCAwZmY4ZTY4Li5jNTdlYjhlIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQWRtaW5TZXJ2aWNlL3BhY2thZ2UyL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFkbWluU2VydmljZS9wYWNrYWdlMi9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC00MSw2ICs0MSw2IEBACiAKICAgICA8L2FwcGxpY2F0aW9uPgogCi0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmFuZHJvaWQuY3RzLmRldmljZWFkbWluc2VydmljZSIgLz4KIDwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQWRtaW5TZXJ2aWNlL3BhY2thZ2UzL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQWRtaW5TZXJ2aWNlL3BhY2thZ2UzL0FuZHJvaWQubWsKaW5kZXggYjg4ZDUzNy4uOGFjNjMwNyAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFkbWluU2VydmljZS9wYWNrYWdlMy9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBZG1pblNlcnZpY2UvcGFja2FnZTMvQW5kcm9pZC5tawpAQCAtMjYsNyArMjYsOSBAQAogCiBMT0NBTF9SRVNPVVJDRV9ESVIgKz0gJChMT0NBTF9QQVRIKS8uLi9yZXMKIAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGN0c3Rlc3RydW5uZXIgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGN0c3Rlc3RydW5uZXItYXh0IGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0CisKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCiAKIExPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKIApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFkbWluU2VydmljZS9wYWNrYWdlMy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFkbWluU2VydmljZS9wYWNrYWdlMy9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDVkNjM3OTQuLjQ2YTVmZWUgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBZG1pblNlcnZpY2UvcGFja2FnZTMvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQWRtaW5TZXJ2aWNlL3BhY2thZ2UzL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTQwLDYgKzQwLDYgQEAKIAogICAgIDwvYXBwbGljYXRpb24+CiAKLSAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5jdHMuZGV2aWNlYWRtaW5zZXJ2aWNlIiAvPgogPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBZG1pblNlcnZpY2UvcGFja2FnZTQvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBZG1pblNlcnZpY2UvcGFja2FnZTQvQW5kcm9pZC5tawppbmRleCA3ZjcyZGRmLi4zMmMwNjFhIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQWRtaW5TZXJ2aWNlL3BhY2thZ2U0L0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFkbWluU2VydmljZS9wYWNrYWdlNC9BbmRyb2lkLm1rCkBAIC0yNiw3ICsyNiw5IEBACiAKIExPQ0FMX1JFU09VUkNFX0RJUiArPSAkKExPQ0FMX1BBVEgpLy4uL3JlcwogCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY3RzdGVzdHJ1bm5lciBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY3RzdGVzdHJ1bm5lci1heHQgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQKKworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LmJhc2Uuc3R1YnMKIAogTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAogCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQWRtaW5TZXJ2aWNlL3BhY2thZ2U0L0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQWRtaW5TZXJ2aWNlL3BhY2thZ2U0L0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggYjQzZDA4Ni4uM2E5OGRlNSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFkbWluU2VydmljZS9wYWNrYWdlNC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBZG1pblNlcnZpY2UvcGFja2FnZTQvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtNDYsNiArNDYsNiBAQAogCiAgICAgPC9hcHBsaWNhdGlvbj4KIAotICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5hbmRyb2lkLmN0cy5kZXZpY2VhZG1pbnNlcnZpY2UiIC8+CiA8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFkbWluU2VydmljZS9wYWNrYWdlYi9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFkbWluU2VydmljZS9wYWNrYWdlYi9BbmRyb2lkLm1rCmluZGV4IDhjNjY2MzguLjU0NDkzZjIgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBZG1pblNlcnZpY2UvcGFja2FnZWIvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQWRtaW5TZXJ2aWNlL3BhY2thZ2ViL0FuZHJvaWQubWsKQEAgLTI2LDcgKzI2LDkgQEAKIAogTE9DQUxfUkVTT1VSQ0VfRElSICs9ICQoTE9DQUxfUEFUSCkvLi4vcmVzCiAKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjdHN0ZXN0cnVubmVyIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjdHN0ZXN0cnVubmVyLWF4dCBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dAorCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicwogCiBMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CiAKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBZG1pblNlcnZpY2UvcGFja2FnZWIvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBZG1pblNlcnZpY2UvcGFja2FnZWIvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA5NWQyMDNhLi5iZWIyM2E4IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQWRtaW5TZXJ2aWNlL3BhY2thZ2ViL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFkbWluU2VydmljZS9wYWNrYWdlYi9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0zOSw2ICszOSw2IEBACiAgICAgICAgIDwvc2VydmljZT4KICAgICA8L2FwcGxpY2F0aW9uPgogCi0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmFuZHJvaWQuY3RzLmRldmljZWFkbWluc2VydmljZSIgLz4KIDwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQW5kUHJvZmlsZU93bmVyL2FwaTIzL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQW5kUHJvZmlsZU93bmVyL2FwaTIzL0FuZHJvaWQubWsKaW5kZXggYzgxODg1Ni4uMDAwMjMzMyAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFuZFByb2ZpbGVPd25lci9hcGkyMy9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBbmRQcm9maWxlT3duZXIvYXBpMjMvQW5kcm9pZC5tawpAQCAtMTcsNiArMTcsNyBAQAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNEZXZpY2VBbmRQcm9maWxlT3duZXJBcHAyMworTE9DQUxfUFJJVkFURV9QTEFURk9STV9BUElTIDo9IHRydWUKIAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIApAQCAtMjQsMTQgKzI1LDI1IEBACiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIC4uL3NyYykKIAotTE9DQUxfSkFWQV9MSUJSQVJJRVMgPSBjb25zY3J5cHQgbGVnYWN5LWFuZHJvaWQtdGVzdAorTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gXAorICAgIGFuZHJvaWQudGVzdC5ydW5uZXIuc3R1YnMgXAorICAgIGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzIFwKIAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTID0gYW5kcm9pZC1zdXBwb3J0LXY0IGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwgY3RzdGVzdHJ1bm5lciB1Yi11aWF1dG9tYXRvcgorTE9DQUxfVVNFX0FBUFQyIDo9IHRydWUKIAotTE9DQUxfU0RLX1ZFUlNJT04gOj0gdGVzdF9jdXJyZW50CitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAorICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0IFwKKyAgICBjdHN0ZXN0cnVubmVyLWF4dCBcCisgICAgdWItdWlhdXRvbWF0b3IgXAorICAgIGN0cy1zZWN1cml0eS10ZXN0LXN1cHBvcnQtbGlicmFyeQorCitMT0NBTF9TVEFUSUNfQU5EUk9JRF9MSUJSQVJJRVMgOj0gXAorICAgIGFuZHJvaWR4LmxlZ2FjeV9sZWdhY3ktc3VwcG9ydC12NAogCiBMT0NBTF9SRVNPVVJDRV9ESVIgOj0gJChMT0NBTF9QQVRIKS8uLi9yZXMKIAorTE9DQUxfQVNTRVRfRElSIDo9ICQoTE9DQUxfUEFUSCkvLi4vYXNzZXRzCisKICMgdGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKIExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiAKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBbmRQcm9maWxlT3duZXIvYXBpMjMvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBbmRQcm9maWxlT3duZXIvYXBpMjMvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBkOTJkNDQwLi43OTMyMzNhIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQW5kUHJvZmlsZU93bmVyL2FwaTIzL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFuZFByb2ZpbGVPd25lci9hcGkyMy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC00MCw3ICs0MCw3IEBACiAgICAgPC9hcHBsaWNhdGlvbj4KIAogICAgIDxpbnN0cnVtZW50YXRpb24KLSAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iUHJvZmlsZSBhbmQgRGV2aWNlIE93bmVyIENUUyBUZXN0cyBBUEkgMjMiCiAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5hbmRyb2lkLmN0cy5kZXZpY2VhbmRwcm9maWxlb3duZXIiPgogICAgICAgICA8bWV0YS1kYXRhCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQW5kUHJvZmlsZU93bmVyL2FwaTI1L0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQW5kUHJvZmlsZU93bmVyL2FwaTI1L0FuZHJvaWQubWsKaW5kZXggMWM1MDc2My4uYzFkNjY4NyAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFuZFByb2ZpbGVPd25lci9hcGkyNS9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBbmRQcm9maWxlT3duZXIvYXBpMjUvQW5kcm9pZC5tawpAQCAtMTcsNiArMTcsNyBAQAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNEZXZpY2VBbmRQcm9maWxlT3duZXJBcHAyNQorTE9DQUxfUFJJVkFURV9QTEFURk9STV9BUElTIDo9IHRydWUKIAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIApAQCAtMjQsMTQgKzI1LDI1IEBACiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIC4uL3NyYykKIAotTE9DQUxfSkFWQV9MSUJSQVJJRVMgPSBjb25zY3J5cHQgbGVnYWN5LWFuZHJvaWQtdGVzdAorTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gXAorICAgIGFuZHJvaWQudGVzdC5ydW5uZXIuc3R1YnMgXAorICAgIGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzIFwKIAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTID0gYW5kcm9pZC1zdXBwb3J0LXY0IGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwgY3RzdGVzdHJ1bm5lciB1Yi11aWF1dG9tYXRvcgorTE9DQUxfVVNFX0FBUFQyIDo9IHRydWUKIAotTE9DQUxfU0RLX1ZFUlNJT04gOj0gdGVzdF9jdXJyZW50CitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAorICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0IFwKKyAgICBjdHN0ZXN0cnVubmVyLWF4dCBcCisgICAgdWItdWlhdXRvbWF0b3IgXAorICAgIGN0cy1zZWN1cml0eS10ZXN0LXN1cHBvcnQtbGlicmFyeQorCitMT0NBTF9TVEFUSUNfQU5EUk9JRF9MSUJSQVJJRVMgOj0gXAorICAgIGFuZHJvaWR4LmxlZ2FjeV9sZWdhY3ktc3VwcG9ydC12NAogCiBMT0NBTF9SRVNPVVJDRV9ESVIgOj0gJChMT0NBTF9QQVRIKS8uLi9yZXMKIAorTE9DQUxfQVNTRVRfRElSIDo9ICQoTE9DQUxfUEFUSCkvLi4vYXNzZXRzCisKICMgdGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKIExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiAKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBbmRQcm9maWxlT3duZXIvYXBpMjUvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBbmRQcm9maWxlT3duZXIvYXBpMjUvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBhOGQyNDljLi5lOTllZDdjIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQW5kUHJvZmlsZU93bmVyL2FwaTI1L0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFuZFByb2ZpbGVPd25lci9hcGkyNS9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0zNyw3ICszNyw3IEBACiAgICAgPC9hcHBsaWNhdGlvbj4KIAogICAgIDxpbnN0cnVtZW50YXRpb24KLSAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iUHJvZmlsZSBhbmQgRGV2aWNlIE93bmVyIENUUyBUZXN0cyIKICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmFuZHJvaWQuY3RzLmRldmljZWFuZHByb2ZpbGVvd25lciI+CiAgICAgICAgIDxtZXRhLWRhdGEKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBbmRQcm9maWxlT3duZXIvYXNzZXRzL3VzZXItY2VydC1jaGFpbi5jcnQgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQW5kUHJvZmlsZU93bmVyL2Fzc2V0cy91c2VyLWNlcnQtY2hhaW4uY3J0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YTJlYzQKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQW5kUHJvZmlsZU93bmVyL2Fzc2V0cy91c2VyLWNlcnQtY2hhaW4uY3J0CkBAIC0wLDAgKzEsOTAgQEAKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRWRUQ0NBbDJnQXdJQkFnSUNFQUF3RFFZSktvWklodmNOQVFFTEJRQXdXekVMTUFrR0ExVUVCaE1DUjBJeAorRURBT0JnTlZCQWdNQjBWdVoyeGhibVF4RWpBUUJnTlZCQW9NQ1VkdmIyZHNaU0JWU3pFTU1Bb0dBMVVFQ3d3RAorUVdaWE1SZ3dGZ1lEVlFRRERBOUpiblJsY20xbFpHbGhkR1VnUTBFd0hoY05NVGd3TlRBME1UTTBNREUyV2hjTgorTVRrd05UQTBNVE0wTURFMldqQmNNUXN3Q1FZRFZRUUdFd0pIUWpFUU1BNEdBMVVFQ0F3SFJXNW5iR0Z1WkRFUworTUJBR0ExVUVDZ3dKUjI5dloyeGxJRlZMTVF3d0NnWURWUVFMREFOQlpsY3hHVEFYQmdOVkJBTU1FRXhsWVdZZworUTJWeWRHbG1hV05oZEdVd2daOHdEUVlKS29aSWh2Y05BUUVCQlFBRGdZMEFNSUdKQW9HQkFORWVLOWViTmJNVQorNFNmbmxDY1dqbmRXNjM2MU5HUCtHNGxBelk4QkMrQVJMME0vc1RDQldkSTZyWGR5YTRyS3FlWm9MbXpycm5veQorQmhXaldSOC8yUEhQZWhlLzBCWUxmbXZkQWxseTBxczNTeS9NOE0xam0yRVFTc240WTdxUVp6SGQzbWl3bXZZdQorRDdWMjg5R2FNcnRMT2pUV1kwSzhlbDMrbGJYNHNGeTNBZ01CQUFHamdjVXdnY0l3Q1FZRFZSMFRCQUl3QURBUgorQmdsZ2hrZ0JodmhDQVFFRUJBTUNCYUF3TXdZSllJWklBWWI0UWdFTkJDWVdKRTl3Wlc1VFUwd2dSMlZ1WlhKaAorZEdWa0lFTnNhV1Z1ZENCRFpYSjBhV1pwWTJGMFpUQWRCZ05WSFE0RUZnUVU3U0ZxQWpDbXdaT1pJU3E1K2ZvNworOXJoeEtUQXdId1lEVlIwakJCZ3dGb0FVMWcwRyt5R0JvSDNiWWV0Wk9zUjRLQkxtRFNrd0RnWURWUjBQQVFILworQkFRREFnWGdNQjBHQTFVZEpRUVdNQlFHQ0NzR0FRVUZCd01DQmdnckJnRUZCUWNEQkRBTkJna3Foa2lHOXcwQgorQVFzRkFBT0NBZ0VBQXdRb2ZJbDRIa3YyRjdidXVpZkptYkNybHQzUE1QQVVPSHFYZUJIQndCcXgwTlpHbW1lRAorY0loTFNVeGN5NExJdHI0ZEhqSlpoTGM4UzNMV3JiNTZoUGhVZ1F5Wlh4RHFKa0s4dElWWVJqU20rSEVhcmNWNworTEdZcmlmYms2U2JOWERORHlORmFJU1IySlRVanFKb1RoMXNjcW9ORUN5RmkyL1IyTDJZSm5VTlpscmFaYzhKaAorandNL0kxc0Fhd2IwVlE5c2w2bDlQUlpwYmxGQ2VHSUd1SmpzZTczaUQ0TjNDVjNjQU5zbkxCY3pIWThoVk83TworbHFrREVMMWxRYUs3VW9JYmZNamx3UllvM2xYaEEvZnVjb0ZWdFpNVTRtb0ZyRjhFRmtYdG0xV3BGanQxN3VFYworM3dSTUtWVWRFZTllQzBlNkozeWdYOGpRZVBtc0oyS1B1L1lORHdYN0liWmRjbzh2ZTNoNDJFUU1DV2Y1dGorcgorOElmL1drdEZNWVRqT3J5OVVqQk5KUi9HaEM4MTNEZFhiQmVMZ2lvc3YwRjZ0NVdBUjR4TjUra2Q1SU9Kc3hmbQorWEg2R3FjNThTMGZRMnFZaGFkSjJ4ZXlkK3dUcSt2RUtYalJBVCt1eC9nNzVZdVdDbEkzVFBJY1VheXFoRFRiRworQ3RXaDhDV3YxbmVyOGlrRFFhdjlRZnRZbWZlZzZwdDg0RzdHcDVHVk9oTWpTSzArK05VQlA5VTlCTmJxZkY3dworM21UTElWZDlFRk5aajZaWXE3QlZaTFQrTGtXejVMOWVBMEZOQ3dZSjI4Y0FkV2Z3WklvMnpZaTgwc01QU0JoWAorZ0FNeVRVVDVVMXIxZTJybUllbk1PaXNzSmtsdWdjazlhTWZ5MmVlTDJEQVBQa3BISmFSUWliUT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRmtEQ0NBM2lnQXdJQkFnSUNFQUF3RFFZSktvWklodmNOQVFFTEJRQXdVekVMTUFrR0ExVUVCaE1DUjBJeAorRURBT0JnTlZCQWdNQjBWdVoyeGhibVF4RWpBUUJnTlZCQW9NQ1VkdmIyZHNaU0JWU3pFTU1Bb0dBMVVFQ3d3RAorUVdaWE1SQXdEZ1lEVlFRRERBZFNiMjkwSUVOQk1CNFhEVEU0TURVd05ERXpNemsxT0ZvWERUSTRNRFV3TVRFegorTXprMU9Gb3dXekVMTUFrR0ExVUVCaE1DUjBJeEVEQU9CZ05WQkFnTUIwVnVaMnhoYm1ReEVqQVFCZ05WQkFvTQorQ1VkdmIyZHNaU0JWU3pFTU1Bb0dBMVVFQ3d3RFFXWlhNUmd3RmdZRFZRUUREQTlKYm5SbGNtMWxaR2xoZEdVZworUTBFd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUM0d2c5eEFZbWtjQlZMOHpPWQord2F0RlM1Y2xueFpZdnp5ckRPQVVuRUliOCs0ODUrOWI5NEZnQVYzL0Jlb0hLOFRHSzNMNjN6ajVaZlRCd0thSAorcU1vNktKWkRxM0hYVmYwMm5GZHlHc0YyVHQwWFVzSkJ5S2kwWnlvdzY5MjFtVHdLSklpZmVKT3lWMmJZVlR5bAorcmt3MDRNOVhBdHNUMEJkSDYxZURyVGMyS1RJcVV5ZjgxWmphYzJSSi95NHpFQ3RaSzhvd08yQUNmMWE4VVhVRgorOHFMeGVFSS9RRmdwVmI4YXJtME5yTnkvTXVTa2x0TWIxSzQraUFiTWltc0w3NW1rWW05Rnlub0JYZWFDa3JGMQorRFMvVEZ1MnZqQWp4czBqN2x5N0xrb0VaRlZFL3JDU1VuSjg0QlgzN3NJQlpWV1NoL2xKVTJhVzc5QkE4THF0VQorbWJpaHpOT2VmMG9kSWpEbXZrYitwYStQTTlxL1RNeGFJazc1cFMveEtraHZIc1hjUittYlZkRkl0TzhWL2NZMgorUitSdW1lTk51bG9OU3FJRnRnK1ljb0xrYVZKY0pMN1lIZk5McDVSYXhiWkN1clIwdUNwL2JlYmpnNW9maE90eAordlVGUW50cThNQkpKZHlaQmgvUDlSU01YcUt2NVdaZy90ZGpsUm42UVBuMUU0aEpHWGdjdHA1cVhMR0RQbE5xNAorYkRmQTNjVHBOYWRCSVZQYm83YXBOZTFNR2JKQkFHZWM1NHBIZDd4RVBjdlF4RStNS0xId0ZKK2dmcGVuSmpmMAorWmhFdkVXUVdOL3YxVVJnYmovdElQVXNteHhDZndKdXJJQjZKU1dTTThyRWFHb2Q1eGs0aGR0d2wzSzZ0Z2ROSQorcEhub2ZWRUZQQ1E1QllRZ3daWWh6OU45MndJREFRQUJvMll3WkRBZEJnTlZIUTRFRmdRVTFnMEcreUdCb0gzYgorWWV0Wk9zUjRLQkxtRFNrd0h3WURWUjBqQkJnd0ZvQVV2QWpXckhmRTBVSjFDTDFUQkxBNm9VT0dseU13RWdZRAorVlIwVEFRSC9CQWd3QmdFQi93SUJBREFPQmdOVkhROEJBZjhFQkFNQ0FZWXdEUVlKS29aSWh2Y05BUUVMQlFBRAorZ2dJQkFEeVdxQ0dma1Y5a3JSNVlmTWhnWWYyOUZZMWhkaGttcXRqK3hNNGszWGp6MlQvUzdtbkszOHRaV3VoeQorRG00Yk5IY09YR0Z2NUxrdDJJMVdoSHNTWWFucFBOeFEwck5mMVE2R04yNWpUVUlMMkxXNEJBRHNvalh4OUZGQworWlI4M3A1c1U4dFVieGtDWXNDTDcxRnJpbURsUDlISTcvREtMUXB0K0FlbjYwNkREL09nQ3BkdTJ6OHFqQUtTbQorOFhZMWc3NklaWGhCUkN3bWVQVUJIWmRFNG1MSUViQTBBNGhsaURwU21ucWNXODJLZ3BMd3FaRVduQnFPUTFqUworU3o2V2tjMTAzbk5tWFUrYmJScnA2UWJJaVhtNk14dmN5TG13RmxzejE3NTVvcDlMMnB0NXU3b1l0bzQ5dW9QWgordXNHNFhjTTN5dTZ4WDk4T2RaOEdZOExmQzVnaktFL2hMeHlxUThXRkRoSExYY1dLOU9Gbk5wT2RaUGRRWS9ocgora0VjOUR5LzZQaFNtMGJjSHdkYi84VUxJcFBlQUs0WW9JL1BuWDZ5RmtRMWQrL3U4djNLVURXaEhMY0R3NmJ4MworbTUrckhTOXFpNXVGcnJNUVZlOWRqVDZmQ2NPU1NPV3lzQm5HamhpLzJrcTBRQU5ZVFdDWnQ1NFBPWld5aGRNOAorZnhpV0tXYjBUWWNaOFdnbEppdzZWYmhndWJZazFMNGU1T2MxMXVzb01aYlB2UWlzVW1NNWpIckcxVW9vbUlpWgorNCsrY3JsUWgxNTB2aEFMUWxNV2lWb3k0a2tjdWtpYW5IUnhUd3l0MFFwNSthWlZXWnNndlhHNEdKVjN6ZEhobAorL1FTMDNEUjhSVnVSK2dvY3l0WjQvQVZlOE9MU2JRZ2t5bzBURmRpK2U5L2Vac3VUCistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUZqRENDQTNTZ0F3SUJBZ0lKQVBrUmE4MjgrcFMvTUEwR0NTcUdTSWIzRFFFQkN3VUFNRk14Q3pBSkJnTlYKK0JBWVRBa2RDTVJBd0RnWURWUVFJREFkRmJtZHNZVzVrTVJJd0VBWURWUVFLREFsSGIyOW5iR1VnVlVzeEREQUsKK0JnTlZCQXNNQTBGbVZ6RVFNQTRHQTFVRUF3d0hVbTl2ZENCRFFUQWVGdzB4T0RBMU1EUXhNek01TlRCYUZ3MHoKK09EQTBNamt4TXpNNU5UQmFNRk14Q3pBSkJnTlZCQVlUQWtkQ01SQXdEZ1lEVlFRSURBZEZibWRzWVc1a01SSXcKK0VBWURWUVFLREFsSGIyOW5iR1VnVlVzeEREQUtCZ05WQkFzTUEwRm1WekVRTUE0R0ExVUVBd3dIVW05dmRDQkQKK1FUQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQU51cy80SUpYbnNmclFBQ1lIcGEKK1psVm9sM1o5OWRIR2Y1aTZ0cUJQOEUydVhHTWM5bnRDMmxOSlp3V3JwdElsaTFmMm1wQlFZYkFzdHBhWk5MWkIKKzhUbzlDeHlTYnFOdFpFWEpFUWhzNXZoM2l5U3RjWGFRSGhyZWlrTHpwZ3IwVXBWckt5K1N2TDRJTGFyS0Y2K1UKK0pOOXZTaEVtTzdBaGZxQnMwbU9VcU51UWxNK2xvSHZoQ3RhK3d0aUxJUUVGeUhYZExJWFIxWUNoM2d3cXJGdEEKK3h2Q0RoSzZKNlpHQU05ZjhXK0xhQ2FXb015bERxRDI3VnRoNnRCaG5SS3R5ZldqOGJrRStzUEtna0liMDl5a3MKKzBTakFxMmJITXBlMDduTVI1QkhSRVZsNzNoMVFzd1pWWVFLSTIxUExBYzk3NnIxZWM3VTFvdmlIUXVQU3BOQlEKK0wwdC8wVjhYNmpCZTJTelBmcEc4STM0SFBzL1VQeVBDQzdFdTUxNE1WMDNPZHZXeDI0WGJ2ZndRb1pseFEvZzQKKzZnZzlqU0kvODdyRmZJOTJyOE5qZ1ZnODhRV1RwUmFCaDE1QlNyUlhFa3Z6ZW52anM3VGx4Z3hkU21DNndzdUgKK2pmRVlDZmVsWnZNRUhCd0s5aEN3emF2RnRpVFRmc3lxOUZCZHZ0cHAzNUlGZDdOdmcwajBFdEtlV1RGVEVPM3oKK3AwMHlObjIwZE5ENXByWE1uVEE2WEtuLytjRlJ3SUt4N01oNStOSzh6SkJraC8zMmdyaXllMDZaR3ZIM3RmRlIKKzQ1VGtZa1M3c3hZYm1hVEVnL3NlV0g4bmtCVzI0cS9JdFkvTTB4ZWJQWFNlbU04UmRoRVkvbmxWTXhPL1FLbCsKK2phNHJjN3pxekZsb25UdS96UDBRYVZWOUFnTUJBQUdqWXpCaE1CMEdBMVVkRGdRV0JCUzhDTmFzZDhUUlFuVUkKK3ZWTUVzRHFoUTRhWEl6QWZCZ05WSFNNRUdEQVdnQlM4Q05hc2Q4VFJRblVJdlZNRXNEcWhRNGFYSXpBUEJnTlYKK0hSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQmhqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUEKK1kxcklEUEFVYzRnMEdNWDgvVjRLWkFSRnJNN3FsNjR3cXBqeUo0cWUrZFhuWDBmQWpodlFmZjhvelBkWjQ0TjIKK0NBdWtLQ01PNzREdG5GV0FJL01qQVRBWGZyVGVCdHpuUWlHb3BuTytjSEF2V1A2VSs3dXVVcUNRY1lXYUN4L2IKK2V5RUFhT2c3RlZVUTR2VGRsNHFnc3FhZ3lqcUJGaWVmcFRZWWRIM3diV3NvMk4zeFVUQmJuVUhKWjJoK0xHTVcKK1ZTLy9oeXhoTktqWGpDS3RPSlFtZzV4MURRUGkxdGlReDlQY2pNcUNzYnpFemJyN0dyNG90T3VlK2ZEV25GVFIKK0FWVXR4aWdMazUwOE5yQXJidklLNllDWjBlU3NSVmVhTWtuZmNGeHE3T2g5d1hCRFhOblErR2YrWTRQQ0x6MkYKK0ZSSi8rOEFhWlluTGpUYkoyQnkzdTZyNXhrTG9LVW9MRjhXNEVSTUY0ZUVRelUwd0FTTFlZSTFTZHpxRVpqdjkKK3lERjdFMkNBVHMwLzNYODlIb2xuT2RNVHhCSkJkT0VBcGc1M2Y3blNzTUxTWWMxdW1iZlBSZy9kYjVGT2hydVIKK3h3Q3pjREpFcFQyTllubW5EdHpJSXNRTHJPTFpBYy9LTHNSMzQ2c2NYaklxZlczdUpGcUY3Skt1MjE3UUhtUnEKK2NQSGpvVFgydld6SkgybW80M2ZwUnpKRVhoVGhRMElpNkNPSDNyOE9TY1N4eUM0eXJEb09TdmRtTDFxOUtUSCsKK28yRDUyV1ROZ2xtSnk0TktmdUFjczNFUG1tYWY4ZnY5a09nRTY2N0lmbTJ5bDUvTnZ4REFXcTRVb2VDSUhCZjkKKzc2YjlVOHhRZ0tGQ1RYV1F1MjNrTXh1TmFhUEh3VFBqQmh4QTYrUGp4aDg9CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQW5kUHJvZmlsZU93bmVyL2Fzc2V0cy91c2VyLWNlcnQtY2hhaW4ua2V5IGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFuZFByb2ZpbGVPd25lci9hc3NldHMvdXNlci1jZXJ0LWNoYWluLmtleQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmQ1OTQyCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFuZFByb2ZpbGVPd25lci9hc3NldHMvdXNlci1jZXJ0LWNoYWluLmtleQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQW5kUHJvZmlsZU93bmVyL2xhdGVzdC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFuZFByb2ZpbGVPd25lci9sYXRlc3QvQW5kcm9pZC5tawppbmRleCA4MWEyM2QyLi40ZGU2NWJhIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQW5kUHJvZmlsZU93bmVyL2xhdGVzdC9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBbmRQcm9maWxlT3duZXIvbGF0ZXN0L0FuZHJvaWQubWsKQEAgLTE3LDYgKzE3LDcgQEAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzRGV2aWNlQW5kUHJvZmlsZU93bmVyQXBwCitMT0NBTF9QUklWQVRFX1BMQVRGT1JNX0FQSVMgOj0gdHJ1ZQogCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAogCkBAIC0yNCwxNSArMjUsMjYgQEAKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgLi4vc3JjKQogCi1MT0NBTF9KQVZBX0xJQlJBUklFUyA9IGNvbnNjcnlwdAorTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gXAorICAgIGFuZHJvaWQudGVzdC5ydW5uZXIuc3R1YnMgXAorICAgIGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzIFwKIAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTID0gYW5kcm9pZC1zdXBwb3J0LXY0IGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwgY3RzdGVzdHJ1bm5lciB1Yi11aWF1dG9tYXRvcgorTE9DQUxfVVNFX0FBUFQyIDo9IHRydWUKIAotTE9DQUxfU0RLX1ZFUlNJT04gOj0gdGVzdF9jdXJyZW50CitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAorICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0IFwKKyAgICBjdHN0ZXN0cnVubmVyLWF4dCBcCisgICAgdWItdWlhdXRvbWF0b3IgXAorICAgIGN0cy1zZWN1cml0eS10ZXN0LXN1cHBvcnQtbGlicmFyeQorCitMT0NBTF9TVEFUSUNfQU5EUk9JRF9MSUJSQVJJRVMgOj0gXAorICAgIGFuZHJvaWR4LmxlZ2FjeV9sZWdhY3ktc3VwcG9ydC12NAogCiBMT0NBTF9SRVNPVVJDRV9ESVIgOj0gJChMT0NBTF9QQVRIKS8uLi9yZXMKIAorTE9DQUxfQVNTRVRfRElSIDo9ICQoTE9DQUxfUEFUSCkvLi4vYXNzZXRzCisKICMgdGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGFyY3RzIGN0cyB2dHMgZ2VuZXJhbC10ZXN0cwogCiBpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQW5kUHJvZmlsZU93bmVyL2xhdGVzdC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFuZFByb2ZpbGVPd25lci9sYXRlc3QvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCAwZGM4YmMzLi4xNTUwZmU2IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQW5kUHJvZmlsZU93bmVyL2xhdGVzdC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBbmRQcm9maWxlT3duZXIvbGF0ZXN0L0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTE5LDYgKzE5LDkgQEAKIAogICAgIDx1c2VzLXNkayBhbmRyb2lkOm1pblNka1ZlcnNpb249IjIzIi8+CiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5BQ0NFU1NfTkVUV09SS19TVEFURSIvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX1dJRklfU1RBVEUiLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkNIQU5HRV9XSUZJX1NUQVRFIi8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5BQ0NFU1NfQ09BUlNFX0xPQ0FUSU9OIiAvPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQVVUSEVOVElDQVRFX0FDQ09VTlRTIiAvPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uRElTQUJMRV9LRVlHVUFSRCIgLz4KICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLklOVEVSTkVUIiAvPgpAQCAtMjYsNiArMjksOCBAQAogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVBRF9FWFRFUk5BTF9TVE9SQUdFIiAvPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uU0VUX1dBTExQQVBFUiIgLz4KICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9BVURJT19TRVRUSU5HUyIgLz4KKyAgICA8IS0tIE5lZWRlZCB0byByZWFkIHRoZSBzZXJpYWwgbnVtYmVyIGR1cmluZyBEZXZpY2UgSUQgYXR0ZXN0YXRpb24gdGVzdHMgLS0+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX1BIT05FX1NUQVRFIiAvPgogCiAgICAgPCEtLSBBZGQgYSBuZXR3b3JrIHNlY3VyaXR5IGNvbmZpZyB0aGF0IHRydXN0cyB1c2VyIGFkZGVkIENBcyBmb3IgdGVzdHMgLS0+CiAgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bmV0d29ya1NlY3VyaXR5Q29uZmlnPSJAeG1sL25ldHdvcmtfc2VjdXJpdHlfY29uZmlnIgpAQCAtNjgsMTAgKzczLDE2IEBACiAgICAgICAgIDwvYWN0aXZpdHk+CiAKICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuY3RzLmRldmljZWFuZHByb2ZpbGVvd25lci5BdXRvZmlsbEFjdGl2aXR5Ii8+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLlByaW50QWN0aXZpdHkiLz4KKworICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuY3RzLmRldmljZWFuZHByb2ZpbGVvd25lci5LZXlNYW5hZ2VtZW50QWN0aXZpdHkiCisgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5UcmFuc2x1Y2VudC5Ob1RpdGxlQmFyIiAvPgogICAgIDwvYXBwbGljYXRpb24+CiAKICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IlByb2ZpbGUgYW5kIERldmljZSBPd25lciBDVFMgVGVzdHMiCiAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5hbmRyb2lkLmN0cy5kZXZpY2VhbmRwcm9maWxlb3duZXIiPgogICAgICAgICA8bWV0YS1kYXRhCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQW5kUHJvZmlsZU93bmVyL3Jlcy9yYXcvcmluZ2VyLm1wMyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBbmRQcm9maWxlT3duZXIvcmVzL3Jhdy9yaW5nZXIubXAzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMDUyZTcKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQW5kUHJvZmlsZU93bmVyL3Jlcy9yYXcvcmluZ2VyLm1wMwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlT3duZXIvYXNzZXRzL2NhLmNvbmYgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQW5kUHJvZmlsZU93bmVyL3NjcmlwdHMvY2EuY29uZgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZU93bmVyL2Fzc2V0cy9jYS5jb25mCnJlbmFtZSB0byBob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQW5kUHJvZmlsZU93bmVyL3NjcmlwdHMvY2EuY29uZgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFuZFByb2ZpbGVPd25lci9zY3JpcHRzL2dlbmVyYXRlLWNsaWVudC1jZXJ0LWNoYWluLnNoIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFuZFByb2ZpbGVPd25lci9zY3JpcHRzL2dlbmVyYXRlLWNsaWVudC1jZXJ0LWNoYWluLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRmMmYzODAKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQW5kUHJvZmlsZU93bmVyL3NjcmlwdHMvZ2VuZXJhdGUtY2xpZW50LWNlcnQtY2hhaW4uc2gKQEAgLTAsMCArMSw5NyBAQAorIyEvYmluL2Jhc2gKKworIworIyBHZW5lcmF0ZXM6CisjICAtIHVzZXItY2VydC1jaGFpbi5jcnQKKyMgIC0gdXNlci1jZXJ0LWNoYWluLmtleQorIworCitzZXQgLWUKKworV09SS0RJUj0ndGVtcCcKK1RBUkdFVERJUj0nLi4vYXNzZXRzLycKKworcm0gLXJmICIkV09SS0RJUiIKK21rZGlyICIkV09SS0RJUiIKK2NwIGNhLmNvbmYgIiRXT1JLRElSLyIKK3B1c2hkICIkV09SS0RJUiIKKworIyMgR2VuZXJhdGUgcm9vdCBDQQorbWtkaXIgLXAgcm9vdGNhL3tjZXJ0cyxjcmwsbmV3Y2VydHMscHJpdmF0ZX0KK3B1c2hkIHJvb3RjYQordG91Y2ggaW5kZXgudHh0CitlY2hvICcxMDAwJyA+IHNlcmlhbAorb3BlbnNzbCByZXEgXAorICAgIC1jb25maWcgLi4vY2EuY29uZiBcCisgICAgLW5ldyBcCisgICAgLXg1MDkgXAorICAgIC1kYXlzIDczMDAgXAorICAgIC1zaGEyNTYgXAorICAgIC1leHRlbnNpb25zIHYzX2NhIFwKKyAgICAtbm9kZXMgXAorICAgIC1rZXlvdXQgcHJpdmF0ZS9jYS5rZXkucGVtIFwKKyAgICAtb3V0IGNlcnRzL2NhLmNlcnQucGVtCitwb3BkCisKKyMjIEdlbmVyYXRlIEludGVybWVkaWF0ZSBDQQorbWtkaXIgaW50ZXJtZWRpYXRlIGludGVybWVkaWF0ZS97Y2VydHMsY3JsLGNzcixuZXdjZXJ0cyxwcml2YXRlfQordG91Y2ggaW50ZXJtZWRpYXRlL2luZGV4LnR4dAorCitlY2hvICcxMDAwJyA+IGludGVybWVkaWF0ZS9zZXJpYWwKK2VjaG8gJzEwMDAnID4gaW50ZXJtZWRpYXRlL2NybG51bWJlcgorCitvcGVuc3NsIHJlcSBcCisgICAgLWNvbmZpZyBjYS5jb25mIFwKKyAgICAtbmV3IFwKKyAgICAtc2hhMjU2IFwKKyAgICAtbm9kZXMgXAorICAgIC1rZXlvdXQgaW50ZXJtZWRpYXRlL3ByaXZhdGUvaW50ZXJtZWRpYXRlLmtleS5wZW0gXAorICAgIC1vdXQgaW50ZXJtZWRpYXRlL2Nzci9pbnRlcm1lZGlhdGUuY3NyLnBlbQorCitvcGVuc3NsIGNhIFwKKyAgICAtY29uZmlnIGNhLmNvbmYgXAorICAgIC1uYW1lIFJvb3RDQSBcCisgICAgLWV4dGVuc2lvbnMgdjNfaW50ZXJtZWRpYXRlX2NhIFwKKyAgICAtZGF5cyAzNjUwIFwKKyAgICAtbm90ZXh0IFwKKyAgICAtbWQgc2hhMjU2IFwKKyAgICAtaW4gaW50ZXJtZWRpYXRlL2Nzci9pbnRlcm1lZGlhdGUuY3NyLnBlbSBcCisgICAgLW91dCBpbnRlcm1lZGlhdGUvY2VydHMvaW50ZXJtZWRpYXRlLmNlcnQucGVtCisKKyMjIEdlbmVyYXRlIGNsaWVudCBjZXJ0CitvcGVuc3NsIHJlcSBcCisgICAgLWNvbmZpZyBjYS5jb25mIFwKKyAgICAtbmV3a2V5IHJzYToxMDI0IFwKKyAgICAta2V5b3V0IHVzZXIua2V5LnBlbSBcCisgICAgLW5vZGVzIFwKKyAgICAtZGF5cyAzNjUwIFwKKyAgICAtb3V0IHVzZXIuY3NyLnBlbQorCitvcGVuc3NsIGNhIFwKKyAgICAtY29uZmlnIGNhLmNvbmYgXAorICAgIC1uYW1lIEludGVybWVkaWF0ZUNBIFwKKyAgICAtZXh0ZW5zaW9ucyB1c3JfY2VydCBcCisgICAgLWRheXMgMzY1IFwKKyAgICAtbm90ZXh0IFwKKyAgICAtbWQgc2hhMjU2IFwKKyAgICAtaW4gdXNlci5jc3IucGVtIFwKKyAgICAtb3V0IHVzZXIuY2VydC5wZW0KKworcG9wZCAjIFdPUktESVIKKworIyMgQ29udmVydCBjbGllbnQgY2VydCB0byBhY2NlcHRhYmxlIGZvcm0KK2NhdCBcCisgICAgIiRXT1JLRElSIi91c2VyLmNlcnQucGVtIFwKKyAgICAiJFdPUktESVIiL2ludGVybWVkaWF0ZS9jZXJ0cy9pbnRlcm1lZGlhdGUuY2VydC5wZW0gXAorICAgICIkV09SS0RJUiIvcm9vdGNhL2NlcnRzL2NhLmNlcnQucGVtIFwKKyAgICA+ICIkVEFSR0VURElSIi91c2VyLWNlcnQtY2hhaW4uY3J0CisKK29wZW5zc2wgcGtjczggXAorICAgIC10b3BrOCBcCisgICAgLW5vY3J5cHQgXAorICAgIC1pbmZvcm0gUEVNIFwKKyAgICAtb3V0Zm9ybSBERVIgXAorICAgIC1pbiAiJFdPUktESVIiL3VzZXIua2V5LnBlbSBcCisgICAgLW91dCAiJFRBUkdFVERJUiIvdXNlci1jZXJ0LWNoYWluLmtleQorCitybSAtciAiJFdPUktESVIiCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQW5kUHJvZmlsZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlYW5kcHJvZmlsZW93bmVyL0FsbG93ZWRBY2NvdW50TWFuYWdlbWVudFRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBbmRQcm9maWxlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2VhbmRwcm9maWxlb3duZXIvQWxsb3dlZEFjY291bnRNYW5hZ2VtZW50VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MWU3MTEKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQW5kUHJvZmlsZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlYW5kcHJvZmlsZW93bmVyL0FsbG93ZWRBY2NvdW50TWFuYWdlbWVudFRlc3QuamF2YQpAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY3RzLmRldmljZWFuZHByb2ZpbGVvd25lcjsKKworaW1wb3J0IGFuZHJvaWQuYWNjb3VudHMuQWNjb3VudDsKK2ltcG9ydCBhbmRyb2lkLmFjY291bnRzLkFjY291bnRNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuYWNjb3VudHMuQXV0aGVudGljYXRvckV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmFjY291bnRzLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQuYXBwLmFkbWluLkRldmljZVBvbGljeU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5Vc2VyTWFuYWdlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogVGhlc2UgdGVzdHMgdmVyaWZ5IHRoYXQgdGhlIGRldmljZSAvIHByb2ZpbGUgb3duZXIgY2FuIHVzZSBhY2NvdW50IG1hbmFnZW1lbnQgQVBJcyB0byBhZGQKKyAqIGFjY291bnRzIGV2ZW4gd2hlbiBwb2xpY2llcyBhcmUgc2V0LiBUaGUgcG9saWNpZXMgdGVzdGVkIGFyZQorICoge0BsaW5rIERldmljZVBvbGljeU1hbmFnZXIjc2V0QWNjb3VudE1hbmFnZW1lbnREaXNhYmxlZH0gYW5kCisgKiB7QGxpbmsgVXNlck1hbmFnZXIjRElTQUxMT1dfTU9ESUZZX0FDQ09VTlRTfS4KKyAqCisgKiBUaGlzIHRlc3QgZGVwZW5kcyBvbiB7QGxpbmsgY29tLmFuZHJvaWQuY3RzLmRldmljZXBvbGljeS5hY2NvdW50bWFuYWdlbWVudC5Nb2NrQWNjb3VudFNlcnZpY2V9LAorICogd2hpY2ggcHJvdmlkZXMgYXV0aGVudGljYXRvciBmb3IgYSBtb2NrIGFjY291bnQgdHlwZS4KKyAqLworcHVibGljIGNsYXNzIEFsbG93ZWRBY2NvdW50TWFuYWdlbWVudFRlc3QgZXh0ZW5kcyBCYXNlRGV2aWNlQWRtaW5UZXN0IHsKKworICAgIC8vIEFjY291bnQgdHlwZSBmb3IgTW9ja0FjY291bnRBdXRoZW50aWNhdG9yCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFDQ09VTlRfVFlQRV8xID0KKyAgICAgICAgICAgICJjb20uYW5kcm9pZC5jdHMuZGV2aWNlcG9saWN5LmFjY291bnRtYW5hZ2VtZW50LmFjY291bnQudHlwZSI7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFDQ09VTlRfVFlQRV8yID0gImNvbS5kdW1teS5hY2NvdW50IjsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBBY2NvdW50IEFDQ09VTlQgPSBuZXcgQWNjb3VudCgidXNlcjAiLCBBQ0NPVU5UX1RZUEVfMSk7CisKKyAgICBwcml2YXRlIEFjY291bnRNYW5hZ2VyIG1BY2NvdW50TWFuYWdlcjsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgIG1BY2NvdW50TWFuYWdlciA9IChBY2NvdW50TWFuYWdlcikgbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkFDQ09VTlRfU0VSVklDRSk7CisgICAgICAgIGNsZWFyQWxsQWNjb3VudE1hbmFnZW1lbnREaXNhYmxlZCgpOworICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5jbGVhclVzZXJSZXN0cmljdGlvbihBRE1JTl9SRUNFSVZFUl9DT01QT05FTlQsCisgICAgICAgICAgICAgICAgVXNlck1hbmFnZXIuRElTQUxMT1dfTU9ESUZZX0FDQ09VTlRTKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBjbGVhckFsbEFjY291bnRNYW5hZ2VtZW50RGlzYWJsZWQoKTsKKyAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuY2xlYXJVc2VyUmVzdHJpY3Rpb24oQURNSU5fUkVDRUlWRVJfQ09NUE9ORU5ULAorICAgICAgICAgICAgICAgIFVzZXJNYW5hZ2VyLkRJU0FMTE9XX01PRElGWV9BQ0NPVU5UUyk7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFjY291bnRNYW5hZ2VtZW50RGlzYWJsZWRfc2V0dGVyQW5kR2V0dGVyKCkgeworICAgICAgICAvLyBTb21lIGxvY2FsIHRlc3RzOiBhZGRpbmcgYW5kIHJlbW92aW5nIGRpc2FibGVkIGFjY291bnRzIGFuZCBtYWtlIHN1cmUKKyAgICAgICAgLy8gRGV2aWNlUG9saWN5TWFuYWdlciBrZWVwcyB0cmFjayBvZiB0aGUgZGlzYWJsZWQgc2V0IGNvcnJlY3RseQorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbURldmljZVBvbGljeU1hbmFnZXIuZ2V0QWNjb3VudFR5cGVzV2l0aE1hbmFnZW1lbnREaXNhYmxlZCgpLmxlbmd0aCk7CisKKyAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuc2V0QWNjb3VudE1hbmFnZW1lbnREaXNhYmxlZChBRE1JTl9SRUNFSVZFUl9DT01QT05FTlQsIEFDQ09VTlRfVFlQRV8xLAorICAgICAgICAgICAgICAgIHRydWUpOworICAgICAgICAvLyBUZXN0IGlmIGRpc2FibGluZyBBQ0NPVU5UX1RZUEVfMiBhZmZlY3RzIEFDQ09VTlRfVFlQRV8xCisgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnNldEFjY291bnRNYW5hZ2VtZW50RGlzYWJsZWQoQURNSU5fUkVDRUlWRVJfQ09NUE9ORU5ULCBBQ0NPVU5UX1RZUEVfMiwKKyAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtRGV2aWNlUG9saWN5TWFuYWdlci5nZXRBY2NvdW50VHlwZXNXaXRoTWFuYWdlbWVudERpc2FibGVkKCkubGVuZ3RoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFDQ09VTlRfVFlQRV8xLAorICAgICAgICAgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmdldEFjY291bnRUeXBlc1dpdGhNYW5hZ2VtZW50RGlzYWJsZWQoKVswXSk7CisKKyAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuc2V0QWNjb3VudE1hbmFnZW1lbnREaXNhYmxlZChBRE1JTl9SRUNFSVZFUl9DT01QT05FTlQsIEFDQ09VTlRfVFlQRV8xLAorICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmdldEFjY291bnRUeXBlc1dpdGhNYW5hZ2VtZW50RGlzYWJsZWQoKS5sZW5ndGgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBY2NvdW50TWFuYWdlbWVudERpc2FibGVkX3Byb2ZpbGVBbmREZXZpY2VPd25lckNhbkFkZEFjY291bnQoKQorICAgICAgICAgICAgdGhyb3dzIEF1dGhlbnRpY2F0b3JFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiB7CisgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnNldEFjY291bnRNYW5hZ2VtZW50RGlzYWJsZWQoQURNSU5fUkVDRUlWRVJfQ09NUE9ORU5ULCBBQ0NPVU5UX1RZUEVfMSwKKyAgICAgICAgICAgICAgICB0cnVlKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbUFjY291bnRNYW5hZ2VyLmdldEFjY291bnRzQnlUeXBlKEFDQ09VTlRfVFlQRV8xKS5sZW5ndGgpOworICAgICAgICAvLyBNYW5hZ2VtZW50IGlzIGRpc2FibGVkLCBidXQgdGhlIGRldmljZSAvIHByb2ZpbGUgb3duZXIgaXMgc3RpbGwgYWxsb3dlZCB0byB1c2UgdGhlIEFQSXMKKyAgICAgICAgQnVuZGxlIHJlc3VsdCA9IG1BY2NvdW50TWFuYWdlci5hZGRBY2NvdW50KEFDQ09VTlRfVFlQRV8xLAorICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpLmdldFJlc3VsdCgpOworCisgICAgICAgIC8vIE5vcm1hbGx5IHRoZSBleHBlY3RlZCByZXN1bHQgb2YgYWRkQWNjb3VudCgpIGlzIEFjY291bnRNYW5hZ2VyIHJldHVybmluZworICAgICAgICAvLyBhbiBpbnRlbnQgdG8gc3RhcnQgdGhlIGF1dGhlbnRpY2F0b3IgYWN0aXZpdHkgZm9yIGFkZGluZyBuZXcgYWNjb3VudHMuCisgICAgICAgIC8vIEJ1dCBNb2NrQWNjb3VudEF1dGhlbnRpY2F0b3IgcmV0dXJucyBhIG5ldyBhY2NvdW50IHN0cmFpZ2h0d2F5LgorICAgICAgICBhc3NlcnRFcXVhbHMoQUNDT1VOVF9UWVBFXzEsIHJlc3VsdC5nZXRTdHJpbmcoQWNjb3VudE1hbmFnZXIuS0VZX0FDQ09VTlRfVFlQRSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RVc2VyUmVzdHJpY3Rpb25fcHJvZmlsZUFuZERldmljZU93bmVyQ2FuQWRkQW5kUmVtb3ZlQWNjb3VudCgpCisgICAgICAgICAgICB0aHJvd3MgQXV0aGVudGljYXRvckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKKyAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuYWRkVXNlclJlc3RyaWN0aW9uKEFETUlOX1JFQ0VJVkVSX0NPTVBPTkVOVCwKKyAgICAgICAgICAgICAgICBVc2VyTWFuYWdlci5ESVNBTExPV19NT0RJRllfQUNDT1VOVFMpOworCisgICAgICAgIGFzc2VydEVxdWFscygwLCBtQWNjb3VudE1hbmFnZXIuZ2V0QWNjb3VudHNCeVR5cGUoQUNDT1VOVF9UWVBFXzEpLmxlbmd0aCk7CisgICAgICAgIC8vIE1hbmFnZW1lbnQgaXMgZGlzYWJsZWQsIGJ1dCB0aGUgZGV2aWNlIC8gcHJvZmlsZSBvd25lciBpcyBzdGlsbCBhbGxvd2VkIHRvIHVzZSB0aGUgQVBJcworICAgICAgICBCdW5kbGUgcmVzdWx0ID0gbUFjY291bnRNYW5hZ2VyLmFkZEFjY291bnQoQUNDT1VOVF9UWVBFXzEsCisgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCkuZ2V0UmVzdWx0KCk7CisKKyAgICAgICAgLy8gTm9ybWFsbHkgdGhlIGV4cGVjdGVkIHJlc3VsdCBvZiBhZGRBY2NvdW50KCkgaXMgQWNjb3VudE1hbmFnZXIgcmV0dXJuaW5nCisgICAgICAgIC8vIGFuIGludGVudCB0byBzdGFydCB0aGUgYXV0aGVudGljYXRvciBhY3Rpdml0eSBmb3IgYWRkaW5nIG5ldyBhY2NvdW50cy4KKyAgICAgICAgLy8gQnV0IE1vY2tBY2NvdW50QXV0aGVudGljYXRvciByZXR1cm5zIGEgbmV3IGFjY291bnQgc3RyYWlnaHR3YXkuCisgICAgICAgIGFzc2VydEVxdWFscyhBQ0NPVU5UX1RZUEVfMSwgcmVzdWx0LmdldFN0cmluZyhBY2NvdW50TWFuYWdlci5LRVlfQUNDT1VOVF9UWVBFKSk7CisKKyAgICAgICAgcmVzdWx0ID0gbUFjY291bnRNYW5hZ2VyLnJlbW92ZUFjY291bnQoQUNDT1VOVCwgbnVsbCwgbnVsbCwgbnVsbCkuZ2V0UmVzdWx0KCk7CisgICAgICAgIGFzc2VydFRydWUocmVzdWx0LmdldEJvb2xlYW4oQWNjb3VudE1hbmFnZXIuS0VZX0JPT0xFQU5fUkVTVUxUKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZUFjY291bnRfbm9Vc2VyUmVzdHJpY3Rpb24oKQorICAgICAgICAgICAgdGhyb3dzIEF1dGhlbnRpY2F0b3JFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFdlIG9ubHkgd2FudCB0byB2ZXJpZnkgcmVtb3ZlQWNjb3VudCBjYW4gdGhyb3VnaCB0byBBY2NvdW50TWFuYWdlclNlcnZpY2Ugd2l0aG91dAorICAgICAgICAvLyB0aHJvd2luZyBhbiBFeGNlcHRpb24sIHNvIGl0J3Mgbm90IG5lY2Vzc2FyeSB0byBhZGQgdGhlIGFjY291bnQgYmVmb3JlIHJlbW92YWwuCisgICAgICAgIEJ1bmRsZSByZXN1bHQgPSBtQWNjb3VudE1hbmFnZXIucmVtb3ZlQWNjb3VudChBQ0NPVU5ULCBudWxsLCBudWxsLCBudWxsKS5nZXRSZXN1bHQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0Qm9vbGVhbihBY2NvdW50TWFuYWdlci5LRVlfQk9PTEVBTl9SRVNVTFQpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2xlYXJBbGxBY2NvdW50TWFuYWdlbWVudERpc2FibGVkKCkgeworICAgICAgICBmb3IgKFN0cmluZyBhY2NvdW50VHlwZSA6IG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmdldEFjY291bnRUeXBlc1dpdGhNYW5hZ2VtZW50RGlzYWJsZWQoKSkgeworICAgICAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuc2V0QWNjb3VudE1hbmFnZW1lbnREaXNhYmxlZChBRE1JTl9SRUNFSVZFUl9DT01QT05FTlQsIGFjY291bnRUeXBlLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmdldEFjY291bnRUeXBlc1dpdGhNYW5hZ2VtZW50RGlzYWJsZWQoKS5sZW5ndGgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBbmRQcm9maWxlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2VhbmRwcm9maWxlb3duZXIvQWx3YXlzT25WcG5VbnN1cHBvcnRlZFRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBbmRQcm9maWxlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2VhbmRwcm9maWxlb3duZXIvQWx3YXlzT25WcG5VbnN1cHBvcnRlZFRlc3QuamF2YQppbmRleCAwMTYwOTBlLi40ODg4MjNhIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQW5kUHJvZmlsZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlYW5kcHJvZmlsZW93bmVyL0Fsd2F5c09uVnBuVW5zdXBwb3J0ZWRUZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFuZFByb2ZpbGVPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZWFuZHByb2ZpbGVvd25lci9BbHdheXNPblZwblVuc3VwcG9ydGVkVGVzdC5qYXZhCkBAIC0xOCw4ICsxOCw2IEBACiAKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY3RzLmRldmljZWFuZHByb2ZpbGVvd25lci52cG4uVnBuVGVzdEhlbHBlci5WUE5fUEFDS0FHRTsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ2RkVGVzdDsKLQogLyoqCiAgKiBWYWxpZGF0ZXMgdGhhdCBhIGRldmljZSBvd25lciBvciBwcm9maWxlIG93bmVyIGNhbm5vdCBlbmFibGUgdGhlIGFsd2F5cy1vbiBmZWF0dXJlIGZvcgogICogdW5zdXBwb3J0ZWQgVlBOIGFwcHMuCkBAIC0zMSw3ICsyOSw2IEBACiAgKiAgICAgICAgIHtAbGluayBhbmRyb2lkLm5ldC5WcG5TZXJ2aWNlI1NFUlZJQ0VfTUVUQV9EQVRBX1NVUFBPUlRTX0FMV0FZU19PTn08L2xpPgogICogPC91bD4KICAqLwotQENkZFRlc3QocmVxdWlyZW1lbnQ9IjkuOC40L0MtMy0xIikKIHB1YmxpYyBjbGFzcyBBbHdheXNPblZwblVuc3VwcG9ydGVkVGVzdCBleHRlbmRzIEJhc2VEZXZpY2VBZG1pblRlc3QgewogCiAgICAgcHVibGljIHZvaWQgdGVzdEFzc2VydE5vQWx3YXlzT25WcG4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBbmRQcm9maWxlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2VhbmRwcm9maWxlb3duZXIvQXNzaXN0U2NyZWVuQ2FwdHVyZURpc2FibGVkVGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFuZFByb2ZpbGVPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZWFuZHByb2ZpbGVvd25lci9Bc3Npc3RTY3JlZW5DYXB0dXJlRGlzYWJsZWRUZXN0LmphdmEKaW5kZXggZDA3NjkyMC4uZTE3MTYzNiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFuZFByb2ZpbGVPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZWFuZHByb2ZpbGVvd25lci9Bc3Npc3RTY3JlZW5DYXB0dXJlRGlzYWJsZWRUZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFuZFByb2ZpbGVPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZWFuZHByb2ZpbGVvd25lci9Bc3Npc3RTY3JlZW5DYXB0dXJlRGlzYWJsZWRUZXN0LmphdmEKQEAgLTEsMTcgKzEsMTggQEAKIHBhY2thZ2UgY29tLmFuZHJvaWQuY3RzLmRldmljZWFuZHByb2ZpbGVvd25lcjsKIAoraW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKwogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5CbG9ja2luZ0Jyb2FkY2FzdFJlY2VpdmVyOwogCiBpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKQEAgLTIyLDggKzIzLDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5MaW5rZWRCbG9ja2luZ1F1ZXVlOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotCiAvKioKICAqIFRlc3RpbmcKICAqIHtAbGluayBhbmRyb2lkLmFwcC5hZG1pbi5EZXZpY2VQb2xpY3lNYW5hZ2VyI3NldFNjcmVlbkNhcHR1cmVEaXNhYmxlZChDb21wb25lbnROYW1lLCBib29sZWFuKX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBbmRQcm9maWxlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2VhbmRwcm9maWxlb3duZXIvQXVkaW9SZXN0cmljdGlvblRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBbmRQcm9maWxlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2VhbmRwcm9maWxlb3duZXIvQXVkaW9SZXN0cmljdGlvblRlc3QuamF2YQppbmRleCBkNDRiNzgyLi41NmMzNTk2IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQW5kUHJvZmlsZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlYW5kcHJvZmlsZW93bmVyL0F1ZGlvUmVzdHJpY3Rpb25UZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFuZFByb2ZpbGVPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZWFuZHByb2ZpbGVvd25lci9BdWRpb1Jlc3RyaWN0aW9uVGVzdC5qYXZhCkBAIC0xOCw4ICsxOCwxMCBAQAogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKIGltcG9ydCBhbmRyb2lkLm9zLlVzZXJNYW5hZ2VyOwpAQCAtMzEsNiArMzMsNyBAQAogCiAgICAgcHJpdmF0ZSBBdWRpb01hbmFnZXIgbUF1ZGlvTWFuYWdlcjsKICAgICBwcml2YXRlIFBhY2thZ2VNYW5hZ2VyIG1QYWNrYWdlTWFuYWdlcjsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVVzZUZpeGVkVm9sdW1lOwogICAgIHByaXZhdGUgZmluYWwgQ2FsbGFibGU8Qm9vbGVhbj4gbUNoZWNrSWZNYXN0ZXJWb2x1bWVNdXRlZCA9IG5ldyBDYWxsYWJsZTxCb29sZWFuPigpIHsKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBCb29sZWFuIGNhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTQzLDYgKzQ2LDggQEAKICAgICAgICAgc3VwZXIuc2V0VXAoKTsKICAgICAgICAgbUF1ZGlvTWFuYWdlciA9IChBdWRpb01hbmFnZXIpIG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BVURJT19TRVJWSUNFKTsKICAgICAgICAgbVBhY2thZ2VNYW5hZ2VyID0gbUNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKTsKKyAgICAgICAgbVVzZUZpeGVkVm9sdW1lID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0Qm9vbGVhbigKKyAgICAgICAgICAgICAgICBSZXNvdXJjZXMuZ2V0U3lzdGVtKCkuZ2V0SWRlbnRpZmllcigiY29uZmlnX3VzZUZpeGVkVm9sdW1lIiwgImJvb2wiLCAiYW5kcm9pZCIpKTsKICAgICB9CiAKICAgICAvLyBIZXJlIHdlIHRlc3QgdGhhdCBESVNBTExPV19BREpVU1RfVk9MVU1FIGRpc2FsbG93cyB0byB1bm11dGUgdm9sdW1lLgpAQCAtODAsMTIgKzg1LDEzIEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdERpc2FsbG93QWRqdXN0Vm9sdW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghbVBhY2thZ2VNYW5hZ2VyLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9BVURJT19PVVRQVVQpKSB7CisgICAgICAgIGlmICghbVBhY2thZ2VNYW5hZ2VyLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9BVURJT19PVVRQVVQpIHx8IG1Vc2VGaXhlZFZvbHVtZSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKKyAgICAgICAgVXJpIHVyaSA9IFVyaS5wYXJzZSgiYW5kcm9pZC5yZXNvdXJjZTovLyIgKyBtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpICsgIi8iICsgUi5yYXcucmluZ2VyKTsKICAgICAgICAgTWVkaWFQbGF5ZXIgbWVkaWFQbGF5ZXIgPSBuZXcgTWVkaWFQbGF5ZXIoKTsKLSAgICAgICAgbWVkaWFQbGF5ZXIuc2V0RGF0YVNvdXJjZShtQ29udGV4dCwgU2V0dGluZ3MuU3lzdGVtLkRFRkFVTFRfUklOR1RPTkVfVVJJKTsKKyAgICAgICAgbWVkaWFQbGF5ZXIuc2V0RGF0YVNvdXJjZShtQ29udGV4dCwgdXJpKTsKICAgICAgICAgbWVkaWFQbGF5ZXIuc2V0QXVkaW9TdHJlYW1UeXBlKEF1ZGlvTWFuYWdlci5TVFJFQU1fTVVTSUMpOwogICAgICAgICBtZWRpYVBsYXllci5wcmVwYXJlKCk7CiAgICAgICAgIG1lZGlhUGxheWVyLnNldExvb3BpbmcodHJ1ZSk7CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQW5kUHJvZmlsZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlYW5kcHJvZmlsZW93bmVyL0Jhc2VEZXZpY2VBZG1pblRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBbmRQcm9maWxlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2VhbmRwcm9maWxlb3duZXIvQmFzZURldmljZUFkbWluVGVzdC5qYXZhCmluZGV4IDFjNDIzMGIuLmE4OGE0NjMgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBbmRQcm9maWxlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2VhbmRwcm9maWxlb3duZXIvQmFzZURldmljZUFkbWluVGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBbmRQcm9maWxlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2VhbmRwcm9maWxlb3duZXIvQmFzZURldmljZUFkbWluVGVzdC5qYXZhCkBAIC0xOSw4ICsxOSwxMSBAQAogaW1wb3J0IGFuZHJvaWQuYXBwLmFkbWluLkRldmljZVBvbGljeU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZUluZm87CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7CiBpbXBvcnQgYW5kcm9pZC5vcy5Vc2VyTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdENhc2U7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKQEAgLTM3LDYgKzQwLDE2IEBACiBwdWJsaWMgY2xhc3MgQmFzZURldmljZUFkbWluVGVzdCBleHRlbmRzIEluc3RydW1lbnRhdGlvblRlc3RDYXNlIHsKIAogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQmFzaWNBZG1pblJlY2VpdmVyIGV4dGVuZHMgRGV2aWNlQWRtaW5SZWNlaXZlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgb25DaG9vc2VQcml2YXRlS2V5QWxpYXMoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50LCBpbnQgdWlkLCBVcmkgdXJpLAorICAgICAgICAgICAgICAgIFN0cmluZyBzdWdnZXN0ZWRBbGlhcykgeworICAgICAgICAgICAgc3VwZXIub25DaG9vc2VQcml2YXRlS2V5QWxpYXMoY29udGV4dCwgaW50ZW50LCB1aWQsIHVyaSwgc3VnZ2VzdGVkQWxpYXMpOworICAgICAgICAgICAgaWYgKHVpZCAhPSBQcm9jZXNzLm15VWlkKCkgfHwgdXJpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB1cmkuZ2V0UXVlcnlQYXJhbWV0ZXIoImFsaWFzIik7CisgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFX05BTUUgPSBCYXNpY0FkbWluUmVjZWl2ZXIuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKTsKQEAgLTEwMCw0ICsxMTMsOCBAQAogICAgICAgICB9CiAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RQYXNzd29yZFN1ZmZpY2llbnQsIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmlzQWN0aXZlUGFzc3dvcmRTdWZmaWNpZW50KCkpOwogICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIGlzRGV2aWNlT3duZXIoKSB7CisgICAgICAgIHJldHVybiBtRGV2aWNlUG9saWN5TWFuYWdlci5pc0RldmljZU93bmVyQXBwKFBBQ0tBR0VfTkFNRSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFuZFByb2ZpbGVPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZWFuZHByb2ZpbGVvd25lci9DbGVhckFwcGxpY2F0aW9uRGF0YVRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBbmRQcm9maWxlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2VhbmRwcm9maWxlb3duZXIvQ2xlYXJBcHBsaWNhdGlvbkRhdGFUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIxYWU5MgotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBbmRQcm9maWxlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2VhbmRwcm9maWxlb3duZXIvQ2xlYXJBcHBsaWNhdGlvbkRhdGFUZXN0LmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5jdHMuZGV2aWNlYW5kcHJvZmlsZW93bmVyOworCitpbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Rhc2s7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TZW1hcGhvcmU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKKy8qKgorICogVGVzdCBjbGFzcyB0aGF0IGNhbGxzIERQTS5jbGVhckFwcGxpY2F0aW9uVXNlckRhdGEgYW5kIHZlcmlmaWVzIHRoYXQgaXQgZG9lc24ndCB0aW1lIG91dC4KKyAqLworcHVibGljIGNsYXNzIENsZWFyQXBwbGljYXRpb25EYXRhVGVzdCBleHRlbmRzIEJhc2VEZXZpY2VBZG1pblRlc3QgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1BLRyA9ICJjb20uYW5kcm9pZC5jdHMuaW50ZW50LnJlY2VpdmVyIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVWSUNFX0FETUlOX1BLRyA9ICJjb20uYW5kcm9pZC5jdHMuZGV2aWNlYW5kcHJvZmlsZW93bmVyIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZW1hcGhvcmUgbVNlbWFwaG9yZSA9IG5ldyBTZW1hcGhvcmUoMCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBDTEVBUl9BUFBMSUNBVElPTl9EQVRBX1RJTUVPVVRfUyA9IDEwOworCisgICAgcHVibGljIHZvaWQgdGVzdENsZWFyQXBwbGljYXRpb25EYXRhX3Rlc3RQa2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgY2xlYXJBcHBsaWNhdGlvbkRhdGFUZXN0KFRFU1RfUEtHLCAvKiBzaG91bGRTdWNjZWVkICovIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDbGVhckFwcGxpY2F0aW9uRGF0YV9kZXZpY2VQcm92aXNpb25pbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGRldmljZVByb3Zpc2lvbmluZ1BhY2thZ2VOYW1lID0gZ2V0RGV2aWNlUHJvdmlzaW9uaW5nUGFja2FnZU5hbWUoKTsKKyAgICAgICAgaWYgKGRldmljZVByb3Zpc2lvbmluZ1BhY2thZ2VOYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBjbGVhckFwcGxpY2F0aW9uRGF0YVRlc3QoZGV2aWNlUHJvdmlzaW9uaW5nUGFja2FnZU5hbWUsIC8qIHNob3VsZFN1Y2NlZWQgKi8gZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDbGVhckFwcGxpY2F0aW9uRGF0YV9hY3RpdmVBZG1pbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBjbGVhckFwcGxpY2F0aW9uRGF0YVRlc3QoREVWSUNFX0FETUlOX1BLRywgLyogc2hvdWxkU3VjY2VlZCAqLyBmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNsZWFyQXBwbGljYXRpb25EYXRhVGVzdChTdHJpbmcgcGFja2FnZU5hbWUsIGJvb2xlYW4gc2hvdWxkU3VjY2VlZCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5jbGVhckFwcGxpY2F0aW9uVXNlckRhdGEoQURNSU5fUkVDRUlWRVJfQ09NUE9ORU5ULAorICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lLCBBc3luY1Rhc2suVEhSRUFEX1BPT0xfRVhFQ1VUT1IsCisgICAgICAgICAgICAgICAgKFN0cmluZyBwa2csIGJvb2xlYW4gc3VjY2VlZGVkKSAtPiB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhwYWNrYWdlTmFtZSwgcGtnKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNob3VsZFN1Y2NlZWQsIHN1Y2NlZWRlZCk7CisgICAgICAgICAgICAgICAgICAgIG1TZW1hcGhvcmUucmVsZWFzZSgpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICBhc3NlcnRUcnVlKCJDbGVhcmluZyBhcHBsaWNhdGlvbiBkYXRhIHRvb2sgdG9vIGxvbmciLAorICAgICAgICAgICAgICAgIG1TZW1hcGhvcmUudHJ5QWNxdWlyZShDTEVBUl9BUFBMSUNBVElPTl9EQVRBX1RJTUVPVVRfUywgVGltZVVuaXQuU0VDT05EUykpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldERldmljZVByb3Zpc2lvbmluZ1BhY2thZ2VOYW1lKCkgeworICAgICAgICBmaW5hbCBpbnQgcHJvdmlzaW9uaW5nX2FwcF9pZCA9IG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldElkZW50aWZpZXIoCisgICAgICAgICAgICAgICAgImNvbmZpZ19kZXZpY2VQcm92aXNpb25pbmdQYWNrYWdlIiwgInN0cmluZyIsICJhbmRyb2lkIik7CisgICAgICAgIGlmIChwcm92aXNpb25pbmdfYXBwX2lkID4gMCkgeworICAgICAgICAgICAgcmV0dXJuIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFN0cmluZyhwcm92aXNpb25pbmdfYXBwX2lkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFuZFByb2ZpbGVPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZWFuZHByb2ZpbGVvd25lci9DdXN0b21pemF0aW9uUmVzdHJpY3Rpb25zVGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFuZFByb2ZpbGVPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZWFuZHByb2ZpbGVvd25lci9DdXN0b21pemF0aW9uUmVzdHJpY3Rpb25zVGVzdC5qYXZhCmluZGV4IGRjODU2MDAuLjdiOTVkMzMgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBbmRQcm9maWxlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2VhbmRwcm9maWxlb3duZXIvQ3VzdG9taXphdGlvblJlc3RyaWN0aW9uc1Rlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQW5kUHJvZmlsZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlYW5kcHJvZmlsZW93bmVyL0N1c3RvbWl6YXRpb25SZXN0cmljdGlvbnNUZXN0LmphdmEKQEAgLTI2LDcgKzI2LDYgQEAKIGltcG9ydCBhbmRyb2lkLm9zLlVzZXJIYW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5Vc2VyTWFuYWdlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkJpdG1hcFV0aWxzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy5kZXZpY2VhbmRwcm9maWxlb3duZXIuUjsKIAogaW1wb3J0IGphdmEuaW8uQ2xvc2VhYmxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC0xMTksNiArMTE4LDggQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzYWxsb3dTZXRXYWxscGFwZXJfYWxsb3dlZCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBmaW5hbCBXYWxscGFwZXJNYW5hZ2VyIHdhbGxwYXBlck1hbmFnZXIgPSBXYWxscGFwZXJNYW5hZ2VyLmdldEluc3RhbmNlKG1Db250ZXh0KTsKICAgICAgICAgZmluYWwgQml0bWFwIG9yaWdpbmFsV2FsbHBhcGVyID0gQml0bWFwVXRpbHMuZ2V0V2FsbHBhcGVyQml0bWFwKG1Db250ZXh0KTsKKyAgICAgICAgZmluYWwgQml0bWFwIG9yaWdpbmFsV2FsbHBhcGVyQ29weSA9CisgICAgICAgICAgICAgICAgb3JpZ2luYWxXYWxscGFwZXIuY29weShvcmlnaW5hbFdhbGxwYXBlci5nZXRDb25maWcoKSwgZmFsc2UpOwogCiAgICAgICAgIHRyeSAoCiAgICAgICAgICAgICAvLyBTZXQgcmVzdHJpY3Rpb24gYW5kIHN1YnNjcmliZSBmb3IgdGhlIGJyb2FkY2FzdC4KQEAgLTEzMCw3ICsxMzEsNyBAQAogICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtVXNlck1hbmFnZXIuaGFzVXNlclJlc3RyaWN0aW9uKFVzZXJNYW5hZ2VyLkRJU0FMTE9XX1NFVF9XQUxMUEFQRVIpKTsKIAogICAgICAgICAgICAgLy8gQ2hlY2tpbmcgc2V0Qml0bWFwKCkgbWV0aG9kLgotICAgICAgICAgICAgQml0bWFwIG9sZFdhbGxwYXBlciA9IG9yaWdpbmFsV2FsbHBhcGVyOworICAgICAgICAgICAgQml0bWFwIG9sZFdhbGxwYXBlciA9IG9yaWdpbmFsV2FsbHBhcGVyQ29weTsKICAgICAgICAgICAgIHdhbGxwYXBlck1hbmFnZXIuc2V0Qml0bWFwKEJpdG1hcFV0aWxzLmdlbmVyYXRlUmFuZG9tQml0bWFwKDk3LCA3MykpOwogICAgICAgICAgICAgYmNhc3Qud2FpdEZvckJyb2FkY2FzdCgpOwogICAgICAgICAgICAgQml0bWFwIG5ld1dhbGxwYXBlciA9IEJpdG1hcFV0aWxzLmdldFdhbGxwYXBlckJpdG1hcChtQ29udGV4dCk7CkBAIC0xNTEsNyArMTUyLDcgQEAKICAgICAgICAgICAgIG5ld1dhbGxwYXBlciA9IEJpdG1hcFV0aWxzLmdldFdhbGxwYXBlckJpdG1hcChtQ29udGV4dCk7CiAgICAgICAgICAgICBhc3NlcnRGYWxzZShCaXRtYXBVdGlscy5jb21wYXJlQml0bWFwcyhuZXdXYWxscGFwZXIsIG9sZFdhbGxwYXBlcikpOwogICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgd2FsbHBhcGVyTWFuYWdlci5zZXRCaXRtYXAob3JpZ2luYWxXYWxscGFwZXIpOworICAgICAgICAgICAgd2FsbHBhcGVyTWFuYWdlci5zZXRCaXRtYXAob3JpZ2luYWxXYWxscGFwZXJDb3B5KTsKICAgICAgICAgfQogICAgICAgICBhc3NlcnRGYWxzZShtVXNlck1hbmFnZXIuaGFzVXNlclJlc3RyaWN0aW9uKFVzZXJNYW5hZ2VyLkRJU0FMTE9XX1NFVF9XQUxMUEFQRVIpKTsKICAgICB9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQW5kUHJvZmlsZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlYW5kcHJvZmlsZW93bmVyL0RlbGVnYXRlZENlcnRJbnN0YWxsZXJUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQW5kUHJvZmlsZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlYW5kcHJvZmlsZW93bmVyL0RlbGVnYXRlZENlcnRJbnN0YWxsZXJUZXN0LmphdmEKaW5kZXggM2E2ZTY1YS4uOTliMzEwZSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFuZFByb2ZpbGVPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZWFuZHByb2ZpbGVvd25lci9EZWxlZ2F0ZWRDZXJ0SW5zdGFsbGVyVGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBbmRQcm9maWxlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2VhbmRwcm9maWxlb3duZXIvRGVsZWdhdGVkQ2VydEluc3RhbGxlclRlc3QuamF2YQpAQCAtMjksOSArMjksMTEgQEAKIGltcG9ydCBhbmRyb2lkLnNlY3VyaXR5LktleUNoYWluRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQudGVzdC5Nb3JlQXNzZXJ0czsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLm9yZy5jb25zY3J5cHQuVHJ1c3RlZENlcnRpZmljYXRlU3RvcmU7Ci0KIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5HZW5lcmFsU2VjdXJpdHlFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlTdG9yZTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LktleVN0b3JlRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZTsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVFeGNlcHRpb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRmFjdG9yeTsKQEAgLTE3OSwxOCArMTgxLDIxIEBACiAgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgdGVzdENhQ2VydHNPcGVyYXRpb25zKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdENhQ2VydHNPcGVyYXRpb25zKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBHZW5lcmFsU2VjdXJpdHlFeGNlcHRpb24sCisgICAgICAgICAgIEtleVN0b3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIGJ5dGVbXSBjZXJ0ID0gVEVTVF9DQS5nZXRCeXRlcygpOwogICAgICAgICBmaW5hbCBDZXJ0aWZpY2F0ZSBjYUNlcnQgPSBDZXJ0aWZpY2F0ZUZhY3RvcnkuZ2V0SW5zdGFuY2UoIlguNTA5IikKICAgICAgICAgICAgICAgICAuZ2VuZXJhdGVDZXJ0aWZpY2F0ZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oY2VydCkpOwotICAgICAgICBmaW5hbCBUcnVzdGVkQ2VydGlmaWNhdGVTdG9yZSBzdG9yZSA9IG5ldyBUcnVzdGVkQ2VydGlmaWNhdGVTdG9yZSgpOworCiAKICAgICAgICAgbURwbS5zZXRDZXJ0SW5zdGFsbGVyUGFja2FnZShBRE1JTl9SRUNFSVZFUl9DT01QT05FTlQsIENFUlRfSU5TVEFMTEVSX1BBQ0tBR0UpOwogICAgICAgICBhc3NlcnRFcXVhbHMoQ0VSVF9JTlNUQUxMRVJfUEFDS0FHRSwKICAgICAgICAgICAgICAgICBtRHBtLmdldENlcnRJbnN0YWxsZXJQYWNrYWdlKEFETUlOX1JFQ0VJVkVSX0NPTVBPTkVOVCkpOwogCiAgICAgICAgIC8vIEV4ZXJjaXNlIGluc3RhbGxDYUNlcnQoKQotICAgICAgICBhc3NlcnROdWxsKHN0b3JlLmdldENlcnRpZmljYXRlQWxpYXMoY2FDZXJ0KSk7CisgICAgICAgIEtleVN0b3JlIGtleVN0b3JlID0gS2V5U3RvcmUuZ2V0SW5zdGFuY2UoIkFuZHJvaWRDQVN0b3JlIik7CisgICAgICAgIGtleVN0b3JlLmxvYWQobnVsbCwgbnVsbCk7CisgICAgICAgIGFzc2VydE51bGwoa2V5U3RvcmUuZ2V0Q2VydGlmaWNhdGVBbGlhcyhjYUNlcnQpKTsKICAgICAgICAgaW5zdGFsbENhQ2VydChjZXJ0KTsKICAgICAgICAgYXNzZXJ0UmVzdWx0KCJpbnN0YWxsQ2FDZXJ0IiwgdHJ1ZSk7CiAgICAgICAgIGFzc2VydFRydWUoIkNlcnRpZmljYXRlIGlzIG5vdCBpbnN0YWxsZWQgcHJvcGVybHkiLCBtRHBtLmhhc0NhQ2VydEluc3RhbGxlZCgKQEAgLTIwMSw3ICsyMDYsNyBAQAogICAgICAgICBhc3NlcnRSZXN1bHQoImdldEluc3RhbGxlZENhQ2VydHMoKSIsIHRydWUpOwogCiAgICAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBDQSBjZXJ0IHdhcyBtYXJrZWQgYXMgaW5zdGFsbGVkIGJ5IHRoZSBEZXZpY2UgT3duZXIgLyBQcm9maWxlIE93bmVyLgotICAgICAgICBmaW5hbCBTdHJpbmcgYWxpYXMgPSBzdG9yZS5nZXRDZXJ0aWZpY2F0ZUFsaWFzKGNhQ2VydCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBhbGlhcyA9IGtleVN0b3JlLmdldENlcnRpZmljYXRlQWxpYXMoY2FDZXJ0KTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbGlhcyk7CiAgICAgICAgIHZlcmlmeU93bmVySW5zdGFsbGVkU3RhdHVzKGFsaWFzLCB0cnVlKTsKIApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFuZFByb2ZpbGVPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZWFuZHByb2ZpbGVvd25lci9EcGNBbGxvd2VkQWNjb3VudE1hbmFnZW1lbnRUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQW5kUHJvZmlsZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlYW5kcHJvZmlsZW93bmVyL0RwY0FsbG93ZWRBY2NvdW50TWFuYWdlbWVudFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkxMTU5Zi4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQW5kUHJvZmlsZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlYW5kcHJvZmlsZW93bmVyL0RwY0FsbG93ZWRBY2NvdW50TWFuYWdlbWVudFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5jdHMuZGV2aWNlYW5kcHJvZmlsZW93bmVyOwotCi1pbXBvcnQgYW5kcm9pZC5hY2NvdW50cy5BY2NvdW50OwotaW1wb3J0IGFuZHJvaWQuYWNjb3VudHMuQWNjb3VudE1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5hY2NvdW50cy5BY2NvdW50TWFuYWdlckZ1dHVyZTsKLWltcG9ydCBhbmRyb2lkLmFjY291bnRzLkF1dGhlbnRpY2F0b3JFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5hY2NvdW50cy5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLmFwcC5hZG1pbi5EZXZpY2VQb2xpY3lNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuVXNlck1hbmFnZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqIFRoZXNlIHRlc3RzIHZlcmlmeSB0aGF0IHRoZSBkZXZpY2UgLyBwcm9maWxlIG93bmVyIGNhbiB1c2UgYWNjb3VudCBtYW5hZ2VtZW50IEFQSXMgdG8gYWRkCi0gKiBhY2NvdW50cyBldmVuIHdoZW4gcG9saWNpZXMgYXJlIHNldC4gVGhlIHBvbGljaWVzIHRlc3RlZCBhcmUKLSAqIHtAbGluayBEZXZpY2VQb2xpY3lNYW5hZ2VyI3NldEFjY291bnRNYW5hZ2VtZW50RGlzYWJsZWR9IGFuZAotICoge0BsaW5rIFVzZXJNYW5hZ2VyI0RJU0FMTE9XX01PRElGWV9BQ0NPVU5UU30uCi0gKgotICogVGhpcyB0ZXN0IGRlcGVuZHMgb24ge0BsaW5rIGNvbS5hbmRyb2lkLmN0cy5kZXZpY2Vwb2xpY3kuYWNjb3VudG1hbmFnZW1lbnQuTW9ja0FjY291bnRTZXJ2aWNlfSwKLSAqIHdoaWNoIHByb3ZpZGVzIGF1dGhlbnRpY2F0b3IgZm9yIGEgbW9jayBhY2NvdW50IHR5cGUuCi0gKgotICogTm90ZSB0aGF0IHdlIGNhbm5vdCB0ZXN0IGFjY291bnQgcmVtb3ZhbCwgYmVjYXVzZSBvbmx5IHRoZSBhdXRoZW50aWNhdG9yIGNhbiByZW1vdmUgYW4gYWNjb3VudAotICogYW5kIHRoZSBEcGMgaXMgbm90IHRoZSBhdXRoZW50aWNhdG9yIGZvciB0aGUgbW9jayBhY2NvdW50IHR5cGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBEcGNBbGxvd2VkQWNjb3VudE1hbmFnZW1lbnRUZXN0IGV4dGVuZHMgQmFzZURldmljZUFkbWluVGVzdCB7Ci0KLSAgICAvLyBBY2NvdW50IHR5cGUgZm9yIE1vY2tBY2NvdW50QXV0aGVudGljYXRvcgotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBQ0NPVU5UX1RZUEVfMQotICAgICAgICAgICAgPSAiY29tLmFuZHJvaWQuY3RzLmRldmljZXBvbGljeS5hY2NvdW50bWFuYWdlbWVudC5hY2NvdW50LnR5cGUiOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBQ0NPVU5UX1RZUEVfMiA9ICJjb20uZHVtbXkuYWNjb3VudCI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgQWNjb3VudCBBQ0NPVU5UXzAgPSBuZXcgQWNjb3VudCgidXNlcjAiLCBBQ0NPVU5UX1RZUEVfMSk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgQWNjb3VudCBBQ0NPVU5UXzEgPSBuZXcgQWNjb3VudCgidXNlcjEiLCBBQ0NPVU5UX1RZUEVfMSk7Ci0KLSAgICBwcml2YXRlIEFjY291bnRNYW5hZ2VyIG1BY2NvdW50TWFuYWdlcjsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIG1BY2NvdW50TWFuYWdlciA9IChBY2NvdW50TWFuYWdlcikgbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkFDQ09VTlRfU0VSVklDRSk7Ci0gICAgICAgIGNsZWFyQWxsQWNjb3VudE1hbmFnZW1lbnREaXNhYmxlZCgpOwotICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5jbGVhclVzZXJSZXN0cmljdGlvbihBRE1JTl9SRUNFSVZFUl9DT01QT05FTlQsCi0gICAgICAgICAgICAgICAgVXNlck1hbmFnZXIuRElTQUxMT1dfTU9ESUZZX0FDQ09VTlRTKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBjbGVhckFsbEFjY291bnRNYW5hZ2VtZW50RGlzYWJsZWQoKTsKLSAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuY2xlYXJVc2VyUmVzdHJpY3Rpb24oQURNSU5fUkVDRUlWRVJfQ09NUE9ORU5ULAotICAgICAgICAgICAgICAgIFVzZXJNYW5hZ2VyLkRJU0FMTE9XX01PRElGWV9BQ0NPVU5UUyk7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFjY291bnRNYW5hZ2VtZW50RGlzYWJsZWRfc2V0dGVyQW5kR2V0dGVyKCkgewotICAgICAgICAvLyBTb21lIGxvY2FsIHRlc3RzOiBhZGRpbmcgYW5kIHJlbW92aW5nIGRpc2FibGVkIGFjY291bnRzIGFuZCBtYWtlIHN1cmUKLSAgICAgICAgLy8gRGV2aWNlUG9saWN5TWFuYWdlciBrZWVwcyB0cmFjayBvZiB0aGUgZGlzYWJsZWQgc2V0IGNvcnJlY3RseQotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbURldmljZVBvbGljeU1hbmFnZXIuZ2V0QWNjb3VudFR5cGVzV2l0aE1hbmFnZW1lbnREaXNhYmxlZCgpLmxlbmd0aCk7Ci0KLSAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuc2V0QWNjb3VudE1hbmFnZW1lbnREaXNhYmxlZChBRE1JTl9SRUNFSVZFUl9DT01QT05FTlQsIEFDQ09VTlRfVFlQRV8xLAotICAgICAgICAgICAgICAgIHRydWUpOwotICAgICAgICAvLyBUZXN0IGlmIGRpc2FibGluZyBBQ0NPVU5UX1RZUEVfMiBhZmZlY3RzIEFDQ09VTlRfVFlQRV8xCi0gICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnNldEFjY291bnRNYW5hZ2VtZW50RGlzYWJsZWQoQURNSU5fUkVDRUlWRVJfQ09NUE9ORU5ULCBBQ0NPVU5UX1RZUEVfMiwKLSAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBtRGV2aWNlUG9saWN5TWFuYWdlci5nZXRBY2NvdW50VHlwZXNXaXRoTWFuYWdlbWVudERpc2FibGVkKCkubGVuZ3RoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEFDQ09VTlRfVFlQRV8xLAotICAgICAgICAgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmdldEFjY291bnRUeXBlc1dpdGhNYW5hZ2VtZW50RGlzYWJsZWQoKVswXSk7Ci0KLSAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuc2V0QWNjb3VudE1hbmFnZW1lbnREaXNhYmxlZChBRE1JTl9SRUNFSVZFUl9DT01QT05FTlQsIEFDQ09VTlRfVFlQRV8xLAotICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmdldEFjY291bnRUeXBlc1dpdGhNYW5hZ2VtZW50RGlzYWJsZWQoKS5sZW5ndGgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBY2NvdW50TWFuYWdlbWVudERpc2FibGVkX3Byb2ZpbGVBbmREZXZpY2VPd25lckNhbkFkZEFjY291bnQoKQotICAgICAgICAgICAgdGhyb3dzIEF1dGhlbnRpY2F0b3JFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnNldEFjY291bnRNYW5hZ2VtZW50RGlzYWJsZWQoQURNSU5fUkVDRUlWRVJfQ09NUE9ORU5ULCBBQ0NPVU5UX1RZUEVfMSwKLSAgICAgICAgICAgICAgICB0cnVlKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbUFjY291bnRNYW5hZ2VyLmdldEFjY291bnRzQnlUeXBlKEFDQ09VTlRfVFlQRV8xKS5sZW5ndGgpOwotICAgICAgICAvLyBNYW5hZ2VtZW50IGlzIGRpc2FibGVkLCBidXQgdGhlIGRldmljZSAvIHByb2ZpbGUgb3duZXIgaXMgc3RpbGwgYWxsb3dlZCB0byB1c2UgdGhlIEFQSXMKLSAgICAgICAgQnVuZGxlIHJlc3VsdCA9IG1BY2NvdW50TWFuYWdlci5hZGRBY2NvdW50KEFDQ09VTlRfVFlQRV8xLAotICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpLmdldFJlc3VsdCgpOwotCi0gICAgICAgIC8vIE5vcm1hbGx5IHRoZSBleHBlY3RlZCByZXN1bHQgb2YgYWRkQWNjb3VudCgpIGlzIEFjY291bnRNYW5hZ2VyIHJldHVybmluZwotICAgICAgICAvLyBhbiBpbnRlbnQgdG8gc3RhcnQgdGhlIGF1dGhlbnRpY2F0b3IgYWN0aXZpdHkgZm9yIGFkZGluZyBuZXcgYWNjb3VudHMuCi0gICAgICAgIC8vIEJ1dCBNb2NrQWNjb3VudEF1dGhlbnRpY2F0b3IgcmV0dXJucyBhIG5ldyBhY2NvdW50IHN0cmFpZ2h0d2F5LgotICAgICAgICBhc3NlcnRFcXVhbHMoQUNDT1VOVF9UWVBFXzEsIHJlc3VsdC5nZXRTdHJpbmcoQWNjb3VudE1hbmFnZXIuS0VZX0FDQ09VTlRfVFlQRSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RVc2VyUmVzdHJpY3Rpb25fcHJvZmlsZUFuZERldmljZU93bmVyQ2FuQWRkQWNjb3VudCgpCi0gICAgICAgICAgICB0aHJvd3MgQXV0aGVudGljYXRvckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKLSAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuYWRkVXNlclJlc3RyaWN0aW9uKEFETUlOX1JFQ0VJVkVSX0NPTVBPTkVOVCwKLSAgICAgICAgICAgICAgICBVc2VyTWFuYWdlci5ESVNBTExPV19NT0RJRllfQUNDT1VOVFMpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygwLCBtQWNjb3VudE1hbmFnZXIuZ2V0QWNjb3VudHNCeVR5cGUoQUNDT1VOVF9UWVBFXzEpLmxlbmd0aCk7Ci0gICAgICAgIC8vIE1hbmFnZW1lbnQgaXMgZGlzYWJsZWQsIGJ1dCB0aGUgZGV2aWNlIC8gcHJvZmlsZSBvd25lciBpcyBzdGlsbCBhbGxvd2VkIHRvIHVzZSB0aGUgQVBJcwotICAgICAgICBCdW5kbGUgcmVzdWx0ID0gbUFjY291bnRNYW5hZ2VyLmFkZEFjY291bnQoQUNDT1VOVF9UWVBFXzEsCi0gICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCkuZ2V0UmVzdWx0KCk7Ci0KLSAgICAgICAgLy8gTm9ybWFsbHkgdGhlIGV4cGVjdGVkIHJlc3VsdCBvZiBhZGRBY2NvdW50KCkgaXMgQWNjb3VudE1hbmFnZXIgcmV0dXJuaW5nCi0gICAgICAgIC8vIGFuIGludGVudCB0byBzdGFydCB0aGUgYXV0aGVudGljYXRvciBhY3Rpdml0eSBmb3IgYWRkaW5nIG5ldyBhY2NvdW50cy4KLSAgICAgICAgLy8gQnV0IE1vY2tBY2NvdW50QXV0aGVudGljYXRvciByZXR1cm5zIGEgbmV3IGFjY291bnQgc3RyYWlnaHR3YXkuCi0gICAgICAgIGFzc2VydEVxdWFscyhBQ0NPVU5UX1RZUEVfMSwgcmVzdWx0LmdldFN0cmluZyhBY2NvdW50TWFuYWdlci5LRVlfQUNDT1VOVF9UWVBFKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNsZWFyQWxsQWNjb3VudE1hbmFnZW1lbnREaXNhYmxlZCgpIHsKLSAgICAgICAgZm9yIChTdHJpbmcgYWNjb3VudFR5cGUgOiBtRGV2aWNlUG9saWN5TWFuYWdlci5nZXRBY2NvdW50VHlwZXNXaXRoTWFuYWdlbWVudERpc2FibGVkKCkpIHsKLSAgICAgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnNldEFjY291bnRNYW5hZ2VtZW50RGlzYWJsZWQoQURNSU5fUkVDRUlWRVJfQ09NUE9ORU5ULCBhY2NvdW50VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBtRGV2aWNlUG9saWN5TWFuYWdlci5nZXRBY2NvdW50VHlwZXNXaXRoTWFuYWdlbWVudERpc2FibGVkKCkubGVuZ3RoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQW5kUHJvZmlsZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlYW5kcHJvZmlsZW93bmVyL0tleU1hbmFnZW1lbnRBY3Rpdml0eS5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFuZFByb2ZpbGVPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZWFuZHByb2ZpbGVvd25lci9LZXlNYW5hZ2VtZW50QWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2M1M2M1Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFuZFByb2ZpbGVPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZWFuZHByb2ZpbGVvd25lci9LZXlNYW5hZ2VtZW50QWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDIyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5jdHMuZGV2aWNlYW5kcHJvZmlsZW93bmVyOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CisKK3B1YmxpYyBjbGFzcyBLZXlNYW5hZ2VtZW50QWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7Cit9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQW5kUHJvZmlsZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlYW5kcHJvZmlsZW93bmVyL0tleU1hbmFnZW1lbnRUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQW5kUHJvZmlsZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlYW5kcHJvZmlsZW93bmVyL0tleU1hbmFnZW1lbnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzlkYmYwYQotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBbmRQcm9maWxlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2VhbmRwcm9maWxlb3duZXIvS2V5TWFuYWdlbWVudFRlc3QuamF2YQpAQCAtMCwwICsxLDc4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5kZXZpY2VhbmRwcm9maWxlb3duZXI7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuYWRtaW4uRGV2aWNlUG9saWN5TWFuYWdlci5JRF9UWVBFX0JBU0VfSU5GTzsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuYWRtaW4uRGV2aWNlUG9saWN5TWFuYWdlci5JRF9UWVBFX0lNRUk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLmFkbWluLkRldmljZVBvbGljeU1hbmFnZXIuSURfVFlQRV9NRUlEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5hZG1pbi5EZXZpY2VQb2xpY3lNYW5hZ2VyLklEX1RZUEVfU0VSSUFMOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmtleXN0b3JlLmN0cy5DZXJ0aWZpY2F0ZVV0aWxzLmNyZWF0ZUNlcnRpZmljYXRlOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQua2V5c3RvcmUuY3RzLkF0dGVzdGF0aW9uOworaW1wb3J0IGFuZHJvaWQua2V5c3RvcmUuY3RzLkF1dGhvcml6YXRpb25MaXN0OworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOworaW1wb3J0IGFuZHJvaWQuc2VjdXJpdHkuQXR0ZXN0ZWRLZXlQYWlyOworaW1wb3J0IGFuZHJvaWQuc2VjdXJpdHkuS2V5Q2hhaW47CitpbXBvcnQgYW5kcm9pZC5zZWN1cml0eS5LZXlDaGFpbkFsaWFzQ2FsbGJhY2s7CitpbXBvcnQgYW5kcm9pZC5zZWN1cml0eS5LZXlDaGFpbkV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnNlY3VyaXR5LmtleXN0b3JlLktleUdlblBhcmFtZXRlclNwZWM7CitpbXBvcnQgYW5kcm9pZC5zZWN1cml0eS5rZXlzdG9yZS5LZXlQcm9wZXJ0aWVzOworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLlVpRGV2aWNlOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlRlbGVwaG9ueU1hbmFnZXI7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkZha2VLZXlzLkZBS0VfUlNBXzE7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LktleUZhY3Rvcnk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlQYWlyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmF0ZUtleTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlB1YmxpY0tleTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlNpZ25hdHVyZTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGU7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUZhY3Rvcnk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlOworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5JbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuUEtDUzhFbmNvZGVkS2V5U3BlYzsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK2ltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLng1MDAuWDUwMFByaW5jaXBhbDsKKworcHVibGljIGNsYXNzIEtleU1hbmFnZW1lbnRUZXN0IGV4dGVuZHMgQmFzZURldmljZUFkbWluVGVzdCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBLRVlDSEFJTl9USU1FT1VUX01JTlMgPSA2OworCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3VwcG9ydGVkS2V5QWxnb3JpdGhtIHsKKyAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBrZXlBbGdvcml0aG07CisgICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgc2lnbmF0dXJlQWxnb3JpdGhtOworICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nW10gc2lnbmF0dXJlUGFkZGluZ1NjaGVtZXM7CisKKyAgICAgICAgcHVibGljIFN1cHBvcnRlZEtleUFsZ29yaXRobSgKKyAgICAgICAgICAgICAgICBTdHJpbmcga2V5QWxnb3JpdGhtLCBTdHJpbmcgc2lnbmF0dXJlQWxnb3JpdGhtLAorICAgICAgICAgICAgICAgIFN0cmluZ1tdIHNpZ25hdHVyZVBhZGRpbmdTY2hlbWVzKSB7CisgICAgICAgICAgICB0aGlzLmtleUFsZ29yaXRobSA9IGtleUFsZ29yaXRobTsKKyAgICAgICAgICAgIHRoaXMuc2lnbmF0dXJlQWxnb3JpdGhtID0gc2lnbmF0dXJlQWxnb3JpdGhtOworICAgICAgICAgICAgdGhpcy5zaWduYXR1cmVQYWRkaW5nU2NoZW1lcyA9IHNpZ25hdHVyZVBhZGRpbmdTY2hlbWVzOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBTdXBwb3J0ZWRLZXlBbGdvcml0aG1bXSBTVVBQT1JURURfS0VZX0FMR09SSVRITVMgPSBuZXcgU3VwcG9ydGVkS2V5QWxnb3JpdGhtW10geworICAgICAgICBuZXcgU3VwcG9ydGVkS2V5QWxnb3JpdGhtKEtleVByb3BlcnRpZXMuS0VZX0FMR09SSVRITV9SU0EsICJTSEEyNTZ3aXRoUlNBIiwKKyAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10ge0tleVByb3BlcnRpZXMuU0lHTkFUVVJFX1BBRERJTkdfUlNBX1BTUywKKyAgICAgICAgICAgICAgICAgICAgS2V5UHJvcGVydGllcy5TSUdOQVRVUkVfUEFERElOR19SU0FfUEtDUzF9KSwKKyAgICAgICAgbmV3IFN1cHBvcnRlZEtleUFsZ29yaXRobShLZXlQcm9wZXJ0aWVzLktFWV9BTEdPUklUSE1fRUMsICJTSEEyNTZ3aXRoRUNEU0EiLCBudWxsKQorICAgIH07CisKKyAgICBwcml2YXRlIEtleU1hbmFnZW1lbnRBY3Rpdml0eSBtQWN0aXZpdHk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICBmaW5hbCBVaURldmljZSBkZXZpY2UgPSBVaURldmljZS5nZXRJbnN0YW5jZShnZXRJbnN0cnVtZW50YXRpb24oKSk7CisgICAgICAgIG1BY3Rpdml0eSA9IGxhdW5jaEFjdGl2aXR5KGdldEluc3RydW1lbnRhdGlvbigpLmdldFRhcmdldENvbnRleHQoKS5nZXRQYWNrYWdlTmFtZSgpLAorICAgICAgICAgICAgICAgIEtleU1hbmFnZW1lbnRBY3Rpdml0eS5jbGFzcywgbnVsbCk7CisgICAgICAgIGRldmljZS53YWl0Rm9ySWRsZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1BY3Rpdml0eS5maW5pc2goKTsKKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FuSW5zdGFsbEFuZFJlbW92ZVZhbGlkUnNhS2V5cGFpcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgYWxpYXMgPSAiY29tLmFuZHJvaWQudGVzdC52YWxpZC1yc2Eta2V5LTEiOworICAgICAgICBmaW5hbCBQcml2YXRlS2V5IHByaXZLZXkgPSBnZXRQcml2YXRlS2V5KEZBS0VfUlNBXzEucHJpdmF0ZUtleSAsICJSU0EiKTsKKyAgICAgICAgZmluYWwgQ2VydGlmaWNhdGUgY2VydCA9IGdldENlcnRpZmljYXRlKEZBS0VfUlNBXzEuY2FDZXJ0aWZpY2F0ZSk7CisKKyAgICAgICAgLy8gSW5zdGFsbCBrZXlwYWlyLgorICAgICAgICBhc3NlcnRUcnVlKG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmluc3RhbGxLZXlQYWlyKGdldFdobygpLCBwcml2S2V5LCBjZXJ0LCBhbGlhcykpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gUmVxdWVzdCBhbmQgcmV0cmlldmUgdXNpbmcgdGhlIGFsaWFzLgorICAgICAgICAgICAgYXNzZXJ0R3JhbnRlZChhbGlhcywgZmFsc2UpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGFsaWFzLCBuZXcgS2V5Q2hhaW5BbGlhc0Z1dHVyZShhbGlhcykuZ2V0KCkpOworICAgICAgICAgICAgYXNzZXJ0R3JhbnRlZChhbGlhcywgdHJ1ZSk7CisKKyAgICAgICAgICAgIC8vIFZlcmlmeSBrZXkgaXMgYXQgbGVhc3Qgc29tZXRoaW5nIGxpa2UgdGhlIG9uZSB3ZSBwdXQgaW4uCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoS2V5Q2hhaW4uZ2V0UHJpdmF0ZUtleShtQWN0aXZpdHksIGFsaWFzKS5nZXRBbGdvcml0aG0oKSwgIlJTQSIpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgLy8gRGVsZXRlIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgdGVzdCBzdWNjZWVkZWQuCisgICAgICAgICAgICBhc3NlcnRUcnVlKG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnJlbW92ZUtleVBhaXIoZ2V0V2hvKCksIGFsaWFzKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gVmVyaWZ5IGFsaWFzIGlzIGFjdHVhbGx5IGRlbGV0ZWQuCisgICAgICAgIGFzc2VydEdyYW50ZWQoYWxpYXMsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FuSW5zdGFsbFdpdGhBdXRvbWF0aWNBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGdyYW50ID0gImNvbS5hbmRyb2lkLnRlc3QuYXV0b2dyYW50LWtleS0xIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIHdpdGhob2xkID0gImNvbS5hbmRyb2lkLnRlc3Qubm9uZ3JhbnQta2V5LTEiOworICAgICAgICBmaW5hbCBQcml2YXRlS2V5IHByaXZLZXkgPSBnZXRQcml2YXRlS2V5KEZBS0VfUlNBXzEucHJpdmF0ZUtleSAsICJSU0EiKTsKKyAgICAgICAgZmluYWwgQ2VydGlmaWNhdGUgY2VydCA9IGdldENlcnRpZmljYXRlKEZBS0VfUlNBXzEuY2FDZXJ0aWZpY2F0ZSk7CisKKyAgICAgICAgLy8gSW5zdGFsbCBrZXlwYWlycy4KKyAgICAgICAgYXNzZXJ0VHJ1ZShtRGV2aWNlUG9saWN5TWFuYWdlci5pbnN0YWxsS2V5UGFpcihnZXRXaG8oKSwgcHJpdktleSwgbmV3IENlcnRpZmljYXRlW10ge2NlcnR9LAorICAgICAgICAgICAgICAgIGdyYW50LCB0cnVlKSk7CisgICAgICAgIGFzc2VydFRydWUobURldmljZVBvbGljeU1hbmFnZXIuaW5zdGFsbEtleVBhaXIoZ2V0V2hvKCksIHByaXZLZXksIG5ldyBDZXJ0aWZpY2F0ZVtdIHtjZXJ0fSwKKyAgICAgICAgICAgICAgICB3aXRoaG9sZCwgZmFsc2UpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIFZlcmlmeSBvbmx5IHRoZSByZXF1ZXN0ZWQga2V5IHdhcyBhY3R1YWxseSBncmFudGVkLgorICAgICAgICAgICAgYXNzZXJ0R3JhbnRlZChncmFudCwgdHJ1ZSk7CisgICAgICAgICAgICBhc3NlcnRHcmFudGVkKHdpdGhob2xkLCBmYWxzZSk7CisKKyAgICAgICAgICAgIC8vIFZlcmlmeSB0aGUgZ3JhbnRlZCBrZXkgaXMgYWN0dWFsbHkgb2J0YWluYWJsZSBpbiBQcml2YXRlS2V5IGZvcm0uCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoS2V5Q2hhaW4uZ2V0UHJpdmF0ZUtleShtQWN0aXZpdHksIGdyYW50KS5nZXRBbGdvcml0aG0oKSwgIlJTQSIpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgLy8gRGVsZXRlIGJvdGgga2V5cGFpcnMuCisgICAgICAgICAgICBhc3NlcnRUcnVlKG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnJlbW92ZUtleVBhaXIoZ2V0V2hvKCksIGdyYW50KSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnJlbW92ZUtleVBhaXIoZ2V0V2hvKCksIHdpdGhob2xkKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gVmVyaWZ5IHRoZXkncmUgYWN0dWFsbHkgZ29uZS4KKyAgICAgICAgYXNzZXJ0R3JhbnRlZChncmFudCwgZmFsc2UpOworICAgICAgICBhc3NlcnRHcmFudGVkKHdpdGhob2xkLCBmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBMaXN0PENlcnRpZmljYXRlPiBsb2FkQ2VydGlmaWNhdGVDaGFpbihTdHJpbmcgYXNzZXROYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxDZXJ0aWZpY2F0ZT4gY2VydHMgPSBsb2FkQ2VydGlmaWNhdGVzRnJvbUFzc2V0KGFzc2V0TmFtZSk7CisgICAgICAgIGZpbmFsIEFycmF5TGlzdDxDZXJ0aWZpY2F0ZT4gY2VydENoYWluID0gbmV3IEFycmF5TGlzdChjZXJ0cyk7CisgICAgICAgIC8vIFNvbWUgc2FuaXR5IGNoZWNrIG9uIHRoZSBjZXJ0IGNoYWluCisgICAgICAgIGFzc2VydFRydWUoY2VydHMuc2l6ZSgpID4gMSk7CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgY2VydENoYWluLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBjZXJ0Q2hhaW4uZ2V0KGkgLSAxKS52ZXJpZnkoY2VydENoYWluLmdldChpKS5nZXRQdWJsaWNLZXkoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNlcnRDaGFpbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FuSW5zdGFsbENlcnRDaGFpbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBVc2UgYXNzZXRzL2dlbmVyYXRlLWNsaWVudC1jZXJ0LWNoYWluLnNoIHRvIHJlZ2VuZXJhdGUgdGhlIGNsaWVudCBjZXJ0IGNoYWluLgorICAgICAgICBmaW5hbCBQcml2YXRlS2V5IHByaXZLZXkgPSBsb2FkUHJpdmF0ZUtleUZyb21Bc3NldCgidXNlci1jZXJ0LWNoYWluLmtleSIpOworICAgICAgICBmaW5hbCBDZXJ0aWZpY2F0ZVtdIGNlcnRDaGFpbiA9IGxvYWRDZXJ0aWZpY2F0ZUNoYWluKCJ1c2VyLWNlcnQtY2hhaW4uY3J0IikKKyAgICAgICAgICAgICAgICAudG9BcnJheShuZXcgQ2VydGlmaWNhdGVbMF0pOworICAgICAgICBmaW5hbCBTdHJpbmcgYWxpYXMgPSAiY29tLmFuZHJvaWQudGVzdC5jbGllbnRrZXljaGFpbiI7CisKKyAgICAgICAgLy8gSW5zdGFsbCBrZXlwYWlycy4KKyAgICAgICAgYXNzZXJ0VHJ1ZShtRGV2aWNlUG9saWN5TWFuYWdlci5pbnN0YWxsS2V5UGFpcihnZXRXaG8oKSwgcHJpdktleSwgY2VydENoYWluLCBhbGlhcywgdHJ1ZSkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gVmVyaWZ5IG9ubHkgdGhlIHJlcXVlc3RlZCBrZXkgd2FzIGFjdHVhbGx5IGdyYW50ZWQuCisgICAgICAgICAgICBhc3NlcnRHcmFudGVkKGFsaWFzLCB0cnVlKTsKKworICAgICAgICAgICAgLy8gVmVyaWZ5IHRoZSBncmFudGVkIGtleSBpcyBhY3R1YWxseSBvYnRhaW5hYmxlIGluIFByaXZhdGVLZXkgZm9ybS4KKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhLZXlDaGFpbi5nZXRQcml2YXRlS2V5KG1BY3Rpdml0eSwgYWxpYXMpLmdldEFsZ29yaXRobSgpLCAiUlNBIik7CisKKyAgICAgICAgICAgIC8vIFZlcmlmeSB0aGUgY2VydGlmaWNhdGUgY2hhaW4gaXMgY29ycmVjdAorICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlW10gcmV0dXJuZWRDZXJ0cyA9IEtleUNoYWluLmdldENlcnRpZmljYXRlQ2hhaW4obUFjdGl2aXR5LCBhbGlhcyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoY2VydENoYWluLCByZXR1cm5lZENlcnRzKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAvLyBEZWxldGUgYm90aCBrZXlwYWlycy4KKyAgICAgICAgICAgIGFzc2VydFRydWUobURldmljZVBvbGljeU1hbmFnZXIucmVtb3ZlS2V5UGFpcihnZXRXaG8oKSwgYWxpYXMpKTsKKyAgICAgICAgfQorICAgICAgICAvLyBWZXJpZnkgdGhleSdyZSBhY3R1YWxseSBnb25lLgorICAgICAgICBhc3NlcnRHcmFudGVkKGFsaWFzLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdyYW50c0RvTm90UGVyc2lzdEJldHdlZW5JbnN0YWxsYXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBhbGlhcyA9ICJjb20uYW5kcm9pZC50ZXN0LnBlcnNpc3RlbnQta2V5LTEiOworICAgICAgICBmaW5hbCBQcml2YXRlS2V5IHByaXZLZXkgPSBnZXRQcml2YXRlS2V5KEZBS0VfUlNBXzEucHJpdmF0ZUtleSAsICJSU0EiKTsKKyAgICAgICAgZmluYWwgQ2VydGlmaWNhdGUgY2VydCA9IGdldENlcnRpZmljYXRlKEZBS0VfUlNBXzEuY2FDZXJ0aWZpY2F0ZSk7CisKKyAgICAgICAgLy8gSW5zdGFsbCBrZXlwYWlyLgorICAgICAgICBhc3NlcnRUcnVlKG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmluc3RhbGxLZXlQYWlyKGdldFdobygpLCBwcml2S2V5LCBuZXcgQ2VydGlmaWNhdGVbXSB7Y2VydH0sCisgICAgICAgICAgICAgICAgYWxpYXMsIHRydWUpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydEdyYW50ZWQoYWxpYXMsIHRydWUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgLy8gRGVsZXRlIGFuZCB2ZXJpZnkuCisgICAgICAgICAgICBhc3NlcnRUcnVlKG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnJlbW92ZUtleVBhaXIoZ2V0V2hvKCksIGFsaWFzKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0R3JhbnRlZChhbGlhcywgZmFsc2UpOworCisgICAgICAgIC8vIEluc3RhbGwgYWdhaW4uCisgICAgICAgIGFzc2VydFRydWUobURldmljZVBvbGljeU1hbmFnZXIuaW5zdGFsbEtleVBhaXIoZ2V0V2hvKCksIHByaXZLZXksIG5ldyBDZXJ0aWZpY2F0ZVtdIHtjZXJ0fSwKKyAgICAgICAgICAgICAgICBhbGlhcywgZmFsc2UpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydEdyYW50ZWQoYWxpYXMsIGZhbHNlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIC8vIERlbGV0ZS4KKyAgICAgICAgICAgIGFzc2VydFRydWUobURldmljZVBvbGljeU1hbmFnZXIucmVtb3ZlS2V5UGFpcihnZXRXaG8oKSwgYWxpYXMpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsS2V5UGFyYW1zRmFpbFByZWRpY3RhYmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBhbGlhcyA9ICJjb20uYW5kcm9pZC50ZXN0Lm51bGwta2V5LTEiOworICAgICAgICBmaW5hbCBQcml2YXRlS2V5IHByaXZLZXkgPSBnZXRQcml2YXRlS2V5KEZBS0VfUlNBXzEucHJpdmF0ZUtleSwgIlJTQSIpOworICAgICAgICBmaW5hbCBDZXJ0aWZpY2F0ZSBjZXJ0ID0gZ2V0Q2VydGlmaWNhdGUoRkFLRV9SU0FfMS5jYUNlcnRpZmljYXRlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmluc3RhbGxLZXlQYWlyKGdldFdobygpLCBudWxsLCBjZXJ0LCBhbGlhcyk7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24gZm9yIG51bGwgUHJpdmF0ZUtleSIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5pbnN0YWxsS2V5UGFpcihnZXRXaG8oKSwgcHJpdktleSwgbnVsbCwgYWxpYXMpOworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHNob3VsZCBoYXZlIGJlZW4gdGhyb3duIGZvciBudWxsIENlcnRpZmljYXRlIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TnVsbEFkbWluQ29tcG9uZW50SXNEZW5pZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGFsaWFzID0gImNvbS5hbmRyb2lkLnRlc3QubnVsbC1hZG1pbi0xIjsKKyAgICAgICAgZmluYWwgUHJpdmF0ZUtleSBwcml2S2V5ID0gZ2V0UHJpdmF0ZUtleShGQUtFX1JTQV8xLnByaXZhdGVLZXksICJSU0EiKTsKKyAgICAgICAgZmluYWwgQ2VydGlmaWNhdGUgY2VydCA9IGdldENlcnRpZmljYXRlKEZBS0VfUlNBXzEuY2FDZXJ0aWZpY2F0ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5pbnN0YWxsS2V5UGFpcihudWxsLCBwcml2S2V5LCBjZXJ0LCBhbGlhcyk7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24gZm9yIG51bGwgQ29tcG9uZW50TmFtZSIpOworICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5vdFVzZXJTZWxlY3RhYmxlQWxpYXNDYW5CZUNob3NlblZpYVBvbGljeSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgYWxpYXMgPSAiY29tLmFuZHJvaWQudGVzdC5ub3Qtc2VsZWN0YWJsZS1rZXktMSI7CisgICAgICAgIGZpbmFsIFByaXZhdGVLZXkgcHJpdktleSA9IGdldFByaXZhdGVLZXkoRkFLRV9SU0FfMS5wcml2YXRlS2V5ICwgIlJTQSIpOworICAgICAgICBmaW5hbCBDZXJ0aWZpY2F0ZSBjZXJ0ID0gZ2V0Q2VydGlmaWNhdGUoRkFLRV9SU0FfMS5jYUNlcnRpZmljYXRlKTsKKworICAgICAgICAvLyBJbnN0YWxsIGtleXBhaXIuCisgICAgICAgIGFzc2VydFRydWUobURldmljZVBvbGljeU1hbmFnZXIuaW5zdGFsbEtleVBhaXIoCisgICAgICAgICAgICBnZXRXaG8oKSwgcHJpdktleSwgbmV3IENlcnRpZmljYXRlW10ge2NlcnR9LCBhbGlhcywgMCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gUmVxdWVzdCBhbmQgcmV0cmlldmUgdXNpbmcgdGhlIGFsaWFzLgorICAgICAgICAgICAgYXNzZXJ0R3JhbnRlZChhbGlhcywgZmFsc2UpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGFsaWFzLCBuZXcgS2V5Q2hhaW5BbGlhc0Z1dHVyZShhbGlhcykuZ2V0KCkpOworICAgICAgICAgICAgYXNzZXJ0R3JhbnRlZChhbGlhcywgdHJ1ZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAvLyBEZWxldGUgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSB0ZXN0IHN1Y2NlZWRlZC4KKyAgICAgICAgICAgIGFzc2VydFRydWUobURldmljZVBvbGljeU1hbmFnZXIucmVtb3ZlS2V5UGFpcihnZXRXaG8oKSwgYWxpYXMpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJ5dGVbXSBzaWduRGF0YVdpdGhLZXkoU3RyaW5nIGFsZ29JZGVudGlmaWVyLCBQcml2YXRlS2V5IHByaXZhdGVLZXkpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBieXRlW10gZGF0YSA9IG5ldyBTdHJpbmcoImhlbGxvIikuZ2V0Qnl0ZXMoKTsKKyAgICAgICAgU2lnbmF0dXJlIHNpZ24gPSBTaWduYXR1cmUuZ2V0SW5zdGFuY2UoYWxnb0lkZW50aWZpZXIpOworICAgICAgICBzaWduLmluaXRTaWduKHByaXZhdGVLZXkpOworICAgICAgICBzaWduLnVwZGF0ZShkYXRhKTsKKyAgICAgICAgcmV0dXJuIHNpZ24uc2lnbigpOworICAgIH0KKworICAgIHZvaWQgdmVyaWZ5U2lnbmF0dXJlKFN0cmluZyBhbGdvSWRlbnRpZmllciwgUHVibGljS2V5IHB1YmxpY0tleSwgYnl0ZVtdIHNpZ25hdHVyZSkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBieXRlW10gZGF0YSA9IG5ldyBTdHJpbmcoImhlbGxvIikuZ2V0Qnl0ZXMoKTsKKyAgICAgICAgU2lnbmF0dXJlIHZlcmlmeSA9IFNpZ25hdHVyZS5nZXRJbnN0YW5jZShhbGdvSWRlbnRpZmllcik7CisgICAgICAgIHZlcmlmeS5pbml0VmVyaWZ5KHB1YmxpY0tleSk7CisgICAgICAgIHZlcmlmeS51cGRhdGUoZGF0YSk7CisgICAgICAgIGFzc2VydFRydWUodmVyaWZ5LnZlcmlmeShzaWduYXR1cmUpKTsKKyAgICB9CisKKyAgICB2b2lkIHZlcmlmeVNpZ25hdHVyZU92ZXJEYXRhKFN0cmluZyBhbGdvSWRlbnRpZmllciwgS2V5UGFpciBrZXlQYWlyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdmVyaWZ5U2lnbmF0dXJlKGFsZ29JZGVudGlmaWVyLCBrZXlQYWlyLmdldFB1YmxpYygpLAorICAgICAgICAgICAgICAgIHNpZ25EYXRhV2l0aEtleShhbGdvSWRlbnRpZmllciwga2V5UGFpci5nZXRQcml2YXRlKCkpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEtleUdlblBhcmFtZXRlclNwZWMgYnVpbGRSc2FLZXlTcGVjKFN0cmluZyBhbGlhcywgYm9vbGVhbiB1c2VTdHJvbmdCb3gpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBLZXlHZW5QYXJhbWV0ZXJTcGVjLkJ1aWxkZXIoCisgICAgICAgICAgICAgICAgYWxpYXMsCisgICAgICAgICAgICAgICAgS2V5UHJvcGVydGllcy5QVVJQT1NFX1NJR04gfCBLZXlQcm9wZXJ0aWVzLlBVUlBPU0VfVkVSSUZZKQorICAgICAgICAgICAgLnNldEtleVNpemUoMjA0OCkKKyAgICAgICAgICAgIC5zZXREaWdlc3RzKEtleVByb3BlcnRpZXMuRElHRVNUX1NIQTI1NikKKyAgICAgICAgICAgIC5zZXRTaWduYXR1cmVQYWRkaW5ncyhLZXlQcm9wZXJ0aWVzLlNJR05BVFVSRV9QQURESU5HX1JTQV9QU1MsCisgICAgICAgICAgICAgICAgICAgIEtleVByb3BlcnRpZXMuU0lHTkFUVVJFX1BBRERJTkdfUlNBX1BLQ1MxKQorICAgICAgICAgICAgLnNldElzU3Ryb25nQm94QmFja2VkKHVzZVN0cm9uZ0JveCkKKyAgICAgICAgICAgIC5idWlsZCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDYW5HZW5lcmF0ZVJTQUtleVBhaXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGFsaWFzID0gImNvbS5hbmRyb2lkLnRlc3QuZ2VuZXJhdGVkLXJzYS0xIjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEF0dGVzdGVkS2V5UGFpciBnZW5lcmF0ZWQgPSBtRGV2aWNlUG9saWN5TWFuYWdlci5nZW5lcmF0ZUtleVBhaXIoCisgICAgICAgICAgICAgICAgICAgIGdldFdobygpLCAiUlNBIiwgYnVpbGRSc2FLZXlTcGVjKGFsaWFzLCBmYWxzZSAvKiB1c2VTdHJvbmdCb3ggKi8pLAorICAgICAgICAgICAgICAgICAgICAwIC8qIGlkQXR0ZXN0YXRpb25GbGFncyAqLyk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGdlbmVyYXRlZCk7CisgICAgICAgICAgICB2ZXJpZnlTaWduYXR1cmVPdmVyRGF0YSgiU0hBMjU2d2l0aFJTQSIsIGdlbmVyYXRlZC5nZXRLZXlQYWlyKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRGV2aWNlUG9saWN5TWFuYWdlci5yZW1vdmVLZXlQYWlyKGdldFdobygpLCBhbGlhcykpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENhbkdlbmVyYXRlUlNBS2V5UGFpclVzaW5nU3Ryb25nQm94KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBhbGlhcyA9ICJjb20uYW5kcm9pZC50ZXN0LmdlbmVyYXRlZC1yc2Etc2ItMSI7CisgICAgICAgIEF0dGVzdGVkS2V5UGFpciBnZW5lcmF0ZWQgPSBtRGV2aWNlUG9saWN5TWFuYWdlci5nZW5lcmF0ZUtleVBhaXIoCisgICAgICAgICAgICAgICAgZ2V0V2hvKCksICJSU0EiLCBidWlsZFJzYUtleVNwZWMoYWxpYXMsIHRydWUgLyogdXNlU3Ryb25nQm94ICovKSwKKyAgICAgICAgICAgICAgICAwIC8qIGlkQXR0ZXN0YXRpb25GbGFncyAqLyk7CisgICAgICAgIGlmIChnZW5lcmF0ZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoaGFzU3Ryb25nQm94KCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHZlcmlmeVNpZ25hdHVyZU92ZXJEYXRhKCJTSEEyNTZ3aXRoUlNBIiwgZ2VuZXJhdGVkLmdldEtleVBhaXIoKSk7CisgICAgICAgIGFzc2VydFRydWUobURldmljZVBvbGljeU1hbmFnZXIucmVtb3ZlS2V5UGFpcihnZXRXaG8oKSwgYWxpYXMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEtleUdlblBhcmFtZXRlclNwZWMgYnVpbGRFY0tleVNwZWMoU3RyaW5nIGFsaWFzLCBib29sZWFuIHVzZVN0cm9uZ0JveCkgeworICAgICAgICByZXR1cm4gbmV3IEtleUdlblBhcmFtZXRlclNwZWMuQnVpbGRlcigKKyAgICAgICAgICAgICAgICBhbGlhcywKKyAgICAgICAgICAgICAgICBLZXlQcm9wZXJ0aWVzLlBVUlBPU0VfU0lHTiB8IEtleVByb3BlcnRpZXMuUFVSUE9TRV9WRVJJRlkpCisgICAgICAgICAgICAuc2V0RGlnZXN0cyhLZXlQcm9wZXJ0aWVzLkRJR0VTVF9TSEEyNTYpCisgICAgICAgICAgICAuc2V0SXNTdHJvbmdCb3hCYWNrZWQodXNlU3Ryb25nQm94KQorICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENhbkdlbmVyYXRlRUNLZXlQYWlyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBhbGlhcyA9ICJjb20uYW5kcm9pZC50ZXN0LmdlbmVyYXRlZC1lYy0xIjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEF0dGVzdGVkS2V5UGFpciBnZW5lcmF0ZWQgPSBtRGV2aWNlUG9saWN5TWFuYWdlci5nZW5lcmF0ZUtleVBhaXIoCisgICAgICAgICAgICAgICAgICAgIGdldFdobygpLCAiRUMiLCBidWlsZEVjS2V5U3BlYyhhbGlhcywgZmFsc2UgLyogdXNlU3Ryb25nQm94ICovKSwKKyAgICAgICAgICAgICAgICAgICAgMCAvKiBpZEF0dGVzdGF0aW9uRmxhZ3MgKi8pOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChnZW5lcmF0ZWQpOworICAgICAgICAgICAgdmVyaWZ5U2lnbmF0dXJlT3ZlckRhdGEoIlNIQTI1NndpdGhFQ0RTQSIsIGdlbmVyYXRlZC5nZXRLZXlQYWlyKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRGV2aWNlUG9saWN5TWFuYWdlci5yZW1vdmVLZXlQYWlyKGdldFdobygpLCBhbGlhcykpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENhbkdlbmVyYXRlRUNLZXlQYWlyVXNpbmdTdHJvbmdCb3goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGFsaWFzID0gImNvbS5hbmRyb2lkLnRlc3QuZ2VuZXJhdGVkLWVjLXNiLTEiOworICAgICAgICBBdHRlc3RlZEtleVBhaXIgZ2VuZXJhdGVkID0gbURldmljZVBvbGljeU1hbmFnZXIuZ2VuZXJhdGVLZXlQYWlyKAorICAgICAgICAgICAgICAgIGdldFdobygpLCAiRUMiLCBidWlsZEVjS2V5U3BlYyhhbGlhcywgdHJ1ZSAvKiB1c2VTdHJvbmdCb3ggKi8pLCAwKTsKKyAgICAgICAgaWYgKGdlbmVyYXRlZCA9PSBudWxsKSB7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShoYXNTdHJvbmdCb3goKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdmVyaWZ5U2lnbmF0dXJlT3ZlckRhdGEoIlNIQTI1NndpdGhFQ0RTQSIsIGdlbmVyYXRlZC5nZXRLZXlQYWlyKCkpOworICAgICAgICBhc3NlcnRUcnVlKG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnJlbW92ZUtleVBhaXIoZ2V0V2hvKCksIGFsaWFzKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlRGV2aWNlSWRBdHRlc3RhdGlvbkRhdGEoQ2VydGlmaWNhdGUgbGVhZiwKKyAgICAgICAgICAgIFN0cmluZyBleHBlY3RlZFNlcmlhbCwgU3RyaW5nIGV4cGVjdGVkSW1laSwgU3RyaW5nIGV4cGVjdGVkTWVpZCkKKyAgICAgICAgICAgIHRocm93cyBDZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb24geworICAgICAgICBBdHRlc3RhdGlvbiBhdHRlc3RhdGlvblJlY29yZCA9IG5ldyBBdHRlc3RhdGlvbigoWDUwOUNlcnRpZmljYXRlKSBsZWFmKTsKKyAgICAgICAgQXV0aG9yaXphdGlvbkxpc3QgdGVlQXR0ZXN0YXRpb24gPSBhdHRlc3RhdGlvblJlY29yZC5nZXRUZWVFbmZvcmNlZCgpOworICAgICAgICBhc3NlcnROb3ROdWxsKHRlZUF0dGVzdGF0aW9uKTsKKworICAgICAgICB2YWxpZGF0ZUJyYW5kQXR0ZXN0YXRpb25SZWNvcmQodGVlQXR0ZXN0YXRpb24pOworICAgICAgICBhc3NlcnRFcXVhbHMoQnVpbGQuREVWSUNFLCB0ZWVBdHRlc3RhdGlvbi5nZXREZXZpY2UoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhCdWlsZC5QUk9EVUNULCB0ZWVBdHRlc3RhdGlvbi5nZXRQcm9kdWN0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoQnVpbGQuTUFOVUZBQ1RVUkVSLCB0ZWVBdHRlc3RhdGlvbi5nZXRNYW51ZmFjdHVyZXIoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhCdWlsZC5NT0RFTCwgdGVlQXR0ZXN0YXRpb24uZ2V0TW9kZWwoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFNlcmlhbCwgdGVlQXR0ZXN0YXRpb24uZ2V0U2VyaWFsTnVtYmVyKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRJbWVpLCB0ZWVBdHRlc3RhdGlvbi5nZXRJbWVpKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRNZWlkLCB0ZWVBdHRlc3RhdGlvbi5nZXRNZWlkKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUJyYW5kQXR0ZXN0YXRpb25SZWNvcmQoQXV0aG9yaXphdGlvbkxpc3QgdGVlQXR0ZXN0YXRpb24pIHsKKyAgICAgICAgaWYgKCFCdWlsZC5NT0RFTC5lcXVhbHMoIlBpeGVsIDIiKSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJ1aWxkLkJSQU5ELCB0ZWVBdHRlc3RhdGlvbi5nZXRCcmFuZCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUodGVlQXR0ZXN0YXRpb24uZ2V0QnJhbmQoKS5lcXVhbHMoQnVpbGQuQlJBTkQpCisgICAgICAgICAgICAgICAgICAgIHx8IHRlZUF0dGVzdGF0aW9uLmdldEJyYW5kKCkuZXF1YWxzKCJodGMiKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVBdHRlc3RhdGlvblJlY29yZChMaXN0PENlcnRpZmljYXRlPiBhdHRlc3RhdGlvbiwKKyAgICAgICAgICAgIGJ5dGVbXSBwcm92aWRlZENoYWxsZW5nZSkgdGhyb3dzIENlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydE5vdE51bGwoYXR0ZXN0YXRpb24pOworICAgICAgICBhc3NlcnRUcnVlKGF0dGVzdGF0aW9uLnNpemUoKSA+PSAyKTsKKyAgICAgICAgWDUwOUNlcnRpZmljYXRlIGxlYWYgPSAoWDUwOUNlcnRpZmljYXRlKSBhdHRlc3RhdGlvbi5nZXQoMCk7CisgICAgICAgIEF0dGVzdGF0aW9uIGF0dGVzdGF0aW9uUmVjb3JkID0gbmV3IEF0dGVzdGF0aW9uKGxlYWYpOworICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMocHJvdmlkZWRDaGFsbGVuZ2UsCisgICAgICAgICAgICAgICAgICAgIGF0dGVzdGF0aW9uUmVjb3JkLmdldEF0dGVzdGF0aW9uQ2hhbGxlbmdlKCkpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVTaWduYXR1cmVDaGFpbihMaXN0PENlcnRpZmljYXRlPiBjaGFpbiwgUHVibGljS2V5IGxlYWZLZXkpCisgICAgICAgICAgICB0aHJvd3MgR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uIHsKKyAgICAgICAgWDUwOUNlcnRpZmljYXRlIGxlYWYgPSAoWDUwOUNlcnRpZmljYXRlKSBjaGFpbi5nZXQoMCk7CisgICAgICAgIFB1YmxpY0tleSBrZXlGcm9tQ2VydCA9IGxlYWYuZ2V0UHVibGljS2V5KCk7CisgICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhrZXlGcm9tQ2VydC5nZXRFbmNvZGVkKCksIGxlYWZLZXkuZ2V0RW5jb2RlZCgpKSk7CisgICAgICAgIC8vIENoZWNrIHRoYXQgdGhlIGNlcnRpZmljYXRlIGNoYWluIGlzIHZhbGlkLgorICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGNoYWluLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUgaW50ZXJtZWRpYXRlID0gKFg1MDlDZXJ0aWZpY2F0ZSkgY2hhaW4uZ2V0KGkpOworICAgICAgICAgICAgUHVibGljS2V5IGludGVybWVkaWF0ZUtleSA9IGludGVybWVkaWF0ZS5nZXRQdWJsaWNLZXkoKTsKKyAgICAgICAgICAgIGxlYWYudmVyaWZ5KGludGVybWVkaWF0ZUtleSk7CisgICAgICAgICAgICBsZWFmID0gaW50ZXJtZWRpYXRlOworICAgICAgICB9CisKKyAgICAgICAgLy8gbGVhZiBpcyBub3cgdGhlIHJvb3QsIHZlcmlmeSB0aGUgcm9vdCBpcyBzZWxmLXNpZ25lZC4KKyAgICAgICAgUHVibGljS2V5IHJvb3RLZXkgPSBsZWFmLmdldFB1YmxpY0tleSgpOworICAgICAgICBsZWFmLnZlcmlmeShyb290S2V5KTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNEZXZpY2VJZEF0dGVzdGF0aW9uU3VwcG9ydGVkKCkgeworICAgICAgICByZXR1cm4gbURldmljZVBvbGljeU1hbmFnZXIuaXNEZXZpY2VJZEF0dGVzdGF0aW9uU3VwcG9ydGVkKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzRGV2aWNlSWRBdHRlc3RhdGlvblJlcXVlc3RlZChpbnQgZGV2aWNlSWRBdHRlc3RhdGlvbkZsYWdzKSB7CisgICAgICAgIHJldHVybiBkZXZpY2VJZEF0dGVzdGF0aW9uRmxhZ3MgIT0gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgYSBrZXkgdXNpbmcgRGV2aWNlUG9saWN5TWFuYWdlci5nZW5lcmF0ZUtleVBhaXIgdXNpbmcgdGhlIGdpdmVuIGtleSBhbGdvcml0aG0sCisgICAgICogdGhlbiB0ZXN0IHNpZ25pbmcgYW5kIHZlcmlmeWluZyB1c2luZyBnZW5lcmF0ZWQga2V5LgorICAgICAqIElmIHtAY29kZSBzaWduYXR1cmVQYWRkaW5nc30gaXMgbm90IG51bGwsIGl0IGlzIGFkZGVkIHRvIHRoZSBrZXkgcGFyYW1ldGVycyBzcGVjaWZpY2F0aW9uLgorICAgICAqIFJldHVybnMgdGhlIEF0dGVzdGF0aW9uIGxlYWYgY2VydGlmaWNhdGUuCisgICAgICovCisgICAgcHJpdmF0ZSBDZXJ0aWZpY2F0ZSBnZW5lcmF0ZUtleUFuZENoZWNrQXR0ZXN0YXRpb24oCisgICAgICAgICAgICBTdHJpbmcga2V5QWxnb3JpdGhtLCBTdHJpbmcgc2lnbmF0dXJlQWxnb3JpdGhtLAorICAgICAgICAgICAgU3RyaW5nW10gc2lnbmF0dXJlUGFkZGluZ3MsIGJvb2xlYW4gdXNlU3Ryb25nQm94LAorICAgICAgICAgICAgaW50IGRldmljZUlkQXR0ZXN0YXRpb25GbGFncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBhbGlhcyA9CisgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiY29tLmFuZHJvaWQudGVzdC5hdHRlc3RlZC0lcyIsIGtleUFsZ29yaXRobS50b0xvd2VyQ2FzZSgpKTsKKyAgICAgICAgYnl0ZVtdIGF0dGVzdGF0aW9uQ2hhbGxlbmdlID0gbmV3IGJ5dGVbXSB7MHgwMSwgMHgwMiwgMHgwM307CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBLZXlHZW5QYXJhbWV0ZXJTcGVjLkJ1aWxkZXIgc3BlY0J1aWxkZXIgPSAgbmV3IEtleUdlblBhcmFtZXRlclNwZWMuQnVpbGRlcigKKyAgICAgICAgICAgICAgICAgICAgYWxpYXMsCisgICAgICAgICAgICAgICAgICAgIEtleVByb3BlcnRpZXMuUFVSUE9TRV9TSUdOIHwgS2V5UHJvcGVydGllcy5QVVJQT1NFX1ZFUklGWSkKKyAgICAgICAgICAgICAgICAgICAgLnNldERpZ2VzdHMoS2V5UHJvcGVydGllcy5ESUdFU1RfU0hBMjU2KQorICAgICAgICAgICAgICAgICAgICAuc2V0QXR0ZXN0YXRpb25DaGFsbGVuZ2UoYXR0ZXN0YXRpb25DaGFsbGVuZ2UpCisgICAgICAgICAgICAgICAgICAgIC5zZXRJc1N0cm9uZ0JveEJhY2tlZCh1c2VTdHJvbmdCb3gpOworICAgICAgICAgICAgaWYgKHNpZ25hdHVyZVBhZGRpbmdzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzcGVjQnVpbGRlci5zZXRTaWduYXR1cmVQYWRkaW5ncyhzaWduYXR1cmVQYWRkaW5ncyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEtleUdlblBhcmFtZXRlclNwZWMgc3BlYyA9IHNwZWNCdWlsZGVyLmJ1aWxkKCk7CisgICAgICAgICAgICBBdHRlc3RlZEtleVBhaXIgZ2VuZXJhdGVkID0gbURldmljZVBvbGljeU1hbmFnZXIuZ2VuZXJhdGVLZXlQYWlyKAorICAgICAgICAgICAgICAgICAgICBnZXRXaG8oKSwga2V5QWxnb3JpdGhtLCBzcGVjLCBkZXZpY2VJZEF0dGVzdGF0aW9uRmxhZ3MpOworICAgICAgICAgICAgLy8gQmFpbCBvdXQgZWFybHkgaWYgU3Ryb25nQm94IHdhcyByZXF1ZXN0ZWQgYW5kIGdlbmVyYXRpb24gZmFpbGVkLgorICAgICAgICAgICAgLy8gTm90ZSB0aGUgdW5kZXJseWluZyBhc3N1bXB0aW9uIHRoYXQgU3Ryb25nQm94IHN1cHBvcnRzIGtleSBhdHRlc3RhdGlvbiBfYW5kXworICAgICAgICAgICAgLy8gRGV2aWNlIElEIGF0dGVzdGF0aW9uIChpLmUuIG5vIFN0cm9uZ0JveCBpbXBsZW1lbnRhdGlvbnMgdGhhdCBkbyBub3QgaW1wbGVtZW50CisgICAgICAgICAgICAvLyBEZXZpY2UgSUQgYXR0ZXN0YXRpb24pLgorICAgICAgICAgICAgLy8gSWYgZ2VuZXJhdGlvbiBoYXMgZmFpbGVkIGFuZCBTdHJvbmdCb3ggd2FzIHJlcXVlc3RlZCwgaXQgaXMgdGhlbiBhIGZhaWx1cmUKKyAgICAgICAgICAgIC8vIHJlZ2FyZGxlc3Mgb2YgdGhlIGtpbmQgb2YgYXR0ZXN0YXRpb24gcmVxdWVzdGVkLgorICAgICAgICAgICAgaWYgKHVzZVN0cm9uZ0JveCAmJiBnZW5lcmF0ZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKCJTdHJvbmdCb3gtYmFja2VkIGtleSBhdHRlc3RhdGlvbiBtdXN0IG5vdCBmYWlsIGlmIHRoZSBkZXZpY2UgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAiZGVjbGFyZXMgc3VwcG9ydCBmb3IgU3Ryb25nQm94IiwgaGFzU3Ryb25nQm94KCkpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJZiBEZXZpY2UgSUQgYXR0ZXN0YXRpb24gd2FzIHJlcXVlc3RlZCwgY2hlY2sgaXQgc3VjY2VlZGVkIGlmIGFuZCBvbmx5IGlmIGRldmljZSBJRAorICAgICAgICAgICAgLy8gYXR0ZXN0YXRpb24gaXMgc3VwcG9ydGVkLgorICAgICAgICAgICAgaWYgKGlzRGV2aWNlSWRBdHRlc3RhdGlvblJlcXVlc3RlZChkZXZpY2VJZEF0dGVzdGF0aW9uRmxhZ3MpKSB7CisgICAgICAgICAgICAgICAgaWYgKGdlbmVyYXRlZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKFN0cmluZy5mb3JtYXQoIkZhaWxlZCBnZXR0aW5nIERldmljZSBJRCBhdHRlc3RhdGlvbiBmb3Iga2V5ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWxnb3JpdGhtICVzLCB3aXRoIGZsYWdzICVzLCBkZXNwaXRlIGRldmljZSBkZWNsYXJpbmcgc3VwcG9ydC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlBbGdvcml0aG0sIGRldmljZUlkQXR0ZXN0YXRpb25GbGFncyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNEZXZpY2VJZEF0dGVzdGF0aW9uU3VwcG9ydGVkKCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoIkRldmljZSBJRCBhdHRlc3RhdGlvbiBmb3Iga2V5ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWxnb3JpdGhtICVzLCB3aXRoIGZsYWdzICVkIHNob3VsZCBub3QgaGF2ZSBzdWNjZWVkZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5QWxnb3JpdGhtLCBkZXZpY2VJZEF0dGVzdGF0aW9uRmxhZ3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRGV2aWNlSWRBdHRlc3RhdGlvblN1cHBvcnRlZCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJLZXkgZ2VuZXJhdGlvbiAob2YgdHlwZSAlcykgbXVzdCBzdWNjZWVkIHdoZW4gRGV2aWNlIElEICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdHRlc3RhdGlvbiB3YXMgbm90IHJlcXVlc3RlZC4iLCBrZXlBbGdvcml0aG0pLCBnZW5lcmF0ZWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgS2V5UGFpciBrZXlQYWlyID0gZ2VuZXJhdGVkLmdldEtleVBhaXIoKTsKKyAgICAgICAgICAgIHZlcmlmeVNpZ25hdHVyZU92ZXJEYXRhKHNpZ25hdHVyZUFsZ29yaXRobSwga2V5UGFpcik7CisgICAgICAgICAgICBMaXN0PENlcnRpZmljYXRlPiBhdHRlc3RhdGlvbiA9IGdlbmVyYXRlZC5nZXRBdHRlc3RhdGlvblJlY29yZCgpOworICAgICAgICAgICAgdmFsaWRhdGVBdHRlc3RhdGlvblJlY29yZChhdHRlc3RhdGlvbiwgYXR0ZXN0YXRpb25DaGFsbGVuZ2UpOworICAgICAgICAgICAgdmFsaWRhdGVTaWduYXR1cmVDaGFpbihhdHRlc3RhdGlvbiwga2V5UGFpci5nZXRQdWJsaWMoKSk7CisgICAgICAgICAgICByZXR1cm4gYXR0ZXN0YXRpb24uZ2V0KDApOworICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJVbmV4cGVjdGVkIGZhaWx1cmUgd2hpbGUgZ2VuZXJhdGluZyBrZXkgJXMgd2l0aCBJRCBmbGFncyAlZDogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAga2V5QWxnb3JpdGhtLCBkZXZpY2VJZEF0dGVzdGF0aW9uRmxhZ3MsIGV4KSwKKyAgICAgICAgICAgICAgICAgICAgaXNEZXZpY2VJZEF0dGVzdGF0aW9uUmVxdWVzdGVkKGRldmljZUlkQXR0ZXN0YXRpb25GbGFncykgJiYKKyAgICAgICAgICAgICAgICAgICAgIWlzRGV2aWNlSWRBdHRlc3RhdGlvblN1cHBvcnRlZCgpKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRGV2aWNlUG9saWN5TWFuYWdlci5yZW1vdmVLZXlQYWlyKGdldFdobygpLCBhbGlhcykpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBrZXkgZ2VuZXJhdGlvbiwgaW5jbHVkaW5nIHJlcXVlc3RpbmcgS2V5IEF0dGVzdGF0aW9uLCBmb3IgYWxsIHN1cHBvcnRlZCBrZXkKKyAgICAgKiBhbGdvcml0aG1zLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDYW5HZW5lcmF0ZUtleVBhaXJXaXRoS2V5QXR0ZXN0YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChTdXBwb3J0ZWRLZXlBbGdvcml0aG0gc3VwcG9ydGVkS2V5OiBTVVBQT1JURURfS0VZX0FMR09SSVRITVMpIHsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZ2VuZXJhdGVLZXlBbmRDaGVja0F0dGVzdGF0aW9uKAorICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWRLZXkua2V5QWxnb3JpdGhtLCBzdXBwb3J0ZWRLZXkuc2lnbmF0dXJlQWxnb3JpdGhtLAorICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWRLZXkuc2lnbmF0dXJlUGFkZGluZ1NjaGVtZXMsIGZhbHNlIC8qIHVzZVN0cm9uZ0JveCAqLywgMCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENhbkdlbmVyYXRlS2V5UGFpcldpdGhLZXlBdHRlc3RhdGlvblVzaW5nU3Ryb25nQm94KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoU3VwcG9ydGVkS2V5QWxnb3JpdGhtIHN1cHBvcnRlZEtleTogU1VQUE9SVEVEX0tFWV9BTEdPUklUSE1TKSB7CisgICAgICAgICAgICBnZW5lcmF0ZUtleUFuZENoZWNrQXR0ZXN0YXRpb24oCisgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZEtleS5rZXlBbGdvcml0aG0sIHN1cHBvcnRlZEtleS5zaWduYXR1cmVBbGdvcml0aG0sCisgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZEtleS5zaWduYXR1cmVQYWRkaW5nU2NoZW1lcywgdHJ1ZSAvKiB1c2VTdHJvbmdCb3ggKi8sCisgICAgICAgICAgICAgICAgICAgIDAgLyogaWRBdHRlc3RhdGlvbkZsYWdzICovKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFzc2VydEFsbFZhcmlhbnRzT2ZEZXZpY2VJZEF0dGVzdGF0aW9uKGJvb2xlYW4gdXNlU3Ryb25nQm94KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTGlzdDxJbnRlZ2VyPiBtb2Rlc1RvVGVzdCA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKKyAgICAgICAgU3RyaW5nIGltZWkgPSBudWxsOworICAgICAgICBTdHJpbmcgbWVpZCA9IG51bGw7CisgICAgICAgIC8vIEFsbCBkZXZpY2VzIG11c3Qgc3VwcG9ydCBhdCBsZWFzdCBiYXNpYyBkZXZpY2UgaW5mb3JtYXRpb24gYXR0ZXN0YXRpb24gYXMgd2VsbCBhcyBzZXJpYWwKKyAgICAgICAgLy8gbnVtYmVyIGF0dGVzdGF0aW9uLiBBbHRob3VnaCBhdHRlc3RhdGlvbiBvZiB1bmlxdWUgZGV2aWNlIGlkcyBhcmUgb25seSBjYWxsYWJsZSBieSBkZXZpY2UKKyAgICAgICAgLy8gb3duZXIuCisgICAgICAgIG1vZGVzVG9UZXN0LmFkZChJRF9UWVBFX0JBU0VfSU5GTyk7CisgICAgICAgIGlmIChpc0RldmljZU93bmVyKCkpIHsKKyAgICAgICAgICAgIG1vZGVzVG9UZXN0LmFkZChJRF9UWVBFX1NFUklBTCk7CisgICAgICAgICAgICAvLyBHZXQgSU1FSSBhbmQgTUVJRCBvZiB0aGUgZGV2aWNlLgorICAgICAgICAgICAgVGVsZXBob255TWFuYWdlciB0ZWxlcGhvbnlTZXJ2aWNlID0gKFRlbGVwaG9ueU1hbmFnZXIpIG1BY3Rpdml0eS5nZXRTeXN0ZW1TZXJ2aWNlKAorICAgICAgICAgICAgICAgICAgICBDb250ZXh0LlRFTEVQSE9OWV9TRVJWSUNFKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIk5lZWQgdG8gYmUgYWJsZSB0byByZWFkIGRldmljZSBpZGVudGlmaWVycyIsIHRlbGVwaG9ueVNlcnZpY2UpOworICAgICAgICAgICAgaW1laSA9IHRlbGVwaG9ueVNlcnZpY2UuZ2V0SW1laSgwKTsKKyAgICAgICAgICAgIG1laWQgPSB0ZWxlcGhvbnlTZXJ2aWNlLmdldE1laWQoMCk7CisgICAgICAgICAgICAvLyBJZiB0aGUgZGV2aWNlIGhhcyBhIHZhbGlkIElNRUkgaXQgbXVzdCBzdXBwb3J0IGF0dGVzdGF0aW9uIGZvciBpdC4KKyAgICAgICAgICAgIGlmIChpbWVpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtb2Rlc1RvVGVzdC5hZGQoSURfVFlQRV9JTUVJKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFNhbWUgZm9yIE1FSUQKKyAgICAgICAgICAgIGlmIChtZWlkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtb2Rlc1RvVGVzdC5hZGQoSURfVFlQRV9NRUlEKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnQgbnVtQ29tYmluYXRpb25zID0gMSA8PCBtb2Rlc1RvVGVzdC5zaXplKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbnVtQ29tYmluYXRpb25zOyBpKyspIHsKKyAgICAgICAgICAgIC8vIFNldCB0aGUgYml0cyBpbiBkZXZJZE9wdCB0byBiZSBwYXNzZWQgaW50byBnZW5lcmF0ZUtleVBhaXIgYWNjb3JkaW5nIHRvIHRoZQorICAgICAgICAgICAgLy8gY3VycmVudCBtb2RlcyB0ZXN0ZWQuCisgICAgICAgICAgICBpbnQgZGV2SWRPcHQgPSAwOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBtb2Rlc1RvVGVzdC5zaXplKCk7IGorKykgeworICAgICAgICAgICAgICAgIGlmICgoaSAmICgxIDw8IGopKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGRldklkT3B0ID0gZGV2SWRPcHQgfCBtb2Rlc1RvVGVzdC5nZXQoaik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvLyBOb3cgcnVuIHRoZSB0ZXN0IHdpdGggYWxsIHN1cHBvcnRlZCBrZXkgYWxnb3JpdGhtcworICAgICAgICAgICAgICAgIGZvciAoU3VwcG9ydGVkS2V5QWxnb3JpdGhtIHN1cHBvcnRlZEtleTogU1VQUE9SVEVEX0tFWV9BTEdPUklUSE1TKSB7CisgICAgICAgICAgICAgICAgICAgIENlcnRpZmljYXRlIGF0dGVzdGF0aW9uID0gZ2VuZXJhdGVLZXlBbmRDaGVja0F0dGVzdGF0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZEtleS5rZXlBbGdvcml0aG0sIHN1cHBvcnRlZEtleS5zaWduYXR1cmVBbGdvcml0aG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkS2V5LnNpZ25hdHVyZVBhZGRpbmdTY2hlbWVzLCB1c2VTdHJvbmdCb3gsIGRldklkT3B0KTsKKyAgICAgICAgICAgICAgICAgICAgLy8gZ2VuZXJhdGVLZXlBbmRDaGVja0F0dGVzdGF0aW9uIHNob3VsZCByZXR1cm4gbnVsbCBpZiBkZXZpY2UgSUQgYXR0ZXN0YXRpb24KKyAgICAgICAgICAgICAgICAgICAgLy8gaXMgbm90IHN1cHBvcnRlZC4gU2ltcGx5IGNvbnRpbnVlIHRvIHRlc3QgdGhlIG5leHQgY29tYmluYXRpb24uCisgICAgICAgICAgICAgICAgICAgIGlmIChhdHRlc3RhdGlvbiA9PSBudWxsICYmICFpc0RldmljZUlkQXR0ZXN0YXRpb25TdXBwb3J0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGF0dGVzdGF0aW9uIG11c3Qgb25seSBiZSBudWxsIGlmIFN0cm9uZ0JveCBhdHRlc3RhdGlvbiB3YXMgcmVxdWVzdGVkLAorICAgICAgICAgICAgICAgICAgICAvLyBidXQgU3Ryb25nQm94IGlzIG5vdCBhdmFpbGFibGUgb24gdGhlIGRldmljZS4KKyAgICAgICAgICAgICAgICAgICAgaWYgKGF0dGVzdGF0aW9uID09IG51bGwgJiYgdXNlU3Ryb25nQm94KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShoYXNTdHJvbmdCb3goKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF0dGVzdGF0aW9uIHNob3VsZCBiZSB2YWxpZCBmb3Iga2V5ICVzIHdpdGggYXR0ZXN0YXRpb24gbW9kZXMgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZEtleS5rZXlBbGdvcml0aG0sIGRldklkT3B0KSwgYXR0ZXN0YXRpb24pOworICAgICAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIGV4cGVjdGVkIHZhbHVlcyBmb3Igc2VyaWFsLCBJTUVJIGFuZCBNRUlEIGRlcGVuZGluZyBvbiB3aGV0aGVyCisgICAgICAgICAgICAgICAgICAgIC8vIGF0dGVzdGF0aW9uIGZvciB0aGVtIHdhcyByZXF1ZXN0ZWQuCisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBleHBlY3RlZFNlcmlhbCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGlmICgoZGV2SWRPcHQgJiBJRF9UWVBFX1NFUklBTCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRTZXJpYWwgPSBCdWlsZC5nZXRTZXJpYWwoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZXhwZWN0ZWRJbWVpID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChkZXZJZE9wdCAmIElEX1RZUEVfSU1FSSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRJbWVpID0gaW1laTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZXhwZWN0ZWRNZWlkID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChkZXZJZE9wdCAmIElEX1RZUEVfTUVJRCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRNZWlkID0gbWVpZDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZURldmljZUlkQXR0ZXN0YXRpb25EYXRhKGF0dGVzdGF0aW9uLCBleHBlY3RlZFNlcmlhbCwgZXhwZWN0ZWRJbWVpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkTWVpZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHRlc3Qgb25seSBmYWlscyBpZiB0aGUgZGV2aWNlIGlzIG5vdCBtZWFudCB0byBzdXBwb3J0IERldmljZQorICAgICAgICAgICAgICAgIC8vIElEIGF0dGVzdGF0aW9uLgorICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKGlzRGV2aWNlSWRBdHRlc3RhdGlvblN1cHBvcnRlZCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBbGxWYXJpYXRpb25zT2ZEZXZpY2VJZEF0dGVzdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEFsbFZhcmlhbnRzT2ZEZXZpY2VJZEF0dGVzdGF0aW9uKGZhbHNlIC8qIHVzZVN0cm9uZ0JveCAqLyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFsbFZhcmlhdGlvbnNPZkRldmljZUlkQXR0ZXN0YXRpb25Vc2luZ1N0cm9uZ0JveCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRBbGxWYXJpYW50c09mRGV2aWNlSWRBdHRlc3RhdGlvbih0cnVlIC8qIHVzZVN0cm9uZ0JveCAqLyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFByb2ZpbGVPd25lckNhbm5vdEF0dGVzdERldmljZVVuaXF1ZUlkcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoaXNEZXZpY2VPd25lcigpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaW50W10gZm9yYmlkZGVuTW9kZXMgPSBuZXcgaW50W10ge0lEX1RZUEVfU0VSSUFMLCBJRF9UWVBFX0lNRUksIElEX1RZUEVfTUVJRH07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZm9yYmlkZGVuTW9kZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZm9yIChTdXBwb3J0ZWRLZXlBbGdvcml0aG0gc3VwcG9ydGVkS2V5OiBTVVBQT1JURURfS0VZX0FMR09SSVRITVMpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVLZXlBbmRDaGVja0F0dGVzdGF0aW9uKHN1cHBvcnRlZEtleS5rZXlBbGdvcml0aG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkS2V5LnNpZ25hdHVyZUFsZ29yaXRobSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWRLZXkuc2lnbmF0dXJlUGFkZGluZ1NjaGVtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogdXNlU3Ryb25nQm94ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmJpZGRlbk1vZGVzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgZmFpbCgiQXR0ZXN0YXRpb24gb2YgZGV2aWNlIFVJRCAoIiArIGZvcmJpZGRlbk1vZGVzW2ldICsgIikgc2hvdWxkIG5vdCBiZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAicG9zc2libGUgZnJvbSBwcm9maWxlIG93bmVyIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZS5nZXRNZXNzYWdlKCkuY29udGFpbnMoImRvZXMgbm90IG93biB0aGUgZGV2aWNlIikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENhblNldEtleVBhaXJDZXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBhbGlhcyA9ICJjb20uYW5kcm9pZC50ZXN0LnNldC1lYy0xIjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEtleUdlblBhcmFtZXRlclNwZWMgc3BlYyA9IG5ldyBLZXlHZW5QYXJhbWV0ZXJTcGVjLkJ1aWxkZXIoCisgICAgICAgICAgICAgICAgICAgIGFsaWFzLAorICAgICAgICAgICAgICAgICAgICBLZXlQcm9wZXJ0aWVzLlBVUlBPU0VfU0lHTiB8IEtleVByb3BlcnRpZXMuUFVSUE9TRV9WRVJJRlkpCisgICAgICAgICAgICAgICAgICAgIC5zZXREaWdlc3RzKEtleVByb3BlcnRpZXMuRElHRVNUX1NIQTI1NikKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisKKyAgICAgICAgICAgIEF0dGVzdGVkS2V5UGFpciBnZW5lcmF0ZWQgPSBtRGV2aWNlUG9saWN5TWFuYWdlci5nZW5lcmF0ZUtleVBhaXIoCisgICAgICAgICAgICAgICAgICAgIGdldFdobygpLCAiRUMiLCBzcGVjLCAwKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZ2VuZXJhdGVkKTsKKyAgICAgICAgICAgIC8vIENyZWF0ZSBhIHNlbGYtc2lnbmVkIGNlcnQgdG8gZ28gd2l0aCBpdC4KKyAgICAgICAgICAgIFg1MDBQcmluY2lwYWwgaXNzdWVyID0gbmV3IFg1MDBQcmluY2lwYWwoIkNOPVNlbGZTaWduZWQsIE89QW5kcm9pZCwgQz1VUyIpOworICAgICAgICAgICAgWDUwMFByaW5jaXBhbCBzdWJqZWN0ID0gbmV3IFg1MDBQcmluY2lwYWwoIkNOPVN1YmplY3QsIE89QW5kcm9pZCwgQz1VUyIpOworICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlIGNlcnQgPSBjcmVhdGVDZXJ0aWZpY2F0ZShnZW5lcmF0ZWQuZ2V0S2V5UGFpcigpLCBzdWJqZWN0LCBpc3N1ZXIpOworICAgICAgICAgICAgLy8gU2V0IHRoZSBjZXJ0aWZpY2F0ZSBjaGFpbgorICAgICAgICAgICAgTGlzdDxDZXJ0aWZpY2F0ZT4gY2VydHMgPSBuZXcgQXJyYXlMaXN0PENlcnRpZmljYXRlPigpOworICAgICAgICAgICAgY2VydHMuYWRkKGNlcnQpOworICAgICAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuc2V0S2V5UGFpckNlcnRpZmljYXRlKGdldFdobygpLCBhbGlhcywgY2VydHMsIHRydWUpOworICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGFsaWFzIGNhbiBub3cgYmUgb2J0YWluZWQuCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYWxpYXMsIG5ldyBLZXlDaGFpbkFsaWFzRnV0dXJlKGFsaWFzKS5nZXQoKSk7CisgICAgICAgICAgICAvLyBBbmQgY2FuIGJlIHJldHJpZXZlZCBmcm9tIEtleUNoYWluCisgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGVbXSBmZXRjaGVkQ2VydHMgPSBLZXlDaGFpbi5nZXRDZXJ0aWZpY2F0ZUNoYWluKG1BY3Rpdml0eSwgYWxpYXMpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGZldGNoZWRDZXJ0cy5sZW5ndGgsIGNlcnRzLnNpemUoKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZmV0Y2hlZENlcnRzWzBdLmdldEVuY29kZWQoKSwgY2VydHMuZ2V0KDApLmdldEVuY29kZWQoKSkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRGV2aWNlUG9saWN5TWFuYWdlci5yZW1vdmVLZXlQYWlyKGdldFdobygpLCBhbGlhcykpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENhblNldEtleVBhaXJDZXJ0Q2hhaW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGFsaWFzID0gImNvbS5hbmRyb2lkLnRlc3Quc2V0LWVjLTIiOworICAgICAgICB0cnkgeworICAgICAgICAgICAgS2V5R2VuUGFyYW1ldGVyU3BlYyBzcGVjID0gbmV3IEtleUdlblBhcmFtZXRlclNwZWMuQnVpbGRlcigKKyAgICAgICAgICAgICAgICAgICAgYWxpYXMsCisgICAgICAgICAgICAgICAgICAgIEtleVByb3BlcnRpZXMuUFVSUE9TRV9TSUdOIHwgS2V5UHJvcGVydGllcy5QVVJQT1NFX1ZFUklGWSkKKyAgICAgICAgICAgICAgICAgICAgLnNldERpZ2VzdHMoS2V5UHJvcGVydGllcy5ESUdFU1RfU0hBMjU2KQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgICAgICAgICAgQXR0ZXN0ZWRLZXlQYWlyIGdlbmVyYXRlZCA9IG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmdlbmVyYXRlS2V5UGFpcigKKyAgICAgICAgICAgICAgICAgICAgZ2V0V2hvKCksICJFQyIsIHNwZWMsIDApOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChnZW5lcmF0ZWQpOworICAgICAgICAgICAgTGlzdDxDZXJ0aWZpY2F0ZT4gY2hhaW4gPSBsb2FkQ2VydGlmaWNhdGVDaGFpbigidXNlci1jZXJ0LWNoYWluLmNydCIpOworICAgICAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuc2V0S2V5UGFpckNlcnRpZmljYXRlKGdldFdobygpLCBhbGlhcywgY2hhaW4sIHRydWUpOworICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGFsaWFzIGNhbiBub3cgYmUgb2J0YWluZWQuCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYWxpYXMsIG5ldyBLZXlDaGFpbkFsaWFzRnV0dXJlKGFsaWFzKS5nZXQoKSk7CisgICAgICAgICAgICAvLyBBbmQgY2FuIGJlIHJldHJpZXZlZCBmcm9tIEtleUNoYWluCisgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGVbXSBmZXRjaGVkQ2VydHMgPSBLZXlDaGFpbi5nZXRDZXJ0aWZpY2F0ZUNoYWluKG1BY3Rpdml0eSwgYWxpYXMpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGZldGNoZWRDZXJ0cy5sZW5ndGgsIGNoYWluLnNpemUoKSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoYWluLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGZldGNoZWRDZXJ0c1tpXS5nZXRFbmNvZGVkKCksIGNoYWluLmdldChpKS5nZXRFbmNvZGVkKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGFzc2VydFRydWUobURldmljZVBvbGljeU1hbmFnZXIucmVtb3ZlS2V5UGFpcihnZXRXaG8oKSwgYWxpYXMpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRHcmFudGVkKFN0cmluZyBhbGlhcywgYm9vbGVhbiBleHBlY3RlZCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgYm9vbGVhbiBncmFudGVkID0gZmFsc2U7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBncmFudGVkID0gKEtleUNoYWluLmdldFByaXZhdGVLZXkobUFjdGl2aXR5LCBhbGlhcykgIT0gbnVsbCk7CisgICAgICAgIH0gY2F0Y2ggKEtleUNoYWluRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGlmIChleHBlY3RlZCkgeworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJHcmFudCBmb3IgYWxpYXM6IFwiIiArIGFsaWFzICsgIlwiIiwgZXhwZWN0ZWQsIGdyYW50ZWQpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFByaXZhdGVLZXkgZ2V0UHJpdmF0ZUtleShmaW5hbCBieXRlW10ga2V5LCBTdHJpbmcgdHlwZSkKKyAgICAgICAgICAgIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIEludmFsaWRLZXlTcGVjRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIEtleUZhY3RvcnkuZ2V0SW5zdGFuY2UodHlwZSkuZ2VuZXJhdGVQcml2YXRlKAorICAgICAgICAgICAgICAgIG5ldyBQS0NTOEVuY29kZWRLZXlTcGVjKGtleSkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIENlcnRpZmljYXRlIGdldENlcnRpZmljYXRlKGJ5dGVbXSBjZXJ0KSB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24geworICAgICAgICByZXR1cm4gQ2VydGlmaWNhdGVGYWN0b3J5LmdldEluc3RhbmNlKCJYLjUwOSIpLmdlbmVyYXRlQ2VydGlmaWNhdGUoCisgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNlcnQpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIENvbGxlY3Rpb248Q2VydGlmaWNhdGU+IGxvYWRDZXJ0aWZpY2F0ZXNGcm9tQXNzZXQoU3RyaW5nIGFzc2V0TmFtZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgQ2VydGlmaWNhdGVGYWN0b3J5IGNlcnRGYWN0b3J5ID0gQ2VydGlmaWNhdGVGYWN0b3J5LmdldEluc3RhbmNlKCJYLjUwOSIpOworICAgICAgICAgICAgQXNzZXRNYW5hZ2VyIGFtID0gbUFjdGl2aXR5LmdldEFzc2V0cygpOworICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBhbS5vcGVuKGFzc2V0TmFtZSk7CisgICAgICAgICAgICByZXR1cm4gKENvbGxlY3Rpb248Q2VydGlmaWNhdGU+KSBjZXJ0RmFjdG9yeS5nZW5lcmF0ZUNlcnRpZmljYXRlcyhpcyk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIHwgQ2VydGlmaWNhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIFByaXZhdGVLZXkgbG9hZFByaXZhdGVLZXlGcm9tQXNzZXQoU3RyaW5nIGFzc2V0TmFtZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQXNzZXRNYW5hZ2VyIGFtID0gbUFjdGl2aXR5LmdldEFzc2V0cygpOworICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBhbS5vcGVuKGFzc2V0TmFtZSk7CisgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgaW50IGxlbmd0aDsKKyAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVs0MDk2XTsKKyAgICAgICAgICAgIHdoaWxlICgobGVuZ3RoID0gaXMucmVhZChidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgpKSAhPSAtMSkgeworICAgICAgICAgICAgICBvdXRwdXQud3JpdGUoYnVmZmVyLCAwLCBsZW5ndGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGdldFByaXZhdGVLZXkob3V0cHV0LnRvQnl0ZUFycmF5KCksICJSU0EiKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gfCBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gfCBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgS2V5Q2hhaW5BbGlhc0Z1dHVyZSBpbXBsZW1lbnRzIEtleUNoYWluQWxpYXNDYWxsYmFjayB7CisgICAgICAgIHByaXZhdGUgZmluYWwgQ291bnREb3duTGF0Y2ggbUxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworICAgICAgICBwcml2YXRlIFN0cmluZyBtQ2hvc2VuQWxpYXMgPSBudWxsOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBhbGlhcyhmaW5hbCBTdHJpbmcgY2hvc2VuQWxpYXMpIHsKKyAgICAgICAgICAgIG1DaG9zZW5BbGlhcyA9IGNob3NlbkFsaWFzOworICAgICAgICAgICAgbUxhdGNoLmNvdW50RG93bigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEtleUNoYWluQWxpYXNGdXR1cmUoU3RyaW5nIGFsaWFzKQorICAgICAgICAgICAgICAgIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIC8qIFBhc3MgdGhlIGFsaWFzIGFzIGEgR0VUIHRvIGFuIGltYWdpbmFyeSBzZXJ2ZXIgaW5zdGVhZCBvZiBleHBsaWNpdGx5IGFza2luZyBmb3IgaXQsCisgICAgICAgICAgICAgKiB0byBtYWtlIHN1cmUgdGhlIERQQyBhY3R1YWxseSBoYXMgdG8gZG8gc29tZSB3b3JrIHRvIGdyYW50IHRoZSBjZXJ0LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBmaW5hbCBVcmkgdXJpID0KKyAgICAgICAgICAgICAgICAgICAgVXJpLnBhcnNlKCJodHRwczovL2V4YW1wbGUub3JnLz9hbGlhcz0iICsgVVJMRW5jb2Rlci5lbmNvZGUoYWxpYXMsICJVVEYtOCIpKTsKKyAgICAgICAgICAgIEtleUNoYWluLmNob29zZVByaXZhdGVLZXlBbGlhcyhtQWN0aXZpdHksIHRoaXMsCisgICAgICAgICAgICAgICAgICAgIG51bGwgLyoga2V5VHlwZXMgKi8sIG51bGwgLyogaXNzdWVycyAqLywgdXJpLCBudWxsIC8qIGFsaWFzICovKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkNob29zZXIgdGltZW91dCIsIG1MYXRjaC5hd2FpdChLRVlDSEFJTl9USU1FT1VUX01JTlMsIFRpbWVVbml0Lk1JTlVURVMpKTsKKyAgICAgICAgICAgIHJldHVybiBtQ2hvc2VuQWxpYXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQ29tcG9uZW50TmFtZSBnZXRXaG8oKSB7CisgICAgICAgIHJldHVybiBBRE1JTl9SRUNFSVZFUl9DT01QT05FTlQ7CisgICAgfQorCisgICAgYm9vbGVhbiBoYXNTdHJvbmdCb3goKSB7CisgICAgICAgIHJldHVybiBtQWN0aXZpdHkuZ2V0UGFja2FnZU1hbmFnZXIoKQorICAgICAgICAgICAgLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9TVFJPTkdCT1hfS0VZU1RPUkUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBbmRQcm9maWxlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2VhbmRwcm9maWxlb3duZXIvTWV0ZXJlZERhdGFSZXN0cmljdGlvblRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBbmRQcm9maWxlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2VhbmRwcm9maWxlb3duZXIvTWV0ZXJlZERhdGFSZXN0cmljdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzUzZDc1Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFuZFByb2ZpbGVPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZWFuZHByb2ZpbGVvd25lci9NZXRlcmVkRGF0YVJlc3RyaWN0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5jdHMuZGV2aWNlYW5kcHJvZmlsZW93bmVyOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Db25uZWN0aXZpdHlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGU7CitpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8uU3RhdGU7CitpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2VuZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuU3lzdGVtVXRpbDsKKworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5CbG9ja2luZ1F1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkxpbmtlZEJsb2NraW5nUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK3B1YmxpYyBjbGFzcyBNZXRlcmVkRGF0YVJlc3RyaWN0aW9uVGVzdCBleHRlbmRzIEJhc2VEZXZpY2VBZG1pblRlc3QgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBNZXRlcmVkRGF0YVJlc3RyaWN0aW9uVGVzdC5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVURVJFRF9EQVRBX0FQUF9QS0cKKyAgICAgICAgICAgID0gImNvbS5hbmRyb2lkLmN0cy5kZXZpY2Vwb2xpY3kubWV0ZXJlZGRhdGF0ZXN0YXBwIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVURVJFRF9EQVRBX0FQUF9NQUlOX0FDVElWSVRZCisgICAgICAgICAgICA9IE1FVEVSRURfREFUQV9BUFBfUEtHICsgIi5NYWluQWN0aXZpdHkiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBXQUlUX0ZPUl9ORVRXT1JLX0lORk9fVElNRU9VVF9TRUMgPSA4OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5VTV9UUklFU19NRVRFUkVEX1NUQVRVU19DSEVDSyA9IDIwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgSU5URVJWQUxfTUVURVJFRF9TVEFUVVNfQ0hFQ0tfTVMgPSA1MDA7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfTUVTU0VOR0VSID0gIm1lc3NlbmdlciI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19OT1RJRllfTkVUV09SS19TVEFURSA9IDE7CisKKyAgICBwcml2YXRlIGZpbmFsIE1lc3NlbmdlciBtQ2FsbGJhY2tNZXNzZW5nZXIgPSBuZXcgTWVzc2VuZ2VyKG5ldyBDYWxsYmFja0hhbmRsZXIoKSk7CisgICAgcHJpdmF0ZSBmaW5hbCBCbG9ja2luZ1F1ZXVlPE5ldHdvcmtJbmZvPiBtTmV0d29ya0luZm9zID0gbmV3IExpbmtlZEJsb2NraW5nUXVldWU8PigxKTsKKworICAgIHByaXZhdGUgQ29ubmVjdGl2aXR5TWFuYWdlciBtQ207CisgICAgcHJpdmF0ZSBXaWZpTWFuYWdlciBtV207CisgICAgcHJpdmF0ZSBTdHJpbmcgbU1ldGVyZWRXaWZpOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgIG1DbSA9IChDb25uZWN0aXZpdHlNYW5hZ2VyKSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQ09OTkVDVElWSVRZX1NFUlZJQ0UpOworICAgICAgICBtV20gPSAoV2lmaU1hbmFnZXIpIG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5XSUZJX1NFUlZJQ0UpOworICAgICAgICBzZXRNZXRlcmVkTmV0d29yaygpOworICAgIH0KKworICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgICAgIHJlc2V0TWV0ZXJlZE5ldHdvcmsoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0TWV0ZXJlZERhdGFEaXNhYmxlZFBhY2thZ2VzKCkgeworICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gcmVzdHJpY3RlZFBrZ3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgcmVzdHJpY3RlZFBrZ3MuYWRkKE1FVEVSRURfREFUQV9BUFBfUEtHKTsKKyAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGV4Y2x1ZGVkUGtncyA9IG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnNldE1ldGVyZWREYXRhRGlzYWJsZWRQYWNrYWdlcygKKyAgICAgICAgICAgICAgICBBRE1JTl9SRUNFSVZFUl9DT01QT05FTlQsIHJlc3RyaWN0ZWRQa2dzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiUGFja2FnZXMgbm90IHJlc3RyaWN0ZWQ6ICIgKyBleGNsdWRlZFBrZ3MsIGV4Y2x1ZGVkUGtncy5pc0VtcHR5KCkpOworCisgICAgICAgIExpc3Q8U3RyaW5nPiBhY3R1YWxSZXN0cmljdGVkUGtncyA9IG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmdldE1ldGVyZWREYXRhRGlzYWJsZWRQYWNrYWdlcygKKyAgICAgICAgICAgICAgICBBRE1JTl9SRUNFSVZFUl9DT01QT05FTlQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkFjdHVhbCByZXN0cmljdGVkIHBrZ3M6ICIgKyBhY3R1YWxSZXN0cmljdGVkUGtncywKKyAgICAgICAgICAgICAgICAxLCBhY3R1YWxSZXN0cmljdGVkUGtncy5zaXplKCkpOworICAgICAgICBhc3NlcnRUcnVlKCJBY3R1YWwgcmVzdHJpY3RlZCBwa2dzOiAiICsgYWN0dWFsUmVzdHJpY3RlZFBrZ3MsCisgICAgICAgICAgICAgICAgYWN0dWFsUmVzdHJpY3RlZFBrZ3MuY29udGFpbnMoTUVURVJFRF9EQVRBX0FQUF9QS0cpKTsKKyAgICAgICAgdmVyaWZ5QXBwTmV0d29ya1N0YXRlKHRydWUpOworCisgICAgICAgIHJlc3RyaWN0ZWRQa2dzLmNsZWFyKCk7CisgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnNldE1ldGVyZWREYXRhRGlzYWJsZWRQYWNrYWdlcyhBRE1JTl9SRUNFSVZFUl9DT01QT05FTlQsIHJlc3RyaWN0ZWRQa2dzKTsKKyAgICAgICAgYWN0dWFsUmVzdHJpY3RlZFBrZ3MgPSBtRGV2aWNlUG9saWN5TWFuYWdlci5nZXRNZXRlcmVkRGF0YURpc2FibGVkUGFja2FnZXMoCisgICAgICAgICAgICAgICAgQURNSU5fUkVDRUlWRVJfQ09NUE9ORU5UKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiQWN0dWFsIHJlc3RyaWN0ZWQgcGtnczogIiArIGFjdHVhbFJlc3RyaWN0ZWRQa2dzLAorICAgICAgICAgICAgICAgIGFjdHVhbFJlc3RyaWN0ZWRQa2dzLmlzRW1wdHkoKSk7CisgICAgICAgIHZlcmlmeUFwcE5ldHdvcmtTdGF0ZShmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUFwcE5ldHdvcmtTdGF0ZShib29sZWFuIGJsb2NrZWQpIHsKKyAgICAgICAgZmluYWwgQnVuZGxlIGV4dHJhcyA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgZXh0cmFzLnB1dEJpbmRlcihFWFRSQV9NRVNTRU5HRVIsIG1DYWxsYmFja01lc3Nlbmdlci5nZXRCaW5kZXIoKSk7CisgICAgICAgIG1OZXR3b3JrSW5mb3MuY2xlYXIoKTsKKyAgICAgICAgZmluYWwgSW50ZW50IGxhdW5jaEludGVudCA9IG5ldyBJbnRlbnQoKQorICAgICAgICAgICAgICAgIC5zZXRDbGFzc05hbWUoTUVURVJFRF9EQVRBX0FQUF9QS0csIE1FVEVSRURfREFUQV9BUFBfTUFJTl9BQ1RJVklUWSkKKyAgICAgICAgICAgICAgICAucHV0RXh0cmFzKGV4dHJhcykKKyAgICAgICAgICAgICAgICAuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOworICAgICAgICBtQ29udGV4dC5zdGFydEFjdGl2aXR5KGxhdW5jaEludGVudCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIE5ldHdvcmtJbmZvIG5ldHdvcmtJbmZvID0gbU5ldHdvcmtJbmZvcy5wb2xsKFdBSVRfRk9SX05FVFdPUktfSU5GT19USU1FT1VUX1NFQywKKyAgICAgICAgICAgICAgICAgICAgVGltZVVuaXQuU0VDT05EUyk7CisgICAgICAgICAgICBpZiAobmV0d29ya0luZm8gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZhaWwoIlRpbWVkIG91dCB3YWl0aW5nIGZvciB0aGUgbmV0d29yayBpbmZvIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBleHBlY3RlZFN0YXRlID0gKGJsb2NrZWQgPyBTdGF0ZS5ESVNDT05ORUNURUQgOiBTdGF0ZS5DT05ORUNURUQpLm5hbWUoKTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBleHBlY3RlZERldGFpbGVkU3RhdGUKKyAgICAgICAgICAgICAgICAgICAgPSAoYmxvY2tlZCA/IERldGFpbGVkU3RhdGUuQkxPQ0tFRCA6IERldGFpbGVkU3RhdGUuQ09OTkVDVEVEKS5uYW1lKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIldyb25nIHN0YXRlOiAiICsgbmV0d29ya0luZm8sCisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkU3RhdGUsIG5ldHdvcmtJbmZvLmdldFN0YXRlKCkubmFtZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiV3JvbmcgZGV0YWlsZWQgc3RhdGU6ICIgKyBuZXR3b3JrSW5mbywKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWREZXRhaWxlZFN0YXRlLCBuZXR3b3JrSW5mby5nZXREZXRhaWxlZFN0YXRlKCkubmFtZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiV2FpdGluZyBmb3IgbmV0d29ya2luZm8gZ290IGludGVycnVwdGVkOiAiICsgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIENhbGxiYWNrSGFuZGxlciBleHRlbmRzIEhhbmRsZXIgeworICAgICAgICBwdWJsaWMgQ2FsbGJhY2tIYW5kbGVyKCkgeworICAgICAgICAgICAgc3VwZXIoTG9vcGVyLmdldE1haW5Mb29wZXIoKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgaWYgKG1zZy53aGF0ID09IE1TR19OT1RJRllfTkVUV09SS19TVEFURSkgeworICAgICAgICAgICAgICAgIGZpbmFsIE5ldHdvcmtJbmZvIG5ldHdvcmtJbmZvID0gKE5ldHdvcmtJbmZvKSBtc2cub2JqOworICAgICAgICAgICAgICAgIGlmICghbU5ldHdvcmtJbmZvcy5vZmZlcihuZXR3b3JrSW5mbykpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3Igd2hpbGUgYWRkaW5nIG5ldHdvcmtpbmZvIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJVbmtub3duIG1zZyB0eXBlOiAiICsgbXNnLndoYXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldE1ldGVyZWROZXR3b3JrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIE5ldHdvcmtJbmZvIG5ldHdvcmtJbmZvID0gbUNtLmdldEFjdGl2ZU5ldHdvcmtJbmZvKCk7CisgICAgICAgIGlmIChuZXR3b3JrSW5mbyA9PSBudWxsKSB7CisgICAgICAgICAgICBmYWlsKCJBY3RpdmUgbmV0d29yayBpcyBub3QgYXZhaWxhYmxlIik7CisgICAgICAgIH0gZWxzZSBpZiAobUNtLmlzQWN0aXZlTmV0d29ya01ldGVyZWQoKSkgeworICAgICAgICAgICAgTG9nLmkoVEFHLCAiQWN0aXZlIG5ldHdvcmsgYWxyZWFkeSBtZXRlcmVkOiAiICsgbmV0d29ya0luZm8pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKG5ldHdvcmtJbmZvLmdldFR5cGUoKSAhPSBDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfV0lGSSkgeworICAgICAgICAgICAgZmFpbCgiQWN0aXZlIG5ldHdvcmsgZG9lc24ndCBzdXBwb3J0IHNldHRpbmcgbWV0ZXJlZCBzdGF0dXM6ICIgKyBuZXR3b3JrSW5mbyk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgU3RyaW5nIG5ldElkID0gc2V0V2lmaU1ldGVyZWRTdGF0dXModHJ1ZSk7CisKKyAgICAgICAgLy8gU2V0IGZsYWcgc28gc3RhdHVzIGlzIHJldmVydGVkIG9uIHJlc2V0TWV0ZXJlZE5ldHdvcmsoKTsKKyAgICAgICAgbU1ldGVyZWRXaWZpID0gbmV0SWQ7CisgICAgICAgIC8vIFNhbml0eSBjaGVjay4KKyAgICAgICAgYXNzZXJ0V2lmaU1ldGVyZWRTdGF0dXMobmV0SWQsIHRydWUpOworICAgICAgICBhc3NlcnRBY3RpdmVOZXR3b3JrTWV0ZXJlZCh0cnVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVzZXRNZXRlcmVkTmV0d29yaygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAobU1ldGVyZWRXaWZpICE9IG51bGwpIHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgIlJlc2V0dGluZyBtZXRlcmVkIHN0YXR1cyBmb3IgbmV0SWQ9IiArIG1NZXRlcmVkV2lmaSk7CisgICAgICAgICAgICBzZXRXaWZpTWV0ZXJlZFN0YXR1cyhtTWV0ZXJlZFdpZmksIGZhbHNlKTsKKyAgICAgICAgICAgIGFzc2VydFdpZmlNZXRlcmVkU3RhdHVzKG1NZXRlcmVkV2lmaSwgZmFsc2UpOworICAgICAgICAgICAgYXNzZXJ0QWN0aXZlTmV0d29ya01ldGVyZWQoZmFsc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgc2V0V2lmaU1ldGVyZWRTdGF0dXMoYm9vbGVhbiBtZXRlcmVkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHNzaWQgPSBtV20uZ2V0Q29ubmVjdGlvbkluZm8oKS5nZXRTU0lEKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoIm51bGwgU1NJRCIsIHNzaWQpOworICAgICAgICBmaW5hbCBTdHJpbmcgbmV0SWQgPSBzc2lkLnRyaW0oKS5yZXBsYWNlQWxsKCJcIiIsICIiKTsgLy8gcmVtb3ZlIHF1b3RlcywgaWYgYW55LgorICAgICAgICBhc3NlcnRGYWxzZSgiZW1wdHkgU1NJRCIsIHNzaWQuaXNFbXB0eSgpKTsKKyAgICAgICAgc2V0V2lmaU1ldGVyZWRTdGF0dXMobmV0SWQsIG1ldGVyZWQpOworICAgICAgICByZXR1cm4gbmV0SWQ7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldFdpZmlNZXRlcmVkU3RhdHVzKFN0cmluZyBuZXRJZCwgYm9vbGVhbiBtZXRlcmVkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTG9nLmkoVEFHLCAiU2V0dGluZyB3aS1maSBuZXR3b3JrICIgKyBuZXRJZCArICIgbWV0ZXJlZCBzdGF0dXMgdG8gIiArIG1ldGVyZWQpOworICAgICAgICBleGVjdXRlQ21kKCJjbWQgbmV0cG9saWN5IHNldCBtZXRlcmVkLW5ldHdvcmsgIiArIG5ldElkICsgIiAiICsgbWV0ZXJlZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFdpZmlNZXRlcmVkU3RhdHVzKFN0cmluZyBuZXRJZCwgYm9vbGVhbiBtZXRlcmVkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGNtZCA9ICJjbWQgbmV0cG9saWN5IGxpc3Qgd2lmaS1uZXR3b3JrcyI7CisgICAgICAgIGZpbmFsIFN0cmluZyBleHBlY3RlZFJlc3VsdCA9IG5ldElkICsgIjsiICsgbWV0ZXJlZDsKKyAgICAgICAgU3RyaW5nIGNtZFJlc3VsdCA9IG51bGw7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1RSSUVTX01FVEVSRURfU1RBVFVTX0NIRUNLOyArK2kpIHsKKyAgICAgICAgICAgIGNtZFJlc3VsdCA9IGV4ZWN1dGVDbWQoY21kKTsKKyAgICAgICAgICAgIGlmIChjbWRSZXN1bHQuY29udGFpbnMoZXhwZWN0ZWRSZXN1bHQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3lzdGVtQ2xvY2suc2xlZXAoSU5URVJWQUxfTUVURVJFRF9TVEFUVVNfQ0hFQ0tfTVMpOworICAgICAgICB9CisgICAgICAgIGZhaWwoIlRpbWVkIG91dCB3YWl0aW5nIGZvciB3aWZpIG1ldGVyZWQgc3RhdHVzIHRvIGNoYW5nZS4gZXhwZWN0ZWQ9IiArIGV4cGVjdGVkUmVzdWx0CisgICAgICAgICAgICAgICAgKyAiLCBhY3R1YWwgc3RhdHVzPSIgKyBjbWRSZXN1bHQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRBY3RpdmVOZXR3b3JrTWV0ZXJlZChib29sZWFuIG1ldGVyZWQpIHsKKyAgICAgICAgYm9vbGVhbiBhY3R1YWxNZXRlcmVkU3RhdHVzID0gIW1ldGVyZWQ7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1RSSUVTX01FVEVSRURfU1RBVFVTX0NIRUNLOyArK2kpIHsKKyAgICAgICAgICAgIGFjdHVhbE1ldGVyZWRTdGF0dXMgPSBtQ20uaXNBY3RpdmVOZXR3b3JrTWV0ZXJlZCgpOworICAgICAgICAgICAgaWYgKGFjdHVhbE1ldGVyZWRTdGF0dXMgPT0gbWV0ZXJlZCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN5c3RlbUNsb2NrLnNsZWVwKElOVEVSVkFMX01FVEVSRURfU1RBVFVTX0NIRUNLX01TKTsKKyAgICAgICAgfQorICAgICAgICBmYWlsKCJUaW1lZCBvdXQgd2FpdGluZyBmb3IgYWN0aXZlIG5ldHdvcmsgbWV0ZXJlZCBzdGF0dXMgdG8gY2hhbmdlLiBleHBlY3RlZD0iCisgICAgICAgICAgICAgICAgKyBtZXRlcmVkICsgIjsgYWN0dWFsPSIgKyBhY3R1YWxNZXRlcmVkU3RhdHVzCisgICAgICAgICAgICAgICAgKyAiOyBuZXR3b3JrSW5mbz0iICsgbUNtLmdldEFjdGl2ZU5ldHdvcmsoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZXhlY3V0ZUNtZChTdHJpbmcgY21kKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdCA9IFN5c3RlbVV0aWwucnVuU2hlbGxDb21tYW5kKGdldEluc3RydW1lbnRhdGlvbigpLCBjbWQpOworICAgICAgICBMb2cuaShUQUcsICJDbWQgJyIgKyBjbWQgKyAiJyByZXN1bHQ6ICIgKyByZXN1bHQpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBbmRQcm9maWxlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2VhbmRwcm9maWxlb3duZXIvUGVybWlzc2lvbnNUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQW5kUHJvZmlsZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlYW5kcHJvZmlsZW93bmVyL1Blcm1pc3Npb25zVGVzdC5qYXZhCmluZGV4IDZjNzA2ZWUuLjcwYTVkMDkgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBbmRQcm9maWxlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2VhbmRwcm9maWxlb3duZXIvUGVybWlzc2lvbnNUZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFuZFByb2ZpbGVPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZWFuZHByb2ZpbGVvd25lci9QZXJtaXNzaW9uc1Rlc3QuamF2YQpAQCAtMjIsNyArMjIsNiBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Vc2VyTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC51aWF1dG9tYXRvci5CeTsKIGltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC51aWF1dG9tYXRvci5CeVNlbGVjdG9yOwogaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLlVpRGV2aWNlOwpAQCAtNDcsNiArNDYsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSU1QTEVfUFJFX01fQVBQX1BBQ0tBR0VfTkFNRSA9CiAgICAgICAgICAgICAiY29tLmFuZHJvaWQuY3RzLmxhdW5jaGVyYXBwcy5zaW1wbGVwcmVtYXBwIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSTUlTU0lPTl9OQU1FID0gImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX0NPTlRBQ1RTIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVWRUxPUE1FTlRfUEVSTUlTU0lPTiA9ICJhbmRyb2lkLnBlcm1pc3Npb24uSU5URVJBQ1RfQUNST1NTX1VTRVJTIjsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJNSVNTSU9OU19BQ1RJVklUWV9OQU1FCiAgICAgICAgICAgICA9IFBFUk1JU1NJT05fQVBQX1BBQ0tBR0VfTkFNRSArICIuUGVybWlzc2lvbkFjdGl2aXR5IjsKQEAgLTIyNyw2ICsyMjcsMTUgQEAKICAgICAgICAgYXNzZXJ0U2V0UGVybWlzc2lvbkdyYW50U3RhdGVQcmVNQXBwKERldmljZVBvbGljeU1hbmFnZXIuUEVSTUlTU0lPTl9HUkFOVF9TVEFURV9HUkFOVEVEKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGVybWlzc2lvbkdyYW50U3RhdGVfZGV2ZWxvcG1lbnRQZXJtaXNzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEZhaWxlZFRvU2V0RGV2ZWxvcG1lbnRQZXJtaXNzaW9uR3JhbnRTdGF0ZSgKKyAgICAgICAgICAgICAgICBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBFUk1JU1NJT05fR1JBTlRfU1RBVEVfREVOSUVEKTsKKyAgICAgICAgYXNzZXJ0RmFpbGVkVG9TZXREZXZlbG9wbWVudFBlcm1pc3Npb25HcmFudFN0YXRlKAorICAgICAgICAgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIuUEVSTUlTU0lPTl9HUkFOVF9TVEFURV9ERUZBVUxUKTsKKyAgICAgICAgYXNzZXJ0RmFpbGVkVG9TZXREZXZlbG9wbWVudFBlcm1pc3Npb25HcmFudFN0YXRlKAorICAgICAgICAgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIuUEVSTUlTU0lPTl9HUkFOVF9TVEFURV9HUkFOVEVEKTsKKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgYXNzZXJ0UGVybWlzc2lvblJlcXVlc3QoaW50IGV4cGVjdGVkKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0UGVybWlzc2lvblJlcXVlc3QoZXhwZWN0ZWQsIG51bGwpOwogICAgIH0KQEAgLTI3NCw2ICsyODMsMTggQEAKICAgICAgICAgICAgICAgICB2YWx1ZSk7CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydEZhaWxlZFRvU2V0RGV2ZWxvcG1lbnRQZXJtaXNzaW9uR3JhbnRTdGF0ZShpbnQgdmFsdWUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRGYWxzZShtRGV2aWNlUG9saWN5TWFuYWdlci5zZXRQZXJtaXNzaW9uR3JhbnRTdGF0ZShBRE1JTl9SRUNFSVZFUl9DT01QT05FTlQsCisgICAgICAgICAgICAgICAgUEVSTUlTU0lPTl9BUFBfUEFDS0FHRV9OQU1FLCBERVZFTE9QTUVOVF9QRVJNSVNTSU9OLCB2YWx1ZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMobURldmljZVBvbGljeU1hbmFnZXIuZ2V0UGVybWlzc2lvbkdyYW50U3RhdGUoQURNSU5fUkVDRUlWRVJfQ09NUE9ORU5ULAorICAgICAgICAgICAgICAgIFBFUk1JU1NJT05fQVBQX1BBQ0tBR0VfTkFNRSwgREVWRUxPUE1FTlRfUEVSTUlTU0lPTiksCisgICAgICAgICAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlci5QRVJNSVNTSU9OX0dSQU5UX1NUQVRFX0RFRkFVTFQpOworICAgICAgICBhc3NlcnRFcXVhbHMobVBhY2thZ2VNYW5hZ2VyLmNoZWNrUGVybWlzc2lvbihERVZFTE9QTUVOVF9QRVJNSVNTSU9OLAorICAgICAgICAgICAgICAgIFBFUk1JU1NJT05fQVBQX1BBQ0tBR0VfTkFNRSksCisgICAgICAgICAgICAgICAgUGFja2FnZU1hbmFnZXIuUEVSTUlTU0lPTl9ERU5JRUQpOworICAgIH0KKworCiAgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFNldFBlcm1pc3Npb25HcmFudFN0YXRlUHJlTUFwcChpbnQgdmFsdWUpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBhc3NlcnRGYWxzZShtRGV2aWNlUG9saWN5TWFuYWdlci5zZXRQZXJtaXNzaW9uR3JhbnRTdGF0ZShBRE1JTl9SRUNFSVZFUl9DT01QT05FTlQsCiAgICAgICAgICAgICAgICAgU0lNUExFX1BSRV9NX0FQUF9QQUNLQUdFX05BTUUsIFBFUk1JU1NJT05fTkFNRSwKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBbmRQcm9maWxlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2VhbmRwcm9maWxlb3duZXIvUHJpbnRBY3Rpdml0eS5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFuZFByb2ZpbGVPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZWFuZHByb2ZpbGVvd25lci9QcmludEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhmYWRmZQotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBbmRQcm9maWxlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2VhbmRwcm9maWxlb3duZXIvUHJpbnRBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5kZXZpY2VhbmRwcm9maWxlb3duZXI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKKy8qKgorICogV3JhcHBlciBjbGFzcyB1c2VkIHRvIGNhbGwgdGhlIGFjdGl2aXR5IGluIHRoZSBub24tdGVzdCBBUEsgYW5kIHdhaXQgZm9yIGl0cyByZXN1bHQuCisgKi8KK3B1YmxpYyBjbGFzcyBQcmludEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU5USU5HX1BBQ0tBR0UgPSAiY29tLmFuZHJvaWQuY3RzLmRldmljZXBvbGljeS5wcmludGluZ2FwcCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU5UX0FDVElWSVRZID0gUFJJTlRJTkdfUEFDS0FHRSArICIuUHJpbnRBY3Rpdml0eSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0VSUk9SX01FU1NBR0UgPSAiZXJyb3JfbWVzc2FnZSI7CisKKyAgICBwcml2YXRlIGZpbmFsIENvdW50RG93bkxhdGNoIG1MYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICBwcml2YXRlIFN0cmluZyBtRXJyb3JNZXNzYWdlOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzdGFydEFjdGl2aXR5Rm9yUmVzdWx0KAorICAgICAgICAgICAgICAgIG5ldyBJbnRlbnQoKS5zZXRDb21wb25lbnQobmV3IENvbXBvbmVudE5hbWUoUFJJTlRJTkdfUEFDS0FHRSwgUFJJTlRfQUNUSVZJVFkpKSwgMCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25BY3Rpdml0eVJlc3VsdChpbnQgcmVxdWVzdENvZGUsIGludCByZXN1bHRDb2RlLCBJbnRlbnQgZGF0YSkgeworICAgICAgICAvLyBVc2UgUkVTVUxUX0ZJUlNUX1VTRVIgZm9yIHN1Y2Nlc3MgdG8gYXZvaWQgZmFsc2UgcG9zaXRpdmVzLgorICAgICAgICBpZiAocmVzdWx0Q29kZSAhPSBSRVNVTFRfRklSU1RfVVNFUikgeworICAgICAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1FcnJvck1lc3NhZ2UgPSBkYXRhLmdldFN0cmluZ0V4dHJhKEVYVFJBX0VSUk9SX01FU1NBR0UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1FcnJvck1lc3NhZ2UgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1FcnJvck1lc3NhZ2UgPSAiVW5rbm93biBlcnJvciwgcmVzdWx0Q29kZTogIiArIHJlc3VsdENvZGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUxhdGNoLmNvdW50RG93bigpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBjYWxsZWQgPSBtTGF0Y2guYXdhaXQoNCwgVGltZVVuaXQuU0VDT05EUyk7CisgICAgICAgIGlmICghY2FsbGVkKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJQcmludEFjdGl2aXR5IGRpZG4ndCBmaW5pc2ggaW4gdGltZSIpOworICAgICAgICB9CisgICAgICAgIGZpbmlzaCgpOworICAgICAgICByZXR1cm4gbUVycm9yTWVzc2FnZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQW5kUHJvZmlsZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlYW5kcHJvZmlsZW93bmVyL1ByaW50aW5nUG9saWN5VGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFuZFByb2ZpbGVPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZWFuZHByb2ZpbGVvd25lci9QcmludGluZ1BvbGljeVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWY2Mzc2Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFuZFByb2ZpbGVPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZWFuZHByb2ZpbGVvd25lci9QcmludGluZ1BvbGljeVRlc3QuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5jdHMuZGV2aWNlYW5kcHJvZmlsZW93bmVyOworCitpbXBvcnQgYW5kcm9pZC5hcHAuYWRtaW4uRGV2aWNlUG9saWN5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlVzZXJNYW5hZ2VyOworCisvKioKKyAqIFZhbGlkYXRlcyB0aGF0IERldmljZSBPd25lciBvciBQcm9maWxlIE93bmVyIGNhbiBkaXNhYmxlIHByaW50aW5nLgorICovCitwdWJsaWMgY2xhc3MgUHJpbnRpbmdQb2xpY3lUZXN0IGV4dGVuZHMgQmFzZURldmljZUFkbWluVGVzdCB7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJpbnRpbmdQb2xpY3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuYWRkVXNlclJlc3RyaWN0aW9uKEFETUlOX1JFQ0VJVkVSX0NPTVBPTkVOVCwKKyAgICAgICAgICAgICAgICBVc2VyTWFuYWdlci5ESVNBTExPV19QUklOVElORyk7CisgICAgICAgIGZpbmFsIFByaW50QWN0aXZpdHkgYWN0aXZpdHkgPSBsYXVuY2hBY3Rpdml0eSgiY29tLmFuZHJvaWQuY3RzLmRldmljZWFuZHByb2ZpbGVvd25lciIsCisgICAgICAgICAgICAgICAgUHJpbnRBY3Rpdml0eS5jbGFzcywgbnVsbCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBhY3Rpdml0eS5nZXRFcnJvck1lc3NhZ2UoKTsKKyAgICAgICAgYXNzZXJ0TnVsbChlcnJvck1lc3NhZ2UpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBbmRQcm9maWxlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2VhbmRwcm9maWxlb3duZXIvUmVzZXRQYXNzd29yZFdpdGhUb2tlblRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBbmRQcm9maWxlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2VhbmRwcm9maWxlb3duZXIvUmVzZXRQYXNzd29yZFdpdGhUb2tlblRlc3QuamF2YQppbmRleCA5M2VhNzA5Li42Y2FiNjU4IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQW5kUHJvZmlsZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlYW5kcHJvZmlsZW93bmVyL1Jlc2V0UGFzc3dvcmRXaXRoVG9rZW5UZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFuZFByb2ZpbGVPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZWFuZHByb2ZpbGVvd25lci9SZXNldFBhc3N3b3JkV2l0aFRva2VuVGVzdC5qYXZhCkBAIC0xNyw3ICsxNyw4IEBACiAKIGltcG9ydCBhbmRyb2lkLmFwcC5LZXlndWFyZE1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5hcHAuYWRtaW4uRGV2aWNlUG9saWN5TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CiAKIHB1YmxpYyBjbGFzcyBSZXNldFBhc3N3b3JkV2l0aFRva2VuVGVzdCBleHRlbmRzIEJhc2VEZXZpY2VBZG1pblRlc3QgewogCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQW5kUHJvZmlsZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlYW5kcHJvZmlsZW93bmVyL1NjcmVlbkNhcHR1cmVEaXNhYmxlZFRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBbmRQcm9maWxlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2VhbmRwcm9maWxlb3duZXIvU2NyZWVuQ2FwdHVyZURpc2FibGVkVGVzdC5qYXZhCmluZGV4IGU1NTZiZDkuLmUxYTc0MGEgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBbmRQcm9maWxlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2VhbmRwcm9maWxlb3duZXIvU2NyZWVuQ2FwdHVyZURpc2FibGVkVGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBbmRQcm9maWxlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2VhbmRwcm9maWxlb3duZXIvU2NyZWVuQ2FwdHVyZURpc2FibGVkVGVzdC5qYXZhCkBAIC0xNiw3ICsxNiw3IEBACiBwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5kZXZpY2VhbmRwcm9maWxlb3duZXI7CiAKIGltcG9ydCBhbmRyb2lkLmFwcC5hZG1pbi5EZXZpY2VQb2xpY3lNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5jb250ZW50LkxvY2FsQnJvYWRjYXN0TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkeC5sb2NhbGJyb2FkY2FzdG1hbmFnZXIuY29udGVudC5Mb2NhbEJyb2FkY2FzdE1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogLyoqCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQW5kUHJvZmlsZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlYW5kcHJvZmlsZW93bmVyL1NldFN5c3RlbVNldHRpbmdUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQW5kUHJvZmlsZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlYW5kcHJvZmlsZW93bmVyL1NldFN5c3RlbVNldHRpbmdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAzMGUzNQotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBbmRQcm9maWxlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2VhbmRwcm9maWxlb3duZXIvU2V0U3lzdGVtU2V0dGluZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuY3RzLmRldmljZWFuZHByb2ZpbGVvd25lcjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLmFkbWluLkRldmljZVBvbGljeU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Vc2VySGFuZGxlOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5TeXN0ZW0uU0NSRUVOX0JSSUdIVE5FU1NfTU9ERV9BVVRPTUFUSUM7CisvKioKKyAqIFRlc3Qge0BsaW5rIERldmljZVBvbGljeU1hbmFnZXIjc2V0U3lzdGVtU2V0dGluZ30uCisgKi8KK3B1YmxpYyBjbGFzcyBTZXRTeXN0ZW1TZXR0aW5nVGVzdCBleHRlbmRzIEJhc2VEZXZpY2VBZG1pblRlc3QgeworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0JSSUdIVE5FU1NfMSA9ICIyMDAiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9CUklHSFRORVNTXzIgPSAiMTAwIjsKKworICBwcml2YXRlIHZvaWQgdGVzdFNldEJyaWdodG5lc3NXaXRoVmFsdWUoU3RyaW5nIHRlc3RCcmlnaHRuZXNzKSB7CisgICAgbURldmljZVBvbGljeU1hbmFnZXIuc2V0U3lzdGVtU2V0dGluZyhBRE1JTl9SRUNFSVZFUl9DT01QT05FTlQsCisgICAgICAgIFNldHRpbmdzLlN5c3RlbS5TQ1JFRU5fQlJJR0hUTkVTUywgdGVzdEJyaWdodG5lc3MpOworICAgIGFzc2VydEVxdWFscyh0ZXN0QnJpZ2h0bmVzcywgU2V0dGluZ3MuU3lzdGVtLmdldFN0cmluZ0ZvclVzZXIoCisgICAgICAgIG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLCBTZXR0aW5ncy5TeXN0ZW0uU0NSRUVOX0JSSUdIVE5FU1MsCisgICAgICAgIFVzZXJIYW5kbGUubXlVc2VySWQoKSkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFNldEJyaWdodG5lc3MoKSB7CisgICAgZmluYWwgaW50IG1vZGUgPSBTZXR0aW5ncy5TeXN0ZW0uZ2V0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICBTZXR0aW5ncy5TeXN0ZW0uU0NSRUVOX0JSSUdIVE5FU1NfTU9ERSwgU0NSRUVOX0JSSUdIVE5FU1NfTU9ERV9BVVRPTUFUSUMpOworICAgIGlmKG1vZGUgPT0gU0NSRUVOX0JSSUdIVE5FU1NfTU9ERV9BVVRPTUFUSUMpIHsKKworICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5zZXRTeXN0ZW1TZXR0aW5nKEFETUlOX1JFQ0VJVkVSX0NPTVBPTkVOVCwKKyAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0uU0NSRUVOX0JSSUdIVE5FU1NfTU9ERSwgIjAiKTsKKworICAgICAgICB0ZXN0U2V0QnJpZ2h0bmVzc1dpdGhWYWx1ZShURVNUX0JSSUdIVE5FU1NfMSk7CisgICAgICAgIHRlc3RTZXRCcmlnaHRuZXNzV2l0aFZhbHVlKFRFU1RfQlJJR0hUTkVTU18yKTsKKyAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuc2V0U3lzdGVtU2V0dGluZyhBRE1JTl9SRUNFSVZFUl9DT01QT05FTlQsCisgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0uU0NSRUVOX0JSSUdIVE5FU1NfTU9ERSwKKyAgICAgICAgICAgICAgbW9kZSA9PSBTQ1JFRU5fQlJJR0hUTkVTU19NT0RFX0FVVE9NQVRJQz8gIjEiIDogIjAiKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgdGVzdFNldEJyaWdodG5lc3NXaXRoVmFsdWUoVEVTVF9CUklHSFRORVNTXzEpOworICAgICAgIHRlc3RTZXRCcmlnaHRuZXNzV2l0aFZhbHVlKFRFU1RfQlJJR0hUTkVTU18yKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0U2V0U3lzdGVtU2V0dGluZ3NGYWlsc0Zvck5vbldoaXRlbGlzdGVkU2V0dGluZ3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuc2V0U3lzdGVtU2V0dGluZyhBRE1JTl9SRUNFSVZFUl9DT01QT05FTlQsCisgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLlRFWFRfQVVUT19SRVBMQUNFLCAiMCIpOworICAgICAgZmFpbCgiRGlkbid0IHRocm93IHNlY3VyaXR5IGV4Y2VwdGlvbi4iKTsKKyAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBTaG91bGQgdGhyb3cgU2VjdXJpdHlFeGNlcHRpb24uCisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQW5kUHJvZmlsZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlYW5kcHJvZmlsZW93bmVyL1RydXN0QWdlbnRJbmZvVGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFuZFByb2ZpbGVPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZWFuZHByb2ZpbGVvd25lci9UcnVzdEFnZW50SW5mb1Rlc3QuamF2YQppbmRleCAxYzY4MDRmLi4yNDFhODMwIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQW5kUHJvZmlsZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlYW5kcHJvZmlsZW93bmVyL1RydXN0QWdlbnRJbmZvVGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBbmRQcm9maWxlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2VhbmRwcm9maWxlb3duZXIvVHJ1c3RBZ2VudEluZm9UZXN0LmphdmEKQEAgLTIwLDggKzIwLDYgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKIGltcG9ydCBhbmRyb2lkLm9zLlBlcnNpc3RhYmxlQnVuZGxlOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DZGRUZXN0OwotCiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIApAQCAtNDksNyArNDcsNiBAQAogICAgICAgICBzdXBlci50ZWFyRG93bigpOwogICAgIH0KIAotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI5LjExLjEvQy0xLTIiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRBbmRHZXRUcnVzdEFnZW50Q29uZmlndXJhdGlvbigpIHsKICAgICAgICAgLy8gU2V0IHRoZSBjb25maWcKICAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuc2V0VHJ1c3RBZ2VudENvbmZpZ3VyYXRpb24oQURNSU5fUkVDRUlWRVJfQ09NUE9ORU5ULApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFuZFByb2ZpbGVPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZWFuZHByb2ZpbGVvd25lci91c2VycmVzdHJpY3Rpb25zL0Jhc2VVc2VyUmVzdHJpY3Rpb25zVGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFuZFByb2ZpbGVPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZWFuZHByb2ZpbGVvd25lci91c2VycmVzdHJpY3Rpb25zL0Jhc2VVc2VyUmVzdHJpY3Rpb25zVGVzdC5qYXZhCmluZGV4IDM5MjM1YjAuLjAzNjFmZDggMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBbmRQcm9maWxlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2VhbmRwcm9maWxlb3duZXIvdXNlcnJlc3RyaWN0aW9ucy9CYXNlVXNlclJlc3RyaWN0aW9uc1Rlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQW5kUHJvZmlsZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlYW5kcHJvZmlsZW93bmVyL3VzZXJyZXN0cmljdGlvbnMvQmFzZVVzZXJSZXN0cmljdGlvbnNUZXN0LmphdmEKQEAgLTYwLDYgKzYwLDcgQEAKICAgICAgICAgICAgIFVzZXJNYW5hZ2VyLkRJU0FMTE9XX1NNUywKICAgICAgICAgICAgIFVzZXJNYW5hZ2VyLkRJU0FMTE9XX0ZVTiwKICAgICAgICAgICAgIFVzZXJNYW5hZ2VyLkRJU0FMTE9XX0NSRUFURV9XSU5ET1dTLAorICAgICAgICAgICAgVXNlck1hbmFnZXIuRElTQUxMT1dfU1lTVEVNX0VSUk9SX0RJQUxPR1MsCiAgICAgICAgICAgICBVc2VyTWFuYWdlci5ESVNBTExPV19DUk9TU19QUk9GSUxFX0NPUFlfUEFTVEUsCiAgICAgICAgICAgICBVc2VyTWFuYWdlci5ESVNBTExPV19PVVRHT0lOR19CRUFNLAogICAgICAgICAgICAgVXNlck1hbmFnZXIuRElTQUxMT1dfU0FGRV9CT09ULApAQCAtOTEsNyArOTIsOCBAQAogCiAgICAgICAgICAgICAvLyBQTyBjYW4gc2V0IHRoZW0gdG9vLCBidXQgd2hlbiBETyBzZXRzIHRoZW0sIHRoZXkncmUgZ2xvYmFsLgogICAgICAgICAgICAgVXNlck1hbmFnZXIuRElTQUxMT1dfQURKVVNUX1ZPTFVNRSwKLSAgICAgICAgICAgIFVzZXJNYW5hZ2VyLkRJU0FMTE9XX1VOTVVURV9NSUNST1BIT05FCisgICAgICAgICAgICBVc2VyTWFuYWdlci5ESVNBTExPV19VTk1VVEVfTUlDUk9QSE9ORSwKKyAgICAgICAgICAgIFVzZXJNYW5hZ2VyLkRJU0FMTE9XX1NZU1RFTV9FUlJPUl9ESUFMT0dTCiAgICAgfTsKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gSElEREVOX0FORF9QUk9ISUJJVEVEID0gbmV3IFN0cmluZ1tdIHsKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBbmRQcm9maWxlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2VhbmRwcm9maWxlb3duZXIvdXNlcnJlc3RyaWN0aW9ucy9EZXZpY2VPd25lclVzZXJSZXN0cmljdGlvbnNUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQW5kUHJvZmlsZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlYW5kcHJvZmlsZW93bmVyL3VzZXJyZXN0cmljdGlvbnMvRGV2aWNlT3duZXJVc2VyUmVzdHJpY3Rpb25zVGVzdC5qYXZhCmluZGV4IGIyMTgzNDEuLjk3NDM4NDAgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBbmRQcm9maWxlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2VhbmRwcm9maWxlb3duZXIvdXNlcnJlc3RyaWN0aW9ucy9EZXZpY2VPd25lclVzZXJSZXN0cmljdGlvbnNUZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFuZFByb2ZpbGVPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZWFuZHByb2ZpbGVvd25lci91c2VycmVzdHJpY3Rpb25zL0RldmljZU93bmVyVXNlclJlc3RyaWN0aW9uc1Rlc3QuamF2YQpAQCAtNDgsNiArNDgsNyBAQAogICAgICAgICAgICAgVXNlck1hbmFnZXIuRElTQUxMT1dfU01TLAogICAgICAgICAgICAgVXNlck1hbmFnZXIuRElTQUxMT1dfRlVOLAogICAgICAgICAgICAgVXNlck1hbmFnZXIuRElTQUxMT1dfQ1JFQVRFX1dJTkRPV1MsCisgICAgICAgICAgICBVc2VyTWFuYWdlci5ESVNBTExPV19TWVNURU1fRVJST1JfRElBTE9HUywKICAgICAgICAgICAgIFVzZXJNYW5hZ2VyLkRJU0FMTE9XX0NST1NTX1BST0ZJTEVfQ09QWV9QQVNURSwKICAgICAgICAgICAgIFVzZXJNYW5hZ2VyLkRJU0FMTE9XX09VVEdPSU5HX0JFQU0sCiAgICAgICAgICAgICBVc2VyTWFuYWdlci5ESVNBTExPV19TQUZFX0JPT1QsCkBAIC01NSw3ICs1Niw4IEBACiAgICAgICAgICAgICAvLyBVc2VyTWFuYWdlci5ESVNBTExPV19EQVRBX1JPQU1JTkcsIC8vIEhhcyB1bnJlY292ZXJhYmxlIHNpZGUgZWZmZWN0cy4KICAgICAgICAgICAgIFVzZXJNYW5hZ2VyLkRJU0FMTE9XX1NFVF9VU0VSX0lDT04sCiAgICAgICAgICAgICBVc2VyTWFuYWdlci5ESVNBTExPV19CTFVFVE9PVEgsCi0gICAgICAgICAgICBVc2VyTWFuYWdlci5ESVNBTExPV19BVVRPRklMTAorICAgICAgICAgICAgVXNlck1hbmFnZXIuRElTQUxMT1dfQVVUT0ZJTEwsCisgICAgICAgICAgICBVc2VyTWFuYWdlci5ESVNBTExPV19VTklGSUVEX1BBU1NXT1JELAogICAgIH07CiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERJU0FMTE9XRUQgPSBuZXcgU3RyaW5nW10gewpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFuZFByb2ZpbGVPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZWFuZHByb2ZpbGVvd25lci91c2VycmVzdHJpY3Rpb25zL1NlY29uZGFyeVByb2ZpbGVPd25lclVzZXJSZXN0cmljdGlvbnNUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQW5kUHJvZmlsZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlYW5kcHJvZmlsZW93bmVyL3VzZXJyZXN0cmljdGlvbnMvU2Vjb25kYXJ5UHJvZmlsZU93bmVyVXNlclJlc3RyaWN0aW9uc1Rlc3QuamF2YQppbmRleCA1YzdmMjQzLi4yYTlkYjE1IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQW5kUHJvZmlsZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlYW5kcHJvZmlsZW93bmVyL3VzZXJyZXN0cmljdGlvbnMvU2Vjb25kYXJ5UHJvZmlsZU93bmVyVXNlclJlc3RyaWN0aW9uc1Rlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQW5kUHJvZmlsZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlYW5kcHJvZmlsZW93bmVyL3VzZXJyZXN0cmljdGlvbnMvU2Vjb25kYXJ5UHJvZmlsZU93bmVyVXNlclJlc3RyaWN0aW9uc1Rlc3QuamF2YQpAQCAtMzgsMTEgKzM4LDEzIEBACiAgICAgICAgICAgICBVc2VyTWFuYWdlci5ESVNBTExPV19VTk1VVEVfTUlDUk9QSE9ORSwKICAgICAgICAgICAgIFVzZXJNYW5hZ2VyLkRJU0FMTE9XX0FESlVTVF9WT0xVTUUsCiAgICAgICAgICAgICBVc2VyTWFuYWdlci5ESVNBTExPV19PVVRHT0lOR19DQUxMUywKKyAgICAgICAgICAgIFVzZXJNYW5hZ2VyLkRJU0FMTE9XX1NZU1RFTV9FUlJPUl9ESUFMT0dTLAogICAgICAgICAgICAgVXNlck1hbmFnZXIuRElTQUxMT1dfQ1JPU1NfUFJPRklMRV9DT1BZX1BBU1RFLAogICAgICAgICAgICAgVXNlck1hbmFnZXIuRElTQUxMT1dfT1VUR09JTkdfQkVBTSwKICAgICAgICAgICAgIFVzZXJNYW5hZ2VyLkFMTE9XX1BBUkVOVF9QUk9GSUxFX0FQUF9MSU5LSU5HLAogICAgICAgICAgICAgVXNlck1hbmFnZXIuRElTQUxMT1dfU0VUX1VTRVJfSUNPTiwKLSAgICAgICAgICAgIFVzZXJNYW5hZ2VyLkRJU0FMTE9XX0FVVE9GSUxMCisgICAgICAgICAgICBVc2VyTWFuYWdlci5ESVNBTExPV19BVVRPRklMTCwKKyAgICAgICAgICAgIFVzZXJNYW5hZ2VyLkRJU0FMTE9XX1VOSUZJRURfUEFTU1dPUkQsCiAgICAgfTsKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gRElTQUxMT1dFRCA9IG5ldyBTdHJpbmdbXSB7CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQW5kUHJvZmlsZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlYW5kcHJvZmlsZW93bmVyL3Zwbi9WcG5UZXN0SGVscGVyLmphdmEgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlQW5kUHJvZmlsZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlYW5kcHJvZmlsZW93bmVyL3Zwbi9WcG5UZXN0SGVscGVyLmphdmEKaW5kZXggNmFlZmY3Yi4uOGMwMTg4NCAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZUFuZFByb2ZpbGVPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZWFuZHByb2ZpbGVvd25lci92cG4vVnBuVGVzdEhlbHBlci5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VBbmRQcm9maWxlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2VhbmRwcm9maWxlb3duZXIvdnBuL1ZwblRlc3RIZWxwZXIuamF2YQpAQCAtMjgsOCArMjgsMTEgQEAKIAogaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5UYXJnZXRBcGk7CiBpbXBvcnQgYW5kcm9pZC5hcHAuYWRtaW4uRGV2aWNlUG9saWN5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5Db25uZWN0aXZpdHlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcms7CkBAIC01OSw2ICs2Miw4IEBACiBAVGFyZ2V0QXBpKFZFUlNJT05fQ09ERVMuTikKIHB1YmxpYyBjbGFzcyBWcG5UZXN0SGVscGVyIHsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWUE5fUEFDS0FHRSA9ICJjb20uYW5kcm9pZC5jdHMudnBuZmlyZXdhbGwiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNWV9QQUNLQUdFID0gImNvbS5hbmRyb2lkLmN0cy5kZXZpY2VhbmRwcm9maWxlb3duZXIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fVlBOX0lTX1VQID0gVlBOX1BBQ0tBR0UgKyAiLlZQTl9JU19VUCI7CiAKICAgICAvLyBJUCBhZGRyZXNzIHJlc2VydmVkIGZvciBkb2N1bWVudGF0aW9uIGJ5IHJmYzU3MzcKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0FERFJFU1MgPSAiMTkyLjAuMi40IjsKQEAgLTk0LDE0ICs5OSwxNiBAQAogCiAgICAgICAgIENvbm5lY3Rpdml0eU1hbmFnZXIgY20gPSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29ubmVjdGl2aXR5TWFuYWdlci5jbGFzcyk7CiAgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIHZwbkxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOwotICAgICAgICBmaW5hbCBDb25uZWN0aXZpdHlNYW5hZ2VyLk5ldHdvcmtDYWxsYmFjayBjYWxsYmFjayA9Ci0gICAgICAgICAgICAgICAgbmV3IENvbm5lY3Rpdml0eU1hbmFnZXIuTmV0d29ya0NhbGxiYWNrKCkgewotICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25BdmFpbGFibGUoTmV0d29yayBuZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZwbkxhdGNoLmNvdW50RG93bigpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfTsKLSAgICAgICAgY20ucmVnaXN0ZXJOZXR3b3JrQ2FsbGJhY2soVlBOX05FVFdPUktfUkVRVUVTVCwgY2FsbGJhY2spOworICAgICAgICBmaW5hbCBJbnRlbnRGaWx0ZXIgaW50ZW50RmlsdGVyID0gbmV3IEludGVudEZpbHRlcihBQ1RJT05fVlBOX0lTX1VQKTsKKyAgICAgICAgZmluYWwgQnJvYWRjYXN0UmVjZWl2ZXIgcmVjZWl2ZXIgPSBuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKGZpbmFsIENvbnRleHQgY29udGV4dCwgZmluYWwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWludGVudC5nZXRQYWNrYWdlKCkuZXF1YWxzKE1ZX1BBQ0tBR0UpKSByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIHZwbkxhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnVucmVnaXN0ZXJSZWNlaXZlcih0aGlzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICBjb250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIocmVjZWl2ZXIsIGludGVudEZpbHRlcik7CiAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGlmIChwYWNrYWdlTmFtZSAhPSBudWxsKSB7CkBAIC0xMTYsOCArMTIzLDYgQEAKICAgICAgICAgICAgIFRocmVhZC5zbGVlcChORVRXT1JLX1NFVFRMRV9HUkFDRV9NUyk7CiAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIHwgUGFja2FnZU1hbmFnZXIuTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIGZhaWwoIkZhaWxlZCB3aGlsZSB3YWl0aW5nIGZvciBWUE46ICIgKyBlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGNtLnVucmVnaXN0ZXJOZXR3b3JrQ2FsbGJhY2soY2FsbGJhY2spOwogICAgICAgICB9CiAKICAgICAgICAgLy8gRG8gd2UgaGF2ZSBhIG5ldHdvcms/CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlT3duZXIvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VPd25lci9BbmRyb2lkLm1rCmluZGV4IDRjYzA0MWEuLjk2MDc1NTcgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VPd25lci9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VPd25lci9BbmRyb2lkLm1rCkBAIC0xNywyNSArMTcsMzYgQEAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzRGV2aWNlT3duZXJBcHAKK0xPQ0FMX1BSSVZBVEVfUExBVEZPUk1fQVBJUyA6PSB0cnVlCiAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCiAKIExPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCiAKLUxPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykgXAorICAgICAgICAgICAgICAgICAgICQoY2FsbCBhbGwtSWFpZGwtZmlsZXMtdW5kZXIsIHNyYykKIAotTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lciBjb25zY3J5cHQgY3RzLWp1bml0CitMT0NBTF9BSURMX0lOQ0xVREVTIDo9ICQoTE9DQUxfUEFUSCkvc3JjCisKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IFwKKyAgICBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzIFwKKyAgICBjdHMtanVuaXQgXAorICAgIGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzIFwKKyAgICBib3VuY3ljYXN0bGUKKworTE9DQUxfVVNFX0FBUFQyIDo9IHRydWUKIAogTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKLSAgICBjdHN0ZXN0cnVubmVyIFwKLSAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsIFwKLSAgICBhbmRyb2lkLXN1cHBvcnQtdjQgXAotICAgIGFuZHJvaWQtc3VwcG9ydC10ZXN0IFwKLSAgICBsZWdhY3ktYW5kcm9pZC10ZXN0CisgICAgY3RzdGVzdHJ1bm5lci1heHQgXAorICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0IFwKKyAgICBhbmRyb2lkeC50ZXN0LnJ1bGVzIFwKKyAgICBjdHMtc2VjdXJpdHktdGVzdC1zdXBwb3J0LWxpYnJhcnkgXAorICAgIHRlc3RuZwogCi1MT0NBTF9TREtfVkVSU0lPTiA6PSB0ZXN0X2N1cnJlbnQKK0xPQ0FMX1NUQVRJQ19BTkRST0lEX0xJQlJBUklFUyA6PSBcCisgICAgYW5kcm9pZHgubGVnYWN5X2xlZ2FjeS1zdXBwb3J0LXY0CiAKICMgdGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGFyY3RzIGN0cyB2dHMgZ2VuZXJhbC10ZXN0cwogCiBpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlT3duZXIvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VPd25lci9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDlhMDkwMDcuLmU0NjFlOGUgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VPd25lci9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VPd25lci9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0zMSwxMSArMzEsMTIgQEAKICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkRJU0FCTEVfS0VZR1VBUkQiIC8+CiAKICAgICA8YXBwbGljYXRpb24KLSAgICAgICAgYW5kcm9pZDp0ZXN0T25seT0idHJ1ZSI+CisgICAgICAgIGFuZHJvaWQ6dGVzdE9ubHk9InRydWUiCisgICAgICAgIGFuZHJvaWQ6dXNlc0NsZWFydGV4dFRyYWZmaWM9InRydWUiPj4KIAogICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KICAgICAgICAgPHJlY2VpdmVyCi0gICAgICAgICAgICBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLmN0cy5kZXZpY2Vvd25lci5CYXNlRGV2aWNlT3duZXJUZXN0JEJhc2ljQWRtaW5SZWNlaXZlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuY3RzLmRldmljZW93bmVyLkJhc2ljQWRtaW5SZWNlaXZlciIKICAgICAgICAgICAgIGFuZHJvaWQ6cGVybWlzc2lvbj0iYW5kcm9pZC5wZXJtaXNzaW9uLkJJTkRfREVWSUNFX0FETUlOIj4KICAgICAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFwcC5kZXZpY2VfYWRtaW4iCiAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cmVzb3VyY2U9IkB4bWwvZGV2aWNlX2FkbWluIiAvPgpAQCAtNTIsMTAgKzUzLDIwIEBACiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYXBwLmFjdGlvbi5ERVZJQ0VfQURNSU5fRU5BQkxFRCIgLz4KICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KICAgICAgICAgPC9yZWNlaXZlcj4KKyAgICAgICAgPHJlY2VpdmVyCisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5jdHMuZGV2aWNlb3duZXIuQ3JlYXRlQW5kTWFuYWdlVXNlclRlc3QkU2Vjb25kYXJ5VXNlckFkbWluUmVjZWl2ZXIiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpwZXJtaXNzaW9uPSJhbmRyb2lkLnBlcm1pc3Npb24uQklORF9ERVZJQ0VfQURNSU4iPgorICAgICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYXBwLmRldmljZV9hZG1pbiIKKyAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpyZXNvdXJjZT0iQHhtbC9kZXZpY2VfYWRtaW4iIC8+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hcHAuYWN0aW9uLkRFVklDRV9BRE1JTl9FTkFCTEVEIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L3JlY2VpdmVyPgogCi0gICAgICAgIDxhY3Rpdml0eQotICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5jdHMuZGV2aWNlb3duZXIuS2V5TWFuYWdlbWVudEFjdGl2aXR5IgotICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuVHJhbnNsdWNlbnQuTm9UaXRsZUJhciIgLz4KKyAgICAgICAgPHNlcnZpY2UgYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5jdHMuZGV2aWNlb3duZXIuQ3JlYXRlQW5kTWFuYWdlVXNlclRlc3QkUHJpbWFyeVVzZXJTZXJ2aWNlIgorICAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIgorICAgICAgICAgICAgICAgICBhbmRyb2lkOnBlcm1pc3Npb249ImFuZHJvaWQucGVybWlzc2lvbi5CSU5EX0RFVklDRV9BRE1JTiI+CisgICAgICAgIDwvc2VydmljZT4KIAogICAgICAgICA8YWN0aXZpdHkKICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuY3RzLmRldmljZW93bmVyLkxvY2tUYXNrVXRpbGl0eUFjdGl2aXR5IiAvPgpAQCAtNzAsMTQgKzgxLDYgQEAKICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KICAgICAgICAgPC9hY3Rpdml0eT4KIAotICAgICAgICA8IS0tIHdlIG5lZWQgdG8gZ2l2ZSBhIGRpZmZlcmVudCB0YXNrQWZmaW5pdHkgc28gdGhhdCB3aGVuIHdlIHVzZQotICAgICAgICAgICAgIEZMQUdfQUNUSVZJVFlfTkVXX1RBU0ssIHRoZSBzeXN0ZW0gdHJpZXMgdG8gc3RhcnQgaXQgaW4gYSBkaWZmZXJlbnQgdGFzawotICAgICAgICAtLT4KLSAgICAgICAgPGFjdGl2aXR5Ci0gICAgICAgICAgICBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLmN0cy5kZXZpY2Vvd25lci5Mb2NrVGFza1Rlc3QkSW50ZW50UmVjZWl2aW5nQWN0aXZpdHkiCi0gICAgICAgICAgICBhbmRyb2lkOnRhc2tBZmZpbml0eT0iY29tLmFuZHJvaWQuY3RzLmRldmljZW93bmVyLkxvY2tUYXNrVGVzdC5JbnRlbnRSZWNlaXZpbmdBY3Rpdml0eSIKLSAgICAgICAgICAgIC8+Ci0KICAgICAgICAgPGFjdGl2aXR5CiAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9Ii5TZXRQb2xpY3lBY3Rpdml0eSIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF1bmNoTW9kZT0ic2luZ2xlVG9wIj4KQEAgLTkxLDcgKzk0LDcgQEAKIAogICAgIDwvYXBwbGljYXRpb24+CiAKLSAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5jdHMuZGV2aWNlb3duZXIiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJEZXZpY2UgT3duZXIgQ1RTIHRlc3RzIj4KICAgICAgICAgPG1ldGEtZGF0YQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZU93bmVyL2Fzc2V0cy9nZW5lcmF0ZS1jbGllbnQtY2VydC1jaGFpbi5zaCBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VPd25lci9hc3NldHMvZ2VuZXJhdGUtY2xpZW50LWNlcnQtY2hhaW4uc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhiMDYzOWYuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZU93bmVyL2Fzc2V0cy9nZW5lcmF0ZS1jbGllbnQtY2VydC1jaGFpbi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLSMhL2Jpbi9iYXNoCi0KLSMKLSMgR2VuZXJhdGVzOgotIyAgLSB1c2VyLWNlcnQtY2hhaW4uY3J0Ci0jICAtIHVzZXItY2VydC1jaGFpbi5rZXkKLSMKLQotc2V0IC1lCi0KLVdPUktESVI9J3RlbXAnCi0KLW1rZGlyICIkV09SS0RJUiIKLWNwIGNhLmNvbmYgIiRXT1JLRElSLyIKLXB1c2hkICIkV09SS0RJUiIKLQotIyMgR2VuZXJhdGUgcm9vdCBDQQotbWtkaXIgLXAgcm9vdGNhL3tjZXJ0cyxjcmwsbmV3Y2VydHMscHJpdmF0ZX0KLXB1c2hkIHJvb3RjYQotdG91Y2ggaW5kZXgudHh0Ci1lY2hvICcxMDAwJyA+IHNlcmlhbAotb3BlbnNzbCByZXEgXAotICAgIC1jb25maWcgLi4vY2EuY29uZiBcCi0gICAgLW5ldyBcCi0gICAgLXg1MDkgXAotICAgIC1kYXlzIDczMDAgXAotICAgIC1zaGEyNTYgXAotICAgIC1leHRlbnNpb25zIHYzX2NhIFwKLSAgICAta2V5b3V0IHByaXZhdGUvY2Eua2V5LnBlbSBcCi0gICAgLW91dCBjZXJ0cy9jYS5jZXJ0LnBlbQotcG9wZAotCi0jIyBHZW5lcmF0ZSBJbnRlcm1lZGlhdGUgQ0EKLW1rZGlyIGludGVybWVkaWF0ZSBpbnRlcm1lZGlhdGUve2NlcnRzLGNybCxjc3IsbmV3Y2VydHMscHJpdmF0ZX0KLXRvdWNoIGludGVybWVkaWF0ZS9pbmRleC50eHQKLQotZWNobyAnMTAwMCcgPiBpbnRlcm1lZGlhdGUvc2VyaWFsCi1lY2hvICcxMDAwJyA+IGludGVybWVkaWF0ZS9jcmxudW1iZXIKLQotb3BlbnNzbCByZXEgXAotICAgIC1jb25maWcgY2EuY29uZiBcCi0gICAgLW5ldyBcCi0gICAgLXNoYTI1NiBcCi0gICAgLWtleW91dCBpbnRlcm1lZGlhdGUvcHJpdmF0ZS9pbnRlcm1lZGlhdGUua2V5LnBlbSBcCi0gICAgLW91dCBpbnRlcm1lZGlhdGUvY3NyL2ludGVybWVkaWF0ZS5jc3IucGVtCi0KLW9wZW5zc2wgY2EgXAotICAgIC1jb25maWcgY2EuY29uZiBcCi0gICAgLW5hbWUgUm9vdENBIFwKLSAgICAtZXh0ZW5zaW9ucyB2M19pbnRlcm1lZGlhdGVfY2EgXAotICAgIC1kYXlzIDM2NTAgXAotICAgIC1ub3RleHQgXAotICAgIC1tZCBzaGEyNTYgXAotICAgIC1pbiBpbnRlcm1lZGlhdGUvY3NyL2ludGVybWVkaWF0ZS5jc3IucGVtIFwKLSAgICAtb3V0IGludGVybWVkaWF0ZS9jZXJ0cy9pbnRlcm1lZGlhdGUuY2VydC5wZW0KLQotIyMgR2VuZXJhdGUgY2xpZW50IGNlcnQKLW9wZW5zc2wgcmVxIFwKLSAgICAtY29uZmlnIGNhLmNvbmYgXAotICAgIC1uZXdrZXkgcnNhOjEwMjQgXAotICAgIC1rZXlvdXQgdXNlci5rZXkucGVtIFwKLSAgICAtbm9kZXMgXAotICAgIC1kYXlzIDM2NTAgXAotICAgIC1vdXQgdXNlci5jc3IucGVtCi0KLW9wZW5zc2wgY2EgXAotICAgIC1jb25maWcgY2EuY29uZiBcCi0gICAgLW5hbWUgSW50ZXJtZWRpYXRlQ0EgXAotICAgIC1leHRlbnNpb25zIHVzcl9jZXJ0IFwKLSAgICAtZGF5cyAzNjUgXAotICAgIC1ub3RleHQgXAotICAgIC1tZCBzaGEyNTYgXAotICAgIC1pbiB1c2VyLmNzci5wZW0gXAotICAgIC1vdXQgdXNlci5jZXJ0LnBlbQotCi1wb3BkICMgV09SS0RJUgotCi0jIyBDb252ZXJ0IGNsaWVudCBjZXJ0IHRvIGFjY2VwdGFibGUgZm9ybQotY2F0IFwKLSAgICAiJFdPUktESVIiL3VzZXIuY2VydC5wZW0gXAotICAgICIkV09SS0RJUiIvaW50ZXJtZWRpYXRlL2NlcnRzL2ludGVybWVkaWF0ZS5jZXJ0LnBlbSBcCi0gICAgIiRXT1JLRElSIi9yb290Y2EvY2VydHMvY2EuY2VydC5wZW0gXAotICAgID4gdXNlci1jZXJ0LWNoYWluLmNydAotCi1vcGVuc3NsIHBrY3M4IFwKLSAgICAtdG9wazggXAotICAgIC1ub2NyeXB0IFwKLSAgICAtaW5mb3JtIFBFTSBcCi0gICAgLW91dGZvcm0gREVSIFwKLSAgICAtaW4gIiRXT1JLRElSIi91c2VyLmtleS5wZW0gXAotICAgIC1vdXQgdXNlci1jZXJ0LWNoYWluLmtleQotCi1ybSAtciAiJFdPUktESVIiClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZU93bmVyL2Fzc2V0cy91c2VyLWNlcnQtY2hhaW4uY3J0IGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZU93bmVyL2Fzc2V0cy91c2VyLWNlcnQtY2hhaW4uY3J0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmE4NmUzLi4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VPd25lci9hc3NldHMvdXNlci1jZXJ0LWNoYWluLmNydAorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQotTUlJRkx6Q0NBeGVnQXdJQkFnSUNFQUV3RFFZSktvWklodmNOQVFFTEJRQXdaREVMTUFrR0ExVUVCaE1DUjBJeAotRURBT0JnTlZCQWdNQjBWdVoyeGhibVF4RWpBUUJnTlZCQW9NQ1VkdmIyZHNaU0JWU3pFTU1Bb0dBMVVFQ3d3RAotUVdaM01TRXdId1lEVlFRRERCaEJabGNnVkdWemRDQkpiblJsY20xbFpHbGhkR1VnUTBFd0hoY05NVFl3TXpFNAotTVRjeE16QTRXaGNOTVRjd016STRNVGN4TXpBNFdqQ0JpREVMTUFrR0ExVUVCaE1DUjBJeEVEQU9CZ05WQkFnTQotQjBWdVoyeGhibVF4RWpBUUJnTlZCQW9NQ1VkdmIyZHNaU0JWU3pFTU1Bb0dBMVVFQ3d3RFFXWjNNU1V3SXdZRAotVlFRRERCeFZjMlZ5TURBZ2RXNWtaWElnYVc1MFpYSnRaV1JwWVhSbElFTkJNUjR3SEFZSktvWklodmNOQVFrQgotRmc5MFpYTjBRR2R2YjJkc1pTNWpiMjB3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQgotQVFDOFcrUFVlTlZESXk2R1NlVFZqTjlKU2tZeGNzdXBGcTlBT1VtYTBSKzd6OUVHdVpCVVJacHJnYnJON2MycQotUlFubFNCWlRDOWZSTWtYWjZMSW1Xb1k1R3FTM05jYmtKYlVsQStVZUsydUpYUVFmalRPN2JZRHNsdnVkWCs4eQotV2ZZclI3MURMcElGZ0RreFFBV0d5d016TlRSNlRFbVB5MXFCR0lGWW9oR3Faa1FvVFMvL3MvaUVFS0RTc2JQcgotbWtUcmY0bERBYzhjZ25tVVBGUGtOMUxyNElUa3ZobUVIUWpKVGNTK1FqZW90bHQrc3M1dnJtbHFvcEZrQ2JJOQotN3VDNlJRREkwUHZQOWFjaHpCc1RVaTB2TnNHZzQ1bHVDSmhOckR1NnM0TnBudXNLSVZBb0pQU0pkaW9uMnlvRAotM0RwOExYL3VlR05iUDY0TFk2cW1EV0RsQWdNQkFBR2pnY1V3Z2NJd0NRWURWUjBUQkFJd0FEQVJCZ2xnaGtnQgotaHZoQ0FRRUVCQU1DQmFBd013WUpZSVpJQVliNFFnRU5CQ1lXSkU5d1pXNVRVMHdnUjJWdVpYSmhkR1ZrSUVOcwotYVdWdWRDQkRaWEowYVdacFkyRjBaVEFkQmdOVkhRNEVGZ1FVU3A3a1MxT24zYjdNZE1zdERWUENOa0htL0VVdwotSHdZRFZSMGpCQmd3Rm9BVWRlakQ2RmIzWDhaSE9DS01XZTVYd3VreEJEc3dEZ1lEVlIwUEFRSC9CQVFEQWdYZwotTUIwR0ExVWRKUVFXTUJRR0NDc0dBUVVGQndNQ0JnZ3JCZ0VGQlFjREJEQU5CZ2txaGtpRzl3MEJBUXNGQUFPQwotQWdFQVhJT1ZoTWp4YnBPMXV4ZTFNbnlJc1RybDBhalBsa24rNHFXTHdqWHpVUTZUY0UyT3c5MUFNY1lzNXNpcQotVUJwbFp5TllOQk9oWDhUWkxOeTdqSi9SRXdqNjVRYS95MFRjRHVjcEdodFQ5bDFKSUpDZEVwUG95bXlpTTE4QwotTmt0WER5YXcrREZrV0MwYTVvVWhqazRVdXpUZkhrU1ZNS2paVW5SUFBpd0wyZ2w5ekVnUzhxVkkzZXc0SmpkUAotS0NZR3kvMUIrNjFFRTV2Q1A4R0FCeWVLZ3Rnbmg0c1ZabnNLWVFaemp3d1VHTDF1WFF0YXpQczA0cVRVdzNJSwotWXZvT3lOc1hCNGdjcDJ1NERYdjJyb1ZJMzZEUU01WkdlblM5TVZpVGVibGc1dmtaZ3k4eHNrdEh5REdEbE5lNgotY1B3NU9neXhEbzRucjZUWTRTWDllYW5rYW50UE14NzQ5OG4zOTBCNGxZQWdCajRDejRRYVhNMUlHTjNKVkY1SgotRUVLcUdrTHBPWU1STlo0cVBGaE1rbkRaZ0hsampnRmxjWEd3dFh0dWdDelE1bGR3a0ZiOXFaZUI1bFFuMUF3MAotUHRoY0RkR3AvS0N0SEM1akYrQmpsUUlUdDB0VnFKNCtTQWRIeUY1M0grU2NvSU5GdWw4OW0zMnBndkpqSS8wawotYzB0aWR2WE5QTm9kYkpDcUhtYzkxN0RyeVZKR1hieHArQnF4VFEwYTdlOUsvV0E0TW5SS1BmQlRUZURxL2ordwotNkIvckxkMGJoTXJQRGk2YS8xdzk3UHFmQWJTOVRsa3BuSzhHajRwTitaT0VFRjBqMER0RFJiYitDZkpYMTRmUgotMlI5Nm1FZkNlU2JDdXhMY2J3ZEcxT1VRTThHS2xJY1lmV0lwMEtqSUN4UkthRFU9Ci0tLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCi0tLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KLU1JSUZvakNDQTRxZ0F3SUJBZ0lDRUFBd0RRWUpLb1pJaHZjTkFRRUxCUUF3WERFTE1Ba0dBMVVFQmhNQ1IwSXgKLUVEQU9CZ05WQkFnTUIwVnVaMnhoYm1ReEVqQVFCZ05WQkFvTUNVZHZiMmRzWlNCVlN6RU1NQW9HQTFVRUN3d0QKLVFXWlhNUmt3RndZRFZRUUREQkJCWm5jZ1ZHVnpkQ0JTYjI5MElFTkJNQjRYRFRFMk1ETXhPREUzTURRMU4xb1gKLURUSTJNRE14TmpFM01EUTFOMW93WkRFTE1Ba0dBMVVFQmhNQ1IwSXhFREFPQmdOVkJBZ01CMFZ1WjJ4aGJtUXgKLUVqQVFCZ05WQkFvTUNVZHZiMmRzWlNCVlN6RU1NQW9HQTFVRUN3d0RRV1ozTVNFd0h3WURWUVFEREJoQlpsY2cKLVZHVnpkQ0JKYm5SbGNtMWxaR2xoZEdVZ1EwRXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUsKLUFvSUNBUUNaYlljaHkyRnJ5OW5KdXUyWUVwMlAxM2xJYnlXdTBGWEY4cVR1czhWcC8yNUx5WERqQmlEWFpVbFkKLVBMMzJQWTBQUmJCUWptN3RtL1dOcVh3OFM3Z3crNVhYcFkrWE5DZC95Z3lJWmhNZHhQbTducVlzRXRaREZWaUwKLWN0L1FKTkFLSUxGZWpaUU9mUlNleXhlSU5wckwrRWpGSGVjQTZLdHJ1WlVMekpFMHUwVUdUZ3M1aDlIYnFoSDcKLUxiWjhpaUUvVGZHNmtmbFVJMmtBUHhHaVJwSXllcllvVmpwM1RhNTAyNlQrYW9jNlZ5Tm5TWWlaVUxnWUxvTDgKLVA4eDE5RzNQcGxxZjRVNWJVeUt0UnRuUFdPdk05aVlwaHhzVnVUYzhyUnBaR2NNS2hkTDRnR0xRcGRydUlaNDMKLWd2R01xNEt0MnhWSkV4Qk9LTWczajN4NTJqMVh0T2NhZC9uejduY2FrLzZFbFRkMGdmaEZndDlQd0FmUVozMmIKLUJMM1psY2IrN1B2dHYxNHhBV05IeTVjTXluN1VEeklzeS95cVdMdkpTZmtaVmlVMHZQdW9rWE1LWkl5enY3M1YKLTROOXFYUUFXWE56NEh3Z1d5MzVyQjFzaXJnTXhMZFdDcEhyVmVoL0R6U3JXWi9NdEpJQzlBYzFqVEF1STZGMXUKLWI3ZFJSdWpXcGNyNTdSZUtEWFhKek04M0pRbkVOSlEzZ0FIclk4cVRrR3o3TkxhN0RzeXpQZEtPQzd2WjArRWQKLVZNdm4rYzJBTVdyd2tScG45SmxVNWJkMkJON0Q2VVdHTFRkelNOOVFIN243c1htUU5Bby9NN0xyOWJheEtaTlkKLWFVNURPUlZqbkd2SVRaREhZaXc5T3Vha1daVVpBVEYrVFRJbktFYXNGMTMxcjlxOVp3SURBUUFCbzJZd1pEQWQKLUJnTlZIUTRFRmdRVWRlakQ2RmIzWDhaSE9DS01XZTVYd3VreEJEc3dId1lEVlIwakJCZ3dGb0FVVjRFSEhPaTAKLUFxUUlqNElNalBFRlczZlZTOFF3RWdZRFZSMFRBUUgvQkFnd0JnRUIvd0lCQURBT0JnTlZIUThCQWY4RUJBTUMKLUFZWXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnSUJBQ3MwcVMzRVh5bW8xVmdCSW5SOUdyenZVcTFnQy9kM29oU0cKLWlCM3gyemZxZlE0RDBlaVlBRGNDZFhUUEl3UHRtOFA4d29LNVFzUlYvTUNrbHF5dmdWcFJIRlFlMXVPQVpKN1gKLVVkNmh4OUNDeWUwUWtFb3krSkRlVmRQZUZGZjFiOFMvZGF4TFhVVmJDS1NUQSt6OFlMUFJTRUZpMmQzY093cHgKLVdQbGtmTFN3UDZEZk9EaWNtUE5kMVYvcUIvZmV2bG1mUkI2VUtxdVQrdjl4V3lRcXU0YWE2RjZ4R1dZV21jKzEKLUUvTUIvb0VPaXpKVnY4VlZFVHFNazgveEZQck1rMjhmb0k4b2hyTGtzdFN4OGdIK29JSTFVZDFrMVhvTU1xcVUKLUdlNjU2VHI4NURpNVdmYWNNZEtVb21tT0VLUVlSaWljNmlrY05FQVZWTk9IbE90dzA4dWE3ZzFrMUcvZHdjajAKLURDRjJXbVd6ZEFNd1NUMEFIL1JQYStpOWNYOGYveVMxNU9VUDduY1NhSTcvQ2hHVDNFQnpQK2JxeGVYRk9DTkgKLTB5TkxrNHROTEl6TnduS1hHVGZTYktNVFlPWjNuZ0FpUjR3M3JvL0xKaGUyejAzTU9hd3hvaUlvc1RjOVV3S0EKLVlKM25ZSFl3OC9FSkNLUHRoNnlyVVUzZ1UxVjB2eWFCeTM0eTR4dWhhM29XbmJjNTN2bTFjdjRCSU53bXVBbXMKLUFTUXBxQ2lHcDJaYWFsTnU4N3hDbldFM0hBNFMzKzBVM2RzRkpYZFBkUXQvY0R6WCtrRHpvaldlSG1FQ3A2bW4KLUdvZG1tUGJFQnF6RGNrTWFNOUN2U0FwOE55WnVPOGhyT1NvR1RkeFF0UDF3M3dhT2VNNHpMWWQ3YUJZVWZlZkwKLTM2T296aUVOCi0tLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCi0tLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KLU1JSUZuakNDQTRhZ0F3SUJBZ0lKQU5MZFgxemN4VVNVTUEwR0NTcUdTSWIzRFFFQkN3VUFNRnd4Q3pBSkJnTlYKLUJBWVRBa2RDTVJBd0RnWURWUVFJREFkRmJtZHNZVzVrTVJJd0VBWURWUVFLREFsSGIyOW5iR1VnVlVzeEREQUsKLUJnTlZCQXNNQTBGbVZ6RVpNQmNHQTFVRUF3d1FRV1ozSUZSbGMzUWdVbTl2ZENCRFFUQWVGdzB4TmpBek1UZ3gKLU56QXhNREJhRncwek5qQXpNVE14TnpBeE1EQmFNRnd4Q3pBSkJnTlZCQVlUQWtkQ01SQXdEZ1lEVlFRSURBZEYKLWJtZHNZVzVrTVJJd0VBWURWUVFLREFsSGIyOW5iR1VnVlVzeEREQUtCZ05WQkFzTUEwRm1WekVaTUJjR0ExVUUKLUF3d1FRV1ozSUZSbGMzUWdVbTl2ZENCRFFUQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0MKLWdnSUJBTkZ5T0QvQklHVjRpSFNHRHJwMWFqdnArMDAwOThkbitwMWNxbE1ITXJXVWpucXpjTWRPVm1lcVNhUS8KLUVrT2xBSXNkY2wxeWIrb28zRGhvbUl6WC9CMmxUUVNPU0xEbXRoSWdtdTBoZmsvZ0FpcUxkQTgvTDJGOW02NE4KLTl4NCs3MnhzY04zTXh6dmpLR1VCZ1BEbVJmUjlUcDM0N2o0MkhVQ2ptRjVzVGE3RHpHTXJVN0kzZ0NtaTdCM0QKLXpia2dkVHdwdWNIMkpEcUhRUHYrN1BMYU55dVpORW1pWE03NkRQeU15cHhNcnRHcnEvRkRWSjdKd0YrY1N3YlkKLVdWZnpibU9mSEc3ZzZoUnc3QmFwL05OamNkdFAwOWhSUEcvZzJXRHk0ejBBeThNVFpWZTk1RUhUc3llUitrcHYKLTBmNjBlVUkwY1Y3RW92YkxtcDEwSTNSZHN4YldUamJlRm1Oak03V21tbXNGUnpBMWpNbEZHaWwvcG80bUp2TUYKLUJjcWJpNGtVaFE0OUY0dFJVbEhSRzFiL3VwNzF0RHV6VG9GMFltTjlHSGtmL2t0Ny9ub1ZUWWRFc200UndhZUYKLW1ob2FUTUZhTmFIR1RIU3lxcm9xYkJDcWxrZlRxQjFDcXcxd2VHcVY2YkdmYVlwQ0pHeDV2WG1yMDZtaDVkd28KLXp2cHlIUUtDUXU5NmEwRzgxVDUyNlJ0VmVBNFFSODlFTGEwSlNCcFdSOU1xVlpLQnRlOUFnUzV2bEYwMzg2dU0KLXZjS0Mzeko0c3J2MVlyVE9tTWtMa3ROSkhzeWZMUWdiNzBSZEhSMzhoREV3S2FxNlZEV2lld0tEaHNXQUk1U0oKLXdSZ2pBWXNwc05VVmFoRFd2cFhxL2JSR00zSlRXK1F4aVIyMnZnRWl0dktlSXlzTEFnTUJBQUdqWXpCaE1CMEcKLUExVWREZ1FXQkJSWGdRY2M2TFFDcEFpUGdneU04UVZiZDlWTHhEQWZCZ05WSFNNRUdEQVdnQlJYZ1FjYzZMUUMKLXBBaVBnZ3lNOFFWYmQ5Vkx4REFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQmhqQU4KLUJna3Foa2lHOXcwQkFRc0ZBQU9DQWdFQWpvL0ZqN2lUT3IxL25UdlpwZWFvbjAveFk0RCtIZjgzRlcvNHlBU1oKLUV0MElUYTUxMHpJaThySVZ2bGFSMXhkYlhMWXhIZ2R0bTR2UXRLWlN0d09CZHdqKzRWWnJiOVdnd1F5QkNZVTUKLVJxSzM4N29NVWVaZGZzaDltMm5xTThidVlsczNtbGR2MzRYVWc4eTFveXR4NkdEZEM3Tkt6NlBMTnBJVmtqNUYKLWFCbnlmaDQzRnNYSGt6QXkwbmZrZEUybXFmaFE0Q0Q5WmttOWZKY1gwaW5FbWNzcE01RzhiYTE2dUVTWkRxVVMKLW9KYzFiZ050VzY0Zkw3cE90VmZIRElKcUtmL0cvaUlxMWxrMzNndjUvNHo2WjhlN2ZZVm0xSmFiVVVkOXJaNnQKLWNqWFhGcWtBN1NrY1hUczgyOS9nYVhRUXYyRkFSdDdnNzBVeEptTk4wTUNLZlluS000ZEtkZGk5MzRtVFdyT0kKLWVMZTB1M09BYTF3WmFIZ2dKSlhnUnhNeC9hY1duR2ZlcnNUcHNBQjFYRzc0WFRTWEhWN3pISG5OV1hqUStndTAKLU40UkFrUUZNWVdxcDZLb0hnUXJkUWZMUGNhdzB3YytaTUpqMzV6NTBiNGFiK0J5Z3RoeDNXK3YvTWlNRks5V3YKLS9Bc1FDR3NsRGNHV2JGQ1lQN0l2SERmb3duSUZHZWZNbk9tNDFOS1d1czl6NkhvRVVtZkppaVNTVnhFQ0RULzIKLWZFN00rc1FvdmRybEh4N3J1L2ZPNlBQKzZvY1VFMWFmWTZjSFV6RTBEaHY2eE1jZHZ3TDdDT0dkNVpVMWJxQVEKLVRxYmVQTTVLcGsxeXRraWdkaXh6TUR6L0hGdW0wZmRHZmMvNTlMbCtmNit1SEFYNU5wT0paa0JIQkNXQW9DZVgKLWJzZz0KLS0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VPd25lci9hc3NldHMvdXNlci1jZXJ0LWNoYWluLmtleSBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VPd25lci9hc3NldHMvdXNlci1jZXJ0LWNoYWluLmtleQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJiMzk5ZS4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlT3duZXIvYXNzZXRzL3VzZXItY2VydC1jaGFpbi5rZXkKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlT3duZXIvcmVzL3htbC9kZXZpY2VfYWRtaW4ueG1sIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZU93bmVyL3Jlcy94bWwvZGV2aWNlX2FkbWluLnhtbAppbmRleCBmZTU4ZDM4Li5jOWJlNmEwIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlT3duZXIvcmVzL3htbC9kZXZpY2VfYWRtaW4ueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VPd25lci9yZXMveG1sL2RldmljZV9hZG1pbi54bWwKQEAgLTIsNSArMiwxMCBAQAogICAgIDx1c2VzLXBvbGljaWVzPgogICAgICAgICA8cmVzZXQtcGFzc3dvcmQgLz4KICAgICAgICAgPGxpbWl0LXBhc3N3b3JkIC8+CisgICAgICAgIDxleHBpcmUtcGFzc3dvcmQgLz4KKyAgICAgICAgPHdpcGUtZGF0YSAvPgorICAgICAgICA8d2F0Y2gtbG9naW4gLz4KKyAgICAgICAgPGRpc2FibGUta2V5Z3VhcmQtZmVhdHVyZXMgLz4KKyAgICAgICAgPGZvcmNlLWxvY2sgLz4KICAgICA8L3VzZXMtcG9saWNpZXM+CiA8L2RldmljZS1hZG1pbj4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZW93bmVyL0FkbWluQWN0aW9uQm9va2tlZXBpbmdUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vvd25lci9BZG1pbkFjdGlvbkJvb2trZWVwaW5nVGVzdC5qYXZhCmluZGV4IDA2OTRkNzYuLjQyZmI0NDY0IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vvd25lci9BZG1pbkFjdGlvbkJvb2trZWVwaW5nVGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZW93bmVyL0FkbWluQWN0aW9uQm9va2tlZXBpbmdUZXN0LmphdmEKQEAgLTIxLDkgKzIxLDggQEAKIGltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLm9yZy5jb25zY3J5cHQuVHJ1c3RlZENlcnRpZmljYXRlU3RvcmU7Ci0KIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5U3RvcmU7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUZhY3Rvcnk7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CkBAIC0xOTAsMTIgKzE4OSwxMyBAQAogICAgICAgICBmaW5hbCBieXRlW10gcmF3Q2VydCA9IFRFU1RfQ0EuZ2V0Qnl0ZXMoKTsKICAgICAgICAgZmluYWwgQ2VydGlmaWNhdGUgY2VydCA9IENlcnRpZmljYXRlRmFjdG9yeS5nZXRJbnN0YW5jZSgiWC41MDkiKQogICAgICAgICAgICAgICAgIC5nZW5lcmF0ZUNlcnRpZmljYXRlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShyYXdDZXJ0KSk7Ci0gICAgICAgIGZpbmFsIFRydXN0ZWRDZXJ0aWZpY2F0ZVN0b3JlIHN0b3JlID0gbmV3IFRydXN0ZWRDZXJ0aWZpY2F0ZVN0b3JlKCk7CiAKICAgICAgICAgLy8gSW5zdGFsbCBhIENBIGNlcnQuCi0gICAgICAgIGFzc2VydE51bGwoc3RvcmUuZ2V0Q2VydGlmaWNhdGVBbGlhcyhjZXJ0KSk7CisgICAgICAgIEtleVN0b3JlIGtleVN0b3JlID0gS2V5U3RvcmUuZ2V0SW5zdGFuY2UoIkFuZHJvaWRDQVN0b3JlIik7CisgICAgICAgIGtleVN0b3JlLmxvYWQobnVsbCwgbnVsbCk7CisgICAgICAgIGFzc2VydE51bGwoa2V5U3RvcmUuZ2V0Q2VydGlmaWNhdGVBbGlhcyhjZXJ0KSk7CiAgICAgICAgIGFzc2VydFRydWUobURldmljZVBvbGljeU1hbmFnZXIuaW5zdGFsbENhQ2VydChnZXRXaG8oKSwgcmF3Q2VydCkpOwotICAgICAgICBmaW5hbCBTdHJpbmcgYWxpYXMgPSBzdG9yZS5nZXRDZXJ0aWZpY2F0ZUFsaWFzKGNlcnQpOworICAgICAgICBmaW5hbCBTdHJpbmcgYWxpYXMgPSBrZXlTdG9yZS5nZXRDZXJ0aWZpY2F0ZUFsaWFzKGNlcnQpOwogICAgICAgICBhc3NlcnROb3ROdWxsKGFsaWFzKTsKIAogICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgQ0EgY2VydCB3YXMgbWFya2VkIGFzIGluc3RhbGxlZCBieSB0aGUgRGV2aWNlIE93bmVyLgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlb3duZXIvQWZmaWxpYXRpb25UZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vvd25lci9BZmZpbGlhdGlvblRlc3QuamF2YQppbmRleCBhOWI0M2M2Li41N2QyMDBiIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vvd25lci9BZmZpbGlhdGlvblRlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vvd25lci9BZmZpbGlhdGlvblRlc3QuamF2YQpAQCAtMTYsMTEgKzE2LDE5IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuY3RzLmRldmljZW93bmVyOwogCitpbXBvcnQgc3RhdGljIGp1bml0LmZyYW1ld29yay5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIGp1bml0LmZyYW1ld29yay5Bc3NlcnQuZmFpbDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEFycmF5RXF1YWxzOworCiBpbXBvcnQgYW5kcm9pZC5hcHAuYWRtaW4uRGV2aWNlUG9saWN5TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CkBAIC0yOSwxMiArMzcsNiBAQAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogCi1pbXBvcnQgc3RhdGljIGp1bml0LmZyYW1ld29yay5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0LmFzc2VydEZhbHNlOwotaW1wb3J0IHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0LmFzc2VydFRydWU7Ci1pbXBvcnQgc3RhdGljIGp1bml0LmZyYW1ld29yay5Bc3NlcnQuZmFpbDsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRBcnJheUVxdWFsczsKLQogQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKIHB1YmxpYyBjbGFzcyBBZmZpbGlhdGlvblRlc3QgewogCkBAIC00Niw3ICs0OCw3IEBACiAgICAgICAgIENvbnRleHQgY29udGV4dCA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKTsKICAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIgPSAoRGV2aWNlUG9saWN5TWFuYWdlcikKICAgICAgICAgICAgICAgICBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5ERVZJQ0VfUE9MSUNZX1NFUlZJQ0UpOwotICAgICAgICBtQWRtaW5Db21wb25lbnQgPSBCYXNlRGV2aWNlT3duZXJUZXN0LkJhc2ljQWRtaW5SZWNlaXZlci5nZXRDb21wb25lbnROYW1lKGNvbnRleHQpOworICAgICAgICBtQWRtaW5Db21wb25lbnQgPSBCYXNpY0FkbWluUmVjZWl2ZXIuZ2V0Q29tcG9uZW50TmFtZShjb250ZXh0KTsKICAgICB9CiAKICAgICBAVGVzdApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlb3duZXIvQWlycGxhbmVNb2RlUmVzdHJpY3Rpb25UZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vvd25lci9BaXJwbGFuZU1vZGVSZXN0cmljdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zOTNlNjJiCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlb3duZXIvQWlycGxhbmVNb2RlUmVzdHJpY3Rpb25UZXN0LmphdmEKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY3RzLmRldmljZW93bmVyOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuR2xvYmFsLkFJUlBMQU5FX01PREVfT047CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOworaW1wb3J0IGFuZHJvaWQub3MuVXNlck1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlNldHRpbmdOb3RGb3VuZEV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCisvKioKKyAqIFRlc3QgaW50ZXJhY3Rpb24gYmV0d2VlbiB7QGxpbmsgVXNlck1hbmFnZXIjRElTQUxMT1dfQUlSUExBTkVfTU9ERX0gdXNlciByZXN0cmljdGlvbiBhbmQKKyAqIHtAbGluayBTZXR0aW5ncy5HbG9iYWwjQUlSUExBTkVfTU9ERV9PTn0uCisgKi8KK3B1YmxpYyBjbGFzcyBBaXJwbGFuZU1vZGVSZXN0cmljdGlvblRlc3QgZXh0ZW5kcyBCYXNlRGV2aWNlT3duZXJUZXN0IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVElNRU9VVF9TRUMgPSA1OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTTEVFUF9NUyA9IDMwMDA7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5jbGVhclVzZXJSZXN0cmljdGlvbihnZXRXaG8oKSwgVXNlck1hbmFnZXIuRElTQUxMT1dfQUlSUExBTkVfTU9ERSk7CisgICAgICAgIFRocmVhZC5zbGVlcChTTEVFUF9NUyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuY2xlYXJVc2VyUmVzdHJpY3Rpb24oZ2V0V2hvKCksIFVzZXJNYW5hZ2VyLkRJU0FMTE9XX0FJUlBMQU5FX01PREUpOworICAgICAgICBUaHJlYWQuc2xlZXAoU0xFRVBfTVMpOworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBaXJwbGFuZU1vZGVUdXJuZWRPZmZXaGVuUmVzdHJpY3Rpb25TZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgICAgIC8vIFVzaW5nIGFycmF5IHNvIHRoYXQgaXQgY2FuIGJlIG1vZGlmaWVkIGluIGJyb2FkY2FzdCByZWNlaXZlci4KKyAgICAgICAgYm9vbGVhbiB2YWx1ZVtdID0gbmV3IGJvb2xlYW5bMV07CisgICAgICAgIEJyb2FkY2FzdFJlY2VpdmVyIHJlY2VpdmVyID0gbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICAgICAgdmFsdWVbMF0gPSBpbnRlbnQuZ2V0Qm9vbGVhbkV4dHJhKCJzdGF0ZSIsIHRydWUpOworICAgICAgICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBtQ29udGV4dC5yZWdpc3RlclJlY2VpdmVyKHJlY2VpdmVyLCBuZXcgSW50ZW50RmlsdGVyKEludGVudC5BQ1RJT05fQUlSUExBTkVfTU9ERV9DSEFOR0VEKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFNldHRpbmdzLkdsb2JhbC5wdXRJbnQobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksIEFJUlBMQU5FX01PREVfT04sIDEpOworICAgICAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuYWRkVXNlclJlc3RyaWN0aW9uKGdldFdobygpLCBVc2VyTWFuYWdlci5ESVNBTExPV19BSVJQTEFORV9NT0RFKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobGF0Y2guYXdhaXQoVElNRU9VVF9TRUMsIFRpbWVVbml0LlNFQ09ORFMpKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKHZhbHVlWzBdKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBTZXR0aW5ncy5HbG9iYWwuZ2V0SW50KAorICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwgU2V0dGluZ3MuR2xvYmFsLkFJUlBMQU5FX01PREVfT04pKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIG1Db250ZXh0LnVucmVnaXN0ZXJSZWNlaXZlcihyZWNlaXZlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWlycGxhbmVNb2RlQ2Fubm90QmVUdXJuZWRPbldpdGhSZXN0cmljdGlvbk9uKCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5hZGRVc2VyUmVzdHJpY3Rpb24oZ2V0V2hvKCksIFVzZXJNYW5hZ2VyLkRJU0FMTE9XX0FJUlBMQU5FX01PREUpOworICAgICAgICBUaHJlYWQuc2xlZXAoU0xFRVBfTVMpOworICAgICAgICBTZXR0aW5ncy5HbG9iYWwucHV0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLCBBSVJQTEFORV9NT0RFX09OLCAxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIFNldHRpbmdzLkdsb2JhbC5nZXRJbnQoCisgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksIEFJUlBMQU5FX01PREVfT04pKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWlycGxhbmVNb2RlQ2FuQmVUdXJuZWRPbldpdGhSZXN0cmljdGlvbk9mZigpIHRocm93cyBTZXR0aW5nTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBTZXR0aW5ncy5HbG9iYWwucHV0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLCBBSVJQTEFORV9NT0RFX09OLCAxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIFNldHRpbmdzLkdsb2JhbC5nZXRJbnQoCisgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksIEFJUlBMQU5FX01PREVfT04pKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vvd25lci9CYWNrdXBTZXJ2aWNlRW5hYmxlZFRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZW93bmVyL0JhY2t1cFNlcnZpY2VFbmFibGVkVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmYxZWM3Li4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZW93bmVyL0JhY2t1cFNlcnZpY2VFbmFibGVkVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5kZXZpY2Vvd25lcjsKLQotcHVibGljIGNsYXNzIEJhY2t1cFNlcnZpY2VFbmFibGVkVGVzdCBleHRlbmRzIEJhc2VEZXZpY2VPd25lclRlc3QgewotCi0gICAgLyoqCi0gICAgICogVGVzdDogVGVzdCBlbmFibGluZyBiYWNrdXAgc2VydmljZS4gVGhpcyB0ZXN0IHNob3VsZCBiZSBleGVjdXRlZCBhZnRlciBpbnN0YWxsaW5nIGEgZGV2aWNlCi0gICAgICogb3duZXIgc28gdGhhdCB3ZSBjaGVjayB0aGF0IGJhY2t1cCBzZXJ2aWNlIGlzIG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQuCi0gICAgICogVGhpcyB0ZXN0IHdpbGwga2VlcCBiYWNrdXAgc2VydmljZSBkaXNhYmxlZCBhZnRlciBpdHMgZXhlY3V0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RFbmFibGluZ0FuZERpc2FibGluZ0JhY2t1cFNlcnZpY2UoKSB7Ci0gICAgICAgIGFzc2VydEZhbHNlKG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmlzQmFja3VwU2VydmljZUVuYWJsZWQoZ2V0V2hvKCkpKTsKLSAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuc2V0QmFja3VwU2VydmljZUVuYWJsZWQoZ2V0V2hvKCksIHRydWUpOwotICAgICAgICBhc3NlcnRUcnVlKG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmlzQmFja3VwU2VydmljZUVuYWJsZWQoZ2V0V2hvKCkpKTsKLSAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuc2V0QmFja3VwU2VydmljZUVuYWJsZWQoZ2V0V2hvKCksIGZhbHNlKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UobURldmljZVBvbGljeU1hbmFnZXIuaXNCYWNrdXBTZXJ2aWNlRW5hYmxlZChnZXRXaG8oKSkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZW93bmVyL0JhY2t1cFNlcnZpY2VQb2xpY2llc1Rlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZW93bmVyL0JhY2t1cFNlcnZpY2VQb2xpY2llc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTJkM2MzCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlb3duZXIvQmFja3VwU2VydmljZVBvbGljaWVzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5jdHMuZGV2aWNlb3duZXI7CisKK3B1YmxpYyBjbGFzcyBCYWNrdXBTZXJ2aWNlUG9saWNpZXNUZXN0IGV4dGVuZHMgQmFzZURldmljZU93bmVyVGVzdCB7CisKKyAgICAvKioKKyAgICAgKiBUZXN0OiBUZXN0IGVuYWJsaW5nIGJhY2t1cCBzZXJ2aWNlLiBUaGlzIHRlc3Qgc2hvdWxkIGJlIGV4ZWN1dGVkIGFmdGVyIGluc3RhbGxpbmcgYSBkZXZpY2UKKyAgICAgKiBvd25lciBzbyB0aGF0IHdlIGNoZWNrIHRoYXQgYmFja3VwIHNlcnZpY2UgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdC4KKyAgICAgKiBUaGlzIHRlc3Qgd2lsbCBrZWVwIGJhY2t1cCBzZXJ2aWNlIGRpc2FibGVkIGFmdGVyIGl0cyBleGVjdXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEVuYWJsaW5nQW5kRGlzYWJsaW5nQmFja3VwU2VydmljZSgpIHsKKyAgICAgICAgYXNzZXJ0RmFsc2UobURldmljZVBvbGljeU1hbmFnZXIuaXNCYWNrdXBTZXJ2aWNlRW5hYmxlZChnZXRXaG8oKSkpOworICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5zZXRCYWNrdXBTZXJ2aWNlRW5hYmxlZChnZXRXaG8oKSwgdHJ1ZSk7CisgICAgICAgIGFzc2VydFRydWUobURldmljZVBvbGljeU1hbmFnZXIuaXNCYWNrdXBTZXJ2aWNlRW5hYmxlZChnZXRXaG8oKSkpOworICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5zZXRCYWNrdXBTZXJ2aWNlRW5hYmxlZChnZXRXaG8oKSwgZmFsc2UpOworICAgICAgICBhc3NlcnRGYWxzZShtRGV2aWNlUG9saWN5TWFuYWdlci5pc0JhY2t1cFNlcnZpY2VFbmFibGVkKGdldFdobygpKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vvd25lci9CYXNlQWZmaWxpYXRlZFByb2ZpbGVPd25lclRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZW93bmVyL0Jhc2VBZmZpbGlhdGVkUHJvZmlsZU93bmVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0OTBlZmYKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vvd25lci9CYXNlQWZmaWxpYXRlZFByb2ZpbGVPd25lclRlc3QuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuY3RzLmRldmljZW93bmVyOworCitpbXBvcnQgYW5kcm9pZC5hcHAuYWRtaW4uRGV2aWNlUG9saWN5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIGFmZmlsaWF0ZWQgcHJvZmlsZS1vd25lciBiYXNlZCB0ZXN0cy4KKyAqCisgKiBUaGlzIGNsYXNzIGhhbmRsZXMgbWFraW5nIHN1cmUgdGhhdCB0aGUgdGVzdCBpcyB0aGUgYWZmaWxpYXRlZCBwcm9maWxlIG93bmVyIGFuZCB0aGF0IGl0IGhhcyBhbgorICogYWN0aXZlIGFkbWluIHJlZ2lzdGVyZWQsIHNvIHRoYXQgYWxsIHRlc3RzIG1heSBhc3N1bWUgdGhlc2UgYXJlIGRvbmUuIFRoZSBhZG1pbiBjb21wb25lbnQgY2FuIGJlCisgKiBhY2Nlc3NlZCB0aHJvdWdoIHtAbGluayAjZ2V0V2hvKCl9LgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZUFmZmlsaWF0ZWRQcm9maWxlT3duZXJUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKworICAgIHByb3RlY3RlZCBEZXZpY2VQb2xpY3lNYW5hZ2VyIG1EZXZpY2VQb2xpY3lNYW5hZ2VyOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKworICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlciA9IG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoRGV2aWNlUG9saWN5TWFuYWdlci5jbGFzcyk7CisgICAgICAgIGFzc2VydERldmljZU9yQWZmaWxpYXRlZFByb2ZpbGVPd25lcigpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnREZXZpY2VPckFmZmlsaWF0ZWRQcm9maWxlT3duZXIoKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwobURldmljZVBvbGljeU1hbmFnZXIpOworICAgICAgICBhc3NlcnRUcnVlKG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmlzQWRtaW5BY3RpdmUoZ2V0V2hvKCkpKTsKKyAgICAgICAgYm9vbGVhbiBpc0RldmljZU93bmVyID0gbURldmljZVBvbGljeU1hbmFnZXIuaXNEZXZpY2VPd25lckFwcChtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpKTsKKyAgICAgICAgYm9vbGVhbiBpc0FmZmlsaWF0ZWRQcm9maWxlT3duZXIgPSBtRGV2aWNlUG9saWN5TWFuYWdlci5pc1Byb2ZpbGVPd25lckFwcCgKKyAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpKQorICAgICAgICAgICAgICAgICYmIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmlzQWZmaWxpYXRlZFVzZXIoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShpc0RldmljZU93bmVyIHx8IGlzQWZmaWxpYXRlZFByb2ZpbGVPd25lcik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIENvbXBvbmVudE5hbWUgZ2V0V2hvKCkgeworICAgICAgICByZXR1cm4gQmFzaWNBZG1pblJlY2VpdmVyLmdldENvbXBvbmVudE5hbWUobUNvbnRleHQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZW93bmVyL0Jhc2VEZXZpY2VPd25lclRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZW93bmVyL0Jhc2VEZXZpY2VPd25lclRlc3QuamF2YQppbmRleCA5NGFhZWIyLi5jMTllMjVkIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vvd25lci9CYXNlRGV2aWNlT3duZXJUZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlb3duZXIvQmFzZURldmljZU93bmVyVGVzdC5qYXZhCkBAIC0xNSwxNyArMTUsMTQgQEAKICAqLwogcGFja2FnZSBjb20uYW5kcm9pZC5jdHMuZGV2aWNlb3duZXI7CiAKLWltcG9ydCBhbmRyb2lkLmFwcC5hZG1pbi5EZXZpY2VBZG1pblJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmFwcC5hZG1pbi5EZXZpY2VQb2xpY3lNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuUHJvY2VzczsKLWltcG9ydCBhbmRyb2lkLm9zLlVzZXJIYW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LmNvbnRlbnQuTG9jYWxCcm9hZGNhc3RNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLlVpRGV2aWNlOwogaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworCiAvKioKICAqIEJhc2UgY2xhc3MgZm9yIGRldmljZS1vd25lciBiYXNlZCB0ZXN0cy4KICAqCkBAIC0zNiw3NyArMzMsMzEgQEAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VEZXZpY2VPd25lclRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgewogCi0gICAgZmluYWwgc3RhdGljIFN0cmluZyBBQ1RJT05fVVNFUl9BRERFRCA9ICJjb20uYW5kcm9pZC5jdHMuZGV2aWNlb3duZXIuYWN0aW9uLlVTRVJfQURERUQiOwotICAgIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUNUSU9OX1VTRVJfUkVNT1ZFRCA9ICJjb20uYW5kcm9pZC5jdHMuZGV2aWNlb3duZXIuYWN0aW9uLlVTRVJfUkVNT1ZFRCI7Ci0gICAgZmluYWwgc3RhdGljIFN0cmluZyBFWFRSQV9VU0VSX0hBTkRMRSA9ICJjb20uYW5kcm9pZC5jdHMuZGV2aWNlb3duZXIuZXh0cmEuVVNFUl9IQU5ETEUiOwotICAgIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUNUSU9OX05FVFdPUktfTE9HU19BVkFJTEFCTEUgPQotICAgICAgICAgICAgImNvbS5hbmRyb2lkLmN0cy5kZXZpY2Vvd25lci5hY3Rpb24uQUNUSU9OX05FVFdPUktfTE9HU19BVkFJTEFCTEUiOwotICAgIGZpbmFsIHN0YXRpYyBTdHJpbmcgRVhUUkFfTkVUV09SS19MT0dTX0JBVENIX1RPS0VOID0KLSAgICAgICAgICAgICJjb20uYW5kcm9pZC5jdHMuZGV2aWNlb3duZXIuZXh0cmEuTkVUV09SS19MT0dTX0JBVENIX1RPS0VOIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQmFzaWNBZG1pblJlY2VpdmVyIGV4dGVuZHMgRGV2aWNlQWRtaW5SZWNlaXZlciB7Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBDb21wb25lbnROYW1lIGdldENvbXBvbmVudE5hbWUoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IENvbXBvbmVudE5hbWUoY29udGV4dCwgQmFzaWNBZG1pblJlY2VpdmVyLmNsYXNzKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIG9uQ2hvb3NlUHJpdmF0ZUtleUFsaWFzKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCwgaW50IHVpZCwgVXJpIHVyaSwKLSAgICAgICAgICAgICAgICBTdHJpbmcgc3VnZ2VzdGVkQWxpYXMpIHsKLSAgICAgICAgICAgIGlmICh1aWQgIT0gUHJvY2Vzcy5teVVpZCgpIHx8IHVyaSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdXJpLmdldFF1ZXJ5UGFyYW1ldGVyKCJhbGlhcyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVXNlckFkZGVkKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCwgVXNlckhhbmRsZSB1c2VySGFuZGxlKSB7Ci0gICAgICAgICAgICBzZW5kVXNlckFkZGVkT3JSZW1vdmVkQnJvYWRjYXN0KGNvbnRleHQsIEFDVElPTl9VU0VSX0FEREVELCB1c2VySGFuZGxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblVzZXJSZW1vdmVkKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCwgVXNlckhhbmRsZSB1c2VySGFuZGxlKSB7Ci0gICAgICAgICAgICBzZW5kVXNlckFkZGVkT3JSZW1vdmVkQnJvYWRjYXN0KGNvbnRleHQsIEFDVElPTl9VU0VSX1JFTU9WRUQsIHVzZXJIYW5kbGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uTmV0d29ya0xvZ3NBdmFpbGFibGUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50LCBsb25nIGJhdGNoVG9rZW4sCi0gICAgICAgICAgICAgICAgaW50IG5ldHdvcmtMb2dzQ291bnQpIHsKLSAgICAgICAgICAgIC8vIHNlbmQgdGhlIGJyb2FkY2FzdCwgdGhlIHJlc3Qgb2YgdGhlIHRlc3QgaGFwcGVucyBpbiBOZXR3b3JrTG9nZ2luZ1Rlc3QKLSAgICAgICAgICAgIEludGVudCBiYXRjaEludGVudCA9IG5ldyBJbnRlbnQoQUNUSU9OX05FVFdPUktfTE9HU19BVkFJTEFCTEUpOwotICAgICAgICAgICAgYmF0Y2hJbnRlbnQucHV0RXh0cmEoRVhUUkFfTkVUV09SS19MT0dTX0JBVENIX1RPS0VOLCBiYXRjaFRva2VuKTsKLSAgICAgICAgICAgIExvY2FsQnJvYWRjYXN0TWFuYWdlci5nZXRJbnN0YW5jZShjb250ZXh0KS5zZW5kQnJvYWRjYXN0KGJhdGNoSW50ZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBzZW5kVXNlckFkZGVkT3JSZW1vdmVkQnJvYWRjYXN0KENvbnRleHQgY29udGV4dCwgU3RyaW5nIGFjdGlvbiwKLSAgICAgICAgICAgICAgICBVc2VySGFuZGxlIHVzZXJIYW5kbGUpIHsKLSAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KGFjdGlvbik7Ci0gICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoRVhUUkFfVVNFUl9IQU5ETEUsIHVzZXJIYW5kbGUpOwotICAgICAgICAgICAgTG9jYWxCcm9hZGNhc3RNYW5hZ2VyLmdldEluc3RhbmNlKGNvbnRleHQpLnNlbmRCcm9hZGNhc3QoaW50ZW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0VfTkFNRSA9IEJhc2VEZXZpY2VPd25lclRlc3QuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKTsKLQogICAgIHByb3RlY3RlZCBEZXZpY2VQb2xpY3lNYW5hZ2VyIG1EZXZpY2VQb2xpY3lNYW5hZ2VyOwotCisgICAgcHJvdGVjdGVkIEluc3RydW1lbnRhdGlvbiBtSW5zdHJ1bWVudGF0aW9uOworICAgIHByb3RlY3RlZCBVaURldmljZSBtRGV2aWNlOwogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHN1cGVyLnNldFVwKCk7CiAKLSAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIgPSAoRGV2aWNlUG9saWN5TWFuYWdlcikKLSAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuREVWSUNFX1BPTElDWV9TRVJWSUNFKTsKLSAgICAgICAgYXNzZXJ0RGV2aWNlT3duZXIobURldmljZVBvbGljeU1hbmFnZXIpOworICAgICAgICBtSW5zdHJ1bWVudGF0aW9uID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCk7CisgICAgICAgIG1EZXZpY2UgPSBVaURldmljZS5nZXRJbnN0YW5jZShtSW5zdHJ1bWVudGF0aW9uKTsKKyAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIgPSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKERldmljZVBvbGljeU1hbmFnZXIuY2xhc3MpOworICAgICAgICBhc3NlcnREZXZpY2VPd25lcigpOwogICAgIH0KIAotICAgIHN0YXRpYyB2b2lkIGFzc2VydERldmljZU93bmVyKERldmljZVBvbGljeU1hbmFnZXIgZHBtKSB7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZHBtKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShkcG0uaXNBZG1pbkFjdGl2ZShnZXRXaG8oKSkpOwotICAgICAgICBhc3NlcnRUcnVlKGRwbS5pc0RldmljZU93bmVyQXBwKFBBQ0tBR0VfTkFNRSkpOwotICAgICAgICBhc3NlcnRGYWxzZShkcG0uaXNNYW5hZ2VkUHJvZmlsZShnZXRXaG8oKSkpOworICAgIHByaXZhdGUgdm9pZCBhc3NlcnREZXZpY2VPd25lcigpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtRGV2aWNlUG9saWN5TWFuYWdlcik7CisgICAgICAgIGFzc2VydFRydWUobURldmljZVBvbGljeU1hbmFnZXIuaXNBZG1pbkFjdGl2ZShnZXRXaG8oKSkpOworICAgICAgICBhc3NlcnRUcnVlKG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmlzRGV2aWNlT3duZXJBcHAobUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSkpOworICAgICAgICBhc3NlcnRGYWxzZShtRGV2aWNlUG9saWN5TWFuYWdlci5pc01hbmFnZWRQcm9maWxlKGdldFdobygpKSk7CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBDb21wb25lbnROYW1lIGdldFdobygpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnROYW1lKFBBQ0tBR0VfTkFNRSwgQmFzaWNBZG1pblJlY2VpdmVyLmNsYXNzLmdldE5hbWUoKSk7CisgICAgcHJvdGVjdGVkIENvbXBvbmVudE5hbWUgZ2V0V2hvKCkgeworICAgICAgICByZXR1cm4gQmFzaWNBZG1pblJlY2VpdmVyLmdldENvbXBvbmVudE5hbWUobUNvbnRleHQpOworICAgIH0KKworICAgIHByb3RlY3RlZCBTdHJpbmcgZXhlY3V0ZVNoZWxsQ29tbWFuZChTdHJpbmcuLi4gY29tbWFuZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBtRGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoU3RyaW5nLmpvaW4oIiAiLCBjb21tYW5kKSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlb3duZXIvQmFzaWNBZG1pblJlY2VpdmVyLmphdmEgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vvd25lci9CYXNpY0FkbWluUmVjZWl2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2IzZWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlb3duZXIvQmFzaWNBZG1pblJlY2VpdmVyLmphdmEKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5kZXZpY2Vvd25lcjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLmFkbWluLkRldmljZUFkbWluUmVjZWl2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLlVzZXJIYW5kbGU7CitpbXBvcnQgYW5kcm9pZHgubG9jYWxicm9hZGNhc3RtYW5hZ2VyLmNvbnRlbnQuTG9jYWxCcm9hZGNhc3RNYW5hZ2VyOworCitwdWJsaWMgY2xhc3MgQmFzaWNBZG1pblJlY2VpdmVyIGV4dGVuZHMgRGV2aWNlQWRtaW5SZWNlaXZlciB7CisKKyAgICBmaW5hbCBzdGF0aWMgU3RyaW5nIEFDVElPTl9VU0VSX0FEREVEID0gImNvbS5hbmRyb2lkLmN0cy5kZXZpY2Vvd25lci5hY3Rpb24uVVNFUl9BRERFRCI7CisgICAgZmluYWwgc3RhdGljIFN0cmluZyBBQ1RJT05fVVNFUl9SRU1PVkVEID0gImNvbS5hbmRyb2lkLmN0cy5kZXZpY2Vvd25lci5hY3Rpb24uVVNFUl9SRU1PVkVEIjsKKyAgICBmaW5hbCBzdGF0aWMgU3RyaW5nIEFDVElPTl9VU0VSX1NUQVJURUQgPSAiY29tLmFuZHJvaWQuY3RzLmRldmljZW93bmVyLmFjdGlvbi5VU0VSX1NUQVJURUQiOworICAgIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUNUSU9OX1VTRVJfU1RPUFBFRCA9ICJjb20uYW5kcm9pZC5jdHMuZGV2aWNlb3duZXIuYWN0aW9uLlVTRVJfU1RPUFBFRCI7CisgICAgZmluYWwgc3RhdGljIFN0cmluZyBBQ1RJT05fVVNFUl9TV0lUQ0hFRCA9ICJjb20uYW5kcm9pZC5jdHMuZGV2aWNlb3duZXIuYWN0aW9uLlVTRVJfU1dJVENIRUQiOworICAgIGZpbmFsIHN0YXRpYyBTdHJpbmcgRVhUUkFfVVNFUl9IQU5ETEUgPSAiY29tLmFuZHJvaWQuY3RzLmRldmljZW93bmVyLmV4dHJhLlVTRVJfSEFORExFIjsKKyAgICBmaW5hbCBzdGF0aWMgU3RyaW5nIEFDVElPTl9ORVRXT1JLX0xPR1NfQVZBSUxBQkxFID0KKyAgICAgICAgICAgICJjb20uYW5kcm9pZC5jdHMuZGV2aWNlb3duZXIuYWN0aW9uLkFDVElPTl9ORVRXT1JLX0xPR1NfQVZBSUxBQkxFIjsKKyAgICBmaW5hbCBzdGF0aWMgU3RyaW5nIEVYVFJBX05FVFdPUktfTE9HU19CQVRDSF9UT0tFTiA9CisgICAgICAgICAgICAiY29tLmFuZHJvaWQuY3RzLmRldmljZW93bmVyLmV4dHJhLk5FVFdPUktfTE9HU19CQVRDSF9UT0tFTiI7CisKKyAgICBwdWJsaWMgc3RhdGljIENvbXBvbmVudE5hbWUgZ2V0Q29tcG9uZW50TmFtZShDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnROYW1lKGNvbnRleHQsIEJhc2ljQWRtaW5SZWNlaXZlci5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25Vc2VyQWRkZWQoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50LCBVc2VySGFuZGxlIHVzZXJIYW5kbGUpIHsKKyAgICAgICAgc3VwZXIub25Vc2VyQWRkZWQoY29udGV4dCwgaW50ZW50LCB1c2VySGFuZGxlKTsKKyAgICAgICAgc2VuZFVzZXJCcm9hZGNhc3QoY29udGV4dCwgQUNUSU9OX1VTRVJfQURERUQsIHVzZXJIYW5kbGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uVXNlclJlbW92ZWQoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50LCBVc2VySGFuZGxlIHVzZXJIYW5kbGUpIHsKKyAgICAgICAgc3VwZXIub25Vc2VyUmVtb3ZlZChjb250ZXh0LCBpbnRlbnQsIHVzZXJIYW5kbGUpOworICAgICAgICBzZW5kVXNlckJyb2FkY2FzdChjb250ZXh0LCBBQ1RJT05fVVNFUl9SRU1PVkVELCB1c2VySGFuZGxlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblVzZXJTdGFydGVkKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCwgVXNlckhhbmRsZSB1c2VySGFuZGxlKSB7CisgICAgICAgIHN1cGVyLm9uVXNlclN0YXJ0ZWQoY29udGV4dCwgaW50ZW50LCB1c2VySGFuZGxlKTsKKyAgICAgICAgc2VuZFVzZXJCcm9hZGNhc3QoY29udGV4dCwgQUNUSU9OX1VTRVJfU1RBUlRFRCwgdXNlckhhbmRsZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25Vc2VyU3RvcHBlZChDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQsIFVzZXJIYW5kbGUgdXNlckhhbmRsZSkgeworICAgICAgICBzdXBlci5vblVzZXJTdG9wcGVkKGNvbnRleHQsIGludGVudCwgdXNlckhhbmRsZSk7CisgICAgICAgIHNlbmRVc2VyQnJvYWRjYXN0KGNvbnRleHQsIEFDVElPTl9VU0VSX1NUT1BQRUQsIHVzZXJIYW5kbGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uVXNlclN3aXRjaGVkKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCwgVXNlckhhbmRsZSB1c2VySGFuZGxlKSB7CisgICAgICAgIHN1cGVyLm9uVXNlclN3aXRjaGVkKGNvbnRleHQsIGludGVudCwgdXNlckhhbmRsZSk7CisgICAgICAgIHNlbmRVc2VyQnJvYWRjYXN0KGNvbnRleHQsIEFDVElPTl9VU0VSX1NXSVRDSEVELCB1c2VySGFuZGxlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbk5ldHdvcmtMb2dzQXZhaWxhYmxlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCwgbG9uZyBiYXRjaFRva2VuLAorICAgICAgICAgICAgaW50IG5ldHdvcmtMb2dzQ291bnQpIHsKKyAgICAgICAgc3VwZXIub25OZXR3b3JrTG9nc0F2YWlsYWJsZShjb250ZXh0LCBpbnRlbnQsIGJhdGNoVG9rZW4sIG5ldHdvcmtMb2dzQ291bnQpOworICAgICAgICAvLyBzZW5kIHRoZSBicm9hZGNhc3QsIHRoZSByZXN0IG9mIHRoZSB0ZXN0IGhhcHBlbnMgaW4gTmV0d29ya0xvZ2dpbmdUZXN0CisgICAgICAgIEludGVudCBiYXRjaEludGVudCA9IG5ldyBJbnRlbnQoQUNUSU9OX05FVFdPUktfTE9HU19BVkFJTEFCTEUpOworICAgICAgICBiYXRjaEludGVudC5wdXRFeHRyYShFWFRSQV9ORVRXT1JLX0xPR1NfQkFUQ0hfVE9LRU4sIGJhdGNoVG9rZW4pOworICAgICAgICBMb2NhbEJyb2FkY2FzdE1hbmFnZXIuZ2V0SW5zdGFuY2UoY29udGV4dCkuc2VuZEJyb2FkY2FzdChiYXRjaEludGVudCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNlbmRVc2VyQnJvYWRjYXN0KENvbnRleHQgY29udGV4dCwgU3RyaW5nIGFjdGlvbiwKKyAgICAgICAgICAgIFVzZXJIYW5kbGUgdXNlckhhbmRsZSkgeworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChhY3Rpb24pOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoRVhUUkFfVVNFUl9IQU5ETEUsIHVzZXJIYW5kbGUpOworICAgICAgICBMb2NhbEJyb2FkY2FzdE1hbmFnZXIuZ2V0SW5zdGFuY2UoY29udGV4dCkuc2VuZEJyb2FkY2FzdChpbnRlbnQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZW93bmVyL0NyZWF0ZUFuZE1hbmFnZVVzZXJUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vvd25lci9DcmVhdGVBbmRNYW5hZ2VVc2VyVGVzdC5qYXZhCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggMDE1OWIxMjguLjAyODBiZGYKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlb3duZXIvQ3JlYXRlQW5kTWFuYWdlVXNlclRlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vvd25lci9DcmVhdGVBbmRNYW5hZ2VVc2VyVGVzdC5qYXZhCkBAIC0xNyw2ICsxNyw3IEBACiBwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5kZXZpY2Vvd25lcjsKIAogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5TZXJ2aWNlOwogaW1wb3J0IGFuZHJvaWQuYXBwLmFkbWluLkRldmljZUFkbWluUmVjZWl2ZXI7CiBpbXBvcnQgYW5kcm9pZC5hcHAuYWRtaW4uRGV2aWNlUG9saWN5TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CkBAIC0yNCwxOCArMjUsMjggQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LlNlcnZpY2VDb25uZWN0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5QZXJzaXN0YWJsZUJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5Vc2VySGFuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuVXNlck1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQuY29udGVudC5Mb2NhbEJyb2FkY2FzdE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZHgubG9jYWxicm9hZGNhc3RtYW5hZ2VyLmNvbnRlbnQuTG9jYWxCcm9hZGNhc3RNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TZW1hcGhvcmU7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuTGlua2VkQmxvY2tpbmdRdWV1ZTsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKIAogLyoqCiAgKiBUZXN0IHtAbGluayBEZXZpY2VQb2xpY3lNYW5hZ2VyI2NyZWF0ZUFuZE1hbmFnZVVzZXJ9LgpAQCAtNTAsMTIgKzYxLDE4IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVFVQX0NPTVBMRVRFX0VYVFJBID0gInNldHVwQ29tcGxldGVFeHRyYSI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJST0FEQ0FTVF9USU1FT1VUID0gMTVfMDAwOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVU0VSX1NXSVRDSF9ERUxBWSA9IDEwXzAwMDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBRkZJTElBVElPTl9JRCA9ICJhZmZpbGlhdGlvbi5pZCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0FGRklMSUFUSU9OX0lEID0gImFmZmlsaWF0aW9uSWRFeHRyYSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX01FVEhPRF9OQU1FID0gIm1ldGhvZE5hbWUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgT05fRU5BQkxFRF9USU1FT1VUX1NFQ09ORFMgPSAxMjA7CisKKwogICAgIHByaXZhdGUgUGFja2FnZU1hbmFnZXIgbVBhY2thZ2VNYW5hZ2VyOwogICAgIHByaXZhdGUgQWN0aXZpdHlNYW5hZ2VyIG1BY3Rpdml0eU1hbmFnZXI7CiAgICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIG1SZWNlaXZlZDsKICAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gbVRlc3RQcm9maWxlT3duZXJXYXNVc2VkOwogICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBtU2V0dXBDb21wbGV0ZTsKLSAgICBwcml2YXRlIFVzZXJIYW5kbGUgbVVzZXJIYW5kbGU7CiAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewpAQCAtNjgsMTEgKzg1LDYgQEAKICAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5jbGVhclVzZXJSZXN0cmljdGlvbihnZXRXaG8oKSwgVXNlck1hbmFnZXIuRElTQUxMT1dfQUREX1VTRVIpOwogICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5jbGVhclVzZXJSZXN0cmljdGlvbihnZXRXaG8oKSwgVXNlck1hbmFnZXIuRElTQUxMT1dfUkVNT1ZFX1VTRVIpOwotICAgICAgICAvLyBSZW1vdmUgdXNlciBpbiBjYXNlIG9mIGZhaWxlZCB0ZXN0LgotICAgICAgICBpZiAobVVzZXJIYW5kbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIucmVtb3ZlVXNlcihnZXRXaG8oKSwgbVVzZXJIYW5kbGUpOwotICAgICAgICAgICAgbVVzZXJIYW5kbGUgPSBudWxsOwotICAgICAgICB9CiAgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CiAgICAgfQogCkBAIC0xMjIsMTU4ICsxMzQsNDI5IEBACiAgICAgICAgIH0KICAgICB9CiAKLS8vIERpc2FibGVkIGR1ZSB0byBiLzI5MDcyNzI4Ci0vLyAgICAvLyBUaGlzIHRlc3Qgd2lsbCBjcmVhdGUgYSB1c2VyIHRoYXQgd2lsbCBnZXQgcGFzc2VkIGEgYnVuZGxlIHRoYXQgd2Ugc3BlY2lmeS4gVGhlIGJ1bmRsZSB3aWxsCi0vLyAgICAvLyBjb250YWluIGFuIGFjdGlvbiBhbmQgYSBzZXJpYWwgKGZvciB1c2VyIGhhbmRsZSkgdG8gYnJvYWRjYXN0IHRvIG5vdGlmeSB0aGUgdGVzdCB0aGF0IHRoZQotLy8gICAgLy8gY29uZmlndXJhdGlvbiB3YXMgdHJpZ2dlcmVkLgotLy8gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUFuZE1hbmFnZVVzZXJUZXN0KGZpbmFsIGludCBmbGFncykgewotLy8gICAgICAgIC8vIFRoaXMgdGVzdCBzZXRzIGEgcHJvZmlsZSBvd25lciBvbiB0aGUgdXNlciwgd2hpY2ggcmVxdWlyZXMgdGhlIG1hbmFnZWRfdXNlcnMgZmVhdHVyZS4KLS8vICAgICAgICBpZiAoIW1QYWNrYWdlTWFuYWdlci5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfTUFOQUdFRF9VU0VSUykpIHsKLS8vICAgICAgICAgICAgcmV0dXJuOwotLy8gICAgICAgIH0KLS8vCi0vLyAgICAgICAgZmluYWwgYm9vbGVhbiBleHBlY3RlZFNldHVwQ29tcGxldGUgPSAoZmxhZ3MgJiBEZXZpY2VQb2xpY3lNYW5hZ2VyLlNLSVBfU0VUVVBfV0laQVJEKSAhPSAwOwotLy8gICAgICAgIFVzZXJNYW5hZ2VyIHVzZXJNYW5hZ2VyID0gKFVzZXJNYW5hZ2VyKSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuVVNFUl9TRVJWSUNFKTsKLS8vCi0vLyAgICAgICAgVXNlckhhbmRsZSBmaXJzdFVzZXIgPSBQcm9jZXNzLm15VXNlckhhbmRsZSgpOwotLy8gICAgICAgIGZpbmFsIFN0cmluZyB0ZXN0VXNlck5hbWUgPSAiVGVzdFVzZXJfIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotLy8gICAgICAgIFN0cmluZyBhY3Rpb24gPSAiY29tLmFuZHJvaWQuY3RzLlRFU1RfVVNFUl9BQ1RJT04iOwotLy8gICAgICAgIFBlcnNpc3RhYmxlQnVuZGxlIGJ1bmRsZSA9IG5ldyBQZXJzaXN0YWJsZUJ1bmRsZSgpOwotLy8gICAgICAgIGJ1bmRsZS5wdXRCb29sZWFuKEJST0FEQ0FTVF9FWFRSQSwgdHJ1ZSk7Ci0vLyAgICAgICAgYnVuZGxlLnB1dExvbmcoU0VSSUFMX0VYVFJBLCB1c2VyTWFuYWdlci5nZXRTZXJpYWxOdW1iZXJGb3JVc2VyKGZpcnN0VXNlcikpOwotLy8gICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoQUNUSU9OX0VYVFJBLCBhY3Rpb24pOwotLy8KLS8vICAgICAgICBtUmVjZWl2ZWQgPSBmYWxzZTsKLS8vICAgICAgICBtVGVzdFByb2ZpbGVPd25lcldhc1VzZWQgPSBmYWxzZTsKLS8vICAgICAgICBtU2V0dXBDb21wbGV0ZSA9ICFleHBlY3RlZFNldHVwQ29tcGxldGU7Ci0vLyAgICAgICAgQnJvYWRjYXN0UmVjZWl2ZXIgcmVjZWl2ZXIgPSBuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7Ci0vLyAgICAgICAgICAgIEBPdmVycmlkZQotLy8gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7Ci0vLyAgICAgICAgICAgICAgICBtUmVjZWl2ZWQgPSB0cnVlOwotLy8gICAgICAgICAgICAgICAgaWYgKGludGVudC5nZXRCb29sZWFuRXh0cmEoUFJPRklMRV9PV05FUl9FWFRSQSwgZmFsc2UpKSB7Ci0vLyAgICAgICAgICAgICAgICAgICAgbVRlc3RQcm9maWxlT3duZXJXYXNVc2VkID0gdHJ1ZTsKLS8vICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICAgIG1TZXR1cENvbXBsZXRlID0gaW50ZW50LmdldEJvb2xlYW5FeHRyYShTRVRVUF9DT01QTEVURV9FWFRSQSwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgIWV4cGVjdGVkU2V0dXBDb21wbGV0ZSk7Ci0vLyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKENyZWF0ZUFuZE1hbmFnZVVzZXJUZXN0LnRoaXMpIHsKLS8vICAgICAgICAgICAgICAgICAgICBDcmVhdGVBbmRNYW5hZ2VVc2VyVGVzdC50aGlzLm5vdGlmeSgpOwotLy8gICAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICB9Ci0vLyAgICAgICAgfTsKLS8vCi0vLyAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKLS8vICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKGFjdGlvbik7Ci0vLyAgICAgICAgbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihyZWNlaXZlciwgZmlsdGVyKTsKLS8vCi0vLyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0vLyAgICAgICAgICAgIG1Vc2VySGFuZGxlID0gbURldmljZVBvbGljeU1hbmFnZXIuY3JlYXRlQW5kTWFuYWdlVXNlcihnZXRXaG8oKSwgdGVzdFVzZXJOYW1lLAotLy8gICAgICAgICAgICAgICAgICAgIFRlc3RQcm9maWxlT3duZXIuZ2V0Q29tcG9uZW50TmFtZSgpLCBidW5kbGUsIGZsYWdzKTsKLS8vICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtVXNlckhhbmRsZSk7Ci0vLwotLy8gICAgICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5zd2l0Y2hVc2VyKGdldFdobygpLCBtVXNlckhhbmRsZSk7Ci0vLyAgICAgICAgICAgIHRyeSB7Ci0vLyAgICAgICAgICAgICAgICB3YWl0KFVTRVJfU1dJVENIX0RFTEFZKTsKLS8vICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotLy8gICAgICAgICAgICAgICAgZmFpbCgiSW50ZXJydXB0ZWRFeGNlcHRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuc3dpdGNoVXNlcihnZXRXaG8oKSwgZmlyc3RVc2VyKTsKLS8vCi0vLyAgICAgICAgICAgIHdhaXRGb3JCcm9hZGNhc3RMb2NrZWQoKTsKLS8vCi0vLyAgICAgICAgICAgIGFzc2VydFRydWUobVJlY2VpdmVkKTsKLS8vICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtVGVzdFByb2ZpbGVPd25lcldhc1VzZWQpOwotLy8gICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTZXR1cENvbXBsZXRlLCBtU2V0dXBDb21wbGV0ZSk7Ci0vLwotLy8gICAgICAgICAgICBhc3NlcnRUcnVlKG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnJlbW92ZVVzZXIoZ2V0V2hvKCksIG1Vc2VySGFuZGxlKSk7Ci0vLwotLy8gICAgICAgICAgICBtVXNlckhhbmRsZSA9IG51bGw7Ci0vLyAgICAgICAgfQotLy8KLS8vICAgICAgICBtQ29udGV4dC51bnJlZ2lzdGVyUmVjZWl2ZXIocmVjZWl2ZXIpOwotLy8gICAgfQorICAgIC8vIFRoaXMgdGVzdCB3aWxsIGNyZWF0ZSBhIHVzZXIgdGhhdCB3aWxsIGdldCBwYXNzZWQgYSBidW5kbGUgdGhhdCB3ZSBzcGVjaWZ5LiBUaGUgYnVuZGxlIHdpbGwKKyAgICAvLyBjb250YWluIGFuIGFjdGlvbiBhbmQgYSBzZXJpYWwgKGZvciB1c2VyIGhhbmRsZSkgdG8gYnJvYWRjYXN0IHRvIG5vdGlmeSB0aGUgdGVzdCB0aGF0IHRoZQorICAgIC8vIGNvbmZpZ3VyYXRpb24gd2FzIHRyaWdnZXJlZC4KKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlQW5kTWFuYWdlVXNlclRlc3QoZmluYWwgaW50IGZsYWdzKSB7CisgICAgICAgIC8vIFRoaXMgdGVzdCBzZXRzIGEgcHJvZmlsZSBvd25lciBvbiB0aGUgdXNlciwgd2hpY2ggcmVxdWlyZXMgdGhlIG1hbmFnZWRfdXNlcnMgZmVhdHVyZS4KKyAgICAgICAgaWYgKCFtUGFja2FnZU1hbmFnZXIuaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX01BTkFHRURfVVNFUlMpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KIAotICAgIC8qKgotICAgICAqIFRlc3QgY3JlYXRpbmcgYW4gZXBoZW1lcmFsIHVzZXIgdXNpbmcgdGhlIHtAbGluayBEZXZpY2VQb2xpY3lNYW5hZ2VyI2NyZWF0ZUFuZE1hbmFnZVVzZXJ9Ci0gICAgICogbWV0aG9kLgotICAgICAqCi0gICAgICogPHA+VGhlIHRlc3QgY3JlYXRlcyBhIHVzZXIgYnkgY2FsbGluZyB0byB7QGxpbmsgRGV2aWNlUG9saWN5TWFuYWdlciNjcmVhdGVBbmRNYW5hZ2VVc2VyfS4gSXQKLSAgICAgKiBkb2Vzbid0IHJlbW92ZSB0aGUgdXNlciBhZnRlcndhcmRzLCBzbyBpdHMgcHJvcGVydGllcyBjYW4gYmUgcXVlcmllZCBhbmQgdGVzdGVkIGJ5IGhvc3Qtc2lkZQotICAgICAqIHRlc3RzLgotICAgICAqIDxwPlRoZSB1c2VyJ3MgZmxhZ3Mgd2lsbCBiZSBjaGVja2VkIGZyb20gdGhlIGNvcnJlc3BvbmRpbmcgaG9zdC1zaWRlIHRlc3QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUFuZE1hbmFnZUVwaGVtZXJhbFVzZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBleHBlY3RlZFNldHVwQ29tcGxldGUgPSAoZmxhZ3MgJiBEZXZpY2VQb2xpY3lNYW5hZ2VyLlNLSVBfU0VUVVBfV0laQVJEKSAhPSAwOworICAgICAgICBVc2VyTWFuYWdlciB1c2VyTWFuYWdlciA9IChVc2VyTWFuYWdlcikgbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlVTRVJfU0VSVklDRSk7CisKKyAgICAgICAgVXNlckhhbmRsZSBmaXJzdFVzZXIgPSBQcm9jZXNzLm15VXNlckhhbmRsZSgpOworICAgICAgICBmaW5hbCBTdHJpbmcgdGVzdFVzZXJOYW1lID0gIlRlc3RVc2VyXyIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgU3RyaW5nIGFjdGlvbiA9ICJjb20uYW5kcm9pZC5jdHMuVEVTVF9VU0VSX0FDVElPTiI7CisgICAgICAgIFBlcnNpc3RhYmxlQnVuZGxlIGJ1bmRsZSA9IG5ldyBQZXJzaXN0YWJsZUJ1bmRsZSgpOworICAgICAgICBidW5kbGUucHV0Qm9vbGVhbihCUk9BRENBU1RfRVhUUkEsIHRydWUpOworICAgICAgICBidW5kbGUucHV0TG9uZyhTRVJJQUxfRVhUUkEsIHVzZXJNYW5hZ2VyLmdldFNlcmlhbE51bWJlckZvclVzZXIoZmlyc3RVc2VyKSk7CisgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoQUNUSU9OX0VYVFJBLCBhY3Rpb24pOworCisgICAgICAgIG1SZWNlaXZlZCA9IGZhbHNlOworICAgICAgICBtVGVzdFByb2ZpbGVPd25lcldhc1VzZWQgPSBmYWxzZTsKKyAgICAgICAgbVNldHVwQ29tcGxldGUgPSAhZXhwZWN0ZWRTZXR1cENvbXBsZXRlOworICAgICAgICBCcm9hZGNhc3RSZWNlaXZlciByZWNlaXZlciA9IG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgICAgIG1SZWNlaXZlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgaWYgKGludGVudC5nZXRCb29sZWFuRXh0cmEoUFJPRklMRV9PV05FUl9FWFRSQSwgZmFsc2UpKSB7CisgICAgICAgICAgICAgICAgICAgIG1UZXN0UHJvZmlsZU93bmVyV2FzVXNlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1TZXR1cENvbXBsZXRlID0gaW50ZW50LmdldEJvb2xlYW5FeHRyYShTRVRVUF9DT01QTEVURV9FWFRSQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICFleHBlY3RlZFNldHVwQ29tcGxldGUpOworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoQ3JlYXRlQW5kTWFuYWdlVXNlclRlc3QudGhpcykgeworICAgICAgICAgICAgICAgICAgICBDcmVhdGVBbmRNYW5hZ2VVc2VyVGVzdC50aGlzLm5vdGlmeSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEludGVudEZpbHRlcigpOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKGFjdGlvbik7CisgICAgICAgIG1Db250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIocmVjZWl2ZXIsIGZpbHRlcik7CisKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBVc2VySGFuZGxlIHVzZXJIYW5kbGUgPSBtRGV2aWNlUG9saWN5TWFuYWdlci5jcmVhdGVBbmRNYW5hZ2VVc2VyKGdldFdobygpLCB0ZXN0VXNlck5hbWUsCisgICAgICAgICAgICAgICAgICAgIFRlc3RQcm9maWxlT3duZXIuZ2V0Q29tcG9uZW50TmFtZSgpLCBidW5kbGUsIGZsYWdzKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwodXNlckhhbmRsZSk7CisKKyAgICAgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnN3aXRjaFVzZXIoZ2V0V2hvKCksIHVzZXJIYW5kbGUpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB3YWl0KFVTRVJfU1dJVENIX0RFTEFZKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJJbnRlcnJ1cHRlZEV4Y2VwdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnN3aXRjaFVzZXIoZ2V0V2hvKCksIGZpcnN0VXNlcik7CisKKyAgICAgICAgICAgIHdhaXRGb3JCcm9hZGNhc3RMb2NrZWQoKTsKKworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtUmVjZWl2ZWQpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtVGVzdFByb2ZpbGVPd25lcldhc1VzZWQpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU2V0dXBDb21wbGV0ZSwgbVNldHVwQ29tcGxldGUpOworCisgICAgICAgICAgICBhc3NlcnRUcnVlKG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnJlbW92ZVVzZXIoZ2V0V2hvKCksIHVzZXJIYW5kbGUpKTsKKworICAgICAgICAgICAgdXNlckhhbmRsZSA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBtQ29udGV4dC51bnJlZ2lzdGVyUmVjZWl2ZXIocmVjZWl2ZXIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVBbmRNYW5hZ2VVc2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZyB0ZXN0VXNlck5hbWUgPSAiVGVzdFVzZXJfIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogCi0gICAgICAgIC8vIFVzZSByZWZsZWN0aW9uIHRvIGdldCB0aGUgdmFsdWUgb2YgdGhlIGhpZGRlbiBmbGFnIHRvIG1ha2UgdGhlIG5ldyB1c2VyIGVwaGVtZXJhbC4KLSAgICAgICAgRmllbGQgZmllbGQgPSBEZXZpY2VQb2xpY3lNYW5hZ2VyLmNsYXNzLmdldEZpZWxkKCJNQUtFX1VTRVJfRVBIRU1FUkFMIik7Ci0gICAgICAgIGludCBtYWtlRXBoZW1lcmFsRmxhZyA9IGZpZWxkLmdldEludChudWxsKTsKLQotICAgICAgICAvLyBEbyBub3QgYXNzaWduIHJldHVybiB2YWx1ZSB0byBtVXNlckhhbmRsZSwgc28gaXQgaXMgbm90IHJlbW92ZWQgaW4gdGVhckRvd24uCi0gICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmNyZWF0ZUFuZE1hbmFnZVVzZXIoCisgICAgICAgIFVzZXJIYW5kbGUgdXNlckhhbmRsZSA9IG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmNyZWF0ZUFuZE1hbmFnZVVzZXIoCiAgICAgICAgICAgICAgICAgZ2V0V2hvKCksCiAgICAgICAgICAgICAgICAgdGVzdFVzZXJOYW1lLAogICAgICAgICAgICAgICAgIGdldFdobygpLAogICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgbWFrZUVwaGVtZXJhbEZsYWcpOworICAgICAgICAgICAgICAgIC8qIGZsYWdzICovIDApOworICAgICAgICBMb2cuZChUQUcsICJVc2VyIGNyZWF0ZTogIiArIHVzZXJIYW5kbGUpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFRlc3QgY3JlYXRpbmcgYW4gZXBoZW1lcmFsIHVzZXIgdXNpbmcgdGhlIHtAbGluayBEZXZpY2VQb2xpY3lNYW5hZ2VyI2NyZWF0ZUFuZE1hbmFnZVVzZXJ9Ci0gICAgICogbWV0aG9kIGZhaWxzIG9uIHN5c3RlbXMgd2l0aG91dCB0aGUgc3BsaXQgc3lzdGVtIHVzZXIuCi0gICAgICoKLSAgICAgKiA8cD5UbyBiZSB1c2VkIGJ5IGhvc3Qtc2lkZSB0ZXN0IG9uIHN5c3RlbXMgd2l0aG91dCB0aGUgc3BsaXQgc3lzdGVtIHVzZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUFuZE1hbmFnZUVwaGVtZXJhbFVzZXJGYWlscygpIHRocm93cyBFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVBbmRNYW5hZ2VVc2VyX0xvd1N0b3JhZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIHRlc3RVc2VyTmFtZSA9ICJUZXN0VXNlcl8iICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAKLSAgICAgICAgLy8gVXNlIHJlZmxlY3Rpb24gdG8gZ2V0IHRoZSB2YWx1ZSBvZiB0aGUgaGlkZGVuIGZsYWcgdG8gbWFrZSB0aGUgbmV3IHVzZXIgZXBoZW1lcmFsLgotICAgICAgICBGaWVsZCBmaWVsZCA9IERldmljZVBvbGljeU1hbmFnZXIuY2xhc3MuZ2V0RmllbGQoIk1BS0VfVVNFUl9FUEhFTUVSQUwiKTsKLSAgICAgICAgaW50IG1ha2VFcGhlbWVyYWxGbGFnID0gZmllbGQuZ2V0SW50KG51bGwpOwotCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5jcmVhdGVBbmRNYW5hZ2VVc2VyKAogICAgICAgICAgICAgICAgICAgICBnZXRXaG8oKSwKICAgICAgICAgICAgICAgICAgICAgdGVzdFVzZXJOYW1lLAogICAgICAgICAgICAgICAgICAgICBnZXRXaG8oKSwKICAgICAgICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgbWFrZUVwaGVtZXJhbEZsYWcpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gU3VjY2VzcywgdGhlIGV4cGVjdGVkIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgotICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIC8qIGZsYWdzICovIDApOworICAgICAgICAgICAgZmFpbCgiY3JlYXRlQW5kTWFuYWdlVXNlciBzaG91bGQgdGhyb3cgVXNlck9wZXJhdGlvbkV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChVc2VyTWFuYWdlci5Vc2VyT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhVc2VyTWFuYWdlci5VU0VSX09QRVJBVElPTl9FUlJPUl9MT1dfU1RPUkFHRSwgZS5nZXRVc2VyT3BlcmF0aW9uUmVzdWx0KCkpOwogICAgICAgICB9Ci0gICAgICAgIGZhaWwoImNyZWF0ZUFuZE1hbmFnZVVzZXIgc2hvdWxkIGhhdmUgdGhyb3duIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpOwogICAgIH0KIAotLy8gRGlzYWJsZWQgZHVlIHRvIGIvMjkwNzI3MjgKLS8vICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVBbmRNYW5hZ2VVc2VyX1NraXBTZXR1cFdpemFyZCgpIHsKLS8vICAgICAgICBjcmVhdGVBbmRNYW5hZ2VVc2VyVGVzdChEZXZpY2VQb2xpY3lNYW5hZ2VyLlNLSVBfU0VUVVBfV0laQVJEKTsKLS8vICAgIH0KLS8vCi0vLyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlQW5kTWFuYWdlVXNlcl9Eb250U2tpcFNldHVwV2l6YXJkKCkgewotLy8gICAgICAgIGlmICghbUFjdGl2aXR5TWFuYWdlci5pc1J1bm5pbmdJblRlc3RIYXJuZXNzKCkpIHsKLS8vICAgICAgICAgICAgLy8gSW4gdGVzdCBoYXJuZXNzLCB0aGUgc2V0dXAgd2l6YXJkIHdpbGwgYmUgZGlzYWJsZWQgYnkgZGVmYXVsdCwgc28gdGhpcyB0ZXN0IGlzIGFsd2F5cwotLy8gICAgICAgICAgICAvLyBmYWlsaW5nLgotLy8gICAgICAgICAgICBjcmVhdGVBbmRNYW5hZ2VVc2VyVGVzdCgwKTsKLS8vICAgICAgICB9Ci0vLyAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUFuZE1hbmFnZVVzZXJfTWF4VXNlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHRlc3RVc2VyTmFtZSA9ICJUZXN0VXNlcl8iICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmNyZWF0ZUFuZE1hbmFnZVVzZXIoCisgICAgICAgICAgICAgICAgICAgIGdldFdobygpLAorICAgICAgICAgICAgICAgICAgICB0ZXN0VXNlck5hbWUsCisgICAgICAgICAgICAgICAgICAgIGdldFdobygpLAorICAgICAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgIC8qIGZsYWdzICovIDApOworICAgICAgICAgICAgZmFpbCgiY3JlYXRlQW5kTWFuYWdlVXNlciBzaG91bGQgdGhyb3cgVXNlck9wZXJhdGlvbkV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChVc2VyTWFuYWdlci5Vc2VyT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhVc2VyTWFuYWdlci5VU0VSX09QRVJBVElPTl9FUlJPUl9NQVhfVVNFUlMsIGUuZ2V0VXNlck9wZXJhdGlvblJlc3VsdCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVBbmRNYW5hZ2VVc2VyX0dldFNlY29uZGFyeVVzZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyB0ZXN0VXNlck5hbWUgPSAiVGVzdFVzZXJfIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisgICAgICAgIFVzZXJIYW5kbGUgdXNlckhhbmRsZSA9IG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmNyZWF0ZUFuZE1hbmFnZVVzZXIoCisgICAgICAgICAgICAgICAgZ2V0V2hvKCksCisgICAgICAgICAgICAgICAgdGVzdFVzZXJOYW1lLAorICAgICAgICAgICAgICAgIGdldFdobygpLAorICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgLyogZmxhZ3MgKi8gMCk7CisgICAgICAgIExvZy5kKFRBRywgIlVzZXIgY3JlYXRlOiAiICsgdXNlckhhbmRsZSk7CisKKyAgICAgICAgTGlzdDxVc2VySGFuZGxlPiBzZWNvbmRhcnlVc2VycyA9IG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmdldFNlY29uZGFyeVVzZXJzKGdldFdobygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNlY29uZGFyeVVzZXJzLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh1c2VySGFuZGxlLCBzZWNvbmRhcnlVc2Vycy5nZXQoMCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVBbmRNYW5hZ2VVc2VyX1N3aXRjaFVzZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTG9jYWxCcm9hZGNhc3RNYW5hZ2VyIGxvY2FsQnJvYWRjYXN0TWFuYWdlciA9IExvY2FsQnJvYWRjYXN0TWFuYWdlci5nZXRJbnN0YW5jZSgKKyAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkpOworCisgICAgICAgIFN0cmluZyB0ZXN0VXNlck5hbWUgPSAiVGVzdFVzZXJfIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisgICAgICAgIFVzZXJIYW5kbGUgdXNlckhhbmRsZSA9IG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmNyZWF0ZUFuZE1hbmFnZVVzZXIoCisgICAgICAgICAgICAgICAgZ2V0V2hvKCksCisgICAgICAgICAgICAgICAgdGVzdFVzZXJOYW1lLAorICAgICAgICAgICAgICAgIGdldFdobygpLAorICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgLyogZmxhZ3MgKi8gMCk7CisgICAgICAgIExvZy5kKFRBRywgIlVzZXIgY3JlYXRlOiAiICsgdXNlckhhbmRsZSk7CisKKyAgICAgICAgTG9jYWxCcm9hZGNhc3RSZWNlaXZlciBicm9hZGNhc3RSZWNlaXZlciA9IG5ldyBMb2NhbEJyb2FkY2FzdFJlY2VpdmVyKCk7CisgICAgICAgIGxvY2FsQnJvYWRjYXN0TWFuYWdlci5yZWdpc3RlclJlY2VpdmVyKGJyb2FkY2FzdFJlY2VpdmVyLAorICAgICAgICAgICAgICAgIG5ldyBJbnRlbnRGaWx0ZXIoQmFzaWNBZG1pblJlY2VpdmVyLkFDVElPTl9VU0VSX1NXSVRDSEVEKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnN3aXRjaFVzZXIoZ2V0V2hvKCksIHVzZXJIYW5kbGUpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh1c2VySGFuZGxlLCBicm9hZGNhc3RSZWNlaXZlci53YWl0Rm9yQnJvYWRjYXN0UmVjZWl2ZWQoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBsb2NhbEJyb2FkY2FzdE1hbmFnZXIudW5yZWdpc3RlclJlY2VpdmVyKGJyb2FkY2FzdFJlY2VpdmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVBbmRNYW5hZ2VVc2VyX0Nhbm5vdFN0b3BDdXJyZW50VXNlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBMb2NhbEJyb2FkY2FzdE1hbmFnZXIgbG9jYWxCcm9hZGNhc3RNYW5hZ2VyID0gTG9jYWxCcm9hZGNhc3RNYW5hZ2VyLmdldEluc3RhbmNlKAorICAgICAgICAgICAgICAgIGdldENvbnRleHQoKSk7CisKKyAgICAgICAgU3RyaW5nIHRlc3RVc2VyTmFtZSA9ICJUZXN0VXNlcl8iICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKyAgICAgICAgVXNlckhhbmRsZSB1c2VySGFuZGxlID0gbURldmljZVBvbGljeU1hbmFnZXIuY3JlYXRlQW5kTWFuYWdlVXNlcigKKyAgICAgICAgICAgICAgICBnZXRXaG8oKSwKKyAgICAgICAgICAgICAgICB0ZXN0VXNlck5hbWUsCisgICAgICAgICAgICAgICAgZ2V0V2hvKCksCisgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAvKiBmbGFncyAqLyAwKTsKKyAgICAgICAgTG9nLmQoVEFHLCAiVXNlciBjcmVhdGU6ICIgKyB1c2VySGFuZGxlKTsKKworICAgICAgICBMb2NhbEJyb2FkY2FzdFJlY2VpdmVyIGJyb2FkY2FzdFJlY2VpdmVyID0gbmV3IExvY2FsQnJvYWRjYXN0UmVjZWl2ZXIoKTsKKyAgICAgICAgbG9jYWxCcm9hZGNhc3RNYW5hZ2VyLnJlZ2lzdGVyUmVjZWl2ZXIoYnJvYWRjYXN0UmVjZWl2ZXIsCisgICAgICAgICAgICAgICAgbmV3IEludGVudEZpbHRlcihCYXNpY0FkbWluUmVjZWl2ZXIuQUNUSU9OX1VTRVJfU1dJVENIRUQpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydFRydWUobURldmljZVBvbGljeU1hbmFnZXIuc3dpdGNoVXNlcihnZXRXaG8oKSwgdXNlckhhbmRsZSkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHVzZXJIYW5kbGUsIGJyb2FkY2FzdFJlY2VpdmVyLndhaXRGb3JCcm9hZGNhc3RSZWNlaXZlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhVc2VyTWFuYWdlci5VU0VSX09QRVJBVElPTl9FUlJPUl9DVVJSRU5UX1VTRVIsCisgICAgICAgICAgICAgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnN0b3BVc2VyKGdldFdobygpLCB1c2VySGFuZGxlKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBsb2NhbEJyb2FkY2FzdE1hbmFnZXIudW5yZWdpc3RlclJlY2VpdmVyKGJyb2FkY2FzdFJlY2VpdmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVBbmRNYW5hZ2VVc2VyX1N0YXJ0SW5CYWNrZ3JvdW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIExvY2FsQnJvYWRjYXN0TWFuYWdlciBsb2NhbEJyb2FkY2FzdE1hbmFnZXIgPSBMb2NhbEJyb2FkY2FzdE1hbmFnZXIuZ2V0SW5zdGFuY2UoCisgICAgICAgICAgICAgICAgZ2V0Q29udGV4dCgpKTsKKworICAgICAgICBTdHJpbmcgdGVzdFVzZXJOYW1lID0gIlRlc3RVc2VyXyIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworICAgICAgICBVc2VySGFuZGxlIHVzZXJIYW5kbGUgPSBtRGV2aWNlUG9saWN5TWFuYWdlci5jcmVhdGVBbmRNYW5hZ2VVc2VyKAorICAgICAgICAgICAgICAgIGdldFdobygpLAorICAgICAgICAgICAgICAgIHRlc3RVc2VyTmFtZSwKKyAgICAgICAgICAgICAgICBnZXRXaG8oKSwKKyAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgIC8qIGZsYWdzICovIDApOworICAgICAgICBMb2cuZChUQUcsICJVc2VyIGNyZWF0ZTogIiArIHVzZXJIYW5kbGUpOworCisgICAgICAgIExvY2FsQnJvYWRjYXN0UmVjZWl2ZXIgYnJvYWRjYXN0UmVjZWl2ZXIgPSBuZXcgTG9jYWxCcm9hZGNhc3RSZWNlaXZlcigpOworICAgICAgICBsb2NhbEJyb2FkY2FzdE1hbmFnZXIucmVnaXN0ZXJSZWNlaXZlcihicm9hZGNhc3RSZWNlaXZlciwKKyAgICAgICAgICAgICAgICBuZXcgSW50ZW50RmlsdGVyKEJhc2ljQWRtaW5SZWNlaXZlci5BQ1RJT05fVVNFUl9TVEFSVEVEKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIFN0YXJ0IHVzZXIgaW4gYmFja2dyb3VuZCBhbmQgd2FpdCBmb3Igb25Vc2VyU3RhcnRlZAorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFVzZXJNYW5hZ2VyLlVTRVJfT1BFUkFUSU9OX1NVQ0NFU1MsCisgICAgICAgICAgICAgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnN0YXJ0VXNlckluQmFja2dyb3VuZChnZXRXaG8oKSwgdXNlckhhbmRsZSkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHVzZXJIYW5kbGUsIGJyb2FkY2FzdFJlY2VpdmVyLndhaXRGb3JCcm9hZGNhc3RSZWNlaXZlZCgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGxvY2FsQnJvYWRjYXN0TWFuYWdlci51bnJlZ2lzdGVyUmVjZWl2ZXIoYnJvYWRjYXN0UmVjZWl2ZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUFuZE1hbmFnZVVzZXJfU3RhcnRJbkJhY2tncm91bmRfTWF4UnVubmluZ1VzZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyB0ZXN0VXNlck5hbWUgPSAiVGVzdFVzZXJfIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisgICAgICAgIFVzZXJIYW5kbGUgdXNlckhhbmRsZSA9IG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmNyZWF0ZUFuZE1hbmFnZVVzZXIoCisgICAgICAgICAgICAgICAgZ2V0V2hvKCksCisgICAgICAgICAgICAgICAgdGVzdFVzZXJOYW1lLAorICAgICAgICAgICAgICAgIGdldFdobygpLAorICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgLyogZmxhZ3MgKi8gMCk7CisgICAgICAgIExvZy5kKFRBRywgIlVzZXIgY3JlYXRlOiAiICsgdXNlckhhbmRsZSk7CisKKyAgICAgICAgLy8gU3RhcnQgdXNlciBpbiBiYWNrZ3JvdW5kIGFuZCBzaG91bGQgcmVjZWl2ZSBtYXggcnVubmluZyB1c2VycyBlcnJvcgorICAgICAgICBhc3NlcnRFcXVhbHMoVXNlck1hbmFnZXIuVVNFUl9PUEVSQVRJT05fRVJST1JfTUFYX1JVTk5JTkdfVVNFUlMsCisgICAgICAgICAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuc3RhcnRVc2VySW5CYWNrZ3JvdW5kKGdldFdobygpLCB1c2VySGFuZGxlKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUFuZE1hbmFnZVVzZXJfU3RvcFVzZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTG9jYWxCcm9hZGNhc3RNYW5hZ2VyIGxvY2FsQnJvYWRjYXN0TWFuYWdlciA9IExvY2FsQnJvYWRjYXN0TWFuYWdlci5nZXRJbnN0YW5jZSgKKyAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkpOworCisgICAgICAgIFN0cmluZyB0ZXN0VXNlck5hbWUgPSAiVGVzdFVzZXJfIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisgICAgICAgIFVzZXJIYW5kbGUgdXNlckhhbmRsZSA9IG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmNyZWF0ZUFuZE1hbmFnZVVzZXIoCisgICAgICAgICAgICAgICAgZ2V0V2hvKCksCisgICAgICAgICAgICAgICAgdGVzdFVzZXJOYW1lLAorICAgICAgICAgICAgICAgIGdldFdobygpLAorICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgLyogZmxhZ3MgKi8gMCk7CisgICAgICAgIExvZy5kKFRBRywgIlVzZXIgY3JlYXRlOiAiICsgdXNlckhhbmRsZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhVc2VyTWFuYWdlci5VU0VSX09QRVJBVElPTl9TVUNDRVNTLAorICAgICAgICAgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnN0YXJ0VXNlckluQmFja2dyb3VuZChnZXRXaG8oKSwgdXNlckhhbmRsZSkpOworCisgICAgICAgIExvY2FsQnJvYWRjYXN0UmVjZWl2ZXIgYnJvYWRjYXN0UmVjZWl2ZXIgPSBuZXcgTG9jYWxCcm9hZGNhc3RSZWNlaXZlcigpOworICAgICAgICBsb2NhbEJyb2FkY2FzdE1hbmFnZXIucmVnaXN0ZXJSZWNlaXZlcihicm9hZGNhc3RSZWNlaXZlciwKKyAgICAgICAgICAgICAgICBuZXcgSW50ZW50RmlsdGVyKEJhc2ljQWRtaW5SZWNlaXZlci5BQ1RJT05fVVNFUl9TVE9QUEVEKSk7CisKKyAgICAgICAgVGhyZWFkLnNsZWVwKFVTRVJfU1dJVENIX0RFTEFZKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFVzZXJNYW5hZ2VyLlVTRVJfT1BFUkFUSU9OX1NVQ0NFU1MsCisgICAgICAgICAgICAgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnN0b3BVc2VyKGdldFdobygpLCB1c2VySGFuZGxlKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModXNlckhhbmRsZSwgYnJvYWRjYXN0UmVjZWl2ZXIud2FpdEZvckJyb2FkY2FzdFJlY2VpdmVkKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgbG9jYWxCcm9hZGNhc3RNYW5hZ2VyLnVucmVnaXN0ZXJSZWNlaXZlcihicm9hZGNhc3RSZWNlaXZlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlQW5kTWFuYWdlVXNlcl9TdG9wRXBoZW1lcmFsVXNlcl9EaXNhbGxvd1JlbW92ZVVzZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTG9jYWxCcm9hZGNhc3RNYW5hZ2VyIGxvY2FsQnJvYWRjYXN0TWFuYWdlciA9IExvY2FsQnJvYWRjYXN0TWFuYWdlci5nZXRJbnN0YW5jZSgKKyAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkpOworCisgICAgICAgIFN0cmluZyB0ZXN0VXNlck5hbWUgPSAiVGVzdFVzZXJfIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisgICAgICAgIC8vIFNldCBESVNBTExPV19SRU1PVkVfVVNFUiByZXN0cmljdGlvbgorICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5hZGRVc2VyUmVzdHJpY3Rpb24oZ2V0V2hvKCksIFVzZXJNYW5hZ2VyLkRJU0FMTE9XX1JFTU9WRV9VU0VSKTsKKworICAgICAgICBVc2VySGFuZGxlIHVzZXJIYW5kbGUgPSBtRGV2aWNlUG9saWN5TWFuYWdlci5jcmVhdGVBbmRNYW5hZ2VVc2VyKAorICAgICAgICAgICAgICAgIGdldFdobygpLAorICAgICAgICAgICAgICAgIHRlc3RVc2VyTmFtZSwKKyAgICAgICAgICAgICAgICBnZXRXaG8oKSwKKyAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIuTUFLRV9VU0VSX0VQSEVNRVJBTCk7CisgICAgICAgIExvZy5kKFRBRywgIlVzZXIgY3JlYXRlOiAiICsgdXNlckhhbmRsZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhVc2VyTWFuYWdlci5VU0VSX09QRVJBVElPTl9TVUNDRVNTLAorICAgICAgICAgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnN0YXJ0VXNlckluQmFja2dyb3VuZChnZXRXaG8oKSwgdXNlckhhbmRsZSkpOworCisgICAgICAgIExvY2FsQnJvYWRjYXN0UmVjZWl2ZXIgYnJvYWRjYXN0UmVjZWl2ZXIgPSBuZXcgTG9jYWxCcm9hZGNhc3RSZWNlaXZlcigpOworICAgICAgICBsb2NhbEJyb2FkY2FzdE1hbmFnZXIucmVnaXN0ZXJSZWNlaXZlcihicm9hZGNhc3RSZWNlaXZlciwKKyAgICAgICAgICAgICAgICBuZXcgSW50ZW50RmlsdGVyKEJhc2ljQWRtaW5SZWNlaXZlci5BQ1RJT05fVVNFUl9TVEFSVEVEKSk7CisgICAgICAgIGJyb2FkY2FzdFJlY2VpdmVyLndhaXRGb3JCcm9hZGNhc3RSZWNlaXZlZCgpOworICAgICAgICBsb2NhbEJyb2FkY2FzdE1hbmFnZXIudW5yZWdpc3RlclJlY2VpdmVyKGJyb2FkY2FzdFJlY2VpdmVyKTsKKworICAgICAgICAvLyBSZWdpc3RlciBicm9hZGNhc3QgcmVjZWl2ZXIgZm9yIHRoZSByZW1vdmUgYWN0aW9uLgorICAgICAgICBsb2NhbEJyb2FkY2FzdE1hbmFnZXIucmVnaXN0ZXJSZWNlaXZlcihicm9hZGNhc3RSZWNlaXZlciwKKyAgICAgICAgICAgICAgICBuZXcgSW50ZW50RmlsdGVyKEJhc2ljQWRtaW5SZWNlaXZlci5BQ1RJT05fVVNFUl9SRU1PVkVEKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoVXNlck1hbmFnZXIuVVNFUl9PUEVSQVRJT05fU1VDQ0VTUywKKyAgICAgICAgICAgICAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuc3RvcFVzZXIoZ2V0V2hvKCksIHVzZXJIYW5kbGUpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh1c2VySGFuZGxlLCBicm9hZGNhc3RSZWNlaXZlci53YWl0Rm9yQnJvYWRjYXN0UmVjZWl2ZWQoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBsb2NhbEJyb2FkY2FzdE1hbmFnZXIudW5yZWdpc3RlclJlY2VpdmVyKGJyb2FkY2FzdFJlY2VpdmVyKTsKKyAgICAgICAgICAgIC8vIENsZWFyIERJU0FMTE9XX1JFTU9WRV9VU0VSIHJlc3RyaWN0aW9uCisgICAgICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5jbGVhclVzZXJSZXN0cmljdGlvbihnZXRXaG8oKSwgVXNlck1hbmFnZXIuRElTQUxMT1dfUkVNT1ZFX1VTRVIpOworICAgICAgICB9CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2dvdXRVc2VyKENvbnRleHQgY29udGV4dCwgRGV2aWNlUG9saWN5TWFuYWdlciBkZXZpY2VQb2xpY3lNYW5hZ2VyLAorICAgICAgICAgICAgQ29tcG9uZW50TmFtZSBjb21wb25lbnROYW1lKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiY2Fubm90IGxvZ291dCB1c2VyIiwgVXNlck1hbmFnZXIuVVNFUl9PUEVSQVRJT05fU1VDQ0VTUywKKyAgICAgICAgICAgICAgICBkZXZpY2VQb2xpY3lNYW5hZ2VyLmxvZ291dFVzZXIoY29tcG9uZW50TmFtZSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVBbmRNYW5hZ2VVc2VyX0xvZ291dFVzZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTG9jYWxCcm9hZGNhc3RNYW5hZ2VyIGxvY2FsQnJvYWRjYXN0TWFuYWdlciA9IExvY2FsQnJvYWRjYXN0TWFuYWdlci5nZXRJbnN0YW5jZSgKKyAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkpOworCisgICAgICAgIExvY2FsQnJvYWRjYXN0UmVjZWl2ZXIgYnJvYWRjYXN0UmVjZWl2ZXIgPSBuZXcgTG9jYWxCcm9hZGNhc3RSZWNlaXZlcigpOworICAgICAgICBsb2NhbEJyb2FkY2FzdE1hbmFnZXIucmVnaXN0ZXJSZWNlaXZlcihicm9hZGNhc3RSZWNlaXZlciwKKyAgICAgICAgICAgICAgICBuZXcgSW50ZW50RmlsdGVyKEJhc2ljQWRtaW5SZWNlaXZlci5BQ1RJT05fVVNFUl9TVE9QUEVEKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFVzZXJIYW5kbGUgdXNlckhhbmRsZSA9IHJ1bkNyb3NzVXNlclZlcmlmaWNhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlQW5kTWFuYWdlVXNlckZsYWdzICovIDAsICJsb2dvdXRVc2VyIik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModXNlckhhbmRsZSwgYnJvYWRjYXN0UmVjZWl2ZXIud2FpdEZvckJyb2FkY2FzdFJlY2VpdmVkKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgbG9jYWxCcm9hZGNhc3RNYW5hZ2VyLnVucmVnaXN0ZXJSZWNlaXZlcihicm9hZGNhc3RSZWNlaXZlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydEFmZmlsaWF0ZWRVc2VyKENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIgZGV2aWNlUG9saWN5TWFuYWdlciwgQ29tcG9uZW50TmFtZSBjb21wb25lbnROYW1lKSB7CisgICAgICAgIGFzc2VydFRydWUoIm5vdCBhZmZpbGlhdGVkIHVzZXIiLCBkZXZpY2VQb2xpY3lNYW5hZ2VyLmlzQWZmaWxpYXRlZFVzZXIoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUFuZE1hbmFnZVVzZXJfQWZmaWxpYXRlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBydW5Dcm9zc1VzZXJWZXJpZmljYXRpb24oLyogY3JlYXRlQW5kTWFuYWdlVXNlckZsYWdzICovIDAsICJhc3NlcnRBZmZpbGlhdGVkVXNlciIpOworICAgICAgICBQcmltYXJ5VXNlclNlcnZpY2UuYXNzZXJ0Q3Jvc3NVc2VyQ2FsbEFycml2ZWQoKTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydEVwaGVtZXJhbFVzZXIoQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlciBkZXZpY2VQb2xpY3lNYW5hZ2VyLCBDb21wb25lbnROYW1lIGNvbXBvbmVudE5hbWUpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgibm90IGVwaGVtZXJhbCB1c2VyIiwgZGV2aWNlUG9saWN5TWFuYWdlci5pc0VwaGVtZXJhbFVzZXIoY29tcG9uZW50TmFtZSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVBbmRNYW5hZ2VVc2VyX0VwaGVtZXJhbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBydW5Dcm9zc1VzZXJWZXJpZmljYXRpb24oRGV2aWNlUG9saWN5TWFuYWdlci5NQUtFX1VTRVJfRVBIRU1FUkFMLCAiYXNzZXJ0RXBoZW1lcmFsVXNlciIpOworICAgICAgICBQcmltYXJ5VXNlclNlcnZpY2UuYXNzZXJ0Q3Jvc3NVc2VyQ2FsbEFycml2ZWQoKTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydEFsbFN5c3RlbUFwcHNJbnN0YWxsZWQoQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlciBkZXZpY2VQb2xpY3lNYW5hZ2VyLCBDb21wb25lbnROYW1lIGNvbXBvbmVudE5hbWUpIHsKKyAgICAgICAgUGFja2FnZU1hbmFnZXIgcGFja2FnZU1hbmFnZXIgPSBjb250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgIC8vIEZpcnN0IGdldCBhIHNldCBvZiBpbnN0YWxsZWQgcGFja2FnZSBuYW1lcworICAgICAgICBTZXQ8U3RyaW5nPiBpbnN0YWxsZWRQYWNrYWdlTmFtZXMgPSBwYWNrYWdlTWFuYWdlcgorICAgICAgICAgICAgICAgIC5nZXRJbnN0YWxsZWRBcHBsaWNhdGlvbnMoLyogZmxhZ3MgKi8gMCkKKyAgICAgICAgICAgICAgICAuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAubWFwKGFwcGxpY2F0aW9uSW5mbyAtPiBhcHBsaWNhdGlvbkluZm8ucGFja2FnZU5hbWUpCisgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b1NldCgpKTsKKyAgICAgICAgLy8gVGhlbiBmaWx0ZXIgYWxsIHBhY2thZ2UgbmFtZXMgYnkgdGhvc2UgdGhhdCBhcmUgbm90IGluc3RhbGxlZAorICAgICAgICBTZXQ8U3RyaW5nPiB1bmluc3RhbGxlZFBhY2thZ2VOYW1lcyA9IHBhY2thZ2VNYW5hZ2VyCisgICAgICAgICAgICAgICAgLmdldEluc3RhbGxlZEFwcGxpY2F0aW9ucyhQYWNrYWdlTWFuYWdlci5NQVRDSF9VTklOU1RBTExFRF9QQUNLQUdFUykKKyAgICAgICAgICAgICAgICAuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAubWFwKGFwcGxpY2F0aW9uSW5mbyAtPiBhcHBsaWNhdGlvbkluZm8ucGFja2FnZU5hbWUpCisgICAgICAgICAgICAgICAgLmZpbHRlcigoKFByZWRpY2F0ZTxTdHJpbmc+KSBpbnN0YWxsZWRQYWNrYWdlTmFtZXM6OmNvbnRhaW5zKS5uZWdhdGUoKSkKKyAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpOworICAgICAgICAvLyBBc3NlcnQgdGhhdCBhbGwgYXBwcyBhcmUgaW5zdGFsbGVkCisgICAgICAgIGFzc2VydFRydWUoInN5c3RlbSBhcHBzIG5vdCBpbnN0YWxsZWQ6ICIgKyB1bmluc3RhbGxlZFBhY2thZ2VOYW1lcywKKyAgICAgICAgICAgICAgICB1bmluc3RhbGxlZFBhY2thZ2VOYW1lcy5pc0VtcHR5KCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVBbmRNYW5hZ2VVc2VyX0xlYXZlQWxsU3lzdGVtQXBwcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBydW5Dcm9zc1VzZXJWZXJpZmljYXRpb24oCisgICAgICAgICAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlci5MRUFWRV9BTExfU1lTVEVNX0FQUFNfRU5BQkxFRCwgImFzc2VydEFsbFN5c3RlbUFwcHNJbnN0YWxsZWQiKTsKKyAgICAgICAgUHJpbWFyeVVzZXJTZXJ2aWNlLmFzc2VydENyb3NzVXNlckNhbGxBcnJpdmVkKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBVc2VySGFuZGxlIHJ1bkNyb3NzVXNlclZlcmlmaWNhdGlvbihpbnQgY3JlYXRlQW5kTWFuYWdlVXNlckZsYWdzLCBTdHJpbmcgbWV0aG9kTmFtZSkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgdGVzdFVzZXJOYW1lID0gIlRlc3RVc2VyXyIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworICAgICAgICAvLyBTZXQgYWZmaWxpYXRpb24gaWQgdG8gYWxsb3cgY29tbXVuaWNhdGlvbi4KKyAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuc2V0QWZmaWxpYXRpb25JZHMoZ2V0V2hvKCksIENvbGxlY3Rpb25zLnNpbmdsZXRvbihBRkZJTElBVElPTl9JRCkpOworCisgICAgICAgIC8vIFBhY2sgdGhlIGFmZmlsaWF0aW9uIGlkIGluIGEgYnVuZGxlIHNvIHRoZSBzZWNvbmRhcnkgdXNlciBjYW4gZ2V0IGl0LgorICAgICAgICBQZXJzaXN0YWJsZUJ1bmRsZSBidW5kbGUgPSBuZXcgUGVyc2lzdGFibGVCdW5kbGUoKTsKKyAgICAgICAgYnVuZGxlLnB1dFN0cmluZyhFWFRSQV9BRkZJTElBVElPTl9JRCwgQUZGSUxJQVRJT05fSUQpOworICAgICAgICBidW5kbGUucHV0U3RyaW5nKEVYVFJBX01FVEhPRF9OQU1FLCBtZXRob2ROYW1lKTsKKworICAgICAgICBVc2VySGFuZGxlIHVzZXJIYW5kbGUgPSBtRGV2aWNlUG9saWN5TWFuYWdlci5jcmVhdGVBbmRNYW5hZ2VVc2VyKAorICAgICAgICAgICAgICAgIGdldFdobygpLAorICAgICAgICAgICAgICAgIHRlc3RVc2VyTmFtZSwKKyAgICAgICAgICAgICAgICBTZWNvbmRhcnlVc2VyQWRtaW5SZWNlaXZlci5nZXRDb21wb25lbnROYW1lKGdldENvbnRleHQoKSksCisgICAgICAgICAgICAgICAgYnVuZGxlLAorICAgICAgICAgICAgICAgIGNyZWF0ZUFuZE1hbmFnZVVzZXJGbGFncyk7CisgICAgICAgIExvZy5kKFRBRywgIlVzZXIgY3JlYXRlOiAiICsgdXNlckhhbmRsZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhVc2VyTWFuYWdlci5VU0VSX09QRVJBVElPTl9TVUNDRVNTLAorICAgICAgICAgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnN0YXJ0VXNlckluQmFja2dyb3VuZChnZXRXaG8oKSwgdXNlckhhbmRsZSkpOworCisgICAgICAgIHJldHVybiB1c2VySGFuZGxlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVBbmRNYW5hZ2VVc2VyX1NraXBTZXR1cFdpemFyZCgpIHsKKyAgICAgICAgY3JlYXRlQW5kTWFuYWdlVXNlclRlc3QoRGV2aWNlUG9saWN5TWFuYWdlci5TS0lQX1NFVFVQX1dJWkFSRCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUFuZE1hbmFnZVVzZXJfRG9udFNraXBTZXR1cFdpemFyZCgpIHsKKyAgICAgICAgaWYgKCFtQWN0aXZpdHlNYW5hZ2VyLmlzUnVubmluZ0luVGVzdEhhcm5lc3MoKSkgeworICAgICAgICAgICAgLy8gSW4gdGVzdCBoYXJuZXNzLCB0aGUgc2V0dXAgd2l6YXJkIHdpbGwgYmUgZGlzYWJsZWQgYnkgZGVmYXVsdCwgc28gdGhpcyB0ZXN0IGlzIGFsd2F5cworICAgICAgICAgICAgLy8gZmFpbGluZy4KKyAgICAgICAgICAgIGNyZWF0ZUFuZE1hbmFnZVVzZXJUZXN0KDApOworICAgICAgICB9CisgICAgfQogCiAgICAgLy8gY3JlYXRlQW5kTWFuYWdlVXNlciBzaG91bGQgY2lyY3VtdmVudCB0aGUgRElTQUxMT1dfQUREX1VTRVIgcmVzdHJpY3Rpb24KICAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlQW5kTWFuYWdlVXNlcl9BZGRSZXN0cmljdGlvblNldCgpIHsKICAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuYWRkVXNlclJlc3RyaWN0aW9uKGdldFdobygpLCBVc2VyTWFuYWdlci5ESVNBTExPV19BRERfVVNFUik7CiAKLSAgICAgICAgbVVzZXJIYW5kbGUgPSBtRGV2aWNlUG9saWN5TWFuYWdlci5jcmVhdGVBbmRNYW5hZ2VVc2VyKGdldFdobygpLCAiVGVzdCBVc2VyIiwgZ2V0V2hvKCksCi0gICAgICAgICAgICAgICAgbnVsbCwgMCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwobVVzZXJIYW5kbGUpOworICAgICAgICBVc2VySGFuZGxlIHVzZXJIYW5kbGUgPSBtRGV2aWNlUG9saWN5TWFuYWdlci5jcmVhdGVBbmRNYW5hZ2VVc2VyKGdldFdobygpLCAiVGVzdCBVc2VyIiwKKyAgICAgICAgICAgICAgICBnZXRXaG8oKSwgbnVsbCwgMCk7CisgICAgICAgIGFzc2VydE5vdE51bGwodXNlckhhbmRsZSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUFuZE1hbmFnZVVzZXJfUmVtb3ZlUmVzdHJpY3Rpb25TZXQoKSB7CiAgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmFkZFVzZXJSZXN0cmljdGlvbihnZXRXaG8oKSwgVXNlck1hbmFnZXIuRElTQUxMT1dfUkVNT1ZFX1VTRVIpOwogCi0gICAgICAgIG1Vc2VySGFuZGxlID0gbURldmljZVBvbGljeU1hbmFnZXIuY3JlYXRlQW5kTWFuYWdlVXNlcihnZXRXaG8oKSwgIlRlc3QgVXNlciIsIGdldFdobygpLAotICAgICAgICAgICAgICAgIG51bGwsIDApOwotICAgICAgICBhc3NlcnROb3ROdWxsKG1Vc2VySGFuZGxlKTsKKyAgICAgICAgVXNlckhhbmRsZSB1c2VySGFuZGxlID0gbURldmljZVBvbGljeU1hbmFnZXIuY3JlYXRlQW5kTWFuYWdlVXNlcihnZXRXaG8oKSwgIlRlc3QgVXNlciIsCisgICAgICAgICAgICAgICAgZ2V0V2hvKCksIG51bGwsIDApOworICAgICAgICBhc3NlcnROb3ROdWxsKHVzZXJIYW5kbGUpOwogCi0gICAgICAgIGJvb2xlYW4gcmVtb3ZlZCA9IG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnJlbW92ZVVzZXIoZ2V0V2hvKCksIG1Vc2VySGFuZGxlKTsKKyAgICAgICAgYm9vbGVhbiByZW1vdmVkID0gbURldmljZVBvbGljeU1hbmFnZXIucmVtb3ZlVXNlcihnZXRXaG8oKSwgdXNlckhhbmRsZSk7CiAgICAgICAgIC8vIFdoZW4gdGhlIGRldmljZSBvd25lciBpdHNlbGYgaGFzIHNldCB0aGUgdXNlciByZXN0cmljdGlvbiwgaXQgc2hvdWxkIHN0aWxsIGJlIGFsbG93ZWQKICAgICAgICAgLy8gdG8gcmVtb3ZlIGEgdXNlci4KICAgICAgICAgYXNzZXJ0VHJ1ZShyZW1vdmVkKTsKQEAgLTI4MywyMCArNTY2LDIyIEBACiAgICAgICAgIExvY2FsQnJvYWRjYXN0UmVjZWl2ZXIgcmVjZWl2ZXIgPSBuZXcgTG9jYWxCcm9hZGNhc3RSZWNlaXZlcigpOwogICAgICAgICBMb2NhbEJyb2FkY2FzdE1hbmFnZXIgbG9jYWxCcm9hZGNhc3RNYW5hZ2VyID0gTG9jYWxCcm9hZGNhc3RNYW5hZ2VyLmdldEluc3RhbmNlKAogICAgICAgICAgICAgICAgIGdldENvbnRleHQoKSk7Ci0gICAgICAgIGxvY2FsQnJvYWRjYXN0TWFuYWdlci5yZWdpc3RlclJlY2VpdmVyKHJlY2VpdmVyLCBuZXcgSW50ZW50RmlsdGVyKEFDVElPTl9VU0VSX0FEREVEKSk7CisgICAgICAgIGxvY2FsQnJvYWRjYXN0TWFuYWdlci5yZWdpc3RlclJlY2VpdmVyKHJlY2VpdmVyLAorICAgICAgICAgICAgICAgIG5ldyBJbnRlbnRGaWx0ZXIoQmFzaWNBZG1pblJlY2VpdmVyLkFDVElPTl9VU0VSX0FEREVEKSk7CisgICAgICAgIFVzZXJIYW5kbGUgdXNlckhhbmRsZTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1Vc2VySGFuZGxlID0gbURldmljZVBvbGljeU1hbmFnZXIuY3JlYXRlQW5kTWFuYWdlVXNlcihnZXRXaG8oKSwgIlRlc3QgVXNlciIsIGdldFdobygpLAorICAgICAgICAgICAgdXNlckhhbmRsZSA9IG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmNyZWF0ZUFuZE1hbmFnZVVzZXIoZ2V0V2hvKCksICJUZXN0IFVzZXIiLCBnZXRXaG8oKSwKICAgICAgICAgICAgICAgICAgICAgbnVsbCwgMCk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1Vc2VySGFuZGxlKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhtVXNlckhhbmRsZSwgcmVjZWl2ZXIud2FpdEZvckJyb2FkY2FzdFJlY2VpdmVkKCkpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCh1c2VySGFuZGxlKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh1c2VySGFuZGxlLCByZWNlaXZlci53YWl0Rm9yQnJvYWRjYXN0UmVjZWl2ZWQoKSk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBsb2NhbEJyb2FkY2FzdE1hbmFnZXIudW5yZWdpc3RlclJlY2VpdmVyKHJlY2VpdmVyKTsKICAgICAgICAgfQotICAgICAgICBsb2NhbEJyb2FkY2FzdE1hbmFnZXIucmVnaXN0ZXJSZWNlaXZlcihyZWNlaXZlciwgbmV3IEludGVudEZpbHRlcihBQ1RJT05fVVNFUl9SRU1PVkVEKSk7CisgICAgICAgIGxvY2FsQnJvYWRjYXN0TWFuYWdlci5yZWdpc3RlclJlY2VpdmVyKHJlY2VpdmVyLAorICAgICAgICAgICAgICAgIG5ldyBJbnRlbnRGaWx0ZXIoQmFzaWNBZG1pblJlY2VpdmVyLkFDVElPTl9VU0VSX1JFTU9WRUQpKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydFRydWUobURldmljZVBvbGljeU1hbmFnZXIucmVtb3ZlVXNlcihnZXRXaG8oKSwgbVVzZXJIYW5kbGUpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhtVXNlckhhbmRsZSwgcmVjZWl2ZXIud2FpdEZvckJyb2FkY2FzdFJlY2VpdmVkKCkpOwotICAgICAgICAgICAgbVVzZXJIYW5kbGUgPSBudWxsOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRGV2aWNlUG9saWN5TWFuYWdlci5yZW1vdmVVc2VyKGdldFdobygpLCB1c2VySGFuZGxlKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModXNlckhhbmRsZSwgcmVjZWl2ZXIud2FpdEZvckJyb2FkY2FzdFJlY2VpdmVkKCkpOwogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgbG9jYWxCcm9hZGNhc3RNYW5hZ2VyLnVucmVnaXN0ZXJSZWNlaXZlcihyZWNlaXZlcik7CiAgICAgICAgIH0KQEAgLTMwNyw3ICs1OTIsNyBAQAogCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgICAgICBVc2VySGFuZGxlIHVzZXJIYW5kbGUgPSBpbnRlbnQuZ2V0UGFyY2VsYWJsZUV4dHJhKEVYVFJBX1VTRVJfSEFORExFKTsKKyAgICAgICAgICAgIFVzZXJIYW5kbGUgdXNlckhhbmRsZSA9IGludGVudC5nZXRQYXJjZWxhYmxlRXh0cmEoQmFzaWNBZG1pblJlY2VpdmVyLkVYVFJBX1VTRVJfSEFORExFKTsKICAgICAgICAgICAgIExvZy5kKFRBRywgImJyb2FkY2FzdCByZWNlaXZlciByZWNlaXZlZCAiICsgaW50ZW50ICsgIiB3aXRoIHVzZXJIYW5kbGUgIgogICAgICAgICAgICAgICAgICAgICArIHVzZXJIYW5kbGUpOwogICAgICAgICAgICAgbVF1ZXVlLm9mZmVyKHVzZXJIYW5kbGUpOwpAQCAtMzE4LDQgKzYwMyw5NSBAQAogICAgICAgICAgICAgcmV0dXJuIG1RdWV1ZS5wb2xsKEJST0FEQ0FTVF9USU1FT1VULCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOwogICAgICAgICB9CiAgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBQcmltYXJ5VXNlclNlcnZpY2UgZXh0ZW5kcyBTZXJ2aWNlIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2VtYXBob3JlIHNTZW1hcGhvcmUgPSBuZXcgU2VtYXBob3JlKDApOworICAgICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc0Vycm9yID0gbnVsbDsKKworICAgICAgICBwcml2YXRlIGZpbmFsIElDcm9zc1VzZXJTZXJ2aWNlLlN0dWIgbUJpbmRlciA9IG5ldyBJQ3Jvc3NVc2VyU2VydmljZS5TdHViKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25FbmFibGVkQ2FsbGVkKFN0cmluZyBlcnJvcikgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm9uRW5hYmxlZENhbGxlZCBvbiBwcmltYXJ5IHVzZXIiKTsKKyAgICAgICAgICAgICAgICBzRXJyb3IgPSBlcnJvcjsKKyAgICAgICAgICAgICAgICBzU2VtYXBob3JlLnJlbGVhc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIElCaW5kZXIgb25CaW5kKEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgICAgIHJldHVybiBtQmluZGVyOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIHZvaWQgYXNzZXJ0Q3Jvc3NVc2VyQ2FsbEFycml2ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoc1NlbWFwaG9yZS50cnlBY3F1aXJlKE9OX0VOQUJMRURfVElNRU9VVF9TRUNPTkRTLCBUaW1lVW5pdC5TRUNPTkRTKSk7CisgICAgICAgICAgICBpZiAoc0Vycm9yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKHNFcnJvcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFNlY29uZGFyeVVzZXJBZG1pblJlY2VpdmVyIGV4dGVuZHMgRGV2aWNlQWRtaW5SZWNlaXZlciB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkVuYWJsZWQoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJvbkVuYWJsZWQgY2FsbGVkIik7CisgICAgICAgICAgICBEZXZpY2VQb2xpY3lNYW5hZ2VyIGRwbSA9IGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShEZXZpY2VQb2xpY3lNYW5hZ2VyLmNsYXNzKTsKKyAgICAgICAgICAgIENvbXBvbmVudE5hbWUgd2hvID0gZ2V0Q29tcG9uZW50TmFtZShjb250ZXh0KTsKKworICAgICAgICAgICAgLy8gU2V0IGFmZmlsaWF0aW9uIGlkcworICAgICAgICAgICAgZHBtLnNldEFmZmlsaWF0aW9uSWRzKAorICAgICAgICAgICAgICAgICAgICB3aG8sIENvbGxlY3Rpb25zLnNpbmdsZXRvbihpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoRVhUUkFfQUZGSUxJQVRJT05fSUQpKSk7CisKKyAgICAgICAgICAgIFN0cmluZyBlcnJvciA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSBDcmVhdGVBbmRNYW5hZ2VVc2VyVGVzdC5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVudC5nZXRTdHJpbmdFeHRyYShFWFRSQV9NRVRIT0RfTkFNRSksIENvbnRleHQuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VQb2xpY3lNYW5hZ2VyLmNsYXNzLCBDb21wb25lbnROYW1lLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBtZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKKyAgICAgICAgICAgICAgICBtZXRob2QuaW52b2tlKG51bGwsIGNvbnRleHQsIGRwbSwgd2hvKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB8IElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGVycm9yID0gZS50b1N0cmluZygpOworICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZXJyb3IgPSBlLmdldENhdXNlKCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ2FsbCBhbGwgYWZmaWxpYXRlZCB1c2VycworICAgICAgICAgICAgZmluYWwgTGlzdDxVc2VySGFuZGxlPiB0YXJnZXRVc2VycyA9IGRwbS5nZXRCaW5kRGV2aWNlQWRtaW5UYXJnZXRVc2Vycyh3aG8pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHRhcmdldFVzZXJzLnNpemUoKSk7CisgICAgICAgICAgICBwaW5nVGFyZ2V0VXNlcihjb250ZXh0LCBkcG0sIHRhcmdldFVzZXJzLmdldCgwKSwgZXJyb3IpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHBpbmdUYXJnZXRVc2VyKENvbnRleHQgY29udGV4dCwgRGV2aWNlUG9saWN5TWFuYWdlciBkcG0sIFVzZXJIYW5kbGUgdGFyZ2V0LAorICAgICAgICAgICAgICAgIFN0cmluZyBlcnJvcikgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiUGluZ2luZyB0YXJnZXQ6ICIgKyB0YXJnZXQpOworICAgICAgICAgICAgZmluYWwgU2VydmljZUNvbm5lY3Rpb24gc2VydmljZUNvbm5lY3Rpb24gPSBuZXcgU2VydmljZUNvbm5lY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKENvbXBvbmVudE5hbWUgbmFtZSwgSUJpbmRlciBzZXJ2aWNlKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm9uU2VydmljZUNvbm5lY3RlZCBpcyBjYWxsZWQgaW4gIiArIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgSUNyb3NzVXNlclNlcnZpY2UgY3Jvc3NVc2VyU2VydmljZSA9IElDcm9zc1VzZXJTZXJ2aWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlN0dWIuYXNJbnRlcmZhY2Uoc2VydmljZSk7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjcm9zc1VzZXJTZXJ2aWNlLm9uRW5hYmxlZENhbGxlZChlcnJvcik7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3Igd2hlbiBjYWxsaW5nIHByaW1hcnkgdXNlciIsIHJlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdGhpbmcsIHByaW1hcnkgdXNlciB3aWxsIHRpbWUgb3V0CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VEaXNjb25uZWN0ZWQoQ29tcG9uZW50TmFtZSBuYW1lKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm9uU2VydmljZURpc2Nvbm5lY3RlZCBpcyBjYWxsZWQiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgZmluYWwgSW50ZW50IHNlcnZpY2VJbnRlbnQgPSBuZXcgSW50ZW50KGNvbnRleHQsIFByaW1hcnlVc2VyU2VydmljZS5jbGFzcyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGRwbS5iaW5kRGV2aWNlQWRtaW5TZXJ2aWNlQXNVc2VyKAorICAgICAgICAgICAgICAgICAgICBnZXRDb21wb25lbnROYW1lKGNvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlSW50ZW50LAorICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlQ29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgQ29udGV4dC5CSU5EX0FVVE9fQ1JFQVRFLAorICAgICAgICAgICAgICAgICAgICB0YXJnZXQpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQ29tcG9uZW50TmFtZSBnZXRDb21wb25lbnROYW1lKENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnROYW1lKGNvbnRleHQsIFNlY29uZGFyeVVzZXJBZG1pblJlY2VpdmVyLmNsYXNzKTsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZW93bmVyL0RldmljZU93bmVyUHJvdmlzaW9uaW5nVGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlb3duZXIvRGV2aWNlT3duZXJQcm92aXNpb25pbmdUZXN0LmphdmEKaW5kZXggNDkwNTdhMC4uMjI0MDFiMyAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlb3duZXIvRGV2aWNlT3duZXJQcm92aXNpb25pbmdUZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlb3duZXIvRGV2aWNlT3duZXJQcm92aXNpb25pbmdUZXN0LmphdmEKQEAgLTI2LDcgKzI2LDYgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ2RkVGVzdDsKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLmRldmljZXBvbGljeS5wcm92aXNpb25pbmcuU2lsZW50UHJvdmlzaW9uaW5nVGVzdE1hbmFnZXI7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKQEAgLTU0LDcgKzUzLDYgQEAKICAgICAgICAgc3VwZXIudGVhckRvd24oKTsKICAgICB9CiAKLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iMy45LjEuMS9DLTEtNCIpCiAgICAgcHVibGljIHZvaWQgdGVzdFByb3Zpc2lvbkRldmljZU93bmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGRldmljZU93bmVyUHJvdmlzaW9uKGdldEJhc2VQcm92aXNpb25pbmdJbnRlbnQoKSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlb3duZXIvRm9yY2VFcGhlbWVyYWxVc2Vyc1Rlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZW93bmVyL0ZvcmNlRXBoZW1lcmFsVXNlcnNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZmE0YjIuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlb3duZXIvRm9yY2VFcGhlbWVyYWxVc2Vyc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5kZXZpY2Vvd25lcjsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLmFkbWluLkRldmljZVBvbGljeU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotLyoqCi0gKiBUZXN0IHtAbGluayBEZXZpY2VQb2xpY3lNYW5hZ2VyI2dldEZvcmNlRXBoZW1lcmFsVXNlcn0gYW5kCi0gKiB7QGxpbmsgRGV2aWNlUG9saWN5TWFuYWdlciNzZXRGb3JjZUVwaGVtZXJhbFVzZXJ9LgotICoKLSAqIDxwPlRoZSB0ZXN0IHRvZ2dsZXMgZm9yY2UtZXBoZW1lcmFsLXVzZXIgcG9saWN5IG9uIGFuZCBsZWF2ZXMgaXQgdGhhdCB3YXkgd2hpY2ggZW5hYmxlcwotICogY29tYmluaW5nIGl0IHdpdGggYWRkaXRpb25hbCBob3N0LXNpZGUgdGVzdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBGb3JjZUVwaGVtZXJhbFVzZXJzVGVzdCBleHRlbmRzIEJhc2VEZXZpY2VPd25lclRlc3QgewotCi0gICAgLyoqCi0gICAgICogVGVzdCBzZXR0aW5nIGFuZCBzdWJzZXF1ZW50bHkgZ2V0dGluZyB0aGUgZm9yY2UtZXBoZW1lcmFsLXVzZXIgcG9saWN5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRGb3JjZUVwaGVtZXJhbFVzZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1ldGhvZCBzZXRGb3JjZUVwaGVtZXJhbFVzZXJzTWV0aG9kID0gRGV2aWNlUG9saWN5TWFuYWdlci5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZCgKLSAgICAgICAgICAgICAgICAic2V0Rm9yY2VFcGhlbWVyYWxVc2VycyIsIENvbXBvbmVudE5hbWUuY2xhc3MsIGJvb2xlYW4uY2xhc3MpOwotICAgICAgICBzZXRGb3JjZUVwaGVtZXJhbFVzZXJzTWV0aG9kLmludm9rZShtRGV2aWNlUG9saWN5TWFuYWdlciwgZ2V0V2hvKCksIHRydWUpOwotCi0gICAgICAgIE1ldGhvZCBnZXRGb3JjZUVwaGVtZXJhbFVzZXJzTWV0aG9kID0gRGV2aWNlUG9saWN5TWFuYWdlci5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZCgKLSAgICAgICAgICAgICAgICAiZ2V0Rm9yY2VFcGhlbWVyYWxVc2VycyIsIENvbXBvbmVudE5hbWUuY2xhc3MpOwotICAgICAgICBhc3NlcnRUcnVlKChib29sZWFuKSBnZXRGb3JjZUVwaGVtZXJhbFVzZXJzTWV0aG9kLmludm9rZShtRGV2aWNlUG9saWN5TWFuYWdlciwgZ2V0V2hvKCkpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXR0aW5nIGZvcmNlLWVwaGVtZXJhbC11c2VyIHBvbGljeSBzaG91bGQgZmFpbCBpZiBub3Qgb24gc3lzdGVtIHdpdGggc3BsaXQgc3lzdGVtIHVzZXIuCi0gICAgICoKLSAgICAgKiA8cD5UbyBiZSBydW4gb24gc3lzdGVtcyB3aXRob3V0IHNwbGl0IHN5c3RlbSB1c2VyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRGb3JjZUVwaGVtZXJhbFVzZXJzRmFpbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTWV0aG9kIHNldEZvcmNlRXBoZW1lcmFsVXNlcnNNZXRob2QgPSBEZXZpY2VQb2xpY3lNYW5hZ2VyLmNsYXNzLmdldERlY2xhcmVkTWV0aG9kKAotICAgICAgICAgICAgICAgICJzZXRGb3JjZUVwaGVtZXJhbFVzZXJzIiwgQ29tcG9uZW50TmFtZS5jbGFzcywgYm9vbGVhbi5jbGFzcyk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXRGb3JjZUVwaGVtZXJhbFVzZXJzTWV0aG9kLmludm9rZShtRGV2aWNlUG9saWN5TWFuYWdlciwgZ2V0V2hvKCksIHRydWUpOwotICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChlLmdldENhdXNlKCkgaW5zdGFuY2VvZiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgIC8vIFRlc3QgcGFzc2VkLCB0aGUgZXhjZXB0aW9uIHdhcyB0aHJvd24gYXMgZXhwZWN0ZWQuCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZhaWwoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHNob3VsZCBoYXZlIGJlZW4gdGhyb3duIGJ5IHNldEZvcmNlRXBoZW1lcmFsVXNlcnMiKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZW93bmVyL0lDcm9zc1VzZXJTZXJ2aWNlLmFpZGwgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vvd25lci9JQ3Jvc3NVc2VyU2VydmljZS5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NWExYmIKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vvd25lci9JQ3Jvc3NVc2VyU2VydmljZS5haWRsCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5kZXZpY2Vvd25lcjsKKworaW50ZXJmYWNlIElDcm9zc1VzZXJTZXJ2aWNlIHsKKyAgICB2b2lkIG9uRW5hYmxlZENhbGxlZChTdHJpbmcgZXJyb3IpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZW93bmVyL0tleU1hbmFnZW1lbnRBY3Rpdml0eS5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlb3duZXIvS2V5TWFuYWdlbWVudEFjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYTEyNGYuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlb3duZXIvS2V5TWFuYWdlbWVudEFjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5jdHMuZGV2aWNlb3duZXI7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKLQotcHVibGljIGNsYXNzIEtleU1hbmFnZW1lbnRBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZW93bmVyL0tleU1hbmFnZW1lbnRUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vvd25lci9LZXlNYW5hZ2VtZW50VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYjc4M2EwLi4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZW93bmVyL0tleU1hbmFnZW1lbnRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5kZXZpY2Vvd25lcjsKLQotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkZha2VLZXlzLkZBS0VfUlNBXzE7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmN0cy5kZXZpY2Vvd25lci5CYXNlRGV2aWNlT3duZXJUZXN0LmdldFdobzsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQuYXBwLmFkbWluLkRldmljZVBvbGljeU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQuc2VjdXJpdHkuS2V5Q2hhaW47Ci1pbXBvcnQgYW5kcm9pZC5zZWN1cml0eS5LZXlDaGFpbkFsaWFzQ2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5zZWN1cml0eS5LZXlDaGFpbkV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRmFjdG9yeTsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZTsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LktleUZhY3Rvcnk7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2YXRlS2V5OwotaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5JbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuUEtDUzhFbmNvZGVkS2V5U3BlYzsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldE1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBLZXlNYW5hZ2VtZW50VGVzdCBleHRlbmRzIEFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyPEtleU1hbmFnZW1lbnRBY3Rpdml0eT4gewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBLRVlDSEFJTl9USU1FT1VUX01JTlMgPSA2OwotICAgIHByaXZhdGUgRGV2aWNlUG9saWN5TWFuYWdlciBtRGV2aWNlUG9saWN5TWFuYWdlcjsKLQotICAgIHB1YmxpYyBLZXlNYW5hZ2VtZW50VGVzdCgpIHsKLSAgICAgICAgc3VwZXIoS2V5TWFuYWdlbWVudEFjdGl2aXR5LmNsYXNzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotCi0gICAgICAgIC8vIENvbmZpcm0gb3VyIERldmljZU93bmVyIGlzIHNldCB1cAotICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlciA9IChEZXZpY2VQb2xpY3lNYW5hZ2VyKQotICAgICAgICAgICAgICAgIGdldEFjdGl2aXR5KCkuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkRFVklDRV9QT0xJQ1lfU0VSVklDRSk7Ci0gICAgICAgIEJhc2VEZXZpY2VPd25lclRlc3QuYXNzZXJ0RGV2aWNlT3duZXIobURldmljZVBvbGljeU1hbmFnZXIpOwotCi0gICAgICAgIC8vIEhvc3RzaWRlIHRlc3QgaGFzIHNldCBhIGRldmljZSBsb2Nrc2NyZWVuIGluIG9yZGVyIHRvIGVuYWJsZSBjcmVkZW50aWFsIHN0b3JhZ2UKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBIb3N0c2lkZSB0ZXN0IHdpbGwgY2xlYXIgZGV2aWNlIGxvY2tzY3JlZW4gd2hpY2ggaW4gdHVybiB3aWxsIGNsZWFyIHRoZSBrZXlzdG9yZS4KLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FuSW5zdGFsbEFuZFJlbW92ZVZhbGlkUnNhS2V5cGFpcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBTdHJpbmcgYWxpYXMgPSAiY29tLmFuZHJvaWQudGVzdC52YWxpZC1yc2Eta2V5LTEiOwotICAgICAgICBmaW5hbCBQcml2YXRlS2V5IHByaXZLZXkgPSBnZXRQcml2YXRlS2V5KEZBS0VfUlNBXzEucHJpdmF0ZUtleSAsICJSU0EiKTsKLSAgICAgICAgZmluYWwgQ2VydGlmaWNhdGUgY2VydCA9IGdldENlcnRpZmljYXRlKEZBS0VfUlNBXzEuY2FDZXJ0aWZpY2F0ZSk7Ci0KLSAgICAgICAgLy8gSW5zdGFsbCBrZXlwYWlyLgotICAgICAgICBhc3NlcnRUcnVlKG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmluc3RhbGxLZXlQYWlyKGdldFdobygpLCBwcml2S2V5LCBjZXJ0LCBhbGlhcykpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gUmVxdWVzdCBhbmQgcmV0cmlldmUgdXNpbmcgdGhlIGFsaWFzLgotICAgICAgICAgICAgYXNzZXJ0R3JhbnRlZChhbGlhcywgZmFsc2UpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGFsaWFzLCBuZXcgS2V5Q2hhaW5BbGlhc0Z1dHVyZShhbGlhcykuZ2V0KCkpOwotICAgICAgICAgICAgYXNzZXJ0R3JhbnRlZChhbGlhcywgdHJ1ZSk7Ci0KLSAgICAgICAgICAgIC8vIFZlcmlmeSBrZXkgaXMgYXQgbGVhc3Qgc29tZXRoaW5nIGxpa2UgdGhlIG9uZSB3ZSBwdXQgaW4uCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoS2V5Q2hhaW4uZ2V0UHJpdmF0ZUtleShnZXRBY3Rpdml0eSgpLCBhbGlhcykuZ2V0QWxnb3JpdGhtKCksICJSU0EiKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIC8vIERlbGV0ZSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIHRlc3Qgc3VjY2VlZGVkLgotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRGV2aWNlUG9saWN5TWFuYWdlci5yZW1vdmVLZXlQYWlyKGdldFdobygpLCBhbGlhcykpOwotICAgICAgICB9Ci0gICAgICAgIC8vIFZlcmlmeSBhbGlhcyBpcyBhY3R1YWxseSBkZWxldGVkLgotICAgICAgICBhc3NlcnRHcmFudGVkKGFsaWFzLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENhbkluc3RhbGxXaXRoQXV0b21hdGljQWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBncmFudCA9ICJjb20uYW5kcm9pZC50ZXN0LmF1dG9ncmFudC1rZXktMSI7Ci0gICAgICAgIGZpbmFsIFN0cmluZyB3aXRoaG9sZCA9ICJjb20uYW5kcm9pZC50ZXN0Lm5vbmdyYW50LWtleS0xIjsKLSAgICAgICAgZmluYWwgUHJpdmF0ZUtleSBwcml2S2V5ID0gZ2V0UHJpdmF0ZUtleShGQUtFX1JTQV8xLnByaXZhdGVLZXkgLCAiUlNBIik7Ci0gICAgICAgIGZpbmFsIENlcnRpZmljYXRlIGNlcnQgPSBnZXRDZXJ0aWZpY2F0ZShGQUtFX1JTQV8xLmNhQ2VydGlmaWNhdGUpOwotCi0gICAgICAgIC8vIEluc3RhbGwga2V5cGFpcnMuCi0gICAgICAgIGFzc2VydFRydWUobURldmljZVBvbGljeU1hbmFnZXIuaW5zdGFsbEtleVBhaXIoZ2V0V2hvKCksIHByaXZLZXksIG5ldyBDZXJ0aWZpY2F0ZVtdIHtjZXJ0fSwKLSAgICAgICAgICAgICAgICBncmFudCwgdHJ1ZSkpOwotICAgICAgICBhc3NlcnRUcnVlKG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmluc3RhbGxLZXlQYWlyKGdldFdobygpLCBwcml2S2V5LCBuZXcgQ2VydGlmaWNhdGVbXSB7Y2VydH0sCi0gICAgICAgICAgICAgICAgd2l0aGhvbGQsIGZhbHNlKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBWZXJpZnkgb25seSB0aGUgcmVxdWVzdGVkIGtleSB3YXMgYWN0dWFsbHkgZ3JhbnRlZC4KLSAgICAgICAgICAgIGFzc2VydEdyYW50ZWQoZ3JhbnQsIHRydWUpOwotICAgICAgICAgICAgYXNzZXJ0R3JhbnRlZCh3aXRoaG9sZCwgZmFsc2UpOwotCi0gICAgICAgICAgICAvLyBWZXJpZnkgdGhlIGdyYW50ZWQga2V5IGlzIGFjdHVhbGx5IG9idGFpbmFibGUgaW4gUHJpdmF0ZUtleSBmb3JtLgotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEtleUNoYWluLmdldFByaXZhdGVLZXkoZ2V0QWN0aXZpdHkoKSwgZ3JhbnQpLmdldEFsZ29yaXRobSgpLCAiUlNBIik7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAvLyBEZWxldGUgYm90aCBrZXlwYWlycy4KLSAgICAgICAgICAgIGFzc2VydFRydWUobURldmljZVBvbGljeU1hbmFnZXIucmVtb3ZlS2V5UGFpcihnZXRXaG8oKSwgZ3JhbnQpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobURldmljZVBvbGljeU1hbmFnZXIucmVtb3ZlS2V5UGFpcihnZXRXaG8oKSwgd2l0aGhvbGQpKTsKLSAgICAgICAgfQotICAgICAgICAvLyBWZXJpZnkgdGhleSdyZSBhY3R1YWxseSBnb25lLgotICAgICAgICBhc3NlcnRHcmFudGVkKGdyYW50LCBmYWxzZSk7Ci0gICAgICAgIGFzc2VydEdyYW50ZWQod2l0aGhvbGQsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FuSW5zdGFsbENlcnRDaGFpbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBVc2UgYXNzZXRzL2dlbmVyYXRlLWNsaWVudC1jZXJ0LWNoYWluLnNoIHRvIHJlZ2VuZXJhdGUgdGhlIGNsaWVudCBjZXJ0IGNoYWluLgotICAgICAgICBmaW5hbCBQcml2YXRlS2V5IHByaXZLZXkgPSBsb2FkUHJpdmF0ZUtleUZyb21Bc3NldCgidXNlci1jZXJ0LWNoYWluLmtleSIpOwotICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPENlcnRpZmljYXRlPiBjZXJ0cyA9IGxvYWRDZXJ0aWZpY2F0ZXNGcm9tQXNzZXQoInVzZXItY2VydC1jaGFpbi5jcnQiKTsKLSAgICAgICAgZmluYWwgQ2VydGlmaWNhdGVbXSBjZXJ0Q2hhaW4gPSBjZXJ0cy50b0FycmF5KG5ldyBDZXJ0aWZpY2F0ZVtjZXJ0cy5zaXplKCldKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGFsaWFzID0gImNvbS5hbmRyb2lkLnRlc3QuY2xpZW50a2V5Y2hhaW4iOwotICAgICAgICAvLyBTb21lIHNhbml0eSBjaGVjayBvbiB0aGUgY2VydCBjaGFpbgotICAgICAgICBhc3NlcnRUcnVlKGNlcnRzLnNpemUoKSA+IDEpOwotICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGNlcnRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBjZXJ0Q2hhaW5baSAtIDFdLnZlcmlmeShjZXJ0Q2hhaW5baV0uZ2V0UHVibGljS2V5KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSW5zdGFsbCBrZXlwYWlycy4KLSAgICAgICAgYXNzZXJ0VHJ1ZShtRGV2aWNlUG9saWN5TWFuYWdlci5pbnN0YWxsS2V5UGFpcihnZXRXaG8oKSwgcHJpdktleSwgY2VydENoYWluLCBhbGlhcywgdHJ1ZSkpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gVmVyaWZ5IG9ubHkgdGhlIHJlcXVlc3RlZCBrZXkgd2FzIGFjdHVhbGx5IGdyYW50ZWQuCi0gICAgICAgICAgICBhc3NlcnRHcmFudGVkKGFsaWFzLCB0cnVlKTsKLQotICAgICAgICAgICAgLy8gVmVyaWZ5IHRoZSBncmFudGVkIGtleSBpcyBhY3R1YWxseSBvYnRhaW5hYmxlIGluIFByaXZhdGVLZXkgZm9ybS4KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhLZXlDaGFpbi5nZXRQcml2YXRlS2V5KGdldEFjdGl2aXR5KCksIGFsaWFzKS5nZXRBbGdvcml0aG0oKSwgIlJTQSIpOwotCi0gICAgICAgICAgICAvLyBWZXJpZnkgdGhlIGNlcnRpZmljYXRlIGNoYWluIGlzIGNvcnJlY3QKLSAgICAgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZVtdIHJldHVybmVkQ2VydHMgPSBLZXlDaGFpbi5nZXRDZXJ0aWZpY2F0ZUNoYWluKGdldEFjdGl2aXR5KCksIGFsaWFzKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhjZXJ0Q2hhaW4sIHJldHVybmVkQ2VydHMpKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIC8vIERlbGV0ZSBib3RoIGtleXBhaXJzLgotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRGV2aWNlUG9saWN5TWFuYWdlci5yZW1vdmVLZXlQYWlyKGdldFdobygpLCBhbGlhcykpOwotICAgICAgICB9Ci0gICAgICAgIC8vIFZlcmlmeSB0aGV5J3JlIGFjdHVhbGx5IGdvbmUuCi0gICAgICAgIGFzc2VydEdyYW50ZWQoYWxpYXMsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R3JhbnRzRG9Ob3RQZXJzaXN0QmV0d2Vlbkluc3RhbGxhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIGFsaWFzID0gImNvbS5hbmRyb2lkLnRlc3QucGVyc2lzdGVudC1rZXktMSI7Ci0gICAgICAgIGZpbmFsIFByaXZhdGVLZXkgcHJpdktleSA9IGdldFByaXZhdGVLZXkoRkFLRV9SU0FfMS5wcml2YXRlS2V5ICwgIlJTQSIpOwotICAgICAgICBmaW5hbCBDZXJ0aWZpY2F0ZSBjZXJ0ID0gZ2V0Q2VydGlmaWNhdGUoRkFLRV9SU0FfMS5jYUNlcnRpZmljYXRlKTsKLQotICAgICAgICAvLyBJbnN0YWxsIGtleXBhaXIuCi0gICAgICAgIGFzc2VydFRydWUobURldmljZVBvbGljeU1hbmFnZXIuaW5zdGFsbEtleVBhaXIoZ2V0V2hvKCksIHByaXZLZXksIG5ldyBDZXJ0aWZpY2F0ZVtdIHtjZXJ0fSwKLSAgICAgICAgICAgICAgICBhbGlhcywgdHJ1ZSkpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0R3JhbnRlZChhbGlhcywgdHJ1ZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAvLyBEZWxldGUgYW5kIHZlcmlmeS4KLSAgICAgICAgICAgIGFzc2VydFRydWUobURldmljZVBvbGljeU1hbmFnZXIucmVtb3ZlS2V5UGFpcihnZXRXaG8oKSwgYWxpYXMpKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRHcmFudGVkKGFsaWFzLCBmYWxzZSk7Ci0KLSAgICAgICAgLy8gSW5zdGFsbCBhZ2Fpbi4KLSAgICAgICAgYXNzZXJ0VHJ1ZShtRGV2aWNlUG9saWN5TWFuYWdlci5pbnN0YWxsS2V5UGFpcihnZXRXaG8oKSwgcHJpdktleSwgbmV3IENlcnRpZmljYXRlW10ge2NlcnR9LAotICAgICAgICAgICAgICAgIGFsaWFzLCBmYWxzZSkpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0R3JhbnRlZChhbGlhcywgZmFsc2UpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgLy8gRGVsZXRlLgotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRGV2aWNlUG9saWN5TWFuYWdlci5yZW1vdmVLZXlQYWlyKGdldFdobygpLCBhbGlhcykpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE51bGxLZXlQYXJhbXNGYWlsUHJlZGljdGFibHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIGFsaWFzID0gImNvbS5hbmRyb2lkLnRlc3QubnVsbC1rZXktMSI7Ci0gICAgICAgIGZpbmFsIFByaXZhdGVLZXkgcHJpdktleSA9IGdldFByaXZhdGVLZXkoRkFLRV9SU0FfMS5wcml2YXRlS2V5LCAiUlNBIik7Ci0gICAgICAgIGZpbmFsIENlcnRpZmljYXRlIGNlcnQgPSBnZXRDZXJ0aWZpY2F0ZShGQUtFX1JTQV8xLmNhQ2VydGlmaWNhdGUpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuaW5zdGFsbEtleVBhaXIoZ2V0V2hvKCksIG51bGwsIGNlcnQsIGFsaWFzKTsKLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBzaG91bGQgaGF2ZSBiZWVuIHRocm93biBmb3IgbnVsbCBQcml2YXRlS2V5Iik7Ci0gICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4cGVjdGVkKSB7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmluc3RhbGxLZXlQYWlyKGdldFdobygpLCBwcml2S2V5LCBudWxsLCBhbGlhcyk7Ci0gICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24gZm9yIG51bGwgQ2VydGlmaWNhdGUiKTsKLSAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXhwZWN0ZWQpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsQWRtaW5Db21wb25lbnRJc0RlbmllZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBTdHJpbmcgYWxpYXMgPSAiY29tLmFuZHJvaWQudGVzdC5udWxsLWFkbWluLTEiOwotICAgICAgICBmaW5hbCBQcml2YXRlS2V5IHByaXZLZXkgPSBnZXRQcml2YXRlS2V5KEZBS0VfUlNBXzEucHJpdmF0ZUtleSwgIlJTQSIpOwotICAgICAgICBmaW5hbCBDZXJ0aWZpY2F0ZSBjZXJ0ID0gZ2V0Q2VydGlmaWNhdGUoRkFLRV9SU0FfMS5jYUNlcnRpZmljYXRlKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmluc3RhbGxLZXlQYWlyKG51bGwsIHByaXZLZXksIGNlcnQsIGFsaWFzKTsKLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBzaG91bGQgaGF2ZSBiZWVuIHRocm93biBmb3IgbnVsbCBDb21wb25lbnROYW1lIik7Ci0gICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGV4cGVjdGVkKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0R3JhbnRlZChTdHJpbmcgYWxpYXMsIGJvb2xlYW4gZXhwZWN0ZWQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGJvb2xlYW4gZ3JhbnRlZCA9IGZhbHNlOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZ3JhbnRlZCA9IChLZXlDaGFpbi5nZXRQcml2YXRlS2V5KGdldEFjdGl2aXR5KCksIGFsaWFzKSAhPSBudWxsKTsKLSAgICAgICAgfSBjYXRjaCAoS2V5Q2hhaW5FeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscygiR3JhbnQgZm9yIGFsaWFzOiBcIiIgKyBhbGlhcyArICJcIiIsIGV4cGVjdGVkLCBncmFudGVkKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBQcml2YXRlS2V5IGdldFByaXZhdGVLZXkoZmluYWwgYnl0ZVtdIGtleSwgU3RyaW5nIHR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLCBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBLZXlGYWN0b3J5LmdldEluc3RhbmNlKHR5cGUpLmdlbmVyYXRlUHJpdmF0ZSgKLSAgICAgICAgICAgICAgICBuZXcgUEtDUzhFbmNvZGVkS2V5U3BlYyhrZXkpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBDZXJ0aWZpY2F0ZSBnZXRDZXJ0aWZpY2F0ZShieXRlW10gY2VydCkgdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIENlcnRpZmljYXRlRmFjdG9yeS5nZXRJbnN0YW5jZSgiWC41MDkiKS5nZW5lcmF0ZUNlcnRpZmljYXRlKAotICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShjZXJ0KSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDb2xsZWN0aW9uPENlcnRpZmljYXRlPiBsb2FkQ2VydGlmaWNhdGVzRnJvbUFzc2V0KFN0cmluZyBhc3NldE5hbWUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpbmFsIENlcnRpZmljYXRlRmFjdG9yeSBjZXJ0RmFjdG9yeSA9IENlcnRpZmljYXRlRmFjdG9yeS5nZXRJbnN0YW5jZSgiWC41MDkiKTsKLSAgICAgICAgICAgIEFzc2V0TWFuYWdlciBhbSA9IGdldEFjdGl2aXR5KCkuZ2V0QXNzZXRzKCk7Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IGFtLm9wZW4oYXNzZXROYW1lKTsKLSAgICAgICAgICAgIHJldHVybiAoQ29sbGVjdGlvbjxDZXJ0aWZpY2F0ZT4pIGNlcnRGYWN0b3J5LmdlbmVyYXRlQ2VydGlmaWNhdGVzKGlzKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gfCBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgUHJpdmF0ZUtleSBsb2FkUHJpdmF0ZUtleUZyb21Bc3NldChTdHJpbmcgYXNzZXROYW1lKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBBc3NldE1hbmFnZXIgYW0gPSBnZXRBY3Rpdml0eSgpLmdldEFzc2V0cygpOwotICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBhbS5vcGVuKGFzc2V0TmFtZSk7Ci0gICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgaW50IGxlbmd0aDsKLSAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVs0MDk2XTsKLSAgICAgICAgICAgIHdoaWxlICgobGVuZ3RoID0gaXMucmVhZChidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgpKSAhPSAtMSkgewotICAgICAgICAgICAgICBvdXRwdXQud3JpdGUoYnVmZmVyLCAwLCBsZW5ndGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGdldFByaXZhdGVLZXkob3V0cHV0LnRvQnl0ZUFycmF5KCksICJSU0EiKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gfCBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gfCBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgS2V5Q2hhaW5BbGlhc0Z1dHVyZSBpbXBsZW1lbnRzIEtleUNoYWluQWxpYXNDYWxsYmFjayB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQ291bnREb3duTGF0Y2ggbUxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOwotICAgICAgICBwcml2YXRlIFN0cmluZyBtQ2hvc2VuQWxpYXMgPSBudWxsOwotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBhbGlhcyhmaW5hbCBTdHJpbmcgY2hvc2VuQWxpYXMpIHsKLSAgICAgICAgICAgIG1DaG9zZW5BbGlhcyA9IGNob3NlbkFsaWFzOwotICAgICAgICAgICAgbUxhdGNoLmNvdW50RG93bigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEtleUNoYWluQWxpYXNGdXR1cmUoU3RyaW5nIGFsaWFzKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAvKiBQYXNzIHRoZSBhbGlhcyBhcyBhIEdFVCB0byBhbiBpbWFnaW5hcnkgc2VydmVyIGluc3RlYWQgb2YgZXhwbGljaXRseSBhc2tpbmcgZm9yIGl0LAotICAgICAgICAgICAgICogdG8gbWFrZSBzdXJlIHRoZSBEUEMgYWN0dWFsbHkgaGFzIHRvIGRvIHNvbWUgd29yayB0byBncmFudCB0aGUgY2VydC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgZmluYWwgVXJpIHVyaSA9Ci0gICAgICAgICAgICAgICAgICAgIFVyaS5wYXJzZSgiaHR0cHM6Ly9leGFtcGxlLm9yZy8/YWxpYXM9IiArIFVSTEVuY29kZXIuZW5jb2RlKGFsaWFzLCAiVVRGLTgiKSk7Ci0gICAgICAgICAgICBLZXlDaGFpbi5jaG9vc2VQcml2YXRlS2V5QWxpYXMoZ2V0QWN0aXZpdHkoKSwgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiBrZXlUeXBlcyAqLywgbnVsbCAvKiBpc3N1ZXJzICovLCB1cmksIG51bGwgLyogYWxpYXMgKi8pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQ2hvb3NlciB0aW1lb3V0IiwgbUxhdGNoLmF3YWl0KEtFWUNIQUlOX1RJTUVPVVRfTUlOUywgVGltZVVuaXQuTUlOVVRFUykpOwotICAgICAgICAgICAgcmV0dXJuIG1DaG9zZW5BbGlhczsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZW93bmVyL0xvY2tUYXNrSG9zdERyaXZlblRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZW93bmVyL0xvY2tUYXNrSG9zdERyaXZlblRlc3QuamF2YQppbmRleCA3ODBhOTBjLi45OWI5N2JkIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vvd25lci9Mb2NrVGFza0hvc3REcml2ZW5UZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlb3duZXIvTG9ja1Rhc2tIb3N0RHJpdmVuVGVzdC5qYXZhCkBAIC0yNSwxMyArMjUsMTQgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QudWlhdXRvbWF0b3IuVWlEZXZpY2U7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCkBAIC00OCw5ICs0OSw2IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IExvY2tUYXNrSG9zdERyaXZlblRlc3QuY2xhc3MuZ2V0TmFtZSgpOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFDVElWSVRZX1JFU1VNRURfVElNRU9VVF9NSUxMSVMgPSAyMDAwMDsgIC8vIDIwIHNlY29uZHMKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRV9OQU1FID0gTG9ja1Rhc2tIb3N0RHJpdmVuVGVzdC5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbXBvbmVudE5hbWUgQURNSU5fQ09NUE9ORU5UID0KLSAgICAgICAgICAgIG5ldyBDb21wb25lbnROYW1lKFBBQ0tBR0VfTkFNRSwgQmFzZURldmljZU93bmVyVGVzdC5CYXNpY0FkbWluUmVjZWl2ZXIuY2xhc3MuZ2V0TmFtZSgpKTsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NLX1RBU0tfQUNUSVZJVFkKICAgICAgICAgICAgID0gTG9ja1Rhc2tVdGlsaXR5QWN0aXZpdHlJZldoaXRlbGlzdGVkLmNsYXNzLmdldE5hbWUoKTsKQEAgLTg1LDcgKzgzLDcgQEAKICAgICBAQmVmb3JlCiAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CiAgICAgICAgIG1Db250ZXh0ID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpOwotICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlciA9ICBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKERldmljZVBvbGljeU1hbmFnZXIuY2xhc3MpOworICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlciA9IG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoRGV2aWNlUG9saWN5TWFuYWdlci5jbGFzcyk7CiAgICAgICAgIG1BY3Rpdml0eU1hbmFnZXIgPSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKEFjdGl2aXR5TWFuYWdlci5jbGFzcyk7CiAgICAgICAgIG1VaURldmljZSA9IFVpRGV2aWNlLmdldEluc3RhbmNlKEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpKTsKICAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKQEAgLTEwNyw2ICsxMDUsMTAgQEAKICAgICAgICAgbVVpRGV2aWNlLndhaXRGb3JJZGxlKCk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogT24gbG93LVJBTSBkZXZpY2VzLCB0aGlzIHRlc3QgY2FuIHRha2UgdG9vIGxvbmcgdG8gZmluaXNoLCBzbyB0aGUgdGVzdCBydW5uZXIgY2FuIGluY29ycmVjdGx5CisgICAgICogYXNzdW1lIGl0J3MgZmluaXNoZWQuIFRoZXJlZm9yZSwgb25seSB1c2UgaXQgb25jZSBpbiBhIGdpdmVuIHRlc3QuCisgICAgICovCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0TG9ja1Rhc2tJc0FjdGl2ZUFuZENhbnRCZUludGVycnVwdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIG1VaURldmljZS53YWl0Rm9ySWRsZSgpOwpAQCAtMTM3LDkgKzEzOSwxMSBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCBjbGVhckRlZmF1bHRIb21lSW50ZW50UmVjZWl2ZXIoKSB7Ci0gICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmNsZWFyUGFja2FnZVBlcnNpc3RlbnRQcmVmZXJyZWRBY3Rpdml0aWVzKEFETUlOX0NPTVBPTkVOVCwKLSAgICAgICAgICAgICAgICBQQUNLQUdFX05BTUUpOwotICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5zZXRMb2NrVGFza1BhY2thZ2VzKEFETUlOX0NPTVBPTkVOVCwgbmV3IFN0cmluZ1swXSk7CisgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmNsZWFyUGFja2FnZVBlcnNpc3RlbnRQcmVmZXJyZWRBY3Rpdml0aWVzKAorICAgICAgICAgICAgICAgIEJhc2ljQWRtaW5SZWNlaXZlci5nZXRDb21wb25lbnROYW1lKG1Db250ZXh0KSwKKyAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpKTsKKyAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuc2V0TG9ja1Rhc2tQYWNrYWdlcyhCYXNpY0FkbWluUmVjZWl2ZXIuZ2V0Q29tcG9uZW50TmFtZShtQ29udGV4dCksCisgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1swXSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGNoZWNrTG9ja2VkQWN0aXZpdHlJc1J1bm5pbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTE1NCwxOSArMTU4LDIwIEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGxhdW5jaExvY2tUYXNrQWN0aXZpdHkoKSB7Ci0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KCk7Ci0gICAgICAgIGludGVudC5zZXRDbGFzc05hbWUoUEFDS0FHRV9OQU1FLCBMT0NLX1RBU0tfQUNUSVZJVFkpOworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChtQ29udGV4dCwgTG9ja1Rhc2tVdGlsaXR5QWN0aXZpdHlJZldoaXRlbGlzdGVkLmNsYXNzKTsKICAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX1NJTkdMRV9UT1AgfCBJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7CiAgICAgICAgIGludGVudC5wdXRFeHRyYShMb2NrVGFza1V0aWxpdHlBY3Rpdml0eS5TVEFSVF9MT0NLX1RBU0ssIHRydWUpOwogICAgICAgICBtQ29udGV4dC5zdGFydEFjdGl2aXR5KGludGVudCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHNldERlZmF1bHRIb21lSW50ZW50UmVjZWl2ZXIoKSB7Ci0gICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnNldExvY2tUYXNrUGFja2FnZXMoQURNSU5fQ09NUE9ORU5ULCBuZXcgU3RyaW5nW10geyBQQUNLQUdFX05BTUUgfSk7CisgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnNldExvY2tUYXNrUGFja2FnZXMoQmFzaWNBZG1pblJlY2VpdmVyLmdldENvbXBvbmVudE5hbWUobUNvbnRleHQpLAorICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXXttQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpfSk7CiAgICAgICAgIEludGVudEZpbHRlciBpbnRlbnRGaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKEludGVudC5BQ1RJT05fTUFJTik7CiAgICAgICAgIGludGVudEZpbHRlci5hZGRDYXRlZ29yeShJbnRlbnQuQ0FURUdPUllfSE9NRSk7CiAgICAgICAgIGludGVudEZpbHRlci5hZGRDYXRlZ29yeShJbnRlbnQuQ0FURUdPUllfREVGQVVMVCk7Ci0gICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmFkZFBlcnNpc3RlbnRQcmVmZXJyZWRBY3Rpdml0eShBRE1JTl9DT01QT05FTlQsIGludGVudEZpbHRlciwKLSAgICAgICAgICAgICAgICBuZXcgQ29tcG9uZW50TmFtZShQQUNLQUdFX05BTUUsIExPQ0tfVEFTS19BQ1RJVklUWSkpOworICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5hZGRQZXJzaXN0ZW50UHJlZmVycmVkQWN0aXZpdHkoCisgICAgICAgICAgICAgICAgQmFzaWNBZG1pblJlY2VpdmVyLmdldENvbXBvbmVudE5hbWUobUNvbnRleHQpLCBpbnRlbnRGaWx0ZXIsCisgICAgICAgICAgICAgICAgbmV3IENvbXBvbmVudE5hbWUobUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSwgTE9DS19UQVNLX0FDVElWSVRZKSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlb3duZXIvTG9ja1Rhc2tUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vvd25lci9Mb2NrVGFza1Rlc3QuamF2YQppbmRleCA5YzUzODBhLi42Y2ZlYzEwIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vvd25lci9Mb2NrVGFza1Rlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vvd25lci9Mb2NrVGFza1Rlc3QuamF2YQpAQCAtMTUsMTQgKzE1LDIzIEBACiAgKi8KIHBhY2thZ2UgY29tLmFuZHJvaWQuY3RzLmRldmljZW93bmVyOwogCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLmFkbWluLkRldmljZVBvbGljeU1hbmFnZXIuTE9DS19UQVNLX0ZFQVRVUkVfR0xPQkFMX0FDVElPTlM7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLmFkbWluLkRldmljZVBvbGljeU1hbmFnZXIuTE9DS19UQVNLX0ZFQVRVUkVfSE9NRTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuYWRtaW4uRGV2aWNlUG9saWN5TWFuYWdlci5MT0NLX1RBU0tfRkVBVFVSRV9LRVlHVUFSRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuYWRtaW4uRGV2aWNlUG9saWN5TWFuYWdlci5MT0NLX1RBU0tfRkVBVFVSRV9OT05FOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5hZG1pbi5EZXZpY2VQb2xpY3lNYW5hZ2VyLkxPQ0tfVEFTS19GRUFUVVJFX05PVElGSUNBVElPTlM7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLmFkbWluLkRldmljZVBvbGljeU1hbmFnZXIuTE9DS19UQVNLX0ZFQVRVUkVfT1ZFUlZJRVc7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLmFkbWluLkRldmljZVBvbGljeU1hbmFnZXIuTE9DS19UQVNLX0ZFQVRVUkVfU1lTVEVNX0lORk87CisKIGltcG9ydCBzdGF0aWMganVuaXQuZnJhbWV3b3JrLkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIGp1bml0LmZyYW1ld29yay5Bc3NlcnQuYXNzZXJ0RmFsc2U7CiBpbXBvcnQgc3RhdGljIGp1bml0LmZyYW1ld29yay5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEFycmF5RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnRUaHJvd3M7CiAKLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlPcHRpb25zOwogaW1wb3J0IGFuZHJvaWQuYXBwLmFkbWluLkRldmljZVBvbGljeU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwpAQCAtMzAsMTUgKzM5LDE4IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKwogQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKIHB1YmxpYyBjbGFzcyBMb2NrVGFza1Rlc3QgewogCkBAIC00Niw3ICs1OCw3IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRV9OQU1FID0gTG9ja1Rhc2tUZXN0LmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tcG9uZW50TmFtZSBBRE1JTl9DT01QT05FTlQgPQotICAgICAgICAgICAgbmV3IENvbXBvbmVudE5hbWUoUEFDS0FHRV9OQU1FLCBCYXNlRGV2aWNlT3duZXJUZXN0LkJhc2ljQWRtaW5SZWNlaXZlci5jbGFzcy5nZXROYW1lKCkpOworICAgICAgICAgICAgbmV3IENvbXBvbmVudE5hbWUoUEFDS0FHRV9OQU1FLCBCYXNpY0FkbWluUmVjZWl2ZXIuY2xhc3MuZ2V0TmFtZSgpKTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9QQUNLQUdFID0gImNvbS5nb29nbGUuYW5kcm9pZC5leGFtcGxlLnNvbWVwYWNrYWdlIjsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVVElMSVRZX0FDVElWSVRZCkBAIC01NCwxOCArNjYsMjMgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVRJTElUWV9BQ1RJVklUWV9JRl9XSElURUxJU1RFRAogICAgICAgICAgICAgPSAiY29tLmFuZHJvaWQuY3RzLmRldmljZW93bmVyLkxvY2tUYXNrVXRpbGl0eUFjdGl2aXR5SWZXaGl0ZWxpc3RlZCI7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVDRUlWSU5HX0FDVElWSVRZX1BBQ0tBR0VfTkFNRQotICAgICAgICAgICAgPSAiY29tLmFuZHJvaWQuY3RzLmludGVudC5yZWNlaXZlciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQ0VJVklOR19BQ1RJVklUWV9OQU1FCi0gICAgICAgICAgICA9ICJjb20uYW5kcm9pZC5jdHMuaW50ZW50LnJlY2VpdmVyLkludGVudFJlY2VpdmVyQWN0aXZpdHkiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUNFSVZFUl9BQ1RJVklUWV9QQUNLQUdFX05BTUUgPQorICAgICAgICAgICAgImNvbS5hbmRyb2lkLmN0cy5pbnRlbnQucmVjZWl2ZXIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUNFSVZFUl9BQ1RJVklUWV9OQU1FID0KKyAgICAgICAgICAgICJjb20uYW5kcm9pZC5jdHMuaW50ZW50LnJlY2VpdmVyLkludGVudFJlY2VpdmVyQWN0aXZpdHkiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fSlVTVF9DUkVBVEUgPQogICAgICAgICAgICAgImNvbS5hbmRyb2lkLmN0cy5hY3Rpb24uSlVTVF9DUkVBVEUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fQ1JFQVRFX0FORF9XQUlUID0KKyAgICAgICAgICAgICJjb20uYW5kcm9pZC5jdHMuYWN0aW9uLkNSRUFURV9BTkRfV0FJVCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQ0VJVkVSX0FDVElWSVRZX0NSRUFURURfQUNUSU9OID0KKyAgICAgICAgICAgICJjb20uYW5kcm9pZC5jdHMuZGV2aWNlb3duZXIuYWN0aW9uLlJFQ0VJVkVSX0FDVElWSVRZX0NSRUFURUQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUNFSVZFUl9BQ1RJVklUWV9ERVNUUk9ZRURfQUNUSU9OID0KKyAgICAgICAgICAgICJjb20uYW5kcm9pZC5jdHMuZGV2aWNlb3duZXIuYWN0aW9uLlJFQ0VJVkVSX0FDVElWSVRZX0RFU1RST1lFRCI7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUNUSVZJVFlfUkVTVU1FRF9USU1FT1VUX01JTExJUyA9IDIwMDAwOyAgLy8gMjAgc2Vjb25kcwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBQ1RJVklUWV9SVU5OSU5HX1RJTUVPVVRfTUlMTElTID0gMTAwMDA7ICAvLyAxMCBzZWNvbmRzCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFDVElWSVRZX0RFU1RST1lFRF9USU1FT1VUX01JTExJUyA9IDYwMDAwOyAgLy8gNjAgc2Vjb25kcwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQ0VJVklOR19BQ1RJVklUWV9DUkVBVEVEX0FDVElPTgotICAgICAgICAgICAgPSAiY29tLmFuZHJvaWQuY3RzLmRldmljZW93bmVyLlJFQ0VJVklOR19BQ1RJVklUWV9DUkVBVEVEX0FDVElPTiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBBQ1RJVklUWV9SRVNVTUVEX1RJTUVPVVRfTUlMTElTID0gVGltZVVuaXQuU0VDT05EUy50b01pbGxpcygyMCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBBQ1RJVklUWV9SVU5OSU5HX1RJTUVPVVRfTUlMTElTID0gVGltZVVuaXQuU0VDT05EUy50b01pbGxpcygxMCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBBQ1RJVklUWV9ERVNUUk9ZRURfVElNRU9VVF9NSUxMSVMgPSBUaW1lVW5pdC5TRUNPTkRTLnRvTWlsbGlzKDYwKTsKKwogICAgIC8qKgogICAgICAqIFRoZSB0ZXN0cyBiZWxvdyBuZWVkIHRvIGtlZXAgZGV0YWlsZWQgdHJhY2sgb2YgdGhlIHN0YXRlIG9mIHRoZSBhY3Rpdml0eQogICAgICAqIHRoYXQgaXMgc3RhcnRlZCBhbmQgc3RvcHBlZCBmcmVxdWVudGx5LiAgVG8gZG8gdGhpcyBpdCBzZW5kcyBhIG51bWJlciBvZgpAQCAtMTA1LDMxICsxMjIsMjcgQEAKICAgICAgICAgICAgICAgICAgICAgbUludGVudEhhbmRsZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICBMb2NrVGFza1Rlc3QudGhpcy5ub3RpZnkoKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKFJFQ0VJVklOR19BQ1RJVklUWV9DUkVBVEVEX0FDVElPTi5lcXVhbHMoYWN0aW9uKSkgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZChtUmVjZWl2aW5nQWN0aXZpdHlDcmVhdGVkTG9jaykgewotICAgICAgICAgICAgICAgICAgICBtUmVjZWl2aW5nQWN0aXZpdHlXYXNDcmVhdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgbVJlY2VpdmluZ0FjdGl2aXR5Q3JlYXRlZExvY2subm90aWZ5KCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKFJFQ0VJVkVSX0FDVElWSVRZX0NSRUFURURfQUNUSU9OLmVxdWFscyhhY3Rpb24pKSB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkKG1SZWNlaXZlckFjdGl2aXR5UnVubmluZ0xvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgbUlzUmVjZWl2ZXJBY3Rpdml0eVJ1bm5pbmcgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBtUmVjZWl2ZXJBY3Rpdml0eVJ1bm5pbmdMb2NrLm5vdGlmeSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoUkVDRUlWRVJfQUNUSVZJVFlfREVTVFJPWUVEX0FDVElPTi5lcXVhbHMoYWN0aW9uKSkgeworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVJlY2VpdmVyQWN0aXZpdHlSdW5uaW5nTG9jaykgeworICAgICAgICAgICAgICAgICAgICBtSXNSZWNlaXZlckFjdGl2aXR5UnVubmluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBtUmVjZWl2ZXJBY3Rpdml0eVJ1bm5pbmdMb2NrLm5vdGlmeSgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH07CiAKLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEludGVudFJlY2VpdmluZ0FjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewotICAgICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLSAgICAgICAgICAgIHNlbmRCcm9hZGNhc3QobmV3IEludGVudChSRUNFSVZJTkdfQUNUSVZJVFlfQ1JFQVRFRF9BQ1RJT04pKTsKLSAgICAgICAgICAgIGZpbmlzaCgpOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIG1Jc0FjdGl2aXR5UnVubmluZzsKICAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gbUlzQWN0aXZpdHlSZXN1bWVkOwotICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBtUmVjZWl2aW5nQWN0aXZpdHlXYXNDcmVhdGVkOworICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBtSXNSZWNlaXZlckFjdGl2aXR5UnVubmluZzsKICAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gbUludGVudEhhbmRsZWQ7CiAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbUFjdGl2aXR5UnVubmluZ0xvY2sgPSBuZXcgT2JqZWN0KCk7CiAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbUFjdGl2aXR5UmVzdW1lZExvY2sgPSBuZXcgT2JqZWN0KCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbVJlY2VpdmluZ0FjdGl2aXR5Q3JlYXRlZExvY2sgPSBuZXcgT2JqZWN0KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbVJlY2VpdmVyQWN0aXZpdHlSdW5uaW5nTG9jayA9IG5ldyBPYmplY3QoKTsKIAogICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKICAgICBwcml2YXRlIEFjdGl2aXR5TWFuYWdlciBtQWN0aXZpdHlNYW5hZ2VyOwpAQCAtMTM5LDE3ICsxNTIsMTcgQEAKICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKICAgICAgICAgbUNvbnRleHQgPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCk7CiAKLSAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIgPSAoRGV2aWNlUG9saWN5TWFuYWdlcikKLSAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuREVWSUNFX1BPTElDWV9TRVJWSUNFKTsKKyAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIgPSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKERldmljZVBvbGljeU1hbmFnZXIuY2xhc3MpOwogICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5zZXRMb2NrVGFza1BhY2thZ2VzKEFETUlOX0NPTVBPTkVOVCwgbmV3IFN0cmluZ1swXSk7Ci0gICAgICAgIG1BY3Rpdml0eU1hbmFnZXIgPSAoQWN0aXZpdHlNYW5hZ2VyKSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQUNUSVZJVFlfU0VSVklDRSk7CisgICAgICAgIG1BY3Rpdml0eU1hbmFnZXIgPSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKEFjdGl2aXR5TWFuYWdlci5jbGFzcyk7CiAgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7CiAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oTG9ja1Rhc2tVdGlsaXR5QWN0aXZpdHkuQ1JFQVRFX0FDVElPTik7CiAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oTG9ja1Rhc2tVdGlsaXR5QWN0aXZpdHkuREVTVFJPWV9BQ1RJT04pOwogICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKExvY2tUYXNrVXRpbGl0eUFjdGl2aXR5LklOVEVOVF9BQ1RJT04pOwogICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKExvY2tUYXNrVXRpbGl0eUFjdGl2aXR5LlJFU1VNRV9BQ1RJT04pOwogICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKExvY2tUYXNrVXRpbGl0eUFjdGl2aXR5LlBBVVNFX0FDVElPTik7Ci0gICAgICAgIGZpbHRlci5hZGRBY3Rpb24oUkVDRUlWSU5HX0FDVElWSVRZX0NSRUFURURfQUNUSU9OKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihSRUNFSVZFUl9BQ1RJVklUWV9DUkVBVEVEX0FDVElPTik7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oUkVDRUlWRVJfQUNUSVZJVFlfREVTVFJPWUVEX0FDVElPTik7CiAgICAgICAgIG1Db250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIobVJlY2VpdmVyLCBmaWx0ZXIpOwogICAgIH0KIApAQCAtMTcyLDYgKzE4NSw0MSBAQAogICAgICAgICBhc3NlcnRGYWxzZShtRGV2aWNlUG9saWN5TWFuYWdlci5pc0xvY2tUYXNrUGVybWl0dGVkKFRFU1RfUEFDS0FHRSkpOwogICAgIH0KIAorICAgIC8vIFNldHRpbmcgYW5kIHVuc2V0dGluZyB0aGUgbG9jayB0YXNrIGZlYXR1cmVzLiBUaGUgYWN0dWFsIFVJIGJlaGF2aW9yIGlzIHRlc3RlZCB3aXRoIENUUworICAgIC8vIHZlcmlmaWVyLgorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNldExvY2tUYXNrRmVhdHVyZXMoKSB7CisgICAgICAgIGZpbmFsIGludFtdIGZsYWdzID0gbmV3IGludFtdIHsKKyAgICAgICAgICAgICAgICBMT0NLX1RBU0tfRkVBVFVSRV9TWVNURU1fSU5GTywKKyAgICAgICAgICAgICAgICBMT0NLX1RBU0tfRkVBVFVSRV9IT01FLAorICAgICAgICAgICAgICAgIExPQ0tfVEFTS19GRUFUVVJFX05PVElGSUNBVElPTlMsCisgICAgICAgICAgICAgICAgTE9DS19UQVNLX0ZFQVRVUkVfT1ZFUlZJRVcsCisgICAgICAgICAgICAgICAgTE9DS19UQVNLX0ZFQVRVUkVfR0xPQkFMX0FDVElPTlMsCisgICAgICAgICAgICAgICAgTE9DS19UQVNLX0ZFQVRVUkVfS0VZR1VBUkQKKyAgICAgICAgfTsKKworICAgICAgICBpbnQgY3VtdWxhdGl2ZSA9IExPQ0tfVEFTS19GRUFUVVJFX05PTkU7CisgICAgICAgIGZvciAoaW50IGZsYWcgOiBmbGFncykgeworICAgICAgICAgICAgaWYgKGZsYWcgPT0gTE9DS19UQVNLX0ZFQVRVUkVfT1ZFUlZJRVcgfHwgZmxhZyA9PSBMT0NLX1RBU0tfRkVBVFVSRV9OT1RJRklDQVRJT05TKSB7CisgICAgICAgICAgICAgICAgLy8gVGhvc2UgZmxhZ3MgY2FuIG9ubHkgYmUgdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoIEhPTUUKKyAgICAgICAgICAgICAgICBhc3NlcnRUaHJvd3MoCisgICAgICAgICAgICAgICAgICAgICAgICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAoKSAtPiBtRGV2aWNlUG9saWN5TWFuYWdlci5zZXRMb2NrVGFza0ZlYXR1cmVzKEFETUlOX0NPTVBPTkVOVCwgZmxhZykpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5zZXRMb2NrVGFza0ZlYXR1cmVzKEFETUlOX0NPTVBPTkVOVCwgZmxhZyk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGZsYWcsIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmdldExvY2tUYXNrRmVhdHVyZXMoQURNSU5fQ09NUE9ORU5UKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGN1bXVsYXRpdmUgfD0gZmxhZzsKKyAgICAgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnNldExvY2tUYXNrRmVhdHVyZXMoQURNSU5fQ09NUE9ORU5ULCBjdW11bGF0aXZlKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhjdW11bGF0aXZlLCBtRGV2aWNlUG9saWN5TWFuYWdlci5nZXRMb2NrVGFza0ZlYXR1cmVzKEFETUlOX0NPTVBPTkVOVCkpOworCisgICAgICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5zZXRMb2NrVGFza0ZlYXR1cmVzKEFETUlOX0NPTVBPTkVOVCwgTE9DS19UQVNLX0ZFQVRVUkVfTk9ORSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoTE9DS19UQVNLX0ZFQVRVUkVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuZ2V0TG9ja1Rhc2tGZWF0dXJlcyhBRE1JTl9DT01QT05FTlQpKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8vIFN0YXJ0IGxvY2sgdGFzaywgdmVyaWZ5IHRoYXQgQWN0aXZpdHlNYW5hZ2VyIGtub3dzIHRoYXRzIHdoYXQgaXMgZ29pbmcgb24uCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhcnRMb2NrVGFzaygpIHRocm93cyBFeGNlcHRpb24gewpAQCAtMjE5LDYgKzI2Nyw0MCBAQAogICAgICAgICBhc3NlcnRGYWxzZShtSXNBY3Rpdml0eVJlc3VtZWQpOwogICAgIH0KIAorICAgIC8vIFZlcmlmaWVzIHRoYXQgcmVtb3ZpbmcgdGhlIHdoaXRlbGlzdCBhdXRob3JpemF0aW9uIGltbWVkaWF0ZWx5IGZpbmlzaGVzIHRoZSBjb3JyZXNwb25kaW5nCisgICAgLy8gbG9ja2VkIHRhc2suIFRoZSBvdGhlciBsb2NrZWQgdGFzayhzKSBzaG91bGQgcmVtYWluIGxvY2tlZC4KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVcGRhdGVXaGl0ZWxpc3RpbmdfdHdvVGFza3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuc2V0TG9ja1Rhc2tQYWNrYWdlcyhBRE1JTl9DT01QT05FTlQsIG5ldyBTdHJpbmdbXSB7IFBBQ0tBR0VfTkFNRSwKKyAgICAgICAgICAgICAgICBSRUNFSVZFUl9BQ1RJVklUWV9QQUNLQUdFX05BTUV9KTsKKworICAgICAgICAvLyBTdGFydCBmaXJzdCBsb2NrZWQgdGFzaworICAgICAgICBzdGFydExvY2tUYXNrKFVUSUxJVFlfQUNUSVZJVFkpOworICAgICAgICB3YWl0Rm9yUmVzdW1lKCk7CisKKyAgICAgICAgLy8gU3RhcnQgdGhlIG90aGVyIHRhc2sgZnJvbSB0aGUgcnVubmluZyBhY3Rpdml0eQorICAgICAgICBtSXNSZWNlaXZlckFjdGl2aXR5UnVubmluZyA9IGZhbHNlOworICAgICAgICBJbnRlbnQgbGF1bmNoSW50ZW50ID0gY3JlYXRlUmVjZWl2ZXJBY3Rpdml0eUludGVudCh0cnVlIC8qbmV3VGFzayovLCB0cnVlIC8qc2hvdWxkV2FpdCovKTsKKyAgICAgICAgbUNvbnRleHQuc3RhcnRBY3Rpdml0eShsYXVuY2hJbnRlbnQpOworICAgICAgICBzeW5jaHJvbml6ZWQgKG1SZWNlaXZlckFjdGl2aXR5UnVubmluZ0xvY2spIHsKKyAgICAgICAgICAgIG1SZWNlaXZlckFjdGl2aXR5UnVubmluZ0xvY2sud2FpdChBQ1RJVklUWV9SRVNVTUVEX1RJTUVPVVRfTUlMTElTKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobUlzUmVjZWl2ZXJBY3Rpdml0eVJ1bm5pbmcpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVtb3ZlIHdoaXRlbGlzdCBhdXRob3JpemF0aW9uIG9mIHRoZSBzZWNvbmQgdGFzaworICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5zZXRMb2NrVGFza1BhY2thZ2VzKEFETUlOX0NPTVBPTkVOVCwgbmV3IFN0cmluZ1tdIHsgUEFDS0FHRV9OQU1FIH0pOworICAgICAgICBzeW5jaHJvbml6ZWQgKG1SZWNlaXZlckFjdGl2aXR5UnVubmluZ0xvY2spIHsKKyAgICAgICAgICAgIG1SZWNlaXZlckFjdGl2aXR5UnVubmluZ0xvY2sud2FpdChBQ1RJVklUWV9ERVNUUk9ZRURfVElNRU9VVF9NSUxMSVMpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UobUlzUmVjZWl2ZXJBY3Rpdml0eVJ1bm5pbmcpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0TG9ja1Rhc2tNb2RlQWN0aXZlKCk7CisgICAgICAgIGFzc2VydFRydWUobUlzQWN0aXZpdHlSdW5uaW5nKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtSXNBY3Rpdml0eVJlc3VtZWQpOworCisgICAgICAgIHN0b3BBbmRGaW5pc2goVVRJTElUWV9BQ1RJVklUWSk7CisgICAgfQorCiAgICAgLy8gVGhpcyBsYXVuY2hlcyBhbiBhY3Rpdml0eSB0aGF0IGlzIGluIHRoZSBjdXJyZW50IHRhc2suCiAgICAgLy8gVGhpcyBzaG91bGQgYWx3YXlzIGJlIHBlcm1pdHRlZCBhcyBhIHBhcnQgb2YgbG9jayB0YXNrIChzaW5jZSBpdCBpc24ndCBhIG5ldyB0YXNrKS4KICAgICBAVGVzdApAQCAtMjI3LDE1ICszMDksMTUgQEAKICAgICAgICAgc3RhcnRMb2NrVGFzayhVVElMSVRZX0FDVElWSVRZKTsKICAgICAgICAgd2FpdEZvclJlc3VtZSgpOwogCi0gICAgICAgIG1SZWNlaXZpbmdBY3Rpdml0eVdhc0NyZWF0ZWQgPSBmYWxzZTsKLSAgICAgICAgSW50ZW50IGxhdW5jaEludGVudCA9IGdldEludGVudFJlY2VpdmluZ0FjdGl2aXR5SW50ZW50KDApOworICAgICAgICBtSXNSZWNlaXZlckFjdGl2aXR5UnVubmluZyA9IGZhbHNlOworICAgICAgICBJbnRlbnQgbGF1bmNoSW50ZW50ID0gY3JlYXRlUmVjZWl2ZXJBY3Rpdml0eUludGVudChmYWxzZSAvKm5ld1Rhc2sqLywgZmFsc2UgLypzaG91bGRXYWl0Ki8pOwogICAgICAgICBJbnRlbnQgbG9ja1Rhc2tVdGlsaXR5ID0gZ2V0TG9ja1Rhc2tVdGlsaXR5KFVUSUxJVFlfQUNUSVZJVFkpOwogICAgICAgICBsb2NrVGFza1V0aWxpdHkucHV0RXh0cmEoTG9ja1Rhc2tVdGlsaXR5QWN0aXZpdHkuU1RBUlRfQUNUSVZJVFksIGxhdW5jaEludGVudCk7CiAgICAgICAgIG1Db250ZXh0LnN0YXJ0QWN0aXZpdHkobG9ja1Rhc2tVdGlsaXR5KTsKIAotICAgICAgICBzeW5jaHJvbml6ZWQgKG1SZWNlaXZpbmdBY3Rpdml0eUNyZWF0ZWRMb2NrKSB7Ci0gICAgICAgICAgICBtUmVjZWl2aW5nQWN0aXZpdHlDcmVhdGVkTG9jay53YWl0KEFDVElWSVRZX1JFU1VNRURfVElNRU9VVF9NSUxMSVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtUmVjZWl2aW5nQWN0aXZpdHlXYXNDcmVhdGVkKTsKKyAgICAgICAgc3luY2hyb25pemVkIChtUmVjZWl2ZXJBY3Rpdml0eVJ1bm5pbmdMb2NrKSB7CisgICAgICAgICAgICBtUmVjZWl2ZXJBY3Rpdml0eVJ1bm5pbmdMb2NrLndhaXQoQUNUSVZJVFlfUkVTVU1FRF9USU1FT1VUX01JTExJUyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKG1Jc1JlY2VpdmVyQWN0aXZpdHlSdW5uaW5nKTsKICAgICAgICAgfQogICAgICAgICBzdG9wQW5kRmluaXNoKFVUSUxJVFlfQUNUSVZJVFkpOwogICAgIH0KQEAgLTI0NSwxNyArMzI3LDE2IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhcnRBY3Rpdml0eV9vdXRzaWRlVGFza1doaXRlbGlzdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnNldExvY2tUYXNrUGFja2FnZXMoQURNSU5fQ09NUE9ORU5ULCBuZXcgU3RyaW5nW10geyBQQUNLQUdFX05BTUUsCi0gICAgICAgICAgICAgICAgUkVDRUlWSU5HX0FDVElWSVRZX1BBQ0tBR0VfTkFNRSB9KTsKKyAgICAgICAgICAgICAgICBSRUNFSVZFUl9BQ1RJVklUWV9QQUNLQUdFX05BTUV9KTsKICAgICAgICAgc3RhcnRMb2NrVGFzayhVVElMSVRZX0FDVElWSVRZKTsKICAgICAgICAgd2FpdEZvclJlc3VtZSgpOwogCi0gICAgICAgIG1SZWNlaXZpbmdBY3Rpdml0eVdhc0NyZWF0ZWQgPSBmYWxzZTsKLSAgICAgICAgSW50ZW50IGxhdW5jaEludGVudCA9IGdldEludGVudFJlY2VpdmluZ0FjdGl2aXR5SW50ZW50KDApOwotICAgICAgICBsYXVuY2hJbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOworICAgICAgICBtSXNSZWNlaXZlckFjdGl2aXR5UnVubmluZyA9IGZhbHNlOworICAgICAgICBJbnRlbnQgbGF1bmNoSW50ZW50ID0gY3JlYXRlUmVjZWl2ZXJBY3Rpdml0eUludGVudCh0cnVlIC8qbmV3VGFzayovLCBmYWxzZSAvKnNob3VsZFdhaXQqLyk7CiAgICAgICAgIG1Db250ZXh0LnN0YXJ0QWN0aXZpdHkobGF1bmNoSW50ZW50KTsKLSAgICAgICAgc3luY2hyb25pemVkIChtUmVjZWl2aW5nQWN0aXZpdHlDcmVhdGVkTG9jaykgewotICAgICAgICAgICAgbVJlY2VpdmluZ0FjdGl2aXR5Q3JlYXRlZExvY2sud2FpdChBQ1RJVklUWV9SRVNVTUVEX1RJTUVPVVRfTUlMTElTKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobVJlY2VpdmluZ0FjdGl2aXR5V2FzQ3JlYXRlZCk7CisgICAgICAgIHN5bmNocm9uaXplZCAobVJlY2VpdmVyQWN0aXZpdHlSdW5uaW5nTG9jaykgeworICAgICAgICAgICAgbVJlY2VpdmVyQWN0aXZpdHlSdW5uaW5nTG9jay53YWl0KEFDVElWSVRZX1JFU1VNRURfVElNRU9VVF9NSUxMSVMpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtSXNSZWNlaXZlckFjdGl2aXR5UnVubmluZyk7CiAgICAgICAgIH0KICAgICAgICAgc3RvcEFuZEZpbmlzaChVVElMSVRZX0FDVElWSVRZKTsKICAgICB9CkBAIC0yNjgsMTEgKzM0OSwxMSBAQAogICAgICAgICBzdGFydExvY2tUYXNrKFVUSUxJVFlfQUNUSVZJVFkpOwogICAgICAgICB3YWl0Rm9yUmVzdW1lKCk7CiAKLSAgICAgICAgSW50ZW50IGxhdW5jaEludGVudCA9IGdldEludGVudFJlY2VpdmluZ0FjdGl2aXR5SW50ZW50KEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLKTsKKyAgICAgICAgSW50ZW50IGxhdW5jaEludGVudCA9IGNyZWF0ZVJlY2VpdmVyQWN0aXZpdHlJbnRlbnQodHJ1ZSAvKm5ld1Rhc2sqLywgZmFsc2UgLypzaG91bGRXYWl0Ki8pOwogICAgICAgICBtQ29udGV4dC5zdGFydEFjdGl2aXR5KGxhdW5jaEludGVudCk7CiAgICAgICAgIHN5bmNocm9uaXplZCAobUFjdGl2aXR5UmVzdW1lZExvY2spIHsKICAgICAgICAgICAgIG1BY3Rpdml0eVJlc3VtZWRMb2NrLndhaXQoQUNUSVZJVFlfUkVTVU1FRF9USU1FT1VUX01JTExJUyk7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZShtUmVjZWl2aW5nQWN0aXZpdHlXYXNDcmVhdGVkKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKG1Jc1JlY2VpdmVyQWN0aXZpdHlSdW5uaW5nKTsKICAgICAgICAgfQogICAgICAgICBzdG9wQW5kRmluaXNoKFVUSUxJVFlfQUNUSVZJVFkpOwogICAgIH0KQEAgLTM0MSw2ICs0MjIsMjcgQEAKICAgICAgICAgYXNzZXJ0RmFsc2UobUlzQWN0aXZpdHlSZXN1bWVkKTsKICAgICB9CiAKKyAgICAvLyBTdGFydCBsb2NrIHRhc2sgd2l0aCBBY3Rpdml0eU9wdGlvbnMKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBY3Rpdml0eU9wdGlvbnNfd2hpdGVsaXN0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuc2V0TG9ja1Rhc2tQYWNrYWdlcyhBRE1JTl9DT01QT05FTlQsIG5ldyBTdHJpbmdbXSB7IFBBQ0tBR0VfTkFNRSB9KTsKKyAgICAgICAgc3RhcnRMb2NrVGFza1dpdGhPcHRpb25zKFVUSUxJVFlfQUNUSVZJVFkpOworICAgICAgICB3YWl0Rm9yUmVzdW1lKCk7CisKKyAgICAgICAgLy8gVmVyaWZ5IHRoYXQgYWN0aXZpdHkgb3BlbiBhbmQgYWN0aXZpdHkgbWFuYWdlciBpcyBpbiBsb2NrIHRhc2suCisgICAgICAgIGFzc2VydExvY2tUYXNrTW9kZUFjdGl2ZSgpOworICAgICAgICBhc3NlcnRUcnVlKG1Jc0FjdGl2aXR5UnVubmluZyk7CisgICAgICAgIGFzc2VydFRydWUobUlzQWN0aXZpdHlSZXN1bWVkKTsKKworICAgICAgICBzdG9wQW5kRmluaXNoKFVUSUxJVFlfQUNUSVZJVFkpOworICAgIH0KKworICAgIC8vIFN0YXJ0aW5nIGEgbm9uLXdoaXRlbGlzdGVkIGFjdGl2aXR5IHdpdGggQWN0aXZpdHlPcHRpb25zIGlzIG5vdCBhbGxvd2VkCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBTZWN1cml0eUV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWN0aXZpdHlPcHRpb25zX25vbldoaXRlbGlzdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN0YXJ0TG9ja1Rhc2tXaXRoT3B0aW9ucyhVVElMSVRZX0FDVElWSVRZKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBDaGVja3MgdGhhdCBsb2NrIHRhc2sgbW9kZSBpcyBhY3RpdmUgYW5kIGZhaWxzIHRoZSB0ZXN0IGlmIGl0IGlzbid0LgogICAgICAqLwpAQCAtNDEyLDYgKzUxNCwxNSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFN0YXJ0cyBMb2NrVGFza1V0aWxpdHlBY3Rpdml0eSB3aXRoIHtAbGluayBBY3Rpdml0eU9wdGlvbnMjc2V0TG9ja1Rhc2tFbmFibGVkKGJvb2xlYW4pfQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzdGFydExvY2tUYXNrV2l0aE9wdGlvbnMoU3RyaW5nIGNsYXNzTmFtZSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgSW50ZW50IGludGVudCA9IGdldExvY2tUYXNrVXRpbGl0eShjbGFzc05hbWUpOworICAgICAgICBCdW5kbGUgb3B0aW9ucyA9IEFjdGl2aXR5T3B0aW9ucy5tYWtlQmFzaWMoKS5zZXRMb2NrVGFza0VuYWJsZWQodHJ1ZSkudG9CdW5kbGUoKTsKKyAgICAgICAgc3RhcnRBbmRXYWl0KGludGVudCwgb3B0aW9ucyk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogQ2FsbHMgc3RvcExvY2tUYXNrIG9uIHRoZSBMb2NrVGFza1V0aWxpdHlBY3Rpdml0eQogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBzdG9wTG9ja1Rhc2soU3RyaW5nIGNsYXNzTmFtZSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKQEAgLTQzNSw5ICs1NDYsMTYgQEAKICAgICAgKiB0aGUgY29tbWFuZC4KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgc3RhcnRBbmRXYWl0KEludGVudCBpbnRlbnQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIHN0YXJ0QW5kV2FpdChpbnRlbnQsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNhbWUgYXMge0BsaW5rICNzdGFydEFuZFdhaXQoSW50ZW50KX0sIGJ1dCB3aXRoIGFkZGl0aW9uYWwge0BsaW5rIEFjdGl2aXR5T3B0aW9uc30uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0QW5kV2FpdChJbnRlbnQgaW50ZW50LCBCdW5kbGUgb3B0aW9ucykgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKICAgICAgICAgbUludGVudEhhbmRsZWQgPSBmYWxzZTsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICBtQ29udGV4dC5zdGFydEFjdGl2aXR5KGludGVudCk7CisgICAgICAgICAgICBtQ29udGV4dC5zdGFydEFjdGl2aXR5KGludGVudCwgb3B0aW9ucyk7CiAgICAgICAgICAgICAvLyBHaXZlIDIwIHNlY3MgdG8gZmluaXNoLgogICAgICAgICAgICAgd2FpdChBQ1RJVklUWV9SVU5OSU5HX1RJTUVPVVRfTUlMTElTKTsKICAgICAgICAgICAgIGFzc2VydFRydWUobUludGVudEhhbmRsZWQpOwpAQCAtNDU2LDEyICs1NzQsMTMgQEAKICAgICAgICAgcmV0dXJuIGludGVudDsKICAgICB9CiAKLSAgICBwcml2YXRlIEludGVudCBnZXRJbnRlbnRSZWNlaXZpbmdBY3Rpdml0eUludGVudChpbnQgZmxhZ3MpIHsKLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoKTsKKyAgICAvKiogQ3JlYXRlIGFuIGludGVudCB0byBsYXVuY2gge0BsaW5rICNSRUNFSVZFUl9BQ1RJVklUWV9OQU1FfS4gKi8KKyAgICBwcml2YXRlIEludGVudCBjcmVhdGVSZWNlaXZlckFjdGl2aXR5SW50ZW50KGJvb2xlYW4gbmV3VGFzaywgYm9vbGVhbiBzaG91bGRXYWl0KSB7CisgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KCk7CiAgICAgICAgIGludGVudC5zZXRDb21wb25lbnQoCi0gICAgICAgICAgICAgICAgbmV3IENvbXBvbmVudE5hbWUoUkVDRUlWSU5HX0FDVElWSVRZX1BBQ0tBR0VfTkFNRSwgUkVDRUlWSU5HX0FDVElWSVRZX05BTUUpKTsKLSAgICAgICAgaW50ZW50LnNldEFjdGlvbihBQ1RJT05fSlVTVF9DUkVBVEUpOwotICAgICAgICBpbnRlbnQuc2V0RmxhZ3MoZmxhZ3MpOworICAgICAgICAgICAgICAgIG5ldyBDb21wb25lbnROYW1lKFJFQ0VJVkVSX0FDVElWSVRZX1BBQ0tBR0VfTkFNRSwgUkVDRUlWRVJfQUNUSVZJVFlfTkFNRSkpOworICAgICAgICBpbnRlbnQuc2V0QWN0aW9uKHNob3VsZFdhaXQgPyBBQ1RJT05fQ1JFQVRFX0FORF9XQUlUIDogQUNUSU9OX0pVU1RfQ1JFQVRFKTsKKyAgICAgICAgaW50ZW50LnNldEZsYWdzKG5ld1Rhc2sgPyBJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyA6IDApOwogICAgICAgICByZXR1cm4gaW50ZW50OwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZW93bmVyL05ldHdvcmtMb2dnaW5nVGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlb3duZXIvTmV0d29ya0xvZ2dpbmdUZXN0LmphdmEKaW5kZXggNmI2MmU4OC4uYTdhMDhlNSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlb3duZXIvTmV0d29ya0xvZ2dpbmdUZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlb3duZXIvTmV0d29ya0xvZ2dpbmdUZXN0LmphdmEKQEAgLTIyLDkgKzIyLDExIEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5jb250ZW50LkxvY2FsQnJvYWRjYXN0TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCitpbXBvcnQgYW5kcm9pZHgubG9jYWxicm9hZGNhc3RtYW5hZ2VyLmNvbnRlbnQuTG9jYWxCcm9hZGNhc3RNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CisKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKQEAgLTM2LDYgKzM4LDcgQEAKIGltcG9ydCBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQ7CiBpbXBvcnQgamF2YS5uZXQuU29ja2V0OwogaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwpAQCAtNDMsNiArNDYsNyBAQAogcHVibGljIGNsYXNzIE5ldHdvcmtMb2dnaW5nVGVzdCBleHRlbmRzIEJhc2VEZXZpY2VPd25lclRlc3QgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJOZXR3b3JrTG9nZ2luZ1Rlc3QiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdfQkFUQ0hfQ09VTlQgPSAiYmF0Y2hDb3VudCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZBS0VfQkFUQ0hfVE9LRU4gPSAtNjY2OyAvLyByZWFsIGJhdGNoIHRva2VucyBhcmUgYWx3YXlzIG5vbi1uZWdhdGl2ZQogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGVUxMX0xPR19CQVRDSF9TSVpFID0gMTIwMDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1RTX0FQUF9QQUNLQUdFX05BTUUgPSAiY29tLmFuZHJvaWQuY3RzLmRldmljZW93bmVyIjsKQEAgLTcxLDIwICs3NSwyOCBAQAogCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgICAgICBpZiAoQmFzZURldmljZU93bmVyVGVzdC5BQ1RJT05fTkVUV09SS19MT0dTX0FWQUlMQUJMRS5lcXVhbHMoaW50ZW50LmdldEFjdGlvbigpKSkgewotICAgICAgICAgICAgICAgIG1HZW5lcmF0ZU5ldHdvcmtUcmFmZmljID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRCYXRjaFRva2VuID0gaW50ZW50LmdldExvbmdFeHRyYSgKLSAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VEZXZpY2VPd25lclRlc3QuRVhUUkFfTkVUV09SS19MT0dTX0JBVENIX1RPS0VOLCBGQUtFX0JBVENIX1RPS0VOKTsKLSAgICAgICAgICAgICAgICBpZiAobUNvdW50RG93bkxhdGNoICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNvdW50RG93bkxhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgaWYgKEJhc2ljQWRtaW5SZWNlaXZlci5BQ1RJT05fTkVUV09SS19MT0dTX0FWQUlMQUJMRS5lcXVhbHMoaW50ZW50LmdldEFjdGlvbigpKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgdG9rZW4gPQorICAgICAgICAgICAgICAgICAgICAgICAgaW50ZW50LmdldExvbmdFeHRyYShCYXNpY0FkbWluUmVjZWl2ZXIuRVhUUkFfTkVUV09SS19MT0dTX0JBVENIX1RPS0VOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUtFX0JBVENIX1RPS0VOKTsKKyAgICAgICAgICAgICAgICAvLyBSZXRyaWV2ZSBuZXR3b3JrIGxvZ3MuCisgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxOZXR3b3JrRXZlbnQ+IGV2ZW50cyA9IG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnJldHJpZXZlTmV0d29ya0xvZ3MoZ2V0V2hvKCksCisgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbik7CisgICAgICAgICAgICAgICAgaWYgKGV2ZW50cyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZhaWwoIkZhaWxlZCB0byByZXRyaWV2ZSBiYXRjaCBvZiBuZXR3b3JrIGxvZ3Mgd2l0aCBiYXRjaCB0b2tlbiAiICsgdG9rZW4pOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtQmF0Y2hDb3VudERvd24uZ2V0Q291bnQoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbU5ldHdvcmtFdmVudHMuYWRkQWxsKGV2ZW50cyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1CYXRjaENvdW50RG93bi5jb3VudERvd24oKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH07CiAKLSAgICBwcml2YXRlIENvdW50RG93bkxhdGNoIG1Db3VudERvd25MYXRjaDsKLSAgICBwcml2YXRlIGxvbmcgbUN1cnJlbnRCYXRjaFRva2VuOwotICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBtR2VuZXJhdGVOZXR3b3JrVHJhZmZpYzsKKyAgICBwcml2YXRlIENvdW50RG93bkxhdGNoIG1CYXRjaENvdW50RG93bjsKKyAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxOZXR3b3JrRXZlbnQ+IG1OZXR3b3JrRXZlbnRzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgcHJpdmF0ZSBpbnQgbUJhdGNoZXNSZXF1ZXN0ZWQgPSAxOwogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTEyNCwxMiArMTM2LDEzIEBACiAgICAgICogdHJhZmZpYywgc28gdGhhdCB0aGUgYmF0Y2ggb2YgbG9ncyBpcyBjcmVhdGVkCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdGVzdE5ldHdvcmtMb2dnaW5nQW5kUmV0cmlldmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1Db3VudERvd25MYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKLSAgICAgICAgbUN1cnJlbnRCYXRjaFRva2VuID0gRkFLRV9CQVRDSF9UT0tFTjsKLSAgICAgICAgbUdlbmVyYXRlTmV0d29ya1RyYWZmaWMgPSB0cnVlOworICAgICAgICBtQmF0Y2hlc1JlcXVlc3RlZCA9CisgICAgICAgICAgICAgICAgSW50ZWdlci5wYXJzZUludCgKKyAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEFyZ3VtZW50cygpLmdldFN0cmluZyhBUkdfQkFUQ0hfQ09VTlQsICIxIikpOworICAgICAgICBtQmF0Y2hDb3VudERvd24gPSBuZXcgQ291bnREb3duTGF0Y2gobUJhdGNoZXNSZXF1ZXN0ZWQpOwogICAgICAgICAvLyByZWdpc3RlciBhIHJlY2VpdmVyIHRoYXQgbGlzdGVucyBmb3IgRGV2aWNlQWRtaW5SZWNlaXZlciNvbk5ldHdvcmtMb2dzQXZhaWxhYmxlKCkKICAgICAgICAgZmluYWwgSW50ZW50RmlsdGVyIGZpbHRlck5ldHdvcmtMb2dzQXZhaWxhYmxlID0gbmV3IEludGVudEZpbHRlcigKLSAgICAgICAgICAgICAgICBCYXNlRGV2aWNlT3duZXJUZXN0LkFDVElPTl9ORVRXT1JLX0xPR1NfQVZBSUxBQkxFKTsKKyAgICAgICAgICAgICAgICBCYXNpY0FkbWluUmVjZWl2ZXIuQUNUSU9OX05FVFdPUktfTE9HU19BVkFJTEFCTEUpOwogICAgICAgICBMb2NhbEJyb2FkY2FzdE1hbmFnZXIuZ2V0SW5zdGFuY2UobUNvbnRleHQpLnJlZ2lzdGVyUmVjZWl2ZXIobU5ldHdvcmtMb2dzUmVjZWl2ZXIsCiAgICAgICAgICAgICAgICAgZmlsdGVyTmV0d29ya0xvZ3NBdmFpbGFibGUpOwogCkBAIC0xNDQsNDAgKzE1Nyw0NiBAQAogCiAgICAgICAgIC8vIFRPRE86IGhlcmUgdGVzdCB0aGF0IGZhY3RzIGFib3V0IGxvZ2dpbmcgYXJlIHNob3duIGluIHRoZSBVSQogCisgICAgICAgIC8vIEZldGNoIGFuZCB2ZXJpZnkgdGhlIGJhdGNoZXMgb2YgZXZlbnRzLgorICAgICAgICBnZW5lcmF0ZUJhdGNoZXMoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVCYXRjaGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIHZpc2l0IHdlYnNpdGVzIHRvIHZlcmlmeSB0aGVpciBkbnMgbG9va3VwcyBhcmUgbG9nZ2VkCiAgICAgICAgIGZvciAoZmluYWwgU3RyaW5nIHVybCA6IExPR0dFRF9VUkxTX0xJU1QpIHsKICAgICAgICAgICAgIGNvbm5lY3RUb1dlYnNpdGUodXJsKTsKICAgICAgICAgfQogCi0gICAgICAgIC8vIGdlbmVyYXRlIGVub3VnaCB0cmFmZmljIHRvIGZpbGwgYSBiYXRjaC4KLSAgICAgICAgaW50IGR1bW15UmVxTm8gPSBnZW5lcmF0ZUR1bW15VHJhZmZpYygpOworICAgICAgICAvLyBnZW5lcmF0ZSBlbm91Z2ggdHJhZmZpYyB0byBmaWxsIHRoZSBiYXRjaGVzLgorICAgICAgICBpbnQgZHVtbXlSZXFObyA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUJhdGNoZXNSZXF1ZXN0ZWQ7IGkrKykgeworICAgICAgICAgICAgZHVtbXlSZXFObyArPSBnZW5lcmF0ZUR1bW15VHJhZmZpYygpOworICAgICAgICB9CiAKICAgICAgICAgLy8gaWYgRGV2aWNlQWRtaW5SZWNlaXZlciNvbk5ldHdvcmtMb2dzQXZhaWxhYmxlKCkgaGFzbid0IGJlZW4gdHJpZ2dlcmVkIHlldCwgd2FpdCBmb3IgdXAgdG8KLSAgICAgICAgLy8gMyBtaW51dGVzIGp1c3QgaW4gY2FzZQotICAgICAgICBtQ291bnREb3duTGF0Y2guYXdhaXQoMywgVGltZVVuaXQuTUlOVVRFUyk7CisgICAgICAgIC8vIDMgbWludXRlcyBwZXIgYmF0Y2gganVzdCBpbiBjYXNlCisgICAgICAgIGZpbmFsIGludCB0aW1lb3V0TWlucyA9IDMgKiBtQmF0Y2hlc1JlcXVlc3RlZDsKKyAgICAgICAgbUJhdGNoQ291bnREb3duLmF3YWl0KHRpbWVvdXRNaW5zLCBUaW1lVW5pdC5NSU5VVEVTKTsKICAgICAgICAgTG9jYWxCcm9hZGNhc3RNYW5hZ2VyLmdldEluc3RhbmNlKG1Db250ZXh0KS51bnJlZ2lzdGVyUmVjZWl2ZXIobU5ldHdvcmtMb2dzUmVjZWl2ZXIpOwotICAgICAgICBpZiAobUdlbmVyYXRlTmV0d29ya1RyYWZmaWMpIHsKLSAgICAgICAgICAgIGZhaWwoIkNhcnJpZWQgb3V0IDEwMCBpdGVyYXRpb25zIGFuZCB3YWl0ZWQgZm9yIDMgbWludXRlcywgYnV0IHN0aWxsIGRpZG4ndCBnZXQiCisgICAgICAgIGlmIChtQmF0Y2hDb3VudERvd24uZ2V0Q291bnQoKSA+IDApIHsKKyAgICAgICAgICAgIGZhaWwoIkdlbmVyYXRlZCBldmVudHMgZm9yICIgKyBtQmF0Y2hlc1JlcXVlc3RlZCArICIgYmF0Y2hlcyBhbmQgd2FpdGVkIGZvciAiCisgICAgICAgICAgICAgICAgICAgICsgdGltZW91dE1pbnMgKyAiIG1pbnV0ZXMsIGJ1dCBzdGlsbCBkaWRuJ3QgZ2V0IgogICAgICAgICAgICAgICAgICAgICArICIgRGV2aWNlQWRtaW5SZWNlaXZlciNvbk5ldHdvcmtMb2dzQXZhaWxhYmxlKCkgY2FsbGJhY2siKTsKICAgICAgICAgfQogCi0gICAgICAgIC8vIHJldHJpZXZlIGFuZCB2ZXJpZnkgbmV0d29yayBsb2dzCi0gICAgICAgIGZpbmFsIExpc3Q8TmV0d29ya0V2ZW50PiBuZXR3b3JrRXZlbnRzID0gbURldmljZVBvbGljeU1hbmFnZXIucmV0cmlldmVOZXR3b3JrTG9ncyhnZXRXaG8oKSwKLSAgICAgICAgICAgICAgICBtQ3VycmVudEJhdGNoVG9rZW4pOwotICAgICAgICBpZiAobmV0d29ya0V2ZW50cyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBmYWlsKCJGYWlsZWQgdG8gcmV0cmlldmUgYmF0Y2ggb2YgbmV0d29yayBsb2dzIHdpdGggYmF0Y2ggdG9rZW4gIiArIG1DdXJyZW50QmF0Y2hUb2tlbik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQorICAgICAgICAvLyBWZXJpZnkgbmV0d29yayBsb2dzLgorICAgICAgICBhc3NlcnRFcXVhbHMoIkZpcnN0IGV2ZW50IGhhcyB0aGUgd3JvbmcgaWQuIiwgMEwsIG1OZXR3b3JrRXZlbnRzLmdldCgwKS5nZXRJZCgpKTsKICAgICAgICAgLy8gRm9yIGVhY2ggb2YgdGhlIHJlYWwgVVJMcyB3ZSBoYXZlIHR3byBldmVudHM6IG9uZSBETlMgYW5kIG9uZSBjb25uZWN0LiBEdW1teSByZXF1ZXN0cwogICAgICAgICAvLyBkb24ndCByZXF1aXJlIEROUyBxdWVyaWVzLgotICAgICAgICBpbnQgZXZlbnRzRXhwZWN0ZWQgPQotICAgICAgICAgICAgICAgIE1hdGgubWluKEZVTExfTE9HX0JBVENIX1NJWkUsIDIgKiBMT0dHRURfVVJMU19MSVNULmxlbmd0aCArIGR1bW15UmVxTm8pOwotICAgICAgICB2ZXJpZnlOZXR3b3JrTG9ncyhuZXR3b3JrRXZlbnRzLCBldmVudHNFeHBlY3RlZCk7CisgICAgICAgIGZpbmFsIGludCBldmVudHNFeHBlY3RlZCA9CisgICAgICAgICAgICAgICAgTWF0aC5taW4oRlVMTF9MT0dfQkFUQ0hfU0laRSAqIG1CYXRjaGVzUmVxdWVzdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgMiAqIExPR0dFRF9VUkxTX0xJU1QubGVuZ3RoICsgZHVtbXlSZXFObyk7CisgICAgICAgIHZlcmlmeU5ldHdvcmtMb2dzKG1OZXR3b3JrRXZlbnRzLCBldmVudHNFeHBlY3RlZCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeU5ldHdvcmtMb2dzKExpc3Q8TmV0d29ya0V2ZW50PiBuZXR3b3JrRXZlbnRzLCBpbnQgZXZlbnRzRXhwZWN0ZWQpIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZShuZXR3b3JrRXZlbnRzLnNpemUoKSA9PSBGVUxMX0xPR19CQVRDSF9TSVpFKTsKKyAgICAgICAgLy8gYWxsb3cgYSBiYXRjaCB0byBiZSBzbGlnaHRseSBzbWFsbGVyIG9yIGxhcmdlci4KKyAgICAgICAgYXNzZXJ0VHJ1ZShNYXRoLmFicyhldmVudHNFeHBlY3RlZCAtIG5ldHdvcmtFdmVudHMuc2l6ZSgpKSA8PSA1MCk7CiAgICAgICAgIGludCBjdHNQYWNrYWdlTmFtZUNvdW50ZXIgPSAwOwogICAgICAgICAvLyBhbGxvdyBhIHNtYWxsIGRvd24gbWFyZ2luIGZvciB2ZXJpZmljYXRpb24sIHRvIGF2b2lkIGZsYWtpbmVzcwogICAgICAgICBmaW5hbCBpbnQgZXZlbnRzRXhwZWN0ZWRXaXRoTWFyZ2luID0gZXZlbnRzRXhwZWN0ZWQgLSA1MDsKQEAgLTE4OSw2ICsyMDgsMTAgQEAKICAgICAgICAgICAgIGlmIChpID4gMCkgewogICAgICAgICAgICAgICAgIGFzc2VydFRydWUoY3VycmVudEV2ZW50LmdldFRpbWVzdGFtcCgpID49IG5ldHdvcmtFdmVudHMuZ2V0KGkgLSAxKS5nZXRUaW1lc3RhbXAoKSk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyB2ZXJpZnkgdGhhdCB0aGUgZXZlbnQgSURzIGFyZSBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcKKyAgICAgICAgICAgIGlmIChpID4gMCkgeworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoY3VycmVudEV2ZW50LmdldElkKCkgPT0gKG5ldHdvcmtFdmVudHMuZ2V0KGkgLSAxKS5nZXRJZCgpICsgMSkpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gY291bnQgaG93IG1hbnkgZXZlbnRzIGNvbWUgZnJvbSB0aGUgQ1RTIGFwcAogICAgICAgICAgICAgaWYgKENUU19BUFBfUEFDS0FHRV9OQU1FLmVxdWFscyhjdXJyZW50RXZlbnQuZ2V0UGFja2FnZU5hbWUoKSkpIHsKICAgICAgICAgICAgICAgICBjdHNQYWNrYWdlTmFtZUNvdW50ZXIrKzsKQEAgLTI1NywxMCArMjgwLDEwIEBACiAKICAgICAvKiogUXVpY2tseSBnZW5lcmF0ZSBsb2FkcyBvZiBldmVudHMgYnkgcmVwZWF0ZWRseSBjb25uZWN0aW5nIHRvIGEgbG9jYWwgc2VydmVyLiAqLwogICAgIHByaXZhdGUgaW50IGdlbmVyYXRlRHVtbXlUcmFmZmljKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNlcnZlclNvY2tldCBzZXJ2ZXJTb2NrZXQgPSBuZXcgU2VydmVyU29ja2V0KDApOwotICAgICAgICBUaHJlYWQgc2VydmVyVGhyZWFkID0gc3RhcnREdW1teVNlcnZlcihzZXJ2ZXJTb2NrZXQpOworICAgICAgICBmaW5hbCBTZXJ2ZXJTb2NrZXQgc2VydmVyU29ja2V0ID0gbmV3IFNlcnZlclNvY2tldCgwKTsKKyAgICAgICAgZmluYWwgVGhyZWFkIHNlcnZlclRocmVhZCA9IHN0YXJ0RHVtbXlTZXJ2ZXIoc2VydmVyU29ja2V0KTsKIAotICAgICAgICBpbnQgcmVxTm8gPSBtYWtlRHVtbXlSZXF1ZXN0cyhzZXJ2ZXJTb2NrZXQuZ2V0TG9jYWxQb3J0KCkpOworICAgICAgICBmaW5hbCBpbnQgcmVxTm8gPSBtYWtlRHVtbXlSZXF1ZXN0cyhzZXJ2ZXJTb2NrZXQuZ2V0TG9jYWxQb3J0KCkpOwogCiAgICAgICAgIHNlcnZlclNvY2tldC5jbG9zZSgpOwogICAgICAgICBzZXJ2ZXJUaHJlYWQuam9pbigpOwpAQCAtMjcwLDggKzI5Myw4IEBACiAKICAgICBwcml2YXRlIGludCBtYWtlRHVtbXlSZXF1ZXN0cyhpbnQgcG9ydCkgewogICAgICAgICBpbnQgcmVxTm87Ci0gICAgICAgIGZpbmFsIFN0cmluZyBEVU1NWV9TRVJWRVIgPSAiMTI3LjAuMC4xOiIgKyBwb3J0ICsgIiI7Ci0gICAgICAgIGZvciAocmVxTm8gPSAwOyByZXFObyA8IEZVTExfTE9HX0JBVENIX1NJWkUgJiYgbUdlbmVyYXRlTmV0d29ya1RyYWZmaWM7IHJlcU5vKyspIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIERVTU1ZX1NFUlZFUiA9ICIxMjcuMC4wLjE6IiArIHBvcnQ7CisgICAgICAgIGZvciAocmVxTm8gPSAwOyByZXFObyA8IEZVTExfTE9HX0JBVENIX1NJWkUgJiYgbUJhdGNoQ291bnREb3duLmdldENvdW50KCkgPiAwOyByZXFObysrKSB7CiAgICAgICAgICAgICBjb25uZWN0VG9XZWJzaXRlKERVTU1ZX1NFUlZFUik7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIC8vIEp1c3QgdG8gcHJldmVudCBjaG9raW5nIHRoZSBzZXJ2ZXIuCkBAIC0yODQsMjkgKzMwNywyNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgVGhyZWFkIHN0YXJ0RHVtbXlTZXJ2ZXIoU2VydmVyU29ja2V0IHNlcnZlclNvY2tldCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgVGhyZWFkIHNlcnZlclRocmVhZCA9IG5ldyBUaHJlYWQoKCkgLT4gewotICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgZmluYWwgVGhyZWFkIHNlcnZlclRocmVhZCA9IG5ldyBUaHJlYWQoKCkgLT4geworICAgICAgICAgICAgd2hpbGUgKCFzZXJ2ZXJTb2NrZXQuaXNDbG9zZWQoKSkgewogICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIFNvY2tldCBzb2NrZXQgPSBzZXJ2ZXJTb2NrZXQuYWNjZXB0KCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNvY2tldCBzb2NrZXQgPSBzZXJ2ZXJTb2NrZXQuYWNjZXB0KCk7CiAgICAgICAgICAgICAgICAgICAgIC8vIENvbnN1bWUgaW5wdXQuCi0gICAgICAgICAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGlucHV0ID0KKyAgICAgICAgICAgICAgICAgICAgZmluYWwgQnVmZmVyZWRSZWFkZXIgaW5wdXQgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoc29ja2V0LmdldElucHV0U3RyZWFtKCkpKTsKICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxpbmU7CiAgICAgICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBpbnB1dC5yZWFkTGluZSgpOwogICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChsaW5lICE9IG51bGwgJiYgIWxpbmUuZXF1YWxzKCIiKSk7CiAgICAgICAgICAgICAgICAgICAgIC8vIFJldHVybiBtaW5pbXVtIHZhbGlkIHJlc3BvbnNlLgotICAgICAgICAgICAgICAgICAgICBQcmludFN0cmVhbSBvdXRwdXQgPSBuZXcgUHJpbnRTdHJlYW0oc29ja2V0LmdldE91dHB1dFN0cmVhbSgpKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgUHJpbnRTdHJlYW0gb3V0cHV0ID0gbmV3IFByaW50U3RyZWFtKHNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKSk7CiAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5wcmludGxuKCJIVFRQLzEuMCAyMDAgT0siKTsKICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnByaW50bG4oIkNvbnRlbnQtTGVuZ3RoOiAwIik7CiAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5wcmludGxuKCk7CiAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5mbHVzaCgpOwogICAgICAgICAgICAgICAgICAgICBvdXRwdXQuY2xvc2UoKTsKICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtR2VuZXJhdGVOZXR3b3JrVHJhZmZpYykgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXNlcnZlclNvY2tldC5pc0Nsb3NlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdG8gc2VydmUgY29ubmVjdGlvbiIsIGUpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vvd25lci9PdmVycmlkZUFwblRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZW93bmVyL092ZXJyaWRlQXBuVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NWQ4MzUKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vvd25lci9PdmVycmlkZUFwblRlc3QuamF2YQpAQCAtMCwwICsxLDI1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY3RzLmRldmljZW93bmVyOworCitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlRlbGVwaG9ueU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuZGF0YS5BcG5TZXR0aW5nOworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFRlc3Qgb3ZlcnJpZGUgQVBOIEFQSXMuCisgKi8KK3B1YmxpYyBjbGFzcyBPdmVycmlkZUFwblRlc3QgZXh0ZW5kcyBCYXNlRGV2aWNlT3duZXJUZXN0IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9BUE5fTkFNRSA9ICJ0ZXN0QXBuTmFtZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVQREFURV9BUE5fTkFNRSA9ICJ1cGRhdGVBcG5OYW1lIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9FTlRSWV9OQU1FID0gInRlc3RFbnRyeU5hbWUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUERBVEVfRVROUllfTkFNRSA9ICJ1cGRhdGVFbnRyeU5hbWUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX09QRVJBVE9SX05VTUVSSUMgPSAiMTIzNDU2Nzg5IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEVTVF9QUk9YWV9QT1JUID0gMTIzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1BST1hZX0FERFJFU1MgPSAiMTIzLjEyMy4xMjMuMTIzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVcmkgVEVTVF9NTVNDID0gVXJpLnBhcnNlKCJodHRwOi8vd3d3Lmdvb2dsZS5jb20iKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9VU0VSX05BTUUgPSAidGVzdFVzZXIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1BBU1NXT1JEID0gInRlc3RQYXNzd29yZCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRFU1RfQVVUSF9UWVBFID0gQXBuU2V0dGluZy5BVVRIX1RZUEVfQ0hBUDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEVTVF9BUE5fVFlQRV9CSVRNQVNLCisgICAgICAgID0gQXBuU2V0dGluZy5UWVBFX0RFRkFVTFQgfCBBcG5TZXR0aW5nLlRZUEVfRU1FUkdFTkNZOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBURVNUX1BST1RPQ09MID0gQXBuU2V0dGluZy5QUk9UT0NPTF9JUFY0VjY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRFU1RfTkVUV09SS19UWVBFX0JJVE1BU0sgPSBUZWxlcGhvbnlNYW5hZ2VyLk5FVFdPUktfVFlQRV9DRE1BOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBURVNUX01WTk9fVFlQRSA9IEFwblNldHRpbmcuTVZOT19UWVBFX0dJRDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFRFU1RfRU5BQkxFRCA9IHRydWU7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBcG5TZXR0aW5nIHRlc3RBcG5GdWxsOworICAgIHN0YXRpYyB7CisgICAgICAgIHRlc3RBcG5GdWxsID0gbmV3IEFwblNldHRpbmcuQnVpbGRlcigpCisgICAgICAgICAgICAuc2V0QXBuTmFtZShURVNUX0FQTl9OQU1FKQorICAgICAgICAgICAgLnNldEVudHJ5TmFtZShURVNUX0VOVFJZX05BTUUpCisgICAgICAgICAgICAuc2V0T3BlcmF0b3JOdW1lcmljKFRFU1RfT1BFUkFUT1JfTlVNRVJJQykKKyAgICAgICAgICAgIC5zZXRQcm94eUFkZHJlc3MoZ2V0UHJveHlJbmV0QWRkcmVzcyhURVNUX1BST1hZX0FERFJFU1MpKQorICAgICAgICAgICAgLnNldFByb3h5UG9ydChURVNUX1BST1hZX1BPUlQpCisgICAgICAgICAgICAuc2V0TW1zYyhURVNUX01NU0MpCisgICAgICAgICAgICAuc2V0TW1zUHJveHlBZGRyZXNzKGdldFByb3h5SW5ldEFkZHJlc3MoVEVTVF9QUk9YWV9BRERSRVNTKSkKKyAgICAgICAgICAgIC5zZXRNbXNQcm94eVBvcnQoVEVTVF9QUk9YWV9QT1JUKQorICAgICAgICAgICAgLnNldFVzZXIoVEVTVF9VU0VSX05BTUUpCisgICAgICAgICAgICAuc2V0UGFzc3dvcmQoVEVTVF9QQVNTV09SRCkKKyAgICAgICAgICAgIC5zZXRBdXRoVHlwZShURVNUX0FVVEhfVFlQRSkKKyAgICAgICAgICAgIC5zZXRBcG5UeXBlQml0bWFzayhURVNUX0FQTl9UWVBFX0JJVE1BU0spCisgICAgICAgICAgICAuc2V0UHJvdG9jb2woVEVTVF9QUk9UT0NPTCkKKyAgICAgICAgICAgIC5zZXRSb2FtaW5nUHJvdG9jb2woVEVTVF9QUk9UT0NPTCkKKyAgICAgICAgICAgIC5zZXROZXR3b3JrVHlwZUJpdG1hc2soVEVTVF9ORVRXT1JLX1RZUEVfQklUTUFTSykKKyAgICAgICAgICAgIC5zZXRNdm5vVHlwZShURVNUX01WTk9fVFlQRSkKKyAgICAgICAgICAgIC5zZXRDYXJyaWVyRW5hYmxlZChURVNUX0VOQUJMRUQpCisgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBJbmV0QWRkcmVzcyBnZXRQcm94eUluZXRBZGRyZXNzKFN0cmluZyBwcm94eUFkZHJlc3MpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBJbmV0QWRkcmVzcy5nZXRCeU5hbWUocHJveHlBZGRyZXNzKTsKKyAgICAgICAgfSBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgICAgICBMaXN0IDxBcG5TZXR0aW5nPiBhcG5MaXN0ID0gbURldmljZVBvbGljeU1hbmFnZXIuZ2V0T3ZlcnJpZGVBcG5zKGdldFdobygpKTsKKyAgICAgICAgZm9yIChBcG5TZXR0aW5nIGFwbiA6IGFwbkxpc3QpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gZGVsZXRlZCA9IG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnJlbW92ZU92ZXJyaWRlQXBuKGdldFdobygpLCBhcG4uZ2V0SWQoKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJGYWlsZWQgdG8gY2xlYW4gdXAgb3ZlcnJpZGUgQVBOcy4iLCBkZWxldGVkKTsKKyAgICAgICAgfQorICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5zZXRPdmVycmlkZUFwbnNFbmFibGVkKGdldFdobygpLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFkZEdldFJlbW92ZU92ZXJyaWRlQXBuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGludCBpbnNlcnRlZElkID0gbURldmljZVBvbGljeU1hbmFnZXIuYWRkT3ZlcnJpZGVBcG4oZ2V0V2hvKCksIHRlc3RBcG5GdWxsKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShpbnNlcnRlZElkICE9IDApOworICAgICAgICBMaXN0IDxBcG5TZXR0aW5nPiBhcG5MaXN0ID0gbURldmljZVBvbGljeU1hbmFnZXIuZ2V0T3ZlcnJpZGVBcG5zKGdldFdobygpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYXBuTGlzdC5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoVEVTVF9PUEVSQVRPUl9OVU1FUklDLCBhcG5MaXN0LmdldCgwKS5nZXRPcGVyYXRvck51bWVyaWMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhURVNUX0VOVFJZX05BTUUsIGFwbkxpc3QuZ2V0KDApLmdldEVudHJ5TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFRFU1RfQVBOX05BTUUsIGFwbkxpc3QuZ2V0KDApLmdldEFwbk5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhnZXRQcm94eUluZXRBZGRyZXNzKFRFU1RfUFJPWFlfQUREUkVTUyksIGFwbkxpc3QuZ2V0KDApLmdldFByb3h5QWRkcmVzcygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFRFU1RfUFJPWFlfUE9SVCwgYXBuTGlzdC5nZXQoMCkuZ2V0UHJveHlQb3J0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoVEVTVF9NTVNDLCBhcG5MaXN0LmdldCgwKS5nZXRNbXNjKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0UHJveHlJbmV0QWRkcmVzcyhURVNUX1BST1hZX0FERFJFU1MpLCBhcG5MaXN0LmdldCgwKS5nZXRNbXNQcm94eUFkZHJlc3MoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhURVNUX1BST1hZX1BPUlQsIGFwbkxpc3QuZ2V0KDApLmdldE1tc1Byb3h5UG9ydCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFRFU1RfVVNFUl9OQU1FLCBhcG5MaXN0LmdldCgwKS5nZXRVc2VyKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoVEVTVF9QQVNTV09SRCwgYXBuTGlzdC5nZXQoMCkuZ2V0UGFzc3dvcmQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhURVNUX0FVVEhfVFlQRSwgYXBuTGlzdC5nZXQoMCkuZ2V0QXV0aFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhURVNUX0FQTl9UWVBFX0JJVE1BU0ssIGFwbkxpc3QuZ2V0KDApLmdldEFwblR5cGVCaXRtYXNrKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoVEVTVF9QUk9UT0NPTCwgYXBuTGlzdC5nZXQoMCkuZ2V0UHJvdG9jb2woKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhURVNUX1BST1RPQ09MLCBhcG5MaXN0LmdldCgwKS5nZXRSb2FtaW5nUHJvdG9jb2woKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhURVNUX0VOQUJMRUQsIGFwbkxpc3QuZ2V0KDApLmlzRW5hYmxlZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFRFU1RfTVZOT19UWVBFLCBhcG5MaXN0LmdldCgwKS5nZXRNdm5vVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFRFU1RfTkVUV09SS19UWVBFX0JJVE1BU0ssIGFwbkxpc3QuZ2V0KDApLmdldE5ldHdvcmtUeXBlQml0bWFzaygpKTsKKworICAgICAgICBhc3NlcnRUcnVlKG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnJlbW92ZU92ZXJyaWRlQXBuKGdldFdobygpLCBpbnNlcnRlZElkKSk7CisgICAgICAgIGFwbkxpc3QgPSBtRGV2aWNlUG9saWN5TWFuYWdlci5nZXRPdmVycmlkZUFwbnMoZ2V0V2hvKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgYXBuTGlzdC5zaXplKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVPdmVycmlkZUFwbkZhaWxzRm9ySW5jb3JyZWN0SWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RmFsc2UobURldmljZVBvbGljeU1hbmFnZXIucmVtb3ZlT3ZlcnJpZGVBcG4oZ2V0V2hvKCksIC0xKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEluc2VydENvbmZsaWN0aW5nQXBuKCkgeworICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5hZGRPdmVycmlkZUFwbihnZXRXaG8oKSwgdGVzdEFwbkZ1bGwpOworICAgICAgICBpbnQgaW5zZXJ0Q29uZmxpY3RpbmdJZCA9IG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmFkZE92ZXJyaWRlQXBuKGdldFdobygpLCB0ZXN0QXBuRnVsbCk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgaW5zZXJ0Q29uZmxpY3RpbmdJZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNvbmZsaWN0aW5nQXBuKCkgeworICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5hZGRPdmVycmlkZUFwbihnZXRXaG8oKSwgdGVzdEFwbkZ1bGwpOworCisgICAgICAgIGZpbmFsIEFwblNldHRpbmcgYXBuVG9CZVVwZGF0ZWQgPSAobmV3IEFwblNldHRpbmcuQnVpbGRlcigpKQorICAgICAgICAgICAgLnNldEVudHJ5TmFtZShVUERBVEVfRVROUllfTkFNRSkKKyAgICAgICAgICAgIC5zZXRBcG5OYW1lKFVQREFURV9BUE5fTkFNRSkKKyAgICAgICAgICAgIC5zZXRBcG5UeXBlQml0bWFzayhBcG5TZXR0aW5nLlRZUEVfREVGQVVMVCkKKyAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICBpbnQgYXBuSWRUb1VwZGF0ZSA9IG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmFkZE92ZXJyaWRlQXBuKGdldFdobygpLCBhcG5Ub0JlVXBkYXRlZCk7CisgICAgICAgIGFzc2VydE5vdFNhbWUoLTEsIGFwbklkVG9VcGRhdGUpOworICAgICAgICBhc3NlcnRGYWxzZShtRGV2aWNlUG9saWN5TWFuYWdlci51cGRhdGVPdmVycmlkZUFwbihnZXRXaG8oKSwgYXBuSWRUb1VwZGF0ZSwgdGVzdEFwbkZ1bGwpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtRGV2aWNlUG9saWN5TWFuYWdlci5yZW1vdmVPdmVycmlkZUFwbihnZXRXaG8oKSwgYXBuSWRUb1VwZGF0ZSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RVcGRhdGVPdmVycmlkZUFwbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbnQgaW5zZXJ0ZWRJZCA9IG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmFkZE92ZXJyaWRlQXBuKGdldFdobygpLCB0ZXN0QXBuRnVsbCk7CisgICAgICAgIGFzc2VydE5vdFNhbWUoLTEsIGluc2VydGVkSWQpOworCisgICAgICAgIGZpbmFsIEFwblNldHRpbmcgdXBkYXRlQXBuID0gbmV3IEFwblNldHRpbmcuQnVpbGRlcigpCisgICAgICAgICAgICAuc2V0QXBuTmFtZShVUERBVEVfQVBOX05BTUUpCisgICAgICAgICAgICAuc2V0RW50cnlOYW1lKFVQREFURV9FVE5SWV9OQU1FKQorICAgICAgICAgICAgLnNldE9wZXJhdG9yTnVtZXJpYyhURVNUX09QRVJBVE9SX05VTUVSSUMpCisgICAgICAgICAgICAuc2V0UHJveHlBZGRyZXNzKGdldFByb3h5SW5ldEFkZHJlc3MoVEVTVF9QUk9YWV9BRERSRVNTKSkKKyAgICAgICAgICAgIC5zZXRQcm94eVBvcnQoVEVTVF9QUk9YWV9QT1JUKQorICAgICAgICAgICAgLnNldE1tc2MoVEVTVF9NTVNDKQorICAgICAgICAgICAgLnNldE1tc1Byb3h5QWRkcmVzcyhnZXRQcm94eUluZXRBZGRyZXNzKFRFU1RfUFJPWFlfQUREUkVTUykpCisgICAgICAgICAgICAuc2V0TW1zUHJveHlQb3J0KFRFU1RfUFJPWFlfUE9SVCkKKyAgICAgICAgICAgIC5zZXRVc2VyKFRFU1RfVVNFUl9OQU1FKQorICAgICAgICAgICAgLnNldFBhc3N3b3JkKFRFU1RfUEFTU1dPUkQpCisgICAgICAgICAgICAuc2V0QXV0aFR5cGUoVEVTVF9BVVRIX1RZUEUpCisgICAgICAgICAgICAuc2V0QXBuVHlwZUJpdG1hc2soVEVTVF9BUE5fVFlQRV9CSVRNQVNLKQorICAgICAgICAgICAgLnNldFByb3RvY29sKFRFU1RfUFJPVE9DT0wpCisgICAgICAgICAgICAuc2V0Um9hbWluZ1Byb3RvY29sKFRFU1RfUFJPVE9DT0wpCisgICAgICAgICAgICAuc2V0TmV0d29ya1R5cGVCaXRtYXNrKFRFU1RfTkVUV09SS19UWVBFX0JJVE1BU0spCisgICAgICAgICAgICAuc2V0TXZub1R5cGUoVEVTVF9NVk5PX1RZUEUpCisgICAgICAgICAgICAuc2V0Q2FycmllckVuYWJsZWQoVEVTVF9FTkFCTEVEKQorICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIGFzc2VydFRydWUobURldmljZVBvbGljeU1hbmFnZXIudXBkYXRlT3ZlcnJpZGVBcG4oZ2V0V2hvKCksIGluc2VydGVkSWQsIHVwZGF0ZUFwbikpOworCisgICAgICAgIExpc3QgPEFwblNldHRpbmc+IGFwbkxpc3QgPSBtRGV2aWNlUG9saWN5TWFuYWdlci5nZXRPdmVycmlkZUFwbnMoZ2V0V2hvKCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygxLCBhcG5MaXN0LnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhURVNUX09QRVJBVE9SX05VTUVSSUMsIGFwbkxpc3QuZ2V0KDApLmdldE9wZXJhdG9yTnVtZXJpYygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFVQREFURV9FVE5SWV9OQU1FLCBhcG5MaXN0LmdldCgwKS5nZXRFbnRyeU5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhVUERBVEVfQVBOX05BTUUsIGFwbkxpc3QuZ2V0KDApLmdldEFwbk5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhnZXRQcm94eUluZXRBZGRyZXNzKFRFU1RfUFJPWFlfQUREUkVTUyksIGFwbkxpc3QuZ2V0KDApLmdldFByb3h5QWRkcmVzcygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFRFU1RfUFJPWFlfUE9SVCwgYXBuTGlzdC5nZXQoMCkuZ2V0UHJveHlQb3J0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoVEVTVF9NTVNDLCBhcG5MaXN0LmdldCgwKS5nZXRNbXNjKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0UHJveHlJbmV0QWRkcmVzcyhURVNUX1BST1hZX0FERFJFU1MpLCBhcG5MaXN0LmdldCgwKS5nZXRNbXNQcm94eUFkZHJlc3MoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhURVNUX1BST1hZX1BPUlQsIGFwbkxpc3QuZ2V0KDApLmdldE1tc1Byb3h5UG9ydCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFRFU1RfVVNFUl9OQU1FLCBhcG5MaXN0LmdldCgwKS5nZXRVc2VyKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoVEVTVF9QQVNTV09SRCwgYXBuTGlzdC5nZXQoMCkuZ2V0UGFzc3dvcmQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhURVNUX0FVVEhfVFlQRSwgYXBuTGlzdC5nZXQoMCkuZ2V0QXV0aFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhURVNUX0FQTl9UWVBFX0JJVE1BU0ssIGFwbkxpc3QuZ2V0KDApLmdldEFwblR5cGVCaXRtYXNrKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoVEVTVF9QUk9UT0NPTCwgYXBuTGlzdC5nZXQoMCkuZ2V0UHJvdG9jb2woKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhURVNUX1BST1RPQ09MLCBhcG5MaXN0LmdldCgwKS5nZXRSb2FtaW5nUHJvdG9jb2woKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhURVNUX0VOQUJMRUQsIGFwbkxpc3QuZ2V0KDApLmlzRW5hYmxlZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFRFU1RfTVZOT19UWVBFLCBhcG5MaXN0LmdldCgwKS5nZXRNdm5vVHlwZSgpKTsKKworICAgICAgICBhc3NlcnRUcnVlKG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnJlbW92ZU92ZXJyaWRlQXBuKGdldFdobygpLCBpbnNlcnRlZElkKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE92ZXJyaWRlQXBuRGVmYXVsdFZhbHVlcygpIHsKKyAgICAgICAgZmluYWwgQXBuU2V0dGluZyBlbXB0eUFwbiA9IG5ldyBBcG5TZXR0aW5nLkJ1aWxkZXIoKQorICAgICAgICAgICAgLnNldEFwbk5hbWUoVEVTVF9BUE5fTkFNRSkKKyAgICAgICAgICAgIC5zZXRFbnRyeU5hbWUoVEVTVF9FTlRSWV9OQU1FKQorICAgICAgICAgICAgLnNldEFwblR5cGVCaXRtYXNrKFRFU1RfQVBOX1RZUEVfQklUTUFTSykKKyAgICAgICAgICAgIC5idWlsZCgpOworCisgICAgICAgIGludCBpbnNlcnRlZElkID0gbURldmljZVBvbGljeU1hbmFnZXIuYWRkT3ZlcnJpZGVBcG4oZ2V0V2hvKCksIGVtcHR5QXBuKTsKKyAgICAgICAgYXNzZXJ0Tm90U2FtZSgtMSwgaW5zZXJ0ZWRJZCk7CisKKyAgICAgICAgTGlzdCA8QXBuU2V0dGluZz4gYXBuTGlzdCA9IG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmdldE92ZXJyaWRlQXBucyhnZXRXaG8oKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBhcG5MaXN0LnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiIiwgYXBuTGlzdC5nZXQoMCkuZ2V0T3BlcmF0b3JOdW1lcmljKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoVEVTVF9FTlRSWV9OQU1FLCBhcG5MaXN0LmdldCgwKS5nZXRFbnRyeU5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhURVNUX0FQTl9OQU1FLCBhcG5MaXN0LmdldCgwKS5nZXRBcG5OYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgYXBuTGlzdC5nZXQoMCkuZ2V0UHJveHlBZGRyZXNzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIGFwbkxpc3QuZ2V0KDApLmdldFByb3h5UG9ydCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIGFwbkxpc3QuZ2V0KDApLmdldE1tc2MoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhudWxsLCBhcG5MaXN0LmdldCgwKS5nZXRNbXNQcm94eUFkZHJlc3MoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgYXBuTGlzdC5nZXQoMCkuZ2V0TW1zUHJveHlQb3J0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIGFwbkxpc3QuZ2V0KDApLmdldFVzZXIoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiIiwgYXBuTGlzdC5nZXQoMCkuZ2V0UGFzc3dvcmQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBhcG5MaXN0LmdldCgwKS5nZXRBdXRoVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFRFU1RfQVBOX1RZUEVfQklUTUFTSywgYXBuTGlzdC5nZXQoMCkuZ2V0QXBuVHlwZUJpdG1hc2soKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgYXBuTGlzdC5nZXQoMCkuZ2V0UHJvdG9jb2woKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgYXBuTGlzdC5nZXQoMCkuZ2V0Um9hbWluZ1Byb3RvY29sKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGFwbkxpc3QuZ2V0KDApLmlzRW5hYmxlZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBhcG5MaXN0LmdldCgwKS5nZXRNdm5vVHlwZSgpKTsKKworICAgICAgICBhc3NlcnRUcnVlKG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnJlbW92ZU92ZXJyaWRlQXBuKGdldFdobygpLCBpbnNlcnRlZElkKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEJ1aWxkQXBuU2V0dGluZ0ZhaWxzV2l0aG91dFJlcXVpcmVkRmllbGQoKSB7CisgICAgICAgIGFzc2VydE51bGwobmV3IEFwblNldHRpbmcuQnVpbGRlcigpCisgICAgICAgICAgICAuc2V0RW50cnlOYW1lKFVQREFURV9FVE5SWV9OQU1FKQorICAgICAgICAgICAgLnNldEFwbk5hbWUoVVBEQVRFX0FQTl9OQU1FKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFzc2VydE51bGwobmV3IEFwblNldHRpbmcuQnVpbGRlcigpCisgICAgICAgICAgICAuc2V0RW50cnlOYW1lKFVQREFURV9FVE5SWV9OQU1FKQorICAgICAgICAgICAgLnNldEFwbk5hbWUoVVBEQVRFX0FQTl9OQU1FKQorICAgICAgICAgICAgLnNldEFwblR5cGVCaXRtYXNrKDEgPDwgMjApCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYXNzZXJ0TnVsbChuZXcgQXBuU2V0dGluZy5CdWlsZGVyKCkKKyAgICAgICAgICAgIC5zZXRBcG5OYW1lKFVQREFURV9BUE5fTkFNRSkKKyAgICAgICAgICAgIC5zZXRBcG5UeXBlQml0bWFzayhURVNUX0FQTl9UWVBFX0JJVE1BU0spCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYXNzZXJ0TnVsbChuZXcgQXBuU2V0dGluZy5CdWlsZGVyKCkKKyAgICAgICAgICAgIC5zZXRFbnRyeU5hbWUoVVBEQVRFX0VUTlJZX05BTUUpCisgICAgICAgICAgICAuc2V0QXBuVHlwZUJpdG1hc2soVEVTVF9BUE5fVFlQRV9CSVRNQVNLKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRBbmRHZXRPdmVycmlkZUFwbkVuYWJsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuc2V0T3ZlcnJpZGVBcG5zRW5hYmxlZChnZXRXaG8oKSwgdHJ1ZSk7CisgICAgICAgIGFzc2VydFRydWUobURldmljZVBvbGljeU1hbmFnZXIuaXNPdmVycmlkZUFwbkVuYWJsZWQoZ2V0V2hvKCkpKTsKKyAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuc2V0T3ZlcnJpZGVBcG5zRW5hYmxlZChnZXRXaG8oKSwgZmFsc2UpOworICAgICAgICBhc3NlcnRGYWxzZShtRGV2aWNlUG9saWN5TWFuYWdlci5pc092ZXJyaWRlQXBuRW5hYmxlZChnZXRXaG8oKSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZW93bmVyL1BhY2thZ2VJbnN0YWxsVGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlb3duZXIvUGFja2FnZUluc3RhbGxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI4MGUwNgotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZW93bmVyL1BhY2thZ2VJbnN0YWxsVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTQwIEBACitwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5kZXZpY2Vvd25lcjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50U2VuZGVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlSW5zdGFsbGVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQmxvY2tpbmdCcm9hZGNhc3RSZWNlaXZlcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKKworLyoqCisgKiBUZXN0IGNhc2UgZm9yIHBhY2thZ2UgaW5zdGFsbCBhbmQgdW5pbnN0YWxsLgorICovCitwdWJsaWMgY2xhc3MgUGFja2FnZUluc3RhbGxUZXN0IGV4dGVuZHMgQmFzZUFmZmlsaWF0ZWRQcm9maWxlT3duZXJUZXN0IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9BUFBfTE9DQVRJT04gPQorICAgICAgICAgICAgIi9kYXRhL2xvY2FsL3RtcC9jdHMvcGFja2FnZWluc3RhbGxlci9DdHNFbXB0eVRlc3RBcHAuYXBrIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9BUFBfUEtHID0gImFuZHJvaWQucGFja2FnZWluc3RhbGxlci5lbXB0eXRlc3RhcHAuY3RzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVRVUVTVF9DT0RFID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0lOU1RBTExfQ09NTUlUID0KKyAgICAgICAgICAgICJjb20uYW5kcm9pZC5jdHMuZGV2aWNlb3duZXIuSU5URU5UX1BBQ0tBR0VfSU5TVEFMTF9DT01NSVQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQQUNLQUdFX0lOU1RBTExFUl9TVEFUVVNfVU5ERUZJTkVEID0gLTEwMDA7CisKKyAgICBwcml2YXRlIFBhY2thZ2VNYW5hZ2VyIG1QYWNrYWdlTWFuYWdlcjsKKyAgICBwcml2YXRlIFBhY2thZ2VJbnN0YWxsZXIgbVBhY2thZ2VJbnN0YWxsZXI7CisgICAgcHJpdmF0ZSBQYWNrYWdlSW5zdGFsbGVyLlNlc3Npb24gbVNlc3Npb247CisgICAgcHJpdmF0ZSBCbG9ja2luZ0Jyb2FkY2FzdFJlY2VpdmVyIG1Ccm9hZGNhc3RSZWNlaXZlcjsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgIG1QYWNrYWdlTWFuYWdlciA9IG1Db250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgIG1QYWNrYWdlSW5zdGFsbGVyID0gbVBhY2thZ2VNYW5hZ2VyLmdldFBhY2thZ2VJbnN0YWxsZXIoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtUGFja2FnZUluc3RhbGxlcik7CisKKyAgICAgICAgbUJyb2FkY2FzdFJlY2VpdmVyID0gbmV3IEJsb2NraW5nQnJvYWRjYXN0UmVjZWl2ZXIobUNvbnRleHQsIEFDVElPTl9JTlNUQUxMX0NPTU1JVCk7CisgICAgICAgIG1Ccm9hZGNhc3RSZWNlaXZlci5yZWdpc3RlcigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1Ccm9hZGNhc3RSZWNlaXZlci51bnJlZ2lzdGVyUXVpZXRseSgpOworICAgICAgICBpZiAobVNlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgbVNlc3Npb24uYWJhbmRvbigpOworICAgICAgICB9CisKKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFja2FnZUluc3RhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RmFsc2UoaXNQYWNrYWdlSW5zdGFsbGVkKFRFU1RfQVBQX1BLRykpOworCisgICAgICAgIC8vIEluc3RhbGwgdGhlIHBhY2thZ2UuCisgICAgICAgIGluc3RhbGxQYWNrYWdlKFRFU1RfQVBQX0xPQ0FUSU9OKTsKKworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbUJyb2FkY2FzdFJlY2VpdmVyLmF3YWl0Rm9yQnJvYWRjYXN0KCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoaW50ZW50KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFBhY2thZ2VJbnN0YWxsZXIuU1RBVFVTX1NVQ0NFU1MsCisgICAgICAgICAgICAgICAgaW50ZW50LmdldEludEV4dHJhKFBhY2thZ2VJbnN0YWxsZXIuRVhUUkFfU1RBVFVTLAorICAgICAgICAgICAgICAgICAgICAgICAgUEFDS0FHRV9JTlNUQUxMRVJfU1RBVFVTX1VOREVGSU5FRCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoVEVTVF9BUFBfUEtHLCBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoCisgICAgICAgICAgICAgICAgUGFja2FnZUluc3RhbGxlci5FWFRSQV9QQUNLQUdFX05BTUUpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShpc1BhY2thZ2VJbnN0YWxsZWQoVEVTVF9BUFBfUEtHKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFBhY2thZ2VVbmluc3RhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShpc1BhY2thZ2VJbnN0YWxsZWQoVEVTVF9BUFBfUEtHKSk7CisKKyAgICAgICAgLy8gVW5pbnN0YWxsIHRoZSBwYWNrYWdlLgorICAgICAgICBtUGFja2FnZUluc3RhbGxlci51bmluc3RhbGwoVEVTVF9BUFBfUEtHLCBnZXRDb21taXRDYWxsYmFjaygpKTsKKworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbUJyb2FkY2FzdFJlY2VpdmVyLmF3YWl0Rm9yQnJvYWRjYXN0KCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoaW50ZW50KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFBhY2thZ2VJbnN0YWxsZXIuU1RBVFVTX1NVQ0NFU1MsCisgICAgICAgICAgICAgICAgaW50ZW50LmdldEludEV4dHJhKFBhY2thZ2VJbnN0YWxsZXIuRVhUUkFfU1RBVFVTLAorICAgICAgICAgICAgICAgICAgICAgICAgUEFDS0FHRV9JTlNUQUxMRVJfU1RBVFVTX1VOREVGSU5FRCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoVEVTVF9BUFBfUEtHLCBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoCisgICAgICAgICAgICAgICAgUGFja2FnZUluc3RhbGxlci5FWFRSQV9QQUNLQUdFX05BTUUpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoaXNQYWNrYWdlSW5zdGFsbGVkKFRFU1RfQVBQX1BLRykpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RLZWVwUGFja2FnZUNhY2hlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFNldCBrZWVwIHBhY2thZ2UgY2FjaGUuCisgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnNldEtlZXBVbmluc3RhbGxlZFBhY2thZ2VzKGdldFdobygpLAorICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoVEVTVF9BUFBfUEtHKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEluc3RhbGxFeGlzdGluZ1BhY2thZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RmFsc2UoaXNQYWNrYWdlSW5zdGFsbGVkKFRFU1RfQVBQX1BLRykpOworCisgICAgICAgIC8vIEluc3RhbGwgdGhlIGV4aXN0aW5nIHBhY2thZ2UuCisgICAgICAgIGFzc2VydFRydWUobURldmljZVBvbGljeU1hbmFnZXIuaW5zdGFsbEV4aXN0aW5nUGFja2FnZShnZXRXaG8oKSwgVEVTVF9BUFBfUEtHKSk7CisgICAgICAgIGFzc2VydFRydWUoaXNQYWNrYWdlSW5zdGFsbGVkKFRFU1RfQVBQX1BLRykpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbnN0YWxsUGFja2FnZShTdHJpbmcgcGFja2FnZUxvY2F0aW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUGFja2FnZUluc3RhbGxlci5TZXNzaW9uUGFyYW1zIHBhcmFtcyA9IG5ldyBQYWNrYWdlSW5zdGFsbGVyLlNlc3Npb25QYXJhbXMoCisgICAgICAgICAgICAgICAgUGFja2FnZUluc3RhbGxlci5TZXNzaW9uUGFyYW1zLk1PREVfRlVMTF9JTlNUQUxMKTsKKyAgICAgICAgcGFyYW1zLnNldEFwcFBhY2thZ2VOYW1lKFRFU1RfQVBQX1BLRyk7CisgICAgICAgIGludCBzZXNzaW9uSWQgPSBtUGFja2FnZUluc3RhbGxlci5jcmVhdGVTZXNzaW9uKHBhcmFtcyk7CisgICAgICAgIG1TZXNzaW9uID0gbVBhY2thZ2VJbnN0YWxsZXIub3BlblNlc3Npb24oc2Vzc2lvbklkKTsKKworICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShwYWNrYWdlTG9jYXRpb24pOworICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7CisgICAgICAgIE91dHB1dFN0cmVhbSBvdXQgPSBtU2Vzc2lvbi5vcGVuV3JpdGUoIlBhY2thZ2VJbnN0YWxsVGVzdCIsIDAsIGZpbGUubGVuZ3RoKCkpOworICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbNjU1MzZdOworICAgICAgICBpbnQgYzsKKyAgICAgICAgd2hpbGUgKChjID0gaW4ucmVhZChidWZmZXIpKSAhPSAtMSkgeworICAgICAgICAgICAgb3V0LndyaXRlKGJ1ZmZlciwgMCwgYyk7CisgICAgICAgIH0KKyAgICAgICAgbVNlc3Npb24uZnN5bmMob3V0KTsKKyAgICAgICAgb3V0LmNsb3NlKCk7CisgICAgICAgIG1TZXNzaW9uLmNvbW1pdChnZXRDb21taXRDYWxsYmFjaygpKTsKKyAgICAgICAgbVNlc3Npb24uY2xvc2UoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEludGVudFNlbmRlciBnZXRDb21taXRDYWxsYmFjaygpIHsKKyAgICAgICAgLy8gQ3JlYXRlIGEgUGVuZGluZ0ludGVudCBhbmQgdXNlIGl0IHRvIGdlbmVyYXRlIHRoZSBJbnRlbnRTZW5kZXIKKyAgICAgICAgSW50ZW50IGJyb2FkY2FzdEludGVudCA9IG5ldyBJbnRlbnQoQUNUSU9OX0lOU1RBTExfQ09NTUlUKTsKKyAgICAgICAgUGVuZGluZ0ludGVudCBwZW5kaW5nSW50ZW50ID0gUGVuZGluZ0ludGVudC5nZXRCcm9hZGNhc3QoCisgICAgICAgICAgICAgICAgbUNvbnRleHQsCisgICAgICAgICAgICAgICAgUkVRVUVTVF9DT0RFLAorICAgICAgICAgICAgICAgIGJyb2FkY2FzdEludGVudCwKKyAgICAgICAgICAgICAgICBQZW5kaW5nSW50ZW50LkZMQUdfVVBEQVRFX0NVUlJFTlQpOworICAgICAgICByZXR1cm4gcGVuZGluZ0ludGVudC5nZXRJbnRlbnRTZW5kZXIoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNQYWNrYWdlSW5zdGFsbGVkKFN0cmluZyBwYWNrYWdlTmFtZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1QYWNrYWdlTWFuYWdlci5nZXRQYWNrYWdlSW5mbyhwYWNrYWdlTmFtZSwgMCkgIT0gbnVsbDsKKyAgICAgICAgfSBjYXRjaCAoUGFja2FnZU1hbmFnZXIuTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZW93bmVyL1ByZURldmljZU93bmVyVGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlb3duZXIvUHJlRGV2aWNlT3duZXJUZXN0LmphdmEKaW5kZXggOTcxZDVkYS4uMTc1MTI0NCAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlb3duZXIvUHJlRGV2aWNlT3duZXJUZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlb3duZXIvUHJlRGV2aWNlT3duZXJUZXN0LmphdmEKQEAgLTE5LDggKzE5LDYgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DZGRUZXN0OwotCiAvKioKICAqIFRoZSBmb2xsb3dpbmcgdGVzdCBjYW4gcnVuIGluIERldmljZU93bmVyIG1vZGUgb3Igbm9uLURldmljZU93bmVyIG1vZGUuCiAgKiBEb24ndCBpbmhlcml0IHtAbGluayBCYXNlRGV2aWNlT3duZXJUZXN0fQpAQCAtMzcsNyArMzUsNiBAQAogICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5ERVZJQ0VfUE9MSUNZX1NFUlZJQ0UpOwogICAgIH0KIAotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSIzLjkuMS4xL0MtMS02IikKICAgICBwdWJsaWMgdm9pZCB0ZXN0SXNQcm92aXNpb25pbmdBbGxvd2VkRmFsc2UoKSB7CiAgICAgICAgIGFzc2VydEZhbHNlKG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmlzUHJvdmlzaW9uaW5nQWxsb3dlZChEZXZpY2VQb2xpY3lNYW5hZ2VyLkFDVElPTl9QUk9WSVNJT05fTUFOQUdFRF9ERVZJQ0UpKTsKICAgICB9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vvd25lci9TZWN1cml0eUxvZ2dpbmdUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vvd25lci9TZWN1cml0eUxvZ2dpbmdUZXN0LmphdmEKaW5kZXggMjAxZjM4Mi4uMTkxYzFiZCAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlb3duZXIvU2VjdXJpdHlMb2dnaW5nVGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZW93bmVyL1NlY3VyaXR5TG9nZ2luZ1Rlc3QuamF2YQpAQCAtMTUsMTUgKzE1LDE4OCBAQAogICovCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5kZXZpY2Vvd25lcjsKIAotaW1wb3J0IGFuZHJvaWQuYXBwLmFkbWluLlNlY3VyaXR5TG9nLlNlY3VyaXR5RXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuYWRtaW4uRGV2aWNlUG9saWN5TWFuYWdlci5LRVlHVUFSRF9ESVNBQkxFX0ZJTkdFUlBSSU5UOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5hZG1pbi5EZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQ09NUExFWDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuYWRtaW4uU2VjdXJpdHlMb2cuTEVWRUxfRVJST1I7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLmFkbWluLlNlY3VyaXR5TG9nLkxFVkVMX0lORk87CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLmFkbWluLlNlY3VyaXR5TG9nLkxFVkVMX1dBUk5JTkc7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLmFkbWluLlNlY3VyaXR5TG9nLlRBR19BREJfU0hFTExfQ01EOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5hZG1pbi5TZWN1cml0eUxvZy5UQUdfQURCX1NIRUxMX0lOVEVSQUNUSVZFOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5hZG1pbi5TZWN1cml0eUxvZy5UQUdfQVBQX1BST0NFU1NfU1RBUlQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLmFkbWluLlNlY3VyaXR5TG9nLlRBR19DRVJUX0FVVEhPUklUWV9JTlNUQUxMRUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLmFkbWluLlNlY3VyaXR5TG9nLlRBR19DRVJUX0FVVEhPUklUWV9SRU1PVkVEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5hZG1pbi5TZWN1cml0eUxvZy5UQUdfQ0VSVF9WQUxJREFUSU9OX0ZBSUxVUkU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLmFkbWluLlNlY3VyaXR5TG9nLlRBR19DUllQVE9fU0VMRl9URVNUX0NPTVBMRVRFRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuYWRtaW4uU2VjdXJpdHlMb2cuVEFHX0tFWUdVQVJEX0RJU0FCTEVEX0ZFQVRVUkVTX1NFVDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuYWRtaW4uU2VjdXJpdHlMb2cuVEFHX0tFWUdVQVJEX0RJU01JU1NFRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuYWRtaW4uU2VjdXJpdHlMb2cuVEFHX0tFWUdVQVJEX0RJU01JU1NfQVVUSF9BVFRFTVBUOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5hZG1pbi5TZWN1cml0eUxvZy5UQUdfS0VZR1VBUkRfU0VDVVJFRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuYWRtaW4uU2VjdXJpdHlMb2cuVEFHX0tFWV9ERVNUUlVDVElPTjsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuYWRtaW4uU2VjdXJpdHlMb2cuVEFHX0tFWV9HRU5FUkFURUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLmFkbWluLlNlY3VyaXR5TG9nLlRBR19LRVlfSU1QT1JUOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5hZG1pbi5TZWN1cml0eUxvZy5UQUdfS0VZX0lOVEVHUklUWV9WSU9MQVRJT047CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLmFkbWluLlNlY3VyaXR5TG9nLlRBR19MT0dHSU5HX1NUQVJURUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLmFkbWluLlNlY3VyaXR5TG9nLlRBR19MT0dHSU5HX1NUT1BQRUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLmFkbWluLlNlY3VyaXR5TG9nLlRBR19MT0dfQlVGRkVSX1NJWkVfQ1JJVElDQUw7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLmFkbWluLlNlY3VyaXR5TG9nLlRBR19NQVhfUEFTU1dPUkRfQVRURU1QVFNfU0VUOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5hZG1pbi5TZWN1cml0eUxvZy5UQUdfTUFYX1NDUkVFTl9MT0NLX1RJTUVPVVRfU0VUOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5hZG1pbi5TZWN1cml0eUxvZy5UQUdfTUVESUFfTU9VTlQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLmFkbWluLlNlY3VyaXR5TG9nLlRBR19NRURJQV9VTk1PVU5UOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5hZG1pbi5TZWN1cml0eUxvZy5UQUdfT1NfU0hVVERPV047CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLmFkbWluLlNlY3VyaXR5TG9nLlRBR19PU19TVEFSVFVQOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5hZG1pbi5TZWN1cml0eUxvZy5UQUdfUEFTU1dPUkRfQ09NUExFWElUWV9TRVQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLmFkbWluLlNlY3VyaXR5TG9nLlRBR19QQVNTV09SRF9FWFBJUkFUSU9OX1NFVDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuYWRtaW4uU2VjdXJpdHlMb2cuVEFHX1BBU1NXT1JEX0hJU1RPUllfTEVOR1RIX1NFVDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuYWRtaW4uU2VjdXJpdHlMb2cuVEFHX1JFTU9URV9MT0NLOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5hZG1pbi5TZWN1cml0eUxvZy5UQUdfU1lOQ19SRUNWX0ZJTEU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLmFkbWluLlNlY3VyaXR5TG9nLlRBR19TWU5DX1NFTkRfRklMRTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuYWRtaW4uU2VjdXJpdHlMb2cuVEFHX1VTRVJfUkVTVFJJQ1RJT05fQURERUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLmFkbWluLlNlY3VyaXR5TG9nLlRBR19VU0VSX1JFU1RSSUNUSU9OX1JFTU9WRUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLmFkbWluLlNlY3VyaXR5TG9nLlRBR19XSVBFX0ZBSUxVUkU7CiAKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0Lm9mOworCitpbXBvcnQgYW5kcm9pZC5hcHAuYWRtaW4uU2VjdXJpdHlMb2cuU2VjdXJpdHlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXM7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOworaW1wb3J0IGFuZHJvaWQub3MuVXNlck1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5zZWN1cml0eS5rZXlzdG9yZS5LZXlHZW5QYXJhbWV0ZXJTcGVjOworaW1wb3J0IGFuZHJvaWQuc2VjdXJpdHkua2V5c3RvcmUuS2V5UHJvcGVydGllczsKK2ltcG9ydCBhbmRyb2lkLnNlY3VyaXR5LmtleXN0b3JlLktleVByb3RlY3Rpb247CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTZXQ7CisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LktleVBhaXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlQYWlyR2VuZXJhdG9yOworaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5U3RvcmU7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgamF2YXguY3J5cHRvLnNwZWMuU2VjcmV0S2V5U3BlYzsKIAogcHVibGljIGNsYXNzIFNlY3VyaXR5TG9nZ2luZ1Rlc3QgZXh0ZW5kcyBCYXNlRGV2aWNlT3duZXJUZXN0IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJHX0JBVENIX05VTUJFUiA9ICJiYXRjaE51bWJlciI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfS0VZX1BSRUZJWCA9ICJiYXRjaC1sYXN0LWlkLSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfTkFNRSA9ICJiYXRjaElkcyI7CisKKyAgICAvLyBGb3IgYnJldml0eS4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzczxTdHJpbmc+IFMgPSBTdHJpbmcuY2xhc3M7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3M8TG9uZz4gTCA9IExvbmcuY2xhc3M7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3M8SW50ZWdlcj4gSSA9IEludGVnZXIuY2xhc3M7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8SW50ZWdlciwgTGlzdDxDbGFzcz4+IFBBWUxPQURfVFlQRVNfTUFQID0KKyAgICAgICAgICAgIG5ldyBJbW11dGFibGVNYXAuQnVpbGRlcjxJbnRlZ2VyLCBMaXN0PENsYXNzPj4oKQorICAgICAgICAgICAgICAgICAgICAucHV0KFRBR19BREJfU0hFTExfSU5URVJBQ1RJVkUsIG9mKCkpCisgICAgICAgICAgICAgICAgICAgIC5wdXQoVEFHX0FEQl9TSEVMTF9DTUQsIG9mKFMpKQorICAgICAgICAgICAgICAgICAgICAucHV0KFRBR19TWU5DX1JFQ1ZfRklMRSwgb2YoUykpCisgICAgICAgICAgICAgICAgICAgIC5wdXQoVEFHX1NZTkNfU0VORF9GSUxFLCBvZihTKSkKKyAgICAgICAgICAgICAgICAgICAgLnB1dChUQUdfQVBQX1BST0NFU1NfU1RBUlQsIG9mKFMsIEwsIEksIEksIFMsIFMpKQorICAgICAgICAgICAgICAgICAgICAucHV0KFRBR19LRVlHVUFSRF9ESVNNSVNTRUQsIG9mKCkpCisgICAgICAgICAgICAgICAgICAgIC5wdXQoVEFHX0tFWUdVQVJEX0RJU01JU1NfQVVUSF9BVFRFTVBULCBvZihJLCBJKSkKKyAgICAgICAgICAgICAgICAgICAgLnB1dChUQUdfS0VZR1VBUkRfU0VDVVJFRCwgb2YoKSkKKyAgICAgICAgICAgICAgICAgICAgLnB1dChUQUdfT1NfU1RBUlRVUCwgb2YoUywgUykpCisgICAgICAgICAgICAgICAgICAgIC5wdXQoVEFHX09TX1NIVVRET1dOLCBvZigpKQorICAgICAgICAgICAgICAgICAgICAucHV0KFRBR19MT0dHSU5HX1NUQVJURUQsIG9mKCkpCisgICAgICAgICAgICAgICAgICAgIC5wdXQoVEFHX0xPR0dJTkdfU1RPUFBFRCwgb2YoKSkKKyAgICAgICAgICAgICAgICAgICAgLnB1dChUQUdfTUVESUFfTU9VTlQsIG9mKFMsIFMpKQorICAgICAgICAgICAgICAgICAgICAucHV0KFRBR19NRURJQV9VTk1PVU5ULCBvZihTLCBTKSkKKyAgICAgICAgICAgICAgICAgICAgLnB1dChUQUdfTE9HX0JVRkZFUl9TSVpFX0NSSVRJQ0FMLCBvZigpKQorICAgICAgICAgICAgICAgICAgICAucHV0KFRBR19QQVNTV09SRF9FWFBJUkFUSU9OX1NFVCwgb2YoUywgSSwgSSwgTCkpCisgICAgICAgICAgICAgICAgICAgIC5wdXQoVEFHX1BBU1NXT1JEX0NPTVBMRVhJVFlfU0VULCBvZihTLCBJLCBJLCBJLCBJLCBJLCBJLCBJLCBJLCBJLCBJKSkKKyAgICAgICAgICAgICAgICAgICAgLnB1dChUQUdfUEFTU1dPUkRfSElTVE9SWV9MRU5HVEhfU0VULCBvZihTLCBJLCBJLCBJKSkKKyAgICAgICAgICAgICAgICAgICAgLnB1dChUQUdfTUFYX1NDUkVFTl9MT0NLX1RJTUVPVVRfU0VULCBvZihTLCBJLCBJLCBMKSkKKyAgICAgICAgICAgICAgICAgICAgLnB1dChUQUdfTUFYX1BBU1NXT1JEX0FUVEVNUFRTX1NFVCwgb2YoUywgSSwgSSwgSSkpCisgICAgICAgICAgICAgICAgICAgIC5wdXQoVEFHX0tFWUdVQVJEX0RJU0FCTEVEX0ZFQVRVUkVTX1NFVCwgb2YoUywgSSwgSSwgSSkpCisgICAgICAgICAgICAgICAgICAgIC5wdXQoVEFHX1JFTU9URV9MT0NLLCBvZihTLCBJLCBJKSkKKyAgICAgICAgICAgICAgICAgICAgLnB1dChUQUdfV0lQRV9GQUlMVVJFLCBvZigpKQorICAgICAgICAgICAgICAgICAgICAucHV0KFRBR19LRVlfR0VORVJBVEVELCBvZihJLCBTLCBJKSkKKyAgICAgICAgICAgICAgICAgICAgLnB1dChUQUdfS0VZX0lNUE9SVCwgb2YoSSwgUywgSSkpCisgICAgICAgICAgICAgICAgICAgIC5wdXQoVEFHX0tFWV9ERVNUUlVDVElPTiwgb2YoSSwgUywgSSkpCisgICAgICAgICAgICAgICAgICAgIC5wdXQoVEFHX0NFUlRfQVVUSE9SSVRZX0lOU1RBTExFRCwgb2YoSSwgUykpCisgICAgICAgICAgICAgICAgICAgIC5wdXQoVEFHX0NFUlRfQVVUSE9SSVRZX1JFTU9WRUQsIG9mKEksIFMpKQorICAgICAgICAgICAgICAgICAgICAucHV0KFRBR19VU0VSX1JFU1RSSUNUSU9OX0FEREVELCBvZihTLCBJLCBTKSkKKyAgICAgICAgICAgICAgICAgICAgLnB1dChUQUdfVVNFUl9SRVNUUklDVElPTl9SRU1PVkVELCBvZihTLCBJLCBTKSkKKyAgICAgICAgICAgICAgICAgICAgLnB1dChUQUdfQ1JZUFRPX1NFTEZfVEVTVF9DT01QTEVURUQsIG9mKEkpKQorICAgICAgICAgICAgICAgICAgICAucHV0KFRBR19LRVlfSU5URUdSSVRZX1ZJT0xBVElPTiwgb2YoUywgSSkpCisgICAgICAgICAgICAgICAgICAgIC5wdXQoVEFHX0NFUlRfVkFMSURBVElPTl9GQUlMVVJFLCBvZihTKSkKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVEVEX0tFWV9BTElBUyA9ICJnZW5lcmF0ZWRfa2V5X2FsaWFzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QT1JURURfS0VZX0FMSUFTID0gImltcG9ydGVkX2tleV9hbGlhcyI7CisKKyAgICAvKgorICAgICAqIFRoZSBDQSBjZXJ0IGJlbG93IGlzIHRoZSBjb250ZW50IG9mIGNhY2VydC5wZW0gYXMgZ2VuZXJhdGVkIGJ5OgorICAgICAqCisgICAgICogb3BlbnNzbCByZXEgLW5ldyAteDUwOSAtZGF5cyAzNjUwIC1leHRlbnNpb25zIHYzX2NhIC1rZXlvdXQgY2FrZXkucGVtIC1vdXQgY2FjZXJ0LnBlbQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0NBID0KKyAgICAgICAgICAgICItLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS1cbiIgKworICAgICAgICAgICAgIk1JSURYVENDQWtXZ0F3SUJBZ0lKQUs5VGwvRjlWOGtTTUEwR0NTcUdTSWIzRFFFQkN3VUFNRVV4Q3pBSkJnTlZcbiIgKworICAgICAgICAgICAgIkJBWVRBa0ZWTVJNd0VRWURWUVFJREFwVGIyMWxMVk4wWVhSbE1TRXdId1lEVlFRS0RCaEpiblJsY201bGRDQlhcbiIgKworICAgICAgICAgICAgImFXUm5hWFJ6SUZCMGVTQk1kR1F3SGhjTk1UVXdNekEyTVRjek1qRXhXaGNOTWpVd016QXpNVGN6TWpFeFdqQkZcbiIgKworICAgICAgICAgICAgIk1Rc3dDUVlEVlFRR0V3SkJWVEVUTUJFR0ExVUVDQXdLVTI5dFpTMVRkR0YwWlRFaE1COEdBMVVFQ2d3WVNXNTBcbiIgKworICAgICAgICAgICAgIlpYSnVaWFFnVjJsa1oybDBjeUJRZEhrZ1RIUmtNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJcbiIgKworICAgICAgICAgICAgIkNnS0NBUUVBdkl0T3V0c0U3NVdCVGdUeU5BSHQ0SlhRM0pvc2VhR3FjQzNXUWlqNnZocmxlV2k1S0owamgxL01cbiIgKworICAgICAgICAgICAgIlJwcnk3RmFqdHd3YjR0OFZaYTBOdU0yaDJZQUx2NTJ3MXhpdnFsODh6Y2UvSFUxeTdYemJYaHhpczlvNlNDSStcbiIgKworICAgICAgICAgICAgIm9WUVNiUGVYUmdCUHBwRnpCRWgzWnFZVFZoQXF3NDUxWGh3ZEE0QXFzM3d0czdkZGp3bFV6eU1kVTQ0b3NDVWdcbiIgKworICAgICAgICAgICAgImtWZzdsZlBmOXNUbTVJb0hWY2ZMU0NXSDVuNk5yOXNIM28ya3N5VHd4dU9BdnNOMTFGL2EwbW1Vb1BjaVlQcCtcbiIgKworICAgICAgICAgICAgInE3RHpRemRpN2FrUkc2MDFEWjRZVk93bzZVSVRHdkR5dUFBZHhsNWlzb3ZVWHFlNkptejIvbXlUU3BBS3hHRnNcbiIgKworICAgICAgICAgICAgImprOW9Sb0c2V1hXQjFrbmk0OTBHSVBqSjFPY2V5UUlEQVFBQm8xQXdUakFkQmdOVkhRNEVGZ1FVSDFRSWxQS0xcbiIgKworICAgICAgICAgICAgInAyT1EvQW9MT2pLdkJXNHpLM0F3SHdZRFZSMGpCQmd3Rm9BVUgxUUlsUEtMcDJPUS9Bb0xPakt2Qlc0ekszQXdcbiIgKworICAgICAgICAgICAgIkRBWURWUjBUQkFVd0F3RUIvekFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBY01pNHZvTU1KSGVRTGp0cThPa3lcbiIgKworICAgICAgICAgICAgIkF6cHlrOG1vRHdnQ2Q0bGxjR2o3aXpPa0lJRnFxL2x5cUtkdHlrVktVV3oyYlNITzVjTHJ0YU9DaUJXVmxhQ1ZcbiIgKworICAgICAgICAgICAgIkRZQW5uVkxNOGFxYUE2aEpESWZhR3M0em13ejBkWThoVk1GQ3VDQmlMV3VQZmlZdGJFbWpIR1NtcFFURzZReG5cbiIgKworICAgICAgICAgICAgIlpKbGFLNUNaeXQ1cGdoNUVkTmR2UW1ERWJLR211MHdwQ3E5cWpaSW13ZHlBdWwxdC9CMERyc1dBcFpNZ1pwZUlcbiIgKworICAgICAgICAgICAgImQyb2QwVkJyQ0lDQjFLNHArQzUxRDkzeHlRaXZhN3hRY0NuZStUQW5HTnk5K2dqUS9NeVI4TVJwd1JMdjVpa0RcbiIgKworICAgICAgICAgICAgInUwYW5KQ044cFhvNklNZ2xmTUFzb3RvbjFKNm81L2FlNXVoQzZjYVFVOGJOVXNDSzU3MGdwTmZqa3pvNnJiUDBcbiIgKworICAgICAgICAgICAgIndRPT1cbiIgKworICAgICAgICAgICAgIi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0iOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQ0FfU1VCSkVDVCA9ICJvPWludGVybmV0IHdpZGdpdHMgcHR5IGx0ZCxzdD1zb21lLXN0YXRlLGM9YXUiOworCisgICAgLy8gSW5kaWNlcyBvZiB2YXJpb3VzIGZpZWxkcyBpbiBldmVudCBwYXlsb2FkLgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVUNDRVNTX0lOREVYID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUxJQVNfSU5ERVggPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVSURfSU5ERVggPSAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVUJKRUNUX0lOREVYID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQURNSU5fUEtHX0lOREVYID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQURNSU5fVVNFUl9JTkRFWCA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRBUkdFVF9VU0VSX0lOREVYID0gMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFdEX0xFTl9JTkRFWCA9IDM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBXRF9RVUFMSVRZX0lOREVYID0gNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTEVUVEVSU19JTkRFWCA9IDU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PTl9MRVRURVJTX0lOREVYID0gNjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTlVNRVJJQ19JTkRFWCA9IDc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVQUEVSQ0FTRV9JTkRFWCA9IDg7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExPV0VSQ0FTRV9JTkRFWCA9IDk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNZTUJPTFNfSU5ERVggPSAxMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFdEX0VYUElSQVRJT05fSU5ERVggPSAzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQV0RfSElTVF9MRU5fSU5ERVggPSAzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVU0VSX1JFU1RSSUNUSU9OX0lOREVYID0gMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1BXRF9BVFRFTVBUU19JTkRFWCA9IDM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEtFWUdVQVJEX0ZFQVRVUkVTX0lOREVYID0gMzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1NDUkVFTl9USU1FT1VUX0lOREVYID0gMzsKKworICAgIC8vIFZhbHVlIHRoYXQgaW5kaWNhdGVzIHN1Y2Nlc3MgaW4gZXZlbnRzIHRoYXQgaGF2ZSBjb3JyZXNwb25kaW5nIGZpZWxkIGluIHRoZWlyIHBheWxvYWQuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNVQ0NFU1NfVkFMVUUgPSAxOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRFU1RfUFdEX0xFTkdUSCA9IDEwOworICAgIC8vIE1pbiBudW1iZXIgb2YgdmFyaW91cyBjaGFyYWN0ZXIgdHlwZXMgdG8gdXNlLgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBURVNUX1BXRF9DSEFSUyA9IDI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFRFU1RfUFdEX0VYUElSQVRJT05fVElNRU9VVCA9IFRpbWVVbml0LkRBWVMudG9NaWxsaXMoMzU2KTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEVTVF9QV0RfSElTVE9SWV9MRU5HVEggPSAzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBURVNUX1BXRF9NQVhfQVRURU1QVFMgPSA1OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVEVTVF9NQVhfVElNRV9UT19MT0NLID0gVGltZVVuaXQuSE9VUlMudG9NaWxsaXMoMSk7CiAKICAgICAvKioKICAgICAgKiBUZXN0OiByZXRyaWV2aW5nIHNlY3VyaXR5IGxvZ3MgY2FuIG9ubHkgYmUgZG9uZSBpZiB0aGVyZSdzIG9uZSB1c2VyIG9uIHRoZSBkZXZpY2Ugb3IgYWxsCkBAIC01MCwxOSArMjIzLDEyNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRlc3Q6IHJldHJpZXZpbmcgc2VjdXJpdHkgbG9ncy4gVGhpcyB0ZXN0IGhhcyBzaG91bGQgYmUgY2FsbGVkIHdoZW4gc2VjdXJpdHkgbG9nZ2luZyBpcwotICAgICAqIGVuYWJsZWQgYW5kIGRpcmVjdGx5IGFmdGVyIHJlYm9vdCB3aXRoIGRldmljZSBvd25lciBpbnN0YWxsZWQgc28gdGhhdCBzZWN1cml0eSBsb2dnaW5nCi0gICAgICogYWN0dWFsbHkgdGFrZXMgcGxhY2UgYW5kIGZldGNoaW5nIHRoZSBsb2dzIGlzbid0IHN1YmplY3QgdG8gcmF0ZSBsaW1pdGluZy4KKyAgICAgKiBUZXN0OiByZXRyaWV2ZXMgc2VjdXJpdHkgbG9ncyBhbmQgdmVyaWZpZXMgdGhhdCBhbGwgZXZlbnRzIGdlbmVyYXRlZCBhcyBhIHJlc3VsdCBvZiBob3N0CisgICAgICogc2lkZSBhY3Rpb25zIGFuZCBieSB7QGxpbmsgI3Rlc3RHZW5lcmF0ZUxvZ3MoKX0gYXJlIHRoZXJlLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTZWN1cml0eUxvZ3MoKSB7Ci0gICAgICAgIExpc3Q8U2VjdXJpdHlFdmVudD4gZXZlbnRzID0gbURldmljZVBvbGljeU1hbmFnZXIucmV0cmlldmVTZWN1cml0eUxvZ3MoZ2V0V2hvKCkpOworICAgIHB1YmxpYyB2b2lkIHRlc3RWZXJpZnlHZW5lcmF0ZWRMb2dzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIExpc3Q8U2VjdXJpdHlFdmVudD4gZXZlbnRzID0gZ2V0RXZlbnRzKCk7CisgICAgICAgIHZlcmlmeUF1dG9tYXRpY0V2ZW50c1ByZXNlbnQoZXZlbnRzKTsKKyAgICAgICAgdmVyaWZ5S2V5c3RvcmVFdmVudHNQcmVzZW50KGV2ZW50cyk7CisgICAgICAgIHZlcmlmeUtleUNoYWluRXZlbnRzUHJlc2VudChldmVudHMpOworICAgICAgICB2ZXJpZnlBZG1pbkV2ZW50c1ByZXNlbnQoZXZlbnRzKTsKKyAgICB9CiAKLSAgICAgICAgLy8gVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBzb21lIGV2ZW50cywgZS5nLiBQYWNrYWdlTWFuYWdlciBsb2dzIGFsbCBwcm9jZXNzIGxhdW5jaGVzLgorICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlBdXRvbWF0aWNFdmVudHNQcmVzZW50KExpc3Q8U2VjdXJpdHlFdmVudD4gZXZlbnRzKSB7CisgICAgICAgIHZlcmlmeU9zU3RhcnR1cEV2ZW50UHJlc2VudChldmVudHMpOworICAgICAgICB2ZXJpZnlMb2dnaW5nU3RhcnRlZEV2ZW50UHJlc2VudChldmVudHMpOworICAgICAgICB2ZXJpZnlDcnlwdG9TZWxmVGVzdEV2ZW50UHJlc2VudChldmVudHMpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlLZXlDaGFpbkV2ZW50c1ByZXNlbnQoTGlzdDxTZWN1cml0eUV2ZW50PiBldmVudHMpIHsKKyAgICAgICAgdmVyaWZ5Q2VydEluc3RhbGxlZEV2ZW50UHJlc2VudChldmVudHMpOworICAgICAgICB2ZXJpZnlDZXJ0VW5pbnN0YWxsZWRFdmVudFByZXNlbnQoZXZlbnRzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5S2V5c3RvcmVFdmVudHNQcmVzZW50KExpc3Q8U2VjdXJpdHlFdmVudD4gZXZlbnRzKSB7CisgICAgICAgIHZlcmlmeUtleUdlbmVyYXRlZEV2ZW50UHJlc2VudChldmVudHMsIEdFTkVSQVRFRF9LRVlfQUxJQVMpOworICAgICAgICB2ZXJpZnlLZXlEZWxldGVkRXZlbnRQcmVzZW50KGV2ZW50cywgR0VORVJBVEVEX0tFWV9BTElBUyk7CisgICAgICAgIHZlcmlmeUtleUltcG9ydGVkRXZlbnRQcmVzZW50KGV2ZW50cywgSU1QT1JURURfS0VZX0FMSUFTKTsKKyAgICAgICAgdmVyaWZ5S2V5RGVsZXRlZEV2ZW50UHJlc2VudChldmVudHMsIElNUE9SVEVEX0tFWV9BTElBUyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUFkbWluRXZlbnRzUHJlc2VudChMaXN0PFNlY3VyaXR5RXZlbnQ+IGV2ZW50cykgeworICAgICAgICB2ZXJpZnlQYXNzd29yZENvbXBsZXhpdHlFdmVudHNQcmVzZW50KGV2ZW50cyk7CisgICAgICAgIHZlcmlmeVVzZXJSZXN0cmljdGlvbkV2ZW50c1ByZXNlbnQoZXZlbnRzKTsKKyAgICAgICAgdmVyaWZ5TG9ja2luZ1BvbGljeUV2ZW50c1ByZXNlbnQoZXZlbnRzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgZXZlbnRzIGZvciBwb3NpdGl2ZSB0ZXN0IGNhc2VzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmF0ZUxvZ3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZ2VuZXJhdGVLZXlzdG9yZUV2ZW50cygpOworICAgICAgICBnZW5lcmF0ZUtleUNoYWluRXZlbnRzKCk7CisgICAgICAgIGdlbmVyYXRlQWRtaW5FdmVudHMoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVLZXlDaGFpbkV2ZW50cygpIHsKKyAgICAgICAgaW5zdGFsbENhQ2VydCgpOworICAgICAgICB1bmluc3RhbGxDYUNlcnQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVLZXlzdG9yZUV2ZW50cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBnZW5lcmF0ZUtleShHRU5FUkFURURfS0VZX0FMSUFTKTsKKyAgICAgICAgZGVsZXRlS2V5KEdFTkVSQVRFRF9LRVlfQUxJQVMpOworICAgICAgICBpbXBvcnRLZXkoSU1QT1JURURfS0VZX0FMSUFTKTsKKyAgICAgICAgZGVsZXRlS2V5KElNUE9SVEVEX0tFWV9BTElBUyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlQWRtaW5FdmVudHMoKSB7CisgICAgICAgIGdlbmVyYXRlUGFzc3dvcmRDb21wbGV4aXR5RXZlbnRzKCk7CisgICAgICAgIGdlbmVyYXRlVXNlclJlc3RyaWN0aW9uRXZlbnRzKCk7CisgICAgICAgIGdlbmVyYXRlTG9ja2luZ1BvbGljeUV2ZW50cygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZldGNoZXMgYW5kIHNhbml0eS1jaGVja3MgdGhlIGV2ZW50cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIExpc3Q8U2VjdXJpdHlFdmVudD4gZ2V0RXZlbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIExpc3Q8U2VjdXJpdHlFdmVudD4gZXZlbnRzID0gbnVsbDsKKyAgICAgICAgLy8gUmV0cnkgb25jZSBhZnRlciBzZWVwaW5nIGZvciAxIHNlY29uZCwgaW4gY2FzZSAiZHBtIGZvcmNlLXNlY3VyaXR5LWxvZ3MiIGhhc24ndCB0YWtlbgorICAgICAgICAvLyBlZmZlY3QganVzdCB5ZXQuCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMiAmJiBldmVudHMgPT0gbnVsbDsgaSsrKSB7CisgICAgICAgICAgICBldmVudHMgPSBtRGV2aWNlUG9saWN5TWFuYWdlci5yZXRyaWV2ZVNlY3VyaXR5TG9ncyhnZXRXaG8oKSk7CisgICAgICAgICAgICBpZiAoZXZlbnRzID09IG51bGwpIFRocmVhZC5zbGVlcCgxMDAwKTsKKyAgICAgICAgfQorCisgICAgICAgIHZlcmlmeVNlY3VyaXR5TG9ncyhldmVudHMpOworCisgICAgICAgIHJldHVybiBldmVudHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdDogY2hlY2sgdGhhdCB0aGVyZSBhcmUgbm8gZ2FwcyBiZXR3ZWVuIGlkcyBpbiB0d28gY29uc2VjdXRpdmUgYmF0Y2hlcy4gU2hhcmVkIHByZWZlcmVuY2UKKyAgICAgKiBpcyB1c2VkIHRvIHN0b3JlIHRoZXNlIG51bWJlcnMgYmV0d2VlbiB0ZXN0IGludm9jYXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RWZXJpZnlMb2dJZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHBhcmFtID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0QXJndW1lbnRzKCkuZ2V0U3RyaW5nKEFSR19CQVRDSF9OVU1CRVIpOworICAgICAgICBmaW5hbCBpbnQgYmF0Y2hJZCA9IHBhcmFtID09IG51bGwgPyAwIDogSW50ZWdlci5wYXJzZUludChwYXJhbSk7CisgICAgICAgIGZpbmFsIExpc3Q8U2VjdXJpdHlFdmVudD4gZXZlbnRzID0gZ2V0RXZlbnRzKCk7CisgICAgICAgIGZpbmFsIFNoYXJlZFByZWZlcmVuY2VzIHByZWZzID0KKyAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRTaGFyZWRQcmVmZXJlbmNlcyhQUkVGX05BTUUsIENvbnRleHQuTU9ERV9QUklWQVRFKTsKKworICAgICAgICBmaW5hbCBsb25nIGZpcnN0SWQgPSBldmVudHMuZ2V0KDApLmdldElkKCk7CisgICAgICAgIGlmIChiYXRjaElkID09IDApIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiRXZlbnQgaWQgd2Fzbid0IHJlc2V0LiIsIDBMLCBmaXJzdElkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcmV2QmF0Y2hMYXN0SWRLZXkgPSBQUkVGX0tFWV9QUkVGSVggKyAoYmF0Y2hJZCAtIDEpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiTGFzdCBldmVudCBpZCBmcm9tIHByZXZpb3VzIGJhdGNoIG5vdCBmb3VuZCBpbiBzaGFyZWQgcHJlZnMiLAorICAgICAgICAgICAgICAgICAgICBwcmVmcy5jb250YWlucyhwcmV2QmF0Y2hMYXN0SWRLZXkpKTsKKyAgICAgICAgICAgIGZpbmFsIGxvbmcgcHJldkJhdGNoTGFzdElkID0gcHJlZnMuZ2V0TG9uZyhwcmV2QmF0Y2hMYXN0SWRLZXksIDApOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJFdmVudCBpZHMgYXJlbid0IGNvbnNlY3V0aXZlIGJldHdlZW4gYmF0Y2hlcyIsCisgICAgICAgICAgICAgICAgICAgIGZpcnN0SWQsIHByZXZCYXRjaExhc3RJZCArIDEpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGN1cnJCYXRjaExhc3RJZEtleSA9IFBSRUZfS0VZX1BSRUZJWCArIGJhdGNoSWQ7CisgICAgICAgIGZpbmFsIGxvbmcgbGFzdElkID0gZXZlbnRzLmdldChldmVudHMuc2l6ZSgpIC0gMSkuZ2V0SWQoKTsKKyAgICAgICAgcHJlZnMuZWRpdCgpLnB1dExvbmcoY3VyckJhdGNoTGFzdElkS2V5LCBsYXN0SWQpLmNvbW1pdCgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlTZWN1cml0eUxvZ3MoTGlzdDxTZWN1cml0eUV2ZW50PiBldmVudHMpIHsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiVW5hYmxlIHRvIGdldCBldmVudHMiLCBldmVudHMgIT0gbnVsbCAmJiBldmVudHMuc2l6ZSgpID4gMCk7CiAKICAgICAgICAgLy8gV2UgZG9uJ3Qga25vdyBtdWNoIGFib3V0IHRoZSBldmVudHMsIHNvIGp1c3QgY2FsbCBwdWJsaWMgQVBJIG1ldGhvZHMuCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXZlbnRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBTZWN1cml0eUV2ZW50IGV2ZW50ID0gZXZlbnRzLmdldChpKTsKKyAgICAgICAgICAgIGZpbmFsIFNlY3VyaXR5RXZlbnQgZXZlbnQgPSBldmVudHMuZ2V0KGkpOworCisgICAgICAgICAgICB2ZXJpZnlQYXlsb2FkVHlwZXMoZXZlbnQpOworCisgICAgICAgICAgICAvLyBUZXN0IGlkIGZvciBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcuCisgICAgICAgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkV2ZW50IElEcyBhcmUgbm90IG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyB3aXRoaW4gdGhlIGJhdGNoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cy5nZXQoaSAtIDEpLmdldElkKCkgKyAxLCBldmVudC5nZXRJZCgpKTsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gVGVzdCBwYXJjZWxsaW5nOiBmbGF0dGVuIHRvIGEgcGFyY2VsLgogICAgICAgICAgICAgUGFyY2VsIHAgPSBQYXJjZWwub2J0YWluKCk7CkBAIC03MCw5ICszNTEsMTIgQEAKICAgICAgICAgICAgIHAuc2V0RGF0YVBvc2l0aW9uKDApOwogCiAgICAgICAgICAgICAvLyBSZXN0b3JlIGZyb20gcGFyY2VsIGFuZCBjaGVjayBjb250ZW50cy4KLSAgICAgICAgICAgIFNlY3VyaXR5RXZlbnQgcmVzdG9yZWQgPSBTZWN1cml0eUV2ZW50LkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChwKTsKKyAgICAgICAgICAgIGZpbmFsIFNlY3VyaXR5RXZlbnQgcmVzdG9yZWQgPSBTZWN1cml0eUV2ZW50LkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChwKTsKICAgICAgICAgICAgIHAucmVjeWNsZSgpOwogCisgICAgICAgICAgICBmaW5hbCBpbnQgbGV2ZWwgPSBldmVudC5nZXRMb2dMZXZlbCgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShsZXZlbCA9PSBMRVZFTF9JTkZPIHx8IGxldmVsID09IExFVkVMX1dBUk5JTkcgfHwgbGV2ZWwgPT0gTEVWRUxfRVJST1IpOworCiAgICAgICAgICAgICAvLyBGb3Igc29tZSBldmVudHMgZGF0YSBpcyBlbmNhcHN1bGF0ZWQgaW50byBPYmplY3QgYXJyYXkuCiAgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0RGF0YSgpIGluc3RhbmNlb2YgT2JqZWN0W10pIHsKICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJQYXJjZWxsaW5nIGNoYW5nZWQgdGhlIGFycmF5IHJldHVybmVkIGJ5IGdldERhdGEiLApAQCAtODEsNiArMzY1LDggQEAKICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlBhcmNlbGxpbmcgY2hhbmdlZCB0aGUgcmVzdWx0IG9mIGdldERhdGEiLAogICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0RGF0YSgpLCByZXN0b3JlZC5nZXREYXRhKCkpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJQYXJjZWxsaW5nIGNoYW5nZWQgdGhlIHJlc3VsdCBvZiBnZXRJZCIsCisgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldElkKCksIHJlc3RvcmVkLmdldElkKCkpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJQYXJjZWxsaW5nIGNoYW5nZWQgdGhlIHJlc3VsdCBvZiBnZXRUYWciLAogICAgICAgICAgICAgICAgICAgICBldmVudC5nZXRUYWcoKSwgcmVzdG9yZWQuZ2V0VGFnKCkpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJQYXJjZWxsaW5nIGNoYW5nZWQgdGhlIHJlc3VsdCBvZiBnZXRUaW1lTmFub3MiLApAQCAtOTAsNiArMzc2LDc5IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5UGF5bG9hZFR5cGVzKFNlY3VyaXR5RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgZmluYWwgTGlzdDxDbGFzcz4gcGF5bG9hZFR5cGVzID0gUEFZTE9BRF9UWVBFU19NQVAuZ2V0KGV2ZW50LmdldFRhZygpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZXZlbnQgdHlwZSB1bmtub3duOiAiICsgZXZlbnQuZ2V0VGFnKCksIHBheWxvYWRUeXBlcyk7CisKKyAgICAgICAgaWYgKHBheWxvYWRUeXBlcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgLy8gTm8gcGF5bG9hZC4KKyAgICAgICAgICAgIGFzc2VydE51bGwoIm5vbi1udWxsIHBheWxvYWQiLCBldmVudC5nZXREYXRhKCkpOworICAgICAgICB9IGVsc2UgaWYgKHBheWxvYWRUeXBlcy5zaXplKCkgPT0gMSkgeworICAgICAgICAgICAgLy8gU2luZ2xldG9uIHBheWxvYWQuCisgICAgICAgICAgICBhc3NlcnRUcnVlKHBheWxvYWRUeXBlcy5nZXQoMCkuaXNJbnN0YW5jZShldmVudC5nZXREYXRhKCkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFBheWxvYWQgaXMgaW5jYXBzdWxhdGVkIGludG8gT2JqZWN0W10KKyAgICAgICAgICAgIGFzc2VydFRydWUoZXZlbnQuZ2V0RGF0YSgpIGluc3RhbmNlb2YgT2JqZWN0W10pOworICAgICAgICAgICAgZmluYWwgT2JqZWN0W10gZGF0YUFycmF5ID0gKE9iamVjdFtdKSBldmVudC5nZXREYXRhKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocGF5bG9hZFR5cGVzLnNpemUoKSwgZGF0YUFycmF5Lmxlbmd0aCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBheWxvYWRUeXBlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGFzc2VydFRydWUocGF5bG9hZFR5cGVzLmdldChpKS5pc0luc3RhbmNlKGRhdGFBcnJheVtpXSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeU9zU3RhcnR1cEV2ZW50UHJlc2VudChMaXN0PFNlY3VyaXR5RXZlbnQ+IGV2ZW50cykgeworICAgICAgICBmaW5hbCBTZWN1cml0eUV2ZW50IGV2ZW50ID0gZmluZEV2ZW50KCJvcyBzdGFydHVwIiwgZXZlbnRzLCBUQUdfT1NfU1RBUlRVUCk7CisgICAgICAgIC8vIFZlcmlmaWVkIGJvb3Qgc3RhdGUsIGVtcHR5IGlmIHJ1bm5pbmcgb24gZW11bGF0b3IKKyAgICAgICAgYXNzZXJ0VHJ1ZShJbW11dGFibGVTZXQub2YoIiIsICJncmVlbiIsICJ5ZWxsb3ciLCAib3JhbmdlIikuY29udGFpbnMoZ2V0U3RyaW5nKGV2ZW50LCAwKSkpOworICAgICAgICAvLyBkbS12ZXJpdHkgbW9kZSwgZW1wdHkgaWYgaXQgaXMgZGlzYWJsZWQKKyAgICAgICAgYXNzZXJ0VHJ1ZShJbW11dGFibGVTZXQub2YoImVuZm9yY2luZyIsICJlaW8iLCAiIikuY29udGFpbnMoZ2V0U3RyaW5nKGV2ZW50LCAxKSkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlDcnlwdG9TZWxmVGVzdEV2ZW50UHJlc2VudChMaXN0PFNlY3VyaXR5RXZlbnQ+IGV2ZW50cykgeworICAgICAgICBmaW5hbCBTZWN1cml0eUV2ZW50IGV2ZW50ID0gZmluZEV2ZW50KCJjcnlwdG8gc2VsZiB0ZXN0IGNvbXBsZXRlIiwKKyAgICAgICAgICAgICAgICBldmVudHMsIFRBR19DUllQVE9fU0VMRl9URVNUX0NPTVBMRVRFRCk7CisgICAgICAgIC8vIFN1Y2Nlc3MgY29kZS4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGdldEludChldmVudCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlMb2dnaW5nU3RhcnRlZEV2ZW50UHJlc2VudChMaXN0PFNlY3VyaXR5RXZlbnQ+IGV2ZW50cykgeworICAgICAgICBmaW5kRXZlbnQoImxvZ2dpbmcgc3RhcnRlZCIsIGV2ZW50cywgVEFHX0xPR0dJTkdfU1RBUlRFRCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTZWN1cml0eUV2ZW50IGZpbmRFdmVudChTdHJpbmcgZGVzY3JpcHRpb24sIExpc3Q8U2VjdXJpdHlFdmVudD4gZXZlbnRzLCBpbnQgdGFnKSB7CisgICAgICAgIHJldHVybiBmaW5kRXZlbnQoZGVzY3JpcHRpb24sIGV2ZW50cywgZSAtPiBlLmdldFRhZygpID09IHRhZyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTZWN1cml0eUV2ZW50IGZpbmRFdmVudChTdHJpbmcgZGVzY3JpcHRpb24sIExpc3Q8U2VjdXJpdHlFdmVudD4gZXZlbnRzLAorICAgICAgICAgICAgUHJlZGljYXRlPFNlY3VyaXR5RXZlbnQ+IHByZWRpY2F0ZSkgeworICAgICAgICBmaW5hbCBMaXN0PFNlY3VyaXR5RXZlbnQ+IG1hdGNoZXMgPQorICAgICAgICAgICAgICAgIGV2ZW50cy5zdHJlYW0oKS5maWx0ZXIocHJlZGljYXRlKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkludmFsaWQgbnVtYmVyIG9mIG1hdGNoaW5nIGV2ZW50czogIiArIGRlc2NyaXB0aW9uLCAxLCBtYXRjaGVzLnNpemUoKSk7CisgICAgICAgIHJldHVybiBtYXRjaGVzLmdldCgwKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBPYmplY3QgZ2V0RGF0dW0oU2VjdXJpdHlFdmVudCBldmVudCwgaW50IGluZGV4KSB7CisgICAgICAgIGZpbmFsIE9iamVjdFtdIGRhdGFBcnJheSA9IChPYmplY3RbXSkgZXZlbnQuZ2V0RGF0YSgpOworICAgICAgICByZXR1cm4gZGF0YUFycmF5W2luZGV4XTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFNlY3VyaXR5RXZlbnQgZXZlbnQsIGludCBpbmRleCkgeworICAgICAgICByZXR1cm4gKFN0cmluZykgZ2V0RGF0dW0oZXZlbnQsIGluZGV4KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0SW50KFNlY3VyaXR5RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgcmV0dXJuIChJbnRlZ2VyKSBldmVudC5nZXREYXRhKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldEludChTZWN1cml0eUV2ZW50IGV2ZW50LCBpbnQgaW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIChJbnRlZ2VyKSBnZXREYXR1bShldmVudCwgaW5kZXgpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGxvbmcgZ2V0TG9uZyhTZWN1cml0eUV2ZW50IGV2ZW50LCBpbnQgaW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIChMb25nKSBnZXREYXR1bShldmVudCwgaW5kZXgpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIFRlc3Q6IFRlc3QgZW5hYmxpbmcgc2VjdXJpdHkgbG9nZ2luZy4gVGhpcyB0ZXN0IHNob3VsZCBiZSBleGVjdXRlZCBhZnRlciBpbnN0YWxsaW5nIGEgZGV2aWNlCiAgICAgICogb3duZXIgc28gdGhhdCB3ZSBjaGVjayB0aGF0IGxvZ2dpbmcgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdC4gVGhpcyB0ZXN0IGhhcyBhIHNpZGUgZWZmZWN0OgpAQCAtMTA4LDE4ICs0NjcsMjE1IEBACiAgICAgcHVibGljIHZvaWQgdGVzdERpc2FibGluZ1NlY3VyaXR5TG9nZ2luZygpIHsKICAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuc2V0U2VjdXJpdHlMb2dnaW5nRW5hYmxlZChnZXRXaG8oKSwgZmFsc2UpOwogICAgICAgICBhc3NlcnRGYWxzZShtRGV2aWNlUG9saWN5TWFuYWdlci5pc1NlY3VyaXR5TG9nZ2luZ0VuYWJsZWQoZ2V0V2hvKCkpKTsKKworICAgICAgICAvLyBWZXJpZnkgdGhhdCBsb2dzIGFyZSBhY3R1YWxseSBub3QgYXZhaWxhYmxlLgorICAgICAgICBhc3NlcnROdWxsKG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnJldHJpZXZlU2VjdXJpdHlMb2dzKGdldFdobygpKSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogVGVzdDogcmV0cmlldmluZyBzZWN1cml0eSBsb2dzIHNob3VsZCBiZSByYXRlIGxpbWl0ZWQgLSBzdWJzZXF1ZW50IGF0dGVtcHRzIHNob3VsZCByZXR1cm4KICAgICAgKiBudWxsLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXRyaWV2aW5nU2VjdXJpdHlMb2dzTm90UG9zc2libGVJbW1lZGlhdGVseUFmdGVyUHJldmlvdXNTdWNjZXNzZnVsUmV0cmlldmFsKCkgewotICAgICAgICBMaXN0PFNlY3VyaXR5RXZlbnQ+IGxvZ3MgPSBtRGV2aWNlUG9saWN5TWFuYWdlci5yZXRyaWV2ZVNlY3VyaXR5TG9ncyhnZXRXaG8oKSk7CisgICAgcHVibGljIHZvaWQgdGVzdFNlY3VyaXR5TG9nZ2luZ1JldHJpZXZhbFJhdGVMaW1pdGVkKCkgeworICAgICAgICBmaW5hbCBMaXN0PFNlY3VyaXR5RXZlbnQ+IGxvZ3MgPSBtRGV2aWNlUG9saWN5TWFuYWdlci5yZXRyaWV2ZVNlY3VyaXR5TG9ncyhnZXRXaG8oKSk7CiAgICAgICAgIC8vIGlmIGxvZ3MgaXMgbnVsbCBpdCBtZWFucyB0aGF0IHRoYXQgYXR0ZW1wdCB3YXMgcmF0ZSBsaW1pdGVkID0+IHRlc3QgUEFTUwogICAgICAgICBpZiAobG9ncyAhPSBudWxsKSB7CiAgICAgICAgICAgICBhc3NlcnROdWxsKG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnJldHJpZXZlU2VjdXJpdHlMb2dzKGdldFdobygpKSk7CiAgICAgICAgICAgICBhc3NlcnROdWxsKG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnJldHJpZXZlU2VjdXJpdHlMb2dzKGdldFdobygpKSk7CiAgICAgICAgIH0KICAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVLZXkoU3RyaW5nIGtleUFsaWFzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgS2V5UGFpckdlbmVyYXRvciBnZW5lcmF0b3IgPSBLZXlQYWlyR2VuZXJhdG9yLmdldEluc3RhbmNlKCJSU0EiLCAiQW5kcm9pZEtleVN0b3JlIik7CisgICAgICAgIGdlbmVyYXRvci5pbml0aWFsaXplKAorICAgICAgICAgICAgICAgIG5ldyBLZXlHZW5QYXJhbWV0ZXJTcGVjLkJ1aWxkZXIoa2V5QWxpYXMsIEtleVByb3BlcnRpZXMuUFVSUE9TRV9TSUdOKS5idWlsZCgpKTsKKyAgICAgICAgZmluYWwgS2V5UGFpciBrZXlQYWlyID0gZ2VuZXJhdG9yLmdlbmVyYXRlS2V5UGFpcigpOworICAgICAgICBhc3NlcnROb3ROdWxsKGtleVBhaXIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlLZXlHZW5lcmF0ZWRFdmVudFByZXNlbnQoTGlzdDxTZWN1cml0eUV2ZW50PiBldmVudHMsIFN0cmluZyBhbGlhcykgeworICAgICAgICBmaW5kRXZlbnQoImtleSBnZW5lcmF0ZWQiLCBldmVudHMsCisgICAgICAgICAgICAgICAgZSAtPiBlLmdldFRhZygpID09IFRBR19LRVlfR0VORVJBVEVECisgICAgICAgICAgICAgICAgICAgICAgICAmJiBnZXRJbnQoZSwgU1VDQ0VTU19JTkRFWCkgPT0gU1VDQ0VTU19WQUxVRQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZ2V0U3RyaW5nKGUsIEFMSUFTX0lOREVYKS5jb250YWlucyhhbGlhcykKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGdldEludChlLCBVSURfSU5ERVgpID09IFByb2Nlc3MubXlVaWQoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGltcG9ydEtleShTdHJpbmcgYWxpYXMpIHRocm93cyBFeGNlcHRpb257CisgICAgICAgIGZpbmFsIEtleVN0b3JlIGtzID0gS2V5U3RvcmUuZ2V0SW5zdGFuY2UoIkFuZHJvaWRLZXlTdG9yZSIpOworICAgICAgICBrcy5sb2FkKG51bGwpOworICAgICAgICBrcy5zZXRFbnRyeShhbGlhcywgbmV3IEtleVN0b3JlLlNlY3JldEtleUVudHJ5KG5ldyBTZWNyZXRLZXlTcGVjKG5ldyBieXRlWzMyXSwgIkFFUyIpKSwKKyAgICAgICAgICAgICAgICBuZXcgS2V5UHJvdGVjdGlvbi5CdWlsZGVyKEtleVByb3BlcnRpZXMuUFVSUE9TRV9FTkNSWVBUKS5idWlsZCgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5S2V5SW1wb3J0ZWRFdmVudFByZXNlbnQoTGlzdDxTZWN1cml0eUV2ZW50PiBldmVudHMsIFN0cmluZyBhbGlhcykgeworICAgICAgICBmaW5kRXZlbnQoImtleSBpbXBvcnRlZCIsIGV2ZW50cywKKyAgICAgICAgICAgICAgICBlIC0+IGUuZ2V0VGFnKCkgPT0gVEFHX0tFWV9JTVBPUlQKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGdldEludChlLCBTVUNDRVNTX0lOREVYKSA9PSBTVUNDRVNTX1ZBTFVFCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBnZXRTdHJpbmcoZSwgQUxJQVNfSU5ERVgpLmNvbnRhaW5zKGFsaWFzKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZ2V0SW50KGUsIFVJRF9JTkRFWCkgPT0gUHJvY2Vzcy5teVVpZCgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGVsZXRlS2V5KFN0cmluZyBrZXlBbGlhcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEtleVN0b3JlIGtzID0gS2V5U3RvcmUuZ2V0SW5zdGFuY2UoIkFuZHJvaWRLZXlTdG9yZSIpOworICAgICAgICBrcy5sb2FkKG51bGwpOworICAgICAgICBrcy5kZWxldGVFbnRyeShrZXlBbGlhcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUtleURlbGV0ZWRFdmVudFByZXNlbnQoTGlzdDxTZWN1cml0eUV2ZW50PiBldmVudHMsIFN0cmluZyBhbGlhcykgeworICAgICAgICBmaW5kRXZlbnQoImtleSBkZWxldGVkIiwgZXZlbnRzLAorICAgICAgICAgICAgICAgIGUgLT4gZS5nZXRUYWcoKSA9PSBUQUdfS0VZX0RFU1RSVUNUSU9OCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBnZXRJbnQoZSwgU1VDQ0VTU19JTkRFWCkgPT0gU1VDQ0VTU19WQUxVRQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZ2V0U3RyaW5nKGUsIEFMSUFTX0lOREVYKS5jb250YWlucyhhbGlhcykKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGdldEludChlLCBVSURfSU5ERVgpID09IFByb2Nlc3MubXlVaWQoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluc3RhbGxDYUNlcnQoKSB7CisgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmluc3RhbGxDYUNlcnQoZ2V0V2hvKCksIFRFU1RfQ0EuZ2V0Qnl0ZXMoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUNlcnRJbnN0YWxsZWRFdmVudFByZXNlbnQoTGlzdDxTZWN1cml0eUV2ZW50PiBldmVudHMpIHsKKyAgICAgICAgZmluZEV2ZW50KCJjZXJ0IGF1dGhvcml0eSBpbnN0YWxsZWQiLCBldmVudHMsCisgICAgICAgICAgICAgICAgZSAtPiBlLmdldFRhZygpID09IFRBR19DRVJUX0FVVEhPUklUWV9JTlNUQUxMRUQKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGdldEludChlLCBTVUNDRVNTX0lOREVYKSA9PSBTVUNDRVNTX1ZBTFVFCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBnZXRTdHJpbmcoZSwgU1VCSkVDVF9JTkRFWCkuZXF1YWxzKFRFU1RfQ0FfU1VCSkVDVCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1bmluc3RhbGxDYUNlcnQoKSB7CisgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnVuaW5zdGFsbENhQ2VydChnZXRXaG8oKSwgVEVTVF9DQS5nZXRCeXRlcygpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5Q2VydFVuaW5zdGFsbGVkRXZlbnRQcmVzZW50KExpc3Q8U2VjdXJpdHlFdmVudD4gZXZlbnRzKSB7CisgICAgICAgIGZpbmRFdmVudCgiY2VydCBhdXRob3JpdHkgcmVtb3ZlZCIsIGV2ZW50cywKKyAgICAgICAgICAgICAgICBlIC0+IGUuZ2V0VGFnKCkgPT0gVEFHX0NFUlRfQVVUSE9SSVRZX1JFTU9WRUQKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGdldEludChlLCBTVUNDRVNTX0lOREVYKSA9PSBTVUNDRVNTX1ZBTFVFCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBnZXRTdHJpbmcoZSwgU1VCSkVDVF9JTkRFWCkuZXF1YWxzKFRFU1RfQ0FfU1VCSkVDVCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZVBhc3N3b3JkQ29tcGxleGl0eUV2ZW50cygpIHsKKyAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuc2V0UGFzc3dvcmRRdWFsaXR5KGdldFdobygpLCBQQVNTV09SRF9RVUFMSVRZX0NPTVBMRVgpOworICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5zZXRQYXNzd29yZE1pbmltdW1MZW5ndGgoZ2V0V2hvKCksIFRFU1RfUFdEX0xFTkdUSCk7CisgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnNldFBhc3N3b3JkTWluaW11bUxldHRlcnMoZ2V0V2hvKCksIFRFU1RfUFdEX0NIQVJTKTsKKyAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuc2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyKGdldFdobygpLCBURVNUX1BXRF9DSEFSUyk7CisgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnNldFBhc3N3b3JkTWluaW11bVVwcGVyQ2FzZShnZXRXaG8oKSwgVEVTVF9QV0RfQ0hBUlMpOworICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5zZXRQYXNzd29yZE1pbmltdW1Mb3dlckNhc2UoZ2V0V2hvKCksIFRFU1RfUFdEX0NIQVJTKTsKKyAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuc2V0UGFzc3dvcmRNaW5pbXVtTnVtZXJpYyhnZXRXaG8oKSwgVEVTVF9QV0RfQ0hBUlMpOworICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5zZXRQYXNzd29yZE1pbmltdW1TeW1ib2xzKGdldFdobygpLCBURVNUX1BXRF9DSEFSUyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeVBhc3N3b3JkQ29tcGxleGl0eUV2ZW50c1ByZXNlbnQoTGlzdDxTZWN1cml0eUV2ZW50PiBldmVudHMpIHsKKyAgICAgICAgZmluYWwgaW50IHVzZXJJZCA9IFByb2Nlc3MubXlVc2VySGFuZGxlKCkuZ2V0SWRlbnRpZmllcigpOworICAgICAgICAvLyBUaGlzIHJlZmxlY3RzIGRlZmF1bHQgdmFsdWVzIGZvciBwYXNzd29yZCBjb21wbGV4aXR5IGV2ZW50IHBheWxvYWQgZmllbGRzLgorICAgICAgICBmaW5hbCBPYmplY3RbXSBleHBlY3RlZFBheWxvYWQgPSBuZXcgT2JqZWN0W10geworICAgICAgICAgICAgICAgIGdldFdobygpLmdldFBhY2thZ2VOYW1lKCksIC8vIGFkbWluIHBhY2thZ2UKKyAgICAgICAgICAgICAgICB1c2VySWQsICAgICAgICAgICAgICAgICAgICAvLyBhZG1pbiB1c2VyCisgICAgICAgICAgICAgICAgdXNlcklkLCAgICAgICAgICAgICAgICAgICAgLy8gdGFyZ2V0IHVzZXIKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IHBhc3N3b3JkIGxlbmd0aAorICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgcGFzc3dvcmQgcXVhbGl0eQorICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgbWluIGxldHRlcnMKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IG1pbiBub24tbGV0dGVycworICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgbWluIG51bWVyaWMKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IG1pbiB1cHBlcmNhc2UKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IG1pbiBsb3dlcmNhc2UKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IG1pbiBzeW1ib2xzCisgICAgICAgIH07CisKKyAgICAgICAgLy8gVGhlIG9yZGVyIHNob3VsZCBiZSBjb25zaXN0ZW50IHdpdGggdGhlIG9yZGVyIGluIGdlbmVyYXRlUGFzc3dvcmRDb21wbGV4aXR5RXZlbnRzKCksIHNvCisgICAgICAgIC8vIHRoYXQgdGhlIGV4cGVjdGVkIHZhbHVlcyBjaGFuZ2UgaW4gdGhlIHNhbWUgc2VxdWVuY2UgYXMgd2hlbiBzZXR0aW5nIHBhc3N3b3JkIHBvbGljaWVzLgorICAgICAgICBleHBlY3RlZFBheWxvYWRbUFdEX1FVQUxJVFlfSU5ERVhdID0gUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYOworICAgICAgICBmaW5kUGFzc3dvcmRDb21wbGV4aXR5RXZlbnQoInNldCBwd2QgcXVhbGl0eSIsIGV2ZW50cywgZXhwZWN0ZWRQYXlsb2FkKTsKKyAgICAgICAgZXhwZWN0ZWRQYXlsb2FkW1BXRF9MRU5fSU5ERVhdID0gVEVTVF9QV0RfTEVOR1RIOworICAgICAgICBmaW5kUGFzc3dvcmRDb21wbGV4aXR5RXZlbnQoInNldCBwd2QgbGVuZ3RoIiwgZXZlbnRzLCBleHBlY3RlZFBheWxvYWQpOworICAgICAgICBleHBlY3RlZFBheWxvYWRbTEVUVEVSU19JTkRFWF0gPSBURVNUX1BXRF9DSEFSUzsKKyAgICAgICAgZmluZFBhc3N3b3JkQ29tcGxleGl0eUV2ZW50KCJzZXQgcHdkIG1pbiBsZXR0ZXJzIiwgZXZlbnRzLCBleHBlY3RlZFBheWxvYWQpOworICAgICAgICBleHBlY3RlZFBheWxvYWRbTk9OX0xFVFRFUlNfSU5ERVhdID0gVEVTVF9QV0RfQ0hBUlM7CisgICAgICAgIGZpbmRQYXNzd29yZENvbXBsZXhpdHlFdmVudCgic2V0IHB3ZCBtaW4gbm9uLWxldHRlcnMiLCBldmVudHMsIGV4cGVjdGVkUGF5bG9hZCk7CisgICAgICAgIGV4cGVjdGVkUGF5bG9hZFtVUFBFUkNBU0VfSU5ERVhdID0gVEVTVF9QV0RfQ0hBUlM7CisgICAgICAgIGZpbmRQYXNzd29yZENvbXBsZXhpdHlFdmVudCgic2V0IHB3ZCBtaW4gdXBwZXJjYXNlIiwgZXZlbnRzLCBleHBlY3RlZFBheWxvYWQpOworICAgICAgICBleHBlY3RlZFBheWxvYWRbTE9XRVJDQVNFX0lOREVYXSA9IFRFU1RfUFdEX0NIQVJTOworICAgICAgICBmaW5kUGFzc3dvcmRDb21wbGV4aXR5RXZlbnQoInNldCBwd2QgbWluIGxvd2VyY2FzZSIsIGV2ZW50cywgZXhwZWN0ZWRQYXlsb2FkKTsKKyAgICAgICAgZXhwZWN0ZWRQYXlsb2FkW05VTUVSSUNfSU5ERVhdID0gVEVTVF9QV0RfQ0hBUlM7CisgICAgICAgIGZpbmRQYXNzd29yZENvbXBsZXhpdHlFdmVudCgic2V0IHB3ZCBtaW4gbnVtZXJpYyIsIGV2ZW50cywgZXhwZWN0ZWRQYXlsb2FkKTsKKyAgICAgICAgZXhwZWN0ZWRQYXlsb2FkW1NZTUJPTFNfSU5ERVhdID0gVEVTVF9QV0RfQ0hBUlM7CisgICAgICAgIGZpbmRQYXNzd29yZENvbXBsZXhpdHlFdmVudCgic2V0IHB3ZCBtaW4gc3ltYm9scyIsIGV2ZW50cywgZXhwZWN0ZWRQYXlsb2FkKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVMb2NraW5nUG9saWN5RXZlbnRzKCkgeworICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5zZXRQYXNzd29yZEV4cGlyYXRpb25UaW1lb3V0KGdldFdobygpLCBURVNUX1BXRF9FWFBJUkFUSU9OX1RJTUVPVVQpOworICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5zZXRQYXNzd29yZEhpc3RvcnlMZW5ndGgoZ2V0V2hvKCksIFRFU1RfUFdEX0hJU1RPUllfTEVOR1RIKTsKKyAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuc2V0TWF4aW11bUZhaWxlZFBhc3N3b3Jkc0ZvcldpcGUoZ2V0V2hvKCksIFRFU1RfUFdEX01BWF9BVFRFTVBUUyk7CisgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnNldEtleWd1YXJkRGlzYWJsZWRGZWF0dXJlcyhnZXRXaG8oKSwgS0VZR1VBUkRfRElTQUJMRV9GSU5HRVJQUklOVCk7CisgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnNldE1heGltdW1UaW1lVG9Mb2NrKGdldFdobygpLCBURVNUX01BWF9USU1FX1RPX0xPQ0spOworICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5sb2NrTm93KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUxvY2tpbmdQb2xpY3lFdmVudHNQcmVzZW50KExpc3Q8U2VjdXJpdHlFdmVudD4gZXZlbnRzKSB7CisgICAgICAgIGZpbmFsIGludCB1c2VySWQgPSBQcm9jZXNzLm15VXNlckhhbmRsZSgpLmdldElkZW50aWZpZXIoKTsKKworICAgICAgICBmaW5kRXZlbnQoInNldCBwYXNzd29yZCBleHBpcmF0aW9uIiwgZXZlbnRzLAorICAgICAgICAgICAgICAgIGUgLT4gZS5nZXRUYWcoKSA9PSBUQUdfUEFTU1dPUkRfRVhQSVJBVElPTl9TRVQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFN0cmluZyhlLCBBRE1JTl9QS0dfSU5ERVgpLmVxdWFscyhnZXRXaG8oKS5nZXRQYWNrYWdlTmFtZSgpKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SW50KGUsIEFETUlOX1VTRVJfSU5ERVgpID09IHVzZXJJZCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SW50KGUsIFRBUkdFVF9VU0VSX0lOREVYKSA9PSB1c2VySWQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldExvbmcoZSwgUFdEX0VYUElSQVRJT05fSU5ERVgpID09IFRFU1RfUFdEX0VYUElSQVRJT05fVElNRU9VVCk7CisKKyAgICAgICAgZmluZEV2ZW50KCJzZXQgcGFzc3dvcmQgaGlzdG9yeSBsZW5ndGgiLCBldmVudHMsCisgICAgICAgICAgICAgICAgZSAtPiBlLmdldFRhZygpID09IFRBR19QQVNTV09SRF9ISVNUT1JZX0xFTkdUSF9TRVQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFN0cmluZyhlLCBBRE1JTl9QS0dfSU5ERVgpLmVxdWFscyhnZXRXaG8oKS5nZXRQYWNrYWdlTmFtZSgpKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SW50KGUsIEFETUlOX1VTRVJfSU5ERVgpID09IHVzZXJJZCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SW50KGUsIFRBUkdFVF9VU0VSX0lOREVYKSA9PSB1c2VySWQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldEludChlLCBQV0RfSElTVF9MRU5fSU5ERVgpID09IFRFU1RfUFdEX0hJU1RPUllfTEVOR1RIKTsKKworICAgICAgICBmaW5kRXZlbnQoInNldCBwYXNzd29yZCBhdHRlbXB0cyIsIGV2ZW50cywKKyAgICAgICAgICAgICAgICBlIC0+IGUuZ2V0VGFnKCkgPT0gVEFHX01BWF9QQVNTV09SRF9BVFRFTVBUU19TRVQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFN0cmluZyhlLCBBRE1JTl9QS0dfSU5ERVgpLmVxdWFscyhnZXRXaG8oKS5nZXRQYWNrYWdlTmFtZSgpKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SW50KGUsIEFETUlOX1VTRVJfSU5ERVgpID09IHVzZXJJZCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SW50KGUsIFRBUkdFVF9VU0VSX0lOREVYKSA9PSB1c2VySWQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldEludChlLCBNQVhfUFdEX0FUVEVNUFRTX0lOREVYKSA9PSBURVNUX1BXRF9NQVhfQVRURU1QVFMpOworCisgICAgICAgIGZpbmRFdmVudCgic2V0IGtleWd1YXJkIGRpc2FibGVkIGZlYXR1cmVzIiwgZXZlbnRzLAorICAgICAgICAgICAgICAgIGUgLT4gZS5nZXRUYWcoKSA9PSBUQUdfS0VZR1VBUkRfRElTQUJMRURfRkVBVFVSRVNfU0VUICYmCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRTdHJpbmcoZSwgQURNSU5fUEtHX0lOREVYKS5lcXVhbHMoZ2V0V2hvKCkuZ2V0UGFja2FnZU5hbWUoKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldEludChlLCBBRE1JTl9VU0VSX0lOREVYKSA9PSB1c2VySWQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldEludChlLCBUQVJHRVRfVVNFUl9JTkRFWCkgPT0gdXNlcklkICYmCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRJbnQoZSwgS0VZR1VBUkRfRkVBVFVSRVNfSU5ERVgpID09IEtFWUdVQVJEX0RJU0FCTEVfRklOR0VSUFJJTlQpOworCisgICAgICAgIGZpbmRFdmVudCgic2V0IHNjcmVlbiBsb2NrIHRpbWVvdXQiLCBldmVudHMsCisgICAgICAgICAgICAgICAgZSAtPiBlLmdldFRhZygpID09IFRBR19NQVhfU0NSRUVOX0xPQ0tfVElNRU9VVF9TRVQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFN0cmluZyhlLCBBRE1JTl9QS0dfSU5ERVgpLmVxdWFscyhnZXRXaG8oKS5nZXRQYWNrYWdlTmFtZSgpKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SW50KGUsIEFETUlOX1VTRVJfSU5ERVgpID09IHVzZXJJZCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SW50KGUsIFRBUkdFVF9VU0VSX0lOREVYKSA9PSB1c2VySWQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldExvbmcoZSwgTUFYX1NDUkVFTl9USU1FT1VUX0lOREVYKSA9PSBURVNUX01BWF9USU1FX1RPX0xPQ0spOworCisgICAgICAgIGZpbmRFdmVudCgic2V0IHNjcmVlbiBsb2NrIHRpbWVvdXQiLCBldmVudHMsCisgICAgICAgICAgICAgICAgZSAtPiBlLmdldFRhZygpID09IFRBR19SRU1PVEVfTE9DSyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U3RyaW5nKGUsIEFETUlOX1BLR19JTkRFWCkuZXF1YWxzKGdldFdobygpLmdldFBhY2thZ2VOYW1lKCkpICYmCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRJbnQoZSwgQURNSU5fVVNFUl9JTkRFWCkgPT0gdXNlcklkKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZmluZFBhc3N3b3JkQ29tcGxleGl0eUV2ZW50KAorICAgICAgICAgICAgU3RyaW5nIGRlc2NyaXB0aW9uLCBMaXN0PFNlY3VyaXR5RXZlbnQ+IGV2ZW50cywgT2JqZWN0W10gZXhwZWN0ZWRQYXlsb2FkKSB7CisgICAgICAgIGZpbmRFdmVudChkZXNjcmlwdGlvbiwgZXZlbnRzLAorICAgICAgICAgICAgICAgIGUgLT4gZS5nZXRUYWcoKSA9PSBUQUdfUEFTU1dPUkRfQ09NUExFWElUWV9TRVQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5lcXVhbHMoKE9iamVjdFtdKSBlLmdldERhdGEoKSwgZXhwZWN0ZWRQYXlsb2FkKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlVXNlclJlc3RyaWN0aW9uRXZlbnRzKCkgeworICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5hZGRVc2VyUmVzdHJpY3Rpb24oZ2V0V2hvKCksIFVzZXJNYW5hZ2VyLkRJU0FMTE9XX0ZVTik7CisgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmNsZWFyVXNlclJlc3RyaWN0aW9uKGdldFdobygpLCBVc2VyTWFuYWdlci5ESVNBTExPV19GVU4pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlVc2VyUmVzdHJpY3Rpb25FdmVudHNQcmVzZW50KExpc3Q8U2VjdXJpdHlFdmVudD4gZXZlbnRzKSB7CisgICAgICAgIGZpbmRVc2VyUmVzdHJpY3Rpb25FdmVudCgic2V0IHVzZXIgcmVzdHJpY3Rpb24iLCBldmVudHMsIFRBR19VU0VSX1JFU1RSSUNUSU9OX0FEREVEKTsKKyAgICAgICAgZmluZFVzZXJSZXN0cmljdGlvbkV2ZW50KCJjbGVhciB1c2VyIHJlc3RyaWN0aW9uIiwgZXZlbnRzLCBUQUdfVVNFUl9SRVNUUklDVElPTl9SRU1PVkVEKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZmluZFVzZXJSZXN0cmljdGlvbkV2ZW50KFN0cmluZyBkZXNjcmlwdGlvbiwgTGlzdDxTZWN1cml0eUV2ZW50PiBldmVudHMsIGludCB0YWcpIHsKKyAgICAgICAgZmluYWwgaW50IHVzZXJJZCA9IFByb2Nlc3MubXlVc2VySGFuZGxlKCkuZ2V0SWRlbnRpZmllcigpOworICAgICAgICBmaW5kRXZlbnQoZGVzY3JpcHRpb24sIGV2ZW50cywKKyAgICAgICAgICAgICAgICBlIC0+IGUuZ2V0VGFnKCkgPT0gdGFnICYmCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRTdHJpbmcoZSwgQURNSU5fUEtHX0lOREVYKS5lcXVhbHMoZ2V0V2hvKCkuZ2V0UGFja2FnZU5hbWUoKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldEludChlLCBBRE1JTl9VU0VSX0lOREVYKSA9PSB1c2VySWQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJNYW5hZ2VyLkRJU0FMTE9XX0ZVTi5lcXVhbHMoZ2V0U3RyaW5nKGUsIFVTRVJfUkVTVFJJQ1RJT05fSU5ERVgpKSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlb3duZXIvU2V0UG9saWN5QWN0aXZpdHkuamF2YSBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZW93bmVyL1NldFBvbGljeUFjdGl2aXR5LmphdmEKaW5kZXggMDI4YmYyZS4uNTE0YjllOCAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlb3duZXIvU2V0UG9saWN5QWN0aXZpdHkuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vvd25lci9TZXRQb2xpY3lBY3Rpdml0eS5qYXZhCkBAIC02Myw3ICs2Myw3IEBACiAgICAgICAgICAgICAgICAgZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkRFVklDRV9QT0xJQ1lfU0VSVklDRSk7CiAgICAgICAgIFN0cmluZyBjb21tYW5kID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKEVYVFJBX0NPTU1BTkQpOwogICAgICAgICBMb2cuaShUQUcsICJDb21tYW5kOiBcIiIgKyBjb21tYW5kKTsKLSAgICAgICAgQ29tcG9uZW50TmFtZSBhZG1pbiA9IEJhc2VEZXZpY2VPd25lclRlc3QuZ2V0V2hvKCk7CisgICAgICAgIENvbXBvbmVudE5hbWUgYWRtaW4gPSBCYXNpY0FkbWluUmVjZWl2ZXIuZ2V0Q29tcG9uZW50TmFtZSh0aGlzKTsKICAgICAgICAgaWYgKEFERF9SRVNUUklDVElPTl9DT01NQU5ELmVxdWFscyhjb21tYW5kKSkgewogICAgICAgICAgICAgU3RyaW5nIHJlc3RyaWN0aW9uS2V5ID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKEVYVFJBX1JFU1RSSUNUSU9OX0tFWSk7CiAgICAgICAgICAgICBkcG0uYWRkVXNlclJlc3RyaWN0aW9uKGFkbWluLCByZXN0cmljdGlvbktleSk7CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vvd25lci9TZXRUaW1lVGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlb3duZXIvU2V0VGltZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2YxNDJmCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlb3duZXIvU2V0VGltZVRlc3QuamF2YQpAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5kZXZpY2Vvd25lcjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLmFkbWluLkRldmljZVBvbGljeU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOworCitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOworaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworLyoqCisgKiBUZXN0IHtAbGluayBEZXZpY2VQb2xpY3lNYW5hZ2VyI3NldFRpbWV9IGFuZCBAbGluayB7RGV2aWNlUG9saWN5TWFuYWdlciNzZXRUaW1lWm9uZX0KKyAqLworcHVibGljIGNsYXNzIFNldFRpbWVUZXN0IGV4dGVuZHMgQmFzZURldmljZU93bmVyVGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFRFU1RfVElNRV8xID0gMTAwMDAwMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBURVNUX1RJTUVfMiA9IDEwMDAwMDAwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9USU1FX1pPTkVfMSA9ICJBbWVyaWNhL05ld19Zb3JrIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9USU1FX1pPTkVfMiA9ICJBbWVyaWNhL0xvc19BbmdlbGVzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFRJTUVPVVRfU0VDID0gNjA7CisKKyAgICAvLyBSZWFsIHdvcmxkIHRpbWUgdG8gcmVzdG9yZSBhZnRlciB0aGUgdGVzdC4KKyAgICBwcml2YXRlIGxvbmcgbVN0YXJ0VGltZVdhbGxDbG9ja01pbGxpczsKKyAgICAvLyBFbGFwc2VkIHRpbWUgdG8gbWVhc3VyZSB0aW1lIHRha2VuIGJ5IHRoZSB0ZXN0LgorICAgIHByaXZhdGUgbG9uZyBtU3RhcnRUaW1lRWxhcHNlZE5hbm9zOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgc2F2ZVRpbWUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZXN0b3JlVGltZSgpOworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0U2V0VGltZVdpdGhWYWx1ZShsb25nIHRlc3RUaW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgICAgIEJyb2FkY2FzdFJlY2VpdmVyIHJlY2VpdmVyID0gbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICAgICAgbGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIG1Db250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIocmVjZWl2ZXIsIG5ldyBJbnRlbnRGaWx0ZXIoSW50ZW50LkFDVElPTl9USU1FX0NIQU5HRUQpKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIHNldCB0aW1lIiwgbURldmljZVBvbGljeU1hbmFnZXIuc2V0VGltZShnZXRXaG8oKSwgdGVzdFRpbWUpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoInRpbWVkIG91dCB3YWl0aW5nIGZvciB0aW1lIGNoYW5nZSBicm9hZGNhc3QiLAorICAgICAgICAgICAgICAgIGxhdGNoLmF3YWl0KFRJTUVPVVRfU0VDLCBUaW1lVW5pdC5TRUNPTkRTKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJ0aW1lIGlzIGRpZmZlcmVudCBmcm9tIHdoYXQgd2FzIHNldCIsCisgICAgICAgICAgICAgICAgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgPD0gdGVzdFRpbWUgKyAoVElNRU9VVF9TRUMgKyAxKSAqIDEwMDApOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgbUNvbnRleHQudW5yZWdpc3RlclJlY2VpdmVyKHJlY2VpdmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRUaW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnNldEdsb2JhbFNldHRpbmcoZ2V0V2hvKCksIFNldHRpbmdzLkdsb2JhbC5BVVRPX1RJTUUsICIwIik7CisgICAgICAgIHRlc3RTZXRUaW1lV2l0aFZhbHVlKFRFU1RfVElNRV8xKTsKKyAgICAgICAgdGVzdFNldFRpbWVXaXRoVmFsdWUoVEVTVF9USU1FXzIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRUaW1lRmFpbFdpdGhBdXRvVGltZU9uKCkgeworICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5zZXRHbG9iYWxTZXR0aW5nKGdldFdobygpLCBTZXR0aW5ncy5HbG9iYWwuQVVUT19USU1FLCAiMSIpOworICAgICAgICBhc3NlcnRGYWxzZShtRGV2aWNlUG9saWN5TWFuYWdlci5zZXRUaW1lKGdldFdobygpLCBURVNUX1RJTUVfMSkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0U2V0VGltZVpvbmVXaXRoVmFsdWUoU3RyaW5nIHRlc3RUaW1lWm9uZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworICAgICAgICBmaW5hbCBCcm9hZGNhc3RSZWNlaXZlciByZWNlaXZlciA9IG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgICAgIGlmICh0ZXN0VGltZVpvbmUuZXF1YWxzKGludGVudC5nZXRTdHJpbmdFeHRyYSgidGltZS16b25lIikpKSB7CisgICAgICAgICAgICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihyZWNlaXZlciwgbmV3IEludGVudEZpbHRlcihJbnRlbnQuQUNUSU9OX1RJTUVaT05FX0NIQU5HRUQpKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIHNldCB0aW1lem9uZSIsCisgICAgICAgICAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuc2V0VGltZVpvbmUoZ2V0V2hvKCksIHRlc3RUaW1lWm9uZSkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgidGltZWQgb3V0IHdhaXRpbmcgZm9yIHRpbWV6b25lIGNoYW5nZSBicm9hZGNhc3QiLAorICAgICAgICAgICAgICAgIGxhdGNoLmF3YWl0KFRJTUVPVVRfU0VDLCBUaW1lVW5pdC5TRUNPTkRTKSk7CisKKyAgICAgICAgICAgIC8vIFRoZXJlIG1pZ2h0IGJlIGEgZGVsYXkgaW4gdGltZXpvbmUgc2V0dGluZyBwcm9wYWdhdGlvbiwgc28gd2UgcmV0cnkgZm9yIDUgc2Vjb25kcy4KKyAgICAgICAgICAgIGludCByZXRyaWVzID0gMDsKKyAgICAgICAgICAgIHdoaWxlICghdGVzdFRpbWVab25lLmVxdWFscyhUaW1lWm9uZS5nZXREZWZhdWx0KCkuZ2V0SUQoKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAocmV0cmllcysrID4gNSkgeworICAgICAgICAgICAgICAgICAgICBmYWlsKCJ0aW1lem9uZSB3YXNuJ3QgdXBkYXRlZCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBtQ29udGV4dC51bnJlZ2lzdGVyUmVjZWl2ZXIocmVjZWl2ZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNldFRpbWVab25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnNldEdsb2JhbFNldHRpbmcoZ2V0V2hvKCksIFNldHRpbmdzLkdsb2JhbC5BVVRPX1RJTUVfWk9ORSwgIjAiKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSWYgd2UgYXJlIGFscmVhZHkgaW4gdGVzdCB0aW1lIHpvbmUsIHVzZSBhbm90aGVyIG9uZSBmaXJzdC4KKyAgICAgICAgICAgIGlmIChURVNUX1RJTUVfWk9ORV8xLmVxdWFscyhUaW1lWm9uZS5nZXREZWZhdWx0KCkuZ2V0SUQoKSkpIHsKKyAgICAgICAgICAgICAgICB0ZXN0U2V0VGltZVpvbmVXaXRoVmFsdWUoVEVTVF9USU1FX1pPTkVfMik7CisgICAgICAgICAgICAgICAgdGVzdFNldFRpbWVab25lV2l0aFZhbHVlKFRFU1RfVElNRV9aT05FXzEpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0ZXN0U2V0VGltZVpvbmVXaXRoVmFsdWUoVEVTVF9USU1FX1pPTkVfMSk7CisgICAgICAgICAgICAgICAgdGVzdFNldFRpbWVab25lV2l0aFZhbHVlKFRFU1RfVElNRV9aT05FXzIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuc2V0R2xvYmFsU2V0dGluZyhnZXRXaG8oKSwgU2V0dGluZ3MuR2xvYmFsLkFVVE9fVElNRV9aT05FLCAiMSIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNldFRpbWVab25lRmFpbFdpdGhBdXRvVGltZXpvbmVPbigpIHsKKyAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuc2V0R2xvYmFsU2V0dGluZyhnZXRXaG8oKSwgU2V0dGluZ3MuR2xvYmFsLkFVVE9fVElNRV9aT05FLCAiMSIpOworICAgICAgICBhc3NlcnRGYWxzZShtRGV2aWNlUG9saWN5TWFuYWdlci5zZXRUaW1lWm9uZShnZXRXaG8oKSwgVEVTVF9USU1FX1pPTkVfMSkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzYXZlVGltZSgpIHsKKyAgICAgICAgbVN0YXJ0VGltZVdhbGxDbG9ja01pbGxpcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBtU3RhcnRUaW1lRWxhcHNlZE5hbm9zID0gU3lzdGVtLm5hbm9UaW1lKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlc3RvcmVUaW1lKCkgeworICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5zZXRHbG9iYWxTZXR0aW5nKGdldFdobygpLCBTZXR0aW5ncy5HbG9iYWwuQVVUT19USU1FLCAiMCIpOworCisgICAgICAgIGZpbmFsIGxvbmcgZXN0aW1hdGVkTm93ID0gbVN0YXJ0VGltZVdhbGxDbG9ja01pbGxpcyArCisgICAgICAgICAgICAgICAgVGltZVVuaXQuTkFOT1NFQ09ORFMudG9NaWxsaXMoU3lzdGVtLm5hbm9UaW1lKCkgLSBtU3RhcnRUaW1lRWxhcHNlZE5hbm9zKTsKKyAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuc2V0VGltZShnZXRXaG8oKSwgZXN0aW1hdGVkTm93KTsKKworICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5zZXRHbG9iYWxTZXR0aW5nKGdldFdobygpLCBTZXR0aW5ncy5HbG9iYWwuQVVUT19USU1FLCAiMSIpOworCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlb3duZXIvU3lzdGVtVXBkYXRlUG9saWN5VGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlb3duZXIvU3lzdGVtVXBkYXRlUG9saWN5VGVzdC5qYXZhCmluZGV4IDU4ZTdlZjYuLmU1NTk4YmIgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZW93bmVyL1N5c3RlbVVwZGF0ZVBvbGljeVRlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vvd25lci9TeXN0ZW1VcGRhdGVQb2xpY3lUZXN0LmphdmEKQEAgLTE1LDE2ICsxNSwzMCBAQAogICovCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5kZXZpY2Vvd25lcjsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQXBpTGV2ZWxVdGlsOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLkdsb2JhbC5BSVJQTEFORV9NT0RFX09OOwogCiBpbXBvcnQgYW5kcm9pZC5hcHAuYWRtaW4uRGV2aWNlUG9saWN5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5hZG1pbi5GcmVlemVQZXJpb2Q7CiBpbXBvcnQgYW5kcm9pZC5hcHAuYWRtaW4uU3lzdGVtVXBkYXRlUG9saWN5OworaW1wb3J0IGFuZHJvaWQuYXBwLmFkbWluLlN5c3RlbVVwZGF0ZVBvbGljeS5WYWxpZGF0aW9uRmFpbGVkRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKK2ltcG9ydCBhbmRyb2lkLmljdS51dGlsLkNhbGVuZGFyOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5HbG9iYWw7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuUGFpcjsKIAoraW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5HbG9iYWw7CisKK2ltcG9ydCBqYXZhLnRpbWUuTG9jYWxEYXRlOworaW1wb3J0IGphdmEudGltZS5Nb250aERheTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNlbWFwaG9yZTsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKIApAQCAtMzQsNzAgKzQ4LDg3IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBTeXN0ZW1VcGRhdGVQb2xpY3lUZXN0IGV4dGVuZHMgQmFzZURldmljZU93bmVyVGVzdCB7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlN5c3RlbVVwZGF0ZVBvbGljeVRlc3QiOworCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRJTUVPVVRfTVMgPSAyMF8wMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRJTUVPVVRfU0VDID0gNTsKIAogICAgIHByaXZhdGUgZmluYWwgU2VtYXBob3JlIG1Qb2xpY3lDaGFuZ2VkU2VtYXBob3JlID0gbmV3IFNlbWFwaG9yZSgwKTsKKyAgICBwcml2YXRlIGZpbmFsIFNlbWFwaG9yZSBtVGltZUNoYW5nZWRTZW1hcGhvcmUgPSBuZXcgU2VtYXBob3JlKDApOwogICAgIHByaXZhdGUgZmluYWwgQnJvYWRjYXN0UmVjZWl2ZXIgcG9saWN5Q2hhbmdlZFJlY2VpdmVyID0gbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgewogICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgYXJnMCwgSW50ZW50IGFyZzEpIHsKLSAgICAgICAgICAgIG1Qb2xpY3lDaGFuZ2VkU2VtYXBob3JlLnJlbGVhc2UoKTsKKyAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGFjdGlvbiA9IGludGVudC5nZXRBY3Rpb24oKTsKKyAgICAgICAgICAgIGlmIChEZXZpY2VQb2xpY3lNYW5hZ2VyLkFDVElPTl9TWVNURU1fVVBEQVRFX1BPTElDWV9DSEFOR0VELmVxdWFscyhhY3Rpb24pKSB7CisgICAgICAgICAgICAgICAgbVBvbGljeUNoYW5nZWRTZW1hcGhvcmUucmVsZWFzZSgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChJbnRlbnQuQUNUSU9OX1RJTUVfQ0hBTkdFRC5lcXVhbHMoYWN0aW9uKSkgeworICAgICAgICAgICAgICAgIG1UaW1lQ2hhbmdlZFNlbWFwaG9yZS5yZWxlYXNlKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9OwotICAgIHByaXZhdGUgYm9vbGVhbiBtSGFzRmVhdHVyZTsKKworICAgIHByaXZhdGUgaW50IG1TYXZlZEF1dG9UaW1lQ29uZmlnOworICAgIHByaXZhdGUgTG9jYWxEYXRlIG1TYXZlZFN5c3RlbURhdGU7CisgICAgcHJpdmF0ZSBib29sZWFuIG1SZXN0b3JlRGF0ZTsKKyAgICBwcml2YXRlIGludCBtU2F2ZWRBaXJwbGFuZU1vZGU7CiAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBtSGFzRmVhdHVyZSA9IEFwaUxldmVsVXRpbC5pc0FmdGVyKEJ1aWxkLlZFUlNJT05fQ09ERVMuTE9MTElQT1BfTVIxKTsKLQotICAgICAgICBpZiAobUhhc0ZlYXR1cmUpIHsKLSAgICAgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7Ci0gICAgICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKERldmljZVBvbGljeU1hbmFnZXIuQUNUSU9OX1NZU1RFTV9VUERBVEVfUE9MSUNZX0NIQU5HRUQpOwotICAgICAgICAgICAgbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihwb2xpY3lDaGFuZ2VkUmVjZWl2ZXIsIGZpbHRlcik7CisgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oRGV2aWNlUG9saWN5TWFuYWdlci5BQ1RJT05fU1lTVEVNX1VQREFURV9QT0xJQ1lfQ0hBTkdFRCk7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9USU1FX0NIQU5HRUQpOworICAgICAgICBtQ29udGV4dC5yZWdpc3RlclJlY2VpdmVyKHBvbGljeUNoYW5nZWRSZWNlaXZlciwgZmlsdGVyKTsKKyAgICAgICAgY2xlYXJGcmVlemVSZWNvcmQoKTsKKyAgICAgICAgbVNhdmVkQXV0b1RpbWVDb25maWcgPSBTZXR0aW5ncy5HbG9iYWwuZ2V0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgIEdsb2JhbC5BVVRPX1RJTUUsIDApOworICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKCJzZXR0aW5ncyBwdXQgZ2xvYmFsIGF1dG9fdGltZSAwIik7CisgICAgICAgIG1TYXZlZFN5c3RlbURhdGUgPSBMb2NhbERhdGUubm93KCk7CisgICAgICAgIG1SZXN0b3JlRGF0ZSA9IGZhbHNlOworICAgICAgICBtU2F2ZWRBaXJwbGFuZU1vZGUgPSBnZXRBaXJwbGFuZU1vZGUoKTsKKyAgICAgICAgTG9nLmkoVEFHLCAiQmVmb3JlIHRlc3RpbmcsIEFJUlBMQU5FX01PREUgaXMgc2V0IHRvOiAiICsgbVNhdmVkQWlycGxhbmVNb2RlKTsKKyAgICAgICAgaWYgKG1TYXZlZEFpcnBsYW5lTW9kZSA9PSAwKSB7CisgICAgICAgICAgICAvLyBObyBuZWVkIHRvIHNldCBtb2RlIGlmIEFpcnBsYW5lTW9kZSBpcyAxIG9yIGVycm9yLgorICAgICAgICAgICAgc2V0QWlycGxhbmVNb2RlQW5kV2FpdEJyb2FkY2FzdCgxKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChtSGFzRmVhdHVyZSkgewotICAgICAgICAgICAgbUNvbnRleHQudW5yZWdpc3RlclJlY2VpdmVyKHBvbGljeUNoYW5nZWRSZWNlaXZlcik7Ci0gICAgICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5zZXRTeXN0ZW1VcGRhdGVQb2xpY3koZ2V0V2hvKCksIG51bGwpOworICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5zZXRTeXN0ZW1VcGRhdGVQb2xpY3koZ2V0V2hvKCksIG51bGwpOworICAgICAgICBjbGVhckZyZWV6ZVJlY29yZCgpOworICAgICAgICBpZiAobVJlc3RvcmVEYXRlKSB7CisgICAgICAgICAgICBzZXRTeXN0ZW1EYXRlKG1TYXZlZFN5c3RlbURhdGUpOworICAgICAgICB9CisgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoInNldHRpbmdzIHB1dCBnbG9iYWwgYXV0b190aW1lIiwKKyAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG1TYXZlZEF1dG9UaW1lQ29uZmlnKSk7CisgICAgICAgIC8vIFRoaXMgbmVlZHMgdG8gaGFwcGVuIGxhc3Qgc2luY2Ugc2V0U3lzdGVtRGF0ZSgpIHJlbGllcyBvbiB0aGUgcmVjZWl2ZXIgZm9yCisgICAgICAgIC8vIHN5bmNocm9uaXphdGlvbi4KKyAgICAgICAgbUNvbnRleHQudW5yZWdpc3RlclJlY2VpdmVyKHBvbGljeUNoYW5nZWRSZWNlaXZlcik7CisgICAgICAgIGlmIChtU2F2ZWRBaXJwbGFuZU1vZGUgPT0gMCkgeworICAgICAgICAgICAgLy8gUmVzdG9yZSBBaXJwbGFuZU1vZGUgdmFsdWUuCisgICAgICAgICAgICBzZXRBaXJwbGFuZU1vZGVBbmRXYWl0QnJvYWRjYXN0KDApOwogICAgICAgICB9CiAgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdFNldEVtcHR5dEluc3RhbGxQb2xpY3koKSB7Ci0gICAgICAgIGlmICghbUhhc0ZlYXR1cmUpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQogICAgICAgICB0ZXN0UG9saWN5KG51bGwpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRBdXRvbWF0aWNJbnN0YWxsUG9saWN5KCkgewotICAgICAgICBpZiAoIW1IYXNGZWF0dXJlKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KICAgICAgICAgdGVzdFBvbGljeShTeXN0ZW1VcGRhdGVQb2xpY3kuY3JlYXRlQXV0b21hdGljSW5zdGFsbFBvbGljeSgpKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0V2luZG93ZWRJbnN0YWxsUG9saWN5KCkgewotICAgICAgICBpZiAoIW1IYXNGZWF0dXJlKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KICAgICAgICAgdGVzdFBvbGljeShTeXN0ZW1VcGRhdGVQb2xpY3kuY3JlYXRlV2luZG93ZWRJbnN0YWxsUG9saWN5KDAsIDcyMCkpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRQb3N0cG9uZUluc3RhbGxQb2xpY3koKSB7Ci0gICAgICAgIGlmICghbUhhc0ZlYXR1cmUpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQogICAgICAgICB0ZXN0UG9saWN5KFN5c3RlbVVwZGF0ZVBvbGljeS5jcmVhdGVQb3N0cG9uZUluc3RhbGxQb2xpY3koKSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdFNob3VsZEZhaWxJbnZhbGlkV2luZG93UG9saWN5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghbUhhc0ZlYXR1cmUpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQogICAgICAgICB0cnkgewogICAgICAgICAgICAgU3lzdGVtVXBkYXRlUG9saWN5LmNyZWF0ZVdpbmRvd2VkSW5zdGFsbFBvbGljeSgyNCAqIDYwICsgMSwgNzIwKTsKICAgICAgICAgICAgIGZhaWwoIkludmFsaWQgd2luZG93IHN0YXJ0IHNob3VsZCBub3QgYmUgYWNjZXB0ZWQuIik7CkBAIC0xMTYsOSArMTQ3LDExNyBAQAogICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhwZWN0ZWQpIHsgfQogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHRlc3RGcmVlemVQZXJpb2RWYWxpZGF0aW9uKCkgeworICAgICAgICAvLyBEYXRlcyBhcmUgaW4gTU0tREQgZm9ybWF0CisgICAgICAgIHZhbGlkYXRlRnJlZXplUGVyaW9kc1N1Y2NlZWRzKCIwMS0wMSIsICIwMS0wMiIpOworICAgICAgICB2YWxpZGF0ZUZyZWV6ZVBlcmlvZHNTdWNjZWVkcygiMDEtMzEiLCAiMDEtMzEiKTsKKyAgICAgICAgdmFsaWRhdGVGcmVlemVQZXJpb2RzU3VjY2VlZHMoIjExLTAxIiwgIjAxLTE1Iik7CisgICAgICAgIHZhbGlkYXRlRnJlZXplUGVyaW9kc1N1Y2NlZWRzKCIwMi0wMSIsICIwMi0yOSIpOworICAgICAgICB2YWxpZGF0ZUZyZWV6ZVBlcmlvZHNTdWNjZWVkcygiMDMtMDEiLCAiMDMtMzEiLCAiMDktMDEiLCAiMDktMzAiKTsKKyAgICAgICAgdmFsaWRhdGVGcmVlemVQZXJpb2RzU3VjY2VlZHMoIjEwLTAxIiwgIjEwLTMxIiwgIjEyLTMxIiwgIjAxLTMxIik7CisgICAgICAgIHZhbGlkYXRlRnJlZXplUGVyaW9kc1N1Y2NlZWRzKCIwMS0wMSIsICIwMi0yOCIsICIwNS0wMSIsICIwNi0zMCIsICIwOS0wMSIsICIxMC0zMSIpOworICAgICAgICB2YWxpZGF0ZUZyZWV6ZVBlcmlvZHNTdWNjZWVkcygiMTEtMDIiLCAiMDEtMTUiLCAiMDMtMTgiLCAiMDQtMzAiLCAiMDgtMDEiLCAiMDgtMzAiKTsKKworICAgICAgICAvLyBmdWxsIG92ZXJsYXAKKyAgICAgICAgdmFsaWRhdGVGcmVlemVQZXJpb2RzRmFpbHNPdmVybGFwKCIxMi0wMSIsICIwMS0zMSIsICIxMi0yNSIsICIwMS0xNSIpOworICAgICAgICAvLyBwYXJ0aWFsIG92ZXJsYXAKKyAgICAgICAgdmFsaWRhdGVGcmVlemVQZXJpb2RzRmFpbHNPdmVybGFwKCIwMy0wMSIsICIwMy0zMSIsICIwMy0xNSIsICIwMS0wMSIpOworICAgICAgICAvLyB0b3VjaGluZyBpbnRlcnZhbAorICAgICAgICB2YWxpZGF0ZUZyZWV6ZVBlcmlvZHNGYWlsc092ZXJsYXAoIjAxLTMxIiwgIjAxLTMxIiwgIjAyLTAxIiwgIjAyLTAxIik7CisgICAgICAgIHZhbGlkYXRlRnJlZXplUGVyaW9kc0ZhaWxzT3ZlcmxhcCgiMTItMDEiLCAiMTItMzEiLCAiMDQtMDEiLCAiMDQtMDEiLCAiMDEtMDEiLCAiMDEtMzAiKTsKKworICAgICAgICAvLyBlbnRpcmUgeWVhcgorICAgICAgICB2YWxpZGF0ZUZyZWV6ZVBlcmlvZHNGYWlsc1Rvb0xvbmcoIjAxLTAxIiwgIjEyLTMxIik7CisgICAgICAgIC8vIFJlZ3VsYXIgbG9uZyBwZXJpb2QKKyAgICAgICAgdmFsaWRhdGVGcmVlemVQZXJpb2RzU3VjY2VlZHMoIjAxLTAxIiwgIjAzLTMxIiwgIjA2LTAxIiwgIjA4LTI5Iik7CisgICAgICAgIHZhbGlkYXRlRnJlZXplUGVyaW9kc0ZhaWxzVG9vTG9uZygiMDEtMDEiLCAiMDMtMzEiLCAiMDYtMDEiLCAiMDgtMzAiKTsKKyAgICAgICAgLy8gbG9uZyBwZXJpb2Qgc3Bhbm5pbmcgYWNyb3NzIHllYXIgZW5kCisgICAgICAgIHZhbGlkYXRlRnJlZXplUGVyaW9kc1N1Y2NlZWRzKCIxMS0wMSIsICIwMS0yOSIpOworICAgICAgICB2YWxpZGF0ZUZyZWV6ZVBlcmlvZHNGYWlsc1Rvb0xvbmcoIjExLTAxIiwgIjAxLTMwIik7CisgICAgICAgIC8vIExlYXAgeWVhciBoYW5kbGluZworICAgICAgICB2YWxpZGF0ZUZyZWV6ZVBlcmlvZHNTdWNjZWVkcygiMTItMDEiLCAiMDItMjgiKTsKKyAgICAgICAgdmFsaWRhdGVGcmVlemVQZXJpb2RzRmFpbHNUb29Mb25nKCIxMi0wMSIsICIwMy0wMSIpOworCisgICAgICAgIC8vIFJlZ3VsYXIgc2hvcnQgc2VwYXJhdGlvbgorICAgICAgICB2YWxpZGF0ZUZyZWV6ZVBlcmlvZHNGYWlsc1Rvb0Nsb3NlKCAiMDEtMDEiLCAiMDEtMDEiLCAiMDEtMDMiLCAiMDEtMDMiKTsKKyAgICAgICAgLy8gU2hvcnQgaW50ZXJ2YWwgc3BhbnMgYWNyb3NzIGVuZCBvZiB5ZWFyCisgICAgICAgIHZhbGlkYXRlRnJlZXplUGVyaW9kc1N1Y2NlZWRzKCIwMS0zMSIsICIwMy0wMSIsICIxMS0wMSIsICIxMi0wMSIpOworICAgICAgICB2YWxpZGF0ZUZyZWV6ZVBlcmlvZHNGYWlsc1Rvb0Nsb3NlKCIwMS0zMCIsICIwMy0wMSIsICIxMS0wMSIsICIxMi0wMSIpOworICAgICAgICAvLyBTaG9ydCBzZXBhcmF0aW9uIGlzIGFmdGVyIHdyYXBwZWQgcGVyaW9kCisgICAgICAgIHZhbGlkYXRlRnJlZXplUGVyaW9kc1N1Y2NlZWRzKCIwMy0wMyIsICIwMy0zMSIsICIxMi0zMSIsICIwMS0wMSIpOworICAgICAgICB2YWxpZGF0ZUZyZWV6ZVBlcmlvZHNGYWlsc1Rvb0Nsb3NlKCIwMy0wMiIsICIwMy0zMSIsICIxMi0zMSIsICIwMS0wMSIpOworICAgICAgICAvLyBTaG9ydCBzZXBhcmF0aW9uIGluY2x1ZGluZyBGZWIgMjkKKyAgICAgICAgdmFsaWRhdGVGcmVlemVQZXJpb2RzU3VjY2VlZHMoIjEyLTAxIiwgIjAxLTE1IiwgIjAzLTE3IiwgIjA0LTAxIik7CisgICAgICAgIHZhbGlkYXRlRnJlZXplUGVyaW9kc0ZhaWxzVG9vQ2xvc2UoIjEyLTAxIiwgIjAxLTE1IiwgIjAzLTE2IiwgIjA0LTAxIik7CisgICAgICAgIC8vIFNob3J0IHNlcGFyYXRpb24gaW5jbHVkaW5nIEZlYiAyOQorICAgICAgICB2YWxpZGF0ZUZyZWV6ZVBlcmlvZHNTdWNjZWVkcygiMDEtMDEiLCAiMDItMjgiLCAiMDQtMzAiLCAiMDYtMDEiKTsKKyAgICAgICAgdmFsaWRhdGVGcmVlemVQZXJpb2RzU3VjY2VlZHMoIjAxLTAxIiwgIjAyLTI5IiwgIjA0LTMwIiwgIjA2LTAxIik7CisgICAgICAgIHZhbGlkYXRlRnJlZXplUGVyaW9kc0ZhaWxzVG9vQ2xvc2UoIjAxLTAxIiwgIjAzLTAxIiwgIjA0LTMwIiwgIjA2LTAxIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZyZWV6ZVBlcmlvZENhbkJlU2V0QW5kQ2hhbmdlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzZXRQb2xpY3lXaXRoRnJlZXplUGVyaW9kKCIxMS0wMiIsICIwMS0xNSIsICIwMy0xOCIsICIwNC0zMCIpOworICAgICAgICAvLyBTZXQgdG8gYSBkaWZmZXJlbnQgcGVyaW9kIHNob3VsZCB3b3JrCisgICAgICAgIHNldFBvbGljeVdpdGhGcmVlemVQZXJpb2QoIjA4LTAxIiwgIjA4LTMwIik7CisgICAgICAgIC8vIENsZWFyIGZyZWV6ZSBwZXJpb2Qgc2hvdWxkIHdvcmsKKyAgICAgICAgc2V0UG9saWN5V2l0aEZyZWV6ZVBlcmlvZCgpOworICAgICAgICAvLyBTZXQgdG8gdGhlIG9yaWdpbmFsIHBlcmlvZCBzaG91bGQgd29yaworICAgICAgICBzZXRQb2xpY3lXaXRoRnJlZXplUGVyaW9kKCIxMS0wMiIsICIwMS0xNSIsICIwMy0xOCIsICIwNC0zMCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGcmVlemVQZXJpb2RDYW5ub3RTZXRJZlRvb0Nsb3NlVG9QcmV2aW91cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzZXRTeXN0ZW1EYXRlKExvY2FsRGF0ZS5vZigyMDE4LCAyLCAyOCkpOworICAgICAgICBzZXRQb2xpY3lXaXRoRnJlZXplUGVyaW9kKCIwMS0wMSIsICIwMy0wMSIsICIwNi0wMSIsICIwNi0zMCIpOworICAgICAgICAvLyBDbGVhciBwb2xpY3kKKyAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuc2V0U3lzdGVtVXBkYXRlUG9saWN5KGdldFdobygpLCBudWxsKTsKKyAgICAgICAgLy8gU2V0IHRvIGEgY29uZmxpY3QgcGVyaW9kICh0b28gY2xvc2Ugd2l0aCBwcmV2aW91cyBwZXJpb2QgWzItMjgsIDItMjhdKSBzaG91bGQgZmFpbCwKKyAgICAgICAgLy8gZGVzcGl0ZSB0aGUgcHJldmlvdXMgcG9saWN5IHdhcyBjbGVhcmVkIGZyb20gdGhlIHN5c3RlbSBqdXN0IG5vdy4KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNldFBvbGljeVdpdGhGcmVlemVQZXJpb2QoIjA0LTI5IiwgIjA0LTMwIik7CisgICAgICAgICAgICBmYWlsKCJEaWQgbm8gZmxhZyBpbnZhbGlkIHBlcmlvZCIpOworICAgICAgICB9IGNhdGNoIChWYWxpZGF0aW9uRmFpbGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhlLmdldE1lc3NhZ2UoKSwKKyAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvbkZhaWxlZEV4Y2VwdGlvbi5FUlJPUl9DT01CSU5FRF9GUkVFWkVfUEVSSU9EX1RPT19DTE9TRSwKKyAgICAgICAgICAgICAgICAgICAgZS5nZXRFcnJvckNvZGUoKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gVGhpcyBzaG91bGQgc3VjY2VlZCBhcyB0aGUgbmV3IGZyZWV6ZSBwZXJpb2QgaXMgZXhhY3RseSA2MCBkYXlzIGF3YXkuCisgICAgICAgIHNldFBvbGljeVdpdGhGcmVlemVQZXJpb2QoIjA0LTMwIiwgIjA0LTMwIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZyZWV6ZVBlcmlvZENhbm5vdFNldElmVG9vTG9uZ1doZW5Db21iaW5lZFdpdGhQcmV2aW91cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzZXRTeXN0ZW1EYXRlKExvY2FsRGF0ZS5vZigyMDEyLCA0LCAxKSk7CisgICAgICAgIHNldFBvbGljeVdpdGhGcmVlemVQZXJpb2QoIjAzLTAxIiwgIjA1LTAxIik7CisgICAgICAgIHNldFN5c3RlbURhdGUoTG9jYWxEYXRlLm9mKDIwMTIsIDQsIDMwKSk7CisgICAgICAgIC8vIERlc3BpdGUgdGhlIHdhaXQgZm9yIGJyb2FkY2FzdCBpbiBzZXRTeXN0ZW1EYXRlKCksIFRJTUVfQ0hBTkdFRCBicm9hZGNhc3QgaXMgYXN5bmNocm9ub3VzCisgICAgICAgIC8vIHNvIGdpdmUgRGV2aWNlUG9saWN5TWFuYWdlclNlcnZpY2UgbW9yZSB0aW1lIHRvIHJlY2VpdmUgVElNRV9DSEFOR0VEIGFuZCB0byB1cGRhdGUgdGhlCisgICAgICAgIC8vIGZyZWV6ZSBwZXJpb2QgcmVjb3JkLgorICAgICAgICBUaHJlYWQuc2xlZXAoNTAwMCk7CisgICAgICAgIC8vIFNldCB0byBhIGNvbmZsaWN0IHBlcmlvZCAodG9vIGxvbmcgd2hlbiBjb21iaW5lZCB3aXRoIHByZXZpb3VzIHBlcmlvZCBbMDQtMDEsIDA0LTMwXSkKKyAgICAgICAgLy8gc2hvdWxkIGZhaWwKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNldFBvbGljeVdpdGhGcmVlemVQZXJpb2QoIjA0LTMwIiwgIjA2LTMwIik7CisgICAgICAgICAgICBmYWlsKCJEaWQgbm8gZmxhZyBpbnZhbGlkIHBlcmlvZCIpOworICAgICAgICB9IGNhdGNoIChTeXN0ZW1VcGRhdGVQb2xpY3kuVmFsaWRhdGlvbkZhaWxlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZS5nZXRNZXNzYWdlKCksCisgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25GYWlsZWRFeGNlcHRpb24uRVJST1JfQ09NQklORURfRlJFRVpFX1BFUklPRF9UT09fTE9ORywKKyAgICAgICAgICAgICAgICAgICAgZS5nZXRFcnJvckNvZGUoKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gVGhpcyBzaG91bGQgc3VjY2VlZCBhcyB0aGUgY29tYmluZWQgbGVuZ3RoICg1OSBkYXlzKSBpcyBqdXN0IGJlbG93IHRocmVzaG9sZCAoOTAgZGF5cykuCisgICAgICAgIHNldFBvbGljeVdpdGhGcmVlemVQZXJpb2QoIjA1LTAxIiwgIjA2LTI5Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZyZWV6ZVBlcmlvZEZvck9uZVllYXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gU2V0IGEgbm9ybWFsIHBlcmlvZCBldmVyeSBkYXkgZm9yIDM2NSBkYXlzCisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IDM2NTsgaSsrKSB7CisgICAgICAgICAgICAvLyBBZGQgdHdvIGRheXMgc28gdGhlIHRlc3QgZGF0ZSByYW5nZSB3cmFwcyBhcm91bmQgeWVhci1lbmQKKyAgICAgICAgICAgIHNldFN5c3RlbURhdGUoTG9jYWxEYXRlLm9mWWVhckRheSgyMDE5LCBpKS5wbHVzRGF5cygyKSk7CisgICAgICAgICAgICB0ZXN0RnJlZXplUGVyaW9kQ2FuQmVTZXRBbmRDaGFuZ2VkKCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgdGVzdFBvbGljeShTeXN0ZW1VcGRhdGVQb2xpY3kgcG9saWN5KSB7CiAgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnNldFN5c3RlbVVwZGF0ZVBvbGljeShnZXRXaG8oKSwgcG9saWN5KTsKLSAgICAgICAgd2FpdEZvckJyb2FkY2FzdCgpOworICAgICAgICB3YWl0Rm9yUG9saWN5Q2hhbmdlZEJyb2FkY2FzdCgpOwogICAgICAgICBTeXN0ZW1VcGRhdGVQb2xpY3kgbmV3UG9saWN5ID0gbURldmljZVBvbGljeU1hbmFnZXIuZ2V0U3lzdGVtVXBkYXRlUG9saWN5KCk7CiAgICAgICAgIGlmIChwb2xpY3kgPT0gbnVsbCkgewogICAgICAgICAgICAgYXNzZXJ0TnVsbChuZXdQb2xpY3kpOwpAQCAtMTMyLDcgKzI3MSw4MCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIHByaXZhdGUgdm9pZCB3YWl0Rm9yQnJvYWRjYXN0KCkgeworCisgICAgcHJpdmF0ZSB2b2lkIHNldFBvbGljeVdpdGhGcmVlemVQZXJpb2QoU3RyaW5nLi4uZGF0ZXMpIHsKKyAgICAgICAgU3lzdGVtVXBkYXRlUG9saWN5IHBvbGljeSA9IFN5c3RlbVVwZGF0ZVBvbGljeS5jcmVhdGVQb3N0cG9uZUluc3RhbGxQb2xpY3koKTsKKyAgICAgICAgc2V0RnJlZXplUGVyaW9kcyhwb2xpY3ksIGRhdGVzKTsKKyAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuc2V0U3lzdGVtVXBkYXRlUG9saWN5KGdldFdobygpLCBwb2xpY3kpOworCisgICAgICAgIExpc3Q8RnJlZXplUGVyaW9kPiBsb2FkZWRGcmVlemVQZXJpb2RzID0gbURldmljZVBvbGljeU1hbmFnZXIKKyAgICAgICAgICAgICAgICAuZ2V0U3lzdGVtVXBkYXRlUG9saWN5KCkuZ2V0RnJlZXplUGVyaW9kcygpOworICAgICAgICBhc3NlcnRFcXVhbHMoZGF0ZXMubGVuZ3RoIC8gMiwgbG9hZGVkRnJlZXplUGVyaW9kcy5zaXplKCkpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRhdGVzLmxlbmd0aDsgaSArPSAyKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocGFyc2VNb250aERheShkYXRlc1tpXSksIGxvYWRlZEZyZWV6ZVBlcmlvZHMuZ2V0KGkgLyAyKS5nZXRTdGFydCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhwYXJzZU1vbnRoRGF5KGRhdGVzW2kgKyAxXSksIGxvYWRlZEZyZWV6ZVBlcmlvZHMuZ2V0KGkgLyAyKS5nZXRFbmQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVGcmVlemVQZXJpb2RzU3VjY2VlZHMoU3RyaW5nLi4uZGF0ZXMpICB7CisgICAgICAgIFN5c3RlbVVwZGF0ZVBvbGljeSBwID0gU3lzdGVtVXBkYXRlUG9saWN5LmNyZWF0ZVBvc3Rwb25lSW5zdGFsbFBvbGljeSgpOworICAgICAgICBzZXRGcmVlemVQZXJpb2RzKHAsIGRhdGVzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVGcmVlemVQZXJpb2RzRmFpbHMoaW50IGVycm9yQ29kZSwgU3RyaW5nLi4uIGRhdGVzKSAgeworICAgICAgICBTeXN0ZW1VcGRhdGVQb2xpY3kgcCA9IFN5c3RlbVVwZGF0ZVBvbGljeS5jcmVhdGVQb3N0cG9uZUluc3RhbGxQb2xpY3koKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNldEZyZWV6ZVBlcmlvZHMocCwgZGF0ZXMpOworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIG5vdCB0aHJvd24gZm9yIGRhdGVzOiAiICsgU3RyaW5nLmpvaW4oIiAiLCBkYXRlcykpOworICAgICAgICB9IGNhdGNoIChTeXN0ZW1VcGRhdGVQb2xpY3kuVmFsaWRhdGlvbkZhaWxlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkV4Y2VwdGlvbiBub3QgZXhwZWN0ZWQ6ICIgKyBlLmdldE1lc3NhZ2UoKSwKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlLGUuZ2V0RXJyb3JDb2RlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlRnJlZXplUGVyaW9kc0ZhaWxzT3ZlcmxhcChTdHJpbmcuLi4gZGF0ZXMpICB7CisgICAgICAgIHZhbGlkYXRlRnJlZXplUGVyaW9kc0ZhaWxzKFZhbGlkYXRpb25GYWlsZWRFeGNlcHRpb24uRVJST1JfRFVQTElDQVRFX09SX09WRVJMQVAsIGRhdGVzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVGcmVlemVQZXJpb2RzRmFpbHNUb29Mb25nKFN0cmluZy4uLiBkYXRlcykgIHsKKyAgICAgICAgdmFsaWRhdGVGcmVlemVQZXJpb2RzRmFpbHMoVmFsaWRhdGlvbkZhaWxlZEV4Y2VwdGlvbi5FUlJPUl9ORVdfRlJFRVpFX1BFUklPRF9UT09fTE9ORywKKyAgICAgICAgICAgICAgICBkYXRlcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlRnJlZXplUGVyaW9kc0ZhaWxzVG9vQ2xvc2UoU3RyaW5nLi4uIGRhdGVzKSAgeworICAgICAgICB2YWxpZGF0ZUZyZWV6ZVBlcmlvZHNGYWlscyhWYWxpZGF0aW9uRmFpbGVkRXhjZXB0aW9uLkVSUk9SX05FV19GUkVFWkVfUEVSSU9EX1RPT19DTE9TRSwKKyAgICAgICAgICAgICAgICBkYXRlcyk7CisgICAgfQorCisgICAgLy9kYXRlcyBhcmUgaW4gTU0tREQgZm9ybWF0CisgICAgcHJpdmF0ZSB2b2lkIHNldEZyZWV6ZVBlcmlvZHMoU3lzdGVtVXBkYXRlUG9saWN5IHBvbGljeSwgU3RyaW5nLi4uIGRhdGVzKSB7CisgICAgICAgIExpc3Q8RnJlZXplUGVyaW9kPiBwZXJpb2RzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGF0ZXMubGVuZ3RoOyBpKz0gMikgeworICAgICAgICAgICAgcGVyaW9kcy5hZGQobmV3IEZyZWV6ZVBlcmlvZChwYXJzZU1vbnRoRGF5KGRhdGVzW2ldKSwgcGFyc2VNb250aERheShkYXRlc1tpICsgMV0pKSk7CisgICAgICAgIH0KKyAgICAgICAgcG9saWN5LnNldEZyZWV6ZVBlcmlvZHMocGVyaW9kcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBNb250aERheSBwYXJzZU1vbnRoRGF5KFN0cmluZyBkYXRlKSB7CisgICAgICAgIHJldHVybiBNb250aERheS5vZihJbnRlZ2VyLnBhcnNlSW50KGRhdGUuc3Vic3RyaW5nKDAsIDIpKSwKKyAgICAgICAgICAgICAgICBJbnRlZ2VyLnBhcnNlSW50KGRhdGUuc3Vic3RyaW5nKDMsIDUpKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNsZWFyRnJlZXplUmVjb3JkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoImRwbSIsICJjbGVhci1mcmVlemUtcGVyaW9kLXJlY29yZCIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRTeXN0ZW1EYXRlKExvY2FsRGF0ZSBkYXRlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbVJlc3RvcmVEYXRlID0gdHJ1ZTsKKyAgICAgICAgQ2FsZW5kYXIgYyA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7CisgICAgICAgIGMuc2V0KENhbGVuZGFyLllFQVIsIGRhdGUuZ2V0WWVhcigpKTsKKyAgICAgICAgYy5zZXQoQ2FsZW5kYXIuTU9OVEgsIGRhdGUuZ2V0TW9udGhWYWx1ZSgpIC0gMSk7CisgICAgICAgIGMuc2V0KENhbGVuZGFyLkRBWV9PRl9NT05USCwgZGF0ZS5nZXREYXlPZk1vbnRoKCkpOworICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5zZXRUaW1lKGdldFdobygpLCBjLmdldFRpbWVJbk1pbGxpcygpKTsKKyAgICAgICAgd2FpdEZvclRpbWVDaGFuZ2VkQnJvYWRjYXN0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdhaXRGb3JQb2xpY3lDaGFuZ2VkQnJvYWRjYXN0KCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVGltZW91dCB3aGlsZSB3YWl0aW5nIGZvciBicm9hZGNhc3QuIiwKICAgICAgICAgICAgICAgICAgICAgbVBvbGljeUNoYW5nZWRTZW1hcGhvcmUudHJ5QWNxdWlyZShUSU1FT1VUX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKQEAgLTE0MCw0ICszNTIsNTEgQEAKICAgICAgICAgICAgIGZhaWwoIkludGVycnVwdGVkIHdoaWxlIHdhaXRpbmcgZm9yIGJyb2FkY2FzdC4iKTsKICAgICAgICAgfQogICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB3YWl0Rm9yVGltZUNoYW5nZWRCcm9hZGNhc3QoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJUaW1lb3V0IHdoaWxlIHdhaXRpbmcgZm9yIGJyb2FkY2FzdC4iLAorICAgICAgICAgICAgICAgICAgICBtVGltZUNoYW5nZWRTZW1hcGhvcmUudHJ5QWNxdWlyZShUSU1FT1VUX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiSW50ZXJydXB0ZWQgd2hpbGUgd2FpdGluZyBmb3IgYnJvYWRjYXN0LiIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgZ2V0QWlycGxhbmVNb2RlKCkgdGhyb3dzIFNldHRpbmdzLlNldHRpbmdOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIGludCBhaXJwbGFuZU1vZGUgPSAweEZGOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYWlycGxhbmVNb2RlID0gU2V0dGluZ3MuR2xvYmFsLmdldEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5HbG9iYWwuQUlSUExBTkVfTU9ERV9PTik7CisgICAgICAgIH0gY2F0Y2ggKFNldHRpbmdzLlNldHRpbmdOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhaXJwbGFuZU1vZGUgPSAweEZGOworICAgICAgICAgICAgLy8gaWYgdGhlIG1vZGUgaXMgbm90IHN1cHBvcnRlZCwgcmV0dXJuIGEgbm9uIHplcm8gdmFsdWUuCisgICAgICAgICAgICBMb2cuaShUQUcsICJBaXJwbGFuZSBtb2RlIGlzIG5vdCBmb3VuZCBpbiBTZXR0aW5ncy4gU2tpcHBpbmcgQWlycGxhbmVNb2RlIHVwZGF0ZSIpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcmV0dXJuIGFpcnBsYW5lTW9kZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBzZXRBaXJwbGFuZU1vZGVBbmRXYWl0QnJvYWRjYXN0IChpbnQgc3RhdGUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBMb2cuaShUQUcsICJzZXRBaXJwbGFuZU1vZGVBbmRXYWl0QnJvYWRjYXN0IHNldHRpbmcgc3RhdGUoMD1kaXNhYmxlLCAxPWVuYWJsZSk6ICIgKyBzdGF0ZSk7CisKKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgICAgIEJyb2FkY2FzdFJlY2VpdmVyIHJlY2VpdmVyID0gbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiUmVjZWl2ZWQgYnJvYWRjYXN0IGZvciBBaXJwbGFuZU1vZGVVcGRhdGUiKTsKKyAgICAgICAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihyZWNlaXZlciwgbmV3IEludGVudEZpbHRlcihJbnRlbnQuQUNUSU9OX0FJUlBMQU5FX01PREVfQ0hBTkdFRCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgU2V0dGluZ3MuR2xvYmFsLnB1dEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwgQUlSUExBTkVfTU9ERV9PTiwgc3RhdGUpOworICAgICAgICAgICAgaWYgKCFsYXRjaC5hd2FpdChUSU1FT1VUX1NFQywgVGltZVVuaXQuU0VDT05EUykpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJGYWlsZWQgdG8gcmVjZWl2ZSBicm9hZGNhc3QgaW4gIiArIFRJTUVPVVRfU0VDICsgInNlYyIpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIG1Db250ZXh0LnVucmVnaXN0ZXJSZWNlaXZlcihyZWNlaXZlcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlb3duZXIvVXNlclNlc3Npb25UZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vvd25lci9Vc2VyU2Vzc2lvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODZkMjAyCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlb3duZXIvVXNlclNlc3Npb25UZXN0LmphdmEKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY3RzLmRldmljZW93bmVyOworCisvKiogVGVzdCBmb3IgdXNlciBzZXNzaW9uIEFQSXMuICovCitwdWJsaWMgY2xhc3MgVXNlclNlc3Npb25UZXN0IGV4dGVuZHMgQmFzZURldmljZU93bmVyVGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRfU0VTU0lPTl9NRVNTQUdFID0gIlN0YXJ0IHNlc3Npb24iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTkRfU0VTU0lPTl9NRVNTQUdFID0gIkVuZCBzZXNzaW9uIjsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRMb2dvdXRFbmFibGVkKCkgeworICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5zZXRMb2dvdXRFbmFibGVkKGdldFdobygpLCB0cnVlKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtRGV2aWNlUG9saWN5TWFuYWdlci5pc0xvZ291dEVuYWJsZWQoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNldExvZ291dERpc2FibGVkKCkgeworICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5zZXRMb2dvdXRFbmFibGVkKGdldFdobygpLCBmYWxzZSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmlzTG9nb3V0RW5hYmxlZCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0U3RhcnRVc2VyU2Vzc2lvbk1lc3NhZ2UoKSB7CisgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnNldFN0YXJ0VXNlclNlc3Npb25NZXNzYWdlKGdldFdobygpLCBTVEFSVF9TRVNTSU9OX01FU1NBR0UpOworICAgICAgICBhc3NlcnRFcXVhbHMoU1RBUlRfU0VTU0lPTl9NRVNTQUdFLAorICAgICAgICAgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmdldFN0YXJ0VXNlclNlc3Npb25NZXNzYWdlKGdldFdobygpKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNldEVuZFVzZXJTZXNzaW9uTWVzc2FnZSgpIHsKKyAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuc2V0RW5kVXNlclNlc3Npb25NZXNzYWdlKGdldFdobygpLCBFTkRfU0VTU0lPTl9NRVNTQUdFKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEVORF9TRVNTSU9OX01FU1NBR0UsIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmdldEVuZFVzZXJTZXNzaW9uTWVzc2FnZShnZXRXaG8oKSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDbGVhclN0YXJ0VXNlclNlc3Npb25NZXNzYWdlKCkgeworICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5zZXRTdGFydFVzZXJTZXNzaW9uTWVzc2FnZShnZXRXaG8oKSwgU1RBUlRfU0VTU0lPTl9NRVNTQUdFKTsKKyAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuc2V0U3RhcnRVc2VyU2Vzc2lvbk1lc3NhZ2UoZ2V0V2hvKCksIG51bGwpOworICAgICAgICBhc3NlcnROdWxsKG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmdldFN0YXJ0VXNlclNlc3Npb25NZXNzYWdlKGdldFdobygpKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJFbmRVc2VyU2Vzc2lvbk1lc3NhZ2UoKSB7CisgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnNldEVuZFVzZXJTZXNzaW9uTWVzc2FnZShnZXRXaG8oKSwgRU5EX1NFU1NJT05fTUVTU0FHRSk7CisgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnNldEVuZFVzZXJTZXNzaW9uTWVzc2FnZShnZXRXaG8oKSwgbnVsbCk7CisgICAgICAgIGFzc2VydE51bGwobURldmljZVBvbGljeU1hbmFnZXIuZ2V0RW5kVXNlclNlc3Npb25NZXNzYWdlKGdldFdobygpKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlb3duZXIvVnJUZW1wZXJhdHVyZVRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZW93bmVyL1ZyVGVtcGVyYXR1cmVUZXN0LmphdmEKaW5kZXggMzIxZjNkNi4uNmMxMzlhYSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlb3duZXIvVnJUZW1wZXJhdHVyZVRlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vvd25lci9WclRlbXBlcmF0dXJlVGVzdC5qYXZhCkBAIC0yMSw4ICsyMSw2IEBACiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DZGRUZXN0OwotCiBpbXBvcnQgamF2YS5sYW5nLk1hdGg7CiAKIHB1YmxpYyBjbGFzcyBWclRlbXBlcmF0dXJlVGVzdCBleHRlbmRzIEJhc2VEZXZpY2VPd25lclRlc3QgewpAQCAtODAsNyArNzgsNiBAQAogICAgIC8qKgogICAgICAqIFRlc3RzIHRoYXQgdGVtcGVyYXR1cmUgc2Vuc29ycyByZXR1cm4gdmFsaWQgdmFsdWVzLgogICAgICAqLwotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjkuMi9DLTEtMTMiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RWclRlbXBlcmF0dXJlcygpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgU2VjdXJpdHlFeGNlcHRpb24gewogICAgICAgICBpZiAoIXN1cHBvcnRzVnJIaWdoUGVyZm9ybWFuY2UoKSkKICAgICAgICAgICAgIHJldHVybjsKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZW93bmVyL1dpZmlDb25maWdMb2NrZG93blRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9EZXZpY2VPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZW93bmVyL1dpZmlDb25maWdMb2NrZG93blRlc3QuamF2YQppbmRleCAxNjI3OTYxLi42NWVkZTBhIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvRGV2aWNlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vvd25lci9XaWZpQ29uZmlnTG9ja2Rvd25UZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0RldmljZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlb3duZXIvV2lmaUNvbmZpZ0xvY2tkb3duVGVzdC5qYXZhCkBAIC0xNzMsNyArMTczLDcgQEAKICAgICAgICAgbUNvbnRleHQuc3RhcnRBY3Rpdml0eShjcmVhdGVSZWd1bGFyQ29uZmlnKTsKIAogICAgICAgICAvLyBHaXZlIHNvbWUgdGltZSBmb3IgdGhlIG90aGVyIGFwcCB0byBmaW5pc2ggdGhlIGFjdGlvbgotICAgICAgICBUaHJlYWQuc2xlZXAoMjAwMCk7CisgICAgICAgIFRocmVhZC5zbGVlcCg1MDAwKTsKICAgICB9CiAKICAgICBwcml2YXRlIGJvb2xlYW4gYXJlTWF0Y2hpbmdTc2lkcyhTdHJpbmcgczEsIFN0cmluZyBzMikgewpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0ludGVudFJlY2VpdmVyL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvSW50ZW50UmVjZWl2ZXIvQW5kcm9pZC5tawppbmRleCBkMWVkOTZmLi4xYmQ4OThkIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvSW50ZW50UmVjZWl2ZXIvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvSW50ZW50UmVjZWl2ZXIvQW5kcm9pZC5tawpAQCAtMjQsMTcgKzI0LDE2IEBACiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIAotTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lcgorTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lci5zdHVicyBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicwogCiBMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAotICAgIGFuZHJvaWQtc3VwcG9ydC12NCBcCi0gICAgY3RzdGVzdHJ1bm5lciBcCi0gICAgbGVnYWN5LWFuZHJvaWQtdGVzdCBcCi0gICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbAorICAgIGFuZHJvaWR4LmxlZ2FjeV9sZWdhY3ktc3VwcG9ydC12NCBcCisgICAgY3RzdGVzdHJ1bm5lci1heHQgXAorICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0CiAKIExPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKIAogIyB0YWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gYXJjdHMgY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiAKIGluY2x1ZGUgJChCVUlMRF9DVFNfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9JbnRlbnRSZWNlaXZlci9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0ludGVudFJlY2VpdmVyL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggZGEwZTE2Yy4uMjI2MTRmZSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0ludGVudFJlY2VpdmVyL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0ludGVudFJlY2VpdmVyL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTM1LDYgKzM1LDcgQEAKICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuY3RzLmFjdGlvbi5OT1RJRllfVVJJX0NIQU5HRSIvPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5jdHMuYWN0aW9uLk9CU0VSVkVfVVJJX0NIQU5HRSIvPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5jdHMuYWN0aW9uLkpVU1RfQ1JFQVRFIiAvPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5jdHMuYWN0aW9uLkNSRUFURV9BTkRfV0FJVCIgLz4KICAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5ERUZBVUxUIiAvPgogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICA8L2FjdGl2aXR5PgpAQCAtNzAsNyArNzEsNyBAQAogICAgIDwvYXBwbGljYXRpb24+CiAKICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmFuZHJvaWQuY3RzLmludGVudC5yZWNlaXZlciIKICAgICAgICAgYW5kcm9pZDpsYWJlbD0iSW50ZW50IFJlY2VpdmVyIENUUyBUZXN0cyIgLz4KIApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0ludGVudFJlY2VpdmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvaW50ZW50L3JlY2VpdmVyL0NsZWFyQXBwbGljYXRpb25EYXRhVGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0ludGVudFJlY2VpdmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvaW50ZW50L3JlY2VpdmVyL0NsZWFyQXBwbGljYXRpb25EYXRhVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMzJhMjUKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvSW50ZW50UmVjZWl2ZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9pbnRlbnQvcmVjZWl2ZXIvQ2xlYXJBcHBsaWNhdGlvbkRhdGFUZXN0LmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5jdHMuaW50ZW50LnJlY2VpdmVyOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlczsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogVGVzdCBjbGFzcyB0aGF0IHdyaXRlcyB0byBzaGFyZWQgcHJlZmVyZW5jZSBhbmQgdmVyaWZpZXMgdGhhdCB0aGUgc2hhcmVkIHByZWZlcmVuY2UgZ2V0cyBjbGVhcmVkCisgKiBhZnRlciBEUE0uY2xlYXJBcHBsaWNhdGlvblVzZXJEYXRhIHdhcyBjYWxsZWQuCisgKi8KK0BTbWFsbFRlc3QKK3B1YmxpYyBjbGFzcyBDbGVhckFwcGxpY2F0aW9uRGF0YVRlc3QgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSEFSRURfUFJFRkVSRU5DRV9OQU1FID0gInRlc3QtcHJlZmVyZW5jZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElfV0FTX0hFUkUgPSAiSS1XYXMtSGVyZSI7CisKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBTaGFyZWRQcmVmZXJlbmNlcyBtU2hhcmVkUHJlZnM7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIG1Db250ZXh0ID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0VGFyZ2V0Q29udGV4dCgpOworICAgICAgICBtU2hhcmVkUHJlZnMgPSBtQ29udGV4dC5nZXRTaGFyZWRQcmVmZXJlbmNlcyhTSEFSRURfUFJFRkVSRU5DRV9OQU1FLCBDb250ZXh0Lk1PREVfUFJJVkFURSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGVUb1NoYXJlZFByZWZlcmVuY2UoKSB7CisgICAgICAgIG1TaGFyZWRQcmVmcy5lZGl0KCkucHV0Qm9vbGVhbihJX1dBU19IRVJFLCB0cnVlKS5jb21taXQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtU2hhcmVkUHJlZnMuY29udGFpbnMoSV9XQVNfSEVSRSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNoYXJlZFByZWZlcmVuY2VDbGVhcmVkKCkgeworICAgICAgICBhc3NlcnRGYWxzZShtU2hhcmVkUHJlZnMuY29udGFpbnMoSV9XQVNfSEVSRSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9JbnRlbnRSZWNlaXZlci9zcmMvY29tL2FuZHJvaWQvY3RzL2ludGVudC9yZWNlaXZlci9JbnRlbnRSZWNlaXZlckFjdGl2aXR5LmphdmEgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvSW50ZW50UmVjZWl2ZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9pbnRlbnQvcmVjZWl2ZXIvSW50ZW50UmVjZWl2ZXJBY3Rpdml0eS5qYXZhCmluZGV4IGE2NDVhODcuLjVmMDRiZTAgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9JbnRlbnRSZWNlaXZlci9zcmMvY29tL2FuZHJvaWQvY3RzL2ludGVudC9yZWNlaXZlci9JbnRlbnRSZWNlaXZlckFjdGl2aXR5LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0ludGVudFJlY2VpdmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvaW50ZW50L3JlY2VpdmVyL0ludGVudFJlY2VpdmVyQWN0aXZpdHkuamF2YQpAQCAtNTcsOCArNTcsMTQgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0pVU1RfQ1JFQVRFID0KICAgICAgICAgICAgICJjb20uYW5kcm9pZC5jdHMuYWN0aW9uLkpVU1RfQ1JFQVRFIjsKIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQ0VJVklOR19BQ1RJVklUWV9DUkVBVEVEX0FDVElPTgotICAgICAgICAgICAgPSAiY29tLmFuZHJvaWQuY3RzLmRldmljZW93bmVyLlJFQ0VJVklOR19BQ1RJVklUWV9DUkVBVEVEX0FDVElPTiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9DUkVBVEVfQU5EX1dBSVQgPQorICAgICAgICAgICAgImNvbS5hbmRyb2lkLmN0cy5hY3Rpb24uQ1JFQVRFX0FORF9XQUlUIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUNFSVZFUl9BQ1RJVklUWV9DUkVBVEVEX0FDVElPTiA9CisgICAgICAgICAgICAiY29tLmFuZHJvaWQuY3RzLmRldmljZW93bmVyLmFjdGlvbi5SRUNFSVZFUl9BQ1RJVklUWV9DUkVBVEVEIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUNFSVZFUl9BQ1RJVklUWV9ERVNUUk9ZRURfQUNUSU9OID0KKyAgICAgICAgICAgICJjb20uYW5kcm9pZC5jdHMuZGV2aWNlb3duZXIuYWN0aW9uLlJFQ0VJVkVSX0FDVElWSVRZX0RFU1RST1lFRCI7CiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fTk9USUZZX1VSSV9DSEFOR0UKICAgICAgICAgICAgID0gImNvbS5hbmRyb2lkLmN0cy5hY3Rpb24uTk9USUZZX1VSSV9DSEFOR0UiOwpAQCAtMTMxLDEwICsxMzcsMTkgQEAKICAgICAgICAgICAgICAgICBnZXRDb250ZW50UmVzb2x2ZXIoKS51bnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKHVyaU9ic2VydmVyKTsKICAgICAgICAgICAgICAgICBoYW5kbGVyVGhyZWFkLnF1aXQoKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChBQ1RJT05fSlVTVF9DUkVBVEUuZXF1YWxzKGFjdGlvbikpIHsKLSAgICAgICAgICAgIHNlbmRCcm9hZGNhc3QobmV3IEludGVudChSRUNFSVZJTkdfQUNUSVZJVFlfQ1JFQVRFRF9BQ1RJT04pKTsKKyAgICAgICAgfSBlbHNlIGlmIChBQ1RJT05fSlVTVF9DUkVBVEUuZXF1YWxzKGFjdGlvbikgfHwgQUNUSU9OX0NSRUFURV9BTkRfV0FJVC5lcXVhbHMoYWN0aW9uKSkgeworICAgICAgICAgICAgc2VuZEJyb2FkY2FzdChuZXcgSW50ZW50KFJFQ0VJVkVSX0FDVElWSVRZX0NSRUFURURfQUNUSU9OKSk7CiAgICAgICAgIH0KLSAgICAgICAgZmluaXNoKCk7CisKKyAgICAgICAgaWYgKCFBQ1RJT05fQ1JFQVRFX0FORF9XQUlULmVxdWFscyhhY3Rpb24pKSB7CisgICAgICAgICAgICBmaW5pc2goKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveSgpIHsKKyAgICAgICAgc2VuZEJyb2FkY2FzdChuZXcgSW50ZW50KFJFQ0VJVkVSX0FDVElWSVRZX0RFU1RST1lFRF9BQ1RJT04pKTsKKyAgICAgICAgc3VwZXIub25EZXN0cm95KCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBjbGFzcyBVcmlPYnNlcnZlciBleHRlbmRzIENvbnRlbnRPYnNlcnZlciB7CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvSW50ZW50U2VuZGVyL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvSW50ZW50U2VuZGVyL0FuZHJvaWQubWsKaW5kZXggYjcxZGRmYi4uMTk2ZTE5MiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0ludGVudFNlbmRlci9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9JbnRlbnRTZW5kZXIvQW5kcm9pZC5tawpAQCAtMjQsMTcgKzI0LDIwIEBACiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIAotTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lcgorTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lci5zdHVicyBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicworCitMT0NBTF9VU0VfQUFQVDIgOj0gdHJ1ZQogCiBMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAotCWFuZHJvaWQtc3VwcG9ydC12NCBcCi0JY3RzdGVzdHJ1bm5lciBcCi0JdWItdWlhdXRvbWF0b3IgXAotCWxlZ2FjeS1hbmRyb2lkLXRlc3QKKwljdHN0ZXN0cnVubmVyLWF4dCBcCisJdWItdWlhdXRvbWF0b3IKKworTE9DQUxfU1RBVElDX0FORFJPSURfTElCUkFSSUVTIDo9IFwKKyAgICBhbmRyb2lkeC5sZWdhY3lfbGVnYWN5LXN1cHBvcnQtdjQKIAogTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAogCiAjIHRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0Ci1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBhcmN0cyBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKIAogaW5jbHVkZSAkKEJVSUxEX0NUU19QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0ludGVudFNlbmRlci9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0ludGVudFNlbmRlci9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGNjMjcyOTguLjU5ZjlhOWMgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9JbnRlbnRTZW5kZXIvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvSW50ZW50U2VuZGVyL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTMzLDcgKzMzLDcgQEAKICAgICAgICAgPC9hY3Rpdml0eT4KIAogICAgICAgICA8cHJvdmlkZXIKLSAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnY0LmNvbnRlbnQuRmlsZVByb3ZpZGVyIgorICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC5jb3JlLmNvbnRlbnQuRmlsZVByb3ZpZGVyIgogICAgICAgICAgICAgYW5kcm9pZDphdXRob3JpdGllcz0iY29tLmFuZHJvaWQuY3RzLmludGVudC5zZW5kZXIuZmlsZXByb3ZpZGVyIgogICAgICAgICAgICAgYW5kcm9pZDpncmFudFVyaVBlcm1pc3Npb25zPSJ0cnVlIgogICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0iZmFsc2UiPgpAQCAtNTIsNyArNTIsNyBAQAogICAgIDwvYXBwbGljYXRpb24+CiAKICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmFuZHJvaWQuY3RzLmludGVudC5zZW5kZXIiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkludGVudCBTZW5kZXIgQ1RTIFRlc3RzIiAvPgogCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvSW50ZW50U2VuZGVyL3NyYy9jb20vYW5kcm9pZC9jdHMvaW50ZW50L3NlbmRlci9Db250ZW50VGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0ludGVudFNlbmRlci9zcmMvY29tL2FuZHJvaWQvY3RzL2ludGVudC9zZW5kZXIvQ29udGVudFRlc3QuamF2YQppbmRleCA2ZmU3MzNiLi4zNjJiYzZiIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvSW50ZW50U2VuZGVyL3NyYy9jb20vYW5kcm9pZC9jdHMvaW50ZW50L3NlbmRlci9Db250ZW50VGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9JbnRlbnRTZW5kZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9pbnRlbnQvc2VuZGVyL0NvbnRlbnRUZXN0LmphdmEKQEAgLTI0LDcgKzI0LDcgQEAKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlclRocmVhZDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQuY29udGVudC5GaWxlUHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZHguY29yZS5jb250ZW50LkZpbGVQcm92aWRlcjsKIGltcG9ydCBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdENhc2U7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0xhdW5jaGVyVGVzdHMvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9MYXVuY2hlclRlc3RzL0FuZHJvaWQubWsKaW5kZXggZWQ0OTQzZi4uMTMxYWVlMSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0xhdW5jaGVyVGVzdHMvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvTGF1bmNoZXJUZXN0cy9BbmRyb2lkLm1rCkBAIC0yNCwxMyArMjQsMTUgQEAKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogCi1MT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBsZWdhY3ktYW5kcm9pZC10ZXN0IGN0cy1qdW5pdAorTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gY3RzLWp1bml0IGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCiAKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA9IFwKLQlhbmRyb2lkLXN1cHBvcnQtdjQgXAotCWN0c3Rlc3RydW5uZXIgXAotCWFuZHJvaWQtc3VwcG9ydC10ZXN0IFwKLQlsZWdhY3ktYW5kcm9pZC10ZXN0CisJYW5kcm9pZHgubGVnYWN5X2xlZ2FjeS1zdXBwb3J0LXY0IFwKKwljdHN0ZXN0cnVubmVyLWF4dCBcCisJYW5kcm9pZHgudGVzdC5ydWxlcyBcCisJY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgXAorCVNob3J0Y3V0TWFuYWdlclRlc3RVdGlscyBcCisJdGVzdG5nCiAKIExPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKIApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0xhdW5jaGVyVGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9MYXVuY2hlclRlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggYWJmNGM1Mi4uY2M4N2I0ZiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0xhdW5jaGVyVGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvTGF1bmNoZXJUZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yMyw3ICsyMyw3IEBACiAgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgogICAgIDwvYXBwbGljYXRpb24+CiAKLSAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5jdHMubGF1bmNoZXJ0ZXN0cyIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkxhdW5jaGVyIEFwcHMgQ1RTIFRlc3RzIi8+CiA8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0xhdW5jaGVyVGVzdHMvc3JjL2NvbS9hbmRyb2lkL2N0cy9sYXVuY2hlcnRlc3RzL0xhdW5jaGVyQXBwc1Rlc3RzLmphdmEgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvTGF1bmNoZXJUZXN0cy9zcmMvY29tL2FuZHJvaWQvY3RzL2xhdW5jaGVydGVzdHMvTGF1bmNoZXJBcHBzVGVzdHMuamF2YQppbmRleCBhMzU1NzRiLi5hZmI5N2Y5IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvTGF1bmNoZXJUZXN0cy9zcmMvY29tL2FuZHJvaWQvY3RzL2xhdW5jaGVydGVzdHMvTGF1bmNoZXJBcHBzVGVzdHMuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvTGF1bmNoZXJUZXN0cy9zcmMvY29tL2FuZHJvaWQvY3RzL2xhdW5jaGVydGVzdHMvTGF1bmNoZXJBcHBzVGVzdHMuamF2YQpAQCAtMzUsOSArMzUsMTAgQEAKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NlbmdlcjsKIGltcG9ydCBhbmRyb2lkLm9zLlVzZXJIYW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5Vc2VyTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKIGltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKKwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNlbWFwaG9yZTsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKQEAgLTk0LDEzICs5NSw4IEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdEdldEFjdGl2aXRpZXNGb3JVc2VyRmFpbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIExpc3Q8TGF1bmNoZXJBY3Rpdml0eUluZm8+IGFjdGl2aXRpZXMgPQotICAgICAgICAgICAgICAgICAgICBtTGF1bmNoZXJBcHBzLmdldEFjdGl2aXR5TGlzdChudWxsLCBtVXNlcik7Ci0gICAgICAgICAgICBmYWlsKCJnZXRBY3Rpdml0aWVzIGZvciBub24tcHJvZmlsZSB1c2VyIGZhaWxlZCB0byB0aHJvdyBleGNlcHRpb24iKTsKLSAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gRXhwZWN0ZWQuCi0gICAgICAgIH0KKyAgICAgICAgZXhwZWN0U2VjdXJpdHlFeGNlcHRpb24oKCkgLT4gbUxhdW5jaGVyQXBwcy5nZXRBY3Rpdml0eUxpc3QobnVsbCwgbVVzZXIpLAorICAgICAgICAgICAgICAgICJnZXRBY3Rpdml0aWVzIGZvciBub24tcHJvZmlsZSB1c2VyIGZhaWxlZCB0byB0aHJvdyBleGNlcHRpb24iKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlQXBwSW5zdGFsbGVkRm9yVXNlcigpIHRocm93cyBFeGNlcHRpb24gewpAQCAtMTI1LDE0ICsxMjEsMTEgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzUHJpbWFyeVByb2ZpbGVGcm9tTWFuYWdlZFByb2ZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gVHJ5IHRvIGFjY2VzcyBtYWluIHByb2ZpbGUgZnJvbSBtYW5hZ2VkIHByb2ZpbGUsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLgotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbUxhdW5jaGVyQXBwcy5nZXRBY3Rpdml0eUxpc3QobnVsbCwgbVVzZXIpLnNpemUoKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtTGF1bmNoZXJBcHBzLmdldEFwcGxpY2F0aW9uSW5mbyhTSU1QTEVfQVBQX1BBQ0tBR0UsIC8qIGZsYWdzPSAqLyAwLCBtVXNlcik7Ci0gICAgICAgICAgICBmYWlsKCJNaXNzaW5nIGV4Y2VwdGlvbiIpOwotICAgICAgICB9IGNhdGNoIChQYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gRXhwZWN0ZWQuCi0gICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZShtTGF1bmNoZXJBcHBzLmdldEFjdGl2aXR5TGlzdChudWxsLCBtVXNlcikuaXNFbXB0eSgpKTsKKworICAgICAgICBleHBlY3ROYW1lTm90Rm91bmRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgKCkgLT4gbUxhdW5jaGVyQXBwcy5nZXRBcHBsaWNhdGlvbkluZm8oU0lNUExFX0FQUF9QQUNLQUdFLCAvKiBmbGFncz0gKi8gMCwgbVVzZXIpLAorICAgICAgICAgICAgICAgICJnZXQgYXBwbGljYXRpb25JbmZvIGZhaWxlZCB0byB0aHJvdyBuYW1lIG5vdCBmb3VuZCBleGNlcHRpb24iKTsKICAgICAgICAgYXNzZXJ0RmFsc2UobUxhdW5jaGVyQXBwcy5pc1BhY2thZ2VFbmFibGVkKFNJTVBMRV9BUFBfUEFDS0FHRSwgbVVzZXIpKTsKIAogICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChJbnRlbnQuQUNUSU9OX1ZJRVcsIFVyaS5wYXJzZSgiaHR0cDovL3d3dy5hbmRyb2lkLmNvbS8iKSk7CkBAIC0xNzcsMjcgKzE3MCwxNyBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RMYXVuY2hOb25FeHBvcnRBY3Rpdml0eUZhaWxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtTGF1bmNoZXJBcHBzLnN0YXJ0TWFpbkFjdGl2aXR5KG5ldyBDb21wb25lbnROYW1lKAotICAgICAgICAgICAgICAgICAgICBTSU1QTEVfQVBQX1BBQ0tBR0UsCi0gICAgICAgICAgICAgICAgICAgIFNJTVBMRV9BUFBfUEFDS0FHRSArICIuTm9uRXhwb3J0ZWRBY3Rpdml0eSIpLAotICAgICAgICAgICAgICAgICAgICBtVXNlciwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICBmYWlsKCJzdGFydGluZyBub24tZXhwb3J0ZWQgYWN0aXZpdHkgZmFpbGVkIHRvIHRocm93IGV4Y2VwdGlvbiIpOwotICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBFeHBlY3RlZC4KLSAgICAgICAgfQorICAgICAgICBleHBlY3RTZWN1cml0eUV4Y2VwdGlvbigoKSAtPiBtTGF1bmNoZXJBcHBzLnN0YXJ0TWFpbkFjdGl2aXR5KG5ldyBDb21wb25lbnROYW1lKAorICAgICAgICAgICAgICAgIFNJTVBMRV9BUFBfUEFDS0FHRSwgU0lNUExFX0FQUF9QQUNLQUdFICsgIi5Ob25FeHBvcnRlZEFjdGl2aXR5IiksCisgICAgICAgICAgICAgICAgbVVzZXIsIG51bGwsIG51bGwpLAorICAgICAgICAgICAgICAgICJzdGFydGluZyBub24tZXhwb3J0ZWQgYWN0aXZpdHkgZmFpbGVkIHRvIHRocm93IGV4Y2VwdGlvbiIpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RMYXVuY2hOb25FeHBvcnRMYXVuY2hlckZhaWxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtTGF1bmNoZXJBcHBzLnN0YXJ0TWFpbkFjdGl2aXR5KG5ldyBDb21wb25lbnROYW1lKAotICAgICAgICAgICAgICAgICAgICBTSU1QTEVfQVBQX1BBQ0tBR0UsCi0gICAgICAgICAgICAgICAgICAgIFNJTVBMRV9BUFBfUEFDS0FHRSArICIuTm9uTGF1bmNoZXJBY3Rpdml0eSIpLAotICAgICAgICAgICAgICAgICAgICBtVXNlciwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICBmYWlsKCJzdGFydGluZyBub24tbGF1bmNoZXIgYWN0aXZpdHkgZmFpbGVkIHRvIHRocm93IGV4Y2VwdGlvbiIpOwotICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBFeHBlY3RlZC4KLSAgICAgICAgfQorICAgICAgICBleHBlY3RTZWN1cml0eUV4Y2VwdGlvbigoKSAtPiBtTGF1bmNoZXJBcHBzLnN0YXJ0TWFpbkFjdGl2aXR5KG5ldyBDb21wb25lbnROYW1lKAorICAgICAgICAgICAgICAgIFNJTVBMRV9BUFBfUEFDS0FHRSwgU0lNUExFX0FQUF9QQUNLQUdFICsgIi5Ob25MYXVuY2hlckFjdGl2aXR5IiksCisgICAgICAgICAgICAgICAgbVVzZXIsIG51bGwsIG51bGwpLAorICAgICAgICAgICAgICAgICJzdGFydGluZyBub24tbGF1bmNoZXIgYWN0aXZpdHkgZmFpbGVkIHRvIHRocm93IGV4Y2VwdGlvbiIpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RMYXVuY2hNYWluQWN0aXZpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTIxMyw2ICsxOTYsMzcgQEAKICAgICAgICAgbUluc3RydW1lbnRhdGlvbi5nZXRDb250ZXh0KCkudW5yZWdpc3RlclJlY2VpdmVyKHJlY2VpdmVyKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmV2ZXJzZUFjY2Vzc05vVGhyb3coKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gVHJ5aW5nIHRvIGFjY2VzcyB0aGUgbWFpbiBwcm9maWxlIGZyb20gYSBtYW5hZ2VkIHByb2ZpbGUgLT4gc2hvdWxkbid0IHRocm93IGJ1dAorICAgICAgICAvLyBzaG91bGQganVzdCByZXR1cm4gZmFsc2UuCisgICAgICAgIGFzc2VydEZhbHNlKG1MYXVuY2hlckFwcHMuaXNQYWNrYWdlRW5hYmxlZCgiYW5kcm9pZCIsIG1Vc2VyKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGV4cGVjdFNlY3VyaXR5RXhjZXB0aW9uKEV4Y2VwdGlvblJ1bm5hYmxlIGFjdGlvbiwgU3RyaW5nIGZhaWxNZXNzYWdlKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhY3Rpb24ucnVuKCk7CisgICAgICAgICAgICBmYWlsKGZhaWxNZXNzYWdlKTsKKyAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBleHBlY3ROYW1lTm90Rm91bmRFeGNlcHRpb24oRXhjZXB0aW9uUnVubmFibGUgYWN0aW9uLCBTdHJpbmcgZmFpbE1lc3NhZ2UpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFjdGlvbi5ydW4oKTsKKyAgICAgICAgICAgIGZhaWwoZmFpbE1lc3NhZ2UpOworICAgICAgICB9IGNhdGNoIChQYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgIH0KKworICAgIEBGdW5jdGlvbmFsSW50ZXJmYWNlCisgICAgcHVibGljIGludGVyZmFjZSBFeGNlcHRpb25SdW5uYWJsZSB7CisgICAgICAgIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbjsKKyAgICB9CisKICAgICBwcml2YXRlIFVzZXJIYW5kbGUgZ2V0VXNlckhhbmRsZUFyZ3VtZW50KFVzZXJNYW5hZ2VyIHVzZXJNYW5hZ2VyLCBTdHJpbmcga2V5LAogICAgICAgICAgICAgQnVuZGxlIGFyZ3VtZW50cykgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZyBzZXJpYWwgPSBhcmd1bWVudHMuZ2V0U3RyaW5nKGtleSk7CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvTGF1bmNoZXJUZXN0cy9zcmMvY29tL2FuZHJvaWQvY3RzL2xhdW5jaGVydGVzdHMvUXVpZXRNb2RlVGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0xhdW5jaGVyVGVzdHMvc3JjL2NvbS9hbmRyb2lkL2N0cy9sYXVuY2hlcnRlc3RzL1F1aWV0TW9kZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTVmMDVkCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0xhdW5jaGVyVGVzdHMvc3JjL2NvbS9hbmRyb2lkL2N0cy9sYXVuY2hlcnRlc3RzL1F1aWV0TW9kZVRlc3QuamF2YQpAQCAtMCwwICsxLDIyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5sYXVuY2hlcnRlc3RzOworCitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5zaG9ydGN1dG1hbmFnZXJ0ZXN0LlNob3J0Y3V0TWFuYWdlclRlc3RVdGlscy5zZXREZWZhdWx0TGF1bmNoZXI7CisKK2ltcG9ydCBzdGF0aWMganVuaXQuZnJhbWV3b3JrLkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMganVuaXQuZnJhbWV3b3JrLkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0VGhyb3dzOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5Vc2VySGFuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuVXNlck1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QudWlhdXRvbWF0b3IuVWlEZXZpY2U7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQmxvY2tpbmdCcm9hZGNhc3RSZWNlaXZlcjsKKworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkxpbmtlZEJsb2NraW5nUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKKy8qKgorICogVGVzdCB0aGF0IHJ1bnMge0BsaW5rIFVzZXJNYW5hZ2VyI3RyeVNldFF1aWV0TW9kZUVuYWJsZWQoYm9vbGVhbiwgVXNlckhhbmRsZSl9IEFQSQorICogYWdhaW5zdCB2YWxpZCB0YXJnZXQgdXNlci4KKyAqLworQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBRdWlldE1vZGVUZXN0IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVEFSR0VUX1VTRVIgPSAiVEFSR0VUX1VTRVIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9PUklHSU5BTF9ERUZBVUxUX0xBVU5DSEVSID0gIk9SSUdJTkFMX0RFRkFVTFRfTEFVTkNIRVIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbXBvbmVudE5hbWUgTEFVTkNIRVJfQUNUSVZJVFkgPQorICAgICAgICAgICAgbmV3IENvbXBvbmVudE5hbWUoCisgICAgICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5jdHMubGF1bmNoZXJ0ZXN0cy5zdXBwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmN0cy5sYXVuY2hlcnRlc3RzLnN1cHBvcnQuTGF1bmNoZXJBY3Rpdml0eSIpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tcG9uZW50TmFtZSBDT01NQU5EX1JFQ0VJVkVSID0KKyAgICAgICAgICAgIG5ldyBDb21wb25lbnROYW1lKAorICAgICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuY3RzLmxhdW5jaGVydGVzdHMuc3VwcG9ydCIsCisgICAgICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5jdHMubGF1bmNoZXJ0ZXN0cy5zdXBwb3J0LlF1aWV0TW9kZUNvbW1hbmRSZWNlaXZlciIpOworCisgICAgcHJpdmF0ZSBVc2VyTWFuYWdlciBtVXNlck1hbmFnZXI7CisgICAgcHJpdmF0ZSBVc2VySGFuZGxlIG1UYXJnZXRVc2VyOworICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKKyAgICBwcml2YXRlIFN0cmluZyBtT3JpZ2luYWxMYXVuY2hlcjsKKyAgICBwcml2YXRlIFVpRGV2aWNlIG1VaURldmljZTsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXR1cFVzZXJNYW5hZ2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1Db250ZXh0ID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0VGFyZ2V0Q29udGV4dCgpOworICAgICAgICBtVXNlck1hbmFnZXIgPSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKFVzZXJNYW5hZ2VyLmNsYXNzKTsKKyAgICB9CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgcmVhZFBhcmFtcygpIHsKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpOworICAgICAgICBCdW5kbGUgYXJndW1lbnRzID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0QXJndW1lbnRzKCk7CisgICAgICAgIFVzZXJNYW5hZ2VyIHVzZXJNYW5hZ2VyID0gY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKFVzZXJNYW5hZ2VyLmNsYXNzKTsKKyAgICAgICAgZmluYWwgaW50IHVzZXJTbiA9IEludGVnZXIucGFyc2VJbnQoYXJndW1lbnRzLmdldFN0cmluZyhQQVJBTV9UQVJHRVRfVVNFUikpOworICAgICAgICBtVGFyZ2V0VXNlciA9IHVzZXJNYW5hZ2VyLmdldFVzZXJGb3JTZXJpYWxOdW1iZXIodXNlclNuKTsKKyAgICAgICAgbU9yaWdpbmFsTGF1bmNoZXIgPSBhcmd1bWVudHMuZ2V0U3RyaW5nKFBBUkFNX09SSUdJTkFMX0RFRkFVTFRfTEFVTkNIRVIpOworICAgIH0KKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCB3YWtldXBEZXZpY2VBbmRVbmxvY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbVVpRGV2aWNlID0gVWlEZXZpY2UuZ2V0SW5zdGFuY2UoSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkpOworICAgICAgICBtVWlEZXZpY2Uud2FrZVVwKCk7CisgICAgICAgIG1VaURldmljZS5wcmVzc01lbnUoKTsKKyAgICB9CisKKyAgICBAQmVmb3JlCisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgcmV2ZXJ0VG9EZWZhdWx0TGF1bmNoZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KG1PcmlnaW5hbExhdW5jaGVyKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHNldERlZmF1bHRMYXVuY2hlcihJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKSwgbU9yaWdpbmFsTGF1bmNoZXIpOworICAgICAgICBzdGFydEFjdGl2aXR5U3luYyhtT3JpZ2luYWxMYXVuY2hlcik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJ5RW5hYmxlUXVpZXRNb2RlX2RlZmF1bHRGb3JlZ3JvdW5kTGF1bmNoZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc2V0VGVzdEFwcEFzRGVmYXVsdExhdW5jaGVyKCk7CisgICAgICAgIHN0YXJ0TGF1bmNoZXJBY3Rpdml0eUluVGVzdEFwcCgpOworCisgICAgICAgIEludGVudCBpbnRlbnQgPSB0cnlTZXRRdWlldE1vZGVFbmFibGVkKHRydWUpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJGYWlsZWQgdG8gcmVjZWl2ZSBBQ1RJT05fTUFOQUdFRF9QUk9GSUxFX1VOQVZBSUxBQkxFIGJyb2FkY2FzdCIsIGludGVudCk7CisgICAgICAgIGFzc2VydFRydWUobVVzZXJNYW5hZ2VyLmlzUXVpZXRNb2RlRW5hYmxlZChtVGFyZ2V0VXNlcikpOworCisgICAgICAgIGludGVudCA9IHRyeVNldFF1aWV0TW9kZUVuYWJsZWQoZmFsc2UpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJGYWlsZWQgdG8gcmVjZWl2ZSBBQ1RJT05fTUFOQUdFRF9QUk9GSUxFX0FWQUlMQUJMRSBicm9hZGNhc3QiLCBpbnRlbnQpOworICAgICAgICBhc3NlcnRGYWxzZShtVXNlck1hbmFnZXIuaXNRdWlldE1vZGVFbmFibGVkKG1UYXJnZXRVc2VyKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJ5RW5hYmxlUXVpZXRNb2RlX25vdEZvcmVncm91bmRMYXVuY2hlcigpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIHNldFRlc3RBcHBBc0RlZmF1bHRMYXVuY2hlcigpOworCisgICAgICAgIGFzc2VydFRocm93cyhTZWN1cml0eUV4Y2VwdGlvbi5jbGFzcywgKCkgLT4gdHJ5U2V0UXVpZXRNb2RlRW5hYmxlZCh0cnVlKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1Vc2VyTWFuYWdlci5pc1F1aWV0TW9kZUVuYWJsZWQobVRhcmdldFVzZXIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUcnlFbmFibGVRdWlldE1vZGVfbm90RGVmYXVsdExhdW5jaGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN0YXJ0TGF1bmNoZXJBY3Rpdml0eUluVGVzdEFwcCgpOworCisgICAgICAgIGFzc2VydFRocm93cyhTZWN1cml0eUV4Y2VwdGlvbi5jbGFzcywgKCkgLT4gdHJ5U2V0UXVpZXRNb2RlRW5hYmxlZCh0cnVlKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1Vc2VyTWFuYWdlci5pc1F1aWV0TW9kZUVuYWJsZWQobVRhcmdldFVzZXIpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEludGVudCB0cnlTZXRRdWlldE1vZGVFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBhY3Rpb24gPSBlbmFibGVkCisgICAgICAgICAgICAgICAgPyBJbnRlbnQuQUNUSU9OX01BTkFHRURfUFJPRklMRV9VTkFWQUlMQUJMRQorICAgICAgICAgICAgICAgIDogSW50ZW50LkFDVElPTl9NQU5BR0VEX1BST0ZJTEVfQVZBSUxBQkxFOworCisgICAgICAgIEJsb2NraW5nQnJvYWRjYXN0UmVjZWl2ZXIgcmVjZWl2ZXIgPQorICAgICAgICAgICAgICAgIG5ldyBCbG9ja2luZ0Jyb2FkY2FzdFJlY2VpdmVyKG1Db250ZXh0LCBhY3Rpb24pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVjZWl2ZXIucmVnaXN0ZXIoKTsKKworICAgICAgICAgICAgYm9vbGVhbiBub3RTaG93aW5nQ29uZmlybUNyZWRlbnRpYWwgPSBhc2tMYXVuY2hlclN1cHBvcnRBcHBUb1NldFF1aWV0TW9kZShlbmFibGVkKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobm90U2hvd2luZ0NvbmZpcm1DcmVkZW50aWFsKTsKKworICAgICAgICAgICAgcmV0dXJuIHJlY2VpdmVyLmF3YWl0Rm9yQnJvYWRjYXN0KCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICByZWNlaXZlci51bnJlZ2lzdGVyUXVpZXRseSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNrIGxhdW5jaGVyIHN1cHBvcnQgdGVzdCBhcHAgdG8gc2V0IHF1aWV0IG1vZGUgYnkgc2VuZGluZyBicm9hZGNhc3QuCisgICAgICogPHA+CisgICAgICogV2UgY2Fubm90IHNpbXBseSBtYWtlIHRoaXMgcGFja2FnZSB0aGUgbGF1bmNoZXIgYW5kIGNhbGwgdGhlIEFQSSBiZWNhdXNlIGluc3RydW1lbnRhdGlvbgorICAgICAqIHByb2Nlc3Mgd291bGQgYWx3YXlzIGNvbnNpZGVyZWQgdG8gYmUgaW4gdGhlIGZvcmVncm91bmQuIFRoZSB0cmljayBoZXJlIGlzIHRvIHNlbmQKKyAgICAgKiBicm9hZGNhc3QgdG8gYW5vdGhlciB0ZXN0IGFwcCB3aGljaCBpcyBsYXVuY2hlciBpdHNlbGYgYW5kIGNhbGwgdGhlIEFQSSB0aHJvdWdoIGl0LgorICAgICAqIFRoZSByZWNlaXZlciB3aWxsIHRoZW4gc2VuZCBiYWNrIHRoZSByZXN1bHQsIGFuZCBpdCBzaG91bGQgYmUgZWl0aGVyIHRydWUsIGZhbHNlIG9yCisgICAgICogc2VjdXJpdHktZXhjZXB0aW9uLgorICAgICAqIDxwPgorICAgICAqIEFsbCB0aGUgY29uc3RhbnRzIGRlZmluZWQgaGVyZSBzaG91bGQgYmUgYWxpZ25lZCB3aXRoCisgICAgICogY29tLmFuZHJvaWQuY3RzLmxhdW5jaGVydGVzdHMuc3VwcG9ydC5RdWlldE1vZGVDb21tYW5kUmVjZWl2ZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGFza0xhdW5jaGVyU3VwcG9ydEFwcFRvU2V0UXVpZXRNb2RlKGJvb2xlYW4gZW5hYmxlZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KCJ0b2dnbGVfcXVpZXRfbW9kZSIpOworICAgICAgICBpbnRlbnQuc2V0Q29tcG9uZW50KENPTU1BTkRfUkVDRUlWRVIpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoInF1aWV0X21vZGUiLCBlbmFibGVkKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKEludGVudC5FWFRSQV9VU0VSLCBtVGFyZ2V0VXNlcik7CisKKyAgICAgICAgLy8gQXNrIGxhdW5jaGVyIHN1cHBvcnQgYXBwIHRvIHNldCBxdWlldCBtb2RlIGJ5IHNlbmRpbmcgYnJvYWRjYXN0LgorICAgICAgICBMaW5rZWRCbG9ja2luZ1F1ZXVlPFN0cmluZz4gYmxvY2tpbmdRdWV1ZSA9IG5ldyBMaW5rZWRCbG9ja2luZ1F1ZXVlPD4oKTsKKyAgICAgICAgbUNvbnRleHQuc2VuZE9yZGVyZWRCcm9hZGNhc3QoaW50ZW50LCBudWxsLCBuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgICAgICAgICBibG9ja2luZ1F1ZXVlLm9mZmVyKGdldFJlc3VsdERhdGEoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0sIG51bGwsIDAsICIiLCBudWxsKTsKKworICAgICAgICAvLyBXYWl0IGZvciB0aGUgcmVzdWx0LgorICAgICAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisgICAgICAgICAgICAvLyBCcm9hZGNhc3Qgd29uJ3QgYmUgZGVsaXZlcmVkIHdoZW4gdGhlIGRldmljZSBpcyBzbGVlcGluZywgc28gd2FrZSB1cCB0aGUgZGV2aWNlCisgICAgICAgICAgICAvLyBpbiBiZXR3ZWVuIGVhY2ggYXR0ZW1wdC4KKyAgICAgICAgICAgIHdha2V1cERldmljZUFuZFVubG9jaygpOworICAgICAgICAgICAgcmVzdWx0ID0gYmxvY2tpbmdRdWV1ZS5wb2xsKDEwLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkocmVzdWx0KSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUGFyc2UgdGhlIHJlc3VsdC4KKyAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXN1bHQpOworICAgICAgICBpZiAoInRydWUiLmVxdWFsc0lnbm9yZUNhc2UocmVzdWx0KSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoImZhbHNlIi5lcXVhbHNJZ25vcmVDYXNlKHJlc3VsdCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIGlmICgic2VjdXJpdHktZXhjZXB0aW9uIi5lcXVhbHMocmVzdWx0KSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVW5leHBlY3RlZCByZXN1bHQgOiAiICsgcmVzdWx0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc3RhcnRBY3Rpdml0eVN5bmMoU3RyaW5nIGFjdGl2aXR5KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbVVpRGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoImFtIHN0YXJ0IC1XIC1uICIgKyBhY3Rpdml0eSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgdGhlIGxhdW5jaGVyIGFjdGl2aXR5IGluIHRoZSB0ZXN0IGFwcCB0byBtYWtlIGl0IGZvcmVncm91bmQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0TGF1bmNoZXJBY3Rpdml0eUluVGVzdEFwcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdGFydEFjdGl2aXR5U3luYyhMQVVOQ0hFUl9BQ1RJVklUWS5mbGF0dGVuVG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldFRlc3RBcHBBc0RlZmF1bHRMYXVuY2hlcigpIHsKKyAgICAgICAgc2V0RGVmYXVsdExhdW5jaGVyKAorICAgICAgICAgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLAorICAgICAgICAgICAgICAgIExBVU5DSEVSX0FDVElWSVRZLmZsYXR0ZW5Ub1N0cmluZygpKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9MYXVuY2hlclRlc3RzU3VwcG9ydC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0xhdW5jaGVyVGVzdHNTdXBwb3J0L0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggZGM3MTI2NC4uMTRhYmQxYSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0xhdW5jaGVyVGVzdHNTdXBwb3J0L0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0xhdW5jaGVyVGVzdHNTdXBwb3J0L0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTI2LDUgKzI2LDE5IEBACiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLmN0cy5sYXVuY2hlcnRlc3RzLnN1cHBvcnQuUkVHSVNURVJfQ0FMTEJBQ0siIC8+CiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgIDwvc2VydmljZT4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuTGF1bmNoZXJBY3Rpdml0eSI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5IT01FIi8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuREVGQVVMVCIvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxyZWNlaXZlciBhbmRyb2lkOm5hbWU9Ii5RdWlldE1vZGVDb21tYW5kUmVjZWl2ZXIiIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9InRvZ2dsZV9xdWlldF9tb2RlIi8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvcmVjZWl2ZXI+CiAgICAgPC9hcHBsaWNhdGlvbj4KIDwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvTGF1bmNoZXJUZXN0c1N1cHBvcnQvc3JjL2NvbS9hbmRyb2lkL2N0cy9sYXVuY2hlcnRlc3RzL3N1cHBvcnQvTGF1bmNoZXJBY3Rpdml0eS5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0xhdW5jaGVyVGVzdHNTdXBwb3J0L3NyYy9jb20vYW5kcm9pZC9jdHMvbGF1bmNoZXJ0ZXN0cy9zdXBwb3J0L0xhdW5jaGVyQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDhlNDZjCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0xhdW5jaGVyVGVzdHNTdXBwb3J0L3NyYy9jb20vYW5kcm9pZC9jdHMvbGF1bmNoZXJ0ZXN0cy9zdXBwb3J0L0xhdW5jaGVyQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuY3RzLmxhdW5jaGVydGVzdHMuc3VwcG9ydDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworCitwdWJsaWMgY2xhc3MgTGF1bmNoZXJBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9MYXVuY2hlclRlc3RzU3VwcG9ydC9zcmMvY29tL2FuZHJvaWQvY3RzL2xhdW5jaGVydGVzdHMvc3VwcG9ydC9RdWlldE1vZGVDb21tYW5kUmVjZWl2ZXIuamF2YSBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9MYXVuY2hlclRlc3RzU3VwcG9ydC9zcmMvY29tL2FuZHJvaWQvY3RzL2xhdW5jaGVydGVzdHMvc3VwcG9ydC9RdWlldE1vZGVDb21tYW5kUmVjZWl2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGE5YWJiCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL0xhdW5jaGVyVGVzdHNTdXBwb3J0L3NyYy9jb20vYW5kcm9pZC9jdHMvbGF1bmNoZXJ0ZXN0cy9zdXBwb3J0L1F1aWV0TW9kZUNvbW1hbmRSZWNlaXZlci5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5jdHMubGF1bmNoZXJ0ZXN0cy5zdXBwb3J0OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5Vc2VySGFuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuVXNlck1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworLyoqCisgKiBSdW5zIHtAbGluayBVc2VyTWFuYWdlciNyZXF1ZXN0UXVpZXRNb2RlRW5hYmxlZChib29sZWFuLCBVc2VySGFuZGxlKX0gQVBJcyBieSByZWNlaXZpbmcKKyAqIGJyb2FkY2FzdCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGJhY2sgdG8gdGhlIGJyb2FkY2FzdCBzZW5kZXIuCisgKi8KK3B1YmxpYyBjbGFzcyBRdWlldE1vZGVDb21tYW5kUmVjZWl2ZXIgZXh0ZW5kcyBCcm9hZGNhc3RSZWNlaXZlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJRdWlldE1vZGVSZWNlaXZlciI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9UT0dHTEVfUVVJRVRfTU9ERSA9ICJ0b2dnbGVfcXVpZXRfbW9kZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1FVSUVUX01PREUgPSAicXVpZXRfbW9kZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9TRUNVUklUWV9FWENFUFRJT04gPSAic2VjdXJpdHktZXhjZXB0aW9uIjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgaWYgKCFBQ1RJT05fVE9HR0xFX1FVSUVUX01PREUuZXF1YWxzKGludGVudC5nZXRBY3Rpb24oKSkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBVc2VyTWFuYWdlciB1c2VyTWFuYWdlciA9IGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShVc2VyTWFuYWdlci5jbGFzcyk7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gZW5hYmxlUXVpZXRNb2RlID0gaW50ZW50LmdldEJvb2xlYW5FeHRyYShFWFRSQV9RVUlFVF9NT0RFLCBmYWxzZSk7CisgICAgICAgIGZpbmFsIFVzZXJIYW5kbGUgdGFyZ2V0VXNlciA9IGludGVudC5nZXRQYXJjZWxhYmxlRXh0cmEoSW50ZW50LkVYVFJBX1VTRVIpOworICAgICAgICBTdHJpbmcgcmVzdWx0OworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBzZXRRdWlldE1vZGVSZXN1bHQgPQorICAgICAgICAgICAgICAgICAgICB1c2VyTWFuYWdlci5yZXF1ZXN0UXVpZXRNb2RlRW5hYmxlZChlbmFibGVRdWlldE1vZGUsIHRhcmdldFVzZXIpOworICAgICAgICAgICAgcmVzdWx0ID0gQm9vbGVhbi50b1N0cmluZyhzZXRRdWlldE1vZGVSZXN1bHQpOworICAgICAgICAgICAgTG9nLmkoVEFHLCAidHJ5U2V0UXVpZXRNb2RlRW5hYmxlZCByZXR1cm5zICIgKyBzZXRRdWlldE1vZGVSZXN1bHQpOworICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgTG9nLmkoVEFHLCAidHJ5U2V0UXVpZXRNb2RlRW5hYmxlZCB0aHJvd3Mgc2VjdXJpdHkgZXhjZXB0aW9uIiwgZXgpOworICAgICAgICAgICAgcmVzdWx0ID0gUkVTVUxUX1NFQ1VSSVRZX0VYQ0VQVElPTjsKKyAgICAgICAgfQorICAgICAgICBzZXRSZXN1bHREYXRhKHJlc3VsdCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL01hbmFnZWRQcm9maWxlL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvTWFuYWdlZFByb2ZpbGUvQW5kcm9pZC5tawppbmRleCBiOTQ3YTYxLi41ZTRhNTc1IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvTWFuYWdlZFByb2ZpbGUvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvTWFuYWdlZFByb2ZpbGUvQW5kcm9pZC5tawpAQCAtMjQsMjAgKzI0LDIzIEBACiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIAotTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lciBjdHMtanVuaXQKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIuc3R1YnMgY3RzLWp1bml0IGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCisKK0xPQ0FMX1VTRV9BQVBUMiA6PSB0cnVlCiAKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA9IFwKLQlhbmRyb2lkLXN1cHBvcnQtdjQgXAotCWN0c3Rlc3RydW5uZXIgXAotCWNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwgXAorCWN0c3Rlc3RydW5uZXItYXh0IFwKKwljb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBcCiAJdWItdWlhdXRvbWF0b3IgXAotCWFuZHJvaWQtc3VwcG9ydC10ZXN0IFwKLQlndWF2YSBcCi0JbGVnYWN5LWFuZHJvaWQtdGVzdAorCWFuZHJvaWR4LnRlc3QucnVsZXMgXAorCWd1YXZhCisKK0xPQ0FMX1NUQVRJQ19BTkRST0lEX0xJQlJBUklFUyA6PSBcCisgICAgYW5kcm9pZHgubGVnYWN5X2xlZ2FjeS1zdXBwb3J0LXY0CiAKIExPQ0FMX1NES19WRVJTSU9OIDo9IHRlc3RfY3VycmVudAogCiAjIHRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0Ci1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBhcmN0cyBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKIAogaW5jbHVkZSAkKEJVSUxEX0NUU19QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL01hbmFnZWRQcm9maWxlL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvTWFuYWdlZFByb2ZpbGUvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCAwNWViYWMwLi43NmU4NzJmIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvTWFuYWdlZFByb2ZpbGUvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvTWFuYWdlZFByb2ZpbGUvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtNzcsMTIgKzc3LDIzIEBACiAgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuREVGQVVMVCIvPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5jdHMubWFuYWdlZHByb2ZpbGUuQUNUSU9OX1RFU1RfTUFOQUdFRF9BQ1RJVklUWSIgLz4KICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uU0VORCIgLz4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlNFTkRfTVVMVElQTEUiIC8+CisgICAgICAgICAgICAgICAgPGRhdGEgYW5kcm9pZDptaW1lVHlwZT0iKi8qIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkRFRkFVTFQiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5QcmltYXJ5VXNlckFjdGl2aXR5Ij4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkRFRkFVTFQiLz4KICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuY3RzLm1hbmFnZWRwcm9maWxlLkFDVElPTl9URVNUX1BSSU1BUllfQUNUSVZJVFkiIC8+CiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgICAgICA8IS0tIENhdGNoIEFDVElPTl9QSUNLIGluIGNhc2UgdGhlcmUgaXMgbm8gb3RoZXIgYXBwIGhhbmRpbmcgaXQgLS0+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlBJQ0siIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuREVGQVVMVCIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KICAgICAgICAgPC9hY3Rpdml0eT4KICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLkFsbFVzZXJzQWN0aXZpdHkiPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CkBAIC0xNDUsNiArMTU2LDExIEBACiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLldlYlZpZXdBY3Rpdml0eSIKKyAgICAgICAgICAgIGFuZHJvaWQ6cHJvY2Vzcz0iOnRlc3RQcm9jZXNzIi8+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLlRpbWVvdXRBY3Rpdml0eSIgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIvPgorCiAgICAgICAgIDxzZXJ2aWNlCiAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9Ii5Dcm9zc1Byb2ZpbGVOb3RpZmljYXRpb25MaXN0ZW5lclNlcnZpY2UiCiAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJDcm9zc1Byb2ZpbGVOb3RpZmljYXRpb25MaXN0ZW5lclNlcnZpY2UiCkBAIC0xNjksOSArMTg1LDIyIEBACiAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICA8L3JlY2VpdmVyPgogCisgICAgICAgIDxyZWNlaXZlciBhbmRyb2lkOm5hbWU9Ii5Mb2NrUHJvZmlsZVJlY2VpdmVyIj4KKyAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5jdHMubWFuYWdlZHByb2ZpbGUuTE9DS19QUk9GSUxFIiAvPgorICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9yZWNlaXZlcj4KKworICAgICAgICA8cmVjZWl2ZXIgYW5kcm9pZDpuYW1lPSIuV2lwZURhdGFSZWNlaXZlciI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuY3RzLm1hbmFnZWRwcm9maWxlLldJUEVfREFUQSIgLz4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuY3RzLm1hbmFnZWRwcm9maWxlLldJUEVfREFUQV9XSVRIX1JFQVNPTiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9yZWNlaXZlcj4KKwogICAgIDwvYXBwbGljYXRpb24+CiAKLSAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5jdHMubWFuYWdlZHByb2ZpbGUiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJNYW5hZ2VkIFByb2ZpbGUgQ1RTIFRlc3RzIi8+CiA8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL01hbmFnZWRQcm9maWxlL3NyYy9jb20vYW5kcm9pZC9jdHMvbWFuYWdlZHByb2ZpbGUvQmFzZU1hbmFnZWRQcm9maWxlVGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL01hbmFnZWRQcm9maWxlL3NyYy9jb20vYW5kcm9pZC9jdHMvbWFuYWdlZHByb2ZpbGUvQmFzZU1hbmFnZWRQcm9maWxlVGVzdC5qYXZhCmluZGV4IDkwNWY3ZDUuLmYxMDgyMmMgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9NYW5hZ2VkUHJvZmlsZS9zcmMvY29tL2FuZHJvaWQvY3RzL21hbmFnZWRwcm9maWxlL0Jhc2VNYW5hZ2VkUHJvZmlsZVRlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvTWFuYWdlZFByb2ZpbGUvc3JjL2NvbS9hbmRyb2lkL2N0cy9tYW5hZ2VkcHJvZmlsZS9CYXNlTWFuYWdlZFByb2ZpbGVUZXN0LmphdmEKQEAgLTE5LDcgKzE5LDYgQEAKIGltcG9ydCBhbmRyb2lkLmFwcC5hZG1pbi5EZXZpY2VQb2xpY3lNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLlVpRGV2aWNlOwogaW1wb3J0IGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0Q2FzZTsKIAogLyoqCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvTWFuYWdlZFByb2ZpbGUvc3JjL2NvbS9hbmRyb2lkL2N0cy9tYW5hZ2VkcHJvZmlsZS9Dcm9zc1Byb2ZpbGVOb3RpZmljYXRpb25MaXN0ZW5lclNlcnZpY2UuamF2YSBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9NYW5hZ2VkUHJvZmlsZS9zcmMvY29tL2FuZHJvaWQvY3RzL21hbmFnZWRwcm9maWxlL0Nyb3NzUHJvZmlsZU5vdGlmaWNhdGlvbkxpc3RlbmVyU2VydmljZS5qYXZhCmluZGV4IDlhMTc3MzMuLjJhMDk0ZTYgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9NYW5hZ2VkUHJvZmlsZS9zcmMvY29tL2FuZHJvaWQvY3RzL21hbmFnZWRwcm9maWxlL0Nyb3NzUHJvZmlsZU5vdGlmaWNhdGlvbkxpc3RlbmVyU2VydmljZS5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9NYW5hZ2VkUHJvZmlsZS9zcmMvY29tL2FuZHJvaWQvY3RzL21hbmFnZWRwcm9maWxlL0Nyb3NzUHJvZmlsZU5vdGlmaWNhdGlvbkxpc3RlbmVyU2VydmljZS5qYXZhCkBAIC0yMiw3ICsyMiw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLnNlcnZpY2Uubm90aWZpY2F0aW9uLk5vdGlmaWNhdGlvbkxpc3RlbmVyU2VydmljZTsKIGltcG9ydCBhbmRyb2lkLnNlcnZpY2Uubm90aWZpY2F0aW9uLlN0YXR1c0Jhck5vdGlmaWNhdGlvbjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQuY29udGVudC5Mb2NhbEJyb2FkY2FzdE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZHgubG9jYWxicm9hZGNhc3RtYW5hZ2VyLmNvbnRlbnQuTG9jYWxCcm9hZGNhc3RNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIHB1YmxpYyBjbGFzcyBDcm9zc1Byb2ZpbGVOb3RpZmljYXRpb25MaXN0ZW5lclNlcnZpY2UgZXh0ZW5kcyBOb3RpZmljYXRpb25MaXN0ZW5lclNlcnZpY2UgewpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL01hbmFnZWRQcm9maWxlL3NyYy9jb20vYW5kcm9pZC9jdHMvbWFuYWdlZHByb2ZpbGUvQ3VycmVudEFwaUhlbHBlci5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL01hbmFnZWRQcm9maWxlL3NyYy9jb20vYW5kcm9pZC9jdHMvbWFuYWdlZHByb2ZpbGUvQ3VycmVudEFwaUhlbHBlci5qYXZhCmluZGV4IDU1MGYxZDMuLjRlMmY1OGYgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9NYW5hZ2VkUHJvZmlsZS9zcmMvY29tL2FuZHJvaWQvY3RzL21hbmFnZWRwcm9maWxlL0N1cnJlbnRBcGlIZWxwZXIuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvTWFuYWdlZFByb2ZpbGUvc3JjL2NvbS9hbmRyb2lkL2N0cy9tYW5hZ2VkcHJvZmlsZS9DdXJyZW50QXBpSGVscGVyLmphdmEKQEAgLTE2OCw2ICsxNjgsOSBAQAogICAgICAgICAgICAgdHlwZU5hbWUgPSB0eXBlTmFtZS5zdWJzdHJpbmcoMCwgdHlwZU5hbWUubGVuZ3RoKCkgLSAyKTsKICAgICAgICAgfQogCisgICAgICAgIC8vIFJlc29sdmUgaW5uZXIgY2xhc3NlcworICAgICAgICB0eXBlTmFtZSA9IHR5cGVOYW1lLnJlcGxhY2VBbGwoIihbQS1aXS4qKVxcLiIsICIkMVxcJCIpOworCiAgICAgICAgIC8vIFJlbW92ZSB0eXBlIHBhcmFtZXRlcnMsIGlmIGFueQogICAgICAgICB0eXBlTmFtZSA9IHR5cGVOYW1lLnJlcGxhY2VBbGwoIjwuKj4kIiwgIiIpOwogCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvTWFuYWdlZFByb2ZpbGUvc3JjL2NvbS9hbmRyb2lkL2N0cy9tYW5hZ2VkcHJvZmlsZS9EaXNhbGxvd1NoYXJpbmdJbnRvUHJvZmlsZVRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9NYW5hZ2VkUHJvZmlsZS9zcmMvY29tL2FuZHJvaWQvY3RzL21hbmFnZWRwcm9maWxlL0Rpc2FsbG93U2hhcmluZ0ludG9Qcm9maWxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMWY4OGUKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvTWFuYWdlZFByb2ZpbGUvc3JjL2NvbS9hbmRyb2lkL2N0cy9tYW5hZ2VkcHJvZmlsZS9EaXNhbGxvd1NoYXJpbmdJbnRvUHJvZmlsZVRlc3QuamF2YQpAQCAtMCwwICsxLDIxOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY3RzLm1hbmFnZWRwcm9maWxlOworCitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmN0cy5tYW5hZ2VkcHJvZmlsZS5CYXNlTWFuYWdlZFByb2ZpbGVUZXN0LkFETUlOX1JFQ0VJVkVSX0NPTVBPTkVOVDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLmFkbWluLkRldmljZVBvbGljeU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlJlc29sdmVJbmZvOworaW1wb3J0IGFuZHJvaWQub3MuVXNlck1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NZWRpYVN0b3JlOworaW1wb3J0IGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworLyoqCisgKiBWZXJpZnkgdGhhdCBjZXJ0YWluIGNyb3NzIHByb2ZpbGUgaW50ZW50IGZpbHRlcnMgYXJlIGRpc2FsbG93ZWQgd2hlbiB0aGUgZGV2aWNlIGFkbWluIHNldHMKKyAqIERJU0FMTE9XX1NIQVJFX0lOVE9fTUFOQUdFRF9QUk9GSUxFIHJlc3RyaWN0aW9uLgorICogPHA+CisgKiBUaGUgd2F5IHdlIGNoZWNrIGlmIGEgcGFydGljdWxhciBjcm9zcyBwcm9maWxlIGludGVudCBmaWx0ZXIgaXMgZGlzYWxsb3dlZCBpcyBieSB0cnlpbmcgdG8KKyAqIHJlc29sdmUgYW4gZXhhbXBsZSBpbnRlbnQgdGhhdCBtYXRjaGVzIHRoZSBpbnRlbnQgZmlsdGVyLiBUaGUgY3Jvc3MgcHJvZmlsZSBmaWx0ZXIgZnVuY3Rpb25zCisgKiBjb3JyZWN0bHkgaWYgYW5kIG9ubHkgaWYgdGhlIHJlc29sdXRpb24gcmVzdWx0IGNvbnRhaW5zIGEgc3lzdGVtIGludGVudCBmb3J3YXJkZXIgYWN0aXZpdHkKKyAqIChjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuSW50ZW50Rm9yd2FyZGVyQWN0aXZpdHkpLCB3aGljaCBpcyB0aGUgZnJhbWV3b3JrJ3MgbWVjaGFuaXNtIHRvCisgKiB0cmFtcG9saW5lIGludGVudHMgYWNyb3NzIHByb2ZpbGVzLiBJbnN0ZWFkIG9mIGhhcmRjb2RpbmcgdGhlIHN5c3RlbSdzIGludGVudCBmb3J3YXJkZXIgYWN0aXZpdHksCisgKiB3ZSByZXRyaWV2ZSBpdCBwcm9ncmFtbWF0aWNhbGx5IGJ5IHJlc29sdmluZyBrbm93biBjcm9zcyBwcm9maWxlIGludGVudHMgc3BlY2lmaWNhbGx5IHNldCB1cCBmb3IKKyAqIHRoaXMgcHVycG9zZToge0BsaW5rICNLTk9XTl9BQ1RJT05fVE9fUFJPRklMRX0gYW5kIHtAbGluayAjS05PV05fQUNUSU9OX1RPX1BFUlNPTkFMfQorICovCitwdWJsaWMgY2xhc3MgRGlzYWxsb3dTaGFyaW5nSW50b1Byb2ZpbGVUZXN0IGV4dGVuZHMgSW5zdHJ1bWVudGF0aW9uVGVzdENhc2UgeworCisgICAgLy8gVGhlc2UgYXJlIHRoZSBkYXRhIHNoYXJpbmcgaW50ZW50cyB3aGljaCBjYW4gYmUgZm9yd2FyZGVkIHRvIHRoZSBtYW5hZ2VkIHByb2ZpbGUuCisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PEludGVudD4gc2hhcmluZ0ludGVudHNUb1Byb2ZpbGUgPSBBcnJheXMuYXNMaXN0KAorICAgICAgICAgICAgbmV3IEludGVudChJbnRlbnQuQUNUSU9OX1NFTkQpLnNldFR5cGUoIiovKiIpLAorICAgICAgICAgICAgbmV3IEludGVudChJbnRlbnQuQUNUSU9OX1NFTkRfTVVMVElQTEUpLnNldFR5cGUoIiovKiIpKTsKKworICAgIC8vIFRoZXNlIGFyZSB0aGUgZGF0YSBzaGFyaW5nIGludGVudHMgd2hpY2ggY2FuIGJlIGZvcndhcmRlZCB0byB0aGUgcHJpbWFyeSBwcm9maWxlLgorICAgIHByaXZhdGUgZmluYWwgTGlzdDxJbnRlbnQ+IHNoYXJpbmdJbnRlbnRzVG9QZXJzb25hbCA9IG5ldyBBcnJheUxpc3Q8PihBcnJheXMuYXNMaXN0KAorICAgICAgICAgICAgbmV3IEludGVudChJbnRlbnQuQUNUSU9OX0dFVF9DT05URU5UKS5zZXRUeXBlKCIqLyoiKS5hZGRDYXRlZ29yeSgKKyAgICAgICAgICAgICAgICAgICAgSW50ZW50LkNBVEVHT1JZX09QRU5BQkxFKSwKKyAgICAgICAgICAgIG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9PUEVOX0RPQ1VNRU5UKS5zZXRUeXBlKCIqLyoiKS5hZGRDYXRlZ29yeSgKKyAgICAgICAgICAgICAgICAgICAgSW50ZW50LkNBVEVHT1JZX09QRU5BQkxFKSwKKyAgICAgICAgICAgIG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9QSUNLKS5zZXRUeXBlKCIqLyoiKS5hZGRDYXRlZ29yeSgKKyAgICAgICAgICAgICAgICAgICAgSW50ZW50LkNBVEVHT1JZX0RFRkFVTFQpLAorICAgICAgICAgICAgbmV3IEludGVudChJbnRlbnQuQUNUSU9OX1BJQ0spLmFkZENhdGVnb3J5KEludGVudC5DQVRFR09SWV9ERUZBVUxUKSkpOworCisgICAgLy8gVGhlc2UgYXJlIHRoZSBkYXRhIHNoYXJpbmcgaW50ZW50cyB3aGljaCBjYW4gYmUgZm9yd2FyZGVkIHRvIHRoZSBwcmltYXJ5IHByb2ZpbGUsCisgICAgLy8gaWYgdGhlIGRldmljZSBzdXBwb3J0cyBGRUFUVVJFX0NBTUVSQQorICAgIHByaXZhdGUgZmluYWwgTGlzdDxJbnRlbnQ+IHNoYXJpbmdJbnRlbnRzVG9QZXJzb25hbElmQ2FtZXJhRXhpc3RzID0gQXJyYXlzLmFzTGlzdCgKKyAgICAgICAgICAgIG5ldyBJbnRlbnQoTWVkaWFTdG9yZS5BQ1RJT05fSU1BR0VfQ0FQVFVSRSksCisgICAgICAgICAgICBuZXcgSW50ZW50KE1lZGlhU3RvcmUuQUNUSU9OX1ZJREVPX0NBUFRVUkUpLAorICAgICAgICAgICAgbmV3IEludGVudChNZWRpYVN0b3JlLklOVEVOVF9BQ1RJT05fU1RJTExfSU1BR0VfQ0FNRVJBKSwKKyAgICAgICAgICAgIG5ldyBJbnRlbnQoTWVkaWFTdG9yZS5JTlRFTlRfQUNUSU9OX1ZJREVPX0NBTUVSQSksCisgICAgICAgICAgICBuZXcgSW50ZW50KE1lZGlhU3RvcmUuQUNUSU9OX0lNQUdFX0NBUFRVUkVfU0VDVVJFKSwKKyAgICAgICAgICAgIG5ldyBJbnRlbnQoTWVkaWFTdG9yZS5JTlRFTlRfQUNUSU9OX1NUSUxMX0lNQUdFX0NBTUVSQV9TRUNVUkUpKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLTk9XTl9BQ1RJT05fVE9fUFJPRklMRSA9IE1hbmFnZWRQcm9maWxlQWN0aXZpdHkuQUNUSU9OOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLTk9XTl9BQ1RJT05fVE9fUEVSU09OQUwgPSBQcmltYXJ5VXNlckFjdGl2aXR5LkFDVElPTjsKKworICAgIHByb3RlY3RlZCBDb250ZXh0IG1Db250ZXh0OworICAgIHByb3RlY3RlZCBEZXZpY2VQb2xpY3lNYW5hZ2VyIG1EZXZpY2VQb2xpY3lNYW5hZ2VyOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKworICAgICAgICBtQ29udGV4dCA9IGdldEluc3RydW1lbnRhdGlvbigpLmdldENvbnRleHQoKTsKKyAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIgPSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKERldmljZVBvbGljeU1hbmFnZXIuY2xhc3MpOworICAgICAgICBhc3NlcnROb3ROdWxsKG1EZXZpY2VQb2xpY3lNYW5hZ2VyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gdG9nZ2xlIHRoZSByZXN0cmljdGlvbiB0byByZXNldCBzeXN0ZW0ncyBidWlsdC1pbiBjcm9zcyBwcm9maWxlIGludGVudCBmaWx0ZXJzLAorICAgICAgICAvLyBzaW11bGF0aW5nIHRoZSBkZWZhdWx0IHN0YXRlIG9mIGEgd29yayBwcm9maWxlIGNyZWF0ZWQgYnkgTWFuYWdlZFByb3Zpc2lvbmluZworICAgICAgICB0ZXN0RGlzYWJsZVNoYXJpbmdJbnRvUHJvZmlsZSgpOworICAgICAgICB0ZXN0RW5hYmxlU2hhcmluZ0ludG9Qcm9maWxlKCk7CisKKyAgICAgICAgUGFja2FnZU1hbmFnZXIgcG0gPSBtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICBpZiAocG0uaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX0NBTUVSQSkpIHsKKyAgICAgICAgICAgIHNoYXJpbmdJbnRlbnRzVG9QZXJzb25hbC5hZGRBbGwoc2hhcmluZ0ludGVudHNUb1BlcnNvbmFsSWZDYW1lcmFFeGlzdHMpOworICAgICAgICB9CisKKyAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuY2xlYXJDcm9zc1Byb2ZpbGVJbnRlbnRGaWx0ZXJzKEFETUlOX1JFQ0VJVkVSX0NPTVBPTkVOVCk7CisgICAgICAgIC8vIFNldCB1cCBjcm9zcyBwcm9maWxlIGludGVudCBmaWx0ZXJzIHNvIHdlIGNhbiByZXNvbHZlIHRoZXNlIHRvIGZpbmQgb3V0IGZyYW1ld29yaydzCisgICAgICAgIC8vIGludGVudCBmb3J3YXJkZXIgYWN0aXZpdHkgYXMgZ3JvdW5kIHRydXRoCisgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmFkZENyb3NzUHJvZmlsZUludGVudEZpbHRlcihBRE1JTl9SRUNFSVZFUl9DT01QT05FTlQsCisgICAgICAgICAgICAgICAgbmV3IEludGVudEZpbHRlcihLTk9XTl9BQ1RJT05fVE9fUEVSU09OQUwpLAorICAgICAgICAgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIuRkxBR19QQVJFTlRfQ0FOX0FDQ0VTU19NQU5BR0VEKTsKKyAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuYWRkQ3Jvc3NQcm9maWxlSW50ZW50RmlsdGVyKEFETUlOX1JFQ0VJVkVSX0NPTVBPTkVOVCwKKyAgICAgICAgICAgICAgICBuZXcgSW50ZW50RmlsdGVyKEtOT1dOX0FDVElPTl9UT19QUk9GSUxFKSwKKyAgICAgICAgICAgICAgICBEZXZpY2VQb2xpY3lNYW5hZ2VyLkZMQUdfTUFOQUdFRF9DQU5fQUNDRVNTX1BBUkVOVCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBzaGFyaW5nIGluaXRpYXRlZCBmcm9tIHRoZSBwZXJzb25hbCBzaWRlIGFyZSBtYWlubHkgZHJpdmVuIGZyb20gdGhlIGhvc3Qgc2lkZSwgc2VlCisgICAgICogTWFuYWdlZFByb2ZpbGVUZXN0LnRlc3REaXNhbGxvd1NoYXJpbmdJbnRvUHJvZmlsZUZyb21QZXJzb25hbCgpIFNlZSBqYXZhZG9jIG9mCisgICAgICoge0BsaW5rICNEaXNhbGxvd1NoYXJpbmdJbnRvUHJvZmlsZVRlc3R9IGNsYXNzIGZvciB0aGUgbWVjaGFuaXNtIGJlaGluZCB0aGlzIHRlc3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFNoYXJpbmdGcm9tUGVyc29uYWxGYWlscygpIHsKKyAgICAgICAgUmVzb2x2ZUluZm8gdG9Qcm9maWxlRm9yd2FyZGVySW5mbyA9IGdldEludGVudEZvcndhcmRlcigKKyAgICAgICAgICAgICAgICBuZXcgSW50ZW50KEtOT1dOX0FDVElPTl9UT19QUk9GSUxFKSk7CisgICAgICAgIGFzc2VydENyb3NzUHJvZmlsZUludGVudHNSZXNvbHZhYmlsaXR5KHNoYXJpbmdJbnRlbnRzVG9Qcm9maWxlLCB0b1Byb2ZpbGVGb3J3YXJkZXJJbmZvLAorICAgICAgICAgICAgICAgIC8qIGV4cGVjdEZvcndhcmRhYmxlICovIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2hhcmluZ0Zyb21QZXJzb25hbFN1Y2NlZWRzKCkgeworICAgICAgICBSZXNvbHZlSW5mbyB0b1Byb2ZpbGVGb3J3YXJkZXJJbmZvID0gZ2V0SW50ZW50Rm9yd2FyZGVyKAorICAgICAgICAgICAgICAgIG5ldyBJbnRlbnQoS05PV05fQUNUSU9OX1RPX1BST0ZJTEUpKTsKKyAgICAgICAgYXNzZXJ0Q3Jvc3NQcm9maWxlSW50ZW50c1Jlc29sdmFiaWxpdHkoc2hhcmluZ0ludGVudHNUb1Byb2ZpbGUsIHRvUHJvZmlsZUZvcndhcmRlckluZm8sCisgICAgICAgICAgICAgICAgLyogZXhwZWN0Rm9yd2FyZGFibGUgKi8gdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBzaGFyaW5nIGluaXRpYXRlZCBmcm9tIHRoZSBwcm9maWxlIHNpZGUgaS5lLiB1c2VyIHRyaWVzIHRvIHBpY2sgdXAgcGVyc29uYWwgZGF0YSB3aXRoaW4KKyAgICAgKiBhIHdvcmsgYXBwLiBTZWUgamF2YWRvYyBvZiB7QGxpbmsgI0Rpc2FsbG93U2hhcmluZ0ludG9Qcm9maWxlVGVzdH0gY2xhc3MgZm9yIHRoZSBtZWNoYW5pc20KKyAgICAgKiBiZWhpbmQgdGhpcyB0ZXN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTaGFyaW5nRnJvbVByb2ZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdFNldFVwKCk7CisgICAgICAgIFJlc29sdmVJbmZvIHRvUGVyc29uYWxGb3J3YXJkZXJJbmZvID0gZ2V0SW50ZW50Rm9yd2FyZGVyKAorICAgICAgICAgICAgICAgIG5ldyBJbnRlbnQoS05PV05fQUNUSU9OX1RPX1BFUlNPTkFMKSk7CisKKyAgICAgICAgdGVzdERpc2FibGVTaGFyaW5nSW50b1Byb2ZpbGUoKTsKKyAgICAgICAgYXNzZXJ0Q3Jvc3NQcm9maWxlSW50ZW50c1Jlc29sdmFiaWxpdHkoc2hhcmluZ0ludGVudHNUb1BlcnNvbmFsLCB0b1BlcnNvbmFsRm9yd2FyZGVySW5mbywKKyAgICAgICAgICAgICAgICAvKiBleHBlY3RGb3J3YXJkYWJsZSAqLyBmYWxzZSk7CisgICAgICAgIHRlc3RFbmFibGVTaGFyaW5nSW50b1Byb2ZpbGUoKTsKKyAgICAgICAgYXNzZXJ0Q3Jvc3NQcm9maWxlSW50ZW50c1Jlc29sdmFiaWxpdHkoc2hhcmluZ0ludGVudHNUb1BlcnNvbmFsLCB0b1BlcnNvbmFsRm9yd2FyZGVySW5mbywKKyAgICAgICAgICAgICAgICAvKiBleHBlY3RGb3J3YXJkYWJsZSAqLyB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW5hYmxlU2hhcmluZ0ludG9Qcm9maWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHNldFNoYXJpbmdFbmFibGVkKHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3REaXNhYmxlU2hhcmluZ0ludG9Qcm9maWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHNldFNoYXJpbmdFbmFibGVkKGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0U2hhcmluZ0VuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICAgICAgQnJvYWRjYXN0UmVjZWl2ZXIgcmVjZWl2ZXIgPSBuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihEZXZpY2VQb2xpY3lNYW5hZ2VyLkFDVElPTl9EQVRBX1NIQVJJTkdfUkVTVFJJQ1RJT05fQVBQTElFRCk7CisgICAgICAgIG1Db250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIocmVjZWl2ZXIsIGZpbHRlcik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoZW5hYmxlZCkgeworICAgICAgICAgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmNsZWFyVXNlclJlc3RyaWN0aW9uKEFETUlOX1JFQ0VJVkVSX0NPTVBPTkVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJNYW5hZ2VyLkRJU0FMTE9XX1NIQVJFX0lOVE9fTUFOQUdFRF9QUk9GSUxFKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuYWRkVXNlclJlc3RyaWN0aW9uKEFETUlOX1JFQ0VJVkVSX0NPTVBPTkVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJNYW5hZ2VyLkRJU0FMTE9XX1NIQVJFX0lOVE9fTUFOQUdFRF9QUk9GSUxFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFdhaXQgZm9yIHRoZSByZXN0cmljdGlvbiB0byBhcHBseQorICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiUmVzdHJpY3Rpb24gbm90IGFwcGxpZWQgYWZ0ZXIgNSBzZWNvbmRzIiwgbGF0Y2guYXdhaXQoNSwgVGltZVVuaXQuU0VDT05EUykpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgbUNvbnRleHQudW5yZWdpc3RlclJlY2VpdmVyKHJlY2VpdmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRDcm9zc1Byb2ZpbGVJbnRlbnRzUmVzb2x2YWJpbGl0eShMaXN0PEludGVudD4gaW50ZW50cywKKyAgICAgICAgICAgIFJlc29sdmVJbmZvIGV4cGVjdGVkRm9yd2FyZGVyLCBib29sZWFuIGV4cGVjdEZvcndhcmRhYmxlKSB7CisgICAgICAgIGZvciAoSW50ZW50IGludGVudCA6IGludGVudHMpIHsKKyAgICAgICAgICAgIExpc3Q8UmVzb2x2ZUluZm8+IHJlc29sdmVJbmZvTGlzdCA9IG1Db250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCkucXVlcnlJbnRlbnRBY3Rpdml0aWVzKAorICAgICAgICAgICAgICAgICAgICBpbnRlbnQsCisgICAgICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VyLk1BVENIX0RFRkFVTFRfT05MWSk7CisgICAgICAgICAgICBpZiAoZXhwZWN0Rm9yd2FyZGFibGUpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3QgIiArIGludGVudCArICIgdG8gYmUgZm9yd2FyZGFibGUsIGJ1dCByZXNvbHZlIGxpc3QiCisgICAgICAgICAgICAgICAgICAgICAgICArICIgZG9lcyBub3QgY29udGFpbiBleHBlY3RlZCBpbnRlbnQgZm9yd2FyZGVyICIgKyBleHBlY3RlZEZvcndhcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zUmVzb2x2ZUluZm8ocmVzb2x2ZUluZm9MaXN0LCBleHBlY3RlZEZvcndhcmRlcikpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZSgiRXhwZWN0ICIgKyBpbnRlbnQgKyAiIG5vdCB0byBiZSBmb3J3YXJkYWJsZSwgYnV0IHJlc29sdmUgbGlzdCAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJjb250YWlucyBpbnRlbnQgZm9yd2FyZGVyICIgKyBleHBlY3RlZEZvcndhcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zUmVzb2x2ZUluZm8ocmVzb2x2ZUluZm9MaXN0LCBleHBlY3RlZEZvcndhcmRlcikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBSZXNvbHZlSW5mbyBnZXRJbnRlbnRGb3J3YXJkZXIoSW50ZW50IGludGVudCkgeworICAgICAgICBMaXN0PFJlc29sdmVJbmZvPiByZXN1bHQgPSBtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpLnF1ZXJ5SW50ZW50QWN0aXZpdGllcyhpbnRlbnQsCisgICAgICAgICAgICAgICAgUGFja2FnZU1hbmFnZXIuTUFUQ0hfREVGQVVMVF9PTkxZKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3Qgb25seSBvbmUgcmVzb2x2ZSByZXN1bHQgZm9yICIgKyBpbnRlbnQsIDEsIHJlc3VsdC5zaXplKCkpOworICAgICAgICByZXR1cm4gcmVzdWx0LmdldCgwKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gY29udGFpbnNSZXNvbHZlSW5mbyhMaXN0PFJlc29sdmVJbmZvPiBsaXN0LCBSZXNvbHZlSW5mbyBpbmZvKSB7CisgICAgICAgIGZvciAoUmVzb2x2ZUluZm8gZW50cnkgOiBsaXN0KSB7CisgICAgICAgICAgICBpZiAoZW50cnkuYWN0aXZpdHlJbmZvLnBhY2thZ2VOYW1lLmVxdWFscyhpbmZvLmFjdGl2aXR5SW5mby5wYWNrYWdlTmFtZSkKKyAgICAgICAgICAgICAgICAgICAgJiYgZW50cnkuYWN0aXZpdHlJbmZvLm5hbWUuZXF1YWxzKGluZm8uYWN0aXZpdHlJbmZvLm5hbWUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9NYW5hZ2VkUHJvZmlsZS9zcmMvY29tL2FuZHJvaWQvY3RzL21hbmFnZWRwcm9maWxlL0R1bW15Q29ubmVjdGlvblNlcnZpY2UuamF2YSBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9NYW5hZ2VkUHJvZmlsZS9zcmMvY29tL2FuZHJvaWQvY3RzL21hbmFnZWRwcm9maWxlL0R1bW15Q29ubmVjdGlvblNlcnZpY2UuamF2YQppbmRleCBiMDBlMGE0Li43NTc5Y2Y3IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvTWFuYWdlZFByb2ZpbGUvc3JjL2NvbS9hbmRyb2lkL2N0cy9tYW5hZ2VkcHJvZmlsZS9EdW1teUNvbm5lY3Rpb25TZXJ2aWNlLmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL01hbmFnZWRQcm9maWxlL3NyYy9jb20vYW5kcm9pZC9jdHMvbWFuYWdlZHByb2ZpbGUvRHVtbXlDb25uZWN0aW9uU2VydmljZS5qYXZhCkBAIC0xMjYsNyArMTI2LDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBIYW5nIHVwIHRoZSBjYWxsIGFmdGVyIDEgc2Vjb25kIGluIGEgYmFja2dyb3VuZCB0aHJlYWQuCisgICAgICogSGFuZyB1cCB0aGUgY2FsbCBhZnRlciA1IHNlY29uZCBpbiBhIGJhY2tncm91bmQgdGhyZWFkLgogICAgICAqIFRPRE86IEl0IGlzIGJldHRlciBpZiB3ZSBjb3VsZCBoYXZlIGEgY2FsbGJhY2sgdG8ga25vdyB3aGVuIHdlIGNhbiBkaXNjb25uZWN0IHRoZSBjYWxsLgogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgaGFuZ1VwQXN5bmMoZmluYWwgQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7CkBAIC0xMzUsNyArMTM1LDcgQEAKICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewogICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDUwMDApOwogICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnNldERpc2Nvbm5lY3RlZChuZXcgRGlzY29ubmVjdENhdXNlKGNhdXNlKSk7CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gbGV0IGl0IGJlCkBAIC0xNDMsNCArMTQzLDQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfSkuc3RhcnQoKTsKICAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL01hbmFnZWRQcm9maWxlL3NyYy9jb20vYW5kcm9pZC9jdHMvbWFuYWdlZHByb2ZpbGUvSXNVc2luZ1VuaWZpZWRQYXNzd29yZFRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9NYW5hZ2VkUHJvZmlsZS9zcmMvY29tL2FuZHJvaWQvY3RzL21hbmFnZWRwcm9maWxlL0lzVXNpbmdVbmlmaWVkUGFzc3dvcmRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTcxZjE0NAotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9NYW5hZ2VkUHJvZmlsZS9zcmMvY29tL2FuZHJvaWQvY3RzL21hbmFnZWRwcm9maWxlL0lzVXNpbmdVbmlmaWVkUGFzc3dvcmRUZXN0LmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5tYW5hZ2VkcHJvZmlsZTsKKworLyoqCisgKiBUZXN0IHRvIGNoZWNrIHJlcG9ydGluZyB0aGUgc3RhdGUgb2YgcHJvZmlsZSBjaGFsbGVuZ2UuCisgKi8KK3B1YmxpYyBjbGFzcyBJc1VzaW5nVW5pZmllZFBhc3N3b3JkVGVzdCBleHRlbmRzIEJhc2VNYW5hZ2VkUHJvZmlsZVRlc3QgeworCisgICAgcHVibGljIHZvaWQgdGVzdE5vdFVzaW5nVW5pZmllZFBhc3N3b3JkKCkgeworICAgICAgICBhc3NlcnRGYWxzZShtRGV2aWNlUG9saWN5TWFuYWdlci5pc1VzaW5nVW5pZmllZFBhc3N3b3JkKEFETUlOX1JFQ0VJVkVSX0NPTVBPTkVOVCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RVc2luZ1VuaWZpZWRQYXNzd29yZCgpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtRGV2aWNlUG9saWN5TWFuYWdlci5pc1VzaW5nVW5pZmllZFBhc3N3b3JkKEFETUlOX1JFQ0VJVkVSX0NPTVBPTkVOVCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9NYW5hZ2VkUHJvZmlsZS9zcmMvY29tL2FuZHJvaWQvY3RzL21hbmFnZWRwcm9maWxlL0xvY2tOb3dUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvTWFuYWdlZFByb2ZpbGUvc3JjL2NvbS9hbmRyb2lkL2N0cy9tYW5hZ2VkcHJvZmlsZS9Mb2NrTm93VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTc0ZGI3Li4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9NYW5hZ2VkUHJvZmlsZS9zcmMvY29tL2FuZHJvaWQvY3RzL21hbmFnZWRwcm9maWxlL0xvY2tOb3dUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5jdHMubWFuYWdlZHByb2ZpbGU7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5hZG1pbi5EZXZpY2VQb2xpY3lNYW5hZ2VyOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuY3RzLm1hbmFnZWRwcm9maWxlLkJhc2VNYW5hZ2VkUHJvZmlsZVRlc3QuQmFzaWNBZG1pblJlY2VpdmVyOwotCi0vKioKLSAqIFRlc3QgbG9ja05vdygpIGZvciB1c2UgaW4gYSBtYW5hZ2VkIHByb2ZpbGUuIElmIGNhbGxlZCBmcm9tIGEgbWFuYWdlZCBwcm9maWxlLiBsb2NrTm93KCkgY2FuIGJlCi0gKiBwYXNzZWQgYSBmbGFnIHRvIGV2aWN0IHRoZSBDRSBrZXkgb2YgdGhlIHByb2ZpbGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2NrTm93VGVzdCBleHRlbmRzIEJhc2VNYW5hZ2VkUHJvZmlsZVRlc3QgewotCi0gIHB1YmxpYyB2b2lkIHRlc3RMb2NrTm93V2l0aEtleUV2aWN0aW9uKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIubG9ja05vdyhEZXZpY2VQb2xpY3lNYW5hZ2VyLkZMQUdfRVZJQ1RfQ1JFREVOVElBTF9FTkNSWVBUSU9OX0tFWSk7Ci0gICAgICAgIC8vIFRoZSB0ZXN0IHRoYXQgdGhlIG1hbmFnZWQgcHJvZmlsZSB3YXMgbG9ja2VkIGlzIGRvbmUgaW4gdGhlIGhvc3QKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9NYW5hZ2VkUHJvZmlsZS9zcmMvY29tL2FuZHJvaWQvY3RzL21hbmFnZWRwcm9maWxlL0xvY2tQcm9maWxlUmVjZWl2ZXIuamF2YSBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9NYW5hZ2VkUHJvZmlsZS9zcmMvY29tL2FuZHJvaWQvY3RzL21hbmFnZWRwcm9maWxlL0xvY2tQcm9maWxlUmVjZWl2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWYxM2UxCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL01hbmFnZWRQcm9maWxlL3NyYy9jb20vYW5kcm9pZC9jdHMvbWFuYWdlZHByb2ZpbGUvTG9ja1Byb2ZpbGVSZWNlaXZlci5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5tYW5hZ2VkcHJvZmlsZTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLmFkbWluLkRldmljZVBvbGljeU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CisKKy8qKgorICogSW52b2tlIGxvY2tOb3coKSB3aXRoIGEgZmxhZyB0byBldmljdCB0aGUgQ0Uga2V5IG9mIHRoZSBwcm9maWxlLiBVc2VkIGJ5IHRoZSBob3N0c2lkZSB0ZXN0IHRvCisgKiBsb2NrIHRoZSBwcm9maWxlIHdpdGgga2V5IGV2aWN0aW9uLiBUaGlzIGlzIHRyaWdnZXJlZCB2aWEgYSBicm9hZGNhc3QgaW5zdGVhZCBvZiBhIG5vcm1hbAorICogdGVzdCBjYXNlLCBzaW5jZSB0aGUgdGVzdCBwcm9jZXNzIHdpbGwgYmUga2lsbGVkIGFmdGVyIGNhbGxpbmcgbG9ja05vdygpIHdoaWNoIHdpbGwgcmVzdWx0IGluCisgKiBhIHRlc3QgZmFpbHVyZSBpZiB0aGlzIHdlcmUgcnVuIGFzIGEgdGVzdCBjYXNlLgorICovCitwdWJsaWMgY2xhc3MgTG9ja1Byb2ZpbGVSZWNlaXZlciBleHRlbmRzIEJyb2FkY2FzdFJlY2VpdmVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fTE9DS19QUk9GSUxFID0gImNvbS5hbmRyb2lkLmN0cy5tYW5hZ2VkcHJvZmlsZS5MT0NLX1BST0ZJTEUiOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICBpZiAoQUNUSU9OX0xPQ0tfUFJPRklMRS5lcXVhbHMoaW50ZW50LmdldEFjdGlvbigpKSkgeworICAgICAgICAgICAgZmluYWwgRGV2aWNlUG9saWN5TWFuYWdlciBkcG0gPSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoRGV2aWNlUG9saWN5TWFuYWdlci5jbGFzcyk7CisgICAgICAgICAgICBkcG0ubG9ja05vdyhEZXZpY2VQb2xpY3lNYW5hZ2VyLkZMQUdfRVZJQ1RfQ1JFREVOVElBTF9FTkNSWVBUSU9OX0tFWSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvTWFuYWdlZFByb2ZpbGUvc3JjL2NvbS9hbmRyb2lkL2N0cy9tYW5hZ2VkcHJvZmlsZS9NYW5hZ2VkUHJvZmlsZVRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9NYW5hZ2VkUHJvZmlsZS9zcmMvY29tL2FuZHJvaWQvY3RzL21hbmFnZWRwcm9maWxlL01hbmFnZWRQcm9maWxlVGVzdC5qYXZhCmluZGV4IGEyMWQ5ZTYuLjkxZjIwNDYgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9NYW5hZ2VkUHJvZmlsZS9zcmMvY29tL2FuZHJvaWQvY3RzL21hbmFnZWRwcm9maWxlL01hbmFnZWRQcm9maWxlVGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9NYW5hZ2VkUHJvZmlsZS9zcmMvY29tL2FuZHJvaWQvY3RzL21hbmFnZWRwcm9maWxlL01hbmFnZWRQcm9maWxlVGVzdC5qYXZhCkBAIC0xNSwxNSArMTUsMTYgQEAKICAqLwogcGFja2FnZSBjb20uYW5kcm9pZC5jdHMubWFuYWdlZHByb2ZpbGU7CiAKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY3RzLm1hbmFnZWRwcm9maWxlLkJhc2VNYW5hZ2VkUHJvZmlsZVRlc3QuQURNSU5fUkVDRUlWRVJfQ09NUE9ORU5UOworCiBpbXBvcnQgYW5kcm9pZC5hcHAuYWRtaW4uRGV2aWNlUG9saWN5TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwogaW1wb3J0IGFuZHJvaWQudGVzdC5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjsKIAotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jdHMubWFuYWdlZHByb2ZpbGUuQmFzZU1hbmFnZWRQcm9maWxlVGVzdC5BRE1JTl9SRUNFSVZFUl9DT01QT05FTlQ7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKIAogLyoqCiAgKiBUZXN0IGZvciB7QGxpbmsgRGV2aWNlUG9saWN5TWFuYWdlciNhZGRDcm9zc1Byb2ZpbGVJbnRlbnRGaWx0ZXJ9IEFQSS4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9NYW5hZ2VkUHJvZmlsZS9zcmMvY29tL2FuZHJvaWQvY3RzL21hbmFnZWRwcm9maWxlL05vdGlmaWNhdGlvbkxpc3RlbmVyVGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL01hbmFnZWRQcm9maWxlL3NyYy9jb20vYW5kcm9pZC9jdHMvbWFuYWdlZHByb2ZpbGUvTm90aWZpY2F0aW9uTGlzdGVuZXJUZXN0LmphdmEKaW5kZXggNDk5ZTcxMC4uZWEwNmVmOSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL01hbmFnZWRQcm9maWxlL3NyYy9jb20vYW5kcm9pZC9jdHMvbWFuYWdlZHByb2ZpbGUvTm90aWZpY2F0aW9uTGlzdGVuZXJUZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL01hbmFnZWRQcm9maWxlL3NyYy9jb20vYW5kcm9pZC9jdHMvbWFuYWdlZHByb2ZpbGUvTm90aWZpY2F0aW9uTGlzdGVuZXJUZXN0LmphdmEKQEAgLTE4LDEwICsxOCw2IEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAotaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbjsKLWltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb25DaGFubmVsOwotaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbk1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuVWlBdXRvbWF0aW9uOwogaW1wb3J0IGFuZHJvaWQuYXBwLmFkbWluLkRldmljZVBvbGljeU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwpAQCAtMjksMTIgKzI1LDEzIEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwogaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLlVpRGV2aWNlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5jb250ZW50LkxvY2FsQnJvYWRjYXN0TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCitpbXBvcnQgYW5kcm9pZHgubG9jYWxicm9hZGNhc3RtYW5hZ2VyLmNvbnRlbnQuTG9jYWxCcm9hZGNhc3RNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKKwogaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL01hbmFnZWRQcm9maWxlL3NyYy9jb20vYW5kcm9pZC9jdHMvbWFuYWdlZHByb2ZpbGUvUGFyZW50UHJvZmlsZVRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9NYW5hZ2VkUHJvZmlsZS9zcmMvY29tL2FuZHJvaWQvY3RzL21hbmFnZWRwcm9maWxlL1BhcmVudFByb2ZpbGVUZXN0LmphdmEKaW5kZXggZjA4NjY1Ni4uMTdjZWE5YiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL01hbmFnZWRQcm9maWxlL3NyYy9jb20vYW5kcm9pZC9jdHMvbWFuYWdlZHByb2ZpbGUvUGFyZW50UHJvZmlsZVRlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvTWFuYWdlZFByb2ZpbGUvc3JjL2NvbS9hbmRyb2lkL2N0cy9tYW5hZ2VkcHJvZmlsZS9QYXJlbnRQcm9maWxlVGVzdC5qYXZhCkBAIC03Nyw2ICs3Nyw3IEBACiAgICAgICAgICAgICAuYWRkKCJzZXRUcnVzdEFnZW50Q29uZmlndXJhdGlvbiIpCiAgICAgICAgICAgICAuYWRkKCJnZXRSZXF1aXJlZFN0cm9uZ0F1dGhUaW1lb3V0IikKICAgICAgICAgICAgIC5hZGQoInNldFJlcXVpcmVkU3Ryb25nQXV0aFRpbWVvdXQiKQorICAgICAgICAgICAgLmFkZCgiaXNEZXZpY2VJZEF0dGVzdGF0aW9uU3VwcG9ydGVkIikKICAgICAgICAgICAgIC5idWlsZCgpOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiUGFyZW50UHJvZmlsZVRlc3QiOwpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL01hbmFnZWRQcm9maWxlL3NyYy9jb20vYW5kcm9pZC9jdHMvbWFuYWdlZHByb2ZpbGUvUHJpbWFyeVVzZXJBZG1pbkhlbHBlci5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL01hbmFnZWRQcm9maWxlL3NyYy9jb20vYW5kcm9pZC9jdHMvbWFuYWdlZHByb2ZpbGUvUHJpbWFyeVVzZXJBZG1pbkhlbHBlci5qYXZhCmluZGV4IGUwOTI4ODguLmYyMGVkY2MgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9NYW5hZ2VkUHJvZmlsZS9zcmMvY29tL2FuZHJvaWQvY3RzL21hbmFnZWRwcm9maWxlL1ByaW1hcnlVc2VyQWRtaW5IZWxwZXIuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvTWFuYWdlZFByb2ZpbGUvc3JjL2NvbS9hbmRyb2lkL2N0cy9tYW5hZ2VkcHJvZmlsZS9QcmltYXJ5VXNlckFkbWluSGVscGVyLmphdmEKQEAgLTQxLDggKzQxLDggQEAKICAgICAgICAgQ29tcG9uZW50TmFtZSBjbiA9IFByaW1hcnlVc2VyRGV2aWNlQWRtaW4uQURNSU5fUkVDRUlWRVJfQ09NUE9ORU5UOwogICAgICAgICBpZiAobURwbS5pc0FkbWluQWN0aXZlKGNuKSkgewogICAgICAgICAgICAgbURwbS5yZW1vdmVBY3RpdmVBZG1pbihjbik7Ci0gICAgICAgICAgICAvLyBXYWl0IHVudGlsIGRldmljZSBhZG1pbiBpcyBub3QgYWN0aXZlICh3aXRoIDIgbWludXRlcyB0aW1lb3V0KS4KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMiAqIDYwICYmIG1EcG0uaXNBZG1pbkFjdGl2ZShjbik7IGkrKykgeworICAgICAgICAgICAgLy8gV2FpdCB1bnRpbCBkZXZpY2UgYWRtaW4gaXMgbm90IGFjdGl2ZSAod2l0aCA1IG1pbnV0ZXMgdGltZW91dCkuCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDUgKiA2MCAmJiBtRHBtLmlzQWRtaW5BY3RpdmUoY24pOyBpKyspIHsKICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7ICAvLyAxIHNlY29uZC4KICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL01hbmFnZWRQcm9maWxlL3NyYy9jb20vYW5kcm9pZC9jdHMvbWFuYWdlZHByb2ZpbGUvUHJpbWFyeVVzZXJUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvTWFuYWdlZFByb2ZpbGUvc3JjL2NvbS9hbmRyb2lkL2N0cy9tYW5hZ2VkcHJvZmlsZS9QcmltYXJ5VXNlclRlc3QuamF2YQppbmRleCA0MTYzYmE4Li4wYTdlN2Y5IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvTWFuYWdlZFByb2ZpbGUvc3JjL2NvbS9hbmRyb2lkL2N0cy9tYW5hZ2VkcHJvZmlsZS9QcmltYXJ5VXNlclRlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvTWFuYWdlZFByb2ZpbGUvc3JjL2NvbS9hbmRyb2lkL2N0cy9tYW5hZ2VkcHJvZmlsZS9QcmltYXJ5VXNlclRlc3QuamF2YQpAQCAtMjAsNyArMjAsOCBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudGVzdC5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CiAKIC8qKgogICogVGVzdCBmb3Ige0BsaW5rIERldmljZVBvbGljeU1hbmFnZXIjYWRkQ3Jvc3NQcm9maWxlSW50ZW50RmlsdGVyfSBBUEksIGZvcgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL01hbmFnZWRQcm9maWxlL3NyYy9jb20vYW5kcm9pZC9jdHMvbWFuYWdlZHByb2ZpbGUvUHJvZmlsZVRpbWVvdXRUZXN0SGVscGVyLmphdmEgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvTWFuYWdlZFByb2ZpbGUvc3JjL2NvbS9hbmRyb2lkL2N0cy9tYW5hZ2VkcHJvZmlsZS9Qcm9maWxlVGltZW91dFRlc3RIZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzg2YmFhCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL01hbmFnZWRQcm9maWxlL3NyYy9jb20vYW5kcm9pZC9jdHMvbWFuYWdlZHByb2ZpbGUvUHJvZmlsZVRpbWVvdXRUZXN0SGVscGVyLmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY3RzLm1hbmFnZWRwcm9maWxlOworCitpbXBvcnQgYW5kcm9pZC5hcHAuS2V5Z3VhcmRNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuYXBwLmFkbWluLkRldmljZVBvbGljeU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RDYXNlOworCitpbXBvcnQgY29tLmFuZHJvaWQuY3RzLm1hbmFnZWRwcm9maWxlLkJhc2VNYW5hZ2VkUHJvZmlsZVRlc3QuQmFzaWNBZG1pblJlY2VpdmVyOworCisvKioKKyAqIEhlbHBlciB0byBzZXQgbG9jayB0aW1lb3V0cyBhbmQgY2hlY2sgaWYgdGhlIHByb2ZpbGUgaXMgbG9ja2VkLgorICovCitwdWJsaWMgY2xhc3MgUHJvZmlsZVRpbWVvdXRUZXN0SGVscGVyIGV4dGVuZHMgSW5zdHJ1bWVudGF0aW9uVGVzdENhc2UgeworICAgIC8vIFRoaXMgc2hvdWxkIGJlIHN1ZmZpY2llbnRseSBzbWFsbGVyIHRoYW4gTWFuYWdlZFByb2ZpbGVUZXN0LlBST0ZJTEVfVElNRU9VVF9ERUxBWV9TRUMuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRJTUVPVVRfTVMgPSA1XzAwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wb25lbnROYW1lIEFETUlOX0NPTVBPTkVOVCA9IG5ldyBDb21wb25lbnROYW1lKAorICAgICAgICAgICAgQmFzaWNBZG1pblJlY2VpdmVyLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCksIEJhc2ljQWRtaW5SZWNlaXZlci5jbGFzcy5nZXROYW1lKCkpOworCisgICAgcHJpdmF0ZSBLZXlndWFyZE1hbmFnZXIgbUttOworICAgIHByaXZhdGUgRGV2aWNlUG9saWN5TWFuYWdlciBtRHBtOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0ID0gZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0Q29udGV4dCgpOworICAgICAgICBtRHBtID0gKERldmljZVBvbGljeU1hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkRFVklDRV9QT0xJQ1lfU0VSVklDRSk7CisgICAgICAgIG1LbSA9IChLZXlndWFyZE1hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LktFWUdVQVJEX1NFUlZJQ0UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRXb3JrUHJvZmlsZVRpbWVvdXQoKSB7CisgICAgICAgIGFzc2VydFByb2ZpbGVPd25lcigpOworICAgICAgICBtRHBtLnNldE1heGltdW1UaW1lVG9Mb2NrKEFETUlOX0NPTVBPTkVOVCwgVElNRU9VVF9NUyk7CisgICAgICAgIGFzc2VydEVxdWFscygiRmFpbGVkIHRvIHNldCB0aW1lb3V0IiwKKyAgICAgICAgICAgICAgICBUSU1FT1VUX01TLCBtRHBtLmdldE1heGltdW1UaW1lVG9Mb2NrKEFETUlOX0NPTVBPTkVOVCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3REZXZpY2VMb2NrZWQoKSB7CisgICAgICAgIGFzc2VydFRydWUoIkRldmljZSBub3QgbG9ja2VkIiwgbUttLmlzRGV2aWNlTG9ja2VkKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3REZXZpY2VOb3RMb2NrZWQoKSB7CisgICAgICAgIGFzc2VydEZhbHNlKCJEZXZpY2UgbG9ja2VkIiwgbUttLmlzRGV2aWNlTG9ja2VkKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRQcm9maWxlT3duZXIoKSB7CisgICAgICAgIGFzc2VydFRydWUobURwbS5pc1Byb2ZpbGVPd25lckFwcChBRE1JTl9DT01QT05FTlQuZ2V0UGFja2FnZU5hbWUoKSkpOworICAgICAgICBhc3NlcnRUcnVlKG1EcG0uaXNNYW5hZ2VkUHJvZmlsZShBRE1JTl9DT01QT05FTlQpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvTWFuYWdlZFByb2ZpbGUvc3JjL2NvbS9hbmRyb2lkL2N0cy9tYW5hZ2VkcHJvZmlsZS9Qcm92aXNpb25pbmdUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvTWFuYWdlZFByb2ZpbGUvc3JjL2NvbS9hbmRyb2lkL2N0cy9tYW5hZ2VkcHJvZmlsZS9Qcm92aXNpb25pbmdUZXN0LmphdmEKaW5kZXggMjNkZTgyMy4uOGNmMTU2YiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL01hbmFnZWRQcm9maWxlL3NyYy9jb20vYW5kcm9pZC9jdHMvbWFuYWdlZHByb2ZpbGUvUHJvdmlzaW9uaW5nVGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9NYW5hZ2VkUHJvZmlsZS9zcmMvY29tL2FuZHJvaWQvY3RzL21hbmFnZWRwcm9maWxlL1Byb3Zpc2lvbmluZ1Rlc3QuamF2YQpAQCAtMjEsNiArMjEsNyBAQAogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5hZG1pbi5EZXZpY2VQb2xpY3lNYW5hZ2VyLkVYVFJBX1BST1ZJU0lPTklOR19ERVZJQ0VfQURNSU5fQ09NUE9ORU5UX05BTUU7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLmFkbWluLkRldmljZVBvbGljeU1hbmFnZXIuRVhUUkFfUFJPVklTSU9OSU5HX0tFRVBfQUNDT1VOVF9PTl9NSUdSQVRJT047CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLmFkbWluLkRldmljZVBvbGljeU1hbmFnZXIuRVhUUkFfUFJPVklTSU9OSU5HX1NLSVBfRU5DUllQVElPTjsKKwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CkBAIC0zNSwxMSArMzYsMTMgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlczsKIGltcG9ydCBhbmRyb2lkLm9zLlBlcnNpc3RhYmxlQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CisKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLmRldmljZXBvbGljeS5wcm92aXNpb25pbmcuU2lsZW50UHJvdmlzaW9uaW5nVGVzdE1hbmFnZXI7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvTWFuYWdlZFByb2ZpbGUvc3JjL2NvbS9hbmRyb2lkL2N0cy9tYW5hZ2VkcHJvZmlsZS9SZXNldFBhc3N3b3JkV2l0aFRva2VuVGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL01hbmFnZWRQcm9maWxlL3NyYy9jb20vYW5kcm9pZC9jdHMvbWFuYWdlZHByb2ZpbGUvUmVzZXRQYXNzd29yZFdpdGhUb2tlblRlc3QuamF2YQppbmRleCA2NDg3YjUwLi40ZWE4ZjNiIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvTWFuYWdlZFByb2ZpbGUvc3JjL2NvbS9hbmRyb2lkL2N0cy9tYW5hZ2VkcHJvZmlsZS9SZXNldFBhc3N3b3JkV2l0aFRva2VuVGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9NYW5hZ2VkUHJvZmlsZS9zcmMvY29tL2FuZHJvaWQvY3RzL21hbmFnZWRwcm9maWxlL1Jlc2V0UGFzc3dvcmRXaXRoVG9rZW5UZXN0LmphdmEKQEAgLTQwLDEyICs0MCwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldCBhIHJlc2V0IHBhc3N3b3JkIHRva2VuIGFuZCB3b3JrIGNoYWxsZW5nZSBvbiB0aGUgd29yayBwcm9maWxlLCBhbmQgdGhlbiBsb2NrIGl0Ci0gICAgICogd2l0aCBDRSBldmljdGVkLiBUaGlzIGlzIHRoZSBwcmVwYXJhdGlvbiBzdGVwIGZvciB7QGxpbmsgI3Rlc3RSZXNldFBhc3N3b3JkQmVmb3JlVW5sb2NrfQotICAgICAqIHRvIHB1dCB0aGUgcHJvZmlsZSBpbiBSVU5OSU5HX0xPQ0tFRCBzdGF0ZSwgYW5kIHdpbGwgYmUgY2FsbGVkIGJ5IHRoZSBob3N0c2lkZSBsb2dpYyBiZWZvcmUKLSAgICAgKiB7QGxpbmsgI3Rlc3RSZXNldFBhc3N3b3JkQmVmb3JlVW5sb2NrfSBpcyBleGVyY2lzZWQuCisgICAgICogU2V0IGEgcmVzZXQgcGFzc3dvcmQgdG9rZW4gYW5kIHdvcmsgY2hhbGxlbmdlIG9uIHRoZSB3b3JrIHByb2ZpbGUuIFRoaXMgaXMgdGhlIHByZXBhcmF0aW9uCisgICAgICogc3RlcCBmb3Ige0BsaW5rICN0ZXN0UmVzZXRQYXNzd29yZEJlZm9yZVVubG9ja30gYW5kIHdpbGwgYmUgY2FsbGVkIGJ5IHRoZSBob3N0c2lkZSBsb2dpYworICAgICAqIGJlZm9yZSBpdCBpcyBleGVyY2lzZWQuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFNldHVwV29ya1Byb2ZpbGVBbmRMb2NrKCkgeworICAgIHB1YmxpYyB2b2lkIHRlc3RTZXR1cFdvcmtQcm9maWxlKCkgewogICAgICAgICB0ZXN0U2V0UmVzZXRQYXNzd29yZFRva2VuKCk7CiAgICAgICAgIC8vIFJlc2V0IHBhc3N3b3JkIG9uIHRoZSB3b3JrIHByb2ZpbGUgd2lsbCBlbmFibGUgc2VwYXJhdGUgd29yayBjaGFsbGVuZ2UgZm9yIGl0LgogICAgICAgICBhc3NlcnRUcnVlKG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnJlc2V0UGFzc3dvcmRXaXRoVG9rZW4oQURNSU5fUkVDRUlWRVJfQ09NUE9ORU5ULCBQQVNTV09SRDAsCkBAIC01NCw4ICs1Myw2IEBACiAgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnNldFBhc3N3b3JkUXVhbGl0eShBRE1JTl9SRUNFSVZFUl9DT01QT05FTlQsCiAgICAgICAgICAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX05VTUVSSUMpOwogICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5zZXRQYXNzd29yZE1pbmltdW1MZW5ndGgoQURNSU5fUkVDRUlWRVJfQ09NUE9ORU5ULCA2KTsKLQotICAgICAgICB0ZXN0TG9ja1dvcmtQcm9maWxlKCk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdFJlc2V0UGFzc3dvcmRCZWZvcmVVbmxvY2soKSB7CkBAIC03NCw4ICs3MSw0IEBACiAgICAgICAgIGFzc2VydFRydWUobURldmljZVBvbGljeU1hbmFnZXIuc2V0UmVzZXRQYXNzd29yZFRva2VuKEFETUlOX1JFQ0VJVkVSX0NPTVBPTkVOVCwgdG9rZW4pKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShtRGV2aWNlUG9saWN5TWFuYWdlci5pc1Jlc2V0UGFzc3dvcmRUb2tlbkFjdGl2ZShBRE1JTl9SRUNFSVZFUl9DT01QT05FTlQpKTsKICAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TG9ja1dvcmtQcm9maWxlKCkgewotICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5sb2NrTm93KERldmljZVBvbGljeU1hbmFnZXIuRkxBR19FVklDVF9DUkVERU5USUFMX0VOQ1JZUFRJT05fS0VZKTsKLSAgICB9CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL01hbmFnZWRQcm9maWxlL3NyYy9jb20vYW5kcm9pZC9jdHMvbWFuYWdlZHByb2ZpbGUvU2FuaXR5VGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL01hbmFnZWRQcm9maWxlL3NyYy9jb20vYW5kcm9pZC9jdHMvbWFuYWdlZHByb2ZpbGUvU2FuaXR5VGVzdC5qYXZhCmluZGV4IDI4YzdlMjUuLjZhOGI4N2EgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9NYW5hZ2VkUHJvZmlsZS9zcmMvY29tL2FuZHJvaWQvY3RzL21hbmFnZWRwcm9maWxlL1Nhbml0eVRlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvTWFuYWdlZFByb2ZpbGUvc3JjL2NvbS9hbmRyb2lkL2N0cy9tYW5hZ2VkcHJvZmlsZS9TYW5pdHlUZXN0LmphdmEKQEAgLTE1LDE5ICsxNSwyMCBAQAogICovCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5tYW5hZ2VkcHJvZmlsZTsKIAoraW1wb3J0IHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMganVuaXQuZnJhbWV3b3JrLkFzc2VydC5hc3NlcnROb3ROdWxsOworCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkJsb2NraW5nQnJvYWRjYXN0UmVjZWl2ZXI7CiAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCi1pbXBvcnQgc3RhdGljIGp1bml0LmZyYW1ld29yay5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0LmFzc2VydE5vdE51bGw7Ci0KIC8qKgogICogQmFzaWMgc2FuaXR5IHRlc3QgdG8gZW5zdXJlIHNvbWUgYmFzaWMgZnVuY3Rpb25hbGl0aWVzIG9mIHdvcmsgcHJvZmlsZSBhcmUgd29ya2luZy4KICAqLwpAQCAtNjIsNiArNjMsNyBAQAogICAgICAgICAgICAgaW50ZW50LnNldENvbXBvbmVudChTSU1QTEVfQVBQX0FDVElWSVRZKTsKICAgICAgICAgICAgIC8vIEZpbmlzaCB0aGUgYWN0aXZpdHkgYWZ0ZXIgdGhhdC4KICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYSgiZmluaXNoIiwgdHJ1ZSk7CisgICAgICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOwogICAgICAgICAgICAgbUNvbnRleHQuc3RhcnRBY3Rpdml0eShpbnRlbnQpOwogICAgICAgICAgICAgSW50ZW50IHJlY2VpdmVkQnJvYWRjYXN0ID0gcmVjZWl2ZXIuYXdhaXRGb3JCcm9hZGNhc3QoKTsKICAgICAgICAgICAgIGFzc2VydE5vdE51bGwocmVjZWl2ZWRCcm9hZGNhc3QpOwpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL01hbmFnZWRQcm9maWxlL3NyYy9jb20vYW5kcm9pZC9jdHMvbWFuYWdlZHByb2ZpbGUvVGltZW91dEFjdGl2aXR5LmphdmEgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvTWFuYWdlZFByb2ZpbGUvc3JjL2NvbS9hbmRyb2lkL2N0cy9tYW5hZ2VkcHJvZmlsZS9UaW1lb3V0QWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTc0NDc3Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL01hbmFnZWRQcm9maWxlL3NyYy9jb20vYW5kcm9pZC9jdHMvbWFuYWdlZHByb2ZpbGUvVGltZW91dEFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY3RzLm1hbmFnZWRwcm9maWxlOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7CisKKy8qKgorICogQWN0aXZpdHkgdG8gdGVzdCBwcm9maWxlIGxvY2sgdGltZW91dC4KKyAqLworcHVibGljIGNsYXNzIFRpbWVvdXRBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VFUF9TQ1JFRU5fT04gPSAia2VlcF9zY3JlZW5fb24iOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIGZpbmFsIFZpZXcgYmxhbmtWaWV3ID0gbmV3IFZpZXcodGhpcyk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KGJsYW5rVmlldyk7CisKKyAgICAgICAgaWYgKGdldEludGVudCgpLmdldEJvb2xlYW5FeHRyYShLRUVQX1NDUkVFTl9PTiwgZmFsc2UpKSB7CisgICAgICAgICAgICBnZXRXaW5kb3coKS5hZGRGbGFncyhXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0tFRVBfU0NSRUVOX09OKTsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL01hbmFnZWRQcm9maWxlL3NyYy9jb20vYW5kcm9pZC9jdHMvbWFuYWdlZHByb2ZpbGUvV2ViVmlld0FjdGl2aXR5LmphdmEgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvTWFuYWdlZFByb2ZpbGUvc3JjL2NvbS9hbmRyb2lkL2N0cy9tYW5hZ2VkcHJvZmlsZS9XZWJWaWV3QWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWUxNmY0Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL01hbmFnZWRQcm9maWxlL3NyYy9jb20vYW5kcm9pZC9jdHMvbWFuYWdlZHByb2ZpbGUvV2ViVmlld0FjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwxNCBAQAorcGFja2FnZSBjb20uYW5kcm9pZC5jdHMubWFuYWdlZHByb2ZpbGU7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJWaWV3OworCitwdWJsaWMgY2xhc3MgV2ViVmlld0FjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICBzZXRDb250ZW50VmlldyhuZXcgV2ViVmlldyh0aGlzKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9NYW5hZ2VkUHJvZmlsZS9zcmMvY29tL2FuZHJvaWQvY3RzL21hbmFnZWRwcm9maWxlL1dpcGVEYXRhUmVjZWl2ZXIuamF2YSBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9NYW5hZ2VkUHJvZmlsZS9zcmMvY29tL2FuZHJvaWQvY3RzL21hbmFnZWRwcm9maWxlL1dpcGVEYXRhUmVjZWl2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWJlYTdkCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL01hbmFnZWRQcm9maWxlL3NyYy9jb20vYW5kcm9pZC9jdHMvbWFuYWdlZHByb2ZpbGUvV2lwZURhdGFSZWNlaXZlci5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5tYW5hZ2VkcHJvZmlsZTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLmFkbWluLkRldmljZVBvbGljeU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CisKKy8qKgorICogSW52b2tlIHdpcGVEYXRhKCksIG9wdGlvbmFsbHkgaW5jbHVkaW5nIGEgcmVhc29uLiBUaGlzIGlzIHVzZWQgYnkgaG9zdCBzaWRlIHRlc3RzIHRvIGRlc3Ryb3kgdGhlCisgKiB3b3JrIHByb2ZpbGUuIFRoZSBjYWxsIGlzIHRyaWdnZXJlZCB2aWEgYSBicm9hZGNhc3QgaW5zdGVhZCBvZiBydW4gYXMgYSBub3JtYWwgdGVzdCBjYXNlLCBzaW5jZQorICogdGhlIHRlc3QgcHJvY2VzcyB3aWxsIGJlIGtpbGxlZCBhZnRlciBjYWxsaW5nIHdpcGVEYXRhKCkgd2hpY2ggd2lsbCByZXN1bHQgaW4gYSB0ZXN0IGZhaWx1cmUgaWYKKyAqIHRoaXMgd2VyZSBydW4gYXMgYSB0ZXN0IGNhc2UuCisgKi8KK3B1YmxpYyBjbGFzcyBXaXBlRGF0YVJlY2VpdmVyIGV4dGVuZHMgQnJvYWRjYXN0UmVjZWl2ZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9XSVBFX0RBVEEgPSAiY29tLmFuZHJvaWQuY3RzLm1hbmFnZWRwcm9maWxlLldJUEVfREFUQSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9XSVBFX0RBVEFfV0lUSF9SRUFTT04gPQorICAgICAgICAgICAgImNvbS5hbmRyb2lkLmN0cy5tYW5hZ2VkcHJvZmlsZS5XSVBFX0RBVEFfV0lUSF9SRUFTT04iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1dJUEVfREFUQV9SRUFTT04gPSAiY3RzIHRlc3QgZm9yIFdpcGVEYXRhV2l0aFJlYXNvbiI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIGZpbmFsIERldmljZVBvbGljeU1hbmFnZXIgZHBtID0gY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKERldmljZVBvbGljeU1hbmFnZXIuY2xhc3MpOworICAgICAgICBpZiAoQUNUSU9OX1dJUEVfREFUQS5lcXVhbHMoaW50ZW50LmdldEFjdGlvbigpKSkgeworICAgICAgICAgICAgZHBtLndpcGVEYXRhKDApOworICAgICAgICB9IGVsc2UgaWYgKEFDVElPTl9XSVBFX0RBVEFfV0lUSF9SRUFTT04uZXF1YWxzKGludGVudC5nZXRBY3Rpb24oKSkpIHsKKyAgICAgICAgICAgIGRwbS53aXBlRGF0YSgwLCBURVNUX1dJUEVfREFUQV9SRUFTT04pOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL01hbmFnZWRQcm9maWxlL3NyYy9jb20vYW5kcm9pZC9jdHMvbWFuYWdlZHByb2ZpbGUvV2lwZURhdGFUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvTWFuYWdlZFByb2ZpbGUvc3JjL2NvbS9hbmRyb2lkL2N0cy9tYW5hZ2VkcHJvZmlsZS9XaXBlRGF0YVRlc3QuamF2YQppbmRleCA3ZWYzYTBhLi42NWM3NzI0IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvTWFuYWdlZFByb2ZpbGUvc3JjL2NvbS9hbmRyb2lkL2N0cy9tYW5hZ2VkcHJvZmlsZS9XaXBlRGF0YVRlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvTWFuYWdlZFByb2ZpbGUvc3JjL2NvbS9hbmRyb2lkL2N0cy9tYW5hZ2VkcHJvZmlsZS9XaXBlRGF0YVRlc3QuamF2YQpAQCAtMTUsMTYgKzE1LDggQEAKICAqLwogcGFja2FnZSBjb20uYW5kcm9pZC5jdHMubWFuYWdlZHByb2ZpbGU7CiAKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy5tYW5hZ2VkcHJvZmlsZS5CYXNlTWFuYWdlZFByb2ZpbGVUZXN0LkJhc2ljQWRtaW5SZWNlaXZlcjsKLQotaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7Ci0KLS8qKgotICogVGVzdCB3aXBlRGF0YSgpIGZvciB1c2UgaW4gbWFuYWdlZCBwcm9maWxlLiBJZiBjYWxsZWQgZnJvbSBhIG1hbmFnZWQgcHJvZmlsZSwgd2lwZURhdGEoKSBzaG91bGQKLSAqIHJlbW92ZSB0aGUgY3VycmVudCBtYW5hZ2VkIHByb2ZpbGUuIEFsc28sIG5vIGVyYXNpbmcgb2YgZXh0ZXJuYWwgc3RvcmFnZSBzaG91bGQgYmUgYWxsb3dlZC4KLSAqLwogcHVibGljIGNsYXNzIFdpcGVEYXRhVGVzdCBleHRlbmRzIEJhc2VNYW5hZ2VkUHJvZmlsZVRlc3QgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1dJUEVfREFUQV9SRUFTT04gPSAiY3RzIHRlc3QgZm9yIFdpcGVEYXRhV2l0aFJlYXNvbiI7CiAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewpAQCAtMzUsOCArMjcsMjUgQEAKICAgICAgICAgYXNzZXJ0VHJ1ZShtRGV2aWNlUG9saWN5TWFuYWdlci5pc1Byb2ZpbGVPd25lckFwcChBRE1JTl9SRUNFSVZFUl9DT01QT05FTlQuZ2V0UGFja2FnZU5hbWUoKSkpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFRlc3Qgd2lwZURhdGEoKSBmb3IgdXNlIGluIG1hbmFnZWQgcHJvZmlsZS4gSWYgY2FsbGVkIGZyb20gYSBtYW5hZ2VkIHByb2ZpbGUsIHdpcGVEYXRhKCkKKyAgICAgKiBzaG91bGQgcmVtb3ZlIHRoZSBjdXJyZW50IG1hbmFnZWQgcHJvZmlsZS4gQWxzbywgbm8gZXJhc2luZyBvZiBleHRlcm5hbCBzdG9yYWdlIHNob3VsZCBiZQorICAgICAqIGFsbG93ZWQuCisgICAgICovCiAgICAgcHVibGljIHZvaWQgdGVzdFdpcGVEYXRhKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKICAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIud2lwZURhdGEoMCk7Ci0gICAgICAgIC8vIHRoZSB0ZXN0IHRoYXQgdGhlIHByb2ZpbGUgd2lsbCBpbmRlZWQgYmUgcmVtb3ZlZCBpcyBkb25lIGluIHRoZSBob3N0LgorICAgICAgICAvLyBUaGUgdGVzdCB0aGF0IHRoZSBwcm9maWxlIHdpbGwgaW5kZWVkIGJlIHJlbW92ZWQgaXMgZG9uZSBpbiB0aGUgaG9zdC4KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHdpcGVEYXRhV2l0aFJlYXNvbigpIGZvciB1c2UgaW4gbWFuYWdlZCBwcm9maWxlLiBJZiBjYWxsZWQgZnJvbSBhIG1hbmFnZWQgcHJvZmlsZSwKKyAgICAgKiB3aXBlRGF0YVdpdGhSZWFzb24oKSBzaG91bGQgcmVtb3ZlIHRoZSBjdXJyZW50IG1hbmFnZWQgcHJvZmlsZS5JbiB0aGUgbWVhbiB0aW1lLCBpdCBzaG91bGQKKyAgICAgKiBzZW5kIG91dCBhIG5vdGlmaWNhdGlvbiBjb250YWluaW5nIHRoZSByZWFzb24gZm9yIHdpcGluZyBkYXRhIHRvIHVzZXIuIEFsc28sIG5vIGVyYXNpbmcgb2YKKyAgICAgKiBleHRlcm5hbCBzdG9yYWdlIHNob3VsZCBiZSBhbGxvd2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RXaXBlRGF0YVdpdGhSZWFzb24oKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci53aXBlRGF0YSgwLCBURVNUX1dJUEVfREFUQV9SRUFTT04pOworICAgICAgICAvLyBUaGUgdGVzdCB0aGF0IHRoZSBwcm9maWxlIHdpbGwgaW5kZWVkIGJlIHJlbW92ZWQgaXMgZG9uZSBpbiB0aGUgaG9zdC4KKyAgICAgICAgLy8gTm90aWZpY2F0aW9uIHZlcmlmaWNhdGlvbiBpcyBkb25lIGluIGFub3RoZXIgdGVzdC4KICAgICB9CiB9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvTWFuYWdlZFByb2ZpbGUvc3JjL2NvbS9hbmRyb2lkL2N0cy9tYW5hZ2VkcHJvZmlsZS9XaXBlRGF0YVdpdGhSZWFzb25WZXJpZmljYXRpb25UZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvTWFuYWdlZFByb2ZpbGUvc3JjL2NvbS9hbmRyb2lkL2N0cy9tYW5hZ2VkcHJvZmlsZS9XaXBlRGF0YVdpdGhSZWFzb25WZXJpZmljYXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc3ZmJkMwotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9NYW5hZ2VkUHJvZmlsZS9zcmMvY29tL2FuZHJvaWQvY3RzL21hbmFnZWRwcm9maWxlL1dpcGVEYXRhV2l0aFJlYXNvblZlcmlmaWNhdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDM4IEBACitwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5tYW5hZ2VkcHJvZmlsZTsKKworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLkJ5OworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLlVpRGV2aWNlOworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLlVpT2JqZWN0Tm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QudWlhdXRvbWF0b3IuVW50aWw7CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CisKKy8qKgorICogVGVzdCB3aXBlRGF0YVdpdGhSZWFzb24oKSBoYXMgaW5kZWVkIHNob3duIHRoZSBub3RpZmljYXRpb24uCisgKiBUaGUgZnVuY3Rpb24gd2lwZURhdGFXaXRoUmVhc29uKCkgaXMgY2FsbGVkIGFuZCBleGVjdXRlZCBpbiBhbm90aGVyIHRlc3QuCisgKi8KK3B1YmxpYyBjbGFzcyBXaXBlRGF0YVdpdGhSZWFzb25WZXJpZmljYXRpb25UZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXSVBFX0RBVEFfVElUTEUgPSAiV29yayBwcm9maWxlIGRlbGV0ZWQiOworICAgIC8vIFRoaXMgcmVhc29uIHN0cmluZyBzaG91bGQgYmUgYWxpZ25lZCB3aXRoIHRoZSBvbmUgaW4gV2lwZURhdGFUZXN0IGFzIHRoaXMgaXMgYSBmb2xsb3d1cCB0ZXN0LgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1dJUEVfREFUQV9SRUFTT04gPSAiY3RzIHRlc3QgZm9yIFdpcGVEYXRhV2l0aFJlYXNvbiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBVSV9USU1FT1VUX01JTExJID0gNTAwMDsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RXaXBlRGF0YVdpdGhSZWFzb25WZXJpZmljYXRpb24oKSB0aHJvd3MgVWlPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gVGhlIGZ1bmN0aW9uIHdpcGVEYXRhV2l0aFJlYXNvbigpIGlzIGNhbGxlZCBhbmQgZXhlY3V0ZWQgaW4gYW5vdGhlciB0ZXN0LgorICAgICAgICAvLyBUaGUgZGF0YSBzaG91bGQgYmUgd2lwZWQgYW5kIG5vdGlmaWNhdGlvbiBzaG91bGQgYmUgc2VudCBiZWZvcmUuCisgICAgICAgIFVpRGV2aWNlIHVpRGV2aWNlID0gVWlEZXZpY2UuZ2V0SW5zdGFuY2UoSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkpOworICAgICAgICB1aURldmljZS5vcGVuTm90aWZpY2F0aW9uKCk7CisgICAgICAgIEJvb2xlYW4gd2lwZURhdGFUaXRsZUV4aXN0ID0gdWlEZXZpY2Uud2FpdChVbnRpbC5oYXNPYmplY3QoQnkudGV4dChXSVBFX0RBVEFfVElUTEUpKSwKKyAgICAgICAgICAgICAgICBVSV9USU1FT1VUX01JTExJKTsKKyAgICAgICAgQm9vbGVhbiB3aXBlRGF0YVJlYXNvbkV4aXN0ID0gdWlEZXZpY2Uud2FpdChVbnRpbC5oYXNPYmplY3QoQnkudGV4dChURVNUX1dJUEVfREFUQV9SRUFTT04pKSwKKyAgICAgICAgICAgICAgICBVSV9USU1FT1VUX01JTExJKTsKKworICAgICAgICAvLyBWZXJpZnkgdGhlIG5vdGlmaWNhdGlvbiBpcyB0aGVyZS4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJXaXBlIG5vdGlmaWNhdGlvbiB0aXRsZSBub3QgZm91bmQiLCBCb29sZWFuLlRSVUUsIHdpcGVEYXRhVGl0bGVFeGlzdCk7CisgICAgICAgIGFzc2VydEVxdWFscygiV2lwZSBub3RpZmljYXRpb24gY29udGVudCBub3QgZm91bmQiLAorICAgICAgICAgICAgICAgIEJvb2xlYW4uVFJVRSwgd2lwZURhdGFSZWFzb25FeGlzdCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL01ldGVyZWREYXRhVGVzdEFwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL01ldGVyZWREYXRhVGVzdEFwcC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2M2M0MTBiCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL01ldGVyZWREYXRhVGVzdEFwcC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzcgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworIyBEb24ndCBpbmNsdWRlIHRoaXMgcGFja2FnZSBpbiBhbnkgdGFyZ2V0LgorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworIyBXaGVuIGJ1aWx0LCBleHBsaWNpdGx5IHB1dCBpdCBpbiB0aGUgZGF0YSBwYXJ0aXRpb24uCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCisKKyMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNNZXRlcmVkRGF0YVRlc3RBcHAKKworTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorCisjIHRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0CitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGFyY3RzIGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworCitpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL01ldGVyZWREYXRhVGVzdEFwcC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL01ldGVyZWREYXRhVGVzdEFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMjI4ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvTWV0ZXJlZERhdGFUZXN0QXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwzMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLmN0cy5kZXZpY2Vwb2xpY3kubWV0ZXJlZGRhdGF0ZXN0YXBwIj4KKworICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX05FVFdPUktfU1RBVEUiLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLklOVEVSTkVUIi8+CisKKyAgICA8YXBwbGljYXRpb24+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5NYWluQWN0aXZpdHkiID4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorCis8L21hbmlmZXN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9NZXRlcmVkRGF0YVRlc3RBcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vwb2xpY3kvbWV0ZXJlZGRhdGF0ZXN0YXBwL01haW5BY3Rpdml0eS5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL01ldGVyZWREYXRhVGVzdEFwcC9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZXBvbGljeS9tZXRlcmVkZGF0YXRlc3RhcHAvTWFpbkFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkyODJiMwotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9NZXRlcmVkRGF0YVRlc3RBcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vwb2xpY3kvbWV0ZXJlZGRhdGF0ZXN0YXBwL01haW5BY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5kZXZpY2Vwb2xpY3kubWV0ZXJlZGRhdGF0ZXN0YXBwOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5uZXQuQ29ubmVjdGl2aXR5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbzsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzZW5nZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworcHVibGljIGNsYXNzIE1haW5BY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gTWFpbkFjdGl2aXR5LmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9NRVNTRU5HRVIgPSAibWVzc2VuZ2VyIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX05PVElGWV9ORVRXT1JLX1NUQVRFID0gMTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKKworICAgICAgICBMb2cuaShUQUcsICJvbkNyZWF0ZSBjYWxsZWQiKTsKKyAgICAgICAgbm90aWZ5TmV0d29ya1N0YXRlQ2FsbGJhY2soKTsKKyAgICAgICAgZmluaXNoKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG5vdGlmeU5ldHdvcmtTdGF0ZUNhbGxiYWNrKCkgeworICAgICAgICBmaW5hbCBNZXNzZW5nZXIgY2FsbGJhY2tNZXNzZW5nZXIgPSBuZXcgTWVzc2VuZ2VyKGdldEludGVudCgpLmdldEV4dHJhcygpLmdldEJpbmRlcigKKyAgICAgICAgICAgICAgICBFWFRSQV9NRVNTRU5HRVIpKTsKKyAgICAgICAgaWYgKGNhbGxiYWNrTWVzc2VuZ2VyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgTmV0d29ya0luZm8gbmV0d29ya0luZm8gPSBnZXRBY3RpdmVOZXR3b3JrSW5mbygpOworICAgICAgICAgICAgTG9nLmUoVEFHLCAiZ2V0QWN0aXZlTmV0d29ya05ldHdvcmtJbmZvKCkgaXMgbnVsbCIpOworICAgICAgICAgICAgY2FsbGJhY2tNZXNzZW5nZXIuc2VuZChNZXNzYWdlLm9idGFpbihudWxsLAorICAgICAgICAgICAgICAgICAgICBNU0dfTk9USUZZX05FVFdPUktfU1RBVEUsIG5ldHdvcmtJbmZvKSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJFeGNlcHRpb24gd2hpbGUgc2VuZGluZyB0aGUgbmV0d29yayBzdGF0ZSIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBOZXR3b3JrSW5mbyBnZXRBY3RpdmVOZXR3b3JrSW5mbygpIHsKKyAgICAgICAgZmluYWwgQ29ubmVjdGl2aXR5TWFuYWdlciBjbSA9IChDb25uZWN0aXZpdHlNYW5hZ2VyKSBnZXRTeXN0ZW1TZXJ2aWNlKAorICAgICAgICAgICAgICAgIENvbnRleHQuQ09OTkVDVElWSVRZX1NFUlZJQ0UpOworICAgICAgICByZXR1cm4gY20uZ2V0QWN0aXZlTmV0d29ya0luZm8oKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvUGFja2FnZUluc3RhbGxlci9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL1BhY2thZ2VJbnN0YWxsZXIvQW5kcm9pZC5tawppbmRleCAxMTY4MGU5Li4xZDRmOGFlIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvUGFja2FnZUluc3RhbGxlci9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9QYWNrYWdlSW5zdGFsbGVyL0FuZHJvaWQubWsKQEAgLTI0LDE3ICsyNCwxNiBAQAogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKLUxPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIuc3R1YnMgYW5kcm9pZC50ZXN0LmJhc2Uuc3R1YnMKIAogTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKLSAgICBhbmRyb2lkLXN1cHBvcnQtdjQgXAotICAgIGN0c3Rlc3RydW5uZXIgXAotICAgIHViLXVpYXV0b21hdG9yIFwKLSAgICBsZWdhY3ktYW5kcm9pZC10ZXN0CisgICAgYW5kcm9pZHgubGVnYWN5X2xlZ2FjeS1zdXBwb3J0LXY0IFwKKyAgICBjdHN0ZXN0cnVubmVyLWF4dCBcCisgICAgdWItdWlhdXRvbWF0b3IKIAogTE9DQUxfU0RLX1ZFUlNJT04gOj0gdGVzdF9jdXJyZW50CiAKICMgdGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGFyY3RzIGN0cyB2dHMgZ2VuZXJhbC10ZXN0cwogCiBpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvUGFja2FnZUluc3RhbGxlci9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL1BhY2thZ2VJbnN0YWxsZXIvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA0YjY5YmE2Li5mNGRmY2FmIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvUGFja2FnZUluc3RhbGxlci9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9QYWNrYWdlSW5zdGFsbGVyL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTM4LDcgKzM4LDcgQEAKICAgICA8L2FwcGxpY2F0aW9uPgogCiAgICAgPGluc3RydW1lbnRhdGlvbgotICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5hbmRyb2lkLmN0cy5wYWNrYWdlaW5zdGFsbGVyIgogICAgICAgICBhbmRyb2lkOmxhYmVsPSJQYWNrYWdlIEluc3RhbGxlciBDVFMgVGVzdHMiIC8+CiAKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9QcmludGluZ0FwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL1ByaW50aW5nQXBwL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU4ZjFmNwotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9QcmludGluZ0FwcC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzQgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworIyBEb24ndCBpbmNsdWRlIHRoaXMgcGFja2FnZSBpbiBhbnkgdGFyZ2V0LgorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworIyBXaGVuIGJ1aWx0LCBleHBsaWNpdGx5IHB1dCBpdCBpbiB0aGUgZGF0YSBwYXJ0aXRpb24uCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNEZXZpY2VQb2xpY3lQcmludGluZ0FwcAorCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CisKKyMgdGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gYXJjdHMgY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCisKK2luY2x1ZGUgJChCVUlMRF9DVFNfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9QcmludGluZ0FwcC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL1ByaW50aW5nQXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU1ZmVkNwotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9QcmludGluZ0FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLmN0cy5kZXZpY2Vwb2xpY3kucHJpbnRpbmdhcHAiID4KKworICAgIDxhcHBsaWNhdGlvbj4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLlByaW50QWN0aXZpdHkiIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiIC8+CisgICAgPC9hcHBsaWNhdGlvbj4KKworPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9QcmludGluZ0FwcC9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZXBvbGljeS9wcmludGluZ2FwcC9QcmludEFjdGl2aXR5LmphdmEgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvUHJpbnRpbmdBcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vwb2xpY3kvcHJpbnRpbmdhcHAvUHJpbnRBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NzQzOWQKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvUHJpbnRpbmdBcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vwb2xpY3kvcHJpbnRpbmdhcHAvUHJpbnRBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5kZXZpY2Vwb2xpY3kucHJpbnRpbmdhcHA7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuQ2FuY2VsbGF0aW9uU2lnbmFsOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3I7CitpbXBvcnQgYW5kcm9pZC5wcmludC5QYWdlUmFuZ2U7CitpbXBvcnQgYW5kcm9pZC5wcmludC5QcmludEF0dHJpYnV0ZXM7CitpbXBvcnQgYW5kcm9pZC5wcmludC5QcmludERvY3VtZW50QWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLnByaW50LlByaW50Sm9iOworaW1wb3J0IGFuZHJvaWQucHJpbnQuUHJpbnRNYW5hZ2VyOworCitwdWJsaWMgY2xhc3MgUHJpbnRBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUklOVF9KT0JfTkFNRSA9ICJUZXN0IHByaW50IGpvYiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0VSUk9SX01FU1NBR0UgPSAiZXJyb3JfbWVzc2FnZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0lOSVQgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9TVEFSVEVEID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfRklOSVNIRUQgPSAyOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25TdGFydCgpIHsKKyAgICAgICAgc3VwZXIub25TdGFydCgpOworICAgICAgICBQcmludE1hbmFnZXIgcHJpbnRNYW5hZ2VyID0gZ2V0U3lzdGVtU2VydmljZShQcmludE1hbmFnZXIuY2xhc3MpOworICAgICAgICBmaW5hbCBpbnRbXSBzdGF0ZSA9IG5ldyBpbnRbXXtTVEFURV9JTklUfTsKKyAgICAgICAgUHJpbnRKb2IgcHJpbnRKb2IgPSBwcmludE1hbmFnZXIucHJpbnQoUFJJTlRfSk9CX05BTUUsIG5ldyBQcmludERvY3VtZW50QWRhcHRlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25TdGFydCgpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGVbMF0gIT0gU1RBVEVfSU5JVCkgeworICAgICAgICAgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIGNhbGwgdG8gb25TdGFydCgpIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0YXRlWzBdID0gU1RBVEVfU1RBUlRFRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkZpbmlzaCgpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGVbMF0gIT0gU1RBVEVfU1RBUlRFRCkgeworICAgICAgICAgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIGNhbGwgdG8gb25GaW5pc2goKSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGF0ZVswXSA9IFNUQVRFX0ZJTklTSEVEOworICAgICAgICAgICAgICAgIC8vIFVzZSBSRVNVTFRfRklSU1RfVVNFUiBmb3Igc3VjY2VzcyB0byBhdm9pZCBmYWxzZSBwb3NpdGl2ZXMuCisgICAgICAgICAgICAgICAgc2V0UmVzdWx0KFJFU1VMVF9GSVJTVF9VU0VSKTsKKyAgICAgICAgICAgICAgICBmaW5pc2goKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkxheW91dChQcmludEF0dHJpYnV0ZXMgb2xkQXR0cmlidXRlcywgUHJpbnRBdHRyaWJ1dGVzIG5ld0F0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgIENhbmNlbGxhdGlvblNpZ25hbCBzaWduYWwsIFByaW50RG9jdW1lbnRBZGFwdGVyLkxheW91dFJlc3VsdENhbGxiYWNrIGNiLAorICAgICAgICAgICAgICAgICAgICBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgICAgICAgICAgZmFpbCgib25MYXlvdXQoKSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25Xcml0ZShQYWdlUmFuZ2VbXSBwYWdlcywgUGFyY2VsRmlsZURlc2NyaXB0b3IgZGVzdCwgQ2FuY2VsbGF0aW9uU2lnbmFsIHNpZ25hbCwKKyAgICAgICAgICAgICAgICAgICAgUHJpbnREb2N1bWVudEFkYXB0ZXIuV3JpdGVSZXN1bHRDYWxsYmFjayBjYikgeworICAgICAgICAgICAgICAgIGZhaWwoIm9uV3JpdGUoKSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0sIG5ldyBQcmludEF0dHJpYnV0ZXMuQnVpbGRlcigpLmJ1aWxkKCkpOworICAgICAgICBpZiAocHJpbnRKb2IgIT0gbnVsbCkgeworICAgICAgICAgICAgZmFpbCgicHJpbnQoKSBzaG91bGQgcmV0dXJuIG51bGwiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgdm9pZCBmYWlsKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIHNldFJlc3VsdChSRVNVTFRfRklSU1RfVVNFUiArIDEsIG5ldyBJbnRlbnQoKS5wdXRFeHRyYShFWFRSQV9FUlJPUl9NRVNTQUdFLCBtZXNzYWdlKSk7CisgICAgICAgIGZpbmlzaCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9Qcm9maWxlT3duZXIvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9Qcm9maWxlT3duZXIvQW5kcm9pZC5tawppbmRleCAzNGI4ZTA4Li5lNGI0MTcxIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvUHJvZmlsZU93bmVyL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL1Byb2ZpbGVPd25lci9BbmRyb2lkLm1rCkBAIC0xNyw2ICsxNyw3IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c1Byb2ZpbGVPd25lckFwcAorTE9DQUxfUFJJVkFURV9QTEFURk9STV9BUElTIDo9IHRydWUKIAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIApAQCAtMjQsMTUgKzI1LDE2IEBACiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIAotTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lciBjb25zY3J5cHQgY3RzLWp1bml0CitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBcCisgICAgYW5kcm9pZC50ZXN0LnJ1bm5lci5zdHVicyBcCisgICAgY3RzLWp1bml0IFwKKyAgICBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicyBcCisKIAogTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKLSAgICBjdHN0ZXN0cnVubmVyIFwKLSAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsIFwKLSAgICB1Yi11aWF1dG9tYXRvciBcCi0gICAgbGVnYWN5LWFuZHJvaWQtdGVzdAotCi1MT0NBTF9TREtfVkVSU0lPTiA6PSB0ZXN0X2N1cnJlbnQKKyAgICBjdHN0ZXN0cnVubmVyLWF4dCBcCisgICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgXAorICAgIHViLXVpYXV0b21hdG9yCiAKICMgdGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKIExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvUHJvZmlsZU93bmVyL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvUHJvZmlsZU93bmVyL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggMjZlZmQ5Ny4uYTQ5NGVkNiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL1Byb2ZpbGVPd25lci9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9Qcm9maWxlT3duZXIvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMzYsNyArMzYsNyBAQAogICAgICAgICA8L3JlY2VpdmVyPgogICAgIDwvYXBwbGljYXRpb24+CiAKLSAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5jdHMucHJvZmlsZW93bmVyIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iUHJvZmlsZSBPd25lciBDVFMgdGVzdHMiLz4KIDwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvUHJvZmlsZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvcHJvZmlsZW93bmVyL0FkbWluQWN0aW9uQm9va2tlZXBpbmdUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvUHJvZmlsZU93bmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvcHJvZmlsZW93bmVyL0FkbWluQWN0aW9uQm9va2tlZXBpbmdUZXN0LmphdmEKaW5kZXggYmE3OTE5ZC4uMzgwYWQ5MSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL1Byb2ZpbGVPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL3Byb2ZpbGVvd25lci9BZG1pbkFjdGlvbkJvb2trZWVwaW5nVGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9Qcm9maWxlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9wcm9maWxlb3duZXIvQWRtaW5BY3Rpb25Cb29ra2VlcGluZ1Rlc3QuamF2YQpAQCAtMjIsOSArMjIsOCBAQAogaW1wb3J0IGFuZHJvaWQub3MuVXNlckhhbmRsZTsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOwogCi1pbXBvcnQgY29tLmFuZHJvaWQub3JnLmNvbnNjcnlwdC5UcnVzdGVkQ2VydGlmaWNhdGVTdG9yZTsKLQogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlTdG9yZTsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGU7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRmFjdG9yeTsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKQEAgLTkzLDEyICs5MiwxMyBAQAogICAgICAgICBmaW5hbCBieXRlW10gcmF3Q2VydCA9IFRFU1RfQ0EuZ2V0Qnl0ZXMoKTsKICAgICAgICAgZmluYWwgQ2VydGlmaWNhdGUgY2VydCA9IENlcnRpZmljYXRlRmFjdG9yeS5nZXRJbnN0YW5jZSgiWC41MDkiKQogICAgICAgICAgICAgICAgIC5nZW5lcmF0ZUNlcnRpZmljYXRlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShyYXdDZXJ0KSk7Ci0gICAgICAgIGZpbmFsIFRydXN0ZWRDZXJ0aWZpY2F0ZVN0b3JlIHN0b3JlID0gbmV3IFRydXN0ZWRDZXJ0aWZpY2F0ZVN0b3JlKCk7CiAKICAgICAgICAgLy8gSW5zdGFsbCBhIENBIGNlcnQuCi0gICAgICAgIGFzc2VydE51bGwoc3RvcmUuZ2V0Q2VydGlmaWNhdGVBbGlhcyhjZXJ0KSk7CisgICAgICAgIEtleVN0b3JlIGtleVN0b3JlID0gS2V5U3RvcmUuZ2V0SW5zdGFuY2UoIkFuZHJvaWRDQVN0b3JlIik7CisgICAgICAgIGtleVN0b3JlLmxvYWQobnVsbCwgbnVsbCk7CisgICAgICAgIGFzc2VydE51bGwoa2V5U3RvcmUuZ2V0Q2VydGlmaWNhdGVBbGlhcyhjZXJ0KSk7CiAgICAgICAgIGFzc2VydFRydWUobURldmljZVBvbGljeU1hbmFnZXIuaW5zdGFsbENhQ2VydChnZXRXaG8oKSwgcmF3Q2VydCkpOwotICAgICAgICBmaW5hbCBTdHJpbmcgYWxpYXMgPSBzdG9yZS5nZXRDZXJ0aWZpY2F0ZUFsaWFzKGNlcnQpOworICAgICAgICBmaW5hbCBTdHJpbmcgYWxpYXMgPSBrZXlTdG9yZS5nZXRDZXJ0aWZpY2F0ZUFsaWFzKGNlcnQpOwogICAgICAgICBhc3NlcnROb3ROdWxsKGFsaWFzKTsKIAogICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgQ0EgY2VydCB3YXMgbWFya2VkIGFzIGluc3RhbGxlZCBieSB0aGUgUHJvZmlsZSBPd25lci4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9Qcm9maWxlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9wcm9maWxlb3duZXIvQXBwVXNhZ2VPYnNlcnZlclRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9Qcm9maWxlT3duZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9wcm9maWxlb3duZXIvQXBwVXNhZ2VPYnNlcnZlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTk3YTY0Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL1Byb2ZpbGVPd25lci9zcmMvY29tL2FuZHJvaWQvY3RzL3Byb2ZpbGVvd25lci9BcHBVc2FnZU9ic2VydmVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5jdHMucHJvZmlsZW93bmVyOworCitpbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKK2ltcG9ydCBhbmRyb2lkLmFwcC51c2FnZS5Vc2FnZVN0YXRzTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCitwdWJsaWMgY2xhc3MgQXBwVXNhZ2VPYnNlcnZlclRlc3QgZXh0ZW5kcyBCYXNlUHJvZmlsZU93bmVyVGVzdCB7CisKKyAgICBzdGF0aWMgZmluYWwgaW50IE9CU0VSVkVSX0xJTUlUID0gMTAwMDsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RNaW5UaW1lTGltaXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nW10gcGFja2FnZXMgPSB7Im5vdC5yZWFsLnBhY2thZ2UubmFtZSJ9OworICAgICAgICBmaW5hbCBpbnQgb2JzSWQgPSAwOworICAgICAgICBVc2FnZVN0YXRzTWFuYWdlciB1c20gPSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKFVzYWdlU3RhdHNNYW5hZ2VyLmNsYXNzKTsKKworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChJbnRlbnQuQUNUSU9OX01BSU4pOworICAgICAgICBQZW5kaW5nSW50ZW50IHBlbmRpbmdJbnRlbnQgPSBQZW5kaW5nSW50ZW50LmdldEFjdGl2aXR5KAorICAgICAgICAgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAxLCBpbnRlbnQsIDApOworCisgICAgICAgIHVzbS5yZWdpc3RlckFwcFVzYWdlT2JzZXJ2ZXIob2JzSWQsIHBhY2thZ2VzLCA2MCwgVGltZVVuaXQuU0VDT05EUywgcGVuZGluZ0ludGVudCk7CisgICAgICAgIHVzbS51bnJlZ2lzdGVyQXBwVXNhZ2VPYnNlcnZlcihvYnNJZCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB1c20ucmVnaXN0ZXJBcHBVc2FnZU9ic2VydmVyKG9ic0lkLCBwYWNrYWdlcywgNTksIFRpbWVVbml0LlNFQ09ORFMsIHBlbmRpbmdJbnRlbnQpOworICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgICAgIC8vIERvIG5vdGhpbmcuIEV4Y2VwdGlvbiBpcyBleHBlY3RlZC4KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RPYnNlcnZlckxpbWl0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZ1tdIHBhY2thZ2VzID0geyJub3QucmVhbC5wYWNrYWdlLm5hbWUifTsKKyAgICAgICAgVXNhZ2VTdGF0c01hbmFnZXIgdXNtID0gbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShVc2FnZVN0YXRzTWFuYWdlci5jbGFzcyk7CisKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9NQUlOKTsKKyAgICAgICAgUGVuZGluZ0ludGVudCBwZW5kaW5nSW50ZW50ID0gUGVuZGluZ0ludGVudC5nZXRBY3Rpdml0eSgKKyAgICAgICAgICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgMSwgaW50ZW50LCAwKTsKKworICAgICAgICBmb3IgKGludCBvYnNJZCA9IDA7IG9ic0lkIDwgT0JTRVJWRVJfTElNSVQ7IG9ic0lkKyspIHsKKyAgICAgICAgICAgIHVzbS5yZWdpc3RlckFwcFVzYWdlT2JzZXJ2ZXIob2JzSWQsIHBhY2thZ2VzLCA2MCwgVGltZVVuaXQuTUlOVVRFUywgcGVuZGluZ0ludGVudCk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHVzbS5yZWdpc3RlckFwcFVzYWdlT2JzZXJ2ZXIoT0JTRVJWRVJfTElNSVQsIHBhY2thZ2VzLCA2MCwgVGltZVVuaXQuTUlOVVRFUywKKyAgICAgICAgICAgICAgICAgICAgcGVuZGluZ0ludGVudCk7CisgICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICAgICAgLy8gRG8gbm90aGluZy4gRXhjZXB0aW9uIGlzIGV4cGVjdGVkLgorICAgICAgICB9CisgICAgICAgIGZvciAoaW50IG9ic0lkID0gMDsgb2JzSWQgPCBPQlNFUlZFUl9MSU1JVDsgb2JzSWQrKykgeworICAgICAgICAgICAgdXNtLnVucmVnaXN0ZXJBcHBVc2FnZU9ic2VydmVyKG9ic0lkKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9TaW1wbGVBcHAvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9TaW1wbGVBcHAvQW5kcm9pZC5tawppbmRleCBmMDAwN2RiLi5iNGY2ZTZkIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvU2ltcGxlQXBwL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL1NpbXBsZUFwcC9BbmRyb2lkLm1rCkBAIC0zMiw2ICszMiw2IEBACiBMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CiAKICMgdGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGFyY3RzIGN0cyB2dHMgZ2VuZXJhbC10ZXN0cwogCiBpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvU2ltcGxlQXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvU2ltcGxlQXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggNWE1MjFkYi4uOWFlMGE4NiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL1NpbXBsZUFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9TaW1wbGVBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMTksNiArMTksNyBAQAogICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLmN0cy5sYXVuY2hlcmFwcHMuc2ltcGxlYXBwIj4KIAogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVBRF9DT05UQUNUUyIvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uRk9SRUdST1VORF9TRVJWSUNFIi8+CiAKICAgICA8YXBwbGljYXRpb24+CiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5TaW1wbGVBY3Rpdml0eSIgPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL1NpbXBsZUFwcC9zcmMvY29tL2FuZHJvaWQvY3RzL2xhdW5jaGVyYXBwcy9zaW1wbGVhcHAvU2ltcGxlU2VydmljZS5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL1NpbXBsZUFwcC9zcmMvY29tL2FuZHJvaWQvY3RzL2xhdW5jaGVyYXBwcy9zaW1wbGVhcHAvU2ltcGxlU2VydmljZS5qYXZhCmluZGV4IDBlODcwMDAuLjY3ZmEyNzEgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9TaW1wbGVBcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy9sYXVuY2hlcmFwcHMvc2ltcGxlYXBwL1NpbXBsZVNlcnZpY2UuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvU2ltcGxlQXBwL3NyYy9jb20vYW5kcm9pZC9jdHMvbGF1bmNoZXJhcHBzL3NpbXBsZWFwcC9TaW1wbGVTZXJ2aWNlLmphdmEKQEAgLTE2LDEwICsxNiwxNiBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5sYXVuY2hlcmFwcHMuc2ltcGxlYXBwOwogCitpbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uOworaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbkNoYW5uZWw7CitpbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuYXBwLlNlcnZpY2U7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwogaW1wb3J0IGFuZHJvaWQub3MuUHJvY2VzczsKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKQEAgLTI4LDEzICszNCwyMCBAQAogcHVibGljIGNsYXNzIFNpbXBsZVNlcnZpY2UgZXh0ZW5kcyBTZXJ2aWNlIHsKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFHID0gU2ltcGxlU2VydmljZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7CiAKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TVEFSVF9GT1JFR1JPVU5EID0gImNvbS5hbmRyb2lkLnRlc3QuYWN0aW9uLlNUQVJUX0ZPUkVHUk9VTkQiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1NUT1BfRk9SRUdST1VORCA9ICJjb20uYW5kcm9pZC50ZXN0LmFjdGlvbi5TVE9QX0ZPUkVHUk9VTkQiOworCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFOTkVMX05BTUUgPSAiU2ltcGxlU2VydmljZSI7CisKICAgICBmaW5hbCBCaW5kZXIgbUJpbmRlciA9IG5ldyBCaW5kZXIoKSB7CiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBvblRyYW5zYWN0KGludCBjb2RlLCBQYXJjZWwgZGF0YSwgUGFyY2VsIHJlcGx5LCBpbnQgZmxhZ3MpCiAgICAgICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgICAgICBzd2l0Y2ggKGNvZGUpIHsKICAgICAgICAgICAgICAgICBjYXNlIEZJUlNUX0NBTExfVFJBTlNBQ1RJT046Ci0gICAgICAgICAgICAgICAgICAgIFByb2Nlc3Mua2lsbFByb2Nlc3MoUHJvY2Vzcy5teVBpZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3IEhhbmRsZXIoTG9vcGVyLmdldE1haW5Mb29wZXIoKSkucG9zdCggKCkgLT4geworICAgICAgICAgICAgICAgICAgICAgICAgIFByb2Nlc3Mua2lsbFByb2Nlc3MoUHJvY2Vzcy5teVBpZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBzdXBlci5vblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CkBAIC00Miw4ICs1NSw0MyBAQAogICAgIH07CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZSgpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoKTsKKyAgICAgICAgTG9nLmkoVEFHLCAib25DcmVhdGUgY2FsbGVkIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBvblN0YXJ0Q29tbWFuZChJbnRlbnQgaW50ZW50LCBpbnQgZmxhZ3MsIGludCBzdGFydElkKSB7CisgICAgICAgIExvZy5pKFRBRywgIlN0YXJ0aW5nOiAiICsgaW50ZW50KTsKKyAgICAgICAgaWYgKEFDVElPTl9TVEFSVF9GT1JFR1JPVU5ELmVxdWFscyhpbnRlbnQuZ2V0QWN0aW9uKCkpKSB7CisgICAgICAgICAgICAvLyBTZXQgdGhlIGluZm8gZm9yIHRoZSB2aWV3cyB0aGF0IHNob3cgaW4gdGhlIG5vdGlmaWNhdGlvbiBwYW5lbC4KKyAgICAgICAgICAgIE5vdGlmaWNhdGlvbk1hbmFnZXIgbm0gPSBnZXRTeXN0ZW1TZXJ2aWNlKE5vdGlmaWNhdGlvbk1hbmFnZXIuY2xhc3MpOworICAgICAgICAgICAgaWYgKG5tLmdldE5vdGlmaWNhdGlvbkNoYW5uZWwoQ0hBTk5FTF9OQU1FKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbm0uY3JlYXRlTm90aWZpY2F0aW9uQ2hhbm5lbChuZXcgTm90aWZpY2F0aW9uQ2hhbm5lbChDSEFOTkVMX05BTUUsIENIQU5ORUxfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbk1hbmFnZXIuSU1QT1JUQU5DRV9ERUZBVUxUKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uID0gbmV3IE5vdGlmaWNhdGlvbi5CdWlsZGVyKHRoaXMsIENIQU5ORUxfTkFNRSkKKyAgICAgICAgICAgICAgICAgICAgLnNldFNtYWxsSWNvbihhbmRyb2lkLlIuZHJhd2FibGUuaWNfcG9wdXBfcmVtaW5kZXIpICAvLyB0aGUgc3RhdHVzIGljb24KKyAgICAgICAgICAgICAgICAgICAgLnNldFdoZW4oU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpICAvLyB0aGUgdGltZSBzdGFtcAorICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudFRpdGxlKCJUaGlzIGlzIGEgdGVzdCBub3RpZmljYXRpb24iKSAgLy8gdGhlIGxhYmVsCisgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50VGV4dCgiVGhpcyBpcyBhIHRlc3Qgbm90aWZpY2F0aW9uIikgIC8vIHRoZSBjb250ZW50cyBvZiB0aGUgZW50cnkKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgICAgICBzdGFydEZvcmVncm91bmQoMTAwLCBub3RpZmljYXRpb24pOworICAgICAgICB9IGVsc2UgaWYgKEFDVElPTl9TVE9QX0ZPUkVHUk9VTkQuZXF1YWxzKGludGVudC5nZXRBY3Rpb24oKSkpIHsKKyAgICAgICAgICAgIHN0b3BGb3JlZ3JvdW5kKDEwMCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLm9uU3RhcnRDb21tYW5kKGludGVudCwgZmxhZ3MsIHN0YXJ0SWQpOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBJQmluZGVyIG9uQmluZChJbnRlbnQgaW50ZW50KSB7CiAgICAgICAgIExvZy5pKFRBRywgIm9uQmluZCBjYWxsZWQiKTsKICAgICAgICAgcmV0dXJuIG1CaW5kZXI7CiAgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25EZXN0cm95KCkgeworICAgICAgICBzdXBlci5vbkRlc3Ryb3koKTsKKyAgICAgICAgTG9nLmkoVEFHLCAib25EZXN0cm95IGNhbGxlZCIpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9TaW1wbGVQcmVNQXBwL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvU2ltcGxlUHJlTUFwcC9BbmRyb2lkLm1rCmluZGV4IGRlYjUzMjAuLjRhNmU0ZjggMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9TaW1wbGVQcmVNQXBwL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL1NpbXBsZVByZU1BcHAvQW5kcm9pZC5tawpAQCAtMzEsNiArMzEsNiBAQAogTE9DQUxfU0RLX1ZFUlNJT04gOj0gMjEKIAogIyB0YWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gYXJjdHMgY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiAKIGluY2x1ZGUgJChCVUlMRF9DVFNfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9TaW5nbGVBZG1pbkFwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL1NpbmdsZUFkbWluQXBwL0FuZHJvaWQubWsKaW5kZXggNDI2ZGJmMi4uNWQ5YzFmYyAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL1NpbmdsZUFkbWluQXBwL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL1NpbmdsZUFkbWluQXBwL0FuZHJvaWQubWsKQEAgLTI0LDE1ICsyNCwxNCBAQAogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKLUxPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIgY3RzLWp1bml0CitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzIGN0cy1qdW5pdAogCiBMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgPSBcCi0gICAgYW5kcm9pZC1zdXBwb3J0LXY0IFwKLSAgICBjdHN0ZXN0cnVubmVyIFwKLSAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsIFwKKyAgICBhbmRyb2lkeC5sZWdhY3lfbGVnYWN5LXN1cHBvcnQtdjQgXAorICAgIGN0c3Rlc3RydW5uZXItYXh0IFwKKyAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBcCiAgICAgdWItdWlhdXRvbWF0b3IgXAotICAgIGFuZHJvaWQtc3VwcG9ydC10ZXN0IFwKLSAgICBsZWdhY3ktYW5kcm9pZC10ZXN0CisgICAgYW5kcm9pZHgudGVzdC5ydWxlcwogCiBMT0NBTF9TREtfVkVSU0lPTiA6PSB0ZXN0X2N1cnJlbnQKIApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL1NpbmdsZUFkbWluQXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvU2luZ2xlQWRtaW5BcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA2YWUxZWI0Li5kYWY3ODYyIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvU2luZ2xlQWRtaW5BcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvU2luZ2xlQWRtaW5BcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMzYsNyArMzYsNyBAQAogCiAgICAgPC9hcHBsaWNhdGlvbj4KIAotICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmFuZHJvaWQuY3RzLmRldmljZXBvbGljeS5zaW5nbGVhZG1pbiIKICAgICAgICAgYW5kcm9pZDpsYWJlbD0iTWFuYWdlZCBQcm9maWxlIENUUyBUZXN0cyAoU2luZ2xlIGFkbWluIHJlY2VpdmVyKSIvPgogPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9TaW5nbGVBZG1pbkFwcC9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZXBvbGljeS9zaW5nbGVhZG1pbi9Qcm92aXNpb25pbmdTaW5nbGVBZG1pblRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9TaW5nbGVBZG1pbkFwcC9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZXBvbGljeS9zaW5nbGVhZG1pbi9Qcm92aXNpb25pbmdTaW5nbGVBZG1pblRlc3QuamF2YQppbmRleCAyODI4YjNkLi5jMDkwZDUwIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvU2luZ2xlQWRtaW5BcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vwb2xpY3kvc2luZ2xlYWRtaW4vUHJvdmlzaW9uaW5nU2luZ2xlQWRtaW5UZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL1NpbmdsZUFkbWluQXBwL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlcG9saWN5L3NpbmdsZWFkbWluL1Byb3Zpc2lvbmluZ1NpbmdsZUFkbWluVGVzdC5qYXZhCkBAIC0yNSw4ICsyNSw5IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuZGV2aWNlcG9saWN5LnByb3Zpc2lvbmluZy5TaWxlbnRQcm92aXNpb25pbmdUZXN0TWFuYWdlcjsKIApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL1RyYW5zZmVyT3duZXJJbmNvbWluZ0FwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL1RyYW5zZmVyT3duZXJJbmNvbWluZ0FwcC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNDY3YWYKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvVHJhbnNmZXJPd25lckluY29taW5nQXBwL0FuZHJvaWQubWsKQEAgLTAsMCArMSw0MiBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzVHJhbnNmZXJPd25lckluY29taW5nQXBwCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKKworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lci5zdHVicyBjdHMtanVuaXQKKworTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKKyAgICBhbmRyb2lkeC5sZWdhY3lfbGVnYWN5LXN1cHBvcnQtdjQgXAorICAgIGN0c3Rlc3RydW5uZXItYXh0IFwKKyAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBcCisgICAgdWItdWlhdXRvbWF0b3IgXAorICAgIGFuZHJvaWR4LnRlc3QucnVsZXMgXAorICAgIHRlc3RuZworCitMT0NBTF9TREtfVkVSU0lPTiA6PSB0ZXN0X2N1cnJlbnQKKworIyB0YWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKKworaW5jbHVkZSAkKEJVSUxEX0NUU19QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL1RyYW5zZmVyT3duZXJJbmNvbWluZ0FwcC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL1RyYW5zZmVyT3duZXJJbmNvbWluZ0FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZTlhMDIKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvVHJhbnNmZXJPd25lckluY29taW5nQXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSw1MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5jdHMudHJhbnNmZXJvd25lcmluY29taW5nIj4KKworICAgIDx1c2VzLXNkayBhbmRyb2lkOm1pblNka1ZlcnNpb249IjI0Ii8+CisKKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX1NFQ1VSRV9TRVRUSU5HUyIvPgorCisgICAgPGFwcGxpY2F0aW9uCisgICAgICAgIGFuZHJvaWQ6dGVzdE9ubHk9InRydWUiPgorCisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIi8+CisgICAgICAgIDxyZWNlaXZlcgorICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5jdHMudHJhbnNmZXJvd25lci5EZXZpY2VBbmRQcm9maWxlT3duZXJUcmFuc2ZlckluY29taW5nVGVzdCRCYXNpY0FkbWluUmVjZWl2ZXIiCisgICAgICAgICAgICBhbmRyb2lkOnBlcm1pc3Npb249ImFuZHJvaWQucGVybWlzc2lvbi5CSU5EX0RFVklDRV9BRE1JTiI+CisgICAgICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hcHAuZGV2aWNlX2FkbWluIgorICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnJlc291cmNlPSJAeG1sL2RldmljZV9hZG1pbiIvPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYXBwLmFjdGlvbi5ERVZJQ0VfQURNSU5fRU5BQkxFRCIvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L3JlY2VpdmVyPgorICAgICAgICA8cmVjZWl2ZXIKKyAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuY3RzLnRyYW5zZmVyb3duZXIuRGV2aWNlQW5kUHJvZmlsZU93bmVyVHJhbnNmZXJJbmNvbWluZ1Rlc3QkQmFzaWNBZG1pblJlY2VpdmVyTm9NZXRhZGF0YSIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGVybWlzc2lvbj0iYW5kcm9pZC5wZXJtaXNzaW9uLkJJTkRfREVWSUNFX0FETUlOIj4KKyAgICAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFwcC5kZXZpY2VfYWRtaW4iCisgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cmVzb3VyY2U9IkB4bWwvZGV2aWNlX2FkbWluX25vX3N1cHBvcnRfdHJhbnNmZXJfcG9saWN5Ii8+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hcHAuYWN0aW9uLkRFVklDRV9BRE1JTl9FTkFCTEVEIi8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvcmVjZWl2ZXI+CisgICAgPC9hcHBsaWNhdGlvbj4KKworICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5hbmRyb2lkLmN0cy50cmFuc2Zlcm93bmVyaW5jb21pbmciCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJUcmFuc2ZlciBPd25lciBDVFMgdGVzdHMiLz4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvVHJhbnNmZXJPd25lckluY29taW5nQXBwL3Jlcy94bWwvZGV2aWNlX2FkbWluLnhtbCBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9UcmFuc2Zlck93bmVySW5jb21pbmdBcHAvcmVzL3htbC9kZXZpY2VfYWRtaW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4YTVlNzAKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvVHJhbnNmZXJPd25lckluY29taW5nQXBwL3Jlcy94bWwvZGV2aWNlX2FkbWluLnhtbApAQCAtMCwwICsxLDI4IEBACis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKzxkZXZpY2UtYWRtaW4geG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIiBhbmRyb2lkOnZpc2libGU9ImZhbHNlIj4KKyAgICA8c3VwcG9ydC10cmFuc2Zlci1vd25lcnNoaXAvPgorICAgIDx1c2VzLXBvbGljaWVzPgorICAgICAgICA8bGltaXQtcGFzc3dvcmQvPgorICAgICAgICA8d2F0Y2gtbG9naW4vPgorICAgICAgICA8cmVzZXQtcGFzc3dvcmQvPgorICAgICAgICA8Zm9yY2UtbG9jay8+CisgICAgICAgIDx3aXBlLWRhdGEvPgorICAgICAgICA8ZXhwaXJlLXBhc3N3b3JkLz4KKyAgICAgICAgPGVuY3J5cHRlZC1zdG9yYWdlLz4KKyAgICAgICAgPGRpc2FibGUtY2FtZXJhLz4KKyAgICA8L3VzZXMtcG9saWNpZXM+Cis8L2RldmljZS1hZG1pbj4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9UcmFuc2Zlck93bmVySW5jb21pbmdBcHAvcmVzL3htbC9kZXZpY2VfYWRtaW5fbm9fc3VwcG9ydF90cmFuc2Zlcl9wb2xpY3kueG1sIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL1RyYW5zZmVyT3duZXJJbmNvbWluZ0FwcC9yZXMveG1sL2RldmljZV9hZG1pbl9ub19zdXBwb3J0X3RyYW5zZmVyX3BvbGljeS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA4NjM5MgotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9UcmFuc2Zlck93bmVySW5jb21pbmdBcHAvcmVzL3htbC9kZXZpY2VfYWRtaW5fbm9fc3VwcG9ydF90cmFuc2Zlcl9wb2xpY3kueG1sCkBAIC0wLDAgKzEsMjcgQEAKKzwhLS0KKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorPGRldmljZS1hZG1pbiB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiIGFuZHJvaWQ6dmlzaWJsZT0iZmFsc2UiPgorICAgIDx1c2VzLXBvbGljaWVzPgorICAgICAgICA8bGltaXQtcGFzc3dvcmQvPgorICAgICAgICA8d2F0Y2gtbG9naW4vPgorICAgICAgICA8cmVzZXQtcGFzc3dvcmQvPgorICAgICAgICA8Zm9yY2UtbG9jay8+CisgICAgICAgIDx3aXBlLWRhdGEvPgorICAgICAgICA8ZXhwaXJlLXBhc3N3b3JkLz4KKyAgICAgICAgPGVuY3J5cHRlZC1zdG9yYWdlLz4KKyAgICAgICAgPGRpc2FibGUtY2FtZXJhLz4KKyAgICA8L3VzZXMtcG9saWNpZXM+Cis8L2RldmljZS1hZG1pbj4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9UcmFuc2Zlck93bmVySW5jb21pbmdBcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy90cmFuc2Zlcm93bmVyL0RldmljZUFuZFByb2ZpbGVPd25lclRyYW5zZmVySW5jb21pbmdUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvVHJhbnNmZXJPd25lckluY29taW5nQXBwL3NyYy9jb20vYW5kcm9pZC9jdHMvdHJhbnNmZXJvd25lci9EZXZpY2VBbmRQcm9maWxlT3duZXJUcmFuc2ZlckluY29taW5nVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MmFlYmMKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvVHJhbnNmZXJPd25lckluY29taW5nQXBwL3NyYy9jb20vYW5kcm9pZC9jdHMvdHJhbnNmZXJvd25lci9EZXZpY2VBbmRQcm9maWxlT3duZXJUcmFuc2ZlckluY29taW5nVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTEyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuY3RzLnRyYW5zZmVyb3duZXI7CisKK2ltcG9ydCBzdGF0aWMganVuaXQuZnJhbWV3b3JrLkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIGp1bml0LmZyYW1ld29yay5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMganVuaXQuZnJhbWV3b3JrLkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgYW5kcm9pZC5hcHAuYWRtaW4uRGV2aWNlQWRtaW5SZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5hZG1pbi5EZXZpY2VQb2xpY3lNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlczsKK2ltcG9ydCBhbmRyb2lkLm9zLlBlcnNpc3RhYmxlQnVuZGxlOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK0BTbWFsbFRlc3QKK3B1YmxpYyBjbGFzcyBEZXZpY2VBbmRQcm9maWxlT3duZXJUcmFuc2ZlckluY29taW5nVGVzdCB7CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCYXNpY0FkbWluUmVjZWl2ZXIgZXh0ZW5kcyBEZXZpY2VBZG1pblJlY2VpdmVyIHsKKyAgICAgICAgcHVibGljIEJhc2ljQWRtaW5SZWNlaXZlcigpIHt9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uVHJhbnNmZXJPd25lcnNoaXBDb21wbGV0ZShDb250ZXh0IGNvbnRleHQsIFBlcnNpc3RhYmxlQnVuZGxlIGJ1bmRsZSkgeworICAgICAgICAgICAgcHV0Qm9vbGVhblByZWYoY29udGV4dCwgS0VZX1RSQU5TRkVSX0NPTVBMRVRFRF9DQUxMRUQsIHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCYXNpY0FkbWluUmVjZWl2ZXJOb01ldGFkYXRhIGV4dGVuZHMgRGV2aWNlQWRtaW5SZWNlaXZlciB7CisgICAgICAgIHB1YmxpYyBCYXNpY0FkbWluUmVjZWl2ZXJOb01ldGFkYXRhKCkge30KKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgU0hBUkVEX1BSRUZFUkVOQ0VfTkFNRSA9ICJzaGFyZWQtcHJlZmVyZW5jZS1uYW1lIjsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgS0VZX1RSQU5TRkVSX0NPTVBMRVRFRF9DQUxMRUQgPSAia2V5LXRyYW5zZmVyLWNvbXBsZXRlZC1jYWxsZWQiOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBUkVfUEFSQU1FVEVSU19TQVZFRCA9ICJBUkVfUEFSQU1FVEVSU19TQVZFRCI7CisKKyAgICBwcm90ZWN0ZWQgQ29udGV4dCBtQ29udGV4dDsKKyAgICBwcm90ZWN0ZWQgQ29tcG9uZW50TmFtZSBtSW5jb21pbmdDb21wb25lbnROYW1lOworICAgIHByb3RlY3RlZCBEZXZpY2VQb2xpY3lNYW5hZ2VyIG1EZXZpY2VQb2xpY3lNYW5hZ2VyOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1Db250ZXh0ID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0VGFyZ2V0Q29udGV4dCgpOworICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlciA9IG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoRGV2aWNlUG9saWN5TWFuYWdlci5jbGFzcyk7CisgICAgICAgIG1JbmNvbWluZ0NvbXBvbmVudE5hbWUgPSBuZXcgQ29tcG9uZW50TmFtZShtQ29udGV4dCwgQmFzaWNBZG1pblJlY2VpdmVyLmNsYXNzLmdldE5hbWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJhbnNmZXJDb21wbGV0ZUNhbGxiYWNrSXNDYWxsZWQoKSB7CisgICAgICAgIGFzc2VydFRydWUoZ2V0Qm9vbGVhblByZWYobUNvbnRleHQsIEtFWV9UUkFOU0ZFUl9DT01QTEVURURfQ0FMTEVEKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNBZmZpbGlhdGlvbklkMSgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpZC5udW1iZXIuMSIsIGdldEFmZmlsaWF0aW9uSWQoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QWZmaWxpYXRpb25JZCgpIHsKKyAgICAgICAgQ29tcG9uZW50TmFtZSBhZG1pbiA9IG1JbmNvbWluZ0NvbXBvbmVudE5hbWU7CisgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIgZHBtID0gKERldmljZVBvbGljeU1hbmFnZXIpCisgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkRFVklDRV9QT0xJQ1lfU0VSVklDRSk7CisgICAgICAgIFNldDxTdHJpbmc+IGFmZmlsaWF0aW9uSWRzID0gZHBtLmdldEFmZmlsaWF0aW9uSWRzKGFkbWluKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChhZmZpbGlhdGlvbklkcyk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBhZmZpbGlhdGlvbklkcy5zaXplKCkpOworICAgICAgICByZXR1cm4gYWZmaWxpYXRpb25JZHMuaXRlcmF0b3IoKS5uZXh0KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJhbnNmZXJPd25lcnNoaXBCdW5kbGVMb2FkZWQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgUGVyc2lzdGFibGVCdW5kbGUgYnVuZGxlID0gbURldmljZVBvbGljeU1hbmFnZXIuZ2V0VHJhbnNmZXJPd25lcnNoaXBCdW5kbGUoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChidW5kbGUpOworICAgICAgICBhc3NlcnRUcnVlKGJ1bmRsZS5nZXRCb29sZWFuKEFSRV9QQVJBTUVURVJTX1NBVkVEKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJhbnNmZXJPd25lcnNoaXBFbXB0eUJ1bmRsZUxvYWRlZCgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBQZXJzaXN0YWJsZUJ1bmRsZSBidW5kbGUgPSBtRGV2aWNlUG9saWN5TWFuYWdlci5nZXRUcmFuc2Zlck93bmVyc2hpcEJ1bmRsZSgpOworICAgICAgICBhc3NlcnROb3ROdWxsKGJ1bmRsZSk7CisgICAgICAgIGFzc2VydFRydWUoYnVuZGxlLmlzRW1wdHkoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU2hhcmVkUHJlZmVyZW5jZXMgZ2V0UHJlZnMoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBjb250ZXh0LmdldFNoYXJlZFByZWZlcmVuY2VzKFNIQVJFRF9QUkVGRVJFTkNFX05BTUUsIENvbnRleHQuTU9ERV9QUklWQVRFKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHB1dEJvb2xlYW5QcmVmKENvbnRleHQgY29udGV4dCwgU3RyaW5nIGtleSwgYm9vbGVhbiB2YWx1ZSkgeworICAgICAgICBnZXRQcmVmcyhjb250ZXh0KS5lZGl0KCkucHV0Qm9vbGVhbihrZXksIHZhbHVlKS5hcHBseSgpOworICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBnZXRCb29sZWFuUHJlZihDb250ZXh0IGNvbnRleHQsIFN0cmluZyBrZXkpIHsKKyAgICAgICAgcmV0dXJuIGdldFByZWZzKGNvbnRleHQpLmdldEJvb2xlYW4oa2V5LCBmYWxzZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL1RyYW5zZmVyT3duZXJJbmNvbWluZ0FwcC9zcmMvY29tL2FuZHJvaWQvY3RzL3RyYW5zZmVyb3duZXIvVHJhbnNmZXJEZXZpY2VPd25lckluY29taW5nVGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL1RyYW5zZmVyT3duZXJJbmNvbWluZ0FwcC9zcmMvY29tL2FuZHJvaWQvY3RzL3RyYW5zZmVyb3duZXIvVHJhbnNmZXJEZXZpY2VPd25lckluY29taW5nVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzOWRiYmUKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvVHJhbnNmZXJPd25lckluY29taW5nQXBwL3NyYy9jb20vYW5kcm9pZC9jdHMvdHJhbnNmZXJvd25lci9UcmFuc2ZlckRldmljZU93bmVySW5jb21pbmdUZXN0LmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy50cmFuc2Zlcm93bmVyOworCitpbXBvcnQgc3RhdGljIGp1bml0LmZyYW1ld29yay5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0VGhyb3dzOworCitpbXBvcnQgYW5kcm9pZC5hcHAuYWRtaW4uU3lzdGVtVXBkYXRlUG9saWN5OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworCitAU21hbGxUZXN0CitwdWJsaWMgY2xhc3MgVHJhbnNmZXJEZXZpY2VPd25lckluY29taW5nVGVzdCBleHRlbmRzIERldmljZUFuZFByb2ZpbGVPd25lclRyYW5zZmVySW5jb21pbmdUZXN0IHsKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUcmFuc2ZlclBvbGljaWVzQXJlUmV0YWluZWRBZnRlclRyYW5zZmVyKCkgeworICAgICAgICBhc3NlcnRUcnVlKG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmlzQWRtaW5BY3RpdmUobUluY29taW5nQ29tcG9uZW50TmFtZSkpOworICAgICAgICBhc3NlcnRUcnVlKG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmlzRGV2aWNlT3duZXJBcHAobUluY29taW5nQ29tcG9uZW50TmFtZS5nZXRQYWNrYWdlTmFtZSgpKSk7CisgICAgICAgIGFzc2VydFRydWUobURldmljZVBvbGljeU1hbmFnZXIuZ2V0Q2FtZXJhRGlzYWJsZWQobUluY29taW5nQ29tcG9uZW50TmFtZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCgidGVzdC5wYWNrYWdlIiksCisgICAgICAgICAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuZ2V0S2VlcFVuaW5zdGFsbGVkUGFja2FnZXMobUluY29taW5nQ29tcG9uZW50TmFtZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTIzLCBtRGV2aWNlUG9saWN5TWFuYWdlci5nZXRQYXNzd29yZE1pbmltdW1MZW5ndGgobUluY29taW5nQ29tcG9uZW50TmFtZSkpOworICAgICAgICBhc3NlcnRTeXN0ZW1Qb2xpY2llc0VxdWFsKFN5c3RlbVVwZGF0ZVBvbGljeS5jcmVhdGVXaW5kb3dlZEluc3RhbGxQb2xpY3koMTIzLCA0NTYpLAorICAgICAgICAgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmdldFN5c3RlbVVwZGF0ZVBvbGljeSgpKTsKKyAgICAgICAgYXNzZXJ0VGhyb3dzKFNlY3VyaXR5RXhjZXB0aW9uLmNsYXNzLCAoKSAtPiB7CisgICAgICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5nZXRQYXJlbnRQcm9maWxlSW5zdGFuY2UobUluY29taW5nQ29tcG9uZW50TmFtZSk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRTeXN0ZW1Qb2xpY2llc0VxdWFsKFN5c3RlbVVwZGF0ZVBvbGljeSBwb2xpY3kxLCBTeXN0ZW1VcGRhdGVQb2xpY3kgcG9saWN5MikgeworICAgICAgICBhc3NlcnRUcnVlKHBvbGljeTEuZ2V0UG9saWN5VHlwZSgpID09IHBvbGljeTIuZ2V0UG9saWN5VHlwZSgpCisgICAgICAgICAgICAgICAgJiYgcG9saWN5MS5nZXRJbnN0YWxsV2luZG93U3RhcnQoKSA9PSBwb2xpY3kyLmdldEluc3RhbGxXaW5kb3dTdGFydCgpCisgICAgICAgICAgICAgICAgJiYgcG9saWN5MS5nZXRJbnN0YWxsV2luZG93RW5kKCkgPT0gcG9saWN5Mi5nZXRJbnN0YWxsV2luZG93RW5kKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9UcmFuc2Zlck93bmVySW5jb21pbmdBcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy90cmFuc2Zlcm93bmVyL1RyYW5zZmVyUHJvZmlsZU93bmVySW5jb21pbmdUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvVHJhbnNmZXJPd25lckluY29taW5nQXBwL3NyYy9jb20vYW5kcm9pZC9jdHMvdHJhbnNmZXJvd25lci9UcmFuc2ZlclByb2ZpbGVPd25lckluY29taW5nVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmYWRjMTAKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvVHJhbnNmZXJPd25lckluY29taW5nQXBwL3NyYy9jb20vYW5kcm9pZC9jdHMvdHJhbnNmZXJvd25lci9UcmFuc2ZlclByb2ZpbGVPd25lckluY29taW5nVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5jdHMudHJhbnNmZXJvd25lcjsKKworaW1wb3J0IHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5hZG1pbi5EZXZpY2VQb2xpY3lNYW5hZ2VyOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitAU21hbGxUZXN0CitwdWJsaWMgY2xhc3MgVHJhbnNmZXJQcm9maWxlT3duZXJJbmNvbWluZ1Rlc3QgZXh0ZW5kcyBEZXZpY2VBbmRQcm9maWxlT3duZXJUcmFuc2ZlckluY29taW5nVGVzdCB7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJhbnNmZXJQb2xpY2llc0FyZVJldGFpbmVkQWZ0ZXJUcmFuc2ZlcigpIHsKKyAgICAgICAgaW50IHBhc3N3b3JkTGVuZ3RoID0gMTIzOworICAgICAgICBpbnQgcGFzc3dvcmRFeHBpcmF0aW9uVGltZW91dCA9IDQ1NjsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtRGV2aWNlUG9saWN5TWFuYWdlci5pc0FkbWluQWN0aXZlKG1JbmNvbWluZ0NvbXBvbmVudE5hbWUpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtRGV2aWNlUG9saWN5TWFuYWdlci5pc1Byb2ZpbGVPd25lckFwcChtSW5jb21pbmdDb21wb25lbnROYW1lLmdldFBhY2thZ2VOYW1lKCkpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtRGV2aWNlUG9saWN5TWFuYWdlci5nZXRDYW1lcmFEaXNhYmxlZChtSW5jb21pbmdDb21wb25lbnROYW1lKSk7CisgICAgICAgIGFzc2VydFRydWUobURldmljZVBvbGljeU1hbmFnZXIuZ2V0Q3Jvc3NQcm9maWxlQ2FsbGVySWREaXNhYmxlZChtSW5jb21pbmdDb21wb25lbnROYW1lKSk7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICBwYXNzd29yZExlbmd0aCwKKyAgICAgICAgICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5nZXRQYXNzd29yZE1pbmltdW1MZW5ndGgobUluY29taW5nQ29tcG9uZW50TmFtZSkpOworCisgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIgdGFyZ2V0UGFyZW50UHJvZmlsZUluc3RhbmNlID0KKyAgICAgICAgICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5nZXRQYXJlbnRQcm9maWxlSW5zdGFuY2UobUluY29taW5nQ29tcG9uZW50TmFtZSk7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICBwYXNzd29yZEV4cGlyYXRpb25UaW1lb3V0LAorICAgICAgICAgICAgICAgIHRhcmdldFBhcmVudFByb2ZpbGVJbnN0YW5jZS5nZXRQYXNzd29yZEV4cGlyYXRpb25UaW1lb3V0KG1JbmNvbWluZ0NvbXBvbmVudE5hbWUpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvVHJhbnNmZXJPd25lck91dGdvaW5nQXBwL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvVHJhbnNmZXJPd25lck91dGdvaW5nQXBwL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA0NmRhMgotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9UcmFuc2Zlck93bmVyT3V0Z29pbmdBcHAvQW5kcm9pZC5tawpAQCAtMCwwICsxLDQyIEBACisjIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNUcmFuc2Zlck93bmVyT3V0Z29pbmdBcHAKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQorCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzIGN0cy1qdW5pdAorCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAorICAgIGFuZHJvaWR4LmxlZ2FjeV9sZWdhY3ktc3VwcG9ydC12NCBcCisgICAgY3RzdGVzdHJ1bm5lci1heHQgXAorICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0IFwKKyAgICB1Yi11aWF1dG9tYXRvciBcCisgICAgYW5kcm9pZHgudGVzdC5ydWxlcyBcCisgICAgdGVzdG5nCisKK0xPQ0FMX1NES19WRVJTSU9OIDo9IHRlc3RfY3VycmVudAorCisjIHRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0CitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworCitpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvVHJhbnNmZXJPd25lck91dGdvaW5nQXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvVHJhbnNmZXJPd25lck91dGdvaW5nQXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFhNmRiYgotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9UcmFuc2Zlck93bmVyT3V0Z29pbmdBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDQyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLmN0cy50cmFuc2Zlcm93bmVyb3V0Z29pbmciPgorCisgICAgPHVzZXMtc2RrIGFuZHJvaWQ6bWluU2RrVmVyc2lvbj0iMjQiLz4KKworICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uV1JJVEVfU0VDVVJFX1NFVFRJTkdTIi8+CisKKyAgICA8YXBwbGljYXRpb24KKyAgICAgICAgYW5kcm9pZDp0ZXN0T25seT0idHJ1ZSI+CisKKyAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiLz4KKyAgICAgICAgPHJlY2VpdmVyCisgICAgICAgICAgICBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLmN0cy50cmFuc2Zlcm93bmVyLkRldmljZUFuZFByb2ZpbGVPd25lclRyYW5zZmVyT3V0Z29pbmdUZXN0JEJhc2ljQWRtaW5SZWNlaXZlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGVybWlzc2lvbj0iYW5kcm9pZC5wZXJtaXNzaW9uLkJJTkRfREVWSUNFX0FETUlOIj4KKyAgICAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFwcC5kZXZpY2VfYWRtaW4iCisgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cmVzb3VyY2U9IkB4bWwvZGV2aWNlX2FkbWluIi8+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hcHAuYWN0aW9uLkRFVklDRV9BRE1JTl9FTkFCTEVEIi8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvcmVjZWl2ZXI+CisgICAgPC9hcHBsaWNhdGlvbj4KKworICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5hbmRyb2lkLmN0cy50cmFuc2Zlcm93bmVyb3V0Z29pbmciCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJUcmFuc2ZlciBPd25lciBDVFMgdGVzdHMiLz4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvVHJhbnNmZXJPd25lck91dGdvaW5nQXBwL3Jlcy94bWwvZGV2aWNlX2FkbWluLnhtbCBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9UcmFuc2Zlck93bmVyT3V0Z29pbmdBcHAvcmVzL3htbC9kZXZpY2VfYWRtaW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2YTM3MzAKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvVHJhbnNmZXJPd25lck91dGdvaW5nQXBwL3Jlcy94bWwvZGV2aWNlX2FkbWluLnhtbApAQCAtMCwwICsxLDEyIEBACis8ZGV2aWNlLWFkbWluIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIgYW5kcm9pZDp2aXNpYmxlPSJmYWxzZSI+CisgICAgPHVzZXMtcG9saWNpZXM+CisgICAgICAgIDxsaW1pdC1wYXNzd29yZC8+CisgICAgICAgIDx3YXRjaC1sb2dpbi8+CisgICAgICAgIDxyZXNldC1wYXNzd29yZC8+CisgICAgICAgIDxmb3JjZS1sb2NrLz4KKyAgICAgICAgPHdpcGUtZGF0YS8+CisgICAgICAgIDxleHBpcmUtcGFzc3dvcmQvPgorICAgICAgICA8ZW5jcnlwdGVkLXN0b3JhZ2UvPgorICAgICAgICA8ZGlzYWJsZS1jYW1lcmEvPgorICAgIDwvdXNlcy1wb2xpY2llcz4KKzwvZGV2aWNlLWFkbWluPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL1RyYW5zZmVyT3duZXJPdXRnb2luZ0FwcC9zcmMvY29tL2FuZHJvaWQvY3RzL3RyYW5zZmVyb3duZXIvRGV2aWNlQW5kUHJvZmlsZU93bmVyVHJhbnNmZXJPdXRnb2luZ1Rlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9UcmFuc2Zlck93bmVyT3V0Z29pbmdBcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy90cmFuc2Zlcm93bmVyL0RldmljZUFuZFByb2ZpbGVPd25lclRyYW5zZmVyT3V0Z29pbmdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFlZGQxYgotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9UcmFuc2Zlck93bmVyT3V0Z29pbmdBcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy90cmFuc2Zlcm93bmVyL0RldmljZUFuZFByb2ZpbGVPd25lclRyYW5zZmVyT3V0Z29pbmdUZXN0LmphdmEKQEAgLTAsMCArMSwyMTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5jdHMudHJhbnNmZXJvd25lcjsKKworaW1wb3J0IHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0LmFzc2VydE5vdE51bGw7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydFRocm93czsKKworaW1wb3J0IGFuZHJvaWQuYXBwLmFkbWluLkRldmljZUFkbWluUmVjZWl2ZXI7CitpbXBvcnQgYW5kcm9pZC5hcHAuYWRtaW4uRGV2aWNlUG9saWN5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlczsKK2ltcG9ydCBhbmRyb2lkLm9zLlBlcnNpc3RhYmxlQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuVXNlckhhbmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlVzZXJNYW5hZ2VyOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQmxvY2tpbmdCcm9hZGNhc3RSZWNlaXZlcjsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIERldmljZUFuZFByb2ZpbGVPd25lclRyYW5zZmVyT3V0Z29pbmdUZXN0IHsKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJhc2ljQWRtaW5SZWNlaXZlciBleHRlbmRzIERldmljZUFkbWluUmVjZWl2ZXIgeworICAgICAgICBwdWJsaWMgQmFzaWNBZG1pblJlY2VpdmVyKCkge30KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25UcmFuc2ZlckFmZmlsaWF0ZWRQcm9maWxlT3duZXJzaGlwQ29tcGxldGUoQ29udGV4dCBjb250ZXh0LCBVc2VySGFuZGxlIHVzZXIpIHsKKyAgICAgICAgICAgIHB1dEJvb2xlYW5QcmVmKGNvbnRleHQsIEtFWV9UUkFOU0ZFUl9BRkZJTElBVEVEX1BST0ZJTEVfQ09NUExFVEVEX0NBTExFRCwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBTlNGRVJfT1dORVJfSU5DT01JTkdfUEtHID0KKyAgICAgICAgICAgICJjb20uYW5kcm9pZC5jdHMudHJhbnNmZXJvd25lcmluY29taW5nIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBTlNGRVJfT1dORVJfSU5DT01JTkdfVEVTVF9SRUNFSVZFUl9DTEFTUyA9CisgICAgICAgICAgICAiY29tLmFuZHJvaWQuY3RzLnRyYW5zZmVyb3duZXIuRGV2aWNlQW5kUHJvZmlsZU93bmVyVHJhbnNmZXJJbmNvbWluZ1Rlc3QiCisgICAgICAgICAgICAgICAgICAgICsgIiRCYXNpY0FkbWluUmVjZWl2ZXIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFOU0ZFUl9PV05FUl9JTkNPTUlOR19URVNUX1JFQ0VJVkVSX05PX01FVEFEQVRBX0NMQVNTID0KKyAgICAgICAgICAgICJjb20uYW5kcm9pZC5jdHMudHJhbnNmZXJvd25lci5EZXZpY2VBbmRQcm9maWxlT3duZXJUcmFuc2ZlckluY29taW5nVGVzdCIKKyAgICAgICAgICAgICAgICAgICAgKyAiJEJhc2ljQWRtaW5SZWNlaXZlck5vTWV0YWRhdGEiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUkVfUEFSQU1FVEVSU19TQVZFRCA9ICJBUkVfUEFSQU1FVEVSU19TQVZFRCI7CisgICAgc3RhdGljIGZpbmFsIENvbXBvbmVudE5hbWUgSU5DT01JTkdfQ09NUE9ORU5UX05BTUUgPQorICAgICAgICAgICAgbmV3IENvbXBvbmVudE5hbWUoCisgICAgICAgICAgICAgICAgICAgIFRSQU5TRkVSX09XTkVSX0lOQ09NSU5HX1BLRywgVFJBTlNGRVJfT1dORVJfSU5DT01JTkdfVEVTVF9SRUNFSVZFUl9DTEFTUyk7CisgICAgc3RhdGljIGZpbmFsIENvbXBvbmVudE5hbWUgSU5DT01JTkdfTk9fTUVUQURBVEFfQ09NUE9ORU5UX05BTUUgPQorICAgICAgICAgICAgbmV3IENvbXBvbmVudE5hbWUoVFJBTlNGRVJfT1dORVJfSU5DT01JTkdfUEtHLAorICAgICAgICAgICAgICAgICAgICBUUkFOU0ZFUl9PV05FUl9JTkNPTUlOR19URVNUX1JFQ0VJVkVSX05PX01FVEFEQVRBX0NMQVNTKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wb25lbnROYW1lIElOVkFMSURfVEFSR0VUX0NPTVBPTkVOVCA9CisgICAgICAgICAgICBuZXcgQ29tcG9uZW50TmFtZSgiY29tLmFuZHJvaWQuY3RzLmludGVudC5yZWNlaXZlciIsICIuQnJvYWRjYXN0SW50ZW50UmVjZWl2ZXIiKTsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgU0hBUkVEX1BSRUZFUkVOQ0VfTkFNRSA9ICJzaGFyZWQtcHJlZmVyZW5jZS1uYW1lIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9UUkFOU0ZFUl9BRkZJTElBVEVEX1BST0ZJTEVfQ09NUExFVEVEX0NBTExFRCA9CisgICAgICAgICAgICAia2V5LXRyYW5zZmVyLWFmZmlsaWF0ZWQtY29tcGxldGVkLWNhbGxlZCI7CisKKyAgICBwcm90ZWN0ZWQgRGV2aWNlUG9saWN5TWFuYWdlciBtRGV2aWNlUG9saWN5TWFuYWdlcjsKKyAgICBwcm90ZWN0ZWQgQ29tcG9uZW50TmFtZSBtT3V0Z29pbmdDb21wb25lbnROYW1lOworICAgIHByb3RlY3RlZCBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgU3RyaW5nIG1Pd25lckNoYW5nZWRCcm9hZGNhc3RBY3Rpb247CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbUNvbnRleHQgPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRUYXJnZXRDb250ZXh0KCk7CisgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyID0gbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShEZXZpY2VQb2xpY3lNYW5hZ2VyLmNsYXNzKTsKKyAgICAgICAgbU91dGdvaW5nQ29tcG9uZW50TmFtZSA9IG5ldyBDb21wb25lbnROYW1lKG1Db250ZXh0LCBCYXNpY0FkbWluUmVjZWl2ZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXR1cFRlc3RQYXJhbWV0ZXJzKFN0cmluZyBvd25lckNoYW5nZWRCcm9hZGNhc3RBY3Rpb24pIHsKKyAgICAgICAgbU93bmVyQ2hhbmdlZEJyb2FkY2FzdEFjdGlvbiA9IG93bmVyQ2hhbmdlZEJyb2FkY2FzdEFjdGlvbjsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUcmFuc2ZlclNhbWVBZG1pbigpIHsKKyAgICAgICAgUGVyc2lzdGFibGVCdW5kbGUgYiA9IG5ldyBQZXJzaXN0YWJsZUJ1bmRsZSgpOworICAgICAgICBhc3NlcnRUaHJvd3MoCisgICAgICAgICAgICAgICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzLAorICAgICAgICAgICAgICAgICgpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIudHJhbnNmZXJPd25lcnNoaXAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU91dGdvaW5nQ29tcG9uZW50TmFtZSwgbU91dGdvaW5nQ29tcG9uZW50TmFtZSwgYik7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJhbnNmZXJJbnZhbGlkVGFyZ2V0KCkgeworICAgICAgICBQZXJzaXN0YWJsZUJ1bmRsZSBiID0gbmV3IFBlcnNpc3RhYmxlQnVuZGxlKCk7CisgICAgICAgIGFzc2VydFRocm93cygKKyAgICAgICAgICAgICAgICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MsCisgICAgICAgICAgICAgICAgKCkgLT4geworICAgICAgICAgICAgICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci50cmFuc2Zlck93bmVyc2hpcChtT3V0Z29pbmdDb21wb25lbnROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVkFMSURfVEFSR0VUX0NPTVBPTkVOVCwgYik7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJhbnNmZXJPd25lcnNoaXBDaGFuZ2VkQnJvYWRjYXN0KCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIEJsb2NraW5nQnJvYWRjYXN0UmVjZWl2ZXIgcmVjZWl2ZXIgPSBuZXcgQmxvY2tpbmdCcm9hZGNhc3RSZWNlaXZlcihtQ29udGV4dCwKKyAgICAgICAgICAgICAgICBtT3duZXJDaGFuZ2VkQnJvYWRjYXN0QWN0aW9uKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlY2VpdmVyLnJlZ2lzdGVyKCk7CisgICAgICAgICAgICBQZXJzaXN0YWJsZUJ1bmRsZSBiID0gbmV3IFBlcnNpc3RhYmxlQnVuZGxlKCk7CisgICAgICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci50cmFuc2Zlck93bmVyc2hpcChtT3V0Z29pbmdDb21wb25lbnROYW1lLAorICAgICAgICAgICAgICAgICAgICBJTkNPTUlOR19DT01QT05FTlRfTkFNRSwgYik7CisgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gcmVjZWl2ZXIuYXdhaXRGb3JCcm9hZGNhc3QoKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoaW50ZW50KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHJlY2VpdmVyLnVucmVnaXN0ZXJRdWlldGx5KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgdm9pZCB0ZXN0VHJhbnNmZXJPd25lcnNoaXAoKSB0aHJvd3MgVGhyb3dhYmxlOworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJhbnNmZXJPd25lcnNoaXBOdWxsQnVuZGxlKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnRyYW5zZmVyT3duZXJzaGlwKG1PdXRnb2luZ0NvbXBvbmVudE5hbWUsCisgICAgICAgICAgICAgICAgSU5DT01JTkdfQ09NUE9ORU5UX05BTUUsIG51bGwpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRyYW5zZmVyT3duZXJzaGlwTm9NZXRhZGF0YSgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBQZXJzaXN0YWJsZUJ1bmRsZSBiID0gbmV3IFBlcnNpc3RhYmxlQnVuZGxlKCk7CisgICAgICAgIGFzc2VydFRocm93cygKKyAgICAgICAgICAgICAgICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MsCisgICAgICAgICAgICAgICAgKCkgLT4geworICAgICAgICAgICAgICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci50cmFuc2Zlck93bmVyc2hpcChtT3V0Z29pbmdDb21wb25lbnROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ09NSU5HX05PX01FVEFEQVRBX0NPTVBPTkVOVF9OQU1FLCBiKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbGVhckRpc2FsbG93QWRkTWFuYWdlZFByb2ZpbGVSZXN0cmljdGlvbigpIHsKKyAgICAgICAgc2V0VXNlclJlc3RyaWN0aW9uKFVzZXJNYW5hZ2VyLkRJU0FMTE9XX0FERF9NQU5BR0VEX1BST0ZJTEUsIGZhbHNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBZGREaXNhbGxvd0FkZE1hbmFnZWRQcm9maWxlUmVzdHJpY3Rpb24oKSB7CisgICAgICAgIHNldFVzZXJSZXN0cmljdGlvbihVc2VyTWFuYWdlci5ESVNBTExPV19SRU1PVkVfTUFOQUdFRF9QUk9GSUxFLCB0cnVlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRBZmZpbGlhdGlvbklkMSgpIHsKKyAgICAgICAgc2V0QWZmaWxpYXRpb25JZCgiaWQubnVtYmVyLjEiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUcmFuc2Zlck93bmVyc2hpcEJ1bmRsZVNhdmVkKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIFBlcnNpc3RhYmxlQnVuZGxlIGIgPSBuZXcgUGVyc2lzdGFibGVCdW5kbGUoKTsKKyAgICAgICAgYi5wdXRCb29sZWFuKEFSRV9QQVJBTUVURVJTX1NBVkVELCB0cnVlKTsKKyAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIudHJhbnNmZXJPd25lcnNoaXAobU91dGdvaW5nQ29tcG9uZW50TmFtZSwgSU5DT01JTkdfQ09NUE9ORU5UX05BTUUsIGIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFRyYW5zZmVyT3duZXJzaGlwQnVuZGxlT25seUNhbGxlZEZyb21BZG1pbigpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBQZXJzaXN0YWJsZUJ1bmRsZSBiID0gbmV3IFBlcnNpc3RhYmxlQnVuZGxlKCk7CisgICAgICAgIGIucHV0Qm9vbGVhbihBUkVfUEFSQU1FVEVSU19TQVZFRCwgdHJ1ZSk7CisgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnRyYW5zZmVyT3duZXJzaGlwKG1PdXRnb2luZ0NvbXBvbmVudE5hbWUsIElOQ09NSU5HX0NPTVBPTkVOVF9OQU1FLCBiKTsKKyAgICAgICAgYXNzZXJ0VGhyb3dzKFNlY3VyaXR5RXhjZXB0aW9uLmNsYXNzLCBtRGV2aWNlUG9saWN5TWFuYWdlcjo6Z2V0VHJhbnNmZXJPd25lcnNoaXBCdW5kbGUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElzQnVuZGxlTnVsbE5vVHJhbnNmZXIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgYXNzZXJ0TnVsbChtRGV2aWNlUG9saWN5TWFuYWdlci5nZXRUcmFuc2Zlck93bmVyc2hpcEJ1bmRsZSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0VXNlclJlc3RyaWN0aW9uKFN0cmluZyByZXN0cmljdGlvbiwgYm9vbGVhbiBhZGQpIHsKKyAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlciBkcG0gPSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKERldmljZVBvbGljeU1hbmFnZXIuY2xhc3MpOworICAgICAgICBpZiAoYWRkKSB7CisgICAgICAgICAgICBkcG0uYWRkVXNlclJlc3RyaWN0aW9uKG1PdXRnb2luZ0NvbXBvbmVudE5hbWUsIHJlc3RyaWN0aW9uKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRwbS5jbGVhclVzZXJSZXN0cmljdGlvbihtT3V0Z29pbmdDb21wb25lbnROYW1lLCByZXN0cmljdGlvbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0QWZmaWxpYXRpb25JZChTdHJpbmcgaWQpIHsKKyAgICAgICAgQ29tcG9uZW50TmFtZSBhZG1pbiA9IG1PdXRnb2luZ0NvbXBvbmVudE5hbWU7CisgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIgZHBtID0gKERldmljZVBvbGljeU1hbmFnZXIpCisgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkRFVklDRV9QT0xJQ1lfU0VSVklDRSk7CisgICAgICAgIFNldDxTdHJpbmc+IGlkcyA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbihpZCk7CisgICAgICAgIGRwbS5zZXRBZmZpbGlhdGlvbklkcyhhZG1pbiwgaWRzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGlkcywgZHBtLmdldEFmZmlsaWF0aW9uSWRzKGFkbWluKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU2hhcmVkUHJlZmVyZW5jZXMgZ2V0UHJlZnMoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBjb250ZXh0LmdldFNoYXJlZFByZWZlcmVuY2VzKFNIQVJFRF9QUkVGRVJFTkNFX05BTUUsIENvbnRleHQuTU9ERV9QUklWQVRFKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHB1dEJvb2xlYW5QcmVmKENvbnRleHQgY29udGV4dCwgU3RyaW5nIGtleSwgYm9vbGVhbiB2YWx1ZSkgeworICAgICAgICBnZXRQcmVmcyhjb250ZXh0KS5lZGl0KCkucHV0Qm9vbGVhbihrZXksIHZhbHVlKS5hcHBseSgpOworICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBnZXRCb29sZWFuUHJlZihDb250ZXh0IGNvbnRleHQsIFN0cmluZyBrZXkpIHsKKyAgICAgICAgcmV0dXJuIGdldFByZWZzKGNvbnRleHQpLmdldEJvb2xlYW4oa2V5LCBmYWxzZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL1RyYW5zZmVyT3duZXJPdXRnb2luZ0FwcC9zcmMvY29tL2FuZHJvaWQvY3RzL3RyYW5zZmVyb3duZXIvVHJhbnNmZXJEZXZpY2VPd25lck91dGdvaW5nVGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL1RyYW5zZmVyT3duZXJPdXRnb2luZ0FwcC9zcmMvY29tL2FuZHJvaWQvY3RzL3RyYW5zZmVyb3duZXIvVHJhbnNmZXJEZXZpY2VPd25lck91dGdvaW5nVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MmIyYmQKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvVHJhbnNmZXJPd25lck91dGdvaW5nQXBwL3NyYy9jb20vYW5kcm9pZC9jdHMvdHJhbnNmZXJvd25lci9UcmFuc2ZlckRldmljZU93bmVyT3V0Z29pbmdUZXN0LmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy50cmFuc2Zlcm93bmVyOworCitpbXBvcnQgc3RhdGljIGp1bml0LmZyYW1ld29yay5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0VGhyb3dzOworCitpbXBvcnQgYW5kcm9pZC5hcHAuYWRtaW4uRGV2aWNlUG9saWN5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5hZG1pbi5TeXN0ZW1VcGRhdGVQb2xpY3k7CitpbXBvcnQgYW5kcm9pZC5vcy5QZXJzaXN0YWJsZUJ1bmRsZTsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKKworQFNtYWxsVGVzdAorcHVibGljIGNsYXNzIFRyYW5zZmVyRGV2aWNlT3duZXJPdXRnb2luZ1Rlc3QgZXh0ZW5kcyBEZXZpY2VBbmRQcm9maWxlT3duZXJUcmFuc2Zlck91dGdvaW5nVGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICBzZXR1cFRlc3RQYXJhbWV0ZXJzKERldmljZVBvbGljeU1hbmFnZXIuQUNUSU9OX0RFVklDRV9PV05FUl9DSEFOR0VEKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUcmFuc2ZlcldpdGhQb2xpY2llc091dGdvaW5nKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGludCBwYXNzd29yZExlbmd0aCA9IDEyMzsKKyAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuc2V0Q2FtZXJhRGlzYWJsZWQobU91dGdvaW5nQ29tcG9uZW50TmFtZSwgdHJ1ZSk7CisgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnNldFBhc3N3b3JkTWluaW11bUxlbmd0aChtT3V0Z29pbmdDb21wb25lbnROYW1lLCBwYXNzd29yZExlbmd0aCk7CisgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnNldEtlZXBVbmluc3RhbGxlZFBhY2thZ2VzKG1PdXRnb2luZ0NvbXBvbmVudE5hbWUsCisgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCgidGVzdC5wYWNrYWdlIikpOworICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5zZXRTeXN0ZW1VcGRhdGVQb2xpY3kobU91dGdvaW5nQ29tcG9uZW50TmFtZSwKKyAgICAgICAgICAgICAgICBTeXN0ZW1VcGRhdGVQb2xpY3kuY3JlYXRlV2luZG93ZWRJbnN0YWxsUG9saWN5KDEyMywgNDU2KSk7CisKKyAgICAgICAgUGVyc2lzdGFibGVCdW5kbGUgYiA9IG5ldyBQZXJzaXN0YWJsZUJ1bmRsZSgpOworICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci50cmFuc2Zlck93bmVyc2hpcChtT3V0Z29pbmdDb21wb25lbnROYW1lLCBJTkNPTUlOR19DT01QT05FTlRfTkFNRSwgYik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJhbnNmZXJPd25lcnNoaXAoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgUGVyc2lzdGFibGVCdW5kbGUgYiA9IG5ldyBQZXJzaXN0YWJsZUJ1bmRsZSgpOworICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci50cmFuc2Zlck93bmVyc2hpcChtT3V0Z29pbmdDb21wb25lbnROYW1lLCBJTkNPTUlOR19DT01QT05FTlRfTkFNRSwgYik7CisgICAgICAgIGFzc2VydFRydWUobURldmljZVBvbGljeU1hbmFnZXIuaXNBZG1pbkFjdGl2ZShJTkNPTUlOR19DT01QT05FTlRfTkFNRSkpOworICAgICAgICBhc3NlcnRUcnVlKG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmlzRGV2aWNlT3duZXJBcHAoSU5DT01JTkdfQ09NUE9ORU5UX05BTUUuZ2V0UGFja2FnZU5hbWUoKSkpOworICAgICAgICBhc3NlcnRGYWxzZSgKKyAgICAgICAgICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5pc0RldmljZU93bmVyQXBwKG1PdXRnb2luZ0NvbXBvbmVudE5hbWUuZ2V0UGFja2FnZU5hbWUoKSkpOworICAgICAgICBhc3NlcnRGYWxzZShtRGV2aWNlUG9saWN5TWFuYWdlci5pc0FkbWluQWN0aXZlKG1PdXRnb2luZ0NvbXBvbmVudE5hbWUpKTsKKyAgICAgICAgYXNzZXJ0VGhyb3dzKFNlY3VyaXR5RXhjZXB0aW9uLmNsYXNzLCAoKSAtPiB7CisgICAgICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5nZXRTZWNvbmRhcnlVc2VycyhtT3V0Z29pbmdDb21wb25lbnROYW1lKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJhbnNmZXJBZmZpbGlhdGVkUHJvZmlsZU93bmVyc2hpcENvbXBsZXRlQ2FsbGJhY2tJc0NhbGxlZCgpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShnZXRCb29sZWFuUHJlZihtQ29udGV4dCwgS0VZX1RSQU5TRkVSX0FGRklMSUFURURfUFJPRklMRV9DT01QTEVURURfQ0FMTEVEKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL1RyYW5zZmVyT3duZXJPdXRnb2luZ0FwcC9zcmMvY29tL2FuZHJvaWQvY3RzL3RyYW5zZmVyb3duZXIvVHJhbnNmZXJQcm9maWxlT3duZXJPdXRnb2luZ1Rlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9UcmFuc2Zlck93bmVyT3V0Z29pbmdBcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy90cmFuc2Zlcm93bmVyL1RyYW5zZmVyUHJvZmlsZU93bmVyT3V0Z29pbmdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU3ZTg0MAotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9UcmFuc2Zlck93bmVyT3V0Z29pbmdBcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy90cmFuc2Zlcm93bmVyL1RyYW5zZmVyUHJvZmlsZU93bmVyT3V0Z29pbmdUZXN0LmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy50cmFuc2Zlcm93bmVyOworCitpbXBvcnQgc3RhdGljIGp1bml0LmZyYW1ld29yay5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0VGhyb3dzOworCitpbXBvcnQgYW5kcm9pZC5hcHAuYWRtaW4uRGV2aWNlUG9saWN5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlBlcnNpc3RhYmxlQnVuZGxlOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitAU21hbGxUZXN0CitwdWJsaWMgY2xhc3MgVHJhbnNmZXJQcm9maWxlT3duZXJPdXRnb2luZ1Rlc3QgZXh0ZW5kcyBEZXZpY2VBbmRQcm9maWxlT3duZXJUcmFuc2Zlck91dGdvaW5nVGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICBzZXR1cFRlc3RQYXJhbWV0ZXJzKERldmljZVBvbGljeU1hbmFnZXIuQUNUSU9OX1BST0ZJTEVfT1dORVJfQ0hBTkdFRCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJhbnNmZXJXaXRoUG9saWNpZXNPdXRnb2luZygpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBpbnQgcGFzc3dvcmRMZW5ndGggPSAxMjM7CisgICAgICAgIGludCBwYXNzd29yZEV4cGlyYXRpb25UaW1lb3V0ID0gNDU2OworICAgICAgICBEZXZpY2VQb2xpY3lNYW5hZ2VyIHBhcmVudERldmljZVBvbGljeU1hbmFnZXIgPQorICAgICAgICAgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLmdldFBhcmVudFByb2ZpbGVJbnN0YW5jZShtT3V0Z29pbmdDb21wb25lbnROYW1lKTsKKyAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuc2V0Q2FtZXJhRGlzYWJsZWQobU91dGdvaW5nQ29tcG9uZW50TmFtZSwgdHJ1ZSk7CisgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnNldFBhc3N3b3JkTWluaW11bUxlbmd0aChtT3V0Z29pbmdDb21wb25lbnROYW1lLCBwYXNzd29yZExlbmd0aCk7CisgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnNldENyb3NzUHJvZmlsZUNhbGxlcklkRGlzYWJsZWQobU91dGdvaW5nQ29tcG9uZW50TmFtZSwgdHJ1ZSk7CisgICAgICAgIHBhcmVudERldmljZVBvbGljeU1hbmFnZXIuc2V0UGFzc3dvcmRFeHBpcmF0aW9uVGltZW91dCgKKyAgICAgICAgICAgICAgICBtT3V0Z29pbmdDb21wb25lbnROYW1lLCBwYXNzd29yZEV4cGlyYXRpb25UaW1lb3V0KTsKKworICAgICAgICBQZXJzaXN0YWJsZUJ1bmRsZSBiID0gbmV3IFBlcnNpc3RhYmxlQnVuZGxlKCk7CisgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnRyYW5zZmVyT3duZXJzaGlwKG1PdXRnb2luZ0NvbXBvbmVudE5hbWUsIElOQ09NSU5HX0NPTVBPTkVOVF9OQU1FLCBiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUcmFuc2Zlck93bmVyc2hpcCgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBQZXJzaXN0YWJsZUJ1bmRsZSBiID0gbmV3IFBlcnNpc3RhYmxlQnVuZGxlKCk7CisgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnRyYW5zZmVyT3duZXJzaGlwKG1PdXRnb2luZ0NvbXBvbmVudE5hbWUsIElOQ09NSU5HX0NPTVBPTkVOVF9OQU1FLCBiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtRGV2aWNlUG9saWN5TWFuYWdlci5pc0FkbWluQWN0aXZlKElOQ09NSU5HX0NPTVBPTkVOVF9OQU1FKSk7CisgICAgICAgIGFzc2VydFRydWUobURldmljZVBvbGljeU1hbmFnZXIuaXNQcm9maWxlT3duZXJBcHAoSU5DT01JTkdfQ09NUE9ORU5UX05BTUUuZ2V0UGFja2FnZU5hbWUoKSkpOworICAgICAgICBhc3NlcnRGYWxzZSgKKyAgICAgICAgICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5pc1Byb2ZpbGVPd25lckFwcChtT3V0Z29pbmdDb21wb25lbnROYW1lLmdldFBhY2thZ2VOYW1lKCkpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobURldmljZVBvbGljeU1hbmFnZXIuaXNBZG1pbkFjdGl2ZShtT3V0Z29pbmdDb21wb25lbnROYW1lKSk7CisgICAgICAgIGFzc2VydFRocm93cyhTZWN1cml0eUV4Y2VwdGlvbi5jbGFzcywgKCkgLT4geworICAgICAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIuc2V0Q3Jvc3NQcm9maWxlQ2FsbGVySWREaXNhYmxlZChtT3V0Z29pbmdDb21wb25lbnROYW1lLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgICAgIH0pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9XaWZpQ29uZmlnQ3JlYXRvci9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL1dpZmlDb25maWdDcmVhdG9yL0FuZHJvaWQubWsKaW5kZXggYjAzY2Y5NS4uNmVjMmM4ZCAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL1dpZmlDb25maWdDcmVhdG9yL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvYXBwL1dpZmlDb25maWdDcmVhdG9yL0FuZHJvaWQubWsKQEAgLTI2LDcgKzI2LDcgQEAKIAogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c1dpZmlDb25maWdDcmVhdG9yCiAKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQKIAogTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAogCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9hcHAvV2lmaUNvbmZpZ0NyZWF0b3IvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9XaWZpQ29uZmlnQ3JlYXRvci9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDFiOTgyNTkuLmNkM2Y5YjcgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9XaWZpQ29uZmlnQ3JlYXRvci9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L2FwcC9XaWZpQ29uZmlnQ3JlYXRvci9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yMiw2ICsyMiw4IEBACiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5DSEFOR0VfV0lGSV9TVEFURSIgLz4KIAogICAgIDxhcHBsaWNhdGlvbj4KKyAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CisKICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLldpZmlDb25maWdDcmVhdG9yQWN0aXZpdHkiCiAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIgogICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuTm9EaXNwbGF5IgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vwb2xpY3kvQmFzZURldmljZUFkbWluSG9zdFNpZGVUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZXBvbGljeS9CYXNlRGV2aWNlQWRtaW5Ib3N0U2lkZVRlc3QuamF2YQppbmRleCA1OTFhNWJlLi40NDI1ZGNkIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZXBvbGljeS9CYXNlRGV2aWNlQWRtaW5Ib3N0U2lkZVRlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZXBvbGljeS9CYXNlRGV2aWNlQWRtaW5Ib3N0U2lkZVRlc3QuamF2YQpAQCAtOTAsMzggKzkwLDIzIEBACiAgICAgICAgIHJ1blRlc3RzKGdldERldmljZUFkbWluQXBrUGFja2FnZSgpLCAiRGV2aWNlQWRtaW5UZXN0Iik7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGNsZWFyUGFzc3dvcmRGb3JEZXZpY2VPd25lcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBydW5UZXN0cyhnZXREZXZpY2VBZG1pbkFwa1BhY2thZ2UoKSwgIkNsZWFyUGFzc3dvcmRUZXN0Iik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG1ha2VEb0FuZENsZWFyUGFzc3dvcmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gQ2xlYXIgdGhlIHBhc3N3b3JkLiAgV2UgZG8gaXQgYnkgcHJvbW90aW5nIHRoZSBEQSB0byBETy4KLSAgICAgICAgc2V0RGV2aWNlT3duZXIoZ2V0QWRtaW5SZWNlaXZlckNvbXBvbmVudCgpLCBtVXNlcklkLCAvKmV4cGVjdEZhaWx1cmUqLyBmYWxzZSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjbGVhclBhc3N3b3JkRm9yRGV2aWNlT3duZXIoKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIkZhaWxlZCB0byBjbGVhciBkZXZpY2Ugb3duZXIiLAotICAgICAgICAgICAgICAgICAgICByZW1vdmVBZG1pbihnZXRBZG1pblJlY2VpdmVyQ29tcG9uZW50KCksIG1Vc2VySWQpKTsKLSAgICAgICAgICAgIC8vIENsZWFyaW5nIERPIHJlbW92ZXMgdGhlIERBIHRvbywgc28gd2UgbmVlZCB0byBzZXQgaXQgYWdhaW4uCi0gICAgICAgICAgICBzZXREZXZpY2VBZG1pbihnZXRBZG1pblJlY2VpdmVyQ29tcG9uZW50KCksIG1Vc2VySWQpOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgcHVibGljIHZvaWQgdGVzdFJlc2V0UGFzc3dvcmRfbnljUmVzdHJpY3Rpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghbUhhc0ZlYXR1cmUpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIC8vIElmIHRoZXJlJ3MgYSBwYXNzd29yZCwgY2xlYXIgaXQuCi0gICAgICAgIG1ha2VEb0FuZENsZWFyUGFzc3dvcmQoKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHJ1blRlc3RzKGdldERldmljZUFkbWluQXBrUGFja2FnZSgpLCAiRGV2aWNlQWRtaW5QYXNzd29yZFRlc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0UmVzZXRQYXNzd29yZF9ueWNSZXN0cmljdGlvbnMiKTsKICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIG1ha2VEb0FuZENsZWFyUGFzc3dvcmQoKTsKKyAgICAgICAgICAgIGNoYW5nZVVzZXJDcmVkZW50aWFsKG51bGwsICIxMjM0IiwgMCk7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgY2xlYXJQYXNzd29yZEZvckRldmljZU93bmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJ1blRlc3RzKGdldERldmljZUFkbWluQXBrUGFja2FnZSgpLCAiQ2xlYXJQYXNzd29yZFRlc3QiKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBSdW4gdGhlIHRlc3RzIGluIERldmljZU93bmVyUGFzc3dvcmRUZXN0LmphdmEgKGFzIGRldmljZSBvd25lcikuCiAgICAgICovCkBAIC0xMzEsOSArMTE2LDYgQEAKICAgICAgICAgfQogCiAgICAgICAgIHNldERldmljZU93bmVyKGdldEFkbWluUmVjZWl2ZXJDb21wb25lbnQoKSwgbVVzZXJJZCwgLypleHBlY3RGYWlsdXJlKi8gZmFsc2UpOwotCi0gICAgICAgIGNsZWFyUGFzc3dvcmRGb3JEZXZpY2VPd25lcigpOwotCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBydW5UZXN0cyhnZXREZXZpY2VBZG1pbkFwa1BhY2thZ2UoKSwgIkRldmljZU93bmVyUGFzc3dvcmRUZXN0Iik7CiAgICAgICAgIH0gZmluYWxseSB7CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZXBvbGljeS9CYXNlRGV2aWNlUG9saWN5VGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vwb2xpY3kvQmFzZURldmljZVBvbGljeVRlc3QuamF2YQppbmRleCA4YjczNzYyLi5lZWNmNmRmIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZXBvbGljeS9CYXNlRGV2aWNlUG9saWN5VGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlcG9saWN5L0Jhc2VEZXZpY2VQb2xpY3lUZXN0LmphdmEKQEAgLTE4LDE5ICsxOCwyNiBAQAogCiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQuYnVpbGQuQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi50ZXN0cnVubmVyLlJlbW90ZUFuZHJvaWRUZXN0UnVubmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi50ZXN0cnVubmVyLlRlc3RJZGVudGlmaWVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi50ZXN0cnVubmVyLlRlc3RSZXN1bHQ7CiBpbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLnRlc3RydW5uZXIuVGVzdFJlc3VsdC5UZXN0U3RhdHVzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi50ZXN0cnVubmVyLlRlc3RSdW5SZXN1bHQ7CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuYnVpbGQuSUJ1aWxkSW5mbzsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5jb25maWcuT3B0aW9uOwogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5Db2xsZWN0aW5nT3V0cHV0UmVjZWl2ZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLkRldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5sb2cuTG9nVXRpbC5DTG9nOwogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnJlc3VsdC5Db2xsZWN0aW5nVGVzdExpc3RlbmVyOworaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnJlc3VsdC5GaWxlSW5wdXRTdHJlYW1Tb3VyY2U7CitpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQucmVzdWx0LkxvZ0RhdGFUeXBlOworaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnJlc3VsdC5UZXN0RGVzY3JpcHRpb247CitpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQucmVzdWx0LlRlc3RSZXN1bHQ7CitpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQucmVzdWx0LlRlc3RSdW5SZXN1bHQ7CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuRGV2aWNlVGVzdENhc2U7CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSUJ1aWxkUmVjZWl2ZXI7CitpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudXRpbC5GaWxlVXRpbDsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC51dGlsLlRhclV0aWw7CiAKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwpAQCAtNDgsNyArNTUsMTUgQEAKICAqLwogcHVibGljIGNsYXNzIEJhc2VEZXZpY2VQb2xpY3lUZXN0IGV4dGVuZHMgRGV2aWNlVGVzdENhc2UgaW1wbGVtZW50cyBJQnVpbGRSZWNlaXZlciB7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlVOTkVSID0gImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiOworICAgIEBPcHRpb24oCisgICAgICAgICAgICBuYW1lID0gInNraXAtZGV2aWNlLWFkbWluLWZlYXR1cmUtY2hlY2siLAorICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAiRmxhZyB0aGF0IGFsbG93cyB0byBza2lwIHRoZSBjaGVjayBmb3IgYW5kcm9pZC5zb2Z0d2FyZS5kZXZpY2VfYWRtaW4gIgorICAgICAgICAgICAgICAgICsgImFuZCBydW4gdGhlIHRlc3RzIG5vIG1hdHRlciB3aGF0LiBUaGlzIGlzIHVzZWZ1bCBmb3Igc3lzdGVtIHRoYXQgZG8gbm90IHdoYXQgIgorICAgICAgICAgICAgICAgICsgInRvIGV4cG9zZSB0aGF0IGZlYXR1cmUgcHVibGljbHkuIgorICAgICkKKyAgICBwcml2YXRlIGJvb2xlYW4gbVNraXBEZXZpY2VBZG1pbkZlYXR1cmVDaGVjayA9IGZhbHNlOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJVTk5FUiA9ICJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiOwogCiAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVVNFUl9TWVNURU0gPSAwOyAvLyBGcm9tIHRoZSBVc2VySGFuZGxlIGNsYXNzLgogCkBAIC03OSwxNCArOTQsNiBAQAogICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEZMQUdfRVBIRU1FUkFMID0gMHgwMDAwMDEwMDsKICAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBGTEFHX01BTkFHRURfUFJPRklMRSA9IDB4MDAwMDAwMjA7CiAKLSAgICAvKioKLSAgICAgKiBUaGUge0BsaW5rIGFuZHJvaWQub3MuQmF0dGVyeU1hbmFnZXJ9IGZsYWdzIHZhbHVlIHJlcHJlc2VudGluZyBhbGwgY2hhcmdpbmcgdHlwZXM7IHtAbGluawotICAgICAqIGFuZHJvaWQub3MuQmF0dGVyeU1hbmFnZXIjQkFUVEVSWV9QTFVHR0VEX0FDfSwge0BsaW5rCi0gICAgICogYW5kcm9pZC5vcy5CYXR0ZXJ5TWFuYWdlciNCQVRURVJZX1BMVUdHRURfVVNCfSwgYW5kIHtAbGluawotICAgICAqIGFuZHJvaWQub3MuQmF0dGVyeU1hbmFnZXIjQkFUVEVSWV9QTFVHR0VEX1dJUkVMRVNTfS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBWV9PTl9XSElMRV9QTFVHR0VEX0lOX0ZMQUdTID0gNzsKLQogICAgIHByb3RlY3RlZCBzdGF0aWMgaW50ZXJmYWNlIFNldHRpbmdzIHsKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0xPQkFMX05BTUVTUEFDRSA9ICJnbG9iYWwiOwogICAgICAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBHbG9iYWwgewpAQCAtMTI0LDggKzEzMSwxMCBAQAogICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHN1cGVyLnNldFVwKCk7CiAgICAgICAgIGFzc2VydE5vdE51bGwobUN0c0J1aWxkKTsgIC8vIGVuc3VyZSBidWlsZCBoYXMgYmVlbiBzZXQgYmVmb3JlIHRlc3QgaXMgcnVuLgotICAgICAgICBtSGFzRmVhdHVyZSA9IGdldERldmljZSgpLmdldEFwaUxldmVsKCkgPj0gMjEgLyogQnVpbGQuVkVSU0lPTl9DT0RFUy5MICovCi0gICAgICAgICAgICAgICAgJiYgaGFzRGV2aWNlRmVhdHVyZSgiYW5kcm9pZC5zb2Z0d2FyZS5kZXZpY2VfYWRtaW4iKTsKKyAgICAgICAgbUhhc0ZlYXR1cmUgPSBnZXREZXZpY2UoKS5nZXRBcGlMZXZlbCgpID49IDIxOyAvKiBCdWlsZC5WRVJTSU9OX0NPREVTLkwgKi8KKyAgICAgICAgaWYgKCFtU2tpcERldmljZUFkbWluRmVhdHVyZUNoZWNrKSB7CisgICAgICAgICAgICBtSGFzRmVhdHVyZSA9IG1IYXNGZWF0dXJlICYmIGhhc0RldmljZUZlYXR1cmUoImFuZHJvaWQuc29mdHdhcmUuZGV2aWNlX2FkbWluIik7CisgICAgICAgIH0KICAgICAgICAgbVN1cHBvcnRzTXVsdGlVc2VyID0gZ2V0TWF4TnVtYmVyT2ZVc2Vyc1N1cHBvcnRlZCgpID4gMTsKICAgICAgICAgbVN1cHBvcnRzRmJlID0gaGFzRGV2aWNlRmVhdHVyZSgiYW5kcm9pZC5zb2Z0d2FyZS5maWxlX2Jhc2VkX2VuY3J5cHRpb24iKTsKICAgICAgICAgbUZpeGVkUGFja2FnZXMgPSBnZXREZXZpY2UoKS5nZXRJbnN0YWxsZWRQYWNrYWdlTmFtZXMoKTsKQEAgLTE0MSwxMiArMTUwLDIyIEBACiAgICAgICAgIGlmIChtUHJpbWFyeVVzZXJJZCAhPSBVU0VSX1NZU1RFTSkgewogICAgICAgICAgICAgbUZpeGVkVXNlcnMuYWRkKFVTRVJfU1lTVEVNKTsKICAgICAgICAgfQotICAgICAgICBzd2l0Y2hVc2VyKG1QcmltYXJ5VXNlcklkKTsKKworICAgICAgICBpZiAobUhhc0ZlYXR1cmUpIHsKKyAgICAgICAgICAgIC8vIFN3aXRjaGluZyB0byBwcmltYXJ5IGlzIG9ubHkgbmVlZGVkIHdoZW4gd2UncmUgdGVzdGluZyBkZXZpY2UgYWRtaW4gZmVhdHVyZXMuCisgICAgICAgICAgICBzd2l0Y2hVc2VyKG1QcmltYXJ5VXNlcklkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgYWxsIHRoZSB0ZXN0cyBjYW4gYmUgZXhlY3V0ZWQgaW4gYW55IG9mIHRoZSBBbmRyb2lkIHVzZXJzLCBzbyByZW1haW4gaW4KKyAgICAgICAgICAgIC8vIGN1cnJlbnQgdXNlciwgYW5kIGRvbid0IGRlbGV0ZSBpdC4gVGhpcyBlbmFibGVzIHRlc3RpbmcgaW4gc2Vjb25kYXJ5IHVzZXJzLgorICAgICAgICAgICAgaWYgKGdldERldmljZSgpLmdldEN1cnJlbnRVc2VyKCkgIT0gbVByaW1hcnlVc2VySWQpIHsKKyAgICAgICAgICAgICAgICBtRml4ZWRVc2Vycy5hZGQoZ2V0RGV2aWNlKCkuZ2V0Q3VycmVudFVzZXIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICByZW1vdmVPd25lcnMoKTsKICAgICAgICAgcmVtb3ZlVGVzdFVzZXJzKCk7CiAgICAgICAgIC8vIFVubG9jayBrZXlndWFyZCBiZWZvcmUgdGVzdAogICAgICAgICB3YWtldXBBbmREaXNtaXNzS2V5Z3VhcmQoKTsKLSAgICAgICAgc3RheUF3YWtlKCk7CiAgICAgICAgIC8vIEdvIHRvIGhvbWUuCiAgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoImlucHV0IGtleWV2ZW50IEtFWUNPREVfSE9NRSIpOwogICAgIH0KQEAgLTE5Myw2ICsyMTIsMTMgQEAKICAgICAgICAgZ2V0RGV2aWNlKCkuc3RhcnRVc2VyKHVzZXJJZCk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogU3RhcnRzIHN3aXRjaGluZyB0byB0aGUgdXNlciB3aXRoIHRoZSBnaXZlbiBJRC4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgaXMgbm90IGJsb2NraW5nLiBTb21lIG9wZXJhdGlvbnMgd2lsbCBiZSBmbGFreSBpZiBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXJ3YXJkcywgc3VjaAorICAgICAqIGFzIHtAbGluayAjd2FrZXVwQW5kRGlzbWlzc0tleWd1YXJkKCl9LiBDYWxsIHtAbGluayAjd2FpdEZvckJyb2FkY2FzdElkbGUoKX0gYmV0d2VlbiB0aGlzCisgICAgICogbWV0aG9kIGFuZCB0aG9zZSBvcGVyYXRpb25zIHRvIGVuc3VyZSB0aGF0IHN3aXRjaGluZyB0aGUgdXNlciBoYXMgZmluaXNoZWQuCisgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgc3dpdGNoVXNlcihpbnQgdXNlcklkKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVE9ETyBNb3ZlIHRoaXMgbG9naWMgdG8gSVRlc3REZXZpY2UKICAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZCgiYW0gc3dpdGNoLXVzZXIgIiArIHVzZXJJZCk7CkBAIC0yMDIsNiArMjI4LDEwIEBACiAgICAgICAgIHJldHVybiBnZXREZXZpY2UoKS5nZXRNYXhOdW1iZXJPZlVzZXJzU3VwcG9ydGVkKCk7CiAgICAgfQogCisgICAgcHJvdGVjdGVkIGludCBnZXRNYXhOdW1iZXJPZlJ1bm5pbmdVc2Vyc1N1cHBvcnRlZCgpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2V0RGV2aWNlKCkuZ2V0TWF4TnVtYmVyT2ZSdW5uaW5nVXNlcnNTdXBwb3J0ZWQoKTsKKyAgICB9CisKICAgICBwcm90ZWN0ZWQgaW50IGdldFVzZXJGbGFncyhpbnQgdXNlcklkKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIGNvbW1hbmQgPSAicG0gbGlzdCB1c2VycyI7CiAgICAgICAgIFN0cmluZyBjb21tYW5kT3V0cHV0ID0gZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZChjb21tYW5kKTsKQEAgLTIyOCw2ICsyNTgsMTYgQEAKICAgICAgICAgcmV0dXJuIGdldERldmljZSgpLmxpc3RVc2VycygpOwogICAgIH0KIAorICAgIHByb3RlY3RlZCAgQXJyYXlMaXN0PEludGVnZXI+IGxpc3RSdW5uaW5nVXNlcnMoKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKKyAgICAgICAgQXJyYXlMaXN0PEludGVnZXI+IHJ1bm5pbmdVc2VycyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBmb3IgKGludCB1c2VySWQgOiBsaXN0VXNlcnMoKSkgeworICAgICAgICAgICAgaWYgKGdldERldmljZSgpLmlzVXNlclJ1bm5pbmcodXNlcklkKSkgeworICAgICAgICAgICAgICAgIHJ1bm5pbmdVc2Vycy5hZGQodXNlcklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnVubmluZ1VzZXJzOworICAgIH0KKwogICAgIHByb3RlY3RlZCBpbnQgZ2V0Rmlyc3RNYW5hZ2VkUHJvZmlsZVVzZXJJZCgpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewogICAgICAgICBmb3IgKGludCB1c2VySWQgOiBsaXN0VXNlcnMoKSkgewogICAgICAgICAgICAgaWYgKChnZXRVc2VyRmxhZ3ModXNlcklkKSAmIEZMQUdfTUFOQUdFRF9QUk9GSUxFKSAhPSAwKSB7CkBAIC0yMzgsMTYgKzI3OCwyMSBAQAogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgc3RvcFVzZXJBc3luYyhpbnQgdXNlcklkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHN0b3BVc2VyQ29tbWFuZCA9ICJhbSBzdG9wLXVzZXIgLWYgIiArIHVzZXJJZDsKKyAgICAgICAgQ0xvZy5kKCJzdGFydGluZyBjb21tYW5kIFwiIiArIHN0b3BVc2VyQ29tbWFuZCk7CisgICAgICAgIENMb2cuZCgiT3V0cHV0IGZvciBjb21tYW5kICIgKyBzdG9wVXNlckNvbW1hbmQgKyAiOiAiCisgICAgICAgICAgICAgICAgKyBnZXREZXZpY2UoKS5leGVjdXRlU2hlbGxDb21tYW5kKHN0b3BVc2VyQ29tbWFuZCkpOworICAgIH0KKwogICAgIHByb3RlY3RlZCB2b2lkIHN0b3BVc2VyKGludCB1c2VySWQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBXYWl0IGZvciB0aGUgYnJvYWRjYXN0IHF1ZXVlIHRvIGJlIGlkbGUgZmlyc3QgdG8gd29ya2Fyb3VuZCB0aGUgc3RvcC11c2VyIHRpbWVvdXQgaXNzdWUuCi0gICAgICAgIHdhaXRGb3JCcm9hZGNhc3RJZGxlKCk7CiAgICAgICAgIFN0cmluZyBzdG9wVXNlckNvbW1hbmQgPSAiYW0gc3RvcC11c2VyIC13IC1mICIgKyB1c2VySWQ7CiAgICAgICAgIENMb2cuZCgic3RhcnRpbmcgY29tbWFuZCBcIiIgKyBzdG9wVXNlckNvbW1hbmQgKyAiXCIgYW5kIHdhaXRpbmcuIik7CiAgICAgICAgIENMb2cuZCgiT3V0cHV0IGZvciBjb21tYW5kICIgKyBzdG9wVXNlckNvbW1hbmQgKyAiOiAiCiAgICAgICAgICAgICAgICAgKyBnZXREZXZpY2UoKS5leGVjdXRlU2hlbGxDb21tYW5kKHN0b3BVc2VyQ29tbWFuZCkpOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCB3YWl0Rm9yQnJvYWRjYXN0SWRsZSgpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24geworICAgIHByb3RlY3RlZCB2b2lkIHdhaXRGb3JCcm9hZGNhc3RJZGxlKCkgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogICAgICAgICBDb2xsZWN0aW5nT3V0cHV0UmVjZWl2ZXIgcmVjZWl2ZXIgPSBuZXcgQ29sbGVjdGluZ091dHB1dFJlY2VpdmVyKCk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAvLyB3ZSBhbGxvdyA4bWluIGZvciB0aGUgY29tbWFuZCB0byBjb21wbGV0ZSBhbmQgNG1pbiBmb3IgdGhlIGNvbW1hbmQgdG8gc3RhcnQgdG8KQEAgLTI1OCw2ICszMDMsMjQgQEAKICAgICAgICAgICAgIFN0cmluZyBvdXRwdXQgPSByZWNlaXZlci5nZXRPdXRwdXQoKTsKICAgICAgICAgICAgIENMb2cuZCgiT3V0cHV0IGZyb20gJ2FtIHdhaXQtZm9yLWJyb2FkY2FzdC1pZGxlJzogJXMiLCBvdXRwdXQpOwogICAgICAgICAgICAgaWYgKCFvdXRwdXQuY29udGFpbnMoIkFsbCBicm9hZGNhc3QgcXVldWVzIGFyZSBpZGxlISIpKSB7CisgICAgICAgICAgICAgICAgLy8gR2F0aGVyIHRoZSBzeXN0ZW1fc2VydmVyIGR1bXAgZGF0YSBmb3IgaW52ZXN0aWdhdGlvbi4KKyAgICAgICAgICAgICAgICBGaWxlIGhlYXBEdW1wID0gZ2V0RGV2aWNlKCkuZHVtcEhlYXAoInN5c3RlbV9zZXJ2ZXIiLCAiL2RhdGEvbG9jYWwvdG1wL2R1bXAuaHByb2YiKTsKKyAgICAgICAgICAgICAgICBpZiAoaGVhcER1bXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBJZiBmaWxlIGlzIHRvbyB0b28gYmlnLCB0YXIgaWYgd2l0aCBUYXJVdGlsLgorICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGlkID0gZ2V0RGV2aWNlKCkuZ2V0UHJvY2Vzc1BpZCgic3lzdGVtX3NlcnZlciIpOworICAgICAgICAgICAgICAgICAgICAvLyBnemlwIHRoZSBmaWxlIGl0J3MgcXVpdGUgYmlnCisgICAgICAgICAgICAgICAgICAgIEZpbGUgaGVhcER1bXBHeiA9IFRhclV0aWwuZ3ppcChoZWFwRHVtcCk7CisgICAgICAgICAgICAgICAgICAgIHRyeSAoRmlsZUlucHV0U3RyZWFtU291cmNlIHNvdXJjZSA9IG5ldyBGaWxlSW5wdXRTdHJlYW1Tb3VyY2UoaGVhcER1bXBHeikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZFRlc3RMb2coCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoInN5c3RlbV9zZXJ2ZXJfZHVtcC4lcy4lcy5ocHJvZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkLCBnZXREZXZpY2UoKS5nZXREZXZpY2VEYXRlKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2dEYXRhVHlwZS5HWklQLCBzb3VyY2UpOworICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgRmlsZVV0aWwuZGVsZXRlRmlsZShoZWFwRHVtcCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBDTG9nLmUoIkZhaWxlZCB0byBjYXB0dXJlIHRoZSBkdW1waGVhcCBmcm9tIHN5c3RlbV9zZXJ2ZXIiKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgLy8gdGhlIGNhbGwgbW9zdCBsaWtlbHkgZmFpbGVkIHdlIHNob3VsZCBmYWlsIHRoZSB0ZXN0CiAgICAgICAgICAgICAgICAgZmFpbCgiJ2FtIHdhaXQtZm9yLWJyb2FkY2FzZS1pZGxlJyBkaWQgbm90IGNvbXBsZXRlLiIpOwogICAgICAgICAgICAgICAgIC8vIFRPRE86IGNvbnNpZGVyIGFkZGluZyBhIHJlYm9vdCBvciByZWNvdmVyeSBiZWZvcmUgZmFpbGluZyBpZiBuZWNlc3NhcnkKQEAgLTI3MiwxMiArMzM1LDI0IEBACiAgICAgICAgICAgICBTdHJpbmcgc3RvcFVzZXJDb21tYW5kID0gImFtIHN0b3AtdXNlciAtdyAtZiAiICsgdXNlcklkOwogICAgICAgICAgICAgQ0xvZy5kKCJzdG9wcGluZyBhbmQgcmVtb3ZpbmcgdXNlciAiICsgdXNlcklkKTsKICAgICAgICAgICAgIGdldERldmljZSgpLmV4ZWN1dGVTaGVsbENvbW1hbmQoc3RvcFVzZXJDb21tYW5kKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIkNvdWxkbid0IHJlbW92ZSB1c2VyIiwgZ2V0RGV2aWNlKCkucmVtb3ZlVXNlcih1c2VySWQpKTsKKyAgICAgICAgICAgIC8vIEVwaGVtZXJhbCB1c2VycyBtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gcmVtb3ZlZCBhZnRlciBiZWluZyBzdG9wcGVkLgorICAgICAgICAgICAgaWYgKGxpc3RVc2VycygpLmNvbnRhaW5zKHVzZXJJZCkpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJDb3VsZG4ndCByZW1vdmUgdXNlciIsIGdldERldmljZSgpLnJlbW92ZVVzZXIodXNlcklkKSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKICAgICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVUZXN0VXNlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZm9yIChpbnQgdXNlcklkIDogZ2V0VXNlcnNDcmVhdGVkQnlUZXN0cygpKSB7CisgICAgICAgIExpc3Q8SW50ZWdlcj4gdXNlcnNDcmVhdGVkQnlUZXN0cyA9IGdldFVzZXJzQ3JlYXRlZEJ5VGVzdHMoKTsKKworICAgICAgICAvLyBUaGUgdGltZSBzcGVudCBvbiBzdG9wVXNlciBpcyBkZXBlbmQgb24gaG93IGJ1c3kgdGhlIGJyb2FkY2FzdCBxdWV1ZSBpcy4KKyAgICAgICAgLy8gVG8gb3B0aW1pemUgdGhlIHRpbWUgdG8gcmVtb3ZlIG11bHRpcGxlIHRlc3QgdXNlcnMsIHdlIG1hcmsgYWxsIHVzZXJzIGFzCisgICAgICAgIC8vIHN0b3BwaW5nIGZpcnN0LCBzbyBubyBtb3JlIGJyb2FkY2FzdHMgd2lsbCBiZSBzZW50IHRvIHRoZXNlIHVzZXJzLCB3aGljaCBtYWtlIHRoZSBxdWV1ZQorICAgICAgICAvLyBsZXNzIGJ1c3kuCisgICAgICAgIGZvciAoaW50IHVzZXJJZCA6IHVzZXJzQ3JlYXRlZEJ5VGVzdHMpIHsKKyAgICAgICAgICAgIHN0b3BVc2VyQXN5bmModXNlcklkKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCB1c2VySWQgOiB1c2Vyc0NyZWF0ZWRCeVRlc3RzKSB7CiAgICAgICAgICAgICByZW1vdmVVc2VyKHVzZXJJZCk7CiAgICAgICAgIH0KICAgICB9CkBAIC0zNTksNyArNDM0LDcgQEAKICAgICAgICAgaWYgKHJlc3VsdC5oYXNGYWlsZWRUZXN0cygpKSB7CiAgICAgICAgICAgICAvLyBidWlsZCBhIG1lYW5pbmdmdWwgZXJyb3IgbWVzc2FnZQogICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBlcnJvckJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigiT24tZGV2aWNlIHRlc3RzIGZhaWxlZDpcbiIpOwotICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8VGVzdElkZW50aWZpZXIsIFRlc3RSZXN1bHQ+IHJlc3VsdEVudHJ5IDoKKyAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFRlc3REZXNjcmlwdGlvbiwgVGVzdFJlc3VsdD4gcmVzdWx0RW50cnkgOgogICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0VGVzdFJlc3VsdHMoKS5lbnRyeVNldCgpKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHRFbnRyeS5nZXRWYWx1ZSgpLmdldFN0YXR1cygpLmVxdWFscyhUZXN0U3RhdHVzLlBBU1NFRCkpIHsKICAgICAgICAgICAgICAgICAgICAgZXJyb3JCdWlsZGVyLmFwcGVuZChyZXN1bHRFbnRyeS5nZXRLZXkoKS50b1N0cmluZygpKTsKQEAgLTQwNyw2ICs0ODIsMTIgQEAKICAgICAgICAgcmV0dXJuIGxpc3RVc2VycygpLnNpemUoKSArIG51bWJlck9mVXNlcnMgPD0gZ2V0TWF4TnVtYmVyT2ZVc2Vyc1N1cHBvcnRlZCgpOwogICAgIH0KIAorICAgIC8qKiBDaGVja3Mgd2hldGhlciBpdCBpcyBwb3NzaWJsZSB0byBzdGFydCB0aGUgZGVzaXJlZCBudW1iZXIgb2YgdXNlcnMuICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gY2FuU3RhcnRBZGRpdGlvbmFsVXNlcnMoaW50IG51bWJlck9mVXNlcnMpCisgICAgICAgICAgICB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGxpc3RSdW5uaW5nVXNlcnMoKS5zaXplKCkgKyBudW1iZXJPZlVzZXJzIDw9IGdldE1heE51bWJlck9mUnVubmluZ1VzZXJzU3VwcG9ydGVkKCk7CisgICAgfQorCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFzRGV2aWNlRmVhdHVyZShTdHJpbmcgcmVxdWlyZWRGZWF0dXJlKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKG1BdmFpbGFibGVGZWF0dXJlcyA9PSBudWxsKSB7CiAgICAgICAgICAgICAvLyBUT0RPOiBNb3ZlIHRoaXMgbG9naWMgdG8gSVRlc3REZXZpY2UuCkBAIC04MTcsOCArODk4LDI3IEBACiAgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoIndtIGRpc21pc3Mta2V5Z3VhcmQiKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgc3RheUF3YWtlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoCi0gICAgICAgICAgICAic2V0dGluZ3MgcHV0IGdsb2JhbCBzdGF5X29uX3doaWxlX3BsdWdnZWRfaW4gIiArIFNUQVlfT05fV0hJTEVfUExVR0dFRF9JTl9GTEFHUyk7CisgICAgcHJvdGVjdGVkIHZvaWQgc3RhcnRBY3Rpdml0eUFzVXNlcihpbnQgdXNlcklkLCBTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBhY3Rpdml0eU5hbWUpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB3YWtldXBBbmREaXNtaXNzS2V5Z3VhcmQoKTsKKyAgICAgICAgU3RyaW5nIGNvbW1hbmQgPSAiYW0gc3RhcnQgLVcgLS11c2VyICIgKyB1c2VySWQgKyAiICIgKyBwYWNrYWdlTmFtZSArICIvIiArIGFjdGl2aXR5TmFtZTsKKyAgICAgICAgZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZChjb21tYW5kKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRMYXVuY2hlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgUFJFRklYID0gIkxhdW5jaGVyOiBDb21wb25lbnRJbmZveyI7CisgICAgICAgIGZpbmFsIFN0cmluZyBQT1NURklYID0gIn0iOworICAgICAgICBmaW5hbCBTdHJpbmcgY29tbWFuZE91dHB1dCA9CisgICAgICAgICAgICAgICAgZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZCgiY21kIHNob3J0Y3V0IGdldC1kZWZhdWx0LWxhdW5jaGVyIik7CisgICAgICAgIGlmIChjb21tYW5kT3V0cHV0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIFN0cmluZ1tdIGxpbmVzID0gY29tbWFuZE91dHB1dC5zcGxpdCgiXFxyP1xcbiIpOworICAgICAgICBmb3IgKFN0cmluZyBsaW5lIDogbGluZXMpIHsKKyAgICAgICAgICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoUFJFRklYKSAmJiBsaW5lLmVuZHNXaXRoKFBPU1RGSVgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxpbmUuc3Vic3RyaW5nKFBSRUZJWC5sZW5ndGgoKSwgbGluZS5sZW5ndGgoKSAtIFBPU1RGSVgubGVuZ3RoKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkRlZmF1bHQgbGF1bmNoZXIgbm90IGZvdW5kIik7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vwb2xpY3kvQmFzZUxhdW5jaGVyQXBwc1Rlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlcG9saWN5L0Jhc2VMYXVuY2hlckFwcHNUZXN0LmphdmEKaW5kZXggZWQ4ODVjNS4uNTNkYjQxMyAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vwb2xpY3kvQmFzZUxhdW5jaGVyQXBwc1Rlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZXBvbGljeS9CYXNlTGF1bmNoZXJBcHBzVGVzdC5qYXZhCkBAIC0zNSwxMCArMzUsOSBAQAogICAgICAgICAgICAgImNvbS5hbmRyb2lkLmN0cy5sYXVuY2hlcnRlc3RzLnN1cHBvcnQiOwogICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExBVU5DSEVSX1RFU1RTX1NVUFBPUlRfQVBLID0gIkN0c0xhdW5jaGVyQXBwc1Rlc3RzU3VwcG9ydC5hcGsiOwogCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5zdGFsbFRlc3RBcHBzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHVuaW5zdGFsbFRlc3RBcHBzKCk7Ci0gICAgICAgIGluc3RhbGxBcHBBc1VzZXIoTEFVTkNIRVJfVEVTVFNfQVBLLCBtUHJpbWFyeVVzZXJJZCk7Ci0gICAgICAgIGluc3RhbGxBcHBBc1VzZXIoTEFVTkNIRVJfVEVTVFNfU1VQUE9SVF9BUEssIG1QcmltYXJ5VXNlcklkKTsKKyAgICBwcm90ZWN0ZWQgdm9pZCBpbnN0YWxsVGVzdEFwcHMoaW50IHVzZXJJZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGluc3RhbGxBcHBBc1VzZXIoTEFVTkNIRVJfVEVTVFNfQVBLLCB1c2VySWQpOworICAgICAgICBpbnN0YWxsQXBwQXNVc2VyKExBVU5DSEVSX1RFU1RTX1NVUFBPUlRfQVBLLCB1c2VySWQpOwogICAgIH0KIAogICAgIHByb3RlY3RlZCB2b2lkIHVuaW5zdGFsbFRlc3RBcHBzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC00Nyw4ICs0Niw4IEBACiAgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoU0lNUExFX0FQUF9QS0cpOwogICAgIH0KIAotICAgIHByb3RlY3RlZCB2b2lkIHN0YXJ0Q2FsbGJhY2tTZXJ2aWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBjb21tYW5kID0gImFtIHN0YXJ0c2VydmljZSAtLXVzZXIgIiArIG1QcmltYXJ5VXNlcklkCisgICAgcHJvdGVjdGVkIHZvaWQgc3RhcnRDYWxsYmFja1NlcnZpY2UoaW50IHVzZXJJZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBjb21tYW5kID0gImFtIHN0YXJ0c2VydmljZSAtLXVzZXIgIiArIHVzZXJJZAogICAgICAgICAgICAgICAgICsgIiAtYSAiICsgTEFVTkNIRVJfVEVTVFNfU1VQUE9SVF9QS0cgKyAiLlJFR0lTVEVSX0NBTExCQUNLICIKICAgICAgICAgICAgICAgICArIExBVU5DSEVSX1RFU1RTX1NVUFBPUlRfUEtHICsgIi8uTGF1bmNoZXJDYWxsYmFja1Rlc3RzU2VydmljZSI7CiAgICAgICAgIENMb2cuZCgiT3V0cHV0IGZvciBjb21tYW5kICIgKyBjb21tYW5kICsgIjogIiArIGdldERldmljZSgpLmV4ZWN1dGVTaGVsbENvbW1hbmQoY29tbWFuZCkpOwpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vwb2xpY3kvQ3Jvc3NQcm9maWxlQXBwc0hvc3RTaWRlVGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vwb2xpY3kvQ3Jvc3NQcm9maWxlQXBwc0hvc3RTaWRlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxYmM2YzEKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZXBvbGljeS9Dcm9zc1Byb2ZpbGVBcHBzSG9zdFNpZGVUZXN0LmphdmEKQEAgLTAsMCArMSwxMTEgQEAKK3BhY2thZ2UgY29tLmFuZHJvaWQuY3RzLmRldmljZXBvbGljeTsKKworaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5EZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb247CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBJbiB0aGUgdGVzdCwgbWFuYWdlZCBwcm9maWxlIGFuZCBzZWNvbmRhcnkgdXNlciBhcmUgY3JlYXRlZC4gV2UgdGhlbiB2ZXJpZnkKKyAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQucG0uY3Jvc3Nwcm9maWxlLkNyb3NzUHJvZmlsZUFwcHN9IEFQSXMgaW4gZGlmZmVyZW50IGRpcmVjdGlvbnMsIGxpa2UKKyAqIHByaW1hcnkgdXNlciB0byBtYW5hZ2VkIHByb2ZpbGUuCisgKi8KK3B1YmxpYyBjbGFzcyBDcm9zc1Byb2ZpbGVBcHBzSG9zdFNpZGVUZXN0IGV4dGVuZHMgQmFzZURldmljZVBvbGljeVRlc3QgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1BBQ0tBR0UgPSAiY29tLmFuZHJvaWQuY3RzLmNyb3NzcHJvZmlsZWFwcHN0ZXN0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9OX1RBUkdFVF9VU0VSX1RFU1RfQ0xBU1MgPSAiLkNyb3NzUHJvZmlsZUFwcHNOb25UYXJnZXRVc2VyVGVzdCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9VU0VSX1RFU1RfQ0xBU1MgPSAiLkNyb3NzUHJvZmlsZUFwcHNUYXJnZXRVc2VyVGVzdCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RBUkdFVF9VU0VSID0gIlRBUkdFVF9VU0VSIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfVEVTVF9BUEsgPSAiQ3RzQ3Jvc3NQcm9maWxlQXBwc1Rlc3RzLmFwayI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNJTVBMRV9BUFBfQVBLID0iQ3RzU2ltcGxlQXBwLmFwayI7CisKKyAgICBwcml2YXRlIGludCBtUHJvZmlsZUlkOworICAgIHByaXZhdGUgaW50IG1TZWNvbmRhcnlVc2VySWQ7CisgICAgcHJpdmF0ZSBib29sZWFuIG1IYXNNYW5hZ2VkVXNlckZlYXR1cmU7CisgICAgcHJpdmF0ZSBib29sZWFuIG1DYW5UZXN0TXVsdGlVc2VyOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgLy8gV2UgbmVlZCBtYW5hZ2VkIHVzZXJzIHRvIGJlIHN1cHBvcnRlZCBpbiBvcmRlciB0byBjcmVhdGUgYSBwcm9maWxlIG9mIHRoZSB1c2VyIG93bmVyLgorICAgICAgICBtSGFzTWFuYWdlZFVzZXJGZWF0dXJlID0gaGFzRGV2aWNlRmVhdHVyZSgiYW5kcm9pZC5zb2Z0d2FyZS5tYW5hZ2VkX3VzZXJzIik7CisgICAgICAgIGluc3RhbGxSZXF1aXJlZEFwcHMobVByaW1hcnlVc2VySWQpOworCisgICAgICAgIGlmIChtSGFzTWFuYWdlZFVzZXJGZWF0dXJlKSB7CisgICAgICAgICAgICBjcmVhdGVBbmRTdGFydE1hbmFnZWRQcm9maWxlKCk7CisgICAgICAgICAgICBpbnN0YWxsUmVxdWlyZWRBcHBzKG1Qcm9maWxlSWQpOworICAgICAgICB9CisgICAgICAgIGlmIChjYW5DcmVhdGVBZGRpdGlvbmFsVXNlcnMoMSkpIHsKKyAgICAgICAgICAgIG1TZWNvbmRhcnlVc2VySWQgPSBjcmVhdGVVc2VyKCk7CisgICAgICAgICAgICBpbnN0YWxsUmVxdWlyZWRBcHBzKG1TZWNvbmRhcnlVc2VySWQpOworICAgICAgICAgICAgbUNhblRlc3RNdWx0aVVzZXIgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluc3RhbGxSZXF1aXJlZEFwcHMoaW50IHVzZXJJZCkKKyAgICAgICAgICAgIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7CisgICAgICAgIGluc3RhbGxBcHBBc1VzZXIoRVhUUkFfVEVTVF9BUEssIHVzZXJJZCk7CisgICAgICAgIGluc3RhbGxBcHBBc1VzZXIoU0lNUExFX0FQUF9BUEssIHVzZXJJZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFByaW1hcnlVc2VyVG9QcmltYXJ5VXNlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB2ZXJpZnlDcm9zc1Byb2ZpbGVBcHBzQXBpKG1QcmltYXJ5VXNlcklkLCBtUHJpbWFyeVVzZXJJZCwgTk9OX1RBUkdFVF9VU0VSX1RFU1RfQ0xBU1MpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQcmltYXJ5VXNlclRvTWFuYWdlZFByb2ZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFtSGFzTWFuYWdlZFVzZXJGZWF0dXJlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdmVyaWZ5Q3Jvc3NQcm9maWxlQXBwc0FwaShtUHJpbWFyeVVzZXJJZCwgbVByb2ZpbGVJZCwgVEFSR0VUX1VTRVJfVEVTVF9DTEFTUyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE1hbmFnZWRQcm9maWxlVG9QcmltYXJ5VXNlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIW1IYXNNYW5hZ2VkVXNlckZlYXR1cmUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB2ZXJpZnlDcm9zc1Byb2ZpbGVBcHBzQXBpKG1Qcm9maWxlSWQsIG1QcmltYXJ5VXNlcklkLCBUQVJHRVRfVVNFUl9URVNUX0NMQVNTKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJpbWFyeVVzZXJUb1NlY29uZGFyeVVzZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFtQ2FuVGVzdE11bHRpVXNlcikgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHZlcmlmeUNyb3NzUHJvZmlsZUFwcHNBcGkobVByaW1hcnlVc2VySWQsIG1TZWNvbmRhcnlVc2VySWQsIE5PTl9UQVJHRVRfVVNFUl9URVNUX0NMQVNTKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2Vjb25kYXJ5VXNlclRvTWFuYWdlZFByb2ZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFtQ2FuVGVzdE11bHRpVXNlciB8fCAhbUhhc01hbmFnZWRVc2VyRmVhdHVyZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHZlcmlmeUNyb3NzUHJvZmlsZUFwcHNBcGkobVNlY29uZGFyeVVzZXJJZCwgbVByb2ZpbGVJZCwgTk9OX1RBUkdFVF9VU0VSX1RFU1RfQ0xBU1MpOworCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE1hbmFnZWRQcm9maWxlVG9TZWNvbmRhcnlVc2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghbUNhblRlc3RNdWx0aVVzZXIgfHwgIW1IYXNNYW5hZ2VkVXNlckZlYXR1cmUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB2ZXJpZnlDcm9zc1Byb2ZpbGVBcHBzQXBpKG1Qcm9maWxlSWQsIG1TZWNvbmRhcnlVc2VySWQsIE5PTl9UQVJHRVRfVVNFUl9URVNUX0NMQVNTKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5Q3Jvc3NQcm9maWxlQXBwc0FwaShpbnQgZnJvbVVzZXJJZCwgaW50IHRhcmdldFVzZXJJZCwgU3RyaW5nIHRlc3RDbGFzcykKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBydW5EZXZpY2VUZXN0c0FzVXNlcigKKyAgICAgICAgICAgICAgICBURVNUX1BBQ0tBR0UsCisgICAgICAgICAgICAgICAgdGVzdENsYXNzLAorICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgZnJvbVVzZXJJZCwKKyAgICAgICAgICAgICAgICBjcmVhdGVUYXJnZXRVc2VyUGFyYW0odGFyZ2V0VXNlcklkKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUFuZFN0YXJ0TWFuYWdlZFByb2ZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbVByb2ZpbGVJZCA9IGNyZWF0ZU1hbmFnZWRQcm9maWxlKG1QcmltYXJ5VXNlcklkKTsKKyAgICAgICAgc3dpdGNoVXNlcihtUHJpbWFyeVVzZXJJZCk7CisgICAgICAgIHN0YXJ0VXNlcihtUHJvZmlsZUlkKTsKKyAgICB9CisKKyAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gY3JlYXRlVGFyZ2V0VXNlclBhcmFtKGludCB0YXJnZXRVc2VySWQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTWFwKFBBUkFNX1RBUkdFVF9VU0VSLAorICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcoZ2V0VXNlclNlcmlhbE51bWJlcih0YXJnZXRVc2VySWQpKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vwb2xpY3kvQ3VzdG9tRGV2aWNlT3duZXJUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZXBvbGljeS9DdXN0b21EZXZpY2VPd25lclRlc3QuamF2YQppbmRleCBiZTAzNzVjLi5lY2E2OTUzIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZXBvbGljeS9DdXN0b21EZXZpY2VPd25lclRlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZXBvbGljeS9DdXN0b21EZXZpY2VPd25lclRlc3QuamF2YQpAQCAtMTYsNyArMTYsNiBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5kZXZpY2Vwb2xpY3k7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNkZFRlc3Q7CiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQuYnVpbGQuQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy5kZXZpY2Vwb2xpY3kuQmFzZURldmljZVBvbGljeVRlc3QuU2V0dGluZ3M7CiAKQEAgLTMyLDcgKzMxLDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVWSUNFX09XTkVSX1BLRyA9ICJjb20uYW5kcm9pZC5jdHMuZGV2aWNlb3duZXIiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERVZJQ0VfT1dORVJfQVBLID0gIkN0c0RldmljZU93bmVyQXBwLmFwayI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFVklDRV9PV05FUl9BRE1JTgotICAgICAgICAgICAgPSBERVZJQ0VfT1dORVJfUEtHICsgIi5CYXNlRGV2aWNlT3duZXJUZXN0JEJhc2ljQWRtaW5SZWNlaXZlciI7CisgICAgICAgICAgICA9IERFVklDRV9PV05FUl9QS0cgKyAiLkJhc2ljQWRtaW5SZWNlaXZlciI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFVklDRV9PV05FUl9BRE1JTl9DT01QT05FTlQKICAgICAgICAgICAgID0gREVWSUNFX09XTkVSX1BLRyArICIvIiArIERFVklDRV9PV05FUl9BRE1JTjsKIApAQCAtNDQsOSArNDMsNiBAQAogICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ09VTlRfTUFOQUdFTUVOVF9BUEsKICAgICAgICAgICAgID0gIkN0c0FjY291bnRNYW5hZ2VtZW50RGV2aWNlUG9saWN5QXBwLmFwayI7CiAKLSAgICAvLyBEZXF1ZXVlIHRpbWUgb2YgUEFDS0FHRV9BRERFRCBpbnRlbnQgZm9yIHR3byB0ZXN0IHBhY2thZ2VzLgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCUk9BRENBU1RfV0FJVF9USU1FX01JTExJUyA9IDEwMDAwOyAvLyAxMCBzZWNvbmRzCi0KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBpZiAobUhhc0ZlYXR1cmUpIHsKQEAgLTc2LDggKzcyLDkgQEAKICAgICAgICAgICAgIGFzc2VydFRydWUoc2V0RGV2aWNlT3duZXIoREVWSUNFX09XTkVSX0FETUlOX0NPTVBPTkVOVCwgbVByaW1hcnlVc2VySWQsCiAgICAgICAgICAgICAgICAgICAgIC8qZXhwZWN0RmFpbHVyZSovIGZhbHNlKSk7CiAKLSAgICAgICAgICAgIC8vIFdhaXRpbmcgZm9yIHRoZSBicm9hZGNhc3QgaWRsZSBzdGF0ZS4KLSAgICAgICAgICAgIFRocmVhZC5zbGVlcChCUk9BRENBU1RfV0FJVF9USU1FX01JTExJUyk7CisgICAgICAgICAgICAvLyBXYWl0IGJyb2FkY2FzdCBpZGxlIHRvIGVuc3VyZSB0aGUgb3duZXIgY2hhbmdlZCBicm9hZGNhc3QgaGFzIGJlZW4gc2VudC4KKyAgICAgICAgICAgIHdhaXRGb3JCcm9hZGNhc3RJZGxlKCk7CisKICAgICAgICAgICAgIHJ1bkRldmljZVRlc3RzQXNVc2VyKElOVEVOVF9SRUNFSVZFUl9QS0csIHRlc3RDbGFzcywKICAgICAgICAgICAgICAgICAgICAgInRlc3RPd25lckNoYW5nZWRCcm9hZGNhc3RSZWNlaXZlZCIsIG1QcmltYXJ5VXNlcklkKTsKICAgICAgICAgfSBmaW5hbGx5IHsKQEAgLTEwNCw3ICsxMDEsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjMuOS4xLjEvQy0xLTciKQogICAgIHB1YmxpYyB2b2lkIHRlc3RDYW5ub3RTZXREZXZpY2VPd25lcldoZW5BY2NvdW50UHJlc2VudCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBpZiAoIW1IYXNGZWF0dXJlKSB7CiAgICAgICAgICAgICByZXR1cm47CkBAIC0xMjQsNyArMTIwLDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSIzLjkuMS4xL0MtMS02IikKICAgICBwdWJsaWMgdm9pZCB0ZXN0SXNQcm92aXNpb25pbmdBbGxvd2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIE11c3QgaW5zdGFsbCB0aGUgYXBrIHNpbmNlIHRoZSB0ZXN0IHJ1bnMgaW4gdGhlIERPIGFway4KICAgICAgICAgaW5zdGFsbEFwcEFzVXNlcihERVZJQ0VfT1dORVJfQVBLLCBtUHJpbWFyeVVzZXJJZCk7CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZXBvbGljeS9DdXN0b21NYW5hZ2VkUHJvZmlsZVRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlcG9saWN5L0N1c3RvbU1hbmFnZWRQcm9maWxlVGVzdC5qYXZhCmluZGV4IGE5OTBhNzIuLjUxNDIwZWEgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlcG9saWN5L0N1c3RvbU1hbmFnZWRQcm9maWxlVGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlcG9saWN5L0N1c3RvbU1hbmFnZWRQcm9maWxlVGVzdC5qYXZhCkBAIC0xNyw4ICsxNyw2IEBACiAKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DZGRUZXN0OwotCiBwdWJsaWMgY2xhc3MgQ3VzdG9tTWFuYWdlZFByb2ZpbGVUZXN0IGV4dGVuZHMgQmFzZURldmljZVBvbGljeVRlc3QgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1BTkFHRURfUFJPRklMRV9QS0cgPSAiY29tLmFuZHJvaWQuY3RzLm1hbmFnZWRwcm9maWxlIjsKQEAgLTMyLDcgKzMwLDYgQEAKICAgICAgICAgbUhhc0ZlYXR1cmUgPSBtSGFzRmVhdHVyZSAmJiBoYXNEZXZpY2VGZWF0dXJlKCJhbmRyb2lkLnNvZnR3YXJlLm1hbmFnZWRfdXNlcnMiKTsKICAgICB9CiAKLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iMy45L0MtMS0zIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0SXNQcm92aXNpb25pbmdBbGxvd2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIGludCBwcmltYXJ5VXNlcklkID0gZ2V0UHJpbWFyeVVzZXIoKTsKICAgICAgICAgLy8gTXVzdCBpbnN0YWxsIHRoZSBhcGsgc2luY2UgdGhlIHRlc3QgcnVucyBpbiB0aGUgTWFuYWdlZFByb2ZpbGUgYXBrLgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vwb2xpY3kvRGV2aWNlQW5kUHJvZmlsZU93bmVySG9zdFNpZGVUcmFuc2ZlclRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlcG9saWN5L0RldmljZUFuZFByb2ZpbGVPd25lckhvc3RTaWRlVHJhbnNmZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE4Yzc3MgotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlcG9saWN5L0RldmljZUFuZFByb2ZpbGVPd25lckhvc3RTaWRlVHJhbnNmZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxOTkgQEAKK3BhY2thZ2UgY29tLmFuZHJvaWQuY3RzLmRldmljZXBvbGljeTsKKworaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5EZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb247CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBEZXZpY2VBbmRQcm9maWxlT3duZXJIb3N0U2lkZVRyYW5zZmVyVGVzdCBleHRlbmRzIEJhc2VEZXZpY2VQb2xpY3lUZXN0IHsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFOU0ZFUl9PV05FUl9PVVRHT0lOR19QS0cgPQorICAgICAgICAgICAgImNvbS5hbmRyb2lkLmN0cy50cmFuc2Zlcm93bmVyb3V0Z29pbmciOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQU5TRkVSX09XTkVSX09VVEdPSU5HX0FQSyA9ICJDdHNUcmFuc2Zlck93bmVyT3V0Z29pbmdBcHAuYXBrIjsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFOU0ZFUl9PV05FUl9PVVRHT0lOR19URVNUX1JFQ0VJVkVSID0KKyAgICAgICAgICAgIFRSQU5TRkVSX09XTkVSX09VVEdPSU5HX1BLRworICAgICAgICAgICAgICAgICAgICArICIvY29tLmFuZHJvaWQuY3RzLnRyYW5zZmVyb3duZXIiCisgICAgICAgICAgICAgICAgICAgICsgIi5EZXZpY2VBbmRQcm9maWxlT3duZXJUcmFuc2Zlck91dGdvaW5nVGVzdCRCYXNpY0FkbWluUmVjZWl2ZXIiOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQU5TRkVSX09XTkVSX0lOQ09NSU5HX1BLRyA9CisgICAgICAgICAgICAiY29tLmFuZHJvaWQuY3RzLnRyYW5zZmVyb3duZXJpbmNvbWluZyI7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBTlNGRVJfT1dORVJfSU5DT01JTkdfQVBLID0gIkN0c1RyYW5zZmVyT3duZXJJbmNvbWluZ0FwcC5hcGsiOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElOVkFMSURfVEFSR0VUX0FQSyA9ICJDdHNJbnRlbnRSZWNlaXZlckFwcC5hcGsiOworCisgICAgcHJvdGVjdGVkIGludCBtVXNlcklkOworICAgIHByb3RlY3RlZCBTdHJpbmcgbU91dGdvaW5nVGVzdENsYXNzTmFtZTsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIG1JbmNvbWluZ1Rlc3RDbGFzc05hbWU7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJhbnNmZXJPd25lcnNoaXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFtSGFzRmVhdHVyZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHJ1bkRldmljZVRlc3RzQXNVc2VyKFRSQU5TRkVSX09XTkVSX09VVEdPSU5HX1BLRywKKyAgICAgICAgICAgICAgICBtT3V0Z29pbmdUZXN0Q2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICJ0ZXN0VHJhbnNmZXJPd25lcnNoaXAiLCBtVXNlcklkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJhbnNmZXJTYW1lQWRtaW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFtSGFzRmVhdHVyZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHJ1bkRldmljZVRlc3RzQXNVc2VyKFRSQU5TRkVSX09XTkVSX09VVEdPSU5HX1BLRywKKyAgICAgICAgICAgICAgICBtT3V0Z29pbmdUZXN0Q2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICJ0ZXN0VHJhbnNmZXJTYW1lQWRtaW4iLCBtVXNlcklkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJhbnNmZXJJbnZhbGlkVGFyZ2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghbUhhc0ZlYXR1cmUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpbnN0YWxsQXBwQXNVc2VyKElOVkFMSURfVEFSR0VUX0FQSywgbVVzZXJJZCk7CisgICAgICAgIHJ1bkRldmljZVRlc3RzQXNVc2VyKFRSQU5TRkVSX09XTkVSX09VVEdPSU5HX1BLRywKKyAgICAgICAgICAgICAgICBtT3V0Z29pbmdUZXN0Q2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICJ0ZXN0VHJhbnNmZXJJbnZhbGlkVGFyZ2V0IiwgbVVzZXJJZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFRyYW5zZmVyUG9saWNpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFtSGFzRmVhdHVyZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHJ1bkRldmljZVRlc3RzQXNVc2VyKFRSQU5TRkVSX09XTkVSX09VVEdPSU5HX1BLRywKKyAgICAgICAgICAgICAgICBtT3V0Z29pbmdUZXN0Q2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICJ0ZXN0VHJhbnNmZXJXaXRoUG9saWNpZXNPdXRnb2luZyIsIG1Vc2VySWQpOworICAgICAgICBydW5EZXZpY2VUZXN0c0FzVXNlcihUUkFOU0ZFUl9PV05FUl9JTkNPTUlOR19QS0csCisgICAgICAgICAgICAgICAgbUluY29taW5nVGVzdENsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAidGVzdFRyYW5zZmVyUG9saWNpZXNBcmVSZXRhaW5lZEFmdGVyVHJhbnNmZXIiLCBtVXNlcklkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJhbnNmZXJPd25lcnNoaXBDaGFuZ2VkQnJvYWRjYXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghbUhhc0ZlYXR1cmUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBydW5EZXZpY2VUZXN0c0FzVXNlcihUUkFOU0ZFUl9PV05FUl9PVVRHT0lOR19QS0csCisgICAgICAgICAgICAgICAgbU91dGdvaW5nVGVzdENsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAidGVzdFRyYW5zZmVyT3duZXJzaGlwQ2hhbmdlZEJyb2FkY2FzdCIsIG1Vc2VySWQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RUcmFuc2ZlckNvbXBsZXRlQ2FsbGJhY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFtSGFzRmVhdHVyZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHJ1bkRldmljZVRlc3RzQXNVc2VyKFRSQU5TRkVSX09XTkVSX09VVEdPSU5HX1BLRywKKyAgICAgICAgICAgICAgICBtT3V0Z29pbmdUZXN0Q2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICJ0ZXN0VHJhbnNmZXJPd25lcnNoaXAiLCBtVXNlcklkKTsKKworICAgICAgICB3YWl0Rm9yQnJvYWRjYXN0SWRsZSgpOworCisgICAgICAgIHJ1bkRldmljZVRlc3RzQXNVc2VyKFRSQU5TRkVSX09XTkVSX0lOQ09NSU5HX1BLRywKKyAgICAgICAgICAgICAgICBtSW5jb21pbmdUZXN0Q2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICJ0ZXN0VHJhbnNmZXJDb21wbGV0ZUNhbGxiYWNrSXNDYWxsZWQiLCBtVXNlcklkKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXR1cFRlc3RQYXJhbWV0ZXJzKGludCB1c2VySWQsIFN0cmluZyBvdXRnb2luZ1Rlc3RDbGFzc05hbWUsCisgICAgICAgICAgICBTdHJpbmcgaW5jb21pbmdUZXN0Q2xhc3NOYW1lKSB7CisgICAgICAgIG1Vc2VySWQgPSB1c2VySWQ7CisgICAgICAgIG1PdXRnb2luZ1Rlc3RDbGFzc05hbWUgPSBvdXRnb2luZ1Rlc3RDbGFzc05hbWU7CisgICAgICAgIG1JbmNvbWluZ1Rlc3RDbGFzc05hbWUgPSBpbmNvbWluZ1Rlc3RDbGFzc05hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFRyYW5zZmVyT3duZXJzaGlwTm9NZXRhZGF0YSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIW1IYXNGZWF0dXJlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgcnVuRGV2aWNlVGVzdHNBc1VzZXIoVFJBTlNGRVJfT1dORVJfT1VUR09JTkdfUEtHLAorICAgICAgICAgICAgICAgIG1PdXRnb2luZ1Rlc3RDbGFzc05hbWUsCisgICAgICAgICAgICAgICAgInRlc3RUcmFuc2Zlck93bmVyc2hpcE5vTWV0YWRhdGEiLCBtVXNlcklkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNUcmFuc2ZlckJ1bmRsZVBlcnNpc3RlZCgpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24geworICAgICAgICBpZiAoIW1IYXNGZWF0dXJlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgcnVuRGV2aWNlVGVzdHNBc1VzZXIoVFJBTlNGRVJfT1dORVJfT1VUR09JTkdfUEtHLAorICAgICAgICAgICAgICAgIG1PdXRnb2luZ1Rlc3RDbGFzc05hbWUsCisgICAgICAgICAgICAgICAgInRlc3RUcmFuc2Zlck93bmVyc2hpcEJ1bmRsZVNhdmVkIiwgbVVzZXJJZCk7CisgICAgICAgIHJ1bkRldmljZVRlc3RzQXNVc2VyKFRSQU5TRkVSX09XTkVSX0lOQ09NSU5HX1BLRywKKyAgICAgICAgICAgICAgICBtSW5jb21pbmdUZXN0Q2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICJ0ZXN0VHJhbnNmZXJPd25lcnNoaXBCdW5kbGVMb2FkZWQiLCBtVXNlcklkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0VHJhbnNmZXJPd25lcnNoaXBCdW5kbGVPbmx5Q2FsbGVkRnJvbUFkbWluKCkKKyAgICAgICAgICAgIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24geworICAgICAgICBpZiAoIW1IYXNGZWF0dXJlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgcnVuRGV2aWNlVGVzdHNBc1VzZXIoVFJBTlNGRVJfT1dORVJfT1VUR09JTkdfUEtHLAorICAgICAgICAgICAgICAgIG1PdXRnb2luZ1Rlc3RDbGFzc05hbWUsCisgICAgICAgICAgICAgICAgInRlc3RHZXRUcmFuc2Zlck93bmVyc2hpcEJ1bmRsZU9ubHlDYWxsZWRGcm9tQWRtaW4iLCBtVXNlcklkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QnVuZGxlRW1wdHlBZnRlclRyYW5zZmVyV2l0aE51bGxCdW5kbGUoKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFtSGFzRmVhdHVyZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHJ1bkRldmljZVRlc3RzQXNVc2VyKFRSQU5TRkVSX09XTkVSX09VVEdPSU5HX1BLRywKKyAgICAgICAgICAgICAgICBtT3V0Z29pbmdUZXN0Q2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICJ0ZXN0VHJhbnNmZXJPd25lcnNoaXBOdWxsQnVuZGxlIiwgbVVzZXJJZCk7CisgICAgICAgIHJ1bkRldmljZVRlc3RzQXNVc2VyKFRSQU5TRkVSX09XTkVSX0lOQ09NSU5HX1BLRywKKyAgICAgICAgICAgICAgICBtSW5jb21pbmdUZXN0Q2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICJ0ZXN0VHJhbnNmZXJPd25lcnNoaXBFbXB0eUJ1bmRsZUxvYWRlZCIsIG1Vc2VySWQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJc0J1bmRsZU51bGxOb1RyYW5zZmVyKCkgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghbUhhc0ZlYXR1cmUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBydW5EZXZpY2VUZXN0c0FzVXNlcihUUkFOU0ZFUl9PV05FUl9PVVRHT0lOR19QS0csCisgICAgICAgICAgICAgICAgbU91dGdvaW5nVGVzdENsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAidGVzdElzQnVuZGxlTnVsbE5vVHJhbnNmZXIiLCBtVXNlcklkKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgaW50IHNldHVwTWFuYWdlZFByb2ZpbGVPbkRldmljZU93bmVyKFN0cmluZyBhcGtOYW1lLCBTdHJpbmcgYWRtaW5SZWNlaXZlckNsYXNzTmFtZSkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBUZW1wb3JhcnkgZGlzYWJsZSB0aGUgRElTQUxMT1dfQUREX01BTkFHRURfUFJPRklMRSwgc28gdGhhdCB3ZSBjYW4gY3JlYXRlIHByb2ZpbGUKKyAgICAgICAgLy8gdXNpbmcgYWRiIGNvbW1hbmQuCisgICAgICAgIGNsZWFyRGlzYWxsb3dBZGRNYW5hZ2VkUHJvZmlsZVJlc3RyaWN0aW9uKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gc2V0dXBNYW5hZ2VkUHJvZmlsZShhcGtOYW1lLCBhZG1pblJlY2VpdmVyQ2xhc3NOYW1lKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIC8vIEFkZGluZyBiYWNrIERJU0FMTE9XX0FERF9NQU5BR0VEX1BST0ZJTEUuCisgICAgICAgICAgICBhZGREaXNhbGxvd0FkZE1hbmFnZWRQcm9maWxlUmVzdHJpY3Rpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBpbnQgc2V0dXBNYW5hZ2VkUHJvZmlsZShTdHJpbmcgYXBrTmFtZSwgU3RyaW5nIGFkbWluUmVjZWl2ZXJDbGFzc05hbWUpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgaW50IHVzZXJJZCA9IGNyZWF0ZU1hbmFnZWRQcm9maWxlKG1QcmltYXJ5VXNlcklkKTsKKyAgICAgICAgaW5zdGFsbEFwcEFzVXNlcihhcGtOYW1lLCB1c2VySWQpOworICAgICAgICBpZiAoIXNldFByb2ZpbGVPd25lcihhZG1pblJlY2VpdmVyQ2xhc3NOYW1lLCB1c2VySWQsIGZhbHNlKSkgeworICAgICAgICAgICAgcmVtb3ZlQWRtaW4oVFJBTlNGRVJfT1dORVJfT1VUR09JTkdfVEVTVF9SRUNFSVZFUiwgdXNlcklkKTsKKyAgICAgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoVFJBTlNGRVJfT1dORVJfT1VUR09JTkdfUEtHKTsKKyAgICAgICAgICAgIGZhaWwoIkZhaWxlZCB0byBzZXQgZGV2aWNlIG93bmVyIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgc3RhcnRVc2VyKHVzZXJJZCk7CisgICAgICAgIHJldHVybiB1c2VySWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xlYXIge0BsaW5rIGFuZHJvaWQub3MuVXNlck1hbmFnZXIjRElTQUxMT1dfQUREX01BTkFHRURfUFJPRklMRX0uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNsZWFyRGlzYWxsb3dBZGRNYW5hZ2VkUHJvZmlsZVJlc3RyaWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJ1bkRldmljZVRlc3RzQXNVc2VyKAorICAgICAgICAgICAgICAgIFRSQU5TRkVSX09XTkVSX09VVEdPSU5HX1BLRywKKyAgICAgICAgICAgICAgICBtT3V0Z29pbmdUZXN0Q2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICJ0ZXN0Q2xlYXJEaXNhbGxvd0FkZE1hbmFnZWRQcm9maWxlUmVzdHJpY3Rpb24iLAorICAgICAgICAgICAgICAgIG1QcmltYXJ5VXNlcklkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQge0BsaW5rIGFuZHJvaWQub3MuVXNlck1hbmFnZXIjRElTQUxMT1dfQUREX01BTkFHRURfUFJPRklMRX0uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFkZERpc2FsbG93QWRkTWFuYWdlZFByb2ZpbGVSZXN0cmljdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBydW5EZXZpY2VUZXN0c0FzVXNlcigKKyAgICAgICAgICAgICAgICBUUkFOU0ZFUl9PV05FUl9PVVRHT0lOR19QS0csCisgICAgICAgICAgICAgICAgbU91dGdvaW5nVGVzdENsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAidGVzdEFkZERpc2FsbG93QWRkTWFuYWdlZFByb2ZpbGVSZXN0cmljdGlvbiIsCisgICAgICAgICAgICAgICAgbVByaW1hcnlVc2VySWQpOworICAgIH0KKworICAgIC8qIFRPRE86IEFkZCB0ZXN0cyBmb3I6CisgICAgKiAxLiBzdGFydFNlcnZpY2VGb3JPd25lcgorICAgICogMi4gcGFzc3dvcmRPd25lcgorICAgICoKKyAgICAqICovCit9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZXBvbGljeS9EZXZpY2VBbmRQcm9maWxlT3duZXJUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZXBvbGljeS9EZXZpY2VBbmRQcm9maWxlT3duZXJUZXN0LmphdmEKaW5kZXggZDVhYWRkMC4uZWRjMmZmNiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vwb2xpY3kvRGV2aWNlQW5kUHJvZmlsZU93bmVyVGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlcG9saWN5L0RldmljZUFuZFByb2ZpbGVPd25lclRlc3QuamF2YQpAQCAtMTA3LDYgKzEwNywxMyBAQAogICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFTU0lTVF9BUFBfUEtHID0gImNvbS5hbmRyb2lkLmN0cy5kZXZpY2Vwb2xpY3kuYXNzaXN0YXBwIjsKICAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBU1NJU1RfQVBQX0FQSyA9ICJDdHNEZXZpY2VQb2xpY3lBc3Npc3RBcHAuYXBrIjsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUklOVElOR19BUFBfUEtHID0gImNvbS5hbmRyb2lkLmN0cy5kZXZpY2Vwb2xpY3kucHJpbnRpbmdhcHAiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUklOVElOR19BUFBfQVBLID0gIkN0c0RldmljZVBvbGljeVByaW50aW5nQXBwLmFwayI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVURVJFRF9EQVRBX0FQUF9QS0cKKyAgICAgICAgICAgID0gImNvbS5hbmRyb2lkLmN0cy5kZXZpY2Vwb2xpY3kubWV0ZXJlZHRlc3RhcHAiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRFUkVEX0RBVEFfQVBQX0FQSyA9ICJDdHNNZXRlcmVkRGF0YVRlc3RBcHAuYXBrIjsKKwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTkFCTEVEX05PVElGSUNBVElPTl9QT0xJQ1lfQUNDRVNTX1BBQ0tBR0VTCiAgICAgICAgICAgICA9ICJlbmFibGVkX25vdGlmaWNhdGlvbl9wb2xpY3lfYWNjZXNzX3BhY2thZ2VzIjsKIApAQCAtMTQzLDcgKzE1MCw5IEBACiAgICAgICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKElOVEVOVF9SRUNFSVZFUl9QS0cpOwogICAgICAgICAgICAgZ2V0RGV2aWNlKCkudW5pbnN0YWxsUGFja2FnZShJTlRFTlRfU0VOREVSX1BLRyk7CiAgICAgICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKENVU1RPTUlaQVRJT05fQVBQX1BLRyk7Ci0gICAgICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKEFVVE9GSUxMX0FQUF9BUEspOworICAgICAgICAgICAgZ2V0RGV2aWNlKCkudW5pbnN0YWxsUGFja2FnZShBVVRPRklMTF9BUFBfUEtHKTsKKyAgICAgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoUFJJTlRJTkdfQVBQX1BLRyk7CisgICAgICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKE1FVEVSRURfREFUQV9BUFBfUEtHKTsKICAgICAgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoVEVTVF9BUFBfUEtHKTsKIAogICAgICAgICAgICAgLy8gUHJlc3MgdGhlIEhPTUUga2V5IHRvIGNsb3NlIGFueSBhbGFydCBkaWFsb2cgdGhhdCBtYXkgYmUgc2hvd24uCkBAIC0yNjEsNiArMjcwLDE1IEBACiAgICAgICAgIGV4ZWN1dGVEZXZpY2VUZXN0TWV0aG9kKCIuUGVybWlzc2lvbnNUZXN0IiwgInRlc3RQZXJtaXNzaW9uR3JhbnRTdGF0ZSIpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHRlc3RQZXJtaXNzaW9uR3JhbnRfZGV2ZWxvcG1lbnRQZXJtaXNzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghbUhhc0ZlYXR1cmUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpbnN0YWxsQXBwUGVybWlzc2lvbkFwcEFzVXNlcigpOworICAgICAgICBleGVjdXRlRGV2aWNlVGVzdE1ldGhvZCgKKyAgICAgICAgICAgICAgICAiLlBlcm1pc3Npb25zVGVzdCIsICJ0ZXN0UGVybWlzc2lvbkdyYW50U3RhdGVfZGV2ZWxvcG1lbnRQZXJtaXNzaW9uIik7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogUmVxdWlyZSBhIGRldmljZSBmb3IgdGVzdHMgdGhhdCB1c2UgdGhlIG5ldHdvcmsgc3RhY2suIEhlYWRsZXNzIEFuZHJvaWRzIHJ1bm5pbmcgaW4KICAgICAgKiBkYXRhIGNlbnRyZXMgbWlnaHQgbmVlZCB0aGVpciBuZXR3b3JrIHJ1bGVzIHVuLXRhbXBlcmVkLXdpdGggaW4gb3JkZXIgdG8ga2VlcCB0aGUgQURCIC8gVk5DCkBAIC0zMTIsNiArMzMwLDggQEAKICAgICAgICAgICAgIGluc3RhbGxBcHBBc1VzZXIoVlBOX0FQUF9BUEssIG1Vc2VySWQpOwogICAgICAgICAgICAgZXhlY3V0ZURldmljZVRlc3RNZXRob2QoIi5BbHdheXNPblZwbk11bHRpU3RhZ2VUZXN0IiwgInRlc3RBbHdheXNPblNldCIpOwogICAgICAgICAgICAgcmVib290QW5kV2FpdFVudGlsUmVhZHkoKTsKKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBwcm9maWxlIHVzZXIgaW5pdGlhbGl6YXRpb24gaXMgY29tcGxldGUgYmVmb3JlIHByb2NlZWRpbmcuCisgICAgICAgICAgICB3YWl0Rm9yQnJvYWRjYXN0SWRsZSgpOwogICAgICAgICAgICAgdmVyaWZ5VXNlckNyZWRlbnRpYWwodGVzdFBhc3N3b3JkLCBtVXNlcklkKTsKICAgICAgICAgICAgIGV4ZWN1dGVEZXZpY2VUZXN0TWV0aG9kKCIuQWx3YXlzT25WcG5NdWx0aVN0YWdlVGVzdCIsICJ0ZXN0QWx3YXlzT25TZXRBZnRlclJlYm9vdCIpOwogICAgICAgICB9IGZpbmFsbHkgewpAQCAtNTAxLDcgKzUyMSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpbnN0YWxsQXBwQXNVc2VyKEFDQ09VTlRfTUFOQUdFTUVOVF9BUEssIG1Vc2VySWQpOwotICAgICAgICBleGVjdXRlRGV2aWNlVGVzdENsYXNzKCIuRHBjQWxsb3dlZEFjY291bnRNYW5hZ2VtZW50VGVzdCIpOworICAgICAgICBleGVjdXRlRGV2aWNlVGVzdENsYXNzKCIuQWxsb3dlZEFjY291bnRNYW5hZ2VtZW50VGVzdCIpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RBY2NvdW50TWFuYWdlbWVudF91c2VyUmVzdHJpY3Rpb25BZGRBY2NvdW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC02NDIsNiArNjYyLDE1IEBACiAgICAgICAgICAgICAgICAgInRlc3REaXNhbGxvd0F1dG9maWxsX2FsbG93ZWQiKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0TWV0ZXJlZERhdGFEaXNhYmxlZFBhY2thZ2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghbUhhc0ZlYXR1cmUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpbnN0YWxsQXBwQXNVc2VyKE1FVEVSRURfREFUQV9BUFBfQVBLLCBtVXNlcklkKTsKKworICAgICAgICBleGVjdXRlRGV2aWNlVGVzdENsYXNzKCIuTWV0ZXJlZERhdGFSZXN0cmljdGlvblRlc3QiKTsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCB0ZXN0UGFja2FnZUluc3RhbGxVc2VyUmVzdHJpY3Rpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghbUhhc0ZlYXR1cmUpIHsKICAgICAgICAgICAgIHJldHVybjsKQEAgLTgxNywxNSArODQ2LDc3IEBACiAgICAgICAgIGV4ZWN1dGVEZXZpY2VUZXN0Q2xhc3MoIi5QYXNzd29yZFN1ZmZpY2llbnRJbml0aWFsbHlUZXN0Iik7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgdGVzdFNldFN5c3RlbVNldHRpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFtSGFzRmVhdHVyZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGV4ZWN1dGVEZXZpY2VUZXN0Q2xhc3MoIi5TZXRTeXN0ZW1TZXR0aW5nVGVzdCIpOworICAgIH0KKwogICAgIHByb3RlY3RlZCB2b2lkIGV4ZWN1dGVSZXNldFBhc3N3b3JkV2l0aFRva2VuVGVzdHMoQm9vbGVhbiBhbGxvd0ZhaWx1cmVzKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgcnVuRGV2aWNlVGVzdHNBc1VzZXIoREVWSUNFX0FETUlOX1BLRywgIi5SZXNldFBhc3N3b3JkV2l0aFRva2VuVGVzdCIsIG51bGwsIG1Vc2VySWQsCiAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc2luZ2xldG9uTWFwKEFSR19BTExPV19GQUlMVVJFLCBCb29sZWFuLnRvU3RyaW5nKGFsbG93RmFpbHVyZXMpKSk7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgdGVzdENsZWFyQXBwbGljYXRpb25EYXRhX3Rlc3RQa2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFtSGFzRmVhdHVyZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGluc3RhbGxBcHBBc1VzZXIoSU5URU5UX1JFQ0VJVkVSX0FQSywgbVVzZXJJZCk7CisgICAgICAgIHJ1bkRldmljZVRlc3RzQXNVc2VyKElOVEVOVF9SRUNFSVZFUl9QS0csIElOVEVOVF9SRUNFSVZFUl9QS0cgKyAiLkNsZWFyQXBwbGljYXRpb25EYXRhVGVzdCIsCisgICAgICAgICAgICAgICAgInRlc3RXcml0ZVRvU2hhcmVkUHJlZmVyZW5jZSIsIG1Vc2VySWQpOworICAgICAgICBleGVjdXRlRGV2aWNlVGVzdE1ldGhvZCgiLkNsZWFyQXBwbGljYXRpb25EYXRhVGVzdCIsICJ0ZXN0Q2xlYXJBcHBsaWNhdGlvbkRhdGFfdGVzdFBrZyIpOworICAgICAgICBydW5EZXZpY2VUZXN0c0FzVXNlcihJTlRFTlRfUkVDRUlWRVJfUEtHLCBJTlRFTlRfUkVDRUlWRVJfUEtHICsgIi5DbGVhckFwcGxpY2F0aW9uRGF0YVRlc3QiLAorICAgICAgICAgICAgICAgICJ0ZXN0U2hhcmVkUHJlZmVyZW5jZUNsZWFyZWQiLCBtVXNlcklkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJBcHBsaWNhdGlvbkRhdGFfZGV2aWNlUHJvdmlzaW9uaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghbUhhc0ZlYXR1cmUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBDbGVhcmluZyBkYXRhIG9mIGRldmljZSBjb25maWd1cmF0aW9uIGFwcCBzaG91bGQgZmFpbAorICAgICAgICBleGVjdXRlRGV2aWNlVGVzdE1ldGhvZCgiLkNsZWFyQXBwbGljYXRpb25EYXRhVGVzdCIsCisgICAgICAgICAgICAgICAgInRlc3RDbGVhckFwcGxpY2F0aW9uRGF0YV9kZXZpY2VQcm92aXNpb25pbmciKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJBcHBsaWNhdGlvbkRhdGFfYWN0aXZlQWRtaW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFtSGFzRmVhdHVyZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIENsZWFyaW5nIGRhdGEgb2YgYWN0aXZlIGFkbWluIHNob3VsZCBmYWlsCisgICAgICAgIGV4ZWN1dGVEZXZpY2VUZXN0TWV0aG9kKCIuQ2xlYXJBcHBsaWNhdGlvbkRhdGFUZXN0IiwKKyAgICAgICAgICAgICAgICAidGVzdENsZWFyQXBwbGljYXRpb25EYXRhX2FjdGl2ZUFkbWluIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFByaW50aW5nUG9saWN5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghbUhhc0ZlYXR1cmUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpbnN0YWxsQXBwQXNVc2VyKFBSSU5USU5HX0FQUF9BUEssIG1Vc2VySWQpOworICAgICAgICBleGVjdXRlRGV2aWNlVGVzdENsYXNzKCIuUHJpbnRpbmdQb2xpY3lUZXN0Iik7CisgICAgfQorCiAgICAgcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZURldmljZVRlc3RDbGFzcyhTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgcnVuRGV2aWNlVGVzdHNBc1VzZXIoREVWSUNFX0FETUlOX1BLRywgY2xhc3NOYW1lLCBtVXNlcklkKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5TWFuYWdlbWVudCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIW1IYXNGZWF0dXJlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gU2V0IGEgbm9uLWVtcHR5IGRldmljZSBsb2Nrc2NyZWVuIHBhc3N3b3JkLCB3aGljaCBpcyBhIHByZWNvbmRpdGlvbiBmb3IgaW5zdGFsbGluZworICAgICAgICAgICAgLy8gQ0EgY2VydGlmaWNhdGVzLgorICAgICAgICAgICAgY2hhbmdlVXNlckNyZWRlbnRpYWwoIjEyMzQiLCBudWxsLCBtVXNlcklkKTsKKyAgICAgICAgICAgIC8vIFZlcmlmeSB0aGUgY3JlZGVudGlhbCBpbW1lZGlhdGVseSB0byB1bmxvY2sgdGhlIHdvcmsgcHJvZmlsZSBjaGFsbGVuZ2UKKyAgICAgICAgICAgIHZlcmlmeVVzZXJDcmVkZW50aWFsKCIxMjM0IiwgbVVzZXJJZCk7CisgICAgICAgICAgICBleGVjdXRlRGV2aWNlVGVzdENsYXNzKCIuS2V5TWFuYWdlbWVudFRlc3QiKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGNoYW5nZVVzZXJDcmVkZW50aWFsKG51bGwsICIxMjM0IiwgbVVzZXJJZCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKICAgICAgKiBFeGVjdXRlcyBhIHRlc3QgY2xhc3Mgb24gZGV2aWNlLiBQcmlvciB0byBydW5uaW5nLCB0dXJuIG9mZiBiYWNrZ3JvdW5kIGRhdGEgdXNhZ2UKICAgICAgKiByZXN0cmljdGlvbnMsIGFuZCByZXN0b3JlIHRoZSBvcmlnaW5hbCByZXN0cmljdGlvbnMgYWZ0ZXIgdGhlIHRlc3QuCkBAIC05MjgsMTAgKzEwMTksNyBAQAogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIHN0YXJ0U2ltcGxlQWN0aXZpdHlBc1VzZXIoaW50IHVzZXJJZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGluc3RhbGxBcHBBc1VzZXIoVEVTVF9BUFBfQVBLLCB1c2VySWQpOwotICAgICAgICB3YWtldXBBbmREaXNtaXNzS2V5Z3VhcmQoKTsKLSAgICAgICAgU3RyaW5nIGNvbW1hbmQgPSAiYW0gc3RhcnQgLVcgLS11c2VyICIgKyB1c2VySWQgKyAiICIgKyBURVNUX0FQUF9QS0cgKyAiLyIKLSAgICAgICAgICAgICAgICArIFRFU1RfQVBQX1BLRyArICIuU2ltcGxlQWN0aXZpdHkiOwotICAgICAgICBnZXREZXZpY2UoKS5leGVjdXRlU2hlbGxDb21tYW5kKGNvbW1hbmQpOworICAgICAgICBzdGFydEFjdGl2aXR5QXNVc2VyKHVzZXJJZCwgVEVTVF9BUFBfUEtHLCBURVNUX0FQUF9QS0cgKyAiLlNpbXBsZUFjdGl2aXR5Iik7CiAgICAgfQogCiAgICAgcHJvdGVjdGVkIHZvaWQgc2V0U2NyZWVuQ2FwdHVyZURpc2FibGVkKGludCB1c2VySWQsIGJvb2xlYW4gZGlzYWJsZWQpIHRocm93cyBFeGNlcHRpb24gewpAQCAtOTM5LDEwICsxMDI3LDE3IEBACiAgICAgICAgICAgICAgICAgPyAidGVzdFNldFNjcmVlbkNhcHR1cmVEaXNhYmxlZF90cnVlIgogICAgICAgICAgICAgICAgIDogInRlc3RTZXRTY3JlZW5DYXB0dXJlRGlzYWJsZWRfZmFsc2UiOwogICAgICAgICBleGVjdXRlRGV2aWNlVGVzdE1ldGhvZCgiLlNjcmVlbkNhcHR1cmVEaXNhYmxlZFRlc3QiLCB0ZXN0TWV0aG9kTmFtZSk7Ci0gICAgICAgIHN0YXJ0U2ltcGxlQWN0aXZpdHlBc1VzZXIodXNlcklkKTsKKwogICAgICAgICB0ZXN0TWV0aG9kTmFtZSA9IGRpc2FibGVkCiAgICAgICAgICAgICAgICAgPyAidGVzdFNjcmVlbkNhcHR1cmVJbXBvc3NpYmxlIgogICAgICAgICAgICAgICAgIDogInRlc3RTY3JlZW5DYXB0dXJlUG9zc2libGUiOworCisgICAgICAgIGlmICh1c2VySWQgPT0gbVByaW1hcnlVc2VySWQpIHsKKyAgICAgICAgICAgIC8vIElmIHRlc3RpbmcgZm9yIHVzZXItMCwgYWxzbyBtYWtlIHN1cmUgdGhlIGV4aXN0aW5nIHNjcmVlbiBjYW4ndCBiZSBjYXB0dXJlZC4KKyAgICAgICAgICAgIGV4ZWN1dGVEZXZpY2VUZXN0TWV0aG9kKCIuU2NyZWVuQ2FwdHVyZURpc2FibGVkVGVzdCIsIHRlc3RNZXRob2ROYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXJ0U2ltcGxlQWN0aXZpdHlBc1VzZXIodXNlcklkKTsKICAgICAgICAgZXhlY3V0ZURldmljZVRlc3RNZXRob2QoIi5TY3JlZW5DYXB0dXJlRGlzYWJsZWRUZXN0IiwgdGVzdE1ldGhvZE5hbWUpOwogICAgIH0KIApAQCAtOTUyLDEzICsxMDQ3LDI1IEBACiAgICAgICAgICAgICAgICAgPyAidGVzdFNldFNjcmVlbkNhcHR1cmVEaXNhYmxlZF90cnVlIgogICAgICAgICAgICAgICAgIDogInRlc3RTZXRTY3JlZW5DYXB0dXJlRGlzYWJsZWRfZmFsc2UiOwogICAgICAgICBleGVjdXRlRGV2aWNlVGVzdE1ldGhvZCgiLlNjcmVlbkNhcHR1cmVEaXNhYmxlZFRlc3QiLCB0ZXN0TWV0aG9kTmFtZSk7Ci0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgZm9yZWdyb3VuZCBhY3Rpdml0eSBpcyBmcm9tIHRoZSB0YXJnZXQgdXNlci4KLSAgICAgICAgc3RhcnRTaW1wbGVBY3Rpdml0eUFzVXNlcih1c2VySWQpOwotICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSBWb2ljZUludGVyYWN0aW9uU2VydmljZSBjYW4gcmV0cmlldmUgdGhlIHNjcmVlbnNob3QuCiAgICAgICAgIHRlc3RNZXRob2ROYW1lID0gZGlzYWJsZWQKICAgICAgICAgICAgICAgICA/ICJ0ZXN0U2NyZWVuQ2FwdHVyZUltcG9zc2libGVfYXNzaXN0IgogICAgICAgICAgICAgICAgIDogInRlc3RTY3JlZW5DYXB0dXJlUG9zc2libGVfYXNzaXN0IjsKKworICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSBWb2ljZUludGVyYWN0aW9uU2VydmljZSBjYW4gcmV0cmlldmUgdGhlIHNjcmVlbnNob3QuCiAgICAgICAgIGluc3RhbGxBcHBBc1VzZXIoREVWSUNFX0FETUlOX0FQSywgbVByaW1hcnlVc2VySWQpOworCisgICAgICAgIGlmICh1c2VySWQgPT0gbVByaW1hcnlVc2VySWQpIHsKKyAgICAgICAgICAgIC8vIElmIHRlc3RpbmcgZm9yIHVzZXItMCwgYWxzbyBtYWtlIHN1cmUgdGhlIGV4aXN0aW5nIHNjcmVlbiBjYW4ndCBiZSBjYXB0dXJlZC4KKyAgICAgICAgICAgIHJ1bkRldmljZVRlc3RzQXNVc2VyKAorICAgICAgICAgICAgICAgICAgICBERVZJQ0VfQURNSU5fUEtHLAorICAgICAgICAgICAgICAgICAgICAiLkFzc2lzdFNjcmVlbkNhcHR1cmVEaXNhYmxlZFRlc3QiLAorICAgICAgICAgICAgICAgICAgICB0ZXN0TWV0aG9kTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgbVByaW1hcnlVc2VySWQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBmb3JlZ3JvdW5kIGFjdGl2aXR5IGlzIGZyb20gdGhlIHRhcmdldCB1c2VyLgorICAgICAgICBzdGFydFNpbXBsZUFjdGl2aXR5QXNVc2VyKHVzZXJJZCk7CisKICAgICAgICAgcnVuRGV2aWNlVGVzdHNBc1VzZXIoCiAgICAgICAgICAgICAgICAgREVWSUNFX0FETUlOX1BLRywKICAgICAgICAgICAgICAgICAiLkFzc2lzdFNjcmVlbkNhcHR1cmVEaXNhYmxlZFRlc3QiLApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vwb2xpY3kvRGV2aWNlT3duZXJQbHVzUHJvZmlsZU93bmVyVGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vwb2xpY3kvRGV2aWNlT3duZXJQbHVzUHJvZmlsZU93bmVyVGVzdC5qYXZhCmluZGV4IDhkMWMwNDAuLmFiODFlZjYgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlcG9saWN5L0RldmljZU93bmVyUGx1c1Byb2ZpbGVPd25lclRlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZXBvbGljeS9EZXZpY2VPd25lclBsdXNQcm9maWxlT3duZXJUZXN0LmphdmEKQEAgLTQyMyw2ICs0MjMsNDYgQEAKICAgICAgICAgICAgICAgICBtUHJpbWFyeVVzZXJJZCk7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgdGVzdENhbm5vdFN0YXJ0TWFuYWdlZFByb2ZpbGVJbkJhY2tncm91bmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFtSGFzRmVhdHVyZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHNldHVwTWFuYWdlZFByb2ZpbGUoQ09NUF9EUENfQVBLLCBDT01QX0RQQ19QS0csIENPTVBfRFBDX0FETUlOKTsKKworICAgICAgICBydW5EZXZpY2VUZXN0c0FzVXNlcigKKyAgICAgICAgICAgICAgICBDT01QX0RQQ19QS0csCisgICAgICAgICAgICAgICAgTUFOQUdFTUVOVF9URVNULAorICAgICAgICAgICAgICAgICJ0ZXN0Q2Fubm90U3RhcnRNYW5hZ2VkUHJvZmlsZUluQmFja2dyb3VuZCIsCisgICAgICAgICAgICAgICAgbVByaW1hcnlVc2VySWQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDYW5ub3RTdG9wTWFuYWdlZFByb2ZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFtSGFzRmVhdHVyZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHNldHVwTWFuYWdlZFByb2ZpbGUoQ09NUF9EUENfQVBLLCBDT01QX0RQQ19QS0csIENPTVBfRFBDX0FETUlOKTsKKworICAgICAgICBydW5EZXZpY2VUZXN0c0FzVXNlcigKKyAgICAgICAgICAgICAgICBDT01QX0RQQ19QS0csCisgICAgICAgICAgICAgICAgTUFOQUdFTUVOVF9URVNULAorICAgICAgICAgICAgICAgICJ0ZXN0Q2Fubm90U3RvcE1hbmFnZWRQcm9maWxlIiwKKyAgICAgICAgICAgICAgICBtUHJpbWFyeVVzZXJJZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENhbm5vdExvZ291dE1hbmFnZWRQcm9maWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghbUhhc0ZlYXR1cmUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpbnQgcHJvZmlsZVVzZXJJZCA9IHNldHVwTWFuYWdlZFByb2ZpbGUoQ09NUF9EUENfQVBLLCBDT01QX0RQQ19QS0csIENPTVBfRFBDX0FETUlOKTsKKyAgICAgICAgc2V0U2FtZUFmZmlsaWF0aW9uSWQocHJvZmlsZVVzZXJJZCk7CisKKyAgICAgICAgcnVuRGV2aWNlVGVzdHNBc1VzZXIoCisgICAgICAgICAgICAgICAgQ09NUF9EUENfUEtHLAorICAgICAgICAgICAgICAgIE1BTkFHRU1FTlRfVEVTVCwKKyAgICAgICAgICAgICAgICAidGVzdENhbm5vdExvZ291dE1hbmFnZWRQcm9maWxlIiwKKyAgICAgICAgICAgICAgICBwcm9maWxlVXNlcklkKTsKKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgdmVyaWZ5QmluZERldmljZUFkbWluU2VydmljZUFzVXNlcihpbnQgcHJvZmlsZU93bmVyVXNlcklkKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gSW5zdGFsbGluZyBhIG5vbiBtYW5hZ2luZyBhcHAgKG5laXRoZXIgZGV2aWNlIG93bmVyIG5vciBwcm9maWxlIG93bmVyKS4KICAgICAgICAgaW5zdGFsbEFwcEFzVXNlcihDT01QX0RQQ19BUEsyLCBtUHJpbWFyeVVzZXJJZCk7CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZXBvbGljeS9EZXZpY2VPd25lclRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlcG9saWN5L0RldmljZU93bmVyVGVzdC5qYXZhCmluZGV4IDliNjY2MmQuLjgzZThkZTIgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlcG9saWN5L0RldmljZU93bmVyVGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlcG9saWN5L0RldmljZU93bmVyVGVzdC5qYXZhCkBAIC0xNiwxMCArMTYsMTQgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5jdHMuZGV2aWNlcG9saWN5OwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DZGRUZXN0OworaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLmJ1aWxkLkNvbXBhdGliaWxpdHlCdWlsZEhlbHBlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uOwogCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIC8qKgogICogU2V0IG9mIHRlc3RzIGZvciBEZXZpY2UgT3duZXIgdXNlIGNhc2VzLgpAQCAtNDQsMTggKzQ4LDI5IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdJRklfQ09ORklHX0NSRUFUT1JfQVBLID0gIkN0c1dpZmlDb25maWdDcmVhdG9yLmFwayI7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURNSU5fUkVDRUlWRVJfVEVTVF9DTEFTUyA9Ci0gICAgICAgICAgICBERVZJQ0VfT1dORVJfUEtHICsgIi5CYXNlRGV2aWNlT3duZXJUZXN0JEJhc2ljQWRtaW5SZWNlaXZlciI7CisgICAgICAgICAgICBERVZJQ0VfT1dORVJfUEtHICsgIi5CYXNpY0FkbWluUmVjZWl2ZXIiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERVZJQ0VfT1dORVJfQ09NUE9ORU5UID0gREVWSUNFX09XTkVSX1BLRyArICIvIgogICAgICAgICAgICAgKyBBRE1JTl9SRUNFSVZFUl9URVNUX0NMQVNTOwogCi0gICAgLyoqIFRoZSBlcGhlbWVyYWwgdXNlcnMgYXJlIGltcGxlbWVudGVkIGFuZCBzdXBwb3J0ZWQgb24gdGhlIGRldmljZS4gKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbUhhc0VwaGVtZXJhbFVzZXJGZWF0dXJlOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0FQUF9BUEsgPSAiQ3RzRW1wdHlUZXN0QXBwLmFwayI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQVBQX1BLRyA9ICJhbmRyb2lkLnBhY2thZ2VpbnN0YWxsZXIuZW1wdHl0ZXN0YXBwLmN0cyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQVBQX0xPQ0FUSU9OID0gIi9kYXRhL2xvY2FsL3RtcC9jdHMvcGFja2FnZWluc3RhbGxlci8iOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR19TRUNVUklUWV9MT0dHSU5HX0JBVENIX05VTUJFUiA9ICJiYXRjaE51bWJlciI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFQ1VSSVRZX0VWRU5UU19CQVRDSF9TSVpFID0gMTAwOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR19ORVRXT1JLX0xPR0dJTkdfQkFUQ0hfQ09VTlQgPSAiYmF0Y2hDb3VudCI7CisKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8U3RyaW5nPiBOT19TRVRVUF9XSVpBUkRfUFJPVklTSU9OSU5HX01PREUgPQorICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiRElTQUJMRUQiLCAiRU1VTEFUT1IiKTsKKworICAgIC8qKiBDcmVhdGVBbmRNYW5hZ2VVc2VyIGlzIGF2YWlsYWJsZSBhbmQgYW4gYWRkaXRpb25hbCB1c2VyIGNhbiBiZSBjcmVhdGVkLiAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtSGFzQ3JlYXRlQW5kTWFuYWdlVXNlckZlYXR1cmU7CiAKICAgICAvKioKLSAgICAgKiBFcGhlbWVyYWwgdXNlcnMgYXJlIGltcGxlbWVudGVkLCBidXQgdW5zdXBwb3J0ZWQgb24gdGhlIGRldmljZSAoYmVjYXVzZSBvZiBtaXNzaW5nIHNwbGl0Ci0gICAgICogc3lzdGVtIHVzZXIpLgorICAgICAqIFdoZXRoZXIgU2V0dXAgV2l6YXJkIGlzIGRpc2FibGVkLgogICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBtSGFzRGlzYWJsZWRFcGhlbWVyYWxVc2VyRmVhdHVyZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVNldHVwV2l6YXJkRGlzYWJsZWQ7CiAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewpAQCAtNjksOSArODQsMTAgQEAKICAgICAgICAgICAgICAgICBmYWlsKCJGYWlsZWQgdG8gc2V0IGRldmljZSBvd25lciIpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIG1IYXNFcGhlbWVyYWxVc2VyRmVhdHVyZSA9IG1IYXNGZWF0dXJlICYmIGNhbkNyZWF0ZUFkZGl0aW9uYWxVc2VycygxKSAmJiBoYXNVc2VyU3BsaXQoKTsKLSAgICAgICAgbUhhc0Rpc2FibGVkRXBoZW1lcmFsVXNlckZlYXR1cmUgPQotICAgICAgICAgICAgICAgIG1IYXNGZWF0dXJlICYmIGNhbkNyZWF0ZUFkZGl0aW9uYWxVc2VycygxKSAmJiAhaGFzVXNlclNwbGl0KCk7CisgICAgICAgIG1IYXNDcmVhdGVBbmRNYW5hZ2VVc2VyRmVhdHVyZSA9IG1IYXNGZWF0dXJlICYmIGNhbkNyZWF0ZUFkZGl0aW9uYWxVc2VycygxKQorICAgICAgICAgICAgICAgICYmIGhhc0RldmljZUZlYXR1cmUoImFuZHJvaWQuc29mdHdhcmUubWFuYWdlZF91c2VycyIpOworICAgICAgICBtU2V0dXBXaXphcmREaXNhYmxlZCA9IE5PX1NFVFVQX1dJWkFSRF9QUk9WSVNJT05JTkdfTU9ERS5jb250YWlucygKKyAgICAgICAgICAgICAgICBnZXREZXZpY2UoKS5nZXRQcm9wZXJ0eSgicm8uc2V0dXB3aXphcmQubW9kZSIpKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTkxLDE2ICsxMDcsNiBAQAogICAgICAgICBleGVjdXRlRGV2aWNlT3duZXJUZXN0KCJEZXZpY2VPd25lclNldHVwVGVzdCIpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHRlc3RLZXlNYW5hZ2VtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjaGFuZ2VVc2VyQ3JlZGVudGlhbCgiMTIzNCIsIG51bGwsIG1QcmltYXJ5VXNlcklkKTsKLQotICAgICAgICAgICAgZXhlY3V0ZURldmljZU93bmVyVGVzdCgiS2V5TWFuYWdlbWVudFRlc3QiKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGNoYW5nZVVzZXJDcmVkZW50aWFsKG51bGwsICIxMjM0IiwgbVByaW1hcnlVc2VySWQpOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgcHVibGljIHZvaWQgdGVzdExvY2tTY3JlZW5JbmZvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGV4ZWN1dGVEZXZpY2VPd25lclRlc3QoIkxvY2tTY3JlZW5JbmZvVGVzdCIpOwogICAgIH0KQEAgLTEyNSwxMDkgKzEzMSwyMDAgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8qKiBUcmllcyB0byB0b2dnbGUgdGhlIGZvcmNlLWVwaGVtZXJhbC11c2VycyBvbiBhbmQgY2hlY2tzIGl0IHdhcyByZWFsbHkgc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRGb3JjZUVwaGVtZXJhbFVzZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghbUhhc0VwaGVtZXJhbFVzZXJGZWF0dXJlKSB7CisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUFuZE1hbmFnZVVzZXJfTG93U3RvcmFnZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIW1IYXNDcmVhdGVBbmRNYW5hZ2VVc2VyRmVhdHVyZSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIC8vIFNldCBmb3JjZS1lcGhlbWVyYWwtdXNlcnMgcG9saWN5IGFuZCB2ZXJpZnkgaXQgd2FzIHNldC4KLSAgICAgICAgZXhlY3V0ZURldmljZVRlc3RNZXRob2QoIi5Gb3JjZUVwaGVtZXJhbFVzZXJzVGVzdCIsICJ0ZXN0U2V0Rm9yY2VFcGhlbWVyYWxVc2VycyIpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBGb3JjZSBsb3cgc3RvcmFnZQorICAgICAgICAgICAgZ2V0RGV2aWNlKCkuc2V0U2V0dGluZygiZ2xvYmFsIiwgInN5c19zdG9yYWdlX3RocmVzaG9sZF9wZXJjZW50YWdlIiwgIjEwMCIpOworICAgICAgICAgICAgZ2V0RGV2aWNlKCkuc2V0U2V0dGluZygiZ2xvYmFsIiwgInN5c19zdG9yYWdlX3RocmVzaG9sZF9tYXhfYnl0ZXMiLAorICAgICAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihMb25nLk1BWF9WQUxVRSkpOworCisgICAgICAgICAgICAvLyBUaGUgbmV4dCBjcmVhdGVBbmRNYW5hZ2VVc2VyIHNob3VsZCByZXR1cm4gVVNFUl9PUEVSQVRJT05fRVJST1JfTE9XX1NUT1JBR0UuCisgICAgICAgICAgICBleGVjdXRlRGV2aWNlVGVzdE1ldGhvZCgiLkNyZWF0ZUFuZE1hbmFnZVVzZXJUZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgInRlc3RDcmVhdGVBbmRNYW5hZ2VVc2VyX0xvd1N0b3JhZ2UiKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGdldERldmljZSgpLmV4ZWN1dGVTaGVsbENvbW1hbmQoCisgICAgICAgICAgICAgICAgICAgICJzZXR0aW5ncyBkZWxldGUgZ2xvYmFsIHN5c19zdG9yYWdlX3RocmVzaG9sZF9wZXJjZW50YWdlIik7CisgICAgICAgICAgICBnZXREZXZpY2UoKS5leGVjdXRlU2hlbGxDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICAic2V0dGluZ3MgZGVsZXRlIGdsb2JhbCBzeXNfc3RvcmFnZV90aHJlc2hvbGRfbWF4X2J5dGVzIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlQW5kTWFuYWdlVXNlcl9NYXhVc2VycygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIW1IYXNDcmVhdGVBbmRNYW5hZ2VVc2VyRmVhdHVyZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaW50IG1heFVzZXJzID0gZ2V0RGV2aWNlKCkuZ2V0TWF4TnVtYmVyT2ZVc2Vyc1N1cHBvcnRlZCgpOworICAgICAgICAvLyBQcmltYXJ5IHVzZXIgaXMgYWxyZWFkeSB0aGVyZSwgc28gd2UgY2FuIGNyZWF0ZSB1cCB0byBtYXhVc2VycyAtMS4KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhVc2VycyAtIDE7IGkrKykgeworICAgICAgICAgICAgZXhlY3V0ZURldmljZVRlc3RNZXRob2QoIi5DcmVhdGVBbmRNYW5hZ2VVc2VyVGVzdCIsCisgICAgICAgICAgICAgICAgICAgICJ0ZXN0Q3JlYXRlQW5kTWFuYWdlVXNlciIpOworICAgICAgICB9CisgICAgICAgIC8vIFRoZSBuZXh0IGNyZWF0ZUFuZE1hbmFnZVVzZXIgc2hvdWxkIHJldHVybiBVU0VSX09QRVJBVElPTl9FUlJPUl9NQVhfVVNFUlMuCisgICAgICAgIGV4ZWN1dGVEZXZpY2VUZXN0TWV0aG9kKCIuQ3JlYXRlQW5kTWFuYWdlVXNlclRlc3QiLAorICAgICAgICAgICAgICAgICJ0ZXN0Q3JlYXRlQW5kTWFuYWdlVXNlcl9NYXhVc2VycyIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHRpbmcgZm9yY2UtZXBoZW1lcmFsLXVzZXJzIHBvbGljeSB0byB0cnVlIHdpdGhvdXQgYSBzcGxpdCBzeXN0ZW0gdXNlciBzaG91bGQgZmFpbC4KKyAgICAgKiBUZXN0IGNyZWF0aW5nIGFuIHVzZXIgdXNpbmcgdGhlIERldmljZVBvbGljeU1hbmFnZXIncyBjcmVhdGVBbmRNYW5hZ2VVc2VyLgorICAgICAqIHtAbGluayBhbmRyb2lkLmFwcC5hZG1pbi5EZXZpY2VQb2xpY3lNYW5hZ2VyI2dldFNlY29uZGFyeVVzZXJzfSBpcyB0ZXN0ZWQuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFNldEZvcmNlRXBoZW1lcmFsVXNlcnNGYWlsc1dpdGhvdXRTcGxpdFN5c3RlbVVzZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG1IYXNEaXNhYmxlZEVwaGVtZXJhbFVzZXJGZWF0dXJlKSB7Ci0gICAgICAgICAgICBleGVjdXRlRGV2aWNlVGVzdE1ldGhvZCgiLkZvcmNlRXBoZW1lcmFsVXNlcnNUZXN0IiwgInRlc3RTZXRGb3JjZUVwaGVtZXJhbFVzZXJzRmFpbHMiKTsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlQW5kTWFuYWdlVXNlcl9HZXRTZWNvbmRhcnlVc2VycygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIW1IYXNDcmVhdGVBbmRNYW5hZ2VVc2VyRmVhdHVyZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZXhlY3V0ZURldmljZVRlc3RNZXRob2QoIi5DcmVhdGVBbmRNYW5hZ2VVc2VyVGVzdCIsCisgICAgICAgICAgICAgICAgInRlc3RDcmVhdGVBbmRNYW5hZ2VVc2VyX0dldFNlY29uZGFyeVVzZXJzIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBjcmVhdGluZyBhbiB1c2VyIHVzaW5nIHRoZSBEZXZpY2VQb2xpY3lNYW5hZ2VyJ3MgY3JlYXRlQW5kTWFuYWdlVXNlciBtZXRob2QgYW5kIHN3aXRjaAorICAgICAqIHRvIHRoZSB1c2VyLgorICAgICAqIHtAbGluayBhbmRyb2lkLmFwcC5hZG1pbi5EZXZpY2VQb2xpY3lNYW5hZ2VyI3N3aXRjaFVzZXJ9IGlzIHRlc3RlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlQW5kTWFuYWdlVXNlcl9Td2l0Y2hVc2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghbUhhc0NyZWF0ZUFuZE1hbmFnZVVzZXJGZWF0dXJlIHx8ICFjYW5TdGFydEFkZGl0aW9uYWxVc2VycygxKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZXhlY3V0ZURldmljZVRlc3RNZXRob2QoIi5DcmVhdGVBbmRNYW5hZ2VVc2VyVGVzdCIsCisgICAgICAgICAgICAgICAgInRlc3RDcmVhdGVBbmRNYW5hZ2VVc2VyX1N3aXRjaFVzZXIiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGNyZWF0aW5nIGFuIHVzZXIgdXNpbmcgdGhlIERldmljZVBvbGljeU1hbmFnZXIncyBjcmVhdGVBbmRNYW5hZ2VVc2VyIG1ldGhvZCBhbmQgc3dpdGNoCisgICAgICogdG8gdGhlIHVzZXIgdG8gdGVzdCBzdG9wIHVzZXIgd2hpbGUgdGFyZ2V0IHVzZXIgaXMgaW4gZm9yZWdyb3VuZC4KKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5hcHAuYWRtaW4uRGV2aWNlUG9saWN5TWFuYWdlciNzdG9wVXNlcn0gaXMgdGVzdGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVBbmRNYW5hZ2VVc2VyX0Nhbm5vdFN0b3BDdXJyZW50VXNlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIW1IYXNDcmVhdGVBbmRNYW5hZ2VVc2VyRmVhdHVyZSB8fCAhY2FuU3RhcnRBZGRpdGlvbmFsVXNlcnMoMSkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGV4ZWN1dGVEZXZpY2VUZXN0TWV0aG9kKCIuQ3JlYXRlQW5kTWFuYWdlVXNlclRlc3QiLAorICAgICAgICAgICAgICAgICJ0ZXN0Q3JlYXRlQW5kTWFuYWdlVXNlcl9DYW5ub3RTdG9wQ3VycmVudFVzZXIiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGNyZWF0aW5nIGFuIHVzZXIgdXNpbmcgdGhlIERldmljZVBvbGljeU1hbmFnZXIncyBjcmVhdGVBbmRNYW5hZ2VVc2VyIG1ldGhvZCBhbmQgc3RhcnQKKyAgICAgKiB0aGUgdXNlciBpbiBiYWNrZ3JvdW5kIHRvIHRlc3QgQVBJcyBvbiB0aGF0IHVzZXIuCisgICAgICoge0BsaW5rIGFuZHJvaWQuYXBwLmFkbWluLkRldmljZVBvbGljeU1hbmFnZXIjc3RhcnRVc2VySW5CYWNrZ3JvdW5kfSBpcyB0ZXN0ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUFuZE1hbmFnZVVzZXJfU3RhcnRJbkJhY2tncm91bmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFtSGFzQ3JlYXRlQW5kTWFuYWdlVXNlckZlYXR1cmUgfHwgIWNhblN0YXJ0QWRkaXRpb25hbFVzZXJzKDEpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBleGVjdXRlRGV2aWNlVGVzdE1ldGhvZCgiLkNyZWF0ZUFuZE1hbmFnZVVzZXJUZXN0IiwKKyAgICAgICAgICAgICAgICAidGVzdENyZWF0ZUFuZE1hbmFnZVVzZXJfU3RhcnRJbkJhY2tncm91bmQiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGNyZWF0aW5nIGFuIHVzZXIgdXNpbmcgdGhlIERldmljZVBvbGljeU1hbmFnZXIncyBjcmVhdGVBbmRNYW5hZ2VVc2VyIG1ldGhvZCBhbmQgc3RhcnQKKyAgICAgKiB0aGUgdXNlciBpbiBiYWNrZ3JvdW5kIHRvIHRlc3QgQVBJcyBvbiB0aGF0IHVzZXIuCisgICAgICoge0BsaW5rIGFuZHJvaWQuYXBwLmFkbWluLkRldmljZVBvbGljeU1hbmFnZXIjc3RhcnRVc2VySW5CYWNrZ3JvdW5kfSBpcyB0ZXN0ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUFuZE1hbmFnZVVzZXJfU3RhcnRJbkJhY2tncm91bmRfTWF4UnVubmluZ1VzZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghbUhhc0NyZWF0ZUFuZE1hbmFnZVVzZXJGZWF0dXJlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpbnQgbWF4VXNlcnMgPSBnZXREZXZpY2UoKS5nZXRNYXhOdW1iZXJPZlVzZXJzU3VwcG9ydGVkKCk7CisgICAgICAgIGludCBtYXhSdW5uaW5nVXNlcnMgPSBnZXREZXZpY2UoKS5nZXRNYXhOdW1iZXJPZlJ1bm5pbmdVc2Vyc1N1cHBvcnRlZCgpOworCisgICAgICAgIC8vIFByaW1hcnkgdXNlciBpcyBhbHJlYWR5IHJ1bm5pbmcsIHNvIHdlIGNhbiBjcmVhdGUgYW5kIHN0YXJ0IHVwIHRvIG1pbmltdW0gb2YgYWJvdmUgLSAxLgorICAgICAgICBpbnQgdXNlcnNUb0NyZWF0ZUFuZFN0YXJ0ID0gTWF0aC5taW4obWF4VXNlcnMsIG1heFJ1bm5pbmdVc2VycykgLSAxOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHVzZXJzVG9DcmVhdGVBbmRTdGFydDsgaSsrKSB7CisgICAgICAgICAgICBleGVjdXRlRGV2aWNlVGVzdE1ldGhvZCgiLkNyZWF0ZUFuZE1hbmFnZVVzZXJUZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgInRlc3RDcmVhdGVBbmRNYW5hZ2VVc2VyX1N0YXJ0SW5CYWNrZ3JvdW5kIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAobWF4VXNlcnMgPiBtYXhSdW5uaW5nVXNlcnMpIHsKKyAgICAgICAgICAgIC8vIFRoZSBuZXh0IHN0YXJ0VXNlckluQmFja2dyb3VuZCBzaG91bGQgcmV0dXJuIFVTRVJfT1BFUkFUSU9OX0VSUk9SX01BWF9SVU5OSU5HX1VTRVJTLgorICAgICAgICAgICAgZXhlY3V0ZURldmljZVRlc3RNZXRob2QoIi5DcmVhdGVBbmRNYW5hZ2VVc2VyVGVzdCIsCisgICAgICAgICAgICAgICAgICAgICJ0ZXN0Q3JlYXRlQW5kTWFuYWdlVXNlcl9TdGFydEluQmFja2dyb3VuZF9NYXhSdW5uaW5nVXNlcnMiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRoZSBuZXh0IGNyZWF0ZUFuZE1hbmFnZVVzZXIgc2hvdWxkIHJldHVybiBVU0VSX09QRVJBVElPTl9FUlJPUl9NQVhfVVNFUlMuCisgICAgICAgICAgICBleGVjdXRlRGV2aWNlVGVzdE1ldGhvZCgiLkNyZWF0ZUFuZE1hbmFnZVVzZXJUZXN0IiwgInRlc3RDcmVhdGVBbmRNYW5hZ2VVc2VyX01heFVzZXJzIik7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBbGwgdXNlcnMgKGV4Y2VwdCBvZiB0aGUgc3lzdGVtIHVzZXIpIG11c3QgYmUgcmVtb3ZlZCBhZnRlciB0b2dnbGluZyB0aGUKLSAgICAgKiBmb3JjZS1lcGhlbWVyYWwtdXNlcnMgcG9saWN5IHRvIHRydWUuCi0gICAgICoKLSAgICAgKiA8cD5JZiB0aGUgY3VycmVudCB1c2VyIGlzIHRoZSBzeXN0ZW0gdXNlciwgdGhlIG90aGVyIHVzZXJzIGFyZSByZW1vdmVkIHN0cmFpZ2h0IGF3YXkuCisgICAgICogVGVzdCBjcmVhdGluZyBhbiB1c2VyIHVzaW5nIHRoZSBEZXZpY2VQb2xpY3lNYW5hZ2VyJ3MgY3JlYXRlQW5kTWFuYWdlVXNlciBtZXRob2QgYW5kIHN0YXJ0CisgICAgICogdGhlIHVzZXIgaW4gYmFja2dyb3VuZCB0byB0ZXN0IEFQSXMgb24gdGhhdCB1c2VyLgorICAgICAqIHtAbGluayBhbmRyb2lkLmFwcC5hZG1pbi5EZXZpY2VQb2xpY3lNYW5hZ2VyI3N0b3BVc2VyfSBpcyB0ZXN0ZWQuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZVVzZXJzT25TZXRGb3JjZUVwaGVtZXJhbFVzZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghbUhhc0VwaGVtZXJhbFVzZXJGZWF0dXJlKSB7CisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUFuZE1hbmFnZVVzZXJfU3RvcFVzZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFtSGFzQ3JlYXRlQW5kTWFuYWdlVXNlckZlYXR1cmUgfHwgIWNhblN0YXJ0QWRkaXRpb25hbFVzZXJzKDEpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICAvLyBDcmVhdGUgYSB1c2VyLgotICAgICAgICBpbnQgdXNlcklkID0gY3JlYXRlVXNlcigpOwotICAgICAgICBhc3NlcnRUcnVlKCJVc2VyIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQiLCBsaXN0VXNlcnMoKS5jb250YWlucyh1c2VySWQpKTsKLQotICAgICAgICAvLyBTZXQgZm9yY2UtZXBoZW1lcmFsLXVzZXJzIHBvbGljeSBhbmQgdmVyaWZ5IGl0IHdhcyBzZXQuCi0gICAgICAgIGV4ZWN1dGVEZXZpY2VUZXN0TWV0aG9kKCIuRm9yY2VFcGhlbWVyYWxVc2Vyc1Rlc3QiLCAidGVzdFNldEZvcmNlRXBoZW1lcmFsVXNlcnMiKTsKLQotICAgICAgICAvLyBVc2VycyBoYXZlIHRvIGJlIHJlbW92ZWQgd2hlbiBmb3JjZS1lcGhlbWVyYWwtdXNlcnMgaXMgdG9nZ2xlZCBvbi4KLSAgICAgICAgYXNzZXJ0RmFsc2UoIlVzZXIgbXVzdCBoYXZlIGJlZW4gcmVtb3ZlZCIsIGxpc3RVc2VycygpLmNvbnRhaW5zKHVzZXJJZCkpOworICAgICAgICBleGVjdXRlRGV2aWNlVGVzdE1ldGhvZCgiLkNyZWF0ZUFuZE1hbmFnZVVzZXJUZXN0IiwKKyAgICAgICAgICAgICAgICAidGVzdENyZWF0ZUFuZE1hbmFnZVVzZXJfU3RvcFVzZXIiKTsKKyAgICAgICAgYXNzZXJ0TmV3VXNlclN0b3BwZWQoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBbGwgdXNlcnMgKGV4Y2VwdCBvZiB0aGUgc3lzdGVtIHVzZXIpIG11c3QgYmUgcmVtb3ZlZCBhZnRlciB0b2dnbGluZyB0aGUKLSAgICAgKiBmb3JjZS1lcGhlbWVyYWwtdXNlcnMgcG9saWN5IHRvIHRydWUuCi0gICAgICoKLSAgICAgKiA8cD5JZiB0aGUgY3VycmVudCB1c2VyIGlzIG5vdCB0aGUgc3lzdGVtIHVzZXIsIHN3aXRjaGluZyB0byB0aGUgc3lzdGVtIHVzZXIgc2hvdWxkIGhhcHBlbgotICAgICAqIGJlZm9yZSBhbGwgb3RoZXIgdXNlcnMgYXJlIHJlbW92ZWQuCisgICAgICogVGVzdCBjcmVhdGluZyBhbiBlcGhlbWVyYWwgdXNlciB1c2luZyB0aGUgRGV2aWNlUG9saWN5TWFuYWdlcidzIGNyZWF0ZUFuZE1hbmFnZVVzZXIgbWV0aG9kCisgICAgICogYW5kIHN0YXJ0IHRoZSB1c2VyIGluIGJhY2tncm91bmQsIHVzZXIgaXMgdGhlbiBzdG9wcGVkLiBUaGUgdXNlciBzaG91bGQgYmUgcmVtb3ZlZAorICAgICAqIGF1dG9tYXRpY2FsbHkgZXZlbiB3aGVuIERJU0FMTE9XX1JFTU9WRV9VU0VSIGlzIHNldC4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlVXNlcnNPblNldEZvcmNlRXBoZW1lcmFsVXNlcnNXaXRoVXNlclN3aXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIW1IYXNFcGhlbWVyYWxVc2VyRmVhdHVyZSkgeworICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVBbmRNYW5hZ2VVc2VyX1N0b3BFcGhlbWVyYWxVc2VyX0Rpc2FsbG93UmVtb3ZlVXNlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIW1IYXNDcmVhdGVBbmRNYW5hZ2VVc2VyRmVhdHVyZSB8fCAhY2FuU3RhcnRBZGRpdGlvbmFsVXNlcnMoMSkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIC8vIENyZWF0ZSBhIHVzZXIuCi0gICAgICAgIGludCB1c2VySWQgPSBjcmVhdGVVc2VyKCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlVzZXIgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCIsIGxpc3RVc2VycygpLmNvbnRhaW5zKHVzZXJJZCkpOwotCi0gICAgICAgIC8vIFN3aXRjaCB0byB0aGUgbmV3IChub24tc3lzdGVtKSB1c2VyLgotICAgICAgICBzd2l0Y2hVc2VyKHVzZXJJZCk7Ci0KLSAgICAgICAgLy8gU2V0IGZvcmNlLWVwaGVtZXJhbC11c2VycyBwb2xpY3kgYW5kIHZlcmlmeSBpdCB3YXMgc2V0LgotICAgICAgICBleGVjdXRlRGV2aWNlVGVzdE1ldGhvZCgiLkZvcmNlRXBoZW1lcmFsVXNlcnNUZXN0IiwgInRlc3RTZXRGb3JjZUVwaGVtZXJhbFVzZXJzIik7Ci0KLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSB1c2VyIGhhcyBiZWVuIHJlbW92ZWQuIEFzIGl0IGlzIG5vdCBhIHN5bmNocm9ub3VzIG9wZXJhdGlvbiAtIHN3aXRjaGluZyB0bwotICAgICAgICAvLyB0aGUgc3lzdGVtIHVzZXIgbXVzdCBoYXBwZW4gZmlyc3QgLSBnaXZlIHRoZSBzeXN0ZW0gYSBsaXR0bGUgYml0IG9mIHRpbWUgZm9yIGZpbmlzaGluZwotICAgICAgICAvLyBpdC4KLSAgICAgICAgZmluYWwgaW50IHNsZWVwTXMgPSA1MDA7Ci0gICAgICAgIGZpbmFsIGludCBtYXhTbGVlcE1zID0gMTAwMDA7Ci0gICAgICAgIGZvciAoaW50IHRvdGFsU2xlcHRNcyA9IDA7IHRvdGFsU2xlcHRNcyA8IG1heFNsZWVwTXM7IHRvdGFsU2xlcHRNcyArPSBzbGVlcE1zKSB7Ci0gICAgICAgICAgICAvLyBXYWl0IGEgbGl0dGxlIHdoaWxlIGZvciB0aGUgdXNlcidzIHJlbW92YWwuCi0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoc2xlZXBNcyk7Ci0KLSAgICAgICAgICAgIGlmICghbGlzdFVzZXJzKCkuY29udGFpbnModXNlcklkKSkgewotICAgICAgICAgICAgICAgIC8vIFN1Y2Nlc3MgLSB0aGUgdXNlciBoYXMgYmVlbiByZW1vdmVkLgotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRoZSB1c2VyIGhhc24ndCBiZWVuIHJlbW92ZWQgd2l0aGluIHRoZSBnaXZlbiB0aW1lLgotICAgICAgICBmYWlsKCJVc2VyIG11c3QgaGF2ZSBiZWVuIHJlbW92ZWQiKTsKLSAgICB9Ci0KLSAgICAvKiogVGhlIHVzZXJzIGNyZWF0ZWQgYWZ0ZXIgc2V0dGluZyBmb3JjZS1lcGhlbWVyYWwtdXNlcnMgcG9saWN5IHRvIHRydWUgbXVzdCBiZSBlcGhlbWVyYWwuICovCi0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVVzZXJBZnRlclNldEZvcmNlRXBoZW1lcmFsVXNlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFtSGFzRXBoZW1lcmFsVXNlckZlYXR1cmUpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNldCBmb3JjZS1lcGhlbWVyYWwtdXNlcnMgcG9saWN5IGFuZCB2ZXJpZnkgaXQgd2FzIHNldC4KLSAgICAgICAgZXhlY3V0ZURldmljZVRlc3RNZXRob2QoIi5Gb3JjZUVwaGVtZXJhbFVzZXJzVGVzdCIsICJ0ZXN0U2V0Rm9yY2VFcGhlbWVyYWxVc2VycyIpOwotCi0gICAgICAgIGludCB1c2VySWQgPSBjcmVhdGVVc2VyKCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlVzZXIgbXVzdCBiZSBlcGhlbWVyYWwiLCAwICE9IChnZXRVc2VyRmxhZ3ModXNlcklkKSAmIEZMQUdfRVBIRU1FUkFMKSk7CisgICAgICAgIGV4ZWN1dGVEZXZpY2VUZXN0TWV0aG9kKCIuQ3JlYXRlQW5kTWFuYWdlVXNlclRlc3QiLAorICAgICAgICAgICAgICAgICJ0ZXN0Q3JlYXRlQW5kTWFuYWdlVXNlcl9TdG9wRXBoZW1lcmFsVXNlcl9EaXNhbGxvd1JlbW92ZVVzZXIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGdldFVzZXJzQ3JlYXRlZEJ5VGVzdHMoKS5zaXplKCkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRlc3QgY3JlYXRpbmcgYW4gZXBlaGVtZXJhbCB1c2VyIHVzaW5nIHRoZSBEZXZpY2VQb2xpY3lNYW5hZ2VyJ3MgY3JlYXRlQW5kTWFuYWdlVXNlciBtZXRob2QuCisgICAgICogVGVzdCBjcmVhdGluZyBhbiB1c2VyIHVzaW5nIHRoZSBEZXZpY2VQb2xpY3lNYW5hZ2VyJ3MgY3JlYXRlQW5kTWFuYWdlVXNlciBtZXRob2QsIGFmZmlsaWF0ZQorICAgICAqIHRoZSB1c2VyIGFuZCBzdGFydCB0aGUgdXNlciBpbiBiYWNrZ3JvdW5kIHRvIHRlc3QgQVBJcyBvbiB0aGF0IHVzZXIuCisgICAgICoge0BsaW5rIGFuZHJvaWQuYXBwLmFkbWluLkRldmljZVBvbGljeU1hbmFnZXIjbG9nb3V0VXNlcn0gaXMgdGVzdGVkLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVBbmRNYW5hZ2VFcGhlbWVyYWxVc2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghbUhhc0VwaGVtZXJhbFVzZXJGZWF0dXJlKSB7CisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUFuZE1hbmFnZVVzZXJfTG9nb3V0VXNlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIW1IYXNDcmVhdGVBbmRNYW5hZ2VVc2VyRmVhdHVyZSB8fCAhY2FuU3RhcnRBZGRpdGlvbmFsVXNlcnMoMSkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIGV4ZWN1dGVEZXZpY2VUZXN0TWV0aG9kKCIuQ3JlYXRlQW5kTWFuYWdlVXNlclRlc3QiLCAidGVzdENyZWF0ZUFuZE1hbmFnZUVwaGVtZXJhbFVzZXIiKTsKKyAgICAgICAgZXhlY3V0ZURldmljZVRlc3RNZXRob2QoIi5DcmVhdGVBbmRNYW5hZ2VVc2VyVGVzdCIsCisgICAgICAgICAgICAgICAgInRlc3RDcmVhdGVBbmRNYW5hZ2VVc2VyX0xvZ291dFVzZXIiKTsKKyAgICAgICAgYXNzZXJ0TmV3VXNlclN0b3BwZWQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGNyZWF0aW5nIGFuIHVzZXIgdXNpbmcgdGhlIERldmljZVBvbGljeU1hbmFnZXIncyBjcmVhdGVBbmRNYW5hZ2VVc2VyIG1ldGhvZCwgYWZmaWxpYXRlCisgICAgICogdGhlIHVzZXIgYW5kIHN0YXJ0IHRoZSB1c2VyIGluIGJhY2tncm91bmQgdG8gdGVzdCBBUElzIG9uIHRoYXQgdXNlci4KKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5hcHAuYWRtaW4uRGV2aWNlUG9saWN5TWFuYWdlciNpc0FmZmlsaWF0ZWRVc2VyfSBpcyB0ZXN0ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUFuZE1hbmFnZVVzZXJfQWZmaWxpYXRlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIW1IYXNDcmVhdGVBbmRNYW5hZ2VVc2VyRmVhdHVyZSB8fCAhY2FuU3RhcnRBZGRpdGlvbmFsVXNlcnMoMSkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGV4ZWN1dGVEZXZpY2VUZXN0TWV0aG9kKCIuQ3JlYXRlQW5kTWFuYWdlVXNlclRlc3QiLAorICAgICAgICAgICAgICAgICJ0ZXN0Q3JlYXRlQW5kTWFuYWdlVXNlcl9BZmZpbGlhdGVkIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBjcmVhdGluZyBhbiBlcGhlbWVyYWwgdXNlciB1c2luZyB0aGUgRGV2aWNlUG9saWN5TWFuYWdlcidzIGNyZWF0ZUFuZE1hbmFnZVVzZXIgbWV0aG9kLAorICAgICAqIGFmZmlsaWF0ZSB0aGUgdXNlciBhbmQgc3RhcnQgdGhlIHVzZXIgaW4gYmFja2dyb3VuZCB0byB0ZXN0IEFQSXMgb24gdGhhdCB1c2VyLgorICAgICAqIHtAbGluayBhbmRyb2lkLmFwcC5hZG1pbi5EZXZpY2VQb2xpY3lNYW5hZ2VyI2lzRXBoZW1lcmFsVXNlcn0gaXMgdGVzdGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVBbmRNYW5hZ2VVc2VyX0VwaGVtZXJhbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIW1IYXNDcmVhdGVBbmRNYW5hZ2VVc2VyRmVhdHVyZSB8fCAhY2FuU3RhcnRBZGRpdGlvbmFsVXNlcnMoMSkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGV4ZWN1dGVEZXZpY2VUZXN0TWV0aG9kKCIuQ3JlYXRlQW5kTWFuYWdlVXNlclRlc3QiLAorICAgICAgICAgICAgICAgICJ0ZXN0Q3JlYXRlQW5kTWFuYWdlVXNlcl9FcGhlbWVyYWwiKTsKIAogICAgICAgICBMaXN0PEludGVnZXI+IG5ld1VzZXJzID0gZ2V0VXNlcnNDcmVhdGVkQnlUZXN0cygpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbmV3VXNlcnMuc2l6ZSgpKTsKQEAgLTIzOSw1MiArMzM2LDYzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGVzdCB0aGF0IGNyZWF0aW5nIGFuIGVwZWhlbWVyYWwgdXNlciB1c2luZyB0aGUgRGV2aWNlUG9saWN5TWFuYWdlcidzIGNyZWF0ZUFuZE1hbmFnZVVzZXIKLSAgICAgKiBtZXRob2QgZmFpbHMgb24gc3lzdGVtcyB3aXRob3V0IHRoZSBzcGxpdCBzeXN0ZW0gdXNlci4KKyAgICAgKiBUZXN0IGNyZWF0aW5nIGFuIHVzZXIgdXNpbmcgdGhlIERldmljZVBvbGljeU1hbmFnZXIncyBjcmVhdGVBbmRNYW5hZ2VVc2VyIG1ldGhvZCwgYWZmaWxpYXRlCisgICAgICogdGhlIHVzZXIgYW5kIHN0YXJ0IHRoZSB1c2VyIGluIGJhY2tncm91bmQgdG8gdGVzdCBBUElzIG9uIHRoYXQgdXNlci4KKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5hcHAuYWRtaW4uRGV2aWNlUG9saWN5TWFuYWdlciNMRUFWRV9BTExfU1lTVEVNX0FQUFNfRU5BQkxFRH0gaXMgdGVzdGVkLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVBbmRNYW5hZ2VFcGhlbWVyYWxVc2VyRmFpbHNXaXRob3V0U3BsaXRTeXN0ZW1Vc2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChtSGFzRGlzYWJsZWRFcGhlbWVyYWxVc2VyRmVhdHVyZSkgewotICAgICAgICAgICAgZXhlY3V0ZURldmljZVRlc3RNZXRob2QoCi0gICAgICAgICAgICAgICAgICAgICIuQ3JlYXRlQW5kTWFuYWdlVXNlclRlc3QiLCAidGVzdENyZWF0ZUFuZE1hbmFnZUVwaGVtZXJhbFVzZXJGYWlscyIpOworICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVBbmRNYW5hZ2VVc2VyX0xlYXZlQWxsU3lzdGVtQXBwcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIW1IYXNDcmVhdGVBbmRNYW5hZ2VVc2VyRmVhdHVyZSB8fCAhY2FuU3RhcnRBZGRpdGlvbmFsVXNlcnMoMSkpIHsKKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQorCisgICAgICAgIGV4ZWN1dGVEZXZpY2VUZXN0TWV0aG9kKCIuQ3JlYXRlQW5kTWFuYWdlVXNlclRlc3QiLAorICAgICAgICAgICAgICAgICJ0ZXN0Q3JlYXRlQW5kTWFuYWdlVXNlcl9MZWF2ZUFsbFN5c3RlbUFwcHMiKTsKICAgICB9CiAKLS8vIERpc2FibGVkIGR1ZSB0byBiLzI5MDcyNzI4Ci0vLyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlQW5kTWFuYWdlVXNlcl9Ta2lwU2V0dXBXaXphcmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vICAgICAgICBpZiAobUhhc0NyZWF0ZUFuZE1hbmFnZVVzZXJGZWF0dXJlKSB7Ci0vLyAgICAgICAgICAgIGV4ZWN1dGVEZXZpY2VUZXN0TWV0aG9kKCIuQ3JlYXRlQW5kTWFuYWdlVXNlclRlc3QiLAotLy8gICAgICAgICAgICAgICAgInRlc3RDcmVhdGVBbmRNYW5hZ2VVc2VyX1NraXBTZXR1cFdpemFyZCIpOwotLy8gICAgICAgIH0KLS8vICAgIH0KLS8vCi0vLyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlQW5kTWFuYWdlVXNlcl9Eb250U2tpcFNldHVwV2l6YXJkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLyAgICAgICAgaWYgKG1IYXNDcmVhdGVBbmRNYW5hZ2VVc2VyRmVhdHVyZSkgewotLy8gICAgICAgICAgICBleGVjdXRlRGV2aWNlVGVzdE1ldGhvZCgiLkNyZWF0ZUFuZE1hbmFnZVVzZXJUZXN0IiwKLS8vICAgICAgICAgICAgICAgICJ0ZXN0Q3JlYXRlQW5kTWFuYWdlVXNlcl9Eb250U2tpcFNldHVwV2l6YXJkIik7Ci0vLyAgICAgICAgfQotLy8gICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVBbmRNYW5hZ2VVc2VyX1NraXBTZXR1cFdpemFyZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAobVNldHVwV2l6YXJkRGlzYWJsZWQgfHwgIW1IYXNDcmVhdGVBbmRNYW5hZ2VVc2VyRmVhdHVyZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGV4ZWN1dGVEZXZpY2VUZXN0TWV0aG9kKCIuQ3JlYXRlQW5kTWFuYWdlVXNlclRlc3QiLAorICAgICAgICAgICAgICAgICJ0ZXN0Q3JlYXRlQW5kTWFuYWdlVXNlcl9Ta2lwU2V0dXBXaXphcmQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlQW5kTWFuYWdlVXNlcl9Eb250U2tpcFNldHVwV2l6YXJkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChtU2V0dXBXaXphcmREaXNhYmxlZCB8fCAhbUhhc0NyZWF0ZUFuZE1hbmFnZVVzZXJGZWF0dXJlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZXhlY3V0ZURldmljZVRlc3RNZXRob2QoIi5DcmVhdGVBbmRNYW5hZ2VVc2VyVGVzdCIsCisgICAgICAgICAgICAgICAgInRlc3RDcmVhdGVBbmRNYW5hZ2VVc2VyX0RvbnRTa2lwU2V0dXBXaXphcmQiKTsKKyAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlQW5kTWFuYWdlVXNlcl9BZGRSZXN0cmljdGlvblNldCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAobUhhc0ZlYXR1cmUgJiYgY2FuQ3JlYXRlQWRkaXRpb25hbFVzZXJzKDEpKSB7CisgICAgICAgIGlmIChtSGFzQ3JlYXRlQW5kTWFuYWdlVXNlckZlYXR1cmUpIHsKICAgICAgICAgICAgIGV4ZWN1dGVEZXZpY2VUZXN0TWV0aG9kKCIuQ3JlYXRlQW5kTWFuYWdlVXNlclRlc3QiLAotICAgICAgICAgICAgICAgICJ0ZXN0Q3JlYXRlQW5kTWFuYWdlVXNlcl9BZGRSZXN0cmljdGlvblNldCIpOworICAgICAgICAgICAgICAgICAgICAidGVzdENyZWF0ZUFuZE1hbmFnZVVzZXJfQWRkUmVzdHJpY3Rpb25TZXQiKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVBbmRNYW5hZ2VVc2VyX1JlbW92ZVJlc3RyaWN0aW9uU2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChtSGFzRmVhdHVyZSAmJiBjYW5DcmVhdGVBZGRpdGlvbmFsVXNlcnMoMSkpIHsKKyAgICAgICAgaWYgKG1IYXNDcmVhdGVBbmRNYW5hZ2VVc2VyRmVhdHVyZSkgewogICAgICAgICAgICAgZXhlY3V0ZURldmljZVRlc3RNZXRob2QoIi5DcmVhdGVBbmRNYW5hZ2VVc2VyVGVzdCIsCi0gICAgICAgICAgICAgICAgInRlc3RDcmVhdGVBbmRNYW5hZ2VVc2VyX1JlbW92ZVJlc3RyaWN0aW9uU2V0Iik7CisgICAgICAgICAgICAgICAgICAgICJ0ZXN0Q3JlYXRlQW5kTWFuYWdlVXNlcl9SZW1vdmVSZXN0cmljdGlvblNldCIpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdFVzZXJBZGRlZE9yUmVtb3ZlZEJyb2FkY2FzdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG1IYXNGZWF0dXJlICYmIGNhbkNyZWF0ZUFkZGl0aW9uYWxVc2VycygxKSkgeworICAgICAgICBpZiAobUhhc0NyZWF0ZUFuZE1hbmFnZVVzZXJGZWF0dXJlKSB7CiAgICAgICAgICAgICBleGVjdXRlRGV2aWNlVGVzdE1ldGhvZCgiLkNyZWF0ZUFuZE1hbmFnZVVzZXJUZXN0IiwKLSAgICAgICAgICAgICAgICAidGVzdFVzZXJBZGRlZE9yUmVtb3ZlZEJyb2FkY2FzdHMiKTsKKyAgICAgICAgICAgICAgICAgICAgInRlc3RVc2VyQWRkZWRPclJlbW92ZWRCcm9hZGNhc3RzIik7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXNlclNlc3Npb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFtSGFzRmVhdHVyZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGV4ZWN1dGVEZXZpY2VPd25lclRlc3QoIlVzZXJTZXNzaW9uVGVzdCIpOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHRlc3RTZWN1cml0eUxvZ2dpbmdXaXRoVHdvVXNlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFtSGFzRmVhdHVyZSB8fCAhY2FuQ3JlYXRlQWRkaXRpb25hbFVzZXJzKDEpKSB7CiAgICAgICAgICAgICByZXR1cm47CkBAIC0zMDksMTkgKzQxNyw0OCBAQAogICAgICAgICBpZiAoIW1IYXNGZWF0dXJlKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgZXhlY3V0ZURldmljZVRlc3RNZXRob2QoIi5TZWN1cml0eUxvZ2dpbmdUZXN0IiwKLSAgICAgICAgICAgICAgICAidGVzdFJldHJpZXZpbmdTZWN1cml0eUxvZ3NOb3RQb3NzaWJsZUltbWVkaWF0ZWx5QWZ0ZXJQcmV2aW91c1N1Y2Nlc3NmdWxSZXRyaWV2YWwiKTsKKyAgICAgICAgLy8gQmFja3VwIHN0YXkgYXdha2Ugc2V0dGluZyBiZWNhdXNlIHRlc3RHZW5lcmF0ZUxvZ3MoKSB3aWxsIHR1cm4gaXQgb2ZmLgorICAgICAgICBmaW5hbCBTdHJpbmcgc3RheUF3YWtlID0gZ2V0RGV2aWNlKCkuZ2V0U2V0dGluZygiZ2xvYmFsIiwgInN0YXlfb25fd2hpbGVfcGx1Z2dlZF9pbiIpOwogICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gVHVybiBsb2dnaW5nIG9uLgogICAgICAgICAgICAgZXhlY3V0ZURldmljZVRlc3RNZXRob2QoIi5TZWN1cml0eUxvZ2dpbmdUZXN0IiwgInRlc3RFbmFibGluZ1NlY3VyaXR5TG9nZ2luZyIpOworICAgICAgICAgICAgLy8gUmVib290IHRvIGVuc3VyZSByby5kZXZpY2Vfb3duZXIgaXMgc2V0IHRvIHRydWUgaW4gbG9nZCBhbmQgbG9nZ2luZyBpcyBvbi4KICAgICAgICAgICAgIHJlYm9vdEFuZFdhaXRVbnRpbFJlYWR5KCk7Ci0gICAgICAgICAgICAvLyBTbGVlcCBmb3IgfjEgbWludXRlIHNvIHRoYXQgU2VjdXJpdHlMb2dNb25pdG9yIGZldGNoZXMgdGhlIHNlY3VyaXR5IGV2ZW50cy4gVGhpcyBpcwotICAgICAgICAgICAgLy8gYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsIHdlIHNob3VsZG4ndCByZWx5IG9uIGJ1dCB0aGVyZSBpcyBubyBvdGhlciB3YXkgdG8gZG8gaXQKLSAgICAgICAgICAgIC8vIGN1cnJlbnRseS4KLSAgICAgICAgICAgIFRocmVhZC5zbGVlcChUaW1lVW5pdC5TRUNPTkRTLnRvTWlsbGlzKDcwKSk7Ci0gICAgICAgICAgICBleGVjdXRlRGV2aWNlVGVzdE1ldGhvZCgiLlNlY3VyaXR5TG9nZ2luZ1Rlc3QiLCAidGVzdEdldFNlY3VyaXR5TG9ncyIpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgLy8gQWx3YXlzIGF0dGVtcHQgdG8gZGlzYWJsZSBzZWN1cml0eSBsb2dnaW5nIHRvIGJyaW5nIHRoZSBkZXZpY2UgdG8gaW5pdGlhbCBzdGF0ZS4KKworICAgICAgICAgICAgLy8gR2VuZXJhdGUgdmFyaW91cyB0eXBlcyBvZiBldmVudHMgb24gZGV2aWNlIHNpZGUgYW5kIGNoZWNrIHRoYXQgdGhleSBhcmUgbG9nZ2VkLgorICAgICAgICAgICAgZXhlY3V0ZURldmljZVRlc3RNZXRob2QoIi5TZWN1cml0eUxvZ2dpbmdUZXN0IiwgInRlc3RHZW5lcmF0ZUxvZ3MiKTsKKyAgICAgICAgICAgIGdldERldmljZSgpLmV4ZWN1dGVTaGVsbENvbW1hbmQoImRwbSBmb3JjZS1zZWN1cml0eS1sb2dzIik7CisgICAgICAgICAgICBleGVjdXRlRGV2aWNlVGVzdE1ldGhvZCgiLlNlY3VyaXR5TG9nZ2luZ1Rlc3QiLCAidGVzdFZlcmlmeUdlbmVyYXRlZExvZ3MiKTsKKworICAgICAgICAgICAgLy8gUmVib290IHRoZSBkZXZpY2UsIHNvIHRoZSBzZWN1cml0eSBldmVudCBpZHMgYXJlIHJlc2V0LgorICAgICAgICAgICAgcmVib290QW5kV2FpdFVudGlsUmVhZHkoKTsKKworICAgICAgICAgICAgLy8gVmVyaWZ5IGV2ZW50IGlkcyBhcmUgY29uc2lzdGVudCBhY3Jvc3MgYSBjb25zZWN1dGl2ZSBiYXRjaC4KKyAgICAgICAgICAgIGZvciAoaW50IGJhdGNoTnVtYmVyID0gMDsgYmF0Y2hOdW1iZXIgPCAzOyBiYXRjaE51bWJlcisrKSB7CisgICAgICAgICAgICAgICAgZ2VuZXJhdGVEdW1teVNlY3VyaXR5TG9ncygpOworICAgICAgICAgICAgICAgIGdldERldmljZSgpLmV4ZWN1dGVTaGVsbENvbW1hbmQoImRwbSBmb3JjZS1zZWN1cml0eS1sb2dzIik7CisgICAgICAgICAgICAgICAgZXhlY3V0ZURldmljZVRlc3RNZXRob2QoIi5TZWN1cml0eUxvZ2dpbmdUZXN0IiwgInRlc3RWZXJpZnlMb2dJZHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc2luZ2xldG9uTWFwKEFSR19TRUNVUklUWV9MT0dHSU5HX0JBVENIX05VTUJFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhiYXRjaE51bWJlcikpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSW1tZWRpYXRlbHkgYXR0ZW1wdGluZyB0byBmZXRjaCBldmVudHMgYWdhaW4gc2hvdWxkIGZhaWwuCisgICAgICAgICAgICBleGVjdXRlRGV2aWNlVGVzdE1ldGhvZCgiLlNlY3VyaXR5TG9nZ2luZ1Rlc3QiLAorICAgICAgICAgICAgICAgICAgICAidGVzdFNlY3VyaXR5TG9nZ2luZ1JldHJpZXZhbFJhdGVMaW1pdGVkIik7CisgICAgICAgICAgICAvLyBUdXJuIGxvZ2dpbmcgb2ZmLgogICAgICAgICAgICAgZXhlY3V0ZURldmljZVRlc3RNZXRob2QoIi5TZWN1cml0eUxvZ2dpbmdUZXN0IiwgInRlc3REaXNhYmxpbmdTZWN1cml0eUxvZ2dpbmciKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIC8vIFJlc3RvcmUgc3RheSBhd2FrZSBzZXR0aW5nLgorICAgICAgICAgICAgaWYgKHN0YXlBd2FrZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZ2V0RGV2aWNlKCkuc2V0U2V0dGluZygiZ2xvYmFsIiwgInN0YXlfb25fd2hpbGVfcGx1Z2dlZF9pbiIsIHN0YXlBd2FrZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVEdW1teVNlY3VyaXR5TG9ncygpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24geworICAgICAgICAvLyBUcmlnZ2VyIHNlY3VyaXR5IGV2ZW50cyBvZiB0eXBlIFRBR19BREJfU0hFTExfQ01ELgorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNFQ1VSSVRZX0VWRU5UU19CQVRDSF9TSVpFOyBpKyspIHsKKyAgICAgICAgICAgIGdldERldmljZSgpLmV4ZWN1dGVTaGVsbENvbW1hbmQoImVjaG8ganVzdF90ZXN0aW5nXyIgKyBpKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzQ1LDExICs0ODIsMzYgQEAKICAgICAgICAgaWYgKCFtSGFzRmVhdHVyZSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0KICAgICAgICAgZXhlY3V0ZURldmljZVRlc3RNZXRob2QoIi5OZXR3b3JrTG9nZ2luZ1Rlc3QiLCAidGVzdFByb3ZpZGluZ1dyb25nQmF0Y2hUb2tlblJldHVybnNOdWxsIik7Ci0gICAgICAgIGV4ZWN1dGVEZXZpY2VUZXN0TWV0aG9kKCIuTmV0d29ya0xvZ2dpbmdUZXN0IiwgInRlc3ROZXR3b3JrTG9nZ2luZ0FuZFJldHJpZXZhbCIpOworICAgICAgICBleGVjdXRlRGV2aWNlVGVzdE1ldGhvZCgiLk5ldHdvcmtMb2dnaW5nVGVzdCIsICJ0ZXN0TmV0d29ya0xvZ2dpbmdBbmRSZXRyaWV2YWwiLAorICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLnNpbmdsZXRvbk1hcChBUkdfTkVUV09SS19MT0dHSU5HX0JBVENIX0NPVU5ULCBJbnRlZ2VyLnRvU3RyaW5nKDEpKSk7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgdGVzdE5ldHdvcmtMb2dnaW5nX211bHRpcGxlQmF0Y2hlcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIW1IYXNGZWF0dXJlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZXhlY3V0ZURldmljZVRlc3RNZXRob2QoIi5OZXR3b3JrTG9nZ2luZ1Rlc3QiLCAidGVzdE5ldHdvcmtMb2dnaW5nQW5kUmV0cmlldmFsIiwKKyAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zaW5nbGV0b25NYXAoQVJHX05FVFdPUktfTE9HR0lOR19CQVRDSF9DT1VOVCwgSW50ZWdlci50b1N0cmluZygyKSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROZXR3b3JrTG9nZ2luZ19yZWJvb3RSZXNldHNJZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIW1IYXNGZWF0dXJlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gRmlyc3QgYmF0Y2g6IHJldHJpZXZlIGFuZCB2ZXJpZnkgdGhlIGV2ZW50cy4KKyAgICAgICAgZXhlY3V0ZURldmljZVRlc3RNZXRob2QoIi5OZXR3b3JrTG9nZ2luZ1Rlc3QiLCAidGVzdE5ldHdvcmtMb2dnaW5nQW5kUmV0cmlldmFsIiwKKyAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zaW5nbGV0b25NYXAoQVJHX05FVFdPUktfTE9HR0lOR19CQVRDSF9DT1VOVCwgSW50ZWdlci50b1N0cmluZygxKSkpOworICAgICAgICAvLyBSZWJvb3QgdGhlIGRldmljZSwgc28gdGhlIHNlY3VyaXR5IGV2ZW50IElEcyBhcmUgcmUtc2V0LgorICAgICAgICByZWJvb3RBbmRXYWl0VW50aWxSZWFkeSgpOworICAgICAgICAvLyBNYWtlIHN1cmUgQk9PVF9DT01QTEVURUQgaXMgY29tcGxldGVkIGJlZm9yZSBwcm9jZWVkaW5nLgorICAgICAgICB3YWl0Rm9yQnJvYWRjYXN0SWRsZSgpOworICAgICAgICAvLyBGaXJzdCBiYXRjaCBhZnRlciByZWJvb3Q6IHJldHJpZXZlIGFuZCB2ZXJpZnkgdGhlIGV2ZW50cy4KKyAgICAgICAgZXhlY3V0ZURldmljZVRlc3RNZXRob2QoIi5OZXR3b3JrTG9nZ2luZ1Rlc3QiLCAidGVzdE5ldHdvcmtMb2dnaW5nQW5kUmV0cmlldmFsIiwKKyAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zaW5nbGV0b25NYXAoQVJHX05FVFdPUktfTE9HR0lOR19CQVRDSF9DT1VOVCwgSW50ZWdlci50b1N0cmluZygxKSkpOworICAgIH0KKworCiAgICAgcHVibGljIHZvaWQgdGVzdFNldEFmZmlsaWF0aW9uSWRfSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghbUhhc0ZlYXR1cmUpIHsKICAgICAgICAgICAgIHJldHVybjsKQEAgLTM4NywxMSArNTQ5LDI5IEBACiAgICAgICAgICAgICAgICAgICAgIG1QcmltYXJ5VXNlcklkKTsKIAogICAgICAgICAgICAgLy8gUmVib290IHdoaWxlIGluIGtpb3NrIG1vZGUgYW5kIHRoZW4gdW5sb2NrIHRoZSBkZXZpY2UKLSAgICAgICAgICAgIGdldERldmljZSgpLnJlYm9vdCgpOworICAgICAgICAgICAgcmVib290QW5kV2FpdFVudGlsUmVhZHkoKTsKIAogICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCBraW9zayBtb2RlIGlzIHdvcmtpbmcgYW5kIGNhbid0IGJlIGludGVycnVwdGVkCiAgICAgICAgICAgICBydW5EZXZpY2VUZXN0c0FzVXNlcihERVZJQ0VfT1dORVJfUEtHLCAiLkxvY2tUYXNrSG9zdERyaXZlblRlc3QiLAogICAgICAgICAgICAgICAgICAgICAidGVzdExvY2tUYXNrSXNBY3RpdmVBbmRDYW50QmVJbnRlcnJ1cHRlZCIsIG1QcmltYXJ5VXNlcklkKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHJ1bkRldmljZVRlc3RzQXNVc2VyKERFVklDRV9PV05FUl9QS0csICIuTG9ja1Rhc2tIb3N0RHJpdmVuVGVzdCIsCisgICAgICAgICAgICAgICAgICAgICJjbGVhckRlZmF1bHRIb21lSW50ZW50UmVjZWl2ZXIiLCBtUHJpbWFyeVVzZXJJZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9ja1Rhc2tBZnRlclJlYm9vdF90cnlPcGVuaW5nU2V0dGluZ3NfZGV2aWNlT3duZXJVc2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghbUhhc0ZlYXR1cmUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBKdXN0IHN0YXJ0IGtpb3NrIG1vZGUKKyAgICAgICAgICAgIHJ1bkRldmljZVRlc3RzQXNVc2VyKERFVklDRV9PV05FUl9QS0csICIuTG9ja1Rhc2tIb3N0RHJpdmVuVGVzdCIsICJzdGFydExvY2tUYXNrIiwKKyAgICAgICAgICAgICAgICAgICAgbVByaW1hcnlVc2VySWQpOworCisgICAgICAgICAgICAvLyBSZWJvb3Qgd2hpbGUgaW4ga2lvc2sgbW9kZSBhbmQgdGhlbiB1bmxvY2sgdGhlIGRldmljZQorICAgICAgICAgICAgcmVib290QW5kV2FpdFVudGlsUmVhZHkoKTsKIAogICAgICAgICAgICAgLy8gVHJ5IHRvIG9wZW4gc2V0dGluZ3MgdmlhIGFkYgogICAgICAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZCgiYW0gc3RhcnQgLWEgYW5kcm9pZC5zZXR0aW5ncy5TRVRUSU5HUyIpOwpAQCAtNDM1LDIxICs2MTUsOCBAQAogICAgICAgICBpZiAoIW1IYXNGZWF0dXJlIHx8ICFjYW5DcmVhdGVBZGRpdGlvbmFsVXNlcnMoMSkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIGludCB1c2VySWQgPSBjcmVhdGVVc2VyKCk7Ci0gICAgICAgIGluc3RhbGxBcHBBc1VzZXIoSU5URU5UX1JFQ0VJVkVSX0FQSywgdXNlcklkKTsKLSAgICAgICAgaW5zdGFsbEFwcEFzVXNlcihERVZJQ0VfT1dORVJfQVBLLCB1c2VySWQpOwotICAgICAgICBzZXRQcm9maWxlT3duZXJPckZhaWwoREVWSUNFX09XTkVSX0NPTVBPTkVOVCwgdXNlcklkKTsKLQotICAgICAgICBzd2l0Y2hVc2VyKHVzZXJJZCk7Ci0gICAgICAgIHdha2V1cEFuZERpc21pc3NLZXlndWFyZCgpOwotCi0gICAgICAgIC8vIFNldHRpbmcgdGhlIHNhbWUgYWZmaWxpYXRpb24gaWRzIG9uIGJvdGggdXNlcnMgYW5kIHJ1bm5pbmcgdGhlIGxvY2sgdGFzayB0ZXN0cy4KLSAgICAgICAgcnVuRGV2aWNlVGVzdHNBc1VzZXIoCi0gICAgICAgICAgICAgICAgREVWSUNFX09XTkVSX1BLRywgIi5BZmZpbGlhdGlvblRlc3QiLCAidGVzdFNldEFmZmlsaWF0aW9uSWQxIiwgbVByaW1hcnlVc2VySWQpOwotICAgICAgICBydW5EZXZpY2VUZXN0c0FzVXNlcigKLSAgICAgICAgICAgICAgICBERVZJQ0VfT1dORVJfUEtHLCAiLkFmZmlsaWF0aW9uVGVzdCIsICJ0ZXN0U2V0QWZmaWxpYXRpb25JZDEiLCB1c2VySWQpOwotICAgICAgICBydW5EZXZpY2VUZXN0c0FzVXNlcihERVZJQ0VfT1dORVJfUEtHLCAiLkxvY2tUYXNrVGVzdCIsIHVzZXJJZCk7CisgICAgICAgIGZpbmFsIGludCB1c2VySWQgPSBjcmVhdGVBZmZpbGlhdGVkU2Vjb25kYXJ5VXNlcigpOworICAgICAgICBleGVjdXRlQWZmaWxpYXRlZFByb2ZpbGVPd25lclRlc3QoIkxvY2tUYXNrVGVzdCIsIHVzZXJJZCk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdFN5c3RlbVVwZGF0ZVBvbGljeSgpIHRocm93cyBFeGNlcHRpb24gewpAQCAtNTA1LDE2ICs2NzIsMTggQEAKIAogICAgIC8vIEV4ZWN1dGUgSGFyZHdhcmVQcm9wZXJ0aWVzTWFuYWdlclRlc3QgYXMgYSBkZXZpY2Ugb3duZXIuCiAgICAgcHVibGljIHZvaWQgdGVzdEhhcmR3YXJlUHJvcGVydGllc01hbmFnZXJBc0RldmljZU93bmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghbUhhc0ZlYXR1cmUpCisgICAgICAgIGlmICghbUhhc0ZlYXR1cmUpIHsKICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogCiAgICAgICAgIGV4ZWN1dGVEZXZpY2VUZXN0TWV0aG9kKCIuSGFyZHdhcmVQcm9wZXJ0aWVzTWFuYWdlclRlc3QiLCAidGVzdEhhcmR3YXJlUHJvcGVydGllc01hbmFnZXIiKTsKICAgICB9CiAKICAgICAvLyBFeGVjdXRlIFZyVGVtcGVyYXR1cmVUZXN0IGFzIGEgZGV2aWNlIG93bmVyLgogICAgIHB1YmxpYyB2b2lkIHRlc3RWclRlbXBlcmF0dXJlc0FzRGV2aWNlT3duZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFtSGFzRmVhdHVyZSkKKyAgICAgICAgaWYgKCFtSGFzRmVhdHVyZSkgewogICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAKICAgICAgICAgZXhlY3V0ZURldmljZVRlc3RNZXRob2QoIi5WclRlbXBlcmF0dXJlVGVzdCIsICJ0ZXN0VnJUZW1wZXJhdHVyZXMiKTsKICAgICB9CkBAIC01NTcsNyArNzI2LDEzIEBACiAgICAgICAgIGV4ZWN1dGVEZXZpY2VPd25lclRlc3QoIkJsdWV0b290aFJlc3RyaWN0aW9uVGVzdCIpOwogICAgIH0KIAotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSIzLjkuMS4xL0MtMS00IikKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0VGltZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIW1IYXNGZWF0dXJlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZXhlY3V0ZURldmljZU93bmVyVGVzdCgiU2V0VGltZVRlc3QiKTsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGV2aWNlT3duZXJQcm92aXNpb25pbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFtSGFzRmVhdHVyZSkgewogICAgICAgICAgICAgcmV0dXJuOwpAQCAtNTkzLDcgKzc2OCwxMDggQEAKICAgICAgICAgaWYgKCFtSGFzRmVhdHVyZSB8fCAhaGFzQmFja3VwU2VydmljZSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIGV4ZWN1dGVEZXZpY2VPd25lclRlc3QoIkJhY2t1cFNlcnZpY2VFbmFibGVkVGVzdCIpOworICAgICAgICBleGVjdXRlRGV2aWNlVGVzdE1ldGhvZCgiLkJhY2t1cFNlcnZpY2VQb2xpY2llc1Rlc3QiLAorICAgICAgICAgICAgICAgICJ0ZXN0RW5hYmxpbmdBbmREaXNhYmxpbmdCYWNrdXBTZXJ2aWNlIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFBhY2thZ2VJbnN0YWxsQ2FjaGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFtSGFzRmVhdHVyZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIENvbXBhdGliaWxpdHlCdWlsZEhlbHBlciBidWlsZEhlbHBlciA9IG5ldyBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIobUN0c0J1aWxkKTsKKyAgICAgICAgZmluYWwgRmlsZSBhcGsgPSBidWlsZEhlbHBlci5nZXRUZXN0RmlsZShURVNUX0FQUF9BUEspOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZ2V0RGV2aWNlKCkudW5pbnN0YWxsUGFja2FnZShURVNUX0FQUF9QS0cpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShnZXREZXZpY2UoKS5wdXNoRmlsZShhcGssIFRFU1RfQVBQX0xPQ0FUSU9OICsgYXBrLmdldE5hbWUoKSkpOworCisgICAgICAgICAgICAvLyBJbnN0YWxsIHRoZSBwYWNrYWdlIGluIHByaW1hcnkgdXNlcgorICAgICAgICAgICAgcnVuRGV2aWNlVGVzdHNBc1VzZXIoREVWSUNFX09XTkVSX1BLRywgIi5QYWNrYWdlSW5zdGFsbFRlc3QiLAorICAgICAgICAgICAgICAgICAgICAidGVzdFBhY2thZ2VJbnN0YWxsIiwgbVByaW1hcnlVc2VySWQpOworCisgICAgICAgICAgICBydW5EZXZpY2VUZXN0c0FzVXNlcihERVZJQ0VfT1dORVJfUEtHLCAiLlBhY2thZ2VJbnN0YWxsVGVzdCIsCisgICAgICAgICAgICAgICAgICAgICJ0ZXN0S2VlcFBhY2thZ2VDYWNoZSIsIG1QcmltYXJ5VXNlcklkKTsKKworICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBwYWNrYWdlIGluIHByaW1hcnkgdXNlcgorICAgICAgICAgICAgcnVuRGV2aWNlVGVzdHNBc1VzZXIoREVWSUNFX09XTkVSX1BLRywgIi5QYWNrYWdlSW5zdGFsbFRlc3QiLAorICAgICAgICAgICAgICAgICAgICAidGVzdFBhY2thZ2VVbmluc3RhbGwiLCBtUHJpbWFyeVVzZXJJZCk7CisKKyAgICAgICAgICAgIC8vIFNob3VsZCBiZSBhYmxlIHRvIGVuYWJsZSB0aGUgY2FjaGVkIHBhY2thZ2UgaW4gcHJpbWFyeSB1c2VyCisgICAgICAgICAgICBydW5EZXZpY2VUZXN0c0FzVXNlcihERVZJQ0VfT1dORVJfUEtHLCAiLlBhY2thZ2VJbnN0YWxsVGVzdCIsCisgICAgICAgICAgICAgICAgICAgICJ0ZXN0SW5zdGFsbEV4aXN0aW5nUGFja2FnZSIsIG1QcmltYXJ5VXNlcklkKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIFN0cmluZyBjb21tYW5kID0gInJtICIgKyBURVNUX0FQUF9MT0NBVElPTiArIGFway5nZXROYW1lKCk7CisgICAgICAgICAgICBnZXREZXZpY2UoKS5leGVjdXRlU2hlbGxDb21tYW5kKGNvbW1hbmQpOworICAgICAgICAgICAgZ2V0RGV2aWNlKCkudW5pbnN0YWxsUGFja2FnZShURVNUX0FQUF9QS0cpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFBhY2thZ2VJbnN0YWxsQ2FjaGVfbXVsdGlVc2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghbUhhc0ZlYXR1cmUgfHwgIWNhbkNyZWF0ZUFkZGl0aW9uYWxVc2VycygxKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZpbmFsIGludCB1c2VySWQgPSBjcmVhdGVBZmZpbGlhdGVkU2Vjb25kYXJ5VXNlcigpOworICAgICAgICBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIgYnVpbGRIZWxwZXIgPSBuZXcgQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyKG1DdHNCdWlsZCk7CisgICAgICAgIGZpbmFsIEZpbGUgYXBrID0gYnVpbGRIZWxwZXIuZ2V0VGVzdEZpbGUoVEVTVF9BUFBfQVBLKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoVEVTVF9BUFBfUEtHKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZ2V0RGV2aWNlKCkucHVzaEZpbGUoYXBrLCBURVNUX0FQUF9MT0NBVElPTiArIGFway5nZXROYW1lKCkpKTsKKworICAgICAgICAgICAgLy8gSW5zdGFsbCB0aGUgcGFja2FnZSBpbiBwcmltYXJ5IHVzZXIKKyAgICAgICAgICAgIHJ1bkRldmljZVRlc3RzQXNVc2VyKERFVklDRV9PV05FUl9QS0csICIuUGFja2FnZUluc3RhbGxUZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgInRlc3RQYWNrYWdlSW5zdGFsbCIsIG1QcmltYXJ5VXNlcklkKTsKKworICAgICAgICAgICAgLy8gU2hvdWxkIGJlIGFibGUgdG8gZW5hYmxlIHRoZSBwYWNrYWdlIGluIHNlY29uZGFyeSB1c2VyCisgICAgICAgICAgICBydW5EZXZpY2VUZXN0c0FzVXNlcihERVZJQ0VfT1dORVJfUEtHLCAiLlBhY2thZ2VJbnN0YWxsVGVzdCIsCisgICAgICAgICAgICAgICAgICAgICJ0ZXN0SW5zdGFsbEV4aXN0aW5nUGFja2FnZSIsIHVzZXJJZCk7CisKKyAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgcGFja2FnZSBpbiBib3RoIHVzZXIKKyAgICAgICAgICAgIHJ1bkRldmljZVRlc3RzQXNVc2VyKERFVklDRV9PV05FUl9QS0csICIuUGFja2FnZUluc3RhbGxUZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgInRlc3RQYWNrYWdlVW5pbnN0YWxsIiwgbVByaW1hcnlVc2VySWQpOworICAgICAgICAgICAgcnVuRGV2aWNlVGVzdHNBc1VzZXIoREVWSUNFX09XTkVSX1BLRywgIi5QYWNrYWdlSW5zdGFsbFRlc3QiLAorICAgICAgICAgICAgICAgICAgICAidGVzdFBhY2thZ2VVbmluc3RhbGwiLCB1c2VySWQpOworCisgICAgICAgICAgICAvLyBJbnN0YWxsIHRoZSBwYWNrYWdlIGluIHNlY29uZGFyeSB1c2VyCisgICAgICAgICAgICBydW5EZXZpY2VUZXN0c0FzVXNlcihERVZJQ0VfT1dORVJfUEtHLCAiLlBhY2thZ2VJbnN0YWxsVGVzdCIsCisgICAgICAgICAgICAgICAgICAgICJ0ZXN0UGFja2FnZUluc3RhbGwiLCB1c2VySWQpOworCisgICAgICAgICAgICAvLyBTaG91bGQgYmUgYWJsZSB0byBlbmFibGUgdGhlIHBhY2thZ2UgaW4gcHJpbWFyeSB1c2VyCisgICAgICAgICAgICBydW5EZXZpY2VUZXN0c0FzVXNlcihERVZJQ0VfT1dORVJfUEtHLCAiLlBhY2thZ2VJbnN0YWxsVGVzdCIsCisgICAgICAgICAgICAgICAgICAgICJ0ZXN0SW5zdGFsbEV4aXN0aW5nUGFja2FnZSIsIG1QcmltYXJ5VXNlcklkKTsKKworICAgICAgICAgICAgLy8gS2VlcCB0aGUgcGFja2FnZSBpbiBjYWNoZQorICAgICAgICAgICAgcnVuRGV2aWNlVGVzdHNBc1VzZXIoREVWSUNFX09XTkVSX1BLRywgIi5QYWNrYWdlSW5zdGFsbFRlc3QiLAorICAgICAgICAgICAgICAgICAgICAidGVzdEtlZXBQYWNrYWdlQ2FjaGUiLCBtUHJpbWFyeVVzZXJJZCk7CisKKyAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgcGFja2FnZSBpbiBib3RoIHVzZXIKKyAgICAgICAgICAgIHJ1bkRldmljZVRlc3RzQXNVc2VyKERFVklDRV9PV05FUl9QS0csICIuUGFja2FnZUluc3RhbGxUZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgInRlc3RQYWNrYWdlVW5pbnN0YWxsIiwgbVByaW1hcnlVc2VySWQpOworICAgICAgICAgICAgcnVuRGV2aWNlVGVzdHNBc1VzZXIoREVWSUNFX09XTkVSX1BLRywgIi5QYWNrYWdlSW5zdGFsbFRlc3QiLAorICAgICAgICAgICAgICAgICAgICAidGVzdFBhY2thZ2VVbmluc3RhbGwiLCB1c2VySWQpOworCisgICAgICAgICAgICAvLyBTaG91bGQgYmUgYWJsZSB0byBlbmFibGUgdGhlIGNhY2hlZCBwYWNrYWdlIGluIGJvdGggdXNlcnMKKyAgICAgICAgICAgIHJ1bkRldmljZVRlc3RzQXNVc2VyKERFVklDRV9PV05FUl9QS0csICIuUGFja2FnZUluc3RhbGxUZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgInRlc3RJbnN0YWxsRXhpc3RpbmdQYWNrYWdlIiwgdXNlcklkKTsKKyAgICAgICAgICAgIHJ1bkRldmljZVRlc3RzQXNVc2VyKERFVklDRV9PV05FUl9QS0csICIuUGFja2FnZUluc3RhbGxUZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgInRlc3RJbnN0YWxsRXhpc3RpbmdQYWNrYWdlIiwgbVByaW1hcnlVc2VySWQpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgU3RyaW5nIGNvbW1hbmQgPSAicm0gIiArIFRFU1RfQVBQX0xPQ0FUSU9OICsgYXBrLmdldE5hbWUoKTsKKyAgICAgICAgICAgIGdldERldmljZSgpLmV4ZWN1dGVTaGVsbENvbW1hbmQoY29tbWFuZCk7CisgICAgICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKFRFU1RfQVBQX1BLRyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWlycGxhbmVNb2RlUmVzdHJpY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFtSGFzRmVhdHVyZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGV4ZWN1dGVEZXZpY2VPd25lclRlc3QoIkFpcnBsYW5lTW9kZVJlc3RyaWN0aW9uVGVzdCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RPdmVycmlkZUFwbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIW1IYXNGZWF0dXJlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZXhlY3V0ZURldmljZU93bmVyVGVzdCgiT3ZlcnJpZGVBcG5UZXN0Iik7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGV4ZWN1dGVEZXZpY2VPd25lclRlc3QoU3RyaW5nIHRlc3RDbGFzc05hbWUpIHRocm93cyBFeGNlcHRpb24gewpAQCAtNjA0LDYgKzg4MCwxNSBAQAogICAgICAgICBydW5EZXZpY2VUZXN0c0FzVXNlcihERVZJQ0VfT1dORVJfUEtHLCB0ZXN0Q2xhc3MsIG1QcmltYXJ5VXNlcklkKTsKICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgZXhlY3V0ZUFmZmlsaWF0ZWRQcm9maWxlT3duZXJUZXN0KFN0cmluZyB0ZXN0Q2xhc3NOYW1lLCBpbnQgdXNlcklkKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghbUhhc0ZlYXR1cmUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgdGVzdENsYXNzID0gREVWSUNFX09XTkVSX1BLRyArICIuIiArIHRlc3RDbGFzc05hbWU7CisgICAgICAgIHJ1bkRldmljZVRlc3RzQXNVc2VyKERFVklDRV9PV05FUl9QS0csIHRlc3RDbGFzcywgdXNlcklkKTsKKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgZXhlY3V0ZURldmljZVRlc3RNZXRob2QoU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIHRlc3ROYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFtSGFzRmVhdHVyZSkgewogICAgICAgICAgICAgcmV0dXJuOwpAQCAtNjExLDQgKzg5NiwzOSBAQAogICAgICAgICBydW5EZXZpY2VUZXN0c0FzVXNlcihERVZJQ0VfT1dORVJfUEtHLCBjbGFzc05hbWUsIHRlc3ROYW1lLAogICAgICAgICAgICAgICAgIC8qIGRldmljZU93bmVyVXNlcklkICovIG1QcmltYXJ5VXNlcklkKTsKICAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorCisgICAgcHJpdmF0ZSBpbnQgY3JlYXRlQWZmaWxpYXRlZFNlY29uZGFyeVVzZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgaW50IHVzZXJJZCA9IGNyZWF0ZVVzZXIoKTsKKyAgICAgICAgaW5zdGFsbEFwcEFzVXNlcihJTlRFTlRfUkVDRUlWRVJfQVBLLCB1c2VySWQpOworICAgICAgICBpbnN0YWxsQXBwQXNVc2VyKERFVklDRV9PV05FUl9BUEssIHVzZXJJZCk7CisgICAgICAgIHNldFByb2ZpbGVPd25lck9yRmFpbChERVZJQ0VfT1dORVJfQ09NUE9ORU5ULCB1c2VySWQpOworCisgICAgICAgIHN3aXRjaFVzZXIodXNlcklkKTsKKyAgICAgICAgd2FpdEZvckJyb2FkY2FzdElkbGUoKTsKKyAgICAgICAgd2FrZXVwQW5kRGlzbWlzc0tleWd1YXJkKCk7CisKKyAgICAgICAgLy8gU2V0dGluZyB0aGUgc2FtZSBhZmZpbGlhdGlvbiBpZHMgb24gYm90aCB1c2VycyBhbmQgcnVubmluZyB0aGUgbG9jayB0YXNrIHRlc3RzLgorICAgICAgICBydW5EZXZpY2VUZXN0c0FzVXNlcigKKyAgICAgICAgICAgICAgICBERVZJQ0VfT1dORVJfUEtHLCAiLkFmZmlsaWF0aW9uVGVzdCIsICJ0ZXN0U2V0QWZmaWxpYXRpb25JZDEiLCBtUHJpbWFyeVVzZXJJZCk7CisgICAgICAgIHJ1bkRldmljZVRlc3RzQXNVc2VyKAorICAgICAgICAgICAgICAgIERFVklDRV9PV05FUl9QS0csICIuQWZmaWxpYXRpb25UZXN0IiwgInRlc3RTZXRBZmZpbGlhdGlvbklkMSIsIHVzZXJJZCk7CisgICAgICAgIHJldHVybiB1c2VySWQ7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGV4ZWN1dGVEZXZpY2VUZXN0TWV0aG9kKFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyB0ZXN0TmFtZSwKKyAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1zKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFtSGFzRmVhdHVyZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHJ1bkRldmljZVRlc3RzQXNVc2VyKERFVklDRV9PV05FUl9QS0csIGNsYXNzTmFtZSwgdGVzdE5hbWUsCisgICAgICAgICAgICAgICAgLyogZGV2aWNlT3duZXJVc2VySWQgKi8gbVByaW1hcnlVc2VySWQsIHBhcmFtcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydE5ld1VzZXJTdG9wcGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIExpc3Q8SW50ZWdlcj4gbmV3VXNlcnMgPSBnZXRVc2Vyc0NyZWF0ZWRCeVRlc3RzKCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBuZXdVc2Vycy5zaXplKCkpOworICAgICAgICBpbnQgbmV3VXNlcklkID0gbmV3VXNlcnMuZ2V0KDApOworCisgICAgICAgIGFzc2VydEZhbHNlKGdldERldmljZSgpLmlzVXNlclJ1bm5pbmcobmV3VXNlcklkKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vwb2xpY3kvRXBoZW1lcmFsVXNlclRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlcG9saWN5L0VwaGVtZXJhbFVzZXJUZXN0LmphdmEKaW5kZXggZGY0YTQ3Yy4uODRiZGQ3ZCAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vwb2xpY3kvRXBoZW1lcmFsVXNlclRlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZXBvbGljeS9FcGhlbWVyYWxVc2VyVGVzdC5qYXZhCkBAIC0xNyw3ICsxNyw3IEBACiBwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5kZXZpY2Vwb2xpY3k7CiAKIC8qKgotICogVGVzdHMgZm9yIGVtcGhlbWVyYWwgdXNlcnMgYW5kIHByb2ZpbGVzLgorICogVGVzdHMgZm9yIGVwaGVtZXJhbCB1c2VycyBhbmQgcHJvZmlsZXMuCiAgKi8KIHB1YmxpYyBjbGFzcyBFcGhlbWVyYWxVc2VyVGVzdCBleHRlbmRzIEJhc2VEZXZpY2VQb2xpY3lUZXN0IHsKIApAQCAtMzUsNyArMzUsNyBAQAogCiAgICAgLyoqIFRoZSB1c2VyIHNob3VsZCBoYXZlIHRoZSBlcGhlbWVyYWwgZmxhZyBzZXQgaWYgaXQgd2FzIGNyZWF0ZWQgYXMgZXBoZW1lcmFsLiAqLwogICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVFcGhlbWVyYWxVc2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghbUhhc0ZlYXR1cmUgfHwgIWhhc1VzZXJTcGxpdCgpKSB7CisgICAgICAgIGlmICghbUhhc0ZlYXR1cmUpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBpbnQgdXNlcklkID0gY3JlYXRlVXNlcihGTEFHX0VQSEVNRVJBTCk7CkBAIC01OSw3ICs1OSw4IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdGVzdFByb2ZpbGVJbmhlcml0c0VwaGVtZXJhbCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBpZiAoIW1IYXNGZWF0dXJlIHx8ICFoYXNEZXZpY2VGZWF0dXJlKCJhbmRyb2lkLnNvZnR3YXJlLm1hbmFnZWRfdXNlcnMiKQotICAgICAgICAgICAgICAgIHx8ICFoYXNVc2VyU3BsaXQoKSB8fCAhY2FuQ3JlYXRlQWRkaXRpb25hbFVzZXJzKDIpKSB7CisgICAgICAgICAgICAgICAgfHwgIWNhbkNyZWF0ZUFkZGl0aW9uYWxVc2VycygyKQorICAgICAgICAgICAgICAgIHx8ICFoYXNVc2VyU3BsaXQoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIGludCB1c2VySWQgPSBjcmVhdGVVc2VyKEZMQUdfRVBIRU1FUkFMKTsKQEAgLTcyLDcgKzczLDcgQEAKICAgICAgKiBFcGhlbWVyYWwgdXNlciBzaG91bGQgYmUgYXV0b21hdGljYWxseSByZW1vdmVkIGFmdGVyIGl0IGlzIHN0b3BwZWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZUVwaGVtZXJhbE9uU3RvcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIW1IYXNGZWF0dXJlIHx8ICFoYXNVc2VyU3BsaXQoKSkgeworICAgICAgICBpZiAoIW1IYXNGZWF0dXJlKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgaW50IHVzZXJJZCA9IGNyZWF0ZVVzZXIoRkxBR19FUEhFTUVSQUwpOwpAQCAtODcsNyArODgsNyBAQAogICAgICAqIGFuZCBub3QgZXBoZW1lcmFsIHdoZW4gdGhlIGZlYXR1cmUgaXMgbm90IHNldC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB0ZXN0RXBoZW1lcmFsR3Vlc3RGZWF0dXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghbUhhc0ZlYXR1cmUgfHwgIWhhc1VzZXJTcGxpdCgpKSB7CisgICAgICAgIGlmICghbUhhc0ZlYXR1cmUpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICAvLyBDcmVhdGUgYSBndWVzdCB1c2VyLgpAQCAtMTAzLDIwICsxMDQsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogVGVzdCB0aGF0IGNyZWF0aW5nIGFuIGVwaGVtZXJhbCB1c2VyIGZhaWxzIG9uIHN5c3RlbXMgd2l0aG91dCB0aGUgc3BsaXQgc3lzdGVtIHVzZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUVwaGVtZXJhbFdpdGhvdXRVc2VyU3BsaXRGYWlscygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIW1IYXNGZWF0dXJlIHx8IGhhc1VzZXJTcGxpdCgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIGNvbW1hbmQgPSJwbSBjcmVhdGUtdXNlciAtLWVwaGVtZXJhbCAiICsgIlRlc3RVc2VyXyIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgU3RyaW5nIGNvbW1hbmRPdXRwdXQgPSBnZXREZXZpY2UoKS5leGVjdXRlU2hlbGxDb21tYW5kKGNvbW1hbmQpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiQ3JlYXRpbmcgdGhlIGVwZWhlbWVyYWwgdXNlciBzaG91bGQgZmFpbC4iLAotICAgICAgICAgICAgICAgICJFcnJvcjogY291bGRuJ3QgY3JlYXRlIFVzZXIuIiwgY29tbWFuZE91dHB1dC50cmltKCkpOwotICAgIH0KLQogICAgIHByaXZhdGUgYm9vbGVhbiBnZXRHdWVzdFVzZXJzRXBoZW1lcmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZyBjb21tYW5kT3V0cHV0ID0gZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZCgiZHVtcHN5cyB1c2VyIik7CiAgICAgICAgIFN0cmluZ1tdIG91dHB1dExpbmVzID0gY29tbWFuZE91dHB1dC5zcGxpdCgiXG4iKTsKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlcG9saWN5L0xhdW5jaGVyQXBwc011bHRpVXNlclRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlcG9saWN5L0xhdW5jaGVyQXBwc011bHRpVXNlclRlc3QuamF2YQppbmRleCA5MjA1ZmY3Li44YWU3MTg0IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZXBvbGljeS9MYXVuY2hlckFwcHNNdWx0aVVzZXJUZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vwb2xpY3kvTGF1bmNoZXJBcHBzTXVsdGlVc2VyVGVzdC5qYXZhCkBAIC00Miw3ICs0Miw4IEBACiAKICAgICAgICAgaWYgKG1NdWx0aVVzZXJTdXBwb3J0ZWQpIHsKICAgICAgICAgICAgIHJlbW92ZVRlc3RVc2VycygpOwotICAgICAgICAgICAgaW5zdGFsbFRlc3RBcHBzKCk7CisgICAgICAgICAgICB1bmluc3RhbGxUZXN0QXBwcygpOworICAgICAgICAgICAgaW5zdGFsbFRlc3RBcHBzKG1QcmltYXJ5VXNlcklkKTsKICAgICAgICAgICAgIC8vIENyZWF0ZSBhIHNlY29uZGFyeSB1c2VyLgogICAgICAgICAgICAgbVNlY29uZGFyeVVzZXJJZCA9IGNyZWF0ZVVzZXIoKTsKICAgICAgICAgICAgIG1TZWNvbmRhcnlVc2VyU2VyaWFsTnVtYmVyID0gSW50ZWdlci50b1N0cmluZyhnZXRVc2VyU2VyaWFsTnVtYmVyKG1TZWNvbmRhcnlVc2VySWQpKTsKQEAgLTc1LDcgKzc2LDcgQEAKICAgICAgICAgaWYgKCFtTXVsdGlVc2VyU3VwcG9ydGVkKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgc3RhcnRDYWxsYmFja1NlcnZpY2UoKTsKKyAgICAgICAgc3RhcnRDYWxsYmFja1NlcnZpY2UobVByaW1hcnlVc2VySWQpOwogICAgICAgICBpbnN0YWxsQXBwQXNVc2VyKFNJTVBMRV9BUFBfQVBLLCBtUHJpbWFyeVVzZXJJZCk7CiAgICAgICAgIHJ1bkRldmljZVRlc3RzQXNVc2VyKExBVU5DSEVSX1RFU1RTX1BLRywKICAgICAgICAgICAgICAgICBMQVVOQ0hFUl9URVNUU19DTEFTUywKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlcG9saWN5L0xhdW5jaGVyQXBwc1Byb2ZpbGVUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZXBvbGljeS9MYXVuY2hlckFwcHNQcm9maWxlVGVzdC5qYXZhCmluZGV4IGE5NzhjY2YuLjdkZjI0MmQgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlcG9saWN5L0xhdW5jaGVyQXBwc1Byb2ZpbGVUZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vwb2xpY3kvTGF1bmNoZXJBcHBzUHJvZmlsZVRlc3QuamF2YQpAQCAtNTMsMTIgKzUzLDkgQEAKICAgICAgICAgICAgIG1NYWluVXNlclNlcmlhbE51bWJlciA9IEludGVnZXIudG9TdHJpbmcoZ2V0VXNlclNlcmlhbE51bWJlcihtUGFyZW50VXNlcklkKSk7CiAgICAgICAgICAgICBzdGFydFVzZXIobVByb2ZpbGVVc2VySWQpOwogCi0gICAgICAgICAgICAvLyBJbnN0YWxsIHRlc3QgQVBLLgotICAgICAgICAgICAgaW5zdGFsbFRlc3RBcHBzKCk7Ci0KLSAgICAgICAgICAgIC8vIEFsc28gaW5zdGFsbCBvbiB0aGUgbWFuYWdlZCBwcm9maWxlIHRvby4KLSAgICAgICAgICAgIGluc3RhbGxBcHBBc1VzZXIoTEFVTkNIRVJfVEVTVFNfQVBLLCBtUHJvZmlsZVVzZXJJZCk7Ci0gICAgICAgICAgICBpbnN0YWxsQXBwQXNVc2VyKExBVU5DSEVSX1RFU1RTX1NVUFBPUlRfQVBLLCBtUHJvZmlsZVVzZXJJZCk7CisgICAgICAgICAgICAvLyBJbnN0YWxsIHRlc3QgQVBLIG9uIHByaW1hcnkgdXNlciBhbmQgdGhlIG1hbmFnZWQgcHJvZmlsZS4KKyAgICAgICAgICAgIGluc3RhbGxUZXN0QXBwcyhtUHJpbWFyeVVzZXJJZCk7CisgICAgICAgICAgICBpbnN0YWxsVGVzdEFwcHMobVByb2ZpbGVVc2VySWQpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMTAsNyArMTA3LDcgQEAKICAgICAgICAgaWYgKCFtSGFzRmVhdHVyZSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIHN0YXJ0Q2FsbGJhY2tTZXJ2aWNlKCk7CisgICAgICAgIHN0YXJ0Q2FsbGJhY2tTZXJ2aWNlKG1QcmltYXJ5VXNlcklkKTsKICAgICAgICAgaW5zdGFsbEFwcEFzVXNlcihTSU1QTEVfQVBQX0FQSywgbVByb2ZpbGVVc2VySWQpOwogICAgICAgICBydW5EZXZpY2VUZXN0c0FzVXNlcihMQVVOQ0hFUl9URVNUU19QS0csCiAgICAgICAgICAgICAgICAgTEFVTkNIRVJfVEVTVFNfQ0xBU1MsCkBAIC0xMjMsNyArMTIwLDcgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBpbnN0YWxsQXBwQXNVc2VyKFNJTVBMRV9BUFBfQVBLLCBtUHJvZmlsZVVzZXJJZCk7Ci0gICAgICAgIHN0YXJ0Q2FsbGJhY2tTZXJ2aWNlKCk7CisgICAgICAgIHN0YXJ0Q2FsbGJhY2tTZXJ2aWNlKG1QcmltYXJ5VXNlcklkKTsKICAgICAgICAgZ2V0RGV2aWNlKCkudW5pbnN0YWxsUGFja2FnZShTSU1QTEVfQVBQX1BLRyk7CiAgICAgICAgIHJ1bkRldmljZVRlc3RzQXNVc2VyKExBVU5DSEVSX1RFU1RTX1BLRywKICAgICAgICAgICAgICAgICBMQVVOQ0hFUl9URVNUU19DTEFTUywKQEAgLTEzNiwxMSArMTMzLDIyIEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgaW5zdGFsbEFwcEFzVXNlcihTSU1QTEVfQVBQX0FQSywgbVByb2ZpbGVVc2VySWQpOwotICAgICAgICBzdGFydENhbGxiYWNrU2VydmljZSgpOworICAgICAgICBzdGFydENhbGxiYWNrU2VydmljZShtUHJpbWFyeVVzZXJJZCk7CiAgICAgICAgIGluc3RhbGxBcHBBc1VzZXIoU0lNUExFX0FQUF9BUEssIG1Qcm9maWxlVXNlcklkKTsKICAgICAgICAgcnVuRGV2aWNlVGVzdHNBc1VzZXIoTEFVTkNIRVJfVEVTVFNfUEtHLAogICAgICAgICAgICAgICAgIExBVU5DSEVSX1RFU1RTX0NMQVNTLAogICAgICAgICAgICAgICAgICJ0ZXN0UGFja2FnZUNoYW5nZWRDYWxsYmFja0ZvclVzZXIiLAogICAgICAgICAgICAgICAgIG1QYXJlbnRVc2VySWQsIENvbGxlY3Rpb25zLnNpbmdsZXRvbk1hcChQQVJBTV9URVNUX1VTRVIsIG1Qcm9maWxlU2VyaWFsTnVtYmVyKSk7CiAgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJldmVyc2VBY2Nlc3NOb1Rocm93KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghbUhhc0ZlYXR1cmUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpbnN0YWxsQXBwQXNVc2VyKFNJTVBMRV9BUFBfQVBLLCBtUHJvZmlsZVVzZXJJZCk7CisKKyAgICAgICAgcnVuRGV2aWNlVGVzdHNBc1VzZXIoTEFVTkNIRVJfVEVTVFNfUEtHLAorICAgICAgICAgICAgICAgIExBVU5DSEVSX1RFU1RTX0NMQVNTLCAidGVzdFJldmVyc2VBY2Nlc3NOb1Rocm93IiwKKyAgICAgICAgICAgICAgICBtUHJvZmlsZVVzZXJJZCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTWFwKFBBUkFNX1RFU1RfVVNFUiwgbU1haW5Vc2VyU2VyaWFsTnVtYmVyKSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vwb2xpY3kvTGF1bmNoZXJBcHBzU2luZ2xlVXNlclRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlcG9saWN5L0xhdW5jaGVyQXBwc1NpbmdsZVVzZXJUZXN0LmphdmEKaW5kZXggMDQ4MTc3Ny4uNWQ2N2E0NiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vwb2xpY3kvTGF1bmNoZXJBcHBzU2luZ2xlVXNlclRlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZXBvbGljeS9MYXVuY2hlckFwcHNTaW5nbGVVc2VyVGVzdC5qYXZhCkBAIC0yOSw2ICsyOSw3IEBACiAKICAgICBwcml2YXRlIGJvb2xlYW4gbUhhc0xhdW5jaGVyQXBwczsKICAgICBwcml2YXRlIFN0cmluZyBtU2VyaWFsTnVtYmVyOworICAgIHByaXZhdGUgaW50IG1DdXJyZW50VXNlcklkOwogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTM2LDggKzM3LDEwIEBACiAgICAgICAgIG1IYXNMYXVuY2hlckFwcHMgPSBnZXREZXZpY2UoKS5nZXRBcGlMZXZlbCgpID49IDIxOwogCiAgICAgICAgIGlmIChtSGFzTGF1bmNoZXJBcHBzKSB7Ci0gICAgICAgICAgICBtU2VyaWFsTnVtYmVyID0gSW50ZWdlci50b1N0cmluZyhnZXRVc2VyU2VyaWFsTnVtYmVyKFVTRVJfU1lTVEVNKSk7Ci0gICAgICAgICAgICBpbnN0YWxsVGVzdEFwcHMoKTsKKyAgICAgICAgICAgIG1DdXJyZW50VXNlcklkID0gZ2V0RGV2aWNlKCkuZ2V0Q3VycmVudFVzZXIoKTsKKyAgICAgICAgICAgIG1TZXJpYWxOdW1iZXIgPSBJbnRlZ2VyLnRvU3RyaW5nKGdldFVzZXJTZXJpYWxOdW1iZXIobUN1cnJlbnRVc2VySWQpKTsKKyAgICAgICAgICAgIHVuaW5zdGFsbFRlc3RBcHBzKCk7CisgICAgICAgICAgICBpbnN0YWxsVGVzdEFwcHMobUN1cnJlbnRVc2VySWQpOwogICAgICAgICB9CiAgICAgfQogCkBAIC01Myw3OCArNTYsNzggQEAKICAgICAgICAgaWYgKCFtSGFzTGF1bmNoZXJBcHBzKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgaW5zdGFsbEFwcEFzVXNlcihTSU1QTEVfQVBQX0FQSywgbVByaW1hcnlVc2VySWQpOworICAgICAgICBpbnN0YWxsQXBwQXNVc2VyKFNJTVBMRV9BUFBfQVBLLCBtQ3VycmVudFVzZXJJZCk7CiAgICAgICAgIHJ1bkRldmljZVRlc3RzQXNVc2VyKExBVU5DSEVSX1RFU1RTX1BLRywKICAgICAgICAgICAgICAgICBMQVVOQ0hFUl9URVNUU19DTEFTUywgInRlc3RTaW1wbGVBcHBJbnN0YWxsZWRGb3JVc2VyIiwKLSAgICAgICAgICAgICAgICBtUHJpbWFyeVVzZXJJZCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTWFwKFBBUkFNX1RFU1RfVVNFUiwgbVNlcmlhbE51bWJlcikpOworICAgICAgICAgICAgICAgIG1DdXJyZW50VXNlcklkLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25NYXAoUEFSQU1fVEVTVF9VU0VSLCBtU2VyaWFsTnVtYmVyKSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdExhdW5jaGVyQ2FsbGJhY2tQYWNrYWdlQWRkZWRNYWluVXNlcigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBpZiAoIW1IYXNMYXVuY2hlckFwcHMpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBzdGFydENhbGxiYWNrU2VydmljZSgpOwotICAgICAgICBpbnN0YWxsQXBwQXNVc2VyKFNJTVBMRV9BUFBfQVBLLCBtUHJpbWFyeVVzZXJJZCk7CisgICAgICAgIHN0YXJ0Q2FsbGJhY2tTZXJ2aWNlKG1DdXJyZW50VXNlcklkKTsKKyAgICAgICAgaW5zdGFsbEFwcEFzVXNlcihTSU1QTEVfQVBQX0FQSywgbUN1cnJlbnRVc2VySWQpOwogCiAgICAgICAgIHJ1bkRldmljZVRlc3RzQXNVc2VyKExBVU5DSEVSX1RFU1RTX1BLRywKICAgICAgICAgICAgICAgICBMQVVOQ0hFUl9URVNUU19DTEFTUywKICAgICAgICAgICAgICAgICAidGVzdFBhY2thZ2VBZGRlZENhbGxiYWNrRm9yVXNlciIsCi0gICAgICAgICAgICAgICAgbVByaW1hcnlVc2VySWQsIENvbGxlY3Rpb25zLnNpbmdsZXRvbk1hcChQQVJBTV9URVNUX1VTRVIsIG1TZXJpYWxOdW1iZXIpKTsKKyAgICAgICAgICAgICAgICBtQ3VycmVudFVzZXJJZCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTWFwKFBBUkFNX1RFU1RfVVNFUiwgbVNlcmlhbE51bWJlcikpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RMYXVuY2hlckNhbGxiYWNrUGFja2FnZVJlbW92ZWRNYWluVXNlcigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBpZiAoIW1IYXNMYXVuY2hlckFwcHMpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBpbnN0YWxsQXBwQXNVc2VyKFNJTVBMRV9BUFBfQVBLLCBtUHJpbWFyeVVzZXJJZCk7Ci0gICAgICAgIHN0YXJ0Q2FsbGJhY2tTZXJ2aWNlKCk7CisgICAgICAgIGluc3RhbGxBcHBBc1VzZXIoU0lNUExFX0FQUF9BUEssIG1DdXJyZW50VXNlcklkKTsKKyAgICAgICAgc3RhcnRDYWxsYmFja1NlcnZpY2UobUN1cnJlbnRVc2VySWQpOwogICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKFNJTVBMRV9BUFBfUEtHKTsKICAgICAgICAgcnVuRGV2aWNlVGVzdHNBc1VzZXIoTEFVTkNIRVJfVEVTVFNfUEtHLAogICAgICAgICAgICAgICAgIExBVU5DSEVSX1RFU1RTX0NMQVNTLAogICAgICAgICAgICAgICAgICJ0ZXN0UGFja2FnZVJlbW92ZWRDYWxsYmFja0ZvclVzZXIiLAotICAgICAgICAgICAgICAgIG1QcmltYXJ5VXNlcklkLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25NYXAoUEFSQU1fVEVTVF9VU0VSLCBtU2VyaWFsTnVtYmVyKSk7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRVc2VySWQsIENvbGxlY3Rpb25zLnNpbmdsZXRvbk1hcChQQVJBTV9URVNUX1VTRVIsIG1TZXJpYWxOdW1iZXIpKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0TGF1bmNoZXJDYWxsYmFja1BhY2thZ2VDaGFuZ2VkTWFpblVzZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFtSGFzTGF1bmNoZXJBcHBzKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgaW5zdGFsbEFwcEFzVXNlcihTSU1QTEVfQVBQX0FQSywgbVByaW1hcnlVc2VySWQpOwotICAgICAgICBzdGFydENhbGxiYWNrU2VydmljZSgpOwotICAgICAgICBpbnN0YWxsQXBwQXNVc2VyKFNJTVBMRV9BUFBfQVBLLCBtUHJpbWFyeVVzZXJJZCk7CisgICAgICAgIGluc3RhbGxBcHBBc1VzZXIoU0lNUExFX0FQUF9BUEssIG1DdXJyZW50VXNlcklkKTsKKyAgICAgICAgc3RhcnRDYWxsYmFja1NlcnZpY2UobUN1cnJlbnRVc2VySWQpOworICAgICAgICBpbnN0YWxsQXBwQXNVc2VyKFNJTVBMRV9BUFBfQVBLLCBtQ3VycmVudFVzZXJJZCk7CiAgICAgICAgIHJ1bkRldmljZVRlc3RzQXNVc2VyKExBVU5DSEVSX1RFU1RTX1BLRywKICAgICAgICAgICAgICAgICBMQVVOQ0hFUl9URVNUU19DTEFTUywKICAgICAgICAgICAgICAgICAidGVzdFBhY2thZ2VDaGFuZ2VkQ2FsbGJhY2tGb3JVc2VyIiwKLSAgICAgICAgICAgICAgICBtUHJpbWFyeVVzZXJJZCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTWFwKFBBUkFNX1RFU1RfVVNFUiwgbVNlcmlhbE51bWJlcikpOworICAgICAgICAgICAgICAgIG1DdXJyZW50VXNlcklkLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25NYXAoUEFSQU1fVEVTVF9VU0VSLCBtU2VyaWFsTnVtYmVyKSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdExhdW5jaGVyTm9uRXhwb3J0ZWRBcHBGYWlscygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBpZiAoIW1IYXNMYXVuY2hlckFwcHMpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBpbnN0YWxsQXBwQXNVc2VyKFNJTVBMRV9BUFBfQVBLLCBtUHJpbWFyeVVzZXJJZCk7CisgICAgICAgIGluc3RhbGxBcHBBc1VzZXIoU0lNUExFX0FQUF9BUEssIG1DdXJyZW50VXNlcklkKTsKICAgICAgICAgcnVuRGV2aWNlVGVzdHNBc1VzZXIoTEFVTkNIRVJfVEVTVFNfUEtHLAogICAgICAgICAgICAgICAgIExBVU5DSEVSX1RFU1RTX0NMQVNTLCAidGVzdExhdW5jaE5vbkV4cG9ydEFjdGl2aXR5RmFpbHMiLAotICAgICAgICAgICAgICAgIG1QcmltYXJ5VXNlcklkLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25NYXAoUEFSQU1fVEVTVF9VU0VSLCBtU2VyaWFsTnVtYmVyKSk7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRVc2VySWQsIENvbGxlY3Rpb25zLnNpbmdsZXRvbk1hcChQQVJBTV9URVNUX1VTRVIsIG1TZXJpYWxOdW1iZXIpKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0TGF1bmNoTm9uRXhwb3J0QWN0aXZpdHlGYWlscygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBpZiAoIW1IYXNMYXVuY2hlckFwcHMpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBpbnN0YWxsQXBwQXNVc2VyKFNJTVBMRV9BUFBfQVBLLCBtUHJpbWFyeVVzZXJJZCk7CisgICAgICAgIGluc3RhbGxBcHBBc1VzZXIoU0lNUExFX0FQUF9BUEssIG1DdXJyZW50VXNlcklkKTsKICAgICAgICAgcnVuRGV2aWNlVGVzdHNBc1VzZXIoTEFVTkNIRVJfVEVTVFNfUEtHLAogICAgICAgICAgICAgICAgIExBVU5DSEVSX1RFU1RTX0NMQVNTLCAidGVzdExhdW5jaE5vbkV4cG9ydExhdW5jaGVyRmFpbHMiLAotICAgICAgICAgICAgICAgIG1QcmltYXJ5VXNlcklkLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25NYXAoUEFSQU1fVEVTVF9VU0VSLCBtU2VyaWFsTnVtYmVyKSk7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRVc2VySWQsIENvbGxlY3Rpb25zLnNpbmdsZXRvbk1hcChQQVJBTV9URVNUX1VTRVIsIG1TZXJpYWxOdW1iZXIpKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0TGF1bmNoTWFpbkFjdGl2aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghbUhhc0xhdW5jaGVyQXBwcykgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIGluc3RhbGxBcHBBc1VzZXIoU0lNUExFX0FQUF9BUEssIG1QcmltYXJ5VXNlcklkKTsKKyAgICAgICAgaW5zdGFsbEFwcEFzVXNlcihTSU1QTEVfQVBQX0FQSywgbUN1cnJlbnRVc2VySWQpOwogICAgICAgICBydW5EZXZpY2VUZXN0c0FzVXNlcihMQVVOQ0hFUl9URVNUU19QS0csCiAgICAgICAgICAgICAgICAgTEFVTkNIRVJfVEVTVFNfQ0xBU1MsICJ0ZXN0TGF1bmNoTWFpbkFjdGl2aXR5IiwKLSAgICAgICAgICAgICAgICBtUHJpbWFyeVVzZXJJZCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTWFwKFBBUkFNX1RFU1RfVVNFUiwgbVNlcmlhbE51bWJlcikpOworICAgICAgICAgICAgICAgIG1DdXJyZW50VXNlcklkLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25NYXAoUEFSQU1fVEVTVF9VU0VSLCBtU2VyaWFsTnVtYmVyKSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vwb2xpY3kvTWFuYWdlZFByb2ZpbGVQcm92aXNpb25pbmdTaW5nbGVBZG1pblRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlcG9saWN5L01hbmFnZWRQcm9maWxlUHJvdmlzaW9uaW5nU2luZ2xlQWRtaW5UZXN0LmphdmEKaW5kZXggZWY3MDk5Yi4uYjcxYzRjODcgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlcG9saWN5L01hbmFnZWRQcm9maWxlUHJvdmlzaW9uaW5nU2luZ2xlQWRtaW5UZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vwb2xpY3kvTWFuYWdlZFByb2ZpbGVQcm92aXNpb25pbmdTaW5nbGVBZG1pblRlc3QuamF2YQpAQCAtMTUsOCArMTUsNiBAQAogICovCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5kZXZpY2Vwb2xpY3k7CiAKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQogLyoqCiAgKiBUaGlzIGNsYXNzIHRlc3RzIHRoZSBwcm92aXNpb25pbmcgZmxvdyB3aXRoIGFuIEFQSyB0aGF0IGRlY2xhcmVzIGEgc2luZ2xlIHJlY2VpdmVyIHdpdGgKICAqIEJJTkRfREVWSUNFX0FETUlOIHBlcm1pc3Npb25zLCB3aGljaCB3YXMgYSByZXF1aXJlbWVudCBmb3IgdGhlIGFwcCBzZW5kaW5nIHRoZQpAQCAtNTQsNyArNTIsNiBAQAogICAgICAgICBzdXBlci50ZWFyRG93bigpOwogICAgIH0KIAotICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEVYVFJBX1BST1ZJU0lPTklOR19ERVZJQ0VfQURNSU5fUEFDS0FHRV9OQU1FKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghbUhhc0ZlYXR1cmUpIHsKICAgICAgICAgICAgIHJldHVybjsKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlcG9saWN5L01hbmFnZWRQcm9maWxlUHJvdmlzaW9uaW5nVGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vwb2xpY3kvTWFuYWdlZFByb2ZpbGVQcm92aXNpb25pbmdUZXN0LmphdmEKaW5kZXggZmEzNjI3YS4uOTNhMTdlMCAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vwb2xpY3kvTWFuYWdlZFByb2ZpbGVQcm92aXNpb25pbmdUZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vwb2xpY3kvTWFuYWdlZFByb2ZpbGVQcm92aXNpb25pbmdUZXN0LmphdmEKQEAgLTExMSw2ICsxMTEsMTcgQEAKICAgICAgICAgICAgICAgICAidGVzdEFjY291bnRFeGlzdCIsIG1QYXJlbnRVc2VySWQpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJ2aWV3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghbUhhc0ZlYXR1cmUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFdlIHN0YXJ0IGFuIGFjdGl2aXR5IGNvbnRhaW5pbmcgV2ViVmlldyBpbiBhbm90aGVyIHByb2Nlc3MgYW5kIHJ1biBwcm92aXNpb25pbmcgdG8KKyAgICAgICAgLy8gdGVzdCB0aGF0IHRoZSBwcm9jZXNzIGlzIG5vdCBraWxsZWQuCisgICAgICAgIHN0YXJ0QWN0aXZpdHlBc1VzZXIobVBhcmVudFVzZXJJZCwgTUFOQUdFRF9QUk9GSUxFX1BLRywgIi5XZWJWaWV3QWN0aXZpdHkiKTsKKyAgICAgICAgcHJvdmlzaW9uTWFuYWdlZFByb2ZpbGUoKTsKKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgcHJvdmlzaW9uTWFuYWdlZFByb2ZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgcnVuRGV2aWNlVGVzdHNBc1VzZXIoTUFOQUdFRF9QUk9GSUxFX1BLRywgIi5Qcm92aXNpb25pbmdUZXN0IiwKICAgICAgICAgICAgICAgICAidGVzdFByb3Zpc2lvbk1hbmFnZWRQcm9maWxlIiwgbVBhcmVudFVzZXJJZCk7CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZXBvbGljeS9NYW5hZ2VkUHJvZmlsZVRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlcG9saWN5L01hbmFnZWRQcm9maWxlVGVzdC5qYXZhCmluZGV4IDgwZDdlNmIuLmI4MWFmZDIgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlcG9saWN5L01hbmFnZWRQcm9maWxlVGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlcG9saWN5L01hbmFnZWRQcm9maWxlVGVzdC5qYXZhCkBAIC0yMCw4ICsyMCw2IEBACiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLkRldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5sb2cuTG9nVXRpbC5DTG9nOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DZGRUZXN0OwotCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yOwogCiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwpAQCAtNDksNyArNDcsNiBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlRFTlRfUkVDRUlWRVJfUEtHID0gImNvbS5hbmRyb2lkLmN0cy5pbnRlbnQucmVjZWl2ZXIiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlRFTlRfUkVDRUlWRVJfQVBLID0gIkN0c0ludGVudFJlY2VpdmVyQXBwLmFwayI7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0lGSV9DT05GSUdfQ1JFQVRPUl9QS0cgPSAiY29tLmFuZHJvaWQuY3RzLndpZmljb25maWdjcmVhdG9yIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0lGSV9DT05GSUdfQ1JFQVRPUl9BUEsgPSAiQ3RzV2lmaUNvbmZpZ0NyZWF0b3IuYXBrIjsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXSURHRVRfUFJPVklERVJfQVBLID0gIkN0c1dpZGdldFByb3ZpZGVyQXBwLmFwayI7CkBAIC02Nyw4ICs2NCw2IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVElGSUNBVElPTl9BUEsgPSAiQ3RzTm90aWZpY2F0aW9uU2VuZGVyQXBwLmFwayI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVElGSUNBVElPTl9QS0cgPQogICAgICAgICAgICAgImNvbS5hbmRyb2lkLmN0cy5tYW5hZ2VkcHJvZmlsZXRlc3RzLm5vdGlmaWNhdGlvbnNlbmRlciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVElGSUNBVElPTl9BQ1RJVklUWSA9Ci0gICAgICAgICAgICBOT1RJRklDQVRJT05fUEtHICsgIi5TZW5kTm90aWZpY2F0aW9uIjsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBRE1JTl9SRUNFSVZFUl9URVNUX0NMQVNTID0KICAgICAgICAgICAgIE1BTkFHRURfUFJPRklMRV9QS0cgKyAiLkJhc2VNYW5hZ2VkUHJvZmlsZVRlc3QkQmFzaWNBZG1pblJlY2VpdmVyIjsKQEAgLTgwLDIwICs3NSwyNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX0NPTk5FQ1RJT05fU0VSVklDRSA9ICJhbmRyb2lkLnNvZnR3YXJlLmNvbm5lY3Rpb25zZXJ2aWNlIjsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSU1QTEVfQVBQX0FQSyA9ICJDdHNTaW1wbGVBcHAuYXBrIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lNUExFX0FQUF9QS0cgPSAiY29tLmFuZHJvaWQuY3RzLmxhdW5jaGVyYXBwcy5zaW1wbGVhcHAiOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBUSU1FT1VUX1VTRVJfTE9DS0VEX01JTExJUyA9IFRpbWVVbml0LlNFQ09ORFMudG9NaWxsaXMoMzApOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVElNRU9VVF9VU0VSX0xPQ0tFRF9NSUxMSVMgPSBUaW1lVW5pdC5TRUNPTkRTLnRvTWlsbGlzKDYwKTsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9QUk9GSUxFX0lEID0gInByb2ZpbGUtaWQiOwogCiAgICAgLy8gUGFzc3dvcmQgbmVlZHMgdG8gYmUgaW4gc3luYyB3aXRoIFJlc2V0UGFzc3dvcmRXaXRoVG9rZW5UZXN0LlBBU1NXT1JEMQogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNFVF9QQVNTV09SRF9URVNUX0RFRkFVTFRfUEFTU1dPUkQgPSAiMTIzNDU2IjsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9GSUxFX0NSRURFTlRJQUwgPSAiMTIzNCI7CisgICAgLy8gVGhpcyBzaG91bGQgYmUgc3VmZmljaWVudGx5IGxhcmdlciB0aGFuIFByb2ZpbGVUaW1lb3V0VGVzdEhlbHBlci5USU1FT1VUX01TCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBST0ZJTEVfVElNRU9VVF9ERUxBWV9NUyA9IDEwXzAwMDsKKworICAgIC8vVGhlIG1heGltdW0gdGltZSB0byB3YWl0IGZvciB1c2VyIHRvIGJlIHVubG9ja2VkLgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVVNFUl9VTkxPQ0tfVElNRU9VVF9OQU5PID0gMzBfMDAwXzAwMF8wMDBMOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfVU5MT0NLRURfU0hFTExfT1VUUFVUID0gIlJVTk5JTkdfVU5MT0NLRUQiOworCiAgICAgcHJpdmF0ZSBpbnQgbVBhcmVudFVzZXJJZDsKIAogICAgIC8vIElEIG9mIHRoZSBwcm9maWxlIHdlJ2xsIGNyZWF0ZS4gVGhpcyB3aWxsIGFsd2F5cyBiZSBhIHByb2ZpbGUgb2YgdGhlIHBhcmVudC4KICAgICBwcml2YXRlIGludCBtUHJvZmlsZVVzZXJJZDsKLSAgICBwcml2YXRlIFN0cmluZyBtUGFja2FnZVZlcmlmaWVyOwogCiAgICAgcHJpdmF0ZSBib29sZWFuIG1IYXNOZmNGZWF0dXJlOwogCkBAIC0xMTAsMTUgKzExMiwyOCBAQAogICAgICAgICAgICAgcmVtb3ZlVGVzdFVzZXJzKCk7CiAgICAgICAgICAgICBtUGFyZW50VXNlcklkID0gbVByaW1hcnlVc2VySWQ7CiAgICAgICAgICAgICBtUHJvZmlsZVVzZXJJZCA9IGNyZWF0ZU1hbmFnZWRQcm9maWxlKG1QYXJlbnRVc2VySWQpOworICAgICAgICAgICAgc3RhcnRVc2VyKG1Qcm9maWxlVXNlcklkKTsKIAogICAgICAgICAgICAgaW5zdGFsbEFwcEFzVXNlcihNQU5BR0VEX1BST0ZJTEVfQVBLLCBtUGFyZW50VXNlcklkKTsKICAgICAgICAgICAgIGluc3RhbGxBcHBBc1VzZXIoTUFOQUdFRF9QUk9GSUxFX0FQSywgbVByb2ZpbGVVc2VySWQpOwogICAgICAgICAgICAgc2V0UHJvZmlsZU93bmVyT3JGYWlsKE1BTkFHRURfUFJPRklMRV9QS0cgKyAiLyIgKyBBRE1JTl9SRUNFSVZFUl9URVNUX0NMQVNTLAogICAgICAgICAgICAgICAgICAgICBtUHJvZmlsZVVzZXJJZCk7Ci0gICAgICAgICAgICBzdGFydFVzZXIobVByb2ZpbGVVc2VySWQpOworICAgICAgICAgICAgd2FpdEZvclVzZXJVbmxvY2soKTsKICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCAgd2FpdEZvclVzZXJVbmxvY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGNvbW1hbmQgPSBTdHJpbmcuZm9ybWF0KCJhbSBnZXQtc3RhcnRlZC11c2VyLXN0YXRlICVkIiwgbVByb2ZpbGVVc2VySWQpOworICAgICAgICBmaW5hbCBsb25nIGRlYWRsaW5lID0gU3lzdGVtLm5hbm9UaW1lKCkgKyBVU0VSX1VOTE9DS19USU1FT1VUX05BTk87CisgICAgICAgIHdoaWxlIChTeXN0ZW0ubmFub1RpbWUoKSA8PSBkZWFkbGluZSkgeworICAgICAgICAgICAgaWYgKGdldERldmljZSgpLmV4ZWN1dGVTaGVsbENvbW1hbmQoY29tbWFuZCkuc3RhcnRzV2l0aChVU0VSX1VOTE9DS0VEX1NIRUxMX09VVFBVVCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwKTsKKyAgICAgICAgfQorICAgICAgICBmYWlsKCJQcm9maWxlIHVzZXIgaXMgbm90IHVubG9ja2VkLiIpOworICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChtSGFzRmVhdHVyZSkgewpAQCAtMTQwLDYgKzE1NSwyNSBAQAogICAgICAgICAgICAgICAgIG1Qcm9maWxlVXNlcklkKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2lwZURhdGFXaXRoUmVhc29uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghbUhhc0ZlYXR1cmUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKGxpc3RVc2VycygpLmNvbnRhaW5zKG1Qcm9maWxlVXNlcklkKSk7CisgICAgICAgIHNlbmRXaXBlUHJvZmlsZUJyb2FkY2FzdCgiY29tLmFuZHJvaWQuY3RzLm1hbmFnZWRwcm9maWxlLldJUEVfREFUQV9XSVRIX1JFQVNPTiIpOworICAgICAgICAvLyBOb3RlOiB0aGUgbWFuYWdlZCBwcm9maWxlIGlzIHJlbW92ZWQgYnkgdGhpcyB0ZXN0LCB3aGljaCB3aWxsIG1ha2UgcmVtb3ZlVXNlckNvbW1hbmQgaW4KKyAgICAgICAgLy8gdGVhckRvd24oKSB0byBjb21wbGFpbiwgYnV0IHRoYXQgc2hvdWxkIGJlIE9LIHNpbmNlIGl0cyByZXN1bHQgaXMgbm90IGFzc2VydGVkLgorICAgICAgICBhc3NlcnRVc2VyR2V0c1JlbW92ZWQobVByb2ZpbGVVc2VySWQpOworICAgICAgICAvLyB0ZXN0V2lwZURhdGFXaXRoUmVhc29uKCkgcmVtb3ZlcyB0aGUgbWFuYWdlZCBwcm9maWxlLAorICAgICAgICAvLyBzbyBpdCBuZWVkcyB0byBzZXBhcmF0ZWQgZnJvbSBvdGhlciB0ZXN0cy4KKyAgICAgICAgLy8gQ2hlY2sgdGhlIG5vdGlmaWNhdGlvbiBpcyBwcmVzZW50ZWQgYWZ0ZXIgd29yayBwcm9maWxlIGdvdCByZW1vdmVkLCBzbyBwcm9maWxlIHVzZXIgbm8KKyAgICAgICAgLy8gbG9uZ2VyIGV4aXN0cywgdmVyaWZpY2F0aW9uIHNob3VsZCBiZSBydW4gaW4gcHJpbWFyeSB1c2VyLgorICAgICAgICBydW5EZXZpY2VUZXN0c0FzVXNlcigKKyAgICAgICAgICAgICAgICBNQU5BR0VEX1BST0ZJTEVfUEtHLAorICAgICAgICAgICAgICAgICIuV2lwZURhdGFXaXRoUmVhc29uVmVyaWZpY2F0aW9uVGVzdCIsCisgICAgICAgICAgICAgICAgbVBhcmVudFVzZXJJZCk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogIHdpcGVEYXRhKCkgdGVzdCByZW1vdmVzIHRoZSBtYW5hZ2VkIHByb2ZpbGUsIHNvIGl0IG5lZWRzIHRvIHNlcGFyYXRlZCBmcm9tIG90aGVyIHRlc3RzLgogICAgICAqLwpAQCAtMTQ4LDIwICsxODIsMzIgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBhc3NlcnRUcnVlKGxpc3RVc2VycygpLmNvbnRhaW5zKG1Qcm9maWxlVXNlcklkKSk7Ci0gICAgICAgIHJ1bkRldmljZVRlc3RzQXNVc2VyKAotICAgICAgICAgICAgICAgIE1BTkFHRURfUFJPRklMRV9QS0csIE1BTkFHRURfUFJPRklMRV9QS0cgKyAiLldpcGVEYXRhVGVzdCIsIG1Qcm9maWxlVXNlcklkKTsKKyAgICAgICAgc2VuZFdpcGVQcm9maWxlQnJvYWRjYXN0KCJjb20uYW5kcm9pZC5jdHMubWFuYWdlZHByb2ZpbGUuV0lQRV9EQVRBIik7CiAgICAgICAgIC8vIE5vdGU6IHRoZSBtYW5hZ2VkIHByb2ZpbGUgaXMgcmVtb3ZlZCBieSB0aGlzIHRlc3QsIHdoaWNoIHdpbGwgbWFrZSByZW1vdmVVc2VyQ29tbWFuZCBpbgogICAgICAgICAvLyB0ZWFyRG93bigpIHRvIGNvbXBsYWluLCBidXQgdGhhdCBzaG91bGQgYmUgT0sgc2luY2UgaXRzIHJlc3VsdCBpcyBub3QgYXNzZXJ0ZWQuCiAgICAgICAgIGFzc2VydFVzZXJHZXRzUmVtb3ZlZChtUHJvZmlsZVVzZXJJZCk7CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIHNlbmRXaXBlUHJvZmlsZUJyb2FkY2FzdChTdHJpbmcgYWN0aW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGNtZCA9ICJhbSBicm9hZGNhc3QgLS1yZWNlaXZlci1mb3JlZ3JvdW5kIC0tdXNlciAiICsgbVByb2ZpbGVVc2VySWQKKyAgICAgICAgICAgICsgIiAtYSAiICsgYWN0aW9uCisgICAgICAgICAgICArICIgY29tLmFuZHJvaWQuY3RzLm1hbmFnZWRwcm9maWxlLy5XaXBlRGF0YVJlY2VpdmVyIjsKKyAgICAgICAgZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZChjbWQpOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHRlc3RMb2NrTm93V2l0aEtleUV2aWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghbUhhc0ZlYXR1cmUgfHwgIW1TdXBwb3J0c0ZiZSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIGNoYW5nZVVzZXJDcmVkZW50aWFsKCIxMjM0IiwgbnVsbCwgbVByb2ZpbGVVc2VySWQpOwotICAgICAgICBydW5EZXZpY2VUZXN0c0FzVXNlcihNQU5BR0VEX1BST0ZJTEVfUEtHLCBNQU5BR0VEX1BST0ZJTEVfUEtHICsgIi5Mb2NrTm93VGVzdCIsCi0gICAgICAgICAgICAgICAgInRlc3RMb2NrTm93V2l0aEtleUV2aWN0aW9uIiwgbVByb2ZpbGVVc2VySWQpOworICAgICAgICBsb2NrUHJvZmlsZSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBsb2NrUHJvZmlsZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgY21kID0gImFtIGJyb2FkY2FzdCAtLXJlY2VpdmVyLWZvcmVncm91bmQgLS11c2VyICIgKyBtUHJvZmlsZVVzZXJJZAorICAgICAgICAgICAgICAgICsgIiAtYSBjb20uYW5kcm9pZC5jdHMubWFuYWdlZHByb2ZpbGUuTE9DS19QUk9GSUxFIgorICAgICAgICAgICAgICAgICsgIiBjb20uYW5kcm9pZC5jdHMubWFuYWdlZHByb2ZpbGUvLkxvY2tQcm9maWxlUmVjZWl2ZXIiOworICAgICAgICBnZXREZXZpY2UoKS5leGVjdXRlU2hlbGxDb21tYW5kKGNtZCk7CiAgICAgICAgIHdhaXRVbnRpbFByb2ZpbGVMb2NrZWQoKTsKICAgICB9CiAKQEAgLTE4MCw3ICsyMjYsOTYgQEAKICAgICAgICAgICAgICAgICBUSU1FT1VUX1VTRVJfTE9DS0VEX01JTExJUyk7CiAgICAgfQogCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjMuOS4yL0MtMS0yIikKKyAgICAvKiogUHJvZmlsZSBzaG91bGQgZ2V0IGxvY2tlZCBpZiBpdCBpcyBub3QgaW4gZm9yZWdyb3VuZCBubyBtYXR0ZXIgd2hhdC4gKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0V29ya1Byb2ZpbGVUaW1lb3V0QmFja2dyb3VuZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIW1IYXNGZWF0dXJlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc2V0VXBXb3JrUHJvZmlsZVRpbWVvdXQoKTsKKworICAgICAgICBzdGFydER1bW15QWN0aXZpdHkobVByaW1hcnlVc2VySWQsIHRydWUpOworICAgICAgICBzaW11bGF0ZVVzZXJJbnRlcmFjdGlvbihQUk9GSUxFX1RJTUVPVVRfREVMQVlfTVMpOworCisgICAgICAgIHZlcmlmeU9ubHlQcm9maWxlTG9ja2VkKHRydWUpOworICAgIH0KKworICAgIC8qKiBQcm9maWxlIHNob3VsZCBnZXQgbG9ja2VkIGlmIGl0IGlzIGluIGZvcmVncm91bmQgYnV0IHdpdGggbm8gdXNlciBhY3Rpdml0eS4gKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0V29ya1Byb2ZpbGVUaW1lb3V0SWRsZUFjdGl2aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghbUhhc0ZlYXR1cmUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzZXRVcFdvcmtQcm9maWxlVGltZW91dCgpOworCisgICAgICAgIHN0YXJ0RHVtbXlBY3Rpdml0eShtUHJvZmlsZVVzZXJJZCwgZmFsc2UpOworICAgICAgICBUaHJlYWQuc2xlZXAoUFJPRklMRV9USU1FT1VUX0RFTEFZX01TKTsKKworICAgICAgICB2ZXJpZnlPbmx5UHJvZmlsZUxvY2tlZCh0cnVlKTsKKyAgICB9CisKKyAgICAvKiogVXNlciBhY3Rpdml0eSBpbiBwcm9maWxlIHNob3VsZCBwcmV2ZW50IGl0IGZyb20gbG9ja2luZy4gKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0V29ya1Byb2ZpbGVUaW1lb3V0VXNlckFjdGl2aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghbUhhc0ZlYXR1cmUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzZXRVcFdvcmtQcm9maWxlVGltZW91dCgpOworCisgICAgICAgIHN0YXJ0RHVtbXlBY3Rpdml0eShtUHJvZmlsZVVzZXJJZCwgZmFsc2UpOworICAgICAgICBzaW11bGF0ZVVzZXJJbnRlcmFjdGlvbihQUk9GSUxFX1RJTUVPVVRfREVMQVlfTVMpOworCisgICAgICAgIHZlcmlmeU9ubHlQcm9maWxlTG9ja2VkKGZhbHNlKTsKKyAgICB9CisKKyAgICAvKiogS2VlcCBzY3JlZW4gb24gd2luZG93IGZsYWcgaW4gdGhlIHByb2ZpbGUgc2hvdWxkIHByZXZlbnQgaXQgZnJvbSBsb2NraW5nLiAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RXb3JrUHJvZmlsZVRpbWVvdXRLZWVwU2NyZWVuT25XaW5kb3coKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFtSGFzRmVhdHVyZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHNldFVwV29ya1Byb2ZpbGVUaW1lb3V0KCk7CisKKyAgICAgICAgc3RhcnREdW1teUFjdGl2aXR5KG1Qcm9maWxlVXNlcklkLCB0cnVlKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKFBST0ZJTEVfVElNRU9VVF9ERUxBWV9NUyk7CisKKyAgICAgICAgdmVyaWZ5T25seVByb2ZpbGVMb2NrZWQoZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRVcFdvcmtQcm9maWxlVGltZW91dCgpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24geworICAgICAgICAvLyBTZXQgc2VwYXJhdGUgY2hhbGxlbmdlLgorICAgICAgICBjaGFuZ2VVc2VyQ3JlZGVudGlhbChQUk9GSUxFX0NSRURFTlRJQUwsIG51bGwsIG1Qcm9maWxlVXNlcklkKTsKKworICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHByb2ZpbGUgaXMgbm90IHByZW1hdHVyZWx5IGxvY2tlZC4KKyAgICAgICAgdmVyaWZ5VXNlckNyZWRlbnRpYWwoUFJPRklMRV9DUkVERU5USUFMLCBtUHJvZmlsZVVzZXJJZCk7CisgICAgICAgIHZlcmlmeU9ubHlQcm9maWxlTG9ja2VkKGZhbHNlKTsKKyAgICAgICAgLy8gU2V0IHByb2ZpbGUgdGltZW91dCB0byA1IHNlY29uZHMuCisgICAgICAgIHJ1blByb2ZpbGVUaW1lb3V0VGVzdCgidGVzdFNldFdvcmtQcm9maWxlVGltZW91dCIsIG1Qcm9maWxlVXNlcklkKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5T25seVByb2ZpbGVMb2NrZWQoYm9vbGVhbiBsb2NrZWQpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWRSZXN1bHRUZXN0ID0gbG9ja2VkID8gInRlc3REZXZpY2VMb2NrZWQiIDogInRlc3REZXZpY2VOb3RMb2NrZWQiOworICAgICAgICBydW5Qcm9maWxlVGltZW91dFRlc3QoZXhwZWN0ZWRSZXN1bHRUZXN0LCBtUHJvZmlsZVVzZXJJZCk7CisgICAgICAgIC8vIFByaW1hcnkgcHJvZmlsZSBzaG91bGRuJ3QgYmUgbG9ja2VkLgorICAgICAgICBydW5Qcm9maWxlVGltZW91dFRlc3QoInRlc3REZXZpY2VOb3RMb2NrZWQiLCBtUHJpbWFyeVVzZXJJZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNpbXVsYXRlVXNlckludGVyYWN0aW9uKGludCB0aW1lTXMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBVc2VyQWN0aXZpdHlFbXVsYXRvciBoZWxwZXIgPSBuZXcgVXNlckFjdGl2aXR5RW11bGF0b3IoZ2V0RGV2aWNlKCkpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRpbWVNczsgaSArPSB0aW1lTXMvMTApIHsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcCh0aW1lTXMvMTApOworICAgICAgICAgICAgaGVscGVyLnRhcFNjcmVlbkNlbnRlcigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJ1blByb2ZpbGVUaW1lb3V0VGVzdChTdHJpbmcgbWV0aG9kLCBpbnQgdXNlcklkKQorICAgICAgICAgICAgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7CisgICAgICAgIHJ1bkRldmljZVRlc3RzQXNVc2VyKE1BTkFHRURfUFJPRklMRV9QS0csIE1BTkFHRURfUFJPRklMRV9QS0cgKyAiLlByb2ZpbGVUaW1lb3V0VGVzdEhlbHBlciIsCisgICAgICAgICAgICAgICAgbWV0aG9kLCB1c2VySWQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzdGFydER1bW15QWN0aXZpdHkoaW50IHByb2ZpbGVVc2VySWQsIGJvb2xlYW4ga2VlcFNjcmVlbk9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZChTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICJhbSBzdGFydC1hY3Rpdml0eSAtVyAtLXVzZXIgJWQgLS1leiBrZWVwX3NjcmVlbl9vbiAlcyAlcy8uVGltZW91dEFjdGl2aXR5IiwKKyAgICAgICAgICAgICAgICBwcm9maWxlVXNlcklkLCBrZWVwU2NyZWVuT24sIE1BTkFHRURfUFJPRklMRV9QS0cpKTsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCB0ZXN0TWF4T25lTWFuYWdlZFByb2ZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgaW50IG5ld1VzZXJJZCA9IC0xOwogICAgICAgICB0cnkgewpAQCAtMjQ2LDYgKzM4MSw0MiBAQAogICAgICAgICAvLyBUT0RPOiBUZXN0IHdpdGggc3RhcnRBY3Rpdml0eQogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHRlc3REaXNhbGxvd1NoYXJpbmdJbnRvUHJvZmlsZUZyb21Qcm9maWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghbUhhc0ZlYXR1cmUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBTZXQgdXAgYWN0aXZpdGllczogUHJpbWFyeVVzZXJBY3Rpdml0eSB3aWxsIG9ubHkgYmUgZW5hYmxlZCBpbiB0aGUgcGVyc29uYWwgdXNlcgorICAgICAgICAvLyBUaGlzIGFjdGl2aXR5IGlzIHVzZWQgdG8gZmluZCBvdXQgdGhlIGdyb3VuZCB0cnV0aCBhYm91dCB0aGUgc3lzdGVtJ3MgY3Jvc3MgcHJvZmlsZQorICAgICAgICAvLyBpbnRlbnQgZm9yd2FyZGluZyBhY3Rpdml0eS4KKyAgICAgICAgZGlzYWJsZUFjdGl2aXR5Rm9yVXNlcigiUHJpbWFyeVVzZXJBY3Rpdml0eSIsIG1Qcm9maWxlVXNlcklkKTsKKworICAgICAgICAvLyBUZXN0cyBmcm9tIHRoZSBwcm9maWxlIHNpZGUKKyAgICAgICAgcnVuRGV2aWNlVGVzdHNBc1VzZXIoTUFOQUdFRF9QUk9GSUxFX1BLRywKKyAgICAgICAgICAgICAgICAiLkRpc2FsbG93U2hhcmluZ0ludG9Qcm9maWxlVGVzdCIsICJ0ZXN0U2hhcmluZ0Zyb21Qcm9maWxlIiwgbVByb2ZpbGVVc2VySWQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3REaXNhbGxvd1NoYXJpbmdJbnRvUHJvZmlsZUZyb21QZXJzb25hbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIW1IYXNGZWF0dXJlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gU2V0IHVwIGFjdGl2aXRpZXM6IE1hbmFnZWRQcm9maWxlQWN0aXZpdHkgd2lsbCBvbmx5IGJlIGVuYWJsZWQgaW4gdGhlIG1hbmFnZWQgcHJvZmlsZQorICAgICAgICAvLyBUaGlzIGFjdGl2aXR5IGlzIHVzZWQgdG8gZmluZCBvdXQgdGhlIGdyb3VuZCB0cnV0aCBhYm91dCB0aGUgc3lzdGVtJ3MgY3Jvc3MgcHJvZmlsZQorICAgICAgICAvLyBpbnRlbnQgZm9yd2FyZGluZyBhY3Rpdml0eS4KKyAgICAgICAgZGlzYWJsZUFjdGl2aXR5Rm9yVXNlcigiTWFuYWdlZFByb2ZpbGVBY3Rpdml0eSIsIG1QYXJlbnRVc2VySWQpOworCisgICAgICAgIC8vIFRlc3RzIGZyb20gdGhlIHBlcnNvbmFsIHNpZGUsIHdoaWNoIGlzIG1vc3RseSBkcml2ZW4gZnJvbSBob3N0IHNpZGUuCisgICAgICAgIHJ1bkRldmljZVRlc3RzQXNVc2VyKE1BTkFHRURfUFJPRklMRV9QS0csICIuRGlzYWxsb3dTaGFyaW5nSW50b1Byb2ZpbGVUZXN0IiwKKyAgICAgICAgICAgICAgICAidGVzdFNldFVwIiwgbVByb2ZpbGVVc2VySWQpOworICAgICAgICBydW5EZXZpY2VUZXN0c0FzVXNlcihNQU5BR0VEX1BST0ZJTEVfUEtHLCAiLkRpc2FsbG93U2hhcmluZ0ludG9Qcm9maWxlVGVzdCIsCisgICAgICAgICAgICAgICAgInRlc3REaXNhYmxlU2hhcmluZ0ludG9Qcm9maWxlIiwgbVByb2ZpbGVVc2VySWQpOworICAgICAgICBydW5EZXZpY2VUZXN0c0FzVXNlcihNQU5BR0VEX1BST0ZJTEVfUEtHLCAiLkRpc2FsbG93U2hhcmluZ0ludG9Qcm9maWxlVGVzdCIsCisgICAgICAgICAgICAgICAgInRlc3RTaGFyaW5nRnJvbVBlcnNvbmFsRmFpbHMiLCBtUGFyZW50VXNlcklkKTsKKyAgICAgICAgcnVuRGV2aWNlVGVzdHNBc1VzZXIoTUFOQUdFRF9QUk9GSUxFX1BLRywgIi5EaXNhbGxvd1NoYXJpbmdJbnRvUHJvZmlsZVRlc3QiLAorICAgICAgICAgICAgICAgICJ0ZXN0RW5hYmxlU2hhcmluZ0ludG9Qcm9maWxlIiwgbVByb2ZpbGVVc2VySWQpOworICAgICAgICBydW5EZXZpY2VUZXN0c0FzVXNlcihNQU5BR0VEX1BST0ZJTEVfUEtHLCAiLkRpc2FsbG93U2hhcmluZ0ludG9Qcm9maWxlVGVzdCIsCisgICAgICAgICAgICAgICAgInRlc3RTaGFyaW5nRnJvbVBlcnNvbmFsU3VjY2VlZHMiLCBtUGFyZW50VXNlcklkKTsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwTGlua3NfdmVyaWZpY2F0aW9uU3RhdHVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghbUhhc0ZlYXR1cmUpIHsKICAgICAgICAgICAgIHJldHVybjsKQEAgLTYxMiw3ICs3ODMsNiBAQAogICAgICAgICB9KTsKICAgICB9CiAKLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iMy45LjIvQy0xLTgiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RNYW5hZ2VkQ29udGFjdHNQb2xpY2llcygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBydW5NYW5hZ2VkQ29udGFjdHNUZXN0KG5ldyBDYWxsYWJsZTxWb2lkPigpIHsKICAgICAgICAgICAgIEBPdmVycmlkZQpAQCAtNjg5LDcgKzg1OSw2IEBACiAgICAgICAgICAgICAgICAgLypleHBlY3RGYWlsdXJlKi8gdHJ1ZSkpOwogICAgIH0KIAotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSIzLjkuMS4xL0MtMS03IikKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2Fubm90U2V0RGV2aWNlT3duZXJXaGVuUHJvZmlsZVByZXNlbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFtSGFzRmVhdHVyZSkgewogICAgICAgICAgICAgcmV0dXJuOwpAQCAtOTkwLDggKzExNTksOCBAQAogICAgICAgICB9CiAKICAgICAgICAgcnVuRGV2aWNlVGVzdHNBc1VzZXIoTUFOQUdFRF9QUk9GSUxFX1BLRywgIi5SZXNldFBhc3N3b3JkV2l0aFRva2VuVGVzdCIsCi0gICAgICAgICAgICAgICAgInRlc3RTZXR1cFdvcmtQcm9maWxlQW5kTG9jayIsIG1Qcm9maWxlVXNlcklkKTsKLSAgICAgICAgd2FpdFVudGlsUHJvZmlsZUxvY2tlZCgpOworICAgICAgICAgICAgICAgICJ0ZXN0U2V0dXBXb3JrUHJvZmlsZSIsIG1Qcm9maWxlVXNlcklkKTsKKyAgICAgICAgbG9ja1Byb2ZpbGUoKTsKICAgICAgICAgcnVuRGV2aWNlVGVzdHNBc1VzZXIoTUFOQUdFRF9QUk9GSUxFX1BLRywgIi5SZXNldFBhc3N3b3JkV2l0aFRva2VuVGVzdCIsCiAgICAgICAgICAgICAgICAgInRlc3RSZXNldFBhc3N3b3JkQmVmb3JlVW5sb2NrIiwgbVByb2ZpbGVVc2VySWQpOwogICAgICAgICAvLyBQYXNzd29yZCBuZWVkcyB0byBiZSBpbiBzeW5jIHdpdGggUmVzZXRQYXNzd29yZFdpdGhUb2tlblRlc3QuUEFTU1dPUkQxCkBAIC0xMDE3LDEwICsxMTg2LDcgQEAKICAgICAgICAgICAgIGNoYW5nZVVzZXJDcmVkZW50aWFsKGRldmljZVBhc3N3b3JkLCBudWxsLCBtUGFyZW50VXNlcklkKTsKICAgICAgICAgICAgIGNoYW5nZVVzZXJDcmVkZW50aWFsKG51bGwsIGRldmljZVBhc3N3b3JkLCBtUGFyZW50VXNlcklkKTsKICAgICAgICAgICAgIGNoYW5nZVVzZXJDcmVkZW50aWFsKGRldmljZVBhc3N3b3JkLCBudWxsLCBtUGFyZW50VXNlcklkKTsKLQotICAgICAgICAgICAgcnVuRGV2aWNlVGVzdHNBc1VzZXIoTUFOQUdFRF9QUk9GSUxFX1BLRywgIi5SZXNldFBhc3N3b3JkV2l0aFRva2VuVGVzdCIsCi0gICAgICAgICAgICAgICAgICAgICJ0ZXN0TG9ja1dvcmtQcm9maWxlIiwgbVByb2ZpbGVVc2VySWQpOwotICAgICAgICAgICAgd2FpdFVudGlsUHJvZmlsZUxvY2tlZCgpOworICAgICAgICAgICAgbG9ja1Byb2ZpbGUoKTsKICAgICAgICAgICAgIHJ1bkRldmljZVRlc3RzQXNVc2VyKE1BTkFHRURfUFJPRklMRV9QS0csICIuUmVzZXRQYXNzd29yZFdpdGhUb2tlblRlc3QiLAogICAgICAgICAgICAgICAgICAgICAidGVzdFJlc2V0UGFzc3dvcmRCZWZvcmVVbmxvY2siLCBtUHJvZmlsZVVzZXJJZCk7CiAgICAgICAgICAgICB2ZXJpZnlVc2VyQ3JlZGVudGlhbChSRVNFVF9QQVNTV09SRF9URVNUX0RFRkFVTFRfUEFTU1dPUkQsIG1Qcm9maWxlVXNlcklkKTsKQEAgLTEwMjgsMTEgKzExOTQsMzMgQEAKICAgICAgICAgICAgIGNoYW5nZVVzZXJDcmVkZW50aWFsKG51bGwsIGRldmljZVBhc3N3b3JkLCBtUGFyZW50VXNlcklkKTsKICAgICAgICAgICAgIC8vIEN5Y2xlIHRoZSBkZXZpY2Ugc2NyZWVuIHRvIGZsdXNoIHN0YWxlIHBhc3N3b3JkIGluZm9ybWF0aW9uIGZyb20ga2V5Z3VhcmQsCiAgICAgICAgICAgICAvLyBvdGhlcndpc2UgaXQgd2lsbCBzdGlsbCBhc2sgZm9yIHRoZSBub24tZXhpc3RlbnQgcGFzc3dvcmQuCisgICAgICAgICAgICAvLyByZXR1cm4gc2NyZWVuIHRvIGJlIG9uIGZvciBjdHMgdGVzdCBydW5zCiAgICAgICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKCJpbnB1dCBrZXlldmVudCBLRVlDT0RFX1dBS0VVUCIpOwogICAgICAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZCgiaW5wdXQga2V5ZXZlbnQgS0VZQ09ERV9TTEVFUCIpOworICAgICAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZCgiaW5wdXQga2V5ZXZlbnQgS0VZQ09ERV9XQUtFVVAiKTsKICAgICAgICAgfQogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHRlc3RJc1VzaW5nVW5pZmllZFBhc3N3b3JkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghbUhhc0ZlYXR1cmUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZyZXNobHkgY3JlYXRlZCBwcm9maWxlIHByb2ZpbGUgaGFzIG5vIHNlcGFyYXRlIGNoYWxsZW5nZS4KKyAgICAgICAgdmVyaWZ5VW5pZmllZFBhc3N3b3JkKHRydWUpOworCisgICAgICAgIC8vIFNldCBzZXBhcmF0ZSBjaGFsbGVuZ2UgYW5kIHZlcmlmeSB0aGF0IHRoZSBBUEkgcmVwb3J0cyBpdCBjb3JyZWN0bHkuCisgICAgICAgIGNoYW5nZVVzZXJDcmVkZW50aWFsKCIxMjM0IiAvKiBuZXdDcmVkZW50aWFsICovLCBudWxsIC8qIG9sZENyZWRlbnRpYWwgKi8sIG1Qcm9maWxlVXNlcklkKTsKKyAgICAgICAgdmVyaWZ5VW5pZmllZFBhc3N3b3JkKGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5VW5pZmllZFBhc3N3b3JkKGJvb2xlYW4gdW5pZmllZCkgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyB0ZXN0TWV0aG9kID0KKyAgICAgICAgICAgICAgICB1bmlmaWVkID8gInRlc3RVc2luZ1VuaWZpZWRQYXNzd29yZCIgOiAidGVzdE5vdFVzaW5nVW5pZmllZFBhc3N3b3JkIjsKKyAgICAgICAgcnVuRGV2aWNlVGVzdHNBc1VzZXIoTUFOQUdFRF9QUk9GSUxFX1BLRywgIi5Jc1VzaW5nVW5pZmllZFBhc3N3b3JkVGVzdCIsCisgICAgICAgICAgICAgICAgdGVzdE1ldGhvZCwgbVByb2ZpbGVVc2VySWQpOworICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCBkaXNhYmxlQWN0aXZpdHlGb3JVc2VyKFN0cmluZyBhY3Rpdml0eU5hbWUsIGludCB1c2VySWQpCiAgICAgICAgICAgICB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIGNvbW1hbmQgPSAiYW0gc3RhcnQgLVcgLS11c2VyICIgKyB1c2VySWQKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlcG9saWN5L01peGVkRGV2aWNlT3duZXJIb3N0U2lkZVRyYW5zZmVyVGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vwb2xpY3kvTWl4ZWREZXZpY2VPd25lckhvc3RTaWRlVHJhbnNmZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FlZmMzMwotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlcG9saWN5L01peGVkRGV2aWNlT3duZXJIb3N0U2lkZVRyYW5zZmVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuY3RzLmRldmljZXBvbGljeTsKKworLyoqCisgKiBUZXN0cyB0aGUgRFBDIHRyYW5zZmVyIGZ1bmN0aW9uYWxpdHkgZm9yIGRldmljZSBvd25lci4gVGVzdGluZyBpcyBkb25lIGJ5IGhhdmluZyB0d28gZHVtbXkgRFBDcywKKyAqIEN0c1RyYW5zZmVyT3duZXJPdXRnb2luZ0FwcCBhbmQgQ3RzVHJhbnNmZXJPd25lckluY29taW5nQXBwLiBUaGUgZm9ybWVyIGlzIHRoZSBjdXJyZW50IERQQworICogYW5kIHRoZSBsYXR0ZXIgd2lsbCBiZSB0aGUgbmV3IERQQyBhZnRlciB0cmFuc2Zlci4gSW4gb3JkZXIgdG8gcnVuIHRoZSB0ZXN0cyBmcm9tIHRoZSBjb3JyZWN0CisgKiBwcm9jZXNzLCBmaXJzdCB3ZSBzZXR1cCBzb21lIHBvbGljaWVzIGluIHRoZSBjbGllbnQgc2lkZSBpbiBDdHNUcmFuc2Zlck93bmVyT3V0Z29pbmdBcHAgYW5kIHRoZW4KKyAqIHdlIHZlcmlmeSB0aGUgcG9saWNpZXMgYXJlIHN0aWxsIHRoZXJlIGluIEN0c1RyYW5zZmVyT3duZXJJbmNvbWluZ0FwcC4KKyAqLworcHVibGljIGNsYXNzIE1peGVkRGV2aWNlT3duZXJIb3N0U2lkZVRyYW5zZmVyVGVzdCBleHRlbmRzCisgICAgICAgIERldmljZUFuZFByb2ZpbGVPd25lckhvc3RTaWRlVHJhbnNmZXJUZXN0IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBTlNGRVJfREVWSUNFX09XTkVSX09VVEdPSU5HX1RFU1QgPQorICAgICAgICAgICAgImNvbS5hbmRyb2lkLmN0cy50cmFuc2Zlcm93bmVyLlRyYW5zZmVyRGV2aWNlT3duZXJPdXRnb2luZ1Rlc3QiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFOU0ZFUl9ERVZJQ0VfT1dORVJfSU5DT01JTkdfVEVTVCA9CisgICAgICAgICAgICAiY29tLmFuZHJvaWQuY3RzLnRyYW5zZmVyb3duZXIuVHJhbnNmZXJEZXZpY2VPd25lckluY29taW5nVGVzdCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBTlNGRVJfUFJPRklMRV9PV05FUl9PVVRHT0lOR19URVNUID0KKyAgICAgICAgICAgICJjb20uYW5kcm9pZC5jdHMudHJhbnNmZXJvd25lci5UcmFuc2ZlclByb2ZpbGVPd25lck91dGdvaW5nVGVzdCI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICBpZiAobUhhc0ZlYXR1cmUpIHsKKyAgICAgICAgICAgIGluc3RhbGxBcHBBc1VzZXIoVFJBTlNGRVJfT1dORVJfT1VUR09JTkdfQVBLLCBtUHJpbWFyeVVzZXJJZCk7CisgICAgICAgICAgICBpZiAoc2V0RGV2aWNlT3duZXIoVFJBTlNGRVJfT1dORVJfT1VUR09JTkdfVEVTVF9SRUNFSVZFUiwgbVByaW1hcnlVc2VySWQsCisgICAgICAgICAgICAgICAgICAgIGZhbHNlKSkgeworICAgICAgICAgICAgICAgIHNldHVwVGVzdFBhcmFtZXRlcnMobVByaW1hcnlVc2VySWQsIFRSQU5TRkVSX0RFVklDRV9PV05FUl9PVVRHT0lOR19URVNULAorICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNGRVJfREVWSUNFX09XTkVSX0lOQ09NSU5HX1RFU1QpOworICAgICAgICAgICAgICAgIGluc3RhbGxBcHBBc1VzZXIoVFJBTlNGRVJfT1dORVJfSU5DT01JTkdfQVBLLCBtVXNlcklkKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVtb3ZlQWRtaW4oVFJBTlNGRVJfT1dORVJfT1VUR09JTkdfVEVTVF9SRUNFSVZFUiwgbVVzZXJJZCk7CisgICAgICAgICAgICAgICAgZ2V0RGV2aWNlKCkudW5pbnN0YWxsUGFja2FnZShUUkFOU0ZFUl9PV05FUl9PVVRHT0lOR19QS0cpOworICAgICAgICAgICAgICAgIGZhaWwoIkZhaWxlZCB0byBzZXQgZGV2aWNlIG93bmVyIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJhbnNmZXJBZmZpbGlhdGVkUHJvZmlsZU93bmVyc2hpcENvbXBsZXRlQ2FsbGJhY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFtSGFzRmVhdHVyZSB8fCAhaGFzRGV2aWNlRmVhdHVyZSgiYW5kcm9pZC5zb2Z0d2FyZS5tYW5hZ2VkX3VzZXJzIikpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBpbnQgcHJvZmlsZVVzZXJJZCA9IHNldHVwTWFuYWdlZFByb2ZpbGVPbkRldmljZU93bmVyKFRSQU5TRkVSX09XTkVSX09VVEdPSU5HX0FQSywKKyAgICAgICAgICAgICAgICBUUkFOU0ZFUl9PV05FUl9PVVRHT0lOR19URVNUX1JFQ0VJVkVSKTsKKworICAgICAgICBzZXRTYW1lQWZmaWxpYXRpb25JZChwcm9maWxlVXNlcklkLCBtT3V0Z29pbmdUZXN0Q2xhc3NOYW1lKTsKKworICAgICAgICBpbnN0YWxsQXBwQXNVc2VyKFRSQU5TRkVSX09XTkVSX0lOQ09NSU5HX0FQSywgcHJvZmlsZVVzZXJJZCk7CisKKyAgICAgICAgcnVuRGV2aWNlVGVzdHNBc1VzZXIoVFJBTlNGRVJfT1dORVJfT1VUR09JTkdfUEtHLAorICAgICAgICAgICAgICAgIFRSQU5TRkVSX1BST0ZJTEVfT1dORVJfT1VUR09JTkdfVEVTVCwKKyAgICAgICAgICAgICAgICAidGVzdFRyYW5zZmVyT3duZXJzaGlwIiwgcHJvZmlsZVVzZXJJZCk7CisKKyAgICAgICAgd2FpdEZvckJyb2FkY2FzdElkbGUoKTsKKworICAgICAgICBydW5EZXZpY2VUZXN0c0FzVXNlcihUUkFOU0ZFUl9PV05FUl9PVVRHT0lOR19QS0csCisgICAgICAgICAgICAgICAgbU91dGdvaW5nVGVzdENsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAidGVzdFRyYW5zZmVyQWZmaWxpYXRlZFByb2ZpbGVPd25lcnNoaXBDb21wbGV0ZUNhbGxiYWNrSXNDYWxsZWQiLAorICAgICAgICAgICAgICAgIG1Vc2VySWQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RUcmFuc2ZlckFmZmlsaWF0ZWRQcm9maWxlT3duZXJzaGlwSW5Db21wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghbUhhc0ZlYXR1cmUgfHwgIWhhc0RldmljZUZlYXR1cmUoImFuZHJvaWQuc29mdHdhcmUubWFuYWdlZF91c2VycyIpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgaW50IHByb2ZpbGVVc2VySWQgPSBzZXR1cE1hbmFnZWRQcm9maWxlT25EZXZpY2VPd25lcihUUkFOU0ZFUl9PV05FUl9PVVRHT0lOR19BUEssCisgICAgICAgICAgICAgICAgVFJBTlNGRVJfT1dORVJfT1VUR09JTkdfVEVTVF9SRUNFSVZFUik7CisKKyAgICAgICAgc2V0U2FtZUFmZmlsaWF0aW9uSWQocHJvZmlsZVVzZXJJZCwgbU91dGdvaW5nVGVzdENsYXNzTmFtZSk7CisKKyAgICAgICAgaW5zdGFsbEFwcEFzVXNlcihUUkFOU0ZFUl9PV05FUl9JTkNPTUlOR19BUEssIHByb2ZpbGVVc2VySWQpOworCisgICAgICAgIHJ1bkRldmljZVRlc3RzQXNVc2VyKFRSQU5TRkVSX09XTkVSX09VVEdPSU5HX1BLRywKKyAgICAgICAgICAgICAgICBUUkFOU0ZFUl9QUk9GSUxFX09XTkVSX09VVEdPSU5HX1RFU1QsCisgICAgICAgICAgICAgICAgInRlc3RUcmFuc2Zlck93bmVyc2hpcCIsIHByb2ZpbGVVc2VySWQpOworICAgICAgICB3YWl0Rm9yQnJvYWRjYXN0SWRsZSgpOworCisgICAgICAgIHJ1bkRldmljZVRlc3RzQXNVc2VyKFRSQU5TRkVSX09XTkVSX09VVEdPSU5HX1BLRywKKyAgICAgICAgICAgICAgICBtT3V0Z29pbmdUZXN0Q2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICJ0ZXN0VHJhbnNmZXJPd25lcnNoaXAiLCBtVXNlcklkKTsKKyAgICAgICAgd2FpdEZvckJyb2FkY2FzdElkbGUoKTsKKworICAgICAgICBhc3NlcnRBZmZpbGlhdGlvbklkc0FyZUludGFjdChwcm9maWxlVXNlcklkLCBtSW5jb21pbmdUZXN0Q2xhc3NOYW1lKTsKKworICAgICAgICBydW5EZXZpY2VUZXN0c0FzVXNlcihUUkFOU0ZFUl9PV05FUl9PVVRHT0lOR19QS0csCisgICAgICAgICAgICAgICAgbU91dGdvaW5nVGVzdENsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAidGVzdFRyYW5zZmVyQWZmaWxpYXRlZFByb2ZpbGVPd25lcnNoaXBDb21wbGV0ZUNhbGxiYWNrSXNDYWxsZWQiLAorICAgICAgICAgICAgICAgIG1Vc2VySWQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRBZmZpbGlhdGlvbklkc0FyZUludGFjdChpbnQgcHJvZmlsZVVzZXJJZCwKKyAgICAgICAgICAgIFN0cmluZyB0ZXN0Q2xhc3NOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcnVuRGV2aWNlVGVzdHNBc1VzZXIoVFJBTlNGRVJfT1dORVJfSU5DT01JTkdfUEtHLAorICAgICAgICAgICAgICAgIHRlc3RDbGFzc05hbWUsCisgICAgICAgICAgICAgICAgInRlc3RJc0FmZmlsaWF0aW9uSWQxIiwgbVByaW1hcnlVc2VySWQpOworICAgICAgICBydW5EZXZpY2VUZXN0c0FzVXNlcihUUkFOU0ZFUl9PV05FUl9JTkNPTUlOR19QS0csCisgICAgICAgICAgICAgICAgdGVzdENsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAidGVzdElzQWZmaWxpYXRpb25JZDEiLCBwcm9maWxlVXNlcklkKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0U2FtZUFmZmlsaWF0aW9uSWQoaW50IHByb2ZpbGVVc2VySWQsIFN0cmluZyB0ZXN0Q2xhc3NOYW1lKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJ1bkRldmljZVRlc3RzQXNVc2VyKFRSQU5TRkVSX09XTkVSX09VVEdPSU5HX1BLRywKKyAgICAgICAgICAgICAgICB0ZXN0Q2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICJ0ZXN0U2V0QWZmaWxpYXRpb25JZDEiLCBtUHJpbWFyeVVzZXJJZCk7CisgICAgICAgIHJ1bkRldmljZVRlc3RzQXNVc2VyKFRSQU5TRkVSX09XTkVSX09VVEdPSU5HX1BLRywKKyAgICAgICAgICAgICAgICB0ZXN0Q2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICJ0ZXN0U2V0QWZmaWxpYXRpb25JZDEiLCBwcm9maWxlVXNlcklkKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZXBvbGljeS9NaXhlZE1hbmFnZWRQcm9maWxlT3duZXJUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZXBvbGljeS9NaXhlZE1hbmFnZWRQcm9maWxlT3duZXJUZXN0LmphdmEKaW5kZXggNmNlZGJhNS4uYjM5ZTFhZCAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vwb2xpY3kvTWl4ZWRNYW5hZ2VkUHJvZmlsZU93bmVyVGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlcG9saWN5L01peGVkTWFuYWdlZFByb2ZpbGVPd25lclRlc3QuamF2YQpAQCAtMTY1LDQgKzE2NSw5IEBACiAgICAgICAgIC8vIE1peGVkUHJvZmlsZU93bmVyVGVzdAogICAgICAgICBleGVjdXRlUmVzZXRQYXNzd29yZFdpdGhUb2tlblRlc3RzKGZhbHNlKTsKICAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0U3lzdGVtU2V0dGluZygpIHsKKyAgICAgICAgLy8gTWFuYWdlZCBwcm9maWxlIG93bmVyIGNhbm5vdCBzZXQgY3VycmVudGx5IHdoaXRlbGlzdGVkIHN5c3RlbSBzZXR0aW5ncy4KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZXBvbGljeS9NaXhlZE1hbmFnZWRQcm9maWxlT3duZXJUZXN0QXBpMjUuamF2YSBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlcG9saWN5L01peGVkTWFuYWdlZFByb2ZpbGVPd25lclRlc3RBcGkyNS5qYXZhCmluZGV4IDIzMzI0YTMuLmZkNWIyYmYgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlcG9saWN5L01peGVkTWFuYWdlZFByb2ZpbGVPd25lclRlc3RBcGkyNS5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlcG9saWN5L01peGVkTWFuYWdlZFByb2ZpbGVPd25lclRlc3RBcGkyNS5qYXZhCkBAIC03OSw2ICs3OSw5IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAorICAgICAgICAvLyBNYWtlIHN1cmUgdXNlciBpbml0aWFsaXphdGlvbiBpcyBjb21wbGV0ZSBiZWZvcmUgcHJvY2VlZGluZy4KKyAgICAgICAgd2FpdEZvckJyb2FkY2FzdElkbGUoKTsKKwogICAgICAgICAvLyBMb2NrIEZCRSBhbmQgdmVyaWZ5IHJlc2V0UGFzc3dvcmQgaXMgZGlzYWJsZWQKICAgICAgICAgZXhlY3V0ZURldmljZVRlc3RNZXRob2QoRkJFX0hFTFBFUl9DTEFTUywgInRlc3RTZXRQYXNzd29yZCIpOwogICAgICAgICByZWJvb3RBbmRXYWl0VW50aWxSZWFkeSgpOwpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vwb2xpY3kvTWl4ZWRQcm9maWxlT3duZXJIb3N0U2lkZVRyYW5zZmVyVGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vwb2xpY3kvTWl4ZWRQcm9maWxlT3duZXJIb3N0U2lkZVRyYW5zZmVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNDNmYjEKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZXBvbGljeS9NaXhlZFByb2ZpbGVPd25lckhvc3RTaWRlVHJhbnNmZXJUZXN0LmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5kZXZpY2Vwb2xpY3k7CisKKy8qKgorICogVGVzdHMgdGhlIERQQyB0cmFuc2ZlciBmdW5jdGlvbmFsaXR5IGZvciBwcm9maWxlIG93bmVyLiBUZXN0aW5nIGlzIGRvbmUgYnkgaGF2aW5nIHR3byBkdW1teSBEUENzLAorICogQ3RzVHJhbnNmZXJPd25lck91dGdvaW5nQXBwIGFuZCBDdHNUcmFuc2Zlck93bmVySW5jb21pbmdBcHAuIFRoZSBmb3JtZXIgaXMgdGhlIGN1cnJlbnQgRFBDCisgKiBhbmQgdGhlIGxhdHRlciB3aWxsIGJlIHRoZSBuZXcgRFBDIGFmdGVyIHRyYW5zZmVyLiBJbiBvcmRlciB0byBydW4gdGhlIHRlc3RzIGZyb20gdGhlIGNvcnJlY3QKKyAqIHByb2Nlc3MsIGZpcnN0IHdlIHNldHVwIHNvbWUgcG9saWNpZXMgaW4gdGhlIGNsaWVudCBzaWRlIGluIEN0c1RyYW5zZmVyT3duZXJPdXRnb2luZ0FwcCBhbmQgdGhlbgorICogd2UgdmVyaWZ5IHRoZSBwb2xpY2llcyBhcmUgc3RpbGwgdGhlcmUgaW4gQ3RzVHJhbnNmZXJPd25lckluY29taW5nQXBwLgorICovCitwdWJsaWMgY2xhc3MgTWl4ZWRQcm9maWxlT3duZXJIb3N0U2lkZVRyYW5zZmVyVGVzdCBleHRlbmRzCisgICAgICAgIERldmljZUFuZFByb2ZpbGVPd25lckhvc3RTaWRlVHJhbnNmZXJUZXN0IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBTlNGRVJfUFJPRklMRV9PV05FUl9PVVRHT0lOR19URVNUID0KKyAgICAgICAgICAgICJjb20uYW5kcm9pZC5jdHMudHJhbnNmZXJvd25lci5UcmFuc2ZlclByb2ZpbGVPd25lck91dGdvaW5nVGVzdCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQU5TRkVSX1BST0ZJTEVfT1dORVJfSU5DT01JTkdfVEVTVCA9CisgICAgICAgICAgICAiY29tLmFuZHJvaWQuY3RzLnRyYW5zZmVyb3duZXIuVHJhbnNmZXJQcm9maWxlT3duZXJJbmNvbWluZ1Rlc3QiOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgLy8gV2UgbmVlZCBtYW5hZ2VkIHVzZXJzIHRvIGJlIHN1cHBvcnRlZCBpbiBvcmRlciB0byBjcmVhdGUgYSBwcm9maWxlIG9mIHRoZSB1c2VyIG93bmVyLgorICAgICAgICBtSGFzRmVhdHVyZSAmPSBoYXNEZXZpY2VGZWF0dXJlKCJhbmRyb2lkLnNvZnR3YXJlLm1hbmFnZWRfdXNlcnMiKTsKKyAgICAgICAgaWYgKG1IYXNGZWF0dXJlKSB7CisgICAgICAgICAgICBpbnQgcHJvZmlsZU93bmVyVXNlcklkID0gc2V0dXBNYW5hZ2VkUHJvZmlsZShUUkFOU0ZFUl9PV05FUl9PVVRHT0lOR19BUEssCisgICAgICAgICAgICAgICAgICAgIFRSQU5TRkVSX09XTkVSX09VVEdPSU5HX1RFU1RfUkVDRUlWRVIpOworICAgICAgICAgICAgaWYgKHByb2ZpbGVPd25lclVzZXJJZCAhPSAtMSkgeworICAgICAgICAgICAgICAgIHNldHVwVGVzdFBhcmFtZXRlcnMocHJvZmlsZU93bmVyVXNlcklkLCBUUkFOU0ZFUl9QUk9GSUxFX09XTkVSX09VVEdPSU5HX1RFU1QsCisgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU0ZFUl9QUk9GSUxFX09XTkVSX0lOQ09NSU5HX1RFU1QpOworICAgICAgICAgICAgICAgIGluc3RhbGxBcHBBc1VzZXIoVFJBTlNGRVJfT1dORVJfSU5DT01JTkdfQVBLLCBtVXNlcklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlcG9saWN5L1Byb2ZpbGVPd25lclRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlcG9saWN5L1Byb2ZpbGVPd25lclRlc3QuamF2YQppbmRleCA0ZjcyMTg2Li5lOWZlYjNlIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZXBvbGljeS9Qcm9maWxlT3duZXJUZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vwb2xpY3kvUHJvZmlsZU93bmVyVGVzdC5qYXZhCkBAIC02Nyw2ICs2NywxMyBAQAogICAgICAgICBleGVjdXRlUHJvZmlsZU93bmVyVGVzdCgiQWRtaW5BY3Rpb25Cb29ra2VlcGluZ1Rlc3QiKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwVXNhZ2VPYnNlcnZlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIW1IYXNGZWF0dXJlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZXhlY3V0ZVByb2ZpbGVPd25lclRlc3QoIkFwcFVzYWdlT2JzZXJ2ZXJUZXN0Iik7CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKG1IYXNGZWF0dXJlKSB7CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZXBvbGljeS9RdWlldE1vZGVIb3N0c2lkZVRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlcG9saWN5L1F1aWV0TW9kZUhvc3RzaWRlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwM2FlM2YKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZXBvbGljeS9RdWlldE1vZGVIb3N0c2lkZVRlc3QuamF2YQpAQCAtMCwwICsxLDc2IEBACitwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5kZXZpY2Vwb2xpY3k7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIENUUyB0byB2ZXJpZnkgdG9nZ2xpbmcgcXVpZXQgbW9kZSBpbiB3b3JrIHByb2ZpbGUgYnkgdXNpbmcKKyAqIHtAbGluayBhbmRyb2lkLm9zLlVzZXJNYW5hZ2VyI3JlcXVlc3RRdWlldE1vZGVFbmFibGVkKGJvb2xlYW4sIGFuZHJvaWQub3MuVXNlckhhbmRsZSl9LgorICovCitwdWJsaWMgY2xhc3MgUXVpZXRNb2RlSG9zdHNpZGVUZXN0IGV4dGVuZHMgQmFzZURldmljZVBvbGljeVRlc3QgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1BBQ0tBR0UgPSAiY29tLmFuZHJvaWQuY3RzLmxhdW5jaGVydGVzdHMiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0NMQVNTID0gIi5RdWlldE1vZGVUZXN0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVEFSR0VUX1VTRVIgPSAiVEFSR0VUX1VTRVIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9PUklHSU5BTF9ERUZBVUxUX0xBVU5DSEVSID0gIk9SSUdJTkFMX0RFRkFVTFRfTEFVTkNIRVIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0FQSyA9ICJDdHNMYXVuY2hlckFwcHNUZXN0cy5hcGsiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfTEFVTkNIRVJfUEFDS0FHRSA9ICJjb20uYW5kcm9pZC5jdHMubGF1bmNoZXJ0ZXN0cy5zdXBwb3J0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9MQVVOQ0hFUl9BUEsgPSAiQ3RzTGF1bmNoZXJBcHBzVGVzdHNTdXBwb3J0LmFwayI7CisKKyAgICBwcml2YXRlIGludCBtUHJvZmlsZUlkOworICAgIHByaXZhdGUgU3RyaW5nIG1PcmlnaW5hbExhdW5jaGVyOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKworICAgICAgICBtSGFzRmVhdHVyZSA9IG1IYXNGZWF0dXJlICYgaGFzRGV2aWNlRmVhdHVyZSgiYW5kcm9pZC5zb2Z0d2FyZS5tYW5hZ2VkX3VzZXJzIik7CisKKyAgICAgICAgaWYobUhhc0ZlYXR1cmUpIHsKKyAgICAgICAgICAgIG1PcmlnaW5hbExhdW5jaGVyID0gZ2V0RGVmYXVsdExhdW5jaGVyKCk7CisKKyAgICAgICAgICAgIGluc3RhbGxBcHBBc1VzZXIoVEVTVF9BUEssIG1QcmltYXJ5VXNlcklkKTsKKyAgICAgICAgICAgIGluc3RhbGxBcHBBc1VzZXIoVEVTVF9MQVVOQ0hFUl9BUEssIG1QcmltYXJ5VXNlcklkKTsKKworICAgICAgICAgICAgY3JlYXRlQW5kU3RhcnRNYW5hZ2VkUHJvZmlsZSgpOworICAgICAgICAgICAgaW5zdGFsbEFwcEFzVXNlcihURVNUX0FQSywgbVByb2ZpbGVJZCk7CisKKyAgICAgICAgICAgIHdhaXRGb3JCcm9hZGNhc3RJZGxlKCk7CisgICAgICAgICAgICB3YWtldXBBbmREaXNtaXNzS2V5Z3VhcmQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChtSGFzRmVhdHVyZSkgeworICAgICAgICAgICAgZ2V0RGV2aWNlKCkudW5pbnN0YWxsUGFja2FnZShURVNUX1BBQ0tBR0UpOworICAgICAgICAgICAgZ2V0RGV2aWNlKCkudW5pbnN0YWxsUGFja2FnZShURVNUX0xBVU5DSEVSX1BBQ0tBR0UpOworICAgICAgICB9CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFF1aWV0TW9kZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIW1IYXNGZWF0dXJlKSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHJ1bkRldmljZVRlc3RzQXNVc2VyKAorICAgICAgICAgICAgICAgIFRFU1RfUEFDS0FHRSwKKyAgICAgICAgICAgICAgICBURVNUX0NMQVNTLAorICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgbVByaW1hcnlVc2VySWQsCisgICAgICAgICAgICAgICAgY3JlYXRlUGFyYW1zKG1Qcm9maWxlSWQpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlQW5kU3RhcnRNYW5hZ2VkUHJvZmlsZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtUHJvZmlsZUlkID0gY3JlYXRlTWFuYWdlZFByb2ZpbGUobVByaW1hcnlVc2VySWQpOworICAgICAgICBzd2l0Y2hVc2VyKG1QcmltYXJ5VXNlcklkKTsKKyAgICAgICAgc3RhcnRVc2VyKG1Qcm9maWxlSWQpOworICAgIH0KKworICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBjcmVhdGVQYXJhbXMoaW50IHRhcmdldFVzZXJJZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1zID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBwYXJhbXMucHV0KFBBUkFNX1RBUkdFVF9VU0VSLCBJbnRlZ2VyLnRvU3RyaW5nKGdldFVzZXJTZXJpYWxOdW1iZXIodGFyZ2V0VXNlcklkKSkpOworICAgICAgICBwYXJhbXMucHV0KFBBUkFNX09SSUdJTkFMX0RFRkFVTFRfTEFVTkNIRVIsIG1PcmlnaW5hbExhdW5jaGVyKTsKKyAgICAgICAgcmV0dXJuIHBhcmFtczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RldmljZXBvbGljeS9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZXBvbGljeS9Vc2VyQWN0aXZpdHlFbXVsYXRvci5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vwb2xpY3kvVXNlckFjdGl2aXR5RW11bGF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWZjZjRlCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vwb2xpY3kvVXNlckFjdGl2aXR5RW11bGF0b3IuamF2YQpAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5jdHMuZGV2aWNlcG9saWN5OworCitpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLkRldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuSVRlc3REZXZpY2U7CisKKy8qKgorICogSGVscGVyIHRvIHNpbXVsYXRlIHVzZXIgYWN0aXZpdHkgb24gdGhlIGRldmljZS4KKyAqLworY2xhc3MgVXNlckFjdGl2aXR5RW11bGF0b3IgeworICAgIHByaXZhdGUgZmluYWwgaW50IG1XaWR0aDsKKyAgICBwcml2YXRlIGZpbmFsIGludCBtSGVpZ2h0OworICAgIHByaXZhdGUgZmluYWwgSVRlc3REZXZpY2UgbURldmljZTsKKworICAgIHB1YmxpYyBVc2VyQWN0aXZpdHlFbXVsYXRvcihJVGVzdERldmljZSBkZXZpY2UpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24geworICAgICAgICAvLyBGaWd1cmUgb3V0IHNjcmVlbiBzaXplLiBPdXRwdXQgaXMgc29tZXRoaW5nIGxpa2UgIlBoeXNpY2FsIHNpemU6IDE0NDB4Mjg4MCIuCisgICAgICAgIG1EZXZpY2UgPSBkZXZpY2U7CisgICAgICAgIFN0cmluZyBvdXRwdXRTdHJpbmcgPSBtRGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQgICgid20gc2l6ZSIpOworCisgICAgICAgIC8vIEluIGNhc2UgdGhhdCAiT3ZlcnJpZGUgc2l6ZSIgZm9sbG93cyBieSBzZXBhcmF0b3IgbGlrZSAKKyAgICAgICAgLy8gIlBoeXNpY2FsIHNpemU6IDE0NDB4Mjk2MFxuT3ZlcnJpZGUgc2l6ZTogMTA4MHgyMjIwIgorICAgICAgICBpZiAob3V0cHV0U3RyaW5nLmNvbnRhaW5zKCJPdmVycmlkZSIpKSB7CisgICAgICAgICAgICBvdXRwdXRTdHJpbmcgPSBvdXRwdXRTdHJpbmcuc3BsaXQoU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpKVsxXTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFN0cmluZyBvdXRwdXQgPSBvdXRwdXRTdHJpbmc7CisgICAgICAgIGZpbmFsIFN0cmluZ1tdIHNpemVzID0gb3V0cHV0LnNwbGl0KCIgIilbMl0uc3BsaXQoIngiKTsKKyAgICAgICAgbVdpZHRoID0gSW50ZWdlci52YWx1ZU9mKHNpemVzWzBdLnRyaW0oKSk7CisgICAgICAgIG1IZWlnaHQgPSBJbnRlZ2VyLnZhbHVlT2Yoc2l6ZXNbMV0udHJpbSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0YXBTY3JlZW5DZW50ZXIoKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKKyAgICAgICAgbURldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKFN0cmluZy5mb3JtYXQoImlucHV0IHRhcCAlZCAlZCIsIG1XaWR0aCAvIDIsIG1IZWlnaHQgLyAyKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXZpY2Vwb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2Vwb2xpY3kvY3Jvc3Nwcm9maWxlL0Nyb3NzUHJvZmlsZUFwcHNNYW5hZ2VkUHJvZmlsZVRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlcG9saWN5L2Nyb3NzcHJvZmlsZS9Dcm9zc1Byb2ZpbGVBcHBzTWFuYWdlZFByb2ZpbGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YwMmFlZgotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlcG9saWN5L2Nyb3NzcHJvZmlsZS9Dcm9zc1Byb2ZpbGVBcHBzTWFuYWdlZFByb2ZpbGVUZXN0LmphdmEKQEAgLTAsMCArMSw4IEBACisvL3BhY2thZ2UgY29tLmFuZHJvaWQuY3RzLmRldmljZXBvbGljeS5jcm9zc3Byb2ZpbGU7CisvLworLy9pbXBvcnQgY29tLmFuZHJvaWQuY3RzLmRldmljZXBvbGljeS5CYXNlRGV2aWNlUG9saWN5VGVzdDsKKy8vCisvL3B1YmxpYyBjbGFzcyBDcm9zc1Byb2ZpbGVBcHBzTWFuYWdlZFByb2ZpbGVUZXN0IGV4dGVuZHMgQmFzZURldmljZVBvbGljeVRlc3QgeworLy8KKy8vCisvL30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV4bWV0YWRhdGEvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvZGV4bWV0YWRhdGEvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWY5ZjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXhtZXRhZGF0YS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTUgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2luY2x1ZGUgJChjYWxsIGFsbC1zdWJkaXItbWFrZWZpbGVzKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXhtZXRhZGF0YS9PV05FUlMgYi9ob3N0c2lkZXRlc3RzL2RleG1ldGFkYXRhL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTQ1MzRkCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXhtZXRhZGF0YS9PV05FUlMKQEAgLTAsMCArMSwzIEBACitjYWxpbkBnb29nbGUuY29tCituZ2VvZmZyYXlAZ29vZ2xlLmNvbQorc2VockBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RleG1ldGFkYXRhL2FwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9kZXhtZXRhZGF0YS9hcHAvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDE3ZWJkCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXhtZXRhZGF0YS9hcHAvQW5kcm9pZC5tawpAQCAtMCwwICsxLDM1IEBACisjIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNEZXhNZXRhZGF0YURldmljZVRlc3RBcHAKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCisKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkeC50ZXN0LnJ1bGVzIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0CisKKyMgVGFnIHRoaXMgbW9kdWxlIGFzIHRlc3QgYXJ0aWZhY3QgZm9yIGN0cywKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCisKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKKworaW5jbHVkZSAkKEJVSUxEX0NUU19QQUNLQUdFKQorCisjIEluY2x1ZGUgdGhlIG1ha2UgZmlsZXMgYmVsb3cgdXMuCitpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RleG1ldGFkYXRhL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9kZXhtZXRhZGF0YS9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzZlNDAzCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXhtZXRhZGF0YS9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDI3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLmN0cy5kZXhtZXRhZGF0YSI+CisgICAgPGFwcGxpY2F0aW9uPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPGluc3RydW1lbnRhdGlvbgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5jdHMuZGV4bWV0YWRhdGEiIC8+Cis8L21hbmlmZXN0PgorCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RleG1ldGFkYXRhL2FwcC9TcGxpdEFwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9kZXhtZXRhZGF0YS9hcHAvU3BsaXRBcHAvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTkzNWQzCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXhtZXRhZGF0YS9hcHAvU3BsaXRBcHAvQW5kcm9pZC5tawpAQCAtMCwwICsxLDM3IEBACisjIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNEZXhNZXRhZGF0YVNwbGl0QXBwCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQorCitMT0NBTF9ERVhfUFJFT1BUIDo9IGZhbHNlCitMT0NBTF9QUk9HVUFSRF9FTkFCTEVEIDo9IGRpc2FibGVkCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKKworIyBUYWcgdGhpcyBtb2R1bGUgYXMgdGVzdCBhcnRpZmFjdCBmb3IgY3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cworCitMT0NBTF9TREtfVkVSU0lPTiA6PSB0ZXN0X2N1cnJlbnQKKworaW5jbHVkZSAkKEJVSUxEX0NUU19QQUNLQUdFKQorCisjIEluY2x1ZGUgdGhlIG1ha2UgZmlsZXMgYmVsb3cgdXMKK2luY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV4bWV0YWRhdGEvYXBwL1NwbGl0QXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2RleG1ldGFkYXRhL2FwcC9TcGxpdEFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzYmE5YmMKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2RleG1ldGFkYXRhL2FwcC9TcGxpdEFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLmN0cy5kZXhtZXRhZGF0YS5zcGxpdGFwcCIKKyAgICAgICAgYW5kcm9pZDppc29sYXRlZFNwbGl0cz0idHJ1ZSI+CisKKyAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpkZWJ1Z2dhYmxlPSJ0cnVlIj4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLkJhc2VBY3Rpdml0eSI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgPC9hcHBsaWNhdGlvbj4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RleG1ldGFkYXRhL2FwcC9TcGxpdEFwcC9TcGxpdEFwcEZlYXR1cmVBL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2RleG1ldGFkYXRhL2FwcC9TcGxpdEFwcC9TcGxpdEFwcEZlYXR1cmVBL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM5Y2E1YwotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvZGV4bWV0YWRhdGEvYXBwL1NwbGl0QXBwL1NwbGl0QXBwRmVhdHVyZUEvQW5kcm9pZC5tawpAQCAtMCwwICsxLDM0IEBACisjIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNEZXhNZXRhZGF0YVNwbGl0QXBwRmVhdHVyZUEKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKK0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCisKK0xPQ0FMX0RFWF9QUkVPUFQgOj0gZmFsc2UKK0xPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQorCisjIFRhZyB0aGlzIG1vZHVsZSBhcyB0ZXN0IGFydGlmYWN0IGZvciBjdHMKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzCisKK0xPQ0FMX1NES19WRVJTSU9OIDo9IHRlc3RfY3VycmVudAorCitpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RleG1ldGFkYXRhL2FwcC9TcGxpdEFwcC9TcGxpdEFwcEZlYXR1cmVBL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2RleG1ldGFkYXRhL2FwcC9TcGxpdEFwcC9TcGxpdEFwcEZlYXR1cmVBL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBiNGM5OQotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvZGV4bWV0YWRhdGEvYXBwL1NwbGl0QXBwL1NwbGl0QXBwRmVhdHVyZUEvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5jdHMuZGV4bWV0YWRhdGEuc3BsaXRhcHAiCisgICAgICAgIGFuZHJvaWQ6aXNGZWF0dXJlU3BsaXQ9InRydWUiCisgICAgICAgIHNwbGl0PSJmZWF0dXJlX2EiPgorCisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6ZGVidWdnYWJsZT0idHJ1ZSI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5mZWF0dXJlX2EuRmVhdHVyZUFBY3Rpdml0eSI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgPC9hcHBsaWNhdGlvbj4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2RleG1ldGFkYXRhL2FwcC9TcGxpdEFwcC9TcGxpdEFwcEZlYXR1cmVBL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV4bWV0YWRhdGEvc3BsaXRhcHAvZmVhdHVyZV9hL0ZlYXR1cmVBQWN0aXZpdHkuamF2YSBiL2hvc3RzaWRldGVzdHMvZGV4bWV0YWRhdGEvYXBwL1NwbGl0QXBwL1NwbGl0QXBwRmVhdHVyZUEvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXhtZXRhZGF0YS9zcGxpdGFwcC9mZWF0dXJlX2EvRmVhdHVyZUFBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0OGY1NDUKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2RleG1ldGFkYXRhL2FwcC9TcGxpdEFwcC9TcGxpdEFwcEZlYXR1cmVBL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV4bWV0YWRhdGEvc3BsaXRhcHAvZmVhdHVyZV9hL0ZlYXR1cmVBQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5kZXhtZXRhZGF0YS5zcGxpdGFwcC5mZWF0dXJlX2E7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKKworLy8gSW5zdGFudGlhdGUgc29tZSBjbGFzc2VzIGFzIHBhcnQgb2YgdGhlIGluaXRpYWxpemVyIHNvIHRoYXQgd2UgbWF5CisvLyBjYXB0dXJlIGEgcmVsZXZhbnQgcHJvZmlsZSBmb3IgdGhlIHRlc3QgYXBwLgorcHVibGljIGNsYXNzIEZlYXR1cmVBQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgIHN0YXRpYyB7CisgICAgbmV3IENsYXNzMDEoKTsKKyAgICBuZXcgQ2xhc3MwMigpOworICAgIG5ldyBDbGFzczAzKCk7CisgICAgbmV3IENsYXNzMDQoKTsKKyAgICBuZXcgQ2xhc3MwNSgpOworICAgIG5ldyBDbGFzczA2KCk7CisgICAgbmV3IENsYXNzMDcoKTsKKyAgICBuZXcgQ2xhc3MwOCgpOworICAgIG5ldyBDbGFzczA5KCk7CisgICAgbmV3IENsYXNzMTAoKTsKKyAgICBuZXcgQ2xhc3MxMSgpOworICAgIG5ldyBDbGFzczEyKCk7CisgICAgbmV3IENsYXNzMTMoKTsKKyAgICBuZXcgQ2xhc3MxNCgpOworICAgIG5ldyBDbGFzczE1KCk7CisgICAgbmV3IENsYXNzMTYoKTsKKyAgICBuZXcgQ2xhc3MxNygpOworICAgIG5ldyBDbGFzczE4KCk7CisgICAgbmV3IENsYXNzMTkoKTsKKyAgICBuZXcgQ2xhc3MyMCgpOworICAgIG5ldyBDbGFzczIxKCk7CisgICAgbmV3IENsYXNzMjIoKTsKKyAgICBuZXcgQ2xhc3MyMygpOworICAgIG5ldyBDbGFzczI0KCk7CisgICAgbmV3IENsYXNzMjUoKTsKKyAgICBuZXcgQ2xhc3MyNigpOworICAgIG5ldyBDbGFzczI3KCk7CisgICAgbmV3IENsYXNzMjgoKTsKKyAgICBuZXcgQ2xhc3MyOSgpOworICAgIG5ldyBDbGFzczMwKCk7CisgICAgbmV3IENsYXNzMzEoKTsKKyAgICBuZXcgQ2xhc3MzMigpOworICAgIG5ldyBDbGFzczMzKCk7CisgICAgbmV3IENsYXNzMzQoKTsKKyAgICBuZXcgQ2xhc3MzNSgpOworICAgIG5ldyBDbGFzczM2KCk7CisgICAgbmV3IENsYXNzMzcoKTsKKyAgICBuZXcgQ2xhc3MzOCgpOworICAgIG5ldyBDbGFzczM5KCk7CisgICAgbmV3IENsYXNzNDAoKTsKKyAgICBuZXcgQ2xhc3M0MSgpOworICAgIG5ldyBDbGFzczQyKCk7CisgICAgbmV3IENsYXNzNDMoKTsKKyAgICBuZXcgQ2xhc3M0NCgpOworICAgIG5ldyBDbGFzczQ1KCk7CisgICAgbmV3IENsYXNzNDYoKTsKKyAgICBuZXcgQ2xhc3M0NygpOworICAgIG5ldyBDbGFzczQ4KCk7CisgICAgbmV3IENsYXNzNDkoKTsKKyAgICBuZXcgQ2xhc3M1MCgpOworICB9Cit9CisKK2NsYXNzIENsYXNzMDEge30KK2NsYXNzIENsYXNzMDIge30KK2NsYXNzIENsYXNzMDMge30KK2NsYXNzIENsYXNzMDQge30KK2NsYXNzIENsYXNzMDUge30KK2NsYXNzIENsYXNzMDYge30KK2NsYXNzIENsYXNzMDcge30KK2NsYXNzIENsYXNzMDgge30KK2NsYXNzIENsYXNzMDkge30KK2NsYXNzIENsYXNzMTAge30KK2NsYXNzIENsYXNzMTEge30KK2NsYXNzIENsYXNzMTIge30KK2NsYXNzIENsYXNzMTMge30KK2NsYXNzIENsYXNzMTQge30KK2NsYXNzIENsYXNzMTUge30KK2NsYXNzIENsYXNzMTYge30KK2NsYXNzIENsYXNzMTcge30KK2NsYXNzIENsYXNzMTgge30KK2NsYXNzIENsYXNzMTkge30KK2NsYXNzIENsYXNzMjAge30KK2NsYXNzIENsYXNzMjEge30KK2NsYXNzIENsYXNzMjIge30KK2NsYXNzIENsYXNzMjMge30KK2NsYXNzIENsYXNzMjQge30KK2NsYXNzIENsYXNzMjUge30KK2NsYXNzIENsYXNzMjYge30KK2NsYXNzIENsYXNzMjcge30KK2NsYXNzIENsYXNzMjgge30KK2NsYXNzIENsYXNzMjkge30KK2NsYXNzIENsYXNzMzAge30KK2NsYXNzIENsYXNzMzEge30KK2NsYXNzIENsYXNzMzIge30KK2NsYXNzIENsYXNzMzMge30KK2NsYXNzIENsYXNzMzQge30KK2NsYXNzIENsYXNzMzUge30KK2NsYXNzIENsYXNzMzYge30KK2NsYXNzIENsYXNzMzcge30KK2NsYXNzIENsYXNzMzgge30KK2NsYXNzIENsYXNzMzkge30KK2NsYXNzIENsYXNzNDAge30KK2NsYXNzIENsYXNzNDEge30KK2NsYXNzIENsYXNzNDIge30KK2NsYXNzIENsYXNzNDMge30KK2NsYXNzIENsYXNzNDQge30KK2NsYXNzIENsYXNzNDUge30KK2NsYXNzIENsYXNzNDYge30KK2NsYXNzIENsYXNzNDcge30KK2NsYXNzIENsYXNzNDgge30KK2NsYXNzIENsYXNzNDkge30KK2NsYXNzIENsYXNzNTAge30KKwpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXhtZXRhZGF0YS9hcHAvU3BsaXRBcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXhtZXRhZGF0YS9zcGxpdGFwcC9CYXNlQWN0aXZpdHkuamF2YSBiL2hvc3RzaWRldGVzdHMvZGV4bWV0YWRhdGEvYXBwL1NwbGl0QXBwL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV4bWV0YWRhdGEvc3BsaXRhcHAvQmFzZUFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIxNjRjMQotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvZGV4bWV0YWRhdGEvYXBwL1NwbGl0QXBwL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV4bWV0YWRhdGEvc3BsaXRhcHAvQmFzZUFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5jdHMuZGV4bWV0YWRhdGEuc3BsaXRhcHA7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKKworLy8gSW5zdGFudGlhdGUgc29tZSBjbGFzc2VzIGFzIHBhcnQgb2YgdGhlIGluaXRpYWxpemVyIHNvIHRoYXQgd2UgbWF5CisvLyBjYXB0dXJlIGEgcmVsZXZhbnQgcHJvZmlsZSBmb3IgdGhlIHRlc3QgYXBwLgorcHVibGljIGNsYXNzIEJhc2VBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgc3RhdGljIHsKKyAgICBuZXcgQ2xhc3MwMSgpOworICAgIG5ldyBDbGFzczAyKCk7CisgICAgbmV3IENsYXNzMDMoKTsKKyAgICBuZXcgQ2xhc3MwNCgpOworICAgIG5ldyBDbGFzczA1KCk7CisgICAgbmV3IENsYXNzMDYoKTsKKyAgICBuZXcgQ2xhc3MwNygpOworICAgIG5ldyBDbGFzczA4KCk7CisgICAgbmV3IENsYXNzMDkoKTsKKyAgICBuZXcgQ2xhc3MxMCgpOworICAgIG5ldyBDbGFzczExKCk7CisgICAgbmV3IENsYXNzMTIoKTsKKyAgICBuZXcgQ2xhc3MxMygpOworICAgIG5ldyBDbGFzczE0KCk7CisgICAgbmV3IENsYXNzMTUoKTsKKyAgICBuZXcgQ2xhc3MxNigpOworICAgIG5ldyBDbGFzczE3KCk7CisgICAgbmV3IENsYXNzMTgoKTsKKyAgICBuZXcgQ2xhc3MxOSgpOworICAgIG5ldyBDbGFzczIwKCk7CisgICAgbmV3IENsYXNzMjEoKTsKKyAgICBuZXcgQ2xhc3MyMigpOworICAgIG5ldyBDbGFzczIzKCk7CisgICAgbmV3IENsYXNzMjQoKTsKKyAgICBuZXcgQ2xhc3MyNSgpOworICAgIG5ldyBDbGFzczI2KCk7CisgICAgbmV3IENsYXNzMjcoKTsKKyAgICBuZXcgQ2xhc3MyOCgpOworICAgIG5ldyBDbGFzczI5KCk7CisgICAgbmV3IENsYXNzMzAoKTsKKyAgICBuZXcgQ2xhc3MzMSgpOworICAgIG5ldyBDbGFzczMyKCk7CisgICAgbmV3IENsYXNzMzMoKTsKKyAgICBuZXcgQ2xhc3MzNCgpOworICAgIG5ldyBDbGFzczM1KCk7CisgICAgbmV3IENsYXNzMzYoKTsKKyAgICBuZXcgQ2xhc3MzNygpOworICAgIG5ldyBDbGFzczM4KCk7CisgICAgbmV3IENsYXNzMzkoKTsKKyAgICBuZXcgQ2xhc3M0MCgpOworICAgIG5ldyBDbGFzczQxKCk7CisgICAgbmV3IENsYXNzNDIoKTsKKyAgICBuZXcgQ2xhc3M0MygpOworICAgIG5ldyBDbGFzczQ0KCk7CisgICAgbmV3IENsYXNzNDUoKTsKKyAgICBuZXcgQ2xhc3M0NigpOworICAgIG5ldyBDbGFzczQ3KCk7CisgICAgbmV3IENsYXNzNDgoKTsKKyAgICBuZXcgQ2xhc3M0OSgpOworICAgIG5ldyBDbGFzczUwKCk7CisgIH0KK30KKworY2xhc3MgQ2xhc3MwMSB7fQorY2xhc3MgQ2xhc3MwMiB7fQorY2xhc3MgQ2xhc3MwMyB7fQorY2xhc3MgQ2xhc3MwNCB7fQorY2xhc3MgQ2xhc3MwNSB7fQorY2xhc3MgQ2xhc3MwNiB7fQorY2xhc3MgQ2xhc3MwNyB7fQorY2xhc3MgQ2xhc3MwOCB7fQorY2xhc3MgQ2xhc3MwOSB7fQorY2xhc3MgQ2xhc3MxMCB7fQorY2xhc3MgQ2xhc3MxMSB7fQorY2xhc3MgQ2xhc3MxMiB7fQorY2xhc3MgQ2xhc3MxMyB7fQorY2xhc3MgQ2xhc3MxNCB7fQorY2xhc3MgQ2xhc3MxNSB7fQorY2xhc3MgQ2xhc3MxNiB7fQorY2xhc3MgQ2xhc3MxNyB7fQorY2xhc3MgQ2xhc3MxOCB7fQorY2xhc3MgQ2xhc3MxOSB7fQorY2xhc3MgQ2xhc3MyMCB7fQorY2xhc3MgQ2xhc3MyMSB7fQorY2xhc3MgQ2xhc3MyMiB7fQorY2xhc3MgQ2xhc3MyMyB7fQorY2xhc3MgQ2xhc3MyNCB7fQorY2xhc3MgQ2xhc3MyNSB7fQorY2xhc3MgQ2xhc3MyNiB7fQorY2xhc3MgQ2xhc3MyNyB7fQorY2xhc3MgQ2xhc3MyOCB7fQorY2xhc3MgQ2xhc3MyOSB7fQorY2xhc3MgQ2xhc3MzMCB7fQorY2xhc3MgQ2xhc3MzMSB7fQorY2xhc3MgQ2xhc3MzMiB7fQorY2xhc3MgQ2xhc3MzMyB7fQorY2xhc3MgQ2xhc3MzNCB7fQorY2xhc3MgQ2xhc3MzNSB7fQorY2xhc3MgQ2xhc3MzNiB7fQorY2xhc3MgQ2xhc3MzNyB7fQorY2xhc3MgQ2xhc3MzOCB7fQorY2xhc3MgQ2xhc3MzOSB7fQorY2xhc3MgQ2xhc3M0MCB7fQorY2xhc3MgQ2xhc3M0MSB7fQorY2xhc3MgQ2xhc3M0MiB7fQorY2xhc3MgQ2xhc3M0MyB7fQorY2xhc3MgQ2xhc3M0NCB7fQorY2xhc3MgQ2xhc3M0NSB7fQorY2xhc3MgQ2xhc3M0NiB7fQorY2xhc3MgQ2xhc3M0NyB7fQorY2xhc3MgQ2xhc3M0OCB7fQorY2xhc3MgQ2xhc3M0OSB7fQorY2xhc3MgQ2xhc3M1MCB7fQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXhtZXRhZGF0YS9hcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXhtZXRhZGF0YS9JbnN0YWxsRGV4TWV0YWRhdGFUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2RleG1ldGFkYXRhL2FwcC9zcmMvY29tL2FuZHJvaWQvY3RzL2RleG1ldGFkYXRhL0luc3RhbGxEZXhNZXRhZGF0YVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzM4YzRlCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXhtZXRhZGF0YS9hcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXhtZXRhZGF0YS9JbnN0YWxsRGV4TWV0YWRhdGFUZXN0LmphdmEKQEAgLTAsMCArMSwxNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5jdHMuZGV4bWV0YWRhdGE7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm87CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTl9DT0RFUzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXJyYXlNYXA7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkFwaUxldmVsVXRpbDsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3N1bWU7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aHM7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIERldmljZS1zaWRlIHRlc3QgZm9yIHZlcmlmeWluZyBkZXggbWV0YWRhdGEgaW5zdGFsbHMuCisgKi8KK0BSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgSW5zdGFsbERleE1ldGFkYXRhVGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc0Fwa0ZpbGVFeHRlbnNpb24gPSAiLmFwayI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNEZXhNZXRhZGF0YUZpbGVFeHRlbnNpb24gPSAiLmRtIjsKKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBzU3BsaXRBcHBQYWNrYWdlID0gImNvbS5hbmRyb2lkLmN0cy5kZXhtZXRhZGF0YS5zcGxpdGFwcCI7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbVNob3VsZFJ1blRlc3Q7CisKKyAgICBwcml2YXRlIFN0cmluZyBtQmFzZUNvZGVQYXRoOworICAgIHByaXZhdGUgU3RyaW5nW10gbVNwbGl0Q29kZVBhdGhzOworICAgIHByaXZhdGUgQXJyYXlNYXA8U3RyaW5nLCBTdHJpbmc+IG1EZXhNZXRhZGF0YU1hcDsKKworICAgIC8qKgorICAgICAqIERlY2lkZSBpZiB3ZSBuZWVkIHRvIHJ1biB0aGUgdGVzdC4KKyAgICAgKi8KKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbVNob3VsZFJ1blRlc3QgPSAoQXBpTGV2ZWxVdGlsLmlzQXRMZWFzdChWRVJTSU9OX0NPREVTLlApCisgICAgICAgICAgICAgICAgfHwgQXBpTGV2ZWxVdGlsLmNvZGVuYW1lRXF1YWxzKCJQIikpOworCisgICAgICAgIGlmIChtU2hvdWxkUnVuVGVzdCkgeworICAgICAgICAgICAgQXBwbGljYXRpb25JbmZvIGluZm8gPSBnZXRBcHBJbmZvKHNTcGxpdEFwcFBhY2thZ2UpOworICAgICAgICAgICAgbUJhc2VDb2RlUGF0aCA9IGluZm8uc291cmNlRGlyOworICAgICAgICAgICAgbVNwbGl0Q29kZVBhdGhzID0gaW5mby5zcGxpdFNvdXJjZURpcnM7CisgICAgICAgICAgICBtRGV4TWV0YWRhdGFNYXAgPSBidWlsZFBhY2thZ2VBcGtUb0RleE1ldGFkYXRhTWFwKGluZm8pOworICAgICAgICB9CisgICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKCJTa2lwIERleE1ldGFkYXRhIHRlc3RzIG9uIHJlbGVhc2VzIGJlZm9yZSBQLiIsIG1TaG91bGRSdW5UZXN0KTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFZlcmlmeSB0aGF0IHdlIGluc3RhbGxlZCB0aGUgLmRtIGZpbGVzIGZvciBiYXNlIChubyBzcGxpdCBpbnN0YWxsKS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REbUZvckJhc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0TnVsbChtU3BsaXRDb2RlUGF0aHMpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbURleE1ldGFkYXRhTWFwLnNpemUoKSk7CisgICAgICAgIGFzc2VydFRydWUobURleE1ldGFkYXRhTWFwLmNvbnRhaW5zS2V5KG1CYXNlQ29kZVBhdGgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWZXJpZnkgdGhhdCB3ZSBpbnN0YWxsZWQgdGhlIC5kbSBmaWxlcyBmb3IgYmFzZSBhbmQgc3BsaXQuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG1Gb3JCYXNlQW5kU3BsaXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtU3BsaXRDb2RlUGF0aHMpOworCisgICAgICAgIGFzc2VydEVxdWFscygxICsgbVNwbGl0Q29kZVBhdGhzLmxlbmd0aCwgbURleE1ldGFkYXRhTWFwLnNpemUoKSk7CisgICAgICAgIGFzc2VydFRydWUobURleE1ldGFkYXRhTWFwLmNvbnRhaW5zS2V5KG1CYXNlQ29kZVBhdGgpKTsKKyAgICAgICAgZm9yIChTdHJpbmcgc3BsaXQgOiBtU3BsaXRDb2RlUGF0aHMpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUobURleE1ldGFkYXRhTWFwLmNvbnRhaW5zS2V5KHNwbGl0KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWZXJpZnkgdGhhdCB3ZSBpbnN0YWxsZWQgdGhlIC5kbSBmaWxlcyBmb3IgYmFzZSBidXQgbm90IGZvciBzcGxpdC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REbUZvckJhc2VCdXROb1NwbGl0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydE5vdE51bGwobVNwbGl0Q29kZVBhdGhzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1EZXhNZXRhZGF0YU1hcC5zaXplKCkpOworICAgICAgICBhc3NlcnRUcnVlKG1EZXhNZXRhZGF0YU1hcC5jb250YWluc0tleShtQmFzZUNvZGVQYXRoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmVyaWZ5IHRoYXQgd2UgaW5zdGFsbGVkIHRoZSAuZG0gZmlsZXMgZm9yIHNwbGl0IGJ1dCBub3QgZm9yIGJhc2UuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG1Gb3JTcGxpdEJ1dE5vQmFzZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnROb3ROdWxsKG1TcGxpdENvZGVQYXRocyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1TcGxpdENvZGVQYXRocy5sZW5ndGgsIG1EZXhNZXRhZGF0YU1hcC5zaXplKCkpOworICAgICAgICBmb3IgKFN0cmluZyBzcGxpdCA6IG1TcGxpdENvZGVQYXRocykgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRGV4TWV0YWRhdGFNYXAuY29udGFpbnNLZXkoc3BsaXQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFZlcmlmeSB0aGF0IHdlIGRpZCBub3QgaW5zdGFsbCAuZG0gZmlsZXMuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9EbSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRUcnVlKG1EZXhNZXRhZGF0YU1hcC5pc0VtcHR5KCkpOworICAgIH0KKworICAgIHByaXZhdGUgQXBwbGljYXRpb25JbmZvIGdldEFwcEluZm8oU3RyaW5nIHBrZykgeworICAgICAgICBmaW5hbCBDb250ZXh0IGNvbnRleHQgPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKS5nZXRUYXJnZXRDb250ZXh0KCk7CisgICAgICAgIGZpbmFsIFBhY2thZ2VNYW5hZ2VyIHBtID0gY29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZUluZm8gcGFja2FnZUluZm87CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwYWNrYWdlSW5mbyA9IHBtLmdldFBhY2thZ2VJbmZvKHBrZywgMCk7CisgICAgICAgICAgICByZXR1cm4gcGFja2FnZUluZm8uYXBwbGljYXRpb25JbmZvOworICAgICAgICB9IGNhdGNoIChQYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiTmFtZU5vdEZvdW5kRXhjZXB0aW9uIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldERleE1ldGFkYXRhRnJvbUFwayhTdHJpbmcgY29kZVBhdGgpIHsKKyAgICAgICAgcmV0dXJuIGNvZGVQYXRoLnN1YnN0cmluZygwLCBjb2RlUGF0aC5sZW5ndGgoKSAtIHNBcGtGaWxlRXh0ZW5zaW9uLmxlbmd0aCgpKQorICAgICAgICAgICAgICAgICsgc0RleE1ldGFkYXRhRmlsZUV4dGVuc2lvbjsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBBcnJheU1hcDxTdHJpbmcsIFN0cmluZz4gYnVpbGRQYWNrYWdlQXBrVG9EZXhNZXRhZGF0YU1hcChBcHBsaWNhdGlvbkluZm8gaW5mbykgeworICAgICAgICBMaXN0PFN0cmluZz4gY29kZVBhdGhzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGNvZGVQYXRocy5hZGQoaW5mby5zb3VyY2VEaXIpOworICAgICAgICBpZiAoaW5mby5zcGxpdFNvdXJjZURpcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgY29kZVBhdGhzLmFkZEFsbChBcnJheXMuYXNMaXN0KGluZm8uc3BsaXRTb3VyY2VEaXJzKSk7CisgICAgICAgIH0KKyAgICAgICAgQXJyYXlNYXA8U3RyaW5nLCBTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheU1hcDw+KCk7CisgICAgICAgIGZvciAoU3RyaW5nIGNvZGVQYXRoIDogY29kZVBhdGhzKSB7CisgICAgICAgICAgICBTdHJpbmcgZGV4TWV0YWRhdGFQYXRoID0gZ2V0RGV4TWV0YWRhdGFGcm9tQXBrKGNvZGVQYXRoKTsKKworICAgICAgICAgICAgaWYgKEZpbGVzLmV4aXN0cyhQYXRocy5nZXQoZGV4TWV0YWRhdGFQYXRoKSkpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQucHV0KGNvZGVQYXRoLCBkZXhNZXRhZGF0YVBhdGgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZGV4bWV0YWRhdGEvaG9zdC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9kZXhtZXRhZGF0YS9ob3N0L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUxZGRkMgotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvZGV4bWV0YWRhdGEvaG9zdC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzQgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRSA6PSBDdHNEZXhNZXRhZGF0YUhvc3RUZXN0Q2FzZXMKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQorTE9DQUxfSkFWQV9SRVNPVVJDRV9ESVJTIDo9IHJlcworCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBcCisgICAgY29tcGF0aWJpbGl0eS1ob3N0LXV0aWwgXAorICAgIGN0cy10cmFkZWZlZCBcCisgICAgdHJhZGVmZWQKKworIyB0YWcgdGhpcyBtb2R1bGUgYXMgdGVzdCBhcnRpZmFjdCBmb3IgY3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cworCitpbmNsdWRlICQoQlVJTERfQ1RTX0hPU1RfSkFWQV9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXhtZXRhZGF0YS9ob3N0L0FuZHJvaWRUZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvZGV4bWV0YWRhdGEvaG9zdC9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YxNjAzZAotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvZGV4bWV0YWRhdGEvaG9zdC9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBEZXggTWV0YWRhdGEgaG9zdCB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgorICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iZnJhbWV3b3JrIiAvPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJDdHNEZXhNZXRhZGF0YURldmljZVRlc3RBcHAuYXBrIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5KYXJIb3N0VGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImphciIgdmFsdWU9IkN0c0RleE1ldGFkYXRhSG9zdFRlc3RDYXNlcy5qYXIiIC8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXhtZXRhZGF0YS9ob3N0L3Jlcy9DdHNEZXhNZXRhZGF0YVNwbGl0QXBwLmFwayBiL2hvc3RzaWRldGVzdHMvZGV4bWV0YWRhdGEvaG9zdC9yZXMvQ3RzRGV4TWV0YWRhdGFTcGxpdEFwcC5hcGsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc2MDk3MwotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvZGV4bWV0YWRhdGEvaG9zdC9yZXMvQ3RzRGV4TWV0YWRhdGFTcGxpdEFwcC5hcGsKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXhtZXRhZGF0YS9ob3N0L3Jlcy9DdHNEZXhNZXRhZGF0YVNwbGl0QXBwLmRtIGIvaG9zdHNpZGV0ZXN0cy9kZXhtZXRhZGF0YS9ob3N0L3Jlcy9DdHNEZXhNZXRhZGF0YVNwbGl0QXBwLmRtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NGI0ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2RleG1ldGFkYXRhL2hvc3QvcmVzL0N0c0RleE1ldGFkYXRhU3BsaXRBcHAuZG0KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXhtZXRhZGF0YS9ob3N0L3Jlcy9DdHNEZXhNZXRhZGF0YVNwbGl0QXBwRmVhdHVyZUEuYXBrIGIvaG9zdHNpZGV0ZXN0cy9kZXhtZXRhZGF0YS9ob3N0L3Jlcy9DdHNEZXhNZXRhZGF0YVNwbGl0QXBwRmVhdHVyZUEuYXBrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NWZlYjUKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2RleG1ldGFkYXRhL2hvc3QvcmVzL0N0c0RleE1ldGFkYXRhU3BsaXRBcHBGZWF0dXJlQS5hcGsKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXhtZXRhZGF0YS9ob3N0L3Jlcy9DdHNEZXhNZXRhZGF0YVNwbGl0QXBwRmVhdHVyZUEuZG0gYi9ob3N0c2lkZXRlc3RzL2RleG1ldGFkYXRhL2hvc3QvcmVzL0N0c0RleE1ldGFkYXRhU3BsaXRBcHBGZWF0dXJlQS5kbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODM5NWY0Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9kZXhtZXRhZGF0YS9ob3N0L3Jlcy9DdHNEZXhNZXRhZGF0YVNwbGl0QXBwRmVhdHVyZUEuZG0KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXhtZXRhZGF0YS9ob3N0L3NyYy9jb20vYW5kcm9pZC9jdHMvZGV4bWV0YWRhdGEvQmFzZUluc3RhbGxNdWx0aXBsZS5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9kZXhtZXRhZGF0YS9ob3N0L3NyYy9jb20vYW5kcm9pZC9jdHMvZGV4bWV0YWRhdGEvQmFzZUluc3RhbGxNdWx0aXBsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViOTQ5OGUKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2RleG1ldGFkYXRhL2hvc3Qvc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXhtZXRhZGF0YS9CYXNlSW5zdGFsbE11bHRpcGxlLmphdmEKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5jdHMuZGV4bWV0YWRhdGE7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC5idWlsZC5Db21wYXRpYmlsaXR5QnVpbGRIZWxwZXI7CitpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuYnVpbGQuSUJ1aWxkSW5mbzsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uOworaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5JVGVzdERldmljZTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIGludm9raW5nIHRoZSBpbnN0YWxsLW11bHRpcGxlIGNvbW1hbmQgdmlhIEFEQi4gU3ViY2xhc3MgdGhpcyBmb3IgbGVzcyB0eXBpbmc6CisgKgorICogPGNvZGU+IHByaXZhdGUgY2xhc3MgSW5zdGFsbE11bHRpcGxlIGV4dGVuZHMgQmFzZUluc3RhbGxNdWx0aXBsZSZsdDtJbnN0YWxsTXVsdGlwbGUmZ3Q7IHsgcHVibGljCisgKiBJbnN0YWxsTXVsdGlwbGUoKSB7IHN1cGVyKGdldERldmljZSgpLCBudWxsKTsgfSB9IDwvY29kZT4KKyAqLworLypwYWNrYWdlKi8gY2xhc3MgQmFzZUluc3RhbGxNdWx0aXBsZTxUIGV4dGVuZHMgQmFzZUluc3RhbGxNdWx0aXBsZTw/Pj4geworCisgICAgcHJpdmF0ZSBmaW5hbCBJVGVzdERldmljZSBtRGV2aWNlOworICAgIHByaXZhdGUgZmluYWwgSUJ1aWxkSW5mbyBtQnVpbGQ7CisKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8U3RyaW5nPiBtQXJncyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxGaWxlPiBtRmlsZXNUb0luc3RhbGwgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgIC8qcGFja2FnZSovIEJhc2VJbnN0YWxsTXVsdGlwbGUoSVRlc3REZXZpY2UgZGV2aWNlLCBJQnVpbGRJbmZvIGJ1aWxkSW5mbykgeworICAgICAgICBtRGV2aWNlID0gZGV2aWNlOworICAgICAgICBtQnVpbGQgPSBidWlsZEluZm87CisgICAgICAgIGFkZEFyZygiLWciKTsKKyAgICB9CisKKyAgICBUIGFkZEFyZyhTdHJpbmcgYXJnKSB7CisgICAgICAgIG1BcmdzLmFkZChhcmcpOworICAgICAgICByZXR1cm4gKFQpIHRoaXM7CisgICAgfQorCisgICAgVCBhZGRBcGsoRmlsZSBhcGspIHsKKyAgICAgICAgbUZpbGVzVG9JbnN0YWxsLmFkZChhcGspOworICAgICAgICByZXR1cm4gKFQpIHRoaXM7CisgICAgfQorCisgICAgVCBhZGREbShGaWxlIGRtYSkgeworICAgICAgICBtRmlsZXNUb0luc3RhbGwuYWRkKGRtYSk7CisgICAgICAgIHJldHVybiAoVCkgdGhpczsKKyAgICB9CisKKyAgICB2b2lkIHJ1bigpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24geworICAgICAgICBydW4odHJ1ZSk7CisgICAgfQorCisgICAgdm9pZCBydW5FeHBlY3RpbmdGYWlsdXJlKCkgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7CisgICAgICAgIHJ1bihmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJ1bihib29sZWFuIGV4cGVjdGluZ1N1Y2Nlc3MpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24geworICAgICAgICBmaW5hbCBJVGVzdERldmljZSBkZXZpY2UgPSBtRGV2aWNlOworCisgICAgICAgIC8vIENyZWF0ZSBhbiBpbnN0YWxsIHNlc3Npb24KKyAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBjbWQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBjbWQuYXBwZW5kKCJwbSBpbnN0YWxsLWNyZWF0ZSIpOworICAgICAgICBmb3IgKFN0cmluZyBhcmcgOiBtQXJncykgeworICAgICAgICAgICAgY21kLmFwcGVuZCgnICcpLmFwcGVuZChhcmcpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IGRldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKGNtZC50b1N0cmluZygpKTsKKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0VHJ1ZShyZXN1bHQsIHJlc3VsdC5zdGFydHNXaXRoKCJTdWNjZXNzIikpOworCisgICAgICAgIGZpbmFsIGludCBzdGFydCA9IHJlc3VsdC5sYXN0SW5kZXhPZigiWyIpOworICAgICAgICBmaW5hbCBpbnQgZW5kID0gcmVzdWx0Lmxhc3RJbmRleE9mKCJdIik7CisgICAgICAgIGludCBzZXNzaW9uSWQgPSAtMTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChzdGFydCAhPSAtMSAmJiBlbmQgIT0gLTEgJiYgc3RhcnQgPCBlbmQpIHsKKyAgICAgICAgICAgICAgICBzZXNzaW9uSWQgPSBJbnRlZ2VyLnBhcnNlSW50KHJlc3VsdC5zdWJzdHJpbmcoc3RhcnQgKyAxLCBlbmQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkZhaWxlZCB0byBwYXJzZSBpbnN0YWxsIHNlc3Npb246ICIgKyByZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGlmIChzZXNzaW9uSWQgPT0gLTEpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkZhaWxlZCB0byBjcmVhdGUgaW5zdGFsbCBzZXNzaW9uOiAiICsgcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFB1c2ggb3VyIGZpbGVzIGludG8gc2Vzc2lvbi4gSWRlYWxseSB3ZSdkIHVzZSBzdGRpbiBzdHJlYW1pbmcsCisgICAgICAgIC8vIGJ1dCBkZG1saWIgZG9lc24ndCBzdXBwb3J0IGl0IHlldC4KKyAgICAgICAgZm9yIChmaW5hbCBGaWxlIGZpbGUgOiBtRmlsZXNUb0luc3RhbGwpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyByZW1vdGVQYXRoID0gIi9kYXRhL2xvY2FsL3RtcC8iICsgZmlsZS5nZXROYW1lKCk7CisgICAgICAgICAgICBpZiAoIWRldmljZS5wdXNoRmlsZShmaWxlLCByZW1vdGVQYXRoKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkZhaWxlZCB0byBwdXNoICIgKyBmaWxlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY21kLnNldExlbmd0aCgwKTsKKyAgICAgICAgICAgIGNtZC5hcHBlbmQoInBtIGluc3RhbGwtd3JpdGUiKTsKKyAgICAgICAgICAgIGNtZC5hcHBlbmQoJyAnKS5hcHBlbmQoc2Vzc2lvbklkKTsKKyAgICAgICAgICAgIGNtZC5hcHBlbmQoJyAnKS5hcHBlbmQoZmlsZS5nZXROYW1lKCkpOworICAgICAgICAgICAgY21kLmFwcGVuZCgnICcpLmFwcGVuZChyZW1vdGVQYXRoKTsKKworICAgICAgICAgICAgcmVzdWx0ID0gZGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoY21kLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgVGVzdENhc2UuYXNzZXJ0VHJ1ZShyZXN1bHQsIHJlc3VsdC5zdGFydHNXaXRoKCJTdWNjZXNzIikpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRXZlcnl0aGluZyBzdGFnZWQ7IGxldCdzIHB1bGwgdHJpZ2dlcgorICAgICAgICBjbWQuc2V0TGVuZ3RoKDApOworICAgICAgICBjbWQuYXBwZW5kKCJwbSBpbnN0YWxsLWNvbW1pdCIpOworICAgICAgICBjbWQuYXBwZW5kKCcgJykuYXBwZW5kKHNlc3Npb25JZCk7CisKKyAgICAgICAgcmVzdWx0ID0gZGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoY21kLnRvU3RyaW5nKCkpOworICAgICAgICBpZiAoZXhwZWN0aW5nU3VjY2VzcykgeworICAgICAgICAgICAgVGVzdENhc2UuYXNzZXJ0VHJ1ZShyZXN1bHQsIHJlc3VsdC5jb250YWlucygiU3VjY2VzcyIpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFRlc3RDYXNlLmFzc2VydEZhbHNlKHJlc3VsdCwgcmVzdWx0LmNvbnRhaW5zKCJTdWNjZXNzIikpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kZXhtZXRhZGF0YS9ob3N0L3NyYy9jb20vYW5kcm9pZC9jdHMvZGV4bWV0YWRhdGEvSW5zdGFsbERleE1ldGFkYXRhSG9zdFRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvZGV4bWV0YWRhdGEvaG9zdC9zcmMvY29tL2FuZHJvaWQvY3RzL2RleG1ldGFkYXRhL0luc3RhbGxEZXhNZXRhZGF0YUhvc3RUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY2MDM0YQotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvZGV4bWV0YWRhdGEvaG9zdC9zcmMvY29tL2FuZHJvaWQvY3RzL2RleG1ldGFkYXRhL0luc3RhbGxEZXhNZXRhZGF0YUhvc3RUZXN0LmphdmEKQEAgLTAsMCArMSwyNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5jdHMuZGV4bWV0YWRhdGE7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRBcnJheUVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5BcGlMZXZlbFV0aWw7CitpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuRGV2aWNlSlVuaXQ0Q2xhc3NSdW5uZXI7CitpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuanVuaXQ0LkJhc2VIb3N0SlVuaXQ0VGVzdDsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC51dGlsLkZpbGVVdGlsOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoczsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwSW5wdXRTdHJlYW07CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkFzc3VtZTsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKKworLyoqCisgKiBWZXJpZmllcyB0aGF0IGRleCBtZXRhZGF0YSBmaWxlcyBhcmUgaW5zdGFsbGVkIGFuZCB1cGRhdGVkIHN1Y2Nlc3NmdWxseS4KKyAqLworQFJ1bldpdGgoRGV2aWNlSlVuaXQ0Q2xhc3NSdW5uZXIuY2xhc3MpCitwdWJsaWMgY2xhc3MgSW5zdGFsbERleE1ldGFkYXRhSG9zdFRlc3QgZXh0ZW5kcyBCYXNlSG9zdEpVbml0NFRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUEFDS0FHRSA9ICJjb20uYW5kcm9pZC5jdHMuZGV4bWV0YWRhdGEiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0NMQVNTID0gVEVTVF9QQUNLQUdFICsgIi5JbnN0YWxsRGV4TWV0YWRhdGFUZXN0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5TVEFMTF9QQUNLQUdFID0gImNvbS5hbmRyb2lkLmN0cy5kZXhtZXRhZGF0YS5zcGxpdGFwcCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBLX0JBU0UgPSAiQ3RzRGV4TWV0YWRhdGFTcGxpdEFwcC5hcGsiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUEtfRkVBVFVSRV9BID0gIkN0c0RleE1ldGFkYXRhU3BsaXRBcHBGZWF0dXJlQS5hcGsiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERNX0JBU0UgPSAiQ3RzRGV4TWV0YWRhdGFTcGxpdEFwcC5kbSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERNX0ZFQVRVUkVfQSA9ICJDdHNEZXhNZXRhZGF0YVNwbGl0QXBwRmVhdHVyZUEuZG0iOworCisgICAgcHJpdmF0ZSBGaWxlIG1UbXBEaXI7CisgICAgcHJpdmF0ZSBGaWxlIG1BcGtCYXNlRmlsZSA9IG51bGw7CisgICAgcHJpdmF0ZSBGaWxlIG1BcGtGZWF0dXJlQUZpbGUgPSBudWxsOworICAgIHByaXZhdGUgRmlsZSBtRG1CYXNlRmlsZSA9IG51bGw7CisgICAgcHJpdmF0ZSBGaWxlIG1EbUZlYXR1cmVBRmlsZSA9IG51bGw7CisgICAgcHJpdmF0ZSBib29sZWFuIG1TaG91bGRSdW5UZXN0czsKKworICAgIC8qKgorICAgICAqIFNldHVwIHRoZSB0ZXN0LgorICAgICAqLworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKElOU1RBTExfUEFDS0FHRSk7CisgICAgICAgIG1TaG91bGRSdW5UZXN0cyA9IEFwaUxldmVsVXRpbC5pc0F0TGVhc3QoZ2V0RGV2aWNlKCksIDI4KQorICAgICAgICAgICAgICAgIHx8IEFwaUxldmVsVXRpbC5pc0F0TGVhc3QoZ2V0RGV2aWNlKCksICJQIikKKyAgICAgICAgICAgICAgICB8fCBBcGlMZXZlbFV0aWwuY29kZW5hbWVFcXVhbHMoZ2V0RGV2aWNlKCksICJQIik7CisKKyAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUoIlNraXAgRGV4TWV0YWRhdGEgdGVzdHMgb24gcmVsZWFzZXMgYmVmb3JlIFAuIiwgbVNob3VsZFJ1blRlc3RzKTsKKworICAgICAgICBpZiAobVNob3VsZFJ1blRlc3RzKSB7CisgICAgICAgICAgICBtVG1wRGlyID0gRmlsZVV0aWwuY3JlYXRlVGVtcERpcigiSW5zdGFsbERleE1ldGFkYXRhSG9zdFRlc3QiKTsKKyAgICAgICAgICAgIG1BcGtCYXNlRmlsZSA9IGV4dHJhY3RSZXNvdXJjZShBUEtfQkFTRSwgbVRtcERpcik7CisgICAgICAgICAgICBtQXBrRmVhdHVyZUFGaWxlID0gZXh0cmFjdFJlc291cmNlKEFQS19GRUFUVVJFX0EsIG1UbXBEaXIpOworICAgICAgICAgICAgbURtQmFzZUZpbGUgPSBleHRyYWN0UmVzb3VyY2UoRE1fQkFTRSwgbVRtcERpcik7CisgICAgICAgICAgICBtRG1GZWF0dXJlQUZpbGUgPSBleHRyYWN0UmVzb3VyY2UoRE1fRkVBVFVSRV9BLCBtVG1wRGlyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlYXIgZG93biB0aGUgdGVzdC4KKyAgICAgKi8KKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKElOU1RBTExfUEFDS0FHRSk7CisgICAgICAgIEZpbGVVdGlsLnJlY3Vyc2l2ZURlbGV0ZShtVG1wRGlyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWZXJpZnkgLmRtIGluc3RhbGxhdGlvbiBmb3Igc3RhbmQtYWxvbmUgYmFzZSAobm8gc3BsaXRzKQorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEluc3RhbGxEbUZvckJhc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbmV3IEluc3RhbGxNdWx0aXBsZSgpLmFkZEFwayhtQXBrQmFzZUZpbGUpLmFkZERtKG1EbUJhc2VGaWxlKS5ydW4oKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChnZXREZXZpY2UoKS5nZXRBcHBQYWNrYWdlSW5mbyhJTlNUQUxMX1BBQ0tBR0UpKTsKKworICAgICAgICBhc3NlcnRUcnVlKHJ1bkRldmljZVRlc3RzKFRFU1RfUEFDS0FHRSwgVEVTVF9DTEFTUywgInRlc3REbUZvckJhc2UiKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmVyaWZ5IC5kbSBpbnN0YWxsYXRpb24gZm9yIGJhc2UgYW5kIHNwbGl0cworICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEluc3RhbGxEbUZvckJhc2VBbmRTcGxpdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBuZXcgSW5zdGFsbE11bHRpcGxlKCkuYWRkQXBrKG1BcGtCYXNlRmlsZSkuYWRkRG0obURtQmFzZUZpbGUpCisgICAgICAgICAgICAgICAgLmFkZEFwayhtQXBrRmVhdHVyZUFGaWxlKS5hZGREbShtRG1GZWF0dXJlQUZpbGUpLnJ1bigpOworICAgICAgICBhc3NlcnROb3ROdWxsKGdldERldmljZSgpLmdldEFwcFBhY2thZ2VJbmZvKElOU1RBTExfUEFDS0FHRSkpOworCisgICAgICAgIGFzc2VydFRydWUocnVuRGV2aWNlVGVzdHMoVEVTVF9QQUNLQUdFLCBURVNUX0NMQVNTLCAidGVzdERtRm9yQmFzZUFuZFNwbGl0IikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZlcmlmeSAuZG0gaW5zdGFsbGF0aW9uIGZvciBiYXNlIGJ1dCBub3QgZm9yIHNwbGl0cy4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsRG1Gb3JCYXNlQnV0Tm9TcGxpdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBuZXcgSW5zdGFsbE11bHRpcGxlKCkuYWRkQXBrKG1BcGtCYXNlRmlsZSkuYWRkRG0obURtQmFzZUZpbGUpCisgICAgICAgICAgICAgICAgLmFkZEFwayhtQXBrRmVhdHVyZUFGaWxlKS5ydW4oKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChnZXREZXZpY2UoKS5nZXRBcHBQYWNrYWdlSW5mbyhJTlNUQUxMX1BBQ0tBR0UpKTsKKworICAgICAgICBhc3NlcnRUcnVlKHJ1bkRldmljZVRlc3RzKFRFU1RfUEFDS0FHRSwgVEVTVF9DTEFTUywgInRlc3REbUZvckJhc2VCdXROb1NwbGl0IikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZlcmlmeSAuZG0gaW5zdGFsbGF0aW9uIGZvciBzcGxpdHMgYnV0IG5vdCBmb3IgYmFzZS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsRG1Gb3JTcGxpdEJ1dE5vQmFzZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBuZXcgSW5zdGFsbE11bHRpcGxlKCkuYWRkQXBrKG1BcGtCYXNlRmlsZSkKKyAgICAgICAgICAgICAgICAuYWRkQXBrKG1BcGtGZWF0dXJlQUZpbGUpLmFkZERtKG1EbUZlYXR1cmVBRmlsZSkucnVuKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoZ2V0RGV2aWNlKCkuZ2V0QXBwUGFja2FnZUluZm8oSU5TVEFMTF9QQUNLQUdFKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShydW5EZXZpY2VUZXN0cyhURVNUX1BBQ0tBR0UsIFRFU1RfQ0xBU1MsICJ0ZXN0RG1Gb3JTcGxpdEJ1dE5vQmFzZSIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWZXJpZnkgdGhhdCB1cGRhdGluZyAuZG0gZmlsZXMgd29ya3MgYXMgZXhwZWN0ZWQuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRG0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbmV3IEluc3RhbGxNdWx0aXBsZSgpLmFkZEFwayhtQXBrQmFzZUZpbGUpLmFkZERtKG1EbUJhc2VGaWxlKQorICAgICAgICAgICAgICAgIC5hZGRBcGsobUFwa0ZlYXR1cmVBRmlsZSkuYWRkRG0obURtRmVhdHVyZUFGaWxlKS5ydW4oKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChnZXREZXZpY2UoKS5nZXRBcHBQYWNrYWdlSW5mbyhJTlNUQUxMX1BBQ0tBR0UpKTsKKworICAgICAgICBhc3NlcnRUcnVlKHJ1bkRldmljZVRlc3RzKFRFU1RfUEFDS0FHRSwgVEVTVF9DTEFTUywgInRlc3REbUZvckJhc2VBbmRTcGxpdCIpKTsKKworICAgICAgICAvLyBSZW1vdmUgLmRtIGZpbGVzIGR1cmluZyB1cGRhdGUuCisgICAgICAgIG5ldyBJbnN0YWxsTXVsdGlwbGUoKS5hZGRBcmcoIi1yIikuYWRkQXBrKG1BcGtCYXNlRmlsZSkKKyAgICAgICAgICAgICAgICAuYWRkQXBrKG1BcGtGZWF0dXJlQUZpbGUpLnJ1bigpOworICAgICAgICBhc3NlcnROb3ROdWxsKGdldERldmljZSgpLmdldEFwcFBhY2thZ2VJbmZvKElOU1RBTExfUEFDS0FHRSkpOworCisgICAgICAgIGFzc2VydFRydWUocnVuRGV2aWNlVGVzdHMoVEVTVF9QQUNLQUdFLCBURVNUX0NMQVNTLCAidGVzdE5vRG0iKSk7CisKKyAgICAgICAgLy8gQWRkIG9ubHkgYSBzcGxpdCAuZG0gZmlsZSBkdXJpbmcgdXBkYXRlLgorICAgICAgICBuZXcgSW5zdGFsbE11bHRpcGxlKCkuYWRkQXJnKCItciIpLmFkZEFwayhtQXBrQmFzZUZpbGUpCisgICAgICAgICAgICAgICAgLmFkZEFwayhtQXBrRmVhdHVyZUFGaWxlKS5hZGREbShtRG1GZWF0dXJlQUZpbGUpLnJ1bigpOworICAgICAgICBhc3NlcnROb3ROdWxsKGdldERldmljZSgpLmdldEFwcFBhY2thZ2VJbmZvKElOU1RBTExfUEFDS0FHRSkpOworCisgICAgICAgIGFzc2VydFRydWUocnVuRGV2aWNlVGVzdHMoVEVTVF9QQUNLQUdFLCBURVNUX0NMQVNTLCAidGVzdERtRm9yU3BsaXRCdXROb0Jhc2UiKSk7CisgICAgfQorICAgIC8qKgorICAgICAqIFZlcmlmeSAuZG0gaW5zdGFsbGF0aW9uIGZvciBiYXNlIGJ1dCBub3QgZm9yIHNwbGl0cyBhbmQgd2l0aCBhIC5kbSBmaWxlIHRoYXQgZG9lc24ndCBtYXRjaAorICAgICAqIGFuIGFway4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsRG1Gb3JCYXNlQnV0Tm9TcGxpdFdpdGhOb01hdGNoaW5nRG0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSBub25NYXRjaGluZ0RtID0gbmV3IEZpbGUobURtRmVhdHVyZUFGaWxlLmdldEFic29sdXRlRmlsZSgpLmdldEFic29sdXRlUGF0aCgpCisgICAgICAgICAgICAgICAgLnJlcGxhY2UoIi5kbSIsICIubm90LnRoZXJlLmRtIikpOworICAgICAgICBGaWxlVXRpbC5jb3B5RmlsZShtRG1GZWF0dXJlQUZpbGUsIG5vbk1hdGNoaW5nRG0pOworICAgICAgICBuZXcgSW5zdGFsbE11bHRpcGxlKCkuYWRkQXBrKG1BcGtCYXNlRmlsZSkuYWRkRG0obURtQmFzZUZpbGUpCisgICAgICAgICAgICAgICAgLmFkZEFwayhtQXBrRmVhdHVyZUFGaWxlKS5hZGREbShub25NYXRjaGluZ0RtKS5ydW4oKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChnZXREZXZpY2UoKS5nZXRBcHBQYWNrYWdlSW5mbyhJTlNUQUxMX1BBQ0tBR0UpKTsKKworICAgICAgICBhc3NlcnRUcnVlKHJ1bkRldmljZVRlc3RzKFRFU1RfUEFDS0FHRSwgVEVTVF9DTEFTUywgInRlc3REbUZvckJhc2VCdXROb1NwbGl0IikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByb2ZpbGVTbmFwc2hvdEFmdGVySW5zdGFsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3N1bWVQcm9maWxlc0FyZUVuYWJsZWQoKTsKKworICAgICAgICAvLyBJbnN0YWxsIHRoZSBhcHAuCisgICAgICAgIG5ldyBJbnN0YWxsTXVsdGlwbGUoKS5hZGRBcGsobUFwa0Jhc2VGaWxlKS5hZGREbShtRG1CYXNlRmlsZSkucnVuKCk7CisKKyAgICAgICAgLy8gVGFrZSBhIHNuYXBzaG90IG9mIHRoZSBpbnN0YWxsZWQgcHJvZmlsZS4KKyAgICAgICAgU3RyaW5nIHNuYXBzaG90Q21kID0gImNtZCBwYWNrYWdlIHNuYXBzaG90LXByb2ZpbGUgIiArIElOU1RBTExfUEFDS0FHRTsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IGdldERldmljZSgpLmV4ZWN1dGVTaGVsbENvbW1hbmQoc25hcHNob3RDbWQpOworICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC50cmltKCkuaXNFbXB0eSgpKTsKKworICAgICAgICAvLyBFeHRyYWN0IHRoZSBwcm9maWxlIGJ5dGVzIGZyb20gdGhlIGRleCBtZXRhZGF0YSBhbmQgZnJvbSB0aGUgcHJvZmlsZSBzbmFwc2hvdC4KKyAgICAgICAgYnl0ZVtdIHNuYXBzaG90UHJvZmlsZUJ5dGVzID0gZXh0cmFjdFByb2ZpbGVTbmFwc2hvdEZyb21EZXZpY2UoKTsKKyAgICAgICAgYnl0ZVtdIGV4cGVjdGVkUHJvZmlsZUJ5dGVzID0gZXh0cmFjdFByb2ZpbGVGcm9tRGV4TWV0YWRhdGEobURtQmFzZUZpbGUpOworCisgICAgICAgIGFzc2VydEFycmF5RXF1YWxzKGV4cGVjdGVkUHJvZmlsZUJ5dGVzLCBzbmFwc2hvdFByb2ZpbGVCeXRlcyk7CisgICAgfQorCisgICAgLyoqIFZlcmlmeSB0aGF0IHRoZSB1c2Ugb2YgcHJvZmlsZXMgaXMgZW5hYmxlZCBvbiB0aGUgZGV2aWNlLiAqLworICAgIHByaXZhdGUgdm9pZCBhc3N1bWVQcm9maWxlc0FyZUVuYWJsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHVzZVByb2ZpbGVzID0gZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZCgKKyAgICAgICAgICAgICJnZXRwcm9wIGRhbHZpay52bS51c2VqaXRwcm9maWxlcyIpLnJlcGxhY2UoIlxuIiwgIiIpOworICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZSgiU2tpcCBwcm9maWxlIHNuYXBzaG90IHRlc3Q6ICIKKyAgICAgICAgICAgICsgImRhbHZpay52bS51c2VqaXRwcm9maWxlcyAhPSB0cnVlIiwgInRydWUiLmVxdWFscyh1c2VQcm9maWxlcykpOworICAgIH0KKworICAgIC8qKiBFeHRyYWN0cyB0aGUgcHJvZmlsZSBieXRlcyBmb3IgdGhlIHNuYXBzaG90IGNhcHR1cmVkIHdpdGggJ2NtZCBwYWNrYWdlIHNuYXBzaG90LXByb2ZpbGUnICovCisgICAgcHJpdmF0ZSBieXRlW10gZXh0cmFjdFByb2ZpbGVTbmFwc2hvdEZyb21EZXZpY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSBzbmFwc2hvdEZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKElOU1RBTExfUEFDS0FHRSwgInByaW1hcnkucHJvZiIpOworICAgICAgICBzbmFwc2hvdEZpbGUuZGVsZXRlT25FeGl0KCk7CisgICAgICAgIGdldERldmljZSgpLnB1bGxGaWxlKGdldFNuYXBzaG90TG9jYXRpb24oSU5TVEFMTF9QQUNLQUdFKSwgc25hcHNob3RGaWxlKTsKKyAgICAgICAgcmV0dXJuIEZpbGVzLnJlYWRBbGxCeXRlcyhzbmFwc2hvdEZpbGUudG9QYXRoKCkpOworICAgIH0KKworICAgIHN0YXRpYyBwcml2YXRlIFN0cmluZyBnZXRTbmFwc2hvdExvY2F0aW9uKFN0cmluZyBwa2cpIHsKKyAgICAgICAgcmV0dXJuICIvZGF0YS9taXNjL3Byb2ZtYW4vIiArIHBrZyArICIucHJvZiI7CisgICAgfQorCisgICAgLyoqIEV4dHJhY3RzIHRoZSBwcm9maWxlIGJ5dGVzIGZyb20gdGhlIGRleCBtZXRhZGF0YSBwcm9maWxlLiAqLworICAgIHN0YXRpYyBwcml2YXRlIGJ5dGVbXSBleHRyYWN0UHJvZmlsZUZyb21EZXhNZXRhZGF0YShGaWxlIGRtRmlsZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSAoWmlwSW5wdXRTdHJlYW0gaW4gPSBuZXcgWmlwSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShkbUZpbGUpKSkgeworICAgICAgICAgICAgZm9yIChaaXBFbnRyeSB6ZTsgKHplID0gaW4uZ2V0TmV4dEVudHJ5KCkpICE9IG51bGw7ICkgeworICAgICAgICAgICAgICAgIGlmICghInByaW1hcnkucHJvZiIuZXF1YWxzKHplLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisKKyAgICAgICAgICAgICAgICBmaW5hbCBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbMTI4XTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBjb3VudDsgKGNvdW50ID0gaW4ucmVhZChidWZmZXIpKSAhPSAtMTsgKSB7CisgICAgICAgICAgICAgICAgICAgIGJvcy53cml0ZShidWZmZXIsIDAsIGNvdW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGJvcy50b0J5dGVBcnJheSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInByaW1hcnkucHJvZiBub3QgZm91bmQgaW4gdGhlIC5kbSBmaWxlIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXh0cmFjdCBhIHJlc291cmNlIGludG8gdGhlIGdpdmVuIGRpcmVjdG9yeSBhbmQgcmV0dXJuIGEgcmVmZXJlbmNlIHRvIGl0cyBmaWxlLgorICAgICAqLworICAgIHByaXZhdGUgRmlsZSBleHRyYWN0UmVzb3VyY2UoU3RyaW5nIGZ1bGxSZXNvdXJjZU5hbWUsIEZpbGUgb3V0cHV0RGlyKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEZpbGUgb3V0cHV0RmlsZSA9IG5ldyBGaWxlKG91dHB1dERpciwgZnVsbFJlc291cmNlTmFtZSk7CisgICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaW4gPSBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0oIi8iICsgZnVsbFJlc291cmNlTmFtZSk7CisgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRwdXRGaWxlKSkpIHsKKyAgICAgICAgICAgIGlmIChpbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVzb3VyY2Ugbm90IGZvdW5kOiAiICsgZnVsbFJlc291cmNlTmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbNjU1MzZdOworICAgICAgICAgICAgaW50IGNodW5rU2l6ZTsKKyAgICAgICAgICAgIHdoaWxlICgoY2h1bmtTaXplID0gaW4ucmVhZChidWYpKSAhPSAtMSkgeworICAgICAgICAgICAgICAgIG91dC53cml0ZShidWYsIDAsIGNodW5rU2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG91dHB1dEZpbGU7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBJbnN0YWxsTXVsdGlwbGUgZXh0ZW5kcyBCYXNlSW5zdGFsbE11bHRpcGxlPEluc3RhbGxNdWx0aXBsZT4geworICAgICAgICBJbnN0YWxsTXVsdGlwbGUoKSB7CisgICAgICAgICAgICBzdXBlcihnZXREZXZpY2UoKSwgZ2V0QnVpbGQoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2R1bXBzeXMvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvZHVtcHN5cy9BbmRyb2lkLm1rCmluZGV4IDAzMGE5MTAuLmQxNTk5NmMgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvZHVtcHN5cy9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvZHVtcHN5cy9BbmRyb2lkLm1rCkBAIC0yMSw3ICsyMSw3IEBACiAjIE11c3QgbWF0Y2ggdGhlIHBhY2thZ2UgbmFtZSBpbiBDdHNUZXN0Q2FzZUxpc3QubWsKIExPQ0FMX01PRFVMRSA6PSBDdHNEdW1wc3lzSG9zdFRlc3RDYXNlcwogCi1MT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBjdHMtdHJhZGVmZWQgdHJhZGVmZWQgY29tcGF0aWJpbGl0eS1ob3N0LXV0aWwKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGN0cy10cmFkZWZlZCB0cmFkZWZlZAogCiBMT0NBTF9DVFNfVEVTVF9QQUNLQUdFIDo9IGFuZHJvaWQuZHVtcHN5cwogCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2R1bXBzeXMvQW5kcm9pZFRlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9kdW1wc3lzL0FuZHJvaWRUZXN0LnhtbAppbmRleCAyNTJiZjkwLi4wYWM3YzJlIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2R1bXBzeXMvQW5kcm9pZFRlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvZHVtcHN5cy9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIHRoZSBDVFMgZHVtcHN5cyBob3N0IHRlc3RzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iZnJhbWV3b3JrIiAvPgogICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5KYXJIb3N0VGVzdCI+CiAgICAgICAgIDxvcHRpb24gbmFtZT0iamFyIiB2YWx1ZT0iQ3RzRHVtcHN5c0hvc3RUZXN0Q2FzZXMuamFyIiAvPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kdW1wc3lzL2FwcHMvRnJhbWVzdGF0c1Rlc3RBcHAvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvZHVtcHN5cy9hcHBzL0ZyYW1lc3RhdHNUZXN0QXBwL0FuZHJvaWQubWsKaW5kZXggZmYzNGU2My4uYTc3MmEwNSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kdW1wc3lzL2FwcHMvRnJhbWVzdGF0c1Rlc3RBcHAvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL2R1bXBzeXMvYXBwcy9GcmFtZXN0YXRzVGVzdEFwcC9BbmRyb2lkLm1rCkBAIC0yMSw3ICsyMSw3IEBACiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKIExPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLXN1cHBvcnQtdGVzdAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWR4LnRlc3QucnVsZXMKIAogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0ZyYW1lc3RhdHNUZXN0QXBwCiAKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZHVtcHN5cy9hcHBzL1Byb2NTdGF0c0hlbHBlckFwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9kdW1wc3lzL2FwcHMvUHJvY1N0YXRzSGVscGVyQXBwL0FuZHJvaWQubWsKaW5kZXggM2Y3YmQwOC4uYTNkZjcyNSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kdW1wc3lzL2FwcHMvUHJvY1N0YXRzSGVscGVyQXBwL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9kdW1wc3lzL2FwcHMvUHJvY1N0YXRzSGVscGVyQXBwL0FuZHJvaWQubWsKQEAgLTI3LDkgKzI3LDkgQEAKIExPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGN0cy1qdW5pdAogCiBMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAotICAgIGN0c3Rlc3RydW5uZXIgXAotICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwgXAotICAgIGFuZHJvaWQtc3VwcG9ydC12NAorICAgIGN0c3Rlc3RydW5uZXItYXh0IFwKKyAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBcCisgICAgYW5kcm9pZHgubGVnYWN5X2xlZ2FjeS1zdXBwb3J0LXY0CiAKIExPQ0FMX1NES19WRVJTSU9OIDo9IHRlc3RfY3VycmVudAogCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2R1bXBzeXMvYXBwcy9Qcm9jU3RhdHNIZWxwZXJBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvZHVtcHN5cy9hcHBzL1Byb2NTdGF0c0hlbHBlckFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDFhODQwMTEuLjAxYjljYTggMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvZHVtcHN5cy9hcHBzL1Byb2NTdGF0c0hlbHBlckFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvZHVtcHN5cy9hcHBzL1Byb2NTdGF0c0hlbHBlckFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yMSw2ICsyMSw4IEBACiAgICAgPHVzZXMtc2RrIGFuZHJvaWQ6bWluU2RrVmVyc2lvbj0iMjQiIGFuZHJvaWQ6dGFyZ2V0U2RrVmVyc2lvbj0iMjQiLz4KIAogICAgIDxhcHBsaWNhdGlvbj4KKyAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CisKICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLk1haW5BY3Rpdml0eSIKICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiIC8+CiAgICAgICAgIDxzZXJ2aWNlIGFuZHJvaWQ6bmFtZT0iLlByb2NTdGF0c0hlbHBlclNlcnZpY2VNYWluIgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kdW1wc3lzL2FwcHMvUHJvY1N0YXRzVGVzdEFwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9kdW1wc3lzL2FwcHMvUHJvY1N0YXRzVGVzdEFwcC9BbmRyb2lkLm1rCmluZGV4IDliMmUxOTguLjI0ZTcyYWIgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvZHVtcHN5cy9hcHBzL1Byb2NTdGF0c1Rlc3RBcHAvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL2R1bXBzeXMvYXBwcy9Qcm9jU3RhdHNUZXN0QXBwL0FuZHJvaWQubWsKQEAgLTI0LDEyICsyNCwxMiBAQAogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKLUxPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIgY3RzLWp1bml0CitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzIGN0cy1qdW5pdAogCiBMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAotICAgIGN0c3Rlc3RydW5uZXIgXAotICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwgXAotICAgIGFuZHJvaWQtc3VwcG9ydC12NAorICAgIGN0c3Rlc3RydW5uZXItYXh0IFwKKyAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBcCisgICAgYW5kcm9pZHgubGVnYWN5X2xlZ2FjeS1zdXBwb3J0LXY0CiAKIExPQ0FMX1NES19WRVJTSU9OIDo9IHRlc3RfY3VycmVudAogCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2R1bXBzeXMvYXBwcy9Qcm9jU3RhdHNUZXN0QXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2R1bXBzeXMvYXBwcy9Qcm9jU3RhdHNUZXN0QXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggNTZjYWNiNS4uMWE3Mjg4NiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kdW1wc3lzL2FwcHMvUHJvY1N0YXRzVGVzdEFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvZHVtcHN5cy9hcHBzL1Byb2NTdGF0c1Rlc3RBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjEsNiArMjEsNiBAQAogICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KICAgICA8L2FwcGxpY2F0aW9uPgogCi0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5zZXJ2ZXIuY3RzLnByb2NzdGF0cyIgLz4KIDwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2R1bXBzeXMvYXBwcy9Qcm9jU3RhdHNUZXN0QXBwL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY3RzL3Byb2NzdGF0cy9Qcm9jU3RhdHNUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2R1bXBzeXMvYXBwcy9Qcm9jU3RhdHNUZXN0QXBwL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY3RzL3Byb2NzdGF0cy9Qcm9jU3RhdHNUZXN0LmphdmEKaW5kZXggYzY4MzZjMy4uYjc3NzFiYyAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kdW1wc3lzL2FwcHMvUHJvY1N0YXRzVGVzdEFwcC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9wcm9jc3RhdHMvUHJvY1N0YXRzVGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvZHVtcHN5cy9hcHBzL1Byb2NTdGF0c1Rlc3RBcHAvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvcHJvY3N0YXRzL1Byb2NTdGF0c1Rlc3QuamF2YQpAQCAtMTUsMTcgKzE1LDE2IEBACiAgKi8KIHBhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyLmN0cy5wcm9jc3RhdHM7CiAKLWltcG9ydCBzdGF0aWMganVuaXQuZnJhbWV3b3JrLkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZS5mYWlsOwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOwotaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2R1bXBzeXMvYXBwcy9zdG9yYWdlZGFwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9kdW1wc3lzL2FwcHMvc3RvcmFnZWRhcHAvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTY3MGRiCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9kdW1wc3lzL2FwcHMvc3RvcmFnZWRhcHAvQW5kcm9pZC5tawpAQCAtMCwwICsxLDM5IEBACisjIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNTdG9yYWdlZFRlc3RBcHAKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQorCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzIGN0cy1qdW5pdAorCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAorICAgIGN0c3Rlc3RydW5uZXItYXh0IFwKKyAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBcCisgICAgYW5kcm9pZHgubGVnYWN5X2xlZ2FjeS1zdXBwb3J0LXY0CisKK0xPQ0FMX1NES19WRVJTSU9OIDo9IHRlc3RfY3VycmVudAorCisjIHRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0CitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworCitpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2R1bXBzeXMvYXBwcy9zdG9yYWdlZGFwcC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9kdW1wc3lzL2FwcHMvc3RvcmFnZWRhcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGI3YTdlCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9kdW1wc3lzL2FwcHMvc3RvcmFnZWRhcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5zZXJ2ZXIuY3RzLnN0b3JhZ2VkIiA+CisKKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0VYVEVSTkFMX1NUT1JBR0UiIC8+CisKKyAgICA8YXBwbGljYXRpb24+CisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgorICAgICAgICA8c2VydmljZSBhbmRyb2lkOm5hbWU9Ii5TaW1wbGVJT1NlcnZpY2UiIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiIC8+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5TaW1wbGVJT0FjdGl2aXR5IiBhbmRyb2lkOmxhYmVsPSJTdG9yYWdlZCBUZXN0IEFjdGl2aXR5Ii8+CisgICAgPC9hcHBsaWNhdGlvbj4KKworICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5hbmRyb2lkLnNlcnZlci5jdHMuc3RvcmFnZWQiIC8+Cis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9hcHBzL3N0b3JhZ2VkYXBwL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY3RzL3N0b3JhZ2VkL1NpbXBsZUlPQWN0aXZpdHkuamF2YSBiL2hvc3RzaWRldGVzdHMvZHVtcHN5cy9hcHBzL3N0b3JhZ2VkYXBwL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY3RzL3N0b3JhZ2VkL1NpbXBsZUlPQWN0aXZpdHkuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9hcHBzL3N0b3JhZ2VkYXBwL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY3RzL3N0b3JhZ2VkL1NpbXBsZUlPQWN0aXZpdHkuamF2YQpyZW5hbWUgdG8gaG9zdHNpZGV0ZXN0cy9kdW1wc3lzL2FwcHMvc3RvcmFnZWRhcHAvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvc3RvcmFnZWQvU2ltcGxlSU9BY3Rpdml0eS5qYXZhCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2R1bXBzeXMvYXBwcy9zdG9yYWdlZGFwcC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9zdG9yYWdlZC9TaW1wbGVJT1NlcnZpY2UuamF2YSBiL2hvc3RzaWRldGVzdHMvZHVtcHN5cy9hcHBzL3N0b3JhZ2VkYXBwL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY3RzL3N0b3JhZ2VkL1NpbXBsZUlPU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZGY1NmEKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2R1bXBzeXMvYXBwcy9zdG9yYWdlZGFwcC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9zdG9yYWdlZC9TaW1wbGVJT1NlcnZpY2UuamF2YQpAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyLmN0cy5zdG9yYWdlZDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLlNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBTaW1wbGVJT1NlcnZpY2UgZXh0ZW5kcyBTZXJ2aWNlIHsKKyAgICBwcml2YXRlIExvb3BlciBtU2VydmljZUxvb3BlcjsKKyAgICBwcml2YXRlIFNlcnZpY2VIYW5kbGVyIG1TZXJ2aWNlSGFuZGxlcjsKKworICAgIHByaXZhdGUgZmluYWwgY2xhc3MgU2VydmljZUhhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyIHsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Q2dyb3VwQ3B1c2V0KCkgeworICAgICAgICAgICAgRmlsZSBjZ3JvdXAgPSBuZXcgRmlsZSgiL3Byb2Mvc2VsZi9jZ3JvdXAiKTsKKyAgICAgICAgICAgIHRyeSAoQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoY2dyb3VwKSkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbGluZTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKGxpbmUgPSBici5yZWFkTGluZSgpKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHBhcnRzID0gbGluZS5zcGxpdCgiOiIpOworICAgICAgICAgICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoID49IDMgJiYgcGFydHNbMV0uZXF1YWxzKCJjcHVzZXQiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnRzWzJdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU2VydmljZUhhbmRsZXIoTG9vcGVyIGxvb3BlcikgeworICAgICAgICAgICAgc3VwZXIobG9vcGVyKTsKKworICAgICAgICAgICAgLy8gU3BpbiBmb3IgMjAgc2Vjb25kcyB1bnRpbCB3ZSBhcmUgbm90IGluIHRoZSBmb3JlZ3JvdW5kLiAoTm90ZQorICAgICAgICAgICAgLy8gdGhhdCBVc2FnZVN0YXRzU2VydmljZSBjb25zaWRlcnMgImZvcmVncm91bmQiIHRvIGJlIGluIHRoZQorICAgICAgICAgICAgLy8gYmFja2dyb3VuZCAtIG9ubHkgdG9wIGFuZCBwZXJzaXN0ZW50IHByb2Nlc3NlcyBhcmUgcmVwb3J0ZWQgYXMKKyAgICAgICAgICAgIC8vIGZvcmVncm91bmQgZm9yIHVpZF9pbykuCisgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSAyMDA7IGkrKykgeworICAgICAgICAgICAgICAgIFN0cmluZyBjcHVzZXQgPSBnZXRDZ3JvdXBDcHVzZXQoKTsKKyAgICAgICAgICAgICAgICBpZiAoY3B1c2V0ID09IG51bGwgfHwgIWNwdXNldC5lcXVhbHMoIi90b3AiKSkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTG9nLmkoIlNpbXBsZUlPU2VydmljZSIsICJjZ3JvdXA6IiArIGdldENncm91cENwdXNldCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBGaWxlIHRlc3RGaWxlID0gbmV3IEZpbGUoZ2V0RmlsZXNEaXIoKSwgIlN0b3JhZ2VkVGVzdF9UZW1wX0JHIik7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNoYXIgZGF0YVtdID0gbmV3IGNoYXJbNDA5Nl07CisgICAgICAgICAgICAgICAgRmlsZVdyaXRlciB3ID0gbmV3IEZpbGVXcml0ZXIodGVzdEZpbGUpOworICAgICAgICAgICAgICAgIHcud3JpdGUoZGF0YSk7CisgICAgICAgICAgICAgICAgdy5mbHVzaCgpOworICAgICAgICAgICAgICAgIHcuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgLy8gU3RvcCB0aGUgc2VydmljZSB1c2luZyB0aGUgc3RhcnRJZCwgc28gdGhhdCB3ZSBkb24ndCBzdG9wCisgICAgICAgICAgICAgICAgLy8gdGhlIHNlcnZpY2UgaW4gdGhlIG1pZGRsZSBvZiBoYW5kbGluZyBhbm90aGVyIGpvYgorICAgICAgICAgICAgICAgIHN0b3BTZWxmKG1zZy5hcmcxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKCkgeworICAgICAgICAvLyBTdGFydCB1cCB0aGUgdGhyZWFkIHJ1bm5pbmcgdGhlIHNlcnZpY2UuICBOb3RlIHRoYXQgd2UgY3JlYXRlIGEKKyAgICAgICAgLy8gc2VwYXJhdGUgdGhyZWFkIGJlY2F1c2UgdGhlIHNlcnZpY2Ugbm9ybWFsbHkgcnVucyBpbiB0aGUgcHJvY2VzcydzCisgICAgICAgIC8vIG1haW4gdGhyZWFkLCB3aGljaCB3ZSBkb24ndCB3YW50IHRvIGJsb2NrLiAgV2UgYWxzbyBtYWtlIGl0CisgICAgICAgIC8vIGJhY2tncm91bmQgcHJpb3JpdHkgc28gQ1BVLWludGVuc2l2ZSB3b3JrIHdpbGwgbm90IGRpc3J1cHQgb3VyIFVJLgorICAgICAgICBIYW5kbGVyVGhyZWFkIHRocmVhZCA9IG5ldyBIYW5kbGVyVGhyZWFkKCJTZXJ2aWNlU3RhcnRBcmd1bWVudHMiLAorICAgICAgICAgICAgICAgIFByb2Nlc3MuVEhSRUFEX1BSSU9SSVRZX0JBQ0tHUk9VTkQpOworICAgICAgICB0aHJlYWQuc3RhcnQoKTsKKworICAgICAgICAvLyBHZXQgdGhlIEhhbmRsZXJUaHJlYWQncyBMb29wZXIgYW5kIHVzZSBpdCBmb3Igb3VyIEhhbmRsZXIKKyAgICAgICAgbVNlcnZpY2VMb29wZXIgPSB0aHJlYWQuZ2V0TG9vcGVyKCk7CisgICAgICAgIG1TZXJ2aWNlSGFuZGxlciA9IG5ldyBTZXJ2aWNlSGFuZGxlcihtU2VydmljZUxvb3Blcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBvblN0YXJ0Q29tbWFuZChJbnRlbnQgaW50ZW50LCBpbnQgZmxhZ3MsIGludCBzdGFydElkKSB7CisgICAgICAgIE1lc3NhZ2UgbXNnID0gbVNlcnZpY2VIYW5kbGVyLm9idGFpbk1lc3NhZ2UoKTsKKyAgICAgICAgbXNnLmFyZzEgPSBzdGFydElkOworICAgICAgICBtU2VydmljZUhhbmRsZXIuc2VuZE1lc3NhZ2UobXNnKTsKKworICAgICAgICByZXR1cm4gU1RBUlRfTk9UX1NUSUNLWTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSUJpbmRlciBvbkJpbmQoSW50ZW50IGludGVudCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2R1bXBzeXMvYXBwcy9zdG9yYWdlZGFwcC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9zdG9yYWdlZC9TdG9yYWdlZFRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvZHVtcHN5cy9hcHBzL3N0b3JhZ2VkYXBwL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY3RzL3N0b3JhZ2VkL1N0b3JhZ2VkVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYjIzZDIKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2R1bXBzeXMvYXBwcy9zdG9yYWdlZGFwcC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9zdG9yYWdlZC9TdG9yYWdlZFRlc3QuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyLmN0cy5zdG9yYWdlZDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKKworLyoqCisgKiBVc2VkIGJ5IFN0b3JhZ2VkVGVzdC4KKyAqLworQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBTdG9yYWdlZFRlc3QgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3RvcmFnZWRUZXN0IjsKKworICAgIHByb3RlY3RlZCBDb250ZXh0IG1Db250ZXh0OworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1Db250ZXh0ID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0VGFyZ2V0Q29udGV4dCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZvcmVncm91bmRJTygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOworICAgICAgICBpbnRlbnQuc2V0Q2xhc3MobUNvbnRleHQsIFNpbXBsZUlPQWN0aXZpdHkuY2xhc3MpOworICAgICAgICBpbnRlbnQuc2V0RmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfQ0xFQVJfVE9QIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLKTsKKyAgICAgICAgbUNvbnRleHQuc3RhcnRBY3Rpdml0eShpbnRlbnQpOworICAgICAgICBUaHJlYWQuc2xlZXAoMzAwMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmFja2dyb3VuZElPKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KCk7CisgICAgICAgIGludGVudC5zZXRDbGFzcyhtQ29udGV4dCwgU2ltcGxlSU9TZXJ2aWNlLmNsYXNzKTsKKyAgICAgICAgbUNvbnRleHQuc3RhcnRTZXJ2aWNlKGludGVudCk7CisgICAgICAgIFRocmVhZC5zbGVlcCgzMDAwKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2R1bXBzeXMvc3JjL2FuZHJvaWQvZHVtcHN5cy9jdHMvQmFzZUR1bXBzeXNUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2R1bXBzeXMvc3JjL2FuZHJvaWQvZHVtcHN5cy9jdHMvQmFzZUR1bXBzeXNUZXN0LmphdmEKaW5kZXggZGQyNzlkOS4uYjAwMDZiNCAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kdW1wc3lzL3NyYy9hbmRyb2lkL2R1bXBzeXMvY3RzL0Jhc2VEdW1wc3lzVGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvZHVtcHN5cy9zcmMvYW5kcm9pZC9kdW1wc3lzL2N0cy9CYXNlRHVtcHN5c1Rlc3QuamF2YQpAQCAtMTgsMTYgKzE4LDE2IEBACiAKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC5idWlsZC5Db21wYXRpYmlsaXR5QnVpbGRIZWxwZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLnRlc3RydW5uZXIuUmVtb3RlQW5kcm9pZFRlc3RSdW5uZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLnRlc3RydW5uZXIuVGVzdElkZW50aWZpZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLnRlc3RydW5uZXIuVGVzdFJlc3VsdDsKIGltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIudGVzdHJ1bm5lci5UZXN0UmVzdWx0LlRlc3RTdGF0dXM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLnRlc3RydW5uZXIuVGVzdFJ1blJlc3VsdDsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5idWlsZC5JQnVpbGRJbmZvOwogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5Db2xsZWN0aW5nT3V0cHV0UmVjZWl2ZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLkRldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuSVRlc3REZXZpY2U7CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQubG9nLkxvZ1V0aWwuQ0xvZzsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5yZXN1bHQuQ29sbGVjdGluZ1Rlc3RMaXN0ZW5lcjsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5yZXN1bHQuVGVzdERlc2NyaXB0aW9uOworaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnJlc3VsdC5UZXN0UmVzdWx0OworaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnJlc3VsdC5UZXN0UnVuUmVzdWx0OwogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkRldmljZVRlc3RDYXNlOwogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLklCdWlsZFJlY2VpdmVyOwogCkBAIC00Myw3ICs0Myw3IEBACiBwdWJsaWMgY2xhc3MgQmFzZUR1bXBzeXNUZXN0IGV4dGVuZHMgRGV2aWNlVGVzdENhc2UgaW1wbGVtZW50cyBJQnVpbGRSZWNlaXZlciB7CiAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkR1bXBzeXNIb3N0VGVzdCI7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9SVU5ORVIgPSAiYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUlVOTkVSID0gImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciI7CiAKICAgICAvKioKICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuCkBAIC0xODgsNyArMTg4LDcgQEAKICAgICAgICAgaWYgKHJlc3VsdC5oYXNGYWlsZWRUZXN0cygpKSB7CiAgICAgICAgICAgICAvLyBidWlsZCBhIG1lYW5pbmdmdWwgZXJyb3IgbWVzc2FnZQogICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBlcnJvckJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigiT24tZGV2aWNlIHRlc3RzIGZhaWxlZDpcbiIpOwotICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8VGVzdElkZW50aWZpZXIsIFRlc3RSZXN1bHQ+IHJlc3VsdEVudHJ5IDoKKyAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFRlc3REZXNjcmlwdGlvbiwgVGVzdFJlc3VsdD4gcmVzdWx0RW50cnkgOgogICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0VGVzdFJlc3VsdHMoKS5lbnRyeVNldCgpKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHRFbnRyeS5nZXRWYWx1ZSgpLmdldFN0YXR1cygpLmVxdWFscyhUZXN0U3RhdHVzLlBBU1NFRCkpIHsKICAgICAgICAgICAgICAgICAgICAgZXJyb3JCdWlsZGVyLmFwcGVuZChyZXN1bHRFbnRyeS5nZXRLZXkoKS50b1N0cmluZygpKTsKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZHVtcHN5cy9zcmMvYW5kcm9pZC9kdW1wc3lzL2N0cy9CYXR0ZXJ5U3RhdHNEdW1wc3lzVGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9kdW1wc3lzL3NyYy9hbmRyb2lkL2R1bXBzeXMvY3RzL0JhdHRlcnlTdGF0c0R1bXBzeXNUZXN0LmphdmEKaW5kZXggMjViYjY1Zi4uMDYxNGRiNiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9kdW1wc3lzL3NyYy9hbmRyb2lkL2R1bXBzeXMvY3RzL0JhdHRlcnlTdGF0c0R1bXBzeXNUZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9kdW1wc3lzL3NyYy9hbmRyb2lkL2R1bXBzeXMvY3RzL0JhdHRlcnlTdGF0c0R1bXBzeXNUZXN0LmphdmEKQEAgLTE4LDggKzE4LDYgQEAKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLmJ1aWxkLkNvbXBhdGliaWxpdHlCdWlsZEhlbHBlcjsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ2RkVGVzdDsKLQogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC0zOSwxNCArMzcsMTIgQEAKICAgICAgKgogICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCiAgICAgICovCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjYuMS9DLTAtMyIpCiAgICAgcHVibGljIHZvaWQgdGVzdEJhdHRlcnlzdGF0c091dHB1dCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBTdHJpbmcgYmF0dGVyeXN0YXRzID0gbURldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKCJkdW1wc3lzIGJhdHRlcnlzdGF0cyAtLWNoZWNraW4iKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChiYXR0ZXJ5c3RhdHMpOwogICAgICAgICBhc3NlcnRUcnVlKGJhdHRlcnlzdGF0cy5sZW5ndGgoKSA+IDApOwogCiAgICAgICAgIFNldDxTdHJpbmc+IHNlZW5UYWdzID0gbmV3IEhhc2hTZXQ8PigpOwotICAgICAgICBpbnQgdmVyc2lvbiA9IC0xOwogCiAgICAgICAgIHRyeSAoQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAogICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdSZWFkZXIoYmF0dGVyeXN0YXRzKSkpIHsKQEAgLTk4LDcgKzk0LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja1ZpYnJhdG9yKHBhcnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlICJmZyI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGVja0ZvcmVncm91bmQocGFydHMpOworICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tGb3JlZ3JvdW5kQWN0aXZpdHkocGFydHMpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgImZncyI6CisgICAgICAgICAgICAgICAgICAgICAgICBjaGVja0ZvcmVncm91bmRTZXJ2aWNlKHBhcnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlICJzdCI6CiAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja1N0YXRlVGltZShwYXJ0cyk7CkBAIC0xMTUsNiArMTE0LDEyIEBACiAgICAgICAgICAgICAgICAgICAgIGNhc2UgImpiIjoKICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrSm9iKHBhcnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICJqYmMiOgorICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tKb2JDb21wbGV0aW9uKHBhcnRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICJqYmQiOgorICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tKb2JzRGVmZXJyZWQocGFydHMpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgImt3bCI6CiAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja0tlcm5lbFdha2Vsb2NrKHBhcnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjYxLDIwICsyNjYsMjcgQEAKICAgICAgICAgYXNzZXJ0SW50ZWdlcihwYXJ0c1s1XSk7IC8vIGNvdW50CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrRm9yZWdyb3VuZChTdHJpbmdbXSBwYXJ0cykgeworICAgIHByaXZhdGUgdm9pZCBjaGVja0ZvcmVncm91bmRBY3Rpdml0eShTdHJpbmdbXSBwYXJ0cykgeworICAgICAgICBhc3NlcnRFcXVhbHMoNiwgcGFydHMubGVuZ3RoKTsKKyAgICAgICAgYXNzZXJ0SW50ZWdlcihwYXJ0c1s0XSk7IC8vIHRvdGFsVGltZQorICAgICAgICBhc3NlcnRJbnRlZ2VyKHBhcnRzWzVdKTsgLy8gY291bnQKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tGb3JlZ3JvdW5kU2VydmljZShTdHJpbmdbXSBwYXJ0cykgewogICAgICAgICBhc3NlcnRFcXVhbHMoNiwgcGFydHMubGVuZ3RoKTsKICAgICAgICAgYXNzZXJ0SW50ZWdlcihwYXJ0c1s0XSk7IC8vIHRvdGFsVGltZQogICAgICAgICBhc3NlcnRJbnRlZ2VyKHBhcnRzWzVdKTsgLy8gY291bnQKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgY2hlY2tTdGF0ZVRpbWUoU3RyaW5nW10gcGFydHMpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEwLCBwYXJ0cy5sZW5ndGgpOwotICAgICAgICBhc3NlcnRJbnRlZ2VyKHBhcnRzWzRdKTsgLy8gdG9wCi0gICAgICAgIGFzc2VydEludGVnZXIocGFydHNbNV0pOyAvLyBmb3JlZ3JvdW5kX3NlcnZpY2UKLSAgICAgICAgYXNzZXJ0SW50ZWdlcihwYXJ0c1s2XSk7IC8vIHRvcF9zbGVlcGluZwotICAgICAgICBhc3NlcnRJbnRlZ2VyKHBhcnRzWzddKTsgLy8gZm9yZWdyb3VuZAotICAgICAgICBhc3NlcnRJbnRlZ2VyKHBhcnRzWzhdKTsgLy8gYmFja2dyb3VuZAotICAgICAgICBhc3NlcnRJbnRlZ2VyKHBhcnRzWzldKTsgLy8gY2FjaGVkCisgICAgICAgIGFzc2VydEVxdWFscygxMSwgcGFydHMubGVuZ3RoKTsKKyAgICAgICAgYXNzZXJ0SW50ZWdlcihwYXJ0c1s0XSk7ICAvLyB0b3AKKyAgICAgICAgYXNzZXJ0SW50ZWdlcihwYXJ0c1s1XSk7ICAvLyBmb3JlZ3JvdW5kX3NlcnZpY2UKKyAgICAgICAgYXNzZXJ0SW50ZWdlcihwYXJ0c1s2XSk7ICAvLyBmb3JlZ3JvdW5kCisgICAgICAgIGFzc2VydEludGVnZXIocGFydHNbN10pOyAgLy8gYmFja2dyb3VuZAorICAgICAgICBhc3NlcnRJbnRlZ2VyKHBhcnRzWzhdKTsgIC8vIHRvcF9zbGVlcGluZworICAgICAgICBhc3NlcnRJbnRlZ2VyKHBhcnRzWzldKTsgIC8vIGhlYXZ5X3dlaWdodAorICAgICAgICBhc3NlcnRJbnRlZ2VyKHBhcnRzWzEwXSk7IC8vIGNhY2hlZAogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBjaGVja1dha2Vsb2NrKFN0cmluZ1tdIHBhcnRzKSB7CkBAIC0zNDAsNiArMzUyLDI4IEBACiAgICAgICAgIGFzc2VydEludGVnZXIocGFydHNbOF0pOyAvLyBiZ0NvdW50CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrSm9iQ29tcGxldGlvbihTdHJpbmdbXSBwYXJ0cykgeworICAgICAgICBhc3NlcnRFcXVhbHMoMTAsIHBhcnRzLmxlbmd0aCk7CisgICAgICAgIGFzc2VydE5vdE51bGwocGFydHNbNF0pOyAvLyBqb2IKKyAgICAgICAgYXNzZXJ0SW50ZWdlcihwYXJ0c1s1XSk7IC8vIHJlYXNvbl9jYW5jZWxlZAorICAgICAgICBhc3NlcnRJbnRlZ2VyKHBhcnRzWzZdKTsgLy8gcmVhc29uX2NvbnN0cmFpbnRzX25vdF9zYXRpc2ZpZWQKKyAgICAgICAgYXNzZXJ0SW50ZWdlcihwYXJ0c1s3XSk7IC8vIHJlYXNvbl9wcmVlbXB0CisgICAgICAgIGFzc2VydEludGVnZXIocGFydHNbOF0pOyAvLyByZWFzb25fdGltZW91dAorICAgICAgICBhc3NlcnRJbnRlZ2VyKHBhcnRzWzldKTsgLy8gcmVhc29uX2RldmljZV9pZGxlCisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrSm9ic0RlZmVycmVkKFN0cmluZ1tdIHBhcnRzKSB7CisgICAgICAgIGFzc2VydEVxdWFscygxMiwgcGFydHMubGVuZ3RoKTsKKyAgICAgICAgYXNzZXJ0SW50ZWdlcihwYXJ0c1s0XSk7IC8vIGpvYnNEZWZlcnJlZEV2ZW50Q291bnQKKyAgICAgICAgYXNzZXJ0SW50ZWdlcihwYXJ0c1s1XSk7IC8vIGpvYnNEZWZlcnJlZENvdW50CisgICAgICAgIGFzc2VydEludGVnZXIocGFydHNbNl0pOyAvLyB0b3RhbExhdGVuY3lNaWxsaXMKKyAgICAgICAgYXNzZXJ0SW50ZWdlcihwYXJ0c1s3XSk7IC8vIGNvdW50IGF0IGxhdGVuY3kgPCAxIGhyCisgICAgICAgIGFzc2VydEludGVnZXIocGFydHNbOF0pOyAvLyBjb3VudCBhdCBsYXRlbmN5IDEtMiBocnMKKyAgICAgICAgYXNzZXJ0SW50ZWdlcihwYXJ0c1s5XSk7IC8vIGNvdW50IGF0IGxhdGVuY3kgMi00IGhycworICAgICAgICBhc3NlcnRJbnRlZ2VyKHBhcnRzWzEwXSk7IC8vIGNvdW50IGF0IGxhdGVuY3kgNC04IGhycworICAgICAgICBhc3NlcnRJbnRlZ2VyKHBhcnRzWzExXSk7IC8vIGNvdW50IGF0IGxhdGVuY3kgOCsgaHJzCisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIGNoZWNrS2VybmVsV2FrZWxvY2soU3RyaW5nW10gcGFydHMpIHsKICAgICAgICAgYXNzZXJ0VHJ1ZShwYXJ0cy5sZW5ndGggPj0gNyk7CiAJYXNzZXJ0Tm90TnVsbChwYXJ0c1s0XSk7IC8vIEtlcm5lbCB3YWtlbG9jawpAQCAtNDQ1LDcgKzQ3OSw3IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGNoZWNrQmF0dGVyeURpc2NoYXJnZShTdHJpbmdbXSBwYXJ0cykgewotICAgICAgICBhc3NlcnRFcXVhbHMoMTIsIHBhcnRzLmxlbmd0aCk7CisgICAgICAgIGFzc2VydEVxdWFscygxNCwgcGFydHMubGVuZ3RoKTsKICAgICAgICAgYXNzZXJ0SW50ZWdlcihwYXJ0c1s0XSk7IC8vIGxvdwogICAgICAgICBhc3NlcnRJbnRlZ2VyKHBhcnRzWzVdKTsgLy8gaGlnaAogICAgICAgICBhc3NlcnRJbnRlZ2VyKHBhcnRzWzZdKTsgLy8gc2NyZWVuT24KQEAgLTQ1NCw2ICs0ODgsOCBAQAogICAgICAgICBhc3NlcnRJbnRlZ2VyKHBhcnRzWzldKTsgLy8gZGlzY2hhcmdlU2NyZWVuT2ZmTWFoCiAgICAgICAgIGFzc2VydEludGVnZXIocGFydHNbMTBdKTsgLy8gZGlzY2hhcmdlRG96ZUNvdW50CiAgICAgICAgIGFzc2VydEludGVnZXIocGFydHNbMTFdKTsgLy8gZGlzY2hhcmdlRG96ZU1haAorICAgICAgICBhc3NlcnRJbnRlZ2VyKHBhcnRzWzEyXSk7IC8vIGRpc2NoYXJnZUxpZ2h0RG96ZU1haAorICAgICAgICBhc3NlcnRJbnRlZ2VyKHBhcnRzWzEzXSk7IC8vIGRpc2NoYXJnZURlZXBEb3plTWFoCiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGNoZWNrQmF0dGVyeUxldmVsKFN0cmluZ1tdIHBhcnRzKSB7CkBAIC01MzEsNyArNTY3LDcgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgY2hlY2tEYXRhQ29ubmVjdGlvbihTdHJpbmdbXSBwYXJ0cykgewotICAgICAgICBhc3NlcnRFcXVhbHMoMjEsIHBhcnRzLmxlbmd0aCk7CisgICAgICAgIGFzc2VydEVxdWFscygyNSwgcGFydHMubGVuZ3RoKTsKICAgICAgICAgYXNzZXJ0SW50ZWdlcihwYXJ0c1s0XSk7ICAvLyBub25lCiAgICAgICAgIGFzc2VydEludGVnZXIocGFydHNbNV0pOyAgLy8gZ3BycwogICAgICAgICBhc3NlcnRJbnRlZ2VyKHBhcnRzWzZdKTsgIC8vIGVkZ2UKQEAgLTU0OCw3ICs1ODQsMTEgQEAKICAgICAgICAgYXNzZXJ0SW50ZWdlcihwYXJ0c1sxN10pOyAvLyBsdGUKICAgICAgICAgYXNzZXJ0SW50ZWdlcihwYXJ0c1sxOF0pOyAvLyBlaHJwZAogICAgICAgICBhc3NlcnRJbnRlZ2VyKHBhcnRzWzE5XSk7IC8vIGhzcGFwCi0gICAgICAgIGFzc2VydEludGVnZXIocGFydHNbMjBdKTsgLy8gb3RoZXIKKyAgICAgICAgYXNzZXJ0SW50ZWdlcihwYXJ0c1syMF0pOyAvLyBnc20KKyAgICAgICAgYXNzZXJ0SW50ZWdlcihwYXJ0c1syMV0pOyAvLyB0ZF9zY2RtYQorICAgICAgICBhc3NlcnRJbnRlZ2VyKHBhcnRzWzIyXSk7IC8vIGl3bGFuCisgICAgICAgIGFzc2VydEludGVnZXIocGFydHNbMjNdKTsgLy8gbHRlX2NhCisgICAgICAgIGFzc2VydEludGVnZXIocGFydHNbMjRdKTsgLy8gb3RoZXIKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgY2hlY2tXaWZpU3RhdGUoU3RyaW5nW10gcGFydHMpIHsKQEAgLTcyNiw3ICs3NjYsOCBAQAogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgVElNRVNUQU1QX0NPVU5UOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgbnVtcGFydHNbaV0gPSBhc3NlcnRJbnRlZ2VyKHBhcnRzW2ldKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG51bXBhcnRzWzBdICE9IDApIHsKKyAgICAgICAgICAgICAgICAvLyBGbGFncyA9IDEganVzdCBtZWFucyB0aGUgZmlyc3QgZnJhbWUgb2YgdGhlIHdpbmRvdworICAgICAgICAgICAgICAgIGlmIChudW1wYXJ0c1swXSAhPSAwICYmIG51bXBhcnRzWzBdICE9IDEpIHsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8vIGFzc2VydCBWU1lOQyA+PSBJTlRFTkRFRF9WU1lOQwpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9kdW1wc3lzL3NyYy9hbmRyb2lkL2R1bXBzeXMvY3RzL1Byb2Nlc3NTdGF0c0R1bXBzeXNUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2R1bXBzeXMvc3JjL2FuZHJvaWQvZHVtcHN5cy9jdHMvUHJvY2Vzc1N0YXRzRHVtcHN5c1Rlc3QuamF2YQppbmRleCA1ZWI2YTcxLi5jMzFjYzgwIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2R1bXBzeXMvc3JjL2FuZHJvaWQvZHVtcHN5cy9jdHMvUHJvY2Vzc1N0YXRzRHVtcHN5c1Rlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2R1bXBzeXMvc3JjL2FuZHJvaWQvZHVtcHN5cy9jdHMvUHJvY2Vzc1N0YXRzRHVtcHN5c1Rlc3QuamF2YQpAQCAtMTgsOCArMTgsNiBAQAogCiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQubG9nLkxvZ1V0aWwuQ0xvZzsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ2RkVGVzdDsKLQogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CiBpbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CkBAIC01Miw4ICs1MCwxMCBAQAogICAgICAqIFRlc3RzIHRoZSBvdXRwdXQgb2YgImR1bXBzeXMgcHJvY3N0YXRzIC1jIi4gVGhpcyBpcyBhIHByb3h5IGZvciB0ZXN0aW5nICJkdW1wc3lzIHByb2NzdGF0cwogICAgICAqIC0tY2hlY2tpbiIsIHNpbmNlIHRoZSBsYXR0ZXIgaXMgbm90IGlkZW1wb3RlbnQuCiAgICAgICovCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjYuMS9DLTAtMi9DLTAtMyIpCiAgICAgcHVibGljIHZvaWQgdGVzdFByb2NzdGF0c091dHB1dCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAodHJ1ZSkgeworICAgICAgICAgICAgcmV0dXJuOyAvLyBUT0RPIGh0dHA6Ly9iLzcwODU4NzI5CisgICAgICAgIH0KICAgICAgICAgLy8gRmlyc3QsIHJ1biB0aGUgaGVscGVyIGFwcCBzbyB0aGF0IHdlIGhhdmUgc29tZSBpbnRlcmVzdGluZyByZWNvcmRzIGluIHRoZSBvdXRwdXQuCiAgICAgICAgIGNoZWNrV2l0aFByb2NTdGF0c0FwcCgpOwogCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2R1bXBzeXMvc3JjL2FuZHJvaWQvZHVtcHN5cy9jdHMvU3RvcmFnZWREdW1wc3lzVGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9kdW1wc3lzL3NyYy9hbmRyb2lkL2R1bXBzeXMvY3RzL1N0b3JhZ2VkRHVtcHN5c1Rlc3QuamF2YQppbmRleCAxMjlkNDEyLi5kMzkxYjY0IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2R1bXBzeXMvc3JjL2FuZHJvaWQvZHVtcHN5cy9jdHMvU3RvcmFnZWREdW1wc3lzVGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvZHVtcHN5cy9zcmMvYW5kcm9pZC9kdW1wc3lzL2N0cy9TdG9yYWdlZER1bXBzeXNUZXN0LmphdmEKQEAgLTE3LDE3ICsxNywxMyBAQAogcGFja2FnZSBhbmRyb2lkLmR1bXBzeXMuY3RzOwogCiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQuYnVpbGQuQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi50ZXN0cnVubmVyLlJlbW90ZUFuZHJvaWRUZXN0UnVubmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi50ZXN0cnVubmVyLlRlc3RJZGVudGlmaWVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi50ZXN0cnVubmVyLlRlc3RSZXN1bHQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLnRlc3RydW5uZXIuVGVzdFJlc3VsdC5UZXN0U3RhdHVzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi50ZXN0cnVubmVyLlRlc3RSdW5SZXN1bHQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLkRldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5yZXN1bHQuQ29sbGVjdGluZ1Rlc3RMaXN0ZW5lcjsKIAogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CiBpbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKK2ltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKIAogLyoqCiAgKiBUZXN0IHRvIGNoZWNrIHRoZSBmb3JtYXQgb2YgdGhlIGR1bXBzIG9mIHRoZSBwcm9jZXNzc3RhdHMgdGVzdC4KQEAgLTQyLDYgKzM4LDIxIEBACiAgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoREVWSUNFX1NJREVfVEVTVF9QQUNLQUdFKTsKICAgICB9CiAKKyAgICBwcml2YXRlIFN0cmluZyBnZXRDZ3JvdXBGcm9tTG9nKFN0cmluZyBsb2cpIHsKKyAgICAgICAgUGF0dGVybiBwYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCJjZ3JvdXA6KFteXFxzXSspIiwgUGF0dGVybi5NVUxUSUxJTkUpOworICAgICAgICBNYXRjaGVyIG1hdGNoZXIgPSBwYXR0ZXJuLm1hdGNoZXIobG9nKTsKKyAgICAgICAgaWYgKG1hdGNoZXIuZmluZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gbWF0Y2hlci5ncm91cCgxKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRDdXJyZW50TG9nY2F0RGF0ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBsb25nIHRpbWVzdGFtcE1zID0gZ2V0RGV2aWNlKCkuZ2V0RGV2aWNlRGF0ZSgpOworICAgICAgICByZXR1cm4gbmV3IFNpbXBsZURhdGVGb3JtYXQoIk1NLWRkIEhIOm1tOnNzLlNTUyIpCisgICAgICAgICAgICAuZm9ybWF0KG5ldyBEYXRlKHRpbWVzdGFtcE1zKSk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogVGVzdHMgdGhlIG91dHB1dCBvZiAiZHVtcHN5cyBzdG9yYWdlZCAtLWZvcmNlIC0taG91cnMgMC4wMSIuCiAgICAgICoKQEAgLTYyLDkgKzczLDE4IEBACiAKICAgICAgICAgbURldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKCJkdW1wc3lzIHN0b3JhZ2VkIC0tZm9yY2UiKTsKIAorICAgICAgICBTdHJpbmcgbG9nY2F0RGF0ZSA9IGdldEN1cnJlbnRMb2djYXREYXRlKCk7CisKICAgICAgICAgcnVuRGV2aWNlVGVzdHMoREVWSUNFX1NJREVfVEVTVF9QQUNLQUdFLAogICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5zZXJ2ZXIuY3RzLnN0b3JhZ2VkLlN0b3JhZ2VkVGVzdCIsCiAgICAgICAgICAgICAgICAgInRlc3RCYWNrZ3JvdW5kSU8iKTsKKyAgICAgICAgU3RyaW5nIGxvZyA9IG1EZXZpY2UuZXhlY3V0ZUFkYkNvbW1hbmQoCisgICAgICAgICAgICAgICAgImxvZ2NhdCIsICItdiIsICJicmllZiIsICItZCIsICItdCIsIGxvZ2NhdERhdGUsCisgICAgICAgICAgICAgICAgIlNpbXBsZUlPU2VydmljZTpJIiwgIio6UyIpOworICAgICAgICBTdHJpbmcgc2VydmljZUNncm91cCA9IGdldENncm91cEZyb21Mb2cobG9nKTsKKyAgICAgICAgaWYgKHNlcnZpY2VDZ3JvdXAgIT0gbnVsbCAmJiBzZXJ2aWNlQ2dyb3VwLmVxdWFscygiL3RvcCIpKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIldBUk5JTkc6IFNlcnZpY2Ugd2FzIG5vdCBpbiB0aGUgY29ycmVjdCBjZ3JvdXA7IEFjdGl2aXR5TWFuYWdlciBtYXkgYmUgdW5yZXNwb25zaXZlLiIpOworICAgICAgICB9CiAKICAgICAgICAgcnVuRGV2aWNlVGVzdHMoREVWSUNFX1NJREVfVEVTVF9QQUNLQUdFLAogICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5zZXJ2ZXIuY3RzLnN0b3JhZ2VkLlN0b3JhZ2VkVGVzdCIsCkBAIC0xMDIsNyArMTIyLDcgQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpZiAocGFydHNbMF0uZXF1YWxzKERFVklDRV9TSURFX1RFU1RfUEFDS0FHRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICAqIG9yZGVyIG9mIHBhcnRzIGluIFN0b3JhZ2VkU2VydmljZTo6ZHVtcFVpZFJlY29yZHMKICAgICAgICAgICAgICAgICAgICAgICogIFswXSBERVZJQ0VfU0lERV9URVNUX1BBQ0tBR0UKICAgICAgICAgICAgICAgICAgICAgICogIFsxXSByZWFkIGZvcmVncm91bmQgY2hhcmdlcl9vZmYKQEAgLTEyNyw3ICsxNDcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJ0eXBpY2FsIDUwMG1BIGJlY2F1c2UgaXQgaXMgbGVzcyB0aGFuIDAuMDVDLlxuIik7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKChJbnRlZ2VyLnBhcnNlSW50KHBhcnRzWzZdKSA+PSA0MDk2ICYmIEludGVnZXIucGFyc2VJbnQocGFydHNbOF0pID49IDQwOTYpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIucGFyc2VJbnQocGFydHNbOF0pID49IDgxOTIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci5wYXJzZUludChwYXJ0c1s4XSkgPj0gODE5Mik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaGFzVGVzdElPID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2VkaS9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9lZGkvQW5kcm9pZC5tawppbmRleCBjM2IwN2VjLi5hNDAzY2RlIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2VkaS9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvZWRpL0FuZHJvaWQubWsKQEAgLTIxLDcgKzIxLDcgQEAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCiAKICMgdGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cyBjdHNfaW5zdGFudAogCiBMT0NBTF9NT0RVTEUgOj0gQ3RzRWRpSG9zdFRlc3RDYXNlcwogCkBAIC0yOSw0ICsyOSw0IEBACiAKIGluY2x1ZGUgJChCVUlMRF9IT1NUX0pBVkFfTElCUkFSWSkKIAotaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2luY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZWRpL0FuZHJvaWRUZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvZWRpL0FuZHJvaWRUZXN0LnhtbAppbmRleCA5NDQ5ZDcyLi5hZWYzMDg2IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2VkaS9BbmRyb2lkVGVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9lZGkvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgRURJIGhvc3QgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9Im1pc2MiIC8+CiAgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRlc3R0eXBlLkphckhvc3RUZXN0IiA+CiAgICAgICAgIDxvcHRpb24gbmFtZT0iamFyIiB2YWx1ZT0iQ3RzRWRpSG9zdFRlc3RDYXNlcy5qYXIiIC8+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2VkaS9zcmMvYW5kcm9pZC9lZGkvY3RzL1Byb2Nlc3NEZXZpY2VJbmZvLmphdmEgYi9ob3N0c2lkZXRlc3RzL2VkaS9zcmMvYW5kcm9pZC9lZGkvY3RzL1Byb2Nlc3NEZXZpY2VJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJlZGFmZAotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvZWRpL3NyYy9hbmRyb2lkL2VkaS9jdHMvUHJvY2Vzc0RldmljZUluZm8uamF2YQpAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5lZGkuY3RzOworCitpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5EZXZpY2VJbmZvOworaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuSG9zdEluZm9TdG9yZTsKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlJvb3RQcm9jZXNzU2Nhbm5lcjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK3B1YmxpYyBjbGFzcyBQcm9jZXNzRGV2aWNlSW5mbyBleHRlbmRzIERldmljZUluZm8geworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29sbGVjdERldmljZUluZm8oSG9zdEluZm9TdG9yZSBzdG9yZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFJvb3RQcm9jZXNzU2Nhbm5lciBzY2FubmVyID0gbmV3IFJvb3RQcm9jZXNzU2Nhbm5lcihnZXREZXZpY2UoKSk7CisgICAgICAgIFNldDxTdHJpbmc+IGFwcHJvdmVkID0gc2Nhbm5lci5nZXRSb290UHJvY2Vzc2VzKHRydWUpOworICAgICAgICBzdG9yZS5hZGRMaXN0UmVzdWx0KCJhcHByb3ZlZF9yb290X3Byb2Nlc3NlcyIsIG5ldyBBcnJheUxpc3Q8U3RyaW5nPihhcHByb3ZlZCkpOworICAgICAgICBTZXQ8U3RyaW5nPiB1bmFwcHJvdmVkID0gc2Nhbm5lci5nZXRSb290UHJvY2Vzc2VzKGZhbHNlKTsKKyAgICAgICAgc3RvcmUuYWRkTGlzdFJlc3VsdCgidW5hcHByb3ZlZF9yb290X3Byb2Nlc3NlcyIsIG5ldyBBcnJheUxpc3Q8U3RyaW5nPih1bmFwcHJvdmVkKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9ncHV0b29scy9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9ncHV0b29scy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyOTQ2YmUKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2dwdXRvb2xzL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKKworIyB0YWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMKKworTE9DQUxfTU9EVUxFIDo9IEN0c0dwdVRvb2xzSG9zdFRlc3RDYXNlcworCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBjdHMtdHJhZGVmZWQgdHJhZGVmZWQgY29tcGF0aWJpbGl0eS1ob3N0LXV0aWwKKworTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IHBsYXRmb3JtLXRlc3QtYW5ub3RhdGlvbnMtaG9zdAorCitpbmNsdWRlICQoQlVJTERfSE9TVF9KQVZBX0xJQlJBUlkpCisKK2luY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZ3B1dG9vbHMvQW5kcm9pZFRlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9ncHV0b29scy9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThlNDFhNwotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvZ3B1dG9vbHMvQW5kcm9pZFRlc3QueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIEN0c0dwdVRvb2xzSG9zdFRlc3RDYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KKyAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9Im1pc2MiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0dwdVRvb2xzUm9vdGxlc3NHcHVEZWJ1Z0FwcC1ERUJVRy5hcGsiIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0dwdVRvb2xzUm9vdGxlc3NHcHVEZWJ1Z0FwcC1SRUxFQVNFLmFwayIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzR3B1VG9vbHNSb290bGVzc0dwdURlYnVnQXBwLUxBWUVSUy5hcGsiIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRlc3R0eXBlLkphckhvc3RUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0iamFyIiB2YWx1ZT0iQ3RzR3B1VG9vbHNIb3N0VGVzdENhc2VzLmphciIgLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2dwdXRvb2xzL2FwcHMvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvZ3B1dG9vbHMvYXBwcy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MTM4MzcKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2dwdXRvb2xzL2FwcHMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDcxIEBACisjIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IGxpYmN0c2dwdXRvb2xzX2puaQorTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICBqbmkvQ3RzR3B1VG9vbHNKbmlPbkxvYWQuY3BwIFwKKyAgICBqbmkvYW5kcm9pZF9ncHV0b29sc19jdHNfUm9vdGxlc3NHcHVEZWJ1Zy5jcHAKK0xPQ0FMX0NGTEFHUyArPSAtc3RkPWMrKzE0IC1XYWxsIC1XZXJyb3IKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYW5kcm9pZCBsaWJ2dWxrYW4gbGlibG9nCitMT0NBTF9OREtfU1RMX1ZBUklBTlQgOj0gYysrX3N0YXRpYworTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAoraW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQorCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQorTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNHcHVUb29sc1Jvb3RsZXNzR3B1RGVidWdBcHAtREVCVUcKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKKworIyB0YWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMKKworTE9DQUxfTVVMVElMSUIgOj0gYm90aAorCitMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBcCitsaWJjdHNncHV0b29sc19qbmkKKworTE9DQUxfQUFQVF9GTEFHUyA6PSBcCistLXJlbmFtZS1tYW5pZmVzdC1wYWNrYWdlIGFuZHJvaWQucm9vdGxlc3NncHVkZWJ1Zy5ERUJVRy5hcHAgXAorLS1kZWJ1Zy1tb2RlCisKK2luY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKK2luY2x1ZGUgJChCVUlMRF9DVFNfU1VQUE9SVF9QQUNLQUdFKQorCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQorTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNHcHVUb29sc1Jvb3RsZXNzR3B1RGVidWdBcHAtUkVMRUFTRQorTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorCisjIHRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0CitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cworCitMT0NBTF9NVUxUSUxJQiA6PSBib3RoCisKK0xPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTIDo9IFwKK2xpYmN0c2dwdXRvb2xzX2puaSBcCitsaWJWa0xheWVyX251bGxMYXllckMKKworTE9DQUxfQUFQVF9GTEFHUyA6PSBcCistLXJlbmFtZS1tYW5pZmVzdC1wYWNrYWdlIGFuZHJvaWQucm9vdGxlc3NncHVkZWJ1Zy5SRUxFQVNFLmFwcAorCitpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCisKK2luY2x1ZGUgJChCVUlMRF9DVFNfU1VQUE9SVF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9ncHV0b29scy9hcHBzL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2dwdXRvb2xzL2FwcHMvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kZTgxMzBmCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9ncHV0b29scy9hcHBzL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwzMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iYW5kcm9pZC5yb290bGVzc2dwdWRlYnVnLmFwcCI+PgorCisgICAgPGFwcGxpY2F0aW9uPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuUm9vdGxlc3NHcHVEZWJ1Z0RldmljZUFjdGl2aXR5IiA+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgPC9hcHBsaWNhdGlvbj4KKworPC9tYW5pZmVzdD4KKworCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2dwdXRvb2xzL2FwcHMvam5pL0N0c0dwdVRvb2xzSm5pT25Mb2FkLmNwcCBiL2hvc3RzaWRldGVzdHMvZ3B1dG9vbHMvYXBwcy9qbmkvQ3RzR3B1VG9vbHNKbmlPbkxvYWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NjFhZWEKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2dwdXRvb2xzL2FwcHMvam5pL0N0c0dwdVRvb2xzSm5pT25Mb2FkLmNwcApAQCAtMCwwICsxLDI5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8am5pLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX2dwdXRvb2xzX2N0c19Sb290bGVzc0dwdURlYnVnKEpOSUVudiopOworCitqaW50IEpOSV9PbkxvYWQoSmF2YVZNKiB2bSwgdm9pZCogLypyZXNlcnZlZCovKSB7CisgICAgSk5JRW52KiBlbnYgPSBudWxscHRyOworICAgIGlmICh2bS0+R2V0RW52KCh2b2lkKiopJmVudiwgSk5JX1ZFUlNJT05fMV80KSAhPSBKTklfT0spCisgICAgICAgIHJldHVybiBKTklfRVJSOworICAgIGlmIChyZWdpc3Rlcl9hbmRyb2lkX2dwdXRvb2xzX2N0c19Sb290bGVzc0dwdURlYnVnKGVudikpCisgICAgICAgIHJldHVybiBKTklfRVJSOworICAgIHJldHVybiBKTklfVkVSU0lPTl8xXzQ7Cit9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2dwdXRvb2xzL2FwcHMvam5pL2FuZHJvaWRfZ3B1dG9vbHNfY3RzX1Jvb3RsZXNzR3B1RGVidWcuY3BwIGIvaG9zdHNpZGV0ZXN0cy9ncHV0b29scy9hcHBzL2puaS9hbmRyb2lkX2dwdXRvb2xzX2N0c19Sb290bGVzc0dwdURlYnVnLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmRkZGJjCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9ncHV0b29scy9hcHBzL2puaS9hbmRyb2lkX2dwdXRvb2xzX2N0c19Sb290bGVzc0dwdURlYnVnLmNwcApAQCAtMCwwICsxLDg3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJSb290bGVzc0dwdURlYnVnIgorCisjaW5jbHVkZSA8YW5kcm9pZC9sb2cuaD4KKyNpbmNsdWRlIDxqbmkuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dnVsa2FuL3Z1bGthbi5oPgorCisjZGVmaW5lIEFMT0dJKG1zZywgLi4uKSBcCisgICAgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19JTkZPLCBMT0dfVEFHLCAobXNnKSwgX19WQV9BUkdTX18pCisjZGVmaW5lIEFMT0dFKG1zZywgLi4uKSBcCisgICAgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19FUlJPUiwgTE9HX1RBRywgKG1zZyksIF9fVkFfQVJHU19fKQorCituYW1lc3BhY2UgeworCitzdGQ6OnN0cmluZyBpbml0VnVsa2FuKCkKK3sKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQgPSAiIjsKKworICAgIGNvbnN0IFZrQXBwbGljYXRpb25JbmZvIGFwcF9pbmZvID0geworICAgICAgICBWS19TVFJVQ1RVUkVfVFlQRV9BUFBMSUNBVElPTl9JTkZPLAorICAgICAgICBudWxscHRyLCAgICAgICAgICAgIC8vIHBOZXh0CisgICAgICAgICJSb290bGVzc0dwdURlYnVnIiwgLy8gYXBwIG5hbWUKKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAvLyBhcHAgdmVyc2lvbgorICAgICAgICBudWxscHRyLCAgICAgICAgICAgIC8vIGVuZ2luZSBuYW1lCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgLy8gZW5naW5lIHZlcnNpb24KKyAgICAgICAgVktfQVBJX1ZFUlNJT05fMV8wLAorICAgIH07CisgICAgY29uc3QgVmtJbnN0YW5jZUNyZWF0ZUluZm8gaW5zdGFuY2VfaW5mbyA9IHsKKyAgICAgICAgVktfU1RSVUNUVVJFX1RZUEVfSU5TVEFOQ0VfQ1JFQVRFX0lORk8sCisgICAgICAgIG51bGxwdHIsICAgLy8gcE5leHQKKyAgICAgICAgMCwgICAgICAgICAvLyBmbGFncworICAgICAgICAmYXBwX2luZm8sCisgICAgICAgIDAsICAgICAgICAgLy8gbGF5ZXIgY291bnQKKyAgICAgICAgbnVsbHB0ciwgICAvLyBsYXllcnMKKyAgICAgICAgMCwgICAgICAgICAvLyBleHRlbnNpb24gY291bnQKKyAgICAgICAgbnVsbHB0ciwgICAvLyBleHRlbnNpb25zCisgICAgfTsKKyAgICBWa0luc3RhbmNlIGluc3RhbmNlOworICAgIFZrUmVzdWx0IHZrUmVzdWx0ID0gdmtDcmVhdGVJbnN0YW5jZSgmaW5zdGFuY2VfaW5mbywgbnVsbHB0ciwgJmluc3RhbmNlKTsKKyAgICBpZiAodmtSZXN1bHQgPT0gVktfRVJST1JfSU5JVElBTElaQVRJT05fRkFJTEVEKSB7CisgICAgICAgIHJlc3VsdCA9ICJ2a0NyZWF0ZUluc3RhbmNlIGZhaWxlZCwgbWVhbmluZyBsYXllcnMgY291bGQgbm90IGJlIGNoYWluZWQuIjsKKyAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQgPSAidmtDcmVhdGVJbnN0YW5jZSBzdWNjZWVkZWQuIjsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitqc3RyaW5nIGFuZHJvaWRfZ3B1dG9vbHNfY3RzX1Jvb3RsZXNzR3B1RGVidWdfbmF0aXZlSW5pdFZ1bGthbihKTklFbnYqIGVudiwKKyAgICBqY2xhc3MgLypjbGF6eiovKQoreworICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKworICAgIHJlc3VsdCA9IGluaXRWdWxrYW4oKTsKKworICAgIHJldHVybiBlbnYtPk5ld1N0cmluZ1VURihyZXN1bHQuY19zdHIoKSk7Cit9CisKK3N0YXRpYyBKTklOYXRpdmVNZXRob2QgZ01ldGhvZHNbXSA9IHsKKyAgICB7ICAgICJuYXRpdmVJbml0VnVsa2FuIiwgIigpTGphdmEvbGFuZy9TdHJpbmc7IiwKKyAgICAgICAgICh2b2lkKikgYW5kcm9pZF9ncHV0b29sc19jdHNfUm9vdGxlc3NHcHVEZWJ1Z19uYXRpdmVJbml0VnVsa2FuIH0sCit9OworCit9IC8vIGFub255bW91cyBuYW1lc3BhY2UKKworaW50IHJlZ2lzdGVyX2FuZHJvaWRfZ3B1dG9vbHNfY3RzX1Jvb3RsZXNzR3B1RGVidWcoSk5JRW52KiBlbnYpIHsKKyAgICBqY2xhc3MgY2xhenogPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9yb290bGVzc2dwdWRlYnVnL2FwcC9Sb290bGVzc0dwdURlYnVnRGV2aWNlQWN0aXZpdHkiKTsKKyAgICByZXR1cm4gZW52LT5SZWdpc3Rlck5hdGl2ZXMoY2xhenosIGdNZXRob2RzLAorICAgICAgICAgICAgc2l6ZW9mKGdNZXRob2RzKSAvIHNpemVvZihKTklOYXRpdmVNZXRob2QpKTsKK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZ3B1dG9vbHMvYXBwcy9zcmMvYW5kcm9pZC9yb290bGVzc2dwdWRlYnVnL2FwcC9Sb290bGVzc0dwdURlYnVnRGV2aWNlQWN0aXZpdHkuamF2YSBiL2hvc3RzaWRldGVzdHMvZ3B1dG9vbHMvYXBwcy9zcmMvYW5kcm9pZC9yb290bGVzc2dwdWRlYnVnL2FwcC9Sb290bGVzc0dwdURlYnVnRGV2aWNlQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzUwNTJiCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9ncHV0b29scy9hcHBzL3NyYy9hbmRyb2lkL3Jvb3RsZXNzZ3B1ZGVidWcvYXBwL1Jvb3RsZXNzR3B1RGVidWdEZXZpY2VBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQucm9vdGxlc3NncHVkZWJ1Zy5hcHA7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS5sYW5nLk92ZXJyaWRlOworCitwdWJsaWMgY2xhc3MgUm9vdGxlc3NHcHVEZWJ1Z0RldmljZUFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgc3RhdGljIHsKKyAgICAgICAgU3lzdGVtLmxvYWRMaWJyYXJ5KCJjdHNncHV0b29sc19qbmkiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gUm9vdGxlc3NHcHVEZWJ1Z0RldmljZUFjdGl2aXR5LmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKKworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gbmF0aXZlSW5pdFZ1bGthbigpOworICAgICAgICBMb2cuaShUQUcsIHJlc3VsdCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIFN0cmluZyBuYXRpdmVJbml0VnVsa2FuKCk7CisKK30KKwpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9ncHV0b29scy9sYXllcnMvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvZ3B1dG9vbHMvbGF5ZXJzL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAxZmFmZAotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvZ3B1dG9vbHMvbGF5ZXJzL0FuZHJvaWQubWsKQEAgLTAsMCArMSw3MSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IGxpYlZrTGF5ZXJfbnVsbExheWVyQQorTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKK0xPQ0FMX1NSQ19GSUxFUyA6PSBqbmkvbnVsbExheWVyLmNwcAorTE9DQUxfQ0ZMQUdTICs9IC1zdGQ9YysrMTQgLVdhbGwgLVdlcnJvciAtZnZpc2liaWxpdHk9aGlkZGVuIC1ETEFZRVJOQU1FPSJBIgorTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJhbmRyb2lkIGxpYnZ1bGthbiBsaWJsb2cKK0xPQ0FMX05ES19TVExfVkFSSUFOVCA6PSBjKytfc3RhdGljCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCisKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gbGliVmtMYXllcl9udWxsTGF5ZXJCCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworTE9DQUxfU1JDX0ZJTEVTIDo9IGpuaS9udWxsTGF5ZXIuY3BwCitMT0NBTF9DRkxBR1MgKz0gLXN0ZD1jKysxNCAtV2FsbCAtV2Vycm9yIC1mdmlzaWJpbGl0eT1oaWRkZW4gLURMQVlFUk5BTUU9IkIiCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmFuZHJvaWQgbGlidnVsa2FuIGxpYmxvZworTE9DQUxfTkRLX1NUTF9WQVJJQU5UIDo9IGMrK19zdGF0aWMKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKworCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBsaWJWa0xheWVyX251bGxMYXllckMKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCitMT0NBTF9TUkNfRklMRVMgOj0gam5pL251bGxMYXllci5jcHAKK0xPQ0FMX0NGTEFHUyArPSAtc3RkPWMrKzE0IC1XYWxsIC1XZXJyb3IgLWZ2aXNpYmlsaXR5PWhpZGRlbiAtRExBWUVSTkFNRT0iQyIKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYW5kcm9pZCBsaWJ2dWxrYW4gbGlibG9nCitMT0NBTF9OREtfU1RMX1ZBUklBTlQgOj0gYysrX3N0YXRpYworTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAoraW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQorCisKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNHcHVUb29sc1Jvb3RsZXNzR3B1RGVidWdBcHAtTEFZRVJTCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CisKKyMgdGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzCisKK0xPQ0FMX01VTFRJTElCIDo9IGJvdGgKKworTE9DQUxfSk5JX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorbGliVmtMYXllcl9udWxsTGF5ZXJBIFwKK2xpYlZrTGF5ZXJfbnVsbExheWVyQiBcCitsaWJWa0xheWVyX251bGxMYXllckMKKworaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQorCitpbmNsdWRlICQoQlVJTERfQ1RTX1NVUFBPUlRfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZ3B1dG9vbHMvbGF5ZXJzL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2dwdXRvb2xzL2xheWVycy9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk1N2IwNDcKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2dwdXRvb2xzL2xheWVycy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisjIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImFuZHJvaWQucm9vdGxlc3NncHVkZWJ1Zy5MQVlFUlMuYXBwIj4KKworICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmRlYnVnZ2FibGU9ImZhbHNlIiBhbmRyb2lkOmhhc0NvZGU9ImZhbHNlIj4KKyAgICA8L2FwcGxpY2F0aW9uPgorCis8L21hbmlmZXN0PgorCisKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvZ3B1dG9vbHMvbGF5ZXJzL2puaS9udWxsTGF5ZXIuY3BwIGIvaG9zdHNpZGV0ZXN0cy9ncHV0b29scy9sYXllcnMvam5pL251bGxMYXllci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI1M2I1YwotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvZ3B1dG9vbHMvbGF5ZXJzL2puaS9udWxsTGF5ZXIuY3BwCkBAIC0wLDAgKzEsMTczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFuZHJvaWQvbG9nLmg+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDx2dWxrYW4vdnVsa2FuLmg+CisjaW5jbHVkZSAidmtfbGF5ZXJfaW50ZXJmYWNlLmgiCisKKyNkZWZpbmUgeHN0cihhKSBzdHIoYSkKKyNkZWZpbmUgc3RyKGEpICNhCisKKyNkZWZpbmUgTE9HX1RBRyAibnVsbExheWVyIiB4c3RyKExBWUVSTkFNRSkKKworI2RlZmluZSBBTE9HSShtc2csIC4uLikgXAorICAgIF9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfSU5GTywgTE9HX1RBRywgKG1zZyksIF9fVkFfQVJHU19fKQorCisKKy8vIEFubm91bmNlIGlmIGFueXRoaW5nIGxvYWRzIHRoaXMgbGF5ZXIuICBMQVlFUk5BTUUgaXMgZGVmaW5lZCBpbiBBbmRyb2lkLm1rCitjbGFzcyBTdGF0aWNMb2dNZXNzYWdlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFN0YXRpY0xvZ01lc3NhZ2UoY29uc3QgY2hhciogbXNnKSB7CisgICAgICAgICAgICBBTE9HSSgiJXMiLCBtc2cpOworICAgIH0KK307CitTdGF0aWNMb2dNZXNzYWdlIGdfaW5pdE1lc3NhZ2UoIm51bGxMYXllciIgeHN0cihMQVlFUk5BTUUpICIgbG9hZGVkIik7CisKKworbmFtZXNwYWNlIHsKKworCisvLyBNaW5pbWFsIGRpc3BhdGNoIHRhYmxlIGZvciB0aGlzIHNpbXBsZSBsYXllcgorc3RydWN0IHsKKyAgICBQRk5fdmtHZXRJbnN0YW5jZVByb2NBZGRyIEdldEluc3RhbmNlUHJvY0FkZHI7Cit9IGdfVnVsa2FuRGlzcGF0Y2hUYWJsZTsKKworCit0ZW1wbGF0ZTxjbGFzcyBUPgorVmtSZXN1bHQgZ2V0UHJvcGVydGllcyhjb25zdCB1aW50MzJfdCBjb3VudCwgY29uc3QgVCAqcHJvcGVydGllcywgdWludDMyX3QgKnBDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUICpwUHJvcGVydGllcykgeworICAgIHVpbnQzMl90IGNvcHlTaXplOworCisgICAgaWYgKHBQcm9wZXJ0aWVzID09IE5VTEwgfHwgcHJvcGVydGllcyA9PSBOVUxMKSB7CisgICAgICAgICpwQ291bnQgPSBjb3VudDsKKyAgICAgICAgcmV0dXJuIFZLX1NVQ0NFU1M7CisgICAgfQorCisgICAgY29weVNpemUgPSAqcENvdW50IDwgY291bnQgPyAqcENvdW50IDogY291bnQ7CisgICAgbWVtY3B5KHBQcm9wZXJ0aWVzLCBwcm9wZXJ0aWVzLCBjb3B5U2l6ZSAqIHNpemVvZihUKSk7CisgICAgKnBDb3VudCA9IGNvcHlTaXplOworICAgIGlmIChjb3B5U2l6ZSA8IGNvdW50KSB7CisgICAgICAgIHJldHVybiBWS19JTkNPTVBMRVRFOworICAgIH0KKworICAgIHJldHVybiBWS19TVUNDRVNTOworfQorCitzdGF0aWMgY29uc3QgVmtMYXllclByb3BlcnRpZXMgTEFZRVJfUFJPUEVSVElFUyA9IHsKKyAgICAiVktfTEFZRVJfQU5EUk9JRF9udWxsTGF5ZXIiIHhzdHIoTEFZRVJOQU1FKSwgVktfTUFLRV9WRVJTSU9OKDEsIDAsIFZLX0hFQURFUl9WRVJTSU9OKSwgMSwgIkxheWVyOiBudWxsTGF5ZXIiIHhzdHIoTEFZRVJOQU1FKSwKK307CisKK1ZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCBFbnVtZXJhdGVJbnN0YW5jZUxheWVyUHJvcGVydGllcyh1aW50MzJfdCAqcENvdW50LCBWa0xheWVyUHJvcGVydGllcyAqcFByb3BlcnRpZXMpIHsKKyAgICByZXR1cm4gZ2V0UHJvcGVydGllczxWa0xheWVyUHJvcGVydGllcz4oMSwgJkxBWUVSX1BST1BFUlRJRVMsIHBDb3VudCwgcFByb3BlcnRpZXMpOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgRW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzKFZrUGh5c2ljYWxEZXZpY2UgLyogcGh5c2ljYWxEZXZpY2UgKi8sIHVpbnQzMl90ICpwQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrTGF5ZXJQcm9wZXJ0aWVzICpwUHJvcGVydGllcykgeworICAgIHJldHVybiBnZXRQcm9wZXJ0aWVzPFZrTGF5ZXJQcm9wZXJ0aWVzPigwLCBOVUxMLCBwQ291bnQsIHBQcm9wZXJ0aWVzKTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEVudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcyhjb25zdCBjaGFyKiAvKiBwTGF5ZXJOYW1lICovLCB1aW50MzJfdCAqcENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0V4dGVuc2lvblByb3BlcnRpZXMgKnBQcm9wZXJ0aWVzKSB7CisgICAgcmV0dXJuIGdldFByb3BlcnRpZXM8VmtFeHRlbnNpb25Qcm9wZXJ0aWVzPigwLCBOVUxMLCBwQ291bnQsIHBQcm9wZXJ0aWVzKTsKK30KKworVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIEVudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMoVmtQaHlzaWNhbERldmljZSAvKiBwaHlzaWNhbERldmljZSAqLywgY29uc3QgY2hhciogLyogcExheWVyTmFtZSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwQ291bnQsIFZrRXh0ZW5zaW9uUHJvcGVydGllcyAqcFByb3BlcnRpZXMpIHsKKyAgICByZXR1cm4gZ2V0UHJvcGVydGllczxWa0V4dGVuc2lvblByb3BlcnRpZXM+KDAsIE5VTEwsIHBDb3VudCwgcFByb3BlcnRpZXMpOworfQorCitWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgbnVsbENyZWF0ZUluc3RhbmNlKGNvbnN0IFZrSW5zdGFuY2VDcmVhdGVJbmZvKiBwQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmtBbGxvY2F0aW9uQ2FsbGJhY2tzKiBwQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0luc3RhbmNlKiBwSW5zdGFuY2UpIHsKKworICAgIFZrTGF5ZXJJbnN0YW5jZUNyZWF0ZUluZm8gKmxheWVyQ3JlYXRlSW5mbyA9IChWa0xheWVySW5zdGFuY2VDcmVhdGVJbmZvICopcENyZWF0ZUluZm8tPnBOZXh0OworCisgICAgY29uc3QgY2hhciogbXNnID0gIm51bGxDcmVhdGVJbnN0YW5jZSBjYWxsZWQgaW4gbnVsbExheWVyIiB4c3RyKExBWUVSTkFNRSk7CisgICAgQUxPR0koIiVzIiwgbXNnKTsKKworICAgIC8vIFN0ZXAgdGhyb3VnaCB0aGUgcE5leHQgY2hhaW4gdW50aWwgd2UgZ2V0IHRvIHRoZSBsaW5rIGZ1bmN0aW9uCisgICAgd2hpbGUobGF5ZXJDcmVhdGVJbmZvICYmIChsYXllckNyZWF0ZUluZm8tPnNUeXBlICE9IFZLX1NUUlVDVFVSRV9UWVBFX0xPQURFUl9JTlNUQU5DRV9DUkVBVEVfSU5GTyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJDcmVhdGVJbmZvLT5mdW5jdGlvbiAhPSBWS19MQVlFUl9GVU5DVElPTl9MSU5LKSkgeworCisgICAgICBsYXllckNyZWF0ZUluZm8gPSAoVmtMYXllckluc3RhbmNlQ3JlYXRlSW5mbyAqKWxheWVyQ3JlYXRlSW5mby0+cE5leHQ7CisgICAgfQorCisgICAgaWYobGF5ZXJDcmVhdGVJbmZvID09IE5VTEwpCisgICAgICByZXR1cm4gVktfRVJST1JfSU5JVElBTElaQVRJT05fRkFJTEVEOworCisgICAgLy8gR3JhYiBHSVBBIGZvciB0aGUgbmV4dCBsYXllcgorICAgIFBGTl92a0dldEluc3RhbmNlUHJvY0FkZHIgZ3BhID0gbGF5ZXJDcmVhdGVJbmZvLT51LnBMYXllckluZm8tPnBmbk5leHRHZXRJbnN0YW5jZVByb2NBZGRyOworCisgICAgLy8gVHJhY2sgaXMgaW4gb3VyIGRpc3BhdGNoIHRhYmxlCisgICAgZ19WdWxrYW5EaXNwYXRjaFRhYmxlLkdldEluc3RhbmNlUHJvY0FkZHIgPSBncGE7CisKKyAgICAvLyBBZHZhbmNlIHRoZSBjaGFpbiBmb3IgbmV4dCBsYXllcgorICAgIGxheWVyQ3JlYXRlSW5mby0+dS5wTGF5ZXJJbmZvID0gbGF5ZXJDcmVhdGVJbmZvLT51LnBMYXllckluZm8tPnBOZXh0OworCisgICAgLy8gQ2FsbCB0aGUgbmV4dCBsYXllcgorICAgIFBGTl92a0NyZWF0ZUluc3RhbmNlIGNyZWF0ZUZ1bmMgPSAoUEZOX3ZrQ3JlYXRlSW5zdGFuY2UpZ3BhKFZLX05VTExfSEFORExFLCAidmtDcmVhdGVJbnN0YW5jZSIpOworICAgIFZrUmVzdWx0IHJldCA9IGNyZWF0ZUZ1bmMocENyZWF0ZUluZm8sIHBBbGxvY2F0b3IsIHBJbnN0YW5jZSk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitWS0FQSV9BVFRSIFBGTl92a1ZvaWRGdW5jdGlvbiBWS0FQSV9DQUxMIEdldERldmljZVByb2NBZGRyKFZrRGV2aWNlIC8qIGRldiAqLywgY29uc3QgY2hhciogLyogZnVuY05hbWUgKi8pIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworVktBUElfQVRUUiBQRk5fdmtWb2lkRnVuY3Rpb24gVktBUElfQ0FMTCBHZXRJbnN0YW5jZVByb2NBZGRyKFZrSW5zdGFuY2UgaW5zdGFuY2UsIGNvbnN0IGNoYXIqIGZ1bmNOYW1lKSB7CisKKyAgICAvLyBPdXIgc2ltcGxlIGxheWVyIG9ubHkgaW50ZXJjZXB0cyB2a0NyZWF0ZUluc3RhbmNlCisgICAgY29uc3QgY2hhciogdGFyZ2V0RnVuYyA9ICJ2a0NyZWF0ZUluc3RhbmNlIjsKKyAgICBpZiAoIXN0cm5jbXAodGFyZ2V0RnVuYywgZnVuY05hbWUsIHNpemVvZigmdGFyZ2V0RnVuYykpKQorICAgICAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbiludWxsQ3JlYXRlSW5zdGFuY2U7CisKKyAgICByZXR1cm4gKFBGTl92a1ZvaWRGdW5jdGlvbilnX1Z1bGthbkRpc3BhdGNoVGFibGUuR2V0SW5zdGFuY2VQcm9jQWRkcihpbnN0YW5jZSwgZnVuY05hbWUpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gbG9hZGVyLWxheWVyIGludGVyZmFjZSB2MCwganVzdCB3cmFwcGVycyBzaW5jZSB0aGVyZSBpcyBvbmx5IGEgbGF5ZXIKKworX19hdHRyaWJ1dGUoKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0VudW1lcmF0ZUluc3RhbmNlTGF5ZXJQcm9wZXJ0aWVzKHVpbnQzMl90ICpwQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0xheWVyUHJvcGVydGllcyAqcFByb3BlcnRpZXMpIHsKKyAgICByZXR1cm4gRW51bWVyYXRlSW5zdGFuY2VMYXllclByb3BlcnRpZXMocENvdW50LCBwUHJvcGVydGllcyk7Cit9CisKK19fYXR0cmlidXRlKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKSBWS0FQSV9BVFRSIFZrUmVzdWx0IFZLQVBJX0NBTEwgdmtFbnVtZXJhdGVEZXZpY2VMYXllclByb3BlcnRpZXMoVmtQaHlzaWNhbERldmljZSBwaHlzaWNhbERldmljZSwgdWludDMyX3QgKnBDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0xheWVyUHJvcGVydGllcyAqcFByb3BlcnRpZXMpIHsKKyAgICByZXR1cm4gRW51bWVyYXRlRGV2aWNlTGF5ZXJQcm9wZXJ0aWVzKHBoeXNpY2FsRGV2aWNlLCBwQ291bnQsIHBQcm9wZXJ0aWVzKTsKK30KKworX19hdHRyaWJ1dGUoKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpIFZLQVBJX0FUVFIgVmtSZXN1bHQgVktBUElfQ0FMTCB2a0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcyhjb25zdCBjaGFyICpwTGF5ZXJOYW1lLCB1aW50MzJfdCAqcENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRXh0ZW5zaW9uUHJvcGVydGllcyAqcFByb3BlcnRpZXMpIHsKKyAgICByZXR1cm4gRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKHBMYXllck5hbWUsIHBDb3VudCwgcFByb3BlcnRpZXMpOworfQorCitfX2F0dHJpYnV0ZSgodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSkgVktBUElfQVRUUiBWa1Jlc3VsdCBWS0FQSV9DQUxMIHZrRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcyhWa1BoeXNpY2FsRGV2aWNlIHBoeXNpY2FsRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwTGF5ZXJOYW1lLCB1aW50MzJfdCAqcENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0V4dGVuc2lvblByb3BlcnRpZXMgKnBQcm9wZXJ0aWVzKSB7CisgICAgcmV0dXJuIEVudW1lcmF0ZURldmljZUV4dGVuc2lvblByb3BlcnRpZXMocGh5c2ljYWxEZXZpY2UsIHBMYXllck5hbWUsIHBDb3VudCwgcFByb3BlcnRpZXMpOworfQorCitfX2F0dHJpYnV0ZSgodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSkgVktBUElfQVRUUiBQRk5fdmtWb2lkRnVuY3Rpb24gVktBUElfQ0FMTCB2a0dldERldmljZVByb2NBZGRyKFZrRGV2aWNlIGRldiwgY29uc3QgY2hhciAqZnVuY05hbWUpIHsKKyAgICByZXR1cm4gR2V0RGV2aWNlUHJvY0FkZHIoZGV2LCBmdW5jTmFtZSk7Cit9CisKK19fYXR0cmlidXRlKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKSBWS0FQSV9BVFRSIFBGTl92a1ZvaWRGdW5jdGlvbiBWS0FQSV9DQUxMIHZrR2V0SW5zdGFuY2VQcm9jQWRkcihWa0luc3RhbmNlIGluc3RhbmNlLCBjb25zdCBjaGFyICpmdW5jTmFtZSkgeworICAgIHJldHVybiBHZXRJbnN0YW5jZVByb2NBZGRyKGluc3RhbmNlLCBmdW5jTmFtZSk7Cit9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2dwdXRvb2xzL2xheWVycy9qbmkvdmtfbGF5ZXJfaW50ZXJmYWNlLmggYi9ob3N0c2lkZXRlc3RzL2dwdXRvb2xzL2xheWVycy9qbmkvdmtfbGF5ZXJfaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJhNTIzMgotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvZ3B1dG9vbHMvbGF5ZXJzL2puaS92a19sYXllcl9pbnRlcmZhY2UuaApAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYgVmFsdmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE2IEx1bmFyRywgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE2IEdvb2dsZSBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQvb3IgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIk1hdGVyaWFscyIpLCB0bworICogZGVhbCBpbiB0aGUgTWF0ZXJpYWxzIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlCisgKiByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqIHNlbGwgY29waWVzIG9mIHRoZSBNYXRlcmlhbHMsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBNYXRlcmlhbHMgYXJlCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlKHMpIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBNYXRlcmlhbHMuCisgKgorICogVEhFIE1BVEVSSUFMUyBBUkUgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICoKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgTUFURVJJQUxTIE9SIFRIRQorICogVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBNQVRFUklBTFMuCisgKgorICovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHZ1bGthbi92dWxrYW4uaD4KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDcmVhdGVJbnN0YW5jZSBhbmQgQ3JlYXRlRGV2aWNlIHN1cHBvcnQgc3RydWN0dXJlcworCit0eXBlZGVmIGVudW0gVmtMYXllckZ1bmN0aW9uXyB7CisgICAgVktfTEFZRVJfRlVOQ1RJT05fTElOSyA9IDAsCisgICAgVktfTEFZRVJfRlVOQ1RJT05fREFUQV9DQUxMQkFDSyA9IDEKK30gVmtMYXllckZ1bmN0aW9uOworCit0eXBlZGVmIHN0cnVjdCBWa0xheWVySW5zdGFuY2VMaW5rXyB7CisgICAgc3RydWN0IFZrTGF5ZXJJbnN0YW5jZUxpbmtfKiBwTmV4dDsKKyAgICBQRk5fdmtHZXRJbnN0YW5jZVByb2NBZGRyIHBmbk5leHRHZXRJbnN0YW5jZVByb2NBZGRyOworfSBWa0xheWVySW5zdGFuY2VMaW5rOworCit0eXBlZGVmIFZrUmVzdWx0KFZLQVBJX1BUUiogUEZOX3ZrU2V0SW5zdGFuY2VMb2FkZXJEYXRhKShWa0luc3RhbmNlIGluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogb2JqZWN0KTsKK3R5cGVkZWYgVmtSZXN1bHQoVktBUElfUFRSKiBQRk5fdmtTZXREZXZpY2VMb2FkZXJEYXRhKShWa0RldmljZSBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogb2JqZWN0KTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsgIC8vIFZLX1NUUlVDVFVSRV9UWVBFX0xPQURFUl9JTlNUQU5DRV9DUkVBVEVfSU5GTworICAgIGNvbnN0IHZvaWQqIHBOZXh0OworICAgIFZrTGF5ZXJGdW5jdGlvbiBmdW5jdGlvbjsKKyAgICB1bmlvbiB7CisgICAgICAgIFZrTGF5ZXJJbnN0YW5jZUxpbmsqIHBMYXllckluZm87CisgICAgICAgIFBGTl92a1NldEluc3RhbmNlTG9hZGVyRGF0YSBwZm5TZXRJbnN0YW5jZUxvYWRlckRhdGE7CisgICAgfSB1OworfSBWa0xheWVySW5zdGFuY2VDcmVhdGVJbmZvOworCit0eXBlZGVmIHN0cnVjdCBWa0xheWVyRGV2aWNlTGlua18geworICAgIHN0cnVjdCBWa0xheWVyRGV2aWNlTGlua18qIHBOZXh0OworICAgIFBGTl92a0dldEluc3RhbmNlUHJvY0FkZHIgcGZuTmV4dEdldEluc3RhbmNlUHJvY0FkZHI7CisgICAgUEZOX3ZrR2V0RGV2aWNlUHJvY0FkZHIgcGZuTmV4dEdldERldmljZVByb2NBZGRyOworfSBWa0xheWVyRGV2aWNlTGluazsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFZrU3RydWN0dXJlVHlwZSBzVHlwZTsgIC8vIFZLX1NUUlVDVFVSRV9UWVBFX0xPQURFUl9ERVZJQ0VfQ1JFQVRFX0lORk8KKyAgICBjb25zdCB2b2lkKiBwTmV4dDsKKyAgICBWa0xheWVyRnVuY3Rpb24gZnVuY3Rpb247CisgICAgdW5pb24geworICAgICAgICBWa0xheWVyRGV2aWNlTGluayogcExheWVySW5mbzsKKyAgICAgICAgUEZOX3ZrU2V0RGV2aWNlTG9hZGVyRGF0YSBwZm5TZXREZXZpY2VMb2FkZXJEYXRhOworICAgIH0gdTsKK30gVmtMYXllckRldmljZUNyZWF0ZUluZm87CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2dwdXRvb2xzL3NyYy9hbmRyb2lkL2dwdXRvb2xzL2N0cy9DdHNSb290bGVzc0dwdURlYnVnSG9zdFRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvZ3B1dG9vbHMvc3JjL2FuZHJvaWQvZ3B1dG9vbHMvY3RzL0N0c1Jvb3RsZXNzR3B1RGVidWdIb3N0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNzQzNmIKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2dwdXRvb2xzL3NyYy9hbmRyb2lkL2dwdXRvb2xzL2N0cy9DdHNSb290bGVzc0dwdURlYnVnSG9zdFRlc3QuamF2YQpAQCAtMCwwICsxLDQ0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQuZ3B1dG9vbHMuY3RzOworCitpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLklUZXN0RGV2aWNlOworaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkRldmljZUpVbml0NENsYXNzUnVubmVyOworaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLklEZXZpY2VUZXN0OworCitpbXBvcnQgamF2YS51dGlsLlNjYW5uZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKKy8qKgorICogVGVzdHMgdGhhdCBleGVyY2lzZSBSb290bGVzcyBHUFUgRGVidWcgZnVuY3Rpb25hbGl0eSBzdXBwb3J0ZWQgYnkgdGhlIGxvYWRlci4KKyAqLworQFJ1bldpdGgoRGV2aWNlSlVuaXQ0Q2xhc3NSdW5uZXIuY2xhc3MpCitwdWJsaWMgY2xhc3MgQ3RzUm9vdGxlc3NHcHVEZWJ1Z0hvc3RUZXN0IGltcGxlbWVudHMgSURldmljZVRlc3QgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gQ3RzUm9vdGxlc3NHcHVEZWJ1Z0hvc3RUZXN0LmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKworICAgIC8qKgorICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIElUZXN0RGV2aWNlIG1EZXZpY2U7CisKKyAgICBwdWJsaWMgdm9pZCBzZXREZXZpY2UoSVRlc3REZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIG1EZXZpY2UgPSBkZXZpY2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElUZXN0RGV2aWNlIGdldERldmljZSgpIHsKKyAgICAgICAgcmV0dXJuIG1EZXZpY2U7CisgICAgfQorCisgICAgLy8gVGhpcyB0ZXN0IGVuc3VyZXMgdGhhdCB0aGUgVnVsa2FuIGxvYWRlciBjYW4gdXNlIFNldHRpbmdzIHRvIGxvYWQgbGF5ZXIKKyAgICAvLyBmcm9tIHRoZSBiYXNlIGRpcmVjdG9yeSBvZiBkZWJ1Z2dhYmxlIGFwcGxpY2F0aW9ucy4gIElzIGFsc28gdGVzdHMgc2V2ZXJhbAorICAgIC8vIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBzY2VuYXJpb3Mgd2Ugd2FudCB0byBjb3ZlciAobGlzdGVkIGJlbG93KS4KKyAgICAvLworICAgIC8vIFRoZXJlIGFyZSB0aHJlZSBBUEtzOyBERUJVRyBhbmQgUkVMRUFTRSBhcmUgcHJhY3RpY2FsbHkgaWRlbnRpY2FsIHdpdGggb25lCisgICAgLy8gYmVpbmcgZmxhZ2dlZCBhcyBkZWJ1Z2dhYmxlLiAgVGhlIExBWUVSUyBBUEsgaXMgbWFpbmx5IGEgY29uZHVpdCBmb3IgZ2V0dGluZworICAgIC8vIGxheWVycyBvbnRvIHRoZSBkZXZpY2Ugd2l0aG91dCBhZmZlY3RpbmcgdGhlIG90aGVyIEFQS3MuCisgICAgLy8KKyAgICAvLyBUaGUgUkVMRUFTRSBBUEsgZG9lcyBjb250YWluIG9uZSBsYXllciB0byBlbnN1cmUgdXNpbmcgU2V0dGluZ3MgdG8gZW5hYmxlCisgICAgLy8gbGF5ZXJzIGRvZXMgbm90IGludGVyZmVyZSB3aXRoIGxlZ2FjeSBtZXRob2RzIHVzaW5nIHN5c3RlbSBwcm9wZXJ0aWVzLgorICAgIC8vCisgICAgLy8gVGhlIGxheWVycyB0aGVtc2VsdmVzIGFyZSBwcmFjdGljYWxseSBudWxsLCBvbmx5IGVub3VnaCBmdW5jdGlvbmFsaXR5IHRvCisgICAgLy8gc2F0aXNmeSBsb2FkZXIgZW51bWVyYXRpbmcgYW5kIGxvYWRpbmcuICBUaGV5IGRvbid0IGFjdHVhbGx5IGNoYWluIHRvZ2V0aGVyLgorICAgIC8vCisgICAgLy8gUG9zaXRpdmUgdGVzdHMKKyAgICAvLyAtIEVuc3VyZSB3ZSBjYW4gdG9nZ2xlIHRoZSBFbmFibGUgU2V0dGluZyBvbiBhbmQgb2ZmICh0ZXN0RGVidWdMYXllckxvYWRWdWxrYW4pCisgICAgLy8gLSBFbnN1cmUgd2UgY2FuIHNldCB0aGUgZGVidWdnYWJsZSBhcHAgKHRlc3REZWJ1Z0xheWVyTG9hZFZ1bGthbikKKyAgICAvLyAtIEVuc3VyZSB3ZSBjYW4gc2V0IHRoZSBsYXllciBsaXN0ICh0ZXN0RGVidWdMYXllckxvYWRWdWxrYW4pCisgICAgLy8gLSBFbnN1cmUgd2UgY2FuIHB1c2ggYSBsYXllciB0byBkZWJ1Z2dhYmxlIGFwcCAodGVzdERlYnVnTGF5ZXJMb2FkVnVsa2FuKQorICAgIC8vIC0gRW5zdXJlIHdlIGNhbiBzcGVjaWZ5IHRoZSBhcHAgdG8gbG9hZCBsYXllcnMgKHRlc3REZWJ1Z0xheWVyTG9hZFZ1bGthbikKKyAgICAvLyAtIEVuc3VyZSB3ZSBjYW4gbG9hZCBhIGxheWVyIGZyb20gYXBwJ3MgZGF0YSBkaXJlY3RvcnkgKHRlc3REZWJ1Z0xheWVyTG9hZFZ1bGthbikKKyAgICAvLyAtIEVuc3VyZSB3ZSBjYW4gbG9hZCBtdWx0aXBsZSBsYXllcnMsIGluIG9yZGVyLCBmcm9tIGFwcCdzIGRhdGEgZGlyZWN0b3J5ICh0ZXN0RGVidWdMYXllckxvYWRWdWxrYW4pCisgICAgLy8gLSBFbnN1cmUgd2UgY2FuIHN0aWxsIHVzZSBzeXN0ZW0gcHJvcGVydGllcyBpZiBubyBsYXllcnMgbG9hZGVkIHZpYSBTZXR0aW5ncyAodGVzdFN5c3RlbVByb3BlcnR5RW5hYmxlVnVsa2FuKQorICAgIC8vIE5lZ2F0aXZlIHRlc3RzCisgICAgLy8gLSBFbnN1cmUgd2UgY2Fubm90IHB1c2ggYSBsYXllciB0byBub24tZGVidWdnYWJsZSBhcHAgKHRlc3RSZWxlYXNlTGF5ZXJMb2FkKQorICAgIC8vIC0gRW5zdXJlIG5vbi1kZWJ1Z2dhYmxlIGFwcCBpZ25vcmVzIHRoZSBuZXcgU2V0dGluZ3MgKHRlc3RSZWxlYXNlTGF5ZXJMb2FkKQorICAgIC8vIC0gRW5zdXJlIHdlIGNhbm5vdCBlbnVtZXJhdGUgbGF5ZXJzIGZyb20gZGVidWdnYWJsZSBhcHAncyBkYXRhIGRpcmVjdG9yeSBpZiBTZXR0aW5nIG5vdCBzcGVjaWZpZWQgKHRlc3REZWJ1Z05vRW51bWVyYXRlVnVsa2FuKQorICAgIC8vIC0gRW5zdXJlIHdlIGNhbm5vdCBlbnVtZXJhdGUgbGF5ZXJzIHdpdGhvdXQgc3BlY2lmeWluZyB0aGUgZGVidWdnYWJsZSBhcHAgKHRlc3REZWJ1Z05vRW51bWVyYXRlVnVsa2FuKQorICAgIC8vIC0gRW5zdXJlIHdlIGNhbm5vdCB1c2Ugc3lzdGVtIHByb3BlcnRpZXMgd2hlbiBsYXllciBpcyBmb3VuZCB2aWEgU2V0dGluZ3Mgd2l0aCBkZWJ1Z2dhYmxlIGFwcCAodGVzdFN5c3RlbVByb3BlcnR5SWdub3JlVnVsa2FuKQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTID0gIlJvb3RsZXNzR3B1RGVidWdEZXZpY2VBY3Rpdml0eSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElWSVRZID0gImFuZHJvaWQucm9vdGxlc3NncHVkZWJ1Zy5hcHAuUm9vdGxlc3NHcHVEZWJ1Z0RldmljZUFjdGl2aXR5IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFZRVJfQSA9ICJudWxsTGF5ZXJBIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFZRVJfQiA9ICJudWxsTGF5ZXJCIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFZRVJfQyA9ICJudWxsTGF5ZXJDIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFZRVJfQV9MSUIgPSAibGliVmtMYXllcl8iICsgTEFZRVJfQSArICIuc28iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQVlFUl9CX0xJQiA9ICJsaWJWa0xheWVyXyIgKyBMQVlFUl9CICsgIi5zbyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBWUVSX0NfTElCID0gImxpYlZrTGF5ZXJfIiArIExBWUVSX0MgKyAiLnNvIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFZRVJfQV9OQU1FID0gIlZLX0xBWUVSX0FORFJPSURfIiArIExBWUVSX0E7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBWUVSX0JfTkFNRSA9ICJWS19MQVlFUl9BTkRST0lEXyIgKyBMQVlFUl9COworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQVlFUl9DX05BTUUgPSAiVktfTEFZRVJfQU5EUk9JRF8iICsgTEFZRVJfQzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVCVUdfQVBQID0gImFuZHJvaWQucm9vdGxlc3NncHVkZWJ1Zy5ERUJVRy5hcHAiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUxFQVNFX0FQUCA9ICJhbmRyb2lkLnJvb3RsZXNzZ3B1ZGVidWcuUkVMRUFTRS5hcHAiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQVlFUlNfQVBQID0gImFuZHJvaWQucm9vdGxlc3NncHVkZWJ1Zy5MQVlFUlMuYXBwIjsKKworICAgIC8vIFRoaXMgaXMgaG93IGxvbmcgd2UnbGwgc2NhbiB0aGUgbG9nIGZvciBhIHJlc3VsdCBiZWZvcmUgZ2l2aW5nIHVwLiBUaGlzIGxpbWl0IHdpbGwgb25seQorICAgIC8vIGJlIHJlYWNoZWQgaWYgc29tZXRoaW5nIGhhcyBnb25lIHdyb25nCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBMT0dfU0VBUkNIX1RJTUVPVVRfTVMgPSA1MDAwOworCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVtb3ZlV2hpdGVzcGFjZShTdHJpbmcgaW5wdXQpIHsKKyAgICAgICAgcmV0dXJuIGlucHV0LnJlcGxhY2VBbGwoU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpLCAiIikudHJpbSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdyYWIgYW5kIGZvcm1hdCB0aGUgcHJvY2VzcyBJRCBvZiByZXF1ZXN0ZWQgYXBwLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGdldFBJRChTdHJpbmcgYXBwKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHBpZCA9IG1EZXZpY2UuZXhlY3V0ZUFkYkNvbW1hbmQoInNoZWxsIiwgInBpZG9mIiwgYXBwKTsKKyAgICAgICAgcmV0dXJuIHJlbW92ZVdoaXRlc3BhY2UocGlkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeHRyYWN0IHRoZSByZXF1ZXN0ZWQgbGF5ZXIgZnJvbSBBUEsgYW5kIGNvcHkgdG8gdG1wCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldHVwTGF5ZXIoU3RyaW5nIGxheWVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBXZSB1c2UgdGhlIExBWUVSUyBhcGsgdG8gZmFjaWxpdGF0ZSBnZXR0aW5nIGxheWVycyBvbnRvIHRoZSBkZXZpY2UgZm9yIG1peGluZyBhbmQgbWF0Y2hpbmcKKyAgICAgICAgU3RyaW5nIGxpYlBhdGggPSBtRGV2aWNlLmV4ZWN1dGVBZGJDb21tYW5kKCJzaGVsbCIsICJwbSIsICJwYXRoIiwgTEFZRVJTX0FQUCk7CisgICAgICAgIGxpYlBhdGggPSBsaWJQYXRoLnJlcGxhY2VBbGwoInBhY2thZ2U6IiwgIiIpOworICAgICAgICBsaWJQYXRoID0gbGliUGF0aC5yZXBsYWNlQWxsKCJiYXNlLmFwayIsICIiKTsKKyAgICAgICAgbGliUGF0aCA9IHJlbW92ZVdoaXRlc3BhY2UobGliUGF0aCk7CisgICAgICAgIGxpYlBhdGggKz0gImxpYi8iOworCisgICAgICAgIC8vIFVzZSBmaW5kIHRvIGdldCB0aGUgLnNvIHNvIHdlIGNhbiBpZ25vcmUgQUJJCisgICAgICAgIFN0cmluZyBsYXllclBhdGggPSBtRGV2aWNlLmV4ZWN1dGVBZGJDb21tYW5kKCJzaGVsbCIsICJmaW5kIiwgbGliUGF0aCArICIgLW5hbWUgIiArIGxheWVyKTsKKyAgICAgICAgbGF5ZXJQYXRoID0gcmVtb3ZlV2hpdGVzcGFjZShsYXllclBhdGgpOworICAgICAgICBtRGV2aWNlLmV4ZWN1dGVBZGJDb21tYW5kKCJzaGVsbCIsICJjcCIsIGxheWVyUGF0aCArICIgL2RhdGEvbG9jYWwvdG1wIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2ltcGxlIGhlbHBlciBjbGFzcyBmb3IgcmV0dXJuaW5nIG11bHRpcGxlIHJlc3VsdHMKKyAgICAgKi8KKyAgICBwdWJsaWMgY2xhc3MgTG9nU2NhblJlc3VsdCB7CisgICAgICAgIHB1YmxpYyBib29sZWFuIGZvdW5kOworICAgICAgICBwdWJsaWMgaW50IGxpbmVOdW1iZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBMb2dTY2FuUmVzdWx0IHNjYW5Mb2coU3RyaW5nIHBpZCwgU3RyaW5nIHNlYXJjaFN0cmluZykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBzY2FuTG9nKHBpZCwgc2VhcmNoU3RyaW5nLCAiIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2NhbiB0aGUgbG9nY2F0IGZvciByZXF1ZXN0ZWQgcHJvY2VzcyBJRCwgcmV0dXJuaW5nIGlmIGZvdW5kIGFuZCB3aGljaCBsaW5lCisgICAgICovCisgICAgcHJpdmF0ZSBMb2dTY2FuUmVzdWx0IHNjYW5Mb2coU3RyaW5nIHBpZCwgU3RyaW5nIHNlYXJjaFN0cmluZywgU3RyaW5nIGVuZFN0cmluZykgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgTG9nU2NhblJlc3VsdCByZXN1bHQgPSBuZXcgTG9nU2NhblJlc3VsdCgpOworICAgICAgICByZXN1bHQuZm91bmQgPSBmYWxzZTsKKyAgICAgICAgcmVzdWx0LmxpbmVOdW1iZXIgPSAtMTsKKworICAgICAgICAvLyBTY2FuIHVudGlsIG91dHB1dCBmcm9tIGFwcCBpcyBmb3VuZAorICAgICAgICBib29sZWFuIHNjYW5Db21wbGV0ZT0gZmFsc2U7CisKKyAgICAgICAgLy8gTGV0IHRoZSB0ZXN0IHJ1biBhIHJlYXNvbmFibGUgYW1vdW50IG9mIHRpbWUgYmVmb3JlIG1vdmluZyBvbgorICAgICAgICBsb25nIGhvc3RTdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworICAgICAgICB3aGlsZSAoIXNjYW5Db21wbGV0ZSAmJiAoKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gaG9zdFN0YXJ0VGltZSkgPCBMT0dfU0VBUkNIX1RJTUVPVVRfTVMpKSB7CisKKyAgICAgICAgICAgIC8vIEdpdmUgb3VyIGFjdGl2aXR5IGEgY2hhbmNlIHRvIHJ1biBhbmQgZmlsbCB0aGUgbG9nCisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7CisKKyAgICAgICAgICAgIC8vIFB1bGwgdGhlIGxvZ2NhdCBmb3IgYSBzaW5nbGUgcHJvY2VzcworICAgICAgICAgICAgU3RyaW5nIGxvZ2NhdCA9IG1EZXZpY2UuZXhlY3V0ZUFkYkNvbW1hbmQoImxvZ2NhdCIsICItdiIsICJicmllZiIsICItZCIsICItLXBpZD0iICsgcGlkLCAiKjpWIik7CisgICAgICAgICAgICBpbnQgbGluZU51bWJlciA9IDA7CisgICAgICAgICAgICBTY2FubmVyIGFwa0luID0gbmV3IFNjYW5uZXIobG9nY2F0KTsKKyAgICAgICAgICAgIHdoaWxlIChhcGtJbi5oYXNOZXh0TGluZSgpKSB7CisgICAgICAgICAgICAgICAgbGluZU51bWJlcisrOworICAgICAgICAgICAgICAgIFN0cmluZyBsaW5lID0gYXBrSW4ubmV4dExpbmUoKTsKKyAgICAgICAgICAgICAgICBpZiAobGluZS5jb250YWlucyhzZWFyY2hTdHJpbmcpICYmIGxpbmUuZW5kc1dpdGgoZW5kU3RyaW5nKSkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQuZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXN1bHQubGluZU51bWJlciA9IGxpbmVOdW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChsaW5lLmNvbnRhaW5zKCJ2a0NyZWF0ZUluc3RhbmNlIHN1Y2NlZWRlZCIpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIE9uY2Ugd2UndmUgZ290IG91dHB1dCBmcm9tIHRoZSBhcHAsIHdlJ3ZlIGNvbGxlY3RlZCB3aGF0IHdlIG5lZWQKKyAgICAgICAgICAgICAgICAgICAgc2NhbkNvbXBsZXRlPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFwa0luLmNsb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhbnkgdGVtcG9yYXJ5IGZpbGVzIG9uIHRoZSBkZXZpY2UsIGNsZWFyIGFueSBzZXR0aW5ncywga2lsbCB0aGUgYXBwcyBhZnRlciBlYWNoIHRlc3QKKyAgICAgKi8KKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCBjbGVhbnVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1EZXZpY2UuZXhlY3V0ZUFkYkNvbW1hbmQoInNoZWxsIiwgImFtIiwgImZvcmNlLXN0b3AiLCBERUJVR19BUFApOworICAgICAgICBtRGV2aWNlLmV4ZWN1dGVBZGJDb21tYW5kKCJzaGVsbCIsICJhbSIsICJmb3JjZS1zdG9wIiwgUkVMRUFTRV9BUFApOworICAgICAgICBtRGV2aWNlLmV4ZWN1dGVBZGJDb21tYW5kKCJzaGVsbCIsICJybSIsICItZiIsICIvZGF0YS9sb2NhbC90bXAvIiArIExBWUVSX0FfTElCKTsKKyAgICAgICAgbURldmljZS5leGVjdXRlQWRiQ29tbWFuZCgic2hlbGwiLCAicm0iLCAiLWYiLCAiL2RhdGEvbG9jYWwvdG1wLyIgKyBMQVlFUl9CX0xJQik7CisgICAgICAgIG1EZXZpY2UuZXhlY3V0ZUFkYkNvbW1hbmQoInNoZWxsIiwgInJtIiwgIi1mIiwgIi9kYXRhL2xvY2FsL3RtcC8iICsgTEFZRVJfQ19MSUIpOworICAgICAgICBtRGV2aWNlLmV4ZWN1dGVBZGJDb21tYW5kKCJzaGVsbCIsICJzZXR0aW5ncyIsICJkZWxldGUiLCAiZ2xvYmFsIiwgImVuYWJsZV9ncHVfZGVidWdfbGF5ZXJzIik7CisgICAgICAgIG1EZXZpY2UuZXhlY3V0ZUFkYkNvbW1hbmQoInNoZWxsIiwgInNldHRpbmdzIiwgImRlbGV0ZSIsICJnbG9iYWwiLCAiZ3B1X2RlYnVnX2FwcCIpOworICAgICAgICBtRGV2aWNlLmV4ZWN1dGVBZGJDb21tYW5kKCJzaGVsbCIsICJzZXR0aW5ncyIsICJkZWxldGUiLCAiZ2xvYmFsIiwgImdwdV9kZWJ1Z19sYXllcnMiKTsKKyAgICAgICAgbURldmljZS5leGVjdXRlQWRiQ29tbWFuZCgic2hlbGwiLCAic2V0cHJvcCIsICJkZWJ1Zy52dWxrYW4ubGF5ZXJzIiwgIlwnXCJcIlwnIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBpcyB0aGUgcHJpbWFyeSB0ZXN0IG9mIHRoZSBmZWF0dXJlLiBJdCBwdXNoZXMgbGF5ZXJzIHRvIG91ciBkZWJ1Z2dhYmxlIGFwcCBhbmQgZW5zdXJlcyB0aGV5IGFyZQorICAgICAqIGxvYWRlZCBpbiB0aGUgY29ycmVjdCBvcmRlci4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REZWJ1Z0xheWVyTG9hZFZ1bGthbigpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIC8vIFNldCB1cCBsYXllcnMgdG8gYmUgbG9hZGVkCisgICAgICAgIG1EZXZpY2UuZXhlY3V0ZUFkYkNvbW1hbmQoInNoZWxsIiwgInNldHRpbmdzIiwgInB1dCIsICJnbG9iYWwiLCAiZW5hYmxlX2dwdV9kZWJ1Z19sYXllcnMiLCAiMSIpOworICAgICAgICBtRGV2aWNlLmV4ZWN1dGVBZGJDb21tYW5kKCJzaGVsbCIsICJzZXR0aW5ncyIsICJwdXQiLCAiZ2xvYmFsIiwgImdwdV9kZWJ1Z19hcHAiLCBERUJVR19BUFApOworICAgICAgICBtRGV2aWNlLmV4ZWN1dGVBZGJDb21tYW5kKCJzaGVsbCIsICJzZXR0aW5ncyIsICJwdXQiLCAiZ2xvYmFsIiwgImdwdV9kZWJ1Z19sYXllcnMiLCBMQVlFUl9BX05BTUUgKyAiOiIgKyBMQVlFUl9CX05BTUUpOworCisgICAgICAgIC8vIENvcHkgdGhlIGxheWVycyBmcm9tIG91ciBMQVlFUlMgQVBLIHRvIHRtcAorICAgICAgICBzZXR1cExheWVyKExBWUVSX0FfTElCKTsKKyAgICAgICAgc2V0dXBMYXllcihMQVlFUl9CX0xJQik7CisKKworICAgICAgICAvLyBDb3B5IHRoZW0gb3ZlciB0byBvdXIgREVCVUcgYXBwCisgICAgICAgIG1EZXZpY2UuZXhlY3V0ZUFkYkNvbW1hbmQoInNoZWxsIiwgImNhdCIsICIvZGF0YS9sb2NhbC90bXAvIiArIExBWUVSX0FfTElCLCAifCIsCisgICAgICAgICAgICAgICAgInJ1bi1hcyIsIERFQlVHX0FQUCwgIi0tdXNlciIsIEludGVnZXIudG9TdHJpbmcobURldmljZS5nZXRDdXJyZW50VXNlcigpKSwKKyAgICAgICAgICAgICAgICAic2giLCAiLWMiLCAiXCdjYXQiLCAiPiIsIExBWUVSX0FfTElCLCAiOyIsICJjaG1vZCIsICI3MDAiLCBMQVlFUl9BX0xJQiArICJcJyIpOworICAgICAgICBtRGV2aWNlLmV4ZWN1dGVBZGJDb21tYW5kKCJzaGVsbCIsICJjYXQiLCAiL2RhdGEvbG9jYWwvdG1wLyIgKyBMQVlFUl9CX0xJQiwgInwiLAorICAgICAgICAgICAgICAgICJydW4tYXMiLCBERUJVR19BUFAsICItLXVzZXIiLCBJbnRlZ2VyLnRvU3RyaW5nKG1EZXZpY2UuZ2V0Q3VycmVudFVzZXIoKSksCisgICAgICAgICAgICAgICAgInNoIiwgIi1jIiwgIlwnY2F0IiwgIj4iLCBMQVlFUl9CX0xJQiwgIjsiLCAiY2htb2QiLCAiNzAwIiwgTEFZRVJfQl9MSUIgKyAiXCciKTsKKworICAgICAgICAvLyBLaWNrIG9mZiBvdXIgREVCVUcgYXBwCisgICAgICAgIG1EZXZpY2UuZXhlY3V0ZUFkYkNvbW1hbmQoInNoZWxsIiwgImFtIiwgInN0YXJ0IiwgIi1uIiwgREVCVUdfQVBQICsgIi8iICsgQUNUSVZJVFkpOworCisgICAgICAgIC8vIEdpdmUgaXQgYSBjaGFuY2UgdG8gc3RhcnQsIHRoZW4gZ3JhYiBwcm9jZXNzIElECisgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKKyAgICAgICAgU3RyaW5nIHBpZCA9IGdldFBJRChERUJVR19BUFApOworCisgICAgICAgIC8vIENoZWNrIHRoYXQgYm90aCBsYXllcnMgd2VyZSBsb2FkZWQsIGluIHRoZSBjb3JyZWN0IG9yZGVyCisgICAgICAgIFN0cmluZyBzZWFyY2hTdHJpbmdBID0gIm51bGxDcmVhdGVJbnN0YW5jZSBjYWxsZWQgaW4gIiArIExBWUVSX0E7CisgICAgICAgIExvZ1NjYW5SZXN1bHQgcmVzdWx0QSA9IHNjYW5Mb2cocGlkLCBzZWFyY2hTdHJpbmdBKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkxheWVyQSB3YXMgbm90IGxvYWRlZCIsIHJlc3VsdEEuZm91bmQpOworCisgICAgICAgIFN0cmluZyBzZWFyY2hTdHJpbmdCID0gIm51bGxDcmVhdGVJbnN0YW5jZSBjYWxsZWQgaW4gIiArIExBWUVSX0I7CisgICAgICAgIExvZ1NjYW5SZXN1bHQgcmVzdWx0QiA9IHNjYW5Mb2cocGlkLCBzZWFyY2hTdHJpbmdCKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkxheWVyQiB3YXMgbm90IGxvYWRlZCIsIHJlc3VsdEIuZm91bmQpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJMYXllckEgc2hvdWxkIGJlIGxvYWRlZCBiZWZvcmUgTGF5ZXJCIiwgcmVzdWx0QS5saW5lTnVtYmVyIDwgcmVzdWx0Qi5saW5lTnVtYmVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHRlc3QgZW5zdXJlcyB0aGF0IHdlIGNhbm5vdCBwdXNoIGEgbGF5ZXIgdG8gYSBub24tZGVidWdnYWJsZSBhcHAKKyAgICAgKiBJdCBhbHNvIGVuc3VyZXMgbm9uLWRlYnVnZ2FibGUgYXBwcyBpZ25vcmUgU2V0dGluZ3MgYW5kIGRvbid0IGVudW1lcmF0ZSBsYXllcnMgaW4gdGhlIGJhc2UgZGlyZWN0b3J5LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlbGVhc2VMYXllckxvYWRWdWxrYW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBTZXQgdXAgYSBsYXllcnMgdG8gYmUgbG9hZGVkIGZvciBSRUxFQVNFIGFwcAorICAgICAgICBtRGV2aWNlLmV4ZWN1dGVBZGJDb21tYW5kKCJzaGVsbCIsICJzZXR0aW5ncyIsICJwdXQiLCAiZ2xvYmFsIiwgImVuYWJsZV9ncHVfZGVidWdfbGF5ZXJzIiwgIjEiKTsKKyAgICAgICAgbURldmljZS5leGVjdXRlQWRiQ29tbWFuZCgic2hlbGwiLCAic2V0dGluZ3MiLCAicHV0IiwgImdsb2JhbCIsICJncHVfZGVidWdfYXBwIiwgUkVMRUFTRV9BUFApOworICAgICAgICBtRGV2aWNlLmV4ZWN1dGVBZGJDb21tYW5kKCJzaGVsbCIsICJzZXR0aW5ncyIsICJwdXQiLCAiZ2xvYmFsIiwgImdwdV9kZWJ1Z19sYXllcnMiLCBMQVlFUl9BX05BTUUgKyAiOiIgKyBMQVlFUl9CX05BTUUpOworCisgICAgICAgIC8vIENvcHkgYSBsYXllciBmcm9tIG91ciBMQVlFUlMgQVBLIHRvIHRtcAorICAgICAgICBzZXR1cExheWVyKExBWUVSX0FfTElCKTsKKworICAgICAgICAvLyBBdHRlbXB0IHRvIGNvcHkgdGhlbSBvdmVyIHRvIG91ciBSRUxFQVNFIGFwcCAodGhpcyBzaG91bGQgZmFpbCkKKyAgICAgICAgbURldmljZS5leGVjdXRlQWRiQ29tbWFuZCgic2hlbGwiLCAiY2F0IiwgIi9kYXRhL2xvY2FsL3RtcC8iICsgTEFZRVJfQV9MSUIsICJ8IiwKKyAgICAgICAgICAgICAgICAicnVuLWFzIiwgUkVMRUFTRV9BUFAsICItLXVzZXIiLCBJbnRlZ2VyLnRvU3RyaW5nKG1EZXZpY2UuZ2V0Q3VycmVudFVzZXIoKSksCisgICAgICAgICAgICAgICAgInNoIiwgIi1jIiwgIlwnY2F0IiwgIj4iLCBMQVlFUl9BX0xJQiwgIjsiLCAiY2htb2QiLCAiNzAwIiwgTEFZRVJfQV9MSUIgKyAiXCciLCAifHwiLCAiZWNobyIsICJydW4tYXMiLCAiZmFpbGVkIik7CisKKyAgICAgICAgLy8gS2ljayBvZmYgb3VyIFJFTEVBU0UgYXBwCisgICAgICAgIG1EZXZpY2UuZXhlY3V0ZUFkYkNvbW1hbmQoInNoZWxsIiwgImFtIiwgInN0YXJ0IiwgIi1uIiwgUkVMRUFTRV9BUFAgKyAiLyIgKyBBQ1RJVklUWSk7CisKKyAgICAgICAgLy8gR2l2ZSBpdCBhIGNoYW5jZSB0byBzdGFydCwgdGhlbiBncmFiIHByb2Nlc3MgSUQKKyAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOworICAgICAgICBTdHJpbmcgcGlkID0gZ2V0UElEKFJFTEVBU0VfQVBQKTsKKworICAgICAgICAvLyBFbnN1cmUgd2UgZG9uJ3QgbG9hZCB0aGUgbGF5ZXIgaW4gYmFzZSBkaXIKKyAgICAgICAgU3RyaW5nIHNlYXJjaFN0cmluZ0EgPSBMQVlFUl9BX05BTUUgKyAibG9hZGVkIjsKKyAgICAgICAgTG9nU2NhblJlc3VsdCByZXN1bHRBID0gc2NhbkxvZyhwaWQsIHNlYXJjaFN0cmluZ0EpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoIkxheWVyQSB3YXMgZW51bWVyYXRlZCIsIHJlc3VsdEEuZm91bmQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgdGVzdCBlbnN1cmVzIGRlYnVnZ2FibGUgYXBwcyBkbyBub3QgZW51bWVyYXRlIGxheWVycyBpbiBiYXNlCisgICAgICogZGlyZWN0b3J5IGlmIGVuYWJsZV9ncHVfZGVidWdfbGF5ZXJzIGlzIG5vdCBlbmFibGVkLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERlYnVnTm90RW5hYmxlZFZ1bGthbigpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIC8vIEVuc3VyZSB0aGUgZ2xvYmFsIGxheWVyIGVuYWJsZSBzZXR0aW5ncyBpcyBOT1QgZW5hYmxlZAorICAgICAgICBtRGV2aWNlLmV4ZWN1dGVBZGJDb21tYW5kKCJzaGVsbCIsICJzZXR0aW5ncyIsICJwdXQiLCAiZ2xvYmFsIiwgImVuYWJsZV9ncHVfZGVidWdfbGF5ZXJzIiwgIjAiKTsKKyAgICAgICAgbURldmljZS5leGVjdXRlQWRiQ29tbWFuZCgic2hlbGwiLCAic2V0dGluZ3MiLCAicHV0IiwgImdsb2JhbCIsICJncHVfZGVidWdfYXBwIiwgREVCVUdfQVBQKTsKKyAgICAgICAgbURldmljZS5leGVjdXRlQWRiQ29tbWFuZCgic2hlbGwiLCAic2V0dGluZ3MiLCAicHV0IiwgImdsb2JhbCIsICJncHVfZGVidWdfbGF5ZXJzIiwgTEFZRVJfQV9OQU1FKTsKKworICAgICAgICAvLyBDb3B5IGEgbGF5ZXIgZnJvbSBvdXIgTEFZRVJTIEFQSyB0byB0bXAKKyAgICAgICAgc2V0dXBMYXllcihMQVlFUl9BX0xJQik7CisKKyAgICAgICAgLy8gQ29weSBpdCBvdmVyIHRvIG91ciBERUJVRyBhcHAKKyAgICAgICAgbURldmljZS5leGVjdXRlQWRiQ29tbWFuZCgic2hlbGwiLCAiY2F0IiwgIi9kYXRhL2xvY2FsL3RtcC8iICsgTEFZRVJfQV9MSUIsICJ8IiwKKyAgICAgICAgICAgICAgICAicnVuLWFzIiwgREVCVUdfQVBQLCAiLS11c2VyIiwgSW50ZWdlci50b1N0cmluZyhtRGV2aWNlLmdldEN1cnJlbnRVc2VyKCkpLAorICAgICAgICAgICAgICAgICJzaCIsICItYyIsICJcJ2NhdCIsICI+IiwgTEFZRVJfQV9MSUIsICI7IiwgImNobW9kIiwgIjcwMCIsIExBWUVSX0FfTElCICsgIlwnIik7CisKKyAgICAgICAgLy8gS2ljayBvZmYgb3VyIERFQlVHIGFwcAorICAgICAgICBtRGV2aWNlLmV4ZWN1dGVBZGJDb21tYW5kKCJzaGVsbCIsICJhbSIsICJzdGFydCIsICItbiIsIERFQlVHX0FQUCArICIvIiArIEFDVElWSVRZKTsKKworICAgICAgICAvLyBHaXZlIGl0IGEgY2hhbmNlIHRvIHN0YXJ0LCB0aGVuIGdyYWIgcHJvY2VzcyBJRAorICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7CisgICAgICAgIFN0cmluZyBwaWQgPSBnZXRQSUQoREVCVUdfQVBQKTsKKworICAgICAgICAvLyBFbnN1cmUgd2UgZG9uJ3QgbG9hZCB0aGUgbGF5ZXIgaW4gYmFzZSBkaXIKKyAgICAgICAgU3RyaW5nIHNlYXJjaFN0cmluZ0EgPSBMQVlFUl9BX05BTUUgKyAibG9hZGVkIjsKKyAgICAgICAgTG9nU2NhblJlc3VsdCByZXN1bHRBID0gc2NhbkxvZyhwaWQsIHNlYXJjaFN0cmluZ0EpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoIkxheWVyQSB3YXMgZW51bWVyYXRlZCIsIHJlc3VsdEEuZm91bmQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgdGVzdCBlbnN1cmVzIGRlYnVnZ2FibGUgYXBwcyBkbyBub3QgZW51bWVyYXRlIGxheWVycyBpbiBiYXNlCisgICAgICogZGlyZWN0b3J5IGlmIGdwdV9kZWJ1Z19hcHAgZG9lcyBub3QgbWF0Y2guCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVidWdXcm9uZ0FwcFZ1bGthbigpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIC8vIEVuc3VyZSB0aGUgZ3B1X2RlYnVnX2FwcCBkb2VzIG5vdCBtYXRjaCB3aGF0IHdlIGxhdW5jaAorICAgICAgICBtRGV2aWNlLmV4ZWN1dGVBZGJDb21tYW5kKCJzaGVsbCIsICJzZXR0aW5ncyIsICJwdXQiLCAiZ2xvYmFsIiwgImVuYWJsZV9ncHVfZGVidWdfbGF5ZXJzIiwgIjEiKTsKKyAgICAgICAgbURldmljZS5leGVjdXRlQWRiQ29tbWFuZCgic2hlbGwiLCAic2V0dGluZ3MiLCAicHV0IiwgImdsb2JhbCIsICJncHVfZGVidWdfYXBwIiwgUkVMRUFTRV9BUFApOworICAgICAgICBtRGV2aWNlLmV4ZWN1dGVBZGJDb21tYW5kKCJzaGVsbCIsICJzZXR0aW5ncyIsICJwdXQiLCAiZ2xvYmFsIiwgImdwdV9kZWJ1Z19sYXllcnMiLCBMQVlFUl9BX05BTUUpOworCisgICAgICAgIC8vIENvcHkgYSBsYXllciBmcm9tIG91ciBMQVlFUlMgQVBLIHRvIHRtcAorICAgICAgICBzZXR1cExheWVyKExBWUVSX0FfTElCKTsKKworICAgICAgICAvLyBDb3B5IGl0IG92ZXIgdG8gb3VyIERFQlVHIGFwcAorICAgICAgICBtRGV2aWNlLmV4ZWN1dGVBZGJDb21tYW5kKCJzaGVsbCIsICJjYXQiLCAiL2RhdGEvbG9jYWwvdG1wLyIgKyBMQVlFUl9BX0xJQiwgInwiLAorICAgICAgICAgICAgICAgICJydW4tYXMiLCBERUJVR19BUFAsICItLXVzZXIiLCBJbnRlZ2VyLnRvU3RyaW5nKG1EZXZpY2UuZ2V0Q3VycmVudFVzZXIoKSksCisgICAgICAgICAgICAgICAgInNoIiwgIi1jIiwgIlwnY2F0IiwgIj4iLCBMQVlFUl9BX0xJQiwgIjsiLCAiY2htb2QiLCAiNzAwIiwgTEFZRVJfQV9MSUIgKyAiXCciKTsKKworICAgICAgICAvLyBLaWNrIG9mZiBvdXIgREVCVUcgYXBwCisgICAgICAgIG1EZXZpY2UuZXhlY3V0ZUFkYkNvbW1hbmQoInNoZWxsIiwgImFtIiwgInN0YXJ0IiwgIi1uIiwgREVCVUdfQVBQICsgIi8iICsgQUNUSVZJVFkpOworCisgICAgICAgIC8vIEdpdmUgaXQgYSBjaGFuY2UgdG8gc3RhcnQsIHRoZW4gZ3JhYiBwcm9jZXNzIElECisgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKKyAgICAgICAgU3RyaW5nIHBpZCA9IGdldFBJRChERUJVR19BUFApOworCisgICAgICAgIC8vIEVuc3VyZSB3ZSBkb24ndCBsb2FkIHRoZSBsYXllciBpbiBiYXNlIGRpcgorICAgICAgICBTdHJpbmcgc2VhcmNoU3RyaW5nQSA9IExBWUVSX0FfTkFNRSArICJsb2FkZWQiOworICAgICAgICBMb2dTY2FuUmVzdWx0IHJlc3VsdEEgPSBzY2FuTG9nKHBpZCwgc2VhcmNoU3RyaW5nQSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZSgiTGF5ZXJBIHdhcyBlbnVtZXJhdGVkIiwgcmVzdWx0QS5mb3VuZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyB0ZXN0IGVuc3VyZXMgZGVidWdnYWJsZSBhcHBzIGRvIG5vdCBlbnVtZXJhdGUgbGF5ZXJzIGluIGJhc2UKKyAgICAgKiBkaXJlY3RvcnkgaWYgZ3B1X2RlYnVnX2xheWVycyBhcmUgbm90IHNldC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REZWJ1Z05vTGF5ZXJzRW5hYmxlZFZ1bGthbigpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIC8vIEVuc3VyZSB0aGUgZ2xvYmFsIGxheWVyIGVuYWJsZSBzZXR0aW5ncyBpcyBOT1QgZW5hYmxlZAorICAgICAgICBtRGV2aWNlLmV4ZWN1dGVBZGJDb21tYW5kKCJzaGVsbCIsICJzZXR0aW5ncyIsICJwdXQiLCAiZ2xvYmFsIiwgImVuYWJsZV9ncHVfZGVidWdfbGF5ZXJzIiwgIjEiKTsKKyAgICAgICAgbURldmljZS5leGVjdXRlQWRiQ29tbWFuZCgic2hlbGwiLCAic2V0dGluZ3MiLCAicHV0IiwgImdsb2JhbCIsICJncHVfZGVidWdfYXBwIiwgREVCVUdfQVBQKTsKKyAgICAgICAgbURldmljZS5leGVjdXRlQWRiQ29tbWFuZCgic2hlbGwiLCAic2V0dGluZ3MiLCAicHV0IiwgImdsb2JhbCIsICJncHVfZGVidWdfbGF5ZXJzIiwgImZvbyIpOworCisgICAgICAgIC8vIENvcHkgYSBsYXllciBmcm9tIG91ciBMQVlFUlMgQVBLIHRvIHRtcAorICAgICAgICBzZXR1cExheWVyKExBWUVSX0FfTElCKTsKKworICAgICAgICAvLyBDb3B5IGl0IG92ZXIgdG8gb3VyIERFQlVHIGFwcAorICAgICAgICBtRGV2aWNlLmV4ZWN1dGVBZGJDb21tYW5kKCJzaGVsbCIsICJjYXQiLCAiL2RhdGEvbG9jYWwvdG1wLyIgKyBMQVlFUl9BX0xJQiwgInwiLAorICAgICAgICAgICAgICAgICJydW4tYXMiLCBERUJVR19BUFAsICItLXVzZXIiLCBJbnRlZ2VyLnRvU3RyaW5nKG1EZXZpY2UuZ2V0Q3VycmVudFVzZXIoKSksCisgICAgICAgICAgICAgICAgInNoIiwgIi1jIiwgIlwnY2F0IiwgIj4iLCBMQVlFUl9BX0xJQiwgIjsiLCAiY2htb2QiLCAiNzAwIiwgTEFZRVJfQV9MSUIgKyAiXCciKTsKKworICAgICAgICAvLyBLaWNrIG9mZiBvdXIgREVCVUcgYXBwCisgICAgICAgIG1EZXZpY2UuZXhlY3V0ZUFkYkNvbW1hbmQoInNoZWxsIiwgImFtIiwgInN0YXJ0IiwgIi1uIiwgREVCVUdfQVBQICsgIi8iICsgQUNUSVZJVFkpOworCisgICAgICAgIC8vIEdpdmUgaXQgYSBjaGFuY2UgdG8gc3RhcnQsIHRoZW4gZ3JhYiBwcm9jZXNzIElECisgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKKyAgICAgICAgU3RyaW5nIHBpZCA9IGdldFBJRChERUJVR19BUFApOworCisgICAgICAgIC8vIEVuc3VyZSBsYXllckEgaXMgbm90IGxvYWRlZAorICAgICAgICBTdHJpbmcgc2VhcmNoU3RyaW5nQSA9ICJudWxsQ3JlYXRlSW5zdGFuY2UgY2FsbGVkIGluICIgKyBMQVlFUl9BOworICAgICAgICBMb2dTY2FuUmVzdWx0IHJlc3VsdEEgPSBzY2FuTG9nKHBpZCwgc2VhcmNoU3RyaW5nQSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZSgiTGF5ZXJBIHdhcyBsb2FkZWQiLCByZXN1bHRBLmZvdW5kKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHRlc3QgZW5zdXJlcyB3ZSBjYW4gc3RpbGwgdXNlIHByb3BlcnRpZXMgaWYgbm8gbGF5ZXIgZm91bmQgdmlhIFNldHRpbmdzCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3lzdGVtUHJvcGVydHlFbmFibGVWdWxrYW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBTZXQgdXAgbGF5ZXJBIHRvIGJlIGxvYWRlZCwgYnV0IG5vdCBsYXllckIgb3IgbGF5ZXJDCisgICAgICAgIG1EZXZpY2UuZXhlY3V0ZUFkYkNvbW1hbmQoInNoZWxsIiwgInNldHRpbmdzIiwgInB1dCIsICJnbG9iYWwiLCAiZW5hYmxlX2dwdV9kZWJ1Z19sYXllcnMiLCAiMSIpOworICAgICAgICBtRGV2aWNlLmV4ZWN1dGVBZGJDb21tYW5kKCJzaGVsbCIsICJzZXR0aW5ncyIsICJwdXQiLCAiZ2xvYmFsIiwgImdwdV9kZWJ1Z19hcHAiLCBSRUxFQVNFX0FQUCk7CisgICAgICAgIG1EZXZpY2UuZXhlY3V0ZUFkYkNvbW1hbmQoInNoZWxsIiwgInNldHRpbmdzIiwgInB1dCIsICJnbG9iYWwiLCAiZ3B1X2RlYnVnX2xheWVycyIsIExBWUVSX0FfTkFNRSk7CisKKyAgICAgICAgLy8gRW5hYmxlIGxheWVyQyAod2hpY2ggaXMgcGFja2FnZWQgd2l0aCB0aGUgUkVMRUFTRSBhcHApIHdpdGggc3lzdGVtIHByb3BlcnRpZXMKKyAgICAgICAgbURldmljZS5leGVjdXRlQWRiQ29tbWFuZCgic2hlbGwiLCAic2V0cHJvcCIsICJkZWJ1Zy52dWxrYW4ubGF5ZXJzICIgKyBMQVlFUl9DX05BTUUpOworCisgICAgICAgIC8vIEtpY2sgb2ZmIG91ciBSRUxFQVNFIGFwcAorICAgICAgICBtRGV2aWNlLmV4ZWN1dGVBZGJDb21tYW5kKCJzaGVsbCIsICJhbSIsICJzdGFydCIsICItbiIsIFJFTEVBU0VfQVBQICsgIi8iICsgQUNUSVZJVFkpOworCisgICAgICAgIC8vIEdpdmUgaXQgYSBjaGFuY2UgdG8gc3RhcnQsIHRoZW4gZ3JhYiBwcm9jZXNzIElECisgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKKyAgICAgICAgU3RyaW5nIHBpZCA9IGdldFBJRChSRUxFQVNFX0FQUCk7CisKKyAgICAgICAgLy8gQ2hlY2sgdGhhdCBib3RoIGxheWVycyB3ZXJlIGxvYWRlZCwgaW4gdGhlIGNvcnJlY3Qgb3JkZXIKKyAgICAgICAgU3RyaW5nIHNlYXJjaFN0cmluZ0EgPSBMQVlFUl9BX05BTUUgKyAibG9hZGVkIjsKKyAgICAgICAgTG9nU2NhblJlc3VsdCByZXN1bHRBID0gc2NhbkxvZyhwaWQsIHNlYXJjaFN0cmluZ0EpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoIkxheWVyQSB3YXMgZW51bWVyYXRlZCIsIHJlc3VsdEEuZm91bmQpOworCisgICAgICAgIFN0cmluZyBzZWFyY2hTdHJpbmdDID0gIm51bGxDcmVhdGVJbnN0YW5jZSBjYWxsZWQgaW4gIiArIExBWUVSX0M7CisgICAgICAgIExvZ1NjYW5SZXN1bHQgcmVzdWx0QyA9IHNjYW5Mb2cocGlkLCBzZWFyY2hTdHJpbmdDKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkxheWVyQyB3YXMgbm90IGxvYWRlZCIsIHJlc3VsdEMuZm91bmQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgdGVzdCBlbnN1cmVzIHN5c3RlbSBwcm9wZXJ0aWVzIGFyZSBpZ25vcmVkIGlmIFNldHRpbmdzIGxvYWQgYSBsYXllcgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN5c3RlbVByb3BlcnR5SWdub3JlVnVsa2FuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gU2V0IHVwIGxheWVyQSB0byBiZSBsb2FkZWQsIGJ1dCBub3QgbGF5ZXJCCisgICAgICAgIG1EZXZpY2UuZXhlY3V0ZUFkYkNvbW1hbmQoInNoZWxsIiwgInNldHRpbmdzIiwgInB1dCIsICJnbG9iYWwiLCAiZW5hYmxlX2dwdV9kZWJ1Z19sYXllcnMiLCAiMSIpOworICAgICAgICBtRGV2aWNlLmV4ZWN1dGVBZGJDb21tYW5kKCJzaGVsbCIsICJzZXR0aW5ncyIsICJwdXQiLCAiZ2xvYmFsIiwgImdwdV9kZWJ1Z19hcHAiLCBERUJVR19BUFApOworICAgICAgICBtRGV2aWNlLmV4ZWN1dGVBZGJDb21tYW5kKCJzaGVsbCIsICJzZXR0aW5ncyIsICJwdXQiLCAiZ2xvYmFsIiwgImdwdV9kZWJ1Z19sYXllcnMiLCBMQVlFUl9BX05BTUUpOworCisgICAgICAgIC8vIENvcHkgdGhlIGxheWVycyBmcm9tIG91ciBMQVlFUlMgQVBLCisgICAgICAgIHNldHVwTGF5ZXIoTEFZRVJfQV9MSUIpOworICAgICAgICBzZXR1cExheWVyKExBWUVSX0JfTElCKTsKKworICAgICAgICAvLyBDb3B5IHRoZW0gb3ZlciB0byBvdXIgREVCVUcgYXBwCisgICAgICAgIG1EZXZpY2UuZXhlY3V0ZUFkYkNvbW1hbmQoInNoZWxsIiwgImNhdCIsICIvZGF0YS9sb2NhbC90bXAvIiArIExBWUVSX0FfTElCLCAifCIsCisgICAgICAgICAgICAgICAgInJ1bi1hcyIsIERFQlVHX0FQUCwgIi0tdXNlciIsIEludGVnZXIudG9TdHJpbmcobURldmljZS5nZXRDdXJyZW50VXNlcigpKSwKKyAgICAgICAgICAgICAgICAic2giLCAiLWMiLCAiXCdjYXQiLCAiPiIsIExBWUVSX0FfTElCLCAiOyIsICJjaG1vZCIsICI3MDAiLCBMQVlFUl9BX0xJQiArICJcJyIpOworICAgICAgICBtRGV2aWNlLmV4ZWN1dGVBZGJDb21tYW5kKCJzaGVsbCIsICJjYXQiLCAiL2RhdGEvbG9jYWwvdG1wLyIgKyBMQVlFUl9CX0xJQiwgInwiLAorICAgICAgICAgICAgICAgICJydW4tYXMiLCBERUJVR19BUFAsICItLXVzZXIiLCBJbnRlZ2VyLnRvU3RyaW5nKG1EZXZpY2UuZ2V0Q3VycmVudFVzZXIoKSksCisgICAgICAgICAgICAgICAgInNoIiwgIi1jIiwgIlwnY2F0IiwgIj4iLCBMQVlFUl9CX0xJQiwgIjsiLCAiY2htb2QiLCAiNzAwIiwgTEFZRVJfQl9MSUIgKyAiXCciKTsKKworICAgICAgICAvLyBFbmFibGUgbGF5ZXJCIHdpdGggc3lzdGVtIHByb3BlcnRpZXMKKyAgICAgICAgbURldmljZS5leGVjdXRlQWRiQ29tbWFuZCgic2hlbGwiLCAic2V0cHJvcCIsICJkZWJ1Zy52dWxrYW4ubGF5ZXJzICIgKyBMQVlFUl9CX05BTUUpOworCisgICAgICAgIC8vIEtpY2sgb2ZmIG91ciBERUJVRyBhcHAKKyAgICAgICAgbURldmljZS5leGVjdXRlQWRiQ29tbWFuZCgic2hlbGwiLCAiYW0iLCAic3RhcnQiLCAiLW4iLCBERUJVR19BUFAgKyAiLyIgKyBBQ1RJVklUWSk7CisKKyAgICAgICAgLy8gR2l2ZSBpdCBhIGNoYW5jZSB0byBzdGFydCwgdGhlbiBncmFiIHByb2Nlc3MgSUQKKyAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOworICAgICAgICBTdHJpbmcgcGlkID0gZ2V0UElEKERFQlVHX0FQUCk7CisKKyAgICAgICAgLy8gRW5zdXJlIG9ubHkgbGF5ZXJBIGlzIGxvYWRlZAorICAgICAgICBTdHJpbmcgc2VhcmNoU3RyaW5nQSA9ICJudWxsQ3JlYXRlSW5zdGFuY2UgY2FsbGVkIGluICIgKyBMQVlFUl9BOworICAgICAgICBMb2dTY2FuUmVzdWx0IHJlc3VsdEEgPSBzY2FuTG9nKHBpZCwgc2VhcmNoU3RyaW5nQSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJMYXllckEgd2FzIG5vdCBsb2FkZWQiLCByZXN1bHRBLmZvdW5kKTsKKworICAgICAgICBTdHJpbmcgc2VhcmNoU3RyaW5nQiA9ICJudWxsQ3JlYXRlSW5zdGFuY2UgY2FsbGVkIGluICIgKyBMQVlFUl9COworICAgICAgICBMb2dTY2FuUmVzdWx0IHJlc3VsdEIgPSBzY2FuTG9nKHBpZCwgc2VhcmNoU3RyaW5nQik7CisgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZSgiTGF5ZXJCIHdhcyBsb2FkZWQiLCByZXN1bHRCLmZvdW5kKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2hhcm1mdWxhcHB3YXJuaW5nL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2hhcm1mdWxhcHB3YXJuaW5nL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVjMmU5OQotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvaGFybWZ1bGFwcHdhcm5pbmcvQW5kcm9pZC5tawpAQCAtMCwwICsxLDM2IEBACisjIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCisKK0xPQ0FMX01PRFVMRSA6PSBDdHNIYXJtZnVsQXBwV2FybmluZ0hvc3RUZXN0Q2FzZXMKKworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gY3RzLXRyYWRlZmVkIHRyYWRlZmVkCisKKworCisjIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0CitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworCitMT0NBTF9DVFNfVEVTVF9QQUNLQUdFIDo9IGFuZHJvaWQuaG9zdC5oYXJtZnVsYXBwd2FybmluZworCitpbmNsdWRlICQoQlVJTERfQ1RTX0hPU1RfSkFWQV9MSUJSQVJZKQorCitpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2hhcm1mdWxhcHB3YXJuaW5nL0FuZHJvaWRUZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvaGFybWZ1bGFwcHdhcm5pbmcvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZjFiMDQKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2hhcm1mdWxhcHB3YXJuaW5nL0FuZHJvaWRUZXN0LnhtbApAQCAtMCwwICsxLDI3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgdGhlIENUUyBIYXJtZnVsIEFwcCBXYXJuaW5nIGhvc3QgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJzZWN1cml0eSIgLz4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJDdHNIYXJtZnVsQXBwV2FybmluZ1Rlc3RBcHAuYXBrIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5KYXJIb3N0VGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImphciIgdmFsdWU9IkN0c0hhcm1mdWxBcHBXYXJuaW5nSG9zdFRlc3RDYXNlcy5qYXIiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVudGltZS1oaW50IiB2YWx1ZT0iMTBzIiAvPgorICAgIDwvdGVzdD4KKzwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvaGFybWZ1bGFwcHdhcm5pbmcvc2FtcGxlYXBwL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2hhcm1mdWxhcHB3YXJuaW5nL3NhbXBsZWFwcC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwYWJhMGQKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2hhcm1mdWxhcHB3YXJuaW5nL3NhbXBsZWFwcC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzcgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworIyBEb24ndCBpbmNsdWRlIHRoaXMgcGFja2FnZSBpbiBhbnkgdGFyZ2V0CitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworIyBXaGVuIGJ1aWx0LCBleHBsaWNpdGx5IHB1dCBpdCBpbiB0aGUgZGF0YSBwYXJ0aXRpb24uCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQorCitMT0NBTF9ERVhfUFJFT1BUIDo9IGZhbHNlCisKK0xPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQorCisjIHRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0CitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzSGFybWZ1bEFwcFdhcm5pbmdTYW1wbGVBcHAKKworTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvaGFybWZ1bGFwcHdhcm5pbmcvc2FtcGxlYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2hhcm1mdWxhcHB3YXJuaW5nL3NhbXBsZWFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjViZmJkMjQKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2hhcm1mdWxhcHB3YXJuaW5nL3NhbXBsZWFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJhbmRyb2lkLmhhcm1mdWxhcHB3YXJuaW5nLnNhbXBsZWFwcCI+CisKKyAgICA8YXBwbGljYXRpb24+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5TYW1wbGVEZXZpY2VBY3Rpdml0eSIgPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgIDwvYXBwbGljYXRpb24+CisKKzwvbWFuaWZlc3Q+CisKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvaGFybWZ1bGFwcHdhcm5pbmcvc2FtcGxlYXBwL3Jlcy9sYXlvdXQvc2FtcGxlX2xheW91dC54bWwgYi9ob3N0c2lkZXRlc3RzL2hhcm1mdWxhcHB3YXJuaW5nL3NhbXBsZWFwcC9yZXMvbGF5b3V0L3NhbXBsZV9sYXlvdXQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNGU1YTAKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2hhcm1mdWxhcHB3YXJuaW5nL3NhbXBsZWFwcC9yZXMvbGF5b3V0L3NhbXBsZV9sYXlvdXQueG1sCkBAIC0wLDAgKzEsMTkgQEAKKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxSZWxhdGl2ZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCI+CisKKzwvUmVsYXRpdmVMYXlvdXQ+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2hhcm1mdWxhcHB3YXJuaW5nL3NhbXBsZWFwcC9zcmMvYW5kcm9pZC9oYXJtZnVsYXBwd2FybmluZy9zYW1wbGVhcHAvU2FtcGxlRGV2aWNlQWN0aXZpdHkuamF2YSBiL2hvc3RzaWRldGVzdHMvaGFybWZ1bGFwcHdhcm5pbmcvc2FtcGxlYXBwL3NyYy9hbmRyb2lkL2hhcm1mdWxhcHB3YXJuaW5nL3NhbXBsZWFwcC9TYW1wbGVEZXZpY2VBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYjc4NjkKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2hhcm1mdWxhcHB3YXJuaW5nL3NhbXBsZWFwcC9zcmMvYW5kcm9pZC9oYXJtZnVsYXBwd2FybmluZy9zYW1wbGVhcHAvU2FtcGxlRGV2aWNlQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmhhcm1mdWxhcHB3YXJuaW5nLnNhbXBsZWFwcDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CisKKy8qKgorICogQSBzaW1wbGUgYWN0aXZpdHkgd2hpY2ggbG9ncyB0byBMb2djYXQuCisgKgorICogPHA+VGhpcyBzZXJ2ZXMgYXMgYSBzaW1wbGUgdGFyZ2V0IGFwcGxpY2F0aW9uL2FjdGl2aXR5IHRvIHNldCBhIGhhcm1mdWwgYXBwIHdhcm5pbmcgb24uCisgKi8KK3B1YmxpYyBjbGFzcyBTYW1wbGVEZXZpY2VBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fQUNUSVZJVFlfU1RBUlRFRCA9CisgICAgICAgICAgICAiYW5kcm9pZC5oYXJtZnVsYXBwd2FybmluZy5zYW1wbGVhcHAuQUNUSVZJVFlfU1RBUlRFRCI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgaWNpY2xlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKGljaWNsZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LnNhbXBsZV9sYXlvdXQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgeworICAgICAgICBzdXBlci5vblJlc3VtZSgpOworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChBQ1RJT05fQUNUSVZJVFlfU1RBUlRFRCk7CisgICAgICAgIHNlbmRCcm9hZGNhc3QoaW50ZW50KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2hhcm1mdWxhcHB3YXJuaW5nL3NyYy9hbmRyb2lkL2hhcm1mdWxhcHB3YXJuaW5nL2N0cy9IYXJtZnVsQXBwV2FybmluZ1Rlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvaGFybWZ1bGFwcHdhcm5pbmcvc3JjL2FuZHJvaWQvaGFybWZ1bGFwcHdhcm5pbmcvY3RzL0hhcm1mdWxBcHBXYXJuaW5nVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmYzg4ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2hhcm1mdWxhcHB3YXJuaW5nL3NyYy9hbmRyb2lkL2hhcm1mdWxhcHB3YXJuaW5nL2N0cy9IYXJtZnVsQXBwV2FybmluZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDE2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5oYXJtZnVsYXBwd2FybmluZy5jdHM7CisKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uOworaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5JVGVzdERldmljZTsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuUGFja2FnZUluZm87CitpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQucmVzdWx0LklucHV0U3RyZWFtU291cmNlOworaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkRldmljZUpVbml0NENsYXNzUnVubmVyOworaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLmp1bml0NC5CYXNlSG9zdEpVbml0NFRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworCitpbXBvcnQgamF2YS51dGlsLlNjYW5uZXI7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzdW1lLmFzc3VtZUZhbHNlOworCisvKioKKyAqIEhvc3Qtc2lkZSB0ZXN0cyBmb3IgdGhlIGhhcm1mdWwgYXBwIGxhdW5jaCB3YXJuaW5nCisgKgorICogPHA+VGhlc2UgdGVzdHMgaGF2ZSBhIGZldyBkaWZmZXJlbnQgY29tcG9uZW50cy4gVGhpcyBpcyB0aGUgaG9zdC1zaWRlIHBhcnQgb2YgdGhlIHRlc3QsIHdoaWNoIGlzCisgKiByZXNwb25zaWJsZSBmb3Igc2V0dGluZyB1cCB0aGUgZW52aXJvbm1lbnQgYW5kIHBhc3Npbmcgb2ZmIGV4ZWN1dGlvbiB0byB0aGUgZGV2aWNlLXNpZGUgcGFydAorICogb2YgdGhlIHRlc3QuCisgKgorICogPHA+VGhlIHtAbGluayBIYXJtZnVsQXBwV2FybmluZ0RldmljZVRlc3R9IGNsYXNzIGlzIHRoZSBkZXZpY2Ugc2lkZSBvZiB0aGVzZSB0ZXN0cy4gSXQgYXR0ZW1wdHMgdG8gbGF1bmNoCisgKiB0aGUgc2FtcGxlIHdhcm5lZCBhcHBsaWNhdGlvbiwgYW5kIHZlcmlmaWVzIHRoZSBjb3JyZWN0IGJlaGF2aW9yIG9mIHRoZSBoYXJtZnVsIGFwcCB3YXJuaW5nIHRoYXQKKyAqIGlzIHNob3duIGJ5IHRoZSBwbGF0Zm9ybS4KKyAqCisgKiA8cD5UaGUgdGhpcmQgY29tcG9uZW50IGlzIHRoZSBzYW1wbGUgYXBwLCB3aGljaCBpcyBqdXN0IGEgcGxhY2Vob2xkZXIgYXBwIHdpdGggYSBiYXNpYyBhY3Rpdml0eQorICogdGhhdCBvbmx5IHNlcnZlcyBhcyBhIHRhcmdldCBmb3IgdGhlIGhhcm1mdWwgYXBwIHdhcm5pbmcuCisgKgorICogPHA+UnVuIHdpdGg6IGF0ZXN0IEN0c0hhcm1mdWxBcHBXYXJuaW5nSG9zdFRlc3RDYXNlcworICovCitAUnVuV2l0aChEZXZpY2VKVW5pdDRDbGFzc1J1bm5lci5jbGFzcykKK3B1YmxpYyBjbGFzcyBIYXJtZnVsQXBwV2FybmluZ1Rlc3QgZXh0ZW5kcyBCYXNlSG9zdEpVbml0NFRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVfV0VBUkFCTEUgPSAiYW5kcm9pZC5oYXJkd2FyZS50eXBlLndhdGNoIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0FQUF9QQUNLQUdFX05BTUUgPSAiYW5kcm9pZC5oYXJtZnVsYXBwd2FybmluZy5zYW1wbGVhcHAiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0FQUF9BQ1RJVklUWV9DTEFTU19OQU1FID0gIlNhbXBsZURldmljZUFjdGl2aXR5IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9BUFBfTEFVTkNIRURfU1RSSU5HID0gIlNhbXBsZSBhY3Rpdml0eSBzdGFydGVkLiI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FSTklOR19NRVNTQUdFID0gIlRoaXMgaXMgYSB3YXJuaW5nIG1lc3NhZ2UuIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VUX0hBUk1GVUxfQVBQX1dBUk5JTkdfQ09NTUFORCA9IFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAiY21kIHBhY2thZ2Ugc2V0LWhhcm1mdWwtYXBwLXdhcm5pbmcgJXMgXCIiICsgV0FSTklOR19NRVNTQUdFICsgIlwiIiwKKyAgICAgICAgICAgIFRFU1RfQVBQX1BBQ0tBR0VfTkFNRSk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQVJfSEFSTUZVTF9BUFBfV0FSTklOR19DT01NQU5EID0gU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICJjbWQgcGFja2FnZSBzZXQtaGFybWZ1bC1hcHAtd2FybmluZyAlcyIsIFRFU1RfQVBQX1BBQ0tBR0VfTkFNRSk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VUX0hBUk1GVUxfQVBQX1dBUk5JTkdfQ09NTUFORCA9IFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAiY21kIHBhY2thZ2UgZ2V0LWhhcm1mdWwtYXBwLXdhcm5pbmcgJXMiLCBURVNUX0FQUF9QQUNLQUdFX05BTUUpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExJU1RfUEFDS0FHRVNfQ09NTUFORCA9CisgICAgICAgICAgICAiY21kIHBhY2thZ2UgbGlzdCBwYWNrYWdlcyAtLXVzZXIgJWQgIiArIFRFU1RfQVBQX1BBQ0tBR0VfTkFNRTsKKworICAgIHByaXZhdGUgSVRlc3REZXZpY2UgbURldmljZTsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbnN0YWxsUGFja2FnZSgiQ3RzSGFybWZ1bEFwcFdhcm5pbmdTYW1wbGVBcHAuYXBrIik7CisgICAgICAgIG1EZXZpY2UgPSBnZXREZXZpY2UoKTsKKyAgICAgICAgbURldmljZS5jbGVhckxvZ2NhdCgpOworCisgICAgICAgIC8vIFNraXAgdGhlIHRlc3RzIGZvciB3ZWFyYWJsZSBkZXZpY2VzLiBUaGlzIGZlYXR1cmUgaXMgbm90IHVzZWQgb24gd2VhcmFibGUKKyAgICAgICAgLy8gZGV2aWNlcywgZm9yIG5vdyAobm8gd2VhcmFibGUgVUksIGV0Yy4pCisgICAgICAgIGFzc3VtZUZhbHNlKGhhc0ZlYXR1cmUoRkVBVFVSRV9XRUFSQUJMRSkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBydW5EZXZpY2VUZXN0KFN0cmluZyB0ZXN0TmFtZSkgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7CisgICAgICAgIHJ1bkRldmljZVRlc3RzKCJhbmRyb2lkLmhhcm1mdWxhcHB3YXJuaW5nLnRlc3RhcHAiLAorICAgICAgICAgICAgICAgICJhbmRyb2lkLmhhcm1mdWxhcHB3YXJuaW5nLnRlc3RhcHAuSGFybWZ1bEFwcFdhcm5pbmdEZXZpY2VUZXN0IiwKKyAgICAgICAgICAgICAgICB0ZXN0TmFtZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUhhcm1mdWxBcHBXYXJuaW5nU2V0KCkgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyB3YXJuaW5nID0gZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZChHRVRfSEFSTUZVTF9BUFBfV0FSTklOR19DT01NQU5EKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFdBUk5JTkdfTUVTU0FHRSwgd2FybmluZy50cmltKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlIYXJtZnVsQXBwV2FybmluZ1Vuc2V0KCkgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyB3YXJuaW5nID0gZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZChHRVRfSEFSTUZVTF9BUFBfV0FSTklOR19DT01NQU5EKTsKKyAgICAgICAgaWYgKHdhcm5pbmcgIT0gbnVsbCkgeworICAgICAgICAgICAgd2FybmluZyA9IHdhcm5pbmcudHJpbSgpOworICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUod2FybmluZyA9PSBudWxsIHx8IHdhcm5pbmcubGVuZ3RoKCkgPT0gMCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeVNhbXBsZUFwcFVuaW5zdGFsbGVkKCkgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBpbnN0YWxsZWRQYWNrYWdlID0gZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZCgKKyAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KExJU1RfUEFDS0FHRVNfQ09NTUFORCwgZ2V0RGV2aWNlKCkuZ2V0Q3VycmVudFVzZXIoKSkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiSGFybWZ1bCBhcHBsaWNhdGlvbiB3YXMgbm90IHVuaW5zdGFsbGVkIiwgaW5zdGFsbGVkUGFja2FnZS5pc0VtcHR5KCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlTYW1wbGVBcHBJbnN0YWxsZWQoKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGluc3RhbGxlZFBhY2thZ2UgPSBnZXREZXZpY2UoKS5leGVjdXRlU2hlbGxDb21tYW5kKAorICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoTElTVF9QQUNLQUdFU19DT01NQU5ELCBnZXREZXZpY2UoKS5nZXRDdXJyZW50VXNlcigpKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZSgiSGFybWZ1bCBhcHBsaWNhdGlvbiB3YXMgdW5pbnN0YWxsZWQiLCBpbnN0YWxsZWRQYWNrYWdlLmlzRW1wdHkoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBiYXNpYyBzbW9rZSB0ZXN0IHRvIGVuc3VyZSB0aGF0IHdlJ3JlIGFibGUgdG8gZGV0ZWN0IHRoZSBsYXVuY2ggb2YgdGhlIGFjdGl2aXR5IHdoZW4gdGhlcmUKKyAgICAgKiBpcyBubyB3YXJuaW5nLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vcm1hbExhdW5jaCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBydW5EZXZpY2VUZXN0KCJ0ZXN0Tm9ybWFsTGF1bmNoIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhhdCB3aGVuIHRoZSB1c2VyIGNsaWNrcyAibGF1bmNoIGFueXdheSIgb24gdGhlIGhhcm1mdWwgYXBwIHdhcm5pbmcgZGlhbG9nLCB0aGUKKyAgICAgKiB3YXJuaW5nIGlzIGNsZWFyZWQgYW5kIHRoZSBhY3Rpdml0eSBpcyBsYXVuY2hlZC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMYXVuY2hBbnl3YXkoKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKKyAgICAgICAgbURldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKFNFVF9IQVJNRlVMX0FQUF9XQVJOSU5HX0NPTU1BTkQpOworICAgICAgICBydW5EZXZpY2VUZXN0KCJ0ZXN0TGF1bmNoQW55d2F5Iik7CisKKyAgICAgICAgdmVyaWZ5SGFybWZ1bEFwcFdhcm5pbmdVbnNldCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoYXQgd2hlbiB0aGUgdXNlciBjbGlja3MgInVuaW5zdGFsbCIgb24gdGhlIGhhcm1mdWwgYXBwIHdhcm5pbmcgZGlhbG9nLCB0aGUKKyAgICAgKiBhcHBsaWNhdGlvbiBpcyB1bmluc3RhbGxlZC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVbmluc3RhbGwoKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKKyAgICAgICAgbURldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKFNFVF9IQVJNRlVMX0FQUF9XQVJOSU5HX0NPTU1BTkQpOworICAgICAgICBydW5EZXZpY2VUZXN0KCJ0ZXN0VW5pbnN0YWxsIik7CisgICAgICAgIHZlcmlmeVNhbXBsZUFwcFVuaW5zdGFsbGVkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhhdCBubyBhY3Rpb24gaXMgdGFrZW4gd2hlbiB0aGUgdXNlciBkaXNtaXNzZXMgdGhlIGhhcm1mdWwgYXBwIHdhcm5pbmcKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REaXNtaXNzRGlhbG9nKCkgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7CisgICAgICAgIG1EZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZChTRVRfSEFSTUZVTF9BUFBfV0FSTklOR19DT01NQU5EKTsKKyAgICAgICAgcnVuRGV2aWNlVGVzdCgidGVzdERpc21pc3NEaWFsb2ciKTsKKyAgICAgICAgdmVyaWZ5SGFybWZ1bEFwcFdhcm5pbmdTZXQoKTsKKyAgICAgICAgdmVyaWZ5U2FtcGxlQXBwSW5zdGFsbGVkKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFzRmVhdHVyZShTdHJpbmcgZmVhdHVyZU5hbWUpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZCgicG0gbGlzdCBmZWF0dXJlcyIpLmNvbnRhaW5zKGZlYXR1cmVOYW1lKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2hhcm1mdWxhcHB3YXJuaW5nL3Rlc3RhcHAvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvaGFybWZ1bGFwcHdhcm5pbmcvdGVzdGFwcC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ODU0ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2hhcm1mdWxhcHB3YXJuaW5nL3Rlc3RhcHAvQW5kcm9pZC5tawpAQCAtMCwwICsxLDQyIEBACisjIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKKyMgRG9uJ3QgaW5jbHVkZSB0aGlzIHBhY2thZ2UgaW4gYW55IHRhcmdldAorTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKKyMgV2hlbiBidWlsdCwgZXhwbGljaXRseSBwdXQgaXQgaW4gdGhlIGRhdGEgcGFydGl0aW9uLgorTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKKworTE9DQUxfREVYX1BSRU9QVCA6PSBmYWxzZQorCitMT0NBTF9QUk9HVUFSRF9FTkFCTEVEIDo9IGRpc2FibGVkCisKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCisgICAgYW5kcm9pZHgudGVzdC5ydWxlcyBcCisgICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgXAorICAgIHViLXVpYXV0b21hdG9yCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKKworIyB0YWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0hhcm1mdWxBcHBXYXJuaW5nVGVzdEFwcAorCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CisKK2luY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9oYXJtZnVsYXBwd2FybmluZy90ZXN0YXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2hhcm1mdWxhcHB3YXJuaW5nL3Rlc3RhcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjg2ZGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9oYXJtZnVsYXBwd2FybmluZy90ZXN0YXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImFuZHJvaWQuaGFybWZ1bGFwcHdhcm5pbmcudGVzdGFwcCI+CisKKyAgICA8YXBwbGljYXRpb24+CisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgorICAgIDwvYXBwbGljYXRpb24+CisKKyAgICA8aW5zdHJ1bWVudGF0aW9uCisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuaGFybWZ1bGFwcHdhcm5pbmcudGVzdGFwcCIgLz4KKworPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvaGFybWZ1bGFwcHdhcm5pbmcvdGVzdGFwcC9zcmMvYW5kcm9pZC9oYXJtZnVsYXBwd2FybmluZy90ZXN0YXBwL0hhcm1mdWxBcHBXYXJuaW5nRGV2aWNlVGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9oYXJtZnVsYXBwd2FybmluZy90ZXN0YXBwL3NyYy9hbmRyb2lkL2hhcm1mdWxhcHB3YXJuaW5nL3Rlc3RhcHAvSGFybWZ1bEFwcFdhcm5pbmdEZXZpY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhhMzE3OQotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvaGFybWZ1bGFwcHdhcm5pbmcvdGVzdGFwcC9zcmMvYW5kcm9pZC9oYXJtZnVsYXBwd2FybmluZy90ZXN0YXBwL0hhcm1mdWxBcHBXYXJuaW5nRGV2aWNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmhhcm1mdWxhcHB3YXJuaW5nLnRlc3RhcHA7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb247CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC51aWF1dG9tYXRvci5CeTsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC51aWF1dG9tYXRvci5VaURldmljZTsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC51aWF1dG9tYXRvci5VaU9iamVjdDI7CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QudWlhdXRvbWF0b3IuVW50aWw7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkJsb2NraW5nQnJvYWRjYXN0UmVjZWl2ZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCisvKioKKyAqIFRoaXMgaXMgdGhlIGRldmljZS1zaWRlIHBhcnQgb2YgdGhlIHRlc3RzIGZvciB0aGUgaGFybWZ1bCBhcHAgbGF1bmNoIHdhcm5pbmdzLgorICoKKyAqIDxwPlRoZXNlIHRlc3RzIGFyZSB0cmlnZ2VyZWQgYnkgdGhlaXIgY291bnRlcnBhcnRzIGluIHRoZSB7QGxpbmsgSGFybWZ1bEFwcFdhcm5pbmdUZXN0fQorICogaG9zdC1zaWRlIGN0cyB0ZXN0LgorICovCitAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIEhhcm1mdWxBcHBXYXJuaW5nRGV2aWNlVGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFRJTUVPVVRfTUlMTElTID0gVGltZVVuaXQuU0VDT05EUy50b01pbGxpcygxKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fQUNUSVZJVFlfU1RBUlRFRCA9CisgICAgICAgICAgICAiYW5kcm9pZC5oYXJtZnVsYXBwd2FybmluZy5zYW1wbGVhcHAuQUNUSVZJVFlfU1RBUlRFRCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9BUFBfUEFDS0FHRV9OQU1FID0gImFuZHJvaWQuaGFybWZ1bGFwcHdhcm5pbmcuc2FtcGxlYXBwIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9BUFBfQUNUSVZJVFlfQ0xBU1NfTkFNRSA9CisgICAgICAgICAgICAiYW5kcm9pZC5oYXJtZnVsYXBwd2FybmluZy5zYW1wbGVhcHAuU2FtcGxlRGV2aWNlQWN0aXZpdHkiOworCisgICAgcHJpdmF0ZSBCbG9ja2luZ0Jyb2FkY2FzdFJlY2VpdmVyIG1TYW1wbGVBY3Rpdml0eVN0YXJ0ZWRSZWNlaXZlcjsKKworICAgIHByb3RlY3RlZCBzdGF0aWMgSW5zdHJ1bWVudGF0aW9uIGdldEluc3RydW1lbnRhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpOworICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgVWlEZXZpY2UgZ2V0VWlEZXZpY2UoKSB7CisgICAgICAgIHJldHVybiBVaURldmljZS5nZXRJbnN0YW5jZShnZXRJbnN0cnVtZW50YXRpb24oKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBsYXVuY2hBY3Rpdml0eShTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBhY3Rpdml0eUNsYXNzTmFtZSkgeworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChJbnRlbnQuQUNUSU9OX01BSU4pOworICAgICAgICBpbnRlbnQuc2V0Q2xhc3NOYW1lKHBhY2thZ2VOYW1lLCBhY3Rpdml0eUNsYXNzTmFtZSk7CisgICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7CisgICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpLmdldFRhcmdldENvbnRleHQoKS5zdGFydEFjdGl2aXR5KGludGVudCwgbnVsbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeVdhcm5pbmdTaG93bigpIHsKKyAgICAgICAgZ2V0VWlEZXZpY2UoKS53YWl0KFVudGlsLmZpbmRPYmplY3QoQnkucmVzKCJhbmRyb2lkOmlkL21lc3NhZ2UiKSksIFRJTUVPVVRfTUlMTElTKTsKKyAgICAgICAgVWlPYmplY3QyIG9iaiA9IGdldFVpRGV2aWNlKCkuZmluZE9iamVjdChCeS5yZXMoImFuZHJvaWQ6aWQvbWVzc2FnZSIpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhvYmouZ2V0VGV4dCgpLCAiVGhpcyBpcyBhIHdhcm5pbmcgbWVzc2FnZS4iKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwob2JqKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5U2FtcGxlQWN0aXZpdHlMYXVuY2hlZCgpIHsKKyAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoIlNhbXBsZSBhY3Rpdml0eSBub3QgbGF1bmNoZWQuIiwKKyAgICAgICAgICAgICAgICBtU2FtcGxlQWN0aXZpdHlTdGFydGVkUmVjZWl2ZXIuYXdhaXRGb3JCcm9hZGNhc3QoVElNRU9VVF9NSUxMSVMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5U2FtcGxlQWN0aXZpdHlOb3RMYXVuY2hlZCgpIHsKKyAgICAgICAgQXNzZXJ0LmFzc2VydE51bGwoIlNhbXBsZSBhY3Rpdml0eSB3YXMgdW5leHBlY3RlZGx5IGxhdW5jaGVkLiIsCisgICAgICAgICAgICAgICAgbVNhbXBsZUFjdGl2aXR5U3RhcnRlZFJlY2VpdmVyLmF3YWl0Rm9yQnJvYWRjYXN0KFRJTUVPVVRfTUlMTElTKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNsaWNrTGF1bmNoQW55d2F5KCkgeworICAgICAgICBVaU9iamVjdDIgb2JqID0gZ2V0VWlEZXZpY2UoKS5maW5kT2JqZWN0KEJ5LnJlcygiYW5kcm9pZDppZC9idXR0b24yIikpOworICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChvYmopOworICAgICAgICBvYmouY2xpY2soKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2xpY2tVbmluc3RhbGwoKSB7CisgICAgICAgIFVpT2JqZWN0MiBvYmogPSBnZXRVaURldmljZSgpLmZpbmRPYmplY3QoQnkucmVzKCJhbmRyb2lkOmlkL2J1dHRvbjEiKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKG9iaik7CisgICAgICAgIG9iai5jbGljaygpOworICAgIH0KKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgbVNhbXBsZUFjdGl2aXR5U3RhcnRlZFJlY2VpdmVyID0gbmV3IEJsb2NraW5nQnJvYWRjYXN0UmVjZWl2ZXIoCisgICAgICAgICAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpLCBBQ1RJT05fQUNUSVZJVFlfU1RBUlRFRCk7CisgICAgICAgIG1TYW1wbGVBY3Rpdml0eVN0YXJ0ZWRSZWNlaXZlci5yZWdpc3RlcigpOworICAgIH0KKworICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeworICAgICAgICBtU2FtcGxlQWN0aXZpdHlTdGFydGVkUmVjZWl2ZXIudW5yZWdpc3RlclF1aWV0bHkoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb3JtYWxMYXVuY2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbGF1bmNoQWN0aXZpdHkoVEVTVF9BUFBfUEFDS0FHRV9OQU1FLCBURVNUX0FQUF9BQ1RJVklUWV9DTEFTU19OQU1FKTsKKyAgICAgICAgdmVyaWZ5U2FtcGxlQWN0aXZpdHlMYXVuY2hlZCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExhdW5jaEFueXdheSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBsYXVuY2hBY3Rpdml0eShURVNUX0FQUF9QQUNLQUdFX05BTUUsIFRFU1RfQVBQX0FDVElWSVRZX0NMQVNTX05BTUUpOworICAgICAgICB2ZXJpZnlXYXJuaW5nU2hvd24oKTsKKyAgICAgICAgY2xpY2tMYXVuY2hBbnl3YXkoKTsKKyAgICAgICAgdmVyaWZ5U2FtcGxlQWN0aXZpdHlMYXVuY2hlZCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVuaW5zdGFsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBsYXVuY2hBY3Rpdml0eShURVNUX0FQUF9QQUNLQUdFX05BTUUsIFRFU1RfQVBQX0FDVElWSVRZX0NMQVNTX05BTUUpOworICAgICAgICB2ZXJpZnlXYXJuaW5nU2hvd24oKTsKKyAgICAgICAgY2xpY2tVbmluc3RhbGwoKTsKKyAgICAgICAgdmVyaWZ5U2FtcGxlQWN0aXZpdHlOb3RMYXVuY2hlZCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERpc21pc3NEaWFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbGF1bmNoQWN0aXZpdHkoVEVTVF9BUFBfUEFDS0FHRV9OQU1FLCBURVNUX0FQUF9BQ1RJVklUWV9DTEFTU19OQU1FKTsKKyAgICAgICAgdmVyaWZ5V2FybmluZ1Nob3duKCk7CisgICAgICAgIGdldFVpRGV2aWNlKCkucHJlc3NIb21lKCk7CisgICAgICAgIHZlcmlmeVNhbXBsZUFjdGl2aXR5Tm90TGF1bmNoZWQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2luY2lkZW50L0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2luY2lkZW50L0FuZHJvaWQubWsKaW5kZXggYjg5YmFmZS4uODkwMGI3NiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvQW5kcm9pZC5tawpAQCAtMjYsNyArMjYsNyBAQAogCiBMT0NBTF9QUk9UT0NfT1BUSU1JWkVfVFlQRSA6PSBmdWxsCiBMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gcGxhdGZvcm1wcm90b3MKLUxPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGN0cy10cmFkZWZlZCB0cmFkZWZlZCBjb21wYXRpYmlsaXR5LWhvc3QtdXRpbCBob3N0LWxpYnByb3RvYnVmLWphdmEtZnVsbAorTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gY3RzLXRyYWRlZmVkIHRyYWRlZmVkIGNvbXBhdGliaWxpdHktaG9zdC11dGlsCiAKIGluY2x1ZGUgJChCVUlMRF9IT1NUX0pBVkFfTElCUkFSWSkKIApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9BbmRyb2lkVGVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2luY2lkZW50L0FuZHJvaWRUZXN0LnhtbAppbmRleCBmMjYwOTJlLi4xOGE3M2ZhIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2luY2lkZW50L0FuZHJvaWRUZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2luY2lkZW50L0FuZHJvaWRUZXN0LnhtbApAQCAtMTQsNyArMTQsMTEgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBJbmNpZGVudCBob3N0IHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJtZXRyaWNzIiAvPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuU3dpdGNoVXNlclRhcmdldFByZXBhcmVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ1c2VyLXR5cGUiIHZhbHVlPSJzeXN0ZW0iIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CiAgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRlc3R0eXBlLkphckhvc3RUZXN0IiA+CiAgICAgICAgIDxvcHRpb24gbmFtZT0iamFyIiB2YWx1ZT0iQ3RzSW5jaWRlbnRIb3N0VGVzdENhc2VzLmphciIgLz4KICAgICA8L3Rlc3Q+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2luY2lkZW50L2FwcHMvYmF0dGVyeXN0YXRzYXBwL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2luY2lkZW50L2FwcHMvYmF0dGVyeXN0YXRzYXBwL0FuZHJvaWQubWsKaW5kZXggNDJjODdmNC4uODIyYmI2NSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9hcHBzL2JhdHRlcnlzdGF0c2FwcC9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvYXBwcy9iYXR0ZXJ5c3RhdHNhcHAvQW5kcm9pZC5tawpAQCAtMjQsMTIgKzI0LDEyIEBACiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIAotTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lciBjdHMtanVuaXQgb3JnLmFwYWNoZS5odHRwLmxlZ2FjeQorTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lci5zdHVicyBjdHMtanVuaXQgb3JnLmFwYWNoZS5odHRwLmxlZ2FjeQogCiBMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAotICAgIGN0c3Rlc3RydW5uZXIgXAotICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwgXAotICAgIGFuZHJvaWQtc3VwcG9ydC12NAorICAgIGN0c3Rlc3RydW5uZXItYXh0IFwKKyAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBcCisgICAgYW5kcm9pZHgubGVnYWN5X2xlZ2FjeS1zdXBwb3J0LXY0CiAKIExPQ0FMX1NES19WRVJTSU9OIDo9IHRlc3RfY3VycmVudAogCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2luY2lkZW50L2FwcHMvYmF0dGVyeXN0YXRzYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2luY2lkZW50L2FwcHMvYmF0dGVyeXN0YXRzYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggZTk0ODJiZi4uODJiMjMxMSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9hcHBzL2JhdHRlcnlzdGF0c2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvYXBwcy9iYXR0ZXJ5c3RhdHNhcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjEsNiArMjEsNyBAQAogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQkxVRVRPT1RIIi8+CiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5CTFVFVE9PVEhfQURNSU4iLz4KICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkNIQU5HRV9XSUZJX1NUQVRFIi8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5GT1JFR1JPVU5EX1NFUlZJQ0UiLz4KICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLklOVEVSTkVUIiAvPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uV0FLRV9MT0NLIiAvPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVBRF9TWU5DX1NUQVRTIiAvPgpAQCAtNjUsNiArNjYsNiBAQAogCiAgICAgPC9hcHBsaWNhdGlvbj4KIAotICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5hbmRyb2lkLnNlcnZlci5jdHMuZGV2aWNlLmJhdHRlcnlzdGF0cyIgLz4KIDwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2luY2lkZW50L2FwcHMvYmF0dGVyeXN0YXRzYXBwL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY3RzL2RldmljZS9iYXR0ZXJ5c3RhdHMvQmF0dGVyeVN0YXRzQWxhcm1UZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2luY2lkZW50L2FwcHMvYmF0dGVyeXN0YXRzYXBwL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY3RzL2RldmljZS9iYXR0ZXJ5c3RhdHMvQmF0dGVyeVN0YXRzQWxhcm1UZXN0LmphdmEKaW5kZXggYzQ5YTgyNC4uOWI2YzIzZiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9hcHBzL2JhdHRlcnlzdGF0c2FwcC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9kZXZpY2UvYmF0dGVyeXN0YXRzL0JhdHRlcnlTdGF0c0FsYXJtVGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvYXBwcy9iYXR0ZXJ5c3RhdHNhcHAvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvZGV2aWNlL2JhdHRlcnlzdGF0cy9CYXR0ZXJ5U3RhdHNBbGFybVRlc3QuamF2YQpAQCAtMjQsMTAgKzI0LDExIEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9hcHBzL2JhdHRlcnlzdGF0c2FwcC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9kZXZpY2UvYmF0dGVyeXN0YXRzL0JhdHRlcnlTdGF0c0JnVnNGZ0FjdGlvbnMuamF2YSBiL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvYXBwcy9iYXR0ZXJ5c3RhdHNhcHAvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvZGV2aWNlL2JhdHRlcnlzdGF0cy9CYXR0ZXJ5U3RhdHNCZ1ZzRmdBY3Rpb25zLmphdmEKaW5kZXggNDU3MGMzMC4uNmI4ZmFhOSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9hcHBzL2JhdHRlcnlzdGF0c2FwcC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9kZXZpY2UvYmF0dGVyeXN0YXRzL0JhdHRlcnlTdGF0c0JnVnNGZ0FjdGlvbnMuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2luY2lkZW50L2FwcHMvYmF0dGVyeXN0YXRzYXBwL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY3RzL2RldmljZS9iYXR0ZXJ5c3RhdHMvQmF0dGVyeVN0YXRzQmdWc0ZnQWN0aW9ucy5qYXZhCkBAIC0zNyw3ICszNyw2IEBACiBpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uTGlzdGVuZXI7CiBpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbk1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkFzeW5jVGFzazsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CkBAIC02Nyw3ICs2Niw2IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0dQUyA9ICJhY3Rpb24uZ3BzIjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fSk9CX1NDSEVEVUxFID0gImFjdGlvbi5qb2JzIjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fU1lOQyA9ICJhY3Rpb24uc3luYyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1dJRklfU0NBTiA9ICJhY3Rpb24ud2lmaV9zY2FuIjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fU0xFRVBfV0hJTEVfQkFDS0dST1VORCA9ICJhY3Rpb24uc2xlZXBfYmFja2dyb3VuZCI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1NMRUVQX1dISUxFX1RPUCA9ICJhY3Rpb24uc2xlZXBfdG9wIjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fU0hPV19BUFBMSUNBVElPTl9PVkVSTEFZID0gImFjdGlvbi5zaG93X2FwcGxpY2F0aW9uX292ZXJsYXkiOwpAQCAtMTAwLDkgKzk4LDYgQEAKICAgICAgICAgICAgIGNhc2UgQUNUSU9OX1NZTkM6CiAgICAgICAgICAgICAgICAgZG9TeW5jKGN0eCwgcmVxdWVzdENvZGUpOwogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBBQ1RJT05fV0lGSV9TQ0FOOgotICAgICAgICAgICAgICAgIGRvV2lmaVNjYW4oY3R4LCByZXF1ZXN0Q29kZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIEFDVElPTl9TTEVFUF9XSElMRV9CQUNLR1JPVU5EOgogICAgICAgICAgICAgICAgIHNsZWVwKERPX05PVEhJTkdfVElNRU9VVCk7CiAgICAgICAgICAgICAgICAgdGVsbEhvc3RBY3Rpb25GaW5pc2hlZChBQ1RJT05fU0xFRVBfV0hJTEVfQkFDS0dST1VORCwgcmVxdWVzdENvZGUpOwpAQCAtMzMzLDI0ICszMjgsNiBAQAogICAgICAgICB9LmV4ZWN1dGUoKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGRvV2lmaVNjYW4oQ29udGV4dCBjdHgsIFN0cmluZyByZXF1ZXN0Q29kZSkgewotICAgICAgICAvLyBTb21ldGltZXMgYSBzY2FuIHdhcyBhbHJlYWR5IHJ1bm5pbmcgKGZyb20gYSBkaWZmZXJlbnQgdWlkKSwgc28gdGhlIGZpcnN0IHNjYW4gZG9lc24ndAotICAgICAgICAvLyBzdGFydCB3aGVuIHJlcXVlc3RlZC4gVGhlcmVmb3JlLCBhZGRpdGlvbmFsbHkgd2FpdCBmb3Igd2hhdGV2ZXIgc2NhbiBpcyBjdXJyZW50bHkgcnVubmluZwotICAgICAgICAvLyB0byBmaW5pc2gsIHRoZW4gcmVxdWVzdCBhIHNjYW4gYWdhaW4gLSBhdCBsZWFzdCBvbmUgb2YgdGhlc2UgdHdvIHNjYW5zIHNob3VsZCBiZQotICAgICAgICAvLyBhdHRyaWJ1dGVkIHRvIHRoaXMgYXBwLgotICAgICAgICBkb1dpZmlTY2FuT25jZShjdHgpOwotICAgICAgICBkb1dpZmlTY2FuT25jZShjdHgpOwotICAgICAgICB0ZWxsSG9zdEFjdGlvbkZpbmlzaGVkKEFDVElPTl9XSUZJX1NDQU4sIHJlcXVlc3RDb2RlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGRvV2lmaVNjYW5PbmNlKENvbnRleHQgY3R4KSB7Ci0gICAgICAgIEludGVudEZpbHRlciBpbnRlbnRGaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKFdpZmlNYW5hZ2VyLlNDQU5fUkVTVUxUU19BVkFJTEFCTEVfQUNUSU9OKTsKLSAgICAgICAgQ291bnREb3duTGF0Y2ggb25SZWNlaXZlTGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7Ci0gICAgICAgIEJyb2FkY2FzdFJlY2VpdmVyIHJlY2VpdmVyID0gcmVnaXN0ZXJSZWNlaXZlcihjdHgsIG9uUmVjZWl2ZUxhdGNoLCBpbnRlbnRGaWx0ZXIpOwotICAgICAgICBjdHguZ2V0U3lzdGVtU2VydmljZShXaWZpTWFuYWdlci5jbGFzcykuc3RhcnRTY2FuKCk7Ci0gICAgICAgIHdhaXRGb3JSZWNlaXZlcihjdHgsIDYwXzAwMCwgb25SZWNlaXZlTGF0Y2gsIHJlY2VpdmVyKTsKLSAgICB9Ci0KICAgICAvKiogUmVnaXN0ZXIgcmVjZWl2ZXIgdG8gZGV0ZXJtaW5lIHdoZW4gZ2l2ZW4gYWN0aW9uIGlzIGNvbXBsZXRlLiAqLwogICAgIHByaXZhdGUgc3RhdGljIEJyb2FkY2FzdFJlY2VpdmVyIHJlZ2lzdGVyUmVjZWl2ZXIoCiAgICAgICAgICAgICBDb250ZXh0IGN0eCwgQ291bnREb3duTGF0Y2ggb25SZWNlaXZlTGF0Y2gsIEludGVudEZpbHRlciBpbnRlbnRGaWx0ZXIpIHsKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvYXBwcy9iYXR0ZXJ5c3RhdHNhcHAvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvZGV2aWNlL2JhdHRlcnlzdGF0cy9CYXR0ZXJ5U3RhdHNEZXZpY2VUZXN0QmFzZS5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9hcHBzL2JhdHRlcnlzdGF0c2FwcC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9kZXZpY2UvYmF0dGVyeXN0YXRzL0JhdHRlcnlTdGF0c0RldmljZVRlc3RCYXNlLmphdmEKaW5kZXggZTUzYzIxMy4uMzViNjdjOSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9hcHBzL2JhdHRlcnlzdGF0c2FwcC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9kZXZpY2UvYmF0dGVyeXN0YXRzL0JhdHRlcnlTdGF0c0RldmljZVRlc3RCYXNlLmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9hcHBzL2JhdHRlcnlzdGF0c2FwcC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9kZXZpY2UvYmF0dGVyeXN0YXRzL0JhdHRlcnlTdGF0c0RldmljZVRlc3RCYXNlLmphdmEKQEAgLTE1LDIxICsxNSwxNSBAQAogICovCiBwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlci5jdHMuZGV2aWNlLmJhdHRlcnlzdGF0czsKIAotaW1wb3J0IHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0LmFzc2VydEVxdWFsczsKLQogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQub3MuUG93ZXJNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIAotaW1wb3J0IGphdmEubmV0Lkh0dHBVUkxDb25uZWN0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQogLyoqCiAgKiBVc2VkIGJ5IEJhdHRlcnlTdGF0c1ZhbGlkYXRpb25UZXN0LgogICovCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2luY2lkZW50L2FwcHMvYmF0dGVyeXN0YXRzYXBwL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY3RzL2RldmljZS9iYXR0ZXJ5c3RhdHMvQmF0dGVyeVN0YXRzSm9iRHVyYXRpb25UZXN0cy5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9hcHBzL2JhdHRlcnlzdGF0c2FwcC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9kZXZpY2UvYmF0dGVyeXN0YXRzL0JhdHRlcnlTdGF0c0pvYkR1cmF0aW9uVGVzdHMuamF2YQppbmRleCA1MjdmOGJjLi5lNDQzNGUxIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2luY2lkZW50L2FwcHMvYmF0dGVyeXN0YXRzYXBwL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY3RzL2RldmljZS9iYXR0ZXJ5c3RhdHMvQmF0dGVyeVN0YXRzSm9iRHVyYXRpb25UZXN0cy5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvYXBwcy9iYXR0ZXJ5c3RhdHNhcHAvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvZGV2aWNlL2JhdHRlcnlzdGF0cy9CYXR0ZXJ5U3RhdHNKb2JEdXJhdGlvblRlc3RzLmphdmEKQEAgLTIxLDkgKzIxLDEwIEBACiBpbXBvcnQgYW5kcm9pZC5hcHAuam9iLkpvYkluZm87CiBpbXBvcnQgYW5kcm9pZC5hcHAuam9iLkpvYlNjaGVkdWxlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9hcHBzL2JhdHRlcnlzdGF0c2FwcC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9kZXZpY2UvYmF0dGVyeXN0YXRzL0JhdHRlcnlTdGF0c1Byb2Nlc3NTdGF0ZVRlc3RzLmphdmEgYi9ob3N0c2lkZXRlc3RzL2luY2lkZW50L2FwcHMvYmF0dGVyeXN0YXRzYXBwL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY3RzL2RldmljZS9iYXR0ZXJ5c3RhdHMvQmF0dGVyeVN0YXRzUHJvY2Vzc1N0YXRlVGVzdHMuamF2YQppbmRleCAxZjc1MTZmLi5jNTdmMThlIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2luY2lkZW50L2FwcHMvYmF0dGVyeXN0YXRzYXBwL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY3RzL2RldmljZS9iYXR0ZXJ5c3RhdHMvQmF0dGVyeVN0YXRzUHJvY2Vzc1N0YXRlVGVzdHMuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2luY2lkZW50L2FwcHMvYmF0dGVyeXN0YXRzYXBwL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY3RzL2RldmljZS9iYXR0ZXJ5c3RhdHMvQmF0dGVyeVN0YXRzUHJvY2Vzc1N0YXRlVGVzdHMuamF2YQpAQCAtMTUsMTIgKzE1LDExIEBACiAgKi8KIHBhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyLmN0cy5kZXZpY2UuYmF0dGVyeXN0YXRzOwogCi1pbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uOwotaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbk1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApAQCAtMzcsNyArMzYsNyBAQAogICAgICAgICBpbnRlbnQuc2V0Q2xhc3MobUNvbnRleHQsIFNpbXBsZUZvcmVncm91bmRTZXJ2aWNlLmNsYXNzKTsKICAgICAgICAgTG9nLmkoVEFHLCAiU3RhcnRpbmcgZm9yZWdyb3VuZCBzZXJ2aWNlLiIpOwogICAgICAgICBtQ29udGV4dC5zdGFydEZvcmVncm91bmRTZXJ2aWNlKGludGVudCk7Ci0gICAgICAgIFRocmVhZC5zbGVlcCgzMDAwKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKDIwMDApOwogICAgIH0KIAogICAgIEBUZXN0CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2luY2lkZW50L2FwcHMvYmF0dGVyeXN0YXRzYXBwL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY3RzL2RldmljZS9iYXR0ZXJ5c3RhdHMvQmF0dGVyeVN0YXRzU3luY1Rlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvYXBwcy9iYXR0ZXJ5c3RhdHNhcHAvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvZGV2aWNlL2JhdHRlcnlzdGF0cy9CYXR0ZXJ5U3RhdHNTeW5jVGVzdC5qYXZhCmluZGV4IGRhYTZmNWUuLjkyNzAxMGUgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvYXBwcy9iYXR0ZXJ5c3RhdHNhcHAvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvZGV2aWNlL2JhdHRlcnlzdGF0cy9CYXR0ZXJ5U3RhdHNTeW5jVGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvYXBwcy9iYXR0ZXJ5c3RhdHNhcHAvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvZGV2aWNlL2JhdHRlcnlzdGF0cy9CYXR0ZXJ5U3RhdHNTeW5jVGVzdC5qYXZhCkBAIC0xOCw4ICsxOCw5IEBACiBpbXBvcnQgYW5kcm9pZC5hY2NvdW50cy5BY2NvdW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiAKIGltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvYXBwcy9iYXR0ZXJ5c3RhdHNhcHAvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvZGV2aWNlL2JhdHRlcnlzdGF0cy9CYXR0ZXJ5U3RhdHNXYWtlTG9ja1Rlc3RzLmphdmEgYi9ob3N0c2lkZXRlc3RzL2luY2lkZW50L2FwcHMvYmF0dGVyeXN0YXRzYXBwL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY3RzL2RldmljZS9iYXR0ZXJ5c3RhdHMvQmF0dGVyeVN0YXRzV2FrZUxvY2tUZXN0cy5qYXZhCmluZGV4IDk5NTZlNzkuLjQzODljNzYgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvYXBwcy9iYXR0ZXJ5c3RhdHNhcHAvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvZGV2aWNlL2JhdHRlcnlzdGF0cy9CYXR0ZXJ5U3RhdHNXYWtlTG9ja1Rlc3RzLmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9hcHBzL2JhdHRlcnlzdGF0c2FwcC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9kZXZpY2UvYmF0dGVyeXN0YXRzL0JhdHRlcnlTdGF0c1dha2VMb2NrVGVzdHMuamF2YQpAQCAtMTUsMTEgKzE1LDEwIEBACiAgKi8KIHBhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyLmN0cy5kZXZpY2UuYmF0dGVyeXN0YXRzOwogCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5Qb3dlck1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiAKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvYXBwcy9ib3VuZHdpZGdldGFwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9hcHBzL2JvdW5kd2lkZ2V0YXBwL0FuZHJvaWQubWsKaW5kZXggMTUyNDE0Zi4uMGE2NzFhMSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9hcHBzL2JvdW5kd2lkZ2V0YXBwL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9hcHBzL2JvdW5kd2lkZ2V0YXBwL0FuZHJvaWQubWsKQEAgLTI0LDEyICsyNCwxMiBAQAogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKLUxPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIgY3RzLWp1bml0CitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzIGN0cy1qdW5pdCBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicwogCiBMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAotICAgIGN0c3Rlc3RydW5uZXIgXAotICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwgXAotICAgIGFuZHJvaWQtc3VwcG9ydC12NAorICAgIGN0c3Rlc3RydW5uZXItYXh0IFwKKyAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBcCisgICAgYW5kcm9pZHgubGVnYWN5X2xlZ2FjeS1zdXBwb3J0LXY0CiAKIExPQ0FMX1NES19WRVJTSU9OIDo9IHRlc3RfY3VycmVudAogCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2luY2lkZW50L2FwcHMvYm91bmR3aWRnZXRhcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvYXBwcy9ib3VuZHdpZGdldGFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDMxMmQwNWQuLjk4MjVkNWMgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvYXBwcy9ib3VuZHdpZGdldGFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvYXBwcy9ib3VuZHdpZGdldGFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC00MCw3ICs0MCw3IEBACiAKICAgPC9hcHBsaWNhdGlvbj4KIAotICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5hcHB3aWRnZXQuY3RzIgogICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIFRlc3RzIGZvciB0aGUgZHVtcHN5cyBwcm90b2J1ZiBwcm90b2NvbCI+CiAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0ibGlzdGVuZXIiCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2luY2lkZW50L2FwcHMvZXJyb3JzYXBwL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2luY2lkZW50L2FwcHMvZXJyb3JzYXBwL0FuZHJvaWQubWsKaW5kZXggMTkxZTliNy4uZTEwMDY4NCAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9hcHBzL2Vycm9yc2FwcC9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvYXBwcy9lcnJvcnNhcHAvQW5kcm9pZC5tawpAQCAtMjYsMTUgKzI2LDE1IEBACiAKIExPQ0FMX01VTFRJTElCIDo9IGJvdGgKIAotTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lciBjdHMtanVuaXQKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIuc3R1YnMgY3RzLWp1bml0CiAKICMgSW5jbHVkZXMgdGhlIGpuaSBjb2RlIGFzIGEgc2hhcmVkIGxpYnJhcnkKLUxPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmNyYXNoLWpuaSBsaWJuYXRpdmVoZWxwZXIKK0xPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmNyYXNoLWpuaQogCiBMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAotICAgIGN0c3Rlc3RydW5uZXIgXAotICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwgXAotICAgIGFuZHJvaWQtc3VwcG9ydC12NAorICAgIGN0c3Rlc3RydW5uZXItYXh0IFwKKyAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBcCisgICAgYW5kcm9pZHgubGVnYWN5X2xlZ2FjeS1zdXBwb3J0LXY0CiAKIExPQ0FMX1NES19WRVJTSU9OIDo9IHRlc3RfY3VycmVudAogCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2luY2lkZW50L2FwcHMvZXJyb3JzYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2luY2lkZW50L2FwcHMvZXJyb3JzYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggNDFmZGU1Yy4uYjBjNTE2ZSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9hcHBzL2Vycm9yc2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvYXBwcy9lcnJvcnNhcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjksNyArMjksNyBAQAogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuTmF0aXZlQWN0aXZpdHkiIGFuZHJvaWQ6bGFiZWw9Ik5hdGl2ZSBDcmFzaCBUZXN0IEFjdGl2aXR5IiBhbmRyb2lkOnByb2Nlc3M9IjpUZXN0UHJvY2VzcyIgLz4KICAgICA8L2FwcGxpY2F0aW9uPgogCi0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmFuZHJvaWQuc2VydmVyLmN0cy5lcnJvcnMiIC8+CiA8L21hbmlmZXN0PgogCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2luY2lkZW50L2FwcHMvZXJyb3JzYXBwL2puaS9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9hcHBzL2Vycm9yc2FwcC9qbmkvQW5kcm9pZC5tawppbmRleCA1MTAxYmYzLi43NWQxZDA5IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2luY2lkZW50L2FwcHMvZXJyb3JzYXBwL2puaS9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvYXBwcy9lcnJvcnNhcHAvam5pL0FuZHJvaWQubWsKQEAgLTI1LDYgKzI1LDggQEAKIAogTE9DQUxfQ19JTkNMVURFUyA6PSAkKEpOSV9IX0lOQ0xVREUpCiAKK0xPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yIC1Xbm8tdW51c2VkLXBhcmFtZXRlcgorCiBMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvYXBwcy9lcnJvcnNhcHAvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvZXJyb3JzL0Vycm9yc1Rlc3RzLmphdmEgYi9ob3N0c2lkZXRlc3RzL2luY2lkZW50L2FwcHMvZXJyb3JzYXBwL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY3RzL2Vycm9ycy9FcnJvcnNUZXN0cy5qYXZhCmluZGV4IDFmZTcwNGEuLjAwMjk2YjMgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvYXBwcy9lcnJvcnNhcHAvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvZXJyb3JzL0Vycm9yc1Rlc3RzLmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9hcHBzL2Vycm9yc2FwcC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9lcnJvcnMvRXJyb3JzVGVzdHMuamF2YQpAQCAtMjIsMTcgKzIyLDE4IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwogaW1wb3J0IGFuZHJvaWQub3MuRHJvcEJveE1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKIC8qKgogICogVXNlZCBieSBFcnJvclRlc3QuIFNwYXducyBtaXNiZWhhdmluZyBhY3Rpdml0aWVzIHNvIHJlcG9ydHMgd2lsbCBhcHBlYXIgaW4gRHJvcGJveC4KICAqLwpAQCAtNjgsNiArNjksNyBAQAogICAgICAgICAgICAgICAgICJqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbjogVGhpcyBpcyBhIHRlc3QgZXhjZXB0aW9uIik7CiAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KCk7CiAgICAgICAgIGludGVudC5zZXRDbGFzcyhtQ29udGV4dCwgRXhjZXB0aW9uQWN0aXZpdHkuY2xhc3MpOworICAgICAgICBpbnRlbnQuc2V0RmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOwogICAgICAgICBtQ29udGV4dC5zdGFydEFjdGl2aXR5KGludGVudCk7CiAKICAgICAgICAgYXNzZXJ0VHJ1ZShtUmVzdWx0c1JlY2VpdmVkU2lnbmFsLmF3YWl0KFRJTUVPVVRfU0VDUywgVGltZVVuaXQuU0VDT05EUykpOwpAQCAtODIsNiArODQsNyBAQAogICAgICAgICAgICAgICAgICJTdWJqZWN0OiBCcm9hZGNhc3Qgb2YgSW50ZW50IHsgYWN0PWFuZHJvaWQuaW50ZW50LmFjdGlvbi5TQ1JFRU5fT04iKTsKICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoKTsKICAgICAgICAgaW50ZW50LnNldENsYXNzKG1Db250ZXh0LCBBTlJBY3Rpdml0eS5jbGFzcyk7CisgICAgICAgIGludGVudC5zZXRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7CiAgICAgICAgIG1Db250ZXh0LnN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKIAogICAgICAgICBhc3NlcnRUcnVlKG1SZXN1bHRzUmVjZWl2ZWRTaWduYWwuYXdhaXQoVElNRU9VVF9TRUNTLCBUaW1lVW5pdC5TRUNPTkRTKSk7CkBAIC05NSw2ICs5OCw3IEBACiAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSArICI6VGVzdFByb2Nlc3MiLCAiYmFja3RyYWNlOiIpOwogICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOwogICAgICAgICBpbnRlbnQuc2V0Q2xhc3MobUNvbnRleHQsIE5hdGl2ZUFjdGl2aXR5LmNsYXNzKTsKKyAgICAgICAgaW50ZW50LnNldEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLKTsKICAgICAgICAgbUNvbnRleHQuc3RhcnRBY3Rpdml0eShpbnRlbnQpOwogCiAgICAgICAgIGFzc2VydFRydWUobVJlc3VsdHNSZWNlaXZlZFNpZ25hbC5hd2FpdChUSU1FT1VUX1NFQ1MsIFRpbWVVbml0LlNFQ09ORFMpKTsKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvYXBwcy9ncmFwaGljc3N0YXRzYXBwL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2luY2lkZW50L2FwcHMvZ3JhcGhpY3NzdGF0c2FwcC9BbmRyb2lkLm1rCmluZGV4IGMyODEyYzAuLjVkY2I1NmQgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvYXBwcy9ncmFwaGljc3N0YXRzYXBwL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9hcHBzL2dyYXBoaWNzc3RhdHNhcHAvQW5kcm9pZC5tawpAQCAtMjQsMTIgKzI0LDEyIEBACiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIAotTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lciBjdHMtanVuaXQKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIuc3R1YnMgY3RzLWp1bml0CiAKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCi0gICAgY3RzdGVzdHJ1bm5lciBcCi0gICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbCBcCi0gICAgYW5kcm9pZC1zdXBwb3J0LXY0CisgICAgY3RzdGVzdHJ1bm5lci1heHQgXAorICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0IFwKKyAgICBhbmRyb2lkeC5sZWdhY3lfbGVnYWN5LXN1cHBvcnQtdjQKIAogTE9DQUxfU0RLX1ZFUlNJT04gOj0gdGVzdF9jdXJyZW50CiAKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvYXBwcy9ncmFwaGljc3N0YXRzYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2luY2lkZW50L2FwcHMvZ3JhcGhpY3NzdGF0c2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGNmZTgwYmUuLjBmOWEzYTAgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvYXBwcy9ncmFwaGljc3N0YXRzYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9hcHBzL2dyYXBoaWNzc3RhdHNhcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjMsNiArMjMsNiBAQAogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuRHJhd0ZyYW1lc0FjdGl2aXR5IiBhbmRyb2lkOmxhYmVsPSJHcmFwaGljc1N0YXRzIFRlc3QgQWN0aXZpdHkiIC8+CiAgICAgPC9hcHBsaWNhdGlvbj4KIAotICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5hbmRyb2lkLnNlcnZlci5jdHMuZGV2aWNlLmdyYXBoaWNzc3RhdHMiIC8+CiA8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9hcHBzL2dyYXBoaWNzc3RhdHNhcHAvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvZGV2aWNlL2dyYXBoaWNzc3RhdHMvU2ltcGxlRHJhd0ZyYW1lVGVzdHMuamF2YSBiL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvYXBwcy9ncmFwaGljc3N0YXRzYXBwL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY3RzL2RldmljZS9ncmFwaGljc3N0YXRzL1NpbXBsZURyYXdGcmFtZVRlc3RzLmphdmEKaW5kZXggZmYzZTllYi4uNTY0MTNmOCAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9hcHBzL2dyYXBoaWNzc3RhdHNhcHAvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvZGV2aWNlL2dyYXBoaWNzc3RhdHMvU2ltcGxlRHJhd0ZyYW1lVGVzdHMuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2luY2lkZW50L2FwcHMvZ3JhcGhpY3NzdGF0c2FwcC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9kZXZpY2UvZ3JhcGhpY3NzdGF0cy9TaW1wbGVEcmF3RnJhbWVUZXN0cy5qYXZhCkBAIC0xNSwxNCArMTUsMTYgQEAKICAqLwogcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXIuY3RzLmRldmljZS5ncmFwaGljc3N0YXRzOwogCi1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5MYXJnZVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLkxhcmdlVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogCiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIAogLyoqCiAgKiBVc2VkIGJ5IEdyYXBoaWNzU3RhdHNUZXN0LgpAQCAtNDAsMTAgKzQyLDExIEBACiAgICAgcHVibGljIHZvaWQgdGVzdERyYXdUZW5GcmFtZXMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRHJhd0ZyYW1lc0FjdGl2aXR5IGFjdGl2aXR5ID0gbUFjdGl2aXR5UnVsZS5nZXRBY3Rpdml0eSgpOwogICAgICAgICBhY3Rpdml0eS53YWl0Rm9yUmVhZHkoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFjdGl2aXR5LmdldFJlbmRlcmVkRnJhbWVzQ291bnQoKSk7CisgICAgICAgIGludCBpbml0aWFsRnJhbWVzID0gYWN0aXZpdHkuZ2V0UmVuZGVyZWRGcmFtZXNDb3VudCgpOworICAgICAgICBhc3NlcnRUcnVlKGluaXRpYWxGcmFtZXMgPCA1KTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGFjdGl2aXR5LmdldERyb3BwZWRSZXBvcnRzQ291bnQoKSk7CiAgICAgICAgIGFjdGl2aXR5LmRyYXdGcmFtZXMoMTApOwotICAgICAgICBhc3NlcnRFcXVhbHMoMTEsIGFjdGl2aXR5LmdldFJlbmRlcmVkRnJhbWVzQ291bnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhpbml0aWFsRnJhbWVzICsgMTAsIGFjdGl2aXR5LmdldFJlbmRlcmVkRnJhbWVzQ291bnQoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygwLCBhY3Rpdml0eS5nZXREcm9wcGVkUmVwb3J0c0NvdW50KCkpOwogICAgIH0KIApAQCAtNTEsNyArNTQsOCBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3REcmF3SmFua3lGcmFtZXMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgRHJhd0ZyYW1lc0FjdGl2aXR5IGFjdGl2aXR5ID0gbUFjdGl2aXR5UnVsZS5nZXRBY3Rpdml0eSgpOwogICAgICAgICBhY3Rpdml0eS53YWl0Rm9yUmVhZHkoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFjdGl2aXR5LmdldFJlbmRlcmVkRnJhbWVzQ291bnQoKSk7CisgICAgICAgIGludCBpbml0aWFsRnJhbWVzID0gYWN0aXZpdHkuZ2V0UmVuZGVyZWRGcmFtZXNDb3VudCgpOworICAgICAgICBhc3NlcnRUcnVlKGluaXRpYWxGcmFtZXMgPCA1KTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGFjdGl2aXR5LmdldERyb3BwZWRSZXBvcnRzQ291bnQoKSk7CiAgICAgICAgIGludFtdIGZyYW1lcyA9IG5ldyBpbnRbNTBdOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKQEAgLTYyLDcgKzY2LDcgQEAKICAgICAgICAgICAgIGZyYW1lc1tpbmR4ICsgM10gPSBEcmF3RnJhbWVzQWN0aXZpdHkuRlJBTUVfSkFOS19NSVNTX1ZTWU5DOwogICAgICAgICB9CiAgICAgICAgIGFjdGl2aXR5LmRyYXdGcmFtZXMoZnJhbWVzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDUxLCBhY3Rpdml0eS5nZXRSZW5kZXJlZEZyYW1lc0NvdW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoaW5pdGlhbEZyYW1lcyArIDUwLCBhY3Rpdml0eS5nZXRSZW5kZXJlZEZyYW1lc0NvdW50KCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMCwgYWN0aXZpdHkuZ2V0RHJvcHBlZFJlcG9ydHNDb3VudCgpKTsKICAgICB9CiAKQEAgLTcwLDcgKzc0LDggQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0RHJhd0RhdmV5RnJhbWVzKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIERyYXdGcmFtZXNBY3Rpdml0eSBhY3Rpdml0eSA9IG1BY3Rpdml0eVJ1bGUuZ2V0QWN0aXZpdHkoKTsKICAgICAgICAgYWN0aXZpdHkud2FpdEZvclJlYWR5KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBhY3Rpdml0eS5nZXRSZW5kZXJlZEZyYW1lc0NvdW50KCkpOworICAgICAgICBpbnQgaW5pdGlhbEZyYW1lcyA9IGFjdGl2aXR5LmdldFJlbmRlcmVkRnJhbWVzQ291bnQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShpbml0aWFsRnJhbWVzIDwgNSk7CiAgICAgICAgIGFzc2VydEVxdWFscygwLCBhY3Rpdml0eS5nZXREcm9wcGVkUmVwb3J0c0NvdW50KCkpOwogICAgICAgICBpbnRbXSBmcmFtZXMgPSBuZXcgaW50WzQwXTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CkBAIC03OSw3ICs4NCw3IEBACiAgICAgICAgICAgICBmcmFtZXNbaW5keCArIDJdID0gRHJhd0ZyYW1lc0FjdGl2aXR5LkZSQU1FX0pBTktfREFWRVlfSlI7CiAgICAgICAgIH0KICAgICAgICAgYWN0aXZpdHkuZHJhd0ZyYW1lcyhmcmFtZXMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNDEsIGFjdGl2aXR5LmdldFJlbmRlcmVkRnJhbWVzQ291bnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhpbml0aWFsRnJhbWVzICsgNDAsIGFjdGl2aXR5LmdldFJlbmRlcmVkRnJhbWVzQ291bnQoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygwLCBhY3Rpdml0eS5nZXREcm9wcGVkUmVwb3J0c0NvdW50KCkpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvYXBwcy9uZXRzdGF0c2FwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9hcHBzL25ldHN0YXRzYXBwL0FuZHJvaWQubWsKaW5kZXggODNhZTgyZi4uOWY0YWYxZCAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9hcHBzL25ldHN0YXRzYXBwL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9hcHBzL25ldHN0YXRzYXBwL0FuZHJvaWQubWsKQEAgLTI0LDEyICsyNCwxMiBAQAogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKLUxPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIgY3RzLWp1bml0CitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzIGN0cy1qdW5pdAogCiBMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAotICAgIGN0c3Rlc3RydW5uZXIgXAotICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwgXAotICAgIGFuZHJvaWQtc3VwcG9ydC12NAorICAgIGN0c3Rlc3RydW5uZXItYXh0IFwKKyAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBcCisgICAgYW5kcm9pZHgubGVnYWN5X2xlZ2FjeS1zdXBwb3J0LXY0CiAKIExPQ0FMX1NES19WRVJTSU9OIDo9IHRlc3RfY3VycmVudAogCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2luY2lkZW50L2FwcHMvbmV0c3RhdHNhcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvYXBwcy9uZXRzdGF0c2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGI5ZDRkMTcuLmRmMDQ1ZmQgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvYXBwcy9uZXRzdGF0c2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvYXBwcy9uZXRzdGF0c2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yMyw2ICsyMyw2IEBACiAgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgogICAgIDwvYXBwbGljYXRpb24+CiAKLSAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5zZXJ2ZXIuY3RzLm5ldHN0YXRzIiAvPgogPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvYXBwcy9uZXRzdGF0c2FwcC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9uZXRzdGF0cy9OZXRzdGF0c0RldmljZVRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvYXBwcy9uZXRzdGF0c2FwcC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9uZXRzdGF0cy9OZXRzdGF0c0RldmljZVRlc3QuamF2YQppbmRleCBkMGFmMDFiLi5lOWVjNzFlIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2luY2lkZW50L2FwcHMvbmV0c3RhdHNhcHAvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvbmV0c3RhdHMvTmV0c3RhdHNEZXZpY2VUZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9hcHBzL25ldHN0YXRzYXBwL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY3RzL25ldHN0YXRzL05ldHN0YXRzRGV2aWNlVGVzdC5qYXZhCkBAIC0xNiwxNSArMTYsMTcgQEAKIHBhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyLmN0cy5uZXRzdGF0czsKIAogaW1wb3J0IGFuZHJvaWQubmV0LlRyYWZmaWNTdGF0czsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIAotaW1wb3J0IGphdmEubmV0Lkh0dHBVUkxDb25uZWN0aW9uOwogaW1wb3J0IGphdmEubmV0LlVSTDsKIAoraW1wb3J0IGphdmF4Lm5ldC5zc2wuSHR0cHNVUkxDb25uZWN0aW9uOworCiAvKioKICAqIFVzZWQgYnkgTmV0c3RhdHNJbmNpZGVudFRlc3QuICBNYWtlcyBzb21lIG5ldHdvcmsgcmVxdWVzdHMgc28gImR1bXBzeXMgbmV0c3RhdHMiIHdpbGwgaGF2ZQogICogc29tZXRoaW5nIHRvIHNob3cuCkBAIC01MSw5ICs1Myw5IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIG1ha2VOZXR3b3JrUmVxdWVzdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBVUkwgdXJsID0gbmV3IFVSTCgiaHR0cDovL3d3dy5hbmRyb2lkLmNvbS8iKTsKLSAgICAgICAgZmluYWwgSHR0cFVSTENvbm5lY3Rpb24gdXJsQ29ubmVjdGlvbiA9IChIdHRwVVJMQ29ubmVjdGlvbikgdXJsLm9wZW5Db25uZWN0aW9uKCk7Ci0gICAgICAgIEh0dHBVUkxDb25uZWN0aW9uLnNldEZvbGxvd1JlZGlyZWN0cyh0cnVlKTsKKyAgICAgICAgZmluYWwgVVJMIHVybCA9IG5ldyBVUkwoImh0dHBzOi8vd3d3LmFuZHJvaWQuY29tLyIpOworICAgICAgICBmaW5hbCBIdHRwc1VSTENvbm5lY3Rpb24gdXJsQ29ubmVjdGlvbiA9IChIdHRwc1VSTENvbm5lY3Rpb24pIHVybC5vcGVuQ29ubmVjdGlvbigpOworICAgICAgICBIdHRwc1VSTENvbm5lY3Rpb24uc2V0Rm9sbG93UmVkaXJlY3RzKHRydWUpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgZmluYWwgaW50IHN0YXR1cyA9IHVybENvbm5lY3Rpb24uZ2V0UmVzcG9uc2VDb2RlKCk7CiAKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvYXBwcy9ub3RpZmljYXRpb25zYXBwL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2luY2lkZW50L2FwcHMvbm90aWZpY2F0aW9uc2FwcC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyODE4NjEKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2luY2lkZW50L2FwcHMvbm90aWZpY2F0aW9uc2FwcC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNDEgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c05vdGlmaWNhdGlvbkluY2lkZW50VGVzdEFwcAorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCisKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIuc3R1YnMgY3RzLWp1bml0CisKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCisgICAgY3RzdGVzdHJ1bm5lci1heHQgXAorICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0IFwKKyAgICBhbmRyb2lkeC5sZWdhY3lfbGVnYWN5LXN1cHBvcnQtdjQKKworTE9DQUxfU0RLX1ZFUlNJT04gOj0gdGVzdF9jdXJyZW50CisKK0xPQ0FMX0pBVkFfUkVTT1VSQ0VfRElSUyA6PSByZXMKKworIyB0YWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKKworaW5jbHVkZSAkKEJVSUxEX0NUU19QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9hcHBzL25vdGlmaWNhdGlvbnNhcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvYXBwcy9ub3RpZmljYXRpb25zYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg3MmI5ZQotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvYXBwcy9ub3RpZmljYXRpb25zYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwyNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5zZXJ2ZXIuY3RzLm5vdGlmaWNhdGlvbnMiPgorICAgIDxhcHBsaWNhdGlvbj4KKyAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiLz4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLk5vdGlmaWNhdGlvbkluY2lkZW50VGVzdEFjdGl2aXR5IiBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIiAvPgorICAgIDwvYXBwbGljYXRpb24+CisKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5zZXJ2ZXIuY3RzLnByb2NzdGF0cyIgLz4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2luY2lkZW50L2FwcHMvbm90aWZpY2F0aW9uc2FwcC9yZXMvZHJhd2FibGUvaWNvbl9ibGFjay5qcGcgYi9ob3N0c2lkZXRlc3RzL2luY2lkZW50L2FwcHMvbm90aWZpY2F0aW9uc2FwcC9yZXMvZHJhd2FibGUvaWNvbl9ibGFjay5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM5MDYyYQotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvYXBwcy9ub3RpZmljYXRpb25zYXBwL3Jlcy9kcmF3YWJsZS9pY29uX2JsYWNrLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2luY2lkZW50L2FwcHMvbm90aWZpY2F0aW9uc2FwcC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9ub3RpZmljYXRpb25zL05vdGlmaWNhdGlvbkluY2lkZW50VGVzdEFjdGl2aXR5LmphdmEgYi9ob3N0c2lkZXRlc3RzL2luY2lkZW50L2FwcHMvbm90aWZpY2F0aW9uc2FwcC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9ub3RpZmljYXRpb25zL05vdGlmaWNhdGlvbkluY2lkZW50VGVzdEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZjNzU5YwotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvYXBwcy9ub3RpZmljYXRpb25zYXBwL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY3RzL25vdGlmaWNhdGlvbnMvTm90aWZpY2F0aW9uSW5jaWRlbnRUZXN0QWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXIuY3RzLm5vdGlmaWNhdGlvbnM7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb247CitpbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uQ2hhbm5lbDsKK2ltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb25NYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK3B1YmxpYyBjbGFzcyBOb3RpZmljYXRpb25JbmNpZGVudFRlc3RBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBmaW5hbCBTdHJpbmcgVEFHID0gIk5vdGlmaWNhdGlvbkluY2lkZW50VGVzdEFjdGl2aXR5IjsKKyAgICBmaW5hbCBTdHJpbmcgTk9USUZJQ0FUSU9OX0NIQU5ORUxfSUQgPSAiTGVnYWN5Tm90aWZpY2F0aW9uTWFuYWdlclRlc3QiOworICAgIGZpbmFsIFN0cmluZyBOT1RJRklDQVRJT05fQ0hBTk5FTF9OQU1FID0gIkxlZ2FjeU5vdGlmaWNhdGlvbk1hbmFnZXJUZXN0IjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBidW5kbGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoYnVuZGxlKTsKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gdGhpczsKKyAgICAgICAgTm90aWZpY2F0aW9uTWFuYWdlciBub3RpZmljYXRpb25NYW5hZ2VyID0KKyAgICAgICAgICAgICAgICAoTm90aWZpY2F0aW9uTWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTk9USUZJQ0FUSU9OX1NFUlZJQ0UpOworICAgICAgICBub3RpZmljYXRpb25NYW5hZ2VyLmNyZWF0ZU5vdGlmaWNhdGlvbkNoYW5uZWwoCisgICAgICAgICAgICAgICAgbmV3IE5vdGlmaWNhdGlvbkNoYW5uZWwoCisgICAgICAgICAgICAgICAgICAgICAgICBOT1RJRklDQVRJT05fQ0hBTk5FTF9JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5PVElGSUNBVElPTl9DSEFOTkVMX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25NYW5hZ2VyLklNUE9SVEFOQ0VfREVGQVVMVCkpOworCisgICAgICAgIGZpbmFsIE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24gPQorICAgICAgICAgICAgICAgIG5ldyBOb3RpZmljYXRpb24uQnVpbGRlcihjb250ZXh0LCBOT1RJRklDQVRJT05fQ0hBTk5FTF9JRCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTbWFsbEljb24oUi5kcmF3YWJsZS5pY29uX2JsYWNrKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnRUaXRsZSgibm90aWZ5IikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50VGV4dCgiVGhpcyBpcyBub3RpZmljYXRpb24gICIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgbm90aWZpY2F0aW9uTWFuYWdlci5ub3RpZnkoMSwgbm90aWZpY2F0aW9uKTsKKworICAgICAgICBMb2cuaShUQUcsICJOb3RpZmljYXRpb24gcG9zdGVkLiIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvYXBwcy9wcm9jc3RhdHNhcHAvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvYXBwcy9wcm9jc3RhdHNhcHAvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Njc2ZWU4Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9hcHBzL3Byb2NzdGF0c2FwcC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzkgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c1Byb2NTdGF0c1Byb3RvQXBwCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKKworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lci5zdHVicyBjdHMtanVuaXQKKworTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKKyAgICBjdHN0ZXN0cnVubmVyLWF4dCBcCisgICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgXAorICAgIGFuZHJvaWR4LmxlZ2FjeV9sZWdhY3ktc3VwcG9ydC12NAorCitMT0NBTF9TREtfVkVSU0lPTiA6PSB0ZXN0X2N1cnJlbnQKKworIyB0YWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKKworaW5jbHVkZSAkKEJVSUxEX0NUU19QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9hcHBzL3Byb2NzdGF0c2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9hcHBzL3Byb2NzdGF0c2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNjhhMGUKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2luY2lkZW50L2FwcHMvcHJvY3N0YXRzYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwyNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgcGFja2FnZT0iY29tLmFuZHJvaWQuc2VydmVyLmN0cy5wcm9jc3RhdHMiID4KKworICAgIDxhcHBsaWNhdGlvbj4KKyAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5TaW1wbGVBY3Rpdml0eSIgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIgLz4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmFuZHJvaWQuc2VydmVyLmN0cy5wcm9jc3RhdHMiIC8+Cis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9hcHBzL3Byb2NzdGF0c2FwcC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9wcm9jc3RhdHMvU2ltcGxlQWN0aXZpdHkuamF2YSBiL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvYXBwcy9wcm9jc3RhdHNhcHAvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvcHJvY3N0YXRzL1NpbXBsZUFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjlmZjc1ZQotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvYXBwcy9wcm9jc3RhdHNhcHAvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvcHJvY3N0YXRzL1NpbXBsZUFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlci5jdHMucHJvY3N0YXRzOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEubGFuZy5PdmVycmlkZTsKKworcHVibGljIGNsYXNzIFNpbXBsZUFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJQcm9jc3RhdHNBcHBSdW5uaW5nVGVzdCI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgYnVuZGxlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKGJ1bmRsZSk7CisgICAgICAgIExvZy5pKFRBRywgIlByb2NzdGF0cyBhcHAgaXMgcnVubmluZyIpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9hcHBzL3N0b3JhZ2VkYXBwL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2luY2lkZW50L2FwcHMvc3RvcmFnZWRhcHAvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAyODcxNi4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL2luY2lkZW50L2FwcHMvc3RvcmFnZWRhcHAvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c1N0b3JhZ2VkVGVzdEFwcAotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQotCi1MT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCi0KLUxPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIgY3RzLWp1bml0Ci0KLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCi0gICAgY3RzdGVzdHJ1bm5lciBcCi0gICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbCBcCi0gICAgYW5kcm9pZC1zdXBwb3J0LXY0Ci0KLUxPQ0FMX1NES19WRVJTSU9OIDo9IHRlc3RfY3VycmVudAotCi0jIHRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0Ci1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cwotCi1pbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2luY2lkZW50L2FwcHMvc3RvcmFnZWRhcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvYXBwcy9zdG9yYWdlZGFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjNkNzlmLi4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvYXBwcy9zdG9yYWdlZGFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgcGFja2FnZT0iY29tLmFuZHJvaWQuc2VydmVyLmN0cy5zdG9yYWdlZCIgPgotCi0gICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9FWFRFUk5BTF9TVE9SQUdFIiAvPgotCi0gICAgPGFwcGxpY2F0aW9uPgotICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KLSAgICAgICAgPHNlcnZpY2UgYW5kcm9pZDpuYW1lPSIuU2ltcGxlSU9TZXJ2aWNlIiBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIiAvPgotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuU2ltcGxlSU9BY3Rpdml0eSIgYW5kcm9pZDpsYWJlbD0iU3RvcmFnZWQgVGVzdCBBY3Rpdml0eSIvPgotICAgIDwvYXBwbGljYXRpb24+Ci0KLSAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmFuZHJvaWQuc2VydmVyLmN0cy5zdG9yYWdlZCIgLz4KLTwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2luY2lkZW50L2FwcHMvc3RvcmFnZWRhcHAvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvc3RvcmFnZWQvU2ltcGxlSU9TZXJ2aWNlLmphdmEgYi9ob3N0c2lkZXRlc3RzL2luY2lkZW50L2FwcHMvc3RvcmFnZWRhcHAvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvc3RvcmFnZWQvU2ltcGxlSU9TZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2NGQxY2YuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9hcHBzL3N0b3JhZ2VkYXBwL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY3RzL3N0b3JhZ2VkL1NpbXBsZUlPU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyLmN0cy5zdG9yYWdlZDsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLlNlcnZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOwotaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlSU9TZXJ2aWNlIGV4dGVuZHMgU2VydmljZSB7Ci0gICAgcHJpdmF0ZSBMb29wZXIgbVNlcnZpY2VMb29wZXI7Ci0gICAgcHJpdmF0ZSBTZXJ2aWNlSGFuZGxlciBtU2VydmljZUhhbmRsZXI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIFNlcnZpY2VIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7Ci0gICAgICAgIHB1YmxpYyBTZXJ2aWNlSGFuZGxlcihMb29wZXIgbG9vcGVyKSB7Ci0gICAgICAgICAgICBzdXBlcihsb29wZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgICAgIEZpbGUgdGVzdEZpbGUgPSBuZXcgRmlsZShnZXRGaWxlc0RpcigpLCAiU3RvcmFnZWRUZXN0X1RlbXBfQkciKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgY2hhciBkYXRhW10gPSBuZXcgY2hhcls0MDk2XTsKLSAgICAgICAgICAgICAgICBGaWxlV3JpdGVyIHcgPSBuZXcgRmlsZVdyaXRlcih0ZXN0RmlsZSk7Ci0gICAgICAgICAgICAgICAgdy53cml0ZShkYXRhKTsKLSAgICAgICAgICAgICAgICB3LmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgdy5jbG9zZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAvLyBTdG9wIHRoZSBzZXJ2aWNlIHVzaW5nIHRoZSBzdGFydElkLCBzbyB0aGF0IHdlIGRvbid0IHN0b3AKLSAgICAgICAgICAgICAgICAvLyB0aGUgc2VydmljZSBpbiB0aGUgbWlkZGxlIG9mIGhhbmRsaW5nIGFub3RoZXIgam9iCi0gICAgICAgICAgICAgICAgc3RvcFNlbGYobXNnLmFyZzEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25DcmVhdGUoKSB7Ci0gICAgICAgIC8vIFN0YXJ0IHVwIHRoZSB0aHJlYWQgcnVubmluZyB0aGUgc2VydmljZS4gIE5vdGUgdGhhdCB3ZSBjcmVhdGUgYQotICAgICAgICAvLyBzZXBhcmF0ZSB0aHJlYWQgYmVjYXVzZSB0aGUgc2VydmljZSBub3JtYWxseSBydW5zIGluIHRoZSBwcm9jZXNzJ3MKLSAgICAgICAgLy8gbWFpbiB0aHJlYWQsIHdoaWNoIHdlIGRvbid0IHdhbnQgdG8gYmxvY2suICBXZSBhbHNvIG1ha2UgaXQKLSAgICAgICAgLy8gYmFja2dyb3VuZCBwcmlvcml0eSBzbyBDUFUtaW50ZW5zaXZlIHdvcmsgd2lsbCBub3QgZGlzcnVwdCBvdXIgVUkuCi0gICAgICAgIEhhbmRsZXJUaHJlYWQgdGhyZWFkID0gbmV3IEhhbmRsZXJUaHJlYWQoIlNlcnZpY2VTdGFydEFyZ3VtZW50cyIsCi0gICAgICAgICAgICAgICAgUHJvY2Vzcy5USFJFQURfUFJJT1JJVFlfQkFDS0dST1VORCk7Ci0gICAgICAgIHRocmVhZC5zdGFydCgpOwotCi0gICAgICAgIC8vIEdldCB0aGUgSGFuZGxlclRocmVhZCdzIExvb3BlciBhbmQgdXNlIGl0IGZvciBvdXIgSGFuZGxlcgotICAgICAgICBtU2VydmljZUxvb3BlciA9IHRocmVhZC5nZXRMb29wZXIoKTsKLSAgICAgICAgbVNlcnZpY2VIYW5kbGVyID0gbmV3IFNlcnZpY2VIYW5kbGVyKG1TZXJ2aWNlTG9vcGVyKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IG9uU3RhcnRDb21tYW5kKEludGVudCBpbnRlbnQsIGludCBmbGFncywgaW50IHN0YXJ0SWQpIHsKLSAgICAgICAgTWVzc2FnZSBtc2cgPSBtU2VydmljZUhhbmRsZXIub2J0YWluTWVzc2FnZSgpOwotICAgICAgICBtc2cuYXJnMSA9IHN0YXJ0SWQ7Ci0gICAgICAgIG1TZXJ2aWNlSGFuZGxlci5zZW5kTWVzc2FnZShtc2cpOwotCi0gICAgICAgIHJldHVybiBTVEFSVF9OT1RfU1RJQ0tZOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJQmluZGVyIG9uQmluZChJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvYXBwcy9zdG9yYWdlZGFwcC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9zdG9yYWdlZC9TdG9yYWdlZFRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvYXBwcy9zdG9yYWdlZGFwcC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9zdG9yYWdlZC9TdG9yYWdlZFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU1NGM2OC4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL2luY2lkZW50L2FwcHMvc3RvcmFnZWRhcHAvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvc3RvcmFnZWQvU3RvcmFnZWRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyLmN0cy5zdG9yYWdlZDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKLQotLyoqCi0gKiBVc2VkIGJ5IFN0b3JhZ2VkVGVzdC4KLSAqLwotQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKLXB1YmxpYyBjbGFzcyBTdG9yYWdlZFRlc3QgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3RvcmFnZWRUZXN0IjsKLQotICAgIHByb3RlY3RlZCBDb250ZXh0IG1Db250ZXh0OwotCi0gICAgQEJlZm9yZQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1Db250ZXh0ID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0VGFyZ2V0Q29udGV4dCgpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEZvcmVncm91bmRJTygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOwotICAgICAgICBpbnRlbnQuc2V0Q2xhc3MobUNvbnRleHQsIFNpbXBsZUlPQWN0aXZpdHkuY2xhc3MpOwotICAgICAgICBpbnRlbnQuc2V0RmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfQ0xFQVJfVE9QIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLKTsKLSAgICAgICAgbUNvbnRleHQuc3RhcnRBY3Rpdml0eShpbnRlbnQpOwotICAgICAgICBUaHJlYWQuc2xlZXAoMzAwMCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QmFja2dyb3VuZElPKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KCk7Ci0gICAgICAgIGludGVudC5zZXRDbGFzcyhtQ29udGV4dCwgU2ltcGxlSU9TZXJ2aWNlLmNsYXNzKTsKLSAgICAgICAgbUNvbnRleHQuc3RhcnRTZXJ2aWNlKGludGVudCk7Ci0gICAgICAgIFRocmVhZC5zbGVlcCgzMDAwKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2luY2lkZW50L3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY3RzL0FjdGl2aXR5TWFuYWdlckluY2lkZW50VGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9BY3Rpdml0eU1hbmFnZXJJbmNpZGVudFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2RmNmE5Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9BY3Rpdml0eU1hbmFnZXJJbmNpZGVudFRlc3QuamF2YQpAQCAtMCwwICsxLDI4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyLmN0czsKKworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5hbS5BY3RpdmVJbnN0cnVtZW50YXRpb25Qcm90bzsKK2ltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIuYW0uQWN0aXZlU2VydmljZXNQcm90bzsKK2ltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIuYW0uQWN0aXZlU2VydmljZXNQcm90by5TZXJ2aWNlc0J5VXNlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIuYW0uQWN0aXZpdHlNYW5hZ2VyU2VydmljZUR1bXBCcm9hZGNhc3RzUHJvdG87CitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLmFtLkFjdGl2aXR5TWFuYWdlclNlcnZpY2VEdW1wUHJvY2Vzc2VzUHJvdG87CitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLmFtLkFjdGl2aXR5TWFuYWdlclNlcnZpY2VEdW1wUHJvY2Vzc2VzUHJvdG8uTHJ1UHJvY2Vzc2VzOworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5hbS5BY3Rpdml0eU1hbmFnZXJTZXJ2aWNlRHVtcFNlcnZpY2VzUHJvdG87CitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLmFtLkFwcEVycm9yc1Byb3RvOworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5hbS5BcHBUaW1lVHJhY2tlclByb3RvOworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5hbS5Ccm9hZGNhc3RRdWV1ZVByb3RvOworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5hbS5Ccm9hZGNhc3RRdWV1ZVByb3RvLkJyb2FkY2FzdFN1bW1hcnk7CitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLmFtLkJyb2FkY2FzdFJlY29yZFByb3RvOworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5hbS5Db25uZWN0aW9uUmVjb3JkUHJvdG87CitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLmFtLkdyYW50VXJpUHJvdG87CitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLmFtLkltcG9ydGFuY2VUb2tlblByb3RvOworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5hbS5OZWVkZWRVcmlHcmFudHNQcm90bzsKK2ltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIuYW0uUHJvY2Vzc1JlY29yZFByb3RvOworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5hbS5TZXJ2aWNlUmVjb3JkUHJvdG87CitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLmFtLlVpZFJlY29yZFByb3RvOworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5hbS5VcmlQZXJtaXNzaW9uT3duZXJQcm90bzsKK2ltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIuYW0uVnJDb250cm9sbGVyUHJvdG87CisKKy8qKgorICogVGVzdCB0byBjaGVjayB0aGF0IHRoZSBhY3Rpdml0eSBtYW5hZ2VyIHNlcnZpY2UgcHJvcGVybHkgb3V0cHV0cyBpdHMgZHVtcCBzdGF0ZS4KKyAqCisgKiBtYWtlIC1qMzIgQ3RzSW5jaWRlbnRIb3N0VGVzdENhc2VzCisgKiBjdHMtdHJhZGVmZWQgcnVuIHNpbmdsZUNvbW1hbmQgY3RzLWRldiAtZCAtLW1vZHVsZSBDdHNJbmNpZGVudEhvc3RUZXN0Q2FzZXMKKyAqLworcHVibGljIGNsYXNzIEFjdGl2aXR5TWFuYWdlckluY2lkZW50VGVzdCBleHRlbmRzIFByb3RvRHVtcFRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0JST0FEQ0FTVCA9ICJjb20uYW5kcm9pZC5teWJyb2FkY2FzdCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNZU1RFTV9QUk9DID0gInN5c3RlbSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNZU1RFTV9VSUQgPSAxMDAwOworCisgICAgLyoqCisgICAgICogVGVzdHMgYWN0aXZpdHkgbWFuYWdlciBkdW1wcyBicm9hZGNhc3RzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3REdW1wQnJvYWRjYXN0cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBnZXREZXZpY2UoKS5leGVjdXRlU2hlbGxDb21tYW5kKCJhbSBicm9hZGNhc3QgLWEgIiArIFRFU1RfQlJPQURDQVNUKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKDEwMCk7CisgICAgICAgIGZpbmFsIEFjdGl2aXR5TWFuYWdlclNlcnZpY2VEdW1wQnJvYWRjYXN0c1Byb3RvIGR1bXAgPSBnZXREdW1wKAorICAgICAgICAgICAgICAgIEFjdGl2aXR5TWFuYWdlclNlcnZpY2VEdW1wQnJvYWRjYXN0c1Byb3RvLnBhcnNlcigpLAorICAgICAgICAgICAgICAgICJkdW1wc3lzIGFjdGl2aXR5IC0tcHJvdG8gYnJvYWRjYXN0cyIpOworCisgICAgICAgIGFzc2VydFRydWUoZHVtcC5nZXRSZWNlaXZlckxpc3RDb3VudCgpID4gMCk7CisgICAgICAgIGFzc2VydFRydWUoZHVtcC5nZXRCcm9hZGNhc3RRdWV1ZUNvdW50KCkgPiAwKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkdW1wLmdldFN0aWNreUJyb2FkY2FzdHNDb3VudCgpID4gMCk7CisKKyAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworbXlicm9hZGNhc3Q6CisgICAgICAgIGZvciAoQnJvYWRjYXN0UXVldWVQcm90byBxdWV1ZSA6IGR1bXAuZ2V0QnJvYWRjYXN0UXVldWVMaXN0KCkpIHsKKyAgICAgICAgICAgIGZvciAoQnJvYWRjYXN0UmVjb3JkUHJvdG8gcmVjb3JkIDogcXVldWUuZ2V0SGlzdG9yaWNhbEJyb2FkY2FzdHNMaXN0KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAocmVjb3JkLmdldEludGVudEFjdGlvbigpLmVxdWFscyhURVNUX0JST0FEQ0FTVCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhayBteWJyb2FkY2FzdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKEJyb2FkY2FzdFN1bW1hcnkgc3VtbWFyeSA6IHF1ZXVlLmdldEhpc3RvcmljYWxCcm9hZGNhc3RzU3VtbWFyeUxpc3QoKSkgeworICAgICAgICAgICAgICAgIGlmIChzdW1tYXJ5LmdldEludGVudCgpLmdldEFjdGlvbigpLmVxdWFscyhURVNUX0JST0FEQ0FTVCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhayBteWJyb2FkY2FzdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZShmb3VuZCk7CisgICAgICAgIEFjdGl2aXR5TWFuYWdlclNlcnZpY2VEdW1wQnJvYWRjYXN0c1Byb3RvLk1haW5IYW5kbGVyIG1haW5IYW5kbGVyID0gZHVtcC5nZXRIYW5kbGVyKCk7CisgICAgICAgIGFzc2VydFRydWUobWFpbkhhbmRsZXIuZ2V0SGFuZGxlcigpLmNvbnRhaW5zKAorICAgICAgICAgICAgImNvbS5hbmRyb2lkLnNlcnZlci5hbS5BY3Rpdml0eU1hbmFnZXJTZXJ2aWNlIikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIGFjdGl2aXR5IG1hbmFnZXIgZHVtcHMgc2VydmljZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdER1bXBTZXJ2aWNlcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBBY3Rpdml0eU1hbmFnZXJTZXJ2aWNlRHVtcFNlcnZpY2VzUHJvdG8gZHVtcCA9IGdldER1bXAoCisgICAgICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyU2VydmljZUR1bXBTZXJ2aWNlc1Byb3RvLnBhcnNlcigpLAorICAgICAgICAgICAgICAgICJkdW1wc3lzIGFjdGl2aXR5IC0tcHJvdG8gc2VydmljZSIpOworICAgICAgICBBY3RpdmVTZXJ2aWNlc1Byb3RvIGFjdGl2ZVNlcnZpY2VzID0gZHVtcC5nZXRBY3RpdmVTZXJ2aWNlcygpOworICAgICAgICBhc3NlcnRUcnVlKGFjdGl2ZVNlcnZpY2VzLmdldFNlcnZpY2VzQnlVc2Vyc0NvdW50KCkgPiAwKTsKKworICAgICAgICBmb3IgKFNlcnZpY2VzQnlVc2VyIHBlclVzZXJTZXJ2aWNlcyA6IGFjdGl2ZVNlcnZpY2VzLmdldFNlcnZpY2VzQnlVc2Vyc0xpc3QoKSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShwZXJVc2VyU2VydmljZXMuZ2V0U2VydmljZVJlY29yZHNDb3VudCgpID4gMCk7CisgICAgICAgICAgICBmb3IgKFNlcnZpY2VSZWNvcmRQcm90byBzZXJ2aWNlIDogcGVyVXNlclNlcnZpY2VzLmdldFNlcnZpY2VSZWNvcmRzTGlzdCgpKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2Uoc2VydmljZS5nZXRTaG9ydE5hbWUoKS5pc0VtcHR5KCkpOworICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKHNlcnZpY2UuZ2V0UGFja2FnZU5hbWUoKS5pc0VtcHR5KCkpOworICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKHNlcnZpY2UuZ2V0UHJvY2Vzc05hbWUoKS5pc0VtcHR5KCkpOworICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKHNlcnZpY2UuZ2V0QXBwaW5mbygpLmdldEJhc2VEaXIoKS5pc0VtcHR5KCkpOworICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKHNlcnZpY2UuZ2V0QXBwaW5mbygpLmdldERhdGFEaXIoKS5pc0VtcHR5KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmVyaWZ5QWN0aXZpdHlNYW5hZ2VyU2VydmljZUR1bXBTZXJ2aWNlc1Byb3RvKGR1bXAsIFBSSVZBQ1lfTk9ORSk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgdmVyaWZ5QWN0aXZpdHlNYW5hZ2VyU2VydmljZUR1bXBTZXJ2aWNlc1Byb3RvKEFjdGl2aXR5TWFuYWdlclNlcnZpY2VEdW1wU2VydmljZXNQcm90byBkdW1wLCBmaW5hbCBpbnQgZmlsdGVyTGV2ZWwpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmb3IgKFNlcnZpY2VzQnlVc2VyIHNidSA6IGR1bXAuZ2V0QWN0aXZlU2VydmljZXMoKS5nZXRTZXJ2aWNlc0J5VXNlcnNMaXN0KCkpIHsKKyAgICAgICAgICAgIGZvciAoU2VydmljZVJlY29yZFByb3RvIHNycCA6IHNidS5nZXRTZXJ2aWNlUmVjb3Jkc0xpc3QoKSkgeworICAgICAgICAgICAgICAgIHZlcmlmeVNlcnZpY2VSZWNvcmRQcm90byhzcnAsIGZpbHRlckxldmVsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdmVyaWZ5U2VydmljZVJlY29yZFByb3RvKFNlcnZpY2VSZWNvcmRQcm90byBzcnAsIGZpbmFsIGludCBmaWx0ZXJMZXZlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChmaWx0ZXJMZXZlbCA9PSBQUklWQUNZX0FVVE8pIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoc3JwLmdldEFwcGluZm8oKS5nZXRCYXNlRGlyKCkuaXNFbXB0eSgpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoc3JwLmdldEFwcGluZm8oKS5nZXRSZXNEaXIoKS5pc0VtcHR5KCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzcnAuZ2V0QXBwaW5mbygpLmdldERhdGFEaXIoKS5pc0VtcHR5KCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0RmFsc2Uoc3JwLmdldEFwcGluZm8oKS5nZXRCYXNlRGlyKCkuaXNFbXB0eSgpKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKHNycC5nZXRBcHBpbmZvKCkuZ2V0RGF0YURpcigpLmlzRW1wdHkoKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChTZXJ2aWNlUmVjb3JkUHJvdG8uU3RhcnRJdGVtIHNpIDogc3JwLmdldERlbGl2ZXJlZFN0YXJ0c0xpc3QoKSkgeworICAgICAgICAgICAgdmVyaWZ5U2VydmljZVJlY29yZFByb3RvU3RhcnRJdGVtKHNpLCBmaWx0ZXJMZXZlbCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChTZXJ2aWNlUmVjb3JkUHJvdG8uU3RhcnRJdGVtIHNpIDogc3JwLmdldFBlbmRpbmdTdGFydHNMaXN0KCkpIHsKKyAgICAgICAgICAgIHZlcmlmeVNlcnZpY2VSZWNvcmRQcm90b1N0YXJ0SXRlbShzaSwgZmlsdGVyTGV2ZWwpOworICAgICAgICB9CisgICAgICAgIGZvciAoQ29ubmVjdGlvblJlY29yZFByb3RvIGNycCA6IHNycC5nZXRDb25uZWN0aW9uc0xpc3QoKSkgeworICAgICAgICAgICAgdmVyaWZ5Q29ubmVjdGlvblJlY29yZFByb3RvKGNycCwgZmlsdGVyTGV2ZWwpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2ZXJpZnlTZXJ2aWNlUmVjb3JkUHJvdG9TdGFydEl0ZW0oU2VydmljZVJlY29yZFByb3RvLlN0YXJ0SXRlbSBzaSwgZmluYWwgaW50IGZpbHRlckxldmVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdmVyaWZ5TmVlZGVkVXJpR3JhbnRzUHJvdG8oc2kuZ2V0TmVlZGVkR3JhbnRzKCksIGZpbHRlckxldmVsKTsKKyAgICAgICAgdmVyaWZ5VXJpUGVybWlzc2lvbk93bmVyUHJvdG8oc2kuZ2V0VXJpUGVybWlzc2lvbnMoKSwgZmlsdGVyTGV2ZWwpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdmVyaWZ5TmVlZGVkVXJpR3JhbnRzUHJvdG8oTmVlZGVkVXJpR3JhbnRzUHJvdG8gbnVncCwgZmluYWwgaW50IGZpbHRlckxldmVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChHcmFudFVyaVByb3RvIGd1cCA6IG51Z3AuZ2V0R3JhbnRzTGlzdCgpKSB7CisgICAgICAgICAgICB2ZXJpZnlHcmFudFVyaVByb3RvKGd1cCwgZmlsdGVyTGV2ZWwpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2ZXJpZnlVcmlQZXJtaXNzaW9uT3duZXJQcm90byhVcmlQZXJtaXNzaW9uT3duZXJQcm90byB1cG9wLCBmaW5hbCBpbnQgZmlsdGVyTGV2ZWwpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoZmlsdGVyTGV2ZWwgPT0gUFJJVkFDWV9BVVRPKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHVwb3AuZ2V0T3duZXIoKS5pc0VtcHR5KCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoR3JhbnRVcmlQcm90byBndXAgOiB1cG9wLmdldFJlYWRQZXJtc0xpc3QoKSkgeworICAgICAgICAgICAgdmVyaWZ5R3JhbnRVcmlQcm90byhndXAsIGZpbHRlckxldmVsKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKEdyYW50VXJpUHJvdG8gZ3VwIDogdXBvcC5nZXRXcml0ZVBlcm1zTGlzdCgpKSB7CisgICAgICAgICAgICB2ZXJpZnlHcmFudFVyaVByb3RvKGd1cCwgZmlsdGVyTGV2ZWwpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2ZXJpZnlHcmFudFVyaVByb3RvKEdyYW50VXJpUHJvdG8gZ3VwLCBmaW5hbCBpbnQgZmlsdGVyTGV2ZWwpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoZmlsdGVyTGV2ZWwgPT0gUFJJVkFDWV9BVVRPKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGd1cC5nZXRVcmkoKS5pc0VtcHR5KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2ZXJpZnlDb25uZWN0aW9uUmVjb3JkUHJvdG8oQ29ubmVjdGlvblJlY29yZFByb3RvIGNycCwgZmluYWwgaW50IGZpbHRlckxldmVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChDb25uZWN0aW9uUmVjb3JkUHJvdG8uRmxhZyBmIDogY3JwLmdldEZsYWdzTGlzdCgpKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKENvbm5lY3Rpb25SZWNvcmRQcm90by5GbGFnLmdldERlc2NyaXB0b3IoKS5nZXRWYWx1ZXMoKS5jb250YWlucyhmLmdldFZhbHVlRGVzY3JpcHRvcigpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBhY3Rpdml0eSBtYW5hZ2VyIGR1bXBzIHByb2Nlc3Nlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RHVtcFByb2Nlc3NlcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBBY3Rpdml0eU1hbmFnZXJTZXJ2aWNlRHVtcFByb2Nlc3Nlc1Byb3RvIGR1bXAgPSBnZXREdW1wKAorICAgICAgICAgICAgICAgIEFjdGl2aXR5TWFuYWdlclNlcnZpY2VEdW1wUHJvY2Vzc2VzUHJvdG8ucGFyc2VyKCksCisgICAgICAgICAgICAgICAgImR1bXBzeXMgYWN0aXZpdHkgLS1wcm90byBwcm9jZXNzZXMiKTsKKworICAgICAgICBhc3NlcnRUcnVlKGR1bXAuZ2V0UHJvY3NDb3VudCgpID4gMCk7CisgICAgICAgIGJvb2xlYW4gcHJvY0ZvdW5kID0gZmFsc2U7CisgICAgICAgIGZvciAoUHJvY2Vzc1JlY29yZFByb3RvIHByb2MgOiBkdW1wLmdldFByb2NzTGlzdCgpKSB7CisgICAgICAgICAgICBpZiAocHJvYy5nZXRQcm9jZXNzTmFtZSgpLmVxdWFscyhTWVNURU1fUFJPQykgJiYgcHJvYy5nZXRVaWQoKSA9PSBTWVNURU1fVUlEKSB7CisgICAgICAgICAgICAgICAgcHJvY0ZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKHByb2NGb3VuZCk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShkdW1wLmdldEFjdGl2ZVVpZHNDb3VudCgpID4gMCk7CisgICAgICAgIGJvb2xlYW4gdWlkRm91bmQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChVaWRSZWNvcmRQcm90byB1aWQgOiBkdW1wLmdldEFjdGl2ZVVpZHNMaXN0KCkpIHsKKyAgICAgICAgICAgIGlmICh1aWQuZ2V0VWlkKCkgPT0gU1lTVEVNX1VJRCkgeworICAgICAgICAgICAgICAgIHVpZEZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKHVpZEZvdW5kKTsKKworICAgICAgICBMcnVQcm9jZXNzZXMgbHJ1UHJvY3MgPSBkdW1wLmdldExydVByb2NzKCk7CisgICAgICAgIGFzc2VydFRydWUobHJ1UHJvY3MuZ2V0U2l6ZSgpID09IGxydVByb2NzLmdldExpc3RDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkdW1wLmdldFVpZE9ic2VydmVyc0NvdW50KCkgPiAwKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkdW1wLmdldEFkalNlcSgpID4gMCk7CisgICAgICAgIGFzc2VydFRydWUoZHVtcC5nZXRMcnVTZXEoKSA+IDApOworCisgICAgICAgIHZlcmlmeUFjdGl2aXR5TWFuYWdlclNlcnZpY2VEdW1wUHJvY2Vzc2VzUHJvdG8oZHVtcCwgUFJJVkFDWV9OT05FKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCB2ZXJpZnlBY3Rpdml0eU1hbmFnZXJTZXJ2aWNlRHVtcFByb2Nlc3Nlc1Byb3RvKEFjdGl2aXR5TWFuYWdlclNlcnZpY2VEdW1wUHJvY2Vzc2VzUHJvdG8gZHVtcCwgZmluYWwgaW50IGZpbHRlckxldmVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChBY3RpdmVJbnN0cnVtZW50YXRpb25Qcm90byBhaXAgOiBkdW1wLmdldEFjdGl2ZUluc3RydW1lbnRhdGlvbnNMaXN0KCkpIHsKKyAgICAgICAgICAgIHZlcmlmeUFjdGl2ZUluc3RydW1lbnRhdGlvblByb3RvKGFpcCwgZmlsdGVyTGV2ZWwpOworICAgICAgICB9CisgICAgICAgIGZvciAoVWlkUmVjb3JkUHJvdG8gdXJwIDogZHVtcC5nZXRBY3RpdmVVaWRzTGlzdCgpKSB7CisgICAgICAgICAgICB2ZXJpZnlVaWRSZWNvcmRQcm90byh1cnAsIGZpbHRlckxldmVsKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKFVpZFJlY29yZFByb3RvIHVycCA6IGR1bXAuZ2V0VmFsaWRhdGVVaWRzTGlzdCgpKSB7CisgICAgICAgICAgICB2ZXJpZnlVaWRSZWNvcmRQcm90byh1cnAsIGZpbHRlckxldmVsKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKEltcG9ydGFuY2VUb2tlblByb3RvIGl0cCA6IGR1bXAuZ2V0SW1wb3J0YW50UHJvY3NMaXN0KCkpIHsKKyAgICAgICAgICAgIHZlcmlmeUltcG9ydGFuY2VUb2tlblByb3RvKGl0cCwgZmlsdGVyTGV2ZWwpOworICAgICAgICB9CisgICAgICAgIHZlcmlmeUFwcEVycm9yc1Byb3RvKGR1bXAuZ2V0QXBwRXJyb3JzKCksIGZpbHRlckxldmVsKTsKKyAgICAgICAgdmVyaWZ5VnJDb250cm9sbGVyUHJvdG8oZHVtcC5nZXRWckNvbnRyb2xsZXIoKSwgZmlsdGVyTGV2ZWwpOworICAgICAgICB2ZXJpZnlBcHBUaW1lVHJhY2tlclByb3RvKGR1bXAuZ2V0Q3VycmVudFRyYWNrZXIoKSwgZmlsdGVyTGV2ZWwpOworICAgICAgICBpZiAoZmlsdGVyTGV2ZWwgPT0gUFJJVkFDWV9BVVRPKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGR1bXAuZ2V0TWVtV2F0Y2hQcm9jZXNzZXMoKS5nZXREdW1wKCkuZ2V0RmlsZSgpLmlzRW1wdHkoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZlcmlmeUFjdGl2ZUluc3RydW1lbnRhdGlvblByb3RvKEFjdGl2ZUluc3RydW1lbnRhdGlvblByb3RvIGFpcCwgZmluYWwgaW50IGZpbHRlckxldmVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGZpbHRlckxldmVsID09IFBSSVZBQ1lfQVVUTykgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhaXAuZ2V0QXJndW1lbnRzKCkuaXNFbXB0eSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdmVyaWZ5VWlkUmVjb3JkUHJvdG8oVWlkUmVjb3JkUHJvdG8gdXJwLCBmaW5hbCBpbnQgZmlsdGVyTGV2ZWwpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmb3IgKFVpZFJlY29yZFByb3RvLkNoYW5nZSBjIDogdXJwLmdldExhc3RSZXBvcnRlZENoYW5nZXNMaXN0KCkpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoVWlkUmVjb3JkUHJvdG8uQ2hhbmdlLmdldERlc2NyaXB0b3IoKS5nZXRWYWx1ZXMoKS5jb250YWlucyhjLmdldFZhbHVlRGVzY3JpcHRvcigpKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZSh1cnAuZ2V0TnVtUHJvY3MoKSA+PSAwKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZlcmlmeUltcG9ydGFuY2VUb2tlblByb3RvKEltcG9ydGFuY2VUb2tlblByb3RvIGl0cCwgZmluYWwgaW50IGZpbHRlckxldmVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGZpbHRlckxldmVsID09IFBSSVZBQ1lfQVVUTykgeworICAgICAgICAgICAgLy8gVGhlIGVudGlyZSBtZXNzYWdlIGlzIHRhZ2dlZCBhcyBFWFBMSUNJVCwgc28gZXZlbiB0aGUgcGlkIHNob3VsZCBiZSBzdHJpcHBlZCBvdXQuCisgICAgICAgICAgICBhc3NlcnRUcnVlKGl0cC5nZXRQaWQoKSA9PSAwKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoaXRwLmdldFRva2VuKCkuaXNFbXB0eSgpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoaXRwLmdldFJlYXNvbigpLmlzRW1wdHkoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZlcmlmeUFwcEVycm9yc1Byb3RvKEFwcEVycm9yc1Byb3RvIGFlcCwgZmluYWwgaW50IGZpbHRlckxldmVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShhZXAuZ2V0Tm93VXB0aW1lTXMoKSA+PSAwKTsKKyAgICAgICAgaWYgKGZpbHRlckxldmVsID09IFBSSVZBQ1lfQVVUTykgeworICAgICAgICAgICAgZm9yIChBcHBFcnJvcnNQcm90by5CYWRQcm9jZXNzIGJwIDogYWVwLmdldEJhZFByb2Nlc3Nlc0xpc3QoKSkgeworICAgICAgICAgICAgICAgIGZvciAoQXBwRXJyb3JzUHJvdG8uQmFkUHJvY2Vzcy5FbnRyeSBlIDogYnAuZ2V0RW50cmllc0xpc3QoKSkgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGUuZ2V0TG9uZ01zZygpLmlzRW1wdHkoKSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZS5nZXRTdGFjaygpLmlzRW1wdHkoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2ZXJpZnlWckNvbnRyb2xsZXJQcm90byhWckNvbnRyb2xsZXJQcm90byB2Y3AsIGZpbmFsIGludCBmaWx0ZXJMZXZlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoVnJDb250cm9sbGVyUHJvdG8uVnJNb2RlIHZtIDogdmNwLmdldFZyTW9kZUxpc3QoKSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShWckNvbnRyb2xsZXJQcm90by5Wck1vZGUuZ2V0RGVzY3JpcHRvcigpLmdldFZhbHVlcygpLmNvbnRhaW5zKHZtLmdldFZhbHVlRGVzY3JpcHRvcigpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZlcmlmeUFwcFRpbWVUcmFja2VyUHJvdG8oQXBwVGltZVRyYWNrZXJQcm90byBhdHRwLCBmaW5hbCBpbnQgZmlsdGVyTGV2ZWwpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRUcnVlKGF0dHAuZ2V0VG90YWxEdXJhdGlvbk1zKCkgPj0gMCk7CisgICAgICAgIGZvciAoQXBwVGltZVRyYWNrZXJQcm90by5QYWNrYWdlVGltZSBwdCA6IGF0dHAuZ2V0UGFja2FnZVRpbWVzTGlzdCgpKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHB0LmdldER1cmF0aW9uTXMoKSA+PSAwKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvQWxhcm1NYW5hZ2VySW5jaWRlbnRUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2luY2lkZW50L3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY3RzL0FsYXJtTWFuYWdlckluY2lkZW50VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZDFiYjYKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2luY2lkZW50L3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY3RzL0FsYXJtTWFuYWdlckluY2lkZW50VGVzdC5qYXZhCkBAIC0wLDAgKzEsMjE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXIuY3RzOworCitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLkFsYXJtQ2xvY2tNZXRhZGF0YVByb3RvOworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5BbGFybU1hbmFnZXJTZXJ2aWNlRHVtcFByb3RvOworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5BbGFybVByb3RvOworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5CYXRjaFByb3RvOworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5Ccm9hZGNhc3RTdGF0c1Byb3RvOworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5Db25zdGFudHNQcm90bzsKK2ltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIuRmlsdGVyU3RhdHNQcm90bzsKK2ltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIuRm9yY2VBcHBTdGFuZGJ5VHJhY2tlclByb3RvOworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5Gb3JjZUFwcFN0YW5kYnlUcmFja2VyUHJvdG8uUnVuQW55SW5CYWNrZ3JvdW5kUmVzdHJpY3RlZFBhY2thZ2VzOworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5JZGxlRGlzcGF0Y2hFbnRyeVByb3RvOworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5JbkZsaWdodFByb3RvOworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5XYWtldXBFdmVudFByb3RvOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFRlc3QgdG8gY2hlY2sgdGhhdCB0aGUgYWxhcm0gbWFuYWdlciBzZXJ2aWNlIHByb3Blcmx5IG91dHB1dHMgaXRzIGR1bXAgc3RhdGUuCisgKi8KK3B1YmxpYyBjbGFzcyBBbGFybU1hbmFnZXJJbmNpZGVudFRlc3QgZXh0ZW5kcyBQcm90b0R1bXBUZXN0Q2FzZSB7CisgICAgcHVibGljIHZvaWQgdGVzdEFsYXJtTWFuYWdlclNlcnZpY2VEdW1wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEFsYXJtTWFuYWdlclNlcnZpY2VEdW1wUHJvdG8gZHVtcCA9CisgICAgICAgICAgICAgICAgZ2V0RHVtcChBbGFybU1hbmFnZXJTZXJ2aWNlRHVtcFByb3RvLnBhcnNlcigpLCAiZHVtcHN5cyBhbGFybSAtLXByb3RvIik7CisKKyAgICAgICAgdmVyaWZ5QWxhcm1NYW5hZ2VyU2VydmljZUR1bXBQcm90byhkdW1wLCBQUklWQUNZX05PTkUpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIHZlcmlmeUFsYXJtTWFuYWdlclNlcnZpY2VEdW1wUHJvdG8oQWxhcm1NYW5hZ2VyU2VydmljZUR1bXBQcm90byBkdW1wLCBmaW5hbCBpbnQgZmlsdGVyTGV2ZWwpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBUaW1lcyBzaG91bGQgYmUgcG9zaXRpdmUuCisgICAgICAgIGFzc2VydFRydWUoMCA8IGR1bXAuZ2V0Q3VycmVudFRpbWUoKSk7CisgICAgICAgIGFzc2VydFRydWUoMCA8IGR1bXAuZ2V0RWxhcHNlZFJlYWx0aW1lKCkpOworICAgICAgICAvLyBDYW4gYmUgMCBpZiB0aGUgdGltZSBoYXNuJ3QgYmVlbiBjaGFuZ2VkIHlldC4KKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IGR1bXAuZ2V0TGFzdFRpbWVDaGFuZ2VDbG9ja1RpbWUoKSk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBkdW1wLmdldExhc3RUaW1lQ2hhbmdlUmVhbHRpbWUoKSk7CisKKyAgICAgICAgLy8gQ29uc3RhbnRzUHJvdG8KKyAgICAgICAgQ29uc3RhbnRzUHJvdG8gc2V0dGluZ3MgPSBkdW1wLmdldFNldHRpbmdzKCk7CisgICAgICAgIGFzc2VydFRydWUoMCA8IHNldHRpbmdzLmdldE1pbkZ1dHVyaXR5RHVyYXRpb25NcygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDwgc2V0dGluZ3MuZ2V0TWluSW50ZXJ2YWxEdXJhdGlvbk1zKCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPCBzZXR0aW5ncy5nZXRMaXN0ZW5lclRpbWVvdXREdXJhdGlvbk1zKCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPCBzZXR0aW5ncy5nZXRBbGxvd1doaWxlSWRsZVNob3J0RHVyYXRpb25NcygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDwgc2V0dGluZ3MuZ2V0QWxsb3dXaGlsZUlkbGVMb25nRHVyYXRpb25NcygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDwgc2V0dGluZ3MuZ2V0QWxsb3dXaGlsZUlkbGVXaGl0ZWxpc3REdXJhdGlvbk1zKCkpOworCisgICAgICAgIC8vIEZvcmNlQXBwU3RhbmRieVRyYWNrZXJQcm90bworICAgICAgICBGb3JjZUFwcFN0YW5kYnlUcmFja2VyUHJvdG8gZm9yY2VBcHBTdGFuZGJ5VHJhY2tlciA9IGR1bXAuZ2V0Rm9yY2VBcHBTdGFuZGJ5VHJhY2tlcigpOworICAgICAgICBmb3IgKGludCB1aWQgOiBmb3JjZUFwcFN0YW5kYnlUcmFja2VyLmdldEZvcmVncm91bmRVaWRzTGlzdCgpKSB7CisgICAgICAgICAgICAvLyAwIGlzIHRlY2huaWNhbGx5IGEgdmFsaWQgVUlELgorICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IHVpZCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgYWlkIDogZm9yY2VBcHBTdGFuZGJ5VHJhY2tlci5nZXRQb3dlclNhdmVXaGl0ZWxpc3RBcHBJZHNMaXN0KCkpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoMCA8PSBhaWQpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGFpZCA6IGZvcmNlQXBwU3RhbmRieVRyYWNrZXIuZ2V0VGVtcFBvd2VyU2F2ZVdoaXRlbGlzdEFwcElkc0xpc3QoKSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IGFpZCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChSdW5BbnlJbkJhY2tncm91bmRSZXN0cmljdGVkUGFja2FnZXMgciA6IGZvcmNlQXBwU3RhbmRieVRyYWNrZXIuZ2V0UnVuQW55SW5CYWNrZ3JvdW5kUmVzdHJpY3RlZFBhY2thZ2VzTGlzdCgpKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKDAgPD0gci5nZXRVaWQoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWR1bXAuZ2V0SXNJbnRlcmFjdGl2ZSgpKSB7CisgICAgICAgICAgICAvLyBUaGVzZSBhcmUgb25seSB2YWxpZCBpZiBpc19pbnRlcmFjdGl2ZSBpcyBmYWxzZS4KKyAgICAgICAgICAgIGFzc2VydFRydWUoMCA8IGR1bXAuZ2V0VGltZVNpbmNlTm9uSW50ZXJhY3RpdmVNcygpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoMCA8IGR1bXAuZ2V0TWF4V2FrZXVwRGVsYXlNcygpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoMCA8IGR1bXAuZ2V0VGltZVNpbmNlTGFzdERpc3BhdGNoTXMoKSk7CisgICAgICAgICAgICAvLyB0aW1lX3VudGlsX25leHRfbm9uX3dha2V1cF9kZWxpdmVyeV9tcyBjb3VsZCBiZSBuZWdhdGl2ZSBpZiB0aGUgZGVsaXZlcnkgdGltZSBpcyBpbiB0aGUgcGFzdC4KKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydFRydWUoMCA8IGR1bXAuZ2V0VGltZVVudGlsTmV4dFdha2V1cE1zKCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPCBkdW1wLmdldFRpbWVTaW5jZUxhc3RXYWtldXBNcygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDwgZHVtcC5nZXRUaW1lU2luY2VMYXN0V2FrZXVwU2V0TXMoKSk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBkdW1wLmdldFRpbWVDaGFuZ2VFdmVudENvdW50KCkpOworCisgICAgICAgIGZvciAoaW50IGFpZCA6IGR1bXAuZ2V0RGV2aWNlSWRsZVVzZXJXaGl0ZWxpc3RBcHBJZHNMaXN0KCkpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoMCA8PSBhaWQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQWxhcm1DbG9ja01ldGFkYXRhUHJvdG8KKyAgICAgICAgZm9yIChBbGFybUNsb2NrTWV0YWRhdGFQcm90byBhYyA6IGR1bXAuZ2V0TmV4dEFsYXJtQ2xvY2tNZXRhZGF0YUxpc3QoKSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IGFjLmdldFVzZXIoKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKDAgPCBhYy5nZXRUcmlnZ2VyVGltZU1zKCkpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChCYXRjaFByb3RvIGIgOiBkdW1wLmdldFBlbmRpbmdBbGFybUJhdGNoZXNMaXN0KCkpIHsKKyAgICAgICAgICAgIGZpbmFsIGxvbmcgc3RhcnQgPSBiLmdldFN0YXJ0UmVhbHRpbWUoKTsKKyAgICAgICAgICAgIGZpbmFsIGxvbmcgZW5kID0gYi5nZXRFbmRSZWFsdGltZSgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQmF0Y2ggc3RhcnQgdGltZSAoIiArIHN0YXJ0KyAiKSBpcyBuZWdhdGl2ZSIsIDAgPD0gc3RhcnQpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQmF0Y2ggZW5kIHRpbWUgKCIgKyBlbmQgKyAiKSBpcyBuZWdhdGl2ZSIsIDAgPD0gZW5kKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkJhdGNoIHN0YXJ0IHRpbWUgKCIgKyBzdGFydCArICIpIGlzIGFmdGVyIGl0cyBlbmQgdGltZSAoIiArIGVuZCArICIpIiwKKyAgICAgICAgICAgICAgICBzdGFydCA8PSBlbmQpOworICAgICAgICAgICAgdGVzdEFsYXJtUHJvdG9MaXN0KGIuZ2V0QWxhcm1zTGlzdCgpLCBmaWx0ZXJMZXZlbCk7CisgICAgICAgIH0KKworICAgICAgICB0ZXN0QWxhcm1Qcm90b0xpc3QoZHVtcC5nZXRQZW5kaW5nVXNlckJsb2NrZWRCYWNrZ3JvdW5kQWxhcm1zTGlzdCgpLCBmaWx0ZXJMZXZlbCk7CisKKyAgICAgICAgdGVzdEFsYXJtUHJvdG8oZHVtcC5nZXRQZW5kaW5nSWRsZVVudGlsKCksIGZpbHRlckxldmVsKTsKKworICAgICAgICB0ZXN0QWxhcm1Qcm90b0xpc3QoZHVtcC5nZXRQZW5kaW5nV2hpbGVJZGxlQWxhcm1zTGlzdCgpLCBmaWx0ZXJMZXZlbCk7CisKKyAgICAgICAgdGVzdEFsYXJtUHJvdG8oZHVtcC5nZXROZXh0V2FrZUZyb21JZGxlKCksIGZpbHRlckxldmVsKTsKKworICAgICAgICB0ZXN0QWxhcm1Qcm90b0xpc3QoZHVtcC5nZXRQYXN0RHVlTm9uV2FrZXVwQWxhcm1zTGlzdCgpLCBmaWx0ZXJMZXZlbCk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IGR1bXAuZ2V0RGVsYXllZEFsYXJtQ291bnQoKSk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBkdW1wLmdldFRvdGFsRGVsYXlUaW1lTXMoKSk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBkdW1wLmdldE1heERlbGF5RHVyYXRpb25NcygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IGR1bXAuZ2V0TWF4Tm9uSW50ZXJhY3RpdmVEdXJhdGlvbk1zKCkpOworCisgICAgICAgIGFzc2VydFRydWUoMCA8PSBkdW1wLmdldEJyb2FkY2FzdFJlZkNvdW50KCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gZHVtcC5nZXRQZW5kaW5nSW50ZW50U2VuZENvdW50KCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gZHVtcC5nZXRQZW5kaW5nSW50ZW50RmluaXNoQ291bnQoKSk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBkdW1wLmdldExpc3RlbmVyU2VuZENvdW50KCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gZHVtcC5nZXRMaXN0ZW5lckZpbmlzaENvdW50KCkpOworCisgICAgICAgIGZvciAoSW5GbGlnaHRQcm90byBmIDogZHVtcC5nZXRPdXRzdGFuZGluZ0RlbGl2ZXJpZXNMaXN0KCkpICB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKDAgPD0gZi5nZXRVaWQoKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKDAgPCBmLmdldFdoZW5FbGFwc2VkTXMoKSk7CisgICAgICAgICAgICB0ZXN0QnJvYWRjYXN0U3RhdHNQcm90byhmLmdldEJyb2FkY2FzdFN0YXRzKCkpOworICAgICAgICAgICAgdGVzdEZpbHRlclN0YXRzUHJvdG8oZi5nZXRGaWx0ZXJTdGF0cygpLCBmaWx0ZXJMZXZlbCk7CisgICAgICAgICAgICBpZiAoZmlsdGVyTGV2ZWwgPT0gUFJJVkFDWV9BVVRPKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmLmdldFRhZygpLmlzRW1wdHkoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKEFsYXJtTWFuYWdlclNlcnZpY2VEdW1wUHJvdG8uTGFzdEFsbG93V2hpbGVJZGxlRGlzcGF0Y2ggbCA6IGR1bXAuZ2V0TGFzdEFsbG93V2hpbGVJZGxlRGlzcGF0Y2hUaW1lc0xpc3QoKSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IGwuZ2V0VWlkKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgwIDwgbC5nZXRUaW1lTXMoKSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKEFsYXJtTWFuYWdlclNlcnZpY2VEdW1wUHJvdG8uVG9wQWxhcm0gdGEgOiBkdW1wLmdldFRvcEFsYXJtc0xpc3QoKSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IHRhLmdldFVpZCgpKTsKKyAgICAgICAgICAgIHRlc3RGaWx0ZXJTdGF0c1Byb3RvKHRhLmdldEZpbHRlcigpLCBmaWx0ZXJMZXZlbCk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKEFsYXJtTWFuYWdlclNlcnZpY2VEdW1wUHJvdG8uQWxhcm1TdGF0IGFzIDogZHVtcC5nZXRBbGFybVN0YXRzTGlzdCgpKSB7CisgICAgICAgICAgICB0ZXN0QnJvYWRjYXN0U3RhdHNQcm90byhhcy5nZXRCcm9hZGNhc3QoKSk7CisgICAgICAgICAgICBmb3IgKEZpbHRlclN0YXRzUHJvdG8gZiA6IGFzLmdldEZpbHRlcnNMaXN0KCkpIHsKKyAgICAgICAgICAgICAgICB0ZXN0RmlsdGVyU3RhdHNQcm90byhmLCBmaWx0ZXJMZXZlbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKElkbGVEaXNwYXRjaEVudHJ5UHJvdG8gaWQgOiBkdW1wLmdldEFsbG93V2hpbGVJZGxlRGlzcGF0Y2hlc0xpc3QoKSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IGlkLmdldFVpZCgpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoMCA8PSBpZC5nZXRFbnRyeUNyZWF0aW9uUmVhbHRpbWUoKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKDAgPD0gaWQuZ2V0QXJnUmVhbHRpbWUoKSk7CisgICAgICAgICAgICBpZiAoZmlsdGVyTGV2ZWwgPT0gUFJJVkFDWV9BVVRPKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpZC5nZXRUYWcoKS5pc0VtcHR5KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChXYWtldXBFdmVudFByb3RvIHdlIDogZHVtcC5nZXRSZWNlbnRXYWtldXBIaXN0b3J5TGlzdCgpKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKDAgPD0gd2UuZ2V0VWlkKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IHdlLmdldFdoZW4oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHRlc3RBbGFybVByb3RvTGlzdChMaXN0PEFsYXJtUHJvdG8+IGFsYXJtcywgZmluYWwgaW50IGZpbHRlckxldmVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChBbGFybVByb3RvIGEgOiBhbGFybXMpIHsKKyAgICAgICAgICAgIHRlc3RBbGFybVByb3RvKGEsIGZpbHRlckxldmVsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdEFsYXJtUHJvdG8oQWxhcm1Qcm90byBhbGFybSwgZmluYWwgaW50IGZpbHRlckxldmVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChhbGFybSk7CisKKyAgICAgICAgaWYgKGZpbHRlckxldmVsID09IFBSSVZBQ1lfQVVUTykgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhbGFybS5nZXRUYWcoKS5pc0VtcHR5KCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhbGFybS5nZXRMaXN0ZW5lcigpLmlzRW1wdHkoKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gYWxhcm0udGltZV91bnRpbF93aGVuX2VsYXBzZWRfbXMgY2FuIGJlIG5lZ2F0aXZlIGlmICd3aGVuJyBpcyBpbiB0aGUgcGFzdC4KKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IGFsYXJtLmdldFdpbmRvd0xlbmd0aE1zKCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gYWxhcm0uZ2V0UmVwZWF0SW50ZXJ2YWxNcygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IGFsYXJtLmdldENvdW50KCkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdEJyb2FkY2FzdFN0YXRzUHJvdG8oQnJvYWRjYXN0U3RhdHNQcm90byBicm9hZGNhc3QpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnROb3ROdWxsKGJyb2FkY2FzdCk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IGJyb2FkY2FzdC5nZXRVaWQoKSk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBicm9hZGNhc3QuZ2V0VG90YWxGbGlnaHREdXJhdGlvbk1zKCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gYnJvYWRjYXN0LmdldENvdW50KCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gYnJvYWRjYXN0LmdldFdha2V1cENvdW50KCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gYnJvYWRjYXN0LmdldFN0YXJ0VGltZVJlYWx0aW1lKCkpOworICAgICAgICAvLyBOZXN0aW5nIHNob3VsZCBiZSBub24tbmVnYXRpdmUuCisgICAgICAgIGFzc2VydFRydWUoMCA8PSBicm9hZGNhc3QuZ2V0TmVzdGluZygpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHRlc3RGaWx0ZXJTdGF0c1Byb3RvKEZpbHRlclN0YXRzUHJvdG8gZmlsdGVyLCBmaW5hbCBpbnQgZmlsdGVyTGV2ZWwpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnROb3ROdWxsKGZpbHRlcik7CisKKyAgICAgICAgaWYgKGZpbHRlckxldmVsID09IFBSSVZBQ1lfQVVUTykgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmaWx0ZXIuZ2V0VGFnKCkuaXNFbXB0eSgpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKDAgPD0gZmlsdGVyLmdldExhc3RGbGlnaHRUaW1lUmVhbHRpbWUoKSk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBmaWx0ZXIuZ2V0VG90YWxGbGlnaHREdXJhdGlvbk1zKCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gZmlsdGVyLmdldENvdW50KCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gZmlsdGVyLmdldFdha2V1cENvdW50KCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gZmlsdGVyLmdldFN0YXJ0VGltZVJlYWx0aW1lKCkpOworICAgICAgICAvLyBOZXN0aW5nIHNob3VsZCBiZSBub24tbmVnYXRpdmUuCisgICAgICAgIGFzc2VydFRydWUoMCA8PSBmaWx0ZXIuZ2V0TmVzdGluZygpKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvQmF0dGVyeUluY2lkZW50VGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9CYXR0ZXJ5SW5jaWRlbnRUZXN0LmphdmEKaW5kZXggNjY4YzgyNi4uNTk2NzIwYyAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9CYXR0ZXJ5SW5jaWRlbnRUZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9CYXR0ZXJ5SW5jaWRlbnRUZXN0LmphdmEKQEAgLTE2LDQ0ICsxNiw1NiBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlci5jdHM7CiAKK2ltcG9ydCBhbmRyb2lkLm9zLkJhdHRlcnlIZWFsdGhFbnVtOworaW1wb3J0IGFuZHJvaWQub3MuQmF0dGVyeVBsdWdnZWRTdGF0ZUVudW07CitpbXBvcnQgYW5kcm9pZC5vcy5CYXR0ZXJ5U3RhdHVzRW51bTsKIGltcG9ydCBhbmRyb2lkLnNlcnZpY2UuYmF0dGVyeS5CYXR0ZXJ5U2VydmljZUR1bXBQcm90bzsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uOworaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5JVGVzdERldmljZTsKIAogLyoqIFRlc3QgdG8gY2hlY2sgdGhhdCB0aGUgYmF0dGVyeSBtYW5hZ2VyIHByb3Blcmx5IG91dHB1dHMgaXRzIGR1bXAgc3RhdGUuICovCiBwdWJsaWMgY2xhc3MgQmF0dGVyeUluY2lkZW50VGVzdCBleHRlbmRzIFByb3RvRHVtcFRlc3RDYXNlIHsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBMRUFOQkFDS19GRUFUVVJFID0gImFuZHJvaWQuc29mdHdhcmUubGVhbmJhY2siOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMRUFOQkFDS19GRUFUVVJFID0gImFuZHJvaWQuc29mdHdhcmUubGVhbmJhY2siOwogCiAgICAgcHVibGljIHZvaWQgdGVzdEJhdHRlcnlTZXJ2aWNlRHVtcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIWhhc0JhdHRlcnkoZ2V0RGV2aWNlKCkpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKwogICAgICAgICBmaW5hbCBCYXR0ZXJ5U2VydmljZUR1bXBQcm90byBkdW1wID0KICAgICAgICAgICAgICAgICBnZXREdW1wKEJhdHRlcnlTZXJ2aWNlRHVtcFByb3RvLnBhcnNlcigpLCAiZHVtcHN5cyBiYXR0ZXJ5IC0tcHJvdG8iKTsKIAorICAgICAgICB2ZXJpZnlCYXR0ZXJ5U2VydmljZUR1bXBQcm90byhkdW1wLCBQUklWQUNZX05PTkUpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIHZlcmlmeUJhdHRlcnlTZXJ2aWNlRHVtcFByb3RvKEJhdHRlcnlTZXJ2aWNlRHVtcFByb3RvIGR1bXAsIGZpbmFsIGludCBmaWx0ZXJMZXZlbCkgewogICAgICAgICBpZiAoIWR1bXAuZ2V0SXNQcmVzZW50KCkpIHsKICAgICAgICAgICAgIC8qIElmIHRoZSBiYXR0ZXJ5IGlzbid0IHByZXNlbnQsIG5vIG5lZWQgdG8gcnVuIHRoaXMgdGVzdC4gKi8KICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChpc0xlYW5iYWNrKCkpIHsKLSAgICAgICAgICAgIC8qIEFuZHJvaWQgVFYgcmVwb3J0cyB0aGF0IGl0IGhhcyBhIGJhdHRlcnksIGJ1dCBpdCBkb2Vzbid0IHJlYWxseS4gKi8KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCisgICAgICAgIGFzc2VydFRydWUoZHVtcC5nZXRQbHVnZ2VkKCkgIT0gQmF0dGVyeVBsdWdnZWRTdGF0ZUVudW0uQkFUVEVSWV9QTFVHR0VEX1dJUkVMRVNTKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkdW1wLmdldE1heENoYXJnaW5nQ3VycmVudCgpID49IDApOworICAgICAgICBhc3NlcnRUcnVlKGR1bXAuZ2V0TWF4Q2hhcmdpbmdWb2x0YWdlKCkgPj0gMCk7CisgICAgICAgIGFzc2VydFRydWUoZHVtcC5nZXRDaGFyZ2VDb3VudGVyKCkgPj0gMCk7CiAgICAgICAgIGFzc2VydFRydWUoCi0gICAgICAgICAgICAgICAgZHVtcC5nZXRQbHVnZ2VkKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICE9IEJhdHRlcnlTZXJ2aWNlRHVtcFByb3RvLkJhdHRlcnlQbHVnZ2VkLkJBVFRFUllfUExVR0dFRF9XSVJFTEVTUyk7CisgICAgICAgICAgICAgICAgZHVtcC5nZXRTdGF0dXMoKSAhPSBCYXR0ZXJ5U3RhdHVzRW51bS5CQVRURVJZX1NUQVRVU19JTlZBTElEKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgKLSAgICAgICAgICAgICAgICBkdW1wLmdldFN0YXR1cygpICE9IEJhdHRlcnlTZXJ2aWNlRHVtcFByb3RvLkJhdHRlcnlTdGF0dXMuQkFUVEVSWV9TVEFUVVNfSU5WQUxJRCk7Ci0gICAgICAgIGFzc2VydFRydWUoCi0gICAgICAgICAgICAgICAgZHVtcC5nZXRIZWFsdGgoKSAhPSBCYXR0ZXJ5U2VydmljZUR1bXBQcm90by5CYXR0ZXJ5SGVhbHRoLkJBVFRFUllfSEVBTFRIX0lOVkFMSUQpOworICAgICAgICAgICAgICAgIGR1bXAuZ2V0SGVhbHRoKCkgIT0gQmF0dGVyeUhlYWx0aEVudW0uQkFUVEVSWV9IRUFMVEhfSU5WQUxJRCk7CiAgICAgICAgIGludCBzY2FsZSA9IGR1bXAuZ2V0U2NhbGUoKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShzY2FsZSA+IDApOwogICAgICAgICBpbnQgbGV2ZWwgPSBkdW1wLmdldExldmVsKCk7CiAgICAgICAgIGFzc2VydFRydWUobGV2ZWwgPj0gMCAmJiBsZXZlbCA8PSBzY2FsZSk7CiAgICAgICAgIGFzc2VydFRydWUoZHVtcC5nZXRWb2x0YWdlKCkgPj0gMCk7Ci0gICAgICAgIGFzc2VydFRydWUoZHVtcC5nZXRUZW1wZXJhdHVyZSgpID4gMCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzTGVhbmJhY2soKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIGNvbW1hbmRPdXRwdXQgPSBnZXREZXZpY2UoKS5leGVjdXRlU2hlbGxDb21tYW5kKCJwbSBsaXN0IGZlYXR1cmVzIik7CisgICAgc3RhdGljIGJvb2xlYW4gaGFzQmF0dGVyeShJVGVzdERldmljZSBkZXZpY2UpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24geworICAgICAgICAvKiBBbmRyb2lkIFRWIHJlcG9ydHMgdGhhdCBpdCBoYXMgYSBiYXR0ZXJ5LCBidXQgaXQgZG9lc24ndCByZWFsbHkuICovCisgICAgICAgIHJldHVybiAhaXNMZWFuYmFjayhkZXZpY2UpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNMZWFuYmFjayhJVGVzdERldmljZSBkZXZpY2UpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgY29tbWFuZE91dHB1dCA9IGRldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKCJwbSBsaXN0IGZlYXR1cmVzIik7CiAgICAgICAgIHJldHVybiBjb21tYW5kT3V0cHV0LmNvbnRhaW5zKExFQU5CQUNLX0ZFQVRVUkUpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvQmF0dGVyeVN0YXRzSW5jaWRlbnRUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2luY2lkZW50L3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY3RzL0JhdHRlcnlTdGF0c0luY2lkZW50VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNTNhOGQKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2luY2lkZW50L3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY3RzL0JhdHRlcnlTdGF0c0luY2lkZW50VGVzdC5qYXZhCkBAIC0wLDAgKzEsNDgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXIuY3RzOworCitpbXBvcnQgYW5kcm9pZC5vcy5CYXR0ZXJ5U3RhdHNQcm90bzsKK2ltcG9ydCBhbmRyb2lkLm9zLkNvbnRyb2xsZXJBY3Rpdml0eVByb3RvOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvdG87CitpbXBvcnQgYW5kcm9pZC5vcy5UaW1lclByb3RvOworaW1wb3J0IGFuZHJvaWQub3MuVWlkUHJvdG87CitpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLmJhdHRlcnlzdGF0cy5CYXR0ZXJ5U3RhdHNTZXJ2aWNlRHVtcFByb3RvOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255Lk5ldHdvcmtUeXBlRW51bTsKKworLyoqCisgKiBUZXN0IHRvIEJhdHRlcnlTdGF0cyBwcm90byBkdW1wLgorICovCitwdWJsaWMgY2xhc3MgQmF0dGVyeVN0YXRzSW5jaWRlbnRUZXN0IGV4dGVuZHMgUHJvdG9EdW1wVGVzdENhc2UgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYmF0dGVyeU9mZlNjcmVlbk9uKCk7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgYmF0dGVyeU9uU2NyZWVuT2ZmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGdldERldmljZSgpLmV4ZWN1dGVTaGVsbENvbW1hbmQoImR1bXBzeXMgYmF0dGVyeSB1bnBsdWciKTsKKyAgICAgICAgZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZCgiZHVtcHN5cyBiYXR0ZXJ5c3RhdHMgZW5hYmxlIHByZXRlbmQtc2NyZWVuLW9mZiIpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGJhdHRlcnlPZmZTY3JlZW5PbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBnZXREZXZpY2UoKS5leGVjdXRlU2hlbGxDb21tYW5kKCJkdW1wc3lzIGJhdHRlcnkgcmVzZXQiKTsKKyAgICAgICAgZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZCgiZHVtcHN5cyBiYXR0ZXJ5c3RhdHMgZGlzYWJsZSBwcmV0ZW5kLXNjcmVlbi1vZmYiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB0aGF0IGJhdHRlcnlzdGF0cyBpcyBkdW1wZWQgdG8gcHJvdG8gd2l0aCBzYW5lIHZhbHVlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmF0dGVyeVN0YXRzU2VydmljZUR1bXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYmF0dGVyeU9uU2NyZWVuT2ZmKCk7CisgICAgICAgIFRocmVhZC5zbGVlcCg1MDAwKTsgLy8gQWxsb3cgc29tZSB0aW1lIGZvciBiYXR0ZXJ5IGRhdGEgdG8gYWNjdW11bGF0ZS4KKworICAgICAgICBmaW5hbCBCYXR0ZXJ5U3RhdHNTZXJ2aWNlRHVtcFByb3RvIGR1bXAgPSBnZXREdW1wKEJhdHRlcnlTdGF0c1NlcnZpY2VEdW1wUHJvdG8ucGFyc2VyKCksCisgICAgICAgICAgICAgICAgImR1bXBzeXMgYmF0dGVyeXN0YXRzIC0tcHJvdG8iKTsKKworICAgICAgICB2ZXJpZnlCYXR0ZXJ5U3RhdHNTZXJ2aWNlRHVtcFByb3RvKGR1bXAsIFBSSVZBQ1lfTk9ORSk7CisKKyAgICAgICAgYmF0dGVyeU9mZlNjcmVlbk9uKCk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgdmVyaWZ5QmF0dGVyeVN0YXRzU2VydmljZUR1bXBQcm90byhCYXR0ZXJ5U3RhdHNTZXJ2aWNlRHVtcFByb3RvIGR1bXAsIGZpbmFsIGludCBmaWx0ZXJMZXZlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEJhdHRlcnlTdGF0c1Byb3RvIGJzID0gZHVtcC5nZXRCYXR0ZXJ5c3RhdHMoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChicyk7CisKKyAgICAgICAgLy8gUHJvdG8gZHVtcHMgd2VyZSBmaW5hbGl6ZWQgd2hlbiB0aGUgYmF0dGVyeXN0YXRzIHJlcG9ydCB2ZXJzaW9uIHdhcyB+MjkgYW5kIHRoZSBwYXJjZWwKKyAgICAgICAgLy8gdmVyc2lvbiB3YXMgfjE3Mi4KKyAgICAgICAgYXNzZXJ0VHJ1ZSgyOSA8PSBicy5nZXRSZXBvcnRWZXJzaW9uKCkpOworICAgICAgICBhc3NlcnRUcnVlKDE3MiA8PSBicy5nZXRQYXJjZWxWZXJzaW9uKCkpOworICAgICAgICBhc3NlcnROb3ROdWxsKGJzLmdldFN0YXJ0UGxhdGZvcm1WZXJzaW9uKCkpOworICAgICAgICBhc3NlcnRGYWxzZShicy5nZXRTdGFydFBsYXRmb3JtVmVyc2lvbigpLmlzRW1wdHkoKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoYnMuZ2V0RW5kUGxhdGZvcm1WZXJzaW9uKCkpOworICAgICAgICBhc3NlcnRGYWxzZShicy5nZXRFbmRQbGF0Zm9ybVZlcnNpb24oKS5pc0VtcHR5KCkpOworCisgICAgICAgIGZvciAoVWlkUHJvdG8gdSA6IGJzLmdldFVpZHNMaXN0KCkpIHsKKyAgICAgICAgICAgIHRlc3RVaWRQcm90byh1LCBmaWx0ZXJMZXZlbCk7CisgICAgICAgIH0KKworICAgICAgICB0ZXN0U3lzdGVtUHJvdG8oYnMuZ2V0U3lzdGVtKCkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdENvbnRyb2xsZXJBY3Rpdml0eVByb3RvKENvbnRyb2xsZXJBY3Rpdml0eVByb3RvIGNhKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjYSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IGNhLmdldElkbGVEdXJhdGlvbk1zKCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gY2EuZ2V0UnhEdXJhdGlvbk1zKCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gY2EuZ2V0UG93ZXJNYWgoKSk7CisgICAgICAgIGZvciAoQ29udHJvbGxlckFjdGl2aXR5UHJvdG8uVHhMZXZlbCB0eCA6IGNhLmdldFR4TGlzdCgpKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKDAgPD0gdHguZ2V0RHVyYXRpb25NcygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdEJhdHRlcnlMZXZlbFN0ZXAoU3lzdGVtUHJvdG8uQmF0dGVyeUxldmVsU3RlcCBibHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnROb3ROdWxsKGJscyk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDwgYmxzLmdldER1cmF0aW9uTXMoKSk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBibHMuZ2V0TGV2ZWwoKSk7CisgICAgICAgIGFzc2VydFRydWUoMTAwID49IGJscy5nZXRMZXZlbCgpKTsKKworICAgICAgICBhc3NlcnRUcnVlKFN5c3RlbVByb3RvLkJhdHRlcnlMZXZlbFN0ZXAuRGlzcGxheVN0YXRlLmdldERlc2NyaXB0b3IoKS5nZXRWYWx1ZXMoKQorICAgICAgICAgICAgICAgIC5jb250YWlucyhibHMuZ2V0RGlzcGxheVN0YXRlKCkuZ2V0VmFsdWVEZXNjcmlwdG9yKCkpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTeXN0ZW1Qcm90by5CYXR0ZXJ5TGV2ZWxTdGVwLlBvd2VyU2F2ZU1vZGUuZ2V0RGVzY3JpcHRvcigpLmdldFZhbHVlcygpCisgICAgICAgICAgICAgICAgLmNvbnRhaW5zKGJscy5nZXRQb3dlclNhdmVNb2RlKCkuZ2V0VmFsdWVEZXNjcmlwdG9yKCkpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTeXN0ZW1Qcm90by5CYXR0ZXJ5TGV2ZWxTdGVwLklkbGVNb2RlLmdldERlc2NyaXB0b3IoKS5nZXRWYWx1ZXMoKQorICAgICAgICAgICAgICAgIC5jb250YWlucyhibHMuZ2V0SWRsZU1vZGUoKS5nZXRWYWx1ZURlc2NyaXB0b3IoKSkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdFN5c3RlbVByb3RvKFN5c3RlbVByb3RvIHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBsb25nIGVwc2lsb24gPSA1MDA7IC8vIEFsbG93IH41MDAgbXMgb2YgZXJyb3Igd2hlbiBjb21wYXJpbmcgdGltZXMuCisgICAgICAgIGFzc2VydE5vdE51bGwocyk7CisKKyAgICAgICAgU3lzdGVtUHJvdG8uQmF0dGVyeSBiID0gcy5nZXRCYXR0ZXJ5KCk7CisgICAgICAgIGFzc2VydFRydWUoMCA8IGIuZ2V0U3RhcnRDbG9ja1RpbWVNcygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IGIuZ2V0U3RhcnRDb3VudCgpKTsKKyAgICAgICAgbG9uZyB0b3RhbFJlYWx0aW1lTXMgPSBiLmdldFRvdGFsUmVhbHRpbWVNcygpOworICAgICAgICBsb25nIHRvdGFsVXB0aW1lTXMgPSBiLmdldFRvdGFsVXB0aW1lTXMoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IHRvdGFsVXB0aW1lTXMpOworICAgICAgICBhc3NlcnRUcnVlKHRvdGFsVXB0aW1lTXMgPD0gdG90YWxSZWFsdGltZU1zICsgZXBzaWxvbik7CisgICAgICAgIGxvbmcgYmF0dGVyeVJlYWx0aW1lTXMgPSBiLmdldEJhdHRlcnlSZWFsdGltZU1zKCk7CisgICAgICAgIGxvbmcgYmF0dGVyeVVwdGltZU1zID0gYi5nZXRCYXR0ZXJ5VXB0aW1lTXMoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IGJhdHRlcnlVcHRpbWVNcyk7CisgICAgICAgIGFzc2VydFRydWUoYmF0dGVyeVVwdGltZU1zIDw9IGJhdHRlcnlSZWFsdGltZU1zICsgZXBzaWxvbik7CisgICAgICAgIGFzc2VydFRydWUoIkJhdHRlcnkgcmVhbHRpbWUgKCIgKyBiYXR0ZXJ5UmVhbHRpbWVNcyArICIpIGlzIGdyZWF0ZXIgdGhhbiB0b3RhbCByZWFsdGltZSAoIiArIHRvdGFsUmVhbHRpbWVNcyArICIpIiwKKyAgICAgICAgICAgIGJhdHRlcnlSZWFsdGltZU1zIDw9IHRvdGFsUmVhbHRpbWVNcyArIGVwc2lsb24pOworICAgICAgICBhc3NlcnRUcnVlKGJhdHRlcnlVcHRpbWVNcyA8PSB0b3RhbFVwdGltZU1zICsgZXBzaWxvbik7CisgICAgICAgIGxvbmcgc2NyZWVuT2ZmUmVhbHRpbWVNcyA9IGIuZ2V0U2NyZWVuT2ZmUmVhbHRpbWVNcygpOworICAgICAgICBsb25nIHNjcmVlbk9mZlVwdGltZU1zID0gYi5nZXRTY3JlZW5PZmZVcHRpbWVNcygpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gc2NyZWVuT2ZmVXB0aW1lTXMpOworICAgICAgICBhc3NlcnRUcnVlKHNjcmVlbk9mZlVwdGltZU1zIDw9IHNjcmVlbk9mZlJlYWx0aW1lTXMgKyBlcHNpbG9uKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzY3JlZW5PZmZSZWFsdGltZU1zIDw9IHRvdGFsUmVhbHRpbWVNcyArIGVwc2lsb24pOworICAgICAgICBhc3NlcnRUcnVlKHNjcmVlbk9mZlVwdGltZU1zIDw9IHRvdGFsVXB0aW1lTXMgKyBlcHNpbG9uKTsKKyAgICAgICAgbG9uZyBzY3JlZW5Eb3plRHVyYXRpb25NcyA9IGIuZ2V0U2NyZWVuRG96ZUR1cmF0aW9uTXMoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IHNjcmVlbkRvemVEdXJhdGlvbk1zKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzY3JlZW5Eb3plRHVyYXRpb25NcyA8PSBzY3JlZW5PZmZSZWFsdGltZU1zICsgZXBzaWxvbik7CisgICAgICAgIGFzc2VydFRydWUoMCA8IGIuZ2V0RXN0aW1hdGVkQmF0dGVyeUNhcGFjaXR5TWFoKCkpOworICAgICAgICBsb25nIG1pbkxlYXJuZWRDYXBhY2l0eVVhaCA9IGIuZ2V0TWluTGVhcm5lZEJhdHRlcnlDYXBhY2l0eVVhaCgpOworICAgICAgICBsb25nIG1heExlYXJuZWRDYXBhY2l0eVVhaCA9IGIuZ2V0TWF4TGVhcm5lZEJhdHRlcnlDYXBhY2l0eVVhaCgpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gbWluTGVhcm5lZENhcGFjaXR5VWFoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtaW5MZWFybmVkQ2FwYWNpdHlVYWggPD0gbWF4TGVhcm5lZENhcGFjaXR5VWFoKTsKKworICAgICAgICBTeXN0ZW1Qcm90by5CYXR0ZXJ5RGlzY2hhcmdlIGJkID0gcy5nZXRCYXR0ZXJ5RGlzY2hhcmdlKCk7CisgICAgICAgIGludCBsb3dlckJvdW5kID0gYmQuZ2V0TG93ZXJCb3VuZFNpbmNlQ2hhcmdlKCk7CisgICAgICAgIGludCB1cHBlckJvdW5kID0gYmQuZ2V0VXBwZXJCb3VuZFNpbmNlQ2hhcmdlKCk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBsb3dlckJvdW5kKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShsb3dlckJvdW5kIDw9IHVwcGVyQm91bmQpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gYmQuZ2V0U2NyZWVuT25TaW5jZUNoYXJnZSgpKTsKKyAgICAgICAgaW50IHNjcmVlbk9mZiA9IGJkLmdldFNjcmVlbk9mZlNpbmNlQ2hhcmdlKCk7CisgICAgICAgIGludCBzY3JlZW5Eb3plID0gYmQuZ2V0U2NyZWVuRG96ZVNpbmNlQ2hhcmdlKCk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBzY3JlZW5Eb3plKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzY3JlZW5Eb3plIDw9IHNjcmVlbk9mZik7CisgICAgICAgIGxvbmcgdG90YWxNYWggPSBiZC5nZXRUb3RhbE1haCgpOworICAgICAgICBsb25nIHRvdGFsTWFoU2NyZWVuT2ZmID0gYmQuZ2V0VG90YWxNYWhTY3JlZW5PZmYoKTsKKyAgICAgICAgbG9uZyB0b3RhbE1haFNjcmVlbkRvemUgPSBiZC5nZXRUb3RhbE1haFNjcmVlbkRvemUoKTsKKyAgICAgICAgbG9uZyB0b3RhbE1haExpZ2h0RG96ZSA9IGJkLmdldFRvdGFsTWFoTGlnaHREb3plKCk7CisgICAgICAgIGxvbmcgdG90YWxNYWhEZWVwRG96ZSA9IGJkLmdldFRvdGFsTWFoRGVlcERvemUoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IHRvdGFsTWFoU2NyZWVuRG96ZSk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSB0b3RhbE1haExpZ2h0RG96ZSk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSB0b3RhbE1haERlZXBEb3plKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh0b3RhbE1haFNjcmVlbkRvemUgPD0gdG90YWxNYWhTY3JlZW5PZmYpOworICAgICAgICBhc3NlcnRUcnVlKHRvdGFsTWFoTGlnaHREb3plIDw9IHRvdGFsTWFoU2NyZWVuT2ZmKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh0b3RhbE1haERlZXBEb3plIDw9IHRvdGFsTWFoU2NyZWVuT2ZmKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh0b3RhbE1haFNjcmVlbk9mZiA8PSB0b3RhbE1haCk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgtMSA8PSBzLmdldENoYXJnZVRpbWVSZW1haW5pbmdNcygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgtMSA8PSBzLmdldERpc2NoYXJnZVRpbWVSZW1haW5pbmdNcygpKTsKKworICAgICAgICBmb3IgKFN5c3RlbVByb3RvLkJhdHRlcnlMZXZlbFN0ZXAgYmxzIDogcy5nZXRDaGFyZ2VTdGVwTGlzdCgpKSB7CisgICAgICAgICAgICB0ZXN0QmF0dGVyeUxldmVsU3RlcChibHMpOworICAgICAgICB9CisgICAgICAgIGZvciAoU3lzdGVtUHJvdG8uQmF0dGVyeUxldmVsU3RlcCBibHMgOiBzLmdldERpc2NoYXJnZVN0ZXBMaXN0KCkpIHsKKyAgICAgICAgICAgIHRlc3RCYXR0ZXJ5TGV2ZWxTdGVwKGJscyk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKFN5c3RlbVByb3RvLkRhdGFDb25uZWN0aW9uIGRjIDogcy5nZXREYXRhQ29ubmVjdGlvbkxpc3QoKSkgeworICAgICAgICAgICAgLy8gSWYgaXNOb25lIGlzIG5vdCBzZXQsIHRoZW4gdGhlIG5hbWUgd2lsbCBiZSBhIHZhbGlkIG5ldHdvcmsgdHlwZS4KKyAgICAgICAgICAgIGlmICghZGMuZ2V0SXNOb25lKCkpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKE5ldHdvcmtUeXBlRW51bS5nZXREZXNjcmlwdG9yKCkuZ2V0VmFsdWVzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5jb250YWlucyhkYy5nZXROYW1lKCkuZ2V0VmFsdWVEZXNjcmlwdG9yKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRlc3RUaW1lclByb3RvKGRjLmdldFRvdGFsKCkpOworICAgICAgICB9CisKKyAgICAgICAgdGVzdENvbnRyb2xsZXJBY3Rpdml0eVByb3RvKHMuZ2V0R2xvYmFsQmx1ZXRvb3RoQ29udHJvbGxlcigpKTsKKyAgICAgICAgdGVzdENvbnRyb2xsZXJBY3Rpdml0eVByb3RvKHMuZ2V0R2xvYmFsTW9kZW1Db250cm9sbGVyKCkpOworICAgICAgICB0ZXN0Q29udHJvbGxlckFjdGl2aXR5UHJvdG8ocy5nZXRHbG9iYWxXaWZpQ29udHJvbGxlcigpKTsKKworICAgICAgICBTeXN0ZW1Qcm90by5HbG9iYWxOZXR3b3JrIGduID0gcy5nZXRHbG9iYWxOZXR3b3JrKCk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBnbi5nZXRNb2JpbGVCeXRlc1J4KCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gZ24uZ2V0TW9iaWxlQnl0ZXNUeCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IGduLmdldFdpZmlCeXRlc1J4KCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gZ24uZ2V0V2lmaUJ5dGVzVHgoKSk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBnbi5nZXRNb2JpbGVQYWNrZXRzUngoKSk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBnbi5nZXRNb2JpbGVQYWNrZXRzVHgoKSk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBnbi5nZXRXaWZpUGFja2V0c1J4KCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gZ24uZ2V0V2lmaVBhY2tldHNUeCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IGduLmdldEJ0Qnl0ZXNSeCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IGduLmdldEJ0Qnl0ZXNUeCgpKTsKKworICAgICAgICBTeXN0ZW1Qcm90by5HbG9iYWxXaWZpIGd3ID0gcy5nZXRHbG9iYWxXaWZpKCk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBndy5nZXRPbkR1cmF0aW9uTXMoKSk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBndy5nZXRSdW5uaW5nRHVyYXRpb25NcygpKTsKKworICAgICAgICBmb3IgKFN5c3RlbVByb3RvLktlcm5lbFdha2Vsb2NrIGt3IDogcy5nZXRLZXJuZWxXYWtlbG9ja0xpc3QoKSkgeworICAgICAgICAgICAgdGVzdFRpbWVyUHJvdG8oa3cuZ2V0VG90YWwoKSk7CisgICAgICAgIH0KKworICAgICAgICBTeXN0ZW1Qcm90by5NaXNjIG0gPSBzLmdldE1pc2MoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IG0uZ2V0U2NyZWVuT25EdXJhdGlvbk1zKCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gbS5nZXRQaG9uZU9uRHVyYXRpb25NcygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IG0uZ2V0RnVsbFdha2Vsb2NrVG90YWxEdXJhdGlvbk1zKCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gbS5nZXRQYXJ0aWFsV2FrZWxvY2tUb3RhbER1cmF0aW9uTXMoKSk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBtLmdldE1vYmlsZVJhZGlvQWN0aXZlRHVyYXRpb25NcygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IG0uZ2V0TW9iaWxlUmFkaW9BY3RpdmVBZGp1c3RlZFRpbWVNcygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IG0uZ2V0TW9iaWxlUmFkaW9BY3RpdmVDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IG0uZ2V0TW9iaWxlUmFkaW9BY3RpdmVVbmtub3duRHVyYXRpb25NcygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IG0uZ2V0SW50ZXJhY3RpdmVEdXJhdGlvbk1zKCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gbS5nZXRCYXR0ZXJ5U2F2ZXJNb2RlRW5hYmxlZER1cmF0aW9uTXMoKSk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBtLmdldE51bUNvbm5lY3Rpdml0eUNoYW5nZXMoKSk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBtLmdldERlZXBEb3plRW5hYmxlZER1cmF0aW9uTXMoKSk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBtLmdldERlZXBEb3plQ291bnQoKSk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBtLmdldERlZXBEb3plSWRsaW5nRHVyYXRpb25NcygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IG0uZ2V0RGVlcERvemVJZGxpbmdDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IG0uZ2V0TG9uZ2VzdERlZXBEb3plRHVyYXRpb25NcygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IG0uZ2V0TGlnaHREb3plRW5hYmxlZER1cmF0aW9uTXMoKSk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBtLmdldExpZ2h0RG96ZUNvdW50KCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gbS5nZXRMaWdodERvemVJZGxpbmdEdXJhdGlvbk1zKCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gbS5nZXRMaWdodERvemVJZGxpbmdDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IG0uZ2V0TG9uZ2VzdExpZ2h0RG96ZUR1cmF0aW9uTXMoKSk7CisKKyAgICAgICAgZm9yIChTeXN0ZW1Qcm90by5QaG9uZVNpZ25hbFN0cmVuZ3RoIHBzcyA6IHMuZ2V0UGhvbmVTaWduYWxTdHJlbmd0aExpc3QoKSkgeworICAgICAgICAgICAgdGVzdFRpbWVyUHJvdG8ocHNzLmdldFRvdGFsKCkpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChTeXN0ZW1Qcm90by5Qb3dlclVzZUl0ZW0gcHVpIDogcy5nZXRQb3dlclVzZUl0ZW1MaXN0KCkpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoU3lzdGVtUHJvdG8uUG93ZXJVc2VJdGVtLlNpcHBlci5nZXREZXNjcmlwdG9yKCkuZ2V0VmFsdWVzKCkKKyAgICAgICAgICAgICAgICAgICAgLmNvbnRhaW5zKHB1aS5nZXROYW1lKCkuZ2V0VmFsdWVEZXNjcmlwdG9yKCkpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoMCA8PSBwdWkuZ2V0VWlkKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IHB1aS5nZXRDb21wdXRlZFBvd2VyTWFoKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IHB1aS5nZXRTY3JlZW5Qb3dlck1haCgpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoMCA8PSBwdWkuZ2V0UHJvcG9ydGlvbmFsU21lYXJNYWgoKSk7CisgICAgICAgIH0KKworICAgICAgICBTeXN0ZW1Qcm90by5Qb3dlclVzZVN1bW1hcnkgcHVzID0gcy5nZXRQb3dlclVzZVN1bW1hcnkoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDwgcHVzLmdldEJhdHRlcnlDYXBhY2l0eU1haCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IHB1cy5nZXRDb21wdXRlZFBvd2VyTWFoKCkpOworICAgICAgICBkb3VibGUgbWluRHJhaW5lZCA9IHB1cy5nZXRNaW5EcmFpbmVkUG93ZXJNYWgoKTsKKyAgICAgICAgZG91YmxlIG1heERyYWluZWQgPSBwdXMuZ2V0TWF4RHJhaW5lZFBvd2VyTWFoKCk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBtaW5EcmFpbmVkKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtaW5EcmFpbmVkIDw9IG1heERyYWluZWQpOworCisgICAgICAgIGZvciAoU3lzdGVtUHJvdG8uUmVzb3VyY2VQb3dlck1hbmFnZXIgcnBtIDogcy5nZXRSZXNvdXJjZVBvd2VyTWFuYWdlckxpc3QoKSkgeworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChycG0uZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKHJwbS5nZXROYW1lKCkuaXNFbXB0eSgpKTsKKyAgICAgICAgICAgIHRlc3RUaW1lclByb3RvKHJwbS5nZXRUb3RhbCgpKTsKKyAgICAgICAgICAgIHRlc3RUaW1lclByb3RvKHJwbS5nZXRTY3JlZW5PZmYoKSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKFN5c3RlbVByb3RvLlNjcmVlbkJyaWdodG5lc3Mgc2IgOiBzLmdldFNjcmVlbkJyaWdodG5lc3NMaXN0KCkpIHsKKyAgICAgICAgICAgIHRlc3RUaW1lclByb3RvKHNiLmdldFRvdGFsKCkpOworICAgICAgICB9CisKKyAgICAgICAgdGVzdFRpbWVyUHJvdG8ocy5nZXRTaWduYWxTY2FubmluZygpKTsKKworICAgICAgICBmb3IgKFN5c3RlbVByb3RvLldha2V1cFJlYXNvbiB3ciA6IHMuZ2V0V2FrZXVwUmVhc29uTGlzdCgpKSB7CisgICAgICAgICAgICB0ZXN0VGltZXJQcm90byh3ci5nZXRUb3RhbCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIFN5c3RlbVByb3RvLldpZmlNdWx0aWNhc3RXYWtlbG9ja1RvdGFsIHdtd2wgPSBzLmdldFdpZmlNdWx0aWNhc3RXYWtlbG9ja1RvdGFsKCk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSB3bXdsLmdldER1cmF0aW9uTXMoKSk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSB3bXdsLmdldENvdW50KCkpOworCisgICAgICAgIGZvciAoU3lzdGVtUHJvdG8uV2lmaVNpZ25hbFN0cmVuZ3RoIHdzcyA6IHMuZ2V0V2lmaVNpZ25hbFN0cmVuZ3RoTGlzdCgpKSB7CisgICAgICAgICAgICB0ZXN0VGltZXJQcm90byh3c3MuZ2V0VG90YWwoKSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKFN5c3RlbVByb3RvLldpZmlTdGF0ZSB3cyA6IHMuZ2V0V2lmaVN0YXRlTGlzdCgpKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKFN5c3RlbVByb3RvLldpZmlTdGF0ZS5OYW1lLmdldERlc2NyaXB0b3IoKS5nZXRWYWx1ZXMoKQorICAgICAgICAgICAgICAgICAgICAuY29udGFpbnMod3MuZ2V0TmFtZSgpLmdldFZhbHVlRGVzY3JpcHRvcigpKSk7CisgICAgICAgICAgICB0ZXN0VGltZXJQcm90byh3cy5nZXRUb3RhbCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoU3lzdGVtUHJvdG8uV2lmaVN1cHBsaWNhbnRTdGF0ZSB3c3MgOiBzLmdldFdpZmlTdXBwbGljYW50U3RhdGVMaXN0KCkpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoU3lzdGVtUHJvdG8uV2lmaVN1cHBsaWNhbnRTdGF0ZS5OYW1lLmdldERlc2NyaXB0b3IoKS5nZXRWYWx1ZXMoKQorICAgICAgICAgICAgICAgICAgICAuY29udGFpbnMod3NzLmdldE5hbWUoKS5nZXRWYWx1ZURlc2NyaXB0b3IoKSkpOworICAgICAgICAgICAgdGVzdFRpbWVyUHJvdG8od3NzLmdldFRvdGFsKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0ZXN0VGltZXJQcm90byhUaW1lclByb3RvIHQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnROb3ROdWxsKHQpOworCisgICAgICAgIGxvbmcgZHVyYXRpb24gPSB0LmdldER1cmF0aW9uTXMoKTsKKyAgICAgICAgbG9uZyBjdXJEdXJhdGlvbiA9IHQuZ2V0Q3VycmVudER1cmF0aW9uTXMoKTsKKyAgICAgICAgbG9uZyBtYXhEdXJhdGlvbiA9IHQuZ2V0TWF4RHVyYXRpb25NcygpOworICAgICAgICBsb25nIHRvdGFsRHVyYXRpb24gPSB0LmdldFRvdGFsRHVyYXRpb25NcygpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gZHVyYXRpb24pOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gdC5nZXRDb3VudCgpKTsKKyAgICAgICAgLy8gTm90IGFsbCBUaW1lclByb3RvcyB3aWxsIGhhdmUgbWF4IGR1cmF0aW9uLCBjdXJyZW50IGR1cmF0aW9uLCBvciB0b3RhbCBkdXJhdGlvbgorICAgICAgICAvLyBwb3B1bGF0ZWQsIHNvIG11c3QgdHJlYWQgY2FyZWZ1bGx5LiBSZWdhcmRsZXNzLCB0aGV5IHNob3VsZCBuZXZlciBiZSBuZWdhdGl2ZS4KKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IGN1ckR1cmF0aW9uKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IG1heER1cmF0aW9uKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IHRvdGFsRHVyYXRpb24pOworICAgICAgICBpZiAobWF4RHVyYXRpb24gPiAwKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGN1ckR1cmF0aW9uIDw9IG1heER1cmF0aW9uKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodG90YWxEdXJhdGlvbiA+IDApIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUobWF4RHVyYXRpb24gPD0gdG90YWxEdXJhdGlvbik7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJEdXJhdGlvbiAiICsgZHVyYXRpb24gKyAiIGlzIGdyZWF0ZXIgdGhhbiB0b3RhbER1cmF0aW9uICIgKyB0b3RhbER1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiA8PSB0b3RhbER1cmF0aW9uKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdEJ5RnJlcXVlbmN5KFVpZFByb3RvLkNwdS5CeUZyZXF1ZW5jeSBiZikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydE5vdE51bGwoYmYpOworCisgICAgICAgIGFzc2VydFRydWUoMSA8PSBiZi5nZXRGcmVxdWVuY3lJbmRleCgpKTsKKyAgICAgICAgbG9uZyB0b3RhbCA9IGJmLmdldFRvdGFsRHVyYXRpb25NcygpOworICAgICAgICBsb25nIHNjcmVlbk9mZiA9IGJmLmdldFNjcmVlbk9mZkR1cmF0aW9uTXMoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IHNjcmVlbk9mZik7CisgICAgICAgIGFzc2VydFRydWUoc2NyZWVuT2ZmIDw9IHRvdGFsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHRlc3RVaWRQcm90byhVaWRQcm90byB1LCBmaW5hbCBpbnQgZmlsdGVyTGV2ZWwpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnROb3ROdWxsKHUpOworCisgICAgICAgIGFzc2VydFRydWUoMCA8PSB1LmdldFVpZCgpKTsKKworICAgICAgICBmb3IgKFVpZFByb3RvLlBhY2thZ2UgcCA6IHUuZ2V0UGFja2FnZXNMaXN0KCkpIHsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwocC5nZXROYW1lKCkpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UocC5nZXROYW1lKCkuaXNFbXB0eSgpKTsKKworICAgICAgICAgICAgZm9yIChVaWRQcm90by5QYWNrYWdlLlNlcnZpY2UgcyA6IHAuZ2V0U2VydmljZXNMaXN0KCkpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHMuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShzLmdldE5hbWUoKS5pc0VtcHR5KCkpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoMCA8PSBzLmdldFN0YXJ0RHVyYXRpb25NcygpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKDAgPD0gcy5nZXRTdGFydENvdW50KCkpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoMCA8PSBzLmdldExhdW5jaENvdW50KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdGVzdENvbnRyb2xsZXJBY3Rpdml0eVByb3RvKHUuZ2V0Qmx1ZXRvb3RoQ29udHJvbGxlcigpKTsKKyAgICAgICAgdGVzdENvbnRyb2xsZXJBY3Rpdml0eVByb3RvKHUuZ2V0TW9kZW1Db250cm9sbGVyKCkpOworICAgICAgICB0ZXN0Q29udHJvbGxlckFjdGl2aXR5UHJvdG8odS5nZXRXaWZpQ29udHJvbGxlcigpKTsKKworICAgICAgICBVaWRQcm90by5CbHVldG9vdGhNaXNjIGJtID0gdS5nZXRCbHVldG9vdGhNaXNjKCk7CisgICAgICAgIHRlc3RUaW1lclByb3RvKGJtLmdldEFwcG9ydGlvbmVkQmxlU2NhbigpKTsKKyAgICAgICAgdGVzdFRpbWVyUHJvdG8oYm0uZ2V0QmFja2dyb3VuZEJsZVNjYW4oKSk7CisgICAgICAgIHRlc3RUaW1lclByb3RvKGJtLmdldFVub3B0aW1pemVkQmxlU2NhbigpKTsKKyAgICAgICAgdGVzdFRpbWVyUHJvdG8oYm0uZ2V0QmFja2dyb3VuZFVub3B0aW1pemVkQmxlU2NhbigpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IGJtLmdldEJsZVNjYW5SZXN1bHRDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IGJtLmdldEJhY2tncm91bmRCbGVTY2FuUmVzdWx0Q291bnQoKSk7CisKKyAgICAgICAgVWlkUHJvdG8uQ3B1IGMgPSB1LmdldENwdSgpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gYy5nZXRVc2VyRHVyYXRpb25NcygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IGMuZ2V0U3lzdGVtRHVyYXRpb25NcygpKTsKKyAgICAgICAgZm9yIChVaWRQcm90by5DcHUuQnlGcmVxdWVuY3kgYmYgOiBjLmdldEJ5RnJlcXVlbmN5TGlzdCgpKSB7CisgICAgICAgICAgICB0ZXN0QnlGcmVxdWVuY3koYmYpOworICAgICAgICB9CisgICAgICAgIGZvciAoVWlkUHJvdG8uQ3B1LkJ5UHJvY2Vzc1N0YXRlIGJwcyA6IGMuZ2V0QnlQcm9jZXNzU3RhdGVMaXN0KCkpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoVWlkUHJvdG8uQ3B1LlByb2Nlc3NTdGF0ZS5nZXREZXNjcmlwdG9yKCkuZ2V0VmFsdWVzKCkKKyAgICAgICAgICAgICAgICAgICAgLmNvbnRhaW5zKGJwcy5nZXRQcm9jZXNzU3RhdGUoKS5nZXRWYWx1ZURlc2NyaXB0b3IoKSkpOworICAgICAgICAgICAgZm9yIChVaWRQcm90by5DcHUuQnlGcmVxdWVuY3kgYmYgOiBicHMuZ2V0QnlGcmVxdWVuY3lMaXN0KCkpIHsKKyAgICAgICAgICAgICAgICB0ZXN0QnlGcmVxdWVuY3koYmYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdGVzdFRpbWVyUHJvdG8odS5nZXRBdWRpbygpKTsKKyAgICAgICAgdGVzdFRpbWVyUHJvdG8odS5nZXRDYW1lcmEoKSk7CisgICAgICAgIHRlc3RUaW1lclByb3RvKHUuZ2V0Rmxhc2hsaWdodCgpKTsKKyAgICAgICAgdGVzdFRpbWVyUHJvdG8odS5nZXRGb3JlZ3JvdW5kQWN0aXZpdHkoKSk7CisgICAgICAgIHRlc3RUaW1lclByb3RvKHUuZ2V0Rm9yZWdyb3VuZFNlcnZpY2UoKSk7CisgICAgICAgIHRlc3RUaW1lclByb3RvKHUuZ2V0VmlicmF0b3IoKSk7CisgICAgICAgIHRlc3RUaW1lclByb3RvKHUuZ2V0VmlkZW8oKSk7CisKKyAgICAgICAgZm9yIChVaWRQcm90by5Kb2IgaiA6IHUuZ2V0Sm9ic0xpc3QoKSkgeworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChqLmdldE5hbWUoKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShqLmdldE5hbWUoKS5pc0VtcHR5KCkpOworCisgICAgICAgICAgICB0ZXN0VGltZXJQcm90byhqLmdldFRvdGFsKCkpOworICAgICAgICAgICAgdGVzdFRpbWVyUHJvdG8oai5nZXRCYWNrZ3JvdW5kKCkpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChVaWRQcm90by5Kb2JDb21wbGV0aW9uIGpjIDogdS5nZXRKb2JDb21wbGV0aW9uTGlzdCgpKSB7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGpjLmdldE5hbWUoKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShqYy5nZXROYW1lKCkuaXNFbXB0eSgpKTsKKworICAgICAgICAgICAgZm9yIChVaWRQcm90by5Kb2JDb21wbGV0aW9uLlJlYXNvbkNvdW50IHJjIDogamMuZ2V0UmVhc29uQ291bnRMaXN0KCkpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKDAgPD0gcmMuZ2V0Q291bnQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBVaWRQcm90by5OZXR3b3JrIG4gPSB1LmdldE5ldHdvcmsoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IG4uZ2V0TW9iaWxlQnl0ZXNSeCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IG4uZ2V0TW9iaWxlQnl0ZXNUeCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IG4uZ2V0V2lmaUJ5dGVzUngoKSk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBuLmdldFdpZmlCeXRlc1R4KCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gbi5nZXRCdEJ5dGVzUngoKSk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBuLmdldEJ0Qnl0ZXNUeCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IG4uZ2V0TW9iaWxlUGFja2V0c1J4KCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gbi5nZXRNb2JpbGVQYWNrZXRzVHgoKSk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBuLmdldFdpZmlQYWNrZXRzUngoKSk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBuLmdldFdpZmlQYWNrZXRzVHgoKSk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBuLmdldE1vYmlsZUFjdGl2ZUR1cmF0aW9uTXMoKSk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBuLmdldE1vYmlsZUFjdGl2ZUNvdW50KCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gbi5nZXRNb2JpbGVXYWtldXBDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IG4uZ2V0V2lmaVdha2V1cENvdW50KCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gbi5nZXRNb2JpbGVCeXRlc0JnUngoKSk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBuLmdldE1vYmlsZUJ5dGVzQmdUeCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IG4uZ2V0V2lmaUJ5dGVzQmdSeCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IG4uZ2V0V2lmaUJ5dGVzQmdUeCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IG4uZ2V0TW9iaWxlUGFja2V0c0JnUngoKSk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBuLmdldE1vYmlsZVBhY2tldHNCZ1R4KCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gbi5nZXRXaWZpUGFja2V0c0JnUngoKSk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBuLmdldFdpZmlQYWNrZXRzQmdUeCgpKTsKKworICAgICAgICBVaWRQcm90by5Qb3dlclVzZUl0ZW0gcHVpID0gdS5nZXRQb3dlclVzZUl0ZW0oKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IHB1aS5nZXRDb21wdXRlZFBvd2VyTWFoKCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gcHVpLmdldFNjcmVlblBvd2VyTWFoKCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gcHVpLmdldFByb3BvcnRpb25hbFNtZWFyTWFoKCkpOworCisgICAgICAgIGZvciAoVWlkUHJvdG8uUHJvY2VzcyBwIDogdS5nZXRQcm9jZXNzTGlzdCgpKSB7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHAuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKHAuZ2V0TmFtZSgpLmlzRW1wdHkoKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKDAgPD0gcC5nZXRVc2VyRHVyYXRpb25NcygpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlByb2Nlc3Mgc3lzdGVtIGR1cmF0aW9uIGlzIG5lZ2F0aXZlOiAiICsgcC5nZXRTeXN0ZW1EdXJhdGlvbk1zKCksCisgICAgICAgICAgICAgICAgICAgIDAgPD0gcC5nZXRTeXN0ZW1EdXJhdGlvbk1zKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IHAuZ2V0Rm9yZWdyb3VuZER1cmF0aW9uTXMoKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKDAgPD0gcC5nZXRTdGFydENvdW50KCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IHAuZ2V0QW5yQ291bnQoKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKDAgPD0gcC5nZXRDcmFzaENvdW50KCkpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChVaWRQcm90by5TdGF0ZVRpbWUgc3QgOiB1LmdldFN0YXRlc0xpc3QoKSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShVaWRQcm90by5TdGF0ZVRpbWUuU3RhdGUuZ2V0RGVzY3JpcHRvcigpLmdldFZhbHVlcygpCisgICAgICAgICAgICAgICAgICAgIC5jb250YWlucyhzdC5nZXRTdGF0ZSgpLmdldFZhbHVlRGVzY3JpcHRvcigpKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKDAgPD0gc3QuZ2V0RHVyYXRpb25NcygpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoVWlkUHJvdG8uU2Vuc29yIHMgOiB1LmdldFNlbnNvcnNMaXN0KCkpIHsKKyAgICAgICAgICAgIHRlc3RUaW1lclByb3RvKHMuZ2V0QXBwb3J0aW9uZWQoKSk7CisgICAgICAgICAgICB0ZXN0VGltZXJQcm90byhzLmdldEJhY2tncm91bmQoKSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKFVpZFByb3RvLlN5bmMgcyA6IHUuZ2V0U3luY3NMaXN0KCkpIHsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKHMuZ2V0TmFtZSgpLmlzRW1wdHkoKSk7CisKKyAgICAgICAgICAgIHRlc3RUaW1lclByb3RvKHMuZ2V0VG90YWwoKSk7CisgICAgICAgICAgICB0ZXN0VGltZXJQcm90byhzLmdldEJhY2tncm91bmQoKSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKFVpZFByb3RvLlVzZXJBY3Rpdml0eSB1YSA6IHUuZ2V0VXNlckFjdGl2aXR5TGlzdCgpKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKDAgPD0gdWEuZ2V0Q291bnQoKSk7CisgICAgICAgIH0KKworICAgICAgICBVaWRQcm90by5BZ2dyZWdhdGVkV2FrZWxvY2sgYXcgPSB1LmdldEFnZ3JlZ2F0ZWRXYWtlbG9jaygpOworICAgICAgICBsb25nIGF3UGFydGlhbCA9IGF3LmdldFBhcnRpYWxEdXJhdGlvbk1zKCk7CisgICAgICAgIGxvbmcgYXdCZ1BhcnRpYWwgPSBhdy5nZXRCYWNrZ3JvdW5kUGFydGlhbER1cmF0aW9uTXMoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IGF3QmdQYXJ0aWFsKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShhd0JnUGFydGlhbCA8PSBhd1BhcnRpYWwpOworCisgICAgICAgIGZvciAoVWlkUHJvdG8uV2FrZWxvY2sgdyA6IHUuZ2V0V2FrZWxvY2tzTGlzdCgpKSB7CisgICAgICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5LCBhcHBzIGNhbiBsZWdpdGltYXRlbHkgcGFzcyBhbiBlbXB0eSBzdHJpbmcgYXMgdGhlIHdha2Vsb2NrIG5hbWUsIHNvIHdlCisgICAgICAgICAgICAvLyBjYW4ndCBndWFyYW50ZWUgdGhhdCB3YWtlbG9jayBuYW1lcyB3aWxsIGJlIG5vbi1lbXB0eS4KKyAgICAgICAgICAgIHRlc3RUaW1lclByb3RvKHcuZ2V0RnVsbCgpKTsKKyAgICAgICAgICAgIHRlc3RUaW1lclByb3RvKHcuZ2V0UGFydGlhbCgpKTsKKyAgICAgICAgICAgIHRlc3RUaW1lclByb3RvKHcuZ2V0QmFja2dyb3VuZFBhcnRpYWwoKSk7CisgICAgICAgICAgICB0ZXN0VGltZXJQcm90byh3LmdldFdpbmRvdygpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoVWlkUHJvdG8uV2FrZXVwQWxhcm0gd2EgOiB1LmdldFdha2V1cEFsYXJtTGlzdCgpKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKDAgPD0gd2EuZ2V0Q291bnQoKSk7CisgICAgICAgIH0KKworICAgICAgICBVaWRQcm90by5XaWZpIHcgPSB1LmdldFdpZmkoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IHcuZ2V0RnVsbFdpZmlMb2NrRHVyYXRpb25NcygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IHcuZ2V0UnVubmluZ0R1cmF0aW9uTXMoKSk7CisgICAgICAgIHRlc3RUaW1lclByb3RvKHcuZ2V0QXBwb3J0aW9uZWRTY2FuKCkpOworICAgICAgICB0ZXN0VGltZXJQcm90byh3LmdldEJhY2tncm91bmRTY2FuKCkpOworCisgICAgICAgIHRlc3RUaW1lclByb3RvKHUuZ2V0V2lmaU11bHRpY2FzdFdha2Vsb2NrKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvQmF0dGVyeVN0YXRzVmFsaWRhdGlvblRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvQmF0dGVyeVN0YXRzVmFsaWRhdGlvblRlc3QuamF2YQppbmRleCAxZmNiZjkxLi5iYmRjYjA4IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2luY2lkZW50L3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY3RzL0JhdHRlcnlTdGF0c1ZhbGlkYXRpb25UZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9CYXR0ZXJ5U3RhdHNWYWxpZGF0aW9uVGVzdC5qYXZhCkBAIC0xNSwxNCArMTUsOSBAQAogICovCiBwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlci5jdHM7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuSVNoZWxsT3V0cHV0UmVjZWl2ZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQubG9nLkxvZ1V0aWw7CiAKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkNoYXJzZXRzOwotCiBpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKIAogLyoqCiAgKiBUZXN0IGZvciAiZHVtcHN5cyBiYXR0ZXJ5c3RhdHMgLWMKQEAgLTQ5LDE4ICs0NCwxNyBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVfQkxVRVRPT1RIX0xFID0gImFuZHJvaWQuaGFyZHdhcmUuYmx1ZXRvb3RoX2xlIjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX0xFQU5CQUNLX09OTFkgPSAiYW5kcm9pZC5zb2Z0d2FyZS5sZWFuYmFja19vbmx5IjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX0xPQ0FUSU9OX0dQUyA9ICJhbmRyb2lkLmhhcmR3YXJlLmxvY2F0aW9uLmdwcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVBVFVSRV9XSUZJID0gImFuZHJvaWQuaGFyZHdhcmUud2lmaSI7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfVElNRV9UT1BfSU5ERVggPSA0OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9USU1FX0ZPUkVHUk9VTkRfU0VSVklDRV9JTkRFWCA9IDU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1RJTUVfRk9SRUdST1VORF9JTkRFWCA9IDc7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1RJTUVfQkFDS0dST1VORF9JTkRFWCA9IDg7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1RJTUVfQ0FDSEVEX0lOREVYID0gOTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfVElNRV9GT1JFR1JPVU5EX0lOREVYID0gNjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfVElNRV9CQUNLR1JPVU5EX0lOREVYID0gNzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfVElNRV9DQUNIRURfSU5ERVggPSAxMDsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVElNRV9TUEVOVF9JTl9UT1AgPSAyMDAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVElNRV9TUEVOVF9JTl9GT1JFR1JPVU5EID0gNDAwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFRJTUVfU1BFTlRfSU5fRk9SRUdST1VORCA9IDIwMDA7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBUSU1FX1NQRU5UX0lOX0JBQ0tHUk9VTkQgPSAyMDAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVElNRV9TUEVOVF9JTl9DQUNIRUQgPSA0MDAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVElNRV9TUEVOVF9JTl9DQUNIRUQgPSAyMDAwOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgU0NSRUVOX1NUQVRFX0NIQU5HRV9USU1FT1VUID0gNDAwMDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFNDUkVFTl9TVEFURV9QT0xMSU5HX0lOVEVSVkFMID0gNTAwOwogCkBAIC03MSw3ICs2NSw2IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0dQUyA9ICJhY3Rpb24uZ3BzIjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fSk9CX1NDSEVEVUxFID0gImFjdGlvbi5qb2JzIjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fU1lOQyA9ICJhY3Rpb24uc3luYyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1dJRklfU0NBTiA9ICJhY3Rpb24ud2lmaV9zY2FuIjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fU0xFRVBfV0hJTEVfQkFDS0dST1VORCA9ICJhY3Rpb24uc2xlZXBfYmFja2dyb3VuZCI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1NMRUVQX1dISUxFX1RPUCA9ICJhY3Rpb24uc2xlZXBfdG9wIjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fU0hPV19BUFBMSUNBVElPTl9PVkVSTEFZID0gImFjdGlvbi5zaG93X2FwcGxpY2F0aW9uX292ZXJsYXkiOwpAQCAtNzksNiArNzIsOSBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9SRVFVRVNUX0NPREUgPSAicmVxdWVzdF9jb2RlIjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCR19WU19GR19UQUcgPSAiQmF0dGVyeVN0YXRzQmdWc0ZnQWN0aW9ucyI7CiAKKyAgICAvLyBDb25zdGFudHMgZnJvbSBCYXR0ZXJ5TWFuZ2FnZXIuCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkFUVEVSWV9TVEFUVVNfRElTQ0hBUkdJTkcgPSAzOworCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgc3VwZXIuc2V0VXAoKTsKQEAgLTExNiwxMSArMTEyLDEzIEBACiAKICAgICBwcm90ZWN0ZWQgdm9pZCBiYXR0ZXJ5T25TY3JlZW5PbigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBnZXREZXZpY2UoKS5leGVjdXRlU2hlbGxDb21tYW5kKCJkdW1wc3lzIGJhdHRlcnkgdW5wbHVnIik7CisgICAgICAgIGdldERldmljZSgpLmV4ZWN1dGVTaGVsbENvbW1hbmQoImR1bXBzeXMgYmF0dGVyeSBzZXQgc3RhdHVzICIgKyBCQVRURVJZX1NUQVRVU19ESVNDSEFSR0lORyk7CiAgICAgICAgIGdldERldmljZSgpLmV4ZWN1dGVTaGVsbENvbW1hbmQoImR1bXBzeXMgYmF0dGVyeXN0YXRzIGRpc2FibGUgcHJldGVuZC1zY3JlZW4tb2ZmIik7CiAgICAgfQogCiAgICAgcHJvdGVjdGVkIHZvaWQgYmF0dGVyeU9uU2NyZWVuT2ZmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGdldERldmljZSgpLmV4ZWN1dGVTaGVsbENvbW1hbmQoImR1bXBzeXMgYmF0dGVyeSB1bnBsdWciKTsKKyAgICAgICAgZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZCgiZHVtcHN5cyBiYXR0ZXJ5IHNldCBzdGF0dXMgIiArIEJBVFRFUllfU1RBVFVTX0RJU0NIQVJHSU5HKTsKICAgICAgICAgZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZCgiZHVtcHN5cyBiYXR0ZXJ5c3RhdHMgZW5hYmxlIHByZXRlbmQtc2NyZWVuLW9mZiIpOwogICAgIH0KIApAQCAtMjY0LDcgKzI2Miw3IEBACiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXlndWFyZFN0YXRlTGluZXMgJiYgbGluZS5jb250YWlucygic2hvd2luZz0iKSkgewogICAgICAgICAgICAgICAgICAgICBzY3JlZW5Bd2FrZSAmPSBsaW5lLnRyaW0oKS5lbmRzV2l0aCgiZmFsc2UiKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleWd1YXJkU3RhdGVMaW5lcyAmJiBsaW5lLmNvbnRhaW5zKCJzY3JlZW5TdGF0ZT0iKSkgewotICAgICAgICAgICAgICAgICAgICBzY3JlZW5Bd2FrZSAmPSBsaW5lLnRyaW0oKS5lbmRzV2l0aCgiMiIpOworICAgICAgICAgICAgICAgICAgICBzY3JlZW5Bd2FrZSAmPSBsaW5lLnRyaW0oKS5lbmRzV2l0aCgiU0NSRUVOX1NUQVRFX09OIik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNDUkVFTl9TVEFURV9QT0xMSU5HX0lOVEVSVkFMKTsKQEAgLTI3OSw2ICsyNzcsOCBAQAogCiAgICAgICAgIGJhdHRlcnlPblNjcmVlbk9mZigpOwogICAgICAgICBpbnN0YWxsUGFja2FnZShERVZJQ0VfU0lERV9URVNUX0FQSywgdHJ1ZSk7CisgICAgICAgIHR1cm5TY3JlZW5PbkZvclJlYWwoKTsKKyAgICAgICAgYXNzZXJ0U2NyZWVuT24oKTsKIAogICAgICAgICAvLyBCYWNrZ3JvdW5kIHRlc3QuCiAgICAgICAgIGV4ZWN1dGVCYWNrZ3JvdW5kKEFDVElPTl9CTEVfU0NBTl9VTk9QVElNSVpFRCwgNDBfMDAwKTsKQEAgLTMwMCw3ICszMDAsOCBAQAogICAgICAgICB9CiAgICAgICAgIGJhdHRlcnlPblNjcmVlbk9mZigpOwogICAgICAgICBpbnN0YWxsUGFja2FnZShERVZJQ0VfU0lERV9URVNUX0FQSywgdHJ1ZSk7Ci0KKyAgICAgICAgdHVyblNjcmVlbk9uRm9yUmVhbCgpOworICAgICAgICBhc3NlcnRTY3JlZW5PbigpOwogICAgICAgICAvLyBCbGUgc2NhbiB0aW1lIGluIEJhdHRlcnlTdGF0c0JnVnNGZ0FjdGlvbnMgaXMgMiBzZWNvbmRzLCBidXQgYmUgbGVuaWVudC4KICAgICAgICAgZmluYWwgaW50IG1pblRpbWUgPSAxNTAwOyAvLyBtaW4gc2luZ2xlIHNjYW4gdGltZSBpbiBtcwogICAgICAgICBmaW5hbCBpbnQgbWF4VGltZSA9IDMwMDA7IC8vIG1heCBzaW5nbGUgc2NhbiB0aW1lIGluIG1zCkBAIC0zNzcsNiArMzc4LDkgQEAKICAgICAgICAgfQogICAgICAgICBiYXR0ZXJ5T25TY3JlZW5PZmYoKTsKICAgICAgICAgaW5zdGFsbFBhY2thZ2UoREVWSUNFX1NJREVfVEVTVF9BUEssIHRydWUpOworICAgICAgICB0dXJuU2NyZWVuT25Gb3JSZWFsKCk7CisgICAgICAgIGFzc2VydFNjcmVlbk9uKCk7CisgICAgICAgIGFsbG93SW1tZWRpYXRlU3luY3MoKTsKIAogICAgICAgICAvLyBCYWNrZ3JvdW5kIHRlc3QuCiAgICAgICAgIGV4ZWN1dGVCYWNrZ3JvdW5kKEFDVElPTl9KT0JfU0NIRURVTEUsIDYwXzAwMCk7CkBAIC0zOTcsNiArNDAxLDkgQEAKICAgICAgICAgfQogICAgICAgICBiYXR0ZXJ5T25TY3JlZW5PZmYoKTsKICAgICAgICAgaW5zdGFsbFBhY2thZ2UoREVWSUNFX1NJREVfVEVTVF9BUEssIHRydWUpOworICAgICAgICB0dXJuU2NyZWVuT25Gb3JSZWFsKCk7CisgICAgICAgIGFzc2VydFNjcmVlbk9uKCk7CisgICAgICAgIGFsbG93SW1tZWRpYXRlU3luY3MoKTsKIAogICAgICAgICAvLyBCYWNrZ3JvdW5kIHRlc3QuCiAgICAgICAgIGV4ZWN1dGVCYWNrZ3JvdW5kKEFDVElPTl9TWU5DLCA2MF8wMDApOwpAQCAtNDEyLDM0ICs0MTksNiBAQAogICAgICAgICBiYXR0ZXJ5T2ZmU2NyZWVuT24oKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2lmaVNjYW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChpc1RWKCkgfHwgIWhhc0ZlYXR1cmUoRkVBVFVSRV9XSUZJLCB0cnVlKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgYmF0dGVyeU9uU2NyZWVuT2ZmKCk7Ci0gICAgICAgIGluc3RhbGxQYWNrYWdlKERFVklDRV9TSURFX1RFU1RfQVBLLCB0cnVlKTsKLSAgICAgICAgLy8gV2hpdGVsaXN0IHRoaXMgYXBwIGFnYWluc3QgYmFja2dyb3VuZCB3aWZpIHNjYW4gdGhyb3R0bGluZwotICAgICAgICBnZXREZXZpY2UoKS5leGVjdXRlU2hlbGxDb21tYW5kKFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgInNldHRpbmdzIHB1dCBnbG9iYWwgd2lmaV9zY2FuX2JhY2tncm91bmRfdGhyb3R0bGVfcGFja2FnZV93aGl0ZWxpc3QgJXMiLAotICAgICAgICAgICAgICAgIERFVklDRV9TSURFX1RFU1RfUEFDS0FHRSkpOwotCi0gICAgICAgIC8vIEJhY2tncm91bmQgY291bnQgdGVzdC4KLSAgICAgICAgZXhlY3V0ZUJhY2tncm91bmQoQUNUSU9OX1dJRklfU0NBTiwgMTIwXzAwMCk7Ci0gICAgICAgIC8vIEFsbG93IG9uZSBvciB0d28gc2NhbnMgYmVjYXVzZSB3ZSB0cnkgc2Nhbm5pbmcgdHdpY2UgYW5kIGJlY2F1c2Ugd2UgYWxsb3cgZm9yIHRoZQotICAgICAgICAvLyBwb3NzaWJpbGl0eSB0aGF0LCB3aGVuIHRoZSB0ZXN0IGlzIHN0YXJ0ZWQsIGEgc2NhbiBmcm9tIGEgZGlmZmVyZW50IHVpZCB3YXMgYWxyZWFkeSBiZWluZwotICAgICAgICAvLyBwZXJmb3JtZWQgKGNhdXNpbmcgdGhlIHRlc3QgdG8gJ21pc3MnIGEgc2NhbikuCi0gICAgICAgIGFzc2VydFZhbHVlUmFuZ2UoIndmbCIsICIiLCA3LCAxLCAyKTsgLy8gc2Nhbl9jb3VudAotICAgICAgICBhc3NlcnRWYWx1ZVJhbmdlKCJ3ZmwiLCAiIiwgMTEsIDEsIDIpOyAvLyBzY2FuX2NvdW50X2JnCi0KLSAgICAgICAgLy8gRm9yZWdyb3VuZCBjb3VudCB0ZXN0LgotICAgICAgICBleGVjdXRlRm9yZWdyb3VuZChBQ1RJT05fV0lGSV9TQ0FOLCAxMjBfMDAwKTsKLSAgICAgICAgYXNzZXJ0VmFsdWVSYW5nZSgid2ZsIiwgIiIsIDcsIDIsIDQpOyAvLyBzY2FuX2NvdW50Ci0gICAgICAgIGFzc2VydFZhbHVlUmFuZ2UoIndmbCIsICIiLCAxMSwgMSwgMik7IC8vIHNjYW5fY291bnRfYmcKLQotICAgICAgICBiYXR0ZXJ5T2ZmU2NyZWVuT24oKTsKLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBUZXN0cyB3aGV0aGVyIHRoZSBvbi1iYXR0ZXJ5IHJlYWx0aW1lIGFuZCB0b3RhbCByZWFsdGltZSB2YWx1ZXMKICAgICAgKiBhcmUgcHJvcGVybHkgdXBkYXRlZCBpbiBiYXR0ZXJ5IHN0YXRzLgpAQCAtNDczLDYgKzQ1Miw3IEBACiAgICAgICAgIGJhdHRlcnlPblNjcmVlbk9mZigpOwogCiAgICAgICAgIGluc3RhbGxQYWNrYWdlKERFVklDRV9TSURFX1RFU1RfQVBLLCB0cnVlKTsKKyAgICAgICAgYWxsb3dJbW1lZGlhdGVTeW5jcygpOwogCiAgICAgICAgIHJ1bkRldmljZVRlc3RzKERFVklDRV9TSURFX1RFU1RfUEFDS0FHRSwgIi5CYXR0ZXJ5U3RhdHNKb2JEdXJhdGlvblRlc3RzIiwKICAgICAgICAgICAgICAgICAidGVzdEpvYkR1cmF0aW9uIik7CkBAIC00OTAsNiArNDcwLDcgQEAKICAgICAgICAgYmF0dGVyeU9uU2NyZWVuT2ZmKCk7CiAKICAgICAgICAgaW5zdGFsbFBhY2thZ2UoREVWSUNFX1NJREVfVEVTVF9BUEssIHRydWUpOworICAgICAgICBhbGxvd0ltbWVkaWF0ZVN5bmNzKCk7CiAKICAgICAgICAgcnVuRGV2aWNlVGVzdHMoREVWSUNFX1NJREVfVEVTVF9QQUNLQUdFLCAiLkJhdHRlcnlTdGF0c1N5bmNUZXN0IiwgInRlc3RSdW5TeW5jcyIpOwogCkBAIC01MTQsNyArNDk1LDcgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgYXNzZXJ0QXBwcm94aW1hdGVUaW1lSW5TdGF0ZShpbnQgaW5kZXgsIGxvbmcgZHVyYXRpb24pIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRWYWx1ZVJhbmdlKCJzdCIsICIiLCBpbmRleCwgKGxvbmcpICgwLjggKiBkdXJhdGlvbiksIDIgKiBkdXJhdGlvbik7CisgICAgICAgIGFzc2VydFZhbHVlUmFuZ2UoInN0IiwgIiIsIGluZGV4LCAobG9uZykgKDAuNyAqIGR1cmF0aW9uKSwgMiAqIGR1cmF0aW9uKTsKICAgICB9CiAKICAgICAvKioKQEAgLTU5NCw2ICs1NzUsMTIgQEAKICAgICAgICAgICAgICAgICAiY21kIGRldmljZWlkbGUgdGVtcHdoaXRlbGlzdCAlcyIsIERFVklDRV9TSURFX1RFU1RfUEFDS0FHRSkpOwogICAgIH0KIAorICAgIC8qKiBNYWtlIHRoZSB0ZXN0LWFwcCBzdGFuZGJ5LWFjdGl2ZSBzbyBpdCBjYW4gcnVuIHN5bmNzIGFuZCBqb2JzIGltbWVkaWF0ZWx5LiAqLworICAgIHByb3RlY3RlZCB2b2lkIGFsbG93SW1tZWRpYXRlU3luY3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZCgiYW0gc2V0LXN0YW5kYnktYnVja2V0ICIKKyAgICAgICAgICAgICAgICArIERFVklDRV9TSURFX1RFU1RfUEFDS0FHRSArICIgYWN0aXZlIik7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogUnVucyBhbiBhY3Rpdml0eSAoaW4gdGhlIGZvcmVncm91bmQpIHRvIHBlcmZvcm0gdGhlIGdpdmVuIGFjdGlvbiwgYW5kIHdhaXRzCiAgICAgICogZm9yIHRoZSBkZXZpY2UgdG8gcmVwb3J0IHRoYXQgdGhlIGFjdGlvbiBoYXMgZmluaXNoZWQgKHZpYSBhIGxvZ2NhdCBtZXNzYWdlKSBiZWZvcmUgcmV0dXJuaW5nLgpAQCAtNjM3LDY0ICs2MjQsNiBAQAogICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiQ29tcGxldGVkIHBlcmZvcm1pbmcgJXMgZm9yIHJlcXVlc3QgJXMiLCBhY3Rpb25WYWx1ZSwgcmVxdWVzdENvZGUpOwogICAgIH0KIAotICAgIC8qKgotICAgICogUnVucyBsb2djYXQgYW5kIHdhaXRzIChmb3IgYSBtYXhpbXVtdW0gb2YgbWF4VGltZU1zKSB1bnRpbCB0aGUgZGVzaXJlZCB0ZXh0IGlzIGRpc3BsYXllZCB3aXRoCi0gICAgKiB0aGUgZ2l2ZW4gdGFnLgotICAgICogTG9nY2F0IGlzIG5vdCBjbGVhcmVkLCBzbyBtYWtlIHN1cmUgdGhhdCB0ZXh0IGlzIHVuaXF1ZSAod29uJ3QgZ2V0IGZhbHNlIGhpdHMgZnJvbSBvbGQgZGF0YSkuCi0gICAgKiBOb3RlIHRoYXQsIGluIHByYWN0aWNlLCB0aGUgYWN0dWFsIG1heCB3YWl0IHRpbWUgc2VlbXMgdG8gYmUgYWJvdXQgMTBzIGxvbmdlciB0aGFuIG1heFRpbWVNcy4KLSAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjaGVja0xvZ2NhdEZvclRleHQoU3RyaW5nIGxvZ2NhdFRhZywgU3RyaW5nIHRleHQsIGludCBtYXhUaW1lTXMpIHsKLSAgICAgICAgSVNoZWxsT3V0cHV0UmVjZWl2ZXIgcmVjZWl2ZXIgPSBuZXcgSVNoZWxsT3V0cHV0UmVjZWl2ZXIoKSB7Ci0gICAgICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZ0J1aWxkZXIgbU91dHB1dEJ1ZmZlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICBwcml2YXRlIGZpbmFsIEF0b21pY0Jvb2xlYW4gbUlzQ2FuY2VsZWQgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgYWRkT3V0cHV0KGJ5dGVbXSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFpc0NhbmNlbGxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobU91dHB1dEJ1ZmZlcikgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHMgPSBuZXcgU3RyaW5nKGRhdGEsIG9mZnNldCwgbGVuZ3RoLCBDaGFyc2V0cy5VVEZfOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0QnVmZmVyLmFwcGVuZChzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGVja0J1ZmZlckZvclRleHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Jc0NhbmNlbGVkLnNldCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrQnVmZmVyRm9yVGV4dCgpIHsKLSAgICAgICAgICAgICAgICBpZiAobU91dHB1dEJ1ZmZlci5pbmRleE9mKHRleHQpID4gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZGVsZXRlIGFsbCBvbGQgZGF0YSAoZXhjZXB0IHRoZSBsYXN0IGZldyBjaGFycykgc2luY2UgdGhleSBkb24ndCBjb250YWluIHRleHQKLSAgICAgICAgICAgICAgICAgICAgLy8gKHByZXN1bWFibHkgbGFyZ2UgY2h1bmtzIG9mIGRhdGEgd2lsbCBiZSBhZGRlZCBhdCBhIHRpbWUsIHNvIHRoaXMgaXMKLSAgICAgICAgICAgICAgICAgICAgLy8gc3VmZmljaWVudGx5IGVmZmljaWVudC4pCi0gICAgICAgICAgICAgICAgICAgIGludCBuZXdTdGFydCA9IG1PdXRwdXRCdWZmZXIubGVuZ3RoKCkgLSB0ZXh0Lmxlbmd0aCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmV3U3RhcnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0QnVmZmVyLmRlbGV0ZSgwLCBuZXdTdGFydCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGxlZCgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUlzQ2FuY2VsZWQuZ2V0KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgZmx1c2goKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIFdhaXQgZm9yIGF0IG1vc3QgbWF4VGltZU1zIGZvciBsb2djYXQgdG8gZGlzcGxheSB0aGUgZGVzaXJlZCB0ZXh0LgotICAgICAgICAgICAgZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZChTdHJpbmcuZm9ybWF0KCJsb2djYXQgLXMgJXMgLWUgJyVzJyIsIGxvZ2NhdFRhZywgdGV4dCksCi0gICAgICAgICAgICAgICAgICAgIHJlY2VpdmVyLCBtYXhUaW1lTXMsIFRpbWVVbml0Lk1JTExJU0VDT05EUywgMCk7Ci0gICAgICAgIH0gY2F0Y2ggKGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5EZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKGUpOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgLyoqIERldGVybWluZSBpZiBkZXZpY2UgaXMganVzdCBhIFRWIGFuZCBpcyBub3QgZXhwZWN0ZWQgdG8gaGF2ZSBwcm9wZXIgYmF0dGVyeXN0YXRzLiAqLwogICAgIHByaXZhdGUgYm9vbGVhbiBpc1RWKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBoYXNGZWF0dXJlKEZFQVRVUkVfTEVBTkJBQ0tfT05MWSwgZmFsc2UpOwpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9EaXNrU3RhdHNQcm90b1Rlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvRGlza1N0YXRzUHJvdG9UZXN0LmphdmEKaW5kZXggMTlhNmE4OS4uMWI5ZWRlZSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9EaXNrU3RhdHNQcm90b1Rlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2luY2lkZW50L3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY3RzL0Rpc2tTdGF0c1Byb3RvVGVzdC5qYXZhCkBAIC0xNiw4ICsxNiwxMSBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlci5jdHM7CiAKK2ltcG9ydCBhbmRyb2lkLnNlcnZpY2UuZGlza3N0YXRzLkRpc2tTdGF0c0FwcFNpemVzUHJvdG87CitpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLmRpc2tzdGF0cy5EaXNrU3RhdHNDYWNoZWRWYWx1ZXNQcm90bzsKIGltcG9ydCBhbmRyb2lkLnNlcnZpY2UuZGlza3N0YXRzLkRpc2tTdGF0c0ZyZWVTcGFjZVByb3RvOwogaW1wb3J0IGFuZHJvaWQuc2VydmljZS5kaXNrc3RhdHMuRGlza1N0YXRzU2VydmljZUR1bXBQcm90bzsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuSVRlc3REZXZpY2U7CiAKIC8qKgogICogVGVzdCBwcm90byBkdW1wIG9mIGRpc2tzdGF0cwpAQCAtMzIsMTkgKzM1LDY2IEBACiAgICAgICAgIGZpbmFsIERpc2tTdGF0c1NlcnZpY2VEdW1wUHJvdG8gZHVtcCA9IGdldER1bXAoRGlza1N0YXRzU2VydmljZUR1bXBQcm90by5wYXJzZXIoKSwKICAgICAgICAgICAgICAgICAiZHVtcHN5cyBkaXNrc3RhdHMgLS1wcm90byIpOwogCisgICAgICAgIHZlcmlmeURpc2tTdGF0c1NlcnZpY2VEdW1wUHJvdG8oZHVtcCwgUFJJVkFDWV9OT05FLCBnZXREZXZpY2UoKSk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgdmVyaWZ5RGlza1N0YXRzU2VydmljZUR1bXBQcm90byhEaXNrU3RhdHNTZXJ2aWNlRHVtcFByb3RvIGR1bXAsIGZpbmFsIGludCBmaWx0ZXJMZXZlbCwgSVRlc3REZXZpY2UgZGV2aWNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gQXQgbGVhc3Qgb25lIHBhcnRpdGlvbiBsaXN0ZWQKICAgICAgICAgYXNzZXJ0VHJ1ZShkdW1wLmdldFBhcnRpdGlvbnNGcmVlU3BhY2VDb3VudCgpID4gMCk7CiAgICAgICAgIC8vIFRlc3QgbGF0ZW5jeQogICAgICAgICBib29sZWFuIHRlc3RFcnJvciA9IGR1bXAuZ2V0SGFzVGVzdEVycm9yKCk7CiAgICAgICAgIGlmICh0ZXN0RXJyb3IpIHsKICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZHVtcC5nZXRFcnJvck1lc3NhZ2UoKSk7CisgICAgICAgICAgICBpZiAoZmlsdGVyTGV2ZWwgPT0gUFJJVkFDWV9BVVRPKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShkdW1wLmdldEVycm9yTWVzc2FnZSgpLmlzRW1wdHkoKSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBhc3NlcnRUcnVlKGR1bXAuZ2V0V3JpdGU1MTJCTGF0ZW5jeU1pbGxpcygpIDwgMTAwKTsgLy8gTGVzcyB0aGFuIDEwMG1zCiAgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZShkdW1wLmdldFdyaXRlNTEyQkxhdGVuY3lNaWxsaXMoKSA+PSAwKTsgLy8gTm9uLW5lZ2F0aXZlCisgICAgICAgIGFzc2VydFRydWUoZHVtcC5nZXRCZW5jaG1hcmtlZFdyaXRlU3BlZWRLYnBzKCkgPj0gMCk7IC8vIE5vbi1uZWdhdGl2ZQorCisgICAgICAgIGZvciAoRGlza1N0YXRzRnJlZVNwYWNlUHJvdG8gZHNmcyA6IGR1bXAuZ2V0UGFydGl0aW9uc0ZyZWVTcGFjZUxpc3QoKSkgeworICAgICAgICAgICAgdmVyaWZ5RGlza1N0YXRzRnJlZVNwYWNlUHJvdG8oZHNmcyk7CisgICAgICAgIH0KKwogICAgICAgICBEaXNrU3RhdHNTZXJ2aWNlRHVtcFByb3RvLkVuY3J5cHRpb25UeXBlIGVuY3J5cHRpb25UeXBlID0gZHVtcC5nZXRFbmNyeXB0aW9uKCk7Ci0gICAgICAgIGlmICgiZmlsZSIuZXF1YWxzKGdldERldmljZSgpLmdldFByb3BlcnR5KCJyby5jcnlwdG8udHlwZSIpKSkgeworICAgICAgICBpZiAoImZpbGUiLmVxdWFscyhkZXZpY2UuZ2V0UHJvcGVydHkoInJvLmNyeXB0by50eXBlIikpKSB7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoRGlza1N0YXRzU2VydmljZUR1bXBQcm90by5FbmNyeXB0aW9uVHlwZS5FTkNSWVBUSU9OX0ZJTEVfQkFTRUQsCiAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25UeXBlKTsKICAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKERpc2tTdGF0c1NlcnZpY2VEdW1wUHJvdG8uRW5jcnlwdGlvblR5cGUuZ2V0RGVzY3JpcHRvcigpLmdldFZhbHVlcygpCisgICAgICAgICAgICAgICAgLmNvbnRhaW5zKGVuY3J5cHRpb25UeXBlLmdldFZhbHVlRGVzY3JpcHRvcigpKSk7CisKKyAgICAgICAgdmVyaWZ5RGlza1N0YXRzQ2FjaGVkVmFsdWVzUHJvdG8oZHVtcC5nZXRDYWNoZWRGb2xkZXJTaXplcygpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZlcmlmeURpc2tTdGF0c0FwcFNpemVzUHJvdG8oRGlza1N0YXRzQXBwU2l6ZXNQcm90byBkc2FzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkc2FzLmdldEFwcFNpemVLYigpID49IDApOworICAgICAgICBhc3NlcnRUcnVlKGRzYXMuZ2V0Q2FjaGVTaXplS2IoKSA+PSAwKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkc2FzLmdldEFwcERhdGFTaXplS2IoKSA+PSAwKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZlcmlmeURpc2tTdGF0c0NhY2hlZFZhbHVlc1Byb3RvKERpc2tTdGF0c0NhY2hlZFZhbHVlc1Byb3RvIGRzY3YpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRUcnVlKGRzY3YuZ2V0QWdnQXBwc1NpemVLYigpID49IDApOworICAgICAgICBhc3NlcnRUcnVlKGRzY3YuZ2V0QWdnQXBwc0NhY2hlU2l6ZUtiKCkgPj0gMCk7CisgICAgICAgIGFzc2VydFRydWUoZHNjdi5nZXRQaG90b3NTaXplS2IoKSA+PSAwKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkc2N2LmdldFZpZGVvc1NpemVLYigpID49IDApOworICAgICAgICBhc3NlcnRUcnVlKGRzY3YuZ2V0QXVkaW9TaXplS2IoKSA+PSAwKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkc2N2LmdldERvd25sb2Fkc1NpemVLYigpID49IDApOworICAgICAgICBhc3NlcnRUcnVlKGRzY3YuZ2V0U3lzdGVtU2l6ZUtiKCkgPj0gMCk7CisgICAgICAgIGFzc2VydFRydWUoZHNjdi5nZXRPdGhlclNpemVLYigpID49IDApOworICAgICAgICBhc3NlcnRUcnVlKGRzY3YuZ2V0QWdnQXBwc0RhdGFTaXplS2IoKSA+PSAwKTsKKworICAgICAgICBmb3IgKERpc2tTdGF0c0FwcFNpemVzUHJvdG8gZHNhcyA6IGRzY3YuZ2V0QXBwU2l6ZXNMaXN0KCkpIHsKKyAgICAgICAgICAgIHZlcmlmeURpc2tTdGF0c0FwcFNpemVzUHJvdG8oZHNhcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZlcmlmeURpc2tTdGF0c0ZyZWVTcGFjZVByb3RvKERpc2tTdGF0c0ZyZWVTcGFjZVByb3RvIGRzZnMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRUcnVlKERpc2tTdGF0c0ZyZWVTcGFjZVByb3RvLkZvbGRlci5nZXREZXNjcmlwdG9yKCkuZ2V0VmFsdWVzKCkKKyAgICAgICAgICAgICAgICAuY29udGFpbnMoZHNmcy5nZXRGb2xkZXIoKS5nZXRWYWx1ZURlc2NyaXB0b3IoKSkpOworICAgICAgICBhc3NlcnRUcnVlKGRzZnMuZ2V0QXZhaWxhYmxlU3BhY2VLYigpID49IDApOworICAgICAgICBhc3NlcnRUcnVlKGRzZnMuZ2V0VG90YWxTcGFjZUtiKCkgPj0gMCk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9GaW5nZXJwcmludEluY2lkZW50VGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9GaW5nZXJwcmludEluY2lkZW50VGVzdC5qYXZhCmluZGV4IDllMzJlMWMuLjdmNzc0NjYgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvRmluZ2VycHJpbnRJbmNpZGVudFRlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2luY2lkZW50L3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY3RzL0ZpbmdlcnByaW50SW5jaWRlbnRUZXN0LmphdmEKQEAgLTE2LDEwICsxNiwxMiBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlci5jdHM7CiAKLWltcG9ydCBhbmRyb2lkLnNlcnZpY2UuZmluZ2VycHJpbnQuRmluZ2VycHJpbnRBY3Rpb25TdGF0c1Byb3RvOwotaW1wb3J0IGFuZHJvaWQuc2VydmljZS5maW5nZXJwcmludC5GaW5nZXJwcmludFNlcnZpY2VEdW1wUHJvdG87Ci1pbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLmZpbmdlcnByaW50LkZpbmdlcnByaW50VXNlclN0YXRzUHJvdG87CitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLmZpbmdlcnByaW50LkZpbmdlcnByaW50U2VydmljZUR1bXBQcm90bzsKK2ltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIuZmluZ2VycHJpbnQuRmluZ2VycHJpbnRVc2VyU3RhdHNQcm90bzsKK2ltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIuZmluZ2VycHJpbnQuUGVyZm9ybWFuY2VTdGF0c1Byb3RvOwogCitpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLkRldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuSVRlc3REZXZpY2U7CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQubG9nLkxvZ1V0aWwuQ0xvZzsKIAogCkBAIC0yNywzOSArMjksNDMgQEAKICAqIFRlc3QgdG8gY2hlY2sgdGhhdCB0aGUgZmluZ2VycHJpbnQgc2VydmljZSBwcm9wZXJseSBvdXRwdXRzIGl0cyBkdW1wIHN0YXRlLgogICovCiBwdWJsaWMgY2xhc3MgRmluZ2VycHJpbnRJbmNpZGVudFRlc3QgZXh0ZW5kcyBQcm90b0R1bXBUZXN0Q2FzZSB7Ci0gICAgLyoqCi0gICAgICogVGVzdCB0aGF0IG5vIGZpbmdlcnByaW50cyBhcmUgcmVnaXN0ZXJlZC4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE5vbmVSZWdpc3RlcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdEZpbmdlcnByaW50U2VydmljZUR1bXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gSWYgdGhlIGRldmljZSBkb2Vzbid0IHN1cHBvcnQgZmluZ2VycHJpbnRzLCB0aGVuIHBhc3MuCi0gICAgICAgIGlmICghZ2V0RGV2aWNlKCkuaGFzRmVhdHVyZSgiYW5kcm9pZC5oYXJkd2FyZS5maW5nZXJwcmludCIpKSB7Ci0gICAgICAgICAgICBDTG9nLmQoIkJ5cGFzcyBhcyBhbmRyb2lkLmhhcmR3YXJlLmZpbmdlcnByaW50IGlzIG5vdCBzdXBwb3J0ZWQuIik7CisgICAgICAgIGlmICghc3VwcG9ydHNGaW5nZXJwcmludChnZXREZXZpY2UoKSkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCiAgICAgICAgIGZpbmFsIEZpbmdlcnByaW50U2VydmljZUR1bXBQcm90byBkdW1wID0KICAgICAgICAgICAgICAgICBnZXREdW1wKEZpbmdlcnByaW50U2VydmljZUR1bXBQcm90by5wYXJzZXIoKSwgImR1bXBzeXMgZmluZ2VycHJpbnQgLS1wcm90byIpOwogCi0gICAgICAgIC8vIE9uZSBvZiB0aGVtCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBkdW1wLmdldFVzZXJzQ291bnQoKSk7CisgICAgICAgIHZlcmlmeUZpbmdlcnByaW50U2VydmljZUR1bXBQcm90byhkdW1wLCBQUklWQUNZX05PTkUpOworICAgIH0KIAotICAgICAgICBmaW5hbCBGaW5nZXJwcmludFVzZXJTdGF0c1Byb3RvIHVzZXJTdGF0cyA9IGR1bXAuZ2V0VXNlcnMoMCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCB1c2VyU3RhdHMuZ2V0VXNlcklkKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdXNlclN0YXRzLmdldE51bUZpbmdlcnByaW50cygpKTsKKyAgICBzdGF0aWMgdm9pZCB2ZXJpZnlGaW5nZXJwcmludFNlcnZpY2VEdW1wUHJvdG8oRmluZ2VycHJpbnRTZXJ2aWNlRHVtcFByb3RvIGR1bXAsIGludCBmaWx0ZXJMZXZlbCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGR1bXAuZ2V0VXNlcnNDb3VudCgpOyArK2kpIHsKKyAgICAgICAgICAgIGZpbmFsIEZpbmdlcnByaW50VXNlclN0YXRzUHJvdG8gdXNlclN0YXRzID0gZHVtcC5nZXRVc2VycyhpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoMCA8PSB1c2VyU3RhdHMuZ2V0VXNlcklkKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IHVzZXJTdGF0cy5nZXROdW1GaW5nZXJwcmludHMoKSk7CiAKLSAgICAgICAgZmluYWwgRmluZ2VycHJpbnRBY3Rpb25TdGF0c1Byb3RvIG5vcm1hbCA9IHVzZXJTdGF0cy5nZXROb3JtYWwoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG5vcm1hbC5nZXRBY2NlcHQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBub3JtYWwuZ2V0UmVqZWN0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbm9ybWFsLmdldEFjcXVpcmUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBub3JtYWwuZ2V0TG9ja291dCgpKTsKKyAgICAgICAgICAgIHZlcmlmeVBlcmZvcm1hbmNlU3RhdHNQcm90byh1c2VyU3RhdHMuZ2V0Tm9ybWFsKCkpOworICAgICAgICAgICAgdmVyaWZ5UGVyZm9ybWFuY2VTdGF0c1Byb3RvKHVzZXJTdGF0cy5nZXRDcnlwdG8oKSk7CisgICAgICAgIH0KKyAgICB9CiAKLSAgICAgICAgZmluYWwgRmluZ2VycHJpbnRBY3Rpb25TdGF0c1Byb3RvIGNyeXB0byA9IHVzZXJTdGF0cy5nZXRDcnlwdG8oKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGNyeXB0by5nZXRBY2NlcHQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBjcnlwdG8uZ2V0UmVqZWN0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgY3J5cHRvLmdldEFjcXVpcmUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBjcnlwdG8uZ2V0TG9ja291dCgpKTsKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZlcmlmeVBlcmZvcm1hbmNlU3RhdHNQcm90byhQZXJmb3JtYW5jZVN0YXRzUHJvdG8gcHNwKSB7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBwc3AuZ2V0QWNjZXB0KCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gcHNwLmdldFJlamVjdCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IHBzcC5nZXRBY3F1aXJlKCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gcHNwLmdldExvY2tvdXQoKSk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBwc3AuZ2V0UGVybWFuZW50TG9ja291dCgpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbGVhbiBzdXBwb3J0c0ZpbmdlcnByaW50KElUZXN0RGV2aWNlIGRldmljZSkgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghZGV2aWNlLmhhc0ZlYXR1cmUoImFuZHJvaWQuaGFyZHdhcmUuZmluZ2VycHJpbnQiKSkgeworICAgICAgICAgICAgQ0xvZy5kKCJCeXBhc3MgYXMgYW5kcm9pZC5oYXJkd2FyZS5maW5nZXJwcmludCBpcyBub3Qgc3VwcG9ydGVkLiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9HcmFwaGljc1N0YXRzVmFsaWRhdGlvblRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvR3JhcGhpY3NTdGF0c1ZhbGlkYXRpb25UZXN0LmphdmEKaW5kZXggMmUwNGU4MC4uMTA0MTYzOCAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9HcmFwaGljc1N0YXRzVmFsaWRhdGlvblRlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2luY2lkZW50L3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY3RzL0dyYXBoaWNzU3RhdHNWYWxpZGF0aW9uVGVzdC5qYXZhCkBAIC00MSw2ICs0MSw3IEBACiAgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgc3VwZXIuc2V0VXAoKTsKICAgICAgICAgaW5zdGFsbFBhY2thZ2UoREVWSUNFX1NJREVfVEVTVF9BUEssIC8qIGdyYW50UGVybWlzc2lvbnM9ICovIHRydWUpOworICAgICAgICB0dXJuU2NyZWVuT24oKTsKICAgICAgICAgLy8gRW5zdXJlIHRoYXQgd2UgaGF2ZSBhIHN0YXJ0aW5nIHBvaW50IGZvciBvdXIgc3RhdHMKICAgICAgICAgcnVuRGV2aWNlVGVzdHMoREVWSUNFX1NJREVfVEVTVF9QQUNLQUdFLCAiLlNpbXBsZURyYXdGcmFtZVRlc3RzIiwKICAgICAgICAgICAgICAgICAidGVzdERyYXdUZW5GcmFtZXMiKTsKQEAgLTQ4LDYgKzQ5LDExIEBACiAgICAgICAgIGtpbGxUZXN0QXBwKCk7CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIHR1cm5TY3JlZW5PbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBnZXREZXZpY2UoKS5leGVjdXRlU2hlbGxDb21tYW5kKCJpbnB1dCBrZXlldmVudCBLRVlDT0RFX1dBS0VVUCIpOworICAgICAgICBnZXREZXZpY2UoKS5leGVjdXRlU2hlbGxDb21tYW5kKCJ3bSBkaXNtaXNzLWtleWd1YXJkIik7CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgdGVzdEJhc2ljRHJhd0ZyYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEdyYXBoaWNzU3RhdHNQcm90b1tdIHJlc3VsdHMgPSBydW5EcmF3VGVzdCgidGVzdERyYXdUZW5GcmFtZXMiKTsKICAgICAgICAgR3JhcGhpY3NTdGF0c1Byb3RvIHN0YXRzQmVmb3JlID0gcmVzdWx0c1swXTsKQEAgLTU5LDcgKzY1LDcgQEAKICAgICAgICAgaW50IGZyYW1lRGVsdGEgPSBzdW1tYXJ5QWZ0ZXIuZ2V0VG90YWxGcmFtZXMoKSAtIHN1bW1hcnlCZWZvcmUuZ2V0VG90YWxGcmFtZXMoKTsKICAgICAgICAgaW50IGphbmt5RGVsdGEgPSBzdW1tYXJ5QWZ0ZXIuZ2V0SmFua3lGcmFtZXMoKSAtIHN1bW1hcnlCZWZvcmUuZ2V0SmFua3lGcmFtZXMoKTsKICAgICAgICAgLy8gV2UgZXhwZWN0IDExIGZyYW1lcyB0byBoYXZlIGJlZW4gZHJhd24gKGZpcnN0IGZyYW1lICsgdGhlIDEwIG1vcmUgZXhwbGljaXRseSByZXF1ZXN0ZWQpCi0gICAgICAgIGFzc2VydEVxdWFscygxMSwgZnJhbWVEZWx0YSk7CisgICAgICAgIGFzc2VydFRydWUoZnJhbWVEZWx0YSA8IDE1KTsKICAgICAgICAgYXNzZXJ0VHJ1ZShqYW5reURlbHRhIDwgNSk7CiAgICAgICAgIGludCB2ZXJ5SmFua3lEZWx0YSA9IGNvdW50RnJhbWVzQWJvdmUoc3RhdHNBZnRlciwgNDApIC0gY291bnRGcmFtZXNBYm92ZShzdGF0c0JlZm9yZSwgNDApOwogICAgICAgICAvLyBUaGUgMXN0IGZyYW1lIGNvdWxkIGJlID40MG1zLCBidXQgbm90aGluZyBhZnRlciB0aGF0IHNob3VsZCBiZQpAQCAtNzgsNyArODQsNyBAQAogICAgICAgICBpbnQgamFua3lEZWx0YSA9IHN1bW1hcnlBZnRlci5nZXRKYW5reUZyYW1lcygpIC0gc3VtbWFyeUJlZm9yZS5nZXRKYW5reUZyYW1lcygpOwogICAgICAgICAvLyBUZXN0IGRyYXdzIDUwIGZyYW1lcyArIDEgaW5pdGlhbCBmcmFtZS4gV2UgZXhwZWN0IDQwIG9mIHRoZW0gdG8gYmUgamFua3ksCiAgICAgICAgIC8vIDEwIG9mIGVhY2ggb2YgQU5JTUFUSU9OLCBMQVlPVVQsIFJFQ09SRF9EUkFXLCBhbmQgTUlTU0VEX1ZTWU5DCi0gICAgICAgIGFzc2VydEVxdWFscyg1MSwgZnJhbWVEZWx0YSk7CisgICAgICAgIGFzc2VydFRydWUoZnJhbWVEZWx0YSA8IDU1KTsKICAgICAgICAgYXNzZXJ0VHJ1ZShqYW5reURlbHRhID49IDQwKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShqYW5reURlbHRhIDwgNDUpOwogCkBAIC0xMDgsNyArMTE0LDcgQEAKICAgICAgICAgaW50IGphbmt5RGVsdGEgPSBzdW1tYXJ5QWZ0ZXIuZ2V0SmFua3lGcmFtZXMoKSAtIHN1bW1hcnlCZWZvcmUuZ2V0SmFua3lGcmFtZXMoKTsKICAgICAgICAgLy8gVGVzdCBkcmF3cyA0MCBmcmFtZXMgKyAxIGluaXRpYWwgZnJhbWUuIFdlIGV4cGVjdCAxMCBvZiB0aGVtIHRvIGJlIGRhdmV5cywKICAgICAgICAgLy8gMTAgb2YgdGhlbSB0byBiZSBkYXZleWpycywgYW5kIDIwIHRvIGphbmsgZnJvbSBtaXNzZWQgdnN5bmMgKGZyb20gdGhlIGRhdmV5L2RhdmV5anIgcHJpb3IgdG8gaXQpCi0gICAgICAgIGFzc2VydEVxdWFscyg0MSwgZnJhbWVEZWx0YSk7CisgICAgICAgIGFzc2VydFRydWUoZnJhbWVEZWx0YSA8IDQ1KTsKICAgICAgICAgYXNzZXJ0VHJ1ZShqYW5reURlbHRhID49IDIwKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShqYW5reURlbHRhIDwgMjUpOwogCkBAIC0xMjcsNiArMTMzLDcgQEAKICAgICAgICAgR3JhcGhpY3NTdGF0c1Byb3RvIHN0YXRzQmVmb3JlID0gZmV0Y2hTdGF0cygpOwogICAgICAgICBhc3NlcnROb3ROdWxsKHN0YXRzQmVmb3JlKTsKICAgICAgICAga2lsbFRlc3RBcHAoKTsKKyAgICAgICAgdHVyblNjcmVlbk9uKCk7CiAgICAgICAgIHJ1bkRldmljZVRlc3RzKERFVklDRV9TSURFX1RFU1RfUEFDS0FHRSwgIi5TaW1wbGVEcmF3RnJhbWVUZXN0cyIsICB0ZXN0TmFtZSk7CiAgICAgICAgIGtpbGxUZXN0QXBwKCk7CiAgICAgICAgIEdyYXBoaWNzU3RhdHNQcm90byBzdGF0c0FmdGVyID0gZmV0Y2hTdGF0cygpOwpAQCAtMTYyLDcgKzE2OSw3IEBACiAgICAgICAgIC8vIHZhbGlkIHJhbmdlcy4KICAgICAgICAgYXNzZXJ0VHJ1ZShzdW1tYXJ5LmdldEphbmt5RnJhbWVzKCkgPD0gc3VtbWFyeS5nZXRUb3RhbEZyYW1lcygpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShzdW1tYXJ5LmdldE1pc3NlZFZzeW5jQ291bnQoKSA8PSBzdW1tYXJ5LmdldEphbmt5RnJhbWVzKCkpOwotICAgICAgICBhc3NlcnRUcnVlKHN1bW1hcnkuZ2V0SGlnaElucHV0TGF0ZW5jeUNvdW50KCkgPD0gc3VtbWFyeS5nZXRKYW5reUZyYW1lcygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzdW1tYXJ5LmdldEhpZ2hJbnB1dExhdGVuY3lDb3VudCgpIDw9IHN1bW1hcnkuZ2V0VG90YWxGcmFtZXMoKSk7CiAgICAgICAgIGFzc2VydFRydWUoc3VtbWFyeS5nZXRTbG93VWlUaHJlYWRDb3VudCgpIDw9IHN1bW1hcnkuZ2V0SmFua3lGcmFtZXMoKSk7CiAgICAgICAgIGFzc2VydFRydWUoc3VtbWFyeS5nZXRTbG93Qml0bWFwVXBsb2FkQ291bnQoKSA8PSBzdW1tYXJ5LmdldEphbmt5RnJhbWVzKCkpOwogICAgICAgICBhc3NlcnRUcnVlKHN1bW1hcnkuZ2V0U2xvd0RyYXdDb3VudCgpIDw9IHN1bW1hcnkuZ2V0SmFua3lGcmFtZXMoKSk7CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2luY2lkZW50L3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY3RzL0luY2lkZW50ZFRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvSW5jaWRlbnRkVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4Nzg0ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2luY2lkZW50L3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY3RzL0luY2lkZW50ZFRlc3QuamF2YQpAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlci5jdHM7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkluY2lkZW50UHJvdG87CisKKy8qKgorICogVGVzdHMgaW5jaWRlbnRkIHJlcG9ydHMgZmlsdGVycyBmaWVsZHMgY29ycmVjdGx5IGJhc2VkIG9uIGl0cyBwcml2YWN5IHRhZ3MuCisgKi8KK3B1YmxpYyBjbGFzcyBJbmNpZGVudGRUZXN0IGV4dGVuZHMgUHJvdG9EdW1wVGVzdENhc2UgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiSW5jaWRlbnRkVGVzdCI7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5jaWRlbnRSZXBvcnREdW1wKGZpbmFsIGludCBmaWx0ZXJMZXZlbCwgZmluYWwgU3RyaW5nIGRlc3QpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoaW5jaWRlbnRkRGlzYWJsZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFN0cmluZyBkZXN0QXJnID0gZGVzdCA9PSBudWxsIHx8IGRlc3QuaXNFbXB0eSgpID8gIiIgOiAiLXAgIiArIGRlc3Q7CisgICAgICAgIGZpbmFsIEluY2lkZW50UHJvdG8gZHVtcCA9IGdldER1bXAoSW5jaWRlbnRQcm90by5wYXJzZXIoKSwgImluY2lkZW50ICIgKyBkZXN0QXJnICsgIiAyPi9kZXYvbnVsbCIpOworCisgICAgICAgIFN5c3RlbVByb3BlcnRpZXNUZXN0LnZlcmlmeVN5c3RlbVByb3BlcnRpZXNQcm90byhkdW1wLmdldFN5c3RlbVByb3BlcnRpZXMoKSwgZmlsdGVyTGV2ZWwpOworCisgICAgICAgIFN0YWNrVHJhY2VJbmNpZGVudFRlc3QudmVyaWZ5QmFja1RyYWNlUHJvdG8oZHVtcC5nZXROYXRpdmVUcmFjZXMoKSwgZmlsdGVyTGV2ZWwpOworICAgICAgICBTdGFja1RyYWNlSW5jaWRlbnRUZXN0LnZlcmlmeUJhY2tUcmFjZVByb3RvKGR1bXAuZ2V0SGFsVHJhY2VzKCksIGZpbHRlckxldmVsKTsKKyAgICAgICAgU3RhY2tUcmFjZUluY2lkZW50VGVzdC52ZXJpZnlCYWNrVHJhY2VQcm90byhkdW1wLmdldEphdmFUcmFjZXMoKSwgZmlsdGVyTGV2ZWwpOworCisgICAgICAgIGlmIChGaW5nZXJwcmludEluY2lkZW50VGVzdC5zdXBwb3J0c0ZpbmdlcnByaW50KGdldERldmljZSgpKSkgeworICAgICAgICAgICAgRmluZ2VycHJpbnRJbmNpZGVudFRlc3QudmVyaWZ5RmluZ2VycHJpbnRTZXJ2aWNlRHVtcFByb3RvKGR1bXAuZ2V0RmluZ2VycHJpbnQoKSwgZmlsdGVyTGV2ZWwpOworICAgICAgICB9CisKKyAgICAgICAgTmV0c3RhdHNJbmNpZGVudFRlc3QudmVyaWZ5TmV0d29ya1N0YXRzU2VydmljZUR1bXBQcm90byhkdW1wLmdldE5ldHN0YXRzKCksIGZpbHRlckxldmVsKTsKKworICAgICAgICBTZXR0aW5nc0luY2lkZW50VGVzdC52ZXJpZnlTZXR0aW5nc1NlcnZpY2VEdW1wUHJvdG8oZHVtcC5nZXRTZXR0aW5ncygpLCBmaWx0ZXJMZXZlbCk7CisKKyAgICAgICAgTm90aWZpY2F0aW9uSW5jaWRlbnRUZXN0LnZlcmlmeU5vdGlmaWNhdGlvblNlcnZpY2VEdW1wUHJvdG8oZHVtcC5nZXROb3RpZmljYXRpb24oKSwgZmlsdGVyTGV2ZWwpOworCisgICAgICAgIEJhdHRlcnlTdGF0c0luY2lkZW50VGVzdC52ZXJpZnlCYXR0ZXJ5U3RhdHNTZXJ2aWNlRHVtcFByb3RvKGR1bXAuZ2V0QmF0dGVyeXN0YXRzKCksIGZpbHRlckxldmVsKTsKKworICAgICAgICBpZiAoQmF0dGVyeUluY2lkZW50VGVzdC5oYXNCYXR0ZXJ5KGdldERldmljZSgpKSkgeworICAgICAgICAgICAgQmF0dGVyeUluY2lkZW50VGVzdC52ZXJpZnlCYXR0ZXJ5U2VydmljZUR1bXBQcm90byhkdW1wLmdldEJhdHRlcnkoKSwgZmlsdGVyTGV2ZWwpOworICAgICAgICB9CisKKyAgICAgICAgRGlza1N0YXRzUHJvdG9UZXN0LnZlcmlmeURpc2tTdGF0c1NlcnZpY2VEdW1wUHJvdG8oZHVtcC5nZXREaXNrc3RhdHMoKSwgZmlsdGVyTGV2ZWwsIGdldERldmljZSgpKTsKKworICAgICAgICBQYWNrYWdlSW5jaWRlbnRUZXN0LnZlcmlmeVBhY2thZ2VTZXJ2aWNlRHVtcFByb3RvKGR1bXAuZ2V0UGFja2FnZSgpLCBmaWx0ZXJMZXZlbCk7CisKKyAgICAgICAgUG93ZXJJbmNpZGVudFRlc3QudmVyaWZ5UG93ZXJNYW5hZ2VyU2VydmljZUR1bXBQcm90byhkdW1wLmdldFBvd2VyKCksIGZpbHRlckxldmVsKTsKKworICAgICAgICBpZiAoUHJpbnRQcm90b1Rlc3Quc3VwcG9ydHNQcmludGluZyhnZXREZXZpY2UoKSkpIHsKKyAgICAgICAgICAgIFByaW50UHJvdG9UZXN0LnZlcmlmeVByaW50U2VydmljZUR1bXBQcm90byhkdW1wLmdldFByaW50KCksIGZpbHRlckxldmVsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFByb2NzdGF0cyBjdXJyZW50bHkgaGFzIG5vIEVYUExJQ0lUIG9yIExPQ0FMIGZpZWxkcworCisgICAgICAgIC8vIEFjdGl2aXR5TWFuYWdlclNlcnZpY2VEdW1wQWN0aXZpdGllc1Byb3RvIGhhcyBubyBFWFBMSUNJVCBvciBMT0NBTCBmaWVsZHMuCisKKyAgICAgICAgLy8gQWN0aXZpdHlNYW5hZ2VyU2VydmljZUR1bXBCcm9hZGNhc3RzUHJvdG8gaGFzIG5vIEVYUExJQ0lUIG9yIExPQ0FMIGZpZWxkcy4KKworICAgICAgICBBY3Rpdml0eU1hbmFnZXJJbmNpZGVudFRlc3QudmVyaWZ5QWN0aXZpdHlNYW5hZ2VyU2VydmljZUR1bXBTZXJ2aWNlc1Byb3RvKGR1bXAuZ2V0QW1zZXJ2aWNlcygpLCBmaWx0ZXJMZXZlbCk7CisKKyAgICAgICAgQWN0aXZpdHlNYW5hZ2VySW5jaWRlbnRUZXN0LnZlcmlmeUFjdGl2aXR5TWFuYWdlclNlcnZpY2VEdW1wUHJvY2Vzc2VzUHJvdG8oZHVtcC5nZXRBbXByb2Nlc3NlcygpLCBmaWx0ZXJMZXZlbCk7CisKKyAgICAgICAgQWxhcm1NYW5hZ2VySW5jaWRlbnRUZXN0LnZlcmlmeUFsYXJtTWFuYWdlclNlcnZpY2VEdW1wUHJvdG8oZHVtcC5nZXRBbGFybSgpLCBmaWx0ZXJMZXZlbCk7CisKKyAgICAgICAgTWVtSW5mb0luY2lkZW50VGVzdC52ZXJpZnlNZW1JbmZvRHVtcFByb3RvKGR1bXAuZ2V0TWVtaW5mbygpLCBmaWx0ZXJMZXZlbCk7CisKKyAgICAgICAgLy8gR3JhcGhpY3NTdGF0cyBpcyBleHBlY3RlZCB0byBiZSBhbGwgQVVUT01BVElDLgorCisgICAgICAgIFdpbmRvd01hbmFnZXJJbmNpZGVudFRlc3QudmVyaWZ5V2luZG93TWFuYWdlclNlcnZpY2VEdW1wUHJvdG8oZHVtcC5nZXRXaW5kb3coKSwgZmlsdGVyTGV2ZWwpOworCisgICAgICAgIEpvYlNjaGVkdWxlckluY2lkZW50VGVzdC52ZXJpZnlKb2JTY2hlZHVsZXJTZXJ2aWNlRHVtcFByb3RvKGR1bXAuZ2V0Sm9ic2NoZWR1bGVyKCksIGZpbHRlckxldmVsKTsKKworICAgICAgICBVc2JJbmNpZGVudFRlc3QudmVyaWZ5VXNiU2VydmljZUR1bXBQcm90byhkdW1wLmdldFVzYigpLCBmaWx0ZXJMZXZlbCk7CisgICAgfQorCisgICAgLy8gU3BsaXR0aW5nIHRoZXNlIGludG8gc2VwYXJhdGUgbWV0aG9kcyB0byBtYWtlIGRlYnVnZ2luZyBlYXNpZXIuCisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5jaWRlbnRSZXBvcnREdW1wQXV0bygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0SW5jaWRlbnRSZXBvcnREdW1wKFBSSVZBQ1lfQVVUTywgIkFVVE9NQVRJQyIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbmNpZGVudFJlcG9ydER1bXBFeHBsaWNpdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0SW5jaWRlbnRSZXBvcnREdW1wKFBSSVZBQ1lfRVhQTElDSVQsICJFWFBMSUNJVCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbmNpZGVudFJlcG9ydER1bXBMb2NhbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0SW5jaWRlbnRSZXBvcnREdW1wKFBSSVZBQ1lfTE9DQUwsICJMT0NBTCIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvSm9iU2NoZWR1bGVySW5jaWRlbnRUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2luY2lkZW50L3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY3RzL0pvYlNjaGVkdWxlckluY2lkZW50VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyZDdjZjQKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2luY2lkZW50L3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY3RzL0pvYlNjaGVkdWxlckluY2lkZW50VGVzdC5qYXZhCkBAIC0wLDAgKzEsMzI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXIuY3RzOworCitpbXBvcnQgYW5kcm9pZC5hcHAuam9iLlN0b3BSZWFzb25FbnVtOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtDYXBhYmlsaXRpZXNQcm90bzsKK2ltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrUmVxdWVzdFByb3RvOworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5qb2IuQ29uc3RhbnRzUHJvdG87CitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLmpvYi5EYXRhU2V0UHJvdG87CitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLmpvYi5Kb2JQYWNrYWdlSGlzdG9yeVByb3RvOworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5qb2IuSm9iUGFja2FnZVRyYWNrZXJEdW1wUHJvdG87CitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLmpvYi5Kb2JTY2hlZHVsZXJTZXJ2aWNlRHVtcFByb3RvOworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5qb2IuSm9iU3RhdHVzRHVtcFByb3RvOworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5qb2IuSm9iU3RhdHVzU2hvcnRJbmZvUHJvdG87CitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLmpvYi5TdGF0ZUNvbnRyb2xsZXJQcm90bzsKKworLyoqIFRlc3QgdG8gY2hlY2sgdGhhdCB0aGUgam9ic2NoZWR1bGVyIHNlcnZpY2UgcHJvcGVybHkgb3V0cHV0cyBpdHMgZHVtcCBzdGF0ZS4gKi8KK3B1YmxpYyBjbGFzcyBKb2JTY2hlZHVsZXJJbmNpZGVudFRlc3QgZXh0ZW5kcyBQcm90b0R1bXBUZXN0Q2FzZSB7CisgICAgcHVibGljIHZvaWQgdGVzdEpvYlNjaGVkdWxlclNlcnZpY2VEdW1wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEpvYlNjaGVkdWxlclNlcnZpY2VEdW1wUHJvdG8gZHVtcCA9CisgICAgICAgICAgICAgICAgZ2V0RHVtcChKb2JTY2hlZHVsZXJTZXJ2aWNlRHVtcFByb3RvLnBhcnNlcigpLCAiZHVtcHN5cyBqb2JzY2hlZHVsZXIgLS1wcm90byIpOworCisgICAgICAgIHZlcmlmeUpvYlNjaGVkdWxlclNlcnZpY2VEdW1wUHJvdG8oZHVtcCwgUFJJVkFDWV9OT05FKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCB2ZXJpZnlKb2JTY2hlZHVsZXJTZXJ2aWNlRHVtcFByb3RvKEpvYlNjaGVkdWxlclNlcnZpY2VEdW1wUHJvdG8gZHVtcCwgZmluYWwgaW50IGZpbHRlckxldmVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdENvbnN0YW50c1Byb3RvKGR1bXAuZ2V0U2V0dGluZ3MoKSk7CisKKyAgICAgICAgZm9yIChpbnQgdSA6IGR1bXAuZ2V0U3RhcnRlZFVzZXJzTGlzdCgpKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKDAgPD0gdSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKEpvYlNjaGVkdWxlclNlcnZpY2VEdW1wUHJvdG8uUmVnaXN0ZXJlZEpvYiByaiA6IGR1bXAuZ2V0UmVnaXN0ZXJlZEpvYnNMaXN0KCkpIHsKKyAgICAgICAgICAgIHRlc3RKb2JTdGF0dXNTaG9ydEluZm9Qcm90byhyai5nZXRJbmZvKCksIGZpbHRlckxldmVsKTsKKyAgICAgICAgICAgIHRlc3RKb2JTdGF0dXNEdW1wUHJvdG8ocmouZ2V0RHVtcCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoU3RhdGVDb250cm9sbGVyUHJvdG8gYyA6IGR1bXAuZ2V0Q29udHJvbGxlcnNMaXN0KCkpIHsKKyAgICAgICAgICAgIHRlc3RTdGF0ZUNvbnRyb2xsZXJQcm90byhjLCBmaWx0ZXJMZXZlbCk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKEpvYlNjaGVkdWxlclNlcnZpY2VEdW1wUHJvdG8uUHJpb3JpdHlPdmVycmlkZSBwbyA6IGR1bXAuZ2V0UHJpb3JpdHlPdmVycmlkZXNMaXN0KCkpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoMCA8PSBwby5nZXRVaWQoKSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBidXUgOiBkdW1wLmdldEJhY2tpbmdVcFVpZHNMaXN0KCkpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoMCA8PSBidXUpOworICAgICAgICB9CisKKyAgICAgICAgdGVzdEpvYlBhY2thZ2VIaXN0b3J5UHJvdG8oZHVtcC5nZXRIaXN0b3J5KCksIGZpbHRlckxldmVsKTsKKworICAgICAgICB0ZXN0Sm9iUGFja2FnZVRyYWNrZXJEdW1wUHJvdG8oZHVtcC5nZXRQYWNrYWdlVHJhY2tlcigpKTsKKworICAgICAgICBmb3IgKEpvYlNjaGVkdWxlclNlcnZpY2VEdW1wUHJvdG8uUGVuZGluZ0pvYiBwaiA6IGR1bXAuZ2V0UGVuZGluZ0pvYnNMaXN0KCkpIHsKKyAgICAgICAgICAgIHRlc3RKb2JTdGF0dXNTaG9ydEluZm9Qcm90byhwai5nZXRJbmZvKCksIGZpbHRlckxldmVsKTsKKyAgICAgICAgICAgIHRlc3RKb2JTdGF0dXNEdW1wUHJvdG8ocGouZ2V0RHVtcCgpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoMCA8PSBwai5nZXRFbnF1ZXVlZER1cmF0aW9uTXMoKSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKEpvYlNjaGVkdWxlclNlcnZpY2VEdW1wUHJvdG8uQWN0aXZlSm9iIGFqIDogZHVtcC5nZXRBY3RpdmVKb2JzTGlzdCgpKSB7CisgICAgICAgICAgICBKb2JTY2hlZHVsZXJTZXJ2aWNlRHVtcFByb3RvLkFjdGl2ZUpvYi5JbmFjdGl2ZUpvYiBhaklqID0gYWouZ2V0SW5hY3RpdmUoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoMCA8PSBhaklqLmdldFRpbWVTaW5jZVN0b3BwZWRNcygpKTsKKworICAgICAgICAgICAgSm9iU2NoZWR1bGVyU2VydmljZUR1bXBQcm90by5BY3RpdmVKb2IuUnVubmluZ0pvYiBhalJqID0gYWouZ2V0UnVubmluZygpOworICAgICAgICAgICAgdGVzdEpvYlN0YXR1c1Nob3J0SW5mb1Byb3RvKGFqUmouZ2V0SW5mbygpLCBmaWx0ZXJMZXZlbCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKDAgPD0gYWpSai5nZXRSdW5uaW5nRHVyYXRpb25NcygpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoMCA8PSBhalJqLmdldFRpbWVVbnRpbFRpbWVvdXRNcygpKTsKKyAgICAgICAgICAgIHRlc3RKb2JTdGF0dXNEdW1wUHJvdG8oYWpSai5nZXREdW1wKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IGFqUmouZ2V0VGltZVNpbmNlTWFkZUFjdGl2ZU1zKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IGFqUmouZ2V0UGVuZGluZ0R1cmF0aW9uTXMoKSk7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gZHVtcC5nZXRNYXhBY3RpdmVKb2JzKCkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdENvbnN0YW50c1Byb3RvKENvbnN0YW50c1Byb3RvIGMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnROb3ROdWxsKGMpOworCisgICAgICAgIGFzc2VydFRydWUoMCA8PSBjLmdldE1pbklkbGVDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IGMuZ2V0TWluQ2hhcmdpbmdDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IGMuZ2V0TWluQmF0dGVyeU5vdExvd0NvdW50KCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gYy5nZXRNaW5TdG9yYWdlTm90TG93Q291bnQoKSk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBjLmdldE1pbkNvbm5lY3Rpdml0eUNvdW50KCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gYy5nZXRNaW5Db250ZW50Q291bnQoKSk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBjLmdldE1pblJlYWR5Sm9ic0NvdW50KCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gYy5nZXRIZWF2eVVzZUZhY3RvcigpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IGMuZ2V0TW9kZXJhdGVVc2VGYWN0b3IoKSk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBjLmdldEZnSm9iQ291bnQoKSk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBjLmdldEJnTm9ybWFsSm9iQ291bnQoKSk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBjLmdldEJnTW9kZXJhdGVKb2JDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IGMuZ2V0QmdMb3dKb2JDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IGMuZ2V0QmdDcml0aWNhbEpvYkNvdW50KCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gYy5nZXRNYXhTdGFuZGFyZFJlc2NoZWR1bGVDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IGMuZ2V0TWF4V29ya1Jlc2NoZWR1bGVDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IGMuZ2V0TWluTGluZWFyQmFja29mZlRpbWVNcygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IGMuZ2V0TWluRXhwQmFja29mZlRpbWVNcygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IGMuZ2V0U3RhbmRieUhlYXJ0YmVhdFRpbWVNcygpKTsKKyAgICAgICAgZm9yIChpbnQgc2IgOiBjLmdldFN0YW5kYnlCZWF0c0xpc3QoKSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IHNiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdERhdGFTZXRQcm90byhEYXRhU2V0UHJvdG8gZHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnROb3ROdWxsKGRzKTsKKworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gZHMuZ2V0U3RhcnRDbG9ja1RpbWVNcygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IGRzLmdldEVsYXBzZWRUaW1lTXMoKSk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBkcy5nZXRQZXJpb2RNcygpKTsKKworICAgICAgICBmb3IgKERhdGFTZXRQcm90by5QYWNrYWdlRW50cnlQcm90byBwZSA6IGRzLmdldFBhY2thZ2VFbnRyaWVzTGlzdCgpKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKDAgPD0gcGUuZ2V0VWlkKCkpOworCisgICAgICAgICAgICBhc3NlcnRUcnVlKDAgPD0gcGUuZ2V0UGVuZGluZ1N0YXRlKCkuZ2V0RHVyYXRpb25NcygpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoMCA8PSBwZS5nZXRQZW5kaW5nU3RhdGUoKS5nZXRDb3VudCgpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoMCA8PSBwZS5nZXRBY3RpdmVTdGF0ZSgpLmdldER1cmF0aW9uTXMoKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKDAgPD0gcGUuZ2V0QWN0aXZlU3RhdGUoKS5nZXRDb3VudCgpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoMCA8PSBwZS5nZXRBY3RpdmVUb3BTdGF0ZSgpLmdldER1cmF0aW9uTXMoKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKDAgPD0gcGUuZ2V0QWN0aXZlVG9wU3RhdGUoKS5nZXRDb3VudCgpKTsKKworICAgICAgICAgICAgZm9yIChEYXRhU2V0UHJvdG8uUGFja2FnZUVudHJ5UHJvdG8uU3RvcFJlYXNvbkNvdW50IHNyYyA6IHBlLmdldFN0b3BSZWFzb25zTGlzdCgpKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShTdG9wUmVhc29uRW51bS5nZXREZXNjcmlwdG9yKCkuZ2V0VmFsdWVzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5jb250YWlucyhzcmMuZ2V0UmVhc29uKCkuZ2V0VmFsdWVEZXNjcmlwdG9yKCkpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKDAgPD0gc3JjLmdldENvdW50KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBkcy5nZXRNYXhDb25jdXJyZW5jeSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IGRzLmdldE1heEZvcmVncm91bmRDb25jdXJyZW5jeSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHRlc3RKb2JQYWNrYWdlSGlzdG9yeVByb3RvKEpvYlBhY2thZ2VIaXN0b3J5UHJvdG8ganBoLCBpbnQgZmlsdGVyTGV2ZWwpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnROb3ROdWxsKGpwaCk7CisKKyAgICAgICAgZm9yIChKb2JQYWNrYWdlSGlzdG9yeVByb3RvLkhpc3RvcnlFdmVudCBoZSA6IGpwaC5nZXRIaXN0b3J5RXZlbnRMaXN0KCkpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoSm9iUGFja2FnZUhpc3RvcnlQcm90by5FdmVudC5nZXREZXNjcmlwdG9yKCkuZ2V0VmFsdWVzKCkKKyAgICAgICAgICAgICAgICAgICAgLmNvbnRhaW5zKGhlLmdldEV2ZW50KCkuZ2V0VmFsdWVEZXNjcmlwdG9yKCkpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoMCA8PSBoZS5nZXRUaW1lU2luY2VFdmVudE1zKCkpOyAvLyBTaG91bGQgYmUgcG9zaXRpdmUuCisgICAgICAgICAgICBhc3NlcnRUcnVlKDAgPD0gaGUuZ2V0VWlkKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShTdG9wUmVhc29uRW51bS5nZXREZXNjcmlwdG9yKCkuZ2V0VmFsdWVzKCkKKyAgICAgICAgICAgICAgICAgICAgLmNvbnRhaW5zKGhlLmdldFN0b3BSZWFzb24oKS5nZXRWYWx1ZURlc2NyaXB0b3IoKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0ZXN0Sm9iUGFja2FnZVRyYWNrZXJEdW1wUHJvdG8oSm9iUGFja2FnZVRyYWNrZXJEdW1wUHJvdG8ganB0ZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydE5vdE51bGwoanB0ZCk7CisKKyAgICAgICAgZm9yIChEYXRhU2V0UHJvdG8gZHMgOiBqcHRkLmdldEhpc3RvcmljYWxTdGF0c0xpc3QoKSkgeworICAgICAgICAgICAgdGVzdERhdGFTZXRQcm90byhkcyk7CisgICAgICAgIH0KKyAgICAgICAgdGVzdERhdGFTZXRQcm90byhqcHRkLmdldEN1cnJlbnRTdGF0cygpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHRlc3RKb2JTdGF0dXNTaG9ydEluZm9Qcm90byhKb2JTdGF0dXNTaG9ydEluZm9Qcm90byBqc3NpLCBmaW5hbCBpbnQgZmlsdGVyTGV2ZWwpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnROb3ROdWxsKGpzc2kpOworCisgICAgICAgIGFzc2VydFRydWUoMCA8PSBqc3NpLmdldENhbGxpbmdVaWQoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0ZXN0Sm9iU3RhdHVzRHVtcFByb3RvKEpvYlN0YXR1c0R1bXBQcm90byBqc2QpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnROb3ROdWxsKGpzZCk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IGpzZC5nZXRDYWxsaW5nVWlkKCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0ganNkLmdldFNvdXJjZVVpZCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IGpzZC5nZXRTb3VyY2VVc2VySWQoKSk7CisKKyAgICAgICAgSm9iU3RhdHVzRHVtcFByb3RvLkpvYkluZm8gamkgPSBqc2QuZ2V0Sm9iSW5mbygpOworICAgICAgICBpZiAoamkuZ2V0SXNQZXJpb2RpYygpKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKDAgPD0gamkuZ2V0UGVyaW9kSW50ZXJ2YWxNcygpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoMCA8PSBqaS5nZXRQZXJpb2RGbGV4TXMoKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IGppLmdldFRyaWdnZXJDb250ZW50VXBkYXRlRGVsYXlNcygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IGppLmdldFRyaWdnZXJDb250ZW50TWF4RGVsYXlNcygpKTsKKyAgICAgICAgdGVzdE5ldHdvcmtSZXF1ZXN0UHJvdG8oamkuZ2V0UmVxdWlyZWROZXR3b3JrKCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gamkuZ2V0VG90YWxOZXR3b3JrQnl0ZXMoKSk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBqaS5nZXRNaW5MYXRlbmN5TXMoKSk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBqaS5nZXRNYXhFeGVjdXRpb25EZWxheU1zKCkpOworICAgICAgICBKb2JTdGF0dXNEdW1wUHJvdG8uSm9iSW5mby5CYWNrb2ZmIGJwID0gamkuZ2V0QmFja29mZlBvbGljeSgpOworICAgICAgICBhc3NlcnRUcnVlKEpvYlN0YXR1c0R1bXBQcm90by5Kb2JJbmZvLkJhY2tvZmYuUG9saWN5LmdldERlc2NyaXB0b3IoKS5nZXRWYWx1ZXMoKQorICAgICAgICAgICAgICAgIC5jb250YWlucyhicC5nZXRQb2xpY3koKS5nZXRWYWx1ZURlc2NyaXB0b3IoKSkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gYnAuZ2V0SW5pdGlhbEJhY2tvZmZNcygpKTsKKworICAgICAgICBmb3IgKEpvYlN0YXR1c0R1bXBQcm90by5Db25zdHJhaW50IGMgOiBqc2QuZ2V0UmVxdWlyZWRDb25zdHJhaW50c0xpc3QoKSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShKb2JTdGF0dXNEdW1wUHJvdG8uQ29uc3RyYWludC5nZXREZXNjcmlwdG9yKCkuZ2V0VmFsdWVzKCkKKyAgICAgICAgICAgICAgICAgICAgLmNvbnRhaW5zKGMuZ2V0VmFsdWVEZXNjcmlwdG9yKCkpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKEpvYlN0YXR1c0R1bXBQcm90by5Db25zdHJhaW50IGMgOiBqc2QuZ2V0U2F0aXNmaWVkQ29uc3RyYWludHNMaXN0KCkpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoSm9iU3RhdHVzRHVtcFByb3RvLkNvbnN0cmFpbnQuZ2V0RGVzY3JpcHRvcigpLmdldFZhbHVlcygpCisgICAgICAgICAgICAgICAgICAgIC5jb250YWlucyhjLmdldFZhbHVlRGVzY3JpcHRvcigpKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChKb2JTdGF0dXNEdW1wUHJvdG8uQ29uc3RyYWludCBjIDoganNkLmdldFVuc2F0aXNmaWVkQ29uc3RyYWludHNMaXN0KCkpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoSm9iU3RhdHVzRHVtcFByb3RvLkNvbnN0cmFpbnQuZ2V0RGVzY3JpcHRvcigpLmdldFZhbHVlcygpCisgICAgICAgICAgICAgICAgICAgIC5jb250YWlucyhjLmdldFZhbHVlRGVzY3JpcHRvcigpKSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKEpvYlN0YXR1c0R1bXBQcm90by5UcmFja2luZ0NvbnRyb2xsZXIgdGMgOiBqc2QuZ2V0VHJhY2tpbmdDb250cm9sbGVyc0xpc3QoKSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShKb2JTdGF0dXNEdW1wUHJvdG8uVHJhY2tpbmdDb250cm9sbGVyLmdldERlc2NyaXB0b3IoKS5nZXRWYWx1ZXMoKQorICAgICAgICAgICAgICAgICAgICAuY29udGFpbnModGMuZ2V0VmFsdWVEZXNjcmlwdG9yKCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoSm9iU3RhdHVzRHVtcFByb3RvLkpvYldvcmtJdGVtIGp3aSA6IGpzZC5nZXRQZW5kaW5nV29ya0xpc3QoKSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IGp3aS5nZXREZWxpdmVyeUNvdW50KCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoSm9iU3RhdHVzRHVtcFByb3RvLkpvYldvcmtJdGVtIGp3aSA6IGpzZC5nZXRFeGVjdXRpbmdXb3JrTGlzdCgpKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKDAgPD0gandpLmdldERlbGl2ZXJ5Q291bnQoKSk7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRUcnVlKEpvYlN0YXR1c0R1bXBQcm90by5CdWNrZXQuZ2V0RGVzY3JpcHRvcigpLmdldFZhbHVlcygpCisgICAgICAgICAgICAgICAgLmNvbnRhaW5zKGpzZC5nZXRTdGFuZGJ5QnVja2V0KCkuZ2V0VmFsdWVEZXNjcmlwdG9yKCkpKTsKKworICAgICAgICBhc3NlcnRUcnVlKDAgPD0ganNkLmdldEVucXVldWVEdXJhdGlvbk1zKCkpOworCisgICAgICAgIGFzc2VydFRydWUoMCA8PSBqc2QuZ2V0TnVtRmFpbHVyZXMoKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IGpzZC5nZXRMYXN0U3VjY2Vzc2Z1bFJ1blRpbWUoKSk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBqc2QuZ2V0TGFzdEZhaWxlZFJ1blRpbWUoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0ZXN0TmV0d29ya1JlcXVlc3RQcm90byhOZXR3b3JrUmVxdWVzdFByb3RvIG5yKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChucik7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShOZXR3b3JrUmVxdWVzdFByb3RvLlR5cGUuZ2V0RGVzY3JpcHRvcigpLmdldFZhbHVlcygpCisgICAgICAgICAgICAgICAgLmNvbnRhaW5zKG5yLmdldFR5cGUoKS5nZXRWYWx1ZURlc2NyaXB0b3IoKSkpOworICAgICAgICB0ZXN0TmV0d29ya0NhcGFiaWxpdGVzUHJvdG8obnIuZ2V0TmV0d29ya0NhcGFiaWxpdGllcygpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHRlc3ROZXR3b3JrQ2FwYWJpbGl0ZXNQcm90byhOZXR3b3JrQ2FwYWJpbGl0aWVzUHJvdG8gbmMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnROb3ROdWxsKG5jKTsKKworICAgICAgICBmb3IgKE5ldHdvcmtDYXBhYmlsaXRpZXNQcm90by5UcmFuc3BvcnQgdCA6IG5jLmdldFRyYW5zcG9ydHNMaXN0KCkpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoTmV0d29ya0NhcGFiaWxpdGllc1Byb3RvLlRyYW5zcG9ydC5nZXREZXNjcmlwdG9yKCkuZ2V0VmFsdWVzKCkKKyAgICAgICAgICAgICAgICAuY29udGFpbnModC5nZXRWYWx1ZURlc2NyaXB0b3IoKSkpOworICAgICAgICB9CisgICAgICAgIGZvciAoTmV0d29ya0NhcGFiaWxpdGllc1Byb3RvLk5ldENhcGFiaWxpdHkgYyA6IG5jLmdldENhcGFiaWxpdGllc0xpc3QoKSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShOZXR3b3JrQ2FwYWJpbGl0aWVzUHJvdG8uTmV0Q2FwYWJpbGl0eS5nZXREZXNjcmlwdG9yKCkuZ2V0VmFsdWVzKCkKKyAgICAgICAgICAgICAgICAuY29udGFpbnMoYy5nZXRWYWx1ZURlc2NyaXB0b3IoKSkpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IG5jLmdldExpbmtVcEJhbmR3aWR0aEticHMoKSk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBuYy5nZXRMaW5rRG93bkJhbmR3aWR0aEticHMoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0ZXN0U3RhdGVDb250cm9sbGVyUHJvdG8oU3RhdGVDb250cm9sbGVyUHJvdG8gc2MsIGludCBmaWx0ZXJMZXZlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydE5vdE51bGwoc2MpOworCisgICAgICAgIFN0YXRlQ29udHJvbGxlclByb3RvLkJhY2tncm91bmRKb2JzQ29udHJvbGxlciBiamMgPSBzYy5nZXRCYWNrZ3JvdW5kKCk7CisgICAgICAgIGZvciAoU3RhdGVDb250cm9sbGVyUHJvdG8uQmFja2dyb3VuZEpvYnNDb250cm9sbGVyLlRyYWNrZWRKb2IgdGogOiBiamMuZ2V0VHJhY2tlZEpvYnNMaXN0KCkpIHsKKyAgICAgICAgICAgIHRlc3RKb2JTdGF0dXNTaG9ydEluZm9Qcm90byh0ai5nZXRJbmZvKCksIGZpbHRlckxldmVsKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoMCA8PSB0ai5nZXRTb3VyY2VVaWQoKSk7CisgICAgICAgIH0KKyAgICAgICAgU3RhdGVDb250cm9sbGVyUHJvdG8uQmF0dGVyeUNvbnRyb2xsZXIgYmMgPSBzYy5nZXRCYXR0ZXJ5KCk7CisgICAgICAgIGZvciAoU3RhdGVDb250cm9sbGVyUHJvdG8uQmF0dGVyeUNvbnRyb2xsZXIuVHJhY2tlZEpvYiB0aiA6IGJjLmdldFRyYWNrZWRKb2JzTGlzdCgpKSB7CisgICAgICAgICAgICB0ZXN0Sm9iU3RhdHVzU2hvcnRJbmZvUHJvdG8odGouZ2V0SW5mbygpLCBmaWx0ZXJMZXZlbCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKDAgPD0gdGouZ2V0U291cmNlVWlkKCkpOworICAgICAgICB9CisgICAgICAgIFN0YXRlQ29udHJvbGxlclByb3RvLkNvbm5lY3Rpdml0eUNvbnRyb2xsZXIgY2MgPSBzYy5nZXRDb25uZWN0aXZpdHkoKTsKKyAgICAgICAgZm9yIChTdGF0ZUNvbnRyb2xsZXJQcm90by5Db25uZWN0aXZpdHlDb250cm9sbGVyLlRyYWNrZWRKb2IgdGogOiBjYy5nZXRUcmFja2VkSm9ic0xpc3QoKSkgeworICAgICAgICAgICAgdGVzdEpvYlN0YXR1c1Nob3J0SW5mb1Byb3RvKHRqLmdldEluZm8oKSwgZmlsdGVyTGV2ZWwpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IHRqLmdldFNvdXJjZVVpZCgpKTsKKyAgICAgICAgICAgIHRlc3ROZXR3b3JrUmVxdWVzdFByb3RvKHRqLmdldFJlcXVpcmVkTmV0d29yaygpKTsKKyAgICAgICAgfQorICAgICAgICBTdGF0ZUNvbnRyb2xsZXJQcm90by5Db250ZW50T2JzZXJ2ZXJDb250cm9sbGVyIGNvYyA9IHNjLmdldENvbnRlbnRPYnNlcnZlcigpOworICAgICAgICBmb3IgKFN0YXRlQ29udHJvbGxlclByb3RvLkNvbnRlbnRPYnNlcnZlckNvbnRyb2xsZXIuVHJhY2tlZEpvYiB0aiA6IGNvYy5nZXRUcmFja2VkSm9ic0xpc3QoKSkgeworICAgICAgICAgICAgdGVzdEpvYlN0YXR1c1Nob3J0SW5mb1Byb3RvKHRqLmdldEluZm8oKSwgZmlsdGVyTGV2ZWwpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IHRqLmdldFNvdXJjZVVpZCgpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKFN0YXRlQ29udHJvbGxlclByb3RvLkNvbnRlbnRPYnNlcnZlckNvbnRyb2xsZXIuT2JzZXJ2ZXIgbyA6IGNvYy5nZXRPYnNlcnZlcnNMaXN0KCkpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoMCA8PSBvLmdldFVzZXJJZCgpKTsKKworICAgICAgICAgICAgZm9yIChTdGF0ZUNvbnRyb2xsZXJQcm90by5Db250ZW50T2JzZXJ2ZXJDb250cm9sbGVyLk9ic2VydmVyLlRyaWdnZXJDb250ZW50RGF0YSB0Y2QgOiBvLmdldFRyaWdnZXJzTGlzdCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGZpbHRlckxldmVsID09IFBSSVZBQ1lfQVVUTykgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHRjZC5nZXRVcmkoKS5pc0VtcHR5KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKFN0YXRlQ29udHJvbGxlclByb3RvLkNvbnRlbnRPYnNlcnZlckNvbnRyb2xsZXIuT2JzZXJ2ZXIuVHJpZ2dlckNvbnRlbnREYXRhLkpvYkluc3RhbmNlIGppIDogdGNkLmdldEpvYnNMaXN0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGVzdEpvYlN0YXR1c1Nob3J0SW5mb1Byb3RvKGppLmdldEluZm8oKSwgZmlsdGVyTGV2ZWwpOworCisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoMCA8PSBqaS5nZXRTb3VyY2VVaWQoKSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoMCA8PSBqaS5nZXRUcmlnZ2VyQ29udGVudFVwZGF0ZURlbGF5TXMoKSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoMCA8PSBqaS5nZXRUcmlnZ2VyQ29udGVudE1heERlbGF5TXMoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlckxldmVsID09IFBSSVZBQ1lfQVVUTykgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgY2EgOiBqaS5nZXRDaGFuZ2VkQXV0aG9yaXRpZXNMaXN0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGNhLmlzRW1wdHkoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBjYSA6IGppLmdldENoYW5nZWRVcmlzTGlzdCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjYS5pc0VtcHR5KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFN0YXRlQ29udHJvbGxlclByb3RvLkRldmljZUlkbGVKb2JzQ29udHJvbGxlciBkaWpjID0gc2MuZ2V0RGV2aWNlSWRsZSgpOworICAgICAgICBmb3IgKFN0YXRlQ29udHJvbGxlclByb3RvLkRldmljZUlkbGVKb2JzQ29udHJvbGxlci5UcmFja2VkSm9iIHRqIDogZGlqYy5nZXRUcmFja2VkSm9ic0xpc3QoKSkgeworICAgICAgICAgICAgdGVzdEpvYlN0YXR1c1Nob3J0SW5mb1Byb3RvKHRqLmdldEluZm8oKSwgZmlsdGVyTGV2ZWwpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IHRqLmdldFNvdXJjZVVpZCgpKTsKKyAgICAgICAgfQorICAgICAgICBTdGF0ZUNvbnRyb2xsZXJQcm90by5JZGxlQ29udHJvbGxlciBpYyA9IHNjLmdldElkbGUoKTsKKyAgICAgICAgZm9yIChTdGF0ZUNvbnRyb2xsZXJQcm90by5JZGxlQ29udHJvbGxlci5UcmFja2VkSm9iIHRqIDogaWMuZ2V0VHJhY2tlZEpvYnNMaXN0KCkpIHsKKyAgICAgICAgICAgIHRlc3RKb2JTdGF0dXNTaG9ydEluZm9Qcm90byh0ai5nZXRJbmZvKCksIGZpbHRlckxldmVsKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoMCA8PSB0ai5nZXRTb3VyY2VVaWQoKSk7CisgICAgICAgIH0KKyAgICAgICAgU3RhdGVDb250cm9sbGVyUHJvdG8uU3RvcmFnZUNvbnRyb2xsZXIgc2NyID0gc2MuZ2V0U3RvcmFnZSgpOworICAgICAgICBmb3IgKFN0YXRlQ29udHJvbGxlclByb3RvLlN0b3JhZ2VDb250cm9sbGVyLlRyYWNrZWRKb2IgdGogOiBzY3IuZ2V0VHJhY2tlZEpvYnNMaXN0KCkpIHsKKyAgICAgICAgICAgIHRlc3RKb2JTdGF0dXNTaG9ydEluZm9Qcm90byh0ai5nZXRJbmZvKCksIGZpbHRlckxldmVsKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoMCA8PSB0ai5nZXRTb3VyY2VVaWQoKSk7CisgICAgICAgIH0KKyAgICAgICAgU3RhdGVDb250cm9sbGVyUHJvdG8uVGltZUNvbnRyb2xsZXIgdGMgPSBzYy5nZXRUaW1lKCk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSAgdGMuZ2V0Tm93RWxhcHNlZFJlYWx0aW1lKCkpOworICAgICAgICBmb3IgKFN0YXRlQ29udHJvbGxlclByb3RvLlRpbWVDb250cm9sbGVyLlRyYWNrZWRKb2IgdGogOiB0Yy5nZXRUcmFja2VkSm9ic0xpc3QoKSkgeworICAgICAgICAgICAgdGVzdEpvYlN0YXR1c1Nob3J0SW5mb1Byb3RvKHRqLmdldEluZm8oKSwgZmlsdGVyTGV2ZWwpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IHRqLmdldFNvdXJjZVVpZCgpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvTWVtSW5mb0luY2lkZW50VGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9NZW1JbmZvSW5jaWRlbnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc0Nzk3MgotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvTWVtSW5mb0luY2lkZW50VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXIuY3RzOworCitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLmFtLk1lbUluZm9EdW1wUHJvdG87CitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLmFtLk1lbUluZm9EdW1wUHJvdG8uQXBwRGF0YTsKK2ltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIuYW0uTWVtSW5mb0R1bXBQcm90by5NZW1JdGVtOworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5hbS5NZW1JbmZvRHVtcFByb3RvLlByb2Nlc3NNZW1vcnk7CisKKy8qKiBUZXN0IHRvIGNoZWNrIHRoYXQgQWN0aXZpdHlNYW5hZ2VyIHByb3Blcmx5IG91dHB1dHMgbWVtaW5mbyBkYXRhLiAqLworcHVibGljIGNsYXNzIE1lbUluZm9JbmNpZGVudFRlc3QgZXh0ZW5kcyBQcm90b0R1bXBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWVtSW5mb0R1bXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgTWVtSW5mb0R1bXBQcm90byBkdW1wID0KKyAgICAgICAgICAgICAgICBnZXREdW1wKE1lbUluZm9EdW1wUHJvdG8ucGFyc2VyKCksICJkdW1wc3lzIC10IDMwMDAwIG1lbWluZm8gLWEgLS1wcm90byIpOworCisgICAgICAgIHZlcmlmeU1lbUluZm9EdW1wUHJvdG8oZHVtcCwgUFJJVkFDWV9OT05FKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCB2ZXJpZnlNZW1JbmZvRHVtcFByb3RvKE1lbUluZm9EdW1wUHJvdG8gZHVtcCwgZmluYWwgaW50IGZpbHRlckxldmVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkdW1wLmdldFVwdGltZUR1cmF0aW9uTXMoKSA+PSAwKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkdW1wLmdldEVsYXBzZWRSZWFsdGltZU1zKCkgPj0gMCk7CisKKyAgICAgICAgZm9yIChQcm9jZXNzTWVtb3J5IHBtIDogZHVtcC5nZXROYXRpdmVQcm9jZXNzZXNMaXN0KCkpIHsKKyAgICAgICAgICAgIHRlc3RQcm9jZXNzTWVtb3J5KHBtKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoQXBwRGF0YSBhZCA6IGR1bXAuZ2V0QXBwUHJvY2Vzc2VzTGlzdCgpKSB7CisgICAgICAgICAgICB0ZXN0QXBwRGF0YShhZCk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKE1lbUl0ZW0gbWkgOiBkdW1wLmdldFRvdGFsUHNzQnlQcm9jZXNzTGlzdCgpKSB7CisgICAgICAgICAgICB0ZXN0TWVtSXRlbShtaSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChNZW1JdGVtIG1pIDogZHVtcC5nZXRUb3RhbFBzc0J5T29tQWRqdXN0bWVudExpc3QoKSkgeworICAgICAgICAgICAgdGVzdE1lbUl0ZW0obWkpOworICAgICAgICB9CisgICAgICAgIGZvciAoTWVtSXRlbSBtaSA6IGR1bXAuZ2V0VG90YWxQc3NCeUNhdGVnb3J5TGlzdCgpKSB7CisgICAgICAgICAgICB0ZXN0TWVtSXRlbShtaSk7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gZHVtcC5nZXRUb3RhbFJhbUtiKCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gZHVtcC5nZXRDYWNoZWRQc3NLYigpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IGR1bXAuZ2V0Q2FjaGVkS2VybmVsS2IoKSk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBkdW1wLmdldEZyZWVLYigpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IGR1bXAuZ2V0VXNlZFBzc0tiKCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gZHVtcC5nZXRVc2VkS2VybmVsS2IoKSk7CisKKyAgICAgICAgLy8gSWRlYWxseSBsb3N0IFJBTSB3b3VsZCBub3QgYmUgbmVnYXRpdmUsIGJ1dCB0aGVyZSdzIGFuIGlzc3VlIHdoZXJlIGl0J3Mgc29tZXRpbWVzCisgICAgICAgIC8vIGNhbGN1bGF0ZWQgdG8gYmUgbmVnYXRpdmUuCisgICAgICAgIC8vIFRPRE86IHJlLWVuYWJsZSBjaGVjayBvbmNlIHRoZSB1bmRlcmx5aW5nIGJ1ZyBoYXMgYmVlbiBmaXhlZC4KKyAgICAgICAgLy8gYXNzZXJ0VHJ1ZSgwIDw9IGR1bXAuZ2V0TG9zdFJhbUtiKCkpOworCisgICAgICAgIGFzc2VydFRydWUoMCA8PSBkdW1wLmdldFRvdGFsWnJhbUtiKCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gZHVtcC5nZXRacmFtUGh5c2ljYWxVc2VkSW5Td2FwS2IoKSk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBkdW1wLmdldFRvdGFsWnJhbVN3YXBLYigpKTsKKworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gZHVtcC5nZXRLc21TaGFyaW5nS2IoKSk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBkdW1wLmdldEtzbVNoYXJlZEtiKCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gZHVtcC5nZXRLc21VbnNoYXJlZEtiKCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gZHVtcC5nZXRLc21Wb2xhdGlsZUtiKCkpOworCisgICAgICAgIGFzc2VydFRydWUoIlR1bmluZ19tYiAoIiArIGR1bXAuZ2V0VHVuaW5nTWIoKSArICIpIGlzIG5vdCBwb3NpdGl2ZSIsIDAgPCBkdW1wLmdldFR1bmluZ01iKCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPCBkdW1wLmdldFR1bmluZ0xhcmdlTWIoKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IGR1bXAuZ2V0T29tS2IoKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDwgZHVtcC5nZXRSZXN0b3JlTGltaXRLYigpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHRlc3RQcm9jZXNzTWVtb3J5KFByb2Nlc3NNZW1vcnkgcG0pIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnROb3ROdWxsKHBtKTsKKworICAgICAgICBhc3NlcnRUcnVlKDAgPCBwbS5nZXRQaWQoKSk7CisgICAgICAgIC8vIE9uIG1vc3QgTGludXggbWFjaGluZXMsIHRoZSBtYXggcGlkIHZhbHVlIGlzIDMyNzY4ICg9Ml4xNSksIGJ1dCwgaXQgY2FuIGJlIHNldCB0byBhbnkKKyAgICAgICAgLy8gdmFsdWUgdXAgdG8gNDE5NDMwNCAoPTJeMjIpIGlmIG5lY2Vzc2FyeS4KKyAgICAgICAgYXNzZXJ0VHJ1ZSg0MTk0MzA0ID49IHBtLmdldFBpZCgpKTsKKworICAgICAgICB0ZXN0SGVhcEluZm8ocG0uZ2V0TmF0aXZlSGVhcCgpKTsKKyAgICAgICAgdGVzdEhlYXBJbmZvKHBtLmdldERhbHZpa0hlYXAoKSk7CisKKyAgICAgICAgZm9yIChQcm9jZXNzTWVtb3J5Lk1lbW9yeUluZm8gbWkgOiBwbS5nZXRPdGhlckhlYXBzTGlzdCgpKSB7CisgICAgICAgICAgICB0ZXN0TWVtb3J5SW5mbyhtaSk7CisgICAgICAgIH0KKyAgICAgICAgdGVzdE1lbW9yeUluZm8ocG0uZ2V0VW5rbm93bkhlYXAoKSk7CisgICAgICAgIHRlc3RIZWFwSW5mbyhwbS5nZXRUb3RhbEhlYXAoKSk7CisKKyAgICAgICAgZm9yIChQcm9jZXNzTWVtb3J5Lk1lbW9yeUluZm8gbWkgOiBwbS5nZXREYWx2aWtEZXRhaWxzTGlzdCgpKSB7CisgICAgICAgICAgICB0ZXN0TWVtb3J5SW5mbyhtaSk7CisgICAgICAgIH0KKworICAgICAgICBQcm9jZXNzTWVtb3J5LkFwcFN1bW1hcnkgYXMgPSBwbS5nZXRBcHBTdW1tYXJ5KCk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBhcy5nZXRKYXZhSGVhcFBzc0tiKCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gYXMuZ2V0TmF0aXZlSGVhcFBzc0tiKCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gYXMuZ2V0Q29kZVBzc0tiKCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gYXMuZ2V0U3RhY2tQc3NLYigpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IGFzLmdldEdyYXBoaWNzUHNzS2IoKSk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBhcy5nZXRQcml2YXRlT3RoZXJQc3NLYigpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IGFzLmdldFN5c3RlbVBzc0tiKCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gYXMuZ2V0VG90YWxTd2FwUHNzKCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gYXMuZ2V0VG90YWxTd2FwS2IoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0ZXN0TWVtb3J5SW5mbyhQcm9jZXNzTWVtb3J5Lk1lbW9yeUluZm8gbWkpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnROb3ROdWxsKG1pKTsKKworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gbWkuZ2V0VG90YWxQc3NLYigpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IG1pLmdldENsZWFuUHNzS2IoKSk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBtaS5nZXRTaGFyZWREaXJ0eUtiKCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gbWkuZ2V0UHJpdmF0ZURpcnR5S2IoKSk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBtaS5nZXRTaGFyZWRDbGVhbktiKCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gbWkuZ2V0UHJpdmF0ZUNsZWFuS2IoKSk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBtaS5nZXREaXJ0eVN3YXBLYigpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IG1pLmdldERpcnR5U3dhcFBzc0tiKCkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdEhlYXBJbmZvKFByb2Nlc3NNZW1vcnkuSGVhcEluZm8gaGkpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnROb3ROdWxsKGhpKTsKKworICAgICAgICB0ZXN0TWVtb3J5SW5mbyhoaS5nZXRNZW1JbmZvKCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gaGkuZ2V0SGVhcFNpemVLYigpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IGhpLmdldEhlYXBBbGxvY0tiKCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gaGkuZ2V0SGVhcEZyZWVLYigpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHRlc3RBcHBEYXRhKEFwcERhdGEgYWQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnROb3ROdWxsKGFkKTsKKworICAgICAgICB0ZXN0UHJvY2Vzc01lbW9yeShhZC5nZXRQcm9jZXNzTWVtb3J5KCkpOworCisgICAgICAgIEFwcERhdGEuT2JqZWN0U3RhdHMgb3MgPSBhZC5nZXRPYmplY3RzKCk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBvcy5nZXRWaWV3SW5zdGFuY2VDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IG9zLmdldFZpZXdSb290SW5zdGFuY2VDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IG9zLmdldEFwcENvbnRleHRJbnN0YW5jZUNvdW50KCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gb3MuZ2V0QWN0aXZpdHlJbnN0YW5jZUNvdW50KCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gb3MuZ2V0R2xvYmFsQXNzZXRDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IG9zLmdldEdsb2JhbEFzc2V0TWFuYWdlckNvdW50KCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gb3MuZ2V0TG9jYWxCaW5kZXJPYmplY3RDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IG9zLmdldFByb3h5QmluZGVyT2JqZWN0Q291bnQoKSk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBvcy5nZXRQYXJjZWxNZW1vcnlLYigpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IG9zLmdldFBhcmNlbENvdW50KCkpOworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gb3MuZ2V0QmluZGVyT2JqZWN0RGVhdGhDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IG9zLmdldE9wZW5Tc2xTb2NrZXRDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IG9zLmdldFdlYnZpZXdJbnN0YW5jZUNvdW50KCkpOworCisgICAgICAgIEFwcERhdGEuU3FsU3RhdHMgc3MgPSBhZC5nZXRTcWwoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IHNzLmdldE1lbW9yeVVzZWRLYigpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IHNzLmdldFBhZ2VjYWNoZU92ZXJmbG93S2IoKSk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBzcy5nZXRNYWxsb2NTaXplS2IoKSk7CisgICAgICAgIGZvciAoQXBwRGF0YS5TcWxTdGF0cy5EYXRhYmFzZSBkIDogc3MuZ2V0RGF0YWJhc2VzTGlzdCgpKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKDAgPD0gZC5nZXRQYWdlU2l6ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoMCA8PSBkLmdldERiU2l6ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoMCA8PSBkLmdldExvb2thc2lkZUIoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHRlc3RNZW1JdGVtKE1lbUl0ZW0gbWkpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnROb3ROdWxsKG1pKTsKKworICAgICAgICBhc3NlcnRUcnVlKDAgPD0gbWkuZ2V0UHNzS2IoKSk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBtaS5nZXRTd2FwUHNzS2IoKSk7CisKKyAgICAgICAgZm9yIChNZW1JdGVtIHNtaSA6IG1pLmdldFN1Ykl0ZW1zTGlzdCgpKSB7CisgICAgICAgICAgICB0ZXN0TWVtSXRlbShzbWkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9OZXRzdGF0c0luY2lkZW50VGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9OZXRzdGF0c0luY2lkZW50VGVzdC5qYXZhCmluZGV4IGY1YzEzYzIuLjEzYzU4MDMgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvTmV0c3RhdHNJbmNpZGVudFRlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2luY2lkZW50L3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY3RzL05ldHN0YXRzSW5jaWRlbnRUZXN0LmphdmEKQEAgLTM3NCwxNiArMzc0LDE0IEBACiAgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TmVnYXRpdmUoIlRYIGJ5dGVzIiwgYnVja2V0LmdldFR4Qnl0ZXMoKSk7CiAgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TmVnYXRpdmUoIlRYIHBhY2tldHMiLCBidWNrZXQuZ2V0VHhQYWNrZXRzKCkpOwogCi0vLyAxMCB3YXMgc3RpbGwgdG9vIGJpZz8gICAgICAgICAgICAgICAgLy8gSXQgc2hvdWxkIGJlIHNhZmUgdG8gc2F5ICMgb2YgYnl0ZXMgPj0gMTAgKiAxMCBvZiBwYWNrZXRzLCBkdWUgdG8gaGVhZGVycywgZXRjLi4uCi0gICAgICAgICAgICAgICAgZmluYWwgbG9uZyBGQUNUT1IgPSA0OwogICAgICAgICAgICAgICAgIGFzc2VydFRydWUoCiAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCIjIG9mIGJ5dGVzICVkIHRvbyBzbWFsbCBmb3IgIyBvZiBwYWNrZXRzICVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVja2V0LmdldFJ4Qnl0ZXMoKSwgYnVja2V0LmdldFJ4UGFja2V0cygpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1Y2tldC5nZXRSeEJ5dGVzKCkgPj0gYnVja2V0LmdldFJ4UGFja2V0cygpICogRkFDVE9SKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1Y2tldC5nZXRSeEJ5dGVzKCkgPj0gYnVja2V0LmdldFJ4UGFja2V0cygpKTsKICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKAogICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiIyBvZiBieXRlcyAlZCB0b28gc21hbGwgZm9yICMgb2YgcGFja2V0cyAlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Y2tldC5nZXRUeEJ5dGVzKCksIGJ1Y2tldC5nZXRUeFBhY2tldHMoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICBidWNrZXQuZ2V0VHhCeXRlcygpID49IGJ1Y2tldC5nZXRUeFBhY2tldHMoKSAqIEZBQ1RPUik7CisgICAgICAgICAgICAgICAgICAgICAgICBidWNrZXQuZ2V0VHhCeXRlcygpID49IGJ1Y2tldC5nZXRUeFBhY2tldHMoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMzk0LDQgKzM5MiwyNSBAQAogICAgICAgICBmaW5hbCBTdHJpbmcgY29tbWFuZE91dHB1dCA9IGdldERldmljZSgpLmV4ZWN1dGVTaGVsbENvbW1hbmQoInBtIGxpc3QgZmVhdHVyZXMiKTsKICAgICAgICAgcmV0dXJuIGNvbW1hbmRPdXRwdXQuY29udGFpbnMoRkVBVFVSRV9XSUZJKTsKICAgICB9CisKKyAgICAvLyBDdXJyZW50bHkgb25seSB2ZXJpZmllcyB0aGF0IHByaXZhY3kgZmlsdGVyaW5nIGlzIGRvbmUgcHJvcGVybHkuCisgICAgc3RhdGljIHZvaWQgdmVyaWZ5TmV0d29ya1N0YXRzU2VydmljZUR1bXBQcm90byhOZXR3b3JrU3RhdHNTZXJ2aWNlRHVtcFByb3RvIGR1bXAsIGZpbmFsIGludCBmaWx0ZXJMZXZlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChmaWx0ZXJMZXZlbCA9PSBQUklWQUNZX0FVVE8pIHsKKyAgICAgICAgICAgIGZvciAoTmV0d29ya0ludGVyZmFjZVByb3RvIG5pcCA6IGR1bXAuZ2V0QWN0aXZlSW50ZXJmYWNlc0xpc3QoKSkgeworICAgICAgICAgICAgICAgIHZlcmlmeU5ldHdvcmtJbnRlcmZhY2VQcm90byhuaXAsIGZpbHRlckxldmVsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoTmV0d29ya0ludGVyZmFjZVByb3RvIG5pcCA6IGR1bXAuZ2V0QWN0aXZlVWlkSW50ZXJmYWNlc0xpc3QoKSkgeworICAgICAgICAgICAgICAgIHZlcmlmeU5ldHdvcmtJbnRlcmZhY2VQcm90byhuaXAsIGZpbHRlckxldmVsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdmVyaWZ5TmV0d29ya0ludGVyZmFjZVByb3RvKE5ldHdvcmtJbnRlcmZhY2VQcm90byBuaXAsIGZpbmFsIGludCBmaWx0ZXJMZXZlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoTmV0d29ya0lkZW50aXR5UHJvdG8gbmkgOiBuaXAuZ2V0SWRlbnRpdGllcygpLmdldElkZW50aXRpZXNMaXN0KCkpIHsKKyAgICAgICAgICAgIGlmIChmaWx0ZXJMZXZlbCA9PSBQUklWQUNZX0FVVE8pIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKG5pLmdldFN1YnNjcmliZXJJZCgpLmlzRW1wdHkoKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShuaS5nZXROZXR3b3JrSWQoKS5pc0VtcHR5KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9Ob3RpZmljYXRpb25JbmNpZGVudFRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvTm90aWZpY2F0aW9uSW5jaWRlbnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM1OTI4MgotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvTm90aWZpY2F0aW9uSW5jaWRlbnRUZXN0LmphdmEKQEAgLTAsMCArMSwyMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlci5jdHM7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5Qb2xpY3lQcm90bzsKK2ltcG9ydCBhbmRyb2lkLnNlcnZpY2Uubm90aWZpY2F0aW9uLkNvbmRpdGlvblByb3RvOworaW1wb3J0IGFuZHJvaWQuc2VydmljZS5ub3RpZmljYXRpb24uTWFuYWdlZFNlcnZpY2VzUHJvdG87CitpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLm5vdGlmaWNhdGlvbi5Ob3RpZmljYXRpb25SZWNvcmRQcm90bzsKK2ltcG9ydCBhbmRyb2lkLnNlcnZpY2Uubm90aWZpY2F0aW9uLk5vdGlmaWNhdGlvblNlcnZpY2VEdW1wUHJvdG87CitpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLm5vdGlmaWNhdGlvbi5SYW5raW5nSGVscGVyUHJvdG87CitpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLm5vdGlmaWNhdGlvbi5SYW5raW5nSGVscGVyUHJvdG8uUmVjb3JkUHJvdG87CitpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLm5vdGlmaWNhdGlvbi5aZW5Nb2RlOworaW1wb3J0IGFuZHJvaWQuc2VydmljZS5ub3RpZmljYXRpb24uWmVuTW9kZVByb3RvOworaW1wb3J0IGFuZHJvaWQuc2VydmljZS5ub3RpZmljYXRpb24uWmVuUnVsZVByb3RvOworCitpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLklUZXN0RGV2aWNlOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogVGVzdCB0byBjaGVjayB0aGF0IHRoZSBub3RpZmljYXRpb24gc2VydmljZSBwcm9wZXJseSBvdXRwdXRzIGl0cyBkdW1wIHN0YXRlLgorICoKKyAqIG1ha2UgLWozMiBDdHNJbmNpZGVudEhvc3RUZXN0Q2FzZXMKKyAqIGN0cy10cmFkZWZlZCBydW4gc2luZ2xlQ29tbWFuZCBjdHMtZGV2IC1kIC0tbW9kdWxlIEN0c0luY2lkZW50SG9zdFRlc3RDYXNlcworICovCitwdWJsaWMgY2xhc3MgTm90aWZpY2F0aW9uSW5jaWRlbnRUZXN0IGV4dGVuZHMgUHJvdG9EdW1wVGVzdENhc2UgeworICAgIC8vIENvbnN0YW50cyBmcm9tIGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbk1hbmFnZXIKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU1QT1JUQU5DRV9VTlNQRUNJRklFRCA9IC0xMDAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTVBPUlRBTkNFX05PTkUgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTVBPUlRBTkNFX01BWCA9IDU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZJU0lCSUxJVFlfTk9fT1ZFUlJJREUgPSAtMTAwMDsKKyAgICAvLyBDb25zdGFudHMgZnJvbSBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb24KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFJJT1JJVFlfTUlOID0gLTI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBSSU9SSVRZX01BWCA9IDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZJU0lCSUxJVFlfU0VDUkVUID0gLTE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZJU0lCSUxJVFlfUFVCTElDID0gMTsKKyAgICAvLyBUaGVzZSBjb25zdGFudHMgYXJlIHRob3NlIGluIFBhY2thZ2VNYW5hZ2VyLgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVfV0FUQ0ggPSAiYW5kcm9pZC5oYXJkd2FyZS50eXBlLndhdGNoIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERVZJQ0VfU0lERV9URVNUX0FQSyA9ICJDdHNOb3RpZmljYXRpb25JbmNpZGVudFRlc3RBcHAuYXBrIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9BUFBfVEFHID0gIk5vdGlmaWNhdGlvbkluY2lkZW50VGVzdEFjdGl2aXR5IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9BUFBfTE9HID0gIk5vdGlmaWNhdGlvbiBwb3N0ZWQuIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9BQ1RJVklUWSA9CisgICAgICAgICAgICAiY29tLmFuZHJvaWQuc2VydmVyLmN0cy5ub3RpZmljYXRpb25zLy5Ob3RpZmljYXRpb25JbmNpZGVudFRlc3RBY3Rpdml0eSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdBSVRfTVMgPSAxMDAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERVZJQ0VfU0lERV9URVNUX1BLRyA9ICJjb20uYW5kcm9pZC5zZXJ2ZXIuY3RzLm5vdGlmaWNhdGlvbnMiOworCisgICAgLyoqCisgICAgICogVGVzdHMgdGhhdCBhdCBsZWFzdCBvbmUgbm90aWZpY2F0aW9uIGlzIHBvc3RlZCwgYW5kIHZlcmlmeSBpdHMgcHJvcGVydGllcyBhcmUgcGxhdXNpYmxlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3ROb3RpZmljYXRpb25SZWNvcmRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIElUZXN0RGV2aWNlIGRldmljZSA9IGdldERldmljZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW5zdGFsbFBhY2thZ2UoREVWSUNFX1NJREVfVEVTVF9BUEssIC8qIGdyYW50UGVybWlzc2lvbnM9ICovIHRydWUpOworICAgICAgICAgICAgaW50IHJldHJpZXMgPSAzOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGRldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKCJhbSBzdGFydCAtbiAiICsgVEVTVF9BQ1RJVklUWSk7CisgICAgICAgICAgICB9IHdoaWxlICghY2hlY2tMb2djYXRGb3JUZXh0KFRFU1RfQVBQX1RBRywgVEVTVF9BUFBfTE9HLCBXQUlUX01TKSAmJiByZXRyaWVzLS0gPiAwKTsKKworICAgICAgICAgICAgZmluYWwgTm90aWZpY2F0aW9uU2VydmljZUR1bXBQcm90byBkdW1wID0gZ2V0RHVtcChOb3RpZmljYXRpb25TZXJ2aWNlRHVtcFByb3RvLnBhcnNlcigpLAorICAgICAgICAgICAgICAgICAgICAiZHVtcHN5cyBub3RpZmljYXRpb24gLS1wcm90byIpOworCisgICAgICAgICAgICBhc3NlcnRUcnVlKGR1bXAuZ2V0UmVjb3Jkc0NvdW50KCkgPiAwKTsKKyAgICAgICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoTm90aWZpY2F0aW9uUmVjb3JkUHJvdG8gcmVjb3JkIDogZHVtcC5nZXRSZWNvcmRzTGlzdCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlY29yZC5nZXRLZXkoKS5jb250YWlucygiYW5kcm9pZCIpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZWNvcmQuZ2V0SW1wb3J0YW5jZSgpID4gSU1QT1JUQU5DRV9OT05FKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBFbnN1cmUgdGhlc2UgZmllbGRzIGV4aXN0LCBhdCBsZWFzdAorICAgICAgICAgICAgICAgICAgICByZWNvcmQuZ2V0RmxhZ3MoKTsKKyAgICAgICAgICAgICAgICAgICAgcmVjb3JkLmdldENoYW5uZWxJZCgpOworICAgICAgICAgICAgICAgICAgICByZWNvcmQuZ2V0U291bmQoKTsKKyAgICAgICAgICAgICAgICAgICAgcmVjb3JkLmdldEF1ZGlvQXR0cmlidXRlcygpOworICAgICAgICAgICAgICAgICAgICByZWNvcmQuZ2V0Q2FuVmlicmF0ZSgpOworICAgICAgICAgICAgICAgICAgICByZWNvcmQuZ2V0Q2FuU2hvd0xpZ2h0KCk7CisgICAgICAgICAgICAgICAgICAgIHJlY29yZC5nZXRHcm91cEtleSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uUmVjb3JkUHJvdG8uU3RhdGUuZ2V0RGVzY3JpcHRvcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWYWx1ZXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29udGFpbnMocmVjb3JkLmdldFN0YXRlKCkuZ2V0VmFsdWVEZXNjcmlwdG9yKCkpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmb3VuZCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoZGV2aWNlLmdldEluc3RhbGxlZFBhY2thZ2VOYW1lcygpLmNvbnRhaW5zKERFVklDRV9TSURFX1RFU1RfUEtHKSkgeworICAgICAgICAgICAgICAgIGRldmljZS51bmluc3RhbGxQYWNrYWdlKERFVklDRV9TSURFX1RFU1RfUEtHKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBUZXN0IHZhbGlkIHZhbHVlcyBmcm9tIHRoZSBSYW5raW5nSGVscGVyLiAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RSYW5raW5nQ29uZmlnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIE5vdGlmaWNhdGlvblNlcnZpY2VEdW1wUHJvdG8gZHVtcCA9IGdldER1bXAoTm90aWZpY2F0aW9uU2VydmljZUR1bXBQcm90by5wYXJzZXIoKSwKKyAgICAgICAgICAgICAgICAiZHVtcHN5cyBub3RpZmljYXRpb24gLS1wcm90byIpOworCisgICAgICAgIHZlcmlmeVJhbmtpbmdIZWxwZXJQcm90byhkdW1wLmdldFJhbmtpbmdDb25maWcoKSwgUFJJVkFDWV9OT05FKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZlcmlmeVJhbmtpbmdIZWxwZXJQcm90byhSYW5raW5nSGVscGVyUHJvdG8gcmhQcm90bywgZmluYWwgaW50IGZpbHRlckxldmVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChSZWNvcmRQcm90byBycCA6IHJoUHJvdG8uZ2V0UmVjb3Jkc0xpc3QoKSkgeworICAgICAgICAgICAgdmVyaWZ5UmVjb3JkUHJvdG8ocnApOworICAgICAgICB9CisgICAgICAgIGZvciAoUmVjb3JkUHJvdG8gcnAgOiByaFByb3RvLmdldFJlY29yZHNSZXN0b3JlZFdpdGhvdXRVaWRMaXN0KCkpIHsKKyAgICAgICAgICAgIHZlcmlmeVJlY29yZFByb3RvKHJwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdmVyaWZ5UmVjb3JkUHJvdG8oUmVjb3JkUHJvdG8gcnApIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRUcnVlKCFycC5nZXRQYWNrYWdlKCkuaXNFbXB0eSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShycC5nZXRVaWQoKSA9PSAtMTAwMDAgfHwgcnAuZ2V0VWlkKCkgPj0gMCk7CisgICAgICAgIGFzc2VydFRydWUoIlJlY29yZCBpbXBvcnRhbmNlIGlzIGFuIGludmFsaWQgdmFsdWU6ICIgKyBycC5nZXRJbXBvcnRhbmNlKCksCisgICAgICAgICAgICAgICAgcnAuZ2V0SW1wb3J0YW5jZSgpID09IElNUE9SVEFOQ0VfVU5TUEVDSUZJRUQgfHwKKyAgICAgICAgICAgICAgICAocnAuZ2V0SW1wb3J0YW5jZSgpID49IElNUE9SVEFOQ0VfTk9ORSAmJiBycC5nZXRJbXBvcnRhbmNlKCkgPD0gSU1QT1JUQU5DRV9NQVgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShycC5nZXRQcmlvcml0eSgpID49IFBSSU9SSVRZX01JTiAmJiBycC5nZXRQcmlvcml0eSgpIDw9IFBSSU9SSVRZX01BWCk7CisgICAgICAgIGFzc2VydFRydWUoIlJlY29yZCB2aXNpYmlsaXR5IGlzIGFuIGludmFsaWQgdmFsdWU6ICIgKyBycC5nZXRWaXNpYmlsaXR5KCksCisgICAgICAgICAgICAgICAgcnAuZ2V0VmlzaWJpbGl0eSgpID09IFZJU0lCSUxJVFlfTk9fT1ZFUlJJREUgfHwKKyAgICAgICAgICAgICAgICAocnAuZ2V0VmlzaWJpbGl0eSgpID49IFZJU0lCSUxJVFlfU0VDUkVUICYmCisgICAgICAgICAgICAgICAgIHJwLmdldFZpc2liaWxpdHkoKSA8PSBWSVNJQklMSVRZX1BVQkxJQykpOworICAgIH0KKworICAgIC8vIFRlc3RzIGRlZmF1bHQgc3RhdGU6IHplbiBtb2RlIGlzIGEgdmFsaWQvZXhwZWN0ZWQgdmFsdWUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0WmVuTW9kZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBOb3RpZmljYXRpb25TZXJ2aWNlRHVtcFByb3RvIGR1bXAgPSBnZXREdW1wKE5vdGlmaWNhdGlvblNlcnZpY2VEdW1wUHJvdG8ucGFyc2VyKCksCisgICAgICAgICAgICAgICAgImR1bXBzeXMgbm90aWZpY2F0aW9uIC0tcHJvdG8iKTsKKworICAgICAgICB2ZXJpZnlaZW5Nb2RlUHJvdG8oZHVtcC5nZXRaZW4oKSwgUFJJVkFDWV9OT05FKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZlcmlmeVplbk1vZGVQcm90byhaZW5Nb2RlUHJvdG8gemVuUHJvdG8sIGZpbmFsIGludCBmaWx0ZXJMZXZlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydFRydWUoIlVuZXhwZWN0ZWQgWmVuTW9kZSB2YWx1ZSIsCisgICAgICAgICAgICAgICAgWmVuTW9kZS5nZXREZXNjcmlwdG9yKCkuZ2V0VmFsdWVzKCkuY29udGFpbnMoemVuUHJvdG8uZ2V0WmVuTW9kZSgpLmdldFZhbHVlRGVzY3JpcHRvcigpKSk7CisKKyAgICAgICAgTGlzdDxaZW5SdWxlUHJvdG8+IHplblJ1bGVzID0gemVuUHJvdG8uZ2V0RW5hYmxlZEFjdGl2ZUNvbmRpdGlvbnNMaXN0KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgemVuUnVsZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIFplblJ1bGVQcm90byB6ciA9IHplblJ1bGVzLmdldChpKTsKKyAgICAgICAgICAgIENvbmRpdGlvblByb3RvIGNwID0genIuZ2V0Q29uZGl0aW9uKCk7CisgICAgICAgICAgICBpZiAoZmlsdGVyTGV2ZWwgPT0gUFJJVkFDWV9BVVRPKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh6ci5nZXRJZCgpLmlzRW1wdHkoKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh6ci5nZXROYW1lKCkuaXNFbXB0eSgpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHpyLmdldENvbmRpdGlvbklkKCkuaXNFbXB0eSgpKTsKKworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoY3AuZ2V0SWQoKS5pc0VtcHR5KCkpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoY3AuZ2V0U3VtbWFyeSgpLmlzRW1wdHkoKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjcC5nZXRMaW5lMSgpLmlzRW1wdHkoKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjcC5nZXRMaW5lMigpLmlzRW1wdHkoKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGkgPiAwKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlcmUgd2lsbCBiZSBhdCBtb3N0IG9uZSBtYW51YWwgcnVsZSwgdGhlIHJlc3Qgd2lsbCBiZSBhdXRvbWF0aWMuIFRoZSBmaWVsZHMKKyAgICAgICAgICAgICAgICAvLyB0ZXN0ZWQgaGVyZSBhcmUgcmVxdWlyZWQgZm9yIGF1dG9tYXRpYyBydWxlcy4KKyAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZSh6ci5nZXRJZCgpLmlzRW1wdHkoKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UoenIuZ2V0TmFtZSgpLmlzRW1wdHkoKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh6ci5nZXRDcmVhdGlvblRpbWVNcygpID4gMCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UoenIuZ2V0Q29uZGl0aW9uSWQoKS5pc0VtcHR5KCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhc3NlcnRUcnVlKENvbmRpdGlvblByb3RvLlN0YXRlLmdldERlc2NyaXB0b3IoKS5nZXRWYWx1ZXMoKQorICAgICAgICAgICAgICAgICAgICAuY29udGFpbnMoY3AuZ2V0U3RhdGUoKS5nZXRWYWx1ZURlc2NyaXB0b3IoKSkpOworICAgICAgICB9CisKKyAgICAgICAgUG9saWN5UHJvdG8gcG9saWN5ID0gemVuUHJvdG8uZ2V0UG9saWN5KCk7CisgICAgICAgIGZvciAoUG9saWN5UHJvdG8uQ2F0ZWdvcnkgYyA6IHBvbGljeS5nZXRQcmlvcml0eUNhdGVnb3JpZXNMaXN0KCkpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoUG9saWN5UHJvdG8uQ2F0ZWdvcnkuZ2V0RGVzY3JpcHRvcigpLmdldFZhbHVlcygpCisgICAgICAgICAgICAgICAgICAgIC5jb250YWlucyhjLmdldFZhbHVlRGVzY3JpcHRvcigpKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZShQb2xpY3lQcm90by5TZW5kZXIuZ2V0RGVzY3JpcHRvcigpLmdldFZhbHVlcygpCisgICAgICAgICAgICAgICAgLmNvbnRhaW5zKHBvbGljeS5nZXRQcmlvcml0eUNhbGxTZW5kZXIoKS5nZXRWYWx1ZURlc2NyaXB0b3IoKSkpOworICAgICAgICBhc3NlcnRUcnVlKFBvbGljeVByb3RvLlNlbmRlci5nZXREZXNjcmlwdG9yKCkuZ2V0VmFsdWVzKCkKKyAgICAgICAgICAgICAgICAuY29udGFpbnMocG9saWN5LmdldFByaW9yaXR5TWVzc2FnZVNlbmRlcigpLmdldFZhbHVlRGVzY3JpcHRvcigpKSk7CisgICAgICAgIGZvciAoUG9saWN5UHJvdG8uU3VwcHJlc3NlZFZpc3VhbEVmZmVjdCBzdmUgOiBwb2xpY3kuZ2V0U3VwcHJlc3NlZFZpc3VhbEVmZmVjdHNMaXN0KCkpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoUG9saWN5UHJvdG8uU3VwcHJlc3NlZFZpc3VhbEVmZmVjdC5nZXREZXNjcmlwdG9yKCkuZ2V0VmFsdWVzKCkKKyAgICAgICAgICAgICAgICAgICAgLmNvbnRhaW5zKHN2ZS5nZXRWYWx1ZURlc2NyaXB0b3IoKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgdmVyaWZ5Tm90aWZpY2F0aW9uU2VydmljZUR1bXBQcm90byhOb3RpZmljYXRpb25TZXJ2aWNlRHVtcFByb3RvIGR1bXAsIGZpbmFsIGludCBmaWx0ZXJMZXZlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoTm90aWZpY2F0aW9uUmVjb3JkUHJvdG8gbnIgOiBkdW1wLmdldFJlY29yZHNMaXN0KCkpIHsKKyAgICAgICAgICAgIHZlcmlmeU5vdGlmaWNhdGlvblJlY29yZFByb3RvKG5yLCBmaWx0ZXJMZXZlbCk7CisgICAgICAgIH0KKyAgICAgICAgdmVyaWZ5WmVuTW9kZVByb3RvKGR1bXAuZ2V0WmVuKCksIGZpbHRlckxldmVsKTsKKyAgICAgICAgdmVyaWZ5TWFuYWdlZFNlcnZpY2VzUHJvdG8oZHVtcC5nZXROb3RpZmljYXRpb25MaXN0ZW5lcnMoKSwgZmlsdGVyTGV2ZWwpOworICAgICAgICB2ZXJpZnlNYW5hZ2VkU2VydmljZXNQcm90byhkdW1wLmdldE5vdGlmaWNhdGlvbkFzc2lzdGFudHMoKSwgZmlsdGVyTGV2ZWwpOworICAgICAgICB2ZXJpZnlNYW5hZ2VkU2VydmljZXNQcm90byhkdW1wLmdldENvbmRpdGlvblByb3ZpZGVycygpLCBmaWx0ZXJMZXZlbCk7CisgICAgICAgIHZlcmlmeVJhbmtpbmdIZWxwZXJQcm90byhkdW1wLmdldFJhbmtpbmdDb25maWcoKSwgZmlsdGVyTGV2ZWwpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdmVyaWZ5TWFuYWdlZFNlcnZpY2VzUHJvdG8oTWFuYWdlZFNlcnZpY2VzUHJvdG8gbXMsIGZpbmFsIGludCBmaWx0ZXJMZXZlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoTWFuYWdlZFNlcnZpY2VzUHJvdG8uU2VydmljZVByb3RvIHNwIDogbXMuZ2V0QXBwcm92ZWRMaXN0KCkpIHsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIG4gOiBzcC5nZXROYW1lTGlzdCgpKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2Uobi5pc0VtcHR5KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzcC5nZXRVc2VySWQoKSA+PSAwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdmVyaWZ5Tm90aWZpY2F0aW9uUmVjb3JkUHJvdG8oTm90aWZpY2F0aW9uUmVjb3JkUHJvdG8gcmVjb3JkLCBmaW5hbCBpbnQgZmlsdGVyTGV2ZWwpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBFbnN1cmUgdGhlc2UgZmllbGRzIGV4aXN0LCBhdCBsZWFzdAorICAgICAgICByZWNvcmQuZ2V0RmxhZ3MoKTsKKyAgICAgICAgcmVjb3JkLmdldENoYW5uZWxJZCgpOworICAgICAgICByZWNvcmQuZ2V0U291bmQoKTsKKyAgICAgICAgcmVjb3JkLmdldEF1ZGlvQXR0cmlidXRlcygpOworICAgICAgICByZWNvcmQuZ2V0Q2FuVmlicmF0ZSgpOworICAgICAgICByZWNvcmQuZ2V0Q2FuU2hvd0xpZ2h0KCk7CisgICAgICAgIHJlY29yZC5nZXRHcm91cEtleSgpOworCisgICAgICAgIGlmIChmaWx0ZXJMZXZlbCA9PSBQUklWQUNZX0FVVE8pIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUocmVjb3JkLmdldENoYW5uZWxJZCgpLmlzRW1wdHkoKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHJlY29yZC5nZXRTb3VuZCgpLmlzRW1wdHkoKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHJlY29yZC5nZXRHcm91cEtleSgpLmlzRW1wdHkoKSk7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRUcnVlKE5vdGlmaWNhdGlvblJlY29yZFByb3RvLlN0YXRlLmdldERlc2NyaXB0b3IoKS5nZXRWYWx1ZXMoKQorICAgICAgICAgICAgICAgIC5jb250YWlucyhyZWNvcmQuZ2V0U3RhdGUoKS5nZXRWYWx1ZURlc2NyaXB0b3IoKSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvTm90aWZpY2F0aW9uVGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9Ob3RpZmljYXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZjYzNGQuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9Ob3RpZmljYXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXIuY3RzOwotCi1pbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLm5vdGlmaWNhdGlvbi5Ob3RpZmljYXRpb25SZWNvcmRQcm90bzsKLWltcG9ydCBhbmRyb2lkLnNlcnZpY2Uubm90aWZpY2F0aW9uLk5vdGlmaWNhdGlvblNlcnZpY2VEdW1wUHJvdG87Ci1pbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLm5vdGlmaWNhdGlvbi5TdGF0ZTsKLWltcG9ydCBhbmRyb2lkLnNlcnZpY2Uubm90aWZpY2F0aW9uLlplbk1vZGU7Ci1pbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLm5vdGlmaWNhdGlvbi5aZW5Nb2RlUHJvdG87Ci0KLS8qKgotICogVGVzdCB0byBjaGVjayB0aGF0IHRoZSBub3RpZmljYXRpb24gc2VydmljZSBwcm9wZXJseSBvdXRwdXRzIGl0cyBkdW1wIHN0YXRlLgotICoKLSAqIG1ha2UgLWozMiBDdHNJbmNpZGVudEhvc3RUZXN0Q2FzZXMKLSAqIGN0cy10cmFkZWZlZCBydW4gc2luZ2xlQ29tbWFuZCBjdHMtZGV2IC1kIC0tbW9kdWxlIEN0c0luY2lkZW50SG9zdFRlc3RDYXNlcwotICovCi1wdWJsaWMgY2xhc3MgTm90aWZpY2F0aW9uVGVzdCBleHRlbmRzIFByb3RvRHVtcFRlc3RDYXNlIHsKLSAgICAvLyBUaGVzZSBjb25zdGFudHMgYXJlIHRob3NlIGluIFBhY2thZ2VNYW5hZ2VyLgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVfV0FUQ0ggPSAiYW5kcm9pZC5oYXJkd2FyZS50eXBlLndhdGNoIjsKLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoYXQgYXQgbGVhc3Qgb25lIG5vdGlmaWNhdGlvbiBpcyBwb3N0ZWQsIGFuZCB2ZXJpZnkgaXRzIHByb3BlcnRpZXMgYXJlIHBsYXVzaWJsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90aWZpY2F0aW9uUmVjb3JkcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBOb3RpZmljYXRpb25TZXJ2aWNlRHVtcFByb3RvIGR1bXAgPSBnZXREdW1wKE5vdGlmaWNhdGlvblNlcnZpY2VEdW1wUHJvdG8ucGFyc2VyKCksCi0gICAgICAgICAgICAgICAgImR1bXBzeXMgbm90aWZpY2F0aW9uIC0tcHJvdG8iKTsKLQotICAgICAgICBhc3NlcnRUcnVlKGR1bXAuZ2V0UmVjb3Jkc0NvdW50KCkgPiAwKTsKLSAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotICAgICAgICBmb3IgKE5vdGlmaWNhdGlvblJlY29yZFByb3RvIHJlY29yZCA6IGR1bXAuZ2V0UmVjb3Jkc0xpc3QoKSkgewotICAgICAgICAgICAgaWYgKHJlY29yZC5nZXRLZXkoKS5jb250YWlucygiYW5kcm9pZCIpKSB7Ci0gICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhTdGF0ZS5QT1NURUQsIHJlY29yZC5nZXRTdGF0ZSgpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHJlY29yZC5nZXRJbXBvcnRhbmNlKCkgPiAwIC8qIE5vdGlmaWNhdGlvbk1hbmFnZXIuSU1QT1JUQU5DRV9OT05FICovKTsKLQotICAgICAgICAgICAgICAgIC8vIEVuc3VyZSB0aGVzZSBmaWVsZHMgZXhpc3QsIGF0IGxlYXN0Ci0gICAgICAgICAgICAgICAgcmVjb3JkLmdldEZsYWdzKCk7Ci0gICAgICAgICAgICAgICAgcmVjb3JkLmdldENoYW5uZWxJZCgpOwotICAgICAgICAgICAgICAgIHJlY29yZC5nZXRTb3VuZCgpOwotICAgICAgICAgICAgICAgIHJlY29yZC5nZXRTb3VuZFVzYWdlKCk7Ci0gICAgICAgICAgICAgICAgcmVjb3JkLmdldENhblZpYnJhdGUoKTsKLSAgICAgICAgICAgICAgICByZWNvcmQuZ2V0Q2FuU2hvd0xpZ2h0KCk7Ci0gICAgICAgICAgICAgICAgcmVjb3JkLmdldEdyb3VwS2V5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKFN0YXRlLlNOT09aRUQgIT0gcmVjb3JkLmdldFN0YXRlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShmb3VuZCk7Ci0gICAgfQotCi0gICAgLy8gVGVzdHMgZGVmYXVsdCBzdGF0ZTogemVuIG1vZGUgaXMgYSB2YWxpZC9leHBlY3RlZCB2YWx1ZQotICAgIHB1YmxpYyB2b2lkIHRlc3RaZW5Nb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIE5vdGlmaWNhdGlvblNlcnZpY2VEdW1wUHJvdG8gZHVtcCA9IGdldER1bXAoTm90aWZpY2F0aW9uU2VydmljZUR1bXBQcm90by5wYXJzZXIoKSwKLSAgICAgICAgICAgICAgICAiZHVtcHN5cyBub3RpZmljYXRpb24gLS1wcm90byIpOwotICAgICAgICBaZW5Nb2RlUHJvdG8gemVuUHJvdG8gPSBkdW1wLmdldFplbigpOwotCi0gICAgICAgIHN3aXRjaCh6ZW5Qcm90by5nZXRaZW5Nb2RlKCkpIHsKLSAgICAgICAgICAgIGNhc2UgWkVOX01PREVfT0ZGOgotICAgICAgICAgICAgY2FzZSBaRU5fTU9ERV9JTVBPUlRBTlRfSU5URVJSVVBUSU9OUzoKLSAgICAgICAgICAgIGNhc2UgWkVOX01PREVfTk9fSU5URVJSVVBUSU9OUzoKLSAgICAgICAgICAgIGNhc2UgWkVOX01PREVfQUxBUk1TOgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIFplbk1vZGUgdmFsdWUiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIHplblByb3RvLmdldFBvbGljeSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvUGFja2FnZUluY2lkZW50VGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9QYWNrYWdlSW5jaWRlbnRUZXN0LmphdmEKaW5kZXggMThlZmNiMC4uYTlhZTcwNSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9QYWNrYWdlSW5jaWRlbnRUZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9QYWNrYWdlSW5jaWRlbnRUZXN0LmphdmEKQEAgLTM0LDEyICszNCwxMiBAQAogICAgICAgICBzdXBlci50ZWFyRG93bigpOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRQb3NpdGl2ZShTdHJpbmcgbmFtZSwgbG9uZyB2YWx1ZSkgeworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0UG9zaXRpdmUoU3RyaW5nIG5hbWUsIGxvbmcgdmFsdWUpIHsKICAgICAgICAgaWYgKHZhbHVlID4gMCkgcmV0dXJuOwogICAgICAgICBmYWlsKG5hbWUgKyAiIGV4cGVjdGVkIHRvIGJlIHBvc2l0aXZlLCBidXQgd2FzOiAiICsgdmFsdWUpOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBhc3NlcnROb3ROZWdhdGl2ZShTdHJpbmcgbmFtZSwgbG9uZyB2YWx1ZSkgeworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0Tm90TmVnYXRpdmUoU3RyaW5nIG5hbWUsIGxvbmcgdmFsdWUpIHsKICAgICAgICAgaWYgKHZhbHVlID49IDApIHJldHVybjsKICAgICAgICAgZmFpbChuYW1lICsgIiBleHBlY3RlZCB0byBiZSB6ZXJvIG9yIHBvc2l0aXZlLCBidXQgd2FzOiAiICsgdmFsdWUpOwogICAgIH0KQEAgLTYzLDE1ICs2Myw2IEBACiAgICAgICAgIGZpbmFsIFBhY2thZ2VTZXJ2aWNlRHVtcFByb3RvIGR1bXAgPQogICAgICAgICAgICAgICAgIGdldER1bXAoUGFja2FnZVNlcnZpY2VEdW1wUHJvdG8ucGFyc2VyKCksICJkdW1wc3lzIHBhY2thZ2UgLS1wcm90byIpOwogCi0gICAgICAgIGFzc2VydE5vdE51bGwoZHVtcC5nZXRWZXJpZmllclBhY2thZ2UoKS5nZXROYW1lKCkpOwotICAgICAgICBhc3NlcnRQb3NpdGl2ZSgidmVyaWZpZXJfcGFja2FnZSB1aWQiLCBkdW1wLmdldFZlcmlmaWVyUGFja2FnZSgpLmdldFVpZCgpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkdW1wLmdldFNoYXJlZExpYnJhcmllcygwKS5nZXROYW1lKCkpOwotICAgICAgICBpZiAoZHVtcC5nZXRTaGFyZWRMaWJyYXJpZXMoMCkuZ2V0SXNKYXIoKSkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChkdW1wLmdldFNoYXJlZExpYnJhcmllcygwKS5nZXRQYXRoKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChkdW1wLmdldFNoYXJlZExpYnJhcmllcygwKS5nZXRBcGsoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkdW1wLmdldEZlYXR1cmVzKDApLmdldE5hbWUoKSk7CiAgICAgICAgIFBhY2thZ2VQcm90byB0ZXN0UGFja2FnZSA9IG51bGw7CiAgICAgICAgIGZvciAoUGFja2FnZVByb3RvIHBrZyA6IGR1bXAuZ2V0UGFja2FnZXNMaXN0KCkpIHsKICAgICAgICAgICAgIGlmIChwa2cuZ2V0TmFtZSgpLmVxdWFscyhERVZJQ0VfU0lERV9URVNUX1BBQ0tBR0UpKSB7CkBAIC05OSw2ICs5MCwxOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgPT0gUGFja2FnZVByb3RvLlVzZXJJbmZvUHJvdG8uRW5hYmxlZFN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5DT01QT05FTlRfRU5BQkxFRF9TVEFURV9ESVNBQkxFRF9VU0VSKTsKIAorICAgICAgICB2ZXJpZnlQYWNrYWdlU2VydmljZUR1bXBQcm90byhkdW1wLCBQUklWQUNZX05PTkUpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIHZlcmlmeVBhY2thZ2VTZXJ2aWNlRHVtcFByb3RvKFBhY2thZ2VTZXJ2aWNlRHVtcFByb3RvIGR1bXAsIGZpbmFsIGludCBmaWx0ZXJMZXZlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydE5vdE51bGwoZHVtcC5nZXRWZXJpZmllclBhY2thZ2UoKS5nZXROYW1lKCkpOworICAgICAgICBhc3NlcnROb3ROdWxsKGR1bXAuZ2V0U2hhcmVkTGlicmFyaWVzKDApLmdldE5hbWUoKSk7CisgICAgICAgIGlmIChkdW1wLmdldFNoYXJlZExpYnJhcmllcygwKS5nZXRJc0phcigpKSB7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGR1bXAuZ2V0U2hhcmVkTGlicmFyaWVzKDApLmdldFBhdGgoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGR1bXAuZ2V0U2hhcmVkTGlicmFyaWVzKDApLmdldEFwaygpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnROb3ROdWxsKGR1bXAuZ2V0RmVhdHVyZXMoMCkuZ2V0TmFtZSgpKTsKKwogICAgICAgICBQYWNrYWdlU2VydmljZUR1bXBQcm90by5TaGFyZWRVc2VyUHJvdG8gc3lzdGVtVXNlciA9IG51bGw7CiAgICAgICAgIGZvciAoUGFja2FnZVNlcnZpY2VEdW1wUHJvdG8uU2hhcmVkVXNlclByb3RvIHVzZXIgOiBkdW1wLmdldFNoYXJlZFVzZXJzTGlzdCgpKSB7CiAgICAgICAgICAgICBpZiAodXNlci5nZXRVc2VySWQoKSA9PSAxMDAwKSB7CkBAIC0xMDcsNiArMTExLDEyIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgYXNzZXJ0Tm90TnVsbChzeXN0ZW1Vc2VyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHN5c3RlbVVzZXIuZ2V0TmFtZSgpLCAiYW5kcm9pZC51aWQuc3lzdGVtIik7CisgICAgICAgIGFzc2VydEVxdWFscygiYW5kcm9pZC51aWQuc3lzdGVtIiwgc3lzdGVtVXNlci5nZXROYW1lKCkpOworCisgICAgICAgIGlmIChmaWx0ZXJMZXZlbCA9PSBQUklWQUNZX0FVVE8pIHsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIG1zZyA6IGR1bXAuZ2V0TWVzc2FnZXNMaXN0KCkpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKG1zZy5pc0VtcHR5KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9Qb3dlckluY2lkZW50VGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9Qb3dlckluY2lkZW50VGVzdC5qYXZhCmluZGV4IDc3YzAxNjMuLjE0ZTFjNzkgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvUG93ZXJJbmNpZGVudFRlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2luY2lkZW50L3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY3RzL1Bvd2VySW5jaWRlbnRUZXN0LmphdmEKQEAgLTE2LDI4ICsxNiw0MSBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlci5jdHM7CiAKK2ltcG9ydCBhbmRyb2lkLmFwcC5Qcm9jZXNzU3RhdGVFbnVtOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRQcm90bzsKK2ltcG9ydCBhbmRyb2lkLm9zLkJhdHRlcnlQbHVnZ2VkU3RhdGVFbnVtOwogaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyUHJvdG87Ci1pbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLnBvd2VyLlBvd2VyU2VydmljZUR1bXBQcm90bzsKLWltcG9ydCBhbmRyb2lkLnNlcnZpY2UucG93ZXIuUG93ZXJTZXJ2aWNlU2V0dGluZ3NBbmRDb25maWd1cmF0aW9uRHVtcFByb3RvOworaW1wb3J0IGFuZHJvaWQub3MuUG93ZXJNYW5hZ2VySW50ZXJuYWxQcm90bzsKK2ltcG9ydCBhbmRyb2lkLm9zLlBvd2VyTWFuYWdlclByb3RvOworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5wb3dlci5Qb3dlck1hbmFnZXJTZXJ2aWNlRHVtcFByb3RvOworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5wb3dlci5Qb3dlclNlcnZpY2VTZXR0aW5nc0FuZENvbmZpZ3VyYXRpb25EdW1wUHJvdG87CitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLnBvd2VyLldha2VMb2NrUHJvdG87CiAKIC8qKiBUZXN0IHRvIGNoZWNrIHRoYXQgdGhlIHBvd2VyIG1hbmFnZXIgcHJvcGVybHkgb3V0cHV0cyBpdHMgZHVtcCBzdGF0ZS4gKi8KIHB1YmxpYyBjbGFzcyBQb3dlckluY2lkZW50VGVzdCBleHRlbmRzIFByb3RvRHVtcFRlc3RDYXNlIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1lTVEVNX1VJRCA9IDEwMDA7CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0UG93ZXJTZXJ2aWNlRHVtcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBQb3dlclNlcnZpY2VEdW1wUHJvdG8gZHVtcCA9Ci0gICAgICAgICAgICAgICAgZ2V0RHVtcChQb3dlclNlcnZpY2VEdW1wUHJvdG8ucGFyc2VyKCksICJkdW1wc3lzIHBvd2VyIC0tcHJvdG8iKTsKKyAgICAgICAgZmluYWwgUG93ZXJNYW5hZ2VyU2VydmljZUR1bXBQcm90byBkdW1wID0KKyAgICAgICAgICAgICAgICBnZXREdW1wKFBvd2VyTWFuYWdlclNlcnZpY2VEdW1wUHJvdG8ucGFyc2VyKCksICJkdW1wc3lzIHBvd2VyIC0tcHJvdG8iKTsKKworICAgICAgICB2ZXJpZnlQb3dlck1hbmFnZXJTZXJ2aWNlRHVtcFByb3RvKGR1bXAsIFBSSVZBQ1lfTk9ORSk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgdmVyaWZ5UG93ZXJNYW5hZ2VyU2VydmljZUR1bXBQcm90byhQb3dlck1hbmFnZXJTZXJ2aWNlRHVtcFByb3RvIGR1bXAsIGludCBmaWx0ZXJMZXZlbCkgeworICAgICAgICBhc3NlcnRUcnVlKGR1bXAuZ2V0QmF0dGVyeUxldmVsKCkgPj0gMCk7CisgICAgICAgIGFzc2VydFRydWUoZHVtcC5nZXRCYXR0ZXJ5TGV2ZWwoKSA8PSAxMDApOwogCiAgICAgICAgIGFzc2VydFRydWUoCi0gICAgICAgICAgICAgICAgUG93ZXJTZXJ2aWNlRHVtcFByb3RvLldha2VmdWxuZXNzLmdldERlc2NyaXB0b3IoKQorICAgICAgICAgICAgICAgIFBvd2VyTWFuYWdlckludGVybmFsUHJvdG8uV2FrZWZ1bG5lc3MuZ2V0RGVzY3JpcHRvcigpCiAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VmFsdWVzKCkKICAgICAgICAgICAgICAgICAgICAgICAgIC5jb250YWlucyhkdW1wLmdldFdha2VmdWxuZXNzKCkuZ2V0VmFsdWVEZXNjcmlwdG9yKCkpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgKLSAgICAgICAgICAgICAgICBQb3dlclNlcnZpY2VEdW1wUHJvdG8uUGx1Z1R5cGUuZ2V0RGVzY3JpcHRvcigpCisgICAgICAgICAgICAgICAgQmF0dGVyeVBsdWdnZWRTdGF0ZUVudW0uZ2V0RGVzY3JpcHRvcigpCiAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VmFsdWVzKCkKICAgICAgICAgICAgICAgICAgICAgICAgIC5jb250YWlucyhkdW1wLmdldFBsdWdUeXBlKCkuZ2V0VmFsdWVEZXNjcmlwdG9yKCkpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgKLSAgICAgICAgICAgICAgICBQb3dlclNlcnZpY2VEdW1wUHJvdG8uRG9ja1N0YXRlLmdldERlc2NyaXB0b3IoKQorICAgICAgICAgICAgICAgIEludGVudFByb3RvLkRvY2tTdGF0ZS5nZXREZXNjcmlwdG9yKCkKICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWYWx1ZXMoKQogICAgICAgICAgICAgICAgICAgICAgICAgLmNvbnRhaW5zKGR1bXAuZ2V0RG9ja1N0YXRlKCkuZ2V0VmFsdWVEZXNjcmlwdG9yKCkpKTsKIApAQCAtNDcsMjggKzYwLDU5IEBACiAgICAgICAgIGFzc2VydFRydWUoc2V0dGluZ3NBbmRDb25maWd1cmF0aW9uLmdldE1heGltdW1TY3JlZW5EaW1EdXJhdGlvbkNvbmZpZ01zKCkgPj0gMCk7CiAgICAgICAgIGFzc2VydFRydWUoc2V0dGluZ3NBbmRDb25maWd1cmF0aW9uLmdldE1heGltdW1TY3JlZW5EaW1SYXRpb0NvbmZpZygpID4gMCk7CiAgICAgICAgIGFzc2VydFRydWUoc2V0dGluZ3NBbmRDb25maWd1cmF0aW9uLmdldFNjcmVlbk9mZlRpbWVvdXRTZXR0aW5nTXMoKSA+IDApOworICAgICAgICAvLyBEZWZhdWx0IHZhbHVlIGlzIC0xLgorICAgICAgICBhc3NlcnRUcnVlKHNldHRpbmdzQW5kQ29uZmlndXJhdGlvbi5nZXRTbGVlcFRpbWVvdXRTZXR0aW5nTXMoKSA+PSAtMSk7CiAgICAgICAgIGFzc2VydFRydWUoc2V0dGluZ3NBbmRDb25maWd1cmF0aW9uLmdldE1heGltdW1TY3JlZW5PZmZUaW1lb3V0RnJvbURldmljZUFkbWluTXMoKSA+IDApOworICAgICAgICAvLyAtMSBpcyB1c2VkIHRvIGRpc2FibGUsIHNvIGlzIHZhbGlkLgorICAgICAgICBhc3NlcnRUcnVlKHNldHRpbmdzQW5kQ29uZmlndXJhdGlvbi5nZXRVc2VyQWN0aXZpdHlUaW1lb3V0T3ZlcnJpZGVGcm9tV2luZG93TWFuYWdlck1zKCkgPj0gLTEpOwogICAgICAgICBmaW5hbCBQb3dlclNlcnZpY2VTZXR0aW5nc0FuZENvbmZpZ3VyYXRpb25EdW1wUHJvdG8uU2NyZWVuQnJpZ2h0bmVzc1NldHRpbmdMaW1pdHNQcm90bwogICAgICAgICAgICAgICAgIGJyaWdodG5lc3NMaW1pdHMgPSBzZXR0aW5nc0FuZENvbmZpZ3VyYXRpb24uZ2V0U2NyZWVuQnJpZ2h0bmVzc1NldHRpbmdMaW1pdHMoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShicmlnaHRuZXNzTGltaXRzLmdldFNldHRpbmdNYXhpbXVtKCkgPiAwKTsKKyAgICAgICAgaW50IHNldHRpbmdNYXggPSBicmlnaHRuZXNzTGltaXRzLmdldFNldHRpbmdNYXhpbXVtKCk7CisgICAgICAgIGludCBzZXR0aW5nTWluID0gYnJpZ2h0bmVzc0xpbWl0cy5nZXRTZXR0aW5nTWluaW11bSgpOworICAgICAgICBhc3NlcnRUcnVlKHNldHRpbmdNaW4gPj0gMCk7CisgICAgICAgIGFzc2VydFRydWUoc2V0dGluZ01heCA+IDApOworICAgICAgICBhc3NlcnRUcnVlKCJCcmlnaHRuZXNzIGxpbWl0IG1heCBzZXR0aW5nICgiICsgc2V0dGluZ01heCArICIpIGlzIGxlc3MgdGhhbiBtaW4gc2V0dGluZyAoIiArIHNldHRpbmdNaW4gKyAiKSIsCisgICAgICAgICAgICAgICAgc2V0dGluZ01heCA+PSBzZXR0aW5nTWluKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShicmlnaHRuZXNzTGltaXRzLmdldFNldHRpbmdEZWZhdWx0KCkgPiAwKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShicmlnaHRuZXNzTGltaXRzLmdldFNldHRpbmdGb3JWckRlZmF1bHQoKSA+IDApOwogCi0gICAgICAgIGZpbmFsIFBvd2VyU2VydmljZUR1bXBQcm90by5VaWRQcm90byB1aWQgPSBkdW1wLmdldFVpZHMoMCk7CisgICAgICAgIGZpbmFsIFBvd2VyTWFuYWdlclNlcnZpY2VEdW1wUHJvdG8uVWlkU3RhdGVQcm90byB1aWQgPSBkdW1wLmdldFVpZFN0YXRlcygwKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKHVpZC5nZXRVaWQoKSwgU1lTVEVNX1VJRCk7CiAgICAgICAgIGFzc2VydEVxdWFscyh1aWQuZ2V0VWlkU3RyaW5nKCksIEludGVnZXIudG9TdHJpbmcoU1lTVEVNX1VJRCkpOwogICAgICAgICBhc3NlcnRUcnVlKHVpZC5nZXRJc0FjdGl2ZSgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UodWlkLmdldElzUHJvY2Vzc1N0YXRlVW5rbm93bigpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgKLSAgICAgICAgICAgICAgICBQb3dlclNlcnZpY2VEdW1wUHJvdG8uVWlkUHJvdG8uUHJvY2Vzc1N0YXRlLmdldERlc2NyaXB0b3IoKQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFZhbHVlcygpCi0gICAgICAgICAgICAgICAgICAgICAgICAuY29udGFpbnModWlkLmdldFByb2Nlc3NTdGF0ZSgpLmdldFZhbHVlRGVzY3JpcHRvcigpKSk7CisKKyAgICAgICAgZm9yIChQb3dlck1hbmFnZXJTZXJ2aWNlRHVtcFByb3RvLlVpZFN0YXRlUHJvdG8gdXMgOiBkdW1wLmdldFVpZFN0YXRlc0xpc3QoKSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IHVzLmdldFVpZCgpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoMCA8PSB1cy5nZXROdW1XYWtlTG9ja3MoKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKFByb2Nlc3NTdGF0ZUVudW0uZ2V0RGVzY3JpcHRvcigpCisgICAgICAgICAgICAgICAgICAgIC5nZXRWYWx1ZXMoKQorICAgICAgICAgICAgICAgICAgICAuY29udGFpbnModXMuZ2V0UHJvY2Vzc1N0YXRlKCkuZ2V0VmFsdWVEZXNjcmlwdG9yKCkpKTsKKyAgICAgICAgfQogCiAgICAgICAgIGZpbmFsIExvb3BlclByb3RvIGxvb3BlciA9IGR1bXAuZ2V0TG9vcGVyKCk7CiAgICAgICAgIGFzc2VydE5vdE51bGwobG9vcGVyLmdldFRocmVhZE5hbWUoKSk7CiAgICAgICAgIGFzc2VydFRydWUobG9vcGVyLmdldFRocmVhZElkKCkgPiAwKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShsb29wZXIuZ2V0SWRlbnRpdHlIYXNoQ29kZSgpID4gMCk7CiAKICAgICAgICAgYXNzZXJ0VHJ1ZShkdW1wLmdldFN1c3BlbmRCbG9ja2Vyc0NvdW50KCkgPiAwKTsKKworICAgICAgICAvLyBDaGVjayB0aGF0IHRpbWVzL2R1cmF0aW9ucyBhcmUgbm90IGluY29ycmVjdGx5IG5lZ2F0aXZlLgorICAgICAgICBhc3NlcnRUcnVlKGR1bXAuZ2V0Tm90aWZ5TG9uZ1NjaGVkdWxlZE1zKCkgPj0gMCk7CisgICAgICAgIGFzc2VydFRydWUoZHVtcC5nZXROb3RpZnlMb25nRGlzcGF0Y2hlZE1zKCkgPj0gMCk7CisgICAgICAgIGFzc2VydFRydWUoZHVtcC5nZXROb3RpZnlMb25nTmV4dENoZWNrTXMoKSA+PSAwKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkdW1wLmdldExhc3RXYWtlVGltZU1zKCkgPj0gMCk7CisgICAgICAgIGFzc2VydFRydWUoZHVtcC5nZXRMYXN0U2xlZXBUaW1lTXMoKSA+PSAwKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkdW1wLmdldExhc3RVc2VyQWN0aXZpdHlUaW1lTXMoKSA+PSAwKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkdW1wLmdldExhc3RVc2VyQWN0aXZpdHlUaW1lTm9DaGFuZ2VMaWdodHNNcygpID49IDApOworICAgICAgICBhc3NlcnRUcnVlKGR1bXAuZ2V0TGFzdEludGVyYWN0aXZlUG93ZXJIaW50VGltZU1zKCkgPj0gMCk7CisgICAgICAgIGFzc2VydFRydWUoZHVtcC5nZXRMYXN0U2NyZWVuQnJpZ2h0bmVzc0Jvb3N0VGltZU1zKCkgPj0gMCk7CisgICAgICAgIC8vIC0xIGlzIGEgdmFsaWQgdmFsdWUuCisgICAgICAgIGFzc2VydFRydWUoZHVtcC5nZXRTbGVlcFRpbWVvdXRNcygpID49IC0xKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkdW1wLmdldFNjcmVlbk9mZlRpbWVvdXRNcygpID49IDApOworICAgICAgICBhc3NlcnRUcnVlKGR1bXAuZ2V0U2NyZWVuRGltRHVyYXRpb25NcygpID49IDApOworCisgICAgICAgIGZvciAoV2FrZUxvY2tQcm90byB3bCA6IGR1bXAuZ2V0V2FrZUxvY2tzTGlzdCgpKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKDAgPD0gd2wuZ2V0QWNxTXMoKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKDAgPD0gd2wuZ2V0VWlkKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IHdsLmdldFBpZCgpKTsKKyAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvUHJpbnRQcm90b1Rlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvUHJpbnRQcm90b1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjdjZWNhCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9QcmludFByb3RvVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXIuY3RzOworCitpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLnByaW50LkFjdGl2ZVByaW50U2VydmljZVByb3RvOworaW1wb3J0IGFuZHJvaWQuc2VydmljZS5wcmludC5DYWNoZWRQcmludEpvYlByb3RvOworaW1wb3J0IGFuZHJvaWQuc2VydmljZS5wcmludC5QcmludGVyRGlzY292ZXJ5U2Vzc2lvblByb3RvOworaW1wb3J0IGFuZHJvaWQuc2VydmljZS5wcmludC5QcmludERvY3VtZW50SW5mb1Byb3RvOworaW1wb3J0IGFuZHJvaWQuc2VydmljZS5wcmludC5QcmludGVySWRQcm90bzsKK2ltcG9ydCBhbmRyb2lkLnNlcnZpY2UucHJpbnQuUHJpbnRlckluZm9Qcm90bzsKK2ltcG9ydCBhbmRyb2lkLnNlcnZpY2UucHJpbnQuUHJpbnRKb2JJbmZvUHJvdG87CitpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLnByaW50LlByaW50U2VydmljZUR1bXBQcm90bzsKK2ltcG9ydCBhbmRyb2lkLnNlcnZpY2UucHJpbnQuUHJpbnRTcG9vbGVySW50ZXJuYWxTdGF0ZVByb3RvOworaW1wb3J0IGFuZHJvaWQuc2VydmljZS5wcmludC5QcmludFNwb29sZXJTdGF0ZVByb3RvOworaW1wb3J0IGFuZHJvaWQuc2VydmljZS5wcmludC5QcmludFVzZXJTdGF0ZVByb3RvOworCitpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLkRldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuSVRlc3REZXZpY2U7CitpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQubG9nLkxvZ1V0aWw7CisKKy8qKgorICogVGVzdCBwcm90byBkdW1wIG9mIHByaW50CisgKi8KK3B1YmxpYyBjbGFzcyBQcmludFByb3RvVGVzdCBleHRlbmRzIFByb3RvRHVtcFRlc3RDYXNlIHsKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoYXQgcHJpbnQgZHVtcCBpcyByZWFzb25hYmxlCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3REdW1wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIElmIHRoZSBkZXZpY2UgZG9lc24ndCBzdXBwb3J0IHByaW50aW5nLCB0aGVuIHBhc3MuCisgICAgICAgIGlmICghc3VwcG9ydHNQcmludGluZyhnZXREZXZpY2UoKSkpIHsKKyAgICAgICAgICAgIExvZ1V0aWwuQ0xvZy5kKCJCeXBhc3MgYXMgYW5kcm9pZC5zb2Z0d2FyZS5wcmludCBpcyBub3Qgc3VwcG9ydGVkLiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgUHJpbnRTZXJ2aWNlRHVtcFByb3RvIGR1bXAgPSBnZXREdW1wKFByaW50U2VydmljZUR1bXBQcm90by5wYXJzZXIoKSwKKyAgICAgICAgICAgICAgICAiZHVtcHN5cyBwcmludCAtLXByb3RvIik7CisKKyAgICAgICAgdmVyaWZ5UHJpbnRTZXJ2aWNlRHVtcFByb3RvKGR1bXAsIFBSSVZBQ1lfTk9ORSk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgdmVyaWZ5UHJpbnRTZXJ2aWNlRHVtcFByb3RvKFByaW50U2VydmljZUR1bXBQcm90byBkdW1wLCBmaW5hbCBpbnQgZmlsdGVyTGV2ZWwpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoZHVtcC5nZXRVc2VyU3RhdGVzQ291bnQoKSA+IDApIHsKKyAgICAgICAgICAgIFByaW50VXNlclN0YXRlUHJvdG8gdXNlclN0YXRlID0gZHVtcC5nZXRVc2VyU3RhdGVzTGlzdCgpLmdldCgwKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCB1c2VyU3RhdGUuZ2V0VXNlcklkKCkpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChQcmludFVzZXJTdGF0ZVByb3RvIHB1cyA6IGR1bXAuZ2V0VXNlclN0YXRlc0xpc3QoKSkgeworICAgICAgICAgICAgZm9yIChBY3RpdmVQcmludFNlcnZpY2VQcm90byBhcHMgOiBwdXMuZ2V0QWN0aXZlU2VydmljZXNMaXN0KCkpIHsKKyAgICAgICAgICAgICAgICB2ZXJpZnlBY3RpdmVQcmludFNlcnZpY2VQcm90byhhcHMsIGZpbHRlckxldmVsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoQ2FjaGVkUHJpbnRKb2JQcm90byBjcGogOiBwdXMuZ2V0Q2FjaGVkUHJpbnRKb2JzTGlzdCgpKSB7CisgICAgICAgICAgICAgICAgdmVyaWZ5UHJpbnRKb2JJbmZvUHJvdG8oY3BqLmdldFByaW50Sm9iKCksIGZpbHRlckxldmVsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoUHJpbnRlckRpc2NvdmVyeVNlc3Npb25Qcm90byBwZHMgOiBwdXMuZ2V0RGlzY292ZXJ5U2Vzc2lvbnNMaXN0KCkpIHsKKyAgICAgICAgICAgICAgICB2ZXJpZnlQcmludGVyRGlzY292ZXJ5U2Vzc2lvblByb3RvKHBkcywgZmlsdGVyTGV2ZWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmVyaWZ5UHJpbnRTcG9vbGVyU3RhdGVQcm90byhwdXMuZ2V0UHJpbnRTcG9vbGVyU3RhdGUoKSwgZmlsdGVyTGV2ZWwpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2ZXJpZnlBY3RpdmVQcmludFNlcnZpY2VQcm90byhBY3RpdmVQcmludFNlcnZpY2VQcm90byBhcHMsIGZpbmFsIGludCBmaWx0ZXJMZXZlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoUHJpbnRlcklkUHJvdG8gcGlwIDogYXBzLmdldFRyYWNrZWRQcmludGVyc0xpc3QoKSkgeworICAgICAgICAgICAgdmVyaWZ5UHJpbnRlcklkUHJvdG8ocGlwLCBmaWx0ZXJMZXZlbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZlcmlmeVByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uUHJvdG8oUHJpbnRlckRpc2NvdmVyeVNlc3Npb25Qcm90byBwZHMsIGZpbmFsIGludCBmaWx0ZXJMZXZlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoUHJpbnRlcklkUHJvdG8gcGlwIDogcGRzLmdldFRyYWNrZWRQcmludGVyUmVxdWVzdHNMaXN0KCkpIHsKKyAgICAgICAgICAgIHZlcmlmeVByaW50ZXJJZFByb3RvKHBpcCwgZmlsdGVyTGV2ZWwpOworICAgICAgICB9CisgICAgICAgIGZvciAoUHJpbnRlckluZm9Qcm90byBwaXAgOiBwZHMuZ2V0UHJpbnRlckxpc3QoKSkgeworICAgICAgICAgICAgdmVyaWZ5UHJpbnRlckluZm9Qcm90byhwaXAsIGZpbHRlckxldmVsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdmVyaWZ5UHJpbnREb2N1bWVudEluZm9Qcm90byhQcmludERvY3VtZW50SW5mb1Byb3RvIHBkaSwgZmluYWwgaW50IGZpbHRlckxldmVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGZpbHRlckxldmVsID09IFBSSVZBQ1lfQVVUTykgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShwZGkuZ2V0TmFtZSgpLmlzRW1wdHkoKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IHBkaS5nZXRQYWdlQ291bnQoKSk7CisgICAgICAgIGFzc2VydFRydWUoMCA8PSBwZGkuZ2V0RGF0YVNpemUoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2ZXJpZnlQcmludGVySWRQcm90byhQcmludGVySWRQcm90byBwaXAsIGZpbmFsIGludCBmaWx0ZXJMZXZlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChmaWx0ZXJMZXZlbCA9PSBQUklWQUNZX0FVVE8pIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUocGlwLmdldExvY2FsSWQoKS5pc0VtcHR5KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2ZXJpZnlQcmludGVySW5mb1Byb3RvKFByaW50ZXJJbmZvUHJvdG8gcGlwLCBmaW5hbCBpbnQgZmlsdGVyTGV2ZWwpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB2ZXJpZnlQcmludGVySWRQcm90byhwaXAuZ2V0SWQoKSwgZmlsdGVyTGV2ZWwpOworICAgICAgICBpZiAoZmlsdGVyTGV2ZWwgPT0gUFJJVkFDWV9BVVRPKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHBpcC5nZXROYW1lKCkuaXNFbXB0eSgpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocGlwLmdldERlc2NyaXB0aW9uKCkuaXNFbXB0eSgpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgIFByaW50ZXJJbmZvUHJvdG8uU3RhdHVzLmdldERlc2NyaXB0b3IoKS5nZXRWYWx1ZXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgLmNvbnRhaW5zKHBpcC5nZXRTdGF0dXMoKS5nZXRWYWx1ZURlc2NyaXB0b3IoKSkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdmVyaWZ5UHJpbnRKb2JJbmZvUHJvdG8oUHJpbnRKb2JJbmZvUHJvdG8gcGppLCBmaW5hbCBpbnQgZmlsdGVyTGV2ZWwpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoZmlsdGVyTGV2ZWwgPT0gUFJJVkFDWV9BVVRPKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHBqaS5nZXRMYWJlbCgpLmlzRW1wdHkoKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHBqaS5nZXRQcmludEpvYklkKCkuaXNFbXB0eSgpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocGppLmdldFRhZygpLmlzRW1wdHkoKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICAgICBQcmludEpvYkluZm9Qcm90by5TdGF0ZS5nZXREZXNjcmlwdG9yKCkuZ2V0VmFsdWVzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5jb250YWlucyhwamkuZ2V0U3RhdGUoKS5nZXRWYWx1ZURlc2NyaXB0b3IoKSkpOworICAgICAgICB2ZXJpZnlQcmludGVySWRQcm90byhwamkuZ2V0UHJpbnRlcigpLCBmaWx0ZXJMZXZlbCk7CisgICAgICAgIHZlcmlmeVByaW50RG9jdW1lbnRJbmZvUHJvdG8ocGppLmdldERvY3VtZW50SW5mbygpLCBmaWx0ZXJMZXZlbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2ZXJpZnlQcmludFNwb29sZXJTdGF0ZVByb3RvKFByaW50U3Bvb2xlclN0YXRlUHJvdG8gcHNzLCBmaW5hbCBpbnQgZmlsdGVyTGV2ZWwpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB2ZXJpZnlQcmludFNwb29sZXJJbnRlcm5hbFN0YXRlUHJvdG8ocHNzLmdldEludGVybmFsU3RhdGUoKSwgZmlsdGVyTGV2ZWwpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdmVyaWZ5UHJpbnRTcG9vbGVySW50ZXJuYWxTdGF0ZVByb3RvKFByaW50U3Bvb2xlckludGVybmFsU3RhdGVQcm90byBwc2lzLCBmaW5hbCBpbnQgZmlsdGVyTGV2ZWwpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmb3IgKFByaW50Sm9iSW5mb1Byb3RvIHBqaSA6IHBzaXMuZ2V0UHJpbnRKb2JzTGlzdCgpKSB7CisgICAgICAgICAgICB2ZXJpZnlQcmludEpvYkluZm9Qcm90byhwamksIGZpbHRlckxldmVsKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmlsdGVyTGV2ZWwgPT0gUFJJVkFDWV9BVVRPKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKDAgPT0gcHNpcy5nZXRQcmludEpvYkZpbGVzQ291bnQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbGVhbiBzdXBwb3J0c1ByaW50aW5nKElUZXN0RGV2aWNlIGRldmljZSkgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBkZXZpY2UuaGFzRmVhdHVyZSgiYW5kcm9pZC5zb2Z0d2FyZS5wcmludCIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvUHJvY1N0YXRzUHJvdG9UZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL2luY2lkZW50L3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY3RzL1Byb2NTdGF0c1Byb3RvVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MGRhMjIKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2luY2lkZW50L3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY3RzL1Byb2NTdGF0c1Byb3RvVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlci5jdHM7CisKK2ltcG9ydCBhbmRyb2lkLnNlcnZpY2UucHJvY3N0YXRzLlByb2Nlc3NTdGF0c1Byb3RvOworaW1wb3J0IGFuZHJvaWQuc2VydmljZS5wcm9jc3RhdHMuUHJvY2Vzc1N0YXRzU2VydmljZUR1bXBQcm90bzsKKworLyoqCisgKiBUZXN0IHByb3RvIGR1bXAgb2YgcHJvY3N0YXRzCisgKgorICogJCBtYWtlIC1qMzIgQ3RzSW5jaWRlbnRIb3N0VGVzdENhc2VzCisgKiAkIGN0cy10cmFkZWZlZCBydW4gY3RzLWRldiAtbSBDdHNJbmNpZGVudEhvc3RUZXN0Q2FzZXMgXAorICogLXQgY29tLmFuZHJvaWQuc2VydmVyLmN0cy5Qcm9jU3RhdHNQcm90b1Rlc3QKKyAqLworcHVibGljIGNsYXNzIFByb2NTdGF0c1Byb3RvVGVzdCBleHRlbmRzIFByb3RvRHVtcFRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERVZJQ0VfU0lERV9URVNUX0FQSyA9ICJDdHNQcm9jU3RhdHNQcm90b0FwcC5hcGsiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERVZJQ0VfU0lERV9URVNUX1BBQ0tBR0UgPSAiY29tLmFuZHJvaWQuc2VydmVyLmN0cy5wcm9jc3RhdHMiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0FQUF9UQUcgPSAiUHJvY3N0YXRzQXBwUnVubmluZ1Rlc3QiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0FQUF9MT0cgPSAiUHJvY3N0YXRzIGFwcCBpcyBydW5uaW5nIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0FJVF9NUyA9IDEwMDA7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICBnZXREZXZpY2UoKS5leGVjdXRlU2hlbGxDb21tYW5kKCJkdW1wc3lzIHByb2NzdGF0cyAtLWNsZWFyIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZ2V0RGV2aWNlKCkudW5pbnN0YWxsUGFja2FnZShERVZJQ0VfU0lERV9URVNUX1BBQ0tBR0UpOworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhhdCBwcm9jc3RhdHMgZHVtcCBpcyByZWFzb25hYmxlLCBpdCBpbnN0YWxscyBwcm9jc3RhdHMgYXBwIGFuZAorICAgICAqIHN0YXJ0cyB0aGUgYWN0aXZpdHksIHRoZW4gYXNzZXJ0cyB0aGUgcHJvY3N0YXRzIGR1bXAgY29udGFpbnMgdGhlIHBhY2thZ2UuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3REdW1wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGluc3RhbGxQYWNrYWdlKERFVklDRV9TSURFX1RFU1RfQVBLLCAvKiBncmFudFBlcm1pc3Npb25zPSAqLyB0cnVlKTsKKyAgICAgICAgaW50IHJldHJpZXMgPSAzOworICAgICAgICBkbyB7CisgICAgICAgICAgICBnZXREZXZpY2UoKS5leGVjdXRlU2hlbGxDb21tYW5kKAorICAgICAgICAgICAgICAgICJhbSBzdGFydCAtbiBjb20uYW5kcm9pZC5zZXJ2ZXIuY3RzLnByb2NzdGF0cy8uU2ltcGxlQWN0aXZpdHkiKTsKKyAgICAgICAgfSB3aGlsZSAoIWNoZWNrTG9nY2F0Rm9yVGV4dChURVNUX0FQUF9UQUcsIFRFU1RfQVBQX0xPRywgV0FJVF9NUykgJiYgcmV0cmllcy0tID4gMCk7CisKKyAgICAgICAgZmluYWwgUHJvY2Vzc1N0YXRzU2VydmljZUR1bXBQcm90byBkdW1wID0gZ2V0RHVtcChQcm9jZXNzU3RhdHNTZXJ2aWNlRHVtcFByb3RvLnBhcnNlcigpLAorICAgICAgICAgICAgICAgICJkdW1wc3lzIHByb2NzdGF0cyAtLXByb3RvIik7CisKKyAgICAgICAgaW50IE4gPSBkdW1wLmdldFByb2NzdGF0c05vdygpLmdldFByb2Nlc3NTdGF0c0NvdW50KCk7CisgICAgICAgIGJvb2xlYW4gY29udGFpbnNUZXN0QXBwID0gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CisgICAgICAgICAgICBQcm9jZXNzU3RhdHNQcm90byBwcyA9IGR1bXAuZ2V0UHJvY3N0YXRzTm93KCkuZ2V0UHJvY2Vzc1N0YXRzKGkpOworICAgICAgICAgICAgaWYgKERFVklDRV9TSURFX1RFU1RfUEFDS0FHRS5lcXVhbHMocHMuZ2V0UHJvY2VzcygpKSkgeworICAgICAgICAgICAgICAgIGNvbnRhaW5zVGVzdEFwcCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRUcnVlKE4gPiAwKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb250YWluc1Rlc3RBcHApOyAvLyBmb3VuZCB0ZXN0IGFwcCBpbiBwcm9jc3RhdHMgZHVtcAorICAgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvUHJvdG9EdW1wVGVzdENhc2UuamF2YSBiL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvUHJvdG9EdW1wVGVzdENhc2UuamF2YQppbmRleCA1NzM5YmY0Li4xMzcxOGE5IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2luY2lkZW50L3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY3RzL1Byb3RvRHVtcFRlc3RDYXNlLmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9Qcm90b0R1bXBUZXN0Q2FzZS5qYXZhCkBAIC0xNywyNiArMTcsMzAgQEAKIHBhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyLmN0czsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLmJ1aWxkLkNvbXBhdGliaWxpdHlCdWlsZEhlbHBlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuSVNoZWxsT3V0cHV0UmVjZWl2ZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLnRlc3RydW5uZXIuUmVtb3RlQW5kcm9pZFRlc3RSdW5uZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLnRlc3RydW5uZXIuVGVzdElkZW50aWZpZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLnRlc3RydW5uZXIuVGVzdFJlc3VsdDsKIGltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIudGVzdHJ1bm5lci5UZXN0UmVzdWx0LlRlc3RTdGF0dXM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLnRlc3RydW5uZXIuVGVzdFJ1blJlc3VsdDsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5idWlsZC5JQnVpbGRJbmZvOwogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5Db2xsZWN0aW5nQnl0ZU91dHB1dFJlY2VpdmVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5Db2xsZWN0aW5nT3V0cHV0UmVjZWl2ZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLkRldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5sb2cuTG9nVXRpbC5DTG9nOwogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnJlc3VsdC5Db2xsZWN0aW5nVGVzdExpc3RlbmVyOworaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnJlc3VsdC5UZXN0RGVzY3JpcHRpb247CitpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQucmVzdWx0LlRlc3RSZXN1bHQ7CitpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQucmVzdWx0LlRlc3RSdW5SZXN1bHQ7CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuRGV2aWNlVGVzdENhc2U7CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSUJ1aWxkUmVjZWl2ZXI7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkNoYXJzZXRzOwogaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuTWVzc2FnZUxpdGU7CiBpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5QYXJzZXI7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOwogaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwogaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwogCkBAIC00NCwxMCArNDgsMjkgQEAKIGltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOwogCiBwdWJsaWMgY2xhc3MgUHJvdG9EdW1wVGVzdENhc2UgZXh0ZW5kcyBEZXZpY2VUZXN0Q2FzZSBpbXBsZW1lbnRzIElCdWlsZFJlY2VpdmVyIHsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBQUklWQUNZX0FVVE8gPSAwOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFBSSVZBQ1lfRVhQTElDSVQgPSAxOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFBSSVZBQ1lfTE9DQUwgPSAyOworICAgIC8qKiBObyBwcml2YWN5IGZpbHRlcmluZyBoYXMgYmVlbiBkb25lLiBBbGwgZmllbGRzIHNob3VsZCBiZSBwcmVzZW50LiAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFBSSVZBQ1lfTk9ORSA9IDM7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgcHJpdmFjeVRvU3RyaW5nKGludCBwcml2YWN5KSB7CisgICAgICAgIHN3aXRjaCAocHJpdmFjeSkgeworICAgICAgICAgICAgY2FzZSBQUklWQUNZX0FVVE86CisgICAgICAgICAgICAgICAgcmV0dXJuICJBVVRPIjsKKyAgICAgICAgICAgIGNhc2UgUFJJVkFDWV9FWFBMSUNJVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIkVYUExJQ0lUIjsKKyAgICAgICAgICAgIGNhc2UgUFJJVkFDWV9MT0NBTDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIkxPQ0FMIjsKKyAgICAgICAgICAgIGNhc2UgUFJJVkFDWV9OT05FOgorICAgICAgICAgICAgICAgIHJldHVybiAiTk9ORSI7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiAiVU5LTk9XTiI7CisgICAgICAgIH0KKyAgICB9CiAKICAgICBwcm90ZWN0ZWQgSUJ1aWxkSW5mbyBtQ3RzQnVpbGQ7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9SVU5ORVIgPSAiYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUlVOTkVSID0gImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciI7CiAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewpAQCAtNzMsOCArOTYsNyBAQAogICAgICAqIEB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIElmIHRoZXJlIHdhcyBhbiBlcnJvciBwYXJzaW5nCiAgICAgICogICAgICB0aGUgcHJvdG8uIE5vdGUgdGhhdCBhIDAgbGVuZ3RoIGJ1ZmZlciBpcyBub3QgbmVjZXNzYXJpbHkgYW4gZXJyb3IuCiAgICAgICovCi0gICAgcHVibGljIDxUIGV4dGVuZHMgTWVzc2FnZUxpdGU+IFQgZ2V0RHVtcChQYXJzZXI8VD4gcGFyc2VyLCBTdHJpbmcgY29tbWFuZCkKLSAgICAgICAgICAgIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24sIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7CisgICAgcHVibGljIDxUIGV4dGVuZHMgTWVzc2FnZUxpdGU+IFQgZ2V0RHVtcChQYXJzZXI8VD4gcGFyc2VyLCBTdHJpbmcgY29tbWFuZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIENvbGxlY3RpbmdCeXRlT3V0cHV0UmVjZWl2ZXIgcmVjZWl2ZXIgPSBuZXcgQ29sbGVjdGluZ0J5dGVPdXRwdXRSZWNlaXZlcigpOwogICAgICAgICBnZXREZXZpY2UoKS5leGVjdXRlU2hlbGxDb21tYW5kKGNvbW1hbmQsIHJlY2VpdmVyKTsKICAgICAgICAgcmV0dXJuIHBhcnNlci5wYXJzZUZyb20ocmVjZWl2ZXIuZ2V0T3V0cHV0KCkpOwpAQCAtMTMzLDcgKzE1NSw3IEBACiAgICAgICAgIGlmIChyZXN1bHQuaGFzRmFpbGVkVGVzdHMoKSkgewogICAgICAgICAgICAgLy8gYnVpbGQgYSBtZWFuaW5nZnVsIGVycm9yIG1lc3NhZ2UKICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgZXJyb3JCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoIk9uLWRldmljZSB0ZXN0cyBmYWlsZWQ6XG4iKTsKLSAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFRlc3RJZGVudGlmaWVyLCBUZXN0UmVzdWx0PiByZXN1bHRFbnRyeSA6CisgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxUZXN0RGVzY3JpcHRpb24sIFRlc3RSZXN1bHQ+IHJlc3VsdEVudHJ5IDoKICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldFRlc3RSZXN1bHRzKCkuZW50cnlTZXQoKSkgewogICAgICAgICAgICAgICAgIGlmICghcmVzdWx0RW50cnkuZ2V0VmFsdWUoKS5nZXRTdGF0dXMoKS5lcXVhbHMoVGVzdFN0YXR1cy5QQVNTRUQpKSB7CiAgICAgICAgICAgICAgICAgICAgIGVycm9yQnVpbGRlci5hcHBlbmQocmVzdWx0RW50cnkuZ2V0S2V5KCkudG9TdHJpbmcoKSk7CkBAIC0xNDYsMTQgKzE2OCwyMSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEV4ZWN1dGUgdGhlIGdpdmVuIGNvbW1hbmQsIGFuZCByZXR1cm5zIHRoZSBvdXRwdXQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBleGVjQ29tbWFuZEFuZEdldChTdHJpbmcgY29tbWFuZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIENvbGxlY3RpbmdPdXRwdXRSZWNlaXZlciByZWNlaXZlciA9IG5ldyBDb2xsZWN0aW5nT3V0cHV0UmVjZWl2ZXIoKTsKKyAgICAgICAgZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZChjb21tYW5kLCByZWNlaXZlcik7CisgICAgICAgIHJldHVybiByZWNlaXZlci5nZXRPdXRwdXQoKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBFeGVjdXRlIHRoZSBnaXZlbiBjb21tYW5kLCBhbmQgZmluZCB0aGUgZ2l2ZW4gcGF0dGVybiB3aXRoIGdpdmVuIGZsYWdzIGFuZCByZXR1cm4gdGhlCiAgICAgICogcmVzdWx0aW5nIHtAbGluayBNYXRjaGVyfS4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgTWF0Y2hlciBleGVjQ29tbWFuZEFuZEZpbmQoU3RyaW5nIGNvbW1hbmQsIFN0cmluZyBwYXR0ZXJuLCBpbnQgcGF0dGVybkZsYWdzKQogICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIENvbGxlY3RpbmdPdXRwdXRSZWNlaXZlciByZWNlaXZlciA9IG5ldyBDb2xsZWN0aW5nT3V0cHV0UmVjZWl2ZXIoKTsKLSAgICAgICAgZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZChjb21tYW5kLCByZWNlaXZlcik7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBvdXRwdXQgPSByZWNlaXZlci5nZXRPdXRwdXQoKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIG91dHB1dCA9IGV4ZWNDb21tYW5kQW5kR2V0KGNvbW1hbmQpOwogICAgICAgICBmaW5hbCBNYXRjaGVyIG1hdGNoZXIgPSBQYXR0ZXJuLmNvbXBpbGUocGF0dGVybiwgcGF0dGVybkZsYWdzKS5tYXRjaGVyKG91dHB1dCk7CiAgICAgICAgIGFzc2VydFRydWUoIlBhdHRlcm4gJyIgKyBwYXR0ZXJuICsgIicgZGlkbid0IG1hdGNoLiBPdXRwdXQ9XG4iICsgb3V0cHV0LCBtYXRjaGVyLmZpbmQoKSk7CiAgICAgICAgIHJldHVybiBtYXRjaGVyOwpAQCAtMTc2LDQgKzIwNSw3NSBAQAogICAgICAgICBhc3NlcnRUcnVlKCJObyBncm91cCBmb3VuZCBmb3IgcGF0dGVybiAnIiArIHBhdHRlcm4gKyAiJyIsIG1hdGNoZXIuZ3JvdXBDb3VudCgpID4gMCk7CiAgICAgICAgIHJldHVybiBtYXRjaGVyLmdyb3VwKDEpOwogICAgIH0KKworICAgIC8qKgorICAgICAqIFJ1bnMgbG9nY2F0IGFuZCB3YWl0cyAoZm9yIGEgbWF4aW11bXVtIG9mIG1heFRpbWVNcykgdW50aWwgdGhlIGRlc2lyZWQgdGV4dCBpcyBkaXNwbGF5ZWQgd2l0aAorICAgICAqIHRoZSBnaXZlbiB0YWcuCisgICAgICogTG9nY2F0IGlzIG5vdCBjbGVhcmVkLCBzbyBtYWtlIHN1cmUgdGhhdCB0ZXh0IGlzIHVuaXF1ZSAod29uJ3QgZ2V0IGZhbHNlIGhpdHMgZnJvbSBvbGQgZGF0YSkuCisgICAgICogTm90ZSB0aGF0LCBpbiBwcmFjdGljZSwgdGhlIGFjdHVhbCBtYXggd2FpdCB0aW1lIHNlZW1zIHRvIGJlIGFib3V0IDEwcyBsb25nZXIgdGhhbiBtYXhUaW1lTXMuCisgICAgICogUmV0dXJucyB0cnVlIG1lYW5zIHRoZSBkZXNpcmVkIGxvZyBsaW5lIGlzIGZvdW5kLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGNoZWNrTG9nY2F0Rm9yVGV4dChTdHJpbmcgbG9nY2F0VGFnLCBTdHJpbmcgdGV4dCwgaW50IG1heFRpbWVNcykgeworICAgICAgICBJU2hlbGxPdXRwdXRSZWNlaXZlciByZWNlaXZlciA9IG5ldyBJU2hlbGxPdXRwdXRSZWNlaXZlcigpIHsKKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nQnVpbGRlciBtT3V0cHV0QnVmZmVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgQXRvbWljQm9vbGVhbiBtSXNDYW5jZWxlZCA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBhZGRPdXRwdXQoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWlzQ2FuY2VsbGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtT3V0cHV0QnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcyA9IG5ldyBTdHJpbmcoZGF0YSwgb2Zmc2V0LCBsZW5ndGgsIENoYXJzZXRzLlVURl84KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRCdWZmZXIuYXBwZW5kKHMpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrQnVmZmVyRm9yVGV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlzQ2FuY2VsZWQuc2V0KHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tCdWZmZXJGb3JUZXh0KCkgeworICAgICAgICAgICAgICAgIGlmIChtT3V0cHV0QnVmZmVyLmluZGV4T2YodGV4dCkgPiAtMSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBkZWxldGUgYWxsIG9sZCBkYXRhIChleGNlcHQgdGhlIGxhc3QgZmV3IGNoYXJzKSBzaW5jZSB0aGV5IGRvbid0IGNvbnRhaW4gdGV4dAorICAgICAgICAgICAgICAgICAgICAvLyAocHJlc3VtYWJseSBsYXJnZSBjaHVua3Mgb2YgZGF0YSB3aWxsIGJlIGFkZGVkIGF0IGEgdGltZSwgc28gdGhpcyBpcworICAgICAgICAgICAgICAgICAgICAvLyBzdWZmaWNpZW50bHkgZWZmaWNpZW50LikKKyAgICAgICAgICAgICAgICAgICAgaW50IG5ld1N0YXJ0ID0gbU91dHB1dEJ1ZmZlci5sZW5ndGgoKSAtIHRleHQubGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdTdGFydCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRCdWZmZXIuZGVsZXRlKDAsIG5ld1N0YXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ2FuY2VsbGVkKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBtSXNDYW5jZWxlZC5nZXQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gV2FpdCBmb3IgYXQgbW9zdCBtYXhUaW1lTXMgZm9yIGxvZ2NhdCB0byBkaXNwbGF5IHRoZSBkZXNpcmVkIHRleHQuCisgICAgICAgICAgICBnZXREZXZpY2UoKS5leGVjdXRlU2hlbGxDb21tYW5kKFN0cmluZy5mb3JtYXQoImxvZ2NhdCAtcyAlcyAtZSAnJXMnIiwgbG9nY2F0VGFnLCB0ZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZXIsIG1heFRpbWVNcywgVGltZVVuaXQuTUlMTElTRUNPTkRTLCAwKTsKKyAgICAgICAgICAgIHJldHVybiByZWNlaXZlci5pc0NhbmNlbGxlZCgpOworICAgICAgICB9IGNhdGNoIChjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaW5jaWRlbnRkRGlzYWJsZWQoKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gaWYgcm8uc3RhdHNkLmVuYWJsZSBkb2Vzbid0IGV4aXN0LCBpbmNpZGVudGQgaXMgZGlzYWJsZWQgYXMgd2VsbC4KKyAgICAgICAgaWYgKCJmYWxzZSIuZXF1YWxzKGdldERldmljZSgpLmdldFByb3BlcnR5KCJyby5zdGF0c2QuZW5hYmxlIikpCisgICAgICAgICAgICAgICAgJiYgInRydWUiLmVxdWFscyhnZXREZXZpY2UoKS5nZXRQcm9wZXJ0eSgicm8uY29uZmlnLmxvd19yYW0iKSkpIHsKKyAgICAgICAgICAgIENMb2cuZCgiSW5jaWRlbnRkIGlzIG5vdCBlbmFibGVkIG9uIHRoZSBkZXZpY2UuIik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9TZXR0aW5nc0luY2lkZW50VGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9TZXR0aW5nc0luY2lkZW50VGVzdC5qYXZhCmluZGV4IDdlYTAwZTEuLjM4ZWVmYzEgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvU2V0dGluZ3NJbmNpZGVudFRlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2luY2lkZW50L3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY3RzL1NldHRpbmdzSW5jaWRlbnRUZXN0LmphdmEKQEAgLTIxLDEzICsyMSwyMyBAQAogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXJzLnNldHRpbmdzLlNldHRpbmdzU2VydmljZUR1bXBQcm90bzsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVycy5zZXR0aW5ncy5Vc2VyU2V0dGluZ3NQcm90bzsKIAoraW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5Mb2cuTG9nTGV2ZWw7CitpbXBvcnQgY29tLmFuZHJvaWQuaW5jaWRlbnQuRGVzdGluYXRpb247CitpbXBvcnQgY29tLmFuZHJvaWQuaW5jaWRlbnQuUHJpdmFjeTsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5sb2cuTG9nVXRpbC5DTG9nOwogaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZTsKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvcjsKIAogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07CiAKIC8qKgogICogVGVzdCB0byBjaGVjayB0aGF0IHRoZSBzZXR0aW5ncyBzZXJ2aWNlIHByb3Blcmx5IG91dHB1dHMgaXRzIGR1bXAgc3RhdGUuCkBAIC00NCwzOCArNTQsNzQgQEAKICAgICAgICAgU2V0dGluZ3NTZXJ2aWNlRHVtcFByb3RvIGR1bXAgPSBnZXREdW1wKFNldHRpbmdzU2VydmljZUR1bXBQcm90by5wYXJzZXIoKSwKICAgICAgICAgICAgICAgICAiZHVtcHN5cyBzZXR0aW5ncyAtLXByb3RvIik7CiAKLSAgICAgICAgYXNzZXJ0VHJ1ZShkdW1wLmdldFVzZXJTZXR0aW5nc0NvdW50KCkgPiAwKTsKLQotICAgICAgICBVc2VyU2V0dGluZ3NQcm90byB1c2VyU2V0dGluZ3MgPSBkdW1wLmdldFVzZXJTZXR0aW5ncygwKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHVzZXJTZXR0aW5ncy5nZXRVc2VySWQoKSk7Ci0KLSAgICAgICAgdmVyaWZ5U2V0dGluZ3ModXNlclNldHRpbmdzLmdldFNlY3VyZVNldHRpbmdzKCkpOwotICAgICAgICB2ZXJpZnlTZXR0aW5ncyh1c2VyU2V0dGluZ3MuZ2V0U3lzdGVtU2V0dGluZ3MoKSk7Ci0KLSAgICAgICAgdmVyaWZ5U2V0dGluZ3MoZHVtcC5nZXRHbG9iYWxTZXR0aW5ncygpKTsKKyAgICAgICAgdmVyaWZ5U2V0dGluZ3NTZXJ2aWNlRHVtcFByb3RvKGR1bXAsIFBSSVZBQ1lfTk9ORSk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHZlcmlmeVNldHRpbmdzKEdlbmVyYXRlZE1lc3NhZ2Ugc2V0dGluZ3MpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB2ZXJpZnlTZXR0aW5ncyhnZXRTZXR0aW5nUHJvdG9zKHNldHRpbmdzKSk7CisgICAgc3RhdGljIHZvaWQgdmVyaWZ5U2V0dGluZ3NTZXJ2aWNlRHVtcFByb3RvKFNldHRpbmdzU2VydmljZUR1bXBQcm90byBkdW1wLCBmaW5hbCBpbnQgZmlsdGVyTGV2ZWwpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoZHVtcC5nZXRVc2VyU2V0dGluZ3NDb3VudCgpID4gMCkgeworICAgICAgICAgICAgVXNlclNldHRpbmdzUHJvdG8gdXNlclNldHRpbmdzID0gZHVtcC5nZXRVc2VyU2V0dGluZ3MoMCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdXNlclNldHRpbmdzLmdldFVzZXJJZCgpKTsKIAotICAgICAgICBmaW5hbCBMaXN0PFNldHRpbmdzT3BlcmF0aW9uUHJvdG8+IG9wcyA9IGludm9rZShzZXR0aW5ncywgImdldEhpc3RvcmljYWxPcExpc3QiKTsKKyAgICAgICAgICAgIENMb2cubG9nQW5kRGlzcGxheShMb2dMZXZlbC5JTkZPLCAiIyojKiMqIyojKiMqIyojKiMqIyojIFNFQ1VSRSAjKiMqIyojKiMqIyojKiMqIyojKiMiKTsKKyAgICAgICAgICAgIHZlcmlmeVNldHRpbmdzKHVzZXJTZXR0aW5ncy5nZXRTZWN1cmVTZXR0aW5ncygpLCBmaWx0ZXJMZXZlbCk7CisgICAgICAgICAgICBDTG9nLmxvZ0FuZERpc3BsYXkoTG9nTGV2ZWwuSU5GTywgIiMqIyojKiMqIyojKiMqIyojKiMqIyBTWVNURU0gIyojKiMqIyojKiMqIyojKiMqIyojIik7CisgICAgICAgICAgICB2ZXJpZnlTZXR0aW5ncyh1c2VyU2V0dGluZ3MuZ2V0U3lzdGVtU2V0dGluZ3MoKSwgZmlsdGVyTGV2ZWwpOworICAgICAgICB9CisKKyAgICAgICAgQ0xvZy5sb2dBbmREaXNwbGF5KExvZ0xldmVsLklORk8sICIjKiMqIyojKiMqIyojKiMqIyojKiMgR0xPQkFMICMqIyojKiMqIyojKiMqIyojKiMqIyIpOworICAgICAgICB2ZXJpZnlTZXR0aW5ncyhkdW1wLmdldEdsb2JhbFNldHRpbmdzKCksIGZpbHRlckxldmVsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZlcmlmeVNldHRpbmdzKEdlbmVyYXRlZE1lc3NhZ2Ugc2V0dGluZ3MsIGZpbmFsIGludCBmaWx0ZXJMZXZlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHZlcmlmeVNldHRpbmdzKGdldFNldHRpbmdQcm90b3Moc2V0dGluZ3MpLCBmaWx0ZXJMZXZlbCk7CisKKyAgICAgICAgZmluYWwgTGlzdDxTZXR0aW5nc09wZXJhdGlvblByb3RvPiBvcHMgPSBpbnZva2Uoc2V0dGluZ3MsICJnZXRIaXN0b3JpY2FsT3BlcmF0aW9uc0xpc3QiKTsKICAgICAgICAgZm9yIChTZXR0aW5nc09wZXJhdGlvblByb3RvIG9wIDogb3BzKSB7CiAgICAgICAgICAgICBhc3NlcnRUcnVlKG9wLmdldFRpbWVzdGFtcCgpID49IDApOwogICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChvcC5nZXRPcGVyYXRpb24oKSk7CiAgICAgICAgICAgICAvLyBzZXR0aW5nIGlzIG9wdGlvbmFsCisgICAgICAgICAgICBpZiAoZmlsdGVyTGV2ZWwgPT0gUFJJVkFDWV9BVVRPKSB7CisgICAgICAgICAgICAgICAgLy8gU2V0dGluZ09wZXJhdGlvblByb3RvIGlzIEVYUExJQ0lUIGJ5IGRlZmF1bHQuCisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShvcC5nZXRPcGVyYXRpb24oKS5pc0VtcHR5KCkpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUob3AuZ2V0U2V0dGluZygpLmlzRW1wdHkoKSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFNldHRpbmdQcm90bz4gZ2V0U2V0dGluZ1Byb3RvcyhHZW5lcmF0ZWRNZXNzYWdlIHNldHRpbmdzUHJvdG8pIHsKLSAgICAgICAgcmV0dXJuIEFycmF5cy5zdHJlYW0oc2V0dGluZ3NQcm90by5nZXRDbGFzcygpLmdldERlY2xhcmVkTWV0aG9kcygpKQotICAgICAgICAgICAgICAgIC5maWx0ZXIoKG1ldGhvZCkgLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZC5nZXROYW1lKCkuc3RhcnRzV2l0aCgiZ2V0IikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIW1ldGhvZC5nZXROYW1lKCkuZW5kc1dpdGgoIk9yQnVpbGRlciIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1ldGhvZC5nZXRQYXJhbWV0ZXJDb3VudCgpID09IDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIU1vZGlmaWVyLmlzU3RhdGljKG1ldGhvZC5nZXRNb2RpZmllcnMoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbWV0aG9kLmdldFJldHVyblR5cGUoKSA9PSBTZXR0aW5nUHJvdG8uY2xhc3MpCi0gICAgICAgICAgICAgICAgLm1hcCgobWV0aG9kKSAtPiAoU2V0dGluZ1Byb3RvKSBpbnZva2UobWV0aG9kLCBzZXR0aW5nc1Byb3RvKSkKLSAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICBwcml2YXRlIHN0YXRpYyBNYXA8U2V0dGluZ1Byb3RvLCBEZXN0aW5hdGlvbj4gZ2V0U2V0dGluZ1Byb3RvcyhHZW5lcmF0ZWRNZXNzYWdlIHNldHRpbmdzUHJvdG8pIHsKKyAgICAgICAgQ0xvZy5kKCJDaGVja2luZyBvdXQgY2xhc3M6ICIgKyBzZXR0aW5nc1Byb3RvLmdldENsYXNzKCkpOworCisgICAgICAgIE1hcDxTZXR0aW5nUHJvdG8sIERlc3RpbmF0aW9uPiBzZXR0aW5ncyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgZm9yIChGaWVsZERlc2NyaXB0b3IgZmQgOiBzZXR0aW5nc1Byb3RvLmdldERlc2NyaXB0b3JGb3JUeXBlKCkuZ2V0RmllbGRzKCkpIHsKKyAgICAgICAgICAgIGlmIChmZC5nZXRUeXBlKCkgIT0gRmllbGREZXNjcmlwdG9yLlR5cGUuTUVTU0FHRSkgeworICAgICAgICAgICAgICAgIC8vIE9ubHkgbG9va2luZyBmb3IgU2V0dGluZ1Byb3RvcyBhbmQgbWVzc2FnZXMgdGhhdCBjb250YWluIHRoZW0uIFNraXAgYW55IHByaW1pdGl2ZQorICAgICAgICAgICAgICAgIC8vIGZpZWxkcy4KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExpc3Q8T2JqZWN0PiB0bXA7CisgICAgICAgICAgICBpZiAoZmQuaXNSZXBlYXRlZCgpKSB7CisgICAgICAgICAgICAgICAgdG1wID0gKExpc3QpIHNldHRpbmdzUHJvdG8uZ2V0RmllbGQoZmQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0bXAgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgICAgICAgICB0bXAuYWRkKHNldHRpbmdzUHJvdG8uZ2V0RmllbGQoZmQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERlc3RpbmF0aW9uIGRlc3QgPSBmZC5nZXRPcHRpb25zKCkuZ2V0RXh0ZW5zaW9uKFByaXZhY3kucHJpdmFjeSkuZ2V0RGVzdCgpOworICAgICAgICAgICAgZm9yIChPYmplY3QgbyA6IHRtcCkgeworICAgICAgICAgICAgICAgIGlmICgiYW5kcm9pZC5wcm92aWRlcnMuc2V0dGluZ3MuU2V0dGluZ1Byb3RvIi5lcXVhbHMoZmQuZ2V0TWVzc2FnZVR5cGUoKS5nZXRGdWxsTmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY29udGFpbmVyJ3MgZGVmYXVsdCBwcml2YWN5IGRvZXNuJ3QgYWZmZWN0IG1lc3NhZ2UgdHlwZXMuIEhvd2V2ZXIsCisgICAgICAgICAgICAgICAgICAgIC8vIGFub3RhdGlvbnMgb24gdGhlIGZpZWxkIG92ZXJyaWRlIHRoZSBtZXNzYWdlJ3MgZGVmYXVsdCBhbm5vdGF0aW9uLiBJZiBhCisgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UgZmllbGQgZG9lc24ndCBoYXZlIGFuIGFubm90YXRpb24sIGl0IGlzIHRyZWF0ZWQgYXMgRVhQTElDSVQgYnkKKyAgICAgICAgICAgICAgICAgICAgLy8gZGVmYXVsdC4KKyAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MucHV0KChTZXR0aW5nUHJvdG8pIG8sIGRlc3QgPT0gRGVzdGluYXRpb24uREVTVF9VTlNFVCA/IERlc3RpbmF0aW9uLkRFU1RfRVhQTElDSVQgOiBkZXN0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBTdWIgbWVzc2FnZXMgZG9uJ3QgaW5oZXJpdCB0aGUgY29udGFpbmVyJ3MgZGVmYXVsdCBwcml2YWN5LiBJZiB0aGUgZmllbGQgaGFkCisgICAgICAgICAgICAgICAgICAgIC8vIGFuIGFubm90YXRpb24sIGl0IHdvdWxkIG92ZXJyaWRlIHRoZSBzdWIgbWVzc2FnZSdzIGRlZmF1bHQgcHJpdmFjeS4KKyAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MucHV0QWxsKGdldFNldHRpbmdQcm90b3MoKEdlbmVyYXRlZE1lc3NhZ2UpIG8pKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc2V0dGluZ3M7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgPFQ+IFQgaW52b2tlKE1ldGhvZCBtZXRob2QsIE9iamVjdCBpbnN0YW5jZSwgT2JqZWN0Li4uIGFyZ3MpIHsKQEAgLTEwMSwxMCArMTQ3LDEzIEBACiAgICAgICAgIHJldHVybiBjID09IEludGVnZXIuY2xhc3MgPyBpbnQuY2xhc3MgOiBjOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlTZXR0aW5ncyhMaXN0PFNldHRpbmdQcm90bz4gc2V0dGluZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdmVyaWZ5U2V0dGluZ3MoTWFwPFNldHRpbmdQcm90bywgRGVzdGluYXRpb24+IHNldHRpbmdzLCBmaW5hbCBpbnQgZmlsdGVyTGV2ZWwpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBhc3NlcnRGYWxzZShzZXR0aW5ncy5pc0VtcHR5KCkpOwogCi0gICAgICAgIGZvciAoU2V0dGluZ1Byb3RvIHNldHRpbmcgOiBzZXR0aW5ncykgeworICAgICAgICBDTG9nLmQoIkZpZWxkIGNvdW50OiAiICsgc2V0dGluZ3Muc2l6ZSgpKTsKKyAgICAgICAgZm9yIChNYXAuRW50cnk8U2V0dGluZ1Byb3RvLCBEZXN0aW5hdGlvbj4gc0RQYWlyIDogc2V0dGluZ3MuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgU2V0dGluZ1Byb3RvIHNldHRpbmcgPSBzRFBhaXIuZ2V0S2V5KCk7CisgICAgICAgICAgICBEZXN0aW5hdGlvbiBkZXN0ID0gc0RQYWlyLmdldFZhbHVlKCk7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBpZCA9IHNldHRpbmcuZ2V0SWQoKTsKICAgICAgICAgICAgICAgICBpZiAoIWlkLmlzRW1wdHkoKSkgewpAQCAtMTEyLDYgKzE2MSwyNyBAQAogICAgICAgICAgICAgICAgICAgICBMb25nLnBhcnNlTG9uZyhpZCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoc2V0dGluZy5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJMZXZlbCA8IFBSSVZBQ1lfTE9DQUwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgIChkZXN0ID09IERlc3RpbmF0aW9uLkRFU1RfTE9DQUwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFueSBmaWx0ZXIgdGhhdCBpcyBub3QgTE9DQUwgc2hvdWxkIG1ha2Ugc3VyZSBsb2NhbCBpc24ndCBwcmludGVkIGF0IGFsbC4KKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlcnIgPSAiU2V0dGluZyAnIiArIHNldHRpbmcuZ2V0TmFtZSgpICsgIicgd2l0aCBMT0NBTCBwcml2YWN5IGRpZG4ndCBzdHJpcCBkYXRhIGZvciBmaWx0ZXIgbGV2ZWwgJyIgKyBwcml2YWN5VG9TdHJpbmcoZmlsdGVyTGV2ZWwpICsgIiciOworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlcnIsIHNldHRpbmcuZ2V0SWQoKS5pc0VtcHR5KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlcnIsIHNldHRpbmcuZ2V0TmFtZSgpLmlzRW1wdHkoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGVyciwgc2V0dGluZy5nZXRQa2coKS5pc0VtcHR5KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlcnIsIHNldHRpbmcuZ2V0VmFsdWUoKS5pc0VtcHR5KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlcnIsIHNldHRpbmcuZ2V0RGVmYXVsdFZhbHVlKCkuaXNFbXB0eSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoZmlsdGVyTGV2ZWwgPCBQUklWQUNZX0VYUExJQ0lUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzdCA9PSBEZXN0aW5hdGlvbi5ERVNUX0VYUExJQ0lUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVyciA9ICJTZXR0aW5nICciICsgc2V0dGluZy5nZXROYW1lKCkgKyAiJyB3aXRoIEVYUExJQ0lUIHByaXZhY3kgZGlkbid0IHN0cmlwIGRhdGEgZm9yIGZpbHRlciBsZXZlbCAnIiArIHByaXZhY3lUb1N0cmluZyhmaWx0ZXJMZXZlbCkgKyAiJyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlcnIsIHNldHRpbmcuZ2V0SWQoKS5pc0VtcHR5KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZXJyLCBzZXR0aW5nLmdldE5hbWUoKS5pc0VtcHR5KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZXJyLCBzZXR0aW5nLmdldFBrZygpLmlzRW1wdHkoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlcnIsIHNldHRpbmcuZ2V0VmFsdWUoKS5pc0VtcHR5KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZXJyLCBzZXR0aW5nLmdldERlZmF1bHRWYWx1ZSgpLmlzRW1wdHkoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgLy8gcGtnIGlzIG9wdGlvbmFsCiAgICAgICAgICAgICAgICAgLy8gdmFsdWUgY2FuIGJlIGFueXRoaW5nCiAgICAgICAgICAgICAgICAgLy8gZGVmYXVsdCBjYW4gYmUgYW55dGhpbmcKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvU3RhY2tUcmFjZUluY2lkZW50VGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9TdGFja1RyYWNlSW5jaWRlbnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkwMWJkNgotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvU3RhY2tUcmFjZUluY2lkZW50VGVzdC5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXIuY3RzOworCitpbXBvcnQgYW5kcm9pZC5vcy5CYWNrVHJhY2VQcm90bzsKKworLyoqCisgKiBUZXN0cyBmb3IgdHJhY2UgcHJvdG8gZHVtcGluZy4KKyAqLworcHVibGljIGNsYXNzIFN0YWNrVHJhY2VJbmNpZGVudFRlc3QgZXh0ZW5kcyBQcm90b0R1bXBUZXN0Q2FzZSB7CisgICAgc3RhdGljIHZvaWQgdmVyaWZ5QmFja1RyYWNlUHJvdG8oQmFja1RyYWNlUHJvdG8gZHVtcCwgZmluYWwgaW50IGZpbHRlckxldmVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGZpbHRlckxldmVsID09IFBSSVZBQ1lfQVVUTykgeworICAgICAgICAgICAgZm9yIChCYWNrVHJhY2VQcm90by5TdGFjayBzIDogZHVtcC5nZXRUcmFjZXNMaXN0KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgZW50aXJlIG1lc3NhZ2UgaXMgdGFnZ2VkIGFzIEVYUExJQ0lULCBzbyBldmVuIHRoZSBwaWQgc2hvdWxkIGJlIHN0cmlwcGVkIG91dC4KKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHMuZ2V0UGlkKCkgPT0gMCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzLmdldER1bXAoKS5pc0VtcHR5KCkpOworICAgICAgICAgICAgICAgIC8vIFRoZSBlbnRpcmUgbWVzc2FnZSBpcyB0YWdnZWQgYXMgRVhQTElDSVQsIHNvIGV2ZW4gdGhlIGR1bXAgZHVyYXRpb24gc2hvdWxkIGJlIHN0cmlwcGVkIG91dC4KKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHMuZ2V0RHVtcER1cmF0aW9uTnMoKSA9PSAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvU3lzdGVtUHJvcGVydGllc1Rlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvU3lzdGVtUHJvcGVydGllc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGM0NzIyCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9TeXN0ZW1Qcm9wZXJ0aWVzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXIuY3RzOworCitpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuYnVpbGQuSUJ1aWxkSW5mbzsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXNQcm90bzsKKworLyoqCisgKiBUZXN0cyBzeXN0ZW0gcHJvcGVydGllcyBoYXMgY29ycmVjdCBpbmNpZGVudCBmaWx0ZXJzLgorICovCitwdWJsaWMgY2xhc3MgU3lzdGVtUHJvcGVydGllc1Rlc3QgZXh0ZW5kcyBQcm90b0R1bXBUZXN0Q2FzZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTeXN0ZW1Qcm9wZXJ0aWVzVGVzdCI7CisKKyAgICBzdGF0aWMgdm9pZCB2ZXJpZnlTeXN0ZW1Qcm9wZXJ0aWVzUHJvdG8oU3lzdGVtUHJvcGVydGllc1Byb3RvIHByb3BlcnRpZXMsIGZpbmFsIGludCBmaWx0ZXJMZXZlbCkgeworICAgICAgICAvLyBjaGVjayBsb2NhbCB0YWdnZWQgZmllbGQKKyAgICAgICAgaWYgKGZpbHRlckxldmVsID09IFBSSVZBQ1lfTE9DQUwpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUocHJvcGVydGllcy5nZXRFeHRyYVByb3BlcnRpZXNDb3VudCgpID4gMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcHJvcGVydGllcy5nZXRFeHRyYVByb3BlcnRpZXNDb3VudCgpKTsKKyAgICAgICAgfQorICAgICAgICAvLyBjaGVjayBleHBsaWNpdCB0YWdnZWQgZmllbGQsIHBlcnNpc3Quc3lzLnRpbWV6b25lIGlzIHB1YmxpYyBwcm9wLgorICAgICAgICBhc3NlcnRFcXVhbHMoZmlsdGVyTGV2ZWwgPT0gUFJJVkFDWV9BVVRPLCBwcm9wZXJ0aWVzLmdldFBlcnNpc3QoKS5nZXRTeXNUaW1lem9uZSgpLmlzRW1wdHkoKSk7CisgICAgICAgIC8vIGNoZWNrIGF1dG9tYXRpYyB0YWdnZWQgZmllbGQsIHJvLmJ1aWxkLmRpc3BsYXkuaWQgaXMgcHVibGljIHByb3AuCisgICAgICAgIGFzc2VydEZhbHNlKHByb3BlcnRpZXMuZ2V0Um8oKS5nZXRCdWlsZCgpLmdldERpc3BsYXlJZCgpLmlzRW1wdHkoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9Vc2JJbmNpZGVudFRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvVXNiSW5jaWRlbnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVlYTUyNwotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvVXNiSW5jaWRlbnRUZXN0LmphdmEKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlci5jdHM7CisKK2ltcG9ydCBhbmRyb2lkLnNlcnZpY2UudXNiLlVzYkFjY2Vzc29yeVByb3RvOworaW1wb3J0IGFuZHJvaWQuc2VydmljZS51c2IuVXNiRGVidWdnaW5nTWFuYWdlclByb3RvOworaW1wb3J0IGFuZHJvaWQuc2VydmljZS51c2IuVXNiRGV2aWNlRmlsdGVyUHJvdG87CitpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLnVzYi5Vc2JEZXZpY2VNYW5hZ2VyUHJvdG87CitpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLnVzYi5Vc2JEZXZpY2VQcm90bzsKK2ltcG9ydCBhbmRyb2lkLnNlcnZpY2UudXNiLlVzYkhhbmRsZXJQcm90bzsKK2ltcG9ydCBhbmRyb2lkLnNlcnZpY2UudXNiLlVzYkhvc3RNYW5hZ2VyUHJvdG87CitpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLnVzYi5Vc2JQcm9maWxlR3JvdXBTZXR0aW5nc01hbmFnZXJQcm90bzsKK2ltcG9ydCBhbmRyb2lkLnNlcnZpY2UudXNiLlVzYlNlcnZpY2VEdW1wUHJvdG87CitpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLnVzYi5Vc2JTZXR0aW5nc0RldmljZVByZWZlcmVuY2VQcm90bzsKK2ltcG9ydCBhbmRyb2lkLnNlcnZpY2UudXNiLlVzYlNldHRpbmdzTWFuYWdlclByb3RvOworCisvKioKKyAqIFRlc3RzIGZvciB0aGUgVXNiU2VydmljZSBwcm90byBkdW1wLgorICovCitwdWJsaWMgY2xhc3MgVXNiSW5jaWRlbnRUZXN0IGV4dGVuZHMgUHJvdG9EdW1wVGVzdENhc2UgeworICAgIHB1YmxpYyB2b2lkIHRlc3RVc2JTZXJ2aWNlRHVtcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBVc2JTZXJ2aWNlRHVtcFByb3RvIGR1bXAgPSBnZXREdW1wKFVzYlNlcnZpY2VEdW1wUHJvdG8ucGFyc2VyKCksCisgICAgICAgICAgICAgICAgImR1bXBzeXMgdXNiIC0tcHJvdG8iKTsKKworICAgICAgICB2ZXJpZnlVc2JTZXJ2aWNlRHVtcFByb3RvKGR1bXAsIFBSSVZBQ1lfTk9ORSk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgdmVyaWZ5VXNiU2VydmljZUR1bXBQcm90byhVc2JTZXJ2aWNlRHVtcFByb3RvIGR1bXAsIGZpbmFsIGludCBmaWx0ZXJMZXZlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHZlcmlmeVVzYkRldmljZU1hbmFnZXJQcm90byhkdW1wLmdldERldmljZU1hbmFnZXIoKSwgZmlsdGVyTGV2ZWwpOworICAgICAgICB2ZXJpZnlVc2JIb3N0TWFuYWdlclByb3RvKGR1bXAuZ2V0SG9zdE1hbmFnZXIoKSwgZmlsdGVyTGV2ZWwpOworICAgICAgICB2ZXJpZnlVc2JTZXR0aW5nc01hbmFnZXJQcm90byhkdW1wLmdldFNldHRpbmdzTWFuYWdlcigpLCBmaWx0ZXJMZXZlbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2ZXJpZnlVc2JEZXZpY2VNYW5hZ2VyUHJvdG8oVXNiRGV2aWNlTWFuYWdlclByb3RvIHVkbXAsIGZpbmFsIGludCBmaWx0ZXJMZXZlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHZlcmlmeVVzYkhhbmRsZXJQcm90byh1ZG1wLmdldEhhbmRsZXIoKSwgZmlsdGVyTGV2ZWwpOworICAgICAgICB2ZXJpZnlVc2JEZWJ1Z2dpbmdNYW5hZ2VyUHJvdG8odWRtcC5nZXREZWJ1Z2dpbmdNYW5hZ2VyKCksIGZpbHRlckxldmVsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZlcmlmeVVzYkhhbmRsZXJQcm90byhVc2JIYW5kbGVyUHJvdG8gdWhwLCBmaW5hbCBpbnQgZmlsdGVyTGV2ZWwpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmb3IgKFVzYkhhbmRsZXJQcm90by5GdW5jdGlvbiBmIDogdWhwLmdldEN1cnJlbnRGdW5jdGlvbnNMaXN0KCkpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoVXNiSGFuZGxlclByb3RvLkZ1bmN0aW9uLmdldERlc2NyaXB0b3IoKS5nZXRWYWx1ZXMoKS5jb250YWlucyhmLmdldFZhbHVlRGVzY3JpcHRvcigpKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChVc2JIYW5kbGVyUHJvdG8uRnVuY3Rpb24gZiA6IHVocC5nZXRTY3JlZW5VbmxvY2tlZEZ1bmN0aW9uc0xpc3QoKSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShVc2JIYW5kbGVyUHJvdG8uRnVuY3Rpb24uZ2V0RGVzY3JpcHRvcigpLmdldFZhbHVlcygpLmNvbnRhaW5zKGYuZ2V0VmFsdWVEZXNjcmlwdG9yKCkpKTsKKyAgICAgICAgfQorICAgICAgICB2ZXJpZnlVc2JBY2Nlc3NvcnlQcm90byh1aHAuZ2V0Q3VycmVudEFjY2Vzc29yeSgpLCBmaWx0ZXJMZXZlbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2ZXJpZnlVc2JBY2Nlc3NvcnlQcm90byhVc2JBY2Nlc3NvcnlQcm90byB1YXAsIGZpbmFsIGludCBmaWx0ZXJMZXZlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChmaWx0ZXJMZXZlbCA9PSBQUklWQUNZX0FVVE8pIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUodWFwLmdldFVyaSgpLmlzRW1wdHkoKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHVhcC5nZXRTZXJpYWwoKS5pc0VtcHR5KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2ZXJpZnlVc2JEZWJ1Z2dpbmdNYW5hZ2VyUHJvdG8oVXNiRGVidWdnaW5nTWFuYWdlclByb3RvIHVkbXAsIGZpbmFsIGludCBmaWx0ZXJMZXZlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChmaWx0ZXJMZXZlbCA8IFBSSVZBQ1lfTE9DQUwpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUodWRtcC5nZXRTeXN0ZW1LZXlzKCkuaXNFbXB0eSgpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUodWRtcC5nZXRVc2VyS2V5cygpLmlzRW1wdHkoKSk7CisgICAgICAgICAgICBpZiAoZmlsdGVyTGV2ZWwgPCBQUklWQUNZX0VYUExJQ0lUKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh1ZG1wLmdldExhc3RLZXlSZWNlaXZlZCgpLmlzRW1wdHkoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZlcmlmeVVzYkhvc3RNYW5hZ2VyUHJvdG8oVXNiSG9zdE1hbmFnZXJQcm90byB1aG1wLCBmaW5hbCBpbnQgZmlsdGVyTGV2ZWwpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmb3IgKFVzYkRldmljZVByb3RvIHVkcCA6IHVobXAuZ2V0RGV2aWNlc0xpc3QoKSkgeworICAgICAgICAgICAgdmVyaWZ5VXNiRGV2aWNlUHJvdG8odWRwLCBmaWx0ZXJMZXZlbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZlcmlmeVVzYkRldmljZVByb3RvKFVzYkRldmljZVByb3RvIHVkcCwgZmluYWwgaW50IGZpbHRlckxldmVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGZpbHRlckxldmVsID09IFBSSVZBQ1lfQVVUTykgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh1ZHAuZ2V0U2VyaWFsTnVtYmVyKCkuaXNFbXB0eSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdmVyaWZ5VXNiU2V0dGluZ3NNYW5hZ2VyUHJvdG8oVXNiU2V0dGluZ3NNYW5hZ2VyUHJvdG8gdXNtcCwgZmluYWwgaW50IGZpbHRlckxldmVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChVc2JQcm9maWxlR3JvdXBTZXR0aW5nc01hbmFnZXJQcm90byB1cGdzbXAgOiB1c21wLmdldFByb2ZpbGVHcm91cFNldHRpbmdzTGlzdCgpKSB7CisgICAgICAgICAgICB2ZXJpZnlVc2JQcm9maWxlR3JvdXBTZXR0aW5nc01hbmFnZXJQcm90byh1cGdzbXAsIGZpbHRlckxldmVsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdmVyaWZ5VXNiUHJvZmlsZUdyb3VwU2V0dGluZ3NNYW5hZ2VyUHJvdG8oVXNiUHJvZmlsZUdyb3VwU2V0dGluZ3NNYW5hZ2VyUHJvdG8gcGdzcCwgZmluYWwgaW50IGZpbHRlckxldmVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChVc2JTZXR0aW5nc0RldmljZVByZWZlcmVuY2VQcm90byB1c2RwIDogcGdzcC5nZXREZXZpY2VQcmVmZXJlbmNlc0xpc3QoKSkgeworICAgICAgICAgICAgdmVyaWZ5VXNiRGV2aWNlRmlsdGVyUHJvdG8odXNkcC5nZXRGaWx0ZXIoKSwgZmlsdGVyTGV2ZWwpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2ZXJpZnlVc2JEZXZpY2VGaWx0ZXJQcm90byhVc2JEZXZpY2VGaWx0ZXJQcm90byB1ZGZwLCBmaW5hbCBpbnQgZmlsdGVyTGV2ZWwpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoZmlsdGVyTGV2ZWwgPT0gUFJJVkFDWV9BVVRPKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHVkZnAuZ2V0U2VyaWFsTnVtYmVyKCkuaXNFbXB0eSgpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvV2luZG93TWFuYWdlckluY2lkZW50VGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9pbmNpZGVudC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9XaW5kb3dNYW5hZ2VySW5jaWRlbnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZjZTIyMwotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvaW5jaWRlbnQvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvV2luZG93TWFuYWdlckluY2lkZW50VGVzdC5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlci5jdHM7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIud20uQXBwVHJhbnNpdGlvblByb3RvOworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci53bS5JZGVudGlmaWVyUHJvdG87CitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLndtLlJvb3RXaW5kb3dDb250YWluZXJQcm90bzsKK2ltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIud20uV2luZG93TWFuYWdlclBvbGljeVByb3RvOworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci53bS5XaW5kb3dNYW5hZ2VyU2VydmljZUR1bXBQcm90bzsKKworLyoqCisgKiBUZXN0cyBmb3IgdGhlIFdpbmRvd01hbmFnZXJTZXJ2aWNlIHByb3RvIGR1bXAuCisgKi8KK3B1YmxpYyBjbGFzcyBXaW5kb3dNYW5hZ2VySW5jaWRlbnRUZXN0IGV4dGVuZHMgUHJvdG9EdW1wVGVzdENhc2UgeworICAgIHN0YXRpYyB2b2lkIHZlcmlmeVdpbmRvd01hbmFnZXJTZXJ2aWNlRHVtcFByb3RvKFdpbmRvd01hbmFnZXJTZXJ2aWNlRHVtcFByb3RvIGR1bXAsIGZpbmFsIGludCBmaWx0ZXJMZXZlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHZlcmlmeVdpbmRvd01hbmFnZXJQb2xpY3lQcm90byhkdW1wLmdldFBvbGljeSgpLCBmaWx0ZXJMZXZlbCk7CisgICAgICAgIHZlcmlmeVJvb3RXaW5kb3dDb250YWluZXJQcm90byhkdW1wLmdldFJvb3RXaW5kb3dDb250YWluZXIoKSwgZmlsdGVyTGV2ZWwpOworICAgICAgICB2ZXJpZnlJZGVudGlmaWVyUHJvdG8oZHVtcC5nZXRGb2N1c2VkV2luZG93KCksIGZpbHRlckxldmVsKTsKKyAgICAgICAgdmVyaWZ5SWRlbnRpZmllclByb3RvKGR1bXAuZ2V0SW5wdXRNZXRob2RXaW5kb3coKSwgZmlsdGVyTGV2ZWwpOworICAgICAgICB2ZXJpZnlBcHBUcmFuc2l0aW9uUHJvdG8oZHVtcC5nZXRBcHBUcmFuc2l0aW9uKCksIGZpbHRlckxldmVsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZlcmlmeVdpbmRvd01hbmFnZXJQb2xpY3lQcm90byhXaW5kb3dNYW5hZ2VyUG9saWN5UHJvdG8gd21wLCBmaW5hbCBpbnQgZmlsdGVyTGV2ZWwpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRUcnVlKFdpbmRvd01hbmFnZXJQb2xpY3lQcm90by5Vc2VyUm90YXRpb25Nb2RlLmdldERlc2NyaXB0b3IoKS5nZXRWYWx1ZXMoKQorICAgICAgICAgICAgICAgIC5jb250YWlucyh3bXAuZ2V0Um90YXRpb25Nb2RlKCkuZ2V0VmFsdWVEZXNjcmlwdG9yKCkpKTsKKyAgICAgICAgdmVyaWZ5SWRlbnRpZmllclByb3RvKHdtcC5nZXRGb2N1c2VkV2luZG93KCksIGZpbHRlckxldmVsKTsKKyAgICAgICAgdmVyaWZ5SWRlbnRpZmllclByb3RvKHdtcC5nZXRUb3BGdWxsc2NyZWVuT3BhcXVlV2luZG93KCksIGZpbHRlckxldmVsKTsKKyAgICAgICAgdmVyaWZ5SWRlbnRpZmllclByb3RvKHdtcC5nZXRUb3BGdWxsc2NyZWVuT3BhcXVlT3JEaW1taW5nV2luZG93KCksIGZpbHRlckxldmVsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZlcmlmeUlkZW50aWZpZXJQcm90byhJZGVudGlmaWVyUHJvdG8gaXAsIGZpbmFsIGludCBmaWx0ZXJMZXZlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChmaWx0ZXJMZXZlbCA9PSBQUklWQUNZX0FVVE8pIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoaXAuZ2V0VGl0bGUoKS5pc0VtcHR5KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2ZXJpZnlSb290V2luZG93Q29udGFpbmVyUHJvdG8oUm9vdFdpbmRvd0NvbnRhaW5lclByb3RvIHJ3Y3AsIGZpbmFsIGludCBmaWx0ZXJMZXZlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoSWRlbnRpZmllclByb3RvIGlwIDogcndjcC5nZXRXaW5kb3dzTGlzdCgpKSB7CisgICAgICAgICAgICB2ZXJpZnlJZGVudGlmaWVyUHJvdG8oaXAsIGZpbHRlckxldmVsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdmVyaWZ5QXBwVHJhbnNpdGlvblByb3RvKEFwcFRyYW5zaXRpb25Qcm90byBhdHAsIGZpbmFsIGludCBmaWx0ZXJMZXZlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydFRydWUoQXBwVHJhbnNpdGlvblByb3RvLkFwcFN0YXRlLmdldERlc2NyaXB0b3IoKS5nZXRWYWx1ZXMoKQorICAgICAgICAgICAgICAgIC5jb250YWlucyhhdHAuZ2V0QXBwVHJhbnNpdGlvblN0YXRlKCkuZ2V0VmFsdWVEZXNjcmlwdG9yKCkpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShBcHBUcmFuc2l0aW9uUHJvdG8uVHJhbnNpdGlvblR5cGUuZ2V0RGVzY3JpcHRvcigpLmdldFZhbHVlcygpCisgICAgICAgICAgICAgICAgLmNvbnRhaW5zKGF0cC5nZXRMYXN0VXNlZEFwcFRyYW5zaXRpb24oKS5nZXRWYWx1ZURlc2NyaXB0b3IoKSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvaW5wdXRtZXRob2RzZXJ2aWNlL2NvbW1vbi9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9pbnB1dG1ldGhvZHNlcnZpY2UvY29tbW9uL0FuZHJvaWQubWsKaW5kZXggMGU1MGE5Yy4uOTRiNTljOSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9pbnB1dG1ldGhvZHNlcnZpY2UvY29tbW9uL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9pbnB1dG1ldGhvZHNlcnZpY2UvY29tbW9uL0FuZHJvaWQubWsKQEAgLTI2LDExICsyNiwxMSBAQAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKIAogIyB0YWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzIGN0c19pbnN0YW50CiAKIExPQ0FMX01PRFVMRSA6PSBDdHNJbnB1dE1ldGhvZFNlcnZpY2VDb21tb24KIAotTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorTE9DQUxfU0RLX1ZFUlNJT04gOj0gdGVzdF9jdXJyZW50CiAKIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfSkFWQV9MSUJSQVJZKQogCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2lucHV0bWV0aG9kc2VydmljZS9jb21tb24vc3JjL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL2N0cy9jb21tb24vQnVzeVdhaXRVdGlscy5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9pbnB1dG1ldGhvZHNlcnZpY2UvY29tbW9uL3NyYy9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9jdHMvY29tbW9uL0J1c3lXYWl0VXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTliMTZkCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9pbnB1dG1ldGhvZHNlcnZpY2UvY29tbW9uL3NyYy9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9jdHMvY29tbW9uL0J1c3lXYWl0VXRpbHMuamF2YQpAQCAtMCwwICsxLDcwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmlucHV0bWV0aG9kc2VydmljZS5jdHMuY29tbW9uOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgZm9yIGJ1c3kgd2FpdGluZy4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEJ1c3lXYWl0VXRpbHMgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBQT0xMSU5HX0lOVEVSVkFMID0gVGltZVVuaXQuTUlMTElTRUNPTkRTLnRvTWlsbGlzKDUwKTsKKworICAgIEBGdW5jdGlvbmFsSW50ZXJmYWNlCisgICAgcHVibGljIGludGVyZmFjZSBQb2xsaW5nQ29uZGl0aW9uIHsKKyAgICAgICAgYm9vbGVhbiBjaGVjaygpIHRocm93cyBFeGNlcHRpb247CisgICAgfQorCisgICAgLy8gVGhpcyBpcyB1dGlsaXR5IGNsYXNzLCBjYW4ndCBpbnN0YW50aWF0ZS4KKyAgICBwcml2YXRlIEJ1c3lXYWl0VXRpbHMoKSB7fQorCisgICAgLyoqCisgICAgICogQnVzeSB3YWl0aW5nIHVudGlsIHtAbGluayBQb2xsaW5nQ29uZGl0aW9uI2NoZWNrKCl9IHJldHVybnMge0Bjb2RlIHRydWV9LgorICAgICAqIEBwYXJhbSBjb25kaXRpb24ge0BsaW5rIFBvbGxpbmdDb25kaXRpb259IHRvIGJlIGNoZWNrZWQuCisgICAgICogQHBhcmFtIHRpbWVvdXQgbWlsbGlzZWNvbmRzIGJlZm9yZSB0aW1lIG91dCBoYXBwZW5zLgorICAgICAqIEBwYXJhbSBtZXNzYWdlIHdoZW4gdGltZSBvdXQgaGFwcGVucywge0BsaW5rIG9yZy5qdW5pdC5Bc3NlcnQjZmFpbChTdHJpbmcpfSBpcyBjYWxsZWQgd2l0aAorICAgICAqICAgICAgICAgICAgICAgIHRoaXMgbWVzc2FnZS4KKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwb2xsaW5nQ2hlY2soZmluYWwgUG9sbGluZ0NvbmRpdGlvbiBjb25kaXRpb24sIGZpbmFsIGxvbmcgdGltZW91dCwKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHdhaXRGb3IoY29uZGl0aW9uLCB0aW1lb3V0KSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZhaWwobWVzc2FnZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQnVzeSB3YWl0aW5nIHVudGlsIHtAbGluayBQb2xsaW5nQ29uZGl0aW9uI2NoZWNrKCl9IHJldHVybnMge0Bjb2RlIHRydWV9LgorICAgICAqIEBwYXJhbSBjb25kaXRpb24ge0BsaW5rIFBvbGxpbmdDb25kaXRpb259IHRvIGJlIGNoZWNrZWQuCisgICAgICogQHBhcmFtIHRpbWVvdXQgbWlsbGlzZWNvbmRzIGJlZm9yZSB0aW1lIG91dCBoYXBwZW5zLgorICAgICAqIEByZXR1cm4gdHJ1ZSB3aGVuIHtAY29kZSBjb25kaXRpb259IHJldHVybnMge0Bjb2RlIHRydWV9LCBmYWxzZSB3aGVuIHRpbWVkIG91dC4KKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIHN0YXRpYyBib29sZWFuIHdhaXRGb3IoZmluYWwgUG9sbGluZ0NvbmRpdGlvbiBjb25kaXRpb24sIGZpbmFsIGxvbmcgdGltZW91dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZvciAobG9uZyByZW1haW5pbmcgPSB0aW1lb3V0OyByZW1haW5pbmcgPiAwOyByZW1haW5pbmcgLT0gUE9MTElOR19JTlRFUlZBTCkgeworICAgICAgICAgICAgaWYgKGNvbmRpdGlvbi5jaGVjaygpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoUE9MTElOR19JTlRFUlZBTCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvaW5wdXRtZXRob2RzZXJ2aWNlL2NvbW1vbi9zcmMvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvY3RzL2NvbW1vbi9EZXZpY2VFdmVudENvbnN0YW50cy5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9pbnB1dG1ldGhvZHNlcnZpY2UvY29tbW9uL3NyYy9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9jdHMvY29tbW9uL0RldmljZUV2ZW50Q29uc3RhbnRzLmphdmEKaW5kZXggMzA3NjkzYS4uMDZhNjhmNyAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9pbnB1dG1ldGhvZHNlcnZpY2UvY29tbW9uL3NyYy9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9jdHMvY29tbW9uL0RldmljZUV2ZW50Q29uc3RhbnRzLmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9pbnB1dG1ldGhvZHNlcnZpY2UvY29tbW9uL3NyYy9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9jdHMvY29tbW9uL0RldmljZUV2ZW50Q29uc3RhbnRzLmphdmEKQEAgLTUwLDEyICs1MCw2IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfRVZFTlRfU0VOREVSID0gImV2ZW50X3NlbmRlciI7CiAKICAgICAvKioKLSAgICAgKiBJbnRlbnQgZXh0cmEga2V5IGZvciBFdmVudCBwYXJhbWV0ZXJzIGxpa2UKLSAgICAgKiB7QGxpbmsgRGV2aWNlRXZlbnRUeXBlUGFyYW0jT05fU1RBUlRfSU5QVVRfUkVTVEFSVElOR30KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9FVkVOVF9QQVJBTVMgPSAiZXZlbnRfcGFyYW1zIjsKLQotICAgIC8qKgogICAgICAqIEludGVudCBleHRyYSBrZXkgZm9yIHdoYXQgdHlwZSBhIGRldmljZSBldmVudCBpcy4gVmFsdWVzIGFyZSB7QGxpbmsgRGV2aWNlRXZlbnRUeXBlI25hbWUoKX0uCiAgICAgICoKICAgICAgKiBAc2VlIGFuZHJvaWQuY29udGVudC5JbnRlbnQjcHV0RXh0cmEoU3RyaW5nLFN0cmluZykKQEAgLTczLDI5ICs2Nyw2IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfRVZFTlRfVElNRSA9ICJldmVudF90aW1lIjsKIAogICAgIC8qKgotICAgICAqIFBhcmFtZXRlciBmb3Ige0BsaW5rIERldmljZUV2ZW50VHlwZX0uCi0gICAgICovCi0gICAgcHVibGljIGVudW0gRGV2aWNlRXZlbnRUeXBlUGFyYW0gewotCi0gICAgICAgIC8qKgotICAgICAgICAgKiAgUGFyYW0gZm9yIHtAbGluayBEZXZpY2VFdmVudFR5cGUjT05fU1RBUlRfSU5QVVR9LiBSZXByZXNlbnRzIGlmIElNRSBpcyByZXN0YXJ0aW5nLgotICAgICAgICAgKi8KLSAgICAgICAgT05fU1RBUlRfSU5QVVRfUkVTVEFSVElORyhEZXZpY2VFdmVudFR5cGUuT05fU1RBUlRfSU5QVVQsICJvblN0YXJ0SW5wdXQucmVzdGFydGluZyIpOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgRGV2aWNlRXZlbnRUeXBlIG1UeXBlOwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtTmFtZTsKLQotICAgICAgICBEZXZpY2VFdmVudFR5cGVQYXJhbShEZXZpY2VFdmVudFR5cGUgdHlwZSwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgICAgIG1UeXBlID0gdHlwZTsKLSAgICAgICAgICAgIG1OYW1lID0gbmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtTmFtZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgogICAgICAqIFR5cGVzIG9mIGRldmljZSBldmVudCwgYSB2YWx1ZSBvZiB7QGxpbmsgI0VYVFJBX0VWRU5UX1RZUEV9LgogICAgICAqLwogICAgIHB1YmxpYyBlbnVtIERldmljZUV2ZW50VHlwZSB7CkBAIC0xMDUsNiArNzYsMTEgQEAKICAgICAgICAgT05fQ1JFQVRFLAogCiAgICAgICAgIC8qKgorICAgICAgICAgKiB7QGxpbmsgYW5kcm9pZC5pbnB1dG1ldGhvZHNlcnZpY2UuSW5wdXRNZXRob2RTZXJ2aWNlI29uQmluZElucHV0KCl9IGNhbGxiYWNrLgorICAgICAgICAgKi8KKyAgICAgICAgT05fQklORF9JTlBVVCwKKworICAgICAgICAvKioKICAgICAgICAgICoge0BsaW5rIGFuZHJvaWQuaW5wdXRtZXRob2RzZXJ2aWNlLklucHV0TWV0aG9kU2VydmljZSNvblN0YXJ0SW5wdXQoYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLkVkaXRvckluZm8sYm9vbGVhbikgb25TdGFydElucHV0KEVkaXRvckluZm8sYm9vbGVhbn0KICAgICAgICAgICogY2FsbGJhY2suCiAgICAgICAgICAqLwpAQCAtMTE2LDYgKzkyLDExIEBACiAgICAgICAgIE9OX1NUQVJUX0lOUFVUX1ZJRVcsCiAKICAgICAgICAgLyoqCisgICAgICAgICAqIHtAbGluayBhbmRyb2lkLmlucHV0bWV0aG9kc2VydmljZS5JbnB1dE1ldGhvZFNlcnZpY2Ujb25VbmJpbmRJbnB1dCgpfSBjYWxsYmFjay4KKyAgICAgICAgICovCisgICAgICAgIE9OX1VOQklORF9JTlBVVCwKKworICAgICAgICAvKioKICAgICAgICAgICoge0BsaW5rIGFuZHJvaWQuaW5wdXRtZXRob2RzZXJ2aWNlLklucHV0TWV0aG9kU2VydmljZSNvbkZpbmlzaElucHV0Vmlldyhib29sZWFuKSBvbkZpbmlzaElucHV0Vmlldyhib29sZWFuKX0KICAgICAgICAgICogY2FsbGJhY2suCiAgICAgICAgICAqLwpAQCAtMTM1LDE1ICsxMTYsNSBAQAogICAgICAgICAvKiogVGVzdCBzdGFydCBhbmQgZW5kIGV2ZW50IHR5cGVzLiAqLwogICAgICAgICBURVNUX1NUQVJULAogICAgICAgICBURVNUX0VORCwKLQotICAgICAgICAvKioKLSAgICAgICAgICoge0BsaW5rIGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dE1ldGhvZCNzaG93U29mdElucHV0fQotICAgICAgICAgKi8KLSAgICAgICAgU0hPV19TT0ZUX0lOUFVULAotCi0gICAgICAgIC8qKgotICAgICAgICAgKiB7QGxpbmsgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0TWV0aG9kI2hpZGVTb2Z0SW5wdXR9Ci0gICAgICAgICAqLwotICAgICAgICBISURFX1NPRlRfSU5QVVQsCiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9pbnB1dG1ldGhvZHNlcnZpY2UvY29tbW9uL3NyYy9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9jdHMvY29tbW9uL0VkaXRUZXh0QXBwQ29uc3RhbnRzLmphdmEgYi9ob3N0c2lkZXRlc3RzL2lucHV0bWV0aG9kc2VydmljZS9jb21tb24vc3JjL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL2N0cy9jb21tb24vRWRpdFRleHRBcHBDb25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjZkNGQxCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9pbnB1dG1ldGhvZHNlcnZpY2UvY29tbW9uL3NyYy9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9jdHMvY29tbW9uL0VkaXRUZXh0QXBwQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQuaW5wdXRtZXRob2RzZXJ2aWNlLmN0cy5jb21tb247CisKK3B1YmxpYyBjbGFzcyBFZGl0VGV4dEFwcENvbnN0YW50cyB7CisgICAgLy8gVGhpcyBpcyBjb25zdGFudHMgaG9sZGluZyBjbGFzcywgY2FuJ3QgaW5zdGFudGlhdGUuCisgICAgcHJpdmF0ZSBFZGl0VGV4dEFwcENvbnN0YW50cygpIHt9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFID0gImFuZHJvaWQuaW5wdXRtZXRob2RzZXJ2aWNlLmN0cy5lZGl0dGV4dGFwcCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1MgPSAgIFBBQ0tBR0UgKyAiLk1haW5BY3Rpdml0eSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBLID0gIkVkaXRUZXh0QXBwLmFwayI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVF9URVhUX1JFU19OQU1FID0gUEFDS0FHRSArICI6aWQvZWRpdF90ZXh0X2VudHJ5IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkkgPQorICAgICAgICAgICAgImh0dHBzOi8vZXhhbXBsZS5jb20vYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvY3RzL2VkaXR0ZXh0YXBwIjsKK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvaW5wdXRtZXRob2RzZXJ2aWNlL2NvbW1vbi9zcmMvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvY3RzL2NvbW1vbi9FdmVudFByb3ZpZGVyQ29uc3RhbnRzLmphdmEgYi9ob3N0c2lkZXRlc3RzL2lucHV0bWV0aG9kc2VydmljZS9jb21tb24vc3JjL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL2N0cy9jb21tb24vRXZlbnRQcm92aWRlckNvbnN0YW50cy5qYXZhCmluZGV4IDkyODgwNTEuLjE3MmUxYTcgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvaW5wdXRtZXRob2RzZXJ2aWNlL2NvbW1vbi9zcmMvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvY3RzL2NvbW1vbi9FdmVudFByb3ZpZGVyQ29uc3RhbnRzLmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9pbnB1dG1ldGhvZHNlcnZpY2UvY29tbW9uL3NyYy9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9jdHMvY29tbW9uL0V2ZW50UHJvdmlkZXJDb25zdGFudHMuamF2YQpAQCAtNTgsOSArNTgsNiBAQAogICAgICAgICAvLyBUaGlzIGlzIGNvbnN0YW50cyBob2xkaW5nIGNsYXNzLCBjYW4ndCBpbnN0YW50aWF0ZS4KICAgICAgICAgcHJpdmF0ZSBFdmVudFRhYmxlQ29uc3RhbnRzKCkge30KIAotICAgICAgICAvKiogQ29sdW1uIG5hbWUgb2YgdGhlIHRhYmxlIHRoYXQgaG9sZHMgRXZlbnQgZXh0cmFzIGluIGpzb24gZm9ybWF0LiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQVMgPSAiZXh0cmFzIjsKLQogICAgICAgICAvKiogTmFtZSBvZiB0aGUgdGFibGUgaW4gY29udGVudCBwcm92aWRlciBhbmQgZGF0YWJhc2UuICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAiZXZlbnRzIjsKIApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9pbnB1dG1ldGhvZHNlcnZpY2UvY29tbW9uL3NyYy9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9jdHMvY29tbW9uL0ltZUNvbW1hbmRDb25zdGFudHMuamF2YSBiL2hvc3RzaWRldGVzdHMvaW5wdXRtZXRob2RzZXJ2aWNlL2NvbW1vbi9zcmMvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvY3RzL2NvbW1vbi9JbWVDb21tYW5kQ29uc3RhbnRzLmphdmEKaW5kZXggNjFkNWZjOS4uZTE3YTdlMiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9pbnB1dG1ldGhvZHNlcnZpY2UvY29tbW9uL3NyYy9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9jdHMvY29tbW9uL0ltZUNvbW1hbmRDb25zdGFudHMuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2lucHV0bWV0aG9kc2VydmljZS9jb21tb24vc3JjL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL2N0cy9jb21tb24vSW1lQ29tbWFuZENvbnN0YW50cy5qYXZhCkBAIC01Miw2ICs1MiwyNCBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfU1dJVENIX0lOUFVUX01FVEhPRCA9ICJzd2l0Y2hJbnB1dE1ldGhvZCI7CiAKICAgICAvKioKKyAgICAgKiBUaGlzIGNvbW1hbmQgaGFzIHRoZSBtb2NrIElNRSBjYWxsIHtAbGluayBhbmRyb2lkLmlucHV0bWV0aG9kc2VydmljZS5JbnB1dE1ldGhvZFNlcnZpY2Ujc3dpdGNoSW5wdXRNZXRob2QoU3RyaW5nLCBJbnB1dE1ldGhvZFN1YnR5cGUpfSBJbnB1dE1ldGhvZFNlcnZpY2Ujc3dpdGNoSW5wdXRNZXRob2QoU3RyaW5nIGltZUlkLCBJbnB1dE1ldGhvZFN1YnR5cGUgc3VidHlwZSl9LgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+YXJndW1lbnQge0Bjb2RlIGltZUlkfSBuZWVkcyB0byBiZSBzcGVjaWZpZWQgYnkge0BsaW5rICNFWFRSQV9BUkdfU1RSSU5HMX0uPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfU1dJVENIX0lOUFVUX01FVEhPRF9XSVRIX1NVQlRZUEUgPSAic3dpdGNoSW5wdXRNZXRob2RXaXRoU3VidHlwZSI7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNvbW1hbmQgaGFzIHRoZSBtb2NrIElNRSBjYWxsIHtAbGluayBhbmRyb2lkLmlucHV0bWV0aG9kc2VydmljZS5JbnB1dE1ldGhvZFNlcnZpY2Ujc3dpdGNoVG9OZXh0SW5wdXRNZXRob2QoYm9vbGVhbil9IElucHV0TWV0aG9kU2VydmljZSNzd2l0Y2hUb05leHRJbnB1dE1ldGhvZChib29sZWFuIG9ubHlDdXJyZW50SW1lKX0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9TV0lUQ0hfVE9fTkVYVF9JTlBVVCA9ICJzd2l0Y2hUb05leHRJbnB1dCI7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNvbW1hbmQgaGFzIHRoZSBtb2NrIElNRSBjYWxsIHtAbGluayBhbmRyb2lkLmlucHV0bWV0aG9kc2VydmljZS5JbnB1dE1ldGhvZFNlcnZpY2Ujc3dpdGNoVG9QcmV2aW91c0lucHV0TWV0aG9kKCl9IElucHV0TWV0aG9kU2VydmljZSNzd2l0Y2hUb1ByZXZpb3VzSW5wdXRNZXRob2QoKX0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9TV0lUQ0hfVE9fUFJFVklPVVNfSU5QVVQgPSAic3dpdGNoVG9QcmV2aW91c0lucHV0TWV0aG9kIjsKKworICAgIC8qKgogICAgICAqIFRoaXMgY29tbWFuZCBoYXMgdGhlIG1vY2sgSU1FIGNhbGwge0BsaW5rIGFuZHJvaWQuaW5wdXRtZXRob2RzZXJ2aWNlLklucHV0TWV0aG9kU2VydmljZSNyZXF1ZXN0SGlkZVNlbGYoaW50KX0gSW5wdXRNZXRob2RTZXJ2aWNlI3JlcXVlc3RIaWRlU2VsZihpbnQgZmxhZ3MpfS4KICAgICAgKiA8dWw+CiAgICAgICogPGxpPmFyZ3VtZW50IHtAY29kZSBmbGFnc30gbmVlZHMgdG8gYmUgc3BlY2lmaWVkIGJ5IHtAbGluayAjRVhUUkFfQVJHX0lOVDF9LjwvbGk+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2lucHV0bWV0aG9kc2VydmljZS9jb21tb24vc3JjL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL2N0cy9jb21tb24vdGVzdC9EZXZpY2VUZXN0Q29uc3RhbnRzLmphdmEgYi9ob3N0c2lkZXRlc3RzL2lucHV0bWV0aG9kc2VydmljZS9jb21tb24vc3JjL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL2N0cy9jb21tb24vdGVzdC9EZXZpY2VUZXN0Q29uc3RhbnRzLmphdmEKaW5kZXggYWQ0OGE0Ni4uOWM0NDhlMiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9pbnB1dG1ldGhvZHNlcnZpY2UvY29tbW9uL3NyYy9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9jdHMvY29tbW9uL3Rlc3QvRGV2aWNlVGVzdENvbnN0YW50cy5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvaW5wdXRtZXRob2RzZXJ2aWNlL2NvbW1vbi9zcmMvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvY3RzL2NvbW1vbi90ZXN0L0RldmljZVRlc3RDb25zdGFudHMuamF2YQpAQCAtNDIsOSArNDIsOSBAQAogICAgICAgICAgICAiYW5kcm9pZC5pbnB1dG1ldGhvZHNlcnZpY2UuY3RzLmRldmljZXRlc3QuSW5wdXRNZXRob2RTZXJ2aWNlRGV2aWNlVGVzdCI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9DUkVBVEVfSU1FMSA9ICJ0ZXN0Q3JlYXRlSW1lMSI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9TV0lUQ0hfSU1FMV9UT19JTUUyID0gInRlc3RTd2l0Y2hJbWUxVG9JbWUyIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0lNRTFfSVNfTk9UX0NVUlJFTlRfSU1FID0gInRlc3RJbWUxSXNOb3RDdXJyZW50SW1lIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1NFQVJDSF9WSUVXX0dJVkVfRk9DVVNfU0hPV19JTUUxCi0gICAgICAgICAgICA9ICJ0ZXN0U2VhcmNoVmlld19naXZlRm9jdXNTaG93SW1lMSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9TRUFSQ0hfVklFV19TRVRfUVVFUllfSElERV9JTUUxCi0gICAgICAgICAgICA9ICJ0ZXN0U2VhcmNoVmlld19zZXRRdWVyeUhpZGVJbWUxIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1NXSVRDSF9JTlBVVE1FVEhPRCA9ICJ0ZXN0U3dpdGNoSW5wdXRNZXRob2QiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfU1dJVENIX05FWFRfSU5QVVQgPSAidGVzdFN3aXRjaFRvTmV4dElucHV0TWV0aG9kIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1NXSVRDSF9QUkVWSU9VU19JTlBVVCA9ICJzd2l0Y2hUb1ByZXZpb3VzSW5wdXRNZXRob2QiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfSU5QVVRfVU5CSU5EU19PTl9JTUVfU1RPUFBFRCA9ICJ0ZXN0SW5wdXRVbmJpbmRzT25JbWVTdG9wcGVkIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0lOUFVUX1VOQklORFNfT05fQVBQX1NUT1BQRUQgPSAidGVzdElucHV0VW5iaW5kc09uQXBwU3RvcHBlZCI7CiB9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2lucHV0bWV0aG9kc2VydmljZS9jb21tb24vc3JjL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL2N0cy9jb21tb24vdGVzdC9TaGVsbENvbW1hbmRVdGlscy5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9pbnB1dG1ldGhvZHNlcnZpY2UvY29tbW9uL3NyYy9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9jdHMvY29tbW9uL3Rlc3QvU2hlbGxDb21tYW5kVXRpbHMuamF2YQppbmRleCBiOTg0YWExLi45YmRiN2VmIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2lucHV0bWV0aG9kc2VydmljZS9jb21tb24vc3JjL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL2N0cy9jb21tb24vdGVzdC9TaGVsbENvbW1hbmRVdGlscy5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvaW5wdXRtZXRob2RzZXJ2aWNlL2NvbW1vbi9zcmMvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvY3RzL2NvbW1vbi90ZXN0L1NoZWxsQ29tbWFuZFV0aWxzLmphdmEKQEAgLTI5LDExICsyOSw2IEBACiAgICAgLy8gQ29waWVkIGZyb20gYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyI0ZFQVRVUkVfSU5QVVRfTUVUSE9EUy4KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX0lOUFVUX01FVEhPRFMgPSAiYW5kcm9pZC5zb2Z0d2FyZS5pbnB1dF9tZXRob2RzIjsKIAotICAgIC8qKiBDb21tYW5kIHRvIGNoZWNrIHdoZXRoZXIgc3lzdGVtIGhhcyBzcGVjaWZpZWQge0Bjb2RlIGZlYXR1cmVOYW1lfSBmZWF0dXJlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGhhc0ZlYXR1cmUoZmluYWwgU3RyaW5nIGZlYXR1cmVOYW1lKSB7Ci0gICAgICAgIHJldHVybiAiY21kIHBhY2thZ2UgaGFzLWZlYXR1cmUgIiArIGZlYXR1cmVOYW1lOwotICAgIH0KLQogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRUSU5HX0RFRkFVTFRfSU1FID0gInNlY3VyZSBkZWZhdWx0X2lucHV0X21ldGhvZCI7CiAKICAgICAvKiogQ29tbWFuZCB0byBnZXQgSUQgb2YgY3VycmVudCBJTUUuICovCkBAIC00MSw5ICszNiwyMCBAQAogICAgICAgICByZXR1cm4gInNldHRpbmdzIGdldCAiICsgU0VUVElOR19ERUZBVUxUX0lNRTsKICAgICB9CiAKLSAgICAvKiogQ29tbWFuZCB0byBzZXQgY3VycmVudCBJTUUgdG8ge0Bjb2RlIGltZUlkfS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBzZXRDdXJyZW50SW1lKGZpbmFsIFN0cmluZyBpbWVJZCkgewotICAgICAgICByZXR1cm4gInNldHRpbmdzIHB1dCAiICsgU0VUVElOR19ERUZBVUxUX0lNRSArICIgIiArIGltZUlkOworICAgIC8qKiBDb21tYW5kIHRvIHNldCBjdXJyZW50IElNRSB0byB7QGNvZGUgaW1lSWR9IHN5bmNocm9ub3VzbHkgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBzZXRDdXJyZW50SW1lU3luYyhmaW5hbCBTdHJpbmcgaW1lSWQpIHsKKyAgICAgICAgcmV0dXJuICJpbWUgc2V0ICIgKyBpbWVJZDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFbmFibGVkSW1lcygpIHsKKyAgICAgICAgcmV0dXJuICJpbWUgbGlzdCAtcyI7CisgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEF2YWlsYWJsZUltZXMoKSB7CisgICAgICAgIHJldHVybiAiaW1lIGxpc3QgLXMgLWEiOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGxpc3RQYWNrYWdlKFN0cmluZyBwYWNrYWdlTmFtZSkgeworICAgICAgICByZXR1cm4gInBtIGxpc3QgcGFja2FnZSAiICsgcGFja2FnZU5hbWU7CiAgICAgfQogCiAgICAgLyoqIENvbW1hbmQgdG8gZW5hYmxlIElNRSBvZiB7QGNvZGUgaW1lSWR9LiAqLwpAQCAtNTYsMTEgKzYyLDIwIEBACiAgICAgICAgIHJldHVybiAiaW1lIGRpc2FibGUgIiArIGltZUlkOwogICAgIH0KIAorICAgIC8qKiBDb21tYW5kIHRvIHJlc2V0IGN1cnJlbnRseSBzZWxlY3RlZC9lbmFibGVkIElNRXMgdG8gdGhlIGRlZmF1bHQgb25lcy4gKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyByZXNldEltZXMoKSB7CisgICAgICAgIHJldHVybiAiaW1lIHJlc2V0IjsKKyAgICB9CisKICAgICAvKiogQ29tbWFuZCB0byBkZWxldGUgYWxsIHJlY29yZHMgb2YgSU1FIGV2ZW50IHByb3ZpZGVyLiAqLwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0ZUNvbnRlbnQoZmluYWwgU3RyaW5nIGNvbnRlbnRVcmkpIHsKICAgICAgICAgcmV0dXJuICJjb250ZW50IGRlbGV0ZSAtLXVyaSAiICsgY29udGVudFVyaTsKICAgICB9CiAKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB1bmluc3RhbGxQYWNrYWdlKFN0cmluZyBwYWNrYWdlTmFtZSkgeworICAgICAgICByZXR1cm4gInBtIHVuaW5zdGFsbCAiICsgcGFja2FnZU5hbWU7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQ29tbWFuZCB0byBzZW5kIGJyb2FkY2FzdCB7QGNvZGUgSW50ZW50fS4KICAgICAgKgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9pbnB1dG1ldGhvZHNlcnZpY2UvZGV2aWNlc2lkZS9kZXZpY2V0ZXN0L0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2lucHV0bWV0aG9kc2VydmljZS9kZXZpY2VzaWRlL2RldmljZXRlc3QvQW5kcm9pZC5tawppbmRleCBkYjc0MmJmLi42MzZkM2FiIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2lucHV0bWV0aG9kc2VydmljZS9kZXZpY2VzaWRlL2RldmljZXRlc3QvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL2lucHV0bWV0aG9kc2VydmljZS9kZXZpY2VzaWRlL2RldmljZXRlc3QvQW5kcm9pZC5tawpAQCAtMjcsMTkgKzI3LDE5IEBACiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIExPQ0FMX0pBVkFfUkVTT1VSQ0VfRElSIDo9IHJlcwotTE9DQUxfSkFWQV9MSUJSQVJZIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIKK0xPQ0FMX0pBVkFfTElCUkFSWSA6PSBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzCiBMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAotICAgIGFuZHJvaWQtc3VwcG9ydC10ZXN0IFwKKyAgICBhbmRyb2lkeC50ZXN0LnJ1bGVzIFwKICAgICBoYW1jcmVzdCBoYW1jcmVzdC1saWJyYXJ5IFwKICAgICB1Yi11aWF1dG9tYXRvciBcCiAgICAgQ3RzSW5wdXRNZXRob2RTZXJ2aWNlQ29tbW9uIFwKICAgICBDdHNJbnB1dE1ldGhvZFNlcnZpY2VMaWIKIAogIyB0YWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzIGN0c19pbnN0YW50CiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNJbnB1dE1ldGhvZFNlcnZpY2VEZXZpY2VUZXN0cwogCi1MT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CitMT0NBTF9TREtfVkVSU0lPTiA6PSB0ZXN0X2N1cnJlbnQKIAogaW5jbHVkZSAkKEJVSUxEX0NUU19QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9pbnB1dG1ldGhvZHNlcnZpY2UvZGV2aWNlc2lkZS9kZXZpY2V0ZXN0L0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2lucHV0bWV0aG9kc2VydmljZS9kZXZpY2VzaWRlL2RldmljZXRlc3QvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA1NTY2NjEzLi5mYTZkNjJkIDEwMDc1NQotLS0gYS9ob3N0c2lkZXRlc3RzL2lucHV0bWV0aG9kc2VydmljZS9kZXZpY2VzaWRlL2RldmljZXRlc3QvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2lucHV0bWV0aG9kc2VydmljZS9kZXZpY2VzaWRlL2RldmljZXRlc3QvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMzAsMjAgKzMwLDEwIEBACiAgICAgICAgIGFuZHJvaWQ6YWxsb3dCYWNrdXA9ImZhbHNlIgogICAgID4KICAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+Ci0KLSAgICAgICAgPGFjdGl2aXR5Ci0gICAgICAgICAgICBhbmRyb2lkOm5hbWU9Ii5JbnB1dE1ldGhvZFNlcnZpY2VUZXN0QWN0aXZpdHkiCi0gICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJJbnB1dE1ldGhvZFNlcmN1Y2VUZXN0QWN0aXZpdHkiPgotICAgICAgICAgICAgPGludGVudC1maWx0ZXI+Ci0gICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgotICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgotICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgotICAgICAgICA8L2FjdGl2aXR5PgotCiAgICAgPC9hcHBsaWNhdGlvbj4KIAogICAgIDxpbnN0cnVtZW50YXRpb24KLSAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmlucHV0bWV0aG9kc2VydmljZS5jdHMuZGV2aWNldGVzdCIgLz4KIAogPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvaW5wdXRtZXRob2RzZXJ2aWNlL2RldmljZXNpZGUvZGV2aWNldGVzdC9yZXMvbGF5b3V0L2FjdGl2aXR5X2lucHV0bWV0aG9kX3Rlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9pbnB1dG1ldGhvZHNlcnZpY2UvZGV2aWNlc2lkZS9kZXZpY2V0ZXN0L3Jlcy9sYXlvdXQvYWN0aXZpdHlfaW5wdXRtZXRob2RfdGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZWZiOTQuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9pbnB1dG1ldGhvZHNlcnZpY2UvZGV2aWNlc2lkZS9kZXZpY2V0ZXN0L3Jlcy9sYXlvdXQvYWN0aXZpdHlfaW5wdXRtZXRob2RfdGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLQotICBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08UmVsYXRpdmVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICBhbmRyb2lkOnBhZGRpbmc9IjEwcHgiPgotCi0gICAgPEVkaXRUZXh0Ci0gICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGV4dF9lbnRyeSIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAYW5kcm9pZDpkcmF3YWJsZS9lZGl0Ym94X2JhY2tncm91bmQiLz4KLSAgICA8U2VhcmNoVmlldwotICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3NlYXJjaF92aWV3IgotICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL3RleHRfZW50cnkiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmljb25pZmllZEJ5RGVmYXVsdD0iZmFsc2UiCi0gICAgICAgIGFuZHJvaWQ6cXVlcnlIaW50PSJoaW50IgotICAgICAgICBhbmRyb2lkOmlucHV0VHlwZT0idGV4dENhcENoYXJhY3RlcnMiCi0gICAgICAgIGFuZHJvaWQ6aW1lT3B0aW9ucz0iYWN0aW9uRG9uZSIgLz4KLQotPC9SZWxhdGl2ZUxheW91dD4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvaW5wdXRtZXRob2RzZXJ2aWNlL2RldmljZXNpZGUvZGV2aWNldGVzdC9zcmMvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvY3RzL2RldmljZXRlc3QvQnVzeVdhaXRVdGlscy5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9pbnB1dG1ldGhvZHNlcnZpY2UvZGV2aWNlc2lkZS9kZXZpY2V0ZXN0L3NyYy9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9jdHMvZGV2aWNldGVzdC9CdXN5V2FpdFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExZTg1OGQuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9pbnB1dG1ldGhvZHNlcnZpY2UvZGV2aWNlc2lkZS9kZXZpY2V0ZXN0L3NyYy9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9jdHMvZGV2aWNldGVzdC9CdXN5V2FpdFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmlucHV0bWV0aG9kc2VydmljZS5jdHMuZGV2aWNldGVzdDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIGZvciBidXN5IHdhaXRpbmcuCi0gKi8KLWZpbmFsIGNsYXNzIEJ1c3lXYWl0VXRpbHMgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBQT0xMSU5HX0lOVEVSVkFMID0gVGltZVVuaXQuTUlMTElTRUNPTkRTLnRvTWlsbGlzKDUwKTsKLQotICAgIEBGdW5jdGlvbmFsSW50ZXJmYWNlCi0gICAgaW50ZXJmYWNlIFBvbGxpbmdDb25kaXRpb24gewotICAgICAgICBib29sZWFuIGNoZWNrKCkgdGhyb3dzIEV4Y2VwdGlvbjsKLSAgICB9Ci0KLSAgICAvLyBUaGlzIGlzIHV0aWxpdHkgY2xhc3MsIGNhbid0IGluc3RhbnRpYXRlLgotICAgIHByaXZhdGUgQnVzeVdhaXRVdGlscygpIHt9Ci0KLSAgICAvKioKLSAgICAgKiBCdXN5IHdhaXRpbmcgdW50aWwge0BsaW5rIFBvbGxpbmdDb25kaXRpb24jY2hlY2soKX0gcmV0dXJucyB7QGNvZGUgdHJ1ZX0uCi0gICAgICogQHBhcmFtIGNvbmRpdGlvbiB7QGxpbmsgUG9sbGluZ0NvbmRpdGlvbn0gdG8gYmUgY2hlY2tlZC4KLSAgICAgKiBAcGFyYW0gdGltZW91dCBtaWxsaXNlY29uZHMgYmVmb3JlIHRpbWUgb3V0IGhhcHBlbnMuCi0gICAgICogQHBhcmFtIG1lc3NhZ2Ugd2hlbiB0aW1lIG91dCBoYXBwZW5zLCB7QGxpbmsgb3JnLmp1bml0LkFzc2VydCNmYWlsKFN0cmluZyl9IGlzIGNhbGxlZCB3aXRoCi0gICAgICogICAgICAgICAgICAgICAgdGhpcyBtZXNzYWdlLgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgc3RhdGljIHZvaWQgcG9sbGluZ0NoZWNrKGZpbmFsIFBvbGxpbmdDb25kaXRpb24gY29uZGl0aW9uLCBmaW5hbCBsb25nIHRpbWVvdXQsCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh3YWl0Rm9yKGNvbmRpdGlvbiwgdGltZW91dCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmYWlsKG1lc3NhZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJ1c3kgd2FpdGluZyB1bnRpbCB7QGxpbmsgUG9sbGluZ0NvbmRpdGlvbiNjaGVjaygpfSByZXR1cm5zIHtAY29kZSB0cnVlfS4KLSAgICAgKiBAcGFyYW0gY29uZGl0aW9uIHtAbGluayBQb2xsaW5nQ29uZGl0aW9ufSB0byBiZSBjaGVja2VkLgotICAgICAqIEBwYXJhbSB0aW1lb3V0IG1pbGxpc2Vjb25kcyBiZWZvcmUgdGltZSBvdXQgaGFwcGVucy4KLSAgICAgKiBAcmV0dXJuIHRydWUgd2hlbiB7QGNvZGUgY29uZGl0aW9ufSByZXR1cm5zIHtAY29kZSB0cnVlfSwgZmFsc2Ugd2hlbiB0aW1lZCBvdXQuCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBzdGF0aWMgYm9vbGVhbiB3YWl0Rm9yKGZpbmFsIFBvbGxpbmdDb25kaXRpb24gY29uZGl0aW9uLCBmaW5hbCBsb25nIHRpbWVvdXQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmb3IgKGxvbmcgcmVtYWluaW5nID0gdGltZW91dDsgcmVtYWluaW5nID4gMDsgcmVtYWluaW5nIC09IFBPTExJTkdfSU5URVJWQUwpIHsKLSAgICAgICAgICAgIGlmIChjb25kaXRpb24uY2hlY2soKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFBPTExJTkdfSU5URVJWQUwpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2lucHV0bWV0aG9kc2VydmljZS9kZXZpY2VzaWRlL2RldmljZXRlc3Qvc3JjL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL2N0cy9kZXZpY2V0ZXN0L0lucHV0TWV0aG9kU2VydmljZURldmljZVRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvaW5wdXRtZXRob2RzZXJ2aWNlL2RldmljZXNpZGUvZGV2aWNldGVzdC9zcmMvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvY3RzL2RldmljZXRlc3QvSW5wdXRNZXRob2RTZXJ2aWNlRGV2aWNlVGVzdC5qYXZhCmluZGV4IGZlYjhiNWYuLmE0MDYzODcgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvaW5wdXRtZXRob2RzZXJ2aWNlL2RldmljZXNpZGUvZGV2aWNldGVzdC9zcmMvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvY3RzL2RldmljZXRlc3QvSW5wdXRNZXRob2RTZXJ2aWNlRGV2aWNlVGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvaW5wdXRtZXRob2RzZXJ2aWNlL2RldmljZXNpZGUvZGV2aWNldGVzdC9zcmMvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvY3RzL2RldmljZXRlc3QvSW5wdXRNZXRob2RTZXJ2aWNlRGV2aWNlVGVzdC5qYXZhCkBAIC0xNiw0OSArMTYsNTAgQEAKIAogcGFja2FnZSBhbmRyb2lkLmlucHV0bWV0aG9kc2VydmljZS5jdHMuZGV2aWNldGVzdDsKIAotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotCiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuaW5wdXRtZXRob2RzZXJ2aWNlLmN0cy5EZXZpY2VFdmVudC5pc0Zyb207CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuaW5wdXRtZXRob2RzZXJ2aWNlLmN0cy5EZXZpY2VFdmVudC5pc05ld2VyVGhhbjsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5pbnB1dG1ldGhvZHNlcnZpY2UuY3RzLkRldmljZUV2ZW50LmlzVHlwZTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5pbnB1dG1ldGhvZHNlcnZpY2UuY3RzLmNvbW1vbi5EZXZpY2VFdmVudENvbnN0YW50cy5EZXZpY2VFdmVudFR5cGUuSElERV9TT0ZUX0lOUFVUOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmlucHV0bWV0aG9kc2VydmljZS5jdHMuY29tbW9uLkJ1c3lXYWl0VXRpbHMucG9sbGluZ0NoZWNrOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmlucHV0bWV0aG9kc2VydmljZS5jdHMuY29tbW9uLkRldmljZUV2ZW50Q29uc3RhbnRzLkRldmljZUV2ZW50VHlwZQorICAgICAgICAuT05fQklORF9JTlBVVDsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5pbnB1dG1ldGhvZHNlcnZpY2UuY3RzLmNvbW1vbi5EZXZpY2VFdmVudENvbnN0YW50cy5EZXZpY2VFdmVudFR5cGUuT05fQ1JFQVRFOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmlucHV0bWV0aG9kc2VydmljZS5jdHMuY29tbW9uLkRldmljZUV2ZW50Q29uc3RhbnRzLkRldmljZUV2ZW50VHlwZS5PTl9ERVNUUk9ZOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmlucHV0bWV0aG9kc2VydmljZS5jdHMuY29tbW9uLkRldmljZUV2ZW50Q29uc3RhbnRzLkRldmljZUV2ZW50VHlwZS5PTl9GSU5JU0hfSU5QVVQ7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuaW5wdXRtZXRob2RzZXJ2aWNlLmN0cy5jb21tb24uRGV2aWNlRXZlbnRDb25zdGFudHMuRGV2aWNlRXZlbnRUeXBlLk9OX1NUQVJUX0lOUFVUOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmlucHV0bWV0aG9kc2VydmljZS5jdHMuY29tbW9uLkRldmljZUV2ZW50Q29uc3RhbnRzLkRldmljZUV2ZW50VHlwZS5TSE9XX1NPRlRfSU5QVVQ7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5pbnB1dG1ldGhvZHNlcnZpY2UuY3RzLmNvbW1vbi5EZXZpY2VFdmVudENvbnN0YW50cy5EZXZpY2VFdmVudFR5cGUKKyAgICAgICAgLk9OX1VOQklORF9JTlBVVDsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5pbnB1dG1ldGhvZHNlcnZpY2UuY3RzLmNvbW1vbi5JbWVDb21tYW5kQ29uc3RhbnRzLkFDVElPTl9JTUVfQ09NTUFORDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5pbnB1dG1ldGhvZHNlcnZpY2UuY3RzLmNvbW1vbi5JbWVDb21tYW5kQ29uc3RhbnRzCisgICAgICAgIC5DT01NQU5EX1NXSVRDSF9JTlBVVF9NRVRIT0RfV0lUSF9TVUJUWVBFOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmlucHV0bWV0aG9kc2VydmljZS5jdHMuY29tbW9uLkltZUNvbW1hbmRDb25zdGFudHMuQ09NTUFORF9TV0lUQ0hfSU5QVVRfTUVUSE9EOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmlucHV0bWV0aG9kc2VydmljZS5jdHMuY29tbW9uLkltZUNvbW1hbmRDb25zdGFudHMKKyAgICAgICAgLkNPTU1BTkRfU1dJVENIX1RPX1BSRVZJT1VTX0lOUFVUOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmlucHV0bWV0aG9kc2VydmljZS5jdHMuY29tbW9uLkltZUNvbW1hbmRDb25zdGFudHMKKyAgICAgICAgLkNPTU1BTkRfU1dJVENIX1RPX05FWFRfSU5QVVQ7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuaW5wdXRtZXRob2RzZXJ2aWNlLmN0cy5jb21tb24uSW1lQ29tbWFuZENvbnN0YW50cy5FWFRSQV9BUkdfU1RSSU5HMTsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5pbnB1dG1ldGhvZHNlcnZpY2UuY3RzLmNvbW1vbi5JbWVDb21tYW5kQ29uc3RhbnRzLkVYVFJBX0NPTU1BTkQ7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQuaW5wdXRtZXRob2RzZXJ2aWNlLmN0cy5kZXZpY2V0ZXN0LkJ1c3lXYWl0VXRpbHMucG9sbGluZ0NoZWNrOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmlucHV0bWV0aG9kc2VydmljZS5jdHMuZGV2aWNldGVzdC5Nb3JlQ29sbGVjdG9ycy5zdGFydGluZ0Zyb207CiAKLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKIGltcG9ydCBhbmRyb2lkLmlucHV0bWV0aG9kc2VydmljZS5jdHMuRGV2aWNlRXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC5pbnB1dG1ldGhvZHNlcnZpY2UuY3RzLmNvbW1vbi5EZXZpY2VFdmVudENvbnN0YW50cy5EZXZpY2VFdmVudFR5cGU7Ci1pbXBvcnQgYW5kcm9pZC5pbnB1dG1ldGhvZHNlcnZpY2UuY3RzLmNvbW1vbi5EZXZpY2VFdmVudENvbnN0YW50cy5EZXZpY2VFdmVudFR5cGVQYXJhbTsKK2ltcG9ydCBhbmRyb2lkLmlucHV0bWV0aG9kc2VydmljZS5jdHMuY29tbW9uLkVkaXRUZXh0QXBwQ29uc3RhbnRzOwogaW1wb3J0IGFuZHJvaWQuaW5wdXRtZXRob2RzZXJ2aWNlLmN0cy5jb21tb24uSW1lMUNvbnN0YW50czsKIGltcG9ydCBhbmRyb2lkLmlucHV0bWV0aG9kc2VydmljZS5jdHMuY29tbW9uLkltZTJDb25zdGFudHM7CiBpbXBvcnQgYW5kcm9pZC5pbnB1dG1ldGhvZHNlcnZpY2UuY3RzLmNvbW1vbi50ZXN0LkRldmljZVRlc3RDb25zdGFudHM7CiBpbXBvcnQgYW5kcm9pZC5pbnB1dG1ldGhvZHNlcnZpY2UuY3RzLmNvbW1vbi50ZXN0LlNoZWxsQ29tbWFuZFV0aWxzOwogaW1wb3J0IGFuZHJvaWQuaW5wdXRtZXRob2RzZXJ2aWNlLmN0cy5kZXZpY2V0ZXN0LlNlcXVlbmNlTWF0Y2hlci5NYXRjaFJlc3VsdDsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNlYXJjaFZpZXc7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC51aWF1dG9tYXRvci5VaU9iamVjdDI7CiAKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5JbnRGdW5jdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlOwogaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yOwotaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKIAogQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKIHB1YmxpYyBjbGFzcyBJbnB1dE1ldGhvZFNlcnZpY2VEZXZpY2VUZXN0IHsKQEAgLTcwLDE5ICs3MSwxNyBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVJbWUxKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIGZpbmFsIFRlc3RIZWxwZXIgaGVscGVyID0gbmV3IFRlc3RIZWxwZXIoZ2V0Q2xhc3MoKSwgRGV2aWNlVGVzdENvbnN0YW50cy5URVNUX0NSRUFURV9JTUUxKTsKIAorICAgICAgICBmaW5hbCBsb25nIHN0YXJ0QWN0aXZpdHlUaW1lID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CisgICAgICAgIGhlbHBlci5sYXVuY2hBY3Rpdml0eShFZGl0VGV4dEFwcENvbnN0YW50cy5QQUNLQUdFLCBFZGl0VGV4dEFwcENvbnN0YW50cy5DTEFTUywKKyAgICAgICAgICAgICAgICBFZGl0VGV4dEFwcENvbnN0YW50cy5VUkkpOworCiAgICAgICAgIHBvbGxpbmdDaGVjaygoKSAtPiBoZWxwZXIucXVlcnlBbGxFdmVudHMoKQogICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3Qoc3RhcnRpbmdGcm9tKGhlbHBlci5pc1N0YXJ0T2ZUZXN0KCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihpc0Zyb20oSW1lMUNvbnN0YW50cy5DTEFTUykuYW5kKGlzVHlwZShPTl9DUkVBVEUpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kQW55KCkuaXNQcmVzZW50KCksCisgICAgICAgICAgICAgICAgICAgICAgICAuYW55TWF0Y2goaXNGcm9tKEltZTFDb25zdGFudHMuQ0xBU1MpLmFuZChpc1R5cGUoT05fQ1JFQVRFKSkpLAogICAgICAgICAgICAgICAgIFRJTUVPVVQsICJDdHNJbnB1dE1ldGhvZDEub25DcmVhdGUgaXMgY2FsbGVkIik7Ci0KLSAgICAgICAgZmluYWwgbG9uZyBzdGFydEFjdGl2aXR5VGltZSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwotICAgICAgICBoZWxwZXIubGF1bmNoQWN0aXZpdHkoRGV2aWNlVGVzdENvbnN0YW50cy5QQUNLQUdFLCBEZXZpY2VUZXN0Q29uc3RhbnRzLlRFU1RfQUNUSVZJVFlfQ0xBU1MpOwotCiAgICAgICAgIHBvbGxpbmdDaGVjaygoKSAtPiBoZWxwZXIucXVlcnlBbGxFdmVudHMoKQogICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihpc05ld2VyVGhhbihzdGFydEFjdGl2aXR5VGltZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGlzRnJvbShJbWUxQ29uc3RhbnRzLkNMQVNTKS5hbmQoaXNUeXBlKE9OX1NUQVJUX0lOUFVUKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZmluZEFueSgpLmlzUHJlc2VudCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgLmFueU1hdGNoKGlzRnJvbShJbWUxQ29uc3RhbnRzLkNMQVNTKS5hbmQoaXNUeXBlKE9OX1NUQVJUX0lOUFVUKSkpLAogICAgICAgICAgICAgICAgIFRJTUVPVVQsICJDdHNJbnB1dE1ldGhvZDEub25TdGFydElucHV0IGlzIGNhbGxlZCIpOwogICAgIH0KIApAQCAtOTIsMjIgKzkxLDIwIEBACiAgICAgICAgIGZpbmFsIFRlc3RIZWxwZXIgaGVscGVyID0gbmV3IFRlc3RIZWxwZXIoCiAgICAgICAgICAgICAgICAgZ2V0Q2xhc3MoKSwgRGV2aWNlVGVzdENvbnN0YW50cy5URVNUX1NXSVRDSF9JTUUxX1RPX0lNRTIpOwogCisgICAgICAgIGZpbmFsIGxvbmcgc3RhcnRBY3Rpdml0eVRpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgaGVscGVyLmxhdW5jaEFjdGl2aXR5KEVkaXRUZXh0QXBwQ29uc3RhbnRzLlBBQ0tBR0UsIEVkaXRUZXh0QXBwQ29uc3RhbnRzLkNMQVNTLAorICAgICAgICAgICAgICAgIEVkaXRUZXh0QXBwQ29uc3RhbnRzLlVSSSk7CisKICAgICAgICAgcG9sbGluZ0NoZWNrKCgpIC0+IGhlbHBlci5xdWVyeUFsbEV2ZW50cygpCiAgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChzdGFydGluZ0Zyb20oaGVscGVyLmlzU3RhcnRPZlRlc3QoKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGlzRnJvbShJbWUxQ29uc3RhbnRzLkNMQVNTKS5hbmQoaXNUeXBlKE9OX0NSRUFURSkpKQotICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmRBbnkoKS5pc1ByZXNlbnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hbnlNYXRjaChpc0Zyb20oSW1lMUNvbnN0YW50cy5DTEFTUykuYW5kKGlzVHlwZShPTl9DUkVBVEUpKSksCiAgICAgICAgICAgICAgICAgVElNRU9VVCwgIkN0c0lucHV0TWV0aG9kMS5vbkNyZWF0ZSBpcyBjYWxsZWQiKTsKLQotICAgICAgICBmaW5hbCBsb25nIHN0YXJ0QWN0aXZpdHlUaW1lID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7Ci0gICAgICAgIGhlbHBlci5sYXVuY2hBY3Rpdml0eShEZXZpY2VUZXN0Q29uc3RhbnRzLlBBQ0tBR0UsIERldmljZVRlc3RDb25zdGFudHMuVEVTVF9BQ1RJVklUWV9DTEFTUyk7Ci0KICAgICAgICAgcG9sbGluZ0NoZWNrKCgpIC0+IGhlbHBlci5xdWVyeUFsbEV2ZW50cygpCiAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGlzTmV3ZXJUaGFuKHN0YXJ0QWN0aXZpdHlUaW1lKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoaXNGcm9tKEltZTFDb25zdGFudHMuQ0xBU1MpLmFuZChpc1R5cGUoT05fU1RBUlRfSU5QVVQpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kQW55KCkuaXNQcmVzZW50KCksCisgICAgICAgICAgICAgICAgICAgICAgICAuYW55TWF0Y2goaXNGcm9tKEltZTFDb25zdGFudHMuQ0xBU1MpLmFuZChpc1R5cGUoT05fU1RBUlRfSU5QVVQpKSksCiAgICAgICAgICAgICAgICAgVElNRU9VVCwgIkN0c0lucHV0TWV0aG9kMS5vblN0YXJ0SW5wdXQgaXMgY2FsbGVkIik7CiAKLSAgICAgICAgaGVscGVyLmZpbmRVaU9iamVjdChSLmlkLnRleHRfZW50cnkpLmNsaWNrKCk7CisgICAgICAgIGhlbHBlci5maW5kVWlPYmplY3QoRWRpdFRleHRBcHBDb25zdGFudHMuRURJVF9URVhUX1JFU19OQU1FKS5jbGljaygpOwogCiAgICAgICAgIC8vIFN3aXRjaCBJTUUgZnJvbSBDdHNJbnB1dE1ldGhvZDEgdG8gQ3RzSW5wdXRNZXRob2QyLgogICAgICAgICBmaW5hbCBsb25nIHN3aXRjaEltZVRpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKQEAgLTEyMSw3NSArMTE4LDE1MSBAQAogICAgICAgICAgICAgICAgIFRJTUVPVVQsICJDdHNJbnB1dE1ldGhvZDIgaXMgY3VycmVudCBJTUUiKTsKICAgICAgICAgcG9sbGluZ0NoZWNrKCgpIC0+IGhlbHBlci5xdWVyeUFsbEV2ZW50cygpCiAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGlzTmV3ZXJUaGFuKHN3aXRjaEltZVRpbWUpKQotICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihpc0Zyb20oSW1lMUNvbnN0YW50cy5DTEFTUykuYW5kKGlzVHlwZShPTl9ERVNUUk9ZKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZmluZEFueSgpLmlzUHJlc2VudCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgLmFueU1hdGNoKGlzRnJvbShJbWUxQ29uc3RhbnRzLkNMQVNTKS5hbmQoaXNUeXBlKE9OX0RFU1RST1kpKSksCiAgICAgICAgICAgICAgICAgVElNRU9VVCwgIkN0c0lucHV0TWV0aG9kMS5vbkRlc3Ryb3kgaXMgY2FsbGVkIik7CiAgICAgICAgIHBvbGxpbmdDaGVjaygoKSAtPiBoZWxwZXIucXVlcnlBbGxFdmVudHMoKQogICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihpc05ld2VyVGhhbihzd2l0Y2hJbWVUaW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoaXNGcm9tKEltZTJDb25zdGFudHMuQ0xBU1MpKQotICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3Qoc2VxdWVuY2VPZlR5cGVzKE9OX0NSRUFURSwgT05fU1RBUlRfSU5QVVQpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3Qoc2VxdWVuY2VPZlR5cGVzKE9OX0NSRUFURSwgT05fQklORF9JTlBVVCwgT05fU1RBUlRfSU5QVVQpKQogICAgICAgICAgICAgICAgICAgICAgICAgLm1hdGNoZWQoKSwKICAgICAgICAgICAgICAgICBUSU1FT1VULAotICAgICAgICAgICAgICAgICJDdHNJbnB1dE1ldGhvZDIub25DcmVhdGUgYW5kIG9uU3RhcnRJbnB1dCBhcmUgY2FsbGVkIGluIHNlcXVlbmNlIik7CisgICAgICAgICAgICAgICAgIkN0c0lucHV0TWV0aG9kMi5vbkNyZWF0ZSwgb25CaW5kSW5wdXQsIGFuZCBvblN0YXJ0SW5wdXQgYXJlIGNhbGxlZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpbiBzZXF1ZW5jZSIpOwogICAgIH0KIAotICAgIC8qKiBUZXN0IHRvIGNoZWNrIEN0c0lucHV0TWV0aG9kMSBpc24ndCBjdXJyZW50IElNRS4gKi8KICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RJbWUxSXNOb3RDdXJyZW50SW1lKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIGZpbmFsIFRlc3RIZWxwZXIgaGVscGVyID0KLSAgICAgICAgICAgICAgICBuZXcgVGVzdEhlbHBlcihnZXRDbGFzcygpLCBEZXZpY2VUZXN0Q29uc3RhbnRzLlRFU1RfSU1FMV9JU19OT1RfQ1VSUkVOVF9JTUUpOworICAgIHB1YmxpYyB2b2lkIHRlc3RTd2l0Y2hJbnB1dE1ldGhvZCgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBmaW5hbCBUZXN0SGVscGVyIGhlbHBlciA9IG5ldyBUZXN0SGVscGVyKAorICAgICAgICAgICAgICAgIGdldENsYXNzKCksIERldmljZVRlc3RDb25zdGFudHMuVEVTVF9TV0lUQ0hfSU5QVVRNRVRIT0QpOworICAgICAgICBmaW5hbCBsb25nIHN0YXJ0QWN0aXZpdHlUaW1lID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CisgICAgICAgIGhlbHBlci5sYXVuY2hBY3Rpdml0eShFZGl0VGV4dEFwcENvbnN0YW50cy5QQUNLQUdFLCBFZGl0VGV4dEFwcENvbnN0YW50cy5DTEFTUywKKyAgICAgICAgICAgICAgICBFZGl0VGV4dEFwcENvbnN0YW50cy5VUkkpOworICAgICAgICBwb2xsaW5nQ2hlY2soKCkgLT4gaGVscGVyLnF1ZXJ5QWxsRXZlbnRzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoaXNOZXdlclRoYW4oc3RhcnRBY3Rpdml0eVRpbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFueU1hdGNoKGlzRnJvbShJbWUxQ29uc3RhbnRzLkNMQVNTKS5hbmQoaXNUeXBlKE9OX1NUQVJUX0lOUFVUKSkpLAorICAgICAgICAgICAgICAgIFRJTUVPVVQsICJDdHNJbnB1dE1ldGhvZDEub25TdGFydElucHV0IGlzIGNhbGxlZCIpOworICAgICAgICBoZWxwZXIuZmluZFVpT2JqZWN0KEVkaXRUZXh0QXBwQ29uc3RhbnRzLkVESVRfVEVYVF9SRVNfTkFNRSkuY2xpY2soKTsKIAotICAgICAgICBoZWxwZXIubGF1bmNoQWN0aXZpdHkoRGV2aWNlVGVzdENvbnN0YW50cy5QQUNLQUdFLCBEZXZpY2VUZXN0Q29uc3RhbnRzLlRFU1RfQUNUSVZJVFlfQ0xBU1MpOwotICAgICAgICBoZWxwZXIuZmluZFVpT2JqZWN0KFIuaWQudGV4dF9lbnRyeSkuY2xpY2soKTsKKyAgICAgICAgZmluYWwgbG9uZyBzZXRJbWVUaW1lID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CisgICAgICAgIC8vIGNhbGwgc2V0SW5wdXRNZXRob2RBbmRTdWJ0eXBlKElNRTIsIG51bGwpCisgICAgICAgIGhlbHBlci5zaGVsbChTaGVsbENvbW1hbmRVdGlscy5icm9hZGNhc3RJbnRlbnQoCisgICAgICAgICAgICAgICAgQUNUSU9OX0lNRV9DT01NQU5ELCBJbWUxQ29uc3RhbnRzLlBBQ0tBR0UsCisgICAgICAgICAgICAgICAgIi1lIiwgRVhUUkFfQ09NTUFORCwgQ09NTUFORF9TV0lUQ0hfSU5QVVRfTUVUSE9EX1dJVEhfU1VCVFlQRSwKKyAgICAgICAgICAgICAgICAiLWUiLCBFWFRSQV9BUkdfU1RSSU5HMSwgSW1lMkNvbnN0YW50cy5JTUVfSUQpKTsKKyAgICAgICAgcG9sbGluZ0NoZWNrKCgpIC0+IGhlbHBlci5zaGVsbChTaGVsbENvbW1hbmRVdGlscy5nZXRDdXJyZW50SW1lKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKEltZTJDb25zdGFudHMuSU1FX0lEKSwKKyAgICAgICAgICAgICAgICBUSU1FT1VULCAiQ3RzSW5wdXRNZXRob2QyIGlzIGN1cnJlbnQgSU1FIik7CisgICAgICAgIHBvbGxpbmdDaGVjaygoKSAtPiBoZWxwZXIucXVlcnlBbGxFdmVudHMoKQorICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihpc05ld2VyVGhhbihzZXRJbWVUaW1lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hbnlNYXRjaChpc0Zyb20oSW1lMUNvbnN0YW50cy5DTEFTUykuYW5kKGlzVHlwZShPTl9ERVNUUk9ZKSkpLAorICAgICAgICAgICAgICAgIFRJTUVPVVQsICJDdHNJbnB1dE1ldGhvZDEub25EZXN0cm95IGlzIGNhbGxlZCIpOworICAgIH0KIAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN3aXRjaFRvTmV4dElucHV0TWV0aG9kKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGZpbmFsIFRlc3RIZWxwZXIgaGVscGVyID0gbmV3IFRlc3RIZWxwZXIoCisgICAgICAgICAgICAgICAgZ2V0Q2xhc3MoKSwgRGV2aWNlVGVzdENvbnN0YW50cy5URVNUX1NXSVRDSF9ORVhUX0lOUFVUKTsKKyAgICAgICAgZmluYWwgbG9uZyBzdGFydEFjdGl2aXR5VGltZSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworICAgICAgICBoZWxwZXIubGF1bmNoQWN0aXZpdHkoRWRpdFRleHRBcHBDb25zdGFudHMuUEFDS0FHRSwgRWRpdFRleHRBcHBDb25zdGFudHMuQ0xBU1MsCisgICAgICAgICAgICAgICAgRWRpdFRleHRBcHBDb25zdGFudHMuVVJJKTsKKyAgICAgICAgcG9sbGluZ0NoZWNrKCgpIC0+IGhlbHBlci5xdWVyeUFsbEV2ZW50cygpCisgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGlzTmV3ZXJUaGFuKHN0YXJ0QWN0aXZpdHlUaW1lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hbnlNYXRjaChpc0Zyb20oSW1lMUNvbnN0YW50cy5DTEFTUykuYW5kKGlzVHlwZShPTl9TVEFSVF9JTlBVVCkpKSwKKyAgICAgICAgICAgICAgICBUSU1FT1VULCAiQ3RzSW5wdXRNZXRob2QxLm9uU3RhcnRJbnB1dCBpcyBjYWxsZWQiKTsKKyAgICAgICAgaGVscGVyLmZpbmRVaU9iamVjdChFZGl0VGV4dEFwcENvbnN0YW50cy5FRElUX1RFWFRfUkVTX05BTUUpLmNsaWNrKCk7CisKKyAgICAgICAgcG9sbGluZ0NoZWNrKCgpIC0+IGhlbHBlci5zaGVsbChTaGVsbENvbW1hbmRVdGlscy5nZXRDdXJyZW50SW1lKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKEltZTFDb25zdGFudHMuSU1FX0lEKSwKKyAgICAgICAgICAgICAgICBUSU1FT1VULCAiQ3RzSW5wdXRNZXRob2QxIGlzIGN1cnJlbnQgSU1FIik7CisgICAgICAgIGhlbHBlci5zaGVsbChTaGVsbENvbW1hbmRVdGlscy5icm9hZGNhc3RJbnRlbnQoCisgICAgICAgICAgICAgICAgQUNUSU9OX0lNRV9DT01NQU5ELCBJbWUxQ29uc3RhbnRzLlBBQ0tBR0UsCisgICAgICAgICAgICAgICAgIi1lIiwgRVhUUkFfQ09NTUFORCwgQ09NTUFORF9TV0lUQ0hfVE9fTkVYVF9JTlBVVCkpOwogICAgICAgICBwb2xsaW5nQ2hlY2soKCkgLT4gIWhlbHBlci5zaGVsbChTaGVsbENvbW1hbmRVdGlscy5nZXRDdXJyZW50SW1lKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKEltZTFDb25zdGFudHMuSU1FX0lEKSwKLSAgICAgICAgICAgICAgICBUSU1FT1VULAotICAgICAgICAgICAgICAgICJDdHNJbnB1dE1ldGhvZDEgaXMgdW5pbnN0YWxsZWQgb3IgZGlzYWJsZWQsIGFuZCBjdXJyZW50IElNRSBiZWNvbWVzIG90aGVyIElNRSIpOworICAgICAgICAgICAgICAgIFRJTUVPVVQsICJDdHNJbnB1dE1ldGhvZDEgc2hvdWxkbid0IGJlIGN1cnJlbnQgSU1FIik7CiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VhcmNoVmlld19naXZlRm9jdXNTaG93SW1lMSgpIHRocm93cyBUaHJvd2FibGUgeworICAgIHB1YmxpYyB2b2lkIHN3aXRjaFRvUHJldmlvdXNJbnB1dE1ldGhvZCgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBmaW5hbCBUZXN0SGVscGVyIGhlbHBlciA9IG5ldyBUZXN0SGVscGVyKAotICAgICAgICAgICAgICAgIGdldENsYXNzKCksIERldmljZVRlc3RDb25zdGFudHMuVEVTVF9TRUFSQ0hfVklFV19HSVZFX0ZPQ1VTX1NIT1dfSU1FMSk7CisgICAgICAgICAgICAgICAgZ2V0Q2xhc3MoKSwgRGV2aWNlVGVzdENvbnN0YW50cy5URVNUX1NXSVRDSF9QUkVWSU9VU19JTlBVVCk7CisgICAgICAgIGZpbmFsIGxvbmcgc3RhcnRBY3Rpdml0eVRpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgaGVscGVyLmxhdW5jaEFjdGl2aXR5KEVkaXRUZXh0QXBwQ29uc3RhbnRzLlBBQ0tBR0UsIEVkaXRUZXh0QXBwQ29uc3RhbnRzLkNMQVNTLAorICAgICAgICAgICAgICAgIEVkaXRUZXh0QXBwQ29uc3RhbnRzLlVSSSk7CisgICAgICAgIGhlbHBlci5maW5kVWlPYmplY3QoRWRpdFRleHRBcHBDb25zdGFudHMuRURJVF9URVhUX1JFU19OQU1FKS5jbGljaygpOwogCi0gICAgICAgIGhlbHBlci5sYXVuY2hBY3Rpdml0eShEZXZpY2VUZXN0Q29uc3RhbnRzLlBBQ0tBR0UsIERldmljZVRlc3RDb25zdGFudHMuVEVTVF9BQ1RJVklUWV9DTEFTUyk7Ci0gICAgICAgIGhlbHBlci5maW5kVWlPYmplY3QoUi5pZC5zZWFyY2hfdmlldykuY2xpY2soKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGluaXRpYWxJbWUgPSBoZWxwZXIuc2hlbGwoU2hlbGxDb21tYW5kVXRpbHMuZ2V0Q3VycmVudEltZSgpKTsKKyAgICAgICAgaGVscGVyLnNoZWxsKFNoZWxsQ29tbWFuZFV0aWxzLnNldEN1cnJlbnRJbWVTeW5jKEltZTJDb25zdGFudHMuSU1FX0lEKSk7CiAgICAgICAgIHBvbGxpbmdDaGVjaygoKSAtPiBoZWxwZXIucXVlcnlBbGxFdmVudHMoKQotICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3Qoc3RhcnRpbmdGcm9tKGhlbHBlci5pc1N0YXJ0T2ZUZXN0KCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihpc0Zyb20oSW1lMUNvbnN0YW50cy5DTEFTUykuYW5kKGlzVHlwZShTSE9XX1NPRlRfSU5QVVQpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kQW55KCkuaXNQcmVzZW50KCksCi0gICAgICAgICAgICAgICAgVElNRU9VVCwgIkN0c0lucHV0TWV0aG9kMS5zaG93U29mdElucHV0IGlzIGNhbGxlZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihpc05ld2VyVGhhbihzdGFydEFjdGl2aXR5VGltZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAuYW55TWF0Y2goaXNGcm9tKEltZTJDb25zdGFudHMuQ0xBU1MpLmFuZChpc1R5cGUoT05fU1RBUlRfSU5QVVQpKSksCisgICAgICAgICAgICAgICAgVElNRU9VVCwgIkN0c0lucHV0TWV0aG9kMi5vblN0YXJ0SW5wdXQgaXMgY2FsbGVkIik7CisgICAgICAgIGhlbHBlci5zaGVsbChTaGVsbENvbW1hbmRVdGlscy5icm9hZGNhc3RJbnRlbnQoCisgICAgICAgICAgICAgICAgQUNUSU9OX0lNRV9DT01NQU5ELCBJbWUyQ29uc3RhbnRzLlBBQ0tBR0UsCisgICAgICAgICAgICAgICAgIi1lIiwgRVhUUkFfQ09NTUFORCwgQ09NTUFORF9TV0lUQ0hfVE9fUFJFVklPVVNfSU5QVVQpKTsKKyAgICAgICAgcG9sbGluZ0NoZWNrKCgpIC0+IGhlbHBlci5zaGVsbChTaGVsbENvbW1hbmRVdGlscy5nZXRDdXJyZW50SW1lKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKGluaXRpYWxJbWUpLAorICAgICAgICAgICAgICAgIFRJTUVPVVQsIGluaXRpYWxJbWUgKyAiIGlzIGN1cnJlbnQgSU1FIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5wdXRVbmJpbmRzT25JbWVTdG9wcGVkKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGZpbmFsIFRlc3RIZWxwZXIgaGVscGVyID0gbmV3IFRlc3RIZWxwZXIoCisgICAgICAgICAgICAgICAgZ2V0Q2xhc3MoKSwgRGV2aWNlVGVzdENvbnN0YW50cy5URVNUX0lOUFVUX1VOQklORFNfT05fSU1FX1NUT1BQRUQpOworICAgICAgICBmaW5hbCBsb25nIHN0YXJ0QWN0aXZpdHlUaW1lID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CisgICAgICAgIGhlbHBlci5sYXVuY2hBY3Rpdml0eShFZGl0VGV4dEFwcENvbnN0YW50cy5QQUNLQUdFLCBFZGl0VGV4dEFwcENvbnN0YW50cy5DTEFTUywKKyAgICAgICAgICAgICAgICBFZGl0VGV4dEFwcENvbnN0YW50cy5VUkkpOworICAgICAgICBmaW5hbCBVaU9iamVjdDIgZWRpdFRleHQgPSBoZWxwZXIuZmluZFVpT2JqZWN0KEVkaXRUZXh0QXBwQ29uc3RhbnRzLkVESVRfVEVYVF9SRVNfTkFNRSk7CisgICAgICAgIGVkaXRUZXh0LmNsaWNrKCk7CisKICAgICAgICAgcG9sbGluZ0NoZWNrKCgpIC0+IGhlbHBlci5xdWVyeUFsbEV2ZW50cygpCi0gICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChzdGFydGluZ0Zyb20oaGVscGVyLmlzU3RhcnRPZlRlc3QoKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGlzRnJvbShJbWUxQ29uc3RhbnRzLkNMQVNTKS5hbmQoaXNUeXBlKE9OX1NUQVJUX0lOUFVUKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZmluZEFueSgpLmlzUHJlc2VudCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihpc05ld2VyVGhhbihzdGFydEFjdGl2aXR5VGltZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAuYW55TWF0Y2goaXNGcm9tKEltZTFDb25zdGFudHMuQ0xBU1MpLmFuZChpc1R5cGUoT05fU1RBUlRfSU5QVVQpKSksCiAgICAgICAgICAgICAgICAgVElNRU9VVCwgIkN0c0lucHV0TWV0aG9kMS5vblN0YXJ0SW5wdXQgaXMgY2FsbGVkIik7CisgICAgICAgIHBvbGxpbmdDaGVjaygoKSAtPiBoZWxwZXIucXVlcnlBbGxFdmVudHMoKQorICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihpc05ld2VyVGhhbihzdGFydEFjdGl2aXR5VGltZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAuYW55TWF0Y2goaXNGcm9tKEltZTFDb25zdGFudHMuQ0xBU1MpLmFuZChpc1R5cGUoT05fQklORF9JTlBVVCkpKSwKKyAgICAgICAgICAgICAgICBUSU1FT1VULCAiQ3RzSW5wdXRNZXRob2QxLm9uQmluZElucHV0IGlzIGNhbGxlZCIpOworCisgICAgICAgIGZpbmFsIGxvbmcgaW1lRm9yY2VTdG9wVGltZSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworICAgICAgICBoZWxwZXIuc2hlbGwoU2hlbGxDb21tYW5kVXRpbHMudW5pbnN0YWxsUGFja2FnZShJbWUxQ29uc3RhbnRzLlBBQ0tBR0UpKTsKKworICAgICAgICBoZWxwZXIuc2hlbGwoU2hlbGxDb21tYW5kVXRpbHMuc2V0Q3VycmVudEltZVN5bmMoSW1lMkNvbnN0YW50cy5JTUVfSUQpKTsKKyAgICAgICAgZWRpdFRleHQuY2xpY2soKTsKKyAgICAgICAgcG9sbGluZ0NoZWNrKCgpIC0+IGhlbHBlci5xdWVyeUFsbEV2ZW50cygpCisgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGlzTmV3ZXJUaGFuKGltZUZvcmNlU3RvcFRpbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFueU1hdGNoKGlzRnJvbShJbWUyQ29uc3RhbnRzLkNMQVNTKS5hbmQoaXNUeXBlKE9OX1NUQVJUX0lOUFVUKSkpLAorICAgICAgICAgICAgICAgIFRJTUVPVVQsICJDdHNJbnB1dE1ldGhvZDIub25TdGFydElucHV0IGlzIGNhbGxlZCIpOworICAgICAgICBwb2xsaW5nQ2hlY2soKCkgLT4gaGVscGVyLnF1ZXJ5QWxsRXZlbnRzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoaXNOZXdlclRoYW4oaW1lRm9yY2VTdG9wVGltZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAuYW55TWF0Y2goaXNGcm9tKEltZTJDb25zdGFudHMuQ0xBU1MpLmFuZChpc1R5cGUoT05fQklORF9JTlBVVCkpKSwKKyAgICAgICAgICAgICAgICBUSU1FT1VULCAiQ3RzSW5wdXRNZXRob2QyLm9uQmluZElucHV0IGlzIGNhbGxlZCIpOwogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNlYXJjaFZpZXdfc2V0UXVlcnlIaWRlSW1lMSgpIHRocm93cyBUaHJvd2FibGUgeworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnB1dFVuYmluZHNPbkFwcFN0b3BwZWQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgZmluYWwgVGVzdEhlbHBlciBoZWxwZXIgPSBuZXcgVGVzdEhlbHBlcigKLSAgICAgICAgICAgICAgICBnZXRDbGFzcygpLCBEZXZpY2VUZXN0Q29uc3RhbnRzLlRFU1RfU0VBUkNIX1ZJRVdfU0VUX1FVRVJZX0hJREVfSU1FMSk7Ci0KLSAgICAgICAgZmluYWwgQWN0aXZpdHkgYWN0aXZpdHkgPSBoZWxwZXIubGF1bmNoQWN0aXZpdHlTeW5jKAotICAgICAgICAgICAgICAgIERldmljZVRlc3RDb25zdGFudHMuUEFDS0FHRSwgRGV2aWNlVGVzdENvbnN0YW50cy5URVNUX0FDVElWSVRZX0NMQVNTKTsKLSAgICAgICAgZmluYWwgU2VhcmNoVmlldyBzZWFyY2hWaWV3ID0gKFNlYXJjaFZpZXcpIGFjdGl2aXR5LmZpbmRWaWV3QnlJZChSLmlkLnNlYXJjaF92aWV3KTsKLSAgICAgICAgaGVscGVyLmZpbmRVaU9iamVjdChSLmlkLnNlYXJjaF92aWV3KS5jbGljaygpOwotICAgICAgICAvLyB0ZXN0IFNlYXJjaFZpZXcub25TdWJtaXRRdWVyeSgpIGNsb3NlcyBJTUUuIEFsdGVybmF0aXZlbHksIG9uQ2xvc2VDbGlja2VkKCkgY2xvc2VzIElNRS4KLSAgICAgICAgLy8gc3VibWl0cyB0aGUgcXVlcnksIHNob3VsZCBkaXNtaXNzIHRoZSBpbnB1dE1ldGhvZC4KLSAgICAgICAgYWN0aXZpdHkucnVuT25VaVRocmVhZCgoKSAtPiBzZWFyY2hWaWV3LnNldFF1ZXJ5KCJ0ZXN0IiwgdHJ1ZSAvKiBzdWJtaXQgKi8pKTsKKyAgICAgICAgICAgICAgICBnZXRDbGFzcygpLCBEZXZpY2VUZXN0Q29uc3RhbnRzLlRFU1RfSU5QVVRfVU5CSU5EU19PTl9BUFBfU1RPUFBFRCk7CisgICAgICAgIGZpbmFsIGxvbmcgc3RhcnRBY3Rpdml0eVRpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgaGVscGVyLmxhdW5jaEFjdGl2aXR5KEVkaXRUZXh0QXBwQ29uc3RhbnRzLlBBQ0tBR0UsIEVkaXRUZXh0QXBwQ29uc3RhbnRzLkNMQVNTLAorICAgICAgICAgICAgICAgIEVkaXRUZXh0QXBwQ29uc3RhbnRzLlVSSSk7CisgICAgICAgIGhlbHBlci5maW5kVWlPYmplY3QoRWRpdFRleHRBcHBDb25zdGFudHMuRURJVF9URVhUX1JFU19OQU1FKS5jbGljaygpOwogCiAgICAgICAgIHBvbGxpbmdDaGVjaygoKSAtPiBoZWxwZXIucXVlcnlBbGxFdmVudHMoKQotICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3Qoc3RhcnRpbmdGcm9tKGhlbHBlci5pc1N0YXJ0T2ZUZXN0KCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihpc0Zyb20oSW1lMUNvbnN0YW50cy5DTEFTUykuYW5kKGlzVHlwZShPTl9GSU5JU0hfSU5QVVQpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kQW55KCkuaXNQcmVzZW50KCksCi0gICAgICAgICAgICAgICAgVElNRU9VVCwgIkN0c0lucHV0TWV0aG9kMS5vbkZpbmlzaElucHV0IGlzIGNhbGxlZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihpc05ld2VyVGhhbihzdGFydEFjdGl2aXR5VGltZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAuYW55TWF0Y2goaXNGcm9tKEltZTFDb25zdGFudHMuQ0xBU1MpLmFuZChpc1R5cGUoT05fU1RBUlRfSU5QVVQpKSksCisgICAgICAgICAgICAgICAgVElNRU9VVCwgIkN0c0lucHV0TWV0aG9kMS5vblN0YXJ0SW5wdXQgaXMgY2FsbGVkIik7CiAgICAgICAgIHBvbGxpbmdDaGVjaygoKSAtPiBoZWxwZXIucXVlcnlBbGxFdmVudHMoKQotICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3Qoc3RhcnRpbmdGcm9tKGhlbHBlci5pc1N0YXJ0T2ZUZXN0KCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihpc0Zyb20oSW1lMUNvbnN0YW50cy5DTEFTUykuYW5kKGlzVHlwZShISURFX1NPRlRfSU5QVVQpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kQW55KCkuaXNQcmVzZW50KCksCi0gICAgICAgICAgICAgICAgVElNRU9VVCwgIkN0c0lucHV0TWV0aG9kMS5oaWRlU29mdElucHV0IGlzIGNhbGxlZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihpc05ld2VyVGhhbihzdGFydEFjdGl2aXR5VGltZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAuYW55TWF0Y2goaXNGcm9tKEltZTFDb25zdGFudHMuQ0xBU1MpLmFuZChpc1R5cGUoT05fQklORF9JTlBVVCkpKSwKKyAgICAgICAgICAgICAgICBUSU1FT1VULCAiQ3RzSW5wdXRNZXRob2QxLm9uQmluZElucHV0IGlzIGNhbGxlZCIpOworCisgICAgICAgIGhlbHBlci5zaGVsbChTaGVsbENvbW1hbmRVdGlscy51bmluc3RhbGxQYWNrYWdlKEVkaXRUZXh0QXBwQ29uc3RhbnRzLlBBQ0tBR0UpKTsKKworICAgICAgICBwb2xsaW5nQ2hlY2soKCkgLT4gaGVscGVyLnF1ZXJ5QWxsRXZlbnRzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoaXNOZXdlclRoYW4oc3RhcnRBY3Rpdml0eVRpbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFueU1hdGNoKGlzRnJvbShJbWUxQ29uc3RhbnRzLkNMQVNTKS5hbmQoaXNUeXBlKE9OX1VOQklORF9JTlBVVCkpKSwKKyAgICAgICAgICAgICAgICBUSU1FT1VULCAiQ3RzSW5wdXRNZXRob2QxLm9uVW5CaW5kSW5wdXQgaXMgY2FsbGVkIik7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2lucHV0bWV0aG9kc2VydmljZS9kZXZpY2VzaWRlL2RldmljZXRlc3Qvc3JjL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL2N0cy9kZXZpY2V0ZXN0L0lucHV0TWV0aG9kU2VydmljZVRlc3RBY3Rpdml0eS5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9pbnB1dG1ldGhvZHNlcnZpY2UvZGV2aWNlc2lkZS9kZXZpY2V0ZXN0L3NyYy9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9jdHMvZGV2aWNldGVzdC9JbnB1dE1ldGhvZFNlcnZpY2VUZXN0QWN0aXZpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjEzYzI2Ni4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL2lucHV0bWV0aG9kc2VydmljZS9kZXZpY2VzaWRlL2RldmljZXRlc3Qvc3JjL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL2N0cy9kZXZpY2V0ZXN0L0lucHV0TWV0aG9kU2VydmljZVRlc3RBY3Rpdml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmlucHV0bWV0aG9kc2VydmljZS5jdHMuZGV2aWNldGVzdDsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgSW5wdXRNZXRob2RTZXJ2aWNlVGVzdEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgewotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKGZpbmFsIEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLSAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQuYWN0aXZpdHlfaW5wdXRtZXRob2RfdGVzdCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9pbnB1dG1ldGhvZHNlcnZpY2UvZGV2aWNlc2lkZS9kZXZpY2V0ZXN0L3NyYy9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9jdHMvZGV2aWNldGVzdC9Nb3JlQ29sbGVjdG9ycy5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9pbnB1dG1ldGhvZHNlcnZpY2UvZGV2aWNlc2lkZS9kZXZpY2V0ZXN0L3NyYy9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9jdHMvZGV2aWNldGVzdC9Nb3JlQ29sbGVjdG9ycy5qYXZhCmluZGV4IGE5MzVmMGIuLjU5NjkyYTYgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvaW5wdXRtZXRob2RzZXJ2aWNlL2RldmljZXNpZGUvZGV2aWNldGVzdC9zcmMvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvY3RzL2RldmljZXRlc3QvTW9yZUNvbGxlY3RvcnMuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2lucHV0bWV0aG9kc2VydmljZS9kZXZpY2VzaWRlL2RldmljZXRlc3Qvc3JjL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL2N0cy9kZXZpY2V0ZXN0L01vcmVDb2xsZWN0b3JzLmphdmEKQEAgLTEsMyArMSwxOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKIHBhY2thZ2UgYW5kcm9pZC5pbnB1dG1ldGhvZHNlcnZpY2UuY3RzLmRldmljZXRlc3Q7CiAKIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQmlDb25zdW1lcjsKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvaW5wdXRtZXRob2RzZXJ2aWNlL2RldmljZXNpZGUvZGV2aWNldGVzdC9zcmMvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvY3RzL2RldmljZXRlc3QvU2VxdWVuY2VNYXRjaGVyLmphdmEgYi9ob3N0c2lkZXRlc3RzL2lucHV0bWV0aG9kc2VydmljZS9kZXZpY2VzaWRlL2RldmljZXRlc3Qvc3JjL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL2N0cy9kZXZpY2V0ZXN0L1NlcXVlbmNlTWF0Y2hlci5qYXZhCmluZGV4IDM2YjcxMWUuLjk5NmRhZDkgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvaW5wdXRtZXRob2RzZXJ2aWNlL2RldmljZXNpZGUvZGV2aWNldGVzdC9zcmMvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvY3RzL2RldmljZXRlc3QvU2VxdWVuY2VNYXRjaGVyLmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9pbnB1dG1ldGhvZHNlcnZpY2UvZGV2aWNlc2lkZS9kZXZpY2V0ZXN0L3NyYy9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9jdHMvZGV2aWNldGVzdC9TZXF1ZW5jZU1hdGNoZXIuamF2YQpAQCAtMSwzICsxLDE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwogcGFja2FnZSBhbmRyb2lkLmlucHV0bWV0aG9kc2VydmljZS5jdHMuZGV2aWNldGVzdDsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2lucHV0bWV0aG9kc2VydmljZS9kZXZpY2VzaWRlL2RldmljZXRlc3Qvc3JjL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL2N0cy9kZXZpY2V0ZXN0L1Rlc3RIZWxwZXIuamF2YSBiL2hvc3RzaWRldGVzdHMvaW5wdXRtZXRob2RzZXJ2aWNlL2RldmljZXNpZGUvZGV2aWNldGVzdC9zcmMvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvY3RzL2RldmljZXRlc3QvVGVzdEhlbHBlci5qYXZhCmluZGV4IDdmNmJhMmUuLjIwZGY1M2EgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvaW5wdXRtZXRob2RzZXJ2aWNlL2RldmljZXNpZGUvZGV2aWNldGVzdC9zcmMvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvY3RzL2RldmljZXRlc3QvVGVzdEhlbHBlci5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvaW5wdXRtZXRob2RzZXJ2aWNlL2RldmljZXNpZGUvZGV2aWNldGVzdC9zcmMvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvY3RzL2RldmljZXRlc3QvVGVzdEhlbHBlci5qYXZhCkBAIC0yMCwyNSArMjAsMjIgQEAKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5pbnB1dG1ldGhvZHNlcnZpY2UuY3RzLkRldmljZUV2ZW50LmlzVHlwZTsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5pbnB1dG1ldGhvZHNlcnZpY2UuY3RzLmNvbW1vbi5EZXZpY2VFdmVudENvbnN0YW50cy5EZXZpY2VFdmVudFR5cGUuVEVTVF9TVEFSVDsKIAotaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CiBpbXBvcnQgYW5kcm9pZC5pbnB1dG1ldGhvZHNlcnZpY2UuY3RzLkRldmljZUV2ZW50OwogaW1wb3J0IGFuZHJvaWQuaW5wdXRtZXRob2RzZXJ2aWNlLmN0cy5jb21tb24uRGV2aWNlRXZlbnRDb25zdGFudHMuRGV2aWNlRXZlbnRUeXBlOwogaW1wb3J0IGFuZHJvaWQuaW5wdXRtZXRob2RzZXJ2aWNlLmN0cy5jb21tb24uRXZlbnRQcm92aWRlckNvbnN0YW50cy5FdmVudFRhYmxlQ29uc3RhbnRzOwogaW1wb3J0IGFuZHJvaWQuaW5wdXRtZXRob2RzZXJ2aWNlLmN0cy5jb21tb24udGVzdC5UZXN0SW5mbzsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uSWRSZXM7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CiBpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QudWlhdXRvbWF0b3IuQnk7CiBpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QudWlhdXRvbWF0b3IuVWlEZXZpY2U7CiBpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QudWlhdXRvbWF0b3IuVWlPYmplY3QyOwogaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLlVudGlsOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKKwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTsKQEAgLTU3LDcgKzU0LDYgQEAKICAgICBwcml2YXRlIGZpbmFsIENvbnRlbnRSZXNvbHZlciBtUmVzb2x2ZXI7CiAgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1UYXJnZXRDb250ZXh0OwogICAgIHByaXZhdGUgZmluYWwgVWlEZXZpY2UgbVVpRGV2aWNlOwotICAgIHByaXZhdGUgZmluYWwgSW5zdHJ1bWVudGF0aW9uIG1JbnN0cnVtZW50YXRpb247CiAKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3QgYSBoZWxwZXIgb2JqZWN0IG9mIHNwZWNpZmllZCB0ZXN0IG1ldGhvZC4KQEAgLTcwLDggKzY2LDcgQEAKICAgICAgICAgbVRlc3RJbmZvID0gbmV3IFRlc3RJbmZvKHRlc3RDb250ZXh0LmdldFBhY2thZ2VOYW1lKCksIHRlc3RDbGFzcy5nZXROYW1lKCksIHRlc3RNZXRob2QpOwogICAgICAgICBtUmVzb2x2ZXIgPSB0ZXN0Q29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKICAgICAgICAgbVRhcmdldENvbnRleHQgPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRUYXJnZXRDb250ZXh0KCk7Ci0gICAgICAgIG1JbnN0cnVtZW50YXRpb24gPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKTsKLSAgICAgICAgbVVpRGV2aWNlID0gVWlEZXZpY2UuZ2V0SW5zdGFuY2UobUluc3RydW1lbnRhdGlvbik7CisgICAgICAgIG1VaURldmljZSA9IFVpRGV2aWNlLmdldEluc3RhbmNlKEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTg4LDEwICs4MywxNCBAQAogICAgICAqIExhdW5jaGluZyBhbiBBY3Rpdml0eSBmb3IgdGVzdCwgYW5kIHdhaXQgZm9yIGNvbXBsZXRpb25zIG9mIGxhdW5jaC4KICAgICAgKiBAcGFyYW0gcGFja2FnZU5hbWUgYWN0aXZpdHkncyBhcHAgcGFja2FnZSBuYW1lLgogICAgICAqIEBwYXJhbSBjbGFzc05hbWUgYWN0aXZpdHkncyBjbGFzcyBuYW1lLgorICAgICAqIEBwYXJhbSB1cmkgdXJpIHRvIGJlIGhhbmRsZWQuCiAgICAgICovCi0gICAgdm9pZCBsYXVuY2hBY3Rpdml0eShmaW5hbCBTdHJpbmcgcGFja2FnZU5hbWUsIGZpbmFsIFN0cmluZyBjbGFzc05hbWUpIHsKKyAgICB2b2lkIGxhdW5jaEFjdGl2aXR5KGZpbmFsIFN0cmluZyBwYWNrYWdlTmFtZSwgZmluYWwgU3RyaW5nIGNsYXNzTmFtZSwgZmluYWwgU3RyaW5nIHVyaSkgewogICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpCi0gICAgICAgICAgICAgICAgLnNldEFjdGlvbihJbnRlbnQuQUNUSU9OX01BSU4pCisgICAgICAgICAgICAgICAgLnNldEFjdGlvbihJbnRlbnQuQUNUSU9OX1ZJRVcpCisgICAgICAgICAgICAgICAgLmFkZENhdGVnb3J5KEludGVudC5DQVRFR09SWV9CUk9XU0FCTEUpCisgICAgICAgICAgICAgICAgLmFkZENhdGVnb3J5KEludGVudC5DQVRFR09SWV9ERUZBVUxUKQorICAgICAgICAgICAgICAgIC5zZXREYXRhKFVyaS5wYXJzZSh1cmkpKQogICAgICAgICAgICAgICAgIC5zZXRDbGFzc05hbWUocGFja2FnZU5hbWUsIGNsYXNzTmFtZSkKICAgICAgICAgICAgICAgICAuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spCiAgICAgICAgICAgICAgICAgLmFkZEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX0NMRUFSX1RBU0spOwpAQCAtMTAxLDMxICsxMDAsMTQgQEAKIAogICAgIC8qKgogICAgICAqIEZpbmQgYW4gVUkgZWxlbWVudCBmcm9tIHJlc291cmNlIElELgotICAgICAqIEBwYXJhbSByZXNJZCBpZCBvZiBmaW5kaW5nIFVJIGVsZW1lbnQuCisgICAgICogQHBhcmFtIHJlc291cmNlTmFtZSBuYW1lIG9mIGZpbmRpbmcgVUkgZWxlbWVudC4KICAgICAgKiBAcmV0dXJuIHtAbGluayBVaU9iamVjdDJ9IG9mIGZvdW5kIFVJIGVsZW1lbnQuCiAgICAgICovCi0gICAgVWlPYmplY3QyIGZpbmRVaU9iamVjdChASWRSZXMgaW50IHJlc0lkKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyByZXNvdXJjZU5hbWUgPSBtVGFyZ2V0Q29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZU5hbWUocmVzSWQpOworICAgIFVpT2JqZWN0MiBmaW5kVWlPYmplY3QoU3RyaW5nIHJlc291cmNlTmFtZSkgewogICAgICAgICByZXR1cm4gbVVpRGV2aWNlLmZpbmRPYmplY3QoQnkucmVzKHJlc291cmNlTmFtZSkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIExhdW5jaCB0ZXN0IGFjdGl2aXR5IHN5bmNocm9ub3VzbHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFja2FnZU5hbWUgYWN0aXZpdHkncyBhcHAgcGFja2FnZSBuYW1lLgotICAgICAqIEBwYXJhbSBjbGFzc05hbWUgICBhY3Rpdml0eSdzIGNsYXNzIG5hbWUuCi0gICAgICogQHJldHVybiBpbnN0YW5jZSBvZiBBY3Rpdml0eQotICAgICAqLwotICAgIEFjdGl2aXR5IGxhdW5jaEFjdGl2aXR5U3luYyhmaW5hbCBTdHJpbmcgcGFja2FnZU5hbWUsIGZpbmFsIFN0cmluZyBjbGFzc05hbWUpIHsKLSAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoKQotICAgICAgICAgICAgICAgIC5zZXRBY3Rpb24oSW50ZW50LkFDVElPTl9NQUlOKQotICAgICAgICAgICAgICAgIC5zZXRDbGFzc05hbWUocGFja2FnZU5hbWUsIGNsYXNzTmFtZSkKLSAgICAgICAgICAgICAgICAuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spCi0gICAgICAgICAgICAgICAgLmFkZEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX0NMRUFSX1RBU0spOwotICAgICAgICByZXR1cm4gbUluc3RydW1lbnRhdGlvbi5zdGFydEFjdGl2aXR5U3luYyhpbnRlbnQpOwotICAgIH0KLQotICAgIC8qKgogICAgICAqIFJldHVybiBhbGwgZGV2aWNlIGV2ZW50cyBhcyB7QGxpbmsgU3RyZWFtfQogICAgICAqIEByZXR1cm4ge0BsaW5rIFN0cmVhbTxEZXZpY2VFdmVudD59IG9mIGFsbCBkZXZpY2UgZXZlbnRzLgogICAgICAqLwpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9pbnB1dG1ldGhvZHNlcnZpY2UvZGV2aWNlc2lkZS9lZGl0dGV4dGFwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9pbnB1dG1ldGhvZHNlcnZpY2UvZGV2aWNlc2lkZS9lZGl0dGV4dGFwcC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZmRiMDgKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2lucHV0bWV0aG9kc2VydmljZS9kZXZpY2VzaWRlL2VkaXR0ZXh0YXBwL0FuZHJvaWQubWsKQEAgLTAsMCArMSw0MCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworIyBEb24ndCBpbmNsdWRlIHRoaXMgcGFja2FnZSBpbiBhbnkgdGFyZ2V0CitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworIyBXaGVuIGJ1aWx0LCBleHBsaWNpdGx5IHB1dCBpdCBpbiB0aGUgZGF0YSBwYXJ0aXRpb24uCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQorCitMT0NBTF9ERVhfUFJFT1BUIDo9IGZhbHNlCisKK0xPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQorTE9DQUxfSkFWQV9SRVNPVVJDRV9ESVIgOj0gcmVzCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAorICAgIEN0c0lucHV0TWV0aG9kU2VydmljZUNvbW1vbgorCisjIHRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0CitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cyBjdHNfaW5zdGFudAorCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gRWRpdFRleHRBcHAKKworTE9DQUxfU0RLX1ZFUlNJT04gOj0gdGVzdF9jdXJyZW50CisKK2luY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9pbnB1dG1ldGhvZHNlcnZpY2UvZGV2aWNlc2lkZS9lZGl0dGV4dGFwcC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9pbnB1dG1ldGhvZHNlcnZpY2UvZGV2aWNlc2lkZS9lZGl0dGV4dGFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmZhZWJiOWYKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2lucHV0bWV0aG9kc2VydmljZS9kZXZpY2VzaWRlL2VkaXR0ZXh0YXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSw0NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iYW5kcm9pZC5pbnB1dG1ldGhvZHNlcnZpY2UuY3RzLmVkaXR0ZXh0YXBwIiBhbmRyb2lkOnRhcmdldFNhbmRib3hWZXJzaW9uPSIyIj4KKworICAgIDx1c2VzLXNkayBhbmRyb2lkOm1pblNka1ZlcnNpb249IjI4IiBhbmRyb2lkOnRhcmdldFNka1ZlcnNpb249IjI4IiAvPgorCisgICAgPGFwcGxpY2F0aW9uCisgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYXBwX25hbWUiPgorICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iLk1haW5BY3Rpdml0eSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2FwcF9uYW1lIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uVklFVyIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5ERUZBVUxUIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkJST1dTQUJMRSIgLz4KKyAgICAgICAgICAgICAgICA8ZGF0YSBhbmRyb2lkOnNjaGVtZT0iaHR0cHMiIC8+CisgICAgICAgICAgICAgICAgPGRhdGEgYW5kcm9pZDpob3N0PSJleGFtcGxlLmNvbSIgLz4KKyAgICAgICAgICAgICAgICA8ZGF0YSBhbmRyb2lkOnBhdGg9Ii9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9jdHMvZWRpdHRleHRhcHAiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgPC9hcHBsaWNhdGlvbj4KKworICAgIDxpbnN0cnVtZW50YXRpb24KKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5pbnB1dG1ldGhvZHNlcnZpY2UuY3RzLmVkaXR0ZXh0YXBwIiAvPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvaW5wdXRtZXRob2RzZXJ2aWNlL2RldmljZXNpZGUvZWRpdHRleHRhcHAvcmVzL2xheW91dC9hY3Rpdml0eV9pbnB1dG1ldGhvZF90ZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvaW5wdXRtZXRob2RzZXJ2aWNlL2RldmljZXNpZGUvZWRpdHRleHRhcHAvcmVzL2xheW91dC9hY3Rpdml0eV9pbnB1dG1ldGhvZF90ZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzcwOTFhCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9pbnB1dG1ldGhvZHNlcnZpY2UvZGV2aWNlc2lkZS9lZGl0dGV4dGFwcC9yZXMvbGF5b3V0L2FjdGl2aXR5X2lucHV0bWV0aG9kX3Rlc3QueG1sCkBAIC0wLDAgKzEsMzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxSZWxhdGl2ZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgIGFuZHJvaWQ6cGFkZGluZz0iMTBweCI+CisKKyAgICA8RWRpdFRleHQKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9lZGl0X3RleHRfZW50cnkiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGFuZHJvaWQ6ZHJhd2FibGUvZWRpdGJveF9iYWNrZ3JvdW5kIj4KKyAgICAgICAgPHJlcXVlc3RGb2N1cyAvPgorICAgIDwvRWRpdFRleHQ+CisKKzwvUmVsYXRpdmVMYXlvdXQ+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2lucHV0bWV0aG9kc2VydmljZS9kZXZpY2VzaWRlL2VkaXR0ZXh0YXBwL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi9ob3N0c2lkZXRlc3RzL2lucHV0bWV0aG9kc2VydmljZS9kZXZpY2VzaWRlL2VkaXR0ZXh0YXBwL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkxOTAxZAotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvaW5wdXRtZXRob2RzZXJ2aWNlL2RldmljZXNpZGUvZWRpdHRleHRhcHAvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cmVzb3VyY2VzPgorICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiIHRyYW5zbGF0YWJsZT0iZmFsc2UiPkVkaXRUZXh0QXBwPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2lucHV0bWV0aG9kc2VydmljZS9kZXZpY2VzaWRlL2VkaXR0ZXh0YXBwL3NyYy9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9jdHMvZWRpdHRleHRhcHAvTWFpbkFjdGl2aXR5LmphdmEgYi9ob3N0c2lkZXRlc3RzL2lucHV0bWV0aG9kc2VydmljZS9kZXZpY2VzaWRlL2VkaXR0ZXh0YXBwL3NyYy9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9jdHMvZWRpdHRleHRhcHAvTWFpbkFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZlOWUwYQotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvaW5wdXRtZXRob2RzZXJ2aWNlL2RldmljZXNpZGUvZWRpdHRleHRhcHAvc3JjL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL2N0cy9lZGl0dGV4dGFwcC9NYWluQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworcGFja2FnZSBhbmRyb2lkLmlucHV0bWV0aG9kc2VydmljZS5jdHMuZWRpdHRleHRhcHA7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5FZGl0VGV4dDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uRm9jdXNDaGFuZ2VMaXN0ZW5lcjsKKworcHVibGljIGNsYXNzIE1haW5BY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShmaW5hbCBCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmFjdGl2aXR5X2lucHV0bWV0aG9kX3Rlc3QpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2lucHV0bWV0aG9kc2VydmljZS9kZXZpY2VzaWRlL2ltZTEvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvaW5wdXRtZXRob2RzZXJ2aWNlL2RldmljZXNpZGUvaW1lMS9BbmRyb2lkLm1rCmluZGV4IDZhNzQxMjQuLjg1MGI4OWYgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvaW5wdXRtZXRob2RzZXJ2aWNlL2RldmljZXNpZGUvaW1lMS9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvaW5wdXRtZXRob2RzZXJ2aWNlL2RldmljZXNpZGUvaW1lMS9BbmRyb2lkLm1rCkBAIC0zMiwxMCArMzIsMTAgQEAKICAgICBDdHNJbnB1dE1ldGhvZFNlcnZpY2VMaWIKIAogIyB0YWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzIGN0c19pbnN0YW50CiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNJbnB1dE1ldGhvZDEKIAotTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorTE9DQUxfU0RLX1ZFUlNJT04gOj0gdGVzdF9jdXJyZW50CiAKIGluY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9pbnB1dG1ldGhvZHNlcnZpY2UvZGV2aWNlc2lkZS9pbWUyL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2lucHV0bWV0aG9kc2VydmljZS9kZXZpY2VzaWRlL2ltZTIvQW5kcm9pZC5tawppbmRleCBhMzcxYzgzLi5mY2QxNDZjIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2lucHV0bWV0aG9kc2VydmljZS9kZXZpY2VzaWRlL2ltZTIvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL2lucHV0bWV0aG9kc2VydmljZS9kZXZpY2VzaWRlL2ltZTIvQW5kcm9pZC5tawpAQCAtMzIsMTAgKzMyLDEwIEBACiAgICAgQ3RzSW5wdXRNZXRob2RTZXJ2aWNlTGliCiAKICMgdGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cyBjdHNfaW5zdGFudAogCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzSW5wdXRNZXRob2QyCiAKLUxPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKK0xPQ0FMX1NES19WRVJTSU9OIDo9IHRlc3RfY3VycmVudAogCiBpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvaW5wdXRtZXRob2RzZXJ2aWNlL2RldmljZXNpZGUvbGliL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2lucHV0bWV0aG9kc2VydmljZS9kZXZpY2VzaWRlL2xpYi9BbmRyb2lkLm1rCmluZGV4IDlmZGNlYzYuLjlhOTliZGMgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvaW5wdXRtZXRob2RzZXJ2aWNlL2RldmljZXNpZGUvbGliL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9pbnB1dG1ldGhvZHNlcnZpY2UvZGV2aWNlc2lkZS9saWIvQW5kcm9pZC5tawpAQCAtMTgsOCArMTgsNyBAQAogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiBMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAotICAgIGFuZHJvaWQtc3VwcG9ydC1hbm5vdGF0aW9ucyBcCi0gICAganNvbiBcCisgICAgYW5kcm9pZHguYW5ub3RhdGlvbl9hbm5vdGF0aW9uIFwKICAgICBDdHNJbnB1dE1ldGhvZFNlcnZpY2VDb21tb24KIAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKQEAgLTI5LDYgKzI4LDYgQEAKIAogTE9DQUxfTU9EVUxFIDo9IEN0c0lucHV0TWV0aG9kU2VydmljZUxpYgogCi1MT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CitMT0NBTF9TREtfVkVSU0lPTiA6PSB0ZXN0X2N1cnJlbnQKIAogaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19KQVZBX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2lucHV0bWV0aG9kc2VydmljZS9kZXZpY2VzaWRlL2xpYi9zcmMvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvY3RzL0RldmljZUV2ZW50LmphdmEgYi9ob3N0c2lkZXRlc3RzL2lucHV0bWV0aG9kc2VydmljZS9kZXZpY2VzaWRlL2xpYi9zcmMvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvY3RzL0RldmljZUV2ZW50LmphdmEKaW5kZXggZmY0MTJlZi4uYTI1Y2RmZCAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9pbnB1dG1ldGhvZHNlcnZpY2UvZGV2aWNlc2lkZS9saWIvc3JjL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL2N0cy9EZXZpY2VFdmVudC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvaW5wdXRtZXRob2RzZXJ2aWNlL2RldmljZXNpZGUvbGliL3NyYy9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9jdHMvRGV2aWNlRXZlbnQuamF2YQpAQCAtMTcsMzcgKzE3LDI2IEBACiBwYWNrYWdlIGFuZHJvaWQuaW5wdXRtZXRob2RzZXJ2aWNlLmN0czsKIAogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmlucHV0bWV0aG9kc2VydmljZS5jdHMuY29tbW9uLkRldmljZUV2ZW50Q29uc3RhbnRzLkFDVElPTl9ERVZJQ0VfRVZFTlQ7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQuaW5wdXRtZXRob2RzZXJ2aWNlLmN0cy5jb21tb24uRGV2aWNlRXZlbnRDb25zdGFudHMuRVhUUkFfRVZFTlRfUEFSQU1TOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmlucHV0bWV0aG9kc2VydmljZS5jdHMuY29tbW9uLkRldmljZUV2ZW50Q29uc3RhbnRzLkVYVFJBX0VWRU5UX1RJTUU7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuaW5wdXRtZXRob2RzZXJ2aWNlLmN0cy5jb21tb24uRGV2aWNlRXZlbnRDb25zdGFudHMuRVhUUkFfRVZFTlRfVFlQRTsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5pbnB1dG1ldGhvZHNlcnZpY2UuY3RzLmNvbW1vbi5EZXZpY2VFdmVudENvbnN0YW50cy5FWFRSQV9FVkVOVF9TRU5ERVI7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuaW5wdXRtZXRob2RzZXJ2aWNlLmN0cy5jb21tb24uRGV2aWNlRXZlbnRDb25zdGFudHMuUkVDRUlWRVJfQ0xBU1M7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuaW5wdXRtZXRob2RzZXJ2aWNlLmN0cy5jb21tb24uRGV2aWNlRXZlbnRDb25zdGFudHMuUkVDRUlWRVJfUEFDS0FHRTsKIAotCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKIGltcG9ydCBhbmRyb2lkLmlucHV0bWV0aG9kc2VydmljZS5jdHMuY29tbW9uLkRldmljZUV2ZW50Q29uc3RhbnRzOwogaW1wb3J0IGFuZHJvaWQuaW5wdXRtZXRob2RzZXJ2aWNlLmN0cy5jb21tb24uRGV2aWNlRXZlbnRDb25zdGFudHMuRGV2aWNlRXZlbnRUeXBlOwotaW1wb3J0IGFuZHJvaWQuaW5wdXRtZXRob2RzZXJ2aWNlLmN0cy5jb21tb24uRGV2aWNlRXZlbnRDb25zdGFudHMuRGV2aWNlRXZlbnRUeXBlUGFyYW07CiBpbXBvcnQgYW5kcm9pZC5pbnB1dG1ldGhvZHNlcnZpY2UuY3RzLmNvbW1vbi5FdmVudFByb3ZpZGVyQ29uc3RhbnRzLkV2ZW50VGFibGVDb25zdGFudHM7CiBpbXBvcnQgYW5kcm9pZC5pbnB1dG1ldGhvZHNlcnZpY2UuY3RzLmNvbW1vbi50ZXN0LlRlc3RJbmZvOwogaW1wb3J0IGFuZHJvaWQuaW5wdXRtZXRob2RzZXJ2aWNlLmN0cy5kYi5FbnRpdHk7CiBpbXBvcnQgYW5kcm9pZC5pbnB1dG1ldGhvZHNlcnZpY2UuY3RzLmRiLkZpZWxkOwogaW1wb3J0IGFuZHJvaWQuaW5wdXRtZXRob2RzZXJ2aWNlLmN0cy5kYi5UYWJsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uTnVsbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk5vbk51bGw7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmpzb24uc3RyZWFtLkpzb25SZWFkZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuanNvbi5zdHJlYW0uSnNvbldyaXRlcjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTsKIGltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKIApAQCAtNjIsODUgKzUxLDIxIEBACiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFRhYmxlPERldmljZUV2ZW50PiBUQUJMRSA9IG5ldyBEZXZpY2VFdmVudFRhYmxlKEV2ZW50VGFibGVDb25zdGFudHMuTkFNRSk7CiAKLSAgICBwdWJsaWMgc3RhdGljIEludGVudEJ1aWxkZXIgYnVpbGRlcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBJbnRlbnRCdWlsZGVyKCk7Ci0gICAgfQotCiAgICAgLyoqCi0gICAgICogQnVpbGRlciB0byBjcmVhdGUgYW4gaW50ZW50IHRvIHNlbmQgYSBkZXZpY2UgZXZlbnQuCi0gICAgICogVGhlIGJ1aWx0IGludGVudCB0aGF0IGhhcyBldmVudCB7QGNvZGUgc2VuZGVyfSwge0Bjb2RlIHR5cGV9LCB7QGNvZGUgcGFyYW1zU3RyaW5nfSwgdGltZSBmcm9tCi0gICAgICoge0BsaW5rIFN5c3RlbUNsb2NrI3VwdGltZU1pbGxpcygpfSwgYW5kIHRhcmdldCBjb21wb25lbnQgb2YgZXZlbnQgcmVjZWl2ZXIuCi0gICAgICoKKyAgICAgKiBDcmVhdGUgYW4gaW50ZW50IHRvIHNlbmQgYSBkZXZpY2UgZXZlbnQuCisgICAgICogQHBhcmFtIHNlbmRlciBhbiBldmVudCBzZW5kZXIuCisgICAgICogQHBhcmFtIHR5cGUgYW4gZXZlbnQgdHlwZSBkZWZpbmVkIGF0IHtAbGluayBEZXZpY2VFdmVudFR5cGV9LgorICAgICAqIEByZXR1cm4gYW4gaW50ZW50IHRoYXQgaGFzIGV2ZW50IHtAY29kZSBzZW5kZXJ9LCB7QGNvZGUgdHlwZX0sIHRpbWUgZnJvbQorICAgICAqICAgICAgICAge0BsaW5rIFN5c3RlbUNsb2NrI3VwdGltZU1pbGxpcygpfSwgYW5kIHRhcmdldCBjb21wb25lbnQgb2YgZXZlbnQgcmVjZWl2ZXIuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBJbnRlbnRCdWlsZGVyIHsKLSAgICAgICAgU3RyaW5nIG1TZW5kZXI7Ci0gICAgICAgIERldmljZUV2ZW50VHlwZSBtVHlwZTsKLSAgICAgICAgSnNvbldyaXRlciBtSnNvbldyaXRlcjsKLSAgICAgICAgU3RyaW5nV3JpdGVyIG1TdHJpbmdXcml0ZXI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEBwYXJhbSB0eXBlIGFuIGV2ZW50IHR5cGUgZGVmaW5lZCBhdCB7QGxpbmsgRGV2aWNlRXZlbnRUeXBlfS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBJbnRlbnRCdWlsZGVyIHNldFR5cGUoRGV2aWNlRXZlbnRUeXBlIHR5cGUpIHsKLSAgICAgICAgICAgIG1UeXBlID0gdHlwZTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEBwYXJhbSBzZW5kZXIgYW4gZXZlbnQgc2VuZGVyLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2V0U2VuZGVyKFN0cmluZyBzZW5kZXIpIHsKLSAgICAgICAgICAgIG1TZW5kZXIgPSBzZW5kZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSW50ZW50QnVpbGRlciB3aXRoKERldmljZUV2ZW50VHlwZVBhcmFtIGV2ZW50UGFyYW0sIGJvb2xlYW4gdmFsdWUpIHsKLSAgICAgICAgICAgIGFwcGVuZFRvSnNvbihldmVudFBhcmFtLCB2YWx1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBJbnRlbnQgYnVpbGQoKSB7Ci0gICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpCi0gICAgICAgICAgICAgICAgICAgIC5zZXRBY3Rpb24oQUNUSU9OX0RFVklDRV9FVkVOVCkKLSAgICAgICAgICAgICAgICAgICAgLnNldENsYXNzTmFtZShSRUNFSVZFUl9QQUNLQUdFLCBSRUNFSVZFUl9DTEFTUykKLSAgICAgICAgICAgICAgICAgICAgLnB1dEV4dHJhKEVYVFJBX0VWRU5UX1NFTkRFUiwgbVNlbmRlcikKLSAgICAgICAgICAgICAgICAgICAgLnB1dEV4dHJhKEVYVFJBX0VWRU5UX1RZUEUsIG1UeXBlLm5hbWUoKSkKLSAgICAgICAgICAgICAgICAgICAgLnB1dEV4dHJhKEVYVFJBX0VWRU5UX1BBUkFNUywgZ2V0SnNvblN0cmluZygpKQotICAgICAgICAgICAgICAgICAgICAucHV0RXh0cmEoRVhUUkFfRVZFTlRfVElNRSwgU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkpOwotCi0gICAgICAgICAgICBtSnNvbldyaXRlciA9IG51bGw7Ci0gICAgICAgICAgICBtU3RyaW5nV3JpdGVyID0gbnVsbDsKLSAgICAgICAgICAgIHJldHVybiBpbnRlbnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFN0cmluZyBnZXRKc29uU3RyaW5nKCkgewotICAgICAgICAgICAgaWYgKG1Kc29uV3JpdGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1Kc29uV3JpdGVyLmVuZE9iamVjdCgpOwotICAgICAgICAgICAgICAgIG1Kc29uV3JpdGVyLmZsdXNoKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkludGVudEJ1aWxkZXIuZ2V0SnNvblN0cmluZygpIGZhaWxlZC4iLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtU3RyaW5nV3JpdGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgYXBwZW5kVG9Kc29uKERldmljZUV2ZW50VHlwZVBhcmFtIGV2ZW50UGFyYW0sIGJvb2xlYW4gdmFsdWUpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBrZXkgPSBldmVudFBhcmFtLmdldE5hbWUoKTsKLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShrZXkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAobUpzb25Xcml0ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtU3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICAgICAgICAgICAgICBtSnNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKG1TdHJpbmdXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgICBtSnNvbldyaXRlci5iZWdpbk9iamVjdCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtSnNvbldyaXRlci5uYW1lKGtleSkudmFsdWUodmFsdWUpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnRlbnRCdWlsZGVyLmFwcGVuZFRvSnNvbigpIGZhaWxlZC4iLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgSW50ZW50IG5ld0RldmljZUV2ZW50SW50ZW50KEBOb25OdWxsIGZpbmFsIFN0cmluZyBzZW5kZXIsCisgICAgICAgICAgICBATm9uTnVsbCBmaW5hbCBEZXZpY2VFdmVudFR5cGUgdHlwZSkgeworICAgICAgICByZXR1cm4gbmV3IEludGVudCgpCisgICAgICAgICAgICAgICAgLnNldEFjdGlvbihBQ1RJT05fREVWSUNFX0VWRU5UKQorICAgICAgICAgICAgICAgIC5zZXRDbGFzc05hbWUoUkVDRUlWRVJfUEFDS0FHRSwgUkVDRUlWRVJfQ0xBU1MpCisgICAgICAgICAgICAgICAgLnB1dEV4dHJhKEVYVFJBX0VWRU5UX1NFTkRFUiwgc2VuZGVyKQorICAgICAgICAgICAgICAgIC5wdXRFeHRyYShFWFRSQV9FVkVOVF9UWVBFLCB0eXBlLm5hbWUoKSkKKyAgICAgICAgICAgICAgICAucHV0RXh0cmEoRVhUUkFfRVZFTlRfVElNRSwgU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTY4LDE2ICs5Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICJJbnRlbnQgbXVzdCBoYXZlICIgKyBFWFRSQV9FVkVOVF9USU1FICsgIjogIiArIGludGVudCk7CiAgICAgICAgIH0KIAotICAgICAgICBTdHJpbmcgcGFyYW1zU3RyaW5nID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKERldmljZUV2ZW50Q29uc3RhbnRzLkVYVFJBX0VWRU5UX1BBUkFNUyk7Ci0gICAgICAgIGlmIChwYXJhbXNTdHJpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgcGFyYW1zU3RyaW5nID0gIiI7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3IERldmljZUV2ZW50KAotICAgICAgICAgICAgICAgIHNlbmRlciwKLSAgICAgICAgICAgICAgICB0eXBlLAotICAgICAgICAgICAgICAgIHBhcmFtc1N0cmluZywKLSAgICAgICAgICAgICAgICBpbnRlbnQuZ2V0TG9uZ0V4dHJhKEVYVFJBX0VWRU5UX1RJTUUsIDBMKSk7CisgICAgICAgIHJldHVybiBuZXcgRGV2aWNlRXZlbnQoc2VuZGVyLCB0eXBlLCBpbnRlbnQuZ2V0TG9uZ0V4dHJhKEVYVFJBX0VWRU5UX1RJTUUsIDBMKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNDIsMjEgKzE1OCwxMyBAQAogICAgIHB1YmxpYyBmaW5hbCBEZXZpY2VFdmVudFR5cGUgdHlwZTsKIAogICAgIC8qKgotICAgICAqIEV2ZW50IHBhcmFtZXRlcnMgZm9ybWF0dGVkIGFzIGpzb24gc3RyaW5nLgotICAgICAqIGUuZy4ge0BsaW5rIERldmljZUV2ZW50VHlwZVBhcmFtI09OX1NUQVJUX0lOUFVUX1JFU1RBUlRJTkd9Ci0gICAgICovCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBwYXJhbXNTdHJpbmc7Ci0KLSAgICAvKioKICAgICAgKiBFdmVudCB0aW1lLCB2YWx1ZSBpcyBmcm9tIHtAbGluayBTeXN0ZW1DbG9jayN1cHRpbWVNaWxsaXMoKX0uCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGxvbmcgdGltZTsKIAotICAgIHByaXZhdGUgRGV2aWNlRXZlbnQoCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgc2VuZGVyLCBmaW5hbCBEZXZpY2VFdmVudFR5cGUgdHlwZSwgU3RyaW5nIHBhcmFtc1N0cmluZywgZmluYWwgbG9uZyB0aW1lKSB7CisgICAgcHJpdmF0ZSBEZXZpY2VFdmVudChmaW5hbCBTdHJpbmcgc2VuZGVyLCBmaW5hbCBEZXZpY2VFdmVudFR5cGUgdHlwZSwgZmluYWwgbG9uZyB0aW1lKSB7CiAgICAgICAgIHRoaXMuc2VuZGVyID0gc2VuZGVyOwogICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgICAgICB0aGlzLnBhcmFtc1N0cmluZyA9IHBhcmFtc1N0cmluZzsKICAgICAgICAgdGhpcy50aW1lID0gdGltZTsKICAgICB9CiAKQEAgLTI2NiwzNyArMTc0LDYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAcGFyYW0gZXZlbnRQYXJhbSB7QGxpbmsgRGV2aWNlRXZlbnRUeXBlUGFyYW19IHRvIGxvb2sgZm9yLgotICAgICAqIEBwYXJhbSBldmVudCB7QGxpbmsgRGV2aWNlRXZlbnR9IHRvIGxvb2sgaW4uCi0gICAgICogQHJldHVybiBFdmVudCBwYXJhbWV0ZXIgZm9yIHByb3ZpZGVkIGtleS4gSWYga2V5IGlzIG5vdCBmb3VuZCBpbgotICAgICAqIHtAbGluayBEZXZpY2VFdmVudCNwYXJhbXNTdHJpbmd9LCBudWxsIGlzIHJldHVybmVkLgotICAgICAqCi0gICAgICogVE9ETzogU3VwcG9ydCBvdGhlciBwcmltaXRpdmUgYW5kIGN1c3RvbSB0eXBlcy4KLSAgICAgKi8KLSAgICBATnVsbGFibGUKLSAgICBwdWJsaWMgc3RhdGljIEJvb2xlYW4gZ2V0RXZlbnRQYXJhbUJvb2xlYW4oCi0gICAgICAgICAgICBEZXZpY2VFdmVudFR5cGVQYXJhbSBldmVudFBhcmFtLCBmaW5hbCBEZXZpY2VFdmVudCBldmVudCkgewotICAgICAgICBTdHJpbmdSZWFkZXIgc3RyaW5nUmVhZGVyID0gbmV3IFN0cmluZ1JlYWRlcihldmVudC5wYXJhbXNTdHJpbmcpOwotICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKHN0cmluZ1JlYWRlcik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOwotICAgICAgICAgICAgd2hpbGUgKHJlYWRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHJlYWRlci5uZXh0TmFtZSgpOwotICAgICAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscyhldmVudFBhcmFtLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgQm9vbGVhbiB2YWx1ZSA9IHJlYWRlci5uZXh0Qm9vbGVhbigpOwotICAgICAgICAgICAgICAgICAgICByZWFkZXIuZW5kT2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZWFkZXIuZW5kT2JqZWN0KCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJEZXZpY2VFdmVudC5nZXRFdmVudFBhcmFtQm9vbGVhbigpIGZhaWxlZC4iLCBlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBBYnN0cmFjdGlvbiBvZiBkZXZpY2UgZXZlbnQgdGFibGUgaW4gZGF0YWJhc2UuCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgRGV2aWNlRXZlbnRUYWJsZSBleHRlbmRzIFRhYmxlPERldmljZUV2ZW50PiB7CkBAIC0zMDYsMTkgKzE4MywxNiBAQAogICAgICAgICBwcml2YXRlIGZpbmFsIEZpZWxkIFNFTkRFUjsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBGaWVsZCBUWVBFOwogICAgICAgICBwcml2YXRlIGZpbmFsIEZpZWxkIFRJTUU7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgRmllbGQgUEFSQU1TOwogCiAgICAgICAgIHByaXZhdGUgRGV2aWNlRXZlbnRUYWJsZShmaW5hbCBTdHJpbmcgbmFtZSkgewogICAgICAgICAgICAgc3VwZXIobmFtZSwgbmV3IEVudGl0eS5CdWlsZGVyPERldmljZUV2ZW50PigpCiAgICAgICAgICAgICAgICAgICAgIC5hZGRGaWVsZChFdmVudFRhYmxlQ29uc3RhbnRzLlNFTkRFUiwgQ3Vyc29yLkZJRUxEX1RZUEVfU1RSSU5HKQogICAgICAgICAgICAgICAgICAgICAuYWRkRmllbGQoRXZlbnRUYWJsZUNvbnN0YW50cy5UWVBFLCBDdXJzb3IuRklFTERfVFlQRV9TVFJJTkcpCiAgICAgICAgICAgICAgICAgICAgIC5hZGRGaWVsZChFdmVudFRhYmxlQ29uc3RhbnRzLlRJTUUsIEN1cnNvci5GSUVMRF9UWVBFX0lOVEVHRVIpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRGaWVsZChFdmVudFRhYmxlQ29uc3RhbnRzLkVYVFJBUywgQ3Vyc29yLkZJRUxEX1RZUEVfU1RSSU5HKQogICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CiAgICAgICAgICAgICBTRU5ERVIgPSBnZXRGaWVsZChFdmVudFRhYmxlQ29uc3RhbnRzLlNFTkRFUik7CiAgICAgICAgICAgICBUWVBFID0gZ2V0RmllbGQoRXZlbnRUYWJsZUNvbnN0YW50cy5UWVBFKTsKICAgICAgICAgICAgIFRJTUUgPSBnZXRGaWVsZChFdmVudFRhYmxlQ29uc3RhbnRzLlRJTUUpOwotICAgICAgICAgICAgUEFSQU1TID0gZ2V0RmllbGQoRXZlbnRUYWJsZUNvbnN0YW50cy5FWFRSQVMpOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCkBAIC0zMjYsNyArMjAwLDYgQEAKICAgICAgICAgICAgIGZpbmFsIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKICAgICAgICAgICAgIFNFTkRFUi5wdXRTdHJpbmcodmFsdWVzLCBldmVudC5zZW5kZXIpOwogICAgICAgICAgICAgVFlQRS5wdXRTdHJpbmcodmFsdWVzLCBldmVudC50eXBlLm5hbWUoKSk7Ci0gICAgICAgICAgICBQQVJBTVMucHV0U3RyaW5nKHZhbHVlcywgZXZlbnQucGFyYW1zU3RyaW5nKTsKICAgICAgICAgICAgIFRJTUUucHV0TG9uZyh2YWx1ZXMsIGV2ZW50LnRpbWUpOwogICAgICAgICAgICAgcmV0dXJuIHZhbHVlczsKICAgICAgICAgfQpAQCAtMzQxLDcgKzIxNCw2IEBACiAgICAgICAgICAgICAgICAgZmluYWwgRGV2aWNlRXZlbnQgZXZlbnQgPSBuZXcgRGV2aWNlRXZlbnQoCiAgICAgICAgICAgICAgICAgICAgICAgICBTRU5ERVIuZ2V0U3RyaW5nKGN1cnNvciksCiAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VFdmVudFR5cGUudmFsdWVPZihUWVBFLmdldFN0cmluZyhjdXJzb3IpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFBBUkFNUy5nZXRTdHJpbmcoY3Vyc29yKSwKICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUUuZ2V0TG9uZyhjdXJzb3IpKTsKICAgICAgICAgICAgICAgICBidWlsZGVyLmFjY2VwdChldmVudCk7CiAgICAgICAgICAgICAgICAgaWYgKERFQlVHX1NUUkVBTSkgewpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9pbnB1dG1ldGhvZHNlcnZpY2UvZGV2aWNlc2lkZS9saWIvc3JjL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL2N0cy9kYi9EYXRhYmFzZS5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9pbnB1dG1ldGhvZHNlcnZpY2UvZGV2aWNlc2lkZS9saWIvc3JjL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL2N0cy9kYi9EYXRhYmFzZS5qYXZhCmluZGV4IDRjZGEwNTAuLjBjZTNlZTcgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvaW5wdXRtZXRob2RzZXJ2aWNlL2RldmljZXNpZGUvbGliL3NyYy9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9jdHMvZGIvRGF0YWJhc2UuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2lucHV0bWV0aG9kc2VydmljZS9kZXZpY2VzaWRlL2xpYi9zcmMvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvY3RzL2RiL0RhdGFiYXNlLmphdmEKQEAgLTIxLDcgKzIxLDcgQEAKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZTsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVPcGVuSGVscGVyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk5vbk51bGw7CitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5Ob25OdWxsOwogCiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvaW5wdXRtZXRob2RzZXJ2aWNlL2RldmljZXNpZGUvbGliL3NyYy9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9jdHMvZGIvRW50aXR5LmphdmEgYi9ob3N0c2lkZXRlc3RzL2lucHV0bWV0aG9kc2VydmljZS9kZXZpY2VzaWRlL2xpYi9zcmMvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvY3RzL2RiL0VudGl0eS5qYXZhCmluZGV4IDkzMjZiMjkuLmM2NmIzNmEgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvaW5wdXRtZXRob2RzZXJ2aWNlL2RldmljZXNpZGUvbGliL3NyYy9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9jdHMvZGIvRW50aXR5LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9pbnB1dG1ldGhvZHNlcnZpY2UvZGV2aWNlc2lkZS9saWIvc3JjL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL2N0cy9kYi9FbnRpdHkuamF2YQpAQCAtMTgsNyArMTgsNyBAQAogCiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5CYXNlQ29sdW1uczsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Ob25OdWxsOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTm9uTnVsbDsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2lucHV0bWV0aG9kc2VydmljZS9kZXZpY2VzaWRlL2xpYi9zcmMvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvY3RzL2RiL1RhYmxlLmphdmEgYi9ob3N0c2lkZXRlc3RzL2lucHV0bWV0aG9kc2VydmljZS9kZXZpY2VzaWRlL2xpYi9zcmMvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvY3RzL2RiL1RhYmxlLmphdmEKaW5kZXggYzc1Njc5MC4uYjJlNWJjNyAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9pbnB1dG1ldGhvZHNlcnZpY2UvZGV2aWNlc2lkZS9saWIvc3JjL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL2N0cy9kYi9UYWJsZS5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvaW5wdXRtZXRob2RzZXJ2aWNlL2RldmljZXNpZGUvbGliL3NyYy9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9jdHMvZGIvVGFibGUuamF2YQpAQCAtMTgsNyArMTgsNyBAQAogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uTm9uTnVsbDsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk5vbk51bGw7CiAKIGltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKIApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9pbnB1dG1ldGhvZHNlcnZpY2UvZGV2aWNlc2lkZS9saWIvc3JjL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL2N0cy9pbWUvQ3RzQmFzZUlucHV0TWV0aG9kLmphdmEgYi9ob3N0c2lkZXRlc3RzL2lucHV0bWV0aG9kc2VydmljZS9kZXZpY2VzaWRlL2xpYi9zcmMvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvY3RzL2ltZS9DdHNCYXNlSW5wdXRNZXRob2QuamF2YQppbmRleCBiMzc4NzNjLi4wNWQ0N2JiIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2lucHV0bWV0aG9kc2VydmljZS9kZXZpY2VzaWRlL2xpYi9zcmMvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvY3RzL2ltZS9DdHNCYXNlSW5wdXRNZXRob2QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2lucHV0bWV0aG9kc2VydmljZS9kZXZpY2VzaWRlL2xpYi9zcmMvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvY3RzL2ltZS9DdHNCYXNlSW5wdXRNZXRob2QuamF2YQpAQCAtMTYsMjEgKzE2LDI0IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5pbnB1dG1ldGhvZHNlcnZpY2UuY3RzLmltZTsKIAotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmlucHV0bWV0aG9kc2VydmljZS5jdHMuY29tbW9uLkRldmljZUV2ZW50Q29uc3RhbnRzLkRldmljZUV2ZW50VHlwZS5ISURFX1NPRlRfSU5QVVQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuaW5wdXRtZXRob2RzZXJ2aWNlLmN0cy5jb21tb24uRGV2aWNlRXZlbnRDb25zdGFudHMuRGV2aWNlRXZlbnRUeXBlCisgICAgICAgIC5PTl9CSU5EX0lOUFVUOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmlucHV0bWV0aG9kc2VydmljZS5jdHMuY29tbW9uLkRldmljZUV2ZW50Q29uc3RhbnRzLkRldmljZUV2ZW50VHlwZS5PTl9DUkVBVEU7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuaW5wdXRtZXRob2RzZXJ2aWNlLmN0cy5jb21tb24uRGV2aWNlRXZlbnRDb25zdGFudHMuRGV2aWNlRXZlbnRUeXBlLk9OX0RFU1RST1k7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuaW5wdXRtZXRob2RzZXJ2aWNlLmN0cy5jb21tb24uRGV2aWNlRXZlbnRDb25zdGFudHMuRGV2aWNlRXZlbnRUeXBlLk9OX0ZJTklTSF9JTlBVVDsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5pbnB1dG1ldGhvZHNlcnZpY2UuY3RzLmNvbW1vbi5EZXZpY2VFdmVudENvbnN0YW50cy5EZXZpY2VFdmVudFR5cGUuT05fRklOSVNIX0lOUFVUX1ZJRVc7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuaW5wdXRtZXRob2RzZXJ2aWNlLmN0cy5jb21tb24uRGV2aWNlRXZlbnRDb25zdGFudHMuRGV2aWNlRXZlbnRUeXBlLk9OX1NUQVJUX0lOUFVUOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmlucHV0bWV0aG9kc2VydmljZS5jdHMuY29tbW9uLkRldmljZUV2ZW50Q29uc3RhbnRzLkRldmljZUV2ZW50VHlwZS5PTl9TVEFSVF9JTlBVVF9WSUVXOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmlucHV0bWV0aG9kc2VydmljZS5jdHMuY29tbW9uLkRldmljZUV2ZW50Q29uc3RhbnRzLkRldmljZUV2ZW50VHlwZS5TSE9XX1NPRlRfSU5QVVQ7CiAKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmlucHV0bWV0aG9kc2VydmljZS5jdHMuY29tbW9uLkRldmljZUV2ZW50Q29uc3RhbnRzLkRldmljZUV2ZW50VHlwZQorICAgICAgICAuT05fVU5CSU5EX0lOUFVUOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmlucHV0bWV0aG9kc2VydmljZS5JbnB1dE1ldGhvZFNlcnZpY2U7CiBpbXBvcnQgYW5kcm9pZC5pbnB1dG1ldGhvZHNlcnZpY2UuY3RzLkRldmljZUV2ZW50OwotaW1wb3J0IGFuZHJvaWQuaW5wdXRtZXRob2RzZXJ2aWNlLmN0cy5jb21tb24uRGV2aWNlRXZlbnRDb25zdGFudHMuRGV2aWNlRXZlbnRUeXBlUGFyYW07CitpbXBvcnQgYW5kcm9pZC5pbnB1dG1ldGhvZHNlcnZpY2UuY3RzLmNvbW1vbi5EZXZpY2VFdmVudENvbnN0YW50cy5EZXZpY2VFdmVudFR5cGU7CiBpbXBvcnQgYW5kcm9pZC5pbnB1dG1ldGhvZHNlcnZpY2UuY3RzLmltZS5JbWVDb21tYW5kUmVjZWl2ZXIuSW1lQ29tbWFuZENhbGxiYWNrczsKLQotaW1wb3J0IGFuZHJvaWQub3MuUmVzdWx0UmVjZWl2ZXI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuRWRpdG9ySW5mbzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRDb25uZWN0aW9uOwpAQCAtNDUsMzMgKzQ4LDEzIEBACiAgICAgICAgICAgICBuZXcgSW1lQ29tbWFuZFJlY2VpdmVyPD4oKTsKICAgICBwcml2YXRlIFN0cmluZyBtTG9nVGFnOwogCi0gICAgcHJpdmF0ZSBjbGFzcyBDdHNJbnB1dE1ldGhvZEltcGwgZXh0ZW5kcyBJbnB1dE1ldGhvZEltcGwgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2hvd1NvZnRJbnB1dChpbnQgZmxhZ3MsIFJlc3VsdFJlY2VpdmVyIHJlc3VsdFJlY2VpdmVyKSB7Ci0gICAgICAgICAgICBzZW5kRXZlbnQoRGV2aWNlRXZlbnQuYnVpbGRlcigpLnNldFR5cGUoU0hPV19TT0ZUX0lOUFVUKSk7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChtTG9nVGFnLCAic2hvd1NvZnRJbnB1dCBjYWxsZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN1cGVyLnNob3dTb2Z0SW5wdXQoZmxhZ3MsIHJlc3VsdFJlY2VpdmVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBoaWRlU29mdElucHV0KGludCBmbGFncywgUmVzdWx0UmVjZWl2ZXIgcmVzdWx0UmVjZWl2ZXIpIHsKLSAgICAgICAgICAgIHNlbmRFdmVudChEZXZpY2VFdmVudC5idWlsZGVyKCkuc2V0VHlwZShISURFX1NPRlRfSU5QVVQpKTsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKG1Mb2dUYWcsICJoaWRlU29mdElucHV0IGNhbGxlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3VwZXIuaGlkZVNvZnRJbnB1dChmbGFncywgcmVzdWx0UmVjZWl2ZXIpOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25DcmVhdGUoKSB7CiAgICAgICAgIG1Mb2dUYWcgPSBnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKTsKICAgICAgICAgaWYgKERFQlVHKSB7CiAgICAgICAgICAgICBMb2cuZChtTG9nVGFnLCAib25DcmVhdGU6Iik7CiAgICAgICAgIH0KLSAgICAgICAgc2VuZEV2ZW50KERldmljZUV2ZW50LmJ1aWxkZXIoKS5zZXRUeXBlKE9OX0NSRUFURSkpOworICAgICAgICBzZW5kRXZlbnQoT05fQ1JFQVRFKTsKIAogICAgICAgICBzdXBlci5vbkNyZWF0ZSgpOwogCkBAIC03OSwxNiArNjIsMjMgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkJpbmRJbnB1dCgpIHsKKyAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBMb2cuZChtTG9nVGFnLCAib25CaW5kSW5wdXQiKTsKKyAgICAgICAgfQorICAgICAgICBzZW5kRXZlbnQoT05fQklORF9JTlBVVCk7CisgICAgICAgIHN1cGVyLm9uQmluZElucHV0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25TdGFydElucHV0KEVkaXRvckluZm8gZWRpdG9ySW5mbywgYm9vbGVhbiByZXN0YXJ0aW5nKSB7CiAgICAgICAgIGlmIChERUJVRykgewogICAgICAgICAgICAgTG9nLmQobUxvZ1RhZywgIm9uU3RhcnRJbnB1dDoiCiAgICAgICAgICAgICAgICAgICAgICsgIiBlZGl0b3JJbmZvPSIgKyBlZGl0b3JJbmZvCiAgICAgICAgICAgICAgICAgICAgICsgIiByZXN0YXJ0aW5nPSIgKyByZXN0YXJ0aW5nKTsKICAgICAgICAgfQorICAgICAgICBzZW5kRXZlbnQoT05fU1RBUlRfSU5QVVQsIGVkaXRvckluZm8sIHJlc3RhcnRpbmcpOwogCi0gICAgICAgIHNlbmRFdmVudChEZXZpY2VFdmVudC5idWlsZGVyKCkKLSAgICAgICAgICAgICAgICAuc2V0VHlwZShPTl9TVEFSVF9JTlBVVCkKLSAgICAgICAgICAgICAgICAud2l0aChEZXZpY2VFdmVudFR5cGVQYXJhbS5PTl9TVEFSVF9JTlBVVF9SRVNUQVJUSU5HLCByZXN0YXJ0aW5nKSk7CiAgICAgICAgIHN1cGVyLm9uU3RhcnRJbnB1dChlZGl0b3JJbmZvLCByZXN0YXJ0aW5nKTsKICAgICB9CiAKQEAgLTk5LDE4ICs4OSwyNiBAQAogICAgICAgICAgICAgICAgICAgICArICIgZWRpdG9ySW5mbz0iICsgZWRpdG9ySW5mbwogICAgICAgICAgICAgICAgICAgICArICIgcmVzdGFydGluZz0iICsgcmVzdGFydGluZyk7CiAgICAgICAgIH0KLQotICAgICAgICBzZW5kRXZlbnQoRGV2aWNlRXZlbnQuYnVpbGRlcigpLnNldFR5cGUoT05fU1RBUlRfSU5QVVRfVklFVykpOworICAgICAgICBzZW5kRXZlbnQoT05fU1RBUlRfSU5QVVRfVklFVywgZWRpdG9ySW5mbywgcmVzdGFydGluZyk7CiAKICAgICAgICAgc3VwZXIub25TdGFydElucHV0VmlldyhlZGl0b3JJbmZvLCByZXN0YXJ0aW5nKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblVuYmluZElucHV0KCkgeworICAgICAgICBzdXBlci5vblVuYmluZElucHV0KCk7CisgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgTG9nLmQobUxvZ1RhZywgIm9uVW5iaW5kSW5wdXQiKTsKKyAgICAgICAgfQorICAgICAgICBzZW5kRXZlbnQoT05fVU5CSU5EX0lOUFVUKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBvbkZpbmlzaElucHV0Vmlldyhib29sZWFuIGZpbmlzaGluZ0lucHV0KSB7CiAgICAgICAgIGlmIChERUJVRykgewogICAgICAgICAgICAgTG9nLmQobUxvZ1RhZywgIm9uRmluaXNoSW5wdXRWaWV3OiBmaW5pc2hpbmdJbnB1dD0iICsgZmluaXNoaW5nSW5wdXQpOwogICAgICAgICB9Ci0gICAgICAgIHNlbmRFdmVudChEZXZpY2VFdmVudC5idWlsZGVyKCkuc2V0VHlwZShPTl9GSU5JU0hfSU5QVVRfVklFVykpOworICAgICAgICBzZW5kRXZlbnQoT05fRklOSVNIX0lOUFVUX1ZJRVcsIGZpbmlzaGluZ0lucHV0KTsKIAogICAgICAgICBzdXBlci5vbkZpbmlzaElucHV0VmlldyhmaW5pc2hpbmdJbnB1dCk7CiAgICAgfQpAQCAtMTIwLDcgKzExOCw3IEBACiAgICAgICAgIGlmIChERUJVRykgewogICAgICAgICAgICAgTG9nLmQobUxvZ1RhZywgIm9uRmluaXNoSW5wdXQ6Iik7CiAgICAgICAgIH0KLSAgICAgICAgc2VuZEV2ZW50KERldmljZUV2ZW50LmJ1aWxkZXIoKS5zZXRUeXBlKE9OX0ZJTklTSF9JTlBVVCkpOworICAgICAgICBzZW5kRXZlbnQoT05fRklOSVNIX0lOUFVUKTsKIAogICAgICAgICBzdXBlci5vbkZpbmlzaElucHV0KCk7CiAgICAgfQpAQCAtMTMwLDIzICsxMjgsMTMgQEAKICAgICAgICAgaWYgKERFQlVHKSB7CiAgICAgICAgICAgICBMb2cuZChtTG9nVGFnLCAib25EZXN0cm95OiIpOwogICAgICAgICB9Ci0gICAgICAgIHNlbmRFdmVudChEZXZpY2VFdmVudC5idWlsZGVyKCkuc2V0VHlwZShPTl9ERVNUUk9ZKSk7CisgICAgICAgIHNlbmRFdmVudChPTl9ERVNUUk9ZKTsKIAogICAgICAgICBzdXBlci5vbkRlc3Ryb3koKTsKIAogICAgICAgICB1bnJlZ2lzdGVyUmVjZWl2ZXIobUltZUNvbW1hbmRSZWNlaXZlcik7CiAgICAgfQogCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEFic3RyYWN0SW5wdXRNZXRob2RJbXBsIG9uQ3JlYXRlSW5wdXRNZXRob2RJbnRlcmZhY2UoKSB7Ci0gICAgICAgIGZpbmFsIEN0c0lucHV0TWV0aG9kSW1wbCBpbnB1dE1ldGhvZCA9IG5ldyBDdHNJbnB1dE1ldGhvZEltcGwoKTsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChtTG9nVGFnLCAib25DcmVhdGVJbnB1dE1ldGhvZEludGVyZmFjZSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGlucHV0TWV0aG9kOwotICAgIH0KLQogICAgIC8vCiAgICAgLy8gSW1wbGVtZW50YXRpb25zIG9mIHtAbGluayBJbWVDb21tYW5kQ2FsbGJhY2tzfS4KICAgICAvLwpAQCAtMTc4LDggKzE2NiwxMCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICBwcml2YXRlIHZvaWQgc2VuZEV2ZW50KGZpbmFsIERldmljZUV2ZW50LkludGVudEJ1aWxkZXIgaW50ZW50QnVpbGRlcikgewotICAgICAgICBpbnRlbnRCdWlsZGVyLnNldFNlbmRlcihnZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIHNlbmRCcm9hZGNhc3QoaW50ZW50QnVpbGRlci5idWlsZCgpKTsKKyAgICBwcml2YXRlIHZvaWQgc2VuZEV2ZW50KGZpbmFsIERldmljZUV2ZW50VHlwZSB0eXBlLCBmaW5hbCBPYmplY3QuLi4gYXJncykgeworICAgICAgICBmaW5hbCBTdHJpbmcgc2VuZGVyID0gZ2V0Q2xhc3MoKS5nZXROYW1lKCk7CisgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBEZXZpY2VFdmVudC5uZXdEZXZpY2VFdmVudEludGVudChzZW5kZXIsIHR5cGUpOworICAgICAgICAvLyBUT0RPOiBTZW5kIGFyYml0cmFyeSB7QGNvZGUgYXJnc30gaW4ge0Bjb2RlIGludGVudH0uCisgICAgICAgIHNlbmRCcm9hZGNhc3QoaW50ZW50KTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2lucHV0bWV0aG9kc2VydmljZS9kZXZpY2VzaWRlL2xpYi9zcmMvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvY3RzL2ltZS9JbWVDb21tYW5kUmVjZWl2ZXIuamF2YSBiL2hvc3RzaWRldGVzdHMvaW5wdXRtZXRob2RzZXJ2aWNlL2RldmljZXNpZGUvbGliL3NyYy9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9jdHMvaW1lL0ltZUNvbW1hbmRSZWNlaXZlci5qYXZhCmluZGV4IDIzZTU1NTUuLmRkNTM3NjUgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvaW5wdXRtZXRob2RzZXJ2aWNlL2RldmljZXNpZGUvbGliL3NyYy9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9jdHMvaW1lL0ltZUNvbW1hbmRSZWNlaXZlci5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvaW5wdXRtZXRob2RzZXJ2aWNlL2RldmljZXNpZGUvbGliL3NyYy9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9jdHMvaW1lL0ltZUNvbW1hbmRSZWNlaXZlci5qYXZhCkBAIC04Niw2ICs4NiwyMCBAQAogICAgICAgICAgICAgICAgIG1JbWUuY29tbWFuZFJlcXVlc3RIaWRlU2VsZihmbGFncyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBJbWVDb21tYW5kQ29uc3RhbnRzLkNPTU1BTkRfU1dJVENIX0lOUFVUX01FVEhPRF9XSVRIX1NVQlRZUEU6IHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaW1lSWQgPSBnZXRTdHJpbmcxKGludGVudCk7CisgICAgICAgICAgICAgICAgLy8gd2UgZG9uJ3Qgc3VwcG9ydCBtb2NrIGltZXMgd2l0aCBzdWJ0eXBlcyB5ZXQuCisgICAgICAgICAgICAgICAgbUltZS5zd2l0Y2hJbnB1dE1ldGhvZChpbWVJZCwgbnVsbCAvKiBzdWJ0eXBlKi8pOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgSW1lQ29tbWFuZENvbnN0YW50cy5DT01NQU5EX1NXSVRDSF9UT19ORVhUX0lOUFVUOiB7CisgICAgICAgICAgICAgICAgbUltZS5zd2l0Y2hUb05leHRJbnB1dE1ldGhvZChmYWxzZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBJbWVDb21tYW5kQ29uc3RhbnRzLkNPTU1BTkRfU1dJVENIX1RPX1BSRVZJT1VTX0lOUFVUOiB7CisgICAgICAgICAgICAgICAgbUltZS5zd2l0Y2hUb1ByZXZpb3VzSW5wdXRNZXRob2QoKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBkZWZhdWx0OiB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJVbmtub3duIElNRSBjb21tYW5kOiAiICsgY29tbWFuZCk7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2lucHV0bWV0aG9kc2VydmljZS9kZXZpY2VzaWRlL3Byb3ZpZGVyL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2lucHV0bWV0aG9kc2VydmljZS9kZXZpY2VzaWRlL3Byb3ZpZGVyL0FuZHJvaWQubWsKaW5kZXggMjI2MWE3OS4uYjhmMzA4ZCAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9pbnB1dG1ldGhvZHNlcnZpY2UvZGV2aWNlc2lkZS9wcm92aWRlci9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvaW5wdXRtZXRob2RzZXJ2aWNlL2RldmljZXNpZGUvcHJvdmlkZXIvQW5kcm9pZC5tawpAQCAtMzEsMTAgKzMxLDEwIEBACiAgICAgQ3RzSW5wdXRNZXRob2RTZXJ2aWNlTGliCiAKICMgdGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cyBjdHNfaW5zdGFudAogCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzSW5wdXRNZXRob2RTZXJ2aWNlRXZlbnRQcm92aWRlcgogCi1MT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CitMT0NBTF9TREtfVkVSU0lPTiA6PSB0ZXN0X2N1cnJlbnQKIAogaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2lucHV0bWV0aG9kc2VydmljZS9kZXZpY2VzaWRlL3Byb3ZpZGVyL3NyYy9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9jdHMvcHJvdmlkZXIvRXZlbnRQcm92aWRlci5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9pbnB1dG1ldGhvZHNlcnZpY2UvZGV2aWNlc2lkZS9wcm92aWRlci9zcmMvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvY3RzL3Byb3ZpZGVyL0V2ZW50UHJvdmlkZXIuamF2YQppbmRleCA0NmEzMmM2Li5jZjIwYTk1IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2lucHV0bWV0aG9kc2VydmljZS9kZXZpY2VzaWRlL3Byb3ZpZGVyL3NyYy9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9jdHMvcHJvdmlkZXIvRXZlbnRQcm92aWRlci5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvaW5wdXRtZXRob2RzZXJ2aWNlL2RldmljZXNpZGUvcHJvdmlkZXIvc3JjL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL2N0cy9wcm92aWRlci9FdmVudFByb3ZpZGVyLmphdmEKQEAgLTI3LDggKzI3LDggQEAKIGltcG9ydCBhbmRyb2lkLmlucHV0bWV0aG9kc2VydmljZS5jdHMuZGIuVGFibGU7CiBpbXBvcnQgYW5kcm9pZC5pbnB1dG1ldGhvZHNlcnZpY2UuY3RzLkRldmljZUV2ZW50OwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTm9uTnVsbDsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk51bGxhYmxlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9pbnB1dG1ldGhvZHNlcnZpY2UvZGV2aWNlc2lkZS9wcm92aWRlci9zcmMvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvY3RzL3Byb3ZpZGVyL1VyaUhlbHBlci5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9pbnB1dG1ldGhvZHNlcnZpY2UvZGV2aWNlc2lkZS9wcm92aWRlci9zcmMvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvY3RzL3Byb3ZpZGVyL1VyaUhlbHBlci5qYXZhCmluZGV4IDFhNGY5NDUuLjMyMjI2ODQgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvaW5wdXRtZXRob2RzZXJ2aWNlL2RldmljZXNpZGUvcHJvdmlkZXIvc3JjL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL2N0cy9wcm92aWRlci9VcmlIZWxwZXIuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2lucHV0bWV0aG9kc2VydmljZS9kZXZpY2VzaWRlL3Byb3ZpZGVyL3NyYy9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9jdHMvcHJvdmlkZXIvVXJpSGVscGVyLmphdmEKQEAgLTE5LDggKzE5LDggQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuVXJpTWF0Y2hlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5CYXNlQ29sdW1uczsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTm9uTnVsbDsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk51bGxhYmxlOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OwogCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2lucHV0bWV0aG9kc2VydmljZS9ob3N0c2lkZS9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9pbnB1dG1ldGhvZHNlcnZpY2UvaG9zdHNpZGUvQW5kcm9pZC5tawppbmRleCA1ZmYyMmEyLi4yY2ZjYTBlIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2lucHV0bWV0aG9kc2VydmljZS9ob3N0c2lkZS9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvaW5wdXRtZXRob2RzZXJ2aWNlL2hvc3RzaWRlL0FuZHJvaWQubWsKQEAgLTIxLDcgKzIxLDcgQEAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCiAKICMgdGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cyBjdHNfaW5zdGFudAogCiBMT0NBTF9NT0RVTEUgOj0gQ3RzSW5wdXRNZXRob2RTZXJ2aWNlSG9zdFRlc3RDYXNlcwogCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2lucHV0bWV0aG9kc2VydmljZS9ob3N0c2lkZS9BbmRyb2lkVGVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2lucHV0bWV0aG9kc2VydmljZS9ob3N0c2lkZS9BbmRyb2lkVGVzdC54bWwKaW5kZXggYmY3ZTlhNy4uMTU3NTY1OSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9pbnB1dG1ldGhvZHNlcnZpY2UvaG9zdHNpZGUvQW5kcm9pZFRlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvaW5wdXRtZXRob2RzZXJ2aWNlL2hvc3RzaWRlL0FuZHJvaWRUZXN0LnhtbApAQCAtMTYsNyArMTYsOCBAQAogLS0+CiAKIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBJbnB1dCBNZXRob2QgU2VydmljZSBob3N0IHRlc3QgY2FzZXMiPgotICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iZnJhbWV3b3JrIiAvPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CisgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJpbnB1dG1ldGhvZCIgLz4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlJ1bkNvbW1hbmRUYXJnZXRQcmVwYXJlciI+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icnVuLWNvbW1hbmQiIHZhbHVlPSJpbnB1dCBrZXlldmVudCBLRVlDT0RFX1dBS0VVUCIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJydW4tY29tbWFuZCIgdmFsdWU9IndtIGRpc21pc3Mta2V5Z3VhcmQiIC8+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2lucHV0bWV0aG9kc2VydmljZS9ob3N0c2lkZS9zcmMvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvY3RzL2hvc3RzaWRlL0lucHV0TWV0aG9kU2VydmljZUxpZmVjeWNsZVRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvaW5wdXRtZXRob2RzZXJ2aWNlL2hvc3RzaWRlL3NyYy9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9jdHMvaG9zdHNpZGUvSW5wdXRNZXRob2RTZXJ2aWNlTGlmZWN5Y2xlVGVzdC5qYXZhCmluZGV4IDI4YmM3MzYuLmQ3NzhjNzAgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvaW5wdXRtZXRob2RzZXJ2aWNlL2hvc3RzaWRlL3NyYy9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9jdHMvaG9zdHNpZGUvSW5wdXRNZXRob2RTZXJ2aWNlTGlmZWN5Y2xlVGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvaW5wdXRtZXRob2RzZXJ2aWNlL2hvc3RzaWRlL3NyYy9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9jdHMvaG9zdHNpZGUvSW5wdXRNZXRob2RTZXJ2aWNlTGlmZWN5Y2xlVGVzdC5qYXZhCkBAIC0xNiwxMzUgKzE2LDMyOCBAQAogCiBwYWNrYWdlIGFuZHJvaWQuaW5wdXRtZXRob2RzZXJ2aWNlLmN0cy5ob3N0c2lkZTsKIAoraW1wb3J0IHN0YXRpYyBhbmRyb2lkLmlucHV0bWV0aG9kc2VydmljZS5jdHMuY29tbW9uLkJ1c3lXYWl0VXRpbHMucG9sbGluZ0NoZWNrOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmlucHV0bWV0aG9kc2VydmljZS5jdHMuY29tbW9uLkRldmljZUV2ZW50Q29uc3RhbnRzLkFDVElPTl9ERVZJQ0VfRVZFTlQ7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuaW5wdXRtZXRob2RzZXJ2aWNlLmN0cy5jb21tb24uRGV2aWNlRXZlbnRDb25zdGFudHMuRGV2aWNlRXZlbnRUeXBlLlRFU1RfU1RBUlQ7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuaW5wdXRtZXRob2RzZXJ2aWNlLmN0cy5jb21tb24uRGV2aWNlRXZlbnRDb25zdGFudHMuRVhUUkFfRVZFTlRfU0VOREVSOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmlucHV0bWV0aG9kc2VydmljZS5jdHMuY29tbW9uLkRldmljZUV2ZW50Q29uc3RhbnRzLkVYVFJBX0VWRU5UX1RZUEU7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuaW5wdXRtZXRob2RzZXJ2aWNlLmN0cy5jb21tb24uRGV2aWNlRXZlbnRDb25zdGFudHMuUkVDRUlWRVJfQ09NUE9ORU5UOwogCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3N1bWUuYXNzdW1lVHJ1ZTsKIAoraW1wb3J0IGFuZHJvaWQuaW5wdXRtZXRob2RzZXJ2aWNlLmN0cy5jb21tb24uRWRpdFRleHRBcHBDb25zdGFudHM7CiBpbXBvcnQgYW5kcm9pZC5pbnB1dG1ldGhvZHNlcnZpY2UuY3RzLmNvbW1vbi5FdmVudFByb3ZpZGVyQ29uc3RhbnRzLkV2ZW50VGFibGVDb25zdGFudHM7CiBpbXBvcnQgYW5kcm9pZC5pbnB1dG1ldGhvZHNlcnZpY2UuY3RzLmNvbW1vbi5JbWUxQ29uc3RhbnRzOwogaW1wb3J0IGFuZHJvaWQuaW5wdXRtZXRob2RzZXJ2aWNlLmN0cy5jb21tb24uSW1lMkNvbnN0YW50czsKIGltcG9ydCBhbmRyb2lkLmlucHV0bWV0aG9kc2VydmljZS5jdHMuY29tbW9uLnRlc3QuRGV2aWNlVGVzdENvbnN0YW50czsKIGltcG9ydCBhbmRyb2lkLmlucHV0bWV0aG9kc2VydmljZS5jdHMuY29tbW9uLnRlc3QuU2hlbGxDb21tYW5kVXRpbHM7CiBpbXBvcnQgYW5kcm9pZC5pbnB1dG1ldGhvZHNlcnZpY2UuY3RzLmNvbW1vbi50ZXN0LlRlc3RJbmZvOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUluc3RhbnQ7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNkZFRlc3Q7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGVzdHR5cGUuQ29tcGF0aWJpbGl0eUhvc3RUZXN0QmFzZTsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5EZXZpY2VKVW5pdDRDbGFzc1J1bm5lcjsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5qdW5pdDQuQmFzZUhvc3RKVW5pdDRUZXN0OwogCiBpbXBvcnQgb3JnLmp1bml0LkFmdGVyOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCi1AQ2RkVGVzdChyZXF1aXJlbWVudD0iNy4yLjEvSC0wLTEsQy0xLTIiKQotQFJ1bldpdGgoRGV2aWNlSlVuaXQ0Q2xhc3NSdW5uZXIuY2xhc3MpCi1wdWJsaWMgY2xhc3MgSW5wdXRNZXRob2RTZXJ2aWNlTGlmZWN5Y2xlVGVzdCBleHRlbmRzIENvbXBhdGliaWxpdHlIb3N0VGVzdEJhc2UgeworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVvdXRFeGNlcHRpb247CiAKLSAgICBwcml2YXRlIFN0cmluZyBtRGVmYXVsdEltZUlkOworQFJ1bldpdGgoRGV2aWNlSlVuaXQ0Q2xhc3NSdW5uZXIuY2xhc3MpCitwdWJsaWMgY2xhc3MgSW5wdXRNZXRob2RTZXJ2aWNlTGlmZWN5Y2xlVGVzdCBleHRlbmRzIEJhc2VIb3N0SlVuaXQ0VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFdBSVRfVElNRU9VVCA9IFRpbWVVbml0LlNFQ09ORFMudG9NaWxsaXMoMSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBQQUNLQUdFX09QX1RJTUVPVVQgPSBUaW1lVW5pdC5TRUNPTkRTLnRvTWlsbGlzKDcpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgUE9MTElOR19JTlRFUlZBTCA9IDEwMDsKIAogICAgIEBCZWZvcmUKICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBTa2lwIHdob2xlIHRlc3RzIHdoZW4gRFVUIGhhcyBubyBhbmRyb2lkLnNvZnR3YXJlLmlucHV0X21ldGhvZHMgZmVhdHVyZS4KLSAgICAgICAgYXNzdW1lVHJ1ZShCb29sZWFuLnBhcnNlQm9vbGVhbihzaGVsbCgKLSAgICAgICAgICAgICAgICBTaGVsbENvbW1hbmRVdGlscy5oYXNGZWF0dXJlKFNoZWxsQ29tbWFuZFV0aWxzLkZFQVRVUkVfSU5QVVRfTUVUSE9EUykpKSk7Ci0gICAgICAgIG1EZWZhdWx0SW1lSWQgPSBzaGVsbChTaGVsbENvbW1hbmRVdGlscy5nZXRDdXJyZW50SW1lKCkpOworICAgICAgICBhc3N1bWVUcnVlKGhhc0RldmljZUZlYXR1cmUoU2hlbGxDb21tYW5kVXRpbHMuRkVBVFVSRV9JTlBVVF9NRVRIT0RTKSk7CiAgICAgICAgIGNsZWFuVXBUZXN0SW1lcygpOwogICAgICAgICBzaGVsbChTaGVsbENvbW1hbmRVdGlscy5kZWxldGVDb250ZW50KEV2ZW50VGFibGVDb25zdGFudHMuQ09OVEVOVF9VUkkpKTsKICAgICB9CiAKICAgICBAQWZ0ZXIKICAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzaGVsbChTaGVsbENvbW1hbmRVdGlscy5zZXRDdXJyZW50SW1lKG1EZWZhdWx0SW1lSWQpKTsKLSAgICAgICAgY2xlYW5VcFRlc3RJbWVzKCk7CisgICAgICAgIHNoZWxsKFNoZWxsQ29tbWFuZFV0aWxzLnJlc2V0SW1lcygpKTsKICAgICB9CiAKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTd2l0Y2hJbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvKioKKyAgICAgKiBJbnN0YWxsIGFuIGFwcCBhcGsgZmlsZSBzeW5jaHJvbm91c2x5LgorICAgICAqCisgICAgICogPHA+VGhpcyBtZXRob2RzIHdhaXRzIHVudGlsIHBhY2thZ2UgaXMgYXZhaWxhYmxlIGluIFBhY2thZ2VNYW5nZXI8L3A+CisgICAgICoKKyAgICAgKiA8cD5Ob3RlOiBGb3IgaW5zdGFsbGluZyBJTUUgQVBLcyB1c2Uge0BsaW5rICNpbnN0YWxsSW1lUGFja2FnZVN5bmMoU3RyaW5nLCBTdHJpbmcpfQorICAgICAqIGluc3RlYWQuPC9wPgorICAgICAqIEBwYXJhbSBhcGtGaWxlTmFtZSBBcHAgYXBrIHRvIGluc3RhbGwKKyAgICAgKiBAcGFyYW0gcGFja2FnZU5hbWUgcGFja2FnZU5hbWUgb2YgdGhlIGluc3RhbGxlZCBhcGsKKyAgICAgKiBAcGFyYW0gb3B0aW9ucyBhZGIgc2hlbGwgaW5zdGFsbCBvcHRpb25zLgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGluc3RhbGxQYWNrYWdlU3luYygKKyAgICAgICAgICAgIFN0cmluZyBhcGtGaWxlTmFtZSwgU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcuLi4gb3B0aW9ucykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGluc3RhbGxQYWNrYWdlKGFwa0ZpbGVOYW1lLCBvcHRpb25zKTsKKyAgICAgICAgcG9sbGluZ0NoZWNrKCgpIC0+CisgICAgICAgICAgICBzaGVsbChTaGVsbENvbW1hbmRVdGlscy5saXN0UGFja2FnZShwYWNrYWdlTmFtZSkpLmNvbnRhaW5zKHBhY2thZ2VOYW1lKSwKKyAgICAgICAgICAgIFBBQ0tBR0VfT1BfVElNRU9VVCwKKyAgICAgICAgICAgIHBhY2thZ2VOYW1lICsgIiBzaG91bGQgYmUgaW5zdGFsbGVkLiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluc3RhbGwgSU1FIHBhY2thZ2VzIHN5bmNocm9ub3VzbHkuCisgICAgICoKKyAgICAgKiA8cD5UaGlzIG1ldGhvZCB2ZXJpZmllcyB0aGF0IElNRSBpcyBhdmFpbGFibGUgaW4gSU1NUy48L3A+CisgICAgICogQHBhcmFtIGFwa0ZpbGVOYW1lIElNRSBhcGsgdG8gaW5zdGFsbAorICAgICAqIEBwYXJhbSBpbWVJZCBvZiB0aGUgSU1FIGJlaW5nIGluc3RhbGxlZC4KKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBpbnN0YWxsSW1lUGFja2FnZVN5bmMoU3RyaW5nIGFwa0ZpbGVOYW1lLCBTdHJpbmcgaW1lSWQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbnN0YWxsUGFja2FnZShhcGtGaWxlTmFtZSwgIi1yIik7CisgICAgICAgIHdhaXRVbnRpbEltZXNBcmVBdmFpbGFibGUoaW1lSWQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbnN0YWxsUG9zc2libGVJbnN0YW50UGFja2FnZSgKKyAgICAgICAgU3RyaW5nIGFwa0ZpbGVOYW1lLCBTdHJpbmcgcGFja2FnZU5hbWUsIGJvb2xlYW4gaW5zdGFudCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpbnN0YW50KSB7CisgICAgICAgICAgICBpbnN0YWxsUGFja2FnZVN5bmMoYXBrRmlsZU5hbWUsIHBhY2thZ2VOYW1lLCAiLXIiLCAiLS1pbnN0YW50Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnN0YWxsUGFja2FnZVN5bmMoYXBrRmlsZU5hbWUsIHBhY2thZ2VOYW1lLCAiLXIiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0U3dpdGNoSW1lKGJvb2xlYW4gaW5zdGFudCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIFRlc3RJbmZvIHRlc3RTd2l0Y2hJbWUxVG9JbWUyID0gbmV3IFRlc3RJbmZvKERldmljZVRlc3RDb25zdGFudHMuUEFDS0FHRSwKICAgICAgICAgICAgICAgICBEZXZpY2VUZXN0Q29uc3RhbnRzLlRFU1RfQ0xBU1MsIERldmljZVRlc3RDb25zdGFudHMuVEVTVF9TV0lUQ0hfSU1FMV9UT19JTUUyKTsKICAgICAgICAgc2VuZFRlc3RTdGFydEV2ZW50KHRlc3RTd2l0Y2hJbWUxVG9JbWUyKTsKLSAgICAgICAgaW5zdGFsbFBhY2thZ2UoSW1lMUNvbnN0YW50cy5BUEssICItciIpOwotICAgICAgICBpbnN0YWxsUGFja2FnZShJbWUyQ29uc3RhbnRzLkFQSywgIi1yIik7CisgICAgICAgIGluc3RhbGxQb3NzaWJsZUluc3RhbnRQYWNrYWdlKAorICAgICAgICAgICAgRWRpdFRleHRBcHBDb25zdGFudHMuQVBLLCBFZGl0VGV4dEFwcENvbnN0YW50cy5QQUNLQUdFLCBpbnN0YW50KTsKKyAgICAgICAgaW5zdGFsbEltZVBhY2thZ2VTeW5jKEltZTFDb25zdGFudHMuQVBLLCBJbWUxQ29uc3RhbnRzLklNRV9JRCk7CisgICAgICAgIGluc3RhbGxJbWVQYWNrYWdlU3luYyhJbWUyQ29uc3RhbnRzLkFQSywgSW1lMkNvbnN0YW50cy5JTUVfSUQpOwogICAgICAgICBzaGVsbChTaGVsbENvbW1hbmRVdGlscy5lbmFibGVJbWUoSW1lMUNvbnN0YW50cy5JTUVfSUQpKTsKICAgICAgICAgc2hlbGwoU2hlbGxDb21tYW5kVXRpbHMuZW5hYmxlSW1lKEltZTJDb25zdGFudHMuSU1FX0lEKSk7Ci0gICAgICAgIHNoZWxsKFNoZWxsQ29tbWFuZFV0aWxzLnNldEN1cnJlbnRJbWUoSW1lMUNvbnN0YW50cy5JTUVfSUQpKTsKKyAgICAgICAgd2FpdFVudGlsSW1lc0FyZUVuYWJsZWQoSW1lMUNvbnN0YW50cy5JTUVfSUQsIEltZTJDb25zdGFudHMuSU1FX0lEKTsKKyAgICAgICAgc2hlbGwoU2hlbGxDb21tYW5kVXRpbHMuc2V0Q3VycmVudEltZVN5bmMoSW1lMUNvbnN0YW50cy5JTUVfSUQpKTsKIAogICAgICAgICBhc3NlcnRUcnVlKHJ1bkRldmljZVRlc3RNZXRob2QodGVzdFN3aXRjaEltZTFUb0ltZTIpKTsKICAgICB9CiAKKyAgICBAQXBwTW9kZUZ1bGwKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RVbmluc3RhbGxDdXJyZW50SW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGluc3RhbGxBbmRTZXRJbWUxKCk7Ci0KLSAgICAgICAgZmluYWwgVGVzdEluZm8gdGVzdEltZTFJc05vdEN1cnJlbnRJbWUgPSBuZXcgVGVzdEluZm8oRGV2aWNlVGVzdENvbnN0YW50cy5QQUNLQUdFLAotICAgICAgICAgICAgICAgIERldmljZVRlc3RDb25zdGFudHMuVEVTVF9DTEFTUywgRGV2aWNlVGVzdENvbnN0YW50cy5URVNUX0lNRTFfSVNfTk9UX0NVUlJFTlRfSU1FKTsKLSAgICAgICAgc2VuZFRlc3RTdGFydEV2ZW50KHRlc3RJbWUxSXNOb3RDdXJyZW50SW1lKTsKLSAgICAgICAgdW5pbnN0YWxsUGFja2FnZUlmRXhpc3RzKEltZTFDb25zdGFudHMuUEFDS0FHRSk7Ci0gICAgICAgIGFzc2VydFRydWUocnVuRGV2aWNlVGVzdE1ldGhvZCh0ZXN0SW1lMUlzTm90Q3VycmVudEltZSkpOwotCi0gICAgICAgIC8vIFRoZXJlIHNob3VsZCBiZSBhIG5ldyBJTUUgdGhhdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgSU1FMQotICAgICAgICBmaW5hbCBTdHJpbmcgbmV3SW1lID0gc2hlbGwoU2hlbGxDb21tYW5kVXRpbHMuZ2V0Q3VycmVudEltZSgpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChuZXdJbWUpOwotICAgICAgICBhc3NlcnRGYWxzZShuZXdJbWUuaXNFbXB0eSgpKTsKLSAgICAgICAgYXNzZXJ0Tm90RXF1YWxzKG5ld0ltZSwgSW1lMUNvbnN0YW50cy5JTUVfSUQpOworICAgIHB1YmxpYyB2b2lkIHRlc3RTd2l0Y2hJbWVGdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RTd2l0Y2hJbWUoZmFsc2UpOwogICAgIH0KIAorICAgIEBBcHBNb2RlSW5zdGFudAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdERpc2FibGVDdXJyZW50SW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGluc3RhbGxBbmRTZXRJbWUxKCk7Ci0KLSAgICAgICAgZmluYWwgVGVzdEluZm8gdGVzdEltZTFJc05vdEN1cnJlbnRJbWUgPSBuZXcgVGVzdEluZm8oRGV2aWNlVGVzdENvbnN0YW50cy5QQUNLQUdFLAotICAgICAgICAgICAgICAgIERldmljZVRlc3RDb25zdGFudHMuVEVTVF9DTEFTUywgRGV2aWNlVGVzdENvbnN0YW50cy5URVNUX0lNRTFfSVNfTk9UX0NVUlJFTlRfSU1FKTsKLSAgICAgICAgc2VuZFRlc3RTdGFydEV2ZW50KHRlc3RJbWUxSXNOb3RDdXJyZW50SW1lKTsKLSAgICAgICAgc2hlbGwoU2hlbGxDb21tYW5kVXRpbHMuZGlzYWJsZUltZShJbWUxQ29uc3RhbnRzLklNRV9JRCkpOwotICAgICAgICBhc3NlcnRUcnVlKHJ1bkRldmljZVRlc3RNZXRob2QodGVzdEltZTFJc05vdEN1cnJlbnRJbWUpKTsKLQotICAgICAgICAvLyBUaGVyZSBzaG91bGQgYmUgYSBuZXcgSU1FIHRoYXQgaXMgZGlmZmVyZW50IGZyb20gdGhlIElNRTEKLSAgICAgICAgZmluYWwgU3RyaW5nIG5ld0ltZSA9IHNoZWxsKFNoZWxsQ29tbWFuZFV0aWxzLmdldEN1cnJlbnRJbWUoKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwobmV3SW1lKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UobmV3SW1lLmlzRW1wdHkoKSk7Ci0gICAgICAgIGFzc2VydE5vdEVxdWFscyhuZXdJbWUsIEltZTFDb25zdGFudHMuSU1FX0lEKTsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3dpdGNoSW1lSW5zdGFudCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0U3dpdGNoSW1lKHRydWUpOwogICAgIH0KIAotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNlYXJjaFZpZXdfZ2l2ZUZvY3VzU2hvd0ltZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpbnN0YWxsQW5kU2V0SW1lMSgpOwotCi0gICAgICAgIGZpbmFsIFRlc3RJbmZvIHRlc3RHaXZlRm9jdXNTaG93SW1lMSA9IG5ldyBUZXN0SW5mbyhEZXZpY2VUZXN0Q29uc3RhbnRzLlBBQ0tBR0UsCi0gICAgICAgICAgICAgICAgRGV2aWNlVGVzdENvbnN0YW50cy5URVNUX0NMQVNTLAotICAgICAgICAgICAgICAgIERldmljZVRlc3RDb25zdGFudHMuVEVTVF9TRUFSQ0hfVklFV19HSVZFX0ZPQ1VTX1NIT1dfSU1FMSk7Ci0gICAgICAgIHNlbmRUZXN0U3RhcnRFdmVudCh0ZXN0R2l2ZUZvY3VzU2hvd0ltZTEpOwotICAgICAgICBhc3NlcnRUcnVlKHJ1bkRldmljZVRlc3RNZXRob2QodGVzdEdpdmVGb2N1c1Nob3dJbWUxKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VhcmNoVmlld19zZXRRdWVyeUhpZGVJbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaW5zdGFsbEFuZFNldEltZTEoKTsKLQotICAgICAgICBmaW5hbCBUZXN0SW5mbyB0ZXN0U2V0UXVlcnlIaWRlSW1lMSA9IG5ldyBUZXN0SW5mbyhEZXZpY2VUZXN0Q29uc3RhbnRzLlBBQ0tBR0UsCi0gICAgICAgICAgICAgICAgRGV2aWNlVGVzdENvbnN0YW50cy5URVNUX0NMQVNTLAotICAgICAgICAgICAgICAgIERldmljZVRlc3RDb25zdGFudHMuVEVTVF9TRUFSQ0hfVklFV19TRVRfUVVFUllfSElERV9JTUUxKTsKLSAgICAgICAgc2VuZFRlc3RTdGFydEV2ZW50KHRlc3RTZXRRdWVyeUhpZGVJbWUxKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShydW5EZXZpY2VUZXN0TWV0aG9kKHRlc3RTZXRRdWVyeUhpZGVJbWUxKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluc3RhbGxBbmRTZXRJbWUxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHJpdmF0ZSB2b2lkIHRlc3RVbmluc3RhbGxDdXJyZW50SW1lKGJvb2xlYW4gaW5zdGFudCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIFRlc3RJbmZvIHRlc3RDcmVhdGVJbWUxID0gbmV3IFRlc3RJbmZvKERldmljZVRlc3RDb25zdGFudHMuUEFDS0FHRSwKLSAgICAgICAgICAgIERldmljZVRlc3RDb25zdGFudHMuVEVTVF9DTEFTUywgRGV2aWNlVGVzdENvbnN0YW50cy5URVNUX0NSRUFURV9JTUUxKTsKKyAgICAgICAgICAgICAgICBEZXZpY2VUZXN0Q29uc3RhbnRzLlRFU1RfQ0xBU1MsIERldmljZVRlc3RDb25zdGFudHMuVEVTVF9DUkVBVEVfSU1FMSk7CiAgICAgICAgIHNlbmRUZXN0U3RhcnRFdmVudCh0ZXN0Q3JlYXRlSW1lMSk7Ci0gICAgICAgIGluc3RhbGxQYWNrYWdlKEltZTFDb25zdGFudHMuQVBLLCAiLXIiKTsKKyAgICAgICAgaW5zdGFsbFBvc3NpYmxlSW5zdGFudFBhY2thZ2UoCisgICAgICAgICAgICBFZGl0VGV4dEFwcENvbnN0YW50cy5BUEssIEVkaXRUZXh0QXBwQ29uc3RhbnRzLlBBQ0tBR0UsIGluc3RhbnQpOworICAgICAgICBpbnN0YWxsSW1lUGFja2FnZVN5bmMoSW1lMUNvbnN0YW50cy5BUEssIEltZTFDb25zdGFudHMuSU1FX0lEKTsKICAgICAgICAgc2hlbGwoU2hlbGxDb21tYW5kVXRpbHMuZW5hYmxlSW1lKEltZTFDb25zdGFudHMuSU1FX0lEKSk7Ci0gICAgICAgIHNoZWxsKFNoZWxsQ29tbWFuZFV0aWxzLnNldEN1cnJlbnRJbWUoSW1lMUNvbnN0YW50cy5JTUVfSUQpKTsKKyAgICAgICAgd2FpdFVudGlsSW1lc0FyZUVuYWJsZWQoSW1lMUNvbnN0YW50cy5JTUVfSUQpOworCisgICAgICAgIHNoZWxsKFNoZWxsQ29tbWFuZFV0aWxzLnNldEN1cnJlbnRJbWVTeW5jKEltZTFDb25zdGFudHMuSU1FX0lEKSk7CiAgICAgICAgIGFzc2VydFRydWUocnVuRGV2aWNlVGVzdE1ldGhvZCh0ZXN0Q3JlYXRlSW1lMSkpOworCisgICAgICAgIHVuaW5zdGFsbFBhY2thZ2VTeW5jSWZFeGlzdHMoSW1lMUNvbnN0YW50cy5QQUNLQUdFKTsKKyAgICAgICAgYXNzZXJ0SW1lTm90U2VsZWN0ZWRJblNlY3VyZVNldHRpbmdzKEltZTFDb25zdGFudHMuSU1FX0lELCBXQUlUX1RJTUVPVVQpOworICAgIH0KKworICAgIEBBcHBNb2RlRnVsbAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVuaW5zdGFsbEN1cnJlbnRJbWVGdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RVbmluc3RhbGxDdXJyZW50SW1lKGZhbHNlKTsKKyAgICB9CisKKyAgICBAQXBwTW9kZUluc3RhbnQKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVbmluc3RhbGxDdXJyZW50SW1lSW5zdGFudCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0VW5pbnN0YWxsQ3VycmVudEltZSh0cnVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdERpc2FibGVDdXJyZW50SW1lKGJvb2xlYW4gaW5zdGFudCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFRlc3RJbmZvIHRlc3RDcmVhdGVJbWUxID0gbmV3IFRlc3RJbmZvKERldmljZVRlc3RDb25zdGFudHMuUEFDS0FHRSwKKyAgICAgICAgICAgICAgICBEZXZpY2VUZXN0Q29uc3RhbnRzLlRFU1RfQ0xBU1MsIERldmljZVRlc3RDb25zdGFudHMuVEVTVF9DUkVBVEVfSU1FMSk7CisgICAgICAgIHNlbmRUZXN0U3RhcnRFdmVudCh0ZXN0Q3JlYXRlSW1lMSk7CisgICAgICAgIGluc3RhbGxQb3NzaWJsZUluc3RhbnRQYWNrYWdlKAorICAgICAgICAgICAgRWRpdFRleHRBcHBDb25zdGFudHMuQVBLLCBFZGl0VGV4dEFwcENvbnN0YW50cy5QQUNLQUdFLCBpbnN0YW50KTsKKyAgICAgICAgaW5zdGFsbEltZVBhY2thZ2VTeW5jKEltZTFDb25zdGFudHMuQVBLLCBJbWUxQ29uc3RhbnRzLklNRV9JRCk7CisgICAgICAgIHNoZWxsKFNoZWxsQ29tbWFuZFV0aWxzLmVuYWJsZUltZShJbWUxQ29uc3RhbnRzLklNRV9JRCkpOworICAgICAgICB3YWl0VW50aWxJbWVzQXJlRW5hYmxlZChJbWUxQ29uc3RhbnRzLklNRV9JRCk7CisgICAgICAgIHNoZWxsKFNoZWxsQ29tbWFuZFV0aWxzLnNldEN1cnJlbnRJbWVTeW5jKEltZTFDb25zdGFudHMuSU1FX0lEKSk7CisgICAgICAgIGFzc2VydFRydWUocnVuRGV2aWNlVGVzdE1ldGhvZCh0ZXN0Q3JlYXRlSW1lMSkpOworCisgICAgICAgIHNoZWxsKFNoZWxsQ29tbWFuZFV0aWxzLmRpc2FibGVJbWUoSW1lMUNvbnN0YW50cy5JTUVfSUQpKTsKKyAgICAgICAgYXNzZXJ0SW1lTm90U2VsZWN0ZWRJblNlY3VyZVNldHRpbmdzKEltZTFDb25zdGFudHMuSU1FX0lELCBXQUlUX1RJTUVPVVQpOworICAgIH0KKworICAgIEBBcHBNb2RlRnVsbAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERpc2FibGVDdXJyZW50SW1lRnVsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0RGlzYWJsZUN1cnJlbnRJbWUoZmFsc2UpOworICAgIH0KKworICAgIEBBcHBNb2RlSW5zdGFudAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERpc2FibGVDdXJyZW50SW1lSW5zdGFudCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0RGlzYWJsZUN1cnJlbnRJbWUodHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RTd2l0Y2hJbnB1dE1ldGhvZChib29sZWFuIGluc3RhbnQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBUZXN0SW5mbyB0ZXN0U2V0SW5wdXRNZXRob2QgPSBuZXcgVGVzdEluZm8oCisgICAgICAgICAgICAgICAgRGV2aWNlVGVzdENvbnN0YW50cy5QQUNLQUdFLCBEZXZpY2VUZXN0Q29uc3RhbnRzLlRFU1RfQ0xBU1MsCisgICAgICAgICAgICAgICAgRGV2aWNlVGVzdENvbnN0YW50cy5URVNUX1NXSVRDSF9JTlBVVE1FVEhPRCk7CisgICAgICAgIHNlbmRUZXN0U3RhcnRFdmVudCh0ZXN0U2V0SW5wdXRNZXRob2QpOworICAgICAgICBpbnN0YWxsUG9zc2libGVJbnN0YW50UGFja2FnZSgKKyAgICAgICAgICAgIEVkaXRUZXh0QXBwQ29uc3RhbnRzLkFQSywgRWRpdFRleHRBcHBDb25zdGFudHMuUEFDS0FHRSwgaW5zdGFudCk7CisgICAgICAgIGluc3RhbGxJbWVQYWNrYWdlU3luYyhJbWUxQ29uc3RhbnRzLkFQSywgSW1lMUNvbnN0YW50cy5JTUVfSUQpOworICAgICAgICBpbnN0YWxsSW1lUGFja2FnZVN5bmMoSW1lMkNvbnN0YW50cy5BUEssIEltZTJDb25zdGFudHMuSU1FX0lEKTsKKyAgICAgICAgc2hlbGwoU2hlbGxDb21tYW5kVXRpbHMuZW5hYmxlSW1lKEltZTFDb25zdGFudHMuSU1FX0lEKSk7CisgICAgICAgIHNoZWxsKFNoZWxsQ29tbWFuZFV0aWxzLmVuYWJsZUltZShJbWUyQ29uc3RhbnRzLklNRV9JRCkpOworICAgICAgICB3YWl0VW50aWxJbWVzQXJlRW5hYmxlZChJbWUxQ29uc3RhbnRzLklNRV9JRCwgSW1lMkNvbnN0YW50cy5JTUVfSUQpOworICAgICAgICBzaGVsbChTaGVsbENvbW1hbmRVdGlscy5zZXRDdXJyZW50SW1lU3luYyhJbWUxQ29uc3RhbnRzLklNRV9JRCkpOworCisgICAgICAgIGFzc2VydFRydWUocnVuRGV2aWNlVGVzdE1ldGhvZCh0ZXN0U2V0SW5wdXRNZXRob2QpKTsKKyAgICB9CisKKyAgICBAQXBwTW9kZUZ1bGwKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTd2l0Y2hJbnB1dE1ldGhvZEZ1bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdFN3aXRjaElucHV0TWV0aG9kKGZhbHNlKTsKKyAgICB9CisKKyAgICBAQXBwTW9kZUluc3RhbnQKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTd2l0Y2hJbnB1dE1ldGhvZEluc3RhbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdFN3aXRjaElucHV0TWV0aG9kKHRydWUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0U3dpdGNoVG9OZXh0SW5wdXQoYm9vbGVhbiBpbnN0YW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgVGVzdEluZm8gdGVzdFN3aXRjaElucHV0cyA9IG5ldyBUZXN0SW5mbygKKyAgICAgICAgICAgICAgICBEZXZpY2VUZXN0Q29uc3RhbnRzLlBBQ0tBR0UsIERldmljZVRlc3RDb25zdGFudHMuVEVTVF9DTEFTUywKKyAgICAgICAgICAgICAgICBEZXZpY2VUZXN0Q29uc3RhbnRzLlRFU1RfU1dJVENIX05FWFRfSU5QVVQpOworICAgICAgICBzZW5kVGVzdFN0YXJ0RXZlbnQodGVzdFN3aXRjaElucHV0cyk7CisgICAgICAgIGluc3RhbGxQb3NzaWJsZUluc3RhbnRQYWNrYWdlKAorICAgICAgICAgICAgRWRpdFRleHRBcHBDb25zdGFudHMuQVBLLCBFZGl0VGV4dEFwcENvbnN0YW50cy5QQUNLQUdFLCBpbnN0YW50KTsKKyAgICAgICAgaW5zdGFsbEltZVBhY2thZ2VTeW5jKEltZTFDb25zdGFudHMuQVBLLCBJbWUxQ29uc3RhbnRzLklNRV9JRCk7CisgICAgICAgIGluc3RhbGxJbWVQYWNrYWdlU3luYyhJbWUyQ29uc3RhbnRzLkFQSywgSW1lMkNvbnN0YW50cy5JTUVfSUQpOworICAgICAgICBzaGVsbChTaGVsbENvbW1hbmRVdGlscy5lbmFibGVJbWUoSW1lMUNvbnN0YW50cy5JTUVfSUQpKTsKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIG1vcmUgSU1FIHRoYXQgc3BlY2lmaWVzCisgICAgICAgIC8vIHN1cHBvcnRzU3dpdGNoaW5nVG9OZXh0SW5wdXRNZXRob2Q9InRydWUiCisgICAgICAgIHNoZWxsKFNoZWxsQ29tbWFuZFV0aWxzLmVuYWJsZUltZShJbWUyQ29uc3RhbnRzLklNRV9JRCkpOworICAgICAgICB3YWl0VW50aWxJbWVzQXJlRW5hYmxlZChJbWUxQ29uc3RhbnRzLklNRV9JRCwgSW1lMkNvbnN0YW50cy5JTUVfSUQpOworICAgICAgICBzaGVsbChTaGVsbENvbW1hbmRVdGlscy5zZXRDdXJyZW50SW1lU3luYyhJbWUxQ29uc3RhbnRzLklNRV9JRCkpOworCisgICAgICAgIGFzc2VydFRydWUocnVuRGV2aWNlVGVzdE1ldGhvZCh0ZXN0U3dpdGNoSW5wdXRzKSk7CisgICAgfQorCisgICAgQEFwcE1vZGVGdWxsCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3dpdGNoVG9OZXh0SW5wdXRGdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RTd2l0Y2hUb05leHRJbnB1dChmYWxzZSk7CisgICAgfQorCisgICAgQEFwcE1vZGVJbnN0YW50CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3dpdGNoVG9OZXh0SW5wdXRJbnN0YW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RTd2l0Y2hUb05leHRJbnB1dCh0cnVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdFN3aXRjaFRvUHJldmlvdXNJbnB1dChib29sZWFuIGluc3RhbnQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBUZXN0SW5mbyB0ZXN0U3dpdGNoSW5wdXRzID0gbmV3IFRlc3RJbmZvKAorICAgICAgICAgICAgICAgIERldmljZVRlc3RDb25zdGFudHMuUEFDS0FHRSwgRGV2aWNlVGVzdENvbnN0YW50cy5URVNUX0NMQVNTLAorICAgICAgICAgICAgICAgIERldmljZVRlc3RDb25zdGFudHMuVEVTVF9TV0lUQ0hfUFJFVklPVVNfSU5QVVQpOworICAgICAgICBzZW5kVGVzdFN0YXJ0RXZlbnQodGVzdFN3aXRjaElucHV0cyk7CisgICAgICAgIGluc3RhbGxQb3NzaWJsZUluc3RhbnRQYWNrYWdlKAorICAgICAgICAgICAgRWRpdFRleHRBcHBDb25zdGFudHMuQVBLLCBFZGl0VGV4dEFwcENvbnN0YW50cy5QQUNLQUdFLCBpbnN0YW50KTsKKyAgICAgICAgaW5zdGFsbEltZVBhY2thZ2VTeW5jKEltZTFDb25zdGFudHMuQVBLLCBJbWUxQ29uc3RhbnRzLklNRV9JRCk7CisgICAgICAgIGluc3RhbGxJbWVQYWNrYWdlU3luYyhJbWUyQ29uc3RhbnRzLkFQSywgSW1lMkNvbnN0YW50cy5JTUVfSUQpOworICAgICAgICBzaGVsbChTaGVsbENvbW1hbmRVdGlscy5lbmFibGVJbWUoSW1lMUNvbnN0YW50cy5JTUVfSUQpKTsKKyAgICAgICAgc2hlbGwoU2hlbGxDb21tYW5kVXRpbHMuZW5hYmxlSW1lKEltZTJDb25zdGFudHMuSU1FX0lEKSk7CisgICAgICAgIHdhaXRVbnRpbEltZXNBcmVFbmFibGVkKEltZTFDb25zdGFudHMuSU1FX0lELCBJbWUyQ29uc3RhbnRzLklNRV9JRCk7CisgICAgICAgIHNoZWxsKFNoZWxsQ29tbWFuZFV0aWxzLnNldEN1cnJlbnRJbWVTeW5jKEltZTFDb25zdGFudHMuSU1FX0lEKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShydW5EZXZpY2VUZXN0TWV0aG9kKHRlc3RTd2l0Y2hJbnB1dHMpKTsKKyAgICB9CisKKyAgICBAQXBwTW9kZUZ1bGwKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTd2l0Y2hUb1ByZXZpb3VzSW5wdXRGdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RTd2l0Y2hUb1ByZXZpb3VzSW5wdXQoZmFsc2UpOworICAgIH0KKworICAgIEBBcHBNb2RlSW5zdGFudAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN3aXRjaFRvUHJldmlvdXNJbnB1dEluc3RhbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdFN3aXRjaFRvUHJldmlvdXNJbnB1dCh0cnVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdElucHV0VW5iaW5kc09uSW1lU3RvcHBlZChib29sZWFuIGluc3RhbnQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBUZXN0SW5mbyB0ZXN0VW5iaW5kID0gbmV3IFRlc3RJbmZvKAorICAgICAgICAgICAgICAgIERldmljZVRlc3RDb25zdGFudHMuUEFDS0FHRSwgRGV2aWNlVGVzdENvbnN0YW50cy5URVNUX0NMQVNTLAorICAgICAgICAgICAgICAgIERldmljZVRlc3RDb25zdGFudHMuVEVTVF9JTlBVVF9VTkJJTkRTX09OX0lNRV9TVE9QUEVEKTsKKyAgICAgICAgc2VuZFRlc3RTdGFydEV2ZW50KHRlc3RVbmJpbmQpOworICAgICAgICBpbnN0YWxsUG9zc2libGVJbnN0YW50UGFja2FnZSgKKyAgICAgICAgICAgIEVkaXRUZXh0QXBwQ29uc3RhbnRzLkFQSywgRWRpdFRleHRBcHBDb25zdGFudHMuUEFDS0FHRSwgaW5zdGFudCk7CisgICAgICAgIGluc3RhbGxJbWVQYWNrYWdlU3luYyhJbWUxQ29uc3RhbnRzLkFQSywgSW1lMUNvbnN0YW50cy5JTUVfSUQpOworICAgICAgICBpbnN0YWxsSW1lUGFja2FnZVN5bmMoSW1lMkNvbnN0YW50cy5BUEssIEltZTJDb25zdGFudHMuSU1FX0lEKTsKKyAgICAgICAgc2hlbGwoU2hlbGxDb21tYW5kVXRpbHMuZW5hYmxlSW1lKEltZTFDb25zdGFudHMuSU1FX0lEKSk7CisgICAgICAgIHNoZWxsKFNoZWxsQ29tbWFuZFV0aWxzLmVuYWJsZUltZShJbWUyQ29uc3RhbnRzLklNRV9JRCkpOworICAgICAgICB3YWl0VW50aWxJbWVzQXJlRW5hYmxlZChJbWUxQ29uc3RhbnRzLklNRV9JRCwgSW1lMkNvbnN0YW50cy5JTUVfSUQpOworICAgICAgICBzaGVsbChTaGVsbENvbW1hbmRVdGlscy5zZXRDdXJyZW50SW1lU3luYyhJbWUxQ29uc3RhbnRzLklNRV9JRCkpOworCisgICAgICAgIGFzc2VydFRydWUocnVuRGV2aWNlVGVzdE1ldGhvZCh0ZXN0VW5iaW5kKSk7CisgICAgfQorCisgICAgQEFwcE1vZGVGdWxsCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5wdXRVbmJpbmRzT25JbWVTdG9wcGVkRnVsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0SW5wdXRVbmJpbmRzT25JbWVTdG9wcGVkKGZhbHNlKTsKKyAgICB9CisKKyAgICBAQXBwTW9kZUluc3RhbnQKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnB1dFVuYmluZHNPbkltZVN0b3BwZWRJbnN0YW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RJbnB1dFVuYmluZHNPbkltZVN0b3BwZWQodHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RJbnB1dFVuYmluZHNPbkFwcFN0b3AoYm9vbGVhbiBpbnN0YW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgVGVzdEluZm8gdGVzdFVuYmluZCA9IG5ldyBUZXN0SW5mbygKKyAgICAgICAgICAgICAgICBEZXZpY2VUZXN0Q29uc3RhbnRzLlBBQ0tBR0UsIERldmljZVRlc3RDb25zdGFudHMuVEVTVF9DTEFTUywKKyAgICAgICAgICAgICAgICBEZXZpY2VUZXN0Q29uc3RhbnRzLlRFU1RfSU5QVVRfVU5CSU5EU19PTl9BUFBfU1RPUFBFRCk7CisgICAgICAgIHNlbmRUZXN0U3RhcnRFdmVudCh0ZXN0VW5iaW5kKTsKKyAgICAgICAgaW5zdGFsbFBvc3NpYmxlSW5zdGFudFBhY2thZ2UoCisgICAgICAgICAgICBFZGl0VGV4dEFwcENvbnN0YW50cy5BUEssIEVkaXRUZXh0QXBwQ29uc3RhbnRzLlBBQ0tBR0UsIGluc3RhbnQpOworICAgICAgICBpbnN0YWxsSW1lUGFja2FnZVN5bmMoSW1lMUNvbnN0YW50cy5BUEssIEltZTFDb25zdGFudHMuSU1FX0lEKTsKKyAgICAgICAgc2hlbGwoU2hlbGxDb21tYW5kVXRpbHMuZW5hYmxlSW1lKEltZTFDb25zdGFudHMuSU1FX0lEKSk7CisgICAgICAgIHdhaXRVbnRpbEltZXNBcmVFbmFibGVkKEltZTFDb25zdGFudHMuSU1FX0lEKTsKKyAgICAgICAgc2hlbGwoU2hlbGxDb21tYW5kVXRpbHMuc2V0Q3VycmVudEltZVN5bmMoSW1lMUNvbnN0YW50cy5JTUVfSUQpKTsKKworICAgICAgICBhc3NlcnRUcnVlKHJ1bkRldmljZVRlc3RNZXRob2QodGVzdFVuYmluZCkpOworICAgIH0KKworICAgIEBBcHBNb2RlRnVsbAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElucHV0VW5iaW5kc09uQXBwU3RvcEZ1bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdElucHV0VW5iaW5kc09uQXBwU3RvcChmYWxzZSk7CisgICAgfQorCisgICAgQEFwcE1vZGVJbnN0YW50CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5wdXRVbmJpbmRzT25BcHBTdG9wSW5zdGFudCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0SW5wdXRVbmJpbmRzT25BcHBTdG9wKHRydWUpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBzZW5kVGVzdFN0YXJ0RXZlbnQoZmluYWwgVGVzdEluZm8gZGV2aWNlVGVzdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0xNjUsMTMgKzM1OCw2NCBAQAogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBjbGVhblVwVGVzdEltZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdW5pbnN0YWxsUGFja2FnZUlmRXhpc3RzKEltZTFDb25zdGFudHMuUEFDS0FHRSk7Ci0gICAgICAgIHVuaW5zdGFsbFBhY2thZ2VJZkV4aXN0cyhJbWUyQ29uc3RhbnRzLlBBQ0tBR0UpOworICAgICAgICB1bmluc3RhbGxQYWNrYWdlU3luY0lmRXhpc3RzKEltZTFDb25zdGFudHMuUEFDS0FHRSk7CisgICAgICAgIHVuaW5zdGFsbFBhY2thZ2VTeW5jSWZFeGlzdHMoSW1lMkNvbnN0YW50cy5QQUNLQUdFKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgdW5pbnN0YWxsUGFja2FnZUlmRXhpc3RzKGZpbmFsIFN0cmluZyBwYWNrYWdlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChpc1BhY2thZ2VJbnN0YWxsZWQocGFja2FnZU5hbWUpKSB7Ci0gICAgICAgICAgICB1bmluc3RhbGxQYWNrYWdlKHBhY2thZ2VOYW1lKTsKKyAgICBwcml2YXRlIHZvaWQgdW5pbnN0YWxsUGFja2FnZVN5bmNJZkV4aXN0cyhmaW5hbCBTdHJpbmcgcGFja2FnZU5hbWUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoaXNQYWNrYWdlSW5zdGFsbGVkKGdldERldmljZSgpLCBwYWNrYWdlTmFtZSkpIHsKKyAgICAgICAgICAgIHVuaW5zdGFsbFBhY2thZ2UoZ2V0RGV2aWNlKCksIHBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgIHBvbGxpbmdDaGVjaygoKS0+ICFpc1BhY2thZ2VJbnN0YWxsZWQoZ2V0RGV2aWNlKCksIHBhY2thZ2VOYW1lKSwKKyAgICAgICAgICAgICAgICBQQUNLQUdFX09QX1RJTUVPVVQsCisgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUgKyAiIHNob3VsZCBiZSB1bmluc3RhbGxlZC4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE1ha2VzIHN1cmUgdGhhdCB0aGUgZ2l2ZW4gSU1FIGlzIG5vdCBpbiB0aGUgc3RvcmVkIGluIHRoZSBzZWN1cmUgc2V0dGluZ3MgYXMgdGhlIGN1cnJlbnQgSU1FLgorICAgICAqCisgICAgICogQHBhcmFtIGltZUlkIElNRSBJRCB0byBiZSBtb25pdG9yZWQKKyAgICAgKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydEltZU5vdFNlbGVjdGVkSW5TZWN1cmVTZXR0aW5ncyhTdHJpbmcgaW1lSWQsIGxvbmcgdGltZW91dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpZiAodGltZW91dCA8IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVGltZW91dEV4Y2VwdGlvbihpbWVJZCArICIgaXMgc3RpbGwgdGhlIGN1cnJlbnQgSU1FIGV2ZW4gYWZ0ZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyB0aW1lb3V0ICsgIiBtc2VjLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFpbWVJZC5lcXVhbHMoc2hlbGwoU2hlbGxDb21tYW5kVXRpbHMuZ2V0Q3VycmVudEltZSgpKSkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChQT0xMSU5HX0lOVEVSVkFMKTsKKyAgICAgICAgICAgIHRpbWVvdXQgLT0gUE9MTElOR19JTlRFUlZBTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFdhaXQgdW50aWwgSU1FcyBhcmUgYXZhaWxhYmxlIGluIElNTVMuCisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgd2FpdFVudGlsSW1lc0FyZUF2YWlsYWJsZShTdHJpbmcuLi4gaW1lSWRzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgd2FpdFVudGlsSW1lc0FyZUF2YWlsYWJsZU9yRW5hYmxlZChmYWxzZSwgaW1lSWRzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXYWl0IHVudGlsIElNRXMgYXJlIGVuYWJsZWQgaW4gSU1NUy4KKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB3YWl0VW50aWxJbWVzQXJlRW5hYmxlZChTdHJpbmcuLi4gaW1lSWRzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgd2FpdFVudGlsSW1lc0FyZUF2YWlsYWJsZU9yRW5hYmxlZCh0cnVlLCBpbWVJZHMpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB3YWl0VW50aWxJbWVzQXJlQXZhaWxhYmxlT3JFbmFibGVkKAorICAgICAgICBib29sZWFuIHNob3VsZEJlRW5hYmxlZCwgU3RyaW5nLi4uIGltZUlkcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBjbWQgPSBzaG91bGRCZUVuYWJsZWQgPworICAgICAgICAgICAgICAgIFNoZWxsQ29tbWFuZFV0aWxzLmdldEVuYWJsZWRJbWVzKCkgOiBTaGVsbENvbW1hbmRVdGlscy5nZXRBdmFpbGFibGVJbWVzKCk7CisgICAgICAgIGZvciAoU3RyaW5nIGltZUlkIDogaW1lSWRzKSB7CisgICAgICAgICAgICBwb2xsaW5nQ2hlY2soKCkgLT4KKyAgICAgICAgICAgICAgICAgICAgc2hlbGwoY21kKS5jb250YWlucyhpbWVJZCksCisgICAgICAgICAgICAgICAgICAgIFBBQ0tBR0VfT1BfVElNRU9VVCwKKyAgICAgICAgICAgICAgICAgICAgaW1lSWQgKyAiIHNob3VsZCBiZSAiICsgKHNob3VsZEJlRW5hYmxlZD8gImVuYWJsZWQuIiA6ICJhdmFpbGFibGUuIikpOwogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qZHdwc2VjdXJpdHkvQW5kcm9pZFRlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9qZHdwc2VjdXJpdHkvQW5kcm9pZFRlc3QueG1sCmluZGV4IDRiMjNkMTkuLmYwNjI1MDggMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvamR3cHNlY3VyaXR5L0FuZHJvaWRUZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2pkd3BzZWN1cml0eS9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIHRoZSBDVFMgSkRXUCBob3N0IHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJhcnQiIC8+CiAgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRlc3R0eXBlLkphckhvc3RUZXN0IiA+CiAgICAgICAgIDxvcHRpb24gbmFtZT0iamFyIiB2YWx1ZT0iQ3RzSmR3cFNlY3VyaXR5SG9zdFRlc3RDYXNlcy5qYXIiIC8+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL2FsbG9jYXRpb24tdHJhY2tpbmcvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvanZtdGkvYWxsb2NhdGlvbi10cmFja2luZy9BbmRyb2lkLm1rCmluZGV4IDYzNGIwZjYuLjE1YzNlNTAgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvYWxsb2NhdGlvbi10cmFja2luZy9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvYWxsb2NhdGlvbi10cmFja2luZy9BbmRyb2lkLm1rCkBAIC0xNywxMSArMTcsNSBAQAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKIExPQ0FMX01PRFVMRSA6PSBDdHNKdm10aVRyYWNraW5nSG9zdFRlc3RDYXNlcwotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IEN0c0p2bXRpSG9zdFRlc3RCYXNlCi1MT0NBTF9KQVJKQVJfUlVMRVMgOj0gJChMT0NBTF9QQVRIKS9qYXJqYXItcnVsZXMudHh0Ci1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKIAotaW5jbHVkZSAkKEJVSUxEX0hPU1RfSkFWQV9MSUJSQVJZKQotCi1pbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCitpbmNsdWRlICQoTE9DQUxfUEFUSCkvLi4vaG9zdF9zaWRlLm1rCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL2FsbG9jYXRpb24tdHJhY2tpbmcvQW5kcm9pZFRlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9hbGxvY2F0aW9uLXRyYWNraW5nL0FuZHJvaWRUZXN0LnhtbAppbmRleCA3MDZiZGVmLi4yMWE1Y2M3IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2p2bXRpL2FsbG9jYXRpb24tdHJhY2tpbmcvQW5kcm9pZFRlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvYWxsb2NhdGlvbi10cmFja2luZy9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iYXJ0IiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL2FsbG9jYXRpb24tdHJhY2tpbmcvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL2FsbG9jYXRpb24tdHJhY2tpbmcvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggNzZkNzUzYy4uMDI0ZjA4NCAxMDA3NTUKLS0tIGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9hbGxvY2F0aW9uLXRyYWNraW5nL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvYWxsb2NhdGlvbi10cmFja2luZy9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjYsNyArMjYsNyBAQAogCiAgICAgPCEtLSAgc2VsZi1pbnN0cnVtZW50aW5nIHRlc3QgcGFja2FnZS4gLS0+CiAgICAgPGluc3RydW1lbnRhdGlvbgotICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgdGVzdHMgZm9yIEpWTVRJIgogICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuanZtdGkuY3RzLnRyYWNraW5nIiA+CiAgICAgPC9pbnN0cnVtZW50YXRpb24+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL2FsbG9jYXRpb24tdHJhY2tpbmcvYXBwL3NyYy9hbmRyb2lkL2p2bXRpL2N0cy9Kdm10aVRyYWNraW5nVGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9hbGxvY2F0aW9uLXRyYWNraW5nL2FwcC9zcmMvYW5kcm9pZC9qdm10aS9jdHMvSnZtdGlUcmFja2luZ1Rlc3QuamF2YQppbmRleCA3YTEzZTc5Li42YzIyZjM3IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2p2bXRpL2FsbG9jYXRpb24tdHJhY2tpbmcvYXBwL3NyYy9hbmRyb2lkL2p2bXRpL2N0cy9Kdm10aVRyYWNraW5nVGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvYWxsb2NhdGlvbi10cmFja2luZy9hcHAvc3JjL2FuZHJvaWQvanZtdGkvY3RzL0p2bXRpVHJhY2tpbmdUZXN0LmphdmEKQEAgLTIyLDE2ICsyMiwxMiBAQAogaW1wb3J0IGFydC5NYWluOwogCiAvKioKLSAqIENoZWNrIHRhZ2dpbmctcmVsYXRlZCBmdW5jdGlvbmFsaXR5LgorICogQ2hlY2sgdHJhY2tpbmctcmVsYXRlZCBmdW5jdGlvbmFsaXR5LgogICovCiBwdWJsaWMgY2xhc3MgSnZtdGlUcmFja2luZ1Rlc3QgZXh0ZW5kcyBKdm10aVRlc3RCYXNlIHsKIAogICAgIEBCZWZvcmUKICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBCaW5kIG91ciBuYXRpdmUgbWV0aG9kcy4KLSAgICAgICAgTWFpbi5iaW5kQWdlbnRKTkkoImFuZHJvaWQvanZtdGkvY3RzL0p2bXRpVHJhY2tpbmdUZXN0IiwKLSAgICAgICAgICAgICAgICBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpOwotCiAgICAgICAgIHByZWZldGNoQ2xhc3NOYW1lcygpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9hdHRhY2hpbmcvYXBwL2puaS9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9hdHRhY2hpbmcvYXBwL2puaS9BbmRyb2lkLm1rCmluZGV4IDE2ZjJiYzEuLmEyYzFkYjYgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvYXR0YWNoaW5nL2FwcC9qbmkvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL2F0dGFjaGluZy9hcHAvam5pL0FuZHJvaWQubWsKQEAgLTI3LDE0ICsyNywxNSBAQAogTE9DQUxfSEVBREVSX0xJQlJBUklFUyA6PSBsaWJvcGVuamRranZtdGlfaGVhZGVycwogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmxvZyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGxpYmRsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYmRsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGliegogCiAjIFRoZSB0ZXN0IGltcGxlbWVudGF0aW9uLiBXZSBnZXQgdGhpcyBwcm92aWRlZCBieSBBUlQuCiAjIE5vdGU6IE5lZWRzIHRvIGJlICJ3aG9sZSIgYXMgdGhpcyBleHBvc2VzIEpOSSBmdW5jdGlvbnMuCiBMT0NBTF9XSE9MRV9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYmN0c3RpYWdlbnQKIAotIyBQbGF0Zm9ybSBsaWJyYXJpZXMgdGhhdCBhcmUgbm90IGF2YWlsYWJsZSB0byBhcHBzLiBMaW5rIGluIHN0YXRpY2FsbHkuCi1MT0NBTF9TVEFUSUNfTElCUkFSSUVTICs9IGxpYmJhc2UKKyMgUGxhdGZvcm0gbGlicmFyaWVzIHRoYXQgbWF5IG5vdCBiZSBhdmFpbGFibGUgdG8gYXBwcy4gTGluayBpbiBzdGF0aWNhbGx5LgorTE9DQUxfU1RBVElDX0xJQlJBUklFUyArPSBsaWJiYXNlX25kawogCiBMT0NBTF9TVFJJUF9NT0RVTEUgOj0ga2VlcF9zeW1ib2xzCiAKQEAgLTU4LDYgKzU5LDcgQEAKICAgICAgICAgICAgICAgICAgLWcgXAogICAgICAgICAgICAgICAgICAtTzAgXAogCi1MT0NBTF9DWFhfU1RMIDo9IGxpYmMrK19zdGF0aWMKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKK0xPQ0FMX05ES19TVExfVkFSSUFOVCA6PSBjKytfc3RhdGljCiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvYXR0YWNoaW5nL2hvc3QvQW5kcm9pZFRlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9hdHRhY2hpbmcvaG9zdC9BbmRyb2lkVGVzdC54bWwKaW5kZXggNDFjMTYxZC4uNzEwYjc1MSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9hdHRhY2hpbmcvaG9zdC9BbmRyb2lkVGVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9hdHRhY2hpbmcvaG9zdC9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSBBdHRhY2hpbmcgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImFydCIgLz4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9hdHRhY2hpbmcvaG9zdC9zcmMvYW5kcm9pZC9qdm10aS9jdHMvSnZtdGlBdHRhY2hpbmdIb3N0VGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9hdHRhY2hpbmcvaG9zdC9zcmMvYW5kcm9pZC9qdm10aS9jdHMvSnZtdGlBdHRhY2hpbmdIb3N0VGVzdC5qYXZhCmluZGV4IDI0MzhmMzIuLjkyNjlhMjcgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvYXR0YWNoaW5nL2hvc3Qvc3JjL2FuZHJvaWQvanZtdGkvY3RzL0p2bXRpQXR0YWNoaW5nSG9zdFRlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL2F0dGFjaGluZy9ob3N0L3NyYy9hbmRyb2lkL2p2bXRpL2N0cy9Kdm10aUF0dGFjaGluZ0hvc3RUZXN0LmphdmEKQEAgLTE1LDkgKzE1LDcgQEAKIHBhY2thZ2UgYW5kcm9pZC5qdm10aS5jdHM7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC5idWlsZC5Db21wYXRpYmlsaXR5QnVpbGRIZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLnRlc3RydW5uZXIuSVRlc3RSdW5MaXN0ZW5lcjsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIudGVzdHJ1bm5lci5SZW1vdGVBbmRyb2lkVGVzdFJ1bm5lcjsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIudGVzdHJ1bm5lci5UZXN0SWRlbnRpZmllcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuTnVsbE91dHB1dFJlY2VpdmVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmJ1aWxkLklCdWlsZEluZm87CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuY29uZmlnLk9wdGlvbjsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuSVRlc3REZXZpY2U7CkBAIC0yOSwxMCArMjcsOCBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnV0aWwuQWJpVXRpbHM7CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudXRpbC5GaWxlVXRpbDsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC51dGlsLlppcFV0aWw7CisKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKIGltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7CiAKQEAgLTUzLDYgKzQ5LDcgQEAKIAogICAgIHByaXZhdGUgQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyIG1CdWlsZEhlbHBlcjsKICAgICBwcml2YXRlIElBYmkgbUFiaTsKKyAgICBwcml2YXRlIGludCBtQ3VycmVudFVzZXI7CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRCdWlsZChJQnVpbGRJbmZvIGFyZzApIHsKQEAgLTY0LDcgKzYxLDExMyBAQAogICAgICAgICBtQWJpID0gYXJnMDsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SnZtdGlBdHRhY2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwcml2YXRlIHN0YXRpYyBpbnRlcmZhY2UgVGVzdFJ1biB7CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bihJVGVzdERldmljZSBkZXZpY2UsIFN0cmluZyBwa2csIFN0cmluZyBhcGssIFN0cmluZyBhYmlOYW1lKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUdFTlQgPSAibGliY3RzanZtdGlhdHRhY2hhZ2VudC5zbyI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtQ3VycmVudFVzZXIgPSBnZXREZXZpY2UoKS5nZXRDdXJyZW50VXNlcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RKdm10aUF0dGFjaER1cmluZ0JpbmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcnVuSnZtdGlBZ2VudExvYWRUZXN0KChJVGVzdERldmljZSBkZXZpY2UsIFN0cmluZyBwa2csIFN0cmluZyBhcGssIFN0cmluZyBhYmlOYW1lKSAtPiB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJ1bkF0dGFjaFRlc3RDbWQoZGV2aWNlLCBwa2csICItLWF0dGFjaC1hZ2VudC1iaW5kICIgKyBBR0VOVCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJGYWlsZWQgYmluZC10aW1lIGF0dGFjaGluZyIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SnZtdGlBdHRhY2hFYXJseSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBydW5Kdm10aUFnZW50TG9hZFRlc3QoKElUZXN0RGV2aWNlIGRldmljZSwgU3RyaW5nIHBrZywgU3RyaW5nIGFwaywgU3RyaW5nIGFiaU5hbWUpIC0+IHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHB3ZCA9IGRldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgInJ1bi1hcyAiICsgcGtnICsgIiAtLXVzZXIgIiArIG1DdXJyZW50VXNlciArICIgcHdkIik7CisgICAgICAgICAgICAgICAgaWYgKHB3ZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJwd2QgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHB3ZCA9IHB3ZC50cmltKCk7CisgICAgICAgICAgICAgICAgaWYgKHB3ZC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oInB3ZCBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBHaXZlIGl0IGEgZGlmZmVyZW50IG5hbWUsIHNvIHdlIGRvIG5vdCBoYXZlICJjb250YW1pbmF0aW9uIiBmcm9tCisgICAgICAgICAgICAgICAgLy8gdGhlIHRlc3QgQVBLLgorICAgICAgICAgICAgICAgIFN0cmluZyBsaWJJbkRhdGFEYXRhID0gQUdFTlQuc3Vic3RyaW5nKDAsIEFHRU5ULmxlbmd0aCgpIC0gIi5zbyIubGVuZ3RoKCkpCisgICAgICAgICAgICAgICAgICAgICAgICArICIyLnNvIjsKKyAgICAgICAgICAgICAgICBTdHJpbmcgYWdlbnRJbkRhdGFEYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbGxMaWJUb0RhdGFEYXRhKGRldmljZSwgcGtnLCBhYmlOYW1lLCBhcGssIHB3ZCwgQUdFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYkluRGF0YURhdGEpOworICAgICAgICAgICAgICAgIHJ1bkF0dGFjaFRlc3RDbWQoZGV2aWNlLCBwa2csICItLWF0dGFjaC1hZ2VudCAiICsgYWdlbnRJbkRhdGFEYXRhKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkZhaWxlZCBwcmUtYmluZCBhdHRhY2hpbmciLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEp2bXRpQWdlbnRBcHBJbnRlcm5hbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBydW5Kdm10aUFnZW50TG9hZFRlc3QoKElUZXN0RGV2aWNlIGRldmljZSwgU3RyaW5nIHBrZywgU3RyaW5nIGFwaywgU3RyaW5nIGFiaU5hbWUpIC0+IHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHNldEFnZW50QXBwQ21kID0gImNtZCBhY3Rpdml0eSBzZXQtYWdlbnQtYXBwICIgKyBwa2cgKyAiICIgKyBBR0VOVDsKKyAgICAgICAgICAgICAgICBkZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZChzZXRBZ2VudEFwcENtZCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJGYWlsZWQgcnVubmluZyBzZXQtYWdlbnQtYXBwIiwgZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcnVuQXR0YWNoVGVzdENtZChkZXZpY2UsIHBrZywgIiIpOworCisgICAgICAgICAgICAgICAgLy8gQW5kIGFnYWluLgorICAgICAgICAgICAgICAgIHJ1bkF0dGFjaFRlc3RDbWQoZGV2aWNlLCBwa2csICIiKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkZhaWxlZCBhZ2VudC1hcHAgYXR0YWNoaW5nIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RKdm10aUFnZW50QXBwRXh0ZXJuYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcnVuSnZtdGlBZ2VudExvYWRUZXN0KChJVGVzdERldmljZSBkZXZpY2UsIFN0cmluZyBwa2csIFN0cmluZyBhcGssIFN0cmluZyBhYmlOYW1lKSAtPiB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFN0cmluZyBwd2QgPSBkZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICJydW4tYXMgIiArIHBrZyArICIgLS11c2VyICIgKyBtQ3VycmVudFVzZXIgKyAiIHB3ZCIpOworICAgICAgICAgICAgICAgIGlmIChwd2QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigicHdkIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwd2QgPSBwd2QudHJpbSgpOworICAgICAgICAgICAgICAgIGlmIChwd2QuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJwd2QgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gR2l2ZSBpdCBhIGRpZmZlcmVudCBuYW1lLCBzbyB3ZSBkbyBub3QgaGF2ZSAiY29udGFtaW5hdGlvbiIgZnJvbQorICAgICAgICAgICAgICAgIC8vIHRoZSB0ZXN0IEFQSy4KKyAgICAgICAgICAgICAgICBTdHJpbmcgbGliSW5EYXRhRGF0YSA9IEFHRU5ULnN1YnN0cmluZygwLCBBR0VOVC5sZW5ndGgoKSAtICIuc28iLmxlbmd0aCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiMi5zbyI7CisgICAgICAgICAgICAgICAgU3RyaW5nIGFnZW50SW5EYXRhRGF0YSA9CisgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YWxsTGliVG9EYXRhRGF0YShkZXZpY2UsIHBrZywgYWJpTmFtZSwgYXBrLCBwd2QsIEFHRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJJbkRhdGFEYXRhKTsKKworICAgICAgICAgICAgICAgIFN0cmluZyBzZXRBZ2VudEFwcENtZCA9ICJjbWQgYWN0aXZpdHkgc2V0LWFnZW50LWFwcCAiICsgcGtnICsgIiAiICsgYWdlbnRJbkRhdGFEYXRhOworICAgICAgICAgICAgICAgIGRldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKHNldEFnZW50QXBwQ21kKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkZhaWxlZCBydW5uaW5nIHNldC1hZ2VudC1hcHAiLCBlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBydW5BdHRhY2hUZXN0Q21kKGRldmljZSwgcGtnLCAiIik7CisKKyAgICAgICAgICAgICAgICAvLyBBbmQgYWdhaW4uCisgICAgICAgICAgICAgICAgcnVuQXR0YWNoVGVzdENtZChkZXZpY2UsIHBrZywgIiIpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRmFpbGVkIGFnZW50LWFwcCBhdHRhY2hpbmciLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJ1bkp2bXRpQWdlbnRMb2FkVGVzdChUZXN0UnVuIHJ1bm5lcikgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIElUZXN0RGV2aWNlIGRldmljZSA9IGdldERldmljZSgpOwogCiAgICAgICAgIFN0cmluZyB0ZXN0aW5nQXJjaCA9IEFiaVV0aWxzLmdldEJhc2VBcmNoRm9yQWJpKG1BYmkuZ2V0TmFtZSgpKTsKQEAgLTg0LDcgKzE4Nyw3IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJbmNvcnJlY3QgY29uZmlndXJhdGlvbiIpOwogICAgICAgICB9CiAKLSAgICAgICAgcnVuQXR0YWNoVGVzdChkZXZpY2UsIG1UZXN0UGFja2FnZU5hbWUsIG1UZXN0QXBrKTsKKyAgICAgICAgcnVubmVyLnJ1bihkZXZpY2UsIG1UZXN0UGFja2FnZU5hbWUsIG1UZXN0QXBrLCBtQWJpLmdldE5hbWUoKSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RGV2aWNlQmFzZUFyY2goSVRlc3REZXZpY2UgZGV2aWNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTkzLDQ2ICsxOTYsMjkgQEAKICAgICAgICAgcmV0dXJuIEFiaVV0aWxzLmdldEJhc2VBcmNoRm9yQWJpKGFiaSk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHJ1bkF0dGFjaFRlc3QoSVRlc3REZXZpY2UgZGV2aWNlLCBTdHJpbmcgcGtnLCBTdHJpbmcgYXBrKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgcHdkID0gZGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoInJ1bi1hcyAiICsgcGtnICsgIiBwd2QiKTsKLSAgICAgICAgICAgIGlmIChwd2QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJwd2QgZmFpbGVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwd2QgPSBwd2QudHJpbSgpOwotICAgICAgICAgICAgaWYgKHB3ZC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigicHdkIGZhaWxlZCIpOwotICAgICAgICAgICAgfQorICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcnVuQXR0YWNoVGVzdENtZChJVGVzdERldmljZSBkZXZpY2UsIFN0cmluZyBwa2csIFN0cmluZyBhZ2VudFBhcmFtcykKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgYXR0YWNoQ21kID0gImNtZCBhY3Rpdml0eSBzdGFydCAtUyAtVyAiICsgYWdlbnRQYXJhbXMgKyAiIC1uICIgKyBwa2cKKyAgICAgICAgICAgICAgICArICIvYW5kcm9pZC5qdm10aS5Kdm10aUFjdGl2aXR5IjsKIAotICAgICAgICAgICAgU3RyaW5nIGFnZW50SW5EYXRhRGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgIGluc3RhbGxMaWJUb0RhdGFEYXRhKGRldmljZSwgcGtnLCBhcGssIHB3ZCwgImxpYmN0c2p2bXRpYXR0YWNoYWdlbnQuc28iKTsKLQotICAgICAgICAgICAgU3RyaW5nIGF0dGFjaENtZCA9ICJjbWQgYWN0aXZpdHkgc3RhcnQgLVMgLVcgLS1hdHRhY2gtYWdlbnQgIiArIGFnZW50SW5EYXRhRGF0YSArICIgLW4gIgotICAgICAgICAgICAgICAgICAgICArIHBrZyArICIvYW5kcm9pZC5qdm10aS5Kdm10aUFjdGl2aXR5IjsKLQotICAgICAgICAgICAgU3RyaW5nIGF0dGFjaFJlcGx5ID0gZGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoYXR0YWNoQ21kKTsKLSAgICAgICAgICAgIC8vIERvbid0IHRyeSB0byBwYXJzZSB0aGUgb3V0cHV0LiBUaGUgdGVzdCB3aWxsIHRpbWUgb3V0IGFueXdheXMgaWYgdGhpcyBkaWRuJ3QKLSAgICAgICAgICAgIC8vIHdvcmsuCi0gICAgICAgICAgICBpZiAoYXR0YWNoUmVwbHkgIT0gbnVsbCAmJiAhYXR0YWNoUmVwbHkudHJpbSgpLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIENMb2cuZShhdHRhY2hSZXBseSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRmFpbGVkIGF0dGFjaGluZyIsIGUpOwotICAgICAgICB9CisgICAgICAgIC8vIERvbid0IHRyeSB0byBwYXJzZSB0aGUgb3V0cHV0LiBUaGUgdGVzdCB3aWxsIHRpbWUgb3V0IGFueXdheXMgaWYgdGhpcyBkaWRuJ3QKKyAgICAgICAgLy8gd29yay4KKyAgICAgICAgZGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoYXR0YWNoQ21kLCBOdWxsT3V0cHV0UmVjZWl2ZXIuZ2V0UmVjZWl2ZXIoKSwgMTAsCisgICAgICAgICAgICAgICAgVGltZVVuaXQuU0VDT05EUywgMSk7CiAgICAgfQogCi0gICAgU3RyaW5nIGluc3RhbGxMaWJUb0RhdGFEYXRhKElUZXN0RGV2aWNlIGRldmljZSwgU3RyaW5nIHBrZywgU3RyaW5nIGFwaywgU3RyaW5nIGRhdGFEYXRhLAotICAgICAgICAgICAgU3RyaW5nIGxpYnJhcnkpIHRocm93cyBFeGNlcHRpb24geworICAgIHByaXZhdGUgU3RyaW5nIGluc3RhbGxMaWJUb0RhdGFEYXRhKElUZXN0RGV2aWNlIGRldmljZSwgU3RyaW5nIHBrZywgU3RyaW5nIGFiaU5hbWUsCisgICAgICAgICAgICBTdHJpbmcgYXBrLCBTdHJpbmcgZGF0YURhdGEsIFN0cmluZyBsaWJyYXJ5LCBTdHJpbmcgbmV3TGliTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFppcEZpbGUgemYgPSBudWxsOwogICAgICAgICBGaWxlIHRtcEZpbGUgPSBudWxsOwogICAgICAgICBTdHJpbmcgbGliSW5UbXAgPSBudWxsOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIGxpYkluRGF0YURhdGEgPSBkYXRhRGF0YSArICIvIiArIGxpYnJhcnk7CisgICAgICAgICAgICBTdHJpbmcgbGliSW5EYXRhRGF0YSA9IGRhdGFEYXRhICsgIi8iICsgbmV3TGliTmFtZTsKIAogICAgICAgICAgICAgRmlsZSBhcGtGaWxlID0gbUJ1aWxkSGVscGVyLmdldFRlc3RGaWxlKGFwayk7CiAgICAgICAgICAgICB6ZiA9IG5ldyBaaXBGaWxlKGFwa0ZpbGUpOwogCi0gICAgICAgICAgICBTdHJpbmcgbGliUGF0aEluQXBrID0gImxpYi8iICsgbUFiaS5nZXROYW1lKCkgKyAiLyIgKyBsaWJyYXJ5OworICAgICAgICAgICAgU3RyaW5nIGxpYlBhdGhJbkFwayA9ICJsaWIvIiArIGFiaU5hbWUgKyAiLyIgKyBsaWJyYXJ5OwogICAgICAgICAgICAgdG1wRmlsZSA9IFppcFV0aWwuZXh0cmFjdEZpbGVGcm9tWmlwKHpmLCBsaWJQYXRoSW5BcGspOwogCiAgICAgICAgICAgICBsaWJJblRtcCA9ICIvZGF0YS9sb2NhbC90bXAvIiArIHRtcEZpbGUuZ2V0TmFtZSgpOwpAQCAtMTQxLDEzICsyMjcsMTQgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgU3RyaW5nIHJ1bkFzQ3AgPSBkZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZCgKLSAgICAgICAgICAgICAgICAgICAgInJ1bi1hcyAiICsgcGtnICsgIiBjcCAiICsgbGliSW5UbXAgKyAiICIgKyBsaWJJbkRhdGFEYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgInJ1bi1hcyAiICsgcGtnICsgIiAtLXVzZXIgIiArIG1DdXJyZW50VXNlciArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBjcCAiICsgbGliSW5UbXAgKyAiICIgKyBsaWJJbkRhdGFEYXRhKTsKICAgICAgICAgICAgIGlmIChydW5Bc0NwICE9IG51bGwgJiYgIXJ1bkFzQ3AudHJpbSgpLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHJ1bkFzQ3AudHJpbSgpKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgU3RyaW5nIHJ1bkFzQ2htb2QgPSBkZXZpY2UKLSAgICAgICAgICAgICAgICAgICAgLmV4ZWN1dGVTaGVsbENvbW1hbmQoInJ1bi1hcyAiICsgcGtnICsgIiBjaG1vZCBhK3ggIiArIGxpYkluRGF0YURhdGEpOworICAgICAgICAgICAgU3RyaW5nIHJ1bkFzQ2htb2QgPSBkZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZCgKKyAgICAgICAgICAgICAgICAgICAgInJ1bi1hcyAiICsgcGtnICsgIiAtLXVzZXIgIiArIG1DdXJyZW50VXNlciArICIgY2htb2QgYSt4ICIgKyBsaWJJbkRhdGFEYXRhKTsKICAgICAgICAgICAgIGlmIChydW5Bc0NobW9kICE9IG51bGwgJiYgIXJ1bkFzQ2htb2QudHJpbSgpLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHJ1bkFzQ2htb2QudHJpbSgpKTsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvYmFzZS9hcHAvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvanZtdGkvYmFzZS9hcHAvQW5kcm9pZC5tawppbmRleCBjYjFkOGJhLi41ZDc1NTY4IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2p2bXRpL2Jhc2UvYXBwL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9iYXNlL2FwcC9BbmRyb2lkLm1rCkBAIC0yMCw5ICsyMCw5IEBACiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1zdWJkaXItamF2YS1maWxlcykKIExPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKIExPQ0FMX0RFWF9QUkVPUFQgOj0gZmFsc2UKLUxPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIgY3RzLWp1bml0CitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzIGN0cy1qdW5pdAogTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKLSAgICBjdHN0ZXN0cnVubmVyIFwKLSAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsIFwKKyAgICBjdHN0ZXN0cnVubmVyLWF4dCBcCisgICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgXAogCiBpbmNsdWRlICQoQlVJTERfU1RBVElDX0pBVkFfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvYmFzZS9hcHAvc3JjL2FuZHJvaWQvanZtdGkvY3RzL0p2bXRpVGVzdEJhc2UuamF2YSBiL2hvc3RzaWRldGVzdHMvanZtdGkvYmFzZS9hcHAvc3JjL2FuZHJvaWQvanZtdGkvY3RzL0p2bXRpVGVzdEJhc2UuamF2YQppbmRleCAwYjU0YTkzLi5jNjdmOWI4IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2p2bXRpL2Jhc2UvYXBwL3NyYy9hbmRyb2lkL2p2bXRpL2N0cy9Kdm10aVRlc3RCYXNlLmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9iYXNlL2FwcC9zcmMvYW5kcm9pZC9qdm10aS9jdHMvSnZtdGlUZXN0QmFzZS5qYXZhCkBAIC0xNSwxNSArMTUsMTYgQEAKICAqLwogcGFja2FnZSBhbmRyb2lkLmp2bXRpLmN0czsKIAotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKK2ltcG9ydCBhbmRyb2lkLmp2bXRpLkp2bXRpQWN0aXZpdHk7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIAotaW1wb3J0IGFuZHJvaWQuanZtdGkuSnZtdGlBY3Rpdml0eTsKIGltcG9ydCBhcnQuQ3RzTWFpbjsKIAogLyoqCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL2Jhc2UvYXBwL3NyYy9hcnQvQ3RzTWFpbi5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9iYXNlL2FwcC9zcmMvYXJ0L0N0c01haW4uamF2YQppbmRleCA4ZDVmOGFhLi40OTcwYzA3IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2p2bXRpL2Jhc2UvYXBwL3NyYy9hcnQvQ3RzTWFpbi5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvYmFzZS9hcHAvc3JjL2FydC9DdHNNYWluLmphdmEKQEAgLTM1LDcgKzM1LDcgQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3YWl0Rm9yKCkgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKCFzU3RhcnRXYWl0ZXIuYXdhaXQoMzAsIFRpbWVVbml0LlNFQ09ORFMpKSB7CisgICAgICAgICAgICBpZiAoIXNTdGFydFdhaXRlci5hd2FpdCgxNSwgVGltZVVuaXQuU0VDT05EUykpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGltZWQgb3V0IHdhaXRpbmcgZm9yIHRoZSBhZ2VudCIpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL2Jhc2UvaG9zdC9zcmMvYW5kcm9pZC9qdm10aS9jdHMvSnZtdGlIb3N0VGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9iYXNlL2hvc3Qvc3JjL2FuZHJvaWQvanZtdGkvY3RzL0p2bXRpSG9zdFRlc3QuamF2YQppbmRleCBjZTI5NjljLi5jN2NlYmE2IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2p2bXRpL2Jhc2UvaG9zdC9zcmMvYW5kcm9pZC9qdm10aS9jdHMvSnZtdGlIb3N0VGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvYmFzZS9ob3N0L3NyYy9hbmRyb2lkL2p2bXRpL2N0cy9Kdm10aUhvc3RUZXN0LmphdmEKQEAgLTE1LDEzICsxNSwxMyBAQAogcGFja2FnZSBhbmRyb2lkLmp2bXRpLmN0czsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLmJ1aWxkLkNvbXBhdGliaWxpdHlCdWlsZEhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIudGVzdHJ1bm5lci5JVGVzdFJ1bkxpc3RlbmVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi50ZXN0cnVubmVyLlJlbW90ZUFuZHJvaWRUZXN0UnVubmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi50ZXN0cnVubmVyLlRlc3RJZGVudGlmaWVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmJ1aWxkLklCdWlsZEluZm87CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuY29uZmlnLk9wdGlvbjsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuSVRlc3REZXZpY2U7CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQubG9nLkxvZ1V0aWwuQ0xvZzsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5yZXN1bHQuSVRlc3RMaWZlQ3ljbGVSZWNlaXZlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5yZXN1bHQuVGVzdERlc2NyaXB0aW9uOwogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkRldmljZVRlc3RDYXNlOwogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLklBYmk7CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSUFiaVJlY2VpdmVyOwpAQCAtMjksNiArMjksNyBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnV0aWwuQWJpVXRpbHM7CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudXRpbC5GaWxlVXRpbDsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC51dGlsLlppcFV0aWw7CisKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CkBAIC00NCw3ICs0NSw3IEBACiAgKiB0ZXN0IHJ1biBhbmQgYXR0YWNoZXMgdGhlIGFnZW50LgogICovCiBwdWJsaWMgY2xhc3MgSnZtdGlIb3N0VGVzdCBleHRlbmRzIERldmljZVRlc3RDYXNlIGltcGxlbWVudHMgSUJ1aWxkUmVjZWl2ZXIsIElBYmlSZWNlaXZlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJVTk5FUiA9ICJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlVOTkVSID0gImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciI7CiAgICAgLy8gaW5qZWN0IHRoZXNlIG9wdGlvbnMgZnJvbSBIb3N0VGVzdCBkaXJlY3RseSB1c2luZyAtLXNldC1vcHRpb24gPG9wdGlvbiBuYW1lPjo8b3B0aW9uIHZhbHVlPgogICAgIEBPcHRpb24obmFtZSA9ICJwYWNrYWdlLW5hbWUiLAogICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAiVGhlIHBhY2thZ2UgbmFtZSBvZiB0aGUgZGV2aWNlIHRlc3QiLApAQCAtNTgsNiArNTksNyBAQAogCiAgICAgcHJpdmF0ZSBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIgbUJ1aWxkSGVscGVyOwogICAgIHByaXZhdGUgSUFiaSBtQWJpOworICAgIHByaXZhdGUgaW50IG1DdXJyZW50VXNlcjsKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldEJ1aWxkKElCdWlsZEluZm8gYXJnMCkgewpAQCAtNjksNiArNzEsMTEgQEAKICAgICAgICAgbUFiaSA9IGFyZzA7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbUN1cnJlbnRVc2VyID0gZ2V0RGV2aWNlKCkuZ2V0Q3VycmVudFVzZXIoKTsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCB0ZXN0SnZtdGkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgSVRlc3REZXZpY2UgZGV2aWNlID0gZ2V0RGV2aWNlKCk7CiAKQEAgLTEyMiw3ICsxMjksOCBAQAogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewogICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcHdkID0gbURldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKCJydW4tYXMgIiArIG1Qa2cgKyAiIHB3ZCIpOworICAgICAgICAgICAgICAgIFN0cmluZyBwd2QgPSBtRGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoCisgICAgICAgICAgICAgICAgICAgICAgICAicnVuLWFzICIgKyBtUGtnICsgIiAtLXVzZXIgIiArIG1DdXJyZW50VXNlciArICIgcHdkIik7CiAgICAgICAgICAgICAgICAgaWYgKHB3ZCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJwd2QgZmFpbGVkIik7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTY0LDEzICsxNzIsMTUgQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBTdHJpbmcgcnVuQXNDcCA9IG1EZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJydW4tYXMgIiArIG1Qa2cgKyAiIGNwICIgKyBsaWJJblRtcCArICIgIiArIGxpYkluRGF0YURhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgInJ1bi1hcyAiICsgbVBrZyArICIgLS11c2VyICIgKyBtQ3VycmVudFVzZXIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGNwICIgKyBsaWJJblRtcCArICIgIiArIGxpYkluRGF0YURhdGEpOwogICAgICAgICAgICAgICAgIGlmIChydW5Bc0NwICE9IG51bGwgJiYgIXJ1bkFzQ3AudHJpbSgpLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihydW5Bc0NwLnRyaW0oKSk7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgU3RyaW5nIHJ1bkFzQ2htb2QgPSBtRGV2aWNlCi0gICAgICAgICAgICAgICAgICAgICAgICAuZXhlY3V0ZVNoZWxsQ29tbWFuZCgicnVuLWFzICIgKyBtUGtnICsgIiBjaG1vZCBhK3ggIiArIGxpYkluRGF0YURhdGEpOworICAgICAgICAgICAgICAgIFN0cmluZyBydW5Bc0NobW9kID0gbURldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgInJ1bi1hcyAiICsgbVBrZyArICIgLS11c2VyICIgKyBtQ3VycmVudFVzZXIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGNobW9kIGEreCAiICsgbGliSW5EYXRhRGF0YSk7CiAgICAgICAgICAgICAgICAgaWYgKHJ1bkFzQ2htb2QgIT0gbnVsbCAmJiAhcnVuQXNDaG1vZC50cmltKCkuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHJ1bkFzQ2htb2QudHJpbSgpKTsKICAgICAgICAgICAgICAgICB9CkBAIC0xOTAsNyArMjAwLDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRlc3RSZXN1bHRzIGltcGxlbWVudHMgSVRlc3RSdW5MaXN0ZW5lciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGVzdFJlc3VsdHMgaW1wbGVtZW50cyBJVGVzdExpZmVDeWNsZVJlY2VpdmVyIHsKICAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1GYWlsZWQgPSBmYWxzZTsKICAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1TdGFydGVkID0gZmFsc2U7CiAgICAgICAgIHByaXZhdGUgZmluYWwgUnVubmFibGUgbU9uU3RhcnQ7CkBAIC0yMTYsMjIgKzIyNiwyMiBAQAogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RBc3N1bXB0aW9uRmFpbHVyZShUZXN0SWRlbnRpZmllciBhcmcwLCBTdHJpbmcgYXJnMSkgeworICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0QXNzdW1wdGlvbkZhaWx1cmUoVGVzdERlc2NyaXB0aW9uIGFyZzAsIFN0cmluZyBhcmcxKSB7CiAgICAgICAgICAgICBtRmFpbGVkID0gdHJ1ZTsKICAgICAgICAgICAgIG1FcnJvcnMuYWRkKGFyZzAudG9TdHJpbmcoKSArICIgIiArIGFyZzEpOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RFbmRlZChUZXN0SWRlbnRpZmllciBhcmcwLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGFyZzEpIHt9CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RFbmRlZChUZXN0RGVzY3JpcHRpb24gYXJnMCwgTWFwPFN0cmluZywgU3RyaW5nPiBhcmcxKSB7fQogCiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0RmFpbGVkKFRlc3RJZGVudGlmaWVyIGFyZzAsIFN0cmluZyBhcmcxKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RGYWlsZWQoVGVzdERlc2NyaXB0aW9uIGFyZzAsIFN0cmluZyBhcmcxKSB7CiAgICAgICAgICAgICBtRmFpbGVkID0gdHJ1ZTsKICAgICAgICAgICAgIG1FcnJvcnMuYWRkKGFyZzAudG9TdHJpbmcoKSArICIgIiArIGFyZzEpOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RJZ25vcmVkKFRlc3RJZGVudGlmaWVyIGFyZzApIHt9CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RJZ25vcmVkKFRlc3REZXNjcmlwdGlvbiBhcmcwKSB7fQogCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0UnVuRW5kZWQobG9uZyBhcmcwLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGFyZzEpIHt9CkBAIC0yNTMsNyArMjYzLDcgQEAKICAgICAgICAgcHVibGljIHZvaWQgdGVzdFJ1blN0b3BwZWQobG9uZyBhcmcwKSB7fQogCiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhcnRlZChUZXN0SWRlbnRpZmllciBhcmcwKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFydGVkKFRlc3REZXNjcmlwdGlvbiBhcmcwKSB7CiAgICAgICAgICAgICBtU3RhcnRlZCA9IHRydWU7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL2Jhc2Uvam5pL0FuZHJvaWQuYnAgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL2Jhc2Uvam5pL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU2NzM3MwotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvYmFzZS9qbmkvQW5kcm9pZC5icApAQCAtMCwwICsxLDY3IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjdHNqdm10aWFnZW50IiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgImN0c19hZ2VudC5jcHAiLAorICAgICAgICAidGFnZ2luZy5jcHAiLAorICAgICAgICAidHJhY2tpbmcuY3BwIiwKKyAgICAgICAgInJlZGVmaW5lLmNwcCIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJvcGVuamRranZtdGlfaGVhZGVycyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGliZGwiLAorICAgICAgICAibGlieiIsCisgICAgXSwKKworICAgIC8vIFRoZSB0ZXN0IGltcGxlbWVudGF0aW9uLiBXZSBnZXQgdGhpcyBwcm92aWRlZCBieSBBUlQuCisgICAgLy8gTm90ZTogTmVlZHMgdG8gYmUgIndob2xlIiBhcyB0aGlzIGV4cG9zZXMgSk5JIGZ1bmN0aW9ucy4KKyAgICB3aG9sZV9zdGF0aWNfbGliczogWyJsaWJjdHN0aWFnZW50Il0sCisKKyAgICAvLyBQbGF0Zm9ybSBsaWJyYXJpZXMgIHRoYXQgbWF5IG5vdCBiZSBhdmFpbGFibGUgdG8gYXBwcy4gTGluayBpbiBzdGF0aWNhbGx5LgorICAgIHN0YXRpY19saWJzOiBbImxpYmJhc2VfbmRrIl0sCisKKyAgICBzdHJpcDogeworICAgICAgICBrZWVwX3N5bWJvbHM6IHRydWUsCisgICAgfSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdleHRyYSIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XdW5yZWFjaGFibGUtY29kZSIsCisgICAgICAgICItV3JlZHVuZGFudC1kZWNscyIsCisgICAgICAgICItV3NoYWRvdyIsCisgICAgICAgICItV3VudXNlZCIsCisgICAgICAgICItV2ltcGxpY2l0LWZhbGx0aHJvdWdoIiwKKyAgICAgICAgIi1XZmxvYXQtZXF1YWwiLAorICAgICAgICAiLVdpbnQtdG8tdm9pZC1wb2ludGVyLWNhc3QiLAorICAgICAgICAiLVd1c2VkLWJ1dC1tYXJrZWQtdW51c2VkIiwKKyAgICAgICAgIi1XZGVwcmVjYXRlZCIsCisgICAgICAgICItV3VucmVhY2hhYmxlLWNvZGUtYnJlYWsiLAorICAgICAgICAiLVd1bnJlYWNoYWJsZS1jb2RlLXJldHVybiIsCisgICAgICAgICItZyIsCisgICAgICAgICItTzAiLAorICAgIF0sCisKKyAgICBzZGtfdmVyc2lvbjogImN1cnJlbnQiLAorICAgIHN0bDogImMrK19zdGF0aWMiLAorfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9iYXNlL2puaS9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9iYXNlL2puaS9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGI3ZWEzLi4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvYmFzZS9qbmkvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFIDo9IGxpYmN0c2p2bXRpYWdlbnQKLQotIyBEb24ndCBpbmNsdWRlIHRoaXMgcGFja2FnZSBpbiBhbnkgY29uZmlndXJhdGlvbiBieSBkZWZhdWx0LgotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfU1JDX0ZJTEVTIDo9IGN0c19hZ2VudC5jcHAKLQotIyBUYWdnaW5nLgotTE9DQUxfU1JDX0ZJTEVTICs9IHRhZ2dpbmcuY3BwCi0KLSMgVHJhY2tpbmcuCi1MT0NBTF9TUkNfRklMRVMgKz0gdHJhY2tpbmcuY3BwCi0KLSMgcmVkZWZpbml0aW9uLgotTE9DQUxfU1JDX0ZJTEVTICs9IHJlZGVmaW5lLmNwcAotCi1MT0NBTF9DX0lOQ0xVREVTIDo9ICQoSk5JX0hfSU5DTFVERSkKLUxPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gbGlib3Blbmpka2p2bXRpX2hlYWRlcnMKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJsb2cgXAotICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJkbAotCi0jIFRoZSB0ZXN0IGltcGxlbWVudGF0aW9uLiBXZSBnZXQgdGhpcyBwcm92aWRlZCBieSBBUlQuCi0jIE5vdGU6IE5lZWRzIHRvIGJlICJ3aG9sZSIgYXMgdGhpcyBleHBvc2VzIEpOSSBmdW5jdGlvbnMuCi1MT0NBTF9XSE9MRV9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYmN0c3RpYWdlbnQKLQotIyBQbGF0Zm9ybSBsaWJyYXJpZXMgdGhhdCBhcmUgbm90IGF2YWlsYWJsZSB0byBhcHBzLiBMaW5rIGluIHN0YXRpY2FsbHkuCi1MT0NBTF9TVEFUSUNfTElCUkFSSUVTICs9IGxpYmJhc2UKLQotTE9DQUxfU1RSSVBfTU9EVUxFIDo9IGtlZXBfc3ltYm9scwotCi0jIFR1cm4gb24gYWxsIHdhcm5pbmdzLgotTE9DQUxfQ0ZMQUdTIDo9ICAtZm5vLXJ0dGkgXAotICAgICAgICAgICAgICAgICAtZ2dkYjMgXAotICAgICAgICAgICAgICAgICAtV2FsbCBcCi0gICAgICAgICAgICAgICAgIC1XZXh0cmEgXAotICAgICAgICAgICAgICAgICAtV2Vycm9yIFwKLSAgICAgICAgICAgICAgICAgLVd1bnJlYWNoYWJsZS1jb2RlIFwKLSAgICAgICAgICAgICAgICAgLVdyZWR1bmRhbnQtZGVjbHMgXAotICAgICAgICAgICAgICAgICAtV3NoYWRvdyBcCi0gICAgICAgICAgICAgICAgIC1XdW51c2VkIFwKLSAgICAgICAgICAgICAgICAgLVdpbXBsaWNpdC1mYWxsdGhyb3VnaCBcCi0gICAgICAgICAgICAgICAgIC1XZmxvYXQtZXF1YWwgXAotICAgICAgICAgICAgICAgICAtV2ludC10by12b2lkLXBvaW50ZXItY2FzdCBcCi0gICAgICAgICAgICAgICAgIC1XdXNlZC1idXQtbWFya2VkLXVudXNlZCBcCi0gICAgICAgICAgICAgICAgIC1XZGVwcmVjYXRlZCBcCi0gICAgICAgICAgICAgICAgIC1XdW5yZWFjaGFibGUtY29kZS1icmVhayBcCi0gICAgICAgICAgICAgICAgIC1XdW5yZWFjaGFibGUtY29kZS1yZXR1cm4gXAotICAgICAgICAgICAgICAgICAtZyBcCi0gICAgICAgICAgICAgICAgIC1PMCBcCi0KLUxPQ0FMX0NYWF9TVEwgOj0gbGliYysrX3N0YXRpYwotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL2Jhc2Uvam5pL2N0c19hZ2VudC5jcHAgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL2Jhc2Uvam5pL2N0c19hZ2VudC5jcHAKaW5kZXggYmIxZTYyMC4uM2YzYTgzNiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9iYXNlL2puaS9jdHNfYWdlbnQuY3BwCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvYmFzZS9qbmkvY3RzX2FnZW50LmNwcApAQCAtMjUsMTIgKzI1LDI2IEBACiAKIG5hbWVzcGFjZSBhcnQgewogCitleHRlcm4gdm9pZCByZWdpc3Rlcl9hcnRfTWFpbihqdm10aUVudiosIEpOSUVudiopOworZXh0ZXJuIHZvaWQgcmVnaXN0ZXJfYW5kcm9pZF9qdm10aV9jdHNfSnZtdGlSZWRlZmluZUNsYXNzZXNUZXN0KGp2bXRpRW52KiwgSk5JRW52Kik7CitleHRlcm4gdm9pZCByZWdpc3Rlcl9hbmRyb2lkX2p2bXRpX2N0c19Kdm10aVRhZ2dpbmdUZXN0KGp2bXRpRW52KiwgSk5JRW52Kik7CitleHRlcm4gdm9pZCByZWdpc3Rlcl9hbmRyb2lkX2p2bXRpX2N0c19Kdm10aVRyYWNraW5nVGVzdChqdm10aUVudiosIEpOSUVudiopOworCiBzdGF0aWMgdm9pZCBJbmZvcm1NYWluQXR0YWNoKGp2bXRpRW52KiBqZW52LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKTklFbnYqIGVudiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY2xhc3NfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbWV0aG9kX25hbWUpIHsKKyAgLy8gUmVnaXN0ZXIgbmF0aXZlIG1ldGhvZHMgZnJvbSBhdmFpbGFibGUgY2xhc3NlcworICAvLyBUaGUgYWdlbnQgaXMgdXNlZCB3aXRoIGVhY2ggdGVzdCBjbGFzcywgYnV0IHdlIGRvbid0IGtub3cgd2hpY2ggY2xhc3MgaXMgY3VycmVudGx5IGF2YWlsYWJsZS4KKyAgLy8gRm9yIHRoYXQgcmVhc29uLCB3ZSB0cnkgdG8gcmVnaXN0ZXIgdGhlIG5hdGl2ZSBtZXRob2RzIGluIGVhY2ggb25lLiBFYWNoIGZ1bmN0aW9uIHJldHVybnMKKyAgLy8gd2l0aG91dCB0aHJvd2luZyBhbiBlcnJvciBpZiB0aGUgc3BlY2lmaWVkIGNsYXNzIGNhbid0IGJlIGZvdW5kLgorICByZWdpc3Rlcl9hcnRfTWFpbihqZW52LCBlbnYpOworICByZWdpc3Rlcl9hbmRyb2lkX2p2bXRpX2N0c19Kdm10aVJlZGVmaW5lQ2xhc3Nlc1Rlc3QoamVudiwgZW52KTsKKyAgcmVnaXN0ZXJfYW5kcm9pZF9qdm10aV9jdHNfSnZtdGlUYWdnaW5nVGVzdChqZW52LCBlbnYpOworICByZWdpc3Rlcl9hbmRyb2lkX2p2bXRpX2N0c19Kdm10aVRyYWNraW5nVGVzdChqZW52LCBlbnYpOworCiAgIC8vIFVzZSBKTkkgdG8gbG9hZCB0aGUgY2xhc3MuCi0gIFNjb3BlZExvY2FsUmVmPGpjbGFzcz4ga2xhc3MoZW52LCBGaW5kQ2xhc3MoamVudiwgZW52LCBjbGFzc19uYW1lLCBudWxscHRyKSk7CisgIFNjb3BlZExvY2FsUmVmPGpjbGFzcz4ga2xhc3MoZW52LCBHZXRDbGFzcyhqZW52LCBlbnYsIGNsYXNzX25hbWUsIG51bGxwdHIpKTsKICAgQ0hFQ0soa2xhc3MuZ2V0KCkgIT0gbnVsbHB0cikgPDwgY2xhc3NfbmFtZTsKIAogICBqbWV0aG9kSUQgbWV0aG9kID0gZW52LT5HZXRTdGF0aWNNZXRob2RJRChrbGFzcy5nZXQoKSwgbWV0aG9kX25hbWUsICIoKVYiKTsKQEAgLTQ5LDcgKzYzLDcgQEAKICAgICBMT0coRkFUQUwpIDw8ICJDb3VsZCBub3QgZ2V0IHNoYXJlZCBqdm10aUVudiI7CiAgIH0KIAotICBTZXRBbGxDYXBhYmlsaXRpZXMoanZtdGlfZW52KTsKKyAgU2V0U3RhbmRhcmRDYXBhYmlsaXRpZXMoanZtdGlfZW52KTsKICAgcmV0dXJuIDA7CiB9CiAKQEAgLTY0LDcgKzc4LDcgQEAKICAgICBMT0coRkFUQUwpIDw8ICJDb3VsZCBub3QgZ2V0IHNoYXJlZCBqdm10aUVudiI7CiAgIH0KIAotICBTZXRBbGxDYXBhYmlsaXRpZXMoanZtdGlfZW52KTsKKyAgU2V0U3RhbmRhcmRDYXBhYmlsaXRpZXMoanZtdGlfZW52KTsKICAgSW5mb3JtTWFpbkF0dGFjaChqdm10aV9lbnYsIGVudiwga01haW5DbGFzcywga01haW5DbGFzc1N0YXJ0dXApOwogICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvYmFzZS9qbmkvcmVkZWZpbmUuY3BwIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9iYXNlL2puaS9yZWRlZmluZS5jcHAKaW5kZXggYzZlODcyNi4uMWEwNDRjYSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9iYXNlL2puaS9yZWRlZmluZS5jcHAKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9iYXNlL2puaS9yZWRlZmluZS5jcHAKQEAgLTE0LDcgKzE0LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlICJqbmkuaCIKKyNpbmNsdWRlIDxqbmkuaD4KIAogI2luY2x1ZGUgPHN0YWNrPgogI2luY2x1ZGUgPHN0cmluZz4KQEAgLTIzLDYgKzIzLDcgQEAKIAogI2luY2x1ZGUgImFuZHJvaWQtYmFzZS9sb2dnaW5nLmgiCiAjaW5jbHVkZSAiYW5kcm9pZC1iYXNlL21hY3Jvcy5oIgorI2luY2x1ZGUgImpuaV9iaW5kZXIuaCIKICNpbmNsdWRlICJqbmlfaGVscGVyLmgiCiAjaW5jbHVkZSAianZtdGlfaGVscGVyLmgiCiAjaW5jbHVkZSAianZtdGkuaCIKQEAgLTE3Miw1ICsxNzMsNDAgQEAKICAgZW52LT5SZWxlYXNlQnl0ZUFycmF5RWxlbWVudHMoZGV4X2J5dGVzLCByZWRlZl9ieXRlcywgMCk7CiB9CiAKK3N0YXRpYyBKTklOYXRpdmVNZXRob2QgZ01ldGhvZHNbXSA9IHsKKyAgeyAicmVkZWZpbmVDbGFzcyIsICIoTGphdmEvbGFuZy9DbGFzcztbQilJIiwKKyAgICAgICAgICAodm9pZCopSmF2YV9hbmRyb2lkX2p2bXRpX2N0c19Kdm10aVJlZGVmaW5lQ2xhc3Nlc1Rlc3RfcmVkZWZpbmVDbGFzcyB9LAorCisgIHsgInJldHJhbnNmb3JtQ2xhc3MiLCAiKExqYXZhL2xhbmcvQ2xhc3M7KUkiLAorICAgICAgICAgICh2b2lkKilKYXZhX2FuZHJvaWRfanZtdGlfY3RzX0p2bXRpUmVkZWZpbmVDbGFzc2VzVGVzdF9yZXRyYW5zZm9ybUNsYXNzIH0sCisKKyAgeyAic2V0VHJhbnNmb3JtYXRpb25FdmVudCIsICIoWilWIiwKKyAgICAgICAgICAodm9pZCopSmF2YV9hbmRyb2lkX2p2bXRpX2N0c19Kdm10aVJlZGVmaW5lQ2xhc3Nlc1Rlc3Rfc2V0VHJhbnNmb3JtYXRpb25FdmVudCB9LAorCisgIHsgImNsZWFyVHJhbnNmb3JtYXRpb25zIiwgIigpViIsCisgICAgICAgICAgKHZvaWQqKUphdmFfYW5kcm9pZF9qdm10aV9jdHNfSnZtdGlSZWRlZmluZUNsYXNzZXNUZXN0X2NsZWFyVHJhbnNmb3JtYXRpb25zIH0sCisKKyAgeyAic2V0UG9wVHJhbnNmb3JtYXRpb25zIiwgIihaKVYiLAorICAgICAgICAgICh2b2lkKilKYXZhX2FuZHJvaWRfanZtdGlfY3RzX0p2bXRpUmVkZWZpbmVDbGFzc2VzVGVzdF9zZXRQb3BUcmFuc2Zvcm1hdGlvbnMgfSwKKworICB7ICJwdXNoVHJhbnNmb3JtYXRpb25SZXN1bHQiLCAiKExqYXZhL2xhbmcvU3RyaW5nO1tCKVYiLAorICAgICAgICAgICh2b2lkKilKYXZhX2FuZHJvaWRfanZtdGlfY3RzX0p2bXRpUmVkZWZpbmVDbGFzc2VzVGVzdF9wdXNoVHJhbnNmb3JtYXRpb25SZXN1bHQgfSwKK307CisKK3ZvaWQgcmVnaXN0ZXJfYW5kcm9pZF9qdm10aV9jdHNfSnZtdGlSZWRlZmluZUNsYXNzZXNUZXN0KGp2bXRpRW52KiBqZW52LCBKTklFbnYqIGVudikgeworICBTY29wZWRMb2NhbFJlZjxqY2xhc3M+IGtsYXNzKGVudiwgR2V0Q2xhc3MoamVudiwgZW52LAorICAgICAgICAgICJhbmRyb2lkL2p2bXRpL2N0cy9Kdm10aVJlZGVmaW5lQ2xhc3Nlc1Rlc3QiLCBudWxscHRyKSk7CisgIGlmIChrbGFzcy5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgZW52LT5FeGNlcHRpb25DbGVhcigpOworICAgIHJldHVybjsKKyAgfQorCisgIGVudi0+UmVnaXN0ZXJOYXRpdmVzKGtsYXNzLmdldCgpLCBnTWV0aG9kcywgc2l6ZW9mKGdNZXRob2RzKSAvIHNpemVvZihKTklOYXRpdmVNZXRob2QpKTsKKyAgaWYgKGVudi0+RXhjZXB0aW9uQ2hlY2soKSkgeworICAgIGVudi0+RXhjZXB0aW9uQ2xlYXIoKTsKKyAgICBMT0coRVJST1IpIDw8ICJDb3VsZCBub3QgcmVnaXN0ZXIgbmF0aXZlcyBmb3IgSnZtdGlSZWRlZmluZUNsYXNzZXNUZXN0IGNsYXNzIjsKKyAgfQorfQorCiB9ICAvLyBuYW1lc3BhY2UgYXJ0CiAKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvYmFzZS9qbmkvdGFnZ2luZy5jcHAgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL2Jhc2Uvam5pL3RhZ2dpbmcuY3BwCmluZGV4IDM3MjgwNWIuLjM1ZDgzZDcgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvYmFzZS9qbmkvdGFnZ2luZy5jcHAKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9iYXNlL2puaS90YWdnaW5nLmNwcApAQCAtMTgsNiArMTgsNyBAQAogCiAjaW5jbHVkZSAiYW5kcm9pZC1iYXNlL2xvZ2dpbmcuaCIKICNpbmNsdWRlICJhbmRyb2lkLWJhc2UvbWFjcm9zLmgiCisjaW5jbHVkZSAiam5pX2JpbmRlci5oIgogI2luY2x1ZGUgImpuaV9oZWxwZXIuaCIKICNpbmNsdWRlICJqdm10aV9oZWxwZXIuaCIKICNpbmNsdWRlICJqdm10aS5oIgpAQCAtMTI3LDUgKzEyOCw0OCBAQAogICByZXR1cm4gQ3JlYXRlT2JqZWN0QXJyYXkoZW52LCAzLCAiamF2YS9sYW5nL09iamVjdCIsIGNhbGxiYWNrKTsKIH0KIAorc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBnTWV0aG9kc0Zvck1haW5bXSA9IHsKKyAgeyAic2V0VGFnIiwgIihMamF2YS9sYW5nL09iamVjdDtKKVYiLAorICAgICAgICAgICh2b2lkKilKYXZhX2FuZHJvaWRfanZtdGlfY3RzX0puaUJpbmRpbmdzX3NldFRhZyB9LAorCisgIHsgImdldFRhZyIsICIoTGphdmEvbGFuZy9PYmplY3Q7KUoiLAorICAgICAgICAgICh2b2lkKilKYXZhX2FuZHJvaWRfanZtdGlfY3RzX0puaUJpbmRpbmdzX2dldFRhZyB9LAorfTsKKwordm9pZCByZWdpc3Rlcl9hcnRfTWFpbihqdm10aUVudiogamVudiwgSk5JRW52KiBlbnYpIHsKKyAgU2NvcGVkTG9jYWxSZWY8amNsYXNzPiBrbGFzcyhlbnYsIEdldENsYXNzKGplbnYsIGVudiwgImFydC9NYWluIiwgbnVsbHB0cikpOworICBpZiAoa2xhc3MuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgIGVudi0+RXhjZXB0aW9uQ2xlYXIoKTsKKyAgICByZXR1cm47CisgIH0KKworICBlbnYtPlJlZ2lzdGVyTmF0aXZlcyhrbGFzcy5nZXQoKSwgZ01ldGhvZHNGb3JNYWluLAorICAgICAgICAgIHNpemVvZihnTWV0aG9kc0Zvck1haW4pIC8gc2l6ZW9mKEpOSU5hdGl2ZU1ldGhvZCkpOworICBpZiAoZW52LT5FeGNlcHRpb25DaGVjaygpKSB7CisgICAgZW52LT5FeGNlcHRpb25DbGVhcigpOworICAgIExPRyhFUlJPUikgPDwgIkNvdWxkIG5vdCByZWdpc3RlciBuYXRpdmVzIGZvciBNYWluIGNsYXNzIjsKKyAgfQorfQorCitzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdNZXRob2RzW10gPSB7CisgIHsgImdldFRhZ2dlZE9iamVjdHMiLCAiKFtKWlopW0xqYXZhL2xhbmcvT2JqZWN0OyIsCisgICAgICAgICAgKHZvaWQqKUphdmFfYW5kcm9pZF9qdm10aV9jdHNfSnZtdGlUYWdnaW5nVGVzdF9nZXRUYWdnZWRPYmplY3RzIH0sCit9OworCit2b2lkIHJlZ2lzdGVyX2FuZHJvaWRfanZtdGlfY3RzX0p2bXRpVGFnZ2luZ1Rlc3QoanZtdGlFbnYqIGplbnYsIEpOSUVudiogZW52KSB7CisgIFNjb3BlZExvY2FsUmVmPGpjbGFzcz4ga2xhc3MoZW52LCBHZXRDbGFzcyhqZW52LCBlbnYsCisgICAgICAgICAgImFuZHJvaWQvanZtdGkvY3RzL0p2bXRpVGFnZ2luZ1Rlc3QiLCBudWxscHRyKSk7CisgIGlmIChrbGFzcy5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgZW52LT5FeGNlcHRpb25DbGVhcigpOworICAgIHJldHVybjsKKyAgfQorCisgIGVudi0+UmVnaXN0ZXJOYXRpdmVzKGtsYXNzLmdldCgpLCBnTWV0aG9kcywgc2l6ZW9mKGdNZXRob2RzKSAvIHNpemVvZihKTklOYXRpdmVNZXRob2QpKTsKKyAgaWYgKGVudi0+RXhjZXB0aW9uQ2hlY2soKSkgeworICAgIGVudi0+RXhjZXB0aW9uQ2xlYXIoKTsKKyAgICBMT0coRVJST1IpIDw8ICJDb3VsZCBub3QgcmVnaXN0ZXIgbmF0aXZlcyBmb3IgSnZtdGlUYWdnaW5nVGVzdCBjbGFzcyI7CisgIH0KK30KKwogfSAgLy8gbmFtZXNwYWNlIGFydAogCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL2Jhc2Uvam5pL3RyYWNraW5nLmNwcCBiL2hvc3RzaWRldGVzdHMvanZtdGkvYmFzZS9qbmkvdHJhY2tpbmcuY3BwCmluZGV4IGEwN2Q2NTMuLjQyNWZkNjMgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvYmFzZS9qbmkvdHJhY2tpbmcuY3BwCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvYmFzZS9qbmkvdHJhY2tpbmcuY3BwCkBAIC0yMSw2ICsyMSw3IEBACiAKICNpbmNsdWRlICJhbmRyb2lkLWJhc2UvbG9nZ2luZy5oIgogI2luY2x1ZGUgImFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaCIKKyNpbmNsdWRlICJqbmlfYmluZGVyLmgiCiAjaW5jbHVkZSAianZtdGlfaGVscGVyLmgiCiAjaW5jbHVkZSAic2NvcGVkX2xvY2FsX3JlZi5oIgogI2luY2x1ZGUgInNjb3BlZF91dGZfY2hhcnMuaCIKQEAgLTkzLDQgKzk0LDMwIEBACiAgIHJldHVybiBlbnYtPk5ld1N0cmluZ1VURihyZXN1bHQuY19zdHIoKSk7CiB9CiAKK3N0YXRpYyBKTklOYXRpdmVNZXRob2QgZ01ldGhvZHNbXSA9IHsKKyAgeyAic2V0dXBPYmplY3RBbGxvY0NhbGxiYWNrIiwgIihaKVYiLAorICAgICAgICAgICh2b2lkKilKYXZhX2FuZHJvaWRfanZtdGlfY3RzX0p2bXRpVHJhY2tpbmdUZXN0X3NldHVwT2JqZWN0QWxsb2NDYWxsYmFjayB9LAorCisgIHsgImVuYWJsZUFsbG9jYXRpb25UcmFja2luZyIsICIoTGphdmEvbGFuZy9UaHJlYWQ7WilWIiwKKyAgICAgICAgICAodm9pZCopSmF2YV9hbmRyb2lkX2p2bXRpX2N0c19Kdm10aVRyYWNraW5nVGVzdF9lbmFibGVBbGxvY2F0aW9uVHJhY2tpbmcgfSwKKworICB7ICJnZXRBbmRSZXNldEFsbG9jYXRpb25UcmFja2luZ1N0cmluZyIsICIoKUxqYXZhL2xhbmcvU3RyaW5nOyIsCisgICAgICAgICAgKHZvaWQqKUphdmFfYW5kcm9pZF9qdm10aV9jdHNfSnZtdGlUcmFja2luZ1Rlc3RfZ2V0QW5kUmVzZXRBbGxvY2F0aW9uVHJhY2tpbmdTdHJpbmcgfSwKK307CisKK3ZvaWQgcmVnaXN0ZXJfYW5kcm9pZF9qdm10aV9jdHNfSnZtdGlUcmFja2luZ1Rlc3QoanZtdGlFbnYqIGplbnYsIEpOSUVudiogZW52KSB7CisgIFNjb3BlZExvY2FsUmVmPGpjbGFzcz4ga2xhc3MoZW52LCBHZXRDbGFzcyhqZW52LCBlbnYsCisgICAgICAgICAgImFuZHJvaWQvanZtdGkvY3RzL0p2bXRpVHJhY2tpbmdUZXN0IiwgbnVsbHB0cikpOworICBpZiAoa2xhc3MuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgIGVudi0+RXhjZXB0aW9uQ2xlYXIoKTsKKyAgICByZXR1cm47CisgIH0KKworICBlbnYtPlJlZ2lzdGVyTmF0aXZlcyhrbGFzcy5nZXQoKSwgZ01ldGhvZHMsIHNpemVvZihnTWV0aG9kcykgLyBzaXplb2YoSk5JTmF0aXZlTWV0aG9kKSk7CisgIGlmIChlbnYtPkV4Y2VwdGlvbkNoZWNrKCkpIHsKKyAgICBlbnYtPkV4Y2VwdGlvbkNsZWFyKCk7CisgICAgTE9HKEVSUk9SKSA8PCAiQ291bGQgbm90IHJlZ2lzdGVyIG5hdGl2ZXMgZm9yIEp2bXRpVHJhY2tpbmdUZXN0IGNsYXNzIjsKKyAgfQorfQorCiB9ICAvLyBuYW1lc3BhY2UgYXJ0CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL2Jhc2UvcnVuLXRlc3QtYmFzZWQtYXBwL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL2Jhc2UvcnVuLXRlc3QtYmFzZWQtYXBwL0FuZHJvaWQubWsKaW5kZXggN2M4YjQxNy4uZjFmYTQ4MCAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9iYXNlL3J1bi10ZXN0LWJhc2VkLWFwcC9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvYmFzZS9ydW4tdGVzdC1iYXNlZC1hcHAvQW5kcm9pZC5tawpAQCAtMjUsNyArMjUsNyBAQAogCiBMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CiBMT0NBTF9ERVhfUFJFT1BUIDo9IGZhbHNlCi1MT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyIGN0cy1qdW5pdAorTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lci5zdHVicyBjdHMtanVuaXQKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aURldmljZUFwcEJhc2UKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyArPSBydW4tdGVzdC1qdm10aS1qYXZhCiBMT0NBTF9QUk9HVUFSRF9FTkFCTEVEIDo9IGRpc2FibGVkCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL2Jhc2UvcnVuLXRlc3QtYmFzZWQtYXBwL3NyYy9hbmRyb2lkL2p2bXRpL2N0cy9Kdm10aVJ1blRlc3RCYXNlZFRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvanZtdGkvYmFzZS9ydW4tdGVzdC1iYXNlZC1hcHAvc3JjL2FuZHJvaWQvanZtdGkvY3RzL0p2bXRpUnVuVGVzdEJhc2VkVGVzdC5qYXZhCmluZGV4IDMxMmE4ODIuLmZjYjcxOGEgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvYmFzZS9ydW4tdGVzdC1iYXNlZC1hcHAvc3JjL2FuZHJvaWQvanZtdGkvY3RzL0p2bXRpUnVuVGVzdEJhc2VkVGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvYmFzZS9ydW4tdGVzdC1iYXNlZC1hcHAvc3JjL2FuZHJvaWQvanZtdGkvY3RzL0p2bXRpUnVuVGVzdEJhc2VkVGVzdC5qYXZhCkBAIC0yMCw2ICsyMCw3IEBACiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwogCkBAIC01NSwxNCArNTYsNTMgQEAKICAgICAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlci5HRVRfTUVUQV9EQVRBKS5tZXRhRGF0YS5nZXRJbnQoImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0X25yIik7CiAgICAgfQogCisgICAgLy8gU29tZSB0ZXN0cyBhcmUgdmVyeSBzZW5zaXRpdmUgdG8gc3RhdGUgb2YgdGhlIHRocmVhZCB0aGV5IGFyZSBydW5uaW5nIG9uLiBUbyBzdXBwb3J0IHRoaXMgd2UKKyAgICAvLyBjYW4gaGF2ZSB0ZXN0cyBydW4gb24gbmV3bHkgY3JlYXRlZCB0aHJlYWRzLiBUaGlzIGRlZmF1bHRzIHRvIGZhbHNlLgorICAgIHByb3RlY3RlZCBib29sZWFuIG5lZWROZXdUaHJlYWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG1BY3Rpdml0eQorICAgICAgICAgICAgLmdldFBhY2thZ2VNYW5hZ2VyKCkKKyAgICAgICAgICAgIC5nZXRBcHBsaWNhdGlvbkluZm8obUFjdGl2aXR5LmdldFBhY2thZ2VOYW1lKCksIFBhY2thZ2VNYW5hZ2VyLkdFVF9NRVRBX0RBVEEpCisgICAgICAgICAgICAubWV0YURhdGEKKyAgICAgICAgICAgIC5nZXRCb29sZWFuKCJhbmRyb2lkLmp2bXRpLmN0cy5uZWVkc19uZXdfdGhyZWFkIiwgLypkZWZhdWx0VmFsdWUqL2ZhbHNlKTsKKyAgICB9CisKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RSdW5UZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIGludCBuciA9IGdldFRlc3ROdW1iZXIoKTsKIAogICAgICAgICAvLyBMb2FkIHRoZSB0ZXN0IGNsYXNzLgogICAgICAgICBDbGFzczw/PiB0ZXN0Q2xhc3MgPSBDbGFzcy5mb3JOYW1lKCJhcnQuVGVzdCIgKyBucik7Ci0gICAgICAgIE1ldGhvZCBydW5NZXRob2QgPSB0ZXN0Q2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoInJ1biIpOwotICAgICAgICBydW5NZXRob2QuaW52b2tlKG51bGwpOworICAgICAgICBmaW5hbCBNZXRob2QgcnVuTWV0aG9kID0gdGVzdENsYXNzLmdldERlY2xhcmVkTWV0aG9kKCJydW4iKTsKKyAgICAgICAgaWYgKG5lZWROZXdUaHJlYWQoKSkgeworICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgdGhyZWFkIHRoZSB0ZXN0IGlzIHJ1bm5pbmcgb24gaGFzIHRoZSByaWdodCBuYW1lLiBTb21lIHRlc3RzIGFyZQorICAgICAgICAgIC8vIHNlbnNpdGl2ZSB0byB0aGlzLiBJZGVhbGx5IHdlIHdvdWxkIGFsc28gYXZvaWQgaGF2aW5nIGEgdHJ5LWNhdGNoIHRvbyBidXQgdGhhdCBpcyBtb3JlCisgICAgICAgICAgLy8gdHJvdWJsZSB0aGFuIGl0J3Mgd29ydGguCisgICAgICAgICAgZmluYWwgVGhyb3dhYmxlW10gZmluYWxfdGhyb3cgPSBuZXcgVGhyb3dhYmxlW10geyBudWxsIH07CisgICAgICAgICAgVGhyZWFkIG1haW5fdGhyZWFkID0gbmV3IFRocmVhZCgKKyAgICAgICAgICAgICAgKCkgLT4geworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICBydW5NZXRob2QuaW52b2tlKG51bGwpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkV4Y2VwdGlvbiB0aHJvd24iLCBlKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiRXhjZXB0aW9uIHRocm93biIsIGUpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiRXhjZXB0aW9uIHRocm93biIsIGUpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJFeGNlcHRpb24gdGhyb3duIiwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9LCAibWFpbiIpOworICAgICAgICAgIG1haW5fdGhyZWFkLnNldFVuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcigodGhyZWFkLCBlKSAtPiB7IGZpbmFsX3Rocm93WzBdID0gZTsgfSk7CisKKyAgICAgICAgICBtYWluX3RocmVhZC5zdGFydCgpOworICAgICAgICAgIG1haW5fdGhyZWFkLmpvaW4oKTsKKworICAgICAgICAgIGlmIChmaW5hbF90aHJvd1swXSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihmaW5hbF90aHJvd1swXSwgIlJlbW90ZSBleGNlcHRpb24gb2NjdXJyZWQuIik7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJ1bk1ldGhvZC5pbnZva2UobnVsbCk7CisgICAgICAgIH0KIAogICAgICAgICAvLyBMb2FkIHRoZSBleHBlY3RlZCB0eHQgZmlsZS4KICAgICAgICAgSW5wdXRTdHJlYW0gZXhwZWN0ZWRTdHJlYW0gPSBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvaG9zdF9zaWRlLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ob3N0X3NpZGUubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA4ZDE3MAotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvaG9zdF9zaWRlLm1rCkBAIC0wLDAgKzEsNDUgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgVGhpcyBmaWxlIGlzIG1lYW50IHRvIGJlIGluY2x1ZGVkIGZvciBldmVyeSBob3N0LXNpZGUgdGVzdCBjYXNlIHRvCisjIGhhdmUgY29tbW9uIGJ1aWxkIHN5c3RlbSBjb2RlLgorIworIyBGb3IgZXhhbXBsZToKKyMKKyMgICBMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisjCisjICAgaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisjCisjICAgTE9DQUxfTU9EVUxFIDo9IEN0c0p2bXRpUnVuVGVzdDkwMkhvc3RUZXN0Q2FzZXMKKyMKKyMgICBpbmNsdWRlICQoTE9DQUxfUEFUSCkvLi4vaG9zdF9zaWRlLm1rCisjCisKKworaWZuZGVmIExPQ0FMX1BBVEgKKyAgJChlcnJvciBMT0NBTF9QQVRIIG5vdCBkZWZpbmVkKQorZW5kaWYKK2lmbmRlZiBMT0NBTF9NT0RVTEUKKyAgJChlcnJvciBMT0NBTF9NT0RVTEUgbm90IGRlZmluZWQpCitlbmRpZgorCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gQ3RzSnZtdGlIb3N0VGVzdEJhc2UKK0xPQ0FMX0pBUkpBUl9SVUxFUyA6PSAkKExPQ0FMX1BBVEgpL2phcmphci1ydWxlcy50eHQKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworCitpbmNsdWRlICQoQlVJTERfSE9TVF9KQVZBX0xJQlJBUlkpCisKK2luY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKKwpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9yZWRlZmluaW5nL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3JlZGVmaW5pbmcvQW5kcm9pZC5tawppbmRleCAzMjdhYTY5Li5hNWMwZjA3IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3JlZGVmaW5pbmcvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3JlZGVmaW5pbmcvQW5kcm9pZC5tawpAQCAtMTcsMTEgKzE3LDUgQEAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCiBMT0NBTF9NT0RVTEUgOj0gQ3RzSnZtdGlSZWRlZmluZUNsYXNzZXNIb3N0VGVzdENhc2VzCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gQ3RzSnZtdGlIb3N0VGVzdEJhc2UKLUxPQ0FMX0pBUkpBUl9SVUxFUyA6PSAkKExPQ0FMX1BBVEgpL2phcmphci1ydWxlcy50eHQKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cwogCi1pbmNsdWRlICQoQlVJTERfSE9TVF9KQVZBX0xJQlJBUlkpCi0KLWluY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKK2luY2x1ZGUgJChMT0NBTF9QQVRIKS8uLi9ob3N0X3NpZGUubWsKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcmVkZWZpbmluZy9BbmRyb2lkVGVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3JlZGVmaW5pbmcvQW5kcm9pZFRlc3QueG1sCmluZGV4IGIxZjliMDEuLjFkMDRjYjkgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcmVkZWZpbmluZy9BbmRyb2lkVGVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9yZWRlZmluaW5nL0FuZHJvaWRUZXN0LnhtbApAQCAtMTQsNiArMTQsNyBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIEpWTVRJIHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJhcnQiIC8+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CiAgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcmVkZWZpbmluZy9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcmVkZWZpbmluZy9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA0Mjk5YjVlLi4zM2IyMmMzIDEwMDc1NQotLS0gYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3JlZGVmaW5pbmcvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9yZWRlZmluaW5nL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yNiw3ICsyNiw3IEBACiAKICAgICA8IS0tICBzZWxmLWluc3RydW1lbnRpbmcgdGVzdCBwYWNrYWdlLiAtLT4KICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBmb3IgSlZNVEkiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5qdm10aS5jdHMucmVkZWZpbmUiID4KICAgICA8L2luc3RydW1lbnRhdGlvbj4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy9BbmRyb2lkLm1rCmluZGV4IGNhMDdjYWIuLjM2Mjg4NzcgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvQW5kcm9pZC5tawpAQCAtMjAsNiArMjAsMTQgQEAKICAgc3JjLzkwMi1oZWxsby10cmFuc2Zvcm1hdGlvbi9zcmMvYXJ0L1JlZGVmaW5pdGlvbi5qYXZhIFwKICAgc3JjLzkwMy1oZWxsby10YWdnaW5nL3NyYy9hcnQvTWFpbi5qYXZhIFwKICAgc3JjLzk4OS1tZXRob2QtdHJhY2UtdGhyb3cvc3JjL2FydC9UcmFjZS5qYXZhIFwKKyAgc3JjLzk5My1icmVha3BvaW50cy9zcmMvYXJ0L0JyZWFrcG9pbnQuamF2YSBcCisgIHNyYy8xOTAyLXN1c3BlbmQvc3JjL2FydC9TdXNwZW5zaW9uLmphdmEgXAorICBzcmMvMTkxMS1nZXQtbG9jYWwtdmFyLXRhYmxlL3NyYy9hcnQvTG9jYWxzLmphdmEgXAorICBzcmMvMTkxMi1nZXQtc2V0LWxvY2FsLXByaW1pdGl2ZS9zcmMvYXJ0L1N0YWNrVHJhY2UuamF2YSBcCisgIHNyYy8xOTIzLWZyYW1lLXBvcC9zcmMvYXJ0L0ZyYW1lUG9wLmphdmEgXAorICBzcmMvMTkyNy1leGNlcHRpb24tZXZlbnQvc3JjL2FydC9FeGNlcHRpb25zLmphdmEgXAorICBzcmMvMTkzMC1tb25pdG9yLWluZm8vc3JjL2FydC9Nb25pdG9ycy5qYXZhIFwKKyAgc3JjLzE5MzQtanZtdGktc2lnbmFsLXRocmVhZC9zcmMvYXJ0L1RocmVhZHMuamF2YSBcCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKExPQ0FMX1NISU1fQ0xBU1NFUykKIApAQCAtNzEsNiArNzksNyBAQAogICBzcmMvOTQ3LXJlZmxlY3QtbWV0aG9kL3NyYy9hcnQvVGVzdDk0Ny5qYXZhIFwKICAgc3JjLzk1MS10aHJlYWRlZC1vYnNvbGV0ZS9zcmMvYXJ0L1Rlc3Q5NTEuamF2YSBcCiAgIHNyYy85ODItb2stbm8tcmV0cmFuc2Zvcm0vc3JjL2FydC9UZXN0OTgyLmphdmEgXAorICBzcmMvOTgzLXNvdXJjZS10cmFuc2Zvcm0tdmVyaWZ5L3NyYy9hcnQvVGVzdDk4My5qYXZhIFwKICAgc3JjLzk4NC1vYnNvbGV0ZS1pbnZva2Uvc3JjL2FydC9UZXN0OTg0LmphdmEgXAogICBzcmMvOTg1LXJlLW9ic29sZXRlL3NyYy9hcnQvVGVzdDk4NS5qYXZhIFwKICAgc3JjLzk4Ni1uYXRpdmUtbWV0aG9kLWJpbmQvc3JjL2FydC9UZXN0OTg2LmphdmEgXApAQCAtODEsNiArOTAsNDggQEAKICAgc3JjLzk5MS1maWVsZC10cmFjZS0yL3NyYy9hcnQvVGVzdDk5MS5qYXZhIFwKICAgc3JjLzk5Mi1zb3VyY2UtZGF0YS9zcmMvYXJ0L1Rlc3Q5OTIuamF2YSBcCiAgICAgc3JjLzk5Mi1zb3VyY2UtZGF0YS9zcmMvYXJ0L1RhcmdldDIuamF2YSBcCisgIHNyYy85OTMtYnJlYWtwb2ludHMvc3JjL2FydC9UZXN0OTkzLmphdmEgXAorICBzcmMvOTk0LWJyZWFrcG9pbnQtbGluZS9zcmMvYXJ0L1Rlc3Q5OTQuamF2YSBcCisgIHNyYy85OTUtYnJlYWtwb2ludHMtdGhyb3cvc3JjL2FydC9UZXN0OTk1LmphdmEgXAorICBzcmMvOTk2LWJyZWFrcG9pbnQtb2Jzb2xldGUvc3JjL2FydC9UZXN0OTk2LmphdmEgXAorICBzcmMvOTk3LXNpbmdsZS1zdGVwL3NyYy9hcnQvVGVzdDk5Ny5qYXZhIFwKKyAgc3JjLzE5MDAtdHJhY2stYWxsb2Mvc3JjL2FydC9UZXN0MTkwMC5qYXZhIFwKKyAgc3JjLzE5MDEtZ2V0LWJ5dGVjb2Rlcy9zcmMvYXJ0L1Rlc3QxOTAxLmphdmEgXAorICBzcmMvMTkwMi1zdXNwZW5kL3NyYy9hcnQvVGVzdDE5MDIuamF2YSBcCisgIHNyYy8xOTAzLXN1c3BlbmQtc2VsZi9zcmMvYXJ0L1Rlc3QxOTAzLmphdmEgXAorICBzcmMvMTkwNC1kb3VibGUtc3VzcGVuZC9zcmMvYXJ0L1Rlc3QxOTA0LmphdmEgXAorICBzcmMvMTkwNi1zdXNwZW5kLWxpc3QtbWUtZmlyc3Qvc3JjL2FydC9UZXN0MTkwNi5qYXZhIFwKKyAgc3JjLzE5MDctc3VzcGVuZC1saXN0LXNlbGYtdHdpY2Uvc3JjL2FydC9UZXN0MTkwNy5qYXZhIFwKKyAgc3JjLzE5MDgtc3VzcGVuZC1uYXRpdmUtcmVzdW1lLXNlbGYvc3JjL2FydC9UZXN0MTkwOC5qYXZhIFwKKyAgc3JjLzE5MDktcGVyLWFnZW50LXRscy9zcmMvYXJ0L1Rlc3QxOTA5LmphdmEgXAorICBzcmMvMTkxMC10cmFuc2Zvcm0td2l0aC1kZWZhdWx0L3NyYy9hcnQvVGVzdDE5MTAuamF2YSBcCisgIHNyYy8xOTExLWdldC1sb2NhbC12YXItdGFibGUvc3JjL2FydC9UZXN0MTkxMS5qYXZhIFwKKyAgc3JjLzE5MTItZ2V0LXNldC1sb2NhbC1wcmltaXRpdmUvc3JjL2FydC9UZXN0MTkxMi5qYXZhIFwKKyAgc3JjLzE5MTMtZ2V0LXNldC1sb2NhbC1vYmplY3RzL3NyYy9hcnQvVGVzdDE5MTMuamF2YSBcCisgIHNyYy8xOTE0LWdldC1sb2NhbC1pbnN0YW5jZS9zcmMvYXJ0L1Rlc3QxOTE0LmphdmEgXAorICBzcmMvMTkxNS1nZXQtc2V0LWxvY2FsLWN1cnJlbnQtdGhyZWFkL3NyYy9hcnQvVGVzdDE5MTUuamF2YSBcCisgIHNyYy8xOTE2LWdldC1zZXQtY3VycmVudC1mcmFtZS9zcmMvYXJ0L1Rlc3QxOTE2LmphdmEgXAorICBzcmMvMTkxNy1nZXQtc3RhY2stZnJhbWUvc3JjL2FydC9UZXN0MTkxNy5qYXZhIFwKKyAgc3JjLzE5MjAtc3VzcGVuZC1uYXRpdmUtbW9uaXRvci9zcmMvYXJ0L1Rlc3QxOTIwLmphdmEgXAorICBzcmMvMTkyMS1zdXNwZW5kLW5hdGl2ZS1yZWN1cnNpdmUtbW9uaXRvci9zcmMvYXJ0L1Rlc3QxOTIxLmphdmEgXAorICBzcmMvMTkyMi1vd25lZC1tb25pdG9ycy1pbmZvL3NyYy9hcnQvVGVzdDE5MjIuamF2YSBcCisgIHNyYy8xOTIzLWZyYW1lLXBvcC9zcmMvYXJ0L1Rlc3QxOTIzLmphdmEgXAorICBzcmMvMTkyNC1mcmFtZS1wb3AtdG9nZ2xlL3NyYy9hcnQvVGVzdDE5MjQuamF2YSBcCisgIHNyYy8xOTI1LXNlbGYtZnJhbWUtcG9wL3NyYy9hcnQvVGVzdDE5MjUuamF2YSBcCisgIHNyYy8xOTI2LW1pc3NlZC1mcmFtZS1wb3Avc3JjL2FydC9UZXN0MTkyNi5qYXZhIFwKKyAgc3JjLzE5MjctZXhjZXB0aW9uLWV2ZW50L3NyYy9hcnQvVGVzdDE5MjcuamF2YSBcCisgIHNyYy8xOTI4LWV4Y2VwdGlvbi1ldmVudC1leGNlcHRpb24vc3JjL2FydC9UZXN0MTkyOC5qYXZhIFwKKyAgc3JjLzE5MzAtbW9uaXRvci1pbmZvL3NyYy9hcnQvVGVzdDE5MzAuamF2YSBcCisgIHNyYy8xOTMxLW1vbml0b3ItZXZlbnRzL3NyYy9hcnQvVGVzdDE5MzEuamF2YSBcCisgIHNyYy8xOTMyLW1vbml0b3ItZXZlbnRzLW1pc2Mvc3JjL2FydC9UZXN0MTkzMi5qYXZhIFwKKyAgc3JjLzE5MzMtbW9uaXRvci1jdXJyZW50LWNvbnRlbmRlZC9zcmMvYXJ0L1Rlc3QxOTMzLmphdmEgXAorICBzcmMvMTkzNC1qdm10aS1zaWduYWwtdGhyZWFkL3NyYy9hcnQvVGVzdDE5MzQuamF2YSBcCisgIHNyYy8xOTM2LXRocmVhZC1lbmQtZXZlbnRzL3NyYy9hcnQvVGVzdDE5MzYuamF2YSBcCisgIHNyYy8xOTM3LXRyYW5zZm9ybS1zb2Z0LWZhaWwvc3JjL2FydC9UZXN0MTkzNy5qYXZhIFwKKyAgc3JjLzE5MzktcHJveHktZnJhbWVzL3NyYy9hcnQvVGVzdDE5MzkuamF2YSBcCisgIHNyYy8xOTQxLWRpc3Bvc2Utc3RyZXNzL3NyYy9hcnQvVGVzdDE5NDEuamF2YSBcCisgIHNyYy8xOTQyLXN1c3BlbmQtcmF3LW1vbml0b3ItZXhpdC9zcmMvYXJ0L1Rlc3QxOTQyLmphdmEgXAorICBzcmMvMTk0My1zdXNwZW5kLXJhdy1tb25pdG9yLXdhaXQvc3JjL2FydC9UZXN0MTk0My5qYXZhIFwKIAogSlZNVElfUlVOX1RFU1RfR0VORVJBVEVEX05VTUJFUlMgOj0gXAogICA5MDEgXApAQCAtMTE5LDYgKzE3MCw3IEBACiAgIDk0NyBcCiAgIDk1MSBcCiAgIDk4MiBcCisgIDk4MyBcCiAgIDk4NCBcCiAgIDk4NSBcCiAgIDk4NiBcCkBAIC0xMjcsNiArMTc5LDQ4IEBACiAgIDk5MCBcCiAgIDk5MSBcCiAgIDk5MiBcCisgIDk5MyBcCisgIDk5NCBcCisgIDk5NSBcCisgIDk5NiBcCisgIDk5NyBcCisgIDE5MDAgXAorICAxOTAxIFwKKyAgMTkwMiBcCisgIDE5MDMgXAorICAxOTA0IFwKKyAgMTkwNiBcCisgIDE5MDcgXAorICAxOTA4IFwKKyAgMTkwOSBcCisgIDE5MTAgXAorICAxOTExIFwKKyAgMTkxMiBcCisgIDE5MTMgXAorICAxOTE0IFwKKyAgMTkxNSBcCisgIDE5MTYgXAorICAxOTE3IFwKKyAgMTkyMCBcCisgIDE5MjEgXAorICAxOTIyIFwKKyAgMTkyMyBcCisgIDE5MjQgXAorICAxOTI1IFwKKyAgMTkyNiBcCisgIDE5MjcgXAorICAxOTI4IFwKKyAgMTkzMCBcCisgIDE5MzEgXAorICAxOTMyIFwKKyAgMTkzMyBcCisgIDE5MzQgXAorICAxOTM2IFwKKyAgMTkzNyBcCisgIDE5MzkgXAorICAxOTQxIFwKKyAgMTk0MiBcCisgIDE5NDMgXAogCiAjIFRyeSB0byBlbmZvcmNlIHRoYXQgdGhlIGRpcmVjdG9yaWVzIGNvcnJlc3BvbmQgdG8gdGhlIEphdmEgZmlsZXMgd2UgcHVsbCBpbi4KIEpWTVRJX1JVTl9URVNUX0RJUl9DSEVDSyA6PSAkKHNvcnQgJChmb3JlYWNoIERJUiwkKGFkZHByZWZpeCBzcmMvLCQoSlZNVElfUlVOX1RFU1RfR0VORVJBVEVEX05VTUJFUlMpKSwgXApAQCAtMTQ4LDE2ICsyNDIsMTkgQEAKIAogR0VOX0lOUFVUIDo9ICQod2lsZGNhcmQgJChMT0NBTF9QQVRIKS9zcmMvJCgxKSovZXhwZWN0ZWQudHh0KQogaWZlcSAodHJ1ZSwkKEFORFJPSURfQ09NUElMRV9XSVRIX0pBQ0spKQotR0VOX0pBQ0sgOj0gJCh3aWxkY2FyZCAkKExPQ0FMX1BBVEgpL3NyYy8kKDEpKi9leHBlY3RlZF9qYWNrLmRpZmYpCitHRU5fRVhUUkFfRElGRiA6PSAkKHdpbGRjYXJkICQoTE9DQUxfUEFUSCkvc3JjLyQoMSkqL2V4cGVjdGVkX2phY2suZGlmZikKK2Vsc2UgaWZlcSAodHJ1ZSwkKFVTRV9EOCkpCitHRU5fRVhUUkFfRElGRiA6PSAkKHdpbGRjYXJkICQoTE9DQUxfUEFUSCkvc3JjLyQoMSkqL2V4cGVjdGVkX2Q4LmRpZmYpCiBlbHNlCi1HRU5fSkFDSyA6PQorR0VOX0VYVFJBX0RJRkYgOj0KIGVuZGlmCisKIEdFTl9PVVRQVVQgOj0gJChHRU5FUkFURURfU1JDX0RJUikvcmVzdWx0cy4kKDEpLmV4cGVjdGVkLnR4dAotJCQoR0VOX09VVFBVVCk6IFBSSVZBVEVfR0VOX0pBQ0sgOj0gJCQoR0VOX0pBQ0spCi0kJChHRU5fT1VUUFVUKTogJCQoR0VOX0lOUFVUKSAkJChHRU5fSkFDSykKKyQkKEdFTl9PVVRQVVQpOiBQUklWQVRFX0dFTl9FWFRSQV9ESUZGIDo9ICQkKEdFTl9FWFRSQV9ESUZGKQorJCQoR0VOX09VVFBVVCk6ICQkKEdFTl9JTlBVVCkgJCQoR0VOX0VYVFJBX0RJRkYpCiAJY3AgJCQ8ICQkQAotaWZuZXEgKCwkJChHRU5fSkFDSykpCi0JKGNkICQkKGRpciAkJEApICYmIHBhdGNoICQkKG5vdGRpciAkJEApKSA8ICQkKFBSSVZBVEVfR0VOX0pBQ0spCitpZm5lcSAoLCQkKEdFTl9FWFRSQV9ESUZGKSkKKwkoY2QgJCQoZGlyICQkQCkgJiYgcGF0Y2ggJCQobm90ZGlyICQkQCkpIDwgJCQoUFJJVkFURV9HRU5fRVhUUkFfRElGRikKIGVuZGlmCiAKIEdFTl9JTlBVVCA6PQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTAwL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MDAvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTVjZTRkCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTAwL0FuZHJvaWQubWsKQEAgLTAsMCArMSwyMSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFIDo9IEN0c0p2bXRpUnVuVGVzdDE5MDBIb3N0VGVzdENhc2VzCisKK2luY2x1ZGUgJChMT0NBTF9QQVRIKS8uLi8uLi9ob3N0X3NpZGUubWsKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkwMC9BbmRyb2lkVGVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MDAvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNDJmMjIKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MDAvQW5kcm9pZFRlc3QueG1sCkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgSlZNVEkgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIvPgorICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iYXJ0IiAvPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJDdHNKdm10aVJ1blRlc3QxOTAwRGV2aWNlQXBwLmFwayIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGVzdHR5cGUuSmFySG9zdFRlc3QiID4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJqYXIiIHZhbHVlPSJDdHNKdm10aVJ1blRlc3QxOTAwSG9zdFRlc3RDYXNlcy5qYXIiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ic2V0LW9wdGlvbiIgdmFsdWU9InRlc3QtZmlsZS1uYW1lOkN0c0p2bXRpUnVuVGVzdDE5MDBEZXZpY2VBcHAuYXBrIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InNldC1vcHRpb24iIHZhbHVlPSJwYWNrYWdlLW5hbWU6YW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfMTkwMCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJydW50aW1lLWhpbnQiIHZhbHVlPSI4cyIvPgorICAgIDwvdGVzdD4KKzwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkwMC9hcHAvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkwMC9hcHAvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTJiZGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTAwL2FwcC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzMgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKK0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCitMT0NBTF9ERVhfUFJFT1BUIDo9IGZhbHNlCitMT0NBTF9QUk9HVUFSRF9FTkFCTEVEIDo9IGRpc2FibGVkCitMT0NBTF9TUkNfRklMRVMgOj0KK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gQ3RzSnZtdGlEZXZpY2VSdW5UZXN0QXBwQmFzZQorTE9DQUxfSk5JX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3RzanZtdGlhZ2VudAorTE9DQUxfTVVMVElMSUIgOj0gYm90aAorTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorCisjIFRPRE86IFJlZmFjdG9yLiBUaGlzIGlzIHRoZSBvbmx5IHRoaW5nIGV2ZXJ5IGNoYW5naW5nLgorTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0p2bXRpUnVuVGVzdDE5MDBEZXZpY2VBcHAKKworaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MDAvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MDAvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIwNmM2ZAotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkwMC9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDM1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfMTkwMCI+CisKKyAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpkZWJ1Z2dhYmxlPSJ0cnVlIj4KKyAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CisgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF9uciIgYW5kcm9pZDp2YWx1ZT0iMTkwMCIgLz4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5qdm10aS5Kdm10aUFjdGl2aXR5IiA+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgPC9hcHBsaWNhdGlvbj4KKworICAgIDwhLS0gIHNlbGYtaW5zdHJ1bWVudGluZyB0ZXN0IHBhY2thZ2UuIC0tPgorICAgIDxpbnN0cnVtZW50YXRpb24KKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBmb3IgSlZNVEkiCisgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfMTkwMCIgPgorICAgIDwvaW5zdHJ1bWVudGF0aW9uPgorPC9tYW5pZmVzdD4KKwpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTAwL2phcmphci1ydWxlcy50eHQgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MDAvamFyamFyLXJ1bGVzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDM1NzgyCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTAwL2phcmphci1ydWxlcy50eHQKQEAgLTAsMCArMSBAQAorcnVsZSBhbmRyb2lkLmp2bXRpLmN0cy5Kdm10aUhvc3RUZXN0KiogYW5kcm9pZC5qdm10aS5jdHMuSnZtdGlIb3N0VGVzdDE5MDBAMQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTAxL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MDEvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTlhMTVhCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTAxL0FuZHJvaWQubWsKQEAgLTAsMCArMSwyMSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFIDo9IEN0c0p2bXRpUnVuVGVzdDE5MDFIb3N0VGVzdENhc2VzCisKK2luY2x1ZGUgJChMT0NBTF9QQVRIKS8uLi8uLi9ob3N0X3NpZGUubWsKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkwMS9BbmRyb2lkVGVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MDEvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZDZjZTEKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MDEvQW5kcm9pZFRlc3QueG1sCkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgSlZNVEkgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIvPgorICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iYXJ0IiAvPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJDdHNKdm10aVJ1blRlc3QxOTAxRGV2aWNlQXBwLmFwayIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGVzdHR5cGUuSmFySG9zdFRlc3QiID4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJqYXIiIHZhbHVlPSJDdHNKdm10aVJ1blRlc3QxOTAxSG9zdFRlc3RDYXNlcy5qYXIiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ic2V0LW9wdGlvbiIgdmFsdWU9InRlc3QtZmlsZS1uYW1lOkN0c0p2bXRpUnVuVGVzdDE5MDFEZXZpY2VBcHAuYXBrIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InNldC1vcHRpb24iIHZhbHVlPSJwYWNrYWdlLW5hbWU6YW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfMTkwMSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJydW50aW1lLWhpbnQiIHZhbHVlPSI4cyIvPgorICAgIDwvdGVzdD4KKzwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkwMS9hcHAvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkwMS9hcHAvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDEwMTdlCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTAxL2FwcC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzMgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKK0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCitMT0NBTF9ERVhfUFJFT1BUIDo9IGZhbHNlCitMT0NBTF9QUk9HVUFSRF9FTkFCTEVEIDo9IGRpc2FibGVkCitMT0NBTF9TUkNfRklMRVMgOj0KK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gQ3RzSnZtdGlEZXZpY2VSdW5UZXN0QXBwQmFzZQorTE9DQUxfSk5JX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3RzanZtdGlhZ2VudAorTE9DQUxfTVVMVElMSUIgOj0gYm90aAorTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorCisjIFRPRE86IFJlZmFjdG9yLiBUaGlzIGlzIHRoZSBvbmx5IHRoaW5nIGV2ZXJ5IGNoYW5naW5nLgorTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0p2bXRpUnVuVGVzdDE5MDFEZXZpY2VBcHAKKworaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MDEvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MDEvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk5N2Y4MAotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkwMS9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDM1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfMTkwMSI+CisKKyAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpkZWJ1Z2dhYmxlPSJ0cnVlIj4KKyAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CisgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF9uciIgYW5kcm9pZDp2YWx1ZT0iMTkwMSIgLz4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5qdm10aS5Kdm10aUFjdGl2aXR5IiA+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgPC9hcHBsaWNhdGlvbj4KKworICAgIDwhLS0gIHNlbGYtaW5zdHJ1bWVudGluZyB0ZXN0IHBhY2thZ2UuIC0tPgorICAgIDxpbnN0cnVtZW50YXRpb24KKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBmb3IgSlZNVEkiCisgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfMTkwMSIgPgorICAgIDwvaW5zdHJ1bWVudGF0aW9uPgorPC9tYW5pZmVzdD4KKwpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTAxL2phcmphci1ydWxlcy50eHQgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MDEvamFyamFyLXJ1bGVzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGFlZjg0Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTAxL2phcmphci1ydWxlcy50eHQKQEAgLTAsMCArMSBAQAorcnVsZSBhbmRyb2lkLmp2bXRpLmN0cy5Kdm10aUhvc3RUZXN0KiogYW5kcm9pZC5qdm10aS5jdHMuSnZtdGlIb3N0VGVzdDE5MDFAMQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTAyL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MDIvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODAxOTQxCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTAyL0FuZHJvaWQubWsKQEAgLTAsMCArMSwyMSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFIDo9IEN0c0p2bXRpUnVuVGVzdDE5MDJIb3N0VGVzdENhc2VzCisKK2luY2x1ZGUgJChMT0NBTF9QQVRIKS8uLi8uLi9ob3N0X3NpZGUubWsKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkwMi9BbmRyb2lkVGVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MDIvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNDQ3NzkKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MDIvQW5kcm9pZFRlc3QueG1sCkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgSlZNVEkgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIvPgorICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iYXJ0IiAvPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJDdHNKdm10aVJ1blRlc3QxOTAyRGV2aWNlQXBwLmFwayIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGVzdHR5cGUuSmFySG9zdFRlc3QiID4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJqYXIiIHZhbHVlPSJDdHNKdm10aVJ1blRlc3QxOTAySG9zdFRlc3RDYXNlcy5qYXIiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ic2V0LW9wdGlvbiIgdmFsdWU9InRlc3QtZmlsZS1uYW1lOkN0c0p2bXRpUnVuVGVzdDE5MDJEZXZpY2VBcHAuYXBrIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InNldC1vcHRpb24iIHZhbHVlPSJwYWNrYWdlLW5hbWU6YW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfMTkwMiIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJydW50aW1lLWhpbnQiIHZhbHVlPSI4cyIvPgorICAgIDwvdGVzdD4KKzwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkwMi9hcHAvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkwMi9hcHAvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzMzZmIxCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTAyL2FwcC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzMgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKK0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCitMT0NBTF9ERVhfUFJFT1BUIDo9IGZhbHNlCitMT0NBTF9QUk9HVUFSRF9FTkFCTEVEIDo9IGRpc2FibGVkCitMT0NBTF9TUkNfRklMRVMgOj0KK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gQ3RzSnZtdGlEZXZpY2VSdW5UZXN0QXBwQmFzZQorTE9DQUxfSk5JX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3RzanZtdGlhZ2VudAorTE9DQUxfTVVMVElMSUIgOj0gYm90aAorTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorCisjIFRPRE86IFJlZmFjdG9yLiBUaGlzIGlzIHRoZSBvbmx5IHRoaW5nIGV2ZXJ5IGNoYW5naW5nLgorTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0p2bXRpUnVuVGVzdDE5MDJEZXZpY2VBcHAKKworaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MDIvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MDIvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZhNTMyMAotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkwMi9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDM1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfMTkwMiI+CisKKyAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpkZWJ1Z2dhYmxlPSJ0cnVlIj4KKyAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CisgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF9uciIgYW5kcm9pZDp2YWx1ZT0iMTkwMiIgLz4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5qdm10aS5Kdm10aUFjdGl2aXR5IiA+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgPC9hcHBsaWNhdGlvbj4KKworICAgIDwhLS0gIHNlbGYtaW5zdHJ1bWVudGluZyB0ZXN0IHBhY2thZ2UuIC0tPgorICAgIDxpbnN0cnVtZW50YXRpb24KKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBmb3IgSlZNVEkiCisgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfMTkwMiIgPgorICAgIDwvaW5zdHJ1bWVudGF0aW9uPgorPC9tYW5pZmVzdD4KKwpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTAyL2phcmphci1ydWxlcy50eHQgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MDIvamFyamFyLXJ1bGVzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTIxMDhlCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTAyL2phcmphci1ydWxlcy50eHQKQEAgLTAsMCArMSBAQAorcnVsZSBhbmRyb2lkLmp2bXRpLmN0cy5Kdm10aUhvc3RUZXN0KiogYW5kcm9pZC5qdm10aS5jdHMuSnZtdGlIb3N0VGVzdDE5MDJAMQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTAzL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MDMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTA1ZmU2Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTAzL0FuZHJvaWQubWsKQEAgLTAsMCArMSwyMSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFIDo9IEN0c0p2bXRpUnVuVGVzdDE5MDNIb3N0VGVzdENhc2VzCisKK2luY2x1ZGUgJChMT0NBTF9QQVRIKS8uLi8uLi9ob3N0X3NpZGUubWsKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkwMy9BbmRyb2lkVGVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MDMvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhZWI2NmMKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MDMvQW5kcm9pZFRlc3QueG1sCkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgSlZNVEkgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIvPgorICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iYXJ0IiAvPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJDdHNKdm10aVJ1blRlc3QxOTAzRGV2aWNlQXBwLmFwayIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGVzdHR5cGUuSmFySG9zdFRlc3QiID4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJqYXIiIHZhbHVlPSJDdHNKdm10aVJ1blRlc3QxOTAzSG9zdFRlc3RDYXNlcy5qYXIiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ic2V0LW9wdGlvbiIgdmFsdWU9InRlc3QtZmlsZS1uYW1lOkN0c0p2bXRpUnVuVGVzdDE5MDNEZXZpY2VBcHAuYXBrIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InNldC1vcHRpb24iIHZhbHVlPSJwYWNrYWdlLW5hbWU6YW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfMTkwMyIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJydW50aW1lLWhpbnQiIHZhbHVlPSI4cyIvPgorICAgIDwvdGVzdD4KKzwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkwMy9hcHAvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkwMy9hcHAvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjliMGQzCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTAzL2FwcC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzMgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKK0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCitMT0NBTF9ERVhfUFJFT1BUIDo9IGZhbHNlCitMT0NBTF9QUk9HVUFSRF9FTkFCTEVEIDo9IGRpc2FibGVkCitMT0NBTF9TUkNfRklMRVMgOj0KK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gQ3RzSnZtdGlEZXZpY2VSdW5UZXN0QXBwQmFzZQorTE9DQUxfSk5JX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3RzanZtdGlhZ2VudAorTE9DQUxfTVVMVElMSUIgOj0gYm90aAorTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorCisjIFRPRE86IFJlZmFjdG9yLiBUaGlzIGlzIHRoZSBvbmx5IHRoaW5nIGV2ZXJ5IGNoYW5naW5nLgorTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0p2bXRpUnVuVGVzdDE5MDNEZXZpY2VBcHAKKworaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MDMvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MDMvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg1NWI1OQotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkwMy9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDM1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfMTkwMyI+CisKKyAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpkZWJ1Z2dhYmxlPSJ0cnVlIj4KKyAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CisgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF9uciIgYW5kcm9pZDp2YWx1ZT0iMTkwMyIgLz4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5qdm10aS5Kdm10aUFjdGl2aXR5IiA+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgPC9hcHBsaWNhdGlvbj4KKworICAgIDwhLS0gIHNlbGYtaW5zdHJ1bWVudGluZyB0ZXN0IHBhY2thZ2UuIC0tPgorICAgIDxpbnN0cnVtZW50YXRpb24KKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBmb3IgSlZNVEkiCisgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfMTkwMyIgPgorICAgIDwvaW5zdHJ1bWVudGF0aW9uPgorPC9tYW5pZmVzdD4KKwpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTAzL2phcmphci1ydWxlcy50eHQgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MDMvamFyamFyLXJ1bGVzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzZlYzY0Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTAzL2phcmphci1ydWxlcy50eHQKQEAgLTAsMCArMSBAQAorcnVsZSBhbmRyb2lkLmp2bXRpLmN0cy5Kdm10aUhvc3RUZXN0KiogYW5kcm9pZC5qdm10aS5jdHMuSnZtdGlIb3N0VGVzdDE5MDNAMQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTA0L0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MDQvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmUyYzc0Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTA0L0FuZHJvaWQubWsKQEAgLTAsMCArMSwyMSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFIDo9IEN0c0p2bXRpUnVuVGVzdDE5MDRIb3N0VGVzdENhc2VzCisKK2luY2x1ZGUgJChMT0NBTF9QQVRIKS8uLi8uLi9ob3N0X3NpZGUubWsKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkwNC9BbmRyb2lkVGVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MDQvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2NjMzZGQKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MDQvQW5kcm9pZFRlc3QueG1sCkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgSlZNVEkgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIvPgorICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iYXJ0IiAvPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJDdHNKdm10aVJ1blRlc3QxOTA0RGV2aWNlQXBwLmFwayIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGVzdHR5cGUuSmFySG9zdFRlc3QiID4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJqYXIiIHZhbHVlPSJDdHNKdm10aVJ1blRlc3QxOTA0SG9zdFRlc3RDYXNlcy5qYXIiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ic2V0LW9wdGlvbiIgdmFsdWU9InRlc3QtZmlsZS1uYW1lOkN0c0p2bXRpUnVuVGVzdDE5MDREZXZpY2VBcHAuYXBrIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InNldC1vcHRpb24iIHZhbHVlPSJwYWNrYWdlLW5hbWU6YW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfMTkwNCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJydW50aW1lLWhpbnQiIHZhbHVlPSI4cyIvPgorICAgIDwvdGVzdD4KKzwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkwNC9hcHAvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkwNC9hcHAvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2ExODg5Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTA0L2FwcC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzMgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKK0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCitMT0NBTF9ERVhfUFJFT1BUIDo9IGZhbHNlCitMT0NBTF9QUk9HVUFSRF9FTkFCTEVEIDo9IGRpc2FibGVkCitMT0NBTF9TUkNfRklMRVMgOj0KK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gQ3RzSnZtdGlEZXZpY2VSdW5UZXN0QXBwQmFzZQorTE9DQUxfSk5JX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3RzanZtdGlhZ2VudAorTE9DQUxfTVVMVElMSUIgOj0gYm90aAorTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorCisjIFRPRE86IFJlZmFjdG9yLiBUaGlzIGlzIHRoZSBvbmx5IHRoaW5nIGV2ZXJ5IGNoYW5naW5nLgorTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0p2bXRpUnVuVGVzdDE5MDREZXZpY2VBcHAKKworaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MDQvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MDQvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI0NDQ1YzYKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MDQvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwzNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0XzE5MDQiPgorCisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6ZGVidWdnYWJsZT0idHJ1ZSI+CisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgorICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfbnIiIGFuZHJvaWQ6dmFsdWU9IjE5MDQiIC8+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuanZtdGkuSnZtdGlBY3Rpdml0eSIgPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgIDwvYXBwbGljYXRpb24+CisKKyAgICA8IS0tICBzZWxmLWluc3RydW1lbnRpbmcgdGVzdCBwYWNrYWdlLiAtLT4KKyAgICA8aW5zdHJ1bWVudGF0aW9uCisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgdGVzdHMgZm9yIEpWTVRJIgorICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0XzE5MDQiID4KKyAgICA8L2luc3RydW1lbnRhdGlvbj4KKzwvbWFuaWZlc3Q+CisKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkwNC9qYXJqYXItcnVsZXMudHh0IGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTA0L2phcmphci1ydWxlcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MwYjZlYwotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkwNC9qYXJqYXItcnVsZXMudHh0CkBAIC0wLDAgKzEgQEAKK3J1bGUgYW5kcm9pZC5qdm10aS5jdHMuSnZtdGlIb3N0VGVzdCoqIGFuZHJvaWQuanZtdGkuY3RzLkp2bXRpSG9zdFRlc3QxOTA0QDEKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkwNi9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTA2L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFlZjk2YgotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkwNi9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjEgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRSA6PSBDdHNKdm10aVJ1blRlc3QxOTA2SG9zdFRlc3RDYXNlcworCitpbmNsdWRlICQoTE9DQUxfUEFUSCkvLi4vLi4vaG9zdF9zaWRlLm1rCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MDYvQW5kcm9pZFRlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTA2L0FuZHJvaWRUZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTUxZGZkCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTA2L0FuZHJvaWRUZXN0LnhtbApAQCAtMCwwICsxLDI5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIEpWTVRJIHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiLz4KKyAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImFydCIgLz4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzSnZtdGlSdW5UZXN0MTkwNkRldmljZUFwcC5hcGsiIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRlc3R0eXBlLkphckhvc3RUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0iamFyIiB2YWx1ZT0iQ3RzSnZtdGlSdW5UZXN0MTkwNkhvc3RUZXN0Q2FzZXMuamFyIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InNldC1vcHRpb24iIHZhbHVlPSJ0ZXN0LWZpbGUtbmFtZTpDdHNKdm10aVJ1blRlc3QxOTA2RGV2aWNlQXBwLmFwayIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJzZXQtb3B0aW9uIiB2YWx1ZT0icGFja2FnZS1uYW1lOmFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0XzE5MDYiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVudGltZS1oaW50IiB2YWx1ZT0iOHMiLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MDYvYXBwL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MDYvYXBwL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhjMTlkNwotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkwNi9hcHAvQW5kcm9pZC5tawpAQCAtMCwwICsxLDMzIEBACisjIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQorTE9DQUxfREVYX1BSRU9QVCA6PSBmYWxzZQorTE9DQUxfUFJPR1VBUkRfRU5BQkxFRCA6PSBkaXNhYmxlZAorTE9DQUxfU1JDX0ZJTEVTIDo9CitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IEN0c0p2bXRpRGV2aWNlUnVuVGVzdEFwcEJhc2UKK0xPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmN0c2p2bXRpYWdlbnQKK0xPQ0FMX01VTFRJTElCIDo9IGJvdGgKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKKworIyBUT0RPOiBSZWZhY3Rvci4gVGhpcyBpcyB0aGUgb25seSB0aGluZyBldmVyeSBjaGFuZ2luZy4KK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNKdm10aVJ1blRlc3QxOTA2RGV2aWNlQXBwCisKK2luY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTA2L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTA2L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkYTdkMTAKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MDYvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwzNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0XzE5MDYiPgorCisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6ZGVidWdnYWJsZT0idHJ1ZSI+CisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgorICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfbnIiIGFuZHJvaWQ6dmFsdWU9IjE5MDYiIC8+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuanZtdGkuSnZtdGlBY3Rpdml0eSIgPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgIDwvYXBwbGljYXRpb24+CisKKyAgICA8IS0tICBzZWxmLWluc3RydW1lbnRpbmcgdGVzdCBwYWNrYWdlLiAtLT4KKyAgICA8aW5zdHJ1bWVudGF0aW9uCisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgdGVzdHMgZm9yIEpWTVRJIgorICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0XzE5MDYiID4KKyAgICA8L2luc3RydW1lbnRhdGlvbj4KKzwvbWFuaWZlc3Q+CisKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkwNi9qYXJqYXItcnVsZXMudHh0IGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTA2L2phcmphci1ydWxlcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVmNGE5NAotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkwNi9qYXJqYXItcnVsZXMudHh0CkBAIC0wLDAgKzEgQEAKK3J1bGUgYW5kcm9pZC5qdm10aS5jdHMuSnZtdGlIb3N0VGVzdCoqIGFuZHJvaWQuanZtdGkuY3RzLkp2bXRpSG9zdFRlc3QxOTA2QDEKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkwNy9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTA3L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA4YWFhZgotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkwNy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjEgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRSA6PSBDdHNKdm10aVJ1blRlc3QxOTA3SG9zdFRlc3RDYXNlcworCitpbmNsdWRlICQoTE9DQUxfUEFUSCkvLi4vLi4vaG9zdF9zaWRlLm1rCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MDcvQW5kcm9pZFRlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTA3L0FuZHJvaWRUZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2NmYmI1Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTA3L0FuZHJvaWRUZXN0LnhtbApAQCAtMCwwICsxLDI5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIEpWTVRJIHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiLz4KKyAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImFydCIgLz4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzSnZtdGlSdW5UZXN0MTkwN0RldmljZUFwcC5hcGsiIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRlc3R0eXBlLkphckhvc3RUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0iamFyIiB2YWx1ZT0iQ3RzSnZtdGlSdW5UZXN0MTkwN0hvc3RUZXN0Q2FzZXMuamFyIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InNldC1vcHRpb24iIHZhbHVlPSJ0ZXN0LWZpbGUtbmFtZTpDdHNKdm10aVJ1blRlc3QxOTA3RGV2aWNlQXBwLmFwayIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJzZXQtb3B0aW9uIiB2YWx1ZT0icGFja2FnZS1uYW1lOmFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0XzE5MDciIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVudGltZS1oaW50IiB2YWx1ZT0iOHMiLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MDcvYXBwL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MDcvYXBwL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFmMWQxNAotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkwNy9hcHAvQW5kcm9pZC5tawpAQCAtMCwwICsxLDMzIEBACisjIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQorTE9DQUxfREVYX1BSRU9QVCA6PSBmYWxzZQorTE9DQUxfUFJPR1VBUkRfRU5BQkxFRCA6PSBkaXNhYmxlZAorTE9DQUxfU1JDX0ZJTEVTIDo9CitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IEN0c0p2bXRpRGV2aWNlUnVuVGVzdEFwcEJhc2UKK0xPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmN0c2p2bXRpYWdlbnQKK0xPQ0FMX01VTFRJTElCIDo9IGJvdGgKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKKworIyBUT0RPOiBSZWZhY3Rvci4gVGhpcyBpcyB0aGUgb25seSB0aGluZyBldmVyeSBjaGFuZ2luZy4KK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNKdm10aVJ1blRlc3QxOTA3RGV2aWNlQXBwCisKK2luY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTA3L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTA3L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZDkzNzIKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MDcvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwzNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0XzE5MDciPgorCisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6ZGVidWdnYWJsZT0idHJ1ZSI+CisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgorICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfbnIiIGFuZHJvaWQ6dmFsdWU9IjE5MDciIC8+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuanZtdGkuSnZtdGlBY3Rpdml0eSIgPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgIDwvYXBwbGljYXRpb24+CisKKyAgICA8IS0tICBzZWxmLWluc3RydW1lbnRpbmcgdGVzdCBwYWNrYWdlLiAtLT4KKyAgICA8aW5zdHJ1bWVudGF0aW9uCisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgdGVzdHMgZm9yIEpWTVRJIgorICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0XzE5MDciID4KKyAgICA8L2luc3RydW1lbnRhdGlvbj4KKzwvbWFuaWZlc3Q+CisKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkwNy9qYXJqYXItcnVsZXMudHh0IGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTA3L2phcmphci1ydWxlcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM1MjczNAotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkwNy9qYXJqYXItcnVsZXMudHh0CkBAIC0wLDAgKzEgQEAKK3J1bGUgYW5kcm9pZC5qdm10aS5jdHMuSnZtdGlIb3N0VGVzdCoqIGFuZHJvaWQuanZtdGkuY3RzLkp2bXRpSG9zdFRlc3QxOTA3QDEKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkwOC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTA4L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E2MzAxYgotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkwOC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjEgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRSA6PSBDdHNKdm10aVJ1blRlc3QxOTA4SG9zdFRlc3RDYXNlcworCitpbmNsdWRlICQoTE9DQUxfUEFUSCkvLi4vLi4vaG9zdF9zaWRlLm1rCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MDgvQW5kcm9pZFRlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTA4L0FuZHJvaWRUZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTFmNTc4Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTA4L0FuZHJvaWRUZXN0LnhtbApAQCAtMCwwICsxLDI5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIEpWTVRJIHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiLz4KKyAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImFydCIgLz4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzSnZtdGlSdW5UZXN0MTkwOERldmljZUFwcC5hcGsiIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRlc3R0eXBlLkphckhvc3RUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0iamFyIiB2YWx1ZT0iQ3RzSnZtdGlSdW5UZXN0MTkwOEhvc3RUZXN0Q2FzZXMuamFyIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InNldC1vcHRpb24iIHZhbHVlPSJ0ZXN0LWZpbGUtbmFtZTpDdHNKdm10aVJ1blRlc3QxOTA4RGV2aWNlQXBwLmFwayIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJzZXQtb3B0aW9uIiB2YWx1ZT0icGFja2FnZS1uYW1lOmFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0XzE5MDgiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVudGltZS1oaW50IiB2YWx1ZT0iOHMiLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MDgvYXBwL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MDgvYXBwL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMzZjM3MQotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkwOC9hcHAvQW5kcm9pZC5tawpAQCAtMCwwICsxLDMzIEBACisjIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQorTE9DQUxfREVYX1BSRU9QVCA6PSBmYWxzZQorTE9DQUxfUFJPR1VBUkRfRU5BQkxFRCA6PSBkaXNhYmxlZAorTE9DQUxfU1JDX0ZJTEVTIDo9CitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IEN0c0p2bXRpRGV2aWNlUnVuVGVzdEFwcEJhc2UKK0xPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmN0c2p2bXRpYWdlbnQKK0xPQ0FMX01VTFRJTElCIDo9IGJvdGgKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKKworIyBUT0RPOiBSZWZhY3Rvci4gVGhpcyBpcyB0aGUgb25seSB0aGluZyBldmVyeSBjaGFuZ2luZy4KK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNKdm10aVJ1blRlc3QxOTA4RGV2aWNlQXBwCisKK2luY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTA4L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTA4L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZDk5NTIKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MDgvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwzNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0XzE5MDgiPgorCisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6ZGVidWdnYWJsZT0idHJ1ZSI+CisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgorICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfbnIiIGFuZHJvaWQ6dmFsdWU9IjE5MDgiIC8+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuanZtdGkuSnZtdGlBY3Rpdml0eSIgPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgIDwvYXBwbGljYXRpb24+CisKKyAgICA8IS0tICBzZWxmLWluc3RydW1lbnRpbmcgdGVzdCBwYWNrYWdlLiAtLT4KKyAgICA8aW5zdHJ1bWVudGF0aW9uCisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgdGVzdHMgZm9yIEpWTVRJIgorICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0XzE5MDgiID4KKyAgICA8L2luc3RydW1lbnRhdGlvbj4KKzwvbWFuaWZlc3Q+CisKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkwOC9qYXJqYXItcnVsZXMudHh0IGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTA4L2phcmphci1ydWxlcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ3Nzg1ZgotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkwOC9qYXJqYXItcnVsZXMudHh0CkBAIC0wLDAgKzEgQEAKK3J1bGUgYW5kcm9pZC5qdm10aS5jdHMuSnZtdGlIb3N0VGVzdCoqIGFuZHJvaWQuanZtdGkuY3RzLkp2bXRpSG9zdFRlc3QxOTA4QDEKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkwOS9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTA5L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDcyYjJhYQotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkwOS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjEgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRSA6PSBDdHNKdm10aVJ1blRlc3QxOTA5SG9zdFRlc3RDYXNlcworCitpbmNsdWRlICQoTE9DQUxfUEFUSCkvLi4vLi4vaG9zdF9zaWRlLm1rCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MDkvQW5kcm9pZFRlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTA5L0FuZHJvaWRUZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGQ5ZGYxCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTA5L0FuZHJvaWRUZXN0LnhtbApAQCAtMCwwICsxLDI5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIEpWTVRJIHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiLz4KKyAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImFydCIgLz4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzSnZtdGlSdW5UZXN0MTkwOURldmljZUFwcC5hcGsiIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRlc3R0eXBlLkphckhvc3RUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0iamFyIiB2YWx1ZT0iQ3RzSnZtdGlSdW5UZXN0MTkwOUhvc3RUZXN0Q2FzZXMuamFyIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InNldC1vcHRpb24iIHZhbHVlPSJ0ZXN0LWZpbGUtbmFtZTpDdHNKdm10aVJ1blRlc3QxOTA5RGV2aWNlQXBwLmFwayIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJzZXQtb3B0aW9uIiB2YWx1ZT0icGFja2FnZS1uYW1lOmFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0XzE5MDkiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVudGltZS1oaW50IiB2YWx1ZT0iOHMiLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MDkvYXBwL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MDkvYXBwL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYyMzUxMwotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkwOS9hcHAvQW5kcm9pZC5tawpAQCAtMCwwICsxLDMzIEBACisjIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQorTE9DQUxfREVYX1BSRU9QVCA6PSBmYWxzZQorTE9DQUxfUFJPR1VBUkRfRU5BQkxFRCA6PSBkaXNhYmxlZAorTE9DQUxfU1JDX0ZJTEVTIDo9CitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IEN0c0p2bXRpRGV2aWNlUnVuVGVzdEFwcEJhc2UKK0xPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmN0c2p2bXRpYWdlbnQKK0xPQ0FMX01VTFRJTElCIDo9IGJvdGgKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKKworIyBUT0RPOiBSZWZhY3Rvci4gVGhpcyBpcyB0aGUgb25seSB0aGluZyBldmVyeSBjaGFuZ2luZy4KK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNKdm10aVJ1blRlc3QxOTA5RGV2aWNlQXBwCisKK2luY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTA5L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTA5L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MDQxYmUKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MDkvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwzNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0XzE5MDkiPgorCisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6ZGVidWdnYWJsZT0idHJ1ZSI+CisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgorICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfbnIiIGFuZHJvaWQ6dmFsdWU9IjE5MDkiIC8+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuanZtdGkuSnZtdGlBY3Rpdml0eSIgPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgIDwvYXBwbGljYXRpb24+CisKKyAgICA8IS0tICBzZWxmLWluc3RydW1lbnRpbmcgdGVzdCBwYWNrYWdlLiAtLT4KKyAgICA8aW5zdHJ1bWVudGF0aW9uCisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgdGVzdHMgZm9yIEpWTVRJIgorICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0XzE5MDkiID4KKyAgICA8L2luc3RydW1lbnRhdGlvbj4KKzwvbWFuaWZlc3Q+CisKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkwOS9qYXJqYXItcnVsZXMudHh0IGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTA5L2phcmphci1ydWxlcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMzNDVlYgotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkwOS9qYXJqYXItcnVsZXMudHh0CkBAIC0wLDAgKzEgQEAKK3J1bGUgYW5kcm9pZC5qdm10aS5jdHMuSnZtdGlIb3N0VGVzdCoqIGFuZHJvaWQuanZtdGkuY3RzLkp2bXRpSG9zdFRlc3QxOTA5QDEKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkxMC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTEwL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA5OTkxZgotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkxMC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjEgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRSA6PSBDdHNKdm10aVJ1blRlc3QxOTEwSG9zdFRlc3RDYXNlcworCitpbmNsdWRlICQoTE9DQUxfUEFUSCkvLi4vLi4vaG9zdF9zaWRlLm1rCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MTAvQW5kcm9pZFRlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTEwL0FuZHJvaWRUZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjNjOTk4Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTEwL0FuZHJvaWRUZXN0LnhtbApAQCAtMCwwICsxLDI5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIEpWTVRJIHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiLz4KKyAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImFydCIgLz4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzSnZtdGlSdW5UZXN0MTkxMERldmljZUFwcC5hcGsiIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRlc3R0eXBlLkphckhvc3RUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0iamFyIiB2YWx1ZT0iQ3RzSnZtdGlSdW5UZXN0MTkxMEhvc3RUZXN0Q2FzZXMuamFyIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InNldC1vcHRpb24iIHZhbHVlPSJ0ZXN0LWZpbGUtbmFtZTpDdHNKdm10aVJ1blRlc3QxOTEwRGV2aWNlQXBwLmFwayIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJzZXQtb3B0aW9uIiB2YWx1ZT0icGFja2FnZS1uYW1lOmFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0XzE5MTAiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVudGltZS1oaW50IiB2YWx1ZT0iOHMiLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MTAvYXBwL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MTAvYXBwL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVhODM2MWEKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MTAvYXBwL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKK0xPQ0FMX0RFWF9QUkVPUFQgOj0gZmFsc2UKK0xPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKK0xPQ0FMX1NSQ19GSUxFUyA6PQorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aURldmljZVJ1blRlc3RBcHBCYXNlCitMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdHNqdm10aWFnZW50CitMT0NBTF9NVUxUSUxJQiA6PSBib3RoCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CisKKyMgVE9ETzogUmVmYWN0b3IuIFRoaXMgaXMgdGhlIG9ubHkgdGhpbmcgZXZlcnkgY2hhbmdpbmcuCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzSnZtdGlSdW5UZXN0MTkxMERldmljZUFwcAorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkxMC9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkxMC9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjIyNDFlCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTEwL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTEwIj4KKworICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmRlYnVnZ2FibGU9InRydWUiPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKyAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0X25yIiBhbmRyb2lkOnZhbHVlPSIxOTEwIiAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmp2bXRpLkp2bXRpQWN0aXZpdHkiID4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPCEtLSAgc2VsZi1pbnN0cnVtZW50aW5nIHRlc3QgcGFja2FnZS4gLS0+CisgICAgPGluc3RydW1lbnRhdGlvbgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIGZvciBKVk1USSIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTEwIiA+CisgICAgPC9pbnN0cnVtZW50YXRpb24+Cis8L21hbmlmZXN0PgorCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MTAvamFyamFyLXJ1bGVzLnR4dCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkxMC9qYXJqYXItcnVsZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhYzZlYzQKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MTAvamFyamFyLXJ1bGVzLnR4dApAQCAtMCwwICsxIEBACitydWxlIGFuZHJvaWQuanZtdGkuY3RzLkp2bXRpSG9zdFRlc3QqKiBhbmRyb2lkLmp2bXRpLmN0cy5Kdm10aUhvc3RUZXN0MTkxMEAxCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MTEvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkxMS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNzQxYmIKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MTEvQW5kcm9pZC5tawpAQCAtMCwwICsxLDIxIEBACisjIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEUgOj0gQ3RzSnZtdGlSdW5UZXN0MTkxMUhvc3RUZXN0Q2FzZXMKKworaW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTExL0FuZHJvaWRUZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkxMS9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVhNTBiYgotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkxMS9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIi8+CisgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJhcnQiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDE5MTFEZXZpY2VBcHAuYXBrIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5KYXJIb3N0VGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImphciIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDE5MTFIb3N0VGVzdENhc2VzLmphciIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJzZXQtb3B0aW9uIiB2YWx1ZT0idGVzdC1maWxlLW5hbWU6Q3RzSnZtdGlSdW5UZXN0MTkxMURldmljZUFwcC5hcGsiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ic2V0LW9wdGlvbiIgdmFsdWU9InBhY2thZ2UtbmFtZTphbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTExIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjhzIi8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTExL2FwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTExL2FwcC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYTY5NGQKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MTEvYXBwL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKK0xPQ0FMX0RFWF9QUkVPUFQgOj0gZmFsc2UKK0xPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKK0xPQ0FMX1NSQ19GSUxFUyA6PQorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aURldmljZVJ1blRlc3RBcHBCYXNlCitMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdHNqdm10aWFnZW50CitMT0NBTF9NVUxUSUxJQiA6PSBib3RoCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CisKKyMgVE9ETzogUmVmYWN0b3IuIFRoaXMgaXMgdGhlIG9ubHkgdGhpbmcgZXZlcnkgY2hhbmdpbmcuCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzSnZtdGlSdW5UZXN0MTkxMURldmljZUFwcAorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkxMS9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkxMS9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDEwYThhCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTExL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTExIj4KKworICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmRlYnVnZ2FibGU9InRydWUiPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKyAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0X25yIiBhbmRyb2lkOnZhbHVlPSIxOTExIiAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmp2bXRpLkp2bXRpQWN0aXZpdHkiID4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPCEtLSAgc2VsZi1pbnN0cnVtZW50aW5nIHRlc3QgcGFja2FnZS4gLS0+CisgICAgPGluc3RydW1lbnRhdGlvbgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIGZvciBKVk1USSIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTExIiA+CisgICAgPC9pbnN0cnVtZW50YXRpb24+Cis8L21hbmlmZXN0PgorCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MTEvamFyamFyLXJ1bGVzLnR4dCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkxMS9qYXJqYXItcnVsZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NmFkYmMKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MTEvamFyamFyLXJ1bGVzLnR4dApAQCAtMCwwICsxIEBACitydWxlIGFuZHJvaWQuanZtdGkuY3RzLkp2bXRpSG9zdFRlc3QqKiBhbmRyb2lkLmp2bXRpLmN0cy5Kdm10aUhvc3RUZXN0MTkxMUAxCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MTIvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkxMi9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZDlkYzMKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MTIvQW5kcm9pZC5tawpAQCAtMCwwICsxLDIxIEBACisjIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEUgOj0gQ3RzSnZtdGlSdW5UZXN0MTkxMkhvc3RUZXN0Q2FzZXMKKworaW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTEyL0FuZHJvaWRUZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkxMi9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZlNDE1OQotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkxMi9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIi8+CisgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJhcnQiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDE5MTJEZXZpY2VBcHAuYXBrIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5KYXJIb3N0VGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImphciIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDE5MTJIb3N0VGVzdENhc2VzLmphciIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJzZXQtb3B0aW9uIiB2YWx1ZT0idGVzdC1maWxlLW5hbWU6Q3RzSnZtdGlSdW5UZXN0MTkxMkRldmljZUFwcC5hcGsiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ic2V0LW9wdGlvbiIgdmFsdWU9InBhY2thZ2UtbmFtZTphbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTEyIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjhzIi8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTEyL2FwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTEyL2FwcC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZTM4NWIKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MTIvYXBwL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKK0xPQ0FMX0RFWF9QUkVPUFQgOj0gZmFsc2UKK0xPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKK0xPQ0FMX1NSQ19GSUxFUyA6PQorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aURldmljZVJ1blRlc3RBcHBCYXNlCitMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdHNqdm10aWFnZW50CitMT0NBTF9NVUxUSUxJQiA6PSBib3RoCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CisKKyMgVE9ETzogUmVmYWN0b3IuIFRoaXMgaXMgdGhlIG9ubHkgdGhpbmcgZXZlcnkgY2hhbmdpbmcuCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzSnZtdGlSdW5UZXN0MTkxMkRldmljZUFwcAorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkxMi9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkxMi9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTYyMDlmCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTEyL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTEyIj4KKworICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmRlYnVnZ2FibGU9InRydWUiPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKyAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0X25yIiBhbmRyb2lkOnZhbHVlPSIxOTEyIiAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmp2bXRpLkp2bXRpQWN0aXZpdHkiID4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPCEtLSAgc2VsZi1pbnN0cnVtZW50aW5nIHRlc3QgcGFja2FnZS4gLS0+CisgICAgPGluc3RydW1lbnRhdGlvbgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIGZvciBKVk1USSIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTEyIiA+CisgICAgPC9pbnN0cnVtZW50YXRpb24+Cis8L21hbmlmZXN0PgorCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MTIvamFyamFyLXJ1bGVzLnR4dCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkxMi9qYXJqYXItcnVsZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3YjJlNTcKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MTIvamFyamFyLXJ1bGVzLnR4dApAQCAtMCwwICsxIEBACitydWxlIGFuZHJvaWQuanZtdGkuY3RzLkp2bXRpSG9zdFRlc3QqKiBhbmRyb2lkLmp2bXRpLmN0cy5Kdm10aUhvc3RUZXN0MTkxMkAxCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MTMvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkxMy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3N2IyNjIKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MTMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDIxIEBACisjIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEUgOj0gQ3RzSnZtdGlSdW5UZXN0MTkxM0hvc3RUZXN0Q2FzZXMKKworaW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTEzL0FuZHJvaWRUZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkxMy9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU1YWQzOAotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkxMy9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIi8+CisgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJhcnQiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDE5MTNEZXZpY2VBcHAuYXBrIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5KYXJIb3N0VGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImphciIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDE5MTNIb3N0VGVzdENhc2VzLmphciIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJzZXQtb3B0aW9uIiB2YWx1ZT0idGVzdC1maWxlLW5hbWU6Q3RzSnZtdGlSdW5UZXN0MTkxM0RldmljZUFwcC5hcGsiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ic2V0LW9wdGlvbiIgdmFsdWU9InBhY2thZ2UtbmFtZTphbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTEzIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjhzIi8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTEzL2FwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTEzL2FwcC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2YWIxNDQKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MTMvYXBwL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKK0xPQ0FMX0RFWF9QUkVPUFQgOj0gZmFsc2UKK0xPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKK0xPQ0FMX1NSQ19GSUxFUyA6PQorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aURldmljZVJ1blRlc3RBcHBCYXNlCitMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdHNqdm10aWFnZW50CitMT0NBTF9NVUxUSUxJQiA6PSBib3RoCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CisKKyMgVE9ETzogUmVmYWN0b3IuIFRoaXMgaXMgdGhlIG9ubHkgdGhpbmcgZXZlcnkgY2hhbmdpbmcuCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzSnZtdGlSdW5UZXN0MTkxM0RldmljZUFwcAorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkxMy9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkxMy9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjZjNDU3Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTEzL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTEzIj4KKworICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmRlYnVnZ2FibGU9InRydWUiPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKyAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0X25yIiBhbmRyb2lkOnZhbHVlPSIxOTEzIiAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmp2bXRpLkp2bXRpQWN0aXZpdHkiID4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPCEtLSAgc2VsZi1pbnN0cnVtZW50aW5nIHRlc3QgcGFja2FnZS4gLS0+CisgICAgPGluc3RydW1lbnRhdGlvbgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIGZvciBKVk1USSIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTEzIiA+CisgICAgPC9pbnN0cnVtZW50YXRpb24+Cis8L21hbmlmZXN0PgorCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MTMvamFyamFyLXJ1bGVzLnR4dCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkxMy9qYXJqYXItcnVsZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZDc3MzEKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MTMvamFyamFyLXJ1bGVzLnR4dApAQCAtMCwwICsxIEBACitydWxlIGFuZHJvaWQuanZtdGkuY3RzLkp2bXRpSG9zdFRlc3QqKiBhbmRyb2lkLmp2bXRpLmN0cy5Kdm10aUhvc3RUZXN0MTkxM0AxCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MTQvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkxNC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNGRmYjYKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MTQvQW5kcm9pZC5tawpAQCAtMCwwICsxLDIxIEBACisjIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEUgOj0gQ3RzSnZtdGlSdW5UZXN0MTkxNEhvc3RUZXN0Q2FzZXMKKworaW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTE0L0FuZHJvaWRUZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkxNC9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc0MGIzOAotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkxNC9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIi8+CisgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJhcnQiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDE5MTREZXZpY2VBcHAuYXBrIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5KYXJIb3N0VGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImphciIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDE5MTRIb3N0VGVzdENhc2VzLmphciIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJzZXQtb3B0aW9uIiB2YWx1ZT0idGVzdC1maWxlLW5hbWU6Q3RzSnZtdGlSdW5UZXN0MTkxNERldmljZUFwcC5hcGsiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ic2V0LW9wdGlvbiIgdmFsdWU9InBhY2thZ2UtbmFtZTphbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTE0IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjhzIi8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTE0L2FwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTE0L2FwcC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNjZkNTkKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MTQvYXBwL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKK0xPQ0FMX0RFWF9QUkVPUFQgOj0gZmFsc2UKK0xPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKK0xPQ0FMX1NSQ19GSUxFUyA6PQorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aURldmljZVJ1blRlc3RBcHBCYXNlCitMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdHNqdm10aWFnZW50CitMT0NBTF9NVUxUSUxJQiA6PSBib3RoCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CisKKyMgVE9ETzogUmVmYWN0b3IuIFRoaXMgaXMgdGhlIG9ubHkgdGhpbmcgZXZlcnkgY2hhbmdpbmcuCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzSnZtdGlSdW5UZXN0MTkxNERldmljZUFwcAorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkxNC9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkxNC9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmRlM2MwCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTE0L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTE0Ij4KKworICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmRlYnVnZ2FibGU9InRydWUiPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKyAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0X25yIiBhbmRyb2lkOnZhbHVlPSIxOTE0IiAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmp2bXRpLkp2bXRpQWN0aXZpdHkiID4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPCEtLSAgc2VsZi1pbnN0cnVtZW50aW5nIHRlc3QgcGFja2FnZS4gLS0+CisgICAgPGluc3RydW1lbnRhdGlvbgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIGZvciBKVk1USSIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTE0IiA+CisgICAgPC9pbnN0cnVtZW50YXRpb24+Cis8L21hbmlmZXN0PgorCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MTQvamFyamFyLXJ1bGVzLnR4dCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkxNC9qYXJqYXItcnVsZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZDc0ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MTQvamFyamFyLXJ1bGVzLnR4dApAQCAtMCwwICsxIEBACitydWxlIGFuZHJvaWQuanZtdGkuY3RzLkp2bXRpSG9zdFRlc3QqKiBhbmRyb2lkLmp2bXRpLmN0cy5Kdm10aUhvc3RUZXN0MTkxNEAxCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MTUvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkxNS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNTVhOGEKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MTUvQW5kcm9pZC5tawpAQCAtMCwwICsxLDIxIEBACisjIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEUgOj0gQ3RzSnZtdGlSdW5UZXN0MTkxNUhvc3RUZXN0Q2FzZXMKKworaW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTE1L0FuZHJvaWRUZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkxNS9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNhM2I4YwotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkxNS9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIi8+CisgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJhcnQiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDE5MTVEZXZpY2VBcHAuYXBrIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5KYXJIb3N0VGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImphciIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDE5MTVIb3N0VGVzdENhc2VzLmphciIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJzZXQtb3B0aW9uIiB2YWx1ZT0idGVzdC1maWxlLW5hbWU6Q3RzSnZtdGlSdW5UZXN0MTkxNURldmljZUFwcC5hcGsiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ic2V0LW9wdGlvbiIgdmFsdWU9InBhY2thZ2UtbmFtZTphbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTE1IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjhzIi8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTE1L2FwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTE1L2FwcC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhY2MyY2IKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MTUvYXBwL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKK0xPQ0FMX0RFWF9QUkVPUFQgOj0gZmFsc2UKK0xPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKK0xPQ0FMX1NSQ19GSUxFUyA6PQorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aURldmljZVJ1blRlc3RBcHBCYXNlCitMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdHNqdm10aWFnZW50CitMT0NBTF9NVUxUSUxJQiA6PSBib3RoCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CisKKyMgVE9ETzogUmVmYWN0b3IuIFRoaXMgaXMgdGhlIG9ubHkgdGhpbmcgZXZlcnkgY2hhbmdpbmcuCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzSnZtdGlSdW5UZXN0MTkxNURldmljZUFwcAorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkxNS9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkxNS9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjczOTVjCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTE1L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTE1Ij4KKworICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmRlYnVnZ2FibGU9InRydWUiPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKyAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0X25yIiBhbmRyb2lkOnZhbHVlPSIxOTE1IiAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmp2bXRpLkp2bXRpQWN0aXZpdHkiID4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPCEtLSAgc2VsZi1pbnN0cnVtZW50aW5nIHRlc3QgcGFja2FnZS4gLS0+CisgICAgPGluc3RydW1lbnRhdGlvbgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIGZvciBKVk1USSIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTE1IiA+CisgICAgPC9pbnN0cnVtZW50YXRpb24+Cis8L21hbmlmZXN0PgorCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MTUvamFyamFyLXJ1bGVzLnR4dCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkxNS9qYXJqYXItcnVsZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNWUxMWUKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MTUvamFyamFyLXJ1bGVzLnR4dApAQCAtMCwwICsxIEBACitydWxlIGFuZHJvaWQuanZtdGkuY3RzLkp2bXRpSG9zdFRlc3QqKiBhbmRyb2lkLmp2bXRpLmN0cy5Kdm10aUhvc3RUZXN0MTkxNUAxCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MTYvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkxNi9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NmU2NTAKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MTYvQW5kcm9pZC5tawpAQCAtMCwwICsxLDIxIEBACisjIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEUgOj0gQ3RzSnZtdGlSdW5UZXN0MTkxNkhvc3RUZXN0Q2FzZXMKKworaW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTE2L0FuZHJvaWRUZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkxNi9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ2NTExMgotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkxNi9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIi8+CisgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJhcnQiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDE5MTZEZXZpY2VBcHAuYXBrIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5KYXJIb3N0VGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImphciIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDE5MTZIb3N0VGVzdENhc2VzLmphciIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJzZXQtb3B0aW9uIiB2YWx1ZT0idGVzdC1maWxlLW5hbWU6Q3RzSnZtdGlSdW5UZXN0MTkxNkRldmljZUFwcC5hcGsiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ic2V0LW9wdGlvbiIgdmFsdWU9InBhY2thZ2UtbmFtZTphbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTE2IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjhzIi8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTE2L2FwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTE2L2FwcC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNjhkNWQKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MTYvYXBwL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKK0xPQ0FMX0RFWF9QUkVPUFQgOj0gZmFsc2UKK0xPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKK0xPQ0FMX1NSQ19GSUxFUyA6PQorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aURldmljZVJ1blRlc3RBcHBCYXNlCitMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdHNqdm10aWFnZW50CitMT0NBTF9NVUxUSUxJQiA6PSBib3RoCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CisKKyMgVE9ETzogUmVmYWN0b3IuIFRoaXMgaXMgdGhlIG9ubHkgdGhpbmcgZXZlcnkgY2hhbmdpbmcuCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzSnZtdGlSdW5UZXN0MTkxNkRldmljZUFwcAorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkxNi9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkxNi9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDNkNTM4Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTE2L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTE2Ij4KKworICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmRlYnVnZ2FibGU9InRydWUiPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKyAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0X25yIiBhbmRyb2lkOnZhbHVlPSIxOTE2IiAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmp2bXRpLkp2bXRpQWN0aXZpdHkiID4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPCEtLSAgc2VsZi1pbnN0cnVtZW50aW5nIHRlc3QgcGFja2FnZS4gLS0+CisgICAgPGluc3RydW1lbnRhdGlvbgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIGZvciBKVk1USSIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTE2IiA+CisgICAgPC9pbnN0cnVtZW50YXRpb24+Cis8L21hbmlmZXN0PgorCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MTYvamFyamFyLXJ1bGVzLnR4dCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkxNi9qYXJqYXItcnVsZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZDFmMWUKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MTYvamFyamFyLXJ1bGVzLnR4dApAQCAtMCwwICsxIEBACitydWxlIGFuZHJvaWQuanZtdGkuY3RzLkp2bXRpSG9zdFRlc3QqKiBhbmRyb2lkLmp2bXRpLmN0cy5Kdm10aUhvc3RUZXN0MTkxNkAxCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MTcvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkxNy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwYzU2NDAKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MTcvQW5kcm9pZC5tawpAQCAtMCwwICsxLDIxIEBACisjIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEUgOj0gQ3RzSnZtdGlSdW5UZXN0MTkxN0hvc3RUZXN0Q2FzZXMKKworaW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTE3L0FuZHJvaWRUZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkxNy9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg1OWYxYQotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkxNy9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIi8+CisgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJhcnQiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDE5MTdEZXZpY2VBcHAuYXBrIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5KYXJIb3N0VGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImphciIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDE5MTdIb3N0VGVzdENhc2VzLmphciIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJzZXQtb3B0aW9uIiB2YWx1ZT0idGVzdC1maWxlLW5hbWU6Q3RzSnZtdGlSdW5UZXN0MTkxN0RldmljZUFwcC5hcGsiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ic2V0LW9wdGlvbiIgdmFsdWU9InBhY2thZ2UtbmFtZTphbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTE3IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjhzIi8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTE3L2FwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTE3L2FwcC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MzNjOTgKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MTcvYXBwL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKK0xPQ0FMX0RFWF9QUkVPUFQgOj0gZmFsc2UKK0xPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKK0xPQ0FMX1NSQ19GSUxFUyA6PQorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aURldmljZVJ1blRlc3RBcHBCYXNlCitMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdHNqdm10aWFnZW50CitMT0NBTF9NVUxUSUxJQiA6PSBib3RoCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CisKKyMgVE9ETzogUmVmYWN0b3IuIFRoaXMgaXMgdGhlIG9ubHkgdGhpbmcgZXZlcnkgY2hhbmdpbmcuCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzSnZtdGlSdW5UZXN0MTkxN0RldmljZUFwcAorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkxNy9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkxNy9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTliNmM4Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTE3L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTE3Ij4KKworICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmRlYnVnZ2FibGU9InRydWUiPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKyAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0X25yIiBhbmRyb2lkOnZhbHVlPSIxOTE3IiAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmp2bXRpLkp2bXRpQWN0aXZpdHkiID4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPCEtLSAgc2VsZi1pbnN0cnVtZW50aW5nIHRlc3QgcGFja2FnZS4gLS0+CisgICAgPGluc3RydW1lbnRhdGlvbgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIGZvciBKVk1USSIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTE3IiA+CisgICAgPC9pbnN0cnVtZW50YXRpb24+Cis8L21hbmlmZXN0PgorCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MTcvamFyamFyLXJ1bGVzLnR4dCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkxNy9qYXJqYXItcnVsZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MmRkNDkKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MTcvamFyamFyLXJ1bGVzLnR4dApAQCAtMCwwICsxIEBACitydWxlIGFuZHJvaWQuanZtdGkuY3RzLkp2bXRpSG9zdFRlc3QqKiBhbmRyb2lkLmp2bXRpLmN0cy5Kdm10aUhvc3RUZXN0MTkxN0AxCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MjAvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkyMC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMzE1NTQKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MjAvQW5kcm9pZC5tawpAQCAtMCwwICsxLDIxIEBACisjIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEUgOj0gQ3RzSnZtdGlSdW5UZXN0MTkyMEhvc3RUZXN0Q2FzZXMKKworaW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTIwL0FuZHJvaWRUZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkyMC9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZmMjA3OQotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkyMC9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIi8+CisgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJhcnQiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDE5MjBEZXZpY2VBcHAuYXBrIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5KYXJIb3N0VGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImphciIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDE5MjBIb3N0VGVzdENhc2VzLmphciIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJzZXQtb3B0aW9uIiB2YWx1ZT0idGVzdC1maWxlLW5hbWU6Q3RzSnZtdGlSdW5UZXN0MTkyMERldmljZUFwcC5hcGsiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ic2V0LW9wdGlvbiIgdmFsdWU9InBhY2thZ2UtbmFtZTphbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTIwIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjhzIi8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTIwL2FwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTIwL2FwcC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZGViZWQKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MjAvYXBwL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKK0xPQ0FMX0RFWF9QUkVPUFQgOj0gZmFsc2UKK0xPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKK0xPQ0FMX1NSQ19GSUxFUyA6PQorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aURldmljZVJ1blRlc3RBcHBCYXNlCitMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdHNqdm10aWFnZW50CitMT0NBTF9NVUxUSUxJQiA6PSBib3RoCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CisKKyMgVE9ETzogUmVmYWN0b3IuIFRoaXMgaXMgdGhlIG9ubHkgdGhpbmcgZXZlcnkgY2hhbmdpbmcuCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzSnZtdGlSdW5UZXN0MTkyMERldmljZUFwcAorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkyMC9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkyMC9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjY3YWFkCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTIwL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTIwIj4KKworICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmRlYnVnZ2FibGU9InRydWUiPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKyAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0X25yIiBhbmRyb2lkOnZhbHVlPSIxOTIwIiAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmp2bXRpLkp2bXRpQWN0aXZpdHkiID4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPCEtLSAgc2VsZi1pbnN0cnVtZW50aW5nIHRlc3QgcGFja2FnZS4gLS0+CisgICAgPGluc3RydW1lbnRhdGlvbgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIGZvciBKVk1USSIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTIwIiA+CisgICAgPC9pbnN0cnVtZW50YXRpb24+Cis8L21hbmlmZXN0PgorCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MjAvamFyamFyLXJ1bGVzLnR4dCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkyMC9qYXJqYXItcnVsZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2MDc5MTcKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MjAvamFyamFyLXJ1bGVzLnR4dApAQCAtMCwwICsxIEBACitydWxlIGFuZHJvaWQuanZtdGkuY3RzLkp2bXRpSG9zdFRlc3QqKiBhbmRyb2lkLmp2bXRpLmN0cy5Kdm10aUhvc3RUZXN0MTkyMEAxCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MjEvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkyMS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZGE2ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MjEvQW5kcm9pZC5tawpAQCAtMCwwICsxLDIxIEBACisjIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEUgOj0gQ3RzSnZtdGlSdW5UZXN0MTkyMUhvc3RUZXN0Q2FzZXMKKworaW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTIxL0FuZHJvaWRUZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkyMS9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY1Nzc4NAotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkyMS9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIi8+CisgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJhcnQiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDE5MjFEZXZpY2VBcHAuYXBrIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5KYXJIb3N0VGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImphciIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDE5MjFIb3N0VGVzdENhc2VzLmphciIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJzZXQtb3B0aW9uIiB2YWx1ZT0idGVzdC1maWxlLW5hbWU6Q3RzSnZtdGlSdW5UZXN0MTkyMURldmljZUFwcC5hcGsiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ic2V0LW9wdGlvbiIgdmFsdWU9InBhY2thZ2UtbmFtZTphbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTIxIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjhzIi8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTIxL2FwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTIxL2FwcC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4ZTZjNTMKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MjEvYXBwL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKK0xPQ0FMX0RFWF9QUkVPUFQgOj0gZmFsc2UKK0xPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKK0xPQ0FMX1NSQ19GSUxFUyA6PQorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aURldmljZVJ1blRlc3RBcHBCYXNlCitMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdHNqdm10aWFnZW50CitMT0NBTF9NVUxUSUxJQiA6PSBib3RoCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CisKKyMgVE9ETzogUmVmYWN0b3IuIFRoaXMgaXMgdGhlIG9ubHkgdGhpbmcgZXZlcnkgY2hhbmdpbmcuCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzSnZtdGlSdW5UZXN0MTkyMURldmljZUFwcAorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkyMS9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkyMS9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjZjNDViCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTIxL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTIxIj4KKworICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmRlYnVnZ2FibGU9InRydWUiPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKyAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0X25yIiBhbmRyb2lkOnZhbHVlPSIxOTIxIiAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmp2bXRpLkp2bXRpQWN0aXZpdHkiID4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPCEtLSAgc2VsZi1pbnN0cnVtZW50aW5nIHRlc3QgcGFja2FnZS4gLS0+CisgICAgPGluc3RydW1lbnRhdGlvbgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIGZvciBKVk1USSIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTIxIiA+CisgICAgPC9pbnN0cnVtZW50YXRpb24+Cis8L21hbmlmZXN0PgorCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MjEvamFyamFyLXJ1bGVzLnR4dCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkyMS9qYXJqYXItcnVsZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyYTVmNGEKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MjEvamFyamFyLXJ1bGVzLnR4dApAQCAtMCwwICsxIEBACitydWxlIGFuZHJvaWQuanZtdGkuY3RzLkp2bXRpSG9zdFRlc3QqKiBhbmRyb2lkLmp2bXRpLmN0cy5Kdm10aUhvc3RUZXN0MTkyMUAxCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MjIvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkyMi9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNTQzZjMKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MjIvQW5kcm9pZC5tawpAQCAtMCwwICsxLDIxIEBACisjIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEUgOj0gQ3RzSnZtdGlSdW5UZXN0MTkyMkhvc3RUZXN0Q2FzZXMKKworaW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTIyL0FuZHJvaWRUZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkyMi9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhhNzc1YQotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkyMi9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIi8+CisgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJhcnQiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDE5MjJEZXZpY2VBcHAuYXBrIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5KYXJIb3N0VGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImphciIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDE5MjJIb3N0VGVzdENhc2VzLmphciIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJzZXQtb3B0aW9uIiB2YWx1ZT0idGVzdC1maWxlLW5hbWU6Q3RzSnZtdGlSdW5UZXN0MTkyMkRldmljZUFwcC5hcGsiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ic2V0LW9wdGlvbiIgdmFsdWU9InBhY2thZ2UtbmFtZTphbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTIyIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjhzIi8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTIyL2FwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTIyL2FwcC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMDZhZDkKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MjIvYXBwL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKK0xPQ0FMX0RFWF9QUkVPUFQgOj0gZmFsc2UKK0xPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKK0xPQ0FMX1NSQ19GSUxFUyA6PQorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aURldmljZVJ1blRlc3RBcHBCYXNlCitMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdHNqdm10aWFnZW50CitMT0NBTF9NVUxUSUxJQiA6PSBib3RoCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CisKKyMgVE9ETzogUmVmYWN0b3IuIFRoaXMgaXMgdGhlIG9ubHkgdGhpbmcgZXZlcnkgY2hhbmdpbmcuCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzSnZtdGlSdW5UZXN0MTkyMkRldmljZUFwcAorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkyMi9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkyMi9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWZhYzRiCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTIyL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTIyIj4KKworICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmRlYnVnZ2FibGU9InRydWUiPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKyAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0X25yIiBhbmRyb2lkOnZhbHVlPSIxOTIyIiAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmp2bXRpLkp2bXRpQWN0aXZpdHkiID4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPCEtLSAgc2VsZi1pbnN0cnVtZW50aW5nIHRlc3QgcGFja2FnZS4gLS0+CisgICAgPGluc3RydW1lbnRhdGlvbgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIGZvciBKVk1USSIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTIyIiA+CisgICAgPC9pbnN0cnVtZW50YXRpb24+Cis8L21hbmlmZXN0PgorCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MjIvamFyamFyLXJ1bGVzLnR4dCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkyMi9qYXJqYXItcnVsZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MWU2OTYKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MjIvamFyamFyLXJ1bGVzLnR4dApAQCAtMCwwICsxIEBACitydWxlIGFuZHJvaWQuanZtdGkuY3RzLkp2bXRpSG9zdFRlc3QqKiBhbmRyb2lkLmp2bXRpLmN0cy5Kdm10aUhvc3RUZXN0MTkyMkAxCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MjMvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkyMy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MDVkMDkKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MjMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDIxIEBACisjIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEUgOj0gQ3RzSnZtdGlSdW5UZXN0MTkyM0hvc3RUZXN0Q2FzZXMKKworaW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTIzL0FuZHJvaWRUZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkyMy9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYzMDk1NwotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkyMy9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIi8+CisgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJhcnQiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDE5MjNEZXZpY2VBcHAuYXBrIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5KYXJIb3N0VGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImphciIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDE5MjNIb3N0VGVzdENhc2VzLmphciIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJzZXQtb3B0aW9uIiB2YWx1ZT0idGVzdC1maWxlLW5hbWU6Q3RzSnZtdGlSdW5UZXN0MTkyM0RldmljZUFwcC5hcGsiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ic2V0LW9wdGlvbiIgdmFsdWU9InBhY2thZ2UtbmFtZTphbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTIzIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjhzIi8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTIzL2FwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTIzL2FwcC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ZTUxMTgKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MjMvYXBwL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKK0xPQ0FMX0RFWF9QUkVPUFQgOj0gZmFsc2UKK0xPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKK0xPQ0FMX1NSQ19GSUxFUyA6PQorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aURldmljZVJ1blRlc3RBcHBCYXNlCitMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdHNqdm10aWFnZW50CitMT0NBTF9NVUxUSUxJQiA6PSBib3RoCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CisKKyMgVE9ETzogUmVmYWN0b3IuIFRoaXMgaXMgdGhlIG9ubHkgdGhpbmcgZXZlcnkgY2hhbmdpbmcuCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzSnZtdGlSdW5UZXN0MTkyM0RldmljZUFwcAorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkyMy9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkyMy9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTM3MzlkCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTIzL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTIzIj4KKworICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmRlYnVnZ2FibGU9InRydWUiPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKyAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0X25yIiBhbmRyb2lkOnZhbHVlPSIxOTIzIiAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmp2bXRpLkp2bXRpQWN0aXZpdHkiID4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPCEtLSAgc2VsZi1pbnN0cnVtZW50aW5nIHRlc3QgcGFja2FnZS4gLS0+CisgICAgPGluc3RydW1lbnRhdGlvbgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIGZvciBKVk1USSIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTIzIiA+CisgICAgPC9pbnN0cnVtZW50YXRpb24+Cis8L21hbmlmZXN0PgorCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MjMvamFyamFyLXJ1bGVzLnR4dCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkyMy9qYXJqYXItcnVsZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYjM0NTkKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MjMvamFyamFyLXJ1bGVzLnR4dApAQCAtMCwwICsxIEBACitydWxlIGFuZHJvaWQuanZtdGkuY3RzLkp2bXRpSG9zdFRlc3QqKiBhbmRyb2lkLmp2bXRpLmN0cy5Kdm10aUhvc3RUZXN0MTkyM0AxCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MjQvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkyNC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZTdkZmEKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MjQvQW5kcm9pZC5tawpAQCAtMCwwICsxLDIxIEBACisjIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEUgOj0gQ3RzSnZtdGlSdW5UZXN0MTkyNEhvc3RUZXN0Q2FzZXMKKworaW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTI0L0FuZHJvaWRUZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkyNC9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE3ZmUxMgotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkyNC9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIi8+CisgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJhcnQiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDE5MjREZXZpY2VBcHAuYXBrIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5KYXJIb3N0VGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImphciIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDE5MjRIb3N0VGVzdENhc2VzLmphciIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJzZXQtb3B0aW9uIiB2YWx1ZT0idGVzdC1maWxlLW5hbWU6Q3RzSnZtdGlSdW5UZXN0MTkyNERldmljZUFwcC5hcGsiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ic2V0LW9wdGlvbiIgdmFsdWU9InBhY2thZ2UtbmFtZTphbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTI0IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjhzIi8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTI0L2FwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTI0L2FwcC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZjU5MGQKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MjQvYXBwL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKK0xPQ0FMX0RFWF9QUkVPUFQgOj0gZmFsc2UKK0xPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKK0xPQ0FMX1NSQ19GSUxFUyA6PQorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aURldmljZVJ1blRlc3RBcHBCYXNlCitMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdHNqdm10aWFnZW50CitMT0NBTF9NVUxUSUxJQiA6PSBib3RoCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CisKKyMgVE9ETzogUmVmYWN0b3IuIFRoaXMgaXMgdGhlIG9ubHkgdGhpbmcgZXZlcnkgY2hhbmdpbmcuCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzSnZtdGlSdW5UZXN0MTkyNERldmljZUFwcAorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkyNC9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkyNC9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mzg4MjA5Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTI0L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTI0Ij4KKworICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmRlYnVnZ2FibGU9InRydWUiPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKyAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0X25yIiBhbmRyb2lkOnZhbHVlPSIxOTI0IiAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmp2bXRpLkp2bXRpQWN0aXZpdHkiID4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPCEtLSAgc2VsZi1pbnN0cnVtZW50aW5nIHRlc3QgcGFja2FnZS4gLS0+CisgICAgPGluc3RydW1lbnRhdGlvbgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIGZvciBKVk1USSIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTI0IiA+CisgICAgPC9pbnN0cnVtZW50YXRpb24+Cis8L21hbmlmZXN0PgorCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MjQvamFyamFyLXJ1bGVzLnR4dCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkyNC9qYXJqYXItcnVsZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2Zjg2N2QKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MjQvamFyamFyLXJ1bGVzLnR4dApAQCAtMCwwICsxIEBACitydWxlIGFuZHJvaWQuanZtdGkuY3RzLkp2bXRpSG9zdFRlc3QqKiBhbmRyb2lkLmp2bXRpLmN0cy5Kdm10aUhvc3RUZXN0MTkyNEAxCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MjUvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkyNS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZTU1OGQKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MjUvQW5kcm9pZC5tawpAQCAtMCwwICsxLDIxIEBACisjIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEUgOj0gQ3RzSnZtdGlSdW5UZXN0MTkyNUhvc3RUZXN0Q2FzZXMKKworaW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTI1L0FuZHJvaWRUZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkyNS9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTExNmQ2NQotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkyNS9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIi8+CisgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJhcnQiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDE5MjVEZXZpY2VBcHAuYXBrIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5KYXJIb3N0VGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImphciIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDE5MjVIb3N0VGVzdENhc2VzLmphciIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJzZXQtb3B0aW9uIiB2YWx1ZT0idGVzdC1maWxlLW5hbWU6Q3RzSnZtdGlSdW5UZXN0MTkyNURldmljZUFwcC5hcGsiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ic2V0LW9wdGlvbiIgdmFsdWU9InBhY2thZ2UtbmFtZTphbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTI1IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjhzIi8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTI1L2FwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTI1L2FwcC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZGY2ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MjUvYXBwL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKK0xPQ0FMX0RFWF9QUkVPUFQgOj0gZmFsc2UKK0xPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKK0xPQ0FMX1NSQ19GSUxFUyA6PQorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aURldmljZVJ1blRlc3RBcHBCYXNlCitMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdHNqdm10aWFnZW50CitMT0NBTF9NVUxUSUxJQiA6PSBib3RoCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CisKKyMgVE9ETzogUmVmYWN0b3IuIFRoaXMgaXMgdGhlIG9ubHkgdGhpbmcgZXZlcnkgY2hhbmdpbmcuCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzSnZtdGlSdW5UZXN0MTkyNURldmljZUFwcAorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkyNS9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkyNS9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2ZhYjRmCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTI1L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTI1Ij4KKworICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmRlYnVnZ2FibGU9InRydWUiPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKyAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0X25yIiBhbmRyb2lkOnZhbHVlPSIxOTI1IiAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmp2bXRpLkp2bXRpQWN0aXZpdHkiID4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPCEtLSAgc2VsZi1pbnN0cnVtZW50aW5nIHRlc3QgcGFja2FnZS4gLS0+CisgICAgPGluc3RydW1lbnRhdGlvbgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIGZvciBKVk1USSIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTI1IiA+CisgICAgPC9pbnN0cnVtZW50YXRpb24+Cis8L21hbmlmZXN0PgorCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MjUvamFyamFyLXJ1bGVzLnR4dCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkyNS9qYXJqYXItcnVsZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5OWEzMjkKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MjUvamFyamFyLXJ1bGVzLnR4dApAQCAtMCwwICsxIEBACitydWxlIGFuZHJvaWQuanZtdGkuY3RzLkp2bXRpSG9zdFRlc3QqKiBhbmRyb2lkLmp2bXRpLmN0cy5Kdm10aUhvc3RUZXN0MTkyNUAxCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MjYvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkyNi9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMjI3OTIKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MjYvQW5kcm9pZC5tawpAQCAtMCwwICsxLDIxIEBACisjIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEUgOj0gQ3RzSnZtdGlSdW5UZXN0MTkyNkhvc3RUZXN0Q2FzZXMKKworaW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTI2L0FuZHJvaWRUZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkyNi9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMyNTBhMAotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkyNi9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIi8+CisgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJhcnQiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDE5MjZEZXZpY2VBcHAuYXBrIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5KYXJIb3N0VGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImphciIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDE5MjZIb3N0VGVzdENhc2VzLmphciIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJzZXQtb3B0aW9uIiB2YWx1ZT0idGVzdC1maWxlLW5hbWU6Q3RzSnZtdGlSdW5UZXN0MTkyNkRldmljZUFwcC5hcGsiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ic2V0LW9wdGlvbiIgdmFsdWU9InBhY2thZ2UtbmFtZTphbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTI2IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjhzIi8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTI2L2FwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTI2L2FwcC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MTY3MTMKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MjYvYXBwL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKK0xPQ0FMX0RFWF9QUkVPUFQgOj0gZmFsc2UKK0xPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKK0xPQ0FMX1NSQ19GSUxFUyA6PQorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aURldmljZVJ1blRlc3RBcHBCYXNlCitMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdHNqdm10aWFnZW50CitMT0NBTF9NVUxUSUxJQiA6PSBib3RoCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CisKKyMgVE9ETzogUmVmYWN0b3IuIFRoaXMgaXMgdGhlIG9ubHkgdGhpbmcgZXZlcnkgY2hhbmdpbmcuCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzSnZtdGlSdW5UZXN0MTkyNkRldmljZUFwcAorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkyNi9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkyNi9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTVkYTA1Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTI2L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTI2Ij4KKworICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmRlYnVnZ2FibGU9InRydWUiPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKyAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0X25yIiBhbmRyb2lkOnZhbHVlPSIxOTI2IiAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmp2bXRpLkp2bXRpQWN0aXZpdHkiID4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPCEtLSAgc2VsZi1pbnN0cnVtZW50aW5nIHRlc3QgcGFja2FnZS4gLS0+CisgICAgPGluc3RydW1lbnRhdGlvbgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIGZvciBKVk1USSIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTI2IiA+CisgICAgPC9pbnN0cnVtZW50YXRpb24+Cis8L21hbmlmZXN0PgorCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MjYvamFyamFyLXJ1bGVzLnR4dCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkyNi9qYXJqYXItcnVsZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZWYxY2EKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MjYvamFyamFyLXJ1bGVzLnR4dApAQCAtMCwwICsxIEBACitydWxlIGFuZHJvaWQuanZtdGkuY3RzLkp2bXRpSG9zdFRlc3QqKiBhbmRyb2lkLmp2bXRpLmN0cy5Kdm10aUhvc3RUZXN0MTkyNkAxCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MjcvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkyNy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1N2Y2NzkKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MjcvQW5kcm9pZC5tawpAQCAtMCwwICsxLDIxIEBACisjIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEUgOj0gQ3RzSnZtdGlSdW5UZXN0MTkyN0hvc3RUZXN0Q2FzZXMKKworaW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTI3L0FuZHJvaWRUZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkyNy9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE4ZWFhMgotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkyNy9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIi8+CisgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJhcnQiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDE5MjdEZXZpY2VBcHAuYXBrIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5KYXJIb3N0VGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImphciIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDE5MjdIb3N0VGVzdENhc2VzLmphciIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJzZXQtb3B0aW9uIiB2YWx1ZT0idGVzdC1maWxlLW5hbWU6Q3RzSnZtdGlSdW5UZXN0MTkyN0RldmljZUFwcC5hcGsiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ic2V0LW9wdGlvbiIgdmFsdWU9InBhY2thZ2UtbmFtZTphbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTI3IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjhzIi8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTI3L2FwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTI3L2FwcC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZWZjNzgKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MjcvYXBwL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKK0xPQ0FMX0RFWF9QUkVPUFQgOj0gZmFsc2UKK0xPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKK0xPQ0FMX1NSQ19GSUxFUyA6PQorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aURldmljZVJ1blRlc3RBcHBCYXNlCitMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdHNqdm10aWFnZW50CitMT0NBTF9NVUxUSUxJQiA6PSBib3RoCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CisKKyMgVE9ETzogUmVmYWN0b3IuIFRoaXMgaXMgdGhlIG9ubHkgdGhpbmcgZXZlcnkgY2hhbmdpbmcuCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzSnZtdGlSdW5UZXN0MTkyN0RldmljZUFwcAorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkyNy9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkyNy9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDE5MjAyCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTI3L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTI3Ij4KKworICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmRlYnVnZ2FibGU9InRydWUiPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKyAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0X25yIiBhbmRyb2lkOnZhbHVlPSIxOTI3IiAvPgorICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5qdm10aS5jdHMubmVlZHNfbmV3X3RocmVhZCIgYW5kcm9pZDp2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5qdm10aS5Kdm10aUFjdGl2aXR5IiA+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgPC9hcHBsaWNhdGlvbj4KKworICAgIDwhLS0gIHNlbGYtaW5zdHJ1bWVudGluZyB0ZXN0IHBhY2thZ2UuIC0tPgorICAgIDxpbnN0cnVtZW50YXRpb24KKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBmb3IgSlZNVEkiCisgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfMTkyNyIgPgorICAgIDwvaW5zdHJ1bWVudGF0aW9uPgorPC9tYW5pZmVzdD4KKwpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTI3L2phcmphci1ydWxlcy50eHQgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MjcvamFyamFyLXJ1bGVzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjVkYmY1Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTI3L2phcmphci1ydWxlcy50eHQKQEAgLTAsMCArMSBAQAorcnVsZSBhbmRyb2lkLmp2bXRpLmN0cy5Kdm10aUhvc3RUZXN0KiogYW5kcm9pZC5qdm10aS5jdHMuSnZtdGlIb3N0VGVzdDE5MjdAMQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTI4L0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MjgvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDIyNDc5Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTI4L0FuZHJvaWQubWsKQEAgLTAsMCArMSwyMSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFIDo9IEN0c0p2bXRpUnVuVGVzdDE5MjhIb3N0VGVzdENhc2VzCisKK2luY2x1ZGUgJChMT0NBTF9QQVRIKS8uLi8uLi9ob3N0X3NpZGUubWsKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkyOC9BbmRyb2lkVGVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MjgvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhYmI0NjIKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MjgvQW5kcm9pZFRlc3QueG1sCkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgSlZNVEkgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIvPgorICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iYXJ0IiAvPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJDdHNKdm10aVJ1blRlc3QxOTI4RGV2aWNlQXBwLmFwayIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGVzdHR5cGUuSmFySG9zdFRlc3QiID4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJqYXIiIHZhbHVlPSJDdHNKdm10aVJ1blRlc3QxOTI4SG9zdFRlc3RDYXNlcy5qYXIiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ic2V0LW9wdGlvbiIgdmFsdWU9InRlc3QtZmlsZS1uYW1lOkN0c0p2bXRpUnVuVGVzdDE5MjhEZXZpY2VBcHAuYXBrIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InNldC1vcHRpb24iIHZhbHVlPSJwYWNrYWdlLW5hbWU6YW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfMTkyOCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJydW50aW1lLWhpbnQiIHZhbHVlPSI4cyIvPgorICAgIDwvdGVzdD4KKzwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkyOC9hcHAvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkyOC9hcHAvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWZiNzUzCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTI4L2FwcC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzMgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKK0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCitMT0NBTF9ERVhfUFJFT1BUIDo9IGZhbHNlCitMT0NBTF9QUk9HVUFSRF9FTkFCTEVEIDo9IGRpc2FibGVkCitMT0NBTF9TUkNfRklMRVMgOj0KK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gQ3RzSnZtdGlEZXZpY2VSdW5UZXN0QXBwQmFzZQorTE9DQUxfSk5JX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3RzanZtdGlhZ2VudAorTE9DQUxfTVVMVElMSUIgOj0gYm90aAorTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorCisjIFRPRE86IFJlZmFjdG9yLiBUaGlzIGlzIHRoZSBvbmx5IHRoaW5nIGV2ZXJ5IGNoYW5naW5nLgorTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0p2bXRpUnVuVGVzdDE5MjhEZXZpY2VBcHAKKworaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MjgvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MjgvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZlZjEyNgotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkyOC9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDM2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfMTkyOCI+CisKKyAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpkZWJ1Z2dhYmxlPSJ0cnVlIj4KKyAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CisgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF9uciIgYW5kcm9pZDp2YWx1ZT0iMTkyOCIgLz4KKyAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuanZtdGkuY3RzLm5lZWRzX25ld190aHJlYWQiIGFuZHJvaWQ6dmFsdWU9InRydWUiIC8+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuanZtdGkuSnZtdGlBY3Rpdml0eSIgPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgIDwvYXBwbGljYXRpb24+CisKKyAgICA8IS0tICBzZWxmLWluc3RydW1lbnRpbmcgdGVzdCBwYWNrYWdlLiAtLT4KKyAgICA8aW5zdHJ1bWVudGF0aW9uCisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgdGVzdHMgZm9yIEpWTVRJIgorICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0XzE5MjgiID4KKyAgICA8L2luc3RydW1lbnRhdGlvbj4KKzwvbWFuaWZlc3Q+CisKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkyOC9qYXJqYXItcnVsZXMudHh0IGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTI4L2phcmphci1ydWxlcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRkMjRjNAotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkyOC9qYXJqYXItcnVsZXMudHh0CkBAIC0wLDAgKzEgQEAKK3J1bGUgYW5kcm9pZC5qdm10aS5jdHMuSnZtdGlIb3N0VGVzdCoqIGFuZHJvaWQuanZtdGkuY3RzLkp2bXRpSG9zdFRlc3QxOTI4QDEKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkzMC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTMwL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVmNWQ5OQotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkzMC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjEgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRSA6PSBDdHNKdm10aVJ1blRlc3QxOTMwSG9zdFRlc3RDYXNlcworCitpbmNsdWRlICQoTE9DQUxfUEFUSCkvLi4vLi4vaG9zdF9zaWRlLm1rCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MzAvQW5kcm9pZFRlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTMwL0FuZHJvaWRUZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjA0MmM1Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTMwL0FuZHJvaWRUZXN0LnhtbApAQCAtMCwwICsxLDI5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIEpWTVRJIHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiLz4KKyAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImFydCIgLz4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzSnZtdGlSdW5UZXN0MTkzMERldmljZUFwcC5hcGsiIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRlc3R0eXBlLkphckhvc3RUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0iamFyIiB2YWx1ZT0iQ3RzSnZtdGlSdW5UZXN0MTkzMEhvc3RUZXN0Q2FzZXMuamFyIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InNldC1vcHRpb24iIHZhbHVlPSJ0ZXN0LWZpbGUtbmFtZTpDdHNKdm10aVJ1blRlc3QxOTMwRGV2aWNlQXBwLmFwayIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJzZXQtb3B0aW9uIiB2YWx1ZT0icGFja2FnZS1uYW1lOmFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0XzE5MzAiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVudGltZS1oaW50IiB2YWx1ZT0iOHMiLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MzAvYXBwL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MzAvYXBwL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgyNTMwNwotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkzMC9hcHAvQW5kcm9pZC5tawpAQCAtMCwwICsxLDMzIEBACisjIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQorTE9DQUxfREVYX1BSRU9QVCA6PSBmYWxzZQorTE9DQUxfUFJPR1VBUkRfRU5BQkxFRCA6PSBkaXNhYmxlZAorTE9DQUxfU1JDX0ZJTEVTIDo9CitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IEN0c0p2bXRpRGV2aWNlUnVuVGVzdEFwcEJhc2UKK0xPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmN0c2p2bXRpYWdlbnQKK0xPQ0FMX01VTFRJTElCIDo9IGJvdGgKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKKworIyBUT0RPOiBSZWZhY3Rvci4gVGhpcyBpcyB0aGUgb25seSB0aGluZyBldmVyeSBjaGFuZ2luZy4KK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNKdm10aVJ1blRlc3QxOTMwRGV2aWNlQXBwCisKK2luY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTMwL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTMwL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZTU4OGEKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MzAvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwzNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0XzE5MzAiPgorCisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6ZGVidWdnYWJsZT0idHJ1ZSI+CisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgorICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfbnIiIGFuZHJvaWQ6dmFsdWU9IjE5MzAiIC8+CisgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmp2bXRpLmN0cy5uZWVkc19uZXdfdGhyZWFkIiBhbmRyb2lkOnZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmp2bXRpLkp2bXRpQWN0aXZpdHkiID4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPCEtLSAgc2VsZi1pbnN0cnVtZW50aW5nIHRlc3QgcGFja2FnZS4gLS0+CisgICAgPGluc3RydW1lbnRhdGlvbgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIGZvciBKVk1USSIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTMwIiA+CisgICAgPC9pbnN0cnVtZW50YXRpb24+Cis8L21hbmlmZXN0PgorCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MzAvamFyamFyLXJ1bGVzLnR4dCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkzMC9qYXJqYXItcnVsZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZmEyZjEKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MzAvamFyamFyLXJ1bGVzLnR4dApAQCAtMCwwICsxIEBACitydWxlIGFuZHJvaWQuanZtdGkuY3RzLkp2bXRpSG9zdFRlc3QqKiBhbmRyb2lkLmp2bXRpLmN0cy5Kdm10aUhvc3RUZXN0MTkzMEAxCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MzEvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkzMS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmODU5NmMKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MzEvQW5kcm9pZC5tawpAQCAtMCwwICsxLDIxIEBACisjIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEUgOj0gQ3RzSnZtdGlSdW5UZXN0MTkzMUhvc3RUZXN0Q2FzZXMKKworaW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTMxL0FuZHJvaWRUZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkzMS9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYxNzZmZAotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkzMS9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIi8+CisgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJhcnQiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDE5MzFEZXZpY2VBcHAuYXBrIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5KYXJIb3N0VGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImphciIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDE5MzFIb3N0VGVzdENhc2VzLmphciIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJzZXQtb3B0aW9uIiB2YWx1ZT0idGVzdC1maWxlLW5hbWU6Q3RzSnZtdGlSdW5UZXN0MTkzMURldmljZUFwcC5hcGsiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ic2V0LW9wdGlvbiIgdmFsdWU9InBhY2thZ2UtbmFtZTphbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTMxIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjhzIi8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTMxL2FwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTMxL2FwcC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiYzU2YmIKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MzEvYXBwL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKK0xPQ0FMX0RFWF9QUkVPUFQgOj0gZmFsc2UKK0xPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKK0xPQ0FMX1NSQ19GSUxFUyA6PQorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aURldmljZVJ1blRlc3RBcHBCYXNlCitMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdHNqdm10aWFnZW50CitMT0NBTF9NVUxUSUxJQiA6PSBib3RoCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CisKKyMgVE9ETzogUmVmYWN0b3IuIFRoaXMgaXMgdGhlIG9ubHkgdGhpbmcgZXZlcnkgY2hhbmdpbmcuCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzSnZtdGlSdW5UZXN0MTkzMURldmljZUFwcAorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkzMS9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkzMS9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjhmYzI2Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTMxL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTMxIj4KKworICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmRlYnVnZ2FibGU9InRydWUiPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKyAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0X25yIiBhbmRyb2lkOnZhbHVlPSIxOTMxIiAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmp2bXRpLkp2bXRpQWN0aXZpdHkiID4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPCEtLSAgc2VsZi1pbnN0cnVtZW50aW5nIHRlc3QgcGFja2FnZS4gLS0+CisgICAgPGluc3RydW1lbnRhdGlvbgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIGZvciBKVk1USSIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTMxIiA+CisgICAgPC9pbnN0cnVtZW50YXRpb24+Cis8L21hbmlmZXN0PgorCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MzEvamFyamFyLXJ1bGVzLnR4dCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkzMS9qYXJqYXItcnVsZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNGUxZTkKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MzEvamFyamFyLXJ1bGVzLnR4dApAQCAtMCwwICsxIEBACitydWxlIGFuZHJvaWQuanZtdGkuY3RzLkp2bXRpSG9zdFRlc3QqKiBhbmRyb2lkLmp2bXRpLmN0cy5Kdm10aUhvc3RUZXN0MTkzMUAxCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MzIvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkzMi9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZjI5NWIKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MzIvQW5kcm9pZC5tawpAQCAtMCwwICsxLDIxIEBACisjIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEUgOj0gQ3RzSnZtdGlSdW5UZXN0MTkzMkhvc3RUZXN0Q2FzZXMKKworaW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTMyL0FuZHJvaWRUZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkzMi9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q4OGJjNAotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkzMi9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIi8+CisgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJhcnQiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDE5MzJEZXZpY2VBcHAuYXBrIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5KYXJIb3N0VGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImphciIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDE5MzJIb3N0VGVzdENhc2VzLmphciIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJzZXQtb3B0aW9uIiB2YWx1ZT0idGVzdC1maWxlLW5hbWU6Q3RzSnZtdGlSdW5UZXN0MTkzMkRldmljZUFwcC5hcGsiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ic2V0LW9wdGlvbiIgdmFsdWU9InBhY2thZ2UtbmFtZTphbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTMyIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjhzIi8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTMyL2FwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTMyL2FwcC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyYzhiYjIKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MzIvYXBwL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKK0xPQ0FMX0RFWF9QUkVPUFQgOj0gZmFsc2UKK0xPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKK0xPQ0FMX1NSQ19GSUxFUyA6PQorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aURldmljZVJ1blRlc3RBcHBCYXNlCitMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdHNqdm10aWFnZW50CitMT0NBTF9NVUxUSUxJQiA6PSBib3RoCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CisKKyMgVE9ETzogUmVmYWN0b3IuIFRoaXMgaXMgdGhlIG9ubHkgdGhpbmcgZXZlcnkgY2hhbmdpbmcuCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzSnZtdGlSdW5UZXN0MTkzMkRldmljZUFwcAorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkzMi9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkzMi9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTEyOTNjCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTMyL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTMyIj4KKworICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmRlYnVnZ2FibGU9InRydWUiPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKyAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0X25yIiBhbmRyb2lkOnZhbHVlPSIxOTMyIiAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmp2bXRpLkp2bXRpQWN0aXZpdHkiID4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPCEtLSAgc2VsZi1pbnN0cnVtZW50aW5nIHRlc3QgcGFja2FnZS4gLS0+CisgICAgPGluc3RydW1lbnRhdGlvbgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIGZvciBKVk1USSIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTMyIiA+CisgICAgPC9pbnN0cnVtZW50YXRpb24+Cis8L21hbmlmZXN0PgorCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MzIvamFyamFyLXJ1bGVzLnR4dCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkzMi9qYXJqYXItcnVsZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMmZlZjkKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MzIvamFyamFyLXJ1bGVzLnR4dApAQCAtMCwwICsxIEBACitydWxlIGFuZHJvaWQuanZtdGkuY3RzLkp2bXRpSG9zdFRlc3QqKiBhbmRyb2lkLmp2bXRpLmN0cy5Kdm10aUhvc3RUZXN0MTkzMkAxCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MzMvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkzMy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3YmE2ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MzMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDIxIEBACisjIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEUgOj0gQ3RzSnZtdGlSdW5UZXN0MTkzM0hvc3RUZXN0Q2FzZXMKKworaW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTMzL0FuZHJvaWRUZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkzMy9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ4N2M1NQotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkzMy9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIi8+CisgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJhcnQiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDE5MzNEZXZpY2VBcHAuYXBrIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5KYXJIb3N0VGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImphciIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDE5MzNIb3N0VGVzdENhc2VzLmphciIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJzZXQtb3B0aW9uIiB2YWx1ZT0idGVzdC1maWxlLW5hbWU6Q3RzSnZtdGlSdW5UZXN0MTkzM0RldmljZUFwcC5hcGsiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ic2V0LW9wdGlvbiIgdmFsdWU9InBhY2thZ2UtbmFtZTphbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTMzIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjhzIi8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTMzL2FwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTMzL2FwcC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkOGNlZTMKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MzMvYXBwL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKK0xPQ0FMX0RFWF9QUkVPUFQgOj0gZmFsc2UKK0xPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKK0xPQ0FMX1NSQ19GSUxFUyA6PQorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aURldmljZVJ1blRlc3RBcHBCYXNlCitMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdHNqdm10aWFnZW50CitMT0NBTF9NVUxUSUxJQiA6PSBib3RoCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CisKKyMgVE9ETzogUmVmYWN0b3IuIFRoaXMgaXMgdGhlIG9ubHkgdGhpbmcgZXZlcnkgY2hhbmdpbmcuCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzSnZtdGlSdW5UZXN0MTkzM0RldmljZUFwcAorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkzMy9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkzMy9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTMwYmY0Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTMzL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTMzIj4KKworICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmRlYnVnZ2FibGU9InRydWUiPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKyAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0X25yIiBhbmRyb2lkOnZhbHVlPSIxOTMzIiAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmp2bXRpLkp2bXRpQWN0aXZpdHkiID4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPCEtLSAgc2VsZi1pbnN0cnVtZW50aW5nIHRlc3QgcGFja2FnZS4gLS0+CisgICAgPGluc3RydW1lbnRhdGlvbgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIGZvciBKVk1USSIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTMzIiA+CisgICAgPC9pbnN0cnVtZW50YXRpb24+Cis8L21hbmlmZXN0PgorCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MzMvamFyamFyLXJ1bGVzLnR4dCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkzMy9qYXJqYXItcnVsZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNDA0NjAKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MzMvamFyamFyLXJ1bGVzLnR4dApAQCAtMCwwICsxIEBACitydWxlIGFuZHJvaWQuanZtdGkuY3RzLkp2bXRpSG9zdFRlc3QqKiBhbmRyb2lkLmp2bXRpLmN0cy5Kdm10aUhvc3RUZXN0MTkzM0AxCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MzQvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkzNC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0OTVmOWYKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MzQvQW5kcm9pZC5tawpAQCAtMCwwICsxLDIxIEBACisjIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEUgOj0gQ3RzSnZtdGlSdW5UZXN0MTkzNEhvc3RUZXN0Q2FzZXMKKworaW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTM0L0FuZHJvaWRUZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkzNC9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdlZTZmMQotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkzNC9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIi8+CisgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJhcnQiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDE5MzREZXZpY2VBcHAuYXBrIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5KYXJIb3N0VGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImphciIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDE5MzRIb3N0VGVzdENhc2VzLmphciIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJzZXQtb3B0aW9uIiB2YWx1ZT0idGVzdC1maWxlLW5hbWU6Q3RzSnZtdGlSdW5UZXN0MTkzNERldmljZUFwcC5hcGsiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ic2V0LW9wdGlvbiIgdmFsdWU9InBhY2thZ2UtbmFtZTphbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTM0IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjhzIi8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTM0L2FwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTM0L2FwcC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMTkwZjcKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MzQvYXBwL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKK0xPQ0FMX0RFWF9QUkVPUFQgOj0gZmFsc2UKK0xPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKK0xPQ0FMX1NSQ19GSUxFUyA6PQorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aURldmljZVJ1blRlc3RBcHBCYXNlCitMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdHNqdm10aWFnZW50CitMT0NBTF9NVUxUSUxJQiA6PSBib3RoCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CisKKyMgVE9ETzogUmVmYWN0b3IuIFRoaXMgaXMgdGhlIG9ubHkgdGhpbmcgZXZlcnkgY2hhbmdpbmcuCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzSnZtdGlSdW5UZXN0MTkzNERldmljZUFwcAorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkzNC9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkzNC9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWJhNDUwCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTM0L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTM0Ij4KKworICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmRlYnVnZ2FibGU9InRydWUiPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKyAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0X25yIiBhbmRyb2lkOnZhbHVlPSIxOTM0IiAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmp2bXRpLkp2bXRpQWN0aXZpdHkiID4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPCEtLSAgc2VsZi1pbnN0cnVtZW50aW5nIHRlc3QgcGFja2FnZS4gLS0+CisgICAgPGluc3RydW1lbnRhdGlvbgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIGZvciBKVk1USSIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTM0IiA+CisgICAgPC9pbnN0cnVtZW50YXRpb24+Cis8L21hbmlmZXN0PgorCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MzQvamFyamFyLXJ1bGVzLnR4dCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkzNC9qYXJqYXItcnVsZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYjkwOWUKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MzQvamFyamFyLXJ1bGVzLnR4dApAQCAtMCwwICsxIEBACitydWxlIGFuZHJvaWQuanZtdGkuY3RzLkp2bXRpSG9zdFRlc3QqKiBhbmRyb2lkLmp2bXRpLmN0cy5Kdm10aUhvc3RUZXN0MTkzNEAxCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MzYvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkzNi9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZDAwNmQKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MzYvQW5kcm9pZC5tawpAQCAtMCwwICsxLDIxIEBACisjIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEUgOj0gQ3RzSnZtdGlSdW5UZXN0MTkzNkhvc3RUZXN0Q2FzZXMKKworaW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTM2L0FuZHJvaWRUZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkzNi9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVmZjcwMgotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkzNi9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIi8+CisgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJhcnQiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDE5MzZEZXZpY2VBcHAuYXBrIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5KYXJIb3N0VGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImphciIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDE5MzZIb3N0VGVzdENhc2VzLmphciIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJzZXQtb3B0aW9uIiB2YWx1ZT0idGVzdC1maWxlLW5hbWU6Q3RzSnZtdGlSdW5UZXN0MTkzNkRldmljZUFwcC5hcGsiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ic2V0LW9wdGlvbiIgdmFsdWU9InBhY2thZ2UtbmFtZTphbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTM2IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjhzIi8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTM2L2FwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTM2L2FwcC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZjM0YWYKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MzYvYXBwL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKK0xPQ0FMX0RFWF9QUkVPUFQgOj0gZmFsc2UKK0xPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKK0xPQ0FMX1NSQ19GSUxFUyA6PQorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aURldmljZVJ1blRlc3RBcHBCYXNlCitMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdHNqdm10aWFnZW50CitMT0NBTF9NVUxUSUxJQiA6PSBib3RoCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CisKKyMgVE9ETzogUmVmYWN0b3IuIFRoaXMgaXMgdGhlIG9ubHkgdGhpbmcgZXZlcnkgY2hhbmdpbmcuCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzSnZtdGlSdW5UZXN0MTkzNkRldmljZUFwcAorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkzNi9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkzNi9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2NmNWNkCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTM2L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTM2Ij4KKworICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmRlYnVnZ2FibGU9InRydWUiPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKyAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0X25yIiBhbmRyb2lkOnZhbHVlPSIxOTM2IiAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmp2bXRpLkp2bXRpQWN0aXZpdHkiID4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPCEtLSAgc2VsZi1pbnN0cnVtZW50aW5nIHRlc3QgcGFja2FnZS4gLS0+CisgICAgPGluc3RydW1lbnRhdGlvbgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIGZvciBKVk1USSIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTM2IiA+CisgICAgPC9pbnN0cnVtZW50YXRpb24+Cis8L21hbmlmZXN0PgorCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MzYvamFyamFyLXJ1bGVzLnR4dCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkzNi9qYXJqYXItcnVsZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZjRlZjcKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MzYvamFyamFyLXJ1bGVzLnR4dApAQCAtMCwwICsxIEBACitydWxlIGFuZHJvaWQuanZtdGkuY3RzLkp2bXRpSG9zdFRlc3QqKiBhbmRyb2lkLmp2bXRpLmN0cy5Kdm10aUhvc3RUZXN0MTkzNkAxCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MzcvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkzNy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMWNlMmQKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MzcvQW5kcm9pZC5tawpAQCAtMCwwICsxLDIxIEBACisjIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEUgOj0gQ3RzSnZtdGlSdW5UZXN0MTkzN0hvc3RUZXN0Q2FzZXMKKworaW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTM3L0FuZHJvaWRUZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkzNy9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVhNjE4NAotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkzNy9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIi8+CisgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJhcnQiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDE5MzdEZXZpY2VBcHAuYXBrIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5KYXJIb3N0VGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImphciIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDE5MzdIb3N0VGVzdENhc2VzLmphciIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJzZXQtb3B0aW9uIiB2YWx1ZT0idGVzdC1maWxlLW5hbWU6Q3RzSnZtdGlSdW5UZXN0MTkzN0RldmljZUFwcC5hcGsiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ic2V0LW9wdGlvbiIgdmFsdWU9InBhY2thZ2UtbmFtZTphbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTM3IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjhzIi8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTM3L2FwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTM3L2FwcC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkYWJmZDYKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MzcvYXBwL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKK0xPQ0FMX0RFWF9QUkVPUFQgOj0gZmFsc2UKK0xPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKK0xPQ0FMX1NSQ19GSUxFUyA6PQorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aURldmljZVJ1blRlc3RBcHBCYXNlCitMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdHNqdm10aWFnZW50CitMT0NBTF9NVUxUSUxJQiA6PSBib3RoCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CisKKyMgVE9ETzogUmVmYWN0b3IuIFRoaXMgaXMgdGhlIG9ubHkgdGhpbmcgZXZlcnkgY2hhbmdpbmcuCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzSnZtdGlSdW5UZXN0MTkzN0RldmljZUFwcAorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkzNy9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkzNy9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjJjOThjCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTM3L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTM3Ij4KKworICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmRlYnVnZ2FibGU9InRydWUiPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKyAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0X25yIiBhbmRyb2lkOnZhbHVlPSIxOTM3IiAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmp2bXRpLkp2bXRpQWN0aXZpdHkiID4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPCEtLSAgc2VsZi1pbnN0cnVtZW50aW5nIHRlc3QgcGFja2FnZS4gLS0+CisgICAgPGluc3RydW1lbnRhdGlvbgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIGZvciBKVk1USSIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTM3IiA+CisgICAgPC9pbnN0cnVtZW50YXRpb24+Cis8L21hbmlmZXN0PgorCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MzcvamFyamFyLXJ1bGVzLnR4dCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkzNy9qYXJqYXItcnVsZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxYzRkODgKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MzcvamFyamFyLXJ1bGVzLnR4dApAQCAtMCwwICsxIEBACitydWxlIGFuZHJvaWQuanZtdGkuY3RzLkp2bXRpSG9zdFRlc3QqKiBhbmRyb2lkLmp2bXRpLmN0cy5Kdm10aUhvc3RUZXN0MTkzN0AxCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MzkvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkzOS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZTM5ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MzkvQW5kcm9pZC5tawpAQCAtMCwwICsxLDIxIEBACisjIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEUgOj0gQ3RzSnZtdGlSdW5UZXN0MTkzOUhvc3RUZXN0Q2FzZXMKKworaW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTM5L0FuZHJvaWRUZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkzOS9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM1MTBjMQotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkzOS9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIi8+CisgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJhcnQiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDE5MzlEZXZpY2VBcHAuYXBrIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5KYXJIb3N0VGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImphciIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDE5MzlIb3N0VGVzdENhc2VzLmphciIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJzZXQtb3B0aW9uIiB2YWx1ZT0idGVzdC1maWxlLW5hbWU6Q3RzSnZtdGlSdW5UZXN0MTkzOURldmljZUFwcC5hcGsiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ic2V0LW9wdGlvbiIgdmFsdWU9InBhY2thZ2UtbmFtZTphbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTM5IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjhzIi8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTM5L2FwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTM5L2FwcC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMmRlM2YKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MzkvYXBwL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKK0xPQ0FMX0RFWF9QUkVPUFQgOj0gZmFsc2UKK0xPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKK0xPQ0FMX1NSQ19GSUxFUyA6PQorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aURldmljZVJ1blRlc3RBcHBCYXNlCitMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdHNqdm10aWFnZW50CitMT0NBTF9NVUxUSUxJQiA6PSBib3RoCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CisKKyMgVE9ETzogUmVmYWN0b3IuIFRoaXMgaXMgdGhlIG9ubHkgdGhpbmcgZXZlcnkgY2hhbmdpbmcuCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzSnZtdGlSdW5UZXN0MTkzOURldmljZUFwcAorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkzOS9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkzOS9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjZhZjBlCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTM5L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTM5Ij4KKworICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmRlYnVnZ2FibGU9InRydWUiPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKyAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0X25yIiBhbmRyb2lkOnZhbHVlPSIxOTM5IiAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmp2bXRpLkp2bXRpQWN0aXZpdHkiID4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPCEtLSAgc2VsZi1pbnN0cnVtZW50aW5nIHRlc3QgcGFja2FnZS4gLS0+CisgICAgPGluc3RydW1lbnRhdGlvbgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIGZvciBKVk1USSIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTM5IiA+CisgICAgPC9pbnN0cnVtZW50YXRpb24+Cis8L21hbmlmZXN0PgorCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MzkvamFyamFyLXJ1bGVzLnR4dCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTkzOS9qYXJqYXItcnVsZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1Mjg4N2YKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5MzkvamFyamFyLXJ1bGVzLnR4dApAQCAtMCwwICsxIEBACitydWxlIGFuZHJvaWQuanZtdGkuY3RzLkp2bXRpSG9zdFRlc3QqKiBhbmRyb2lkLmp2bXRpLmN0cy5Kdm10aUhvc3RUZXN0MTkzOUAxCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5NDEvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTk0MS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwM2U0ODYKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5NDEvQW5kcm9pZC5tawpAQCAtMCwwICsxLDIxIEBACisjIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEUgOj0gQ3RzSnZtdGlSdW5UZXN0MTk0MUhvc3RUZXN0Q2FzZXMKKworaW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTQxL0FuZHJvaWRUZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTk0MS9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM2OGI3YQotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTk0MS9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIi8+CisgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJhcnQiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDE5NDFEZXZpY2VBcHAuYXBrIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5KYXJIb3N0VGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImphciIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDE5NDFIb3N0VGVzdENhc2VzLmphciIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJzZXQtb3B0aW9uIiB2YWx1ZT0idGVzdC1maWxlLW5hbWU6Q3RzSnZtdGlSdW5UZXN0MTk0MURldmljZUFwcC5hcGsiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ic2V0LW9wdGlvbiIgdmFsdWU9InBhY2thZ2UtbmFtZTphbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTQxIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjhzIi8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTQxL2FwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTQxL2FwcC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NTQwZmEKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5NDEvYXBwL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKK0xPQ0FMX0RFWF9QUkVPUFQgOj0gZmFsc2UKK0xPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKK0xPQ0FMX1NSQ19GSUxFUyA6PQorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aURldmljZVJ1blRlc3RBcHBCYXNlCitMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdHNqdm10aWFnZW50CitMT0NBTF9NVUxUSUxJQiA6PSBib3RoCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CisKKyMgVE9ETzogUmVmYWN0b3IuIFRoaXMgaXMgdGhlIG9ubHkgdGhpbmcgZXZlcnkgY2hhbmdpbmcuCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzSnZtdGlSdW5UZXN0MTk0MURldmljZUFwcAorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTk0MS9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTk0MS9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODJlNzRmCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTQxL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTQxIj4KKworICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmRlYnVnZ2FibGU9InRydWUiPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKyAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0X25yIiBhbmRyb2lkOnZhbHVlPSIxOTQxIiAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmp2bXRpLkp2bXRpQWN0aXZpdHkiID4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPCEtLSAgc2VsZi1pbnN0cnVtZW50aW5nIHRlc3QgcGFja2FnZS4gLS0+CisgICAgPGluc3RydW1lbnRhdGlvbgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIGZvciBKVk1USSIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTQxIiA+CisgICAgPC9pbnN0cnVtZW50YXRpb24+Cis8L21hbmlmZXN0PgorCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5NDEvamFyamFyLXJ1bGVzLnR4dCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTk0MS9qYXJqYXItcnVsZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiM2JiMmYKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5NDEvamFyamFyLXJ1bGVzLnR4dApAQCAtMCwwICsxIEBACitydWxlIGFuZHJvaWQuanZtdGkuY3RzLkp2bXRpSG9zdFRlc3QqKiBhbmRyb2lkLmp2bXRpLmN0cy5Kdm10aUhvc3RUZXN0MTk0MUAxCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5NDIvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTk0Mi9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NGJkMmQKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5NDIvQW5kcm9pZC5tawpAQCAtMCwwICsxLDIxIEBACisjIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEUgOj0gQ3RzSnZtdGlSdW5UZXN0MTk0Mkhvc3RUZXN0Q2FzZXMKKworaW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTQyL0FuZHJvaWRUZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTk0Mi9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU5MTNkMwotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTk0Mi9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIi8+CisgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJhcnQiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDE5NDJEZXZpY2VBcHAuYXBrIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5KYXJIb3N0VGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImphciIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDE5NDJIb3N0VGVzdENhc2VzLmphciIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJzZXQtb3B0aW9uIiB2YWx1ZT0idGVzdC1maWxlLW5hbWU6Q3RzSnZtdGlSdW5UZXN0MTk0MkRldmljZUFwcC5hcGsiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ic2V0LW9wdGlvbiIgdmFsdWU9InBhY2thZ2UtbmFtZTphbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTQyIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjhzIi8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTQyL2FwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTQyL2FwcC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZjZkMGUKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5NDIvYXBwL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKK0xPQ0FMX0RFWF9QUkVPUFQgOj0gZmFsc2UKK0xPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKK0xPQ0FMX1NSQ19GSUxFUyA6PQorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aURldmljZVJ1blRlc3RBcHBCYXNlCitMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdHNqdm10aWFnZW50CitMT0NBTF9NVUxUSUxJQiA6PSBib3RoCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CisKKyMgVE9ETzogUmVmYWN0b3IuIFRoaXMgaXMgdGhlIG9ubHkgdGhpbmcgZXZlcnkgY2hhbmdpbmcuCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzSnZtdGlSdW5UZXN0MTk0MkRldmljZUFwcAorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTk0Mi9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTk0Mi9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTIxMTEwCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTQyL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTQyIj4KKworICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmRlYnVnZ2FibGU9InRydWUiPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKyAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0X25yIiBhbmRyb2lkOnZhbHVlPSIxOTQyIiAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmp2bXRpLkp2bXRpQWN0aXZpdHkiID4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPCEtLSAgc2VsZi1pbnN0cnVtZW50aW5nIHRlc3QgcGFja2FnZS4gLS0+CisgICAgPGluc3RydW1lbnRhdGlvbgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIGZvciBKVk1USSIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTQyIiA+CisgICAgPC9pbnN0cnVtZW50YXRpb24+Cis8L21hbmlmZXN0PgorCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5NDIvamFyamFyLXJ1bGVzLnR4dCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTk0Mi9qYXJqYXItcnVsZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZTFlZGQKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5NDIvamFyamFyLXJ1bGVzLnR4dApAQCAtMCwwICsxIEBACitydWxlIGFuZHJvaWQuanZtdGkuY3RzLkp2bXRpSG9zdFRlc3QqKiBhbmRyb2lkLmp2bXRpLmN0cy5Kdm10aUhvc3RUZXN0MTk0MkAxCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5NDMvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTk0My9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5ZTQ0YWEKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5NDMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDIxIEBACisjIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEUgOj0gQ3RzSnZtdGlSdW5UZXN0MTk0M0hvc3RUZXN0Q2FzZXMKKworaW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTQzL0FuZHJvaWRUZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTk0My9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAzZDRkOQotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTk0My9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIi8+CisgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJhcnQiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDE5NDNEZXZpY2VBcHAuYXBrIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5KYXJIb3N0VGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImphciIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDE5NDNIb3N0VGVzdENhc2VzLmphciIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJzZXQtb3B0aW9uIiB2YWx1ZT0idGVzdC1maWxlLW5hbWU6Q3RzSnZtdGlSdW5UZXN0MTk0M0RldmljZUFwcC5hcGsiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ic2V0LW9wdGlvbiIgdmFsdWU9InBhY2thZ2UtbmFtZTphbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTQzIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjhzIi8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTQzL2FwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTQzL2FwcC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1M2I4OTQKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5NDMvYXBwL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKK0xPQ0FMX0RFWF9QUkVPUFQgOj0gZmFsc2UKK0xPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKK0xPQ0FMX1NSQ19GSUxFUyA6PQorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aURldmljZVJ1blRlc3RBcHBCYXNlCitMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdHNqdm10aWFnZW50CitMT0NBTF9NVUxUSUxJQiA6PSBib3RoCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CisKKyMgVE9ETzogUmVmYWN0b3IuIFRoaXMgaXMgdGhlIG9ubHkgdGhpbmcgZXZlcnkgY2hhbmdpbmcuCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzSnZtdGlSdW5UZXN0MTk0M0RldmljZUFwcAorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTk0My9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTk0My9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGMxMTgyCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC0xOTQzL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTQzIj4KKworICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmRlYnVnZ2FibGU9InRydWUiPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKyAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0X25yIiBhbmRyb2lkOnZhbHVlPSIxOTQzIiAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmp2bXRpLkp2bXRpQWN0aXZpdHkiID4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPCEtLSAgc2VsZi1pbnN0cnVtZW50aW5nIHRlc3QgcGFja2FnZS4gLS0+CisgICAgPGluc3RydW1lbnRhdGlvbgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIGZvciBKVk1USSIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF8xOTQzIiA+CisgICAgPC9pbnN0cnVtZW50YXRpb24+Cis8L21hbmlmZXN0PgorCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5NDMvamFyamFyLXJ1bGVzLnR4dCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtMTk0My9qYXJqYXItcnVsZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZmJhZDMKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTE5NDMvamFyamFyLXJ1bGVzLnR4dApAQCAtMCwwICsxIEBACitydWxlIGFuZHJvaWQuanZtdGkuY3RzLkp2bXRpSG9zdFRlc3QqKiBhbmRyb2lkLmp2bXRpLmN0cy5Kdm10aUhvc3RUZXN0MTk0M0AxCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkwMi9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MDIvQW5kcm9pZC5tawppbmRleCBlNDdhYjYyLi40NDY3OTI0IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkwMi9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTAyL0FuZHJvaWQubWsKQEAgLTE3LDExICsxNyw1IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfTU9EVUxFIDo9IEN0c0p2bXRpUnVuVGVzdDkwMkhvc3RUZXN0Q2FzZXMKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aUhvc3RUZXN0QmFzZQotTE9DQUxfSkFSSkFSX1JVTEVTIDo9ICQoTE9DQUxfUEFUSCkvamFyamFyLXJ1bGVzLnR4dAotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiAKLWluY2x1ZGUgJChCVUlMRF9IT1NUX0pBVkFfTElCUkFSWSkKLQotaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQoraW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MDIvQW5kcm9pZFRlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MDIvQW5kcm9pZFRlc3QueG1sCmluZGV4IDY5Y2Y3OTAuLjQyZTg2OTggMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTAyL0FuZHJvaWRUZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkwMi9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iYXJ0IiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkwMi9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTAyL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDZhMmVkZDYuLmIxNmJjZWIgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTAyL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTAyL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yNyw3ICsyNyw3IEBACiAKICAgICA8IS0tICBzZWxmLWluc3RydW1lbnRpbmcgdGVzdCBwYWNrYWdlLiAtLT4KICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBmb3IgSlZNVEkiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfOTAyIiA+CiAgICAgPC9pbnN0cnVtZW50YXRpb24+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkwMy9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MDMvQW5kcm9pZC5tawppbmRleCA3YmE2M2Q4Li43NDIwOGQwIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkwMy9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTAzL0FuZHJvaWQubWsKQEAgLTE3LDExICsxNyw1IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfTU9EVUxFIDo9IEN0c0p2bXRpUnVuVGVzdDkwM0hvc3RUZXN0Q2FzZXMKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aUhvc3RUZXN0QmFzZQotTE9DQUxfSkFSSkFSX1JVTEVTIDo9ICQoTE9DQUxfUEFUSCkvamFyamFyLXJ1bGVzLnR4dAotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiAKLWluY2x1ZGUgJChCVUlMRF9IT1NUX0pBVkFfTElCUkFSWSkKLQotaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQoraW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MDMvQW5kcm9pZFRlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MDMvQW5kcm9pZFRlc3QueG1sCmluZGV4IDNiZWM4YjEuLjRiMzNiMmQgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTAzL0FuZHJvaWRUZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkwMy9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iYXJ0IiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkwMy9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTAzL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDQ4MjNjOTkuLjhkYWJkZDAgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTAzL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTAzL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yNyw3ICsyNyw3IEBACiAKICAgICA8IS0tICBzZWxmLWluc3RydW1lbnRpbmcgdGVzdCBwYWNrYWdlLiAtLT4KICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBmb3IgSlZNVEkiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfOTAzIiA+CiAgICAgPC9pbnN0cnVtZW50YXRpb24+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkwNC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MDQvQW5kcm9pZC5tawppbmRleCBmYTlhOTRlLi5iZmJiZmEyIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkwNC9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTA0L0FuZHJvaWQubWsKQEAgLTE3LDExICsxNyw1IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfTU9EVUxFIDo9IEN0c0p2bXRpUnVuVGVzdDkwNEhvc3RUZXN0Q2FzZXMKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aUhvc3RUZXN0QmFzZQotTE9DQUxfSkFSSkFSX1JVTEVTIDo9ICQoTE9DQUxfUEFUSCkvamFyamFyLXJ1bGVzLnR4dAotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiAKLWluY2x1ZGUgJChCVUlMRF9IT1NUX0pBVkFfTElCUkFSWSkKLQotaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQoraW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MDQvQW5kcm9pZFRlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MDQvQW5kcm9pZFRlc3QueG1sCmluZGV4IDU3N2MyMDIuLjU3ZjYwMjcgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTA0L0FuZHJvaWRUZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkwNC9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iYXJ0IiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkwNC9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTA0L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDU5ZWY0MmMuLjU4NDQ4N2MgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTA0L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTA0L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yNyw3ICsyNyw3IEBACiAKICAgICA8IS0tICBzZWxmLWluc3RydW1lbnRpbmcgdGVzdCBwYWNrYWdlLiAtLT4KICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBmb3IgSlZNVEkiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfOTA0IiA+CiAgICAgPC9pbnN0cnVtZW50YXRpb24+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkwNS9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MDUvQW5kcm9pZC5tawppbmRleCA5NzY3OGJlLi5jZDkyMzRhIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkwNS9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTA1L0FuZHJvaWQubWsKQEAgLTE3LDExICsxNyw1IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfTU9EVUxFIDo9IEN0c0p2bXRpUnVuVGVzdDkwNUhvc3RUZXN0Q2FzZXMKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aUhvc3RUZXN0QmFzZQotTE9DQUxfSkFSSkFSX1JVTEVTIDo9ICQoTE9DQUxfUEFUSCkvamFyamFyLXJ1bGVzLnR4dAotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiAKLWluY2x1ZGUgJChCVUlMRF9IT1NUX0pBVkFfTElCUkFSWSkKLQotaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQoraW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MDUvQW5kcm9pZFRlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MDUvQW5kcm9pZFRlc3QueG1sCmluZGV4IDk2ZWYzNzcuLmEwZTJlMDUgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTA1L0FuZHJvaWRUZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkwNS9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iYXJ0IiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkwNS9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTA1L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDkwOTJiZjcuLjRlYWJkOTggMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTA1L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTA1L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yNyw3ICsyNyw3IEBACiAKICAgICA8IS0tICBzZWxmLWluc3RydW1lbnRpbmcgdGVzdCBwYWNrYWdlLiAtLT4KICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBmb3IgSlZNVEkiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfOTA1IiA+CiAgICAgPC9pbnN0cnVtZW50YXRpb24+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkwNi9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MDYvQW5kcm9pZC5tawppbmRleCA3YjZlMDYzLi5kOTEwNWNhIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkwNi9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTA2L0FuZHJvaWQubWsKQEAgLTE3LDExICsxNyw1IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfTU9EVUxFIDo9IEN0c0p2bXRpUnVuVGVzdDkwNkhvc3RUZXN0Q2FzZXMKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aUhvc3RUZXN0QmFzZQotTE9DQUxfSkFSSkFSX1JVTEVTIDo9ICQoTE9DQUxfUEFUSCkvamFyamFyLXJ1bGVzLnR4dAotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiAKLWluY2x1ZGUgJChCVUlMRF9IT1NUX0pBVkFfTElCUkFSWSkKLQotaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQoraW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MDYvQW5kcm9pZFRlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MDYvQW5kcm9pZFRlc3QueG1sCmluZGV4IDIxN2MxMjcuLjM4ZDJhYmUgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTA2L0FuZHJvaWRUZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkwNi9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iYXJ0IiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkwNi9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTA2L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGMwNmRjN2UuLmY2MjJiODYgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTA2L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTA2L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yNyw3ICsyNyw3IEBACiAKICAgICA8IS0tICBzZWxmLWluc3RydW1lbnRpbmcgdGVzdCBwYWNrYWdlLiAtLT4KICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBmb3IgSlZNVEkiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfOTA2IiA+CiAgICAgPC9pbnN0cnVtZW50YXRpb24+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkwNy9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MDcvQW5kcm9pZC5tawppbmRleCBhNjRkOTQwLi4xMmM2NmYyIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkwNy9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTA3L0FuZHJvaWQubWsKQEAgLTE3LDExICsxNyw1IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfTU9EVUxFIDo9IEN0c0p2bXRpUnVuVGVzdDkwN0hvc3RUZXN0Q2FzZXMKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aUhvc3RUZXN0QmFzZQotTE9DQUxfSkFSSkFSX1JVTEVTIDo9ICQoTE9DQUxfUEFUSCkvamFyamFyLXJ1bGVzLnR4dAotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiAKLWluY2x1ZGUgJChCVUlMRF9IT1NUX0pBVkFfTElCUkFSWSkKLQotaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQoraW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MDcvQW5kcm9pZFRlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MDcvQW5kcm9pZFRlc3QueG1sCmluZGV4IGY2NjYyYTkuLmFmNTg3ZjMgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTA3L0FuZHJvaWRUZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkwNy9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iYXJ0IiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkwNy9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTA3L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDBlOTYwMjkuLjliYjFhOGEgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTA3L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTA3L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yNyw3ICsyNyw3IEBACiAKICAgICA8IS0tICBzZWxmLWluc3RydW1lbnRpbmcgdGVzdCBwYWNrYWdlLiAtLT4KICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBmb3IgSlZNVEkiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfOTA3IiA+CiAgICAgPC9pbnN0cnVtZW50YXRpb24+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkwOC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MDgvQW5kcm9pZC5tawppbmRleCBhNGEzNzE2Li4yODc5ZGFmIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkwOC9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTA4L0FuZHJvaWQubWsKQEAgLTE3LDExICsxNyw1IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfTU9EVUxFIDo9IEN0c0p2bXRpUnVuVGVzdDkwOEhvc3RUZXN0Q2FzZXMKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aUhvc3RUZXN0QmFzZQotTE9DQUxfSkFSSkFSX1JVTEVTIDo9ICQoTE9DQUxfUEFUSCkvamFyamFyLXJ1bGVzLnR4dAotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiAKLWluY2x1ZGUgJChCVUlMRF9IT1NUX0pBVkFfTElCUkFSWSkKLQotaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQoraW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MDgvQW5kcm9pZFRlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MDgvQW5kcm9pZFRlc3QueG1sCmluZGV4IDk0Y2M1MTkuLmMyZmViMWEgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTA4L0FuZHJvaWRUZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkwOC9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iYXJ0IiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkwOC9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTA4L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDJkZGRiNjUuLmNiMzY2MGQgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTA4L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTA4L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yNyw3ICsyNyw3IEBACiAKICAgICA8IS0tICBzZWxmLWluc3RydW1lbnRpbmcgdGVzdCBwYWNrYWdlLiAtLT4KICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBmb3IgSlZNVEkiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfOTA4IiA+CiAgICAgPC9pbnN0cnVtZW50YXRpb24+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkxMC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MTAvQW5kcm9pZC5tawppbmRleCBkYzkxM2RkLi44NTMzNGIzIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkxMC9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTEwL0FuZHJvaWQubWsKQEAgLTE3LDExICsxNyw1IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfTU9EVUxFIDo9IEN0c0p2bXRpUnVuVGVzdDkxMEhvc3RUZXN0Q2FzZXMKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aUhvc3RUZXN0QmFzZQotTE9DQUxfSkFSSkFSX1JVTEVTIDo9ICQoTE9DQUxfUEFUSCkvamFyamFyLXJ1bGVzLnR4dAotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiAKLWluY2x1ZGUgJChCVUlMRF9IT1NUX0pBVkFfTElCUkFSWSkKLQotaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQoraW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MTAvQW5kcm9pZFRlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MTAvQW5kcm9pZFRlc3QueG1sCmluZGV4IGVmZWZkZjYuLjMyZjEzNWYgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTEwL0FuZHJvaWRUZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkxMC9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iYXJ0IiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkxMC9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTEwL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDZmYmJiMjkuLmIwMjE1YjUgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTEwL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTEwL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yNyw3ICsyNyw3IEBACiAKICAgICA8IS0tICBzZWxmLWluc3RydW1lbnRpbmcgdGVzdCBwYWNrYWdlLiAtLT4KICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBmb3IgSlZNVEkiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfOTEwIiA+CiAgICAgPC9pbnN0cnVtZW50YXRpb24+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkxMS9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MTEvQW5kcm9pZC5tawppbmRleCAxMGQxNWZkLi40NDVmYWIwIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkxMS9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTExL0FuZHJvaWQubWsKQEAgLTE3LDExICsxNyw1IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfTU9EVUxFIDo9IEN0c0p2bXRpUnVuVGVzdDkxMUhvc3RUZXN0Q2FzZXMKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aUhvc3RUZXN0QmFzZQotTE9DQUxfSkFSSkFSX1JVTEVTIDo9ICQoTE9DQUxfUEFUSCkvamFyamFyLXJ1bGVzLnR4dAotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiAKLWluY2x1ZGUgJChCVUlMRF9IT1NUX0pBVkFfTElCUkFSWSkKLQotaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQoraW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MTEvQW5kcm9pZFRlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MTEvQW5kcm9pZFRlc3QueG1sCmluZGV4IGM2YTQ1NjUuLjE4MzI2NjIgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTExL0FuZHJvaWRUZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkxMS9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iYXJ0IiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkxMS9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTExL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDEyODRiMjUuLmEzNmIyYjcgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTExL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTExL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yNyw3ICsyNyw3IEBACiAKICAgICA8IS0tICBzZWxmLWluc3RydW1lbnRpbmcgdGVzdCBwYWNrYWdlLiAtLT4KICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBmb3IgSlZNVEkiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfOTExIiA+CiAgICAgPC9pbnN0cnVtZW50YXRpb24+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkxMi9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MTIvQW5kcm9pZC5tawppbmRleCA2ZWMyMmQ3Li5hYTY5YTc1IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkxMi9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTEyL0FuZHJvaWQubWsKQEAgLTE3LDExICsxNyw1IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfTU9EVUxFIDo9IEN0c0p2bXRpUnVuVGVzdDkxMkhvc3RUZXN0Q2FzZXMKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aUhvc3RUZXN0QmFzZQotTE9DQUxfSkFSSkFSX1JVTEVTIDo9ICQoTE9DQUxfUEFUSCkvamFyamFyLXJ1bGVzLnR4dAotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiAKLWluY2x1ZGUgJChCVUlMRF9IT1NUX0pBVkFfTElCUkFSWSkKLQotaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQoraW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MTIvQW5kcm9pZFRlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MTIvQW5kcm9pZFRlc3QueG1sCmluZGV4IDdjYjgyZjAuLjRiYTQ4NmUgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTEyL0FuZHJvaWRUZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkxMi9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iYXJ0IiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkxMi9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTEyL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGQ2ODk2OTIuLjM1OGNkNjQgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTEyL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTEyL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yNyw3ICsyNyw3IEBACiAKICAgICA8IS0tICBzZWxmLWluc3RydW1lbnRpbmcgdGVzdCBwYWNrYWdlLiAtLT4KICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBmb3IgSlZNVEkiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfOTEyIiA+CiAgICAgPC9pbnN0cnVtZW50YXRpb24+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkxMy9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MTMvQW5kcm9pZC5tawppbmRleCBkNTQ5ODVkLi4zYzg3YTIyIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkxMy9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTEzL0FuZHJvaWQubWsKQEAgLTE3LDExICsxNyw1IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfTU9EVUxFIDo9IEN0c0p2bXRpUnVuVGVzdDkxM0hvc3RUZXN0Q2FzZXMKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aUhvc3RUZXN0QmFzZQotTE9DQUxfSkFSSkFSX1JVTEVTIDo9ICQoTE9DQUxfUEFUSCkvamFyamFyLXJ1bGVzLnR4dAotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiAKLWluY2x1ZGUgJChCVUlMRF9IT1NUX0pBVkFfTElCUkFSWSkKLQotaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQoraW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MTMvQW5kcm9pZFRlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MTMvQW5kcm9pZFRlc3QueG1sCmluZGV4IDdkZmYyY2YuLmEyNGE5MjcgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTEzL0FuZHJvaWRUZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkxMy9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iYXJ0IiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkxMy9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTEzL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGJkMTgzYjguLjU2NDliYjIgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTEzL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTEzL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yNyw3ICsyNyw3IEBACiAKICAgICA8IS0tICBzZWxmLWluc3RydW1lbnRpbmcgdGVzdCBwYWNrYWdlLiAtLT4KICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBmb3IgSlZNVEkiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfOTEzIiA+CiAgICAgPC9pbnN0cnVtZW50YXRpb24+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkxNC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MTQvQW5kcm9pZC5tawppbmRleCA1MWIxMDIyLi43NzMyY2IxIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkxNC9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTE0L0FuZHJvaWQubWsKQEAgLTE3LDExICsxNyw1IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfTU9EVUxFIDo9IEN0c0p2bXRpUnVuVGVzdDkxNEhvc3RUZXN0Q2FzZXMKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aUhvc3RUZXN0QmFzZQotTE9DQUxfSkFSSkFSX1JVTEVTIDo9ICQoTE9DQUxfUEFUSCkvamFyamFyLXJ1bGVzLnR4dAotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiAKLWluY2x1ZGUgJChCVUlMRF9IT1NUX0pBVkFfTElCUkFSWSkKLQotaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQoraW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MTQvQW5kcm9pZFRlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MTQvQW5kcm9pZFRlc3QueG1sCmluZGV4IGY2Y2ExZTcuLmVmYmMzOTIgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTE0L0FuZHJvaWRUZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkxNC9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iYXJ0IiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkxNC9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTE0L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDVkNjg2OWMuLjJjOTQ4OWYgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTE0L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTE0L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yNyw3ICsyNyw3IEBACiAKICAgICA8IS0tICBzZWxmLWluc3RydW1lbnRpbmcgdGVzdCBwYWNrYWdlLiAtLT4KICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBmb3IgSlZNVEkiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfOTE0IiA+CiAgICAgPC9pbnN0cnVtZW50YXRpb24+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkxNS9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MTUvQW5kcm9pZC5tawppbmRleCA5NjFjNGNjLi4zODQ4ODRhIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkxNS9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTE1L0FuZHJvaWQubWsKQEAgLTE3LDExICsxNyw1IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfTU9EVUxFIDo9IEN0c0p2bXRpUnVuVGVzdDkxNUhvc3RUZXN0Q2FzZXMKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aUhvc3RUZXN0QmFzZQotTE9DQUxfSkFSSkFSX1JVTEVTIDo9ICQoTE9DQUxfUEFUSCkvamFyamFyLXJ1bGVzLnR4dAotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiAKLWluY2x1ZGUgJChCVUlMRF9IT1NUX0pBVkFfTElCUkFSWSkKLQotaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQoraW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MTUvQW5kcm9pZFRlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MTUvQW5kcm9pZFRlc3QueG1sCmluZGV4IGI4ZTAzYmYuLjAyMjM5ZDcgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTE1L0FuZHJvaWRUZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkxNS9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iYXJ0IiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkxNS9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTE1L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDEyYzQxN2UuLjgyMzY3OGYgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTE1L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTE1L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yNyw3ICsyNyw3IEBACiAKICAgICA8IS0tICBzZWxmLWluc3RydW1lbnRpbmcgdGVzdCBwYWNrYWdlLiAtLT4KICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBmb3IgSlZNVEkiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfOTE1IiA+CiAgICAgPC9pbnN0cnVtZW50YXRpb24+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkxNy9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MTcvQW5kcm9pZC5tawppbmRleCA4Y2Y3M2ZjLi5lYmY2MGY1IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkxNy9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTE3L0FuZHJvaWQubWsKQEAgLTE3LDExICsxNyw1IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfTU9EVUxFIDo9IEN0c0p2bXRpUnVuVGVzdDkxN0hvc3RUZXN0Q2FzZXMKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aUhvc3RUZXN0QmFzZQotTE9DQUxfSkFSSkFSX1JVTEVTIDo9ICQoTE9DQUxfUEFUSCkvamFyamFyLXJ1bGVzLnR4dAotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiAKLWluY2x1ZGUgJChCVUlMRF9IT1NUX0pBVkFfTElCUkFSWSkKLQotaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQoraW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MTcvQW5kcm9pZFRlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MTcvQW5kcm9pZFRlc3QueG1sCmluZGV4IDAwOThhZWYuLjU3MjZlMTAgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTE3L0FuZHJvaWRUZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkxNy9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iYXJ0IiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkxNy9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTE3L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDExNGFhNGMuLjQwZGY4MzQgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTE3L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTE3L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yNyw3ICsyNyw3IEBACiAKICAgICA8IS0tICBzZWxmLWluc3RydW1lbnRpbmcgdGVzdCBwYWNrYWdlLiAtLT4KICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBmb3IgSlZNVEkiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfOTE3IiA+CiAgICAgPC9pbnN0cnVtZW50YXRpb24+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkxOC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MTgvQW5kcm9pZC5tawppbmRleCA0OTdmODZjLi5mNmJhNTYzIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkxOC9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTE4L0FuZHJvaWQubWsKQEAgLTE3LDExICsxNyw1IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfTU9EVUxFIDo9IEN0c0p2bXRpUnVuVGVzdDkxOEhvc3RUZXN0Q2FzZXMKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aUhvc3RUZXN0QmFzZQotTE9DQUxfSkFSSkFSX1JVTEVTIDo9ICQoTE9DQUxfUEFUSCkvamFyamFyLXJ1bGVzLnR4dAotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiAKLWluY2x1ZGUgJChCVUlMRF9IT1NUX0pBVkFfTElCUkFSWSkKLQotaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQoraW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MTgvQW5kcm9pZFRlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MTgvQW5kcm9pZFRlc3QueG1sCmluZGV4IDc4ZjA5MjcuLjdkOWI3MmEgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTE4L0FuZHJvaWRUZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkxOC9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iYXJ0IiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkxOC9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTE4L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDk2Y2U4YWEuLjAxMDlkZTMgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTE4L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTE4L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yNyw3ICsyNyw3IEBACiAKICAgICA8IS0tICBzZWxmLWluc3RydW1lbnRpbmcgdGVzdCBwYWNrYWdlLiAtLT4KICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBmb3IgSlZNVEkiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfOTE4IiA+CiAgICAgPC9pbnN0cnVtZW50YXRpb24+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkxOS9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MTkvQW5kcm9pZC5tawppbmRleCA2NDBmM2Q2Li5iMTRhYjkxIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkxOS9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTE5L0FuZHJvaWQubWsKQEAgLTE3LDExICsxNyw1IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfTU9EVUxFIDo9IEN0c0p2bXRpUnVuVGVzdDkxOUhvc3RUZXN0Q2FzZXMKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aUhvc3RUZXN0QmFzZQotTE9DQUxfSkFSSkFSX1JVTEVTIDo9ICQoTE9DQUxfUEFUSCkvamFyamFyLXJ1bGVzLnR4dAotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiAKLWluY2x1ZGUgJChCVUlMRF9IT1NUX0pBVkFfTElCUkFSWSkKLQotaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQoraW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MTkvQW5kcm9pZFRlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MTkvQW5kcm9pZFRlc3QueG1sCmluZGV4IGQyM2MzZmMuLmViMjIxOTEgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTE5L0FuZHJvaWRUZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkxOS9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iYXJ0IiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkxOS9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTE5L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDdjZTA0MjQuLjlkZTFiMmYgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTE5L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTE5L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yNyw3ICsyNyw3IEBACiAKICAgICA8IS0tICBzZWxmLWluc3RydW1lbnRpbmcgdGVzdCBwYWNrYWdlLiAtLT4KICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBmb3IgSlZNVEkiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfOTE5IiA+CiAgICAgPC9pbnN0cnVtZW50YXRpb24+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkyMC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MjAvQW5kcm9pZC5tawppbmRleCAzMDI5NzQyLi44MGRkYWE4IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkyMC9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTIwL0FuZHJvaWQubWsKQEAgLTE3LDExICsxNyw1IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfTU9EVUxFIDo9IEN0c0p2bXRpUnVuVGVzdDkyMEhvc3RUZXN0Q2FzZXMKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aUhvc3RUZXN0QmFzZQotTE9DQUxfSkFSSkFSX1JVTEVTIDo9ICQoTE9DQUxfUEFUSCkvamFyamFyLXJ1bGVzLnR4dAotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiAKLWluY2x1ZGUgJChCVUlMRF9IT1NUX0pBVkFfTElCUkFSWSkKLQotaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQoraW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MjAvQW5kcm9pZFRlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MjAvQW5kcm9pZFRlc3QueG1sCmluZGV4IGZmNTc0Y2MuLjljNmQwOWIgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTIwL0FuZHJvaWRUZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkyMC9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iYXJ0IiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkyMC9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTIwL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDFjODUxMDQuLjZlYTZhZWUgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTIwL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTIwL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yNyw3ICsyNyw3IEBACiAKICAgICA8IS0tICBzZWxmLWluc3RydW1lbnRpbmcgdGVzdCBwYWNrYWdlLiAtLT4KICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBmb3IgSlZNVEkiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfOTIwIiA+CiAgICAgPC9pbnN0cnVtZW50YXRpb24+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkyMi9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MjIvQW5kcm9pZC5tawppbmRleCBiZjEwMzQxLi5kODRiODMyIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkyMi9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTIyL0FuZHJvaWQubWsKQEAgLTE3LDExICsxNyw1IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfTU9EVUxFIDo9IEN0c0p2bXRpUnVuVGVzdDkyMkhvc3RUZXN0Q2FzZXMKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aUhvc3RUZXN0QmFzZQotTE9DQUxfSkFSSkFSX1JVTEVTIDo9ICQoTE9DQUxfUEFUSCkvamFyamFyLXJ1bGVzLnR4dAotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiAKLWluY2x1ZGUgJChCVUlMRF9IT1NUX0pBVkFfTElCUkFSWSkKLQotaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQoraW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MjIvQW5kcm9pZFRlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MjIvQW5kcm9pZFRlc3QueG1sCmluZGV4IDZjOWY3ZGMuLmMyZTIxZjEgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTIyL0FuZHJvaWRUZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkyMi9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iYXJ0IiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkyMi9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTIyL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDk4NTM1MmQuLjJhZGE2YjYgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTIyL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTIyL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yNyw3ICsyNyw3IEBACiAKICAgICA8IS0tICBzZWxmLWluc3RydW1lbnRpbmcgdGVzdCBwYWNrYWdlLiAtLT4KICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBmb3IgSlZNVEkiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfOTIyIiA+CiAgICAgPC9pbnN0cnVtZW50YXRpb24+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkyMy9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MjMvQW5kcm9pZC5tawppbmRleCBmZDJkNmY4Li5kN2Y5ZjA5IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkyMy9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTIzL0FuZHJvaWQubWsKQEAgLTE3LDExICsxNyw1IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfTU9EVUxFIDo9IEN0c0p2bXRpUnVuVGVzdDkyM0hvc3RUZXN0Q2FzZXMKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aUhvc3RUZXN0QmFzZQotTE9DQUxfSkFSSkFSX1JVTEVTIDo9ICQoTE9DQUxfUEFUSCkvamFyamFyLXJ1bGVzLnR4dAotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiAKLWluY2x1ZGUgJChCVUlMRF9IT1NUX0pBVkFfTElCUkFSWSkKLQotaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQoraW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MjMvQW5kcm9pZFRlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MjMvQW5kcm9pZFRlc3QueG1sCmluZGV4IGNhZTYzMDEuLmY5YzU4NmEgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTIzL0FuZHJvaWRUZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkyMy9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iYXJ0IiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkyMy9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTIzL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDNjOGJjZWQuLjE5ZmYwYWUgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTIzL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTIzL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yNyw3ICsyNyw3IEBACiAKICAgICA8IS0tICBzZWxmLWluc3RydW1lbnRpbmcgdGVzdCBwYWNrYWdlLiAtLT4KICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBmb3IgSlZNVEkiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfOTIzIiA+CiAgICAgPC9pbnN0cnVtZW50YXRpb24+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkyNC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MjQvQW5kcm9pZC5tawppbmRleCA0YjkxN2Q4Li43ZTcxNjA3IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkyNC9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTI0L0FuZHJvaWQubWsKQEAgLTE3LDExICsxNyw1IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfTU9EVUxFIDo9IEN0c0p2bXRpUnVuVGVzdDkyNEhvc3RUZXN0Q2FzZXMKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aUhvc3RUZXN0QmFzZQotTE9DQUxfSkFSSkFSX1JVTEVTIDo9ICQoTE9DQUxfUEFUSCkvamFyamFyLXJ1bGVzLnR4dAotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiAKLWluY2x1ZGUgJChCVUlMRF9IT1NUX0pBVkFfTElCUkFSWSkKLQotaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQoraW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MjQvQW5kcm9pZFRlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MjQvQW5kcm9pZFRlc3QueG1sCmluZGV4IDM1YmVhNjcuLmZhMzU1ZjIgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTI0L0FuZHJvaWRUZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkyNC9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iYXJ0IiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkyNC9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTI0L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGJjYzc0YzMuLmQzYjZmMGQgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTI0L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTI0L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yNyw3ICsyNyw3IEBACiAKICAgICA8IS0tICBzZWxmLWluc3RydW1lbnRpbmcgdGVzdCBwYWNrYWdlLiAtLT4KICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBmb3IgSlZNVEkiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfOTI0IiA+CiAgICAgPC9pbnN0cnVtZW50YXRpb24+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkyNi9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MjYvQW5kcm9pZC5tawppbmRleCA5ZTBmZmUxLi5kMTFmM2YzIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkyNi9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTI2L0FuZHJvaWQubWsKQEAgLTE3LDExICsxNyw1IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfTU9EVUxFIDo9IEN0c0p2bXRpUnVuVGVzdDkyNkhvc3RUZXN0Q2FzZXMKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aUhvc3RUZXN0QmFzZQotTE9DQUxfSkFSSkFSX1JVTEVTIDo9ICQoTE9DQUxfUEFUSCkvamFyamFyLXJ1bGVzLnR4dAotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiAKLWluY2x1ZGUgJChCVUlMRF9IT1NUX0pBVkFfTElCUkFSWSkKLQotaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQoraW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MjYvQW5kcm9pZFRlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MjYvQW5kcm9pZFRlc3QueG1sCmluZGV4IGVhMzBhZjEuLmE1MGE1MWQgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTI2L0FuZHJvaWRUZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkyNi9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iYXJ0IiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkyNi9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTI2L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGIyYTg1NWEuLjhhMmNjNjAgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTI2L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTI2L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yNyw3ICsyNyw3IEBACiAKICAgICA8IS0tICBzZWxmLWluc3RydW1lbnRpbmcgdGVzdCBwYWNrYWdlLiAtLT4KICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBmb3IgSlZNVEkiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfOTI2IiA+CiAgICAgPC9pbnN0cnVtZW50YXRpb24+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkyNy9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MjcvQW5kcm9pZC5tawppbmRleCAzMzcxODk2Li44MzlhYjg2IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkyNy9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTI3L0FuZHJvaWQubWsKQEAgLTE3LDExICsxNyw1IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfTU9EVUxFIDo9IEN0c0p2bXRpUnVuVGVzdDkyN0hvc3RUZXN0Q2FzZXMKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aUhvc3RUZXN0QmFzZQotTE9DQUxfSkFSSkFSX1JVTEVTIDo9ICQoTE9DQUxfUEFUSCkvamFyamFyLXJ1bGVzLnR4dAotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiAKLWluY2x1ZGUgJChCVUlMRF9IT1NUX0pBVkFfTElCUkFSWSkKLQotaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQoraW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MjcvQW5kcm9pZFRlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MjcvQW5kcm9pZFRlc3QueG1sCmluZGV4IGYwOTA4MmEuLjVjMDJmMDcgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTI3L0FuZHJvaWRUZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkyNy9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iYXJ0IiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkyNy9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTI3L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDk2NjAxNGEuLmU4YmVkYTMgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTI3L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTI3L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yNyw3ICsyNyw3IEBACiAKICAgICA8IS0tICBzZWxmLWluc3RydW1lbnRpbmcgdGVzdCBwYWNrYWdlLiAtLT4KICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBmb3IgSlZNVEkiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfOTI3IiA+CiAgICAgPC9pbnN0cnVtZW50YXRpb24+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkyOC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MjgvQW5kcm9pZC5tawppbmRleCAzYjBlNjBjLi4zMGVjN2I1IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkyOC9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTI4L0FuZHJvaWQubWsKQEAgLTE3LDExICsxNyw1IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfTU9EVUxFIDo9IEN0c0p2bXRpUnVuVGVzdDkyOEhvc3RUZXN0Q2FzZXMKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aUhvc3RUZXN0QmFzZQotTE9DQUxfSkFSSkFSX1JVTEVTIDo9ICQoTE9DQUxfUEFUSCkvamFyamFyLXJ1bGVzLnR4dAotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiAKLWluY2x1ZGUgJChCVUlMRF9IT1NUX0pBVkFfTElCUkFSWSkKLQotaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQoraW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MjgvQW5kcm9pZFRlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MjgvQW5kcm9pZFRlc3QueG1sCmluZGV4IDc3NTVlYTAuLmJmNmYwMmMgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTI4L0FuZHJvaWRUZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkyOC9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iYXJ0IiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkyOC9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTI4L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDFhNGQyNWIuLmY2YjBjN2QgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTI4L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTI4L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yNyw3ICsyNyw3IEBACiAKICAgICA8IS0tICBzZWxmLWluc3RydW1lbnRpbmcgdGVzdCBwYWNrYWdlLiAtLT4KICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBmb3IgSlZNVEkiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfOTI4IiA+CiAgICAgPC9pbnN0cnVtZW50YXRpb24+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkzMC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MzAvQW5kcm9pZC5tawppbmRleCAzYjdkZGY3Li43M2U2YmE1ZCAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MzAvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkzMC9BbmRyb2lkLm1rCkBAIC0xNywxMSArMTcsNSBAQAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKIExPQ0FMX01PRFVMRSA6PSBDdHNKdm10aVJ1blRlc3Q5MzBIb3N0VGVzdENhc2VzCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gQ3RzSnZtdGlIb3N0VGVzdEJhc2UKLUxPQ0FMX0pBUkpBUl9SVUxFUyA6PSAkKExPQ0FMX1BBVEgpL2phcmphci1ydWxlcy50eHQKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cwogCi1pbmNsdWRlICQoQlVJTERfSE9TVF9KQVZBX0xJQlJBUlkpCi0KLWluY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKK2luY2x1ZGUgJChMT0NBTF9QQVRIKS8uLi8uLi9ob3N0X3NpZGUubWsKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTMwL0FuZHJvaWRUZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTMwL0FuZHJvaWRUZXN0LnhtbAppbmRleCBjMmI4NzQ1Li4yNTk5ZWE1IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkzMC9BbmRyb2lkVGVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MzAvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgSlZNVEkgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImFydCIgLz4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MzAvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkzMC9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA1MDU0NDhmLi5kYjE5NWMyIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkzMC9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkzMC9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjcsNyArMjcsNyBAQAogCiAgICAgPCEtLSAgc2VsZi1pbnN0cnVtZW50aW5nIHRlc3QgcGFja2FnZS4gLS0+CiAgICAgPGluc3RydW1lbnRhdGlvbgotICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgdGVzdHMgZm9yIEpWTVRJIgogICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0XzkzMCIgPgogICAgIDwvaW5zdHJ1bWVudGF0aW9uPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MzEvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTMxL0FuZHJvaWQubWsKaW5kZXggOGYyY2VjOS4uM2MyMTc1ZCAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MzEvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkzMS9BbmRyb2lkLm1rCkBAIC0xNywxMSArMTcsNSBAQAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKIExPQ0FMX01PRFVMRSA6PSBDdHNKdm10aVJ1blRlc3Q5MzFIb3N0VGVzdENhc2VzCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gQ3RzSnZtdGlIb3N0VGVzdEJhc2UKLUxPQ0FMX0pBUkpBUl9SVUxFUyA6PSAkKExPQ0FMX1BBVEgpL2phcmphci1ydWxlcy50eHQKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cwogCi1pbmNsdWRlICQoQlVJTERfSE9TVF9KQVZBX0xJQlJBUlkpCi0KLWluY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKK2luY2x1ZGUgJChMT0NBTF9QQVRIKS8uLi8uLi9ob3N0X3NpZGUubWsKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTMxL0FuZHJvaWRUZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTMxL0FuZHJvaWRUZXN0LnhtbAppbmRleCAzNDljYzgwLi4yZjhhMTVkIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkzMS9BbmRyb2lkVGVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MzEvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgSlZNVEkgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImFydCIgLz4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MzEvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkzMS9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA3MTBlMjA4Li45OTAzY2VjIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkzMS9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkzMS9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjcsNyArMjcsNyBAQAogCiAgICAgPCEtLSAgc2VsZi1pbnN0cnVtZW50aW5nIHRlc3QgcGFja2FnZS4gLS0+CiAgICAgPGluc3RydW1lbnRhdGlvbgotICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgdGVzdHMgZm9yIEpWTVRJIgogICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0XzkzMSIgPgogICAgIDwvaW5zdHJ1bWVudGF0aW9uPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MzIvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTMyL0FuZHJvaWQubWsKaW5kZXggNGU2NTVmNS4uMzc3MzI3OSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MzIvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkzMi9BbmRyb2lkLm1rCkBAIC0xNywxMSArMTcsNSBAQAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKIExPQ0FMX01PRFVMRSA6PSBDdHNKdm10aVJ1blRlc3Q5MzJIb3N0VGVzdENhc2VzCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gQ3RzSnZtdGlIb3N0VGVzdEJhc2UKLUxPQ0FMX0pBUkpBUl9SVUxFUyA6PSAkKExPQ0FMX1BBVEgpL2phcmphci1ydWxlcy50eHQKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cwogCi1pbmNsdWRlICQoQlVJTERfSE9TVF9KQVZBX0xJQlJBUlkpCi0KLWluY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKK2luY2x1ZGUgJChMT0NBTF9QQVRIKS8uLi8uLi9ob3N0X3NpZGUubWsKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTMyL0FuZHJvaWRUZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTMyL0FuZHJvaWRUZXN0LnhtbAppbmRleCBjNjkxYjQwLi5hYTJiOWRiIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkzMi9BbmRyb2lkVGVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MzIvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgSlZNVEkgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImFydCIgLz4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05MzIvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkzMi9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA2YzRhZmZkLi45YWJjMDhlIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkzMi9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTkzMi9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjcsNyArMjcsNyBAQAogCiAgICAgPCEtLSAgc2VsZi1pbnN0cnVtZW50aW5nIHRlc3QgcGFja2FnZS4gLS0+CiAgICAgPGluc3RydW1lbnRhdGlvbgotICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgdGVzdHMgZm9yIEpWTVRJIgogICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0XzkzMiIgPgogICAgIDwvaW5zdHJ1bWVudGF0aW9uPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05NDAvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTQwL0FuZHJvaWQubWsKaW5kZXggOTlmYzZhZS4uMzcyZWUwZCAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05NDAvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk0MC9BbmRyb2lkLm1rCkBAIC0xNywxMSArMTcsNSBAQAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKIExPQ0FMX01PRFVMRSA6PSBDdHNKdm10aVJ1blRlc3Q5NDBIb3N0VGVzdENhc2VzCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gQ3RzSnZtdGlIb3N0VGVzdEJhc2UKLUxPQ0FMX0pBUkpBUl9SVUxFUyA6PSAkKExPQ0FMX1BBVEgpL2phcmphci1ydWxlcy50eHQKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cwogCi1pbmNsdWRlICQoQlVJTERfSE9TVF9KQVZBX0xJQlJBUlkpCi0KLWluY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKK2luY2x1ZGUgJChMT0NBTF9QQVRIKS8uLi8uLi9ob3N0X3NpZGUubWsKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTQwL0FuZHJvaWRUZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTQwL0FuZHJvaWRUZXN0LnhtbAppbmRleCBmZThmNmRmLi4yZjM1Y2U3IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk0MC9BbmRyb2lkVGVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05NDAvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgSlZNVEkgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImFydCIgLz4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05NDAvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk0MC9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCAyMjdlMDU4Li43ZDI0ZjU4IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk0MC9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk0MC9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjcsNyArMjcsNyBAQAogCiAgICAgPCEtLSAgc2VsZi1pbnN0cnVtZW50aW5nIHRlc3QgcGFja2FnZS4gLS0+CiAgICAgPGluc3RydW1lbnRhdGlvbgotICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgdGVzdHMgZm9yIEpWTVRJIgogICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0Xzk0MCIgPgogICAgIDwvaW5zdHJ1bWVudGF0aW9uPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05NDIvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTQyL0FuZHJvaWQubWsKaW5kZXggNjhkODM5Yi4uOWE5NDA3YSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05NDIvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk0Mi9BbmRyb2lkLm1rCkBAIC0xNywxMSArMTcsNSBAQAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKIExPQ0FMX01PRFVMRSA6PSBDdHNKdm10aVJ1blRlc3Q5NDJIb3N0VGVzdENhc2VzCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gQ3RzSnZtdGlIb3N0VGVzdEJhc2UKLUxPQ0FMX0pBUkpBUl9SVUxFUyA6PSAkKExPQ0FMX1BBVEgpL2phcmphci1ydWxlcy50eHQKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cwogCi1pbmNsdWRlICQoQlVJTERfSE9TVF9KQVZBX0xJQlJBUlkpCi0KLWluY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKK2luY2x1ZGUgJChMT0NBTF9QQVRIKS8uLi8uLi9ob3N0X3NpZGUubWsKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTQyL0FuZHJvaWRUZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTQyL0FuZHJvaWRUZXN0LnhtbAppbmRleCBmMjAwNDQxLi5iYWQ3NzEwIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk0Mi9BbmRyb2lkVGVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05NDIvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgSlZNVEkgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImFydCIgLz4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05NDIvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk0Mi9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBjNDAxNzFmLi43MDg3NzRjIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk0Mi9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk0Mi9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjcsNyArMjcsNyBAQAogCiAgICAgPCEtLSAgc2VsZi1pbnN0cnVtZW50aW5nIHRlc3QgcGFja2FnZS4gLS0+CiAgICAgPGluc3RydW1lbnRhdGlvbgotICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgdGVzdHMgZm9yIEpWTVRJIgogICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0Xzk0MiIgPgogICAgIDwvaW5zdHJ1bWVudGF0aW9uPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05NDQvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTQ0L0FuZHJvaWQubWsKaW5kZXggYmNjMjA0Ni4uYzYwZDJlMiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05NDQvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk0NC9BbmRyb2lkLm1rCkBAIC0xNywxMSArMTcsNSBAQAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKIExPQ0FMX01PRFVMRSA6PSBDdHNKdm10aVJ1blRlc3Q5NDRIb3N0VGVzdENhc2VzCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gQ3RzSnZtdGlIb3N0VGVzdEJhc2UKLUxPQ0FMX0pBUkpBUl9SVUxFUyA6PSAkKExPQ0FMX1BBVEgpL2phcmphci1ydWxlcy50eHQKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cwogCi1pbmNsdWRlICQoQlVJTERfSE9TVF9KQVZBX0xJQlJBUlkpCi0KLWluY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKK2luY2x1ZGUgJChMT0NBTF9QQVRIKS8uLi8uLi9ob3N0X3NpZGUubWsKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTQ0L0FuZHJvaWRUZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTQ0L0FuZHJvaWRUZXN0LnhtbAppbmRleCA5N2E2OWNkLi5kMTNkYmM5IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk0NC9BbmRyb2lkVGVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05NDQvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgSlZNVEkgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImFydCIgLz4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05NDQvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk0NC9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCAyNDkyMjM3Li4zYWVmYWZhIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk0NC9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk0NC9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjcsNyArMjcsNyBAQAogCiAgICAgPCEtLSAgc2VsZi1pbnN0cnVtZW50aW5nIHRlc3QgcGFja2FnZS4gLS0+CiAgICAgPGluc3RydW1lbnRhdGlvbgotICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgdGVzdHMgZm9yIEpWTVRJIgogICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0Xzk0NCIgPgogICAgIDwvaW5zdHJ1bWVudGF0aW9uPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05NDUvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTQ1L0FuZHJvaWQubWsKaW5kZXggYjA2ZDFmOS4uNDMzZDlhYzYgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTQ1L0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05NDUvQW5kcm9pZC5tawpAQCAtMTcsMTEgKzE3LDUgQEAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCiBMT0NBTF9NT0RVTEUgOj0gQ3RzSnZtdGlSdW5UZXN0OTQ1SG9zdFRlc3RDYXNlcwotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IEN0c0p2bXRpSG9zdFRlc3RCYXNlCi1MT0NBTF9KQVJKQVJfUlVMRVMgOj0gJChMT0NBTF9QQVRIKS9qYXJqYXItcnVsZXMudHh0Ci1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKIAotaW5jbHVkZSAkKEJVSUxEX0hPU1RfSkFWQV9MSUJSQVJZKQotCi1pbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCitpbmNsdWRlICQoTE9DQUxfUEFUSCkvLi4vLi4vaG9zdF9zaWRlLm1rCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk0NS9BbmRyb2lkVGVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk0NS9BbmRyb2lkVGVzdC54bWwKaW5kZXggM2M3NjY3NC4uZGM3MjU0YSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05NDUvQW5kcm9pZFRlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTQ1L0FuZHJvaWRUZXN0LnhtbApAQCAtMTQsNiArMTQsNyBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIEpWTVRJIHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJhcnQiIC8+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CiAgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTQ1L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05NDUvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggYmZlNWYyNC4uYWJmNGU1YiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05NDUvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05NDUvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTI3LDcgKzI3LDcgQEAKIAogICAgIDwhLS0gIHNlbGYtaW5zdHJ1bWVudGluZyB0ZXN0IHBhY2thZ2UuIC0tPgogICAgIDxpbnN0cnVtZW50YXRpb24KLSAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIGZvciBKVk1USSIKICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF85NDUiID4KICAgICA8L2luc3RydW1lbnRhdGlvbj4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTQ3L0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk0Ny9BbmRyb2lkLm1rCmluZGV4IDIyNThhNGIuLjAyMDE4MTYgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTQ3L0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05NDcvQW5kcm9pZC5tawpAQCAtMTcsMTEgKzE3LDUgQEAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCiBMT0NBTF9NT0RVTEUgOj0gQ3RzSnZtdGlSdW5UZXN0OTQ3SG9zdFRlc3RDYXNlcwotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IEN0c0p2bXRpSG9zdFRlc3RCYXNlCi1MT0NBTF9KQVJKQVJfUlVMRVMgOj0gJChMT0NBTF9QQVRIKS9qYXJqYXItcnVsZXMudHh0Ci1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKIAotaW5jbHVkZSAkKEJVSUxEX0hPU1RfSkFWQV9MSUJSQVJZKQotCi1pbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCitpbmNsdWRlICQoTE9DQUxfUEFUSCkvLi4vLi4vaG9zdF9zaWRlLm1rCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk0Ny9BbmRyb2lkVGVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk0Ny9BbmRyb2lkVGVzdC54bWwKaW5kZXggMWY3YTAwNC4uY2Q1NTg2ZSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05NDcvQW5kcm9pZFRlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTQ3L0FuZHJvaWRUZXN0LnhtbApAQCAtMTQsNiArMTQsNyBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIEpWTVRJIHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJhcnQiIC8+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CiAgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTQ3L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05NDcvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggMzZhODVlZi4uZTM1MjJiMSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05NDcvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05NDcvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTI3LDcgKzI3LDcgQEAKIAogICAgIDwhLS0gIHNlbGYtaW5zdHJ1bWVudGluZyB0ZXN0IHBhY2thZ2UuIC0tPgogICAgIDxpbnN0cnVtZW50YXRpb24KLSAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIGZvciBKVk1USSIKICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF85NDciID4KICAgICA8L2luc3RydW1lbnRhdGlvbj4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTUxL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk1MS9BbmRyb2lkLm1rCmluZGV4IDU2NzdmOGIuLmUxOThmNzAgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTUxL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05NTEvQW5kcm9pZC5tawpAQCAtMTcsMTEgKzE3LDUgQEAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCiBMT0NBTF9NT0RVTEUgOj0gQ3RzSnZtdGlSdW5UZXN0OTUxSG9zdFRlc3RDYXNlcwotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IEN0c0p2bXRpSG9zdFRlc3RCYXNlCi1MT0NBTF9KQVJKQVJfUlVMRVMgOj0gJChMT0NBTF9QQVRIKS9qYXJqYXItcnVsZXMudHh0Ci1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKIAotaW5jbHVkZSAkKEJVSUxEX0hPU1RfSkFWQV9MSUJSQVJZKQotCi1pbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCitpbmNsdWRlICQoTE9DQUxfUEFUSCkvLi4vLi4vaG9zdF9zaWRlLm1rCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk1MS9BbmRyb2lkVGVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk1MS9BbmRyb2lkVGVzdC54bWwKaW5kZXggZWY5YTZlNy4uODQ0YjVhNCAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05NTEvQW5kcm9pZFRlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTUxL0FuZHJvaWRUZXN0LnhtbApAQCAtMTQsNiArMTQsNyBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIEpWTVRJIHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJhcnQiIC8+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CiAgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTUxL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05NTEvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggYmU1MGQ1NS4uNTk2ZWIzYiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05NTEvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05NTEvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTI3LDcgKzI3LDcgQEAKIAogICAgIDwhLS0gIHNlbGYtaW5zdHJ1bWVudGluZyB0ZXN0IHBhY2thZ2UuIC0tPgogICAgIDxpbnN0cnVtZW50YXRpb24KLSAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIGZvciBKVk1USSIKICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF85NTEiID4KICAgICA8L2luc3RydW1lbnRhdGlvbj4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTgyL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk4Mi9BbmRyb2lkLm1rCmluZGV4IGI3NjY2MTQuLmUyNDVlMWQgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTgyL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05ODIvQW5kcm9pZC5tawpAQCAtMTcsMTEgKzE3LDUgQEAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCiBMT0NBTF9NT0RVTEUgOj0gQ3RzSnZtdGlSdW5UZXN0OTgySG9zdFRlc3RDYXNlcwotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IEN0c0p2bXRpSG9zdFRlc3RCYXNlCi1MT0NBTF9KQVJKQVJfUlVMRVMgOj0gJChMT0NBTF9QQVRIKS9qYXJqYXItcnVsZXMudHh0Ci1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKIAotaW5jbHVkZSAkKEJVSUxEX0hPU1RfSkFWQV9MSUJSQVJZKQotCi1pbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCitpbmNsdWRlICQoTE9DQUxfUEFUSCkvLi4vLi4vaG9zdF9zaWRlLm1rCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk4Mi9BbmRyb2lkVGVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk4Mi9BbmRyb2lkVGVzdC54bWwKaW5kZXggMDQ3MGRhMS4uMTAyZGIzNSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05ODIvQW5kcm9pZFRlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTgyL0FuZHJvaWRUZXN0LnhtbApAQCAtMTQsNiArMTQsNyBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIEpWTVRJIHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJhcnQiIC8+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CiAgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTgyL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05ODIvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggZDFjYzdiMS4uOWNiOGUzNyAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05ODIvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05ODIvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTI3LDcgKzI3LDcgQEAKIAogICAgIDwhLS0gIHNlbGYtaW5zdHJ1bWVudGluZyB0ZXN0IHBhY2thZ2UuIC0tPgogICAgIDxpbnN0cnVtZW50YXRpb24KLSAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIGZvciBKVk1USSIKICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF85ODIiID4KICAgICA8L2luc3RydW1lbnRhdGlvbj4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTgzL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk4My9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNmZmMGQKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk4My9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjEgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRSA6PSBDdHNKdm10aVJ1blRlc3Q5ODNIb3N0VGVzdENhc2VzCisKK2luY2x1ZGUgJChMT0NBTF9QQVRIKS8uLi8uLi9ob3N0X3NpZGUubWsKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTgzL0FuZHJvaWRUZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTgzL0FuZHJvaWRUZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDdkNzkwCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05ODMvQW5kcm9pZFRlc3QueG1sCkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgSlZNVEkgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIvPgorICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iYXJ0Ii8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzSnZtdGlSdW5UZXN0OTgzRGV2aWNlQXBwLmFwayIvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5KYXJIb3N0VGVzdCI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iamFyIiB2YWx1ZT0iQ3RzSnZtdGlSdW5UZXN0OTgzSG9zdFRlc3RDYXNlcy5qYXIiLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJzZXQtb3B0aW9uIiB2YWx1ZT0idGVzdC1maWxlLW5hbWU6Q3RzSnZtdGlSdW5UZXN0OTgzRGV2aWNlQXBwLmFwayIvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InNldC1vcHRpb24iIHZhbHVlPSJwYWNrYWdlLW5hbWU6YW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfOTgzIi8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVudGltZS1oaW50IiB2YWx1ZT0iOHMiLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk4My9hcHAvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTgzL2FwcC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1OGU3OTQKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk4My9hcHAvQW5kcm9pZC5tawpAQCAtMCwwICsxLDMzIEBACisjIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQorTE9DQUxfREVYX1BSRU9QVCA6PSBmYWxzZQorTE9DQUxfUFJPR1VBUkRfRU5BQkxFRCA6PSBkaXNhYmxlZAorTE9DQUxfU1JDX0ZJTEVTIDo9CitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IEN0c0p2bXRpRGV2aWNlUnVuVGVzdEFwcEJhc2UKK0xPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmN0c2p2bXRpYWdlbnQKK0xPQ0FMX01VTFRJTElCIDo9IGJvdGgKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKKworIyBUT0RPOiBSZWZhY3Rvci4gVGhpcyBpcyB0aGUgb25seSB0aGluZyBldmVyeSBjaGFuZ2luZy4KK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNKdm10aVJ1blRlc3Q5ODNEZXZpY2VBcHAKKworaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk4My9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTgzL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMjFmMDAKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk4My9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDM1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfOTgzIj4KKworICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmRlYnVnZ2FibGU9InRydWUiPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKyAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0X25yIiBhbmRyb2lkOnZhbHVlPSI5ODMiIC8+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuanZtdGkuSnZtdGlBY3Rpdml0eSIgPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgIDwvYXBwbGljYXRpb24+CisKKyAgICA8IS0tICBzZWxmLWluc3RydW1lbnRpbmcgdGVzdCBwYWNrYWdlLiAtLT4KKyAgICA8aW5zdHJ1bWVudGF0aW9uCisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgdGVzdHMgZm9yIEpWTVRJIgorICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0Xzk4MyIgPgorICAgIDwvaW5zdHJ1bWVudGF0aW9uPgorPC9tYW5pZmVzdD4KKwpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05ODMvamFyamFyLXJ1bGVzLnR4dCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTgzL2phcmphci1ydWxlcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYzMjgyNAotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTgzL2phcmphci1ydWxlcy50eHQKQEAgLTAsMCArMSBAQAorcnVsZSBhbmRyb2lkLmp2bXRpLmN0cy5Kdm10aUhvc3RUZXN0KiogYW5kcm9pZC5qdm10aS5jdHMuSnZtdGlIb3N0VGVzdDk4M0AxCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk4NC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05ODQvQW5kcm9pZC5tawppbmRleCAyZDcxMjc4Li5iMGE5MTlhIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk4NC9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTg0L0FuZHJvaWQubWsKQEAgLTE3LDExICsxNyw1IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfTU9EVUxFIDo9IEN0c0p2bXRpUnVuVGVzdDk4NEhvc3RUZXN0Q2FzZXMKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aUhvc3RUZXN0QmFzZQotTE9DQUxfSkFSSkFSX1JVTEVTIDo9ICQoTE9DQUxfUEFUSCkvamFyamFyLXJ1bGVzLnR4dAotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiAKLWluY2x1ZGUgJChCVUlMRF9IT1NUX0pBVkFfTElCUkFSWSkKLQotaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQoraW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05ODQvQW5kcm9pZFRlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05ODQvQW5kcm9pZFRlc3QueG1sCmluZGV4IGZlYmQ2OGIuLjMzZWVkYjAgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTg0L0FuZHJvaWRUZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk4NC9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iYXJ0IiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk4NC9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTg0L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDk2M2NkNTEuLjYzN2U1YjEgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTg0L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTg0L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yNyw3ICsyNyw3IEBACiAKICAgICA8IS0tICBzZWxmLWluc3RydW1lbnRpbmcgdGVzdCBwYWNrYWdlLiAtLT4KICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBmb3IgSlZNVEkiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfOTg0IiA+CiAgICAgPC9pbnN0cnVtZW50YXRpb24+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk4NS9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05ODUvQW5kcm9pZC5tawppbmRleCAwNmU0NDU0Li4wYTU1ZmFjIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk4NS9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTg1L0FuZHJvaWQubWsKQEAgLTE3LDExICsxNyw1IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfTU9EVUxFIDo9IEN0c0p2bXRpUnVuVGVzdDk4NUhvc3RUZXN0Q2FzZXMKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aUhvc3RUZXN0QmFzZQotTE9DQUxfSkFSSkFSX1JVTEVTIDo9ICQoTE9DQUxfUEFUSCkvamFyamFyLXJ1bGVzLnR4dAotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiAKLWluY2x1ZGUgJChCVUlMRF9IT1NUX0pBVkFfTElCUkFSWSkKLQotaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQoraW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05ODUvQW5kcm9pZFRlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05ODUvQW5kcm9pZFRlc3QueG1sCmluZGV4IGZmODUxNDguLjY4NDgzM2QgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTg1L0FuZHJvaWRUZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk4NS9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iYXJ0IiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk4NS9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTg1L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDRiMGZmYTUuLjlmZjYzNGEgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTg1L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTg1L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yNyw3ICsyNyw3IEBACiAKICAgICA8IS0tICBzZWxmLWluc3RydW1lbnRpbmcgdGVzdCBwYWNrYWdlLiAtLT4KICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBmb3IgSlZNVEkiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfOTg1IiA+CiAgICAgPC9pbnN0cnVtZW50YXRpb24+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk4Ni9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05ODYvQW5kcm9pZC5tawppbmRleCBlMTk4NDcxLi42YmU0NWYyIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk4Ni9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTg2L0FuZHJvaWQubWsKQEAgLTE3LDExICsxNyw1IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfTU9EVUxFIDo9IEN0c0p2bXRpUnVuVGVzdDk4Nkhvc3RUZXN0Q2FzZXMKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aUhvc3RUZXN0QmFzZQotTE9DQUxfSkFSSkFSX1JVTEVTIDo9ICQoTE9DQUxfUEFUSCkvamFyamFyLXJ1bGVzLnR4dAotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiAKLWluY2x1ZGUgJChCVUlMRF9IT1NUX0pBVkFfTElCUkFSWSkKLQotaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQoraW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05ODYvQW5kcm9pZFRlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05ODYvQW5kcm9pZFRlc3QueG1sCmluZGV4IDMyMDU2MzcuLjE3MDE5M2UgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTg2L0FuZHJvaWRUZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk4Ni9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iYXJ0IiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk4Ni9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTg2L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDRjMTJkOTMuLjM3YjUwZDggMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTg2L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTg2L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yNyw3ICsyNyw3IEBACiAKICAgICA8IS0tICBzZWxmLWluc3RydW1lbnRpbmcgdGVzdCBwYWNrYWdlLiAtLT4KICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBmb3IgSlZNVEkiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfOTg2IiA+CiAgICAgPC9pbnN0cnVtZW50YXRpb24+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk4OC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05ODgvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTgwOTlkCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05ODgvQW5kcm9pZC5tawpAQCAtMCwwICsxLDIxIEBACisjIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEUgOj0gQ3RzSnZtdGlSdW5UZXN0OTg4SG9zdFRlc3RDYXNlcworCitpbmNsdWRlICQoTE9DQUxfUEFUSCkvLi4vLi4vaG9zdF9zaWRlLm1rCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk4OC9BbmRyb2lkVGVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk4OC9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRiOGUyZgotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTg4L0FuZHJvaWRUZXN0LnhtbApAQCAtMCwwICsxLDI5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIEpWTVRJIHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiLz4KKyAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImFydCIgLz4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzSnZtdGlSdW5UZXN0OTg4RGV2aWNlQXBwLmFwayIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGVzdHR5cGUuSmFySG9zdFRlc3QiID4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJqYXIiIHZhbHVlPSJDdHNKdm10aVJ1blRlc3Q5ODhIb3N0VGVzdENhc2VzLmphciIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJzZXQtb3B0aW9uIiB2YWx1ZT0idGVzdC1maWxlLW5hbWU6Q3RzSnZtdGlSdW5UZXN0OTg4RGV2aWNlQXBwLmFwayIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJzZXQtb3B0aW9uIiB2YWx1ZT0icGFja2FnZS1uYW1lOmFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0Xzk4OCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJydW50aW1lLWhpbnQiIHZhbHVlPSI4cyIvPgorICAgIDwvdGVzdD4KKzwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTg4L2FwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05ODgvYXBwL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFlOWY3OAotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTg4L2FwcC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzMgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKK0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCitMT0NBTF9ERVhfUFJFT1BUIDo9IGZhbHNlCitMT0NBTF9QUk9HVUFSRF9FTkFCTEVEIDo9IGRpc2FibGVkCitMT0NBTF9TUkNfRklMRVMgOj0KK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gQ3RzSnZtdGlEZXZpY2VSdW5UZXN0QXBwQmFzZQorTE9DQUxfSk5JX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3RzanZtdGlhZ2VudAorTE9DQUxfTVVMVElMSUIgOj0gYm90aAorTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorCisjIFRPRE86IFJlZmFjdG9yLiBUaGlzIGlzIHRoZSBvbmx5IHRoaW5nIGV2ZXJ5IGNoYW5naW5nLgorTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0p2bXRpUnVuVGVzdDk4OERldmljZUFwcAorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTg4L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05ODgvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZlYjA3MAotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTg4L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF85ODgiPgorCisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6ZGVidWdnYWJsZT0idHJ1ZSI+CisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgorICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfbnIiIGFuZHJvaWQ6dmFsdWU9Ijk4OCIgLz4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5qdm10aS5Kdm10aUFjdGl2aXR5IiA+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgPC9hcHBsaWNhdGlvbj4KKworICAgIDwhLS0gIHNlbGYtaW5zdHJ1bWVudGluZyB0ZXN0IHBhY2thZ2UuIC0tPgorICAgIDxpbnN0cnVtZW50YXRpb24KKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBmb3IgSlZNVEkiCisgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfOTg4IiA+CisgICAgPC9pbnN0cnVtZW50YXRpb24+Cis8L21hbmlmZXN0PgorCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk4OC9qYXJqYXItcnVsZXMudHh0IGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05ODgvamFyamFyLXJ1bGVzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGJlMTViCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05ODgvamFyamFyLXJ1bGVzLnR4dApAQCAtMCwwICsxIEBACitydWxlIGFuZHJvaWQuanZtdGkuY3RzLkp2bXRpSG9zdFRlc3QqKiBhbmRyb2lkLmp2bXRpLmN0cy5Kdm10aUhvc3RUZXN0OTg4QDEKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTg5L0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk4OS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMWNlYWQKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk4OS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjEgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRSA6PSBDdHNKdm10aVJ1blRlc3Q5ODlIb3N0VGVzdENhc2VzCisKK2luY2x1ZGUgJChMT0NBTF9QQVRIKS8uLi8uLi9ob3N0X3NpZGUubWsKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTg5L0FuZHJvaWRUZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTg5L0FuZHJvaWRUZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjIyNGYwCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05ODkvQW5kcm9pZFRlc3QueG1sCkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgSlZNVEkgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIvPgorICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iYXJ0IiAvPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJDdHNKdm10aVJ1blRlc3Q5ODlEZXZpY2VBcHAuYXBrIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5KYXJIb3N0VGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImphciIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDk4OUhvc3RUZXN0Q2FzZXMuamFyIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InNldC1vcHRpb24iIHZhbHVlPSJ0ZXN0LWZpbGUtbmFtZTpDdHNKdm10aVJ1blRlc3Q5ODlEZXZpY2VBcHAuYXBrIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InNldC1vcHRpb24iIHZhbHVlPSJwYWNrYWdlLW5hbWU6YW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfOTg5IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjhzIi8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05ODkvYXBwL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk4OS9hcHAvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGI2MmMzCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05ODkvYXBwL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKK0xPQ0FMX0RFWF9QUkVPUFQgOj0gZmFsc2UKK0xPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKK0xPQ0FMX1NSQ19GSUxFUyA6PQorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aURldmljZVJ1blRlc3RBcHBCYXNlCitMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdHNqdm10aWFnZW50CitMT0NBTF9NVUxUSUxJQiA6PSBib3RoCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CisKKyMgVE9ETzogUmVmYWN0b3IuIFRoaXMgaXMgdGhlIG9ubHkgdGhpbmcgZXZlcnkgY2hhbmdpbmcuCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzSnZtdGlSdW5UZXN0OTg5RGV2aWNlQXBwCisKK2luY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05ODkvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk4OS9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTY3YTY2Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05ODkvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwzNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0Xzk4OSI+CisKKyAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpkZWJ1Z2dhYmxlPSJ0cnVlIj4KKyAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CisgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF9uciIgYW5kcm9pZDp2YWx1ZT0iOTg5IiAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmp2bXRpLkp2bXRpQWN0aXZpdHkiID4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPCEtLSAgc2VsZi1pbnN0cnVtZW50aW5nIHRlc3QgcGFja2FnZS4gLS0+CisgICAgPGluc3RydW1lbnRhdGlvbgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIGZvciBKVk1USSIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF85ODkiID4KKyAgICA8L2luc3RydW1lbnRhdGlvbj4KKzwvbWFuaWZlc3Q+CisKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTg5L2phcmphci1ydWxlcy50eHQgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk4OS9qYXJqYXItcnVsZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNDdjOTYKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk4OS9qYXJqYXItcnVsZXMudHh0CkBAIC0wLDAgKzEgQEAKK3J1bGUgYW5kcm9pZC5qdm10aS5jdHMuSnZtdGlIb3N0VGVzdCoqIGFuZHJvaWQuanZtdGkuY3RzLkp2bXRpSG9zdFRlc3Q5ODlAMQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05OTAvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTkwL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVlMWFmZQotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTkwL0FuZHJvaWQubWsKQEAgLTAsMCArMSwyMSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFIDo9IEN0c0p2bXRpUnVuVGVzdDk5MEhvc3RUZXN0Q2FzZXMKKworaW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05OTAvQW5kcm9pZFRlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05OTAvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2MDM1MjEKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk5MC9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIi8+CisgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJhcnQiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDk5MERldmljZUFwcC5hcGsiIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRlc3R0eXBlLkphckhvc3RUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0iamFyIiB2YWx1ZT0iQ3RzSnZtdGlSdW5UZXN0OTkwSG9zdFRlc3RDYXNlcy5qYXIiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ic2V0LW9wdGlvbiIgdmFsdWU9InRlc3QtZmlsZS1uYW1lOkN0c0p2bXRpUnVuVGVzdDk5MERldmljZUFwcC5hcGsiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ic2V0LW9wdGlvbiIgdmFsdWU9InBhY2thZ2UtbmFtZTphbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF85OTAiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVudGltZS1oaW50IiB2YWx1ZT0iOHMiLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk5MC9hcHAvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTkwL2FwcC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMDc2MzgKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk5MC9hcHAvQW5kcm9pZC5tawpAQCAtMCwwICsxLDMzIEBACisjIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQorTE9DQUxfREVYX1BSRU9QVCA6PSBmYWxzZQorTE9DQUxfUFJPR1VBUkRfRU5BQkxFRCA6PSBkaXNhYmxlZAorTE9DQUxfU1JDX0ZJTEVTIDo9CitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IEN0c0p2bXRpRGV2aWNlUnVuVGVzdEFwcEJhc2UKK0xPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmN0c2p2bXRpYWdlbnQKK0xPQ0FMX01VTFRJTElCIDo9IGJvdGgKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKKworIyBUT0RPOiBSZWZhY3Rvci4gVGhpcyBpcyB0aGUgb25seSB0aGluZyBldmVyeSBjaGFuZ2luZy4KK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNKdm10aVJ1blRlc3Q5OTBEZXZpY2VBcHAKKworaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk5MC9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTkwL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkODdjMjEKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk5MC9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDM1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfOTkwIj4KKworICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmRlYnVnZ2FibGU9InRydWUiPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKyAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0X25yIiBhbmRyb2lkOnZhbHVlPSI5OTAiIC8+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuanZtdGkuSnZtdGlBY3Rpdml0eSIgPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgIDwvYXBwbGljYXRpb24+CisKKyAgICA8IS0tICBzZWxmLWluc3RydW1lbnRpbmcgdGVzdCBwYWNrYWdlLiAtLT4KKyAgICA8aW5zdHJ1bWVudGF0aW9uCisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgdGVzdHMgZm9yIEpWTVRJIgorICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0Xzk5MCIgPgorICAgIDwvaW5zdHJ1bWVudGF0aW9uPgorPC9tYW5pZmVzdD4KKwpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05OTAvamFyamFyLXJ1bGVzLnR4dCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTkwL2phcmphci1ydWxlcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVmZjg2MQotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTkwL2phcmphci1ydWxlcy50eHQKQEAgLTAsMCArMSBAQAorcnVsZSBhbmRyb2lkLmp2bXRpLmN0cy5Kdm10aUhvc3RUZXN0KiogYW5kcm9pZC5qdm10aS5jdHMuSnZtdGlIb3N0VGVzdDk5MEAxCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk5MS9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05OTEvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTkwZmVjCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05OTEvQW5kcm9pZC5tawpAQCAtMCwwICsxLDIxIEBACisjIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEUgOj0gQ3RzSnZtdGlSdW5UZXN0OTkxSG9zdFRlc3RDYXNlcworCitpbmNsdWRlICQoTE9DQUxfUEFUSCkvLi4vLi4vaG9zdF9zaWRlLm1rCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk5MS9BbmRyb2lkVGVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk5MS9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzcxOTc4YQotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTkxL0FuZHJvaWRUZXN0LnhtbApAQCAtMCwwICsxLDI5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIEpWTVRJIHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiLz4KKyAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImFydCIgLz4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzSnZtdGlSdW5UZXN0OTkxRGV2aWNlQXBwLmFwayIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGVzdHR5cGUuSmFySG9zdFRlc3QiID4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJqYXIiIHZhbHVlPSJDdHNKdm10aVJ1blRlc3Q5OTFIb3N0VGVzdENhc2VzLmphciIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJzZXQtb3B0aW9uIiB2YWx1ZT0idGVzdC1maWxlLW5hbWU6Q3RzSnZtdGlSdW5UZXN0OTkxRGV2aWNlQXBwLmFwayIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJzZXQtb3B0aW9uIiB2YWx1ZT0icGFja2FnZS1uYW1lOmFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0Xzk5MSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJydW50aW1lLWhpbnQiIHZhbHVlPSI4cyIvPgorICAgIDwvdGVzdD4KKzwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTkxL2FwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05OTEvYXBwL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg2NDJiZgotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTkxL2FwcC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzMgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKK0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCitMT0NBTF9ERVhfUFJFT1BUIDo9IGZhbHNlCitMT0NBTF9QUk9HVUFSRF9FTkFCTEVEIDo9IGRpc2FibGVkCitMT0NBTF9TUkNfRklMRVMgOj0KK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gQ3RzSnZtdGlEZXZpY2VSdW5UZXN0QXBwQmFzZQorTE9DQUxfSk5JX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3RzanZtdGlhZ2VudAorTE9DQUxfTVVMVElMSUIgOj0gYm90aAorTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorCisjIFRPRE86IFJlZmFjdG9yLiBUaGlzIGlzIHRoZSBvbmx5IHRoaW5nIGV2ZXJ5IGNoYW5naW5nLgorTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0p2bXRpUnVuVGVzdDk5MURldmljZUFwcAorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTkxL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05OTEvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgzMjQ0MAotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTkxL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF85OTEiPgorCisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6ZGVidWdnYWJsZT0idHJ1ZSI+CisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgorICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfbnIiIGFuZHJvaWQ6dmFsdWU9Ijk5MSIgLz4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5qdm10aS5Kdm10aUFjdGl2aXR5IiA+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgPC9hcHBsaWNhdGlvbj4KKworICAgIDwhLS0gIHNlbGYtaW5zdHJ1bWVudGluZyB0ZXN0IHBhY2thZ2UuIC0tPgorICAgIDxpbnN0cnVtZW50YXRpb24KKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBmb3IgSlZNVEkiCisgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfOTkxIiA+CisgICAgPC9pbnN0cnVtZW50YXRpb24+Cis8L21hbmlmZXN0PgorCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk5MS9qYXJqYXItcnVsZXMudHh0IGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05OTEvamFyamFyLXJ1bGVzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTEwMmJiCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05OTEvamFyamFyLXJ1bGVzLnR4dApAQCAtMCwwICsxIEBACitydWxlIGFuZHJvaWQuanZtdGkuY3RzLkp2bXRpSG9zdFRlc3QqKiBhbmRyb2lkLmp2bXRpLmN0cy5Kdm10aUhvc3RUZXN0OTkxQDEKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTkyL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk5Mi9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYzJiODMKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk5Mi9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjEgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRSA6PSBDdHNKdm10aVJ1blRlc3Q5OTJIb3N0VGVzdENhc2VzCisKK2luY2x1ZGUgJChMT0NBTF9QQVRIKS8uLi8uLi9ob3N0X3NpZGUubWsKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTkyL0FuZHJvaWRUZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTkyL0FuZHJvaWRUZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTRkZmY2Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05OTIvQW5kcm9pZFRlc3QueG1sCkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgSlZNVEkgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIvPgorICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iYXJ0IiAvPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJDdHNKdm10aVJ1blRlc3Q5OTJEZXZpY2VBcHAuYXBrIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5KYXJIb3N0VGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImphciIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDk5Mkhvc3RUZXN0Q2FzZXMuamFyIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InNldC1vcHRpb24iIHZhbHVlPSJ0ZXN0LWZpbGUtbmFtZTpDdHNKdm10aVJ1blRlc3Q5OTJEZXZpY2VBcHAuYXBrIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InNldC1vcHRpb24iIHZhbHVlPSJwYWNrYWdlLW5hbWU6YW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfOTkyIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjhzIi8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05OTIvYXBwL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk5Mi9hcHAvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmQ3YWI4Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05OTIvYXBwL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKK0xPQ0FMX0RFWF9QUkVPUFQgOj0gZmFsc2UKK0xPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKK0xPQ0FMX1NSQ19GSUxFUyA6PQorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aURldmljZVJ1blRlc3RBcHBCYXNlCitMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdHNqdm10aWFnZW50CitMT0NBTF9NVUxUSUxJQiA6PSBib3RoCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CisKKyMgVE9ETzogUmVmYWN0b3IuIFRoaXMgaXMgdGhlIG9ubHkgdGhpbmcgZXZlcnkgY2hhbmdpbmcuCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzSnZtdGlSdW5UZXN0OTkyRGV2aWNlQXBwCisKK2luY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05OTIvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk5Mi9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDg0ZmNkCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05OTIvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwzNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0Xzk5MiI+CisKKyAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpkZWJ1Z2dhYmxlPSJ0cnVlIj4KKyAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CisgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF9uciIgYW5kcm9pZDp2YWx1ZT0iOTkyIiAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmp2bXRpLkp2bXRpQWN0aXZpdHkiID4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPCEtLSAgc2VsZi1pbnN0cnVtZW50aW5nIHRlc3QgcGFja2FnZS4gLS0+CisgICAgPGluc3RydW1lbnRhdGlvbgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIGZvciBKVk1USSIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF85OTIiID4KKyAgICA8L2luc3RydW1lbnRhdGlvbj4KKzwvbWFuaWZlc3Q+CisKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTkyL2phcmphci1ydWxlcy50eHQgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk5Mi9qYXJqYXItcnVsZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MTIzNTYKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk5Mi9qYXJqYXItcnVsZXMudHh0CkBAIC0wLDAgKzEgQEAKK3J1bGUgYW5kcm9pZC5qdm10aS5jdHMuSnZtdGlIb3N0VGVzdCoqIGFuZHJvaWQuanZtdGkuY3RzLkp2bXRpSG9zdFRlc3Q5OTJAMQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05OTMvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTkzL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFhMGQ0NAotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTkzL0FuZHJvaWQubWsKQEAgLTAsMCArMSwyMSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFIDo9IEN0c0p2bXRpUnVuVGVzdDk5M0hvc3RUZXN0Q2FzZXMKKworaW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05OTMvQW5kcm9pZFRlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05OTMvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MWEzYmYKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk5My9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIi8+CisgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJhcnQiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDk5M0RldmljZUFwcC5hcGsiIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRlc3R0eXBlLkphckhvc3RUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0iamFyIiB2YWx1ZT0iQ3RzSnZtdGlSdW5UZXN0OTkzSG9zdFRlc3RDYXNlcy5qYXIiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ic2V0LW9wdGlvbiIgdmFsdWU9InRlc3QtZmlsZS1uYW1lOkN0c0p2bXRpUnVuVGVzdDk5M0RldmljZUFwcC5hcGsiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ic2V0LW9wdGlvbiIgdmFsdWU9InBhY2thZ2UtbmFtZTphbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF85OTMiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVudGltZS1oaW50IiB2YWx1ZT0iOHMiLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk5My9hcHAvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTkzL2FwcC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MzdjNjQKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk5My9hcHAvQW5kcm9pZC5tawpAQCAtMCwwICsxLDMzIEBACisjIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQorTE9DQUxfREVYX1BSRU9QVCA6PSBmYWxzZQorTE9DQUxfUFJPR1VBUkRfRU5BQkxFRCA6PSBkaXNhYmxlZAorTE9DQUxfU1JDX0ZJTEVTIDo9CitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IEN0c0p2bXRpRGV2aWNlUnVuVGVzdEFwcEJhc2UKK0xPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmN0c2p2bXRpYWdlbnQKK0xPQ0FMX01VTFRJTElCIDo9IGJvdGgKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKKworIyBUT0RPOiBSZWZhY3Rvci4gVGhpcyBpcyB0aGUgb25seSB0aGluZyBldmVyeSBjaGFuZ2luZy4KK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNKdm10aVJ1blRlc3Q5OTNEZXZpY2VBcHAKKworaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk5My9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTkzL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NzI0MWYKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk5My9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDM1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfOTkzIj4KKworICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmRlYnVnZ2FibGU9InRydWUiPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKyAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0X25yIiBhbmRyb2lkOnZhbHVlPSI5OTMiIC8+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuanZtdGkuSnZtdGlBY3Rpdml0eSIgPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgIDwvYXBwbGljYXRpb24+CisKKyAgICA8IS0tICBzZWxmLWluc3RydW1lbnRpbmcgdGVzdCBwYWNrYWdlLiAtLT4KKyAgICA8aW5zdHJ1bWVudGF0aW9uCisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgdGVzdHMgZm9yIEpWTVRJIgorICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0Xzk5MyIgPgorICAgIDwvaW5zdHJ1bWVudGF0aW9uPgorPC9tYW5pZmVzdD4KKwpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05OTMvamFyamFyLXJ1bGVzLnR4dCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTkzL2phcmphci1ydWxlcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIwNzk3MQotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTkzL2phcmphci1ydWxlcy50eHQKQEAgLTAsMCArMSBAQAorcnVsZSBhbmRyb2lkLmp2bXRpLmN0cy5Kdm10aUhvc3RUZXN0KiogYW5kcm9pZC5qdm10aS5jdHMuSnZtdGlIb3N0VGVzdDk5M0AxCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk5NC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05OTQvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWE4MTU1Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05OTQvQW5kcm9pZC5tawpAQCAtMCwwICsxLDIxIEBACisjIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEUgOj0gQ3RzSnZtdGlSdW5UZXN0OTk0SG9zdFRlc3RDYXNlcworCitpbmNsdWRlICQoTE9DQUxfUEFUSCkvLi4vLi4vaG9zdF9zaWRlLm1rCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk5NC9BbmRyb2lkVGVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk5NC9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdkNjFkYwotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTk0L0FuZHJvaWRUZXN0LnhtbApAQCAtMCwwICsxLDI5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIEpWTVRJIHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiLz4KKyAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImFydCIgLz4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzSnZtdGlSdW5UZXN0OTk0RGV2aWNlQXBwLmFwayIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGVzdHR5cGUuSmFySG9zdFRlc3QiID4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJqYXIiIHZhbHVlPSJDdHNKdm10aVJ1blRlc3Q5OTRIb3N0VGVzdENhc2VzLmphciIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJzZXQtb3B0aW9uIiB2YWx1ZT0idGVzdC1maWxlLW5hbWU6Q3RzSnZtdGlSdW5UZXN0OTk0RGV2aWNlQXBwLmFwayIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJzZXQtb3B0aW9uIiB2YWx1ZT0icGFja2FnZS1uYW1lOmFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0Xzk5NCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJydW50aW1lLWhpbnQiIHZhbHVlPSI4cyIvPgorICAgIDwvdGVzdD4KKzwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTk0L2FwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05OTQvYXBwL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBkZWZiYwotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTk0L2FwcC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzMgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKK0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCitMT0NBTF9ERVhfUFJFT1BUIDo9IGZhbHNlCitMT0NBTF9QUk9HVUFSRF9FTkFCTEVEIDo9IGRpc2FibGVkCitMT0NBTF9TUkNfRklMRVMgOj0KK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gQ3RzSnZtdGlEZXZpY2VSdW5UZXN0QXBwQmFzZQorTE9DQUxfSk5JX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3RzanZtdGlhZ2VudAorTE9DQUxfTVVMVElMSUIgOj0gYm90aAorTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorCisjIFRPRE86IFJlZmFjdG9yLiBUaGlzIGlzIHRoZSBvbmx5IHRoaW5nIGV2ZXJ5IGNoYW5naW5nLgorTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0p2bXRpUnVuVGVzdDk5NERldmljZUFwcAorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTk0L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05OTQvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE0ODA3YwotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTk0L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF85OTQiPgorCisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6ZGVidWdnYWJsZT0idHJ1ZSI+CisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgorICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfbnIiIGFuZHJvaWQ6dmFsdWU9Ijk5NCIgLz4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5qdm10aS5Kdm10aUFjdGl2aXR5IiA+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgPC9hcHBsaWNhdGlvbj4KKworICAgIDwhLS0gIHNlbGYtaW5zdHJ1bWVudGluZyB0ZXN0IHBhY2thZ2UuIC0tPgorICAgIDxpbnN0cnVtZW50YXRpb24KKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBmb3IgSlZNVEkiCisgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfOTk0IiA+CisgICAgPC9pbnN0cnVtZW50YXRpb24+Cis8L21hbmlmZXN0PgorCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk5NC9qYXJqYXItcnVsZXMudHh0IGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05OTQvamFyamFyLXJ1bGVzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmExNzc3Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05OTQvamFyamFyLXJ1bGVzLnR4dApAQCAtMCwwICsxIEBACitydWxlIGFuZHJvaWQuanZtdGkuY3RzLkp2bXRpSG9zdFRlc3QqKiBhbmRyb2lkLmp2bXRpLmN0cy5Kdm10aUhvc3RUZXN0OTk0QDEKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTk1L0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk5NS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NGNlNzgKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk5NS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjEgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRSA6PSBDdHNKdm10aVJ1blRlc3Q5OTVIb3N0VGVzdENhc2VzCisKK2luY2x1ZGUgJChMT0NBTF9QQVRIKS8uLi8uLi9ob3N0X3NpZGUubWsKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTk1L0FuZHJvaWRUZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTk1L0FuZHJvaWRUZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjc4ZjAxCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05OTUvQW5kcm9pZFRlc3QueG1sCkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgSlZNVEkgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIvPgorICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iYXJ0IiAvPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJDdHNKdm10aVJ1blRlc3Q5OTVEZXZpY2VBcHAuYXBrIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5KYXJIb3N0VGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImphciIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDk5NUhvc3RUZXN0Q2FzZXMuamFyIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InNldC1vcHRpb24iIHZhbHVlPSJ0ZXN0LWZpbGUtbmFtZTpDdHNKdm10aVJ1blRlc3Q5OTVEZXZpY2VBcHAuYXBrIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InNldC1vcHRpb24iIHZhbHVlPSJwYWNrYWdlLW5hbWU6YW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfOTk1IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjhzIi8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05OTUvYXBwL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk5NS9hcHAvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTBlYzI2Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05OTUvYXBwL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKK0xPQ0FMX0RFWF9QUkVPUFQgOj0gZmFsc2UKK0xPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKK0xPQ0FMX1NSQ19GSUxFUyA6PQorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aURldmljZVJ1blRlc3RBcHBCYXNlCitMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdHNqdm10aWFnZW50CitMT0NBTF9NVUxUSUxJQiA6PSBib3RoCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CisKKyMgVE9ETzogUmVmYWN0b3IuIFRoaXMgaXMgdGhlIG9ubHkgdGhpbmcgZXZlcnkgY2hhbmdpbmcuCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzSnZtdGlSdW5UZXN0OTk1RGV2aWNlQXBwCisKK2luY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05OTUvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk5NS9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTczYzI2Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05OTUvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwzNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0Xzk5NSI+CisKKyAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpkZWJ1Z2dhYmxlPSJ0cnVlIj4KKyAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CisgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF9uciIgYW5kcm9pZDp2YWx1ZT0iOTk1IiAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmp2bXRpLkp2bXRpQWN0aXZpdHkiID4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPCEtLSAgc2VsZi1pbnN0cnVtZW50aW5nIHRlc3QgcGFja2FnZS4gLS0+CisgICAgPGluc3RydW1lbnRhdGlvbgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIGZvciBKVk1USSIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF85OTUiID4KKyAgICA8L2luc3RydW1lbnRhdGlvbj4KKzwvbWFuaWZlc3Q+CisKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTk1L2phcmphci1ydWxlcy50eHQgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk5NS9qYXJqYXItcnVsZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMDEwNmUKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk5NS9qYXJqYXItcnVsZXMudHh0CkBAIC0wLDAgKzEgQEAKK3J1bGUgYW5kcm9pZC5qdm10aS5jdHMuSnZtdGlIb3N0VGVzdCoqIGFuZHJvaWQuanZtdGkuY3RzLkp2bXRpSG9zdFRlc3Q5OTVAMQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05OTYvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTk2L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzcxMDY3YgotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTk2L0FuZHJvaWQubWsKQEAgLTAsMCArMSwyMSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFIDo9IEN0c0p2bXRpUnVuVGVzdDk5Nkhvc3RUZXN0Q2FzZXMKKworaW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05OTYvQW5kcm9pZFRlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05OTYvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwOGMzNGMKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk5Ni9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKVk1USSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIi8+CisgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJhcnQiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0p2bXRpUnVuVGVzdDk5NkRldmljZUFwcC5hcGsiIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRlc3R0eXBlLkphckhvc3RUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0iamFyIiB2YWx1ZT0iQ3RzSnZtdGlSdW5UZXN0OTk2SG9zdFRlc3RDYXNlcy5qYXIiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ic2V0LW9wdGlvbiIgdmFsdWU9InRlc3QtZmlsZS1uYW1lOkN0c0p2bXRpUnVuVGVzdDk5NkRldmljZUFwcC5hcGsiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ic2V0LW9wdGlvbiIgdmFsdWU9InBhY2thZ2UtbmFtZTphbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF85OTYiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVudGltZS1oaW50IiB2YWx1ZT0iOHMiLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk5Ni9hcHAvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTk2L2FwcC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNTAwYmIKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk5Ni9hcHAvQW5kcm9pZC5tawpAQCAtMCwwICsxLDMzIEBACisjIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQorTE9DQUxfREVYX1BSRU9QVCA6PSBmYWxzZQorTE9DQUxfUFJPR1VBUkRfRU5BQkxFRCA6PSBkaXNhYmxlZAorTE9DQUxfU1JDX0ZJTEVTIDo9CitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IEN0c0p2bXRpRGV2aWNlUnVuVGVzdEFwcEJhc2UKK0xPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmN0c2p2bXRpYWdlbnQKK0xPQ0FMX01VTFRJTElCIDo9IGJvdGgKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKKworIyBUT0RPOiBSZWZhY3Rvci4gVGhpcyBpcyB0aGUgb25seSB0aGluZyBldmVyeSBjaGFuZ2luZy4KK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNKdm10aVJ1blRlc3Q5OTZEZXZpY2VBcHAKKworaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk5Ni9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTk2L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViYmViNDEKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk5Ni9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDM1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfOTk2Ij4KKworICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmRlYnVnZ2FibGU9InRydWUiPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKyAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0X25yIiBhbmRyb2lkOnZhbHVlPSI5OTYiIC8+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuanZtdGkuSnZtdGlBY3Rpdml0eSIgPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgIDwvYXBwbGljYXRpb24+CisKKyAgICA8IS0tICBzZWxmLWluc3RydW1lbnRpbmcgdGVzdCBwYWNrYWdlLiAtLT4KKyAgICA8aW5zdHJ1bWVudGF0aW9uCisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgdGVzdHMgZm9yIEpWTVRJIgorICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0Xzk5NiIgPgorICAgIDwvaW5zdHJ1bWVudGF0aW9uPgorPC9tYW5pZmVzdD4KKwpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05OTYvamFyamFyLXJ1bGVzLnR4dCBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTk2L2phcmphci1ydWxlcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMxMWI1YQotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTk2L2phcmphci1ydWxlcy50eHQKQEAgLTAsMCArMSBAQAorcnVsZSBhbmRyb2lkLmp2bXRpLmN0cy5Kdm10aUhvc3RUZXN0KiogYW5kcm9pZC5qdm10aS5jdHMuSnZtdGlIb3N0VGVzdDk5NkAxCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk5Ny9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05OTcvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGRiMmFmCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05OTcvQW5kcm9pZC5tawpAQCAtMCwwICsxLDIxIEBACisjIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEUgOj0gQ3RzSnZtdGlSdW5UZXN0OTk3SG9zdFRlc3RDYXNlcworCitpbmNsdWRlICQoTE9DQUxfUEFUSCkvLi4vLi4vaG9zdF9zaWRlLm1rCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk5Ny9BbmRyb2lkVGVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk5Ny9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M1MDU3OQotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTk3L0FuZHJvaWRUZXN0LnhtbApAQCAtMCwwICsxLDI5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIEpWTVRJIHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiLz4KKyAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImFydCIgLz4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzSnZtdGlSdW5UZXN0OTk3RGV2aWNlQXBwLmFwayIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGVzdHR5cGUuSmFySG9zdFRlc3QiID4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJqYXIiIHZhbHVlPSJDdHNKdm10aVJ1blRlc3Q5OTdIb3N0VGVzdENhc2VzLmphciIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJzZXQtb3B0aW9uIiB2YWx1ZT0idGVzdC1maWxlLW5hbWU6Q3RzSnZtdGlSdW5UZXN0OTk3RGV2aWNlQXBwLmFwayIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJzZXQtb3B0aW9uIiB2YWx1ZT0icGFja2FnZS1uYW1lOmFuZHJvaWQuanZtdGkuY3RzLnJ1bl90ZXN0Xzk5NyIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJydW50aW1lLWhpbnQiIHZhbHVlPSI4cyIvPgorICAgIDwvdGVzdD4KKzwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTk3L2FwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05OTcvYXBwL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVhMzdiMQotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTk3L2FwcC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzMgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKK0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCitMT0NBTF9ERVhfUFJFT1BUIDo9IGZhbHNlCitMT0NBTF9QUk9HVUFSRF9FTkFCTEVEIDo9IGRpc2FibGVkCitMT0NBTF9TUkNfRklMRVMgOj0KK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gQ3RzSnZtdGlEZXZpY2VSdW5UZXN0QXBwQmFzZQorTE9DQUxfSk5JX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3RzanZtdGlhZ2VudAorTE9DQUxfTVVMVElMSUIgOj0gYm90aAorTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorCisjIFRPRE86IFJlZmFjdG9yLiBUaGlzIGlzIHRoZSBvbmx5IHRoaW5nIGV2ZXJ5IGNoYW5naW5nLgorTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0p2bXRpUnVuVGVzdDk5N0RldmljZUFwcAorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTk3L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05OTcvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQwOGI4MwotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvanZtdGkvcnVuLXRlc3RzL3Rlc3QtOTk3L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy5ydW5fdGVzdF85OTciPgorCisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6ZGVidWdnYWJsZT0idHJ1ZSI+CisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgorICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfbnIiIGFuZHJvaWQ6dmFsdWU9Ijk5NyIgLz4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5qdm10aS5Kdm10aUFjdGl2aXR5IiA+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgPC9hcHBsaWNhdGlvbj4KKworICAgIDwhLS0gIHNlbGYtaW5zdHJ1bWVudGluZyB0ZXN0IHBhY2thZ2UuIC0tPgorICAgIDxpbnN0cnVtZW50YXRpb24KKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBmb3IgSlZNVEkiCisgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5qdm10aS5jdHMucnVuX3Rlc3RfOTk3IiA+CisgICAgPC9pbnN0cnVtZW50YXRpb24+Cis8L21hbmlmZXN0PgorCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2p2bXRpL3J1bi10ZXN0cy90ZXN0LTk5Ny9qYXJqYXItcnVsZXMudHh0IGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05OTcvamFyamFyLXJ1bGVzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjM1ZDkxCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS9ydW4tdGVzdHMvdGVzdC05OTcvamFyamFyLXJ1bGVzLnR4dApAQCAtMCwwICsxIEBACitydWxlIGFuZHJvaWQuanZtdGkuY3RzLkp2bXRpSG9zdFRlc3QqKiBhbmRyb2lkLmp2bXRpLmN0cy5Kdm10aUhvc3RUZXN0OTk3QDEKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvanZtdGkvdGFnZ2luZy9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS90YWdnaW5nL0FuZHJvaWQubWsKaW5kZXggM2QzZTllNC4uMWVlN2JlZSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9qdm10aS90YWdnaW5nL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS90YWdnaW5nL0FuZHJvaWQubWsKQEAgLTE3LDExICsxNyw1IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfTU9EVUxFIDo9IEN0c0p2bXRpVGFnZ2luZ0hvc3RUZXN0Q2FzZXMKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNKdm10aUhvc3RUZXN0QmFzZQotTE9DQUxfSkFSSkFSX1JVTEVTIDo9ICQoTE9DQUxfUEFUSCkvamFyamFyLXJ1bGVzLnR4dAotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiAKLWluY2x1ZGUgJChCVUlMRF9IT1NUX0pBVkFfTElCUkFSWSkKLQotaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQoraW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uL2hvc3Rfc2lkZS5tawpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS90YWdnaW5nL0FuZHJvaWRUZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvanZtdGkvdGFnZ2luZy9BbmRyb2lkVGVzdC54bWwKaW5kZXggNDAzY2EyOC4uYmU3NWMwOCAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9qdm10aS90YWdnaW5nL0FuZHJvaWRUZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3RhZ2dpbmcvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgSlZNVEkgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImFydCIgLz4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9qdm10aS90YWdnaW5nL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9qdm10aS90YWdnaW5nL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDAzNTA5Y2UuLjQ5ZDliMmMgMTAwNzU1Ci0tLSBhL2hvc3RzaWRldGVzdHMvanZtdGkvdGFnZ2luZy9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL2p2bXRpL3RhZ2dpbmcvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTI2LDcgKzI2LDcgQEAKIAogICAgIDwhLS0gIHNlbGYtaW5zdHJ1bWVudGluZyB0ZXN0IHBhY2thZ2UuIC0tPgogICAgIDxpbnN0cnVtZW50YXRpb24KLSAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIGZvciBKVk1USSIKICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmp2bXRpLmN0cy50YWdnaW5nIiA+CiAgICAgPC9pbnN0cnVtZW50YXRpb24+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL21lZGlhL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL21lZGlhL0FuZHJvaWQubWsKaW5kZXggZGI4MzY4Ni4uNDgyM2VjOCAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9tZWRpYS9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvbWVkaWEvQW5kcm9pZC5tawpAQCAtMjQsNyArMjQsNyBAQAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKIAogIyB0YWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzIGN0c19pbnN0YW50CiAKIExPQ0FMX01PRFVMRSA6PSBDdHNNZWRpYUhvc3RUZXN0Q2FzZXMKIApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9tZWRpYS9BbmRyb2lkVGVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL21lZGlhL0FuZHJvaWRUZXN0LnhtbAppbmRleCA0ODNkOTY5Li5lNTgxOGI1IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL21lZGlhL0FuZHJvaWRUZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL21lZGlhL0FuZHJvaWRUZXN0LnhtbApAQCAtMTQsNiArMTQsNyBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIG1lZGlhIGhvc3QgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9Im1lZGlhIiAvPgogICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5KYXJIb3N0VGVzdCIgPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImphciIgdmFsdWU9IkN0c01lZGlhSG9zdFRlc3RDYXNlcy5qYXIiIC8+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL21lZGlhL09XTkVSUyBiL2hvc3RzaWRldGVzdHMvbWVkaWEvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ODRiMTgKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL21lZGlhL09XTkVSUwpAQCAtMCwwICsxLDYgQEAKK3JhY2hhZEBnb29nbGUuY29tCitlbGF1cmVudEBnb29nbGUuY29tCitsYWpvc0Bnb29nbGUuY29tCittYXJjb25lQGdvb2dsZS5jb20KK3N1bmdzb29AZ29vZ2xlLmNvbQoramFld2FuQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvbWVkaWEvYXBwL01lZGlhU2Vzc2lvblRlc3QvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvbWVkaWEvYXBwL01lZGlhU2Vzc2lvblRlc3QvQW5kcm9pZC5tawppbmRleCBmYjBmZTQwLi5mZTQ2ZDc0IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL21lZGlhL2FwcC9NZWRpYVNlc3Npb25UZXN0L0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9tZWRpYS9hcHAvTWVkaWFTZXNzaW9uVGVzdC9BbmRyb2lkLm1rCkBAIC0xNiw3ICsxNiw3IEBACiAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCi1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMgY3RzX2luc3RhbnQKIAogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c01lZGlhU2Vzc2lvbkhvc3RUZXN0QXBwCiAKQEAgLTI5LDcgKzI5LDEwIEBACiAgICAgJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCAuLi8uLi9jb21tb24pCiAKIAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQtc3VwcG9ydC10ZXN0IGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCisgICAgYW5kcm9pZHgudGVzdC5ydWxlcyBcCisgICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgXAorCiAKIExPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKIApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9tZWRpYS9hcHAvTWVkaWFTZXNzaW9uVGVzdC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9tZWRpYS9hcHAvTWVkaWFTZXNzaW9uVGVzdC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDVhZTZmOTYuLjAwOWZlYTggMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvbWVkaWEvYXBwL01lZGlhU2Vzc2lvblRlc3QvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL21lZGlhL2FwcC9NZWRpYVNlc3Npb25UZXN0L0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTE1LDEyICsxNSwxNSBAQAogLS0+CiAKIDxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgcGFja2FnZT0iYW5kcm9pZC5tZWRpYS5zZXNzaW9uLmN0cyI+CisgICAgcGFja2FnZT0iYW5kcm9pZC5tZWRpYS5zZXNzaW9uLmN0cyIKKyAgICBhbmRyb2lkOnRhcmdldFNhbmRib3hWZXJzaW9uPSIyIj4KIAogICAgIDx1c2VzLXNkayBhbmRyb2lkOm1pblNka1ZlcnNpb249IjI2Ii8+CiAKICAgICA8YXBwbGljYXRpb24KICAgICAgICAgYW5kcm9pZDp0ZXN0T25seT0idHJ1ZSI+CisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgorCiAgICAgICAgIDxzZXJ2aWNlCiAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9Ii5NZWRpYVNlc3Npb25NYW5hZ2VyVGVzdCIKICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Ik1lZGlhU2Vzc2lvbk1hbmFnZXJUZXN0IgpAQCAtMzIsNyArMzUsNyBAQAogICAgIDwvYXBwbGljYXRpb24+CiAKICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5tZWRpYS5zZXNzaW9uLmN0cyIKICAgICAgICAgYW5kcm9pZDpsYWJlbD0iTWVkaWFTZXNzaW9uIG11bHRpLXVzZXIgY2FzZSBDVFMgVGVzdHMiIC8+CiAKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvbWVkaWEvYXBwL01lZGlhU2Vzc2lvblRlc3Qvc3JjL2FuZHJvaWQvbWVkaWEvc2Vzc2lvbi9jdHMvTWVkaWFTZXNzaW9uTWFuYWdlclRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvbWVkaWEvYXBwL01lZGlhU2Vzc2lvblRlc3Qvc3JjL2FuZHJvaWQvbWVkaWEvc2Vzc2lvbi9jdHMvTWVkaWFTZXNzaW9uTWFuYWdlclRlc3QuamF2YQppbmRleCAwMmQ4MTA3Li5iNzNkYTBkIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL21lZGlhL2FwcC9NZWRpYVNlc3Npb25UZXN0L3NyYy9hbmRyb2lkL21lZGlhL3Nlc3Npb24vY3RzL01lZGlhU2Vzc2lvbk1hbmFnZXJUZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9tZWRpYS9hcHAvTWVkaWFTZXNzaW9uVGVzdC9zcmMvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL2N0cy9NZWRpYVNlc3Npb25NYW5hZ2VyVGVzdC5qYXZhCkBAIC0xNyw3ICsxNyw3IEBACiBwYWNrYWdlIGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5jdHM7CiAKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5jdHMuTWVkaWFTZXNzaW9uVGVzdEhlbHBlckNvbnN0YW50cy5NRURJQV9TRVNTSU9OX1RFU1RfSEVMUEVSX1BLRzsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKKwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIApAQCAtMjYsOCArMjYsOSBAQAogaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYUNvbnRyb2xsZXI7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLk1lZGlhU2Vzc2lvbk1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLm5vdGlmaWNhdGlvbi5Ob3RpZmljYXRpb25MaXN0ZW5lclNlcnZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CiAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9tZWRpYS9hcHAvTWVkaWFTZXNzaW9uVGVzdEhlbHBlci9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9tZWRpYS9hcHAvTWVkaWFTZXNzaW9uVGVzdEhlbHBlci9BbmRyb2lkLm1rCmluZGV4IDg3MTE0MGEuLjUxNGY4NmEgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvbWVkaWEvYXBwL01lZGlhU2Vzc2lvblRlc3RIZWxwZXIvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL21lZGlhL2FwcC9NZWRpYVNlc3Npb25UZXN0SGVscGVyL0FuZHJvaWQubWsKQEAgLTMwLDcgKzMwLDcgQEAKICAgICAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIC4uLy4uL2NvbW1vbikKIAogIyB0YWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzIGN0c19pbnN0YW50CiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNNZWRpYVNlc3Npb25UZXN0SGVscGVyCiAKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvbWVkaWEvYXBwL01lZGlhU2Vzc2lvblRlc3RIZWxwZXIvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvbWVkaWEvYXBwL01lZGlhU2Vzc2lvblRlc3RIZWxwZXIvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCAxZTI5ZWNhLi43MGM0OGY5IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL21lZGlhL2FwcC9NZWRpYVNlc3Npb25UZXN0SGVscGVyL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9tZWRpYS9hcHAvTWVkaWFTZXNzaW9uVGVzdEhlbHBlci9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yMCw2ICsyMCw4IEBACiAgICAgYW5kcm9pZDp2ZXJzaW9uQ29kZT0iMSIKICAgICBhbmRyb2lkOnZlcnNpb25OYW1lPSIxLjAiPgogCisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5GT1JFR1JPVU5EX1NFUlZJQ0UiLz4KKwogICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2xhYmVsIj4KICAgICAgICAgPHNlcnZpY2UgYW5kcm9pZDpuYW1lPSIuTWVkaWFTZXNzaW9uVGVzdEhlbHBlclNlcnZpY2UiPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL21lZGlhL2JpdHN0cmVhbXMvQW5kcm9pZFRlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9tZWRpYS9iaXRzdHJlYW1zL0FuZHJvaWRUZXN0LnhtbAppbmRleCA2YTYwYTY1Li4xNjIxYWE3IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL21lZGlhL2JpdHN0cmVhbXMvQW5kcm9pZFRlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvbWVkaWEvYml0c3RyZWFtcy9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBTYW1wbGUgaG9zdCB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0ibWVkaWEiIC8+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGFyZ2V0cHJlcC5NZWRpYVByZXBhcmVyIj4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJtZWRpYS1kb3dubG9hZC1vbmx5IiB2YWx1ZT0idHJ1ZSIgLz4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvbWVkaWEvYml0c3RyZWFtcy9EeW5hbWljQ29uZmlnLnhtbCBiL2hvc3RzaWRldGVzdHMvbWVkaWEvYml0c3RyZWFtcy9EeW5hbWljQ29uZmlnLnhtbAppbmRleCA1NzE3ZjgwLi4wMjhlM2E1IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL21lZGlhL2JpdHN0cmVhbXMvRHluYW1pY0NvbmZpZy54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9tZWRpYS9iaXRzdHJlYW1zL0R5bmFtaWNDb25maWcueG1sCkBAIC01OTgyLDcgKzU5ODIsNyBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2F2YyxzaXplPTEyNjE1MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9MixsZXZlbD01MTIsYml0cmF0ZT0xNTYxMTIwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQwMC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbW9ub2Nocm9tZS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNjI0NDcsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjI1NjY5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzYyNDQ3LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyNTY2OTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MDAvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbW9ub2Nocm9tZS5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02NDQwMDMsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQwMTY0MjQscGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTU5OTEsMTMgKzU5OTEsMTMgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTU0MDA1NSx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTYxNjczNixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQwMC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX21vbm9jaHJvbWUubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE2MTE2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzE3MTI4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTYxMTYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03MTcxMjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MDAvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9tb25vY2hyb21lLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5MDk4NSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTExODUwNTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5MDk4NSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTExODUwNTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MDAvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbW9ub2Nocm9tZS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTkzODAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIzNzUyOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU5MzgwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMzc1MjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MDAvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9tb25vY2hyb21lLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTYzOTAyNCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Mzk4NTMwNCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtNjAwNiwxMCArNjAwNiwxMCBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTQyNzcwLHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05NjMzNzEyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDAwLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9tb25vY2hyb21lLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNDczMSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTcwODQ4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE0NzMxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzA4NDgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDAwLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9tb25vY2hyb21lLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5MTE5Mix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTExODYzNTIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5MTE5Mix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTExODYzNTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjAvMTBiaXQvYml0cmF0ZS9jcm93ZF8xMjgweDcyMHAyNGYzMDBfMzAwMGticHMubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDczODU0Myx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0yNCxwcm9maWxlPTIsbGV2ZWw9MjU2LGJpdHJhdGU9MzAyOTY0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMTMzNDQsMjA4ICsxMzM0NCwyMDggQEAKICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTU5MzAzOCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTYwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI1NDE0MTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvY29uZndpbmRvdy9jcm93ZF8zODQweDIxNjBwNTBmMzIvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyX2NuZnduZHdfaDE2djE2Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQwOTYsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3MzUzNDg4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MDk2LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzM1MzQ4OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9jb25md2luZG93L2Nyb3dkXzM4NDB4MjE2MHA1MGYzMi9jcm93ZF8zODQweDIxNjBwNTBmMzJfY25md25kd19oMTZ2OC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MDk2LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzM1NDk4NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDA5Nix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTczNTQ5ODQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvY29uZndpbmRvdy9jcm93ZF8zODQweDIxNjBwNTBmMzIvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyX2NuZnduZHdfaDMydjMyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQwOTYsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3MTAyMjU2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MDk2LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzEwMjI1NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9jb25md2luZG93L2Nyb3dkXzM4NDB4MjE2MHA1MGYzMi9jcm93ZF8zODQweDIxNjBwNTBmMzJfY25md25kd19oNjR2NjQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDA5Nix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTcxNjIzNjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQwOTYsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3MTYyMzYwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L2NvbmZ3aW5kb3cvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl9jbmZ3bmR3X2g3MnY1Ni5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MDk2LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzA5ODExMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDA5Nix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTcwOTgxMTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvY29uZndpbmRvdy9jcm93ZF8zODQweDIxNjBwNTBmMzIvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyX2NuZnduZHdfaDh2OC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MDk2LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzM0MjY4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDA5Nix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTczNDI2ODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvY29uZndpbmRvdy9jcm93ZF8zODQweDIxNjBwNTBmMzIvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyX2NuZnduZHdfbDJyMHQwYjAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDA5Nix3aWR0aD0zODM4LGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTczNzE5MzYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQwOTYsd2lkdGg9MzgzOCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3MzcxOTM2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L2NvbmZ3aW5kb3cvY3Jvd2RfODQ4eDQ4MHA1MGYzMi9jcm93ZF84NDh4NDgwcDUwZjMyX2NuZnduZHdfaDE2djE2Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2MTg2MCx3aWR0aD04NDgsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEwMDMwMTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2MTg2MCx3aWR0aD04NDgsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEwMDMwMTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvZ29wL2Nyb3dkXzEyODB4NzIwcDUwL2Nyb3dkXzEyODB4NzIwcDUwZjEwX2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc2OTM3LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTcwMzY4ODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3NjkzNyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03MDM2ODgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L2dvcC9jcm93ZF8xMjgweDcyMHA1MC9jcm93ZF8xMjgweDcyMHA1MGYxMV9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4MjA2MSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02NTgzMDQ4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODIwNjEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NjU4MzA0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfMTI4MHg3MjBwNTAvY3Jvd2RfMTI4MHg3MjBwNTBmMTJfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODY4MjMsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NjE5MjgwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg2ODIzLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTYxOTI4MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvZ29wL2Nyb3dkXzEyODB4NzIwcDUwL2Nyb3dkXzEyODB4NzIwcDUwZjEzX2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTk0MDkxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTU5Mzk2ODgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5NDA5MSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01OTM5Njg4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L2dvcC9jcm93ZF8xMjgweDcyMHA1MC9jcm93ZF8xMjgweDcyMHA1MGYxNF9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5NzExNix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01NjAxNzM2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTcxMTYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTYwMTczNixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfMTI4MHg3MjBwNTAvY3Jvd2RfMTI4MHg3MjBwNTBmMTVfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMDQ1NzQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTQyNzA2NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjA0NTc0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTU0MjcwNjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvZ29wL2Nyb3dkXzEyODB4NzIwcDUwL2Nyb3dkXzEyODB4NzIwcDUwZjE2X2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjA2OTc3LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTUxNDc4NDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIwNjk3Nyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01MTQ3ODQ4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L2dvcC9jcm93ZF8xMjgweDcyMHA1MC9jcm93ZF8xMjgweDcyMHA1MGYxX2dvcDEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Nzk5MzEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02MzI2MzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTc5OTMxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NjMyNjMyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L2dvcC9jcm93ZF8xMjgweDcyMHA1MC9jcm93ZF8xMjgweDcyMHA1MGYxX2dvcDIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Nzk5NDIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02MzI3MTIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTc5OTQyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NjMyNzEyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L2dvcC9jcm93ZF8xMjgweDcyMHA1MC9jcm93ZF8xMjgweDcyMHA1MGYxX2dvcDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Nzk5NDIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02MzI3MTIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTc5OTQyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NjMyNzEyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L2dvcC9jcm93ZF8xMjgweDcyMHA1MC9jcm93ZF8xMjgweDcyMHA1MGYxX2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Nzk5NDQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02MzI3MTIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTc5OTQ0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NjMyNzEyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L2dvcC9jcm93ZF8xMjgweDcyMHA1MC9jcm93ZF8xMjgweDcyMHA1MGYyX2dvcDEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9OTc5NDAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTk0MTIwMDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTk3OTQwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5NDEyMDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L2dvcC9jcm93ZF8xMjgweDcyMHA1MC9jcm93ZF8xMjgweDcyMHA1MGYyX2dvcDIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9OTc5NTEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTk0MTQwMDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTk3OTUxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5NDE0MDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L2dvcC9jcm93ZF8xMjgweDcyMHA1MC9jcm93ZF8xMjgweDcyMHA1MGYyX2dvcDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9OTc5NTEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTk0MTQwMDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTk3OTUxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5NDE0MDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L2dvcC9jcm93ZF8xMjgweDcyMHA1MC9jcm93ZF8xMjgweDcyMHA1MGYyX2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9OTc5NTMsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTk0MTQwMDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTk3OTUzLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5NDE0MDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L2dvcC9jcm93ZF8xMjgweDcyMHA1MC9jcm93ZF8xMjgweDcyMHA1MGYzX2dvcDIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTExNDU1LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NzMyNTI4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTE0NTUsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ3MzI1MjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvZ29wL2Nyb3dkXzEyODB4NzIwcDUwL2Nyb3dkXzEyODB4NzIwcDUwZjNfZ29wNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTE0NTUsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ3MzI1MjgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExMTQ1NSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDczMjUyOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfMTI4MHg3MjBwNTAvY3Jvd2RfMTI4MHg3MjBwNTBmM19nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExMTQ1Nyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDczMjUyOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTExNDU3LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NzMyNTI4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L2dvcC9jcm93ZF8xMjgweDcyMHA1MC9jcm93ZF8xMjgweDcyMHA1MGY0X2dvcDIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTIwNTAwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTExOTUyNjk2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMjA1MDAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTE5NTI2OTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvZ29wL2Nyb3dkXzEyODB4NzIwcDUwL2Nyb3dkXzEyODB4NzIwcDUwZjRfZ29wNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMjE3MjUsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTIwNzUyMDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEyMTcyNSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMjA3NTIwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfMTI4MHg3MjBwNTAvY3Jvd2RfMTI4MHg3MjBwNTBmNF9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEyMTcyNyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMjA3NTIwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTIxNzI3LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEyMDc1MjAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L2dvcC9jcm93ZF8xMjgweDcyMHA1MC9jcm93ZF8xMjgweDcyMHA1MGY1X2dvcDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTM0MTIwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEwNjUwODAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMzQxMjAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTA2NTA4MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvZ29wL2Nyb3dkXzEyODB4NzIwcDUwL2Nyb3dkXzEyODB4NzIwcDUwZjVfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMzQxMjIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTA2NTA4MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEzNDEyMix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMDY1MDgwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfMTI4MHg3MjBwNTAvY3Jvd2RfMTI4MHg3MjBwNTBmNl9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE0MDg4MSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05MzI1NjAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNDA4ODEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTMyNTYwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfMTI4MHg3MjBwNTAvY3Jvd2RfMTI4MHg3MjBwNTBmNl9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE0MDAxMCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05MjY3OTI4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNDAwMTAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTI2NzkyOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfMTI4MHg3MjBwNTAvY3Jvd2RfMTI4MHg3MjBwNTBmN19nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE0NjUwMyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04MzEzOTM2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNDY1MDMsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9ODMxMzkzNixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfMTI4MHg3MjBwNTAvY3Jvd2RfMTI4MHg3MjBwNTBmN19nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1MzE5MCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04Njk2ODU2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTMxOTAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9ODY5Njg1NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfMTI4MHg3MjBwNTAvY3Jvd2RfMTI4MHg3MjBwNTBmOF9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1MTA5OCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03NTAzODQ4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTEwOTgsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzUwMzg0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfMTI4MHg3MjBwNTAvY3Jvd2RfMTI4MHg3MjBwNTBmOF9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1Nzk4MCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03ODQ5MDQ4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTc5ODAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Nzg0OTA0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfMTI4MHg3MjBwNTAvY3Jvd2RfMTI4MHg3MjBwNTBmOV9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3MDkzNix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03NTUyNTc2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzA5MzYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzU1MjU3NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfMTkyMHgxMDgwcDUwL2Nyb3dkXzE5MjB4MTA4MHA1MGYxMF9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4ODMzOSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzQ5MzAwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg4MzM5LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03NDkzMDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L2dvcC9jcm93ZF8xOTIweDEwODBwNTAvY3Jvd2RfMTkyMHgxMDgwcDUwZjExX2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTk1NDAwLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03MDY4MTQ0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTU0MDAsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTcwNjgxNDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmMTJfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODUyNzQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTYxNDEyMDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4NTI3NCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NjE0MTIwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfMTkyMHgxMDgwcDUwL2Nyb3dkXzE5MjB4MTA4MHA1MGYxM19nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5NDU2Nix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTk1NDMzNixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTk0NTY2LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01OTU0MzM2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L2dvcC9jcm93ZF8xOTIweDEwODBwNTAvY3Jvd2RfMTkyMHgxMDgwcDUwZjE0X2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTk5OTU3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01NjgyOTM2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTk5NTcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTU2ODI5MzYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmMTVfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMTIzMzcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTU2MzQxMDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIxMjMzNyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTYzNDEwNCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfMTkyMHgxMDgwcDUwL2Nyb3dkXzE5MjB4MTA4MHA1MGYxNl9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIxNDM1NCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTMzMjI5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjE0MzU0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01MzMyMjk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L2dvcC9jcm93ZF8xOTIweDEwODBwNTAvY3Jvd2RfMTkyMHgxMDgwcDUwZjFfZ29wMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03MTA1Nix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01NjE2MjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTcxMDU2LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0xLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTU2MTYyNCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfMTkyMHgxMDgwcDUwL2Nyb3dkXzE5MjB4MTA4MHA1MGYxX2dvcDIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NzEwNjYsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTYxNzA0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03MTA2Nix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01NjE3MDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmMV9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTcxMDY3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0xLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTU2MTcwNCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NzEwNjcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTYxNzA0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L2dvcC9jcm93ZF8xOTIweDEwODBwNTAvY3Jvd2RfMTkyMHgxMDgwcDUwZjFfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03MTA2Nyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01NjE3MDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTcxMDY3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0xLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTU2MTcwNCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfMTkyMHgxMDgwcDUwL2Nyb3dkXzE5MjB4MTA4MHA1MGYyX2dvcDEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9ODcwMzMsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3MjMwNDAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT04NzAzMyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTcyMzA0MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmMl9nb3AyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTg3MDQzLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzIzMjQwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9ODcwNDMsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3MjMyNDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L2dvcC9jcm93ZF8xOTIweDEwODBwNTAvY3Jvd2RfMTkyMHgxMDgwcDUwZjJfZ29wNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT04NzA0NCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTcyMzI0MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTg3MDQ0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzIzMjQwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfMTkyMHgxMDgwcDUwL2Nyb3dkXzE5MjB4MTA4MHA1MGYyX2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9ODcwNDQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3MjMyNDAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT04NzA0NCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTcyMzI0MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmM19nb3AyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTk5MTQ2LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzA5MTMyOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9OTkxNDYsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzMDkxMzI4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L2dvcC9jcm93ZF8xOTIweDEwODBwNTAvY3Jvd2RfMTkyMHgxMDgwcDUwZjNfZ29wNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT05OTE0Nyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTMwOTEzMjgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTk5MTQ3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzA5MTMyOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfMTkyMHgxMDgwcDUwL2Nyb3dkXzE5MjB4MTA4MHA1MGYzX2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9OTkxNDcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzMDkxMzI4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT05OTE0Nyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTMwOTEzMjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmNF9nb3AyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwODU0Mix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTA3NTY4OTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwODU0Mix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTA3NTY4OTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmNF9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwODI2MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTA3Mjg2OTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwODI2MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTA3Mjg2OTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmNF9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwODI2MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTA3Mjg2OTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwODI2MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTA3Mjg2OTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmNV9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExODM0NCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTM4ODY0MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE4MzQ0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05Mzg4NjQwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L2dvcC9jcm93ZF8xOTIweDEwODBwNTAvY3Jvd2RfMTkyMHgxMDgwcDUwZjVfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTgzNDQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTkzODg2NDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExODM0NCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTM4ODY0MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfMTkyMHgxMDgwcDUwL2Nyb3dkXzE5MjB4MTA4MHA1MGY2X2dvcDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTMzNzczLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04ODUxNjY0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMzM3NzMsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTg4NTE2NjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmNl9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEyMzU3Nyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9ODE3MjQ2NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTIzNTc3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04MTcyNDY0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L2dvcC9jcm93ZF8xOTIweDEwODBwNTAvY3Jvd2RfMTkyMHgxMDgwcDUwZjdfZ29wNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNDE5OTksd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTgwNTY1MTIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE0MTk5OSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9ODA1NjUxMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfMTkyMHgxMDgwcDUwL2Nyb3dkXzE5MjB4MTA4MHA1MGY3X2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTM0NTgyLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03NjMzNTkyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMzQ1ODIsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTc2MzM1OTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmOF9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE0OTE2NCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzQwNzA5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTQ5MTY0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03NDA3MDk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L2dvcC9jcm93ZF8xOTIweDEwODBwNTAvY3Jvd2RfMTkyMHgxMDgwcDUwZjhfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMzc5NjUsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTY4NDgzNDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEzNzk2NSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Njg0ODM0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfMTkyMHgxMDgwcDUwL2Nyb3dkXzE5MjB4MTA4MHA1MGY5X2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTQ5MzI0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02NTkyMDg4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNDkzMjQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTY1OTIwODgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmMTBfZ29wOC5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MzY0NDYsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3NDE3MjQwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0xMzU2OSwyNzQgKzEzNTY5LDI3NCBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01NjAzNTksd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzOTgyNDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L2dvcC9jcm93ZF8zODQweDIxNjBwNTAvY3Jvd2RfMzg0MHgyMTYwcDUwZjFfZ29wMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODExOTMsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ0MjcxMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTgxMTkzLHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0xLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NDI3MTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmMV9nb3AyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4MTIwMix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDQyNzkyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODEyMDIsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ0Mjc5MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfMzg0MHgyMTYwcDUwL2Nyb3dkXzM4NDB4MjE2MHA1MGYxX2dvcDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTgxMjAzLHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0xLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NDI3OTIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4MTIwMyx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDQyNzkyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L2dvcC9jcm93ZF8zODQweDIxNjBwNTAvY3Jvd2RfMzg0MHgyMTYwcDUwZjFfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODEyMDQsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ0Mjc5MixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTgxMjA0LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0xLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NDI3OTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmMl9nb3AxLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIyMDUxNix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDM5MjY4MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIyMDUxNix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDM5MjY4MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmMl9nb3AyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIyMDUyNSx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDM5Mjg4MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIyMDUyNSx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDM5Mjg4MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmMl9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIyMDUyNix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDM5Mjg4MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIyMDUyNix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDM5Mjg4MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmMl9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIyMDUyNyx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDM5Mjg4MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIyMDUyNyx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDM5Mjg4MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmM19nb3AyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI1MTQ1OCx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzMzOTk2MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI1MTQ1OCx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzMzOTk2MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmM19nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI1MTQ1OSx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzMzOTk2MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI1MTQ1OSx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzMzOTk2MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmM19nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI1MTQ2MCx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzMzOTk2MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI1MTQ2MCx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzMzOTk2MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmNF9nb3AyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI3MDMyNCx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjY5MzUwOTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI3MDMyNCx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjY5MzUwOTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmNF9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI3NDk5Myx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Mjc0MDE4OTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI3NDk5Myx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Mjc0MDE4OTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmNF9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI3NDk5NCx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Mjc0MDE4OTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI3NDk5NCx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Mjc0MDE4OTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmNV9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMwMzI3MCx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjQxODI3MjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMwMzI3MCx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjQxODI3MjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmNV9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMwMzI3MSx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjQxODI3MjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMwMzI3MSx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjQxODI3MjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmNl9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMyNDEwNCx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjE1NDA0MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMyNDEwNCx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjE1NDA0MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmNl9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMxOTg4MCx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjEyNTkyNjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMxOTg4MCx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjEyNTkyNjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmN19nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM0NDAwNCx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTk1OTk2NTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM0NDAwNCx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTk1OTk2NTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmN19nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM0OTQ2Nyx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTk5MTI2ODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM0OTQ2Nyx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTk5MTI2ODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmOF9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM2MTYyNSx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTgwMzAxNDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM2MTYyNSx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTgwMzAxNDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmOF9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM2MzM2MCx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTgxMTgwNDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM2MzM2MCx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTgxMTgwNDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmOV9nb3A4Lm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM5NTczMCx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTc1NDM0MTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvZ29wL2Nyb3dkXzY0MHgzNjBwNTAvY3Jvd2RfNjQweDM2MHA1MGYxMF9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI4NjEwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTEwMzg0MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mjg2MTAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMTAzODQwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L2dvcC9jcm93ZF82NDB4MzYwcDUwL2Nyb3dkXzY0MHgzNjBwNTBmMTFfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yOTc0NSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEwNDQzMjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI5NzQ1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTA0NDMyMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfNjQweDM2MHA1MC9jcm93ZF82NDB4MzYwcDUwZjEyX2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzA3MDQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05ODg4NjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMwNzA0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTg4ODY0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L2dvcC9jcm93ZF82NDB4MzYwcDUwL2Nyb3dkXzY0MHgzNjBwNTBmMTNfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMTYwNCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTk0MDEyMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzE2MDQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05NDAxMjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvZ29wL2Nyb3dkXzY0MHgzNjBwNTAvY3Jvd2RfNjQweDM2MHA1MGYxNF9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMyMDM0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9ODg1MTM2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMjAzNCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTg4NTEzNixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfNjQweDM2MHA1MC9jcm93ZF82NDB4MzYwcDUwZjE1X2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzM1NTUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04NjY1ODQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMzNTU1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9ODY2NTg0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L2dvcC9jcm93ZF82NDB4MzYwcDUwL2Nyb3dkXzY0MHgzNjBwNTBmMTZfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMzIyNCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTgwNDA0OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzMyMjQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04MDQwNDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvZ29wL2Nyb3dkXzY0MHgzNjBwNTAvY3Jvd2RfNjQweDM2MHA1MGYxX2dvcDEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTM0NTMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0xLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEwMDgwOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTM0NTMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0xLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEwMDgwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfNjQweDM2MHA1MC9jcm93ZF82NDB4MzYwcDUwZjFfZ29wMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMzQ2NCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTAwODg4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMzQ2NCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTAwODg4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L2dvcC9jcm93ZF82NDB4MzYwcDUwL2Nyb3dkXzY0MHgzNjBwNTBmMV9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEzNDYzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMDA4ODgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEzNDYzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMDA4ODgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvZ29wL2Nyb3dkXzY0MHgzNjBwNTAvY3Jvd2RfNjQweDM2MHA1MGYxX2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTM0NjUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0xLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEwMDg4OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTM0NjUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0xLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEwMDg4OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfNjQweDM2MHA1MC9jcm93ZF82NDB4MzYwcDUwZjJfZ29wMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjU4NCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMxNDA4MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2NTg0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzE0MDgwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfNjQweDM2MHA1MC9jcm93ZF82NDB4MzYwcDUwZjJfZ29wMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjU5NSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMxNDI4MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2NTk1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzE0MjgwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfNjQweDM2MHA1MC9jcm93ZF82NDB4MzYwcDUwZjJfZ29wNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjU5NCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMxNDI4MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2NTk0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzE0MjgwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfNjQweDM2MHA1MC9jcm93ZF82NDB4MzYwcDUwZjJfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjU5Nix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMxNDI4MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2NTk2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzE0MjgwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfNjQweDM2MHA1MC9jcm93ZF82NDB4MzYwcDUwZjNfZ29wMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODU4OSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNTA0MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4NTg5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM1MDQwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfNjQweDM2MHA1MC9jcm93ZF82NDB4MzYwcDUwZjNfZ29wNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODU4OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNTA0MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4NTg4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM1MDQwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfNjQweDM2MHA1MC9jcm93ZF82NDB4MzYwcDUwZjNfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODU5MCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNTA0MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4NTkwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM1MDQwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfNjQweDM2MHA1MC9jcm93ZF82NDB4MzYwcDUwZjRfZ29wMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTk4MSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5MDA4MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5OTgxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTkwMDgwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfNjQweDM2MHA1MC9jcm93ZF82NDB4MzYwcDUwZjRfZ29wNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMDE2Nyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5MTk0OTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIwMTY3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTkxOTQ5NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfNjQweDM2MHA1MC9jcm93ZF82NDB4MzYwcDUwZjRfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMDE2OSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5MTk0OTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIwMTY5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTkxOTQ5NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfNjQweDM2MHA1MC9jcm93ZF82NDB4MzYwcDUwZjVfZ29wNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMTUyMix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE2NDMwNDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIxNTIyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTY0MzA0MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfNjQweDM2MHA1MC9jcm93ZF82NDB4MzYwcDUwZjVfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMTUyNCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE2NDMwNDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIxNTI0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTY0MzA0MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfNjQweDM2MHA1MC9jcm93ZF82NDB4MzYwcDUwZjZfZ29wNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMjYxMyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NDExMjgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIyNjEzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ0MTEyOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfNjQweDM2MHA1MC9jcm93ZF82NDB4MzYwcDUwZjZfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMjMxNix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0MjE3MjgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIyMzE2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQyMTcyOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfNjQweDM2MHA1MC9jcm93ZF82NDB4MzYwcDUwZjdfZ29wNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMzY2Nyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEyOTQ3OTIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIzNjY3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTI5NDc5MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfNjQweDM2MHA1MC9jcm93ZF82NDB4MzYwcDUwZjdfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMzY5OSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEyOTc0MjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIzNjk5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTI5NzQyNCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfNjQweDM2MHA1MC9jcm93ZF82NDB4MzYwcDUwZjhfZ29wNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yNDYxMix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTExNzk2MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI0NjEyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTE3OTYwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfNjQweDM2MHA1MC9jcm93ZF82NDB4MzYwcDUwZjhfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yNDI3Nix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTExNjM4OTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI0Mjc2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTE2Mzg5NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfNjQweDM2MHA1MC9jcm93ZF82NDB4MzYwcDUwZjlfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yNTczNix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEwOTkyODgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI1NzM2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTA5OTI4OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfODU0eDQ4MHA1MC9jcm93ZF84NTR4NDgwcDUwZjEwX2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Njc1MDgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNjU5NzYwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02NzUwOCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI2NTk3NjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvZ29wL2Nyb3dkXzg1NHg0ODBwNTAvY3Jvd2RfODU0eDQ4MHA1MGYxMV9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTcwMDg1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjUxMTIzMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NzAwODUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNTExMjMyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L2dvcC9jcm93ZF84NTR4NDgwcDUwL2Nyb3dkXzg1NHg0ODBwNTBmMTJfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03MjQ3OSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzODEzNjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTcyNDc5LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM4MTM2MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfODU0eDQ4MHA1MC9jcm93ZF84NTR4NDgwcDUwZjEzX2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NzU2MTksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjk0NDI0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03NTYxOSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyOTQ0MjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvZ29wL2Nyb3dkXzg1NHg0ODBwNTAvY3Jvd2RfODU0eDQ4MHA1MGYxNF9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTc2NzQxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjE2MjQ4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NzY3NDEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMTYyNDgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L2dvcC9jcm93ZF84NTR4NDgwcDUwL2Nyb3dkXzg1NHg0ODBwNTBmMTVfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT04MDM2MCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIxMTQ3MjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTgwMzYwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjExNDcyMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfODU0eDQ4MHA1MC9jcm93ZF84NTR4NDgwcDUwZjE2X2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9ODA3MTcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTkxMzY4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT04MDcxNyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5OTEzNjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvZ29wL2Nyb3dkXzg1NHg0ODBwNTAvY3Jvd2RfODU0eDQ4MHA1MGYxX2dvcDEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzI1MzYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0xLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI1MzQ2NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzI1MzYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0xLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI1MzQ2NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfODU0eDQ4MHA1MC9jcm93ZF84NTR4NDgwcDUwZjFfZ29wMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMjU0Nix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjUzNTQ0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMjU0Nix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjUzNTQ0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L2dvcC9jcm93ZF84NTR4NDgwcDUwL2Nyb3dkXzg1NHg0ODBwNTBmMV9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMyNTQ3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNTM1NDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMyNTQ3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNTM1NDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvZ29wL2Nyb3dkXzg1NHg0ODBwNTAvY3Jvd2RfODU0eDQ4MHA1MGYxX2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzI1NDcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0xLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI1MzU0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzI1NDcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0xLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI1MzU0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfODU0eDQ4MHA1MC9jcm93ZF84NTR4NDgwcDUwZjJfZ29wMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zOTMwNCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTc2ODQ2MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM5MzA0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzY4NDYwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfODU0eDQ4MHA1MC9jcm93ZF84NTR4NDgwcDUwZjJfZ29wMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zOTMxNCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTc2ODY2MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM5MzE0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzY4NjYwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfODU0eDQ4MHA1MC9jcm93ZF84NTR4NDgwcDUwZjJfZ29wNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zOTMxNSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTc2ODY2MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM5MzE1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzY4NjYwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfODU0eDQ4MHA1MC9jcm93ZF84NTR4NDgwcDUwZjJfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zOTMxNSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTc2ODY2MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM5MzE1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzY4NjYwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfODU0eDQ4MHA1MC9jcm93ZF84NTR4NDgwcDUwZjNfZ29wMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00NDUyMyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTU4MDgyNjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQ0NTIzLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTgwODI2NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfODU0eDQ4MHA1MC9jcm93ZF84NTR4NDgwcDUwZjNfZ29wNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00NDUyNCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTU4MDgyNjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQ0NTI0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTgwODI2NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfODU0eDQ4MHA1MC9jcm93ZF84NTR4NDgwcDUwZjNfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00NDUyNCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTU4MDgyNjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQ0NTI0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTgwODI2NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfODU0eDQ4MHA1MC9jcm93ZF84NTR4NDgwcDUwZjRfZ29wMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00Nzk0NCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ2OTcwOTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQ3OTQ0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDY5NzA5NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfODU0eDQ4MHA1MC9jcm93ZF84NTR4NDgwcDUwZjRfZ29wNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00ODMwNyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ3MzMyOTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQ4MzA3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDczMzI5NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfODU0eDQ4MHA1MC9jcm93ZF84NTR4NDgwcDUwZjRfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00ODMwNyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ3MzMyOTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQ4MzA3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDczMzI5NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfODU0eDQ4MHA1MC9jcm93ZF84NTR4NDgwcDUwZjVfZ29wNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01MjU1OCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQxMjU3NjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTUyNTU4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDEyNTc2MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfODU0eDQ4MHA1MC9jcm93ZF84NTR4NDgwcDUwZjVfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01MjU1OCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQxMjU3NjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTUyNTU4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDEyNTc2MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfODU0eDQ4MHA1MC9jcm93ZF84NTR4NDgwcDUwZjZfZ29wNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01NTYxMyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM2NDEwMDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTU1NjEzLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzY0MTAwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfODU0eDQ4MHA1MC9jcm93ZF84NTR4NDgwcDUwZjZfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01NDQ1Myx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM1NjQyMDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTU0NDUzLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzU2NDIwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfODU0eDQ4MHA1MC9jcm93ZF84NTR4NDgwcDUwZjdfZ29wNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01Nzc1Nix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMyNDI2MjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTU3NzU2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzI0MjYyNCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfODU0eDQ4MHA1MC9jcm93ZF84NTR4NDgwcDUwZjdfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01OTE3Nix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMzMjQ2ODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTU5MTc2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzMyNDY4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfODU0eDQ4MHA1MC9jcm93ZF84NTR4NDgwcDUwZjhfZ29wNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01OTQyMix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI5MjAwMDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTU5NDIyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjkyMDAwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfODU0eDQ4MHA1MC9jcm93ZF84NTR4NDgwcDUwZjhfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02MDA0NCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI5NTIyOTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTYwMDQ0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Mjk1MjI5NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9nb3AvY3Jvd2RfODU0eDQ4MHA1MC9jcm93ZF84NTR4NDgwcDUwZjlfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02NDQ1Nix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI4MjAxNzYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTY0NDU2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjgyMDE3NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9sZXZlbC9jcm93ZF8xMjgweDcyMHA1MGYzMl8yMDAwa2Jwc19sZXZlbF80LjAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTU4MDA0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5NTg0NTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1ODAwNCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTU4NDU2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L2xldmVsL2Nyb3dkXzEyODB4NzIwcDUwZjMyXzgwMDBrYnBzX2xldmVsXzQuMS5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02NzYwNDUsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9ODQzMzk2OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9sZXZlbC9jcm93ZF8xMjh4OTZwNTBmMzJfMjAwa2Jwc19sZXZlbF8yLjAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTU2ODUsd2lkdGg9MTI4LGhlaWdodD05NixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3OTY5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTU2ODUsd2lkdGg9MTI4LGhlaWdodD05NixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3OTY5NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9sZXZlbC9jcm93ZF8xNzZ4MTQ0cDUwZjMyXzIwMGticHNfbGV2ZWxfMi4wLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2MDk2LHdpZHRoPTE3NixoZWlnaHQ9MTQ0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTg0NzIwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjA5Nix3aWR0aD0xNzYsaGVpZ2h0PTE0NCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE4NDcyMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9sZXZlbC9jcm93ZF8xOTIweDEwODBwNTBmMzJfNDAwMGticHNfbGV2ZWxfNC4xLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMwMjY1Nix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Mzc2NjYwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzAyNjU2LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zNzY2NjAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L2xldmVsL2Nyb3dkXzE5MjB4MTA4OHA1MGYzMl8xMDAwMGticHNfbGV2ZWxfNS4wLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTcyNzc1MCx3aWR0aD0xOTIwLGhlaWdodD0xMDg4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTA4MDI3MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9sZXZlbC9jcm93ZF8zNTJ4Mjg4cDUwZjMyXzMwMGticHNfbGV2ZWxfMi4xLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI0NjQ3LHdpZHRoPTM1MixoZWlnaHQ9Mjg4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjkxNDk2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yNDY0Nyx3aWR0aD0zNTIsaGVpZ2h0PTI4OCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI5MTQ5NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9sZXZlbC9jcm93ZF8zODQweDIxNjBwNTBmMzJfMTIwMDBrYnBzX2xldmVsXzUuMS5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT04OTc3NDgsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTExMjA1NTQ0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0xMzg0NSwzNyArMTM4NDUsMzcgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc5ODQ4MCx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjI0NjQ2OTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvbGV2ZWwvY3Jvd2RfNjQweDQ4MHA1MGYzMl81MDBrYnBzX2xldmVsXzMuMC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00Mzc3Mix3aWR0aD02NDAsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTUzMDU2OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDM3NzIsd2lkdGg9NjQwLGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01MzA1NjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvbGV2ZWwvY3Jvd2RfNjR4NjRwNTBmMzJfMjAwa2Jwc19sZXZlbF8xLjAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA2Mzgsd2lkdGg9NjQsaGVpZ2h0PTY0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTE3MjAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDYzOCx3aWR0aD02NCxoZWlnaHQ9NjQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMTcyMDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvbGV2ZWwvY3Jvd2RfNjR4NjRwNTBmMzJfMjAwa2Jwc19sZXZlbF8yLjAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTQ4MjMsd2lkdGg9NjQsaGVpZ2h0PTY0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTY5NTEyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNDgyMyx3aWR0aD02NCxoZWlnaHQ9NjQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNjk1MTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvbGV2ZWwvY3Jvd2RfNzIweDQ4MHA1MGYzMl82MDBrYnBzX2xldmVsXzMuMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01MDY4NCx3aWR0aD03MjAsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTYxNjk2OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTA2ODQsd2lkdGg9NzIwLGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02MTY5NjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvbGV2ZWwvY3Jvd2RfNzIweDU3NnA1MGYzMl82MDBrYnBzX2xldmVsXzMuMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01MzIwNSx3aWR0aD03MjAsaGVpZ2h0PTU3NixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTY0ODQ3MixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTMyMDUsd2lkdGg9NzIwLGhlaWdodD01NzYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02NDg0NzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyXzEwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9ODYxNTAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTA2MDMxMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9ODYxNTAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTA2MDMxMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfMTBtYnBzLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTg0OTczMSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMDYwNTA3MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfMW1icHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9OTE5ODUsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTEzMzI0OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9OTE5ODUsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTEzMzI0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfMjBtYnBzLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3MTQyMzQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjE0MTEzNjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyXzRtYnBzX2FkYXB0aXZlcXAwLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM2OTMxMyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NTk5ODQ4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNjkzMTMsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDU5OTg0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfNG1icHNfYWRhcHRpdmVxcDIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzY0NTk2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ1NDA4ODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM2NDU5Nix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NTQwODgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl80bWJwc19xcGcxNi5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zOTAxNTksd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDg2MDQyNCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMTM4ODcsNyArMTM4ODcsNyBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zOTkyMTYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDk3MzYzMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfNTAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT04NTU3NSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMDUzMTIwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT04NTU3NSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMDUzMTIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl81bWJwcy5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MTU5MDYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTE4MjI1NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMTM5MDgsNyArMTM5MDgsNyBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNzc2Mjcsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDcwMzc2OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfYl9hZGFwdF8wLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM0ODY5MCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MzQyNjU2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNDg2OTAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDM0MjY1NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfYl9hZGFwdF8xLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQyNDM2Myx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01Mjg3OTY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0xMzk0NCwyMiArMTM5NDQsMjIgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTQ5MDc3MDgsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTg2MzI5Nzg0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9jcmY1MS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yODc1NCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zNDI4NTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI4NzU0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM0Mjg1NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfY3RiMTYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mzc0NjA1LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ2NjYwMjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM3NDYwNSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NjY2MDI0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9jdGIzMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNzI3NTksd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDY0MjkzNixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzcyNzU5LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ2NDI5MzYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2Zhc3RkZWNvZGUubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mzc3NjUwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ3MDQwNTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2Zhc3Rlci5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMzIzMjAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDEzODAzMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzMyMzIwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQxMzgwMzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2Zhc3QubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzQwOTAxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQyNDUyOTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM0MDkwMSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MjQ1Mjk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ncmFpbi5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01OTA4Mjgsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzM2ODgwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMTQwMDQsNyArMTQwMDQsNyBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNzg2NTEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDcxNjU2OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbWF4dHU0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NzI1MSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDQ5MDgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTcyNTEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQ0OTA4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbWF4dHU4Lm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM3Nzg5Myx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NzA3MDk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0xNDAxNiwxMyArMTQwMTYsMTMgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mzg0NTkxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ3OTA4MjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX21lcmdlMy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNzU4NDYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDY4MTUxMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mzc1ODQ2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ2ODE1MTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX21lcmdlNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNzMyMDMsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDY0ODQ3MixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzczMjAzLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ2NDg0NzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX21lcmdlNS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNzQ0NDgsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDY2NDAzMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mzc0NDQ4LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ2NjQwMzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX21pbmN1MTYubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mzk2MzM2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ5Mzc2MzIscGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTE0MDcwLDI4ICsxNDA3MCwyOCBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMjMxNTY2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE1Mzc4MDI0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9xcDM5Y2JtMTJjcjEyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM2NDEwMyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NTM0NzEyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNjQxMDMsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDUzNDcxMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfcXA0Lm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIyNDQ4NjAxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI4MDU5MDk2MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfcXA1MC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yOTUxMSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zNTIzMzYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI5NTExLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM1MjMzNixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfcXA1MWNiMTJjcjEyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIzNzg5LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI4MDc4NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjM3ODksd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjgwNzg0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9xcDUxY2IxMmNybTEyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI1NzgyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMwNTY5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjU3ODIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzA1Njk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9xcDUxY2JtMTJjcjEyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI4MTIzLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMzNDk2MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjgxMjMsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzM0OTYwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9xcDUxY2JtMTJjcm0xMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yOTY0NCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zNTM5NjgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI5NjQ0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM1Mzk2OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfcXA1MS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMzc4NSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yODA3NjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIzNzg1LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI4MDc2MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfcmVjdDAubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mzc3NjMwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ3MDM4MDgscGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTE0MTY5LDcgKzE0MTY5LDcgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTIxNjcwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTY1MDQzMjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX3ZlcnlmYXN0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMzMzYxMCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MTU0MTYwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMzM2MTAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDE1NDE2MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfdmVyeXNsb3cubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mzg4MjE5LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ4MzYxNDQscGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTE0MTk5LDI4ICsxNDE5OSwyOCBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNzg2MjYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDcxNjI1NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfd3BwMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNzU3NjEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDY4MDQ0OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mzc1NzYxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ2ODA0NDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX3plcm9sYXRlbmN5Lm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQ0MjY1Nix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01NTIwNDk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyXzEwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTY1NTg1LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMDUzMjMyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjU1ODUsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwNTMyMzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfMTBtYnBzLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTcyODQ4NSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTA4OTQ4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl8xbWJwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjUyMjksd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwNDg3ODQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2NTIyOSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjA0ODc4NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl8yMG1icHMubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTQ3OTE2Myx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTg0NzI5NjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfNG1icHNfYWRhcHRpdmVxcDAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzI3NzQwLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MDgwMTY4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMjc3NDAsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQwODAxNjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfNG1icHNfYWRhcHRpdmVxcDIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzI3ODQ4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MDgxNTIwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMjc4NDgsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQwODE1MjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfNG1icHNfcXBnMTYubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NzQ1MjU4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05Mjk5MTQ0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0xNDIzMiwxMCArMTQyMzIsMTAgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NzY5OTg5LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05NjA4MjgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyXzUwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTY1NjE0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMDUzNjAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjU2MTQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwNTM2MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfNW1icHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzY5OTA5LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NjA3MjgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNjk5MDksd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ2MDcyODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfYWxsaWRyLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3MDczOTAsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIxMzI5OTIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0xNDI4OSw3ICsxNDI4OSw3IEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM3MjUzNzU3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NjU2NTUzODQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfY3JmNTEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NjMzMDUsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTc3NDczNixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NjMzMDUsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTc3NDczNixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9jdGIxNi5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03MjQyOTUsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTkwMzcxMzYscGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTE0NDIxLDIyICsxNDQyMSwyMiBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01MzQwMjg4MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NjY3NTE5NDQ4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX3FwNTAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NjM2NzYsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTc3OTM4NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NjM2NzYsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTc3OTM4NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9xcDUxY2IxMmNyMTIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTEzMDIsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTYyNDY4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTEzMDIsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTYyNDY4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9xcDUxY2IxMmNybTEyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTU2MjAzLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02ODU5NDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTU2MjAzLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02ODU5NDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfcXA1MWNibTEyY3IxMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02MjA5Myx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzU5NTY4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02MjA5Myx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzU5NTY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX3FwNTFjYm0xMmNybTEyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTY1MTk1LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03OTgzNDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTY1MTk1LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03OTgzNDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfcXA1MS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01MTI5OCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NjI0NjU2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01MTI5OCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NjI0NjU2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX3JlY3QwLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTcyNDM0Nix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTAzNzc0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMTQ2NDksNyArMTQ2NDksNyBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTMwMDUzNTgsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl9jcmY1MS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMzA4NzEsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI4Njk2MDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIzMDg3MSx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Mjg2OTYwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl9jdGIzMi5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODg3NTg1LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzU3ODU2MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMTQ2ODgsNyArMTQ2ODgsNyBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00NDEyOTUwNzAsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEyMjEyMDQ4MTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMi9jcm93ZF8zODQweDIxNjBwNTBmMzJfbHBmX3Bwc29mc3QxLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQwOTYsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTExMjkwNDgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MDk2LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMTI5MDQ4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl9tYXhfbG9nMnBvY18xMC5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTE5Mjk2LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzk3NDkyMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMTQ3NDgsNDkgKzE0NzQ4LDQ5IEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5MTkyODgsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzOTc0ODI0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8zODQweDIxNjBwNTBmMzIvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyX3BjbTFiaXRkZXB0aDAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDA5Nix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTEyODc4NzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQwOTYsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTExMjg3ODcyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8zODQweDIxNjBwNTBmMzIvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyX3BjbTFiaXRkZXB0aDEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDA5Nix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTEyODc4NzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQwOTYsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTExMjg3ODcyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8zODQweDIxNjBwNTBmMzIvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyX3BjbTFmaWx0ZXJkaXMwLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQwOTYsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTExMjg3ODcyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MDk2LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMTI4Nzg3MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl9wY20xZmlsdGVyZGlzMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MDk2LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMTI4Nzg3MixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDA5Nix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTEyODc4NzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMi9jcm93ZF8zODQweDIxNjBwNTBmMzJfcGNtMW1heHNpemUzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQwOTYsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTExMjg5NDI0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MDk2LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMTI4OTQyNCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl9wY20xbWF4c2l6ZTQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDA5Nix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTEyODg4MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQwOTYsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTExMjg4ODAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8zODQweDIxNjBwNTBmMzIvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyX3BjbTFtYXhzaXplNS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MDk2LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMTI4Nzg3MixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDA5Nix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTEyODc4NzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMi9jcm93ZF8zODQweDIxNjBwNTBmMzJfcGNtMW1pbnNpemUzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQwOTYsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTExMjg3ODcyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MDk2LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMTI4Nzg3MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl9wY20xbWluc2l6ZTQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDA5Nix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTEyODY2MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQwOTYsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTExMjg2NjAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8zODQweDIxNjBwNTBmMzIvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyX3BjbTFtaW5zaXplNS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MDk2LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMTI4NTA4OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDA5Nix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTEyODUwODgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMi9jcm93ZF8zODQweDIxNjBwNTBmMzJfcGxhY2Viby5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMDQwOTA2LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNTQ5NTAyNCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl9wcmxsbWVyZ2UyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQwOTYsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTExMjkwNDgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MDk2LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMTI5MDQ4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl9wcmxsbWVyZ2UzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQwOTYsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTExMjkxMDQwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MDk2LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMTI5MTA0MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl9wcmxsbWVyZ2U0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQwOTYsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTExMzA0MzQ0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MDk2LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMTMwNDM0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl9wcmxsbWVyZ2U1Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQwOTYsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTExNDA5NDA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MDk2LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMTQwOTQwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl9wcm9maWxlbm9uZS5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTE5MjgyLHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzk3NDc0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMTQ4MjMsMjIgKzE0ODIzLDIyIEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI2MDAyNzU3Nix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8zODQweDIxNjBwNTBmMzIvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyX3FwNTAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjIzOTQzLHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNzgzMDI0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMjM5NDMsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI3ODMwMjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMi9jcm93ZF8zODQweDIxNjBwNTBmMzJfcXA1MWNiMTJjcjEyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4Mzc0MSx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjI4MDQ3MixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTgzNzQxLHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjgwNDcyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8zODQweDIxNjBwNTBmMzIvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyX3FwNTFjYjEyY3JtMTIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTk4MDg1LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNDU5NzY4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTgwODUsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI0NTk3NjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMi9jcm93ZF8zODQweDIxNjBwNTBmMzJfcXA1MWNibTEyY3IxMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMzc1NjMsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI5NTMyNDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIzNzU2Myx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Mjk1MzI0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl9xcDUxY2JtMTJjcm0xMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yNDQxOTUsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMwMzYxNDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI0NDE5NSx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzAzNjE0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl9xcDUxLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4MzczNyx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjI4MDQ0OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTgzNzM3LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjgwNDQ4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8zODQweDIxNjBwNTBmMzIvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyX3JlY3QwLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5MTkyODUsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzOTc0Nzg0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0xNDg1MCwxMCArMTQ4NTAsMTAgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTkyMDE5Myx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM5ODYxMzYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMi9jcm93ZF8zODQweDIxNjBwNTBmMzJfc2FvYm5kcnkxLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQwOTYsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTExMjkxMjAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MDk2LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMTI5MTIwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl9zYmgwX3NwczE1X3BwczYzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQwOTYsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTExNDgyOTEyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MDk2LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMTQ4MjkxMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl9zYmgxLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5MTkyODUsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzOTc0Nzg0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0xNDkwNCwxMyArMTQ5MDQsMTMgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTkyNzQzMSx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjQwNzY2MDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMi9jcm93ZF8zODQweDIxNjBwNTBmMzJfdHJhbnNxdWFudDEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDA5Nix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MDk2LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMi9jcm93ZF8zODQweDIxNjBwNTBmMzJfdHJhbnNza2lwMC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MDk2LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMTI4MTEyMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDA5Nix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTEyODExMjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMi9jcm93ZF8zODQweDIxNjBwNTBmMzJfdHJhbnNza2lwMF9wcHMxNS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MDk2LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMTI4MTMyMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDA5Nix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTEyODEzMjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMi9jcm93ZF8zODQweDIxNjBwNTBmMzJfdHVpbnRlcmRlcHRoMi5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTM3NDI2LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNDIwMTU0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMTQ5NzYsMTk2ICsxNDk3NiwxOTYgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjYxNDk0MSx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzI2NzQwMzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl8xMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI4NTkxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzQwODMyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yODU5MSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM0MDgzMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyXzEwbWJwcy5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03ODU2NTIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05ODA0MDk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfMW1icHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NzQyNDUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05MTE1MTIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTc0MjQ1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTExNTEyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfMjBtYnBzLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1ODA5Mjksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTc0NTA1NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyXzRtYnBzX2FkYXB0aXZlcXAwLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMzMTY1MCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQxMjkwNzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMzMTY1MCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQxMjkwNzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl80bWJwc19hZGFwdGl2ZXFwMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMjgzNDgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MDg3ODAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMjgzNDgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MDg3ODAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfNG1icHNfcXBnMTYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE4NjMzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ2NjM2MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE4NjMzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ2NjM2MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyXzRtYnBzX3FwZzY0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNzAyMSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NDYyMjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNzAyMSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NDYyMjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl80bWJwc19xcGc4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNjU2OSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NDA1NjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNjU2OSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NDA1NjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl81MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQxMTU4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDk3OTIwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MTE1OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ5NzkyMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyXzVtYnBzLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM4NzI5Mix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ4MjQ2MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9hbGxpZHIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzA1Nzc1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzgwOTczNixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzA1Nzc1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzgwOTczNixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2FsdGlkci5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMzAzMzYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MTE1NzQ0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMzAzMzYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MTE1NzQ0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfYW1wMC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTUzMjUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDI1MDA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTUzMjUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDI1MDA4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfYW1wMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTUzMjUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDI1MDA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTUzMjUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDI1MDA4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfYXVkLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNTMyMix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0MjQ5NjgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNTMyMix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0MjQ5NjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9iX2FkYXB0XzAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTAyOTU4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTI3MTAyNCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTAyOTU4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTI3MTAyNCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2JfYWRhcHRfMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMzA0NTcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNjE0MTYwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMzA0NTcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNjE0MTYwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfYmV0YTAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE1MzI1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQyNTAwOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE1MzI1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQyNTAwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2JldGE0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNTI2NSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0MjQyNDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNTI2NSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0MjQyNDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9iZXRhNi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTQ5NTIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDIwMzM2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTQ5NTIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDIwMzM2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfYmV0YTZfdGNtNi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTYwMjEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDMzNjgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTYwMjEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDMzNjgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfYmV0YW00Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNTM5NCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0MjU4NTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNTM5NCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0MjU4NTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9iZXRhbTYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE1OTI5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQzMjU0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE1OTI5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQzMjU0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2JldGFtNl90YzYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE1NDg5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQyNzAzMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE1NDg5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQyNzAzMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2Nuc3Rybl9pbnRyYS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTY0Mjcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDM4Nzg0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTY0Mjcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDM4Nzg0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfY3JhMTYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTI1ODcyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTU1NjAzMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTI1ODcyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTU1NjAzMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2NyZjAubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzM1NjI4Mix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQxOTM2OTY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfY3JmNTEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9OTQzMix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEwMTM0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9OTQzMix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEwMTM0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2N0YjE2Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNjk4Nix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NDU3ODQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNjk4Nix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NDU3ODQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9jdGIzMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTU4OTQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDMyMTIwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTU4OTQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDMyMTIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZmFzdGRlY29kZS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTU3MTQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDI5ODcyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTU3MTQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDI5ODcyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZmFzdGVyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTk3MjExLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTE5OTE4NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9OTcyMTEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMTk5MTg0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZmFzdC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT05OTY3NCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEyMjk5NjgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTk5Njc0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTIyOTk2OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2dyYWluLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4NDE4NCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyODU3NjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4NDE4NCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyODU3NjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9oYXNoX2Noa3N1bS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTYwMjksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDMzODA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTYwMjksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDMzODA4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfaGFzaF9jcmMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE1ODM3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQzMTQwOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE1ODM3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQzMTQwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2hhc2hfbWQ1Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNzE4MSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NDgyMDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNzE4MSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NDgyMDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ocmQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE1MzI1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQyNTAwOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE1MzI1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQyNTAwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2lkcjE2Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEyNzQ4Myx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE1NzY5MzYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEyNzQ4Myx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE1NzY5MzYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9pbnRyYW1pbnVzMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTUzMzQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDI1MTIwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTUzMzQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDI1MTIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbG9zc2xlc3MubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9OTg3MjcxNix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEyMzM5MjQwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX21heF9sb2cycG9jXzEwLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNTMzNix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0MjUxNDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNTMzNix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0MjUxNDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9tYXhfbG9nMnBvY18xNi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTUzNTgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDI1NDA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTUzNTgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDI1NDA4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbWF4X2xvZzJwb2NfNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTUzMjMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDI0OTY4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTUzMjMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDI0OTY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbWF4X2xvZzJwb2NfNS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTUzMjMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDI0OTY4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTUzMjMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDI0OTY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbWF4X2xvZzJwb2NfNi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTUzMjMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDI0OTY4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTUzMjMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDI0OTY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbWF4dHUxNi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTU2ODQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDI5NDgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTU2ODQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDI5NDgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbWF4dHU0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwOTkyNSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNTc1MTIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwOTkyNSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNTc1MTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9tYXh0dTgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE2NTU1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ0MDM2OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE2NTU1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ0MDM2OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX21lZGl1bS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTUzMjUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDI1MDA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTUzMjUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDI1MDA4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbWVyZ2UxLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNzExOSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NDc0MzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNzExOSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NDc0MzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9tZXJnZTMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE0ODU4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQxOTE2OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE0ODU4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQxOTE2OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX21lcmdlNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTQ3OTQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDE4MzY4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTQ3OTQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDE4MzY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbWVyZ2U1Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNDE2Myx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0MTA0ODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNDE2Myx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0MTA0ODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9taW5jdTE2Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEyNTMyNix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE1NTAwMDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEyNTMyNix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE1NTAwMDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9taW5jdTMyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE0MTEyMix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3NDc0NDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE0MTEyMix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3NDc0NDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub2RibGsubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE2MDUzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQzNDExMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE2MDUzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQzNDExMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vX3Bwc19xcF9vcHQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE1MzI4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQyNTA0OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE1MzI4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQyNTA0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vX3Bwc19yZWZsaXN0X29wdC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTUzMjgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDI1MDQ4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTUzMjgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDI1MDQ4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9fdnVpX2hyZC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTUzMjgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDI1MDQ4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTUzMjgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDI1MDQ4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfcGxhY2Viby5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMjE2MTYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNTAzNjA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMjE2MTYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNTAzNjA4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfcHJvZmlsZW5vbmUubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE1MzIyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQyNDk2OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE1MzIyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQyNDk2OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3BzbnIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc5ODc0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIzMTg3MixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc5ODc0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIzMTg3MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3FwMGNiMTJjcjEyLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTUwNzAyOTAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02MzM2MjA1NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMTUxODYsMTcyICsxNTE4NiwxNzIgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDAwMjgwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDk4Njk2MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3FwMzljYm0xMmNyMTIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA2MjEyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTMxMTA4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA2MjEyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTMxMTA4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3FwNC5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01MTcwMzcyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NjQ2MTMxMTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9xcDUwLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTkzNDcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMDAyOTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTkzNDcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMDAyOTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9xcDUxY2IxMmNyMTIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Nzk5Mix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTgzMzM2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03OTkyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9ODMzMzYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9xcDUxY2IxMmNybTEyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTg2Njcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05MTc2OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9ODY2Nyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTkxNzY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfcXA1MWNibTEyY3IxMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT04Nzk3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTM0MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTg3OTcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05MzQwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3FwNTFjYm0xMmNybTEyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTkyMDcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05ODUyMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9OTIwNyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTk4NTIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfcXA1MS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03OTg4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9ODMzMTIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTc5ODgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04MzMxMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3JlY3QwLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNTMyNSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0MjUwMDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNTMyNSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0MjUwMDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ycHRfaGRycy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTUzMjIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDI0OTY4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTUzMjIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDI0OTY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfc2FvMC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTU0NTYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDI2NjQ4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTU0NTYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDI2NjQ4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfc2JoMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTUzMjUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDI1MDA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTUzMjUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDI1MDA4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfc2xvd2VyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNzIwMix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NDg0MzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNzIwMix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NDg0MzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9zbG93Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNDY0MSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0MTY0NTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNDY0MSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0MTY0NTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9zcm5nMC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTU2NTAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTI5MDcyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTU2NTAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTI5MDcyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfc3JuZzMyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNTMyNSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0MjUwMDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNTMyNSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0MjUwMDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9zcm5nNjQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE1MzI1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQyNTAwOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE1MzI1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQyNTAwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3Nybmc4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNTY2NSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0MjkyNTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNTY2NSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0MjkyNTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9zc2ltLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2NTIyMCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwNDg2OTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2NTIyMCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwNDg2OTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9zdHJuZ2ludHJhMC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTU2Nzksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDI5NDMyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTU2Nzksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDI5NDMyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfc3VwZXJmYXN0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4MTk2Nyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyNTgwMzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4MTk2Nyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyNTgwMzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl90YzQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE1MTgxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQyMzIwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE1MTgxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQyMzIwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3RjNi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTU4Nzgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDMxOTEyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTU4Nzgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDMxOTEyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfdGNtNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTU0MTMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDI2MDk2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTU0MTMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDI2MDk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfdGNtNi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTU0OTAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDI3MDU2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTU0OTAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDI3MDU2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfdG1wX2x5cnMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE1MzMwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQyNDk2OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE1MzMwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQyNDk2OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3RtdnAwLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNjE1NSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0MzUzODQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNjE1NSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0MzUzODQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl90dWludGVyZGVwdGgyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExODI5Mix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NjIwODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExODI5Mix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NjIwODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl90dWludGVyZGVwdGg0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNjc3Myx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NDMwOTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNjc3Myx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NDMwOTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl90dWludHJhZGVwdGgyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNTQ0Mix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0MjY0NTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNTQ0Mix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0MjY0NTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl90dWludHJhZGVwdGg0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNTAzNCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0MjEzNjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNTAzNCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0MjEzNjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl90dWxpbWl0Mi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTUzMjUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDI1MDA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTUzMjUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDI1MDA4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfdHVsaW1pdDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE1MzI1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQyNTAwOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE1MzI1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQyNTAwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3VsdHJhZmFzdC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzAxOTcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMTEwODk2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzAxOTcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMTEwODk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfdmVyeWZhc3QubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9OTY1MjUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMTkwNjA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT05NjUyNSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTExOTA2MDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl92ZXJ5c2xvdy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTYyNzQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDM2ODMyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTYyNzQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDM2ODMyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfdnVpX2NvbG9yX21hdHJpeC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTUzMjksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDI1MDA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTUzMjksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDI1MDA4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfdnVpX2NvbG9yX3ByaW1fYnQyMDIwLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNTMyOSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0MjUwMDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNTMyOSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0MjUwMDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl92dWlfY29sb3JfcHJpbV9idDcwOS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTUzMjksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDI1MDA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTUzMjksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDI1MDA4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfdnVpX3RyYW5zZmVyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNTMyOSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0MjUwMDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNTMyOSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0MjUwMDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl93ZWlnaHRiMHdlaWdodHAxLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNTMyNSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0MjUwMDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNTMyNSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0MjUwMDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl93ZWlnaHRiMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTY2MDksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDQxMDU2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTY2MDksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDQxMDU2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfd2VpZ2h0cDAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE1MzI1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQyNTAwOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE1MzI1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQyNTAwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3dlaWdodHAwd2VpZ2h0YjEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE2NTk1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ0MDg4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE2NTk1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ0MDg4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3dwcDEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE1NTk3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQyODQwOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE1NTk3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQyODQwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3plcm9sYXRlbmN5Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEzNzEyNyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3MDEzODQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEzNzEyNyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3MDEzODQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl8xMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQ1ODAxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTU1OTM2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00NTgwMSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTU1NTkzNixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyXzEwbWJwcy5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT04MTA4MzYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMDExODg3MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyXzFtYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTc4MDA2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTU4NDk2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03ODAwNix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTk1ODQ5NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyXzIwbWJwcy5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjQwOTI0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjA0OTQ5NjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl80bWJwc19hZGFwdGl2ZXFwMC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNDU1NTQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MzAyODQ4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNDU1NTQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MzAyODQ4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfNG1icHNfYWRhcHRpdmVxcDIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzQzNTMwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDI3NzU0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzQzNTMwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDI3NzU0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyXzRtYnBzX3FwZzE2Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5NTA5MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI0MjIwNTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5NTA5MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI0MjIwNTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl80bWJwc19xcGc2NC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTEzNDIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzc1MjA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTEzNDIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzc1MjA4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfNG1icHNfcXBnOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTgwNzYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNDU5MzY4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTgwNzYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNDU5MzY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfNTAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00NzkxNSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTU4MjM2MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDc5MTUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01ODIzNjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl81bWJwcy5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zOTg2ODksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00OTY3MDMyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0xNTM2MywxNTcgKzE1MzYzLDE1NyBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01MzYzNDYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02NjkwODQ4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfYW1wMC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODkyNDIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzQ4OTQ0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODkyNDIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzQ4OTQ0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfYW1wMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODkyNDIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzQ4OTQ0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODkyNDIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzQ4OTQ0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfYXVkLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTIzOSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNDg5MTIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTIzOSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNDg5MTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9iX2FkYXB0XzAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTcyNjY2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjE0MjM0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTcyNjY2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjE0MjM0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2JfYWRhcHRfMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMTYzNDAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNjg3NjcyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMTYzNDAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNjg3NjcyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfYmV0YTAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5MjQyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM0ODk0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5MjQyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM0ODk0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2JldGE0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTE4Myx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNDgyMDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTE4Myx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNDgyMDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9iZXRhNi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODg0MTAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzM4NTM2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODg0MTAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzM4NTM2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfYmV0YTZfdGNtNi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODk0Nzksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzUxODgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODk0Nzksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzUxODgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfYmV0YW00Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4ODg4MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNDQ0MjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4ODg4MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNDQ0MjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9iZXRhbTYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5NjEyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM1MzU2MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5NjEyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM1MzU2MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2JldGFtNl90YzYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5ODc2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM1Njg0OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5ODc2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM1Njg0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2Nuc3Rybl9pbnRyYS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTEyMTMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzczNTg0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTEyMTMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzczNTg0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfY3JhMTYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjA5OTcyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjYwNzI1NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjA5OTcyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjYwNzI1NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2NyZjAubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NjE1MjEwNSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTc2ODg0NzM2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfY3JmNTEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTQ5MDEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNjk2ODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE0OTAxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTY5NjgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfY3RiMTYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTkwNjMzLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM2NjM2MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTkwNjMzLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM2NjM2MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2N0YjMyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTA3Myx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNDY4NTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTA3Myx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNDY4NTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mYXN0ZGVjb2RlLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5MDA3MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNTkzMTIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5MDA3MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNTkzMTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mYXN0ZXIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTY0MzAyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjAzNzgwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTY0MzAyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjAzNzgwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2Zhc3QubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTY4NzAyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjA5MjgwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTY4NzAyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjA5MjgwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2dyYWluLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMwNjQxMCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM4MTM1NjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMwNjQxMCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM4MTM1NjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9oYXNoX2Noa3N1bS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODk5NDYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzU3NzQ0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODk5NDYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzU3NzQ0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfaGFzaF9jcmMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5NzU0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM1NTM0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5NzU0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM1NTM0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2hhc2hfbWQ1Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5MTA5OCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNzIxNDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5MTA5OCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNzIxNDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ocmQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5MjQyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM0ODk0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5MjQyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM0ODk0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2lkcjE2Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIxMjE5Mix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI2MzU3NjgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIxMjE5Mix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI2MzU3NjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9pbnRyYW1pbnVzMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODkyNTEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzQ5MDU2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODkyNTEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzQ5MDU2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbG9zc2xlc3MubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTgwMzE4NTYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjUzODE2MzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9tYXhfbG9nMnBvY18xMC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODkyNTgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzQ5MTQ0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODkyNTgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzQ5MTQ0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbWF4X2xvZzJwb2NfMTYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5MjczLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM0OTM0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5MjczLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM0OTM0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX21heF9sb2cycG9jXzQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5MjM0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM0ODg1NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5MjM0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM0ODg1NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX21heF9sb2cycG9jXzUubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5MjM0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM0ODg1NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5MjM0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM0ODg1NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX21heF9sb2cycG9jXzYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5MjM0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM0ODg1NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5MjM0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM0ODg1NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX21heHR1MTYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTkxMDgyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM3MTk2MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTkxMDgyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM3MTk2MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX21heHR1NC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODA0MzIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjM4ODMyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODA0MzIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjM4ODMyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbWF4dHU4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5MTM3Nyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNzU2NDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5MTM3Nyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNzU2NDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9tZWRpdW0ubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5MjQyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM0ODk0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5MjQyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM0ODk0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX21lcmdlMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTMwMDcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzk2MDA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTMwMDcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzk2MDA4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbWVyZ2UzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5MDA0Mix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNTg5NDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5MDA0Mix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNTg5NDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9tZXJnZTQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg4OTYyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM0NTQ0OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg4OTYyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM0NTQ0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX21lcmdlNS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODg0ODgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzM5NTIwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODg0ODgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzM5NTIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbWluY3UxNi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMDE0MjYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNTAxMjU2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMDE0MjYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNTAxMjU2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbWluY3UzMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMjQ2NDMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNzkxNDcyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMjQ2NDMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNzkxNDcyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9kYmxrLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTY1Mix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNTQwNzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTY1Mix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNTQwNzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub19wcHNfcXBfb3B0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTI0NSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNDg5ODQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTI0NSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNDg5ODQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub19wcHNfcmVmbGlzdF9vcHQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5MjQ1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM0ODk4NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5MjQ1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM0ODk4NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vX3Z1aV9ocmQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5MjQ1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM0ODk4NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5MjQ1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM0ODk4NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3BsYWNlYm8ubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjAyNzMzLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjUxNzU2OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjAyNzMzLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjUxNzU2OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3Byb2ZpbGVub25lLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTIzOSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNDg5MTIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTIzOSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNDg5MTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9wc25yLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI4NjMwMix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM1NjIyMDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI4NjMwMix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM1NjIyMDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9xcDBjYjEyY3IxMi5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT05MTM3NzU1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTE0MjA1MzQ0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0xNTUzNCwyMDUgKzE1NTM0LDIwNSBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02NTk2NDEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04MjI4OTQ0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfcXAzOWNibTEyY3IxMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODE2MzMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjUzODI0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODE2MzMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjUzODI0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfcXA0Lm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTk1MzM3NzEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMTkxNTU1NjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9xcDUwLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE0NDc3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTY0NDAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNDQ3Nyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE2NDQwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3FwNTFjYjEyY3IxMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTg0MCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzMTQwOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE4NDAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzE0MDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9xcDUxY2IxMmNybTEyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEzMjAxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ4NDI0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMzIwMSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0ODQyNCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3FwNTFjYm0xMmNyMTIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTM2ODUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNTQ0NzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEzNjg1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTU0NDcyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfcXA1MWNibTEyY3JtMTIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTQ2Njcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNjY3NDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE0NjY3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTY2NzQ0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfcXA1MS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTgzNix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzMTM4NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE4MzYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzEzODQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9yZWN0MC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODkyNDIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzQ4OTQ0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODkyNDIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzQ4OTQ0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfcnB0X2hkcnMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5MjM5LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM0ODkxMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5MjM5LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM0ODkxMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3NhbzAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5MDkxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM0NzA1NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5MDkxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM0NzA1NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3NiaDEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5MjQyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM0ODk0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5MjQyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM0ODk0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3Nsb3dlci5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTgyMDAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNDYwOTEyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTgyMDAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNDYwOTEyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfc2xvdy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTA4OTIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzY5NTY4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTA4OTIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzY5NTY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfc3JuZzAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjY2ODE3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzMxODYzMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjY2ODE3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzMxODYzMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3NybmczMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODkxNDMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzQ3NzEyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODkxNDMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzQ3NzEyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfc3JuZzY0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTI0Mix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNDg5NDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTI0Mix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNDg5NDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9zcm5nOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTAxMDgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzU5NzY4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTAxMDgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzU5NzY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfc3NpbS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yNjQ2NjIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zMjkxNjk2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yNjQ2NjIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zMjkxNjk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfc3RybmdpbnRyYTAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5NjY1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM1NDIzMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5NjY1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM1NDIzMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3N1cGVyZmFzdC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yOTU2MzAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zNjc4ODI0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yOTU2MzAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zNjc4ODI0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfdGM0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTAzNyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNDYzNjgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTAzNyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNDYzNjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl90YzYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5OTQ1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM1NzcyMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5OTQ1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM1NzcyMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3RjbTQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5NTM3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM1MjYyNCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5NTM3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM1MjYyNCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3RjbTYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTkwMTgzLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM2MDY5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTkwMTgzLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM2MDY5NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3RtcF9seXJzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTI0Nix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNDg5MTIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTI0Nix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNDg5MTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl90bXZwMC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTA0MjUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzYzNzM2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTA0MjUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzYzNzM2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfdHVpbnRlcmRlcHRoMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTQzMjgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNDEyNTM2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTQzMjgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNDEyNTM2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfdHVpbnRlcmRlcHRoNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTExMjgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzcyNTIwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTExMjgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzcyNTIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfdHVpbnRyYWRlcHRoMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODkyNzEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzQ5MzIwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODkyNzEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzQ5MzIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfdHVpbnRyYWRlcHRoNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTAyMDcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzYxMDA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTAyMDcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzYxMDA4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfdHVsaW1pdDIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5MjQyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM0ODk0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5MjQyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM0ODk0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3R1bGltaXQ0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTI0Mix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNDg5NDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTI0Mix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNDg5NDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl91bHRyYWZhc3QubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mjc1NTc2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzQyODE0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mjc1NTc2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzQyODE0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3ZlcnlmYXN0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2MzQ3MCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwMjc0MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2MzQ3MCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwMjc0MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl92ZXJ5c2xvdy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTY1NzYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNDQwNjA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTY1NzYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNDQwNjA4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfdnVpX2NvbG9yX21hdHJpeC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODkyNDUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzQ4OTQ0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODkyNDUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzQ4OTQ0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfdnVpX2NvbG9yX3ByaW1fYnQyMDIwLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTI0NSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNDg5NDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTI0NSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNDg5NDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl92dWlfY29sb3JfcHJpbV9idDcwOS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODkyNDUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzQ4OTQ0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODkyNDUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzQ4OTQ0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfdnVpX3RyYW5zZmVyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTI0NSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNDg5NDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTI0NSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNDg5NDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl93ZWlnaHRiMHdlaWdodHAxLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTI0Mix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNDg5NDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTI0Mix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNDg5NDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl93ZWlnaHRiMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODk2NjIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzU0MjAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODk2NjIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzU0MjAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfd2VpZ2h0cDAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5MjQyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM0ODk0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5MjQyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM0ODk0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3dlaWdodHAwd2VpZ2h0YjEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5NjQ5LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM1NDAzMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5NjQ5LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM1NDAzMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3dwcDEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg4NzMzLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM0MjU4NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg4NzMzLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM0MjU4NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3plcm9sYXRlbmN5Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIyNzYwNCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI4MzIzMzYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIyNzYwNCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI4MzIzMzYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xMDI0eDEwMjRwNTBmMzJfMjAwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTUzMTUyLHdpZHRoPTEwMjQsaGVpZ2h0PTEwMjQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xODk3ODI0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTMxNTIsd2lkdGg9MTAyNCxoZWlnaHQ9MTAyNCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE4OTc4MjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xMDI0eDU3NnA1MGYzMl8xMTAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT04OTAwMix3aWR0aD0xMDI0LGhlaWdodD01NzYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMDk1OTYwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT04OTAwMix3aWR0aD0xMDI0LGhlaWdodD01NzYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMDk1OTYwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTAyNHg3NjhwNTBmMzJfMTUwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE4NDQ5LHdpZHRoPTEwMjQsaGVpZ2h0PTc2OCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NjQwNDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExODQ0OSx3aWR0aD0xMDI0LGhlaWdodD03NjgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDY0MDQ4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTA4MHgxNDQwcDUwZjMyXzMxMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIzMzQ4Mix3aWR0aD0xMDgwLGhlaWdodD0xNDQwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjkwMTk0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjMzNDgyLHdpZHRoPTEwODAsaGVpZ2h0PTE0NDAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yOTAxOTQ0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTA4MHgxNnA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIzOTUzLHdpZHRoPTEwODAsaGVpZ2h0PTE2LGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQxMjQ4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMzk1Myx3aWR0aD0xMDgwLGhlaWdodD0xNixmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0MTI0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzEwODB4MTkyMHA1MGYzMl80MTAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yOTc4OTQsd2lkdGg9MTA4MCxoZWlnaHQ9MTkyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM3MDc0MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI5Nzg5NCx3aWR0aD0xMDgwLGhlaWdodD0xOTIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzcwNzQwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzEwODB4NjRwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODExNyx3aWR0aD0xMDgwLGhlaWdodD02NCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwOTg5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTgxMTcsd2lkdGg9MTA4MCxoZWlnaHQ9NjQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMDk4OTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xMDg4eDE5MjBwNTBmMzJfNDEwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mjk4MDkyLHdpZHRoPTEwODgsaGVpZ2h0PTE5MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zNzA5ODcyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yOTgwOTIsd2lkdGg9MTA4OCxoZWlnaHQ9MTkyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM3MDk4NzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xMTUyeDIwNDhwNTBmMzJfNDcwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzM5NzM2LHdpZHRoPTExNTIsaGVpZ2h0PTIwNDgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MjMwNDMyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMzk3MzYsd2lkdGg9MTE1MixoZWlnaHQ9MjA0OCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQyMzA0MzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xMjgweDEyODBwNTBmMzJfMzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjMxNDk3LHdpZHRoPTEyODAsaGVpZ2h0PTEyODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yODc3NDMyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMzE0OTcsd2lkdGg9MTI4MCxoZWlnaHQ9MTI4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI4Nzc0MzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xMjgweDE2cDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjE4NDIsd2lkdGg9MTI4MCxoZWlnaHQ9MTYsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMjgwNTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIxODQyLHdpZHRoPTEyODAsaGVpZ2h0PTE2LGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTI4MDU2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTI4MHgxOTIwcDUwZjMyXzQ5MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NjE2Myx3aWR0aD0xMjgwLGhlaWdodD0xOTIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQzNTc2MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU2MTYzLHdpZHRoPTEyODAsaGVpZ2h0PTE5MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDM1NzYwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTI4MHg2NHA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3NjA0LHdpZHRoPTEyODAsaGVpZ2h0PTY0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjAzNDgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzYwNCx3aWR0aD0xMjgwLGhlaWdodD02NCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwMzQ4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzEyODB4NzIwcDUwZjMyXzE4MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE0MTMzOSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzUwMTY4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNDEzMzksd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTc1MDE2OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzEyODB4OTYwcDUwZjMyXzI0MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4MjI1Nix3aWR0aD0xMjgwLGhlaWdodD05NjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjYxNjMyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODIyNTYsd2lkdGg9MTI4MCxoZWlnaHQ9OTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjI2MTYzMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzEyOHgxMjhwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTgzNCx3aWR0aD0xMjgsaGVpZ2h0PTEyOCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE4MTQ3MixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTU4MzQsd2lkdGg9MTI4LGhlaWdodD0xMjgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xODE0NzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xMjh4MTkycDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTYxODcsd2lkdGg9MTI4LGhlaWdodD0xOTIsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xODU3ODQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2MTg3LHdpZHRoPTEyOCxoZWlnaHQ9MTkyLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTg1Nzg0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTI4eDcycDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTQ1Njcsd2lkdGg9MTI4LGhlaWdodD03MixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE2NTU0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTQ1Njcsd2lkdGg9MTI4LGhlaWdodD03MixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE2NTU0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzEyOHg5NnA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1NjgyLHdpZHRoPTEyOCxoZWlnaHQ9OTYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzk2ODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1NjgyLHdpZHRoPTEyOCxoZWlnaHQ9OTYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzk2ODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xNDQweDEwODBwNTBmMzJfMzEwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjM0Mjg2LHdpZHRoPTE0NDAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yOTEyMDAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMzQyODYsd2lkdGg9MTQ0MCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI5MTIwMDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xNDQweDE0NDBwNTBmMzJfNDEwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mjk4MTUxLHdpZHRoPTE0NDAsaGVpZ2h0PTE0NDAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zNzEwNjA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yOTgxNTEsd2lkdGg9MTQ0MCxoZWlnaHQ9MTQ0MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM3MTA2MDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xNDQweDE5MjBwNTBmMzJfNTUwMGticHMubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mzk5OTA4LHdpZHRoPTE0NDAsaGVpZ2h0PTE5MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00OTgyNTY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0xNTc0MSw2NyArMTU3NDEsNjcgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTM3MzU5LHdpZHRoPTE0NDAsaGVpZ2h0PTI1NjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02NzAwNzIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTQ0MHg5NjBwNTBmMzJfMjcwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjA0OTcxLHdpZHRoPTE0NDAsaGVpZ2h0PTk2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI1NDU1NjgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIwNDk3MSx3aWR0aD0xNDQwLGhlaWdodD05NjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNTQ1NTY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTQ0eDE0NHA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2MTI2LHdpZHRoPTE0NCxoZWlnaHQ9MTQ0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTg1MTIwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjEyNix3aWR0aD0xNDQsaGVpZ2h0PTE0NCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE4NTEyMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE0NHgxNzZwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjUyNix3aWR0aD0xNDQsaGVpZ2h0PTE3NixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5MDAyNCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTY1MjYsd2lkdGg9MTQ0LGhlaWdodD0xNzYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTAwMjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xNDR4MTkycDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTY0ODksd2lkdGg9MTQ0LGhlaWdodD0xOTIsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xODk1NjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2NDg5LHdpZHRoPTE0NCxoZWlnaHQ9MTkyLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTg5NTYwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTQ0eDI1NnA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2NjMyLHdpZHRoPTE0NCxoZWlnaHQ9MjU2LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTkxMzQ0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjYzMix3aWR0aD0xNDQsaGVpZ2h0PTI1NixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5MTM0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE0NHg5NnA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1NDkyLHdpZHRoPTE0NCxoZWlnaHQ9OTYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzcyMDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1NDkyLHdpZHRoPTE0NCxoZWlnaHQ9OTYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzcyMDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xNTM2eDIwNDhwNTBmMzJfNjIwMGticHMubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDUwMDgxLHdpZHRoPTE1MzYsaGVpZ2h0PTIwNDgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01NjA5NzQ0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTYweDI0MHA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3MTE4LHdpZHRoPTE2MCxoZWlnaHQ9MjQwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTk3NDI0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzExOCx3aWR0aD0xNjAsaGVpZ2h0PTI0MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5NzQyNCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE2eDEwODBwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMzExOCx3aWR0aD0xNixoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNjAyNCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjMxMTgsd2lkdGg9MTYsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzYwMjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xNngxMjgwcDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjQwNjIsd2lkdGg9MTYsaGVpZ2h0PTEyODAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDE5MjgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI0MDYyLHdpZHRoPTE2LGhlaWdodD0xMjgwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQxOTI4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTZ4MTZwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01NTU5LHdpZHRoPTE2LGhlaWdodD0xNixmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI2Mjk2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01NTU5LHdpZHRoPTE2LGhlaWdodD0xNixmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI2Mjk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTZ4MTkyMHA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI1Nzc4LHdpZHRoPTE2LGhlaWdodD0xOTIwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTUyNjU2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yNTc3OCx3aWR0aD0xNixoZWlnaHQ9MTkyMCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE1MjY1NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE2eDcyMHA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIyNjk1LHdpZHRoPTE2LGhlaWdodD03MjAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzMzOTIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIyNjk1LHdpZHRoPTE2LGhlaWdodD03MjAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzMzOTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xNzJ4MTcycDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTY3MjMsd2lkdGg9MTcyLGhlaWdodD0xNzIsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTI0NzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2NzIzLHdpZHRoPTE3MixoZWlnaHQ9MTcyLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTkyNDcyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTc2eDE0NHA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2MDkzLHdpZHRoPTE3NixoZWlnaHQ9MTQ0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTg0NzEyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjA5Myx3aWR0aD0xNzYsaGVpZ2h0PTE0NCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE4NDcxMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE3Nng5NnA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1NTQ2LHdpZHRoPTE3NixoZWlnaHQ9OTYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzc4ODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1NTQ2LHdpZHRoPTE3NixoZWlnaHQ9OTYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzc4ODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xOTIweDEwODBwNTBmMzJfNDEwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzA5NjM3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zODUzODgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMDk2Mzcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM4NTM4ODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xOTIweDEwODhwNTBmMzJfNDEwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzA5MzYzLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zODUwNDU2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMDkzNjMsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4OCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM4NTA0NTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xOTIweDEyODBwNTBmMzJfNDkwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU3NTIzLHdpZHRoPTE5MjAsaGVpZ2h0PTEyODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDUyNzYwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTc1MjMsd2lkdGg9MTkyMCxoZWlnaHQ9MTI4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0NTI3NjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xOTIweDE0NDBwNTBmMzJfNTUwMGticHMubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDAwMjI3LHdpZHRoPTE5MjAsaGVpZ2h0PTE0NDAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00OTg2NTYwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTkyMHgxNnA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIyMDk3LHdpZHRoPTE5MjAsaGVpZ2h0PTE2LGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTI5NjQ4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMjA5Nyx3aWR0aD0xOTIwLGhlaWdodD0xNixmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEyOTY0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE5MjB4MTkyMHA1MGYzMl83MzAwa2Jwcy5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01MzE1Njgsd2lkdGg9MTkyMCxoZWlnaHQ9MTkyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTY2MjgzMjAscGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTE1ODEwLDI1ICsxNTgxMCwyNSBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03MjYxMjEsd2lkdGg9MTkyMCxoZWlnaHQ9MjU2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTkwNjAyNDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xOTIweDY0cDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc0MTUsd2lkdGg9MTkyMCxoZWlnaHQ9NjQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMDE0MjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3NDE1LHdpZHRoPTE5MjAsaGVpZ2h0PTY0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjAxNDI0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTkyeDEyOHA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1OTg3LHdpZHRoPTE5MixoZWlnaHQ9MTI4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTgzMzg0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTk4Nyx3aWR0aD0xOTIsaGVpZ2h0PTEyOCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE4MzM4NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE5MngxNDRwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjA2Myx3aWR0aD0xOTIsaGVpZ2h0PTE0NCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE4NDMzNixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTYwNjMsd2lkdGg9MTkyLGhlaWdodD0xNDQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xODQzMzYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xOTJ4MTkycDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTcxMDcsd2lkdGg9MTkyLGhlaWdodD0xOTIsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTcyODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3MTA3LHdpZHRoPTE5MixoZWlnaHQ9MTkyLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTk3MjgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTkyeDI1NnA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2OTg5LHdpZHRoPTE5MixoZWlnaHQ9MjU2LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTk1ODA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjk4OSx3aWR0aD0xOTIsaGVpZ2h0PTI1NixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5NTgwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE5MngyODhwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzIwMyx3aWR0aD0xOTIsaGVpZ2h0PTI4OCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5ODQ4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTcyMDMsd2lkdGg9MTkyLGhlaWdodD0yODgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTg0ODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8yMDQ4eDExNTJwNTBmMzJfNDcwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzQzMzE1LHdpZHRoPTIwNDgsaGVpZ2h0PTExNTIsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00Mjc1MTY4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNDMzMTUsd2lkdGg9MjA0OCxoZWlnaHQ9MTE1MixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQyNzUxNjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8yMDQ4eDE1MzZwNTBmMzJfNjIwMGticHMubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDUyMDgyLHdpZHRoPTIwNDgsaGVpZ2h0PTE1MzYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01NjM0NzYwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0xNTg0MCwyNSArMTU4NDAsMjUgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTI0NTIwMCx3aWR0aD0yMTYwLGhlaWdodD0zODQwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTU1NDg3MjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8yMTZ4Mjg4cDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc0NjUsd2lkdGg9MjE2LGhlaWdodD0yODgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMDE3NjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3NDY1LHdpZHRoPTIxNixoZWlnaHQ9Mjg4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjAxNzYwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMjMwNHg0MDk2cDUwZjMyXzE4ODAwa2Jwcy5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNDI4NjQ3LHdpZHRoPTIzMDQsaGVpZ2h0PTQwOTYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzg0MTgwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI0MHgxNjBwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjkzNix3aWR0aD0yNDAsaGVpZ2h0PTE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5NTE0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTY5MzYsd2lkdGg9MjQwLGhlaWdodD0xNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTUxNDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8yNDB4MjQwcDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc1OTMsd2lkdGg9MjQwLGhlaWdodD0yNDAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMDMzNjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3NTkzLHdpZHRoPTI0MCxoZWlnaHQ9MjQwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjAzMzYwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMjQweDMyMHA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4MjA1LHdpZHRoPTI0MCxoZWlnaHQ9MzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjExMDA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODIwNSx3aWR0aD0yNDAsaGVpZ2h0PTMyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIxMTAwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI0MHgzNjBwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODYwNyx3aWR0aD0yNDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIxNjAzMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg2MDcsd2lkdGg9MjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMTYwMzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8yNHgzMnA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE0ODI0LHdpZHRoPTI0LGhlaWdodD0zMixmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTg0MjAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNDgyNCx3aWR0aD0yNCxoZWlnaHQ9MzIsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04NDIwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI1NjB4MTQ0MHA1MGYzMl83MzAwa2Jwcy5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01MzE1NjMsd2lkdGg9MjU2MCxoZWlnaHQ9MTQ0MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTY2MjgyNzIscGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTE1ODczLDM0ICsxNTg3MywzNCBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNDkwMDM3LHdpZHRoPTI1NjAsaGVpZ2h0PTM4NDAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xODYwOTE4NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI1NngxNDRwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjk4MCx3aWR0aD0yNTYsaGVpZ2h0PTE0NCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5NTY5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTY5ODAsd2lkdGg9MjU2LGhlaWdodD0xNDQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTU2OTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8yNTZ4MTkycDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTcyNDksd2lkdGg9MjU2LGhlaWdodD0xOTIsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTkwNTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3MjQ5LHdpZHRoPTI1NixoZWlnaHQ9MTkyLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTk5MDU2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMjU2eDI1NnA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3ODA1LHdpZHRoPTI1NixoZWlnaHQ9MjU2LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjA2MDAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzgwNSx3aWR0aD0yNTYsaGVpZ2h0PTI1NixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwNjAwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI2NHgzNTJwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODc4Nyx3aWR0aD0yNjQsaGVpZ2h0PTM1MixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIxODI3MixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg3ODcsd2lkdGg9MjY0LGhlaWdodD0zNTIsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMTgyNzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8yODgweDM4NDBwNTBmMzJfMjIxMDBrYnBzLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2OTA0ODYsd2lkdGg9Mjg4MCxoZWlnaHQ9Mzg0MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIxMTE0ODAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMjg4eDE5MnA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3NTMyLHdpZHRoPTI4OCxoZWlnaHQ9MTkyLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjAyNjAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzUzMix3aWR0aD0yODgsaGVpZ2h0PTE5MixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwMjYwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI4OHgyMTZwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzYxNyx3aWR0aD0yODgsaGVpZ2h0PTIxNixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwMzY1NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc2MTcsd2lkdGg9Mjg4LGhlaWdodD0yMTYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMDM2NTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8yODh4Mjg4cDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc5OTIsd2lkdGg9Mjg4LGhlaWdodD0yODgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMDgzMzYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3OTkyLHdpZHRoPTI4OCxoZWlnaHQ9Mjg4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjA4MzM2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMjg4eDM1MnA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5MTcxLHdpZHRoPTI4OCxoZWlnaHQ9MzUyLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIzMDcyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTE3MSx3aWR0aD0yODgsaGVpZ2h0PTM1MixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMzA3MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI4OHg1MTJwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMDkyMSx3aWR0aD0yODgsaGVpZ2h0PTUxMixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI0NDk2MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjA5MjEsd2lkdGg9Mjg4LGhlaWdodD01MTIsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNDQ5NjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8zMDcyeDQwOTZwNTBmMzJfMjQwMDBrYnBzLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4NDczOTAsd2lkdGg9MzA3MixoZWlnaHQ9NDA5NixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzMDc2MDk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0xNTkwOSw2MSArMTU5MDksNjEgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg0NzM3Nix3aWR0aD0zMTIwLGhlaWdodD00MTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjMwNzU5MjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8zMjB4MjQwcDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTgyMDEsd2lkdGg9MzIwLGhlaWdodD0yNDAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMTA5NjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4MjAxLHdpZHRoPTMyMCxoZWlnaHQ9MjQwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjEwOTYwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMzIweDMyMHA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4NDI2LHdpZHRoPTMyMCxoZWlnaHQ9MzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjEzNzYwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODQyNix3aWR0aD0zMjAsaGVpZ2h0PTMyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIxMzc2MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzMyMHg0ODBwNTBmMzJfMzAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yNjUzMyx3aWR0aD0zMjAsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMxNTA5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjY1MzMsd2lkdGg9MzIwLGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zMTUwOTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8zMngyNHA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEyNTM2LHdpZHRoPTMyLGhlaWdodD0yNCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTY5OTA0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMjUzNix3aWR0aD0zMixoZWlnaHQ9MjQsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02OTkwNCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzMyeDMycDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTU4MTIsd2lkdGg9MzIsaGVpZ2h0PTMyLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTAzNjgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1ODEyLHdpZHRoPTMyLGhlaWdodD0zMixmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTkwMzY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMzUweDM1MHA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIwMTY5LHdpZHRoPTM1MCxoZWlnaHQ9MzUwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM1NTM2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMDE2OSx3aWR0aD0zNTAsaGVpZ2h0PTM1MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNTUzNixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzM1MngyNjRwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODMzMSx3aWR0aD0zNTIsaGVpZ2h0PTI2NCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIxMjU2OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTgzMzEsd2lkdGg9MzUyLGhlaWdodD0yNjQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMTI1NjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8zNTJ4Mjg4cDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg3MzAsd2lkdGg9MzUyLGhlaWdodD0yODgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMTc1NjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4NzMwLHdpZHRoPTM1MixoZWlnaHQ9Mjg4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjE3NTYwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMzUyeDM1MnA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5NTI3LHdpZHRoPTM1MixoZWlnaHQ9MzUyLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjI3NTIwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTUyNyx3aWR0aD0zNTIsaGVpZ2h0PTM1MixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyNzUyMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzM1Nng2MzhwNTBmMzJfNDAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTEzMSx3aWR0aD0zNTYsaGVpZ2h0PTYzOCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQyMjU2OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzUxMzEsd2lkdGg9MzU2LGhlaWdodD02MzgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MjI1NjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8zNTZ4NjQwcDUwZjMyXzQwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzUxMDQsd2lkdGg9MzU2LGhlaWdodD02NDAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MjIyMjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1MTA0LHdpZHRoPTM1NixoZWlnaHQ9NjQwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDIyMjI0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMzU4eDYzNnA1MGYzMl80MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1Mjg1LHdpZHRoPTM1OCxoZWlnaHQ9NjM2LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDI0NDgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTI4NSx3aWR0aD0zNTgsaGVpZ2h0PTYzNixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQyNDQ4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzM1OHg2NDBwNTBmMzJfNDAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTA0OSx3aWR0aD0zNTgsaGVpZ2h0PTY0MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQyMTUzNixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzUwNDksd2lkdGg9MzU4LGhlaWdodD02NDAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MjE1MzYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8zNjB4MjQwcDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg1NDQsd2lkdGg9MzYwLGhlaWdodD0yNDAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMTUyNDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4NTQ0LHdpZHRoPTM2MCxoZWlnaHQ9MjQwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjE1MjQ4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMzYweDM2MHA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5ODMwLHdpZHRoPTM2MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjMxMzEyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTgzMCx3aWR0aD0zNjAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzMTMxMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzM2MHg0ODBwNTBmMzJfMzAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yNzI5MCx3aWR0aD0zNjAsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMyNDU2MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjcyOTAsd2lkdGg9MzYwLGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zMjQ1NjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8zNjB4NjM2cDUwZjMyXzQwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzUwNjUsd2lkdGg9MzYwLGhlaWdodD02MzYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MjE3NDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1MDY1LHdpZHRoPTM2MCxoZWlnaHQ9NjM2LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDIxNzQ0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMzYweDYzOHA1MGYzMl80MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1MDQzLHdpZHRoPTM2MCxoZWlnaHQ9NjM4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDIxNDU2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTA0Myx3aWR0aD0zNjAsaGVpZ2h0PTYzOCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQyMTQ1NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzM2MHg2NDBwNTBmMzJfNDAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTA1NCx3aWR0aD0zNjAsaGVpZ2h0PTY0MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQyMTYyNCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzUwNTQsd2lkdGg9MzYwLGhlaWdodD02NDAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MjE2MjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8zODQweDIxNjBwNTBmMzJfMTY1MDBrYnBzLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEyMjM0Nzksd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE1Mjc3MjA4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0xNTk3OCw3ICsxNTk3OCw3IEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4NDM0MzUsd2lkdGg9Mzg0MCxoZWlnaHQ9Mzg0MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzMDI2NjU2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMzg0eDUxMnA1MGYzMl8zMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI4NDA0LHdpZHRoPTM4NCxoZWlnaHQ9NTEyLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzM4NDk2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yODQwNCx3aWR0aD0zODQsaGVpZ2h0PTUxMixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMzODQ5NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzQwOTZ4MjMwNHA1MGYzMl8xODgwMGticHMubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTQzNTAwNSx3aWR0aD00MDk2LGhlaWdodD0yMzA0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTc5MjEyODAscGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTE1OTk2LDIwOCArMTU5OTYsMjA4IEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4NDkyNTgsd2lkdGg9NDE2MCxoZWlnaHQ9NDE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzMDk5NDMyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNDcyeDQ3MnA1MGYzMl80MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1MjAzLHdpZHRoPTQ3MixoZWlnaHQ9NDcyLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDIzNDcyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTIwMyx3aWR0aD00NzIsaGVpZ2h0PTQ3MixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQyMzQ3MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzQ4MHgzMjBwNTBmMzJfMzAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yNjg5Myx3aWR0aD00ODAsaGVpZ2h0PTMyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMxOTYwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjY4OTMsd2lkdGg9NDgwLGhlaWdodD0zMjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zMTk2MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF80ODB4MzYwcDUwZjMyXzMwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mjc0MTYsd2lkdGg9NDgwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zMjYxMzYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI3NDE2LHdpZHRoPTQ4MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzI2MTM2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNDgweDQ4MHA1MGYzMl80MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NTE5LHdpZHRoPTQ4MCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDI3NDI0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTUxOSx3aWR0aD00ODAsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQyNzQyNCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzQ4MHg2NDBwNTBmMzJfNjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00OTYyNSx3aWR0aD00ODAsaGVpZ2h0PTY0MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTYwMzc2MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDk2MjUsd2lkdGg9NDgwLGhlaWdodD02NDAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02MDM3NjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF80ODB4NzIwcDUwZjMyXzYwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTA5Nzgsd2lkdGg9NDgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02MjA2NzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTUwOTc4LHdpZHRoPTQ4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NjIwNjcyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNDgweDg0OHA1MGYzMl84MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTY0MTA2LHdpZHRoPTQ4MCxoZWlnaHQ9ODQ4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Nzg0ODcyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02NDEwNix3aWR0aD00ODAsaGVpZ2h0PTg0OCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTc4NDg3MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzQ4eDY0cDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjQyODMsd2lkdGg9NDgsaGVpZ2h0PTY0LGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQzMzEyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yNDI4Myx3aWR0aD00OCxoZWlnaHQ9NjQsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDMzMTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF81MTJ4Mjg4cDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjA4NTIsd2lkdGg9NTEyLGhlaWdodD0yODgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNDQwOTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIwODUyLHdpZHRoPTUxMixoZWlnaHQ9Mjg4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjQ0MDk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNTEyeDM4NHA1MGYzMl8zMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI4NDQ3LHdpZHRoPTUxMixoZWlnaHQ9Mzg0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzM5MDMyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yODQ0Nyx3aWR0aD01MTIsaGVpZ2h0PTM4NCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMzOTAzMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzUxMng1MTJwNTBmMzJfNTAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MjA4Nyx3aWR0aD01MTIsaGVpZ2h0PTUxMixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTUwOTUyMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDIwODcsd2lkdGg9NTEyLGhlaWdodD01MTIsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01MDk1MjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF81Mjh4NzA0cDUwZjMyXzcwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTc5NDYsd2lkdGg9NTI4LGhlaWdodD03MDQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03MDc3NjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTU3OTQ2LHdpZHRoPTUyOCxoZWlnaHQ9NzA0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzA3NzYwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNTc2eDEwMjRwNTBmMzJfMTEwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9ODgyNzIsd2lkdGg9NTc2LGhlaWdodD0xMDI0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTA4NjkzNixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9ODgyNzIsd2lkdGg9NTc2LGhlaWdodD0xMDI0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTA4NjkzNixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzU3Nng3MDRwNTBmMzJfODAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02NTI1MCx3aWR0aD01NzYsaGVpZ2h0PTcwNCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTc5OTA1NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NjUyNTAsd2lkdGg9NTc2LGhlaWdodD03MDQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03OTkwNTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF81NzZ4NzIwcDUwZjMyXzgwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NjU0MDMsd2lkdGg9NTc2LGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04MDA5NjgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTY1NDAzLHdpZHRoPTU3NixoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9ODAwOTY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNjAweDgwMHA1MGYzMl85MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTcxOTIzLHdpZHRoPTYwMCxoZWlnaHQ9ODAwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9ODgyNDcyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03MTkyMyx3aWR0aD02MDAsaGVpZ2h0PTgwMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTg4MjQ3MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzYzNngzNThwNTBmMzJfNDAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTc3NCx3aWR0aD02MzYsaGVpZ2h0PTM1OCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQzMDYwOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU3NzQsd2lkdGg9NjM2LGhlaWdodD0zNTgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MzA2MDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF82MzZ4MzYwcDUwZjMyXzQwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU3NDAsd2lkdGg9NjM2LGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MzAxNjgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NzQwLHdpZHRoPTYzNixoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDMwMTY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNjM4eDM1NnA1MGYzMl80MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1MzM4LHdpZHRoPTYzOCxoZWlnaHQ9MzU2LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDI1MTQ0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTMzOCx3aWR0aD02MzgsaGVpZ2h0PTM1NixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQyNTE0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzYzOHgzNjBwNTBmMzJfNDAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTIxMyx3aWR0aD02MzgsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQyMzU4NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzUyMTMsd2lkdGg9NjM4LGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MjM1ODQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF82NDB4MzU2cDUwZjMyXzQwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzUzMjUsd2lkdGg9NjQwLGhlaWdodD0zNTYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MjUwMDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1MzI1LHdpZHRoPTY0MCxoZWlnaHQ9MzU2LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDI1MDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNjQweDM1OHA1MGYzMl80MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1MjA3LHdpZHRoPTY0MCxoZWlnaHQ9MzU4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDIzNTEyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTIwNyx3aWR0aD02NDAsaGVpZ2h0PTM1OCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQyMzUxMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzY0MHgzNjBwNTBmMzJfNDAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTE3NSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQyMzEzNixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzUxNzUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MjMxMzYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF82NDB4NDgwcDUwZjMyXzYwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDk4OTEsd2lkdGg9NjQwLGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02MDcwODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQ5ODkxLHdpZHRoPTY0MCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NjA3MDgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNjQweDY0MHA1MGYzMl84MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTY1MTY5LHdpZHRoPTY0MCxoZWlnaHQ9NjQwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Nzk4MDQ4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02NTE2OSx3aWR0aD02NDAsaGVpZ2h0PTY0MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTc5ODA0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzY0MHg4NDhwNTBmMzJfMTAwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Nzk0MTgsd2lkdGg9NjQwLGhlaWdodD04NDgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05NzY0NTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTc5NDE4LHdpZHRoPTY0MCxoZWlnaHQ9ODQ4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTc2NDU2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNjQweDk2MHA1MGYzMl8xMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT05NTI0Nyx3aWR0aD02NDAsaGVpZ2h0PTk2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTExNzQxMjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTk1MjQ3LHdpZHRoPTY0MCxoZWlnaHQ9OTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTE3NDEyMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzY0eDEwODBwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzQwNCx3aWR0aD02NCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwMTA4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc0MDQsd2lkdGg9NjQsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMDEwODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF82NHgxMjgwcDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTczOTQsd2lkdGg9NjQsaGVpZ2h0PTEyODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMDEwNTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3Mzk0LHdpZHRoPTY0LGhlaWdodD0xMjgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjAxMDU2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNjR4MTkyMHA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3NDMxLHdpZHRoPTY0LGhlaWdodD0xOTIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjAxNjI0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzQzMSx3aWR0aD02NCxoZWlnaHQ9MTkyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwMTYyNCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzY0eDQ4cDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjM0NDMsd2lkdGg9NjQsaGVpZ2h0PTQ4LGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM4MDY0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMzQ0Myx3aWR0aD02NCxoZWlnaHQ9NDgsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzgwNjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF82NHg2NHA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE0ODIwLHdpZHRoPTY0LGhlaWdodD02NCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE2OTQ5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTQ4MjAsd2lkdGg9NjQsaGVpZ2h0PTY0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTY5NDk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNjR4NzIwcDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTY3NDksd2lkdGg9NjQsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5MjkxMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTY3NDksd2lkdGg9NjQsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5MjkxMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzY0eDk2cDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTUzOTUsd2lkdGg9NjQsaGVpZ2h0PTk2LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTc2MTg0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTM5NSx3aWR0aD02NCxoZWlnaHQ9OTYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzYxODQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF83MDR4NTI4cDUwZjMyXzcwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTc4NTIsd2lkdGg9NzA0LGhlaWdodD01MjgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03MDY1ODQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTU3ODUyLHdpZHRoPTcwNCxoZWlnaHQ9NTI4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzA2NTg0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNzA0eDU3NnA1MGYzMl84MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTY1MDk4LHdpZHRoPTcwNCxoZWlnaHQ9NTc2LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Nzk3MTYwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02NTA5OCx3aWR0aD03MDQsaGVpZ2h0PTU3NixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTc5NzE2MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzcwNHg3MDRwNTBmMzJfOTAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03MzU4OSx3aWR0aD03MDQsaGVpZ2h0PTcwNCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTkwMzI5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NzM1ODksd2lkdGg9NzA0LGhlaWdodD03MDQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05MDMyOTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF83MjB4MTI4MHA1MGYzMl8xODAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMzk1NTYsd2lkdGg9NzIwLGhlaWdodD0xMjgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTcyNzg4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTM5NTU2LHdpZHRoPTcyMCxoZWlnaHQ9MTI4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3Mjc4ODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF83MjB4MTZwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMTcxOCx3aWR0aD03MjAsaGVpZ2h0PTE2LGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTI3MjgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMTcxOCx3aWR0aD03MjAsaGVpZ2h0PTE2LGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTI3MjgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNzIweDQ4MHA1MGYzMl82MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTUwNjgxLHdpZHRoPTcyMCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NjE2OTYwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01MDY4MSx3aWR0aD03MjAsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTYxNjk2MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzcyMHg1NzZwNTBmMzJfODAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02NTM5OCx3aWR0aD03MjAsaGVpZ2h0PTU3NixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTgwMDkxMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NjUzOTgsd2lkdGg9NzIwLGhlaWdodD01NzYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04MDA5MTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF83MjB4NjRwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzMwMyx3aWR0aD03MjAsaGVpZ2h0PTY0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTk5NzM2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzMwMyx3aWR0aD03MjAsaGVpZ2h0PTY0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTk5NzM2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNzIweDcyMHA1MGYzMl8xMDAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT04MDc1NCx3aWR0aD03MjAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTk5Mjg1NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9ODA3NTQsd2lkdGg9NzIwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05OTI4NTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF83MjB4OTYwcDUwZjMyXzEzMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwMzAwNSx3aWR0aD03MjAsaGVpZ2h0PTk2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEyNzEwMDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwMzAwNSx3aWR0aD03MjAsaGVpZ2h0PTk2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEyNzEwMDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF83MngxMjhwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTIxMix3aWR0aD03MixoZWlnaHQ9MTI4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTczNzEyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTIxMix3aWR0aD03MixoZWlnaHQ9MTI4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTczNzEyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNzJ4OTZwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTI2Myx3aWR0aD03MixoZWlnaHQ9OTYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzQ1MzYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1MjYzLHdpZHRoPTcyLGhlaWdodD05NixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3NDUzNixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzc2ODB4NDMyMHA1MGYzMl8yNDAwMGticHMubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTkxOTg0MCx3aWR0aD03NjgwLGhlaWdodD00MzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM5ODE3MTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF83Njh4MTAyNHA1MGYzMl8xNTAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTg4MDAsd2lkdGg9NzY4LGhlaWdodD0xMDI0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ2ODUzNixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE4ODAwLHdpZHRoPTc2OCxoZWlnaHQ9MTAyNCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0Njg1MzYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF84MDB4NjAwcDUwZjMyXzkwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NzMzNTQsd2lkdGg9ODAwLGhlaWdodD02MDAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05MDAzNjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTczMzU0LHdpZHRoPTgwMCxoZWlnaHQ9NjAwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTAwMzYwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfODAweDgwMHA1MGYzMl8xMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT05NTQ0NCx3aWR0aD04MDAsaGVpZ2h0PTgwMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTExNzY0ODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTk1NDQ0LHdpZHRoPTgwMCxoZWlnaHQ9ODAwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTE3NjQ4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzg0OHg0ODBwNTBmMzJfODAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02NDk5NCx3aWR0aD04NDgsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTc5NTg3MixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NjQ5OTQsd2lkdGg9ODQ4LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03OTU4NzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF84NDh4NjQwcDUwZjMyXzEwMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTgxMjk3LHdpZHRoPTg0OCxoZWlnaHQ9NjQwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTk5NjQ4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT04MTI5Nyx3aWR0aD04NDgsaGVpZ2h0PTY0MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTk5OTY0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzg0OHg4NDhwNTBmMzJfMTQwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA5ODg0LHdpZHRoPTg0OCxoZWlnaHQ9ODQ4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM1Njk4NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA5ODg0LHdpZHRoPTg0OCxoZWlnaHQ9ODQ4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM1Njk4NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzh4OHA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI4MTQsd2lkdGg9OCxoZWlnaHQ9OCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTkxMzYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI4MTQsd2lkdGg9OCxoZWlnaHQ9OCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTkxMzYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF85NjB4MTI4MHA1MGYzMl8yNDAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODEyNjMsd2lkdGg9OTYwLGhlaWdodD0xMjgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjI0OTIyNCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTgxMjYzLHdpZHRoPTk2MCxoZWlnaHQ9MTI4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyNDkyMjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF85NjB4MTQ0MHA1MGYzMl8yNzAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTY4NDgsd2lkdGg9OTYwLGhlaWdodD0xNDQwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjQ0NDMzNixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTk2ODQ4LHdpZHRoPTk2MCxoZWlnaHQ9MTQ0MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI0NDQzMzYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF85NjB4NjQwcDUwZjMyXzEyMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTk1NDU5LHdpZHRoPTk2MCxoZWlnaHQ9NjQwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTE3NjY3MixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9OTU0NTksd2lkdGg9OTYwLGhlaWdodD02NDAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMTc2NjcyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfOTYweDcyMHA1MGYzMl8xMzAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDQxMTYsd2lkdGg9OTYwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMjg0ODgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDQxMTYsd2lkdGg9OTYwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMjg0ODgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfOTYweDk2MHA1MGYzMl8xODAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNDA2OTEsd2lkdGg9OTYwLGhlaWdodD05NjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzQyMDcyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNDA2OTEsd2lkdGg9OTYwLGhlaWdodD05NjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzQyMDcyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfOTZ4MTI4cDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTUzMzAsd2lkdGg9OTYsaGVpZ2h0PTEyOCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3NTE4NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTUzMzAsd2lkdGg9OTYsaGVpZ2h0PTEyOCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3NTE4NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzk2eDE0NHA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1NDk3LHdpZHRoPTk2LGhlaWdodD0xNDQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzcyNzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1NDk3LHdpZHRoPTk2LGhlaWdodD0xNDQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzcyNzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF85NngxNzZwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjIxNSx3aWR0aD05NixoZWlnaHQ9MTc2LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTg2MTQ0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjIxNSx3aWR0aD05NixoZWlnaHQ9MTc2LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTg2MTQ0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfOTZ4NjRwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNDY5MSx3aWR0aD05NixoZWlnaHQ9NjQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNjg3ODQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE0NjkxLHdpZHRoPTk2LGhlaWdodD02NCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE2ODc4NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzk2eDcycDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTQyNDAsd2lkdGg9OTYsaGVpZ2h0PTcyLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTYxNDQ4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNDI0MCx3aWR0aD05NixoZWlnaHQ9NzIsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNjE0NDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF85Nng5NnA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1NTQ2LHdpZHRoPTk2LGhlaWdodD05NixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3ODA3MixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTU1NDYsd2lkdGg9OTYsaGVpZ2h0PTk2LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTc4MDcyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3NjYWxpbmdfbGlzdC9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9kZWZzbGlzdC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMjYwMzYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDA1ODg4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzI2MDM2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQwNTg4ODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvc2NhbGluZ19saXN0L2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vc2xpc3QubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzI4ODg5LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQwOTQ1NDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMyODg4OSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MDk0NTQ0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3NjYWxpbmdfbGlzdC9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9zbGlzdF9mbGF0XzE2Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMyODkyNCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MDk0NTQ0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMjg5MjQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDA5NDU0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9zY2FsaW5nX2xpc3QvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfc2xpc3RfZmxhdF8xLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTkxNDQ2Nix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMTQxMzc4NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMTYyMDYsMTMgKzE2MjA2LDEzIEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQzMzEzMix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01Mzg3ODI0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3NjYWxpbmdfbGlzdC9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9zbGlzdF9ybmRtXzEyMF8xMzYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjQ4ODI2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMwODMzNjgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI0ODgyNix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zMDgzMzY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3NjYWxpbmdfbGlzdC9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9zbGlzdF9ybmRtXzFfMjU1Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI5MTYxOSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zNjA3MTIwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yOTE2MTksd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzYwNzEyMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9zY2FsaW5nX2xpc3QvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfc2xpc3Rfcm5kbV8yNDBfMjU1Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIzMDQwMix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yODUzMjgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMzA0MDIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Mjg1MzI4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9zY2FsaW5nX2xpc3QvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfc2xpc3RfdmVydF8xXzI1NS5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01Nzk4MDUsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzIyNjA0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMTYyNzIsNTggKzE2MjcyLDU4IEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM3ODAxODgsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ3MjMxMTIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3NjYWxpbmdfbGlzdC9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZGVmc2xpc3QubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NzM5NDQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05MDc3NDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTczOTQ0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTA3NzQ0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3NjYWxpbmdfbGlzdC9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9zbGlzdC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03NDI0NSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTkxMTUxMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NzQyNDUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05MTE1MTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvc2NhbGluZ19saXN0L2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9zbGlzdF9mbGF0XzE2Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTc0MjgxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTExNTEyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03NDI4MSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTkxMTUxMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9zY2FsaW5nX2xpc3QvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3NsaXN0X2ZsYXRfMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODMxNzEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjcyNjA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODMxNzEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjcyNjA4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3NjYWxpbmdfbGlzdC9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfc2xpc3Rfcm5kbV8xXzE2Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTgzODMxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTAyMTU2OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9ODM4MzEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMDIxNTY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3NjYWxpbmdfbGlzdC9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfc2xpc3Rfcm5kbV8xMjBfMTM2Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTU5NzAyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzE5MzM2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01OTcwMix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTcxOTMzNixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9zY2FsaW5nX2xpc3QvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3NsaXN0X3JuZG1fMV8yNTUubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Njk0MzIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04Mjk3ODQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTY5NDMyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9ODI5Nzg0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3NjYWxpbmdfbGlzdC9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfc2xpc3Rfcm5kbV8yNDBfMjU1Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTU0MjM4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NjUxMjQ4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01NDIzOCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTY1MTI0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9zY2FsaW5nX2xpc3QvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3NsaXN0X3ZlcnRfMV8yNTUubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE2Mzg3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQzMzMyMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE2Mzg3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQzMzMyMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9zY2FsaW5nX2xpc3QvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2RlZnNsaXN0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1MjgwOCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE4OTM1MzYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1MjgwOCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE4OTM1MzYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvc2NhbGluZ19saXN0L2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub3NsaXN0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1NDkyMix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5MTk5NDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1NDkyMix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5MTk5NDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvc2NhbGluZ19saXN0L2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9zbGlzdF9mbGF0XzE2Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1NDk1Nix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5MTk5NDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1NDk1Nix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5MTk5NDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvc2NhbGluZ19saXN0L2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9zbGlzdF9mbGF0XzEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mzc0MDUzLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDY1ODYyNCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mzc0MDUzLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDY1ODYyNCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9zY2FsaW5nX2xpc3QvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3NsaXN0X3JuZG1fMV8xNi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODMyNTAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjY0Mjk2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODMyNTAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjY0Mjk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3NjYWxpbmdfbGlzdC9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfc2xpc3Rfcm5kbV8xMjBfMTM2Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExODQ4MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NTQwNTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExODQ4MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NTQwNTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvc2NhbGluZ19saXN0L2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9zbGlzdF9ybmRtXzFfMjU1Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE0MjIzNyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3Mzk4NDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE0MjIzNyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3Mzk4NDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvc2NhbGluZ19saXN0L2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9zbGlzdF9ybmRtXzI0MF8yNTUubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA3ODkxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTMyMTg5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA3ODkxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTMyMTg5NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9zY2FsaW5nX2xpc3QvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3NsaXN0X3ZlcnRfMV8yNTUubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjM4MTcwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Mjk1NTYwOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjM4MTcwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Mjk1NTYwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9zbGljZXNfdGlsZXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfMTI4Ynl0ZV9kZXBzbGljZXNfMTZDVEJzX3NsaWNlLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3MTMyMzYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTA2OTkxMjAscGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTE2NDA0LDEwICsxNjQwNCwxMCBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00OTUwNDcsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzA4NTQyNCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9zbGljZXNfdGlsZXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl8xMDI0Ynl0ZV9zbGljZXMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzA5OCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTA3NjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMwOTgsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEwNzYwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3NsaWNlc190aWxlcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyXzEyOGJ5dGVfZGVwc2xpY2VzXzE2Q1RCc19zbGljZS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMTc4MCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTI3NTIwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMTc4MCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTI3NTIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3NsaWNlc190aWxlcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyXzE2Y3Ric19wZXJkcHNsaWNlXzI0Y3Ric19wZXJzbGljZV93cHAubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU4Mzg2OSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIzOTA1NzYscGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTE2NDI1LDM0ICsxNjQyNSwzNCBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yNTQyMjQ4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNTg4MDQ0MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9zbGljZXNfdGlsZXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl8xdGlsZV9wZXJyb3cubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NjYxOSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzI3NjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTY2MTksd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMyNzYwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3NsaWNlc190aWxlcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyXzIwNDhieXRlX3NsaWNlcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMDk4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMDc2MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzA5OCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTA3NjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvc2xpY2VzX3RpbGVzL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfMjU2Ynl0ZV9kcHNsaWNlc18xMDI0Ynl0ZXNfc2xpY2UubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzEwOCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTA4MjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMxMDgsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEwODI0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3NsaWNlc190aWxlcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyXzI1NmJ5dGVfZHBzbGljZXNfMTAyNGJ5dGVzX3NsaWNlX3dwcC5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02NDc5Mjcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQwNDA5MzYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvc2xpY2VzX3RpbGVzL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfMjU2Ynl0ZV9zbGljZXMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzEzNyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTEwMDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMxMzcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTExMDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3NsaWNlc190aWxlcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyXzJzbGljZXMubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9ODU4NDk5LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01MzU3MDE2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3NsaWNlc190aWxlcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyXzJzbGljZXNfcGVycm93Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIyNzA1LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzMzMDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIyNzA1LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzMzMDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvc2xpY2VzX3RpbGVzL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfMnRpbGVjb2xzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM0Mjksd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEyODI0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNDI5LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMjgyNCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9zbGljZXNfdGlsZXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl8ydGlsZXJvd3NfMnNsaWNlcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zODA4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNTE5MixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzgwOCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTUxOTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvc2xpY2VzX3RpbGVzL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfMnRpbGVyb3dzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM0NDksd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEyOTQ0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNDQ5LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMjk0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9zbGljZXNfdGlsZXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl8yeDJ0aWxlc18xNmN0YnNfcGVyZHBzbGljZV8yNGN0YnNfcGVyc2xpY2VfY3RiMzIubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzgwNzc3Nix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM3OTAwMDAscGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTE2NDYxLDQwICsxNjQ2MSw0MCBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zODAyNjU4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzc1ODAwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9zbGljZXNfdGlsZXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl8yeDJ0aWxlc181MTJieXRlc19wZXJzbGljZS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01MzAwLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNDUxMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTMwMCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjQ1MTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvc2xpY2VzX3RpbGVzL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfMngydGlsZXNfNWN0YnNfcGVyc2xpY2UubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTczNDIsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM0OTc3NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTczNDIsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM0OTc3NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9zbGljZXNfdGlsZXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl8yeDJ0aWxlcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MTQ2LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzMwNCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDE0Nix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTczMDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvc2xpY2VzX3RpbGVzL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfMngydGlsZXNfbm9scGZibmRyeS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MTQ2LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzMwNCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDE0Nix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTczMDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvc2xpY2VzX3RpbGVzL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfNGN0YnNfcGVyZHBzbGljZV8xMDI0Ynl0ZXNfc2xpY2UubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NzEzOTEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQzNzU5MixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NzEzOTEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQzNzU5MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9zbGljZXNfdGlsZXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl80Y3Ric19wZXJkcHNsaWNlXzE2cGVyc2xpY2Vfbm9scGZibmRyeS5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yNTE1MjMyLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNTcxMTYwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9zbGljZXNfdGlsZXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl80Y3Ric19wZXJzbGljZV9ub2xwZmJuZHJ5Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTcwNjI4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MzI4MjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTcwNjI4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MzI4MjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvc2xpY2VzX3RpbGVzL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfNWN0YnNfcGVyZHBzbGljZV93cHBfc3BzMV9wcHM3Lm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI0OTQ5NzIsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE1NTg0OTY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3NsaWNlc190aWxlcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2E0c2xpY2VzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMwOTgsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEwNzYwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMDk4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMDc2MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9zbGljZXNfdGlsZXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ndDFfc2xpY2VzX3BlcnJvdy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMzk1NSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Nzg2MTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEzOTU1LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03ODYxNixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9zbGljZXNfdGlsZXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9sdDFfZHBzbGljZXNfcGVycm93X2x0MV9zbGljZXNfcGVyMnJvdy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTA1NSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NjA0ODgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExMDU1LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02MDQ4OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9zbGljZXNfdGlsZXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9sdDFfZHBzbGljZXNfcGVycm93X2x0MV9zbGljZXNfcGVycm93Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3MTU5LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05ODY0MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTcxNTksd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTk4NjQwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3NsaWNlc190aWxlcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2x0MV9kcHNsaWNlc19wZXJyb3dfbHQxX3NsaWNlc19wZXJyb3dfd3BwLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMyODY1Mzksd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwNTMyMjY0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0xNjUwMywzNCArMTY1MDMsMzQgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzQ2NDAzNSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjE2NDE2MDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvc2xpY2VzX3RpbGVzL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbHQxX3NsaWNlc19wZXJyb3cubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTMzMDYsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTc0NTYwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMzMwNix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzQ1NjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvc2xpY2VzX3RpbGVzL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbHQxX3NsaWNlc19wZXJyb3dfbm9scGZibmRyeS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMjk0MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzIyODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEyOTQxLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03MjI4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9zbGljZXNfdGlsZXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9tYXgxMjhzbGljZXNfbm9scGZibmRyeS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03MDYyOCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDMyODI0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03MDYyOCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDMyODI0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3NsaWNlc190aWxlcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX21heDY0c2xpY2VzX25vbHBmYm5kcnkubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mzg2MDIsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzMjY1NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mzg2MDIsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzMjY1NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9zbGljZXNfdGlsZXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub251bmlmb3JtXzR4MnRpbGVfcm93c19jb2xzX25vbHBmYm5kcnkubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NjQxNjAyLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MDAxMzg0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3NsaWNlc190aWxlcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX3NsaWNlcm93c19kcHNsaWNlLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwNzIwLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01ODQwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA3MjAsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTU4NDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3NsaWNlc190aWxlcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX3NsaWNlcm93cy5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMTY1MTQwLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzUyMzUyMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9zbGljZXNfdGlsZXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9zbGljZXJvd3Nfbm9scGZibmRyeS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMjkwMyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzIwNDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEyOTAzLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03MjA0MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9zbGljZXNfdGlsZXMvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl8xMDI0Ynl0ZV9zbGljZXMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDA5Nix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTUyOTc4ODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQwOTYsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE1Mjk3ODgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3NsaWNlc190aWxlcy9jcm93ZF8zODQweDIxNjBwNTBmMzIvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyXzEyOGJ5dGVfZGVwc2xpY2VzXzE2Q1RCc19zbGljZS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MDk2LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzQ5MzI4MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQwOTYsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNDkzMjgwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9zbGljZXNfdGlsZXMvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl8xNmN0YnNfcGVyZHBzbGljZV8yNGN0YnNfcGVyc2xpY2Vfd3BwLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIxNTg4NTk4LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzQ5MjAxMzYscGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTE2NTUxLDE2ICsxNjU1MSwxNiBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yODMyNDE4LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzY5NDAwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9zbGljZXNfdGlsZXMvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl8yMDQ4Ynl0ZV9zbGljZXMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDA5Nix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTUwNTQ3MTIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQwOTYsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE1MDU0NzEyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3NsaWNlc190aWxlcy9jcm93ZF8zODQweDIxNjBwNTBmMzIvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyXzI1NmJ5dGVfZHBzbGljZXNfMTAyNGJ5dGVzX3NsaWNlLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQwOTYsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE4MDk3MzIwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MDk2LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xODA5NzMyMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9zbGljZXNfdGlsZXMvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl8yNTZieXRlX2Rwc2xpY2VzXzEwMjRieXRlc19zbGljZV93cHAubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjkwMzU0Nix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTgxMzg1NjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvc2xpY2VzX3RpbGVzL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMi9jcm93ZF8zODQweDIxNjBwNTBmMzJfMjU2Ynl0ZV9zbGljZXMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDA5Nix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTgyOTM5MTIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQwOTYsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE4MjkzOTEyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3NsaWNlc190aWxlcy9jcm93ZF8zODQweDIxNjBwNTBmMzIvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyXzJzbGljZXNfcGVycm93Lm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIxNTMxOTU5LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzQ1NjYxMzYscGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTE2NTkzLDE5ICsxNjU5MywxOSBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yODMzNjM3LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzcwMTYyNCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9zbGljZXNfdGlsZXMvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl80Y3Ric19wZXJkcHNsaWNlXzEwMjRieXRlc19zbGljZS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MDk2LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzY5NTM2MTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQwOTYsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNjk1MzYxNixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9zbGljZXNfdGlsZXMvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl80Y3Ric19wZXJkcHNsaWNlXzE2cGVyc2xpY2Vfbm9scGZibmRyeS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MDk2LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzU3Mzg0ODgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQwOTYsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNTczODQ4OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9zbGljZXNfdGlsZXMvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl80Y3Ric19wZXJzbGljZV9ub2xwZmJuZHJ5Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQwOTYsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNjYxMTQxNixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDA5Nix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM2NjExNDE2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3NsaWNlc190aWxlcy9jcm93ZF8zODQweDIxNjBwNTBmMzIvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyXzVjdGJzX3BlcmRwc2xpY2Vfd3BwX3NwczFfcHBzNy5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMTUzNzAxNix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM0NTk3NzM2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3NsaWNlc190aWxlcy9jcm93ZF8zODQweDIxNjBwNTBmMzIvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyX2E0c2xpY2VzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQwOTYsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3MTk2NzY4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MDk2LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzE5Njc2OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9zbGljZXNfdGlsZXMvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl9ndDFfc2xpY2VzX3BlcnJvdy5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT05ODIyMjA4LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMjgwMDAyNDAscGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTE2NjE0LDcgKzE2NjE0LDcgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTk0NzI2NDUsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEyMTY5NTQyNCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9zbGljZXNfdGlsZXMvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl9sdDFfZHBzbGljZXNfcGVycm93X2x0MV9zbGljZXNfcGVycm93Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQwOTYsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEyMjA5NjMzNixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDA5Nix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTIyMDk2MzM2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3NsaWNlc190aWxlcy9jcm93ZF8zODQweDIxNjBwNTBmMzIvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyX2x0MV9kcHNsaWNlc19wZXJyb3dfbHQxX3NsaWNlc19wZXJyb3dfd3BwLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5NTQ1NTU5LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMjIxNTExMzYscGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTE2NjIzLDIyICsxNjYyMywyMiBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTU0NzAwMix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTIyMTYwMTUyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3NsaWNlc190aWxlcy9jcm93ZF8zODQweDIxNjBwNTBmMzIvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyX2x0MV9zbGljZXNfcGVycm93Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQwOTYsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEyMjA4NDY3MixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDA5Nix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTIyMDg0NjcyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3NsaWNlc190aWxlcy9jcm93ZF8zODQweDIxNjBwNTBmMzIvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyX2x0MV9zbGljZXNfcGVycm93X25vbHBmYm5kcnkubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDA5Nix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTIyMDc5NDU2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MDk2LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMjIwNzk0NTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvc2xpY2VzX3RpbGVzL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMi9jcm93ZF8zODQweDIxNjBwNTBmMzJfbWF4MTI4c2xpY2VzX25vbHBmYm5kcnkubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDA5Nix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM0OTI0NjcyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MDk2LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzQ5MjQ2NzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvc2xpY2VzX3RpbGVzL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMi9jcm93ZF8zODQweDIxNjBwNTBmMzJfbWF4NjRzbGljZXNfbm9scGZibmRyeS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MDk2LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzQ1NDU2NDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQwOTYsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNDU0NTY0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9zbGljZXNfdGlsZXMvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl9ub251bmlmb3JtXzR4MnRpbGVfcm93c19jb2xzX25vbHBmYm5kcnkubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mjg2ODM5Nyx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTc5MTg4NDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvc2xpY2VzX3RpbGVzL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMi9jcm93ZF8zODQweDIxNjBwNTBmMzJfc2xpY2Vyb3dzX2Rwc2xpY2UubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDA5Nix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTIxNzEzMTEyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MDk2LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMjE3MTMxMTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvc2xpY2VzX3RpbGVzL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMi9jcm93ZF8zODQweDIxNjBwNTBmMzJfc2xpY2Vyb3dzLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5NTMzNTI5LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMjIwNzU5NTIscGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTE2NjQ3LDE5ICsxNjY0NywxOSBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTUzNzk5Nix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTIyMTAzODcyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3NsaWNlc190aWxlcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfMTAyNGJ5dGVfc2xpY2VzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIyODAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01NjU2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMjgwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTY1NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9zbGljZXNfdGlsZXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyXzEyOGJ5dGVfZGVwc2xpY2VzXzE2Q1RCc19zbGljZS5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02NTc5OTcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MTAzODgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3NsaWNlc190aWxlcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfMjA0OGJ5dGVfc2xpY2VzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIyODAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01NjU2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMjgwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTY1NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9zbGljZXNfdGlsZXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyXzI1NmJ5dGVfZHBzbGljZXNfMTAyNGJ5dGVzX3NsaWNlLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI3MzQ1Nix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3MDA1MDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI3MzQ1Nix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3MDA1MDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvc2xpY2VzX3RpbGVzL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl8yNTZieXRlX3NsaWNlcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMjgwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTY1NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjI4MCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTU2NTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvc2xpY2VzX3RpbGVzL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl80Y3Ric19wZXJkcHNsaWNlXzEwMjRieXRlc19zbGljZS5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDUxNjM0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NjU2NDExMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMTY2NzEsMTAgKzE2NjcxLDEwIEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTg0MDYwNyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTUyNDUyMDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvc2xpY2VzX3RpbGVzL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9hNHNsaWNlcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMjgwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTY1NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjI4MCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTU2NTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvc2xpY2VzX3RpbGVzL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ndDFfc2xpY2VzX3BlcnJvdy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03MjU4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzY3NjgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTcyNTgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zNjc2OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi8xMGJpdC9zbGljZXNfdGlsZXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2x0MV9zbGljZXNfcGVycm93Lm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTUyMjU5OCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMyNTc2NDAscGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTE2NjgzLDEwICsxNjY4MywxMCBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01MjA3NDIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zMjQ2MDQwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3NsaWNlc190aWxlcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbWF4MTI4c2xpY2VzX25vbHBmYm5kcnkubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTY3Nzgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zNDYyNjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTU2Nzc4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzQ2MjY0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzEwYml0L3NsaWNlc190aWxlcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbWF4NjRzbGljZXNfbm9scGZibmRyeS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yOTcxMyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3NzExMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mjk3MTMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzcxMTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvMTBiaXQvc2xpY2VzX3RpbGVzL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9zbGljZXJvd3NfZHBzbGljZS5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02OTkwMzUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MzYwMzY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0xNjc4MiwzNyArMTY3ODIsMzcgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTU5NDA1MCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTYwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI1NDMwNDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9jb25md2luZG93L2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2NuZnduZHdfaDMydjMyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI0OTksd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzAwOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjQ5OSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03MDA4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvY29uZndpbmRvdy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9jbmZ3bmR3X2g2NHY2NC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMzEwNTgsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjA2MDQ5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzMxMDU4LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwNjA0OTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9jb25md2luZG93L2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2NuZnduZHdfaDcydjU2Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI2MzAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzgyNCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjYzMCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03ODI0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvY29uZndpbmRvdy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9jbmZ3bmR3X2wwcjJ0MGIyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI0MzEsd2lkdGg9MTI3OCxoZWlnaHQ9NzE4LGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NjU5MixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjQzMSx3aWR0aD0xMjc4LGhlaWdodD03MTgsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02NTkyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvY29uZndpbmRvdy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9jbmZ3bmR3X2wxNnIxNnQxNmIxNi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yNDM1LHdpZHRoPTEyNDgsaGVpZ2h0PTY4OCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTY1OTIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI0MzUsd2lkdGg9MTI0OCxoZWlnaHQ9Njg4LGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NjU5MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L2NvbmZ3aW5kb3cvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfY25md25kd19sMnIwdDBiMC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yNDMwLHdpZHRoPTEyNzgsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTY1OTIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI0MzAsd2lkdGg9MTI3OCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NjU5MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L2NvbmZ3aW5kb3cvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfY25md25kd19sMnIwdDJiMC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yNDMxLHdpZHRoPTEyNzgsaGVpZ2h0PTcxOCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTY1OTIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI0MzEsd2lkdGg9MTI3OCxoZWlnaHQ9NzE4LGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NjU5MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L2NvbmZ3aW5kb3cvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfY25md25kd19sNHI0dDhiOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yNDMyLHdpZHRoPTEyNzIsaGVpZ2h0PTcwNCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTY1OTIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI0MzIsd2lkdGg9MTI3MixoZWlnaHQ9NzA0LGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NjU5MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L2NvbmZ3aW5kb3cvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfY25md25kd19sNjhyNjh0NjBiNjAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjQzNix3aWR0aD0xMTQ0LGhlaWdodD02MDAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02NTkyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yNDM2LHdpZHRoPTExNDQsaGVpZ2h0PTYwMCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTY1OTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9jb25md2luZG93L2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfY25md25kd19oMTZ2MTYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mjk4OCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTAwNjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI5ODgsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEwMDY0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvY29uZndpbmRvdy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2NuZnduZHdfaDE2djgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mjc2OCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9ODY4OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mjc2OCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9ODY4OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L2NvbmZ3aW5kb3cvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl9jbmZ3bmR3X2gxNnYxNi5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMjgxODY2LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04MDAzMDQ4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0xNjgzOSwxODQgKzE2ODM5LDE4NCBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMjgxOTc0LHdpZHRoPTM4MzgsaGVpZ2h0PTIxNTgsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04MDAzNzM2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzEyODB4NzIwcDUwL2Nyb3dkXzEyODB4NzIwcDUwZjEwX2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc2MDAxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTY5OTk0ODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3NjAwMSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02OTk5NDgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzEyODB4NzIwcDUwL2Nyb3dkXzEyODB4NzIwcDUwZjExX2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTgxODUzLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTY1NzU1MjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4MTg1Myx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02NTc1NTIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzEyODB4NzIwcDUwL2Nyb3dkXzEyODB4NzIwcDUwZjEyX2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg2ODY2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTYxOTQyNjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4Njg2Nix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02MTk0MjY0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzEyODB4NzIwcDUwL2Nyb3dkXzEyODB4NzIwcDUwZjEzX2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTkzMjc4LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTU5MTQ3MDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5MzI3OCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01OTE0NzA0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzEyODB4NzIwcDUwL2Nyb3dkXzEyODB4NzIwcDUwZjE0X2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTk2NjM2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTU1ODgwNTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5NjYzNix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01NTg4MDU2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzEyODB4NzIwcDUwL2Nyb3dkXzEyODB4NzIwcDUwZjE1X2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjA0MDY4LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTU0MTM2MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIwNDA2OCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01NDEzNjAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzEyODB4NzIwcDUwL2Nyb3dkXzEyODB4NzIwcDUwZjE2X2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjA2OTA1LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTUxNDYwNzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIwNjkwNSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01MTQ2MDcyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzEyODB4NzIwcDUwL2Nyb3dkXzEyODB4NzIwcDUwZjFfZ29wMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT04MDA1Nyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0xLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTYzMzY0MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9ODAwNTcsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02MzM2NDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9nb3AvY3Jvd2RfMTI4MHg3MjBwNTAvY3Jvd2RfMTI4MHg3MjBwNTBmMV9nb3AyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTgwMDY4LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NjMzNzIwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT04MDA2OCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0xLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTYzMzcyMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L2dvcC9jcm93ZF8xMjgweDcyMHA1MC9jcm93ZF8xMjgweDcyMHA1MGYxX2dvcDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9ODAwNjcsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02MzM3MjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTgwMDY3LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NjMzNzIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzEyODB4NzIwcDUwL2Nyb3dkXzEyODB4NzIwcDUwZjFfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT04MDA2OSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0xLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTYzMzcyMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9ODAwNjksd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02MzM3MjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9nb3AvY3Jvd2RfMTI4MHg3MjBwNTAvY3Jvd2RfMTI4MHg3MjBwNTBmMl9nb3AxLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTk4MTM1LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5NDUxMDAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT05ODEzNSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTQ1MTAwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L2dvcC9jcm93ZF8xMjgweDcyMHA1MC9jcm93ZF8xMjgweDcyMHA1MGYyX2dvcDIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9OTgxNDYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTk0NTMwMDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTk4MTQ2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5NDUzMDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzEyODB4NzIwcDUwL2Nyb3dkXzEyODB4NzIwcDUwZjJfZ29wNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT05ODE0NSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTQ1MzAwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9OTgxNDUsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTk0NTMwMDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9nb3AvY3Jvd2RfMTI4MHg3MjBwNTAvY3Jvd2RfMTI4MHg3MjBwNTBmMl9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTk4MTQ3LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5NDUzMDAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT05ODE0Nyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTQ1MzAwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L2dvcC9jcm93ZF8xMjgweDcyMHA1MC9jcm93ZF8xMjgweDcyMHA1MGYzX2dvcDIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTExNDAwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NzI1MjAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTE0MDAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ3MjUyMDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9nb3AvY3Jvd2RfMTI4MHg3MjBwNTAvY3Jvd2RfMTI4MHg3MjBwNTBmM19nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExMTM5OSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDcyNTIwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTExMzk5LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NzI1MjAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzEyODB4NzIwcDUwL2Nyb3dkXzEyODB4NzIwcDUwZjNfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTE0MDEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ3MjUyMDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExMTQwMSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDcyNTIwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L2dvcC9jcm93ZF8xMjgweDcyMHA1MC9jcm93ZF8xMjgweDcyMHA1MGY0X2dvcDIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTIwNjc4LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTExOTcwNDk2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMjA2Nzgsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTE5NzA0OTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9nb3AvY3Jvd2RfMTI4MHg3MjBwNTAvY3Jvd2RfMTI4MHg3MjBwNTBmNF9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEyMTkwMyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMjA5MzA5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTIxOTAzLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEyMDkzMDk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzEyODB4NzIwcDUwL2Nyb3dkXzEyODB4NzIwcDUwZjRfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMjE5MDUsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTIwOTMwOTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEyMTkwNSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMjA5MzA5NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L2dvcC9jcm93ZF8xMjgweDcyMHA1MC9jcm93ZF8xMjgweDcyMHA1MGY1X2dvcDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTMzOTAyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEwNjMzNDQwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMzM5MDIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTA2MzM0NDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9nb3AvY3Jvd2RfMTI4MHg3MjBwNTAvY3Jvd2RfMTI4MHg3MjBwNTBmNV9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEzMzkwNCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMDYzMzQ0MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTMzOTA0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEwNjMzNDQwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzEyODB4NzIwcDUwL2Nyb3dkXzEyODB4NzIwcDUwZjZfZ29wNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNDEwNDIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTMzNjQwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTQxMDQyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTkzMzY0MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9nb3AvY3Jvd2RfMTI4MHg3MjBwNTAvY3Jvd2RfMTI4MHg3MjBwNTBmNl9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE0MDE3MCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05Mjc4NjY0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNDAxNzAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTI3ODY2NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L2dvcC9jcm93ZF8xMjgweDcyMHA1MC9jcm93ZF8xMjgweDcyMHA1MGY3X2dvcDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTQ2NDU1LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTgzMTEyNTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE0NjQ1NSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04MzExMjU2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzEyODB4NzIwcDUwL2Nyb3dkXzEyODB4NzIwcDUwZjdfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTI4NzYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9ODY3ODk2OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTUyODc2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTg2Nzg5NjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9nb3AvY3Jvd2RfMTI4MHg3MjBwNTAvY3Jvd2RfMTI4MHg3MjBwNTBmOF9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1MDUwNCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03NDc0MjAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTA1MDQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzQ3NDIwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L2dvcC9jcm93ZF8xMjgweDcyMHA1MC9jcm93ZF8xMjgweDcyMHA1MGY4X2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTU3NzMyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTc4MzY2OTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1NzczMix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03ODM2Njk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzEyODB4NzIwcDUwL2Nyb3dkXzEyODB4NzIwcDUwZjlfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzA0NDAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzUzMDU3NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTcwNDQwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTc1MzA1NzYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9nb3AvY3Jvd2RfMTkyMHgxMDgwcDUwL2Nyb3dkXzE5MjB4MTA4MHA1MGYxMF9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4ODMxMSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzQ5MTg4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg4MzExLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03NDkxODgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmMTFfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTU0Njgsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTcwNzA2MTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5NTQ2OCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzA3MDYxNixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L2dvcC9jcm93ZF8xOTIweDEwODBwNTAvY3Jvd2RfMTkyMHgxMDgwcDUwZjEyX2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg1MzY2LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02MTQ0MjY0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODUzNjYsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTYxNDQyNjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9nb3AvY3Jvd2RfMTkyMHgxMDgwcDUwL2Nyb3dkXzE5MjB4MTA4MHA1MGYxM19nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5NDg5OSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTk2NDU4NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTk0ODk5LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01OTY0NTg0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmMTRfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTk1MDUsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTU2NzAwMjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5OTUwNSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTY3MDAyNCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L2dvcC9jcm93ZF8xOTIweDEwODBwNTAvY3Jvd2RfMTkyMHgxMDgwcDUwZjE1X2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjEyMjQ1LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01NjMxNjQ4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMTIyNDUsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTU2MzE2NDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9nb3AvY3Jvd2RfMTkyMHgxMDgwcDUwL2Nyb3dkXzE5MjB4MTA4MHA1MGYxNl9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIxNDI0Nyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTMyOTYyNCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjE0MjQ3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01MzI5NjI0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmMV9nb3AxLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTcxMTAzLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0xLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTU2MjAwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NzExMDMsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTYyMDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmMV9nb3AyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTcxMTEyLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0xLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTU2MjA4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NzExMTIsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTYyMDgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmMV9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTcxMTEzLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0xLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTU2MjA4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NzExMTMsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTYyMDgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmMV9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTcxMTE0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0xLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTU2MjA4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NzExMTQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTYyMDgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmMl9nb3AxLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTg3MzQwLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzI5MTgwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9ODczNDAsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3MjkxODAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmMl9nb3AyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTg3MzQ5LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzI5MzgwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9ODczNDksd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3MjkzODAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmMl9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTg3MzUwLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzI5MzgwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9ODczNTAsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3MjkzODAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmMl9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTg3MzUxLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzI5MzgwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9ODczNTEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3MjkzODAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmM19nb3AyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTk5MDAyLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzA3MjI2NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9OTkwMDIsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzMDcyMjY0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmM19nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTk5MDAzLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzA3MjI2NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9OTkwMDMsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzMDcyMjY0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmM19nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTk5MDA0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzA3MjI2NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9OTkwMDQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzMDcyMjY0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmNF9nb3AyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwODcyNSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTA3NzUyOTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwODcyNSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTA3NzUyOTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9nb3AvY3Jvd2RfMTkyMHgxMDgwcDUwL2Nyb3dkXzE5MjB4MTA4MHA1MGY0X2dvcDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA4MTk4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMDcyMjQ5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA4MTk4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMDcyMjQ5NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L2dvcC9jcm93ZF8xOTIweDEwODBwNTAvY3Jvd2RfMTkyMHgxMDgwcDUwZjRfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDgxOTksd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEwNzIyNDk2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDgxOTksd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEwNzIyNDk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmNV9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExODE2Mix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTM3NDE2MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE4MTYyLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05Mzc0MTYwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmNV9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExODE2Myx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTM3NDE2MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE4MTYzLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05Mzc0MTYwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmNl9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEzMzc4NSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9ODg1MjUyOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTMzNzg1LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04ODUyNTI4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmNl9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEyMzgyNCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9ODE4ODkyOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTIzODI0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04MTg4OTI4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmN19nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE0MTcxMyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9ODA0MDIyNCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTQxNzEzLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04MDQwMjI0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmN19nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEzNDU3NCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzYzMzEzNixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTM0NTc0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03NjMzMTM2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmOF9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE0OTEyNCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzQwNTE0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTQ5MTI0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03NDA1MTQ0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmOF9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEzNzgwMyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Njg0MDI0OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTM3ODAzLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02ODQwMjQ4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmOV9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE0OTA0Myx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NjU3OTYwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTQ5MDQzLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02NTc5NjAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmMTBfZ29wOC5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MzY4NDEsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3NDMzMDgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0xNzA0MCwyNzQgKzE3MDQwLDI3NCBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01NjAzMjAsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzOTgxNDQ4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmMV9nb3AxLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4MTc4NSx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDQ3NDU2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODE3ODUsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ0NzQ1NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L2dvcC9jcm93ZF8zODQweDIxNjBwNTAvY3Jvd2RfMzg0MHgyMTYwcDUwZjFfZ29wMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODE3OTUsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ0NzUzNixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTgxNzk1LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0xLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NDc1MzYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9nb3AvY3Jvd2RfMzg0MHgyMTYwcDUwL2Nyb3dkXzM4NDB4MjE2MHA1MGYxX2dvcDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTgxNzk2LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0xLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NDc1MzYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4MTc5Nix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDQ3NTM2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmMV9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4MTc5Nix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDQ3NTM2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODE3OTYsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ0NzUzNixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L2dvcC9jcm93ZF8zODQweDIxNjBwNTAvY3Jvd2RfMzg0MHgyMTYwcDUwZjJfZ29wMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMjA5MDcsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0MDA1MjAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMjA5MDcsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0MDA1MjAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmMl9nb3AyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIyMDkxNyx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQwMDcyMDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIyMDkxNyx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQwMDcyMDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9nb3AvY3Jvd2RfMzg0MHgyMTYwcDUwL2Nyb3dkXzM4NDB4MjE2MHA1MGYyX2dvcDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjIwOTE4LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDAwNzIwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjIwOTE4LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDAwNzIwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L2dvcC9jcm93ZF8zODQweDIxNjBwNTAvY3Jvd2RfMzg0MHgyMTYwcDUwZjJfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMjA5MTgsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0MDA3MjAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMjA5MTgsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0MDA3MjAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmM19nb3AyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI1MTY4OSx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzM0MzA0MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI1MTY4OSx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzM0MzA0MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9nb3AvY3Jvd2RfMzg0MHgyMTYwcDUwL2Nyb3dkXzM4NDB4MjE2MHA1MGYzX2dvcDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjUxNjkwLHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zMzQzMDQwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjUxNjkwLHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zMzQzMDQwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L2dvcC9jcm93ZF8zODQweDIxNjBwNTAvY3Jvd2RfMzg0MHgyMTYwcDUwZjNfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yNTE2OTAsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMzNDMwNDAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yNTE2OTAsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMzNDMwNDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmNF9nb3AyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI3MDkwOSx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjY5OTM2MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI3MDkwOSx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjY5OTM2MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9nb3AvY3Jvd2RfMzg0MHgyMTYwcDUwL2Nyb3dkXzM4NDB4MjE2MHA1MGY0X2dvcDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mjc1MzI2LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNzQzNTIwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mjc1MzI2LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNzQzNTIwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L2dvcC9jcm93ZF8zODQweDIxNjBwNTAvY3Jvd2RfMzg0MHgyMTYwcDUwZjRfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yNzUzMjYsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI3NDM1MjAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yNzUzMjYsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI3NDM1MjAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmNV9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMwMzEwMix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjQxNjkyODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMwMzEwMix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjQxNjkyODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9nb3AvY3Jvd2RfMzg0MHgyMTYwcDUwL2Nyb3dkXzM4NDB4MjE2MHA1MGY1X2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzAzMTAyLHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNDE2OTI4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzAzMTAyLHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNDE2OTI4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L2dvcC9jcm93ZF8zODQweDIxNjBwNTAvY3Jvd2RfMzg0MHgyMTYwcDUwZjZfZ29wNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMjQwODksd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIxNTM5NDAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMjQwODksd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIxNTM5NDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmNl9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMxOTgwMyx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjEyNTQyMDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMxOTgwMyx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjEyNTQyMDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9nb3AvY3Jvd2RfMzg0MHgyMTYwcDUwL2Nyb3dkXzM4NDB4MjE2MHA1MGY3X2dvcDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzQzNjU0LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTU3OTY1NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzQzNjU0LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTU3OTY1NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L2dvcC9jcm93ZF8zODQweDIxNjBwNTAvY3Jvd2RfMzg0MHgyMTYwcDUwZjdfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNDkzNTIsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5OTA2MTY4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNDkzNTIsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5OTA2MTY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmOF9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM2MjU4NSx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTgwNzgxNDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM2MjU4NSx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTgwNzgxNDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9nb3AvY3Jvd2RfMzg0MHgyMTYwcDUwL2Nyb3dkXzM4NDB4MjE2MHA1MGY4X2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzYyOTk1LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xODA5OTg0OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzYyOTk1LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xODA5OTg0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L2dvcC9jcm93ZF8zODQweDIxNjBwNTAvY3Jvd2RfMzg0MHgyMTYwcDUwZjlfZ29wOC5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zOTU0MDMsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3NTI4OTI4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzY0MHgzNjBwNTAvY3Jvd2RfNjQweDM2MHA1MGYxMF9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI4MzMwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTA5MjY0MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjgzMzAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMDkyNjQwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzY0MHgzNjBwNTAvY3Jvd2RfNjQweDM2MHA1MGYxMV9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI5NTkzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTAzODgwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mjk1OTMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMDM4ODAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzY0MHgzNjBwNTAvY3Jvd2RfNjQweDM2MHA1MGYxMl9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMwNTY5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTg0MzYwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMDU2OSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTk4NDM2MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L2dvcC9jcm93ZF82NDB4MzYwcDUwL2Nyb3dkXzY0MHgzNjBwNTBmMTNfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMTcxMix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTk0MzQ0MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzE3MTIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05NDM0NDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9nb3AvY3Jvd2RfNjQweDM2MHA1MC9jcm93ZF82NDB4MzYwcDUwZjE0X2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzE5NTEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04ODI3NjgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMxOTUxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9ODgyNzY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzY0MHgzNjBwNTAvY3Jvd2RfNjQweDM2MHA1MGYxNV9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMzNDMwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9ODYzMjQ4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMzQzMCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTg2MzI0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L2dvcC9jcm93ZF82NDB4MzYwcDUwL2Nyb3dkXzY0MHgzNjBwNTBmMTZfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMzE3MSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTgwMjcyMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzMxNzEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04MDI3MjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9nb3AvY3Jvd2RfNjQweDM2MHA1MC9jcm93ZF82NDB4MzYwcDUwZjFfZ29wMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMzQzNSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTAwNjcyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMzQzNSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTAwNjcyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzY0MHgzNjBwNTAvY3Jvd2RfNjQweDM2MHA1MGYxX2dvcDIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTM0NDYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0xLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEwMDc1MixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTM0NDYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0xLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEwMDc1MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L2dvcC9jcm93ZF82NDB4MzYwcDUwL2Nyb3dkXzY0MHgzNjBwNTBmMV9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEzNDQ2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMDA3NTIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEzNDQ2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMDA3NTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9nb3AvY3Jvd2RfNjQweDM2MHA1MC9jcm93ZF82NDB4MzYwcDUwZjFfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMzQ0OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTAwNzUyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMzQ0OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTAwNzUyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzY0MHgzNjBwNTAvY3Jvd2RfNjQweDM2MHA1MGYyX2dvcDEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTY1MDUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zMTI1MjAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjUwNSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMxMjUyMDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9nb3AvY3Jvd2RfNjQweDM2MHA1MC9jcm93ZF82NDB4MzYwcDUwZjJfZ29wMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjUxNix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMxMjcyMDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2NTE2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzEyNzIwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L2dvcC9jcm93ZF82NDB4MzYwcDUwL2Nyb3dkXzY0MHgzNjBwNTBmMl9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2NTE2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzEyNzIwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTY1MTYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zMTI3MjAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzY0MHgzNjBwNTAvY3Jvd2RfNjQweDM2MHA1MGYyX2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTY1MTgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zMTI3MjAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjUxOCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMxMjcyMDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9nb3AvY3Jvd2RfNjQweDM2MHA1MC9jcm93ZF82NDB4MzYwcDUwZjNfZ29wMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODUzMyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNDMwNjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4NTMzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM0MzA2NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L2dvcC9jcm93ZF82NDB4MzYwcDUwL2Nyb3dkXzY0MHgzNjBwNTBmM19nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4NTMzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM0MzA2NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg1MzMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzQzMDY0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzY0MHgzNjBwNTAvY3Jvd2RfNjQweDM2MHA1MGYzX2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg1MzUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzQzMDY0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODUzNSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNDMwNjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9nb3AvY3Jvd2RfNjQweDM2MHA1MC9jcm93ZF82NDB4MzYwcDUwZjRfZ29wMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTg1NSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE4ODgyOTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5ODU1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTg4ODI5NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L2dvcC9jcm93ZF82NDB4MzYwcDUwL2Nyb3dkXzY0MHgzNjBwNTBmNF9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5OTg2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTkwMTQwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTk5ODYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTAxNDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzY0MHgzNjBwNTAvY3Jvd2RfNjQweDM2MHA1MGY0X2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTk5ODgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTAxNDAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTk4OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5MDE0MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9nb3AvY3Jvd2RfNjQweDM2MHA1MC9jcm93ZF82NDB4MzYwcDUwZjVfZ29wNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMTM0Nyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE2MjkwNDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIxMzQ3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTYyOTA0MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L2dvcC9jcm93ZF82NDB4MzYwcDUwL2Nyb3dkXzY0MHgzNjBwNTBmNV9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIxMzQ5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTYyOTA0MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjEzNDksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNjI5MDQwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzY0MHgzNjBwNTAvY3Jvd2RfNjQweDM2MHA1MGY2X2dvcDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjI2Mjksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDQyMjAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMjYyOSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NDIyMDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9nb3AvY3Jvd2RfNjQweDM2MHA1MC9jcm93ZF82NDB4MzYwcDUwZjZfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMjQyMCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0Mjg2NjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIyNDIwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQyODY2NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L2dvcC9jcm93ZF82NDB4MzYwcDUwL2Nyb3dkXzY0MHgzNjBwNTBmN19nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIzNjMzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTI5Mjg1NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjM2MzMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMjkyODU2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzY0MHgzNjBwNTAvY3Jvd2RfNjQweDM2MHA1MGY3X2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjM3Mjksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMjk5MTM2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMzcyOSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEyOTkxMzYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9nb3AvY3Jvd2RfNjQweDM2MHA1MC9jcm93ZF82NDB4MzYwcDUwZjhfZ29wNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yNDM5OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTExNjg4OTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI0Mzk4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTE2ODg5NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L2dvcC9jcm93ZF82NDB4MzYwcDUwL2Nyb3dkXzY0MHgzNjBwNTBmOF9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI0MjMyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTE2MTY5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjQyMzIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMTYxNjk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzY0MHgzNjBwNTAvY3Jvd2RfNjQweDM2MHA1MGY5X2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjU2MTYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMDkzOTUyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yNTYxNix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEwOTM5NTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9nb3AvY3Jvd2RfODU0eDQ4MHA1MC9jcm93ZF84NTR4NDgwcDUwZjEwX2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Njc0Mjcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNjU2NTIwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02NzQyNyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI2NTY1MjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9nb3AvY3Jvd2RfODU0eDQ4MHA1MC9jcm93ZF84NTR4NDgwcDUwZjExX2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NzAwMDksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNTA4NDcyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03MDAwOSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI1MDg0NzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9nb3AvY3Jvd2RfODU0eDQ4MHA1MC9jcm93ZF84NTR4NDgwcDUwZjEyX2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NzE5OTgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzY1MzI4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03MTk5OCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNjUzMjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9nb3AvY3Jvd2RfODU0eDQ4MHA1MC9jcm93ZF84NTR4NDgwcDUwZjEzX2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NzU0MzMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjg4NzA0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03NTQzMyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyODg3MDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9nb3AvY3Jvd2RfODU0eDQ4MHA1MC9jcm93ZF84NTR4NDgwcDUwZjE0X2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NzY0NTAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMTU0MTY4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03NjQ1MCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIxNTQxNjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9nb3AvY3Jvd2RfODU0eDQ4MHA1MC9jcm93ZF84NTR4NDgwcDUwZjE1X2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9ODA0NTksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMTE3MzYwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT04MDQ1OSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIxMTczNjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9nb3AvY3Jvd2RfODU0eDQ4MHA1MC9jcm93ZF84NTR4NDgwcDUwZjE2X2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9ODA1OTEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTg4MjI0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT04MDU5MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5ODgyMjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9nb3AvY3Jvd2RfODU0eDQ4MHA1MC9jcm93ZF84NTR4NDgwcDUwZjFfZ29wMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMjQ2MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjUyODY0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMjQ2MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjUyODY0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzg1NHg0ODBwNTAvY3Jvd2RfODU0eDQ4MHA1MGYxX2dvcDIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzI0NzAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0xLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI1Mjk0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzI0NzAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0xLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI1Mjk0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L2dvcC9jcm93ZF84NTR4NDgwcDUwL2Nyb3dkXzg1NHg0ODBwNTBmMV9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMyNDcxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNTI5NDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMyNDcxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNTI5NDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9nb3AvY3Jvd2RfODU0eDQ4MHA1MC9jcm93ZF84NTR4NDgwcDUwZjFfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMjQ3Mix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjUyOTQ0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMjQ3Mix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjUyOTQ0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzg1NHg0ODBwNTAvY3Jvd2RfODU0eDQ4MHA1MGYyX2dvcDEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzkyNTIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03Njc0MjAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zOTI1Mix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTc2NzQyMDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9nb3AvY3Jvd2RfODU0eDQ4MHA1MC9jcm93ZF84NTR4NDgwcDUwZjJfZ29wMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zOTI2MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTc2NzYyMDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM5MjYxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzY3NjIwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L2dvcC9jcm93ZF84NTR4NDgwcDUwL2Nyb3dkXzg1NHg0ODBwNTBmMl9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM5MjYyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzY3NjIwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzkyNjIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03Njc2MjAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzg1NHg0ODBwNTAvY3Jvd2RfODU0eDQ4MHA1MGYyX2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzkyNjMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03Njc2MjAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zOTI2Myx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTc2NzYyMDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9nb3AvY3Jvd2RfODU0eDQ4MHA1MC9jcm93ZF84NTR4NDgwcDUwZjNfZ29wMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00NDUzNix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTU4MTAxMjgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQ0NTM2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTgxMDEyOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L2dvcC9jcm93ZF84NTR4NDgwcDUwL2Nyb3dkXzg1NHg0ODBwNTBmM19nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQ0NTM3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTgxMDEyOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDQ1Mzcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01ODEwMTI4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzg1NHg0ODBwNTAvY3Jvd2RfODU0eDQ4MHA1MGYzX2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDQ1Mzgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01ODEwMTI4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00NDUzOCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTU4MTAxMjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9nb3AvY3Jvd2RfODU0eDQ4MHA1MC9jcm93ZF84NTR4NDgwcDUwZjRfZ29wMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00Nzk4MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ3MDA4OTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQ3OTgxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDcwMDg5NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L2dvcC9jcm93ZF84NTR4NDgwcDUwL2Nyb3dkXzg1NHg0ODBwNTBmNF9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQ4MzQ0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDczNzA5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDgzNDQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NzM3MDk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzg1NHg0ODBwNTAvY3Jvd2RfODU0eDQ4MHA1MGY0X2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDgzNDUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NzM3MDk2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00ODM0NSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ3MzcwOTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9nb3AvY3Jvd2RfODU0eDQ4MHA1MC9jcm93ZF84NTR4NDgwcDUwZjVfZ29wNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01MjM0MCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQxMDg0MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTUyMzQwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDEwODQwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L2dvcC9jcm93ZF84NTR4NDgwcDUwL2Nyb3dkXzg1NHg0ODBwNTBmNV9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTUyMzQxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDEwODQwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTIzNDEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MTA4NDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzg1NHg0ODBwNTAvY3Jvd2RfODU0eDQ4MHA1MGY2X2dvcDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTU0Mjksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zNjI4ODAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01NTQyOSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM2Mjg4MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9nb3AvY3Jvd2RfODU0eDQ4MHA1MC9jcm93ZF84NTR4NDgwcDUwZjZfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01NDQ2Myx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM1NjQ4NjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTU0NDYzLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzU2NDg2NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L2dvcC9jcm93ZF84NTR4NDgwcDUwL2Nyb3dkXzg1NHg0ODBwNTBmN19nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTU3NjU3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzIzNzAyNCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTc2NTcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zMjM3MDI0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzg1NHg0ODBwNTAvY3Jvd2RfODU0eDQ4MHA1MGY3X2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTg3NzQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zMzAxNzEyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01ODc3NCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMzMDE3MTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9nb3AvY3Jvd2RfODU0eDQ4MHA1MC9jcm93ZF84NTR4NDgwcDUwZjhfZ29wNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01OTI0Mix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI5MTEwNDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTU5MjQyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjkxMTA0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L2dvcC9jcm93ZF84NTR4NDgwcDUwL2Nyb3dkXzg1NHg0ODBwNTBmOF9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTU5NTIzLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjkyNjI0OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTk1MjMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yOTI2MjQ4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvZ29wL2Nyb3dkXzg1NHg0ODBwNTAvY3Jvd2RfODU0eDQ4MHA1MGY5X2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NjQ0NjAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yODIwMzUyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02NDQ2MCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI4MjAzNTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9sZXZlbC9jcm93ZF8xMjgweDcyMHA1MGYzMl8yMDAwa2Jwc19sZXZlbF80LjAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTU4NDI4LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5NjM3NjgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1ODQyOCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTYzNzY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvbGV2ZWwvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfODAwMGticHNfbGV2ZWxfNC4xLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTY3NjQ5OCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04NDM5NjQ4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvbGV2ZWwvY3Jvd2RfMTI4eDk2cDUwZjMyXzIwMGticHNfbGV2ZWxfMi4wLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1NzA1LHdpZHRoPTEyOCxoZWlnaHQ9OTYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzk5NDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1NzA1LHdpZHRoPTEyOCxoZWlnaHQ9OTYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzk5NDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9sZXZlbC9jcm93ZF8xNzZ4MTQ0cDUwZjMyXzIwMGticHNfbGV2ZWxfMi4wLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2MDY1LHdpZHRoPTE3NixoZWlnaHQ9MTQ0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTg0MjMyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjA2NSx3aWR0aD0xNzYsaGVpZ2h0PTE0NCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE4NDIzMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L2xldmVsL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl80MDAwa2Jwc19sZXZlbF80LjEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzAyODgyLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zNzY5NDMyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMDI4ODIsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM3Njk0MzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9sZXZlbC9jcm93ZF8xOTIweDEwODhwNTBmMzJfMTAwMDBrYnBzX2xldmVsXzUuMC5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03MjkwNjIsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4OCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTkwOTY2ODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9sZXZlbC9jcm93ZF8zNTJ4Mjg4cDUwZjMyXzMwMGticHNfbGV2ZWxfMi4xLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI0Nzk5LHdpZHRoPTM1MixoZWlnaHQ9Mjg4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjkzNDA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yNDc5OSx3aWR0aD0zNTIsaGVpZ2h0PTI4OCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI5MzQwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L2xldmVsL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl8xMjAwMGticHNfbGV2ZWxfNS4xLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTg5ODQwNyx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTEyMTM3ODQscGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTE3MzE2LDM3ICsxNzMxNiwzNyBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzk5NjI5LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjQ3OTA1NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L2xldmVsL2Nyb3dkXzY0MHg0ODBwNTBmMzJfNTAwa2Jwc19sZXZlbF8zLjAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDM3MzYsd2lkdGg9NjQwLGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01MzAxMjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQzNzM2LHdpZHRoPTY0MCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTMwMTIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvbGV2ZWwvY3Jvd2RfNjR4NjRwNTBmMzJfMjAwa2Jwc19sZXZlbF8xLjAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA0MTksd2lkdGg9NjQsaGVpZ2h0PTY0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTE0ODcyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDQxOSx3aWR0aD02NCxoZWlnaHQ9NjQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMTQ4NzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9sZXZlbC9jcm93ZF82NHg2NHA1MGYzMl8yMDBrYnBzX2xldmVsXzIuMC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNDY3Mix3aWR0aD02NCxoZWlnaHQ9NjQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNjgwMzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE0NjcyLHdpZHRoPTY0LGhlaWdodD02NCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE2ODAzMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L2xldmVsL2Nyb3dkXzcyMHg0ODBwNTBmMzJfNjAwa2Jwc19sZXZlbF8zLjEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTA3NDUsd2lkdGg9NzIwLGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02MTc3MzYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTUwNzQ1LHdpZHRoPTcyMCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NjE3NzM2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvbGV2ZWwvY3Jvd2RfNzIweDU3NnA1MGYzMl82MDBrYnBzX2xldmVsXzMuMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01MzIwNix3aWR0aD03MjAsaGVpZ2h0PTU3NixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTY0ODQ4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTMyMDYsd2lkdGg9NzIwLGhlaWdodD01NzYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02NDg0ODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfMTAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT04NjA0Myx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMDU4OTg0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT04NjA0Myx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMDU4OTg0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyXzEwbWJwcy5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT04NDk2OTEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTA2MDQ1ODQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfMW1icHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9OTE3NTEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTEzMDMzNixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9OTE3NTEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTEzMDMzNixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl8yMG1icHMubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTcxNjY4NSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMTQ0MjAwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl80bWJwc19hZGFwdGl2ZXFwMC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNjgzODEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDU4ODIwOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzY4MzgxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ1ODgyMDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfNG1icHNfYWRhcHRpdmVxcDIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzY1NzYzLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ1NTU0ODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM2NTc2Myx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NTU1NDgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyXzRtYnBzX3FwZzE2Lm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM5MDc2NCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00ODY4MDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0xNzM1OCw3ICsxNzM1OCw3IEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM5ODA3Myx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00OTU5MzYwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyXzUwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9ODU3MDYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTA1NDc2OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9ODU3MDYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTA1NDc2OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl81bWJwcy5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MTU2OTYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTE3OTY0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMTczNzksNyArMTczNzksNyBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNzc4NzIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDcwNjg0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9iX2FkYXB0XzAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzUxNjc5LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQzODAwMzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1MTY3OSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MzgwMDMyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2JfYWRhcHRfMS5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MjMxMDIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTI3MjIyNCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMTc0MTUsMjIgKzE3NDE1LDIyIEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1NDAxMjE3LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5MjQ5ODY1NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9jcmY1MS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yODk4OCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zNDU4MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI4OTg4LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM0NTgwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9jdGIxNi5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNzY0MjEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDY4ODcyMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9jdGIzMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNzM0MjAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDY1MTIwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzczNDIwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ2NTEyMDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZmFzdGRlY29kZS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNzU5Mzgsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDY4MjY3MixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mzc1OTM4LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ2ODI2NzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZmFzdGVyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMzMjc3NCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MTQzNzIwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMzI3NzQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDE0MzcyMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mYXN0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM0MzI0NCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00Mjc0NjAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNDMyNDQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDI3NDYwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ncmFpbi5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01OTE2NzYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzM3OTQwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMTc0NzUsNyArMTc0NzUsNyBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNzkxNTYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDcyMjg4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9tYXh0dTQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU2NDU2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0MzkxNDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NjQ1Nix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDM5MTQ0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX21heHR1OC5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNzg5NTgsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDcyMDQwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMTc0OTAsMTAgKzE3NDkwLDEwIEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM3NzYxNSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NzAzNjMyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX21lcmdlNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNzQ4MzUsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDY2ODg4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mzc0ODM1LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ2Njg4ODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbWVyZ2U1Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM3NDUzOSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NjY1MTg0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNzQ1Mzksd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDY2NTE4NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9taW5jdTE2Lm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM5NTg0OCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00OTMxNTQ0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0xNzU0MSwyOCArMTc1NDEsMjggQEAKICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTI0MTAxOCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNTQ5NjE4NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9xcDM5Y2JtMTJjcjEyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NzQ4Nyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDUyMDI0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTc0ODcsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQ1MjAyNCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9xcDQubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjMyNTE2NDMsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjkwNjI5MDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX3FwNTAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mjk2Njgsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzU0MzEyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yOTY2OCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zNTQzMTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfcXA1MWNiMTJjcjEyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIzOTM4LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI4MjY1NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjM5Mzgsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjgyNjU2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX3FwNTFjYjEyY3JtMTIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjU4NjAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzA2NjgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yNTg2MCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zMDY2ODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfcXA1MWNibTEyY3IxMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yOTUwMCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zNTIxODQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI5NTAwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM1MjE4NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9xcDUxY2JtMTJjcm0xMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMDY2OCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zNjY3ODQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMwNjY4LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM2Njc4NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9xcDUxLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIzOTM0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI4MjYzMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjM5MzQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjgyNjMyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX3JlY3QwLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM3Nzg3NSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NzA2ODgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0xNzU4MCw3ICsxNzU4MCw3IEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM3OTI5Nyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NzI0NjI0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX3Nsb3cubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU4MTExLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0NTk4MzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1ODExMSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDU5ODMyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX3NybmcwLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTU2NDE0Myx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03MDM1MjMyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0xNzY0MywxMCArMTc2NDMsMTAgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTIxNzIzLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTY1MDUwMDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfdmVyeWZhc3QubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzM0MTA1LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQxNjAzNjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMzNDEwNSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MTYwMzYwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX3ZlcnlzbG93Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM3NTA0OCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NjcxNTEyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNzUwNDgsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDY3MTUxMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl92dWlfY29sb3JfbWF0cml4Lm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM3Nzg3OSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NzA2ODgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0xNzY3OSwyMiArMTc2NzksMjIgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDQyODk1LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTU1MjM0ODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl8xMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2NTA4Myx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjA0Njk2OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTY1MDgzLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMDQ2OTY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfMTBtYnBzLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTcyODA3Myx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTA4NDM0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyXzFtYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2NDg0NSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjA0NDAwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTY0ODQ1LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMDQ0MDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfMjBtYnBzLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE0Nzk2OTIsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE4NDc5NTg0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfNG1icHNfYWRhcHRpdmVxcDAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzI4Mjc1LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MDg2ODcyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMjgyNzUsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQwODY4NzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl80bWJwc19hZGFwdGl2ZXFwMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMjgwNDQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQwODM5ODQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMyODA0NCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDA4Mzk4NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyXzRtYnBzX3FwZzE2Lm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTc0NjMxNyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTMxMjQwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMTc3MDYsMTAgKzE3NzA2LDEwIEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTc3MDIxNCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTYxMTExMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyXzUwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTY1MDUwLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMDQ2NTYwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjUwNTAsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwNDY1NjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl81bWJwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNzAxODYsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ2MTA3NjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM3MDE4Nix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDYxMDc2MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2FsbGlkci5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzE4NTQ0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMTQ2OTM0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMTc3NjMsNyArMTc3NjMsNyBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zODE3OTMzMCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDc3MjI1MDU2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfY3JmNTEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NjM0Nzksd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTc3NjkyMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NjM0Nzksd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTc3NjkyMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2N0YjE2Lm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTcyNTgzMyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTA1NjM2MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMTc4OTUsMjIgKzE3ODk1LDIyIEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTU0ODIyMDQyLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02ODUyNTg5NjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9xcDUwLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTYzNjE1LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03Nzg2MzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTYzNjE1LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03Nzg2MzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9xcDUxY2IxMmNyMTIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTEzMjAsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTYyNDkyMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTEzMjAsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTYyNDkyMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX3FwNTFjYjEyY3JtMTIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTY1NTQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTY5MDM0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTY1NTQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTY5MDM0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX3FwNTFjYm0xMmNyMTIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NjUxNDMsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTc5NzcxMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NjUxNDMsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTc5NzcxMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX3FwNTFjYm0xMmNybTEyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTY3NDE3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04MjYxMzYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTY3NDE3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04MjYxMzYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9xcDUxLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTUxMzE2LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02MjQ4OTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTUxMzE2LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02MjQ4OTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9yZWN0MC5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03MjQ5ODYsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTkwNDU3NjAscGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTE4MTIzLDcgKzE4MTIzLDcgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTk1Njg1OTQ4LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl9jcmY1MS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMzA0NDAsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI4NjQyMjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIzMDQ0MCx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Mjg2NDIyNCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8zODQweDIxNjBwNTBmMzIvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyX2N0YjMyLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTQ2MzQsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNjY2NjcyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0xODI5MSwyMiArMTgyOTEsMjIgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjY0MDc3NjA1LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl9xcDUwLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIyNDA1Mix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Mjc4NDM4NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjI0MDUyLHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNzg0Mzg0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMi9jcm93ZF8zODQweDIxNjBwNTBmMzJfcXA1MWNiMTJjcjEyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4NDU3NCx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjI5MDg4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg0NTc0LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjkwODgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMi9jcm93ZF8zODQweDIxNjBwNTBmMzJfcXA1MWNiMTJjcm0xMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTc4NjMsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI0NTcwMDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5Nzg2Myx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjQ1NzAwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8zODQweDIxNjBwNTBmMzIvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyX3FwNTFjYm0xMmNyMTIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjQ3MjY2LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zMDc0NTM2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yNDcyNjYsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMwNzQ1MzYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl9xcDUxY2JtMTJjcm0xMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yNTMzMzksd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMxNTA0NDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI1MzMzOSx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzE1MDQ0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8zODQweDIxNjBwNTBmMzIvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyX3FwNTEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg0NTcwLHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjkwODU2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODQ1NzAsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyOTA4NTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl9yZWN0MC5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTI0NDMyLHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNDAzOTEyMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMTg0NDQsMTk2ICsxODQ0NCwxOTYgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjY0OTAxOSx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzMxMDAwMjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyXzEwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mjg0MjYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zMzg3NjgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI4NDI2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzM4NzY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl8xMG1icHMubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Nzk2MDM1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTkzMzg4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfMW1icHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NzU3Nzgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05MzA2NzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTc1Nzc4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTMwNjcyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl8yMG1icHMubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTYwMzA5Mix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwMDIyMDk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl80bWJwc19hZGFwdGl2ZXFwMC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMzY0MDQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MTg4NDk2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMzY0MDQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MTg4NDk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl80bWJwc19hZGFwdGl2ZXFwMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMzI2MzEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MTQxMzM2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMzI2MzEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MTQxMzM2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl80bWJwc19xcGcxNi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTg5NjEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDcwNDU2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTg5NjEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDcwNDU2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl80bWJwc19xcGc2NC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTg0MjAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDYzNzEyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTg0MjAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDYzNzEyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl80bWJwc19xcGc4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExOTAwNix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NzEwMjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExOTAwNix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NzEwMjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyXzUwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDE4MDEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01MDU5NjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQxODAxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTA1OTYwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl81bWJwcy5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zOTM0MTMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00OTAxMTEyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9hbGxpZHIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzA2OTMyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzgyNDIwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzA2OTMyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzgyNDIwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfYWx0aWRyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMzMTUwOCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQxMzA0MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMzMTUwOCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQxMzA0MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2FtcDAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE2NzcxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ0MzA4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE2NzcxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ0MzA4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfYW1wMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTY3NzEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDQzMDgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTY3NzEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDQzMDgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9hdWQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE2NzY4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ0MzA0OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE2NzY4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ0MzA0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfYl9hZGFwdF8wLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwMzM5Nyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEyNzY1MTIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwMzM5Nyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEyNzY1MTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2JfYWRhcHRfMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMzAyMzYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNjExNDAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMzAyMzYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNjExNDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9iZXRhMC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTY3NzEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDQzMDgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTY3NzEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDQzMDgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9iZXRhNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTY3Mzksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDQyNjcyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTY3Mzksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDQyNjcyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9iZXRhNi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTY5MTIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDQ0ODMyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTY5MTIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDQ0ODMyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9iZXRhNl90Y202Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNzI2Nix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NDkyNDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNzI2Nix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NDkyNDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2JldGFtNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTc1MTMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDUyMzQ0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTc1MTMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDUyMzQ0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9iZXRhbTYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE3NDQzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ1MTQ3MixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE3NDQzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ1MTQ3MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfYmV0YW02X3RjNi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTc2ODUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDU0NDgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTc2ODUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDU0NDgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9jbnN0cm5faW50cmEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE4MTYzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ2MDQ4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE4MTYzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ2MDQ4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfY3JhMTYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTI3NzI4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTU3OTIzMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTI3NzI4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTU3OTIzMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfY3JmMC5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTUyNjQ5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQzOTE1NjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2NyZjUxLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTk0NDYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMDE1MjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTk0NDYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMDE1MjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2N0YjE2Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNzg5OSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NTcyMDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNzg5OSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NTcyMDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2N0YjMyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNzQyNSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NTEyNzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNzQyNSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NTEyNzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2Zhc3RkZWNvZGUubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE2MzY2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQzODAyNCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE2MzY2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQzODAyNCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZmFzdGVyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTk2NjEzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTE5MTcxMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9OTY2MTMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMTkxNzEyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mYXN0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwMDUyMyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEyNDA1ODQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwMDUyMyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEyNDA1ODQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2dyYWluLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4NjQ2NSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzMTQyNzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4NjQ2NSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzMTQyNzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2hhc2hfY2hrc3VtLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNzQ3NSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NTE4ODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNzQ3NSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NTE4ODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2hhc2hfY3JjLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNzI4Myx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NDk0ODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNzI4Myx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NDk0ODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2hhc2hfbWQ1Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExODYyNyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NjYyODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExODYyNyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NjYyODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2hyZC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTY3NzEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDQzMDgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTY3NzEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDQzMDgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9pZHIxNi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMjg4NDEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNTkzOTEyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMjg4NDEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNTkzOTEyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9pbnRyYW1pbnVzMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTY3ODAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDQzMjAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTY3ODAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDQzMjAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9sb3NzbGVzcy5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02MDU4OTI3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzU3MjAwNDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX21heF9sb2cycG9jXzEwLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNjc4MCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NDMyMDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNjc4MCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NDMyMDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX21heF9sb2cycG9jXzE2Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNjgwNCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NDM0ODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNjgwNCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NDM0ODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX21heF9sb2cycG9jXzQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE2NzY2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ0MzAyNCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE2NzY2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ0MzAyNCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbWF4X2xvZzJwb2NfNS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTY3NjYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDQzMDI0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTY3NjYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDQzMDI0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9tYXhfbG9nMnBvY182Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNjc2Nix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NDMwMjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNjc2Nix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NDMwMjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX21heHR1MTYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE3NDYzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ1MTczNixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE3NDYzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ1MTczNixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbWF4dHU0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExMTM2Mix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNzU0ODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExMTM2Mix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNzU0ODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX21heHR1OC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTgxODcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDYwNzg0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTgxODcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDYwNzg0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9tZWRpdW0ubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE2NzcxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ0MzA4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE2NzcxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ0MzA4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbWVyZ2UxLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExOTAxOCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NzExNjgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExOTAxOCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NzExNjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX21lcmdlMy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTY3MzMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDQyNjA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTY3MzMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDQyNjA4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9tZXJnZTQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE2NTQ2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ0MDI3MixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE2NTQ2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ0MDI3MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbWVyZ2U1Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNjIxNix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0MzYxNDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNjIxNix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0MzYxNDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX21pbmN1MTYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTI2NjgxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTU2NjkzNixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTI2NjgxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTU2NjkzNixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbWluY3UzMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNDMxNzEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzczMDcyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNDMxNzEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzczMDcyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub2RibGsubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE3MzI3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ1MDAzMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE3MzI3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ1MDAzMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9fcHBzX3FwX29wdC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTY3NzQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDQzMTIwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTY3NzQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDQzMTIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub19wcHNfcmVmbGlzdF9vcHQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE2Nzc0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ0MzEyMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE2Nzc0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ0MzEyMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9fdnVpX2hyZC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTY3NzQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDQzMTIwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTY3NzQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDQzMTIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9wbGFjZWJvLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExOTgxOSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0ODExNDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExOTgxOSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0ODExNDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3Byb2ZpbGVub25lLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNjc2OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NDMwNDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNjc2OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NDMwNDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3BzbnIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg0MTY2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjI4NTUyMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg0MTY2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjI4NTUyMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfcXAwY2IxMmNyMTIubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTI4Mzg0Nix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTY2MDMxNTEyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0xODY1NCwxNzIgKzE4NjU0LDE3MiBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MDE2Mzgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01MDAzOTM2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9xcDM5Y2JtMTJjcjEyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwNDY2Nix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEyOTE3NjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwNDY2Nix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEyOTE3NjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3FwNC5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01NTEwNTc5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Njg4NjU2OTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3FwNTAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9OTIwMix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTk4NDgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT05MjAyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTg0ODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3FwNTFjYjEyY3IxMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03OTA3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9ODIyNzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTc5MDcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04MjI3MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfcXA1MWNiMTJjcm0xMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT04NzQ4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTI3ODQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTg3NDgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05Mjc4NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfcXA1MWNibTEyY3IxMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT05MTIwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTc0MzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTkxMjAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05NzQzMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfcXA1MWNibTEyY3JtMTIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9OTQ2NSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEwMTc0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9OTQ2NSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEwMTc0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfcXA1MS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03OTAzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9ODIyNDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTc5MDMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04MjI0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfcmVjdDAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE2NzcxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ0MzA4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE2NzcxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ0MzA4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfcnB0X2hkcnMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE2NzY4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ0MzA0OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE2NzY4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ0MzA0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfc2FvMC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTc1NjMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDUyOTg0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTc1NjMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDUyOTg0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9zYmgxLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNjc3MSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NDMwODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNjc3MSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NDMwODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3Nsb3dlci5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTQzMDQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDEyMjI0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTQzMDQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDEyMjI0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9zbG93Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwODgyNCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNDM3NDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwODgyNCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNDM3NDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3NybmcwLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1NzA0OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5NDY1NDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1NzA0OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5NDY1NDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3NybmczMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTY4MDQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDQzNDk2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTY4MDQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDQzNDk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9zcm5nNjQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE2NzcxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ0MzA4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE2NzcxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ0MzA4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfc3JuZzgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE3Mjc0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ0OTM2OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE3Mjc0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ0OTM2OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfc3NpbS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjczNzIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMDc1NjAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjczNzIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMDc1NjAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9zdHJuZ2ludHJhMC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTcwNTQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDQ2NjI0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTcwNTQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDQ2NjI0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9zdXBlcmZhc3QubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTgyMDE4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjI1ODY4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTgyMDE4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjI1ODY4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfdGM0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNzM1Myx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NTAzNDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNzM1Myx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NTAzNDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3RjNi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTc1MTEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDUyMzIwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTc1MTEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDUyMzIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl90Y200Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNzA4MCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NDY5MzYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNzA4MCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NDY5MzYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3RjbTYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE2OTE4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ0NDkxMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE2OTE4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ0NDkxMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfdG1wX2x5cnMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE2Nzc1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ0MzA0OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE2Nzc1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ0MzA0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfdG12cDAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE3NjYzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ1NDIzMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE3NjYzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ1NDIzMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfdHVpbnRlcmRlcHRoMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTk5MTcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDgyNDAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTk5MTcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDgyNDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl90dWludGVyZGVwdGg0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExODI5Mix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NjIwOTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExODI5Mix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NjIwOTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3R1aW50cmFkZXB0aDIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE3MDQzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ0NjQ3MixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE3MDQzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ0NjQ3MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfdHVpbnRyYWRlcHRoNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTY4OTAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDQ0NTY4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTY4OTAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDQ0NTY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl90dWxpbWl0Mi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTY3NzEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDQzMDgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTY3NzEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDQzMDgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl90dWxpbWl0NC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTY3NzEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDQzMDgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTY3NzEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDQzMDgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl91bHRyYWZhc3QubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTcwNzEzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjExNzM0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTcwNzEzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjExNzM0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfdmVyeWZhc3QubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9OTczNDMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMjAwODMyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT05NzM0Myx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEyMDA4MzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3ZlcnlzbG93Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNDIwMix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0MTA5NDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNDIwMix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0MTA5NDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3Z1aV9jb2xvcl9tYXRyaXgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE2Nzc0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ0MzA4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE2Nzc0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ0MzA4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfdnVpX2NvbG9yX3ByaW1fYnQyMDIwLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNjc3NCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NDMwODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNjc3NCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NDMwODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3Z1aV9jb2xvcl9wcmltX2J0NzA5Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNjc3NCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NDMwODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNjc3NCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NDMwODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3Z1aV90cmFuc2Zlci5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTY3NzQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDQzMDgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTY3NzQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDQzMDgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl93ZWlnaHRiMHdlaWdodHAxLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNjc3MSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NDMwODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNjc3MSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NDMwODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3dlaWdodGIxLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNjkyMCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NDQ5NDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNjkyMCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NDQ5NDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3dlaWdodHAwLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNjc3MSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NDMwODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNjc3MSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NDMwODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3dlaWdodHAwd2VpZ2h0YjEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE2OTA0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ0NDc0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE2OTA0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ0NDc0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfd3BwMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTY2NTIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDQxNjAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTY2NTIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDQxNjAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl96ZXJvbGF0ZW5jeS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMzcxMjYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzAxMzg0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMzcxMjYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzAxMzg0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl8xMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQ1NTk1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTUzMzY4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00NTU5NSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTU1MzM2OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfMTBtYnBzLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTgxMTE1OSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEwMTIyOTIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl8xbWJwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03ODA2NCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTk1OTIzMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NzgwNjQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05NTkyMzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyXzIwbWJwcy5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjQwOTY0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjA0OTU0ODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyXzRtYnBzX2FkYXB0aXZlcXAwLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM0NjgzOSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQzMTg5MjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM0NjgzOSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQzMTg5MjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyXzRtYnBzX2FkYXB0aXZlcXAyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM0MzQ5Myx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQyNzcwOTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM0MzQ5Myx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQyNzcwOTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyXzRtYnBzX3FwZzE2Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5NDkwNSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI0MTk3NDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5NDkwNSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI0MTk3NDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyXzRtYnBzX3FwZzY0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5MjA1Mix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzODQwOTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5MjA1Mix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzODQwOTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyXzRtYnBzX3FwZzgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTk2NDcwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjQzOTMxMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTk2NDcwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjQzOTMxMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfNTAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00NzgzOCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTU4MTQwOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDc4Mzgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01ODE0MDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyXzVtYnBzLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM5OTQ5Nyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ5NzcxNDQscGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTE4ODMxLDE1NyArMTg4MzEsMTU3IEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTUzNzI4Nyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTY3MDI2MjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2FtcDAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5NDc2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM1MTg4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5NDc2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM1MTg4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfYW1wMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODk0NzYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzUxODgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODk0NzYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzUxODgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9hdWQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5NDczLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM1MTg0OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5NDczLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM1MTg0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfYl9hZGFwdF8wLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3MjUzNyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIxNDA3NDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3MjUzNyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIxNDA3NDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2JfYWRhcHRfMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMTU4NDIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNjgxNDU2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMTU4NDIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNjgxNDU2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9iZXRhMC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODk0NzYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzUxODgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODk0NzYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzUxODgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9iZXRhNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODk4NjEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzU2NjgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODk4NjEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzU2NjgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9iZXRhNi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTAwNDEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzU4OTM2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTAwNDEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzU4OTM2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9iZXRhNl90Y202Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTkyNix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNTc0ODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTkyNix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNTc0ODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2JldGFtNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODk5NjUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzU3OTg0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODk5NjUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzU3OTg0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9iZXRhbTYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTkwNjc5LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM2NjkxMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTkwNjc5LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM2NjkxMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfYmV0YW02X3RjNi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODk2MjIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzUzNjgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODk2MjIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzUzNjgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9jbnN0cm5faW50cmEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTkxOTUxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM4MjgyNCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTkxOTUxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM4MjgyNCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfY3JhMTYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjA5Nzk4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjYwNTA5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjA5Nzk4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjYwNTA5NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfY3JmMC5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02NDE0NTcxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9ODAxNjU1NjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2NyZjUxLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE0ODEwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTY4NTYwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNDgxMCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE2ODU2MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfY3RiMTYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTkxMDQyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM3MTQ3MixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTkxMDQyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM3MTQ3MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfY3RiMzIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5MzI5LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM1MDA3MixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5MzI5LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM1MDA3MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZmFzdGRlY29kZS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODkzMDgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzQ5Nzg0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODkzMDgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzQ5Nzg0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mYXN0ZXIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTY1MDUxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjA0NzE2OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTY1MDUxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjA0NzE2OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZmFzdC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjk1Mzgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMTAzMjU2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjk1Mzgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMTAzMjU2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ncmFpbi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMDcxNjksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zODIzMDU2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMDcxNjksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zODIzMDU2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9oYXNoX2Noa3N1bS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTAxODAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzYwNjgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTAxODAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzYwNjgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9oYXNoX2NyYy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODk5ODgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzU4MjgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODk5ODgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzU4MjgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9oYXNoX21kNS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTEzMzIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzc1MDgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTEzMzIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzc1MDgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ocmQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5NDc2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM1MTg4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5NDc2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM1MTg4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfaWRyMTYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjExODI2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjYzMTIwOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjExODI2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjYzMTIwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfaW50cmFtaW51czEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5NDg1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM1MjAwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5NDg1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM1MjAwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbG9zc2xlc3MubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTEwOTQ5Mzgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzg2NzAxNjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX21heF9sb2cycG9jXzEwLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTQ5NCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNTIxMTIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTQ5NCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNTIxMTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX21heF9sb2cycG9jXzE2Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTUwOCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNTIyODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTUwOCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNTIyODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX21heF9sb2cycG9jXzQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5NDY5LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM1MTgwOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5NDY5LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM1MTgwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbWF4X2xvZzJwb2NfNS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODk0Njksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzUxODA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODk0Njksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzUxODA4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9tYXhfbG9nMnBvY182Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTQ2OSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNTE4MDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTQ2OSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNTE4MDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX21heHR1MTYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTkxNTY3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM3ODAzMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTkxNTY3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM3ODAzMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbWF4dHU0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4MTY5Mix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyNTQ1ODQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4MTY5Mix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyNTQ1ODQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX21heHR1OC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTEwNzAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzcxODI0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTEwNzAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzcxODI0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9tZWRpdW0ubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5NDc2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM1MTg4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5NDc2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM1MTg4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbWVyZ2UxLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5MzMzMyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI0MDAwOTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5MzMzMyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI0MDAwOTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX21lcmdlMy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODkxOTQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzQ4MzYwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODkxOTQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzQ4MzYwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9tZXJnZTQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg4NTA1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjMzOTc0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg4NTA1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjMzOTc0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbWVyZ2U1Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4ODQ0Myx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzMzg5NjgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4ODQ0Myx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzMzg5NjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX21pbmN1MTYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjAwOTcwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjQ5NTU2MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjAwOTcwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjQ5NTU2MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbWluY3UzMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMjQ1NTksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNzkwNDI0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMjQ1NTksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNzkwNDI0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub2RibGsubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTkwMTI0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM1OTk4NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTkwMTI0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM1OTk4NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9fcHBzX3FwX29wdC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODk0Nzksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzUxOTIwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODk0Nzksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzUxOTIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub19wcHNfcmVmbGlzdF9vcHQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5NDc5LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM1MTkyMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5NDc5LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM1MTkyMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9fdnVpX2hyZC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODk0Nzksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzUxOTIwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODk0Nzksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzUxOTIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9wbGFjZWJvLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5ODEwMCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI0NTk2NTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5ODEwMCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI0NTk2NTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3Byb2ZpbGVub25lLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTQ3Myx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNTE4NDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTQ3Myx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNTE4NDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3BzbnIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mjg3NjkyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzU3OTU4NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mjg3NjkyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzU3OTU4NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfcXAwY2IxMmNyMTIubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9OTQ2NDUyMSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTExODI4OTkzNixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMTkwMDIsMTk5ICsxOTAwMiwxOTkgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NjY1NTUwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9ODMwMjgyNCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfcXAzOWNibTEyY3IxMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzgyODksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjEyMDMyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzgyODksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjEyMDMyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9xcDQubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTAwMTkzMzcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMjUyMjUxNjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3FwNTAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTQ1NDAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNjUyMDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE0NTQwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTY1MjAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9xcDUxY2IxMmNyMTIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE5NzEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzMwNTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExOTcxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTMzMDU2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9xcDUxY2IxMmNybTEyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEzMTU2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ3ODcyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMzE1Nix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0Nzg3MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfcXA1MWNibTEyY3IxMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNDA0Nix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE1OTAwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTQwNDYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNTkwMDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3FwNTFjYm0xMmNybTEyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1MDU1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTcxNjA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTA1NSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3MTYwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfcXA1MS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTk2Nyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzMzAzMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE5Njcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzMwMzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3JlY3QwLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTQ3Nix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNTE4ODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTQ3Nix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNTE4ODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3JwdF9oZHJzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTQ3Myx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNTE4NDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTQ3Myx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNTE4NDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3NhbzAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg4MzY2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjMzODAwOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg4MzY2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjMzODAwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfc2JoMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODk0NzYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzUxODgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODk0NzYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzUxODgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9zbG93ZXIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTkwOTk5LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM3MDkxMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTkwOTk5LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM3MDkxMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfc2xvdy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzc4MDcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjA2MDI0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzc4MDcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjA2MDI0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9zcm5nMC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yNjY5Nzgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zMzIwNjU2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yNjY5Nzgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zMzIwNjU2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9zcm5nMzIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5NTg0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM1MzIzMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5NTg0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM1MzIzMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfc3JuZzY0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTQ3Nix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNTE4ODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTQ3Nix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNTE4ODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3Nybmc4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5MDQyMSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNjM2OTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5MDQyMSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNjM2OTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3NzaW0ubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjY2MDI1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzMwODc0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjY2MDI1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzMwODc0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfc3RybmdpbnRyYTAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5NzYwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM1NTQzMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5NzYwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM1NTQzMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfc3VwZXJmYXN0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI5NjI1Myx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM2ODY2MjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI5NjI1Myx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM2ODY2MjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3RjNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODk5ODcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzU4MjU2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODk5ODcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzU4MjU2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl90YzYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5Nzc2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM1NTYyNCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5Nzc2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM1NTYyNCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfdGNtNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTAwNDYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzU5MDAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTAwNDYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzU5MDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl90Y202Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTkyOSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNTc1MzYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTkyOSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNTc1MzYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3RtcF9seXJzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTQ4MCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNTE4NDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTQ4MCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNTE4NDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3RtdnAwLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5MTQ1OSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNzY2NzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5MTQ1OSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNzY2NzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3R1aW50ZXJkZXB0aDIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTkzOTM5LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjQwNzY3MixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTkzOTM5LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjQwNzY3MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfdHVpbnRlcmRlcHRoNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTEzMTEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzc0ODA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTEzMTEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzc0ODA4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl90dWludHJhZGVwdGgyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5MDMxNCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNjIzNjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5MDMxNCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNjIzNjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3R1aW50cmFkZXB0aDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTkwNDUyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM2NDA3MixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTkwNDUyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM2NDA3MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfdHVsaW1pdDIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5NDc2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM1MTg4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5NDc2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM1MTg4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfdHVsaW1pdDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5NDc2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM1MTg4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5NDc2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM1MTg4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfdWx0cmFmYXN0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI3NTU5OSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM0Mjg0MzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI3NTU5OSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM0Mjg0MzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3ZlcnlmYXN0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2NTE4MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwNDg4MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2NTE4MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwNDg4MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3ZlcnlzbG93Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTMyNix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNTAwMDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTMyNix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNTAwMDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3Z1aV9jb2xvcl9tYXRyaXgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5NDc5LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM1MTg4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5NDc5LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM1MTg4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfdnVpX2NvbG9yX3ByaW1fYnQyMDIwLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTQ3OSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNTE4ODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTQ3OSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNTE4ODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3Z1aV9jb2xvcl9wcmltX2J0NzA5Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTQ3OSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNTE4ODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTQ3OSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNTE4ODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3Z1aV90cmFuc2Zlci5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODk0Nzksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzUxODgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODk0Nzksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzUxODgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl93ZWlnaHRiMHdlaWdodHAxLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTQ3Nix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNTE4ODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTQ3Nix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNTE4ODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3dlaWdodGIxLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTc4NCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNTU3MzYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTc4NCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNTU3MzYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3dlaWdodHAwLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTQ3Nix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNTE4ODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTQ3Nix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNTE4ODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3dlaWdodHAwd2VpZ2h0YjEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5NzcxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM1NTU2OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5NzcxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM1NTU2OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfd3BwMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODk3NzIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzU1NTg0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODk3NzIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzU1NTg0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl96ZXJvbGF0ZW5jeS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMjc0NzAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yODMwNjU2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMjc0NzAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yODMwNjU2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xMDI0eDEwMjRwNTBmMzJfMjAwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTU0Mjg5LHdpZHRoPTEwMjQsaGVpZ2h0PTEwMjQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTEyMTQ0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTQyODksd2lkdGg9MTAyNCxoZWlnaHQ9MTAyNCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5MTIxNDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzEwMjR4NTc2cDUwZjMyXzExMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTg4OTM1LHdpZHRoPTEwMjQsaGVpZ2h0PTU3NixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEwOTUxMzYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTg4OTM1LHdpZHRoPTEwMjQsaGVpZ2h0PTU3NixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEwOTUxMzYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzEwMjR4NzY4cDUwZjMyXzE1MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExODkyMyx3aWR0aD0xMDI0LGhlaWdodD03NjgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDY5OTg0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTg5MjMsd2lkdGg9MTAyNCxoZWlnaHQ9NzY4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ2OTk4NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMTA4MHgxNDQwcDUwZjMyXzMxMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIzMzYzNix3aWR0aD0xMDgwLGhlaWdodD0xNDQwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjkwMzg4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjMzNjM2LHdpZHRoPTEwODAsaGVpZ2h0PTE0NDAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yOTAzODgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xMDgweDE5MjBwNTBmMzJfNDEwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mjk5MDE2LHdpZHRoPTEwODAsaGVpZ2h0PTE5MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zNzIxNDMyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yOTkwMTYsd2lkdGg9MTA4MCxoZWlnaHQ9MTkyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM3MjE0MzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzEwODB4NjRwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODE5NCx3aWR0aD0xMDgwLGhlaWdodD02NCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIxMDg3MixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTgxOTQsd2lkdGg9MTA4MCxoZWlnaHQ9NjQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMTA4NzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzEwODh4MTkyMHA1MGYzMl80MTAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yOTkyMjAsd2lkdGg9MTA4OCxoZWlnaHQ9MTkyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM3MjM5ODQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI5OTIyMCx3aWR0aD0xMDg4LGhlaWdodD0xOTIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzcyMzk4NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMTE1MngyMDQ4cDUwZjMyXzQ3MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMzOTk2MSx3aWR0aD0xMTUyLGhlaWdodD0yMDQ4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDIzMzI0OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzM5OTYxLHdpZHRoPTExNTIsaGVpZ2h0PTIwNDgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MjMzMjQ4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xMjgweDEyODBwNTBmMzJfMzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjMzMjQwLHdpZHRoPTEyODAsaGVpZ2h0PTEyODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yODk5MjMyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMzMyNDAsd2lkdGg9MTI4MCxoZWlnaHQ9MTI4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI4OTkyMzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzEyODB4MTkyMHA1MGYzMl80OTAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTcyNDQsd2lkdGg9MTI4MCxoZWlnaHQ9MTkyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0NDkyODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NzI0NCx3aWR0aD0xMjgwLGhlaWdodD0xOTIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQ0OTI4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMTI4MHg2NHA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3OTE1LHdpZHRoPTEyODAsaGVpZ2h0PTY0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjA3Mzg0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzkxNSx3aWR0aD0xMjgwLGhlaWdodD02NCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwNzM4NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMTI4MHg3MjBwNTBmMzJfMTgwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTQxNTg1LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3NTMyNTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE0MTU4NSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzUzMjU2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xMjgweDk2MHA1MGYzMl8yNDAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODIzMTAsd2lkdGg9MTI4MCxoZWlnaHQ9OTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjI2MjMyMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTgyMzEwLHdpZHRoPTEyODAsaGVpZ2h0PTk2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyNjIzMjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzEyOHgxMjhwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTczOCx3aWR0aD0xMjgsaGVpZ2h0PTEyOCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE4MDI3MixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTU3Mzgsd2lkdGg9MTI4LGhlaWdodD0xMjgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xODAyNzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzEyOHgxOTJwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjIwNix3aWR0aD0xMjgsaGVpZ2h0PTE5MixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE4NjAyNCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTYyMDYsd2lkdGg9MTI4LGhlaWdodD0xOTIsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xODYwMjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzEyOHg3MnA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1MzI1LHdpZHRoPTEyOCxoZWlnaHQ9NzIsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzUzMjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1MzI1LHdpZHRoPTEyOCxoZWlnaHQ9NzIsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzUzMjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzEyOHg5NnA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1NzAyLHdpZHRoPTEyOCxoZWlnaHQ9OTYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzk5MzYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1NzAyLHdpZHRoPTEyOCxoZWlnaHQ9OTYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzk5MzYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE0NDB4MTA4MHA1MGYzMl8zMTAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMzQxMDUsd2lkdGg9MTQ0MCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI5MDk3NDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIzNDEwNSx3aWR0aD0xNDQwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjkwOTc0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMTQ0MHgxNDQwcDUwZjMyXzQxMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI5OTEwMSx3aWR0aD0xNDQwLGhlaWdodD0xNDQwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzcyMjQ5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mjk5MTAxLHdpZHRoPTE0NDAsaGVpZ2h0PTE0NDAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zNzIyNDk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xNDQweDE5MjBwNTBmMzJfNTUwMGticHMubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDAxMjc3LHdpZHRoPTE0NDAsaGVpZ2h0PTE5MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00OTk5Njk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0xOTIwMyw0NiArMTkyMDMsNDYgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTM5NjcwLHdpZHRoPTE0NDAsaGVpZ2h0PTI1NjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02NzI5NjA4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xNDQweDk2MHA1MGYzMl8yNzAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMDUwMDksd2lkdGg9MTQ0MCxoZWlnaHQ9OTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjU0NjA1NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjA1MDA5LHdpZHRoPTE0NDAsaGVpZ2h0PTk2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI1NDYwNTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE0NHgxNDRwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTg4OCx3aWR0aD0xNDQsaGVpZ2h0PTE0NCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE4MjA0OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTU4ODgsd2lkdGg9MTQ0LGhlaWdodD0xNDQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xODIwNDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE0NHgxNzZwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjIwMSx3aWR0aD0xNDQsaGVpZ2h0PTE3NixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE4NjA1NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTYyMDEsd2lkdGg9MTQ0LGhlaWdodD0xNzYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xODYwNTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE0NHgxOTJwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjQ5Nix3aWR0aD0xNDQsaGVpZ2h0PTE5MixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE4OTY0OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTY0OTYsd2lkdGg9MTQ0LGhlaWdodD0xOTIsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xODk2NDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE0NHgyNTZwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjY0Mix3aWR0aD0xNDQsaGVpZ2h0PTI1NixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5MTQ4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTY2NDIsd2lkdGg9MTQ0LGhlaWdodD0yNTYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTE0ODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE0NHg5NnA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1NTUzLHdpZHRoPTE0NCxoZWlnaHQ9OTYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzc4NzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1NTUzLHdpZHRoPTE0NCxoZWlnaHQ9OTYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzc4NzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE1MzZ4MjA0OHA1MGYzMl82MjAwa2Jwcy5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00NTI3NDUsd2lkdGg9MTUzNixoZWlnaHQ9MjA0OCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTU2NDMwNDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE2MHgyNDBwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjkzNix3aWR0aD0xNjAsaGVpZ2h0PTI0MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5NTE0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTY5MzYsd2lkdGg9MTYwLGhlaWdodD0yNDAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTUxNDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE3MngxNzJwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjc2MSx3aWR0aD0xNzIsaGVpZ2h0PTE3MixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5Mjk2MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTY3NjEsd2lkdGg9MTcyLGhlaWdodD0xNzIsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTI5NjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE3NngxNDRwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjA2Mix3aWR0aD0xNzYsaGVpZ2h0PTE0NCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE4NDIyNCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTYwNjIsd2lkdGg9MTc2LGhlaWdodD0xNDQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xODQyMjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE3Nng5NnA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1ODY1LHdpZHRoPTE3NixoZWlnaHQ9OTYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xODE3NjgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1ODY1LHdpZHRoPTE3NixoZWlnaHQ9OTYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xODE3NjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl80MTAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMDk3MjMsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM4NTQ5NjgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMwOTcyMyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Mzg1NDk2OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMTkyMHgxMDg4cDUwZjMyXzQxMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMwOTk3NCx3aWR0aD0xOTIwLGhlaWdodD0xMDg4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Mzg1ODExMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzA5OTc0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zODU4MTEyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xOTIweDEyODBwNTBmMzJfNDkwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU3Nzk2LHdpZHRoPTE5MjAsaGVpZ2h0PTEyODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDU2MTg0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTc3OTYsd2lkdGg9MTkyMCxoZWlnaHQ9MTI4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0NTYxODQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE5MjB4MTQ0MHA1MGYzMl81NTAwa2Jwcy5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MDAwODUsd2lkdGg9MTkyMCxoZWlnaHQ9MTQ0MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ5ODQ4MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTE5MjU0LDI1ICsxOTI1NCwyNSBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03Mjg4NDEsd2lkdGg9MTkyMCxoZWlnaHQ9MjU2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTkwOTQyNDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE5MjB4NjRwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzMzNix3aWR0aD0xOTIwLGhlaWdodD02NCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwMDQ0OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTczMzYsd2lkdGg9MTkyMCxoZWlnaHQ9NjQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMDA0NDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE5MngxMjhwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTk1NCx3aWR0aD0xOTIsaGVpZ2h0PTEyOCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE4Mjk2OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTU5NTQsd2lkdGg9MTkyLGhlaWdodD0xMjgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xODI5NjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE5MngxNDRwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjE5MSx3aWR0aD0xOTIsaGVpZ2h0PTE0NCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE4NTkzNixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTYxOTEsd2lkdGg9MTkyLGhlaWdodD0xNDQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xODU5MzYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE5MngxOTJwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzA4NSx3aWR0aD0xOTIsaGVpZ2h0PTE5MixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5NzAwOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTcwODUsd2lkdGg9MTkyLGhlaWdodD0xOTIsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTcwMDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE5MngyNTZwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzE2Nix3aWR0aD0xOTIsaGVpZ2h0PTI1NixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5ODAzMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTcxNjYsd2lkdGg9MTkyLGhlaWdodD0yNTYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTgwMzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE5MngyODhwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzI3Mix3aWR0aD0xOTIsaGVpZ2h0PTI4OCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5OTM2MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTcyNzIsd2lkdGg9MTkyLGhlaWdodD0yODgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTkzNjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzIwNDh4MTE1MnA1MGYzMl80NzAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNDM0MjQsd2lkdGg9MjA0OCxoZWlnaHQ9MTE1MixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQyNzY1MzYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM0MzQyNCx3aWR0aD0yMDQ4LGhlaWdodD0xMTUyLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDI3NjUzNixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMjA0OHgxNTM2cDUwZjMyXzYyMDBrYnBzLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQ1MTk3OCx3aWR0aD0yMDQ4LGhlaWdodD0xNTM2LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTYzMzQ1NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMTkyODQsMjIgKzE5Mjg0LDIyIEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEyNDk3MDIsd2lkdGg9MjE2MCxoZWlnaHQ9Mzg0MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE1NjA1MDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8yMTZ4Mjg4cDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc0ODIsd2lkdGg9MjE2LGhlaWdodD0yODgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMDE5ODQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3NDgyLHdpZHRoPTIxNixoZWlnaHQ9Mjg4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjAxOTg0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8yMzA0eDQwOTZwNTBmMzJfMTg4MDBrYnBzLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE0MzMyNDIsd2lkdGg9MjMwNCxoZWlnaHQ9NDA5NixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3ODk5MjU2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8yNDB4MTYwcDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTY4MDksd2lkdGg9MjQwLGhlaWdodD0xNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTM1NjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2ODA5LHdpZHRoPTI0MCxoZWlnaHQ9MTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTkzNTYwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8yNDB4MjQwcDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc1NDksd2lkdGg9MjQwLGhlaWdodD0yNDAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMDI4MDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3NTQ5LHdpZHRoPTI0MCxoZWlnaHQ9MjQwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjAyODA4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8yNDB4MzIwcDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTgyMDQsd2lkdGg9MjQwLGhlaWdodD0zMjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMTEwMDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4MjA0LHdpZHRoPTI0MCxoZWlnaHQ9MzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjExMDA4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8yNDB4MzYwcDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg1NDMsd2lkdGg9MjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMTUyNDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4NTQzLHdpZHRoPTI0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjE1MjQ4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8yNTYweDE0NDBwNTBmMzJfNzMwMGticHMubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTMyMzA3LHdpZHRoPTI1NjAsaGVpZ2h0PTE0NDAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02NjM3NTY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0xOTMxNCwzNCArMTkzMTQsMzQgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTQ5NDU0Mix3aWR0aD0yNTYwLGhlaWdodD0zODQwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTg2NjU0OTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI1NngxNDRwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjk3Nyx3aWR0aD0yNTYsaGVpZ2h0PTE0NCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5NTY3MixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTY5Nzcsd2lkdGg9MjU2LGhlaWdodD0xNDQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTU2NzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI1NngxOTJwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzM0NCx3aWR0aD0yNTYsaGVpZ2h0PTE5MixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwMDI1NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTczNDQsd2lkdGg9MjU2LGhlaWdodD0xOTIsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMDAyNTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI1NngyNTZwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzkxMix3aWR0aD0yNTYsaGVpZ2h0PTI1NixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwNzM0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc5MTIsd2lkdGg9MjU2LGhlaWdodD0yNTYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMDczNDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI2NHgzNTJwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODU1OSx3aWR0aD0yNjQsaGVpZ2h0PTM1MixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIxNTQzMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg1NTksd2lkdGg9MjY0LGhlaWdodD0zNTIsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMTU0MzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI4ODB4Mzg0MHA1MGYzMl8yMjEwMGticHMubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTY5Njc0NSx3aWR0aD0yODgwLGhlaWdodD0zODQwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjExOTMwMzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI4OHgxOTJwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzQ3Mix3aWR0aD0yODgsaGVpZ2h0PTE5MixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwMTg1NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc0NzIsd2lkdGg9Mjg4LGhlaWdodD0xOTIsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMDE4NTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI4OHgyMTZwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzYwNix3aWR0aD0yODgsaGVpZ2h0PTIxNixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwMzUzNixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc2MDYsd2lkdGg9Mjg4LGhlaWdodD0yMTYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMDM1MzYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI4OHgyODhwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODAwMyx3aWR0aD0yODgsaGVpZ2h0PTI4OCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwODQ4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTgwMDMsd2lkdGg9Mjg4LGhlaWdodD0yODgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMDg0ODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI4OHgzNTJwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTA3Nix3aWR0aD0yODgsaGVpZ2h0PTM1MixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMTg5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTkwNzYsd2lkdGg9Mjg4LGhlaWdodD0zNTIsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjE4OTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI4OHg1MTJwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMDc5OSx3aWR0aD0yODgsaGVpZ2h0PTUxMixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI0MzQzMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjA3OTksd2lkdGg9Mjg4LGhlaWdodD01MTIsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNDM0MzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzMwNzJ4NDA5NnA1MGYzMl8yNDAwMGticHMubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg1MzE2NSx3aWR0aD0zMDcyLGhlaWdodD00MDk2LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjMxNDgyOTYscGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTE5MzUwLDU1ICsxOTM1MCw1NSBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODUyNTIxLHdpZHRoPTMxMjAsaGVpZ2h0PTQxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzE0MDI0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMzIweDI0MHA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4MTExLHdpZHRoPTMyMCxoZWlnaHQ9MjQwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjA5ODQ4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODExMSx3aWR0aD0zMjAsaGVpZ2h0PTI0MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwOTg0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMzIweDMyMHA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4NDUwLHdpZHRoPTMyMCxoZWlnaHQ9MzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjE0MDcyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODQ1MCx3aWR0aD0zMjAsaGVpZ2h0PTMyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIxNDA3MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMzIweDQ4MHA1MGYzMl8zMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI2MzY3LHdpZHRoPTMyMCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzEzMDMyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yNjM2Nyx3aWR0aD0zMjAsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMxMzAzMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMzUweDM1MHA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIwMDU0LHdpZHRoPTM1MCxoZWlnaHQ9MzUwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM0MTEyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMDA1NCx3aWR0aD0zNTAsaGVpZ2h0PTM1MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNDExMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMzUyeDI2NHA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4Njg2LHdpZHRoPTM1MixoZWlnaHQ9MjY0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjE3MDI0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODY4Nix3aWR0aD0zNTIsaGVpZ2h0PTI2NCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIxNzAyNCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMzUyeDI4OHA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4NTk0LHdpZHRoPTM1MixoZWlnaHQ9Mjg4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjE1ODcyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODU5NCx3aWR0aD0zNTIsaGVpZ2h0PTI4OCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIxNTg3MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMzUyeDM1MnA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5NTU4LHdpZHRoPTM1MixoZWlnaHQ9MzUyLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjI3OTIwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTU1OCx3aWR0aD0zNTIsaGVpZ2h0PTM1MixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyNzkyMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMzU2eDYzOHA1MGYzMl80MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM0OTk4LHdpZHRoPTM1NixoZWlnaHQ9NjM4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDIwOTEyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNDk5OCx3aWR0aD0zNTYsaGVpZ2h0PTYzOCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQyMDkxMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMzU2eDY0MHA1MGYzMl80MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1MDgwLHdpZHRoPTM1NixoZWlnaHQ9NjQwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDIxOTM2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTA4MCx3aWR0aD0zNTYsaGVpZ2h0PTY0MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQyMTkzNixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMzU4eDYzNnA1MGYzMl80MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM0OTczLHdpZHRoPTM1OCxoZWlnaHQ9NjM2LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDIwNTg0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNDk3Myx3aWR0aD0zNTgsaGVpZ2h0PTYzNixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQyMDU4NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMzU4eDY0MHA1MGYzMl80MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1MDE1LHdpZHRoPTM1OCxoZWlnaHQ9NjQwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDIxMTIwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTAxNSx3aWR0aD0zNTgsaGVpZ2h0PTY0MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQyMTEyMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMzYweDI0MHA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4NDUwLHdpZHRoPTM2MCxoZWlnaHQ9MjQwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjE0MDgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODQ1MCx3aWR0aD0zNjAsaGVpZ2h0PTI0MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIxNDA4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMzYweDM2MHA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5Nzc1LHdpZHRoPTM2MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjMwNjMyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTc3NSx3aWR0aD0zNjAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzMDYzMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMzYweDQ4MHA1MGYzMl8zMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI3MzgxLHdpZHRoPTM2MCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzI1NzEyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yNzM4MSx3aWR0aD0zNjAsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMyNTcxMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMzYweDYzNnA1MGYzMl80MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM0ODc1LHdpZHRoPTM2MCxoZWlnaHQ9NjM2LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDE5MzY4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNDg3NSx3aWR0aD0zNjAsaGVpZ2h0PTYzNixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQxOTM2OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMzYweDYzOHA1MGYzMl80MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1MDMyLHdpZHRoPTM2MCxoZWlnaHQ9NjM4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDIxMzM2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTAzMix3aWR0aD0zNjAsaGVpZ2h0PTYzOCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQyMTMzNixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMzYweDY0MHA1MGYzMl80MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1MTQ0LHdpZHRoPTM2MCxoZWlnaHQ9NjQwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDIyNzQ0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTE0NCx3aWR0aD0zNjAsaGVpZ2h0PTY0MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQyMjc0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMzg0MHgyMTYwcDUwZjMyXzE2NTAwa2Jwcy5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMjI1Mjk1LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNTI5OTkxMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMTk0MTAsNyArMTk0MTAsNyBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODQ3NzI1LHdpZHRoPTM4NDAsaGVpZ2h0PTM4NDAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzA4MDI4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMzg0eDUxMnA1MGYzMl8zMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI4NDAwLHdpZHRoPTM4NCxoZWlnaHQ9NTEyLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzM4NDQ4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yODQwMCx3aWR0aD0zODQsaGVpZ2h0PTUxMixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMzODQ0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfNDA5Nng0MDk2cDUwZjMyXzI0MDAwa2Jwcy5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODUwMzgzLHdpZHRoPTQwOTYsaGVpZ2h0PTQwOTYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzExMzUxMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMTk0MTksMTkzICsxOTQxOSwxOTMgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg1MTQwMyx3aWR0aD00MTYwLGhlaWdodD00MTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjMxMjYyNTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzQ3Mng0NzJwNTBmMzJfNDAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTE0MCx3aWR0aD00NzIsaGVpZ2h0PTQ3MixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQyMjY5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzUxNDAsd2lkdGg9NDcyLGhlaWdodD00NzIsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MjI2OTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzQ4MHgzMjBwNTBmMzJfMzAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yNjYwMyx3aWR0aD00ODAsaGVpZ2h0PTMyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMxNTk4NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjY2MDMsd2lkdGg9NDgwLGhlaWdodD0zMjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zMTU5ODQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzQ4MHgzNjBwNTBmMzJfMzAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yNzI0Mix3aWR0aD00ODAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMyMzk2OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjcyNDIsd2lkdGg9NDgwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zMjM5NjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzQ4MHg0ODBwNTBmMzJfNDAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTIwMSx3aWR0aD00ODAsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQyMzQ1NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzUyMDEsd2lkdGg9NDgwLGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MjM0NTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzQ4MHg2NDBwNTBmMzJfNjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00OTc3MSx3aWR0aD00ODAsaGVpZ2h0PTY0MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTYwNTU4NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDk3NzEsd2lkdGg9NDgwLGhlaWdodD02NDAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02MDU1ODQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzQ4MHg3MjBwNTBmMzJfNjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01MDg1Mix3aWR0aD00ODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTYxOTA5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTA4NTIsd2lkdGg9NDgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02MTkwOTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzQ4MHg4NDhwNTBmMzJfODAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02NDIwMSx3aWR0aD00ODAsaGVpZ2h0PTg0OCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTc4NjA1NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NjQyMDEsd2lkdGg9NDgwLGhlaWdodD04NDgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03ODYwNTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzUxMngyODhwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMDgyMCx3aWR0aD01MTIsaGVpZ2h0PTI4OCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI0MzY5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjA4MjAsd2lkdGg9NTEyLGhlaWdodD0yODgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNDM2OTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzUxMngzODRwNTBmMzJfMzAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yODM3Myx3aWR0aD01MTIsaGVpZ2h0PTM4NCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMzODExMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjgzNzMsd2lkdGg9NTEyLGhlaWdodD0zODQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zMzgxMTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzUxMng1MTJwNTBmMzJfNTAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MjE3NSx3aWR0aD01MTIsaGVpZ2h0PTUxMixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTUxMDYyNCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDIxNzUsd2lkdGg9NTEyLGhlaWdodD01MTIsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01MTA2MjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzUyOHg3MDRwNTBmMzJfNzAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01ODEwMCx3aWR0aD01MjgsaGVpZ2h0PTcwNCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTcwOTY4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTgxMDAsd2lkdGg9NTI4LGhlaWdodD03MDQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03MDk2ODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzU3NngxMDI0cDUwZjMyXzExMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTg4MzYyLHdpZHRoPTU3NixoZWlnaHQ9MTAyNCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEwODgwNzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTg4MzYyLHdpZHRoPTU3NixoZWlnaHQ9MTAyNCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEwODgwNzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzU3Nng3MDRwNTBmMzJfODAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02NTM3NCx3aWR0aD01NzYsaGVpZ2h0PTcwNCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTgwMDYwOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NjUzNzQsd2lkdGg9NTc2LGhlaWdodD03MDQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04MDA2MDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzU3Nng3MjBwNTBmMzJfODAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02NTQzNyx3aWR0aD01NzYsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTgwMTQwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NjU0Mzcsd2lkdGg9NTc2LGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04MDE0MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzYwMHg4MDBwNTBmMzJfOTAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03MjE5Nix3aWR0aD02MDAsaGVpZ2h0PTgwMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTg4NTg4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NzIxOTYsd2lkdGg9NjAwLGhlaWdodD04MDAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04ODU4ODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzYzNngzNThwNTBmMzJfNDAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTY1Mix3aWR0aD02MzYsaGVpZ2h0PTM1OCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQyOTA4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU2NTIsd2lkdGg9NjM2LGhlaWdodD0zNTgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MjkwODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzYzNngzNjBwNTBmMzJfNDAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTU4NSx3aWR0aD02MzYsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQyODI0OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU1ODUsd2lkdGg9NjM2LGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MjgyNDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzYzOHgzNTZwNTBmMzJfNDAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTc0Nix3aWR0aD02MzgsaGVpZ2h0PTM1NixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQzMDI0OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU3NDYsd2lkdGg9NjM4LGhlaWdodD0zNTYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MzAyNDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzYzOHgzNjBwNTBmMzJfNDAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTY5OCx3aWR0aD02MzgsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQyOTY1NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU2OTgsd2lkdGg9NjM4LGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00Mjk2NTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzY0MHgzNTZwNTBmMzJfNDAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTY5OCx3aWR0aD02NDAsaGVpZ2h0PTM1NixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQyOTY1NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU2OTgsd2lkdGg9NjQwLGhlaWdodD0zNTYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00Mjk2NTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzY0MHgzNThwNTBmMzJfNDAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTY4Nyx3aWR0aD02NDAsaGVpZ2h0PTM1OCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQyOTUyMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU2ODcsd2lkdGg9NjQwLGhlaWdodD0zNTgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00Mjk1MjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzY0MHgzNjBwNTBmMzJfNDAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTYwOCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQyODU0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU2MDgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00Mjg1NDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzY0MHg0ODBwNTBmMzJfNjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00OTgwOCx3aWR0aD02NDAsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTYwNjA0OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDk4MDgsd2lkdGg9NjQwLGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02MDYwNDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzY0MHg2NDBwNTBmMzJfODAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02NTE4OSx3aWR0aD02NDAsaGVpZ2h0PTY0MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTc5ODI5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NjUxODksd2lkdGg9NjQwLGhlaWdodD02NDAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03OTgyOTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzY0MHg4NDhwNTBmMzJfMTAwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9ODA0MTEsd2lkdGg9NjQwLGhlaWdodD04NDgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05ODg2NzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTgwNDExLHdpZHRoPTY0MCxoZWlnaHQ9ODQ4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTg4NjcyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF82NDB4OTYwcDUwZjMyXzEyMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTk1NTA3LHdpZHRoPTY0MCxoZWlnaHQ9OTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTE3NzM2OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9OTU1MDcsd2lkdGg9NjQwLGhlaWdodD05NjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMTc3MzY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF82NHgxMDgwcDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTczNDEsd2lkdGg9NjQsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMDAzMTIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3MzQxLHdpZHRoPTY0LGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjAwMzEyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF82NHgxMjgwcDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTcxNDIsd2lkdGg9NjQsaGVpZ2h0PTEyODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTgwMjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3MTQyLHdpZHRoPTY0LGhlaWdodD0xMjgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTk4MDI0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF82NHgxOTIwcDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc2Mzcsd2lkdGg9NjQsaGVpZ2h0PTE5MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMDQyMDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3NjM3LHdpZHRoPTY0LGhlaWdodD0xOTIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjA0MjA4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF82NHg2NHA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE0NjY5LHdpZHRoPTY0LGhlaWdodD02NCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE2ODAyNCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTQ2Njksd2lkdGg9NjQsaGVpZ2h0PTY0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTY4MDI0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF82NHg3MjBwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjc2Nyx3aWR0aD02NCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTkzMTQ0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjc2Nyx3aWR0aD02NCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTkzMTQ0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF82NHg5NnA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1MzE2LHdpZHRoPTY0LGhlaWdodD05NixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3NTExMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTUzMTYsd2lkdGg9NjQsaGVpZ2h0PTk2LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTc1MTEyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF83MDR4NTI4cDUwZjMyXzcwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTc3ODIsd2lkdGg9NzA0LGhlaWdodD01MjgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03MDU3MTIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTU3NzgyLHdpZHRoPTcwNCxoZWlnaHQ9NTI4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzA1NzEyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF83MDR4NTc2cDUwZjMyXzgwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NjUyMzUsd2lkdGg9NzA0LGhlaWdodD01NzYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03OTg4NzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTY1MjM1LHdpZHRoPTcwNCxoZWlnaHQ9NTc2LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Nzk4ODcyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF83MDR4NzA0cDUwZjMyXzkwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NzM3MTksd2lkdGg9NzA0LGhlaWdodD03MDQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05MDQ5MjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTczNzE5LHdpZHRoPTcwNCxoZWlnaHQ9NzA0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTA0OTIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF83MjB4MTI4MHA1MGYzMl8xODAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMzk4NTgsd2lkdGg9NzIwLGhlaWdodD0xMjgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTczMTY3MixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTM5ODU4LHdpZHRoPTcyMCxoZWlnaHQ9MTI4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3MzE2NzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzcyMHg0ODBwNTBmMzJfNjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01MDc0Mix3aWR0aD03MjAsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTYxNzcyMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTA3NDIsd2lkdGg9NzIwLGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02MTc3MjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzcyMHg1NzZwNTBmMzJfODAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02NTQ1Mix3aWR0aD03MjAsaGVpZ2h0PTU3NixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTgwMTU4NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NjU0NTIsd2lkdGg9NzIwLGhlaWdodD01NzYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04MDE1ODQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzcyMHg2NHA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3MzMzLHdpZHRoPTcyMCxoZWlnaHQ9NjQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMDAxMjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3MzMzLHdpZHRoPTcyMCxoZWlnaHQ9NjQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMDAxMjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzcyMHg3MjBwNTBmMzJfMTAwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9ODA4Njgsd2lkdGg9NzIwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05OTQyODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTgwODY4LHdpZHRoPTcyMCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTk0MjgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF83MjB4OTYwcDUwZjMyXzEzMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwMzU0OCx3aWR0aD03MjAsaGVpZ2h0PTk2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEyNzc4ODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwMzU0OCx3aWR0aD03MjAsaGVpZ2h0PTk2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEyNzc4ODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzcyeDEyOHA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1MjA4LHdpZHRoPTcyLGhlaWdodD0xMjgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzM2NTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1MjA4LHdpZHRoPTcyLGhlaWdodD0xMjgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzM2NTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzcyeDk2cDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTUzNTcsd2lkdGg9NzIsaGVpZ2h0PTk2LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTc1NzIwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTM1Nyx3aWR0aD03MixoZWlnaHQ9OTYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzU3MjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzc2OHgxMDI0cDUwZjMyXzE1MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExODk3OCx3aWR0aD03NjgsaGVpZ2h0PTEwMjQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDcwNzY4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTg5Nzgsd2lkdGg9NzY4LGhlaWdodD0xMDI0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ3MDc2OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfODAweDYwMHA1MGYzMl85MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTczMzY4LHdpZHRoPTgwMCxoZWlnaHQ9NjAwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTAwNTM2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03MzM2OCx3aWR0aD04MDAsaGVpZ2h0PTYwMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTkwMDUzNixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfODAweDgwMHA1MGYzMl8xMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT05NTc0MCx3aWR0aD04MDAsaGVpZ2h0PTgwMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTExODAyODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTk1NzQwLHdpZHRoPTgwMCxoZWlnaHQ9ODAwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTE4MDI4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfODQ4eDQ4MHA1MGYzMl84MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTY1MTgyLHdpZHRoPTg0OCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Nzk4MjI0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02NTE4Mix3aWR0aD04NDgsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTc5ODIyNCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfODQ4eDY0MHA1MGYzMl8xMDAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT04MTQxOSx3aWR0aD04NDgsaGVpZ2h0PTY0MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEwMDExNjgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTgxNDE5LHdpZHRoPTg0OCxoZWlnaHQ9NjQwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTAwMTE2OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfODQ4eDg0OHA1MGYzMl8xNDAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTA5NzUsd2lkdGg9ODQ4LGhlaWdodD04NDgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzcwNzIwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTA5NzUsd2lkdGg9ODQ4LGhlaWdodD04NDgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzcwNzIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF85NjB4MTI4MHA1MGYzMl8yNDAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODEzMzMsd2lkdGg9OTYwLGhlaWdodD0xMjgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjI1MDExMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTgxMzMzLHdpZHRoPTk2MCxoZWlnaHQ9MTI4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyNTAxMTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzk2MHgxNDQwcDUwZjMyXzI3MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIwMzk0Nix3aWR0aD05NjAsaGVpZ2h0PTE0NDAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNTMyNzY4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMDM5NDYsd2lkdGg9OTYwLGhlaWdodD0xNDQwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjUzMjc2OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfOTYweDY0MHA1MGYzMl8xMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT05NTY0Nix3aWR0aD05NjAsaGVpZ2h0PTY0MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTExNzkwMDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTk1NjQ2LHdpZHRoPTk2MCxoZWlnaHQ9NjQwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTE3OTAwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfOTYweDcyMHA1MGYzMl8xMzAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDM5ODQsd2lkdGg9OTYwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMjgzMjMyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDM5ODQsd2lkdGg9OTYwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMjgzMjMyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF85NjB4OTYwcDUwZjMyXzE4MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE0MTU2Myx3aWR0aD05NjAsaGVpZ2h0PTk2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3NTMwNzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE0MTU2Myx3aWR0aD05NjAsaGVpZ2h0PTk2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3NTMwNzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzk2eDEyOHA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1NDA5LHdpZHRoPTk2LGhlaWdodD0xMjgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzYxNjgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1NDA5LHdpZHRoPTk2LGhlaWdodD0xMjgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzYxNjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzk2eDE0NHA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1MjI0LHdpZHRoPTk2LGhlaWdodD0xNDQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzM4NTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1MjI0LHdpZHRoPTk2LGhlaWdodD0xNDQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzM4NTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzk2eDE3NnA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2MjE5LHdpZHRoPTk2LGhlaWdodD0xNzYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xODYyOTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2MjE5LHdpZHRoPTk2LGhlaWdodD0xNzYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xODYyOTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzk2eDY0cDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTUyMTUsd2lkdGg9OTYsaGVpZ2h0PTY0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTc1NzQ0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTIxNSx3aWR0aD05NixoZWlnaHQ9NjQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzU3NDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzk2eDcycDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTUyMjAsd2lkdGg9OTYsaGVpZ2h0PTcyLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTc0MDA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTIyMCx3aWR0aD05NixoZWlnaHQ9NzIsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzQwMDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzk2eDk2cDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTU3NjQsd2lkdGg9OTYsaGVpZ2h0PTk2LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTgxMDA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTc2NCx3aWR0aD05NixoZWlnaHQ9OTYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xODEwMDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9zY2FsaW5nX2xpc3QvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZGVmc2xpc3QubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzI2NTE2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQwNjQ4OTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMyNjUxNix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MDY0ODk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvc2NhbGluZ19saXN0L2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vc2xpc3QubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzI5Mzk2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQxMDA4OTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMyOTM5Nix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MTAwODk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvc2NhbGluZ19saXN0L2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX3NsaXN0X2ZsYXRfMTYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzI5NDMyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQxMDA4OTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMyOTQzMix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MTAwODk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvc2NhbGluZ19saXN0L2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX3NsaXN0X2ZsYXRfMS5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT05MjAxOTcsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTE0ODU0MzIscGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTE5NjE0LDEzICsxOTYxNCwxMyBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MzQxNDEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTQwMDQ0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3NjYWxpbmdfbGlzdC9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9zbGlzdF9ybmRtXzEyMF8xMzYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjM5ODc2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI5NzE1MTIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIzOTg3Nix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yOTcxNTEyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvc2NhbGluZ19saXN0L2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX3NsaXN0X3JuZG1fMV8yNTUubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjkwOTMwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM1OTg1MTIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI5MDkzMCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zNTk4NTEyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvc2NhbGluZ19saXN0L2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX3NsaXN0X3JuZG1fMjQwXzI1NS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMTQ1MDYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjY1NDYwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjE0NTA2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI2NTQ2MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9zY2FsaW5nX2xpc3QvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfc2xpc3RfdmVydF8xXzI1NS5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01ODM5MDksd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzI3NzM0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMTk2ODAsNjEgKzE5NjgwLDYxIEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM3OTYyMTYsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ3NDMxNDgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvc2NhbGluZ19saXN0L2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9kZWZzbGlzdC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03NTU4Mix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTkyODIyNCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NzU1ODIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05MjgyMjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9zY2FsaW5nX2xpc3QvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vc2xpc3QubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NzU3Nzgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05MzA2NzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTc1Nzc4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTMwNjcyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvc2NhbGluZ19saXN0L2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9zbGlzdF9mbGF0XzE2Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTc1ODEzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTMwNjcyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03NTgxMyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTkzMDY3MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3NjYWxpbmdfbGlzdC9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfc2xpc3RfZmxhdF8xLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4NDA1Nyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyODM2ODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4NDA1Nyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyODM2ODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9zY2FsaW5nX2xpc3QvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3NsaXN0X3JuZG1fMV8xNi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT04NTM2MSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEwNDA2OTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTg1MzYxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTA0MDY5NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3NjYWxpbmdfbGlzdC9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfc2xpc3Rfcm5kbV8xMjBfMTM2Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTU4MjU4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzAxMjgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01ODI1OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTcwMTI4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3NjYWxpbmdfbGlzdC9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfc2xpc3Rfcm5kbV8xXzI1NS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03MTMwNCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTg1MzIwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NzEzMDQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04NTMyMDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9zY2FsaW5nX2xpc3QvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3NsaXN0X3JuZG1fMjQwXzI1NS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01MTIxNyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTYxMzQ4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTEyMTcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02MTM0ODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9zY2FsaW5nX2xpc3QvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3NsaXN0X3ZlcnRfMV8yNTUubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE3MTk2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ0MzQ0OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE3MTk2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ0MzQ0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3NjYWxpbmdfbGlzdC9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZGVmc2xpc3QubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTUyODY4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTg5NDI4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTUyODY4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTg5NDI4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3NjYWxpbmdfbGlzdC9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9zbGlzdC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTQ3NjEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTE3OTQ0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTQ3NjEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTE3OTQ0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvc2NhbGluZ19saXN0L2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9zbGlzdF9mbGF0XzE2Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1NDc5NSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5MTc5NDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1NDc5NSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5MTc5NDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9zY2FsaW5nX2xpc3QvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3NsaXN0X2ZsYXRfMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNzU2NDYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00Njc4NTQ0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNzU2NDYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00Njc4NTQ0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvc2NhbGluZ19saXN0L2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9zbGlzdF9ybmRtXzFfMTYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg0NTkwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjI4MTA0OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg0NTkwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjI4MTA0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3NjYWxpbmdfbGlzdC9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfc2xpc3Rfcm5kbV8xMjBfMTM2Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNDcxNix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0MDcwMDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNDcxNix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0MDcwMDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9zY2FsaW5nX2xpc3QvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3NsaXN0X3JuZG1fMV8yNTUubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTQxNjU1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTczMjU2OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTQxNjU1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTczMjU2OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3NjYWxpbmdfbGlzdC9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfc2xpc3Rfcm5kbV8yNDBfMjU1Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwMTczMCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEyNDQ4ODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwMTczMCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEyNDQ4ODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9zY2FsaW5nX2xpc3QvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3NsaXN0X3ZlcnRfMV8yNTUubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjM5MzAzLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Mjk2OTc2OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjM5MzAzLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Mjk2OTc2OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3NsaWNlc190aWxlcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyXzJ4MnRpbGVzXzUxMmJ5dGVzX3BlcnNsaWNlLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTUyOTksd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI0NTEyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01Mjk5LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNDUxMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3NsaWNlc190aWxlcy9jcm93ZF8zODQweDIxNjBwNTBmMzIvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyXzEwMjRieXRlX3NsaWNlcy5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMjg3NzM1LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04MDM5NzM2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0xOTc0MywxMCArMTk3NDMsMTAgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTYzNzg5MTMsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEwMjM1OTYwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3NsaWNlc190aWxlcy9jcm93ZF8zODQweDIxNjBwNTBmMzIvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyXzE2Y3Ric19wZXJkcHNsaWNlXzI0Y3Ric19wZXJzbGljZV93cHAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDA5Nix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTAyMzg0NzY4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MDk2LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMDIzODQ3NjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9zbGljZXNfdGlsZXMvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl8xY3Ric19wZXJzbGljZV9ub2xwZmJuZHJ5Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQwOTYsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEwOTI4NDY0OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDA5Nix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTA5Mjg0NjQ4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvc2xpY2VzX3RpbGVzL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMi9jcm93ZF8zODQweDIxNjBwNTBmMzJfMXRpbGVfcGVyMnJvd3NfM2N0YnNfcGVyZHBzbGljZV81cGVyc2xpY2UubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTY2ODI2Mzgsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEwNDI1Nzg4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMTk3ODgsNyArMTk3ODgsNyBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMjgxODY4LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04MDAzMDY0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvc2xpY2VzX3RpbGVzL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMi9jcm93ZF8zODQweDIxNjBwNTBmMzJfMngydGlsZXNfMTZjdGJzX3BlcmRwc2xpY2VfMjRjdGJzX3BlcnNsaWNlX2N0YjMyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQwOTYsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEwNDY0NjAyNCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDA5Nix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTA0NjQ2MDI0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDIyLzhiaXQvc2xpY2VzX3RpbGVzL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMi9jcm93ZF8zODQweDIxNjBwNTBmMzJfMngydGlsZXNfMTZjdGJzX3BlcmRwc2xpY2VfMjRjdGJzX3BlcnNsaWNlLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2Mzg0MzMxLHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMDIzOTM0NTYscGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTE5ODE1LDcgKzE5ODE1LDcgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTY2MTIyNTcsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEwMzgxODAwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3NsaWNlc190aWxlcy9jcm93ZF8zODQweDIxNjBwNTBmMzIvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyXzVjdGJzX3BlcmRwc2xpY2Vfd3BwX3NwczFfcHBzNy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MDk2LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMDIzMjk0ODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQwOTYsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEwMjMyOTQ4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3NsaWNlc190aWxlcy9jcm93ZF8zODQweDIxNjBwNTBmMzIvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyX2E0c2xpY2VzLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEyODIzNjIsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTgwMDYxNjAscGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTE5ODMwLDEwICsxOTgzMCwxMCBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTExOTQwNyx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTQ0ODc2ODgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9zbGljZXNfdGlsZXMvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl9sdDFfZHBzbGljZXNfcGVycm93X2x0MV9zbGljZXNfcGVycm93X3dwcC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MDk2LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05NDQ5Mjk3NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDA5Nix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTQ0OTI5NzYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0MjIvOGJpdC9zbGljZXNfdGlsZXMvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl9sdDFfZHBzbGljZXNfcGVycm93X2x0MV9zbGljZXNfcGVycm93X3dwcF9zcHM1X3BwczEzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQwOTYsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTk0NTAyMTEyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MDk2LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05NDUwMjExMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQyMi84Yml0L3NsaWNlc190aWxlcy9jcm93ZF8zODQweDIxNjBwNTBmMzIvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyX2x0MV9zbGljZXNfcGVycm93Lm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1MTE0MzI5LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05NDQ1NTk1MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMTk5ODYsMTg0ICsxOTk4NiwxODQgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mzk2NTgzMSx3aWR0aD0zNzA0LGhlaWdodD0yMDQwLGZyYW1lLXJhdGU9MjUscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjQ3Nzc4MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvZ29wL2Nyb3dkXzEyODB4NzIwcDUwL2Nyb3dkXzEyODB4NzIwcDUwZjEwX2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTYzODE0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTY1MTE5NjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2MzgxNCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02NTExOTYwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF8xMjgweDcyMHA1MC9jcm93ZF8xMjgweDcyMHA1MGYxMV9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2OTYwMSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02MTI5OTYwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjk2MDEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NjEyOTk2MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9nb3AvY3Jvd2RfMTI4MHg3MjBwNTAvY3Jvd2RfMTI4MHg3MjBwNTBmMTJfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzQyNzAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTc3NDM2MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc0MjcwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTU3NzQzNjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvZ29wL2Nyb3dkXzEyODB4NzIwcDUwL2Nyb3dkXzEyODB4NzIwcDUwZjEzX2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTgxNDU4LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTU1NTA5ODQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4MTQ1OCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01NTUwOTg0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF8xMjgweDcyMHA1MC9jcm93ZF8xMjgweDcyMHA1MGYxNF9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4NDY4NSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01MjQ2NTY4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODQ2ODUsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTI0NjU2OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9nb3AvY3Jvd2RfMTI4MHg3MjBwNTAvY3Jvd2RfMTI4MHg3MjBwNTBmMTVfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTI0MDQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTEwMjUyOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTkyNDA0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTUxMDI1MjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvZ29wL2Nyb3dkXzEyODB4NzIwcDUwL2Nyb3dkXzEyODB4NzIwcDUwZjE2X2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTk0NDYwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ4MzQ5MjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5NDQ2MCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00ODM0OTIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF8xMjgweDcyMHA1MC9jcm93ZF8xMjgweDcyMHA1MGYxX2dvcDEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NzM0NDUsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01ODA3MjgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTczNDQ1LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTgwNzI4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF8xMjgweDcyMHA1MC9jcm93ZF8xMjgweDcyMHA1MGYxX2dvcDIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NzM0NTUsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01ODA4MDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTczNDU1LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTgwODA4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF8xMjgweDcyMHA1MC9jcm93ZF8xMjgweDcyMHA1MGYxX2dvcDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NzM0NTUsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01ODA4MDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTczNDU1LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTgwODA4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF8xMjgweDcyMHA1MC9jcm93ZF8xMjgweDcyMHA1MGYxX2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NzM0NTYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01ODA4MDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTczNDU2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTgwODA4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF8xMjgweDcyMHA1MC9jcm93ZF8xMjgweDcyMHA1MGYyX2dvcDEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9ODk4MjIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTc3ODgwMDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTg5ODIyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3Nzg4MDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF8xMjgweDcyMHA1MC9jcm93ZF8xMjgweDcyMHA1MGYyX2dvcDIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9ODk4MzIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTc3OTAwMDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTg5ODMyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3NzkwMDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF8xMjgweDcyMHA1MC9jcm93ZF8xMjgweDcyMHA1MGYyX2dvcDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9ODk4MzIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTc3OTAwMDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTg5ODMyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3NzkwMDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF8xMjgweDcyMHA1MC9jcm93ZF8xMjgweDcyMHA1MGYyX2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9ODk4MzMsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTc3OTAwMDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTg5ODMzLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3NzkwMDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF8xMjgweDcyMHA1MC9jcm93ZF8xMjgweDcyMHA1MGYzX2dvcDIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTAyNzcwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNTc0NDAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDI3NzAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM1NzQ0MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvZ29wL2Nyb3dkXzEyODB4NzIwcDUwL2Nyb3dkXzEyODB4NzIwcDUwZjNfZ29wNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDI3NzAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM1NzQ0MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwMjc3MCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzU3NDQwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9nb3AvY3Jvd2RfMTI4MHg3MjBwNTAvY3Jvd2RfMTI4MHg3MjBwNTBmM19nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwMjc3MSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzU3NDQwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTAyNzcxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNTc0NDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF8xMjgweDcyMHA1MC9jcm93ZF8xMjgweDcyMHA1MGY0X2dvcDIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTEwNzk3LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEwOTgyMjk2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTA3OTcsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTA5ODIyOTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvZ29wL2Nyb3dkXzEyODB4NzIwcDUwL2Nyb3dkXzEyODB4NzIwcDUwZjRfZ29wNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTIyOTYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTExMzIyMDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExMjI5Nix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMTEzMjIwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9nb3AvY3Jvd2RfMTI4MHg3MjBwNTAvY3Jvd2RfMTI4MHg3MjBwNTBmNF9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExMjI5Nyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMTEzMjIwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTEyMjk3LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTExMTMyMjAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF8xMjgweDcyMHA1MC9jcm93ZF8xMjgweDcyMHA1MGY1X2dvcDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTIzNzY3LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTk4MjI0ODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEyMzc2Nyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05ODIyNDgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF8xMjgweDcyMHA1MC9jcm93ZF8xMjgweDcyMHA1MGY1X2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTIzNzY4LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTk4MjI0ODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEyMzc2OCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05ODIyNDgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF8xMjgweDcyMHA1MC9jcm93ZF8xMjgweDcyMHA1MGY2X2dvcDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTI5ODU0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTg1OTA0MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEyOTg1NCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04NTkwNDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF8xMjgweDcyMHA1MC9jcm93ZF8xMjgweDcyMHA1MGY2X2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTI5ODUzLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTg1OTA4MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEyOTg1Myx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04NTkwODAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF8xMjgweDcyMHA1MC9jcm93ZF8xMjgweDcyMHA1MGY3X2dvcDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTM1MjkwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTc2NzMxMzYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEzNTI5MCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03NjczMTM2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF8xMjgweDcyMHA1MC9jcm93ZF8xMjgweDcyMHA1MGY3X2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTQxMzcwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTgwMjE0MjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE0MTM3MCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04MDIxNDI0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF8xMjgweDcyMHA1MC9jcm93ZF8xMjgweDcyMHA1MGY4X2dvcDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTM5NDk5LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTY5MjM4NDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEzOTQ5OSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02OTIzODQ4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF8xMjgweDcyMHA1MC9jcm93ZF8xMjgweDcyMHA1MGY4X2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTQ1MzUxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTcyMTc2MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE0NTM1MSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03MjE3NjAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF8xMjgweDcyMHA1MC9jcm93ZF8xMjgweDcyMHA1MGY5X2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTU4NjIzLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTcwMDUzMjgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1ODYyMyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03MDA1MzI4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF8xOTIweDEwODBwNTAvY3Jvd2RfMTkyMHgxMDgwcDUwZjEwX2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc2NTcwLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03MDIyMTYwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzY1NzAsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTcwMjIxNjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmMTFfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODY0NzQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTY3NDM0ODgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4NjQ3NCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Njc0MzQ4OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9nb3AvY3Jvd2RfMTkyMHgxMDgwcDUwL2Nyb3dkXzE5MjB4MTA4MHA1MGYxMl9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5NjU4MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NjUxODAzMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTk2NTgxLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02NTE4MDMyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF8xOTIweDEwODBwNTAvY3Jvd2RfMTkyMHgxMDgwcDUwZjEzX2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjA2ODc2LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02MzMzMDQwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMDY4NzYsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTYzMzMwNDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmMTRfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMTA5MjYsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTU5OTYyODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIxMDkyNix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTk5NjI4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9nb3AvY3Jvd2RfMTkyMHgxMDgwcDUwL2Nyb3dkXzE5MjB4MTA4MHA1MGYxNV9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIyMjYwOSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTkwNzk2OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjIyNjA5LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01OTA3OTY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF8xOTIweDEwODBwNTAvY3Jvd2RfMTkyMHgxMDgwcDUwZjE2X2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTk5MTgwLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00OTUyODk2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTkxODAsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ5NTI4OTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmMV9nb3AxLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTY1MjA0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0xLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTUxNDgwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NjUyMDQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTE0ODAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF8xOTIweDEwODBwNTAvY3Jvd2RfMTkyMHgxMDgwcDUwZjFfZ29wMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02NTIxNCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01MTQ4ODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTY1MjE0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0xLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTUxNDg4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9nb3AvY3Jvd2RfMTkyMHgxMDgwcDUwL2Nyb3dkXzE5MjB4MTA4MHA1MGYxX2dvcDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NjUyMTQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTE0ODgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02NTIxNCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01MTQ4ODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmMV9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTY1MjE2LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0xLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTUxNDg4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NjUyMTYsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTE0ODgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF8xOTIweDEwODBwNTAvY3Jvd2RfMTkyMHgxMDgwcDUwZjJfZ29wMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03OTgzMyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTU3OTAyMDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTc5ODMzLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNTc5MDIwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9nb3AvY3Jvd2RfMTkyMHgxMDgwcDUwL2Nyb3dkXzE5MjB4MTA4MHA1MGYyX2dvcDIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Nzk4NDMsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE1NzkyMjAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03OTg0Myx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTU3OTIyMDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmMl9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTc5ODQzLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNTc5MjIwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Nzk4NDMsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE1NzkyMjAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF8xOTIweDEwODBwNTAvY3Jvd2RfMTkyMHgxMDgwcDUwZjJfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03OTg0NSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTU3OTIyMDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTc5ODQ1LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNTc5MjIwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9nb3AvY3Jvd2RfMTkyMHgxMDgwcDUwL2Nyb3dkXzE5MjB4MTA4MHA1MGYzX2dvcDIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9OTE0NTMsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEyMDY1NDY0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT05MTQ1Myx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTIwNjU0NjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmM19nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTkxNDUzLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMjA2NTQ2NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9OTE0NTMsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEyMDY1NDY0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF8xOTIweDEwODBwNTAvY3Jvd2RfMTkyMHgxMDgwcDUwZjNfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT05MTQ1NSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTIwNjU0NjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTkxNDU1LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMjA2NTQ2NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9nb3AvY3Jvd2RfMTkyMHgxMDgwcDUwL2Nyb3dkXzE5MjB4MTA4MHA1MGY0X2dvcDIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTAxMDYzLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMDAwODg5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTAxMDYzLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMDAwODg5NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9nb3AvY3Jvd2RfMTkyMHgxMDgwcDUwL2Nyb3dkXzE5MjB4MTA4MHA1MGY0X2dvcDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9OTk2MDIsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTk4NjI4MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTk5NjAyLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05ODYyODAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF8xOTIweDEwODBwNTAvY3Jvd2RfMTkyMHgxMDgwcDUwZjRfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT05OTYwNCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTg2MjgwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9OTk2MDQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTk4NjI4MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmNV9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwOTA3Mix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9ODY0Njg4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA5MDcyLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04NjQ2ODgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF8xOTIweDEwODBwNTAvY3Jvd2RfMTkyMHgxMDgwcDUwZjVfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDkwNzQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTg2NDY4ODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwOTA3NCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9ODY0Njg4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9nb3AvY3Jvd2RfMTkyMHgxMDgwcDUwL2Nyb3dkXzE5MjB4MTA4MHA1MGY2X2dvcDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTI2Njc1LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04Mzc4NDY0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMjY2NzUsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTgzNzg0NjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmNl9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExMzkxMix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzUyODAwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTEzOTEyLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03NTI4MDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF8xOTIweDEwODBwNTAvY3Jvd2RfMTkyMHgxMDgwcDUwZjdfZ29wNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMzQ3MzIsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTc2NDEyNTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEzNDczMix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzY0MTI1NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9nb3AvY3Jvd2RfMTkyMHgxMDgwcDUwL2Nyb3dkXzE5MjB4MTA4MHA1MGY3X2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTI0NjUzLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03MDY2MTEyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMjQ2NTMsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTcwNjYxMTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmOF9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE0MjAyNix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzA1MDIwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTQyMDI2LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03MDUwMjAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF8xOTIweDEwODBwNTAvY3Jvd2RfMTkyMHgxMDgwcDUwZjhfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMjcxNzEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTYzMDg1NDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEyNzE3MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NjMwODU0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9nb3AvY3Jvd2RfMTkyMHgxMDgwcDUwL2Nyb3dkXzE5MjB4MTA4MHA1MGY5X2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTM4NTY3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02MTEzOTA0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMzg1Njcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTYxMTM5MDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmMTBfZ29wOC5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MDczNjMsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE2MjUzODgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0yMDE4NywyNzQgKzIwMTg3LDI3NCBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01Mjk1NDksd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzMjEyMTIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF8zODQweDIxNjBwNTAvY3Jvd2RfMzg0MHgyMTYwcDUwZjFfZ29wMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjMwNzEsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTI5NzczNixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTYzMDcxLHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0xLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEyOTc3MzYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmMV9nb3AyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2MzA4Mix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMjk3ODE2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjMwODIsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTI5NzgxNixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9nb3AvY3Jvd2RfMzg0MHgyMTYwcDUwL2Nyb3dkXzM4NDB4MjE2MHA1MGYxX2dvcDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTYzMDgyLHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0xLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEyOTc4MTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2MzA4Mix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMjk3ODE2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF8zODQweDIxNjBwNTAvY3Jvd2RfMzg0MHgyMTYwcDUwZjFfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjMwODMsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTI5NzgxNixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTYzMDgzLHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0xLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEyOTc4MTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmMl9nb3AxLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5NzQ0MSx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzkzMTE4MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5NzQ0MSx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzkzMTE4MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmMl9nb3AyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5NzQ1Mix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzkzMTM4MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5NzQ1Mix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzkzMTM4MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmMl9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5NzQ1Mix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzkzMTM4MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5NzQ1Mix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzkzMTM4MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmMl9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5NzQ1Myx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzkzMTM4MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5NzQ1Myx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzkzMTM4MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmM19nb3AyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIyNTYxNyx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Mjk5NTM4NjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIyNTYxNyx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Mjk5NTM4NjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmM19nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIyNTYxNyx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Mjk5NTM4NjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIyNTYxNyx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Mjk5NTM4NjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmM19nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIyNTYxOCx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Mjk5NTM4NjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIyNTYxOCx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Mjk5NTM4NjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmNF9nb3AyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI0MzA0Nyx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjQyMDcyMDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI0MzA0Nyx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjQyMDcyMDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmNF9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI0NjkzMCx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjQ1OTU0OTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI0NjkzMCx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjQ1OTU0OTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmNF9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI0NjkzMSx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjQ1OTU0OTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI0NjkzMSx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjQ1OTU0OTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmNV9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI3Mjk5MCx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjE3NjAyNDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI3Mjk5MCx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjE3NjAyNDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmNV9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI3Mjk5MSx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjE3NjAyNDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI3Mjk5MSx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjE3NjAyNDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmNl9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI5Njk5Mix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTk3MzI4NjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI5Njk5Mix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTk3MzI4NjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmNl9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI4ODQ0Mix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTkxNjMzMjgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI4ODQ0Mix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTkxNjMzMjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmN19nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMxNjE5Nix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTgwMTA1NjgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMxNjE5Nix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTgwMTA1NjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmN19nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMxNDU5MCx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTc5MTk2NTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMxNDU5MCx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTc5MTk2NTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmOF9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMzNDM4Nix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTY2NjgxNDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMzNDM4Nix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTY2NjgxNDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmOF9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMyNzE1NCx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTYzMDc2OTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMyNzE1NCx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTYzMDc2OTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmOV9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NjY0Myx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTU4MDYxNzYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NjY0Myx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTU4MDYxNzYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvZ29wL2Nyb3dkXzY0MHgzNjBwNTAvY3Jvd2RfNjQweDM2MHA1MGYxMF9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI2NDYwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTAxNzgwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjY0NjAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMDE3ODAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF82NDB4MzYwcDUwL2Nyb3dkXzY0MHgzNjBwNTBmMTFfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yNzcyOSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTk3MDk3NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mjc3Mjksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05NzA5NzYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvZ29wL2Nyb3dkXzY0MHgzNjBwNTAvY3Jvd2RfNjQweDM2MHA1MGYxMl9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI4NjE1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTE5MjAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yODYxNSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTkxOTIwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9nb3AvY3Jvd2RfNjQweDM2MHA1MC9jcm93ZF82NDB4MzYwcDUwZjEzX2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mjk4Njksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04ODY3MDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI5ODY5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9ODg2NzA0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF82NDB4MzYwcDUwL2Nyb3dkXzY0MHgzNjBwNTBmMTRfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMDIyNCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTgzMzM5MixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzAyMjQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04MzMzOTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvZ29wL2Nyb3dkXzY0MHgzNjBwNTAvY3Jvd2RfNjQweDM2MHA1MGYxNV9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMxOTc3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9ODI0NDgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMTk3Nyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTgyNDQ4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9nb3AvY3Jvd2RfNjQweDM2MHA1MC9jcm93ZF82NDB4MzYwcDUwZjE2X2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzE3OTYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03NjgzMjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMxNzk2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzY4MzIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF82NDB4MzYwcDUwL2Nyb3dkXzY0MHgzNjBwNTBmMV9nb3AxLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEyNTQ0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05MzUyOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTI1NDQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0xLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTkzNTI4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF82NDB4MzYwcDUwL2Nyb3dkXzY0MHgzNjBwNTBmMV9nb3AyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEyNTU0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05MzYwOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTI1NTQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0xLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTkzNjA4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF82NDB4MzYwcDUwL2Nyb3dkXzY0MHgzNjBwNTBmMV9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEyNTU1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05MzYwOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTI1NTUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0xLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTkzNjA4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF82NDB4MzYwcDUwL2Nyb3dkXzY0MHgzNjBwNTBmMV9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEyNTU2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05MzYwOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTI1NTYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0xLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTkzNjA4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF82NDB4MzYwcDUwL2Nyb3dkXzY0MHgzNjBwNTBmMl9nb3AxLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1NDAyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjkwNDIwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTU0MDIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yOTA0MjAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF82NDB4MzYwcDUwL2Nyb3dkXzY0MHgzNjBwNTBmMl9nb3AyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1NDEyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjkwNjIwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTU0MTIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yOTA2MjAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF82NDB4MzYwcDUwL2Nyb3dkXzY0MHgzNjBwNTBmMl9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1NDEzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjkwNjIwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTU0MTMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yOTA2MjAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF82NDB4MzYwcDUwL2Nyb3dkXzY0MHgzNjBwNTBmMl9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1NDE0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjkwNjIwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTU0MTQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yOTA2MjAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF82NDB4MzYwcDUwL2Nyb3dkXzY0MHgzNjBwNTBmM19nb3AyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3MzEwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjE3OTg2NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTczMTAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMTc5ODY0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF82NDB4MzYwcDUwL2Nyb3dkXzY0MHgzNjBwNTBmM19nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3MzExLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjE3OTg2NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTczMTEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMTc5ODY0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF82NDB4MzYwcDUwL2Nyb3dkXzY0MHgzNjBwNTBmM19nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3MzEyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjE3OTg2NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTczMTIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMTc5ODY0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF82NDB4MzYwcDUwL2Nyb3dkXzY0MHgzNjBwNTBmNF9nb3AyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4NTcwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTc1OTY5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg1NzAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzU5Njk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF82NDB4MzYwcDUwL2Nyb3dkXzY0MHgzNjBwNTBmNF9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4Nzc1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTc4MDA5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg3NzUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzgwMDk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF82NDB4MzYwcDUwL2Nyb3dkXzY0MHgzNjBwNTBmNF9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4Nzc2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTc4MDA5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg3NzYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzgwMDk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF82NDB4MzYwcDUwL2Nyb3dkXzY0MHgzNjBwNTBmNV9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIwMDM1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTUyMzkyMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjAwMzUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNTIzOTIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF82NDB4MzYwcDUwL2Nyb3dkXzY0MHgzNjBwNTBmNV9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIwMDM2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTUyMzkyMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjAwMzYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNTIzOTIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF82NDB4MzYwcDUwL2Nyb3dkXzY0MHgzNjBwNTBmNl9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIxMzQ3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM1NjYwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjEzNDcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzU2NjAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF82NDB4MzYwcDUwL2Nyb3dkXzY0MHgzNjBwNTBmNl9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIwNjMzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTMwOTQ2NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjA2MzMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzA5NDY0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF82NDB4MzYwcDUwL2Nyb3dkXzY0MHgzNjBwNTBmN19nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIyMjc1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTIxNTEzNixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjIyNzUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMjE1MTM2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF82NDB4MzYwcDUwL2Nyb3dkXzY0MHgzNjBwNTBmN19nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIxOTU0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTE5NzY1NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjE5NTQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMTk3NjU2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF82NDB4MzYwcDUwL2Nyb3dkXzY0MHgzNjBwNTBmOF9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIzMTUzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTEwNjU0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjMxNTMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMTA2NTQ0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF82NDB4MzYwcDUwL2Nyb3dkXzY0MHgzNjBwNTBmOF9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIyNTk5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTA4MDAwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjI1OTksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMDgwMDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF82NDB4MzYwcDUwL2Nyb3dkXzY0MHgzNjBwNTBmOV9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIzOTYwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTAyMDMwNCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjM5NjAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMDIwMzA0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF84NTR4NDgwcDUwL2Nyb3dkXzg1NHg0ODBwNTBmMTBfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02MzU1NSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI1MDE1NjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTYzNTU1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjUwMTU2MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9nb3AvY3Jvd2RfODU0eDQ4MHA1MC9jcm93ZF84NTR4NDgwcDUwZjExX2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NjYxMzksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzY3NjcyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02NjEzOSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNjc2NzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvZ29wL2Nyb3dkXzg1NHg0ODBwNTAvY3Jvd2RfODU0eDQ4MHA1MGYxMl9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTY4NTIzLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjI0OTQzMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Njg1MjMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjQ5NDMyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF84NTR4NDgwcDUwL2Nyb3dkXzg1NHg0ODBwNTBmMTNfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03MTU4MCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIxNzAwODgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTcxNTgwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjE3MDA4OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9nb3AvY3Jvd2RfODU0eDQ4MHA1MC9jcm93ZF84NTR4NDgwcDUwZjE0X2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NzI3NDAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMDQ4MTEyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03Mjc0MCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwNDgxMTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvZ29wL2Nyb3dkXzg1NHg0ODBwNTAvY3Jvd2RfODU0eDQ4MHA1MGYxNV9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTc2MzQwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjAwNzQ2NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NzYzNDAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMDA3NDY0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF84NTR4NDgwcDUwL2Nyb3dkXzg1NHg0ODBwNTBmMTZfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03NjM4MCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE4ODI4OTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTc2MzgwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTg4Mjg5NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9nb3AvY3Jvd2RfODU0eDQ4MHA1MC9jcm93ZF84NTR4NDgwcDUwZjFfZ29wMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMDEyNCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM0MTYwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMDEyNCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM0MTYwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF84NTR4NDgwcDUwL2Nyb3dkXzg1NHg0ODBwNTBmMV9nb3AyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMwMTM0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzQyNDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMwMTM0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzQyNDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvZ29wL2Nyb3dkXzg1NHg0ODBwNTAvY3Jvd2RfODU0eDQ4MHA1MGYxX2dvcDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzAxMzQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0xLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNDI0MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzAxMzQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0xLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNDI0MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9nb3AvY3Jvd2RfODU0eDQ4MHA1MC9jcm93ZF84NTR4NDgwcDUwZjFfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMDEzNix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM0MjQwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMDEzNix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM0MjQwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF84NTR4NDgwcDUwL2Nyb3dkXzg1NHg0ODBwNTBmMl9nb3AxLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM2MzgyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzEwMDAwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzYzODIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03MTAwMDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF84NTR4NDgwcDUwL2Nyb3dkXzg1NHg0ODBwNTBmMl9nb3AyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM2MzkyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzEwMjAwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzYzOTIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03MTAyMDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF84NTR4NDgwcDUwL2Nyb3dkXzg1NHg0ODBwNTBmMl9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM2MzkyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzEwMjAwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzYzOTIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03MTAyMDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF84NTR4NDgwcDUwL2Nyb3dkXzg1NHg0ODBwNTBmMl9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM2Mzk0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzEwMjAwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzYzOTQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03MTAyMDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF84NTR4NDgwcDUwL2Nyb3dkXzg1NHg0ODBwNTBmM19nb3AyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQxMDE1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTM0MDQwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDEwMTUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01MzQwNDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF84NTR4NDgwcDUwL2Nyb3dkXzg1NHg0ODBwNTBmM19nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQxMDE1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTM0MDQwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDEwMTUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01MzQwNDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF84NTR4NDgwcDUwL2Nyb3dkXzg1NHg0ODBwNTBmM19nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQxMDE3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTM0MDQwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDEwMTcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01MzQwNDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF84NTR4NDgwcDUwL2Nyb3dkXzg1NHg0ODBwNTBmNF9nb3AyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQ0NDQyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDM0NjgwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDQ0NDIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MzQ2ODAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF84NTR4NDgwcDUwL2Nyb3dkXzg1NHg0ODBwNTBmNF9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQ0ODA5LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDM4MzQ5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDQ4MDksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MzgzNDk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF84NTR4NDgwcDUwL2Nyb3dkXzg1NHg0ODBwNTBmNF9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQ0ODExLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDM4MzQ5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDQ4MTEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MzgzNDk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF84NTR4NDgwcDUwL2Nyb3dkXzg1NHg0ODBwNTBmNV9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQ4NjE3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzgxMDQ4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDg2MTcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zODEwNDgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF84NTR4NDgwcDUwL2Nyb3dkXzg1NHg0ODBwNTBmNV9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQ4NjE5LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzgxMDQ4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDg2MTksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zODEwNDgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF84NTR4NDgwcDUwL2Nyb3dkXzg1NHg0ODBwNTBmNl9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTUxNDg2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzM2NTg2NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTE0ODYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zMzY1ODY0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF84NTR4NDgwcDUwL2Nyb3dkXzg1NHg0ODBwNTBmNl9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTUwODMxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzMyMjYwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTA4MzEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zMzIyNjAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF84NTR4NDgwcDUwL2Nyb3dkXzg1NHg0ODBwNTBmN19nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTUzNjkzLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzAxMDQ1NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTM2OTMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zMDEwNDU2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF84NTR4NDgwcDUwL2Nyb3dkXzg1NHg0ODBwNTBmN19nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTU0NTc3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzA2MTc2OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTQ1Nzcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zMDYxNzY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF84NTR4NDgwcDUwL2Nyb3dkXzg1NHg0ODBwNTBmOF9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTU1NDc4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjcyMjgwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTU0Nzgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNzIyODAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF84NTR4NDgwcDUwL2Nyb3dkXzg1NHg0ODBwNTBmOF9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTU1NTYyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjcyODA5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTU1NjIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNzI4MDk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2dvcC9jcm93ZF84NTR4NDgwcDUwL2Nyb3dkXzg1NHg0ODBwNTBmOV9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTYwMDgwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjYyNTYwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NjAwODAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNjI1NjAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2xldmVsL2Nyb3dkXzEyODB4NzIwcDUwZjMyXzIwMDBrYnBzX2xldmVsXzQuMC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTYyNzksd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTkzNjg4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTU2Mjc5LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5MzY4ODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvbGV2ZWwvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfODAwMGticHNfbGV2ZWxfNC4xLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTY2NTM0OCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04MzAwMjQ4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2xldmVsL2Nyb3dkXzEyOHg5NnA1MGYzMl8yMDBrYnBzX2xldmVsXzIuMC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTcwNix3aWR0aD0xMjgsaGVpZ2h0PTk2LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTc5OTM2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTcwNix3aWR0aD0xMjgsaGVpZ2h0PTk2LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTc5OTM2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2xldmVsL2Nyb3dkXzE3NngxNDRwNTBmMzJfMjAwa2Jwc19sZXZlbF8yLjAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTU5NjMsd2lkdGg9MTc2LGhlaWdodD0xNDQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xODMwNDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1OTYzLHdpZHRoPTE3NixoZWlnaHQ9MTQ0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTgzMDQ4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2xldmVsL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl80MDAwa2Jwc19sZXZlbF80LjEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzAwMTg4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zNzM1NzQ0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMDAxODgsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM3MzU3NDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvbGV2ZWwvY3Jvd2RfMTkyMHgxMDg4cDUwZjMyXzEwMDAwa2Jwc19sZXZlbF81LjAubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NzI2MDI3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05MDU4NzM2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2xldmVsL2Nyb3dkXzM1MngyODhwNTBmMzJfMzAwa2Jwc19sZXZlbF8yLjEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjQ2MTcsd2lkdGg9MzUyLGhlaWdodD0yODgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yOTExMjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI0NjE3LHdpZHRoPTM1MixoZWlnaHQ9Mjg4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjkxMTIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L2xldmVsL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl8xMjAwMGticHNfbGV2ZWxfNS4xLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTg4OTQ4MSx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTExMDIyMDAscGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTIwNDYzLDQ5ICsyMDQ2Myw0OSBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzc5MTY3LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjIyMzI3MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9sZXZlbC9jcm93ZF82NDB4NDgwcDUwZjMyXzUwMGticHNfbGV2ZWxfMy4wLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQzMTUzLHdpZHRoPTY0MCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTIyODA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MzE1Myx3aWR0aD02NDAsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTUyMjgwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9sZXZlbC9jcm93ZF82NHg2NHA1MGYzMl8yMDBrYnBzX2xldmVsXzEuMC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDUyMix3aWR0aD02NCxoZWlnaHQ9NjQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMTU3NDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwNTIyLHdpZHRoPTY0LGhlaWdodD02NCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTExNTc0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9sZXZlbC9jcm93ZF82NHg2NHA1MGYzMl8yMDBrYnBzX2xldmVsXzIuMC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNDgyMSx3aWR0aD02NCxoZWlnaHQ9NjQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNjk0ODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE0ODIxLHdpZHRoPTY0LGhlaWdodD02NCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE2OTQ4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9sZXZlbC9jcm93ZF83MjB4NDgwcDUwZjMyXzYwMGticHNfbGV2ZWxfMy4xLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTUwMTgwLHdpZHRoPTcyMCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NjEwNjQ4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01MDE4MCx3aWR0aD03MjAsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTYxMDY0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9sZXZlbC9jcm93ZF83MjB4NTc2cDUwZjMyXzYwMGticHNfbGV2ZWxfMy4xLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTUyMDUxLHdpZHRoPTcyMCxoZWlnaHQ9NTc2LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NjM0MDMyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01MjA1MSx3aWR0aD03MjAsaGVpZ2h0PTU3NixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTYzNDAzMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfMTAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT04MjE1MSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMDEwMzEyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT04MjE1MSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMDEwMzEyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl8xMG1icHMubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9ODM2MzEwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEwNDM3Mjk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl8xbWJwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT04OTQ3NCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMTAxODQ4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT04OTQ3NCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMTAxODQ4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl8yMG1icHMubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTY5NDA3Nyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMTE1OTM4NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfNG1icHNfYWRhcHRpdmVxcDAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzYzNzgxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ1MzA2ODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM2Mzc4MSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NTMwNjgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl80bWJwc19hZGFwdGl2ZXFwMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTY5NDUsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQ0NTIzMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU2OTQ1LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0NDUyMzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyXzRtYnBzX3FwZzE2Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM2NjMzNix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NTYyNjI0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNjYzMzYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDU2MjYyNCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfNG1icHNfcXBnNjQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU4NDc3LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0NjQzODQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1ODQ3Nyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDY0Mzg0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl80bWJwc19xcGc4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM2OTUyNCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NjAyNDcyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNjk1MjQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDYwMjQ3MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfNTAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT04MTUwNCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMDAyMjI0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT04MTUwNCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMDAyMjI0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl81bWJwcy5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MDg5NTQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTA5NTM0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMjA1MTcsNDMgKzIwNTE3LDQzIEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTkzODI1Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMTcxNDY3MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfYW1wMC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTQ2ODAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQxNjkyMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU0NjgwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0MTY5MjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2FtcDEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU0NjgwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0MTY5MjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NDY4MCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDE2OTIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9hdWQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU0Njc3LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0MTY4ODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NDY3Nyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDE2ODgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9iX2FkYXB0XzAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzI4ODUxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQwOTQ2NTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMyODg1MSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MDk0NjU2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9iX2FkYXB0XzEubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mzk2MDk0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ5MzQ2MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2JldGEwLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NDY4MCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDE2OTIwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTQ2ODAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQxNjkyMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfYmV0YTQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU1MjQ0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0MjM5NjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NTI0NCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDIzOTYwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9iZXRhNi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTU2MzYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQyODg1NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU1NjM2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0Mjg4NTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2JldGE2X3RjbTYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU1NjY4LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0MjkyNDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NTY2OCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDI5MjQ4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9iZXRhbTQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU1NzI0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0Mjk5NjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NTcyNCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDI5OTYwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9iZXRhbTYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU1MDY1LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0MjE3MjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NTA2NSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDIxNzIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9iZXRhbTZfdGM2Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NTMyOSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDI1MDA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTUzMjksd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQyNTAwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfY25zdHJuX2ludHJhLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1OTU1OCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDc3ODk2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTk1NTgsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQ3Nzg5NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfY3JhMTYubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mzg3MDc1LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ4MjEwNDgscGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTIwNTYyLDEwOSArMjA1NjIsMTA5IEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE0OTU0NDc4LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE4NjkxNDQwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfY3JmNTEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mjk0Nzcsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzUxODgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yOTQ3Nyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zNTE4ODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2N0YjE2Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NjY0Nix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDQxNDk2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTY2NDYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQ0MTQ5NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfY3RiMzIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzUxNDQ4LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQzNzY1MjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1MTQ0OCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00Mzc2NTIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mYXN0ZGVjb2RlLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NjkxNSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDQ0ODU2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTY5MTUsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQ0NDg1NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZmFzdGVyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMxMDEyMSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zODYwNTM2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMTAxMjEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Mzg2MDUzNixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZmFzdC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMTkyMDUsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Mzk3NDA4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzE5MjA1LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM5NzQwODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2dyYWluLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTU3NzY2Nix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03MjA0MjQ4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9oYXNoX2Noa3N1bS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTUzODQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQyNTcyMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU1Mzg0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0MjU3MjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2hhc2hfY3JjLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NTE5Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDIzMzIwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTUxOTIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQyMzMyMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfaGFzaF9tZDUubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU2NTM2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0NDAxMjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NjUzNix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDQwMTIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ocmQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU0NjgwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0MTY5MjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NDY4MCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDE2OTIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9pZHIxNi5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zOTEwNTMsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDg3MTUzNixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfaW50cmFtaW51czEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU0Njg5LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0MTcwMzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NDY4OSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDE3MDMyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9sb3NzbGVzcy5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02MzUyOTkxOSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03OTQxMDc0MDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX21heF9sb2cycG9jXzEwLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NDY4OCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDE3MDI0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTQ2ODgsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQxNzAyNCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbWF4X2xvZzJwb2NfMTYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU0NzEyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0MTczMjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NDcxMix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDE3MzIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9tYXhfbG9nMnBvY180Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NDY3OSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDE2OTEyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTQ2Nzksd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQxNjkxMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbWF4X2xvZzJwb2NfNS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTQ2Nzksd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQxNjkxMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU0Njc5LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0MTY5MTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX21heF9sb2cycG9jXzYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU0Njc5LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0MTY5MTIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NDY3OSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDE2OTEyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9tYXh0dTE2Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NjUwMSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDM5NjgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTY1MDEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQzOTY4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbWF4dHU0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMzMjM4OSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MTM4MjgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMzIzODksd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDEzODI4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbWF4dHU4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NjE0OSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDM1MjgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTYxNDksd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQzNTI4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbWVkaXVtLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NDY4MCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDE2OTIwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTQ2ODAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQxNjkyMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbWVyZ2UxLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM2MjAzNix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NTA4ODcyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNjIwMzYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDUwODg3MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbWVyZ2UzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1Mzk0Nix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDA3NzQ0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTM5NDYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQwNzc0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbWVyZ2U0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1MzA5Nyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00Mzk3MTM2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTMwOTcsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDM5NzEzNixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbWVyZ2U1Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1MjA3NCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00Mzg0MzQ0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTIwNzQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDM4NDM0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbWluY3UxNi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNzA1Nzksd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDYxNTY1NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzcwNTc5LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ2MTU2NTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX21pbmN1MzIubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDIxMTU0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTUyNDc4MjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vZGJsay5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTYxODksd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQzNTc4NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU2MTg5LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0MzU3ODQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vX3Bwc19xcF9vcHQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU0NjgzLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0MTY5NjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NDY4Myx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDE2OTYwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub19wcHNfcmVmbGlzdF9vcHQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU0NjgzLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0MTY5NjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NDY4Myx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDE2OTYwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub192dWlfaHJkLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NDY4Myx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDE2OTYwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTQ2ODMsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQxNjk2MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfcGxhY2Viby5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNzk2NTIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDcyOTA0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfcHJvZmlsZW5vbmUubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU0Njc3LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0MTY4ODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NDY3Nyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDE2ODgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9wc25yLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTU4OTY2Nyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03MzU0MjcyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0yMDY4MiwxNDUgKzIwNjgyLDE0NSBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yNTc3NzAwNix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zMjIxOTYwMDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX3FwNTAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzAzOTIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzYzMzIwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMDM5Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zNjMzMjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX3FwNTFjYm0xMmNybTEyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI2NzA0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMxNzIyNCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjY3MDQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzE3MjI0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9xcDUxLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI0NDg2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI4OTQ5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjQ0ODYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Mjg5NDk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9yZWN0MC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTQ2ODAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQxNjkyMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU0NjgwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0MTY5MjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX3JwdF9oZHJzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NDY3Nyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDE2ODgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTQ2Nzcsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQxNjg4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfc2FvMC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTQ5NzQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQyMDYwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU0OTc0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0MjA2MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX3NiaDEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU0NjgwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0MTY5MjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NDY4MCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDE2OTIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9zbG93ZXIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mzc1MjQ4LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ2NzQwMDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM3NTI0OCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00Njc0MDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9zbG93Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM2Mzk4Nix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NTMzMjQ4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNjM5ODYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDUzMzI0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfc3JuZzAubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTMwODk0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTY2MTk2MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX3NybmczMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTQzNTgsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQxMjg5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU0MzU4LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0MTI4OTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX3Nybmc2NC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTQ2ODAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQxNjkyMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU0NjgwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0MTY5MjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX3Nybmc4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1Njg2NCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDQ0MjI0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTY4NjQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQ0NDIyNCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfc3NpbS5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01NDY1NDIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NjgxNTIwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfc3RybmdpbnRyYTAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzUzNzY3LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0MDU1MTIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1Mzc2Nyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDA1NTEyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9zdXBlcmZhc3QubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTM3NDY2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTY3MDE3NDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX3RjNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTQ3NzUsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQxODA5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU0Nzc1LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0MTgwOTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX3RjNi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTY4MzAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQ0Mzc4NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU2ODMwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0NDM3ODQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX3RjbTQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU0MzIxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0MTI0MjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NDMyMSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDEyNDI0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl90Y202Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NTAyMCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDIxMTYwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTUwMjAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQyMTE2MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfdG1wX2x5cnMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU0Njg1LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0MTY4ODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NDY4NSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDE2ODgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl90bXZwMC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTY0MDYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQzODQ5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU2NDA2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0Mzg0OTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX3R1aW50ZXJkZXB0aDIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzYyNjY0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ1MTY3MjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM2MjY2NCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NTE2NzIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl90dWludGVyZGVwdGg0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1Njg4NCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDQ0NDU2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTY4ODQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQ0NDQ1NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfdHVpbnRyYWRlcHRoMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTYzNzgsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQzODE0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU2Mzc4LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0MzgxNDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX3R1aW50cmFkZXB0aDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU3MDgzLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0NDY5NDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NzA4Myx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDQ2OTQ0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl90dWxpbWl0Mi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTQ2ODAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQxNjkyMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU0NjgwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0MTY5MjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX3R1bGltaXQ0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NDY4MCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDE2OTIwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTQ2ODAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQxNjkyMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfdWx0cmFmYXN0Lm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTUwMjQ4Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02MjY0NDQ4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl92ZXJ5ZmFzdC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMDk5MDgsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Mzg1Nzg3MixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzA5OTA4LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM4NTc4NzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX3ZlcnlzbG93Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM2ODI0OCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NTg2NDk2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNjgyNDgsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDU4NjQ5NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfdnVpX2NvbG9yX21hdHJpeC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTQ2ODQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQxNjkyMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU0Njg0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0MTY5MjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX3Z1aV9jb2xvcl9wcmltX2J0MjAyMC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTQ2ODQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQxNjkyMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU0Njg0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0MTY5MjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX3Z1aV9jb2xvcl9wcmltX2J0NzA5Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NDY4NCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDE2OTIwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTQ2ODQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQxNjkyMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfdnVpX3RyYW5zZmVyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NDY4NCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDE2OTIwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTQ2ODQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQxNjkyMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfd2VpZ2h0YjB3ZWlnaHRwMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTQ2ODAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQxNjkyMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU0NjgwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0MTY5MjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX3dlaWdodGIxLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NjM0Nyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDM3NzYwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTYzNDcsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQzNzc2MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfd2VpZ2h0cDAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU0NjgwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0MTY5MjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NDY4MCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDE2OTIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl93ZWlnaHRwMHdlaWdodGIxLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NjMzNSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDM3NjA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTYzMzUsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQzNzYwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfd3BwMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTYxMTYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQzNDg3MixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU2MTE2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0MzQ4NzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX3plcm9sYXRlbmN5Lm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQxNzUxNCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01MjA2MjAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyXzEwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTU3MjU1LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTQ5MTEyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTcyNTUsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5NDkxMTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfMTBtYnBzLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTcyNTIwNCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTA0ODQ3MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl8xbWJwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTcwNDQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5NDY0NzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1NzA0NCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTk0NjQ3MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl8yMG1icHMubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTQ2NTU5Nyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTgzMDMzODQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfNG1icHNfYWRhcHRpdmVxcDAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzI1MTk3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MDQ4Mzg0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMjUxOTcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQwNDgzODQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfNG1icHNfYWRhcHRpdmVxcDIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzIzNDYwLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MDI2NjcyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMjM0NjAsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQwMjY2NzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfNG1icHNfcXBnMTYubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Njk2MTkzLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04Njg1ODMyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0yMDgyOSwxMCArMjA4MjksMTAgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NjgzMjc1LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04NTI0MzYwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyXzUwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTU3NTA4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTUyMjcyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTc1MDgsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5NTIyNzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfNW1icHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzY4MTgxLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NTg1NjgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNjgxODEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ1ODU2ODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfYWxsaWRyLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1NzkwMTAsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5NzI1MTQ0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0yMDg4Niw3ICsyMDg4Niw3IEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM4OTM4NzE5LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00ODY3MTc0MDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfY3JmNTEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NjU3NjMsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTgwNTQ1NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NjU3NjMsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTgwNTQ1NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9jdGIxNi5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02ODY3MDYsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTg1NjcyNDgscGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTIxMDA2LDEzICsyMTAwNiwxMyBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02Mzc2MTY0Myx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Nzk3MDAzOTYwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX3FwNTAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NjYwNjksd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTgwOTI4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NjYwNjksd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTgwOTI4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9xcDUxY2JtMTJjcm0xMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01ODAwMix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzA4NDQ4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01ODAwMix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzA4NDQ4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX3FwNTEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTM2NTcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTY1NDEzNixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTM2NTcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTY1NDEzNixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9yZWN0MC5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02Nzc0MDQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTg0NTA5NjgscGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTIxMjE2LDcgKzIxMjE2LDcgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjE0MTEzNzA4LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMi9jcm93ZF8zODQweDIxNjBwNTBmMzJfY3JmNTEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjQyNTE1LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zMDE1MTQ0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yNDI1MTUsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMwMTUxNDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMi9jcm93ZF8zODQweDIxNjBwNTBmMzJfY3RiMzIubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc0NDQ1OCx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjE3ODk0MzIscGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTIxMzc4LDEzICsyMTM3OCwxMyBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMjY0NjcyODAsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl9xcDUwLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIzMTQ5NCx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Mjg3NzM4NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjMxNDk0LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yODc3Mzg0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8zODQweDIxNjBwNTBmMzIvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyX3FwNTFjYm0xMmNybTEyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIwNjgxNix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjU2ODkxMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjA2ODE2LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNTY4OTEyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8zODQweDIxNjBwNTBmMzIvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyX3FwNTEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTkyODQyLHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzk0MjMyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTI4NDIsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzOTQyMzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMi9jcm93ZF8zODQweDIxNjBwNTBmMzJfcnB0X2hkcnMubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc1NTUxMSx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjE5Mjc2MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTIxNTEzLDE5MCArMjE1MTMsMTkwIEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIyNzc1NjMsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI4NDU2ODA4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfMTAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yNzE0MCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMyMjY3MixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjcxNDAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zMjI2NzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl8xMG1icHMubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Nzc5MDYwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTcyMTY3MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyXzFtYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTc0MTMwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTEwMDQ4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03NDEzMCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTkxMDA0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyXzIwbWJwcy5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTYzMzczLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTk1MjU1ODQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl80bWJwc19hZGFwdGl2ZXFwMC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMjg5NDksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MDk1MjgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMjg5NDksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MDk1MjgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfNG1icHNfYWRhcHRpdmVxcDIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzI1Mjc0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDA0OTM0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzI1Mjc0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDA0OTM0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyXzRtYnBzX3FwZzE2Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExMTQ0MCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNzY0MjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExMTQ0MCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNzY0MjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl80bWJwc19xcGc2NC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTAzMTAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzYyMjk2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTAzMTAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzYyMjk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfNG1icHNfcXBnOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTAwNzgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzU5NDAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTAwNzgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzU5NDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfNTAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MDc4OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ5MzI3MixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDA3ODgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00OTMyNzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl81bWJwcy5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zODUyODIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00Nzk5NDQ4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfYWxsaWRyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI4ODI3Myx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM1OTA5NDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI4ODI3Myx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM1OTA5NDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9hbHRpZHIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzA0NDUxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Mzc5MjE2MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzA0NDUxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Mzc5MjE2MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2FtcDAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA4Mzk0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTMzODM0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA4Mzk0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTMzODM0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2FtcDEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA4Mzk0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTMzODM0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA4Mzk0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTMzODM0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2F1ZC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDgzOTEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzM4MzEyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDgzOTEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzM4MzEyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfYl9hZGFwdF8wLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTk2ODk4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTE5NTI0OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9OTY4OTgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMTk1MjQ4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfYl9hZGFwdF8xLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEyMjU5OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE1MTU4OTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEyMjU5OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE1MTU4OTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9iZXRhMC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDgzOTQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzM4MzQ0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDgzOTQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzM4MzQ0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfYmV0YTQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA4OTU5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM0NTQwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA4OTU5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM0NTQwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2JldGE2Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwODc2MSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNDI5MjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwODc2MSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNDI5MjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9iZXRhNl90Y202Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwODgzMSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNDM3ODQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwODgzMSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNDM3ODQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9iZXRhbTQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA5MDYzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM0NjY5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA5MDYzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM0NjY5NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2JldGFtNi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDkyMjgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzQ4NzYwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDkyMjgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzQ4NzYwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfYmV0YW02X3RjNi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDg3NDAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzQyNjQ4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDg3NDAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzQyNjQ4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfY25zdHJuX2ludHJhLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwOTQzMix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNTEzMjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwOTQzMix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNTEzMjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9jcmExNi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTgzNzYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDYyMzEyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTgzNzYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDYyMzEyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfY3JmMC5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMzUyMTYyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDE4ODU0NDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9jcmY1MS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT05NjQ3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTA0MDA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT05NjQ3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTA0MDA4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfY3RiMTYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTExMDkzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM3MjA5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTExMDkzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM3MjA5NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2N0YjMyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwOTM0NSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNTAyNDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwOTM0NSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNTAyNDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mYXN0ZGVjb2RlLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwOTMxNCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNDk4NDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwOTMxNCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNDk4NDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ncmFpbi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODAwNDQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjMzOTY4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODAwNDQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjMzOTY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfaGFzaF9jaGtzdW0ubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA5MDk4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM0NzE0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA5MDk4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM0NzE0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2hhc2hfY3JjLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwODkwNix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNDQ3NDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwODkwNix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNDQ3NDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9oYXNoX21kNS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTAyNTAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzYxNTQ0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTAyNTAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzYxNTQ0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfaHJkLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwODM5NCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzMzgzNDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwODM5NCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzMzgzNDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9pZHIxNi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMjAyNzgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDg2ODQ4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMjAyNzgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDg2ODQ4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfaW50cmFtaW51czEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA4NDAzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTMzODQ1NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA4NDAzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTMzODQ1NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2xvc3NsZXNzLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE0NjEyMzEzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTgyNjM3MzM2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbWF4X2xvZzJwb2NfMTAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA4NDA0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTMzODQ3MixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA4NDA0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTMzODQ3MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX21heF9sb2cycG9jXzE2Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwODQyNix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzMzg3NDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwODQyNix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzMzg3NDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9tYXhfbG9nMnBvY180Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwODM5MCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzMzgzMTIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwODM5MCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzMzgzMTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9tYXhfbG9nMnBvY181Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwODM5MCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzMzgzMTIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwODM5MCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzMzgzMTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9tYXhfbG9nMnBvY182Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwODM5MCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzMzgzMTIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwODM5MCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzMzgzMTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9tYXh0dTE2Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwOTM4Nyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNTA3NjgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwOTM4Nyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNTA3NjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9tYXh0dTQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTAzMTcxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTI3MzA3MixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTAzMTcxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTI3MzA3MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX21heHR1OC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTAxOTAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzYwODA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTAxOTAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzYwODA4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbWVkaXVtLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwODM5NCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzMzgzNDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwODM5NCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzMzgzNDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9tZXJnZTEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTEwMzc3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM2MzEzNixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTEwMzc3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM2MzEzNixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX21lcmdlMy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDc5NzIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzMzMDcyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDc5NzIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzMzMDcyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbWVyZ2U0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwNzk2MSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzMzI5MzYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwNzk2MSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzMzI5MzYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9tZXJnZTUubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA3ODA4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTMzMTAyNCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA3ODA4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTMzMTAyNCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX21pbmN1MTYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE3NzY2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ1NTQ4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE3NzY2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ1NTQ4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX21pbmN1MzIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTMyMDM2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTYzMzg1NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTMyMDM2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTYzMzg1NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vZGJsay5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDkyNTcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzQ5MTM2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDkyNTcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzQ5MTM2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9fcHBzX3FwX29wdC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDgzOTcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzM4Mzg0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDgzOTcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzM4Mzg0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9fcHBzX3JlZmxpc3Rfb3B0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwODM5Nyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzMzgzODQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwODM5Nyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzMzgzODQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub192dWlfaHJkLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwODM5Nyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzMzgzODQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwODM5Nyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzMzgzODQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9wbGFjZWJvLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNTg2NCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0MzE2OTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNTg2NCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0MzE2OTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9wcm9maWxlbm9uZS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDgzOTEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzM4MzEyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDgzOTEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzM4MzEyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfcHNuci5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTczMjQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNDQ5OTg0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTczMjQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNDQ5OTg0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfcXAwLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTc2NDc2NDcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05NTU3OTAwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMjE3MTEsMTU0ICsyMTcxMSwxNTQgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTY0MDM2NSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTcwNDg3OTg0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfcXA1MC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT05Mzk3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTAwODgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT05Mzk3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTAwODgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfcXA1MWNibTEyY3JtMTIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9ODU1OSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTkwNDA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT04NTU5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTA0MDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9xcDUxLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTgwOTIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04NDU2OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9ODA5Mix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTg0NTY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfcmVjdDAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA4Mzk0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTMzODM0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA4Mzk0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTMzODM0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3JwdF9oZHJzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwODM5MSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzMzgzMTIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwODM5MSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzMzgzMTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9zYW8wLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwOTA1Nyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNDY2MzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwOTA1Nyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNDY2MzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9zYmgxLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwODM5NCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzMzgzNDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwODM5NCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzMzgzNDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9zbG93ZXIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTEyMjM1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM4NjM0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTEyMjM1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM4NjM0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3Nsb3cubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA5NjYzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM1NDIwOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA5NjYzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM1NDIwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3NybmcwLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE0NjIzNSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE4MTEzNjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE0NjIzNSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE4MTEzNjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9zcm5nMzIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA4Mzk0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTMzODM0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA4Mzk0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTMzODM0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3Nybmc2NC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDgzOTQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzM4MzQ0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDgzOTQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzM4MzQ0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfc3JuZzgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA4MzY5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTMzODAzMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA4MzY5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTMzODAzMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3NzaW0ubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc0MzY4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjE2MzAzMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc0MzY4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjE2MzAzMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3N0cm5naW50cmEwLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwODg4MCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNDQ0MjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwODg4MCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNDQ0MjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9zdXBlcmZhc3QubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc1Nzk3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjE4MDg5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc1Nzk3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjE4MDg5NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3RjNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDg3NDMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzQyNjk2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDg3NDMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzQyNjk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfdGM2Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwODcwOSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNDIyNzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwODcwOSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNDIyNzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl90Y200Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwODczMCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNDI1MzYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwODczMCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNDI1MzYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl90Y202Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwODc3OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNDMxMzYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwODc3OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNDMxMzYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl90bXBfbHlycy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDgzOTgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzM4MzEyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDgzOTgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzM4MzEyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfdG12cDAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA5MDgwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM0NjkyMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA5MDgwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM0NjkyMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3R1aW50ZXJkZXB0aDIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTExMjkzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM3NDU4NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTExMjkzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM3NDU4NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3R1aW50ZXJkZXB0aDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTEwMzM4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM2MjY0OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTEwMzM4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM2MjY0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3R1aW50cmFkZXB0aDIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA5MzA2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM0OTc0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA5MzA2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM0OTc0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3R1aW50cmFkZXB0aDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA5MTA1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM0NzIzMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA5MTA1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM0NzIzMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3R1bGltaXQyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwODM5NCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzMzgzNDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwODM5NCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzMzgzNDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl90dWxpbWl0NC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDgzOTQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzM4MzQ0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDgzOTQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzM4MzQ0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfdWx0cmFmYXN0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2MzY4MSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwMjk0MjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2MzY4MSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwMjk0MjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl92ZXJ5ZmFzdC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT05MDc0NSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTExMTgzMzYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTkwNzQ1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTExODMzNixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3ZlcnlzbG93Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExMTY4OSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNzk1MjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExMTY4OSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNzk1MjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl92dWlfY29sb3JfbWF0cml4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwODM5Nyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzMzgzNDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwODM5Nyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzMzgzNDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl92dWlfY29sb3JfcHJpbV9idDIwMjAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA4Mzk3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTMzODM0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA4Mzk3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTMzODM0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3Z1aV9jb2xvcl9wcmltX2J0NzA5Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwODM5Nyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzMzgzNDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwODM5Nyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzMzgzNDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl92dWlfdHJhbnNmZXIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA4Mzk3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTMzODM0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA4Mzk3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTMzODM0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3dlaWdodGIwd2VpZ2h0cDEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA4Mzk0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTMzODM0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA4Mzk0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTMzODM0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3dlaWdodGIxLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwOTAyMCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNDYxNjgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwOTAyMCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNDYxNjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl93ZWlnaHRwMC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDgzOTQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzM4MzQ0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDgzOTQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzM4MzQ0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfd2VpZ2h0cDB3ZWlnaHRiMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDkwMjUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzQ2MjMyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDkwMjUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzQ2MjMyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfd3BwMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDgyNzMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzM2ODMyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDgyNzMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzM2ODMyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfemVyb2xhdGVuY3kubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTMxMTA1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTYyNjA5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTMxMTA1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTYyNjA5NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyXzEwbWJwcy5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT04MDI2MTQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMDAxNjA5NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyXzFtYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTc3MjQ0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTQ4OTY4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03NzI0NCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTk0ODk2OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyXzIwbWJwcy5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjI0NDYwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjAyODkxNjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl80bWJwc19hZGFwdGl2ZXFwMC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNDM0NzAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00Mjc2ODAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNDM0NzAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00Mjc2ODAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfNG1icHNfYWRhcHRpdmVxcDIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzM4MjczLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDIxMTgzMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzM4MjczLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDIxMTgzMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyXzRtYnBzX3FwZzE2Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4MjU3OSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyNjU2NTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4MjU3OSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyNjU2NTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl80bWJwc19xcGc2NC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODEyMzEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjQ4ODA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODEyMzEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjQ4ODA4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfNG1icHNfcXBnOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODM5MDUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjgyMjMyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODM5MDUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjgyMjMyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfNTAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00NjQ0Nix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTU2NDAwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDY0NDYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01NjQwMDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl81bWJwcy5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zOTQ3OTUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00OTE4MzYwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0yMTg3MCwxNTQgKzIxODcwLDE1NCBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00OTQ4MjIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02MTcxODAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfYW1wMC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzkyNzUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjI0MzYwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzkyNzUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjI0MzYwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfYW1wMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzkyNzUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjI0MzYwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzkyNzUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjI0MzYwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfYXVkLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3OTI3Mix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMjQzMjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3OTI3Mix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMjQzMjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9iX2FkYXB0XzAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTYyNDM3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjAxNDQ4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTYyNDM3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjAxNDQ4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2JfYWRhcHRfMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMDMyMjIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNTIzNjk2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMDMyMjIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNTIzNjk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfYmV0YTAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc5Mjc1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIyNDM2MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc5Mjc1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIyNDM2MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2JldGE0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3OTQwMCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMjU5MTIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3OTQwMCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMjU5MTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9iZXRhNi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODAxMzQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjM1MDgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODAxMzQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjM1MDgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfYmV0YTZfdGNtNi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODAxMzAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjM1MDI0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODAxMzAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjM1MDI0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfYmV0YW00Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3OTYyNSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMjg3MjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3OTYyNSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMjg3MjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9iZXRhbTYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc5MTcxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIyMzA0OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc5MTcxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIyMzA0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2JldGFtNl90YzYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc5NjUwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIyOTAyNCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc5NjUwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIyOTAyNCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2Nuc3Rybl9pbnRyYS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODEyNTUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjQ5MTEyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODEyNTUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjQ5MTEyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfY3JhMTYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTk2NDg0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjQzODY1NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTk2NDg0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjQzODY1NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2NyZjAubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NjA5Mjk2Mix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTc2MTQ1NDQ4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfY3JmNTEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTUxODksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzMyODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1MTg5LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTczMjgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfY3RiMTYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTgwNTgwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjI0MDY3MixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTgwNTgwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjI0MDY3MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2N0YjMyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3ODYzOSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMTY0MDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3ODYzOSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMTY0MDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mYXN0ZGVjb2RlLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3ODkxNix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMTk4NzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3ODkxNix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMTk4NzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mYXN0ZXIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTU0NDMxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTkxNDQwOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTU0NDMxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTkxNDQwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2Zhc3QubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTU4MTIxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTk2MDUzNixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTU4MTIxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTk2MDUzNixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2dyYWluLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI5OTMwMix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM3MjQ2OTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI5OTMwMix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM3MjQ2OTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9oYXNoX2Noa3N1bS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzk5Nzksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjMzMTYwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzk5Nzksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjMzMTYwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfaGFzaF9jcmMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc5Nzg3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIzMDc2MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc5Nzg3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIzMDc2MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2hhc2hfbWQ1Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4MTEzMSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyNDc1NjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4MTEzMSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyNDc1NjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ocmQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc5Mjc1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIyNDM2MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc5Mjc1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIyNDM2MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2lkcjE2Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5ODcxNCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI0NjcyOTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5ODcxNCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI0NjcyOTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9pbnRyYW1pbnVzMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzkyODQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjI0NDcyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzkyODQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjI0NDcyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbG9zc2xlc3MubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjY5MzQ5MzMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zMzY2NzAwODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9tYXhfbG9nMnBvY18xMC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzkyODksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjI0NTM2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzkyODksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjI0NTM2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbWF4X2xvZzJwb2NfMTYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDI0MTQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zMzE0MTYwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MjQxNCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMzMTQxNjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9tYXhfbG9nMnBvY180Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3OTI2Nyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMjQyNTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3OTI2Nyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMjQyNTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9tYXhfbG9nMnBvY181Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3OTI2Nyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMjQyNTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3OTI2Nyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMjQyNTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9tYXhfbG9nMnBvY182Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3OTI2Nyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMjQyNTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3OTI2Nyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMjQyNTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9tYXh0dTQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTY5ODAwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjEwNTkyMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTY5ODAwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjEwNTkyMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX21heHR1OC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODA1MTAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjM5ODAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODA1MTAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjM5ODAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbWVkaXVtLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3OTI3NSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMjQzNjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3OTI3NSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMjQzNjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9tZXJnZTEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTgyMDM2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjI1ODg3MixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTgyMDM2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjI1ODg3MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX21lcmdlMy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzg3MDUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjE3MjMyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzg3MDUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjE3MjMyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbWVyZ2U0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3ODU4MCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMTU2NzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3ODU4MCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMTU2NzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9tZXJnZTUubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc4NDQ3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIxNDAwOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc4NDQ3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIxNDAwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX21pbmN1MTYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5MjU3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM0OTEyMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5MjU3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM0OTEyMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX21pbmN1MzIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjEwMTYyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjYxMDQzMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjEwMTYyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjYxMDQzMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vZGJsay5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODA0OTgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjM5NjQ4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODA0OTgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjM5NjQ4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9fcHBzX3FwX29wdC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzkyNzgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjI0NDAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzkyNzgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjI0NDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9fcHBzX3JlZmxpc3Rfb3B0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3OTI3OCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMjQ0MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3OTI3OCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMjQ0MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub192dWlfaHJkLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3OTI3OCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMjQ0MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3OTI3OCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMjQ0MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9wbGFjZWJvLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5Mjg0MCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzOTM4ODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5Mjg0MCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzOTM4ODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9wcm9maWxlbm9uZS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzkyNzIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjI0MzIwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzkyNzIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjI0MzIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfcHNuci5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMTI0ODgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zODg5NTM2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMTI0ODgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zODg5NTM2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfcXAwLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE0MzE1OTAwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTc4OTMyMTY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0yMjAzMiwxNzIgKzIyMDMyLDE3MiBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDUzNjk0Myx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzMTY5NTIwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3FwNTAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTQ4MjMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNjg3MTIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE0ODIzLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTY4NzEyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfcXA1MWNibTEyY3JtMTIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTMyMDgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDg1MjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEzMjA4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ4NTIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfcXA1MS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMjE4Myx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNTcxMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTIxODMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzU3MTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9yZWN0MC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzkyNzUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjI0MzYwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzkyNzUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjI0MzYwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfcnB0X2hkcnMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc5MjcyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIyNDMyMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc5MjcyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIyNDMyMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3NhbzAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc4NjI5LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIxNjI4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc4NjI5LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIxNjI4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3NiaDEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc5Mjc1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIyNDM2MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc5Mjc1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIyNDM2MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3Nsb3dlci5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODgyNTksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzM2NjMyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODgyNTksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzM2NjMyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfc2xvdy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODEyMDUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjQ4NDgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODEyMDUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjQ4NDgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfc3JuZzAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjUxMDc2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzEyMTg3MixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjUxMDc2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzEyMTg3MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3NybmczMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzk0ODAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjI2OTIwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzk0ODAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjI2OTIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfc3JuZzY0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3OTI3NSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMjQzNjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3OTI3NSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMjQzNjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9zcm5nOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzk0ODEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjI2OTM2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzk0ODEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjI2OTM2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfc3NpbS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yODE1Mzgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zNTAyNjU2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yODE1Mzgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zNTAyNjU2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfc3RybmdpbnRyYTAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc4ODg2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIxOTQ5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc4ODg2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIxOTQ5NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3N1cGVyZmFzdC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yODYyOTEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zNTYyMDU2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yODYyOTEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zNTYyMDU2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfdGM0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3OTUwMix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMjcxODQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3OTUwMix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMjcxODQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl90YzYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc5MzM2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIyNTExMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc5MzM2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIyNTExMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3RjbTQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc5NDQwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIyNjQwOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc5NDQwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIyNjQwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3RjbTYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc5ODIyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIzMTE4NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc5ODIyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIzMTE4NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3RtcF9seXJzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3OTI4MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMjQzMjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3OTI4MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMjQzMjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl90bXZwMC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODAyMTEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjM2MDU2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODAyMTEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjM2MDU2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfdHVpbnRlcmRlcHRoNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODE3NDQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjU1MjA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODE3NDQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjU1MjA4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfdHVpbnRyYWRlcHRoNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzk3MzEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjMwMDQ4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzk3MzEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjMwMDQ4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfdHVsaW1pdDIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc5Mjc1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIyNDM2MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc5Mjc1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIyNDM2MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3R1bGltaXQ0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3OTI3NSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMjQzNjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3OTI3NSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMjQzNjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl91bHRyYWZhc3QubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjY1MjM2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzI5ODg1NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjY1MjM2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzI5ODg1NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3ZlcnlmYXN0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1MzMwNCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5MDAzMjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1MzMwNCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5MDAzMjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl92ZXJ5c2xvdy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODczNDMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzI1MTg0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODczNDMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzI1MTg0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfdnVpX2NvbG9yX21hdHJpeC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzkyODAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjI0MzYwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzkyODAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjI0MzYwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfdnVpX2NvbG9yX3ByaW1fYnQyMDIwLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3OTI4MCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMjQzNjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3OTI4MCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMjQzNjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl92dWlfY29sb3JfcHJpbV9idDcwOS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzkyODAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjI0MzYwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzkyODAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjI0MzYwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfdnVpX3RyYW5zZmVyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3OTI4MCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMjQzNjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3OTI4MCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMjQzNjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl93ZWlnaHRiMHdlaWdodHAxLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3OTI3NSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMjQzNjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3OTI3NSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMjQzNjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl93ZWlnaHRiMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzg4OTksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjE5NjU2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzg4OTksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjE5NjU2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfd2VpZ2h0cDAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc5Mjc1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIyNDM2MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc5Mjc1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIyNDM2MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3dlaWdodHAwd2VpZ2h0YjEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc4ODg2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIxOTQ5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc4ODg2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIxOTQ5NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3dwcDEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc5Mjg0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIyNDQ3MixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc5Mjg0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIyNDQ3MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3plcm9sYXRlbmN5Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIxNjAzMyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI2ODc2ODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIxNjAzMyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI2ODc2ODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xMDI0eDEwMjRwNTBmMzJfMjAwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTUxMjQzLHdpZHRoPTEwMjQsaGVpZ2h0PTEwMjQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xODczOTYwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTEyNDMsd2lkdGg9MTAyNCxoZWlnaHQ9MTAyNCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE4NzM5NjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xMDgweDE0NDBwNTBmMzJfMzEwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjMxNzIzLHdpZHRoPTEwODAsaGVpZ2h0PTE0NDAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yODc5OTYwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMzE3MjMsd2lkdGg9MTA4MCxoZWlnaHQ9MTQ0MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI4Nzk5NjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xMDgweDE5MjBwNTBmMzJfNDEwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mjk1NDEwLHdpZHRoPTEwODAsaGVpZ2h0PTE5MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zNjc2MzQ0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yOTU0MTAsd2lkdGg9MTA4MCxoZWlnaHQ9MTkyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM2NzYzNDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xMDgweDY0cDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTgxMTUsd2lkdGg9MTA4MCxoZWlnaHQ9NjQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMDk4NzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4MTE1LHdpZHRoPTEwODAsaGVpZ2h0PTY0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjA5ODcyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTA4OHgxOTIwcDUwZjMyXzQxMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI5NjMwMCx3aWR0aD0xMDg4LGhlaWdodD0xOTIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzY4NzQ3MixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mjk2MzAwLHdpZHRoPTEwODgsaGVpZ2h0PTE5MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zNjg3NDcyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTE1MngyMDQ4cDUwZjMyXzQ3MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMzNjc4Mix3aWR0aD0xMTUyLGhlaWdodD0yMDQ4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDE5MzQ4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzM2NzgyLHdpZHRoPTExNTIsaGVpZ2h0PTIwNDgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MTkzNDgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTI4MHgxMjgwcDUwZjMyXzMyMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIyOTUzOSx3aWR0aD0xMjgwLGhlaWdodD0xMjgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Mjg1Mjk2MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjI5NTM5LHdpZHRoPTEyODAsaGVpZ2h0PTEyODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yODUyOTYwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTI4MHgxOTIwcDUwZjMyXzQ5MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1MzU4NSx3aWR0aD0xMjgwLGhlaWdodD0xOTIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQwMzUzNixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzUzNTg1LHdpZHRoPTEyODAsaGVpZ2h0PTE5MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDAzNTM2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTI4MHg2NHA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3NDkzLHdpZHRoPTEyODAsaGVpZ2h0PTY0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjAyMDk2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzQ5Myx3aWR0aD0xMjgwLGhlaWdodD02NCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwMjA5NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzEyODB4NzIwcDUwZjMyXzE4MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE0MDI4Nyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzM3MDA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNDAyODcsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTczNzAwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzEyODB4OTYwcDUwZjMyXzI0MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4MDA5Myx3aWR0aD0xMjgwLGhlaWdodD05NjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjM0NTg0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODAwOTMsd2lkdGg9MTI4MCxoZWlnaHQ9OTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIzNDU4NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzEyOHgxMjhwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTY2NSx3aWR0aD0xMjgsaGVpZ2h0PTEyOCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3OTM0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTU2NjUsd2lkdGg9MTI4LGhlaWdodD0xMjgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzkzNDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xMjh4MTkycDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTYwNzEsd2lkdGg9MTI4LGhlaWdodD0xOTIsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xODQzMjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2MDcxLHdpZHRoPTEyOCxoZWlnaHQ9MTkyLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTg0MzIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTI4eDcycDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTQ1ODgsd2lkdGg9MTI4LGhlaWdodD03MixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE2NTc4NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTQ1ODgsd2lkdGg9MTI4LGhlaWdodD03MixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE2NTc4NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzEyOHg5NnA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1NzAzLHdpZHRoPTEyOCxoZWlnaHQ9OTYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzk5MjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1NzAzLHdpZHRoPTEyOCxoZWlnaHQ9OTYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzk5MjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xNDQweDEwODBwNTBmMzJfMzEwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjMyMTQ0LHdpZHRoPTE0NDAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yODg1MjI0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMzIxNDQsd2lkdGg9MTQ0MCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI4ODUyMjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xNDQweDE0NDBwNTBmMzJfNDEwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mjk1OTMwLHdpZHRoPTE0NDAsaGVpZ2h0PTE0NDAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zNjgyODQ4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yOTU5MzAsd2lkdGg9MTQ0MCxoZWlnaHQ9MTQ0MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM2ODI4NDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xNDQweDE5MjBwNTBmMzJfNTUwMGticHMubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mzk3NTE0LHdpZHRoPTE0NDAsaGVpZ2h0PTE5MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00OTUyNjQ4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0yMjIwNiw0NiArMjIyMDYsNDYgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTMyOTI2LHdpZHRoPTE0NDAsaGVpZ2h0PTI1NjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02NjQ1MjgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTQ0MHg5NjBwNTBmMzJfMjcwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjAyNjM4LHdpZHRoPTE0NDAsaGVpZ2h0PTk2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI1MTY0MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIwMjYzOCx3aWR0aD0xNDQwLGhlaWdodD05NjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNTE2NDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTQ0eDE0NHA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2MDg5LHdpZHRoPTE0NCxoZWlnaHQ9MTQ0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTg0NjQ4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjA4OSx3aWR0aD0xNDQsaGVpZ2h0PTE0NCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE4NDY0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE0NHgxNzZwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjI0NSx3aWR0aD0xNDQsaGVpZ2h0PTE3NixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE4NjQ5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTYyNDUsd2lkdGg9MTQ0LGhlaWdodD0xNzYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xODY0OTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xNDR4MTkycDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTY0MzMsd2lkdGg9MTQ0LGhlaWdodD0xOTIsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xODg4NDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2NDMzLHdpZHRoPTE0NCxoZWlnaHQ9MTkyLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTg4ODQ4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTQ0eDI1NnA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2NTczLHdpZHRoPTE0NCxoZWlnaHQ9MjU2LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTkwNjAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjU3Myx3aWR0aD0xNDQsaGVpZ2h0PTI1NixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5MDYwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE0NHg5NnA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1NTU4LHdpZHRoPTE0NCxoZWlnaHQ9OTYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzgwMDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1NTU4LHdpZHRoPTE0NCxoZWlnaHQ9OTYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzgwMDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xNTM2eDIwNDhwNTBmMzJfNjIwMGticHMubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDQ2MDU4LHdpZHRoPTE1MzYsaGVpZ2h0PTIwNDgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01NTU5NDMyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTYweDI0MHA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2ODcyLHdpZHRoPTE2MCxoZWlnaHQ9MjQwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTk0MzM2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjg3Mix3aWR0aD0xNjAsaGVpZ2h0PTI0MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5NDMzNixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE3MngxNzJwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjY5OCx3aWR0aD0xNzIsaGVpZ2h0PTE3MixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5MjE0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTY2OTgsd2lkdGg9MTcyLGhlaWdodD0xNzIsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTIxNDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xNzZ4MTQ0cDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTU5NjAsd2lkdGg9MTc2LGhlaWdodD0xNDQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xODMwMzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1OTYwLHdpZHRoPTE3NixoZWlnaHQ9MTQ0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTgzMDMyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTc2eDk2cDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTU1NDksd2lkdGg9MTc2LGhlaWdodD05NixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3Nzg5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTU1NDksd2lkdGg9MTc2LGhlaWdodD05NixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3Nzg5NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl80MTAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMDc2Mjgsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM4Mjg3NjgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMwNzYyOCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzgyODc2OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE5MjB4MTA4OHA1MGYzMl80MTAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMDY5NDQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4OCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM4MjAyMjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMwNjk0NCx3aWR0aD0xOTIwLGhlaWdodD0xMDg4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzgyMDIyNCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE5MjB4MTI4MHA1MGYzMl80OTAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTUxNTEsd2lkdGg9MTkyMCxoZWlnaHQ9MTI4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0MjMxMTIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NTE1MSx3aWR0aD0xOTIwLGhlaWdodD0xMjgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQyMzExMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE5MjB4MTQ0MHA1MGYzMl81NTAwa2Jwcy5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zOTc1OTksd2lkdGg9MTkyMCxoZWlnaHQ9MTQ0MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ5NTM3MTIscGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTIyMjU3LDI1ICsyMjI1NywyNSBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03MjE2NjEsd2lkdGg9MTkyMCxoZWlnaHQ9MjU2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTkwMDQ0NzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xOTIweDY0cDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTcyOTQsd2lkdGg9MTkyMCxoZWlnaHQ9NjQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTk5MTIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3Mjk0LHdpZHRoPTE5MjAsaGVpZ2h0PTY0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTk5OTEyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTkyeDEyOHA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1OTIzLHdpZHRoPTE5MixoZWlnaHQ9MTI4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTgyNTY4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTkyMyx3aWR0aD0xOTIsaGVpZ2h0PTEyOCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE4MjU2OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE5MngxNDRwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjE5Nyx3aWR0aD0xOTIsaGVpZ2h0PTE0NCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE4NjAwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTYxOTcsd2lkdGg9MTkyLGhlaWdodD0xNDQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xODYwMDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xOTJ4MTkycDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTY5MzEsd2lkdGg9MTkyLGhlaWdodD0xOTIsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTUwNzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2OTMxLHdpZHRoPTE5MixoZWlnaHQ9MTkyLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTk1MDcyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTkyeDI1NnA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2ODQ0LHdpZHRoPTE5MixoZWlnaHQ9MjU2LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTkzOTg0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjg0NCx3aWR0aD0xOTIsaGVpZ2h0PTI1NixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5Mzk4NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE5MngyODhwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzAzNyx3aWR0aD0xOTIsaGVpZ2h0PTI4OCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5NjQwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTcwMzcsd2lkdGg9MTkyLGhlaWdodD0yODgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTY0MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8yMDQ4eDExNTJwNTBmMzJfNDcwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzQwODI4LHdpZHRoPTIwNDgsaGVpZ2h0PTExNTIsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MjQ0MDU2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNDA4Mjgsd2lkdGg9MjA0OCxoZWlnaHQ9MTE1MixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQyNDQwNTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8yMDQ4eDE1MzZwNTBmMzJfNjIwMGticHMubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDQ4NzQyLHdpZHRoPTIwNDgsaGVpZ2h0PTE1MzYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01NTkyOTg0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0yMjI4NCwyMiArMjIyODQsMjIgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTk2NjIxLHdpZHRoPTIwNDgsaGVpZ2h0PTIwNDgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03NDQxNDcyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMjE2eDI4OHA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3MjYyLHdpZHRoPTIxNixoZWlnaHQ9Mjg4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTk5MjA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzI2Mix3aWR0aD0yMTYsaGVpZ2h0PTI4OCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5OTIwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzIzMDR4NDA5NnA1MGYzMl8xODgwMGticHMubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTQxNTg2OCx3aWR0aD0yMzA0LGhlaWdodD00MDk2LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTc2ODIwNTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8yNDB4MTYwcDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTY4ODQsd2lkdGg9MjQwLGhlaWdodD0xNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTQ0ODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2ODg0LHdpZHRoPTI0MCxoZWlnaHQ9MTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTk0NDgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMjQweDI0MHA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3NTgxLHdpZHRoPTI0MCxoZWlnaHQ9MjQwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjAzMjAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzU4MSx3aWR0aD0yNDAsaGVpZ2h0PTI0MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwMzIwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI0MHgzMjBwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODA2NCx3aWR0aD0yNDAsaGVpZ2h0PTMyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwOTIzMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTgwNjQsd2lkdGg9MjQwLGhlaWdodD0zMjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMDkyMzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8yNDB4MzYwcDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTgzMTQsd2lkdGg9MjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMTIzNjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4MzE0LHdpZHRoPTI0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjEyMzYwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMjU2MHgxNDQwcDUwZjMyXzczMDBrYnBzLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTUyODUwMyx3aWR0aD0yNTYwLGhlaWdodD0xNDQwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NjU5MDAwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMjIzMTQsMzQgKzIyMzE0LDM0IEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE0NzYzNDQsd2lkdGg9MjU2MCxoZWlnaHQ9Mzg0MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE4NDM4MDA4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMjU2eDE0NHA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2ODMwLHdpZHRoPTI1NixoZWlnaHQ9MTQ0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTkzODA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjgzMCx3aWR0aD0yNTYsaGVpZ2h0PTE0NCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5MzgwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI1NngxOTJwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzI3Myx3aWR0aD0yNTYsaGVpZ2h0PTE5MixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5OTM0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTcyNzMsd2lkdGg9MjU2LGhlaWdodD0xOTIsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTkzNDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8yNTZ4MjU2cDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc3NzQsd2lkdGg9MjU2LGhlaWdodD0yNTYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMDU2MDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3Nzc0LHdpZHRoPTI1NixoZWlnaHQ9MjU2LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjA1NjA4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMjY0eDM1MnA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4NjczLHdpZHRoPTI2NCxoZWlnaHQ9MzUyLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjE2ODQ4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODY3Myx3aWR0aD0yNjQsaGVpZ2h0PTM1MixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIxNjg0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI4ODB4Mzg0MHA1MGYzMl8yMjEwMGticHMubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTY3NDM3OSx3aWR0aD0yODgwLGhlaWdodD0zODQwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjA5MTM0NDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8yODh4MTkycDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc0ODcsd2lkdGg9Mjg4LGhlaWdodD0xOTIsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMDIwMjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3NDg3LHdpZHRoPTI4OCxoZWlnaHQ9MTkyLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjAyMDI0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMjg4eDIxNnA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3NDUxLHdpZHRoPTI4OCxoZWlnaHQ9MjE2LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjAxNTY4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzQ1MSx3aWR0aD0yODgsaGVpZ2h0PTIxNixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwMTU2OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI4OHgyODhwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzc2MCx3aWR0aD0yODgsaGVpZ2h0PTI4OCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwNTQzMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc3NjAsd2lkdGg9Mjg4LGhlaWdodD0yODgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMDU0MzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8yODh4MzUycDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5MDMsd2lkdGg9Mjg4LGhlaWdodD0zNTIsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMTk3MjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4OTAzLHdpZHRoPTI4OCxoZWlnaHQ9MzUyLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjE5NzIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMjg4eDUxMnA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIwMzY1LHdpZHRoPTI4OCxoZWlnaHQ9NTEyLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM3OTg0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMDM2NSx3aWR0aD0yODgsaGVpZ2h0PTUxMixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNzk4NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzMwNzJ4NDA5NnA1MGYzMl8yNDAwMGticHMubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTgyNzM2Nyx3aWR0aD0zMDcyLGhlaWdodD00MDk2LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjI4MjU4MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTIyMzUwLDU1ICsyMjM1MCw1NSBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODI4NzcwLHdpZHRoPTMxMjAsaGVpZ2h0PTQxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjg0MzMzNixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzMyMHgyNDBwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzkwNyx3aWR0aD0zMjAsaGVpZ2h0PTI0MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwNzI3MixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc5MDcsd2lkdGg9MzIwLGhlaWdodD0yNDAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMDcyNzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8zMjB4MzIwcDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg0NTcsd2lkdGg9MzIwLGhlaWdodD0zMjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMTQxNDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4NDU3LHdpZHRoPTMyMCxoZWlnaHQ9MzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjE0MTQ0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMzIweDQ4MHA1MGYzMl8zMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI2MTgwLHdpZHRoPTMyMCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzEwNjgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yNjE4MCx3aWR0aD0zMjAsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMxMDY4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzM1MHgzNTBwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTY5NSx3aWR0aD0zNTAsaGVpZ2h0PTM1MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyOTYwOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTk2OTUsd2lkdGg9MzUwLGhlaWdodD0zNTAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjk2MDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8zNTJ4MjY0cDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTgwNTEsd2lkdGg9MzUyLGhlaWdodD0yNjQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMDkwNzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4MDUxLHdpZHRoPTM1MixoZWlnaHQ9MjY0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjA5MDcyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMzUyeDI4OHA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4MzA1LHdpZHRoPTM1MixoZWlnaHQ9Mjg4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjEyMjQ4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODMwNSx3aWR0aD0zNTIsaGVpZ2h0PTI4OCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIxMjI0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzM1MngzNTJwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTE0Myx3aWR0aD0zNTIsaGVpZ2h0PTM1MixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMjcyMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTkxNDMsd2lkdGg9MzUyLGhlaWdodD0zNTIsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjI3MjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8zNTZ4NjM4cDUwZjMyXzQwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzQ0NTMsd2lkdGg9MzU2LGhlaWdodD02MzgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MTQwNzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM0NDUzLHdpZHRoPTM1NixoZWlnaHQ9NjM4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDE0MDcyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMzU2eDY0MHA1MGYzMl80MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM0NDg0LHdpZHRoPTM1NixoZWlnaHQ9NjQwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDE0NDU2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNDQ4NCx3aWR0aD0zNTYsaGVpZ2h0PTY0MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQxNDQ1NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzM1OHg2MzZwNTBmMzJfNDAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNDU2NCx3aWR0aD0zNTgsaGVpZ2h0PTYzNixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQxNTQ1NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzQ1NjQsd2lkdGg9MzU4LGhlaWdodD02MzYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MTU0NTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8zNTh4NjQwcDUwZjMyXzQwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzQ0OTEsd2lkdGg9MzU4LGhlaWdodD02NDAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MTQ1NjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM0NDkxLHdpZHRoPTM1OCxoZWlnaHQ9NjQwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDE0NTYwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMzYweDI0MHA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4MDkyLHdpZHRoPTM2MCxoZWlnaHQ9MjQwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjA5NTg0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODA5Mix3aWR0aD0zNjAsaGVpZ2h0PTI0MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwOTU4NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzM2MHgzNjBwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTU3Myx3aWR0aD0zNjAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyODA5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTk1NzMsd2lkdGg9MzYwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjgwOTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8zNjB4NDgwcDUwZjMyXzMwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjY3NDMsd2lkdGg9MzYwLGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zMTc3MjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI2NzQzLHdpZHRoPTM2MCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzE3NzIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMzYweDYzNnA1MGYzMl80MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM0NTI3LHdpZHRoPTM2MCxoZWlnaHQ9NjM2LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDE1MDAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNDUyNyx3aWR0aD0zNjAsaGVpZ2h0PTYzNixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQxNTAwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzM2MHg2MzhwNTBmMzJfNDAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNDQ2Mix3aWR0aD0zNjAsaGVpZ2h0PTYzOCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQxNDIwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzQ0NjIsd2lkdGg9MzYwLGhlaWdodD02MzgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MTQyMDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8zNjB4NjQwcDUwZjMyXzQwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzQ0MDcsd2lkdGg9MzYwLGhlaWdodD02NDAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MTM1MTIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM0NDA3LHdpZHRoPTM2MCxoZWlnaHQ9NjQwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDEzNTEyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMzg0MHgyMTYwcDUwZjMyXzE2NTAwa2Jwcy5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMjE1MjgzLHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNTE3NDc0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMjI0MTMsNyArMjI0MTMsNyBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODIzNDEzLHdpZHRoPTM4NDAsaGVpZ2h0PTM4NDAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjc3NjM2OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzM4NHg1MTJwNTBmMzJfMzAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yNzg3MCx3aWR0aD0zODQsaGVpZ2h0PTUxMixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMzMTgwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mjc4NzAsd2lkdGg9Mzg0LGhlaWdodD01MTIsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zMzE4MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF80MDk2eDIzMDRwNTBmMzJfMTg4MDBrYnBzLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE0MjE1ODMsd2lkdGg9NDA5NixoZWlnaHQ9MjMwNCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3NzUzNDk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0yMjQyOCwxOTMgKzIyNDI4LDE5MyBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODMxNjEyLHdpZHRoPTQxNjAsaGVpZ2h0PTMxMjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjg3ODg1NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzQ3Mng0NzJwNTBmMzJfNDAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNDY4NSx3aWR0aD00NzIsaGVpZ2h0PTQ3MixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQxNzAwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzQ2ODUsd2lkdGg9NDcyLGhlaWdodD00NzIsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MTcwMDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF80ODB4MzIwcDUwZjMyXzMwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjY2NTUsd2lkdGg9NDgwLGhlaWdodD0zMjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zMTY2MjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI2NjU1LHdpZHRoPTQ4MCxoZWlnaHQ9MzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzE2NjI0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNDgweDM2MHA1MGYzMl8zMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI2ODA5LHdpZHRoPTQ4MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzE4NTQ0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yNjgwOSx3aWR0aD00ODAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMxODU0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzQ4MHg0ODBwNTBmMzJfNDAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNDY0OCx3aWR0aD00ODAsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQxNjUzNixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzQ2NDgsd2lkdGg9NDgwLGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MTY1MzYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF80ODB4NjQwcDUwZjMyXzYwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDkwMzIsd2lkdGg9NDgwLGhlaWdodD02NDAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01OTYzMjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQ5MDMyLHdpZHRoPTQ4MCxoZWlnaHQ9NjQwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTk2MzIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNDgweDcyMHA1MGYzMl82MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTUwMzA2LHdpZHRoPTQ4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NjEyMjQ4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01MDMwNix3aWR0aD00ODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTYxMjI0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzQ4MHg4NDhwNTBmMzJfODAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02MzYzNSx3aWR0aD00ODAsaGVpZ2h0PTg0OCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTc3ODk2MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NjM2MzUsd2lkdGg9NDgwLGhlaWdodD04NDgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03Nzg5NjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF81MTJ4Mjg4cDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjAyNjQsd2lkdGg9NTEyLGhlaWdodD0yODgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzY3MjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIwMjY0LHdpZHRoPTUxMixoZWlnaHQ9Mjg4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM2NzIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNTEyeDM4NHA1MGYzMl8zMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI3NjI4LHdpZHRoPTUxMixoZWlnaHQ9Mzg0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzI4NzY4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yNzYyOCx3aWR0aD01MTIsaGVpZ2h0PTM4NCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMyODc2OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzUxMng1MTJwNTBmMzJfNTAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MTg4OCx3aWR0aD01MTIsaGVpZ2h0PTUxMixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTUwNzAyNCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDE4ODgsd2lkdGg9NTEyLGhlaWdodD01MTIsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01MDcwMjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF81Mjh4NzA0cDUwZjMyXzcwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTcyNjIsd2lkdGg9NTI4LGhlaWdodD03MDQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02OTkyMDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTU3MjYyLHdpZHRoPTUyOCxoZWlnaHQ9NzA0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Njk5MjAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNTc2eDEwMjRwNTBmMzJfMTEwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9ODc1MDEsd2lkdGg9NTc2LGhlaWdodD0xMDI0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTA3NzI4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9ODc1MDEsd2lkdGg9NTc2LGhlaWdodD0xMDI0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTA3NzI4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzU3Nng3MDRwNTBmMzJfODAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02NDU0NSx3aWR0aD01NzYsaGVpZ2h0PTcwNCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTc5MDIzMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NjQ1NDUsd2lkdGg9NTc2LGhlaWdodD03MDQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03OTAyMzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF81NzZ4NzIwcDUwZjMyXzgwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NjQ5OTIsd2lkdGg9NTc2LGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03OTU4MjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTY0OTkyLHdpZHRoPTU3NixoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Nzk1ODI0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNjAweDgwMHA1MGYzMl85MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTcxMjA3LHdpZHRoPTYwMCxoZWlnaHQ9ODAwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9ODczNTEyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03MTIwNyx3aWR0aD02MDAsaGVpZ2h0PTgwMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTg3MzUxMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzYzNngzNThwNTBmMzJfNDAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNDk5Mix3aWR0aD02MzYsaGVpZ2h0PTM1OCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQyMDgwOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzQ5OTIsd2lkdGg9NjM2LGhlaWdodD0zNTgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MjA4MDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF82MzZ4MzYwcDUwZjMyXzQwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzUwMDEsd2lkdGg9NjM2LGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MjA5MjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1MDAxLHdpZHRoPTYzNixoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDIwOTIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNjM4eDM1NnA1MGYzMl80MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM0NTI4LHdpZHRoPTYzOCxoZWlnaHQ9MzU2LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDE1MDA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNDUyOCx3aWR0aD02MzgsaGVpZ2h0PTM1NixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQxNTAwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzYzOHgzNjBwNTBmMzJfNDAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNDY0OSx3aWR0aD02MzgsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQxNjUzNixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzQ2NDksd2lkdGg9NjM4LGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MTY1MzYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF82NDB4MzU2cDUwZjMyXzQwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzQ1NzUsd2lkdGg9NjQwLGhlaWdodD0zNTYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MTU2MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM0NTc1LHdpZHRoPTY0MCxoZWlnaHQ9MzU2LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDE1NjAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNjQweDM1OHA1MGYzMl80MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM0NTIxLHdpZHRoPTY0MCxoZWlnaHQ9MzU4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDE0OTM2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNDUyMSx3aWR0aD02NDAsaGVpZ2h0PTM1OCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQxNDkzNixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzY0MHgzNjBwNTBmMzJfNDAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNDU1MCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQxNTI5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzQ1NTAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MTUyOTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF82NDB4NDgwcDUwZjMyXzYwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDkzMDIsd2lkdGg9NjQwLGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01OTk2OTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQ5MzAyLHdpZHRoPTY0MCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTk5Njk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNjQweDY0MHA1MGYzMl84MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTY0MzU1LHdpZHRoPTY0MCxoZWlnaHQ9NjQwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Nzg3ODU2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02NDM1NSx3aWR0aD02NDAsaGVpZ2h0PTY0MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTc4Nzg1NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzY0MHg4NDhwNTBmMzJfMTAwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Nzg1OTUsd2lkdGg9NjQwLGhlaWdodD04NDgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05NjYxNjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTc4NTk1LHdpZHRoPTY0MCxoZWlnaHQ9ODQ4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTY2MTYwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNjQweDk2MHA1MGYzMl8xMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT05NDE2Nix3aWR0aD02NDAsaGVpZ2h0PTk2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTExNjA2MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTk0MTY2LHdpZHRoPTY0MCxoZWlnaHQ9OTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTE2MDYwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzY0eDEwODBwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzIyNyx3aWR0aD02NCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5ODg3MixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTcyMjcsd2lkdGg9NjQsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTg4NzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF82NHgxMjgwcDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTcyNTUsd2lkdGg9NjQsaGVpZ2h0PTEyODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTkzMjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3MjU1LHdpZHRoPTY0LGhlaWdodD0xMjgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTk5MzIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNjR4MTkyMHA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3MjAzLHdpZHRoPTY0LGhlaWdodD0xOTIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTk4NzY4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzIwMyx3aWR0aD02NCxoZWlnaHQ9MTkyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5ODc2OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzY0eDY0cDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTQ4MTgsd2lkdGg9NjQsaGVpZ2h0PTY0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTY5NDcyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNDgxOCx3aWR0aD02NCxoZWlnaHQ9NjQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNjk0NzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF82NHg3MjBwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjY1OSx3aWR0aD02NCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTkxNzY4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjY1OSx3aWR0aD02NCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTkxNzY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNjR4OTZwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTI5OSx3aWR0aD02NCxoZWlnaHQ9OTYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzQ5ODQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1Mjk5LHdpZHRoPTY0LGhlaWdodD05NixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3NDk4NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzcwNHg1MjhwNTBmMzJfNzAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01Njk5Nyx3aWR0aD03MDQsaGVpZ2h0PTUyOCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTY5NTg4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTY5OTcsd2lkdGg9NzA0LGhlaWdodD01MjgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02OTU4ODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF83MDR4NTc2cDUwZjMyXzgwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NjQzMjgsd2lkdGg9NzA0LGhlaWdodD01NzYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03ODc1MjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTY0MzI4LHdpZHRoPTcwNCxoZWlnaHQ9NTc2LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Nzg3NTIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNzA0eDcwNHA1MGYzMl85MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTcyNzY5LHdpZHRoPTcwNCxoZWlnaHQ9NzA0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9ODkzMDMyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03Mjc2OSx3aWR0aD03MDQsaGVpZ2h0PTcwNCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTg5MzAzMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzcyMHgxMjgwcDUwZjMyXzE4MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEzODQwOCx3aWR0aD03MjAsaGVpZ2h0PTEyODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzEzNTIwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMzg0MDgsd2lkdGg9NzIwLGhlaWdodD0xMjgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTcxMzUyMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzcyMHg0ODBwNTBmMzJfNjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01MDE3Nyx3aWR0aD03MjAsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTYxMDYzMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTAxNzcsd2lkdGg9NzIwLGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02MTA2MzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF83MjB4NTc2cDUwZjMyXzgwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NjQ0NTQsd2lkdGg9NzIwLGhlaWdodD01NzYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03ODkwOTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTY0NDU0LHdpZHRoPTcyMCxoZWlnaHQ9NTc2LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Nzg5MDk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNzIweDY0cDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTczNDUsd2lkdGg9NzIwLGhlaWdodD02NCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwMDI0OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTczNDUsd2lkdGg9NzIwLGhlaWdodD02NCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwMDI0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzcyMHg3MjBwNTBmMzJfMTAwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Nzk5NjAsd2lkdGg9NzIwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05ODI5MjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTc5OTYwLHdpZHRoPTcyMCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTgyOTIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNzIweDk2MHA1MGYzMl8xMzAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDE5NzQsd2lkdGg9NzIwLGhlaWdodD05NjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMjU4MDk2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDE5NzQsd2lkdGg9NzIwLGhlaWdodD05NjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMjU4MDk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNzJ4MTI4cDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTUwNDEsd2lkdGg9NzIsaGVpZ2h0PTEyOCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3MTU0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTUwNDEsd2lkdGg9NzIsaGVpZ2h0PTEyOCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3MTU0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzcyeDk2cDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTUyNTIsd2lkdGg9NzIsaGVpZ2h0PTk2LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTc0NDAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTI1Mix3aWR0aD03MixoZWlnaHQ9OTYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzQ0MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF83Njh4MTAyNHA1MGYzMl8xNTAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTc4ODUsd2lkdGg9NzY4LGhlaWdodD0xMDI0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ1NzA4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE3ODg1LHdpZHRoPTc2OCxoZWlnaHQ9MTAyNCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NTcwODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF84MDB4NjAwcDUwZjMyXzkwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NzI0MjAsd2lkdGg9ODAwLGhlaWdodD02MDAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04ODg2NzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTcyNDIwLHdpZHRoPTgwMCxoZWlnaHQ9NjAwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9ODg4NjcyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfODAweDgwMHA1MGYzMl8xMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT05NDQ3NSx3aWR0aD04MDAsaGVpZ2h0PTgwMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTExNjQzNjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTk0NDc1LHdpZHRoPTgwMCxoZWlnaHQ9ODAwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTE2NDM2MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzg0OHg0ODBwNTBmMzJfODAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02NDQ4Nyx3aWR0aD04NDgsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTc4OTUxMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NjQ0ODcsd2lkdGg9ODQ4LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03ODk1MTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF84NDh4NjQwcDUwZjMyXzEwMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTgwMzUzLHdpZHRoPTg0OCxoZWlnaHQ9NjQwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTg3ODMyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT04MDM1Myx3aWR0aD04NDgsaGVpZ2h0PTY0MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTk4NzgzMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzg0OHg4NDhwNTBmMzJfMTQwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA5MjY1LHdpZHRoPTg0OCxoZWlnaHQ9ODQ4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM0OTIzMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA5MjY1LHdpZHRoPTg0OCxoZWlnaHQ9ODQ4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM0OTIzMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzk2MHgxMjgwcDUwZjMyXzI0MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3OTE3NSx3aWR0aD05NjAsaGVpZ2h0PTEyODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjIzMTEyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzkxNzUsd2lkdGg9OTYwLGhlaWdodD0xMjgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIyMzExMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzk2MHgxNDQwcDUwZjMyXzI3MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5NTI5Mix3aWR0aD05NjAsaGVpZ2h0PTE0NDAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNDI0ODcyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTUyOTIsd2lkdGg9OTYwLGhlaWdodD0xNDQwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjQyNDg3MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzk2MHg2NDBwNTBmMzJfMTIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9OTQ0ODIsd2lkdGg9OTYwLGhlaWdodD02NDAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMTY0NDQ4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT05NDQ4Mix3aWR0aD05NjAsaGVpZ2h0PTY0MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTExNjQ0NDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF85NjB4NzIwcDUwZjMyXzEzMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwMjkwMSx3aWR0aD05NjAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEyNjk2ODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwMjkwMSx3aWR0aD05NjAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEyNjk2ODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF85NjB4OTYwcDUwZjMyXzE4MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEzOTI2OCx3aWR0aD05NjAsaGVpZ2h0PTk2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3MjQyNzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEzOTI2OCx3aWR0aD05NjAsaGVpZ2h0PTk2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3MjQyNzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF85NngxMjhwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTMwNix3aWR0aD05NixoZWlnaHQ9MTI4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTc0ODU2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTMwNix3aWR0aD05NixoZWlnaHQ9MTI4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTc0ODU2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfOTZ4MTQ0cDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTU1MTEsd2lkdGg9OTYsaGVpZ2h0PTE0NCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3NzQyNCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTU1MTEsd2lkdGg9OTYsaGVpZ2h0PTE0NCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3NzQyNCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzk2eDE3NnA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2MTI3LHdpZHRoPTk2LGhlaWdodD0xNzYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xODUwMjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2MTI3LHdpZHRoPTk2LGhlaWdodD0xNzYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xODUwMjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF85Nng2NHA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE0NjQ5LHdpZHRoPTk2LGhlaWdodD02NCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE2ODI1NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTQ2NDksd2lkdGg9OTYsaGVpZ2h0PTY0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTY4MjU2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfOTZ4NzJwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNDI5Mix3aWR0aD05NixoZWlnaHQ9NzIsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNjIwOTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE0MjkyLHdpZHRoPTk2LGhlaWdodD03MixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE2MjA5NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzk2eDk2cDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTU1Mzgsd2lkdGg9OTYsaGVpZ2h0PTk2LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTc3OTY4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTUzOCx3aWR0aD05NixoZWlnaHQ9OTYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzc5NjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvc2NhbGluZ19saXN0L2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2RlZnNsaXN0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMyMTE1NSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zOTk3ODU2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMjExNTUsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Mzk5Nzg1NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9zY2FsaW5nX2xpc3QvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9zbGlzdC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMjUwMDYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDA0NjAwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzI1MDA2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQwNDYwMDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvc2NhbGluZ19saXN0L2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX3NsaXN0X2ZsYXRfMTYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzI1MDQxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQwNDYwMDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMyNTA0MSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MDQ2MDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3NjYWxpbmdfbGlzdC9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9zbGlzdF9mbGF0XzEubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA1MjE0NCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzEzNDczNixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMjI2MjMsMTMgKzIyNjIzLDEzIEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQyNjkyMyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01MzEwMjAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3NjYWxpbmdfbGlzdC9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9zbGlzdF9ybmRtXzEyMF8xMzYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjQ1NDc0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMwNDE0NDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI0NTQ3NCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zMDQxNDQ4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3NjYWxpbmdfbGlzdC9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9zbGlzdF9ybmRtXzFfMjU1Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI4Njk5OSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zNTQ5MzQ0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yODY5OTksd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzU0OTM0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9zY2FsaW5nX2xpc3QvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfc2xpc3Rfcm5kbV8yNDBfMjU1Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIyNjc4NSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yODA4MDU2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMjY3ODUsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjgwODA1NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9zY2FsaW5nX2xpc3QvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfc2xpc3RfdmVydF8xXzI1NS5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02NjIxMTYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9ODI1NDkxMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMjI2ODMsNTggKzIyNjgzLDU4IEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQyMTg4ODYsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTUyNzE0ODMyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3NjYWxpbmdfbGlzdC9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZGVmc2xpc3QubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NzM1NzQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05MDMwOTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTczNTc0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTAzMDk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3NjYWxpbmdfbGlzdC9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9zbGlzdC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03NDEzMCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTkxMDA0OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NzQxMzAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05MTAwNDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvc2NhbGluZ19saXN0L2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9zbGlzdF9mbGF0XzE2Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTc0MTY0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTEwMDQ4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03NDE2NCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTkxMDA0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9zY2FsaW5nX2xpc3QvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3NsaXN0X2ZsYXRfMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODkwMTAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzQ1NTY4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODkwMTAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzQ1NTY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3NjYWxpbmdfbGlzdC9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfc2xpc3Rfcm5kbV8xXzE2Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTgxNDM5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTkxNjQ4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT04MTQzOSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTk5MTY0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9zY2FsaW5nX2xpc3QvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3NsaXN0X3JuZG1fMTIwXzEzNi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01ODkxNSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTcwOTQ3MixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTg5MTUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03MDk0NzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvc2NhbGluZ19saXN0L2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9zbGlzdF9ybmRtXzFfMjU1Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTY4OTQwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9ODIzNjA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02ODk0MCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTgyMzYwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9zY2FsaW5nX2xpc3QvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3NsaXN0X3JuZG1fMjQwXzI1NS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01MzQ3MCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTY0MTYyNCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTM0NzAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02NDE2MjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvc2NhbGluZ19saXN0L2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9zbGlzdF92ZXJ0XzFfMjU1Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEyMjAxMCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE1MDM1ODQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEyMjAxMCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE1MDM1ODQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvc2NhbGluZ19saXN0L2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9kZWZzbGlzdC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTE1NTUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xODc3ODQ4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTE1NTUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xODc3ODQ4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3NjYWxpbmdfbGlzdC9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9zbGlzdC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTMzMDIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xODk5Njk2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTMzMDIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xODk5Njk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3NjYWxpbmdfbGlzdC9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfc2xpc3RfZmxhdF8xNi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTMzMzcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xODk5Njk2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTMzMzcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xODk5Njk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3NjYWxpbmdfbGlzdC9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfc2xpc3RfZmxhdF8xLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQwNzg1Myx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTUwODExMTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvc2NhbGluZ19saXN0L2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9zbGlzdF9ybmRtXzFfMTYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc5NzU2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIyMDYwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc5NzU2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIyMDYwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC8xMGJpdC9zY2FsaW5nX2xpc3QvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3NsaXN0X3JuZG1fMTIwXzEzNi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTc1MzMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDQyMjAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTc1MzMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDQyMjAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3NjYWxpbmdfbGlzdC9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfc2xpc3Rfcm5kbV8xXzI1NS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMzk4OTAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzEwNDgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMzk4OTAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzEwNDgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzEwYml0L3NjYWxpbmdfbGlzdC9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfc2xpc3Rfcm5kbV8yNDBfMjU1Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwNjcyNyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzMDczMjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwNjcyNyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzMDczMjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvc2NhbGluZ19saXN0L2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9zbGlzdF92ZXJ0XzFfMjU1Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI2MDg2MCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMyMzkyMDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI2MDg2MCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMyMzkyMDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvMTBiaXQvc2xpY2VzX3RpbGVzL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMi9jcm93ZF8zODQweDIxNjBwNTBmMzJfMTAyNGJ5dGVfc2xpY2VzLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM4ODU1Njksd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI0Mjc2MjAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0yMjk1NiwxNjYgKzIyOTU2LDE2NiBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMjgyMjg4LHdpZHRoPTM3MTIsaGVpZ2h0PTIwMzIsZnJhbWUtcmF0ZT0yNSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04MDA1NjU2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvZ29wL2Nyb3dkXzEyODB4NzIwcDUwL2Nyb3dkXzEyODB4NzIwcDUwZjEwX2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTYzMjg5LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTY0OTA5NjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2MzI4OSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02NDkwOTYwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvZ29wL2Nyb3dkXzEyODB4NzIwcDUwL2Nyb3dkXzEyODB4NzIwcDUwZjFfZ29wMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03MzU5Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0xLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTU4MTkxMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NzM1OTIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01ODE5MTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9nb3AvY3Jvd2RfMTI4MHg3MjBwNTAvY3Jvd2RfMTI4MHg3MjBwNTBmMV9nb3AyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTczNjAyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTgxOTkyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03MzYwMix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0xLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTU4MTk5MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L2dvcC9jcm93ZF8xMjgweDcyMHA1MC9jcm93ZF8xMjgweDcyMHA1MGYxX2dvcDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NzM2MDMsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01ODE5OTIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTczNjAzLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTgxOTkyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvZ29wL2Nyb3dkXzEyODB4NzIwcDUwL2Nyb3dkXzEyODB4NzIwcDUwZjFfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03MzYwNCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0xLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTU4MTk5MixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NzM2MDQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01ODE5OTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9nb3AvY3Jvd2RfMTI4MHg3MjBwNTAvY3Jvd2RfMTI4MHg3MjBwNTBmMl9nb3AxLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTg5ODY2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3Nzk3MDAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT04OTg2Nix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzc5NzAwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L2dvcC9jcm93ZF8xMjgweDcyMHA1MC9jcm93ZF8xMjgweDcyMHA1MGYyX2dvcDIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9ODk4NzYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTc3OTkwMDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTg5ODc2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3Nzk5MDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvZ29wL2Nyb3dkXzEyODB4NzIwcDUwL2Nyb3dkXzEyODB4NzIwcDUwZjJfZ29wNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT04OTg3Nyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzc5OTAwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9ODk4Nzcsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTc3OTkwMDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9nb3AvY3Jvd2RfMTI4MHg3MjBwNTAvY3Jvd2RfMTI4MHg3MjBwNTBmMl9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTg5ODc4LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3Nzk5MDAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT04OTg3OCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzc5OTAwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L2dvcC9jcm93ZF8xMjgweDcyMHA1MC9jcm93ZF8xMjgweDcyMHA1MGYzX2dvcDIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTAyNDYyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNTMzNDY0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDI0NjIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM1MzM0NjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9nb3AvY3Jvd2RfMTI4MHg3MjBwNTAvY3Jvd2RfMTI4MHg3MjBwNTBmM19nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwMjQ2Myx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzUzMzQ2NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTAyNDYzLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNTMzNDY0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvZ29wL2Nyb3dkXzEyODB4NzIwcDUwL2Nyb3dkXzEyODB4NzIwcDUwZjNfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDI0NjQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM1MzM0NjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwMjQ2NCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzUzMzQ2NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L2dvcC9jcm93ZF8xMjgweDcyMHA1MC9jcm93ZF8xMjgweDcyMHA1MGY0X2dvcDIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTEwOTc3LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTExMDAwNDAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTA5Nzcsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTEwMDA0MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9nb3AvY3Jvd2RfMTI4MHg3MjBwNTAvY3Jvd2RfMTI4MHg3MjBwNTBmNF9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExMjM5Myx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMTE0MTg5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTEyMzkzLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTExMTQxODk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvZ29wL2Nyb3dkXzEyODB4NzIwcDUwL2Nyb3dkXzEyODB4NzIwcDUwZjRfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTIzOTQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTExNDE4OTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExMjM5NCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMTE0MTg5NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L2dvcC9jcm93ZF8xMjgweDcyMHA1MC9jcm93ZF8xMjgweDcyMHA1MGY1X2dvcDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTIzODk1LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTk4MzI3MjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEyMzg5NSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05ODMyNzIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvZ29wL2Nyb3dkXzEyODB4NzIwcDUwL2Nyb3dkXzEyODB4NzIwcDUwZjVfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMjM4OTYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTgzMjcyMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTIzODk2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTk4MzI3MjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9nb3AvY3Jvd2RfMTI4MHg3MjBwNTAvY3Jvd2RfMTI4MHg3MjBwNTBmNl9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEyOTcwMCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04NTgwMTI4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMjk3MDAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9ODU4MDEyOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L2dvcC9jcm93ZF8xMjgweDcyMHA1MC9jcm93ZF8xMjgweDcyMHA1MGY2X2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTI5NTEyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTg1NjgwNjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEyOTUxMix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04NTY4MDY0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvZ29wL2Nyb3dkXzEyODB4NzIwcDUwL2Nyb3dkXzEyODB4NzIwcDUwZjdfZ29wNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMzUxODAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzY2Njg1NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTM1MTgwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTc2NjY4NTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9nb3AvY3Jvd2RfMTI4MHg3MjBwNTAvY3Jvd2RfMTI4MHg3MjBwNTBmN19nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE0MTI2Nix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04MDE1NDgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNDEyNjYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9ODAxNTQ4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L2dvcC9jcm93ZF8xMjgweDcyMHA1MC9jcm93ZF8xMjgweDcyMHA1MGY4X2dvcDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTM5MTExLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTY5MDQ0NDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEzOTExMSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02OTA0NDQ4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvZ29wL2Nyb3dkXzEyODB4NzIwcDUwL2Nyb3dkXzEyODB4NzIwcDUwZjhfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNDUzMjgsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzIxNjQ0OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTQ1MzI4LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTcyMTY0NDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9nb3AvY3Jvd2RfMTI4MHg3MjBwNTAvY3Jvd2RfMTI4MHg3MjBwNTBmOV9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1NzkwOSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02OTczNjAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTc5MDksd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Njk3MzYwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L2dvcC9jcm93ZF8xOTIweDEwODBwNTAvY3Jvd2RfMTkyMHgxMDgwcDUwZjEwX2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc2NTUyLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03MDIxNDgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzY1NTIsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTcwMjE0ODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9nb3AvY3Jvd2RfMTkyMHgxMDgwcDUwL2Nyb3dkXzE5MjB4MTA4MHA1MGYxMV9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4NjczMix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Njc1MjkwNCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg2NzMyLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02NzUyOTA0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmMTJfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTY2MTEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTY1MTkwNjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5NjYxMSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NjUxOTA2NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L2dvcC9jcm93ZF8xOTIweDEwODBwNTAvY3Jvd2RfMTkyMHgxMDgwcDUwZjEzX2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjA2ODUzLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02MzMyMzY4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMDY4NTMsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTYzMzIzNjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9nb3AvY3Jvd2RfMTkyMHgxMDgwcDUwL2Nyb3dkXzE5MjB4MTA4MHA1MGYxNF9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIxMTE0OCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NjAwMjY1NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjExMTQ4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02MDAyNjU2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmMTVfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMjMxNjQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTU5MjI4MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIyMzE2NCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTkyMjgwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L2dvcC9jcm93ZF8xOTIweDEwODBwNTAvY3Jvd2RfMTkyMHgxMDgwcDUwZjE2X2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTk5MzExLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00OTU2MjAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTkzMTEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ5NTYyMDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9nb3AvY3Jvd2RfMTkyMHgxMDgwcDUwL2Nyb3dkXzE5MjB4MTA4MHA1MGYxX2dvcDEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NjUzMDgsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTE1NjQwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02NTMwOCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01MTU2NDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9nb3AvY3Jvd2RfMTkyMHgxMDgwcDUwL2Nyb3dkXzE5MjB4MTA4MHA1MGYxX2dvcDIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NjUzMTksd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTE1NzIwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02NTMxOSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01MTU3MjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9nb3AvY3Jvd2RfMTkyMHgxMDgwcDUwL2Nyb3dkXzE5MjB4MTA4MHA1MGYxX2dvcDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NjUzMTksd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTE1NzIwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02NTMxOSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01MTU3MjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9nb3AvY3Jvd2RfMTkyMHgxMDgwcDUwL2Nyb3dkXzE5MjB4MTA4MHA1MGYxX2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NjUzMjAsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTE1NzIwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02NTMyMCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01MTU3MjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9nb3AvY3Jvd2RfMTkyMHgxMDgwcDUwL2Nyb3dkXzE5MjB4MTA4MHA1MGYyX2dvcDEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9ODAyMzAsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE1ODY5ODAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT04MDIzMCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTU4Njk4MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9nb3AvY3Jvd2RfMTkyMHgxMDgwcDUwL2Nyb3dkXzE5MjB4MTA4MHA1MGYyX2dvcDIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9ODAyNDEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE1ODcxODAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT04MDI0MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTU4NzE4MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9nb3AvY3Jvd2RfMTkyMHgxMDgwcDUwL2Nyb3dkXzE5MjB4MTA4MHA1MGYyX2dvcDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9ODAyNDEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE1ODcxODAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT04MDI0MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTU4NzE4MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9nb3AvY3Jvd2RfMTkyMHgxMDgwcDUwL2Nyb3dkXzE5MjB4MTA4MHA1MGYyX2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9ODAyNDIsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE1ODcxODAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT04MDI0Mix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTU4NzE4MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9nb3AvY3Jvd2RfMTkyMHgxMDgwcDUwL2Nyb3dkXzE5MjB4MTA4MHA1MGYzX2dvcDIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9OTE0MjYsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEyMDYxODY0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT05MTQyNix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTIwNjE4NjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9nb3AvY3Jvd2RfMTkyMHgxMDgwcDUwL2Nyb3dkXzE5MjB4MTA4MHA1MGYzX2dvcDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9OTE0MjYsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEyMDYxODY0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT05MTQyNix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTIwNjE4NjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9nb3AvY3Jvd2RfMTkyMHgxMDgwcDUwL2Nyb3dkXzE5MjB4MTA4MHA1MGYzX2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9OTE0Mjcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEyMDYxODY0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT05MTQyNyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTIwNjE4NjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9nb3AvY3Jvd2RfMTkyMHgxMDgwcDUwL2Nyb3dkXzE5MjB4MTA4MHA1MGY0X2dvcDIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTAxNDA0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMDA0MzAwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTAxNDA0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMDA0MzAwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L2dvcC9jcm93ZF8xOTIweDEwODBwNTAvY3Jvd2RfMTkyMHgxMDgwcDUwZjRfZ29wNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT05OTQ2MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTg0ODY5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9OTk0NjEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTk4NDg2OTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9nb3AvY3Jvd2RfMTkyMHgxMDgwcDUwL2Nyb3dkXzE5MjB4MTA4MHA1MGY0X2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9OTk0NjIsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTk4NDg2OTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTk5NDYyLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05ODQ4Njk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmNV9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwOTE2Nix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9ODY1NDQwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA5MTY2LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04NjU0NDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmNV9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwOTE2Nyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9ODY1NDQwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA5MTY3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04NjU0NDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmNl9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEyNjQ0Nyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9ODM2MzI2NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTI2NDQ3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04MzYzMjY0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmNl9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNDI5MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzU1MzMyOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE0MjkxLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03NTUzMzI4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmN19nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEzNDg3Myx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzY0OTMxMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTM0ODczLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03NjQ5MzEyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmN19nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEyNDI5OCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzA0NTg4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTI0Mjk4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03MDQ1ODgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmOF9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE0MjI0OSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzA2MTM0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTQyMjQ5LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03MDYxMzQ0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmOF9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEyNzMwNix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NjMxNTM0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTI3MzA2LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02MzE1MzQ0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvZ29wL2Nyb3dkXzE5MjB4MTA4MHA1MC9jcm93ZF8xOTIweDEwODBwNTBmOV9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEzNzk2Nyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NjA4NzI4OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTM3OTY3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02MDg3Mjg4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmMTBfZ29wOC5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MDcxMDYsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE2MjQzNjAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0yMzEzOSwyNjIgKzIzMTM5LDI2MiBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01MjkyNTYsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzMjA0ODAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmMV9nb3AxLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2MzU2Myx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzAxNjcyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjM1NjMsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTMwMTY3MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L2dvcC9jcm93ZF8zODQweDIxNjBwNTAvY3Jvd2RfMzg0MHgyMTYwcDUwZjFfZ29wMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjM1NzMsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTMwMTc1MixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTYzNTczLHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0xLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzMDE3NTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9nb3AvY3Jvd2RfMzg0MHgyMTYwcDUwL2Nyb3dkXzM4NDB4MjE2MHA1MGYxX2dvcDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTYzNTczLHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0xLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzMDE3NTIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2MzU3Myx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzAxNzUyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmMV9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2MzU3NSx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzAxNzUyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjM1NzUsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTMwMTc1MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L2dvcC9jcm93ZF8zODQweDIxNjBwNTAvY3Jvd2RfMzg0MHgyMTYwcDUwZjJfZ29wMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTgzMjAsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM5NDg3NjAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTgzMjAsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM5NDg3NjAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmMl9nb3AyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5ODMzMCx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Mzk0ODk2MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5ODMzMCx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Mzk0ODk2MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9nb3AvY3Jvd2RfMzg0MHgyMTYwcDUwL2Nyb3dkXzM4NDB4MjE2MHA1MGYyX2dvcDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTk4MzMwLHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zOTQ4OTYwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTk4MzMwLHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zOTQ4OTYwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L2dvcC9jcm93ZF8zODQweDIxNjBwNTAvY3Jvd2RfMzg0MHgyMTYwcDUwZjJfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTgzMzIsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM5NDg5NjAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTgzMzIsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM5NDg5NjAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmM19nb3AyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIyNjIwOSx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzAwMzI5MjgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIyNjIwOSx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzAwMzI5MjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9nb3AvY3Jvd2RfMzg0MHgyMTYwcDUwL2Nyb3dkXzM4NDB4MjE2MHA1MGYzX2dvcDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjI2MjA5LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zMDAzMjkyOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjI2MjA5LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zMDAzMjkyOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L2dvcC9jcm93ZF8zODQweDIxNjBwNTAvY3Jvd2RfMzg0MHgyMTYwcDUwZjNfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMjYyMTEsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMwMDMyOTI4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMjYyMTEsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMwMDMyOTI4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmNF9nb3AyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI0MzQyNCx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjQyNDUwMDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI0MzQyNCx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjQyNDUwMDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9nb3AvY3Jvd2RfMzg0MHgyMTYwcDUwL2Nyb3dkXzM4NDB4MjE2MHA1MGY0X2dvcDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjQ3MzAyLHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNDYzMjgwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjQ3MzAyLHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNDYzMjgwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L2dvcC9jcm93ZF8zODQweDIxNjBwNTAvY3Jvd2RfMzg0MHgyMTYwcDUwZjRfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yNDczMDQsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI0NjMyODAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yNDczMDQsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI0NjMyODAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmNV9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI3MzI2Mix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjE3ODIwODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI3MzI2Mix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjE3ODIwODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9nb3AvY3Jvd2RfMzg0MHgyMTYwcDUwL2Nyb3dkXzM4NDB4MjE2MHA1MGY1X2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjczMjY0LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMTc4MjA4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjczMjY0LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMTc4MjA4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L2dvcC9jcm93ZF8zODQweDIxNjBwNTAvY3Jvd2RfMzg0MHgyMTYwcDUwZjZfZ29wNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yOTY4MzQsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5NzIyNDAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yOTY4MzQsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5NzIyNDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmNl9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI4ODIwNCx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTkxNDc0NjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI4ODIwNCx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTkxNDc0NjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9nb3AvY3Jvd2RfMzg0MHgyMTYwcDUwL2Nyb3dkXzM4NDB4MjE2MHA1MGY3X2dvcDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzE2MjMwLHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xODAxMjU2OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzE2MjMwLHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xODAxMjU2OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L2dvcC9jcm93ZF8zODQweDIxNjBwNTAvY3Jvd2RfMzg0MHgyMTYwcDUwZjdfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMTQ0MTEsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3OTA5NDI0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMTQ0MTEsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3OTA5NDI0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvZ29wL2Nyb3dkXzM4NDB4MjE2MHA1MC9jcm93ZF8zODQweDIxNjBwNTBmOF9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMzNDIxNSx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTY2NTk2NDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMzNDIxNSx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTY2NTk2NDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9nb3AvY3Jvd2RfMzg0MHgyMTYwcDUwL2Nyb3dkXzM4NDB4MjE2MHA1MGY4X2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzI3MTQwLHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNjMwNzAwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzI3MTQwLHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNjMwNzAwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L2dvcC9jcm93ZF8zODQweDIxNjBwNTAvY3Jvd2RfMzg0MHgyMTYwcDUwZjlfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTczMDUsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE1ODM1NjAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTczMDUsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE1ODM1NjAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvZ29wL2Nyb3dkXzY0MHgzNjBwNTAvY3Jvd2RfNjQweDM2MHA1MGYxMF9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI2NDgyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTAxODcyMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjY0ODIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMDE4NzIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvZ29wL2Nyb3dkXzY0MHgzNjBwNTAvY3Jvd2RfNjQweDM2MHA1MGYxMl9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI4NjAyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTE4ODAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yODYwMix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTkxODgwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L2dvcC9jcm93ZF82NDB4MzYwcDUwL2Nyb3dkXzY0MHgzNjBwNTBmMTNfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yOTY3NSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTg4MDc2OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mjk2NzUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04ODA3NjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9nb3AvY3Jvd2RfNjQweDM2MHA1MC9jcm93ZF82NDB4MzYwcDUwZjE0X2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzAyMTgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04MzMyNTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMwMjE4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9ODMzMjU2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvZ29wL2Nyb3dkXzY0MHgzNjBwNTAvY3Jvd2RfNjQweDM2MHA1MGYxNV9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMxNTY5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9ODEzNjI0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMTU2OSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTgxMzYyNCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L2dvcC9jcm93ZF82NDB4MzYwcDUwL2Nyb3dkXzY0MHgzNjBwNTBmMTZfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMTQ4OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTc2MDY0OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzE0ODgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03NjA2NDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9nb3AvY3Jvd2RfNjQweDM2MHA1MC9jcm93ZF82NDB4MzYwcDUwZjFfZ29wMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMjU5OSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTM5NjgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEyNTk5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05Mzk2OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L2dvcC9jcm93ZF82NDB4MzYwcDUwL2Nyb3dkXzY0MHgzNjBwNTBmMV9nb3AyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEyNjA5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05NDA0OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTI2MDksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0xLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTk0MDQ4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvZ29wL2Nyb3dkXzY0MHgzNjBwNTAvY3Jvd2RfNjQweDM2MHA1MGYxX2dvcDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTI2MDksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0xLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTk0MDQ4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMjYwOSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTQwNDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9nb3AvY3Jvd2RfNjQweDM2MHA1MC9jcm93ZF82NDB4MzYwcDUwZjFfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMjYxMCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTQwNDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEyNjEwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05NDA0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L2dvcC9jcm93ZF82NDB4MzYwcDUwL2Nyb3dkXzY0MHgzNjBwNTBmMl9nb3AxLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1Mzk5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjkwMzYwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTUzOTksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yOTAzNjAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvZ29wL2Nyb3dkXzY0MHgzNjBwNTAvY3Jvd2RfNjQweDM2MHA1MGYyX2dvcDIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTU0MDksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yOTA1NjAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTQwOSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI5MDU2MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9nb3AvY3Jvd2RfNjQweDM2MHA1MC9jcm93ZF82NDB4MzYwcDUwZjJfZ29wNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTQwOSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI5MDU2MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1NDA5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjkwNTYwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L2dvcC9jcm93ZF82NDB4MzYwcDUwL2Nyb3dkXzY0MHgzNjBwNTBmMl9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1NDEwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjkwNTYwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTU0MTAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yOTA1NjAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvZ29wL2Nyb3dkXzY0MHgzNjBwNTAvY3Jvd2RfNjQweDM2MHA1MGYzX2dvcDIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTcyNjgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMTc0MjY0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzI2OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIxNzQyNjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9nb3AvY3Jvd2RfNjQweDM2MHA1MC9jcm93ZF82NDB4MzYwcDUwZjNfZ29wNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzI2OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIxNzQyNjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3MjY4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjE3NDI2NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L2dvcC9jcm93ZF82NDB4MzYwcDUwL2Nyb3dkXzY0MHgzNjBwNTBmM19nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3MjY5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjE3NDI2NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTcyNjksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMTc0MjY0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvZ29wL2Nyb3dkXzY0MHgzNjBwNTAvY3Jvd2RfNjQweDM2MHA1MGY0X2dvcDIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg1NTMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzU4MDAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODU1Myx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3NTgwMDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9nb3AvY3Jvd2RfNjQweDM2MHA1MC9jcm93ZF82NDB4MzYwcDUwZjRfZ29wNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODY0Mix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3NjY4OTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4NjQyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTc2Njg5NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L2dvcC9jcm93ZF82NDB4MzYwcDUwL2Nyb3dkXzY0MHgzNjBwNTBmNF9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4NjQzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTc2Njg5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg2NDMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzY2ODk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvZ29wL2Nyb3dkXzY0MHgzNjBwNTAvY3Jvd2RfNjQweDM2MHA1MGY1X2dvcDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTk5MDcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNTEzNzYwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTkwNyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE1MTM3NjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9nb3AvY3Jvd2RfNjQweDM2MHA1MC9jcm93ZF82NDB4MzYwcDUwZjVfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTkwOCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE1MTM3NjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE5OTA4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTUxMzc2MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L2dvcC9jcm93ZF82NDB4MzYwcDUwL2Nyb3dkXzY0MHgzNjBwNTBmNl9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIxMTUyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM0MzY2NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjExNTIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzQzNjY0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvZ29wL2Nyb3dkXzY0MHgzNjBwNTAvY3Jvd2RfNjQweDM2MHA1MGY2X2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjA1NTgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzA0NTI4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMDU1OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzMDQ1MjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9nb3AvY3Jvd2RfNjQweDM2MHA1MC9jcm93ZF82NDB4MzYwcDUwZjdfZ29wNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMjE1Nix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEyMDg0MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIyMTU2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTIwODQwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L2dvcC9jcm93ZF82NDB4MzYwcDUwL2Nyb3dkXzY0MHgzNjBwNTBmN19nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIxOTM2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTE5NjY4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjE5MzYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMTk2NjgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvZ29wL2Nyb3dkXzY0MHgzNjBwNTAvY3Jvd2RfNjQweDM2MHA1MGY4X2dvcDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjMxMzEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMTA1NDk2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMzEzMSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTExMDU0OTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9nb3AvY3Jvd2RfNjQweDM2MHA1MC9jcm93ZF82NDB4MzYwcDUwZjhfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMjU4NSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEwNzkzNDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIyNTg1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTA3OTM0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L2dvcC9jcm93ZF84NTR4NDgwcDUwL2Nyb3dkXzg1NHg0ODBwNTBmMTFfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02NjIwMix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNzAwMDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTY2MjAyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM3MDAwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L2dvcC9jcm93ZF84NTR4NDgwcDUwL2Nyb3dkXzg1NHg0ODBwNTBmMTJfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02ODQ4NSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyNDgyMDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTY4NDg1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjI0ODIwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L2dvcC9jcm93ZF84NTR4NDgwcDUwL2Nyb3dkXzg1NHg0ODBwNTBmMTNfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03MTUxMSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIxNjgwMDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTcxNTExLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjE2ODAwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L2dvcC9jcm93ZF84NTR4NDgwcDUwL2Nyb3dkXzg1NHg0ODBwNTBmMTRfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03MjUxOSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwNDE4MjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTcyNTE5LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjA0MTgyNCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L2dvcC9jcm93ZF84NTR4NDgwcDUwL2Nyb3dkXzg1NHg0ODBwNTBmMTVfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03NjI2MCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwMDUzNjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTc2MjYwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjAwNTM2MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L2dvcC9jcm93ZF84NTR4NDgwcDUwL2Nyb3dkXzg1NHg0ODBwNTBmMTZfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03NjMwNCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE4ODEwMjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTc2MzA0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTg4MTAyNCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L2dvcC9jcm93ZF84NTR4NDgwcDUwL2Nyb3dkXzg1NHg0ODBwNTBmMV9nb3AxLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMwMTA2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzQwMjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMwMTA2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzQwMjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9nb3AvY3Jvd2RfODU0eDQ4MHA1MC9jcm93ZF84NTR4NDgwcDUwZjFfZ29wMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMDExNyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM0MTA0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMDExNyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTEscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM0MTA0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvZ29wL2Nyb3dkXzg1NHg0ODBwNTAvY3Jvd2RfODU0eDQ4MHA1MGYxX2dvcDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzAxMTcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0xLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNDEwNCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzAxMTcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0xLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNDEwNCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L2dvcC9jcm93ZF84NTR4NDgwcDUwL2Nyb3dkXzg1NHg0ODBwNTBmMV9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMwMTE4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzQxMDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMwMTE4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9MSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzQxMDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9nb3AvY3Jvd2RfODU0eDQ4MHA1MC9jcm93ZF84NTR4NDgwcDUwZjJfZ29wMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNjMzNSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTcwOTA4MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM2MzM1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzA5MDgwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L2dvcC9jcm93ZF84NTR4NDgwcDUwL2Nyb3dkXzg1NHg0ODBwNTBmMl9nb3AyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM2MzQ2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzA5MjgwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzYzNDYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03MDkyODAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvZ29wL2Nyb3dkXzg1NHg0ODBwNTAvY3Jvd2RfODU0eDQ4MHA1MGYyX2dvcDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzYzNDYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03MDkyODAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNjM0Nix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTcwOTI4MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9nb3AvY3Jvd2RfODU0eDQ4MHA1MC9jcm93ZF84NTR4NDgwcDUwZjJfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNjM0Nyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTcwOTI4MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM2MzQ3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzA5MjgwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L2dvcC9jcm93ZF84NTR4NDgwcDUwL2Nyb3dkXzg1NHg0ODBwNTBmM19nb3AyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQxMTc3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTM2MjAwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDExNzcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01MzYyMDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvZ29wL2Nyb3dkXzg1NHg0ODBwNTAvY3Jvd2RfODU0eDQ4MHA1MGYzX2dvcDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDExNzcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01MzYyMDAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MTE3Nyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTUzNjIwMDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9nb3AvY3Jvd2RfODU0eDQ4MHA1MC9jcm93ZF84NTR4NDgwcDUwZjNfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MTE3OCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTUzNjIwMDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQxMTc4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTM2MjAwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L2dvcC9jcm93ZF84NTR4NDgwcDUwL2Nyb3dkXzg1NHg0ODBwNTBmNF9nb3AyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQ0NTEyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDM1MzgwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDQ1MTIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MzUzODAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvZ29wL2Nyb3dkXzg1NHg0ODBwNTAvY3Jvd2RfODU0eDQ4MHA1MGY0X2dvcDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDQ4OTksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MzkyNDk2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00NDg5OSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQzOTI0OTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9nb3AvY3Jvd2RfODU0eDQ4MHA1MC9jcm93ZF84NTR4NDgwcDUwZjRfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00NDkwMCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQzOTI0OTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQ0OTAwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDM5MjQ5NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L2dvcC9jcm93ZF84NTR4NDgwcDUwL2Nyb3dkXzg1NHg0ODBwNTBmNV9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQ4MzQyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Mzc4ODQ4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDgzNDIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zNzg4NDgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvZ29wL2Nyb3dkXzg1NHg0ODBwNTAvY3Jvd2RfODU0eDQ4MHA1MGY1X2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDgzNDMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zNzg4NDgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00ODM0Myx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM3ODg0ODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9nb3AvY3Jvd2RfODU0eDQ4MHA1MC9jcm93ZF84NTR4NDgwcDUwZjZfZ29wNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01MTM3OCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMzNTg2NjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTUxMzc4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzM1ODY2NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L2dvcC9jcm93ZF84NTR4NDgwcDUwL2Nyb3dkXzg1NHg0ODBwNTBmNl9nb3A4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTUwNzkyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzMyMDA2NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTA3OTIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zMzIwMDY0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvZ29wL2Nyb3dkXzg1NHg0ODBwNTAvY3Jvd2RfODU0eDQ4MHA1MGY3X2dvcDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTM0MzUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yOTk1NzEyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01MzQzNSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI5OTU3MTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9nb3AvY3Jvd2RfODU0eDQ4MHA1MC9jcm93ZF84NTR4NDgwcDUwZjdfZ29wOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01NDYwMyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMwNjMzMTIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTU0NjAzLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzA2MzMxMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L2dvcC9jcm93ZF84NTR4NDgwcDUwL2Nyb3dkXzg1NHg0ODBwNTBmOF9nb3A0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTU1MzQzLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjcxNjA0OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTUzNDMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNzE2MDQ4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvZ29wL2Nyb3dkXzg1NHg0ODBwNTAvY3Jvd2RfODU0eDQ4MHA1MGY4X2dvcDgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTU1ODQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNzI5MjQ4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01NTU4NCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI3MjkyNDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9sZXZlbC9jcm93ZF8xMjgweDcyMHA1MGYzMl8yMDAwa2Jwc19sZXZlbF80LjAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTU2NDYyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5MzkxNjgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1NjQ2Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTM5MTY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvbGV2ZWwvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfODAwMGticHNfbGV2ZWxfNC4xLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTY2NTczNCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04MzA1MDcyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvbGV2ZWwvY3Jvd2RfMTI4eDk2cDUwZjMyXzIwMGticHNfbGV2ZWxfMi4wLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1NjU5LHdpZHRoPTEyOCxoZWlnaHQ9OTYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzkzNjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1NjU5LHdpZHRoPTEyOCxoZWlnaHQ9OTYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzkzNjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9sZXZlbC9jcm93ZF8xNzZ4MTQ0cDUwZjMyXzIwMGticHNfbGV2ZWxfMi4wLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2MDE3LHdpZHRoPTE3NixoZWlnaHQ9MTQ0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTgzNjMyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjAxNyx3aWR0aD0xNzYsaGVpZ2h0PTE0NCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE4MzYzMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L2xldmVsL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl80MDAwa2Jwc19sZXZlbF80LjEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzAwNTk1LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zNzQwODMyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMDA1OTUsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM3NDA4MzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9sZXZlbC9jcm93ZF8xOTIweDEwODhwNTBmMzJfMTAwMDBrYnBzX2xldmVsXzUuMC5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03MjU2MTMsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4OCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTkwNTM1NjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9sZXZlbC9jcm93ZF8zNTJ4Mjg4cDUwZjMyXzMwMGticHNfbGV2ZWxfMi4xLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI0NTA3LHdpZHRoPTM1MixoZWlnaHQ9Mjg4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Mjg5NzQ0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yNDUwNyx3aWR0aD0zNTIsaGVpZ2h0PTI4OCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI4OTc0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L2xldmVsL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl8xMjAwMGticHNfbGV2ZWxfNS4xLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTg5MDY5Mix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTExMTczNDQscGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTIzNDAzLDQ5ICsyMzQwMyw0OSBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzgxNTI4LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjI1MjgwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L2xldmVsL2Nyb3dkXzY0MHg0ODBwNTBmMzJfNTAwa2Jwc19sZXZlbF8zLjAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDI5NTksd2lkdGg9NjQwLGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01MjA0MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQyOTU5LHdpZHRoPTY0MCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTIwNDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvbGV2ZWwvY3Jvd2RfNjR4NjRwNTBmMzJfMjAwa2Jwc19sZXZlbF8xLjAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA0Mjcsd2lkdGg9NjQsaGVpZ2h0PTY0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTE0OTYwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDQyNyx3aWR0aD02NCxoZWlnaHQ9NjQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMTQ5NjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9sZXZlbC9jcm93ZF82NHg2NHA1MGYzMl8yMDBrYnBzX2xldmVsXzIuMC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNDY3MSx3aWR0aD02NCxoZWlnaHQ9NjQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNjgwMDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE0NjcxLHdpZHRoPTY0LGhlaWdodD02NCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE2ODAwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L2xldmVsL2Nyb3dkXzcyMHg0ODBwNTBmMzJfNjAwa2Jwc19sZXZlbF8zLjEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTAyODksd2lkdGg9NzIwLGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02MTIwMjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTUwMjg5LHdpZHRoPTcyMCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NjEyMDI0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvbGV2ZWwvY3Jvd2RfNzIweDU3NnA1MGYzMl82MDBrYnBzX2xldmVsXzMuMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01MTk0Nix3aWR0aD03MjAsaGVpZ2h0PTU3NixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTYzMjczNixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTE5NDYsd2lkdGg9NzIwLGhlaWdodD01NzYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02MzI3MzYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfMTAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT04MTQ2NSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMDAxNzM2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT04MTQ2NSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMDAxNzM2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyXzEwbWJwcy5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT04MzU3Mjgsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTA0MzAwMjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfMW1icHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9ODkzODcsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTEwMDc2MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9ODkzODcsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTEwMDc2MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl8yMG1icHMubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTY5NDA0Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMTE1ODk0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl80bWJwc19hZGFwdGl2ZXFwMC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNjQ5MTAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDU0NDgwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzY0OTEwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ1NDQ4MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfNG1icHNfYWRhcHRpdmVxcDIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU3OTE2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0NTczNjgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NzkxNix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDU3MzY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyXzRtYnBzX3FwZzE2Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM2NjIyMix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NTYxMjAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNjYyMjIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDU2MTIwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl80bWJwc19xcGc2NC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTg5NTksd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQ3MDQwOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU4OTU5LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0NzA0MDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfNG1icHNfcXBnOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNjk0MjAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDYwMTE2OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzY5NDIwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ2MDExNjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfNTAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT04MDcyNyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05OTI1MTIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTgwNzI3LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTk5MjUxMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl81bWJwcy5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MDkzMjUsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTA5OTk4NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMjM0NTcsNDMgKzIzNDU3LDQzIEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTk0MDY0OCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMTc0NDYyNCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9hbXAwLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NjYyMyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDQxMjA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTY2MjMsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQ0MTIwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9hbXAxLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NjYyMyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDQxMjA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTY2MjMsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQ0MTIwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9hdWQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU2NjIwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0NDExNjgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NjYyMCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDQxMTY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2JfYWRhcHRfMC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMzA3MDUsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDExNzgzMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzMwNzA1LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQxMTc4MzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfYl9hZGFwdF8xLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM5NzU5Nix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00OTUzMzY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2JldGEwLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NjYyMyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDQxMjA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTY2MjMsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQ0MTIwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9iZXRhNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTY0NDEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQzODkyMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU2NDQxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0Mzg5MjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfYmV0YTYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU2OTczLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0NDU1NjgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1Njk3Myx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDQ1NTY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2JldGE2X3RjbTYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU2MDM0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0MzM4MjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NjAzNCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDMzODI0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2JldGFtNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTY2Mjcsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQ0MTI0OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU2NjI3LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0NDEyNDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfYmV0YW02Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1Nzk3MCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDU4MDMyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTc5NzAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQ1ODAzMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9iZXRhbTZfdGM2Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NzMzMix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDUwMDQ4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTczMzIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQ1MDA0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9jbnN0cm5faW50cmEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzYxNTc1LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ1MDMxMTIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM2MTU3NSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NTAzMTEyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2NyYTE2Lm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM4NjY3Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00ODE2MDA4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0yMzUwMiwxMDkgKzIzNTAyLDEwOSBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTM0Mjg3OCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTE3Njk0MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfY3JmNTEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mjk2MzMsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzUzODMyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yOTYzMyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zNTM4MzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfY3RiMTYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU3MTExLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0NDczMjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NzExMSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDQ3MzIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2N0YjMyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1MjI1Myx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00Mzg2NjAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTIyNTMsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDM4NjYwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mYXN0ZGVjb2RlLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NTk0Nix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDMyNzQ0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTU5NDYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQzMjc0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mYXN0ZXIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzExMjM5LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM4NzQ1MTIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMxMTIzOSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zODc0NTEyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2Zhc3QubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzIxMjA5LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM5OTkxMzYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMyMTIwOSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zOTk5MTM2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2dyYWluLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTU3NjQwMix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03MTg4NDQ4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2hhc2hfY2hrc3VtLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NzMyNyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDUwMDA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTczMjcsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQ1MDAwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9oYXNoX2NyYy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTcxMzUsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQ0NzYwOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU3MTM1LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0NDc2MDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfaGFzaF9tZDUubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU4NDc5LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0NjQ0MDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1ODQ3OSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDY0NDA4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2hyZC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTY2MjMsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQ0MTIwOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU2NjIzLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0NDEyMDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfaWRyMTYubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzkxNjI2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ4Nzg2OTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfaW50cmFtaW51czEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU2NjMyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0NDEzMjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NjYzMix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDQxMzIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2xvc3NsZXNzLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM5Mzg2NTk3LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ5MjMxNTg4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9tYXhfbG9nMnBvY18xMC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTY2MzEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQ0MTMxMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU2NjMxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0NDEzMTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbWF4X2xvZzJwb2NfMTYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU2NjU1LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0NDE2MDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NjY1NSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDQxNjA4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX21heF9sb2cycG9jXzQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU2NjIxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0NDEyMDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NjYyMSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDQxMjAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX21heF9sb2cycG9jXzUubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU2NjIxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0NDEyMDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NjYyMSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDQxMjAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX21heF9sb2cycG9jXzYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU2NjIxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0NDEyMDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NjYyMSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDQxMjAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX21heHR1MTYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU3MjY5LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0NDkyOTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NzI2OSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDQ5Mjk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX21heHR1NC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMzMzNTAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDE1MDMxMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzMzMzUwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQxNTAzMTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbWF4dHU4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NzIzNCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDQ4ODU2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTcyMzQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQ0ODg1NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9tZWRpdW0ubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU2NjIzLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0NDEyMDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NjYyMyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDQxMjA4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX21lcmdlMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNjQ1OTksd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDU0MDkxMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzY0NTk5LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ1NDA5MTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbWVyZ2UzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NjUyNyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDQwMDA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTY1Mjcsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQ0MDAwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9tZXJnZTQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzUzODA3LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0MDYwMDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1MzgwNyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDA2MDA4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX21lcmdlNS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTM3MDMsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQwNDcxMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzUzNzAzLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0MDQ3MTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbWluY3UxNi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNjk2NTcsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDYwNDEzNixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzY5NjU3LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ2MDQxMzYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbWluY3UzMi5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MjMwMzQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTI3MTMzNixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub2RibGsubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU3NzI3LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0NTUwMDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NzcyNyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDU1MDA4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vX3Bwc19xcF9vcHQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU2NjI2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0NDEyNDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NjYyNix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDQxMjQ4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vX3Bwc19yZWZsaXN0X29wdC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTY2MjYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQ0MTI0OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU2NjI2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0NDEyNDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9fdnVpX2hyZC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTY2MjYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQ0MTI0OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU2NjI2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0NDEyNDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfcGxhY2Viby5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNjk0MzUsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDYwMTMzNixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzY5NDM1LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ2MDEzMzYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfcHJvZmlsZW5vbmUubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU2NjIwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0NDExNjgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NjYyMCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDQxMTY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX3BzbnIubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTkzNTY5LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTc0MDMwNDgscGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTIzNjIyLDE0NSArMjM2MjIsMTQ1IEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI2NTg1MTgxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMzMjI5ODE4NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9xcDUwLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMwMzA4LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM2MjI3MixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzAzMDgsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzYyMjcyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX3FwNTFjYm0xMmNybTEyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI3MTMyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMyMjU2OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjcxMzIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzIyNTY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX3FwNTEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjQ1NTUsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjkwMzYwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yNDU1NSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yOTAzNjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfcmVjdDAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU2NjIzLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0NDEyMDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NjYyMyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDQxMjA4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX3JwdF9oZHJzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NjYyMCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDQxMTY4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTY2MjAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQ0MTE2OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9zYW8wLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NDk4MCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDIwNjcyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTQ5ODAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQyMDY3MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9zYmgxLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NjYyMyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDQxMjA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTY2MjMsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQ0MTIwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9zbG93ZXIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU4NzgzLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0NjgyMDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1ODc4Myx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDY4MjAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX3Nsb3cubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzM5NTcwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQyMjgwNDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMzOTU3MCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MjI4MDQ4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX3NybmcwLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTUzMDYzMSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02NjE2MzEyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX3NybmczMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTYyNjcsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQzNjc2MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU2MjY3LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0MzY3NjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfc3JuZzY0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NjY5MSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDQyMDU2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTY2OTEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQ0MjA1NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9zcm5nOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTc5OTQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQ1ODM0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU3OTk0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0NTgzNDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfc3NpbS5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01NTAzMTUsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Njg2MjM2OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9zdHJuZ2ludHJhMC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTY1ODksd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQ0MDc4NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU2NTg5LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0NDA3ODQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfc3VwZXJmYXN0Lm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTUzNjY3MSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02NjkxODI0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX3RjNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTc0MjUsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQ1MTIyNCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU3NDI1LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0NTEyMjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfdGM2Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NzIxNCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDQ4NTg0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTcyMTQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQ0ODU4NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl90Y200Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NzA5MCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDQ3MDMyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTcwOTAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQ0NzAzMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl90Y202Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1ODI2Nyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDYxNzQ0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTgyNjcsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQ2MTc0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl90bXBfbHlycy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTY2Mjcsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQ0MTE2OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU2NjI3LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0NDExNjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfdG12cDAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU4NDIwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0NjM2NzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1ODQyMCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDYzNjcyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX3R1aW50ZXJkZXB0aDIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzYyNzg5LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ1MTgyODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM2Mjc4OSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NTE4MjgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX3R1aW50ZXJkZXB0aDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU4MjcxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0NjE4MDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1ODI3MSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDYxODA4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX3R1aW50cmFkZXB0aDIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU2MjQwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0MzY0MjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NjI0MCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDM2NDI0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX3R1aW50cmFkZXB0aDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU4MzczLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0NjMwODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1ODM3Myx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDYzMDgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX3R1bGltaXQyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NjYyMyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDQxMjA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTY2MjMsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQ0MTIwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl90dWxpbWl0NC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTY2MjMsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQ0MTIwOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU2NjIzLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0NDEyMDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfdWx0cmFmYXN0Lm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTUwMjIwMCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02MjYwOTIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX3ZlcnlmYXN0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMxMTUzNCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zODc4MjAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMTE1MzQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Mzg3ODIwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl92ZXJ5c2xvdy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTUwNzUsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQyMTg0OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU1MDc1LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0MjE4NDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfdnVpX2NvbG9yX21hdHJpeC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTY2MjYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQ0MTIwOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU2NjI2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0NDEyMDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfdnVpX2NvbG9yX3ByaW1fYnQyMDIwLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NjYyNix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDQxMjA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTY2MjYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQ0MTIwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl92dWlfY29sb3JfcHJpbV9idDcwOS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTY2MjYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQ0MTIwOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU2NjI2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0NDEyMDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfdnVpX3RyYW5zZmVyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NjYyNix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDQxMjA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTY2MjYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQ0MTIwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl93ZWlnaHRiMHdlaWdodHAxLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NjYyMyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDQxMjA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTY2MjMsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQ0MTIwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl93ZWlnaHRiMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTY0ODUsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQzOTQ4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU2NDg1LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0Mzk0ODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfd2VpZ2h0cDAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU2NjIzLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0NDEyMDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NjYyMyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDQxMjA4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX3dlaWdodHAwd2VpZ2h0YjEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU2NDczLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0MzkzMzYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NjQ3Myx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDM5MzM2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX3dwcDEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU1MjkxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0MjQ1NjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NTI5MSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDI0NTYwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX3plcm9sYXRlbmN5Lm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQxODU2Nyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01MjE5MzY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfMTAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTcwMTksd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5NDYxNjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1NzAxOSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTk0NjE2MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyXzEwbWJwcy5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03MjU2MzAsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTkwNTM4MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl8xbWJwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTY0MTUsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5Mzg2MDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1NjQxNSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTkzODYwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyXzIwbWJwcy5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNDY3NTk0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xODMyODM0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyXzRtYnBzX2FkYXB0aXZlcXAwLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMyNTg5MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDA1NzA1NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzI1ODkxLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MDU3MDU2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfNG1icHNfYWRhcHRpdmVxcDIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzIzNzU4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MDMwNDAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMjM3NTgsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQwMzA0MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl80bWJwc19xcGcxNi5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02OTczMDcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTg2OTk3NjAscGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTIzNzcyLDEwICsyMzc3MiwxMCBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03MDk0MTQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTg4NTEwOTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl81MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1NzEyNSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTk0NzQ4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTU3MTI1LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTQ3NDgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfNW1icHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzY4MjcyLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NTg2ODI0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNjgyNzIsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ1ODY4MjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9hbGxpZHIubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTU5MDA1NCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTk4NjMyMDgscGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTIzODI5LDcgKzIzODI5LDcgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mzk2ODkxOTYsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ5NjA5ODM2OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2NyZjUxLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTY2MDI2LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04MDg3NDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTY2MDI2LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04MDg3NDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9jdGIxNi5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02ODg4MTcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTg1OTM2NDgscGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTIzOTQ5LDEzICsyMzk0OSwxMyBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02NTE2NDA3MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9ODE0NTM0MzEyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfcXA1MC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02NTg4MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9ODA2OTM2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02NTg4MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9ODA2OTM2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfcXA1MWNibTEyY3JtMTIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTg5Nzcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTcyMDYzMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTg5Nzcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTcyMDYzMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX3FwNTEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTMyOTIsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTY0OTU2OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTMyOTIsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTY0OTU2OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX3JlY3QwLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTY3ODI1MCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9ODQ2MTU0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMjQxNjUsNyArMjQxNjUsNyBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMTY3MTAyNTIsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8zODQweDIxNjBwNTBmMzIvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyX2NyZjUxLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI0MzIwNyx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzAyMzgwOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjQzMjA3LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zMDIzODA4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMi9jcm93ZF8zODQweDIxNjBwNTBmMzJfY3RiMzIubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc0NTg4Nix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjE4MDcyOTYscGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTI0MzEyLDcgKzI0MzEyLDcgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDEzMjM5NzE1LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04NzA1MTI4NjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl9xcDUxY2JtMTJjcm0xMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMTM1OTIsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI2NTM2MjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIxMzU5Mix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjY1MzYyNCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8zODQweDIxNjBwNTBmMzIvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyX3JlY3QwLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3NjE0OTksd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMDAyNDU2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0yNDQyMywxOTYgKzI0NDIzLDE5NiBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMzAyMDYwLHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yODc2MzAyNCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfMTAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yNjg4NSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMxOTQ5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjY4ODUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zMTk0OTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyXzEwbWJwcy5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03ODg1NTUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05ODQwMzY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl8xbWJwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03NTU1Nyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTkyNzg5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NzU1NTcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05Mjc4OTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyXzIwbWJwcy5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTg0NzQzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTk3OTI3MjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyXzRtYnBzX2FkYXB0aXZlcXAwLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMzMjk5NCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQxNDU4NTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMzMjk5NCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQxNDU4NTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyXzRtYnBzX2FkYXB0aXZlcXAyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMyOTU0NSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQxMDI3NDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMyOTU0NSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQxMDI3NDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyXzRtYnBzX3FwZzE2Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExMzEwNyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzOTcyNzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExMzEwNyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzOTcyNzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyXzRtYnBzX3FwZzY0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExMTQ1Myx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNzY2MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExMTQ1Myx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNzY2MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyXzRtYnBzX3FwZzgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTExNzU0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM4MDM2MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTExNzU0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM4MDM2MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfNTAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MTQ1NSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTUwMTYyNCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDE0NTUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01MDE2MjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyXzVtYnBzLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM5MDI2Nyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ4NjE3NjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2FsbGlkci5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yODkyNTQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zNjAzMjI0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yODkyNTQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zNjAzMjI0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9hbHRpZHIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzA0OTYxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Mzc5ODU0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzA0OTYxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Mzc5ODU0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfYW1wMC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDk5NTIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzU3ODMyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDk5NTIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzU3ODMyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9hbXAxLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwOTk1Mix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNTc4MzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwOTk1Mix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNTc4MzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2F1ZC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDk5NDksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzU3ODAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDk5NDksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzU3ODAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9iX2FkYXB0XzAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9OTY4MDQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMTk0MDgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT05NjgwNCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTExOTQwODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2JfYWRhcHRfMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMjIzNjQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNTEyOTg0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMjIzNjQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNTEyOTg0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9iZXRhMC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDk5NTIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzU3ODMyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDk5NTIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzU3ODMyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9iZXRhNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDk4MDgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzU2MDI0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDk4MDgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzU2MDI0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9iZXRhNi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTAwNzYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzU5MzY4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTAwNzYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzU5MzY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9iZXRhNl90Y202Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExMDI3Nix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNjE4NTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExMDI3Nix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNjE4NTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2JldGFtNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTAwOTMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzU5NTg0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTAwOTMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzU5NTg0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9iZXRhbTYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTEwMTk0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM2MDg0OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTEwMTk0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM2MDg0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfYmV0YW02X3RjNi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTAyNjUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzYxNzIwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTAyNjUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzYxNzIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9jbnN0cm5faW50cmEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTEwNTAyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM2NDcxMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTEwNTAyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM2NDcxMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfY3JhMTYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE5Mzg4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ3NDk2OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE5Mzg4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ3NDk2OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfY3JmMC5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTA1MDQ4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDM3OTY1MzYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2NyZjUxLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTk0OTIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMDIwODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTk0OTIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMDIwODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2N0YjE2Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExMTY3OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNzk0MDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExMTY3OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNzk0MDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2N0YjMyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExMDYwMix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNjU5NjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExMDYwMix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNjU5NjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2Zhc3RkZWNvZGUubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTEwMzM0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM2MjYwOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTEwMzM0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM2MjYwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZmFzdGVyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTkxNTQ5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTEyODQwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9OTE1NDksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMTI4NDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mYXN0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTk0MTc4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTE2MTI1NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9OTQxNzgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMTYxMjU2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ncmFpbi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODI2MDcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjY2MDI0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODI2MDcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjY2MDI0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9oYXNoX2Noa3N1bS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTA2NTYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzY2NjMyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTA2NTYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzY2NjMyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9oYXNoX2NyYy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTA0NjQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzY0MjMyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTA0NjQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzY0MjMyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9oYXNoX21kNS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTE4MDgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzgxMDMyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTE4MDgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzgxMDMyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ocmQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA5OTUyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM1NzgzMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA5OTUyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM1NzgzMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfaWRyMTYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTIxMzY5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTUwMDQ5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTIxMzY5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTUwMDQ5NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfaW50cmFtaW51czEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA5OTYxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM1Nzk0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA5OTYxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM1Nzk0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbG9zc2xlc3MubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9ODg5MTQ1OSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTExMTEyNjY3MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbWF4X2xvZzJwb2NfMTAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA5OTYxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM1Nzk0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA5OTYxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM1Nzk0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbWF4X2xvZzJwb2NfMTYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA5OTg0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM1ODIzMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA5OTg0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM1ODIzMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbWF4X2xvZzJwb2NfNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDk5NDcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzU3NzY4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDk5NDcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzU3NzY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9tYXhfbG9nMnBvY181Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwOTk0Nyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNTc3NjgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwOTk0Nyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNTc3NjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX21heF9sb2cycG9jXzYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA5OTQ3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM1Nzc2OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA5OTQ3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM1Nzc2OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbWF4dHUxNi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTEwNTMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzcxNjAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTEwNTMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzcxNjAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9tYXh0dTQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTAzODU0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTI4MTYwOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTAzODU0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTI4MTYwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbWF4dHU4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExMDc2Nix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNjgwMDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExMDc2Nix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNjgwMDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX21lZGl1bS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDk5NTIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzU3ODMyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDk5NTIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzU3ODMyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9tZXJnZTEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTExODMzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM4MTM0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTExODMzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM4MTM0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbWVyZ2UzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwOTg3NSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNTY4NzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwOTg3NSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNTY4NzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX21lcmdlNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDkwNjUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzQ2NzQ0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDkwNjUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzQ2NzQ0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9tZXJnZTUubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA5Mjg0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM0OTQ4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA5Mjg0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM0OTQ4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbWluY3UxNi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTg2MDIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDY1OTQ0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTg2MDIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDY1OTQ0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9taW5jdTMyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEzMjc4Nyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE2NDMyNDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEzMjc4Nyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE2NDMyNDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vZGJsay5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTA1Nzgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzY1NjU2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTA1Nzgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzY1NjU2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub19wcHNfcXBfb3B0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwOTk1NSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNTc4NzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwOTk1NSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNTc4NzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vX3Bwc19yZWZsaXN0X29wdC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDk5NTUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzU3ODcyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDk5NTUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzU3ODcyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub192dWlfaHJkLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwOTk1NSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNTc4NzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwOTk1NSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNTc4NzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3BsYWNlYm8ubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE0NzQ4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQxNzc2MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE0NzQ4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQxNzc2MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfcHJvZmlsZW5vbmUubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA5OTQ5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM1NzgwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA5OTQ5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM1NzgwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfcHNuci5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMDExOTcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNDk4NDA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMDExOTcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNDk4NDA4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9xcDAubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9ODA4NDE0Nix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEwMTAzNTI1NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMjQ2MjcsMTU3ICsyNDYyNywxNTcgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTk1OTYzNyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTc0NDc4ODk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9xcDUwLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTkzMzIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMDAwODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTkzMzIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMDAwODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3FwNTFjYm0xMmNybTEyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTg1NDAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05MDE4NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9ODU0MCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTkwMTg0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9xcDUxLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTgxOTIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04NTgzMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9ODE5Mix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTg1ODMyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9yZWN0MC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDk5NTIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzU3ODMyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDk5NTIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzU3ODMyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ycHRfaGRycy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDk5NDksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzU3ODAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDk5NDksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzU3ODAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9zYW8wLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwOTU4NSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNTMyNDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwOTU4NSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNTMyNDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3NiaDEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA5OTUyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM1NzgzMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA5OTUyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM1NzgzMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfc2xvd2VyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwOTM2OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNTA1MTIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwOTM2OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNTA1MTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3Nsb3cubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA0ODYwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTI5NDE4NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA0ODYwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTI5NDE4NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfc3JuZzAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTQ3OTUxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTgzMjgyNCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTQ3OTUxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTgzMjgyNCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfc3JuZzMyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwOTk1Mix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNTc4MzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwOTk1Mix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNTc4MzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3Nybmc2NC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDk5NTIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzU3ODMyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDk5NTIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzU3ODMyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9zcm5nOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTAwMTksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzU4NjcyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTAwMTksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzU4NjcyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9zc2ltLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3NzgyMix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMDYyMjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3NzgyMix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMDYyMjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3N0cm5naW50cmEwLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExMDQ1Mix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNjQwODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExMDQ1Mix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNjQwODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3N1cGVyZmFzdC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzU2MDAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMTc4NDMyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzU2MDAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMTc4NDMyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl90YzQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA5ODgwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM1NjkyMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA5ODgwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM1NjkyMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfdGM2Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExMDM3OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNjMxNDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExMDM3OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNjMxNDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3RjbTQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTEwMDcyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM1OTMyMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTEwMDcyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM1OTMyMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfdGNtNi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTAyMDcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzYxMDA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTAyMDcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzYxMDA4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl90bXBfbHlycy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDk5NTcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzU3ODAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDk5NTcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzU3ODAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl90bXZwMC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTA1NzMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzY1NjAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTA1NzMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzY1NjAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl90dWludGVyZGVwdGgyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExMjQxNyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzODg2NDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExMjQxNyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzODg2NDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3R1aW50ZXJkZXB0aDQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTExMzUzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM3NTMzNixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTExMzUzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM3NTMzNixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfdHVpbnRyYWRlcHRoMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTAzODQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzYzMjMyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTAzODQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzYzMjMyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl90dWludHJhZGVwdGg0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwOTUxMix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNTIzMjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwOTUxMix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNTIzMjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3R1bGltaXQyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwOTk1Mix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNTc4MzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwOTk1Mix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNTc4MzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3R1bGltaXQ0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwOTk1Mix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNTc4MzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwOTk1Mix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNTc4MzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3VsdHJhZmFzdC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjQxNDksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMDM1MjgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjQxNDksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMDM1MjgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl92ZXJ5ZmFzdC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT05MTM0NCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTExMjU4MzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTkxMzQ0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTEyNTgzMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfdmVyeXNsb3cubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA5MzAwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM0OTY1NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA5MzAwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM0OTY1NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfdnVpX2NvbG9yX21hdHJpeC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDk5NTYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzU3ODMyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDk5NTYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzU3ODMyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl92dWlfY29sb3JfcHJpbV9idDIwMjAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA5OTU2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM1NzgzMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA5OTU2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM1NzgzMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfdnVpX2NvbG9yX3ByaW1fYnQ3MDkubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA5OTU2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM1NzgzMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA5OTU2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM1NzgzMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfdnVpX3RyYW5zZmVyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwOTk1Nix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNTc4MzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwOTk1Nix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNTc4MzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3dlaWdodGIwd2VpZ2h0cDEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA5OTUyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM1NzgzMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA5OTUyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM1NzgzMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfd2VpZ2h0YjEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTEwMjIyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM2MTIwOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTEwMjIyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM2MTIwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfd2VpZ2h0cDAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA5OTUyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM1NzgzMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTA5OTUyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM1NzgzMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfd2VpZ2h0cDB3ZWlnaHRiMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTAyMDYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzYxMDA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTAyMDYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMzYxMDA4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl93cHAxLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwOTg4MSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNTY5NDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwOTg4MSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNTY5NDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3plcm9sYXRlbmN5Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEyOTg4MSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE2MTA4MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEyOTg4MSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE2MTA4MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyXzEwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDMxODUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01MjMyMzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQzMTg1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTIzMjMyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl8xMG1icHMubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9ODA0MzY5LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTAwMzgwMzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyXzFtYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTc3NTYyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTUyOTQ0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03NzU2Mix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTk1Mjk0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfMjBtYnBzLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2MjU3MzUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMDMwNTExMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfNG1icHNfYWRhcHRpdmVxcDAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzQzNTg1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDI3ODIzMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzQzNTg1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDI3ODIzMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfNG1icHNfYWRhcHRpdmVxcDIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzM4Nzc1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDIxODExMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzM4Nzc1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDIxODExMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfNG1icHNfcXBnMTYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTgyODM2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjI2ODg3MixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTgyODM2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjI2ODg3MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfNG1icHNfcXBnNjQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTgxMTA5LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjI0NzI4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTgxMTA5LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjI0NzI4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfNG1icHNfcXBnOC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODQ0NTgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjg5MTQ0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODQ0NTgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjg5MTQ0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl81MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQ2MzUxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTYyODA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00NjM1MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTU2MjgwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfNW1icHMubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mzk0ODAyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDkxODQ0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMjQ3ODksMTU3ICsyNDc4OSwxNTcgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDk1MjM2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NjE3Njk2OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfYW1wMC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzgwNzMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjA5MzM2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzgwNzMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjA5MzM2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9hbXAxLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3ODA3Myx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMDkzMzYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3ODA3Myx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMDkzMzYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2F1ZC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzgwNzAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjA5Mjk2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzgwNzAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjA5Mjk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9iX2FkYXB0XzAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTYzMTk0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjAyMzk0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTYzMTk0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjAyMzk0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfYl9hZGFwdF8xLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIwMjgxMyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI1MTg1ODQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIwMjgxMyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI1MTg1ODQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2JldGEwLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3ODA3Myx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMDkzMzYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3ODA3Myx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMDkzMzYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2JldGE0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3ODYwMix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMTU5MzYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3ODYwMix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMTU5MzYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2JldGE2Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3ODY4MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMTY5MjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3ODY4MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMTY5MjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2JldGE2X3RjbTYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc4ODMzLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIxODgwOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc4ODMzLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIxODgwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfYmV0YW00Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4MDI5MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMzcwNDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4MDI5MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMzcwNDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2JldGFtNi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzg0OTUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjE0NjAwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzg0OTUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjE0NjAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9iZXRhbTZfdGM2Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3OTEwNix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMjIyMjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3OTEwNix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMjIyMjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2Nuc3Rybl9pbnRyYS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODEwNzcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjQ2ODgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODEwNzcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjQ2ODgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9jcmExNi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTU2OTgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNDI4ODMyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTU2OTgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNDI4ODMyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9jcmYwLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTYyODkzMDEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03ODU5OTY4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfY3JmNTEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTUyMjAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzM2NzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1MjIwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTczNjcyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9jdGIxNi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODA5MjEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjQ0OTQ0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODA5MjEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjQ0OTQ0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9jdGIzMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzg4Njksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjE5MjgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzg4Njksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjE5MjgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mYXN0ZGVjb2RlLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3ODc1Mix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMTc4MjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3ODc1Mix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMTc4MjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2Zhc3Rlci5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTM2Njksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTA0ODgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTM2Njksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTA0ODgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mYXN0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1Nzk0OSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5NTgzODQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1Nzk0OSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5NTgzODQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2dyYWluLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI5OTg4Nix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM3MzIwMDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI5OTg4Nix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM3MzIwMDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2hhc2hfY2hrc3VtLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3ODc3Nyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMTgxMzYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3ODc3Nyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMTgxMzYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2hhc2hfY3JjLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3ODU4NSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMTU3MzYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3ODU4NSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMTU3MzYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2hhc2hfbWQ1Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3OTkyOSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMzI1MzYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3OTkyOSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMzI1MzYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2hyZC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzgwNzMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjA5MzM2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzgwNzMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjA5MzM2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9pZHIxNi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTkzNjMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNDc1NDA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTkzNjMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNDc1NDA4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9pbnRyYW1pbnVzMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzgwODIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjA5NDQ4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzgwODIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjA5NDQ4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9sb3NzbGVzcy5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjQ5OTY4MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwNjIyOTQzMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbWF4X2xvZzJwb2NfMTAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc4MDg4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIwOTUyMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc4MDg4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIwOTUyMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbWF4X2xvZzJwb2NfMTYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc4MTA1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIwOTczNixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc4MTA1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIwOTczNixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbWF4X2xvZzJwb2NfNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzgwNjQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjA5MjI0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzgwNjQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjA5MjI0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9tYXhfbG9nMnBvY181Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3ODA2NCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMDkyMjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3ODA2NCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMDkyMjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX21heF9sb2cycG9jXzYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc4MDY0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIwOTIyNCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc4MDY0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIwOTIyNCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbWF4dHUxNi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODAwODQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjM0NDcyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODAwODQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjM0NDcyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9tYXh0dTQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTcxNDIwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjEyNjE4NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTcxNDIwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjEyNjE4NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbWF4dHU4Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3OTk1OSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMzI5MTIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3OTk1OSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMzI5MTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX21lZGl1bS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzgwNzMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjA5MzM2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzgwNzMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjA5MzM2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9tZXJnZTEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTgxOTU0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjI1Nzg0OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTgxOTU0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjI1Nzg0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbWVyZ2UzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3OTA1OCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMjE2NDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3OTA1OCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMjE2NDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX21lcmdlNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzc2MDYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjAzNDk2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzc2MDYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjAzNDk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9tZXJnZTUubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc3NTI4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIwMjUyMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc3NTI4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIwMjUyMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbWluY3UxNi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODg4MjIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzQzNjk2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODg4MjIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzQzNjk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9taW5jdTMyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIwOTkyMCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI2MDc0MjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIwOTkyMCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI2MDc0MjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vZGJsay5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzk4ODgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjMyMDI0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzk4ODgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjMyMDI0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub19wcHNfcXBfb3B0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3ODA3Nix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMDkzNjgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3ODA3Nix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMDkzNjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vX3Bwc19yZWZsaXN0X29wdC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzgwNzYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjA5MzY4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzgwNzYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjA5MzY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub192dWlfaHJkLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3ODA3Nix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMDkzNjgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3ODA3Nix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMDkzNjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3BsYWNlYm8ubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg3NzA3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjMyOTczNixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg3NzA3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjMyOTczNixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfcHJvZmlsZW5vbmUubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc4MDcwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIwOTI5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc4MDcwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIwOTI5NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfcHNuci5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMTM1NDAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zOTAyNjgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMTM1NDAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zOTAyNjgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9xcDAubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTQ5MTc1Nzcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xODY0NTMxMzYscGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTI0OTU0LDIyMyArMjQ5NTQsMjIzIEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExMDI1OTkyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM3ODA4MzIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9xcDUwLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE0NzgxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTY4MTg0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNDc4MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE2ODE4NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfcXA1MWNibTEyY3JtMTIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTMyNTQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDkwOTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEzMjU0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ5MDk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9xcDUxLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEyMjI4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTM2MjcyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMjIyOCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNjI3MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfcmVjdDAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc4MDczLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIwOTMzNixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc4MDczLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIwOTMzNixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfcnB0X2hkcnMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc4MDcwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIwOTI5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc4MDcwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIwOTI5NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfc2FvMC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzgxNTQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjEwMzQ0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzgxNTQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjEwMzQ0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9zYmgxLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3ODA3Myx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMDkzMzYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3ODA3Myx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMDkzMzYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3Nsb3dlci5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODA5MDMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjQ0NjgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODA5MDMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjQ0NjgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9zbG93Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2OTA5NSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwOTcxMTIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2OTA5NSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwOTcxMTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3NybmcwLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI1MTE4Nix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMxMjMyNDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI1MTE4Nix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMxMjMyNDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3NybmczMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzgxMDQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjA5NzIwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzgxMDQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjA5NzIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9zcm5nNjQubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc4MDczLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIwOTMzNixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc4MDczLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIwOTMzNixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfc3JuZzgubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc5MzM0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIyNTA5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc5MzM0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIyNTA5NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfc3NpbS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yODIwMjYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zNTA4NzYwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yODIwMjYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zNTA4NzYwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9zdHJuZ2ludHJhMC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzg0NjQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjE0MjI0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzg0NjQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjE0MjI0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9zdXBlcmZhc3QubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mjg2MDA2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzU1ODQ5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mjg2MDA2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzU1ODQ5NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfdGM0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3OTQ0Mix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMjY0MzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3OTQ0Mix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMjY0MzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3RjNi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzk1OTcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjI4MzY4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzk1OTcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjI4MzY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl90Y200Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3OTA3MCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMjE3ODQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3OTA3MCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMjE3ODQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3RjbTYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc5NDUxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIyNjU0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc5NDUxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIyNjU0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfdG1wX2x5cnMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc4MDc4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIwOTI5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc4MDc4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIwOTI5NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfdG12cDAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc5NDA4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIyNjAyNCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc5NDA4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIyNjAyNCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfdHVpbnRlcmRlcHRoMi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODI5NDcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjcwMjU2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODI5NDcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjcwMjU2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl90dWludGVyZGVwdGg0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4MDY4NCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyNDE5NjgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4MDY4NCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyNDE5NjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3R1aW50cmFkZXB0aDIubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc4NTMyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIxNTA3MixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc4NTMyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIxNTA3MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfdHVpbnRyYWRlcHRoNC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODE5ODEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjU4MTg0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODE5ODEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjU4MTg0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl90dWxpbWl0Mi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzgwNzMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjA5MzM2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzgwNzMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjA5MzM2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl90dWxpbWl0NC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzgwNzMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjA5MzM2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzgwNzMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjA5MzM2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl91bHRyYWZhc3QubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjY1NjMwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzMwMzgwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjY1NjMwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzMwMzgwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfdmVyeWZhc3QubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTUzNTYwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTkwMzUyMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTUzNTYwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTkwMzUyMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfdmVyeXNsb3cubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc5OTQxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIzMjY1NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc5OTQxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIzMjY1NixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfdnVpX2NvbG9yX21hdHJpeC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzgwNzcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjA5MzM2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzgwNzcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjA5MzM2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl92dWlfY29sb3JfcHJpbV9idDIwMjAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc4MDc3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIwOTMzNixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc4MDc3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIwOTMzNixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfdnVpX2NvbG9yX3ByaW1fYnQ3MDkubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc4MDc3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIwOTMzNixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc4MDc3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIwOTMzNixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfdnVpX3RyYW5zZmVyLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3ODA3Nyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMDkzMzYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3ODA3Nyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMDkzMzYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3dlaWdodGIwd2VpZ2h0cDEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc4MDczLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIwOTMzNixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc4MDczLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIwOTMzNixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfd2VpZ2h0YjEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc4ODkzLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIxOTU4NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc4ODkzLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIxOTU4NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfd2VpZ2h0cDAubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc4MDczLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIwOTMzNixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc4MDczLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIwOTMzNixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfd2VpZ2h0cDB3ZWlnaHRiMS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzg5MTYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjE5ODcyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzg5MTYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjE5ODcyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl93cHAxLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3ODQxMix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMTM1NjgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3ODQxMix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMTM1NjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3plcm9sYXRlbmN5Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIxNjQwMyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI2OTIzMjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIxNjQwMyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI2OTIzMjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzEwMjR4MTAyNHA1MGYzMl8yMDAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTI3OTEsd2lkdGg9MTAyNCxoZWlnaHQ9MTAyNCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE4OTM0MDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1Mjc5MSx3aWR0aD0xMDI0LGhlaWdodD0xMDI0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTg5MzQwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMTAyNHg1NzZwNTBmMzJfMTEwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9ODgwMDIsd2lkdGg9MTAyNCxoZWlnaHQ9NTc2LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTA4MzQ0OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9ODgwMDIsd2lkdGg9MTAyNCxoZWlnaHQ9NTc2LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTA4MzQ0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMTAyNHg3NjhwNTBmMzJfMTUwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE3Mjg4LHdpZHRoPTEwMjQsaGVpZ2h0PTc2OCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NDk1MjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTExNzI4OCx3aWR0aD0xMDI0LGhlaWdodD03NjgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNDQ5NTIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xMDgweDE5MjBwNTBmMzJfNDEwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mjk2ODEzLHdpZHRoPTEwODAsaGVpZ2h0PTE5MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zNjkzODgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yOTY4MTMsd2lkdGg9MTA4MCxoZWlnaHQ9MTkyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM2OTM4ODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzEwODB4NjRwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODAwNCx3aWR0aD0xMDgwLGhlaWdodD02NCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwODQ4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTgwMDQsd2lkdGg9MTA4MCxoZWlnaHQ9NjQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMDg0ODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzEwODh4MTkyMHA1MGYzMl80MTAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yOTY5ODksd2lkdGg9MTA4OCxoZWlnaHQ9MTkyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM2OTYwODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI5Njk4OSx3aWR0aD0xMDg4LGhlaWdodD0xOTIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzY5NjA4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMTE1MngyMDQ4cDUwZjMyXzQ3MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMzNjg1Nix3aWR0aD0xMTUyLGhlaWdodD0yMDQ4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDE5NDQyNCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzM2ODU2LHdpZHRoPTExNTIsaGVpZ2h0PTIwNDgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MTk0NDI0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xMjgweDE5MjBwNTBmMzJfNDkwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU0MzI5LHdpZHRoPTEyODAsaGVpZ2h0PTE5MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDEyODMyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNTQzMjksd2lkdGg9MTI4MCxoZWlnaHQ9MTkyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQ0MTI4MzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzEyODB4NjRwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzgzOSx3aWR0aD0xMjgwLGhlaWdodD02NCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwNjQyNCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc4Mzksd2lkdGg9MTI4MCxoZWlnaHQ9NjQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMDY0MjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzEyODB4NzIwcDUwZjMyXzE4MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE0MDMyMCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzM3NDI0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNDAzMjAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTczNzQyNCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMTI4MHg5NjBwNTBmMzJfMjQwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTgwNDQyLHdpZHRoPTEyODAsaGVpZ2h0PTk2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyMzg5NDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4MDQ0Mix3aWR0aD0xMjgwLGhlaWdodD05NjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjM4OTQ0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xMjh4MTI4cDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTU4MzQsd2lkdGg9MTI4LGhlaWdodD0xMjgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xODE0NzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1ODM0LHdpZHRoPTEyOCxoZWlnaHQ9MTI4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTgxNDcyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xMjh4MTkycDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTYxNjEsd2lkdGg9MTI4LGhlaWdodD0xOTIsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xODU0NTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2MTYxLHdpZHRoPTEyOCxoZWlnaHQ9MTkyLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTg1NDU2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xMjh4NzJwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTMxOCx3aWR0aD0xMjgsaGVpZ2h0PTcyLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTc1MjI0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTMxOCx3aWR0aD0xMjgsaGVpZ2h0PTcyLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTc1MjI0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xMjh4OTZwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTY1Nix3aWR0aD0xMjgsaGVpZ2h0PTk2LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTc5MzQ0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTY1Nix3aWR0aD0xMjgsaGVpZ2h0PTk2LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTc5MzQ0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xNDQweDEwODBwNTBmMzJfMzEwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjMyNjY5LHdpZHRoPTE0NDAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yODkxNzg0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMzI2Njksd2lkdGg9MTQ0MCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI4OTE3ODQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE0NDB4MTQ0MHA1MGYzMl80MTAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMjMyNDcsd2lkdGg9MTQ0MCxoZWlnaHQ9MTQ0MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM1NTI4NDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIyMzI0Nyx3aWR0aD0xNDQwLGhlaWdodD0xNDQwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzU1Mjg0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMTQ0MHgxOTIwcDUwZjMyXzU1MDBrYnBzLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM5ODM4Nix3aWR0aD0xNDQwLGhlaWdodD0xOTIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDk2MzU0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMTQ0MHg5NjBwNTBmMzJfMjcwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjAzMTA3LHdpZHRoPTE0NDAsaGVpZ2h0PTk2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI1MjIyNTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIwMzEwNyx3aWR0aD0xNDQwLGhlaWdodD05NjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNTIyMjU2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xNDR4MTQ0cDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTYwNzIsd2lkdGg9MTQ0LGhlaWdodD0xNDQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xODQzNDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2MDcyLHdpZHRoPTE0NCxoZWlnaHQ9MTQ0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTg0MzQ0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xNDR4MTc2cDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTYxMTYsd2lkdGg9MTQ0LGhlaWdodD0xNzYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xODUwMDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2MTE2LHdpZHRoPTE0NCxoZWlnaHQ9MTc2LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTg1MDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xNDR4MTkycDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTY1MzMsd2lkdGg9MTQ0LGhlaWdodD0xOTIsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTAxMTIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2NTMzLHdpZHRoPTE0NCxoZWlnaHQ9MTkyLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTkwMTEyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xNDR4MjU2cDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTY1MTcsd2lkdGg9MTQ0LGhlaWdodD0yNTYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xODk4OTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2NTE3LHdpZHRoPTE0NCxoZWlnaHQ9MjU2LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTg5ODk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xNDR4OTZwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTU4OCx3aWR0aD0xNDQsaGVpZ2h0PTk2LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTc4Mjk2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTU4OCx3aWR0aD0xNDQsaGVpZ2h0PTk2LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTc4Mjk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xNTM2eDIwNDhwNTBmMzJfNjIwMGticHMubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDQ5OTkwLHdpZHRoPTE1MzYsaGVpZ2h0PTIwNDgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01NjA4NjAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xNjB4MjQwcDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTY4MzAsd2lkdGg9MTYwLGhlaWdodD0yNDAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTM4MjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2ODMwLHdpZHRoPTE2MCxoZWlnaHQ9MjQwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTkzODI0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xNzJ4MTcycDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTY2OTEsd2lkdGg9MTcyLGhlaWdodD0xNzIsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTIwNTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2NjkxLHdpZHRoPTE3MixoZWlnaHQ9MTcyLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTkyMDU2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xNzZ4MTQ0cDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTYwMTQsd2lkdGg9MTc2LGhlaWdodD0xNDQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xODM2MjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2MDE0LHdpZHRoPTE3NixoZWlnaHQ9MTQ0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTgzNjI0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xNzZ4OTZwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTY3MSx3aWR0aD0xNzYsaGVpZ2h0PTk2LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTc5MzM2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTY3MSx3aWR0aD0xNzYsaGVpZ2h0PTk2LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTc5MzM2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xOTIweDEwODBwNTBmMzJfNDEwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzA3MjQxLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zODIzOTM2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMDcyNDEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM4MjM5MzYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE5MjB4MTA4OHA1MGYzMl80MTAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMDc1NDgsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4OCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM4Mjc3NjgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTMwNzU0OCx3aWR0aD0xOTIwLGhlaWdodD0xMDg4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzgyNzc2OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMTkyMHgxMjgwcDUwZjMyXzQ5MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1NTY2NSx3aWR0aD0xOTIwLGhlaWdodD0xMjgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDQyOTUzNixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzU1NjY1LHdpZHRoPTE5MjAsaGVpZ2h0PTEyODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00NDI5NTM2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xOTIweDE0NDBwNTBmMzJfNTUwMGticHMubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mzk3NjUzLHdpZHRoPTE5MjAsaGVpZ2h0PTE0NDAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00OTU0Mzg0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0yNTE3OSwyMiArMjUxNzksMjIgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NzI0MTc1LHdpZHRoPTE5MjAsaGVpZ2h0PTI1NjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05MDM1OTEyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xOTIweDY0cDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTcxNDEsd2lkdGg9MTkyMCxoZWlnaHQ9NjQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTgwMDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3MTQxLHdpZHRoPTE5MjAsaGVpZ2h0PTY0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTk4MDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xOTJ4MTI4cDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTU4OTAsd2lkdGg9MTkyLGhlaWdodD0xMjgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xODIxNjgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1ODkwLHdpZHRoPTE5MixoZWlnaHQ9MTI4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTgyMTY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xOTJ4MTQ0cDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTYxMjQsd2lkdGg9MTkyLGhlaWdodD0xNDQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xODUwOTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2MTI0LHdpZHRoPTE5MixoZWlnaHQ9MTQ0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTg1MDk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xOTJ4MTkycDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTcwMjcsd2lkdGg9MTkyLGhlaWdodD0xOTIsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTYyODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3MDI3LHdpZHRoPTE5MixoZWlnaHQ9MTkyLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTk2MjgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xOTJ4MjU2cDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTcxNTIsd2lkdGg9MTkyLGhlaWdodD0yNTYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTc4MzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3MTUyLHdpZHRoPTE5MixoZWlnaHQ9MjU2LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTk3ODMyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xOTJ4Mjg4cDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTcyMTYsd2lkdGg9MTkyLGhlaWdodD0yODgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTg2MzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3MjE2LHdpZHRoPTE5MixoZWlnaHQ9Mjg4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTk4NjMyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8yMDQ4eDE1MzZwNTBmMzJfNjIwMGticHMubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDQ5MjM3LHdpZHRoPTIwNDgsaGVpZ2h0PTE1MzYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01NTk5MTg0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0yNTIwMywxOSArMjUyMDMsMTkgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTIzNTkzNix3aWR0aD0yMTYwLGhlaWdodD0zODQwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTU0MzI5MjAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzIxNngyODhwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzQyMSx3aWR0aD0yMTYsaGVpZ2h0PTI4OCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwMTIwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc0MjEsd2lkdGg9MjE2LGhlaWdodD0yODgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMDEyMDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI0MHgxNjBwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNjY4Mix3aWR0aD0yNDAsaGVpZ2h0PTE2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5MTk2OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTY2ODIsd2lkdGg9MjQwLGhlaWdodD0xNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTE5NjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI0MHgyNDBwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzUwNyx3aWR0aD0yNDAsaGVpZ2h0PTI0MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwMjI4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc1MDcsd2lkdGg9MjQwLGhlaWdodD0yNDAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMDIyODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI0MHgzMjBwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODAyOCx3aWR0aD0yNDAsaGVpZ2h0PTMyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwODc4NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTgwMjgsd2lkdGg9MjQwLGhlaWdodD0zMjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMDg3ODQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI0MHgzNjBwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODM0NCx3aWR0aD0yNDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIxMjczNixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTgzNDQsd2lkdGg9MjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMTI3MzYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI1NjB4MTQ0MHA1MGYzMl83MzAwa2Jwcy5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01Mjc5MjUsd2lkdGg9MjU2MCxoZWlnaHQ9MTQ0MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTY1ODI3ODQscGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTI1MjI3LDg1ICsyNTIyNyw4NSBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01MjE4NzQsd2lkdGg9MjU2MCxoZWlnaHQ9Mzg0MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3MzYwMTI4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8yNTZ4MTQ0cDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTY4MTgsd2lkdGg9MjU2LGhlaWdodD0xNDQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTM2NTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE2ODE4LHdpZHRoPTI1NixoZWlnaHQ9MTQ0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTkzNjU2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8yNTZ4MTkycDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTcxODgsd2lkdGg9MjU2LGhlaWdodD0xOTIsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xOTgyODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3MTg4LHdpZHRoPTI1NixoZWlnaHQ9MTkyLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTk4MjgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8yNTZ4MjU2cDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc2NjQsd2lkdGg9MjU2LGhlaWdodD0yNTYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMDQyMzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3NjY0LHdpZHRoPTI1NixoZWlnaHQ9MjU2LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjA0MjMyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8yNjR4MzUycDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTgzMjcsd2lkdGg9MjY0LGhlaWdodD0zNTIsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMTI1MjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4MzI3LHdpZHRoPTI2NCxoZWlnaHQ9MzUyLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjEyNTIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8yODgweDM4NDBwNTBmMzJfMjIxMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI2ODAyMCx3aWR0aD0yODgwLGhlaWdodD0zODQwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzU2MDc3MjgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI2ODAyMCx3aWR0aD0yODgwLGhlaWdodD0zODQwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzU2MDc3MjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI4OHgxOTJwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzQ1MSx3aWR0aD0yODgsaGVpZ2h0PTE5MixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwMTU2OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc0NTEsd2lkdGg9Mjg4LGhlaWdodD0xOTIsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMDE1NjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI4OHgyMTZwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzU3Mix3aWR0aD0yODgsaGVpZ2h0PTIxNixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwMzA4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc1NzIsd2lkdGg9Mjg4LGhlaWdodD0yMTYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMDMwODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI4OHgyODhwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzc3MSx3aWR0aD0yODgsaGVpZ2h0PTI4OCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwNTU2OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc3NzEsd2lkdGg9Mjg4LGhlaWdodD0yODgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMDU1NjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI4OHgzNTJwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODgwNCx3aWR0aD0yODgsaGVpZ2h0PTM1MixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIxODQ4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg4MDQsd2lkdGg9Mjg4LGhlaWdodD0zNTIsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMTg0ODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI4OHg1MTJwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMDMyOSx3aWR0aD0yODgsaGVpZ2h0PTUxMixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIzNzU0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjAzMjksd2lkdGg9Mjg4LGhlaWdodD01MTIsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzc1NDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzMyMHgyNDBwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzk0Mix3aWR0aD0zMjAsaGVpZ2h0PTI0MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwNzcxMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTc5NDIsd2lkdGg9MzIwLGhlaWdodD0yNDAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMDc3MTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzMyMHgzMjBwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODE3MSx3aWR0aD0zMjAsaGVpZ2h0PTMyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIxMDU2OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTgxNzEsd2lkdGg9MzIwLGhlaWdodD0zMjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMTA1NjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzMyMHg0ODBwNTBmMzJfMzAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yNjEyMSx3aWR0aD0zMjAsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMwOTk0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjYxMjEsd2lkdGg9MzIwLGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zMDk5NDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzM1MHgzNTBwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTU1MSx3aWR0aD0zNTAsaGVpZ2h0PTM1MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyNzgwOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTk1NTEsd2lkdGg9MzUwLGhlaWdodD0zNTAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjc4MDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzM1MngyNjRwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODM4Myx3aWR0aD0zNTIsaGVpZ2h0PTI2NCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIxMzIyNCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTgzODMsd2lkdGg9MzUyLGhlaWdodD0yNjQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMTMyMjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzM1MngyODhwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODI2Nyx3aWR0aD0zNTIsaGVpZ2h0PTI4OCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIxMTc2OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTgyNjcsd2lkdGg9MzUyLGhlaWdodD0yODgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMTE3NjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzM1MngzNTJwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xOTI1Mix3aWR0aD0zNTIsaGVpZ2h0PTM1MixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyNDA4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTkyNTIsd2lkdGg9MzUyLGhlaWdodD0zNTIsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjQwODAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzM1Nng2MzhwNTBmMzJfNDAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNDU2Nyx3aWR0aD0zNTYsaGVpZ2h0PTYzOCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQxNTUxMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzQ1Njcsd2lkdGg9MzU2LGhlaWdodD02MzgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MTU1MTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzM1Nng2NDBwNTBmMzJfNDAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNDU5Mix3aWR0aD0zNTYsaGVpZ2h0PTY0MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQxNTgyNCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzQ1OTIsd2lkdGg9MzU2LGhlaWdodD02NDAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MTU4MjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzM1OHg2MzZwNTBmMzJfNDAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNDQ2Myx3aWR0aD0zNTgsaGVpZ2h0PTYzNixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQxNDIwOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzQ0NjMsd2lkdGg9MzU4LGhlaWdodD02MzYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MTQyMDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzM2MHgyNDBwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xODE3NCx3aWR0aD0zNjAsaGVpZ2h0PTI0MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIxMDYwOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTgxNzQsd2lkdGg9MzYwLGhlaWdodD0yNDAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMTA2MDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzM2MHg0ODBwNTBmMzJfMzAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yNjY2OSx3aWR0aD0zNjAsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMxNjgwMCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjY2Njksd2lkdGg9MzYwLGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zMTY4MDAscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzM2MHg2MzZwNTBmMzJfNDAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNDQxNyx3aWR0aD0zNjAsaGVpZ2h0PTYzNixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQxMzYzMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzQ0MTcsd2lkdGg9MzYwLGhlaWdodD02MzYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MTM2MzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzM2MHg2MzhwNTBmMzJfNDAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNDUyMix3aWR0aD0zNjAsaGVpZ2h0PTYzOCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQxNDk0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzQ1MjIsd2lkdGg9MzYwLGhlaWdodD02MzgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MTQ5NDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzM2MHg2NDBwNTBmMzJfNDAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zNDU2Mix3aWR0aD0zNjAsaGVpZ2h0PTY0MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQxNTQ1NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzQ1NjIsd2lkdGg9MzYwLGhlaWdodD02NDAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MTU0NTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl8xNjUwMGticHMubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTIxNzE0NSx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTUxOTgwMzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzM4NHg1MTJwNTBmMzJfMzAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yNzc4Nyx3aWR0aD0zODQsaGVpZ2h0PTUxMixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTMzMDc2OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mjc3ODcsd2lkdGg9Mzg0LGhlaWdodD01MTIsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zMzA3NjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzQwOTZ4MjMwNHA1MGYzMl8xODgwMGticHMubXA0Ij4KICAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTQyNjQ5Nyx3aWR0aD00MDk2LGhlaWdodD0yMzA0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTc4MTQ5MjAscGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTI1MzE3LDE5MCArMjUzMTcsMTkwIEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE4MzY3NDAsd2lkdGg9NDE2MCxoZWlnaHQ9MzEyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIyOTQyOTYwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF80NzJ4NDcycDUwZjMyXzQwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzQ1ODQsd2lkdGg9NDcyLGhlaWdodD00NzIsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MTU3MzYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM0NTg0LHdpZHRoPTQ3MixoZWlnaHQ9NDcyLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDE1NzM2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF80ODB4MzIwcDUwZjMyXzMwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjYxNjUsd2lkdGg9NDgwLGhlaWdodD0zMjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zMTA0OTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI2MTY1LHdpZHRoPTQ4MCxoZWlnaHQ9MzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzEwNDk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF80ODB4MzYwcDUwZjMyXzMwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjY3NTYsd2lkdGg9NDgwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zMTc4ODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI2NzU2LHdpZHRoPTQ4MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzE3ODgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF80ODB4NDgwcDUwZjMyXzQwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzQ2NjAsd2lkdGg9NDgwLGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MTY2ODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM0NjYwLHdpZHRoPTQ4MCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDE2NjgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF80ODB4NjQwcDUwZjMyXzYwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDkyMzcsd2lkdGg9NDgwLGhlaWdodD02NDAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01OTg4OTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQ5MjM3LHdpZHRoPTQ4MCxoZWlnaHQ9NjQwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTk4ODk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF80ODB4NzIwcDUwZjMyXzYwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTAyMzIsd2lkdGg9NDgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02MTEzMzYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTUwMjMyLHdpZHRoPTQ4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NjExMzM2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF80ODB4ODQ4cDUwZjMyXzgwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NjM1NTUsd2lkdGg9NDgwLGhlaWdodD04NDgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03Nzc5NjgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTYzNTU1LHdpZHRoPTQ4MCxoZWlnaHQ9ODQ4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Nzc3OTY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF81MTJ4Mjg4cDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjAyNzYsd2lkdGg9NTEyLGhlaWdodD0yODgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMzY4ODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIwMjc2LHdpZHRoPTUxMixoZWlnaHQ9Mjg4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM2ODgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF81MTJ4Mzg0cDUwZjMyXzMwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mjc2MzQsd2lkdGg9NTEyLGhlaWdodD0zODQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zMjg4NTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI3NjM0LHdpZHRoPTUxMixoZWlnaHQ9Mzg0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MzI4ODU2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF81MTJ4NTEycDUwZjMyXzUwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDE4MTksd2lkdGg9NTEyLGhlaWdodD01MTIsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01MDYxNjgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQxODE5LHdpZHRoPTUxMixoZWlnaHQ9NTEyLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTA2MTY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF81Mjh4NzA0cDUwZjMyXzcwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTczODAsd2lkdGg9NTI4LGhlaWdodD03MDQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03MDA2ODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTU3MzgwLHdpZHRoPTUyOCxoZWlnaHQ9NzA0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzAwNjgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF81NzZ4MTAyNHA1MGYzMl8xMTAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT04NzUzOCx3aWR0aD01NzYsaGVpZ2h0PTEwMjQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMDc3NzQ0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT04NzUzOCx3aWR0aD01NzYsaGVpZ2h0PTEwMjQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMDc3NzQ0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF81NzZ4NzA0cDUwZjMyXzgwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NjQ2NDMsd2lkdGg9NTc2LGhlaWdodD03MDQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03OTE0NzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTY0NjQzLHdpZHRoPTU3NixoZWlnaHQ9NzA0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzkxNDcyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF81NzZ4NzIwcDUwZjMyXzgwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NjQ3NzMsd2lkdGg9NTc2LGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03OTMwOTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTY0NzczLHdpZHRoPTU3NixoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzkzMDk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF82MDB4ODAwcDUwZjMyXzkwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NzEzMTQsd2lkdGg9NjAwLGhlaWdodD04MDAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04NzQ4NTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTcxMzE0LHdpZHRoPTYwMCxoZWlnaHQ9ODAwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9ODc0ODU2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF82MzZ4MzU4cDUwZjMyXzQwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzQ5MTcsd2lkdGg9NjM2LGhlaWdodD0zNTgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MTk4ODAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM0OTE3LHdpZHRoPTYzNixoZWlnaHQ9MzU4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDE5ODgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF82MzZ4MzYwcDUwZjMyXzQwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzUwODAsd2lkdGg9NjM2LGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MjE5MjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM1MDgwLHdpZHRoPTYzNixoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDIxOTIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF82Mzh4MzU2cDUwZjMyXzQwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzQ5MDIsd2lkdGg9NjM4LGhlaWdodD0zNTYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MTk2OTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM0OTAyLHdpZHRoPTYzOCxoZWlnaHQ9MzU2LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDE5Njk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF82Mzh4MzYwcDUwZjMyXzQwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzQ5Mzgsd2lkdGg9NjM4LGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MjAxNDQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM0OTM4LHdpZHRoPTYzOCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDIwMTQ0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF82NDB4MzU2cDUwZjMyXzQwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzQ5Mzksd2lkdGg9NjQwLGhlaWdodD0zNTYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MjAxNjAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM0OTM5LHdpZHRoPTY0MCxoZWlnaHQ9MzU2LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDIwMTYwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF82NDB4MzU4cDUwZjMyXzQwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzQ5NTAsd2lkdGg9NjQwLGhlaWdodD0zNTgsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MjAyOTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM0OTUwLHdpZHRoPTY0MCxoZWlnaHQ9MzU4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDIwMjk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF82NDB4MzYwcDUwZjMyXzQwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzQ5NTksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT00MjA0MjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTM0OTU5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDIwNDI0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF82NDB4NDgwcDUwZjMyXzYwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NDkyNzcsd2lkdGg9NjQwLGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT01OTk0MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQ5Mjc3LHdpZHRoPTY0MCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTk5NDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF82NDB4NjQwcDUwZjMyXzgwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NjQyODMsd2lkdGg9NjQwLGhlaWdodD02NDAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03ODY5NjgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTY0MjgzLHdpZHRoPTY0MCxoZWlnaHQ9NjQwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Nzg2OTY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF82NDB4ODQ4cDUwZjMyXzEwMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTc5NzAwLHdpZHRoPTY0MCxoZWlnaHQ9ODQ4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTc5Nzg0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03OTcwMCx3aWR0aD02NDAsaGVpZ2h0PTg0OCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTk3OTc4NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfNjR4MTA4MHA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3MjE2LHdpZHRoPTY0LGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTk4NzM2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzIxNix3aWR0aD02NCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5ODczNixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfNjR4MTI4MHA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3MTcwLHdpZHRoPTY0LGhlaWdodD0xMjgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTk4MzYwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzE3MCx3aWR0aD02NCxoZWlnaHQ9MTI4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5ODM2MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfNjR4MTkyMHA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3NDIwLHdpZHRoPTY0LGhlaWdodD0xOTIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjAxNDgwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzQyMCx3aWR0aD02NCxoZWlnaHQ9MTkyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTIwMTQ4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfNjR4NjRwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNDY2OCx3aWR0aD02NCxoZWlnaHQ9NjQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNjgwMDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE0NjY4LHdpZHRoPTY0LGhlaWdodD02NCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE2ODAwMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfNjR4NzIwcDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTY2NTIsd2lkdGg9NjQsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5MTY4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTY2NTIsd2lkdGg9NjQsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5MTY4MCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfNjR4OTZwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTI3NSx3aWR0aD02NCxoZWlnaHQ9OTYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzQ1ODQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1Mjc1LHdpZHRoPTY0LGhlaWdodD05NixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3NDU4NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfNzA0eDUyOHA1MGYzMl83MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTU3MDU5LHdpZHRoPTcwNCxoZWlnaHQ9NTI4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Njk2NjcyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01NzA1OSx3aWR0aD03MDQsaGVpZ2h0PTUyOCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTY5NjY3MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfNzA0eDU3NnA1MGYzMl84MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTY0MzEyLHdpZHRoPTcwNCxoZWlnaHQ9NTc2LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Nzg3MzM2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02NDMxMix3aWR0aD03MDQsaGVpZ2h0PTU3NixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTc4NzMzNixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfNzA0eDcwNHA1MGYzMl85MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTcyOTA1LHdpZHRoPTcwNCxoZWlnaHQ9NzA0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9ODk0NzQ0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03MjkwNSx3aWR0aD03MDQsaGVpZ2h0PTcwNCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTg5NDc0NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfNzIweDEyODBwNTBmMzJfMTgwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTM4NjM4LHdpZHRoPTcyMCxoZWlnaHQ9MTI4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3MTY0MDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEzODYzOCx3aWR0aD03MjAsaGVpZ2h0PTEyODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzE2NDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF83MjB4NDgwcDUwZjMyXzYwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTAyODYsd2lkdGg9NzIwLGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02MTIwMDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTUwMjg2LHdpZHRoPTcyMCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NjEyMDA4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF83MjB4NTc2cDUwZjMyXzgwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NjQ2MDUsd2lkdGg9NzIwLGhlaWdodD01NzYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03OTEwMDAscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTY0NjA1LHdpZHRoPTcyMCxoZWlnaHQ9NTc2LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NzkxMDAwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF83MjB4NjRwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzI3NSx3aWR0aD03MjAsaGVpZ2h0PTY0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTk5MzY4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzI3NSx3aWR0aD03MjAsaGVpZ2h0PTY0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTk5MzY4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF83MjB4NzIwcDUwZjMyXzEwMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTc5Njk1LHdpZHRoPTcyMCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTc5NjI0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03OTY5NSx3aWR0aD03MjAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTk3OTYyNCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfNzIweDk2MHA1MGYzMl8xMzAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDI2Mzksd2lkdGg9NzIwLGhlaWdodD05NjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMjY2NTIwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMDI2Mzksd2lkdGg9NzIwLGhlaWdodD05NjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMjY2NTIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF83MngxMjhwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTA1MCx3aWR0aD03MixoZWlnaHQ9MTI4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTcxNjcyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTA1MCx3aWR0aD03MixoZWlnaHQ9MTI4LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTcxNjcyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF83Mng5NnA1MGYzMl8yMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1MjQyLHdpZHRoPTcyLGhlaWdodD05NixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3NDI3MixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTUyNDIsd2lkdGg9NzIsaGVpZ2h0PTk2LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTc0MjcyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF83Njh4MTAyNHA1MGYzMl8xNTAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMTc5MTEsd2lkdGg9NzY4LGhlaWdodD0xMDI0LGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQ1NzQwOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE3OTExLHdpZHRoPTc2OCxoZWlnaHQ9MTAyNCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE0NTc0MDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzgwMHg2MDBwNTBmMzJfOTAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03MjUyOSx3aWR0aD04MDAsaGVpZ2h0PTYwMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTg5MDA0OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NzI1Mjksd2lkdGg9ODAwLGhlaWdodD02MDAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT04OTAwNDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzgwMHg4MDBwNTBmMzJfMTIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9OTQ5MTgsd2lkdGg9ODAwLGhlaWdodD04MDAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMTcwMDA4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT05NDkxOCx3aWR0aD04MDAsaGVpZ2h0PTgwMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTExNzAwMDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzg0OHg0ODBwNTBmMzJfODAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02NDI0MCx3aWR0aD04NDgsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTc4NjQzMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NjQyNDAsd2lkdGg9ODQ4LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT03ODY0MzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzg0OHg2NDBwNTBmMzJfMTAwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9ODAxMTIsd2lkdGg9ODQ4LGhlaWdodD02NDAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05ODQ4MzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTgwMTEyLHdpZHRoPTg0OCxoZWlnaHQ9NjQwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTg0ODMyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF84NDh4ODQ4cDUwZjMyXzE0MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwOTgxNSx3aWR0aD04NDgsaGVpZ2h0PTg0OCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNTYyMjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwOTgxNSx3aWR0aD04NDgsaGVpZ2h0PTg0OCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEzNTYyMjQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzk2MHgxMjgwcDUwZjMyXzI0MDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE3OTc5Mix3aWR0aD05NjAsaGVpZ2h0PTEyODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjMwODI0LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzk3OTIsd2lkdGg9OTYwLGhlaWdodD0xMjgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjIzMDgyNCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfOTYweDE0NDBwNTBmMzJfMjcwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjAyNDMzLHdpZHRoPTk2MCxoZWlnaHQ9MTQ0MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI1MTM4MzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIwMjQzMyx3aWR0aD05NjAsaGVpZ2h0PTE0NDAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yNTEzODMyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF85NjB4NjQwcDUwZjMyXzEyMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTk0NzI5LHdpZHRoPTk2MCxoZWlnaHQ9NjQwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTE2NzU0NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9OTQ3Mjksd2lkdGg9OTYwLGhlaWdodD02NDAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMTY3NTQ0LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF85NjB4NzIwcDUwZjMyXzEzMDBrYnBzLm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwMjkxNSx3aWR0aD05NjAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEyNjk4NzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwMjkxNSx3aWR0aD05NjAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTEyNjk4NzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzk2MHg5NjBwNTBmMzJfMTgwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTM5ODU5LHdpZHRoPTk2MCxoZWlnaHQ9OTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTczMTc2OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTM5ODU5LHdpZHRoPTk2MCxoZWlnaHQ9OTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTczMTc2OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfOTZ4MTI4cDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTUzNjgsd2lkdGg9OTYsaGVpZ2h0PTEyOCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3NTY0OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTUzNjgsd2lkdGg9OTYsaGVpZ2h0PTEyOCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3NTY0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfOTZ4MTQ0cDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTUzMDQsd2lkdGg9OTYsaGVpZ2h0PTE0NCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3NDg0OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTUzMDQsd2lkdGg9OTYsaGVpZ2h0PTE0NCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3NDg0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfOTZ4MTc2cDUwZjMyXzIwMGticHMubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTYwMDUsd2lkdGg9OTYsaGVpZ2h0PTE3NixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE4MzYwOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTYwMDUsd2lkdGg9OTYsaGVpZ2h0PTE3NixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE4MzYwOCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfOTZ4NjRwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTE0Nix3aWR0aD05NixoZWlnaHQ9NjQsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzQ4NzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1MTQ2LHdpZHRoPTk2LGhlaWdodD02NCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3NDg3MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfOTZ4NzJwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTE3NCx3aWR0aD05NixoZWlnaHQ9NzIsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzM0MjQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1MTc0LHdpZHRoPTk2LGhlaWdodD03MixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3MzQyNCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfOTZ4OTZwNTBmMzJfMjAwa2Jwcy5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTY1MSx3aWR0aD05NixoZWlnaHQ9OTYsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzk1ODQscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1NjUxLHdpZHRoPTk2LGhlaWdodD05NixmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE3OTU4NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3NjYWxpbmdfbGlzdC9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9kZWZzbGlzdC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMjE5NzIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDAwODA3MixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzIxOTcyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQwMDgwNzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9zY2FsaW5nX2xpc3QvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9zbGlzdC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMjQ2MjMsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDA0MTIwOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzI0NjIzLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQwNDEyMDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9zY2FsaW5nX2xpc3QvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfc2xpc3RfZmxhdF8xNi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0zMjQ2NTcsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NDA0MTIwOCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MzI0NjU3LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTQwNDEyMDgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9zY2FsaW5nX2xpc3QvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfc2xpc3RfZmxhdF8xLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEwNTU3Nzcsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTMxODAxNjAscGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTI1NTA5LDEzICsyNTUwOSwxMyBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT00MjU4NTcsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NTI5Njg3MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3NjYWxpbmdfbGlzdC9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9zbGlzdF9ybmRtXzEyMF8xMzYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjM5OTQ0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI5NzIzMzYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTIzOTk0NCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yOTcyMzM2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvc2NhbGluZ19saXN0L2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX3NsaXN0X3JuZG1fMV8yNTUubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9Mjg2MDkyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTM1MzgwMDgscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTI4NjA5Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zNTM4MDA4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvc2NhbGluZ19saXN0L2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX3NsaXN0X3JuZG1fMjQwXzI1NS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yMTYzNzMsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjY3NzkxMixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MjE2MzczLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTI2Nzc5MTIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9zY2FsaW5nX2xpc3QvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfc2xpc3RfdmVydF8xXzI1NS5tcDQiPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT02NjE2NDIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9ODI0ODk4NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMjU1NjAsNTggKzI1NTYwLDU4IEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTk1MzE1NSx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTE4ODc5NjgscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9zY2FsaW5nX2xpc3QvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2RlZnNsaXN0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTc1MDc4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTIxOTEyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03NTA3OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTkyMTkxMixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3NjYWxpbmdfbGlzdC9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9zbGlzdC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03NTU1Nyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTkyNzg5NixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NzU1NTcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05Mjc4OTYscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9zY2FsaW5nX2xpc3QvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX3NsaXN0X2ZsYXRfMTYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NzU1OTIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT05Mjc4OTYscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTc1NTkyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9OTI3ODk2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvc2NhbGluZ19saXN0L2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9zbGlzdF9mbGF0XzEubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5MDAwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM0NTQ0OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTg5MDAwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MjM0NTQ0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3NjYWxpbmdfbGlzdC9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfc2xpc3Rfcm5kbV8xXzE2Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTgyOTQ1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTAxMDQ4MCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9ODI5NDUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xMDEwNDgwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvc2NhbGluZ19saXN0L2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9zbGlzdF9ybmRtXzEyMF8xMzYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9NTc3NjYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT02OTUxMTIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTU3NzY2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9Njk1MTEyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvc2NhbGluZ19saXN0L2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9zbGlzdF9ybmRtXzFfMjU1Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTcwOTQ0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9ODQ4NjcyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT03MDk0NCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTg0ODY3MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3NjYWxpbmdfbGlzdC9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfc2xpc3Rfcm5kbV8yNDBfMjU1Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTUxMzMzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9NjE0OTIwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT01MTMzMyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTYxNDkyMCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3NjYWxpbmdfbGlzdC9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfc2xpc3RfdmVydF8xXzI1NS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMjI4NTUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNTE0MTYwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xMjI4NTUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNTE0MTYwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvc2NhbGluZ19saXN0L2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9kZWZzbGlzdC5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTE3MDEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xODc5NjcyLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNTE3MDEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xODc5NjcyLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvc2NhbGluZ19saXN0L2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub3NsaXN0Lm1wNCI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1MzM5Nix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5MDA4NzIscGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTE1MzM5Nix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTE5MDA4NzIscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9zY2FsaW5nX2xpc3QvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3NsaXN0X2ZsYXRfMTYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTUzNDMxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTkwMDg3MixwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTUzNDMxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTkwMDg3MixwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3NjYWxpbmdfbGlzdC9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfc2xpc3RfZmxhdF8xLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTQxMDUxMix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPTUwLHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTUxMTQzNDQscGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0iaGV2Yy95dXY0NDQvOGJpdC9zY2FsaW5nX2xpc3QvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX3NsaXN0X3JuZG1fMV8xNi5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzk0MzEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjE2NTM2LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNzk0MzEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0yMjE2NTM2LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvc2NhbGluZ19saXN0L2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9zbGlzdF9ybmRtXzEyMF8xMzYubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE0NzIxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQwNzA0OCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTE0NzIxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTQwNzA0OCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3NjYWxpbmdfbGlzdC9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfc2xpc3Rfcm5kbV8xXzI1NS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNDAxNTgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzEzODQ4LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0xNDAxNTgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0xNzEzODQ4LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvc2NhbGluZ19saXN0L2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9zbGlzdF9ybmRtXzI0MF8yNTUubXA0Ij4KLSAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTAwOTg4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTIzNTU4NCxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby9oZXZjLHNpemU9MTAwOTg4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9NTAscHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9MTIzNTU4NCxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJoZXZjL3l1djQ0NC84Yml0L3NjYWxpbmdfbGlzdC9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfc2xpc3RfdmVydF8xXzI1NS5tcDQiPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yNjIwMjAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zMjUzNzIwLHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL2hldmMsc2l6ZT0yNjIwMjAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT01MCxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0zMjUzNzIwLHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9ImhldmMveXV2NDQ0LzhiaXQvc2xpY2VzX3RpbGVzL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMi9jcm93ZF8zODQweDIxNjBwNTBmMzJfMTAyNGJ5dGVfc2xpY2VzLm1wNCI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8vaGV2YyxzaXplPTEyODc5MzIsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPTI1LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPTgwNDA5NjgscGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTMxNTY5LDExNSArMzE1NjksMTE1IEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE4MjU0MzYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl8xeDEud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2Mzk0Myx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjM5NDMsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjQwOTcsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY0MDk3LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzMzkwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MzM5MCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl8yeDEud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MzU1Myx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjM1NTMsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfMngyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjQwOTcsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY0MDk3LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyXzJ4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzMzkwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MzM5MCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl80eDEud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MzM0OSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjMzNDksd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfNHgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjQwOTcsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY0MDk3LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyXzR4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzMzkwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MzM5MCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9hZGFwdFFDb21fMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNTkwNjcsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTU5MDY3LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX2FkYXB0UVZhcl8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE1OTcyNix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNTk3MjYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfYXJucl8wZl8wc18ydF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2NDIxNyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjQyMTcsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfYXJucl8wZl81c18xdF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2NDQwMCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjQ0MDAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfYXJucl8wZl81c18ydF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2NDE3Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjQxNzIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfYXJucl8xNWZfMHNfMnRfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjQwMDIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY0MDAyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX2FybnJfMTVmXzVzXzJ0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY0NTkzLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2NDU5Myx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9hcm5yXzVmXzBzXzJ0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzOTY1LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2Mzk2NSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9hcm5yXzVmXzVzXzJ0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY0NDAwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2NDQwMCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9hcm5yXzVmXzVzXzN0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY0NDAwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2NDQwMCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9hdXRBbHRSZWZfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjMzOTAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzMzkwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX2F1dEFsdFJlZl84bGFnXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzOTU2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2Mzk1Nix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9jYnJfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNzQyNTgsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTc0MjU4LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX2NxMF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MzM5MCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjMzOTAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfY3ExMF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MzM5MCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjMzOTAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfY3ExNl8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MzM5MCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjMzOTAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfY3EzMl8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MzM5MCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjMzOTAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfY3E0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzMzkwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MzM5MCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9jcTYzXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTM1NTkyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTEzNTU5Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9kb3duU2NhbGVfMTBfbm9LZXlfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjMzOTAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzMzkwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX2Rvd25TY2FsZV8yMF9ub0tleV8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MzM5MCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjMzOTAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfZG93blNjYWxlXzUwX25vS2V5XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzMzkwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MzM5MCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9kb3duU2NhbGVfODBfbm9LZXlfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjMzOTAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzMzkwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX2VyclJlc18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2OTczMyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjk3MzMsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfa2V5RnJtT25seV8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTc1NzU2Nix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03NTc1NjYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfbG9zc2xlc3NfMXg0LndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTM3ODM0OCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9ub0tleUZybV8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MzM5MCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjMzOTAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfbm9uRXJyUmVzXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzMzkwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MzM5MCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9RcDAtMTBfMXg0LndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT02MTg0MDk1LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTMxNjg2LDcgKzMxNjg2LDcgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDEzNzgzNDgsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfUXAwLTYzXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzMzkwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MzM5MCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9RcDEwLTIwXzF4NC53ZWJtIj4KICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjczNDI4Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0zMTcwMSwxNjYgKzMxNzAxLDE2NiBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xMjM5MDEzLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX1FwNDAtNTBfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNzMyODksd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzczMjg5LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX1FwNTAtNjNfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNTk5NzYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTU5OTc2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX1FwNjNfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTIzMyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTIzMyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9zaGFycDBfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjMzOTAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzMzkwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX3NoYXJwMV8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MzUyNyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjM1Mjcsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfc2hhcnAyXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzODE1LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MzgxNSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9zaGFycDNfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjM1NDcsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzNTQ3LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX3NoYXJwNF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MzMyMSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjMzMjEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfc2hhcnA1XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY0MjI2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2NDIyNix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9zaGFycDZfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjM5MzIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzOTMyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX3NoYXJwN18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MzQ3Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjM0NzIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfc2tpcDVmcm1fMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xMzY4MDgsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTM2ODA4LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX3VwU2NhbGVfMTAwXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzMzkwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MzM5MCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl91cFNjYWxlXzEwXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzMzkwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MzM5MCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl91cFNjYWxlXzIwXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzMzkwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MzM5MCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl91cFNjYWxlXzUwXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzMzkwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MzM5MCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl92YnJfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjMzOTAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzMzkwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfMXgxLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjQwMTIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY0MDEyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjM5MTEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzOTExLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjM5MzYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzOTM2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfMngxLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjM0ODcsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzNDg3LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfMngyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjM5MTEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzOTExLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfMng0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjM5MzYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzOTM2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfNHgxLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjM3NDksd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzNzQ5LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfNHgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjM5MTEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzOTExLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfNHg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjM5MzYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzOTM2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfYWRhcHRRQ29tXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTU5NjE4LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE1OTYxOCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX2FkYXB0UVZhcl8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE1OTc5NCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNTk3OTQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl9hcm5yXzBmXzBzXzJ0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzNjk4LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MzY5OCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX2FybnJfMGZfNXNfMXRfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjM2NzQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzNjc0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfYXJucl8wZl81c18ydF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2Mzg2Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjM4NjIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl9hcm5yXzE1Zl8wc18ydF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2NDM5MSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjQzOTEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl9hcm5yXzE1Zl81c18ydF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2NDEyMSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjQxMjEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl9hcm5yXzVmXzBzXzJ0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzMzg3LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MzM4Nyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX2FybnJfNWZfNXNfMnRfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjM2NzQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzNjc0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfYXJucl81Zl81c18zdF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MzY3NCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjM2NzQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl9hdXRBbHRSZWZfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjM5MzYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzOTM2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfYXV0QWx0UmVmXzhsYWdfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjQxNzksd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY0MTc5LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfY2JyXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTc0MzcxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE3NDM3MSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX2NxMF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MzkzNix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjM5MzYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl9jcTEwXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzOTM2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MzkzNix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX2NxMTZfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjM5MzYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzOTM2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfY3EzMl8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MzkzNix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjM5MzYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl9jcTRfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjM5MzYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzOTM2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfY3E2M18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTEzNTUzNix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xMzU1MzYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl9kb3duU2NhbGVfMTBfbm9LZXlfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjM5MzYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzOTM2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfZG93blNjYWxlXzIwX25vS2V5XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzOTM2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MzkzNix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX2Rvd25TY2FsZV81MF9ub0tleV8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MzkzNix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjM5MzYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl9kb3duU2NhbGVfODBfbm9LZXlfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjM5MzYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzOTM2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfZXJyUmVzXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY5NzMzLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2OTczMyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX2tleUZybU9ubHlfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03NTc1NjYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzU3NTY2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfbG9zc2xlc3NfMXg0LndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTIyNjE1MSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX25vS2V5RnJtXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzOTM2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MzkzNix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX25vbkVyclJlc18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MzkzNix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjM5MzYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl9RcDAtMTBfMXg0LndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT02MTgyMDUyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTMxODY5LDcgKzMxODY5LDcgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDEyMjYxNTEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl9RcDAtNjNfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjM5MzYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzOTM2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfUXAxMC0yMF8xeDQud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI3MzU3NTQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMzE4ODQsMTUxICszMTg4NCwxNTEgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTIzOTUyNSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX1FwNDAtNTBfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNzM3MzEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzczNzMxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfUXA1MC02M18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MTExOSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjExMTksd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl9RcDYzXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDEzNjAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDEzNjAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl9zaGFycDBfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjM5MzYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzOTM2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfc2hhcnAxXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzNTQxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MzU0MSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX3NoYXJwMl8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MzQyNSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjM0MjUsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl9zaGFycDNfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjM5MTAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzOTEwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfc2hhcnA0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzNDczLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MzQ3Myx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX3NoYXJwNV8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MzQ5Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjM0OTIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl9zaGFycDZfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjM3MzQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzNzM0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfc2hhcnA3XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzMzc4LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MzM3OCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX3NraXA1ZnJtXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTM2NjQ4LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTEzNjY0OCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX3VwU2NhbGVfMTAwXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzOTM2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MzkzNix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX3VwU2NhbGVfMTBfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjM5MzYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzOTM2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfdXBTY2FsZV8yMF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MzkzNix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjM5MzYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl91cFNjYWxlXzUwXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzOTM2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MzkzNix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX3Zicl8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MzkzNix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjM5MzYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl8xeDEud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1MzAzNix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzUzMDM2LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzUyMjYxLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTIyNjEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTUxMzgsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1NTEzOCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl8yeDEud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1MzI0Nyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzUzMjQ3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyXzJ4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzUyMjYxLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTIyNjEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfNHgxLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTQzMTgsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1NDMxOCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl80eDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1MjI2MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzUyMjYxLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyXzR4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzU1MTM4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTUxMzgsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfYWRhcHRRQ29tXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzIxNzIwLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMjE3MjAsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfYWRhcHRRVmFyXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzIzMjU1LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMjMyNTUsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfYXJucl8wZl8wc18ydF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1MzUwOCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzUzNTA4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX2FybnJfMGZfNXNfMXRfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTQ4NDEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1NDg0MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9hcm5yXzBmXzVzXzJ0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzU0MTYwLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTQxNjAsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfYXJucl8xNWZfMHNfMnRfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTM2ODQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1MzY4NCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9hcm5yXzE1Zl81c18ydF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1NDY1Myx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzU0NjUzLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX2FybnJfNWZfMHNfMnRfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTQ4NDEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1NDg0MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9hcm5yXzVmXzVzXzJ0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzU0ODQxLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTQ4NDEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfYXJucl81Zl81c18zdF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1NDg0MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzU0ODQxLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX2F1dEFsdFJlZl8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1NTEzOCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzU1MTM4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX2F1dEFsdFJlZl84bGFnXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM1NjQyLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzU2NDIsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfY2JyXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY0OTYzLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjQ5NjMsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfY3EwXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzU1MTM4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTUxMzgsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfY3ExMF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1NTEzOCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzU1MTM4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX2NxMTZfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTUxMzgsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1NTEzOCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9jcTMyXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzU1MTM4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTUxMzgsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfY3E0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzU1MTM4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTUxMzgsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfY3E2M18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI2MjIzMCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjYyMjMwLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX2Rvd25TY2FsZV8xMF9ub0tleV8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1NTEzOCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzU1MTM4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX2Rvd25TY2FsZV8yMF9ub0tleV8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1NTEzOCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzU1MTM4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX2Rvd25TY2FsZV81MF9ub0tleV8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1NTEzOCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzU1MTM4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX2Rvd25TY2FsZV84MF9ub0tleV8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1NTEzOCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzU1MTM4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX2VyclJlc18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2ODk4Nix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY4OTg2LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX2tleUZybU9ubHlfMXg0LndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xMzUzODY4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0zMjAzNywxMCArMzIwMzcsMTAgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTE4MDY0NzE3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX25vS2V5RnJtXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzU1MTM4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTUxMzgsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfbm9uRXJyUmVzXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzU1MTM4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTUxMzgsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfUXAwLTEwXzF4NC53ZWJtIj4KICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTQ1Njg3Mjgsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTMyMDQ5LDcgKzMyMDQ5LDcgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTE4MDY0NzE3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX1FwMC02M18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1NTEzOCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzU1MTM4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX1FwMTAtMjBfMXg0LndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT01MDI4OTkwLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0zMjA2NCwxNTEgKzMyMDY0LDE1MSBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMTYzMDAyLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX1FwNDAtNTBfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT02NzQ5MzEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTY3NDkzMSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9RcDUwLTYzXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzIyNDYwLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMjI0NjAsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfUXA2M18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3Nzg2LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04Nzc4Nix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9zaGFycDBfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTUxMzgsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1NTEzOCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9zaGFycDFfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTM4NTAsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1Mzg1MCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9zaGFycDJfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTM5Mzcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1MzkzNyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9zaGFycDNfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTQ1MTksd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1NDUxOSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9zaGFycDRfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTM2OTQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1MzY5NCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9zaGFycDVfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTM2MTAsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1MzYxMCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9zaGFycDZfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTQyNDAsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1NDI0MCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9zaGFycDdfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTM1MjQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1MzUyNCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9za2lwNWZybV8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMwMDA2MCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzAwMDYwLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX3VwU2NhbGVfMTAwXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzU1MTM4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTUxMzgsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfdXBTY2FsZV8xMF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1NTEzOCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzU1MTM4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX3VwU2NhbGVfMjBfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTUxMzgsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1NTEzOCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl91cFNjYWxlXzUwXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzU1MTM4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTUxMzgsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfdmJyXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzU1MTM4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTUxMzgsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl8xeDEud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1Mjg4MCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzUyODgwLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTE4NDgsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1MTg0OCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzU0Nzc2LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTQ3NzYsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl8yeDEud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1MzA5Nix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzUzMDk2LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfMngyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTE4NDgsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1MTg0OCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyXzR4MS53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzUzNDk5LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTM0OTksd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl80eDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1MTg0OCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzUxODQ4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfNHg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTQ3NzYsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1NDc3Nix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX2FkYXB0UUNvbV8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMxOTI1Mix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzE5MjUyLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfYWRhcHRRVmFyXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzIyNTY4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMjI1Njgsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9hcm5yXzBmXzBzXzJ0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzUzNzM3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTM3Mzcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9hcm5yXzBmXzVzXzF0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzU0OTU1LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTQ5NTUsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9hcm5yXzBmXzVzXzJ0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzUzNzUwLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTM3NTAsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9hcm5yXzE1Zl8wc18ydF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1Mzk0Nyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzUzOTQ3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfYXJucl8xNWZfNXNfMnRfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTQwNDYsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1NDA0Nix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX2FybnJfNWZfMHNfMnRfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTQ5NTUsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1NDk1NSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX2FybnJfNWZfNXNfMnRfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTQ5NTUsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1NDk1NSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX2FybnJfNWZfNXNfM3RfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTQ5NTUsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1NDk1NSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX2F1dEFsdFJlZl8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1NDc3Nix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzU0Nzc2LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfYXV0QWx0UmVmXzhsYWdfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzQ4MTAsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNDgxMCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX2Nicl8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2MjgzMyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzYyODMzLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfY3EwXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzU0Nzc2LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTQ3NzYsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9jcTEwXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzU0Nzc2LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTQ3NzYsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9jcTE2XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzU0Nzc2LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTQ3NzYsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9jcTMyXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzU0Nzc2LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTQ3NzYsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9jcTRfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTQ3NzYsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1NDc3Nix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX2NxNjNfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNjE3Mjksd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI2MTcyOSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX2Rvd25TY2FsZV8xMF9ub0tleV8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1NDc3Nix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzU0Nzc2LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfZG93blNjYWxlXzIwX25vS2V5XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzU0Nzc1LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTQ3NzUsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9kb3duU2NhbGVfNTBfbm9LZXlfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTQ3NzYsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1NDc3Nix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX2Rvd25TY2FsZV84MF9ub0tleV8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1NDc3Nix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzU0Nzc2LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfZXJyUmVzXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY4OTg2LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjg5ODYsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9rZXlGcm1Pbmx5XzF4NC53ZWJtIj4KICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTM1Mzg2OCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMzIyMTcsMTAgKzMyMjE3LDEwIEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTk4MTAzOTE0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfbm9LZXlGcm1fMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTQ3NzYsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1NDc3Nix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX25vbkVyclJlc18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1NDc3Nix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzU0Nzc2LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfUXAwLTEwXzF4NC53ZWJtIj4KICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTQ1NjM0OTAsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTMyMjI5LDcgKzMyMjI5LDcgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9OTgxMDM5MTQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9RcDAtNjNfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTQ3NzYsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1NDc3Nix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX1FwMTAtMjBfMXg0LndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT01MDI4NzE1LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0zMjI0NCw1NSArMzIyNDQsNTUgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjE2MTk1NSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX1FwNDAtNTBfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT02NzQ1OTMsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTY3NDU5Myx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX1FwNTAtNjNfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMjE4NzUsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMyMTg3NSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX1FwNjNfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODIwMyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODgyMDMsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9zaGFycDBfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTQ3NzYsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1NDc3Nix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX3NoYXJwMV8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1NDkyMix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzU0OTIyLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfc2hhcnAyXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzU0ODMzLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTQ4MzMsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9zaGFycDNfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTQwMDksd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1NDAwOSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX3NoYXJwNF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1MzY1Nyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzUzNjU3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfc2hhcnA1XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzU0NTI5LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTQ1Mjksd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9zaGFycDZfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTQyOTgsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1NDI5OCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX3NoYXJwN18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1MzUyMSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzUzNTIxLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfc2tpcDVmcm1fMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yOTk5MDQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI5OTkwNCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX3VwU2NhbGVfMTAwXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzU0Nzc2LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTQ3NzYsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl91cFNjYWxlXzEwXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzU0Nzc2LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTQ3NzYsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl91cFNjYWxlXzIwXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzU0Nzc2LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTQ3NzYsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl91cFNjYWxlXzUwXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzU0Nzc2LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTQ3NzYsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl92YnJfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTQ3NzYsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1NDc3Nix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF8zODQweDIxNjBwNTBmMzIvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyX2ZybVBhcl8xeDEud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTk1MjMwMyx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMzIzNzYsNyArMzIzNzYsNyBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT05NTI0NzUsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl9mcm1QYXJfY3E2M18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTY5OTI4Nyx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9Njk5Mjg3LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMi9jcm93ZF8zODQweDIxNjBwNTBmMzJfZnJtUGFyX2Rvd25TY2FsZV8xMF9ub0tleV8xeDQud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTk1MjQ3NSx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMzI0MzMsNyArMzI0MzMsNyBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04OTEzMjIsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl9mcm1QYXJfUXA2M18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI3NjAyMCx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9Mjc2MDIwLHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMi9jcm93ZF8zODQweDIxNjBwNTBmMzJfZnJtUGFyX3NoYXJwMF8xeDQud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTk1MjQ3NSx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMzI1NTksNyArMzI1NTksNyBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT05NTI2MjMsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl9ub0ZybVBhcl9jcTYzXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzAwMTk5LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03MDAxOTksd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl9ub0ZybVBhcl9kb3duU2NhbGVfMTBfbm9LZXlfMXg0LndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT05NTI2MjMsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTMyNjE2LDcgKzMyNjE2LDcgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODkyMTc3LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMi9jcm93ZF8zODQweDIxNjBwNTBmMzJfbm9Gcm1QYXJfUXA2M18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI3NzYzMix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9Mjc3NjMyLHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMi9jcm93ZF8zODQweDIxNjBwNTBmMzJfbm9Gcm1QYXJfc2hhcnAwXzF4NC53ZWJtIj4KICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9OTUyNjIzLHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0zMjY2MSwxMDYgKzMyNjYxLDEwNiBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT05NTI2MjMsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl8xeDEud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxMjQxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDEyNDEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjYzMix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyNjMyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyXzJ4MS53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE0NTEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTQ1MSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl8yeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyNjMyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDI2MzIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfNHgxLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTgzMyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxODMzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyXzR4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDI2MzIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjYzMix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9hZGFwdFFDb21fMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MDY4Mix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQwNjgyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX2FkYXB0UVZhcl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQwNjg3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDA2ODcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfYXJucl8wZl8wc18ydF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyNTE4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDI1MTgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfYXJucl8wZl81c18xdF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyNTIzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDI1MjMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfYXJucl8wZl81c18ydF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyMTg1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIxODUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfYXJucl8xNWZfMHNfMnRfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjM5OSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyMzk5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX2FybnJfMTVmXzVzXzJ0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDI0NzIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjQ3Mix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9hcm5yXzVmXzBzXzJ0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDI1MjMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjUyMyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9hcm5yXzVmXzVzXzJ0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDI1MjMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjUyMyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9hcm5yXzVmXzVzXzN0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDI1MjMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjUyMyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9hdXRBbHRSZWZfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjYzMix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyNjMyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX2F1dEFsdFJlZl84bGFnXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIwMDAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjAwMCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9jYnJfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00NDU4MCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQ0NTgwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX2NxMF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyMTU2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIxNTYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfY3ExMF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyMTU2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIxNTYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfY3ExNl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyMTU2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIxNTYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfY3EzMl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyMTU2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIxNTYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfY3E0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIxNTYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjE1Nix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9jcTYzXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzcwNzcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNzA3Nyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9kb3duU2NhbGVfMTBfbm9LZXlfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjYzMix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyNjMyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX2Rvd25TY2FsZV8yMF9ub0tleV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyNjMyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDI2MzIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfZG93blNjYWxlXzUwX25vS2V5XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDI2MzIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjYzMix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9kb3duU2NhbGVfODBfbm9LZXlfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjYzMix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyNjMyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX2VyclJlc18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQ0NjIxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDQ2MjEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfa2V5RnJtT25seV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI0NzEzNix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI0NzEzNix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9sb3NzbGVzc18xeDIud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTk4NjkxNDIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfbm9LZXlGcm1fMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjYzMix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyNjMyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX25vbkVyclJlc18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyNjMyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDI2MzIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfUXAwLTEwXzF4Mi53ZWJtIj4KICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTgzNjE2NCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTMyNzY5LDE3MiArMzI3NjksMTcyIEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTk4NjkxNDIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfUXAwLTYzXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDI2MzIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjYzMix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9RcDEwLTIwXzF4Mi53ZWJtIj4KICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9OTc4MTQ1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX1FwMjAtMzBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT01NTAwNDQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT01NTAwNDQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfUXAzMC00MF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI2Mjk0Nix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI2Mjk0Nix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9RcDMyXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE1MjM3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE1MjM3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX1FwNDAtNTBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xMTYzNjAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xMTYzNjAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfUXA1MC02M18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxNjAwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE2MDAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfUXA2M18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTk3NTIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT05NzUyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX3NoYXJwMF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyNjMyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDI2MzIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfc2hhcnAxXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDI1NzQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjU3NCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9zaGFycDJfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjcwNCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyNzA0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX3NoYXJwM18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyNTA3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDI1MDcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfc2hhcnA0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDI2MzUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjYzNSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9zaGFycDVfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjY0Mix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyNjQyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX3NoYXJwNl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyNjcwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDI2NzAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfc2hhcnA3XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDI2NDQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjY0NCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9za2lwNWZybV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1NzMyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzU3MzIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfdXBTY2FsZV8xMDBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjYzMix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyNjMyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX3VwU2NhbGVfMTBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjYzMix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyNjMyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX3VwU2NhbGVfMjBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjYzMix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyNjMyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX3VwU2NhbGVfNTBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjYzMix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyNjMyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX3Zicl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyNjMyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDI2MzIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl8xeDEud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxMzQ5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDEzNDksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyNzI3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDI3Mjcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl8yeDEud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxMzYwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDEzNjAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl8yeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyNzI3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDI3Mjcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl80eDEud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxNTg1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE1ODUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl80eDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyNzI3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDI3Mjcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9hZGFwdFFDb21fMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MDQ0Nyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQwNDQ3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfYWRhcHRRVmFyXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDA0MDMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MDQwMyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX2FybnJfMGZfMHNfMnRfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjQxMyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyNDEzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfYXJucl8wZl81c18xdF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyNDIxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDI0MjEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9hcm5yXzBmXzVzXzJ0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDI0NTcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjQ1Nyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX2FybnJfMTVmXzBzXzJ0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDI0NjIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjQ2Mix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX2FybnJfMTVmXzVzXzJ0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDI1NTAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjU1MCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX2FybnJfNWZfMHNfMnRfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjQyMSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyNDIxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfYXJucl81Zl81c18ydF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyNDIxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDI0MjEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9hcm5yXzVmXzVzXzN0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDI0MjEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjQyMSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX2F1dEFsdFJlZl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyNzI3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDI3Mjcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9hdXRBbHRSZWZfOGxhZ18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxOTEyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE5MTIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9jYnJfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00NDg2NCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQ0ODY0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfY3EwXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIzMDIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjMwMix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX2NxMTBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjMwMix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyMzAyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfY3ExNl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyMzAyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIzMDIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9jcTMyXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIzMDIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjMwMix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX2NxNF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyMzAyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIzMDIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9jcTYzXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzcxMDQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNzEwNCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX2Rvd25TY2FsZV8xMF9ub0tleV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyNzI3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDI3Mjcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9kb3duU2NhbGVfMjBfbm9LZXlfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjcyNyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyNzI3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfZG93blNjYWxlXzUwX25vS2V5XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDI3Mjcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjcyNyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX2Rvd25TY2FsZV84MF9ub0tleV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyNzI3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDI3Mjcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9lcnJSZXNfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00NDYyMSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQ0NjIxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfa2V5RnJtT25seV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI0NzEzNix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI0NzEzNix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX2xvc3NsZXNzXzF4Mi53ZWJtIj4KICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9OTg2NDQ1NCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX25vS2V5RnJtXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDI3Mjcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjcyNyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX25vbkVyclJlc18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyNzI3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDI3Mjcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9RcDAtMTBfMXgyLndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xODM2NjE5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMzI5NDMsMTY5ICszMjk0MywxNjkgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9OTg2NDQ1NCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX1FwMC02M18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyNzI3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDI3Mjcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9RcDEwLTIwXzF4Mi53ZWJtIj4KICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9OTc3ODcyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfUXAyMC0zMF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTU1MDM5NCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTU1MDM5NCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX1FwMzAtNDBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNjI1NTcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNjI1NTcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9RcDMyXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE2MTQ5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE2MTQ5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfUXA0MC01MF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTExNjAxNSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTExNjAxNSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX1FwNTAtNjNfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjAyNyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyMDI3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfUXA2M18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTk4ODYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT05ODg2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfc2hhcnAwXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDI3Mjcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjcyNyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX3NoYXJwMV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyNjEwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDI2MTAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9zaGFycDJfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjY3MSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyNjcxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfc2hhcnAzXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDI3MjIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjcyMix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX3NoYXJwNF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyNjgyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDI2ODIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9zaGFycDVfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjUwMyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyNTAzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfc2hhcnA2XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDI2MDksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjYwOSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX3NoYXJwN18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyNjYyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDI2NjIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9za2lwNWZybV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1NjYzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzU2NjMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl91cFNjYWxlXzEwMF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyNzI3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDI3Mjcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl91cFNjYWxlXzEwXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDI3Mjcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjcyNyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX3VwU2NhbGVfMjBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjcyNyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyNzI3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfdXBTY2FsZV81MF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyNzI3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDI3Mjcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl92YnJfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjcyNyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyNzI3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyXzF4MS53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODczNDQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzM0NCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NjE4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc2MTgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfMngxLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzY0MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NjQxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyXzR4MS53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODgwOTIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODA5Mix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl80eDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NjE4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc2MTgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfYWRhcHRRQ29tXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODA1MzEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04MDUzMSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9hZGFwdFFWYXJfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04MTA3NCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTgxMDc0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX2FybnJfMGZfMHNfMnRfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzE3MCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3MTcwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX2FybnJfMGZfNXNfMXRfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzQ5OSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NDk5LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX2FybnJfMGZfNXNfMnRfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04Njc4NCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg2Nzg0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX2FybnJfMTVmXzBzXzJ0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODcyMzgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzIzOCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9hcm5yXzE1Zl81c18ydF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3Njg1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc2ODUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfYXJucl81Zl8wc18ydF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NDk5LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc0OTksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfYXJucl81Zl81c18ydF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NDk5LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc0OTksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfYXJucl81Zl81c18zdF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NDk5LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc0OTksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfYXV0QWx0UmVmXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc2MTgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzYxOCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9hdXRBbHRSZWZfOGxhZ18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg1NjAwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODU2MDAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfY2JyXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9OTQ0MTcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT05NDQxNyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9jcTBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzcwMix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NzAyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX2NxMTBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzcwMix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NzAyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX2NxMTZfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzcwMix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NzAyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX2NxMzJfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzcwMix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NzAyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX2NxNF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NzAyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc3MDIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfY3E2M18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTY5ODk4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9Njk4OTgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfZG93blNjYWxlXzEwX25vS2V5XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc2MTgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzYxOCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9kb3duU2NhbGVfMjBfbm9LZXlfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzYxOCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NjE4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX2Rvd25TY2FsZV81MF9ub0tleV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NjE4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc2MTgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfZG93blNjYWxlXzgwX25vS2V5XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc2MTgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzYxOCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9lcnJSZXNfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT05MTEzOCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTkxMTM4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX2tleUZybU9ubHlfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zOTk4NDksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zOTk4NDksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfbG9zc2xlc3NfMXgyLndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNzkzNDc2OCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9ub0tleUZybV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NjE4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc2MTgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfbm9uRXJyUmVzXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc2MTgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzYxOCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9RcDAtMTBfMXgyLndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMDU1MTM4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMzMxMTQsNyArMzMxMTQsNyBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNzkzNDc2OCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9RcDAtNjNfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzYxOCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NjE4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX1FwMTAtMjBfMXgyLndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA2MDE2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMzMxMjMsMTYzICszMzEyMywxNjMgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODk1ODcyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX1FwMzAtNDBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00Mjk2NDUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00Mjk2NDUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfUXAzMl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTY3NDg2OCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTY3NDg2OCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9RcDQwLTUwXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTkzNTk3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTkzNTk3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX1FwNTAtNjNfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04MDIwNCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTgwMjA0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX1FwNjNfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNzM4OCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE3Mzg4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX3NoYXJwMF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NjE4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc2MTgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfc2hhcnAxXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc1MjUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzUyNSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9zaGFycDJfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzM2Mix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3MzYyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX3NoYXJwM18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NTk1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc1OTUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfc2hhcnA0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc1MTUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzUxNSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9zaGFycDVfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzQ2NSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NDY1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX3NoYXJwNl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3MTk0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODcxOTQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfc2hhcnA3XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc1Mzcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzUzNyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9za2lwNWZybV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTc0NTA0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzQ1MDQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfdXBTY2FsZV8xMDBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzYxOCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NjE4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX3VwU2NhbGVfMTBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzYxOCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NjE4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX3VwU2NhbGVfMjBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzYxOCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NjE4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX3VwU2NhbGVfNTBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzYxOCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NjE4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX3Zicl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NjE4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc2MTgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl8xeDEud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3MzM5LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODczMzksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQ1OTI1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDU5MjUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl8yeDEud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NTQxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc1NDEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl8yeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQ3OTk5LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDc5OTksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl80eDEud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg4MDA2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODgwMDYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl80eDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NTE0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc1MTQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9hZGFwdFFDb21fMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04MDc4OSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTgwNzg5LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfYWRhcHRRVmFyXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODE0MzQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04MTQzNCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX2FybnJfMGZfMHNfMnRfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzQ0Myx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NDQzLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfYXJucl8wZl81c18xdF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NzQ1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc3NDUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9hcm5yXzBmXzVzXzJ0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODcyNDUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzI0NSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX2FybnJfMTVmXzBzXzJ0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODczMDgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzMwOCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX2FybnJfMTVmXzVzXzJ0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc0OTUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzQ5NSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX2FybnJfNWZfMHNfMnRfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04Nzc0NSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NzQ1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfYXJucl81Zl81c18ydF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NzQ1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc3NDUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9hcm5yXzVmXzVzXzN0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc3NDUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04Nzc0NSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX2F1dEFsdFJlZl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NTE0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc1MTQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9hdXRBbHRSZWZfOGxhZ18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg1NDU5LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODU0NTksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9jYnJfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT05NDQyOSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTk0NDI5LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfY3EwXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc1MTQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzUxNCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX2NxMTBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzUxNCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NTE0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfY3ExNl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NTE0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc1MTQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9jcTMyXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc1MTQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzUxNCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX2NxNF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NTE0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc1MTQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9jcTYzXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzAwNDksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03MDA0OSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX2Rvd25TY2FsZV8xMF9ub0tleV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NTE0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc1MTQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9kb3duU2NhbGVfMjBfbm9LZXlfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzUxNCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NTE0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfZG93blNjYWxlXzUwX25vS2V5XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc1MTQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzUxNCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX2Rvd25TY2FsZV84MF9ub0tleV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NTE0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc1MTQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9lcnJSZXNfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT05MTEzOCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTkxMTM4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfa2V5RnJtT25seV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM5OTg0OSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM5OTg0OSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX2xvc3NsZXNzXzF4Mi53ZWJtIj4KICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTc5MDM0MjUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9ub0tleUZybV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NTE0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc1MTQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9ub25FcnJSZXNfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzUxNCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NTE0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfUXAwLTEwXzF4Mi53ZWJtIj4KICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzA1NTU3MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTMzMjg4LDcgKzMzMjg4LDcgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTc5MDM0MjUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9RcDAtNjNfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzUxNCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NTE0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfUXAxMC0yMF8xeDIud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDYzMjMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0zMzI5NywyNTMgKzMzMjk3LDI1MyBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04OTU2Mjksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9RcDMwLTQwXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDI5ODAxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDI5ODAxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfUXAzMl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTY3NDk1MCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTY3NDk1MCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX1FwNDAtNTBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xOTMzNTcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xOTMzNTcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9RcDUwLTYzXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODEwNDEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04MTA0MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX1FwNjNfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNzcyNix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE3NzI2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfc2hhcnAwXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc1MTQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzUxNCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX3NoYXJwMV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3MzMwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODczMzAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9zaGFycDJfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzMyOCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3MzI4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfc2hhcnAzXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc0OTMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzQ5Myx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX3NoYXJwNF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NDM4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc0Mzgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9zaGFycDVfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzM0OCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3MzQ4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfc2hhcnA2XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODczMjQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzMyNCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX3NoYXJwN18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3Mzk3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODczOTcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9za2lwNWZybV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTc0NjUyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzQ2NTIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl91cFNjYWxlXzEwMF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NTE0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc1MTQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl91cFNjYWxlXzEwXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc1MTQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzUxNCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX3VwU2NhbGVfMjBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzUxNCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NTE0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfdXBTY2FsZV81MF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NTE0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc1MTQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl92YnJfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzUxNCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NTE0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTAyNHgxMDI0cDUwZjMyXzIwMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjQ5NDgsd2lkdGg9MTAyNCxoZWlnaHQ9MTAyNCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2NDk0OCx3aWR0aD0xMDI0LGhlaWdodD0xMDI0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTAyNHg1NzZwNTBmMzJfMTEwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg4MDI2LHdpZHRoPTEwMjQsaGVpZ2h0PTU3NixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg4MDI2LHdpZHRoPTEwMjQsaGVpZ2h0PTU3NixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzEwMjR4NzY4cDUwZjMyXzE1MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xMjA1NjEsd2lkdGg9MTAyNCxoZWlnaHQ9NzY4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTIwNTYxLHdpZHRoPTEwMjQsaGVpZ2h0PTc2OCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzEwODB4MTQ0MHA1MGYzMl8zMTAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9Mjc0MDc5LHdpZHRoPTEwODAsaGVpZ2h0PTE0NDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNzQwNzksd2lkdGg9MTA4MCxoZWlnaHQ9MTQ0MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzEwODB4MTZwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjE4MjYsd2lkdGg9MTA4MCxoZWlnaHQ9MTYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMTgyNix3aWR0aD0xMDgwLGhlaWdodD0xNixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzEwODB4MTkyMHA1MGYzMl80MTAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzMyMzQ1LHdpZHRoPTEwODAsaGVpZ2h0PTE5MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzIzNDUsd2lkdGg9MTA4MCxoZWlnaHQ9MTkyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzEwODB4NjRwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTk5Mjksd2lkdGg9MTA4MCxoZWlnaHQ9NjQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xOTkyOSx3aWR0aD0xMDgwLGhlaWdodD02NCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzEwODh4MTkyMHA1MGYzMl80MTAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzMzMDc3LHdpZHRoPTEwODgsaGVpZ2h0PTE5MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzMwNzcsd2lkdGg9MTA4OCxoZWlnaHQ9MTkyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzExNTJ4MjA0OHA1MGYzMl80NzAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzgxMzE2LHdpZHRoPTExNTIsaGVpZ2h0PTIwNDgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zODEzMTYsd2lkdGg9MTE1MixoZWlnaHQ9MjA0OCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzEyODB4MTI4MHA1MGYzMl8zMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjY2NTc1LHdpZHRoPTEyODAsaGVpZ2h0PTEyODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNjY1NzUsd2lkdGg9MTI4MCxoZWlnaHQ9MTI4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzEyODB4MTZwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjE1Nzgsd2lkdGg9MTI4MCxoZWlnaHQ9MTYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMTU3OCx3aWR0aD0xMjgwLGhlaWdodD0xNixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzEyODB4MTkyMHA1MGYzMl80OTAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDAwNjM3LHdpZHRoPTEyODAsaGVpZ2h0PTE5MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MDA2Mzcsd2lkdGg9MTI4MCxoZWlnaHQ9MTkyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzEyODB4NjRwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjA2OTgsd2lkdGg9MTI4MCxoZWlnaHQ9NjQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMDY5OCx3aWR0aD0xMjgwLGhlaWdodD02NCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzEyODB4NzIwcDUwZjMyXzE4MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNDQ1NDIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTQ0NTQyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzEyODB4OTYwcDUwZjMyXzI0MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMDU0MzUsd2lkdGg9MTI4MCxoZWlnaHQ9OTYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjA1NDM1LHdpZHRoPTEyODAsaGVpZ2h0PTk2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzEyOHgxMjhwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjEzODMsd2lkdGg9MTI4LGhlaWdodD0xMjgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMTM4Myx3aWR0aD0xMjgsaGVpZ2h0PTEyOCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzEyOHgxOTJwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjA4ODgsd2lkdGg9MTI4LGhlaWdodD0xOTIsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMDg4OCx3aWR0aD0xMjgsaGVpZ2h0PTE5MixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzEyOHg3MnA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMjMwNix3aWR0aD0xMjgsaGVpZ2h0PTcyLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjIzMDYsd2lkdGg9MTI4LGhlaWdodD03MixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzEyOHg5NnA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMzE3OCx3aWR0aD0xMjgsaGVpZ2h0PTk2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjMxNzgsd2lkdGg9MTI4LGhlaWdodD05NixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE0NDB4MTA4MHA1MGYzMl8zMTAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjY4Nzk4LHdpZHRoPTE0NDAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNjg3OTgsd2lkdGg9MTQ0MCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE0NDB4MTQ0MHA1MGYzMl80MTAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQyMDIwLHdpZHRoPTE0NDAsaGVpZ2h0PTE0NDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDIwMjAsd2lkdGg9MTQ0MCxoZWlnaHQ9MTQ0MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE0NDB4MTkyMHA1MGYzMl81NTAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDQ4ODY2LHdpZHRoPTE0NDAsaGVpZ2h0PTE5MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00NDg4NjYsd2lkdGg9MTQ0MCxoZWlnaHQ9MTkyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE0NDB4MjU2MHA1MGYzMl83MzAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NjYwNTQ4LHdpZHRoPTE0NDAsaGVpZ2h0PTI1NjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT02NjA1NDgsd2lkdGg9MTQ0MCxoZWlnaHQ9MjU2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE0NDB4OTYwcDUwZjMyXzI3MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMzE4NzYsd2lkdGg9MTQ0MCxoZWlnaHQ9OTYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjMxODc2LHdpZHRoPTE0NDAsaGVpZ2h0PTk2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE0NHgxNDRwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjEzNzUsd2lkdGg9MTQ0LGhlaWdodD0xNDQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMTM3NSx3aWR0aD0xNDQsaGVpZ2h0PTE0NCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE0NHgxNzZwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjA4Nzgsd2lkdGg9MTQ0LGhlaWdodD0xNzYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMDg3OCx3aWR0aD0xNDQsaGVpZ2h0PTE3NixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE0NHgxOTJwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjA2Njksd2lkdGg9MTQ0LGhlaWdodD0xOTIsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMDY2OSx3aWR0aD0xNDQsaGVpZ2h0PTE5MixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE0NHgyNTZwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTk3Njksd2lkdGg9MTQ0LGhlaWdodD0yNTYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xOTc2OSx3aWR0aD0xNDQsaGVpZ2h0PTI1NixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE0NHg5NnA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMzI0NCx3aWR0aD0xNDQsaGVpZ2h0PTk2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjMyNDQsd2lkdGg9MTQ0LGhlaWdodD05NixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE1MzZ4MjA0OHA1MGYzMl82MjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NTAxNDUyLHdpZHRoPTE1MzYsaGVpZ2h0PTIwNDgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT01MDE0NTIsd2lkdGg9MTUzNixoZWlnaHQ9MjA0OCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE2MHgyNDBwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTk1NTAsd2lkdGg9MTYwLGhlaWdodD0yNDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xOTU1MCx3aWR0aD0xNjAsaGVpZ2h0PTI0MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE2eDEwODBwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTc5MzM0LHdpZHRoPTE2LGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTc5MzM0LHdpZHRoPTE2LGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTZ4MTI4MHA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMTgzMjAsd2lkdGg9MTYsaGVpZ2h0PTEyODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMTgzMjAsd2lkdGg9MTYsaGVpZ2h0PTEyODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xNngxNnA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT05Nzk4LHdpZHRoPTE2LGhlaWdodD0xNixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTk3OTgsd2lkdGg9MTYsaGVpZ2h0PTE2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTZ4MTkyMHA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MDE4NDgsd2lkdGg9MTYsaGVpZ2h0PTE5MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MDE4NDgsd2lkdGg9MTYsaGVpZ2h0PTE5MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xNng3MjBwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTE1MzI2LHdpZHRoPTE2LGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xMTUzMjYsd2lkdGg9MTYsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE3MngxNzJwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjEwMjYsd2lkdGg9MTcyLGhlaWdodD0xNzIsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMTAyNix3aWR0aD0xNzIsaGVpZ2h0PTE3MixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE3NngxNDRwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjEzMDUsd2lkdGg9MTc2LGhlaWdodD0xNDQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMTMwNSx3aWR0aD0xNzYsaGVpZ2h0PTE0NCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE3Nng5NnA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMzYxNix3aWR0aD0xNzYsaGVpZ2h0PTk2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjM2MTYsd2lkdGg9MTc2LGhlaWdodD05NixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl80MTAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzYxODgyLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjE4ODIsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE5MjB4MTA4OHA1MGYzMl80MTAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzYzMzQ5LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjMzNDksd2lkdGg9MTkyMCxoZWlnaHQ9MTA4OCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE5MjB4MTI4MHA1MGYzMl80OTAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDEyOTI5LHdpZHRoPTE5MjAsaGVpZ2h0PTEyODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTI5Mjksd2lkdGg9MTkyMCxoZWlnaHQ9MTI4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE5MjB4MTQ0MHA1MGYzMl81NTAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDYyMzIwLHdpZHRoPTE5MjAsaGVpZ2h0PTE0NDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00NjIzMjAsd2lkdGg9MTkyMCxoZWlnaHQ9MTQ0MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE5MjB4MTZwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTk0NDksd2lkdGg9MTkyMCxoZWlnaHQ9MTYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xOTQ0OSx3aWR0aD0xOTIwLGhlaWdodD0xNixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE5MjB4MTkyMHA1MGYzMl83MzAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NTg5OTY0LHdpZHRoPTE5MjAsaGVpZ2h0PTE5MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT01ODk5NjQsd2lkdGg9MTkyMCxoZWlnaHQ9MTkyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE5MjB4MjU2MHA1MGYzMl85ODAwa2Jwcy53ZWJtIj4KICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODkzOTEzLHdpZHRoPTE5MjAsaGVpZ2h0PTI1NjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xOTIweDY0cDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2ODc2LHdpZHRoPTE5MjAsaGVpZ2h0PTY0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY4NzYsd2lkdGg9MTkyMCxoZWlnaHQ9NjQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xOTJ4MTI4cDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIxMDI0LHdpZHRoPTE5MixoZWlnaHQ9MTI4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjEwMjQsd2lkdGg9MTkyLGhlaWdodD0xMjgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xOTJ4MTQ0cDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIxNDQ4LHdpZHRoPTE5MixoZWlnaHQ9MTQ0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjE0NDgsd2lkdGg9MTkyLGhlaWdodD0xNDQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xOTJ4MTkycDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIwMzA1LHdpZHRoPTE5MixoZWlnaHQ9MTkyLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjAzMDUsd2lkdGg9MTkyLGhlaWdodD0xOTIsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xOTJ4MjU2cDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE5MTMwLHdpZHRoPTE5MixoZWlnaHQ9MjU2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTkxMzAsd2lkdGg9MTkyLGhlaWdodD0yNTYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xOTJ4Mjg4cDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE4ODExLHdpZHRoPTE5MixoZWlnaHQ9Mjg4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTg4MTEsd2lkdGg9MTkyLGhlaWdodD0yODgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8yMDQ4eDExNTJwNTBmMzJfNDcwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQwMzE1MSx3aWR0aD0yMDQ4LGhlaWdodD0xMTUyLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDAzMTUxLHdpZHRoPTIwNDgsaGVpZ2h0PTExNTIsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8yMDQ4eDE1MzZwNTBmMzJfNjIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTUxNTMxNix3aWR0aD0yMDQ4LGhlaWdodD0xNTM2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NTE1MzE2LHdpZHRoPTIwNDgsaGVpZ2h0PTE1MzYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8yMDQ4eDIwNDhwNTBmMzJfODMwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTY3MTg5NCx3aWR0aD0yMDQ4LGhlaWdodD0yMDQ4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NjcxODk0LHdpZHRoPTIwNDgsaGVpZ2h0PTIwNDgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8yMTYweDM4NDBwNTBmMzJfMTY1MDBrYnBzLndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNTQ0MTk2LHdpZHRoPTIxNjAsaGVpZ2h0PTM4NDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8yMTZ4Mjg4cDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE4NTYzLHdpZHRoPTIxNixoZWlnaHQ9Mjg4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTg1NjMsd2lkdGg9MjE2LGhlaWdodD0yODgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8yMzA0eDQwOTZwNTBmMzJfMTg4MDBrYnBzLndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNzg4MTA5LHdpZHRoPTIzMDQsaGVpZ2h0PTQwOTYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8yNDB4MTYwcDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE5ODQxLHdpZHRoPTI0MCxoZWlnaHQ9MTYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTk4NDEsd2lkdGg9MjQwLGhlaWdodD0xNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8yNDB4MjQwcDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE4NzYwLHdpZHRoPTI0MCxoZWlnaHQ9MjQwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTg3NjAsd2lkdGg9MjQwLGhlaWdodD0yNDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8yNDB4MzIwcDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MzU3LHdpZHRoPTI0MCxoZWlnaHQ9MzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzNTcsd2lkdGg9MjQwLGhlaWdodD0zMjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8yNDB4MzYwcDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2NDM3LHdpZHRoPTI0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY0Mzcsd2lkdGg9MjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8yNHgzMnA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjIzNSx3aWR0aD0yNCxoZWlnaHQ9MzIsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjIzNSx3aWR0aD0yNCxoZWlnaHQ9MzIsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8yNTYweDE0NDBwNTBmMzJfNzMwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTYyMDAzMCx3aWR0aD0yNTYwLGhlaWdodD0xNDQwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NjIwMDMwLHdpZHRoPTI1NjAsaGVpZ2h0PTE0NDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8yNTYweDE5MjBwNTBmMzJfOTgwMGticHMud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTc5ODAzNix3aWR0aD0yNTYwLGhlaWdodD0xOTIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMzM1NTUsMzQgKzMzNTU1LDM0IEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE4MzQ3ODUsd2lkdGg9MjU2MCxoZWlnaHQ9Mzg0MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI1NngxNDRwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjA2MDEsd2lkdGg9MjU2LGhlaWdodD0xNDQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMDYwMSx3aWR0aD0yNTYsaGVpZ2h0PTE0NCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI1NngxOTJwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTkwNzksd2lkdGg9MjU2LGhlaWdodD0xOTIsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xOTA3OSx3aWR0aD0yNTYsaGVpZ2h0PTE5MixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI1NngyNTZwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTg0ODcsd2lkdGg9MjU2LGhlaWdodD0yNTYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xODQ4Nyx3aWR0aD0yNTYsaGVpZ2h0PTI1NixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI2NHgzNTJwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY0NDUsd2lkdGg9MjY0LGhlaWdodD0zNTIsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjQ0NSx3aWR0aD0yNjQsaGVpZ2h0PTM1MixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI4ODB4Mzg0MHA1MGYzMl8yMjEwMGticHMud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIwODAwMTksd2lkdGg9Mjg4MCxoZWlnaHQ9Mzg0MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI4OHgxOTJwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTkxODIsd2lkdGg9Mjg4LGhlaWdodD0xOTIsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xOTE4Mix3aWR0aD0yODgsaGVpZ2h0PTE5MixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI4OHgyMTZwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTg5MDEsd2lkdGg9Mjg4LGhlaWdodD0yMTYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xODkwMSx3aWR0aD0yODgsaGVpZ2h0PTIxNixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI4OHgyODhwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTcxNzYsd2lkdGg9Mjg4LGhlaWdodD0yODgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNzE3Nix3aWR0aD0yODgsaGVpZ2h0PTI4OCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI4OHgzNTJwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzODAsd2lkdGg9Mjg4LGhlaWdodD0zNTIsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjM4MCx3aWR0aD0yODgsaGVpZ2h0PTM1MixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI4OHg1MTJwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTg2MTAsd2lkdGg9Mjg4LGhlaWdodD01MTIsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xODYxMCx3aWR0aD0yODgsaGVpZ2h0PTUxMixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzMwNzJ4NDA5NnA1MGYzMl8yNDAwMGticHMud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIzMjQ4NjUsd2lkdGg9MzA3MixoZWlnaHQ9NDA5NixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTMzNTkxLDYxICszMzU5MSw2MSBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMzE1NTQxLHdpZHRoPTMxMjAsaGVpZ2h0PTQxNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8zMjB4MjQwcDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE3NDI5LHdpZHRoPTMyMCxoZWlnaHQ9MjQwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTc0Mjksd2lkdGg9MzIwLGhlaWdodD0yNDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8zMjB4MzIwcDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2NDcxLHdpZHRoPTMyMCxoZWlnaHQ9MzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY0NzEsd2lkdGg9MzIwLGhlaWdodD0zMjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8zMjB4NDgwcDUwZjMyXzMwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI0MjUwLHdpZHRoPTMyMCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjQyNTAsd2lkdGg9MzIwLGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8zMngyNHA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNTU1MSx3aWR0aD0zMixoZWlnaHQ9MjQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNTU1MSx3aWR0aD0zMixoZWlnaHQ9MjQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8zMngzMnA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNTc5Mix3aWR0aD0zMixoZWlnaHQ9MzIsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNTc5Mix3aWR0aD0zMixoZWlnaHQ9MzIsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8zNTB4MzUwcDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE3MTI2LHdpZHRoPTM1MCxoZWlnaHQ9MzUwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTcxMjYsd2lkdGg9MzUwLGhlaWdodD0zNTAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8zNTJ4MjY0cDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2ODcxLHdpZHRoPTM1MixoZWlnaHQ9MjY0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY4NzEsd2lkdGg9MzUyLGhlaWdodD0yNjQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8zNTJ4Mjg4cDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2NTk0LHdpZHRoPTM1MixoZWlnaHQ9Mjg4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY1OTQsd2lkdGg9MzUyLGhlaWdodD0yODgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8zNTJ4MzUycDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE3MDU1LHdpZHRoPTM1MixoZWlnaHQ9MzUyLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTcwNTUsd2lkdGg9MzUyLGhlaWdodD0zNTIsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8zNTZ4NjM4cDUwZjMyXzgwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTcwMjI4LHdpZHRoPTM1NixoZWlnaHQ9NjM4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzAyMjgsd2lkdGg9MzU2LGhlaWdodD02MzgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8zNTZ4NjQwcDUwZjMyXzgwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTcwMjg3LHdpZHRoPTM1NixoZWlnaHQ9NjQwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzAyODcsd2lkdGg9MzU2LGhlaWdodD02NDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8zNTh4NjM2cDUwZjMyXzgwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTcwMjQ1LHdpZHRoPTM1OCxoZWlnaHQ9NjM2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzAyNDUsd2lkdGg9MzU4LGhlaWdodD02MzYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8zNTh4NjQwcDUwZjMyXzgwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTcwMzY4LHdpZHRoPTM1OCxoZWlnaHQ9NjQwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzAzNjgsd2lkdGg9MzU4LGhlaWdodD02NDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8zNjB4MjQwcDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2ODEwLHdpZHRoPTM2MCxoZWlnaHQ9MjQwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY4MTAsd2lkdGg9MzYwLGhlaWdodD0yNDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8zNjB4MzYwcDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE4MDY1LHdpZHRoPTM2MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTgwNjUsd2lkdGg9MzYwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8zNjB4NDgwcDUwZjMyXzMwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI0ODg2LHdpZHRoPTM2MCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjQ4ODYsd2lkdGg9MzYwLGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8zNjB4NjM2cDUwZjMyXzgwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTcwMjY1LHdpZHRoPTM2MCxoZWlnaHQ9NjM2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzAyNjUsd2lkdGg9MzYwLGhlaWdodD02MzYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8zNjB4NjM4cDUwZjMyXzgwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTcwMTY0LHdpZHRoPTM2MCxoZWlnaHQ9NjM4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzAxNjQsd2lkdGg9MzYwLGhlaWdodD02MzgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8zNjB4NjQwcDUwZjMyXzQwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMyNTIzLHdpZHRoPTM2MCxoZWlnaHQ9NjQwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzI1MjMsd2lkdGg9MzYwLGhlaWdodD02NDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8zODQweDIxNjBwNTBmMzJfMTY1MDBrYnBzLndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xMzQ2MzIzLHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0zMzY2MCw3ICszMzY2MCw3IEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIzMDM1MzYsd2lkdGg9Mzg0MCxoZWlnaHQ9Mzg0MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzM4NHg1MTJwNTBmMzJfMzAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjYzODcsd2lkdGg9Mzg0LGhlaWdodD01MTIsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNjM4Nyx3aWR0aD0zODQsaGVpZ2h0PTUxMixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzQwOTZ4MjMwNHA1MGYzMl8xODgwMGticHMud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE3ODkxNjAsd2lkdGg9NDA5NixoZWlnaHQ9MjMwNCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTMzNjg0LDE0OCArMzM2ODQsMTQ4IEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI1MzkzMzMsd2lkdGg9NDYwOCxoZWlnaHQ9ODE5MixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzQ3Mng0NzJwNTBmMzJfNDAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzI3MDAsd2lkdGg9NDcyLGhlaWdodD00NzIsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMjcwMCx3aWR0aD00NzIsaGVpZ2h0PTQ3MixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzQ4MHgzMjBwNTBmMzJfMzAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjQ0MzUsd2lkdGg9NDgwLGhlaWdodD0zMjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNDQzNSx3aWR0aD00ODAsaGVpZ2h0PTMyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzQ4MHgzNjBwNTBmMzJfMzAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjUxMzQsd2lkdGg9NDgwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNTEzNCx3aWR0aD00ODAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzQ4MHg0ODBwNTBmMzJfNDAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzI1ODQsd2lkdGg9NDgwLGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMjU4NCx3aWR0aD00ODAsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzQ4MHg2NDBwNTBmMzJfNjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDgzODIsd2lkdGg9NDgwLGhlaWdodD02NDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00ODM4Mix3aWR0aD00ODAsaGVpZ2h0PTY0MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzQ4MHg3MjBwNTBmMzJfNjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDgzNzksd2lkdGg9NDgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00ODM3OSx3aWR0aD00ODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzQ4MHg4NDhwNTBmMzJfODAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NjYyMDcsd2lkdGg9NDgwLGhlaWdodD04NDgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT02NjIwNyx3aWR0aD00ODAsaGVpZ2h0PTg0OCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzQ4eDY0cDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIxMzgxLHdpZHRoPTQ4LGhlaWdodD02NCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIxMzgxLHdpZHRoPTQ4LGhlaWdodD02NCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzUxMngyODhwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTkwMzUsd2lkdGg9NTEyLGhlaWdodD0yODgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xOTAzNSx3aWR0aD01MTIsaGVpZ2h0PTI4OCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzUxMngzODRwNTBmMzJfMzAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjYzNDEsd2lkdGg9NTEyLGhlaWdodD0zODQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNjM0MSx3aWR0aD01MTIsaGVpZ2h0PTM4NCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzUxMng1MTJwNTBmMzJfNTAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDA2NDMsd2lkdGg9NTEyLGhlaWdodD01MTIsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MDY0Myx3aWR0aD01MTIsaGVpZ2h0PTUxMixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzUyOHg3MDRwNTBmMzJfNzAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NTYzNjcsd2lkdGg9NTI4LGhlaWdodD03MDQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT01NjM2Nyx3aWR0aD01MjgsaGVpZ2h0PTcwNCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzU3NjB4NzY4MHA1MGYzMl8yNDAwMGticHMud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI1NzE4Njksd2lkdGg9NTc2MCxoZWlnaHQ9NzY4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzU3NngxMDI0cDUwZjMyXzExMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODc4OSx3aWR0aD01NzYsaGVpZ2h0PTEwMjQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODc4OSx3aWR0aD01NzYsaGVpZ2h0PTEwMjQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF81NzZ4NzA0cDUwZjMyXzgwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTY0MDAxLHdpZHRoPTU3NixoZWlnaHQ9NzA0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NjQwMDEsd2lkdGg9NTc2LGhlaWdodD03MDQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF81NzZ4NzIwcDUwZjMyXzgwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTY0MjQyLHdpZHRoPTU3NixoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NjQyNDIsd2lkdGg9NTc2LGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF82MDB4ODAwcDUwZjMyXzkwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTc0MTcxLHdpZHRoPTYwMCxoZWlnaHQ9ODAwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzQxNzEsd2lkdGg9NjAwLGhlaWdodD04MDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF82MTQ0eDgxOTJwNTBmMzJfMjQwMDBrYnBzLndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNTk2MjA2LHdpZHRoPTYxNDQsaGVpZ2h0PTgxOTIsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF82MzZ4MzU4cDUwZjMyXzgwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTc1Mjc2LHdpZHRoPTYzNixoZWlnaHQ9MzU4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzUyNzYsd2lkdGg9NjM2LGhlaWdodD0zNTgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF82MzZ4MzYwcDUwZjMyXzgwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTc1NTMzLHdpZHRoPTYzNixoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzU1MzMsd2lkdGg9NjM2LGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF82Mzh4MzU2cDUwZjMyXzgwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTc1NzUzLHdpZHRoPTYzOCxoZWlnaHQ9MzU2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzU3NTMsd2lkdGg9NjM4LGhlaWdodD0zNTYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF82Mzh4MzYwcDUwZjMyXzgwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTc1NjAyLHdpZHRoPTYzOCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzU2MDIsd2lkdGg9NjM4LGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF82NDB4MzU2cDUwZjMyXzgwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTc1Mjc5LHdpZHRoPTY0MCxoZWlnaHQ9MzU2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzUyNzksd2lkdGg9NjQwLGhlaWdodD0zNTYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF82NDB4MzU4cDUwZjMyXzQwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMyODA4LHdpZHRoPTY0MCxoZWlnaHQ9MzU4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzI4MDgsd2lkdGg9NjQwLGhlaWdodD0zNTgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF82NDB4MzYwcDUwZjMyXzQwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMyNDEzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzI0MTMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF82NDB4NDgwcDUwZjMyXzYwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQ4NDQ4LHdpZHRoPTY0MCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDg0NDgsd2lkdGg9NjQwLGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF82NDB4NjQwcDUwZjMyXzgwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTY0NDU0LHdpZHRoPTY0MCxoZWlnaHQ9NjQwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NjQ0NTQsd2lkdGg9NjQwLGhlaWdodD02NDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF82NDB4ODQ4cDUwZjMyXzEwMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04MTY4Myx3aWR0aD02NDAsaGVpZ2h0PTg0OCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTgxNjgzLHdpZHRoPTY0MCxoZWlnaHQ9ODQ4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNjQweDk2MHA1MGYzMl8xMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9OTcxOTQsd2lkdGg9NjQwLGhlaWdodD05NjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT05NzE5NCx3aWR0aD02NDAsaGVpZ2h0PTk2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzY0eDEwODBwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTg4MDYsd2lkdGg9NjQsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xODgwNix3aWR0aD02NCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzY0eDEyODBwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTkwMTEsd2lkdGg9NjQsaGVpZ2h0PTEyODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xOTAxMSx3aWR0aD02NCxoZWlnaHQ9MTI4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzY0eDE5MjBwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzOTYsd2lkdGg9NjQsaGVpZ2h0PTE5MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjM5Nix3aWR0aD02NCxoZWlnaHQ9MTkyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzY0eDQ4cDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIwNjA4LHdpZHRoPTY0LGhlaWdodD00OCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIwNjA4LHdpZHRoPTY0LGhlaWdodD00OCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzY0eDY0cDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIxMzUwLHdpZHRoPTY0LGhlaWdodD02NCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIxMzUwLHdpZHRoPTY0LGhlaWdodD02NCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzY0eDcyMHA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNzYxNix3aWR0aD02NCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTc2MTYsd2lkdGg9NjQsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzY0eDk2cDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI0Mzg5LHdpZHRoPTY0LGhlaWdodD05NixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI0Mzg5LHdpZHRoPTY0LGhlaWdodD05NixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzcwNHg1MjhwNTBmMzJfNzAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NTYzNDIsd2lkdGg9NzA0LGhlaWdodD01MjgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT01NjM0Mix3aWR0aD03MDQsaGVpZ2h0PTUyOCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzcwNHg1NzZwNTBmMzJfODAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NjM2ODEsd2lkdGg9NzA0LGhlaWdodD01NzYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT02MzY4MSx3aWR0aD03MDQsaGVpZ2h0PTU3NixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzcwNHg3MDRwNTBmMzJfOTAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzI1NDksd2lkdGg9NzA0LGhlaWdodD03MDQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03MjU0OSx3aWR0aD03MDQsaGVpZ2h0PTcwNCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzcyMHgxMjgwcDUwZjMyXzE4MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNTU2MDAsd2lkdGg9NzIwLGhlaWdodD0xMjgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTU1NjAwLHdpZHRoPTcyMCxoZWlnaHQ9MTI4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzcyMHgxNnA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMTQ1Myx3aWR0aD03MjAsaGVpZ2h0PTE2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjE0NTMsd2lkdGg9NzIwLGhlaWdodD0xNixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzcyMHg0ODBwNTBmMzJfNjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDg1MTQsd2lkdGg9NzIwLGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00ODUxNCx3aWR0aD03MjAsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzcyMHg1NzZwNTBmMzJfODAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NjM3Mjcsd2lkdGg9NzIwLGhlaWdodD01NzYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT02MzcyNyx3aWR0aD03MjAsaGVpZ2h0PTU3NixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzcyMHg2NHA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMDg4Myx3aWR0aD03MjAsaGVpZ2h0PTY0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjA4ODMsd2lkdGg9NzIwLGhlaWdodD02NCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzcyMHg3MjBwNTBmMzJfMTAwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTgwNTk5LHdpZHRoPTcyMCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODA1OTksd2lkdGg9NzIwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF83MjB4OTYwcDUwZjMyXzEzMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xMDU5MDAsd2lkdGg9NzIwLGhlaWdodD05NjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xMDU5MDAsd2lkdGg9NzIwLGhlaWdodD05NjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF83MngxMjhwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjI1MDQsd2lkdGg9NzIsaGVpZ2h0PTEyOCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIyNTA0LHdpZHRoPTcyLGhlaWdodD0xMjgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF83Mng5NnA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNDAyNSx3aWR0aD03MixoZWlnaHQ9OTYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNDAyNSx3aWR0aD03MixoZWlnaHQ9OTYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF83NjgweDQzMjBwNTBmMzJfMjQwMDBrYnBzLndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMjQ5MDQxLHdpZHRoPTc2ODAsaGVpZ2h0PTQzMjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0zMzgzNywxMyArMzM4MzcsMTMgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjUyMTQyNix3aWR0aD03NjgwLGhlaWdodD03NjgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNzY4eDEwMjRwNTBmMzJfMTUwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTEyMjExNCx3aWR0aD03NjgsaGVpZ2h0PTEwMjQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xMjIxMTQsd2lkdGg9NzY4LGhlaWdodD0xMDI0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfODAweDYwMHA1MGYzMl85MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03MjE5Mix3aWR0aD04MDAsaGVpZ2h0PTYwMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTcyMTkyLHdpZHRoPTgwMCxoZWlnaHQ9NjAwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfODAweDgwMHA1MGYzMl8xMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9OTkxOTIsd2lkdGg9ODAwLGhlaWdodD04MDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT05OTE5Mix3aWR0aD04MDAsaGVpZ2h0PTgwMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzgxOTJ4NDYwOHA1MGYzMl8yNDAwMGticHMud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMwOTMzNjIsd2lkdGg9ODE5MixoZWlnaHQ9NDYwOCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTMzODUyLDQ5ICszMzg1Miw0OSBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNTE2OTUzLHdpZHRoPTgxOTIsaGVpZ2h0PTgxOTIsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF84NDh4NDgwcDUwZjMyXzgwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTYzOTQyLHdpZHRoPTg0OCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NjM5NDIsd2lkdGg9ODQ4LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF84NDh4NjQwcDUwZjMyXzEwMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03OTc4Mix3aWR0aD04NDgsaGVpZ2h0PTY0MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTc5NzgyLHdpZHRoPTg0OCxoZWlnaHQ9NjQwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfODQ4eDg0OHA1MGYzMl8xNDAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTE3MTEwLHdpZHRoPTg0OCxoZWlnaHQ9ODQ4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTE3MTEwLHdpZHRoPTg0OCxoZWlnaHQ9ODQ4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfOHg4cDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMxNzcsd2lkdGg9OCxoZWlnaHQ9OCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMxNzcsd2lkdGg9OCxoZWlnaHQ9OCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzk2MHgxMjgwcDUwZjMyXzI0MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMDk2NDcsd2lkdGg9OTYwLGhlaWdodD0xMjgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjA5NjQ3LHdpZHRoPTk2MCxoZWlnaHQ9MTI4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzk2MHgxNDQwcDUwZjMyXzI3MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMzU4NTMsd2lkdGg9OTYwLGhlaWdodD0xNDQwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjM1ODUzLHdpZHRoPTk2MCxoZWlnaHQ9MTQ0MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzk2MHg2NDBwNTBmMzJfMTIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTk2ODI2LHdpZHRoPTk2MCxoZWlnaHQ9NjQwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9OTY4MjYsd2lkdGg9OTYwLGhlaWdodD02NDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF85NjB4NzIwcDUwZjMyXzEzMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xMDQwMzQsd2lkdGg9OTYwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xMDQwMzQsd2lkdGg9OTYwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF85NjB4OTYwcDUwZjMyXzE4MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNDgwNjcsd2lkdGg9OTYwLGhlaWdodD05NjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNDgwNjcsd2lkdGg9OTYwLGhlaWdodD05NjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF85NngxMjhwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjE2ODgsd2lkdGg9OTYsaGVpZ2h0PTEyOCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIxNjg4LHdpZHRoPTk2LGhlaWdodD0xMjgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF85NngxNDRwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjE3Nzksd2lkdGg9OTYsaGVpZ2h0PTE0NCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIxNzc5LHdpZHRoPTk2LGhlaWdodD0xNDQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF85NngxNzZwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjEzODQsd2lkdGg9OTYsaGVpZ2h0PTE3NixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIxMzg0LHdpZHRoPTk2LGhlaWdodD0xNzYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF85Nng2NHA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMzI3Nix3aWR0aD05NixoZWlnaHQ9NjQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMzI3Nix3aWR0aD05NixoZWlnaHQ9NjQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF85Nng3MnA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMTU5Nyx3aWR0aD05NixoZWlnaHQ9NzIsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMTU5Nyx3aWR0aD05NixoZWlnaHQ9NzIsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF85Nng5NnA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMzg5NCx3aWR0aD05NixoZWlnaHQ9OTYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMzg5NCx3aWR0aD05NixoZWlnaHQ9OTYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9iaXRyYXRlL2Nyb3dkXzEyODB4NzIwcDI0ZjMwMF8zMDAwa2Jwcy53ZWJtIj4KICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NTA0ODc0NCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0zMzk4NywxMTIgKzMzOTg3LDExMiBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xODMzMDU2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl8xeDEud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDcyNSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA3MjUsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDUxMSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA1MTEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDU2Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA1NjIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl8yeDEud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDQ0Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA0NDIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl8yeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDUxMSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA1MTEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl80eDEud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDQ5Nix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA0OTYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl80eDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDUxMSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA1MTEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl80eDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDU2Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA1NjIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9hZGFwdFFDb21fMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNTg0NTEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTU4NDUxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfYWRhcHRRVmFyXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTU5NDEyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE1OTQxMix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX2FybnJfMGZfMHNfMnRfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA2ODgsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNjg4LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfYXJucl8wZl81c18xdF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDUxNix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA1MTYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9hcm5yXzBmXzVzXzJ0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNTUwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDU1MCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX2FybnJfMTVmXzBzXzJ0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNjYwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDY2MCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX2FybnJfMTVmXzVzXzJ0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNzM1LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDczNSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX2FybnJfNWZfMHNfMnRfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA1ODQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNTg0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfYXJucl81Zl81c18ydF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDUxNix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA1MTYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9hcm5yXzVmXzVzXzN0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNTE2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDUxNix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX2F1dEFsdFJlZl8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDU2Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA1NjIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9hdXRBbHRSZWZfOGxhZ18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MjY3NCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjI2NzQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9jYnJfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjY1MjQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY2NTI0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfY3EwXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwMjMwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDIzMCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX2NxMTBfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjAyMzAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwMjMwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfY3ExNl8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDIzMCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjAyMzAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9jcTMyXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwMjMwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDIzMCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX2NxNF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDIzMCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjAyMzAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9jcTYzXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTM2NjU0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTEzNjY1NCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX2Rvd25TY2FsZV8xMF9ub0tleV8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDU2Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA1NjIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9kb3duU2NhbGVfMjBfbm9LZXlfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA1NjIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNTYyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfZG93blNjYWxlXzUwX25vS2V5XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNTYyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDU2Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX2Rvd25TY2FsZV84MF9ub0tleV8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDU2Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA1NjIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9lcnJSZXNfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjM0NTMsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzNDUzLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfa2V5RnJtT25seV8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTc0MDcyMyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03NDA3MjMsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9sb3NzbGVzc18xeDQud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI1NjM1NDY2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfbm9LZXlGcm1fMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA1NjIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNTYyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfbm9uRXJyUmVzXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNTYyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDU2Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX1FwMC0xMF8xeDQud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTUyODk0MDgsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMzQxMDEsNyArMzQxMDEsNyBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNTYzNTQ2Nix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX1FwMC02M18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDU2Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA1NjIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9RcDEwLTIwXzF4NC53ZWJtIj4KICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjgyOTQ5Nyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0zNDExNiwxNTcgKzM0MTE2LDE1NyBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xMjQxODU3LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfUXA0MC01MF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM3MDA4Myx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNzAwODMsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9RcDUwLTYzXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNDY5LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDQ2OSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX1FwNjNfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MDAwNCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MDAwNCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX3NoYXJwMF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDU2Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA1NjIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9zaGFycDFfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA4NzYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwODc2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfc2hhcnAyXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNzA5LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDcwOSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX3NoYXJwM18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDY3Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA2NzIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9zaGFycDRfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA2NTYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNjU2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfc2hhcnA1XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwODk3LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDg5Nyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX3NoYXJwNl8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDgxOSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA4MTksd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9zaGFycDdfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA2OTAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNjkwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfc2tpcDVmcm1fMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xMzQ4MTEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTM0ODExLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfdXBTY2FsZV8xMDBfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA1NjIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNTYyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfdXBTY2FsZV8xMF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDU2Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA1NjIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl91cFNjYWxlXzIwXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNTYyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDU2Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX3VwU2NhbGVfNTBfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA1NjIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNTYyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfdmJyXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNTYyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDU2Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfMXgxLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjAzMTMsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwMzEzLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDA2NSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjAwNjUsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNTcwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDU3MCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfMngxLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA0NDgsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNDQ4LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl8yeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDA2NSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjAwNjUsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyXzJ4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNTcxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDU3MSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfNHgxLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA3NDgsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNzQ4LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl80eDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDA2NSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjAwNjUsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyXzR4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNTcxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDU3MSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfYWRhcHRRQ29tXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTU4NTQ5LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE1ODU0OSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfYWRhcHRRVmFyXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTU5NTk0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE1OTU5NCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfYXJucl8wZl8wc18ydF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE1OTk3OCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNTk5Nzgsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX2FybnJfMGZfNXNfMnRfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA3ODEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNzgxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl9hcm5yXzE1Zl8wc18ydF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDU2NCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA1NjQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX2FybnJfMTVmXzVzXzJ0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwMjc0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDI3NCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfYXJucl81Zl81c18zdF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDI0NSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjAyNDUsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX2F1dEFsdFJlZl8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDU3MSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA1NzEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX2F1dEFsdFJlZl84bGFnXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYyNjU4LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MjY1OCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfY2JyXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY3NTQyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2NzU0Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfY3EwXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNzgzLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDc4Myx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfY3ExMF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDc4Myx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA3ODMsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX2NxMTZfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA3ODMsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNzgzLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl9jcTMyXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNzgzLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDc4Myx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfY3E0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNzgzLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDc4Myx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfY3E2M18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTEzNjMzNix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xMzYzMzYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX2Rvd25TY2FsZV8xMF9ub0tleV8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDU3MSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA1NzEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX2Rvd25TY2FsZV8yMF9ub0tleV8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDU3MSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA1NzEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX2Rvd25TY2FsZV81MF9ub0tleV8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDU3MSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA1NzEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX2Rvd25TY2FsZV84MF9ub0tleV8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDU3MSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA1NzEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX2VyclJlc18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MzQ1Myx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjM0NTMsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX2tleUZybU9ubHlfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03NDA3MjMsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzQwNzIzLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl9sb3NzbGVzc18xeDQud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI1NjExMjIxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl9ub0tleUZybV8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDU3MSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA1NzEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX25vbkVyclJlc18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDU3MSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA1NzEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX1FwMC0xMF8xeDQud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTUyOTE0ODUsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMzQyNzUsNyArMzQyNzUsNyBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNTYxMTIyMSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfUXAwLTYzXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNTcxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDU3MSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfUXAxMC0yMF8xeDQud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI4MjkwOTgsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMzQyODQsMTQyICszNDI4NCwxNDIgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9Nzk4OTIyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl9RcDUwLTYzXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwODg4LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDg4OCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfUXA2M18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQwMzEwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQwMzEwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl9zaGFycDBfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA1NzEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNTcxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl9zaGFycDFfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA4MzIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwODMyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl9zaGFycDJfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA3MjQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNzI0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl9zaGFycDNfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA5MDYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwOTA2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl9zaGFycDRfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA1Nzcsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNTc3LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl9zaGFycDVfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA0MzQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNDM0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl9zaGFycDZfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjAxOTMsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwMTkzLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl9zaGFycDdfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA3Nzksd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNzc5LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl9za2lwNWZybV8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTEzNDkyNix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xMzQ5MjYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX3VwU2NhbGVfMTBfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA1NzEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNTcxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl91cFNjYWxlXzIwXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNTcxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDU3MSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfdXBTY2FsZV81MF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDU3MSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA1NzEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX3Zicl8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDU3MSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA1NzEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyXzF4MS53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM0MTE0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzQxMTQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNDMyNCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM0MzI0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfMngxLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzQzMTMsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNDMxMyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyXzJ4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM0MzI0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzQzMjQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl8yeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNDg5Nyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM0ODk3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfNHgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzQzMjQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNDMyNCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyXzR4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM0ODk3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzQ4OTcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9hZGFwdFFDb21fMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMTg1MjIsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMxODUyMix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX2FkYXB0UVZhcl8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMxOTA4MCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzE5MDgwLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfYXJucl8wZl8wc18ydF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNDAzMSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM0MDMxLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfYXJucl8wZl81c18xdF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNjA0OSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM2MDQ5LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfYXJucl8wZl81c18ydF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNDYxNyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM0NjE3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfYXJucl8xNWZfMHNfMnRfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzQ3MTIsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNDcxMix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX2FybnJfMTVmXzVzXzJ0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM0NzY3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzQ3Njcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9hcm5yXzVmXzBzXzJ0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM2MDQ5LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzYwNDksd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9hcm5yXzVmXzVzXzJ0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM2MDQ5LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzYwNDksd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9hcm5yXzVmXzVzXzN0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM2MDQ5LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzYwNDksd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9hdXRBbHRSZWZfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzQ4OTcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNDg5Nyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX2F1dEFsdFJlZl84bGFnXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzI4NTk4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMjg1OTgsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9jYnJfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDcwMDYsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0NzAwNix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX2NxMF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNDg5Nyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM0ODk3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfY3ExMF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNDg5Nyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM0ODk3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfY3ExNl8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNDg5Nyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM0ODk3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfY3EzMl8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNDg5Nyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM0ODk3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfY3E0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM0ODk3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzQ4OTcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9jcTYzXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjY1OTExLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNjU5MTEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9kb3duU2NhbGVfMTBfbm9LZXlfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzQ4OTcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNDg5Nyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX2Rvd25TY2FsZV8yMF9ub0tleV8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNDg5Nyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM0ODk3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfZG93blNjYWxlXzUwX25vS2V5XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM0ODk3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzQ4OTcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9kb3duU2NhbGVfODBfbm9LZXlfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzQ4OTcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNDg5Nyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX2VyclJlc18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0NjMyMCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ2MzIwLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfa2V5RnJtT25seV8xeDQud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTEzMjU4ODYsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTM0NDI4LDEwICszNDQyOCwxMCBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT02MDE1MDE5OSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX25vS2V5RnJtXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM0ODk3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzQ4OTcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9ub25FcnJSZXNfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzQ4OTcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNDg5Nyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX1FwMC0xMF8xeDQud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTExNzQ4OTQ4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0zNDQ0MCw3ICszNDQ0MCw3IEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTYwMTUwMTk5LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfUXAwLTYzXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM0ODk3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzQ4OTcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9RcDEwLTIwXzF4NC53ZWJtIj4KICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDg4MjY2OCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMzQ0NTUsMTQ4ICszNDQ1NSwxNDggQEAKICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjE2MzA4MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX1FwNDAtNTBfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT02NzEwNjcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTY3MTA2Nyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX1FwNTAtNjNfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMTc3NDksd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMxNzc0OSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX1FwNjNfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NjEwOCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODYxMDgsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9zaGFycDBfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzQ4OTcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNDg5Nyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX3NoYXJwMV8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNTAwMSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM1MDAxLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfc2hhcnAyXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM2MDk5LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzYwOTksd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9zaGFycDNfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzUwMTgsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNTAxOCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX3NoYXJwNF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNDc5MCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM0NzkwLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfc2hhcnA1XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM0OTc2LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzQ5NzYsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9zaGFycDZfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzQyODUsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNDI4NSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX3NoYXJwN18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNDk2Nyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM0OTY3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfc2tpcDVmcm1fMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yODI1NDksd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI4MjU0OSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX3VwU2NhbGVfMTAwXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM0ODk3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzQ4OTcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl91cFNjYWxlXzEwXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM0ODk3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzQ4OTcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl91cFNjYWxlXzIwXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM0ODk3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzQ4OTcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl91cFNjYWxlXzUwXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM0ODk3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzQ4OTcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl92YnJfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzQ4OTcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNDg5Nyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfMXgxLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzQyOTcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNDI5Nyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzQ3NDIsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNDc0Mix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfMngxLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzQ0OTcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNDQ5Nyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfMngyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzQ3NDIsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNDc0Mix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfNHgxLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzQ4OTEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNDg5MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfNHgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzQ3NDIsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNDc0Mix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfNHg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzU1Njcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNTU2Nyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfYWRhcHRRQ29tXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzE4NDg2LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMTg0ODYsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX2FkYXB0UVZhcl8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMxOTEwNCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzE5MTA0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9hcm5yXzBmXzBzXzJ0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM0MjQyLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzQyNDIsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX2FybnJfMGZfNXNfMXRfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzQ4NjIsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNDg2Mix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfYXJucl8wZl81c18ydF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNTE5MCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM1MTkwLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9hcm5yXzE1Zl8wc18ydF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNDkwOCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM0OTA4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9hcm5yXzE1Zl81c18ydF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzMzcyOSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzMzNzI5LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9hcm5yXzVmXzBzXzJ0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM0ODYyLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzQ4NjIsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX2FybnJfNWZfNXNfMnRfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzQ4NjIsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNDg2Mix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfYXJucl81Zl81c18zdF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNDg2Mix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM0ODYyLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9hdXRBbHRSZWZfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzU1Njcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNTU2Nyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfYXV0QWx0UmVmXzhsYWdfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMjg0MzQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMyODQzNCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfY2JyXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ3MTc2LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDcxNzYsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX2NxMF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNTU2Nyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM1NTY3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9jcTEwXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM1NTY3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzU1Njcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX2NxMTZfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzU1Njcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNTU2Nyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfY3EzMl8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNTU2Nyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM1NTY3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9jcTRfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzU1Njcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNTU2Nyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfY3E2M18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI2MjI0Mix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjYyMjQyLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9kb3duU2NhbGVfMTBfbm9LZXlfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzU1Njcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNTU2Nyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfZG93blNjYWxlXzIwX25vS2V5XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM1NTY3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzU1Njcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX2Rvd25TY2FsZV81MF9ub0tleV8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNTU2Nyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM1NTY3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9kb3duU2NhbGVfODBfbm9LZXlfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzU1Njcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNTU2Nyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfZXJyUmVzXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ2MzIwLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDYzMjAsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX2tleUZybU9ubHlfMXg0LndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xMzI1ODg3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0zNDYwNSwxMCArMzQ2MDUsMTAgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NTk3NjcyNzMsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX25vS2V5RnJtXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM1NTY3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzU1Njcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX25vbkVyclJlc18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNTU2Nyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM1NTY3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9RcDAtMTBfMXg0LndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xMTc0NDM3MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMzQ2MTcsNyArMzQ2MTcsNyBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT01OTc2NzI3Myx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfUXAwLTYzXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM1NTY3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzU1Njcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX1FwMTAtMjBfMXg0LndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00ODc5OTY2LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0zNDYzMiw1NSArMzQ2MzIsNTUgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjE2MTM0Nyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfUXA0MC01MF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTY3MTIyMix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NjcxMjIyLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9RcDUwLTYzXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzE3NzY1LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMTc3NjUsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX1FwNjNfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzAwMix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODcwMDIsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX3NoYXJwMF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNTU2Nyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM1NTY3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9zaGFycDFfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzUxNTcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNTE1Nyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfc2hhcnAyXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM1MjYzLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzUyNjMsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX3NoYXJwM18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNTExOSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM1MTE5LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9zaGFycDRfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzQ2MDcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNDYwNyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfc2hhcnA1XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM1NTg1LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzU1ODUsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX3NoYXJwNl8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNDgxNSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM0ODE1LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9zaGFycDdfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzQ4MTUsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNDgxNSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfc2tpcDVmcm1fMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yODE4ODQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI4MTg4NCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfdXBTY2FsZV8xMDBfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzU1Njcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNTU2Nyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfdXBTY2FsZV8xMF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNTU2Nyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM1NTY3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl91cFNjYWxlXzIwXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM1NTY3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzU1Njcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX3VwU2NhbGVfNTBfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzU1Njcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNTU2Nyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfdmJyXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM1NTY3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzU1Njcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8zODQweDIxNjBwNTBmMzIvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyX2ZybVBhcl8xeDEud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTk0NzY2Mix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMzQ3NzAsNyArMzQ3NzAsNyBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT05NDgxOTcsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8zODQweDIxNjBwNTBmMzIvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyX2ZybVBhcl9jcTYzXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NjkzNjgxLHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT02OTM2ODEsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8zODQweDIxNjBwNTBmMzIvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyX2ZybVBhcl9kb3duU2NhbGVfMTBfbm9LZXlfMXg0LndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT05NDgxOTcsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTM0ODI3LDcgKzM0ODI3LDcgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODgwNTAwLHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl9mcm1QYXJfUXA2M18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI3MjQ0OSx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjcyNDQ5LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl9mcm1QYXJfc2hhcnAwXzF4NC53ZWJtIj4KICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9OTQ4MTk3LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0zNDk1Niw3ICszNDk1Niw3IEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTk0ODc0Mix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMi9jcm93ZF8zODQweDIxNjBwNTBmMzJfbm9Gcm1QYXJfY3E2M18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTY5Mzc1MCx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NjkzNzUwLHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl9ub0ZybVBhcl9kb3duU2NhbGVfMTBfbm9LZXlfMXg0LndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT05NDg3NDIsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTM1MDEzLDcgKzM1MDEzLDcgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODgyNDU3LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl9ub0ZybVBhcl9RcDYzXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjczODMzLHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNzM4MzMsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF8zODQweDIxNjBwNTBmMzIvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyX25vRnJtUGFyX3NoYXJwMF8xeDQud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTk0ODc0Mix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMzUwNTgsMTA2ICszNTA1OCwxMDYgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9OTQ4NzQyLHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl8xeDEud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQwNzQwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDA3NDAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxMDUzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDEwNTMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl8yeDEud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQwNzk3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDA3OTcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl8yeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxMDUzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDEwNTMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl80eDEud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQwNzQyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDA3NDIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl80eDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxMDUzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDEwNTMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9hZGFwdFFDb21fMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MDA2Nyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQwMDY3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfYWRhcHRRVmFyXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDA2MTEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MDYxMSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX2FybnJfMGZfMHNfMnRfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MDk3NSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQwOTc1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfYXJucl8wZl81c18xdF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxMDQ2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDEwNDYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9hcm5yXzBmXzVzXzJ0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDA5MjQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MDkyNCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX2FybnJfMTVmXzBzXzJ0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDA3MTEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MDcxMSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX2FybnJfMTVmXzVzXzJ0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDEwMjMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTAyMyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX2FybnJfNWZfMHNfMnRfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTA0Nix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxMDQ2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfYXJucl81Zl81c18ydF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxMDQ2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDEwNDYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9hcm5yXzVmXzVzXzN0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDEwNDYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTA0Nix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX2F1dEFsdFJlZl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxMDUzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDEwNTMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9hdXRBbHRSZWZfOGxhZ18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxNzE3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE3MTcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9jYnJfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00NDQ2OSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQ0NDY5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfY3EwXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE0Njgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTQ2OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX2NxMTBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTQ2OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxNDY4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfY3ExNl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxNDY4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE0Njgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9jcTMyXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE0Njgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTQ2OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX2NxNF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxNDY4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE0Njgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9jcTYzXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzcxMzAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNzEzMCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX2Rvd25TY2FsZV8xMF9ub0tleV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxMDUzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDEwNTMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9kb3duU2NhbGVfMjBfbm9LZXlfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTA1Myx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxMDUzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfZG93blNjYWxlXzUwX25vS2V5XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDEwNTMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTA1Myx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX2Rvd25TY2FsZV84MF9ub0tleV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxMDUzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDEwNTMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9lcnJSZXNfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjI4Mix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyMjgyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfa2V5RnJtT25seV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI0MDkyOSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI0MDkyOSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX2xvc3NsZXNzXzF4Mi53ZWJtIj4KICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NjE3MDMzMCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX25vS2V5RnJtXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDEwNTMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTA1Myx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX25vbkVyclJlc18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxMDUzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDEwNTMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9RcDAtMTBfMXgyLndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjQ3NTQ5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMzUxNjYsMTcyICszNTE2NiwxNzIgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NjE3MDMzMCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX1FwMC02M18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxMDUzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDEwNTMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9RcDEwLTIwXzF4Mi53ZWJtIj4KICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9OTYxMTk3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfUXAyMC0zMF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTU0ODExNix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTU0ODExNix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX1FwMzAtNDBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNjMwMjAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNjMwMjAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9RcDMyXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE2MzkwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE2MzkwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfUXA0MC01MF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTExNTA5MCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTExNTA5MCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX1FwNTAtNjNfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MDg3NSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQwODc1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfUXA2M18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTkzNjQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT05MzY0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfc2hhcnAwXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDEwNTMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTA1Myx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX3NoYXJwMV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQwODM4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDA4Mzgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9zaGFycDJfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTA0OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxMDQ4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfc2hhcnAzXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDA3OTUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MDc5NSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX3NoYXJwNF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQwNTk3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDA1OTcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9zaGFycDVfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MDc1NCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQwNzU0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfc2hhcnA2XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDA2OTgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MDY5OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX3NoYXJwN18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQwOTg5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDA5ODksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9za2lwNWZybV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1NDg2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzU0ODYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl91cFNjYWxlXzEwMF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxMDUzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDEwNTMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl91cFNjYWxlXzEwXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDEwNTMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTA1Myx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX3VwU2NhbGVfMjBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTA1Myx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxMDUzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfdXBTY2FsZV81MF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxMDUzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDEwNTMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl92YnJfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTA1Myx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxMDUzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl8xeDEud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQwNzUxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDA3NTEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDEwNTgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTA1OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfMngxLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MDc3OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQwNzc4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl8yeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxMDU4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDEwNTgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyXzR4MS53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDA5NTUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MDk1NSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfNHgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNTkwNyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE1OTA3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9hZGFwdFFDb21fMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MDEyNyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQwMTI3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9hZGFwdFFWYXJfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MDM4OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQwMzg4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9hcm5yXzBmXzBzXzJ0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDA4NTUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MDg1NSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfYXJucl8wZl81c18xdF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQwODUwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDA4NTAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX2FybnJfMGZfNXNfMnRfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MDg5NSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQwODk1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9hcm5yXzE1Zl8wc18ydF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxMDcwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDEwNzAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX2FybnJfMTVmXzVzXzJ0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDExMzYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTEzNix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfYXJucl81Zl8wc18ydF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQwODUwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDA4NTAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX2FybnJfNWZfNXNfMnRfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MDg1MCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQwODUwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9hcm5yXzVmXzVzXzN0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDA4NTAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MDg1MCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfYXV0QWx0UmVmXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDEwNTgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTA1OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfYXV0QWx0UmVmXzhsYWdfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTY5MCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxNjkwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9jYnJfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00NDEyMCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQ0MTIwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9jcTBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTMxMyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxMzEzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9jcTEwXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDEzMTMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTMxMyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfY3ExNl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxMzEzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDEzMTMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX2NxMzJfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTMxMyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxMzEzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9jcTRfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTMxMyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxMzEzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9jcTYzXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzcwODEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNzA4MSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfZG93blNjYWxlXzEwX25vS2V5XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDEwNTgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTA1OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfZG93blNjYWxlXzIwX25vS2V5XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDEwNTgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTA1OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfZG93blNjYWxlXzUwX25vS2V5XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDEwNTgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTA1OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfZG93blNjYWxlXzgwX25vS2V5XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDEwNTgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTA1OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfZXJyUmVzXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIyODIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjI4Mix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfa2V5RnJtT25seV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI0MDkyOSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI0MDkyOSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfbG9zc2xlc3NfMXgyLndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT02MTcwODUzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9ub0tleUZybV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxMDU4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDEwNTgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX25vbkVyclJlc18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxMDU4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDEwNTgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX1FwMC0xMF8xeDIud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2NDc5MTQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0zNTM0MCwxNzIgKzM1MzQwLDE3MiBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT02MTcwODUzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9RcDAtNjNfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTA1OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxMDU4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9RcDEwLTIwXzF4Mi53ZWJtIj4KICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9OTYxMjY4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9RcDIwLTMwXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NTQ2NTk0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NTQ2NTk0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9RcDMwLTQwXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjYyMTg0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjYyMTg0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9RcDMyXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE2MjMwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE2MjMwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9RcDQwLTUwXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTE0OTIxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTE0OTIxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9RcDUwLTYzXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDEwMzcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTAzNyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfUXA2M18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTk1NjQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT05NTY0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9zaGFycDBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTA1OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxMDU4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9zaGFycDFfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MDg1OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQwODU4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9zaGFycDJfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MDkyMix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQwOTIyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9zaGFycDNfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MDc3NCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQwNzc0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9zaGFycDRfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MDg3Myx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQwODczLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9zaGFycDVfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MDc3NSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQwNzc1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9zaGFycDZfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MDkyMyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQwOTIzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9zaGFycDdfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MDYwNCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQwNjA0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9za2lwNWZybV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1NDcyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzU0NzIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX3VwU2NhbGVfMTAwXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDEwNTgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTA1OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfdXBTY2FsZV8xMF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxMDU4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDEwNTgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX3VwU2NhbGVfMjBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTA1OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxMDU4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl91cFNjYWxlXzUwXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDEwNTgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTA1OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfdmJyXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDEwNTgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTA1OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyXzF4MS53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODQxODIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NDE4Mix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODQyNDEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NDI0MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyXzJ4MS53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODQ3OTcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NDc5Nyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyXzJ4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODQyNDEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NDI0MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyXzR4MS53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODQ3MDgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NDcwOCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyXzR4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODQyNDEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NDI0MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX2FkYXB0UUNvbV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTgwNTY4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODA1Njgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9hZGFwdFFWYXJfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04MDMxNix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTgwMzE2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfYXJucl8wZl8wc18ydF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg0MDU0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODQwNTQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9hcm5yXzBmXzVzXzF0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODQzNjQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NDM2NCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX2FybnJfMGZfNXNfMnRfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04MzkxNSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTgzOTE1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfYXJucl8xNWZfMHNfMnRfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04Mzk4NCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTgzOTg0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfYXJucl8xNWZfNXNfMnRfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NDI1MCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg0MjUwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfYXJucl81Zl8wc18ydF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg0MzY0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODQzNjQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9hcm5yXzVmXzVzXzJ0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODQzNjQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NDM2NCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX2FybnJfNWZfNXNfM3RfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NDM2NCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg0MzY0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfYXV0QWx0UmVmXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODQyNDEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NDI0MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX2F1dEFsdFJlZl84bGFnXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODMyNjMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04MzI2Myx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX2Nicl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTkwMTU3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9OTAxNTcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9jcTBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04MzYxNix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTgzNjE2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfY3ExMF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTgzNjE2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODM2MTYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9jcTE2XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODM2MTYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04MzYxNix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX2NxMzJfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04MzYxNix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTgzNjE2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfY3E0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODM2MTYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04MzYxNix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX2NxNjNfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03MDEzMix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTcwMTMyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfZG93blNjYWxlXzEwX25vS2V5XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODQyNDEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NDI0MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX2Rvd25TY2FsZV8yMF9ub0tleV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg0MjQxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODQyNDEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9kb3duU2NhbGVfNTBfbm9LZXlfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NDI0MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg0MjQxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfZG93blNjYWxlXzgwX25vS2V5XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODQyNDEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NDI0MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX2VyclJlc18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3ODk4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc4OTgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9rZXlGcm1Pbmx5XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9Mzg5NjU1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9Mzg5NjU1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfbG9zc2xlc3NfMXgyLndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xMTE1NDMyNix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX25vS2V5RnJtXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODQyNDEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NDI0MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX25vbkVyclJlc18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg0MjQxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODQyNDEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9RcDAtMTBfMXgyLndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNzczNjg2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMzU1MTQsNyArMzU1MTQsNyBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xMTE1NDMyNix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX1FwMC02M18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg0MjQxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODQyNDEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9RcDEwLTIwXzF4Mi53ZWJtIj4KICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTU3MzE5Mix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTM1NTIzLDE2MyArMzU1MjMsMTYzIEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg5MDcyMSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX1FwMzAtNDBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjkyMDIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjkyMDIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9RcDMyXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9Njc0OTU2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9Njc0OTU2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfUXA0MC01MF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE5MjgwMix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE5MjgwMix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX1FwNTAtNjNfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04MDIzNCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTgwMjM0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfUXA2M18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE3MDYwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTcwNjAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9zaGFycDBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NDI0MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg0MjQxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfc2hhcnAxXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODQxMTAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NDExMCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX3NoYXJwMl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTgzOTAyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODM5MDIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9zaGFycDNfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NDIzNyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg0MjM3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfc2hhcnA0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODQyNzUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NDI3NSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX3NoYXJwNV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg0NTU2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODQ1NTYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9zaGFycDZfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NDE5Mix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg0MTkyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfc2hhcnA3XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODQzMDEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NDMwMSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX3NraXA1ZnJtXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzEzNTMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03MTM1Myx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX3VwU2NhbGVfMTAwXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODQyNDEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NDI0MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX3VwU2NhbGVfMTBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NDI0MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg0MjQxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfdXBTY2FsZV8yMF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg0MjQxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODQyNDEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl91cFNjYWxlXzUwXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODQyNDEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NDI0MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX3Zicl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg0MjQxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODQyNDEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyXzF4MS53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODQxODQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NDE4NCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04MzkzNCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTgzOTM0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl8yeDEud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg0NDYzLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODQ0NjMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyXzJ4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODM5MzQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04MzkzNCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfNHgxLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NDY3MCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg0NjcwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl80eDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTU0MTAwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NTQxMDAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX2FkYXB0UUNvbV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTgwNTY3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODA1Njcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX2FkYXB0UVZhcl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTgwMjc0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODAyNzQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX2FybnJfMGZfMHNfMnRfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NDU2MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg0NTYxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9hcm5yXzBmXzVzXzF0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODQ2NDgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NDY0OCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfYXJucl8wZl81c18ydF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTgzNzE2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODM3MTYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX2FybnJfMTVmXzBzXzJ0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODM2NDEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04MzY0MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfYXJucl8xNWZfNXNfMnRfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NDQ5Nix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg0NDk2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9hcm5yXzVmXzBzXzJ0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODQ2NDgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NDY0OCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfYXJucl81Zl81c18ydF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg0NjQ4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODQ2NDgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX2FybnJfNWZfNXNfM3RfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NDY0OCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg0NjQ4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9hdXRBbHRSZWZfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04MzkzNCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTgzOTM0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9hdXRBbHRSZWZfOGxhZ18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTgyNDM3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODI0Mzcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX2Nicl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTkwNTQxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9OTA1NDEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX2NxMF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg0MDU2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODQwNTYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX2NxMTBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NDA1Nix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg0MDU2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9jcTE2XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODQwNTYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NDA1Nix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfY3EzMl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg0MDU2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODQwNTYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX2NxNF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg0MDU2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODQwNTYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX2NxNjNfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03MDA2Mix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTcwMDYyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9kb3duU2NhbGVfMTBfbm9LZXlfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04MzkzNCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTgzOTM0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9kb3duU2NhbGVfMjBfbm9LZXlfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04MzkzNCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTgzOTM0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9kb3duU2NhbGVfNTBfbm9LZXlfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04MzkzNCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTgzOTM0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9kb3duU2NhbGVfODBfbm9LZXlfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04MzkzNCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTgzOTM0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9lcnJSZXNfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04Nzg5OCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3ODk4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9rZXlGcm1Pbmx5XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9Mzg5NjU1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9Mzg5NjU1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9sb3NzbGVzc18xeDIud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTExMTI5ODA3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9ub0tleUZybV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTgzOTM0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODM5MzQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX25vbkVyclJlc18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTgzOTM0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODM5MzQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX1FwMC0xMF8xeDIud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI3NzI0NzAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0zNTY4OCw3ICszNTY4OCw3IEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTExMTI5ODA3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9RcDAtNjNfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04MzkzNCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTgzOTM0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9RcDEwLTIwXzF4Mi53ZWJtIj4KICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTU3MzA4MCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTM1Njk3LDI1NiArMzU2OTcsMjU2IEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg5MDE4MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfUXAzMC00MF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyODg2Myx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyODg2Myx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfUXAzMl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTY3MzY1Mix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTY3MzY1Mix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfUXA0MC01MF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE5MjA1OSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE5MjA1OSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfUXA1MC02M18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTgwMzEyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODAzMTIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX1FwNjNfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNzM5MCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE3MzkwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9zaGFycDBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04MzkzNCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTgzOTM0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9zaGFycDFfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NDIzNyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg0MjM3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9zaGFycDJfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04Mzg4MCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTgzODgwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9zaGFycDNfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04Mzk0Nix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTgzOTQ2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9zaGFycDRfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04MzkyMCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTgzOTIwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9zaGFycDVfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NDI3MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg0MjcxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9zaGFycDZfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04MzkyNSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTgzOTI1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9zaGFycDdfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NDA4OSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg0MDg5LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9za2lwNWZybV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTcxNDQ2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzE0NDYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX3VwU2NhbGVfMTAwXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODM5MzQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04MzkzNCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfdXBTY2FsZV8xMF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTgzOTM0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODM5MzQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX3VwU2NhbGVfMjBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04MzkzNCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTgzOTM0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl91cFNjYWxlXzUwXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODM5MzQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04MzkzNCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfdmJyXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODM5MzQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04MzkzNCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMTAyNHgxMDI0cDUwZjMyXzIwMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjEzMDMsd2lkdGg9MTAyNCxoZWlnaHQ9MTAyNCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MTMwMyx3aWR0aD0xMDI0LGhlaWdodD0xMDI0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xMDI0eDU3NnA1MGYzMl8xMTAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODg0Nzksd2lkdGg9MTAyNCxoZWlnaHQ9NTc2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODg0Nzksd2lkdGg9MTAyNCxoZWlnaHQ9NTc2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xMDI0eDc2OHA1MGYzMl8xNTAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTIwMjg4LHdpZHRoPTEwMjQsaGVpZ2h0PTc2OCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTEyMDI4OCx3aWR0aD0xMDI0LGhlaWdodD03NjgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzEwODB4MTQ0MHA1MGYzMl8zMTAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjU5NDUyLHdpZHRoPTEwODAsaGVpZ2h0PTE0NDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNTk0NTIsd2lkdGg9MTA4MCxoZWlnaHQ9MTQ0MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMTA4MHgxNnA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMTU1OCx3aWR0aD0xMDgwLGhlaWdodD0xNixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIxNTU4LHdpZHRoPTEwODAsaGVpZ2h0PTE2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xMDgweDE5MjBwNTBmMzJfNDEwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMyNjE5Myx3aWR0aD0xMDgwLGhlaWdodD0xOTIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzI2MTkzLHdpZHRoPTEwODAsaGVpZ2h0PTE5MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzEwODB4NjRwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTk4NjUsd2lkdGg9MTA4MCxoZWlnaHQ9NjQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xOTg2NSx3aWR0aD0xMDgwLGhlaWdodD02NCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMTA4OHgxOTIwcDUwZjMyXzQxMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMjU5NzQsd2lkdGg9MTA4OCxoZWlnaHQ9MTkyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMyNTk3NCx3aWR0aD0xMDg4LGhlaWdodD0xOTIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xMTUyeDIwNDhwNTBmMzJfNDcwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM3MzczMyx3aWR0aD0xMTUyLGhlaWdodD0yMDQ4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzczNzMzLHdpZHRoPTExNTIsaGVpZ2h0PTIwNDgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzEyODB4MTI4MHA1MGYzMl8zMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjU3NTg4LHdpZHRoPTEyODAsaGVpZ2h0PTEyODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNTc1ODgsd2lkdGg9MTI4MCxoZWlnaHQ9MTI4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMTI4MHgxNnA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMTI0Nyx3aWR0aD0xMjgwLGhlaWdodD0xNixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIxMjQ3LHdpZHRoPTEyODAsaGVpZ2h0PTE2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xMjgweDE5MjBwNTBmMzJfNDkwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM4OTczNix3aWR0aD0xMjgwLGhlaWdodD0xOTIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9Mzg5NzM2LHdpZHRoPTEyODAsaGVpZ2h0PTE5MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzEyODB4NjRwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjA2MzAsd2lkdGg9MTI4MCxoZWlnaHQ9NjQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMDYzMCx3aWR0aD0xMjgwLGhlaWdodD02NCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMTI4MHg3MjBwNTBmMzJfMTgwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE0NDA1OCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNDQwNTgsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xMjgweDk2MHA1MGYzMl8yNDAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTk1MzU3LHdpZHRoPTEyODAsaGVpZ2h0PTk2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE5NTM1Nyx3aWR0aD0xMjgwLGhlaWdodD05NjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzEyOHgxMjhwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjEyNzgsd2lkdGg9MTI4LGhlaWdodD0xMjgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMTI3OCx3aWR0aD0xMjgsaGVpZ2h0PTEyOCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMTI4eDE5MnA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMDE5OCx3aWR0aD0xMjgsaGVpZ2h0PTE5MixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIwMTk4LHdpZHRoPTEyOCxoZWlnaHQ9MTkyLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xMjh4NzJwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjI1MjEsd2lkdGg9MTI4LGhlaWdodD03MixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIyNTIxLHdpZHRoPTEyOCxoZWlnaHQ9NzIsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzEyOHg5NnA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMjU2MSx3aWR0aD0xMjgsaGVpZ2h0PTk2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjI1NjEsd2lkdGg9MTI4LGhlaWdodD05NixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMTQ0MHgxMDgwcDUwZjMyXzMxMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNTkyNzAsd2lkdGg9MTQ0MCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI1OTI3MCx3aWR0aD0xNDQwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xNDQweDE0NDBwNTBmMzJfNDEwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMyNjY0NSx3aWR0aD0xNDQwLGhlaWdodD0xNDQwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzI2NjQ1LHdpZHRoPTE0NDAsaGVpZ2h0PTE0NDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE0NDB4MTkyMHA1MGYzMl81NTAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDM3MjQ5LHdpZHRoPTE0NDAsaGVpZ2h0PTE5MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MzcyNDksd2lkdGg9MTQ0MCxoZWlnaHQ9MTkyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMTQ0MHgyNTYwcDUwZjMyXzczMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT02NTY4NTEsd2lkdGg9MTQ0MCxoZWlnaHQ9MjU2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTY1Njg1MSx3aWR0aD0xNDQwLGhlaWdodD0yNTYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xNDQweDk2MHA1MGYzMl8yNzAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjIxNTYxLHdpZHRoPTE0NDAsaGVpZ2h0PTk2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIyMTU2MSx3aWR0aD0xNDQwLGhlaWdodD05NjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE0NHgxNDRwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjE0NTEsd2lkdGg9MTQ0LGhlaWdodD0xNDQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMTQ1MSx3aWR0aD0xNDQsaGVpZ2h0PTE0NCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMTQ0eDE3NnA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMDIzNyx3aWR0aD0xNDQsaGVpZ2h0PTE3NixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIwMjM3LHdpZHRoPTE0NCxoZWlnaHQ9MTc2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xNDR4MTkycDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE5NTUwLHdpZHRoPTE0NCxoZWlnaHQ9MTkyLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTk1NTAsd2lkdGg9MTQ0LGhlaWdodD0xOTIsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE0NHgyNTZwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTkyOTEsd2lkdGg9MTQ0LGhlaWdodD0yNTYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xOTI5MSx3aWR0aD0xNDQsaGVpZ2h0PTI1NixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMTQ0eDk2cDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIyMTkxLHdpZHRoPTE0NCxoZWlnaHQ9OTYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMjE5MSx3aWR0aD0xNDQsaGVpZ2h0PTk2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xNTM2eDIwNDhwNTBmMzJfNjIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQ5MjU1OCx3aWR0aD0xNTM2LGhlaWdodD0yMDQ4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDkyNTU4LHdpZHRoPTE1MzYsaGVpZ2h0PTIwNDgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE2MHgyNDBwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTkwOTQsd2lkdGg9MTYwLGhlaWdodD0yNDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xOTA5NCx3aWR0aD0xNjAsaGVpZ2h0PTI0MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMTZ4MTA4MHA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xODg4NzUsd2lkdGg9MTYsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xODg4NzUsd2lkdGg9MTYsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE2eDEyODBwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjI5MjczLHdpZHRoPTE2LGhlaWdodD0xMjgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjI5MjczLHdpZHRoPTE2LGhlaWdodD0xMjgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xNngxNnA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT02MjkyLHdpZHRoPTE2LGhlaWdodD0xNixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTYyOTIsd2lkdGg9MTYsaGVpZ2h0PTE2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xNngxOTIwcDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyMTU2OCx3aWR0aD0xNixoZWlnaHQ9MTkyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyMTU2OCx3aWR0aD0xNixoZWlnaHQ9MTkyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMTZ4NzIwcDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTEyMjIxMix3aWR0aD0xNixoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTIyMjEyLHdpZHRoPTE2LGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE3MngxNzJwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTk5Nzcsd2lkdGg9MTcyLGhlaWdodD0xNzIsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xOTk3Nyx3aWR0aD0xNzIsaGVpZ2h0PTE3MixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMTc2eDE0NHA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMTA0MSx3aWR0aD0xNzYsaGVpZ2h0PTE0NCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIxMDQxLHdpZHRoPTE3NixoZWlnaHQ9MTQ0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xNzZ4OTZwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjI1NDIsd2lkdGg9MTc2LGhlaWdodD05NixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIyNTQyLHdpZHRoPTE3NixoZWlnaHQ9OTYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl80MTAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ0ODQ0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDQ4NDQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMTkyMHgxMDg4cDUwZjMyXzQxMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDYyOTYsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4OCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0NjI5Nix3aWR0aD0xOTIwLGhlaWdodD0xMDg4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xOTIweDEyODBwNTBmMzJfNDkwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM5MzIxNyx3aWR0aD0xOTIwLGhlaWdodD0xMjgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzkzMjE3LHdpZHRoPTE5MjAsaGVpZ2h0PTEyODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE5MjB4MTQ0MHA1MGYzMl81NTAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDM3NzExLHdpZHRoPTE5MjAsaGVpZ2h0PTE0NDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00Mzc3MTEsd2lkdGg9MTkyMCxoZWlnaHQ9MTQ0MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMTkyMHgxNnA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xODE1OCx3aWR0aD0xOTIwLGhlaWdodD0xNixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE4MTU4LHdpZHRoPTE5MjAsaGVpZ2h0PTE2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xOTIweDE5MjBwNTBmMzJfNzMwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTU3OTIxOSx3aWR0aD0xOTIwLGhlaWdodD0xOTIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NTc5MjE5LHdpZHRoPTE5MjAsaGVpZ2h0PTE5MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE5MjB4MjU2MHA1MGYzMl85ODAwa2Jwcy53ZWJtIj4KICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODgzNDgxLHdpZHRoPTE5MjAsaGVpZ2h0PTI1NjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE5MjB4NjRwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzNTgsd2lkdGg9MTkyMCxoZWlnaHQ9NjQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjM1OCx3aWR0aD0xOTIwLGhlaWdodD02NCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMTkyeDEyOHA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMTEwMyx3aWR0aD0xOTIsaGVpZ2h0PTEyOCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIxMTAzLHdpZHRoPTE5MixoZWlnaHQ9MTI4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xOTJ4MTQ0cDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIxMTAzLHdpZHRoPTE5MixoZWlnaHQ9MTQ0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjExMDMsd2lkdGg9MTkyLGhlaWdodD0xNDQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE5MngxOTJwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTk1NzAsd2lkdGg9MTkyLGhlaWdodD0xOTIsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xOTU3MCx3aWR0aD0xOTIsaGVpZ2h0PTE5MixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMTkyeDI1NnA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xODY5NSx3aWR0aD0xOTIsaGVpZ2h0PTI1NixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE4Njk1LHdpZHRoPTE5MixoZWlnaHQ9MjU2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xOTJ4Mjg4cDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE4NTk4LHdpZHRoPTE5MixoZWlnaHQ9Mjg4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTg1OTgsd2lkdGg9MTkyLGhlaWdodD0yODgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzIwNDh4MTE1MnA1MGYzMl80NzAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzgyMjE1LHdpZHRoPTIwNDgsaGVpZ2h0PTExNTIsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zODIyMTUsd2lkdGg9MjA0OCxoZWlnaHQ9MTE1MixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMjA0OHgxNTM2cDUwZjMyXzYyMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00OTMxOTQsd2lkdGg9MjA0OCxoZWlnaHQ9MTUzNixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQ5MzE5NCx3aWR0aD0yMDQ4LGhlaWdodD0xNTM2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8yMDQ4eDIwNDhwNTBmMzJfODMwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTY1ODI2OSx3aWR0aD0yMDQ4LGhlaWdodD0yMDQ4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NjU4MjY5LHdpZHRoPTIwNDgsaGVpZ2h0PTIwNDgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzIxNjB4Mzg0MHA1MGYzMl8xNjUwMGticHMud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE1MjIzMDIsd2lkdGg9MjE2MCxoZWlnaHQ9Mzg0MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMjE2eDI4OHA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xODMwMCx3aWR0aD0yMTYsaGVpZ2h0PTI4OCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE4MzAwLHdpZHRoPTIxNixoZWlnaHQ9Mjg4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8yMzA0eDQwOTZwNTBmMzJfMTg4MDBrYnBzLndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNzMwOTg3LHdpZHRoPTIzMDQsaGVpZ2h0PTQwOTYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI0MHgxNjBwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTk0NTQsd2lkdGg9MjQwLGhlaWdodD0xNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xOTQ1NCx3aWR0aD0yNDAsaGVpZ2h0PTE2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMjQweDI0MHA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xODQ4Myx3aWR0aD0yNDAsaGVpZ2h0PTI0MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE4NDgzLHdpZHRoPTI0MCxoZWlnaHQ9MjQwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8yNDB4MzIwcDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MzEzLHdpZHRoPTI0MCxoZWlnaHQ9MzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzMTMsd2lkdGg9MjQwLGhlaWdodD0zMjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI0MHgzNjBwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzNjIsd2lkdGg9MjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjM2Mix3aWR0aD0yNDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMjR4MzJwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTUyNDAsd2lkdGg9MjQsaGVpZ2h0PTMyLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTUyNDAsd2lkdGg9MjQsaGVpZ2h0PTMyLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8yNTYweDE0NDBwNTBmMzJfNzMwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTU4MDU1Myx3aWR0aD0yNTYwLGhlaWdodD0xNDQwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NTgwNTUzLHdpZHRoPTI1NjAsaGVpZ2h0PTE0NDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI1NjB4MTkyMHA1MGYzMl85ODAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9Nzc2NjMwLHdpZHRoPTI1NjAsaGVpZ2h0PTE5MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03NzY2MzAsd2lkdGg9MjU2MCxoZWlnaHQ9MTkyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMjU2MHgyNTYwcDUwZjMyXzEzMTAwa2Jwcy53ZWJtIj4KICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTE5OTEyNyx3aWR0aD0yNTYwLGhlaWdodD0yNTYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMzU5NTUsMzQgKzM1OTU1LDM0IEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE4MDUxNzQsd2lkdGg9MjU2MCxoZWlnaHQ9Mzg0MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMjU2eDE0NHA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xOTU0OSx3aWR0aD0yNTYsaGVpZ2h0PTE0NCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE5NTQ5LHdpZHRoPTI1NixoZWlnaHQ9MTQ0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8yNTZ4MTkycDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE4NzQ1LHdpZHRoPTI1NixoZWlnaHQ9MTkyLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTg3NDUsd2lkdGg9MjU2LGhlaWdodD0xOTIsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI1NngyNTZwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTgxMjUsd2lkdGg9MjU2LGhlaWdodD0yNTYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xODEyNSx3aWR0aD0yNTYsaGVpZ2h0PTI1NixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMjY0eDM1MnA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjQzMSx3aWR0aD0yNjQsaGVpZ2h0PTM1MixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2NDMxLHdpZHRoPTI2NCxoZWlnaHQ9MzUyLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8yODgweDM4NDBwNTBmMzJfMjIxMDBrYnBzLndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMDg1ODgwLHdpZHRoPTI4ODAsaGVpZ2h0PTM4NDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI4OHgxOTJwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTg0NDcsd2lkdGg9Mjg4LGhlaWdodD0xOTIsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xODQ0Nyx3aWR0aD0yODgsaGVpZ2h0PTE5MixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMjg4eDIxNnA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xODA5NSx3aWR0aD0yODgsaGVpZ2h0PTIxNixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE4MDk1LHdpZHRoPTI4OCxoZWlnaHQ9MjE2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8yODh4Mjg4cDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE3MDc4LHdpZHRoPTI4OCxoZWlnaHQ9Mjg4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTcwNzgsd2lkdGg9Mjg4LGhlaWdodD0yODgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI4OHgzNTJwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY2MzYsd2lkdGg9Mjg4LGhlaWdodD0zNTIsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjYzNix3aWR0aD0yODgsaGVpZ2h0PTM1MixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMjg4eDUxMnA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xODg0Nyx3aWR0aD0yODgsaGVpZ2h0PTUxMixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE4ODQ3LHdpZHRoPTI4OCxoZWlnaHQ9NTEyLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8zMDcyeDQwOTZwNTBmMzJfMjQwMDBrYnBzLndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMjYyMTA4LHdpZHRoPTMwNzIsaGVpZ2h0PTQwOTYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0zNTk5MSw2MSArMzU5OTEsNjEgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjI4MjMzOSx3aWR0aD0zMTIwLGhlaWdodD00MTYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8zMjB4MjQwcDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE3MjY1LHdpZHRoPTMyMCxoZWlnaHQ9MjQwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTcyNjUsd2lkdGg9MzIwLGhlaWdodD0yNDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzMyMHgzMjBwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY0NzIsd2lkdGg9MzIwLGhlaWdodD0zMjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjQ3Mix3aWR0aD0zMjAsaGVpZ2h0PTMyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMzIweDQ4MHA1MGYzMl8zMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNDU2Myx3aWR0aD0zMjAsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI0NTYzLHdpZHRoPTMyMCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8zMngyNHA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNDUzNyx3aWR0aD0zMixoZWlnaHQ9MjQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNDUzNyx3aWR0aD0zMixoZWlnaHQ9MjQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzMyeDMycDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MTAzLHdpZHRoPTMyLGhlaWdodD0zMixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MTAzLHdpZHRoPTMyLGhlaWdodD0zMixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMzUweDM1MHA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNzIyOCx3aWR0aD0zNTAsaGVpZ2h0PTM1MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE3MjI4LHdpZHRoPTM1MCxoZWlnaHQ9MzUwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8zNTJ4MjY0cDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2NTU5LHdpZHRoPTM1MixoZWlnaHQ9MjY0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY1NTksd2lkdGg9MzUyLGhlaWdodD0yNjQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzM1MngyODhwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY1Mzksd2lkdGg9MzUyLGhlaWdodD0yODgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjUzOSx3aWR0aD0zNTIsaGVpZ2h0PTI4OCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMzUyeDM1MnA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNzMwNSx3aWR0aD0zNTIsaGVpZ2h0PTM1MixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE3MzA1LHdpZHRoPTM1MixoZWlnaHQ9MzUyLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8zNTZ4NjM4cDUwZjMyXzgwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTY2NDUzLHdpZHRoPTM1NixoZWlnaHQ9NjM4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NjY0NTMsd2lkdGg9MzU2LGhlaWdodD02MzgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzM1Nng2NDBwNTBmMzJfODAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NjY2MzYsd2lkdGg9MzU2LGhlaWdodD02NDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT02NjYzNix3aWR0aD0zNTYsaGVpZ2h0PTY0MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMzU4eDYzNnA1MGYzMl84MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT02NjYzNyx3aWR0aD0zNTgsaGVpZ2h0PTYzNixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTY2NjM3LHdpZHRoPTM1OCxoZWlnaHQ9NjM2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8zNTh4NjQwcDUwZjMyXzgwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTY2NjY0LHdpZHRoPTM1OCxoZWlnaHQ9NjQwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NjY2NjQsd2lkdGg9MzU4LGhlaWdodD02NDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzM2MHgyNDBwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY3NDYsd2lkdGg9MzYwLGhlaWdodD0yNDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjc0Nix3aWR0aD0zNjAsaGVpZ2h0PTI0MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMzYweDM2MHA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xODA4NCx3aWR0aD0zNjAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE4MDg0LHdpZHRoPTM2MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8zNjB4NDgwcDUwZjMyXzMwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI1MDY4LHdpZHRoPTM2MCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjUwNjgsd2lkdGg9MzYwLGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzM2MHg2MzZwNTBmMzJfODAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NjY5NDEsd2lkdGg9MzYwLGhlaWdodD02MzYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT02Njk0MSx3aWR0aD0zNjAsaGVpZ2h0PTYzNixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMzYweDYzOHA1MGYzMl84MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT02NjU0Myx3aWR0aD0zNjAsaGVpZ2h0PTYzOCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTY2NTQzLHdpZHRoPTM2MCxoZWlnaHQ9NjM4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8zNjB4NjQwcDUwZjMyXzQwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMyNDMxLHdpZHRoPTM2MCxoZWlnaHQ9NjQwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzI0MzEsd2lkdGg9MzYwLGhlaWdodD02NDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl8xNjUwMGticHMud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTEzMDU3MjAsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTM2MDYwLDcgKzM2MDYwLDcgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjI3OTEwOCx3aWR0aD0zODQwLGhlaWdodD0zODQwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8zODR4NTEycDUwZjMyXzMwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI2MzY5LHdpZHRoPTM4NCxoZWlnaHQ9NTEyLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjYzNjksd2lkdGg9Mzg0LGhlaWdodD01MTIsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzQwOTZ4MjMwNHA1MGYzMl8xODgwMGticHMud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE3NjkyNDAsd2lkdGg9NDA5NixoZWlnaHQ9MjMwNCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTM2MDg0LDE0OCArMzYwODQsMTQ4IEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI2NDc5OTIsd2lkdGg9NDYwOCxoZWlnaHQ9ODE5MixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfNDcyeDQ3MnA1MGYzMl80MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMjQ4NCx3aWR0aD00NzIsaGVpZ2h0PTQ3MixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMyNDg0LHdpZHRoPTQ3MixoZWlnaHQ9NDcyLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF80ODB4MzIwcDUwZjMyXzMwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI0NDczLHdpZHRoPTQ4MCxoZWlnaHQ9MzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjQ0NzMsd2lkdGg9NDgwLGhlaWdodD0zMjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzQ4MHgzNjBwNTBmMzJfMzAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjUzMjYsd2lkdGg9NDgwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNTMyNix3aWR0aD00ODAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfNDgweDQ4MHA1MGYzMl80MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMjc3Mix3aWR0aD00ODAsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMyNzcyLHdpZHRoPTQ4MCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF80ODB4NjQwcDUwZjMyXzYwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQ4MDQxLHdpZHRoPTQ4MCxoZWlnaHQ9NjQwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDgwNDEsd2lkdGg9NDgwLGhlaWdodD02NDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzQ4MHg3MjBwNTBmMzJfNjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDg1NTEsd2lkdGg9NDgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00ODU1MSx3aWR0aD00ODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfNDgweDg0OHA1MGYzMl84MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT02NDI4Myx3aWR0aD00ODAsaGVpZ2h0PTg0OCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTY0MjgzLHdpZHRoPTQ4MCxoZWlnaHQ9ODQ4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF80OHg2NHA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMTE5Myx3aWR0aD00OCxoZWlnaHQ9NjQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMTE5Myx3aWR0aD00OCxoZWlnaHQ9NjQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzUxMngyODhwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTkwMjksd2lkdGg9NTEyLGhlaWdodD0yODgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xOTAyOSx3aWR0aD01MTIsaGVpZ2h0PTI4OCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfNTEyeDM4NHA1MGYzMl8zMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNjM4Myx3aWR0aD01MTIsaGVpZ2h0PTM4NCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI2MzgzLHdpZHRoPTUxMixoZWlnaHQ9Mzg0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF81MTJ4NTEycDUwZjMyXzUwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQwNTQwLHdpZHRoPTUxMixoZWlnaHQ9NTEyLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDA1NDAsd2lkdGg9NTEyLGhlaWdodD01MTIsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzUyOHg3MDRwNTBmMzJfNzAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NTYzOTgsd2lkdGg9NTI4LGhlaWdodD03MDQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT01NjM5OCx3aWR0aD01MjgsaGVpZ2h0PTcwNCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfNTc2MHg3NjgwcDUwZjMyXzI0MDAwa2Jwcy53ZWJtIj4KICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjcxMjQ2Mix3aWR0aD01NzYwLGhlaWdodD03NjgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF81NzZ4MTAyNHA1MGYzMl8xMTAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODgzNzIsd2lkdGg9NTc2LGhlaWdodD0xMDI0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODgzNzIsd2lkdGg9NTc2LGhlaWdodD0xMDI0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF81NzZ4NzA0cDUwZjMyXzgwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTY0MTc5LHdpZHRoPTU3NixoZWlnaHQ9NzA0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NjQxNzksd2lkdGg9NTc2LGhlaWdodD03MDQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzU3Nng3MjBwNTBmMzJfODAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NjM4Njgsd2lkdGg9NTc2LGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT02Mzg2OCx3aWR0aD01NzYsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfNjAweDgwMHA1MGYzMl85MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03MjIzMyx3aWR0aD02MDAsaGVpZ2h0PTgwMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTcyMjMzLHdpZHRoPTYwMCxoZWlnaHQ9ODAwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF82MTQ0eDgxOTJwNTBmMzJfMjQwMDBrYnBzLndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNzEzMTUxLHdpZHRoPTYxNDQsaGVpZ2h0PTgxOTIsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzYzNngzNThwNTBmMzJfODAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzUwNDcsd2lkdGg9NjM2LGhlaWdodD0zNTgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03NTA0Nyx3aWR0aD02MzYsaGVpZ2h0PTM1OCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfNjM2eDM2MHA1MGYzMl84MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03NTQxNix3aWR0aD02MzYsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTc1NDE2LHdpZHRoPTYzNixoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF82Mzh4MzU2cDUwZjMyXzgwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTc1MzIwLHdpZHRoPTYzOCxoZWlnaHQ9MzU2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzUzMjAsd2lkdGg9NjM4LGhlaWdodD0zNTYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzYzOHgzNjBwNTBmMzJfODAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzQ4Mjksd2lkdGg9NjM4LGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03NDgyOSx3aWR0aD02MzgsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfNjQweDM1NnA1MGYzMl84MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03NTU1NSx3aWR0aD02NDAsaGVpZ2h0PTM1NixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTc1NTU1LHdpZHRoPTY0MCxoZWlnaHQ9MzU2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF82NDB4MzU4cDUwZjMyXzQwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzMjA3LHdpZHRoPTY0MCxoZWlnaHQ9MzU4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzMyMDcsd2lkdGg9NjQwLGhlaWdodD0zNTgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzY0MHgzNjBwNTBmMzJfNDAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzI4MzUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMjgzNSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfNjQweDQ4MHA1MGYzMl82MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00ODUyNix3aWR0aD02NDAsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQ4NTI2LHdpZHRoPTY0MCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF82NDB4NjQwcDUwZjMyXzgwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTYzNzYyLHdpZHRoPTY0MCxoZWlnaHQ9NjQwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NjM3NjIsd2lkdGg9NjQwLGhlaWdodD02NDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzY0MHg4NDhwNTBmMzJfMTAwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTgwMjc2LHdpZHRoPTY0MCxoZWlnaHQ9ODQ4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODAyNzYsd2lkdGg9NjQwLGhlaWdodD04NDgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzY0MHg5NjBwNTBmMzJfMTIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTk2MjAyLHdpZHRoPTY0MCxoZWlnaHQ9OTYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9OTYyMDIsd2lkdGg9NjQwLGhlaWdodD05NjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzY0eDEwODBwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTg1NjIsd2lkdGg9NjQsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xODU2Mix3aWR0aD02NCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfNjR4MTI4MHA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xODYyMix3aWR0aD02NCxoZWlnaHQ9MTI4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE4NjIyLHdpZHRoPTY0LGhlaWdodD0xMjgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF82NHgxOTIwcDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MzQyLHdpZHRoPTY0LGhlaWdodD0xOTIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzNDIsd2lkdGg9NjQsaGVpZ2h0PTE5MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzY0eDQ4cDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIxMzAxLHdpZHRoPTY0LGhlaWdodD00OCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIxMzAxLHdpZHRoPTY0LGhlaWdodD00OCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfNjR4NjRwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjE1OTcsd2lkdGg9NjQsaGVpZ2h0PTY0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjE1OTcsd2lkdGg9NjQsaGVpZ2h0PTY0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF82NHg3MjBwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTc5MjAsd2lkdGg9NjQsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE3OTIwLHdpZHRoPTY0LGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzY0eDk2cDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIzMjQ1LHdpZHRoPTY0LGhlaWdodD05NixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIzMjQ1LHdpZHRoPTY0LGhlaWdodD05NixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfNzA0eDUyOHA1MGYzMl83MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT01NTk1Myx3aWR0aD03MDQsaGVpZ2h0PTUyOCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTU1OTUzLHdpZHRoPTcwNCxoZWlnaHQ9NTI4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF83MDR4NTc2cDUwZjMyXzgwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTYzNjY5LHdpZHRoPTcwNCxoZWlnaHQ9NTc2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NjM2Njksd2lkdGg9NzA0LGhlaWdodD01NzYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzcwNHg3MDRwNTBmMzJfOTAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzIzNDcsd2lkdGg9NzA0LGhlaWdodD03MDQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03MjM0Nyx3aWR0aD03MDQsaGVpZ2h0PTcwNCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfNzIweDEyODBwNTBmMzJfMTgwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE0ODQyMSx3aWR0aD03MjAsaGVpZ2h0PTEyODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNDg0MjEsd2lkdGg9NzIwLGhlaWdodD0xMjgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF83MjB4MTZwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjEzMjEsd2lkdGg9NzIwLGhlaWdodD0xNixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIxMzIxLHdpZHRoPTcyMCxoZWlnaHQ9MTYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzcyMHg0ODBwNTBmMzJfNjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDg1MTMsd2lkdGg9NzIwLGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00ODUxMyx3aWR0aD03MjAsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfNzIweDU3NnA1MGYzMl84MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT02MzY4Myx3aWR0aD03MjAsaGVpZ2h0PTU3NixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTYzNjgzLHdpZHRoPTcyMCxoZWlnaHQ9NTc2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF83MjB4NjRwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjAwNjAsd2lkdGg9NzIwLGhlaWdodD02NCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIwMDYwLHdpZHRoPTcyMCxoZWlnaHQ9NjQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzcyMHg3MjBwNTBmMzJfMTAwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTc5NTc3LHdpZHRoPTcyMCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9Nzk1Nzcsd2lkdGg9NzIwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzcyMHg5NjBwNTBmMzJfMTMwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTEwNDIwMSx3aWR0aD03MjAsaGVpZ2h0PTk2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTEwNDIwMSx3aWR0aD03MjAsaGVpZ2h0PTk2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfNzJ4MTI4cDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIyMjY1LHdpZHRoPTcyLGhlaWdodD0xMjgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMjI2NSx3aWR0aD03MixoZWlnaHQ9MTI4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF83Mng5NnA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMjc1Nix3aWR0aD03MixoZWlnaHQ9OTYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMjc1Nix3aWR0aD03MixoZWlnaHQ9OTYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzc2ODB4NTEyMHA1MGYzMl8yNDAwMGticHMud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI3MjMwMDAsd2lkdGg9NzY4MCxoZWlnaHQ9NTEyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTM2MjM0LDEzICszNjIzNCwxMyBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNzI5NzIwLHdpZHRoPTc2ODAsaGVpZ2h0PTU3NjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzc2OHgxMDI0cDUwZjMyXzE1MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xMjAwMjksd2lkdGg9NzY4LGhlaWdodD0xMDI0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTIwMDI5LHdpZHRoPTc2OCxoZWlnaHQ9MTAyNCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfODAweDYwMHA1MGYzMl85MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03MjE5Nix3aWR0aD04MDAsaGVpZ2h0PTYwMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTcyMTk2LHdpZHRoPTgwMCxoZWlnaHQ9NjAwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF84MDB4ODAwcDUwZjMyXzEyMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT05NjI3OSx3aWR0aD04MDAsaGVpZ2h0PTgwMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTk2Mjc5LHdpZHRoPTgwMCxoZWlnaHQ9ODAwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF84MTkyeDQ2MDhwNTBmMzJfMjQwMDBrYnBzLndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNzU0MDAwLHdpZHRoPTgxOTIsaGVpZ2h0PTQ2MDgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0zNjI1Miw0OSArMzYyNTIsNDkgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjY4NDUxNyx3aWR0aD04MTkyLGhlaWdodD04MTkyLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF84NDh4NDgwcDUwZjMyXzgwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTYzOTUzLHdpZHRoPTg0OCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NjM5NTMsd2lkdGg9ODQ4LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzg0OHg2NDBwNTBmMzJfMTAwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTc5Nzc0LHdpZHRoPTg0OCxoZWlnaHQ9NjQwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9Nzk3NzQsd2lkdGg9ODQ4LGhlaWdodD02NDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzg0OHg4NDhwNTBmMzJfMTQwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTExMzYwMyx3aWR0aD04NDgsaGVpZ2h0PTg0OCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTExMzYwMyx3aWR0aD04NDgsaGVpZ2h0PTg0OCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfOHg4cDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIyNzYsd2lkdGg9OCxoZWlnaHQ9OCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIyNzYsd2lkdGg9OCxoZWlnaHQ9OCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfOTYweDEyODBwNTBmMzJfMjQwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIwMjQxNyx3aWR0aD05NjAsaGVpZ2h0PTEyODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMDI0MTcsd2lkdGg9OTYwLGhlaWdodD0xMjgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF85NjB4MTQ0MHA1MGYzMl8yNzAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjI3MDIwLHdpZHRoPTk2MCxoZWlnaHQ9MTQ0MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIyNzAyMCx3aWR0aD05NjAsaGVpZ2h0PTE0NDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzk2MHg2NDBwNTBmMzJfMTIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTk1MjU5LHdpZHRoPTk2MCxoZWlnaHQ9NjQwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9OTUyNTksd2lkdGg9OTYwLGhlaWdodD02NDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzk2MHg3MjBwNTBmMzJfMTMwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTEwMzE2NSx3aWR0aD05NjAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTEwMzE2NSx3aWR0aD05NjAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfOTYweDk2MHA1MGYzMl8xODAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTQ1MzA2LHdpZHRoPTk2MCxoZWlnaHQ9OTYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTQ1MzA2LHdpZHRoPTk2MCxoZWlnaHQ9OTYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF85NngxMjhwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjE2ODYsd2lkdGg9OTYsaGVpZ2h0PTEyOCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIxNjg2LHdpZHRoPTk2LGhlaWdodD0xMjgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzk2eDE0NHA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMTcwMCx3aWR0aD05NixoZWlnaHQ9MTQ0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjE3MDAsd2lkdGg9OTYsaGVpZ2h0PTE0NCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfOTZ4MTc2cDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIwNjkwLHdpZHRoPTk2LGhlaWdodD0xNzYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMDY5MCx3aWR0aD05NixoZWlnaHQ9MTc2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDIyLzhiaXQvcmVzb2x1dGlvbi9jcm93ZF85Nng2NHA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMzU0Myx3aWR0aD05NixoZWlnaHQ9NjQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMzU0Myx3aWR0aD05NixoZWlnaHQ9NjQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0MjIvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzk2eDcycDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIxNjY3LHdpZHRoPTk2LGhlaWdodD03MixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIxNjY3LHdpZHRoPTk2LGhlaWdodD03MixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQyMi84Yml0L3Jlc29sdXRpb24vY3Jvd2RfOTZ4OTZwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjMxMTMsd2lkdGg9OTYsaGVpZ2h0PTk2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjMxMTMsd2lkdGg9OTYsaGVpZ2h0PTk2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L2JpdHJhdGUvY3Jvd2RfMTI4MHg3MjBwMjRmMzAwXzMwMDBrYnBzLndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT01MjY4MDY2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTM2Mzg3LDEwMyArMzYzODcsMTAzIEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE4NTk1MTksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl8xeDEud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2Nzk2OSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjc5Njksd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjgwMjQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY4MDI0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY5MTg0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2OTE4NCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl8yeDEud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2ODE4NSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjgxODUsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfMngyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjgwMjQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY4MDI0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyXzJ4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY5MTg0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2OTE4NCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl80eDEud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2ODEzNix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjgxMzYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfNHgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjgwMjQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY4MDI0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyXzR4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY5MTg0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2OTE4NCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9hZGFwdFFDb21fMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNTk3ODEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTU5NzgxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX2FkYXB0UVZhcl8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDA3Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjAwNzIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfYXJucl8wZl8wc18ydF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2ODY0Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjg2NDIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfYXJucl8wZl81c18xdF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2ODM5Nix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjgzOTYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfYXJucl8wZl81c18ydF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2ODc1Myx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjg3NTMsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfYXJucl8xNWZfMHNfMnRfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjg3OTksd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY4Nzk5LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX2FybnJfMTVmXzVzXzJ0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY4NzQxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2ODc0MSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9hcm5yXzVmXzBzXzJ0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY4ODkwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2ODg5MCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9hcm5yXzVmXzVzXzJ0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY4Mzk2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2ODM5Nix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9hcm5yXzVmXzVzXzN0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY4Mzk2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2ODM5Nix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9hdXRBbHRSZWZfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjkxODQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY5MTg0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX2F1dEFsdFJlZl84bGFnXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY3MTU1LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2NzE1NSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9jYnJfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xODAxMDIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTgwMTAyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX2NxMF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2Nzk5OCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjc5OTgsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfY3ExMF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2Nzk5OCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjc5OTgsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfY3ExNl8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2Nzk5OCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjc5OTgsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfY3EzMl8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2Nzk5OCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjc5OTgsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfY3E0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY3OTk4LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2Nzk5OCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9jcTYzXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTM5ODE4LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTEzOTgxOCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9kb3duU2NhbGVfMTBfbm9LZXlfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjkxODQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY5MTg0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX2Rvd25TY2FsZV8yMF9ub0tleV8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2OTE4NCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjkxODQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfZG93blNjYWxlXzUwX25vS2V5XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY5MTg0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2OTE4NCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9kb3duU2NhbGVfODBfbm9LZXlfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjkxODQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY5MTg0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX2VyclJlc18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE3Njc0MCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNzY3NDAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfa2V5RnJtT25seV8xeDQud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTgzMDg2NSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0zNjQ5MiwxMCArMzY0OTIsMTAgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzA0MjAyODgsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfbm9LZXlGcm1fMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjkxODQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY5MTg0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX25vbkVyclJlc18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2OTE4NCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjkxODQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfUXAwLTEwXzF4NC53ZWJtIj4KICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODYzNTIxNSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0zNjUwNCw3ICszNjUwNCw3IEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTcwNDIwMjg4LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX1FwMC02M18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2OTE4NCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjkxODQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfUXAxMC0yMF8xeDQud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMyMTI3OTYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMzY1MTksMTU0ICszNjUxOSwxNTQgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTM0OTA4OSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9RcDQwLTUwXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9Mzk2OTQyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM5Njk0Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9RcDUwLTYzXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzMDg1LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MzA4NSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9RcDYzXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDMwNDMsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDMwNDMsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfc2hhcnAwXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY5MTg0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2OTE4NCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9zaGFycDFfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjg3OTMsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY4NzkzLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX3NoYXJwMl8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2ODk2Nyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjg5Njcsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfc2hhcnAzXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY4NTQ5LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2ODU0OSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9zaGFycDRfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjk0ODksd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY5NDg5LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX3NoYXJwNV8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2ODczOCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjg3Mzgsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfc2hhcnA2XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY4ODA5LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2ODgwOSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9zaGFycDdfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjg3MjYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY4NzI2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX3NraXA1ZnJtXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTQwNTUyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE0MDU1Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl91cFNjYWxlXzEwMF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2OTE4NCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjkxODQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfdXBTY2FsZV8xMF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2OTE4NCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjkxODQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfdXBTY2FsZV8yMF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2OTE4NCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjkxODQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfdXBTY2FsZV81MF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2OTE4NCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjkxODQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfdmJyXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY5MTg0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2OTE4NCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyXzF4MS53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY3Njg5LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2NzY4OSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY3NTk1LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2NzU5NSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY4Njk3LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2ODY5Nyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyXzJ4MS53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY3ODQyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2Nzg0Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyXzJ4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY3NTk1LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2NzU5NSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyXzJ4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY4Njk3LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2ODY5Nyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyXzR4MS53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY4MDE5LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2ODAxOSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyXzR4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY3NTk1LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2NzU5NSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyXzR4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY4Njk3LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2ODY5Nyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX2FkYXB0UUNvbV8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE1OTk1OSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNTk5NTksd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl9hZGFwdFFWYXJfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjAzMTMsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwMzEzLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfYXJucl8wZl8wc18ydF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2ODg4Nyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjg4ODcsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl9hcm5yXzBmXzVzXzF0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY4MTA0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2ODEwNCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX2FybnJfMGZfNXNfMnRfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjg5MzQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY4OTM0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfYXJucl8xNWZfMHNfMnRfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjg1NzAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY4NTcwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfYXJucl8xNWZfNXNfMnRfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjgzNTAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY4MzUwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfYXJucl81Zl8wc18ydF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2ODYyNyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjg2Mjcsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl9hcm5yXzVmXzVzXzJ0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY4MTA0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2ODEwNCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX2FybnJfNWZfNXNfM3RfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjgxMDQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY4MTA0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfYXV0QWx0UmVmXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY4Njk3LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2ODY5Nyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX2F1dEFsdFJlZl84bGFnXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY2NTQyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2NjU0Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX2Nicl8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE4MDgyNix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xODA4MjYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl9jcTBfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjczMzUsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY3MzM1LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfY3ExMF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2NzMzNSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjczMzUsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl9jcTE2XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY3MzM1LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2NzMzNSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX2NxMzJfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjczMzUsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY3MzM1LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfY3E0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY3MzM1LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2NzMzNSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX2NxNjNfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xMzk3Nzgsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTM5Nzc4LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfZG93blNjYWxlXzEwX25vS2V5XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY4Njk3LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2ODY5Nyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX2Rvd25TY2FsZV8yMF9ub0tleV8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2ODY5Nyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjg2OTcsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl9kb3duU2NhbGVfNTBfbm9LZXlfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjg2OTcsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY4Njk3LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfZG93blNjYWxlXzgwX25vS2V5XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY4Njk3LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2ODY5Nyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX2VyclJlc18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE3Njc0MCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNzY3NDAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl9rZXlGcm1Pbmx5XzF4NC53ZWJtIj4KICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODMwODY1LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTM2Njc1LDEwICszNjY3NSwxMCBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT02MzQ2NDgyOSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX25vS2V5RnJtXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY4Njk3LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2ODY5Nyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX25vbkVyclJlc18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2ODY5Nyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjg2OTcsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl9RcDAtMTBfMXg0LndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NjMzODA4LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTM2Njg3LDcgKzM2Njg3LDcgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NjM0NjQ4Mjksd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl9RcDAtNjNfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjg2OTcsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY4Njk3LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfUXAxMC0yMF8xeDQud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMyMTEyNjcsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMzY3MDIsMTU0ICszNjcwMiwxNTQgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTM0OTY1NCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX1FwNDAtNTBfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zOTcwMTMsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9Mzk3MDEzLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfUXA1MC02M18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2Mjc3MCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjI3NzAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl9RcDYzXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDMzOTAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDMzOTAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl9zaGFycDBfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjg2OTcsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY4Njk3LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfc2hhcnAxXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY4OTkzLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2ODk5Myx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX3NoYXJwMl8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2ODM5NCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjgzOTQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl9zaGFycDNfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjg2NTgsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY4NjU4LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfc2hhcnA0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY4OTY0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2ODk2NCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX3NoYXJwNV8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2ODY2OCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjg2Njgsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl9zaGFycDZfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjg3OTEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY4NzkxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfc2hhcnA3XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY4NDA5LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2ODQwOSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX3NraXA1ZnJtXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTQwNjAyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE0MDYwMix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX3VwU2NhbGVfMTAwXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY4Njk3LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2ODY5Nyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX3VwU2NhbGVfMTBfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjg2OTcsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY4Njk3LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfdXBTY2FsZV8yMF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2ODY5Nyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjg2OTcsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl91cFNjYWxlXzUwXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY4Njk3LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2ODY5Nyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX3Zicl8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2ODY5Nyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjg2OTcsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl8xeDEud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2NzM4NSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY3Mzg1LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY4MTY5LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjgxNjksd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjg2NDEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2ODY0MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl8yeDEud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2NzYwMSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY3NjAxLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyXzJ4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY4MTY5LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjgxNjksd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfMng0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjg2NDEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2ODY0MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl80eDEud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2Nzk5OCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY3OTk4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyXzR4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY4MTY5LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjgxNjksd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfNHg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjg2NDEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2ODY0MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9hZGFwdFFDb21fMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMjE5OTEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMyMTk5MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9hZGFwdFFWYXJfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzExMzEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzMTEzMSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9hcm5yXzBmXzBzXzJ0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzcwMzUxLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNzAzNTEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfYXJucl8wZl81c18xdF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2OTM3OCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY5Mzc4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX2FybnJfMGZfNXNfMnRfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjg5MDEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2ODkwMSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9hcm5yXzE1Zl8wc18ydF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2OTQxMyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY5NDEzLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX2FybnJfMTVmXzVzXzJ0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY5NjI4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjk2Mjgsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfYXJucl81Zl8wc18ydF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2OTM3OCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY5Mzc4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX2FybnJfNWZfNXNfMnRfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjkzNzgsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2OTM3OCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9hcm5yXzVmXzVzXzN0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY5Mzc4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjkzNzgsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfYXV0QWx0UmVmXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY4NjQxLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjg2NDEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfYXV0QWx0UmVmXzhsYWdfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTA2MjMsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1MDYyMyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9jYnJfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNzg1OTUsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM3ODU5NSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9jcTBfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjg2NDEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2ODY0MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9jcTEwXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY4NjQxLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjg2NDEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfY3ExNl8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2ODY0MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY4NjQxLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX2NxMzJfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjg2NDEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2ODY0MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9jcTRfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjg2NDEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2ODY0MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9jcTYzXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjY4NzA5LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNjg3MDksd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfZG93blNjYWxlXzEwX25vS2V5XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY4NjQxLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjg2NDEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfZG93blNjYWxlXzIwX25vS2V5XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY4NjQxLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjg2NDEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfZG93blNjYWxlXzUwX25vS2V5XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY4NjQxLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjg2NDEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfZG93blNjYWxlXzgwX25vS2V5XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY4NjQxLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjg2NDEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfZXJyUmVzXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9Mzg2MTIzLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zODYxMjMsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfa2V5RnJtT25seV8xeDQud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE0ODM5Njcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTM2ODU4LDEwICszNjg1OCwxMCBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNDcxNDk1OTEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfbm9LZXlGcm1fMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjg2NDEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2ODY0MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9ub25FcnJSZXNfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjg2NDEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2ODY0MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9RcDAtMTBfMXg0LndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMzY1NjQ1Nix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMzY4NzAsNyArMzY4NzAsNyBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNDcxNDk1OTEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfUXAwLTYzXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY4NjQxLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjg2NDEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfUXAxMC0yMF8xeDQud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTY0NTU3MzUsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTM2ODg1LDE1NCArMzY4ODUsMTU0IEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI0MDQ0NDQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfUXA0MC01MF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTcxOTI0NCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzE5MjQ0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX1FwNTAtNjNfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMjk5ODEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMyOTk4MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9RcDYzXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9OTIzNjUsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTkyMzY1LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX3NoYXJwMF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2ODY0MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY4NjQxLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX3NoYXJwMV8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2OTEwOCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY5MTA4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX3NoYXJwMl8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2OTYwNCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY5NjA0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX3NoYXJwM18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2OTEzMCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY5MTMwLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX3NoYXJwNF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2OTI5MCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY5MjkwLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX3NoYXJwNV8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2ODc3Nyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY4Nzc3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX3NoYXJwNl8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2OTQzOCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY5NDM4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX3NoYXJwN18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2OTgwNCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY5ODA0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX3NraXA1ZnJtXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzA5MzYxLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMDkzNjEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfdXBTY2FsZV8xMDBfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjg2NDEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2ODY0MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl91cFNjYWxlXzEwXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY4NjQxLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjg2NDEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfdXBTY2FsZV8yMF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2ODY0MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY4NjQxLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX3VwU2NhbGVfNTBfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjg2NDEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2ODY0MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl92YnJfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjg2NDEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2ODY0MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyXzF4MS53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY4MzI3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjgzMjcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2ODE1Nix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY4MTU2LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjkyNTEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2OTI1MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyXzJ4MS53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY4NTM3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjg1Mzcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl8yeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2ODE1Nix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY4MTU2LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfMng0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjkyNTEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2OTI1MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyXzR4MS53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY4OTM2LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjg5MzYsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl80eDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2ODE1Nix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY4MTU2LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfNHg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjkyNTEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2OTI1MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX2FkYXB0UUNvbV8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMyMjYzNyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzIyNjM3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfYWRhcHRRVmFyXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzMwOTY1LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzA5NjUsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9hcm5yXzBmXzBzXzJ0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzcwODE0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNzA4MTQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9hcm5yXzBmXzVzXzF0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY5MDczLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjkwNzMsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9hcm5yXzBmXzVzXzJ0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY5NDI0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjk0MjQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9hcm5yXzE1Zl8wc18ydF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2OTEyOSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY5MTI5LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfYXJucl8xNWZfNXNfMnRfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNzAwMzEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM3MDAzMSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX2FybnJfNWZfMHNfMnRfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjkwNzMsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2OTA3Myx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX2FybnJfNWZfNXNfMnRfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjkwNzMsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2OTA3Myx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX2FybnJfNWZfNXNfM3RfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjkwNzMsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2OTA3Myx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX2F1dEFsdFJlZl8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2OTI1MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY5MjUxLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfYXV0QWx0UmVmXzhsYWdfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTA4NzMsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1MDg3Myx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX2Nicl8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM3ODYxNSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9Mzc4NjE1LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfY3EwXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY5MjUxLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjkyNTEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9jcTEwXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY5MjUxLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjkyNTEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9jcTE2XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY5MjUxLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjkyNTEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9jcTMyXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY5MjUxLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjkyNTEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9jcTRfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjkyNTEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2OTI1MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX2NxNjNfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNjk1ODgsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI2OTU4OCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX2Rvd25TY2FsZV8xMF9ub0tleV8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2OTI1MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY5MjUxLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfZG93blNjYWxlXzIwX25vS2V5XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY5MjUxLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjkyNTEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9kb3duU2NhbGVfNTBfbm9LZXlfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjkyNTEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2OTI1MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX2Rvd25TY2FsZV84MF9ub0tleV8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2OTI1MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY5MjUxLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfZXJyUmVzXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9Mzg2MTIzLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zODYxMjMsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9rZXlGcm1Pbmx5XzF4NC53ZWJtIj4KICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTQ4Mzk2Nyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMzcwNDEsMTAgKzM3MDQxLDEwIEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE0ODA5MTUwOSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX25vS2V5RnJtXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY5MjUxLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjkyNTEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9ub25FcnJSZXNfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjkyNTEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2OTI1MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX1FwMC0xMF8xeDQud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIzNjU2NDMzLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0zNzA1Myw3ICszNzA1Myw3IEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE0ODA5MTUwOSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX1FwMC02M18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2OTI1MCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY5MjUwLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfUXAxMC0yMF8xeDQud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTY0NTg5ODQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTM3MDY4LDU1ICszNzA2OCw1NSBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMzk5NzI1LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfUXA0MC01MF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTcxOTk2NSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzE5OTY1LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfUXA1MC02M18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMyOTY2Mix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzI5NjYyLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfUXA2M18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTkzMjQ2LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT05MzI0Nix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX3NoYXJwMF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2OTI1MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY5MjUxLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfc2hhcnAxXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY5ODc0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjk4NzQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9zaGFycDJfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjk3MTMsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2OTcxMyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX3NoYXJwM18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2ODcyOCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY4NzI4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfc2hhcnA0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY4ODQ3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjg4NDcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9zaGFycDVfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjkyNTIsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2OTI1Mix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX3NoYXJwNl8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2ODk1OCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY4OTU4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfc2hhcnA3XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY4OTY5LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjg5Njksd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9za2lwNWZybV8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMxMDAzOSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzEwMDM5LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfdXBTY2FsZV8xMDBfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjkyNTEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2OTI1MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX3VwU2NhbGVfMTBfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjkyNTEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2OTI1MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX3VwU2NhbGVfMjBfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjkyNTEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2OTI1MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX3VwU2NhbGVfNTBfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjkyNTEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2OTI1MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX3Zicl8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2OTI1MSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY5MjUxLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMi9jcm93ZF8zODQweDIxNjBwNTBmMzJfZnJtUGFyXzF4MS53ZWJtIj4KICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9OTgxNjMxLHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0zNzIwOSw3ICszNzIwOSw3IEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTk4NDQ0Nix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8zODQweDIxNjBwNTBmMzIvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyX2ZybVBhcl9jcTYzXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzQyNzgyLHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03NDI3ODIsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl9mcm1QYXJfZG93blNjYWxlXzEwX25vS2V5XzF4NC53ZWJtIj4KICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9OTg0NDQ2LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0zNzI2Niw3ICszNzI2Niw3IEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTkyNTg0Mix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8zODQweDIxNjBwNTBmMzIvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyX2ZybVBhcl9RcDYzXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjkyMDM0LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yOTIwMzQsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl9mcm1QYXJfc2hhcnAwXzF4NC53ZWJtIj4KICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9OTg0NDQ2LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0zNzQwMSw3ICszNzQwMSw3IEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTk4MTQzNix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8zODQweDIxNjBwNTBmMzIvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyX25vRnJtUGFyX2NxNjNfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03NDQ4MDUsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTc0NDgwNSx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF8zODQweDIxNjBwNTBmMzIvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyX25vRnJtUGFyX2Rvd25TY2FsZV8xMF9ub0tleV8xeDQud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTk4MTQzNix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMzc0NTgsNyArMzc0NTgsNyBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT05MjgxMzgsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl9ub0ZybVBhcl9RcDYzXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9Mjk0OTI1LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yOTQ5MjUsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl9ub0ZybVBhcl9zaGFycDBfMXg0LndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT05ODE0MzYsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTM3NTAzLDEwNiArMzc1MDMsMTA2IEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTk4MTQzNix3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyXzF4MS53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE4ODMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTg4Myx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyMzkxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIzOTEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfMngxLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjA3Mix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyMDcyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyXzJ4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIzOTEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjM5MSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl80eDEud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyMzk5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIzOTksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfNHgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjM5MSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyMzkxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX2FkYXB0UUNvbV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQwNjA1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDA2MDUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfYWRhcHRRVmFyXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDEzMDAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTMwMCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9hcm5yXzBmXzBzXzJ0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIxMzcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjEzNyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9hcm5yXzBmXzVzXzF0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDI1ODksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjU4OSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9hcm5yXzBmXzVzXzJ0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIyNzMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjI3Myx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9hcm5yXzE1Zl8wc18ydF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyMzMzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIzMzMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfYXJucl8xNWZfNXNfMnRfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjQ4Myx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyNDgzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX2FybnJfNWZfMHNfMnRfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjU4OSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyNTg5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX2FybnJfNWZfNXNfMnRfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjU4OSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyNTg5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX2FybnJfNWZfNXNfM3RfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjU4OSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyNTg5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX2F1dEFsdFJlZl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyMzkxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIzOTEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfYXV0QWx0UmVmXzhsYWdfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTk3MCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxOTcwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX2Nicl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQ1NjM4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDU2Mzgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfY3EwXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE3ODksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTc4OSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9jcTEwXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE3ODksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTc4OSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9jcTE2XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE3ODksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTc4OSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9jcTMyXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE3ODksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTc4OSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9jcTRfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTc4OSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxNzg5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX2NxNjNfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zODY5Nix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM4Njk2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX2Rvd25TY2FsZV8xMF9ub0tleV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyMzkxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIzOTEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfZG93blNjYWxlXzIwX25vS2V5XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIzOTEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjM5MSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9kb3duU2NhbGVfNTBfbm9LZXlfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjM5MSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyMzkxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX2Rvd25TY2FsZV84MF9ub0tleV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyMzkxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIzOTEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfZXJyUmVzXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDQ1OTcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00NDU5Nyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9rZXlGcm1Pbmx5XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjcxMzQ0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjcxMzQ0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX2xvc3NsZXNzXzF4Mi53ZWJtIj4KICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTQ1OTYzMTAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfbm9LZXlGcm1fMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjM5MSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyMzkxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX25vbkVyclJlc18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyMzkxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIzOTEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfUXAwLTEwXzF4Mi53ZWJtIj4KICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjI5NTUzOSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTM3NjExLDE3MiArMzc2MTEsMTcyIEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE0NTk2MzEwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX1FwMC02M18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyMzkxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIzOTEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfUXAxMC0yMF8xeDIud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTExMzQ2MzMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfUXAyMC0zMF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTYxNTA1Mix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTYxNTA1Mix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9RcDMwLTQwXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9Mjg1Njk2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9Mjg1Njk2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX1FwMzJfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00NTM2NDIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00NTM2NDIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfUXA0MC01MF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTEyNDE5OSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTEyNDE5OSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9RcDUwLTYzXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDM0MjUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MzQyNSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9RcDYzXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9OTk0Myx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTk5NDMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfc2hhcnAwXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIzOTEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjM5MSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9zaGFycDFfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjI1Mix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyMjUyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX3NoYXJwMl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyMjcyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIyNzIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfc2hhcnAzXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIyNTUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjI1NSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9zaGFycDRfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjI2MCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyMjYwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX3NoYXJwNV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyMDg3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIwODcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfc2hhcnA2XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIyMTIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjIxMix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9zaGFycDdfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjI5MSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyMjkxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX3NraXA1ZnJtXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY2Njksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjY2OSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl91cFNjYWxlXzEwMF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyMzkxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIzOTEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfdXBTY2FsZV8xMF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyMzkxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIzOTEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfdXBTY2FsZV8yMF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyMzkxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIzOTEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfdXBTY2FsZV81MF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyMzkxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIzOTEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfdmJyXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIzOTEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjM5MSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyXzF4MS53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE4ODAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTg4MCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIyMzAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjIzMCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyXzJ4MS53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIwNTIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjA1Mix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyXzJ4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIyMzAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjIzMCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyXzR4MS53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIzMzgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjMzOCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyXzR4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIyMzAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjIzMCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX2FkYXB0UUNvbV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQwNDg3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDA0ODcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9hZGFwdFFWYXJfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MDc2Nix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQwNzY2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfYXJucl8wZl8wc18ydF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxOTU1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE5NTUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9hcm5yXzBmXzVzXzF0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIwOTgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjA5OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX2FybnJfMGZfNXNfMnRfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTk4MCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxOTgwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfYXJucl8xNWZfMHNfMnRfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjA3NCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyMDc0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfYXJucl8xNWZfNXNfMnRfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjMzNSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyMzM1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfYXJucl81Zl8wc18ydF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyMDk4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIwOTgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9hcm5yXzVmXzVzXzJ0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIwOTgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjA5OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX2FybnJfNWZfNXNfM3RfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjA5OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyMDk4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfYXV0QWx0UmVmXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIyMzAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjIzMCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX2F1dEFsdFJlZl84bGFnXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE4Nzksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTg3OSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX2Nicl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQ1NjIyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDU2MjIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9jcTBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTk3Mix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxOTcyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfY3ExMF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxOTcyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE5NzIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9jcTE2XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE5NzIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTk3Mix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX2NxMzJfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTk3Mix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxOTcyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfY3E0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE5NzIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTk3Mix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX2NxNjNfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zODU3NCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM4NTc0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfZG93blNjYWxlXzEwX25vS2V5XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIyMzAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjIzMCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX2Rvd25TY2FsZV8yMF9ub0tleV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyMjMwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIyMzAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9kb3duU2NhbGVfNTBfbm9LZXlfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjIzMCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyMjMwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfZG93blNjYWxlXzgwX25vS2V5XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIyMzAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjIzMCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX2VyclJlc18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQ0NTk3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDQ1OTcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9rZXlGcm1Pbmx5XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjcxMzQ0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjcxMzQ0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfbG9zc2xlc3NfMXgyLndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNDU4ODI0MCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX25vS2V5RnJtXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIyMzAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjIzMCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX25vbkVyclJlc18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyMjMwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIyMzAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9RcDAtMTBfMXgyLndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMjk1NDA1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMzc3ODUsMTcyICszNzc4NSwxNzIgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTQ1ODgyNDAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9RcDAtNjNfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjIzMCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyMjMwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfUXAxMC0yMF8xeDIud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTExMzUyMDUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9RcDIwLTMwXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NjE0Mzc0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NjE0Mzc0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfUXAzMC00MF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI4NDI5MSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI4NDI5MSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX1FwMzJfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00NTMxMDMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00NTMxMDMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9RcDQwLTUwXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTIzNzY3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTIzNzY3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfUXA1MC02M18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQzNjI2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDM2MjYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9RcDYzXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTAxOTQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xMDE5NCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX3NoYXJwMF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyMjMwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIyMzAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9zaGFycDFfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjE3Myx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyMTczLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfc2hhcnAyXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIwMjIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjAyMix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX3NoYXJwM18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyMDUwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIwNTAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9zaGFycDRfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjIzNSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyMjM1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfc2hhcnA1XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIxMjIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjEyMix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX3NoYXJwNl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxOTk3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE5OTcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9zaGFycDdfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTk4Nyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxOTg3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfc2tpcDVmcm1fMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjQwNyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2NDA3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfdXBTY2FsZV8xMDBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjIzMCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyMjMwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfdXBTY2FsZV8xMF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyMjMwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIyMzAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl91cFNjYWxlXzIwXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIyMzAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjIzMCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX3VwU2NhbGVfNTBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjIzMCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyMjMwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfdmJyXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIyMzAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjIzMCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl8xeDEud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3ODcwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc4NzAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODc1Myx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg4NzUzLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyXzJ4MS53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODgwNDMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODA0Myx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl8yeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg4NzUzLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODg3NTMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfNHgxLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODQ1Nix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg4NDU2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyXzR4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODg3NTMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODc1Myx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9hZGFwdFFDb21fMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04MDY2Mix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTgwNjYyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX2FkYXB0UVZhcl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTgxMzczLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODEzNzMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfYXJucl8wZl8wc18ydF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg4Mzc4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODgzNzgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfYXJucl8wZl81c18xdF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg4OTI0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODg5MjQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfYXJucl8wZl81c18ydF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg4MzI1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODgzMjUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfYXJucl8xNWZfMHNfMnRfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODY0Nix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg4NjQ2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX2FybnJfMTVmXzVzXzJ0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODg3MTQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODcxNCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9hcm5yXzVmXzBzXzJ0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODg5MjQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODkyNCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9hcm5yXzVmXzVzXzJ0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODg5MjQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODkyNCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9hcm5yXzVmXzVzXzN0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODg5MjQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODkyNCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9hdXRBbHRSZWZfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODc1Myx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg4NzUzLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX2F1dEFsdFJlZl84bGFnXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODU2MDUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NTYwNSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9jYnJfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT05MzQyNyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTkzNDI3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX2NxMF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NTA4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc1MDgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfY3ExMF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NTA4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc1MDgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfY3ExNl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NTA4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc1MDgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfY3EzMl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NTA4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc1MDgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfY3E0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc1MDgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzUwOCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9jcTYzXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzEzMzMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03MTMzMyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9kb3duU2NhbGVfMTBfbm9LZXlfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODc1Myx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg4NzUzLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX2Rvd25TY2FsZV8yMF9ub0tleV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg4NzUzLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODg3NTMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfZG93blNjYWxlXzUwX25vS2V5XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODg3NTMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODc1Myx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9kb3duU2NhbGVfODBfbm9LZXlfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODc1Myx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg4NzUzLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX2VyclJlc18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTkzMTg3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9OTMxODcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfa2V5RnJtT25seV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQzODc3MCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQzODc3MCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9sb3NzbGVzc18xeDIud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI2Nzc2MTQ4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX25vS2V5RnJtXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODg3NTMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODc1Myx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9ub25FcnJSZXNfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODc1Myx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg4NzUzLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX1FwMC0xMF8xeDIud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM3NTMyMDAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0zNzk1OSw3ICszNzk1OSw3IEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI2Nzc2MTQ4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX1FwMC02M18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg4NzUzLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODg3NTMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfUXAxMC0yMF8xeDIud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE4NjQwMDAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0zNzk2OCwxNjMgKzM3OTY4LDE2MyBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT05OTczMDksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfUXAzMC00MF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQ2NDA0Nix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQ2NDA0Nix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9RcDMyXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzMwOTcwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzMwOTcwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX1FwNDAtNTBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMDYyMzUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMDYyMzUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfUXA1MC02M18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTgzODIzLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODM4MjMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfUXA2M18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE4NTQxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTg1NDEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfc2hhcnAwXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODg3NTMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODc1Myx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9zaGFycDFfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODY3MCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg4NjcwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX3NoYXJwMl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg4NjI0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODg2MjQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfc2hhcnAzXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODg2MzUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODYzNSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9zaGFycDRfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODY4MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg4NjgxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX3NoYXJwNV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg4NjU3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODg2NTcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfc2hhcnA2XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODg0MjUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODQyNSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9zaGFycDdfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODM0NSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg4MzQ1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX3NraXA1ZnJtXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzkxMDgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03OTEwOCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl91cFNjYWxlXzEwMF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg4NzUzLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODg3NTMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfdXBTY2FsZV8xMF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg4NzUzLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODg3NTMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfdXBTY2FsZV8yMF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg4NzUzLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODg3NTMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfdXBTY2FsZV81MF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg4NzUzLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODg3NTMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfdmJyXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODg3NTMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODc1Myx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyXzF4MS53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc5MzYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzkzNix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODg0MDIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODQwMix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyXzJ4MS53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODgxNDUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODE0NSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyXzJ4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODg0MDIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODQwMix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyXzR4MS53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODg1NzMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODU3Myx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyXzR4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODg0MDIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODQwMix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX2FkYXB0UUNvbV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTgxMDE1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODEwMTUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9hZGFwdFFWYXJfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04MTMxNCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTgxMzE0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfYXJucl8wZl8wc18ydF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg4MTIyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODgxMjIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9hcm5yXzBmXzVzXzF0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODg0OTksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODQ5OSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX2FybnJfMGZfNXNfMnRfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODQzMSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg4NDMxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfYXJucl8xNWZfMHNfMnRfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODIzMSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg4MjMxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfYXJucl8xNWZfNXNfMnRfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODQxOCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg4NDE4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfYXJucl81Zl8wc18ydF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg4NDk5LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODg0OTksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9hcm5yXzVmXzVzXzJ0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODg0OTksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODQ5OSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX2FybnJfNWZfNXNfM3RfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODQ5OSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg4NDk5LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfYXV0QWx0UmVmXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODg0MDIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODQwMix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX2F1dEFsdFJlZl84bGFnXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODU2NjUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NTY2NSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX2Nicl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTkzMzUzLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9OTMzNTMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9jcTBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzQwMSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NDAxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfY3ExMF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NDAxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc0MDEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9jcTE2XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc0MDEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzQwMSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX2NxMzJfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzQwMSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NDAxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfY3E0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc0MDEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzQwMSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX2NxNjNfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03MTIzMSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTcxMjMxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfZG93blNjYWxlXzEwX25vS2V5XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODg0MDIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODQwMix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX2Rvd25TY2FsZV8yMF9ub0tleV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg4NDAyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODg0MDIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9kb3duU2NhbGVfNTBfbm9LZXlfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODQwMix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg4NDAyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfZG93blNjYWxlXzgwX25vS2V5XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODg0MDIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODQwMix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX2VyclJlc18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTkzMTg3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9OTMxODcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9rZXlGcm1Pbmx5XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDM4NzcwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDM4NzcwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfbG9zc2xlc3NfMXgyLndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNjcwOTMzOSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX25vS2V5RnJtXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODg0MDIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODQwMix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX25vbkVyclJlc18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg4NDAyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODg0MDIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9RcDAtMTBfMXgyLndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNzUwMzM4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMzgxMzMsNyArMzgxMzMsNyBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNjcwOTMzOSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX1FwMC02M18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg4NDAyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODg0MDIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9RcDEwLTIwXzF4Mi53ZWJtIj4KICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTg2NDQ0OCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTM4MTQyLDI1MyArMzgxNDIsMjUzIEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTk5NjkyNyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX1FwMzAtNDBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00NjM5MzIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00NjM5MzIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9RcDMyXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzMxNTE5LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzMxNTE5LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfUXA0MC01MF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIwNTg2Nix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIwNTg2Nix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX1FwNTAtNjNfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04Mjk1Mix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTgyOTUyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfUXA2M18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE4Nzg2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTg3ODYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9zaGFycDBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODQwMix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg4NDAyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfc2hhcnAxXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODgzNTYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODM1Nix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX3NoYXJwMl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg4NjQwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODg2NDAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9zaGFycDNfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODMxNCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg4MzE0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfc2hhcnA0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODgzMzIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODMzMix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX3NoYXJwNV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg4NTcwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODg1NzAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9zaGFycDZfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODU1Nix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg4NTU2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfc2hhcnA3XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODgyOTEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODI5MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX3NraXA1ZnJtXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzkxMDUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03OTEwNSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX3VwU2NhbGVfMTAwXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODg0MDIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODQwMix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX3VwU2NhbGVfMTBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODQwMix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg4NDAyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfdXBTY2FsZV8yMF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg4NDAyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODg0MDIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl91cFNjYWxlXzUwXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODg0MDIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODQwMix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX3Zicl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg4NDAyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODg0MDIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xMDI0eDEwMjRwNTBmMzJfMjAwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE3MTI2Nix3aWR0aD0xMDI0LGhlaWdodD0xMDI0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTcxMjY2LHdpZHRoPTEwMjQsaGVpZ2h0PTEwMjQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xMDI0eDU3NnA1MGYzMl8xMTAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODkwNjYsd2lkdGg9MTAyNCxoZWlnaHQ9NTc2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODkwNjYsd2lkdGg9MTAyNCxoZWlnaHQ9NTc2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTAyNHg3NjhwNTBmMzJfMTUwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTEyMDU2NCx3aWR0aD0xMDI0LGhlaWdodD03NjgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xMjA1NjQsd2lkdGg9MTAyNCxoZWlnaHQ9NzY4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTA4MHgxNDQwcDUwZjMyXzMxMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yODU3ODQsd2lkdGg9MTA4MCxoZWlnaHQ9MTQ0MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI4NTc4NCx3aWR0aD0xMDgwLGhlaWdodD0xNDQwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTA4MHgxNnA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMjAwOSx3aWR0aD0xMDgwLGhlaWdodD0xNixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIyMDA5LHdpZHRoPTEwODAsaGVpZ2h0PTE2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTA4MHgxOTIwcDUwZjMyXzQxMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDk2Mzgsd2lkdGg9MTA4MCxoZWlnaHQ9MTkyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0OTYzOCx3aWR0aD0xMDgwLGhlaWdodD0xOTIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTA4MHg2NHA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMDQ4Nix3aWR0aD0xMDgwLGhlaWdodD02NCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIwNDg2LHdpZHRoPTEwODAsaGVpZ2h0PTY0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTA4OHgxOTIwcDUwZjMyXzQxMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTE4NDQsd2lkdGg9MTA4OCxoZWlnaHQ9MTkyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1MTg0NCx3aWR0aD0xMDg4LGhlaWdodD0xOTIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTE1MngyMDQ4cDUwZjMyXzQ3MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MDI0Nzksd2lkdGg9MTE1MixoZWlnaHQ9MjA0OCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQwMjQ3OSx3aWR0aD0xMTUyLGhlaWdodD0yMDQ4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTI4MHgxMjgwcDUwZjMyXzMyMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNzY1NDQsd2lkdGg9MTI4MCxoZWlnaHQ9MTI4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI3NjU0NCx3aWR0aD0xMjgwLGhlaWdodD0xMjgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTI4MHgxNnA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMTkyOSx3aWR0aD0xMjgwLGhlaWdodD0xNixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIxOTI5LHdpZHRoPTEyODAsaGVpZ2h0PTE2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTI4MHgxOTIwcDUwZjMyXzQ5MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjQwMjMsd2lkdGg9MTI4MCxoZWlnaHQ9MTkyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyNDAyMyx3aWR0aD0xMjgwLGhlaWdodD0xOTIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTI4MHg2NHA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMDg0Nix3aWR0aD0xMjgwLGhlaWdodD02NCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIwODQ2LHdpZHRoPTEyODAsaGVpZ2h0PTY0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTI4MHg3MjBwNTBmMzJfMTgwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE0Njk3NSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNDY5NzUsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTI4MHg5NjBwNTBmMzJfMjQwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIxMjAxOCx3aWR0aD0xMjgwLGhlaWdodD05NjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMTIwMTgsd2lkdGg9MTI4MCxoZWlnaHQ9OTYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTI4eDEyOHA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMjEwNSx3aWR0aD0xMjgsaGVpZ2h0PTEyOCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIyMTA1LHdpZHRoPTEyOCxoZWlnaHQ9MTI4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTI4eDE5MnA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMTAyNix3aWR0aD0xMjgsaGVpZ2h0PTE5MixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIxMDI2LHdpZHRoPTEyOCxoZWlnaHQ9MTkyLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTI4eDcycDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI0ODUwLHdpZHRoPTEyOCxoZWlnaHQ9NzIsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNDg1MCx3aWR0aD0xMjgsaGVpZ2h0PTcyLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTI4eDk2cDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI2MDc1LHdpZHRoPTEyOCxoZWlnaHQ9OTYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNjA3NSx3aWR0aD0xMjgsaGVpZ2h0PTk2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTQ0MHgxMDgwcDUwZjMyXzMxMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yODE5MjIsd2lkdGg9MTQ0MCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI4MTkyMix3aWR0aD0xNDQwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTQ0MHgxNDQwcDUwZjMyXzQxMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTc0MTksd2lkdGg9MTQ0MCxoZWlnaHQ9MTQ0MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1NzQxOSx3aWR0aD0xNDQwLGhlaWdodD0xNDQwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTQ0MHgxOTIwcDUwZjMyXzU1MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00NzAxMDMsd2lkdGg9MTQ0MCxoZWlnaHQ9MTkyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQ3MDEwMyx3aWR0aD0xNDQwLGhlaWdodD0xOTIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTQ0MHgyNTYwcDUwZjMyXzczMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03NDkzMTUsd2lkdGg9MTQ0MCxoZWlnaHQ9MjU2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTc0OTMxNSx3aWR0aD0xNDQwLGhlaWdodD0yNTYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTQ0MHg5NjBwNTBmMzJfMjcwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI0MjIwNSx3aWR0aD0xNDQwLGhlaWdodD05NjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNDIyMDUsd2lkdGg9MTQ0MCxoZWlnaHQ9OTYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTQ0eDE0NHA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMTg1NSx3aWR0aD0xNDQsaGVpZ2h0PTE0NCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIxODU1LHdpZHRoPTE0NCxoZWlnaHQ9MTQ0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTQ0eDE3NnA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMDk1Nyx3aWR0aD0xNDQsaGVpZ2h0PTE3NixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIwOTU3LHdpZHRoPTE0NCxoZWlnaHQ9MTc2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTQ0eDE5MnA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMDU1NSx3aWR0aD0xNDQsaGVpZ2h0PTE5MixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIwNTU1LHdpZHRoPTE0NCxoZWlnaHQ9MTkyLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTQ0eDI1NnA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xOTc0Mix3aWR0aD0xNDQsaGVpZ2h0PTI1NixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE5NzQyLHdpZHRoPTE0NCxoZWlnaHQ9MjU2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTQ0eDk2cDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI1NzcxLHdpZHRoPTE0NCxoZWlnaHQ9OTYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNTc3MSx3aWR0aD0xNDQsaGVpZ2h0PTk2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTUzNngyMDQ4cDUwZjMyXzYyMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT01MjI0NDcsd2lkdGg9MTUzNixoZWlnaHQ9MjA0OCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTUyMjQ0Nyx3aWR0aD0xNTM2LGhlaWdodD0yMDQ4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTYweDI0MHA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xOTg0MSx3aWR0aD0xNjAsaGVpZ2h0PTI0MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE5ODQxLHdpZHRoPTE2MCxoZWlnaHQ9MjQwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTZ4MTA4MHA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNzEzMTIsd2lkdGg9MTYsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNzEzMTIsd2lkdGg9MTYsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xNngxMjgwcDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNzM4NSx3aWR0aD0xNixoZWlnaHQ9MTI4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNzM4NSx3aWR0aD0xNixoZWlnaHQ9MTI4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE2eDE2cDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTEzNTgzLHdpZHRoPTE2LGhlaWdodD0xNixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTEzNTgzLHdpZHRoPTE2LGhlaWdodD0xNixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE2eDE5MjBwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NjI4NzU5LHdpZHRoPTE2LGhlaWdodD0xOTIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NjI4NzU5LHdpZHRoPTE2LGhlaWdodD0xOTIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMTZ4NzIwcDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MjE1OSx3aWR0aD0xNixoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYyMTU5LHdpZHRoPTE2LGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xNzJ4MTcycDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIxMDQ4LHdpZHRoPTE3MixoZWlnaHQ9MTcyLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjEwNDgsd2lkdGg9MTcyLGhlaWdodD0xNzIsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xNzZ4MTQ0cDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIxNTMyLHdpZHRoPTE3NixoZWlnaHQ9MTQ0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjE1MzIsd2lkdGg9MTc2LGhlaWdodD0xNDQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xNzZ4OTZwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjYxMTUsd2lkdGg9MTc2LGhlaWdodD05NixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI2MTE1LHdpZHRoPTE3NixoZWlnaHQ9OTYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xOTIweDEwODBwNTBmMzJfNDEwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM3ODg0MCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9Mzc4ODQwLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xOTIweDEwODhwNTBmMzJfNDEwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM4MTAxOCx3aWR0aD0xOTIwLGhlaWdodD0xMDg4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzgxMDE4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xOTIweDEyODBwNTBmMzJfNDkwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQzMzE0Mix3aWR0aD0xOTIwLGhlaWdodD0xMjgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDMzMTQyLHdpZHRoPTE5MjAsaGVpZ2h0PTEyODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xOTIweDE0NDBwNTBmMzJfNTUwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQ4NTY1Nyx3aWR0aD0xOTIwLGhlaWdodD0xNDQwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDg1NjU3LHdpZHRoPTE5MjAsaGVpZ2h0PTE0NDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xOTIweDE2cDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIxMDcxLHdpZHRoPTE5MjAsaGVpZ2h0PTE2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjEwNzEsd2lkdGg9MTkyMCxoZWlnaHQ9MTYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xOTIweDE5MjBwNTBmMzJfNzMwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTYyMDQ0OCx3aWR0aD0xOTIwLGhlaWdodD0xOTIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NjIwNDQ4LHdpZHRoPTE5MjAsaGVpZ2h0PTE5MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF8xOTIweDI1NjBwNTBmMzJfOTgwMGticHMud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTEwMDkxODMsd2lkdGg9MTkyMCxoZWlnaHQ9MjU2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE5MjB4NjRwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTc1MTUsd2lkdGg9MTkyMCxoZWlnaHQ9NjQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNzUxNSx3aWR0aD0xOTIwLGhlaWdodD02NCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE5MngxMjhwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjE5NzIsd2lkdGg9MTkyLGhlaWdodD0xMjgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMTk3Mix3aWR0aD0xOTIsaGVpZ2h0PTEyOCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE5MngxNDRwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjEzMTksd2lkdGg9MTkyLGhlaWdodD0xNDQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMTMxOSx3aWR0aD0xOTIsaGVpZ2h0PTE0NCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE5MngxOTJwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjAyODcsd2lkdGg9MTkyLGhlaWdodD0xOTIsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMDI4Nyx3aWR0aD0xOTIsaGVpZ2h0PTE5MixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE5MngyNTZwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTkwNTUsd2lkdGg9MTkyLGhlaWdodD0yNTYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xOTA1NSx3aWR0aD0xOTIsaGVpZ2h0PTI1NixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE5MngyODhwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTg2ODksd2lkdGg9MTkyLGhlaWdodD0yODgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xODY4OSx3aWR0aD0xOTIsaGVpZ2h0PTI4OCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzIwNDh4MTE1MnA1MGYzMl80NzAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDI0NjY1LHdpZHRoPTIwNDgsaGVpZ2h0PTExNTIsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjQ2NjUsd2lkdGg9MjA0OCxoZWlnaHQ9MTE1MixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzIwNDh4MTUzNnA1MGYzMl82MjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NTQxOTY0LHdpZHRoPTIwNDgsaGVpZ2h0PTE1MzYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT01NDE5NjQsd2lkdGg9MjA0OCxoZWlnaHQ9MTUzNixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzIwNDh4MjA0OHA1MGYzMl84MzAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzE0NzY0LHdpZHRoPTIwNDgsaGVpZ2h0PTIwNDgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03MTQ3NjQsd2lkdGg9MjA0OCxoZWlnaHQ9MjA0OCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzIxNjB4Mzg0MHA1MGYzMl8xNjUwMGticHMud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE3ODQ3NTksd2lkdGg9MjE2MCxoZWlnaHQ9Mzg0MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzIxNngyODhwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTg5OTQsd2lkdGg9MjE2LGhlaWdodD0yODgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xODk5NCx3aWR0aD0yMTYsaGVpZ2h0PTI4OCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzIzMDR4NDA5NnA1MGYzMl8xODgwMGticHMud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIwMTY3ODksd2lkdGg9MjMwNCxoZWlnaHQ9NDA5NixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI0MHgxNjBwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjA0NDksd2lkdGg9MjQwLGhlaWdodD0xNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMDQ0OSx3aWR0aD0yNDAsaGVpZ2h0PTE2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI0MHgyNDBwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTg3NTksd2lkdGg9MjQwLGhlaWdodD0yNDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xODc1OSx3aWR0aD0yNDAsaGVpZ2h0PTI0MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI0MHgzMjBwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY2NTQsd2lkdGg9MjQwLGhlaWdodD0zMjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjY1NCx3aWR0aD0yNDAsaGVpZ2h0PTMyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI0MHgzNjBwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY0ODIsd2lkdGg9MjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjQ4Mix3aWR0aD0yNDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI0eDMycDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MTc0LHdpZHRoPTI0LGhlaWdodD0zMixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MTc0LHdpZHRoPTI0LGhlaWdodD0zMixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI1NjB4MTQ0MHA1MGYzMl83MzAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NjU5MzU0LHdpZHRoPTI1NjAsaGVpZ2h0PTE0NDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT02NTkzNTQsd2lkdGg9MjU2MCxoZWlnaHQ9MTQ0MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI1NjB4MTkyMHA1MGYzMl85ODAwa2Jwcy53ZWJtIj4KICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODU4MDA4LHdpZHRoPTI1NjAsaGVpZ2h0PTE5MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0zODQwMCwzNCArMzg0MDAsMzQgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjA4ODg2MSx3aWR0aD0yNTYwLGhlaWdodD0zODQwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMjU2eDE0NHA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMDM1MCx3aWR0aD0yNTYsaGVpZ2h0PTE0NCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIwMzUwLHdpZHRoPTI1NixoZWlnaHQ9MTQ0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMjU2eDE5MnA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xOTM2NCx3aWR0aD0yNTYsaGVpZ2h0PTE5MixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE5MzY0LHdpZHRoPTI1NixoZWlnaHQ9MTkyLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMjU2eDI1NnA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xODQ3OCx3aWR0aD0yNTYsaGVpZ2h0PTI1NixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE4NDc4LHdpZHRoPTI1NixoZWlnaHQ9MjU2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMjY0eDM1MnA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjQ5OSx3aWR0aD0yNjQsaGVpZ2h0PTM1MixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2NDk5LHdpZHRoPTI2NCxoZWlnaHQ9MzUyLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMjg4MHgzODQwcDUwZjMyXzIyMTAwa2Jwcy53ZWJtIj4KICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjM1NTI1NCx3aWR0aD0yODgwLGhlaWdodD0zODQwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMjg4eDE5MnA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xOTAzMCx3aWR0aD0yODgsaGVpZ2h0PTE5MixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE5MDMwLHdpZHRoPTI4OCxoZWlnaHQ9MTkyLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMjg4eDIxNnA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xOTAxMyx3aWR0aD0yODgsaGVpZ2h0PTIxNixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE5MDEzLHdpZHRoPTI4OCxoZWlnaHQ9MjE2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMjg4eDI4OHA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjc1Myx3aWR0aD0yODgsaGVpZ2h0PTI4OCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2NzUzLHdpZHRoPTI4OCxoZWlnaHQ9Mjg4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMjg4eDM1MnA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjQwNix3aWR0aD0yODgsaGVpZ2h0PTM1MixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2NDA2LHdpZHRoPTI4OCxoZWlnaHQ9MzUyLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMjg4eDUxMnA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xOTg2OSx3aWR0aD0yODgsaGVpZ2h0PTUxMixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE5ODY5LHdpZHRoPTI4OCxoZWlnaHQ9NTEyLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMzA3Mng0MDk2cDUwZjMyXzI0MDAwa2Jwcy53ZWJtIj4KICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjU4NjUyOCx3aWR0aD0zMDcyLGhlaWdodD00MDk2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMzg0MzYsNjEgKzM4NDM2LDYxIEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI1NTYyMzUsd2lkdGg9MzEyMCxoZWlnaHQ9NDE2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzMyMHgyNDBwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTcyMDQsd2lkdGg9MzIwLGhlaWdodD0yNDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNzIwNCx3aWR0aD0zMjAsaGVpZ2h0PTI0MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzMyMHgzMjBwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY0NTIsd2lkdGg9MzIwLGhlaWdodD0zMjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjQ1Mix3aWR0aD0zMjAsaGVpZ2h0PTMyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzMyMHg0ODBwNTBmMzJfMzAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjQ1Mzcsd2lkdGg9MzIwLGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNDUzNyx3aWR0aD0zMjAsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzMyeDI0cDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE1OTE1LHdpZHRoPTMyLGhlaWdodD0yNCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE1OTE1LHdpZHRoPTMyLGhlaWdodD0yNCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzMyeDMycDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2OTYyLHdpZHRoPTMyLGhlaWdodD0zMixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2OTYyLHdpZHRoPTMyLGhlaWdodD0zMixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzM1MHgzNTBwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTc2MjAsd2lkdGg9MzUwLGhlaWdodD0zNTAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNzYyMCx3aWR0aD0zNTAsaGVpZ2h0PTM1MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzM1MngyNjRwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY1MTMsd2lkdGg9MzUyLGhlaWdodD0yNjQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjUxMyx3aWR0aD0zNTIsaGVpZ2h0PTI2NCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzM1MngyODhwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY1MDUsd2lkdGg9MzUyLGhlaWdodD0yODgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjUwNSx3aWR0aD0zNTIsaGVpZ2h0PTI4OCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzM1MngzNTJwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTgzMjUsd2lkdGg9MzUyLGhlaWdodD0zNTIsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xODMyNSx3aWR0aD0zNTIsaGVpZ2h0PTM1MixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzM1Nng2MzhwNTBmMzJfODAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzE1MzYsd2lkdGg9MzU2LGhlaWdodD02MzgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03MTUzNix3aWR0aD0zNTYsaGVpZ2h0PTYzOCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzM1Nng2NDBwNTBmMzJfODAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzE1NTAsd2lkdGg9MzU2LGhlaWdodD02NDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03MTU1MCx3aWR0aD0zNTYsaGVpZ2h0PTY0MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzM1OHg2MzZwNTBmMzJfODAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzE1NjYsd2lkdGg9MzU4LGhlaWdodD02MzYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03MTU2Nix3aWR0aD0zNTgsaGVpZ2h0PTYzNixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzM1OHg2NDBwNTBmMzJfODAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzE2OTgsd2lkdGg9MzU4LGhlaWdodD02NDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03MTY5OCx3aWR0aD0zNTgsaGVpZ2h0PTY0MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzM2MHgyNDBwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY2MTUsd2lkdGg9MzYwLGhlaWdodD0yNDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjYxNSx3aWR0aD0zNjAsaGVpZ2h0PTI0MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzM2MHgzNjBwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTg4Mjksd2lkdGg9MzYwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xODgyOSx3aWR0aD0zNjAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzM2MHg0ODBwNTBmMzJfMzAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjU3MDAsd2lkdGg9MzYwLGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNTcwMCx3aWR0aD0zNjAsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzM2MHg2MzZwNTBmMzJfODAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzE0MjMsd2lkdGg9MzYwLGhlaWdodD02MzYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03MTQyMyx3aWR0aD0zNjAsaGVpZ2h0PTYzNixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzM2MHg2MzhwNTBmMzJfODAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzE3MzEsd2lkdGg9MzYwLGhlaWdodD02MzgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03MTczMSx3aWR0aD0zNjAsaGVpZ2h0PTYzOCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzM2MHg2NDBwNTBmMzJfNDAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzMxMDksd2lkdGg9MzYwLGhlaWdodD02NDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzEwOSx3aWR0aD0zNjAsaGVpZ2h0PTY0MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl8xNjUwMGticHMud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE0NjQ4NDIsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTM4NTA1LDcgKzM4NTA1LDcgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjUxMzgyMSx3aWR0aD0zODQwLGhlaWdodD0zODQwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfMzg0eDUxMnA1MGYzMl8zMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNjkwNCx3aWR0aD0zODQsaGVpZ2h0PTUxMixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI2OTA0LHdpZHRoPTM4NCxoZWlnaHQ9NTEyLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNDA5NngyMzA0cDUwZjMyXzE4ODAwa2Jwcy53ZWJtIj4KICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjAxNzA5Mix3aWR0aD00MDk2LGhlaWdodD0yMzA0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMzg1MjksMTUxICszODUyOSwxNTEgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9Mjg2NzQ0Nyx3aWR0aD00NjA4LGhlaWdodD04MTkyLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNDcyeDQ3MnA1MGYzMl80MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzI3Nix3aWR0aD00NzIsaGVpZ2h0PTQ3MixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzMjc2LHdpZHRoPTQ3MixoZWlnaHQ9NDcyLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNDgweDMyMHA1MGYzMl8zMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNDcxOCx3aWR0aD00ODAsaGVpZ2h0PTMyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI0NzE4LHdpZHRoPTQ4MCxoZWlnaHQ9MzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNDgweDM2MHA1MGYzMl8zMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNTk0NCx3aWR0aD00ODAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI1OTQ0LHdpZHRoPTQ4MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNDgweDQ4MHA1MGYzMl80MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzcyNCx3aWR0aD00ODAsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNzI0LHdpZHRoPTQ4MCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNDgweDY0MHA1MGYzMl82MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00ODMwMix3aWR0aD00ODAsaGVpZ2h0PTY0MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQ4MzAyLHdpZHRoPTQ4MCxoZWlnaHQ9NjQwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNDgweDcyMHA1MGYzMl82MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00ODU5MCx3aWR0aD00ODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQ4NTkwLHdpZHRoPTQ4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNDgweDg0OHA1MGYzMl84MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT02ODA1Nyx3aWR0aD00ODAsaGVpZ2h0PTg0OCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTY4MDU3LHdpZHRoPTQ4MCxoZWlnaHQ9ODQ4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNDh4NjRwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjM2NTYsd2lkdGg9NDgsaGVpZ2h0PTY0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjM2NTYsd2lkdGg9NDgsaGVpZ2h0PTY0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNTEyMHg3NjgwcDUwZjMyXzI0MDAwa2Jwcy53ZWJtIj4KICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9Mjg0OTQzNyx3aWR0aD01MTIwLGhlaWdodD03NjgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNTEyeDI4OHA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xOTk5Mix3aWR0aD01MTIsaGVpZ2h0PTI4OCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE5OTkyLHdpZHRoPTUxMixoZWlnaHQ9Mjg4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNTEyeDM4NHA1MGYzMl8zMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNzQ5OCx3aWR0aD01MTIsaGVpZ2h0PTM4NCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI3NDk4LHdpZHRoPTUxMixoZWlnaHQ9Mzg0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNTEyeDUxMnA1MGYzMl81MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MDY2NSx3aWR0aD01MTIsaGVpZ2h0PTUxMixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQwNjY1LHdpZHRoPTUxMixoZWlnaHQ9NTEyLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNTI4eDcwNHA1MGYzMl83MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT01NjQ4Nyx3aWR0aD01MjgsaGVpZ2h0PTcwNCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTU2NDg3LHdpZHRoPTUyOCxoZWlnaHQ9NzA0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNTc2MHg3NjgwcDUwZjMyXzI0MDAwa2Jwcy53ZWJtIj4KICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9Mjg1NTMzOCx3aWR0aD01NzYwLGhlaWdodD03NjgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNTc2eDEwMjRwNTBmMzJfMTEwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTkwNDU1LHdpZHRoPTU3NixoZWlnaHQ9MTAyNCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTkwNDU1LHdpZHRoPTU3NixoZWlnaHQ9MTAyNCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzU3Nng3MDRwNTBmMzJfODAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NjQ0MDEsd2lkdGg9NTc2LGhlaWdodD03MDQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT02NDQwMSx3aWR0aD01NzYsaGVpZ2h0PTcwNCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzU3Nng3MjBwNTBmMzJfODAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NjQ0MTQsd2lkdGg9NTc2LGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT02NDQxNCx3aWR0aD01NzYsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzYwMHg4MDBwNTBmMzJfOTAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzU3Mzcsd2lkdGg9NjAwLGhlaWdodD04MDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03NTczNyx3aWR0aD02MDAsaGVpZ2h0PTgwMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzYxNDR4ODE5MnA1MGYzMl8yNDAwMGticHMud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI4ODU2NDEsd2lkdGg9NjE0NCxoZWlnaHQ9ODE5MixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzYzNngzNThwNTBmMzJfODAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzYzNTYsd2lkdGg9NjM2LGhlaWdodD0zNTgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03NjM1Nix3aWR0aD02MzYsaGVpZ2h0PTM1OCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzYzNngzNjBwNTBmMzJfODAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzU5MzEsd2lkdGg9NjM2LGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03NTkzMSx3aWR0aD02MzYsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzYzOHgzNTZwNTBmMzJfODAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzY1NDUsd2lkdGg9NjM4LGhlaWdodD0zNTYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03NjU0NSx3aWR0aD02MzgsaGVpZ2h0PTM1NixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzYzOHgzNjBwNTBmMzJfODAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzU4NTAsd2lkdGg9NjM4LGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03NTg1MCx3aWR0aD02MzgsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzY0MHgzNTZwNTBmMzJfODAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzY2OTEsd2lkdGg9NjQwLGhlaWdodD0zNTYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03NjY5MSx3aWR0aD02NDAsaGVpZ2h0PTM1NixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzY0MHgzNThwNTBmMzJfNDAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM4NjIsd2lkdGg9NjQwLGhlaWdodD0zNTgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzg2Mix3aWR0aD02NDAsaGVpZ2h0PTM1OCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzY0MHgzNjBwNTBmMzJfNDAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM2NDIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzY0Mix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzY0MHg0ODBwNTBmMzJfNjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDgyMTgsd2lkdGg9NjQwLGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00ODIxOCx3aWR0aD02NDAsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzY0MHg2NDBwNTBmMzJfODAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NjQ2MTMsd2lkdGg9NjQwLGhlaWdodD02NDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT02NDYxMyx3aWR0aD02NDAsaGVpZ2h0PTY0MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzY0MHg4NDhwNTBmMzJfMTAwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTgzMzk4LHdpZHRoPTY0MCxoZWlnaHQ9ODQ4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODMzOTgsd2lkdGg9NjQwLGhlaWdodD04NDgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF82NDB4OTYwcDUwZjMyXzEyMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT05ODc2OSx3aWR0aD02NDAsaGVpZ2h0PTk2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTk4NzY5LHdpZHRoPTY0MCxoZWlnaHQ9OTYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNjR4MTA4MHA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xODgyMSx3aWR0aD02NCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE4ODIxLHdpZHRoPTY0LGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNjR4MTI4MHA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xOTY1Nyx3aWR0aD02NCxoZWlnaHQ9MTI4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE5NjU3LHdpZHRoPTY0LGhlaWdodD0xMjgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNjR4MTkyMHA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjQ1Nyx3aWR0aD02NCxoZWlnaHQ9MTkyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2NDU3LHdpZHRoPTY0LGhlaWdodD0xOTIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNjR4NDhwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjMwNjksd2lkdGg9NjQsaGVpZ2h0PTQ4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjMwNjksd2lkdGg9NjQsaGVpZ2h0PTQ4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNjR4NjRwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjUwNzcsd2lkdGg9NjQsaGVpZ2h0PTY0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjUwNzcsd2lkdGg9NjQsaGVpZ2h0PTY0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNjR4NzIwcDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE3ODIxLHdpZHRoPTY0LGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNzgyMSx3aWR0aD02NCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNjR4OTZwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjcwNjgsd2lkdGg9NjQsaGVpZ2h0PTk2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjcwNjgsd2lkdGg9NjQsaGVpZ2h0PTk2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNzA0eDUyOHA1MGYzMl83MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT01NjQ4NSx3aWR0aD03MDQsaGVpZ2h0PTUyOCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTU2NDg1LHdpZHRoPTcwNCxoZWlnaHQ9NTI4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNzA0eDU3NnA1MGYzMl84MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT02NDI1Mix3aWR0aD03MDQsaGVpZ2h0PTU3NixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTY0MjUyLHdpZHRoPTcwNCxoZWlnaHQ9NTc2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNzA0eDcwNHA1MGYzMl85MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03Mjg3OSx3aWR0aD03MDQsaGVpZ2h0PTcwNCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTcyODc5LHdpZHRoPTcwNCxoZWlnaHQ9NzA0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNzIweDEyODBwNTBmMzJfMTgwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDg0OSx3aWR0aD03MjAsaGVpZ2h0PTEyODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA4NDksd2lkdGg9NzIwLGhlaWdodD0xMjgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNzIweDE2cDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIxNDEwLHdpZHRoPTcyMCxoZWlnaHQ9MTYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMTQxMCx3aWR0aD03MjAsaGVpZ2h0PTE2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNzIweDQ4MHA1MGYzMl82MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00OTAyNix3aWR0aD03MjAsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQ5MDI2LHdpZHRoPTcyMCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNzIweDU3NnA1MGYzMl84MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT02NDU1Nyx3aWR0aD03MjAsaGVpZ2h0PTU3NixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTY0NTU3LHdpZHRoPTcyMCxoZWlnaHQ9NTc2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNzIweDY0cDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIwOTY3LHdpZHRoPTcyMCxoZWlnaHQ9NjQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMDk2Nyx3aWR0aD03MjAsaGVpZ2h0PTY0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfNzIweDcyMHA1MGYzMl8xMDAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODA0MzUsd2lkdGg9NzIwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04MDQzNSx3aWR0aD03MjAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzcyMHg5NjBwNTBmMzJfMTMwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTEwNzMwMSx3aWR0aD03MjAsaGVpZ2h0PTk2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTEwNzMwMSx3aWR0aD03MjAsaGVpZ2h0PTk2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzcyeDEyOHA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMzQ4MCx3aWR0aD03MixoZWlnaHQ9MTI4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjM0ODAsd2lkdGg9NzIsaGVpZ2h0PTEyOCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzcyeDk2cDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI2MDEzLHdpZHRoPTcyLGhlaWdodD05NixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI2MDEzLHdpZHRoPTcyLGhlaWdodD05NixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzc2ODB4NDMyMHA1MGYzMl8yNDAwMGticHMud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI0ODEyMDgsd2lkdGg9NzY4MCxoZWlnaHQ9NDMyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTM4Njg4LDEzICszODY4OCwxMyBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yODY0NzU2LHdpZHRoPTc2ODAsaGVpZ2h0PTc2ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF83Njh4MTAyNHA1MGYzMl8xNTAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTI0MDQ1LHdpZHRoPTc2OCxoZWlnaHQ9MTAyNCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTEyNDA0NSx3aWR0aD03NjgsaGVpZ2h0PTEwMjQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF84MDB4NjAwcDUwZjMyXzkwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTcyMDQyLHdpZHRoPTgwMCxoZWlnaHQ9NjAwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzIwNDIsd2lkdGg9ODAwLGhlaWdodD02MDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF84MDB4ODAwcDUwZjMyXzEyMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xMDE3NTksd2lkdGg9ODAwLGhlaWdodD04MDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xMDE3NTksd2lkdGg9ODAwLGhlaWdodD04MDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF84MTkyeDYxNDRwNTBmMzJfMjQwMDBrYnBzLndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yOTAxNDA0LHdpZHRoPTgxOTIsaGVpZ2h0PTYxNDQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0zODcwMyw0OSArMzg3MDMsNDkgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9Mjg3NzY0NSx3aWR0aD04MTkyLGhlaWdodD04MTkyLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfODQ4eDQ4MHA1MGYzMl84MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT02NDYzMCx3aWR0aD04NDgsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTY0NjMwLHdpZHRoPTg0OCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfODQ4eDY0MHA1MGYzMl8xMDAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9Nzk3NDcsd2lkdGg9ODQ4LGhlaWdodD02NDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03OTc0Nyx3aWR0aD04NDgsaGVpZ2h0PTY0MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzg0OHg4NDhwNTBmMzJfMTQwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTEyMDkxNSx3aWR0aD04NDgsaGVpZ2h0PTg0OCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTEyMDkxNSx3aWR0aD04NDgsaGVpZ2h0PTg0OCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC8xMGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzh4OHA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjAzLHdpZHRoPTgsaGVpZ2h0PTgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjAzLHdpZHRoPTgsaGVpZ2h0PTgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF85NjB4MTI4MHA1MGYzMl8yNDAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjE4Mzg2LHdpZHRoPTk2MCxoZWlnaHQ9MTI4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIxODM4Nix3aWR0aD05NjAsaGVpZ2h0PTEyODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF85NjB4MTQ0MHA1MGYzMl8yNzAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjQzODc5LHdpZHRoPTk2MCxoZWlnaHQ9MTQ0MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI0Mzg3OSx3aWR0aD05NjAsaGVpZ2h0PTE0NDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvMTBiaXQvcmVzb2x1dGlvbi9jcm93ZF85NjB4NjQwcDUwZjMyXzEyMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT05NjM5Myx3aWR0aD05NjAsaGVpZ2h0PTY0MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTk2MzkzLHdpZHRoPTk2MCxoZWlnaHQ9NjQwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfOTYweDcyMHA1MGYzMl8xMzAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTA0MjIxLHdpZHRoPTk2MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTA0MjIxLHdpZHRoPTk2MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfOTYweDk2MHA1MGYzMl8xODAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTUyODc3LHdpZHRoPTk2MCxoZWlnaHQ9OTYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTUyODc3LHdpZHRoPTk2MCxoZWlnaHQ9OTYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfOTZ4MTI4cDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIyNjIwLHdpZHRoPTk2LGhlaWdodD0xMjgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMjYyMCx3aWR0aD05NixoZWlnaHQ9MTI4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfOTZ4MTQ0cDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIyNTI4LHdpZHRoPTk2LGhlaWdodD0xNDQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMjUyOCx3aWR0aD05NixoZWlnaHQ9MTQ0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfOTZ4MTc2cDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIxNDM2LHdpZHRoPTk2LGhlaWdodD0xNzYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMTQzNix3aWR0aD05NixoZWlnaHQ9MTc2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfOTZ4NjRwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjY0NjAsd2lkdGg9OTYsaGVpZ2h0PTY0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjY0NjAsd2lkdGg9OTYsaGVpZ2h0PTY0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfOTZ4NzJwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjI4MjAsd2lkdGg9OTYsaGVpZ2h0PTcyLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjI4MjAsd2lkdGg9OTYsaGVpZ2h0PTcyLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzEwYml0L3Jlc29sdXRpb24vY3Jvd2RfOTZ4OTZwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjY5MzMsd2lkdGg9OTYsaGVpZ2h0PTk2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjY5MzMsd2lkdGg9OTYsaGVpZ2h0PTk2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvYml0cmF0ZS9jcm93ZF8xMjgweDcyMHAyNGYzMDBfMzAwMGticHMud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTUyOTAxNDUsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMzg4MzgsMTAzICszODgzOCwxMDMgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTg2NjE5OCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfMXgxLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA2NTgsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNjU4LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA2MDIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNjAyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA3MDEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNzAxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfMngxLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA2MjIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNjIyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfMngyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA2MDIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNjAyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfMng0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA3MDEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNzAxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfNHgxLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA2Nzgsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNjc4LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfNHgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA2MDIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNjAyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfNHg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA3MDEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNzAxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfYWRhcHRRQ29tXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTU5NDIyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE1OTQyMix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX2FkYXB0UVZhcl8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE1OTYwOSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNTk2MDksd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9hcm5yXzBmXzBzXzJ0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNTc2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDU3Nix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX2FybnJfMGZfNXNfMXRfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA1Nzksd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNTc5LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfYXJucl8wZl81c18ydF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDEwNyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjAxMDcsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9hcm5yXzE1Zl8wc18ydF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDEzMix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjAxMzIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9hcm5yXzE1Zl81c18ydF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDI2NSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjAyNjUsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9hcm5yXzVmXzBzXzJ0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNjE1LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDYxNSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX2FybnJfNWZfNXNfMnRfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA1Nzksd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNTc5LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfYXJucl81Zl81c18zdF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDU3OSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA1Nzksd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9hdXRBbHRSZWZfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA3MDEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNzAxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfYXV0QWx0UmVmXzhsYWdfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjQxNjQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY0MTY0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfY2JyXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY5MTI0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2OTEyNCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX2NxMF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDcwMSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA3MDEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9jcTEwXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNzAxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDcwMSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX2NxMTZfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA3MDEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNzAxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfY3EzMl8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDcwMSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA3MDEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9jcTRfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA3MDEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNzAxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfY3E2M18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTEzODIwMix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xMzgyMDIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9kb3duU2NhbGVfMTBfbm9LZXlfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA3MDEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNzAxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfZG93blNjYWxlXzIwX25vS2V5XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNzAxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDcwMSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX2Rvd25TY2FsZV81MF9ub0tleV8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDcwMSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA3MDEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9kb3duU2NhbGVfODBfbm9LZXlfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA3MDEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNzAxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfZXJyUmVzXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY2MDIzLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2NjAyMyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX2tleUZybU9ubHlfMXg0LndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04MTQxMTIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMzg5NDMsMTAgKzM4OTQzLDEwIEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM4NzQwOTg4LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfbm9LZXlGcm1fMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA3MDEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNzAxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfbm9uRXJyUmVzXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNzAxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDcwMSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX1FwMC0xMF8xeDQud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTcxMjIyMTMsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMzg5NTUsNyArMzg5NTUsNyBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zODc0MDk4OCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX1FwMC02M18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDcwMSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA3MDEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9RcDEwLTIwXzF4NC53ZWJtIj4KICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzE0MjMyMCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0zODk3MCwxNTQgKzM4OTcwLDE1NCBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xMzUwNjcwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfUXA0MC01MF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM5NDE4MCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zOTQxODAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9RcDUwLTYzXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwMDcxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDA3MSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX1FwNjNfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjA4Nyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjA4Nyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX3NoYXJwMF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDcwMSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA3MDEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9zaGFycDFfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA1NzUsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNTc1LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfc2hhcnAyXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwOTE1LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDkxNSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX3NoYXJwM18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDg0OSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA4NDksd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9zaGFycDRfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA3OTAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNzkwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfc2hhcnA1XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwODk2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDg5Nix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX3NoYXJwNl8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDkzNCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA5MzQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl9zaGFycDdfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA4MjMsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwODIzLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfc2tpcDVmcm1fMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xMzc2Mzgsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTM3NjM4LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfdXBTY2FsZV8xMDBfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA3MDEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNzAxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfdXBTY2FsZV8xMF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDcwMSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA3MDEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX2ZybVBhcl91cFNjYWxlXzIwXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNzAxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDcwMSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfZnJtUGFyX3VwU2NhbGVfNTBfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA3MDEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNzAxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9mcm1QYXJfdmJyXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNzAxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDcwMSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfMXgxLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA1NDEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNTQxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDcwMSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA3MDEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwMzgyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDM4Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfMngxLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA0MjYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNDI2LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl8yeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDcwMSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA3MDEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyXzJ4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwMzgyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDM4Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfNHgxLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA3ODEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNzgxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl80eDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDcwMSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA3MDEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyXzR4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwMzgyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDM4Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfYWRhcHRRQ29tXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwMjY5LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDI2OSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfYWRhcHRRVmFyXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTU5NjgwLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE1OTY4MCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfYXJucl8wZl8wc18ydF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDc4NSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA3ODUsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX2FybnJfMGZfNXNfMXRfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjEwMDcsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYxMDA3LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl9hcm5yXzBmXzVzXzJ0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwNjg3LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDY4Nyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfYXJucl8xNWZfMHNfMnRfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjAxNzIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwMTcyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl9hcm5yXzE1Zl81c18ydF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDcwNSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA3MDUsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX2FybnJfNWZfMHNfMnRfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA4NjEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwODYxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl9hcm5yXzVmXzVzXzJ0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYxMDA3LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MTAwNyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfYXJucl81Zl81c18zdF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MTAwNyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjEwMDcsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX2F1dEFsdFJlZl8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDM4Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjAzODIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX2F1dEFsdFJlZl84bGFnXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzMjYxLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MzI2MSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfY2JyXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTcwMjQ3LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE3MDI0Nyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfY3EwXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwMzgyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDM4Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfY3ExMF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDM4Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjAzODIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX2NxMTZfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjAzODIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwMzgyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl9jcTMyXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwMzgyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDM4Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfY3E0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwMzgyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDM4Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfY3E2M18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTEzOTAyNix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xMzkwMjYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX2Rvd25TY2FsZV8xMF9ub0tleV8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDM4Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjAzODIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX2Rvd25TY2FsZV8yMF9ub0tleV8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDM4Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjAzODIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX2Rvd25TY2FsZV81MF9ub0tleV8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDM4Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjAzODIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX2Rvd25TY2FsZV84MF9ub0tleV8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDM4Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjAzODIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX2VyclJlc18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2NjAyMyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjYwMjMsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX2tleUZybU9ubHlfMXg0LndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04MTQxMTIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMzkxMjYsMTAgKzM5MTI2LDEwIEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM4NjIzOTg1LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl9ub0tleUZybV8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDM4Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjAzODIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX25vbkVyclJlc18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDM4Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjAzODIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX1FwMC0xMF8xeDQud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTcxMjIyNzYsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMzkxMzgsNyArMzkxMzgsNyBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zODYyMzk4NSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfUXAwLTYzXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwMzgyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDM4Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfUXAxMC0yMF8xeDQud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMxNDI3Mzcsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMzkxNTMsMTU0ICszOTE1MywxNTQgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTM0ODgxOSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfUXA0MC01MF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM5MzIzMyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zOTMyMzMsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX1FwNTAtNjNfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjAyNzQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwMjc0LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl9RcDYzXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDI0NzQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDI0NzQsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX3NoYXJwMF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDM4Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjAzODIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX3NoYXJwMV8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDY4MCx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA2ODAsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX3NoYXJwMl8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDI5NSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjAyOTUsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX3NoYXJwM18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDg2Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA4NjIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX3NoYXJwNF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDgzMSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA4MzEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX3NoYXJwNV8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDczNyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA3Mzcsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX3NoYXJwNl8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDg3MSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA4NzEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX3NoYXJwN18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDg3MSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjA4NzEsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX3NraXA1ZnJtXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTM3NDg1LHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTEzNzQ4NSx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfdXBTY2FsZV8xMDBfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjAzODIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwMzgyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl91cFNjYWxlXzEwXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwMzgyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDM4Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTI4MHg3MjBwNTBmMzIvY3Jvd2RfMTI4MHg3MjBwNTBmMzJfbm9Gcm1QYXJfdXBTY2FsZV8yMF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MDM4Mix3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjAzODIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzEyODB4NzIwcDUwZjMyL2Nyb3dkXzEyODB4NzIwcDUwZjMyX25vRnJtUGFyX3VwU2NhbGVfNTBfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjAzODIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwMzgyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xMjgweDcyMHA1MGYzMi9jcm93ZF8xMjgweDcyMHA1MGYzMl9ub0ZybVBhcl92YnJfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjAzODIsd2lkdGg9MTI4MCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYwMzgyLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl8xeDEud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0MzczMyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQzNzMzLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDM1MzIsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0MzUzMix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ0Mjk0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDQyOTQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl8yeDEud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0MzkzOCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQzOTM4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfMngyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDM1MzIsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0MzUzMix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyXzJ4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ0Mjk0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDQyOTQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl80eDEud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0NDM0MCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ0MzQwLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfNHgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDM1MzIsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0MzUzMix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyXzR4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ0Mjk0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDQyOTQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9hZGFwdFFDb21fMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMjAxOTYsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMyMDE5Nix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX2FkYXB0UVZhcl8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMyMDEwMSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzIwMTAxLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfYXJucl8wZl8wc18ydF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0NDMwOCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ0MzA4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfYXJucl8wZl81c18xdF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0NTMwNSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ1MzA1LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfYXJucl8wZl81c18ydF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0NDUxNyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ0NTE3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfYXJucl8xNWZfMHNfMnRfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDQ3Nzksd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0NDc3OSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX2FybnJfMTVmXzVzXzJ0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ0Mjk4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDQyOTgsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9hcm5yXzVmXzBzXzJ0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ1MzA1LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDUzMDUsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9hcm5yXzVmXzVzXzJ0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ1MzA1LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDUzMDUsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9hcm5yXzVmXzVzXzN0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ1MzA1LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDUzMDUsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9hdXRBbHRSZWZfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDQyOTQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0NDI5NCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX2F1dEFsdFJlZl84bGFnXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM0NTg1LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzQ1ODUsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9jYnJfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTY3NjAsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1Njc2MCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX2NxMF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0NDI5NCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ0Mjk0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfY3ExMF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0NDI5NCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ0Mjk0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfY3ExNl8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0NDI5NCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ0Mjk0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfY3EzMl8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0NDI5NCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ0Mjk0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfY3E0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ0Mjk0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDQyOTQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9jcTYzXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjY5ODE0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNjk4MTQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9kb3duU2NhbGVfMTBfbm9LZXlfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDQyOTQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0NDI5NCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX2Rvd25TY2FsZV8yMF9ub0tleV8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0NDI5NCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ0Mjk0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfZG93blNjYWxlXzUwX25vS2V5XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ0Mjk0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDQyOTQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9kb3duU2NhbGVfODBfbm9LZXlfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDQyOTQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0NDI5NCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX2VyclJlc18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1OTkzNSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzU5OTM1LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfa2V5RnJtT25seV8xeDQud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE0NTk1MDksd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTM5MzA5LDEwICszOTMwOSwxMCBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT05NDgxOTU0NSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX25vS2V5RnJtXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ0Mjk0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDQyOTQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9ub25FcnJSZXNfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDQyOTQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0NDI5NCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX1FwMC0xMF8xeDQud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE4MzU4MjY3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0zOTMyMSw3ICszOTMyMSw3IEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTk0ODE5NTQ1LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfUXAwLTYzXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ0Mjk0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDQyOTQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9RcDEwLTIwXzF4NC53ZWJtIj4KICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NjIzMjA0OSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMzkzMzYsMTU0ICszOTMzNiwxNTQgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjQwMzM5Nix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX1FwNDAtNTBfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03MTc3NTYsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTcxNzc1Nix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX1FwNTAtNjNfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMjQ1MjMsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMyNDUyMyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX1FwNjNfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT05MTkyOSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9OTE5Mjksd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9zaGFycDBfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDQyOTQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0NDI5NCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX3NoYXJwMV8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0NDQ0NCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ0NDQ0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfc2hhcnAyXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ0NDc3LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDQ0Nzcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9zaGFycDNfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDQ1Njgsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0NDU2OCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX3NoYXJwNF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0NDI4MCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ0MjgwLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfc2hhcnA1XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ0MDUxLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDQwNTEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl9zaGFycDZfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDQ5NzMsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0NDk3Myx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX3NoYXJwN18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0NDA0OCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ0MDQ4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9mcm1QYXJfc2tpcDVmcm1fMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yOTI2Mzcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI5MjYzNyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfZnJtUGFyX3VwU2NhbGVfMTAwXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ0Mjk0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDQyOTQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl91cFNjYWxlXzEwXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ0Mjk0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDQyOTQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl91cFNjYWxlXzIwXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ0Mjk0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDQyOTQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl91cFNjYWxlXzUwXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ0Mjk0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDQyOTQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX2ZybVBhcl92YnJfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDQyOTQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0NDI5NCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfMXgxLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDMzNTgsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0MzM1OCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDI3MzUsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0MjczNSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDUyNzQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0NTI3NCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfMngxLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDM1NjIsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0MzU2Mix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfMngyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDI3MzUsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0MjczNSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfMng0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDUyNzQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0NTI3NCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfNHgxLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDM5NTYsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0Mzk1Nix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfNHgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDI3MzUsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0MjczNSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfNHg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDUyNzQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0NTI3NCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfYWRhcHRRQ29tXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzE5Mjc4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMTkyNzgsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX2FkYXB0UVZhcl8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMyMDAzNSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzIwMDM1LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9hcm5yXzBmXzBzXzJ0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ0Njg0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDQ2ODQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX2FybnJfMGZfNXNfMXRfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDUwMDUsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0NTAwNSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfYXJucl8wZl81c18ydF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0NTE3MCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ1MTcwLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9hcm5yXzE1Zl8wc18ydF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0NTE2MCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ1MTYwLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9hcm5yXzE1Zl81c18ydF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0NTAyMix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ1MDIyLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9hcm5yXzVmXzBzXzJ0XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ1MDA1LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDUwMDUsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX2FybnJfNWZfNXNfMnRfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDUwMDUsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0NTAwNSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfYXJucl81Zl81c18zdF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0NTAwNSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ1MDA1LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9hdXRBbHRSZWZfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDUyNzQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0NTI3NCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfYXV0QWx0UmVmXzhsYWdfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzQ3ODAsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNDc4MCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfY2JyXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzU3Mzk5LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTczOTksd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX2NxMF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0NTI3NCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ1Mjc0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9jcTEwXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ1Mjc0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDUyNzQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX2NxMTZfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDUyNzQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0NTI3NCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfY3EzMl8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0NTI3NCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ1Mjc0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9jcTRfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDUyNzQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0NTI3NCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfY3E2M18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI3MDA2OCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjcwMDY4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9kb3duU2NhbGVfMTBfbm9LZXlfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDUyNzQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0NTI3NCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfZG93blNjYWxlXzIwX25vS2V5XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ1Mjc0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDUyNzQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX2Rvd25TY2FsZV81MF9ub0tleV8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0NTI3NCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ1Mjc0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9kb3duU2NhbGVfODBfbm9LZXlfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDUyNzQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0NTI3NCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfZXJyUmVzXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzU5OTM1LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTk5MzUsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX2tleUZybU9ubHlfMXg0LndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNDU5NTA5LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0zOTQ5MiwxMCArMzk0OTIsMTAgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9OTIyNDg0NTcsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX25vS2V5RnJtXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ1Mjc0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDUyNzQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX25vbkVyclJlc18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0NTI3NCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ1Mjc0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9RcDAtMTBfMXg0LndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xODM4ODEzMyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMzk1MDQsNyArMzk1MDQsNyBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT05MjI0ODQ1Nyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfUXAwLTYzXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ1Mjc0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDUyNzQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX1FwMTAtMjBfMXg0LndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT02MjMyMzE0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0zOTUxOSw1NSArMzk1MTksNTUgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjQwNTU2Myx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfUXA0MC01MF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTcxNjQyOCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzE2NDI4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9RcDUwLTYzXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzIzNzgyLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMjM3ODIsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX1FwNjNfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT05MjY5Nix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9OTI2OTYsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX3NoYXJwMF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0NTI3NCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ1Mjc0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9zaGFycDFfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDM2MjMsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0MzYyMyx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfc2hhcnAyXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ0NzEwLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDQ3MTAsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX3NoYXJwM18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0NTI2Myx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ1MjYzLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9zaGFycDRfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDQwODIsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0NDA4Mix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfc2hhcnA1XzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ0NTczLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDQ1NzMsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX3NoYXJwNl8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0NDIwMix3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ0MjAyLHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl9zaGFycDdfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDQxMjEsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0NDEyMSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfc2tpcDVmcm1fMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yOTI2MTksd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI5MjYxOSx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfdXBTY2FsZV8xMDBfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDUyNzQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0NTI3NCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfdXBTY2FsZV8xMF8xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0NTI3NCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ1Mjc0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMl9ub0ZybVBhcl91cFNjYWxlXzIwXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ1Mjc0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDUyNzQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8xOTIweDEwODBwNTBmMzIvY3Jvd2RfMTkyMHgxMDgwcDUwZjMyX25vRnJtUGFyX3VwU2NhbGVfNTBfMXg0LndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDUyNzQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM0NTI3NCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzE5MjB4MTA4MHA1MGYzMi9jcm93ZF8xOTIweDEwODBwNTBmMzJfbm9Gcm1QYXJfdmJyXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzQ1Mjc0LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNDUyNzQsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8zODQweDIxNjBwNTBmMzIvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyX2ZybVBhcl8xeDEud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTk1MjgxOCx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMzk2NjAsNyArMzk2NjAsNyBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT05NTI1NTYsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8zODQweDIxNjBwNTBmMzIvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyX2ZybVBhcl9jcTYzXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzM4ODU4LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03Mzg4NTgsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8zODQweDIxNjBwNTBmMzIvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyX2ZybVBhcl9kb3duU2NhbGVfMTBfbm9LZXlfMXg0LndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT05NTI1NTYsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTM5NzE3LDcgKzM5NzE3LDcgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9OTA1MjE3LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl9mcm1QYXJfUXA2M18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI4OTIzMSx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9Mjg5MjMxLHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl9mcm1QYXJfc2hhcnAwXzF4NC53ZWJtIj4KICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9OTUyNTU2LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC0zOTg1Miw3ICszOTg1Miw3IEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTk1MzM0OSx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMi9jcm93ZF8zODQweDIxNjBwNTBmMzJfbm9Gcm1QYXJfY3E2M18xeDQud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTczODEzMyx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzM4MTMzLHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl9ub0ZybVBhcl9kb3duU2NhbGVfMTBfbm9LZXlfMXg0LndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT05NTMzNDksd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTM5OTA5LDcgKzM5OTA5LDcgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9OTA3NTUzLHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl9ub0ZybVBhcl9RcDYzXzF4NC53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjkwNTU5LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yOTA1NTksd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF8zODQweDIxNjBwNTBmMzIvY3Jvd2RfMzg0MHgyMTYwcDUwZjMyX25vRnJtUGFyX3NoYXJwMF8xeDQud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTk1MzM0OSx3aWR0aD0zODQwLGhlaWdodD0yMTYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtMzk5NTQsMTA2ICszOTk1NCwxMDYgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9OTUzMzQ5LHdpZHRoPTM4NDAsaGVpZ2h0PTIxNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl8xeDEud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxNjY0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE2NjQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxODI5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE4Mjksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl8yeDEud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM5MTAyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzkxMDIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl8yeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxODI5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE4Mjksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl80eDEud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyNDc2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDI0NzYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl80eDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxODI5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE4Mjksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9hZGFwdFFDb21fMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MDg4NSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQwODg1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfYWRhcHRRVmFyXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDA3MjYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MDcyNix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX2FybnJfMGZfMHNfMnRfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTk0MCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxOTQwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfYXJucl8wZl81c18xdF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxOTI5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE5Mjksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9hcm5yXzBmXzVzXzJ0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE3MzAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTczMCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX2FybnJfMTVmXzBzXzJ0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE2Mjcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTYyNyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX2FybnJfMTVmXzVzXzJ0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIyNzIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MjI3Mix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX2FybnJfNWZfMHNfMnRfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTkyOSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxOTI5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfYXJucl81Zl81c18ydF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxOTI5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE5Mjksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9hcm5yXzVmXzVzXzN0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE5Mjksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTkyOSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX2F1dEFsdFJlZl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxODI5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE4Mjksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9hdXRBbHRSZWZfOGxhZ18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxODk2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE4OTYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9jYnJfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00NTUwNix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQ1NTA2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfY3EwXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDExODksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTE4OSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX2NxMTBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTE4OSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxMTg5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfY3ExNl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxMTg5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDExODksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9jcTMyXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDExODksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTE4OSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX2NxNF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxMTg5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDExODksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9jcTYzXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9Mzg2OTAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zODY5MCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX2Rvd25TY2FsZV8xMF9ub0tleV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxODI5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE4Mjksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9kb3duU2NhbGVfMjBfbm9LZXlfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMzgzMSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIzODMxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfZG93blNjYWxlXzUwX25vS2V5XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE4Mjksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTgyOSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX2Rvd25TY2FsZV84MF9ub0tleV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxODI5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE4Mjksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9lcnJSZXNfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00Mzc2OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQzNzY4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfa2V5RnJtT25seV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI2NTkzNCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI2NTkzNCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX2xvc3NsZXNzXzF4Mi53ZWJtIj4KICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODkzODk3MCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX25vS2V5RnJtXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9Mzc2NzMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNzY3Myx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX25vbkVyclJlc18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxODI5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE4Mjksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9RcDAtMTBfMXgyLndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMDM0OTM1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtNDAwNjIsMTcyICs0MDA2MiwxNzIgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODkzODk3MCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX1FwMC02M18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE5NTA3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTk1MDcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9RcDEwLTIwXzF4Mi53ZWJtIj4KICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTExNDc5MSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX1FwMjAtMzBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT02MTE0Njcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT02MTE0Njcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9RcDMwLTQwXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9Mjg1MjEzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9Mjg1MjEzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfUXAzMl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQ1NDIxOSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQ1NDIxOSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX1FwNDAtNTBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xMjMxMTYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xMjMxMTYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9RcDUwLTYzXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDI4ODAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00Mjg4MCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX1FwNjNfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT05Njk4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9OTY5OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX3NoYXJwMF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxODI5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE4Mjksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9zaGFycDFfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTc4MSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxNzgxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfc2hhcnAyXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE4MDcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTgwNyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX3NoYXJwM18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxNjg3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE2ODcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9zaGFycDRfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTY2MSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxNjYxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfc2hhcnA1XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE3NzYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTc3Nix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX3NoYXJwNl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxNjg1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE2ODUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl9zaGFycDdfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTY0Myx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxNjQzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfc2tpcDVmcm1fMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjQ0MCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM2NDQwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfdXBTY2FsZV8xMDBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT02MDYxOSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTYwNjE5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfdXBTY2FsZV8xMF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxODI5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE4Mjksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX2ZybVBhcl91cFNjYWxlXzIwXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE4Mjksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTgyOSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfZnJtUGFyX3VwU2NhbGVfNTBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNzMwNyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM3MzA3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9mcm1QYXJfdmJyXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE4Mjksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTgyOSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfMXgxLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTcwNSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxNzA1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxOTg1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE5ODUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyXzJ4MS53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE4NTIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTg1Mix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfMngyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTk4NSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxOTg1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl80eDEud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyMTY1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIxNjUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyXzR4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE5ODUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTk4NSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfYWRhcHRRQ29tXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDA1NDIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MDU0Mix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfYWRhcHRRVmFyXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDA1ODEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MDU4MSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfYXJucl8wZl8wc18ydF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxODI0LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE4MjQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX2FybnJfMGZfNXNfMXRfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTk5OSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxOTk5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9hcm5yXzBmXzVzXzJ0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE3MzMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTczMyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfYXJucl8xNWZfMHNfMnRfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTcxOCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxNzE4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9hcm5yXzE1Zl81c18ydF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyMTkwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDIxOTAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX2FybnJfNWZfMHNfMnRfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTk5OSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxOTk5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9hcm5yXzVmXzVzXzJ0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE5OTksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTk5OSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfYXJucl81Zl81c18zdF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxOTk5LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE5OTksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX2F1dEFsdFJlZl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxOTg1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE5ODUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX2F1dEFsdFJlZl84bGFnXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE3Njksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTc2OSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfY2JyXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDYxNjgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00NjE2OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfY3EwXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDEwMDIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTAwMix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfY3ExMF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxMDAyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDEwMDIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX2NxMTZfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTAwMix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxMDAyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9jcTMyXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDEwMDIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTAwMix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfY3E0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDEwMDIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTAwMix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfY3E2M18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM4ODQ1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9Mzg4NDUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX2Rvd25TY2FsZV8xMF9ub0tleV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxOTg1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE5ODUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX2Rvd25TY2FsZV8yMF9ub0tleV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxOTg1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE5ODUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX2Rvd25TY2FsZV81MF9ub0tleV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE5NDY1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTk0NjUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX2Rvd25TY2FsZV84MF9ub0tleV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI0ODYzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjQ4NjMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX2VyclJlc18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQzNzY4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDM3Njgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX2tleUZybU9ubHlfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNjU5MzQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNjU5MzQsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX2xvc3NsZXNzXzF4Mi53ZWJtIj4KICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODkyMTg1Nyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfbm9LZXlGcm1fMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTk4NSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxOTg1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9ub25FcnJSZXNfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTk4NSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxOTg1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9RcDAtMTBfMXgyLndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xOTgxNjcyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtNDAyMzYsMTcyICs0MDIzNiwxNzIgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODkyMTg1Nyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfUXAwLTYzXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE5ODUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTk4NSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfUXAxMC0yMF8xeDIud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTEwNzAwMjEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX1FwMjAtMzBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT01NzU4NjIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT01NzU4NjIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX1FwMzAtNDBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yODM4NDksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yODM4NDksd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX1FwMzJfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00NTQxMDIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00NTQxMDIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX1FwNDAtNTBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xMjI4OTYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xMjI4OTYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX1FwNTAtNjNfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00Mjc0Mix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQyNzQyLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl9RcDYzXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9OTk4OCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTk5ODgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX3NoYXJwMF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxOTg1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE5ODUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX3NoYXJwMV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxNzc1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE3NzUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX3NoYXJwMl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxODIzLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE4MjMsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX3NoYXJwM18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxOTA4LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE5MDgsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX3NoYXJwNF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE5NTcxLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTk1NzEsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX3NoYXJwNV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxNjk2LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE2OTYsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX3NoYXJwNl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MzY3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzNjcsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX3NoYXJwN18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxNjgwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE2ODAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX3NraXA1ZnJtXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzY1MzIsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNjUzMix3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfdXBTY2FsZV8xMDBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xOTEwNyx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE5MTA3LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl91cFNjYWxlXzEwXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE5ODUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTk4NSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF82NDB4MzYwcDUwZjMyL2Nyb3dkXzY0MHgzNjBwNTBmMzJfbm9Gcm1QYXJfdXBTY2FsZV8yMF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxOTg1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDE5ODUsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfNjQweDM2MHA1MGYzMi9jcm93ZF82NDB4MzYwcDUwZjMyX25vRnJtUGFyX3VwU2NhbGVfNTBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MTk4NSx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQxOTg1LHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzY0MHgzNjBwNTBmMzIvY3Jvd2RfNjQweDM2MHA1MGYzMl9ub0ZybVBhcl92YnJfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNjI1MCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI2MjUwLHdpZHRoPTY0MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfMXgxLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NTU0Nyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg1NTQ3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04Njg3MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg2ODcxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfMngxLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NjI4OSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg2Mjg5LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfMngyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04Njg3MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg2ODcxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfNHgxLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NjUzNyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg2NTM3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfNHgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04Njg3MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg2ODcxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfYWRhcHRRQ29tXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODA0MjYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04MDQyNix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX2FkYXB0UVZhcl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTgwNDExLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODA0MTEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9hcm5yXzBmXzBzXzJ0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODg0NjMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODQ2Myx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX2FybnJfMGZfNXNfMXRfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NjQyMCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg2NDIwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfYXJucl8wZl81c18ydF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NzM3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc3Mzcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9hcm5yXzE1Zl8wc18ydF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg4MjI2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODgyMjYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9hcm5yXzE1Zl81c18ydF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg1NjM2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODU2MzYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9hcm5yXzVmXzBzXzJ0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODY0MjAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NjQyMCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX2FybnJfNWZfNXNfMnRfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NjQyMCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg2NDIwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfYXJucl81Zl81c18zdF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg2NDIwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODY0MjAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9hdXRBbHRSZWZfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04Njg3MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg2ODcxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfYXV0QWx0UmVmXzhsYWdfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NDk2MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg0OTYxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfY2JyXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9OTI1Nzcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT05MjU3Nyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX2NxMF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NzA4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc3MDgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9jcTEwXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc3MDgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzcwOCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX2NxMTZfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzcwOCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NzA4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfY3EzMl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NzA4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc3MDgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9jcTRfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzcwOCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3NzA4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfY3E2M18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTcxMTI1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzExMjUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9kb3duU2NhbGVfMTBfbm9LZXlfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04Njg3MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg2ODcxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfZG93blNjYWxlXzIwX25vS2V5XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODY4NzEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04Njg3MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX2Rvd25TY2FsZV81MF9ub0tleV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg2ODcxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODY4NzEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9kb3duU2NhbGVfODBfbm9LZXlfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04Njg3MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg2ODcxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfZXJyUmVzXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9OTA0ODMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT05MDQ4Myx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX2tleUZybU9ubHlfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00Mjk3OTUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00Mjk3OTUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9sb3NzbGVzc18xeDIud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MzUzMTAzLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfbm9LZXlGcm1fMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04Njg3MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg2ODcxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfbm9uRXJyUmVzXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODY4NzEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04Njg3MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX1FwMC0xMF8xeDIud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMyOTMxMjMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC00MDQxMCw3ICs0MDQxMCw3IEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2MzUzMTAzLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfUXAwLTYzXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODY4NzEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04Njg3MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX1FwMTAtMjBfMXgyLndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xODI1NjU3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtNDA0MTksMTYzICs0MDQxOSwxNjMgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9OTkwNDk3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfUXAzMC00MF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQ2MzY5OCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQ2MzY5OCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX1FwMzJfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03MzIzNjMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03MzIzNjMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9RcDQwLTUwXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjA0Nzc0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjA0Nzc0LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfUXA1MC02M18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTgwNzQ3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODA3NDcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9RcDYzXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTc3MDYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNzcwNix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX3NoYXJwMF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg2ODcwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODY4NzAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9zaGFycDFfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NjM1MCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg2MzUwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfc2hhcnAyXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODY0MTcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NjQxNyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX3NoYXJwM18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg2NTM2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODY1MzYsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9zaGFycDRfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NjI2Nix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg2MjY2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfc2hhcnA1XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODY0NzIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NjQ3Mix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX3NoYXJwNl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg2NDkzLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODY0OTMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl9zaGFycDdfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NTg5Nix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg1ODk2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfc2tpcDVmcm1fMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03MzQ0MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTczNDQxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfdXBTY2FsZV8xMDBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04Njg3MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg2ODcxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfdXBTY2FsZV8xMF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg2ODcxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODY4NzEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX2ZybVBhcl91cFNjYWxlXzIwXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODY4NzEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04Njg3MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfZnJtUGFyX3VwU2NhbGVfNTBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04Njg3MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg2ODcxLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9mcm1QYXJfdmJyXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODY4NzEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04Njg3MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfMXgxLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NTcyNix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg1NzI2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg2Mjc4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODYyNzgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyXzJ4MS53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODU4OTEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NTg5MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfMngyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NjI3OCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg2Mjc4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl80eDEud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg2MTg1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODYxODUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyXzR4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODYyNzgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NjI3OCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfYWRhcHRRQ29tXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODAyMzUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04MDIzNSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfYWRhcHRRVmFyXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODAzOTcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04MDM5Nyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfYXJucl8wZl8wc18ydF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3OTc1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc5NzUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX2FybnJfMGZfNXNfMXRfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NjQxOCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg2NDE4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9hcm5yXzBmXzVzXzJ0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODc5Mzgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzkzOCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfYXJucl8xNWZfMHNfMnRfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODIwMyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg4MjAzLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9hcm5yXzE1Zl81c18ydF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg1NzExLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODU3MTEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX2FybnJfNWZfMHNfMnRfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NjQxOCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg2NDE4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9hcm5yXzVmXzVzXzJ0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODY0MTgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NjQxOCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfYXJucl81Zl81c18zdF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg2NDE4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODY0MTgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX2F1dEFsdFJlZl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg2Mjc4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODYyNzgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX2F1dEFsdFJlZl84bGFnXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODQ3MDIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NDcwMix3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfY2JyXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9OTI4Mzksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT05MjgzOSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfY3EwXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODcxOTksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzE5OSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfY3ExMF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3MTk5LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODcxOTksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX2NxMTZfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzE5OSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3MTk5LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9jcTMyXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODcxOTksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzE5OSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfY3E0XzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODcxOTksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NzE5OSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfY3E2M18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTcxMzQyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzEzNDIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX2Rvd25TY2FsZV8xMF9ub0tleV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg2Mjc4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODYyNzgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX2Rvd25TY2FsZV8yMF9ub0tleV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg2Mjc4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODYyNzgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX2Rvd25TY2FsZV81MF9ub0tleV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg2Mjc4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODYyNzgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX2Rvd25TY2FsZV84MF9ub0tleV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg2Mjc4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODYyNzgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX2VyclJlc18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTkwNDgzLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9OTA0ODMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX2tleUZybU9ubHlfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00Mjk3OTUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00Mjk3OTUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX2xvc3NsZXNzXzF4Mi53ZWJtIj4KICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzNDk3OTQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX25vS2V5RnJtXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODYyNzgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NjI3OCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfbm9uRXJyUmVzXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODYyNzgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NjI3OCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfUXAwLTEwXzF4Mi53ZWJtIj4KICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzI5MjUwMSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTQwNTg0LDcgKzQwNTg0LDcgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzNDk3OTQsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX1FwMC02M18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg2Mjc4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODYyNzgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX1FwMTAtMjBfMXgyLndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xODI2MTIwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtNDA1OTMsMjU2ICs0MDU5MywyNTYgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9OTg5MzU1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9RcDMwLTQwXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDYyOTg2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDYyOTg2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9RcDMyXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzMxODU4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzMxODU4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9RcDQwLTUwXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjA0NjA2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjA0NjA2LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl9RcDUwLTYzXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODEzMDMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04MTMwMyx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfUXA2M18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE4Mjk3LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTgyOTcsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX3NoYXJwMF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg2Mjc4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODYyNzgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX3NoYXJwMV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg2Mjc5LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODYyNzksd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX3NoYXJwMl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg2MDMzLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODYwMzMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX3NoYXJwM18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg2MjcyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODYyNzIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX3NoYXJwNF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg2MTMzLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODYxMzMsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX3NoYXJwNV8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg1ODEyLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODU4MTIsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX3NoYXJwNl8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg2MTY1LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODYxNjUsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX3NoYXJwN18xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg1ODgwLHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODU4ODAsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX3NraXA1ZnJtXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzM0NTEsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03MzQ1MSx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfdXBTY2FsZV8xMDBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NjI3OCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg2Mjc4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl91cFNjYWxlXzEwXzF4Mi53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODYyNzgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NjI3OCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3BhcmFtcy9jcm93ZF84NTR4NDgwcDUwZjMyL2Nyb3dkXzg1NHg0ODBwNTBmMzJfbm9Gcm1QYXJfdXBTY2FsZV8yMF8xeDIud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg2Mjc4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODYyNzgsd2lkdGg9ODU0LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9wYXJhbXMvY3Jvd2RfODU0eDQ4MHA1MGYzMi9jcm93ZF84NTR4NDgwcDUwZjMyX25vRnJtUGFyX3VwU2NhbGVfNTBfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NjI3OCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg2Mjc4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcGFyYW1zL2Nyb3dkXzg1NHg0ODBwNTBmMzIvY3Jvd2RfODU0eDQ4MHA1MGYzMl9ub0ZybVBhcl92YnJfMXgyLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04NjI3OCx3aWR0aD04NTQsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg2Mjc4LHdpZHRoPTg1NCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xMDI0eDEwMjRwNTBmMzJfMjAwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2NDI3Nyx3aWR0aD0xMDI0LGhlaWdodD0xMDI0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY0Mjc3LHdpZHRoPTEwMjQsaGVpZ2h0PTEwMjQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzEwMjR4NTc2cDUwZjMyXzExMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODM0MCx3aWR0aD0xMDI0LGhlaWdodD01NzYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT04ODM0MCx3aWR0aD0xMDI0LGhlaWdodD01NzYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzEwMjR4NzY4cDUwZjMyXzE1MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xMTk3NTYsd2lkdGg9MTAyNCxoZWlnaHQ9NzY4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTE5NzU2LHdpZHRoPTEwMjQsaGVpZ2h0PTc2OCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMTA4MHgxNDQwcDUwZjMyXzMxMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNjkyNjksd2lkdGg9MTA4MCxoZWlnaHQ9MTQ0MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI2OTI2OSx3aWR0aD0xMDgwLGhlaWdodD0xNDQwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xMDgweDE2cDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIxNjI4LHdpZHRoPTEwODAsaGVpZ2h0PTE2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjE2Mjgsd2lkdGg9MTA4MCxoZWlnaHQ9MTYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzEwODB4MTkyMHA1MGYzMl80MTAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzI4NjI5LHdpZHRoPTEwODAsaGVpZ2h0PTE5MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMjg2Mjksd2lkdGg9MTA4MCxoZWlnaHQ9MTkyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMTA4MHg2NHA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xOTE0Nyx3aWR0aD0xMDgwLGhlaWdodD02NCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE5MTQ3LHdpZHRoPTEwODAsaGVpZ2h0PTY0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xMDg4eDE5MjBwNTBmMzJfNDEwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMyNzAwOSx3aWR0aD0xMDg4LGhlaWdodD0xOTIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzI3MDA5LHdpZHRoPTEwODgsaGVpZ2h0PTE5MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzExNTJ4MjA0OHA1MGYzMl80NzAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9Mzc0Nzc0LHdpZHRoPTExNTIsaGVpZ2h0PTIwNDgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNzQ3NzQsd2lkdGg9MTE1MixoZWlnaHQ9MjA0OCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMTI4MHgxMjgwcDUwZjMyXzMyMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNjUwMDUsd2lkdGg9MTI4MCxoZWlnaHQ9MTI4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI2NTAwNSx3aWR0aD0xMjgwLGhlaWdodD0xMjgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xMjgweDE2cDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIxNTUyLHdpZHRoPTEyODAsaGVpZ2h0PTE2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjE1NTIsd2lkdGg9MTI4MCxoZWlnaHQ9MTYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzEyODB4MTkyMHA1MGYzMl80OTAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzkwNjk2LHdpZHRoPTEyODAsaGVpZ2h0PTE5MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zOTA2OTYsd2lkdGg9MTI4MCxoZWlnaHQ9MTkyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMTI4MHg2NHA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMDg1Nix3aWR0aD0xMjgwLGhlaWdodD02NCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIwODU2LHdpZHRoPTEyODAsaGVpZ2h0PTY0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xMjgweDcyMHA1MGYzMl8xODAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTQzNjIzLHdpZHRoPTEyODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE0MzYyMyx3aWR0aD0xMjgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzEyODB4OTYwcDUwZjMyXzI0MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xOTg3MDEsd2lkdGg9MTI4MCxoZWlnaHQ9OTYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTk4NzAxLHdpZHRoPTEyODAsaGVpZ2h0PTk2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMTI4eDEyOHA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMTQ0OSx3aWR0aD0xMjgsaGVpZ2h0PTEyOCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIxNDQ5LHdpZHRoPTEyOCxoZWlnaHQ9MTI4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xMjh4MTkycDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIwNjA0LHdpZHRoPTEyOCxoZWlnaHQ9MTkyLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjA2MDQsd2lkdGg9MTI4LGhlaWdodD0xOTIsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzEyOHg3MnA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNTI1NSx3aWR0aD0xMjgsaGVpZ2h0PTcyLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjUyNTUsd2lkdGg9MTI4LGhlaWdodD03MixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMTI4eDk2cDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI0NTc5LHdpZHRoPTEyOCxoZWlnaHQ9OTYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNDU3OSx3aWR0aD0xMjgsaGVpZ2h0PTk2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xNDQweDEwODBwNTBmMzJfMzEwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI2NjA4Myx3aWR0aD0xNDQwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjY2MDgzLHdpZHRoPTE0NDAsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE0NDB4MTQ0MHA1MGYzMl80MTAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM1MjMxLHdpZHRoPTE0NDAsaGVpZ2h0PTE0NDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzUyMzEsd2lkdGg9MTQ0MCxoZWlnaHQ9MTQ0MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMTQ0MHgxOTIwcDUwZjMyXzU1MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MzgzNDksd2lkdGg9MTQ0MCxoZWlnaHQ9MTkyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQzODM0OSx3aWR0aD0xNDQwLGhlaWdodD0xOTIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xNDQweDI1NjBwNTBmMzJfNzMwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTc1MTEyNyx3aWR0aD0xNDQwLGhlaWdodD0yNTYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzUxMTI3LHdpZHRoPTE0NDAsaGVpZ2h0PTI1NjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE0NDB4OTYwcDUwZjMyXzI3MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMjg1NTQsd2lkdGg9MTQ0MCxoZWlnaHQ9OTYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjI4NTU0LHdpZHRoPTE0NDAsaGVpZ2h0PTk2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMTQ0eDE0NHA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMTg1OCx3aWR0aD0xNDQsaGVpZ2h0PTE0NCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIxODU4LHdpZHRoPTE0NCxoZWlnaHQ9MTQ0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xNDR4MTc2cDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIwNTIxLHdpZHRoPTE0NCxoZWlnaHQ9MTc2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjA1MjEsd2lkdGg9MTQ0LGhlaWdodD0xNzYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE0NHgxOTJwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjAyMDUsd2lkdGg9MTQ0LGhlaWdodD0xOTIsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMDIwNSx3aWR0aD0xNDQsaGVpZ2h0PTE5MixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMTQ0eDI1NnA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xOTA4Myx3aWR0aD0xNDQsaGVpZ2h0PTI1NixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE5MDgzLHdpZHRoPTE0NCxoZWlnaHQ9MjU2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xNDR4OTZwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjQ0ODEsd2lkdGg9MTQ0LGhlaWdodD05NixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI0NDgxLHdpZHRoPTE0NCxoZWlnaHQ9OTYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE1MzZ4MjA0OHA1MGYzMl82MjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDkzNjQ5LHdpZHRoPTE1MzYsaGVpZ2h0PTIwNDgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00OTM2NDksd2lkdGg9MTUzNixoZWlnaHQ9MjA0OCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMTYweDI0MHA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xOTAzMCx3aWR0aD0xNjAsaGVpZ2h0PTI0MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE5MDMwLHdpZHRoPTE2MCxoZWlnaHQ9MjQwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xNngxMDgwcDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI4NTE2Myx3aWR0aD0xNixoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI4NTE2Myx3aWR0aD0xNixoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMTZ4MTI4MHA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTI2NzUsd2lkdGg9MTYsaGVpZ2h0PTEyODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTI2NzUsd2lkdGg9MTYsaGVpZ2h0PTEyODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE2eDE2cDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTg3MjIsd2lkdGg9MTYsaGVpZ2h0PTE2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODcyMix3aWR0aD0xNixoZWlnaHQ9MTYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE2eDE5MjBwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NjU5NjQ4LHdpZHRoPTE2LGhlaWdodD0xOTIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NjU5NjQ4LHdpZHRoPTE2LGhlaWdodD0xOTIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xNng3MjBwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTcxNDY0LHdpZHRoPTE2LGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNzE0NjQsd2lkdGg9MTYsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMTcyeDE3MnA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMDE2Nix3aWR0aD0xNzIsaGVpZ2h0PTE3MixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIwMTY2LHdpZHRoPTE3MixoZWlnaHQ9MTcyLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xNzZ4MTQ0cDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIxNTE5LHdpZHRoPTE3NixoZWlnaHQ9MTQ0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjE1MTksd2lkdGg9MTc2LGhlaWdodD0xNDQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE3Nng5NnA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNDg5OCx3aWR0aD0xNzYsaGVpZ2h0PTk2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjQ4OTgsd2lkdGg9MTc2LGhlaWdodD05NixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMTkyMHgxMDgwcDUwZjMyXzQxMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zNTQyNTAsd2lkdGg9MTkyMCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1NDI1MCx3aWR0aD0xOTIwLGhlaWdodD0xMDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xOTIweDEwODhwNTBmMzJfNDEwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTM1NzQ1OCx3aWR0aD0xOTIwLGhlaWdodD0xMDg4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzU3NDU4LHdpZHRoPTE5MjAsaGVpZ2h0PTEwODgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE5MjB4MTI4MHA1MGYzMl80OTAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDAzMjcxLHdpZHRoPTE5MjAsaGVpZ2h0PTEyODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MDMyNzEsd2lkdGg9MTkyMCxoZWlnaHQ9MTI4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMTkyMHgxNDQwcDUwZjMyXzU1MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00NDQ5MTAsd2lkdGg9MTkyMCxoZWlnaHQ9MTQ0MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQ0NDkxMCx3aWR0aD0xOTIwLGhlaWdodD0xNDQwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xOTIweDE2cDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE5NjUzLHdpZHRoPTE5MjAsaGVpZ2h0PTE2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTk2NTMsd2lkdGg9MTkyMCxoZWlnaHQ9MTYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE5MjB4MTkyMHA1MGYzMl83MzAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NTgxODA4LHdpZHRoPTE5MjAsaGVpZ2h0PTE5MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT01ODE4MDgsd2lkdGg9MTkyMCxoZWlnaHQ9MTkyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMTkyMHgyNTYwcDUwZjMyXzk4MDBrYnBzLndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xMDEwNTk1LHdpZHRoPTE5MjAsaGVpZ2h0PTI1NjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE5MjB4NjRwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY0Njgsd2lkdGg9MTkyMCxoZWlnaHQ9NjQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjQ2OCx3aWR0aD0xOTIwLGhlaWdodD02NCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMTkyeDEyOHA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMTU2Myx3aWR0aD0xOTIsaGVpZ2h0PTEyOCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIxNTYzLHdpZHRoPTE5MixoZWlnaHQ9MTI4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xOTJ4MTQ0cDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIxNTMxLHdpZHRoPTE5MixoZWlnaHQ9MTQ0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjE1MzEsd2lkdGg9MTkyLGhlaWdodD0xNDQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzE5MngxOTJwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTk0OTgsd2lkdGg9MTkyLGhlaWdodD0xOTIsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xOTQ5OCx3aWR0aD0xOTIsaGVpZ2h0PTE5MixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMTkyeDI1NnA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xOTA3MCx3aWR0aD0xOTIsaGVpZ2h0PTI1NixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE5MDcwLHdpZHRoPTE5MixoZWlnaHQ9MjU2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8xOTJ4Mjg4cDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE4ODMxLHdpZHRoPTE5MixoZWlnaHQ9Mjg4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTg4MzEsd2lkdGg9MTkyLGhlaWdodD0yODgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzIwNDh4MTE1MnA1MGYzMl80NzAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9Mzk1MzYwLHdpZHRoPTIwNDgsaGVpZ2h0PTExNTIsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zOTUzNjAsd2lkdGg9MjA0OCxoZWlnaHQ9MTE1MixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMjA0OHgxNTM2cDUwZjMyXzYyMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00OTc1OTcsd2lkdGg9MjA0OCxoZWlnaHQ9MTUzNixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQ5NzU5Nyx3aWR0aD0yMDQ4LGhlaWdodD0xNTM2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8yMDQ4eDIwNDhwNTBmMzJfODMwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTY2MTIwMCx3aWR0aD0yMDQ4LGhlaWdodD0yMDQ4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NjYxMjAwLHdpZHRoPTIwNDgsaGVpZ2h0PTIwNDgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzIxNjB4Mzg0MHA1MGYzMl8xNjUwMGticHMud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE3NDI4NzYsd2lkdGg9MjE2MCxoZWlnaHQ9Mzg0MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMjE2eDI4OHA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xODMwMix3aWR0aD0yMTYsaGVpZ2h0PTI4OCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE4MzAyLHdpZHRoPTIxNixoZWlnaHQ9Mjg4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8yMzA0eDQwOTZwNTBmMzJfMTg4MDBrYnBzLndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xOTk3MTU1LHdpZHRoPTIzMDQsaGVpZ2h0PTQwOTYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI0MHgxNjBwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTk2Njcsd2lkdGg9MjQwLGhlaWdodD0xNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xOTY2Nyx3aWR0aD0yNDAsaGVpZ2h0PTE2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMjQweDI0MHA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xODQ4MCx3aWR0aD0yNDAsaGVpZ2h0PTI0MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE4NDgwLHdpZHRoPTI0MCxoZWlnaHQ9MjQwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8yNDB4MzIwcDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2NTUyLHdpZHRoPTI0MCxoZWlnaHQ9MzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY1NTIsd2lkdGg9MjQwLGhlaWdodD0zMjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI0MHgzNjBwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYyMTksd2lkdGg9MjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjIxOSx3aWR0aD0yNDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMjR4MzJwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYyNDcsd2lkdGg9MjQsaGVpZ2h0PTMyLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYyNDcsd2lkdGg9MjQsaGVpZ2h0PTMyLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8yNTYweDE0NDBwNTBmMzJfNzMwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTU5MjExMCx3aWR0aD0yNTYwLGhlaWdodD0xNDQwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NTkyMTEwLHdpZHRoPTI1NjAsaGVpZ2h0PTE0NDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI1NjB4MTkyMHA1MGYzMl85ODAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzgwMTcwLHdpZHRoPTI1NjAsaGVpZ2h0PTE5MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03ODAxNzAsd2lkdGg9MjU2MCxoZWlnaHQ9MTkyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMjU2MHgyNTYwcDUwZjMyXzEzMTAwa2Jwcy53ZWJtIj4KICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTM2MTc0NSx3aWR0aD0yNTYwLGhlaWdodD0yNTYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgpAQCAtNDA4NTEsMzQgKzQwODUxLDM0IEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIwNjUzMTIsd2lkdGg9MjU2MCxoZWlnaHQ9Mzg0MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMjU2eDE0NHA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xOTk0NSx3aWR0aD0yNTYsaGVpZ2h0PTE0NCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE5OTQ1LHdpZHRoPTI1NixoZWlnaHQ9MTQ0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8yNTZ4MTkycDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE4ODk2LHdpZHRoPTI1NixoZWlnaHQ9MTkyLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTg4OTYsd2lkdGg9MjU2LGhlaWdodD0xOTIsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI1NngyNTZwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTgyMDIsd2lkdGg9MjU2LGhlaWdodD0yNTYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xODIwMix3aWR0aD0yNTYsaGVpZ2h0PTI1NixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMjY0eDM1MnA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjY0NCx3aWR0aD0yNjQsaGVpZ2h0PTM1MixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2NjQ0LHdpZHRoPTI2NCxoZWlnaHQ9MzUyLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8yODgweDM4NDBwNTBmMzJfMjIxMDBrYnBzLndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMzMwOTgxLHdpZHRoPTI4ODAsaGVpZ2h0PTM4NDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI4OHgxOTJwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTg5NjMsd2lkdGg9Mjg4LGhlaWdodD0xOTIsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xODk2Myx3aWR0aD0yODgsaGVpZ2h0PTE5MixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMjg4eDIxNnA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xODMyMCx3aWR0aD0yODgsaGVpZ2h0PTIxNixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE4MzIwLHdpZHRoPTI4OCxoZWlnaHQ9MjE2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8yODh4Mjg4cDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2ODQ4LHdpZHRoPTI4OCxoZWlnaHQ9Mjg4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY4NDgsd2lkdGg9Mjg4LGhlaWdodD0yODgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzI4OHgzNTJwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY0OTgsd2lkdGg9Mjg4LGhlaWdodD0zNTIsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjQ5OCx3aWR0aD0yODgsaGVpZ2h0PTM1MixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMjg4eDUxMnA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xOTM5Myx3aWR0aD0yODgsaGVpZ2h0PTUxMixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE5MzkzLHdpZHRoPTI4OCxoZWlnaHQ9NTEyLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8zMDcyeDQwOTZwNTBmMzJfMjQwMDBrYnBzLndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNTQ5OTYxLHdpZHRoPTMwNzIsaGVpZ2h0PTQwOTYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC00MDg4Nyw2MSArNDA4ODcsNjEgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjUyOTEyMix3aWR0aD0zMTIwLGhlaWdodD00MTYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8zMjB4MjQwcDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2OTAxLHdpZHRoPTMyMCxoZWlnaHQ9MjQwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY5MDEsd2lkdGg9MzIwLGhlaWdodD0yNDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzMyMHgzMjBwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTYzNzMsd2lkdGg9MzIwLGhlaWdodD0zMjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjM3Myx3aWR0aD0zMjAsaGVpZ2h0PTMyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMzIweDQ4MHA1MGYzMl8zMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNDMxNix3aWR0aD0zMjAsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI0MzE2LHdpZHRoPTMyMCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8zMngyNHA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjIwMix3aWR0aD0zMixoZWlnaHQ9MjQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjIwMix3aWR0aD0zMixoZWlnaHQ9MjQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzMyeDMycDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE3NjI3LHdpZHRoPTMyLGhlaWdodD0zMixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE3NjI3LHdpZHRoPTMyLGhlaWdodD0zMixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMzUweDM1MHA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNzU2MSx3aWR0aD0zNTAsaGVpZ2h0PTM1MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE3NTYxLHdpZHRoPTM1MCxoZWlnaHQ9MzUwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8zNTJ4MjY0cDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2ODMzLHdpZHRoPTM1MixoZWlnaHQ9MjY0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY4MzMsd2lkdGg9MzUyLGhlaWdodD0yNjQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzM1MngyODhwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY1NDgsd2lkdGg9MzUyLGhlaWdodD0yODgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjU0OCx3aWR0aD0zNTIsaGVpZ2h0PTI4OCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMzUyeDM1MnA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNzk3OSx3aWR0aD0zNTIsaGVpZ2h0PTM1MixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE3OTc5LHdpZHRoPTM1MixoZWlnaHQ9MzUyLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8zNTZ4NjM4cDUwZjMyXzgwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTY3MDQwLHdpZHRoPTM1NixoZWlnaHQ9NjM4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NjcwNDAsd2lkdGg9MzU2LGhlaWdodD02MzgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzM1Nng2NDBwNTBmMzJfODAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NjcxNzEsd2lkdGg9MzU2LGhlaWdodD02NDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT02NzE3MSx3aWR0aD0zNTYsaGVpZ2h0PTY0MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMzU4eDYzNnA1MGYzMl84MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT02NzAzNix3aWR0aD0zNTgsaGVpZ2h0PTYzNixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTY3MDM2LHdpZHRoPTM1OCxoZWlnaHQ9NjM2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8zNTh4NjQwcDUwZjMyXzgwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTY3MTI3LHdpZHRoPTM1OCxoZWlnaHQ9NjQwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NjcxMjcsd2lkdGg9MzU4LGhlaWdodD02NDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzM2MHgyNDBwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY0NTgsd2lkdGg9MzYwLGhlaWdodD0yNDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNjQ1OCx3aWR0aD0zNjAsaGVpZ2h0PTI0MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMzYweDM2MHA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xODg0MCx3aWR0aD0zNjAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE4ODQwLHdpZHRoPTM2MCxoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8zNjB4NDgwcDUwZjMyXzMwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI1NDM0LHdpZHRoPTM2MCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjU0MzQsd2lkdGg9MzYwLGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzM2MHg2MzZwNTBmMzJfODAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NjY5NzEsd2lkdGg9MzYwLGhlaWdodD02MzYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT02Njk3MSx3aWR0aD0zNjAsaGVpZ2h0PTYzNixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfMzYweDYzOHA1MGYzMl84MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT02NzIxOCx3aWR0aD0zNjAsaGVpZ2h0PTYzOCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTY3MjE4LHdpZHRoPTM2MCxoZWlnaHQ9NjM4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8zNjB4NjQwcDUwZjMyXzQwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzMDc2LHdpZHRoPTM2MCxoZWlnaHQ9NjQwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzMwNzYsd2lkdGg9MzYwLGhlaWdodD02NDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzM4NDB4MjE2MHA1MGYzMl8xNjUwMGticHMud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTEzMjIzMDgsd2lkdGg9Mzg0MCxoZWlnaHQ9MjE2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTQwOTU2LDcgKzQwOTU2LDcgQEAKICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjY1NDQ5Nyx3aWR0aD0zODQwLGhlaWdodD0zODQwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF8zODR4NTEycDUwZjMyXzMwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI2Nzg1LHdpZHRoPTM4NCxoZWlnaHQ9NTEyLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjY3ODUsd2lkdGg9Mzg0LGhlaWdodD01MTIsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzQwOTZ4MjMwNHA1MGYzMl8xODgwMGticHMud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIwMTA4MTgsd2lkdGg9NDA5NixoZWlnaHQ9MjMwNCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTQwOTgwLDE0OCArNDA5ODAsMTQ4IEBACiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI5MTU1NDQsd2lkdGg9NDYwOCxoZWlnaHQ9ODE5MixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfNDcyeDQ3MnA1MGYzMl80MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzQxMSx3aWR0aD00NzIsaGVpZ2h0PTQ3MixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNDExLHdpZHRoPTQ3MixoZWlnaHQ9NDcyLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF80ODB4MzIwcDUwZjMyXzMwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI0NTk3LHdpZHRoPTQ4MCxoZWlnaHQ9MzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjQ1OTcsd2lkdGg9NDgwLGhlaWdodD0zMjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzQ4MHgzNjBwNTBmMzJfMzAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjY1MDEsd2lkdGg9NDgwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNjUwMSx3aWR0aD00ODAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfNDgweDQ4MHA1MGYzMl80MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzA3Mix3aWR0aD00ODAsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzMDcyLHdpZHRoPTQ4MCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF80ODB4NjQwcDUwZjMyXzYwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQ4Mzc4LHdpZHRoPTQ4MCxoZWlnaHQ9NjQwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDgzNzgsd2lkdGg9NDgwLGhlaWdodD02NDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzQ4MHg3MjBwNTBmMzJfNjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDg0ODUsd2lkdGg9NDgwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00ODQ4NSx3aWR0aD00ODAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfNDgweDg0OHA1MGYzMl84MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT02NDkxNyx3aWR0aD00ODAsaGVpZ2h0PTg0OCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTY0OTE3LHdpZHRoPTQ4MCxoZWlnaHQ9ODQ4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF80OHg2NHA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMzc3OCx3aWR0aD00OCxoZWlnaHQ9NjQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMzc3OCx3aWR0aD00OCxoZWlnaHQ9NjQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzUxMjB4NzY4MHA1MGYzMl8yNDAwMGticHMud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI5NDI5NTcsd2lkdGg9NTEyMCxoZWlnaHQ9NzY4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfNTEyeDI4OHA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xOTc3MSx3aWR0aD01MTIsaGVpZ2h0PTI4OCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE5NzcxLHdpZHRoPTUxMixoZWlnaHQ9Mjg4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF81MTJ4Mzg0cDUwZjMyXzMwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI3NTk3LHdpZHRoPTUxMixoZWlnaHQ9Mzg0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9Mjc1OTcsd2lkdGg9NTEyLGhlaWdodD0zODQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzUxMng1MTJwNTBmMzJfNTAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDA1OTUsd2lkdGg9NTEyLGhlaWdodD01MTIsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00MDU5NSx3aWR0aD01MTIsaGVpZ2h0PTUxMixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfNTI4eDcwNHA1MGYzMl83MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT01NjExNSx3aWR0aD01MjgsaGVpZ2h0PTcwNCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTU2MTE1LHdpZHRoPTUyOCxoZWlnaHQ9NzA0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF81NzZ4MTAyNHA1MGYzMl8xMTAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODg0MDMsd2lkdGg9NTc2LGhlaWdodD0xMDI0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODg0MDMsd2lkdGg9NTc2LGhlaWdodD0xMDI0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF81NzZ4NzA0cDUwZjMyXzgwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTY0NDY5LHdpZHRoPTU3NixoZWlnaHQ9NzA0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NjQ0Njksd2lkdGg9NTc2LGhlaWdodD03MDQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzU3Nng3MjBwNTBmMzJfODAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NjQxNzQsd2lkdGg9NTc2LGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT02NDE3NCx3aWR0aD01NzYsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfNjAweDgwMHA1MGYzMl85MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03Mjc4NSx3aWR0aD02MDAsaGVpZ2h0PTgwMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTcyNzg1LHdpZHRoPTYwMCxoZWlnaHQ9ODAwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF82MTQ0eDgxOTJwNTBmMzJfMjQwMDBrYnBzLndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yOTQ3OTE1LHdpZHRoPTYxNDQsaGVpZ2h0PTgxOTIsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzYzNngzNThwNTBmMzJfODAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzYzNTIsd2lkdGg9NjM2LGhlaWdodD0zNTgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03NjM1Mix3aWR0aD02MzYsaGVpZ2h0PTM1OCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfNjM2eDM2MHA1MGYzMl84MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03NjcxMix3aWR0aD02MzYsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTc2NzEyLHdpZHRoPTYzNixoZWlnaHQ9MzYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF82Mzh4MzU2cDUwZjMyXzgwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTc2ODE3LHdpZHRoPTYzOCxoZWlnaHQ9MzU2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzY4MTcsd2lkdGg9NjM4LGhlaWdodD0zNTYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzYzOHgzNjBwNTBmMzJfODAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzcwNzgsd2lkdGg9NjM4LGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03NzA3OCx3aWR0aD02MzgsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfNjQweDM1NnA1MGYzMl84MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03NjYyMSx3aWR0aD02NDAsaGVpZ2h0PTM1NixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTc2NjIxLHdpZHRoPTY0MCxoZWlnaHQ9MzU2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF82NDB4MzU4cDUwZjMyXzQwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTMzNTQwLHdpZHRoPTY0MCxoZWlnaHQ9MzU4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM1NDAsd2lkdGg9NjQwLGhlaWdodD0zNTgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzY0MHgzNjBwNTBmMzJfNDAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MzM1OTAsd2lkdGg9NjQwLGhlaWdodD0zNjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMzU5MCx3aWR0aD02NDAsaGVpZ2h0PTM2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfNjQweDQ4MHA1MGYzMl82MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00ODA3MCx3aWR0aD02NDAsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTQ4MDcwLHdpZHRoPTY0MCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF82NDB4NjQwcDUwZjMyXzgwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTY0NTQzLHdpZHRoPTY0MCxoZWlnaHQ9NjQwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NjQ1NDMsd2lkdGg9NjQwLGhlaWdodD02NDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzY0MHg4NDhwNTBmMzJfMTAwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTgxMjI4LHdpZHRoPTY0MCxoZWlnaHQ9ODQ4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODEyMjgsd2lkdGg9NjQwLGhlaWdodD04NDgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzY0MHg5NjBwNTBmMzJfMTIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTk3MjAwLHdpZHRoPTY0MCxoZWlnaHQ9OTYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9OTcyMDAsd2lkdGg9NjQwLGhlaWdodD05NjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzY0eDEwODBwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTg5NDAsd2lkdGg9NjQsaGVpZ2h0PTEwODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xODk0MCx3aWR0aD02NCxoZWlnaHQ9MTA4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfNjR4MTI4MHA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xOTAwMyx3aWR0aD02NCxoZWlnaHQ9MTI4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE5MDAzLHdpZHRoPTY0LGhlaWdodD0xMjgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF82NHgxOTIwcDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE2NDEzLHdpZHRoPTY0LGhlaWdodD0xOTIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTY0MTMsd2lkdGg9NjQsaGVpZ2h0PTE5MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzY0eDQ4cDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI0MTA5LHdpZHRoPTY0LGhlaWdodD00OCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI0MTA5LHdpZHRoPTY0LGhlaWdodD00OCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfNjR4NjRwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjUyMjUsd2lkdGg9NjQsaGVpZ2h0PTY0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjUyMjUsd2lkdGg9NjQsaGVpZ2h0PTY0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF82NHg3MjBwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTgwMTksd2lkdGg9NjQsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE4MDE5LHdpZHRoPTY0LGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzY0eDk2cDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI1NjE4LHdpZHRoPTY0LGhlaWdodD05NixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI1NjE4LHdpZHRoPTY0LGhlaWdodD05NixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfNzA0eDUyOHA1MGYzMl83MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT01NjU4Mix3aWR0aD03MDQsaGVpZ2h0PTUyOCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTU2NTgyLHdpZHRoPTcwNCxoZWlnaHQ9NTI4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF83MDR4NTc2cDUwZjMyXzgwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTY0Mzc3LHdpZHRoPTcwNCxoZWlnaHQ9NTc2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NjQzNzcsd2lkdGg9NzA0LGhlaWdodD01NzYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzcwNHg3MDRwNTBmMzJfOTAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NzI2NDgsd2lkdGg9NzA0LGhlaWdodD03MDQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03MjY0OCx3aWR0aD03MDQsaGVpZ2h0PTcwNCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfNzIweDEyODBwNTBmMzJfMTgwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTE1MjU4Mix3aWR0aD03MjAsaGVpZ2h0PTEyODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xNTI1ODIsd2lkdGg9NzIwLGhlaWdodD0xMjgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF83MjB4MTZwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjEyMTgsd2lkdGg9NzIwLGhlaWdodD0xNixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIxMjE4LHdpZHRoPTcyMCxoZWlnaHQ9MTYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzcyMHg0ODBwNTBmMzJfNjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NDkxNTIsd2lkdGg9NzIwLGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT00OTE1Mix3aWR0aD03MjAsaGVpZ2h0PTQ4MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfNzIweDU3NnA1MGYzMl84MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT02NDU4OCx3aWR0aD03MjAsaGVpZ2h0PTU3NixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTY0NTg4LHdpZHRoPTcyMCxoZWlnaHQ9NTc2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF83MjB4NjRwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjAzMzYsd2lkdGg9NzIwLGhlaWdodD02NCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIwMzM2LHdpZHRoPTcyMCxoZWlnaHQ9NjQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzcyMHg3MjBwNTBmMzJfMTAwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTc5NjI5LHdpZHRoPTcyMCxoZWlnaHQ9NzIwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9Nzk2Mjksd2lkdGg9NzIwLGhlaWdodD03MjAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzcyMHg5NjBwNTBmMzJfMTMwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTEwNDE5Mix3aWR0aD03MjAsaGVpZ2h0PTk2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTEwNDE5Mix3aWR0aD03MjAsaGVpZ2h0PTk2MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfNzJ4MTI4cDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIyNzgyLHdpZHRoPTcyLGhlaWdodD0xMjgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMjc4Mix3aWR0aD03MixoZWlnaHQ9MTI4LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF83Mng5NnA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNDYxNix3aWR0aD03MixoZWlnaHQ9OTYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNDYxNix3aWR0aD03MixoZWlnaHQ9OTYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzc2ODB4NDMyMHA1MGYzMl8yNDAwMGticHMud2VibSI+CiAgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI1Mjg5NjMsd2lkdGg9NzY4MCxoZWlnaHQ9NDMyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KQEAgLTQxMTMzLDEzICs0MTEzMywxMyBAQAogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yOTc2ODgyLHdpZHRoPTc2ODAsaGVpZ2h0PTc2ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzc2OHgxMDI0cDUwZjMyXzE1MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0xMjE0NjMsd2lkdGg9NzY4LGhlaWdodD0xMDI0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTIxNDYzLHdpZHRoPTc2OCxoZWlnaHQ9MTAyNCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfODAweDYwMHA1MGYzMl85MDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT03MTc4Myx3aWR0aD04MDAsaGVpZ2h0PTYwMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTcxNzgzLHdpZHRoPTgwMCxoZWlnaHQ9NjAwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF84MDB4ODAwcDUwZjMyXzEyMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT05NzYwOSx3aWR0aD04MDAsaGVpZ2h0PTgwMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTk3NjA5LHdpZHRoPTgwMCxoZWlnaHQ9ODAwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF84MTkyeDQ2MDhwNTBmMzJfMjQwMDBrYnBzLndlYm0iPgogICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0zMDM3NDYzLHdpZHRoPTgxOTIsaGVpZ2h0PTQ2MDgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CkBAIC00MTE1MSw0OCArNDExNTEsNDggQEAKICAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9Mjk4OTkwMCx3aWR0aD04MTkyLGhlaWdodD04MTkyLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF84NDh4NDgwcDUwZjMyXzgwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTY0Njk2LHdpZHRoPTg0OCxoZWlnaHQ9NDgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9NjQ2OTYsd2lkdGg9ODQ4LGhlaWdodD00ODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzg0OHg2NDBwNTBmMzJfMTAwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTgwNjI1LHdpZHRoPTg0OCxoZWlnaHQ9NjQwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9ODA2MjUsd2lkdGg9ODQ4LGhlaWdodD02NDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzg0OHg4NDhwNTBmMzJfMTQwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTExNTgwMSx3aWR0aD04NDgsaGVpZ2h0PTg0OCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTExNTgwMSx3aWR0aD04NDgsaGVpZ2h0PTg0OCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfOHg4cDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI4Mzgsd2lkdGg9OCxoZWlnaHQ9OCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTI4Mzgsd2lkdGg9OCxoZWlnaHQ9OCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfOTYweDEyODBwNTBmMzJfMjQwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIwOTAyMSx3aWR0aD05NjAsaGVpZ2h0PTEyODAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMDkwMjEsd2lkdGg9OTYwLGhlaWdodD0xMjgwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF85NjB4MTQ0MHA1MGYzMl8yNzAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjM0ODQxLHdpZHRoPTk2MCxoZWlnaHQ9MTQ0MCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIzNDg0MSx3aWR0aD05NjAsaGVpZ2h0PTE0NDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzk2MHg2NDBwNTBmMzJfMTIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTk2MDE2LHdpZHRoPTk2MCxoZWlnaHQ9NjQwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9OTYwMTYsd2lkdGg9OTYwLGhlaWdodD02NDAsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzk2MHg3MjBwNTBmMzJfMTMwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTEwNDE5Myx3aWR0aD05NjAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTEwNDE5Myx3aWR0aD05NjAsaGVpZ2h0PTcyMCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfOTYweDk2MHA1MGYzMl8xODAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTQ3NTA0LHdpZHRoPTk2MCxoZWlnaHQ9OTYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MTQ3NTA0LHdpZHRoPTk2MCxoZWlnaHQ9OTYwLGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF85NngxMjhwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjE3MTMsd2lkdGg9OTYsaGVpZ2h0PTEyOCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIxNzEzLHdpZHRoPTk2LGhlaWdodD0xMjgsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzk2eDE0NHA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMjI3MCx3aWR0aD05NixoZWlnaHQ9MTQ0LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjIyNzAsd2lkdGg9OTYsaGVpZ2h0PTE0NCxmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfOTZ4MTc2cDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIwNzYzLHdpZHRoPTk2LGhlaWdodD0xNzYsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yMDc2Myx3aWR0aD05NixoZWlnaHQ9MTc2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogICA8ZW50cnkga2V5PSJ2cDkveXV2NDQ0LzhiaXQvcmVzb2x1dGlvbi9jcm93ZF85Nng2NHA1MGYzMl8yMDBrYnBzLndlYm0iPgotICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNjUwNCx3aWR0aD05NixoZWlnaHQ9NjQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9c3RhbmRhcmQ8L3ZhbHVlPgorICAgIDx2YWx1ZT5taW1lPXZpZGVvL3gtdm5kLm9uMi52cDksc2l6ZT0yNjUwNCx3aWR0aD05NixoZWlnaHQ9NjQsZnJhbWUtcmF0ZT0scHJvZmlsZT0sbGV2ZWw9LGJpdHJhdGU9LHBhY2thZ2U9ZnVsbDwvdmFsdWU+CiAgIDwvZW50cnk+CiAgIDxlbnRyeSBrZXk9InZwOS95dXY0NDQvOGJpdC9yZXNvbHV0aW9uL2Nyb3dkXzk2eDcycDUwZjMyXzIwMGticHMud2VibSI+Ci0gICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIzMzg0LHdpZHRoPTk2LGhlaWdodD03MixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1zdGFuZGFyZDwvdmFsdWU+CisgICAgPHZhbHVlPm1pbWU9dmlkZW8veC12bmQub24yLnZwOSxzaXplPTIzMzg0LHdpZHRoPTk2LGhlaWdodD03MixmcmFtZS1yYXRlPSxwcm9maWxlPSxsZXZlbD0sYml0cmF0ZT0scGFja2FnZT1mdWxsPC92YWx1ZT4KICAgPC9lbnRyeT4KICAgPGVudHJ5IGtleT0idnA5L3l1djQ0NC84Yml0L3Jlc29sdXRpb24vY3Jvd2RfOTZ4OTZwNTBmMzJfMjAwa2Jwcy53ZWJtIj4KLSAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjU2MTIsd2lkdGg9OTYsaGVpZ2h0PTk2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPXN0YW5kYXJkPC92YWx1ZT4KKyAgICA8dmFsdWU+bWltZT12aWRlby94LXZuZC5vbjIudnA5LHNpemU9MjU2MTIsd2lkdGg9OTYsaGVpZ2h0PTk2LGZyYW1lLXJhdGU9LHByb2ZpbGU9LGxldmVsPSxiaXRyYXRlPSxwYWNrYWdlPWZ1bGw8L3ZhbHVlPgogICA8L2VudHJ5PgogPC9keW5hbWljQ29uZmlnPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9tZWRpYS9iaXRzdHJlYW1zL2FwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9tZWRpYS9iaXRzdHJlYW1zL2FwcC9BbmRyb2lkLm1rCmluZGV4IDYwNzAxNDYuLjllZDU1MDYgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvbWVkaWEvYml0c3RyZWFtcy9hcHAvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL21lZGlhL2JpdHN0cmVhbXMvYXBwL0FuZHJvaWQubWsKQEAgLTI3LDcgKzI3LDcgQEAKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC1zdXBwb3J0LXRlc3QgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbCBtZWRpYS1iaXRzdHJlYW1zLWNvbW1vbi1kZXZpY2VzaWRlbGliCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZHgudGVzdC5ydWxlcyBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBtZWRpYS1iaXRzdHJlYW1zLWNvbW1vbi1kZXZpY2VzaWRlbGliCiAKICMgdGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKIExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL21lZGlhL2JpdHN0cmVhbXMvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL21lZGlhL2JpdHN0cmVhbXMvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggZDU1NjVmZC4uMGY3N2JhZCAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9tZWRpYS9iaXRzdHJlYW1zL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvbWVkaWEvYml0c3RyZWFtcy9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjMsNyArMjMsNyBAQAogICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KICAgICA8L2FwcGxpY2F0aW9uPgogCi0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5tZWRpYS5jdHMuYml0c3RyZWFtcy5hcHAiCiAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJEZXZpY2Utc2lkZSBDVFMgbWVkaWEgYml0c3RyZWFtcyBwcmVwYXJhdGlvbiIgLz4KIDwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL21lZGlhL2JpdHN0cmVhbXMvYXBwL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9iaXRzdHJlYW1zL2FwcC9NZWRpYUJpdHN0cmVhbXNEZXZpY2VTaWRlVGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9tZWRpYS9iaXRzdHJlYW1zL2FwcC9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvYml0c3RyZWFtcy9hcHAvTWVkaWFCaXRzdHJlYW1zRGV2aWNlU2lkZVRlc3QuamF2YQppbmRleCBlNTllN2EzLi42MjU4MzlmIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL21lZGlhL2JpdHN0cmVhbXMvYXBwL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9iaXRzdHJlYW1zL2FwcC9NZWRpYUJpdHN0cmVhbXNEZXZpY2VTaWRlVGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvbWVkaWEvYml0c3RyZWFtcy9hcHAvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL2JpdHN0cmVhbXMvYXBwL01lZGlhQml0c3RyZWFtc0RldmljZVNpZGVUZXN0LmphdmEKQEAgLTIxLDE2ICsyMSwyNCBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXMuRWRpdG9yOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb2RlYzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29kZWNJbmZvOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFFeHRyYWN0b3I7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUZvcm1hdDsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLmN0cy5iaXRzdHJlYW1zLk1lZGlhQml0c3RyZWFtczsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLkRlYnVnOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwogaW1wb3J0IGFuZHJvaWQudXRpbC5YbWw7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworCiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5EeW5hbWljQ29uZmlnRGV2aWNlU2lkZTsKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLk1lZGlhVXRpbHM7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLkpVbml0NDsKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxTZXJpYWxpemVyOworCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwpAQCAtNDcsMTIgKzU1LDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKLWltcG9ydCBvcmcuanVuaXQucnVubmVycy5KVW5pdDQ7Ci1pbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sU2VyaWFsaXplcjsKIAogLyoqCiAgKiBUZXN0IGNsYXNzIHRoYXQgdXNlcyBkZXZpY2Utc2lkZSBtZWRpYSBBUElzIHRvIGRldGVybWluZSB1cCB0byB3aGljaCByZXNvbHV0aW9uIE1lZGlhUHJlcGFyZXIKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvbWVkaWEvYml0c3RyZWFtcy9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvYml0c3RyZWFtcy9IZXZjWXV2NDAwQml0c3RyZWFtc1Rlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvbWVkaWEvYml0c3RyZWFtcy9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvYml0c3RyZWFtcy9IZXZjWXV2NDAwQml0c3RyZWFtc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg5MDNjZi4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL21lZGlhL2JpdHN0cmVhbXMvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL2JpdHN0cmVhbXMvSGV2Y1l1djQwMEJpdHN0cmVhbXNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS5jdHMuYml0c3RyZWFtczsKLQotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKLWltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnM7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZC5Vc2VQYXJhbWV0ZXJzUnVubmVyRmFjdG9yeTsKLQotQFJ1bldpdGgoRGV2aWNlSlVuaXQ0UGFyYW1ldGVyaXplZC5jbGFzcykKLUBVc2VQYXJhbWV0ZXJzUnVubmVyRmFjdG9yeShEZXZpY2VKVW5pdDRDbGFzc1J1bm5lcldpdGhQYXJhbWV0ZXJzLlJ1bm5lckZhY3RvcnkuY2xhc3MpCi1wdWJsaWMgY2xhc3MgSGV2Y1l1djQwMEJpdHN0cmVhbXNUZXN0IGV4dGVuZHMgTWVkaWFCaXRzdHJlYW1zVGVzdCB7Ci0KLSAgICBAUGFyYW1ldGVycyhuYW1lID0gInsxfSIpCi0gICAgcHVibGljIHN0YXRpYyBJdGVyYWJsZTxPYmplY3RbXT4gYml0c3RyZWFtcygpIHsKLSAgICAgICAgcmV0dXJuIE1lZGlhQml0c3RyZWFtc1Rlc3QuYml0c3RyZWFtcygiaGV2Yy95dXY0MDAiLCBCaXRzdHJlYW1QYWNrYWdlLlNUQU5EQVJEKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSGV2Y1l1djQwMEJpdHN0cmVhbXNUZXN0KFN0cmluZyBwcmVmaXgsIFN0cmluZyBwYXRoLAotICAgICAgICAgICAgQml0c3RyZWFtUGFja2FnZSBwa2csIEJpdHN0cmVhbVBhY2thZ2UgcGFja2FnZVRvUnVuKSB7Ci0gICAgICAgIHN1cGVyKHByZWZpeCwgcGF0aCwgcGtnLCBwYWNrYWdlVG9SdW4pOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9tZWRpYS9iaXRzdHJlYW1zL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9iaXRzdHJlYW1zL0hldmNZdXY0MjJCaXRzdHJlYW1zVGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9tZWRpYS9iaXRzdHJlYW1zL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9iaXRzdHJlYW1zL0hldmNZdXY0MjJCaXRzdHJlYW1zVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjk5MzJlLi4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvbWVkaWEvYml0c3RyZWFtcy9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvYml0c3RyZWFtcy9IZXZjWXV2NDIyQml0c3RyZWFtc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLm1lZGlhLmN0cy5iaXRzdHJlYW1zOwotCi1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQuUGFyYW1ldGVyczsKLWltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkLlVzZVBhcmFtZXRlcnNSdW5uZXJGYWN0b3J5OwotCi1AUnVuV2l0aChEZXZpY2VKVW5pdDRQYXJhbWV0ZXJpemVkLmNsYXNzKQotQFVzZVBhcmFtZXRlcnNSdW5uZXJGYWN0b3J5KERldmljZUpVbml0NENsYXNzUnVubmVyV2l0aFBhcmFtZXRlcnMuUnVubmVyRmFjdG9yeS5jbGFzcykKLXB1YmxpYyBjbGFzcyBIZXZjWXV2NDIyQml0c3RyZWFtc1Rlc3QgZXh0ZW5kcyBNZWRpYUJpdHN0cmVhbXNUZXN0IHsKLQotICAgIEBQYXJhbWV0ZXJzKG5hbWUgPSAiezF9IikKLSAgICBwdWJsaWMgc3RhdGljIEl0ZXJhYmxlPE9iamVjdFtdPiBiaXRzdHJlYW1zKCkgewotICAgICAgICByZXR1cm4gTWVkaWFCaXRzdHJlYW1zVGVzdC5iaXRzdHJlYW1zKCJoZXZjL3l1djQyMiIsIEJpdHN0cmVhbVBhY2thZ2UuU1RBTkRBUkQpOwotICAgIH0KLQotICAgIHB1YmxpYyBIZXZjWXV2NDIyQml0c3RyZWFtc1Rlc3QoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHBhdGgsCi0gICAgICAgICAgICBCaXRzdHJlYW1QYWNrYWdlIHBrZywgQml0c3RyZWFtUGFja2FnZSBwYWNrYWdlVG9SdW4pIHsKLSAgICAgICAgc3VwZXIocHJlZml4LCBwYXRoLCBwa2csIHBhY2thZ2VUb1J1bik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL21lZGlhL2JpdHN0cmVhbXMvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL2JpdHN0cmVhbXMvUmVwb3J0UHJvY2Vzc29yLmphdmEgYi9ob3N0c2lkZXRlc3RzL21lZGlhL2JpdHN0cmVhbXMvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL2JpdHN0cmVhbXMvUmVwb3J0UHJvY2Vzc29yLmphdmEKaW5kZXggM2MxZjE0ZS4uMDdiNDk2YyAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9tZWRpYS9iaXRzdHJlYW1zL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9iaXRzdHJlYW1zL1JlcG9ydFByb2Nlc3Nvci5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvbWVkaWEvYml0c3RyZWFtcy9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvYml0c3RyZWFtcy9SZXBvcnRQcm9jZXNzb3IuamF2YQpAQCAtMTYsMTMgKzE2LDE0IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5tZWRpYS5jdHMuYml0c3RyZWFtczsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi50ZXN0cnVubmVyLlRlc3RJZGVudGlmaWVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5EZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb247CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLklUZXN0RGV2aWNlOwogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmxvZy5Mb2dVdGlsLkNMb2c7CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQucmVzdWx0LklUZXN0SW52b2NhdGlvbkxpc3RlbmVyOworaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnJlc3VsdC5UZXN0RGVzY3JpcHRpb247CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuQW5kcm9pZEpVbml0VGVzdDsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC51dGlsLkZpbGVVdGlsOworCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwpAQCAtMTE3LDEyICsxMTgsMTIgQEAKICAgICBwcml2YXRlIGNsYXNzIE1lZGlhQml0c3RyZWFtc0xpc3RlbmVyIGltcGxlbWVudHMgSVRlc3RJbnZvY2F0aW9uTGlzdGVuZXIgewogCiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0RW5kZWQoVGVzdElkZW50aWZpZXIgdGVzdCwgTWFwPFN0cmluZywgU3RyaW5nPiBtZXRyaWNzKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RFbmRlZChUZXN0RGVzY3JpcHRpb24gdGVzdCwgTWFwPFN0cmluZywgU3RyaW5nPiBtZXRyaWNzKSB7CiAgICAgICAgICAgICBtTWV0cmljcy5wdXRBbGwobWV0cmljcyk7CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgdGVzdEZhaWxlZChUZXN0SWRlbnRpZmllciB0ZXN0LCBTdHJpbmcgdHJhY2UpIHsKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdEZhaWxlZChUZXN0RGVzY3JpcHRpb24gdGVzdCwgU3RyaW5nIHRyYWNlKSB7CiAgICAgICAgICAgICBtRmFpbHVyZVN0YWNrVHJhY2UgPSB0cmFjZTsKICAgICAgICAgfQogCkBAIC0xNDAsNiArMTQxLDggQEAKICAgICAgICAgaW5zdHJUZXN0LmFkZEluY2x1ZGVGaWx0ZXIoZnVsbFRlc3ROYW1lKTsKICAgICAgICAgaW5zdHJUZXN0LnNldFRlc3RUaW1lb3V0KHRlc3RUaW1lb3V0KTsKICAgICAgICAgaW5zdHJUZXN0LnNldFNoZWxsVGltZW91dChzaGVsbFRpbWVvdXQpOworICAgICAgICAvLyBkaXNhYmxlIHJlcnVuIG1vZGUgdG8gYXZvaWQgY29sbGVjdGluZyB0ZXN0cyBmaXJzdCB0aGVuIHJ1bm5pbmcuCisgICAgICAgIGluc3RyVGVzdC5zZXRSZXJ1bk1vZGUoZmFsc2UpOwogICAgICAgICBmb3IgKEVudHJ5PFN0cmluZywgU3RyaW5nPiBlIDogZ2V0QXJncygpLmVudHJ5U2V0KCkpIHsKICAgICAgICAgICAgIGluc3RyVGVzdC5hZGRJbnN0cnVtZW50YXRpb25BcmcoZS5nZXRLZXkoKSwgZS5nZXRWYWx1ZSgpKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9tZWRpYS9iaXRzdHJlYW1zL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9iaXRzdHJlYW1zL1ZwOVl1djQyMkJpdHN0cmVhbXNUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL21lZGlhL2JpdHN0cmVhbXMvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL2JpdHN0cmVhbXMvVnA5WXV2NDIyQml0c3RyZWFtc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWViNDY1YS4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL21lZGlhL2JpdHN0cmVhbXMvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL2JpdHN0cmVhbXMvVnA5WXV2NDIyQml0c3RyZWFtc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLm1lZGlhLmN0cy5iaXRzdHJlYW1zOwotCi1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQuUGFyYW1ldGVyczsKLWltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkLlVzZVBhcmFtZXRlcnNSdW5uZXJGYWN0b3J5OwotCi1AUnVuV2l0aChEZXZpY2VKVW5pdDRQYXJhbWV0ZXJpemVkLmNsYXNzKQotQFVzZVBhcmFtZXRlcnNSdW5uZXJGYWN0b3J5KERldmljZUpVbml0NENsYXNzUnVubmVyV2l0aFBhcmFtZXRlcnMuUnVubmVyRmFjdG9yeS5jbGFzcykKLXB1YmxpYyBjbGFzcyBWcDlZdXY0MjJCaXRzdHJlYW1zVGVzdCBleHRlbmRzIE1lZGlhQml0c3RyZWFtc1Rlc3QgewotCi0gICAgQFBhcmFtZXRlcnMobmFtZSA9ICJ7MX0iKQotICAgIHB1YmxpYyBzdGF0aWMgSXRlcmFibGU8T2JqZWN0W10+IGJpdHN0cmVhbXMoKSB7Ci0gICAgICAgIHJldHVybiBNZWRpYUJpdHN0cmVhbXNUZXN0LmJpdHN0cmVhbXMoInZwOS95dXY0MjIiLCBCaXRzdHJlYW1QYWNrYWdlLlNUQU5EQVJEKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVnA5WXV2NDIyQml0c3RyZWFtc1Rlc3QoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHBhdGgsCi0gICAgICAgICAgICBCaXRzdHJlYW1QYWNrYWdlIHBrZywgQml0c3RyZWFtUGFja2FnZSBwYWNrYWdlVG9SdW4pIHsKLSAgICAgICAgc3VwZXIocHJlZml4LCBwYXRoLCBwa2csIHBhY2thZ2VUb1J1bik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9CYXNlTXVsdGlVc2VyVGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvQmFzZU11bHRpVXNlclRlc3QuamF2YQppbmRleCAzZTQ0YzRmLi5lNmY4YzYyIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9CYXNlTXVsdGlVc2VyVGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL0Jhc2VNdWx0aVVzZXJUZXN0LmphdmEKQEAgLTE4LDE0ICsxOCwxNCBAQAogCiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQuYnVpbGQuQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi50ZXN0cnVubmVyLlJlbW90ZUFuZHJvaWRUZXN0UnVubmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi50ZXN0cnVubmVyLlRlc3RJZGVudGlmaWVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi50ZXN0cnVubmVyLlRlc3RSZXN1bHQ7CiBpbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLnRlc3RydW5uZXIuVGVzdFJlc3VsdC5UZXN0U3RhdHVzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi50ZXN0cnVubmVyLlRlc3RSdW5SZXN1bHQ7CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuYnVpbGQuSUJ1aWxkSW5mbzsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmxvZy5Mb2dVdGlsLkNMb2c7CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQucmVzdWx0LkNvbGxlY3RpbmdUZXN0TGlzdGVuZXI7CitpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQucmVzdWx0LlRlc3REZXNjcmlwdGlvbjsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5yZXN1bHQuVGVzdFJlc3VsdDsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5yZXN1bHQuVGVzdFJ1blJlc3VsdDsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5EZXZpY2VUZXN0Q2FzZTsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JQnVpbGRSZWNlaXZlcjsKIApAQCAtNDQsNyArNDQsNyBAQAogICogQmFzZSBjbGFzcyBmb3IgaG9zdC1zaWRlIHRlc3RzIGZvciBtdWx0aS11c2VyIGF3YXJlIG1lZGlhIEFQSXMuCiAgKi8KIHB1YmxpYyBjbGFzcyBCYXNlTXVsdGlVc2VyVGVzdCBleHRlbmRzIERldmljZVRlc3RDYXNlIGltcGxlbWVudHMgSUJ1aWxkUmVjZWl2ZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSVU5ORVIgPSAiYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJVTk5FUiA9ICJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiOwogCiAgICAgLyoqCiAgICAgICogVGhlIGRlZmluZWQgdGltZW91dCAoaW4gbWlsbGlzZWNvbmRzKSBpcyB1c2VkIGFzIGEgbWF4aW11bSB3YWl0aW5nIHRpbWUgd2hlbiBleHBlY3RpbmcgdGhlCkBAIC0xNTAsMTIgKzE1MCwxNyBAQAogICAgICAqIEBwYXJhbSBhcHBGaWxlTmFtZSBmaWxlIG5hbWUgb2YgdGhlIGFwcC4KICAgICAgKiBAcGFyYW0gdXNlcklkIHVzZXIgSUQgdG8gaW5zdGFsbCB0aGUgYXBwIGFnYWluc3QuCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5zdGFsbEFwcEFzVXNlcihTdHJpbmcgYXBwRmlsZU5hbWUsIGludCB1c2VySWQpCisgICAgcHJvdGVjdGVkIHZvaWQgaW5zdGFsbEFwcEFzVXNlcihTdHJpbmcgYXBwRmlsZU5hbWUsIGludCB1c2VySWQsIGJvb2xlYW4gYXNJbnN0YW50QXBwKQogICAgICAgICAgICAgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKICAgICAgICAgQ0xvZy5kKCJJbnN0YWxsaW5nIGFwcCAiICsgYXBwRmlsZU5hbWUgKyAiIGZvciB1c2VyICIgKyB1c2VySWQpOwogICAgICAgICBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIgYnVpbGRIZWxwZXIgPSBuZXcgQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyKG1DdHNCdWlsZCk7CiAgICAgICAgIFN0cmluZyByZXN1bHQgPSBnZXREZXZpY2UoKS5pbnN0YWxsUGFja2FnZUZvclVzZXIoCi0gICAgICAgICAgICAgICAgYnVpbGRIZWxwZXIuZ2V0VGVzdEZpbGUoYXBwRmlsZU5hbWUpLCB0cnVlLCB0cnVlLCB1c2VySWQsICItdCIpOworICAgICAgICAgICAgICAgIGJ1aWxkSGVscGVyLmdldFRlc3RGaWxlKGFwcEZpbGVOYW1lKSwKKyAgICAgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICAgICAgdXNlcklkLAorICAgICAgICAgICAgICAgICItdCIsCisgICAgICAgICAgICAgICAgYXNJbnN0YW50QXBwID8gIi0taW5zdGFudCIgOiAiIik7CiAgICAgICAgIGFzc2VydE51bGwoIkZhaWxlZCB0byBpbnN0YWxsICIgKyBhcHBGaWxlTmFtZSArICIgZm9yIHVzZXIgIiArIHVzZXJJZCArICI6ICIgKyByZXN1bHQsCiAgICAgICAgICAgICAgICAgcmVzdWx0KTsKICAgICB9CkBAIC0yNzUsNyArMjgwLDcgQEAKICAgICAgICAgaWYgKHJlc3VsdC5oYXNGYWlsZWRUZXN0cygpKSB7CiAgICAgICAgICAgICAvLyBCdWlsZCBhIG1lYW5pbmdmdWwgZXJyb3IgbWVzc2FnZQogICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBlcnJvckJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigiT24tZGV2aWNlIHRlc3RzIGZhaWxlZDpcbiIpOwotICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8VGVzdElkZW50aWZpZXIsIFRlc3RSZXN1bHQ+IHJlc3VsdEVudHJ5IDoKKyAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFRlc3REZXNjcmlwdGlvbiwgVGVzdFJlc3VsdD4gcmVzdWx0RW50cnkgOgogICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0VGVzdFJlc3VsdHMoKS5lbnRyeVNldCgpKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHRFbnRyeS5nZXRWYWx1ZSgpLmdldFN0YXR1cygpLmVxdWFscyhUZXN0U3RhdHVzLlBBU1NFRCkpIHsKICAgICAgICAgICAgICAgICAgICAgZXJyb3JCdWlsZGVyLmFwcGVuZChyZXN1bHRFbnRyeS5nZXRLZXkoKS50b1N0cmluZygpKTsKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvc2Vzc2lvbi9jdHMvTWVkaWFTZXNzaW9uTWFuYWdlckhvc3RUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL3Nlc3Npb24vY3RzL01lZGlhU2Vzc2lvbk1hbmFnZXJIb3N0VGVzdC5qYXZhCmluZGV4IDRlM2ZhMTYuLmE1YWE5OTggMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvc2Vzc2lvbi9jdHMvTWVkaWFTZXNzaW9uTWFuYWdlckhvc3RUZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL2N0cy9NZWRpYVNlc3Npb25NYW5hZ2VySG9zdFRlc3QuamF2YQpAQCAtMjQsNiArMjQsOCBAQAogaW1wb3J0IGFuZHJvaWQubWVkaWEuY3RzLkJhc2VNdWx0aVVzZXJUZXN0OwogaW1wb3J0IGFuZHJvaWQubWVkaWEuY3RzLk1lZGlhU2Vzc2lvblRlc3RIZWxwZXJDb25zdGFudHM7CiAKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVJbnN0YW50OwogaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5SZXF1aXJlc0RldmljZTsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5Mb2cuTG9nTGV2ZWw7CkBAIC04MSw4ICs4MywyMiBAQAogICAgIC8qKgogICAgICAqIFRlc3RzIHtAbGluayBNZWRpYVNlc3Npb25NYW5hZ2VyI2dldEFjdGl2ZVNlc3Npb25zfSB3aXRoIHRoZSBwcmltYXJ5IHVzZXIuCiAgICAgICovCisgICAgQEFwcE1vZGVJbnN0YW50CiAgICAgQFJlcXVpcmVzRGV2aWNlCi0gICAgcHVibGljIHZvaWQgdGVzdEdldEFjdGl2ZVNlc3Npb25zX3ByaW1hcnlVc2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdEdldEFjdGl2ZVNlc3Npb25zSW5zdGFudF9wcmltYXJ5VXNlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0R2V0QWN0aXZlU2Vzc2lvbnNfcHJpbWFyeVVzZXIodHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMge0BsaW5rIE1lZGlhU2Vzc2lvbk1hbmFnZXIjZ2V0QWN0aXZlU2Vzc2lvbnN9IHdpdGggdGhlIHByaW1hcnkgdXNlci4KKyAgICAgKi8KKyAgICBAQXBwTW9kZUZ1bGwKKyAgICBAUmVxdWlyZXNEZXZpY2UKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QWN0aXZlU2Vzc2lvbnNGdWxsX3ByaW1hcnlVc2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RHZXRBY3RpdmVTZXNzaW9uc19wcmltYXJ5VXNlcihmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RHZXRBY3RpdmVTZXNzaW9uc19wcmltYXJ5VXNlcihib29sZWFuIGluc3RhbnQpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBpZiAobU5vdGlmaWNhdGlvbkxpc3RlbmVyRGlzYWJsZWQpIHsKICAgICAgICAgICAgIENMb2cubG9nQW5kRGlzcGxheShMb2dMZXZlbC5JTkZPLAogICAgICAgICAgICAgICAgICAgICAiTm90aWZpY2F0aW9uTGlzdGVuZXIgaXMgZGlzYWJsZWQuIFRlc3Qgd29uJ3QgcnVuLiIpOwpAQCAtOTEsMTAgKzEwNywxMCBAQAogICAgICAgICBpbnQgcHJpbWFyeVVzZXJJZCA9IGdldERldmljZSgpLmdldFByaW1hcnlVc2VySWQoKTsKIAogICAgICAgICBzZXRBbGxvd0dldEFjdGl2ZVNlc3Npb25Gb3JUZXN0KHRydWUsIHByaW1hcnlVc2VySWQpOwotICAgICAgICBpbnN0YWxsQXBwQXNVc2VyKERFVklDRV9TSURFX1RFU1RfQVBLLCBwcmltYXJ5VXNlcklkKTsKKyAgICAgICAgaW5zdGFsbEFwcEFzVXNlcihERVZJQ0VfU0lERV9URVNUX0FQSywgcHJpbWFyeVVzZXJJZCwgaW5zdGFudCk7CiAgICAgICAgIHJ1blRlc3QoInRlc3RHZXRBY3RpdmVTZXNzaW9uc19ub01lZGlhU2Vzc2lvbkZyb21NZWRpYVNlc3Npb25UZXN0SGVscGVyIik7CiAKLSAgICAgICAgaW5zdGFsbEFwcEFzVXNlcihNRURJQV9TRVNTSU9OX1RFU1RfSEVMUEVSX0FQSywgcHJpbWFyeVVzZXJJZCk7CisgICAgICAgIGluc3RhbGxBcHBBc1VzZXIoTUVESUFfU0VTU0lPTl9URVNUX0hFTFBFUl9BUEssIHByaW1hcnlVc2VySWQsIGZhbHNlKTsKICAgICAgICAgc2VuZENvbnRyb2xDb21tYW5kKHByaW1hcnlVc2VySWQsIEZMQUdfQ1JFQVRFX01FRElBX1NFU1NJT04pOwogICAgICAgICBydW5UZXN0KCJ0ZXN0R2V0QWN0aXZlU2Vzc2lvbnNfbm9NZWRpYVNlc3Npb25Gcm9tTWVkaWFTZXNzaW9uVGVzdEhlbHBlciIpOwogCkBAIC0xMDUsOCArMTIxLDIyIEBACiAgICAgLyoqCiAgICAgICogVGVzdHMge0BsaW5rIE1lZGlhU2Vzc2lvbk1hbmFnZXIjZ2V0QWN0aXZlU2Vzc2lvbnN9IHdpdGggYWRkaXRpb25hbCB1c2Vycy4KICAgICAgKi8KKyAgICBAQXBwTW9kZUluc3RhbnQKICAgICBAUmVxdWlyZXNEZXZpY2UKLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QWN0aXZlU2Vzc2lvbnNfYWRkaXRpb25hbFVzZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QWN0aXZlU2Vzc2lvbnNJbnN0YW50X2FkZGl0aW9uYWxVc2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RHZXRBY3RpdmVTZXNzaW9uc19hZGRpdGlvbmFsVXNlcih0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB7QGxpbmsgTWVkaWFTZXNzaW9uTWFuYWdlciNnZXRBY3RpdmVTZXNzaW9uc30gd2l0aCBhZGRpdGlvbmFsIHVzZXJzLgorICAgICAqLworICAgIEBBcHBNb2RlRnVsbAorICAgIEBSZXF1aXJlc0RldmljZQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBY3RpdmVTZXNzaW9uc0Z1bGxfYWRkaXRpb25hbFVzZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdEdldEFjdGl2ZVNlc3Npb25zX2FkZGl0aW9uYWxVc2VyKGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdEdldEFjdGl2ZVNlc3Npb25zX2FkZGl0aW9uYWxVc2VyKGJvb2xlYW4gaW5zdGFudCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghY2FuQ3JlYXRlQWRkaXRpb25hbFVzZXJzKDEpKSB7CiAgICAgICAgICAgICBDTG9nLmxvZ0FuZERpc3BsYXkoTG9nTGV2ZWwuSU5GTywKICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBjcmVhdGUgYSBuZXcgdXNlci4gU2tpcHBpbmcgbXVsdGktdXNlciB0ZXN0IGNhc2VzLiIpOwpAQCAtMTIwLDcgKzE1MCw3IEBACiAKICAgICAgICAgLy8gVGVzdCBpZiBhbm90aGVyIHVzZXIgY2FuIGdldCB0aGUgc2Vzc2lvbi4KICAgICAgICAgaW50IG5ld1VzZXIgPSBjcmVhdGVBbmRTdGFydFVzZXIoKTsKLSAgICAgICAgaW5zdGFsbEFwcEFzVXNlcihERVZJQ0VfU0lERV9URVNUX0FQSywgbmV3VXNlcik7CisgICAgICAgIGluc3RhbGxBcHBBc1VzZXIoREVWSUNFX1NJREVfVEVTVF9BUEssIG5ld1VzZXIsIGluc3RhbnQpOwogICAgICAgICBzZXRBbGxvd0dldEFjdGl2ZVNlc3Npb25Gb3JUZXN0KHRydWUsIG5ld1VzZXIpOwogICAgICAgICBydW5UZXN0QXNVc2VyKCJ0ZXN0R2V0QWN0aXZlU2Vzc2lvbnNfbm9NZWRpYVNlc3Npb24iLCBuZXdVc2VyKTsKICAgICAgICAgcmVtb3ZlVXNlcihuZXdVc2VyKTsKQEAgLTEyOSw4ICsxNTksMjMgQEAKICAgICAvKioKICAgICAgKiBUZXN0cyB7QGxpbmsgTWVkaWFTZXNzaW9uTWFuYWdlciNnZXRBY3RpdmVTZXNzaW9uc30gd2l0aCByZXN0cmljdGVkIHByb2ZpbGVzLgogICAgICAqLworICAgIEBBcHBNb2RlSW5zdGFudAogICAgIEBSZXF1aXJlc0RldmljZQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBY3RpdmVTZXNzaW9uc19yZXN0cmljdGVkUHJvZmlsZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QWN0aXZlU2Vzc2lvbnNJbnN0YW50X3Jlc3RyaWN0ZWRQcm9maWxlcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0R2V0QWN0aXZlU2Vzc2lvbnNfcmVzdHJpY3RlZFByb2ZpbGVzKHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHtAbGluayBNZWRpYVNlc3Npb25NYW5hZ2VyI2dldEFjdGl2ZVNlc3Npb25zfSB3aXRoIHJlc3RyaWN0ZWQgcHJvZmlsZXMuCisgICAgICovCisgICAgQEFwcE1vZGVGdWxsCisgICAgQFJlcXVpcmVzRGV2aWNlCisgICAgcHVibGljIHZvaWQgdGVzdEdldEFjdGl2ZVNlc3Npb25zRnVsbF9yZXN0cmljdGVkUHJvZmlsZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdEdldEFjdGl2ZVNlc3Npb25zX3Jlc3RyaWN0ZWRQcm9maWxlcyhmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RHZXRBY3RpdmVTZXNzaW9uc19yZXN0cmljdGVkUHJvZmlsZXMoYm9vbGVhbiBpbnN0YW50KQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghY2FuQ3JlYXRlQWRkaXRpb25hbFVzZXJzKDEpKSB7CiAgICAgICAgICAgICBDTG9nLmxvZ0FuZERpc3BsYXkoTG9nTGV2ZWwuSU5GTywKICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBjcmVhdGUgYSBuZXcgdXNlci4gU2tpcHBpbmcgbXVsdGktdXNlciB0ZXN0IGNhc2VzLiIpOwpAQCAtMTQ1LDcgKzE5MCw3IEBACiAgICAgICAgIC8vIFRlc3QgaWYgYW5vdGhlciByZXN0cmljdGVkIHByb2ZpbGUgY2FuIGdldCB0aGUgc2Vzc2lvbi4KICAgICAgICAgLy8gUmVtb3ZlIHRoZSBjcmVhdGVkIHVzZXIgZmlyc3Qgbm90IHRvIGV4Y2VlZCBzeXN0ZW0ncyB1c2VyIG51bWJlciBsaW1pdC4KICAgICAgICAgaW50IG5ld1VzZXIgPSBjcmVhdGVBbmRTdGFydFJlc3RyaWN0ZWRQcm9maWxlKGdldERldmljZSgpLmdldFByaW1hcnlVc2VySWQoKSk7Ci0gICAgICAgIGluc3RhbGxBcHBBc1VzZXIoREVWSUNFX1NJREVfVEVTVF9BUEssIG5ld1VzZXIpOworICAgICAgICBpbnN0YWxsQXBwQXNVc2VyKERFVklDRV9TSURFX1RFU1RfQVBLLCBuZXdVc2VyLCBpbnN0YW50KTsKICAgICAgICAgc2V0QWxsb3dHZXRBY3RpdmVTZXNzaW9uRm9yVGVzdCh0cnVlLCBuZXdVc2VyKTsKICAgICAgICAgcnVuVGVzdEFzVXNlcigidGVzdEdldEFjdGl2ZVNlc3Npb25zX25vTWVkaWFTZXNzaW9uIiwgbmV3VXNlcik7CiAgICAgICAgIHJlbW92ZVVzZXIobmV3VXNlcik7CkBAIC0xNTQsOCArMTk5LDIzIEBACiAgICAgLyoqCiAgICAgICogVGVzdHMge0BsaW5rIE1lZGlhU2Vzc2lvbk1hbmFnZXIjZ2V0QWN0aXZlU2Vzc2lvbnN9IHdpdGggbWFuYWdlZCBwcm9maWxlcy4KICAgICAgKi8KKyAgICBAQXBwTW9kZUluc3RhbnQKICAgICBAUmVxdWlyZXNEZXZpY2UKLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QWN0aXZlU2Vzc2lvbnNfbWFuYWdlZFByb2ZpbGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdEdldEFjdGl2ZVNlc3Npb25zSW5zdGFudF9tYW5hZ2VkUHJvZmlsZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdEdldEFjdGl2ZVNlc3Npb25zX21hbmFnZWRQcm9maWxlcyh0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB7QGxpbmsgTWVkaWFTZXNzaW9uTWFuYWdlciNnZXRBY3RpdmVTZXNzaW9uc30gd2l0aCBtYW5hZ2VkIHByb2ZpbGVzLgorICAgICAqLworICAgIEBBcHBNb2RlRnVsbAorICAgIEBSZXF1aXJlc0RldmljZQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBY3RpdmVTZXNzaW9uc0Z1bGxfbWFuYWdlZFByb2ZpbGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RHZXRBY3RpdmVTZXNzaW9uc19tYW5hZ2VkUHJvZmlsZXMoZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0R2V0QWN0aXZlU2Vzc2lvbnNfbWFuYWdlZFByb2ZpbGVzKGJvb2xlYW4gaW5zdGFudCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBpZiAoIWhhc0RldmljZUZlYXR1cmUoImFuZHJvaWQuc29mdHdhcmUubWFuYWdlZF91c2VycyIpKSB7CiAgICAgICAgICAgICBDTG9nLmxvZ0FuZERpc3BsYXkoTG9nTGV2ZWwuSU5GTywKICAgICAgICAgICAgICAgICAgICAgIkRldmljZSBkb2Vzbid0IHN1cHBvcnQgbWFuYWdlZCBwcm9maWxlcy4gVGVzdCB3b24ndCBydW4uIik7CkBAIC0xNzAsNyArMjMwLDcgQEAKICAgICAgICAgLy8gVGVzdCBpZiBhbm90aGVyIG1hbmFnZWQgcHJvZmlsZSBjYW4gZ2V0IHRoZSBzZXNzaW9uLgogICAgICAgICAvLyBSZW1vdmUgdGhlIGNyZWF0ZWQgdXNlciBmaXJzdCBub3QgdG8gZXhjZWVkIHN5c3RlbSdzIHVzZXIgbnVtYmVyIGxpbWl0LgogICAgICAgICBpbnQgbmV3VXNlciA9IGNyZWF0ZUFuZFN0YXJ0TWFuYWdlZFByb2ZpbGUoZ2V0RGV2aWNlKCkuZ2V0UHJpbWFyeVVzZXJJZCgpKTsKLSAgICAgICAgaW5zdGFsbEFwcEFzVXNlcihERVZJQ0VfU0lERV9URVNUX0FQSywgbmV3VXNlcik7CisgICAgICAgIGluc3RhbGxBcHBBc1VzZXIoREVWSUNFX1NJREVfVEVTVF9BUEssIG5ld1VzZXIsIGluc3RhbnQpOwogICAgICAgICBzZXRBbGxvd0dldEFjdGl2ZVNlc3Npb25Gb3JUZXN0KHRydWUsIG5ld1VzZXIpOwogICAgICAgICBydW5UZXN0QXNVc2VyKCJ0ZXN0R2V0QWN0aXZlU2Vzc2lvbnNfbm9NZWRpYVNlc3Npb24iLCBuZXdVc2VyKTsKICAgICAgICAgcmVtb3ZlVXNlcihuZXdVc2VyKTsKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvbW9ua2V5L0FuZHJvaWRUZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvbW9ua2V5L0FuZHJvaWRUZXN0LnhtbAppbmRleCA2NDc5OTE1Li5hZDE1MDdhIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL21vbmtleS9BbmRyb2lkVGVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9tb25rZXkvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciB0aGUgQ1RTIG1vbmtleSBob3N0IHRlc3RzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0ibWlzYyIgLz4KICAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGVzdHR5cGUuSmFySG9zdFRlc3QiID4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJqYXIiIHZhbHVlPSJDdHNNb25rZXlUZXN0Q2FzZXMuamFyIiAvPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9tb25rZXkvc3JjL2NvbS9hbmRyb2lkL2N0cy9tb25rZXkvQ2F0ZWdvcnlUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL21vbmtleS9zcmMvY29tL2FuZHJvaWQvY3RzL21vbmtleS9DYXRlZ29yeVRlc3QuamF2YQppbmRleCA0NDkwOWM4Li5mM2JiNWQ5IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL21vbmtleS9zcmMvY29tL2FuZHJvaWQvY3RzL21vbmtleS9DYXRlZ29yeVRlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL21vbmtleS9zcmMvY29tL2FuZHJvaWQvY3RzL21vbmtleS9DYXRlZ29yeVRlc3QuamF2YQpAQCAtMTgsMTUgKzE4LDEyIEBACiAKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuQ29sbGVjdGluZ091dHB1dFJlY2VpdmVyOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DZGRUZXN0OwotCiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiAKIHB1YmxpYyBjbGFzcyBDYXRlZ29yeVRlc3QgZXh0ZW5kcyBBYnN0cmFjdE1vbmtleVRlc3QgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBNQVhfVElNRU9VVCA9IDUgKiA2MCAqIDEwMDA7IC8vIDUgbWluCiAKLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iNi4xL0MtMC04IikKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdENhdGVnb3JpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIGNtZCA9IE1PTktFWV9DTUQgKyAiIC12IC1wICIgKyBQS0dTWzBdICsgIiA1MDAwIjsKICAgICAgICAgQ29sbGVjdGluZ091dHB1dFJlY2VpdmVyIHJlY2VpdmVyID0gbmV3IENvbGxlY3RpbmdPdXRwdXRSZWNlaXZlcigpOwpAQCAtNDIsNyArMzksNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjYuMS9DLTAtOCIpCiAgICAgcHVibGljIHZvaWQgdGVzdFNpbmdsZUNhdGVnb3J5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZyBjbWQgPSBNT05LRVlfQ01EICsgIiAtdiAtcCAiICsgUEtHU1swXQogICAgICAgICAgICAgICAgICsgIiAtYyBhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiA1MDAwIjsKQEAgLTczLDcgKzY5LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI2LjEvQy0wLTgiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZUNhdGVnb3JpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIGNtZCA9IE1PTktFWV9DTUQgKyAiIC12IC1wICIgKyBQS0dTWzBdCiAgICAgICAgICAgICAgICAgKyAiIC1jIGFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9tb25rZXkvc3JjL2NvbS9hbmRyb2lkL2N0cy9tb25rZXkvTW9ua2V5VGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9tb25rZXkvc3JjL2NvbS9hbmRyb2lkL2N0cy9tb25rZXkvTW9ua2V5VGVzdC5qYXZhCmluZGV4IDQzZjI5ZDguLjAyNDE4NzkgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvbW9ua2V5L3NyYy9jb20vYW5kcm9pZC9jdHMvbW9ua2V5L01vbmtleVRlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL21vbmtleS9zcmMvY29tL2FuZHJvaWQvY3RzL21vbmtleS9Nb25rZXlUZXN0LmphdmEKQEAgLTE5LDggKzE5LDYgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuTnVsbE91dHB1dFJlY2VpdmVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5EZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb247CiAKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNkZFRlc3Q7Ci0KIGltcG9ydCBqYXZhLnV0aWwuU2Nhbm5lcjsKIAogcHVibGljIGNsYXNzIE1vbmtleVRlc3QgZXh0ZW5kcyBBYnN0cmFjdE1vbmtleVRlc3QgewpAQCAtMjgsMTMgKzI2LDExIEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1PTktFWSA9ICJAKD4uPClAIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFVNQU4gPSAiKF5fXikiOwogCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjYuMS9DLTAtOCIpCiAgICAgcHVibGljIHZvaWQgdGVzdElzTW9ua2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIG1EZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZChNT05LRVlfQ01EICsgIiAtcCAiICsgUEtHU1swXSArICIgNTAwIik7CiAgICAgICAgIGFzc2VydElzVXNlckFNb25rZXkodHJ1ZSk7CiAgICAgfQogCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjYuMS9DLTAtOCIpCiAgICAgcHVibGljIHZvaWQgdGVzdE5vdE1vbmtleSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBtRGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoImFtIHN0YXJ0IC1XIC1hIGFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOICIKICAgICAgICAgICAgICAgICArICItbiBjb20uYW5kcm9pZC5jdHMubW9ua2V5L2NvbS5hbmRyb2lkLmN0cy5tb25rZXkuTW9ua2V5QWN0aXZpdHkiLApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9tb25rZXkvc3JjL2NvbS9hbmRyb2lkL2N0cy9tb25rZXkvUGFja2FnZVRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvbW9ua2V5L3NyYy9jb20vYW5kcm9pZC9jdHMvbW9ua2V5L1BhY2thZ2VUZXN0LmphdmEKaW5kZXggMWRlYTA1NS4uYjNhMjJkNiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9tb25rZXkvc3JjL2NvbS9hbmRyb2lkL2N0cy9tb25rZXkvUGFja2FnZVRlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL21vbmtleS9zcmMvY29tL2FuZHJvaWQvY3RzL21vbmtleS9QYWNrYWdlVGVzdC5qYXZhCkBAIC0xOCw4ICsxOCw2IEBACiAKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuQ29sbGVjdGluZ091dHB1dFJlY2VpdmVyOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DZGRUZXN0OwotCiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiBpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CiAKQEAgLTM1LDcgKzMzLDYgQEAKICAgICAgICAgICAgIFBhdHRlcm4uY29tcGlsZSgiXi4qQWxsb3dpbmcuKmNtcD1jb21cXC5hbmRyb2lkXFwuY3RzXFwubW9ua2V5Mi9cXC5DaGltcEFjdGl2aXR5LiokIiwKICAgICAgICAgICAgICAgICAgICAgUGF0dGVybi5NVUxUSUxJTkUpOwogCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjYuMS9DLTAtOCIpCiAgICAgcHVibGljIHZvaWQgdGVzdFNpbmdsZVBhY2thZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIGNtZCA9IE1PTktFWV9DTUQgKyAiIC12IC1wICIgKyBQS0dTWzBdICsgIiA1MDAwIjsKICAgICAgICAgQ29sbGVjdGluZ091dHB1dFJlY2VpdmVyIHJlY2VpdmVyID0gbmV3IENvbGxlY3RpbmdPdXRwdXRSZWNlaXZlcigpOwpAQCAtNjYsNyArNjMsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjYuMS9DLTAtOCIpCiAgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlUGFja2FnZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIGNtZCA9IE1PTktFWV9DTUQgKyAiIC12IC1wICIgKyBQS0dTWzBdICsgIiAtcCAiICsgUEtHU1sxXSArICIgNTAwMCI7CiAgICAgICAgIENvbGxlY3RpbmdPdXRwdXRSZWNlaXZlciByZWNlaXZlciA9IG5ldyBDb2xsZWN0aW5nT3V0cHV0UmVjZWl2ZXIoKTsKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvbXVsdGl1c2VyL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL211bHRpdXNlci9BbmRyb2lkLm1rCmluZGV4IDk4MjdjYTcuLmU0YzY1NGQgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvbXVsdGl1c2VyL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9tdWx0aXVzZXIvQW5kcm9pZC5tawpAQCAtMjIsNyArMjIsNyBAQAogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKLUxPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IHRvb2xzLWNvbW1vbi1wcmVidWlsdCBjdHMtdHJhZGVmZWQgdHJhZGVmZWQKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IHRvb2xzLWNvbW1vbi1wcmVidWlsdCBjdHMtdHJhZGVmZWQgdHJhZGVmZWQgcGxhdGZvcm0tdGVzdC1hbm5vdGF0aW9ucy1ob3N0CiAKIExPQ0FMX0NUU19URVNUX1BBQ0tBR0UgOj0gYW5kcm9pZC5ob3N0Lm11bHRpdXNlcgogCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL211bHRpdXNlci9BbmRyb2lkVGVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL211bHRpdXNlci9BbmRyb2lkVGVzdC54bWwKaW5kZXggMjdhMjA3My4uM2MzNTljMCAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9tdWx0aXVzZXIvQW5kcm9pZFRlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvbXVsdGl1c2VyL0FuZHJvaWRUZXN0LnhtbApAQCAtMTQsNiArMTQsNyBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgdGhlIENUUyBtdWx0aXVzZXIgaG9zdCB0ZXN0cyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImZyYW1ld29yayIgLz4KICAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGVzdHR5cGUuSmFySG9zdFRlc3QiID4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJqYXIiIHZhbHVlPSJDdHNNdWx0aVVzZXJIb3N0VGVzdENhc2VzLmphciIgLz4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvbXVsdGl1c2VyL3NyYy9hbmRyb2lkL2hvc3QvbXVsdGl1c2VyL0Jhc2VNdWx0aVVzZXJUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL211bHRpdXNlci9zcmMvYW5kcm9pZC9ob3N0L211bHRpdXNlci9CYXNlTXVsdGlVc2VyVGVzdC5qYXZhCmluZGV4IGU1MTBjYWUuLjAxZTc3OTUgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvbXVsdGl1c2VyL3NyYy9hbmRyb2lkL2hvc3QvbXVsdGl1c2VyL0Jhc2VNdWx0aVVzZXJUZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9tdWx0aXVzZXIvc3JjL2FuZHJvaWQvaG9zdC9tdWx0aXVzZXIvQmFzZU11bHRpVXNlclRlc3QuamF2YQpAQCAtMTUsNTkgKzE1LDYxIEBACiAgKi8KIHBhY2thZ2UgYW5kcm9pZC5ob3N0Lm11bHRpdXNlcjsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmJ1aWxkLklCdWlsZEluZm87CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLkRldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuSVRlc3REZXZpY2U7CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQubG9nLkxvZ1V0aWwuQ0xvZzsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5EZXZpY2VUZXN0Q2FzZTsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JQnVpbGRSZWNlaXZlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JRGV2aWNlVGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIAogLyoqCiAgKiBCYXNlIGNsYXNzIGZvciBtdWx0aSB1c2VyIHRlc3RzLgogICovCi1wdWJsaWMgY2xhc3MgQmFzZU11bHRpVXNlclRlc3QgZXh0ZW5kcyBEZXZpY2VUZXN0Q2FzZSBpbXBsZW1lbnRzIElCdWlsZFJlY2VpdmVyIHsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBVU0VSX1NZU1RFTSA9IDA7IC8vIEZyb20gdGhlIFVzZXJIYW5kbGUgY2xhc3MuCi0KLSAgICBwcm90ZWN0ZWQgSUJ1aWxkSW5mbyBtQnVpbGRJbmZvOwotCitwdWJsaWMgY2xhc3MgQmFzZU11bHRpVXNlclRlc3QgaW1wbGVtZW50cyBJRGV2aWNlVGVzdCB7CiAgICAgLyoqIFdoZXRoZXIgbXVsdGktdXNlciBpcyBzdXBwb3J0ZWQuICovCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gbVN1cHBvcnRzTXVsdGlVc2VyOwogICAgIHByb3RlY3RlZCBib29sZWFuIG1Jc1NwbGl0U3lzdGVtVXNlcjsKKyAgICBwcm90ZWN0ZWQgaW50IG1Jbml0aWFsVXNlcklkOwogICAgIHByb3RlY3RlZCBpbnQgbVByaW1hcnlVc2VySWQ7Ci0gICAgLyoqIFVzZXJzIHdlIHNob3VsZG4ndCBkZWxldGUgaW4gdGhlIHRlc3RzICovCisKKyAgICAvKiogVXNlcnMgd2Ugc2hvdWxkbid0IGRlbGV0ZSBpbiB0aGUgdGVzdHMuICovCiAgICAgcHJpdmF0ZSBBcnJheUxpc3Q8SW50ZWdlcj4gbUZpeGVkVXNlcnM7CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRCdWlsZChJQnVpbGRJbmZvIGJ1aWxkSW5mbykgewotICAgICAgICBtQnVpbGRJbmZvID0gYnVpbGRJbmZvOwotICAgIH0KKyAgICBwcml2YXRlIElUZXN0RGV2aWNlIG1EZXZpY2U7CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG1CdWlsZEluZm8pOyAvLyBlbnN1cmUgYnVpbGQgaGFzIGJlZW4gc2V0IGJlZm9yZSB0ZXN0IGlzIHJ1bi4KLQorICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBtU3VwcG9ydHNNdWx0aVVzZXIgPSBnZXREZXZpY2UoKS5nZXRNYXhOdW1iZXJPZlVzZXJzU3VwcG9ydGVkKCkgPiAxOwogICAgICAgICBtSXNTcGxpdFN5c3RlbVVzZXIgPSBjaGVja0lmU3BsaXRTeXN0ZW1Vc2VyKCk7CisKKyAgICAgICAgbUluaXRpYWxVc2VySWQgPSBnZXREZXZpY2UoKS5nZXRDdXJyZW50VXNlcigpOwogICAgICAgICBtUHJpbWFyeVVzZXJJZCA9IGdldERldmljZSgpLmdldFByaW1hcnlVc2VySWQoKTsKLSAgICAgICAgbUZpeGVkVXNlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgbUZpeGVkVXNlcnMuYWRkKG1QcmltYXJ5VXNlcklkKTsKLSAgICAgICAgaWYgKG1QcmltYXJ5VXNlcklkICE9IFVTRVJfU1lTVEVNKSB7Ci0gICAgICAgICAgICBtRml4ZWRVc2Vycy5hZGQoVVNFUl9TWVNURU0pOworCisgICAgICAgIC8vIFRlc3Qgc2hvdWxkIG5vdCBtb2RpZnkgLyByZW1vdmUgYW55IG9mIHRoZSBleGlzdGluZyB1c2Vycy4KKyAgICAgICAgbUZpeGVkVXNlcnMgPSBnZXREZXZpY2UoKS5saXN0VXNlcnMoKTsKKyAgICB9CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoZ2V0RGV2aWNlKCkuZ2V0Q3VycmVudFVzZXIoKSAhPSBtSW5pdGlhbFVzZXJJZCkgeworICAgICAgICAgICAgQ0xvZy53KCJVc2VyIGNoYW5nZWQgZHVyaW5nIHRlc3QuIFN3aXRjaGluZyBiYWNrIHRvICIgKyBtSW5pdGlhbFVzZXJJZCk7CisgICAgICAgICAgICBnZXREZXZpY2UoKS5zd2l0Y2hVc2VyKG1Jbml0aWFsVXNlcklkKTsKICAgICAgICAgfQotICAgICAgICBnZXREZXZpY2UoKS5zd2l0Y2hVc2VyKG1QcmltYXJ5VXNlcklkKTsKKyAgICAgICAgLy8gUmVtb3ZlIHRoZSB1c2VycyBjcmVhdGVkIGR1cmluZyB0aGlzIHRlc3QuCiAgICAgICAgIHJlbW92ZVRlc3RVc2VycygpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChnZXREZXZpY2UoKS5nZXRDdXJyZW50VXNlcigpICE9IG1QcmltYXJ5VXNlcklkKSB7Ci0gICAgICAgICAgICBDTG9nLncoIlVzZXIgY2hhbmdlZCBkdXJpbmcgdGVzdC4gU3dpdGNoaW5nIGJhY2sgdG8gIiArIG1QcmltYXJ5VXNlcklkKTsKLSAgICAgICAgICAgIGdldERldmljZSgpLnN3aXRjaFVzZXIobVByaW1hcnlVc2VySWQpOwotICAgICAgICB9Ci0gICAgICAgIHJlbW92ZVRlc3RVc2VycygpOwotICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIHB1YmxpYyB2b2lkIHNldERldmljZShJVGVzdERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgbURldmljZSA9IGRldmljZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSVRlc3REZXZpY2UgZ2V0RGV2aWNlKCkgeworICAgICAgICByZXR1cm4gbURldmljZTsKICAgICB9CiAKICAgICBwcm90ZWN0ZWQgaW50IGNyZWF0ZVJlc3RyaWN0ZWRQcm9maWxlKGludCB1c2VySWQpCkBAIC0xMjgsNCArMTMwLDQgQEAKICAgICAgICAgICAgICAgICB8fCAiMSIuZXF1YWxzKGNvbW1hbmRPdXB1dCkgfHwgInRydWUiLmVxdWFscyhjb21tYW5kT3VwdXQpCiAgICAgICAgICAgICAgICAgfHwgIm9uIi5lcXVhbHMoY29tbWFuZE91cHV0KTsKICAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9tdWx0aXVzZXIvc3JjL2FuZHJvaWQvaG9zdC9tdWx0aXVzZXIvQ3JlYXRlVXNlcnNOb0FwcENyYXNoZXNUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL211bHRpdXNlci9zcmMvYW5kcm9pZC9ob3N0L211bHRpdXNlci9DcmVhdGVVc2Vyc05vQXBwQ3Jhc2hlc1Rlc3QuamF2YQppbmRleCA0YjRkM2E1Li4xZDhhMTNlIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL211bHRpdXNlci9zcmMvYW5kcm9pZC9ob3N0L211bHRpdXNlci9DcmVhdGVVc2Vyc05vQXBwQ3Jhc2hlc1Rlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL211bHRpdXNlci9zcmMvYW5kcm9pZC9ob3N0L211bHRpdXNlci9DcmVhdGVVc2Vyc05vQXBwQ3Jhc2hlc1Rlc3QuamF2YQpAQCAtMTYsMjcgKzE2LDQyIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5ob3N0Lm11bHRpdXNlcjsKIAoraW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5QcmVzdWJtaXQ7CisKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmxvZy5Mb2dVdGlsLkNMb2c7CitpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuRGV2aWNlSlVuaXQ0Q2xhc3NSdW5uZXI7CiAKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5UZXN0UnVsZTsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLkRlc2NyaXB0aW9uOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5tb2RlbC5TdGF0ZW1lbnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuU2Nhbm5lcjsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAogLyoqCiAgKiBUZXN0IHZlcmlmaWVzIHRoYXQgdXNlcnMgY2FuIGJlIGNyZWF0ZWQvc3dpdGNoZWQgdG8gd2l0aG91dCBlcnJvciBkaWFsb2dzIHNob3duIHRvIHRoZSB1c2VyCisgKiBSdW46IGF0ZXN0IENyZWF0ZVVzZXJzTm9BcHBDcmFzaGVzVGVzdAogICovCitAUnVuV2l0aChEZXZpY2VKVW5pdDRDbGFzc1J1bm5lci5jbGFzcykKIHB1YmxpYyBjbGFzcyBDcmVhdGVVc2Vyc05vQXBwQ3Jhc2hlc1Rlc3QgZXh0ZW5kcyBCYXNlTXVsdGlVc2VyVGVzdCB7Ci0gICAgcHJpdmF0ZSBpbnQgbUluaXRpYWxVc2VySWQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBMT0dDQVRfUE9MTF9JTlRFUlZBTF9NUyA9IDUwMDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBCT09UX0NPTVBMRVRFRF9USU1FT1VUX01TID0gMTgwMDAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgTE9HQ0FUX1BPTExfSU5URVJWQUxfTVMgPSAxMDAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVVNFUl9TV0lUQ0hfQ09NUExFVEVfVElNRU9VVF9NUyA9IDE4MDAwMDsKIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIG1Jbml0aWFsVXNlcklkID0gZ2V0RGV2aWNlKCkuZ2V0Q3VycmVudFVzZXIoKTsKLSAgICB9CisgICAgQFJ1bGUgcHVibGljIEFwcENyYXNoUmV0cnlSdWxlIGFwcENyYXNoUmV0cnlSdWxlID0gbmV3IEFwcENyYXNoUmV0cnlSdWxlKCk7CiAKKyAgICBAUHJlc3VibWl0CisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FuQ3JlYXRlR3Vlc3RVc2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghbVN1cHBvcnRzTXVsdGlVc2VyKSB7CiAgICAgICAgICAgICByZXR1cm47CkBAIC00NSwzMyArNjAsMTM0IEBACiAgICAgICAgICAgICAgICAgIlRlc3RVc2VyXyIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAvKiBuYW1lICovLAogICAgICAgICAgICAgICAgIHRydWUgLyogZ3Vlc3QgKi8sCiAgICAgICAgICAgICAgICAgZmFsc2UgLyogZXBoZW1lcmFsICovKTsKLSAgICAgICAgZ2V0RGV2aWNlKCkuZXhlY3V0ZUFkYkNvbW1hbmQoImxvZ2NhdCIsICItYyIpOyAvLyBSZXNldCBsb2cKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiQ291bGRuJ3Qgc3dpdGNoIHRvIHVzZXIgIiArIHVzZXJJZCwgZ2V0RGV2aWNlKCkuc3dpdGNoVXNlcih1c2VySWQpKTsKLSAgICAgICAgU2V0PFN0cmluZz4gYXBwRXJyb3JzID0gbmV3IExpbmtlZEhhc2hTZXQ8PigpOwotICAgICAgICBhc3NlcnRUcnVlKCJEaWRuJ3QgcmVjZWl2ZSBCT09UX0NPTVBMRVRFRCBkZWxpdmVyZWQgbm90aWZpY2F0aW9uLiBhcHBFcnJvcnM9IiArIGFwcEVycm9ycywKLSAgICAgICAgICAgICAgICB3YWl0Rm9yQm9vdENvbXBsZXRlZChhcHBFcnJvcnMsIHVzZXJJZCkpOwotICAgICAgICBhc3NlcnRUcnVlKCJBcHAgZXJyb3IgZGlhbG9nKHMpIGFyZSBwcmVzZW50OiAiICsgYXBwRXJyb3JzLCBhcHBFcnJvcnMuaXNFbXB0eSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiQ291bGRuJ3Qgc3dpdGNoIHRvIHVzZXIgIiArIHVzZXJJZCwgZ2V0RGV2aWNlKCkuc3dpdGNoVXNlcihtSW5pdGlhbFVzZXJJZCkpOworICAgICAgICBhc3NlcnRTd2l0Y2hUb05ld1VzZXIodXNlcklkKTsKKyAgICAgICAgYXNzZXJ0U3dpdGNoVG9Vc2VyKHVzZXJJZCwgbUluaXRpYWxVc2VySWQpOwogICAgIH0KIAotICAgIHByaXZhdGUgYm9vbGVhbiB3YWl0Rm9yQm9vdENvbXBsZXRlZChTZXQ8U3RyaW5nPiBhcHBFcnJvcnMsIGludCB0YXJnZXRVc2VySWQpCi0gICAgICAgICAgICB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgQFByZXN1Ym1pdAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENhbkNyZWF0ZVNlY29uZGFyeVVzZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFtU3VwcG9ydHNNdWx0aVVzZXIpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpbnQgdXNlcklkID0gZ2V0RGV2aWNlKCkuY3JlYXRlVXNlcigKKyAgICAgICAgICAgICAgICAiVGVzdFVzZXJfIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC8qIG5hbWUgKi8sCisgICAgICAgICAgICAgICAgZmFsc2UgLyogZ3Vlc3QgKi8sCisgICAgICAgICAgICAgICAgZmFsc2UgLyogZXBoZW1lcmFsICovKTsKKyAgICAgICAgYXNzZXJ0U3dpdGNoVG9OZXdVc2VyKHVzZXJJZCk7CisgICAgICAgIGFzc2VydFN3aXRjaFRvVXNlcih1c2VySWQsIG1Jbml0aWFsVXNlcklkKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0U3dpdGNoVG9OZXdVc2VyKGludCB0b1VzZXJJZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBleGl0U3RyaW5nID0gIkZpbmlzaGVkIHByb2Nlc3NpbmcgQk9PVF9DT01QTEVURUQgZm9yIHUiICsgdG9Vc2VySWQ7CisgICAgICAgIGZpbmFsIFNldDxTdHJpbmc+IGFwcEVycm9ycyA9IG5ldyBMaW5rZWRIYXNoU2V0PD4oKTsKKyAgICAgICAgZ2V0RGV2aWNlKCkuZXhlY3V0ZUFkYkNvbW1hbmQoImxvZ2NhdCIsICItYyIpOyAvLyBSZXNldCBsb2cKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiQ291bGRuJ3Qgc3dpdGNoIHRvIHVzZXIgIiArIHRvVXNlcklkLCBnZXREZXZpY2UoKS5zd2l0Y2hVc2VyKHRvVXNlcklkKSk7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVzdWx0ID0gd2FpdEZvclVzZXJTd2l0Y2hDb21wbGV0ZShhcHBFcnJvcnMsIHRvVXNlcklkLCBleGl0U3RyaW5nKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRGlkbid0IHJlY2VpdmUgQk9PVF9DT01QTEVURUQgZGVsaXZlcmVkIG5vdGlmaWNhdGlvbi4gYXBwRXJyb3JzPSIKKyAgICAgICAgICAgICAgICArIGFwcEVycm9ycywgcmVzdWx0KTsKKyAgICAgICAgaWYgKCFhcHBFcnJvcnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQXBwQ3Jhc2hPbkJvb3RFcnJvcihhcHBFcnJvcnMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFN3aXRjaFRvVXNlcihpbnQgZnJvbVVzZXJJZCwgaW50IHRvVXNlcklkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGV4aXRTdHJpbmcgPSAiQ29udGludWUgdXNlciBzd2l0Y2ggb2xkVXNlciAjIiArIGZyb21Vc2VySWQgKyAiLCBuZXdVc2VyICMiCisgICAgICAgICAgICAgICAgKyB0b1VzZXJJZDsKKyAgICAgICAgZmluYWwgU2V0PFN0cmluZz4gYXBwRXJyb3JzID0gbmV3IExpbmtlZEhhc2hTZXQ8PigpOworICAgICAgICBnZXREZXZpY2UoKS5leGVjdXRlQWRiQ29tbWFuZCgibG9nY2F0IiwgIi1jIik7IC8vIFJlc2V0IGxvZworICAgICAgICBhc3NlcnRUcnVlKCJDb3VsZG4ndCBzd2l0Y2ggdG8gdXNlciAiICsgdG9Vc2VySWQsIGdldERldmljZSgpLnN3aXRjaFVzZXIodG9Vc2VySWQpKTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiByZXN1bHQgPSB3YWl0Rm9yVXNlclN3aXRjaENvbXBsZXRlKGFwcEVycm9ycywgdG9Vc2VySWQsIGV4aXRTdHJpbmcpOworICAgICAgICBhc3NlcnRUcnVlKCJEaWRuJ3QgcmVhY2ggXCJDb250aW51ZSB1c2VyIHN3aXRjaFwiIHN0YWdlLiBhcHBFcnJvcnM9IiArIGFwcEVycm9ycywgcmVzdWx0KTsKKyAgICAgICAgaWYgKCFhcHBFcnJvcnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQXBwQ3Jhc2hPbkJvb3RFcnJvcihhcHBFcnJvcnMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHdhaXRGb3JVc2VyU3dpdGNoQ29tcGxldGUoU2V0PFN0cmluZz4gYXBwRXJyb3JzLCBpbnQgdGFyZ2V0VXNlcklkLAorICAgICAgICAgICAgU3RyaW5nIGV4aXRTdHJpbmcpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgYm9vbGVhbiBtRXhpdEZvdW5kID0gZmFsc2U7CiAgICAgICAgIGxvbmcgdGkgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgd2hpbGUgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGkgPCBCT09UX0NPTVBMRVRFRF9USU1FT1VUX01TKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbG9ncyA9IGdldERldmljZSgpLmV4ZWN1dGVBZGJDb21tYW5kKCJsb2djYXQiLCAiLXYiLCAiYnJpZWYiLCAiLWQiKTsKKyAgICAgICAgd2hpbGUgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGkgPCBVU0VSX1NXSVRDSF9DT01QTEVURV9USU1FT1VUX01TKSB7CisgICAgICAgICAgICBTdHJpbmcgbG9ncyA9IGdldERldmljZSgpLmV4ZWN1dGVBZGJDb21tYW5kKCJsb2djYXQiLCAiLXYiLCAiYnJpZWYiLCAiLWQiLAorICAgICAgICAgICAgICAgICAgICAiQWN0aXZpdHlNYW5hZ2VyOkQiLCAiQW5kcm9pZFJ1bnRpbWU6RSIsICIqOlMiKTsKICAgICAgICAgICAgIFNjYW5uZXIgaW4gPSBuZXcgU2Nhbm5lcihsb2dzKTsKICAgICAgICAgICAgIHdoaWxlIChpbi5oYXNOZXh0TGluZSgpKSB7CiAgICAgICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBpbi5uZXh0TGluZSgpOwogICAgICAgICAgICAgICAgIGlmIChsaW5lLmNvbnRhaW5zKCJTaG93aW5nIGNyYXNoIGRpYWxvZyBmb3IgcGFja2FnZSIpKSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcEVycm9ycy5hZGQobGluZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lLmNvbnRhaW5zKCJGaW5pc2hlZCBwcm9jZXNzaW5nIEJPT1RfQ09NUExFVEVEIGZvciB1IiArIHRhcmdldFVzZXJJZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lLmNvbnRhaW5zKGV4aXRTdHJpbmcpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFBhcnNlIGFsbCBsb2dzIGluIGNhc2UgY3Jhc2hlcyBvY2N1ciBhcyBhIHJlc3VsdCBvZiBvblVzZXJDaGFuZ2UgY2FsbGJhY2tzCisgICAgICAgICAgICAgICAgICAgIG1FeGl0Rm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS5jb250YWlucygiRkFUQUwgRVhDRVBUSU9OIElOIFNZU1RFTSBQUk9DRVNTIikpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiU3lzdGVtIHByb2Nlc3MgY3Jhc2hlZCAtICIgKyBsaW5lKTsKICAgICAgICAgICAgICAgICB9Ci0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGluLmNsb3NlKCk7CisgICAgICAgICAgICBpZiAobUV4aXRGb3VuZCkgeworICAgICAgICAgICAgICAgIGlmICghYXBwRXJyb3JzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBDTG9nLncoIkFwcCBjcmFzaCBkaWFsb2dzIGZvdW5kOiAiICsgYXBwRXJyb3JzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoTE9HQ0FUX1BPTExfSU5URVJWQUxfTVMpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgQXBwQ3Jhc2hPbkJvb3RFcnJvciBleHRlbmRzIEFzc2VydGlvbkVycm9yIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBQQUNLQUdFX05BTUVfUEFUVEVSTiA9IFBhdHRlcm4uY29tcGlsZSgicGFja2FnZSAoW15cXHNdKykiKTsKKyAgICAgICAgcHJpdmF0ZSBTZXQ8U3RyaW5nPiBlcnJvclBhY2thZ2VzOworCisgICAgICAgIEFwcENyYXNoT25Cb290RXJyb3IoU2V0PFN0cmluZz4gZXJyb3JMb2dzKSB7CisgICAgICAgICAgICBzdXBlcigiQXBwIGVycm9yIGRpYWxvZyhzKSBhcmUgcHJlc2VudDogIiArIGVycm9yTG9ncyk7CisgICAgICAgICAgICB0aGlzLmVycm9yUGFja2FnZXMgPSBlcnJvckxvZ3NUb1BhY2thZ2VOYW1lcyhlcnJvckxvZ3MpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgU2V0PFN0cmluZz4gZXJyb3JMb2dzVG9QYWNrYWdlTmFtZXMoU2V0PFN0cmluZz4gZXJyb3JMb2dzKSB7CisgICAgICAgICAgICBTZXQ8U3RyaW5nPiByZXN1bHQgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBsaW5lIDogZXJyb3JMb2dzKSB7CisgICAgICAgICAgICAgICAgTWF0Y2hlciBtYXRjaGVyID0gUEFDS0FHRV9OQU1FX1BBVFRFUk4ubWF0Y2hlcihsaW5lKTsKKyAgICAgICAgICAgICAgICBpZiAobWF0Y2hlci5maW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChtYXRjaGVyLmdyb3VwKDEpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVbnJlY29nbml6ZWQgbGluZSAiICsgbGluZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJ1bGUgdGhhdCByZXRyaWVzIHRoZSB0ZXN0IGlmIGl0IGZhaWxlZCBkdWUgdG8ge0BsaW5rIEFwcENyYXNoT25Cb290RXJyb3J9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBcHBDcmFzaFJldHJ5UnVsZSBpbXBsZW1lbnRzIFRlc3RSdWxlIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0YXRlbWVudCBhcHBseShTdGF0ZW1lbnQgYmFzZSwgRGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RhdGVtZW50KCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGV2YWx1YXRlKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgICAgICAgICAgICAgIFNldDxTdHJpbmc+IGVycm9ycyA9IGV2YWx1YXRlQW5kUmV0dXJuQXBwQ3Jhc2hlcyhiYXNlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9ycy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBDTG9nLmUoIlJldHJ5aW5nIGR1ZSB0byBhcHAgY3Jhc2hlczogIiArIGVycm9ycyk7CisgICAgICAgICAgICAgICAgICAgIC8vIEZhaWwgb25seSBpZiBzYW1lIGFwcHMgYXJlIGNyYXNoaW5nIGluIGJvdGggcnVucworICAgICAgICAgICAgICAgICAgICBlcnJvcnMucmV0YWluQWxsKGV2YWx1YXRlQW5kUmV0dXJuQXBwQ3Jhc2hlcyhiYXNlKSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkFwcCBlcnJvciBkaWFsb2cocykgYXJlIHByZXNlbnQgYWZ0ZXIgMiBhdHRlbXB0czogIiArIGVycm9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMuaXNFbXB0eSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgU2V0PFN0cmluZz4gZXZhbHVhdGVBbmRSZXR1cm5BcHBDcmFzaGVzKFN0YXRlbWVudCBiYXNlKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYmFzZS5ldmFsdWF0ZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoQXBwQ3Jhc2hPbkJvb3RFcnJvciBlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGUuZXJyb3JQYWNrYWdlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXcgSGFzaFNldDw+KCk7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL211bHRpdXNlci9zcmMvYW5kcm9pZC9ob3N0L211bHRpdXNlci9DcmVhdGVVc2Vyc1Blcm1pc3Npb25UZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL211bHRpdXNlci9zcmMvYW5kcm9pZC9ob3N0L211bHRpdXNlci9DcmVhdGVVc2Vyc1Blcm1pc3Npb25UZXN0LmphdmEKaW5kZXggOWE0MzUzNC4uNTVmYWIxNiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9tdWx0aXVzZXIvc3JjL2FuZHJvaWQvaG9zdC9tdWx0aXVzZXIvQ3JlYXRlVXNlcnNQZXJtaXNzaW9uVGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvbXVsdGl1c2VyL3NyYy9hbmRyb2lkL2hvc3QvbXVsdGl1c2VyL0NyZWF0ZVVzZXJzUGVybWlzc2lvblRlc3QuamF2YQpAQCAtMTgsOSArMTgsMTYgQEAKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQudHJhZGVmZWQubG9nLkxvZ1V0aWwuQ0xvZzsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5Mb2c7CitpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuRGV2aWNlSlVuaXQ0Q2xhc3NSdW5uZXI7CiAKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKKworQFJ1bldpdGgoRGV2aWNlSlVuaXQ0Q2xhc3NSdW5uZXIuY2xhc3MpCiBwdWJsaWMgY2xhc3MgQ3JlYXRlVXNlcnNQZXJtaXNzaW9uVGVzdCBleHRlbmRzIEJhc2VNdWx0aVVzZXJUZXN0IHsKIAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdENhbkNyZWF0ZUd1ZXN0VXNlcigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBpZiAoIW1TdXBwb3J0c011bHRpVXNlcikgewogICAgICAgICAgICAgcmV0dXJuOwpAQCAtMzEsNiArMzgsNyBAQAogICAgICAgICAgICAgICAgIGZhbHNlIC8qIGVwaGVtZXJhbCAqLyk7CiAgICAgfQogCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FuQ3JlYXRlRXBoZW1lcmFsVXNlcigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBpZiAoIW1TdXBwb3J0c011bHRpVXNlciB8fCAhbUlzU3BsaXRTeXN0ZW1Vc2VyKSB7CiAgICAgICAgICAgICByZXR1cm47CkBAIC00MSw2ICs0OSw3IEBACiAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBlcGhlbWVyYWwgKi8pOwogICAgIH0KIAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdENhbkNyZWF0ZVJlc3RyaWN0ZWRVc2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghbVN1cHBvcnRzTXVsdGlVc2VyKSB7CiAgICAgICAgICAgICByZXR1cm47CkBAIC00OCw2ICs1Nyw3IEBACiAgICAgICAgIGNyZWF0ZVJlc3RyaWN0ZWRQcm9maWxlKG1QcmltYXJ5VXNlcklkKTsKICAgICB9CiAKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RDYW50U2V0VXNlclJlc3RyaWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChnZXREZXZpY2UoKS5pc0FkYlJvb3QoKSkgewogICAgICAgICAgICAgQ0xvZy5sb2dBbmREaXNwbGF5KExvZy5Mb2dMZXZlbC5XQVJOLApAQCAtNTYsOSArNjYsOSBAQAogICAgICAgICB9CiAgICAgICAgIGZpbmFsIFN0cmluZyBzZXRSZXN0cmljdGlvbiA9ICJwbSBzZXQtdXNlci1yZXN0cmljdGlvbiBub19mdW4gIjsKICAgICAgICAgZmluYWwgU3RyaW5nIG91dHB1dCA9IGdldERldmljZSgpLmV4ZWN1dGVTaGVsbENvbW1hbmQoc2V0UmVzdHJpY3Rpb24gKyAiMSIpOwotICAgICAgICBmaW5hbCBib29sZWFuIGlzRXJyb3JPdXRwdXQgPSBvdXRwdXQuc3RhcnRzV2l0aCgiRXJyb3IiKQotICAgICAgICAgICAgICAgICYmIG91dHB1dC5jb250YWlucygiU2VjdXJpdHlFeGNlcHRpb24iKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVHJ5aW5nIHRvIHNldCB1c2VyIHJlc3RyaWN0aW9uIHNob3VsZCBmYWlsIHdpdGggU2VjdXJpdHlFeGNlcHRpb24uICIKKyAgICAgICAgZmluYWwgYm9vbGVhbiBpc0Vycm9yT3V0cHV0ID0gb3V0cHV0LmNvbnRhaW5zKCJTZWN1cml0eUV4Y2VwdGlvbiIpCisgICAgICAgICAgICAmJiBvdXRwdXQuY29udGFpbnMoIllvdSBuZWVkIE1BTkFHRV9VU0VSUyBwZXJtaXNzaW9uIik7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJUcnlpbmcgdG8gc2V0IHVzZXIgcmVzdHJpY3Rpb24gc2hvdWxkIGZhaWwgd2l0aCBTZWN1cml0eUV4Y2VwdGlvbi4gIgogICAgICAgICAgICAgICAgICsgImNvbW1hbmQgb3V0cHV0OiAiICsgb3V0cHV0LCBpc0Vycm9yT3V0cHV0KTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL25ldC9BbmRyb2lkVGVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL25ldC9BbmRyb2lkVGVzdC54bWwKaW5kZXggNGEyZTJlMy4uMDY1NmNhZSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9uZXQvQW5kcm9pZFRlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvbmV0L0FuZHJvaWRUZXN0LnhtbApAQCAtMTQsOCArMTQsMTUgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBuZXQgaG9zdCB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0ibmV0d29ya2luZyIgLz4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC5jdHMubmV0Lk5ldFBvbGljeVRlc3RzUHJlcGFyZXIiIC8+CisKKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlJ1bkNvbW1hbmRUYXJnZXRQcmVwYXJlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVhcmRvd24tY29tbWFuZCIgdmFsdWU9ImNtZCBwb3dlciBzZXQtbW9kZSAwIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlYXJkb3duLWNvbW1hbmQiIHZhbHVlPSJjbWQgYmF0dGVyeSByZXNldCIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKwogICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5KYXJIb3N0VGVzdCIgPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImphciIgdmFsdWU9IkN0c0hvc3RzaWRlTmV0d29ya1Rlc3RzLmphciIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJydW50aW1lLWhpbnQiIHZhbHVlPSIzbTU2cyIgLz4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvbmV0L2FwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9uZXQvYXBwL0FuZHJvaWQubWsKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCAxMjdlZjMyLi4xMWY2YmIxCi0tLSBhL2hvc3RzaWRldGVzdHMvbmV0L2FwcC9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvbmV0L2FwcC9BbmRyb2lkLm1rCkBAIC0yMSw5ICsyMSwxMSBAQAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKICNMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CiBMT0NBTF9QUklWQVRFX1BMQVRGT1JNX0FQSVMgOj0gdHJ1ZQotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwgY3RzdGVzdHJ1bm5lciB1Yi11aWF1dG9tYXRvciBcCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgY3RzdGVzdHJ1bm5lci1heHQgdWItdWlhdXRvbWF0b3IgXAogICAgICAgICBDdHNIb3N0c2lkZU5ldHdvcmtUZXN0c0FpZGwKIAorTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lci5zdHVicyBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicworCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNIb3N0c2lkZU5ldHdvcmtUZXN0c0FwcApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9uZXQvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL25ldC9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA3NDY2Y2I4Li5iYTBlMjQyIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL25ldC9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL25ldC9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjAsNiArMjAsNyBAQAogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX05FVFdPUktfU1RBVEUiLz4KICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkFDQ0VTU19XSUZJX1NUQVRFIi8+CiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5DSEFOR0VfV0lGSV9TVEFURSIvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uRk9SRUdST1VORF9TRVJWSUNFIi8+CiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5JTlRFUk5FVCIvPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX0NPQVJTRV9MT0NBVElPTiIgLz4KICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX1NFQ1VSRV9TRVRUSU5HUyIgLz4KQEAgLTQ0LDcgKzQ1LDcgQEAKICAgICA8L2FwcGxpY2F0aW9uPgogCiAgICAgPGluc3RydW1lbnRhdGlvbgotICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5hbmRyb2lkLmN0cy5uZXQuaG9zdHNpZGUiIC8+CiAKIDwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL25ldC9hcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy9uZXQvaG9zdHNpZGUvQWJzdHJhY3RBcHBJZGxlVGVzdENhc2UuamF2YSBiL2hvc3RzaWRldGVzdHMvbmV0L2FwcC9zcmMvY29tL2FuZHJvaWQvY3RzL25ldC9ob3N0c2lkZS9BYnN0cmFjdEFwcElkbGVUZXN0Q2FzZS5qYXZhCmluZGV4IGQyYzA4NzMuLjFmNTk4NGEgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvbmV0L2FwcC9zcmMvY29tL2FuZHJvaWQvY3RzL25ldC9ob3N0c2lkZS9BYnN0cmFjdEFwcElkbGVUZXN0Q2FzZS5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvbmV0L2FwcC9zcmMvY29tL2FuZHJvaWQvY3RzL25ldC9ob3N0c2lkZS9BYnN0cmFjdEFwcElkbGVUZXN0Q2FzZS5qYXZhCkBAIC0zNCw3ICszNCw3IEBACiAgICAgICAgIHJlbW92ZVBvd2VyU2F2ZU1vZGVXaGl0ZWxpc3QoVEVTVF9BUFAyX1BLRyk7CiAgICAgICAgIHJlbW92ZVBvd2VyU2F2ZU1vZGVFeGNlcHRJZGxlV2hpdGVsaXN0KFRFU1RfQVBQMl9QS0cpOwogICAgICAgICBzZXRBcHBJZGxlKGZhbHNlKTsKLSAgICAgICAgdHVybkJhdHRlcnlPZmYoKTsKKyAgICAgICAgdHVybkJhdHRlcnlPbigpOwogCiAgICAgICAgIHJlZ2lzdGVyQnJvYWRjYXN0UmVjZWl2ZXIoKTsKICAgICB9CkBAIC00OCw3ICs0OCw3IEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICB0ZWFyRG93bk1ldGVyZWROZXR3b3JrKCk7CiAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB0dXJuQmF0dGVyeU9uKCk7CisgICAgICAgICAgICB0dXJuQmF0dGVyeU9mZigpOwogICAgICAgICAgICAgc2V0QXBwSWRsZShmYWxzZSk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMjcsNiArMTI3LDE5IEBACiAgICAgICAgIGFzc2VydEJhY2tncm91bmROZXR3b3JrQWNjZXNzKGZhbHNlKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmFja2dyb3VuZE5ldHdvcmtBY2Nlc3NfdGVtcFdoaXRlbGlzdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghaXNTdXBwb3J0ZWQoKSkgcmV0dXJuOworCisgICAgICAgIHNldEFwcElkbGUodHJ1ZSk7CisgICAgICAgIGFzc2VydEJhY2tncm91bmROZXR3b3JrQWNjZXNzKGZhbHNlKTsKKworICAgICAgICBhZGRUZW1wUG93ZXJTYXZlTW9kZVdoaXRlbGlzdChURVNUX0FQUDJfUEtHLCBURU1QX1BPV0VSU0FWRV9XSElURUxJU1RfRFVSQVRJT05fTVMpOworICAgICAgICBhc3NlcnRCYWNrZ3JvdW5kTmV0d29ya0FjY2Vzcyh0cnVlKTsKKyAgICAgICAgLy8gV2FpdCB1bnRpbCB0aGUgd2hpdGVsaXN0IGR1cmF0aW9uIGlzIGV4cGlyZWQuCisgICAgICAgIFN5c3RlbUNsb2NrLnNsZWVwKFRFTVBfUE9XRVJTQVZFX1dISVRFTElTVF9EVVJBVElPTl9NUyk7CisgICAgICAgIGFzc2VydEJhY2tncm91bmROZXR3b3JrQWNjZXNzKGZhbHNlKTsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCB0ZXN0QmFja2dyb3VuZE5ldHdvcmtBY2Nlc3NfZGlzYWJsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFpc1N1cHBvcnRlZCgpKSByZXR1cm47CiAKQEAgLTEzNywxNCArMTUwLDE5IEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdEFwcElkbGVOZXR3b3JrQWNjZXNzX3doZW5DaGFyZ2luZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIWlzQmF0dGVyeVNhdmVyU3VwcG9ydGVkKCkpIHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgIlNraXBwaW5nICIgKyBnZXRDbGFzcygpICsgIi4iICsgZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICsgIigpIGJlY2F1c2UgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgQmF0dGVyeSBzYXZlciBtb2RlIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KICAgICAgICAgaWYgKCFpc1N1cHBvcnRlZCgpKSByZXR1cm47CiAKICAgICAgICAgLy8gQ2hlY2sgdGhhdCBhcHAgaXMgcGFyb2xlZCB3aGVuIGNoYXJnaW5nCiAgICAgICAgIHNldEFwcElkbGUodHJ1ZSk7CiAgICAgICAgIGFzc2VydEJhY2tncm91bmROZXR3b3JrQWNjZXNzKGZhbHNlKTsKLSAgICAgICAgdHVybkJhdHRlcnlPbigpOwotICAgICAgICBhc3NlcnRCYWNrZ3JvdW5kTmV0d29ya0FjY2Vzcyh0cnVlKTsKICAgICAgICAgdHVybkJhdHRlcnlPZmYoKTsKKyAgICAgICAgYXNzZXJ0QmFja2dyb3VuZE5ldHdvcmtBY2Nlc3ModHJ1ZSk7CisgICAgICAgIHR1cm5CYXR0ZXJ5T24oKTsKICAgICAgICAgYXNzZXJ0QmFja2dyb3VuZE5ldHdvcmtBY2Nlc3MoZmFsc2UpOwogCiAgICAgICAgIC8vIENoZWNrIHRoYXQgYXBwIGlzIHJlc3RyaWN0ZWQgd2hlbiBub3QgaWRsZSBidXQgcG93ZXItc2F2ZSBpcyBvbgpAQCAtMTU0LDExICsxNzIsMTEgQEAKICAgICAgICAgYXNzZXJ0QmFja2dyb3VuZE5ldHdvcmtBY2Nlc3MoZmFsc2UpOwogICAgICAgICAvLyBVc2Ugc2V0QmF0dGVyeVNhdmVyTW9kZSBBUEkgdG8gbGVhdmUgcG93ZXItc2F2ZSBtb2RlIGluc3RlYWQgb2YgcGx1Z2dpbmcgaW4gY2hhcmdlcgogICAgICAgICBzZXRCYXR0ZXJ5U2F2ZXJNb2RlKGZhbHNlKTsKLSAgICAgICAgdHVybkJhdHRlcnlPbigpOworICAgICAgICB0dXJuQmF0dGVyeU9mZigpOwogICAgICAgICBhc3NlcnRCYWNrZ3JvdW5kTmV0d29ya0FjY2Vzcyh0cnVlKTsKIAogICAgICAgICAvLyBBbmQgd2hlbiBubyBsb25nZXIgY2hhcmdpbmcsIGl0IHN0aWxsIGhhcyBuZXR3b3JrIGFjY2Vzcywgc2luY2UgaXQncyBub3QgaWRsZQotICAgICAgICB0dXJuQmF0dGVyeU9mZigpOworICAgICAgICB0dXJuQmF0dGVyeU9uKCk7CiAgICAgICAgIGFzc2VydEJhY2tncm91bmROZXR3b3JrQWNjZXNzKHRydWUpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9uZXQvYXBwL3NyYy9jb20vYW5kcm9pZC9jdHMvbmV0L2hvc3RzaWRlL0Fic3RyYWN0QmF0dGVyeVNhdmVyTW9kZVRlc3RDYXNlLmphdmEgYi9ob3N0c2lkZXRlc3RzL25ldC9hcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy9uZXQvaG9zdHNpZGUvQWJzdHJhY3RCYXR0ZXJ5U2F2ZXJNb2RlVGVzdENhc2UuamF2YQppbmRleCAyODE3NWI4Li45MzEzNzZiIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL25ldC9hcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy9uZXQvaG9zdHNpZGUvQWJzdHJhY3RCYXR0ZXJ5U2F2ZXJNb2RlVGVzdENhc2UuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL25ldC9hcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy9uZXQvaG9zdHNpZGUvQWJzdHJhY3RCYXR0ZXJ5U2F2ZXJNb2RlVGVzdENhc2UuamF2YQpAQCAtMTYsNiArMTYsNyBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5uZXQuaG9zdHNpZGU7CiAKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIC8qKgpAQCAtNTIsMTIgKzUzLDE5IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1N1cHBvcnRlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBib29sZWFuIHN1cHBvcnRlZCA9IGlzRG96ZU1vZGVFbmFibGVkKCk7Ci0gICAgICAgIGlmICghc3VwcG9ydGVkKSB7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICJTa2lwcGluZyAiICsgZ2V0Q2xhc3MoKSArICIuIiArIGdldE5hbWUoKQotICAgICAgICAgICAgICAgICAgICArICIoKSBiZWNhdXNlIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IERvemUgTW9kZSIpOworICAgICAgICBTdHJpbmcgdW5TdXBwb3J0ZWQgPSAiIjsKKyAgICAgICAgaWYgKCFpc0RvemVNb2RlRW5hYmxlZCgpKSB7CisgICAgICAgICAgICB1blN1cHBvcnRlZCArPSAiRG96ZSBtb2RlLCI7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cHBvcnRlZDsKKyAgICAgICAgaWYgKCFpc0JhdHRlcnlTYXZlclN1cHBvcnRlZCgpKSB7CisgICAgICAgICAgICB1blN1cHBvcnRlZCArPSAiQmF0dGVyeSBzYXZlciBtb2RlLCI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh1blN1cHBvcnRlZCkpIHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgIlNraXBwaW5nICIgKyBnZXRDbGFzcygpICsgIi4iICsgZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICsgIigpIGJlY2F1c2UgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgIiArIHVuU3VwcG9ydGVkKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvbmV0L2FwcC9zcmMvY29tL2FuZHJvaWQvY3RzL25ldC9ob3N0c2lkZS9BYnN0cmFjdFJlc3RyaWN0QmFja2dyb3VuZE5ldHdvcmtUZXN0Q2FzZS5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9uZXQvYXBwL3NyYy9jb20vYW5kcm9pZC9jdHMvbmV0L2hvc3RzaWRlL0Fic3RyYWN0UmVzdHJpY3RCYWNrZ3JvdW5kTmV0d29ya1Rlc3RDYXNlLmphdmEKaW5kZXggY2U1NmQyNS4uMTg0NDg3OCAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9uZXQvYXBwL3NyYy9jb20vYW5kcm9pZC9jdHMvbmV0L2hvc3RzaWRlL0Fic3RyYWN0UmVzdHJpY3RCYWNrZ3JvdW5kTmV0d29ya1Rlc3RDYXNlLmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9uZXQvYXBwL3NyYy9jb20vYW5kcm9pZC9jdHMvbmV0L2hvc3RzaWRlL0Fic3RyYWN0UmVzdHJpY3RCYWNrZ3JvdW5kTmV0d29ya1Rlc3RDYXNlLmphdmEKQEAgLTIwLDYgKzIwLDEwIEBACiBpbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0LkNvbm5lY3Rpdml0eU1hbmFnZXIuUkVTVFJJQ1RfQkFDS0dST1VORF9TVEFUVVNfRElTQUJMRUQ7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0LkNvbm5lY3Rpdml0eU1hbmFnZXIuUkVTVFJJQ1RfQkFDS0dST1VORF9TVEFUVVNfRU5BQkxFRDsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQuQ29ubmVjdGl2aXR5TWFuYWdlci5SRVNUUklDVF9CQUNLR1JPVU5EX1NUQVRVU19XSElURUxJU1RFRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5vcy5CYXR0ZXJ5TWFuYWdlci5CQVRURVJZX1BMVUdHRURfQUM7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQub3MuQmF0dGVyeU1hbmFnZXIuQkFUVEVSWV9QTFVHR0VEX1VTQjsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5vcy5CYXR0ZXJ5TWFuYWdlci5CQVRURVJZX1BMVUdHRURfV0lSRUxFU1M7CisKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5TeXN0ZW1VdGlsLnJ1blNoZWxsQ29tbWFuZDsKIAogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOwpAQCAtMzQsNiArMzgsNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuQ29ubmVjdGl2aXR5TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbzsKIGltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlOwpAQCAtNDksNyArNTQsNyBAQAogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy5uZXQuaG9zdHNpZGUuSU5ldHdvcmtTdGF0ZU9ic2VydmVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQmF0dGVyeVV0aWxzOwogCiAvKioKICAqIFN1cGVyY2xhc3MgZm9yIHRlc3RzIHJlbGF0ZWQgdG8gYmFja2dyb3VuZCBuZXR3b3JrIHJlc3RyaWN0aW9ucy4KQEAgLTgzLDExICs4OCwxNCBAQAogICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVElGSUNBVElPTl9UWVBFX0FDVElPTl9CVU5ETEUgPSAiQUNUSU9OX0JVTkRMRSI7CiAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9USUZJQ0FUSU9OX1RZUEVfQUNUSU9OX1JFTU9URV9JTlBVVCA9ICJBQ1RJT05fUkVNT1RFX0lOUFVUIjsKIAorICAgIC8vIFRPRE86IFVwZGF0ZSBCYXR0ZXJ5TWFuYWdlci5CQVRURVJZX1BMVUdHRURfQU5ZIGFzIEBUZXN0QXBpCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkFUVEVSWV9QTFVHR0VEX0FOWSA9CisgICAgICAgICAgICBCQVRURVJZX1BMVUdHRURfQUMgfCBCQVRURVJZX1BMVUdHRURfVVNCIHwgQkFUVEVSWV9QTFVHR0VEX1dJUkVMRVNTOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5FVFdPUktfU1RBVFVTX1NFUEFSQVRPUiA9ICJcXHwiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRUNPTkRfSU5fTVMgPSAxMDAwOwogICAgIHN0YXRpYyBmaW5hbCBpbnQgTkVUV09SS19USU1FT1VUX01TID0gMTUgKiBTRUNPTkRfSU5fTVM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBST0NFU1NfU1RBVEVfRk9SRUdST1VORF9TRVJWSUNFID0gNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFJPQ0VTU19TVEFURV9GT1JFR1JPVU5EX1NFUlZJQ0UgPSAzOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUk9DRVNTX1NUQVRFX1RPUCA9IDI7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX05FVFdPUktfU1RBVEVfT0JTRVJWRVIgPSBURVNUX1BLRyArICIub2JzZXJ2ZXIiOwpAQCAtMTA4LDYgKzExNiw4IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQX05PVF9GT1JFR1JPVU5EX0VSUk9SID0gImFwcF9ub3RfZmciOwogCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBsb25nIFRFTVBfUE9XRVJTQVZFX1dISVRFTElTVF9EVVJBVElPTl9NUyA9IDVfMDAwOyAvLyA1IHNlYworCiAgICAgcHJvdGVjdGVkIENvbnRleHQgbUNvbnRleHQ7CiAgICAgcHJvdGVjdGVkIEluc3RydW1lbnRhdGlvbiBtSW5zdHJ1bWVudGF0aW9uOwogICAgIHByb3RlY3RlZCBDb25uZWN0aXZpdHlNYW5hZ2VyIG1DbTsKQEAgLTEzOCw2ICsxNDgsNyBAQAogICAgICAgICAgICAgZW5hYmxlTG9jYXRpb24oKTsKICAgICAgICAgfQogICAgICAgICBtU3VwcG9ydGVkID0gc2V0VXBBY3RpdmVOZXR3b3JrTWV0ZXJpbmdTdGF0ZSgpOworICAgICAgICBzZXRBcHBJZGxlKGZhbHNlKTsKIAogICAgICAgICBMb2cuaShUQUcsICJBcHBzIHN0YXR1cyBvbiAiICsgZ2V0TmFtZSgpICsgIjpcbiIKICAgICAgICAgICAgICAgICArICJcdHRlc3QgYXBwOiB1aWQ9IiArIG1NeVVpZCArICIsIHN0YXRlPSIgKyBnZXRQcm9jZXNzU3RhdGVCeVVpZChtTXlVaWQpICsgIlxuIgpAQCAtMjU4LDE3ICsyNjksMjEgQEAKIAogICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydEJhY2tncm91bmROZXR3b3JrQWNjZXNzKGJvb2xlYW4gZXhwZWN0QWxsb3dlZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGFzc2VydEJhY2tncm91bmRTdGF0ZSgpOyAvLyBTYW5pdHkgY2hlY2suCi0gICAgICAgIGFzc2VydE5ldHdvcmtBY2Nlc3MoZXhwZWN0QWxsb3dlZCk7CisgICAgICAgIGFzc2VydE5ldHdvcmtBY2Nlc3MoZXhwZWN0QWxsb3dlZCAvKiBleHBlY3RBdmFpbGFibGUgKi8sIGZhbHNlIC8qIG5lZWRTY3JlZW5PbiAqLyk7CiAgICAgfQogCiAgICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0Rm9yZWdyb3VuZE5ldHdvcmtBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0Rm9yZWdyb3VuZFN0YXRlKCk7IC8vIFNhbml0eSBjaGVjay4KLSAgICAgICAgYXNzZXJ0TmV0d29ya0FjY2Vzcyh0cnVlKTsKKyAgICAgICAgLy8gV2UgdmVyaWZpZWQgdGhhdCBhcHAgaXMgaW4gZm9yZWdyb3VuZCBzdGF0ZSBidXQgaWYgdGhlIHNjcmVlbiB0dXJucy1vZmYgd2hpbGUKKyAgICAgICAgLy8gdmVyaWZ5aW5nIGZvciBuZXR3b3JrIGFjY2VzcywgdGhlIGFwcCB3aWxsIGdvIGludG8gYmFja2dyb3VuZCBzdGF0ZSAoaW4gY2FzZSBhcHAncworICAgICAgICAvLyBmb3JlZ3JvdW5kIHN0YXR1cyB3YXMgZHVlIHRvIHRvcCBhY3Rpdml0eSkuIFNvLCB0dXJuIHRoZSBzY3JlZW4gb24gd2hlbiB2ZXJpZnlpbmcKKyAgICAgICAgLy8gbmV0d29yayBjb25uZWN0aXZpdHkuCisgICAgICAgIGFzc2VydE5ldHdvcmtBY2Nlc3ModHJ1ZSAvKiBleHBlY3RBdmFpbGFibGUgKi8sIHRydWUgLyogbmVlZFNjcmVlbk9uICovKTsKICAgICB9CiAKICAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRGb3JlZ3JvdW5kU2VydmljZU5ldHdvcmtBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0Rm9yZWdyb3VuZFNlcnZpY2VTdGF0ZSgpOyAvLyBTYW5pdHkgY2hlY2suCi0gICAgICAgIGFzc2VydE5ldHdvcmtBY2Nlc3ModHJ1ZSk7CisgICAgICAgIGFzc2VydE5ldHdvcmtBY2Nlc3ModHJ1ZSAvKiBleHBlY3RBdmFpbGFibGUgKi8sIGZhbHNlIC8qIG5lZWRTY3JlZW5PbiAqLyk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yODksNiArMzA0LDEwIEBACiAgICAgICAgIHJldHVybiBtU3VwcG9ydGVkOwogICAgIH0KIAorICAgIHByb3RlY3RlZCBib29sZWFuIGlzQmF0dGVyeVNhdmVyU3VwcG9ydGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBCYXR0ZXJ5VXRpbHMuaXNCYXR0ZXJ5U2F2ZXJTdXBwb3J0ZWQoKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBBc3NlcnRzIHRoYXQgYW4gYXBwIGFsd2F5cyBoYXZlIGFjY2VzcyB3aGlsZSBvbiBmb3JlZ3JvdW5kIG9yIHJ1bm5pbmcgYSBmb3JlZ3JvdW5kIHNlcnZpY2UuCiAgICAgICoKQEAgLTM2Nyw3ICszODYsOCBAQAogICAgIC8qKgogICAgICAqIEFzc2VydHMgd2hldGhlciB0aGUgYWN0aXZlIG5ldHdvcmsgaXMgYXZhaWxhYmxlIG9yIG5vdC4KICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0TmV0d29ya0FjY2Vzcyhib29sZWFuIGV4cGVjdEF2YWlsYWJsZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydE5ldHdvcmtBY2Nlc3MoYm9vbGVhbiBleHBlY3RBdmFpbGFibGUsIGJvb2xlYW4gbmVlZFNjcmVlbk9uKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIGludCBtYXhUcmllcyA9IDU7CiAgICAgICAgIFN0cmluZyBlcnJvciA9IG51bGw7CiAgICAgICAgIGludCB0aW1lb3V0TXMgPSA1MDA7CkBAIC0zODUsNiArNDA1LDkgQEAKICAgICAgICAgICAgIExvZy53KFRBRywgIk5ldHdvcmsgc3RhdHVzIGRpZG4ndCBtYXRjaCBmb3IgZXhwZWN0QXZhaWxhYmxlPSIgKyBleHBlY3RBdmFpbGFibGUKICAgICAgICAgICAgICAgICAgICAgKyAiIG9uIGF0dGVtcHQgIyIgKyBpICsgIjogIiArIGVycm9yICsgIlxuIgogICAgICAgICAgICAgICAgICAgICArICJTbGVlcGluZyAiICsgdGltZW91dE1zICsgIm1zIGJlZm9yZSB0cnlpbmcgYWdhaW4iKTsKKyAgICAgICAgICAgIGlmIChuZWVkU2NyZWVuT24pIHsKKyAgICAgICAgICAgICAgICB0dXJuU2NyZWVuT24oKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIE5vIHNsZWVwIGFmdGVyIHRoZSBsYXN0IHR1cm4KICAgICAgICAgICAgIGlmIChpIDwgbWF4VHJpZXMpIHsKICAgICAgICAgICAgICAgICBTeXN0ZW1DbG9jay5zbGVlcCh0aW1lb3V0TXMpOwpAQCAtNzUxLDYgKzc3NCwxMiBAQAogICAgICAgICAgICAgICAgICsgIi4gRnVsbCBsaXN0OiAiICsgdWlkcyk7CiAgICAgfQogCisgICAgcHJvdGVjdGVkIHZvaWQgYWRkVGVtcFBvd2VyU2F2ZU1vZGVXaGl0ZWxpc3QoU3RyaW5nIHBhY2thZ2VOYW1lLCBsb25nIGR1cmF0aW9uKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIExvZy5pKFRBRywgIkFkZGluZyBwa2cgIiArIHBhY2thZ2VOYW1lICsgIiB0byB0ZW1wLXBvd2VyLXNhdmUtbW9kZSB3aGl0ZWxpc3QiKTsKKyAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZCgiZHVtcHN5cyBkZXZpY2VpZGxlIHRlbXB3aGl0ZWxpc3QgLWQgIiArIGR1cmF0aW9uICsgIiAiICsgcGFja2FnZU5hbWUpOworICAgIH0KKwogICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydFBvd2VyU2F2ZU1vZGVXaGl0ZWxpc3QoU3RyaW5nIHBhY2thZ2VOYW1lLCBib29sZWFuIGV4cGVjdGVkKQogICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRPRE86IGN1cnJlbnRseSB0aGUgcG93ZXItc2F2ZSBtb2RlIGlzIGJlaGF2aW5nIGxpa2UgaWRsZSwgYnV0IG9uY2UgaXQgY2hhbmdlcywgd2UnbGwKQEAgLTgwMCwxNSArODI5LDE5IEBACiAgICAgICAgIGFzc2VydFBvd2VyU2F2ZU1vZGVFeGNlcHRJZGxlV2hpdGVsaXN0KHBhY2thZ2VOYW1lLCBmYWxzZSk7IC8vIFNhbml0eSBjaGVjawogICAgIH0KIAotICAgIHByb3RlY3RlZCB2b2lkIHR1cm5CYXR0ZXJ5T2ZmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHJvdGVjdGVkIHZvaWQgdHVybkJhdHRlcnlPbigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBleGVjdXRlU2lsZW50U2hlbGxDb21tYW5kKCJjbWQgYmF0dGVyeSB1bnBsdWciKTsKKyAgICAgICAgZXhlY3V0ZVNpbGVudFNoZWxsQ29tbWFuZCgiY21kIGJhdHRlcnkgc2V0IHN0YXR1cyAiCisgICAgICAgICAgICAgICAgKyBCYXR0ZXJ5TWFuYWdlci5CQVRURVJZX1NUQVRVU19ESVNDSEFSR0lORyk7CiAgICAgICAgIGFzc2VydEJhdHRlcnlTdGF0ZShmYWxzZSk7CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIHZvaWQgdHVybkJhdHRlcnlPbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBleGVjdXRlU2lsZW50U2hlbGxDb21tYW5kKCJjbWQgYmF0dGVyeSByZXNldCIpOworICAgIHByb3RlY3RlZCB2b2lkIHR1cm5CYXR0ZXJ5T2ZmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVTaWxlbnRTaGVsbENvbW1hbmQoImNtZCBiYXR0ZXJ5IHNldCBhYyAiICsgQkFUVEVSWV9QTFVHR0VEX0FOWSk7CisgICAgICAgIGV4ZWN1dGVTaWxlbnRTaGVsbENvbW1hbmQoImNtZCBiYXR0ZXJ5IHNldCBsZXZlbCAxMDAiKTsKKyAgICAgICAgZXhlY3V0ZVNpbGVudFNoZWxsQ29tbWFuZCgiY21kIGJhdHRlcnkgc2V0IHN0YXR1cyAiCisgICAgICAgICAgICAgICAgKyBCYXR0ZXJ5TWFuYWdlci5CQVRURVJZX1NUQVRVU19DSEFSR0lORyk7CiAgICAgICAgIGFzc2VydEJhdHRlcnlTdGF0ZSh0cnVlKTsKLQogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBhc3NlcnRCYXR0ZXJ5U3RhdGUoYm9vbGVhbiBwbHVnZ2VkSW4pIHRocm93cyBFeGNlcHRpb24gewpAQCAtODM5LDExICs4NzIsMTEgQEAKICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRCYXR0ZXJ5U2F2ZXJNb2RlKGJvb2xlYW4gZW5hYmxlZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIExvZy5pKFRBRywgIlNldHRpbmcgQmF0dGVyeSBTYXZlciBNb2RlIHRvICIgKyBlbmFibGVkKTsKICAgICAgICAgaWYgKGVuYWJsZWQpIHsKLSAgICAgICAgICAgIHR1cm5CYXR0ZXJ5T2ZmKCk7CisgICAgICAgICAgICB0dXJuQmF0dGVyeU9uKCk7CiAgICAgICAgICAgICBleGVjdXRlU2lsZW50U2hlbGxDb21tYW5kKCJjbWQgcG93ZXIgc2V0LW1vZGUgMSIpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZXhlY3V0ZVNpbGVudFNoZWxsQ29tbWFuZCgiY21kIHBvd2VyIHNldC1tb2RlIDAiKTsKLSAgICAgICAgICAgIHR1cm5CYXR0ZXJ5T24oKTsKKyAgICAgICAgICAgIHR1cm5CYXR0ZXJ5T2ZmKCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTg1MywxMiArODg2LDEyIEBACiAKICAgICAgICAgTG9nLmkoVEFHLCAiU2V0dGluZyBEb3plIE1vZGUgdG8gIiArIGVuYWJsZWQpOwogICAgICAgICBpZiAoZW5hYmxlZCkgewotICAgICAgICAgICAgdHVybkJhdHRlcnlPZmYoKTsKKyAgICAgICAgICAgIHR1cm5CYXR0ZXJ5T24oKTsKICAgICAgICAgICAgIHR1cm5TY3JlZW5PZmYoKTsKICAgICAgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoImR1bXBzeXMgZGV2aWNlaWRsZSBmb3JjZS1pZGxlIGRlZXAiKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHR1cm5TY3JlZW5PbigpOwotICAgICAgICAgICAgdHVybkJhdHRlcnlPbigpOworICAgICAgICAgICAgdHVybkJhdHRlcnlPZmYoKTsKICAgICAgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoImR1bXBzeXMgZGV2aWNlaWRsZSB1bmZvcmNlIik7CiAgICAgICAgIH0KICAgICAgICAgLy8gU2FuaXR5IGNoZWNrLgpAQCAtMTAwNCw3ICsxMDM3LDggQEAKICAgICBwcml2YXRlIEludGVudCBnZXRJbnRlbnRGb3JDb21wb25lbnQoaW50IHR5cGUpIHsKICAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoKTsKICAgICAgICAgaWYgKHR5cGUgPT0gVFlQRV9DT01QT05FTlRfQUNUSVZUSVkpIHsKLSAgICAgICAgICAgIGludGVudC5zZXRDb21wb25lbnQobmV3IENvbXBvbmVudE5hbWUoVEVTVF9BUFAyX1BLRywgVEVTVF9BUFAyX0FDVElWSVRZX0NMQVNTKSk7CisgICAgICAgICAgICBpbnRlbnQuc2V0Q29tcG9uZW50KG5ldyBDb21wb25lbnROYW1lKFRFU1RfQVBQMl9QS0csIFRFU1RfQVBQMl9BQ1RJVklUWV9DTEFTUykpCisgICAgICAgICAgICAgICAgICAgIC5zZXRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7CiAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBUWVBFX0NPTVBPTkVOVF9GT1JFR1JPVU5EX1NFUlZJQ0UpIHsKICAgICAgICAgICAgIGludGVudC5zZXRDb21wb25lbnQobmV3IENvbXBvbmVudE5hbWUoVEVTVF9BUFAyX1BLRywgVEVTVF9BUFAyX1NFUlZJQ0VfQ0xBU1MpKQogICAgICAgICAgICAgICAgICAgICAuc2V0RmxhZ3MoMSk7CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL25ldC9hcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy9uZXQvaG9zdHNpZGUvTWl4ZWRNb2Rlc1Rlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvbmV0L2FwcC9zcmMvY29tL2FuZHJvaWQvY3RzL25ldC9ob3N0c2lkZS9NaXhlZE1vZGVzVGVzdC5qYXZhCmluZGV4IDUyNDgyNTUuLjdmNjViNTUgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvbmV0L2FwcC9zcmMvY29tL2FuZHJvaWQvY3RzL25ldC9ob3N0c2lkZS9NaXhlZE1vZGVzVGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvbmV0L2FwcC9zcmMvY29tL2FuZHJvaWQvY3RzL25ldC9ob3N0c2lkZS9NaXhlZE1vZGVzVGVzdC5qYXZhCkBAIC0xNSw2ICsxNSw3IEBACiAgKi8KIHBhY2thZ2UgY29tLmFuZHJvaWQuY3RzLm5ldC5ob3N0c2lkZTsKIAoraW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogLyoqCkBAIC01NiwxNyArNTcsMjYgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzU3VwcG9ydGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghaXNEb3plTW9kZUVuYWJsZWQoKSkgeworICAgICAgICAgICAgTG9nLmkoVEFHLCAiU2tpcHBpbmcgIiArIGdldENsYXNzKCkgKyAiLiIgKyBnZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiKCkgYmVjYXVzZSBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBEb3plIE1vZGUiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBUZXN0cyBhbGwgRFMgT04gYW5kIEJTIE9OIHNjZW5hcmlvcyBmcm9tIG5ldHdvcmstcG9saWN5LXJlc3RyaWN0aW9ucy5tZCBvbiBtZXRlcmVkIG5ldHdvcmtzLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHRlc3REYXRhQW5kQmF0dGVyeVNhdmVyTW9kZXNfbWV0ZXJlZE5ldHdvcmsoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFpc1N1cHBvcnRlZCgpKSByZXR1cm47Ci0KLSAgICAgICAgaWYgKCFpc0RvemVNb2RlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJ0ZXN0RGF0YUFuZEJhdHRlcnlTYXZlck1vZGVzX21ldGVyZWROZXR3b3JrKCkgc2tpcHBlZCBiZWNhdXNlICIKLSAgICAgICAgICAgICAgICAgICAgKyAiZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgRG96ZSBNb2RlIik7CisgICAgICAgIGlmICghaXNCYXR0ZXJ5U2F2ZXJTdXBwb3J0ZWQoKSkgeworICAgICAgICAgICAgTG9nLmkoVEFHLCAiU2tpcHBpbmcgIiArIGdldENsYXNzKCkgKyAiLiIgKyBnZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiKCkgYmVjYXVzZSBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBCYXR0ZXJ5IHNhdmVyIG1vZGUiKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQorICAgICAgICBpZiAoIWlzU3VwcG9ydGVkKCkpIHJldHVybjsKIAogICAgICAgICBMb2cuaShUQUcsICJ0ZXN0RGF0YUFuZEJhdHRlcnlTYXZlck1vZGVzX21ldGVyZWROZXR3b3JrKCkgdGVzdHMiKTsKICAgICAgICAgaWYgKCFzZXRNZXRlcmVkTmV0d29yaygpKSB7CkBAIC0xMzYsMTMgKzE0NiwxMiBAQAogICAgICAqIG5ldHdvcmtzLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHRlc3REYXRhQW5kQmF0dGVyeVNhdmVyTW9kZXNfbm9uTWV0ZXJlZE5ldHdvcmsoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFpc1N1cHBvcnRlZCgpKSByZXR1cm47Ci0KLSAgICAgICAgaWYgKCFpc0RvemVNb2RlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJ0ZXN0RGF0YUFuZEJhdHRlcnlTYXZlck1vZGVzX25vbk1ldGVyZWROZXR3b3JrKCkgc2tpcHBlZCBiZWNhdXNlICIKLSAgICAgICAgICAgICAgICAgICAgKyAiZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgRG96ZSBNb2RlIik7CisgICAgICAgIGlmICghaXNCYXR0ZXJ5U2F2ZXJTdXBwb3J0ZWQoKSkgeworICAgICAgICAgICAgTG9nLmkoVEFHLCAiU2tpcHBpbmcgIiArIGdldENsYXNzKCkgKyAiLiIgKyBnZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiKCkgYmVjYXVzZSBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBCYXR0ZXJ5IHNhdmVyIG1vZGUiKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQorICAgICAgICBpZiAoIWlzU3VwcG9ydGVkKCkpIHJldHVybjsKIAogICAgICAgICBpZiAoIXNldFVubWV0ZXJlZE5ldHdvcmsoKSkgewogICAgICAgICAgICAgTG9nLncoVEFHLCAidGVzdERhdGFBbmRCYXR0ZXJ5U2F2ZXJNb2Rlc19ub25NZXRlcmVkTmV0d29yaygpIHNraXBwZWQgYmVjYXVzZSBuZXR3b3JrIgpAQCAtMjA3LDEyICsyMTYsMTIgQEAKICAgICAgKiBhcmUgZW5hYmxlZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB0ZXN0RG96ZUFuZEJhdHRlcnlTYXZlck1vZGVfcG93ZXJTYXZlV2hpdGVsaXN0cygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIWlzU3VwcG9ydGVkKCkpIHsKKyAgICAgICAgaWYgKCFpc0JhdHRlcnlTYXZlclN1cHBvcnRlZCgpKSB7CisgICAgICAgICAgICBMb2cuaShUQUcsICJTa2lwcGluZyAiICsgZ2V0Q2xhc3MoKSArICIuIiArIGdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICArICIoKSBiZWNhdXNlIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IEJhdHRlcnkgc2F2ZXIgbW9kZSIpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIGlmICghaXNEb3plTW9kZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgTG9nLmkoVEFHLCAiU2tpcHBpbmcgIiArIGdldENsYXNzKCkgKyAiLiIgKyBnZXROYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiKCkgYmVjYXVzZSBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBEb3plIE1vZGUiKTsKKyAgICAgICAgaWYgKCFpc1N1cHBvcnRlZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtMjQ1LDExICsyNTQsNiBAQAogICAgICAgICBpZiAoIWlzU3VwcG9ydGVkKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBpZiAoIWlzRG96ZU1vZGVFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIlNraXBwaW5nICIgKyBnZXRDbGFzcygpICsgIi4iICsgZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICsgIigpIGJlY2F1c2UgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgRG96ZSBNb2RlIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KIAogICAgICAgICBzZXREb3plTW9kZSh0cnVlKTsKICAgICAgICAgc2V0QXBwSWRsZSh0cnVlKTsKQEAgLTI3MSw0ICsyNzUsNTUgQEAKICAgICAgICAgICAgIHNldERvemVNb2RlKGZhbHNlKTsKICAgICAgICAgfQogICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBJZGxlQW5kRG96ZV90ZW1wUG93ZXJTYXZlV2hpdGVsaXN0cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIWlzU3VwcG9ydGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHNldERvemVNb2RlKHRydWUpOworICAgICAgICBzZXRBcHBJZGxlKHRydWUpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRCYWNrZ3JvdW5kTmV0d29ya0FjY2VzcyhmYWxzZSk7CisKKyAgICAgICAgICAgIGFkZFRlbXBQb3dlclNhdmVNb2RlV2hpdGVsaXN0KFRFU1RfQVBQMl9QS0csIFRFTVBfUE9XRVJTQVZFX1dISVRFTElTVF9EVVJBVElPTl9NUyk7CisgICAgICAgICAgICBhc3NlcnRCYWNrZ3JvdW5kTmV0d29ya0FjY2Vzcyh0cnVlKTsKKworICAgICAgICAgICAgLy8gV2FpdCB1bnRpbCB0aGUgd2hpdGVsaXN0IGR1cmF0aW9uIGlzIGV4cGlyZWQuCisgICAgICAgICAgICBTeXN0ZW1DbG9jay5zbGVlcChURU1QX1BPV0VSU0FWRV9XSElURUxJU1RfRFVSQVRJT05fTVMpOworICAgICAgICAgICAgYXNzZXJ0QmFja2dyb3VuZE5ldHdvcmtBY2Nlc3MoZmFsc2UpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgc2V0QXBwSWRsZShmYWxzZSk7CisgICAgICAgICAgICBzZXREb3plTW9kZShmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwSWRsZUFuZEJhdHRlcnlTYXZlcl90ZW1wUG93ZXJTYXZlV2hpdGVsaXN0cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIWlzQmF0dGVyeVNhdmVyU3VwcG9ydGVkKCkpIHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgIlNraXBwaW5nICIgKyBnZXRDbGFzcygpICsgIi4iICsgZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICsgIigpIGJlY2F1c2UgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgQmF0dGVyeSBzYXZlciBtb2RlIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFpc1N1cHBvcnRlZCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBzZXRCYXR0ZXJ5U2F2ZXJNb2RlKHRydWUpOworICAgICAgICBzZXRBcHBJZGxlKHRydWUpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRCYWNrZ3JvdW5kTmV0d29ya0FjY2VzcyhmYWxzZSk7CisKKyAgICAgICAgICAgIGFkZFRlbXBQb3dlclNhdmVNb2RlV2hpdGVsaXN0KFRFU1RfQVBQMl9QS0csIFRFTVBfUE9XRVJTQVZFX1dISVRFTElTVF9EVVJBVElPTl9NUyk7CisgICAgICAgICAgICBhc3NlcnRCYWNrZ3JvdW5kTmV0d29ya0FjY2Vzcyh0cnVlKTsKKworICAgICAgICAgICAgLy8gV2FpdCB1bnRpbCB0aGUgd2hpdGVsaXN0IGR1cmF0aW9uIGlzIGV4cGlyZWQuCisgICAgICAgICAgICBTeXN0ZW1DbG9jay5zbGVlcChURU1QX1BPV0VSU0FWRV9XSElURUxJU1RfRFVSQVRJT05fTVMpOworICAgICAgICAgICAgYXNzZXJ0QmFja2dyb3VuZE5ldHdvcmtBY2Nlc3MoZmFsc2UpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgc2V0QXBwSWRsZShmYWxzZSk7CisgICAgICAgICAgICBzZXRCYXR0ZXJ5U2F2ZXJNb2RlKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvbmV0L2FwcC9zcmMvY29tL2FuZHJvaWQvY3RzL25ldC9ob3N0c2lkZS9NeVNlcnZpY2VDbGllbnQuamF2YSBiL2hvc3RzaWRldGVzdHMvbmV0L2FwcC9zcmMvY29tL2FuZHJvaWQvY3RzL25ldC9ob3N0c2lkZS9NeVNlcnZpY2VDbGllbnQuamF2YQppbmRleCBmZjA1ZDhjLi5lMjk3NmMyIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL25ldC9hcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy9uZXQvaG9zdHNpZGUvTXlTZXJ2aWNlQ2xpZW50LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9uZXQvYXBwL3NyYy9jb20vYW5kcm9pZC9jdHMvbmV0L2hvc3RzaWRlL015U2VydmljZUNsaWVudC5qYXZhCkBAIC02MiwxMCArNjIsMTAgQEAKIAogICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOwogICAgICAgICBpbnRlbnQuc2V0Q29tcG9uZW50KG5ldyBDb21wb25lbnROYW1lKEFQUDJfUEFDS0FHRSwgU0VSVklDRV9OQU1FKSk7Ci0gICAgICAgIC8vIE5lZWRzIHRvIHVzZSBCSU5EX0FMTE9XX09PTV9NQU5BR0VNRU5UIGFuZCBCSU5EX05PVF9GT1JFR1JPVU5EIHNvIGFwcDIgZG9lcyBub3QgcnVuIGluCisgICAgICAgIC8vIE5lZWRzIHRvIHVzZSBCSU5EX05PVF9GT1JFR1JPVU5EIHNvIGFwcDIgZG9lcyBub3QgcnVuIGluCiAgICAgICAgIC8vIHRoZSBzYW1lIHByb2Nlc3Mgc3RhdGUgYXMgYXBwCiAgICAgICAgIG1Db250ZXh0LmJpbmRTZXJ2aWNlKGludGVudCwgbVNlcnZpY2VDb25uZWN0aW9uLCBDb250ZXh0LkJJTkRfQVVUT19DUkVBVEUKLSAgICAgICAgICAgICAgICB8IENvbnRleHQuQklORF9BTExPV19PT01fTUFOQUdFTUVOVCB8IENvbnRleHQuQklORF9OT1RfRk9SRUdST1VORCk7CisgICAgICAgICAgICAgICAgfCBDb250ZXh0LkJJTkRfTk9UX0ZPUkVHUk9VTkQpOwogICAgICAgICBjdi5ibG9jayhUSU1FT1VUX01TKTsKICAgICAgICAgaWYgKG1TZXJ2aWNlID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL25ldC9hcHAyL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL25ldC9hcHAyL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggYWRmMDA0NS4uYWQyNzBiMyAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9uZXQvYXBwMi9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvbmV0L2FwcDIvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMTksNiArMTksNyBAQAogICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLmN0cy5uZXQuaG9zdHNpZGUuYXBwMiIgPgogCiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5BQ0NFU1NfTkVUV09SS19TVEFURSIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkZPUkVHUk9VTkRfU0VSVklDRSIvPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uSU5URVJORVQiIC8+CiAKICAgICA8IS0tCkBAIC0zMyw3ICszNCw3IEBACiAgICAgICAgICBUaGlzIGFwcGxpY2F0aW9uIGFsc28gcHJvdmlkZXMgYSBzZXJ2aWNlLCBSZW1vdGVTb2NrZXRGYWN0b3J5U2VydmljZSwgdGhhdCB0aGUgdGVzdCBhcHAgY2FuCiAgICAgICAgICB1c2UgdG8gb3BlbiBzb2NrZXRzIHRvIHJlbW90ZSBob3N0cyBhcyBhIGRpZmZlcmVudCB1c2VyIElELgogICAgIC0tPgotICAgIDxhcHBsaWNhdGlvbj4KKyAgICA8YXBwbGljYXRpb24gYW5kcm9pZDp1c2VzQ2xlYXJ0ZXh0VHJhZmZpYz0idHJ1ZSI+CiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5NeUFjdGl2aXR5IiBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIi8+CiAgICAgICAgIDxzZXJ2aWNlIGFuZHJvaWQ6bmFtZT0iLk15U2VydmljZSIgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIvPgogICAgICAgICA8c2VydmljZSBhbmRyb2lkOm5hbWU9Ii5NeUZvcmVncm91bmRTZXJ2aWNlIiBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIi8+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL25ldC9zcmMvY29tL2FuZHJvaWQvY3RzL25ldC9Ib3N0c2lkZU5ldHdvcmtUZXN0Q2FzZS5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9uZXQvc3JjL2NvbS9hbmRyb2lkL2N0cy9uZXQvSG9zdHNpZGVOZXR3b3JrVGVzdENhc2UuamF2YQppbmRleCBjNmRmODkzLi5hMjQ0M2IzIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL25ldC9zcmMvY29tL2FuZHJvaWQvY3RzL25ldC9Ib3N0c2lkZU5ldHdvcmtUZXN0Q2FzZS5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvbmV0L3NyYy9jb20vYW5kcm9pZC9jdHMvbmV0L0hvc3RzaWRlTmV0d29ya1Rlc3RDYXNlLmphdmEKQEAgLTE5LDEzICsxOSwxMyBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLmJ1aWxkLkNvbXBhdGliaWxpdHlCdWlsZEhlbHBlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuTG9nOwogaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi50ZXN0cnVubmVyLlJlbW90ZUFuZHJvaWRUZXN0UnVubmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi50ZXN0cnVubmVyLlRlc3RJZGVudGlmaWVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi50ZXN0cnVubmVyLlRlc3RSZXN1bHQ7CiBpbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLnRlc3RydW5uZXIuVGVzdFJlc3VsdC5UZXN0U3RhdHVzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi50ZXN0cnVubmVyLlRlc3RSdW5SZXN1bHQ7CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuYnVpbGQuSUJ1aWxkSW5mbzsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnJlc3VsdC5Db2xsZWN0aW5nVGVzdExpc3RlbmVyOworaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnJlc3VsdC5UZXN0RGVzY3JpcHRpb247CitpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQucmVzdWx0LlRlc3RSZXN1bHQ7CitpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQucmVzdWx0LlRlc3RSdW5SZXN1bHQ7CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuRGV2aWNlVGVzdENhc2U7CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSUFiaTsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JQWJpUmVjZWl2ZXI7CkBAIC0xMjgsNyArMTI4LDcgQEAKICAgICBwcm90ZWN0ZWQgdm9pZCBydW5EZXZpY2VUZXN0cyhTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyB0ZXN0Q2xhc3NOYW1lLCBTdHJpbmcgbWV0aG9kTmFtZSkKICAgICAgICAgICAgIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewogICAgICAgICBSZW1vdGVBbmRyb2lkVGVzdFJ1bm5lciB0ZXN0UnVubmVyID0gbmV3IFJlbW90ZUFuZHJvaWRUZXN0UnVubmVyKHBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIiwgZ2V0RGV2aWNlKCkuZ2V0SURldmljZSgpKTsKKyAgICAgICAgICAgICAgICAiYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIiwgZ2V0RGV2aWNlKCkuZ2V0SURldmljZSgpKTsKIAogICAgICAgICBpZiAodGVzdENsYXNzTmFtZSAhPSBudWxsKSB7CiAgICAgICAgICAgICBpZiAobWV0aG9kTmFtZSAhPSBudWxsKSB7CkBAIC0xNTAsNyArMTUwLDcgQEAKICAgICAgICAgaWYgKHJlc3VsdC5oYXNGYWlsZWRUZXN0cygpKSB7CiAgICAgICAgICAgICAvLyBidWlsZCBhIG1lYW5pbmdmdWwgZXJyb3IgbWVzc2FnZQogICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBlcnJvckJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigib24tZGV2aWNlIHRlc3RzIGZhaWxlZDpcbiIpOwotICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8VGVzdElkZW50aWZpZXIsIFRlc3RSZXN1bHQ+IHJlc3VsdEVudHJ5IDoKKyAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFRlc3REZXNjcmlwdGlvbiwgVGVzdFJlc3VsdD4gcmVzdWx0RW50cnkgOgogICAgICAgICAgICAgICAgIHJlc3VsdC5nZXRUZXN0UmVzdWx0cygpLmVudHJ5U2V0KCkpIHsKICAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdEVudHJ5LmdldFZhbHVlKCkuZ2V0U3RhdHVzKCkuZXF1YWxzKFRlc3RTdGF0dXMuUEFTU0VEKSkgewogICAgICAgICAgICAgICAgICAgICBlcnJvckJ1aWxkZXIuYXBwZW5kKHJlc3VsdEVudHJ5LmdldEtleSgpLnRvU3RyaW5nKCkpOwpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9uZXQvc3JjL2NvbS9hbmRyb2lkL2N0cy9uZXQvSG9zdHNpZGVSZXN0cmljdEJhY2tncm91bmROZXR3b3JrVGVzdHMuamF2YSBiL2hvc3RzaWRldGVzdHMvbmV0L3NyYy9jb20vYW5kcm9pZC9jdHMvbmV0L0hvc3RzaWRlUmVzdHJpY3RCYWNrZ3JvdW5kTmV0d29ya1Rlc3RzLmphdmEKaW5kZXggYmYzZmMwOC4uZmU5ZDM2YyAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9uZXQvc3JjL2NvbS9hbmRyb2lkL2N0cy9uZXQvSG9zdHNpZGVSZXN0cmljdEJhY2tncm91bmROZXR3b3JrVGVzdHMuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL25ldC9zcmMvY29tL2FuZHJvaWQvY3RzL25ldC9Ib3N0c2lkZVJlc3RyaWN0QmFja2dyb3VuZE5ldHdvcmtUZXN0cy5qYXZhCkBAIC0xNDYsNiArMTQ2LDExIEBACiAgICAgICAgICAgICAgICAgInRlc3RCYWNrZ3JvdW5kTmV0d29ya0FjY2Vzc193aGl0ZWxpc3RlZCIpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBJZGxlTWV0ZXJlZF90ZW1wV2hpdGVsaXN0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcnVuRGV2aWNlVGVzdHMoVEVTVF9QS0csIFRFU1RfUEtHICsgIi5BcHBJZGxlTWV0ZXJlZFRlc3QiLAorICAgICAgICAgICAgICAgICJ0ZXN0QmFja2dyb3VuZE5ldHdvcmtBY2Nlc3NfdGVtcFdoaXRlbGlzdGVkIik7CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgdGVzdEFwcElkbGVNZXRlcmVkX2VuYWJsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgcnVuRGV2aWNlVGVzdHMoVEVTVF9QS0csIFRFU1RfUEtHICsgIi5BcHBJZGxlTWV0ZXJlZFRlc3QiLAogICAgICAgICAgICAgICAgICJ0ZXN0QmFja2dyb3VuZE5ldHdvcmtBY2Nlc3NfZW5hYmxlZCIpOwpAQCAtMTY2LDYgKzE3MSwxMSBAQAogICAgICAgICAgICAgICAgICJ0ZXN0QmFja2dyb3VuZE5ldHdvcmtBY2Nlc3Nfd2hpdGVsaXN0ZWQiKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwSWRsZU5vbk1ldGVyZWRfdGVtcFdoaXRlbGlzdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJ1bkRldmljZVRlc3RzKFRFU1RfUEtHLCBURVNUX1BLRyArICIuQXBwSWRsZU5vbk1ldGVyZWRUZXN0IiwKKyAgICAgICAgICAgICAgICAidGVzdEJhY2tncm91bmROZXR3b3JrQWNjZXNzX3RlbXBXaGl0ZWxpc3RlZCIpOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBJZGxlTm9uTWV0ZXJlZF9lbmFibGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHJ1bkRldmljZVRlc3RzKFRFU1RfUEtHLCBURVNUX1BLRyArICIuQXBwSWRsZU5vbk1ldGVyZWRUZXN0IiwKICAgICAgICAgICAgICAgICAidGVzdEJhY2tncm91bmROZXR3b3JrQWNjZXNzX2VuYWJsZWQiKTsKQEAgLTI2MSw2ICsyNzEsMTYgQEAKICAgICAgICAgICAgICAgICAidGVzdERvemVBbmRBcHBJZGxlX3Bvd2VyU2F2ZVdoaXRlbGlzdHMiKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwSWRsZUFuZERvemVfdGVtcFBvd2VyU2F2ZVdoaXRlbGlzdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcnVuRGV2aWNlVGVzdHMoVEVTVF9QS0csIFRFU1RfUEtHICsgIi5NaXhlZE1vZGVzVGVzdCIsCisgICAgICAgICAgICAgICAgInRlc3RBcHBJZGxlQW5kRG96ZV90ZW1wUG93ZXJTYXZlV2hpdGVsaXN0cyIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBJZGxlQW5kQmF0dGVyeVNhdmVyX3RlbXBQb3dlclNhdmVXaGl0ZWxpc3RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJ1bkRldmljZVRlc3RzKFRFU1RfUEtHLCBURVNUX1BLRyArICIuTWl4ZWRNb2Rlc1Rlc3QiLAorICAgICAgICAgICAgICAgICJ0ZXN0QXBwSWRsZUFuZEJhdHRlcnlTYXZlcl90ZW1wUG93ZXJTYXZlV2hpdGVsaXN0cyIpOworICAgIH0KKwogICAgIC8qKioqKioqKioqKioqKioqKioqCiAgICAgICogSGVscGVyIG1ldGhvZHMuICoKICAgICAgKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvbmV0L3NyYy9jb20vYW5kcm9pZC9jdHMvbmV0L05ldFBvbGljeVRlc3RzUHJlcGFyZXIuamF2YSBiL2hvc3RzaWRldGVzdHMvbmV0L3NyYy9jb20vYW5kcm9pZC9jdHMvbmV0L05ldFBvbGljeVRlc3RzUHJlcGFyZXIuamF2YQppbmRleCA5YjE5NTU0Li5jYTE0YzI3IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL25ldC9zcmMvY29tL2FuZHJvaWQvY3RzL25ldC9OZXRQb2xpY3lUZXN0c1ByZXBhcmVyLmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9uZXQvc3JjL2NvbS9hbmRyb2lkL2N0cy9uZXQvTmV0UG9saWN5VGVzdHNQcmVwYXJlci5qYXZhCkBAIC0yNSw1MCArMjUsMzggQEAKIAogcHVibGljIGNsYXNzIE5ldFBvbGljeVRlc3RzUHJlcGFyZXIgaW1wbGVtZW50cyBJVGFyZ2V0UHJlcGFyZXIsIElUYXJnZXRDbGVhbmVyIHsKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgS0VZX1BBUk9MRV9EVVJBVElPTiA9ICJwYXJvbGVfZHVyYXRpb24iOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBERVNJUkVEX1BBUk9MRV9EVVJBVElPTiA9ICIwIjsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgREVTSVJFRF9QQVJPTEVfRFVSQVRJT04gPSAwOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBLRVlfU1RBQkxFX0NIQVJHSU5HX1RIUkVTSE9MRCA9ICJzdGFibGVfY2hhcmdpbmdfdGhyZXNob2xkIjsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgREVTSVJFRF9TVEFCTEVfQ0hBUkdJTkdfVEhSRVNIT0xEID0gMDsKIAotICAgIHByaXZhdGUgYm9vbGVhbiBtQXBwSWRsZUNvbnN0c1VwZGF0ZWQ7CisgICAgcHJpdmF0ZSBJVGVzdERldmljZSBtRGV2aWNlOwogICAgIHByaXZhdGUgU3RyaW5nIG1PcmlnaW5hbEFwcElkbGVDb25zdHM7CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRVcChJVGVzdERldmljZSBkZXZpY2UsIElCdWlsZEluZm8gYnVpbGRJbmZvKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgdXBkYXRlUGFyb2xlRHVyYXRpb24oZGV2aWNlKTsKKyAgICAgICAgbURldmljZSA9IGRldmljZTsKKyAgICAgICAgbU9yaWdpbmFsQXBwSWRsZUNvbnN0cyA9IGdldEFwcElkbGVDb25zdGFudHMoKTsKKyAgICAgICAgc2V0QXBwSWRsZUNvbnN0YW50cyhLRVlfUEFST0xFX0RVUkFUSU9OICsgIj0iICsgREVTSVJFRF9QQVJPTEVfRFVSQVRJT04gKyAiLCIKKyAgICAgICAgICAgICAgICArIEtFWV9TVEFCTEVfQ0hBUkdJTkdfVEhSRVNIT0xEICsgIj0iICsgREVTSVJFRF9TVEFCTEVfQ0hBUkdJTkdfVEhSRVNIT0xEKTsKICAgICAgICAgTG9nVXRpbC5DTG9nLmQoIk9yaWdpbmFsIGFwcF9pZGxlX2NvbnN0YW50czogIiArIG1PcmlnaW5hbEFwcElkbGVDb25zdHMpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKElUZXN0RGV2aWNlIGRldmljZSwgSUJ1aWxkSW5mbyBidWlsZEluZm8sIFRocm93YWJsZSB0aHJvd2FibGUpCiAgICAgICAgICAgICB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG1BcHBJZGxlQ29uc3RzVXBkYXRlZCkgewotICAgICAgICAgICAgZXhlY3V0ZUNtZChkZXZpY2UsICJzZXR0aW5ncyBwdXQgZ2xvYmFsIGFwcF9pZGxlX2NvbnN0YW50cyAiICsgbU9yaWdpbmFsQXBwSWRsZUNvbnN0cyk7Ci0gICAgICAgIH0KKyAgICAgICAgc2V0QXBwSWRsZUNvbnN0YW50cyhtT3JpZ2luYWxBcHBJZGxlQ29uc3RzKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHBhcm9sZV9kdXJhdGlvbiB3aXRoIHRoZSBkZXNpcmVkIHZhbHVlLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVQYXJvbGVEdXJhdGlvbihJVGVzdERldmljZSBkZXZpY2UpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBtT3JpZ2luYWxBcHBJZGxlQ29uc3RzID0gZXhlY3V0ZUNtZChkZXZpY2UsICJzZXR0aW5ncyBnZXQgZ2xvYmFsIGFwcF9pZGxlX2NvbnN0YW50cyIpOwotICAgICAgICBTdHJpbmcgbmV3QXBwSWRsZUNvbnN0YW50czsKLSAgICAgICAgZmluYWwgU3RyaW5nIG5ld0NvbnN0YW50ID0gS0VZX1BBUk9MRV9EVVJBVElPTiArICI9IiArIERFU0lSRURfUEFST0xFX0RVUkFUSU9OOwotICAgICAgICBpZiAobU9yaWdpbmFsQXBwSWRsZUNvbnN0cyA9PSBudWxsIHx8ICJudWxsIi5lcXVhbHMobU9yaWdpbmFsQXBwSWRsZUNvbnN0cykpIHsKLSAgICAgICAgICAgIC8vIGFwcF9pZGxlX2NvbnN0YW50cyBpcyBpbml0aWFsbHkgZW1wdHksIHNvIGp1c3QgYXNzaWduIHRoZSBkZXNpcmVkIHZhbHVlLgotICAgICAgICAgICAgbmV3QXBwSWRsZUNvbnN0YW50cyA9IG5ld0NvbnN0YW50OwotICAgICAgICB9IGVsc2UgaWYgKG1PcmlnaW5hbEFwcElkbGVDb25zdHMuY29udGFpbnMoS0VZX1BBUk9MRV9EVVJBVElPTikpIHsKLSAgICAgICAgICAgIC8vIGFwcF9pZGxlX2NvbnN0YW50cyBjb250YWlucyBwYXJvbGVfZHVyYXRpb24sIHNvIHJlcGxhY2UgaXQgd2l0aCB0aGUgZGVzaXJlZCB2YWx1ZS4KLSAgICAgICAgICAgIG5ld0FwcElkbGVDb25zdGFudHMgPSBtT3JpZ2luYWxBcHBJZGxlQ29uc3RzLnJlcGxhY2VBbGwoCi0gICAgICAgICAgICAgICAgICAgIEtFWV9QQVJPTEVfRFVSQVRJT04gKyAiPVxcZCsiLCBuZXdDb25zdGFudCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBhcHBfaWRsZV9jb25zdGFudHMgZGlkbid0IGhhdmUgcGFyb2xlX2R1cmF0aW9uLCBzbyBhcHBlbmQgdGhlIGRlc2lyZWQgdmFsdWUuCi0gICAgICAgICAgICBuZXdBcHBJZGxlQ29uc3RhbnRzID0gbU9yaWdpbmFsQXBwSWRsZUNvbnN0cyArICIsIiArIG5ld0NvbnN0YW50OwotICAgICAgICB9Ci0gICAgICAgIGV4ZWN1dGVDbWQoZGV2aWNlLCAic2V0dGluZ3MgcHV0IGdsb2JhbCBhcHBfaWRsZV9jb25zdGFudHMgIiArIG5ld0FwcElkbGVDb25zdGFudHMpOwotICAgICAgICBtQXBwSWRsZUNvbnN0c1VwZGF0ZWQgPSB0cnVlOworICAgIHByaXZhdGUgdm9pZCBzZXRBcHBJZGxlQ29uc3RhbnRzKFN0cmluZyBhcHBJZGxlQ29uc3RhbnRzKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZUNtZCgic2V0dGluZ3MgcHV0IGdsb2JhbCBhcHBfaWRsZV9jb25zdGFudHMgIiArIGFwcElkbGVDb25zdGFudHMpOwogICAgIH0KIAotICAgIHByaXZhdGUgU3RyaW5nIGV4ZWN1dGVDbWQoSVRlc3REZXZpY2UgZGV2aWNlLCBTdHJpbmcgY21kKQotICAgICAgICAgICAgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBvdXRwdXQgPSBkZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZChjbWQpLnRyaW0oKTsKKyAgICBwcml2YXRlIFN0cmluZyBnZXRBcHBJZGxlQ29uc3RhbnRzKCkgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBleGVjdXRlQ21kKCJzZXR0aW5ncyBnZXQgZ2xvYmFsIGFwcF9pZGxlX2NvbnN0YW50cyIpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGV4ZWN1dGVDbWQoU3RyaW5nIGNtZCkgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBvdXRwdXQgPSBtRGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoY21kKS50cmltKCk7CiAgICAgICAgIExvZ1V0aWwuQ0xvZy5kKCJPdXRwdXQgZm9yICclcyc6ICVzIiwgY21kLCBvdXRwdXQpOwogICAgICAgICByZXR1cm4gb3V0cHV0OwogICAgIH0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvbnVtYmVyYmxvY2tpbmcvQW5kcm9pZFRlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9udW1iZXJibG9ja2luZy9BbmRyb2lkVGVzdC54bWwKaW5kZXggOWE2ZDgwNS4uNmViYzUyMiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9udW1iZXJibG9ja2luZy9BbmRyb2lkVGVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9udW1iZXJibG9ja2luZy9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBudW1iZXIgYmxvY2tpbmcgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImFidXNlIiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL251bWJlcmJsb2NraW5nL2FwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9udW1iZXJibG9ja2luZy9hcHAvQW5kcm9pZC5tawppbmRleCA1MGM3NDFhLi5hODRkMTFjIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL251bWJlcmJsb2NraW5nL2FwcC9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvbnVtYmVyYmxvY2tpbmcvYXBwL0FuZHJvaWQubWsKQEAgLTI3LDcgKzI3LDkgQEAKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY3RzdGVzdHJ1bm5lciBhbmRyb2lkLXN1cHBvcnQtdGVzdCBsZWdhY3ktYW5kcm9pZC10ZXN0IGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjdHN0ZXN0cnVubmVyLWF4dCBhbmRyb2lkeC50ZXN0LnJ1bGVzIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwKKworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LmJhc2Uuc3R1YnMKIAogIyB0YWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAogTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvbnVtYmVyYmxvY2tpbmcvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL251bWJlcmJsb2NraW5nL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDljMmIzYjEuLjZmZjJkOWUgMTAwNzU1Ci0tLSBhL2hvc3RzaWRldGVzdHMvbnVtYmVyYmxvY2tpbmcvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9udW1iZXJibG9ja2luZy9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMzMsNyArMzMsNyBAQAogCiAgICAgPC9hcHBsaWNhdGlvbj4KIAotICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5hbmRyb2lkLmN0cy5udW1iZXJibG9ja2luZy5ob3N0c2lkZSIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Ik51bWJlciBibG9ja2luZyBDVFMgVGVzdHMiLz4KIApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9udW1iZXJibG9ja2luZy9hcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy9udW1iZXJibG9ja2luZy9ob3N0c2lkZS9CYXNlTnVtYmVyQmxvY2tpbmdDbGllbnRUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL251bWJlcmJsb2NraW5nL2FwcC9zcmMvY29tL2FuZHJvaWQvY3RzL251bWJlcmJsb2NraW5nL2hvc3RzaWRlL0Jhc2VOdW1iZXJCbG9ja2luZ0NsaWVudFRlc3QuamF2YQppbmRleCAzMDMxMmRhNC4uNGEzMWY4YiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9udW1iZXJibG9ja2luZy9hcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy9udW1iZXJibG9ja2luZy9ob3N0c2lkZS9CYXNlTnVtYmVyQmxvY2tpbmdDbGllbnRUZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9udW1iZXJibG9ja2luZy9hcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy9udW1iZXJibG9ja2luZy9ob3N0c2lkZS9CYXNlTnVtYmVyQmxvY2tpbmdDbGllbnRUZXN0LmphdmEKQEAgLTE4LDEwICsxOCwxMSBAQAogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CiBpbXBvcnQgYW5kcm9pZC50ZWxlY29tLlRlbGVjb21NYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0Q2FzZTsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CisKIC8qKgogICogQmFzZSBjbGFzcyBmb3IgbnVtYmVyIGJsb2NraW5nIHRlc3RzLgogICovCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL251bWJlcmJsb2NraW5nL3NyYy9jb20vYW5kcm9pZC9jdHMvbnVtYmVyYmxvY2tpbmcvaG9zdHNpZGUvTnVtYmVyQmxvY2tpbmdUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL251bWJlcmJsb2NraW5nL3NyYy9jb20vYW5kcm9pZC9jdHMvbnVtYmVyYmxvY2tpbmcvaG9zdHNpZGUvTnVtYmVyQmxvY2tpbmdUZXN0LmphdmEKaW5kZXggNWUxYTBlYy4uNmQ1YzMzNiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9udW1iZXJibG9ja2luZy9zcmMvY29tL2FuZHJvaWQvY3RzL251bWJlcmJsb2NraW5nL2hvc3RzaWRlL051bWJlckJsb2NraW5nVGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvbnVtYmVyYmxvY2tpbmcvc3JjL2NvbS9hbmRyb2lkL2N0cy9udW1iZXJibG9ja2luZy9ob3N0c2lkZS9OdW1iZXJCbG9ja2luZ1Rlc3QuamF2YQpAQCAtMTE5LDcgKzExOSw3IEBACiAgICAgICAgICAgICBydW5UZXN0QXNQcmltYXJ5VXNlcihDQUxMX0JMT0NLSU5HX1RFU1RfQ0xBU1NfTkFNRSwgInRlc3RVbnJlZ2lzdGVyUGhvbmVBY2NvdW50Iik7CiAKICAgICAgICAgICAgIC8vIFJ1biB0ZXN0cyBhcyBzZWNvbmRhcnkgdXNlci4KLSAgICAgICAgICAgIGFzc2VydFRydWUoZ2V0RGV2aWNlKCkuc3RhcnRVc2VyKG1TZWNvbmRhcnlVc2VySWQpKTsKKyAgICAgICAgICAgIHN0YXJ0VXNlckFuZFdhaXQobVNlY29uZGFyeVVzZXJJZCk7CiAKICAgICAgICAgICAgIC8vIEVuc3VyZSB0aGF0IGEgcHJpdmlsZWdlZCBhcHAgY2Fubm90IGJsb2NrIG51bWJlcnMgd2hlbiB0aGUgY3VycmVudCB1c2VyIGlzIGEKICAgICAgICAgICAgIC8vIHNlY29uZGFyeSB1c2VyLgpAQCAtMTQyLDYgKzE0MiwyOSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLyoqIFN0YXJ0cyB1c2VyIHtAY29kZSB1c2VySWR9IGFuZCB3YWl0cyB1bnRpbCBpdCBpcyBpbiBzdGF0ZSBSVU5OSU5HX1VOTE9DS0VELiAqLworICAgIHByb3RlY3RlZCB2b2lkIHN0YXJ0VXNlckFuZFdhaXQoaW50IHVzZXJJZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGdldERldmljZSgpLnN0YXJ0VXNlcih1c2VySWQpOworCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNpcmVkU3RhdGUgPSAiUlVOTklOR19VTkxPQ0tFRCI7CisgICAgICAgIGZpbmFsIGxvbmcgVVNFUl9TVEFURV9USU1FT1VUX01TID0gNjBfMDAwMDsgLy8gMSBtaW51dGUKKyAgICAgICAgZmluYWwgbG9uZyB0aW1lb3V0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyBVU0VSX1NUQVRFX1RJTUVPVVRfTVM7CisgICAgICAgIGZpbmFsIFN0cmluZyBjb21tYW5kID0gU3RyaW5nLmZvcm1hdCgiYW0gZ2V0LXN0YXJ0ZWQtdXNlci1zdGF0ZSAlZCIsIHVzZXJJZCk7CisgICAgICAgIFN0cmluZyBvdXRwdXQgPSAiIjsKKyAgICAgICAgd2hpbGUgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIDw9IHRpbWVvdXQpIHsKKyAgICAgICAgICAgIG91dHB1dCA9IGdldERldmljZSgpLmV4ZWN1dGVTaGVsbENvbW1hbmQoY29tbWFuZCk7CisgICAgICAgICAgICBpZiAob3V0cHV0LmNvbnRhaW5zKGRlc2lyZWRTdGF0ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDApOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIERvIG5vdGhpbmcuCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZmFpbCgiVXNlciBzdGF0ZSBvZiAiICsgdXNlcklkICsgIiB3YXMgJyIgKyBvdXRwdXQgKyAiJyByYXRoZXIgdGhhbiAiICsgZGVzaXJlZFN0YXRlKTsKKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgY3JlYXRlU2Vjb25kYXJ5VXNlcigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBtU2Vjb25kYXJ5VXNlcklkID0gZ2V0RGV2aWNlKCkuY3JlYXRlVXNlcihTRUNPTkRBUllfVVNFUl9OQU1FKTsKICAgICAgICAgZ2V0RGV2aWNlKCkud2FpdEZvckRldmljZUF2YWlsYWJsZSgpOwpAQCAtMTcxLDcgKzE5NCw3IEBACiAgICAgICAgICAgICAgICAgY2xhc3NOYW1lLCBtZXRob2ROYW1lLCB1c2VySWQpOwogICAgICAgICBSZW1vdGVBbmRyb2lkVGVzdFJ1bm5lciB0ZXN0UnVubmVyID0gbmV3IFJlbW90ZUFuZHJvaWRUZXN0UnVubmVyKAogICAgICAgICAgICAgICAgIE5VTUJFUl9CTE9DS0lOR19URVNUU19QS0csCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiLAorICAgICAgICAgICAgICAgICJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiLAogICAgICAgICAgICAgICAgIGdldERldmljZSgpLmdldElEZXZpY2UoKSk7CiAgICAgICAgIHRlc3RSdW5uZXIuYWRkSW5zdHJ1bWVudGF0aW9uQXJnKCJibG9ja2VkX251bWJlciIsIEJMT0NLRURfTlVNQkVSKTsKICAgICAgICAgdGVzdFJ1bm5lci5hZGRJbnN0cnVtZW50YXRpb25BcmcoInBob25lX2FjY291bnRfaWQiLCBQSE9ORV9BQ0NPVU5UX0lEKTsKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvb3MvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvb3MvQW5kcm9pZC5tawppbmRleCAxYjgwNmM5Li45MzJlMmNmIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL29zL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9vcy9BbmRyb2lkLm1rCkBAIC0yOCw3ICsyOCw3IEBACiBMT0NBTF9DVFNfVEVTVF9QQUNLQUdFIDo9IGFuZHJvaWQuaG9zdC5vcwogCiAjIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0Ci1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMgY3RzX2luc3RhbnQKIAogaW5jbHVkZSAkKEJVSUxEX0NUU19IT1NUX0pBVkFfTElCUkFSWSkKIApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9vcy9BbmRyb2lkVGVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL29zL0FuZHJvaWRUZXN0LnhtbAppbmRleCAyNjFjMjlkLi4yZTYxYTYxIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL29zL0FuZHJvaWRUZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL29zL0FuZHJvaWRUZXN0LnhtbApAQCAtMTQsNiArMTQsNyBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgdGhlIENUUyBPUyBob3N0IHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJmcmFtZXdvcmsiIC8+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CiAgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvb3MvYXBwL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL29zL2FwcC9BbmRyb2lkLm1rCmluZGV4IGJjNzBkZWMuLjMxZTI4MTIgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvb3MvYXBwL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9vcy9hcHAvQW5kcm9pZC5tawpAQCAtMjQsNyArMjQsNyBAQAogTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAogCiAjIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0Ci1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMgY3RzX2luc3RhbnQKIAogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0RldmljZU9zVGVzdEFwcAogCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL29zL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9vcy9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA0YzQzMzhiLi5mYTlkOWFlIDEwMDc1NQotLS0gYS9ob3N0c2lkZXRlc3RzL29zL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvb3MvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTE2LDcgKzE2LDggQEAKICAtLT4KIAogPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBwYWNrYWdlPSJhbmRyb2lkLm9zLmFwcCI+CisgICAgcGFja2FnZT0iYW5kcm9pZC5vcy5hcHAiCisgICAgYW5kcm9pZDp0YXJnZXRTYW5kYm94VmVyc2lvbj0iMiI+CiAKICAgICA8YXBwbGljYXRpb24+CiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5UZXN0Tm9uRXhwb3J0ZWQiCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL29zL3NyYy9hbmRyb2lkL29zL2N0cy9Pc0hvc3RUZXN0cy5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9vcy9zcmMvYW5kcm9pZC9vcy9jdHMvT3NIb3N0VGVzdHMuamF2YQppbmRleCAzYjJlMDI3Li5jNTU3YzllIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL29zL3NyYy9hbmRyb2lkL29zL2N0cy9Pc0hvc3RUZXN0cy5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvb3Mvc3JjL2FuZHJvaWQvb3MvY3RzL09zSG9zdFRlc3RzLmphdmEKQEAgLTE2LDYgKzE2LDggQEAKIAogcGFja2FnZSBhbmRyb2lkLm9zLmN0czsKIAoraW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLmJ1aWxkLkNvbXBhdGliaWxpdHlCdWlsZEhlbHBlcjsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5idWlsZC5JQnVpbGRJbmZvOwogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5Db2xsZWN0aW5nT3V0cHV0UmVjZWl2ZXI7CkBAIC0yNiwxMiArMjgsOCBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLklCdWlsZFJlY2VpdmVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnV0aWwuQWJpVXRpbHM7CiAKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5TY2FubmVyOwpAQCAtODYsMTMgKzg0LDI0IEBACiAgICAgICoKICAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgogICAgICAqLworICAgIEBBcHBNb2RlRnVsbChyZWFzb24gPSAiRXJyb3IgbWVzc2FnZSBpcyBkaWZmZXJlbnQgZm9yIGluc3RhbnQgYXBwIChBY3Rpdml0eSBkb2VzIG5vdCBleGlzdCkiKQogICAgIHB1YmxpYyB2b2lkIHRlc3ROb25FeHBvcnRlZEFjdGl2aXRpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gQXR0ZW1wdCB0byBsYXVuY2ggdGhlIG5vbi1leHBvcnRlZCBhY3Rpdml0eSBpbiB0aGUgdGVzdCBhcHAKLSAgICAgICAgQ29sbGVjdGluZ091dHB1dFJlY2VpdmVyIG91dHB1dFJlY2VpdmVyID0gbmV3IENvbGxlY3RpbmdPdXRwdXRSZWNlaXZlcigpOwotICAgICAgICBtRGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoU1RBUlRfTk9OX0VYUE9SVEVEX0FDVElWSVRZX0NPTU1BTkQsIG91dHB1dFJlY2VpdmVyKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIG91dHB1dCA9IG91dHB1dFJlY2VpdmVyLmdldE91dHB1dCgpOworICAgICAgICAvLyBSdW4gYXMgdW5yb290CisgICAgICAgIGJvb2xlYW4gd2FzUm9vdCA9IG1EZXZpY2UuaXNBZGJSb290KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtRGV2aWNlLmRpc2FibGVBZGJSb290KCk7CisgICAgICAgICAgICAvLyBBdHRlbXB0IHRvIGxhdW5jaCB0aGUgbm9uLWV4cG9ydGVkIGFjdGl2aXR5IGluIHRoZSB0ZXN0IGFwcAorICAgICAgICAgICAgQ29sbGVjdGluZ091dHB1dFJlY2VpdmVyIG91dHB1dFJlY2VpdmVyID0gbmV3IENvbGxlY3RpbmdPdXRwdXRSZWNlaXZlcigpOworICAgICAgICAgICAgbURldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKFNUQVJUX05PTl9FWFBPUlRFRF9BQ1RJVklUWV9DT01NQU5ELCBvdXRwdXRSZWNlaXZlcik7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgb3V0cHV0ID0gb3V0cHV0UmVjZWl2ZXIuZ2V0T3V0cHV0KCk7CiAKLSAgICAgICAgYXNzZXJ0VHJ1ZShvdXRwdXQuY29udGFpbnMoIlBlcm1pc3Npb24gRGVuaWFsIikgJiYgb3V0cHV0LmNvbnRhaW5zKCIgbm90IGV4cG9ydGVkIikpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShvdXRwdXQuY29udGFpbnMoIlBlcm1pc3Npb24gRGVuaWFsIikgJiYgb3V0cHV0LmNvbnRhaW5zKCIgbm90IGV4cG9ydGVkIikpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgLy8gUmVzdG9yZSBiYWNrIHRvIG9yaWdpbmFsIHJvb3Qgc3RhdGUKKyAgICAgICAgICAgIGlmICh3YXNSb290KSB7CisgICAgICAgICAgICAgICAgbURldmljZS5lbmFibGVBZGJSb290KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW50ZW50RmlsdGVySG9zdFZhbGlkYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvb3Mvc3JjL2FuZHJvaWQvb3MvY3RzL1N0YXRpY1NoYXJlZExpYnNIb3N0VGVzdHMuamF2YSBiL2hvc3RzaWRldGVzdHMvb3Mvc3JjL2FuZHJvaWQvb3MvY3RzL1N0YXRpY1NoYXJlZExpYnNIb3N0VGVzdHMuamF2YQppbmRleCBhZDI3MDUxLi45YWExZWRjIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL29zL3NyYy9hbmRyb2lkL29zL2N0cy9TdGF0aWNTaGFyZWRMaWJzSG9zdFRlc3RzLmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9vcy9zcmMvYW5kcm9pZC9vcy9jdHMvU3RhdGljU2hhcmVkTGlic0hvc3RUZXN0cy5qYXZhCkBAIC0xNiwyMiArMTYsMjcgQEAKIAogcGFja2FnZSBhbmRyb2lkLm9zLmN0czsKIAoraW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUluc3RhbnQ7CisKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC5idWlsZC5Db21wYXRpYmlsaXR5QnVpbGRIZWxwZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLnRlc3RydW5uZXIuUmVtb3RlQW5kcm9pZFRlc3RSdW5uZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLnRlc3RydW5uZXIuVGVzdElkZW50aWZpZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLnRlc3RydW5uZXIuVGVzdFJlc3VsdDsKLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIudGVzdHJ1bm5lci5UZXN0UnVuUmVzdWx0OworaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi50ZXN0cnVubmVyLlRlc3RSZXN1bHQuVGVzdFN0YXR1czsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5idWlsZC5JQnVpbGRJbmZvOwogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5EZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb247CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQucmVzdWx0LkNvbGxlY3RpbmdUZXN0TGlzdGVuZXI7CitpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQucmVzdWx0LlRlc3REZXNjcmlwdGlvbjsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5yZXN1bHQuVGVzdFJlc3VsdDsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5yZXN1bHQuVGVzdFJ1blJlc3VsdDsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5EZXZpY2VUZXN0Q2FzZTsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JQnVpbGRSZWNlaXZlcjsKIAoraW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIHB1YmxpYyBjbGFzcyBTdGF0aWNTaGFyZWRMaWJzSG9zdFRlc3RzIGV4dGVuZHMgRGV2aWNlVGVzdENhc2UgaW1wbGVtZW50cyBJQnVpbGRSZWNlaXZlciB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFORFJPSURfSlVOSVRfUlVOTkVSX0NMQVNTID0KLSAgICAgICAgICAgICJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIjsKKyAgICAgICAgICAgICJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRJQ19MSUJfUFJPVklERVJfUkVDVVJTSVZFX0FQSyA9CiAgICAgICAgICAgICAiQ3RzU3RhdGljU2hhcmVkTGliUHJvdmlkZXJSZWN1cnNpdmUuYXBrIjsKQEAgLTg0LDI2ICs4OSwzNSBAQAogICAgICAgICAgICAgPSAiYW5kcm9pZC5vcy5saWIuY29uc3VtZXIiOwogCiAgICAgcHJpdmF0ZSBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIgbUJ1aWxkSGVscGVyOworICAgIHByaXZhdGUgYm9vbGVhbiBtSW5zdGFudE1vZGUgPSBmYWxzZTsKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldEJ1aWxkKElCdWlsZEluZm8gYnVpbGRJbmZvKSB7CiAgICAgICAgIG1CdWlsZEhlbHBlciA9IG5ldyBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIoYnVpbGRJbmZvKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbFNoYXJlZExpYnJhcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBAQXBwTW9kZUluc3RhbnQKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbFNoYXJlZExpYnJhcnlJbnN0YW50TW9kZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtSW5zdGFudE1vZGUgPSB0cnVlOworICAgICAgICBkb1Rlc3RJbnN0YWxsU2hhcmVkTGlicmFyeSgpOworICAgIH0KKworICAgIEBBcHBNb2RlRnVsbAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsU2hhcmVkTGlicmFyeUZ1bGxNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGRvVGVzdEluc3RhbGxTaGFyZWRMaWJyYXJ5KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRvVGVzdEluc3RhbGxTaGFyZWRMaWJyYXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoU1RBVElDX0xJQl9QUk9WSURFUjFfUEtHKTsKICAgICAgICAgZ2V0RGV2aWNlKCkudW5pbnN0YWxsUGFja2FnZShTVEFUSUNfTElCX1BST1ZJREVSMl9QS0cpOwogICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKFNUQVRJQ19MSUJfUFJPVklERVJfUkVDVVJTSVZFX1BLRyk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAvLyBJbnN0YWxsIGxpYnJhcnkgZGVwZW5kZW5jeQotICAgICAgICAgICAgYXNzZXJ0TnVsbChnZXREZXZpY2UoKS5pbnN0YWxsUGFja2FnZShtQnVpbGRIZWxwZXIuZ2V0VGVzdEZpbGUoCi0gICAgICAgICAgICAgICAgICAgIFNUQVRJQ19MSUJfUFJPVklERVJfUkVDVVJTSVZFX0FQSyksIGZhbHNlLCBmYWxzZSkpOworICAgICAgICAgICAgYXNzZXJ0TnVsbChpbnN0YWxsKFNUQVRJQ19MSUJfUFJPVklERVJfUkVDVVJTSVZFX0FQSykpOwogICAgICAgICAgICAgLy8gSW5zdGFsbCB2ZXJzaW9uIDEKLSAgICAgICAgICAgIGFzc2VydE51bGwoZ2V0RGV2aWNlKCkuaW5zdGFsbFBhY2thZ2UobUJ1aWxkSGVscGVyLmdldFRlc3RGaWxlKAotICAgICAgICAgICAgICAgICAgICBTVEFUSUNfTElCX1BST1ZJREVSMV9BUEspLCBmYWxzZSwgZmFsc2UpKTsKKyAgICAgICAgICAgIGFzc2VydE51bGwoaW5zdGFsbChTVEFUSUNfTElCX1BST1ZJREVSMV9BUEspKTsKICAgICAgICAgICAgIC8vIEluc3RhbGwgdmVyc2lvbiAyCi0gICAgICAgICAgICBhc3NlcnROdWxsKGdldERldmljZSgpLmluc3RhbGxQYWNrYWdlKG1CdWlsZEhlbHBlci5nZXRUZXN0RmlsZSgKLSAgICAgICAgICAgICAgICAgICAgU1RBVElDX0xJQl9QUk9WSURFUjJfQVBLKSwgZmFsc2UsIGZhbHNlKSk7CisgICAgICAgICAgICBhc3NlcnROdWxsKGluc3RhbGwoU1RBVElDX0xJQl9QUk9WSURFUjJfQVBLKSk7CiAgICAgICAgICAgICAvLyBVbmluc3RhbGwgdmVyc2lvbiAxCiAgICAgICAgICAgICBhc3NlcnROdWxsKGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoU1RBVElDX0xJQl9QUk9WSURFUjFfUEtHKSk7CiAgICAgICAgICAgICAvLyBVbmluc3RhbGwgdmVyc2lvbiAyCkBAIC0xMTcsMTMgKzEzMSwyMyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgdGVzdENhbm5vdEluc3RhbGxTaGFyZWRMaWJyYXJ5V2l0aE1pc3NpbmdEZXBlbmRlbmN5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgQEFwcE1vZGVJbnN0YW50CisgICAgcHVibGljIHZvaWQgdGVzdENhbm5vdEluc3RhbGxTaGFyZWRMaWJyYXJ5V2l0aE1pc3NpbmdEZXBlbmRlbmN5SW5zdGFudE1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbUluc3RhbnRNb2RlID0gdHJ1ZTsKKyAgICAgICAgZG9UZXN0Q2Fubm90SW5zdGFsbFNoYXJlZExpYnJhcnlXaXRoTWlzc2luZ0RlcGVuZGVuY3koKTsKKyAgICB9CisKKyAgICBAQXBwTW9kZUZ1bGwKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2Fubm90SW5zdGFsbFNoYXJlZExpYnJhcnlXaXRoTWlzc2luZ0RlcGVuZGVuY3lGdWxsTW9kZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkb1Rlc3RDYW5ub3RJbnN0YWxsU2hhcmVkTGlicmFyeVdpdGhNaXNzaW5nRGVwZW5kZW5jeSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkb1Rlc3RDYW5ub3RJbnN0YWxsU2hhcmVkTGlicmFyeVdpdGhNaXNzaW5nRGVwZW5kZW5jeSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKFNUQVRJQ19MSUJfUFJPVklERVIxX1BLRyk7CiAgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoU1RBVElDX0xJQl9QUk9WSURFUjJfUEtHKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIC8vIEluc3RhbGwgdmVyc2lvbiAxIC0gc2hvdWxkIGZhaWwgLSBubyBkZXBlbmRlbmN5Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGdldERldmljZSgpLmluc3RhbGxQYWNrYWdlKG1CdWlsZEhlbHBlci5nZXRUZXN0RmlsZSgKLSAgICAgICAgICAgICAgICAgICAgU1RBVElDX0xJQl9QUk9WSURFUjFfQVBLKSwgZmFsc2UsIGZhbHNlKSk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGluc3RhbGwoU1RBVElDX0xJQl9QUk9WSURFUjFfQVBLKSk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKFNUQVRJQ19MSUJfUFJPVklERVIxX1BLRyk7CiAgICAgICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKFNUQVRJQ19MSUJfUFJPVklERVIyX1BLRyk7CkBAIC0xMzYsMTQgKzE2MCwxMSBAQAogICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKFNUQVRJQ19MSUJfUFJPVklERVJfUkVDVVJTSVZFX1BLRyk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAvLyBJbnN0YWxsIGxpYnJhcnkgZGVwZW5kZW5jeQotICAgICAgICAgICAgYXNzZXJ0TnVsbChnZXREZXZpY2UoKS5pbnN0YWxsUGFja2FnZShtQnVpbGRIZWxwZXIuZ2V0VGVzdEZpbGUoCi0gICAgICAgICAgICAgICAgICAgIFNUQVRJQ19MSUJfUFJPVklERVJfUkVDVVJTSVZFX0FQSyksIGZhbHNlLCBmYWxzZSkpOworICAgICAgICAgICAgYXNzZXJ0TnVsbChpbnN0YWxsKFNUQVRJQ19MSUJfUFJPVklERVJfUkVDVVJTSVZFX0FQSykpOwogICAgICAgICAgICAgLy8gSW5zdGFsbCB0aGUgbGlicmFyeQotICAgICAgICAgICAgYXNzZXJ0TnVsbChnZXREZXZpY2UoKS5pbnN0YWxsUGFja2FnZShtQnVpbGRIZWxwZXIuZ2V0VGVzdEZpbGUoCi0gICAgICAgICAgICAgICAgICAgIFNUQVRJQ19MSUJfUFJPVklERVIxX0FQSyksIGZhbHNlLCBmYWxzZSkpOworICAgICAgICAgICAgYXNzZXJ0TnVsbChpbnN0YWxsKFNUQVRJQ19MSUJfUFJPVklERVIxX0FQSykpOwogICAgICAgICAgICAgLy8gSW5zdGFsbCB0aGUgY2xpZW50Ci0gICAgICAgICAgICBhc3NlcnROdWxsKGdldERldmljZSgpLmluc3RhbGxQYWNrYWdlKG1CdWlsZEhlbHBlci5nZXRUZXN0RmlsZSgKLSAgICAgICAgICAgICAgICAgICAgU1RBVElDX0xJQl9DT05TVU1FUjFfQVBLKSwgZmFsc2UsIGZhbHNlKSk7CisgICAgICAgICAgICBhc3NlcnROdWxsKGluc3RhbGwoU1RBVElDX0xJQl9DT05TVU1FUjFfQVBLKSk7CiAgICAgICAgICAgICAvLyBUcnkgdG8gbG9hZCBjb2RlIGFuZCByZXNvdXJjZXMKICAgICAgICAgICAgIHJ1bkRldmljZVRlc3RzKFNUQVRJQ19MSUJfQ09OU1VNRVIxX1BLRywKICAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQub3MubGliLmNvbnN1bWVyMS5Vc2VTaGFyZWRMaWJyYXJ5VGVzdCIsCkBAIC0xNTUsMTYgKzE3NiwyNSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgdGVzdENhbm5vdFVuaW5zdGFsbFVzZWRTaGFyZWRMaWJyYXJ5MSgpIHRocm93cyBFeGNlcHRpb24geworICAgIEBBcHBNb2RlSW5zdGFudAorICAgIHB1YmxpYyB2b2lkIHRlc3RDYW5ub3RVbmluc3RhbGxVc2VkU2hhcmVkTGlicmFyeTFJbnN0YW50TW9kZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtSW5zdGFudE1vZGUgPSB0cnVlOworICAgICAgICBkb1Rlc3RDYW5ub3RVbmluc3RhbGxVc2VkU2hhcmVkTGlicmFyeTEoKTsKKyAgICB9CisKKyAgICBAQXBwTW9kZUZ1bGwKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2Fubm90VW5pbnN0YWxsVXNlZFNoYXJlZExpYnJhcnkxRnVsbE1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZG9UZXN0Q2Fubm90VW5pbnN0YWxsVXNlZFNoYXJlZExpYnJhcnkxKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRvVGVzdENhbm5vdFVuaW5zdGFsbFVzZWRTaGFyZWRMaWJyYXJ5MSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKFNUQVRJQ19MSUJfUFJPVklERVIxX1BLRyk7CiAgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoU1RBVElDX0xJQl9QUk9WSURFUl9SRUNVUlNJVkVfUEtHKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIC8vIEluc3RhbGwgbGlicmFyeSBkZXBlbmRlbmN5Ci0gICAgICAgICAgICBhc3NlcnROdWxsKGdldERldmljZSgpLmluc3RhbGxQYWNrYWdlKG1CdWlsZEhlbHBlci5nZXRUZXN0RmlsZSgKLSAgICAgICAgICAgICAgICAgICAgU1RBVElDX0xJQl9QUk9WSURFUl9SRUNVUlNJVkVfQVBLKSwgZmFsc2UsIGZhbHNlKSk7CisgICAgICAgICAgICBhc3NlcnROdWxsKGluc3RhbGwoU1RBVElDX0xJQl9QUk9WSURFUl9SRUNVUlNJVkVfQVBLKSk7CiAgICAgICAgICAgICAvLyBJbnN0YWxsIHRoZSBsaWJyYXJ5Ci0gICAgICAgICAgICBhc3NlcnROdWxsKGdldERldmljZSgpLmluc3RhbGxQYWNrYWdlKG1CdWlsZEhlbHBlci5nZXRUZXN0RmlsZSgKLSAgICAgICAgICAgICAgICAgICAgU1RBVElDX0xJQl9QUk9WSURFUjFfQVBLKSwgZmFsc2UsIGZhbHNlKSk7CisgICAgICAgICAgICBhc3NlcnROdWxsKGluc3RhbGwoU1RBVElDX0xJQl9QUk9WSURFUjFfQVBLKSk7CiAgICAgICAgICAgICAvLyBUaGUgbGlicmFyeSBkZXBlbmRlbmN5IGNhbm5vdCBiZSB1bmluc3RhbGxlZAogICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKFNUQVRJQ19MSUJfUFJPVklERVJfUkVDVVJTSVZFX1BLRykpOwogICAgICAgICAgICAgLy8gTm93IHRoZSBsaWJyYXJ5IGRlcGVuZGVuY3kgY2FuIGJlIHVuaW5zdGFsbGVkCkBAIC0xNzcsMjAgKzIwNywyOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgdGVzdENhbm5vdFVuaW5zdGFsbFVzZWRTaGFyZWRMaWJyYXJ5MigpIHRocm93cyBFeGNlcHRpb24geworICAgIEBBcHBNb2RlSW5zdGFudAorICAgIHB1YmxpYyB2b2lkIHRlc3RDYW5ub3RVbmluc3RhbGxVc2VkU2hhcmVkTGlicmFyeTJJbnN0YW50TW9kZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtSW5zdGFudE1vZGUgPSB0cnVlOworICAgICAgICBkb1Rlc3RDYW5ub3RVbmluc3RhbGxVc2VkU2hhcmVkTGlicmFyeTIoKTsKKyAgICB9CisKKyAgICBAQXBwTW9kZUZ1bGwKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2Fubm90VW5pbnN0YWxsVXNlZFNoYXJlZExpYnJhcnkyRnVsbE1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZG9UZXN0Q2Fubm90VW5pbnN0YWxsVXNlZFNoYXJlZExpYnJhcnkyKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRvVGVzdENhbm5vdFVuaW5zdGFsbFVzZWRTaGFyZWRMaWJyYXJ5MigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKFNUQVRJQ19MSUJfQ09OU1VNRVIxX1BLRyk7CiAgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoU1RBVElDX0xJQl9QUk9WSURFUjFfUEtHKTsKICAgICAgICAgZ2V0RGV2aWNlKCkudW5pbnN0YWxsUGFja2FnZShTVEFUSUNfTElCX1BST1ZJREVSX1JFQ1VSU0lWRV9QS0cpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgLy8gSW5zdGFsbCBsaWJyYXJ5IGRlcGVuZGVuY3kKLSAgICAgICAgICAgIGFzc2VydE51bGwoZ2V0RGV2aWNlKCkuaW5zdGFsbFBhY2thZ2UobUJ1aWxkSGVscGVyLmdldFRlc3RGaWxlKAotICAgICAgICAgICAgICAgICAgICBTVEFUSUNfTElCX1BST1ZJREVSX1JFQ1VSU0lWRV9BUEspLCBmYWxzZSwgZmFsc2UpKTsKKyAgICAgICAgICAgIGFzc2VydE51bGwoaW5zdGFsbChTVEFUSUNfTElCX1BST1ZJREVSX1JFQ1VSU0lWRV9BUEspKTsKICAgICAgICAgICAgIC8vIEluc3RhbGwgdGhlIGxpYnJhcnkKLSAgICAgICAgICAgIGFzc2VydE51bGwoZ2V0RGV2aWNlKCkuaW5zdGFsbFBhY2thZ2UobUJ1aWxkSGVscGVyLmdldFRlc3RGaWxlKAotICAgICAgICAgICAgICAgICAgICBTVEFUSUNfTElCX1BST1ZJREVSMV9BUEspLCBmYWxzZSwgZmFsc2UpKTsKKyAgICAgICAgICAgIGFzc2VydE51bGwoaW5zdGFsbChTVEFUSUNfTElCX1BST1ZJREVSMV9BUEspKTsKICAgICAgICAgICAgIC8vIEluc3RhbGwgdGhlIGNsaWVudAotICAgICAgICAgICAgYXNzZXJ0TnVsbChnZXREZXZpY2UoKS5pbnN0YWxsUGFja2FnZShtQnVpbGRIZWxwZXIuZ2V0VGVzdEZpbGUoCi0gICAgICAgICAgICAgICAgICAgIFNUQVRJQ19MSUJfQ09OU1VNRVIxX0FQSyksIGZhbHNlLCBmYWxzZSkpOworICAgICAgICAgICAgYXNzZXJ0TnVsbChpbnN0YWxsKFNUQVRJQ19MSUJfQ09OU1VNRVIxX0FQSykpOwogICAgICAgICAgICAgLy8gVGhlIGxpYnJhcnkgY2Fubm90IGJlIHVuaW5zdGFsbGVkCiAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoU1RBVElDX0xJQl9QUk9WSURFUjFfUEtHKSk7CiAgICAgICAgICAgICAvLyBVbmluc3RhbGwgdGhlIGNsaWVudApAQCAtMjA2LDI0ICsyNDQsMzEgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHRlc3RMaWJyYXJ5VmVyc2lvbnNBbmRWZXJzaW9uQ29kZXNTYW1lT3JkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBAQXBwTW9kZUluc3RhbnQKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGlicmFyeVZlcnNpb25zQW5kVmVyc2lvbkNvZGVzU2FtZU9yZGVySW5zdGFudE1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbUluc3RhbnRNb2RlID0gdHJ1ZTsKKyAgICAgICAgZG9UZXN0TGlicmFyeVZlcnNpb25zQW5kVmVyc2lvbkNvZGVzU2FtZU9yZGVyKCk7CisgICAgfQorCisgICAgQEFwcE1vZGVGdWxsCisgICAgcHVibGljIHZvaWQgdGVzdExpYnJhcnlWZXJzaW9uc0FuZFZlcnNpb25Db2Rlc1NhbWVPcmRlckZ1bGxNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGRvVGVzdExpYnJhcnlWZXJzaW9uc0FuZFZlcnNpb25Db2Rlc1NhbWVPcmRlcigpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkb1Rlc3RMaWJyYXJ5VmVyc2lvbnNBbmRWZXJzaW9uQ29kZXNTYW1lT3JkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZ2V0RGV2aWNlKCkudW5pbnN0YWxsUGFja2FnZShTVEFUSUNfTElCX1BST1ZJREVSMV9QS0cpOwogICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKFNUQVRJQ19MSUJfUFJPVklERVIyX1BLRyk7CiAgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoU1RBVElDX0xJQl9QUk9WSURFUjNfUEtHKTsKICAgICAgICAgZ2V0RGV2aWNlKCkudW5pbnN0YWxsUGFja2FnZShTVEFUSUNfTElCX1BST1ZJREVSX1JFQ1VSU0lWRV9QS0cpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgLy8gSW5zdGFsbCBsaWJyYXJ5IGRlcGVuZGVuY3kKLSAgICAgICAgICAgIGFzc2VydE51bGwoZ2V0RGV2aWNlKCkuaW5zdGFsbFBhY2thZ2UobUJ1aWxkSGVscGVyLmdldFRlc3RGaWxlKAotICAgICAgICAgICAgICAgICAgICBTVEFUSUNfTElCX1BST1ZJREVSX1JFQ1VSU0lWRV9BUEspLCBmYWxzZSwgZmFsc2UpKTsKKyAgICAgICAgICAgIGFzc2VydE51bGwoaW5zdGFsbChTVEFUSUNfTElCX1BST1ZJREVSX1JFQ1VSU0lWRV9BUEspKTsKICAgICAgICAgICAgIC8vIEluc3RhbGwgbGlicmFyeSB2ZXJzaW9uIDEgd2l0aCB2ZXJzaW9uIGNvZGUgMQotICAgICAgICAgICAgYXNzZXJ0TnVsbChnZXREZXZpY2UoKS5pbnN0YWxsUGFja2FnZShtQnVpbGRIZWxwZXIuZ2V0VGVzdEZpbGUoCi0gICAgICAgICAgICAgICAgICAgIFNUQVRJQ19MSUJfUFJPVklERVIxX0FQSyksIGZhbHNlLCBmYWxzZSkpOworICAgICAgICAgICAgYXNzZXJ0TnVsbChpbnN0YWxsKFNUQVRJQ19MSUJfUFJPVklERVIxX0FQSykpOwogICAgICAgICAgICAgLy8gSW5zdGFsbCBsaWJyYXJ5IHZlcnNpb24gMiB3aXRoIHZlcnNpb24gY29kZSA0Ci0gICAgICAgICAgICBhc3NlcnROdWxsKGdldERldmljZSgpLmluc3RhbGxQYWNrYWdlKG1CdWlsZEhlbHBlci5nZXRUZXN0RmlsZSgKLSAgICAgICAgICAgICAgICAgICAgU1RBVElDX0xJQl9QUk9WSURFUjJfQVBLKSwgZmFsc2UsIGZhbHNlKSk7CisgICAgICAgICAgICBhc3NlcnROdWxsKGluc3RhbGwoU1RBVElDX0xJQl9QUk9WSURFUjJfQVBLKSk7CiAgICAgICAgICAgICAvLyBTaG91bGRuJ3QgYmUgYWJsZSB0byBpbnN0YWxsIGxpYnJhcnkgdmVyc2lvbiAzIHdpdGggdmVyc2lvbiBjb2RlIDMKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZ2V0RGV2aWNlKCkuaW5zdGFsbFBhY2thZ2UobUJ1aWxkSGVscGVyLmdldFRlc3RGaWxlKAotICAgICAgICAgICAgICAgICAgICBTVEFUSUNfTElCX1BST1ZJREVSM19BUEspLCBmYWxzZSwgZmFsc2UpKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoaW5zdGFsbChTVEFUSUNfTElCX1BST1ZJREVSM19BUEspKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoU1RBVElDX0xJQl9QUk9WSURFUjFfUEtHKTsKICAgICAgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoU1RBVElDX0xJQl9QUk9WSURFUjJfUEtHKTsKQEAgLTIzMiwzMCArMjc3LDQ4IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2Fubm90SW5zdGFsbEFwcFdpdGhNaXNzaW5nTGlicmFyeSgpIHRocm93cyBFeGNlcHRpb24geworICAgIEBBcHBNb2RlSW5zdGFudAorICAgIHB1YmxpYyB2b2lkIHRlc3RDYW5ub3RJbnN0YWxsQXBwV2l0aE1pc3NpbmdMaWJyYXJ5SW5zdGFudE1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbUluc3RhbnRNb2RlID0gdHJ1ZTsKKyAgICAgICAgZG9UZXN0Q2Fubm90SW5zdGFsbEFwcFdpdGhNaXNzaW5nTGlicmFyeSgpOworICAgIH0KKworICAgIEBBcHBNb2RlRnVsbAorICAgIHB1YmxpYyB2b2lkIHRlc3RDYW5ub3RJbnN0YWxsQXBwV2l0aE1pc3NpbmdMaWJyYXJ5RnVsbE1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZG9UZXN0Q2Fubm90SW5zdGFsbEFwcFdpdGhNaXNzaW5nTGlicmFyeSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkb1Rlc3RDYW5ub3RJbnN0YWxsQXBwV2l0aE1pc3NpbmdMaWJyYXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoU1RBVElDX0xJQl9DT05TVU1FUjFfUEtHKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIC8vIFNob3VsZG4ndCBiZSBhYmxlIHRvIGluc3RhbGwgYW4gYXBwIGlmIGEgZGVwZW5kZW5jeSBsaWIgaXMgbWlzc2luZwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChnZXREZXZpY2UoKS5pbnN0YWxsUGFja2FnZShtQnVpbGRIZWxwZXIuZ2V0VGVzdEZpbGUoCi0gICAgICAgICAgICAgICAgICAgIFNUQVRJQ19MSUJfQ09OU1VNRVIxX0FQSyksIGZhbHNlLCBmYWxzZSkpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChpbnN0YWxsKFNUQVRJQ19MSUJfQ09OU1VNRVIxX0FQSykpOwogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgZ2V0RGV2aWNlKCkudW5pbnN0YWxsUGFja2FnZShTVEFUSUNfTElCX0NPTlNVTUVSMV9QS0cpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgdGVzdENhblJlcGxhY2VMaWJyYXJ5SWZWZXJzaW9uQW5kVmVyc2lvbkNvZGVTYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgQEFwcE1vZGVJbnN0YW50CisgICAgcHVibGljIHZvaWQgdGVzdENhblJlcGxhY2VMaWJyYXJ5SWZWZXJzaW9uQW5kVmVyc2lvbkNvZGVTYW1lSW5zdGFudE1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbUluc3RhbnRNb2RlID0gdHJ1ZTsKKyAgICAgICAgZG9UZXN0Q2FuUmVwbGFjZUxpYnJhcnlJZlZlcnNpb25BbmRWZXJzaW9uQ29kZVNhbWUoKTsKKyAgICB9CisKKyAgICBAQXBwTW9kZUZ1bGwKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FuUmVwbGFjZUxpYnJhcnlJZlZlcnNpb25BbmRWZXJzaW9uQ29kZVNhbWVGdWxsTW9kZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkb1Rlc3RDYW5SZXBsYWNlTGlicmFyeUlmVmVyc2lvbkFuZFZlcnNpb25Db2RlU2FtZSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkb1Rlc3RDYW5SZXBsYWNlTGlicmFyeUlmVmVyc2lvbkFuZFZlcnNpb25Db2RlU2FtZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKFNUQVRJQ19MSUJfUFJPVklERVIxX1BLRyk7CiAgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoU1RBVElDX0xJQl9QUk9WSURFUl9SRUNVUlNJVkVfUEtHKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIC8vIEluc3RhbGwgbGlicmFyeSBkZXBlbmRlbmN5Ci0gICAgICAgICAgICBhc3NlcnROdWxsKGdldERldmljZSgpLmluc3RhbGxQYWNrYWdlKG1CdWlsZEhlbHBlci5nZXRUZXN0RmlsZSgKLSAgICAgICAgICAgICAgICAgICAgU1RBVElDX0xJQl9QUk9WSURFUl9SRUNVUlNJVkVfQVBLKSwgZmFsc2UsIGZhbHNlKSk7CisgICAgICAgICAgICBhc3NlcnROdWxsKGluc3RhbGwoU1RBVElDX0xJQl9QUk9WSURFUl9SRUNVUlNJVkVfQVBLKSk7CiAgICAgICAgICAgICAvLyBJbnN0YWxsIGEgbGlicmFyeQotICAgICAgICAgICAgYXNzZXJ0TnVsbChnZXREZXZpY2UoKS5pbnN0YWxsUGFja2FnZShtQnVpbGRIZWxwZXIuZ2V0VGVzdEZpbGUoCi0gICAgICAgICAgICAgICAgICAgIFNUQVRJQ19MSUJfUFJPVklERVIxX0FQSyksIGZhbHNlLCBmYWxzZSkpOworICAgICAgICAgICAgYXNzZXJ0TnVsbChpbnN0YWxsKFNUQVRJQ19MSUJfUFJPVklERVIxX0FQSykpOwogICAgICAgICAgICAgLy8gQ2Fubm90IGluc3RhbGwgdGhlIGxpYnJhcnkgKG5lZWQgdG8gcmVpbnN0YWxsKQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChnZXREZXZpY2UoKS5pbnN0YWxsUGFja2FnZShtQnVpbGRIZWxwZXIuZ2V0VGVzdEZpbGUoCi0gICAgICAgICAgICAgICAgICAgIFNUQVRJQ19MSUJfUFJPVklERVIxX0FQSyksIGZhbHNlLCBmYWxzZSkpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChpbnN0YWxsKFNUQVRJQ19MSUJfUFJPVklERVIxX0FQSykpOwogICAgICAgICAgICAgLy8gQ2FuIHJlaW5zdGFsbCB0aGUgbGlicmFyeSBpZiB2ZXJzaW9uIGFuZCB2ZXJzaW9uIGNvZGUgc2FtZQogICAgICAgICAgICAgYXNzZXJ0TnVsbChnZXREZXZpY2UoKS5pbnN0YWxsUGFja2FnZShtQnVpbGRIZWxwZXIuZ2V0VGVzdEZpbGUoCiAgICAgICAgICAgICAgICAgICAgIFNUQVRJQ19MSUJfUFJPVklERVIxX0FQSyksIHRydWUsIGZhbHNlKSk7CkBAIC0yNjUsMTkgKzMyOCwyNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgdGVzdFVuaW5zdGFsbFNwZWNpZmljTGlicmFyeVZlcnNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBAQXBwTW9kZUluc3RhbnQKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VW5pbnN0YWxsU3BlY2lmaWNMaWJyYXJ5VmVyc2lvbkluc3RhbnRNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1JbnN0YW50TW9kZSA9IHRydWU7CisgICAgICAgIGRvVGVzdFVuaW5zdGFsbFNwZWNpZmljTGlicmFyeVZlcnNpb24oKTsKKyAgICB9CisKKyAgICBAQXBwTW9kZUZ1bGwKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VW5pbnN0YWxsU3BlY2lmaWNMaWJyYXJ5VmVyc2lvbkZ1bGxNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGRvVGVzdFVuaW5zdGFsbFNwZWNpZmljTGlicmFyeVZlcnNpb24oKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZG9UZXN0VW5pbnN0YWxsU3BlY2lmaWNMaWJyYXJ5VmVyc2lvbigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKFNUQVRJQ19MSUJfUFJPVklERVIxX1BLRyk7CiAgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoU1RBVElDX0xJQl9QUk9WSURFUl9SRUNVUlNJVkVfUEtHKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIC8vIEluc3RhbGwgbGlicmFyeSBkZXBlbmRlbmN5Ci0gICAgICAgICAgICBhc3NlcnROdWxsKGdldERldmljZSgpLmluc3RhbGxQYWNrYWdlKG1CdWlsZEhlbHBlci5nZXRUZXN0RmlsZSgKLSAgICAgICAgICAgICAgICAgICAgU1RBVElDX0xJQl9QUk9WSURFUl9SRUNVUlNJVkVfQVBLKSwgZmFsc2UsIGZhbHNlKSk7CisgICAgICAgICAgICBhc3NlcnROdWxsKGluc3RhbGwoU1RBVElDX0xJQl9QUk9WSURFUl9SRUNVUlNJVkVfQVBLKSk7CiAgICAgICAgICAgICAvLyBJbnN0YWxsIGxpYnJhcnkgdmVyc2lvbiAxIHdpdGggdmVyc2lvbiBjb2RlIDEKLSAgICAgICAgICAgIGFzc2VydE51bGwoZ2V0RGV2aWNlKCkuaW5zdGFsbFBhY2thZ2UobUJ1aWxkSGVscGVyLmdldFRlc3RGaWxlKAotICAgICAgICAgICAgICAgICAgICBTVEFUSUNfTElCX1BST1ZJREVSMV9BUEspLCBmYWxzZSwgZmFsc2UpKTsKKyAgICAgICAgICAgIGFzc2VydE51bGwoaW5zdGFsbChTVEFUSUNfTElCX1BST1ZJREVSMV9BUEspKTsKICAgICAgICAgICAgIC8vIEluc3RhbGwgbGlicmFyeSB2ZXJzaW9uIDIgd2l0aCB2ZXJzaW9uIGNvZGUgNAotICAgICAgICAgICAgYXNzZXJ0TnVsbChnZXREZXZpY2UoKS5pbnN0YWxsUGFja2FnZShtQnVpbGRIZWxwZXIuZ2V0VGVzdEZpbGUoCi0gICAgICAgICAgICAgICAgICAgIFNUQVRJQ19MSUJfUFJPVklERVIyX0FQSyksIGZhbHNlLCBmYWxzZSkpOworICAgICAgICAgICAgYXNzZXJ0TnVsbChpbnN0YWxsKFNUQVRJQ19MSUJfUFJPVklERVIyX0FQSykpOwogICAgICAgICAgICAgLy8gVW5pbnN0YWxsIHRoZSBsaWJyYXJ5IHBhY2thZ2Ugd2l0aCB2ZXJzaW9uIGNvZGUgNCAodmVyc2lvbiAyKQogICAgICAgICAgICAgYXNzZXJ0VHJ1ZShnZXREZXZpY2UoKS5leGVjdXRlU2hlbGxDb21tYW5kKCJwbSB1bmluc3RhbGwgLS12ZXJzaW9uQ29kZSA0ICIKICAgICAgICAgICAgICAgICAgICAgKyBTVEFUSUNfTElCX1BST1ZJREVSMV9QS0cpLnN0YXJ0c1dpdGgoIlN1Y2Nlc3MiKSk7CkBAIC0yOTAsMjAgKzM2MSwyOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgdGVzdEtleVJvdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgQEFwcE1vZGVJbnN0YW50CisgICAgcHVibGljIHZvaWQgdGVzdEtleVJvdGF0aW9uSW5zdGFudE1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbUluc3RhbnRNb2RlID0gdHJ1ZTsKKyAgICAgICAgZG9UZXN0S2V5Um90YXRpb24oKTsKKyAgICB9CisKKyAgICBAQXBwTW9kZUZ1bGwKKyAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5Um90YXRpb25GdWxsTW9kZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkb1Rlc3RLZXlSb3RhdGlvbigpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkb1Rlc3RLZXlSb3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKFNUQVRJQ19MSUJfQ09OU1VNRVIyX1BLRyk7CiAgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoU1RBVElDX0xJQl9QUk9WSURFUjJfUEtHKTsKICAgICAgICAgZ2V0RGV2aWNlKCkudW5pbnN0YWxsUGFja2FnZShTVEFUSUNfTElCX1BST1ZJREVSNF9QS0cpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgLy8gSW5zdGFsbCBhIGxpYnJhcnkgdmVyc2lvbiBzcGVjaWZ5aW5nIGFuIHVwZ3JhZGUga2V5IHNldAotICAgICAgICAgICAgYXNzZXJ0TnVsbChnZXREZXZpY2UoKS5pbnN0YWxsUGFja2FnZShtQnVpbGRIZWxwZXIuZ2V0VGVzdEZpbGUoCi0gICAgICAgICAgICAgICAgICAgIFNUQVRJQ19MSUJfUFJPVklERVIyX0FQSyksIGZhbHNlLCBmYWxzZSkpOworICAgICAgICAgICAgYXNzZXJ0TnVsbChpbnN0YWxsKFNUQVRJQ19MSUJfUFJPVklERVIyX0FQSykpOwogICAgICAgICAgICAgLy8gSW5zdGFsbCBhIG5ld2VyIGxpYnJhcnkgc2lnbmVkIHdpdGggdGhlIHVwZ3JhZGUga2V5IHNldAotICAgICAgICAgICAgYXNzZXJ0TnVsbChnZXREZXZpY2UoKS5pbnN0YWxsUGFja2FnZShtQnVpbGRIZWxwZXIuZ2V0VGVzdEZpbGUoCi0gICAgICAgICAgICAgICAgICAgIFNUQVRJQ19MSUJfUFJPVklERVI0X0FQSyksIGZhbHNlLCBmYWxzZSkpOworICAgICAgICAgICAgYXNzZXJ0TnVsbChpbnN0YWxsKFNUQVRJQ19MSUJfUFJPVklERVI0X0FQSykpOwogICAgICAgICAgICAgLy8gSW5zdGFsbCBhIGNsaWVudCB0aGF0IGRlcGVuZHMgb24gdGhlIHVwZ3JhZGVkIGtleSBzZXQKLSAgICAgICAgICAgIGFzc2VydE51bGwoZ2V0RGV2aWNlKCkuaW5zdGFsbFBhY2thZ2UobUJ1aWxkSGVscGVyLmdldFRlc3RGaWxlKAotICAgICAgICAgICAgICAgICAgICBTVEFUSUNfTElCX0NPTlNVTUVSMl9BUEspLCBmYWxzZSwgZmFsc2UpKTsKKyAgICAgICAgICAgIGFzc2VydE51bGwoaW5zdGFsbChTVEFUSUNfTElCX0NPTlNVTUVSMl9BUEspKTsKICAgICAgICAgICAgIC8vIEVuc3VyZSBjb2RlIGFuZCByZXNvdXJjZXMgY2FuIGJlIGxvYWRlZAogICAgICAgICAgICAgcnVuRGV2aWNlVGVzdHMoU1RBVElDX0xJQl9DT05TVU1FUjJfUEtHLAogICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5vcy5saWIuY29uc3VtZXIyLlVzZVNoYXJlZExpYnJhcnlUZXN0IiwKQEAgLTMxNSwyMCArMzk0LDI4IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2Fubm90SW5zdGFsbEluY29ycmVjdGx5U2lnbmVkTGlicmFyeSgpIHRocm93cyBFeGNlcHRpb24geworICAgIEBBcHBNb2RlSW5zdGFudAorICAgIHB1YmxpYyB2b2lkIHRlc3RDYW5ub3RJbnN0YWxsSW5jb3JyZWN0bHlTaWduZWRMaWJyYXJ5SW5zdGFudE1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbUluc3RhbnRNb2RlID0gdHJ1ZTsKKyAgICAgICAgZG9UZXN0Q2Fubm90SW5zdGFsbEluY29ycmVjdGx5U2lnbmVkTGlicmFyeSgpOworICAgIH0KKworICAgIEBBcHBNb2RlRnVsbAorICAgIHB1YmxpYyB2b2lkIHRlc3RDYW5ub3RJbnN0YWxsSW5jb3JyZWN0bHlTaWduZWRMaWJyYXJ5RnVsbE1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZG9UZXN0Q2Fubm90SW5zdGFsbEluY29ycmVjdGx5U2lnbmVkTGlicmFyeSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkb1Rlc3RDYW5ub3RJbnN0YWxsSW5jb3JyZWN0bHlTaWduZWRMaWJyYXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoU1RBVElDX0xJQl9QUk9WSURFUjFfUEtHKTsKICAgICAgICAgZ2V0RGV2aWNlKCkudW5pbnN0YWxsUGFja2FnZShTVEFUSUNfTElCX1BST1ZJREVSNF9QS0cpOwogICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKFNUQVRJQ19MSUJfUFJPVklERVJfUkVDVVJTSVZFX1BLRyk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAvLyBJbnN0YWxsIGxpYnJhcnkgZGVwZW5kZW5jeQotICAgICAgICAgICAgYXNzZXJ0TnVsbChnZXREZXZpY2UoKS5pbnN0YWxsUGFja2FnZShtQnVpbGRIZWxwZXIuZ2V0VGVzdEZpbGUoCi0gICAgICAgICAgICAgICAgICAgIFNUQVRJQ19MSUJfUFJPVklERVJfUkVDVVJTSVZFX0FQSyksIGZhbHNlLCBmYWxzZSkpOworICAgICAgICAgICAgYXNzZXJ0TnVsbChpbnN0YWxsKFNUQVRJQ19MSUJfUFJPVklERVJfUkVDVVJTSVZFX0FQSykpOwogICAgICAgICAgICAgLy8gSW5zdGFsbCBhIGxpYnJhcnkgdmVyc2lvbiBub3Qgc3BlY2lmeWluZyBhbiB1cGdyYWRlIGtleSBzZXQKLSAgICAgICAgICAgIGFzc2VydE51bGwoZ2V0RGV2aWNlKCkuaW5zdGFsbFBhY2thZ2UobUJ1aWxkSGVscGVyLmdldFRlc3RGaWxlKAotICAgICAgICAgICAgICAgICAgICBTVEFUSUNfTElCX1BST1ZJREVSMV9BUEspLCBmYWxzZSwgZmFsc2UpKTsKKyAgICAgICAgICAgIGFzc2VydE51bGwoaW5zdGFsbChTVEFUSUNfTElCX1BST1ZJREVSMV9BUEspKTsKICAgICAgICAgICAgIC8vIFNob3VsZG4ndCBiZSBhYmxlIHRvIGluc3RhbGwgYSBuZXdlciB2ZXJzaW9uIHNpZ25lZCBkaWZmZXJlbnRseQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChnZXREZXZpY2UoKS5pbnN0YWxsUGFja2FnZShtQnVpbGRIZWxwZXIuZ2V0VGVzdEZpbGUoCi0gICAgICAgICAgICAgICAgICAgIFNUQVRJQ19MSUJfUFJPVklERVI0X0FQSyksIGZhbHNlLCBmYWxzZSkpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChpbnN0YWxsKFNUQVRJQ19MSUJfUFJPVklERVI0X0FQSykpOwogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgZ2V0RGV2aWNlKCkudW5pbnN0YWxsUGFja2FnZShTVEFUSUNfTElCX1BST1ZJREVSMV9QS0cpOwogICAgICAgICAgICAgZ2V0RGV2aWNlKCkudW5pbnN0YWxsUGFja2FnZShTVEFUSUNfTElCX1BST1ZJREVSNF9QS0cpOwpAQCAtMzM2LDEzICs0MjMsMjMgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHRlc3RMaWJyYXJ5QW5kUGFja2FnZU5hbWVDYW5NYXRjaCgpIHRocm93cyBFeGNlcHRpb24geworICAgIEBBcHBNb2RlSW5zdGFudAorICAgIHB1YmxpYyB2b2lkIHRlc3RMaWJyYXJ5QW5kUGFja2FnZU5hbWVDYW5NYXRjaEluc3RhbnRNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1JbnN0YW50TW9kZSA9IHRydWU7CisgICAgICAgIGRvVGVzdExpYnJhcnlBbmRQYWNrYWdlTmFtZUNhbk1hdGNoKCk7CisgICAgfQorCisgICAgQEFwcE1vZGVGdWxsCisgICAgcHVibGljIHZvaWQgdGVzdExpYnJhcnlBbmRQYWNrYWdlTmFtZUNhbk1hdGNoRnVsbE1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZG9UZXN0TGlicmFyeUFuZFBhY2thZ2VOYW1lQ2FuTWF0Y2goKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZG9UZXN0TGlicmFyeUFuZFBhY2thZ2VOYW1lQ2FuTWF0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZ2V0RGV2aWNlKCkudW5pbnN0YWxsUGFja2FnZShTVEFUSUNfTElCX1BST1ZJREVSNV9QS0cpOwogICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKFNUQVRJQ19MSUJfUFJPVklERVI2X1BLRyk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAvLyBJbnN0YWxsIGEgbGlicmFyeSB3aXRoIHNhbWUgbmFtZSBhcyBwYWNrYWdlIHNob3VsZCB3b3JrLgotICAgICAgICAgICAgYXNzZXJ0TnVsbChnZXREZXZpY2UoKS5pbnN0YWxsUGFja2FnZShtQnVpbGRIZWxwZXIuZ2V0VGVzdEZpbGUoCi0gICAgICAgICAgICAgICAgICAgIFNUQVRJQ19MSUJfUFJPVklERVI1X0FQSyksIGZhbHNlLCBmYWxzZSkpOworICAgICAgICAgICAgYXNzZXJ0TnVsbChpbnN0YWxsKFNUQVRJQ19MSUJfUFJPVklERVI1X0FQSykpOwogICAgICAgICAgICAgLy8gSW5zdGFsbCBhIGxpYnJhcnkgd2l0aCBzYW1lIG5hbWUgYXMgcGFja2FnZSBzaG91bGQgd29yay4KICAgICAgICAgICAgIGFzc2VydE51bGwoZ2V0RGV2aWNlKCkuaW5zdGFsbFBhY2thZ2UobUJ1aWxkSGVscGVyLmdldFRlc3RGaWxlKAogICAgICAgICAgICAgICAgICAgICBTVEFUSUNfTElCX1BST1ZJREVSNl9BUEspLCB0cnVlLCBmYWxzZSkpOwpAQCAtMzUyLDcgKzQ0OSwxOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgdGVzdEdldFNoYXJlZExpYnJhcmllcygpIHRocm93cyBFeGNlcHRpb24geworICAgIEBBcHBNb2RlSW5zdGFudAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTaGFyZWRMaWJyYXJpZXNJbnN0YW50TW9kZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtSW5zdGFudE1vZGUgPSB0cnVlOworICAgICAgICBkb1Rlc3RHZXRTaGFyZWRMaWJyYXJpZXMoKTsKKyAgICB9CisKKyAgICBAQXBwTW9kZUZ1bGwKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U2hhcmVkTGlicmFyaWVzRnVsbE1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZG9UZXN0R2V0U2hhcmVkTGlicmFyaWVzKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRvVGVzdEdldFNoYXJlZExpYnJhcmllcygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKFNUQVRJQ19MSUJfQ09OU1VNRVIxX1BLRyk7CiAgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoU1RBVElDX0xJQl9DT05TVU1FUjJfUEtHKTsKICAgICAgICAgZ2V0RGV2aWNlKCkudW5pbnN0YWxsUGFja2FnZShTVEFUSUNfTElCX1BST1ZJREVSMV9QS0cpOwpAQCAtMzYxLDIzICs0NjksMTcgQEAKICAgICAgICAgZ2V0RGV2aWNlKCkudW5pbnN0YWxsUGFja2FnZShTVEFUSUNfTElCX1BST1ZJREVSX1JFQ1VSU0lWRV9QS0cpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgLy8gSW5zdGFsbCBsaWJyYXJ5IGRlcGVuZGVuY3kKLSAgICAgICAgICAgIGFzc2VydE51bGwoZ2V0RGV2aWNlKCkuaW5zdGFsbFBhY2thZ2UobUJ1aWxkSGVscGVyLmdldFRlc3RGaWxlKAotICAgICAgICAgICAgICAgICAgICBTVEFUSUNfTElCX1BST1ZJREVSX1JFQ1VSU0lWRV9BUEspLCBmYWxzZSwgZmFsc2UpKTsKKyAgICAgICAgICAgIGFzc2VydE51bGwoaW5zdGFsbChTVEFUSUNfTElCX1BST1ZJREVSX1JFQ1VSU0lWRV9BUEspKTsKICAgICAgICAgICAgIC8vIEluc3RhbGwgdGhlIGZpcnN0IGxpYnJhcnkKLSAgICAgICAgICAgIGFzc2VydE51bGwoZ2V0RGV2aWNlKCkuaW5zdGFsbFBhY2thZ2UobUJ1aWxkSGVscGVyLmdldFRlc3RGaWxlKAotICAgICAgICAgICAgICAgICAgICBTVEFUSUNfTElCX1BST1ZJREVSMV9BUEspLCBmYWxzZSwgZmFsc2UpKTsKKyAgICAgICAgICAgIGFzc2VydE51bGwoaW5zdGFsbChTVEFUSUNfTElCX1BST1ZJREVSMV9BUEspKTsKICAgICAgICAgICAgIC8vIEluc3RhbGwgdGhlIHNlY29uZCBsaWJyYXJ5Ci0gICAgICAgICAgICBhc3NlcnROdWxsKGdldERldmljZSgpLmluc3RhbGxQYWNrYWdlKG1CdWlsZEhlbHBlci5nZXRUZXN0RmlsZSgKLSAgICAgICAgICAgICAgICAgICAgU1RBVElDX0xJQl9QUk9WSURFUjJfQVBLKSwgZmFsc2UsIGZhbHNlKSk7CisgICAgICAgICAgICBhc3NlcnROdWxsKGluc3RhbGwoU1RBVElDX0xJQl9QUk9WSURFUjJfQVBLKSk7CiAgICAgICAgICAgICAvLyBJbnN0YWxsIHRoZSB0aGlyZCBsaWJyYXJ5Ci0gICAgICAgICAgICBhc3NlcnROdWxsKGdldERldmljZSgpLmluc3RhbGxQYWNrYWdlKG1CdWlsZEhlbHBlci5nZXRUZXN0RmlsZSgKLSAgICAgICAgICAgICAgICAgICAgU1RBVElDX0xJQl9QUk9WSURFUjRfQVBLKSwgZmFsc2UsIGZhbHNlKSk7CisgICAgICAgICAgICBhc3NlcnROdWxsKGluc3RhbGwoU1RBVElDX0xJQl9QUk9WSURFUjRfQVBLKSk7CiAgICAgICAgICAgICAvLyBJbnN0YWxsIHRoZSBmaXJzdCBjbGllbnQKLSAgICAgICAgICAgIGFzc2VydE51bGwoZ2V0RGV2aWNlKCkuaW5zdGFsbFBhY2thZ2UobUJ1aWxkSGVscGVyLmdldFRlc3RGaWxlKAotICAgICAgICAgICAgICAgICAgICBTVEFUSUNfTElCX0NPTlNVTUVSMV9BUEspLCBmYWxzZSwgZmFsc2UpKTsKKyAgICAgICAgICAgIGFzc2VydE51bGwoaW5zdGFsbChTVEFUSUNfTElCX0NPTlNVTUVSMV9BUEspKTsKICAgICAgICAgICAgIC8vIEluc3RhbGwgdGhlIHNlY29uZCBjbGllbnQKLSAgICAgICAgICAgIGFzc2VydE51bGwoZ2V0RGV2aWNlKCkuaW5zdGFsbFBhY2thZ2UobUJ1aWxkSGVscGVyLmdldFRlc3RGaWxlKAotICAgICAgICAgICAgICAgICAgICBTVEFUSUNfTElCX0NPTlNVTUVSMl9BUEspLCBmYWxzZSwgZmFsc2UpKTsKKyAgICAgICAgICAgIGFzc2VydE51bGwoaW5zdGFsbChTVEFUSUNfTElCX0NPTlNVTUVSMl9BUEspKTsKICAgICAgICAgICAgIC8vIEVuc3VyZSBsaWJyYXJpZXMgYXJlIHByb3Blcmx5IHJlcG9ydGVkCiAgICAgICAgICAgICBydW5EZXZpY2VUZXN0cyhTVEFUSUNfTElCX0NPTlNVTUVSMV9QS0csCiAgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLm9zLmxpYi5jb25zdW1lcjEuVXNlU2hhcmVkTGlicmFyeVRlc3QiLApAQCAtMzkyLDI0ICs0OTQsMzEgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBDYW5TZWVPbmx5TGlicmFyaWVzSXREZXBlbmRPbigpIHRocm93cyBFeGNlcHRpb24geworICAgIEBBcHBNb2RlSW5zdGFudAorICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBDYW5TZWVPbmx5TGlicmFyaWVzSXREZXBlbmRPbkluc3RhbnRNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1JbnN0YW50TW9kZSA9IHRydWU7CisgICAgICAgIGRvVGVzdEFwcENhblNlZU9ubHlMaWJyYXJpZXNJdERlcGVuZE9uKCk7CisgICAgfQorCisgICAgQEFwcE1vZGVGdWxsCisgICAgcHVibGljIHZvaWQgdGVzdEFwcENhblNlZU9ubHlMaWJyYXJpZXNJdERlcGVuZE9uRnVsbE1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZG9UZXN0QXBwQ2FuU2VlT25seUxpYnJhcmllc0l0RGVwZW5kT24oKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZG9UZXN0QXBwQ2FuU2VlT25seUxpYnJhcmllc0l0RGVwZW5kT24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZ2V0RGV2aWNlKCkudW5pbnN0YWxsUGFja2FnZShTVEFUSUNfTElCX0NPTlNVTUVSMV9QS0cpOwogICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKFNUQVRJQ19MSUJfUFJPVklERVIxX1BLRyk7CiAgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoU1RBVElDX0xJQl9QUk9WSURFUjJfUEtHKTsKICAgICAgICAgZ2V0RGV2aWNlKCkudW5pbnN0YWxsUGFja2FnZShTVEFUSUNfTElCX1BST1ZJREVSX1JFQ1VSU0lWRV9QS0cpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgLy8gSW5zdGFsbCBsaWJyYXJ5IGRlcGVuZGVuY3kKLSAgICAgICAgICAgIGFzc2VydE51bGwoZ2V0RGV2aWNlKCkuaW5zdGFsbFBhY2thZ2UobUJ1aWxkSGVscGVyLmdldFRlc3RGaWxlKAotICAgICAgICAgICAgICAgICAgICBTVEFUSUNfTElCX1BST1ZJREVSX1JFQ1VSU0lWRV9BUEspLCBmYWxzZSwgZmFsc2UpKTsKKyAgICAgICAgICAgIGFzc2VydE51bGwoaW5zdGFsbChTVEFUSUNfTElCX1BST1ZJREVSX1JFQ1VSU0lWRV9BUEspKTsKICAgICAgICAgICAgIC8vIEluc3RhbGwgdGhlIGZpcnN0IGxpYnJhcnkKLSAgICAgICAgICAgIGFzc2VydE51bGwoZ2V0RGV2aWNlKCkuaW5zdGFsbFBhY2thZ2UobUJ1aWxkSGVscGVyLmdldFRlc3RGaWxlKAotICAgICAgICAgICAgICAgICAgICBTVEFUSUNfTElCX1BST1ZJREVSMV9BUEspLCBmYWxzZSwgZmFsc2UpKTsKKyAgICAgICAgICAgIGFzc2VydE51bGwoaW5zdGFsbChTVEFUSUNfTElCX1BST1ZJREVSMV9BUEspKTsKICAgICAgICAgICAgIC8vIEluc3RhbGwgdGhlIHNlY29uZCBsaWJyYXJ5Ci0gICAgICAgICAgICBhc3NlcnROdWxsKGdldERldmljZSgpLmluc3RhbGxQYWNrYWdlKG1CdWlsZEhlbHBlci5nZXRUZXN0RmlsZSgKLSAgICAgICAgICAgICAgICAgICAgU1RBVElDX0xJQl9QUk9WSURFUjJfQVBLKSwgZmFsc2UsIGZhbHNlKSk7CisgICAgICAgICAgICBhc3NlcnROdWxsKGluc3RhbGwoU1RBVElDX0xJQl9QUk9WSURFUjJfQVBLKSk7CiAgICAgICAgICAgICAvLyBJbnN0YWxsIHRoZSBjbGllbnQKLSAgICAgICAgICAgIGFzc2VydE51bGwoZ2V0RGV2aWNlKCkuaW5zdGFsbFBhY2thZ2UobUJ1aWxkSGVscGVyLmdldFRlc3RGaWxlKAotICAgICAgICAgICAgICAgICAgICBTVEFUSUNfTElCX0NPTlNVTUVSMV9BUEspLCBmYWxzZSwgZmFsc2UpKTsKKyAgICAgICAgICAgIGFzc2VydE51bGwoaW5zdGFsbChTVEFUSUNfTElCX0NPTlNVTUVSMV9BUEspKTsKICAgICAgICAgICAgIC8vIEVuc3VyZSB0aGUgY2xpZW50IGNhbiBzZWUgb25seSB0aGUgbGliIGl0IGRlcGVuZHMgb24KICAgICAgICAgICAgIHJ1bkRldmljZVRlc3RzKFNUQVRJQ19MSUJfQ09OU1VNRVIxX1BLRywKICAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQub3MubGliLmNvbnN1bWVyMS5Vc2VTaGFyZWRMaWJyYXJ5VGVzdCIsCkBAIC00MjIsMTYgKzUzMSwyNSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgdGVzdExvYWRDb2RlRnJvbU5hdGl2ZUxpYigpIHRocm93cyBFeGNlcHRpb24geworICAgIEBBcHBNb2RlSW5zdGFudAorICAgIHB1YmxpYyB2b2lkIHRlc3RMb2FkQ29kZUZyb21OYXRpdmVMaWJJbnN0YW50TW9kZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtSW5zdGFudE1vZGUgPSB0cnVlOworICAgICAgICBkb1Rlc3RMb2FkQ29kZUZyb21OYXRpdmVMaWIoKTsKKyAgICB9CisKKyAgICBAQXBwTW9kZUZ1bGwKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9hZENvZGVGcm9tTmF0aXZlTGliRnVsbE1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZG9UZXN0TG9hZENvZGVGcm9tTmF0aXZlTGliKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRvVGVzdExvYWRDb2RlRnJvbU5hdGl2ZUxpYigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKFNUQVRJQ19MSUJfTkFUSVZFX0NPTlNVTUVSX1BLRyk7CiAgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoU1RBVElDX0xJQl9OQVRJVkVfUFJPVklERVJfUEtHKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIC8vIEluc3RhbGwgbGlicmFyeQotICAgICAgICAgICAgYXNzZXJ0TnVsbChnZXREZXZpY2UoKS5pbnN0YWxsUGFja2FnZShtQnVpbGRIZWxwZXIuZ2V0VGVzdEZpbGUoCi0gICAgICAgICAgICAgICAgICAgIFNUQVRJQ19MSUJfTkFUSVZFX1BST1ZJREVSX0FQSyksIGZhbHNlLCBmYWxzZSkpOworICAgICAgICAgICAgYXNzZXJ0TnVsbChpbnN0YWxsKFNUQVRJQ19MSUJfTkFUSVZFX1BST1ZJREVSX0FQSykpOwogICAgICAgICAgICAgLy8gSW5zdGFsbCB0aGUgbGlicmFyeSBjbGllbnQKLSAgICAgICAgICAgIGFzc2VydE51bGwoZ2V0RGV2aWNlKCkuaW5zdGFsbFBhY2thZ2UobUJ1aWxkSGVscGVyLmdldFRlc3RGaWxlKAotICAgICAgICAgICAgICAgICAgICBTVEFUSUNfTElCX05BVElWRV9DT05TVU1FUl9BUEspLCBmYWxzZSwgZmFsc2UpKTsKKyAgICAgICAgICAgIGFzc2VydE51bGwoaW5zdGFsbChTVEFUSUNfTElCX05BVElWRV9DT05TVU1FUl9BUEspKTsKICAgICAgICAgICAgIC8vIEVuc3VyZSB0aGUgY2xpZW50IGNhbiBsb2FkIG5hdGl2ZSBjb2RlIGZyb20gdGhlIGxpYnJhcnkKICAgICAgICAgICAgIHJ1bkRldmljZVRlc3RzKFNUQVRJQ19MSUJfTkFUSVZFX0NPTlNVTUVSX1BLRywKICAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQub3MubGliLmNvbnN1bWVyLlVzZVNoYXJlZExpYnJhcnlUZXN0IiwKQEAgLTQ0MiwyOCArNTYwLDQ3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TG9hZENvZGVGcm9tTmF0aXZlTGliTXVsdGlBcmNoVmlvbGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgQEFwcE1vZGVJbnN0YW50CisgICAgcHVibGljIHZvaWQgdGVzdExvYWRDb2RlRnJvbU5hdGl2ZUxpYk11bHRpQXJjaFZpb2xhdGlvbkluc3RhbnRNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1JbnN0YW50TW9kZSA9IHRydWU7CisgICAgICAgIGRvVGVzdExvYWRDb2RlRnJvbU5hdGl2ZUxpYk11bHRpQXJjaFZpb2xhdGlvbigpOworICAgIH0KKworICAgIEBBcHBNb2RlRnVsbAorICAgIHB1YmxpYyB2b2lkIHRlc3RMb2FkQ29kZUZyb21OYXRpdmVMaWJNdWx0aUFyY2hWaW9sYXRpb25GdWxsTW9kZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkb1Rlc3RMb2FkQ29kZUZyb21OYXRpdmVMaWJNdWx0aUFyY2hWaW9sYXRpb24oKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZG9UZXN0TG9hZENvZGVGcm9tTmF0aXZlTGliTXVsdGlBcmNoVmlvbGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoU1RBVElDX0xJQl9OQVRJVkVfUFJPVklERVJfUEtHMSk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAvLyBDYW5ub3QgaW5zdGFsbCB0aGUgbGlicmFyeSB3aXRoIG5hdGl2ZSBjb2RlIGlmIG5vdCBtdWx0aS1hcmNoCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGdldERldmljZSgpLmluc3RhbGxQYWNrYWdlKG1CdWlsZEhlbHBlci5nZXRUZXN0RmlsZSgKLSAgICAgICAgICAgICAgICAgICAgU1RBVElDX0xJQl9OQVRJVkVfUFJPVklERVJfQVBLMSksIGZhbHNlLCBmYWxzZSkpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChpbnN0YWxsKFNUQVRJQ19MSUJfTkFUSVZFX1BST1ZJREVSX0FQSzEpKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoU1RBVElDX0xJQl9OQVRJVkVfUFJPVklERVJfUEtHMSk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TG9hZENvZGVBbmRSZXNvdXJjZXNGcm9tU2hhcmVkTGlicmFyeVNpZ25lZFdpdGhUd29DZXJ0cygpCisgICAgQEFwcE1vZGVJbnN0YW50CisgICAgcHVibGljIHZvaWQgdGVzdExvYWRDb2RlQW5kUmVzb3VyY2VzRnJvbVNoYXJlZExpYnJhcnlTaWduZWRXaXRoVHdvQ2VydHNJbnN0YW50TW9kZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtSW5zdGFudE1vZGUgPSB0cnVlOworICAgICAgICBkb1Rlc3RMb2FkQ29kZUFuZFJlc291cmNlc0Zyb21TaGFyZWRMaWJyYXJ5U2lnbmVkV2l0aFR3b0NlcnRzKCk7CisgICAgfQorCisgICAgQEFwcE1vZGVGdWxsCisgICAgcHVibGljIHZvaWQgdGVzdExvYWRDb2RlQW5kUmVzb3VyY2VzRnJvbVNoYXJlZExpYnJhcnlTaWduZWRXaXRoVHdvQ2VydHNGdWxsTW9kZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkb1Rlc3RMb2FkQ29kZUFuZFJlc291cmNlc0Zyb21TaGFyZWRMaWJyYXJ5U2lnbmVkV2l0aFR3b0NlcnRzKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRvVGVzdExvYWRDb2RlQW5kUmVzb3VyY2VzRnJvbVNoYXJlZExpYnJhcnlTaWduZWRXaXRoVHdvQ2VydHMoKQogICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoU1RBVElDX0xJQl9DT05TVU1FUjNfUEtHKTsKICAgICAgICAgZ2V0RGV2aWNlKCkudW5pbnN0YWxsUGFja2FnZShTVEFUSUNfTElCX1BST1ZJREVSN19QS0cpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgLy8gSW5zdGFsbCB0aGUgbGlicmFyeQotICAgICAgICAgICAgYXNzZXJ0TnVsbChnZXREZXZpY2UoKS5pbnN0YWxsUGFja2FnZShtQnVpbGRIZWxwZXIuZ2V0VGVzdEZpbGUoCi0gICAgICAgICAgICAgICAgICAgIFNUQVRJQ19MSUJfUFJPVklERVI3X0FQSyksIGZhbHNlLCBmYWxzZSkpOworICAgICAgICAgICAgYXNzZXJ0TnVsbChpbnN0YWxsKFNUQVRJQ19MSUJfUFJPVklERVI3X0FQSykpOwogICAgICAgICAgICAgLy8gSW5zdGFsbCB0aGUgY2xpZW50Ci0gICAgICAgICAgICBhc3NlcnROdWxsKGdldERldmljZSgpLmluc3RhbGxQYWNrYWdlKG1CdWlsZEhlbHBlci5nZXRUZXN0RmlsZSgKLSAgICAgICAgICAgICAgICAgICAgU1RBVElDX0xJQl9DT05TVU1FUjNfQVBLKSwgZmFsc2UsIGZhbHNlKSk7CisgICAgICAgICAgICBhc3NlcnROdWxsKGluc3RhbGwoU1RBVElDX0xJQl9DT05TVU1FUjNfQVBLKSk7CiAgICAgICAgICAgICAvLyBUcnkgdG8gbG9hZCBjb2RlIGFuZCByZXNvdXJjZXMKICAgICAgICAgICAgIHJ1bkRldmljZVRlc3RzKFNUQVRJQ19MSUJfQ09OU1VNRVIzX1BLRywKICAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQub3MubGliLmNvbnN1bWVyMy5Vc2VTaGFyZWRMaWJyYXJ5VGVzdCIsCkBAIC00OTQsOSArNjMxLDkgQEAKICAgICAgICAgaWYgKHJlc3VsdC5oYXNGYWlsZWRUZXN0cygpKSB7CiAgICAgICAgICAgICAvLyBidWlsZCBhIG1lYW5pbmdmdWwgZXJyb3IgbWVzc2FnZQogICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBlcnJvckJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigib24tZGV2aWNlIHRlc3RzIGZhaWxlZDpcbiIpOwotICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8VGVzdElkZW50aWZpZXIsIFRlc3RSZXN1bHQ+IHJlc3VsdEVudHJ5IDoKKyAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFRlc3REZXNjcmlwdGlvbiwgVGVzdFJlc3VsdD4gcmVzdWx0RW50cnkgOgogICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0VGVzdFJlc3VsdHMoKS5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHRFbnRyeS5nZXRWYWx1ZSgpLmdldFN0YXR1cygpLmVxdWFscyhUZXN0UmVzdWx0LlRlc3RTdGF0dXMuUEFTU0VEKSkgeworICAgICAgICAgICAgICAgIGlmICghcmVzdWx0RW50cnkuZ2V0VmFsdWUoKS5nZXRTdGF0dXMoKS5lcXVhbHMoVGVzdFN0YXR1cy5QQVNTRUQpKSB7CiAgICAgICAgICAgICAgICAgICAgIGVycm9yQnVpbGRlci5hcHBlbmQocmVzdWx0RW50cnkuZ2V0S2V5KCkudG9TdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgICAgIGVycm9yQnVpbGRlci5hcHBlbmQoIjpcbiIpOwogICAgICAgICAgICAgICAgICAgICBlcnJvckJ1aWxkZXIuYXBwZW5kKHJlc3VsdEVudHJ5LmdldFZhbHVlKCkuZ2V0U3RhY2tUcmFjZSgpKTsKQEAgLTUwNSw0ICs2NDIsOSBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGVycm9yQnVpbGRlci50b1N0cmluZygpKTsKICAgICAgICAgfQogICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGluc3RhbGwoU3RyaW5nIGFwaykgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdldERldmljZSgpLmluc3RhbGxQYWNrYWdlKG1CdWlsZEhlbHBlci5nZXRUZXN0RmlsZShhcGspLCBmYWxzZSwgZmFsc2UsCisgICAgICAgICAgICAgICAgYXBrLmNvbnRhaW5zKCJjb25zdW1lciIpICYmIG1JbnN0YW50TW9kZSA/ICItLWluc3RhbnQiIDogIiIpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvb3MvdGVzdC1hcHBzL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL29zL3Rlc3QtYXBwcy9BbmRyb2lkLm1rCmluZGV4IGJkOTRmYjUuLjA3NjdlNGIgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvb3MvdGVzdC1hcHBzL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9vcy90ZXN0LWFwcHMvQW5kcm9pZC5tawpAQCAtMTcsNyArMTcsNyBAQAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKICMgdGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cyBjdHNfaW5zdGFudAogCiAjIEJ1aWxkIHRoZSB0ZXN0IEFQS3MgdXNpbmcgdGhlaXIgb3duIG1ha2VmaWxlcwogaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9vcy90ZXN0LWFwcHMvSG9zdExpbmtWZXJpZmljYXRpb25BcHAvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvb3MvdGVzdC1hcHBzL0hvc3RMaW5rVmVyaWZpY2F0aW9uQXBwL0FuZHJvaWQubWsKaW5kZXggYmQ3ZWI1Zi4uOTljMmUxZCAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9vcy90ZXN0LWFwcHMvSG9zdExpbmtWZXJpZmljYXRpb25BcHAvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL29zL3Rlc3QtYXBwcy9Ib3N0TGlua1ZlcmlmaWNhdGlvbkFwcC9BbmRyb2lkLm1rCkBAIC0yNCw2ICsyNCw2IEBACiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzSG9zdExpbmtWZXJpZmljYXRpb25BcHAKIAogIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzIGN0c19pbnN0YW50CiAKIGluY2x1ZGUgJChCVUlMRF9DVFNfU1VQUE9SVF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9vcy90ZXN0LWFwcHMvUHJvY2ZzVGVzdEFwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9vcy90ZXN0LWFwcHMvUHJvY2ZzVGVzdEFwcC9BbmRyb2lkLm1rCmluZGV4IGQzZWRjNDMuLmU0MjgwNGYgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvb3MvdGVzdC1hcHBzL1Byb2Nmc1Rlc3RBcHAvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL29zL3Rlc3QtYXBwcy9Qcm9jZnNUZXN0QXBwL0FuZHJvaWQubWsKQEAgLTI2LDYgKzI2LDYgQEAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNIb3N0UHJvY2ZzVGVzdEFwcAogCiAjIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0Ci1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMgY3RzX2luc3RhbnQKIAogaW5jbHVkZSAkKEJVSUxEX0NUU19TVVBQT1JUX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL29zL3Rlc3QtYXBwcy9Qcm9jZnNUZXN0QXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL29zL3Rlc3QtYXBwcy9Qcm9jZnNUZXN0QXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggOGE3NDYzYS4uNTc0NTNjNiAxMDA3NTUKLS0tIGEvaG9zdHNpZGV0ZXN0cy9vcy90ZXN0LWFwcHMvUHJvY2ZzVGVzdEFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvb3MvdGVzdC1hcHBzL1Byb2Nmc1Rlc3RBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMTYsNyArMTYsOCBAQAogIC0tPgogCiA8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHBhY2thZ2U9ImFuZHJvaWQub3MucHJvY2ZzIj4KKyAgICBwYWNrYWdlPSJhbmRyb2lkLm9zLnByb2NmcyIKKyAgICBhbmRyb2lkOnRhcmdldFNhbmRib3hWZXJzaW9uPSIyIj4KIAogICAgIDxhcHBsaWNhdGlvbj4KICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLlByb2Nmc1Rlc3QiCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL29zL3Rlc3QtYXBwcy9TdGF0aWNTaGFyZWRMaWJDb25zdW1lckFwcDEvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvb3MvdGVzdC1hcHBzL1N0YXRpY1NoYXJlZExpYkNvbnN1bWVyQXBwMS9BbmRyb2lkLm1rCmluZGV4IDlkMGQwMDEuLjg1YWFkZTcgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvb3MvdGVzdC1hcHBzL1N0YXRpY1NoYXJlZExpYkNvbnN1bWVyQXBwMS9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvb3MvdGVzdC1hcHBzL1N0YXRpY1NoYXJlZExpYkNvbnN1bWVyQXBwMS9BbmRyb2lkLm1rCkBAIC0yMywxMyArMjMsMTQgQEAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIAogTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKLSAgICBhbmRyb2lkLXN1cHBvcnQtdGVzdCBcCi0gICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbAorICAgIGFuZHJvaWR4LnRlc3QucnVsZXMgXAorICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0CiAKIExPQ0FMX1JFU19MSUJSQVJJRVMgOj0gQ3RzU3RhdGljU2hhcmVkTGliUHJvdmlkZXJBcHAxCiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNTdGF0aWNTaGFyZWRMaWJDb25zdW1lckFwcDEKK0xPQ0FMX1BSSVZBVEVfUExBVEZPUk1fQVBJUyA6PSB0cnVlCiAKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cyBjdHNfaW5zdGFudAogCiBpbmNsdWRlICQoQlVJTERfQ1RTX1NVUFBPUlRfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvb3MvdGVzdC1hcHBzL1N0YXRpY1NoYXJlZExpYkNvbnN1bWVyQXBwMS9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9vcy90ZXN0LWFwcHMvU3RhdGljU2hhcmVkTGliQ29uc3VtZXJBcHAxL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggY2JlYjM0Mi4uOTVmNmIyOSAxMDA3NTUKLS0tIGEvaG9zdHNpZGV0ZXN0cy9vcy90ZXN0LWFwcHMvU3RhdGljU2hhcmVkTGliQ29uc3VtZXJBcHAxL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9vcy90ZXN0LWFwcHMvU3RhdGljU2hhcmVkTGliQ29uc3VtZXJBcHAxL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTE4LDExICsxOCwxNCBAQAogPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKICAgICAgICAgcGFja2FnZT0iYW5kcm9pZC5vcy5saWIuY29uc3VtZXIxIgogICAgICAgICBhbmRyb2lkOnZlcnNpb25Db2RlPSIxIgotICAgICAgICBhbmRyb2lkOnZlcnNpb25OYW1lPSIxLjAiPgorICAgICAgICBhbmRyb2lkOnZlcnNpb25OYW1lPSIxLjAiCisgICAgICAgIGFuZHJvaWQ6dGFyZ2V0U2FuZGJveFZlcnNpb249IjIiPgogCiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRVFVRVNUX0lOU1RBTExfUEFDS0FHRVMiLz4KIAogICAgIDxhcHBsaWNhdGlvbj4KKyAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CisKICAgICAgICAgPHVzZXMtc3RhdGljLWxpYnJhcnkKICAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9ImZvby5iYXIubGliIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmVyc2lvbj0iMSIKQEAgLTMwLDcgKzMzLDcgQEAKICAgICAgICAgPC91c2VzLXN0YXRpYy1saWJyYXJ5PgogICAgIDwvYXBwbGljYXRpb24+CiAKLSAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLm9zLmxpYi5jb25zdW1lcjEiLz4KIAogPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvb3MvdGVzdC1hcHBzL1N0YXRpY1NoYXJlZExpYkNvbnN1bWVyQXBwMS9zcmMvYW5kcm9pZC9vcy9saWIvY29uc3VtZXIxL1VzZVNoYXJlZExpYnJhcnlUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL29zL3Rlc3QtYXBwcy9TdGF0aWNTaGFyZWRMaWJDb25zdW1lckFwcDEvc3JjL2FuZHJvaWQvb3MvbGliL2NvbnN1bWVyMS9Vc2VTaGFyZWRMaWJyYXJ5VGVzdC5qYXZhCmluZGV4IGRjYTM2OTkuLmI1NDYyZTUgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvb3MvdGVzdC1hcHBzL1N0YXRpY1NoYXJlZExpYkNvbnN1bWVyQXBwMS9zcmMvYW5kcm9pZC9vcy9saWIvY29uc3VtZXIxL1VzZVNoYXJlZExpYnJhcnlUZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9vcy90ZXN0LWFwcHMvU3RhdGljU2hhcmVkTGliQ29uc3VtZXJBcHAxL3NyYy9hbmRyb2lkL29zL2xpYi9jb25zdW1lcjEvVXNlU2hhcmVkTGlicmFyeVRlc3QuamF2YQpAQCAtMjIsMjMgKzIyLDIyIEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwogCi1pbXBvcnQgYW5kcm9pZC5hcHAuQXBwT3BzTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQXBwbGljYXRpb25JbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlSW5mbzsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlNoYXJlZExpYnJhcnlJbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5WZXJzaW9uZWRQYWNrYWdlOwotaW1wb3J0IGFuZHJvaWQub3MuRGVidWc7CiBpbXBvcnQgYW5kcm9pZC5vcy5saWIucHJvdmlkZXIuU3RhdGljU2hhcmVkTGliOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5TeXN0ZW1VdGlsOworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlN5c3RlbVV0aWw7Ci0KIEBSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCiBwdWJsaWMgY2xhc3MgVXNlU2hhcmVkTGlicmFyeVRlc3QgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSUJfTkFNRSA9ICJmb28uYmFyLmxpYiI7CkBAIC01MSw3ICs1MCw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRJQ19MSUJfQ09OU1VNRVIyX1BLRyA9ICJhbmRyb2lkLm9zLmxpYi5jb25zdW1lcjIiOwogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TG9hZENvZGVBbmRSZXNvdXJjZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9hZENvZGVBbmRSZXNvdXJjZXMoKSB7CiAgICAgICAgIGFzc2VydFNhbWUoMSwgU3RhdGljU2hhcmVkTGliLmdldFZlcnNpb24oSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpKSk7CiAgICAgfQogCkBAIC03NSwzNSArNzQsMzYgQEAKICAgICAgICAgICAgIGZvciAoU2hhcmVkTGlicmFyeUluZm8gc2hhcmVkTGliIDogc2hhcmVkTGlicykgewogICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoc2hhcmVkTGliLmdldE5hbWUoKSk7CiAKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdHlwZSA9IHNoYXJlZExpYi5nZXRUeXBlKCk7CiAgICAgICAgICAgICAgICAgaW50IHR5cGVDb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgdHlwZUNvdW50ICs9IHNoYXJlZExpYi5pc0J1aWx0aW4oKSA/IDEgOiAwOwotICAgICAgICAgICAgICAgIHR5cGVDb3VudCArPSBzaGFyZWRMaWIuaXNEeW5hbWljKCkgPyAxIDogMDsKLSAgICAgICAgICAgICAgICB0eXBlQ291bnQgKz0gc2hhcmVkTGliLmlzU3RhdGljKCkgPyAxIDogMDsKKyAgICAgICAgICAgICAgICB0eXBlQ291bnQgKz0gdHlwZSA9PSBTaGFyZWRMaWJyYXJ5SW5mby5UWVBFX0JVSUxUSU4gPyAxIDogMDsKKyAgICAgICAgICAgICAgICB0eXBlQ291bnQgKz0gdHlwZSA9PSBTaGFyZWRMaWJyYXJ5SW5mby5UWVBFX0RZTkFNSUMgPyAxIDogMDsKKyAgICAgICAgICAgICAgICB0eXBlQ291bnQgKz0gdHlwZSA9PSBTaGFyZWRMaWJyYXJ5SW5mby5UWVBFX1NUQVRJQyA/IDEgOiAwOwogCiAgICAgICAgICAgICAgICAgaWYgKHR5cGVDb3VudCAhPSAxKSB7CiAgICAgICAgICAgICAgICAgICAgIGZhaWwoIkxpYnJhcnkgIiArIHNoYXJlZExpYi5nZXROYW1lKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgbXVzdCBiZSBlaXRoZXIgYnVpbHRpbiBvciBkeW5hbWljIG9yIHN0YXRpYyIpOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChzaGFyZWRMaWIuaXNCdWlsdGluKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0U2FtZShTaGFyZWRMaWJyYXJ5SW5mby5WRVJTSU9OX1VOREVGSU5FRCwgc2hhcmVkTGliLmdldFZlcnNpb24oKSk7CisgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gU2hhcmVkTGlicmFyeUluZm8uVFlQRV9CVUlMVElOKSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFNhbWUoKGxvbmcpIFNoYXJlZExpYnJhcnlJbmZvLlZFUlNJT05fVU5ERUZJTkVELCBzaGFyZWRMaWIuZ2V0TG9uZ1ZlcnNpb24oKSk7CiAgICAgICAgICAgICAgICAgICAgIFZlcnNpb25lZFBhY2thZ2UgZGVjbGFyaW5nUGFja2FnZSA9IHNoYXJlZExpYi5nZXREZWNsYXJpbmdQYWNrYWdlKCk7CiAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhQTEFURk9STV9QQUNLQUdFLCBkZWNsYXJpbmdQYWNrYWdlLmdldFBhY2thZ2VOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRTYW1lKDAsIGRlY2xhcmluZ1BhY2thZ2UuZ2V0VmVyc2lvbkNvZGUoKSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFNhbWUoMEwsIGRlY2xhcmluZ1BhY2thZ2UuZ2V0TG9uZ1ZlcnNpb25Db2RlKCkpOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChzaGFyZWRMaWIuaXNEeW5hbWljKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0U2FtZShTaGFyZWRMaWJyYXJ5SW5mby5WRVJTSU9OX1VOREVGSU5FRCwgc2hhcmVkTGliLmdldFZlcnNpb24oKSk7CisgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gU2hhcmVkTGlicmFyeUluZm8uVFlQRV9EWU5BTUlDKSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFNhbWUoKGxvbmcpIFNoYXJlZExpYnJhcnlJbmZvLlZFUlNJT05fVU5ERUZJTkVELCBzaGFyZWRMaWIuZ2V0TG9uZ1ZlcnNpb24oKSk7CiAgICAgICAgICAgICAgICAgICAgIFZlcnNpb25lZFBhY2thZ2UgZGVjbGFyaW5nUGFja2FnZSA9IHNoYXJlZExpYi5nZXREZWNsYXJpbmdQYWNrYWdlKCk7CiAgICAgICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZGVjbGFyaW5nUGFja2FnZS5nZXRQYWNrYWdlTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShkZWNsYXJpbmdQYWNrYWdlLmdldFZlcnNpb25Db2RlKCkgPj0gMCk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZGVjbGFyaW5nUGFja2FnZS5nZXRMb25nVmVyc2lvbkNvZGUoKSA+PSAwKTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAoc2hhcmVkTGliLmlzU3RhdGljKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzaGFyZWRMaWIuZ2V0VmVyc2lvbigpID49IDApOworICAgICAgICAgICAgICAgIGlmICh0eXBlID09IFNoYXJlZExpYnJhcnlJbmZvLlRZUEVfU1RBVElDKSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoc2hhcmVkTGliLmdldExvbmdWZXJzaW9uKCkgPj0gMCk7CiAgICAgICAgICAgICAgICAgICAgIFZlcnNpb25lZFBhY2thZ2UgZGVjbGFyaW5nUGFja2FnZSA9IHNoYXJlZExpYi5nZXREZWNsYXJpbmdQYWNrYWdlKCk7CiAgICAgICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZGVjbGFyaW5nUGFja2FnZS5nZXRQYWNrYWdlTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShkZWNsYXJpbmdQYWNrYWdlLmdldFZlcnNpb25Db2RlKCkgPj0gMCk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZGVjbGFyaW5nUGFja2FnZS5nZXRMb25nVmVyc2lvbkNvZGUoKSA+PSAwKTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBib29sZWFuIHZhbGlkTGliTmFtZSA9IGZhbHNlOwpAQCAtMTE5LDQ4ICsxMTksMzcgQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpZiAodmFsaWRMaWJOYW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoc2hhcmVkTGliLmlzU3RhdGljKCkpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHR5cGUgPT0gU2hhcmVkTGlicmFyeUluZm8uVFlQRV9TVEFUSUMpOwogCiAgICAgICAgICAgICAgICAgICAgIFZlcnNpb25lZFBhY2thZ2UgZGVjbGFyaW5nUGFja2FnZSA9IHNoYXJlZExpYi5nZXREZWNsYXJpbmdQYWNrYWdlKCk7CiAgICAgICAgICAgICAgICAgICAgIExpc3Q8VmVyc2lvbmVkUGFja2FnZT4gZGVwZW5kZW50UGFja2FnZXMgPSBzaGFyZWRMaWIuZ2V0RGVwZW5kZW50UGFja2FnZXMoKTsKIAotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHNoYXJlZExpYi5nZXRWZXJzaW9uKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTogewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0TGliRm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFNhbWUoMSwgZGVjbGFyaW5nUGFja2FnZS5nZXRWZXJzaW9uQ29kZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRTYW1lKDEsIGRlcGVuZGVudFBhY2thZ2VzLnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbmVkUGFja2FnZSBkZXBlbmRlbnRQYWNrYWdlID0gZGVwZW5kZW50UGFja2FnZXMuZ2V0KDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhTVEFUSUNfTElCX0NPTlNVTUVSMV9QS0csIGRlcGVuZGVudFBhY2thZ2UuZ2V0UGFja2FnZU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0U2FtZSgxLCBkZXBlbmRlbnRQYWNrYWdlLmdldFZlcnNpb25Db2RlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjogewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZExpYkZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRTYW1lKDQsIGRlY2xhcmluZ1BhY2thZ2UuZ2V0VmVyc2lvbkNvZGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShkZXBlbmRlbnRQYWNrYWdlcy5pc0VtcHR5KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTogewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXJkTGliRm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFNhbWUoNSwgZGVjbGFyaW5nUGFja2FnZS5nZXRWZXJzaW9uQ29kZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRTYW1lKDEsIGRlcGVuZGVudFBhY2thZ2VzLnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbmVkUGFja2FnZSBkZXBlbmRlbnRQYWNrYWdlID0gZGVwZW5kZW50UGFja2FnZXMuZ2V0KDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhTVEFUSUNfTElCX0NPTlNVTUVSMl9QS0csIGRlcGVuZGVudFBhY2thZ2UuZ2V0UGFja2FnZU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0U2FtZSgyLCBkZXBlbmRlbnRQYWNrYWdlLmdldFZlcnNpb25Db2RlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjogewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdXJ0aExpYkZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRTYW1lKDEsIGRlY2xhcmluZ1BhY2thZ2UuZ2V0VmVyc2lvbkNvZGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0U2FtZSgxLCBkZXBlbmRlbnRQYWNrYWdlcy5zaXplKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb25lZFBhY2thZ2UgZGVwZW5kZW50UGFja2FnZSA9IGRlcGVuZGVudFBhY2thZ2VzLmdldCgwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoU1RBVElDX0xJQl9QUk9WSURFUl9QS0csIGRlcGVuZGVudFBhY2thZ2UuZ2V0UGFja2FnZU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0U2FtZSgxLCBkZXBlbmRlbnRQYWNrYWdlLmdldFZlcnNpb25Db2RlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgdmVyc2lvbkNvZGUgPSBzaGFyZWRMaWIuZ2V0TG9uZ1ZlcnNpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZlcnNpb25Db2RlID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0TGliRm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0U2FtZSgxTCwgZGVjbGFyaW5nUGFja2FnZS5nZXRMb25nVmVyc2lvbkNvZGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRTYW1lKDEsIGRlcGVuZGVudFBhY2thZ2VzLnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uZWRQYWNrYWdlIGRlcGVuZGVudFBhY2thZ2UgPSBkZXBlbmRlbnRQYWNrYWdlcy5nZXQoMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoU1RBVElDX0xJQl9DT05TVU1FUjFfUEtHLCBkZXBlbmRlbnRQYWNrYWdlLmdldFBhY2thZ2VOYW1lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0U2FtZSgxTCwgZGVwZW5kZW50UGFja2FnZS5nZXRMb25nVmVyc2lvbkNvZGUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmVyc2lvbkNvZGUgPT0gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kTGliRm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0U2FtZSg0TCwgZGVjbGFyaW5nUGFja2FnZS5nZXRMb25nVmVyc2lvbkNvZGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGRlcGVuZGVudFBhY2thZ2VzLmlzRW1wdHkoKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmVyc2lvbkNvZGUgPT0gNSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcmRMaWJGb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRTYW1lKDVMLCBkZWNsYXJpbmdQYWNrYWdlLmdldExvbmdWZXJzaW9uQ29kZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFNhbWUoMSwgZGVwZW5kZW50UGFja2FnZXMuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb25lZFBhY2thZ2UgZGVwZW5kZW50UGFja2FnZSA9IGRlcGVuZGVudFBhY2thZ2VzLmdldCgwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhTVEFUSUNfTElCX0NPTlNVTUVSMl9QS0csIGRlcGVuZGVudFBhY2thZ2UuZ2V0UGFja2FnZU5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRTYW1lKDJMLCBkZXBlbmRlbnRQYWNrYWdlLmdldExvbmdWZXJzaW9uQ29kZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2ZXJzaW9uQ29kZSA9PSA2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3VydGhMaWJGb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRTYW1lKDFMLCBkZWNsYXJpbmdQYWNrYWdlLmdldExvbmdWZXJzaW9uQ29kZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFNhbWUoMSwgZGVwZW5kZW50UGFja2FnZXMuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb25lZFBhY2thZ2UgZGVwZW5kZW50UGFja2FnZSA9IGRlcGVuZGVudFBhY2thZ2VzLmdldCgwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhTVEFUSUNfTElCX1BST1ZJREVSX1BLRywgZGVwZW5kZW50UGFja2FnZS5nZXRQYWNrYWdlTmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFNhbWUoMUwsIGRlcGVuZGVudFBhY2thZ2UuZ2V0TG9uZ1ZlcnNpb25Db2RlKCkpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMTgyLDQwICsxNzEsNDAgQEAKICAgICAgICAgUGFja2FnZUluZm8gbGliUGFja2FnZUluZm8gPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKQogICAgICAgICAgICAgICAgIC5nZXRDb250ZXh0KCkuZ2V0UGFja2FnZU1hbmFnZXIoKS5nZXRQYWNrYWdlSW5mbyhTVEFUSUNfTElCX1BST1ZJREVSX1BLRywgMCk7CiAgICAgICAgIGFzc2VydEVxdWFscyhTVEFUSUNfTElCX1BST1ZJREVSX1BLRywgbGliUGFja2FnZUluZm8ucGFja2FnZU5hbWUpOwotICAgICAgICBhc3NlcnRTYW1lKDEsIGxpYlBhY2thZ2VJbmZvLnZlcnNpb25Db2RlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDFMLCBsaWJQYWNrYWdlSW5mby5nZXRMb25nVmVyc2lvbkNvZGUoKSk7CiAKICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIHNlZSB0aGUgbGliIHdlIGRlcGVuZCBvbiB2aWEgZ2V0dGluZyBpbnN0YWxsZWQgcGFja2FnZXMKICAgICAgICAgTGlzdDxQYWNrYWdlSW5mbz4gaW5zdGFsbGVkUGFja2FnZXMgPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKQogICAgICAgICAgICAgICAgIC5nZXRDb250ZXh0KCkuZ2V0UGFja2FnZU1hbmFnZXIoKS5nZXRJbnN0YWxsZWRQYWNrYWdlcygwKTsKLSAgICAgICAgaW50IHVzZWRMaWJyYXJ5VmVyc2lvbkNvZGUgPSAtMTsKKyAgICAgICAgbG9uZyB1c2VkTGlicmFyeVZlcnNpb25Db2RlID0gLTE7CiAgICAgICAgIGZvciAoUGFja2FnZUluZm8gaW5zdGFsbGVkUGFja2FnZSA6IGluc3RhbGxlZFBhY2thZ2VzKSB7CiAgICAgICAgICAgICBpZiAoU1RBVElDX0xJQl9QUk9WSURFUl9QS0cuZXF1YWxzKGluc3RhbGxlZFBhY2thZ2UucGFja2FnZU5hbWUpKSB7CiAgICAgICAgICAgICAgICAgaWYgKHVzZWRMaWJyYXJ5VmVyc2lvbkNvZGUgIT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgZmFpbCgiU2hvdWxkIHNlZSBvbmx5IHRoZSBsaWIgaXQgZGVwZW5kcyBvbiIpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB1c2VkTGlicmFyeVZlcnNpb25Db2RlID0gaW5zdGFsbGVkUGFja2FnZS5hcHBsaWNhdGlvbkluZm8udmVyc2lvbkNvZGU7CisgICAgICAgICAgICAgICAgdXNlZExpYnJhcnlWZXJzaW9uQ29kZSA9IGluc3RhbGxlZFBhY2thZ2UuZ2V0TG9uZ1ZlcnNpb25Db2RlKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgYXNzZXJ0U2FtZSgxLCB1c2VkTGlicmFyeVZlcnNpb25Db2RlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDFMLCB1c2VkTGlicmFyeVZlcnNpb25Db2RlKTsKIAogICAgICAgICAvLyBNYWtlIHN1cmUgd2Ugc2VlIG9ubHkgdGhlIGxpYiB3ZSBkZXBlbmQgb24gdmlhIGdldHRpbmcgaXRzIGFwcCBpbmZvCiAgICAgICAgIEFwcGxpY2F0aW9uSW5mbyBhcHBJbmZvID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkKICAgICAgICAgICAgICAgICAuZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VNYW5hZ2VyKCkuZ2V0QXBwbGljYXRpb25JbmZvKFNUQVRJQ19MSUJfUFJPVklERVJfUEtHLCAwKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKFNUQVRJQ19MSUJfUFJPVklERVJfUEtHLCBhcHBJbmZvLnBhY2thZ2VOYW1lKTsKLSAgICAgICAgYXNzZXJ0U2FtZSgxLCBsaWJQYWNrYWdlSW5mby52ZXJzaW9uQ29kZSk7CisgICAgICAgIGFzc2VydEVxdWFscygxTCwgbGliUGFja2FnZUluZm8uZ2V0TG9uZ1ZlcnNpb25Db2RlKCkpOwogCiAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBzZWUgdGhlIGxpYiB3ZSBkZXBlbmQgb24gdmlhIGdldHRpbmcgaW5zdGFsbGVkIGFwcHMKLSAgICAgICAgTGlzdDxBcHBsaWNhdGlvbkluZm8+IGluc3RhbGxlZEFwcHMgPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKQotICAgICAgICAgICAgICAgIC5nZXRDb250ZXh0KCkuZ2V0UGFja2FnZU1hbmFnZXIoKS5nZXRJbnN0YWxsZWRBcHBsaWNhdGlvbnMoMCk7CisgICAgICAgIExpc3Q8UGFja2FnZUluZm8+IGluc3RhbGxlZEFwcHMgPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKS5nZXRDb250ZXh0KCkKKyAgICAgICAgICAgICAgICAuZ2V0UGFja2FnZU1hbmFnZXIoKS5nZXRJbnN0YWxsZWRQYWNrYWdlcygwKTsKICAgICAgICAgdXNlZExpYnJhcnlWZXJzaW9uQ29kZSA9IC0xOwotICAgICAgICBmb3IgKEFwcGxpY2F0aW9uSW5mbyBpbnN0YWxsZWRBcHAgOiBpbnN0YWxsZWRBcHBzKSB7CisgICAgICAgIGZvciAoUGFja2FnZUluZm8gaW5zdGFsbGVkQXBwIDogaW5zdGFsbGVkQXBwcykgewogICAgICAgICAgICAgaWYgKFNUQVRJQ19MSUJfUFJPVklERVJfUEtHLmVxdWFscyhpbnN0YWxsZWRBcHAucGFja2FnZU5hbWUpKSB7CiAgICAgICAgICAgICAgICAgaWYgKHVzZWRMaWJyYXJ5VmVyc2lvbkNvZGUgIT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgZmFpbCgiU2hvdWxkIHNlZSBvbmx5IHRoZSBsaWIgaXQgZGVwZW5kcyBvbiIpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB1c2VkTGlicmFyeVZlcnNpb25Db2RlID0gaW5zdGFsbGVkQXBwLnZlcnNpb25Db2RlOworICAgICAgICAgICAgICAgIHVzZWRMaWJyYXJ5VmVyc2lvbkNvZGUgPSBpbnN0YWxsZWRBcHAuZ2V0TG9uZ1ZlcnNpb25Db2RlKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgYXNzZXJ0U2FtZSgxLCB1c2VkTGlicmFyeVZlcnNpb25Db2RlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDFMLCB1c2VkTGlicmFyeVZlcnNpb25Db2RlKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL29zL3Rlc3QtYXBwcy9TdGF0aWNTaGFyZWRMaWJDb25zdW1lckFwcDIvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvb3MvdGVzdC1hcHBzL1N0YXRpY1NoYXJlZExpYkNvbnN1bWVyQXBwMi9BbmRyb2lkLm1rCmluZGV4IDBjNzM1MWEuLjllMzVjMGUgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvb3MvdGVzdC1hcHBzL1N0YXRpY1NoYXJlZExpYkNvbnN1bWVyQXBwMi9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvb3MvdGVzdC1hcHBzL1N0YXRpY1NoYXJlZExpYkNvbnN1bWVyQXBwMi9BbmRyb2lkLm1rCkBAIC0yMSwxMiArMjEsMTMgQEAKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC1zdXBwb3J0LXRlc3QKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkeC50ZXN0LnJ1bGVzCiAKIExPQ0FMX1JFU19MSUJSQVJJRVMgOj0gQ3RzU3RhdGljU2hhcmVkTGliUHJvdmlkZXJBcHA0CiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNTdGF0aWNTaGFyZWRMaWJDb25zdW1lckFwcDIKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKIAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzIGN0c19pbnN0YW50CiAKIGluY2x1ZGUgJChCVUlMRF9DVFNfU1VQUE9SVF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9vcy90ZXN0LWFwcHMvU3RhdGljU2hhcmVkTGliQ29uc3VtZXJBcHAyL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL29zL3Rlc3QtYXBwcy9TdGF0aWNTaGFyZWRMaWJDb25zdW1lckFwcDIvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBhZTI1MjdiLi41YTc2ZWEzIDEwMDc1NQotLS0gYS9ob3N0c2lkZXRlc3RzL29zL3Rlc3QtYXBwcy9TdGF0aWNTaGFyZWRMaWJDb25zdW1lckFwcDIvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL29zL3Rlc3QtYXBwcy9TdGF0aWNTaGFyZWRMaWJDb25zdW1lckFwcDIvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMTgsNyArMTgsOCBAQAogPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKICAgICAgICAgcGFja2FnZT0iYW5kcm9pZC5vcy5saWIuY29uc3VtZXIyIgogICAgICAgICBhbmRyb2lkOnZlcnNpb25Db2RlPSIyIgotICAgICAgICBhbmRyb2lkOnZlcnNpb25OYW1lPSIzLjAiPgorICAgICAgICBhbmRyb2lkOnZlcnNpb25OYW1lPSIzLjAiCisgICAgICAgIGFuZHJvaWQ6dGFyZ2V0U2FuZGJveFZlcnNpb249IjIiPgogCiAgICAgPGFwcGxpY2F0aW9uPgogICAgICAgICA8dXNlcy1zdGF0aWMtbGlicmFyeQpAQCAtMjgsNyArMjksNyBAQAogICAgICAgICA8L3VzZXMtc3RhdGljLWxpYnJhcnk+CiAgICAgPC9hcHBsaWNhdGlvbj4KIAotICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQub3MubGliLmNvbnN1bWVyMiIvPgogCiA8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9vcy90ZXN0LWFwcHMvU3RhdGljU2hhcmVkTGliQ29uc3VtZXJBcHAyL3NyYy9hbmRyb2lkL29zL2xpYi9jb25zdW1lcjIvVXNlU2hhcmVkTGlicmFyeVRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvb3MvdGVzdC1hcHBzL1N0YXRpY1NoYXJlZExpYkNvbnN1bWVyQXBwMi9zcmMvYW5kcm9pZC9vcy9saWIvY29uc3VtZXIyL1VzZVNoYXJlZExpYnJhcnlUZXN0LmphdmEKaW5kZXggNGU5YTM0Ny4uOGY4MjRkMSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9vcy90ZXN0LWFwcHMvU3RhdGljU2hhcmVkTGliQ29uc3VtZXJBcHAyL3NyYy9hbmRyb2lkL29zL2xpYi9jb25zdW1lcjIvVXNlU2hhcmVkTGlicmFyeVRlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL29zL3Rlc3QtYXBwcy9TdGF0aWNTaGFyZWRMaWJDb25zdW1lckFwcDIvc3JjL2FuZHJvaWQvb3MvbGliL2NvbnN1bWVyMi9Vc2VTaGFyZWRMaWJyYXJ5VGVzdC5qYXZhCkBAIC0xNiwxNCArMTYsMTYgQEAKIAogcGFja2FnZSBhbmRyb2lkLm9zLmxpYi5jb25zdW1lcjI7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRTYW1lOworCiBpbXBvcnQgYW5kcm9pZC5vcy5saWIucHJvdmlkZXIuU3RhdGljU2hhcmVkTGliOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKLQogQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKIHB1YmxpYyBjbGFzcyBVc2VTaGFyZWRMaWJyYXJ5VGVzdCB7CiAgICAgQFRlc3QKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvb3MvdGVzdC1hcHBzL1N0YXRpY1NoYXJlZExpYkNvbnN1bWVyQXBwMy9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9vcy90ZXN0LWFwcHMvU3RhdGljU2hhcmVkTGliQ29uc3VtZXJBcHAzL0FuZHJvaWQubWsKaW5kZXggNzFmOWU4Yy4uOTFhZTg3MiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9vcy90ZXN0LWFwcHMvU3RhdGljU2hhcmVkTGliQ29uc3VtZXJBcHAzL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9vcy90ZXN0LWFwcHMvU3RhdGljU2hhcmVkTGliQ29uc3VtZXJBcHAzL0FuZHJvaWQubWsKQEAgLTIxLDEyICsyMSwxMyBAQAogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLXN1cHBvcnQtdGVzdAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWR4LnRlc3QucnVsZXMKIAogTE9DQUxfUkVTX0xJQlJBUklFUyA6PSBDdHNTdGF0aWNTaGFyZWRMaWJQcm92aWRlckFwcDcKIAogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c1N0YXRpY1NoYXJlZExpYkNvbnN1bWVyQXBwMworTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAogCi1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMgY3RzX2luc3RhbnQKIAogaW5jbHVkZSAkKEJVSUxEX0NUU19TVVBQT1JUX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL29zL3Rlc3QtYXBwcy9TdGF0aWNTaGFyZWRMaWJDb25zdW1lckFwcDMvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvb3MvdGVzdC1hcHBzL1N0YXRpY1NoYXJlZExpYkNvbnN1bWVyQXBwMy9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGRhZGRiYzYuLjU1ZTE5MDQgMTAwNzU1Ci0tLSBhL2hvc3RzaWRldGVzdHMvb3MvdGVzdC1hcHBzL1N0YXRpY1NoYXJlZExpYkNvbnN1bWVyQXBwMy9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvb3MvdGVzdC1hcHBzL1N0YXRpY1NoYXJlZExpYkNvbnN1bWVyQXBwMy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0xOCw3ICsxOCw4IEBACiA8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgogICAgICAgICBwYWNrYWdlPSJhbmRyb2lkLm9zLmxpYi5jb25zdW1lcjMiCiAgICAgICAgIGFuZHJvaWQ6dmVyc2lvbkNvZGU9IjIiCi0gICAgICAgIGFuZHJvaWQ6dmVyc2lvbk5hbWU9IjMuMCI+CisgICAgICAgIGFuZHJvaWQ6dmVyc2lvbk5hbWU9IjMuMCIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRTYW5kYm94VmVyc2lvbj0iMiI+CiAKICAgICA8YXBwbGljYXRpb24+CiAgICAgICAgIDx1c2VzLXN0YXRpYy1saWJyYXJ5CkBAIC0yOSw3ICszMCw3IEBACiAgICAgICAgIDwvdXNlcy1zdGF0aWMtbGlicmFyeT4KICAgICA8L2FwcGxpY2F0aW9uPgogCi0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5vcy5saWIuY29uc3VtZXIzIi8+CiAKIDwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL29zL3Rlc3QtYXBwcy9TdGF0aWNTaGFyZWRMaWJDb25zdW1lckFwcDMvc3JjL2FuZHJvaWQvb3MvbGliL2NvbnN1bWVyMy9Vc2VTaGFyZWRMaWJyYXJ5VGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9vcy90ZXN0LWFwcHMvU3RhdGljU2hhcmVkTGliQ29uc3VtZXJBcHAzL3NyYy9hbmRyb2lkL29zL2xpYi9jb25zdW1lcjMvVXNlU2hhcmVkTGlicmFyeVRlc3QuamF2YQppbmRleCBhNTcyMDdmLi4xNDYyMDQ4IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL29zL3Rlc3QtYXBwcy9TdGF0aWNTaGFyZWRMaWJDb25zdW1lckFwcDMvc3JjL2FuZHJvaWQvb3MvbGliL2NvbnN1bWVyMy9Vc2VTaGFyZWRMaWJyYXJ5VGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvb3MvdGVzdC1hcHBzL1N0YXRpY1NoYXJlZExpYkNvbnN1bWVyQXBwMy9zcmMvYW5kcm9pZC9vcy9saWIvY29uc3VtZXIzL1VzZVNoYXJlZExpYnJhcnlUZXN0LmphdmEKQEAgLTE2LDE0ICsxNiwxNiBAQAogCiBwYWNrYWdlIGFuZHJvaWQub3MubGliLmNvbnN1bWVyMzsKIAoraW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFNhbWU7CisKIGltcG9ydCBhbmRyb2lkLm9zLmxpYi5wcm92aWRlci5TdGF0aWNTaGFyZWRMaWI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRTYW1lOwotCiBAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQogcHVibGljIGNsYXNzIFVzZVNoYXJlZExpYnJhcnlUZXN0IHsKICAgICBAVGVzdApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9vcy90ZXN0LWFwcHMvU3RhdGljU2hhcmVkTGliUHJvdmlkZXJBcHAxL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL29zL3Rlc3QtYXBwcy9TdGF0aWNTaGFyZWRMaWJQcm92aWRlckFwcDEvQW5kcm9pZC5tawppbmRleCAyZTJhNWU0Li44NWVlMDI1IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL29zL3Rlc3QtYXBwcy9TdGF0aWNTaGFyZWRMaWJQcm92aWRlckFwcDEvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL29zL3Rlc3QtYXBwcy9TdGF0aWNTaGFyZWRMaWJQcm92aWRlckFwcDEvQW5kcm9pZC5tawpAQCAtMjMsMTAgKzIzLDExIEBACiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNTdGF0aWNTaGFyZWRMaWJQcm92aWRlckFwcDEKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKIAogTE9DQUxfQ0VSVElGSUNBVEUgOj0gY3RzL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvY2VydHMva2V5c2V0cy9jdHMta2V5c2V0LXRlc3QtYgogCi1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMgY3RzX2luc3RhbnQKIAogTE9DQUxfUFJPR1VBUkRfRU5BQkxFRCA6PSBkaXNhYmxlZAogCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL29zL3Rlc3QtYXBwcy9TdGF0aWNTaGFyZWRMaWJQcm92aWRlckFwcDIvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvb3MvdGVzdC1hcHBzL1N0YXRpY1NoYXJlZExpYlByb3ZpZGVyQXBwMi9BbmRyb2lkLm1rCmluZGV4IDlhM2RhOWIuLjk3NjA2ZWIgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvb3MvdGVzdC1hcHBzL1N0YXRpY1NoYXJlZExpYlByb3ZpZGVyQXBwMi9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvb3MvdGVzdC1hcHBzL1N0YXRpY1NoYXJlZExpYlByb3ZpZGVyQXBwMi9BbmRyb2lkLm1rCkBAIC0yNiw3ICsyNiw3IEBACiAKIExPQ0FMX0NFUlRJRklDQVRFIDo9IGN0cy9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L2NlcnRzL2tleXNldHMvY3RzLWtleXNldC10ZXN0LWIKIAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzIGN0c19pbnN0YW50CiAKIExPQ0FMX0FBUFRfRkxBR1MgOj0gLS1zaGFyZWQtbGliCiAKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvb3MvdGVzdC1hcHBzL1N0YXRpY1NoYXJlZExpYlByb3ZpZGVyQXBwMy9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9vcy90ZXN0LWFwcHMvU3RhdGljU2hhcmVkTGliUHJvdmlkZXJBcHAzL0FuZHJvaWQubWsKaW5kZXggNjFhZGMxNy4uYWRkNzA4NyAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9vcy90ZXN0LWFwcHMvU3RhdGljU2hhcmVkTGliUHJvdmlkZXJBcHAzL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9vcy90ZXN0LWFwcHMvU3RhdGljU2hhcmVkTGliUHJvdmlkZXJBcHAzL0FuZHJvaWQubWsKQEAgLTIwLDEwICsyMCwxMSBAQAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKIAogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c1N0YXRpY1NoYXJlZExpYlByb3ZpZGVyQXBwMworTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAogCiBMT0NBTF9DRVJUSUZJQ0FURSA6PSBjdHMvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9jZXJ0cy9rZXlzZXRzL2N0cy1rZXlzZXQtdGVzdC1iCiAKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cyBjdHNfaW5zdGFudAogCiBMT0NBTF9BQVBUX0ZMQUdTIDo9IC0tc2hhcmVkLWxpYgogCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL29zL3Rlc3QtYXBwcy9TdGF0aWNTaGFyZWRMaWJQcm92aWRlckFwcDQvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvb3MvdGVzdC1hcHBzL1N0YXRpY1NoYXJlZExpYlByb3ZpZGVyQXBwNC9BbmRyb2lkLm1rCmluZGV4IDAyMDUyNTkuLjliYmE2NzggMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvb3MvdGVzdC1hcHBzL1N0YXRpY1NoYXJlZExpYlByb3ZpZGVyQXBwNC9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvb3MvdGVzdC1hcHBzL1N0YXRpY1NoYXJlZExpYlByb3ZpZGVyQXBwNC9BbmRyb2lkLm1rCkBAIC0yMiwxMCArMjIsMTEgQEAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIAogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c1N0YXRpY1NoYXJlZExpYlByb3ZpZGVyQXBwNAorTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAogCiBMT0NBTF9DRVJUSUZJQ0FURSA6PSBjdHMvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9jZXJ0cy9rZXlzZXRzL2N0cy1rZXlzZXQtdGVzdC1hCiAKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cyBjdHNfaW5zdGFudAogCiBMT0NBTF9QUk9HVUFSRF9FTkFCTEVEIDo9IGRpc2FibGVkCiAKQEAgLTMzLDQgKzM0LDQgQEAKIAogTE9DQUxfRVhQT1JUX1BBQ0tBR0VfUkVTT1VSQ0VTIDo9IHRydWUKIAotaW5jbHVkZSAkKEJVSUxEX0NUU19TVVBQT1JUX1BBQ0tBR0UpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQoraW5jbHVkZSAkKEJVSUxEX0NUU19TVVBQT1JUX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL29zL3Rlc3QtYXBwcy9TdGF0aWNTaGFyZWRMaWJQcm92aWRlckFwcDUvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvb3MvdGVzdC1hcHBzL1N0YXRpY1NoYXJlZExpYlByb3ZpZGVyQXBwNS9BbmRyb2lkLm1rCmluZGV4IDEyNTFmOGIuLjg0ZmM3YjYgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvb3MvdGVzdC1hcHBzL1N0YXRpY1NoYXJlZExpYlByb3ZpZGVyQXBwNS9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvb3MvdGVzdC1hcHBzL1N0YXRpY1NoYXJlZExpYlByb3ZpZGVyQXBwNS9BbmRyb2lkLm1rCkBAIC0yNiw3ICsyNiw3IEBACiAKIExPQ0FMX0NFUlRJRklDQVRFIDo9IGN0cy9ob3N0c2lkZXRlc3RzL2FwcHNlY3VyaXR5L2NlcnRzL2tleXNldHMvY3RzLWtleXNldC10ZXN0LWIKIAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzIGN0c19pbnN0YW50CiAKIExPQ0FMX0FBUFRfRkxBR1MgOj0gLS1zaGFyZWQtbGliCiAKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvb3MvdGVzdC1hcHBzL1N0YXRpY1NoYXJlZExpYlByb3ZpZGVyQXBwNi9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9vcy90ZXN0LWFwcHMvU3RhdGljU2hhcmVkTGliUHJvdmlkZXJBcHA2L0FuZHJvaWQubWsKaW5kZXggMmU1ZGM1Ni4uMTNjYjliZCAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9vcy90ZXN0LWFwcHMvU3RhdGljU2hhcmVkTGliUHJvdmlkZXJBcHA2L0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9vcy90ZXN0LWFwcHMvU3RhdGljU2hhcmVkTGliUHJvdmlkZXJBcHA2L0FuZHJvaWQubWsKQEAgLTI2LDcgKzI2LDcgQEAKIAogTE9DQUxfQ0VSVElGSUNBVEUgOj0gY3RzL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvY2VydHMva2V5c2V0cy9jdHMta2V5c2V0LXRlc3QtYgogCi1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMgY3RzX2luc3RhbnQKIAogTE9DQUxfQUFQVF9GTEFHUyA6PSAtLXNoYXJlZC1saWIKIApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9vcy90ZXN0LWFwcHMvU3RhdGljU2hhcmVkTGliUHJvdmlkZXJBcHA3L0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL29zL3Rlc3QtYXBwcy9TdGF0aWNTaGFyZWRMaWJQcm92aWRlckFwcDcvQW5kcm9pZC5tawppbmRleCAwNzRjYWUzLi43Nzg4ZTI1IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL29zL3Rlc3QtYXBwcy9TdGF0aWNTaGFyZWRMaWJQcm92aWRlckFwcDcvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL29zL3Rlc3QtYXBwcy9TdGF0aWNTaGFyZWRMaWJQcm92aWRlckFwcDcvQW5kcm9pZC5tawpAQCAtMjMsMTIgKzIzLDEzIEBACiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNTdGF0aWNTaGFyZWRMaWJQcm92aWRlckFwcDcKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKIAogTE9DQUxfQ0VSVElGSUNBVEUgOj0gY3RzL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvY2VydHMva2V5c2V0cy9jdHMta2V5c2V0LXRlc3QtYgogCiBMT0NBTF9BRERJVElPTkFMX0NFUlRJRklDQVRFUyA6PSBjdHMvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9jZXJ0cy9rZXlzZXRzL2N0cy1rZXlzZXQtdGVzdC1hCiAKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cyBjdHNfaW5zdGFudAogCiBMT0NBTF9QUk9HVUFSRF9FTkFCTEVEIDo9IGRpc2FibGVkCiAKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvb3MvdGVzdC1hcHBzL1N0YXRpY1NoYXJlZExpYlByb3ZpZGVyQXBwUmVjdXJzaXZlL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL29zL3Rlc3QtYXBwcy9TdGF0aWNTaGFyZWRMaWJQcm92aWRlckFwcFJlY3Vyc2l2ZS9BbmRyb2lkLm1rCmluZGV4IDY5ZWQxNWYuLjA2MzE5MDQgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvb3MvdGVzdC1hcHBzL1N0YXRpY1NoYXJlZExpYlByb3ZpZGVyQXBwUmVjdXJzaXZlL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9vcy90ZXN0LWFwcHMvU3RhdGljU2hhcmVkTGliUHJvdmlkZXJBcHBSZWN1cnNpdmUvQW5kcm9pZC5tawpAQCAtMjYsNyArMjYsNyBAQAogCiBMT0NBTF9DRVJUSUZJQ0FURSA6PSBjdHMvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9jZXJ0cy9rZXlzZXRzL2N0cy1rZXlzZXQtdGVzdC1iCiAKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cyBjdHNfaW5zdGFudAogCiBMT0NBTF9QUk9HVUFSRF9FTkFCTEVEIDo9IGRpc2FibGVkCiAKQEAgLTM0LDQgKzM0LDYgQEAKIAogTE9DQUxfRVhQT1JUX1BBQ0tBR0VfUkVTT1VSQ0VTIDo9IHRydWUKIAorTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorCiBpbmNsdWRlICQoQlVJTERfQ1RTX1NVUFBPUlRfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvb3MvdGVzdC1hcHBzL1N0YXRpY1NoYXJlZE5hdGl2ZUxpYkNvbnN1bWVyL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL29zL3Rlc3QtYXBwcy9TdGF0aWNTaGFyZWROYXRpdmVMaWJDb25zdW1lci9BbmRyb2lkLm1rCmluZGV4IDU0ZWJkZDEuLjk1NjQxOTMgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvb3MvdGVzdC1hcHBzL1N0YXRpY1NoYXJlZE5hdGl2ZUxpYkNvbnN1bWVyL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9vcy90ZXN0LWFwcHMvU3RhdGljU2hhcmVkTmF0aXZlTGliQ29uc3VtZXIvQW5kcm9pZC5tawpAQCAtMjMsMTUgKzIzLDE2IEBACiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCi0gICAgYW5kcm9pZC1zdXBwb3J0LXRlc3QKKyAgICBhbmRyb2lkeC50ZXN0LnJ1bGVzCiAKIExPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTIDo9IGxpYnN0YXRpY3NoYXJlZG5hdGl2ZWxpYmNvbnN1bWVyam5pCiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNTdGF0aWNTaGFyZWROYXRpdmVMaWJDb25zdW1lcgorTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAogCiBMT0NBTF9NVUxUSUxJQiA6PSBib3RoCiAKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cyBjdHNfaW5zdGFudAogCiBpbmNsdWRlICQoQlVJTERfQ1RTX1NVUFBPUlRfUEFDS0FHRSkKIApAQCAtNTIsNyArNTMsOCBAQAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJsb2cgXAogICAgIGxpYnN0YXRpY3NoYXJlZG5hdGl2ZWxpYnByb3ZpZGVyCiAKLUxPQ0FMX0NYWF9TVEwgOj0gbm9uZQorTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorTE9DQUxfTkRLX1NUTF9WQVJJQU5UIDo9IG5vbmUKIAogTE9DQUxfQ19JTkNMVURFUyArPSBcCiAgICAgJChKTklfSF9JTkNMVURFKSBcCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL29zL3Rlc3QtYXBwcy9TdGF0aWNTaGFyZWROYXRpdmVMaWJDb25zdW1lci9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9vcy90ZXN0LWFwcHMvU3RhdGljU2hhcmVkTmF0aXZlTGliQ29uc3VtZXIvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCAzNGMwNDAzLi5hY2ZmZmJhIDEwMDc1NQotLS0gYS9ob3N0c2lkZXRlc3RzL29zL3Rlc3QtYXBwcy9TdGF0aWNTaGFyZWROYXRpdmVMaWJDb25zdW1lci9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvb3MvdGVzdC1hcHBzL1N0YXRpY1NoYXJlZE5hdGl2ZUxpYkNvbnN1bWVyL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTMwLDcgKzMwLDcgQEAKICAgICAgICAgPC91c2VzLXN0YXRpYy1saWJyYXJ5PgogICAgIDwvYXBwbGljYXRpb24+CiAKLSAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLm9zLmxpYi5jb25zdW1lciIvPgogCiA8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9vcy90ZXN0LWFwcHMvU3RhdGljU2hhcmVkTmF0aXZlTGliQ29uc3VtZXIvam5pL3ZlcnNpb24uY3BwIGIvaG9zdHNpZGV0ZXN0cy9vcy90ZXN0LWFwcHMvU3RhdGljU2hhcmVkTmF0aXZlTGliQ29uc3VtZXIvam5pL3ZlcnNpb24uY3BwCmluZGV4IDU2ODM1YTAuLjdiYjE3NjkgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvb3MvdGVzdC1hcHBzL1N0YXRpY1NoYXJlZE5hdGl2ZUxpYkNvbnN1bWVyL2puaS92ZXJzaW9uLmNwcAorKysgYi9ob3N0c2lkZXRlc3RzL29zL3Rlc3QtYXBwcy9TdGF0aWNTaGFyZWROYXRpdmVMaWJDb25zdW1lci9qbmkvdmVyc2lvbi5jcHAKQEAgLTE2LDcgKzE2LDExIEBACiAKICNpbmNsdWRlICJqbmkuaCIKIAotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbG9nLmg+CisKKyNkZWZpbmUgQUxPRyhwcmlvcml0eSwgdGFnLCAuLi4pICgodm9pZClfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfIyNwcmlvcml0eSwgdGFnLCBfX1ZBX0FSR1NfXykpCisKKyNkZWZpbmUgQUxPR0UoLi4uKSBBTE9HKExPR19FUlJPUiwgTlVMTCwgX19WQV9BUkdTX18pCiAKICNpbmNsdWRlICIuLi8uLi9TdGF0aWNTaGFyZWROYXRpdmVMaWJQcm92aWRlci9uYXRpdmUvdmVyc2lvbi5oIgogCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL29zL3Rlc3QtYXBwcy9TdGF0aWNTaGFyZWROYXRpdmVMaWJDb25zdW1lci9zcmMvYW5kcm9pZC9vcy9saWIvY29uc3VtZXIvVXNlU2hhcmVkTGlicmFyeVRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvb3MvdGVzdC1hcHBzL1N0YXRpY1NoYXJlZE5hdGl2ZUxpYkNvbnN1bWVyL3NyYy9hbmRyb2lkL29zL2xpYi9jb25zdW1lci9Vc2VTaGFyZWRMaWJyYXJ5VGVzdC5qYXZhCmluZGV4IDIwYTNkMzAuLjE5Y2M5NTQgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvb3MvdGVzdC1hcHBzL1N0YXRpY1NoYXJlZE5hdGl2ZUxpYkNvbnN1bWVyL3NyYy9hbmRyb2lkL29zL2xpYi9jb25zdW1lci9Vc2VTaGFyZWRMaWJyYXJ5VGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvb3MvdGVzdC1hcHBzL1N0YXRpY1NoYXJlZE5hdGl2ZUxpYkNvbnN1bWVyL3NyYy9hbmRyb2lkL29zL2xpYi9jb25zdW1lci9Vc2VTaGFyZWRMaWJyYXJ5VGVzdC5qYXZhCkBAIC0xOCw3ICsxOCw4IEBACiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRTYW1lOwogCi1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9vcy90ZXN0LWFwcHMvU3RhdGljU2hhcmVkTmF0aXZlTGliUHJvdmlkZXIvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvb3MvdGVzdC1hcHBzL1N0YXRpY1NoYXJlZE5hdGl2ZUxpYlByb3ZpZGVyL0FuZHJvaWQubWsKaW5kZXggM2Q0OGFmMi4uNjU1YWRlYSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9vcy90ZXN0LWFwcHMvU3RhdGljU2hhcmVkTmF0aXZlTGliUHJvdmlkZXIvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL29zL3Rlc3QtYXBwcy9TdGF0aWNTaGFyZWROYXRpdmVMaWJQcm92aWRlci9BbmRyb2lkLm1rCkBAIC0yMyw4ICsyMyw5IEBACiBMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJzdGF0aWNzaGFyZWRuYXRpdmVsaWJwcm92aWRlcgogCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzU3RhdGljU2hhcmVkTmF0aXZlTGliUHJvdmlkZXIKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKIAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzIGN0c19pbnN0YW50CiAKIExPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKIApAQCAtNTQsOCArNTUsMTAgQEAKIAogTE9DQUxfTU9EVUxFIDo9IGxpYnN0YXRpY3NoYXJlZG5hdGl2ZWxpYnByb3ZpZGVyCiAKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKKwogTE9DQUxfQ19JTkNMVURFUyA6PSAkKExPQ0FMX1BBVEgpL25hdGl2ZS92ZXJzaW9uLmgKIAotTE9DQUxfQ1hYX1NUTCA6PSBub25lCitMT0NBTF9OREtfU1RMX1ZBUklBTlQgOj0gbm9uZQogCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL29zL3Rlc3QtYXBwcy9TdGF0aWNTaGFyZWROYXRpdmVMaWJQcm92aWRlcjEvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvb3MvdGVzdC1hcHBzL1N0YXRpY1NoYXJlZE5hdGl2ZUxpYlByb3ZpZGVyMS9BbmRyb2lkLm1rCmluZGV4IGZlZTM4YTcuLmIyNjkzOWEgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvb3MvdGVzdC1hcHBzL1N0YXRpY1NoYXJlZE5hdGl2ZUxpYlByb3ZpZGVyMS9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvb3MvdGVzdC1hcHBzL1N0YXRpY1NoYXJlZE5hdGl2ZUxpYlByb3ZpZGVyMS9BbmRyb2lkLm1rCkBAIC0yMyw4ICsyMyw5IEBACiBMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJzdGF0aWNzaGFyZWRuYXRpdmVsaWJwcm92aWRlcgogCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzU3RhdGljU2hhcmVkTmF0aXZlTGliUHJvdmlkZXIxCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CiAKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cyBjdHNfaW5zdGFudAogCiBMT0NBTF9QUk9HVUFSRF9FTkFCTEVEIDo9IGRpc2FibGVkCiAKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2FtcGxlL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL3NhbXBsZS9BbmRyb2lkLm1rCmluZGV4IGJjODIxYWUuLjFiOWJkNDQgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvc2FtcGxlL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9zYW1wbGUvQW5kcm9pZC5tawpAQCAtMjEsMTIgKzIxLDEyIEBACiBMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwogCiAjIHRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0Ci1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMgY3RzX2luc3RhbnQKIAogTE9DQUxfTU9EVUxFIDo9IEN0c1NhbXBsZUhvc3RUZXN0Q2FzZXMKIAogTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gY3RzLXRyYWRlZmVkIHRyYWRlZmVkIGNvbXBhdGliaWxpdHktaG9zdC11dGlsCiAKLWluY2x1ZGUgJChCVUlMRF9IT1NUX0pBVkFfTElCUkFSWSkKK2luY2x1ZGUgJChCVUlMRF9DVFNfSE9TVF9KQVZBX0xJQlJBUlkpCiAKIGluY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2FtcGxlL0FuZHJvaWRUZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvc2FtcGxlL0FuZHJvaWRUZXN0LnhtbAppbmRleCBjODc5NjliLi43Nzc0NzljIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL3NhbXBsZS9BbmRyb2lkVGVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9zYW1wbGUvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgU2FtcGxlIGhvc3QgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9Im1pc2MiIC8+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CiAgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2FtcGxlL2FwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9zYW1wbGUvYXBwL0FuZHJvaWQubWsKaW5kZXggYjNiNmFkMS4uYmMyNzFiNiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zYW1wbGUvYXBwL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9zYW1wbGUvYXBwL0FuZHJvaWQubWsKQEAgLTI4LDcgKzI4LDcgQEAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIAogIyB0YWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzIGN0c19pbnN0YW50CiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNTYW1wbGVEZXZpY2VBcHAKIApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zYW1wbGUvYXBwMi9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9zYW1wbGUvYXBwMi9BbmRyb2lkLm1rCmluZGV4IDg0NWY1MWEuLmUwNTA0MTIgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvc2FtcGxlL2FwcDIvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL3NhbXBsZS9hcHAyL0FuZHJvaWQubWsKQEAgLTI1LDE1ICsyNSwxNSBAQAogCiBMT0NBTF9QUk9HVUFSRF9FTkFCTEVEIDo9IGRpc2FibGVkCiAKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLXN1cHBvcnQtdGVzdAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWR4LnRlc3QucnVsZXMKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogCiAjIHRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0Ci1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMgY3RzX2luc3RhbnQKIAogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c1NhbXBsZURldmljZUFwcDIKIAogTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAogCi1pbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKK2luY2x1ZGUgJChCVUlMRF9DVFNfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2FtcGxlL2FwcDIvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvc2FtcGxlL2FwcDIvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA3ZDY1YzMwLi41MDAzZThjIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL3NhbXBsZS9hcHAyL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9zYW1wbGUvYXBwMi9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0xNiwxNCArMTYsMTQgQEAKICAtLT4KIAogPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBwYWNrYWdlPSJhbmRyb2lkLnNhbXBsZS5jdHMuYXBwMiI+Ci0KKyAgICAgICAgICBwYWNrYWdlPSJhbmRyb2lkLnNhbXBsZS5jdHMuYXBwMiIKKyAgICAgICAgICBhbmRyb2lkOnRhcmdldFNhbmRib3hWZXJzaW9uPSIyIj4KICAgICA8YXBwbGljYXRpb24+CiAgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgogICAgIDwvYXBwbGljYXRpb24+CiAKICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5zYW1wbGUuY3RzLmFwcDIiIC8+CiAKIDwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NhbXBsZS9hcHAyL3NyYy9hbmRyb2lkL3NhbXBsZS9jdHMvYXBwMi9TYW1wbGVEZXZpY2VUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL3NhbXBsZS9hcHAyL3NyYy9hbmRyb2lkL3NhbXBsZS9jdHMvYXBwMi9TYW1wbGVEZXZpY2VUZXN0LmphdmEKaW5kZXggODI5OWQ0Ny4uNDM1YWVhMiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zYW1wbGUvYXBwMi9zcmMvYW5kcm9pZC9zYW1wbGUvY3RzL2FwcDIvU2FtcGxlRGV2aWNlVGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvc2FtcGxlL2FwcDIvc3JjL2FuZHJvaWQvc2FtcGxlL2N0cy9hcHAyL1NhbXBsZURldmljZVRlc3QuamF2YQpAQCAtMTYsMTUgKzE2LDEzIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5zYW1wbGUuY3RzLmFwcDI7CiAKLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CiBpbXBvcnQgb3JnLmp1bml0LkFzc3VtZTsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIAotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwotCiAvKioKICAqIERldmljZS1zaWRlIHRlc3RzIGZvciBDdHNTYW1wbGVIb3N0VGVzdENhc2VzCiAgKi8KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2FtcGxlL3NyYy9hbmRyb2lkL3NhbXBsZS9jdHMvU2FtcGxlSG9zdEpVbml0NERldmljZVRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvc2FtcGxlL3NyYy9hbmRyb2lkL3NhbXBsZS9jdHMvU2FtcGxlSG9zdEpVbml0NERldmljZVRlc3QuamF2YQppbmRleCBmMzJjNTIzLi5lOGFlMWYwIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL3NhbXBsZS9zcmMvYW5kcm9pZC9zYW1wbGUvY3RzL1NhbXBsZUhvc3RKVW5pdDREZXZpY2VUZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9zYW1wbGUvc3JjL2FuZHJvaWQvc2FtcGxlL2N0cy9TYW1wbGVIb3N0SlVuaXQ0RGV2aWNlVGVzdC5qYXZhCkBAIC0xNiwxNCArMTYsMTcgQEAKIAogcGFja2FnZSBhbmRyb2lkLnNhbXBsZS5jdHM7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5Db21wYXRpYmlsaXR5SG9zdFRlc3RCYXNlOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlSW5zdGFudDsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CisKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5EZXZpY2VKVW5pdDRDbGFzc1J1bm5lcjsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5qdW5pdDQuQmFzZUhvc3RKVW5pdDRUZXN0OwogCiBpbXBvcnQgb3JnLmp1bml0LkFmdGVyOwogaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCiAvKioKICAqIFRlc3QgdGhhdCBjb2xsZWN0cyB0ZXN0IHJlc3VsdHMgZnJvbSB0ZXN0IHBhY2thZ2UgYW5kcm9pZC5zYW1wbGUuY3RzLmFwcDIuCkBAIC0zMyw4ICszNiw3IEBACiAgKiBjb2xsZWN0ZWQgZnJvbSB0aGUgaG9zdHNpZGUgYW5kIHJlcG9ydGVkIGFjY29yZGluZ2x5LgogICovCiBAUnVuV2l0aChEZXZpY2VKVW5pdDRDbGFzc1J1bm5lci5jbGFzcykKLXB1YmxpYyBjbGFzcyBTYW1wbGVIb3N0SlVuaXQ0RGV2aWNlVGVzdCBleHRlbmRzIENvbXBhdGliaWxpdHlIb3N0VGVzdEJhc2UgewotCitwdWJsaWMgY2xhc3MgU2FtcGxlSG9zdEpVbml0NERldmljZVRlc3QgZXh0ZW5kcyBCYXNlSG9zdEpVbml0NFRlc3QgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1BLRyA9ICJhbmRyb2lkLnNhbXBsZS5jdHMuYXBwMiI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQ0xBU1MgPSBURVNUX1BLRyArICIuIiArICJTYW1wbGVEZXZpY2VUZXN0IjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9BUFAgPSAiQ3RzU2FtcGxlRGV2aWNlQXBwMi5hcGsiOwpAQCAtNDUsMjcgKzQ3LDU4IEBACiAKICAgICBAQmVmb3JlCiAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaW5zdGFsbFBhY2thZ2UoVEVTVF9BUFApOworICAgICAgICB1bmluc3RhbGxQYWNrYWdlKGdldERldmljZSgpLCBURVNUX1BLRyk7CiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UnVuRGV2aWNlVGVzdHNQYXNzZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBAQXBwTW9kZUluc3RhbnQKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UnVuRGV2aWNlVGVzdHNQYXNzZXNJbnN0YW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGluc3RhbGxQYWNrYWdlKHRydWUpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShydW5EZXZpY2VUZXN0cyhURVNUX1BLRywgVEVTVF9DTEFTUywgVEVTVF9QQVNTRVMpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBBcHBNb2RlRnVsbAorICAgIHB1YmxpYyB2b2lkIHRlc3RSdW5EZXZpY2VUZXN0c1Bhc3Nlc0Z1bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW5zdGFsbFBhY2thZ2UoZmFsc2UpOwogICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShydW5EZXZpY2VUZXN0cyhURVNUX1BLRywgVEVTVF9DTEFTUywgVEVTVF9QQVNTRVMpKTsKICAgICB9CiAKICAgICBAVGVzdChleHBlY3RlZD1Bc3NlcnRpb25FcnJvci5jbGFzcykKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UnVuRGV2aWNlVGVzdHNGYWlscygpIHRocm93cyBFeGNlcHRpb24geworICAgIEBBcHBNb2RlSW5zdGFudAorICAgIHB1YmxpYyB2b2lkIHRlc3RSdW5EZXZpY2VUZXN0c0ZhaWxzSW5zdGFudCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbnN0YWxsUGFja2FnZSh0cnVlKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocnVuRGV2aWNlVGVzdHMoVEVTVF9QS0csIFRFU1RfQ0xBU1MsIFRFU1RfRkFJTFMpKTsKKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZD1Bc3NlcnRpb25FcnJvci5jbGFzcykKKyAgICBAQXBwTW9kZUZ1bGwKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UnVuRGV2aWNlVGVzdHNGYWlsc0Z1bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW5zdGFsbFBhY2thZ2UoZmFsc2UpOwogICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShydW5EZXZpY2VUZXN0cyhURVNUX1BLRywgVEVTVF9DTEFTUywgVEVTVF9GQUlMUykpOwogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFJ1bkRldmljZVRlc3RzQXNzdW1lRmFpbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBAQXBwTW9kZUluc3RhbnQKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UnVuRGV2aWNlVGVzdHNBc3N1bWVGYWlsc0luc3RhbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW5zdGFsbFBhY2thZ2UodHJ1ZSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHJ1bkRldmljZVRlc3RzKFRFU1RfUEtHLCBURVNUX0NMQVNTLCBURVNUX0FTU1VNRV9GQUlMUykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgQEFwcE1vZGVGdWxsCisgICAgcHVibGljIHZvaWQgdGVzdFJ1bkRldmljZVRlc3RzQXNzdW1lRmFpbHNGdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGluc3RhbGxQYWNrYWdlKGZhbHNlKTsKICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocnVuRGV2aWNlVGVzdHMoVEVTVF9QS0csIFRFU1RfQ0xBU1MsIFRFU1RfQVNTVU1FX0ZBSUxTKSk7CiAgICAgfQogCiAgICAgQEFmdGVyCiAgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdW5pbnN0YWxsUGFja2FnZShURVNUX1BLRyk7CisgICAgICAgIHVuaW5zdGFsbFBhY2thZ2UoZ2V0RGV2aWNlKCksIFRFU1RfUEtHKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5zdGFsbFBhY2thZ2UoYm9vbGVhbiBpbnN0YW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW5zdGFsbFBhY2thZ2UoVEVTVF9BUFAsIGluc3RhbnQgPyBuZXcgU3RyaW5nW117Ii0taW5zdGFudCJ9IDogbmV3IFN0cmluZ1swXSk7CiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlY2NvbXAvYXBwL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL3NlY2NvbXAvYXBwL0FuZHJvaWQubWsKaW5kZXggNzI2ZTY0Yi4uMzZkZDQxNyAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZWNjb21wL2FwcC9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvc2VjY29tcC9hcHAvQW5kcm9pZC5tawpAQCAtMzAsMjAgKzMwLDE4IEBACiBMT0NBTF9QUk9HVUFSRF9FTkFCTEVEIDo9IGRpc2FibGVkCiAKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCi0gICAgICAgICAgYW5kcm9pZC1zdXBwb3J0LXRlc3QgXAotICAgICAgICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwgXAorICAgICAgICAgIGFuZHJvaWR4LnRlc3QucnVsZXMgXAorICAgICAgICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0IFwKIAogTE9DQUxfSk5JX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogICAgICAgICAgIGxpYmN0c3NlY2NvbXBfam5pIFwKICAgICAgICAgICBsaWJjdHNfam5pIFwKICAgICAgICAgICBsaWJuYXRpdmVoZWxwZXJfY29tcGF0X2xpYmMrKyBcCi0gICAgICAgICAgbGlibmF0aXZlaGVscGVyIFwKLSAgICAgICAgICBsaWJjdXRpbHMgXAotICAgICAgICAgIGxpYmMrKyBcCi0gICAgICAgICAgbGlicGFja2FnZWxpc3RwYXJzZXIgXAogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKK0xPQ0FMX0FTU0VUX0RJUiA6PSAkKExPQ0FMX1BBVEgpL2Fzc2V0cworCiAjIHRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0CiBMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cwogCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlY2NvbXAvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL3NlY2NvbXAvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggYjhlOTdlMy4uOTk0MGVlYiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZWNjb21wL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvc2VjY29tcC9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjMsNyArMjMsNyBAQAogICAgIDwvYXBwbGljYXRpb24+CiAKICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5zZWNjb21wLmN0cy5hcHAiIC8+CiAKIDwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlY2NvbXAvYXBwL2Fzc2V0cy9zeXNjYWxsc19hbGxvd2VkLmpzb24gYi9ob3N0c2lkZXRlc3RzL3NlY2NvbXAvYXBwL2Fzc2V0cy9zeXNjYWxsc19hbGxvd2VkLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNjZTcyYgotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvc2VjY29tcC9hcHAvYXNzZXRzL3N5c2NhbGxzX2FsbG93ZWQuanNvbgpAQCAtMCwwICsxLDI0IEBACisjIERPIE5PVCBNT0RJRlkuICBDSEFOR0UgZ2VuX2JsYWNrbGlzdC5weSBJTlNURUFELgoreworICAiYXJtIjogeworICAgICJpbm90aWZ5X2luaXQiOiAzMTYsCisgICAgIm9wZW5hdCI6IDMyMiwKKyAgICAic3luY2ZzIjogMzczCisgIH0sCisgICJhcm02NCI6IHsKKyAgICAib3BlbmF0IjogNTYsCisgICAgInN5bmNmcyI6IDI2NworICB9LAorICAibWlwcyI6IHsKKyAgICAib3BlbmF0IjogNDI4OAorICB9LAorICAibWlwczY0IjogeworICAgICJvcGVuYXQiOiA1MjQ3CisgIH0sCisgICJ4ODYiOiB7CisgICAgIm9wZW5hdCI6IDI5NQorICB9LAorICAieDg2XzY0IjogeworICAgICJvcGVuYXQiOiAyNTcKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VjY29tcC9hcHAvYXNzZXRzL3N5c2NhbGxzX2Jsb2NrZWQuanNvbiBiL2hvc3RzaWRldGVzdHMvc2VjY29tcC9hcHAvYXNzZXRzL3N5c2NhbGxzX2Jsb2NrZWQuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDFjOGRhCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9zZWNjb21wL2FwcC9hc3NldHMvc3lzY2FsbHNfYmxvY2tlZC5qc29uCkBAIC0wLDAgKzEsMTIzIEBACisjIERPIE5PVCBNT0RJRlkuICBDSEFOR0UgZ2VuX2JsYWNrbGlzdC5weSBJTlNURUFELgoreworICAiYXJtIjogeworICAgICJhY2N0IjogNTEsCisgICAgImFkZF9rZXkiOiAzMDksCisgICAgImFkanRpbWV4IjogMTI0LAorICAgICJjaHJvb3QiOiA2MSwKKyAgICAiY2xvY2tfYWRqdGltZSI6IDM3MiwKKyAgICAiY2xvY2tfc2V0dGltZSI6IDI2MiwKKyAgICAiZGVsZXRlX21vZHVsZSI6IDEyOSwKKyAgICAiaW5pdF9tb2R1bGUiOiAxMjgsCisgICAgImtleWN0bCI6IDMxMSwKKyAgICAibW91bnQiOiAyMSwKKyAgICAicmVib290IjogODgsCisgICAgInNldGRvbWFpbm5hbWUiOiAxMjEsCisgICAgInNldGhvc3RuYW1lIjogNzQsCisgICAgInNldHRpbWVvZmRheSI6IDc5LAorICAgICJzd2Fwb2ZmIjogMTE1LAorICAgICJzd2Fwb24iOiA4NywKKyAgICAic3lzbG9nIjogMTAzLAorICAgICJ1bW91bnQyIjogNTIKKyAgfSwKKyAgImFybTY0IjogeworICAgICJhY2N0IjogODksCisgICAgImFkZF9rZXkiOiAyMTcsCisgICAgImFkanRpbWV4IjogMTcxLAorICAgICJjaHJvb3QiOiA1MSwKKyAgICAiY2xvY2tfYWRqdGltZSI6IDI2NiwKKyAgICAiY2xvY2tfc2V0dGltZSI6IDExMiwKKyAgICAiZGVsZXRlX21vZHVsZSI6IDEwNiwKKyAgICAiaW5pdF9tb2R1bGUiOiAxMDUsCisgICAgImtleWN0bCI6IDIxOSwKKyAgICAibW91bnQiOiA0MCwKKyAgICAicmVib290IjogMTQyLAorICAgICJzZXRkb21haW5uYW1lIjogMTYyLAorICAgICJzZXRob3N0bmFtZSI6IDE2MSwKKyAgICAic2V0dGltZW9mZGF5IjogMTcwLAorICAgICJzd2Fwb2ZmIjogMjI1LAorICAgICJzd2Fwb24iOiAyMjQsCisgICAgInN5c2xvZyI6IDExNiwKKyAgICAidW1vdW50MiI6IDM5CisgIH0sCisgICJtaXBzIjogeworICAgICJhY2N0IjogNDA1MSwKKyAgICAiYWRkX2tleSI6IDQyODAsCisgICAgImFkanRpbWV4IjogNDEyNCwKKyAgICAiY2hyb290IjogNDA2MSwKKyAgICAiY2xvY2tfYWRqdGltZSI6IDQzNDEsCisgICAgImNsb2NrX3NldHRpbWUiOiA0MjYyLAorICAgICJkZWxldGVfbW9kdWxlIjogNDEyOSwKKyAgICAiaW5pdF9tb2R1bGUiOiA0MTI4LAorICAgICJrZXljdGwiOiA0MjgyLAorICAgICJtb3VudCI6IDQwMjEsCisgICAgInJlYm9vdCI6IDQwODgsCisgICAgInNldGRvbWFpbm5hbWUiOiA0MTIxLAorICAgICJzZXRob3N0bmFtZSI6IDQwNzQsCisgICAgInNldHRpbWVvZmRheSI6IDQwNzksCisgICAgInN3YXBvZmYiOiA0MTE1LAorICAgICJzd2Fwb24iOiA0MDg3LAorICAgICJzeXNsb2ciOiA0MTAzLAorICAgICJ1bW91bnQyIjogNDA1MgorICB9LAorICAibWlwczY0IjogeworICAgICJhY2N0IjogNTE1OCwKKyAgICAiYWRkX2tleSI6IDUyMzksCisgICAgImFkanRpbWV4IjogNTE1NCwKKyAgICAiY2hyb290IjogNTE1NiwKKyAgICAiY2xvY2tfYWRqdGltZSI6IDUzMDAsCisgICAgImNsb2NrX3NldHRpbWUiOiA1MjIxLAorICAgICJkZWxldGVfbW9kdWxlIjogNTE2OSwKKyAgICAiaW5pdF9tb2R1bGUiOiA1MTY4LAorICAgICJrZXljdGwiOiA1MjQxLAorICAgICJtb3VudCI6IDUxNjAsCisgICAgInJlYm9vdCI6IDUxNjQsCisgICAgInNldGRvbWFpbm5hbWUiOiA1MTY2LAorICAgICJzZXRob3N0bmFtZSI6IDUxNjUsCisgICAgInNldHRpbWVvZmRheSI6IDUxNTksCisgICAgInN3YXBvZmYiOiA1MTYzLAorICAgICJzd2Fwb24iOiA1MTYyLAorICAgICJzeXNsb2ciOiA1MTAxLAorICAgICJ1bW91bnQyIjogNTE2MQorICB9LAorICAieDg2IjogeworICAgICJhY2N0IjogNTEsCisgICAgImFkZF9rZXkiOiAyODYsCisgICAgImFkanRpbWV4IjogMTI0LAorICAgICJjaHJvb3QiOiA2MSwKKyAgICAiY2xvY2tfYWRqdGltZSI6IDM0MywKKyAgICAiY2xvY2tfc2V0dGltZSI6IDI2NCwKKyAgICAiZGVsZXRlX21vZHVsZSI6IDEyOSwKKyAgICAiaW5pdF9tb2R1bGUiOiAxMjgsCisgICAgImtleWN0bCI6IDI4OCwKKyAgICAibW91bnQiOiAyMSwKKyAgICAicmVib290IjogODgsCisgICAgInNldGRvbWFpbm5hbWUiOiAxMjEsCisgICAgInNldGhvc3RuYW1lIjogNzQsCisgICAgInNldHRpbWVvZmRheSI6IDc5LAorICAgICJzd2Fwb2ZmIjogMTE1LAorICAgICJzd2Fwb24iOiA4NywKKyAgICAic3lzbG9nIjogMTAzLAorICAgICJ1bW91bnQyIjogNTIKKyAgfSwKKyAgIng4Nl82NCI6IHsKKyAgICAiYWNjdCI6IDE2MywKKyAgICAiYWRkX2tleSI6IDI0OCwKKyAgICAiYWRqdGltZXgiOiAxNTksCisgICAgImNocm9vdCI6IDE2MSwKKyAgICAiY2xvY2tfYWRqdGltZSI6IDMwNSwKKyAgICAiY2xvY2tfc2V0dGltZSI6IDIyNywKKyAgICAiZGVsZXRlX21vZHVsZSI6IDE3NiwKKyAgICAiaW5pdF9tb2R1bGUiOiAxNzUsCisgICAgImtleWN0bCI6IDI1MCwKKyAgICAibW91bnQiOiAxNjUsCisgICAgInJlYm9vdCI6IDE2OSwKKyAgICAic2V0ZG9tYWlubmFtZSI6IDE3MSwKKyAgICAic2V0aG9zdG5hbWUiOiAxNzAsCisgICAgInNldHRpbWVvZmRheSI6IDE2NCwKKyAgICAic3dhcG9mZiI6IDE2OCwKKyAgICAic3dhcG9uIjogMTY3LAorICAgICJzeXNsb2ciOiAxMDMsCisgICAgInVtb3VudDIiOiAxNjYKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VjY29tcC9hcHAvZ2VuX2JsYWNrbGlzdC5weSBiL2hvc3RzaWRldGVzdHMvc2VjY29tcC9hcHAvZ2VuX2JsYWNrbGlzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jZjM2ZDExCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9zZWNjb21wL2FwcC9nZW5fYmxhY2tsaXN0LnB5CkBAIC0wLDAgKzEsMTc1IEBACisjIS91c3IvYmluL2VudiBweXRob24zCisjCisjIFRoaXMgc2NyaXB0IGdlbmVyYXRlcyBzeXNjYWxsIG5hbWUgdG8gbnVtYmVyIG1hcHBpbmcgZm9yIHN1cHBvcnRlZAorIyBhcmNoaXRlY3R1cmVzLiAgVG8gdXBkYXRlIHRoZSBvdXRwdXQsIHJ1bnM6CisjCisjICAkIGFwcC9nZW5fYmxhY2tsaXN0LnB5IC0tYWxsb3dlZCBhcHAvYXNzZXRzL3N5c2NhbGxzX2FsbG93ZWQuanNvbiBcCisjICAgICAgLS1ibG9ja2VkIGFwcC9hc3NldHMvc3lzY2FsbHNfYmxvY2tlZC5qc29uCisjCisjIE5vdGUgdGhhdCB0aGVzZSBhcmUganVzdCBzeXNjYWxscyB0aGF0IGV4cGxpY2l0bHkgYWxsb3dlZCBhbmQgYmxvY2tlZCBpbiBDVFMKKyMgY3VycmVudGx5LgorIworIyBUT0RPOiBDb25zaWRlciBnZW5lcmF0aW5nIGl0IGluIEFuZHJvaWQubWsvYnAuCisKK2ltcG9ydCBhcmdwYXJzZQoraW1wb3J0IGdsb2IKK2ltcG9ydCBqc29uCitpbXBvcnQgb3MKK2ltcG9ydCBzdWJwcm9jZXNzCisKK19TVVBQT1JURURfQVJDSFMgPSBbJ2FybScsICdhcm02NCcsICd4ODYnLCAneDg2XzY0JywgJ21pcHMnLCAnbWlwczY0J10KKworIyBTeXNjYWxscyB0aGF0IGFyZSBjdXJyZW50bHkgZXhwbGljaXRseSBhbGxvd2VkIGluIENUUworX1NZU0NBTExTX0FMTE9XRURfSU5fQ1RTID0geworICAgICdvcGVuYXQnOiAnYWxsJywKKworICAgICMgYi8zNTAzNDc0MyAtIGRvIG5vdCByZW1vdmUgdGVzdCB3aXRob3V0IHJlYWRpbmcgYnVnLgorICAgICdzeW5jZnMnOiAnYXJtNjQnLAorCisgICAgIyBiLzM1OTA2ODc1IC0gZG8gbm90IHJlbW92ZSB0ZXN0IHdpdGhvdXQgcmVhZGluZyBidWcKKyAgICAnaW5vdGlmeV9pbml0JzogJ2FybScsCit9CisKKyMgU3lzY2FsbHMgdGhhdCBhcmUgY3VycmVudGx5IGV4cGxpY2l0bHkgYmxvY2tlZCBpbiBDVFMKK19TWVNDQUxMU19CTE9DS0VEX0lOX0NUUyA9IHsKKyAgICAnYWNjdCc6ICdhbGwnLAorICAgICdhZGRfa2V5JzogJ2FsbCcsCisgICAgJ2FkanRpbWV4JzogJ2FsbCcsCisgICAgJ2Nocm9vdCc6ICdhbGwnLAorICAgICdjbG9ja19hZGp0aW1lJzogJ2FsbCcsCisgICAgJ2Nsb2NrX3NldHRpbWUnOiAnYWxsJywKKyAgICAnZGVsZXRlX21vZHVsZSc6ICdhbGwnLAorICAgICdpbml0X21vZHVsZSc6ICdhbGwnLAorICAgICdrZXljdGwnOiAnYWxsJywKKyAgICAnbW91bnQnOiAnYWxsJywKKyAgICAncmVib290JzogJ2FsbCcsCisgICAgJ3NldGRvbWFpbm5hbWUnOiAnYWxsJywKKyAgICAnc2V0aG9zdG5hbWUnOiAnYWxsJywKKyAgICAnc2V0dGltZW9mZGF5JzogJ2FsbCcsCisgICAgJ3N3YXBvZmYnOiAnYWxsJywKKyAgICAnc3dhcG9mZic6ICdhbGwnLAorICAgICdzd2Fwb24nOiAnYWxsJywKKyAgICAnc3dhcG9uJzogJ2FsbCcsCisgICAgJ3N5c2xvZyc6ICdhbGwnLAorICAgICd1bW91bnQyJzogJ2FsbCcsCit9CisKK2RlZiBjcmVhdGVfc3lzY2FsbF9uYW1lX3RvX251bWJlcl9tYXAoYXJjaCwgbmFtZXMpOgorICBhcmNoX2NvbmZpZyA9IHsKKyAgICAgICdhcm0nOiB7CisgICAgICAgICAgJ3VhcGlfY2xhc3MnOiAnYXNtLWFybScsCisgICAgICAgICAgJ2V4dHJhX2NmbGFncyc6IFtdLAorICAgICAgfSwKKyAgICAgICdhcm02NCc6IHsKKyAgICAgICAgICAndWFwaV9jbGFzcyc6ICdhc20tYXJtNjQnLAorICAgICAgICAgICdleHRyYV9jZmxhZ3MnOiBbXSwKKyAgICAgIH0sCisgICAgICAneDg2JzogeworICAgICAgICAgICd1YXBpX2NsYXNzJzogJ2FzbS14ODYnLAorICAgICAgICAgICdleHRyYV9jZmxhZ3MnOiBbJy1EX19pMzg2X18nXSwKKyAgICAgIH0sCisgICAgICAneDg2XzY0JzogeworICAgICAgICAgICd1YXBpX2NsYXNzJzogJ2FzbS14ODYnLAorICAgICAgICAgICdleHRyYV9jZmxhZ3MnOiBbXSwKKyAgICAgIH0sCisgICAgICAnbWlwcyc6IHsKKyAgICAgICAgICAndWFwaV9jbGFzcyc6ICdhc20tbWlwcycsCisgICAgICAgICAgJ2V4dHJhX2NmbGFncyc6IFsnLURfTUlQU19TSU09X01JUFNfU0lNX0FCSTMyJ10sCisgICAgICB9LAorICAgICAgJ21pcHM2NCc6IHsKKyAgICAgICAgICAndWFwaV9jbGFzcyc6ICdhc20tbWlwcycsCisgICAgICAgICAgJ2V4dHJhX2NmbGFncyc6IFsnLURfTUlQU19TSU09X01JUFNfU0lNX0FCSTY0J10sCisgICAgICB9CisgIH0KKworICAjIFJ1biBwcmVwcm9jZXNzb3Igb3ZlciB0aGUgX19OUl9zeXNjYWxsIHN5bWJvbHMsIGluY2x1ZGluZyB1bmlzdGQuaCwKKyAgIyB0byBnZXQgdGhlIGFjdHVhbCBudW1iZXJzCisgICMgVE9ETzogVGhlIGZvbGxvd2luZyBjb2RlIGlzIGZvcmtlZCBmcm9tIGJpb25pYy9saWJjL3Rvb2xzL2dlbnNlY2NvbXAucHkuCisgICMgRmlndXJlIG91dCBpZiB3ZSBjYW4gZGUtZHVwbGljYXRlIHRoZW0gY3Jvc3NpbmcgY3RzIHByb2plY3QgYm91bmRhcnkuCisgIHByZWZpeCA9ICdfX1NFQ0NPTVBfJyAgIyBwcmVmaXggdG8gZW5zdXJlIG5vIG5hbWUgY29sbGlzaW9ucworICBrZXJuZWxfdWFwaV9wYXRoID0gb3MucGF0aC5qb2luKG9zLmdldGVudignQU5EUk9JRF9CVUlMRF9UT1AnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmlvbmljL2xpYmMva2VybmVsL3VhcGknKQorICBjcHAgPSBzdWJwcm9jZXNzLlBvcGVuKAorICAgICAgW2dldF9sYXRlc3RfY2xhbmdfcGF0aCgpLAorICAgICAgICctRScsICctbm9zdGRpbmMnLAorICAgICAgICctSScgKyBvcy5wYXRoLmpvaW4oa2VybmVsX3VhcGlfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyY2hfY29uZmlnW2FyY2hdWyd1YXBpX2NsYXNzJ10pLAorICAgICAgICctSScgKyBvcy5wYXRoLmpvaW4oa2VybmVsX3VhcGlfcGF0aCkKKyAgICAgICBdCisgICAgICArIGFyY2hfY29uZmlnW2FyY2hdWydleHRyYV9jZmxhZ3MnXQorICAgICAgKyBbJy0nXSwKKyAgICAgIHVuaXZlcnNhbF9uZXdsaW5lcz1UcnVlLAorICAgICAgc3RkaW49c3VicHJvY2Vzcy5QSVBFLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFKQorICBjcHAuc3RkaW4ud3JpdGUoJyNpbmNsdWRlIDxhc20vdW5pc3RkLmg+XG4nKQorICBmb3IgbmFtZSBpbiBuYW1lczoKKyAgICAjIEluIFNZU0NBTExTLlRYVCwgdGhlcmUgYXJlIHR3byBhcm0tc3BlY2lmaWMgc3lzY2FsbHMgd2hvc2UgbmFtZXMgc3RhcnQKKyAgICAjIHdpdGggX19BUk1fX05SXy4gVGhlc2Ugd2UgbXVzdCBzaW1wbHkgd3JpdGUgb3V0IGFzIGlzLgorICAgIGlmIG5vdCBuYW1lLnN0YXJ0c3dpdGgoJ19fQVJNX05SXycpOgorICAgICAgY3BwLnN0ZGluLndyaXRlKHByZWZpeCArIG5hbWUgKyAnLCBfX05SXycgKyBuYW1lICsgJ1xuJykKKyAgICBlbHNlOgorICAgICAgY3BwLnN0ZGluLndyaXRlKHByZWZpeCArIG5hbWUgKyAnLCAnICsgbmFtZSArICdcbicpCisgIGNvbnRlbnQgPSBjcHAuY29tbXVuaWNhdGUoKVswXS5zcGxpdCgnXG4nKQorCisgICMgVGhlIGlucHV0IGlzIG5vdyB0aGUgcHJlcHJvY2Vzc2VkIHNvdXJjZSBmaWxlLiBUaGlzIHdpbGwgY29udGFpbiBhIGxvdAorICAjIG9mIGp1bmsgZnJvbSB0aGUgcHJlcHJvY2Vzc29yLCBidXQgb3VyIGxpbmVzIHdpbGwgYmUgaW4gdGhlIGZvcm1hdDoKKyAgIworICAjICAgICBfX1NFQ0NPTVBfJHtOQU1FfSwgKDAgKyB2YWx1ZSkKKyAgc3lzY2FsbHMgPSB7fQorICBmb3IgbGluZSBpbiBjb250ZW50OgorICAgIGlmIG5vdCBsaW5lLnN0YXJ0c3dpdGgocHJlZml4KToKKyAgICAgIGNvbnRpbnVlCisgICAgIyBXZSBtaWdodCBwaWNrIHVwIGV4dHJhIHdoaXRlc3BhY2UgZHVyaW5nIHByZXByb2Nlc3NpbmcsIHNvIGJlc3QgdG8gc3RyaXAuCisgICAgbmFtZSwgdmFsdWUgPSBbdy5zdHJpcCgpIGZvciB3IGluIGxpbmUuc3BsaXQoJywnKV0KKyAgICBuYW1lID0gbmFtZVtsZW4ocHJlZml4KTpdCisgICAgIyBOb3RlIHRoYXQgc29tZSBvZiB0aGUgbnVtYmVycyB3ZXJlIGV4cHJlc3NlZCBhcyBiYXNlICsgb2Zmc2V0LCBzbyB3ZQorICAgICMgbmVlZCB0byBldmFsLCBub3QganVzdCBpbnQKKyAgICB2YWx1ZSA9IGV2YWwodmFsdWUpCisgICAgaWYgbmFtZSBpbiBzeXNjYWxsczoKKyAgICAgIHJhaXNlIEV4Y2VwdGlvbignc3lzY2FsbCAlcyBpcyByZS1kZWZpbmVkJyAlIG5hbWUpCisgICAgc3lzY2FsbHNbbmFtZV0gPSB2YWx1ZQorICByZXR1cm4gc3lzY2FsbHMKKworZGVmIGdldF9sYXRlc3RfY2xhbmdfcGF0aCgpOgorICBjYW5kaWRhdGVzID0gc29ydGVkKGdsb2IuZ2xvYihvcy5wYXRoLmpvaW4ob3MuZ2V0ZW52KCdBTkRST0lEX0JVSUxEX1RPUCcpLAorICAgICAgJ3ByZWJ1aWx0cy9jbGFuZy9ob3N0L2xpbnV4LXg4Ni9jbGFuZy0qJykpLCByZXZlcnNlPVRydWUpCisgIGZvciBjbGFuZ19kaXIgaW4gY2FuZGlkYXRlczoKKyAgICBjbGFuZ19leGUgPSBvcy5wYXRoLmpvaW4oY2xhbmdfZGlyLCAnYmluL2NsYW5nJykKKyAgICBpZiBvcy5wYXRoLmV4aXN0cyhjbGFuZ19leGUpOgorICAgICAgcmV0dXJuIGNsYW5nX2V4ZQorICByYWlzZSBGaWxlTm90Rm91bmRFcnJvcignQ2Fubm90IGxvY2F0ZSBjbGFuZyBleGVjdXRhYmxlJykKKworZGVmIGNvbGxlY3Rfc3lzY2FsbF9uYW1lc19mb3JfYXJjaChzeXNjYWxsX21hcCwgYXJjaCk6CisgIHN5c2NhbGxfbmFtZXMgPSBbXQorICBmb3Igc3lzY2FsbCBpbiBzeXNjYWxsX21hcC5rZXlzKCk6CisgICAgaWYgKGFyY2ggaW4gc3lzY2FsbF9tYXBbc3lzY2FsbF0gb3IKKyAgICAgICAgJ2FsbCcgPT0gc3lzY2FsbF9tYXBbc3lzY2FsbF0pOgorICAgICAgc3lzY2FsbF9uYW1lcy5hcHBlbmQoc3lzY2FsbCkKKyAgcmV0dXJuIHN5c2NhbGxfbmFtZXMKKworZGVmIG1haW4oKToKKyAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoJ3N5c2NhbGwgbmFtZSB0byBudW1iZXIgZ2VuZXJhdG9yJykKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1hbGxvd2VkJywgbWV0YXZhcj0ncGF0aC90by9qc29uJywgdHlwZT1zdHIpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tYmxvY2tlZCcsIG1ldGF2YXI9J3BhdGgvdG8vanNvbicsIHR5cGU9c3RyKQorICBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQorCisgIGFsbG93ZWQgPSB7fQorICBibG9ja2VkID0ge30KKyAgZm9yIGFyY2ggaW4gX1NVUFBPUlRFRF9BUkNIUzoKKyAgICBibG9ja2VkW2FyY2hdID0gY3JlYXRlX3N5c2NhbGxfbmFtZV90b19udW1iZXJfbWFwKAorICAgICAgICBhcmNoLAorICAgICAgICBjb2xsZWN0X3N5c2NhbGxfbmFtZXNfZm9yX2FyY2goX1NZU0NBTExTX0JMT0NLRURfSU5fQ1RTLCBhcmNoKSkKKyAgICBhbGxvd2VkW2FyY2hdID0gY3JlYXRlX3N5c2NhbGxfbmFtZV90b19udW1iZXJfbWFwKAorICAgICAgICBhcmNoLAorICAgICAgICBjb2xsZWN0X3N5c2NhbGxfbmFtZXNfZm9yX2FyY2goX1NZU0NBTExTX0FMTE9XRURfSU5fQ1RTLCBhcmNoKSkKKworICBtc2dfZG9fbm90X21vZGlmeSA9ICcjIERPIE5PVCBNT0RJRlkuICBDSEFOR0UgZ2VuX2JsYWNrbGlzdC5weSBJTlNURUFELicKKyAgd2l0aCBvcGVuKGFyZ3MuYWxsb3dlZCwgJ3cnKSBhcyBmOgorICAgIHByaW50KG1zZ19kb19ub3RfbW9kaWZ5LCBmaWxlPWYpCisgICAganNvbi5kdW1wKGFsbG93ZWQsIGYsIHNvcnRfa2V5cz1UcnVlLCBpbmRlbnQ9MikKKworICB3aXRoIG9wZW4oYXJncy5ibG9ja2VkLCAndycpIGFzIGY6CisgICAgcHJpbnQobXNnX2RvX25vdF9tb2RpZnksIGZpbGU9ZikKKyAgICBqc29uLmR1bXAoYmxvY2tlZCwgZiwgc29ydF9rZXlzPVRydWUsIGluZGVudD0yKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICBtYWluKCkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VjY29tcC9hcHAvam5pL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL3NlY2NvbXAvYXBwL2puaS9BbmRyb2lkLm1rCmluZGV4IGEwNjA0YTEuLjQ1ZmIxMzUgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvc2VjY29tcC9hcHAvam5pL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9zZWNjb21wL2FwcC9qbmkvQW5kcm9pZC5tawpAQCAtMjUsMTQgKzI1LDggQEAKIAkJQ3RzU2VjY29tcEpuaU9uTG9hZC5jcHAgXAogCQlhbmRyb2lkX3NlY2NvbXBfY3RzX2FwcF9TZWNjb21wRGV2aWNlVGVzdC5jcHAgXAogCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLQkJbGlibmF0aXZlaGVscGVyIFwKLQkJbGlibG9nIFwKLQkJbGliY3V0aWxzIFwKLQkJbGliYysrIFwKLQkJbGlicGFja2FnZWxpc3RwYXJzZXIgXAotCi0KK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKK0xPQ0FMX0xETElCUyA6PSAtbGxvZwogTE9DQUxfQ19JTkNMVURFUyArPSBuZGsvc291cmNlcy9jcHVmZWF0dXJlcwogTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBjcHVmZWF0dXJlcwogCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlY2NvbXAvYXBwL2puaS9hbmRyb2lkX3NlY2NvbXBfY3RzX2FwcF9TZWNjb21wRGV2aWNlVGVzdC5jcHAgYi9ob3N0c2lkZXRlc3RzL3NlY2NvbXAvYXBwL2puaS9hbmRyb2lkX3NlY2NvbXBfY3RzX2FwcF9TZWNjb21wRGV2aWNlVGVzdC5jcHAKaW5kZXggZGU4MmI0NC4uMjI1NzIzMiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZWNjb21wL2FwcC9qbmkvYW5kcm9pZF9zZWNjb21wX2N0c19hcHBfU2VjY29tcERldmljZVRlc3QuY3BwCisrKyBiL2hvc3RzaWRldGVzdHMvc2VjY29tcC9hcHAvam5pL2FuZHJvaWRfc2VjY29tcF9jdHNfYXBwX1NlY2NvbXBEZXZpY2VUZXN0LmNwcApAQCAtMTgsMTEgKzE4LDE2IEBACiAKICNkZWZpbmUgTE9HX1RBRyAiU2VjY29tcFRlc3QiCiAKLSNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9sb2cuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvd2FpdC5oPgogCisjZGVmaW5lIEFMT0cocHJpb3JpdHksIHRhZywgLi4uKSAoKHZvaWQpX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEXyMjcHJpb3JpdHksIHRhZywgX19WQV9BUkdTX18pKQorCisjZGVmaW5lIEFMT0dJKC4uLikgQUxPRyhMT0dfSU5GTywgTE9HX1RBRywgX19WQV9BUkdTX18pCisjZGVmaW5lIEFMT0dFKC4uLikgQUxPRyhMT0dfRVJST1IsIExPR19UQUcsIF9fVkFfQVJHU19fKQorCiAvKgogICogRnVuY3Rpb246IHRlc3RTeXNjYWxsQmxvY2tlZAogICogUHVycG9zZTogdGVzdCB0aGF0IHRoZSBzeXNjYWxsIGxpc3RlZCBpcyBibG9ja2VkIGJ5IHNlY2NvbXAKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VjY29tcC9hcHAvc3JjL2FuZHJvaWQvc2VjY29tcC9jdHMvYXBwL1NlY2NvbXBEZXZpY2VUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL3NlY2NvbXAvYXBwL3NyYy9hbmRyb2lkL3NlY2NvbXAvY3RzL2FwcC9TZWNjb21wRGV2aWNlVGVzdC5qYXZhCmluZGV4IDJhN2JjYjMuLjZjYjhiNTMgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvc2VjY29tcC9hcHAvc3JjL2FuZHJvaWQvc2VjY29tcC9jdHMvYXBwL1NlY2NvbXBEZXZpY2VUZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9zZWNjb21wL2FwcC9zcmMvYW5kcm9pZC9zZWNjb21wL2N0cy9hcHAvU2VjY29tcERldmljZVRlc3QuamF2YQpAQCAtMTYsMTUgKzE2LDI0IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5zZWNjb21wLmN0cy5hcHA7CiAKLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldE1hbmFnZXI7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNwdUZlYXR1cmVzOworCitpbXBvcnQgb3JnLmpzb24uSlNPTkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuanNvbi5KU09OT2JqZWN0OwogaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmp1bml0LkFzc3VtZTsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIAotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ3B1RmVhdHVyZXM7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIAogLyoqCiAgKiBEZXZpY2Utc2lkZSB0ZXN0cyBmb3IgQ3RzU2VjY29tcEhvc3RUZXN0Q2FzZXMKQEAgLTM1LDY4ICs0NCw3MyBAQAogICAgICAgICBTeXN0ZW0ubG9hZExpYnJhcnkoImN0c3NlY2NvbXBfam5pIik7CiAgICAgfQogCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q1RTU3lzY2FsbEJsb2NrZWQoKSB7Ci0gICAgICAgIGlmIChDcHVGZWF0dXJlcy5pc0FybTY0Q3B1KCkpIHsKLSAgICAgICAgICAgIHRlc3RCbG9ja2VkKDIxNyk7IC8vIF9fTlJfYWRkX2tleQotICAgICAgICAgICAgdGVzdEJsb2NrZWQoMjE5KTsgLy8gX19OUl9rZXljdGwKLSAgICAgICAgICAgIHRlc3RBbGxvd2VkKDU2KTsgLy8gX19OUl9vcGVuYXQKKyAgICBwcml2YXRlIEpTT05PYmplY3QgbUFsbG93ZWRTeXNjYWxsTWFwOworICAgIHByaXZhdGUgSlNPTk9iamVjdCBtQmxvY2tlZFN5c2NhbGxNYXA7CiAKLSAgICAgICAgICAgIC8vIGIvMzUwMzQ3NDMgLSBkbyBub3QgcmVtb3ZlIHRlc3Qgd2l0aG91dCByZWFkaW5nIGJ1ZwotICAgICAgICAgICAgdGVzdEFsbG93ZWQoMjY3KTsgLy8gX19OUl9mc3RhdGZzNjQKLSAgICAgICAgfSBlbHNlIGlmIChDcHVGZWF0dXJlcy5pc0FybUNwdSgpKSB7Ci0gICAgICAgICAgICB0ZXN0QmxvY2tlZCgzMDkpOyAvLyBfX05SX2FkZF9rZXkKLSAgICAgICAgICAgIHRlc3RCbG9ja2VkKDMxMSk7IC8vIF9fTlJfa2V5Y3RsCi0gICAgICAgICAgICB0ZXN0QWxsb3dlZCgzMjIpOyAvLyBfX05SX29wZW5hdAotCi0gICAgICAgICAgICAvLyBiLzM1OTA2ODc1IC0gZG8gbm90IHJlbW92ZSB0ZXN0IHdpdGhvdXQgcmVhZGluZyBidWcKLSAgICAgICAgICAgIHRlc3RBbGxvd2VkKDMxNik7IC8vIF9fTlJfaW5vdGlmeV9pbml0Ci0gICAgICAgIH0gZWxzZSBpZiAoQ3B1RmVhdHVyZXMuaXNYODZfNjRDcHUoKSkgewotICAgICAgICAgICAgdGVzdEJsb2NrZWQoMjQ4KTsgLy8gX19OUl9hZGRfa2V5Ci0gICAgICAgICAgICB0ZXN0QmxvY2tlZCgyNTApOyAvLyBfX05SX2tleWN0bAotICAgICAgICAgICAgdGVzdEFsbG93ZWQoMjU3KTsgLy8gX19OUl9vcGVuYXQKLSAgICAgICAgfSBlbHNlIGlmIChDcHVGZWF0dXJlcy5pc1g4NkNwdSgpKSB7Ci0gICAgICAgICAgICB0ZXN0QmxvY2tlZCgyODYpOyAvLyBfX05SX2FkZF9rZXkKLSAgICAgICAgICAgIHRlc3RCbG9ja2VkKDI4OCk7IC8vIF9fTlJfa2V5Y3RsCi0gICAgICAgICAgICB0ZXN0QWxsb3dlZCgyOTUpOyAvLyBfX05SX29wZW5hdAotICAgICAgICB9IGVsc2UgaWYgKENwdUZlYXR1cmVzLmlzTWlwczY0Q3B1KCkpIHsKLSAgICAgICAgICAgIHRlc3RCbG9ja2VkKDUyMzkpOyAvLyBfX05SX2FkZF9rZXkKLSAgICAgICAgICAgIHRlc3RCbG9ja2VkKDUyNDEpOyAvLyBfX05SX2tleWN0bAotICAgICAgICAgICAgdGVzdEFsbG93ZWQoNTI0Nyk7IC8vIF9fTlJfb3BlbmF0Ci0gICAgICAgIH0gZWxzZSBpZiAoQ3B1RmVhdHVyZXMuaXNNaXBzQ3B1KCkpIHsKLSAgICAgICAgICAgIHRlc3RCbG9ja2VkKDQyODApOyAvLyBfX05SX2FkZF9rZXkKLSAgICAgICAgICAgIHRlc3RCbG9ja2VkKDQyODIpOyAvLyBfX05SX2tleWN0bAotICAgICAgICAgICAgdGVzdEFsbG93ZWQoNDI4OCk7IC8vIF9fTlJfb3BlbmF0Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBc3NlcnQuZmFpbCgiVW5zdXBwb3J0ZWQgT1MiKTsKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZVN5c2NhbGxNYXAoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEpTT05FeGNlcHRpb24geworICAgICAgICBmaW5hbCBDb250ZXh0IGNvbnRleHQgPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKS5nZXRUYXJnZXRDb250ZXh0KCk7CisgICAgICAgIEFzc2V0TWFuYWdlciBtYW5hZ2VyID0gY29udGV4dC5nZXRBc3NldHMoKTsKKyAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG1hbmFnZXIub3Blbigic3lzY2FsbHNfYWxsb3dlZC5qc29uIikpIHsKKyAgICAgICAgICAgIG1BbGxvd2VkU3lzY2FsbE1hcCA9IG5ldyBKU09OT2JqZWN0KHJlYWRJbnB1dFN0cmVhbUZ1bGx5KGlzKSk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG1hbmFnZXIub3Blbigic3lzY2FsbHNfYmxvY2tlZC5qc29uIikpIHsKKyAgICAgICAgICAgIG1CbG9ja2VkU3lzY2FsbE1hcCA9IG5ldyBKU09OT2JqZWN0KHJlYWRJbnB1dFN0cmVhbUZ1bGx5KGlzKSk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDVFNTd2FwT25PZmZCbG9ja2VkKCkgeworICAgIHB1YmxpYyB2b2lkIHRlc3RDVFNTeXNjYWxsQWxsb3dlZCgpIHRocm93cyBKU09ORXhjZXB0aW9uIHsKKyAgICAgICAgSlNPTk9iamVjdCBtYXAgPSBtQWxsb3dlZFN5c2NhbGxNYXAuZ2V0SlNPTk9iamVjdChnZXRDdXJyZW50QXJjaCgpKTsKKyAgICAgICAgSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gbWFwLmtleXMoKTsKKyAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBTdHJpbmcgc3lzY2FsbE5hbWUgPSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIHRlc3RBbGxvd2VkKG1hcC5nZXRJbnQoc3lzY2FsbE5hbWUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENUU1N5c2NhbGxCbG9ja2VkKCkgdGhyb3dzIEpTT05FeGNlcHRpb24geworICAgICAgICBKU09OT2JqZWN0IG1hcCA9IG1CbG9ja2VkU3lzY2FsbE1hcC5nZXRKU09OT2JqZWN0KGdldEN1cnJlbnRBcmNoKCkpOworICAgICAgICBJdGVyYXRvcjxTdHJpbmc+IGl0ZXIgPSBtYXAua2V5cygpOworICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBzeXNjYWxsTmFtZSA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgdGVzdEJsb2NrZWQobWFwLmdldEludChzeXNjYWxsTmFtZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEN1cnJlbnRBcmNoKCkgewogICAgICAgICBpZiAoQ3B1RmVhdHVyZXMuaXNBcm02NENwdSgpKSB7Ci0gICAgICAgICAgICB0ZXN0QmxvY2tlZCgyMjQpOyAvLyBfX05SX3N3YXBvbgotICAgICAgICAgICAgdGVzdEJsb2NrZWQoMjI1KTsgLy8gX19OUl9zd2Fwb2ZmCisgICAgICAgICAgICByZXR1cm4gImFybTY0IjsKICAgICAgICAgfSBlbHNlIGlmIChDcHVGZWF0dXJlcy5pc0FybUNwdSgpKSB7Ci0gICAgICAgICAgICB0ZXN0QmxvY2tlZCg4Nyk7ICAvLyBfX05SX3N3YXBvbgotICAgICAgICAgICAgdGVzdEJsb2NrZWQoMTE1KTsgLy8gX19OUl9zd2Fwb2ZmCisgICAgICAgICAgICByZXR1cm4gImFybSI7CiAgICAgICAgIH0gZWxzZSBpZiAoQ3B1RmVhdHVyZXMuaXNYODZfNjRDcHUoKSkgewotICAgICAgICAgICAgdGVzdEJsb2NrZWQoMTY3KTsgLy8gX19OUl9zd2Fwb24KLSAgICAgICAgICAgIHRlc3RCbG9ja2VkKDE2OCk7IC8vIF9fTlJfc3dhcG9mZgorICAgICAgICAgICAgcmV0dXJuICJ4ODZfNjQiOwogICAgICAgICB9IGVsc2UgaWYgKENwdUZlYXR1cmVzLmlzWDg2Q3B1KCkpIHsKLSAgICAgICAgICAgIHRlc3RCbG9ja2VkKDg3KTsgIC8vIF9fTlJfc3dhcG9uCi0gICAgICAgICAgICB0ZXN0QmxvY2tlZCgxMTUpOyAvLyBfX05SX3N3YXBvZmYKKyAgICAgICAgICAgIHJldHVybiAieDg2IjsKICAgICAgICAgfSBlbHNlIGlmIChDcHVGZWF0dXJlcy5pc01pcHM2NENwdSgpKSB7Ci0gICAgICAgICAgICB0ZXN0QmxvY2tlZCg1MTYyKTsgLy8gX19OUl9zd2Fwb24KLSAgICAgICAgICAgIHRlc3RCbG9ja2VkKDUxNjMpOyAvLyBfX05SX3N3YXBvZmYKKyAgICAgICAgICAgIHJldHVybiAibWlwczY0IjsKICAgICAgICAgfSBlbHNlIGlmIChDcHVGZWF0dXJlcy5pc01pcHNDcHUoKSkgewotICAgICAgICAgICAgdGVzdEJsb2NrZWQoNDA4Nyk7IC8vIF9fTlJfc3dhcG9uCi0gICAgICAgICAgICB0ZXN0QmxvY2tlZCg0MTE1KTsgLy8gX19OUl9zd2Fwb2ZmCisgICAgICAgICAgICByZXR1cm4gIm1pcHMiOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQXNzZXJ0LmZhaWwoIlVuc3VwcG9ydGVkIE9TIik7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgU3RyaW5nIHJlYWRJbnB1dFN0cmVhbUZ1bGx5KElucHV0U3RyZWFtIGlzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzQwOTZdOworICAgICAgICB3aGlsZSAoaXMuYXZhaWxhYmxlKCkgPiAwKSB7CisgICAgICAgICAgICBpbnQgc2l6ZSA9IGlzLnJlYWQoYnVmZmVyKTsKKyAgICAgICAgICAgIGlmIChzaXplIDwgMCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2IuYXBwZW5kKG5ldyBTdHJpbmcoYnVmZmVyLCAwLCBzaXplKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIHRlc3RCbG9ja2VkKGludCBucikgewogICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiU3lzY2FsbCAiICsgbnIgKyAiIG5vdCBibG9ja2VkIiwgdGVzdFN5c2NhbGxCbG9ja2VkKG5yKSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZWNjb21wL3NyYy9hbmRyb2lkL3NlY2NvbXAvY3RzL1NlY2NvbXBIb3N0SlVuaXQ0RGV2aWNlVGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zZWNjb21wL3NyYy9hbmRyb2lkL3NlY2NvbXAvY3RzL1NlY2NvbXBIb3N0SlVuaXQ0RGV2aWNlVGVzdC5qYXZhCmluZGV4IDFlZThmZmYuLjJhNzI0MmIgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvc2VjY29tcC9zcmMvYW5kcm9pZC9zZWNjb21wL2N0cy9TZWNjb21wSG9zdEpVbml0NERldmljZVRlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL3NlY2NvbXAvc3JjL2FuZHJvaWQvc2VjY29tcC9jdHMvU2VjY29tcEhvc3RKVW5pdDREZXZpY2VUZXN0LmphdmEKQEAgLTE2LDggKzE2LDggQEAKIAogcGFja2FnZSBhbmRyb2lkLnNlY2NvbXAuY3RzOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGVzdHR5cGUuQ29tcGF0aWJpbGl0eUhvc3RUZXN0QmFzZTsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5EZXZpY2VKVW5pdDRDbGFzc1J1bm5lcjsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5qdW5pdDQuQmFzZUhvc3RKVW5pdDRUZXN0OwogCiBpbXBvcnQgb3JnLmp1bml0LkFmdGVyOwogaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CkBAIC0zMywxNCArMzMsMTQgQEAKICAqIGNvbGxlY3RlZCBmcm9tIHRoZSBob3N0c2lkZSBhbmQgcmVwb3J0ZWQgYWNjb3JkaW5nbHkuCiAgKi8KIEBSdW5XaXRoKERldmljZUpVbml0NENsYXNzUnVubmVyLmNsYXNzKQotcHVibGljIGNsYXNzIFNlY2NvbXBIb3N0SlVuaXQ0RGV2aWNlVGVzdCBleHRlbmRzIENvbXBhdGliaWxpdHlIb3N0VGVzdEJhc2UgeworcHVibGljIGNsYXNzIFNlY2NvbXBIb3N0SlVuaXQ0RGV2aWNlVGVzdCBleHRlbmRzIEJhc2VIb3N0SlVuaXQ0VGVzdCB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9QS0cgPSAiYW5kcm9pZC5zZWNjb21wLmN0cy5hcHAiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0NMQVNTID0gVEVTVF9QS0cgKyAiLiIgKyAiU2VjY29tcERldmljZVRlc3QiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0FQUCA9ICJDdHNTZWNjb21wRGV2aWNlQXBwLmFwayI7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9DVFNfU1lTQ0FMTF9CTE9DS0VEID0gInRlc3RDVFNTeXNjYWxsQmxvY2tlZCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQ1RTX1NXQVBfT05fT0ZGX0JMT0NLRUQgPSAidGVzdENUU1N3YXBPbk9mZkJsb2NrZWQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0NUU19TWVNDQUxMX0FMTE9XRUQgPSAidGVzdENUU1N5c2NhbGxBbGxvd2VkIjsKIAogICAgIEBCZWZvcmUKICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewpAQCAtNTMsMTMgKzUzLDEzIEBACiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q1RTU3dhcE9uT2ZmQmxvY2tlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShydW5EZXZpY2VUZXN0cyhURVNUX1BLRywgVEVTVF9DTEFTUywgVEVTVF9DVFNfU1dBUF9PTl9PRkZfQkxPQ0tFRCkpOworICAgIHB1YmxpYyB2b2lkIHRlc3RDVFNTeXNjYWxsQWxsb3dlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShydW5EZXZpY2VUZXN0cyhURVNUX1BLRywgVEVTVF9DTEFTUywgVEVTVF9DVFNfU1lTQ0FMTF9BTExPV0VEKSk7CiAgICAgfQogCiAgICAgQEFmdGVyCiAgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdW5pbnN0YWxsUGFja2FnZShURVNUX1BLRyk7CisgICAgICAgIHVuaW5zdGFsbFBhY2thZ2UoZ2V0RGV2aWNlKCksIFRFU1RfUEtHKTsKICAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHkvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHkvQW5kcm9pZC5tawppbmRleCAwYjcyMzE4Li5jZGY3MWRjIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5L0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eS9BbmRyb2lkLm1rCkBAIC0yMSw3ICsyMSw3IEBACiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAogCiAjIHRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0Ci1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMgc3RzCiAKICMgTXVzdCBtYXRjaCB0aGUgcGFja2FnZSBuYW1lIGluIEN0c1Rlc3RDYXNlTGlzdC5tawogTE9DQUxfTU9EVUxFIDo9IEN0c1NlY3VyaXR5SG9zdFRlc3RDYXNlcwpAQCAtMzIsNiArMzIsMTIgQEAKIAogTE9DQUxfQ1RTX1RFU1RfUEFDS0FHRSA6PSBhbmRyb2lkLmhvc3Quc2VjdXJpdHkKIAoraWZlcSAoJChIT1NUX09TKSxkYXJ3aW4pCitTSEFSRURMSUJfRVhUPWR5bGliCitlbHNlCitTSEFSRURMSUJfRVhUPXNvCitlbmRpZgorCiBzZWxpbnV4X3BsYXRfc2VhcHBfY29udGV4dHMgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixFVEMscGxhdF9zZWFwcF9jb250ZXh0cykvcGxhdF9zZWFwcF9jb250ZXh0cwogCiBzZWxpbnV4X3BsYXRfc2VhcHBfbmV2ZXJhbGxvd3MgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixFVEMscGxhdF9zZWFwcF9uZXZlcmFsbG93cykvcGxhdF9zZWFwcF9uZXZlcmFsbG93cwpAQCAtNDUsNiArNTEsMTMgQEAKIExPQ0FMX0pBVkFfUkVTT1VSQ0VfRklMRVMgOj0gXAogICAgICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2NoZWNrc2VhcHAgXAogICAgICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2NoZWNrZmMgXAorICAgICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL3Byb3BlcnR5X2luZm9fY2hlY2tlciBcCisgICAgJChIT1NUX09VVF9FWEVDVVRBQkxFUykvc2VhcmNocG9saWN5IFwKKyAgICAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9zZWNpbGMgXAorICAgICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL3NlcG9saWN5X3Rlc3RzIFwKKyAgICAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS90cmVibGVfc2Vwb2xpY3lfdGVzdHMgXAorICAgICQoSE9TVF9PVVQpL2xpYjY0L2xpYnNlcG9sd3JhcC4kKFNIQVJFRExJQl9FWFQpIFwKKyAgICAkKEhPU1RfT1VUKS9saWI2NC9saWJjKysuJChTSEFSRURMSUJfRVhUKSBcCiAgICAgJChzZWxpbnV4X3BsYXRfc2VhcHBfY29udGV4dHMpIFwKICAgICAkKHNlbGludXhfcGxhdF9zZWFwcF9uZXZlcmFsbG93cykgXAogICAgICQoc2VsaW51eF9wbGF0X2ZpbGVfY29udGV4dHMpIFwKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHkvQW5kcm9pZFRlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eS9BbmRyb2lkVGVzdC54bWwKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCA2NzZlODk4Li4xNzkyMWJmCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHkvQW5kcm9pZFRlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHkvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw5ICsxNCwxMSBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgdGhlIENUUyBTZWN1cml0eSBob3N0IHRlc3RzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0ic2VjdXJpdHkiIC8+CisKICAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGVzdHR5cGUuSmFySG9zdFRlc3QiID4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJqYXIiIHZhbHVlPSJDdHNTZWN1cml0eUhvc3RUZXN0Q2FzZXMuamFyIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjMycyIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJydW50aW1lLWhpbnQiIHZhbHVlPSI4bTQwcyIgLz4KICAgICA8L3Rlc3Q+CiA8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5L3NyYy9hbmRyb2lkL2N0cy9zZWN1cml0eS9GaWxlU3lzdGVtUGVybWlzc2lvblRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHkvc3JjL2FuZHJvaWQvY3RzL3NlY3VyaXR5L0ZpbGVTeXN0ZW1QZXJtaXNzaW9uVGVzdC5qYXZhCmluZGV4IGQ4YjI4MTYuLjJlMGQwYTUgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHkvc3JjL2FuZHJvaWQvY3RzL3NlY3VyaXR5L0ZpbGVTeXN0ZW1QZXJtaXNzaW9uVGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHkvc3JjL2FuZHJvaWQvY3RzL3NlY3VyaXR5L0ZpbGVTeXN0ZW1QZXJtaXNzaW9uVGVzdC5qYXZhCkBAIC0xLDEyICsxLDI4IEBACiBwYWNrYWdlIGFuZHJvaWQuY3RzLnNlY3VyaXR5OwogCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VjdXJpdHkuY3RzLlNFTGludXhIb3N0VGVzdC5jb3B5UmVzb3VyY2VUb1RlbXBGaWxlOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlY3VyaXR5LmN0cy5TRUxpbnV4SG9zdFRlc3QuZ2V0RGV2aWNlUG9saWN5RmlsZTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZWN1cml0eS5jdHMuU0VMaW51eEhvc3RUZXN0LmlzTWFjOworCiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLklUZXN0RGV2aWNlOwogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5EZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb247CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuRGV2aWNlVGVzdENhc2U7CiAKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOwogCiBwdWJsaWMgY2xhc3MgRmlsZVN5c3RlbVBlcm1pc3Npb25UZXN0IGV4dGVuZHMgRGV2aWNlVGVzdENhc2UgewogCkBAIC01Miw0ICs2OCwxODQgQEAKICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0SW5zZWN1cmVEZXZpY2VBZGJDb21tYW5kKFN0cmluZyBwYXRoLCBTdHJpbmcgdHlwZSkgewogICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdChJTlNFQ1VSRV9ERVZJQ0VfQURCX0NPTU1BTkQsIHBhdGgsIHR5cGUpOwogICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBIV19STkdfREVWSUNFID0gIi9kZXYvaHdfcmFuZG9tIjsKKworICAgIHB1YmxpYyB2b2lkIHRlc3REZXZId1JhbmRvbVBlcm1pc3Npb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFRoaXMgdGVzdCBhc3NlcnRzIHRoYXQsIGlmIHByZXNlbnQsIC9kZXYvaHdfcmFuZG9tIG11c3Q6CisgICAgICAgIC8vIDEuIEJlIG93bmVkIGJ5IFVJRCByb290CisgICAgICAgIC8vIDIuIE5vdCBhbGxvdyBhbnkgd29ybGQgcmVhZCwgd3JpdGUsIG9yIGV4ZWN1dGUgcGVybWlzc2lvbnMuIFRoZSByZWFzb24KKyAgICAgICAgLy8gICAgZm9yIGJlaW5nIG5vdCByZWFkYWJsZSBieSBhbGwvb3RoZXIgaXMgdG8gYXZvaWQgYXBwcyByZWFkaW5nIGZyb20gdGhpcyBkZXZpY2UuCisgICAgICAgIC8vICAgIEZpcnN0bHksIC9kZXYvaHdfcmFuZG9tIGlzIG5vdCBwdWJsaWMgQVBJIGZvciBhcHBzLiBTZWNvbmRseSwgYXBwcyBtaWdodCBlcnJvbmVvdXNseQorICAgICAgICAvLyAgICB1c2UgdGhlIG91dHB1dCBvZiBIYXJkd2FyZSBSTkcgYXMgdHJ1c3RlZCByYW5kb20gb3V0cHV0LiBBbmRyb2lkIGRvZXMgbm90IHRydXN0IG91dHB1dAorICAgICAgICAvLyAgICBvZiAvZGV2L2h3X3JhbmRvbS4gSFcgUk5HIG91dHB1dCBpcyBvbmx5IHVzZWQgZm9yIG1peGluZyBpbnRvIExpbnV4IFJORyBhcyB1bnRydXN0ZWQKKyAgICAgICAgLy8gICAgaW5wdXQuCisgICAgICAgIC8vIDMuIEJlIGEgY2hhcmFjdGVyIGRldmljZSB3aXRoIG1ham9yOm1pbm9yIDEwOjE4MyAtLSBod3JuZyBrZXJuZWwgZHJpdmVyIGlzIHVzaW5nIE1BSk9SIDEwCisgICAgICAgIC8vICAgIGFuZCBNSU5PUiAxODMKKyAgICAgICAgLy8gNC4gQmUgb3BlbmFibGUgYW5kIHJlYWRhYmxlIGJ5IHN5c3RlbV9zZXJ2ZXIgYWNjb3JkaW5nIHRvIFNFTGludXggcG9saWN5CisKKyAgICAgICAgaWYgKCFtRGV2aWNlLmRvZXNGaWxlRXhpc3QoSFdfUk5HX0RFVklDRSkpIHsKKyAgICAgICAgICAgIC8vIEhhcmR3YXJlIFJORyBkZXZpY2UgaXMgbWlzc2luZy4gVGhpcyBpcyBPSyBiZWNhdXNlIGl0IGlzIG5vdCByZXF1aXJlZCB0byBiZSBleHBvc2VkCisgICAgICAgICAgICAvLyBvbiBhbGwgZGV2aWNlcy4KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBjb21tYW5kID0gImxzIC1sICIgKyBIV19STkdfREVWSUNFOworICAgICAgICBTdHJpbmcgb3V0cHV0ID0gbURldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKGNvbW1hbmQpLnRyaW0oKTsKKyAgICAgICAgaWYgKCFvdXRwdXQuZW5kc1dpdGgoIiAiICsgSFdfUk5HX0RFVklDRSkpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgb3V0cHV0IGZyb20gIiArIGNvbW1hbmQgKyAiOiBcIiIgKyBvdXRwdXQgKyAiXCIiKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmdbXSBvdXRwdXRXb3JkcyA9IG91dHB1dC5zcGxpdCgiXFxzIik7CisgICAgICAgIGFzc2VydEVxdWFscygiV3JvbmcgZGV2aWNlIHR5cGUgb24gIiArIEhXX1JOR19ERVZJQ0UsICJjIiwgb3V0cHV0V29yZHNbMF0uc3Vic3RyaW5nKDAsIDEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyB3b3JsZCBmaWxlIG1vZGUgb24gIiArIEhXX1JOR19ERVZJQ0UsICItLS0iLCBvdXRwdXRXb3Jkc1swXS5zdWJzdHJpbmcoNykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIldyb25nIG93bmVyIG9mICIgKyBIV19STkdfREVWSUNFLCAicm9vdCIsIG91dHB1dFdvcmRzWzJdKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBkZXZpY2UgbWFqb3Igb24gIiArIEhXX1JOR19ERVZJQ0UsICIxMCwiLCBvdXRwdXRXb3Jkc1s0XSk7CisgICAgICAgIGFzc2VydEVxdWFscygiV3JvbmcgZGV2aWNlIG1pbm9yIG9uICIgKyBIV19STkdfREVWSUNFLCAiMTgzIiwgb3V0cHV0V29yZHNbNV0pOworCisgICAgICAgIGNvbW1hbmQgPSAibHMgLVogIiArIEhXX1JOR19ERVZJQ0U7CisgICAgICAgIG91dHB1dCA9IG1EZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZChjb21tYW5kKS50cmltKCk7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiV3JvbmcgU0VMaW51eCBsYWJlbCBvbiAiICsgSFdfUk5HX0RFVklDRSwKKyAgICAgICAgICAgICAgICAidTpvYmplY3Rfcjpod19yYW5kb21fZGV2aWNlOnMwICIgKyBIV19STkdfREVWSUNFLAorICAgICAgICAgICAgICAgIG91dHB1dCk7CisKKyAgICAgICAgRmlsZSBzZXBvbGljeSA9IGdldERldmljZVBvbGljeUZpbGUobURldmljZSk7CisgICAgICAgIG91dHB1dCA9CisgICAgICAgICAgICAgICAgbmV3IFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWNTZWFyY2hQb2xpY3koCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLWFsbG93IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi1zIiwgInN5c3RlbV9zZXJ2ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLXQiLCAiaHdfcmFuZG9tX2RldmljZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItYyIsICJjaHJfZmlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItcCIsICJvcGVuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vwb2xpY3kuZ2V0UGF0aCgpKSk7CisgICAgICAgIGlmIChvdXRwdXQudHJpbSgpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgZmFpbCgiU0VMaW51eCBwb2xpY3kgZG9lcyBub3QgcGVybWl0IHN5c3RlbV9zZXJ2ZXIgdG8gb3BlbiAiICsgSFdfUk5HX0RFVklDRSk7CisgICAgICAgIH0KKyAgICAgICAgb3V0cHV0ID0KKyAgICAgICAgICAgICAgICBuZXcgU3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgZXhlY1NlYXJjaFBvbGljeSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tYWxsb3ciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLXMiLCAic3lzdGVtX3NlcnZlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItdCIsICJod19yYW5kb21fZGV2aWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi1jIiwgImNocl9maWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi1wIiwgInJlYWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXBvbGljeS5nZXRQYXRoKCkpKTsKKyAgICAgICAgaWYgKG91dHB1dC50cmltKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBmYWlsKCJTRUxpbnV4IHBvbGljeSBkb2VzIG5vdCBwZXJtaXQgc3lzdGVtX3NlcnZlciB0byByZWFkICIgKyBIV19STkdfREVWSUNFKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEV4ZWN1dGVzIHtAY29kZSBzZWFyY2hwb2xpY3l9IGV4ZWN1dGFibGUgd2l0aCB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycyBhbmQgcmV0dXJucyB0aGUKKyAgICAgKiBjb250ZW50cyBvZiBzdGFuZGFyZCBvdXRwdXQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGV4ZWN1dGlvbiBvZiBzZWFyY2hwb2xpY3kgZmFpbHMsIHJldHVybnMgbm9uLXplcm8gZXJyb3IgY29kZSwgb3IKKyAgICAgKiAgICAgICAgIG5vbi1lbXB0eSBzdGRlcnIKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gZXhlY1NlYXJjaFBvbGljeShTdHJpbmcuLi4gYXJncykKKyAgICAgICAgICAgIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBGaWxlIHRtcERpciA9IEZpbGVzLmNyZWF0ZVRlbXBEaXJlY3RvcnkoInNlYXJjaHBvbGljeSIpLnRvRmlsZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RyaW5nW10gZW52cDsKKyAgICAgICAgICAgIEZpbGUgbGlic2Vwb2x3cmFwOworICAgICAgICAgICAgaWYgKGlzTWFjKCkpIHsKKyAgICAgICAgICAgICAgICBsaWJzZXBvbHdyYXAgPSBjb3B5UmVzb3VyY2VUb1RlbXBGaWxlKCIvbGlic2Vwb2x3cmFwLmR5bGliIik7CisgICAgICAgICAgICAgICAgbGlic2Vwb2x3cmFwID0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVzLm1vdmUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnNlcG9sd3JhcC50b1BhdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUodG1wRGlyLCAibGlic2Vwb2x3cmFwLmR5bGliIikudG9QYXRoKCkpLnRvRmlsZSgpOworICAgICAgICAgICAgICAgIEZpbGUgbGliY3BwID0gY29weVJlc291cmNlVG9UZW1wRmlsZSgiL2xpYmMrKy5keWxpYiIpOworICAgICAgICAgICAgICAgIEZpbGVzLm1vdmUobGliY3BwLnRvUGF0aCgpLCBuZXcgRmlsZSh0bXBEaXIsICJsaWJjKysuZHlsaWIiKS50b1BhdGgoKSk7CisgICAgICAgICAgICAgICAgZW52cCA9IG5ldyBTdHJpbmdbXSB7IkRZTERfTElCUkFSWV9QQVRIPSIgKyB0bXBEaXIuZ2V0QWJzb2x1dGVQYXRoKCl9OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsaWJzZXBvbHdyYXAgPSBjb3B5UmVzb3VyY2VUb1RlbXBGaWxlKCIvbGlic2Vwb2x3cmFwLnNvIik7CisgICAgICAgICAgICAgICAgbGlic2Vwb2x3cmFwID0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVzLm1vdmUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnNlcG9sd3JhcC50b1BhdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUodG1wRGlyLCAibGlic2Vwb2x3cmFwLnNvIikudG9QYXRoKCkpLnRvRmlsZSgpOworICAgICAgICAgICAgICAgIEZpbGUgbGliY3BwID0gY29weVJlc291cmNlVG9UZW1wRmlsZSgiL2xpYmMrKy5zbyIpOworICAgICAgICAgICAgICAgIEZpbGVzLm1vdmUobGliY3BwLnRvUGF0aCgpLCBuZXcgRmlsZSh0bXBEaXIsICJsaWJjKysuc28iKS50b1BhdGgoKSk7CisgICAgICAgICAgICAgICAgZW52cCA9IG5ldyBTdHJpbmdbXSB7IkxEX0xJQlJBUllfUEFUSD0iICsgdG1wRGlyLmdldEFic29sdXRlUGF0aCgpfTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZpbGUgc2VhcmNocG9saWN5ID0gY29weVJlc291cmNlVG9UZW1wRmlsZSgiL3NlYXJjaHBvbGljeSIpOworICAgICAgICAgICAgc2VhcmNocG9saWN5ID0KKyAgICAgICAgICAgICAgICAgICAgRmlsZXMubW92ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaHBvbGljeS50b1BhdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKHRtcERpciwgInNlYXJjaHBvbGljeSIpLnRvUGF0aCgpKS50b0ZpbGUoKTsKKyAgICAgICAgICAgIHNlYXJjaHBvbGljeS5zZXRFeGVjdXRhYmxlKHRydWUpOworICAgICAgICAgICAgbGlic2Vwb2x3cmFwLnNldEV4ZWN1dGFibGUodHJ1ZSk7CisgICAgICAgICAgICBMaXN0PFN0cmluZz4gY21kID0gbmV3IEFycmF5TGlzdDw+KDMgKyBhcmdzLmxlbmd0aCk7CisgICAgICAgICAgICBjbWQuYWRkKHNlYXJjaHBvbGljeS5nZXRQYXRoKCkpOworICAgICAgICAgICAgY21kLmFkZCgiLS1saWJwYXRoIik7CisgICAgICAgICAgICBjbWQuYWRkKGxpYnNlcG9sd3JhcC5nZXRQYXRoKCkpOworICAgICAgICAgICAgZm9yIChTdHJpbmcgYXJnIDogYXJncykgeworICAgICAgICAgICAgICAgIGNtZC5hZGQoYXJnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBleGVjQW5kQ2FwdHVyZU91dHB1dChjbWQudG9BcnJheShuZXcgU3RyaW5nWzBdKSwgZW52cCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAvLyBEZWxldGUgdG1wRGlyCisgICAgICAgICAgICBGaWxlW10gZmlsZXMgPSB0bXBEaXIubGlzdEZpbGVzKCk7CisgICAgICAgICAgICBpZiAoZmlsZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbGVzID0gbmV3IEZpbGVbMF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKEZpbGUgZiA6IGZpbGVzKSB7CisgICAgICAgICAgICAgICAgZi5kZWxldGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRtcERpci5kZWxldGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEV4ZWN1dGVzIHRoZSBwcm92aWRlZCBjb21tYW5kIGFuZCByZXR1cm5zIHRoZSBjb250ZW50cyBvZiBzdGFuZGFyZCBvdXRwdXQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGV4ZWN1dGlvbiBmYWlscywgcmV0dXJucyBhIG5vbi16ZXJvIGVycm9yIGNvZGUsIG9yIG5vbi1lbXB0eSBzdGRlcnIKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gZXhlY0FuZENhcHR1cmVPdXRwdXQoU3RyaW5nW10gY21kLCBTdHJpbmdbXSBlbnZwKQorICAgICAgICAgICAgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIFN0YXJ0IHByb2Nlc3MsIHJlYWQgaXRzIHN0ZG91dCBhbmQgc3RkZXJyIGluIHR3byBjb3JyZXNwb25kaW5nIGJhY2tncm91bmQgdGhyZWFkcywgd2FpdAorICAgICAgICAvLyBmb3IgcHJvY2VzcyB0byB0ZXJtaW5hdGUsIHRocm93IGlmIHN0ZGVyciBpcyBub3QgZW1wdHkgb3IgaWYgcmV0dXJuIGNvZGUgIT0gMC4KKyAgICAgICAgZmluYWwgUHJvY2VzcyBwID0gUnVudGltZS5nZXRSdW50aW1lKCkuZXhlYyhjbWQsIGVudnApOworICAgICAgICBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3JTZXJ2aWNlID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGV4ZWN1dG9yU2VydmljZSA9IEV4ZWN1dG9ycy5uZXdGaXhlZFRocmVhZFBvb2woMik7CisgICAgICAgICAgICBGdXR1cmU8Ynl0ZVtdPiBzdGRvdXRDb250ZW50c0Z1dHVyZSA9CisgICAgICAgICAgICAgICAgICAgIGV4ZWN1dG9yU2VydmljZS5zdWJtaXQobmV3IERyYWluQ2FsbGFibGUocC5nZXRJbnB1dFN0cmVhbSgpKSk7CisgICAgICAgICAgICBGdXR1cmU8Ynl0ZVtdPiBzdGRlcnJDb250ZW50c0Z1dHVyZSA9CisgICAgICAgICAgICAgICAgICAgIGV4ZWN1dG9yU2VydmljZS5zdWJtaXQobmV3IERyYWluQ2FsbGFibGUocC5nZXRFcnJvclN0cmVhbSgpKSk7CisgICAgICAgICAgICBpbnQgZXJyb3JDb2RlID0gcC53YWl0Rm9yKCk7CisgICAgICAgICAgICBieXRlW10gc3RkZXJyQ29udGVudHMgPSBzdGRlcnJDb250ZW50c0Z1dHVyZS5nZXQoKTsKKyAgICAgICAgICAgIGlmICgoZXJyb3JDb2RlICE9IDApICB8fCAoc3RkZXJyQ29udGVudHMubGVuZ3RoID4gMCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBjbWRbMF0gKyAiIGZhaWxlZCB3aXRoIGVycm9yIGNvZGUgIiArIGVycm9yQ29kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjogIiArIG5ldyBTdHJpbmcoc3RkZXJyQ29udGVudHMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzdGRvdXRDb250ZW50c0Z1dHVyZS5nZXQoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiRmFpbGVkIHRvIHJlYWQgc3Rkb3V0IG9yIHN0ZGVyciBvZiAiICsgY21kWzBdLCBlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChleGVjdXRvclNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGV4ZWN1dG9yU2VydmljZS5zaHV0ZG93bk5vdygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRHJhaW5DYWxsYWJsZSBpbXBsZW1lbnRzIENhbGxhYmxlPGJ5dGVbXT4geworICAgICAgICBwcml2YXRlIGZpbmFsIElucHV0U3RyZWFtIG1JbjsKKworICAgICAgICBwcml2YXRlIERyYWluQ2FsbGFibGUoSW5wdXRTdHJlYW0gaW4pIHsKKyAgICAgICAgICAgIG1JbiA9IGluOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBieXRlW10gY2FsbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gcmVzdWx0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzE2Mzg0XTsKKyAgICAgICAgICAgIGludCBjaHVua1NpemU7CisgICAgICAgICAgICB3aGlsZSAoKGNodW5rU2l6ZSA9IG1Jbi5yZWFkKGJ1ZikpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0LndyaXRlKGJ1ZiwgMCwgY2h1bmtTaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQudG9CeXRlQXJyYXkoKTsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHkvc3JjL2FuZHJvaWQvY3RzL3NlY3VyaXR5L1Byb2Nlc3NNdXN0VXNlU2VjY29tcFRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHkvc3JjL2FuZHJvaWQvY3RzL3NlY3VyaXR5L1Byb2Nlc3NNdXN0VXNlU2VjY29tcFRlc3QuamF2YQppbmRleCBhZjBiZDA1Li5iNWE0NTZjIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5L3NyYy9hbmRyb2lkL2N0cy9zZWN1cml0eS9Qcm9jZXNzTXVzdFVzZVNlY2NvbXBUZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eS9zcmMvYW5kcm9pZC9jdHMvc2VjdXJpdHkvUHJvY2Vzc011c3RVc2VTZWNjb21wVGVzdC5qYXZhCkBAIC0xNSw3ICsxNSw2IEBACiAgKi8KIHBhY2thZ2UgYW5kcm9pZC5zZWN1cml0eS5jdHM7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNkZFRlc3Q7CiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DcHVGZWF0dXJlczsKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlByb3BlcnR5VXRpbDsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuQ29sbGVjdGluZ091dHB1dFJlY2VpdmVyOwpAQCAtMTE2LDEyICsxMTUsMTAgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI5LjcvQy0wLTYiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RNZWRpYWV4dHJhY3Rvckhhc1NlY2NvbXBGaWx0ZXIoKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0U2VjY29tcEZpbHRlcigibWVkaWEuZXh0cmFjdG9yIiwgUFNfQ01ELCBmYWxzZSk7CiAgICAgfQogCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjkuNy9DLTAtNiIpCiAgICAgcHVibGljIHZvaWQgdGVzdE9teEhhbEhhc1NlY2NvbXBGaWx0ZXIoKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0U2VjY29tcEZpbHRlcigibWVkaWEuY29kZWMiLCBQU19DTUQsIGZhbHNlKTsKICAgICB9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5L3NyYy9hbmRyb2lkL3NlY3VyaXR5L2N0cy9FbmNyeXB0aW9uSG9zdFRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHkvc3JjL2FuZHJvaWQvc2VjdXJpdHkvY3RzL0VuY3J5cHRpb25Ib3N0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDllNTc2Li4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHkvc3JjL2FuZHJvaWQvc2VjdXJpdHkvY3RzL0VuY3J5cHRpb25Ib3N0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5zZWN1cml0eS5jdHM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuTG9nLkxvZ0xldmVsOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5EZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLklUZXN0RGV2aWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmxvZy5Mb2dVdGlsLkNMb2c7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuRGV2aWNlVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVVVJRDsKLQotLyoqCi0gKiBIb3N0IHNpZGUgZW5jcnlwdGlvbiB0ZXN0cwotICoKLSAqIFRoZXNlIHRlc3RzIGFuYWx5emUgYSB1c2VyZGVidWcgZGV2aWNlIGZvciBjb3JyZWN0IGVuY3J5cHRpb24gcHJvcGVydGllcwotICovCi1wdWJsaWMgY2xhc3MgRW5jcnlwdGlvbkhvc3RUZXN0IGV4dGVuZHMgRGV2aWNlVGVzdENhc2UgewotICAgIElUZXN0RGV2aWNlIG1EZXZpY2U7Ci0gICAgYm9vbGVhbiBtVXNlckRlYnVnOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgbURldmljZSA9IGdldERldmljZSgpOwotICAgICAgICBtVXNlckRlYnVnID0gInVzZXJkZWJ1ZyIuZXF1YWxzKG1EZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZCgiZ2V0cHJvcCByby5idWlsZC50eXBlIikudHJpbSgpKTsKLSAgICAgICAgaWYgKCFtVXNlckRlYnVnKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbURldmljZS5lbmFibGVBZGJSb290KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG1Vc2VyRGVidWcpIHsKLSAgICAgICAgICAgIG1EZXZpY2UuZGlzYWJsZUFkYlJvb3QoKTsKLSAgICAgICAgfQotICAgICAgICBzdXBlci50ZWFyRG93bigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbmNyeXB0ZWQoKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFtVXNlckRlYnVnIHx8ICFtRGV2aWNlLmlzRGV2aWNlRW5jcnlwdGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAvKgotICAgICAgICAvLyBDcmVhdGUgZmlsZSB3aXRoIG5hbWUgYW5kIGNvbnRlbnRzIGEgcmFuZG9tIFVVSUQgc28gd2UgY2FuIHNlYXJjaCBmb3IgaXQKLSAgICAgICAgU3RyaW5nIHV1aWQgPSBVVUlELnJhbmRvbVVVSUQoKS50b1N0cmluZygpOwotICAgICAgICBtRGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoImVjaG8gIiArIHV1aWQgKyAiID4gL2RhdGEvbG9jYWwvdG1wLyIgKyB1dWlkKTsKLSAgICAgICAgU3RyaW5nIHV1aWRSZXR1cm5lZCA9IG1EZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZCgiY2F0IC9kYXRhL2xvY2FsL3RtcC8iICsgdXVpZCkudHJpbSgpOwotICAgICAgICBhc3NlcnRUcnVlKHV1aWQuZXF1YWxzKHV1aWRSZXR1cm5lZCkpOwotCi0gICAgICAgIC8vIEdldCBuYW1lIG9mIC9kYXRhIGRldmljZQotICAgICAgICBTdHJpbmcgZnN0YWJOYW1lID0gbURldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKCJscyAvZnN0YWIuKiIpOwotICAgICAgICBTdHJpbmdbXSBmc3RhYiA9IG1EZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZCgiY2F0ICIgKyBmc3RhYk5hbWUpLnNwbGl0KCJcbiIpOwotICAgICAgICBTdHJpbmcgcGF0aCA9IG51bGw7Ci0gICAgICAgIGZvciAoU3RyaW5nIGxpbmUgOiBmc3RhYikgewotICAgICAgICAgICAgU3RyaW5nW10gZW50cmllcyA9IGxpbmUuc3BsaXQoIlsgXHRdKyIpOwotICAgICAgICAgICAgaWYgKGVudHJpZXMubGVuZ3RoIDwgMikgY29udGludWU7Ci0gICAgICAgICAgICBpZiAoIi9kYXRhIi5lcXVhbHMoZW50cmllc1sxXSkpIHsKLSAgICAgICAgICAgICAgICBwYXRoID0gZW50cmllc1swXTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBhc3NlcnRGYWxzZShwYXRoID09IG51bGwpOwotCi0gICAgICAgIC8vIGdyZXAgaXQgZm9yIHRoZSBkYXRhCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBtRGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoImdyZXAgIiArIHV1aWQgKyAiICIgKyBwYXRoICsgIiAiKS50cmltKCk7Ci0gICAgICAgIGFzc2VydFRydWUoIiIuZXF1YWxzKHJlc3VsdCkpOwotCi0gICAgICAgIC8vIENsZWFuIHVwCi0gICAgICAgIG1EZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZCgicm0gL2RhdGEvbG9jYWwvdG1wLyIgKyB1dWlkKTsKLSAgICAgICAgKi8KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5L3NyYy9hbmRyb2lkL3NlY3VyaXR5L2N0cy9LZXJuZWxDb25maWdUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5L3NyYy9hbmRyb2lkL3NlY3VyaXR5L2N0cy9LZXJuZWxDb25maWdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZjZDA0NQotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHkvc3JjL2FuZHJvaWQvc2VjdXJpdHkvY3RzL0tlcm5lbENvbmZpZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDIwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZWN1cml0eS5jdHM7CisKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5idWlsZC5JQnVpbGRJbmZvOworaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5JVGVzdERldmljZTsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5EZXZpY2VUZXN0Q2FzZTsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JQnVpbGRSZWNlaXZlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JRGV2aWNlVGVzdDsKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNkZFRlc3Q7CitpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DcHVGZWF0dXJlczsKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlByb3BlcnR5VXRpbDsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5sYW5nLlN0cmluZzsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkdaSVBJbnB1dFN0cmVhbTsKKworLyoqCisgKiBIb3N0LXNpZGUga2VybmVsIGNvbmZpZyB0ZXN0cy4KKyAqCisgKiBUaGVzZSB0ZXN0cyBhbmFseXplIC9wcm9jL2NvbmZpZy5neiB0byB2ZXJpZnkgdGhhdCBjZXJ0YWluIGtlcm5lbCBjb25maWcgb3B0aW9ucyBhcmUgc2V0LgorICovCitwdWJsaWMgY2xhc3MgS2VybmVsQ29uZmlnVGVzdCBleHRlbmRzIERldmljZVRlc3RDYXNlIGltcGxlbWVudHMgSUJ1aWxkUmVjZWl2ZXIsIElEZXZpY2VUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxJVGVzdERldmljZSwgSGFzaFNldDxTdHJpbmc+PiBjYWNoZWRDb25maWdHelNldCA9IG5ldyBIYXNoTWFwPD4oMSk7CisKKyAgICBwcml2YXRlIEhhc2hTZXQ8U3RyaW5nPiBjb25maWdTZXQ7CisKKyAgICBwcml2YXRlIElUZXN0RGV2aWNlIG1EZXZpY2U7CisgICAgcHJpdmF0ZSBJQnVpbGRJbmZvIG1CdWlsZDsKKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRCdWlsZChJQnVpbGRJbmZvIGJ1aWxkKSB7CisgICAgICAgIG1CdWlsZCA9IGJ1aWxkOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXREZXZpY2UoSVRlc3REZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIHN1cGVyLnNldERldmljZShkZXZpY2UpOworICAgICAgICBtRGV2aWNlID0gZGV2aWNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgIGNvbmZpZ1NldCA9IGdldERldmljZUNvbmZpZyhtRGV2aWNlLCBjYWNoZWRDb25maWdHelNldCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBJTVBMRU1FTlRBVElPTiBERVRBSUxTOiBDYWNoZSB0aGUgY29uZmlndXJhdGlvbnMgZnJvbSAvcHJvYy9jb25maWcuZ3ogb24gcGVyLWRldmljZSBiYXNpcworICAgICAqIGluIGNhc2UgQ1RTIGlzIGJlaW5nIHJ1biBhZ2FpbnN0IG11bHRpcGxlIGRldmljZXMgYXQgdGhlIHNhbWUgdGltZS4gVGhpcyBzcGVlZHMgdXAgdGVzdGluZworICAgICAqIGJ5IGF2b2lkaW5nIHB1bGxpbmcvcGFyc2luZyB0aGUgY29uZmlnIGZpbGUgZm9yIGVhY2ggaW5kaXZpZHVhbCB0ZXN0CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaFNldDxTdHJpbmc+IGdldERldmljZUNvbmZpZyhJVGVzdERldmljZSBkZXZpY2UsCisgICAgICAgICAgICBNYXA8SVRlc3REZXZpY2UsIEhhc2hTZXQ8U3RyaW5nPj4gY2FjaGUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIWRldmljZS5kb2VzRmlsZUV4aXN0KCIvcHJvYy9jb25maWcuZ3oiKSl7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgSGFzaFNldDxTdHJpbmc+IHNldDsKKyAgICAgICAgc3luY2hyb25pemVkIChjYWNoZSkgeworICAgICAgICAgICAgc2V0ID0gY2FjaGUuZ2V0KGRldmljZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNldCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gc2V0OworICAgICAgICB9CisgICAgICAgIEZpbGUgZmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoImNvbmZpZy5neiIsICIudG1wIik7CisgICAgICAgIGZpbGUuZGVsZXRlT25FeGl0KCk7CisgICAgICAgIGRldmljZS5wdWxsRmlsZSgiL3Byb2MvY29uZmlnLmd6IiwgZmlsZSk7CisKKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihuZXcgR1pJUElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSkpKSk7CisgICAgICAgIHNldCA9IG5ldyBIYXNoU2V0PFN0cmluZz4ocmVhZGVyLmxpbmVzKCkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSk7CisKKyAgICAgICAgc3luY2hyb25pemVkIChjYWNoZSkgeworICAgICAgICAgICAgY2FjaGUucHV0KGRldmljZSwgc2V0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhhdCB0aGUga2VybmVsIGhhcyBTdGFjayBQcm90ZWN0b3IgU3Ryb25nIGVuYWJsZWQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI5LjcvQy0wLTciKQorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25maWdTdGFja1Byb3RlY3RvclN0cm9uZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRUcnVlKCJMaW51eCBrZXJuZWwgbXVzdCBoYXZlIFN0YWNrIFByb3RlY3RvciBlbmFibGVkOiAiICsKKyAgICAgICAgICAgICAgICAiQ09ORklHX1NUQUNLUFJPVEVDVE9SX1NUUk9ORz15IG9yIENPTkZJR19DQ19TVEFDS1BST1RFQ1RPUl9TVFJPTkc9eSIsCisgICAgICAgICAgICAgICAgY29uZmlnU2V0LmNvbnRhaW5zKCJDT05GSUdfU1RBQ0tQUk9URUNUT1JfU1RST05HPXkiKSB8fAorICAgICAgICAgICAgICAgIGNvbmZpZ1NldC5jb250YWlucygiQ09ORklHX0NDX1NUQUNLUFJPVEVDVE9SX1NUUk9ORz15IikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhhdCB0aGUga2VybmVsJ3MgZXhlY3V0YWJsZSBjb2RlIGlzIHJlYWQtb25seSwgcmVhZC1vbmx5IGRhdGEgaXMgbm9uLWV4ZWN1dGFibGUgYW5kCisgICAgICogbm9uLXdyaXRhYmxlLCBhbmQgd3JpdGFibGUgZGF0YSBpcyBub24tZXhlY3V0YWJsZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjkuNy9DLTAtOCIpCisgICAgcHVibGljIHZvaWQgdGVzdENvbmZpZ1JPRGF0YSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoY29uZmlnU2V0LmNvbnRhaW5zKCJDT05GSUdfVUhfUktQPXkiKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBhc3NlcnRUcnVlKCJMaW51eCBrZXJuZWwgbXVzdCBoYXZlIFJPIGRhdGEgZW5hYmxlZDogIiArCisgICAgICAgICAgICAgICAgIkNPTkZJR19ERUJVR19ST0RBVEE9eSBvciBDT05GSUdfU1RSSUNUX0tFUk5FTF9SV1g9eSIsCisgICAgICAgICAgICAgICAgY29uZmlnU2V0LmNvbnRhaW5zKCJDT05GSUdfREVCVUdfUk9EQVRBPXkiKSB8fAorICAgICAgICAgICAgICAgIGNvbmZpZ1NldC5jb250YWlucygiQ09ORklHX1NUUklDVF9LRVJORUxfUldYPXkiKSk7CisKKyAgICAgICAgaWYgKGNvbmZpZ1NldC5jb250YWlucygiQ09ORklHX01PRFVMRVM9eSIpKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJMaW51eCBrZXJuZWwgbW9kdWxlcyBtdXN0IGFsc28gaGF2ZSBSTyBkYXRhIGVuYWJsZWQ6ICIgKworICAgICAgICAgICAgICAgICAgICAiQ09ORklHX0RFQlVHX1NFVF9NT0RVTEVfUk9OWD15IG9yIENPTkZJR19TVFJJQ1RfTU9EVUxFX1JXWD15IiwKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnU2V0LmNvbnRhaW5zKCJDT05GSUdfREVCVUdfU0VUX01PRFVMRV9ST05YPXkiKSB8fAorICAgICAgICAgICAgICAgICAgICBjb25maWdTZXQuY29udGFpbnMoIkNPTkZJR19TVFJJQ1RfTU9EVUxFX1JXWD15IikpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0aGF0IHRoZSBrZXJuZWwgaW1wbGVtZW50cyBzdGF0aWMgYW5kIGR5bmFtaWMgb2JqZWN0IHNpemUgYm91bmRzIGNoZWNraW5nIG9mIGNvcGllcworICAgICAqIGJldHdlZW4gdXNlci1zcGFjZSBhbmQga2VybmVsLXNwYWNlLgorICAgICAqCisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iOS43IikKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uZmlnSGFyZGVuZWRVc2VyY29weSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoUHJvcGVydHlVdGlsLmdldEZpcnN0QXBpTGV2ZWwobURldmljZSkgPCAyOCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiTGludXgga2VybmVsIG11c3QgaGF2ZSBIYXJkZW5lZCBVc2VyY29weSBlbmFibGVkOiBDT05GSUdfSEFSREVORURfVVNFUkNPUFk9eSIsCisgICAgICAgICAgICAgICAgY29uZmlnU2V0LmNvbnRhaW5zKCJDT05GSUdfSEFSREVORURfVVNFUkNPUFk9eSIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoYXQgdGhlIGtlcm5lbCBoYXMgUEFOIGVtdWxhdGlvbiBlbmFibGVkIGZyb20gYXJjaGl0ZWN0dXJlcyB0aGF0IHN1cHBvcnQgaXQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI5LjciKQorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25maWdQQU4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKFByb3BlcnR5VXRpbC5nZXRGaXJzdEFwaUxldmVsKG1EZXZpY2UpIDwgMjgpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChDcHVGZWF0dXJlcy5pc0FybTY0KG1EZXZpY2UpKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJMaW51eCBrZXJuZWwgbXVzdCBoYXZlIFBBTiBlbXVsYXRpb24gZW5hYmxlZDogIiArCisgICAgICAgICAgICAgICAgICAgICJDT05GSUdfQVJNNjRfU1dfVFRCUjBfUEFOPXkgb3IgQ09ORklHX0FSTTY0X1BBTj15IiwKKyAgICAgICAgICAgICAgICAgICAgKGNvbmZpZ1NldC5jb250YWlucygiQ09ORklHX0FSTTY0X1NXX1RUQlIwX1BBTj15IikgfHwKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnU2V0LmNvbnRhaW5zKCJDT05GSUdfQVJNNjRfUEFOPXkiKSkpOworICAgICAgICB9IGVsc2UgaWYgKENwdUZlYXR1cmVzLmlzQXJtMzIobURldmljZSkpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkxpbnV4IGtlcm5lbCBtdXN0IGhhdmUgUEFOIGVtdWxhdGlvbiBlbmFibGVkOiBDT05GSUdfQ1BVX1NXX0RPTUFJTl9QQU49eSIsCisgICAgICAgICAgICAgICAgICAgIGNvbmZpZ1NldC5jb250YWlucygiQ09ORklHX0NQVV9TV19ET01BSU5fUEFOPXkiKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoYXQgdGhlIGtlcm5lbCBoYXMgS1RQSSBlbmFibGVkIGZvciBhcmNoaXRlY3R1cmVzIGFuZCBrZXJuZWwgdmVyc2lvbnMgdGhhdCBzdXBwb3J0IGl0LgorICAgICAqCisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iOS43IikKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uZmlnS1RQSSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoUHJvcGVydHlVdGlsLmdldEZpcnN0QXBpTGV2ZWwobURldmljZSkgPCAyOCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKENwdUZlYXR1cmVzLmlzQXJtNjQobURldmljZSkgJiYgIUNwdUZlYXR1cmVzLmtlcm5lbFZlcnNpb25MZXNzVGhhbihtRGV2aWNlLCA0LCA0KSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiTGludXgga2VybmVsIG11c3QgaGF2ZSBLUFRJIGVuYWJsZWQ6IENPTkZJR19VTk1BUF9LRVJORUxfQVRfRUwwPXkiLAorICAgICAgICAgICAgICAgICAgICBjb25maWdTZXQuY29udGFpbnMoIkNPTkZJR19VTk1BUF9LRVJORUxfQVRfRUwwPXkiKSk7CisgICAgICAgIH0gZWxzZSBpZiAoQ3B1RmVhdHVyZXMuaXNYODYobURldmljZSkpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkxpbnV4IGtlcm5lbCBtdXN0IGhhdmUgS1BUSSBlbmFibGVkOiBDT05GSUdfUEFHRV9UQUJMRV9JU09MQVRJT049eSIsCisgICAgICAgICAgICAgICAgICAgIGNvbmZpZ1NldC5jb250YWlucygiQ09ORklHX1BBR0VfVEFCTEVfSVNPTEFUSU9OPXkiKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5L3NyYy9hbmRyb2lkL3NlY3VyaXR5L2N0cy9TRUxpbnV4SG9zdFRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHkvc3JjL2FuZHJvaWQvc2VjdXJpdHkvY3RzL1NFTGludXhIb3N0VGVzdC5qYXZhCmluZGV4IDMxNzBlY2UuLmIzMmEwNTQgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHkvc3JjL2FuZHJvaWQvc2VjdXJpdHkvY3RzL1NFTGludXhIb3N0VGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHkvc3JjL2FuZHJvaWQvc2VjdXJpdHkvY3RzL1NFTGludXhIb3N0VGVzdC5qYXZhCkBAIC01Miw2ICs1MiwxMSBAQAogaW1wb3J0IGphdmEudXRpbC5TY2FubmVyOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworCiAvKioKICAqIEhvc3Qtc2lkZSBTRUxpbnV4IHRlc3RzLgogICoKQEAgLTU5LDEwICs2NCwxMyBAQAogICogcnVuIGFzIHRoZSBzaGVsbCB1c2VyIHRvIGV2YWx1YXRlIGFzcGVjdHMgb2YgdGhlIHN0YXRlIG9mIFNFTGludXggb24gdGhlIHRlc3QKICAqIGRldmljZSB3aGljaCBvdGhlcndpc2Ugd291bGQgbm90IGJlIGF2YWlsYWJsZSB0byBhIG5vcm1hbCBhcGsuCiAgKi8KLUBDZGRUZXN0KHJlcXVpcmVtZW50PSI5LjcvQy0xLTEiKQogcHVibGljIGNsYXNzIFNFTGludXhIb3N0VGVzdCBleHRlbmRzIERldmljZVRlc3RDYXNlIGltcGxlbWVudHMgSUJ1aWxkUmVjZWl2ZXIsIElEZXZpY2VUZXN0IHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxJVGVzdERldmljZSwgRmlsZT4gY2FjaGVkRGV2aWNlUG9saWN5RmlsZXMgPSBuZXcgSGFzaE1hcDw+KDEpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxJVGVzdERldmljZSwgRmlsZT4gY2FjaGVkRGV2aWNlUGxhdEZjRmlsZXMgPSBuZXcgSGFzaE1hcDw+KDEpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxJVGVzdERldmljZSwgRmlsZT4gY2FjaGVkRGV2aWNlTm9ucGxhdEZjRmlsZXMgPSBuZXcgSGFzaE1hcDw+KDEpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxJVGVzdERldmljZSwgRmlsZT4gY2FjaGVkRGV2aWNlVmVuZG9yTWFuaWZlc3QgPSBuZXcgSGFzaE1hcDw+KDEpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxJVGVzdERldmljZSwgRmlsZT4gY2FjaGVkRGV2aWNlU3lzdGVtUG9saWN5ID0gbmV3IEhhc2hNYXA8PigxKTsKIAogICAgIHByaXZhdGUgRmlsZSBzZXBvbGljeUFuYWx5emU7CiAgICAgcHJpdmF0ZSBGaWxlIGNoZWNrU2VhcHA7CkBAIC03OSw2ICs4Nyw5IEBACiAgICAgcHJpdmF0ZSBGaWxlIGRldmljZVBjRmlsZTsKICAgICBwcml2YXRlIEZpbGUgZGV2aWNlU3ZjRmlsZTsKICAgICBwcml2YXRlIEZpbGUgc2VhcHBOZXZlckFsbG93RmlsZTsKKyAgICBwcml2YXRlIEZpbGUgbGlic2Vwb2x3cmFwOworICAgIHByaXZhdGUgRmlsZSBsaWJjcHA7CisgICAgcHJpdmF0ZSBGaWxlIHNlcG9saWN5VGVzdHM7CiAKICAgICBwcml2YXRlIElCdWlsZEluZm8gbUJ1aWxkOwogCkBAIC0xMDQsMTMgKzExNSwxNSBAQAogICAgICAgICBtRGV2aWNlID0gZGV2aWNlOwogICAgIH0KIAotICAgIHByaXZhdGUgRmlsZSBjb3B5UmVzb3VyY2VUb1RlbXBGaWxlKFN0cmluZyByZXNOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKHJlc05hbWUpOworICAgIHB1YmxpYyBzdGF0aWMgRmlsZSBjb3B5UmVzb3VyY2VUb1RlbXBGaWxlKFN0cmluZyByZXNOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IFNFTGludXhIb3N0VGVzdC5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKHJlc05hbWUpOwogICAgICAgICBGaWxlIHRlbXBGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiU0VMaW51eEhvc3RUZXN0IiwgIi50bXAiKTsKICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRlbXBGaWxlKTsKLSAgICAgICAgaW50IHJCeXRlID0gMDsKLSAgICAgICAgd2hpbGUgKChyQnl0ZSA9IGlzLnJlYWQoKSkgIT0gLTEpIHsKLSAgICAgICAgICAgIG9zLndyaXRlKHJCeXRlKTsKKyAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzEwMjRdOworICAgICAgICBpbnQgbGVuOworCisgICAgICAgIHdoaWxlICgobGVuID0gaXMucmVhZChidWYpKSAhPSAtMSkgeworICAgICAgICAgICAgb3Mud3JpdGUoYnVmLCAwLCBsZW4pOwogICAgICAgICB9CiAgICAgICAgIG9zLmZsdXNoKCk7CiAgICAgICAgIG9zLmNsb3NlKCk7CkBAIC0xMzgsNiArMTUxLDk4IEBACiAgICAgICAgIHNlcG9saWN5QW5hbHl6ZS5zZXRFeGVjdXRhYmxlKHRydWUpOwogCiAgICAgICAgIGRldmljZVBvbGljeUZpbGUgPSBnZXREZXZpY2VQb2xpY3lGaWxlKG1EZXZpY2UpOworICAgICAgICBpZiAoaXNTZXBvbGljeVNwbGl0KG1EZXZpY2UpKSB7CisgICAgICAgICAgICBkZXZpY2VQbGF0RmNGaWxlID0gZ2V0RGV2aWNlRmlsZShtRGV2aWNlLCBjYWNoZWREZXZpY2VQbGF0RmNGaWxlcywKKyAgICAgICAgICAgICAgICAgICAgIi9zeXN0ZW0vZXRjL3NlbGludXgvcGxhdF9maWxlX2NvbnRleHRzIiwgInBsYXRfZmlsZV9jb250ZXh0cyIpOworICAgICAgICAgICAgaWYgKG1EZXZpY2UuZG9lc0ZpbGVFeGlzdCgiL3ZlbmRvci9ldGMvc2VsaW51eC9ub25wbGF0X2ZpbGVfY29udGV4dHMiKSl7CisgICAgICAgICAgICAgICAgLy8gT2xkIG5vbnBsYXRfKiBuYW1pbmcgY2FuIGJlIHByZXNlbnQgaWYgYSBmcmFtZXdvcmstb25seSBPVEEgd2FzIGRvbmUuCisgICAgICAgICAgICAgICAgZGV2aWNlTm9ucGxhdEZjRmlsZSA9IGdldERldmljZUZpbGUobURldmljZSwgY2FjaGVkRGV2aWNlTm9ucGxhdEZjRmlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAiL3ZlbmRvci9ldGMvc2VsaW51eC9ub25wbGF0X2ZpbGVfY29udGV4dHMiLCAibm9ucGxhdF9maWxlX2NvbnRleHRzIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRldmljZU5vbnBsYXRGY0ZpbGUgPSBnZXREZXZpY2VGaWxlKG1EZXZpY2UsIGNhY2hlZERldmljZU5vbnBsYXRGY0ZpbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIi92ZW5kb3IvZXRjL3NlbGludXgvdmVuZG9yX2ZpbGVfY29udGV4dHMiLCAidmVuZG9yX2ZpbGVfY29udGV4dHMiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRldmljZVBsYXRGY0ZpbGUgPSBnZXREZXZpY2VGaWxlKG1EZXZpY2UsIGNhY2hlZERldmljZVBsYXRGY0ZpbGVzLAorICAgICAgICAgICAgICAgICAgICAiL3BsYXRfZmlsZV9jb250ZXh0cyIsICJwbGF0X2ZpbGVfY29udGV4dHMiKTsKKyAgICAgICAgICAgIGRldmljZU5vbnBsYXRGY0ZpbGUgPSBnZXREZXZpY2VGaWxlKG1EZXZpY2UsIGNhY2hlZERldmljZU5vbnBsYXRGY0ZpbGVzLAorICAgICAgICAgICAgICAgICAgICAiL3ZlbmRvcl9maWxlX2NvbnRleHRzIiwgInZlbmRvcl9maWxlX2NvbnRleHRzIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIElNUExFTUVOVEFUSU9OIERFVEFJTFM6IFdlIGNhY2hlIHNvbWUgaG9zdC1zaWRlIHBvbGljeSBmaWxlcyBvbiBwZXItZGV2aWNlIGJhc2lzIChpbiBjYXNlCisgICAgICogQ1RTIHN1cHBvcnRzIHJ1bm5pbmcgYWdhaW5zdCBtdWx0aXBsZSBkZXZpY2VzIGF0IHRoZSBzYW1lIHRpbWUpLiBIYXNoTWFwIGlzIHVzZWQgaW5zdGVhZAorICAgICAqIG9mIFdlYWtIYXNoTWFwIGJlY2F1c2UgaW4gdGhlIGdyYW5kIHNjaGVtZSBvZiB0aGluZ3MsIGtlZXBpbmcgSVRlc3REZXZpY2UgYW5kCisgICAgICogY29ycmVzcG9uZGluZyBGaWxlIG9iamVjdHMgZnJvbSBiZWluZyBnYXJiYWdlLWNvbGxlY3RlZCBpcyBub3QgYSBiaWcgZGVhbCBpbiBDVFMuIElmIHRoaXMKKyAgICAgKiBiZWNvbWVzIGEgYmlnIGRlYWwsIHRoaXMgY2FuIGJlIHN3aXRjaGVkIHRvIFdlYWtIYXNoTWFwLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIEZpbGUgZ2V0RGV2aWNlRmlsZShJVGVzdERldmljZSBkZXZpY2UsCisgICAgICAgICAgICBNYXA8SVRlc3REZXZpY2UsIEZpbGU+IGNhY2hlLCBTdHJpbmcgZGV2aWNlRmlsZVBhdGgsCisgICAgICAgICAgICBTdHJpbmcgdG1wRmlsZU5hbWUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIWRldmljZS5kb2VzRmlsZUV4aXN0KGRldmljZUZpbGVQYXRoKSl7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgRmlsZSBmaWxlOworICAgICAgICBzeW5jaHJvbml6ZWQgKGNhY2hlKSB7CisgICAgICAgICAgICBmaWxlID0gY2FjaGUuZ2V0KGRldmljZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZpbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZpbGU7CisgICAgICAgIH0KKyAgICAgICAgZmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUodG1wRmlsZU5hbWUsICIudG1wIik7CisgICAgICAgIGZpbGUuZGVsZXRlT25FeGl0KCk7CisgICAgICAgIGRldmljZS5wdWxsRmlsZShkZXZpY2VGaWxlUGF0aCwgZmlsZSk7CisgICAgICAgIHN5bmNocm9uaXplZCAoY2FjaGUpIHsKKyAgICAgICAgICAgIGNhY2hlLnB1dChkZXZpY2UsIGZpbGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmaWxlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEZpbGUgYnVpbGRTeXN0ZW1Qb2xpY3koSVRlc3REZXZpY2UgZGV2aWNlLCBNYXA8SVRlc3REZXZpY2UsIEZpbGU+IGNhY2hlLAorICAgICAgICAgICAgU3RyaW5nIHRtcEZpbGVOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSBidWlsdFBvbGljeUZpbGU7CisgICAgICAgIHN5bmNocm9uaXplZCAoY2FjaGUpIHsKKyAgICAgICAgICAgIGJ1aWx0UG9saWN5RmlsZSA9IGNhY2hlLmdldChkZXZpY2UpOworICAgICAgICB9CisgICAgICAgIGlmIChidWlsdFBvbGljeUZpbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGJ1aWx0UG9saWN5RmlsZTsKKyAgICAgICAgfQorCisKKyAgICAgICAgYnVpbHRQb2xpY3lGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSh0bXBGaWxlTmFtZSwgIi50bXAiKTsKKyAgICAgICAgYnVpbHRQb2xpY3lGaWxlLmRlbGV0ZU9uRXhpdCgpOworCisgICAgICAgIEZpbGUgc2VjaWxjID0gY29weVJlc291cmNlVG9UZW1wRmlsZSgiL3NlY2lsYyIpOworICAgICAgICBzZWNpbGMuc2V0RXhlY3V0YWJsZSh0cnVlKTsKKworICAgICAgICBGaWxlIHN5c3RlbVNlcG9saWN5Q2lsRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoInBsYXRfc2Vwb2xpY3kiLCAiLmNpbCIpOworICAgICAgICBzeXN0ZW1TZXBvbGljeUNpbEZpbGUuZGVsZXRlT25FeGl0KCk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShkZXZpY2UucHVsbEZpbGUoIi9zeXN0ZW0vZXRjL3NlbGludXgvcGxhdF9zZXBvbGljeS5jaWwiLCBzeXN0ZW1TZXBvbGljeUNpbEZpbGUpKTsKKworICAgICAgICBQcm9jZXNzQnVpbGRlciBwYiA9IG5ldyBQcm9jZXNzQnVpbGRlcigKKyAgICAgICAgICAgIHNlY2lsYy5nZXRBYnNvbHV0ZVBhdGgoKSwKKyAgICAgICAgICAgICItbSIsICItTSIsICJ0cnVlIiwgIi1jIiwgIjMwIiwKKyAgICAgICAgICAgICItbyIsIGJ1aWx0UG9saWN5RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwKKyAgICAgICAgICAgIHN5c3RlbVNlcG9saWN5Q2lsRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgIHBiLnJlZGlyZWN0T3V0cHV0KFByb2Nlc3NCdWlsZGVyLlJlZGlyZWN0LlBJUEUpOworICAgICAgICBwYi5yZWRpcmVjdEVycm9yU3RyZWFtKHRydWUpOworICAgICAgICBQcm9jZXNzIHAgPSBwYi5zdGFydCgpOworICAgICAgICBwLndhaXRGb3IoKTsKKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgcmVzdWx0ID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihwLmdldElucHV0U3RyZWFtKCkpKTsKKyAgICAgICAgU3RyaW5nIGxpbmU7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgZXJyb3JTdHJpbmcgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICB3aGlsZSAoKGxpbmUgPSByZXN1bHQucmVhZExpbmUoKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgZXJyb3JTdHJpbmcuYXBwZW5kKGxpbmUpOworICAgICAgICAgICAgZXJyb3JTdHJpbmcuYXBwZW5kKCJcbiIpOworICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoZXJyb3JTdHJpbmcudG9TdHJpbmcoKSwgZXJyb3JTdHJpbmcubGVuZ3RoKCkgPT0gMCk7CisKKyAgICAgICAgc3luY2hyb25pemVkIChjYWNoZSkgeworICAgICAgICAgICAgY2FjaGUucHV0KGRldmljZSwgYnVpbHRQb2xpY3lGaWxlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVpbHRQb2xpY3lGaWxlOwogICAgIH0KIAogICAgIC8vIE5PVEU6IGN0cy90b29scy9zZWxpbnV4IGRlcGVuZHMgb24gdGhpcyBtZXRob2QuIFJlbmFtZS9jaGFuZ2Ugd2l0aCBjYXV0aW9uLgpAQCAtMTQ1LDI1ICsyNTAsMzggQEAKICAgICAgKiBSZXR1cm5zIHRoZSBob3N0LXNpZGUgZmlsZSBjb250YWluaW5nIHRoZSBTRUxpbnV4IHBvbGljeSBvZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBGaWxlIGdldERldmljZVBvbGljeUZpbGUoSVRlc3REZXZpY2UgZGV2aWNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gSU1QTEVNRU5UQVRJT04gREVUQUlMUzogV2UgY2FjaGUgdGhlIGhvc3Qtc2lkZSBwb2xpY3kgZmlsZSBvbiBwZXItZGV2aWNlIGJhc2lzIChpbiBjYXNlCi0gICAgICAgIC8vIENUUyBzdXBwb3J0cyBydW5uaW5nIGFnYWluc3QgbXVsdGlwbGUgZGV2aWNlcyBhdCB0aGUgc2FtZSB0aW1lKS4gSGFzaE1hcCBpcyB1c2VkIGluc3RlYWQKLSAgICAgICAgLy8gb2YgV2Vha0hhc2hNYXAgYmVjYXVzZSBpbiB0aGUgZ3JhbmQgc2NoZW1lIG9mIHRoaW5ncywga2VlcGluZyBJVGVzdERldmljZSBhbmQKLSAgICAgICAgLy8gY29ycmVzcG9uZGluZyBGaWxlIG9iamVjdHMgZnJvbSBiZWluZyBnYXJiYWdlLWNvbGxlY3RlZCBpcyBub3QgYSBiaWcgZGVhbCBpbiBDVFMuIElmIHRoaXMKLSAgICAgICAgLy8gYmVjb21lcyBhIGJpZyBkZWFsLCB0aGlzIGNhbiBiZSBzd2l0Y2hlZCB0byBXZWFrSGFzaE1hcC4KLSAgICAgICAgRmlsZSBmaWxlOwotICAgICAgICBzeW5jaHJvbml6ZWQgKGNhY2hlZERldmljZVBvbGljeUZpbGVzKSB7Ci0gICAgICAgICAgICBmaWxlID0gY2FjaGVkRGV2aWNlUG9saWN5RmlsZXMuZ2V0KGRldmljZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZpbGU7Ci0gICAgICAgIH0KLSAgICAgICAgZmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoInNlcG9saWN5IiwgIi50bXAiKTsKLSAgICAgICAgZmlsZS5kZWxldGVPbkV4aXQoKTsKLSAgICAgICAgZGV2aWNlLnB1bGxGaWxlKCIvc3lzL2ZzL3NlbGludXgvcG9saWN5IiwgZmlsZSk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoY2FjaGVkRGV2aWNlUG9saWN5RmlsZXMpIHsKLSAgICAgICAgICAgIGNhY2hlZERldmljZVBvbGljeUZpbGVzLnB1dChkZXZpY2UsIGZpbGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmaWxlOworICAgICAgICByZXR1cm4gZ2V0RGV2aWNlRmlsZShkZXZpY2UsIGNhY2hlZERldmljZVBvbGljeUZpbGVzLCAiL3N5cy9mcy9zZWxpbnV4L3BvbGljeSIsICJzZXBvbGljeSIpOworICAgIH0KKworICAgIC8vIE5PVEU6IGN0cy90b29scy9zZWxpbnV4IGRlcGVuZHMgb24gdGhpcyBtZXRob2QuIFJlbmFtZS9jaGFuZ2Ugd2l0aCBjYXV0aW9uLgorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGhvc3Qtc2lkZSBmaWxlIGNvbnRhaW5pbmcgdGhlIHN5c3RlbSBTRUxpbnV4IHBvbGljeSBvZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBGaWxlIGdldERldmljZVN5c3RlbVBvbGljeUZpbGUoSVRlc3REZXZpY2UgZGV2aWNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGJ1aWxkU3lzdGVtUG9saWN5KGRldmljZSwgY2FjaGVkRGV2aWNlU3lzdGVtUG9saWN5LCAic3lzdGVtX3NlcG9saWN5Iik7CisgICAgfQorCisgICAgLy8gTk9URTogY3RzL3Rvb2xzL3NlbGludXggZGVwZW5kcyBvbiB0aGlzIG1ldGhvZC4gUmVuYW1lL2NoYW5nZSB3aXRoIGNhdXRpb24uCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbWFqb3IgbnVtYmVyIG9mIHNlcG9saWN5IHZlcnNpb24gb2YgZGV2aWNlJ3MgdmVuZG9yIGltcGxlbWVudGF0aW9uLgorICAgICAqIFRPRE8oYi8zNzk5OTIxMik6IFVzZSBWSU5URiBvYmplY3QgQVBJIGluc3RlYWQgb2YgcGFyc2luZyB2ZW5kb3IgbWFuaWZlc3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0VmVuZG9yU2Vwb2xpY3lWZXJzaW9uKElUZXN0RGV2aWNlIGRldmljZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBkZXZpY2VNYW5pZmVzdFBhdGggPQorICAgICAgICAgICAgICAgIChkZXZpY2UuZG9lc0ZpbGVFeGlzdCgiL3ZlbmRvci9ldGMvdmludGYvbWFuaWZlc3QueG1sIikpID8KKyAgICAgICAgICAgICAgICAiL3ZlbmRvci9ldGMvdmludGYvbWFuaWZlc3QueG1sIiA6CisgICAgICAgICAgICAgICAgIi92ZW5kb3IvbWFuaWZlc3QueG1sIjsKKyAgICAgICAgRmlsZSB2ZW5kb3JNYW5pZmVzdEZpbGUgPSBnZXREZXZpY2VGaWxlKGRldmljZSwgY2FjaGVkRGV2aWNlVmVuZG9yTWFuaWZlc3QsCisgICAgICAgICAgICAgICAgZGV2aWNlTWFuaWZlc3RQYXRoLCAibWFuaWZlc3QueG1sIik7CisKKyAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkYmYgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgIERvY3VtZW50QnVpbGRlciBkYiA9IGRiZi5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKyAgICAgICAgRG9jdW1lbnQgZG9jID0gZGIucGFyc2UodmVuZG9yTWFuaWZlc3RGaWxlKTsKKyAgICAgICAgRWxlbWVudCByb290ID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpOworICAgICAgICBFbGVtZW50IHNlcG9saWN5ID0gKEVsZW1lbnQpIHJvb3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNlcG9saWN5IikuaXRlbSgwKTsKKyAgICAgICAgRWxlbWVudCB2ZXJzaW9uID0gKEVsZW1lbnQpIHNlcG9saWN5LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2ZXJzaW9uIikuaXRlbSgwKTsKKyAgICAgICAgU3RyaW5nIHNlcG9saWN5VmVyc2lvbiA9IHZlcnNpb24uZ2V0VGV4dENvbnRlbnQoKS5zcGxpdCgiXFwuIilbMF07CisgICAgICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHNlcG9saWN5VmVyc2lvbik7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNzEsNyArMjg5LDcgQEAKICAgICAgKgogICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCiAgICAgICovCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjkuNy9DLTEtMiIpCisgICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjkuNyIpCiAgICAgcHVibGljIHZvaWQgdGVzdEdsb2JhbEVuZm9yY2luZygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBDb2xsZWN0aW5nT3V0cHV0UmVjZWl2ZXIgb3V0ID0gbmV3IENvbGxlY3RpbmdPdXRwdXRSZWNlaXZlcigpOwogICAgICAgICBtRGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoImNhdCAvc3lzL2ZzL3NlbGludXgvZW5mb3JjZSIsIG91dCk7CkBAIC0xODMsNyArMzAxLDcgQEAKICAgICAgKgogICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCiAgICAgICovCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjkuNy9DLTEtMyIpCisgICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjkuNyIpCiAgICAgQFJlc3RyaWN0ZWRCdWlsZFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWxsRG9tYWluc0VuZm9yY2luZygpIHRocm93cyBFeGNlcHRpb24gewogCkBAIC0yNjgsMTMgKzM4NiwzNCBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Z1bGxUcmVibGVEZXZpY2UoSVRlc3REZXZpY2UgZGV2aWNlKQogICAgICAgICAgICAgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBQcm9wZXJ0eVV0aWwuZ2V0Rmlyc3RBcGlMZXZlbChkZXZpY2UpID4gMjY7CisgICAgICAgIHJldHVybiBQcm9wZXJ0eVV0aWwuZ2V0Rmlyc3RBcGlMZXZlbChkZXZpY2UpID4gMjYgJiYKKyAgICAgICAgICAgICAgICBQcm9wZXJ0eVV0aWwucHJvcGVydHlFcXVhbHMoZGV2aWNlLCAicm8udHJlYmxlLmVuYWJsZWQiLCAidHJ1ZSIpOwogICAgIH0KIAogICAgIHByaXZhdGUgYm9vbGVhbiBpc0Z1bGxUcmVibGVEZXZpY2UoKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIGlzRnVsbFRyZWJsZURldmljZShtRGV2aWNlKTsKICAgICB9CiAKKyAgICAvLyBOT1RFOiBjdHMvdG9vbHMvc2VsaW51eCBkZXBlbmRzIG9uIHRoaXMgbWV0aG9kLiBSZW5hbWUvY2hhbmdlIHdpdGggY2F1dGlvbi4KKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIGRldmljZSBpcyByZXF1aXJlZCB0byBlbmZvcmNlIGNvbXBhdGlibGUgcHJvcGVydHkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ29tcGF0aWJsZVByb3BlcnR5RW5mb3JjZWREZXZpY2UoSVRlc3REZXZpY2UgZGV2aWNlKQorICAgICAgICAgICAgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBQcm9wZXJ0eVV0aWwucHJvcGVydHlFcXVhbHMoCisgICAgICAgICAgICAgICAgZGV2aWNlLCAicm8uYWN0aW9uYWJsZV9jb21wYXRpYmxlX3Byb3BlcnR5LmVuYWJsZWQiLCAidHJ1ZSIpOworICAgIH0KKworICAgIC8vIE5PVEU6IGN0cy90b29scy9zZWxpbnV4IGRlcGVuZHMgb24gdGhpcyBtZXRob2QuIFJlbmFtZS9jaGFuZ2Ugd2l0aCBjYXV0aW9uLgorICAgIC8qKgorICAgICAqIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgZGV2aWNlIGhhcyBzZXBvbGljeSBzcGxpdCBhY3Jvc3MgZGlmZmVyZW50IHBhcml0aW9ucy4KKyAgICAgKiBUaGlzIGlzIHBvc3NpYmxlIGV2ZW4gZm9yIGRldmljZXMgbGF1bmNoZWQgYXQgYXBpIGxldmVsIGhpZ2hlciB0aGFuIDI2LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NlcG9saWN5U3BsaXQoSVRlc3REZXZpY2UgZGV2aWNlKQorICAgICAgICAgICAgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBkZXZpY2UuZG9lc0ZpbGVFeGlzdCgiL3N5c3RlbS9ldGMvc2VsaW51eC9wbGF0X2ZpbGVfY29udGV4dHMiKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBBc3NlcnRzIHRoYXQgbm8gdmVuZG9yIGRvbWFpbnMgYXJlIGV4ZW1wdGVkIGZyb20gdGhlIHByb2hpYml0aW9uIG9uIEJpbmRlciB1c2UuCiAgICAgICoKQEAgLTI5Nyw2ICs0MzYsMjkgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBBc3NlcnRzIHRoYXQgbm8gSEFMIHNlcnZlciBkb21haW5zIGFyZSBleGVtcHRlZCBmcm9tIHRoZSBwcm9oaWJpdGlvbiBvZiBzb2NrZXQgdXNlIHdpdGggdGhlCisgICAgICogb25seSBleGNlcHRpb25zIGZvciB0aGUgYXV0b21vdGl2ZSBkZXZpY2UgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9FeGVtcHRpb25zRm9yU29ja2V0c1VzZVdpdGhpbkhhbFNlcnZlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIWlzRnVsbFRyZWJsZURldmljZSgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoZ2V0RGV2aWNlKCkuaGFzRmVhdHVyZSgiYW5kcm9pZC5oYXJkd2FyZS50eXBlLmF1dG9tb3RpdmUiKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgU2V0PFN0cmluZz4gdHlwZXMgPSBzZXBvbGljeUFuYWx5emVHZXRUeXBlc0Fzc29jaWF0ZWRXaXRoQXR0cmlidXRlKAorICAgICAgICAgICAgICAgICJoYWxfYXV0b21vdGl2ZV9zb2NrZXRfZXhlbXB0aW9uIik7CisgICAgICAgIGlmICghdHlwZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBMaXN0PFN0cmluZz4gc29ydGVkVHlwZXMgPSBuZXcgQXJyYXlMaXN0PD4odHlwZXMpOworICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChzb3J0ZWRUeXBlcyk7CisgICAgICAgICAgICBmYWlsKCJQb2xpY3kgZXhlbXB0cyBkb21haW5zIGZyb20gYmFuIG9uIHNvY2tldCB1c2FnZSBmcm9tIEhBTCBzZXJ2ZXJzOiAiCisgICAgICAgICAgICAgICAgICAgICsgc29ydGVkVHlwZXMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogQXNzZXJ0cyB0aGF0IG5vIGRvbWFpbnMgYXJlIGV4ZW1wdGVkIGZyb20gdGhlIHByb2hpYml0aW9uIG9uIGluaXRpYXRpbmcgc29ja2V0IGNvbW11bmljYXRpb25zCiAgICAgICogYmV0d2VlbiBjb3JlIGFuZCB2ZW5kb3IgZG9tYWlucy4KICAgICAgKgpAQCAtMzQ5LDcgKzUxMSw3IEBACiAgICAgICoKICAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgogICAgICAqLwotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI5LjcvQy0xLTQiKQorICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI5LjciKQogICAgIHB1YmxpYyB2b2lkIHRlc3RNTFNBdHRyaWJ1dGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGFzc2VydE5vdEluQXR0cmlidXRlKCJtbHN0cnVzdGVkc3ViamVjdCIsICJ1bnRydXN0ZWRfYXBwIik7CiAgICAgICAgIGFzc2VydE5vdEluQXR0cmlidXRlKCJtbHN0cnVzdGVkb2JqZWN0IiwgImFwcF9kYXRhX2ZpbGUiKTsKQEAgLTM2MCw3ICs1MjIsNyBAQAogICAgICAqCiAgICAgICogQHRocm93cyBFeGNlcHRpb24KICAgICAgKi8KLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iOS43L0MtMS00IikKKyAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iOS43IikKICAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRTZWFwcENvbnRleHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICAgICAgLyogb2J0YWluIHNlYXBwX2NvbnRleHRzIGZpbGUgZnJvbSBydW5uaW5nIGRldmljZSAqLwpAQCAtNDI4LDcgKzU5MCw3IEBACiAgICAgICoKICAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgogICAgICAqLwotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI5LjcvQy0xLTQiKQorICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI5LjciKQogICAgIHB1YmxpYyB2b2lkIHRlc3RBb3NwU2VhcHBDb250ZXh0cygpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIC8qIG9idGFpbiBzZWFwcF9jb250ZXh0cyBmaWxlIGZyb20gcnVubmluZyBkZXZpY2UgKi8KQEAgLTQ0OSwyMCArNjExLDEzIEBACiAgICAgICoKICAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgogICAgICAqLwotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI5LjcvQy0xLTQiKQorICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI5LjciKQogICAgIHB1YmxpYyB2b2lkIHRlc3RBb3NwRmlsZUNvbnRleHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICAgICAgLyogcmV0cmlldmUgdGhlIGNoZWNrZmMgZXhlY3V0YWJsZSBmcm9tIGphciAqLwogICAgICAgICBjaGVja0ZjID0gY29weVJlc291cmNlVG9UZW1wRmlsZSgiL2NoZWNrZmMiKTsKICAgICAgICAgY2hlY2tGYy5zZXRFeGVjdXRhYmxlKHRydWUpOwogCi0gICAgICAgIC8qIG9idGFpbiBmaWxlX2NvbnRleHRzIGZpbGUocykgZnJvbSBydW5uaW5nIGRldmljZSAqLwotICAgICAgICBkZXZpY2VQbGF0RmNGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiZmlsZV9jb250ZXh0cyIsICIudG1wIik7Ci0gICAgICAgIGRldmljZVBsYXRGY0ZpbGUuZGVsZXRlT25FeGl0KCk7Ci0gICAgICAgIGlmICghbURldmljZS5wdWxsRmlsZSgiL3N5c3RlbS9ldGMvc2VsaW51eC9wbGF0X2ZpbGVfY29udGV4dHMiLCBkZXZpY2VQbGF0RmNGaWxlKSkgewotICAgICAgICAgICAgbURldmljZS5wdWxsRmlsZSgiL3BsYXRfZmlsZV9jb250ZXh0cyIsIGRldmljZVBsYXRGY0ZpbGUpOwotICAgICAgICB9Ci0KICAgICAgICAgLyogcmV0cmlldmUgdGhlIEFPU1AgZmlsZV9jb250ZXh0cyBmaWxlIGZyb20gamFyICovCiAgICAgICAgIGFvc3BGY0ZpbGUgPSBjb3B5UmVzb3VyY2VUb1RlbXBGaWxlKCIvcGxhdF9maWxlX2NvbnRleHRzIik7CiAKQEAgLTQ4Nyw3ICs2NDIsNyBAQAogICAgICAqCiAgICAgICogQHRocm93cyBFeGNlcHRpb24KICAgICAgKi8KLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iOS43L0MtMS00IikKKyAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iOS43IikKICAgICBwdWJsaWMgdm9pZCB0ZXN0QW9zcFByb3BlcnR5Q29udGV4dHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogICAgICAgICAvKiBvYnRhaW4gcHJvcGVydHlfY29udGV4dHMgZmlsZSBmcm9tIHJ1bm5pbmcgZGV2aWNlICovCkBAIC01MTIsNyArNjY3LDcgQEAKICAgICAgKgogICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCiAgICAgICovCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjkuNy9DLTEtNCIpCisgICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjkuNyIpCiAgICAgcHVibGljIHZvaWQgdGVzdEFvc3BTZXJ2aWNlQ29udGV4dHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogICAgICAgICAvKiBvYnRhaW4gc2VydmljZV9jb250ZXh0cyBmaWxlIGZyb20gcnVubmluZyBkZXZpY2UgKi8KQEAgLTUzMywzMSArNjg4LDIzIEBACiAgICAgICoKICAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgogICAgICAqLwotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI5LjcvQy0xLTQiKQorICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI5LjciKQogICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZEZpbGVDb250ZXh0cygpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIC8qIHJldHJpZXZlIHRoZSBjaGVja2ZjIGV4ZWN1dGFibGUgZnJvbSBqYXIgKi8KICAgICAgICAgY2hlY2tGYyA9IGNvcHlSZXNvdXJjZVRvVGVtcEZpbGUoIi9jaGVja2ZjIik7CiAgICAgICAgIGNoZWNrRmMuc2V0RXhlY3V0YWJsZSh0cnVlKTsKIAotICAgICAgICAvKiBvYnRhaW4gZmlsZV9jb250ZXh0cyBmaWxlKHMpIGZyb20gcnVubmluZyBkZXZpY2UgKi8KLSAgICAgICAgZGV2aWNlUGxhdEZjRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoInBsYXRfZmlsZV9jb250ZXh0cyIsICIudG1wIik7Ci0gICAgICAgIGRldmljZVBsYXRGY0ZpbGUuZGVsZXRlT25FeGl0KCk7Ci0gICAgICAgIGRldmljZU5vbnBsYXRGY0ZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJub25wbGF0X2ZpbGVfY29udGV4dHMiLCAiLnRtcCIpOwotICAgICAgICBkZXZpY2VOb25wbGF0RmNGaWxlLmRlbGV0ZU9uRXhpdCgpOwotICAgICAgICBpZiAobURldmljZS5wdWxsRmlsZSgiL3N5c3RlbS9ldGMvc2VsaW51eC9wbGF0X2ZpbGVfY29udGV4dHMiLCBkZXZpY2VQbGF0RmNGaWxlKSkgewotICAgICAgICAgICAgbURldmljZS5wdWxsRmlsZSgiL3ZlbmRvci9ldGMvc2VsaW51eC9ub25wbGF0X2ZpbGVfY29udGV4dHMiLCBkZXZpY2VOb25wbGF0RmNGaWxlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1EZXZpY2UucHVsbEZpbGUoIi9wbGF0X2ZpbGVfY29udGV4dHMiLCBkZXZpY2VQbGF0RmNGaWxlKTsKLSAgICAgICAgICAgIG1EZXZpY2UucHVsbEZpbGUoIi9ub25wbGF0X2ZpbGVfY29udGV4dHMiLCBkZXZpY2VOb25wbGF0RmNGaWxlKTsKLSAgICAgICAgfQotICAgICAgICBhcHBlbmRUbyhkZXZpY2VQbGF0RmNGaWxlLmdldEFic29sdXRlUGF0aCgpLAotICAgICAgICAgICAgICAgIGRldmljZU5vbnBsYXRGY0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAvKiBjb21iaW5lIHBsYXQgYW5kIG5vbnBsYXQgcG9saWNpZXMgZm9yIHRlc3RpbmcgKi8KKyAgICAgICAgRmlsZSBjb21iaW5lZEZjRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoImNvbWJpbmVkX2ZpbGVfY29udGV4dCIsICIudG1wIik7CisgICAgICAgIGNvbWJpbmVkRmNGaWxlLmRlbGV0ZU9uRXhpdCgpOworICAgICAgICBhcHBlbmRUbyhjb21iaW5lZEZjRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgZGV2aWNlUGxhdEZjRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgIGFwcGVuZFRvKGNvbWJpbmVkRmNGaWxlLmdldEFic29sdXRlUGF0aCgpLCBkZXZpY2VOb25wbGF0RmNGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKIAogICAgICAgICAvKiBydW4gY2hlY2tmYyBzZXBvbGljeSBmaWxlX2NvbnRleHRzICovCiAgICAgICAgIFByb2Nlc3NCdWlsZGVyIHBiID0gbmV3IFByb2Nlc3NCdWlsZGVyKGNoZWNrRmMuZ2V0QWJzb2x1dGVQYXRoKCksCiAgICAgICAgICAgICAgICAgZGV2aWNlUG9saWN5RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwKLSAgICAgICAgICAgICAgICBkZXZpY2VQbGF0RmNGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgICAgICBjb21iaW5lZEZjRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAgICAgICAgIHBiLnJlZGlyZWN0T3V0cHV0KFByb2Nlc3NCdWlsZGVyLlJlZGlyZWN0LlBJUEUpOwogICAgICAgICBwYi5yZWRpcmVjdEVycm9yU3RyZWFtKHRydWUpOwogICAgICAgICBQcm9jZXNzIHAgPSBwYi5zdGFydCgpOwpAQCAtNTc4LDIxICs3MjUsMjQgQEAKICAgICAgKgogICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCiAgICAgICovCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjkuNy9DLTEtNCIpCisgICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjkuNyIpCiAgICAgcHVibGljIHZvaWQgdGVzdFZhbGlkUHJvcGVydHlDb250ZXh0cygpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIC8qIHJldHJpZXZlIHRoZSBjaGVja2ZjIGV4ZWN1dGFibGUgZnJvbSBqYXIgKi8KLSAgICAgICAgY2hlY2tGYyA9IGNvcHlSZXNvdXJjZVRvVGVtcEZpbGUoIi9jaGVja2ZjIik7Ci0gICAgICAgIGNoZWNrRmMuc2V0RXhlY3V0YWJsZSh0cnVlKTsKKyAgICAgICAgRmlsZSBwcm9wZXJ0eUluZm9DaGVja2VyID0gY29weVJlc291cmNlVG9UZW1wRmlsZSgiL3Byb3BlcnR5X2luZm9fY2hlY2tlciIpOworICAgICAgICBwcm9wZXJ0eUluZm9DaGVja2VyLnNldEV4ZWN1dGFibGUodHJ1ZSk7CiAKICAgICAgICAgLyogb2J0YWluIHByb3BlcnR5X2NvbnRleHRzIGZpbGUgZnJvbSBydW5uaW5nIGRldmljZSAqLwogICAgICAgICBkZXZpY2VQY0ZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJwcm9wZXJ0eV9jb250ZXh0cyIsICIudG1wIik7CiAgICAgICAgIGRldmljZVBjRmlsZS5kZWxldGVPbkV4aXQoKTsKLSAgICAgICAgbURldmljZS5wdWxsRmlsZSgiL3Byb3BlcnR5X2NvbnRleHRzIiwgZGV2aWNlUGNGaWxlKTsKKyAgICAgICAgLy8gcGxhdF9wcm9wZXJ0eV9jb250ZXh0cyBtYXkgYmUgZWl0aGVyIGluIC9zeXN0ZW0vZXRjL3NlcG9saWN5IG9yIGluIC8KKyAgICAgICAgaWYgKCFtRGV2aWNlLnB1bGxGaWxlKCIvc3lzdGVtL2V0Yy9zZWxpbnV4L3BsYXRfcHJvcGVydHlfY29udGV4dHMiLCBkZXZpY2VQY0ZpbGUpKSB7CisgICAgICAgICAgICBtRGV2aWNlLnB1bGxGaWxlKCIvcGxhdF9wcm9wZXJ0eV9jb250ZXh0cyIsIGRldmljZVBjRmlsZSk7CisgICAgICAgIH0KIAotICAgICAgICAvKiBydW4gY2hlY2tmYyAtcCBvbiBwcm9wZXJ0eV9jb250ZXh0cyAqLwotICAgICAgICBQcm9jZXNzQnVpbGRlciBwYiA9IG5ldyBQcm9jZXNzQnVpbGRlcihjaGVja0ZjLmdldEFic29sdXRlUGF0aCgpLAotICAgICAgICAgICAgICAgICItcCIsIGRldmljZVBvbGljeUZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksCisgICAgICAgIC8qIHJ1biBwcm9wZXJ0eV9pbmZvX2NoZWNrZXIgb24gcHJvcGVydHlfY29udGV4dHMgKi8KKyAgICAgICAgUHJvY2Vzc0J1aWxkZXIgcGIgPSBuZXcgUHJvY2Vzc0J1aWxkZXIocHJvcGVydHlJbmZvQ2hlY2tlci5nZXRBYnNvbHV0ZVBhdGgoKSwKKyAgICAgICAgICAgICAgICBkZXZpY2VQb2xpY3lGaWxlLmdldEFic29sdXRlUGF0aCgpLAogICAgICAgICAgICAgICAgIGRldmljZVBjRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAgICAgICAgIHBiLnJlZGlyZWN0T3V0cHV0KFByb2Nlc3NCdWlsZGVyLlJlZGlyZWN0LlBJUEUpOwogICAgICAgICBwYi5yZWRpcmVjdEVycm9yU3RyZWFtKHRydWUpOwpAQCAtNjE0LDcgKzc2NCw3IEBACiAgICAgICoKICAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgogICAgICAqLwotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI5LjcvQy0xLTQiKQorICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI5LjciKQogICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZFNlcnZpY2VDb250ZXh0cygpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIC8qIHJldHJpZXZlIHRoZSBjaGVja2ZjIGV4ZWN1dGFibGUgZnJvbSBqYXIgKi8KQEAgLTY0NSwxMiArNzk1LDExNCBAQAogICAgICAgICAgICAgICAgICAgICsgZXJyb3JTdHJpbmcsIGVycm9yU3RyaW5nLmxlbmd0aCgpID09IDApOwogICAgIH0KIAorICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc01hYygpIHsKKyAgICAgICAgU3RyaW5nIG9zID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgcmV0dXJuIChvcy5zdGFydHNXaXRoKCJtYWMiKSB8fCBvcy5zdGFydHNXaXRoKCJkYXJ3aW4iKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldHVwTGlicmFyaWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFRoZSBob3N0IHNpZGUgYmluYXJ5IHRlc3RzIGFyZSBob3N0IE9TIHNwZWNpZmljLiBVc2UgTGludXgKKyAgICAgICAgLy8gbGlicmFyaWVzIG9uIExpbnV4IGFuZCBNYWMgbGlicmFyaWVzIG9uIE1hYy4KKyAgICAgICAgaWYgKGlzTWFjKCkpIHsKKyAgICAgICAgICAgIGxpYnNlcG9sd3JhcCA9IGNvcHlSZXNvdXJjZVRvVGVtcEZpbGUoIi9saWJzZXBvbHdyYXAuZHlsaWIiKTsKKyAgICAgICAgICAgIGxpYmNwcCA9IGNvcHlSZXNvdXJjZVRvVGVtcEZpbGUoIi9saWJjKysuZHlsaWIiKTsKKyAgICAgICAgICAgIGxpYmNwcC5yZW5hbWVUbyhuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIikgKyAiL2xpYmMrKy5keWxpYiIpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxpYnNlcG9sd3JhcCA9IGNvcHlSZXNvdXJjZVRvVGVtcEZpbGUoIi9saWJzZXBvbHdyYXAuc28iKTsKKyAgICAgICAgICAgIGxpYmNwcCA9IGNvcHlSZXNvdXJjZVRvVGVtcEZpbGUoIi9saWJjKysuc28iKTsKKyAgICAgICAgICAgIGxpYmNwcC5yZW5hbWVUbyhuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIikgKyAiL2xpYmMrKy5zbyIpKTsKKyAgICAgICAgfQorICAgICAgICBsaWJzZXBvbHdyYXAuZGVsZXRlT25FeGl0KCk7CisgICAgICAgIGxpYmNwcC5kZWxldGVPbkV4aXQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0U2Vwb2xpY3lUZXN0cyhTdHJpbmcgdGVzdCwgU3RyaW5nIHRlc3RFeGVjdXRhYmxlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc2V0dXBMaWJyYXJpZXMoKTsKKyAgICAgICAgc2Vwb2xpY3lUZXN0cyA9IGNvcHlSZXNvdXJjZVRvVGVtcEZpbGUodGVzdEV4ZWN1dGFibGUpOworICAgICAgICBzZXBvbGljeVRlc3RzLnNldEV4ZWN1dGFibGUodHJ1ZSk7CisgICAgICAgIFByb2Nlc3NCdWlsZGVyIHBiID0gbmV3IFByb2Nlc3NCdWlsZGVyKAorICAgICAgICAgICAgICAgIHNlcG9saWN5VGVzdHMuZ2V0QWJzb2x1dGVQYXRoKCksCisgICAgICAgICAgICAgICAgIi1sIiwgbGlic2Vwb2x3cmFwLmdldEFic29sdXRlUGF0aCgpLAorICAgICAgICAgICAgICAgICItZiIsIGRldmljZVBsYXRGY0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksCisgICAgICAgICAgICAgICAgIi1mIiwgZGV2aWNlTm9ucGxhdEZjRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwKKyAgICAgICAgICAgICAgICAiLXAiLCBkZXZpY2VQb2xpY3lGaWxlLmdldEFic29sdXRlUGF0aCgpLAorICAgICAgICAgICAgICAgICItLXRlc3QiLCB0ZXN0KTsKKyAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBlbnYgPSBwYi5lbnZpcm9ubWVudCgpOworICAgICAgICBpZiAoaXNNYWMoKSkgeworICAgICAgICAgICAgZW52LnB1dCgiRFlMRF9MSUJSQVJZX1BBVEgiLCBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZW52LnB1dCgiTERfTElCUkFSWV9QQVRIIiwgU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpKTsKKyAgICAgICAgfQorICAgICAgICBwYi5yZWRpcmVjdE91dHB1dChQcm9jZXNzQnVpbGRlci5SZWRpcmVjdC5QSVBFKTsKKyAgICAgICAgcGIucmVkaXJlY3RFcnJvclN0cmVhbSh0cnVlKTsKKyAgICAgICAgUHJvY2VzcyBwID0gcGIuc3RhcnQoKTsKKyAgICAgICAgcC53YWl0Rm9yKCk7CisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJlc3VsdCA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIocC5nZXRJbnB1dFN0cmVhbSgpKSk7CisgICAgICAgIFN0cmluZyBsaW5lOworICAgICAgICBTdHJpbmdCdWlsZGVyIGVycm9yU3RyaW5nID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgd2hpbGUgKChsaW5lID0gcmVzdWx0LnJlYWRMaW5lKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGVycm9yU3RyaW5nLmFwcGVuZChsaW5lKTsKKyAgICAgICAgICAgIGVycm9yU3RyaW5nLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKGVycm9yU3RyaW5nLnRvU3RyaW5nKCksIGVycm9yU3RyaW5nLmxlbmd0aCgpID09IDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoYXQgYWxsIHR5cGVzIG9uIC9kYXRhIGhhdmUgdGhlIGRhdGFfZmlsZV90eXBlIGF0dHJpYnV0ZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdERhdGFUeXBlVmlvbGF0b3JzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydFNlcG9saWN5VGVzdHMoIlRlc3REYXRhVHlwZVZpb2xhdGlvbnMiLCAiL3NlcG9saWN5X3Rlc3RzIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhhdCBhbGwgdHlwZXMgaW4gL3Byb2MgaGF2ZSB0aGUgcHJvY190eXBlIGF0dHJpYnV0ZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFByb2NUeXBlVmlvbGF0b3JzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydFNlcG9saWN5VGVzdHMoIlRlc3RQcm9jVHlwZVZpb2xhdGlvbnMiLCAiL3NlcG9saWN5X3Rlc3RzIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhhdCBhbGwgdHlwZXMgaW4gL3N5cyBoYXZlIHRoZSBzeXNmc190eXBlIGF0dHJpYnV0ZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFN5c2ZzVHlwZVZpb2xhdG9ycygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRTZXBvbGljeVRlc3RzKCJUZXN0U3lzZnNUeXBlVmlvbGF0aW9ucyIsICIvc2Vwb2xpY3lfdGVzdHMiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB0aGF0IGFsbCB0eXBlcyBvbiAvdmVuZG9yIGhhdmUgdGhlIHZlbmRvcl9maWxlX3R5cGUgYXR0cmlidXRlLgorICAgICAqCisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmVuZG9yVHlwZVZpb2xhdG9ycygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRTZXBvbGljeVRlc3RzKCJUZXN0VmVuZG9yVHlwZVZpb2xhdGlvbnMiLCAiL3NlcG9saWN5X3Rlc3RzIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhhdCBhbGwgZG9tYWlucyB3aXRoIGVudHJ5cG9pbnRzIG9uIC9zeXN0ZW0gaGF2ZSB0aGUgY29yZWRvbWFpbgorICAgICAqIGF0dHJpYnV0ZSwgYW5kIHRoYXQgYWxsIGRvbWFpbnMgd2l0aCBlbnRyeXBvaW50cyBvbiAvdmVuZG9yIGRvIG5vdCBoYXZlIHRoZQorICAgICAqIGNvcmVkb21haW4gYXR0cmlidXRlLgorICAgICAqCisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29yZWRvbWFpblZpb2xhdG9ycygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIWlzRnVsbFRyZWJsZURldmljZSgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0U2Vwb2xpY3lUZXN0cygiQ29yZWRvbWFpblZpb2xhdGlvbnMiLCAiL3RyZWJsZV9zZXBvbGljeV90ZXN0cyIpOworICAgIH0KKwogICAgLyoqCiAgICAgICogVGVzdHMgdGhhdCB0aGUgcG9saWN5IGRlZmluZXMgbm8gYm9vbGVhbnMgKHJ1bnRpbWUgY29uZGl0aW9uYWwgcG9saWN5KS4KICAgICAgKgogICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCiAgICAgICovCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjkuNy9DLTEtNCIpCisgICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjkuNyIpCiAgICAgcHVibGljIHZvaWQgdGVzdE5vQm9vbGVhbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogICAgICAgICAvKiBydW4gc2Vwb2xpY3ktYW5hbHl6ZSBib29sZWFucyBjaGVjayBvbiBwb2xpY3kgZmlsZSAqLwpAQCAtODEyLDI0ICsxMDY0LDM3IEBACiAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtc2csIGV4ZWNMaXN0LmNvbnRhaW5zKHAucHJvY1RpdGxlKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICB9CiAKLSAgICAgICAgZm9yIChTdHJpbmcgZXhlIDogZXhlY3V0YWJsZXMpIHsKLSAgICAgICAgICAgIExpc3Q8UHJvY2Vzc0RldGFpbHM+IGV4ZVByb2NzID0gUHJvY2Vzc0RldGFpbHMuZ2V0RXhlTWFwKG1EZXZpY2UpLmdldChleGUpOworICAgIC8qKgorICAgICAqIEFzc2VydHMgdGhhdCBhbiBleGVjdXRhYmxlIGV4aXN0cyBhbmQgaXMgb25seSBydW5uaW5nIGluIHRoZSBsaXN0ZWQgZG9tYWlucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBleGVjdXRhYmxlCisgICAgICogIFRoZSBwYXRoIG9mIHRoZSBleGVjdXRhYmxlIHRvIGNoZWNrLgorICAgICAqIEBwYXJhbSBkb21haW5zCisgICAgICogIFRoZSBsaXN0IG9mIGFsbG93ZWQgZG9tYWlucy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0RXhlY3V0YWJsZUhhc0RvbWFpbihTdHJpbmcgZXhlY3V0YWJsZSwgU3RyaW5nLi4uIGRvbWFpbnMpCisgICAgICAgIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24geworICAgICAgICBMaXN0PFByb2Nlc3NEZXRhaWxzPiBleGVQcm9jcyA9IFByb2Nlc3NEZXRhaWxzLmdldEV4ZU1hcChtRGV2aWNlKS5nZXQoZXhlY3V0YWJsZSk7CisgICAgICAgIFNldDxTdHJpbmc+IGRvbWFpbkxpc3QgPSBuZXcgSGFzaFNldDxTdHJpbmc+KEFycmF5cy5hc0xpc3QoZG9tYWlucykpOwogCi0gICAgICAgICAgICBpZiAoZXhlUHJvY3MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoUHJvY2Vzc0RldGFpbHMgcCA6IGV4ZVByb2NzKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRXhwZWN0ZWQgZXhlY3V0YWJsZSBcIiIgKyBleGUgKyAiXCIgaW4gU0VMaW51eCBkb21haW4gXCIiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGRvbWFpbiArICJcIiIgKyAiIEZvdW5kOiBcIiIgKyBwICsgIlwiIjsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG1zZywgZG9tYWluLCBwLmxhYmVsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICAgIFN0cmluZyBtc2cgPSAiRXhwZWN0ZWQgMSBvciBtb3JlIHByb2Nlc3NlcyBmb3IgZXhlY3V0YWJsZSBcIiIgKyBleGVjdXRhYmxlICsgIlwiLiI7CisgICAgICAgIGFzc2VydE5vdE51bGwobXNnLCBleGVQcm9jcyk7CisKKyAgICAgICAgZm9yIChQcm9jZXNzRGV0YWlscyBwIDogZXhlUHJvY3MpIHsKKyAgICAgICAgICAgIG1zZyA9ICJFeHBlY3RlZCBvbmUgb2YgIFwiIiArIGRvbWFpbkxpc3QgKyAiXCIgZm9yIGV4ZWN1dGFibGUgXCIiICsgZXhlY3V0YWJsZQorICAgICAgICAgICAgICAgICAgICArICJcIiIgKyAiIEZvdW5kOiBcIiIgKyBwLmxhYmVsICsgIlwiIjsKKyAgICAgICAgICAgIGFzc2VydFRydWUobXNnLCBkb21haW5MaXN0LmNvbnRhaW5zKHAubGFiZWwpKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qIEluaXQgaXMgYWx3YXlzIHRoZXJlICovCiAgICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjkuNyIpCiAgICAgcHVibGljIHZvaWQgdGVzdEluaXREb21haW4oKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0RG9tYWluT25lKCJ1OnI6aW5pdDpzMCIsICIvaW5pdCIpOworICAgICAgICBhc3NlcnREb21haW5IYXNFeGVjdXRhYmxlKCJ1OnI6aW5pdDpzMCIsICIvaW5pdCIpOworICAgICAgICBhc3NlcnREb21haW5IYXNFeGVjdXRhYmxlKCJ1OnI6dmVuZG9yX2luaXQ6czAiLCAiL2luaXQiKTsKKyAgICAgICAgYXNzZXJ0RXhlY3V0YWJsZUhhc0RvbWFpbigiL2luaXQiLCAidTpyOmluaXQ6czAiLCAidTpyOnZlbmRvcl9pbml0OnMwIik7CiAgICAgfQogCiAgICAgLyogVWV2ZW50ZCBpcyBhbHdheXMgdGhlcmUgKi8KQEAgLTgzOCwxMCArMTEwMywxMCBAQAogICAgICAgICBhc3NlcnREb21haW5PbmUoInU6cjp1ZXZlbnRkOnMwIiwgIi9zYmluL3VldmVudGQiKTsKICAgICB9CiAKLSAgICAvKiBEZXZpY2VzIGFsd2F5cyBoYXZlIGhlYWx0aGQgKi8KKyAgICAvKiBoZWFsdGhkIG1heSBvciBtYXkgbm90IGV4aXN0ICovCiAgICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjkuNyIpCiAgICAgcHVibGljIHZvaWQgdGVzdEhlYWx0aGREb21haW4oKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0RG9tYWluT25lKCJ1OnI6aGVhbHRoZDpzMCIsICIvc3lzdGVtL2Jpbi9oZWFsdGhkIik7CisgICAgICAgIGFzc2VydERvbWFpblplcm9Pck9uZSgidTpyOmhlYWx0aGQ6czAiLCAiL3N5c3RlbS9iaW4vaGVhbHRoZCIpOwogICAgIH0KIAogICAgIC8qIFNlcnZpY2VtYW5hZ2VyIGlzIGFsd2F5cyB0aGVyZSAqLwpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL0FuZHJvaWRUZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9BbmRyb2lkVGVzdC54bWwKaW5kZXggN2FiYzNmNS4uNWY4ZjBlMiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL0FuZHJvaWRUZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vQW5kcm9pZFRlc3QueG1sCkBAIC0xMyw3ICsxMyw4IEBACiAgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIHRoZSBDVFMgU2VjdXJpdHkgQnVsbGV0aW4gaG9zdCB0ZXN0cyI+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciB0aGUgQ1RTIFNlY3VyaXR5IGJ1bGxldGluIGhvc3QgdGVzdHMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJzZWN1cml0eSIgLz4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50YXJnZXRwcmVwLkZpbGVQdXNoZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJ0cnVlIiAvPgpAQCAtMzYsMjMgKzM3LDEyMSBAQAogICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJDVkUtMjAxNi04NDMyLT4vZGF0YS9sb2NhbC90bXAvQ1ZFLTIwMTYtODQzMiIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iQ1ZFLTIwMTYtODQzNC0+L2RhdGEvbG9jYWwvdG1wL0NWRS0yMDE2LTg0MzQiIC8+CiAKKyAgICAgICAgPCEtLSBCdWxsZXRpbiAyMDE2LTA0IC0tPgorICAgICAgICA8IS0tIFBsZWFzZSBhZGQgdGVzdHMgc29sZWx5IGZyb20gdGhpcyBidWxsZXRpbiBiZWxvdyB0byBhdm9pZCBtZXJnZSBjb25mbGljdCAtLT4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iQ1ZFLTIwMTYtMDg0NC0+L2RhdGEvbG9jYWwvdG1wL0NWRS0yMDE2LTA4NDQiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9IkNWRS0yMDE2LTI0MTktPi9kYXRhL2xvY2FsL3RtcC9DVkUtMjAxNi0yNDE5IiAvPgorCisgICAgICAgIDwhLS1fX19fX19fX19fX19fX19fX18tLT4KKyAgICAgICAgPCEtLSBCdWxsZXRpbiAyMDE2LTA1IC0tPgorICAgICAgICA8IS0tIFBsZWFzZSBhZGQgdGVzdHMgc29sZWx5IGZyb20gdGhpcyBidWxsZXRpbiBiZWxvdyB0byBhdm9pZCBtZXJnZSBjb25mbGljdCAtLT4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iQ1ZFLTIwMTYtMjQ2MC0+L2RhdGEvbG9jYWwvdG1wL0NWRS0yMDE2LTI0NjAiIC8+CisKKyAgICAgICAgPCEtLV9fX19fX19fX19fX19fX19fXy0tPgorICAgICAgICA8IS0tIEJ1bGxldGluIDIwMTYtMDcgLS0+CisgICAgICAgIDwhLS0gUGxlYXNlIGFkZCB0ZXN0cyBzb2xlbHkgZnJvbSB0aGlzIGJ1bGxldGluIGJlbG93IHRvIGF2b2lkIG1lcmdlIGNvbmZsaWN0IC0tPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJDVkUtMjAxNi0zODE4LT4vZGF0YS9sb2NhbC90bXAvQ1ZFLTIwMTYtMzgxOCIgLz4KKworICAgICAgICA8IS0tIEJ1bGxldGluIDIwMTYtMDkgLS0+CisgICAgICAgIDwhLS0gUGxlYXNlIGFkZCB0ZXN0cyBzb2xlbHkgZnJvbSB0aGlzIGJ1bGxldGluIGJlbG93IHRvIGF2b2lkIG1lcmdlIGNvbmZsaWN0IC0tPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJDVkUtMjAxNi0yNDcxLT4vZGF0YS9sb2NhbC90bXAvQ1ZFLTIwMTYtMjQ3MSIgLz4KKworICAgICAgICA8IS0tX19fX19fX19fX19fX19fX19fLS0+CisgICAgICAgIDwhLS0gQnVsbGV0aW4gMjAxNi0xMCAtLT4KKyAgICAgICAgPCEtLSBQbGVhc2UgYWRkIHRlc3RzIHNvbGVseSBmcm9tIHRoaXMgYnVsbGV0aW4gYmVsb3cgdG8gYXZvaWQgbWVyZ2UgY29uZmxpY3QgLS0+CisKKyAgICAgICAgPCEtLV9fX19fX19fX19fX19fX19fXy0tPgorICAgICAgICA8IS0tIEJ1bGxldGluIDIwMTYtMTEgLS0+CisgICAgICAgIDwhLS0gUGxlYXNlIGFkZCB0ZXN0cyBzb2xlbHkgZnJvbSB0aGlzIGJ1bGxldGluIGJlbG93IHRvIGF2b2lkIG1lcmdlIGNvbmZsaWN0IC0tPgorCisgICAgICAgIDwhLS1fX19fX19fX19fX19fX19fX18tLT4KKyAgICAgICAgPCEtLSBCdWxsZXRpbiAyMDE2LTEyIC0tPgorICAgICAgICA8IS0tIFBsZWFzZSBhZGQgdGVzdHMgc29sZWx5IGZyb20gdGhpcyBidWxsZXRpbiBiZWxvdyB0byBhdm9pZCBtZXJnZSBjb25mbGljdCAtLT4KKworICAgICAgICA8IS0tX19fX19fX19fX19fX19fX19fLS0+CisgICAgICAgIDwhLS0gQnVsbGV0aW4gMjAxNy0wMSAtLT4KKyAgICAgICAgPCEtLSBQbGVhc2UgYWRkIHRlc3RzIHNvbGVseSBmcm9tIHRoaXMgYnVsbGV0aW4gYmVsb3cgdG8gYXZvaWQgbWVyZ2UgY29uZmxpY3QgLS0+CisKKyAgICAgICAgPCEtLV9fX19fX19fX19fX19fX19fXy0tPgorICAgICAgICA8IS0tIEJ1bGxldGluIDIwMTctMDIgLS0+CisgICAgICAgIDwhLS0gUGxlYXNlIGFkZCB0ZXN0cyBzb2xlbHkgZnJvbSB0aGlzIGJ1bGxldGluIGJlbG93IHRvIGF2b2lkIG1lcmdlIGNvbmZsaWN0IC0tPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJDVkUtMjAxNy0wNDI2LT4vZGF0YS9sb2NhbC90bXAvQ1ZFLTIwMTctMDQyNiIgLz4KKwogICAgICAgICA8IS0tX19fX19fX19fX19fX19fX19fLS0+CiAgICAgICAgIDwhLS0gQnVsbGV0aW4gMjAxNy0wMyAtLT4KICAgICAgICAgPCEtLSBQbGVhc2UgYWRkIHRlc3RzIHNvbGVseSBmcm9tIHRoaXMgYnVsbGV0aW4gYmVsb3cgdG8gYXZvaWQgbWVyZ2UgY29uZmxpY3QgLS0+Ci0KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iQ1ZFLTIwMTctMDQ3OS0+L2RhdGEvbG9jYWwvdG1wL0NWRS0yMDE3LTA0NzkiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9IkNWRS0yMDE3LTAzMzQtPi9kYXRhL2xvY2FsL3RtcC9DVkUtMjAxNy0wMzM0IiAvPgogICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJDVkUtMjAxNi04NDc5LT4vZGF0YS9sb2NhbC90bXAvQ1ZFLTIwMTYtODQ3OSIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iQ1ZFLTIwMTctMDUwOC0+L2RhdGEvbG9jYWwvdG1wL0NWRS0yMDE3LTA1MDgiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9IkNWRS0yMDE3LTAzMzMtPi9kYXRhL2xvY2FsL3RtcC9DVkUtMjAxNy0wMzMzIiAvPgogCiAgICAgICAgIDwhLS1fX19fX19fX19fX19fX19fX18tLT4KKyAgICAgICAgPCEtLSBCdWxsZXRpbiAyMDE3LTA0IC0tPgorICAgICAgICA8IS0tIFBsZWFzZSBhZGQgdGVzdHMgc29sZWx5IGZyb20gdGhpcyBidWxsZXRpbiBiZWxvdyB0byBhdm9pZCBtZXJnZSBjb25mbGljdCAtLT4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iQ1ZFLTIwMTYtMTAyMjktPi9kYXRhL2xvY2FsL3RtcC9DVkUtMjAxNi0xMDIyOSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iQ1ZFLTIwMTQtMzE0NS0+L2RhdGEvbG9jYWwvdG1wL0NWRS0yMDE0LTMxNDUiLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iQ1ZFLTIwMTctMDU1My0+L2RhdGEvbG9jYWwvdG1wL0NWRS0yMDE3LTA1NTMiLz4KKworICAgICAgICA8IS0tX19fX19fX19fX19fX19fX19fLS0+CisgICAgICAgIDwhLS0gQnVsbGV0aW4gMjAxNy0wNSAtLT4KKyAgICAgICAgPCEtLSBQbGVhc2UgYWRkIHRlc3RzIHNvbGVseSBmcm9tIHRoaXMgYnVsbGV0aW4gYmVsb3cgdG8gYXZvaWQgbWVyZ2UgY29uZmxpY3QgLS0+CisKKyAgICAgICAgPCEtLV9fX19fX19fX19fX19fX19fXy0tPgorICAgICAgICA8IS0tIEJ1bGxldGluIDIwMTctMDYgLS0+CisgICAgICAgIDwhLS0gUGxlYXNlIGFkZCB0ZXN0cyBzb2xlbHkgZnJvbSB0aGlzIGJ1bGxldGluIGJlbG93IHRvIGF2b2lkIG1lcmdlIGNvbmZsaWN0IC0tPgorCisgICAgICAgIDwhLS1fX19fX19fX19fX19fX19fX18tLT4KKyAgICAgICAgPCEtLSBCdWxsZXRpbiAyMDE3LTA3IC0tPgorICAgICAgICA8IS0tIFBsZWFzZSBhZGQgdGVzdHMgc29sZWx5IGZyb20gdGhpcyBidWxsZXRpbiBiZWxvdyB0byBhdm9pZCBtZXJnZSBjb25mbGljdCAtLT4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iQ1ZFLTIwMTYtMjEwOS0+L2RhdGEvbG9jYWwvdG1wL0NWRS0yMDE2LTIxMDkiLz4KKworICAgICAgICA8IS0tX19fX19fX19fX19fX19fX19fLS0+CisgICAgICAgIDwhLS0gQnVsbGV0aW4gMjAxNy0wOCAtLT4KKyAgICAgICAgPCEtLSBQbGVhc2UgYWRkIHRlc3RzIHNvbGVseSBmcm9tIHRoaXMgYnVsbGV0aW4gYmVsb3cgdG8gYXZvaWQgbWVyZ2UgY29uZmxpY3QgLS0+CisKKyAgICAgICAgPCEtLV9fX19fX19fX19fX19fX19fXy0tPgorICAgICAgICA8IS0tIEJ1bGxldGluIDIwMTctMDkgLS0+CisgICAgICAgIDwhLS0gUGxlYXNlIGFkZCB0ZXN0cyBzb2xlbHkgZnJvbSB0aGlzIGJ1bGxldGluIGJlbG93IHRvIGF2b2lkIG1lcmdlIGNvbmZsaWN0IC0tPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJCdWctMzgxOTU3MzgtPi9kYXRhL2xvY2FsL3RtcC9CdWctMzgxOTU3MzgiIC8+CisKKyAgICAgICAgPCEtLV9fX19fX19fX19fX19fX19fXy0tPgorICAgICAgICA8IS0tIEJ1bGxldGluIDIwMTctMTAgLS0+CisgICAgICAgIDwhLS0gUGxlYXNlIGFkZCB0ZXN0cyBzb2xlbHkgZnJvbSB0aGlzIGJ1bGxldGluIGJlbG93IHRvIGF2b2lkIG1lcmdlIGNvbmZsaWN0IC0tPgorCisgICAgICAgIDwhLS1fX19fX19fX19fX19fX19fX18tLT4KKyAgICAgICAgPCEtLSBCdWxsZXRpbiAyMDE3LTExIC0tPgorICAgICAgICA8IS0tIFBsZWFzZSBhZGQgdGVzdHMgc29sZWx5IGZyb20gdGhpcyBidWxsZXRpbiBiZWxvdyB0byBhdm9pZCBtZXJnZSBjb25mbGljdCAtLT4KKworICAgICAgICA8IS0tX19fX19fX19fX19fX19fX19fLS0+CisgICAgICAgIDwhLS0gQnVsbGV0aW4gMjAxNy0xMiAtLT4KKyAgICAgICAgPCEtLSBQbGVhc2UgYWRkIHRlc3RzIHNvbGVseSBmcm9tIHRoaXMgYnVsbGV0aW4gYmVsb3cgdG8gYXZvaWQgbWVyZ2UgY29uZmxpY3QgLS0+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9IkNWRS0yMDE3LTYyNjItPi9kYXRhL2xvY2FsL3RtcC9DVkUtMjAxNy02MjYyIiAvPgorCisgICAgICAgIDwhLS1fX19fX19fX19fX19fX19fX18tLT4KKyAgICAgICAgPCEtLSBCdWxsZXRpbiAyMDE4LTAxIC0tPgorICAgICAgICA8IS0tIFBsZWFzZSBhZGQgdGVzdHMgc29sZWx5IGZyb20gdGhpcyBidWxsZXRpbiBiZWxvdyB0byBhdm9pZCBtZXJnZSBjb25mbGljdCAtLT4KKworICAgICAgICA8IS0tX19fX19fX19fX19fX19fX19fLS0+CisgICAgICAgIDwhLS0gQnVsbGV0aW4gMjAxOC0wMiAtLT4KKyAgICAgICAgPCEtLSBQbGVhc2UgYWRkIHRlc3RzIHNvbGVseSBmcm9tIHRoaXMgYnVsbGV0aW4gYmVsb3cgdG8gYXZvaWQgbWVyZ2UgY29uZmxpY3QgLS0+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9IkNWRS0yMDE3LTEzMjMyLT4vZGF0YS9sb2NhbC90bXAvQ1ZFLTIwMTctMTMyMzIiIC8+CisKKyAgICAgICAgPCEtLV9fX19fX19fX19fX19fX19fXy0tPgorICAgICAgICA8IS0tIEJ1bGxldGluIDIwMTgtMDMgLS0+CisgICAgICAgIDwhLS0gUGxlYXNlIGFkZCB0ZXN0cyBzb2xlbHkgZnJvbSB0aGlzIGJ1bGxldGluIGJlbG93IHRvIGF2b2lkIG1lcmdlIGNvbmZsaWN0IC0tPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJDVkUtMjAxNy0xMzI1My0+L2RhdGEvbG9jYWwvdG1wL0NWRS0yMDE3LTEzMjUzIiAvPgorCisgICAgICAgIDwhLS1fX19fX19fX19fX19fX19fX18tLT4KICAgICAgICAgPCEtLSBCdWxsZXRpbiAyMDE5LTAzIC0tPgogICAgICAgICA8IS0tIFBsZWFzZSBhZGQgdGVzdHMgc29sZWx5IGZyb20gdGhpcyBidWxsZXRpbiBiZWxvdyB0byBhdm9pZCBtZXJnZSBjb25mbGljdCAtLT4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iQnVnLTExNTczOTgwOS0+L2RhdGEvbG9jYWwvdG1wL0J1Zy0xMTU3Mzk4MDkiIC8+CiAKICAgICAgICAgPG9wdGlvbiBuYW1lPSJhcHBlbmQtYml0bmVzcyIgdmFsdWU9InRydWUiIC8+CiAgICAgPC90YXJnZXRfcHJlcGFyZXI+CisKICAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGVzdHR5cGUuSmFySG9zdFRlc3QiID4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJqYXIiIHZhbHVlPSJDdHNTZWN1cml0eUJ1bGxldGluSG9zdFRlc3RDYXNlcy5qYXIiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0icnVudGltZS1oaW50IiB2YWx1ZT0iMzJzIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjhtNDBzIiAvPgogICAgIDwvdGVzdD4KIDwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0J1Zy0xMTU3Mzk4MDkvcG9jLmNwcCBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0J1Zy0xMTU3Mzk4MDkvcG9jLmNwcAppbmRleCBlYmVlNTYyLi41NGU3MGNiIDEwMDc1NQotLS0gYS9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9CdWctMTE1NzM5ODA5L3BvYy5jcHAKKysrIGIvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQnVnLTExNTczOTgwOS9wb2MuY3BwCkBAIC0xOTAsNyArMTkwLDcgQEAKIGludCBtYWluKCkgewogICAgIHNwPElucHV0Q2hhbm5lbD4gc2VydmVyLCBjbGllbnQ7CiAKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBJbnB1dENoYW5uZWw6Om9wZW5JbnB1dENoYW5uZWxQYWlyKFN0cmluZzgoImNoYW5uZWwgbmFtZSIpLCBzZXJ2ZXIsIGNsaWVudCk7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gSW5wdXRDaGFubmVsOjpvcGVuSW5wdXRDaGFubmVsUGFpcihTdHJpbmc4KCJjaGFubmVsIG5hbWUiKS5zdHJpbmcoKSwgc2VydmVyLCBjbGllbnQpOwogICAgIGlmIChyZXN1bHQgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBvcGVuIGlucHV0IGNoYW5uZWwgcGFpciIpOwogICAgICAgICByZXR1cm4gMDsKQEAgLTIwNyw0ICsyMDcsMyBAQAogCiAgICAgcmV0dXJuIDA7CiB9Ci0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0J1Zy0zODE5NTczOC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQnVnLTM4MTk1NzM4L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRjMWRjNQotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0J1Zy0zODE5NTczOC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzAgQEAKKyNDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBCdWctMzgxOTU3MzgKK0xPQ0FMX1NSQ19GSUxFUyA6PSBwb2MuYworTE9DQUxfTVVMVElMSUIgOj0gYm90aAorTE9DQUxfTU9EVUxFX1NURU1fMzIgOj0gJChMT0NBTF9NT0RVTEUpMzIKK0xPQ0FMX01PRFVMRV9TVEVNXzY0IDo9ICQoTE9DQUxfTU9EVUxFKTY0CisKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBzdHMKK0xPQ0FMX0NUU19URVNUX1BBQ0tBR0UgOj0gYW5kcm9pZC5zZWN1cml0eS5jdHMKKworTE9DQUxfQVJNX01PREUgOj0gYXJtCitMT0NBTF9DRkxBR1MgPSAtV2FsbCAtV2Vycm9yCisKK2luY2x1ZGUgJChCVUlMRF9DVFNfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0J1Zy0zODE5NTczOC9wb2MuYyBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0J1Zy0zODE5NTczOC9wb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzNjNzA4Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQnVnLTM4MTk1NzM4L3BvYy5jCkBAIC0wLDAgKzEsMzkgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNkZWZpbmUgX0dOVV9TT1VSQ0UKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisjZGVmaW5lIElPQ1RMX0tHU0xfR1BVTUVNX0FMTE9DIDB4YzAxODA5MmZ1bAoraW50IG1haW4oKSB7CisgIGludCBmZCA9IG9wZW4oIi9kZXYva2dzbC0zZDAiLCAwKTsKKyAgbW1hcCgodm9pZCAqKTB4MjAwMDAwMDB1bCwgMHhkMDAwdWwsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisgICAgICAgTUFQX1BSSVZBVEUgfCBNQVBfRklYRUQgfCBNQVBfQU5PTllNT1VTLCAtMSwgMCk7CisKKyAgKih1aW50NjRfdCAqKTB4MjAwMDBmZjAgPSAodWludDY0X3QpMHhmZmZmZmZmZmZmZmZmNDE2OworICAqKHVpbnQzMl90ICopMHgyMDAwMGZmOCA9ICh1aW50MzJfdCkweDgwOworICAqKHVpbnQzMl90ICopMHgyMDAwMGZmYyA9ICh1aW50MzJfdCkweDgwMDA7CisgICoodWludDMyX3QgKikweDIwMDAxMDAwID0gKHVpbnQzMl90KTB4MTIzNDU2Nzg7CisgIGlvY3RsKGZkLCAweGMwMTgwOTJmdWwsIDB4MjAwMDBmZjB1bCk7CisgIGNsb3NlKGZkKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9DVkUtMjAxNC0zMTQ1L0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9DVkUtMjAxNC0zMTQ1L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBjYWUxNgotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE0LTMxNDUvQW5kcm9pZC5tawpAQCAtMCwwICsxLDMwIEBACisjIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IENWRS0yMDE0LTMxNDUKK0xPQ0FMX1NSQ19GSUxFUyA6PSBwb2MuYworTE9DQUxfTVVMVElMSUIgOj0gYm90aAorTE9DQUxfTU9EVUxFX1NURU1fMzIgOj0gJChMT0NBTF9NT0RVTEUpMzIKK0xPQ0FMX01PRFVMRV9TVEVNXzY0IDo9ICQoTE9DQUxfTU9EVUxFKTY0CisKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBzdHMKK0xPQ0FMX0NUU19URVNUX1BBQ0tBR0UgOj0gYW5kcm9pZC5zZWN1cml0eS5jdHMKKworTE9DQUxfQVJNX01PREUgOj0gYXJtCitMT0NBTF9DRkxBR1MgPSAtV2FsbCAtV2Vycm9yCisKK2luY2x1ZGUgJChCVUlMRF9DVFNfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE0LTMxNDUvcG9jLmMgYi9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9DVkUtMjAxNC0zMTQ1L3BvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MjM3NGYKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9DVkUtMjAxNC0zMTQ1L3BvYy5jCkBAIC0wLDAgKzEsMTM3IEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjZGVmaW5lIF9HTlVfU09VUkNFCisjZGVmaW5lIEFSUkFZX1NJWkUoX19hKSAoc2l6ZW9mKF9fYSkgLyBzaXplb2YoKF9fYSlbMF0pKQorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZmlsdGVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCitzdGF0aWMgc3RydWN0IHNvY2tfZmlsdGVyIG5sYXR0cltdID0geworICB7IDAwMDAsIDAsIDAsIDB4ODc2NTQzMjEgfSwKKyAgeyAweDAxLCAwLCAwLCAweDAwMDAwMDJhIH0sCisgIHsgMHgyMCwgMCwgMCwgMHhmZmZmZjAwYyB9LAorICB7IDB4MTYsIDAsIDAsIDAwMDAwMDAwMDAgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc29ja19mcHJvZyBicGZfbmxhdHRyID0geworICAubGVuID0gQVJSQVlfU0laRShubGF0dHIpLAorICAuZmlsdGVyID0gbmxhdHRyLAorfTsKKworc3RhdGljIHN0cnVjdCBzb2NrX2ZpbHRlciBubGF0dHJfbmVzdFtdID0geworICB7IDAwMDAsIDAsIDAsIDB4ODc2NTQzMjEgfSwKKyAgeyAweDAxLCAwLCAwLCAweDAwMDAwMDJhIH0sCisgIHsgMHgyMCwgMCwgMCwgMHhmZmZmZjAxMCB9LAorICB7IDB4MTYsIDAsIDAsIDAwMDAwMDAwMDAgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc29ja19mcHJvZyBicGZfbmxhdHRyX25lc3QgPSB7CisgIC5sZW4gPSBBUlJBWV9TSVpFKG5sYXR0cl9uZXN0KSwKKyAgLmZpbHRlciA9IG5sYXR0cl9uZXN0LAorfTsKKworc3RhdGljIHN0cnVjdCBzb2NrX2ZpbHRlciBuZXN0X3JlbVtdID0geworICB7IDAwMDAsIDAsIDAsIDAwMDAwMDAwMDAgfSwKKyAgeyAweDAxLCAwLCAwLCAweDAwMDAwMDJhIH0sCisgIHsgMHgyMCwgMCwgMCwgMHhmZmZmZjAxMCB9LAorICB7IDB4MTYsIDAsIDAsIDAwMDAwMDAwMDAgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc29ja19mcHJvZyBicGZfbmVzdF9yZW0gPSB7CisgIC5sZW4gPSBBUlJBWV9TSVpFKG5lc3RfcmVtKSwKKyAgLmZpbHRlciA9IG5lc3RfcmVtLAorfTsKKworc3RhdGljIGludCBzZW5kX3JlY2VpdmVfcGFja2V0KGludCBzWzJdLCBjb25zdCB2b2lkKiBwa3QsIGludCBsZW4pCit7CisgIGNoYXIgdG1wWzEwMjRdOworICBzc2l6ZV90IHJldDsKKworICByZXQgPSBzZW5kKHNbMV0sIHBrdCwgbGVuLCAwKTsKKyAgaWYgKHJldCAhPSBsZW4pIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICByZXQgPSByZWN2KHNbMF0sIHRtcCwgbGVuLCBNU0dfRE9OVFdBSVQpOworICBpZiAocmV0IDwgMCAmJiBlcnJubyA9PSBFQUdBSU4pCisgICAgcmV0dXJuIDA7CisKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgc3RydWN0IG5sYXR0ciBjaGtyZW1bMl0gPSB7CisgICAgWzBdID0geworICAgICAgICAubmxhX2xlbiA9IDB4ZmZmMCwKKyAgICAgICAgLm5sYV90eXBlID0gMCwKKyAgICB9LAorICAgIFsxXSA9IHsKKyAgICAgICAgLm5sYV9sZW4gPSBzaXplb2Yoc3RydWN0IG5sYXR0ciksCisgICAgICAgIC5ubGFfdHlwZSA9IDQyLAorICAgIH0sCisgIH07CisgIF9fdTE2IGNoa3N6ID0gMHhmZWZlOworICBpbnQgc1syXSwgcmV0OworCisgIHJldCA9IHNvY2tldHBhaXIoQUZfVU5JWCwgU09DS19ER1JBTSwgMCwgcyk7CisgIGlmIChyZXQpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICByZXQgPSBzZXRzb2Nrb3B0KHNbMF0sIFNPTF9TT0NLRVQsIFNPX0FUVEFDSF9GSUxURVIsCisgICAgICAmYnBmX25sYXR0ciwgc2l6ZW9mKGJwZl9ubGF0dHIpKTsKKyAgaWYgKHJldCA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICByZXQgPSBzZW5kX3JlY2VpdmVfcGFja2V0KHMsICZjaGtzeiwgc2l6ZW9mKGNoa3N6KSk7CisgIGlmIChyZXQpIHsKKyAgICByZXQgPSAxMTM7CisgICAgZ290byBvdXQ7CisgIH0KKworICByZXQgPSBzZXRzb2Nrb3B0KHNbMF0sIFNPTF9TT0NLRVQsIFNPX0FUVEFDSF9GSUxURVIsCisgICAgICAmYnBmX25sYXR0cl9uZXN0LCBzaXplb2YoYnBmX25sYXR0cl9uZXN0KSk7CisgIGlmIChyZXQgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgcmV0ID0gc2VuZF9yZWNlaXZlX3BhY2tldChzLCAmY2hrc3osIHNpemVvZihjaGtzeikpOworICBpZiAocmV0KSB7CisgICAgcmV0ID0gMTEzOworICAgIGdvdG8gb3V0OworICB9CisKKyAgcmV0ID0gc2V0c29ja29wdChzWzBdLCBTT0xfU09DS0VULCBTT19BVFRBQ0hfRklMVEVSLAorICAgICAgJmJwZl9uZXN0X3JlbSwgc2l6ZW9mKGJwZl9uZXN0X3JlbSkpOworICBpZiAocmV0IDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorCisgIHJldCA9IHNlbmRfcmVjZWl2ZV9wYWNrZXQocywgY2hrcmVtLCBzaXplb2YoY2hrcmVtKSk7CisgIGlmKHJldCl7CisgICAgcmV0ID0gMTEzOworICB9CisKK291dDoKKyAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE2LTA4NDQvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE2LTA4NDQvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWQzMTNkCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTYtMDg0NC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzMgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gQ1ZFLTIwMTYtMDg0NAorTE9DQUxfU1JDX0ZJTEVTIDo9IHBvYy5jCitMT0NBTF9NVUxUSUxJQiA6PSBib3RoCitMT0NBTF9NT0RVTEVfU1RFTV8zMiA6PSAkKExPQ0FMX01PRFVMRSkzMgorTE9DQUxfTU9EVUxFX1NURU1fNjQgOj0gJChMT0NBTF9NT0RVTEUpNjQKKworIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIHN0cworTE9DQUxfQ1RTX1RFU1RfUEFDS0FHRSA6PSBhbmRyb2lkLnNlY3VyaXR5LmN0cworCitMT0NBTF9BUk1fTU9ERSA6PSBhcm0KK0xPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2Vycm9yCitMT0NBTF9DRkxBR1MgKz0gLUlpbmNsdWRlIC1mUElFCitMT0NBTF9MREZMQUdTICs9IC1mUElFIC1waWUKK0xPQ0FMX0xERkxBR1MgKz0gLXJkeW5hbWljCitpbmNsdWRlICQoQlVJTERfQ1RTX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9DVkUtMjAxNi0wODQ0L2xvY2FsX3BvYy5oIGIvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTYtMDg0NC9sb2NhbF9wb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjBjOWRmCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTYtMDg0NC9sb2NhbF9wb2MuaApAQCAtMCwwICsxLDYyMCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgdmFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZm5kZWYgSVBBX1FNSV9TRVJWSUNFX1YwMV9ICisjZGVmaW5lIElQQV9RTUlfU0VSVklDRV9WMDFfSAorCisjZGVmaW5lIFFNSV9JUEFfSVBGTFRSX05VTV9JSExfUkFOR0VfMTZfRVFOU19WMDEgMgorI2RlZmluZSBRTUlfSVBBX0lQRkxUUl9OVU1fTUVRXzMyX0VRTlNfVjAxIDIKKyNkZWZpbmUgUU1JX0lQQV9JUEZMVFJfTlVNX0lITF9NRVFfMzJfRVFOU19WMDEgMgorI2RlZmluZSBRTUlfSVBBX0lQRkxUUl9OVU1fTUVRXzEyOF9FUU5TX1YwMSAyCisjZGVmaW5lIFFNSV9JUEFfTUFYX0ZJTFRFUlNfVjAxIDY0CisKKyNkZWZpbmUgSVBBX0lOVF9NQVggKChpbnQpKH4wVSA+PiAxKSkKKyNkZWZpbmUgSVBBX0lOVF9NSU4gKC1JUEFfSU5UX01BWCAtIDEpCisKK2VudW0gaXBhX3FtaV9yZXN1bHRfdHlwZV92MDEgeworICBJUEFfUU1JX1JFU1VMVF9UWVBFX01JTl9FTlVNX1ZBTF9WMDEgPSBJUEFfSU5UX01JTiwKKyAgSVBBX1FNSV9SRVNVTFRfU1VDQ0VTU19WMDEgPSAwLAorICBJUEFfUU1JX1JFU1VMVF9GQUlMVVJFX1YwMSA9IDEsCisgIElQQV9RTUlfUkVTVUxUX1RZUEVfTUFYX0VOVU1fVkFMX1YwMSA9IElQQV9JTlRfTUFYLAorfTsKKworZW51bSBpcGFfcW1pX2Vycm9yX3R5cGVfdjAxIHsKKyAgSVBBX1FNSV9FUlJPUl9UWVBFX01JTl9FTlVNX1ZBTF9WMDEgPSBJUEFfSU5UX01JTiwKKyAgSVBBX1FNSV9FUlJfTk9ORV9WMDEgPSAweDAwMDAsCisgIElQQV9RTUlfRVJSX01BTEZPUk1FRF9NU0dfVjAxID0gMHgwMDAxLAorICBJUEFfUU1JX0VSUl9OT19NRU1PUllfVjAxID0gMHgwMDAyLAorICBJUEFfUU1JX0VSUl9JTlRFUk5BTF9WMDEgPSAweDAwMDMsCisgIElQQV9RTUlfRVJSX0NMSUVOVF9JRFNfRVhIQVVTVEVEX1YwMSA9IDB4MDAwNSwKKyAgSVBBX1FNSV9FUlJfSU5WQUxJRF9JRF9WMDEgPSAweDAwMjksCisgIElQQV9RTUlfRVJSX0VOQ09ESU5HX1YwMSA9IDB4MDAzQSwKKyAgSVBBX1FNSV9FUlJfSU5DT01QQVRJQkxFX1NUQVRFX1YwMSA9IDB4MDA1QSwKKyAgSVBBX1FNSV9FUlJfTk9UX1NVUFBPUlRFRF9WMDEgPSAweDAwNUUsCisgIElQQV9RTUlfRVJST1JfVFlQRV9NQVhfRU5VTV9WQUxfVjAxID0gSVBBX0lOVF9NQVgsCit9OworCitzdHJ1Y3QgaXBhX3FtaV9yZXNwb25zZV90eXBlX3YwMSB7CisgIGVudW0gaXBhX3FtaV9yZXN1bHRfdHlwZV92MDEgcmVzdWx0OworICBlbnVtIGlwYV9xbWlfZXJyb3JfdHlwZV92MDEgZXJyb3I7Cit9OworCitlbnVtIGlwYV9wbGF0Zm9ybV90eXBlX2VudW1fdjAxIHsKKyAgSVBBX1BMQVRGT1JNX1RZUEVfRU5VTV9NSU5fRU5VTV9WQUxfVjAxID0gLTIxNDc0ODM2NDcsCisgIFFNSV9JUEFfUExBVEZPUk1fVFlQRV9JTlZBTElEX1YwMSA9IDAsCisgIFFNSV9JUEFfUExBVEZPUk1fVFlQRV9UTl9WMDEgPSAxLAorICBRTUlfSVBBX1BMQVRGT1JNX1RZUEVfTEVfVjAxID0gMiwKKyAgUU1JX0lQQV9QTEFURk9STV9UWVBFX01TTV9BTkRST0lEX1YwMSA9IDMsCisgIFFNSV9JUEFfUExBVEZPUk1fVFlQRV9NU01fV0lORE9XU19WMDEgPSA0LAorICBRTUlfSVBBX1BMQVRGT1JNX1RZUEVfTVNNX1FOWF9WMDEgPSA1LAorICBJUEFfUExBVEZPUk1fVFlQRV9FTlVNX01BWF9FTlVNX1ZBTF9WMDEgPSAyMTQ3NDgzNjQ3Cit9OworCitzdHJ1Y3QgaXBhX2hkcl90YmxfaW5mb190eXBlX3YwMSB7CisgIHVpbnQzMl90IG1vZGVtX29mZnNldF9zdGFydDsKKyAgdWludDMyX3QgbW9kZW1fb2Zmc2V0X2VuZDsKK307CisKK3N0cnVjdCBpcGFfcm91dGVfdGJsX2luZm9fdHlwZV92MDEgeworICB1aW50MzJfdCByb3V0ZV90Ymxfc3RhcnRfYWRkcjsKKyAgdWludDMyX3QgbnVtX2luZGljZXM7Cit9OworCitzdHJ1Y3QgaXBhX21vZGVtX21lbV9pbmZvX3R5cGVfdjAxIHsKKyAgdWludDMyX3QgYmxvY2tfc3RhcnRfYWRkcjsKKyAgdWludDMyX3Qgc2l6ZTsKK307CisKK3N0cnVjdCBpcGFfaGRyX3Byb2NfY3R4X3RibF9pbmZvX3R5cGVfdjAxIHsKKyAgdWludDMyX3QgbW9kZW1fb2Zmc2V0X3N0YXJ0OworICB1aW50MzJfdCBtb2RlbV9vZmZzZXRfZW5kOworfTsKKworc3RydWN0IGlwYV96aXBfdGJsX2luZm9fdHlwZV92MDEgeworICB1aW50MzJfdCBtb2RlbV9vZmZzZXRfc3RhcnQ7CisgIHVpbnQzMl90IG1vZGVtX29mZnNldF9lbmQ7Cit9OworCitzdHJ1Y3QgaXBhX2luaXRfbW9kZW1fZHJpdmVyX3JlcV9tc2dfdjAxIHsKKyAgdWludDhfdCBwbGF0Zm9ybV90eXBlX3ZhbGlkOworICBlbnVtIGlwYV9wbGF0Zm9ybV90eXBlX2VudW1fdjAxIHBsYXRmb3JtX3R5cGU7CisgIHVpbnQ4X3QgaGRyX3RibF9pbmZvX3ZhbGlkOworICBzdHJ1Y3QgaXBhX2hkcl90YmxfaW5mb190eXBlX3YwMSBoZHJfdGJsX2luZm87CisgIHVpbnQ4X3QgdjRfcm91dGVfdGJsX2luZm9fdmFsaWQ7CisgIHN0cnVjdCBpcGFfcm91dGVfdGJsX2luZm9fdHlwZV92MDEgdjRfcm91dGVfdGJsX2luZm87CisgIHVpbnQ4X3QgdjZfcm91dGVfdGJsX2luZm9fdmFsaWQ7CisgIHN0cnVjdCBpcGFfcm91dGVfdGJsX2luZm9fdHlwZV92MDEgdjZfcm91dGVfdGJsX2luZm87CisgIHVpbnQ4X3QgdjRfZmlsdGVyX3RibF9zdGFydF9hZGRyX3ZhbGlkOworICB1aW50MzJfdCB2NF9maWx0ZXJfdGJsX3N0YXJ0X2FkZHI7CisgIHVpbnQ4X3QgdjZfZmlsdGVyX3RibF9zdGFydF9hZGRyX3ZhbGlkOworICB1aW50MzJfdCB2Nl9maWx0ZXJfdGJsX3N0YXJ0X2FkZHI7CisgIHVpbnQ4X3QgbW9kZW1fbWVtX2luZm9fdmFsaWQ7CisgIHN0cnVjdCBpcGFfbW9kZW1fbWVtX2luZm9fdHlwZV92MDEgbW9kZW1fbWVtX2luZm87CisgIHVpbnQ4X3QgY3RybF9jb21tX2Rlc3RfZW5kX3B0X3ZhbGlkOworICB1aW50MzJfdCBjdHJsX2NvbW1fZGVzdF9lbmRfcHQ7CisgIHVpbnQ4X3QgaXNfc3NyX2Jvb3R1cF92YWxpZDsKKyAgdWludDhfdCBpc19zc3JfYm9vdHVwOworICB1aW50OF90IGhkcl9wcm9jX2N0eF90YmxfaW5mb192YWxpZDsKKyAgc3RydWN0IGlwYV9oZHJfcHJvY19jdHhfdGJsX2luZm9fdHlwZV92MDEgaGRyX3Byb2NfY3R4X3RibF9pbmZvOworICB1aW50OF90IHppcF90YmxfaW5mb192YWxpZDsKKyAgc3RydWN0IGlwYV96aXBfdGJsX2luZm9fdHlwZV92MDEgemlwX3RibF9pbmZvOworfTsKKworc3RydWN0IGlwYV9pbml0X21vZGVtX2RyaXZlcl9yZXNwX21zZ192MDEgeworICBzdHJ1Y3QgaXBhX3FtaV9yZXNwb25zZV90eXBlX3YwMSByZXNwOworICB1aW50OF90IGN0cmxfY29tbV9kZXN0X2VuZF9wdF92YWxpZDsKKyAgdWludDMyX3QgY3RybF9jb21tX2Rlc3RfZW5kX3B0OworICB1aW50OF90IGRlZmF1bHRfZW5kX3B0X3ZhbGlkOworICB1aW50MzJfdCBkZWZhdWx0X2VuZF9wdDsKK307CisKK3N0cnVjdCBpcGFfaW5kaWNhdGlvbl9yZWdfcmVxX21zZ192MDEgeworICB1aW50OF90IG1hc3Rlcl9kcml2ZXJfaW5pdF9jb21wbGV0ZV92YWxpZDsKKyAgdWludDhfdCBtYXN0ZXJfZHJpdmVyX2luaXRfY29tcGxldGU7Cit9OworCitzdHJ1Y3QgaXBhX2luZGljYXRpb25fcmVnX3Jlc3BfbXNnX3YwMSB7CisgIHN0cnVjdCBpcGFfcW1pX3Jlc3BvbnNlX3R5cGVfdjAxIHJlc3A7Cit9OworCitzdHJ1Y3QgaXBhX21hc3Rlcl9kcml2ZXJfaW5pdF9jb21wbHRfaW5kX21zZ192MDEgeworICBzdHJ1Y3QgaXBhX3FtaV9yZXNwb25zZV90eXBlX3YwMSBtYXN0ZXJfZHJpdmVyX2luaXRfc3RhdHVzOworfTsKKworc3RydWN0IGlwYV9pcGZsdHJfcmFuZ2VfZXFfMTZfdHlwZV92MDEgeworICB1aW50OF90IG9mZnNldDsKKyAgdWludDE2X3QgcmFuZ2VfbG93OworICB1aW50MTZfdCByYW5nZV9oaWdoOworfTsKKworc3RydWN0IGlwYV9pcGZsdHJfbWFza19lcV8zMl90eXBlX3YwMSB7CisgIHVpbnQ4X3Qgb2Zmc2V0OworICB1aW50MzJfdCBtYXNrOworICB1aW50MzJfdCB2YWx1ZTsKK307CisKK3N0cnVjdCBpcGFfaXBmbHRyX2VxXzE2X3R5cGVfdjAxIHsKKyAgdWludDhfdCBvZmZzZXQ7CisgIHVpbnQxNl90IHZhbHVlOworfTsKKworc3RydWN0IGlwYV9pcGZsdHJfZXFfMzJfdHlwZV92MDEgeworICB1aW50OF90IG9mZnNldDsKKyAgdWludDMyX3QgdmFsdWU7Cit9OworCitzdHJ1Y3QgaXBhX2lwZmx0cl9tYXNrX2VxXzEyOF90eXBlX3YwMSB7CisgIHVpbnQ4X3Qgb2Zmc2V0OworICB1aW50OF90IG1hc2tbMTZdOworICB1aW50OF90IHZhbHVlWzE2XTsKK307CisKK3N0cnVjdCBpcGFfZmlsdGVyX3J1bGVfdHlwZV92MDEgeworICB1aW50MTZfdCBydWxlX2VxX2JpdG1hcDsKKyAgdWludDhfdCB0b3NfZXFfcHJlc2VudDsKKyAgdWludDhfdCB0b3NfZXE7CisgIHVpbnQ4X3QgcHJvdG9jb2xfZXFfcHJlc2VudDsKKyAgdWludDhfdCBwcm90b2NvbF9lcTsKKyAgdWludDhfdCBudW1faWhsX29mZnNldF9yYW5nZV8xNjsKKworICBzdHJ1Y3QgaXBhX2lwZmx0cl9yYW5nZV9lcV8xNl90eXBlX3YwMQorICAgICAgaWhsX29mZnNldF9yYW5nZV8xNltRTUlfSVBBX0lQRkxUUl9OVU1fSUhMX1JBTkdFXzE2X0VRTlNfVjAxXTsKKworICB1aW50OF90IG51bV9vZmZzZXRfbWVxXzMyOworCisgIHN0cnVjdCBpcGFfaXBmbHRyX21hc2tfZXFfMzJfdHlwZV92MDEKKyAgICAgIG9mZnNldF9tZXFfMzJbUU1JX0lQQV9JUEZMVFJfTlVNX01FUV8zMl9FUU5TX1YwMV07CisKKyAgdWludDhfdCB0Y19lcV9wcmVzZW50OworICB1aW50OF90IHRjX2VxOworICB1aW50OF90IGZsb3dfZXFfcHJlc2VudDsKKyAgdWludDMyX3QgZmxvd19lcTsKKyAgdWludDhfdCBpaGxfb2Zmc2V0X2VxXzE2X3ByZXNlbnQ7CisgIHN0cnVjdCBpcGFfaXBmbHRyX2VxXzE2X3R5cGVfdjAxIGlobF9vZmZzZXRfZXFfMTY7CisgIHVpbnQ4X3QgaWhsX29mZnNldF9lcV8zMl9wcmVzZW50OworICBzdHJ1Y3QgaXBhX2lwZmx0cl9lcV8zMl90eXBlX3YwMSBpaGxfb2Zmc2V0X2VxXzMyOworICB1aW50OF90IG51bV9paGxfb2Zmc2V0X21lcV8zMjsKKyAgc3RydWN0IGlwYV9pcGZsdHJfbWFza19lcV8zMl90eXBlX3YwMQorICAgICAgaWhsX29mZnNldF9tZXFfMzJbUU1JX0lQQV9JUEZMVFJfTlVNX0lITF9NRVFfMzJfRVFOU19WMDFdOworICB1aW50OF90IG51bV9vZmZzZXRfbWVxXzEyODsKKyAgc3RydWN0IGlwYV9pcGZsdHJfbWFza19lcV8xMjhfdHlwZV92MDEKKyAgICAgIG9mZnNldF9tZXFfMTI4W1FNSV9JUEFfSVBGTFRSX05VTV9NRVFfMTI4X0VRTlNfVjAxXTsKKworICB1aW50OF90IG1ldGFkYXRhX21lcTMyX3ByZXNlbnQ7CisKKyAgc3RydWN0IGlwYV9pcGZsdHJfbWFza19lcV8zMl90eXBlX3YwMSBtZXRhZGF0YV9tZXEzMjsKKyAgdWludDhfdCBpcHY0X2ZyYWdfZXFfcHJlc2VudDsKK307CisKK2VudW0gaXBhX2lwX3R5cGVfZW51bV92MDEgeworICBJUEFfSVBfVFlQRV9FTlVNX01JTl9FTlVNX1ZBTF9WMDEgPSAtMjE0NzQ4MzY0NywKKyAgUU1JX0lQQV9JUF9UWVBFX0lOVkFMSURfVjAxID0gMCwKKyAgUU1JX0lQQV9JUF9UWVBFX1Y0X1YwMSA9IDEsCisgIFFNSV9JUEFfSVBfVFlQRV9WNl9WMDEgPSAyLAorICBRTUlfSVBBX0lQX1RZUEVfVjRWNl9WMDEgPSAzLAorICBJUEFfSVBfVFlQRV9FTlVNX01BWF9FTlVNX1ZBTF9WMDEgPSAyMTQ3NDgzNjQ3Cit9OworCitlbnVtIGlwYV9maWx0ZXJfYWN0aW9uX2VudW1fdjAxIHsKKyAgSVBBX0ZJTFRFUl9BQ1RJT05fRU5VTV9NSU5fRU5VTV9WQUxfVjAxID0gLTIxNDc0ODM2NDcsCisgIFFNSV9JUEFfRklMVEVSX0FDVElPTl9JTlZBTElEX1YwMSA9IDAsCisgIFFNSV9JUEFfRklMVEVSX0FDVElPTl9TUkNfTkFUX1YwMSA9IDEsCisgIFFNSV9JUEFfRklMVEVSX0FDVElPTl9EU1RfTkFUX1YwMSA9IDIsCisgIFFNSV9JUEFfRklMVEVSX0FDVElPTl9ST1VUSU5HX1YwMSA9IDMsCisgIFFNSV9JUEFfRklMVEVSX0FDVElPTl9FWENFUFRJT05fVjAxID0gNCwKKyAgSVBBX0ZJTFRFUl9BQ1RJT05fRU5VTV9NQVhfRU5VTV9WQUxfVjAxID0gMjE0NzQ4MzY0NworfTsKKworc3RydWN0IGlwYV9maWx0ZXJfc3BlY190eXBlX3YwMSB7CisgIHVpbnQzMl90IGZpbHRlcl9zcGVjX2lkZW50aWZpZXI7CisgIGVudW0gaXBhX2lwX3R5cGVfZW51bV92MDEgaXBfdHlwZTsKKyAgc3RydWN0IGlwYV9maWx0ZXJfcnVsZV90eXBlX3YwMSBmaWx0ZXJfcnVsZTsKKyAgZW51bSBpcGFfZmlsdGVyX2FjdGlvbl9lbnVtX3YwMSBmaWx0ZXJfYWN0aW9uOworICB1aW50OF90IGlzX3JvdXRpbmdfdGFibGVfaW5kZXhfdmFsaWQ7CisgIHVpbnQzMl90IHJvdXRlX3RhYmxlX2luZGV4OworICB1aW50OF90IGlzX211eF9pZF92YWxpZDsKKyAgdWludDMyX3QgbXV4X2lkOworfTsKKworc3RydWN0IGlwYV9pbnN0YWxsX2ZsdHJfcnVsZV9yZXFfbXNnX3YwMSB7CisgIHVpbnQ4X3QgZmlsdGVyX3NwZWNfbGlzdF92YWxpZDsKKyAgdWludDMyX3QgZmlsdGVyX3NwZWNfbGlzdF9sZW47CisgIHN0cnVjdCBpcGFfZmlsdGVyX3NwZWNfdHlwZV92MDEgZmlsdGVyX3NwZWNfbGlzdFtRTUlfSVBBX01BWF9GSUxURVJTX1YwMV07CisgIHVpbnQ4X3Qgc291cmNlX3BpcGVfaW5kZXhfdmFsaWQ7CisgIHVpbnQzMl90IHNvdXJjZV9waXBlX2luZGV4OworICB1aW50OF90IG51bV9pcHY0X2ZpbHRlcnNfdmFsaWQ7CisgIHVpbnQzMl90IG51bV9pcHY0X2ZpbHRlcnM7CisgIHVpbnQ4X3QgbnVtX2lwdjZfZmlsdGVyc192YWxpZDsKKyAgdWludDMyX3QgbnVtX2lwdjZfZmlsdGVyczsKKyAgdWludDhfdCB4bGF0X2ZpbHRlcl9pbmRpY2VzX2xpc3RfdmFsaWQ7CisgIHVpbnQzMl90IHhsYXRfZmlsdGVyX2luZGljZXNfbGlzdF9sZW47CisgIHVpbnQzMl90IHhsYXRfZmlsdGVyX2luZGljZXNfbGlzdFtRTUlfSVBBX01BWF9GSUxURVJTX1YwMV07Cit9OworCitzdHJ1Y3QgaXBhX2ZpbHRlcl9ydWxlX2lkZW50aWZpZXJfdG9faGFuZGxlX21hcF92MDEgeworICB1aW50MzJfdCBmaWx0ZXJfc3BlY19pZGVudGlmaWVyOworICB1aW50MzJfdCBmaWx0ZXJfaGFuZGxlOworfTsKKworc3RydWN0IGlwYV9pbnN0YWxsX2ZsdHJfcnVsZV9yZXNwX21zZ192MDEgeworICBzdHJ1Y3QgaXBhX3FtaV9yZXNwb25zZV90eXBlX3YwMSByZXNwOworICB1aW50OF90IGZpbHRlcl9oYW5kbGVfbGlzdF92YWxpZDsKKyAgdWludDMyX3QgZmlsdGVyX2hhbmRsZV9saXN0X2xlbjsKKyAgc3RydWN0IGlwYV9maWx0ZXJfcnVsZV9pZGVudGlmaWVyX3RvX2hhbmRsZV9tYXBfdjAxCisgICAgICBmaWx0ZXJfaGFuZGxlX2xpc3RbUU1JX0lQQV9NQVhfRklMVEVSU19WMDFdOworfTsKKworc3RydWN0IGlwYV9maWx0ZXJfaGFuZGxlX3RvX2luZGV4X21hcF92MDEgeworICB1aW50MzJfdCBmaWx0ZXJfaGFuZGxlOworICB1aW50MzJfdCBmaWx0ZXJfaW5kZXg7Cit9OworCitzdHJ1Y3QgaXBhX2ZsdHJfaW5zdGFsbGVkX25vdGlmX3JlcV9tc2dfdjAxIHsKKyAgdWludDMyX3Qgc291cmNlX3BpcGVfaW5kZXg7CisgIGVudW0gaXBhX3FtaV9yZXN1bHRfdHlwZV92MDEgaW5zdGFsbF9zdGF0dXM7CisgIHVpbnQzMl90IGZpbHRlcl9pbmRleF9saXN0X2xlbjsKKyAgc3RydWN0IGlwYV9maWx0ZXJfaGFuZGxlX3RvX2luZGV4X21hcF92MDEKKyAgICAgIGZpbHRlcl9pbmRleF9saXN0W1FNSV9JUEFfTUFYX0ZJTFRFUlNfVjAxXTsKKworICB1aW50OF90IGVtYmVkZGVkX3BpcGVfaW5kZXhfdmFsaWQ7CisgIHVpbnQzMl90IGVtYmVkZGVkX3BpcGVfaW5kZXg7CisgIHVpbnQ4X3QgcmV0YWluX2hlYWRlcl92YWxpZDsKKyAgdWludDhfdCByZXRhaW5faGVhZGVyOworICB1aW50OF90IGVtYmVkZGVkX2NhbGxfbXV4X2lkX3ZhbGlkOworICB1aW50MzJfdCBlbWJlZGRlZF9jYWxsX211eF9pZDsKKyAgdWludDhfdCBudW1faXB2NF9maWx0ZXJzX3ZhbGlkOworICB1aW50MzJfdCBudW1faXB2NF9maWx0ZXJzOworICB1aW50OF90IG51bV9pcHY2X2ZpbHRlcnNfdmFsaWQ7CisgIHVpbnQzMl90IG51bV9pcHY2X2ZpbHRlcnM7CisgIHVpbnQ4X3Qgc3RhcnRfaXB2NF9maWx0ZXJfaWR4X3ZhbGlkOworICB1aW50MzJfdCBzdGFydF9pcHY0X2ZpbHRlcl9pZHg7CisgIHVpbnQ4X3Qgc3RhcnRfaXB2Nl9maWx0ZXJfaWR4X3ZhbGlkOworICB1aW50MzJfdCBzdGFydF9pcHY2X2ZpbHRlcl9pZHg7Cit9OworCitzdHJ1Y3QgaXBhX2ZsdHJfaW5zdGFsbGVkX25vdGlmX3Jlc3BfbXNnX3YwMSB7CisgIHN0cnVjdCBpcGFfcW1pX3Jlc3BvbnNlX3R5cGVfdjAxIHJlc3A7Cit9OworCitzdHJ1Y3QgaXBhX2VuYWJsZV9mb3JjZV9jbGVhcl9kYXRhcGF0aF9yZXFfbXNnX3YwMSB7CisgIHVpbnQzMl90IHNvdXJjZV9waXBlX2JpdG1hc2s7CisgIHVpbnQzMl90IHJlcXVlc3RfaWQ7CisgIHVpbnQ4X3QgdGhyb3R0bGVfc291cmNlX3ZhbGlkOworICB1aW50OF90IHRocm90dGxlX3NvdXJjZTsKK307CisKK3N0cnVjdCBpcGFfZW5hYmxlX2ZvcmNlX2NsZWFyX2RhdGFwYXRoX3Jlc3BfbXNnX3YwMSB7CisgIHN0cnVjdCBpcGFfcW1pX3Jlc3BvbnNlX3R5cGVfdjAxIHJlc3A7Cit9OworCitzdHJ1Y3QgaXBhX2Rpc2FibGVfZm9yY2VfY2xlYXJfZGF0YXBhdGhfcmVxX21zZ192MDEgeworICB1aW50MzJfdCByZXF1ZXN0X2lkOworfTsKKworc3RydWN0IGlwYV9kaXNhYmxlX2ZvcmNlX2NsZWFyX2RhdGFwYXRoX3Jlc3BfbXNnX3YwMSB7CisgIHN0cnVjdCBpcGFfcW1pX3Jlc3BvbnNlX3R5cGVfdjAxIHJlc3A7Cit9OworCitlbnVtIGlwYV9wZXJpcGhlcmFsX3NwZWVkX2VudW1fdjAxIHsKKyAgSVBBX1BFUklQSEVSQUxfU1BFRURfRU5VTV9NSU5fRU5VTV9WQUxfVjAxID0gLTIxNDc0ODM2NDcsCisgIFFNSV9JUEFfUEVSX1VTQl9GU19WMDEgPSAxLAorICBRTUlfSVBBX1BFUl9VU0JfSFNfVjAxID0gMiwKKyAgUU1JX0lQQV9QRVJfVVNCX1NTX1YwMSA9IDMsCisgIElQQV9QRVJJUEhFUkFMX1NQRUVEX0VOVU1fTUFYX0VOVU1fVkFMX1YwMSA9IDIxNDc0ODM2NDcKK307CisKK2VudW0gaXBhX3BpcGVfbW9kZV9lbnVtX3YwMSB7CisgIElQQV9QSVBFX01PREVfRU5VTV9NSU5fRU5VTV9WQUxfVjAxID0gLTIxNDc0ODM2NDcsCisgIFFNSV9JUEFfUElQRV9NT0RFX0hXX1YwMSA9IDEsCisgIFFNSV9JUEFfUElQRV9NT0RFX1NXX1YwMSA9IDIsCisgIElQQV9QSVBFX01PREVfRU5VTV9NQVhfRU5VTV9WQUxfVjAxID0gMjE0NzQ4MzY0NworfTsKKworZW51bSBpcGFfcGVyaXBoZXJhbF90eXBlX2VudW1fdjAxIHsKKyAgSVBBX1BFUklQSEVSQUxfVFlQRV9FTlVNX01JTl9FTlVNX1ZBTF9WMDEgPSAtMjE0NzQ4MzY0NywKKyAgUU1JX0lQQV9QRVJJUEhFUkFMX1VTQl9WMDEgPSAxLAorICBRTUlfSVBBX1BFUklQSEVSQUxfSFNJQ19WMDEgPSAyLAorICBRTUlfSVBBX1BFUklQSEVSQUxfUENJRV9WMDEgPSAzLAorICBJUEFfUEVSSVBIRVJBTF9UWVBFX0VOVU1fTUFYX0VOVU1fVkFMX1YwMSA9IDIxNDc0ODM2NDcKK307CisKK3N0cnVjdCBpcGFfY29uZmlnX3JlcV9tc2dfdjAxIHsKKyAgdWludDhfdCBwZXJpcGhlcmFsX3R5cGVfdmFsaWQ7CisgIGVudW0gaXBhX3BlcmlwaGVyYWxfdHlwZV9lbnVtX3YwMSBwZXJpcGhlcmFsX3R5cGU7CisgIHVpbnQ4X3QgaHdfZGVhZ2dyX3N1cHBvcnRlZF92YWxpZDsKKyAgdWludDhfdCBod19kZWFnZ3Jfc3VwcG9ydGVkOworICB1aW50OF90IG1heF9hZ2dyX2ZyYW1lX3NpemVfdmFsaWQ7CisgIHVpbnQzMl90IG1heF9hZ2dyX2ZyYW1lX3NpemU7CisgIHVpbnQ4X3QgaXBhX2luZ3Jlc3NfcGlwZV9tb2RlX3ZhbGlkOworICBlbnVtIGlwYV9waXBlX21vZGVfZW51bV92MDEgaXBhX2luZ3Jlc3NfcGlwZV9tb2RlOworICB1aW50OF90IHBlcmlwaGVyYWxfc3BlZWRfaW5mb192YWxpZDsKKyAgZW51bSBpcGFfcGVyaXBoZXJhbF9zcGVlZF9lbnVtX3YwMSBwZXJpcGhlcmFsX3NwZWVkX2luZm87CisgIHVpbnQ4X3QgZGxfYWNjdW11bGF0aW9uX3RpbWVfbGltaXRfdmFsaWQ7CisgIHVpbnQzMl90IGRsX2FjY3VtdWxhdGlvbl90aW1lX2xpbWl0OworICB1aW50OF90IGRsX2FjY3VtdWxhdGlvbl9wa3RfbGltaXRfdmFsaWQ7CisgIHVpbnQzMl90IGRsX2FjY3VtdWxhdGlvbl9wa3RfbGltaXQ7CisgIHVpbnQ4X3QgZGxfYWNjdW11bGF0aW9uX2J5dGVfbGltaXRfdmFsaWQ7CisgIHVpbnQzMl90IGRsX2FjY3VtdWxhdGlvbl9ieXRlX2xpbWl0OworICB1aW50OF90IHVsX2FjY3VtdWxhdGlvbl90aW1lX2xpbWl0X3ZhbGlkOworICB1aW50MzJfdCB1bF9hY2N1bXVsYXRpb25fdGltZV9saW1pdDsKKyAgdWludDhfdCBod19jb250cm9sX2ZsYWdzX3ZhbGlkOworICB1aW50MzJfdCBod19jb250cm9sX2ZsYWdzOworICB1aW50OF90IHVsX21zaV9ldmVudF90aHJlc2hvbGRfdmFsaWQ7CisgIHVpbnQzMl90IHVsX21zaV9ldmVudF90aHJlc2hvbGQ7CisgIHVpbnQ4X3QgZGxfbXNpX2V2ZW50X3RocmVzaG9sZF92YWxpZDsKKyAgdWludDMyX3QgZGxfbXNpX2V2ZW50X3RocmVzaG9sZDsKK307CisKK3N0cnVjdCBpcGFfY29uZmlnX3Jlc3BfbXNnX3YwMSB7CisgIHN0cnVjdCBpcGFfcW1pX3Jlc3BvbnNlX3R5cGVfdjAxIHJlc3A7Cit9OworCisvKlNlcnZpY2UgTWVzc2FnZSBEZWZpbml0aW9uKi8KKyNkZWZpbmUgUU1JX0lQQV9JTkRJQ0FUSU9OX1JFR0lTVEVSX1JFUV9WMDEgMHgwMDIwCisjZGVmaW5lIFFNSV9JUEFfSU5ESUNBVElPTl9SRUdJU1RFUl9SRVNQX1YwMSAweDAwMjAKKyNkZWZpbmUgUU1JX0lQQV9JTklUX01PREVNX0RSSVZFUl9SRVFfVjAxIDB4MDAyMQorI2RlZmluZSBRTUlfSVBBX0lOSVRfTU9ERU1fRFJJVkVSX1JFU1BfVjAxIDB4MDAyMQorI2RlZmluZSBRTUlfSVBBX01BU1RFUl9EUklWRVJfSU5JVF9DT01QTEVURV9JTkRfVjAxIDB4MDAyMgorI2RlZmluZSBRTUlfSVBBX0lOU1RBTExfRklMVEVSX1JVTEVfUkVRX1YwMSAweDAwMjMKKyNkZWZpbmUgUU1JX0lQQV9JTlNUQUxMX0ZJTFRFUl9SVUxFX1JFU1BfVjAxIDB4MDAyMworI2RlZmluZSBRTUlfSVBBX0ZJTFRFUl9JTlNUQUxMRURfTk9USUZfUkVRX1YwMSAweDAwMjQKKyNkZWZpbmUgUU1JX0lQQV9GSUxURVJfSU5TVEFMTEVEX05PVElGX1JFU1BfVjAxIDB4MDAyNAorI2RlZmluZSBRTUlfSVBBX0VOQUJMRV9GT1JDRV9DTEVBUl9EQVRBUEFUSF9SRVFfVjAxIDB4MDAyNQorI2RlZmluZSBRTUlfSVBBX0VOQUJMRV9GT1JDRV9DTEVBUl9EQVRBUEFUSF9SRVNQX1YwMSAweDAwMjUKKyNkZWZpbmUgUU1JX0lQQV9ESVNBQkxFX0ZPUkNFX0NMRUFSX0RBVEFQQVRIX1JFUV9WMDEgMHgwMDI2CisjZGVmaW5lIFFNSV9JUEFfRElTQUJMRV9GT1JDRV9DTEVBUl9EQVRBUEFUSF9SRVNQX1YwMSAweDAwMjYKKyNkZWZpbmUgUU1JX0lQQV9DT05GSUdfUkVRX1YwMSAweDAwMjcKKyNkZWZpbmUgUU1JX0lQQV9DT05GSUdfUkVTUF9WMDEgMHgwMDI3CisKKy8qIGFkZCBmb3IgbWF4IGxlbmd0aCovCisjZGVmaW5lIFFNSV9JUEFfSU5JVF9NT0RFTV9EUklWRVJfUkVRX01BWF9NU0dfTEVOX1YwMSA5OAorI2RlZmluZSBRTUlfSVBBX0lOSVRfTU9ERU1fRFJJVkVSX1JFU1BfTUFYX01TR19MRU5fVjAxIDIxCisjZGVmaW5lIFFNSV9JUEFfSU5ESUNBVElPTl9SRUdJU1RFUl9SRVFfTUFYX01TR19MRU5fVjAxIDQKKyNkZWZpbmUgUU1JX0lQQV9JTkRJQ0FUSU9OX1JFR0lTVEVSX1JFU1BfTUFYX01TR19MRU5fVjAxIDcKKyNkZWZpbmUgUU1JX0lQQV9JTlNUQUxMX0ZJTFRFUl9SVUxFX1JFUV9NQVhfTVNHX0xFTl9WMDEgMTEyOTMKKyNkZWZpbmUgUU1JX0lQQV9JTlNUQUxMX0ZJTFRFUl9SVUxFX1JFU1BfTUFYX01TR19MRU5fVjAxIDUyMworI2RlZmluZSBRTUlfSVBBX0ZJTFRFUl9JTlNUQUxMRURfTk9USUZfUkVRX01BWF9NU0dfTEVOX1YwMSA1NzQKKyNkZWZpbmUgUU1JX0lQQV9GSUxURVJfSU5TVEFMTEVEX05PVElGX1JFU1BfTUFYX01TR19MRU5fVjAxIDcKKyNkZWZpbmUgUU1JX0lQQV9NQVNURVJfRFJJVkVSX0lOSVRfQ09NUExFVEVfSU5EX01BWF9NU0dfTEVOX1YwMSA3CisKKyNkZWZpbmUgUU1JX0lQQV9FTkFCTEVfRk9SQ0VfQ0xFQVJfREFUQVBBVEhfUkVRX01BWF9NU0dfTEVOX1YwMSAxOAorI2RlZmluZSBRTUlfSVBBX0RJU0FCTEVfRk9SQ0VfQ0xFQVJfREFUQVBBVEhfUkVRX01BWF9NU0dfTEVOX1YwMSA3CisjZGVmaW5lIFFNSV9JUEFfRU5BQkxFX0ZPUkNFX0NMRUFSX0RBVEFQQVRIX1JFU1BfTUFYX01TR19MRU5fVjAxIDcKKyNkZWZpbmUgUU1JX0lQQV9ESVNBQkxFX0ZPUkNFX0NMRUFSX0RBVEFQQVRIX1JFU1BfTUFYX01TR19MRU5fVjAxIDcKKworI2RlZmluZSBRTUlfSVBBX0NPTkZJR19SRVFfTUFYX01TR19MRU5fVjAxIDgxCisjZGVmaW5lIFFNSV9JUEFfQ09ORklHX1JFU1BfTUFYX01TR19MRU5fVjAxIDcKKy8qIFNlcnZpY2UgT2JqZWN0IEFjY2Vzc29yICovCisKKyNlbmRpZiAvKiBJUEFfUU1JX1NFUlZJQ0VfVjAxX0ggKi8KKworI2lmbmRlZiBfVUFQSV9NU01fSVBDX0hfCisjZGVmaW5lIF9VQVBJX01TTV9JUENfSF8KKworI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworc3RydWN0IG1zbV9pcGNfcG9ydF9hZGRyIHsKKyAgdWludDMyX3Qgbm9kZV9pZDsKKyAgdWludDMyX3QgcG9ydF9pZDsKK307CisKK3N0cnVjdCBtc21faXBjX3BvcnRfbmFtZSB7CisgIHVpbnQzMl90IHNlcnZpY2U7CisgIHVpbnQzMl90IGluc3RhbmNlOworfTsKKworc3RydWN0IG1zbV9pcGNfYWRkciB7CisgIHVuc2lnbmVkIGNoYXIgYWRkcnR5cGU7CisgIHVuaW9uIHsKKyAgICBzdHJ1Y3QgbXNtX2lwY19wb3J0X2FkZHIgcG9ydF9hZGRyOworICAgIHN0cnVjdCBtc21faXBjX3BvcnRfbmFtZSBwb3J0X25hbWU7CisgIH0gYWRkcjsKK307CisKKyNkZWZpbmUgTVNNX0lQQ19XQUlUX0ZPUkVWRVIgKH4wKSAvKiB0aW1lb3V0IGZvciBwZXJtYW5lbnQgc3Vic2NyaXB0aW9uICovCisKKyNpZm5kZWYgQUZfTVNNX0lQQworI2RlZmluZSBBRl9NU01fSVBDIDI3CisjZW5kaWYKKworI2lmbmRlZiBQRl9NU01fSVBDCisjZGVmaW5lIFBGX01TTV9JUEMgQUZfTVNNX0lQQworI2VuZGlmCisKKyNkZWZpbmUgTVNNX0lQQ19BRERSX05BTUUgMQorI2RlZmluZSBNU01fSVBDX0FERFJfSUQgMgorCitzdHJ1Y3Qgc29ja2FkZHJfbXNtX2lwYyB7CisgIHVuc2lnbmVkIHNob3J0IGZhbWlseTsKKyAgc3RydWN0IG1zbV9pcGNfYWRkciBhZGRyZXNzOworICB1bnNpZ25lZCBjaGFyIHJlc2VydmVkOworfTsKKworc3RydWN0IGNvbmZpZ19zZWNfcnVsZXNfYXJncyB7CisgIGludCBudW1fZ3JvdXBfaW5mbzsKKyAgdWludDMyX3Qgc2VydmljZV9pZDsKKyAgdWludDMyX3QgaW5zdGFuY2VfaWQ7CisgIHVuc2lnbmVkIHJlc2VydmVkOworICBnaWRfdCBncm91cF9pZFswXTsKK307CisKKyNkZWZpbmUgSVBDX1JPVVRFUl9JT0NUTF9NQUdJQyAoMHhDMykKKworI2RlZmluZSBJUENfUk9VVEVSX0lPQ1RMX0dFVF9WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX0lPUihJUENfUk9VVEVSX0lPQ1RMX01BR0lDLCAwLCB1bnNpZ25lZCBpbnQpCisKKyNkZWZpbmUgSVBDX1JPVVRFUl9JT0NUTF9HRVRfTVRVIF9JT1IoSVBDX1JPVVRFUl9JT0NUTF9NQUdJQywgMSwgdW5zaWduZWQgaW50KQorCisjZGVmaW5lIElQQ19ST1VURVJfSU9DVExfTE9PS1VQX1NFUlZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfSU9XUihJUENfUk9VVEVSX0lPQ1RMX01BR0lDLCAyLCBzdHJ1Y3Qgc29ja2FkZHJfbXNtX2lwYykKKworI2RlZmluZSBJUENfUk9VVEVSX0lPQ1RMX0dFVF9DVVJSX1BLVF9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX0lPUihJUENfUk9VVEVSX0lPQ1RMX01BR0lDLCAzLCB1bnNpZ25lZCBpbnQpCisKKyNkZWZpbmUgSVBDX1JPVVRFUl9JT0NUTF9CSU5EX0NPTlRST0xfUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9JT1IoSVBDX1JPVVRFUl9JT0NUTF9NQUdJQywgNCwgdW5zaWduZWQgaW50KQorCisjZGVmaW5lIElQQ19ST1VURVJfSU9DVExfQ09ORklHX1NFQ19SVUxFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfSU9SKElQQ19ST1VURVJfSU9DVExfTUFHSUMsIDUsIHN0cnVjdCBjb25maWdfc2VjX3J1bGVzX2FyZ3MpCisKK3N0cnVjdCBtc21faXBjX3NlcnZlcl9pbmZvIHsKKyAgdWludDMyX3Qgbm9kZV9pZDsKKyAgdWludDMyX3QgcG9ydF9pZDsKKyAgdWludDMyX3Qgc2VydmljZTsKKyAgdWludDMyX3QgaW5zdGFuY2U7Cit9OworCitzdHJ1Y3Qgc2VydmVyX2xvb2t1cF9hcmdzIHsKKyAgc3RydWN0IG1zbV9pcGNfcG9ydF9uYW1lIHBvcnRfbmFtZTsKKyAgaW50IG51bV9lbnRyaWVzX2luX2FycmF5OworICBpbnQgbnVtX2VudHJpZXNfZm91bmQ7CisgIHVpbnQzMl90IGxvb2t1cF9tYXNrOworICBzdHJ1Y3QgbXNtX2lwY19zZXJ2ZXJfaW5mbyBzcnZfaW5mb1swXTsKK307CisKKyNlbmRpZgorCisjaWZuZGVmIF9VQVBJX01TTV9STU5FVF9IXworI2RlZmluZSBfVUFQSV9NU01fUk1ORVRfSF8KKworLyogQml0bWFwIG1hY3JvcyBmb3IgUm1ORVQgZHJpdmVyIG9wZXJhdGlvbiBtb2RlLiAqLworI2RlZmluZSBSTU5FVF9NT0RFX05PTkUgKDB4MDApCisjZGVmaW5lIFJNTkVUX01PREVfTExQX0VUSCAoMHgwMSkKKyNkZWZpbmUgUk1ORVRfTU9ERV9MTFBfSVAgKDB4MDIpCisjZGVmaW5lIFJNTkVUX01PREVfUU9TICgweDA0KQorI2RlZmluZSBSTU5FVF9NT0RFX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFJNTkVUX01PREVfTExQX0VUSCB8IFJNTkVUX01PREVfTExQX0lQIHwgUk1ORVRfTU9ERV9RT1MpCisKKyNkZWZpbmUgUk1ORVRfSVNfTU9ERV9RT1MobW9kZSkgKChtb2RlICYgUk1ORVRfTU9ERV9RT1MpID09IFJNTkVUX01PREVfUU9TKQorI2RlZmluZSBSTU5FVF9JU19NT0RFX0lQKG1vZGUpICgobW9kZSAmIFJNTkVUX01PREVfTExQX0lQKSA9PSBSTU5FVF9NT0RFX0xMUF9JUCkKKworZW51bSBybW5ldF9pb2N0bF9jbWRzX2UgeworICBSTU5FVF9JT0NUTF9TRVRfTExQX0VUSEVSTkVUID0gMHgwMDAwODlGMSwgLyogU2V0IEV0aGVybmV0IHByb3RvY29sICAqLworICBSTU5FVF9JT0NUTF9TRVRfTExQX0lQID0gMHgwMDAwODlGMiwgICAgICAgLyogU2V0IFJBV0lQIHByb3RvY29sICAgICAqLworICBSTU5FVF9JT0NUTF9HRVRfTExQID0gMHgwMDAwODlGMywgICAgICAgICAgLyogR2V0IGxpbmsgcHJvdG9jb2wgICAgICAqLworICBSTU5FVF9JT0NUTF9TRVRfUU9TX0VOQUJMRSA9IDB4MDAwMDg5RjQsICAgLyogU2V0IFFvUyBoZWFkZXIgZW5hYmxlZCAqLworICBSTU5FVF9JT0NUTF9TRVRfUU9TX0RJU0FCTEUgPSAweDAwMDA4OUY1LCAgLyogU2V0IFFvUyBoZWFkZXIgZGlzYWJsZWQqLworICBSTU5FVF9JT0NUTF9HRVRfUU9TID0gMHgwMDAwODlGNiwgICAgICAgICAgLyogR2V0IFFvUyBoZWFkZXIgc3RhdGUgICAqLworICBSTU5FVF9JT0NUTF9HRVRfT1BNT0RFID0gMHgwMDAwODlGNywgICAgICAgLyogR2V0IG9wZXJhdGlvbiBtb2RlICAgICAqLworICBSTU5FVF9JT0NUTF9PUEVOID0gMHgwMDAwODlGOCwgICAgICAgICAgICAgLyogT3BlbiB0cmFuc3BvcnQgcG9ydCAgICAqLworICBSTU5FVF9JT0NUTF9DTE9TRSA9IDB4MDAwMDg5RjksICAgICAgICAgICAgLyogQ2xvc2UgdHJhbnNwb3J0IHBvcnQgICAqLworICBSTU5FVF9JT0NUTF9GTE9XX0VOQUJMRSA9IDB4MDAwMDg5RkEsICAgICAgLyogRmxvdyBlbmFibGUgICAgICAgICAgICAqLworICBSTU5FVF9JT0NUTF9GTE9XX0RJU0FCTEUgPSAweDAwMDA4OUZCLCAgICAgLyogRmxvdyBkaXNhYmxlICAgICAgICAgICAqLworICBSTU5FVF9JT0NUTF9GTE9XX1NFVF9ITkRMID0gMHgwMDAwODlGQywgICAgLyogU2V0IGZsb3cgaGFuZGxlICAgICAgICAqLworICBSTU5FVF9JT0NUTF9FWFRFTkRFRCA9IDB4MDAwMDg5RkQsICAgICAgICAgLyogRXh0ZW5kZWQgSU9DVExzICAgICAgICAqLworICBSTU5FVF9JT0NUTF9NQVgKK307CisKK2VudW0gcm1uZXRfaW9jdGxfZXh0ZW5kZWRfY21kc19lIHsKKyAgLyogUm1OZXQgRGF0YSBSZXF1aXJlZCBJT0NUTHMgKi8KKyAgUk1ORVRfSU9DVExfR0VUX1NVUFBPUlRFRF9GRUFUVVJFUyA9IDB4MDAwMCwgICAvKiBHZXQgZmVhdHVyZXMgICAgKi8KKyAgUk1ORVRfSU9DVExfU0VUX01SVSA9IDB4MDAwMSwgICAgICAgICAgICAgICAgICAvKiBTZXQgTVJVICAgICAgICAgKi8KKyAgUk1ORVRfSU9DVExfR0VUX01SVSA9IDB4MDAwMiwgICAgICAgICAgICAgICAgICAvKiBHZXQgTVJVICAgICAgICAgKi8KKyAgUk1ORVRfSU9DVExfR0VUX0VQSUQgPSAweDAwMDMsICAgICAgICAgICAgICAgICAvKiBHZXQgZW5kcG9pbnQgSUQgKi8KKyAgUk1ORVRfSU9DVExfR0VUX0RSSVZFUl9OQU1FID0gMHgwMDA0LCAgICAgICAgICAvKiBHZXQgZHJpdmVyIG5hbWUgKi8KKyAgUk1ORVRfSU9DVExfQUREX01VWF9DSEFOTkVMID0gMHgwMDA1LCAgICAgICAgICAvKiBBZGQgTVVYIElEICAgICAgKi8KKyAgUk1ORVRfSU9DVExfU0VUX0VHUkVTU19EQVRBX0ZPUk1BVCA9IDB4MDAwNiwgICAvKiBTZXQgRURGICAgICAgICAgKi8KKyAgUk1ORVRfSU9DVExfU0VUX0lOR1JFU1NfREFUQV9GT1JNQVQgPSAweDAwMDcsICAvKiBTZXQgSURGICAgICAgICAgKi8KKyAgUk1ORVRfSU9DVExfU0VUX0FHR1JFR0FUSU9OX0NPVU5UID0gMHgwMDA4LCAgICAvKiBTZXQgYWdnIGNvdW50ICAgKi8KKyAgUk1ORVRfSU9DVExfR0VUX0FHR1JFR0FUSU9OX0NPVU5UID0gMHgwMDA5LCAgICAvKiBHZXQgYWdnIGNvdW50ICAgKi8KKyAgUk1ORVRfSU9DVExfU0VUX0FHR1JFR0FUSU9OX1NJWkUgPSAweDAwMEEsICAgICAvKiBTZXQgYWdnIHNpemUgICAgKi8KKyAgUk1ORVRfSU9DVExfR0VUX0FHR1JFR0FUSU9OX1NJWkUgPSAweDAwMEIsICAgICAvKiBHZXQgYWdnIHNpemUgICAgKi8KKyAgUk1ORVRfSU9DVExfRkxPV19DT05UUk9MID0gMHgwMDBDLCAgICAgICAgICAgICAvKiBEbyBmbG93IGNvbnRyb2wgKi8KKyAgUk1ORVRfSU9DVExfR0VUX0RGTFRfQ09OVFJPTF9DSEFOTkVMID0gMHgwMDBELCAvKiBGb3IgbGVnYWN5IHVzZSAgKi8KKyAgUk1ORVRfSU9DVExfR0VUX0hXU1dfTUFQID0gMHgwMDBFLCAgICAgICAgICAgICAvKiBHZXQgSFcvU1cgbWFwICAgKi8KKyAgUk1ORVRfSU9DVExfU0VUX1JYX0hFQURST09NID0gMHgwMDBGLCAgICAgICAgICAvKiBSWCBIZWFkcm9vbSAgICAgKi8KKyAgUk1ORVRfSU9DVExfR0VUX0VQX1BBSVIgPSAweDAwMTAsICAgICAgICAgICAgICAvKiBFbmRwb2ludCBwYWlyICAgKi8KKyAgUk1ORVRfSU9DVExfU0VUX1FPU19WRVJTSU9OID0gMHgwMDExLCAgICAgICAgICAvKiA4LzYgYnl0ZSBRb1MgaGRyKi8KKyAgUk1ORVRfSU9DVExfR0VUX1FPU19WRVJTSU9OID0gMHgwMDEyLCAgICAgICAgICAvKiA4LzYgYnl0ZSBRb1MgaGRyKi8KKyAgUk1ORVRfSU9DVExfR0VUX1NVUFBPUlRFRF9RT1NfTU9ERVMgPSAweDAwMTMsICAvKiBHZXQgUW9TIG1vZGVzICAgKi8KKyAgUk1ORVRfSU9DVExfU0VUX1NMRUVQX1NUQVRFID0gMHgwMDE0LCAgICAgICAgICAvKiBTZXQgc2xlZXAgc3RhdGUgKi8KKyAgUk1ORVRfSU9DVExfU0VUX1hMQVRfREVWX0lORk8gPSAweDAwMTUsICAgICAgICAvKiB4bGF0IGRldiBuYW1lICAgKi8KKyAgUk1ORVRfSU9DVExfRVhURU5ERURfTUFYID0gMHgwMDE2Cit9OworCisvKiBSZXR1cm4gdmFsdWVzIGZvciB0aGUgUk1ORVRfSU9DVExfR0VUX1NVUFBPUlRFRF9GRUFUVVJFUyBJT0NUTCAqLworI2RlZmluZSBSTU5FVF9JT0NUTF9GRUFUX05PVElGWV9NVVhfQ0hBTk5FTCAoMSA8PCAwKQorI2RlZmluZSBSTU5FVF9JT0NUTF9GRUFUX1NFVF9FR1JFU1NfREFUQV9GT1JNQVQgKDEgPDwgMSkKKyNkZWZpbmUgUk1ORVRfSU9DVExfRkVBVF9TRVRfSU5HUkVTU19EQVRBX0ZPUk1BVCAoMSA8PCAyKQorI2RlZmluZSBSTU5FVF9JT0NUTF9GRUFUX1NFVF9BR0dSRUdBVElPTl9DT1VOVCAoMSA8PCAzKQorI2RlZmluZSBSTU5FVF9JT0NUTF9GRUFUX0dFVF9BR0dSRUdBVElPTl9DT1VOVCAoMSA8PCA0KQorI2RlZmluZSBSTU5FVF9JT0NUTF9GRUFUX1NFVF9BR0dSRUdBVElPTl9TSVpFICgxIDw8IDUpCisjZGVmaW5lIFJNTkVUX0lPQ1RMX0ZFQVRfR0VUX0FHR1JFR0FUSU9OX1NJWkUgKDEgPDwgNikKKyNkZWZpbmUgUk1ORVRfSU9DVExfRkVBVF9GTE9XX0NPTlRST0wgKDEgPDwgNykKKyNkZWZpbmUgUk1ORVRfSU9DVExfRkVBVF9HRVRfREZMVF9DT05UUk9MX0NIQU5ORUwgKDEgPDwgOCkKKyNkZWZpbmUgUk1ORVRfSU9DVExfRkVBVF9HRVRfSFdTV19NQVAgKDEgPDwgOSkKKworLyogSW5wdXQgdmFsdWVzIGZvciB0aGUgUk1ORVRfSU9DVExfU0VUX0VHUkVTU19EQVRBX0ZPUk1BVCBJT0NUTCAgKi8KKyNkZWZpbmUgUk1ORVRfSU9DVExfRUdSRVNTX0ZPUk1BVF9NQVAgKDEgPDwgMSkKKyNkZWZpbmUgUk1ORVRfSU9DVExfRUdSRVNTX0ZPUk1BVF9BR0dSRUdBVElPTiAoMSA8PCAyKQorI2RlZmluZSBSTU5FVF9JT0NUTF9FR1JFU1NfRk9STUFUX01VWElORyAoMSA8PCAzKQorI2RlZmluZSBSTU5FVF9JT0NUTF9FR1JFU1NfRk9STUFUX0NIRUNLU1VNICgxIDw8IDQpCisKKy8qIElucHV0IHZhbHVlcyBmb3IgdGhlIFJNTkVUX0lPQ1RMX1NFVF9JTkdSRVNTX0RBVEFfRk9STUFUIElPQ1RMICovCisjZGVmaW5lIFJNTkVUX0lPQ1RMX0lOR1JFU1NfRk9STUFUX01BUCAoMSA8PCAxKQorI2RlZmluZSBSTU5FVF9JT0NUTF9JTkdSRVNTX0ZPUk1BVF9ERUFHR1JFR0FUSU9OICgxIDw8IDIpCisjZGVmaW5lIFJNTkVUX0lPQ1RMX0lOR1JFU1NfRk9STUFUX0RFTVVYSU5HICgxIDw8IDMpCisjZGVmaW5lIFJNTkVUX0lPQ1RMX0lOR1JFU1NfRk9STUFUX0NIRUNLU1VNICgxIDw8IDQpCisKKy8qIFVzZXIgc3BhY2UgbWF5IG5vdCBoYXZlIHRoaXMgZGVmaW5lZC4gKi8KKyNpZm5kZWYgSUZOQU1TSVoKKyNkZWZpbmUgSUZOQU1TSVogMTYKKyNlbmRpZgorCitzdHJ1Y3Qgcm1uZXRfaW9jdGxfZXh0ZW5kZWRfcyB7CisgIHVpbnQzMl90IGV4dGVuZGVkX2lvY3RsOworICB1bmlvbiB7CisgICAgdWludDMyX3QgZGF0YTsgLyogR2VuZXJpYyBkYXRhIGZpZWxkIGZvciBtb3N0IGV4dGVuZGVkIElPQ1RMcyAqLworICAgIGludDhfdCBpZl9uYW1lW0lGTkFNU0laXTsKKyAgICBzdHJ1Y3QgeworICAgICAgdWludDMyX3QgbXV4X2lkOworICAgICAgaW50OF90IHZjaGFubmVsX25hbWVbSUZOQU1TSVpdOworICAgIH0gcm1uZXRfbXV4X3ZhbDsKKyAgICBzdHJ1Y3QgeworICAgICAgdWludDhfdCBmbG93X21vZGU7CisgICAgICB1aW50OF90IG11eF9pZDsKKyAgICB9IGZsb3dfY29udHJvbF9wcm9wOworICAgIHN0cnVjdCB7CisgICAgICB1aW50MzJfdCBjb25zdW1lcl9waXBlX251bTsKKyAgICAgIHVpbnQzMl90IHByb2R1Y2VyX3BpcGVfbnVtOworICAgIH0gaXBhX2VwX3BhaXI7CisgIH0gdTsKK307CisKK3N0cnVjdCBybW5ldF9pb2N0bF9kYXRhX3MgeworICB1bmlvbiB7CisgICAgdWludDMyX3Qgb3BlcmF0aW9uX21vZGU7CisgICAgdWludDMyX3QgdGNtX2hhbmRsZTsKKyAgfSB1OworfTsKKworI2RlZmluZSBSTU5FVF9JT0NUTF9RT1NfTU9ERV82ICgxIDw8IDApCisjZGVmaW5lIFJNTkVUX0lPQ1RMX1FPU19NT0RFXzggKDEgPDwgMSkKKworI2RlZmluZSBRTUlfUU9TX0hEUl9TIF9fYXR0cmlidXRlKChfX3BhY2tlZF9fKSkgcW1pX3Fvc19oZHJfcworc3RydWN0IFFNSV9RT1NfSERSX1MgeworICB1bnNpZ25lZCBjaGFyIHZlcnNpb247CisgIHVuc2lnbmVkIGNoYXIgZmxhZ3M7CisgIHVpbnQzMl90IGZsb3dfaWQ7Cit9OworCitzdHJ1Y3QgcW1pX3Fvc19oZHI4X3MgeworICBzdHJ1Y3QgUU1JX1FPU19IRFJfUyBoZHI7CisgIHVpbnQ4X3QgcmVzZXJ2ZWRbMl07Cit9IF9fYXR0cmlidXRlKChfX3BhY2tlZF9fKSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTYtMDg0NC9wb2MuYyBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE2LTA4NDQvcG9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI0Mjc2OAotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE2LTA4NDQvcG9jLmMKQEAgLTAsMCArMSw3OSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgdmFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNkZWZpbmUgX0dOVV9TT1VSQ0UKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8bmV0L2lmX2FycC5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3ByY3RsLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlICJsb2NhbF9wb2MuaCIKKworI2RlZmluZSBXQU5fSU9DX01BR0lDIDB4NjkKKyNkZWZpbmUgV0FOX0lPQ1RMX0FERF9GTFRfUlVMRSAwCisjZGVmaW5lIFdBTl9JT0NUTF9BRERfRkxUX0lOREVYIDIKKyNkZWZpbmUgV0FOX0lPQ19BRERfRkxUX1JVTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9JT1dSKFdBTl9JT0NfTUFHSUMsIFdBTl9JT0NUTF9BRERfRkxUX1JVTEUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdHJ1Y3QgaXBhX2luc3RhbGxfZmx0cl9ydWxlX3JlcV9tc2dfdjAxICopCisKKyNkZWZpbmUgV0FOX0lPQ19BRERfRkxUX1JVTEVfSU5ERVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9JT1dSKFdBTl9JT0NfTUFHSUMsIFdBTl9JT0NUTF9BRERfRkxUX0lOREVYLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdHJ1Y3QgaXBhX2ZsdHJfaW5zdGFsbGVkX25vdGlmX3JlcV9tc2dfdjAxICopCisKK2ludCB0cmlnZ2VyKGludCBzZmQsIGNoYXIgKmlmbmFtZSkgeworICBpbnQgcmV0OworICBzdHJ1Y3QgaWZyZXEgaWZyOworICB1bnNpZ25lZCBjbWQgPSBSTU5FVF9JT0NUTF9FWFRFTkRFRDsKKyAgc3RybGNweShpZnIuaWZyX25hbWUsIGlmbmFtZSwgSUZOQU1TSVopOworICBzdHJ1Y3Qgcm1uZXRfaW9jdGxfZXh0ZW5kZWRfcyBleHRlbmRhdGE7CisgIGludCBpOworICBpZnIuaWZyX2lmcnUuaWZydV9kYXRhID0gJmV4dGVuZGF0YTsKKyAgZXh0ZW5kYXRhLmV4dGVuZGVkX2lvY3RsID0gUk1ORVRfSU9DVExfQUREX01VWF9DSEFOTkVMOworICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgZXh0ZW5kYXRhLnUucm1uZXRfbXV4X3ZhbC5tdXhfaWQgPSByYW5kKCk7CisgICAgcHJpbnRmKCJbLV0gY2FsbCBpb2N0bCAlZFxuIiwgaSk7CisgICAgaWYgKGlvY3RsKHNmZCwgY21kLCAmaWZyKSA8IDApIHsKKyAgICAgIHByaW50ZigiJXMsICVzXG4iLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgIHJldCA9IC0xOworICAgIH0KKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK2ludCBtYWluKCkgeworICBpbnQgc29ja2ZkOworICBjaGFyICppZm5hbWUgPSAicm1uZXRfaXBhMCI7CisKKyAgc3JhbmQodGltZShOVUxMKSk7CisKKyAgaWYgKChzb2NrZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCkpIDwgMCkgeworICAgIHByaW50Zigic29ja2V0ID0gJWQsICVzXG4iLCBzb2NrZmQsIHN0cmVycm9yKGVycm5vKSk7CisgICAgZXhpdCgxKTsKKyAgfQorCisgIHRyaWdnZXIoc29ja2ZkLCBpZm5hbWUpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE2LTEwMjI5L0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9DVkUtMjAxNi0xMDIyOS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3OWZlMTUKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9DVkUtMjAxNi0xMDIyOS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzAgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gQ1ZFLTIwMTYtMTAyMjkKK0xPQ0FMX1NSQ19GSUxFUyA6PSBwb2MuYworTE9DQUxfTVVMVElMSUIgOj0gYm90aAorTE9DQUxfTU9EVUxFX1NURU1fMzIgOj0gJChMT0NBTF9NT0RVTEUpMzIKK0xPQ0FMX01PRFVMRV9TVEVNXzY0IDo9ICQoTE9DQUxfTU9EVUxFKTY0CisKKyMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHN0cyB2dHMKK0xPQ0FMX0NUU19URVNUX1BBQ0tBR0UgOj0gYW5kcm9pZC5zZWN1cml0eS5jdHMKKworTE9DQUxfQVJNX01PREUgOj0gYXJtCitMT0NBTF9DUFBGTEFHUyA9IC1XYWxsIC1XZXJyb3IKK2luY2x1ZGUgJChCVUlMRF9DVFNfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE2LTEwMjI5L3BvYy5jIGIvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTYtMTAyMjkvcG9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEwNzkzZAotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE2LTEwMjI5L3BvYy5jCkBAIC0wLDAgKzEsOTggQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjZGVmaW5lIEVWSUxfU1RSSU5HICIxMjM0NTY3ODlceDAwT1ZFUldSSVRFXHgwMCIKK2ludCB1ZHBfc2VuZCgpCit7CisgIGludCBzOworICBzdHJ1Y3Qgc29ja2FkZHJfaW42IGFkZHI7CisgIGNoYXIgZGF0YVsxNjBdOworICBzID0gc29ja2V0KEFGX0lORVQ2LCBTT0NLX0RHUkFNLCBJUFBST1RPX0lQKTsKKyAgbWVtc2V0KCZhZGRyLCAwLCBzaXplb2YoYWRkcikpOworICBhZGRyLnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CisgIGFkZHIuc2luNl9wb3J0ID0gaHRvbnMoNDM3ODYpOworICBpbmV0X3B0b24oQUZfSU5FVDYsICI6OjEiLCAmKGFkZHIuc2luNl9hZGRyKSk7CisgIHNlbmR0byhzLCAiZGF0YSIsIDQsIDAsIChzdHJ1Y3Qgc29ja2FkZHIqKSZhZGRyLCBzaXplb2YoYWRkcikpOworICBtZW1zZXQoZGF0YSwgMCwgc2l6ZW9mKGRhdGEpKTsKKyAgbWVtY3B5KGRhdGEsIEVWSUxfU1RSSU5HLCBzaXplb2YoRVZJTF9TVFJJTkcpKTsKKyAgc2VuZHRvKHMsIGRhdGEsIHNpemVvZihkYXRhKSwgMCwgKHN0cnVjdCBzb2NrYWRkciopJmFkZHIsIHNpemVvZihhZGRyKSk7CisgIHJldHVybiAwOworfQorCitpbnQgdWRwX3JlY3YoKQoreworICBpbnQgczsKKyAgc3RydWN0IHNvY2thZGRyX2luNiBhZGRyOworICBzdHJ1Y3QgbXNnaGRyIG1zZzsKKyAgc3RydWN0IGlvdmVjIGlvdlsyXTsKKyAgY2hhciBidWYxWzEwXSwgYnVmMlsxMF0sIGJ1ZjNbMTBdOworCisgIHMgPSBzb2NrZXQoQUZfSU5FVDYsIFNPQ0tfREdSQU0sIElQUFJPVE9fSVApOworICBtZW1zZXQoJmFkZHIsIDAsIHNpemVvZihhZGRyKSk7CisgIGFkZHIuc2luNl9mYW1pbHkgPSBBRl9JTkVUNjsKKyAgYWRkci5zaW42X3BvcnQgPSBodG9ucyg0Mzc4Nik7CisgIGluZXRfcHRvbihBRl9JTkVUNiwgIjo6IiwgJihhZGRyLnNpbjZfYWRkcikpOworICBiaW5kKHMsIChzdHJ1Y3Qgc29ja2FkZHIqKSZhZGRyLCAxMjgpOworCisgIG1lbXNldChidWYxLCAwLCBzaXplb2YoYnVmMSkpOworICBtZW1zZXQoYnVmMiwgMCwgc2l6ZW9mKGJ1ZjIpKTsKKyAgbWVtc2V0KGJ1ZjMsIDAsIHNpemVvZihidWYzKSk7CisgIG1lbXNldChpb3YsICAwLCBzaXplb2YoaW92KSk7CisgIG1lbXNldCgmbXNnLCAwLCBzaXplb2YobXNnKSk7CisgIG1zZy5tc2dfaW92ID0gaW92OworICBtc2cubXNnX2lvdmxlbiA9IDI7CisgIGlvdlswXS5pb3ZfYmFzZSA9IGJ1ZjE7CisgIGlvdlswXS5pb3ZfbGVuID0gc2l6ZW9mKGJ1ZjEpOworICBpb3ZbMV0uaW92X2Jhc2UgPSBidWYyOworICBpb3ZbMV0uaW92X2xlbiA9IHNpemVvZihidWYyKTsKKyAgcmVjdm1zZyhzLCAmbXNnLCAwKTsKKworICBtZW1zZXQoYnVmMSwgMCwgc2l6ZW9mKGJ1ZjEpKTsKKyAgbWVtc2V0KGJ1ZjIsIDAsIHNpemVvZihidWYyKSk7IC8vIGJ1ZjIgaXMgemVyb2VkIGhlcmUuCisgIG1lbXNldChidWYzLCAwLCBzaXplb2YoYnVmMykpOworICBtZW1zZXQoaW92LCAgMCwgc2l6ZW9mKGlvdikpOworICBtZW1zZXQoJm1zZywgMCwgc2l6ZW9mKG1zZykpOworICBtc2cubXNnX2lvdiA9IGlvdjsKKyAgbXNnLm1zZ19pb3ZsZW4gPSAxOworICBpb3ZbMF0uaW92X2Jhc2UgPSBidWYzOworICBpb3ZbMF0uaW92X2xlbiA9IHNpemVvZihidWYzKTsKKyAgcmVjdm1zZyhzLCAmbXNnLCBNU0dfUEVFSyk7IC8vIE5vIHJlZnJlbmNlIHRvIGJ1ZjIgaW4gdGhpcyBjYWxsLgorCisgIHByaW50ZigiJXNcbiIsIGJ1ZjIpOyAvLyBJZiBidWYyIGhhcyBjb250ZW50cyBPVkVSV1JJVEUsIGEgdnVsbiBoYXMgb2NjdXJlZC4KKyAgcmV0dXJuIDA7IC8vIEV4cGxvaXQgbXVzdCBvY2N1ciBpbiBhIGZvcmtlZCBwcm9jZXNzLCByZXR1cm4gMTEzIHdvbid0IHdvcmsgaGVyZS4KK30KKworaW50IG1haW4oKQoreworICBwaWRfdCBzZW5kLCByZWN2OworICBpbnQgc3RhdHVzID0gMDsKKyAgaWYgKChyZWN2ID0gZm9yaygpKSA9PSAwKQorICAgIGV4aXQodWRwX3JlY3YoKSk7CisgIHNsZWVwKDEpOworICBpZiAoKHNlbmQgPSBmb3JrKCkpID09IDApCisgICAgZXhpdCh1ZHBfc2VuZCgpKTsKKyAgZm9yIChwaWRfdCBwaWQgPSB3YWl0KCZzdGF0dXMpOyBwaWQgPiAwOyBwaWQgPSB3YWl0KCZzdGF0dXMpKTsKK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE2LTIxMDkvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE2LTIxMDkvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmY0OWQwCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTYtMjEwOS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzIgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gQ1ZFLTIwMTYtMjEwOQorTE9DQUxfU1JDX0ZJTEVTIDo9IHBvYy5jCitMT0NBTF9NVUxUSUxJQiA6PSBib3RoCitMT0NBTF9NT0RVTEVfU1RFTV8zMiA6PSAkKExPQ0FMX01PRFVMRSkzMgorTE9DQUxfTU9EVUxFX1NURU1fNjQgOj0gJChMT0NBTF9NT0RVTEUpNjQKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3J5cHRvCisKKyMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBzdHMKK0xPQ0FMX0NUU19URVNUX1BBQ0tBR0UgOj0gYW5kcm9pZC5zZWN1cml0eS5jdHMKKworTE9DQUxfQVJNX01PREUgOj0gYXJtCitMT0NBTF9DRkxBR1MgPSAtV2FsbCAtV2Vycm9yCisKK2luY2x1ZGUgJChCVUlMRF9DVFNfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE2LTIxMDkvcG9jLmMgYi9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9DVkUtMjAxNi0yMTA5L3BvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZTY1MTIKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9DVkUtMjAxNi0yMTA5L3BvYy5jCkBAIC0wLDAgKzEsNDYgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNkZWZpbmUgX0dOVV9TT1VSQ0UKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKwordW5zaWduZWQgY2hhciBiYWRfYmlvW10gPSB7CisgIDB4MzAsIDB4ODQsIDB4N2YsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgIDB4ZmYsIDB4ZmYKK307CisKKworWDUwOSAqY2VydDsKKworaW50IG1haW4odm9pZCl7CisgIHVuc2lnbmVkIGxvbmcgZXJyID0gMDsKKyAgRVJSX2xvYWRfY3J5cHRvX3N0cmluZ3MoKTsKKyAgQklPICppbiA9IEJJT19uZXcoQklPX3NfbWVtKCkpOworICBpZihpbiAhPSBOVUxMKXsKKyAgICBCSU9fd3JpdGUoaW4sIGJhZF9iaW8sIHNpemVvZihiYWRfYmlvKSk7CisgICAgY2VydCA9IGQyaV9YNTA5X2JpbyhpbiwgTlVMTCk7IC8vIHg1MDkgc2hvdWxkIGJlIHByZXNlbnQgb24gYWxsIEFuZHJvaWQgc3lzdGVtcworICAgIEJJT19mcmVlKGluKTsKKyAgICBpZihjZXJ0ICE9IE5VTEwpeworICAgICAgWDUwOV9mcmVlKGNlcnQpOworICAgIH0KKyAgICBpZigoZXJyID0gRVJSX2dldF9lcnJvcigpKQorICAgICAgICA9PSAweDA3MDAwMDQxKSAvLyBtYWxsb2MgZXJyb3IKKyAgICAgIHJldHVybiAxMTM7CisgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE2LTI0MTkvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE2LTI0MTkvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTZmZDZlCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTYtMjQxOS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNDEgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gQ1ZFLTIwMTYtMjQxOQorTE9DQUxfU1JDX0ZJTEVTIDo9IHBvYy5jcHAKK0xPQ0FMX01VTFRJTElCIDo9IGJvdGgKK0xPQ0FMX01PRFVMRV9TVEVNXzMyIDo9ICQoTE9DQUxfTU9EVUxFKTMyCitMT0NBTF9NT0RVTEVfU1RFTV82NCA6PSAkKExPQ0FMX01PRFVMRSk2NAorCitMT0NBTF9DX0lOQ0xVREVTICs9ICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJsb2cgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJiaW5kZXIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJ1dGlscyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnN0YWdlZnJpZ2h0IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGlibWVkaWEgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJtZWRpYWRybQorCisjIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0CitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgc3RzCitMT0NBTF9DVFNfVEVTVF9QQUNLQUdFIDo9IGFuZHJvaWQuc2VjdXJpdHkuY3RzCisKK0xPQ0FMX0FSTV9NT0RFIDo9IGFybQorTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXJyb3IKK0xPQ0FMX0xERkxBR1MgKz0gLWZQSUUgLXBpZQorTERGTEFHUyArPSAtcmR5bmFtaWMKK2luY2x1ZGUgJChCVUlMRF9DVFNfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE2LTI0MTkvcG9jLmNwcCBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE2LTI0MTkvcG9jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjI2NDcwCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTYtMjQxOS9wb2MuY3BwCkBAIC0wLDAgKzEsNzkgQEAKKy8qKgorKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisjaW5jbHVkZSA8YW5kcm9pZC9sb2cuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KKyNpbmNsdWRlIDxiaW5kZXIvVGV4dE91dHB1dC5oPgorI2luY2x1ZGUgPGRybS9Ecm1Db25zdHJhaW50cy5oPgorI2luY2x1ZGUgPGRybS9Ecm1Db252ZXJ0ZWRTdGF0dXMuaD4KKyNpbmNsdWRlIDxkcm0vRHJtSW5mby5oPgorI2luY2x1ZGUgPGRybS9Ecm1JbmZvUmVxdWVzdC5oPgorI2luY2x1ZGUgPGRybS9Ecm1JbmZvU3RhdHVzLmg+CisjaW5jbHVkZSA8ZHJtL0RybU1ldGFkYXRhLmg+CisjaW5jbHVkZSA8ZHJtL0RybVJpZ2h0cy5oPgorI2luY2x1ZGUgPGRybS9Ecm1TdXBwb3J0SW5mby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgorI2luY2x1ZGUgPG1lZGlhL0lEcm0uaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXJDbGllbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworaW50IElORk9fTEVBS19CVUZGRVJfU0laRSA9IDI1NjsKKworaW50IGRvSW5mb3JMZWFrVGVzdCgpIHsKKyAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOworICBzcDxJQmluZGVyPiBtZWRpYVBsYXllclNldmljZSA9IHNtLT5jaGVja1NlcnZpY2UoU3RyaW5nMTYoIm1lZGlhLnBsYXllciIpKTsKKworICBzcDxJTWVkaWFQbGF5ZXJTZXJ2aWNlPiBpTWVkaWFQbGF5ZXJTZXJ2aWNlID0KKyAgICAgIElNZWRpYVBsYXllclNlcnZpY2U6OmFzSW50ZXJmYWNlKG1lZGlhUGxheWVyU2V2aWNlKTsKKworICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihpTWVkaWFQbGF5ZXJTZXJ2aWNlLT5nZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICBJTWVkaWFQbGF5ZXJTZXJ2aWNlOjphc0JpbmRlcihpTWVkaWFQbGF5ZXJTZXJ2aWNlKQorICAgICAgLT50cmFuc2FjdCgyIC8qTUFLRV9EUk0qLywgZGF0YSwgJnJlcGx5KTsgLy9NQUtFX0RSTSA6IDIgKE4gJiBPIGJyYW5jaCksIDYgKE0gQnJhbmNoKQorICBzcDxJRHJtPiBpRHJtID0gaW50ZXJmYWNlX2Nhc3Q8SURybT4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKKworICBQYXJjZWwgZGF0YTIsIHJlcGx5MjsKKyAgZGF0YTIud3JpdGVJbnRlcmZhY2VUb2tlbihpRHJtLT5nZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICBJRHJtOjphc0JpbmRlcihpRHJtKS0+dHJhbnNhY3QoNyAvKkdFVF9LRVlfUkVRVUVTVCovLCBkYXRhMiwgJnJlcGx5Mik7CisgIHJlcGx5Mi5yZWFkSW50MzIoKTsKKyAgcmVwbHkyLnJlYWRJbnQzMigpOworICB1bnNpZ25lZCBpbnQgbGVha2VkID0gcmVwbHkyLnJlYWRJbnQzMigpOworCisgIEFMT0dFKCJsZWFrZWQgZGF0YTogMHglMDh4IiwgbGVha2VkKTsKKworICByZXR1cm4gKGxlYWtlZCA9PSAwID8gMCA6IDEpOworfQorCitpbnQgbWFpbih2b2lkKSB7CisgIGludCBsZWFrZWQgPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyBpKyspIHsKKyAgICBsZWFrZWQgPSBkb0luZm9yTGVha1Rlc3QoKTsKKyAgICBpZiAobGVha2VkKSB7CisgICAgICBBTE9HRSgiSU9NWF9JbmZvTGVhayBiMjYzMjM0NTUiKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE2LTI0NjAvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE2LTI0NjAvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xODZhN2RhCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTYtMjQ2MC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNDkgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gQ1ZFLTIwMTYtMjQ2MAorTE9DQUxfU1JDX0ZJTEVTIDo9IHBvYy5jcHAKK0xPQ0FMX01VTFRJTElCIDo9IGJvdGgKK0xPQ0FMX01PRFVMRV9TVEVNXzMyIDo9ICQoTE9DQUxfTU9EVUxFKTMyCitMT0NBTF9NT0RVTEVfU1RFTV82NCA6PSAkKExPQ0FMX01PRFVMRSk2NAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICAgICAgbGliY3V0aWxzIFwKKyAgICAgICAgbGliYyBcCisgICAgICAgIGxpYmJpbmRlciBcCisgICAgICAgIGxpYnV0aWxzIFwKKyAgICAgICAgbGlibG9nIFwKKyAgICAgICAgbGlibWVkaWEgXAorICAgICAgICBsaWJzb3VuZHRyaWdnZXIgXAorICAgICAgICBsaWJndWkKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCisgICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvaW5jbHVkZS9tZWRpYS8gXAorICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKKyAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tZWZmZWN0cykgXAorICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykKKworIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIHN0cworTE9DQUxfQ1RTX1RFU1RfUEFDS0FHRSA6PSBhbmRyb2lkLnNlY3VyaXR5LmN0cworCitMT0NBTF9BUk1fTU9ERSA6PSBhcm0KK0xPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2Vycm9yCitMT0NBTF9MREZMQUdTICs9IC1mUElFIC1waWUKK0xPQ0FMX0xERkxBR1MgKz0gLXJkeW5hbWljCitpbmNsdWRlICQoQlVJTERfQ1RTX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9DVkUtMjAxNi0yNDYwL3BvYy5jcHAgYi9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9DVkUtMjAxNi0yNDYwL3BvYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODNhNWNmMwotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE2LTI0NjAvcG9jLmNwcApAQCAtMCwwICsxLDc0IEBACisvKioKKyogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyQ2xpZW50Lmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVJlY29yZGVyLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworaW50IG1haW4oX19hdHRyaWJ1dGVfXygodW51c2VkKSkgaW50IGFyZ2MsCisgICAgICAgICBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSBjaGFyICpjb25zdCBhcmd2W10pIHsKKworICBzcDxJU2VydmljZU1hbmFnZXI+IHNtID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7CisgIHNwPElCaW5kZXI+IE1laWRhUGxheWVyU2VydmljZSA9IHNtLT5jaGVja1NlcnZpY2UoU3RyaW5nMTYoIm1lZGlhLnBsYXllciIpKTsKKworICAvLyBnZXQgSU1lZGlhUGxheWVyU2VydmljZQorICBzcDxJTWVkaWFQbGF5ZXJTZXJ2aWNlPiBpTVBTZXJ2aWNlID0KKyAgICAgIElNZWRpYVBsYXllclNlcnZpY2U6OmFzSW50ZXJmYWNlKE1laWRhUGxheWVyU2VydmljZSk7CisgIEFMT0dJKCJHZXQgaU1QU2VydmljZSBpbnN0YW5jZSwgMHglMDhseFxuIiwgKHVuc2lnbmVkIGxvbmcpaU1QU2VydmljZS5nZXQoKSk7CisgIHNwPElNZWRpYVJlY29yZGVyPiByZWNvcmRlciA9CisgICAgICBpTVBTZXJ2aWNlLT5jcmVhdGVNZWRpYVJlY29yZGVyKFN0cmluZzE2KCJwb2MiKSk7CisgIEFMT0dJKCJHZXQgcmVjb3JkZXIgaW5zdGFuY2UsIDB4JTA4bHhcbiIsICh1bnNpZ25lZCBsb25nKXJlY29yZGVyLmdldCgpKTsKKworICBjb25zdCBjaGFyICpmaWxlTmFtZSA9ICIvc2RjYXJkL3Rlc3QiOworICBpbnQgZmQgPSBvcGVuKGZpbGVOYW1lLCBPX1JEV1IgfCBPX0NSRUFULCAwNzQ0KTsKKyAgcmVjb3JkZXItPnNldFZpZGVvU291cmNlKDIpOworICByZWNvcmRlci0+c2V0T3V0cHV0RmlsZShmZCk7CisgIHJlY29yZGVyLT5zZXRPdXRwdXRGb3JtYXQoMCk7CisgIHJlY29yZGVyLT5pbml0KCk7CisgIHJlY29yZGVyLT5wcmVwYXJlKCk7CisgIHJlY29yZGVyLT5zdGFydCgpOworCisgIC8vIGdldCBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyCisgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGlHQlAgPSByZWNvcmRlci0+cXVlcnlTdXJmYWNlTWVkaWFTb3VyY2UoKTsKKyAgQUxPR0koIkdldCBpR0JQIGluc3RhbmNlLCAweCUwOGx4XG4iLCAodW5zaWduZWQgbG9uZylpR0JQLmdldCgpKTsKKworICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihpR0JQLT5nZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICBkYXRhLndyaXRlSW50MzIoLTEpOworICBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjphc0JpbmRlcihpR0JQKS0+dHJhbnNhY3QoMTAgLypDT05ORUNUKi8sIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVwbHkpOworICBpbnQgbGVuID0gcmVwbHkuZGF0YUF2YWlsKCk7CisgIEFMT0dJKCJkYXRhQXZhaWwgPSAlZFxuIiwgbGVuKTsKKyAgdW5zaWduZWQgaW50ICpsZWFrZWRfZGF0YSA9ICh1bnNpZ25lZCBpbnQgKilyZXBseS5kYXRhKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgKGxlbiAvIDQpOyArK2kpIHsKKyAgICBBTE9HRSgiSUdyYXBoaWNCdWZmZXJQcm9kdWNlcl9JbmZvTGVhayBsZWFrZWQgZGF0YSA9IDB4JTA4eCIsCisgICAgICAgICAgbGVha2VkX2RhdGFbaV0pOworCisgICAgaWYgKGkgPCA0ICYmIGxlYWtlZF9kYXRhW2ldICE9IDApIHsKKyAgICAgIEFMT0dFKCJJR3JhcGhpY0J1ZmZlclByb2R1Y2VyX0luZm8gaXMgTGVha2VkIik7CisgICAgfQorICB9CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTYtMjQ3MS9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTYtMjQ3MS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmZmNzBhYTEKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9DVkUtMjAxNi0yNDcxL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBDVkUtMjAxNi0yNDcxCitMT0NBTF9TUkNfRklMRVMgOj0gcG9jLmMKK0xPQ0FMX01VTFRJTElCIDo9IGJvdGgKK0xPQ0FMX01PRFVMRV9TVEVNXzMyIDo9ICQoTE9DQUxfTU9EVUxFKTMyCitMT0NBTF9NT0RVTEVfU1RFTV82NCA6PSAkKExPQ0FMX01PRFVMRSk2NAorCisjIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0CitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgc3RzCitMT0NBTF9DVFNfVEVTVF9QQUNLQUdFIDo9IGFuZHJvaWQuc2VjdXJpdHkuY3RzCisKK0xPQ0FMX0FSTV9NT0RFIDo9IGFybQorTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXJyb3IKK0xPQ0FMX0xERkxBR1MgKz0gLWZQSUUgLXBpZQorTERGTEFHUyArPSAtcmR5bmFtaWMKK2luY2x1ZGUgJChCVUlMRF9DVFNfRVhFQ1VUQUJMRSkKKwpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTYtMjQ3MS9wb2MuYyBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE2LTI0NzEvcG9jLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTBlYTEzYQotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE2LTI0NzEvcG9jLmMKQEAgLTAsMCArMSwxNTQgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlIDxhbmRyb2lkL2xvZy5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGpuaS5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPG5ldC9pZi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZGVmaW5lIEFJRF9JTkVUIDMwMDMgICAgLyogY2FuIGNyZWF0ZSBBRl9JTkVUIGFuZCBBRl9JTkVUNiBzb2NrZXRzICovCisjZGVmaW5lIEFJRF9ORVRfUkFXIDMwMDQgLyogY2FuIGNyZWF0ZSByYXcgSU5FVCBzb2NrZXRzICovCisjZGVmaW5lIEFJRF9ORVRfQURNSU4gMzAwNQorI2RlZmluZSBTSU9DU0lXUFJJViAweDhCMEMKKyNkZWZpbmUgU0lPQ0dJV05BTUUgMHg4QjAxCisjZGVmaW5lIFNJT0NHSVdSQU5HRSAweDhCMEIKKyNkZWZpbmUgU0lPQ1NJV1NDQU4gMHg4QjE4CisjZGVmaW5lIFNJT0NTSVdTUFkgMHg4QjEwCisjZGVmaW5lIElXX0VTU0lEX01BWF9TSVpFIDMyCisjZGVmaW5lIElXX01BWF9GUkVRVUVOQ0lFUyAzMgorI2RlZmluZSBTSVJfTUFDX01BWF9TU0lEX0xFTkdUSCAzMgorI2RlZmluZSBJV19TQ0FOX1RISVNfRVNTSUQgMHgwMDAyCisKK3R5cGVkZWYgaW50IF9fczMyOwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIF9fdTg7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IF9fdTE2OworCitzdHJ1Y3QgaXdfcGFyYW0geworICBfX3MzMiB2YWx1ZTsgICAvKiBUaGUgdmFsdWUgb2YgdGhlIHBhcmFtZXRlciBpdHNlbGYgKi8KKyAgX191OCBmaXhlZDsgICAgLyogSGFyZHdhcmUgc2hvdWxkIG5vdCB1c2UgYXV0byBzZWxlY3QgKi8KKyAgX191OCBkaXNhYmxlZDsgLyogRGlzYWJsZSB0aGUgZmVhdHVyZSAqLworICBfX3UxNiBmbGFnczsgICAvKiBWYXJpb3VzIHNwZWNpZmMgZmxhZ3MgKGlmIGFueSkgKi8KK307CisKK3N0cnVjdCBpd19wb2ludCB7CisgIHZvaWQgKnBvaW50ZXI7IC8qIFBvaW50ZXIgdG8gdGhlIGRhdGEgIChpbiB1c2VyIHNwYWNlKSAqLworICBfX3UxNiBsZW5ndGg7ICAvKiBudW1iZXIgb2YgZmllbGRzIG9yIHNpemUgaW4gYnl0ZXMgKi8KKyAgX191MTYgZmxhZ3M7ICAgLyogT3B0aW9uYWwgcGFyYW1zICovCit9OworCitzdHJ1Y3QgaXdfcXVhbGl0eSB7CisgIF9fdTggcXVhbDsgICAgLyogbGluayBxdWFsaXR5ICglcmV0cmllcywgU05SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlbWlzc2VkIGJlYWNvbnMgb3IgYmV0dGVyLi4uKSAqLworICBfX3U4IGxldmVsOyAgIC8qIHNpZ25hbCBsZXZlbCAoZEJtKSAqLworICBfX3U4IG5vaXNlOyAgIC8qIG5vaXNlIGxldmVsIChkQm0pICovCisgIF9fdTggdXBkYXRlZDsgLyogRmxhZ3MgdG8ga25vdyBpZiB1cGRhdGVkICovCit9OworCitzdHJ1Y3QgaXdfZnJlcSB7CisgIF9fczMyIG07ICAgIC8qIE1hbnRpc3NhICovCisgIF9fczE2IGU7ICAgIC8qIEV4cG9uZW50ICovCisgIF9fdTggaTsgICAgIC8qIExpc3QgaW5kZXggKHdoZW4gaW4gcmFuZ2Ugc3RydWN0KSAqLworICBfX3U4IGZsYWdzOyAvKiBGbGFncyAoZml4ZWQvYXV0bykgKi8KK307CisKK3VuaW9uIGl3cmVxX2RhdGEgeworICAvKiBDb25maWcgLSBnZW5lcmljICovCisgIGNoYXIgbmFtZVtJRk5BTVNJWl07CisgIC8qIE5hbWUgOiB1c2VkIHRvIHZlcmlmeSB0aGUgcHJlc2VuY2Ugb2YgIHdpcmVsZXNzIGV4dGVuc2lvbnMuCisgICAqIE5hbWUgb2YgdGhlIHByb3RvY29sL3Byb3ZpZGVyLi4uICovCisgIHN0cnVjdCBpd19wb2ludCBlc3NpZDsgICAgLyogRXh0ZW5kZWQgbmV0d29yayBuYW1lICovCisgIHN0cnVjdCBpd19wYXJhbSBud2lkOyAgICAgLyogbmV0d29yayBpZCAob3IgZG9tYWluIC0gdGhlIGNlbGwpICovCisgIHN0cnVjdCBpd19mcmVxIGZyZXE7ICAgICAgLyogZnJlcXVlbmN5IG9yIGNoYW5uZWwgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogMC0xMDAwID0gY2hhbm5lbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogPiAxMDAwID0gZnJlcXVlbmN5IGluIEh6ICovCisgIHN0cnVjdCBpd19wYXJhbSBzZW5zOyAgICAgLyogc2lnbmFsIGxldmVsIHRocmVzaG9sZCAqLworICBzdHJ1Y3QgaXdfcGFyYW0gYml0cmF0ZTsgIC8qIGRlZmF1bHQgYml0IHJhdGUgKi8KKyAgc3RydWN0IGl3X3BhcmFtIHR4cG93ZXI7ICAvKiBkZWZhdWx0IHRyYW5zbWl0IHBvd2VyICovCisgIHN0cnVjdCBpd19wYXJhbSBydHM7ICAgICAgLyogUlRTIHRocmVzaG9sZCB0aHJlc2hvbGQgKi8KKyAgc3RydWN0IGl3X3BhcmFtIGZyYWc7ICAgICAvKiBGcmFnbWVudGF0aW9uIHRocmVzaG9sZCAqLworICBfX3UzMiBtb2RlOyAgICAgICAgICAgICAgIC8qIE9wZXJhdGlvbiBtb2RlICovCisgIHN0cnVjdCBpd19wYXJhbSByZXRyeTsgICAgLyogUmV0cnkgbGltaXRzICYgbGlmZXRpbWUgKi8KKyAgc3RydWN0IGl3X3BvaW50IGVuY29kaW5nOyAvKiBFbmNvZGluZyBzdHVmZiA6IHRva2VucyAqLworICBzdHJ1Y3QgaXdfcGFyYW0gcG93ZXI7ICAgIC8qIFBNIGR1cmF0aW9uL3RpbWVvdXQgKi8KKyAgc3RydWN0IGl3X3F1YWxpdHkgcXVhbDsgICAvKiBRdWFsaXR5IHBhcnQgb2Ygc3RhdGlzdGljcyAqLworICBzdHJ1Y3Qgc29ja2FkZHIgYXBfYWRkcjsgIC8qIEFjY2VzcyBwb2ludCBhZGRyZXNzICovCisgIHN0cnVjdCBzb2NrYWRkciBhZGRyOyAgICAgLyogRGVzdGluYXRpb24gYWRkcmVzcyAoaHcvbWFjKSAqLworICBzdHJ1Y3QgaXdfcGFyYW0gcGFyYW07ICAgIC8qIE90aGVyIHNtYWxsIHBhcmFtZXRlcnMgKi8KKyAgc3RydWN0IGl3X3BvaW50IGRhdGE7ICAgICAvKiBPdGhlciBsYXJnZSBwYXJhbWV0ZXJzICovCit9OworCitzdHJ1Y3QgaXdyZXEgeworICB1bmlvbiB7CisgICAgY2hhciBpZnJuX25hbWVbSUZOQU1TSVpdOworICB9IGlmcl9pZnJuOworICB1bmlvbiBpd3JlcV9kYXRhIHU7Cit9OworCitzdHJ1Y3QgaXdfc2Nhbl9yZXEgeworICBfX3U4IHNjYW5fdHlwZTsKKyAgX191OCBlc3NpZF9sZW47CisgIF9fdTggbnVtX2NoYW5uZWxzOworICBfX3U4IGZsYWdzOworICBzdHJ1Y3Qgc29ja2FkZHIgYnNzaWQ7CisgIF9fdTggZXNzaWRbSVdfRVNTSURfTUFYX1NJWkVdOworICBfX3UzMiBtaW5fY2hhbm5lbF90aW1lOyAvKiBpbiBUVSAqLworICBfX3UzMiBtYXhfY2hhbm5lbF90aW1lOyAvKiBpbiBUVSAqLworICBzdHJ1Y3QgaXdfZnJlcSBjaGFubmVsX2xpc3RbSVdfTUFYX0ZSRVFVRU5DSUVTXTsKK307CisKK2ludCBtYWluKHZvaWQpIHsKKyAgaW50IGZkOworICBpbnQgcmV0ID0gLTI7CisgIHN0cnVjdCBpd3JlcSBwckl3UmVxOworICBpbnQgaSA9IDA7CisgIHN0cnVjdCBpd19zY2FuX3JlcSAqc2Nhbl9yZXE7CisgIGlmIChnZXR1aWQoKSAhPSAwKQorICAgIHJldHVybiAtMTsKKyAgZ2lkX3QgZ2lkX2dyb3Vwc1tdID0ge0FJRF9JTkVULCBBSURfTkVUX0FETUlOfTsKKyAgc2V0Z3JvdXBzKHNpemVvZihnaWRfZ3JvdXBzKSAvIHNpemVvZihnaWRfZ3JvdXBzWzBdKSwgZ2lkX2dyb3Vwcyk7CisgIHNldHVpZCgyMDAwKTsKKyAgZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApOworICBpZiAoZmQgPT0gLTEpIHsKKyAgICBwZXJyb3IoIlstXSBzb2NrZXQgZmFpbGVkIVxuIik7CisgICAgcmV0dXJuIC0xOworICB9CisgIHN0cm5jcHkocHJJd1JlcS5pZnJfbmFtZSwgIndsYW4wIiwgSUZOQU1TSVopOworICBwckl3UmVxLmlmcl9uYW1lW0lGTkFNU0laIC0gMV0gPSAnXDAnOworICBzY2FuX3JlcSA9IChzdHJ1Y3QgaXdfc2Nhbl9yZXEgKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBpd19zY2FuX3JlcSkgKyAweGZmKTsKKyAgbWVtc2V0KHNjYW5fcmVxLCAweGZmLCBzaXplb2Yoc3RydWN0IGl3X3NjYW5fcmVxKSArIDB4ZmYpOworICBzY2FuX3JlcS0+ZXNzaWRfbGVuID0gMHhmZjsKKyAgcHJJd1JlcS51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBpd19zY2FuX3JlcSk7CisgIHBySXdSZXEudS5kYXRhLnBvaW50ZXIgPSBzY2FuX3JlcTsKKworICBwckl3UmVxLnUuZGF0YS5mbGFncyA9IElXX1NDQU5fVEhJU19FU1NJRDsKKyAgZm9yIChpID0gMDsgaSA8IDB4MTAwMDsgKytpKSB7CisgICAgZXJybm8gPSAwOworICAgIHJldCA9IGlvY3RsKGZkLCBTSU9DU0lXU0NBTiwgJnBySXdSZXEpOworICAgIHByaW50ZigiIHRyeSAlZCB0aW1lcywgJXMgY3Jhc2hlZCA/IFxuIiwgaSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgfQorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE2LTM4MTgvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE2LTM4MTgvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wZmUxNmI3Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTYtMzgxOC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzIgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gQ1ZFLTIwMTYtMzgxOAorTE9DQUxfU1JDX0ZJTEVTIDo9IHBvYy5jCitMT0NBTF9NVUxUSUxJQiA6PSBib3RoCitMT0NBTF9NT0RVTEVfU1RFTV8zMiA6PSAkKExPQ0FMX01PRFVMRSkzMgorTE9DQUxfTU9EVUxFX1NURU1fNjQgOj0gJChMT0NBTF9NT0RVTEUpNjQKKworIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIHN0cworTE9DQUxfQ1RTX1RFU1RfUEFDS0FHRSA6PSBhbmRyb2lkLnNlY3VyaXR5LmN0cworCitMT0NBTF9BUk1fTU9ERSA6PSBhcm0KK0xPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2Vycm9yCitMT0NBTF9MREZMQUdTICs9IC1mUElFIC1waWUKK0xPQ0FMX0xERkxBR1MgKz0gLXJkeW5hbWljCitpbmNsdWRlICQoQlVJTERfQ1RTX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9DVkUtMjAxNi0zODE4L3BvYy5jIGIvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTYtMzgxOC9wb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTIwNGZjCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTYtMzgxOC9wb2MuYwpAQCAtMCwwICsxLDU1IEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjZGVmaW5lIF9HTlVfU09VUkNFCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCitpbnQgbWFpbih2b2lkKSB7CisgIHN0cnVjdCBybGltaXQgcmxpbTsKKyAgc2l6ZV90IGk7CisKKyAgaW50IHJlc3VsdCA9IGdldHJsaW1pdChSTElNSVRfQVMsICZybGltKTsKKyAgcHJpbnRmKCIlbHVcbiIsIHJsaW0ucmxpbV9jdXIpOworICBwcmludGYoIiVsdVxuIiwgcmxpbS5ybGltX21heCk7CisKKyAgcmxpbS5ybGltX2N1ciA9IDM4NCAqIDEwMjQgKiAxMDI0OworICByZXN1bHQgPSBzZXRybGltaXQoUkxJTUlUX0FTLCAmcmxpbSk7CisKKyAgLyoKKyAgICogSXNzdWUgZXhpc3RzIG9ubHkgaW4ga2l0a2F0LiBJdCBwYXNzZXMgaW4KKyAgICogYW5kcm9pZCBNIG9ud2FyZHMuIEluIGZhaWx1cmUgc2NlbmFyaW8sIGRldmljZSByZWJvb3RzLgorICAgKi8KKyAgc2l6ZV90IHRvX2FsbG9jID0gMS42ICogMTAyNCAqIDEwMjQgKiAxMDI0OworICBjaGFyICptZW0gPSAoY2hhciAqKW1hbGxvYyh0b19hbGxvYyk7CisKKyAgcHJpbnRmKCIlcFxuIiwgbWVtKTsKKyAgaWYgKG1lbSkgeworICAgIGZvciAoaSA9IDA7IGkgPCB0b19hbGxvYzsgaSsrKSB7CisgICAgICBtZW1baV0gPSAwOworICAgIH0KKyAgICBwcmludGYoImZpbGxlZFxuIik7CisgIH0KKworICBmcmVlKG1lbSk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTYtNjczMC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTYtNjczMC9BbmRyb2lkLm1rCmluZGV4IGY3MTZkYjMuLjhiMWZhYzUgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE2LTY3MzAvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9DVkUtMjAxNi02NzMwL0FuZHJvaWQubWsKQEAgLTIyLDEwICsyMiwxMSBAQAogTE9DQUxfTU9EVUxFX1NURU1fNjQgOj0gJChMT0NBTF9NT0RVTEUpNjQKIAogIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzIHN0cwogTE9DQUxfQ1RTX1RFU1RfUEFDS0FHRSA6PSBhbmRyb2lkLnNlY3VyaXR5LmN0cwogCiBMT0NBTF9BUk1fTU9ERSA6PSBhcm0KLUxPQ0FMX0NGTEFHUyA6PSAtV25vLXVudXNlZC1wYXJhbWV0ZXIKK0xPQ0FMX0NGTEFHUyA6PSAtV25vLXVudXNlZC1wYXJhbWV0ZXIgLVdhbGwgLVdlcnJvcgorTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbWlzc2luZy1maWVsZC1pbml0aWFsaXplcnMgLVduby11bnVzZWQtbGFiZWwKIExPQ0FMX0xERkxBR1MgKz0gLWZQSUUgLXBpZQogaW5jbHVkZSAkKEJVSUxEX0NUU19FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTYtNjczMS9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTYtNjczMS9BbmRyb2lkLm1rCmluZGV4IDQxNDliOTYuLjJiYmUwYTYgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE2LTY3MzEvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9DVkUtMjAxNi02NzMxL0FuZHJvaWQubWsKQEAgLTIyLDEwICsyMiwxMSBAQAogTE9DQUxfTU9EVUxFX1NURU1fNjQgOj0gJChMT0NBTF9NT0RVTEUpNjQKIAogIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzIHN0cwogTE9DQUxfQ1RTX1RFU1RfUEFDS0FHRSA6PSBhbmRyb2lkLnNlY3VyaXR5LmN0cwogCiBMT0NBTF9BUk1fTU9ERSA6PSBhcm0KLUxPQ0FMX0NGTEFHUyA6PSAtV25vLXVudXNlZC1wYXJhbWV0ZXIKK0xPQ0FMX0NGTEFHUyA6PSAtV25vLXVudXNlZC1wYXJhbWV0ZXIgLVdhbGwgLVdlcnJvcgorTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbWlzc2luZy1maWVsZC1pbml0aWFsaXplcnMgLVduby11bnVzZWQtbGFiZWwKIExPQ0FMX0xERkxBR1MgKz0gLWZQSUUgLXBpZQogaW5jbHVkZSAkKEJVSUxEX0NUU19FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTYtNjczMi9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTYtNjczMi9BbmRyb2lkLm1rCmluZGV4IDEzZmM2NWUuLjExODczMDIgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE2LTY3MzIvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9DVkUtMjAxNi02NzMyL0FuZHJvaWQubWsKQEAgLTIyLDEwICsyMiwxMSBAQAogTE9DQUxfTU9EVUxFX1NURU1fNjQgOj0gJChMT0NBTF9NT0RVTEUpNjQKIAogIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzIHN0cwogTE9DQUxfQ1RTX1RFU1RfUEFDS0FHRSA6PSBhbmRyb2lkLnNlY3VyaXR5LmN0cwogCiBMT0NBTF9BUk1fTU9ERSA6PSBhcm0KLUxPQ0FMX0NGTEFHUyA6PSAtV25vLXVudXNlZC1wYXJhbWV0ZXIKK0xPQ0FMX0NGTEFHUyA6PSAtV25vLXVudXNlZC1wYXJhbWV0ZXIgLVdhbGwgLVdlcnJvcgorTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbWlzc2luZy1maWVsZC1pbml0aWFsaXplcnMgLVduby11bnVzZWQtbGFiZWwKIExPQ0FMX0xERkxBR1MgKz0gLWZQSUUgLXBpZQogaW5jbHVkZSAkKEJVSUxEX0NUU19FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTYtNjczMy9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTYtNjczMy9BbmRyb2lkLm1rCmluZGV4IGM5NzIxYWMuLjkwZmFlNGUgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE2LTY3MzMvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9DVkUtMjAxNi02NzMzL0FuZHJvaWQubWsKQEAgLTIyLDEwICsyMiwxMSBAQAogTE9DQUxfTU9EVUxFX1NURU1fNjQgOj0gJChMT0NBTF9NT0RVTEUpNjQKIAogIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzIHN0cwogTE9DQUxfQ1RTX1RFU1RfUEFDS0FHRSA6PSBhbmRyb2lkLnNlY3VyaXR5LmN0cwogCiBMT0NBTF9BUk1fTU9ERSA6PSBhcm0KLUxPQ0FMX0NGTEFHUyA6PSAtV25vLXVudXNlZC1wYXJhbWV0ZXIKK0xPQ0FMX0NGTEFHUyA6PSAtV25vLXVudXNlZC1wYXJhbWV0ZXIgLVdhbGwgLVdlcnJvcgorTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbWlzc2luZy1maWVsZC1pbml0aWFsaXplcnMgLVduby11bnVzZWQtbGFiZWwKIExPQ0FMX0xERkxBR1MgKz0gLWZQSUUgLXBpZQogaW5jbHVkZSAkKEJVSUxEX0NUU19FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTYtNjczNC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTYtNjczNC9BbmRyb2lkLm1rCmluZGV4IDFjYjQxN2UuLmFkNzcxMmQgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE2LTY3MzQvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9DVkUtMjAxNi02NzM0L0FuZHJvaWQubWsKQEAgLTIyLDEwICsyMiwxMSBAQAogTE9DQUxfTU9EVUxFX1NURU1fNjQgOj0gJChMT0NBTF9NT0RVTEUpNjQKIAogIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzIHN0cwogTE9DQUxfQ1RTX1RFU1RfUEFDS0FHRSA6PSBhbmRyb2lkLnNlY3VyaXR5LmN0cwogCiBMT0NBTF9BUk1fTU9ERSA6PSBhcm0KLUxPQ0FMX0NGTEFHUyA6PSAtV25vLXVudXNlZC1wYXJhbWV0ZXIKK0xPQ0FMX0NGTEFHUyA6PSAtV25vLXVudXNlZC1wYXJhbWV0ZXIgLVdhbGwgLVdlcnJvcgorTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbWlzc2luZy1maWVsZC1pbml0aWFsaXplcnMgLVduby11bnVzZWQtbGFiZWwKIExPQ0FMX0xERkxBR1MgKz0gLWZQSUUgLXBpZQogaW5jbHVkZSAkKEJVSUxEX0NUU19FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTYtNjczNS9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTYtNjczNS9BbmRyb2lkLm1rCmluZGV4IDdkZWY3MWQuLjljMDA3YzcgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE2LTY3MzUvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9DVkUtMjAxNi02NzM1L0FuZHJvaWQubWsKQEAgLTIyLDEwICsyMiwxMSBAQAogTE9DQUxfTU9EVUxFX1NURU1fNjQgOj0gJChMT0NBTF9NT0RVTEUpNjQKIAogIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzIHN0cwogTE9DQUxfQ1RTX1RFU1RfUEFDS0FHRSA6PSBhbmRyb2lkLnNlY3VyaXR5LmN0cwogCiBMT0NBTF9BUk1fTU9ERSA6PSBhcm0KLUxPQ0FMX0NGTEFHUyA6PSAtV25vLXVudXNlZC1wYXJhbWV0ZXIKK0xPQ0FMX0NGTEFHUyA6PSAtV25vLXVudXNlZC1wYXJhbWV0ZXIgLVdhbGwgLVdlcnJvcgorTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbWlzc2luZy1maWVsZC1pbml0aWFsaXplcnMgLVduby11bnVzZWQtbGFiZWwKIExPQ0FMX0xERkxBR1MgKz0gLWZQSUUgLXBpZQogaW5jbHVkZSAkKEJVSUxEX0NUU19FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTYtNjczNi9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTYtNjczNi9BbmRyb2lkLm1rCmluZGV4IGMyOWJmYmQuLmRhN2MyMDkgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE2LTY3MzYvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9DVkUtMjAxNi02NzM2L0FuZHJvaWQubWsKQEAgLTIyLDEwICsyMiwxMSBAQAogTE9DQUxfTU9EVUxFX1NURU1fNjQgOj0gJChMT0NBTF9NT0RVTEUpNjQKIAogIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzIHN0cwogTE9DQUxfQ1RTX1RFU1RfUEFDS0FHRSA6PSBhbmRyb2lkLnNlY3VyaXR5LmN0cwogCiBMT0NBTF9BUk1fTU9ERSA6PSBhcm0KLUxPQ0FMX0NGTEFHUyA6PSAtV25vLXVudXNlZC1wYXJhbWV0ZXIKK0xPQ0FMX0NGTEFHUyA6PSAtV25vLXVudXNlZC1wYXJhbWV0ZXIgLVdhbGwgLVdlcnJvcgorTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbWlzc2luZy1maWVsZC1pbml0aWFsaXplcnMgLVduby11bnVzZWQtbGFiZWwKIExPQ0FMX0xERkxBR1MgKz0gLWZQSUUgLXBpZQogaW5jbHVkZSAkKEJVSUxEX0NUU19FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTYtODQyNS9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTYtODQyNS9BbmRyb2lkLm1rCmluZGV4IDNmOGYzYzguLjQ1NjcyZjEgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE2LTg0MjUvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9DVkUtMjAxNi04NDI1L0FuZHJvaWQubWsKQEAgLTIyLDEwICsyMiwxMSBAQAogTE9DQUxfTU9EVUxFX1NURU1fNjQgOj0gJChMT0NBTF9NT0RVTEUpNjQKIAogIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzIHN0cwogTE9DQUxfQ1RTX1RFU1RfUEFDS0FHRSA6PSBhbmRyb2lkLnNlY3VyaXR5LmN0cwogCiBMT0NBTF9BUk1fTU9ERSA6PSBhcm0KLUxPQ0FMX0NGTEFHUyA6PSAtV25vLXVudXNlZC1wYXJhbWV0ZXIKK0xPQ0FMX0NGTEFHUyA6PSAtV25vLXVudXNlZC1wYXJhbWV0ZXIgLVdhbGwgLVdlcnJvcgorTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tdW51c2VkLXZhcmlhYmxlIC1Xbm8tdW51c2VkLWZ1bmN0aW9uCiBMT0NBTF9MREZMQUdTICs9IC1mUElFIC1waWUKIGluY2x1ZGUgJChCVUlMRF9DVFNfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE2LTg0MjYvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE2LTg0MjYvQW5kcm9pZC5tawppbmRleCAzOWM0ZDg0Li5hYTlkMTRhIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9DVkUtMjAxNi04NDI2L0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTYtODQyNi9BbmRyb2lkLm1rCkBAIC0yMiwxMCArMjIsMTEgQEAKIExPQ0FMX01PRFVMRV9TVEVNXzY0IDo9ICQoTE9DQUxfTU9EVUxFKTY0CiAKICMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cyBzdHMKIExPQ0FMX0NUU19URVNUX1BBQ0tBR0UgOj0gYW5kcm9pZC5zZWN1cml0eS5jdHMKIAogTE9DQUxfQVJNX01PREUgOj0gYXJtCi1MT0NBTF9DRkxBR1MgOj0gLVduby11bnVzZWQtcGFyYW1ldGVyCitMT0NBTF9DRkxBR1MgOj0gLVduby11bnVzZWQtcGFyYW1ldGVyIC1XYWxsIC1XZXJyb3IKK0xPQ0FMX0NGTEFHUyArPSAtV25vLXVudXNlZC12YXJpYWJsZSAtV25vLXVudXNlZC1mdW5jdGlvbgogTE9DQUxfTERGTEFHUyArPSAtZlBJRSAtcGllCiBpbmNsdWRlICQoQlVJTERfQ1RTX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9DVkUtMjAxNi04NDI3L0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9DVkUtMjAxNi04NDI3L0FuZHJvaWQubWsKaW5kZXggODRkNWIyNi4uN2UxOTZmZSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTYtODQyNy9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE2LTg0MjcvQW5kcm9pZC5tawpAQCAtMjIsMTAgKzIyLDExIEBACiBMT0NBTF9NT0RVTEVfU1RFTV82NCA6PSAkKExPQ0FMX01PRFVMRSk2NAogCiAjIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0Ci1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMgc3RzCiBMT0NBTF9DVFNfVEVTVF9QQUNLQUdFIDo9IGFuZHJvaWQuc2VjdXJpdHkuY3RzCiAKIExPQ0FMX0FSTV9NT0RFIDo9IGFybQotTE9DQUxfQ0ZMQUdTIDo9IC1Xbm8tdW51c2VkLXBhcmFtZXRlcgorTE9DQUxfQ0ZMQUdTIDo9IC1Xbm8tdW51c2VkLXBhcmFtZXRlciAtV2FsbCAtV2Vycm9yCitMT0NBTF9DRkxBR1MgKz0gLVduby1jb25zdGFudC1jb252ZXJzaW9uIC1Xbm8tdXNlci1kZWZpbmVkLXdhcm5pbmdzCiBMT0NBTF9MREZMQUdTICs9IC1mUElFIC1waWUKIGluY2x1ZGUgJChCVUlMRF9DVFNfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE2LTg0MjgvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE2LTg0MjgvQW5kcm9pZC5tawppbmRleCBkMzdhMWFlLi43NWRhZTI2OTMgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE2LTg0MjgvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9DVkUtMjAxNi04NDI4L0FuZHJvaWQubWsKQEAgLTIyLDEwICsyMiwxMiBAQAogTE9DQUxfTU9EVUxFX1NURU1fNjQgOj0gJChMT0NBTF9NT0RVTEUpNjQKIAogIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzIHN0cwogTE9DQUxfQ1RTX1RFU1RfUEFDS0FHRSA6PSBhbmRyb2lkLnNlY3VyaXR5LmN0cwogCiBMT0NBTF9BUk1fTU9ERSA6PSBhcm0KLUxPQ0FMX0NGTEFHUyA6PSAtV25vLXVudXNlZC1wYXJhbWV0ZXIKK0xPQ0FMX0NGTEFHUyA6PSAtV25vLXVudXNlZC1wYXJhbWV0ZXIgLVdhbGwgLVdlcnJvcgorTE9DQUxfQ0ZMQUdTICs9IC1Xbm8taW5jb21wYXRpYmxlLXBvaW50ZXItdHlwZXMgLVduby1taXNzaW5nLWZpZWxkLWluaXRpYWxpemVycworTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tdW51c2VkLXZhcmlhYmxlCiBMT0NBTF9MREZMQUdTICs9IC1mUElFIC1waWUKIGluY2x1ZGUgJChCVUlMRF9DVFNfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE2LTg0MjkvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE2LTg0MjkvQW5kcm9pZC5tawppbmRleCA2NjE2MjM4Li43YzFjMzA1IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9DVkUtMjAxNi04NDI5L0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTYtODQyOS9BbmRyb2lkLm1rCkBAIC0yMiwxMCArMjIsMTEgQEAKIExPQ0FMX01PRFVMRV9TVEVNXzY0IDo9ICQoTE9DQUxfTU9EVUxFKTY0CiAKICMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cyBzdHMKIExPQ0FMX0NUU19URVNUX1BBQ0tBR0UgOj0gYW5kcm9pZC5zZWN1cml0eS5jdHMKIAogTE9DQUxfQVJNX01PREUgOj0gYXJtCi1MT0NBTF9DRkxBR1MgOj0gLVduby11bnVzZWQtcGFyYW1ldGVyCitMT0NBTF9DRkxBR1MgOj0gLVduby11bnVzZWQtcGFyYW1ldGVyIC1XYWxsIC1XZXJyb3IKK0xPQ0FMX0NGTEFHUyArPSAtV25vLWluY29tcGF0aWJsZS1wb2ludGVyLXR5cGVzIC1Xbm8tbWlzc2luZy1maWVsZC1pbml0aWFsaXplcnMKIExPQ0FMX0xERkxBR1MgKz0gLWZQSUUgLXBpZQogaW5jbHVkZSAkKEJVSUxEX0NUU19FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTYtODQzMC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTYtODQzMC9BbmRyb2lkLm1rCmluZGV4IGY4NzcwMzIuLmQxNjNiZDQgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE2LTg0MzAvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9DVkUtMjAxNi04NDMwL0FuZHJvaWQubWsKQEAgLTIyLDEwICsyMiwxMSBAQAogTE9DQUxfTU9EVUxFX1NURU1fNjQgOj0gJChMT0NBTF9NT0RVTEUpNjQKIAogIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzIHN0cwogTE9DQUxfQ1RTX1RFU1RfUEFDS0FHRSA6PSBhbmRyb2lkLnNlY3VyaXR5LmN0cwogCiBMT0NBTF9BUk1fTU9ERSA6PSBhcm0KLUxPQ0FMX0NGTEFHUyA6PSAtV25vLXVudXNlZC1wYXJhbWV0ZXIKK0xPQ0FMX0NGTEFHUyA6PSAtV25vLXVudXNlZC1wYXJhbWV0ZXIgLVdhbGwgLVdlcnJvcgorTE9DQUxfQ0ZMQUdTICs9IC1Xbm8taW5jb21wYXRpYmxlLXBvaW50ZXItdHlwZXMgLVduby1taXNzaW5nLWZpZWxkLWluaXRpYWxpemVycwogTE9DQUxfTERGTEFHUyArPSAtZlBJRSAtcGllCiBpbmNsdWRlICQoQlVJTERfQ1RTX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9DVkUtMjAxNi04NDMxL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9DVkUtMjAxNi04NDMxL0FuZHJvaWQubWsKaW5kZXggZmIyMTE2ZC4uODFiMDEyMSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTYtODQzMS9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE2LTg0MzEvQW5kcm9pZC5tawpAQCAtMjIsOSArMjIsMTAgQEAKIExPQ0FMX01PRFVMRV9TVEVNXzY0IDo9ICQoTE9DQUxfTU9EVUxFKTY0CiAKICMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cyBzdHMKIExPQ0FMX0NUU19URVNUX1BBQ0tBR0UgOj0gYW5kcm9pZC5zZWN1cml0eS5jdHMKIAogTE9DQUxfQVJNX01PREUgOj0gYXJtCitMT0NBTF9DRkxBR1MgOj0gLVdhbGwgLVdlcnJvcgogTE9DQUxfTERGTEFHUyArPSAtZlBJRSAtcGllCiBpbmNsdWRlICQoQlVJTERfQ1RTX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9DVkUtMjAxNi04NDMyL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9DVkUtMjAxNi04NDMyL0FuZHJvaWQubWsKaW5kZXggNzQ1Y2UxZS4uMjVlNDhmYyAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTYtODQzMi9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE2LTg0MzIvQW5kcm9pZC5tawpAQCAtMjIsMTAgKzIyLDEwIEBACiBMT0NBTF9NT0RVTEVfU1RFTV82NCA6PSAkKExPQ0FMX01PRFVMRSk2NAogCiAjIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0Ci1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMgc3RzCiBMT0NBTF9DVFNfVEVTVF9QQUNLQUdFIDo9IGFuZHJvaWQuc2VjdXJpdHkuY3RzCiAKIExPQ0FMX0FSTV9NT0RFIDo9IGFybQotTE9DQUxfQ0ZMQUdTIDo9IC1Xbm8tdW51c2VkLXBhcmFtZXRlcgorTE9DQUxfQ0ZMQUdTIDo9IC1Xbm8tdW51c2VkLXBhcmFtZXRlciAtV2FsbCAtV2Vycm9yCiBMT0NBTF9MREZMQUdTICs9IC1mUElFIC1waWUKIGluY2x1ZGUgJChCVUlMRF9DVFNfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE2LTg0MzQvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE2LTg0MzQvQW5kcm9pZC5tawppbmRleCBjYmExODc2Li40ZGFhZDVkIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9DVkUtMjAxNi04NDM0L0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTYtODQzNC9BbmRyb2lkLm1rCkBAIC0yMiwxMCArMjIsMTAgQEAKIExPQ0FMX01PRFVMRV9TVEVNXzY0IDo9ICQoTE9DQUxfTU9EVUxFKTY0CiAKICMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cyBzdHMKIExPQ0FMX0NUU19URVNUX1BBQ0tBR0UgOj0gYW5kcm9pZC5zZWN1cml0eS5jdHMKIAogTE9DQUxfQVJNX01PREUgOj0gYXJtCi1MT0NBTF9DRkxBR1MgOj0gLVduby11bnVzZWQtcGFyYW1ldGVyCitMT0NBTF9DRkxBR1MgOj0gLVduby11bnVzZWQtcGFyYW1ldGVyIC1XYWxsIC1XZXJyb3IKIExPQ0FMX0xERkxBR1MgKz0gLWZQSUUgLXBpZQogaW5jbHVkZSAkKEJVSUxEX0NUU19FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTYtODQ2MC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTYtODQ2MC9BbmRyb2lkLm1rCmluZGV4IGJmNTkyZGYuLjA3ZWFiNmMgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE2LTg0NjAvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9DVkUtMjAxNi04NDYwL0FuZHJvaWQubWsKQEAgLTIyLDEwICsyMiwxMSBAQAogTE9DQUxfTU9EVUxFX1NURU1fNjQgOj0gJChMT0NBTF9NT0RVTEUpNjQKIAogIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzIHN0cwogTE9DQUxfQ1RTX1RFU1RfUEFDS0FHRSA6PSBhbmRyb2lkLnNlY3VyaXR5LmN0cwogCiBMT0NBTF9BUk1fTU9ERSA6PSBhcm0KLUxPQ0FMX0NGTEFHUyA6PSAtV25vLXVudXNlZC1wYXJhbWV0ZXIKK0xPQ0FMX0NGTEFHUyA6PSAtV25vLXVudXNlZC1wYXJhbWV0ZXIgLVdhbGwgLVdlcnJvcgorTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbWlzc2luZy1icmFjZXMgLVduby1taXNzaW5nLWZpZWxkLWluaXRpYWxpemVycyAtV25vLXBvaW50ZXItYXJpdGggLVduby1wb2ludGVyLXNpZ24gLVduby11bnVzZWQtdmFyaWFibGUKIExPQ0FMX0xERkxBR1MgKz0gLWZQSUUgLXBpZQogaW5jbHVkZSAkKEJVSUxEX0NUU19FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTYtODQ3OS9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTYtODQ3OS9BbmRyb2lkLm1rCmluZGV4IGY1ZmJkMWEuLjc0NDE0NGMgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE2LTg0NzkvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9DVkUtMjAxNi04NDc5L0FuZHJvaWQubWsKQEAgLTIzLDcgKzIzLDcgQEAKIExPQ0FMX01PRFVMRV9TVEVNXzY0IDo9ICQoTE9DQUxfTU9EVUxFKTY0CiAKICMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cworTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIHN0cwogTE9DQUxfQ1RTX1RFU1RfUEFDS0FHRSA6PSBhbmRyb2lkLnNlY3VyaXR5LmN0cwogCiBMT0NBTF9BUk1fTU9ERSA6PSBhcm0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE2LTg0ODIvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE2LTg0ODIvQW5kcm9pZC5tawppbmRleCA4NzYyYmQzLi5hZTA1YWY2IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9DVkUtMjAxNi04NDgyL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTYtODQ4Mi9BbmRyb2lkLm1rCkBAIC0yMiwxMCArMjIsMTEgQEAKIExPQ0FMX01PRFVMRV9TVEVNXzY0IDo9ICQoTE9DQUxfTU9EVUxFKTY0CiAKICMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cyBzdHMKIExPQ0FMX0NUU19URVNUX1BBQ0tBR0UgOj0gYW5kcm9pZC5zZWN1cml0eS5jdHMKIAogTE9DQUxfQVJNX01PREUgOj0gYXJtCi1MT0NBTF9DRkxBR1MgOj0gLVduby11bnVzZWQtcGFyYW1ldGVyCitMT0NBTF9DRkxBR1MgOj0gLVduby11bnVzZWQtcGFyYW1ldGVyIC1XYWxsIC1XZXJyb3IKK0xPQ0FMX0NGTEFHUyArPSAtV25vLW1pc3NpbmctZmllbGQtaW5pdGlhbGl6ZXJzIC1Xbm8tdW51c2VkLXZhcmlhYmxlCiBMT0NBTF9MREZMQUdTICs9IC1mUElFIC1waWUKIGluY2x1ZGUgJChCVUlMRF9DVFNfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE3LTAzMzMvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE3LTAzMzMvQW5kcm9pZC5tawppbmRleCA1ZTE5MDM2Li5hZTlmYWQ1IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9DVkUtMjAxNy0wMzMzL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTctMDMzMy9BbmRyb2lkLm1rCkBAIC0yMyw3ICsyMyw3IEBACiBMT0NBTF9NT0RVTEVfU1RFTV82NCA6PSAkKExPQ0FMX01PRFVMRSk2NAogCiAjIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0Ci1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBzdHMKIExPQ0FMX0NUU19URVNUX1BBQ0tBR0UgOj0gYW5kcm9pZC5zZWN1cml0eS5jdHMKIAogTE9DQUxfQVJNX01PREUgOj0gYXJtCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9DVkUtMjAxNy0wMzM0L0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9DVkUtMjAxNy0wMzM0L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY2Y2Q2MgotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE3LTAzMzQvQW5kcm9pZC5tawpAQCAtMCwwICsxLDMxIEBACisjIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IENWRS0yMDE3LTAzMzQKK0xPQ0FMX1NSQ19GSUxFUyA6PSBwb2MuYworTE9DQUxfTVVMVElMSUIgOj0gYm90aAorTE9DQUxfTU9EVUxFX1NURU1fMzIgOj0gJChMT0NBTF9NT0RVTEUpMzIKK0xPQ0FMX01PRFVMRV9TVEVNXzY0IDo9ICQoTE9DQUxfTU9EVUxFKTY0CisKKyMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgc3RzIHRlc3QgYXJ0aWZhY3QKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBzdHMKK0xPQ0FMX0NUU19URVNUX1BBQ0tBR0UgOj0gYW5kcm9pZC5zZWN1cml0eS5jdHMKKworTE9DQUxfQVJNX01PREUgOj0gYXJtCitMT0NBTF9DRkxBR1MgPSAtV2FsbCAtV2Vycm9yCisKK2luY2x1ZGUgJChCVUlMRF9DVFNfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE3LTAzMzQvcG9jLmMgYi9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9DVkUtMjAxNy0wMzM0L3BvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ZGQ4ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9DVkUtMjAxNy0wMzM0L3BvYy5jCkBAIC0wLDAgKzEsNDEgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIHZhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjZGVmaW5lIF9HTlVfU09VUkNFCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KK3N0cnVjdCBkcm1fdGVncmFfb3Blbl9jaGFubmVsIHsKKyAgICBfX3UzMiBjbGllbnQ7CisgICAgX191MzIgcGFkOworICAgIHZvaWQqIGNvbnRleHQ7Cit9OworI2RlZmluZSB0bXBfRFJNX0lPQ1RMX1RFR1JBX09QRU5fQ0hBTk5FTCAoaW50KTMyMjIyOTk3MTcKK2ludCBtYWluKCkKK3sKKyAgICBpbnQgZmQsIHJjOworICAgIHN0cnVjdCBkcm1fdGVncmFfb3Blbl9jaGFubmVsIG9wZW5fYXJncyA9IHswLDAsMH07CisgICAgb3Blbl9hcmdzLmNsaWVudCA9IDB4MjE7CisgICAgZmQgPSBvcGVuKCIvZGV2L2RyaS9yZW5kZXJEMTI5IiwgMCwgMCk7CisgICAgcmMgPSBpb2N0bChmZCwgdG1wX0RSTV9JT0NUTF9URUdSQV9PUEVOX0NIQU5ORUwsICZvcGVuX2FyZ3MpOworCisgICAgcHJpbnRmKCJMZWFrZWQgcHRyIGlzICVwXG4iLCBvcGVuX2FyZ3MuY29udGV4dCk7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9DVkUtMjAxNy0wNDI2L0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9DVkUtMjAxNy0wNDI2L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRjMGVhMAotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE3LTA0MjYvQW5kcm9pZC5tawpAQCAtMCwwICsxLDMzIEBACisjIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IENWRS0yMDE3LTA0MjYKK0xPQ0FMX1NSQ19GSUxFUyA6PSBwb2MuYworTE9DQUxfTVVMVElMSUIgOj0gYm90aAorTE9DQUxfTU9EVUxFX1NURU1fMzIgOj0gJChMT0NBTF9NT0RVTEUpMzIKK0xPQ0FMX01PRFVMRV9TVEVNXzY0IDo9ICQoTE9DQUxfTU9EVUxFKTY0CisKKyMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBzdHMKK0xPQ0FMX0NUU19URVNUX1BBQ0tBR0UgOj0gYW5kcm9pZC5zZWN1cml0eS5jdHMKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJsb2cKK0xPQ0FMX0FSTV9NT0RFIDo9IGFybQorTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXJyb3IKK0xPQ0FMX0xERkxBR1MgKz0gLWZQSUUgLXBpZQorTERGTEFHUyArPSAtcmR5bmFtaWMKK2luY2x1ZGUgJChCVUlMRF9DVFNfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE3LTA0MjYvcG9jLmMgYi9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9DVkUtMjAxNy0wNDI2L3BvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYjZjMWQKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9DVkUtMjAxNy0wNDI2L3BvYy5jCkBAIC0wLDAgKzEsNDIgQEAKKy8qKgorKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNkZWZpbmUgX0dOVV9TT1VSQ0UKKyNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworaW50IG1haW4oKSB7CisgIHN0cnVjdCBzdGF0IGJ1ZjsKKworICAvLyAzMjc5OTIzNiBGaXg6IGJ1Z3JlcG9ydHMgZmlsZSBtb3ZlZCBmcm9tIC9kYXRhL2J1Z3JlcG9ydHMgdG8gLyBkaXJlY3RvcnkuCisgIGludCBmZCA9IGxzdGF0KCIvYnVncmVwb3J0cyIsICZidWYpOworICBpZiAoZmQgPCAwKSB7CisgICAgQUxPR0UoIkJ1Z3JlcG9ydHMgZmlsZSBpbiB3cm9uZyBwYXRoIik7CisgIH0KKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE3LTA0NzkvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE3LTA0NzkvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTc3NjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTctMDQ3OS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzcgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gQ1ZFLTIwMTctMDQ3OQorTE9DQUxfU1JDX0ZJTEVTIDo9IHBvYy5jcHAKK0xPQ0FMX01VTFRJTElCIDo9IGJvdGgKK0xPQ0FMX01PRFVMRV9TVEVNXzMyIDo9ICQoTE9DQUxfTU9EVUxFKTMyCitMT0NBTF9NT0RVTEVfU1RFTV82NCA6PSAkKExPQ0FMX01PRFVMRSk2NAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYm1lZGlhIGxpYnV0aWxzIGxpYmJpbmRlciBsaWJhbmRyb2lkIGxpYmF1ZGlvY2xpZW50CitMT0NBTF9DX0lOQ0xVREVTOj0gXAorICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9pbmNsdWRlL21lZGlhLyBcCisgICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L3NlcnZpY2VzLyBcCisgICAgICAgICQoVE9QKS9zeXN0ZW0vbWVkaWEvYXVkaW9fdXRpbHMvaW5jbHVkZS8gXAorICAgICAgICAkKFRPUCkvZXh0ZXJuYWwvc29uaWMvCisKKyMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBzdHMKK0xPQ0FMX1NUU19URVNUX1BBQ0tBR0UgOj0gYW5kcm9pZC5zZWN1cml0eS5jdHMKKworTE9DQUxfQVJNX01PREUgOj0gYXJtCitMT0NBTF9DUFBGTEFHUyA9IC1XYWxsIC1XZXJyb3IKK2luY2x1ZGUgJChCVUlMRF9DVFNfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE3LTA0NzkvcG9jLmNwcCBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE3LTA0NzkvcG9jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDlmZTVlCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTctMDQ3OS9wb2MuY3BwCkBAIC0wLDAgKzEsOTMgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGF1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpb19lZmZlY3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9JQXVkaW9GbGluZ2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvSUVmZmVjdC5oPgorI2luY2x1ZGUgPG1lZGlhL0lFZmZlY3RDbGllbnQuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK3N0cnVjdCBFZmZlY3RDbGllbnQgOiBwdWJsaWMgYW5kcm9pZDo6Qm5FZmZlY3RDbGllbnQgeworICBFZmZlY3RDbGllbnQoKSB7fQorICB2aXJ0dWFsIHZvaWQgY29udHJvbFN0YXR1c0NoYW5nZWQoYm9vbCBjb250cm9sR3JhbnRlZCBfX3VudXNlZCkge30KKyAgdmlydHVhbCB2b2lkIGVuYWJsZVN0YXR1c0NoYW5nZWQoYm9vbCBlbmFibGVkIF9fdW51c2VkKSB7fQorICB2aXJ0dWFsIHZvaWQgY29tbWFuZEV4ZWN1dGVkKHVpbnQzMl90IGNtZENvZGUgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY21kU2l6ZSBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwQ21kRGF0YSBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZXBseVNpemUgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcFJlcGx5RGF0YSBfX3VudXNlZCkge30KK307CisKK3NwPElFZmZlY3Q+IGdFZmZlY3Q7CisKK3ZvaWQgKmRpc2Nvbm5lY3RUaHJlYWQodm9pZCAqKSB7CisgIHVzbGVlcCg1KTsKKyAgaWYgKGdFZmZlY3QgIT0gTlVMTCAmJiBnRWZmZWN0LmdldCgpICE9IE5VTEwpIHsKKyAgICBnRWZmZWN0LT5kaXNjb25uZWN0KCk7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKK2ludCBtYWluKCkgeworICBzdGF0aWMgY29uc3QgZWZmZWN0X3V1aWRfdCBFRkZFQ1RfVUlJRF9FUVVBTElaRVIgPSB7CisgICAgICAweDBiZWQ0MzAwLCAweGRkZDYsIDB4MTFkYiwgMHg4ZjM0LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19OworCisgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZGVzY3JpcHRvcjsKKyAgbWVtc2V0KCZkZXNjcmlwdG9yLCAwLCBzaXplb2YoZGVzY3JpcHRvcikpOworICBkZXNjcmlwdG9yLnR5cGUgPSBFRkZFQ1RfVUlJRF9FUVVBTElaRVI7CisgIGRlc2NyaXB0b3IudXVpZCA9ICpFRkZFQ1RfVVVJRF9OVUxMOworICBzcDxFZmZlY3RDbGllbnQ+IGVmZmVjdENsaWVudChuZXcgRWZmZWN0Q2xpZW50KCkpOworCisgIGNvbnN0IGludDMyX3QgcHJpb3JpdHkgPSAwOworICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkID0gKGF1ZGlvX3Nlc3Npb25fdCkoMTI4KTsKKyAgY29uc3QgYXVkaW9faW9faGFuZGxlX3QgaW8gPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgY29uc3QgU3RyaW5nMTYgb3BQYWNrYWdlTmFtZSgiY29tLmV4cC5wb2MiKTsKKyAgaW50MzJfdCBpZDsKKyAgaW50IGksIGVuYWJsZWQ7CisgIHN0YXR1c190IGVycjsKKworICB1aW50MzJfdCBjbWRDb2RlLCBjbWRTaXplLCBwUmVwbHlTaXplOworICBpbnQgKnBDbWREYXRhLCAqcFJlcGx5RGF0YTsKKworICBjbWRDb2RlID0gRUZGRUNUX0NNRF9HRVRfQ09ORklHOworICBjbWRTaXplID0gMDsKKyAgcFJlcGx5U2l6ZSA9IHNpemVvZihlZmZlY3RfY29uZmlnX3QpOworICBwQ21kRGF0YSA9IChpbnQgKiltYWxsb2MoY21kU2l6ZSk7CisgIHBSZXBseURhdGEgPSAoaW50ICopbWFsbG9jKHBSZXBseVNpemUpOworCisgIGdFZmZlY3QgPSBOVUxMOworICBwdGhyZWFkX3QgcHQ7CisgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+ICZhdWRpb0ZsaW5nZXIgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKworICBmb3IgKGk9MDsgaTwxMDA7IGkrKykgeworICAgIGdFZmZlY3QgPSBhdWRpb0ZsaW5nZXItPmNyZWF0ZUVmZmVjdCgmZGVzY3JpcHRvciwgZWZmZWN0Q2xpZW50LCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW8sIHNlc3Npb25JZCwgb3BQYWNrYWdlTmFtZSwgZ2V0cGlkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnIsICZpZCwgJmVuYWJsZWQpOworICAgIGlmIChnRWZmZWN0ID09IE5VTEwgfHwgZXJyICE9IE5PX0VSUk9SKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHB0aHJlYWRfY3JlYXRlKCZwdCwgTlVMTCwgZGlzY29ubmVjdFRocmVhZCwgTlVMTCk7CisgICAgZXJyID0gZ0VmZmVjdC0+Y29tbWFuZChjbWRDb2RlLCBjbWRTaXplLCAodm9pZCAqKXBDbWREYXRhLCAmcFJlcGx5U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcFJlcGx5RGF0YSk7CisgICAgdXNsZWVwKDUwKTsKKyAgfQorICBzbGVlcCgyKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9DVkUtMjAxNy0wNTA4L0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9DVkUtMjAxNy0wNTA4L0FuZHJvaWQubWsKaW5kZXggMTk0Y2Q5Zi4uZTUxZTk4YiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTctMDUwOC9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE3LTA1MDgvQW5kcm9pZC5tawpAQCAtMjMsNyArMjMsNyBAQAogTE9DQUxfTU9EVUxFX1NURU1fNjQgOj0gJChMT0NBTF9NT0RVTEUpNjQKIAogIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgc3RzCiBMT0NBTF9DVFNfVEVTVF9QQUNLQUdFIDo9IGFuZHJvaWQuc2VjdXJpdHkuY3RzCiAKIExPQ0FMX0FSTV9NT0RFIDo9IGFybQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTctMDU1My9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTctMDU1My9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlYWYwY2YKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9DVkUtMjAxNy0wNTUzL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMiBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBDVkUtMjAxNy0wNTUzCitMT0NBTF9TUkNfRklMRVMgOj0gcG9jLmMKK0xPQ0FMX01VTFRJTElCIDo9IGJvdGgKK0xPQ0FMX01PRFVMRV9TVEVNXzMyIDo9ICQoTE9DQUxfTU9EVUxFKTMyCitMT0NBTF9NT0RVTEVfU1RFTV82NCA6PSAkKExPQ0FMX01PRFVMRSk2NAorTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJubAorCisjIFRhZyB0aGlzIG1vZHVsZSBhcyBhIHN0cyB0ZXN0IGFydGlmYWN0CitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgc3RzCitMT0NBTF9DVFNfVEVTVF9QQUNLQUdFIDo9IGFuZHJvaWQuc2VjdXJpdHkuY3RzCisKK0xPQ0FMX0FSTV9NT0RFIDo9IGFybQorTE9DQUxfQ0ZMQUdTID0gLVdhbGwgLVdlcnJvciAtV25vLXVudXNlZC1wYXJhbWV0ZXIgLVduby11bnVzZWQtdmFyaWFibGUKKworaW5jbHVkZSAkKEJVSUxEX0NUU19FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTctMDU1My9wb2MuYyBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE3LTA1NTMvcG9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAyNGIzYwotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE3LTA1NTMvcG9jLmMKQEAgLTAsMCArMSwzMSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgdmFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNkZWZpbmUgX0dOVV9TT1VSQ0UKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPG5ldGxpbmsvbXNnLmg+CisjaW5jbHVkZSA8bmV0bGluay9uZXRsaW5rLmg+CisKK2ludCBtYWluKHZvaWQpIHsKKyAgc3RydWN0IG5sX21zZyAqbWVzc2FnZSA9IE5VTEw7CisgIG1lc3NhZ2UgPSBubG1zZ19hbGxvYygpOworICBpZiAobWVzc2FnZSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIG5sbXNnX2FwcGVuZChtZXNzYWdlLCAiaGVsbG8iLCAweEZGRkZGRkZGLCA0KTsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE3LTEzMjMyL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9DVkUtMjAxNy0xMzIzMi9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMTg3M2QKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9DVkUtMjAxNy0xMzIzMi9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzQgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IENWRS0yMDE3LTEzMjMyCitMT0NBTF9TUkNfRklMRVMgOj0gcG9jLmNwcAorTE9DQUxfTVVMVElMSUIgOj0gYm90aAorTE9DQUxfTU9EVUxFX1NURU1fMzIgOj0gJChMT0NBTF9NT0RVTEUpMzIKK0xPQ0FMX01PRFVMRV9TVEVNXzY0IDo9ICQoTE9DQUxfTU9EVUxFKTY0CisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gJChUT1ApL3N5c3RlbS9tZWRpYS9hdWRpby9pbmNsdWRlLworCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYnV0aWxzIGxpYmJpbmRlcgorCisjIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0CitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyBzdHMgdnRzCitMT0NBTF9DVFNfVEVTVF9QQUNLQUdFIDo9IGFuZHJvaWQuc2VjdXJpdHkuY3RzCisKK0xPQ0FMX0FSTV9NT0RFIDo9IGFybQorTE9DQUxfQ1BQRkxBR1MgPSAtV2FsbCAtV2Vycm9yCitpbmNsdWRlICQoQlVJTERfQ1RTX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9DVkUtMjAxNy0xMzIzMi9wb2MuY3BwIGIvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTctMTMyMzIvcG9jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjFkNWE5Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTctMTMyMzIvcG9jLmNwcApAQCAtMCwwICsxLDkyIEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoqLworI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworZW51bSB7CisgIFNFVF9ERVZJQ0VfQ09OTkVDVElPTl9TVEFURSA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCisgIEdFVF9ERVZJQ0VfQ09OTkVDVElPTl9TVEFURSwKKyAgSEFORExFX0RFVklDRV9DT05GSUdfQ0hBTkdFLAorICBTRVRfUEhPTkVfU1RBVEUsCisgIFNFVF9SSU5HRVJfTU9ERSwKKyAgU0VUX0ZPUkNFX1VTRSwKKyAgR0VUX0ZPUkNFX1VTRSwKKyAgR0VUX09VVFBVVCwKKyAgU1RBUlRfT1VUUFVULAorICBTVE9QX09VVFBVVCwKKyAgUkVMRUFTRV9PVVRQVVQsCisgIEdFVF9JTlBVVF9GT1JfQVRUUiwKKyAgU1RBUlRfSU5QVVQsCisgIFNUT1BfSU5QVVQsCisgIFJFTEVBU0VfSU5QVVQsCisgIElOSVRfU1RSRUFNX1ZPTFVNRSwKKyAgU0VUX1NUUkVBTV9WT0xVTUUsCisgIEdFVF9TVFJFQU1fVk9MVU1FLAorICBHRVRfU1RSQVRFR1lfRk9SX1NUUkVBTSwKKyAgR0VUX09VVFBVVF9GT1JfRUZGRUNULAorICBSRUdJU1RFUl9FRkZFQ1QsCisgIFVOUkVHSVNURVJfRUZGRUNULAorICBJU19TVFJFQU1fQUNUSVZFLAorICBJU19TT1VSQ0VfQUNUSVZFLAorICBHRVRfREVWSUNFU19GT1JfU1RSRUFNLAorICBRVUVSWV9ERUZBVUxUX1BSRV9QUk9DRVNTSU5HLAorICBTRVRfRUZGRUNUX0VOQUJMRUQsCisgIElTX1NUUkVBTV9BQ1RJVkVfUkVNT1RFTFksCisgIElTX09GRkxPQURfU1VQUE9SVEVELAorICBMSVNUX0FVRElPX1BPUlRTLAorICBHRVRfQVVESU9fUE9SVCwKKyAgQ1JFQVRFX0FVRElPX1BBVENILAorICBSRUxFQVNFX0FVRElPX1BBVENILAorICBMSVNUX0FVRElPX1BBVENIRVMsCisgIFNFVF9BVURJT19QT1JUX0NPTkZJRywKKyAgUkVHSVNURVJfQ0xJRU5ULAorICBHRVRfT1VUUFVUX0ZPUl9BVFRSLAorICBBQ1FVSVJFX1NPVU5EVFJJR0dFUl9TRVNTSU9OLAorICBSRUxFQVNFX1NPVU5EVFJJR0dFUl9TRVNTSU9OLAorICBHRVRfUEhPTkVfU1RBVEUsCisgIFJFR0lTVEVSX1BPTElDWV9NSVhFUywKKyAgU1RBUlRfQVVESU9fU09VUkNFLAorICBTVE9QX0FVRElPX1NPVVJDRSwKKyAgU0VUX0FVRElPX1BPUlRfQ0FMTEJBQ0tfRU5BQkxFRCwKKyAgU0VUX01BU1RFUl9NT05PLAorICBHRVRfTUFTVEVSX01PTk8sCit9OworCitpbnQgZ2V0T3V0cHV0Rm9yQXR0cigpIHsKKyAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOworICBzcDxJQmluZGVyPiBiaW5kZXIgPSBzbS0+Z2V0U2VydmljZShTdHJpbmcxNigibWVkaWEuYXVkaW9fcG9saWN5IikpOworICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihTdHJpbmcxNigiYW5kcm9pZC5tZWRpYS5JQXVkaW9Qb2xpY3lTZXJ2aWNlIikpOworICBkYXRhLndyaXRlSW50MzIoMSk7CisgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyOworICBtZW1zZXQoJmF0dHIsIDB4ZmYsIHNpemVvZihhdHRyKSk7CisgIGF0dHIuZmxhZ3MgPSAwOworICBtZW1zZXQoYXR0ci50YWdzLCAweDQxLCBBVURJT19BVFRSSUJVVEVTX1RBR1NfTUFYX1NJWkUpOworICBkYXRhLndyaXRlKCZhdHRyLCBzaXplb2YoYXR0cikpOworICBiaW5kZXItPnRyYW5zYWN0KEdFVF9PVVRQVVRfRk9SX0FUVFIsIGRhdGEsICZyZXBseSwgMCk7CisgIHJldHVybiAwOworfQorCitpbnQgbWFpbigpIHsKKyAgZ2V0T3V0cHV0Rm9yQXR0cigpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE3LTEzMjUzL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9DVkUtMjAxNy0xMzI1My9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyYTUwODMKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9DVkUtMjAxNy0xMzI1My9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzQgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAJaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKworCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IENWRS0yMDE3LTEzMjUzCitMT0NBTF9TUkNfRklMRVMgOj0gcG9jLmNwcAorTE9DQUxfTVVMVElMSUIgOj0gYm90aAorTE9DQUxfTU9EVUxFX1NURU1fMzIgOj0gJChMT0NBTF9NT0RVTEUpMzIKK0xPQ0FMX01PRFVMRV9TVEVNXzY0IDo9ICQoTE9DQUxfTU9EVUxFKTY0CisKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJtZWRpYSBsaWJ1dGlscyBsaWJiaW5kZXIgbGlibWVkaWFkcm0KKworTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIHN0cworTE9DQUxfQ1RTX1RFU1RfUEFDS0FHRSA6PSBhbmRyb2lkLnNlY3VyaXR5LmN0cworCitMT0NBTF9BUk1fTU9ERSA6PSBhcm0KK0xPQ0FMX0NGTEFHUyA9IC1XYWxsIC1XZXJyb3IgLVduby11bnVzZWQtcGFyYW1ldGVyIC1Xbm8tdW51c2VkLXZhcmlhYmxlCisKK2luY2x1ZGUgJChCVUlMRF9DVFNfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE3LTEzMjUzL3BvYy5jcHAgYi9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc2VjdXJpdHlQYXRjaC9DVkUtMjAxNy0xMzI1My9wb2MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMTlhZTJmCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTctMTMyNTMvcG9jLmNwcApAQCAtMCwwICsxLDg0IEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8YmluZGVyL01lbW9yeUJhc2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcEJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9JQ3J5cHRvLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhRHJtU2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0NyeXB0b0FQSS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK2ludCBtYWluKCkKK3sKKyAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOworICBzcDxJQmluZGVyPiBiaW5kZXIgPSBzbS0+Z2V0U2VydmljZShTdHJpbmcxNigibWVkaWEuZHJtIikpOworICBzcDxJTWVkaWFEcm1TZXJ2aWNlPiBzZXJ2aWNlID0gaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhRHJtU2VydmljZT4oYmluZGVyKTsKKyAgaWYgKHNlcnZpY2UgPT0gTlVMTCkgeworICAgIHByaW50ZigiRmFpbGVkIHRvIHJldHJpZXZlICdtZWRpYS5kcm0nIHNlcnZpY2UuXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBzcDxJQ3J5cHRvPiBjcnlwdG8gPSBzZXJ2aWNlLT5tYWtlQ3J5cHRvKCk7CisgIGlmIChjcnlwdG8gPT0gTlVMTCkgeworICAgIHByaW50ZigibWFrZUNyeXB0byBmYWlsZWQuXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIGNvbnN0IHVpbnQ4X3QgY2xlYXJrZXlfdXVpZFsxNl0gPSB7CisgICAgMHgxMCwgMHg3NywgMHhFRiwgMHhFQywgMHhDMCwgMHhCMiwgMHg0RCwgMHgwMiwKKyAgICAweEFDLCAweEUzLCAweDNDLCAweDFFLCAweDUyLCAweEUyLCAweEZCLCAweDRCCisgIH07CisgIGlmIChjcnlwdG8tPmNyZWF0ZVBsdWdpbihjbGVhcmtleV91dWlkLCBOVUxMLCAwKSAhPSBPSykgeworICAgIHByaW50ZigiY3JlYXRlUGx1Z2luIGZhaWxlZC5cbiIpOworICAgIHJldHVybiAxOworICB9CisKKyAgc3A8TWVtb3J5SGVhcEJhc2U+IGhlYXAgPSBuZXcgTWVtb3J5SGVhcEJhc2UoMHgyMDAwKTsKKyAgbWVtc2V0KGhlYXAtPmdldEJhc2UoKSwgJ0EnLCAweDIwMDApOworICBzcDxNZW1vcnlCYXNlPiBzb3VyY2VNZW1vcnkgPSBuZXcgTWVtb3J5QmFzZShoZWFwLCAwLCAweDIwMDApOworICBzcDxNZW1vcnlCYXNlPiBkZXN0TWVtb3J5ID0gbmV3IE1lbW9yeUJhc2UoaGVhcCwgMHgxZmZmLCAxKTsKKyAgaW50IGhlYXBTZXFOdW0gPSBjcnlwdG8tPnNldEhlYXAoaGVhcCk7CisgIGlmIChoZWFwU2VxTnVtIDwgMCkgeworICAgIHByaW50Zigic2V0SGVhcCBmYWlsZWQuXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIENyeXB0b1BsdWdpbjo6UGF0dGVybiBwYXR0ZXJuID0geyAubUVuY3J5cHRCbG9ja3MgPSAwLCAubVNraXBCbG9ja3MgPSAxIH07CisgIElDcnlwdG86OlNvdXJjZUJ1ZmZlciBzb3VyY2UgPSB7IC5tU2hhcmVkTWVtb3J5ID0gc291cmNlTWVtb3J5LAorICAgIC5tSGVhcFNlcU51bSA9IGhlYXBTZXFOdW0gfTsKKyAgQ3J5cHRvUGx1Z2luOjpTdWJTYW1wbGUgc3ViU2FtcGxlc1sxXSA9IHsgeyAubU51bUJ5dGVzT2ZDbGVhckRhdGEgPSAweDIwMDAsCisgICAgICAubU51bUJ5dGVzT2ZFbmNyeXB0ZWREYXRhID0gMCB9IH07CisgIElDcnlwdG86OkRlc3RpbmF0aW9uQnVmZmVyIGRlc3RpbmF0aW9uID0geworICAgIC5tVHlwZSA9IElDcnlwdG86OmtEZXN0aW5hdGlvblR5cGVTaGFyZWRNZW1vcnksIC5tSGFuZGxlID0gTlVMTCwgLm1TaGFyZWRNZW1vcnkgPSBkZXN0TWVtb3J5CisgIH07CisKKyAgaW50IHZhbCA9IGNyeXB0by0+ZGVjcnlwdChOVUxMLCBOVUxMLAorICAgICAgQ3J5cHRvUGx1Z2luOjprTW9kZV9VbmVuY3J5cHRlZCwgcGF0dGVybiwgc291cmNlLCAwLCBzdWJTYW1wbGVzLCAxLAorICAgICAgZGVzdGluYXRpb24sIE5VTEwpOworCisgIGlmICh2YWwgIT0gQkFEX1ZBTFVFKSB7CisgICAgcHJpbnRmKCJPVkVSRkxPVyBERVRFQ1RFRFxuIik7CisgIH0KKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE3LTYyNjIvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE3LTYyNjIvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDY5N2Q1Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTctNjI2Mi9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzAgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gQ1ZFLTIwMTctNjI2MgorTE9DQUxfU1JDX0ZJTEVTIDo9IHBvYy5jCitMT0NBTF9NVUxUSUxJQiA6PSBib3RoCitMT0NBTF9NT0RVTEVfU1RFTV8zMiA6PSAkKExPQ0FMX01PRFVMRSkzMgorTE9DQUxfTU9EVUxFX1NURU1fNjQgOj0gJChMT0NBTF9NT0RVTEUpNjQKKworTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIHN0cworTE9DQUxfQ1RTX1RFU1RfUEFDS0FHRSA6PSBhbmRyb2lkLnNlY3VyaXR5LmN0cworCitMT0NBTF9BUk1fTU9ERSA6PSBhcm0KK0xPQ0FMX0NGTEFHUyA9IC1XYWxsIC1XZXJyb3IKKworaW5jbHVkZSAkKEJVSUxEX0NUU19FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTctNjI2Mi9sb2NhbF9wb2MuaCBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE3LTYyNjIvbG9jYWxfcG9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ3MmJmYgotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE3LTYyNjIvbG9jYWxfcG9jLmgKQEAgLTAsMCArMSw0MzEgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIHZhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIERSTV9FTlZJUk9NRU5UX0gKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworZW51bSBkcm1fbWFwX3R5cGUgeworICBfRFJNX0ZSQU1FX0JVRkZFUiA9IDAsCisgIF9EUk1fUkVHSVNURVJTID0gMSwKKyAgX0RSTV9TSE0gPSAyLAorICBfRFJNX0FHUCA9IDMsCisgIF9EUk1fU0NBVFRFUl9HQVRIRVIgPSA0LAorICBfRFJNX0NPTlNJU1RFTlQgPSA1LAorfTsKKworZW51bSBkcm1fbWFwX2ZsYWdzIHsKKyAgX0RSTV9SRVNUUklDVEVEID0gMHgwMSwKKyAgX0RSTV9SRUFEX09OTFkgPSAweDAyLAorICBfRFJNX0xPQ0tFRCA9IDB4MDQsCisgIF9EUk1fS0VSTkVMID0gMHgwOCwKKyAgX0RSTV9XUklURV9DT01CSU5JTkcgPSAweDEwLAorICBfRFJNX0NPTlRBSU5TX0xPQ0sgPSAweDIwLAorICBfRFJNX1JFTU9WQUJMRSA9IDB4NDAsCisgIF9EUk1fRFJJVkVSID0gMHg4MAorfTsKKworZW51bSBob3N0MXhfY2xhc3MgeworICBIT1NUMVhfQ0xBU1NfSE9TVDFYID0gMHgxLAorICBIT1NUMVhfQ0xBU1NfTlZFTkMgPSAweDIxLAorICBIT1NUMVhfQ0xBU1NfVkkgPSAweDMwLAorICBIT1NUMVhfQ0xBU1NfSVNQQSA9IDB4MzIsCisgIEhPU1QxWF9DTEFTU19JU1BCID0gMHgzNCwKKyAgSE9TVDFYX0NMQVNTX0dSMkQgPSAweDUxLAorICBIT1NUMVhfQ0xBU1NfR1IyRF9TQiA9IDB4NTIsCisgIEhPU1QxWF9DTEFTU19WSUMgPSAweDVELAorICBIT1NUMVhfQ0xBU1NfR1IzRCA9IDB4NjAsCisgIEhPU1QxWF9DTEFTU19OVkpQRyA9IDB4QzAsCisgIEhPU1QxWF9DTEFTU19OVkRFQyA9IDB4RjAsCit9OworCitzdHJ1Y3QgZHJtX21hcCB7CisgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OworICB1bnNpZ25lZCBsb25nIHNpemU7CisgIGVudW0gZHJtX21hcF90eXBlIHR5cGU7CisgIGVudW0gZHJtX21hcF9mbGFncyBmbGFnczsKKyAgdm9pZCogaGFuZGxlOworICBpbnQgbXRycjsKK307CisKK3N0cnVjdCBkcm1fdmVyc2lvbiB7CisgIGludCB2ZXJzaW9uX21ham9yOworICBpbnQgdmVyc2lvbl9taW5vcjsKKyAgaW50IHZlcnNpb25fcGF0Y2hsZXZlbDsKKyAgc2l6ZV90IG5hbWVfbGVuOworICBjaGFyKiBuYW1lOworICBzaXplX3QgZGF0ZV9sZW47CisgIGNoYXIqIGRhdGU7CisgIHNpemVfdCBkZXNjX2xlbjsKKyAgY2hhciogZGVzYzsKK307CisKK3N0cnVjdCBkcm1fYnVmX2Rlc2MgeworICBpbnQgY291bnQ7CisgIGludCBzaXplOworICBpbnQgbG93X21hcms7CisgIGludCBoaWdoX21hcms7CisgIGVudW0geworICAgIF9EUk1fUEFHRV9BTElHTiA9IDB4MDEsCisgICAgX0RSTV9BR1BfQlVGRkVSID0gMHgwMiwKKyAgICBfRFJNX1NHX0JVRkZFUiA9IDB4MDQsCisgICAgX0RSTV9GQl9CVUZGRVIgPSAweDA4LAorICAgIF9EUk1fUENJX0JVRkZFUl9STyA9IDB4MTAKKyAgfSBmbGFnczsKKyAgdW5zaWduZWQgbG9uZyBhZ3Bfc3RhcnQ7Cit9OworCitzdHJ1Y3QgZHJtX2J1Zl9pbmZvIHsKKyAgaW50IGNvdW50OworICBzdHJ1Y3QgZHJtX2J1Zl9kZXNjKiBsaXN0OworfTsKKworc3RydWN0IGRybV9idWZfZnJlZSB7CisgIGludCBjb3VudDsKKyAgaW50KiBsaXN0OworfTsKKworc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9pbmZvIHsKKyAgdWludDMyX3QgaGFuZGxlOworICB1aW50MzJfdCBkb21haW47CisgIHVpbnQ2NF90IHNpemU7CisgIHVpbnQ2NF90IG9mZnNldDsKKyAgdWludDY0X3QgbWFwX2hhbmRsZTsKKyAgdWludDMyX3QgdGlsZV9tb2RlOworICB1aW50MzJfdCB0aWxlX2ZsYWdzOworfTsKKworc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9tYXAgeworICB1aW50MzJfdCBoYW5kbGU7CisgIHVpbnQzMl90IGRvbWFpbjsKKyAgdWludDY0X3Qgb2Zmc2V0OworICB1aW50NjRfdCBkZWx0YTsKKyAgdWludDY0X3QgbGVuZ3RoOworICB1aW50MzJfdCB0aWxlX21vZGU7CisgIHVpbnQzMl90IHRpbGVfZmxhZ3M7Cit9OworCitzdHJ1Y3QgZHJtX25vdXZlYXVfZ2VtX3VubWFwIHsKKyAgdWludDMyX3QgaGFuZGxlOworICB1aW50MzJfdCBwYWQ7CisgIHVpbnQ2NF90IG9mZnNldDsKKyAgdWludDY0X3QgZGVsdGE7CisgIHVpbnQ2NF90IGxlbmd0aDsKK307CisKK3N0cnVjdCBkcm1fbm91dmVhdV9nZW1fbmV3IHsKKyAgc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9pbmZvIGluZm87CisgIHVpbnQzMl90IGNoYW5uZWxfaGludDsKKyAgdWludDMyX3QgYWxpZ247Cit9OworCitzdHJ1Y3QgZHJtX25vdXZlYXVfZ2VtX3B1c2hidWYgeworICB1aW50MzJfdCBjaGFubmVsOworICB1aW50MzJfdCBucl9idWZmZXJzOworICB1aW50NjRfdCBidWZmZXJzOworICB1aW50MzJfdCBucl9yZWxvY3M7CisgIHVpbnQzMl90IG5yX3B1c2g7CisgIHVpbnQ2NF90IHJlbG9jczsKKyAgdWludDY0X3QgcHVzaDsKKyAgdWludDMyX3Qgc3VmZml4MDsKKyAgdWludDMyX3Qgc3VmZml4MTsKKyAgdWludDY0X3QgdnJhbV9hdmFpbGFibGU7CisgIHVpbnQ2NF90IGdhcnRfYXZhaWxhYmxlOworfTsKKworc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9wdXNoYnVmX2JvX3ByZXN1bWVkIHsKKyAgdWludDMyX3QgdmFsaWQ7CisgIHVpbnQzMl90IGRvbWFpbjsKKyAgdWludDY0X3Qgb2Zmc2V0OworfTsKK3N0cnVjdCBkcm1fbm91dmVhdV9nZW1fcHVzaGJ1Zl9ibyB7CisgIHVpbnQ2NF90IHVzZXJfcHJpdjsKKyAgdWludDMyX3QgaGFuZGxlOworICB1aW50MzJfdCByZWFkX2RvbWFpbnM7CisgIHVpbnQzMl90IHdyaXRlX2RvbWFpbnM7CisgIHVpbnQzMl90IHZhbGlkX2RvbWFpbnM7CisgIHN0cnVjdCBkcm1fbm91dmVhdV9nZW1fcHVzaGJ1Zl9ib19wcmVzdW1lZCBwcmVzdW1lZDsKK307CisKK3N0cnVjdCBkcm1fbm91dmVhdV9jaGFubmVsX2FsbG9jIHsKKyAgdWludDMyX3QgZmJfY3R4ZG1hX2hhbmRsZTsKKyAgdWludDMyX3QgdHRfY3R4ZG1hX2hhbmRsZTsKKyAgaW50IGNoYW5uZWw7CisgIHVpbnQzMl90IHB1c2hidWZfZG9tYWluczsKKyAgdWludDMyX3Qgbm90aWZpZXJfaGFuZGxlOworICBzdHJ1Y3QgeworICAgIHVpbnQzMl90IGhhbmRsZTsKKyAgICB1aW50MzJfdCBncmNsYXNzOworICB9IHN1YmNoYW5bOF07CisgIHVpbnQzMl90IG5yX3N1YmNoYW47Cit9OworCisjZGVmaW5lIE5PVVZFQVVfR0VNX0RPTUFJTl9DUFUgKDEgPDwgMCkKKyNkZWZpbmUgTk9VVkVBVV9HRU1fRE9NQUlOX1ZSQU0gKDEgPDwgMSkKKyNkZWZpbmUgTk9VVkVBVV9HRU1fRE9NQUlOX0dBUlQgKDEgPDwgMikKKyNkZWZpbmUgTk9VVkVBVV9HRU1fRE9NQUlOX01BUFBBQkxFICgxIDw8IDMpCisjZGVmaW5lIE5PVVZFQVVfR0VNX0RPTUFJTl9DT0hFUkVOVCAoMSA8PCA0KQorCisjZGVmaW5lIERSTV9DT01NQU5EX0JBU0UgMHg0MAorI2RlZmluZSBEUk1fQ09NTUFORF9FTkQgMHhBMAorCisjZGVmaW5lIERSTV9OT1VWRUFVX0dFVFBBUkFNIDB4MDAKKyNkZWZpbmUgRFJNX05PVVZFQVVfU0VUUEFSQU0gMHgwMQorI2RlZmluZSBEUk1fTk9VVkVBVV9DSEFOTkVMX0FMTE9DIDB4MDIKKyNkZWZpbmUgRFJNX05PVVZFQVVfQ0hBTk5FTF9GUkVFIDB4MDMKKyNkZWZpbmUgRFJNX05PVVZFQVVfR1JPQkpfQUxMT0MgMHgwNAorI2RlZmluZSBEUk1fTk9VVkVBVV9OT1RJRklFUk9CSl9BTExPQyAweDA1CisjZGVmaW5lIERSTV9OT1VWRUFVX0dQVU9CSl9GUkVFIDB4MDYKKyNkZWZpbmUgRFJNX05PVVZFQVVfTlZJRiAweDA3CisjZGVmaW5lIERSTV9OT1VWRUFVX0dFTV9ORVcgMHg0MAorI2RlZmluZSBEUk1fTk9VVkVBVV9HRU1fUFVTSEJVRiAweDQxCisjZGVmaW5lIERSTV9OT1VWRUFVX0dFTV9DUFVfUFJFUCAweDQyCisjZGVmaW5lIERSTV9OT1VWRUFVX0dFTV9DUFVfRklOSSAweDQzCisjZGVmaW5lIERSTV9OT1VWRUFVX0dFTV9JTkZPIDB4NDQKKyNkZWZpbmUgRFJNX05PVVZFQVVfU1RBR0lOR19JT0NUTCAweDUwCisjZGVmaW5lIERSTV9OT1VWRUFVX0dFTV9TRVRfVElMSU5HIChEUk1fTk9VVkVBVV9TVEFHSU5HX0lPQ1RMICsgMHgwKQorI2RlZmluZSBEUk1fTk9VVkVBVV9HRU1fUFVTSEJVRl8yIChEUk1fTk9VVkVBVV9TVEFHSU5HX0lPQ1RMICsgMHgxKQorI2RlZmluZSBEUk1fTk9VVkVBVV9HRU1fU0VUX0lORk8gKERSTV9OT1VWRUFVX1NUQUdJTkdfSU9DVEwgKyAweDIpCisjZGVmaW5lIERSTV9OT1VWRUFVX0dFTV9BU19BTExPQyAoRFJNX05PVVZFQVVfU1RBR0lOR19JT0NUTCArIDB4MykKKyNkZWZpbmUgRFJNX05PVVZFQVVfR0VNX0FTX0ZSRUUgKERSTV9OT1VWRUFVX1NUQUdJTkdfSU9DVEwgKyAweDQpCisjZGVmaW5lIERSTV9OT1VWRUFVX0dFTV9TRVRfRVJST1JfTk9USUZJRVIgKERSTV9OT1VWRUFVX1NUQUdJTkdfSU9DVEwgKyAweDUpCisjZGVmaW5lIERSTV9OT1VWRUFVX0dFTV9NQVAgKERSTV9OT1VWRUFVX1NUQUdJTkdfSU9DVEwgKyAweDYpCisjZGVmaW5lIERSTV9OT1VWRUFVX0dFTV9VTk1BUCAoRFJNX05PVVZFQVVfU1RBR0lOR19JT0NUTCArIDB4NykKKworI2RlZmluZSBEUk1fSU9DVExfQkFTRSAnZCcKKyNkZWZpbmUgRFJNX0lPUihuciwgdHlwZSkgX0lPUihEUk1fSU9DVExfQkFTRSwgbnIsIHR5cGUpCisjZGVmaW5lIERSTV9JT1cobnIsIHR5cGUpIF9JT1coRFJNX0lPQ1RMX0JBU0UsIG5yLCB0eXBlKQorI2RlZmluZSBEUk1fSU9XUihuciwgdHlwZSkgX0lPV1IoRFJNX0lPQ1RMX0JBU0UsIG5yLCB0eXBlKQorI2RlZmluZSBEUk1fSU9DVExfQUREX01BUCBEUk1fSU9XUigweDE1LCBzdHJ1Y3QgZHJtX21hcCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1ZFUlNJT04gRFJNX0lPV1IoMHgwMCwgc3RydWN0IGRybV92ZXJzaW9uKQorI2RlZmluZSBEUk1fSU9DVExfSU5GT19CVUZTIERSTV9JT1dSKDB4MTgsIHN0cnVjdCBkcm1fYnVmX2luZm8pCisjZGVmaW5lIERSTV9JT0NUTF9GUkVFX0JVRlMgRFJNX0lPVygweDFhLCBzdHJ1Y3QgZHJtX2J1Zl9mcmVlKQorCisjZGVmaW5lIERSTV9JT0NUTF9OT1VWRUFVX0NIQU5ORUxfQUxMT0MgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9OT1VWRUFVX0NIQU5ORUxfQUxMT0MsIHN0cnVjdCBkcm1fbm91dmVhdV9jaGFubmVsX2FsbG9jKQorI2RlZmluZSBEUk1fSU9DVExfTk9VVkVBVV9HRU1fTkVXIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fTk9VVkVBVV9HRU1fTkVXLCBzdHJ1Y3QgZHJtX25vdXZlYXVfZ2VtX25ldykKKyNkZWZpbmUgRFJNX0lPQ1RMX05PVVZFQVVfR0VNX01BUCBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX05PVVZFQVVfR0VNX01BUCwgc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9tYXApCisjZGVmaW5lIERSTV9JT0NUTF9OT1VWRUFVX0dFTV9VTk1BUCBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX05PVVZFQVVfR0VNX1VOTUFQLCBzdHJ1Y3QgZHJtX25vdXZlYXVfZ2VtX3VubWFwKQorI2RlZmluZSBEUk1fSU9DVExfTk9VVkVBVV9HRU1fUFVTSEJVRiBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX05PVVZFQVVfR0VNX1BVU0hCVUYsIHN0cnVjdCBkcm1fbm91dmVhdV9nZW1fcHVzaGJ1ZikKKyNkZWZpbmUgRFJNX0lPQ1RMX05PVVZFQVVfR0VNX0lORk8gRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9OT1VWRUFVX0dFTV9JTkZPLCBzdHJ1Y3QgZHJtX25vdXZlYXVfZ2VtX2luZm8pCisKKyNkZWZpbmUgRFJNX1RFR1JBX0dFTV9DUkVBVEVfVElMRUQgKDEgPDwgMCkKKyNkZWZpbmUgRFJNX1RFR1JBX0dFTV9DUkVBVEVfQk9UVE9NX1VQICgxIDw8IDEpCisKK3N0cnVjdCBkcm1fdGVncmFfZ2VtX2NyZWF0ZSB7CisgIF9fdTY0IHNpemU7CisgIF9fdTMyIGZsYWdzOworICBfX3UzMiBoYW5kbGU7Cit9OworCitzdHJ1Y3QgZHJtX3RlZ3JhX2dlbV9tbWFwIHsKKyAgX191MzIgaGFuZGxlOworICBfX3UzMiBvZmZzZXQ7Cit9OworCitzdHJ1Y3QgZHJtX3RlZ3JhX3N5bmNwdF9yZWFkIHsKKyAgX191MzIgaWQ7CisgIF9fdTMyIHZhbHVlOworfTsKKworc3RydWN0IGRybV90ZWdyYV9zeW5jcHRfaW5jciB7CisgIF9fdTMyIGlkOworICBfX3UzMiBwYWQ7Cit9OworCitzdHJ1Y3QgZHJtX3RlZ3JhX3N5bmNwdF93YWl0IHsKKyAgX191MzIgaWQ7CisgIF9fdTMyIHRocmVzaDsKKyAgX191MzIgdGltZW91dDsKKyAgX191MzIgdmFsdWU7Cit9OworCisjZGVmaW5lIERSTV9URUdSQV9OT19USU1FT1VUICgweGZmZmZmZmZmKQorCitzdHJ1Y3QgZHJtX3RlZ3JhX29wZW5fY2hhbm5lbCB7CisgIF9fdTMyIGNsaWVudDsKKyAgX191MzIgcGFkOworICBfX3U2NCBjb250ZXh0OworfTsKKworc3RydWN0IGRybV90ZWdyYV9jbG9zZV9jaGFubmVsIHsKKyAgX191NjQgY29udGV4dDsKK307CisKK3N0cnVjdCBkcm1fdGVncmFfZ2V0X3N5bmNwdCB7CisgIF9fdTY0IGNvbnRleHQ7CisgIF9fdTMyIGluZGV4OworICBfX3UzMiBpZDsKK307CisKK3N0cnVjdCBkcm1fdGVncmFfZ2V0X3N5bmNwdF9iYXNlIHsKKyAgX191NjQgY29udGV4dDsKKyAgX191MzIgc3luY3B0OworICBfX3UzMiBpZDsKK307CisKK3N0cnVjdCBkcm1fdGVncmFfc3luY3B0IHsKKyAgX191MzIgaWQ7CisgIF9fdTMyIGluY3JzOworfTsKKworc3RydWN0IGRybV90ZWdyYV9jbWRidWYgeworICBfX3UzMiBoYW5kbGU7CisgIF9fdTMyIG9mZnNldDsKKyAgX191MzIgd29yZHM7CisgIF9fdTMyIHBhZDsKK307CisKK3N0cnVjdCBkcm1fdGVncmFfcmVsb2MgeworICBzdHJ1Y3QgeworICAgIF9fdTMyIGhhbmRsZTsKKyAgICBfX3UzMiBvZmZzZXQ7CisgIH0gY21kYnVmOworICBzdHJ1Y3QgeworICAgIF9fdTMyIGhhbmRsZTsKKyAgICBfX3UzMiBvZmZzZXQ7CisgIH0gdGFyZ2V0OworICBfX3UzMiBzaGlmdDsKKyAgX191MzIgcGFkOworfTsKKworc3RydWN0IGRybV90ZWdyYV93YWl0Y2hrIHsKKyAgX191MzIgaGFuZGxlOworICBfX3UzMiBvZmZzZXQ7CisgIF9fdTMyIHN5bmNwdDsKKyAgX191MzIgdGhyZXNoOworfTsKKworc3RydWN0IGRybV90ZWdyYV9zdWJtaXQgeworICBfX3U2NCBjb250ZXh0OworICBfX3UzMiBudW1fc3luY3B0czsKKyAgX191MzIgbnVtX2NtZGJ1ZnM7CisgIF9fdTMyIG51bV9yZWxvY3M7CisgIF9fdTMyIG51bV93YWl0Y2hrczsKKyAgX191MzIgd2FpdGNoa19tYXNrOworICBfX3UzMiB0aW1lb3V0OworICBfX3U2NCBzeW5jcHRzOworICBfX3U2NCBjbWRidWZzOworICBfX3U2NCByZWxvY3M7CisgIF9fdTY0IHdhaXRjaGtzOworICBfX3UzMiBmZW5jZTsKKyAgX191MzIgcmVzZXJ2ZWQwOworICBfX3U2NCBmZW5jZXM7CisKKyAgX191MzIgcmVzZXJ2ZWQxWzJdOworfTsKKworI2RlZmluZSBEUk1fVEVHUkFfR0VNX1RJTElOR19NT0RFX1BJVENIIDAKKyNkZWZpbmUgRFJNX1RFR1JBX0dFTV9USUxJTkdfTU9ERV9USUxFRCAxCisjZGVmaW5lIERSTV9URUdSQV9HRU1fVElMSU5HX01PREVfQkxPQ0sgMgorCitzdHJ1Y3QgZHJtX3RlZ3JhX2dlbV9zZXRfdGlsaW5nIHsKKyAgX191MzIgaGFuZGxlOworICBfX3UzMiBtb2RlOworICBfX3UzMiB2YWx1ZTsKKyAgX191MzIgcGFkOworfTsKKworc3RydWN0IGRybV90ZWdyYV9nZW1fZ2V0X3RpbGluZyB7CisgIF9fdTMyIGhhbmRsZTsKKyAgX191MzIgbW9kZTsKKyAgX191MzIgdmFsdWU7CisgIF9fdTMyIHBhZDsKK307CisKKyNkZWZpbmUgRFJNX1RFR1JBX0dFTV9CT1RUT01fVVAgKDEgPDwgMCkKKyNkZWZpbmUgRFJNX1RFR1JBX0dFTV9GTEFHUyAoRFJNX1RFR1JBX0dFTV9CT1RUT01fVVApCisKK3N0cnVjdCBkcm1fdGVncmFfZ2VtX3NldF9mbGFncyB7CisgIF9fdTMyIGhhbmRsZTsKKyAgX191MzIgZmxhZ3M7Cit9OworCitzdHJ1Y3QgZHJtX3RlZ3JhX2dlbV9nZXRfZmxhZ3MgeworICBfX3UzMiBoYW5kbGU7CisgIF9fdTMyIGZsYWdzOworfTsKKworZW51bSByZXF1ZXN0X3R5cGUgeworICBEUk1fVEVHUkFfUkVRX1RZUEVfQ0xLX0haID0gMCwKKyAgRFJNX1RFR1JBX1JFUV9UWVBFX0JXX0tCUFMsCit9OworCitzdHJ1Y3QgZHJtX3RlZ3JhX2dldF9jbGtfcmF0ZSB7CisgIF9fdTMyIGlkOworICBfX3UzMiB0eXBlOworICBfX3U2NCBkYXRhOworfTsKKworc3RydWN0IGRybV90ZWdyYV9zZXRfY2xrX3JhdGUgeworICBfX3UzMiBpZDsKKyAgX191MzIgdHlwZTsKKyAgX191NjQgZGF0YTsKK307CisKK3N0cnVjdCBkcm1fdGVncmFfY29uc3RyYWludCB7CisgIF9fdTY0IGNvbnRleHQ7CisgIF9fdTMyIGluZGV4OworICBfX3UzMiB0eXBlOworICBfX3UzMiByYXRlOworICBfX3UzMiBwYWQ7Cit9OworCitzdHJ1Y3QgZHJtX3RlZ3JhX2tlZXBvbiB7CisgIF9fdTY0IGNvbnRleHQ7Cit9OworCisjZGVmaW5lIERSTV9URUdSQV9HRU1fQ1JFQVRFIDB4MDAKKyNkZWZpbmUgRFJNX1RFR1JBX0dFTV9NTUFQIDB4MDEKKyNkZWZpbmUgRFJNX1RFR1JBX1NZTkNQVF9SRUFEIDB4MDIKKyNkZWZpbmUgRFJNX1RFR1JBX1NZTkNQVF9JTkNSIDB4MDMKKyNkZWZpbmUgRFJNX1RFR1JBX1NZTkNQVF9XQUlUIDB4MDQKKyNkZWZpbmUgRFJNX1RFR1JBX09QRU5fQ0hBTk5FTCAweDA1CisjZGVmaW5lIERSTV9URUdSQV9DTE9TRV9DSEFOTkVMIDB4MDYKKyNkZWZpbmUgRFJNX1RFR1JBX0dFVF9TWU5DUFQgMHgwNworI2RlZmluZSBEUk1fVEVHUkFfU1VCTUlUIDB4MDgKKyNkZWZpbmUgRFJNX1RFR1JBX0dFVF9TWU5DUFRfQkFTRSAweDA5CisjZGVmaW5lIERSTV9URUdSQV9HRU1fU0VUX1RJTElORyAweDBhCisjZGVmaW5lIERSTV9URUdSQV9HRU1fR0VUX1RJTElORyAweDBiCisjZGVmaW5lIERSTV9URUdSQV9HRU1fU0VUX0ZMQUdTIDB4MGMKKyNkZWZpbmUgRFJNX1RFR1JBX0dFTV9HRVRfRkxBR1MgMHgwZAorI2RlZmluZSBEUk1fVEVHUkFfR0VUX0NMS19SQVRFIDB4MGUKKyNkZWZpbmUgRFJNX1RFR1JBX1NFVF9DTEtfUkFURSAweDBmCisjZGVmaW5lIERSTV9URUdSQV9TVEFSVF9LRUVQT04gMHgxMAorI2RlZmluZSBEUk1fVEVHUkFfU1RPUF9LRUVQT04gMHgxMQorI2RlZmluZSBEUk1fVEVHUkFfR0VUX0NMS19DT05TVFJBSU5UIDB4MTIKKyNkZWZpbmUgRFJNX1RFR1JBX1NFVF9DTEtfQ09OU1RSQUlOVCAweDEzCisKKyNkZWZpbmUgRFJNX0lPQ1RMX1RFR1JBX0dFTV9DUkVBVEUgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9URUdSQV9HRU1fQ1JFQVRFLCBzdHJ1Y3QgZHJtX3RlZ3JhX2dlbV9jcmVhdGUpCisjZGVmaW5lIERSTV9JT0NUTF9URUdSQV9HRU1fTU1BUCBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1RFR1JBX0dFTV9NTUFQLCBzdHJ1Y3QgZHJtX3RlZ3JhX2dlbV9tbWFwKQorI2RlZmluZSBEUk1fSU9DVExfVEVHUkFfU1lOQ1BUX1JFQUQgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9URUdSQV9TWU5DUFRfUkVBRCwgc3RydWN0IGRybV90ZWdyYV9zeW5jcHRfcmVhZCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1RFR1JBX1NZTkNQVF9JTkNSIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVEVHUkFfU1lOQ1BUX0lOQ1IsIHN0cnVjdCBkcm1fdGVncmFfc3luY3B0X2luY3IpCisjZGVmaW5lIERSTV9JT0NUTF9URUdSQV9TWU5DUFRfV0FJVCBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1RFR1JBX1NZTkNQVF9XQUlULCBzdHJ1Y3QgZHJtX3RlZ3JhX3N5bmNwdF93YWl0KQorI2RlZmluZSBEUk1fSU9DVExfVEVHUkFfT1BFTl9DSEFOTkVMIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVEVHUkFfT1BFTl9DSEFOTkVMLCBzdHJ1Y3QgZHJtX3RlZ3JhX29wZW5fY2hhbm5lbCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1RFR1JBX0NMT1NFX0NIQU5ORUwgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9URUdSQV9DTE9TRV9DSEFOTkVMLCBzdHJ1Y3QgZHJtX3RlZ3JhX29wZW5fY2hhbm5lbCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1RFR1JBX0dFVF9TWU5DUFQgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9URUdSQV9HRVRfU1lOQ1BULCBzdHJ1Y3QgZHJtX3RlZ3JhX2dldF9zeW5jcHQpCisjZGVmaW5lIERSTV9JT0NUTF9URUdSQV9TVUJNSVQgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9URUdSQV9TVUJNSVQsIHN0cnVjdCBkcm1fdGVncmFfc3VibWl0KQorI2RlZmluZSBEUk1fSU9DVExfVEVHUkFfR0VUX1NZTkNQVF9CQVNFIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVEVHUkFfR0VUX1NZTkNQVF9CQVNFLCBzdHJ1Y3QgZHJtX3RlZ3JhX2dldF9zeW5jcHRfYmFzZSkKKyNkZWZpbmUgRFJNX0lPQ1RMX1RFR1JBX0dFTV9TRVRfVElMSU5HIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVEVHUkFfR0VNX1NFVF9USUxJTkcsIHN0cnVjdCBkcm1fdGVncmFfZ2VtX3NldF90aWxpbmcpCisjZGVmaW5lIERSTV9JT0NUTF9URUdSQV9HRU1fR0VUX1RJTElORyBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1RFR1JBX0dFTV9HRVRfVElMSU5HLCBzdHJ1Y3QgZHJtX3RlZ3JhX2dlbV9nZXRfdGlsaW5nKQorI2RlZmluZSBEUk1fSU9DVExfVEVHUkFfR0VNX1NFVF9GTEFHUyBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1RFR1JBX0dFTV9TRVRfRkxBR1MsIHN0cnVjdCBkcm1fdGVncmFfZ2VtX3NldF9mbGFncykKKyNkZWZpbmUgRFJNX0lPQ1RMX1RFR1JBX0dFTV9HRVRfRkxBR1MgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9URUdSQV9HRU1fR0VUX0ZMQUdTLCBzdHJ1Y3QgZHJtX3RlZ3JhX2dlbV9nZXRfZmxhZ3MpCisjZGVmaW5lIERSTV9JT0NUTF9URUdSQV9HRVRfQ0xLX1JBVEUgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9URUdSQV9HRVRfQ0xLX1JBVEUsIHN0cnVjdCBkcm1fdGVncmFfZ2V0X2Nsa19yYXRlKQorI2RlZmluZSBEUk1fSU9DVExfVEVHUkFfU0VUX0NMS19SQVRFIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVEVHUkFfU0VUX0NMS19SQVRFLCBzdHJ1Y3QgZHJtX3RlZ3JhX3NldF9jbGtfcmF0ZSkKKyNkZWZpbmUgRFJNX0lPQ1RMX1RFR1JBX1NUQVJUX0tFRVBPTiBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1RFR1JBX1NUQVJUX0tFRVBPTiwgc3RydWN0IGRybV90ZWdyYV9rZWVwb24pCisjZGVmaW5lIERSTV9JT0NUTF9URUdSQV9TVE9QX0tFRVBPTiBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1RFR1JBX1NUT1BfS0VFUE9OLCBzdHJ1Y3QgZHJtX3RlZ3JhX2tlZXBvbikKKyNkZWZpbmUgRFJNX0lPQ1RMX1RFR1JBX0dFVF9DTEtfQ09OU1RSQUlOVCBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1RFR1JBX0dFVF9DTEtfQ09OU1RSQUlOVCwgc3RydWN0IGRybV90ZWdyYV9jb25zdHJhaW50KQorI2RlZmluZSBEUk1fSU9DVExfVEVHUkFfU0VUX0NMS19DT05TVFJBSU5UIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVEVHUkFfU0VUX0NMS19DT05TVFJBSU5ULCBzdHJ1Y3QgZHJtX3RlZ3JhX2NvbnN0cmFpbnQpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NlY3VyaXR5UGF0Y2gvQ1ZFLTIwMTctNjI2Mi9wb2MuYyBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE3LTYyNjIvcG9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYzN2JkNgotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zZWN1cml0eVBhdGNoL0NWRS0yMDE3LTYyNjIvcG9jLmMKQEAgLTAsMCArMSwxMjIgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIHZhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjZGVmaW5lIF9HTlVfU09VUkNFCisjaW5jbHVkZSAibG9jYWxfcG9jLmgiCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNkZWZpbmUgRFJNREVWX05BTUUgIi9kZXYvZHJpL3JlbmRlckQxMjgiCisKK3N0YXRpYyBpbnQgZHJtX3ZlcnNpb24oaW50IGZkKQoreworICBpbnQgcmV0OworICBzdHJ1Y3QgZHJtX3ZlcnNpb24gdmVyOworICB2ZXIubmFtZV9sZW4gPSAxMDA7CisgIHZlci5kYXRlX2xlbiA9IDEwMDsKKyAgdmVyLmRlc2NfbGVuID0gMTAwOworCisgIHZlci5uYW1lID0gKGNoYXIqKW1hbGxvYyh2ZXIubmFtZV9sZW4pOworICB2ZXIuZGF0ZSA9IChjaGFyKiltYWxsb2ModmVyLmRhdGVfbGVuKTsKKyAgdmVyLmRlc2MgPSAoY2hhciopbWFsbG9jKHZlci5kZXNjX2xlbik7CisKKyAgcmV0ID0gaW9jdGwoZmQsIERSTV9JT0NUTF9WRVJTSU9OLCAmdmVyKTsKKworICBpZiAocmV0ID09IC0xKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5vdXZlYXVfZ2VtX2lvY3RsX25ldyhpbnQgZmQpCit7CisgIGludCByZXQ7CisgIHN0cnVjdCBkcm1fbm91dmVhdV9nZW1fbmV3IG5ld19hcmc7CisKKyAgbWVtc2V0KCZuZXdfYXJnLCAwLCBzaXplb2YobmV3X2FyZykpOworCisgIG5ld19hcmcuaW5mby5zaXplID0gMHgxMDAwOworICBuZXdfYXJnLmluZm8uZG9tYWluID0gTk9VVkVBVV9HRU1fRE9NQUlOX0dBUlQ7CisKKyAgcmV0ID0gaW9jdGwoZmQsIERSTV9JT0NUTF9OT1VWRUFVX0dFTV9ORVcsICZuZXdfYXJnKTsKKyAgaWYgKHJldCA9PSAtMSkgeworICAgIHJldHVybiAtMTsKKyAgfQorCisgIHJldHVybiBuZXdfYXJnLmluZm8uaGFuZGxlOworfQorCitzdGF0aWMgdWludDMyX3QgZ2V0X2dlbV9tYXBfaGFuZGxlKGludCBmZCkKK3sKKyAgdWludDMyX3QgaGFuZGxlOworCisgIGhhbmRsZSA9IG5vdXZlYXVfZ2VtX2lvY3RsX25ldyhmZCk7CisKKyAgcmV0dXJuIGhhbmRsZTsKK30KKworc3RhdGljIHZvaWQgbm91dmVhdV9nZW1faW9jdGxfbWFwKGludCBmZCwgdWludDMyX3QgaGFuZGxlKQoreworICBpbnQgcmV0OworICBzdHJ1Y3QgZHJtX25vdXZlYXVfZ2VtX21hcCBtYXBfYXJnOworICBtZW1zZXQoJm1hcF9hcmcsIDAsIHNpemVvZihtYXBfYXJnKSk7CisgIG1hcF9hcmcuaGFuZGxlID0gaGFuZGxlOworICBtYXBfYXJnLmxlbmd0aCA9IDB4MTAwMDsKKworICByZXQgPSBpb2N0bChmZCwgRFJNX0lPQ1RMX05PVVZFQVVfR0VNX01BUCwgJm1hcF9hcmcpOworICBpZiAocmV0ID09IC0xKSB7CisgICAgcmV0dXJuOworICB9Cit9CisKK3ZvaWQgcG9jKCkKK3sKKyAgaW50IGZkOworICBjb25zdCBpbnQgTUFYX01BUFMgPSAxMDsKKworICBmZCA9IG9wZW4oRFJNREVWX05BTUUsIE9fUkRXUik7CisgIGlmIChmZCA9PSAtMSkgeworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChkcm1fdmVyc2lvbihmZCkgPT0gLTEpeworICAgIHJldHVybjsKKyAgfQorCisgIHVpbnQzMl90IGhhbmRsZSA9IGdldF9nZW1fbWFwX2hhbmRsZShmZCk7CisKKyAgZm9yKGludCBpID0gMDsgaSA8IE1BWF9NQVBTOyBpKyspeworICAgIG5vdXZlYXVfZ2VtX2lvY3RsX21hcChmZCwgaGFuZGxlKTsKKyAgfQorICBjbG9zZShmZCk7CisKKyAgcmV0dXJuOworfQorCitpbnQgbWFpbigpCit7CisgIGNvbnN0IGludCBNQVhfUlVOUyA9IDMwMDAwOworCisgIGZvcihpbnQgaSA9IDA7IGkgPCBNQVhfUlVOUzsgaSsrKSB7CisgICAgcG9jKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zcmMvYW5kcm9pZC9zZWN1cml0eS9jdHMvQWRiVXRpbHMuamF2YSBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zcmMvYW5kcm9pZC9zZWN1cml0eS9jdHMvQWRiVXRpbHMuamF2YQppbmRleCBmODM0YzM4Li41YWMwZjg3IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc3JjL2FuZHJvaWQvc2VjdXJpdHkvY3RzL0FkYlV0aWxzLmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NyYy9hbmRyb2lkL3NlY3VyaXR5L2N0cy9BZGJVdGlscy5qYXZhCkBAIC0yMCwyMCArMjAsMTkgQEAKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuQ29sbGVjdGluZ091dHB1dFJlY2VpdmVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5EZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb247CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLklUZXN0RGV2aWNlOworaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkRldmljZVRlc3RDYXNlOwogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmxvZy5Mb2dVdGlsLkNMb2c7CiAKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUm9vdFBlcm1pc3Npb25UZXN0OworCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKIGltcG9ydCBqYXZhLnV0aWwuU2Nhbm5lcjsKLQotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotaW1wb3J0IGphdmEubGFuZy5UaHJlYWQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogCiBwdWJsaWMgY2xhc3MgQWRiVXRpbHMgewogCkBAIC01MCw3ICs0OSw3IEBACiAgICAgLyoqCiAgICAgICogUHVzaGVzIGFuZCBydW5zIGEgYmluYXJ5IHRvIHRoZSBzZWxlY3RlZCBkZXZpY2UKICAgICAgKgotICAgICAqIEBwYXJhbSBwb2NOYW1lIG5hbWUgb2YgdGhlIHBvYyBiaW5hcnkKKyAgICAgKiBAcGFyYW0gcGF0aFRvUG9jIGEgc3RyaW5nIHBhdGggdG8gcG9jIGZyb20gdGhlIC9yZXMgZm9sZGVyCiAgICAgICogQHBhcmFtIGRldmljZSBkZXZpY2UgdG8gYmUgcmFuIG9uCiAgICAgICogQHJldHVybiB0aGUgY29uc29sZSBvdXRwdXQgZnJvbSB0aGUgYmluYXJ5CiAgICAgICovCkBAIC02MiwzNSArNjEsMTUgQEAKICAgICAvKioKICAgICAgKiBQdXNoZXMgYW5kIHJ1bnMgYSBiaW5hcnkgdG8gdGhlIHNlbGVjdGVkIGRldmljZQogICAgICAqCi0gICAgICogQHBhcmFtIHBvY05hbWUgbmFtZSBvZiB0aGUgcG9jIGJpbmFyeQorICAgICAqIEBwYXJhbSBwb2NOYW1lIGEgc3RyaW5nIHBhdGggdG8gcG9jIGZyb20gdGhlIC9yZXMgZm9sZGVyCiAgICAgICogQHBhcmFtIGRldmljZSBkZXZpY2UgdG8gYmUgcmFuIG9uCiAgICAgICogQHBhcmFtIHRpbWVvdXQgdGltZSB0byB3YWl0IGZvciBvdXRwdXQgaW4gc2Vjb25kcwogICAgICAqIEByZXR1cm4gdGhlIGNvbnNvbGUgb3V0cHV0IGZyb20gdGhlIGJpbmFyeQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJ1blBvYyhTdHJpbmcgcG9jTmFtZSwgSVRlc3REZXZpY2UgZGV2aWNlLCBpbnQgdGltZW91dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBydW5Qb2MocG9jTmFtZSwgZGV2aWNlLCB0aW1lb3V0LCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQdXNoZXMgYW5kIHJ1bnMgYSBiaW5hcnkgdG8gdGhlIHNlbGVjdGVkIGRldmljZQotICAgICAqCi0gICAgICogQHBhcmFtIHBvY05hbWUgbmFtZSBvZiB0aGUgcG9jIGJpbmFyeQotICAgICAqIEBwYXJhbSBkZXZpY2UgZGV2aWNlIHRvIGJlIHJhbiBvbgotICAgICAqIEBwYXJhbSB0aW1lb3V0IHRpbWUgdG8gd2FpdCBmb3Igb3V0cHV0IGluIHNlY29uZHMKLSAgICAgKiBAcGFyYW0gYXJndW1lbnRzIHRoZSBpbnB1dCBhcmd1bWVudHMgZm9yIHRoZSBwb2MKLSAgICAgKiBAcmV0dXJuIHRoZSBjb25zb2xlIG91dHB1dCBmcm9tIHRoZSBiaW5hcnkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBydW5Qb2MoU3RyaW5nIHBvY05hbWUsIElUZXN0RGV2aWNlIGRldmljZSwgaW50IHRpbWVvdXQsIFN0cmluZyBhcmd1bWVudHMpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoImNobW9kICt4IC9kYXRhL2xvY2FsL3RtcC8iICsgcG9jTmFtZSk7CiAgICAgICAgIENvbGxlY3RpbmdPdXRwdXRSZWNlaXZlciByZWNlaXZlciA9IG5ldyBDb2xsZWN0aW5nT3V0cHV0UmVjZWl2ZXIoKTsKLSAgICAgICAgaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBkZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZCgiL2RhdGEvbG9jYWwvdG1wLyIgKyBwb2NOYW1lICsgIiAiICsgYXJndW1lbnRzLCByZWNlaXZlciwKLSAgICAgICAgICAgICAgICAgICAgdGltZW91dCwgVGltZVVuaXQuU0VDT05EUywgMCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZCgiL2RhdGEvbG9jYWwvdG1wLyIgKyBwb2NOYW1lLCByZWNlaXZlciwgdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgVGltZVVuaXQuU0VDT05EUywgMCk7Ci0gICAgICAgIH0KKyAgICAgICAgZGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoIi9kYXRhL2xvY2FsL3RtcC8iICsgcG9jTmFtZSwgcmVjZWl2ZXIsIHRpbWVvdXQsIFRpbWVVbml0LlNFQ09ORFMsIDApOwogICAgICAgICBTdHJpbmcgb3V0cHV0ID0gcmVjZWl2ZXIuZ2V0T3V0cHV0KCk7CiAgICAgICAgIHJldHVybiBvdXRwdXQ7CiAgICAgfQpAQCAtOTgsMzUgKzc3LDE2IEBACiAgICAgLyoqCiAgICAgICogUHVzaGVzIGFuZCBydW5zIGEgYmluYXJ5IHRvIHRoZSBzZWxlY3RlZCBkZXZpY2UgYW5kIGlnbm9yZXMgYW55IG9mIGl0cyBvdXRwdXQuCiAgICAgICoKLSAgICAgKiBAcGFyYW0gcG9jTmFtZSBuYW1lIG9mIHRoZSBwb2MgYmluYXJ5CisgICAgICogQHBhcmFtIHBvY05hbWUgYSBzdHJpbmcgcGF0aCB0byBwb2MgZnJvbSB0aGUgL3JlcyBmb2xkZXIKICAgICAgKiBAcGFyYW0gZGV2aWNlIGRldmljZSB0byBiZSByYW4gb24KICAgICAgKiBAcGFyYW0gdGltZW91dCB0aW1lIHRvIHdhaXQgZm9yIG91dHB1dCBpbiBzZWNvbmRzCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHJ1blBvY05vT3V0cHV0KFN0cmluZyBwb2NOYW1lLCBJVGVzdERldmljZSBkZXZpY2UsIGludCB0aW1lb3V0KQogICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJ1blBvY05vT3V0cHV0KHBvY05hbWUsIGRldmljZSwgdGltZW91dCwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHVzaGVzIGFuZCBydW5zIGEgYmluYXJ5IHdpdGggYXJndW1lbnRzIHRvIHRoZSBzZWxlY3RlZCBkZXZpY2UgYW5kCi0gICAgICogaWdub3JlcyBhbnkgb2YgaXRzIG91dHB1dC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwb2NOYW1lIG5hbWUgb2YgdGhlIHBvYyBiaW5hcnkKLSAgICAgKiBAcGFyYW0gZGV2aWNlIGRldmljZSB0byBiZSByYW4gb24KLSAgICAgKiBAcGFyYW0gdGltZW91dCB0aW1lIHRvIHdhaXQgZm9yIG91dHB1dCBpbiBzZWNvbmRzCi0gICAgICogQHBhcmFtIGFyZ3VtZW50cyBpbnB1dCBhcmd1bWVudHMgZm9yIHRoZSBwb2MKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcnVuUG9jTm9PdXRwdXQoU3RyaW5nIHBvY05hbWUsIElUZXN0RGV2aWNlIGRldmljZSwgaW50IHRpbWVvdXQsCi0gICAgICAgICAgICBTdHJpbmcgYXJndW1lbnRzKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoImNobW9kICt4IC9kYXRhL2xvY2FsL3RtcC8iICsgcG9jTmFtZSk7CiAgICAgICAgIE51bGxPdXRwdXRSZWNlaXZlciByZWNlaXZlciA9IG5ldyBOdWxsT3V0cHV0UmVjZWl2ZXIoKTsKLSAgICAgICAgaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBkZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZCgiL2RhdGEvbG9jYWwvdG1wLyIgKyBwb2NOYW1lICsgIiAiICsgYXJndW1lbnRzLCByZWNlaXZlciwKLSAgICAgICAgICAgICAgICAgICAgdGltZW91dCwgVGltZVVuaXQuU0VDT05EUywgMCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZCgiL2RhdGEvbG9jYWwvdG1wLyIgKyBwb2NOYW1lLCByZWNlaXZlciwgdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgVGltZVVuaXQuU0VDT05EUywgMCk7Ci0gICAgICAgIH0KKyAgICAgICAgZGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoIi9kYXRhL2xvY2FsL3RtcC8iICsgcG9jTmFtZSwgcmVjZWl2ZXIsIHRpbWVvdXQsCisgICAgICAgICAgICAgICAgVGltZVVuaXQuU0VDT05EUywgMCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNDMsOTEgKzIwMywyOCBAQAogICAgICAqIEBwYXJhbSBkZXZpY2UgZGV2aWNlIHRvIGJlIHJhbiBvbgogICAgICAqIEBwYXJhbSB0aW1lb3V0IHRpbWUgdG8gd2FpdCBmb3Igb3V0cHV0IGluIHNlY29uZHMKICAgICAgKi8KLSAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBydW5Qb2NDaGVja0V4aXRDb2RlKFN0cmluZyBwb2NOYW1lLCBJVGVzdERldmljZSBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbWVvdXQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgZGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoImNobW9kICt4IC9kYXRhL2xvY2FsL3RtcC8iICsgcG9jTmFtZSk7CisgICAgICBDb2xsZWN0aW5nT3V0cHV0UmVjZWl2ZXIgcmVjZWl2ZXIgPSBuZXcgQ29sbGVjdGluZ091dHB1dFJlY2VpdmVyKCk7CisgICAgICBkZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZCgiL2RhdGEvbG9jYWwvdG1wLyIgKyBwb2NOYW1lICsgIiA+IC9kZXYvbnVsbCAyPiYxOyBlY2hvICQ/IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVyLCB0aW1lb3V0LCBUaW1lVW5pdC5TRUNPTkRTLCAwKTsKKworICAgICAgU3RyaW5nIHJldHVyblN0ciA9IG51bGw7CisgICAgICBpbnQgcmV0dXJuTnVtID0gMDsKKworICAgICAgdHJ5eworICAgICAgICAgICByZXR1cm5TdHIgPSByZWNlaXZlci5nZXRPdXRwdXQoKS5yZXBsYWNlQWxsKCJbXjAtOV0iLCAiIik7CisgICAgICAgfWNhdGNoKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICB9CisgICAgICAgdHJ5eworICAgICAgICAgcmV0dXJuTnVtID0gSW50ZWdlci5wYXJzZUludChyZXR1cm5TdHIpOworICAgICAgIH1jYXRjaChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSl7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgIH0KIAogICAgICAgIC8vUmVmZXIgdG8gZ28vYXNkbC1zdHMtZ3VpZGUgVGVzdCBzZWN0aW9uIGZvciBrbm93aW5nIHRoZSBzaWduaWZpY2FuY2Ugb2YgMTEzIGNvZGUKLSAgICAgICByZXR1cm4gcnVuUG9jR2V0RXhpdFN0YXR1cyhwb2NOYW1lLCBkZXZpY2UsIHRpbWVvdXQpID09IDExMzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQdXNoZXMgYW5kIHJ1bnMgYSBiaW5hcnkgdG8gdGhlIGRldmljZSBhbmQgcmV0dXJucyB0aGUgZXhpdCBzdGF0dXMuCi0gICAgICogQHBhcmFtIHBvY05hbWUgYSBzdHJpbmcgcGF0aCB0byBwb2MgZnJvbSB0aGUgL3JlcyBmb2xkZXIKLSAgICAgKiBAcGFyYW0gZGV2aWNlIGRldmljZSB0byBiZSByYW4gb24KLSAgICAgKiBAcGFyYW0gdGltZW91dCB0aW1lIHRvIHdhaXQgZm9yIG91dHB1dCBpbiBzZWNvbmRzCi0KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGludCBydW5Qb2NHZXRFeGl0U3RhdHVzKFN0cmluZyBwb2NOYW1lLCBJVGVzdERldmljZSBkZXZpY2UsIGludCB0aW1lb3V0KQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGRldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKCJjaG1vZCAreCAvZGF0YS9sb2NhbC90bXAvIiArIHBvY05hbWUpOwotICAgICAgICBDb2xsZWN0aW5nT3V0cHV0UmVjZWl2ZXIgcmVjZWl2ZXIgPSBuZXcgQ29sbGVjdGluZ091dHB1dFJlY2VpdmVyKCk7Ci0gICAgICAgIGRldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKCIvZGF0YS9sb2NhbC90bXAvIiArIHBvY05hbWUgKyAiID4gL2Rldi9udWxsIDI+JjE7IGVjaG8gJD8iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlciwgdGltZW91dCwgVGltZVVuaXQuU0VDT05EUywgMCk7Ci0KLSAgICAgICAgU3RyaW5nIGV4aXRTdGF0dXMgPSByZWNlaXZlci5nZXRPdXRwdXQoKS5yZXBsYWNlQWxsKCJbXjAtOV0iLCAiIik7Ci0gICAgICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KGV4aXRTdGF0dXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFB1c2hlcyBhbmQgcnVucyBhIGJpbmFyeSBhbmQgYXNzZXJ0cyB0aGF0IHRoZSBleGl0IHN0YXR1cyBpc24ndCAxMTM6IHZ1bG5lcmFibGUuCi0gICAgICogQHBhcmFtIHBvY05hbWUgYSBzdHJpbmcgcGF0aCB0byBwb2MgZnJvbSB0aGUgL3JlcyBmb2xkZXIKLSAgICAgKiBAcGFyYW0gZGV2aWNlIGRldmljZSB0byBiZSByYW4gb24KLSAgICAgKiBAcGFyYW0gdGltZW91dCB0aW1lIHRvIHdhaXQgZm9yIG91dHB1dCBpbiBzZWNvbmRzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJ1blBvY0Fzc2VydEV4aXRTdGF0dXNOb3RWdWxuZXJhYmxlKAotICAgICAgICAgICAgU3RyaW5nIHBvY05hbWUsIElUZXN0RGV2aWNlIGRldmljZSwgaW50IHRpbWVvdXQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRUcnVlKCJQb0MgcmV0dXJuZWQgZXhpdCBzdGF0dXMgMTEzOiB2dWxuZXJhYmxlIiwKLSAgICAgICAgICAgICAgICBydW5Qb2NHZXRFeGl0U3RhdHVzKHBvY05hbWUsIGRldmljZSwgdGltZW91dCkgIT0gMTEzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFeGVjdXRlcyBhIGdpdmVuIHBvYyB3aXRoaW4gYSBnaXZlbiB0aW1lb3V0LiBSZXR1cm5zIGVycm9yIGlmIHRoZQotICAgICAqIGdpdmVuIHBvYyBkb2VzbnQgY29tcGxldGUgaXRzIGV4ZWN1dGlvbiB3aXRoaW4gdGltZW91dC4gSXQgYWxzbyBkZWxldGVzCi0gICAgICogdGhlIGxpc3Qgb2YgZmlsZXMgcHJvdmlkZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcnVubmVyIHRoZSB0aHJlYWQgd2hpY2ggd2lsbCBiZSBydW4KLSAgICAgKiBAcGFyYW0gdGltZW91dCB0aGUgdGltZW91dCB3aXRoaW4gd2hpY2ggdGhlIHRocmVhZCdzIGV4ZWN1dGlvbiBzaG91bGQKLSAgICAgKiAgICAgICAgY29tcGxldGUKLSAgICAgKiBAcGFyYW0gZGV2aWNlIGRldmljZSB0byBiZSByYW4gb24KLSAgICAgKiBAcGFyYW0gaW5wdXRGaWxlcyBsaXN0IG9mIGZpbGVzIHRvIGJlIGRlbGV0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcnVuV2l0aFRpbWVvdXREZWxldGVGaWxlcyhSdW5uYWJsZSBydW5uZXIsIGludCB0aW1lb3V0LCBJVGVzdERldmljZSBkZXZpY2UsCi0gICAgICAgICAgICBTdHJpbmdbXSBpbnB1dEZpbGVzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKHJ1bm5lcik7Ci0gICAgICAgIHQuc3RhcnQoKTsKLSAgICAgICAgYm9vbGVhbiB0ZXN0X2ZhaWxlZCA9IGZhbHNlOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdC5qb2luKHRpbWVvdXQpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0ZXN0X2ZhaWxlZCA9IHRydWU7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoaW5wdXRGaWxlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnB1dEZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFkYlV0aWxzLnJ1bkNvbW1hbmRMaW5lKCJybSAvZGF0YS9sb2NhbC90bXAvIiArIGlucHV0RmlsZXNbaV0sIGRldmljZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHRlc3RfZmFpbGVkID09IHRydWUpIHsKLSAgICAgICAgICAgICAgICBBc3NlcnQuZmFpbCgiUG9DIHdhcyBpbnRlcnJ1cHRlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICh0LmlzQWxpdmUoKSkgewotICAgICAgICAgICAgQXNzZXJ0LmZhaWwoIlBvQyBub3QgY29tcGxldGVkIHdpdGhpbiB0aW1lb3V0IG9mICIgKyB0aW1lb3V0ICsgIiBtcyIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmFpc2VzIGFzc2VydCBleGNlcHRpb24gdXBvbiBjcmFzaC9lcnJvciBvY2N1cmVuY2UKLSAgICAgKgotICAgICAqIEBwYXJhbSBjcmFzaFBhdHRlcm5MaXN0IGFycmF5IG9mIGNyYXNoIGxvZyBwYXR0ZXJucyB0byBiZSBjaGVja2VkIGZvcgotICAgICAqIEBwYXJhbSBsb2djYXQgU3RyaW5nIHRvIGJlIHBhcnNlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja0NyYXNoKFN0cmluZyBjcmFzaFBhdHRlcm5MaXN0W10sIFN0cmluZyBsb2djYXQpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjcmFzaFBhdHRlcm5MaXN0Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZSgiQ3Jhc2ggbG9nIHBhdHRlcm4gZm91bmQhIiwKLSAgICAgICAgICAgICAgICAgICAgUGF0dGVybi5jb21waWxlKGNyYXNoUGF0dGVybkxpc3RbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF0dGVybi5NVUxUSUxJTkUpLm1hdGNoZXIobG9nY2F0KS5maW5kKCkpOwotICAgICAgICB9CisgICAgICAgcmV0dXJuIHJldHVybk51bSA9PSAxMTM7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NyYy9hbmRyb2lkL3NlY3VyaXR5L2N0cy9Qb2MxNl8wNC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NyYy9hbmRyb2lkL3NlY3VyaXR5L2N0cy9Qb2MxNl8wNC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZGE5MzUKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc3JjL2FuZHJvaWQvc2VjdXJpdHkvY3RzL1BvYzE2XzA0LmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLnNlY3VyaXR5LmN0czsKKworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5TZWN1cml0eVRlc3Q7CisKK0BTZWN1cml0eVRlc3QKK3B1YmxpYyBjbGFzcyBQb2MxNl8wNCBleHRlbmRzIFNlY3VyaXR5VGVzdENhc2UgeworCisgICAgLyoqCisgICAgICogYi8yNjMyMzQ1NQorICAgICAqLworICAgIEBTZWN1cml0eVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9jQ1ZFXzIwMTZfMjQxOSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBBZGJVdGlscy5ydW5Db21tYW5kTGluZSgibG9nY2F0IC1jIiAsIGdldERldmljZSgpKTsKKyAgICAgICAgQWRiVXRpbHMucnVuUG9jKCJDVkUtMjAxNi0yNDE5IiwgZ2V0RGV2aWNlKCksIDYwKTsKKyAgICAgICAgU3RyaW5nIGxvZ2NhdCA9IEFkYlV0aWxzLnJ1bkNvbW1hbmRMaW5lKCJsb2djYXQgLWQiLCBnZXREZXZpY2UoKSk7CisgICAgICAgIGFzc2VydE5vdE1hdGNoZXMoIltcXHNcXG5cXFNdKklPTVhfSW5mb0xlYWsgYjI2MzIzNDU1W1xcc1xcblxcU10qIiwgbG9nY2F0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAqICBiLzI2MzI0MzA3CisgICAgKi8KKyAgICBAU2VjdXJpdHlUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvY0NWRV8yMDE2XzA4NDQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQWRiVXRpbHMucnVuUG9jKCJDVkUtMjAxNi0wODQ0IiwgZ2V0RGV2aWNlKCksIDYwKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc3JjL2FuZHJvaWQvc2VjdXJpdHkvY3RzL1BvYzE2XzA1LmphdmEgYi9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc3JjL2FuZHJvaWQvc2VjdXJpdHkvY3RzL1BvYzE2XzA1LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWExMDMwZAotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zcmMvYW5kcm9pZC9zZWN1cml0eS9jdHMvUG9jMTZfMDUuamF2YQpAQCAtMCwwICsxLDM0IEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZWN1cml0eS5jdHM7CisKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuU2VjdXJpdHlUZXN0OworCitAU2VjdXJpdHlUZXN0CitwdWJsaWMgY2xhc3MgUG9jMTZfMDUgZXh0ZW5kcyBTZWN1cml0eVRlc3RDYXNlIHsKKyAgICAvKioKKyAgICAgKiAgYi8yNzU1NTk4MQorICAgICAqLworICAgIEBTZWN1cml0eVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9jQ1ZFXzIwMTZfMjQ2MCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBBZGJVdGlscy5ydW5Db21tYW5kTGluZSgibG9nY2F0IC1jIiAsIGdldERldmljZSgpKTsKKyAgICAgICAgQWRiVXRpbHMucnVuUG9jKCJDVkUtMjAxNi0yNDYwIiwgZ2V0RGV2aWNlKCksIDYwKTsKKworICAgICAgICBTdHJpbmcgbG9nY2F0ID0gIEFkYlV0aWxzLnJ1bkNvbW1hbmRMaW5lKCJsb2djYXQgLWQiLCBnZXREZXZpY2UoKSk7CisgICAgICAgIGFzc2VydE5vdE1hdGNoZXMoIltcXHNcXG5cXFNdKklHcmFwaGljQnVmZmVyUHJvZHVjZXJfSW5mbyBpcyBMZWFrZWRbXFxzXFxuXFxTXSoiLCBsb2djYXQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zcmMvYW5kcm9pZC9zZWN1cml0eS9jdHMvUG9jMTZfMDcuamF2YSBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zcmMvYW5kcm9pZC9zZWN1cml0eS9jdHMvUG9jMTZfMDcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjAxZDQzCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NyYy9hbmRyb2lkL3NlY3VyaXR5L2N0cy9Qb2MxNl8wNy5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5zZWN1cml0eS5jdHM7CisKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuU2VjdXJpdHlUZXN0OworCitAU2VjdXJpdHlUZXN0CitwdWJsaWMgY2xhc3MgUG9jMTZfMDcgZXh0ZW5kcyBTZWN1cml0eVRlc3RDYXNlIHsKKyAgICAvKioKKyAgICAgKiAgYi8yODc0MDcwMgorICAgICAqLworICAgIEBTZWN1cml0eVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9jQ1ZFXzIwMTZfMzgxOCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBBZGJVdGlscy5ydW5Qb2MoIkNWRS0yMDE2LTM4MTgiLCBnZXREZXZpY2UoKSwgNjApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zcmMvYW5kcm9pZC9zZWN1cml0eS9jdHMvUG9jMTZfMDkuamF2YSBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zcmMvYW5kcm9pZC9zZWN1cml0eS9jdHMvUG9jMTZfMDkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWIwOGFkCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NyYy9hbmRyb2lkL3NlY3VyaXR5L2N0cy9Qb2MxNl8wOS5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5zZWN1cml0eS5jdHM7CisKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuU2VjdXJpdHlUZXN0OworCitAU2VjdXJpdHlUZXN0CitwdWJsaWMgY2xhc3MgUG9jMTZfMDkgZXh0ZW5kcyBTZWN1cml0eVRlc3RDYXNlIHsKKyAgICAvKioKKyAgICAgKiBiLzI3NzczOTEzCisgICAgICovCisgICAgQFNlY3VyaXR5VGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb2NDVkVfMjAxNl8yNDcxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEFkYlV0aWxzLnJ1blBvYygiQ1ZFLTIwMTYtMjQ3MSIsIGdldERldmljZSgpLCA2MCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NyYy9hbmRyb2lkL3NlY3VyaXR5L2N0cy9Qb2MxN18wMi5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NyYy9hbmRyb2lkL3NlY3VyaXR5L2N0cy9Qb2MxN18wMi5qYXZhCmluZGV4IDk4ZTQ1ZmYuLmZjNjg3MDcgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zcmMvYW5kcm9pZC9zZWN1cml0eS9jdHMvUG9jMTdfMDIuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc3JjL2FuZHJvaWQvc2VjdXJpdHkvY3RzL1BvYzE3XzAyLmphdmEKQEAgLTE5LDYgKzE5LDE3IEBACiBpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlNlY3VyaXR5VGVzdDsKIAogcHVibGljIGNsYXNzIFBvYzE3XzAyIGV4dGVuZHMgU2VjdXJpdHlUZXN0Q2FzZSB7CisgIC8qKgorICAgKiAgYi8zMjc5OTIzNgorICAgKi8KKyAgQFNlY3VyaXR5VGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0UG9jQ1ZFXzIwMTdfMDQyNigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgQWRiVXRpbHMucnVuQ29tbWFuZExpbmUoImxvZ2NhdCAtYyIsIGdldERldmljZSgpKTsKKyAgICAgIEFkYlV0aWxzLnJ1blBvYygiQ1ZFLTIwMTctMDQyNiIsIGdldERldmljZSgpLCA2MCk7CisgICAgICBTdHJpbmcgbG9nY2F0T3V0ID0gQWRiVXRpbHMucnVuQ29tbWFuZExpbmUoImxvZ2NhdCAtZCIsIGdldERldmljZSgpKTsKKyAgICAgIGFzc2VydE5vdE1hdGNoZXMoIltcXHNcXG5cXFNdKkJ1Z3JlcG9ydHMgZmlsZSBpbiB3cm9uZyBwYXRoW1xcc1xcblxcU10qIiwgbG9nY2F0T3V0KTsKKyAgfQorCiAgICAgLyoqCiAgICAgICogIGIvMzE3OTk4NjMKICAgICAgKi8KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zcmMvYW5kcm9pZC9zZWN1cml0eS9jdHMvUG9jMTdfMDMuamF2YSBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zcmMvYW5kcm9pZC9zZWN1cml0eS9jdHMvUG9jMTdfMDMuamF2YQppbmRleCA2OTBiMjc3Li44MGM5NTljIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc3JjL2FuZHJvaWQvc2VjdXJpdHkvY3RzL1BvYzE3XzAzLmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NyYy9hbmRyb2lkL3NlY3VyaXR5L2N0cy9Qb2MxN18wMy5qYXZhCkBAIC01OCw0ICs1OCwyOCBAQAogICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDMwMDAwKTsKICAgICAgICAgfQogICAgIH0KKworICAgIC8qKgorICAgICAqICBiLzMzMjQ1ODQ5CisgICAgICovCisgICAgQFNlY3VyaXR5VGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb2NDVkVfMjAxN18wMzM0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChjb250YWluc0RyaXZlcihnZXREZXZpY2UoKSwgIi9kZXYvZHJpL3JlbmRlckQxMjkiKSkgeworICAgICAgICAgICBTdHJpbmcgb3V0ID0gQWRiVXRpbHMucnVuUG9jKCJDVkUtMjAxNy0wMzM0IiwgZ2V0RGV2aWNlKCkpOworICAgICAgICAgICBhc3NlcnROb3RNYXRjaGVzTXVsdGlMaW5lKCIuKkxlYWtlZCBwdHIgaXMgKDB4W2ZGXXs2fVtjQ10wW2EtZkEtRjAtOV17OH0iCisgICAgICAgICAgICAgICArInwweFtjLWZDLUZdW2EtZkEtRjAtOV17N30pLioiLG91dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBiLzMyNzA3NTA3CisgICAgICovCisgICAgQFNlY3VyaXR5VGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb2NDVkVfMjAxN18wNDc5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEFkYlV0aWxzLnJ1bkNvbW1hbmRMaW5lKCJsb2djYXQgLWMiICwgZ2V0RGV2aWNlKCkpOworICAgICAgICBBZGJVdGlscy5ydW5Qb2NOb091dHB1dCgiQ1ZFLTIwMTctMDQ3OSIsIGdldERldmljZSgpLCA2MCk7CisgICAgICAgIFN0cmluZyBsb2djYXRPdXQgPSBBZGJVdGlscy5ydW5Db21tYW5kTGluZSgibG9nY2F0IC1kIiwgZ2V0RGV2aWNlKCkpOworICAgICAgICBhc3NlcnROb3RNYXRjaGVzTXVsdGlMaW5lKCIuKkZhdGFsIHNpZ25hbCAxMSBcXChTSUdTRUdWXFwpLio+Pj4gL3N5c3RlbS9iaW4vIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgImF1ZGlvc2VydmVyIDw8PC4qIiwgbG9nY2F0T3V0KTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc3JjL2FuZHJvaWQvc2VjdXJpdHkvY3RzL1BvYzE3XzA0LmphdmEgYi9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc3JjL2FuZHJvaWQvc2VjdXJpdHkvY3RzL1BvYzE3XzA0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFlMzk3NQotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zcmMvYW5kcm9pZC9zZWN1cml0eS9jdHMvUG9jMTdfMDQuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZWN1cml0eS5jdHM7CisKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuU2VjdXJpdHlUZXN0OworCitAU2VjdXJpdHlUZXN0CitwdWJsaWMgY2xhc3MgUG9jMTdfMDQgZXh0ZW5kcyBTZWN1cml0eVRlc3RDYXNlIHsKKworICAvKioKKyAgICogYi8zMjM0MjA2NQorICAgKi8KKyAgQFNlY3VyaXR5VGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0UG9jQ1ZFXzIwMTdfMDU1MygpIHRocm93cyBFeGNlcHRpb24geworICAgIC8vIEVycm9yIGNvZGUgb2YgMTM5IHJlcHJlc2VudHMgc2VnbWVudGF0aW9uIGZhdWx0CisgICAgZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZCgiY2htb2QgK3ggL2RhdGEvbG9jYWwvdG1wL0NWRS0yMDE3LTA1NTMiKTsKKyAgICBhc3NlcnRGYWxzZSgiU2VnZmF1bHQgZm91bmQiLAorICAgICAgICBBZGJVdGlscy5ydW5Db21tYW5kR2V0RXhpdENvZGUoIi9kYXRhL2xvY2FsL3RtcC9DVkUtMjAxNy0wNTUzIiwgZ2V0RGV2aWNlKCkpPT0xMzkpOworICB9CisKKyAgLyoqCisgICAqIGIvNzI0NjA3MzcKKyAgICovCisgIEBTZWN1cml0eVRlc3QKKyAgcHVibGljIHZvaWQgdGVzdFBvY0NWRV8yMDE0XzMxNDUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBhc3NlcnRGYWxzZSgiVlVMTkVSQUJMRSBERVZJQ0UgREVURUNURUQiLAorICAgICAgICAgICAgICAgIEFkYlV0aWxzLnJ1blBvY0NoZWNrRXhpdENvZGUoIkNWRS0yMDE0LTMxNDUiLCBnZXREZXZpY2UoKSwgNjApKTsKKyAgfQorCisgIC8qKgorICAgKiBiLzMyODEzNDU2CisgICAqLworICBAU2VjdXJpdHlUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RQb2NDVkVfMjAxNl8xMDIyOSgpIHRocm93cyBFeGNlcHRpb24geworICAgIFN0cmluZyBvdXQgPSBBZGJVdGlscy5ydW5Qb2MoIkNWRS0yMDE2LTEwMjI5IiwgZ2V0RGV2aWNlKCkpOworICAgIGFzc2VydE5vdE1hdGNoZXNNdWx0aUxpbmUoIi4qT1ZFUldSSVRFLioiLCBvdXQpOworICB9Cit9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc3JjL2FuZHJvaWQvc2VjdXJpdHkvY3RzL1BvYzE3XzA1LmphdmEgYi9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc3JjL2FuZHJvaWQvc2VjdXJpdHkvY3RzL1BvYzE3XzA1LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ2YjQ0YQotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zcmMvYW5kcm9pZC9zZWN1cml0eS9jdHMvUG9jMTdfMDUuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZWN1cml0eS5jdHM7CisKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuU2VjdXJpdHlUZXN0OworCitAU2VjdXJpdHlUZXN0CitwdWJsaWMgY2xhc3MgUG9jMTdfMDUgZXh0ZW5kcyBTZWN1cml0eVRlc3RDYXNlIHsKKworICAgIC8qKgorICAgICAqICBiLzM0Mjc3MTE1CisgICAgICovCisgICAgQFNlY3VyaXR5VGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb2NDVkVfMjAxN18wNjMwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChjb250YWluc0RyaXZlcihnZXREZXZpY2UoKSwgIi9zeXMva2VybmVsL2RlYnVnL3RyYWNpbmcvcHJpbnRrX2Zvcm1hdHMiKSkgeworICAgICAgICAgIFN0cmluZyBjb21tYW5kT3V0cHV0ID0gQWRiVXRpbHMucnVuQ29tbWFuZExpbmUoImNhdCAvc3lzL2tlcm5lbC9kZWJ1Zy90cmFjaW5nIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL3ByaW50a19mb3JtYXRzIiwgZ2V0RGV2aWNlKCkpOworICAgICAgICAgIGFzc2VydE5vdE1hdGNoZXNNdWx0aUxpbmUoIi4qMHgoPyEwKXs4LDE2fVswLTlhLWZBLUZdezgsMTZ9IDogLioiLCBjb21tYW5kT3V0cHV0KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zcmMvYW5kcm9pZC9zZWN1cml0eS9jdHMvUG9jMTdfMDcuamF2YSBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zcmMvYW5kcm9pZC9zZWN1cml0eS9jdHMvUG9jMTdfMDcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjk2MDJhCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NyYy9hbmRyb2lkL3NlY3VyaXR5L2N0cy9Qb2MxN18wNy5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlY3VyaXR5LmN0czsKKworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5TZWN1cml0eVRlc3Q7CisKK0BTZWN1cml0eVRlc3QKK3B1YmxpYyBjbGFzcyBQb2MxN18wNyBleHRlbmRzIFNlY3VyaXR5VGVzdENhc2UgeworCisgICAgLyoqCisgICAgICogYi8zNTQ0MzcyNQorICAgICAqKi8KKyAgICBAU2VjdXJpdHlUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvY0NWRV8yMDE2XzIxMDkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIGFzc2VydEZhbHNlKCJPdmVyYWxsb2NhdGlvbiBkZXRlY3RlZCEiLAorICAgICAgICAgIEFkYlV0aWxzLnJ1blBvY0NoZWNrRXhpdENvZGUoIkNWRS0yMDE2LTIxMDkiLAorICAgICAgICAgICAgZ2V0RGV2aWNlKCksIDYwKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc3JjL2FuZHJvaWQvc2VjdXJpdHkvY3RzL1BvYzE3XzA5LmphdmEgYi9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc3JjL2FuZHJvaWQvc2VjdXJpdHkvY3RzL1BvYzE3XzA5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg3MjMzZAotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zcmMvYW5kcm9pZC9zZWN1cml0eS9jdHMvUG9jMTdfMDkuamF2YQpAQCAtMCwwICsxLDY2IEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZWN1cml0eS5jdHM7CisKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuU2VjdXJpdHlUZXN0OworCitAU2VjdXJpdHlUZXN0CitwdWJsaWMgY2xhc3MgUG9jMTdfMDkgZXh0ZW5kcyBTZWN1cml0eVRlc3RDYXNlIHsKKworICAgIC8qKgorICAgICAqIGIvNjM4NTI2NzUKKyAgICAgKi8KKyAgICBAU2VjdXJpdHlUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvY0N2ZV8yMDE3XzY5ODMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIC8vIEVycm9yIGNvZGUgb2YgMTM5IHJlcHJlc2VudHMgc2VnbWVudGF0aW9uIGZhdWx0CisgICAgICBhc3NlcnRGYWxzZSgiU2VnZmF1bHQgZm91bmQiLAorICAgICAgICBBZGJVdGlscy5ydW5Db21tYW5kR2V0RXhpdENvZGUoInNxbGl0ZTMgJzptZW1vcnk6JyBcIkNSRUFURSBWSVJUVUFMIFRBQkxFIGEgdXNpbmcgZnRzMyhiKTsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiSU5TRVJUIElOVE8gYSB2YWx1ZXMoeCdlZmJlYWRkZWVmYmVhZGRlJyk7IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlNFTEVDVCBvcHRpbWl6ZShiKSAgRlJPTSBhO1wiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIGdldERldmljZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk9PTEzOSk7CisgICAgICBhc3NlcnRGYWxzZSgiU2VnZmF1bHQgZm91bmQiLAorICAgICAgICBBZGJVdGlscy5ydW5Db21tYW5kR2V0RXhpdENvZGUoInNxbGl0ZTMgJzptZW1vcnk6JyBcIkNSRUFURSBWSVJUVUFMIFRBQkxFIGEgdXNpbmcgZnRzMyhiKTsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiSU5TRVJUIElOVE8gYSB2YWx1ZXMoeCdlZmJlYWRkZWVmYmVhZGRlJyk7IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlNFTEVDVCBzbmlwcGV0KGIpICAgRlJPTSBhO1wiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIGdldERldmljZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk9PTEzOSk7CisgICAgICBhc3NlcnRGYWxzZSgiU2VnZmF1bHQgZm91bmQiLAorICAgICAgICBBZGJVdGlscy5ydW5Db21tYW5kR2V0RXhpdENvZGUoInNxbGl0ZTMgJzptZW1vcnk6JyBcIkNSRUFURSBWSVJUVUFMIFRBQkxFIGEgdXNpbmcgZnRzMyhiKTsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiSU5TRVJUIElOVE8gYSB2YWx1ZXMoeCdlZmJlYWRkZWVmYmVhZGRlJyk7IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlNFTEVDVCBvZmZzZXRzKGIpICAgRlJPTSBhO1wiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIGdldERldmljZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk9PTEzOSk7CisgICAgICBhc3NlcnRGYWxzZSgiU2VnZmF1bHQgZm91bmQiLAorICAgICAgICBBZGJVdGlscy5ydW5Db21tYW5kR2V0RXhpdENvZGUoInNxbGl0ZTMgJzptZW1vcnk6JyBcIkNSRUFURSBWSVJUVUFMIFRBQkxFIGEgdXNpbmcgZnRzMyhiKTsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiSU5TRVJUIElOVE8gYSB2YWx1ZXMoeCdlZmJlYWRkZWVmYmVhZGRlJyk7IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlNFTEVDVCBtYXRjaGluZm8oYikgRlJPTSBhO1wiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIGdldERldmljZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk9PTEzOSk7CisgICAgfQorCisgIC8qKgorICAgKiBiLzM4MTk1NzM4CisgICAqIGIvMzY1OTAxOTIKKyAgICovCisgIEBTZWN1cml0eVRlc3QKKyAgcHVibGljIHZvaWQgdGVzdFBvY0J1Z18zODE5NTczOCgpIHRocm93cyBFeGNlcHRpb24geworICAgIGlmKGNvbnRhaW5zRHJpdmVyKGdldERldmljZSgpLCAiL2Rldi9rZ3NsLTNkMCIpKSB7CisgICAgICBBZGJVdGlscy5ydW5Qb2NOb091dHB1dCgiQnVnLTM4MTk1NzM4IiwgZ2V0RGV2aWNlKCksIDYwKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zcmMvYW5kcm9pZC9zZWN1cml0eS9jdHMvUG9jMTdfMTIuamF2YSBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zcmMvYW5kcm9pZC9zZWN1cml0eS9jdHMvUG9jMTdfMTIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTllMGI2Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NyYy9hbmRyb2lkL3NlY3VyaXR5L2N0cy9Qb2MxN18xMi5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlY3VyaXR5LmN0czsKKworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5TZWN1cml0eVRlc3Q7CisKK0BTZWN1cml0eVRlc3QKK3B1YmxpYyBjbGFzcyBQb2MxN18xMiBleHRlbmRzIFNlY3VyaXR5VGVzdENhc2UgeworCisgIC8qKgorICAgKiBiLzM4MDQ1Nzk0CisgICAqLworICBAU2VjdXJpdHlUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RQb2NDVkVfMjAxN182MjYyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgaWYoY29udGFpbnNEcml2ZXIoZ2V0RGV2aWNlKCksIi9kZXYvZHJpL3JlbmRlckQxMjgiKSkgeworICAgICAgQWRiVXRpbHMucnVuUG9jTm9PdXRwdXQoIkNWRS0yMDE3LTYyNjIiLCBnZXREZXZpY2UoKSwgOTAwKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zcmMvYW5kcm9pZC9zZWN1cml0eS9jdHMvUG9jMThfMDIuamF2YSBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zcmMvYW5kcm9pZC9zZWN1cml0eS9jdHMvUG9jMThfMDIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDZjNjBkCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NyYy9hbmRyb2lkL3NlY3VyaXR5L2N0cy9Qb2MxOF8wMi5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlY3VyaXR5LmN0czsKKworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5TZWN1cml0eVRlc3Q7CisKK0BTZWN1cml0eVRlc3QKK3B1YmxpYyBjbGFzcyBQb2MxOF8wMiBleHRlbmRzIFNlY3VyaXR5VGVzdENhc2UgeworCisgICAgLyoqCisgICAgICogYi82ODk1Mzk1MAorICAgICAqLworICAgICBAU2VjdXJpdHlUZXN0CisgICAgIHB1YmxpYyB2b2lkIHRlc3RQb2NDVkVfMjAxN18xMzIzMigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgIEFkYlV0aWxzLnJ1bkNvbW1hbmRMaW5lKCJsb2djYXQgLWMiICwgZ2V0RGV2aWNlKCkpOworICAgICAgIEFkYlV0aWxzLnJ1blBvY05vT3V0cHV0KCJDVkUtMjAxNy0xMzIzMiIsIGdldERldmljZSgpLCA2MCk7CisgICAgICAgU3RyaW5nIGxvZ2NhdE91dHB1dCA9IEFkYlV0aWxzLnJ1bkNvbW1hbmRMaW5lKCJsb2djYXQgLWQiLCBnZXREZXZpY2UoKSk7CisgICAgICAgYXNzZXJ0Tm90TWF0Y2hlc011bHRpTGluZSgiLipBUE1fQXVkaW9Qb2xpY3lNYW5hZ2VyOiBnZXRPdXRwdXRGb3JBdHRyXFwoXFwpICIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBhdHRyaWJ1dGVzOiB1c2FnZT0uezEsfSBjb250ZW50PS57MSx9ICIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmxhZ3M9LnsxLH0gdGFncz1cXFsuezI1Nix9XFxdLioiLCBsb2djYXRPdXRwdXQpOworICAgICB9Cit9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc3JjL2FuZHJvaWQvc2VjdXJpdHkvY3RzL1BvYzE4XzAzLmphdmEgYi9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc3JjL2FuZHJvaWQvc2VjdXJpdHkvY3RzL1BvYzE4XzAzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM5ODE2NAotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zcmMvYW5kcm9pZC9zZWN1cml0eS9jdHMvUG9jMThfMDMuamF2YQpAQCAtMCwwICsxLDMxIEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZWN1cml0eS5jdHM7CisKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuU2VjdXJpdHlUZXN0OworCitwdWJsaWMgY2xhc3MgUG9jMThfMDMgZXh0ZW5kcyBTZWN1cml0eVRlc3RDYXNlIHsKKworICAvKioKKyAgICogIGIvNzEzODkzNzgKKyAgICovCisgIEBTZWN1cml0eVRlc3QKKyAgcHVibGljIHZvaWQgdGVzdFBvY0NWRV8yMDE3XzEzMjUzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgU3RyaW5nIG91dHB1dCA9IEFkYlV0aWxzLnJ1blBvYygiQ1ZFLTIwMTctMTMyNTMiLCBnZXREZXZpY2UoKSk7CisgICAgYXNzZXJ0Tm90TWF0Y2hlc011bHRpTGluZSgiLipPVkVSRkxPVyBERVRFQ1RFRC4qIixvdXRwdXQpOworICB9Cit9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc3JjL2FuZHJvaWQvc2VjdXJpdHkvY3RzL1BvYzE5XzAzLmphdmEgYi9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc3JjL2FuZHJvaWQvc2VjdXJpdHkvY3RzL1BvYzE5XzAzLmphdmEKaW5kZXggZWE0ZTQwMy4uMTE1ZmFkMiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NyYy9hbmRyb2lkL3NlY3VyaXR5L2N0cy9Qb2MxOV8wMy5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvc2VjdXJpdHlidWxsZXRpbi9zcmMvYW5kcm9pZC9zZWN1cml0eS9jdHMvUG9jMTlfMDMuamF2YQpAQCAtMjcsNyArMjcsNyBAQAogICAgIC8qKgogICAgICAqIGIvMTE1NzM5ODA5CiAgICAgICovCi0gICAgQFNlY3VyaXR5VGVzdAorICAgIEBTZWN1cml0eVRlc3QobWluUGF0Y2hMZXZlbCA9ICIyMDE5LTAzIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0UG9jQnVnXzExNTczOTgwOSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBhc3NlcnRGYWxzZShBZGJVdGlscy5ydW5Qb2NDaGVja0V4aXRDb2RlKCJCdWctMTE1NzM5ODA5IiwgZ2V0RGV2aWNlKCksIDMwKSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZWN1cml0eWJ1bGxldGluL3NyYy9hbmRyb2lkL3NlY3VyaXR5L2N0cy9TZWN1cml0eVRlc3RDYXNlLmphdmEgYi9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc3JjL2FuZHJvaWQvc2VjdXJpdHkvY3RzL1NlY3VyaXR5VGVzdENhc2UuamF2YQppbmRleCBiNmQ2NDdhLi5jYWNjZWFhIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc3JjL2FuZHJvaWQvc2VjdXJpdHkvY3RzL1NlY3VyaXR5VGVzdENhc2UuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL3NlY3VyaXR5YnVsbGV0aW4vc3JjL2FuZHJvaWQvc2VjdXJpdHkvY3RzL1NlY3VyaXR5VGVzdENhc2UuamF2YQpAQCAtMjMsMTAgKzIzLDE1IEBACiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQubG9nLkxvZ1V0aWwuQ0xvZzsKIAogaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5NdWx0aUxpbmVSZWNlaXZlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuTG9nOwogCiBwdWJsaWMgY2xhc3MgU2VjdXJpdHlUZXN0Q2FzZSBleHRlbmRzIERldmljZVRlc3RDYXNlIHsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIlNlY3VyaXR5VGVzdENhc2UiOworCiAgICAgcHJpdmF0ZSBsb25nIGtlcm5lbFN0YXJ0VGltZTsKKyAgICBwcml2YXRlIHN0YXRpYyBUaHJlYWQgY2hlY2tPb20gPSBudWxsOwogCiAgICAgLyoqCiAgICAgICogV2FpdHMgZm9yIGRldmljZSB0byBiZSBvbmxpbmUsIG1hcmtzIHRoZSBtb3N0IHJlY2VudCBib290dGltZSBvZiB0aGUgZGV2aWNlCkBAIC00MCwxNiArNDUsMjEgQEAKICAgICAgICAgICAgIEludGVnZXIucGFyc2VJbnQodXB0aW1lLnN1YnN0cmluZygwLCB1cHRpbWUuaW5kZXhPZignLicpKSk7CiAgICAgICAgIC8vVE9ETzooYmFkYXNoQCk6IFdhdGNoIGZvciBvdGhlciB0aGluZ3MgdG8gdHJhY2suCiAgICAgICAgIC8vICAgICBTcGVjaWZpY2FsbHkgdGltZSB3aGVuIGFwcCBmcmFtZXdvcmsgc3RhcnRzCisKKyAgICAgICAgLy8gU3RhcnQgT3V0IG9mIE1lbW9yeSBkZXRlY3Rpb24gaW4gc2VwYXJhdGUgdGhyZWFkCisgICAgICAgIC8vaWYgKGNoZWNrT29tID09IG51bGwgfHwgIWNoZWNrT29tLmlzQWxpdmUoKSkgeworICAgICAgICAvLyAgICBjaGVja09vbSA9IG5ldyBUaHJlYWQobmV3IE9vbUNoZWNrZXIoKSk7CisgICAgICAgIC8vICAgIGNoZWNrT29tLnN0YXJ0KCk7CisgICAgICAgIC8vfQogICAgIH0KIAogICAgIC8qKgogICAgICAqIEFsbG93cyBhIENUUyB0ZXN0IHRvIHBhc3MgaWYgY2FsbGVkIGFmdGVyIGEgcGxhbm5lZCByZWJvb3QuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdXBkYXRlS2VybmVsU3RhcnRUaW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBjbWRPdXQgPSBnZXREZXZpY2UoKS5leGVjdXRlU2hlbGxDb21tYW5kKCJkdW1wc3lzIG1lbWluZm8iKTsKLSAgICAgICAgbG9uZyB1cHRpbWUgPSBMb25nLnBhcnNlTG9uZyhjbWRPdXQuc3Vic3RyaW5nKGNtZE91dC5pbmRleE9mKCJVcHRpbWU6ICIpICsgOCwKLSAgICAgICAgICAgICAgICAgICAgICBjbWRPdXQuaW5kZXhPZigiUmVhbHRpbWU6ICIpIC0gMSkpLzEwMDA7Ci0gICAgICAgIGtlcm5lbFN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLzEwMDAgLSB1cHRpbWU7CisgICAgICAgIFN0cmluZyB1cHRpbWUgPSBnZXREZXZpY2UoKS5leGVjdXRlU2hlbGxDb21tYW5kKCJjYXQgL3Byb2MvdXB0aW1lIik7CisgICAgICAgIGtlcm5lbFN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLzEwMDAgLQorICAgICAgICAgICAgSW50ZWdlci5wYXJzZUludCh1cHRpbWUuc3Vic3RyaW5nKDAsIHVwdGltZS5pbmRleE9mKCcuJykpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTg0LDcgKzk0LDcgQEAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBnZXREZXZpY2UoKS53YWl0Rm9yRGV2aWNlT25saW5lKDYwICogMTAwMCk7CisgICAgICAgIGdldERldmljZSgpLndhaXRGb3JEZXZpY2VBdmFpbGFibGUoMTIwICogMTAwMCk7CiAgICAgICAgIFN0cmluZyB1cHRpbWUgPSBnZXREZXZpY2UoKS5leGVjdXRlU2hlbGxDb21tYW5kKCJjYXQgL3Byb2MvdXB0aW1lIik7CiAgICAgICAgIGFzc2VydFRydWUoIlBob25lIGhhcyBoYWQgYSBoYXJkIHJlc2V0IiwKICAgICAgICAgICAgIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKS8xMDAwIC0KQEAgLTEwMSw0ICsxMTEsNDggQEAKICAgICBwdWJsaWMgdm9pZCBhc3NlcnROb3RNYXRjaGVzKFN0cmluZyBwYXR0ZXJuLCBTdHJpbmcgaW5wdXQpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBhc3NlcnRGYWxzZSgiUGF0dGVybiBmb3VuZCIsIFBhdHRlcm4ubWF0Y2hlcyhwYXR0ZXJuLCBpbnB1dCkpOwogICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFzc2VydE5vdE1hdGNoZXNNdWx0aUxpbmUoU3RyaW5nIHBhdHRlcm4sIFN0cmluZyBpbnB1dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgYXNzZXJ0RmFsc2UoIlBhdHRlcm4gZm91bmQiLAorICAgICAgICAgICAgICAgICAgIFBhdHRlcm4uY29tcGlsZShwYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgIFBhdHRlcm4uRE9UQUxMKS5tYXRjaGVyKGlucHV0KS5tYXRjaGVzKCkpOworICAgIH0KKworICAgIGNsYXNzIE9vbUNoZWNrZXIgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIE11bHRpTGluZVJlY2VpdmVyIHJjdnIgPSBuZXcgTXVsdGlMaW5lUmVjZWl2ZXIoKSB7CisgICAgICAgICAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzQ2FuY2VsbGVkID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBwcm9jZXNzTmV3TGluZXMoU3RyaW5nW10gbGluZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgbGluZSA6IGxpbmVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUGF0dGVybi5tYXRjaGVzKCIuKmxvd21lbW9yeWtpbGxlci4qIiwgbGluZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb3cgbWVtb3J5IGRldGVjdGVkLCByZWJvb3QgZGV2aWNlIHRvIGNsZWFyIG1lbW9yeSBhbmQgcGFzcyB0ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDYW5jZWxsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKExPR19UQUcsICJsb3dtZW1vcnlraWxsZXIgZGV0ZWN0ZWQ7IHJlYm9vdGluZyBkZXZpY2UgYW5kIHBhc3NpbmcgdGVzdCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldERldmljZSgpLnJlYm9vdFVudGlsT25saW5lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUtlcm5lbFN0YXJ0VGltZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsIGUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8gd2UgZG9uJ3QgbmVlZCB0byBwcm9jZXNzIHJlbWFpbmluZyBsaW5lcyBpbiB0aGUgYXJyYXkKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ2FuY2VsbGVkKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNDYW5jZWxsZWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBBZGJVdGlscy5ydW5Db21tYW5kTGluZSgibG9nY2F0IC1jIiwgZ2V0RGV2aWNlKCkpOworICAgICAgICAgICAgICAgIGdldERldmljZSgpLmV4ZWN1dGVTaGVsbENvbW1hbmQoImxvZ2NhdCIsIHJjdnIpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCBlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3OGNiOGEuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLWluY2x1ZGUgJChjYWxsIGFsbC1zdWJkaXItbWFrZWZpbGVzKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk1ODllYi4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLUxPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLSMgTXVzdCBtYXRjaCB0aGUgcGFja2FnZSBuYW1lIGluIEN0c1Rlc3RDYXNlTGlzdC5tawotTE9DQUxfTU9EVUxFIDo9IEN0c1NlcnZpY2VzSG9zdFRlc3RDYXNlcwotCi1MT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCi0KLUxPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGN0cy10cmFkZWZlZCB0cmFkZWZlZAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGN0cy1hbXdtLXV0aWwgIFwKLSAgICBjdHMtZGlzcGxheS1zZXJ2aWNlLWFwcC11dGlsIFwKLSAgICBwbGF0Zm9ybS10ZXN0LWFubm90YXRpb25zLWhvc3QgXAotICAgIGNvbXBhdGliaWxpdHktaG9zdC11dGlsCi0KLUxPQ0FMX0NUU19URVNUX1BBQ0tBR0UgOj0gYW5kcm9pZC5zZXJ2ZXIKLQotIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKLQotaW5jbHVkZSAkKEJVSUxEX0NUU19IT1NUX0pBVkFfTElCUkFSWSkKLQotIyBCdWlsZCB0aGUgdGVzdCBBUEtzIHVzaW5nIHRoZWlyIG93biBtYWtlZmlsZXMKLWluY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9BbmRyb2lkVGVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvQW5kcm9pZFRlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmI4ZDU1Li4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9BbmRyb2lkVGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIFNhbXBsZSBob3N0IHRlc3QgY2FzZXMiPgotICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iZnJhbWV3b3JrIiAvPgotICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgotICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJDdHNEZXZpY2VTZXJ2aWNlc1Rlc3RBcHAuYXBrIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzRGV2aWNlU2VydmljZXNUZXN0U2Vjb25kQXBwLmFwayIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0RldmljZVNlcnZpY2VzVGVzdFRoaXJkQXBwLmFwayIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0RldmljZURlYnVnZ2FibGVBcHAuYXBrIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzRGV2aWNlRGlzcGxheVNpemVBcHAuYXBrIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzRGlzcGxheVNlcnZpY2VBcHAuYXBrIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzRGV2aWNlVHJhbnNsdWNlbnRUZXN0QXBwLmFwayIgLz4KLSAgICA8L3RhcmdldF9wcmVwYXJlcj4KLSAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGVzdHR5cGUuSmFySG9zdFRlc3QiID4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJqYXIiIHZhbHVlPSJDdHNTZXJ2aWNlc0hvc3RUZXN0Q2FzZXMuamFyIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjRtNDRzIiAvPgotICAgIDwvdGVzdD4KLTwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdmMjI0OC4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLSMgRG9uJ3QgaW5jbHVkZSB0aGlzIHBhY2thZ2UgaW4gYW55IHRhcmdldC4KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi0KLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCi0gICAgYW5kcm9pZC1zdXBwb3J0LXY0IFwKLQotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKSBcCi0gICAgICAgICAgICAgICAgICAgLi4vLi4vLi4vLi4vLi4vYXBwcy9DdHNWZXJpZmllci9zcmMvY29tL2FuZHJvaWQvY3RzL3ZlcmlmaWVyL3ZyL01vY2tWckxpc3RlbmVyU2VydmljZS5qYXZhCi0KLUxPQ0FMX1NES19WRVJTSU9OIDo9IHRlc3RfY3VycmVudAotCi0jIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0Ci1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cwotCi1MT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzRGV2aWNlU2VydmljZXNUZXN0QXBwCi0KLWluY2x1ZGUgJChCVUlMRF9DVFNfU1VQUE9SVF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZjcwYjYyLi4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQxNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLQotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgICAgeG1sbnM6YW5kcm9pZHBydj0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Bydi9yZXMvYW5kcm9pZCIKLSAgICAgICAgICBwYWNrYWdlPSJhbmRyb2lkLnNlcnZlci5jdHMiPgotCi0gICAgPCEtLSB2aXJ0dWFsIGRpc3BsYXkgdGVzdCBwZXJtaXNzaW9ucyAtLT4KLSAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkNBUFRVUkVfVklERU9fT1VUUFVUIiAvPgotICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uRElTQUJMRV9LRVlHVUFSRCIgLz4KLSAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkJJTkRfVk9JQ0VfSU5URVJBQ1RJT04iIC8+Ci0KLSAgICA8YXBwbGljYXRpb24+Ci0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5UZXN0QWN0aXZpdHkiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpyZXNpemVhYmxlQWN0aXZpdHk9InRydWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpzdXBwb3J0c1BpY3R1cmVJblBpY3R1cmU9InRydWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIKLSAgICAgICAgLz4KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLlRlc3RBY3Rpdml0eVdpdGhTYW1lQWZmaW5pdHkiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpyZXNpemVhYmxlQWN0aXZpdHk9InRydWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpzdXBwb3J0c1BpY3R1cmVJblBpY3R1cmU9InRydWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRhc2tBZmZpbml0eT0ibm9ib2R5LmJ1dC5QaXBBY3Rpdml0eVNhbWVBZmZpbml0eSIKLSAgICAgICAgLz4KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLlRyYW5zbHVjZW50VGVzdEFjdGl2aXR5IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cmVzaXplYWJsZUFjdGl2aXR5PSJ0cnVlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3VwcG9ydHNQaWN0dXJlSW5QaWN0dXJlPSJ0cnVlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29uZmlnQ2hhbmdlcz0ib3JpZW50YXRpb258c2NyZWVuU2l6ZXxzbWFsbGVzdFNjcmVlblNpemV8c2NyZWVuTGF5b3V0IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBzdHlsZS9UaGVtZS5UcmFuc3BhcmVudCIgLz4KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLlZyVGVzdEFjdGl2aXR5IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cmVzaXplYWJsZUFjdGl2aXR5PSJ0cnVlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiCi0gICAgICAgIC8+Ci0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5SZXN1bWVXaGlsZVBhdXNpbmdBY3Rpdml0eSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmFsbG93RW1iZWRkZWQ9InRydWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpyZXN1bWVXaGlsZVBhdXNpbmc9InRydWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0YXNrQWZmaW5pdHk9IiIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIgotICAgICAgICAvPgotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuUmVzaXplYWJsZUFjdGl2aXR5IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cmVzaXplYWJsZUFjdGl2aXR5PSJ0cnVlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6YWxsb3dFbWJlZGRlZD0idHJ1ZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29uZmlnQ2hhbmdlcz0ib3JpZW50YXRpb258c2NyZWVuU2l6ZXxzbWFsbGVzdFNjcmVlblNpemV8c2NyZWVuTGF5b3V0fGNvbG9yTW9kZXxkZW5zaXR5IgotICAgICAgICAvPgotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuTm9uUmVzaXplYWJsZUFjdGl2aXR5IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cmVzaXplYWJsZUFjdGl2aXR5PSJmYWxzZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIgotICAgICAgICAvPgotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuRG9ja2VkQWN0aXZpdHkiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpyZXNpemVhYmxlQWN0aXZpdHk9InRydWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRhc2tBZmZpbml0eT0ibm9ib2R5LmJ1dC5Eb2NrZWRBY3Rpdml0eSIKLSAgICAgICAgLz4KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLlRyYW5zbHVjZW50QWN0aXZpdHkiCi0gICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5UcmFuc2x1Y2VudC5Ob1RpdGxlQmFyIgotICAgICAgICAgICAgYW5kcm9pZDpyZXNpemVhYmxlQWN0aXZpdHk9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOnRhc2tBZmZpbml0eT0ibm9ib2R5LmJ1dC5UcmFuc2x1Y2VudEFjdGl2aXR5IgotICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIKLSAgICAgICAgLz4KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLkRpYWxvZ1doZW5MYXJnZUFjdGl2aXR5IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuRGV2aWNlRGVmYXVsdC5MaWdodC5EaWFsb2dXaGVuTGFyZ2UiCi0gICAgICAgIC8+Ci0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5Ob1JlbGF1bmNoQWN0aXZpdHkiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpyZXNpemVhYmxlQWN0aXZpdHk9InRydWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpjb25maWdDaGFuZ2VzPSJvcmllbnRhdGlvbnxzY3JlZW5TaXplfHNtYWxsZXN0U2NyZWVuU2l6ZXxzY3JlZW5MYXlvdXR8Zm9udFNjYWxlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0YXNrQWZmaW5pdHk9Im5vYm9keS5idXQuTm9SZWxhdW5jaEFjdGl2aXR5IgotICAgICAgICAvPgotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuU2xvd0NyZWF0ZUFjdGl2aXR5IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cmVzaXplYWJsZUFjdGl2aXR5PSJ0cnVlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiCi0gICAgICAgIC8+Ci0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5MYXVuY2hpbmdBY3Rpdml0eSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnJlc2l6ZWFibGVBY3Rpdml0eT0idHJ1ZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFza0FmZmluaXR5PSJub2JvZHkuYnV0LkxhdW5jaGluZ0FjdGl2aXR5IgotICAgICAgICAvPgotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuQWx0TGF1bmNoaW5nQWN0aXZpdHkiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpyZXNpemVhYmxlQWN0aXZpdHk9InRydWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRhc2tBZmZpbml0eT0ibm9ib2R5LmJ1dC5MYXVuY2hpbmdBY3Rpdml0eSIKLSAgICAgICAgLz4KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLlBpcEFjdGl2aXR5IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cmVzaXplYWJsZUFjdGl2aXR5PSJmYWxzZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnN1cHBvcnRzUGljdHVyZUluUGljdHVyZT0idHJ1ZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmNvbmZpZ0NoYW5nZXM9Im9yaWVudGF0aW9ufHNjcmVlblNpemV8c21hbGxlc3RTY3JlZW5TaXplfHNjcmVlbkxheW91dCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFza0FmZmluaXR5PSJub2JvZHkuYnV0LlBpcEFjdGl2aXR5IgotICAgICAgICAvPgotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuUGlwQWN0aXZpdHkyIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpyZXNpemVhYmxlQWN0aXZpdHk9ImZhbHNlIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzdXBwb3J0c1BpY3R1cmVJblBpY3R1cmU9InRydWUiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmNvbmZpZ0NoYW5nZXM9Im9yaWVudGF0aW9ufHNjcmVlblNpemV8c21hbGxlc3RTY3JlZW5TaXplfHNjcmVlbkxheW91dCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhc2tBZmZpbml0eT0ibm9ib2R5LmJ1dC5QaXBBY3Rpdml0eTIiCi0gICAgICAgIC8+Ci0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5QaXBPblN0b3BBY3Rpdml0eSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cmVzaXplYWJsZUFjdGl2aXR5PSJmYWxzZSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3VwcG9ydHNQaWN0dXJlSW5QaWN0dXJlPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpjb25maWdDaGFuZ2VzPSJvcmllbnRhdGlvbnxzY3JlZW5TaXplfHNtYWxsZXN0U2NyZWVuU2l6ZXxzY3JlZW5MYXlvdXQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXNrQWZmaW5pdHk9Im5vYm9keS5idXQuUGlwT25TdG9wQWN0aXZpdHkiCi0gICAgICAgIC8+Ci0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5QaXBBY3Rpdml0eVdpdGhTYW1lQWZmaW5pdHkiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnJlc2l6ZWFibGVBY3Rpdml0eT0iZmFsc2UiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnN1cHBvcnRzUGljdHVyZUluUGljdHVyZT0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29uZmlnQ2hhbmdlcz0ib3JpZW50YXRpb258c2NyZWVuU2l6ZXxzbWFsbGVzdFNjcmVlblNpemV8c2NyZWVuTGF5b3V0IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFza0FmZmluaXR5PSJub2JvZHkuYnV0LlBpcEFjdGl2aXR5U2FtZUFmZmluaXR5IgotICAgICAgICAvPgotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuQWx3YXlzRm9jdXNhYmxlUGlwQWN0aXZpdHkiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAc3R5bGUvVGhlbWUuVHJhbnNwYXJlbnQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnJlc2l6ZWFibGVBY3Rpdml0eT0iZmFsc2UiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnN1cHBvcnRzUGljdHVyZUluUGljdHVyZT0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWRwcnY6YWx3YXlzRm9jdXNhYmxlPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFza0FmZmluaXR5PSJub2JvZHkuYnV0LkFsd2F5c0ZvY3VzYWJsZVBpcEFjdGl2aXR5IgotICAgICAgICAvPgotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuTGF1bmNoSW50b1Bpbm5lZFN0YWNrUGlwQWN0aXZpdHkiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnJlc2l6ZWFibGVBY3Rpdml0eT0iZmFsc2UiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnN1cHBvcnRzUGljdHVyZUluUGljdHVyZT0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWRwcnY6YWx3YXlzRm9jdXNhYmxlPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpjb25maWdDaGFuZ2VzPSJvcmllbnRhdGlvbnxzY3JlZW5TaXplfHNtYWxsZXN0U2NyZWVuU2l6ZXxzY3JlZW5MYXlvdXQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIgotICAgICAgICAvPgotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuTGF1bmNoUGlwT25QaXBBY3Rpdml0eSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cmVzaXplYWJsZUFjdGl2aXR5PSJmYWxzZSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3VwcG9ydHNQaWN0dXJlSW5QaWN0dXJlPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXNrQWZmaW5pdHk9Im5vYm9keS5idXQuTGF1bmNoUGlwT25QaXBBY3Rpdml0eSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29uZmlnQ2hhbmdlcz0ib3JpZW50YXRpb258c2NyZWVuU2l6ZXxzbWFsbGVzdFNjcmVlblNpemV8c2NyZWVuTGF5b3V0IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIKLSAgICAgICAgLz4KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLkxhdW5jaEVudGVyUGlwQWN0aXZpdHkiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnJlc2l6ZWFibGVBY3Rpdml0eT0iZmFsc2UiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnN1cHBvcnRzUGljdHVyZUluUGljdHVyZT0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWRwcnY6YWx3YXlzRm9jdXNhYmxlPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpjb25maWdDaGFuZ2VzPSJvcmllbnRhdGlvbnxzY3JlZW5TaXplfHNtYWxsZXN0U2NyZWVuU2l6ZXxzY3JlZW5MYXlvdXQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIgotICAgICAgICAvPgotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuRnJlZWZvcm1BY3Rpdml0eSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cmVzaXplYWJsZUFjdGl2aXR5PSJ0cnVlIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXNrQWZmaW5pdHk9Im5vYm9keS5idXQuRnJlZWZvcm1BY3Rpdml0eSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiCi0gICAgICAgIC8+Ci0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5Ub3BMZWZ0TGF5b3V0QWN0aXZpdHkiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnJlc2l6ZWFibGVBY3Rpdml0eT0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29uZmlnQ2hhbmdlcz0ib3JpZW50YXRpb258c2NyZWVuU2l6ZXxzbWFsbGVzdFNjcmVlblNpemV8c2NyZWVuTGF5b3V0IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0IGFuZHJvaWQ6ZGVmYXVsdFdpZHRoPSIyNDBkcCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpkZWZhdWx0SGVpZ2h0PSIxNjBkcCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJ0b3B8bGVmdCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDptaW5XaWR0aD0iMTAwZHAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSI4MGRwIgotICAgICAgICAgICAgICAgICAgLz4KLSAgICAgICAgPC9hY3Rpdml0eT4KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLlRvcFJpZ2h0TGF5b3V0QWN0aXZpdHkiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnJlc2l6ZWFibGVBY3Rpdml0eT0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29uZmlnQ2hhbmdlcz0ib3JpZW50YXRpb258c2NyZWVuU2l6ZXxzbWFsbGVzdFNjcmVlblNpemV8c2NyZWVuTGF5b3V0IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0IGFuZHJvaWQ6ZGVmYXVsdFdpZHRoPSIyNSUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZGVmYXVsdEhlaWdodD0iMzUlIgotICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9InRvcHxyaWdodCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDptaW5XaWR0aD0iOTBkcCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDptaW5IZWlnaHQ9IjgwZHAiCi0gICAgICAgICAgICAgICAgICAvPgotICAgICAgICA8L2FjdGl2aXR5PgotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuQm90dG9tTGVmdExheW91dEFjdGl2aXR5IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpyZXNpemVhYmxlQWN0aXZpdHk9InRydWUiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmNvbmZpZ0NoYW5nZXM9Im9yaWVudGF0aW9ufHNjcmVlblNpemV8c21hbGxlc3RTY3JlZW5TaXplfHNjcmVlbkxheW91dCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiPgotICAgICAgICAgICAgICAgICAgPGxheW91dCBhbmRyb2lkOmRlZmF1bHRXaWR0aD0iMjUlIgotICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmRlZmF1bHRIZWlnaHQ9IjM1JSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJib3R0b218bGVmdCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDptaW5XaWR0aD0iOTBkcCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDptaW5IZWlnaHQ9IjgwZHAiCi0gICAgICAgICAgICAgICAgICAvPgotICAgICAgICA8L2FjdGl2aXR5PgotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuQm90dG9tUmlnaHRMYXlvdXRBY3Rpdml0eSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cmVzaXplYWJsZUFjdGl2aXR5PSJ0cnVlIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpjb25maWdDaGFuZ2VzPSJvcmllbnRhdGlvbnxzY3JlZW5TaXplfHNtYWxsZXN0U2NyZWVuU2l6ZXxzY3JlZW5MYXlvdXQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXQgYW5kcm9pZDpkZWZhdWx0V2lkdGg9IjI0MGRwIgotICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmRlZmF1bHRIZWlnaHQ9IjE2MGRwIgotICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImJvdHRvbXxyaWdodCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDptaW5XaWR0aD0iMTAwZHAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSI4MGRwIgotICAgICAgICAgICAgICAgICAgLz4KLSAgICAgICAgPC9hY3Rpdml0eT4KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLlR1cm5TY3JlZW5PbkFjdGl2aXR5IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIKLSAgICAgICAgLz4KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLlR1cm5TY3JlZW5PbkRpc21pc3NLZXlndWFyZEFjdGl2aXR5IgotICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIKLSAgICAgICAgLz4KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLlNpbmdsZVRhc2tBY3Rpdml0eSIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmxhdW5jaE1vZGU9InNpbmdsZVRhc2siCi0gICAgICAgIC8+Ci0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5TaW5nbGVJbnN0YW5jZUFjdGl2aXR5IgotICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF1bmNoTW9kZT0ic2luZ2xlSW5zdGFuY2UiCi0gICAgICAgIC8+Ci0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5UcmFtcG9saW5lQWN0aXZpdHkiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuTm9EaXNwbGF5IgotICAgICAgICAvPgotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuQnJvYWRjYXN0UmVjZWl2ZXJBY3Rpdml0eSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cmVzaXplYWJsZUFjdGl2aXR5PSJ0cnVlIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIKLSAgICAgICAgLz4KLSAgICAgICAgPGFjdGl2aXR5LWFsaWFzIGFuZHJvaWQ6ZW5hYmxlZD0idHJ1ZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iLkVudHJ5UG9pbnRBbGlhc0FjdGl2aXR5IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0QWN0aXZpdHk9Ii5UcmFtcG9saW5lQWN0aXZpdHkiID4KLSAgICAgICAgPC9hY3Rpdml0eS1hbGlhcz4KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLkJvdHRvbUFjdGl2aXR5IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBzdHlsZS9Ob1ByZXZpZXciCi0gICAgICAgIC8+Ci0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5Ub3BBY3Rpdml0eSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cHJvY2Vzcz0iLnRvcF9wcm9jZXNzIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBzdHlsZS9Ob1ByZXZpZXciCi0gICAgICAgIC8+Ci0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5UcmFuc2x1Y2VudFRvcEFjdGl2aXR5IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwcm9jZXNzPSIudG9wX3Byb2Nlc3MiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQHN0eWxlL1RyYW5zbHVjZW50VGhlbWUiCi0gICAgICAgIC8+Ci0gICAgICAgIDwhLS0gQW4gYW5pbWF0aW9uIHRlc3Qgd2l0aCBhbiBleHBsaWNpdGx5IG9wYXF1ZSB0aGVtZSwgb3ZlcnJpZGluZyBkZXZpY2UgZGVmYXVsdHMsIGFzIHRoZQotICAgICAgICAgICAgIGFuaW1hdGlvbiBiYWNrZ3JvdW5kIGJlaW5nIHRlc3RlZCBpcyBub3QgdXNlZCBpbiB0cmFuc2x1Y2VudCBhY3Rpdml0aWVzLiAtLT4KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLkFuaW1hdGlvblRlc3RBY3Rpdml0eSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBzdHlsZS9PcGFxdWVUaGVtZSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiCi0gICAgICAgIC8+Ci0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5WaXJ0dWFsRGlzcGxheUFjdGl2aXR5IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpyZXNpemVhYmxlQWN0aXZpdHk9InRydWUiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpjb25maWdDaGFuZ2VzPSJvcmllbnRhdGlvbnxzY3JlZW5TaXplfHNtYWxsZXN0U2NyZWVuU2l6ZXxzY3JlZW5MYXlvdXQiCi0gICAgICAgIC8+Ci0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5TaG93V2hlbkxvY2tlZEFjdGl2aXR5IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIKLSAgICAgICAgLz4KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLlNob3dXaGVuTG9ja2VkV2l0aERpYWxvZ0FjdGl2aXR5IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIKLSAgICAgICAgLz4KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLlNob3dXaGVuTG9ja2VkRGlhbG9nQWN0aXZpdHkiCi0gICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuTWF0ZXJpYWwuRGlhbG9nIgotICAgICAgICAvPgotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuU2hvd1doZW5Mb2NrZWRUcmFuc2x1Y2VudEFjdGl2aXR5IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLlRyYW5zbHVjZW50IgotICAgICAgICAvPgotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuRGlzbWlzc0tleWd1YXJkQWN0aXZpdHkiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIgotICAgICAgICAvPgotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuRGlzbWlzc0tleWd1YXJkTWV0aG9kQWN0aXZpdHkiCi0gICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIgotICAgICAgICAvPgotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuV2FsbHBhcGVyQWN0aXZpdHkiCi0gICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQHN0eWxlL1dhbGxwYXBlclRoZW1lIgotICAgICAgICAvPgotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuS2V5Z3VhcmRMb2NrQWN0aXZpdHkiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIgotICAgICAgICAvPgotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuTG9nQ29uZmlndXJhdGlvbkFjdGl2aXR5IgotICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6Y29uZmlnQ2hhbmdlcz0ib3JpZW50YXRpb258c2NyZWVuU2l6ZXxzbWFsbGVzdFNjcmVlblNpemV8c2NyZWVuTGF5b3V0IgotICAgICAgICAvPgotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuUG9ydHJhaXRPcmllbnRhdGlvbkFjdGl2aXR5IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2NyZWVuT3JpZW50YXRpb249InBvcnRyYWl0IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpkb2N1bWVudExhdW5jaE1vZGU9ImFsd2F5cyIKLSAgICAgICAgLz4KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLkxhbmRzY2FwZU9yaWVudGF0aW9uQWN0aXZpdHkiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzY3JlZW5PcmllbnRhdGlvbj0ibGFuZHNjYXBlIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpkb2N1bWVudExhdW5jaE1vZGU9ImFsd2F5cyIKLSAgICAgICAgLz4KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLk1vdmVUYXNrVG9CYWNrQWN0aXZpdHkiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXVuY2hNb2RlPSJzaW5nbGVJbnN0YW5jZSIKLSAgICAgICAgLz4KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLkZpbmlzaGFibGVBY3Rpdml0eSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiCi0gICAgICAgIC8+Ci0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5OaWdodE1vZGVBY3Rpdml0eSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmNvbmZpZ0NoYW5nZXM9InVpTW9kZSIKLSAgICAgICAgLz4KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLkZvbnRTY2FsZUFjdGl2aXR5IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIKLSAgICAgICAgLz4KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLkZvbnRTY2FsZU5vUmVsYXVuY2hBY3Rpdml0eSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmNvbmZpZ0NoYW5nZXM9ImZvbnRTY2FsZSIKLSAgICAgICAgLz4KLSAgICAgICAgPHJlY2VpdmVyCi0gICAgICAgICAgICBhbmRyb2lkOm5hbWU9Ii5MYXVuY2hCcm9hZGNhc3RSZWNlaXZlciIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZW5hYmxlZD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiID4KLSAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgotICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnNlcnZlci5jdHMuTEFVTkNIX0JST0FEQ0FTVF9BQ1RJT04iLz4KLSAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KLSAgICAgICAgPC9yZWNlaXZlcj4KLQotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuQXNzaXN0YW50QWN0aXZpdHkiCi0gICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDpzY3JlZW5PcmllbnRhdGlvbj0ibG9ja2VkIiAvPgotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuVHJhbnNsdWNlbnRBc3Npc3RhbnRBY3Rpdml0eSIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAc3R5bGUvVGhlbWUuVHJhbnNwYXJlbnQiIC8+Ci0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5MYXVuY2hBc3Npc3RhbnRBY3Rpdml0eUZyb21TZXNzaW9uIgotICAgICAgICAgICAgYW5kcm9pZDp0YXNrQWZmaW5pdHk9Im5vYm9keS5idXQuTGF1bmNoQXNzaXN0YW50QWN0aXZpdHlGcm9tU2Vzc2lvbiIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiIC8+Ci0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5MYXVuY2hBc3Npc3RhbnRBY3Rpdml0eUludG9Bc3Npc3RhbnRTdGFjayIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGFza0FmZmluaXR5PSJub2JvZHkuYnV0LkxhdW5jaEFzc2lzdGFudEFjdGl2aXR5SW50b0Fzc2lzdGFudFN0YWNrIgotICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIgLz4KLQotICAgICAgICA8c2VydmljZSBhbmRyb2lkOm5hbWU9Ii5Bc3Npc3RhbnRWb2ljZUludGVyYWN0aW9uU2VydmljZSIKLSAgICAgICAgICAgICAgICAgYW5kcm9pZDpwZXJtaXNzaW9uPSJhbmRyb2lkLnBlcm1pc3Npb24uQklORF9WT0lDRV9JTlRFUkFDVElPTiIKLSAgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSI+Ci0gICAgICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC52b2ljZV9pbnRlcmFjdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpyZXNvdXJjZT0iQHhtbC9pbnRlcmFjdGlvbl9zZXJ2aWNlIiAvPgotICAgICAgICAgICAgPGludGVudC1maWx0ZXI+Ci0gICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc2VydmljZS52b2ljZS5Wb2ljZUludGVyYWN0aW9uU2VydmljZSIgLz4KLSAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KLSAgICAgICAgPC9zZXJ2aWNlPgotCi0gICAgICAgIDxzZXJ2aWNlIGFuZHJvaWQ6bmFtZT0iLkFzc2lzdGFudFZvaWNlSW50ZXJhY3Rpb25TZXNzaW9uU2VydmljZSIKLSAgICAgICAgICAgICAgICAgYW5kcm9pZDpwZXJtaXNzaW9uPSJhbmRyb2lkLnBlcm1pc3Npb24uQklORF9WT0lDRV9JTlRFUkFDVElPTiIKLSAgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIgLz4KLQotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuU3BsYXNoc2NyZWVuQWN0aXZpdHkiCi0gICAgICAgICAgICBhbmRyb2lkOnRhc2tBZmZpbml0eT0ibm9ib2R5LmJ1dC5TcGxhc2hzY3JlZW5BY3Rpdml0eSIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBzdHlsZS9TcGxhc2hzY3JlZW5UaGVtZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiIC8+Ci0KLQotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuU3dpcGVSZWZyZXNoQWN0aXZpdHkiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIiAvPgotCi0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5Ob0hpc3RvcnlBY3Rpdml0eSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bm9IaXN0b3J5PSJ0cnVlIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIgLz4KLQotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuU2hvd1doZW5Mb2NrZWRBdHRyQWN0aXZpdHkiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnNob3dXaGVuTG9ja2VkPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIgLz4KLQotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuU2hvd1doZW5Mb2NrZWRBdHRyUmVtb3ZlQXR0ckFjdGl2aXR5IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzaG93V2hlbkxvY2tlZD0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiIC8+Ci0KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLlNob3dXaGVuTG9ja2VkQXR0cldpdGhEaWFsb2dBY3Rpdml0eSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2hvd1doZW5Mb2NrZWQ9InRydWUiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIiAvPgotCi0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5UdXJuU2NyZWVuT25BdHRyQWN0aXZpdHkiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnR1cm5TY3JlZW5Pbj0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiIC8+Ci0KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLlR1cm5TY3JlZW5PblNob3dPbkxvY2tBY3Rpdml0eSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2hvd1doZW5Mb2NrZWQ9InRydWUiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnR1cm5TY3JlZW5Pbj0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiIC8+Ci0KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLlR1cm5TY3JlZW5PbkF0dHJSZW1vdmVBdHRyQWN0aXZpdHkiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnR1cm5TY3JlZW5Pbj0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2hvd1doZW5Mb2NrZWQ9InRydWUiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIiAvPgotCi0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5UdXJuU2NyZWVuT25TaW5nbGVUYXNrQWN0aXZpdHkiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnR1cm5TY3JlZW5Pbj0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2hvd1doZW5Mb2NrZWQ9InRydWUiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXVuY2hNb2RlPSJzaW5nbGVUYXNrIiAvPgotCi0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5UdXJuU2NyZWVuT25BdHRyRGlzbWlzc0tleWd1YXJkQWN0aXZpdHkiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnR1cm5TY3JlZW5Pbj0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiLz4KLQotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuVHVyblNjcmVlbk9uV2l0aFJlbGF5b3V0QWN0aXZpdHkiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIi8+Ci0KLSAgICAgICAgPHNlcnZpY2UgYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIudnIuTW9ja1ZyTGlzdGVuZXJTZXJ2aWNlIgotICAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIgotICAgICAgICAgICAgICAgICBhbmRyb2lkOmVuYWJsZWQ9InRydWUiCi0gICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGVybWlzc2lvbj0iYW5kcm9pZC5wZXJtaXNzaW9uLkJJTkRfVlJfTElTVEVORVJfU0VSVklDRSI+Ci0gICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgotICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc2VydmljZS52ci5Wckxpc3RlbmVyU2VydmljZSIgLz4KLSAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgotICAgICAgICA8L3NlcnZpY2U+Ci0gICAgPC9hcHBsaWNhdGlvbj4KLTwvbWFuaWZlc3Q+Ci0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvcmVzL2xheW91dC9yZXNpemVhYmxlX2FjdGl2aXR5LnhtbCBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvcmVzL2xheW91dC9yZXNpemVhYmxlX2FjdGl2aXR5LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU1MmU2MS4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3Jlcy9sYXlvdXQvcmVzaXplYWJsZV9hY3Rpdml0eS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLQotICB+IENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gIH4KLSAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCi0gIC0tPgotCi08YW5kcm9pZC5zZXJ2ZXIuY3RzLkxpZmVjeWNsZUxvZ1ZpZXcgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiPgotPC9hbmRyb2lkLnNlcnZlci5jdHMuTGlmZWN5Y2xlTG9nVmlldz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3Jlcy94bWwvaW50ZXJhY3Rpb25fc2VydmljZS54bWwgYi9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3Jlcy94bWwvaW50ZXJhY3Rpb25fc2VydmljZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZjkyYTAuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9yZXMveG1sL2ludGVyYWN0aW9uX3NlcnZpY2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHZvaWNlLWludGVyYWN0aW9uLXNlcnZpY2UgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6c2Vzc2lvblNlcnZpY2U9ImFuZHJvaWQuc2VydmVyLmN0cy5Bc3Npc3RhbnRWb2ljZUludGVyYWN0aW9uU2Vzc2lvblNlcnZpY2UiCi0gICAgYW5kcm9pZDpyZWNvZ25pdGlvblNlcnZpY2U9ImFuZHJvaWQuc2VydmVyLmN0cy5Bc3Npc3RhbnRWb2ljZUludGVyYWN0aW9uU2Vzc2lvblNlcnZpY2UiCi0gICAgYW5kcm9pZDpzdXBwb3J0c0Fzc2lzdD0idHJ1ZSIgLz4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9BYnN0cmFjdExpZmVjeWNsZUxvZ0FjdGl2aXR5LmphdmEgYi9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvQWJzdHJhY3RMaWZlY3ljbGVMb2dBY3Rpdml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDI5OTE3Li4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9BYnN0cmFjdExpZmVjeWNsZUxvZ0FjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnNlcnZlci5jdHM7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuRGlzcGxheTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TGlmZWN5Y2xlTG9nQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgaWNpY2xlKSB7Ci0gICAgICAgIHN1cGVyLm9uQ3JlYXRlKGljaWNsZSk7Ci0gICAgICAgIExvZy5pKGdldFRhZygpLCAib25DcmVhdGUiKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvblN0YXJ0KCkgewotICAgICAgICBzdXBlci5vblJlc3VtZSgpOwotICAgICAgICBMb2cuaShnZXRUYWcoKSwgIm9uU3RhcnQiKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKLSAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKLSAgICAgICAgTG9nLmkoZ2V0VGFnKCksICJvblJlc3VtZSIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQoQ29uZmlndXJhdGlvbiBuZXdDb25maWcpIHsKLSAgICAgICAgc3VwZXIub25Db25maWd1cmF0aW9uQ2hhbmdlZChuZXdDb25maWcpOwotICAgICAgICBMb2cuaShnZXRUYWcoKSwgIm9uQ29uZmlndXJhdGlvbkNoYW5nZWQiKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbk11bHRpV2luZG93TW9kZUNoYW5nZWQoYm9vbGVhbiBpc0luTXVsdGlXaW5kb3dNb2RlLCBDb25maWd1cmF0aW9uIG5ld0NvbmZpZykgewotICAgICAgICBzdXBlci5vbk11bHRpV2luZG93TW9kZUNoYW5nZWQoaXNJbk11bHRpV2luZG93TW9kZSwgbmV3Q29uZmlnKTsKLSAgICAgICAgTG9nLmkoZ2V0VGFnKCksICJvbk11bHRpV2luZG93TW9kZUNoYW5nZWQiKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblBpY3R1cmVJblBpY3R1cmVNb2RlQ2hhbmdlZChib29sZWFuIGlzSW5QaWN0dXJlSW5QaWN0dXJlTW9kZSwKLSAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gbmV3Q29uZmlnKSB7Ci0gICAgICAgIHN1cGVyLm9uUGljdHVyZUluUGljdHVyZU1vZGVDaGFuZ2VkKGlzSW5QaWN0dXJlSW5QaWN0dXJlTW9kZSwgbmV3Q29uZmlnKTsKLSAgICAgICAgTG9nLmkoZ2V0VGFnKCksICJvblBpY3R1cmVJblBpY3R1cmVNb2RlQ2hhbmdlZCIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uUGF1c2UoKSB7Ci0gICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKLSAgICAgICAgTG9nLmkoZ2V0VGFnKCksICJvblBhdXNlIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25TdG9wKCkgewotICAgICAgICBzdXBlci5vblN0b3AoKTsKLSAgICAgICAgTG9nLmkoZ2V0VGFnKCksICJvblN0b3AiKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkRlc3Ryb3koKSB7Ci0gICAgICAgIHN1cGVyLm9uRGVzdHJveSgpOwotICAgICAgICBMb2cuaShnZXRUYWcoKSwgIm9uRGVzdHJveSIpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0VGFnKCk7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkdW1wQ29uZmlndXJhdGlvbihDb25maWd1cmF0aW9uIGNvbmZpZykgewotICAgICAgICBMb2cuaShnZXRUYWcoKSwgIkNvbmZpZ3VyYXRpb246ICIgKyBjb25maWcpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGR1bXBEaXNwbGF5U2l6ZShDb25maWd1cmF0aW9uIGNvbmZpZykgewotICAgICAgICAvLyBEdW1wIHRoZSBkaXNwbGF5IHNpemUgYXMgc2VlbiBieSB0aGlzIEFjdGl2aXR5LgotICAgICAgICBmaW5hbCBXaW5kb3dNYW5hZ2VyIHdtID0gZ2V0U3lzdGVtU2VydmljZShXaW5kb3dNYW5hZ2VyLmNsYXNzKTsKLSAgICAgICAgZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gd20uZ2V0RGVmYXVsdERpc3BsYXkoKTsKLSAgICAgICAgZmluYWwgUG9pbnQgcG9pbnQgPSBuZXcgUG9pbnQoKTsKLSAgICAgICAgZGlzcGxheS5nZXRTaXplKHBvaW50KTsKLSAgICAgICAgZmluYWwgRGlzcGxheU1ldHJpY3MgbWV0cmljcyA9IGdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCk7Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIGxpbmUgPSAiY29uZmlnIgotICAgICAgICAgICAgICAgICsgIiBzaXplPSIgKyBidWlsZENvb3JkU3RyaW5nKGNvbmZpZy5zY3JlZW5XaWR0aERwLCBjb25maWcuc2NyZWVuSGVpZ2h0RHApCi0gICAgICAgICAgICAgICAgKyAiIGRpc3BsYXlTaXplPSIgKyBidWlsZENvb3JkU3RyaW5nKHBvaW50LngsIHBvaW50LnkpCi0gICAgICAgICAgICAgICAgKyAiIG1ldHJpY3NTaXplPSIgKyBidWlsZENvb3JkU3RyaW5nKG1ldHJpY3Mud2lkdGhQaXhlbHMsIG1ldHJpY3MuaGVpZ2h0UGl4ZWxzKQotICAgICAgICAgICAgICAgICsgIiBzbWFsbGVzdFNjcmVlbldpZHRoPSIgKyBjb25maWcuc21hbGxlc3RTY3JlZW5XaWR0aERwCi0gICAgICAgICAgICAgICAgKyAiIGRlbnNpdHlEcGk9IiArIGNvbmZpZy5kZW5zaXR5RHBpCi0gICAgICAgICAgICAgICAgKyAiIG9yaWVudGF0aW9uPSIgKyBjb25maWcub3JpZW50YXRpb247Ci0KLSAgICAgICAgTG9nLmkoZ2V0VGFnKCksIGxpbmUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGJ1aWxkQ29vcmRTdHJpbmcoaW50IHgsIGludCB5KSB7Ci0gICAgICAgIHJldHVybiAiKCIgKyB4ICsgIiwiICsgeSArICIpIjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvQWx0TGF1bmNoaW5nQWN0aXZpdHkuamF2YSBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9BbHRMYXVuY2hpbmdBY3Rpdml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmY4NDdlLi4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9BbHRMYXVuY2hpbmdBY3Rpdml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnNlcnZlci5jdHM7Ci0KLS8qKgotICogQW4gYWRkaXRpb25hbCBsYXVuY2hpbmcgYWN0aXZpdHkgdXNlZCBmb3IgYWx0ZXJuYXRpbmcgYmV0d2VlbiB0d28gYWN0aXZpdGllcy4KLSAqLwotcHVibGljIGNsYXNzIEFsdExhdW5jaGluZ0FjdGl2aXR5IGV4dGVuZHMgTGF1bmNoaW5nQWN0aXZpdHkgewotfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0Fsd2F5c0ZvY3VzYWJsZVBpcEFjdGl2aXR5LmphdmEgYi9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvQWx3YXlzRm9jdXNhYmxlUGlwQWN0aXZpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZjMDY2Ny4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvQWx3YXlzRm9jdXNhYmxlUGlwQWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuY3RzOwotCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5JbnRlbnQuRkxBR19BQ1RJVklUWV9DTEVBUl9UQVNLOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0s7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU9wdGlvbnM7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwotCi1wdWJsaWMgY2xhc3MgQWx3YXlzRm9jdXNhYmxlUGlwQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7Ci0KLSAgICBzdGF0aWMgdm9pZCBsYXVuY2hBbHdheXNGb2N1c2FibGVQaXBBY3Rpdml0eShBY3Rpdml0eSBjYWxsZXIsIGJvb2xlYW4gbmV3VGFzaykgewotICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChjYWxsZXIsIEFsd2F5c0ZvY3VzYWJsZVBpcEFjdGl2aXR5LmNsYXNzKTsKLQotICAgICAgICBpbnRlbnQuc2V0RmxhZ3MoRkxBR19BQ1RJVklUWV9DTEVBUl9UQVNLKTsKLSAgICAgICAgaWYgKG5ld1Rhc2spIHsKLSAgICAgICAgICAgIGludGVudC5hZGRGbGFncyhGTEFHX0FDVElWSVRZX05FV19UQVNLKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIEFjdGl2aXR5T3B0aW9ucyBvcHRpb25zID0gQWN0aXZpdHlPcHRpb25zLm1ha2VCYXNpYygpOwotICAgICAgICBvcHRpb25zLnNldExhdW5jaEJvdW5kcyhuZXcgUmVjdCgwLCAwLCA1MDAsIDUwMCkpOwotICAgICAgICBvcHRpb25zLnNldExhdW5jaFN0YWNrSWQoNCAvKiBBY3Rpdml0eU1hbmFnZXIuU3RhY2tJZC5QSU5ORURfU1RBQ0tfSUQgKi8pOwotICAgICAgICBjYWxsZXIuc3RhcnRBY3Rpdml0eShpbnRlbnQsIG9wdGlvbnMudG9CdW5kbGUoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0FuaW1hdGlvblRlc3RBY3Rpdml0eS5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0FuaW1hdGlvblRlc3RBY3Rpdml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWU5MjNlLi4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9BbmltYXRpb25UZXN0QWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuc2VydmVyLmN0czsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotCi1wdWJsaWMgY2xhc3MgQW5pbWF0aW9uVGVzdEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7Ci0gICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7Ci0gICAgICAgIG92ZXJyaWRlUGVuZGluZ1RyYW5zaXRpb24oUi5hbmltLmFuaW1hdGlvbl93aXRoX2JhY2tncm91bmQsIC0xKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvQXNzaXN0YW50QWN0aXZpdHkuamF2YSBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9Bc3Npc3RhbnRBY3Rpdml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGYyOTBmLi4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9Bc3Npc3RhbnRBY3Rpdml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnNlcnZlci5jdHM7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LkludGVudC5GTEFHX0FDVElWSVRZX0NMRUFSX1RBU0s7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5JbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSzsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5T3B0aW9uczsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgQXNzaXN0YW50QWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7Ci0KLSAgICAvLyBMYXVuY2hlcyB0aGUgZ2l2ZW4gYWN0aXZpdHkgaW4gb25SZXN1bWUKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9MQVVOQ0hfTkVXX1RBU0sgPSAibGF1bmNoX25ld190YXNrIjsKLSAgICAvLyBGaW5pc2hlcyB0aGlzIGFjdGl2aXR5IGluIG9uUmVzdW1lLCB0aGlzIGhhcHBlbnMgYWZ0ZXIgRVhUUkFfTEFVTkNIX05FV19UQVNLCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfRklOSVNIX1NFTEYgPSAiZmluaXNoX3NlbGYiOwotICAgIC8vIEF0dGVtcHRzIHRvIGVudGVyIHBpY3R1cmUtaW4tcGljdHVyZSBpbiBvblJlc3VtZQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0VOVEVSX1BJUCA9ICJlbnRlcl9waXAiOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwotCi0gICAgICAgIC8vIFNldCB0aGUgbGF5b3V0Ci0gICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmFzc2lzdGFudCk7Ci0KLSAgICAgICAgLy8gTGF1bmNoIHRoZSBuZXcgYWN0aXZpdHkgaWYgcmVxdWVzdGVkCi0gICAgICAgIGlmIChnZXRJbnRlbnQoKS5oYXNFeHRyYShFWFRSQV9MQVVOQ0hfTkVXX1RBU0spKSB7Ci0gICAgICAgICAgICBJbnRlbnQgaSA9IG5ldyBJbnRlbnQoKTsKLSAgICAgICAgICAgIGkuc2V0Q29tcG9uZW50KG5ldyBDb21wb25lbnROYW1lKHRoaXMsIGdldFBhY2thZ2VOYW1lKCkgKyAiLiIKLSAgICAgICAgICAgICAgICAgICAgKyBnZXRJbnRlbnQoKS5nZXRTdHJpbmdFeHRyYShFWFRSQV9MQVVOQ0hfTkVXX1RBU0spKSk7Ci0gICAgICAgICAgICBpLnNldEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLIHwgSW50ZW50LkZMQUdfQUNUSVZJVFlfQ0xFQVJfVEFTSyk7Ci0gICAgICAgICAgICBzdGFydEFjdGl2aXR5KGkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRW50ZXIgcGlwIGlmIHJlcXVlc3RlZAotICAgICAgICBpZiAoZ2V0SW50ZW50KCkuaGFzRXh0cmEoRVhUUkFfRU5URVJfUElQKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBlbnRlclBpY3R1cmVJblBpY3R1cmVNb2RlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGZpbmlzaCgpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEZpbmlzaCB0aGlzIGFjdGl2aXR5IGlmIHJlcXVlc3RlZAotICAgICAgICBpZiAoZ2V0SW50ZW50KCkuaGFzRXh0cmEoRVhUUkFfRklOSVNIX1NFTEYpKSB7Ci0gICAgICAgICAgICBmaW5pc2goKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIExhdW5jaGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBBc3Npc3RhbnRBY3Rpdml0eSBkaXJlY3RseSBpbnRvIHRoZSBhc3Npc3RhbnQgc3RhY2suCi0gICAgICovCi0gICAgc3RhdGljIHZvaWQgbGF1bmNoQWN0aXZpdHlJbnRvQXNzaXN0YW50U3RhY2soQWN0aXZpdHkgY2FsbGVyLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KGNhbGxlciwgQXNzaXN0YW50QWN0aXZpdHkuY2xhc3MpOwotICAgICAgICBpbnRlbnQuc2V0RmxhZ3MoRkxBR19BQ1RJVklUWV9DTEVBUl9UQVNLIHwgRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7Ci0gICAgICAgIGlmIChleHRyYXMgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhcyhleHRyYXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgQWN0aXZpdHlPcHRpb25zIG9wdGlvbnMgPSBBY3Rpdml0eU9wdGlvbnMubWFrZUJhc2ljKCk7Ci0gICAgICAgIG9wdGlvbnMuc2V0TGF1bmNoU3RhY2tJZCg2IC8qIEFjdGl2aXR5TWFuYWdlci5TdGFja0lkLkFTU0lTVEFOVF9TVEFDS19JRCAqLyk7Ci0gICAgICAgIGNhbGxlci5zdGFydEFjdGl2aXR5KGludGVudCwgb3B0aW9ucy50b0J1bmRsZSgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvQXNzaXN0YW50Vm9pY2VJbnRlcmFjdGlvblNlcnZpY2UuamF2YSBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9Bc3Npc3RhbnRWb2ljZUludGVyYWN0aW9uU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MzdhNDNjLi4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9Bc3Npc3RhbnRWb2ljZUludGVyYWN0aW9uU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnNlcnZlci5jdHM7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQuc2VydmljZS52b2ljZS5Wb2ljZUludGVyYWN0aW9uU2VydmljZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1wdWJsaWMgY2xhc3MgQXNzaXN0YW50Vm9pY2VJbnRlcmFjdGlvblNlcnZpY2UgZXh0ZW5kcyBWb2ljZUludGVyYWN0aW9uU2VydmljZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gQXNzaXN0YW50Vm9pY2VJbnRlcmFjdGlvblNlcnZpY2UuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1SZWFkeTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBtU3RhcnRlZDsKLSAgICBwcml2YXRlIEJ1bmRsZSBtRXh0cmFzOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25SZWFkeSgpIHsKLSAgICAgICAgc3VwZXIub25SZWFkeSgpOwotICAgICAgICBtUmVhZHkgPSB0cnVlOwotICAgICAgICBzaG93U2Vzc2lvbklmUmVhZHkoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IG9uU3RhcnRDb21tYW5kKEludGVudCBpbnRlbnQsIGludCBmbGFncywgaW50IHN0YXJ0SWQpIHsKLSAgICAgICAgaWYgKCFpc0FjdGl2ZVNlcnZpY2UodGhpcywgbmV3IENvbXBvbmVudE5hbWUodGhpcywgZ2V0Q2xhc3MoKSkpKSB7Ci0gICAgICAgICAgICBMb2cud3RmKFRBRywgIioqKiogTm90IHN0YXJ0aW5nIEFzc2lzdGFudFZvaWNlSW50ZXJhY3Rpb25TZXJ2aWNlIGJlY2F1c2UiICsKLSAgICAgICAgICAgICAgICAgICAgIiBpdCBpcyBub3Qgc2V0IGFzIHRoZSBjdXJyZW50IHZvaWNlIGludGVyYWN0aW9uIHNlcnZpY2UiKTsKLSAgICAgICAgICAgIHN0b3BTZWxmKCk7Ci0gICAgICAgICAgICByZXR1cm4gU1RBUlRfTk9UX1NUSUNLWTsKLSAgICAgICAgfQotICAgICAgICBtRXh0cmFzID0gaW50ZW50LmdldEV4dHJhcygpICE9IG51bGwgPyBpbnRlbnQuZ2V0RXh0cmFzKCkgOiBuZXcgQnVuZGxlKCk7Ci0gICAgICAgIG1TdGFydGVkID0gdHJ1ZTsKLSAgICAgICAgc2hvd1Nlc3Npb25JZlJlYWR5KCk7Ci0gICAgICAgIHJldHVybiBTVEFSVF9OT1RfU1RJQ0tZOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzaG93U2Vzc2lvbklmUmVhZHkoKSB7Ci0gICAgICAgIGlmIChtUmVhZHkgJiYgbVN0YXJ0ZWQpIHsKLSAgICAgICAgICAgIHNob3dTZXNzaW9uKG1FeHRyYXMsIDApOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIC8qKgotICAgICAqIFN0YXJ0cyB0aGUgYXNzaXN0YW50IHZvaWNlIGludGVyYWN0aW9uIHNlcnZpY2UsIHdoaWNoIGluaXRpYXRlcyBhIG5ldyBzZXNzaW9uIHRoYXQgc3RhcnRzCi0gICAgICogdGhlIGFzc2lzdGFudCBhY3Rpdml0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbGF1bmNoQXNzaXN0YW50QWN0aXZpdHkoQ29udGV4dCBjb250ZXh0LCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIEludGVudCBpID0gbmV3IEludGVudChjb250ZXh0LCBBc3Npc3RhbnRWb2ljZUludGVyYWN0aW9uU2VydmljZS5jbGFzcyk7Ci0gICAgICAgIGlmIChleHRyYXMgIT0gbnVsbCkgewotICAgICAgICAgICAgaS5wdXRFeHRyYXMoZXh0cmFzKTsKLSAgICAgICAgfQotICAgICAgICBjb250ZXh0LnN0YXJ0U2VydmljZShpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvQXNzaXN0YW50Vm9pY2VJbnRlcmFjdGlvblNlc3Npb25TZXJ2aWNlLmphdmEgYi9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvQXNzaXN0YW50Vm9pY2VJbnRlcmFjdGlvblNlc3Npb25TZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MTFhYzQuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0Fzc2lzdGFudFZvaWNlSW50ZXJhY3Rpb25TZXNzaW9uU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnNlcnZlci5jdHM7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQuc2VydmljZS52b2ljZS5Wb2ljZUludGVyYWN0aW9uU2Vzc2lvbjsKLWltcG9ydCBhbmRyb2lkLnNlcnZpY2Uudm9pY2UuVm9pY2VJbnRlcmFjdGlvblNlc3Npb25TZXJ2aWNlOwotCi1wdWJsaWMgY2xhc3MgQXNzaXN0YW50Vm9pY2VJbnRlcmFjdGlvblNlc3Npb25TZXJ2aWNlIGV4dGVuZHMgVm9pY2VJbnRlcmFjdGlvblNlc3Npb25TZXJ2aWNlIHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBWb2ljZUludGVyYWN0aW9uU2Vzc2lvbiBvbk5ld1Nlc3Npb24oQnVuZGxlIGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBWb2ljZUludGVyYWN0aW9uU2Vzc2lvbih0aGlzKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUHJlcGFyZVNob3coQnVuZGxlIGFyZ3MsIGludCBzaG93RmxhZ3MpIHsKLSAgICAgICAgICAgICAgICBzZXRVaUVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU2hvdyhCdW5kbGUgYXJncywgaW50IHNob3dGbGFncykgewotICAgICAgICAgICAgICAgIEludGVudCBpID0gbmV3IEludGVudChBc3Npc3RhbnRWb2ljZUludGVyYWN0aW9uU2Vzc2lvblNlcnZpY2UudGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgIEFzc2lzdGFudEFjdGl2aXR5LmNsYXNzKTsKLSAgICAgICAgICAgICAgICBpZiAoYXJncyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGkucHV0RXh0cmFzKGFyZ3MpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdGFydEFzc2lzdGFudEFjdGl2aXR5KGkpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9Cb3R0b21BY3Rpdml0eS5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0JvdHRvbUFjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4YTcxZjEuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0JvdHRvbUFjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuY3RzOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBCb3R0b21BY3Rpdml0eSBleHRlbmRzIEFic3RyYWN0TGlmZWN5Y2xlTG9nQWN0aXZpdHkgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IEJvdHRvbUFjdGl2aXR5LmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKLQotICAgIHByaXZhdGUgaW50IG1TdG9wRGVsYXk7Ci0gICAgcHJpdmF0ZSBWaWV3IG1GbG9hdGluZ1dpbmRvdzsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VGFnKCkgewotICAgICAgICByZXR1cm4gVEFHOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLQotICAgICAgICBmaW5hbCBib29sZWFuIHVzZVdhbGxwYXBlciA9IGdldEludGVudCgpLmdldEJvb2xlYW5FeHRyYSgiVVNFX1dBTExQQVBFUiIsIGZhbHNlKTsKLSAgICAgICAgaWYgKHVzZVdhbGxwYXBlcikgewotICAgICAgICAgICAgc2V0VGhlbWUoUi5zdHlsZS5XYWxscGFwZXJUaGVtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQubWFpbik7Ci0KLSAgICAgICAgLy8gRGVsYXllZCBzdG9wIGlzIGZvciBzaW11bGF0aW5nIGEgY2FzZSB3aGVyZSByZXN1bWUgaGFwcGVucyBiZWZvcmUKLSAgICAgICAgLy8gYWN0aXZpdHlTdG9wcGVkKCkgaXMgcmVjZWl2ZWQgYnkgQU0sIGFuZCB0aGUgdHJhbnNpdGlvbiBzdGFydHMgd2l0aG91dAotICAgICAgICAvLyBnb2luZyB0aHJvdWdoIGZ1bGx5IHN0b3BwZWQgc3RhdGUgKHNlZSBiLzMwMjU1MzU0KS4KLSAgICAgICAgLy8gSWYgZW5hYmxlZCwgd2Ugc3RhbGwgb25TdG9wKCkgb2YgQm90dG9tQWN0aXZpdHksIG9wZW4gVG9wQWN0aXZpdHkgYnV0IG1ha2UKLSAgICAgICAgLy8gaXQgZmluaXNoIGJlZm9yZSBvblN0b3AoKSBlbmRzLiBUaGlzIHdpbGwgY2F1c2UgQm90dG9tQWN0aXZpdHkgdG8gcmVzdW1lIGJlZm9yZQotICAgICAgICAvLyBpdCBub3RpZmllcyBBTSBvZiBhY3Rpdml0eVN0b3BwZWQoKS4gV2UgYWxzbyBhZGQgYSBzZWNvbmQgd2luZG93IG9mCi0gICAgICAgIC8vIFRZUEVfQkFTRV9BUFBMSUNBVElPTiwgc28gdGhhdCB0aGUgdHJhbnNpdGlvbiBhbmltYXRpb24gY291bGQgc3RhcnQgZWFybGllci4KLSAgICAgICAgLy8gT3RoZXJ3aXNlIHRoZSBtYWluIHdpbmRvdyBoYXMgdG8gcmVsYXlvdXQgdG8gdmlzaWJsZSBmaXJzdCBhbmQgdGhlIGVycm9yIHdvbid0IG9jY3VyLgotICAgICAgICAvLyBOb3RlIHRoYXQgaWYgdGhlIHRlc3QgZmFpbHMsIHdlIHNob3VsZG4ndCB0cnkgdG8gY2hhbmdlIHRoZSBhcHAgaGVyZSB0byBtYWtlCi0gICAgICAgIC8vIGl0IHBhc3MuIFRoZSB0ZXN0IGFwcCBpcyBhcnRpZmljaWFsbHkgbWFkZSB0byBzaW11bGF0ZSBhbiBmYWlsdXJlIGNhc2UsIGJ1dAotICAgICAgICAvLyBpdCdzIG5vdCBkb2luZyBhbnl0aGluZyB3cm9uZy4KLSAgICAgICAgbVN0b3BEZWxheSA9IGdldEludGVudCgpLmdldEludEV4dHJhKCJTVE9QX0RFTEFZIiwgMCk7Ci0gICAgICAgIGlmIChtU3RvcERlbGF5ID4gMCkgewotICAgICAgICAgICAgTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIgPSBnZXRMYXlvdXRJbmZsYXRlcigpOwotICAgICAgICAgICAgbUZsb2F0aW5nV2luZG93ID0gaW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC5mbG9hdGluZywgbnVsbCk7Ci0KLSAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIHBhcmFtcyA9IG5ldyBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcygpOwotICAgICAgICAgICAgcGFyYW1zLmhlaWdodCA9IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVDsKLSAgICAgICAgICAgIHBhcmFtcy53aWR0aCA9IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVDsKLSAgICAgICAgICAgIHBhcmFtcy50eXBlID0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9CQVNFX0FQUExJQ0FUSU9OOwotICAgICAgICAgICAgcGFyYW1zLnNldFRpdGxlKCJGbG9hdGluZyIpOwotICAgICAgICAgICAgZ2V0V2luZG93TWFuYWdlcigpLmFkZFZpZXcobUZsb2F0aW5nV2luZG93LCBwYXJhbXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25SZXN1bWUoKSB7Ci0gICAgICAgIExvZy5kKFRBRywgIm9uUmVzdW1lKCkgRSIpOwotICAgICAgICBzdXBlci5vblJlc3VtZSgpOwotCi0gICAgICAgIGlmIChtU3RvcERlbGF5ID4gMCkgewotICAgICAgICAgICAgLy8gUmVmcmVzaCBmbG9hdGluZyB3aW5kb3cKLSAgICAgICAgICAgIExvZy5kKFRBRywgIlNjaGV1bGluZyBpbnZhbGlkYXRlIEZsb2F0aW5nIFdpbmRvdyBpbiBvblJlc3VtZSgpIik7Ci0gICAgICAgICAgICBtRmxvYXRpbmdXaW5kb3cuaW52YWxpZGF0ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgTG9nLmQoVEFHLCAib25SZXN1bWUoKSBYIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25TdG9wKCkgewotICAgICAgICBzdXBlci5vblN0b3AoKTsKLQotICAgICAgICBpZiAobVN0b3BEZWxheSA+IDApIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU3RhbGxpbmcgb25TdG9wKCkgYnkgIiArIG1TdG9wRGVsYXkgKyAiIG1zLi4uIik7Ci0gICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKG1TdG9wRGVsYXkpOwotICAgICAgICAgICAgfSBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7fQotCi0gICAgICAgICAgICAvLyBSZWZyZXNoIGZsb2F0aW5nIHdpbmRvdwotICAgICAgICAgICAgTG9nLmQoVEFHLCAiU2NoZXVsaW5nIGludmFsaWRhdGUgRmxvYXRpbmcgV2luZG93IGluIG9uU3RvcCgpIik7Ci0gICAgICAgICAgICBtRmxvYXRpbmdXaW5kb3cuaW52YWxpZGF0ZSgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0JvdHRvbUxlZnRMYXlvdXRBY3Rpdml0eS5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0JvdHRvbUxlZnRMYXlvdXRBY3Rpdml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGUxY2RhLi4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9Cb3R0b21MZWZ0TGF5b3V0QWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuc2VydmVyLmN0czsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotCi1wdWJsaWMgY2xhc3MgQm90dG9tTGVmdExheW91dEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgewotfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0JvdHRvbVJpZ2h0TGF5b3V0QWN0aXZpdHkuamF2YSBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9Cb3R0b21SaWdodExheW91dEFjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ZmEyZmMuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0JvdHRvbVJpZ2h0TGF5b3V0QWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuc2VydmVyLmN0czsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotCi1wdWJsaWMgY2xhc3MgQm90dG9tUmlnaHRMYXlvdXRBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9Ccm9hZGNhc3RSZWNlaXZlckFjdGl2aXR5LmphdmEgYi9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvQnJvYWRjYXN0UmVjZWl2ZXJBY3Rpdml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjRmNjliLi4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9Ccm9hZGNhc3RSZWNlaXZlckFjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnNlcnZlci5jdHM7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LlZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19ESVNNSVNTX0tFWUdVQVJEOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuS2V5Z3VhcmRNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5zZXJ2ZXIuY3RzLnRvb2xzLkFjdGl2aXR5TGF1bmNoZXI7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd0luc2V0czsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotLyoqCi0gKiBBY3Rpdml0eSB0aGF0IHJlZ2lzdGVycyBicm9hZGNhc3QgcmVjZWl2ZXIgLgotICovCi1wdWJsaWMgY2xhc3MgQnJvYWRjYXN0UmVjZWl2ZXJBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9UUklHR0VSX0JST0FEQ0FTVCA9ICJ0cmlnZ2VyX2Jyb2FkY2FzdCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IEJyb2FkY2FzdFJlY2VpdmVyQWN0aXZpdHkuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOwotCi0gICAgcHJpdmF0ZSBUZXN0QnJvYWRjYXN0UmVjZWl2ZXIgbUJyb2FkY2FzdFJlY2VpdmVyID0gbmV3IFRlc3RCcm9hZGNhc3RSZWNlaXZlcigpOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOwotCi0gICAgICAgIEludGVudEZpbHRlciBicm9hZGNhc3RGaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKEFDVElPTl9UUklHR0VSX0JST0FEQ0FTVCk7Ci0KLSAgICAgICAgcmVnaXN0ZXJSZWNlaXZlcihtQnJvYWRjYXN0UmVjZWl2ZXIsIGJyb2FkY2FzdEZpbHRlcik7Ci0KLSAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIGEgZGlzcGxheSBjdXRvdXQgaXMgcHJlc2VudAotICAgICAgICBmaW5hbCBWaWV3IHZpZXcgPSBuZXcgVmlldyh0aGlzKTsKLSAgICAgICAgZ2V0V2luZG93KCkucmVxdWVzdEZlYXR1cmUoV2luZG93LkZFQVRVUkVfTk9fVElUTEUpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgRmllbGQgZmllbGQgPSBnZXRXaW5kb3coKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0Q2xhc3MoKS5nZXRGaWVsZCgKLSAgICAgICAgICAgICAgICAibGF5b3V0SW5EaXNwbGF5Q3V0b3V0TW9kZSIpOwotICAgICAgICAgICAgZmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLSAgICAgICAgICAgIGZpZWxkLnNldEludChnZXRXaW5kb3coKS5nZXRBdHRyaWJ1dGVzKCksCi0gICAgICAgICAgICAgICAgMSAvKiBMQVlPVVRfSU5fRElTUExBWV9DVVRPVVRfTU9ERV9TSE9SVF9FREdFUyAqLyk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHZpZXcuc2V0TGF5b3V0UGFyYW1zKG5ldyBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zKE1BVENIX1BBUkVOVCwgTUFUQ0hfUEFSRU5UKSk7Ci0gICAgICAgIHZpZXcuc2V0U3lzdGVtVWlWaXNpYmlsaXR5KFZpZXcuU1lTVEVNX1VJX0ZMQUdfTEFZT1VUX0ZVTExTQ1JFRU4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVmlldy5TWVNURU1fVUlfRkxBR19MQVlPVVRfSElERV9OQVZJR0FUSU9OKTsKLSAgICAgICAgdmlldy5zZXRPbkFwcGx5V2luZG93SW5zZXRzTGlzdGVuZXIoKHYsIGluc2V0cykgLT4gewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBNZXRob2QgbWV0aG9kID0gV2luZG93SW5zZXRzLmNsYXNzLmdldERlY2xhcmVkTWV0aG9kKCJnZXREaXNwbGF5Q3V0b3V0Iik7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IGRpc3BsYXlDdXRvdXRJbnN0YW5jZSA9IG1ldGhvZC5pbnZva2UoaW5zZXRzKTsKLSAgICAgICAgICAgICAgICBMb2cuaShnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSwgImN1dG91dD0iICsgKGRpc3BsYXlDdXRvdXRJbnN0YW5jZSAhPSBudWxsKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gaW5zZXRzOwotICAgICAgICB9KTsKLSAgICAgICAgc2V0Q29udGVudFZpZXcodmlldyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25EZXN0cm95KCkgewotICAgICAgICBzdXBlci5vbkRlc3Ryb3koKTsKLQotICAgICAgICB1bnJlZ2lzdGVyUmVjZWl2ZXIobUJyb2FkY2FzdFJlY2VpdmVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgY2xhc3MgVGVzdEJyb2FkY2FzdFJlY2VpdmVyIGV4dGVuZHMgQnJvYWRjYXN0UmVjZWl2ZXIgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgewotICAgICAgICAgICAgZmluYWwgQnVuZGxlIGV4dHJhcyA9IGludGVudC5nZXRFeHRyYXMoKTsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIm9uUmVjZWl2ZTogZXh0cmFzPSIgKyBleHRyYXMpOwotCi0gICAgICAgICAgICBpZiAoZXh0cmFzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZXh0cmFzLmdldEJvb2xlYW4oImZpbmlzaCIpKSB7Ci0gICAgICAgICAgICAgICAgZmluaXNoKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZXh0cmFzLmdldEJvb2xlYW4oIm1vdmVUb0JhY2siKSkgewotICAgICAgICAgICAgICAgIG1vdmVUYXNrVG9CYWNrKHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGV4dHJhcy5jb250YWluc0tleSgib3JpZW50YXRpb24iKSkgewotICAgICAgICAgICAgICAgIHNldFJlcXVlc3RlZE9yaWVudGF0aW9uKGV4dHJhcy5nZXRJbnQoIm9yaWVudGF0aW9uIikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGV4dHJhcy5nZXRCb29sZWFuKCJkaXNtaXNzS2V5Z3VhcmQiKSkgewotICAgICAgICAgICAgICAgIGdldFdpbmRvdygpLmFkZEZsYWdzKEZMQUdfRElTTUlTU19LRVlHVUFSRCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZXh0cmFzLmdldEJvb2xlYW4oImRpc21pc3NLZXlndWFyZE1ldGhvZCIpKSB7Ci0gICAgICAgICAgICAgICAgZ2V0U3lzdGVtU2VydmljZShLZXlndWFyZE1hbmFnZXIuY2xhc3MpLnJlcXVlc3REaXNtaXNzS2V5Z3VhcmQoCi0gICAgICAgICAgICAgICAgICAgICAgICBCcm9hZGNhc3RSZWNlaXZlckFjdGl2aXR5LnRoaXMsIG5ldyBLZXlndWFyZERpc21pc3NMb2dnZXJDYWxsYmFjayhjb250ZXh0KSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEFjdGl2aXR5TGF1bmNoZXIubGF1bmNoQWN0aXZpdHlGcm9tRXh0cmFzKEJyb2FkY2FzdFJlY2VpdmVyQWN0aXZpdHkudGhpcywgZXh0cmFzKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9EaWFsb2dXaGVuTGFyZ2VBY3Rpdml0eS5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0RpYWxvZ1doZW5MYXJnZUFjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzOWM2NDguLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0RpYWxvZ1doZW5MYXJnZUFjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuc2VydmVyLmN0czsKLQotLyoqCi0gKiBBY3Rpdml0eSB3aXRoIERpYWxvZ1doZW5MYXJnZSBUaGVtZS4KLSAqLwotcHVibGljIGNsYXNzIERpYWxvZ1doZW5MYXJnZUFjdGl2aXR5IGV4dGVuZHMgQWJzdHJhY3RMaWZlY3ljbGVMb2dBY3Rpdml0eSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IERpYWxvZ1doZW5MYXJnZUFjdGl2aXR5LmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFRhZygpIHsKLSAgICAgICAgcmV0dXJuIFRBRzsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvRGlzbWlzc0tleWd1YXJkQWN0aXZpdHkuamF2YSBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9EaXNtaXNzS2V5Z3VhcmRBY3Rpdml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjZhNzU2Li4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9EaXNtaXNzS2V5Z3VhcmRBY3Rpdml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnNlcnZlci5jdHM7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKLQotcHVibGljIGNsYXNzIERpc21pc3NLZXlndWFyZEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwotICAgICAgICBnZXRXaW5kb3coKS5hZGRGbGFncyhXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0RJU01JU1NfS0VZR1VBUkQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9EaXNtaXNzS2V5Z3VhcmRNZXRob2RBY3Rpdml0eS5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0Rpc21pc3NLZXlndWFyZE1ldGhvZEFjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MzNlYjIuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0Rpc21pc3NLZXlndWFyZE1ldGhvZEFjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuc2VydmVyLmN0czsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQuYXBwLktleWd1YXJkTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLQotcHVibGljIGNsYXNzIERpc21pc3NLZXlndWFyZE1ldGhvZEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwotICAgICAgICBnZXRTeXN0ZW1TZXJ2aWNlKEtleWd1YXJkTWFuYWdlci5jbGFzcykucmVxdWVzdERpc21pc3NLZXlndWFyZCh0aGlzLAotICAgICAgICAgICAgICAgIG5ldyBLZXlndWFyZERpc21pc3NMb2dnZXJDYWxsYmFjayh0aGlzKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0RvY2tlZEFjdGl2aXR5LmphdmEgYi9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvRG9ja2VkQWN0aXZpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA3ZGY1Zi4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvRG9ja2VkQWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuc2VydmVyLmN0czsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotCi1wdWJsaWMgY2xhc3MgRG9ja2VkQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7Ci19CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvRmluaXNoYWJsZUFjdGl2aXR5LmphdmEgYi9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvRmluaXNoYWJsZUFjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NGI5MzAuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0ZpbmlzaGFibGVBY3Rpdml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnNlcnZlci5jdHM7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotCi0vKioKLSAqIFRoaXMgYWN0aXZpdHkgZmluaXNoZXMgd2hlbiB5b3Ugc2VuZCBhIGJyb2FkY2FzdCB3aXRoIHRoZSBmb2xsb3dpbmcgYWN0aW9uIGZyb20gYWRiIHNoZWxsCi0gKiAgYW0gYnJvYWRjYXN0IC1hICdhbmRyb2lkLnNlcnZlci5jdHMuRmluaXNoYWJsZUFjdGl2aXR5LmZpbmlzaCcKLSAqLwotcHVibGljIGNsYXNzIEZpbmlzaGFibGVBY3Rpdml0eSBleHRlbmRzIEFic3RyYWN0TGlmZWN5Y2xlTG9nQWN0aXZpdHkgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IEZpbmlzaGFibGVBY3Rpdml0eS5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9GSU5JU0ggPSAiYW5kcm9pZC5zZXJ2ZXIuY3RzLkZpbmlzaGFibGVBY3Rpdml0eS5maW5pc2giOwotCi0gICAgcHJpdmF0ZSBCcm9hZGNhc3RSZWNlaXZlciBtUmVjZWl2ZXIgPSBuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgICAgICBpZiAoaW50ZW50ICE9IG51bGwgJiYgaW50ZW50LmdldEFjdGlvbigpLmVxdWFscyhBQ1RJT05fRklOSVNIKSkgewotICAgICAgICAgICAgICAgIGZpbmlzaCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLQotICAgICAgICBJbnRlbnRGaWx0ZXIgaW50ZW50RmlsdGVyID0gbmV3IEludGVudEZpbHRlcihBQ1RJT05fRklOSVNIKTsKLSAgICAgICAgcmVnaXN0ZXJSZWNlaXZlcihtUmVjZWl2ZXIsIGludGVudEZpbHRlcik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25EZXN0cm95KCkgewotICAgICAgICB1bnJlZ2lzdGVyUmVjZWl2ZXIobVJlY2VpdmVyKTsKLSAgICAgICAgc3VwZXIub25EZXN0cm95KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRUYWcoKSB7Ci0gICAgICAgIHJldHVybiBUQUc7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0ZvbnRTY2FsZUFjdGl2aXR5LmphdmEgYi9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvRm9udFNjYWxlQWN0aXZpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTViZGZmZS4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvRm9udFNjYWxlQWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAotICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkKLSAqIG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAotICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCi0gKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuY3RzOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlhtbFJlc291cmNlUGFyc2VyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOwotCi1pbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKLWltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIEZvbnRTY2FsZUFjdGl2aXR5IGV4dGVuZHMgQWJzdHJhY3RMaWZlY3ljbGVMb2dBY3Rpdml0eSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IEZvbnRTY2FsZUFjdGl2aXR5LmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKLSAgICAgICAgZHVtcEFjdGl2aXR5RHBpKCk7Ci0gICAgICAgIGR1bXBGb250U2l6ZSgpOwotICAgIH0KLQotICAgIC8vIFdlJ3JlIGJhc2ljYWxseSBlbnN1cmluZyB0aGF0IG5vIG1hdHRlciB3aGF0IGhhcHBlbnMgdG8gdGhlIHJlc291cmNlcyB1bmRlcm5lYXRoIHRoZQotICAgIC8vIEFjdGl2aXR5LCBhbnkgVHlwZWRBcnJheXMgb2J0YWluZWQgZnJvbSB0aGUgcG9vbCBoYXZlIHRoZSBjb3JyZWN0IERpc3BsYXlNZXRyaWNzLgotICAgIHByb3RlY3RlZCB2b2lkIGR1bXBGb250U2l6ZSgpIHsKLSAgICAgICAgdHJ5IChYbWxSZXNvdXJjZVBhcnNlciBwYXJzZXIgPSBnZXRSZXNvdXJjZXMoKS5nZXRYbWwoUi5sYXlvdXQuZm9udF9zY2FsZSkpIHsKLSAgICAgICAgICAgIC8vbm9pbnNwZWN0aW9uIFN0YXRlbWVudFdpdGhFbXB0eUJvZHkKLSAgICAgICAgICAgIHdoaWxlIChwYXJzZXIubmV4dCgpICE9IFhtbFB1bGxQYXJzZXIuU1RBUlRfVEFHKSB7IH0KLQotICAgICAgICAgICAgZmluYWwgQXR0cmlidXRlU2V0IGF0dHJzID0gWG1sLmFzQXR0cmlidXRlU2V0KHBhcnNlcik7Ci0gICAgICAgICAgICBUeXBlZEFycmF5IHRhID0gZ2V0VGhlbWUoKS5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKGF0dHJzLAotICAgICAgICAgICAgICAgICAgICBuZXcgaW50W10geyBhbmRyb2lkLlIuYXR0ci50ZXh0U2l6ZSB9LCAwLCAwKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGZvbnRQaXhlbFNpemUgPSB0YS5nZXREaW1lbnNpb25QaXhlbFNpemUoMCwgLTEpOwotICAgICAgICAgICAgICAgIGlmIChmb250UGl4ZWxTaXplID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiYW5kcm9pZDphdHRyL3RleHRTaXplIG5vdCBmb3VuZCIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIExvZy5pKGdldFRhZygpLCAiZm9udFBpeGVsU2l6ZT0iICsgZm9udFBpeGVsU2l6ZSk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHRhLnJlY3ljbGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB8IElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZHVtcEFjdGl2aXR5RHBpKCkgewotICAgICAgICBmaW5hbCBpbnQgZm9udEFjdGl2aXR5RHBpID0gZ2V0UmVzb3VyY2VzKCkuZ2V0RGlzcGxheU1ldHJpY3MoKS5kZW5zaXR5RHBpOwotICAgICAgICBMb2cuaShnZXRUYWcoKSwgImZvbnRBY3Rpdml0eURwaT0iICsgZm9udEFjdGl2aXR5RHBpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFRhZygpIHsKLSAgICAgICAgcmV0dXJuIFRBRzsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9Gb250U2NhbGVOb1JlbGF1bmNoQWN0aXZpdHkuamF2YSBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9Gb250U2NhbGVOb1JlbGF1bmNoQWN0aXZpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE3OGEwOC4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvRm9udFNjYWxlTm9SZWxhdW5jaEFjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKLSAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5Ci0gKiBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKLSAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQotICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQuc2VydmVyLmN0czsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKLQotcHVibGljIGNsYXNzIEZvbnRTY2FsZU5vUmVsYXVuY2hBY3Rpdml0eSBleHRlbmRzIEZvbnRTY2FsZUFjdGl2aXR5IHsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKENvbmZpZ3VyYXRpb24gbmV3Q29uZmlnKSB7Ci0gICAgICAgIHN1cGVyLm9uQ29uZmlndXJhdGlvbkNoYW5nZWQobmV3Q29uZmlnKTsKLSAgICAgICAgZHVtcEFjdGl2aXR5RHBpKCk7Ci0gICAgICAgIGR1bXBGb250U2l6ZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VGFnKCkgewotICAgICAgICByZXR1cm4gRm9udFNjYWxlTm9SZWxhdW5jaEFjdGl2aXR5LmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvRnJlZWZvcm1BY3Rpdml0eS5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0ZyZWVmb3JtQWN0aXZpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhjNmQwYy4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvRnJlZWZvcm1BY3Rpdml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnNlcnZlci5jdHM7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LkludGVudC5GTEFHX0FDVElWSVRZX0NMRUFSX1RBU0s7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5JbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSzsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5T3B0aW9uczsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKLQotcHVibGljIGNsYXNzIEZyZWVmb3JtQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblJlc3VtZSgpIHsKLSAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKLSAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQodGhpcywgVGVzdEFjdGl2aXR5LmNsYXNzKTsKLSAgICAgICAgaW50ZW50LnNldEZsYWdzKEZMQUdfQUNUSVZJVFlfQ0xFQVJfVEFTSyB8IEZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOwotCi0gICAgICAgIGZpbmFsIEFjdGl2aXR5T3B0aW9ucyBvcHRpb25zID0gQWN0aXZpdHlPcHRpb25zLm1ha2VCYXNpYygpOwotICAgICAgICBvcHRpb25zLnNldExhdW5jaEJvdW5kcyhuZXcgUmVjdCgwLCAwLCA5MDAsIDkwMCkpOwotICAgICAgICB0aGlzLnN0YXJ0QWN0aXZpdHkoaW50ZW50LCBvcHRpb25zLnRvQnVuZGxlKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9LZXlndWFyZERpc21pc3NMb2dnZXJDYWxsYmFjay5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0tleWd1YXJkRGlzbWlzc0xvZ2dlckNhbGxiYWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MGYyYWUuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0tleWd1YXJkRGlzbWlzc0xvZ2dlckNhbGxiYWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuc2VydmVyLmN0czsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLktleWd1YXJkTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLmFwcC5LZXlndWFyZE1hbmFnZXIuS2V5Z3VhcmREaXNtaXNzQ2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotcHVibGljIGNsYXNzIEtleWd1YXJkRGlzbWlzc0xvZ2dlckNhbGxiYWNrIGV4dGVuZHMgS2V5Z3VhcmREaXNtaXNzQ2FsbGJhY2sgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVEFHID0gIktleWd1YXJkRGlzbWlzc0xvZ2dlckNhbGxiYWNrIjsKLQotICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKLQotICAgIHB1YmxpYyBLZXlndWFyZERpc21pc3NMb2dnZXJDYWxsYmFjayhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uRGlzbWlzc0Vycm9yKCkgewotICAgICAgICBMb2cuaShUQUcsICJvbkRpc21pc3NFcnJvciIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uRGlzbWlzc1N1Y2NlZWRlZCgpIHsKLSAgICAgICAgaWYgKG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoS2V5Z3VhcmRNYW5hZ2VyLmNsYXNzKS5pc0RldmljZUxvY2tlZCgpKSB7Ci0gICAgICAgICAgICAvLyBEZXZpY2UgaXMgc3RpbGwgbG9ja2VkPyBXaGF0IGEgZmFpbC4gRG9uJ3QgcHJpbnQgIm9uRGlzbWlzc1N1Y2NlZGVkIiBzdWNoIHRoYXQgdGhlCi0gICAgICAgICAgICAvLyBsb2cgZmFpbHMuCi0gICAgICAgICAgICBMb2cuaShUQUcsICJkaXNtaXNzIHN1Y2NlZGRlZCB3YXMgY2FsbGVkIGJ1dCBkZXZpY2UgaXMgc3RpbGwgbG9ja2VkLiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLmkoVEFHLCAib25EaXNtaXNzU3VjY2VlZGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkRpc21pc3NDYW5jZWxsZWQoKSB7Ci0gICAgICAgIExvZy5pKFRBRywgIm9uRGlzbWlzc0NhbmNlbGxlZCIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9LZXlndWFyZExvY2tBY3Rpdml0eS5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0tleWd1YXJkTG9ja0FjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MmNmMDQuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0tleWd1YXJkTG9ja0FjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuc2VydmVyLmN0czsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLktleWd1YXJkTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLQotcHVibGljIGNsYXNzIEtleWd1YXJkTG9ja0FjdGl2aXR5IGV4dGVuZHMgQnJvYWRjYXN0UmVjZWl2ZXJBY3Rpdml0eSB7Ci0KLSAgICBwcml2YXRlIEtleWd1YXJkTWFuYWdlci5LZXlndWFyZExvY2sgbUtleWd1YXJkTG9jazsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLSAgICAgICAgbUtleWd1YXJkTG9jayA9IGdldFN5c3RlbVNlcnZpY2UoS2V5Z3VhcmRNYW5hZ2VyLmNsYXNzKS5uZXdLZXlndWFyZExvY2soInRlc3QiKTsKLSAgICAgICAgbUtleWd1YXJkTG9jay5kaXNhYmxlS2V5Z3VhcmQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkRlc3Ryb3koKSB7Ci0gICAgICAgIG1LZXlndWFyZExvY2sucmVlbmFibGVLZXlndWFyZCgpOwotICAgICAgICBzdXBlci5vbkRlc3Ryb3koKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvTGFuZHNjYXBlT3JpZW50YXRpb25BY3Rpdml0eS5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0xhbmRzY2FwZU9yaWVudGF0aW9uQWN0aXZpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZkNWFlZS4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvTGFuZHNjYXBlT3JpZW50YXRpb25BY3Rpdml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnNlcnZlci5jdHM7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBMYW5kc2NhcGVPcmllbnRhdGlvbkFjdGl2aXR5IGV4dGVuZHMgQWJzdHJhY3RMaWZlY3ljbGVMb2dBY3Rpdml0eSB7Ci0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRUYWcoKSB7Ci0gICAgICAgIHJldHVybiAiTGFuZHNjYXBlT3JpZW50YXRpb25BY3Rpdml0eSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7Ci0gICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7Ci0gICAgICAgIGZpbmFsIENvbmZpZ3VyYXRpb24gY29uZmlnID0gZ2V0UmVzb3VyY2VzKCkuZ2V0Q29uZmlndXJhdGlvbigpOwotICAgICAgICBkdW1wRGlzcGxheVNpemUoY29uZmlnKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKENvbmZpZ3VyYXRpb24gbmV3Q29uZmlnKSB7Ci0gICAgICAgIHN1cGVyLm9uQ29uZmlndXJhdGlvbkNoYW5nZWQobmV3Q29uZmlnKTsKLSAgICAgICAgZHVtcERpc3BsYXlTaXplKG5ld0NvbmZpZyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0xhdW5jaEFzc2lzdGFudEFjdGl2aXR5RnJvbVNlc3Npb24uamF2YSBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9MYXVuY2hBc3Npc3RhbnRBY3Rpdml0eUZyb21TZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNTYyZmYuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0xhdW5jaEFzc2lzdGFudEFjdGl2aXR5RnJvbVNlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuY3RzOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7Ci0KLXB1YmxpYyBjbGFzcyBMYXVuY2hBc3Npc3RhbnRBY3Rpdml0eUZyb21TZXNzaW9uIGV4dGVuZHMgQWN0aXZpdHkgewotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgewotICAgICAgICBzdXBlci5vblJlc3VtZSgpOwotICAgICAgICBBc3Npc3RhbnRWb2ljZUludGVyYWN0aW9uU2VydmljZS5sYXVuY2hBc3Npc3RhbnRBY3Rpdml0eSh0aGlzLCBnZXRJbnRlbnQoKS5nZXRFeHRyYXMoKSk7Ci0gICAgICAgIGZpbmlzaEFuZFJlbW92ZVRhc2soKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvTGF1bmNoQXNzaXN0YW50QWN0aXZpdHlJbnRvQXNzaXN0YW50U3RhY2suamF2YSBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9MYXVuY2hBc3Npc3RhbnRBY3Rpdml0eUludG9Bc3Npc3RhbnRTdGFjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjgzOWE0Li4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9MYXVuY2hBc3Npc3RhbnRBY3Rpdml0eUludG9Bc3Npc3RhbnRTdGFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnNlcnZlci5jdHM7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKLQotcHVibGljIGNsYXNzIExhdW5jaEFzc2lzdGFudEFjdGl2aXR5SW50b0Fzc2lzdGFudFN0YWNrIGV4dGVuZHMgQWN0aXZpdHkgewotCi0gICAgLy8gTGF1bmNoZXMgdGhlIHRyYW5zbHVjZW50IGFzc2lzdCBhY3Rpdml0eQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0lTX1RSQU5TTFVDRU5UID0gImlzX3RyYW5zbHVjZW50IjsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgewotICAgICAgICBzdXBlci5vblJlc3VtZSgpOwotCi0gICAgICAgIGlmIChnZXRJbnRlbnQoKS5oYXNFeHRyYShFWFRSQV9JU19UUkFOU0xVQ0VOVCkgJiYKLSAgICAgICAgICAgICAgICBCb29sZWFuLnZhbHVlT2YoZ2V0SW50ZW50KCkuZ2V0U3RyaW5nRXh0cmEoRVhUUkFfSVNfVFJBTlNMVUNFTlQpKSkgewotICAgICAgICAgICAgVHJhbnNsdWNlbnRBc3Npc3RhbnRBY3Rpdml0eS5sYXVuY2hBY3Rpdml0eUludG9Bc3Npc3RhbnRTdGFjayh0aGlzLAotICAgICAgICAgICAgICAgICAgICBnZXRJbnRlbnQoKS5nZXRFeHRyYXMoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBc3Npc3RhbnRBY3Rpdml0eS5sYXVuY2hBY3Rpdml0eUludG9Bc3Npc3RhbnRTdGFjayh0aGlzLCBnZXRJbnRlbnQoKS5nZXRFeHRyYXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluaXNoQW5kUmVtb3ZlVGFzaygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9MYXVuY2hCcm9hZGNhc3RSZWNlaXZlci5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0xhdW5jaEJyb2FkY2FzdFJlY2VpdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNzEzZWMuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0xhdW5jaEJyb2FkY2FzdFJlY2VpdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuc2VydmVyLmN0czsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuc2VydmVyLmN0cy50b29scy5BY3Rpdml0eUxhdW5jaGVyOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLS8qKiBCcm9hZGNhc3QgcmVjZWl2ZXIgdGhhdCBjYW4gbGF1bmNoIGFjdGl2aXRpZXMuICovCi1wdWJsaWMgY2xhc3MgTGF1bmNoQnJvYWRjYXN0UmVjZWl2ZXIgZXh0ZW5kcyBCcm9hZGNhc3RSZWNlaXZlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IExhdW5jaEJyb2FkY2FzdFJlY2VpdmVyLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEFjdGl2aXR5TGF1bmNoZXIubGF1bmNoQWN0aXZpdHlGcm9tRXh0cmFzKGNvbnRleHQsIGludGVudC5nZXRFeHRyYXMoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIlNlY3VyaXR5RXhjZXB0aW9uIGxhdW5jaGluZyBhY3Rpdml0eSIpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0xhdW5jaEVudGVyUGlwQWN0aXZpdHkuamF2YSBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9MYXVuY2hFbnRlclBpcEFjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyYjQ3ODYuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0xhdW5jaEVudGVyUGlwQWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuY3RzOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgTGF1bmNoRW50ZXJQaXBBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIHN1cGVyLm9uQ3JlYXRlKGJ1bmRsZSk7Ci0gICAgICAgIFBpcEFjdGl2aXR5LmxhdW5jaEVudGVyUGlwQWN0aXZpdHkodGhpcyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0xhdW5jaEludG9QaW5uZWRTdGFja1BpcEFjdGl2aXR5LmphdmEgYi9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvTGF1bmNoSW50b1Bpbm5lZFN0YWNrUGlwQWN0aXZpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZjNDgzNC4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvTGF1bmNoSW50b1Bpbm5lZFN0YWNrUGlwQWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuY3RzOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7Ci0KLXB1YmxpYyBjbGFzcyBMYXVuY2hJbnRvUGlubmVkU3RhY2tQaXBBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKLSAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKLSAgICAgICAgQWx3YXlzRm9jdXNhYmxlUGlwQWN0aXZpdHkubGF1bmNoQWx3YXlzRm9jdXNhYmxlUGlwQWN0aXZpdHkodGhpcywgdHJ1ZSAvKiBuZXdUYXNrICovKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvTGF1bmNoUGlwT25QaXBBY3Rpdml0eS5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0xhdW5jaFBpcE9uUGlwQWN0aXZpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBiNDdiMC4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvTGF1bmNoUGlwT25QaXBBY3Rpdml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnNlcnZlci5jdHM7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBMYXVuY2hQaXBPblBpcEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgewotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uUGljdHVyZUluUGljdHVyZU1vZGVDaGFuZ2VkKGJvb2xlYW4gaXNJblBpY3R1cmVJblBpY3R1cmVNb2RlKSB7Ci0gICAgICAgIHN1cGVyLm9uUGljdHVyZUluUGljdHVyZU1vZGVDaGFuZ2VkKGlzSW5QaWN0dXJlSW5QaWN0dXJlTW9kZSk7Ci0gICAgICAgIEFsd2F5c0ZvY3VzYWJsZVBpcEFjdGl2aXR5LmxhdW5jaEFsd2F5c0ZvY3VzYWJsZVBpcEFjdGl2aXR5KHRoaXMsCi0gICAgICAgICAgICBnZXRQYWNrYWdlTWFuYWdlcigpLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9MRUFOQkFDSykpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9MYXVuY2hpbmdBY3Rpdml0eS5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0xhdW5jaGluZ0FjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMTJjOTcuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0xhdW5jaGluZ0FjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuc2VydmVyLmN0czsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5zZXJ2ZXIuY3RzLnRvb2xzLkFjdGl2aXR5TGF1bmNoZXI7Ci0KLS8qKgotICogQWN0aXZpdHkgdGhhdCBsYXVuY2hlcyBhbm90aGVyIGFjdGl2aXRpZXMgd2hlbiBuZXcgaW50ZW50IGlzIHJlY2VpdmVkLgotICovCi1wdWJsaWMgY2xhc3MgTGF1bmNoaW5nQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7Ci0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25OZXdJbnRlbnQoSW50ZW50IGludGVudCkgewotICAgICAgICBzdXBlci5vbk5ld0ludGVudChpbnRlbnQpOwotICAgICAgICBBY3Rpdml0eUxhdW5jaGVyLmxhdW5jaEFjdGl2aXR5RnJvbUV4dHJhcyh0aGlzLCBpbnRlbnQuZ2V0RXh0cmFzKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9MaWZlY3ljbGVMb2dWaWV3LmphdmEgYi9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvTGlmZWN5Y2xlTG9nVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmUwY2YyLi4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9MaWZlY3ljbGVMb2dWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuc2VydmVyLmN0czsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci0KLXB1YmxpYyBjbGFzcyBMaWZlY3ljbGVMb2dWaWV3IGV4dGVuZHMgVmlldyB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVEFHID0gIkxpZmVjeWNsZUxvZ1ZpZXciOwotCi0gICAgcHVibGljIExpZmVjeWNsZUxvZ1ZpZXcoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaWZlY3ljbGVMb2dWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBMaWZlY3ljbGVMb2dWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlQXR0ciwgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIExpZmVjeWNsZUxvZ1ZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIsIGludCBkZWZTdHlsZVJlcykKLSAgICB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIsIGRlZlN0eWxlUmVzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKENvbmZpZ3VyYXRpb24gbmV3Q29uZmlnKSB7Ci0gICAgICAgIHN1cGVyLm9uQ29uZmlndXJhdGlvbkNoYW5nZWQobmV3Q29uZmlnKTsKLSAgICAgICAgTG9nLmkoVEFHLCAib25Db25maWd1cmF0aW9uQ2hhbmdlZCIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9Mb2dDb25maWd1cmF0aW9uQWN0aXZpdHkuamF2YSBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9Mb2dDb25maWd1cmF0aW9uQWN0aXZpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFlYjc4Yy4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvTG9nQ29uZmlndXJhdGlvbkFjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuc2VydmVyLmN0czsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi0vKioKLSAqIEFjdGl2aXR5IHRoYXQgbG9ncyBjb25maWd1cmF0aW9uIGNoYW5nZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2dDb25maWd1cmF0aW9uQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkxvZ0NvbmZpZ3VyYXRpb25BY3Rpdml0eSI7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKENvbmZpZ3VyYXRpb24gbmV3Q29uZmlnKSB7Ci0gICAgICAgIHN1cGVyLm9uQ29uZmlndXJhdGlvbkNoYW5nZWQobmV3Q29uZmlnKTsKLSAgICAgICAgTG9nLmkoVEFHLCAiQ29uZmlndXJhdGlvbiBjaGFuZ2VkOiAiICsgbmV3Q29uZmlnLnNjcmVlbldpZHRoRHAgKyAiLCIKLSAgICAgICAgICAgICAgICArIG5ld0NvbmZpZy5zY3JlZW5IZWlnaHREcCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL01vdmVUYXNrVG9CYWNrQWN0aXZpdHkuamF2YSBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9Nb3ZlVGFza1RvQmFja0FjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNDdmYjcuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL01vdmVUYXNrVG9CYWNrQWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuY3RzOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLQotLyoqCi0gKiBBY3Rpdml0eSB0aGF0IGZpbmlzaGVzIGl0c2VsZiB1c2luZyAibW92ZVRhc2tUb0JhY2siLgotICovCi1wdWJsaWMgY2xhc3MgTW92ZVRhc2tUb0JhY2tBY3Rpdml0eSBleHRlbmRzIEFic3RyYWN0TGlmZWN5Y2xlTG9nQWN0aXZpdHkgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IE1vdmVUYXNrVG9CYWNrQWN0aXZpdHkuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbUZpbmlzaFBvaW50OwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOwotCi0gICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBnZXRJbnRlbnQoKTsKLSAgICAgICAgbUZpbmlzaFBvaW50ID0gaW50ZW50LmdldEV4dHJhcygpLmdldFN0cmluZygiZmluaXNoX3BvaW50Iik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25QYXVzZSgpIHsKLSAgICAgICAgc3VwZXIub25QYXVzZSgpOwotCi0gICAgICAgIGlmIChtRmluaXNoUG9pbnQuZXF1YWxzKCJvbl9wYXVzZSIpKSB7Ci0gICAgICAgICAgICBtb3ZlVGFza1RvQmFjayh0cnVlIC8qIG5vblJvb3QgKi8pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25TdG9wKCkgewotICAgICAgICBzdXBlci5vblN0b3AoKTsKLQotICAgICAgICBpZiAobUZpbmlzaFBvaW50LmVxdWFscygib25fc3RvcCIpKSB7Ci0gICAgICAgICAgICBtb3ZlVGFza1RvQmFjayh0cnVlIC8qIG5vblJvb3QgKi8pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRUYWcoKSB7Ci0gICAgICAgIHJldHVybiBUQUc7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvTmlnaHRNb2RlQWN0aXZpdHkuamF2YSBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9OaWdodE1vZGVBY3Rpdml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzMxNDFiLi4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9OaWdodE1vZGVBY3Rpdml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnNlcnZlci5jdHM7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5VaU1vZGVNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotCi0vKiogQWN0aXZpdHkgdGhhdCBjaGFuZ2VzIFVJIG1vZGUgb24gY3JlYXRpb24gYW5kIGhhbmRsZXMgY29ycmVzcG9uZGluZyBjb25maWd1cmF0aW9uIGNoYW5nZS4gKi8KLXB1YmxpYyBjbGFzcyBOaWdodE1vZGVBY3Rpdml0eSBleHRlbmRzIEFic3RyYWN0TGlmZWN5Y2xlTG9nQWN0aXZpdHkgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IE5pZ2h0TW9kZUFjdGl2aXR5LmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VGFnKCkgewotICAgICAgICByZXR1cm4gVEFHOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKLQotICAgICAgICBVaU1vZGVNYW5hZ2VyIHVpTWFuYWdlciA9IChVaU1vZGVNYW5hZ2VyKSBnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuVUlfTU9ERV9TRVJWSUNFKTsKLSAgICAgICAgLy8gU3dpdGNoIHRoZSBtb2RlIHR3byB0aW1lcyB0byBtYWtlIHN1cmUgaXQgaXMgaW5kZXBlbmRlbnQgb2YgdGhlIGN1cnJlbnQgc2V0dGluZy4KLSAgICAgICAgdWlNYW5hZ2VyLnNldE5pZ2h0TW9kZShVaU1vZGVNYW5hZ2VyLk1PREVfTklHSFRfWUVTKTsKLSAgICAgICAgdWlNYW5hZ2VyLnNldE5pZ2h0TW9kZShVaU1vZGVNYW5hZ2VyLk1PREVfTklHSFRfTk8pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9Ob0hpc3RvcnlBY3Rpdml0eS5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL05vSGlzdG9yeUFjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhODQ2MDIuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL05vSGlzdG9yeUFjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuc2VydmVyLmN0czsKLQotLyoqCi0gKiBBbiBhY3Rpdml0eSB0aGF0IGhhcyB0aGUgbm9IaXN0b3J5IGZsYWcgc2V0LgotICovCi1wdWJsaWMgY2xhc3MgTm9IaXN0b3J5QWN0aXZpdHkgZXh0ZW5kcyBBYnN0cmFjdExpZmVjeWNsZUxvZ0FjdGl2aXR5IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gTm9IaXN0b3J5QWN0aXZpdHkuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRUYWcoKSB7Ci0gICAgICAgIHJldHVybiBUQUc7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL05vUmVsYXVuY2hBY3Rpdml0eS5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL05vUmVsYXVuY2hBY3Rpdml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2MzYjlkLi4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9Ob1JlbGF1bmNoQWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuc2VydmVyLmN0czsKLQotcHVibGljIGNsYXNzIE5vUmVsYXVuY2hBY3Rpdml0eSBleHRlbmRzIEFic3RyYWN0TGlmZWN5Y2xlTG9nQWN0aXZpdHkgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IE5vUmVsYXVuY2hBY3Rpdml0eS5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFRhZygpIHsKLSAgICAgICAgcmV0dXJuIFRBRzsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvTm9uUmVzaXplYWJsZUFjdGl2aXR5LmphdmEgYi9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvTm9uUmVzaXplYWJsZUFjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4NzFhOGQuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL05vblJlc2l6ZWFibGVBY3Rpdml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuY3RzOwotCi1wdWJsaWMgY2xhc3MgTm9uUmVzaXplYWJsZUFjdGl2aXR5IGV4dGVuZHMgQWJzdHJhY3RMaWZlY3ljbGVMb2dBY3Rpdml0eSB7Ci0KLSAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IE5vblJlc2l6ZWFibGVBY3Rpdml0eS5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFRhZygpIHsKLSAgICAgICAgcmV0dXJuIFRBRzsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvUGlwQWN0aXZpdHkuamF2YSBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9QaXBBY3Rpdml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTY4OTcwLi4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9QaXBBY3Rpdml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuY3RzOwotCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5JbnRlbnQuRkxBR19BQ1RJVklUWV9DTEVBUl9UQVNLOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0s7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU9wdGlvbnM7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuUGljdHVyZUluUGljdHVyZVBhcmFtczsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuUmF0aW9uYWw7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBQaXBBY3Rpdml0eSBleHRlbmRzIEFic3RyYWN0TGlmZWN5Y2xlTG9nQWN0aXZpdHkgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJQaXBBY3Rpdml0eSI7Ci0KLSAgICAvLyBJbnRlbnQgYWN0aW9uIHRoYXQgdGhpcyBhY3Rpdml0eSBkeW5hbWljYWxseSByZWdpc3RlcnMgdG8gZW50ZXIgcGljdHVyZS1pbi1waWN0dXJlCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9FTlRFUl9QSVAgPSAiYW5kcm9pZC5zZXJ2ZXIuY3RzLlBpcEFjdGl2aXR5LmVudGVyX3BpcCI7Ci0gICAgLy8gSW50ZW50IGFjdGlvbiB0aGF0IHRoaXMgYWN0aXZpdHkgZHluYW1pY2FsbHkgcmVnaXN0ZXJzIHRvIG1vdmUgaXRzZWxmIHRvIHRoZSBiYWNrCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9NT1ZFX1RPX0JBQ0sgPSAiYW5kcm9pZC5zZXJ2ZXIuY3RzLlBpcEFjdGl2aXR5Lm1vdmVfdG9fYmFjayI7Ci0gICAgLy8gSW50ZW50IGFjdGlvbiB0aGF0IHRoaXMgYWN0aXZpdHkgZHluYW1pY2FsbHkgcmVnaXN0ZXJzIHRvIGV4cGFuZCBpdHNlbGYuCi0gICAgLy8gSWYgRVhUUkFfU0VUX0FTUEVDVF9SQVRJT19XSVRIX0RFTEFZIGlzIHNldCwgaXQgd2lsbCBhbHNvIGF0dGVtcHQgdG8gYXBwbHkgdGhlIGFzcGVjdCByYXRpbwotICAgIC8vIGFmdGVyIGEgc2hvcnQgZGVsYXkuCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9FWFBBTkRfUElQID0gImFuZHJvaWQuc2VydmVyLmN0cy5QaXBBY3Rpdml0eS5leHBhbmRfcGlwIjsKLSAgICAvLyBJbnRlbnQgYWN0aW9uIHRoYXQgdGhpcyBhY3Rpdml0eSBkeW5hbWljYWxseSByZWdpc3RlcnMgdG8gc2V0IHJlcXVlc3RlZCBvcmllbnRhdGlvbi4KLSAgICAvLyBXaWxsIGFwcGx5IHRoZSBvcmllbnRpb24gdG8gdGhlIHZhbHVlIHNldCBpbiB0aGUgRVhUUkFfRklYRURfT1JJRU5UQVRJT04gZXh0cmEuCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TRVRfUkVRVUVTVEVEX09SSUVOVEFUSU9OID0KLSAgICAgICAgICAgICJhbmRyb2lkLnNlcnZlci5jdHMuUGlwQWN0aXZpdHkuc2V0X3JlcXVlc3RlZF9vcmllbnRhdGlvbiI7Ci0gICAgLy8gSW50ZW50IGFjdGlvbiB0aGF0IHdpbGwgZmluaXNoIHRoaXMgYWN0aXZpdHkKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0ZJTklTSCA9ICJhbmRyb2lkLnNlcnZlci5jdHMuUGlwQWN0aXZpdHkuZmluaXNoIjsKLQotICAgIC8vIFNldHMgdGhlIGZpeGVkIG9yaWVudGF0aW9uIChjYW4gYmUgb25lIG9mIHtAbGluayBBY3Rpdml0eUluZm8uU2NyZWVuT3JpZW50YXRpb259Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0ZJWEVEX09SSUVOVEFUSU9OID0gImZpeGVkX29yaWVudGF0aW9uIjsKLSAgICAvLyBDYWxscyBlbnRlclBpY3R1cmVJblBpY3R1cmUoKSBvbiBjcmVhdGlvbgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9FTlRFUl9QSVAgPSAiZW50ZXJfcGlwIjsKLSAgICAvLyBVc2VkIHdpdGggRVhUUkFfQVVUT19FTlRFUl9QSVAsIHZhbHVlIHNwZWNpZmllcyB0aGUgYXNwZWN0IHJhdGlvIHRvIGVudGVyIFBJUCB3aXRoCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0VOVEVSX1BJUF9BU1BFQ1RfUkFUSU9fTlVNRVJBVE9SID0KLSAgICAgICAgICAgICJlbnRlcl9waXBfYXNwZWN0X3JhdGlvX251bWVyYXRvciI7Ci0gICAgLy8gVXNlZCB3aXRoIEVYVFJBX0FVVE9fRU5URVJfUElQLCB2YWx1ZSBzcGVjaWZpZXMgdGhlIGFzcGVjdCByYXRpbyB0byBlbnRlciBQSVAgd2l0aAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9FTlRFUl9QSVBfQVNQRUNUX1JBVElPX0RFTk9NSU5BVE9SID0KLSAgICAgICAgICAgICJlbnRlcl9waXBfYXNwZWN0X3JhdGlvX2Rlbm9taW5hdG9yIjsKLSAgICAvLyBDYWxscyBzZXRQaWN0dXJlSW5QaWN0dXJlQXNwZWN0UmF0aW8gd2l0aCB0aGUgYXNwZWN0IHJhdGlvIHNwZWNpZmllZCBpbiB0aGUgdmFsdWUKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfU0VUX0FTUEVDVF9SQVRJT19OVU1FUkFUT1IgPSAic2V0X2FzcGVjdF9yYXRpb19udW1lcmF0b3IiOwotICAgIC8vIENhbGxzIHNldFBpY3R1cmVJblBpY3R1cmVBc3BlY3RSYXRpbyB3aXRoIHRoZSBhc3BlY3QgcmF0aW8gc3BlY2lmaWVkIGluIHRoZSB2YWx1ZQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9TRVRfQVNQRUNUX1JBVElPX0RFTk9NSU5BVE9SID0gInNldF9hc3BlY3RfcmF0aW9fZGVub21pbmF0b3IiOwotICAgIC8vIENhbGxzIHNldFBpY3R1cmVJblBpY3R1cmVBc3BlY3RSYXRpbyB3aXRoIHRoZSBhc3BlY3QgcmF0aW8gc3BlY2lmaWVkIGluIHRoZSB2YWx1ZSB3aXRoIGEKLSAgICAvLyBmaXhlZCBkZWxheQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9TRVRfQVNQRUNUX1JBVElPX1dJVEhfREVMQVlfTlVNRVJBVE9SID0KLSAgICAgICAgICAgICJzZXRfYXNwZWN0X3JhdGlvX3dpdGhfZGVsYXlfbnVtZXJhdG9yIjsKLSAgICAvLyBDYWxscyBzZXRQaWN0dXJlSW5QaWN0dXJlQXNwZWN0UmF0aW8gd2l0aCB0aGUgYXNwZWN0IHJhdGlvIHNwZWNpZmllZCBpbiB0aGUgdmFsdWUgd2l0aCBhCi0gICAgLy8gZml4ZWQgZGVsYXkKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfU0VUX0FTUEVDVF9SQVRJT19XSVRIX0RFTEFZX0RFTk9NSU5BVE9SID0KLSAgICAgICAgICAgICJzZXRfYXNwZWN0X3JhdGlvX3dpdGhfZGVsYXlfZGVub21pbmF0b3IiOwotICAgIC8vIEFkZHMgYSBjbGljayBsaXN0ZW5lciB0byBmaW5pc2ggdGhpcyBhY3Rpdml0eSB3aGVuIGl0IGlzIGNsaWNrZWQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfVEFQX1RPX0ZJTklTSCA9ICJ0YXBfdG9fZmluaXNoIjsKLSAgICAvLyBDYWxscyByZXF1ZXN0QXV0b0VudGVyUGljdHVyZUluUGljdHVyZSgpIHdpdGggdGhlIHZhbHVlIHByb3ZpZGVkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0VOVEVSX1BJUF9PTl9QQVVTRSA9ICJlbnRlcl9waXBfb25fcGF1c2UiOwotICAgIC8vIFN0YXJ0cyB0aGUgYWN0aXZpdHkgKGNvbXBvbmVudCBuYW1lKSBwcm92aWRlZCBieSB0aGUgdmFsdWUgYXQgdGhlIGVuZCBvZiBvbkNyZWF0ZQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9TVEFSVF9BQ1RJVklUWSA9ICJzdGFydF9hY3Rpdml0eSI7Ci0gICAgLy8gRmluaXNoZXMgdGhlIGFjdGl2aXR5IGF0IHRoZSBlbmQgb2Ygb25SZXN1bWUgKGFmdGVyIEVYVFJBX1NUQVJUX0FDVElWSVRZIGlzIGhhbmRsZWQpCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0ZJTklTSF9TRUxGX09OX1JFU1VNRSA9ICJmaW5pc2hfc2VsZl9vbl9yZXN1bWUiOwotICAgIC8vIENhbGxzIGVudGVyUGljdHVyZUluUGljdHVyZSgpIGFnYWluIGFmdGVyIG9uUGljdHVyZUluUGljdHVyZU1vZGVDaGFuZ2VkKGZhbHNlKSBpcyBjYWxsZWQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfUkVFTlRFUl9QSVBfT05fRVhJVCA9ICJyZWVudGVyX3BpcF9vbl9leGl0IjsKLSAgICAvLyBTaG93cyB0aGlzIGFjdGl2aXR5IG92ZXIgdGhlIGtleWd1YXJkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1NIT1dfT1ZFUl9LRVlHVUFSRCA9ICJzaG93X292ZXJfa2V5Z3VhcmQiOwotICAgIC8vIEFkZHMgYW4gYXNzZXJ0aW9uIHRoYXQgd2UgZG8gbm90IGV2ZXIgZ2V0IG9uU3RvcCgpIGJlZm9yZSB3ZSBlbnRlciBwaWN0dXJlIGluIHBpY3R1cmUKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfQVNTRVJUX05PX09OX1NUT1BfQkVGT1JFX1BJUCA9ICJhc3NlcnRfbm9fb25fc3RvcF9iZWZvcmVfcGlwIjsKLSAgICAvLyBUaGUgYW1vdW50IHRvIGRlbGF5IHRvIGFydGlmaWNpYWxseSBpbnRyb2R1Y2UgaW4gb25QYXVzZSgpIChiZWZvcmUgRVhUUkFfRU5URVJfUElQX09OX1BBVVNFCi0gICAgLy8gaXMgcHJvY2Vzc2VkKQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9PTl9QQVVTRV9ERUxBWSA9ICJvbl9wYXVzZV9kZWxheSI7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbUVudGVyZWRQaWN0dXJlSW5QaWN0dXJlOwotCi0gICAgcHJpdmF0ZSBIYW5kbGVyIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKTsKLSAgICBwcml2YXRlIEJyb2FkY2FzdFJlY2VpdmVyIG1SZWNlaXZlciA9IG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgICAgIGlmIChpbnRlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN3aXRjaCAoaW50ZW50LmdldEFjdGlvbigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQUNUSU9OX0VOVEVSX1BJUDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGVudGVyUGljdHVyZUluUGljdHVyZU1vZGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEFDVElPTl9NT1ZFX1RPX0JBQ0s6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb3ZlVGFza1RvQmFjayhmYWxzZSAvKiBub25Sb290ICovKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEFDVElPTl9FWFBBTkRfUElQOgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJpZ2dlciB0aGUgYWN0aXZpdHkgdG8gZXhwYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbnQgc3RhcnRJbnRlbnQgPSBuZXcgSW50ZW50KFBpcEFjdGl2aXR5LnRoaXMsIFBpcEFjdGl2aXR5LmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0SW50ZW50LnNldEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX1JFT1JERVJfVE9fRlJPTlQpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRBY3Rpdml0eShzdGFydEludGVudCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnRlbnQuaGFzRXh0cmEoRVhUUkFfU0VUX0FTUEVDVF9SQVRJT19XSVRIX0RFTEFZX05VTUVSQVRPUikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgaW50ZW50Lmhhc0V4dHJhKEVYVFJBX1NFVF9BU1BFQ1RfUkFUSU9fV0lUSF9ERUxBWV9ERU5PTUlOQVRPUikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVZ2x5LCBidXQgcmVxdWlyZWQgdG8gd2FpdCBmb3IgdGhlIHN0YXJ0QWN0aXZpdHkgdG8gYWN0dWFsbHkgc3RhcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYWN0aXZpdHkuLi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGFuZGxlci5wb3N0RGVsYXllZCgoKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFBpY3R1cmVJblBpY3R1cmVQYXJhbXMuQnVpbGRlciBidWlsZGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUGljdHVyZUluUGljdHVyZVBhcmFtcy5CdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0QXNwZWN0UmF0aW8oZ2V0QXNwZWN0UmF0aW8oaW50ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBX1NFVF9BU1BFQ1RfUkFUSU9fV0lUSF9ERUxBWV9OVU1FUkFUT1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFfU0VUX0FTUEVDVF9SQVRJT19XSVRIX0RFTEFZX0RFTk9NSU5BVE9SKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFBpY3R1cmVJblBpY3R1cmVQYXJhbXMoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAxMDApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQUNUSU9OX1NFVF9SRVFVRVNURURfT1JJRU5UQVRJT046Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRSZXF1ZXN0ZWRPcmllbnRhdGlvbihJbnRlZ2VyLnBhcnNlSW50KGludGVudC5nZXRTdHJpbmdFeHRyYSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFfRklYRURfT1JJRU5UQVRJT04pKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBBQ1RJT05fRklOSVNIOgotICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwotCi0gICAgICAgIC8vIFNldCB0aGUgZml4ZWQgb3JpZW50YXRpb24gaWYgcmVxdWVzdGVkCi0gICAgICAgIGlmIChnZXRJbnRlbnQoKS5oYXNFeHRyYShFWFRSQV9GSVhFRF9PUklFTlRBVElPTikpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBvcmkgPSBJbnRlZ2VyLnBhcnNlSW50KGdldEludGVudCgpLmdldFN0cmluZ0V4dHJhKEVYVFJBX0ZJWEVEX09SSUVOVEFUSU9OKSk7Ci0gICAgICAgICAgICBzZXRSZXF1ZXN0ZWRPcmllbnRhdGlvbihvcmkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU2V0IHRoZSB3aW5kb3cgZmxhZyB0byBzaG93IG92ZXIgdGhlIGtleWd1YXJkCi0gICAgICAgIGlmIChnZXRJbnRlbnQoKS5oYXNFeHRyYShFWFRSQV9TSE9XX09WRVJfS0VZR1VBUkQpKSB7Ci0gICAgICAgICAgICBnZXRXaW5kb3coKS5hZGRGbGFncyhXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX1NIT1dfV0hFTl9MT0NLRUQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRW50ZXIgcGljdHVyZSBpbiBwaWN0dXJlIHdpdGggdGhlIGdpdmVuIGFzcGVjdCByYXRpbyBpZiBwcm92aWRlZAotICAgICAgICBpZiAoZ2V0SW50ZW50KCkuaGFzRXh0cmEoRVhUUkFfRU5URVJfUElQKSkgewotICAgICAgICAgICAgaWYgKGdldEludGVudCgpLmhhc0V4dHJhKEVYVFJBX0VOVEVSX1BJUF9BU1BFQ1RfUkFUSU9fTlVNRVJBVE9SKQotICAgICAgICAgICAgICAgICAgICAmJiBnZXRJbnRlbnQoKS5oYXNFeHRyYShFWFRSQV9FTlRFUl9QSVBfQVNQRUNUX1JBVElPX0RFTk9NSU5BVE9SKSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFBpY3R1cmVJblBpY3R1cmVQYXJhbXMuQnVpbGRlciBidWlsZGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUGljdHVyZUluUGljdHVyZVBhcmFtcy5CdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0QXNwZWN0UmF0aW8oZ2V0QXNwZWN0UmF0aW8oZ2V0SW50ZW50KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFfRU5URVJfUElQX0FTUEVDVF9SQVRJT19OVU1FUkFUT1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFfRU5URVJfUElQX0FTUEVDVF9SQVRJT19ERU5PTUlOQVRPUikpOwotICAgICAgICAgICAgICAgICAgICBlbnRlclBpY3R1cmVJblBpY3R1cmVNb2RlKGJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBjYWxsIGNhbiBmYWlsIGludGVudGlvbmFsbHkgaWYgdGhlIGFzcGVjdCByYXRpbyBpcyB0b28gZXh0cmVtZQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZW50ZXJQaWN0dXJlSW5QaWN0dXJlTW9kZShuZXcgUGljdHVyZUluUGljdHVyZVBhcmFtcy5CdWlsZGVyKCkuYnVpbGQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXZSBuZWVkIHRvIHdhaXQgZm9yIGVpdGhlciBlbnRlclBpY3R1cmVJblBpY3R1cmUoKSBvciByZXF1ZXN0QXV0b0VudGVyUGljdHVyZUluUGljdHVyZSgpCi0gICAgICAgIC8vIHRvIGJlIGNhbGxlZCBiZWZvcmUgc2V0dGluZyB0aGUgYXNwZWN0IHJhdGlvCi0gICAgICAgIGlmIChnZXRJbnRlbnQoKS5oYXNFeHRyYShFWFRSQV9TRVRfQVNQRUNUX1JBVElPX05VTUVSQVRPUikKLSAgICAgICAgICAgICAgICAmJiBnZXRJbnRlbnQoKS5oYXNFeHRyYShFWFRSQV9TRVRfQVNQRUNUX1JBVElPX0RFTk9NSU5BVE9SKSkgewotICAgICAgICAgICAgZmluYWwgUGljdHVyZUluUGljdHVyZVBhcmFtcy5CdWlsZGVyIGJ1aWxkZXIgPQotICAgICAgICAgICAgICAgICAgICBuZXcgUGljdHVyZUluUGljdHVyZVBhcmFtcy5CdWlsZGVyKCk7Ci0gICAgICAgICAgICBidWlsZGVyLnNldEFzcGVjdFJhdGlvKGdldEFzcGVjdFJhdGlvKGdldEludGVudCgpLAotICAgICAgICAgICAgICAgICAgICBFWFRSQV9TRVRfQVNQRUNUX1JBVElPX05VTUVSQVRPUiwgRVhUUkFfU0VUX0FTUEVDVF9SQVRJT19ERU5PTUlOQVRPUikpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBzZXRQaWN0dXJlSW5QaWN0dXJlUGFyYW1zKGJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIFRoaXMgY2FsbCBjYW4gZmFpbCBpbnRlbnRpb25hbGx5IGlmIHRoZSBhc3BlY3QgcmF0aW8gaXMgdG9vIGV4dHJlbWUKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEVuYWJsZSB0YXAgdG8gZmluaXNoIGlmIG5lY2Vzc2FyeQotICAgICAgICBpZiAoZ2V0SW50ZW50KCkuaGFzRXh0cmEoRVhUUkFfVEFQX1RPX0ZJTklTSCkpIHsKLSAgICAgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LnRhcF90b19maW5pc2hfcGlwX2xheW91dCk7Ci0gICAgICAgICAgICBmaW5kVmlld0J5SWQoUi5pZC5jb250ZW50KS5zZXRPbkNsaWNrTGlzdGVuZXIodiAtPiB7Ci0gICAgICAgICAgICAgICAgZmluaXNoKCk7Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIExhdW5jaCBhIG5ldyBhY3Rpdml0eSBpZiByZXF1ZXN0ZWQKLSAgICAgICAgU3RyaW5nIGxhdW5jaEFjdGl2aXR5Q29tcG9uZW50ID0gZ2V0SW50ZW50KCkuZ2V0U3RyaW5nRXh0cmEoRVhUUkFfU1RBUlRfQUNUSVZJVFkpOwotICAgICAgICBpZiAobGF1bmNoQWN0aXZpdHlDb21wb25lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgSW50ZW50IGxhdW5jaEludGVudCA9IG5ldyBJbnRlbnQoKTsKLSAgICAgICAgICAgIGxhdW5jaEludGVudC5zZXRDb21wb25lbnQoQ29tcG9uZW50TmFtZS51bmZsYXR0ZW5Gcm9tU3RyaW5nKGxhdW5jaEFjdGl2aXR5Q29tcG9uZW50KSk7Ci0gICAgICAgICAgICBzdGFydEFjdGl2aXR5KGxhdW5jaEludGVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSZWdpc3RlciB0aGUgYnJvYWRjYXN0IHJlY2VpdmVyCi0gICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7Ci0gICAgICAgIGZpbHRlci5hZGRBY3Rpb24oQUNUSU9OX0VOVEVSX1BJUCk7Ci0gICAgICAgIGZpbHRlci5hZGRBY3Rpb24oQUNUSU9OX01PVkVfVE9fQkFDSyk7Ci0gICAgICAgIGZpbHRlci5hZGRBY3Rpb24oQUNUSU9OX0VYUEFORF9QSVApOwotICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEFDVElPTl9TRVRfUkVRVUVTVEVEX09SSUVOVEFUSU9OKTsKLSAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihBQ1RJT05fRklOSVNIKTsKLSAgICAgICAgcmVnaXN0ZXJSZWNlaXZlcihtUmVjZWl2ZXIsIGZpbHRlcik7Ci0KLSAgICAgICAgLy8gRHVtcCBhcHBsaWVkIGRpc3BsYXkgbWV0cmljcy4KLSAgICAgICAgQ29uZmlndXJhdGlvbiBjb25maWcgPSBnZXRSZXNvdXJjZXMoKS5nZXRDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIGR1bXBEaXNwbGF5U2l6ZShjb25maWcpOwotICAgICAgICBkdW1wQ29uZmlndXJhdGlvbihjb25maWcpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgewotICAgICAgICBzdXBlci5vblJlc3VtZSgpOwotCi0gICAgICAgIC8vIEZpbmlzaCBzZWxmIGlmIHJlcXVlc3RlZAotICAgICAgICBpZiAoZ2V0SW50ZW50KCkuaGFzRXh0cmEoRVhUUkFfRklOSVNIX1NFTEZfT05fUkVTVU1FKSkgewotICAgICAgICAgICAgZmluaXNoKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvblBhdXNlKCkgewotICAgICAgICBzdXBlci5vblBhdXNlKCk7Ci0KLSAgICAgICAgLy8gUGF1c2UgaWYgcmVxdWVzdGVkCi0gICAgICAgIGlmIChnZXRJbnRlbnQoKS5oYXNFeHRyYShFWFRSQV9PTl9QQVVTRV9ERUxBWSkpIHsKLSAgICAgICAgICAgIFN5c3RlbUNsb2NrLnNsZWVwKExvbmcudmFsdWVPZihnZXRJbnRlbnQoKS5nZXRTdHJpbmdFeHRyYShFWFRSQV9PTl9QQVVTRV9ERUxBWSkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEVudGVyIFBJUCBvbiBtb3ZlIHRvIGJhY2tncm91bmQKLSAgICAgICAgaWYgKGdldEludGVudCgpLmhhc0V4dHJhKEVYVFJBX0VOVEVSX1BJUF9PTl9QQVVTRSkpIHsKLSAgICAgICAgICAgIGVudGVyUGljdHVyZUluUGljdHVyZU1vZGUobmV3IFBpY3R1cmVJblBpY3R1cmVQYXJhbXMuQnVpbGRlcigpLmJ1aWxkKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25TdG9wKCkgewotICAgICAgICBzdXBlci5vblN0b3AoKTsKLQotICAgICAgICBpZiAoZ2V0SW50ZW50KCkuaGFzRXh0cmEoRVhUUkFfQVNTRVJUX05PX09OX1NUT1BfQkVGT1JFX1BJUCkgJiYgIW1FbnRlcmVkUGljdHVyZUluUGljdHVyZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiVW5leHBlY3RlZCBvblN0b3AoKSBjYWxsZWQgYmVmb3JlIGVudGVyaW5nIHBpY3R1cmUtaW4tcGljdHVyZSIpOwotICAgICAgICAgICAgZmluaXNoKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkRlc3Ryb3koKSB7Ci0gICAgICAgIHN1cGVyLm9uRGVzdHJveSgpOwotCi0gICAgICAgIHVucmVnaXN0ZXJSZWNlaXZlcihtUmVjZWl2ZXIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uUGljdHVyZUluUGljdHVyZU1vZGVDaGFuZ2VkKGJvb2xlYW4gaXNJblBpY3R1cmVJblBpY3R1cmVNb2RlKSB7Ci0gICAgICAgIHN1cGVyLm9uUGljdHVyZUluUGljdHVyZU1vZGVDaGFuZ2VkKGlzSW5QaWN0dXJlSW5QaWN0dXJlTW9kZSk7Ci0KLSAgICAgICAgLy8gRmFpbCBlYXJseSBpZiB0aGUgYWN0aXZpdHkgc3RhdGUgZG9lcyBub3QgbWF0Y2ggdGhlIGRpc3BhdGNoZWQgc3RhdGUKLSAgICAgICAgaWYgKGlzSW5QaWN0dXJlSW5QaWN0dXJlTW9kZSgpICE9IGlzSW5QaWN0dXJlSW5QaWN0dXJlTW9kZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiUmVjZWl2ZWQgb25QaWN0dXJlSW5QaWN0dXJlTW9kZUNoYW5nZWQgbW9kZT0iICsgaXNJblBpY3R1cmVJblBpY3R1cmVNb2RlCi0gICAgICAgICAgICAgICAgICAgICsgIiBhY3Rpdml0eVN0YXRlPSIgKyBpc0luUGljdHVyZUluUGljdHVyZU1vZGUoKSk7Ci0gICAgICAgICAgICBmaW5pc2goKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE1hcmsgdGhhdCB3ZSd2ZSBlbnRlcmVkIHBpY3R1cmUtaW4tcGljdHVyZSBzbyB0aGF0IHdlIGNhbiBzdG9wIGNoZWNraW5nIGZvcgotICAgICAgICAvLyBFWFRSQV9BU1NFUlRfTk9fT05fU1RPUF9CRUZPUkVfUElQCi0gICAgICAgIGlmIChpc0luUGljdHVyZUluUGljdHVyZU1vZGUpIHsKLSAgICAgICAgICAgIG1FbnRlcmVkUGljdHVyZUluUGljdHVyZSA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWlzSW5QaWN0dXJlSW5QaWN0dXJlTW9kZSAmJiBnZXRJbnRlbnQoKS5oYXNFeHRyYShFWFRSQV9SRUVOVEVSX1BJUF9PTl9FWElUKSkgewotICAgICAgICAgICAgLy8gVGhpcyBjYWxsIHRvIHJlLWVudGVyIFBJUCBjYW4gaGFwcGVuIHRvbyBxdWlja2x5IChob3N0IHNpZGUgdGVzdHMgY2FuIGhhdmUgZGlmZmljdWx0eQotICAgICAgICAgICAgLy8gY2hlY2tpbmcgdGhhdCB0aGUgc3RhY2tzIGV2ZXIgY2hhbmdlZCkuIFRoZXJlZm9yLCB3ZSBuZWVkIHRvIGRlbGF5IGhlcmUgc2xpZ2h0bHkgdG8KLSAgICAgICAgICAgIC8vIGFsbG93IHRoZSB0ZXN0cyB0byB2ZXJpZnkgdGhhdCB0aGUgc3RhY2tzIGhhdmUgY2hhbmdlZCBiZWZvcmUgcmUtZW50ZXJpbmcuCi0gICAgICAgICAgICBtSGFuZGxlci5wb3N0RGVsYXllZCgoKSAtPiB7Ci0gICAgICAgICAgICAgICAgZW50ZXJQaWN0dXJlSW5QaWN0dXJlTW9kZShuZXcgUGljdHVyZUluUGljdHVyZVBhcmFtcy5CdWlsZGVyKCkuYnVpbGQoKSk7Ci0gICAgICAgICAgICB9LCAxMDAwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQoQ29uZmlndXJhdGlvbiBuZXdDb25maWcpIHsKLSAgICAgICAgc3VwZXIub25Db25maWd1cmF0aW9uQ2hhbmdlZChuZXdDb25maWcpOwotICAgICAgICBkdW1wRGlzcGxheVNpemUobmV3Q29uZmlnKTsKLSAgICAgICAgZHVtcENvbmZpZ3VyYXRpb24obmV3Q29uZmlnKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMYXVuY2hlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgUGlwQWN0aXZpdHkgZGlyZWN0bHkgaW50byB0aGUgcGlubmVkIHN0YWNrLgotICAgICAqLwotICAgIHN0YXRpYyB2b2lkIGxhdW5jaEFjdGl2aXR5SW50b1Bpbm5lZFN0YWNrKEFjdGl2aXR5IGNhbGxlciwgUmVjdCBib3VuZHMpIHsKLSAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoY2FsbGVyLCBQaXBBY3Rpdml0eS5jbGFzcyk7Ci0gICAgICAgIGludGVudC5zZXRGbGFncyhGTEFHX0FDVElWSVRZX0NMRUFSX1RBU0sgfCBGTEFHX0FDVElWSVRZX05FV19UQVNLKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKEVYVFJBX0FTU0VSVF9OT19PTl9TVE9QX0JFRk9SRV9QSVAsICJ0cnVlIik7Ci0KLSAgICAgICAgZmluYWwgQWN0aXZpdHlPcHRpb25zIG9wdGlvbnMgPSBBY3Rpdml0eU9wdGlvbnMubWFrZUJhc2ljKCk7Ci0gICAgICAgIG9wdGlvbnMuc2V0TGF1bmNoQm91bmRzKGJvdW5kcyk7Ci0gICAgICAgIG9wdGlvbnMuc2V0TGF1bmNoU3RhY2tJZCg0IC8qIEFjdGl2aXR5TWFuYWdlci5TdGFja0lkLlBJTk5FRF9TVEFDS19JRCAqLyk7Ci0gICAgICAgIGNhbGxlci5zdGFydEFjdGl2aXR5KGludGVudCwgb3B0aW9ucy50b0J1bmRsZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMYXVuY2hlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgUGlwQWN0aXZpdHkgaW4gdGhlIHNhbWUgdGFzayB0aGF0IHdpbGwgYXV0b21hdGljYWxseSBlbnRlcgotICAgICAqIFBpUC4KLSAgICAgKi8KLSAgICBzdGF0aWMgdm9pZCBsYXVuY2hFbnRlclBpcEFjdGl2aXR5KEFjdGl2aXR5IGNhbGxlcikgewotICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChjYWxsZXIsIFBpcEFjdGl2aXR5LmNsYXNzKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKEVYVFJBX0VOVEVSX1BJUCwgInRydWUiKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKEVYVFJBX0FTU0VSVF9OT19PTl9TVE9QX0JFRk9SRV9QSVAsICJ0cnVlIik7Ci0gICAgICAgIGNhbGxlci5zdGFydEFjdGl2aXR5KGludGVudCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRUYWcoKSB7Ci0gICAgICAgIHJldHVybiBUQUc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBhIHtAbGluayBSYXRpb25hbH0gYXNwZWN0IHJhdGlvIGZyb20gdGhlIGdpdmVuIGludGVudCBhbmQgZXh0cmFzLgotICAgICAqLwotICAgIHByaXZhdGUgUmF0aW9uYWwgZ2V0QXNwZWN0UmF0aW8oSW50ZW50IGludGVudCwgU3RyaW5nIGV4dHJhTnVtLCBTdHJpbmcgZXh0cmFEZW5vbSkgewotICAgICAgICByZXR1cm4gbmV3IFJhdGlvbmFsKAotICAgICAgICAgICAgICAgIEludGVnZXIudmFsdWVPZihpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoZXh0cmFOdW0pKSwKLSAgICAgICAgICAgICAgICBJbnRlZ2VyLnZhbHVlT2YoaW50ZW50LmdldFN0cmluZ0V4dHJhKGV4dHJhRGVub20pKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL1BpcEFjdGl2aXR5Mi5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL1BpcEFjdGl2aXR5Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2I0Zjc1Li4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9QaXBBY3Rpdml0eTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuY3RzOwotCi0vKioKLSAqIEEgc2Vjb25kYXJ5IGFjdGl2aXR5IHRoYXQgaGFzIHRoZSBzYW1lIGJlaGF2aW9yIGFzIHtAbGluayBQaXBBY3Rpdml0eX0uCi0gKi8KLXB1YmxpYyBjbGFzcyBQaXBBY3Rpdml0eTIgZXh0ZW5kcyBQaXBBY3Rpdml0eSB7Ci19CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvUGlwQWN0aXZpdHlXaXRoU2FtZUFmZmluaXR5LmphdmEgYi9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvUGlwQWN0aXZpdHlXaXRoU2FtZUFmZmluaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5N2RjMGUuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL1BpcEFjdGl2aXR5V2l0aFNhbWVBZmZpbml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnNlcnZlci5jdHM7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKLWltcG9ydCBhbmRyb2lkLmFwcC5QaWN0dXJlSW5QaWN0dXJlUGFyYW1zOwotCi0vKioKLSAqIEFuIGFjdGl2aXR5IHRoYXQgY2FuIGVudGVyIFBpUCB3aXRoIGEgZml4ZWQgYWZmaW5pdHkgdG8gbWF0Y2gKLSAqIHtAbGluayBUZXN0QWN0aXZpdHlXaXRoU2FtZUFmZmluaXR5fS4KLSAqLwotcHVibGljIGNsYXNzIFBpcEFjdGl2aXR5V2l0aFNhbWVBZmZpbml0eSBleHRlbmRzIEFjdGl2aXR5IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgewotICAgICAgICBzdXBlci5vblJlc3VtZSgpOwotCi0gICAgICAgIGVudGVyUGljdHVyZUluUGljdHVyZU1vZGUobmV3IFBpY3R1cmVJblBpY3R1cmVQYXJhbXMuQnVpbGRlcigpLmJ1aWxkKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9QaXBPblN0b3BBY3Rpdml0eS5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL1BpcE9uU3RvcEFjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYmM2OTYuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL1BpcE9uU3RvcEFjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuc2VydmVyLmN0czsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci0KLS8qKgotICogVGhpcyBhY3Rpdml0eSB3aWxsIHRyeSBhbmQgZW50ZXIgcGljdHVyZSBpbiBwaWN0dXJlIHdoZW4gaXQgaXMgc3RvcHBlZC4KLSAqLwotcHVibGljIGNsYXNzIFBpcE9uU3RvcEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwotCi0gICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LnRhcF90b19maW5pc2hfcGlwX2xheW91dCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7Ci0gICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7Ci0KLSAgICAgICAgc3RhcnRBY3Rpdml0eShuZXcgSW50ZW50KHRoaXMsIFBpcEFjdGl2aXR5LmNsYXNzKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25TdG9wKCkgewotICAgICAgICBzdXBlci5vblN0b3AoKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZW50ZXJQaWN0dXJlSW5QaWN0dXJlTW9kZSgpOwotICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIEtub3duIGZhaWx1cmUsIHdlIGV4cGVjdCB0aGlzIGNhbGwgdG8gdGhyb3cgYW4gZXhjZXB0aW9uCi0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvUG9ydHJhaXRPcmllbnRhdGlvbkFjdGl2aXR5LmphdmEgYi9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvUG9ydHJhaXRPcmllbnRhdGlvbkFjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmYTFmYzguLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL1BvcnRyYWl0T3JpZW50YXRpb25BY3Rpdml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnNlcnZlci5jdHM7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBQb3J0cmFpdE9yaWVudGF0aW9uQWN0aXZpdHkgZXh0ZW5kcyBBYnN0cmFjdExpZmVjeWNsZUxvZ0FjdGl2aXR5IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VGFnKCkgewotICAgICAgICByZXR1cm4gIlBvcnRyYWl0T3JpZW50YXRpb25BY3Rpdml0eSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7Ci0gICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7Ci0gICAgICAgIGZpbmFsIENvbmZpZ3VyYXRpb24gY29uZmlnID0gZ2V0UmVzb3VyY2VzKCkuZ2V0Q29uZmlndXJhdGlvbigpOwotICAgICAgICBkdW1wRGlzcGxheVNpemUoY29uZmlnKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKENvbmZpZ3VyYXRpb24gbmV3Q29uZmlnKSB7Ci0gICAgICAgIHN1cGVyLm9uQ29uZmlndXJhdGlvbkNoYW5nZWQobmV3Q29uZmlnKTsKLSAgICAgICAgZHVtcERpc3BsYXlTaXplKG5ld0NvbmZpZyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL1Jlc2l6ZWFibGVBY3Rpdml0eS5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL1Jlc2l6ZWFibGVBY3Rpdml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWQ4NzRiLi4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9SZXNpemVhYmxlQWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAotICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSAqIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAotICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCi0gKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgotICogdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuY3RzOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgUmVzaXplYWJsZUFjdGl2aXR5IGV4dGVuZHMgQWJzdHJhY3RMaWZlY3ljbGVMb2dBY3Rpdml0eSB7Ci0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRUYWcoKSB7Ci0gICAgICAgIHJldHVybiAiUmVzaXplYWJsZUFjdGl2aXR5IjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgaWNpY2xlKSB7Ci0gICAgICAgIHN1cGVyLm9uQ3JlYXRlKGljaWNsZSk7Ci0gICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LnJlc2l6ZWFibGVfYWN0aXZpdHkpOwotICAgICAgICBkdW1wRGlzcGxheVNpemUoZ2V0UmVzb3VyY2VzKCkuZ2V0Q29uZmlndXJhdGlvbigpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKENvbmZpZ3VyYXRpb24gbmV3Q29uZmlnKSB7Ci0gICAgICAgIHN1cGVyLm9uQ29uZmlndXJhdGlvbkNoYW5nZWQobmV3Q29uZmlnKTsKLSAgICAgICAgZHVtcERpc3BsYXlTaXplKG5ld0NvbmZpZyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL1Jlc3VtZVdoaWxlUGF1c2luZ0FjdGl2aXR5LmphdmEgYi9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvUmVzdW1lV2hpbGVQYXVzaW5nQWN0aXZpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc4ZDdlNS4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvUmVzdW1lV2hpbGVQYXVzaW5nQWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuc2VydmVyLmN0czsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotCi1wdWJsaWMgY2xhc3MgUmVzdW1lV2hpbGVQYXVzaW5nQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7Ci0gICAgLy8gRW1wdHkKLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9TaG93V2hlbkxvY2tlZEFjdGl2aXR5LmphdmEgYi9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvU2hvd1doZW5Mb2NrZWRBY3Rpdml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTMzNDhhLi4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9TaG93V2hlbkxvY2tlZEFjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuc2VydmVyLmN0czsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgU2hvd1doZW5Mb2NrZWRBY3Rpdml0eSBleHRlbmRzIEJyb2FkY2FzdFJlY2VpdmVyQWN0aXZpdHkgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwotICAgICAgICBnZXRXaW5kb3coKS5hZGRGbGFncyhXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX1NIT1dfV0hFTl9MT0NLRUQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9TaG93V2hlbkxvY2tlZEF0dHJBY3Rpdml0eS5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL1Nob3dXaGVuTG9ja2VkQXR0ckFjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1M2M0ODUuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL1Nob3dXaGVuTG9ja2VkQXR0ckFjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuc2VydmVyLmN0czsKLQotcHVibGljIGNsYXNzIFNob3dXaGVuTG9ja2VkQXR0ckFjdGl2aXR5IGV4dGVuZHMgQWJzdHJhY3RMaWZlY3ljbGVMb2dBY3Rpdml0eSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IFNob3dXaGVuTG9ja2VkQXR0ckFjdGl2aXR5LmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VGFnKCkgewotICAgICAgICByZXR1cm4gVEFHOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL1Nob3dXaGVuTG9ja2VkQXR0clJlbW92ZUF0dHJBY3Rpdml0eS5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL1Nob3dXaGVuTG9ja2VkQXR0clJlbW92ZUF0dHJBY3Rpdml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmFkMzRkLi4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9TaG93V2hlbkxvY2tlZEF0dHJSZW1vdmVBdHRyQWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuY3RzOwotCi1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBTaG93V2hlbkxvY2tlZEF0dHJSZW1vdmVBdHRyQWN0aXZpdHkgZXh0ZW5kcyBBYnN0cmFjdExpZmVjeWNsZUxvZ0FjdGl2aXR5IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gU2hvd1doZW5Mb2NrZWRBdHRyUmVtb3ZlQXR0ckFjdGl2aXR5LmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uU3RvcCgpIHsKLSAgICAgICAgc3VwZXIub25TdG9wKCk7Ci0gICAgICAgIHNldFNob3dXaGVuTG9ja2VkKGZhbHNlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFRhZygpIHsKLSAgICAgICAgcmV0dXJuIFRBRzsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9TaG93V2hlbkxvY2tlZEF0dHJXaXRoRGlhbG9nQWN0aXZpdHkuamF2YSBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9TaG93V2hlbkxvY2tlZEF0dHJXaXRoRGlhbG9nQWN0aXZpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM2NzA2YS4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvU2hvd1doZW5Mb2NrZWRBdHRyV2l0aERpYWxvZ0FjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuc2VydmVyLmN0czsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgU2hvd1doZW5Mb2NrZWRBdHRyV2l0aERpYWxvZ0FjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwotICAgICAgICBuZXcgQWxlcnREaWFsb2cuQnVpbGRlcih0aGlzKQotICAgICAgICAgICAgICAgIC5zZXRUaXRsZSgiRGlhbG9nIikKLSAgICAgICAgICAgICAgICAuc2hvdygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9TaG93V2hlbkxvY2tlZERpYWxvZ0FjdGl2aXR5LmphdmEgYi9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvU2hvd1doZW5Mb2NrZWREaWFsb2dBY3Rpdml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjYwMTM5Li4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9TaG93V2hlbkxvY2tlZERpYWxvZ0FjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuc2VydmVyLmN0czsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgU2hvd1doZW5Mb2NrZWREaWFsb2dBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLSAgICAgICAgZ2V0V2luZG93KCkuYWRkRmxhZ3MoV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19TSE9XX1dIRU5fTE9DS0VEKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvU2hvd1doZW5Mb2NrZWRUcmFuc2x1Y2VudEFjdGl2aXR5LmphdmEgYi9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvU2hvd1doZW5Mb2NrZWRUcmFuc2x1Y2VudEFjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyOWM5ZjcuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL1Nob3dXaGVuTG9ja2VkVHJhbnNsdWNlbnRBY3Rpdml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnNlcnZlci5jdHM7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKLQotcHVibGljIGNsYXNzIFNob3dXaGVuTG9ja2VkVHJhbnNsdWNlbnRBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLSAgICAgICAgZ2V0V2luZG93KCkuYWRkRmxhZ3MoV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19TSE9XX1dIRU5fTE9DS0VEKTsKLSAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQudHJhbnNsdWNlbnQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9TaG93V2hlbkxvY2tlZFdpdGhEaWFsb2dBY3Rpdml0eS5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL1Nob3dXaGVuTG9ja2VkV2l0aERpYWxvZ0FjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZDVhYzcuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL1Nob3dXaGVuTG9ja2VkV2l0aERpYWxvZ0FjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuc2VydmVyLmN0czsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgU2hvd1doZW5Mb2NrZWRXaXRoRGlhbG9nQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7Ci0gICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7Ci0gICAgICAgIGdldFdpbmRvdygpLmFkZEZsYWdzKFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfU0hPV19XSEVOX0xPQ0tFRCk7Ci0gICAgICAgIG5ldyBBbGVydERpYWxvZy5CdWlsZGVyKHRoaXMpCi0gICAgICAgICAgICAgICAgLnNldFRpdGxlKCJEaWFsb2ciKQotICAgICAgICAgICAgICAgIC5zaG93KCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL1NpbmdsZUluc3RhbmNlQWN0aXZpdHkuamF2YSBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9TaW5nbGVJbnN0YW5jZUFjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwZWFlY2YuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL1NpbmdsZUluc3RhbmNlQWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuY3RzOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7Ci0KLXB1YmxpYyBjbGFzcyBTaW5nbGVJbnN0YW5jZUFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgewotfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL1NpbmdsZVRhc2tBY3Rpdml0eS5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL1NpbmdsZVRhc2tBY3Rpdml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmZkZTEzLi4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9TaW5nbGVUYXNrQWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuY3RzOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7Ci0KLXB1YmxpYyBjbGFzcyBTaW5nbGVUYXNrQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7Ci19CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvU2xvd0NyZWF0ZUFjdGl2aXR5LmphdmEgYi9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvU2xvd0NyZWF0ZUFjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3NTcxNjUuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL1Nsb3dDcmVhdGVBY3Rpdml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuY3RzOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBTbG93Q3JlYXRlQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7Ci0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDIwMDApOwotICAgICAgICB9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHt9Ci0gICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL1NwbGFzaHNjcmVlbkFjdGl2aXR5LmphdmEgYi9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvU3BsYXNoc2NyZWVuQWN0aXZpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIzOTFiZC4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvU3BsYXNoc2NyZWVuQWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuY3RzOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKLQotLyoqCi0gKiBBY3Rpdml0eSB0aGF0IHNob3dzIGEgY3VzdG9tIHNwbGFzaHNjcmVlbiB3aGVuIGJlaW5nIGxhdW5jaGVkLgotICovCi1wdWJsaWMgY2xhc3MgU3BsYXNoc2NyZWVuQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7Ci0gICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7Ci0gICAgICAgIC8vIE1ha2Ugc3VyZSBzcGxhc2ggc2NyZWVuIGlzIHZpc2libGUuIFRoZSB0ZXN0IHdvbid0IHRha2UgNSBzZWNvbmRzIGJlY2F1c2UgdGhlIGNvbmRpdGlvbgotICAgICAgICAvLyBzdWNoIHRoYXQgd2UgY2FuIGR1bXAgdGhlIHN0YXRlIHdpbGwgdHJpZ2dlciBtdWNoIGVhcmxpZXIgYW5kIHRoZW4gdGhlIHRlc3Qgd2lsbCBqdXN0Ci0gICAgICAgIC8vIGtpbGwgdXMuCi0gICAgICAgIFN5c3RlbUNsb2NrLnNsZWVwKDUwMDApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9Td2lwZVJlZnJlc2hBY3Rpdml0eS5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL1N3aXBlUmVmcmVzaEFjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMzZhYmMuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL1N3aXBlUmVmcmVzaEFjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuc2VydmVyLmN0czsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQuc2VydmVyLmN0cy5Td2lwZVJlZnJlc2hMYXlvdXQ7Ci0KLQotLyoqCi0gKiBBbiBhY3Rpdml0eSBjb250YWluaW5nIGEgU3dpcGVSZWZyZXNoTGF5b3V0IHdoaWNoIHByZXZlbnRzIGFjdGl2aXR5IGlkbGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBTd2lwZVJlZnJlc2hBY3Rpdml0eSBleHRlbmRzIEFic3RyYWN0TGlmZWN5Y2xlTG9nQWN0aXZpdHkgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBTd2lwZVJlZnJlc2hBY3Rpdml0eS5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7Ci0gICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7Ci0gICAgICAgIHNldENvbnRlbnRWaWV3KG5ldyBTd2lwZVJlZnJlc2hMYXlvdXQodGhpcykpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VGFnKCkgewotICAgICAgICByZXR1cm4gVEFHOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9Td2lwZVJlZnJlc2hMYXlvdXQuamF2YSBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9Td2lwZVJlZnJlc2hMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA2MWQ5ZS4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvU3dpcGVSZWZyZXNoTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuc2VydmVyLmN0czsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci0KLS8qKgotICogQW4gZXh0ZW5zaW9uIG9mIHtAbGluayBhbmRyb2lkLnN1cHBvcnQudjQud2lkZ2V0LlN3aXBlUmVmcmVzaExheW91dH0gdGhhdCBjYWxscwotICoge0BsaW5rICNzZXRSZWZyZXNoaW5nfSBkdXJpbmcgY29uc3RydWN0aW9uLCBwcmV2ZW50aW5nIGFjdGl2aXR5IGlkbGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBTd2lwZVJlZnJlc2hMYXlvdXQgZXh0ZW5kcyBhbmRyb2lkLnN1cHBvcnQudjQud2lkZ2V0LlN3aXBlUmVmcmVzaExheW91dCB7Ci0gICAgcHVibGljIFN3aXBlUmVmcmVzaExheW91dChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCk7Ci0gICAgICAgIGluaXRpYWxpemUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3dpcGVSZWZyZXNoTGF5b3V0KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKLSAgICAgICAgaW5pdGlhbGl6ZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotICAgICAgICBzZXRSZWZyZXNoaW5nKHRydWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9UZXN0QWN0aXZpdHkuamF2YSBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9UZXN0QWN0aXZpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjlhODZjNi4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvVGVzdEFjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnNlcnZlci5jdHM7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1wdWJsaWMgY2xhc3MgVGVzdEFjdGl2aXR5IGV4dGVuZHMgQWJzdHJhY3RMaWZlY3ljbGVMb2dBY3Rpdml0eSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gVGVzdEFjdGl2aXR5LmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKLQotICAgIC8vIFNldHMgdGhlIGZpeGVkIG9yaWVudGF0aW9uIChjYW4gYmUgb25lIG9mIHtAbGluayBBY3Rpdml0eUluZm8uU2NyZWVuT3JpZW50YXRpb259Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0ZJWEVEX09SSUVOVEFUSU9OID0gImZpeGVkX29yaWVudGF0aW9uIjsKLQotICAgIC8vIEZpbmlzaGVzIHRoZSBhY3Rpdml0eQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fRklOSVNIX1NFTEYgPSAiYW5kcm9pZC5zZXJ2ZXIuY3RzLlRlc3RBY3Rpdml0eS5maW5pc2hfc2VsZiI7Ci0KLSAgICBwcml2YXRlIEJyb2FkY2FzdFJlY2VpdmVyIG1SZWNlaXZlciA9IG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgICAgIGlmIChpbnRlbnQgIT0gbnVsbCAmJiBpbnRlbnQuZ2V0QWN0aW9uKCkuZXF1YWxzKEFDVElPTl9GSU5JU0hfU0VMRikpIHsKLSAgICAgICAgICAgICAgICBmaW5pc2goKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgaWNpY2xlKSB7Ci0gICAgICAgIHN1cGVyLm9uQ3JlYXRlKGljaWNsZSk7Ci0KLSAgICAgICAgLy8gU2V0IHRoZSBmaXhlZCBvcmllbnRhdGlvbiBpZiByZXF1ZXN0ZWQKLSAgICAgICAgaWYgKGdldEludGVudCgpLmhhc0V4dHJhKEVYVFJBX0ZJWEVEX09SSUVOVEFUSU9OKSkgewotICAgICAgICAgICAgZmluYWwgaW50IG9yaSA9IEludGVnZXIucGFyc2VJbnQoZ2V0SW50ZW50KCkuZ2V0U3RyaW5nRXh0cmEoRVhUUkFfRklYRURfT1JJRU5UQVRJT04pKTsKLSAgICAgICAgICAgIHNldFJlcXVlc3RlZE9yaWVudGF0aW9uKG9yaSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvblN0YXJ0KCkgewotICAgICAgICBzdXBlci5vblN0YXJ0KCk7Ci0gICAgICAgIHJlZ2lzdGVyUmVjZWl2ZXIobVJlY2VpdmVyLCBuZXcgSW50ZW50RmlsdGVyKEFDVElPTl9GSU5JU0hfU0VMRikpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgewotICAgICAgICBzdXBlci5vblJlc3VtZSgpOwotICAgICAgICBmaW5hbCBDb25maWd1cmF0aW9uIGNvbmZpZyA9IGdldFJlc291cmNlcygpLmdldENvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgZHVtcERpc3BsYXlTaXplKGNvbmZpZyk7Ci0gICAgICAgIGR1bXBDb25maWd1cmF0aW9uKGNvbmZpZyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25TdG9wKCkgewotICAgICAgICBzdXBlci5vblN0b3AoKTsKLSAgICAgICAgdW5yZWdpc3RlclJlY2VpdmVyKG1SZWNlaXZlcik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25Db25maWd1cmF0aW9uQ2hhbmdlZChDb25maWd1cmF0aW9uIG5ld0NvbmZpZykgewotICAgICAgICBzdXBlci5vbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKG5ld0NvbmZpZyk7Ci0gICAgICAgIGR1bXBEaXNwbGF5U2l6ZShuZXdDb25maWcpOwotICAgICAgICBkdW1wQ29uZmlndXJhdGlvbihuZXdDb25maWcpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VGFnKCkgewotICAgICAgICByZXR1cm4gVEFHOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9UZXN0QWN0aXZpdHlXaXRoU2FtZUFmZmluaXR5LmphdmEgYi9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvVGVzdEFjdGl2aXR5V2l0aFNhbWVBZmZpbml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjc1ZGVlLi4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9UZXN0QWN0aXZpdHlXaXRoU2FtZUFmZmluaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnNlcnZlci5jdHM7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5QaWN0dXJlSW5QaWN0dXJlUGFyYW1zOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0QWN0aXZpdHlXaXRoU2FtZUFmZmluaXR5IGV4dGVuZHMgVGVzdEFjdGl2aXR5IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBUZXN0QWN0aXZpdHlXaXRoU2FtZUFmZmluaXR5LmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKLQotICAgIC8vIENhbGxzIGVudGVyUGljdHVyZUluUGljdHVyZSgpIG9uIGNyZWF0aW9uCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0VOVEVSX1BJUCA9ICJlbnRlcl9waXAiOwotICAgIC8vIFN0YXJ0cyB0aGUgYWN0aXZpdHkgKGNvbXBvbmVudCBuYW1lKSBwcm92aWRlZCBieSB0aGUgdmFsdWUgYXQgdGhlIGVuZCBvZiBvbkNyZWF0ZQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9TVEFSVF9BQ1RJVklUWSA9ICJzdGFydF9hY3Rpdml0eSI7Ci0gICAgLy8gRmluaXNoZXMgdGhlIGFjdGl2aXR5IGF0IHRoZSBlbmQgb2Ygb25SZXN1bWUgKGFmdGVyIEVYVFJBX1NUQVJUX0FDVElWSVRZIGlzIGhhbmRsZWQpCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0ZJTklTSF9TRUxGX09OX1JFU1VNRSA9ICJmaW5pc2hfc2VsZl9vbl9yZXN1bWUiOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOwotCi0gICAgICAgIC8vIEVudGVyIHBpY3R1cmUgaW4gcGljdHVyZSBpZiByZXF1ZXN0ZWQKLSAgICAgICAgaWYgKGdldEludGVudCgpLmhhc0V4dHJhKEVYVFJBX0VOVEVSX1BJUCkpIHsKLSAgICAgICAgICAgIGVudGVyUGljdHVyZUluUGljdHVyZU1vZGUobmV3IFBpY3R1cmVJblBpY3R1cmVQYXJhbXMuQnVpbGRlcigpLmJ1aWxkKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTGF1bmNoIGEgbmV3IGFjdGl2aXR5IGlmIHJlcXVlc3RlZAotICAgICAgICBTdHJpbmcgbGF1bmNoQWN0aXZpdHlDb21wb25lbnQgPSBnZXRJbnRlbnQoKS5nZXRTdHJpbmdFeHRyYShFWFRSQV9TVEFSVF9BQ1RJVklUWSk7Ci0gICAgICAgIGlmIChsYXVuY2hBY3Rpdml0eUNvbXBvbmVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJbnRlbnQgbGF1bmNoSW50ZW50ID0gbmV3IEludGVudCgpOwotICAgICAgICAgICAgbGF1bmNoSW50ZW50LnNldENvbXBvbmVudChDb21wb25lbnROYW1lLnVuZmxhdHRlbkZyb21TdHJpbmcobGF1bmNoQWN0aXZpdHlDb21wb25lbnQpKTsKLSAgICAgICAgICAgIHN0YXJ0QWN0aXZpdHkobGF1bmNoSW50ZW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgewotICAgICAgICBzdXBlci5vblJlc3VtZSgpOwotCi0gICAgICAgIC8vIEZpbmlzaCBzZWxmIGlmIHJlcXVlc3RlZAotICAgICAgICBpZiAoZ2V0SW50ZW50KCkuaGFzRXh0cmEoRVhUUkFfRklOSVNIX1NFTEZfT05fUkVTVU1FKSkgewotICAgICAgICAgICAgZmluaXNoKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFRhZygpIHsKLSAgICAgICAgcmV0dXJuIFRBRzsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvVG9wQWN0aXZpdHkuamF2YSBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9Ub3BBY3Rpdml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Njg0OTk5Li4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9Ub3BBY3Rpdml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuY3RzOwotCi1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLXB1YmxpYyBjbGFzcyBUb3BBY3Rpdml0eSBleHRlbmRzIEFic3RyYWN0TGlmZWN5Y2xlTG9nQWN0aXZpdHkgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IFRvcEFjdGl2aXR5LmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VGFnKCkgewotICAgICAgICByZXR1cm4gVEFHOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLQotICAgICAgICBmaW5hbCBib29sZWFuIHVzZVdhbGxwYXBlciA9IGdldEludGVudCgpLmdldEJvb2xlYW5FeHRyYSgiVVNFX1dBTExQQVBFUiIsIGZhbHNlKTsKLSAgICAgICAgaWYgKHVzZVdhbGxwYXBlcikgewotICAgICAgICAgICAgc2V0VGhlbWUoUi5zdHlsZS5XYWxscGFwZXJUaGVtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBpbnQgZmluaXNoRGVsYXkgPSBnZXRJbnRlbnQoKS5nZXRJbnRFeHRyYSgiRklOSVNIX0RFTEFZIiwgMCk7Ci0gICAgICAgIGlmIChmaW5pc2hEZWxheSA+IDApIHsKLSAgICAgICAgICAgIEhhbmRsZXIgaGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7Ci0gICAgICAgICAgICBoYW5kbGVyLnBvc3REZWxheWVkKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkNhbGxpbmcgZmluaXNoKCkiKTsKLSAgICAgICAgICAgICAgICAgICAgZmluaXNoKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSwgZmluaXNoRGVsYXkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL1RvcExlZnRMYXlvdXRBY3Rpdml0eS5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL1RvcExlZnRMYXlvdXRBY3Rpdml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzA1NTgyLi4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9Ub3BMZWZ0TGF5b3V0QWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuc2VydmVyLmN0czsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotCi1wdWJsaWMgY2xhc3MgVG9wTGVmdExheW91dEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgewotfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL1RvcFJpZ2h0TGF5b3V0QWN0aXZpdHkuamF2YSBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9Ub3BSaWdodExheW91dEFjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMWQzZGIuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL1RvcFJpZ2h0TGF5b3V0QWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuc2VydmVyLmN0czsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotCi1wdWJsaWMgY2xhc3MgVG9wUmlnaHRMYXlvdXRBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9UcmFtcG9saW5lQWN0aXZpdHkuamF2YSBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9UcmFtcG9saW5lQWN0aXZpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNmOTQ0NC4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvVHJhbXBvbGluZUFjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnNlcnZlci5jdHM7Ci0KLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50LkZMQUdfQUNUSVZJVFlfQ0xFQVJfVE9QOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0s7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotCi1wdWJsaWMgY2xhc3MgVHJhbXBvbGluZUFjdGl2aXR5IGV4dGVuZHMgQWJzdHJhY3RMaWZlY3ljbGVMb2dBY3Rpdml0eSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gVHJhbXBvbGluZUFjdGl2aXR5LmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLSAgICAgICAgLy8gQWRkIGEgZGVsYXkgaGVyZSB0byBleHBvc2UgbW9yZSBlYXNpbHkgYSBmYWlsdXJlIGNhc2Ugd2hlcmUgdGhlIHJlYWwgdGFyZ2V0Ci0gICAgICAgIC8vIGFjdGl2aXR5IGlzIHZpc2libGUgYmVmb3JlIGl0J3MgbGF1bmNoZWQsIGJlY2F1c2UgaXRzIHRhc2sgaXMgYmVpbmcgYnJvdWdodAotICAgICAgICAvLyB0byBmb3JlZ3JvdW5kLiBXZSBuZWVkIHRvIHZlcmlmeSB0aGF0ICdhbSBzdGFydCcgaXMgdW5ibG9ja2VkIGNvcnJlY3RseS4KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgyMDAwKTsKLSAgICAgICAgfSBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7fQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCh0aGlzLCBTaW5nbGVUYXNrQWN0aXZpdHkuY2xhc3MpOwotICAgICAgICBpbnRlbnQuc2V0RmxhZ3MoRkxBR19BQ1RJVklUWV9DTEVBUl9UT1AgfCBGTEFHX0FDVElWSVRZX05FV19UQVNLKTsKLQotICAgICAgICBzdGFydEFjdGl2aXR5KGludGVudCk7Ci0gICAgICAgIGZpbmlzaCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VGFnKCkgewotICAgICAgICByZXR1cm4gVEFHOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9UcmFuc2x1Y2VudEFjdGl2aXR5LmphdmEgYi9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvVHJhbnNsdWNlbnRBY3Rpdml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjY5N2FhLi4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9UcmFuc2x1Y2VudEFjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuc2VydmVyLmN0czsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotCi1wdWJsaWMgY2xhc3MgVHJhbnNsdWNlbnRBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKLQotfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL1RyYW5zbHVjZW50QXNzaXN0YW50QWN0aXZpdHkuamF2YSBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9UcmFuc2x1Y2VudEFzc2lzdGFudEFjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5Nzk3MTIuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL1RyYW5zbHVjZW50QXNzaXN0YW50QWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuY3RzOwotCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5JbnRlbnQuRkxBR19BQ1RJVklUWV9DTEVBUl9UQVNLOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0s7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU9wdGlvbnM7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLQotcHVibGljIGNsYXNzIFRyYW5zbHVjZW50QXNzaXN0YW50QWN0aXZpdHkgZXh0ZW5kcyBBc3Npc3RhbnRBY3Rpdml0eSB7Ci0KLSAgICAvKioKLSAgICAgKiBMYXVuY2hlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgVHJhbnNsdWNlbnRBc3Npc3RhbnRBY3Rpdml0eSBkaXJlY3RseSBpbnRvIHRoZSBhc3Npc3RhbnQKLSAgICAgKiBzdGFjay4KLSAgICAgKi8KLSAgICBzdGF0aWMgdm9pZCBsYXVuY2hBY3Rpdml0eUludG9Bc3Npc3RhbnRTdGFjayhBY3Rpdml0eSBjYWxsZXIsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoY2FsbGVyLCBUcmFuc2x1Y2VudEFzc2lzdGFudEFjdGl2aXR5LmNsYXNzKTsKLSAgICAgICAgaW50ZW50LnNldEZsYWdzKEZMQUdfQUNUSVZJVFlfQ0xFQVJfVEFTSyB8IEZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOwotICAgICAgICBpZiAoZXh0cmFzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludGVudC5wdXRFeHRyYXMoZXh0cmFzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIEFjdGl2aXR5T3B0aW9ucyBvcHRpb25zID0gQWN0aXZpdHlPcHRpb25zLm1ha2VCYXNpYygpOwotICAgICAgICBvcHRpb25zLnNldExhdW5jaFN0YWNrSWQoNiAvKiBBY3Rpdml0eU1hbmFnZXIuU3RhY2tJZC5BU1NJU1RBTlRfU1RBQ0tfSUQgKi8pOwotICAgICAgICBjYWxsZXIuc3RhcnRBY3Rpdml0eShpbnRlbnQsIG9wdGlvbnMudG9CdW5kbGUoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL1RyYW5zbHVjZW50VGVzdEFjdGl2aXR5LmphdmEgYi9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvVHJhbnNsdWNlbnRUZXN0QWN0aXZpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQxMGE1MS4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvVHJhbnNsdWNlbnRUZXN0QWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuc2VydmVyLmN0czsKLQotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgVHJhbnNsdWNlbnRUZXN0QWN0aXZpdHkgZXh0ZW5kcyBUZXN0QWN0aXZpdHkgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IFRyYW5zbHVjZW50VGVzdEFjdGl2aXR5LmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKLQotICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC50YXNrX292ZXJsYXkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VGFnKCkgewotICAgICAgICByZXR1cm4gVEFHOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9UcmFuc2x1Y2VudFRvcEFjdGl2aXR5LmphdmEgYi9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvVHJhbnNsdWNlbnRUb3BBY3Rpdml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDk2ODk4Li4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9UcmFuc2x1Y2VudFRvcEFjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnNlcnZlci5jdHM7Ci0KLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotcHVibGljIGNsYXNzIFRyYW5zbHVjZW50VG9wQWN0aXZpdHkgZXh0ZW5kcyBBYnN0cmFjdExpZmVjeWNsZUxvZ0FjdGl2aXR5IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBUcmFuc2x1Y2VudFRvcEFjdGl2aXR5LmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VGFnKCkgewotICAgICAgICByZXR1cm4gVEFHOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLQotICAgICAgICBmaW5hbCBib29sZWFuIHVzZVdhbGxwYXBlciA9IGdldEludGVudCgpLmdldEJvb2xlYW5FeHRyYSgiVVNFX1dBTExQQVBFUiIsIGZhbHNlKTsKLSAgICAgICAgaWYgKHVzZVdhbGxwYXBlcikgewotICAgICAgICAgICAgc2V0VGhlbWUoUi5zdHlsZS5UcmFuc2x1Y2VudFdhbGxwYXBlclRoZW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIGludCBmaW5pc2hEZWxheSA9IGdldEludGVudCgpLmdldEludEV4dHJhKCJGSU5JU0hfREVMQVkiLCAwKTsKLSAgICAgICAgaWYgKGZpbmlzaERlbGF5ID4gMCkgewotICAgICAgICAgICAgSGFuZGxlciBoYW5kbGVyID0gbmV3IEhhbmRsZXIoKTsKLSAgICAgICAgICAgIGhhbmRsZXIucG9zdERlbGF5ZWQobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQ2FsbGluZyBmaW5pc2goKSIpOwotICAgICAgICAgICAgICAgICAgICBmaW5pc2goKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9LCBmaW5pc2hEZWxheSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvVHVyblNjcmVlbk9uQWN0aXZpdHkuamF2YSBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9UdXJuU2NyZWVuT25BY3Rpdml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWUzMWIzLi4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9UdXJuU2NyZWVuT25BY3Rpdml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnNlcnZlci5jdHM7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKLQotcHVibGljIGNsYXNzIFR1cm5TY3JlZW5PbkFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgewotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgZ2V0V2luZG93KCkuYWRkRmxhZ3MoV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19LRUVQX1NDUkVFTl9PTgotICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19TSE9XX1dIRU5fTE9DS0VECi0gICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0RJU01JU1NfS0VZR1VBUkQKLSAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfVFVSTl9TQ1JFRU5fT04pOwotICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9UdXJuU2NyZWVuT25BdHRyQWN0aXZpdHkuamF2YSBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9UdXJuU2NyZWVuT25BdHRyQWN0aXZpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUxZjVkMS4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvVHVyblNjcmVlbk9uQXR0ckFjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuc2VydmVyLmN0czsKLQotcHVibGljIGNsYXNzIFR1cm5TY3JlZW5PbkF0dHJBY3Rpdml0eSBleHRlbmRzIEFic3RyYWN0TGlmZWN5Y2xlTG9nQWN0aXZpdHkgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBUdXJuU2NyZWVuT25BdHRyQWN0aXZpdHkuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRUYWcoKSB7Ci0gICAgICAgIHJldHVybiBUQUc7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL1R1cm5TY3JlZW5PbkF0dHJEaXNtaXNzS2V5Z3VhcmRBY3Rpdml0eS5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL1R1cm5TY3JlZW5PbkF0dHJEaXNtaXNzS2V5Z3VhcmRBY3Rpdml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWI4NjBmLi4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9UdXJuU2NyZWVuT25BdHRyRGlzbWlzc0tleWd1YXJkQWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuY3RzOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuS2V5Z3VhcmRNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgVHVyblNjcmVlbk9uQXR0ckRpc21pc3NLZXlndWFyZEFjdGl2aXR5IGV4dGVuZHMgQWJzdHJhY3RMaWZlY3ljbGVMb2dBY3Rpdml0eSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IFR1cm5TY3JlZW5PbkF0dHJEaXNtaXNzS2V5Z3VhcmRBY3Rpdml0eS5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgaWNpY2xlKSB7Ci0gICAgICAgIHN1cGVyLm9uQ3JlYXRlKGljaWNsZSk7Ci0gICAgICAgICgoS2V5Z3VhcmRNYW5hZ2VyKSBnZXRTeXN0ZW1TZXJ2aWNlKEtFWUdVQVJEX1NFUlZJQ0UpKQotICAgICAgICAgICAgICAgIC5yZXF1ZXN0RGlzbWlzc0tleWd1YXJkKHRoaXMsIG5ldyBLZXlndWFyZERpc21pc3NMb2dnZXJDYWxsYmFjayh0aGlzKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRUYWcoKSB7Ci0gICAgICAgIHJldHVybiBUQUc7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL1R1cm5TY3JlZW5PbkF0dHJSZW1vdmVBdHRyQWN0aXZpdHkuamF2YSBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9UdXJuU2NyZWVuT25BdHRyUmVtb3ZlQXR0ckFjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5OTExZmUuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL1R1cm5TY3JlZW5PbkF0dHJSZW1vdmVBdHRyQWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuY3RzOwotCi1wdWJsaWMgY2xhc3MgVHVyblNjcmVlbk9uQXR0clJlbW92ZUF0dHJBY3Rpdml0eSBleHRlbmRzIEFic3RyYWN0TGlmZWN5Y2xlTG9nQWN0aXZpdHkgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBUdXJuU2NyZWVuT25BdHRyUmVtb3ZlQXR0ckFjdGl2aXR5LmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uU3RvcCgpIHsKLSAgICAgICAgc3VwZXIub25TdG9wKCk7Ci0gICAgICAgIHNldFR1cm5TY3JlZW5PbihmYWxzZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRUYWcoKSB7Ci0gICAgICAgIHJldHVybiBUQUc7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL1R1cm5TY3JlZW5PbkRpc21pc3NLZXlndWFyZEFjdGl2aXR5LmphdmEgYi9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvVHVyblNjcmVlbk9uRGlzbWlzc0tleWd1YXJkQWN0aXZpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg3Zjc4NS4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvVHVyblNjcmVlbk9uRGlzbWlzc0tleWd1YXJkQWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuY3RzOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuS2V5Z3VhcmRNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgVHVyblNjcmVlbk9uRGlzbWlzc0tleWd1YXJkQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7Ci0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwotICAgICAgICBnZXRXaW5kb3coKS5hZGRGbGFncyhXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX1NIT1dfV0hFTl9MT0NLRUQKLSAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfVFVSTl9TQ1JFRU5fT04pOwotICAgICAgICBnZXRTeXN0ZW1TZXJ2aWNlKEtleWd1YXJkTWFuYWdlci5jbGFzcykucmVxdWVzdERpc21pc3NLZXlndWFyZCh0aGlzLAotICAgICAgICAgICAgICAgIG5ldyBLZXlndWFyZERpc21pc3NMb2dnZXJDYWxsYmFjayh0aGlzKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL1R1cm5TY3JlZW5PblNob3dPbkxvY2tBY3Rpdml0eS5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL1R1cm5TY3JlZW5PblNob3dPbkxvY2tBY3Rpdml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2ZmNGZiLi4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9UdXJuU2NyZWVuT25TaG93T25Mb2NrQWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuY3RzOwotCi1wdWJsaWMgY2xhc3MgVHVyblNjcmVlbk9uU2hvd09uTG9ja0FjdGl2aXR5IGV4dGVuZHMgQWJzdHJhY3RMaWZlY3ljbGVMb2dBY3Rpdml0eSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IFR1cm5TY3JlZW5PblNob3dPbkxvY2tBY3Rpdml0eS5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFRhZygpIHsKLSAgICAgICAgcmV0dXJuIFRBRzsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvVHVyblNjcmVlbk9uU2luZ2xlVGFza0FjdGl2aXR5LmphdmEgYi9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvVHVyblNjcmVlbk9uU2luZ2xlVGFza0FjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5YzcxZDAuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL1R1cm5TY3JlZW5PblNpbmdsZVRhc2tBY3Rpdml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnNlcnZlci5jdHM7Ci0KLXB1YmxpYyBjbGFzcyBUdXJuU2NyZWVuT25TaW5nbGVUYXNrQWN0aXZpdHkgZXh0ZW5kcyBBYnN0cmFjdExpZmVjeWNsZUxvZ0FjdGl2aXR5IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gVHVyblNjcmVlbk9uU2luZ2xlVGFza0FjdGl2aXR5LmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VGFnKCkgewotICAgICAgICByZXR1cm4gVEFHOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9UdXJuU2NyZWVuT25XaXRoUmVsYXlvdXRBY3Rpdml0eS5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL1R1cm5TY3JlZW5PbldpdGhSZWxheW91dEFjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0YzI4MDEuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL1R1cm5TY3JlZW5PbldpdGhSZWxheW91dEFjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuc2VydmVyLmN0czsKLWltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKLQotcHVibGljIGNsYXNzIFR1cm5TY3JlZW5PbldpdGhSZWxheW91dEFjdGl2aXR5IGV4dGVuZHMgQWJzdHJhY3RMaWZlY3ljbGVMb2dBY3Rpdml0eSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IFR1cm5TY3JlZW5PbldpdGhSZWxheW91dEFjdGl2aXR5LmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VGFnKCkgewotICAgICAgICByZXR1cm4gVEFHOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uU3RhcnQoKSB7Ci0gICAgICAgIHN1cGVyLm9uU3RhcnQoKTsKLSAgICAgICAgZ2V0V2luZG93KCkuYWRkRmxhZ3MoV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19TSE9XX1dIRU5fTE9DS0VECi0gICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX1RVUk5fU0NSRUVOX09OKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvblN0b3AoKSB7Ci0gICAgICAgIHN1cGVyLm9uU3RvcCgpOwotCi0gICAgICAgIC8vIFRoaXMgaXMgdG8gZm9yY2UgYSByZWxheW91dCwgc3BlY2lmaWNhbGx5IHdpdGggaW5zZXRzIGNoYW5nZWQuIFdoZW4gdGhlIGluc2V0cyBhcmUKLSAgICAgICAgLy8gY2hhbmdlZCwgaXQgd2lsbCB0cmlnZ2VyIGEgcGVyZm9ybVNob3cgdGhhdCBjb3VsZCB0dXJuIHRoZSBzY3JlZW4gb24uCi0gICAgICAgIGdldFdpbmRvdygpLmFkZEZsYWdzKFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfRlVMTFNDUkVFTik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL1ZpcnR1YWxEaXNwbGF5QWN0aXZpdHkuamF2YSBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9WaXJ0dWFsRGlzcGxheUFjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMTJhY2IuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL1ZpcnR1YWxEaXNwbGF5QWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuc2VydmVyLmN0czsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmhhcmR3YXJlLmRpc3BsYXkuRGlzcGxheU1hbmFnZXIuVklSVFVBTF9ESVNQTEFZX0ZMQUdfT1dOX0NPTlRFTlRfT05MWTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5oYXJkd2FyZS5kaXNwbGF5LkRpc3BsYXlNYW5hZ2VyLlZJUlRVQUxfRElTUExBWV9GTEFHX1BVQkxJQzsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5kaXNwbGF5LkRpc3BsYXlNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuZGlzcGxheS5WaXJ0dWFsRGlzcGxheTsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnNlcnZlci5jdHMudG9vbHMuQWN0aXZpdHlMYXVuY2hlcjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlOwotaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLS8qKgotICogQWN0aXZpdHkgdGhhdCBpcyBhYmxlIHRvIGNyZWF0ZSBhbmQgZGVzdHJveSBhIHZpcnR1YWwgZGlzcGxheS4KLSAqLwotcHVibGljIGNsYXNzIFZpcnR1YWxEaXNwbGF5QWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSBpbXBsZW1lbnRzIFN1cmZhY2VIb2xkZXIuQ2FsbGJhY2sgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiVmlydHVhbERpc3BsYXlBY3Rpdml0eSI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9ERU5TSVRZX0RQSSA9IDE2MDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RFTlNJVFlfRFBJID0gImRlbnNpdHlfZHBpIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NBTl9TSE9XX1dJVEhfSU5TRUNVUkVfS0VZR1VBUkQKLSAgICAgICAgICAgID0gImNhbl9zaG93X3dpdGhfaW5zZWN1cmVfa2V5Z3VhcmQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUFVCTElDX0RJU1BMQVkgPSAicHVibGljX2Rpc3BsYXkiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUkVTSVpFX0RJU1BMQVkgPSAicmVzaXplX2Rpc3BsYXkiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTEFVTkNIX1RBUkdFVF9BQ1RJVklUWSA9ICJsYXVuY2hfdGFyZ2V0X2FjdGl2aXR5IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPVU5UID0gImNvdW50IjsKLQotICAgIHByaXZhdGUgRGlzcGxheU1hbmFnZXIgbURpc3BsYXlNYW5hZ2VyOwotCi0gICAgLy8gQ29udGFpbmVyIGZvciBkZXRhaWxzIGFib3V0IGEgcGVuZGluZyB2aXJ0dWFsIGRpc3BsYXkgY3JlYXRpb24gcmVxdWVzdC4KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBWaXJ0dWFsRGlzcGxheVJlcXVlc3QgewotICAgICAgICBwdWJsaWMgZmluYWwgU3VyZmFjZVZpZXcgc3VyZmFjZVZpZXc7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBCdW5kbGUgZXh0cmFzOwotCi0gICAgICAgIHB1YmxpYyBWaXJ0dWFsRGlzcGxheVJlcXVlc3QoU3VyZmFjZVZpZXcgc3VyZmFjZVZpZXcsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgICAgIHRoaXMuc3VyZmFjZVZpZXcgPSBzdXJmYWNlVmlldzsKLSAgICAgICAgICAgIHRoaXMuZXh0cmFzID0gZXh0cmFzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gQ29udGFpbmVyIHRvIGhvbGQgYXNzb2NpYXRpb24gYmV0d2VlbiBhbiBhY3RpdmUgdmlydHVhbCBkaXNwbGF5IGFuZCBzdXJmYWNlIHZpZXcuCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVmlydHVhbERpc3BsYXlFbnRyeSB7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBWaXJ0dWFsRGlzcGxheSBkaXNwbGF5OwotICAgICAgICBwdWJsaWMgZmluYWwgU3VyZmFjZVZpZXcgc3VyZmFjZVZpZXc7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHJlc2l6ZURpc3BsYXk7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgZGVuc2l0eTsKLQotICAgICAgICBwdWJsaWMgVmlydHVhbERpc3BsYXlFbnRyeShWaXJ0dWFsRGlzcGxheSBkaXNwbGF5LCBTdXJmYWNlVmlldyBzdXJmYWNlVmlldywgaW50IGRlbnNpdHksCi0gICAgICAgICAgICAgICAgYm9vbGVhbiByZXNpemVEaXNwbGF5KSB7Ci0gICAgICAgICAgICB0aGlzLmRpc3BsYXkgPSBkaXNwbGF5OwotICAgICAgICAgICAgdGhpcy5zdXJmYWNlVmlldyA9IHN1cmZhY2VWaWV3OwotICAgICAgICAgICAgdGhpcy5kZW5zaXR5ID0gZGVuc2l0eTsKLSAgICAgICAgICAgIHRoaXMucmVzaXplRGlzcGxheSA9IHJlc2l6ZURpc3BsYXk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIEhhc2hNYXA8U3VyZmFjZSwgVmlydHVhbERpc3BsYXlSZXF1ZXN0PiBtUGVuZGluZ0Rpc3BsYXlSZXF1ZXN0czsKLSAgICBwcml2YXRlIEhhc2hNYXA8U3VyZmFjZSwgVmlydHVhbERpc3BsYXlFbnRyeT4gbVZpcnR1YWxEaXNwbGF5czsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLSAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQudmlydHVhbF9kaXNwbGF5X2xheW91dCk7Ci0KLSAgICAgICAgbVZpcnR1YWxEaXNwbGF5cyA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgbVBlbmRpbmdEaXNwbGF5UmVxdWVzdHMgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgICAgIG1EaXNwbGF5TWFuYWdlciA9IChEaXNwbGF5TWFuYWdlcikgZ2V0U3lzdGVtU2VydmljZShESVNQTEFZX1NFUlZJQ0UpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uTmV3SW50ZW50KEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgc3VwZXIub25OZXdJbnRlbnQoaW50ZW50KTsKLSAgICAgICAgZmluYWwgQnVuZGxlIGV4dHJhcyA9IGludGVudC5nZXRFeHRyYXMoKTsKLSAgICAgICAgaWYgKGV4dHJhcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgY29tbWFuZCA9IGV4dHJhcy5nZXRTdHJpbmcoImNvbW1hbmQiKTsKLSAgICAgICAgc3dpdGNoIChjb21tYW5kKSB7Ci0gICAgICAgICAgICBjYXNlICJjcmVhdGVfZGlzcGxheSI6Ci0gICAgICAgICAgICAgICAgY3JlYXRlVmlydHVhbERpc3BsYXkoZXh0cmFzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgImRlc3Ryb3lfZGlzcGxheSI6Ci0gICAgICAgICAgICAgICAgZGVzdHJveVZpcnR1YWxEaXNwbGF5cygpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAicmVzaXplX2Rpc3BsYXkiOgotICAgICAgICAgICAgICAgIHJlc2l6ZURpc3BsYXkoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uRGVzdHJveSgpIHsKLSAgICAgICAgc3VwZXIub25EZXN0cm95KCk7Ci0gICAgICAgIGRlc3Ryb3lWaXJ0dWFsRGlzcGxheXMoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlVmlydHVhbERpc3BsYXkoQnVuZGxlIGV4dHJhcykgewotICAgICAgICBmaW5hbCBpbnQgcmVxdWVzdGVkQ291bnQgPSBleHRyYXMuZ2V0SW50KEtFWV9DT1VOVCwgMSk7Ci0gICAgICAgIExvZy5kKFRBRywgImNyZWF0ZVZpcnR1YWxEaXNwbGF5cy4gcmVxdWVzdGVkIGNvdW50OiIgKyByZXF1ZXN0ZWRDb3VudCk7Ci0KLSAgICAgICAgZm9yIChpbnQgZGlzcGxheUNvdW50ID0gMDsgZGlzcGxheUNvdW50IDwgcmVxdWVzdGVkQ291bnQ7ICsrZGlzcGxheUNvdW50KSB7Ci0gICAgICAgICAgICBmaW5hbCBWaWV3R3JvdXAgcm9vdCA9IChWaWV3R3JvdXApIGZpbmRWaWV3QnlJZChhbmRyb2lkLlIuaWQuY29udGVudCk7Ci0gICAgICAgICAgICBmaW5hbCBTdXJmYWNlVmlldyBzdXJmYWNlVmlldyA9IG5ldyBTdXJmYWNlVmlldyh0aGlzKTsKLSAgICAgICAgICAgIHN1cmZhY2VWaWV3LnNldExheW91dFBhcmFtcyhuZXcgVmlld0dyb3VwLkxheW91dFBhcmFtcygKLSAgICAgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSk7Ci0gICAgICAgICAgICBzdXJmYWNlVmlldy5nZXRIb2xkZXIoKS5hZGRDYWxsYmFjayh0aGlzKTsKLSAgICAgICAgICAgIG1QZW5kaW5nRGlzcGxheVJlcXVlc3RzLnB1dChzdXJmYWNlVmlldy5nZXRIb2xkZXIoKS5nZXRTdXJmYWNlKCksCi0gICAgICAgICAgICAgICAgICAgIG5ldyBWaXJ0dWFsRGlzcGxheVJlcXVlc3Qoc3VyZmFjZVZpZXcsIGV4dHJhcykpOwotICAgICAgICAgICAgcm9vdC5hZGRWaWV3KHN1cmZhY2VWaWV3KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkZXN0cm95VmlydHVhbERpc3BsYXlzKCkgewotICAgICAgICBMb2cuZChUQUcsICJkZXN0cm95VmlydHVhbERpc3BsYXlzIik7Ci0gICAgICAgIGZpbmFsIFZpZXdHcm91cCByb290ID0gKFZpZXdHcm91cCkgZmluZFZpZXdCeUlkKGFuZHJvaWQuUi5pZC5jb250ZW50KTsKLQotICAgICAgICBmb3IgKFZpcnR1YWxEaXNwbGF5RW50cnkgZW50cnkgOiBtVmlydHVhbERpc3BsYXlzLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJkZXN0cm95aW5nOiIgKyBlbnRyeS5kaXNwbGF5KTsKLSAgICAgICAgICAgIGVudHJ5LmRpc3BsYXkucmVsZWFzZSgpOwotICAgICAgICAgICAgcm9vdC5yZW1vdmVWaWV3KGVudHJ5LnN1cmZhY2VWaWV3KTsKLSAgICAgICAgfQotCi0gICAgICAgIG1QZW5kaW5nRGlzcGxheVJlcXVlc3RzLmNsZWFyKCk7Ci0gICAgICAgIG1WaXJ0dWFsRGlzcGxheXMuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdXJmYWNlQ3JlYXRlZChTdXJmYWNlSG9sZGVyIHN1cmZhY2VIb2xkZXIpIHsKLSAgICAgICAgZmluYWwgVmlydHVhbERpc3BsYXlSZXF1ZXN0IGVudHJ5ID0KLSAgICAgICAgICAgICAgICBtUGVuZGluZ0Rpc3BsYXlSZXF1ZXN0cy5yZW1vdmUoc3VyZmFjZUhvbGRlci5nZXRTdXJmYWNlKCkpOwotCi0gICAgICAgIGlmIChlbnRyeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBpbnQgZGVuc2l0eURwaSA9IGVudHJ5LmV4dHJhcy5nZXRJbnQoS0VZX0RFTlNJVFlfRFBJLCBERUZBVUxUX0RFTlNJVFlfRFBJKTsKLSAgICAgICAgZmluYWwgYm9vbGVhbiByZXNpemVEaXNwbGF5ID0gZW50cnkuZXh0cmFzLmdldEJvb2xlYW4oS0VZX1JFU0laRV9ESVNQTEFZKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGxhdW5jaEFjdGl2aXR5TmFtZSA9IGVudHJ5LmV4dHJhcy5nZXRTdHJpbmcoS0VZX0xBVU5DSF9UQVJHRVRfQUNUSVZJVFkpOwotICAgICAgICBmaW5hbCBTdXJmYWNlIHN1cmZhY2UgPSBzdXJmYWNlSG9sZGVyLmdldFN1cmZhY2UoKTsKLQotICAgICAgICAvLyBJbml0aWFsbHksIHRoZSBzdXJmYWNlIHdpbGwgbm90IGhhdmUgYSBzZXQgd2lkdGggb3IgaGVpZ2h0IHNvIHJlbHkgb24gdGhlIHBhcmVudC4KLSAgICAgICAgLy8gVGhpcyBzaG91bGQgYmUgYWNjdXJhdGUgd2l0aCBtYXRjaCBwYXJlbnQgb24gYm90aCBwYXJhbXMuCi0gICAgICAgIGZpbmFsIGludCB3aWR0aCA9IHN1cmZhY2VIb2xkZXIuZ2V0U3VyZmFjZUZyYW1lKCkud2lkdGgoKTsKLSAgICAgICAgZmluYWwgaW50IGhlaWdodCA9IHN1cmZhY2VIb2xkZXIuZ2V0U3VyZmFjZUZyYW1lKCkuaGVpZ2h0KCk7Ci0KLSAgICAgICAgaW50IGZsYWdzID0gMDsKLQotICAgICAgICBmaW5hbCBib29sZWFuIGNhblNob3dXaXRoSW5zZWN1cmVLZXlndWFyZAotICAgICAgICAgICAgICAgID0gZW50cnkuZXh0cmFzLmdldEJvb2xlYW4oS0VZX0NBTl9TSE9XX1dJVEhfSU5TRUNVUkVfS0VZR1VBUkQpOwotICAgICAgICBpZiAoY2FuU2hvd1dpdGhJbnNlY3VyZUtleWd1YXJkKSB7Ci0gICAgICAgICAgICBmbGFncyB8PSAxIDw8IDU7IC8vIFZJUlRVQUxfRElTUExBWV9GTEFHX0NBTl9TSE9XX1dJVEhfSU5TRUNVUkVfS0VZR1VBUkQKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIGJvb2xlYW4gcHVibGljRGlzcGxheSA9IGVudHJ5LmV4dHJhcy5nZXRCb29sZWFuKEtFWV9QVUJMSUNfRElTUExBWSk7Ci0gICAgICAgIGlmIChwdWJsaWNEaXNwbGF5KSB7Ci0gICAgICAgICAgICBmbGFncyB8PSBWSVJUVUFMX0RJU1BMQVlfRkxBR19QVUJMSUMgfCBWSVJUVUFMX0RJU1BMQVlfRkxBR19PV05fQ09OVEVOVF9PTkxZOwotICAgICAgICB9Ci0KLSAgICAgICAgTG9nLmQoVEFHLCAiY3JlYXRlVmlydHVhbERpc3BsYXk6ICIgKyB3aWR0aCArICJ4IiArIGhlaWdodCArICIsIGRwaTogIgotICAgICAgICAgICAgICAgICsgZGVuc2l0eURwaSArICIsIGNhblNob3dXaXRoSW5zZWN1cmVLZXlndWFyZD0iICsgY2FuU2hvd1dpdGhJbnNlY3VyZUtleWd1YXJkCi0gICAgICAgICAgICAgICAgKyAiLCBwdWJsaWNEaXNwbGF5PSIgKyBwdWJsaWNEaXNwbGF5KTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFZpcnR1YWxEaXNwbGF5IHZpcnR1YWxEaXNwbGF5ID0gbURpc3BsYXlNYW5hZ2VyLmNyZWF0ZVZpcnR1YWxEaXNwbGF5KAotICAgICAgICAgICAgICAgICAgICAiVmlydHVhbERpc3BsYXkiICsgbVZpcnR1YWxEaXNwbGF5cy5zaXplKCksIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICBoZWlnaHQsIGRlbnNpdHlEcGksIHN1cmZhY2UsIGZsYWdzKTsKLSAgICAgICAgICAgIG1WaXJ0dWFsRGlzcGxheXMucHV0KHN1cmZhY2UsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBWaXJ0dWFsRGlzcGxheUVudHJ5KHZpcnR1YWxEaXNwbGF5LCBlbnRyeS5zdXJmYWNlVmlldywgZGVuc2l0eURwaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNpemVEaXNwbGF5KSk7Ci0gICAgICAgICAgICBpZiAobGF1bmNoQWN0aXZpdHlOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZGlzcGxheUlkID0gdmlydHVhbERpc3BsYXkuZ2V0RGlzcGxheSgpLmdldERpc3BsYXlJZCgpOwotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkxhdW5jaCBhY3Rpdml0eSBhZnRlciBkaXNwbGF5IGNyZWF0ZWQ6IGFjdGl2aXR5TmFtZT0iCi0gICAgICAgICAgICAgICAgICAgICAgICArIGxhdW5jaEFjdGl2aXR5TmFtZSArICIsIGRpc3BsYXlJZD0iICsgZGlzcGxheUlkKTsKLSAgICAgICAgICAgICAgICBsYXVuY2hBY3Rpdml0eShsYXVuY2hBY3Rpdml0eU5hbWUsIGRpc3BsYXlJZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmaW5hbCBWaWV3R3JvdXAgcm9vdCA9IChWaWV3R3JvdXApIGZpbmRWaWV3QnlJZChhbmRyb2lkLlIuaWQuY29udGVudCk7Ci0gICAgICAgICAgICAvLyBUaGlzIGlzIGV4cGVjdGVkIHdoZW4gdHJ5aW5nIHRvIGNyZWF0ZSBzaG93LXdoZW4tbG9ja2VkIHB1YmxpYyBkaXNwbGF5LgotICAgICAgICAgICAgcm9vdC5yZW1vdmVWaWV3KGVudHJ5LnN1cmZhY2VWaWV3KTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3VyZmFjZUNoYW5nZWQoU3VyZmFjZUhvbGRlciBzdXJmYWNlSG9sZGVyLCBpbnQgZm9ybWF0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgZmluYWwgVmlydHVhbERpc3BsYXlFbnRyeSBlbnRyeSA9IG1WaXJ0dWFsRGlzcGxheXMuZ2V0KHN1cmZhY2VIb2xkZXIuZ2V0U3VyZmFjZSgpKTsKLQotICAgICAgICBpZiAoZW50cnkgIT0gbnVsbCAmJiBlbnRyeS5yZXNpemVEaXNwbGF5KSB7Ci0gICAgICAgICAgICBlbnRyeS5kaXNwbGF5LnJlc2l6ZSh3aWR0aCwgaGVpZ2h0LCBlbnRyeS5kZW5zaXR5KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHN1cmZhY2VEZXN0cm95ZWQoU3VyZmFjZUhvbGRlciBzdXJmYWNlSG9sZGVyKSB7Ci0gICAgfQotCi0gICAgLyoqIFJlc2l6ZSB2aXJ0dWFsIGRpc3BsYXkgdG8gaGFsZiBvZiB0aGUgc3VyZmFjZSBmcmFtZSBzaXplLiAqLwotICAgIHByaXZhdGUgdm9pZCByZXNpemVEaXNwbGF5KCkgewotICAgICAgICBmaW5hbCBWaXJ0dWFsRGlzcGxheUVudHJ5IHZkID0gKFZpcnR1YWxEaXNwbGF5RW50cnkpIG1WaXJ0dWFsRGlzcGxheXMudmFsdWVzKCkudG9BcnJheSgpWzBdOwotICAgICAgICBmaW5hbCBTdXJmYWNlSG9sZGVyIHN1cmZhY2VIb2xkZXIgPSB2ZC5zdXJmYWNlVmlldy5nZXRIb2xkZXIoKTsKLSAgICAgICAgdmQuZGlzcGxheS5yZXNpemUoc3VyZmFjZUhvbGRlci5nZXRTdXJmYWNlRnJhbWUoKS53aWR0aCgpIC8gMiwKLSAgICAgICAgICAgICAgICBzdXJmYWNlSG9sZGVyLmdldFN1cmZhY2VGcmFtZSgpLmhlaWdodCgpIC8gMiwgdmQuZGVuc2l0eSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGxhdW5jaEFjdGl2aXR5KFN0cmluZyBhY3Rpdml0eU5hbWUsIGludCBkaXNwbGF5SWQpIHsKLSAgICAgICAgZmluYWwgQnVuZGxlIGV4dHJhcyA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgZXh0cmFzLnB1dEJvb2xlYW4oImxhdW5jaF9hY3Rpdml0eSIsIHRydWUpOwotICAgICAgICBleHRyYXMucHV0U3RyaW5nKCJ0YXJnZXRfYWN0aXZpdHkiLCBhY3Rpdml0eU5hbWUpOwotICAgICAgICBleHRyYXMucHV0SW50KCJkaXNwbGF5X2lkIiwgZGlzcGxheUlkKTsKLSAgICAgICAgQWN0aXZpdHlMYXVuY2hlci5sYXVuY2hBY3Rpdml0eUZyb21FeHRyYXModGhpcywgZXh0cmFzKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvVnJUZXN0QWN0aXZpdHkuamF2YSBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9WclRlc3RBY3Rpdml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWYyNWUyLi4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9WclRlc3RBY3Rpdml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnNlcnZlci5jdHM7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci52ci5Nb2NrVnJMaXN0ZW5lclNlcnZpY2U7Ci0KLS8qKgotICogQWN0aXZpdHkgdGhhdCBpcyBhYmxlIHRvIGNyZWF0ZSBhbmQgZGVzdHJveSBhIHZpcnR1YWwgZGlzcGxheS4KLSAqLwotcHVibGljIGNsYXNzIFZyVGVzdEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiVnJUZXN0QWN0aXZpdHkiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgaWYgKERFQlVHKSBMb2cuaShUQUcsICJvbkNyZWF0ZSBjYWxsZWQuIik7Ci0gICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXRWck1vZGVFbmFibGVkKHRydWUsIG5ldyBDb21wb25lbnROYW1lKHRoaXMsIE1vY2tWckxpc3RlbmVyU2VydmljZS5jbGFzcykpOwotICAgICAgICB9IGNhdGNoIChQYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ291bGQgbm90IHNldCBWUiBtb2RlOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKLSAgICAgICAgaWYgKERFQlVHKSBMb2cuaShUQUcsICJvblJlc3VtZSBjYWxsZWQuIik7Ci0gICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25XaW5kb3dGb2N1c0NoYW5nZWQoYm9vbGVhbiBoYXNGb2N1cykgewotICAgICAgICBpZiAoREVCVUcpIExvZy5pKFRBRywgIm9uV2luZG93Rm9jdXNDaGFuZ2VkIGNhbGxlZCB3aXRoICIgKyBoYXNGb2N1cyk7Ci0gICAgICAgIHN1cGVyLm9uV2luZG93Rm9jdXNDaGFuZ2VkKGhhc0ZvY3VzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvblBhdXNlKCkgewotICAgICAgICBpZiAoREVCVUcpIExvZy5pKFRBRywgIm9uUGF1c2UgY2FsbGVkLiIpOwotICAgICAgICBzdXBlci5vblBhdXNlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL1dhbGxwYXBlckFjdGl2aXR5LmphdmEgYi9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvV2FsbHBhcGVyQWN0aXZpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNlMTFkNS4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvV2FsbHBhcGVyQWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuY3RzOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7Ci0KLXB1YmxpYyBjbGFzcyBXYWxscGFwZXJBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy90b29scy9BY3Rpdml0eUxhdW5jaGVyLmphdmEgYi9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvdG9vbHMvQWN0aXZpdHlMYXVuY2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWI1NWY1Li4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy90b29scy9BY3Rpdml0eUxhdW5jaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuc2VydmVyLmN0cy50b29sczsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50LkZMQUdfQUNUSVZJVFlfTEFVTkNIX0FESkFDRU5UOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50LkZMQUdfQUNUSVZJVFlfTVVMVElQTEVfVEFTSzsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LkludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50LkZMQUdfQUNUSVZJVFlfUkVPUkRFUl9UT19GUk9OVDsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5T3B0aW9uczsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnNlcnZlci5jdHMuVGVzdEFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLS8qKiBVdGlsaXR5IGNsYXNzIHdoaWNoIGNvbnRhaW5zIGNvbW1vbiBjb2RlIGZvciBsYXVuY2hpbmcgYWN0aXZpdGllcy4gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUxhdW5jaGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gQWN0aXZpdHlMYXVuY2hlci5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbGF1bmNoQWN0aXZpdHlGcm9tRXh0cmFzKGZpbmFsIENvbnRleHQgY29udGV4dCwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBpZiAoZXh0cmFzID09IG51bGwgfHwgIWV4dHJhcy5nZXRCb29sZWFuKCJsYXVuY2hfYWN0aXZpdHkiKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgTG9nLmkoVEFHLCAibGF1bmNoQWN0aXZpdHlGcm9tRXh0cmFzOiBleHRyYXM9IiArIGV4dHJhcyk7Ci0KLSAgICAgICAgZmluYWwgSW50ZW50IG5ld0ludGVudCA9IG5ldyBJbnRlbnQoKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHRhcmdldEFjdGl2aXR5ID0gZXh0cmFzLmdldFN0cmluZygidGFyZ2V0X2FjdGl2aXR5Iik7Ci0gICAgICAgIGlmICh0YXJnZXRBY3Rpdml0eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZXh0cmFQYWNrYWdlTmFtZSA9IGV4dHJhcy5nZXRTdHJpbmcoInBhY2thZ2VfbmFtZSIpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBhY2thZ2VOYW1lID0gZXh0cmFQYWNrYWdlTmFtZSAhPSBudWxsID8gZXh0cmFQYWNrYWdlTmFtZQotICAgICAgICAgICAgICAgICAgICA6IGNvbnRleHQuZ2V0QXBwbGljYXRpb25Db250ZXh0KCkuZ2V0UGFja2FnZU5hbWUoKTsKLSAgICAgICAgICAgIG5ld0ludGVudC5zZXRDb21wb25lbnQobmV3IENvbXBvbmVudE5hbWUocGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lICsgIi4iICsgdGFyZ2V0QWN0aXZpdHkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5ld0ludGVudC5zZXRDbGFzcyhjb250ZXh0LCBUZXN0QWN0aXZpdHkuY2xhc3MpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGV4dHJhcy5nZXRCb29sZWFuKCJsYXVuY2hfdG9fdGhlX3NpZGUiKSkgewotICAgICAgICAgICAgbmV3SW50ZW50LmFkZEZsYWdzKEZMQUdfQUNUSVZJVFlfTkVXX1RBU0sgfCBGTEFHX0FDVElWSVRZX0xBVU5DSF9BREpBQ0VOVCk7Ci0gICAgICAgICAgICBpZiAoZXh0cmFzLmdldEJvb2xlYW4oInJhbmRvbV9kYXRhIikpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBVcmkgZGF0YSA9IG5ldyBVcmkuQnVpbGRlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAucGF0aChTdHJpbmcudmFsdWVPZihTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLSAgICAgICAgICAgICAgICBuZXdJbnRlbnQuc2V0RGF0YShkYXRhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoZXh0cmFzLmdldEJvb2xlYW4oIm11bHRpcGxlX3Rhc2siKSkgewotICAgICAgICAgICAgbmV3SW50ZW50LmFkZEZsYWdzKEZMQUdfQUNUSVZJVFlfTVVMVElQTEVfVEFTSyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGV4dHJhcy5nZXRCb29sZWFuKCJuZXdfdGFzayIpKSB7Ci0gICAgICAgICAgICBuZXdJbnRlbnQuYWRkRmxhZ3MoRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXh0cmFzLmdldEJvb2xlYW4oInJlb3JkZXJfdG9fZnJvbnQiKSkgewotICAgICAgICAgICAgbmV3SW50ZW50LmFkZEZsYWdzKEZMQUdfQUNUSVZJVFlfUkVPUkRFUl9UT19GUk9OVCk7Ci0gICAgICAgIH0KLQotICAgICAgICBBY3Rpdml0eU9wdGlvbnMgb3B0aW9ucyA9IG51bGw7Ci0gICAgICAgIGZpbmFsIGludCBkaXNwbGF5SWQgPSBleHRyYXMuZ2V0SW50KCJkaXNwbGF5X2lkIiwgLTEpOwotICAgICAgICBpZiAoZGlzcGxheUlkICE9IC0xKSB7Ci0gICAgICAgICAgICBvcHRpb25zID0gQWN0aXZpdHlPcHRpb25zLm1ha2VCYXNpYygpOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRMYXVuY2hEaXNwbGF5SWQoZGlzcGxheUlkKTsKLSAgICAgICAgICAgIG5ld0ludGVudC5hZGRGbGFncyhGTEFHX0FDVElWSVRZX05FV19UQVNLIHwgRkxBR19BQ1RJVklUWV9NVUxUSVBMRV9UQVNLKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250ZXh0LnN0YXJ0QWN0aXZpdHkobmV3SW50ZW50LCBvcHRpb25zICE9IG51bGwgPyBvcHRpb25zLnRvQnVuZGxlKCkgOiBudWxsKTsKLSAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiU2VjdXJpdHlFeGNlcHRpb24gbGF1bmNoaW5nIGFjdGl2aXR5Iik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwRGVidWdnYWJsZS9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcERlYnVnZ2FibGUvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRiMDhhMi4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwRGVidWdnYWJsZS9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi0jIGRvbid0IGluY2x1ZGUgdGhpcyBwYWNrYWdlIGluIGFueSB0YXJnZXQKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKLQotTE9DQUxfU0RLX1ZFUlNJT04gOj0gdGVzdF9jdXJyZW50Ci0KLSMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCi0KLUxPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNEZXZpY2VEZWJ1Z2dhYmxlQXBwCi0KLWluY2x1ZGUgJChCVUlMRF9DVFNfU1VQUE9SVF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcERlYnVnZ2FibGUvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHBEZWJ1Z2dhYmxlL0FuZHJvaWRNYW5pZmVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMGYyYjYuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcERlYnVnZ2FibGUvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tCi0gICAgIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgICAgcGFja2FnZT0iYW5kcm9pZC5zZXJ2ZXIuY3RzLmRlYnVnZ2FibGUiPgotCi0gICAgPCEtLQotICAgICAqIFNlY3VyaXR5IHBvbGljeSByZXF1aXJlcyB0aGF0IG9ubHkgZGVidWdnYWJsZSBwcm9jZXNzZXMgY2FuIGJlIHByb2ZpbGVkCi0gICAgICogd2hpY2ggaXMgdGVzdGVkIGJ5IEFjdGl2aXR5TWFuYWdlckFtUHJvZmlsZVRlc3RzLgotICAgICAtLT4KLSAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpkZWJ1Z2dhYmxlPSJ0cnVlIj4KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLkRlYnVnZ2FibGVBcHBBY3Rpdml0eSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cmVzaXplYWJsZUFjdGl2aXR5PSJ0cnVlIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIgLz4KLSAgICA8L2FwcGxpY2F0aW9uPgotCi08L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcERlYnVnZ2FibGUvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9kZWJ1Z2dhYmxlL0RlYnVnZ2FibGVBcHBBY3Rpdml0eS5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcERlYnVnZ2FibGUvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9kZWJ1Z2dhYmxlL0RlYnVnZ2FibGVBcHBBY3Rpdml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDRmZmNmLi4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHBEZWJ1Z2dhYmxlL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvZGVidWdnYWJsZS9EZWJ1Z2dhYmxlQXBwQWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuY3RzLmRlYnVnZ2FibGU7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKLQotcHVibGljIGNsYXNzIERlYnVnZ2FibGVBcHBBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHBEaXNwbGF5U2l6ZS9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcERpc3BsYXlTaXplL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZmViNjEuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcERpc3BsYXlTaXplL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLSMgZG9uJ3QgaW5jbHVkZSB0aGlzIHBhY2thZ2UgaW4gYW55IHRhcmdldAotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQotCi1MT0NBTF9TREtfVkVSU0lPTiA6PSB0ZXN0X2N1cnJlbnQKLQotIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKLQotTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0RldmljZURpc3BsYXlTaXplQXBwCi0KLWluY2x1ZGUgJChCVUlMRF9DVFNfU1VQUE9SVF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcERpc3BsYXlTaXplL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwRGlzcGxheVNpemUvQW5kcm9pZE1hbmlmZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzcyNzc1OS4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwRGlzcGxheVNpemUvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tCi0gICAgIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgICAgcGFja2FnZT0iYW5kcm9pZC5kaXNwbGF5c2l6ZS5hcHAiPgotCi0gICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5ESVNBQkxFX0tFWUdVQVJEIiAvPgotCi0gICAgPCEtLSBTZXQgYSByaWRpY3Vsb3VzbHkgaGlnaCB2YWx1ZSBmb3IgcmVxdWlyZWQgc21hbGxlc3Qgd2lkdGguIEhvcGVmdWxseQotICAgICAgICAgd2UgbmV2ZXIgaGF2ZSB0byBydW4gQ1RTIG9uIFRpbWVzIFNxdWFyZSBkaXNwbGF5LiAtLT4KLSAgICA8c3VwcG9ydHMtc2NyZWVucyBhbmRyb2lkOnJlcXVpcmVzU21hbGxlc3RXaWR0aERwPSIxMDAwMDAiIC8+Ci0KLSAgICA8YXBwbGljYXRpb24+Ci0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5TbWFsbGVzdFdpZHRoQWN0aXZpdHkiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIiAvPgotICAgIDwvYXBwbGljYXRpb24+Ci0KLTwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwRGlzcGxheVNpemUvc3JjL2FuZHJvaWQvZGlzcGxheXNpemUvYXBwL1NtYWxsZXN0V2lkdGhBY3Rpdml0eS5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcERpc3BsYXlTaXplL3NyYy9hbmRyb2lkL2Rpc3BsYXlzaXplL2FwcC9TbWFsbGVzdFdpZHRoQWN0aXZpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRhNDRjNy4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwRGlzcGxheVNpemUvc3JjL2FuZHJvaWQvZGlzcGxheXNpemUvYXBwL1NtYWxsZXN0V2lkdGhBY3Rpdml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5kaXNwbGF5c2l6ZS5hcHA7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgU21hbGxlc3RXaWR0aEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25OZXdJbnRlbnQoSW50ZW50IGludGVudCkgewotICAgICAgICBzdXBlci5vbk5ld0ludGVudChpbnRlbnQpOwotCi0gICAgICAgIGZpbmFsIEJ1bmRsZSBleHRyYXMgPSBpbnRlbnQuZ2V0RXh0cmFzKCk7Ci0gICAgICAgIGlmIChleHRyYXMgIT0gbnVsbCAmJiBleHRyYXMuZ2V0Qm9vbGVhbigibGF1bmNoX2Fub3RoZXJfYWN0aXZpdHkiKSkgewotICAgICAgICAgICAgSW50ZW50IHN0YXJ0SW50ZW50ID0gbmV3IEludGVudCgpOwotICAgICAgICAgICAgc3RhcnRJbnRlbnQuc2V0Q29tcG9uZW50KAotICAgICAgICAgICAgICAgICAgICBuZXcgQ29tcG9uZW50TmFtZSgiYW5kcm9pZC5zZXJ2ZXIuY3RzIiwgImFuZHJvaWQuc2VydmVyLmN0cy5UZXN0QWN0aXZpdHkiKSk7Ci0gICAgICAgICAgICBzdGFydEFjdGl2aXR5KHN0YXJ0SW50ZW50KTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHBTZWNvbmRVaWQvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHBTZWNvbmRVaWQvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ1NmQyMi4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwU2Vjb25kVWlkL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLSMgZG9uJ3QgaW5jbHVkZSB0aGlzIHBhY2thZ2UgaW4gYW55IHRhcmdldAotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQotCi1MT0NBTF9TREtfVkVSU0lPTiA6PSB0ZXN0X2N1cnJlbnQKLQotIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKLQotTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0RldmljZVNlcnZpY2VzVGVzdFNlY29uZEFwcAotCi1pbmNsdWRlICQoQlVJTERfQ1RTX1NVUFBPUlRfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHBTZWNvbmRVaWQvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHBTZWNvbmRVaWQvQW5kcm9pZE1hbmlmZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNhYTJkNC4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwU2Vjb25kVWlkL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLQotICAgICBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICAgIHBhY2thZ2U9ImFuZHJvaWQuc2VydmVyLmN0cy5zZWNvbmQiPgotCi0gICAgPGFwcGxpY2F0aW9uPgotICAgICAgICA8YWN0aXZpdHkKLSAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iLlNlY29uZEFjdGl2aXR5IgotICAgICAgICAgICAgYW5kcm9pZDpyZXNpemVhYmxlQWN0aXZpdHk9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmFsbG93RW1iZWRkZWQ9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIiAvPgotICAgICAgICA8YWN0aXZpdHkKLSAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iLlNlY29uZEFjdGl2aXR5Tm9FbWJlZGRpbmciCi0gICAgICAgICAgICBhbmRyb2lkOnJlc2l6ZWFibGVBY3Rpdml0eT0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6YWxsb3dFbWJlZGRlZD0iZmFsc2UiCi0gICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIiAvPgotICAgICAgICA8cmVjZWl2ZXIKLSAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iLkxhdW5jaEJyb2FkY2FzdFJlY2VpdmVyIgotICAgICAgICAgICAgYW5kcm9pZDplbmFibGVkPSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIgPgotICAgICAgICAgICAgPGludGVudC1maWx0ZXI+Ci0gICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc2VydmVyLmN0cy5zZWNvbmQuTEFVTkNIX0JST0FEQ0FTVF9BQ1RJT04iLz4KLSAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KLSAgICAgICAgPC9yZWNlaXZlcj4KLSAgICA8L2FwcGxpY2F0aW9uPgotCi08L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcFNlY29uZFVpZC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL3NlY29uZC9MYXVuY2hCcm9hZGNhc3RSZWNlaXZlci5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcFNlY29uZFVpZC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL3NlY29uZC9MYXVuY2hCcm9hZGNhc3RSZWNlaXZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGViYjg2Li4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHBTZWNvbmRVaWQvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9zZWNvbmQvTGF1bmNoQnJvYWRjYXN0UmVjZWl2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuY3RzLnNlY29uZDsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5T3B0aW9uczsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi0vKiogQnJvYWRjYXN0IHJlY2VpdmVyIHRoYXQgY2FuIGxhdW5jaCBhY3Rpdml0aWVzLiAqLwotcHVibGljIGNsYXNzIExhdW5jaEJyb2FkY2FzdFJlY2VpdmVyIGV4dGVuZHMgQnJvYWRjYXN0UmVjZWl2ZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBMYXVuY2hCcm9hZGNhc3RSZWNlaXZlci5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgIGZpbmFsIEJ1bmRsZSBleHRyYXMgPSBpbnRlbnQuZ2V0RXh0cmFzKCk7Ci0gICAgICAgIGZpbmFsIEludGVudCBuZXdJbnRlbnQgPSBuZXcgSW50ZW50KCk7Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIHRhcmdldEFjdGl2aXR5ID0gZXh0cmFzICE9IG51bGwgPyBleHRyYXMuZ2V0U3RyaW5nKCJ0YXJnZXRfYWN0aXZpdHkiKSA6IG51bGw7Ci0gICAgICAgIGlmICh0YXJnZXRBY3Rpdml0eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBleHRyYXMuZ2V0U3RyaW5nKCJwYWNrYWdlX25hbWUiKTsKLSAgICAgICAgICAgIG5ld0ludGVudC5zZXRDb21wb25lbnQobmV3IENvbXBvbmVudE5hbWUocGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lICsgIi4iICsgdGFyZ2V0QWN0aXZpdHkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5ld0ludGVudC5zZXRDbGFzcyhjb250ZXh0LCBTZWNvbmRBY3Rpdml0eS5jbGFzcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBBY3Rpdml0eU9wdGlvbnMgb3B0aW9ucyA9IEFjdGl2aXR5T3B0aW9ucy5tYWtlQmFzaWMoKTsKLSAgICAgICAgaW50IGRpc3BsYXlJZCA9IGV4dHJhcy5nZXRJbnQoImRpc3BsYXlfaWQiLCAtMSk7Ci0gICAgICAgIGlmIChkaXNwbGF5SWQgIT0gLTEpIHsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0TGF1bmNoRGlzcGxheUlkKGRpc3BsYXlJZCk7Ci0gICAgICAgICAgICBuZXdJbnRlbnQuc2V0RmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0sgfCBJbnRlbnQuRkxBR19BQ1RJVklUWV9NVUxUSVBMRV9UQVNLKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5ld0ludGVudC5zZXRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udGV4dC5zdGFydEFjdGl2aXR5KG5ld0ludGVudCwgb3B0aW9ucy50b0J1bmRsZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiU2VjdXJpdHlFeGNlcHRpb24gbGF1bmNoaW5nIGFjdGl2aXR5Iik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwU2Vjb25kVWlkL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvc2Vjb25kL1NlY29uZEFjdGl2aXR5LmphdmEgYi9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwU2Vjb25kVWlkL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvc2Vjb25kL1NlY29uZEFjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYTllZDUuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcFNlY29uZFVpZC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL3NlY29uZC9TZWNvbmRBY3Rpdml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnNlcnZlci5jdHMuc2Vjb25kOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7Ci0KLXB1YmxpYyBjbGFzcyBTZWNvbmRBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHBTZWNvbmRVaWQvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9zZWNvbmQvU2Vjb25kQWN0aXZpdHlOb0VtYmVkZGluZy5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcFNlY29uZFVpZC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL3NlY29uZC9TZWNvbmRBY3Rpdml0eU5vRW1iZWRkaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0M2UwMDguLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcFNlY29uZFVpZC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL3NlY29uZC9TZWNvbmRBY3Rpdml0eU5vRW1iZWRkaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuc2VydmVyLmN0cy5zZWNvbmQ7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKLQotcHVibGljIGNsYXNzIFNlY29uZEFjdGl2aXR5Tm9FbWJlZGRpbmcgZXh0ZW5kcyBBY3Rpdml0eSB7Ci19CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwVGhpcmRVaWQvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHBUaGlyZFVpZC9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzNmN2E5Li4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHBUaGlyZFVpZC9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi0jIGRvbid0IGluY2x1ZGUgdGhpcyBwYWNrYWdlIGluIGFueSB0YXJnZXQKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKLQotTE9DQUxfU0RLX1ZFUlNJT04gOj0gdGVzdF9jdXJyZW50Ci0KLSMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCi0KLUxPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNEZXZpY2VTZXJ2aWNlc1Rlc3RUaGlyZEFwcAotCi1pbmNsdWRlICQoQlVJTERfQ1RTX1NVUFBPUlRfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHBUaGlyZFVpZC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcFRoaXJkVWlkL0FuZHJvaWRNYW5pZmVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZDI0YzcuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcFRoaXJkVWlkL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLQotICAgICBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICAgIHBhY2thZ2U9ImFuZHJvaWQuc2VydmVyLmN0cy50aGlyZCI+Ci0KLSAgICA8YXBwbGljYXRpb24+Ci0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5UaGlyZEFjdGl2aXR5IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpyZXNpemVhYmxlQWN0aXZpdHk9InRydWUiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmFsbG93RW1iZWRkZWQ9InRydWUiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIiAvPgotICAgIDwvYXBwbGljYXRpb24+Ci0KLTwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwVGhpcmRVaWQvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy90aGlyZC9UaGlyZEFjdGl2aXR5LmphdmEgYi9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwVGhpcmRVaWQvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy90aGlyZC9UaGlyZEFjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZGRjM2QuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcFRoaXJkVWlkL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvdGhpcmQvVGhpcmRBY3Rpdml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnNlcnZlci5jdHMudGhpcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKLQotcHVibGljIGNsYXNzIFRoaXJkQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7Ci19CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9BY3Rpdml0eUFuZFdpbmRvd01hbmFnZXJPdmVycmlkZUNvbmZpZ1Rlc3RzLmphdmEgYi9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9BY3Rpdml0eUFuZFdpbmRvd01hbmFnZXJPdmVycmlkZUNvbmZpZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkZDdlNDIuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvQWN0aXZpdHlBbmRXaW5kb3dNYW5hZ2VyT3ZlcnJpZGVDb25maWdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuY3RzOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkxvZy5Mb2dMZXZlbDsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuQ29sbGVjdGluZ091dHB1dFJlY2VpdmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5EZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQubG9nLkxvZ1V0aWwuQ0xvZzsKLQotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmN0cy5TdGF0ZUxvZ2dlci5sb2c7Ci0KLS8qKgotICogQnVpbGQ6IG1tbWEgLWozMiBjdHMvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcwotICogUnVuOiBjdHMvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvdXRpbC9ydW4tdGVzdCBDdHNTZXJ2aWNlc0hvc3RUZXN0Q2FzZXMgYW5kcm9pZC5zZXJ2ZXIuY3RzLkFjdGl2aXR5QW5kV2luZG93TWFuYWdlck92ZXJyaWRlQ29uZmlnVGVzdHMKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5QW5kV2luZG93TWFuYWdlck92ZXJyaWRlQ29uZmlnVGVzdHMgZXh0ZW5kcyBBY3Rpdml0eU1hbmFnZXJUZXN0QmFzZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQUNUSVZJVFlfTkFNRSA9ICJMb2dDb25maWd1cmF0aW9uQWN0aXZpdHkiOwotCi0gICAgcHJpdmF0ZSBjbGFzcyBDb25maWd1cmF0aW9uQ2hhbmdlT2JzZXJ2ZXIgewotICAgICAgICBwcml2YXRlIGZpbmFsIFBhdHRlcm4gbUNvbmZpZ3VyYXRpb25DaGFuZ2VkUGF0dGVybiA9Ci0gICAgICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoIiguKylDb25maWd1cmF0aW9uIGNoYW5nZWQ6IChcXGQrKSwoXFxkKykiKTsKLQotICAgICAgICBwcml2YXRlIENvbmZpZ3VyYXRpb25DaGFuZ2VPYnNlcnZlcigpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBmaW5kQ29uZmlndXJhdGlvbkNoYW5nZShTdHJpbmcgYWN0aXZpdHlOYW1lLCBTdHJpbmcgbG9nU2VwYXJhdG9yKQotICAgICAgICAgICAgICAgIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGludCB0cmllcyA9IDA7Ci0gICAgICAgICAgICBib29sZWFuIG9ic2VydmVkQ2hhbmdlID0gZmFsc2U7Ci0gICAgICAgICAgICB3aGlsZSAodHJpZXMgPCA1ICYmICFvYnNlcnZlZENoYW5nZSkgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIGxpbmVzID0gZ2V0RGV2aWNlTG9nc0ZvckNvbXBvbmVudChhY3Rpdml0eU5hbWUsIGxvZ1NlcGFyYXRvcik7Ci0gICAgICAgICAgICAgICAgbG9nKCJMb29raW5nIGF0IGxvZ2NhdCIpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBsaW5lcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbGluZSA9IGxpbmVzW2ldLnRyaW0oKTsKLSAgICAgICAgICAgICAgICAgICAgbG9nKGxpbmUpOwotICAgICAgICAgICAgICAgICAgICBNYXRjaGVyIG1hdGNoZXIgPSBtQ29uZmlndXJhdGlvbkNoYW5nZWRQYXR0ZXJuLm1hdGNoZXIobGluZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaGVyLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZWRDaGFuZ2UgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdHJpZXMrKzsKLSAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNTAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvYnNlcnZlZENoYW5nZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZWNlaXZlT3ZlcnJpZGVDb25maWdGcm9tUmVsYXlvdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0c0ZyZWVmb3JtKCkpIHsKLSAgICAgICAgICAgIENMb2cubG9nQW5kRGlzcGxheShMb2dMZXZlbC5JTkZPLCAiRGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBmcmVlZm9ybS4gU2tpcHBpbmcgdGVzdC4iKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5SW5TdGFjayhURVNUX0FDVElWSVRZX05BTUUsIEZSRUVGT1JNX1dPUktTUEFDRV9TVEFDS19JRCk7Ci0KLSAgICAgICAgc2V0RGV2aWNlUm90YXRpb24oMCk7Ci0gICAgICAgIFN0cmluZyBsb2dTZXBhcmF0b3IgPSBjbGVhckxvZ2NhdCgpOwotICAgICAgICByZXNpemVBY3Rpdml0eVRhc2soVEVTVF9BQ1RJVklUWV9OQU1FLCAwLCAwLCAxMDAsIDEwMCk7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25DaGFuZ2VPYnNlcnZlciBjID0gbmV3IENvbmZpZ3VyYXRpb25DaGFuZ2VPYnNlcnZlcigpOwotICAgICAgICBmaW5hbCBib29sZWFuIHJlcG9ydGVkU2l6ZUFmdGVyUmVzaXplID0gYy5maW5kQ29uZmlndXJhdGlvbkNoYW5nZShURVNUX0FDVElWSVRZX05BTUUsCi0gICAgICAgICAgICAgICAgbG9nU2VwYXJhdG9yKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgdG8gb2JzZXJ2ZSBjb25maWd1cmF0aW9uIGNoYW5nZSB3aGVuIHJlc2l6aW5nIiwKLSAgICAgICAgICAgICAgICByZXBvcnRlZFNpemVBZnRlclJlc2l6ZSk7Ci0KLSAgICAgICAgbG9nU2VwYXJhdG9yID0gY2xlYXJMb2djYXQoKTsKLSAgICAgICAgc2V0RGV2aWNlUm90YXRpb24oMik7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gcmVwb3J0ZWRTaXplQWZ0ZXJSb3RhdGlvbiA9IGMuZmluZENvbmZpZ3VyYXRpb25DaGFuZ2UoVEVTVF9BQ1RJVklUWV9OQU1FLAotICAgICAgICAgICAgICAgIGxvZ1NlcGFyYXRvcik7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJOb3QgZXhwZWN0ZWQgdG8gb2JzZXJ2ZSBjb25maWd1cmF0aW9uIGNoYW5nZSBhZnRlciBmbGlwIHJvdGF0aW9uIiwKLSAgICAgICAgICAgICAgICByZXBvcnRlZFNpemVBZnRlclJvdGF0aW9uKTsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0FjdGl2aXR5TWFuYWdlckFjdGl2aXR5VmlzaWJpbGl0eVRlc3RzLmphdmEgYi9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9BY3Rpdml0eU1hbmFnZXJBY3Rpdml0eVZpc2liaWxpdHlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTFmMjRhLi4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0FjdGl2aXR5TWFuYWdlckFjdGl2aXR5VmlzaWJpbGl0eVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnNlcnZlci5jdHM7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuY3RzLkFjdGl2aXR5TWFuYWdlclN0YXRlLlNUQVRFX1JFU1VNRUQ7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmN0cy5TdGF0ZUxvZ2dlci5sb2dFOwotCi1pbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlByZXN1Ym1pdDsKLQotaW1wb3J0IGphdmEubGFuZy5FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLlN0cmluZzsKLQotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5kZG1saWIuTG9nLkxvZ0xldmVsLklORk87Ci0KLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5sb2cuTG9nVXRpbC5DTG9nOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5EZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb247Ci0KLS8qKgotICogQnVpbGQ6IG1tbWEgLWozMiBjdHMvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcwotICogUnVuOiBjdHMvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvdXRpbC9ydW4tdGVzdCBDdHNTZXJ2aWNlc0hvc3RUZXN0Q2FzZXMgYW5kcm9pZC5zZXJ2ZXIuY3RzLkFjdGl2aXR5TWFuYWdlckFjdGl2aXR5VmlzaWJpbGl0eVRlc3RzCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eU1hbmFnZXJBY3Rpdml0eVZpc2liaWxpdHlUZXN0cyBleHRlbmRzIEFjdGl2aXR5TWFuYWdlclRlc3RCYXNlIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBTlNMVUNFTlRfQUNUSVZJVFkgPSAiQWx3YXlzRm9jdXNhYmxlUGlwQWN0aXZpdHkiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQSVBfT05fUElQX0FDVElWSVRZID0gIkxhdW5jaFBpcE9uUGlwQWN0aXZpdHkiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0FDVElWSVRZX05BTUUgPSAiVGVzdEFjdGl2aXR5IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBTlNMVUNFTlRfQUNUSVZJVFlfTkFNRSA9ICJUcmFuc2x1Y2VudEFjdGl2aXR5IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DS0VEX0FDVElWSVRZX05BTUUgPSAiRG9ja2VkQWN0aXZpdHkiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUVVJOX1NDUkVFTl9PTl9BQ1RJVklUWV9OQU1FID0gIlR1cm5TY3JlZW5PbkFjdGl2aXR5IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9WRV9UQVNLX1RPX0JBQ0tfQUNUSVZJVFlfTkFNRSA9ICJNb3ZlVGFza1RvQmFja0FjdGl2aXR5IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1dJUEVfUkVGUkVTSF9BQ1RJVklUWSA9ICJTd2lwZVJlZnJlc2hBY3Rpdml0eSI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ISVNUT1JZX0FDVElWSVRZID0gIk5vSGlzdG9yeUFjdGl2aXR5IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFVSTl9TQ1JFRU5fT05fQVRUUl9BQ1RJVklUWV9OQU1FID0gIlR1cm5TY3JlZW5PbkF0dHJBY3Rpdml0eSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRVUk5fU0NSRUVOX09OX1NIT1dfT05fTE9DS19BQ1RJVklUWV9OQU1FID0gIlR1cm5TY3JlZW5PblNob3dPbkxvY2tBY3Rpdml0eSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRVUk5fU0NSRUVOX09OX0FUVFJfUkVNT1ZFX0FUVFJfQUNUSVZJVFlfTkFNRSA9ICJUdXJuU2NyZWVuT25BdHRyUmVtb3ZlQXR0ckFjdGl2aXR5IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFVSTl9TQ1JFRU5fT05fU0lOR0xFX1RBU0tfQUNUSVZJVFlfTkFNRSA9ICJUdXJuU2NyZWVuT25TaW5nbGVUYXNrQWN0aXZpdHkiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUVVJOX1NDUkVFTl9PTl9XSVRIX1JFTEFZT1VUX0FDVElWSVRZID0KLSAgICAgICAgICAgICJUdXJuU2NyZWVuT25XaXRoUmVsYXlvdXRBY3Rpdml0eSI7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci50ZWFyRG93bigpOwotICAgICAgICB0ZWFyRG93bkxvY2tDcmVkZW50aWFscygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUcmFuc2x1Y2VudEFjdGl2aXR5T25Ub3BPZlBpbm5lZFN0YWNrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghc3VwcG9ydHNQaXAoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChnZXRBbVN0YXJ0Q21kT3ZlckhvbWUoUElQX09OX1BJUF9BQ1RJVklUWSkpOwotICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JWYWxpZFN0YXRlKG1EZXZpY2UsIFBJUF9PTl9QSVBfQUNUSVZJVFkpOwotICAgICAgICAvLyBOT1RFOiBtb3ZpbmcgdG8gcGlubmVkIHN0YWNrIHdpbGwgdHJpZ2dlciB0aGUgcGlwLW9uLXBpcCBhY3Rpdml0eSB0byBsYXVuY2ggdGhlCi0gICAgICAgIC8vIHRyYW5zbHVjZW50IGFjdGl2aXR5LgotICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKEFNX01PVkVfVE9QX0FDVElWSVRZX1RPX1BJTk5FRF9TVEFDS19DT01NQU5EKTsKLQotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCBuZXcgU3RyaW5nW10ge1BJUF9PTl9QSVBfQUNUSVZJVFksIFRSQU5TTFVDRU5UX0FDVElWSVRZfSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0RnJvbnRTdGFjaygiUGlubmVkIHN0YWNrIG11c3QgYmUgdGhlIGZyb250IHN0YWNrLiIsIFBJTk5FRF9TVEFDS19JRCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShQSVBfT05fUElQX0FDVElWSVRZLCB0cnVlKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFRSQU5TTFVDRU5UX0FDVElWSVRZLCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBc3NlcnRzIHRoYXQgdGhlIGhvbWUgYWN0aXZpdHkgaXMgdmlzaWJsZSB3aGVuIGEgdHJhbnNsdWNlbnQgYWN0aXZpdHkgaXMgbGF1bmNoZWQgaW4gdGhlCi0gICAgICogZnVsbHNjcmVlbiBzdGFjayBvdmVyIHRoZSBob21lIGFjdGl2aXR5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RUcmFuc2x1Y2VudEFjdGl2aXR5T25Ub3BPZkhvbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG5vSG9tZVNjcmVlbigpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBsYXVuY2hIb21lQWN0aXZpdHkoKTsKLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoVFJBTlNMVUNFTlRfQUNUSVZJVFkpOwotCi0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIG5ldyBTdHJpbmdbXXtUUkFOU0xVQ0VOVF9BQ1RJVklUWX0pOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZyb250U3RhY2soCi0gICAgICAgICAgICAgICAgIkZ1bGxzY3JlZW4gc3RhY2sgbXVzdCBiZSB0aGUgZnJvbnQgc3RhY2suIiwgRlVMTFNDUkVFTl9XT1JLU1BBQ0VfU1RBQ0tfSUQpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoVFJBTlNMVUNFTlRfQUNUSVZJVFksIHRydWUpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEhvbWVBY3Rpdml0eVZpc2libGUodHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXNzZXJ0IHRoYXQgdGhlIGhvbWUgYWN0aXZpdHkgaXMgdmlzaWJsZSBpZiBhIHRhc2sgdGhhdCB3YXMgbGF1bmNoZWQgZnJvbSBob21lIGlzIHBpbm5lZAotICAgICAqIGFuZCBhbHNvIGFzc2VydCB0aGUgbmV4dCB0YXNrIGluIHRoZSBmdWxsc2NyZWVuIHN0YWNrIGlzbid0IHZpc2libGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEhvbWVWaXNpYmxlT25BY3Rpdml0eVRhc2tQaW5uZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0c1BpcCgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBsYXVuY2hIb21lQWN0aXZpdHkoKTsKLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoVEVTVF9BQ1RJVklUWV9OQU1FKTsKLSAgICAgICAgbGF1bmNoSG9tZUFjdGl2aXR5KCk7Ci0gICAgICAgIGxhdW5jaEFjdGl2aXR5KFRSQU5TTFVDRU5UX0FDVElWSVRZKTsKLSAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChBTV9NT1ZFX1RPUF9BQ1RJVklUWV9UT19QSU5ORURfU1RBQ0tfQ09NTUFORCk7Ci0KLSAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwgbmV3IFN0cmluZ1tde1RSQU5TTFVDRU5UX0FDVElWSVRZfSk7Ci0KLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFRSQU5TTFVDRU5UX0FDVElWSVRZLCB0cnVlKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFRFU1RfQUNUSVZJVFlfTkFNRSwgZmFsc2UpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEhvbWVBY3Rpdml0eVZpc2libGUodHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFRyYW5zbHVjZW50QWN0aXZpdHlPdmVyRG9ja2VkU3RhY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0c1NwbGl0U2NyZWVuTXVsdGlXaW5kb3coKSkgewotICAgICAgICAgICAgQ0xvZy5sb2dBbmREaXNwbGF5KElORk8sICJTa2lwcGluZyB0ZXN0OiBubyBtdWx0aS13aW5kb3cgc3VwcG9ydCIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbGF1bmNoQWN0aXZpdHlJbkRvY2tTdGFjayhET0NLRURfQUNUSVZJVFlfTkFNRSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIG5ldyBTdHJpbmdbXSB7RE9DS0VEX0FDVElWSVRZX05BTUV9KTsKLSAgICAgICAgbGF1bmNoQWN0aXZpdHlJblN0YWNrKFRFU1RfQUNUSVZJVFlfTkFNRSwgRlVMTFNDUkVFTl9XT1JLU1BBQ0VfU1RBQ0tfSUQpOwotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCBuZXcgU3RyaW5nW10ge0RPQ0tFRF9BQ1RJVklUWV9OQU1FLCBURVNUX0FDVElWSVRZX05BTUV9KTsKLSAgICAgICAgbGF1bmNoQWN0aXZpdHlJblN0YWNrKFRSQU5TTFVDRU5UX0FDVElWSVRZX05BTUUsIERPQ0tFRF9TVEFDS19JRCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIG5ldyBTdHJpbmdbXSB7VEVTVF9BQ1RJVklUWV9OQU1FLCBET0NLRURfQUNUSVZJVFlfTkFNRSwKLSAgICAgICAgICAgICAgICBUUkFOU0xVQ0VOVF9BQ1RJVklUWV9OQU1FfSwgZmFsc2UgLyogY29tcGFyZVRhc2tBbmRTdGFja0JvdW5kcyAqLyk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Q29udGFpbnNTdGFjaygiTXVzdCBjb250YWluIGRvY2tlZCBzdGFjayIsIERPQ0tFRF9TVEFDS19JRCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Q29udGFpbnNTdGFjaygiTXVzdCBjb250YWluIGZ1bGxzY3JlZW4gc3RhY2siLAotICAgICAgICAgICAgICAgIEZVTExTQ1JFRU5fV09SS1NQQUNFX1NUQUNLX0lEKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KERPQ0tFRF9BQ1RJVklUWV9OQU1FLCB0cnVlKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFRFU1RfQUNUSVZJVFlfTkFNRSwgdHJ1ZSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShUUkFOU0xVQ0VOVF9BQ1RJVklUWV9OQU1FLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBAUHJlc3VibWl0Ci0gICAgcHVibGljIHZvaWQgdGVzdFR1cm5TY3JlZW5PbkFjdGl2aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNsZWVwRGV2aWNlKCk7Ci0gICAgICAgIGxhdW5jaEFjdGl2aXR5KFRVUk5fU0NSRUVOX09OX0FDVElWSVRZX05BTUUpOwotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCBuZXcgU3RyaW5nW10geyBUVVJOX1NDUkVFTl9PTl9BQ1RJVklUWV9OQU1FIH0pOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoVFVSTl9TQ1JFRU5fT05fQUNUSVZJVFlfTkFNRSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEZpbmlzaEFjdGl2aXR5SW5Ob25Gb2N1c2VkU3RhY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0c1NwbGl0U2NyZWVuTXVsdGlXaW5kb3coKSkgewotICAgICAgICAgICAgQ0xvZy5sb2dBbmREaXNwbGF5KElORk8sICJTa2lwcGluZyB0ZXN0OiBubyBtdWx0aS13aW5kb3cgc3VwcG9ydCIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTGF1bmNoIHR3byBhY3Rpdml0aWVzIGluIGRvY2tlZCBzdGFjay4KLSAgICAgICAgbGF1bmNoQWN0aXZpdHlJbkRvY2tTdGFjayhMQVVOQ0hJTkdfQUNUSVZJVFkpOwotICAgICAgICBnZXRMYXVuY2hBY3Rpdml0eUJ1aWxkZXIoKS5zZXRUYXJnZXRBY3Rpdml0eU5hbWUoQlJPQURDQVNUX1JFQ0VJVkVSX0FDVElWSVRZKS5leGVjdXRlKCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIG5ldyBTdHJpbmdbXSB7IEJST0FEQ0FTVF9SRUNFSVZFUl9BQ1RJVklUWSB9KTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KEJST0FEQ0FTVF9SRUNFSVZFUl9BQ1RJVklUWSwgdHJ1ZSk7Ci0gICAgICAgIC8vIExhdW5jaCBzb21ldGhpbmcgdG8gZnVsbHNjcmVlbiBzdGFjayB0byBtYWtlIGl0IGZvY3VzZWQuCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5SW5TdGFjayhURVNUX0FDVElWSVRZX05BTUUsIDEpOwotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCBuZXcgU3RyaW5nW10geyBURVNUX0FDVElWSVRZX05BTUUgfSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShURVNUX0FDVElWSVRZX05BTUUsIHRydWUpOwotICAgICAgICAvLyBGaW5pc2ggYWN0aXZpdHkgaW4gbm9uLWZvY3VzZWQgKGRvY2tlZCkgc3RhY2suCi0gICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoRklOSVNIX0FDVElWSVRZX0JST0FEQ0FTVCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIG5ldyBTdHJpbmdbXSB7IExBVU5DSElOR19BQ1RJVklUWSB9KTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KExBVU5DSElOR19BQ1RJVklUWSwgdHJ1ZSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShCUk9BRENBU1RfUkVDRUlWRVJfQUNUSVZJVFksIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmluaXNoQWN0aXZpdHlXaXRoTW92ZVRhc2tUb0JhY2tBZnRlclBhdXNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHBlcmZvcm1GaW5pc2hBY3Rpdml0eVdpdGhNb3ZlVGFza1RvQmFjaygib25fcGF1c2UiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmluaXNoQWN0aXZpdHlXaXRoTW92ZVRhc2tUb0JhY2tBZnRlclN0b3AoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcGVyZm9ybUZpbmlzaEFjdGl2aXR5V2l0aE1vdmVUYXNrVG9CYWNrKCJvbl9zdG9wIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHBlcmZvcm1GaW5pc2hBY3Rpdml0eVdpdGhNb3ZlVGFza1RvQmFjayhTdHJpbmcgZmluaXNoUG9pbnQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBNYWtlIHN1cmUgaG9tZSBhY3Rpdml0eSBpcyB2aXNpYmxlLgotICAgICAgICBsYXVuY2hIb21lQWN0aXZpdHkoKTsKLSAgICAgICAgaWYgKCFub0hvbWVTY3JlZW4oKSkgewotICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRIb21lQWN0aXZpdHlWaXNpYmxlKHRydWUgLyogdmlzaWJsZSAqLyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBMYXVuY2ggYW4gYWN0aXZpdHkgdGhhdCBjYWxscyAibW92ZVRhc2tUb0JhY2siIHRvIGZpbmlzaCBpdHNlbGYuCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5KE1PVkVfVEFTS19UT19CQUNLX0FDVElWSVRZX05BTUUsICJmaW5pc2hfcG9pbnQiLCBmaW5pc2hQb2ludCk7Ci0gICAgICAgIG1BbVdtU3RhdGUud2FpdEZvclZhbGlkU3RhdGUobURldmljZSwgTU9WRV9UQVNLX1RPX0JBQ0tfQUNUSVZJVFlfTkFNRSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShNT1ZFX1RBU0tfVE9fQkFDS19BQ1RJVklUWV9OQU1FLCB0cnVlKTsKLQotICAgICAgICAvLyBMYXVuY2ggYSBkaWZmZXJlbnQgYWN0aXZpdHkgb24gdG9wLgotICAgICAgICBsYXVuY2hBY3Rpdml0eShCUk9BRENBU1RfUkVDRUlWRVJfQUNUSVZJVFkpOwotICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JBY3Rpdml0eVN0YXRlKG1EZXZpY2UsIEJST0FEQ0FTVF9SRUNFSVZFUl9BQ1RJVklUWSwgU1RBVEVfUkVTVU1FRCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShNT1ZFX1RBU0tfVE9fQkFDS19BQ1RJVklUWV9OQU1FLCBmYWxzZSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShCUk9BRENBU1RfUkVDRUlWRVJfQUNUSVZJVFksIHRydWUpOwotCi0gICAgICAgIC8vIEZpbmlzaCB0aGUgdG9wLW1vc3QgYWN0aXZpdHkuCi0gICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoRklOSVNIX0FDVElWSVRZX0JST0FEQ0FTVCk7Ci0KLSAgICAgICAgLy8gSG9tZSBtdXN0IGJlIHZpc2libGUuCi0gICAgICAgIGlmICghbm9Ib21lU2NyZWVuKCkpIHsKLSAgICAgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvckhvbWVBY3Rpdml0eVZpc2libGUobURldmljZSk7Ci0gICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEhvbWVBY3Rpdml0eVZpc2libGUodHJ1ZSAvKiB2aXNpYmxlICovKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFzc2VydHMgdGhhdCBsYXVuY2hpbmcgYmV0d2VlbiByZW9yZGVyIHRvIGZyb250IGFjdGl2aXRpZXMgZXhoaWJpdHMgdGhlIGNvcnJlY3QgYmFja3N0YWNrCi0gICAgICogYmVoYXZpb3IuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFJlb3JkZXJUb0Zyb250QmFja3N0YWNrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFN0YXJ0IHdpdGggaG9tZSBvbiB0b3AKLSAgICAgICAgbGF1bmNoSG9tZUFjdGl2aXR5KCk7Ci0gICAgICAgIGlmICghbm9Ib21lU2NyZWVuKCkpIHsKLSAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0SG9tZUFjdGl2aXR5VmlzaWJsZSh0cnVlIC8qIHZpc2libGUgKi8pOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTGF1bmNoIHRoZSBsYXVuY2hpbmcgYWN0aXZpdHkgdG8gdGhlIGZvcmVncm91bmQKLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoTEFVTkNISU5HX0FDVElWSVRZKTsKLQotICAgICAgICAvLyBMYXVuY2ggdGhlIGFsdGVybmF0ZSBsYXVuY2hpbmcgYWN0aXZpdHkgZnJvbSBsYXVuY2hpbmcgYWN0aXZpdHkgd2l0aCByZW9yZGVyIHRvIGZyb250LgotICAgICAgICBnZXRMYXVuY2hBY3Rpdml0eUJ1aWxkZXIoKS5zZXRUYXJnZXRBY3Rpdml0eU5hbWUoQUxUX0xBVU5DSElOR19BQ1RJVklUWSkKLSAgICAgICAgICAgICAgICAuc2V0UmVvcmRlclRvRnJvbnQodHJ1ZSkuZXhlY3V0ZSgpOwotCi0gICAgICAgIC8vIExhdW5jaCB0aGUgbGF1bmNoaW5nIGFjdGl2aXR5IGZyb20gdGhlIGFsdGVybmF0ZSBsYXVuY2hpbmcgYWN0aXZpdHkgd2l0aCByZW9yZGVyIHRvCi0gICAgICAgIC8vIGZyb250LgotICAgICAgICBnZXRMYXVuY2hBY3Rpdml0eUJ1aWxkZXIoKS5zZXRUYXJnZXRBY3Rpdml0eU5hbWUoTEFVTkNISU5HX0FDVElWSVRZKQotICAgICAgICAgICAgICAgIC5zZXRMYXVuY2hpbmdBY3Rpdml0eU5hbWUoQUxUX0xBVU5DSElOR19BQ1RJVklUWSkuc2V0UmVvcmRlclRvRnJvbnQodHJ1ZSkKLSAgICAgICAgICAgICAgICAuZXhlY3V0ZSgpOwotCi0gICAgICAgIC8vIFByZXNzIGJhY2sKLSAgICAgICAgcHJlc3NCYWNrQnV0dG9uKCk7Ci0KLSAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yVmFsaWRTdGF0ZShtRGV2aWNlLCBBTFRfTEFVTkNISU5HX0FDVElWSVRZKTsKLQotICAgICAgICAvLyBFbnN1cmUgdGhlIGFsdGVybmF0ZSBsYXVuY2hpbmcgYWN0aXZpdHkgaXMgaW4gZm9jdXMKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkQWN0aXZpdHkoIkFsdCBMYXVuY2hpbmcgQWN0aXZpdHkgbXVzdCBiZSBmb2N1c2VkIiwKLSAgICAgICAgICAgICAgICBBTFRfTEFVTkNISU5HX0FDVElWSVRZKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBc3NlcnRzIHRoYXQgdGhlIGFjdGl2aXR5IGZvY3VzIGFuZCBoaXN0b3J5IGlzIHByZXNlcnZlZCBtb3ZpbmcgYmV0d2VlbiB0aGUgYWN0aXZpdHkgYW5kCi0gICAgICogaG9tZSBzdGFjay4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVvcmRlclRvRnJvbnRDaGFuZ2luZ1N0YWNrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFN0YXJ0IHdpdGggaG9tZSBvbiB0b3AKLSAgICAgICAgbGF1bmNoSG9tZUFjdGl2aXR5KCk7Ci0gICAgICAgIGlmICghbm9Ib21lU2NyZWVuKCkpIHsKLSAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0SG9tZUFjdGl2aXR5VmlzaWJsZSh0cnVlIC8qIHZpc2libGUgKi8pOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTGF1bmNoIHRoZSBsYXVuY2hpbmcgYWN0aXZpdHkgdG8gdGhlIGZvcmVncm91bmQKLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoTEFVTkNISU5HX0FDVElWSVRZKTsKLQotICAgICAgICAvLyBMYXVuY2ggdGhlIGFsdGVybmF0ZSBsYXVuY2hpbmcgYWN0aXZpdHkgZnJvbSBsYXVuY2hpbmcgYWN0aXZpdHkgd2l0aCByZW9yZGVyIHRvIGZyb250LgotICAgICAgICBnZXRMYXVuY2hBY3Rpdml0eUJ1aWxkZXIoKS5zZXRUYXJnZXRBY3Rpdml0eU5hbWUoQUxUX0xBVU5DSElOR19BQ1RJVklUWSkKLSAgICAgICAgICAgICAgICAuc2V0UmVvcmRlclRvRnJvbnQodHJ1ZSkuZXhlY3V0ZSgpOwotCi0gICAgICAgIC8vIFJldHVybiBob21lCi0gICAgICAgIGxhdW5jaEhvbWVBY3Rpdml0eSgpOwotICAgICAgICBpZiAoIW5vSG9tZVNjcmVlbigpKSB7Ci0gICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEhvbWVBY3Rpdml0eVZpc2libGUodHJ1ZSAvKiB2aXNpYmxlICovKTsKLSAgICAgICAgfQotICAgICAgICAvLyBMYXVuY2ggdGhlIGxhdW5jaGluZyBhY3Rpdml0eSBmcm9tIHRoZSBhbHRlcm5hdGUgbGF1bmNoaW5nIGFjdGl2aXR5IHdpdGggcmVvcmRlciB0bwotICAgICAgICAvLyBmcm9udC4KLQotICAgICAgICAvLyBCcmluZyBsYXVuY2hpbmcgYWN0aXZpdHkgYmFjayB0byB0aGUgZm9yZWdyb3VuZAotICAgICAgICBsYXVuY2hBY3Rpdml0eShMQVVOQ0hJTkdfQUNUSVZJVFkpOwotICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JWYWxpZFN0YXRlKG1EZXZpY2UsIExBVU5DSElOR19BQ1RJVklUWSk7Ci0KLSAgICAgICAgLy8gRW5zdXJlIHRoZSBhbHRlcm5hdGUgbGF1bmNoaW5nIGFjdGl2aXR5IGlzIHN0aWxsIGluIGZvY3VzLgotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRBY3Rpdml0eSgiQWx0IExhdW5jaGluZyBBY3Rpdml0eSBtdXN0IGJlIGZvY3VzZWQiLAotICAgICAgICAgICAgICAgIEFMVF9MQVVOQ0hJTkdfQUNUSVZJVFkpOwotCi0gICAgICAgIHByZXNzQmFja0J1dHRvbigpOwotCi0gICAgICAgIG1BbVdtU3RhdGUud2FpdEZvclZhbGlkU3RhdGUobURldmljZSwgTEFVTkNISU5HX0FDVElWSVRZKTsKLQotICAgICAgICAvLyBFbnN1cmUgbGF1bmNoaW5nIGFjdGl2aXR5IHdhcyBicm91Z2h0IGZvcndhcmQuCi0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZEFjdGl2aXR5KCJMYXVuY2hpbmcgQWN0aXZpdHkgbXVzdCBiZSBmb2N1c2VkIiwKLSAgICAgICAgICAgICAgICBMQVVOQ0hJTkdfQUNUSVZJVFkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFzc2VydHMgdGhhdCBhIG5vaGlzdG9yeSBhY3Rpdml0eSBpcyBzdG9wcGVkIGFuZCByZW1vdmVkIGltbWVkaWF0ZWx5IGFmdGVyIGEgcmVzdW1lZCBhY3Rpdml0eQotICAgICAqIGFib3ZlIGJlY29tZXMgdmlzaWJsZSBhbmQgZG9lcyBub3QgaWRsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9IaXN0b3J5QWN0aXZpdHlGaW5pc2hlZFJlc3VtZWRBY3Rpdml0eU5vdElkbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG5vSG9tZVNjcmVlbigpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTdGFydCB3aXRoIGhvbWUgb24gdG9wCi0gICAgICAgIGxhdW5jaEhvbWVBY3Rpdml0eSgpOwotCi0gICAgICAgIC8vIExhdW5jaCBubyBoaXN0b3J5IGFjdGl2aXR5Ci0gICAgICAgIGxhdW5jaEFjdGl2aXR5KE5PSElTVE9SWV9BQ1RJVklUWSk7Ci0KLSAgICAgICAgLy8gTGF1bmNoIGFuIGFjdGl2aXR5IHdpdGggYSBzd2lwZSByZWZyZXNoIGxheW91dCBjb25maWd1cmVkIHRvIHByZXZlbnQgaWRsZS4KLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoU1dJUEVfUkVGUkVTSF9BQ1RJVklUWSk7Ci0KLSAgICAgICAgcHJlc3NCYWNrQnV0dG9uKCk7Ci0gICAgICAgIG1BbVdtU3RhdGUud2FpdEZvckhvbWVBY3Rpdml0eVZpc2libGUobURldmljZSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0SG9tZUFjdGl2aXR5VmlzaWJsZSh0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VHVyblNjcmVlbk9uQXR0ck5vTG9ja1NjcmVlbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB3YWtlVXBBbmRSZW1vdmVMb2NrKCk7Ci0gICAgICAgIHNsZWVwRGV2aWNlKCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBsb2dTZXBhcmF0b3IgPSBjbGVhckxvZ2NhdCgpOwotICAgICAgICBsYXVuY2hBY3Rpdml0eShUVVJOX1NDUkVFTl9PTl9BVFRSX0FDVElWSVRZX05BTUUpOwotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCBuZXcgU3RyaW5nW10geyBUVVJOX1NDUkVFTl9PTl9BVFRSX0FDVElWSVRZX05BTUUgfSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShUVVJOX1NDUkVFTl9PTl9BVFRSX0FDVElWSVRZX05BTUUsIHRydWUpOwotICAgICAgICBhc3NlcnRUcnVlKGlzRGlzcGxheU9uKCkpOwotICAgICAgICBhc3NlcnRTaW5nbGVMYXVuY2goVFVSTl9TQ1JFRU5fT05fQVRUUl9BQ1RJVklUWV9OQU1FLCBsb2dTZXBhcmF0b3IpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUdXJuU2NyZWVuT25BdHRyV2l0aExvY2tTY3JlZW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFpc0hhbmRoZWxkKCkpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgdGVzdCByZXF1aXJlcyB0aGUgYWJpbGl0eSB0byBoYXZlIGEgbG9jayBzY3JlZW4uCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRMb2NrQ3JlZGVudGlhbCgpOwotICAgICAgICBzbGVlcERldmljZSgpOwotICAgICAgICBmaW5hbCBTdHJpbmcgbG9nU2VwYXJhdG9yID0gY2xlYXJMb2djYXQoKTsKLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoVFVSTl9TQ1JFRU5fT05fQVRUUl9BQ1RJVklUWV9OQU1FKTsKLSAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwgbmV3IFN0cmluZ1tdIHsgVFVSTl9TQ1JFRU5fT05fQVRUUl9BQ1RJVklUWV9OQU1FIH0pOwotICAgICAgICBhc3NlcnRGYWxzZShpc0Rpc3BsYXlPbigpKTsKLSAgICAgICAgYXNzZXJ0U2luZ2xlTGF1bmNoQW5kU3RvcChUVVJOX1NDUkVFTl9PTl9BVFRSX0FDVElWSVRZX05BTUUsIGxvZ1NlcGFyYXRvcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFR1cm5TY3JlZW5PblNob3dPbkxvY2tBdHRyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNsZWVwRGV2aWNlKCk7Ci0gICAgICAgIG1BbVdtU3RhdGUud2FpdEZvckFsbFN0b3BwZWRBY3Rpdml0aWVzKG1EZXZpY2UpOwotICAgICAgICBmaW5hbCBTdHJpbmcgbG9nU2VwYXJhdG9yID0gY2xlYXJMb2djYXQoKTsKLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoVFVSTl9TQ1JFRU5fT05fU0hPV19PTl9MT0NLX0FDVElWSVRZX05BTUUpOwotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCBuZXcgU3RyaW5nW10geyBUVVJOX1NDUkVFTl9PTl9TSE9XX09OX0xPQ0tfQUNUSVZJVFlfTkFNRSB9KTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFRVUk5fU0NSRUVOX09OX1NIT1dfT05fTE9DS19BQ1RJVklUWV9OQU1FLCB0cnVlKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShpc0Rpc3BsYXlPbigpKTsKLSAgICAgICAgYXNzZXJ0U2luZ2xlTGF1bmNoKFRVUk5fU0NSRUVOX09OX1NIT1dfT05fTE9DS19BQ1RJVklUWV9OQU1FLCBsb2dTZXBhcmF0b3IpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUdXJuU2NyZWVuT25BdHRyUmVtb3ZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNsZWVwRGV2aWNlKCk7Ci0gICAgICAgIG1BbVdtU3RhdGUud2FpdEZvckFsbFN0b3BwZWRBY3Rpdml0aWVzKG1EZXZpY2UpOwotICAgICAgICBTdHJpbmcgbG9nU2VwYXJhdG9yID0gY2xlYXJMb2djYXQoKTsKLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoVFVSTl9TQ1JFRU5fT05fQVRUUl9SRU1PVkVfQVRUUl9BQ1RJVklUWV9OQU1FKTsKLSAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwgbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgICAgICBUVVJOX1NDUkVFTl9PTl9BVFRSX1JFTU9WRV9BVFRSX0FDVElWSVRZX05BTUV9KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShpc0Rpc3BsYXlPbigpKTsKLSAgICAgICAgYXNzZXJ0U2luZ2xlTGF1bmNoKFRVUk5fU0NSRUVOX09OX0FUVFJfUkVNT1ZFX0FUVFJfQUNUSVZJVFlfTkFNRSwgbG9nU2VwYXJhdG9yKTsKLQotICAgICAgICBzbGVlcERldmljZSgpOwotICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JBbGxTdG9wcGVkQWN0aXZpdGllcyhtRGV2aWNlKTsKLSAgICAgICAgbG9nU2VwYXJhdG9yID0gY2xlYXJMb2djYXQoKTsKLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoVFVSTl9TQ1JFRU5fT05fQVRUUl9SRU1PVkVfQVRUUl9BQ1RJVklUWV9OQU1FKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoaXNEaXNwbGF5T24oKSk7Ci0gICAgICAgIGFzc2VydFNpbmdsZVN0YXJ0QW5kU3RvcChUVVJOX1NDUkVFTl9PTl9BVFRSX1JFTU9WRV9BVFRSX0FDVElWSVRZX05BTUUsIGxvZ1NlcGFyYXRvcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFR1cm5TY3JlZW5PblNpbmdsZVRhc2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc2xlZXBEZXZpY2UoKTsKLSAgICAgICAgU3RyaW5nIGxvZ1NlcGFyYXRvciA9IGNsZWFyTG9nY2F0KCk7Ci0gICAgICAgIGxhdW5jaEFjdGl2aXR5KFRVUk5fU0NSRUVOX09OX1NJTkdMRV9UQVNLX0FDVElWSVRZX05BTUUpOwotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCBuZXcgU3RyaW5nW10geyBUVVJOX1NDUkVFTl9PTl9TSU5HTEVfVEFTS19BQ1RJVklUWV9OQU1FIH0pOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoVFVSTl9TQ1JFRU5fT05fU0lOR0xFX1RBU0tfQUNUSVZJVFlfTkFNRSwgdHJ1ZSk7Ci0gICAgICAgIGFzc2VydFRydWUoaXNEaXNwbGF5T24oKSk7Ci0gICAgICAgIGFzc2VydFNpbmdsZUxhdW5jaChUVVJOX1NDUkVFTl9PTl9TSU5HTEVfVEFTS19BQ1RJVklUWV9OQU1FLCBsb2dTZXBhcmF0b3IpOwotCi0gICAgICAgIHNsZWVwRGV2aWNlKCk7Ci0gICAgICAgIGxvZ1NlcGFyYXRvciA9IGNsZWFyTG9nY2F0KCk7Ci0gICAgICAgIGxhdW5jaEFjdGl2aXR5KFRVUk5fU0NSRUVOX09OX1NJTkdMRV9UQVNLX0FDVElWSVRZX05BTUUpOwotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCBuZXcgU3RyaW5nW10geyBUVVJOX1NDUkVFTl9PTl9TSU5HTEVfVEFTS19BQ1RJVklUWV9OQU1FIH0pOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoVFVSTl9TQ1JFRU5fT05fU0lOR0xFX1RBU0tfQUNUSVZJVFlfTkFNRSwgdHJ1ZSk7Ci0gICAgICAgIGFzc2VydFRydWUoaXNEaXNwbGF5T24oKSk7Ci0gICAgICAgIGFzc2VydFNpbmdsZVN0YXJ0KFRVUk5fU0NSRUVOX09OX1NJTkdMRV9UQVNLX0FDVElWSVRZX05BTUUsIGxvZ1NlcGFyYXRvcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFR1cm5TY3JlZW5PbkFjdGl2aXR5X3dpdGhSZWxheW91dCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzbGVlcERldmljZSgpOwotICAgICAgICBsYXVuY2hBY3Rpdml0eShUVVJOX1NDUkVFTl9PTl9XSVRIX1JFTEFZT1VUX0FDVElWSVRZKTsKLSAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwgbmV3IFN0cmluZ1tdIHsgVFVSTl9TQ1JFRU5fT05fV0lUSF9SRUxBWU9VVF9BQ1RJVklUWSB9KTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFRVUk5fU0NSRUVOX09OX1dJVEhfUkVMQVlPVVRfQUNUSVZJVFksIHRydWUpOwotCi0gICAgICAgIFN0cmluZyBsb2dTZXBhcmF0b3IgPSBjbGVhckxvZ2NhdCgpOwotICAgICAgICBzbGVlcERldmljZSgpOwotICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3IoIldhaXRpbmcgZm9yIHN0b3BwZWQgc3RhdGUiLCAoKSAtPgotICAgICAgICAgICAgICAgIGxpZmVjeWNsZVN0b3BPY2N1cnJlZChUVVJOX1NDUkVFTl9PTl9XSVRIX1JFTEFZT1VUX0FDVElWSVRZLCBsb2dTZXBhcmF0b3IpKTsKLQotICAgICAgICAvLyBFbnN1cmUgdGhlcmUgd2FzIGFuIGFjdHVhbCBzdG9wIGlmIHRoZSB3YWl0Rm9yIHRpbWVkIG91dC4KLSAgICAgICAgYXNzZXJ0VHJ1ZShsaWZlY3ljbGVTdG9wT2NjdXJyZWQoVFVSTl9TQ1JFRU5fT05fV0lUSF9SRUxBWU9VVF9BQ1RJVklUWSwgbG9nU2VwYXJhdG9yKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGlzRGlzcGxheU9uKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBsaWZlY3ljbGVTdG9wT2NjdXJyZWQoU3RyaW5nIGFjdGl2aXR5TmFtZSwgU3RyaW5nIGxvZ1NlcGFyYXRvcikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQWN0aXZpdHlMaWZlY3ljbGVDb3VudHMgbGlmZWN5Y2xlQ291bnRzID0gbmV3IEFjdGl2aXR5TGlmZWN5Y2xlQ291bnRzKGFjdGl2aXR5TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgbG9nU2VwYXJhdG9yKTsKLSAgICAgICAgICAgIHJldHVybiBsaWZlY3ljbGVDb3VudHMubVN0b3BDb3VudCA+IDA7Ci0gICAgICAgIH0gY2F0Y2ggKERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2dFKGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9BY3Rpdml0eU1hbmFnZXJBbVByb2ZpbGVUZXN0cy5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvQWN0aXZpdHlNYW5hZ2VyQW1Qcm9maWxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk1MWQ2Mi4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9BY3Rpdml0eU1hbmFnZXJBbVByb2ZpbGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuc2VydmVyLmN0czsKLQotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmlvLkZpbGVzOwotCi1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLkRldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuSVRlc3REZXZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudXRpbC5GaWxlVXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlcjsKLQotLyoqCi0gKiBCdWlsZDogbW1tYSAtajMyIGN0cy9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzCi0gKiBSdW46IGN0cy9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci91dGlsL3J1bi10ZXN0IEN0c1NlcnZpY2VzSG9zdFRlc3RDYXNlcyBhbmRyb2lkLnNlcnZlci5jdHMuQWN0aXZpdHlNYW5hZ2VyQW1Qcm9maWxlVGVzdHMKLSAqCi0gKiBQbGVhc2UgdGFsayB0byBBbmRyb2lkIFN0dWRpbyB0ZWFtIGZpcnN0IGlmIHlvdSB3YW50IHRvIG1vZGlmeSBvciBkZWxldGUgdGhlc2UgdGVzdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eU1hbmFnZXJBbVByb2ZpbGVUZXN0cyBleHRlbmRzIEFjdGl2aXR5TWFuYWdlclRlc3RCYXNlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1BBQ0tBR0VfTkFNRSA9ICJhbmRyb2lkLnNlcnZlci5jdHMuZGVidWdnYWJsZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQUNUSVZJVFlfTkFNRSA9ICJEZWJ1Z2dhYmxlQXBwQWN0aXZpdHkiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPVVRQVVRfRklMRV9QQVRIID0gIi9kYXRhL2xvY2FsL3RtcC9wcm9maWxlLnRyYWNlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklSU1RfV09SRF9OT19TVFJFQU1JTkcgPSAiKnZlcnNpb25cbiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJUlNUX1dPUkRfU1RSRUFNSU5HID0gIlNMT1ciOyAgLy8gTWFnaWMgd29yZCBzZXQgYnkgcnVudGltZS4KLQotICAgIHByaXZhdGUgSVRlc3REZXZpY2UgbURldmljZTsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIG1EZXZpY2UgPSBnZXREZXZpY2UoKTsKLSAgICAgICAgc2V0Q29tcG9uZW50TmFtZShURVNUX1BBQ0tBR0VfTkFNRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBhbSBwcm9maWxlIGZ1bmN0aW9uYWxpdHkgd2l0aCB0aGUgZm9sbG93aW5nIDMgY29uZmlndXJhYmxlIG9wdGlvbnM6Ci0gICAgICogICAgc3RhcnRpbmcgdGhlIGFjdGl2aXR5IGJlZm9yZSBzdGFydCBwcm9maWxpbmc/IHllczsKLSAgICAgKiAgICBzYW1wbGluZy1iYXNlZCBwcm9maWxpbmc/IG5vOwotICAgICAqICAgIHVzaW5nIHN0cmVhbWluZyBvdXRwdXQgbW9kZT8gbm8uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFtUHJvZmlsZVN0YXJ0Tm9TYW1wbGluZ05vU3RyZWFtaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIGFtIHByb2ZpbGUgc3RhcnQgLi4uICwgYW5kIHRoZSBzYW1lIHRvIHRoZSBmb2xsb3dpbmcgMyB0ZXN0IG1ldGhvZHMuCi0gICAgICAgIHRlc3RQcm9maWxlKHRydWUsIGZhbHNlLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIGZvbGxvd2luZyB0ZXN0cyBhcmUgc2ltaWxhciB0byB0ZXN0QW1Qcm9maWxlU3RhcnROb1NhbXBsaW5nTm9TdHJlYW1pbmcoKSwKLSAgICAgKiBvbmx5IGRpZmZlcmVudCBpbiB0aGUgdGhyZWUgY29uZmlndXJhdGlvbiBvcHRpb25zLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBbVByb2ZpbGVTdGFydE5vU2FtcGxpbmdTdHJlYW1pbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdFByb2ZpbGUodHJ1ZSwgZmFsc2UsIHRydWUpOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QW1Qcm9maWxlU3RhcnRTYW1wbGluZ05vU3RyZWFtaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RQcm9maWxlKHRydWUsIHRydWUsIGZhbHNlKTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgdGVzdEFtUHJvZmlsZVN0YXJ0U2FtcGxpbmdTdHJlYW1pbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdFByb2ZpbGUodHJ1ZSwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHRlc3RBbVN0YXJ0U3RhcnRQcm9maWxlck5vU2FtcGxpbmdOb1N0cmVhbWluZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBhbSBzdGFydCAtLXN0YXJ0LXByb2ZpbGVyIC4uLiwgYW5kIHRoZSBzYW1lIHRvIHRoZSBmb2xsb3dpbmcgMyB0ZXN0IG1ldGhvZHMuCi0gICAgICAgIHRlc3RQcm9maWxlKGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QW1TdGFydFN0YXJ0UHJvZmlsZXJOb1NhbXBsaW5nU3RyZWFtaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RQcm9maWxlKGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHRlc3RBbVN0YXJ0U3RhcnRQcm9maWxlclNhbXBsaW5nTm9TdHJlYW1pbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdFByb2ZpbGUoZmFsc2UsIHRydWUsIGZhbHNlKTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgdGVzdEFtU3RhcnRTdGFydFByb2ZpbGVyU2FtcGxpbmdTdHJlYW1pbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdFByb2ZpbGUoZmFsc2UsIHRydWUsIHRydWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0UHJvZmlsZShib29sZWFuIHN0YXJ0QWN0aXZpdHlGaXJzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzYW1wbGluZywgYm9vbGVhbiBzdHJlYW1pbmcpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoc3RhcnRBY3Rpdml0eUZpcnN0KSB7Ci0gICAgICAgICAgICBsYXVuY2hBY3Rpdml0eShURVNUX0FDVElWSVRZX05BTUUpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGNtZCA9IGdldFN0YXJ0Q21kKFRFU1RfQUNUSVZJVFlfTkFNRSwgc3RhcnRBY3Rpdml0eUZpcnN0LCBzYW1wbGluZywgc3RyZWFtaW5nKTsKLSAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChjbWQpOwotICAgICAgICAvLyBHbyB0byBob21lIHNjcmVlbiBhbmQgdGhlbiB3YXJtIHN0YXJ0IHRoZSBhY3Rpdml0eSB0byBnZW5lcmF0ZSBzb21lIGludGVyZXN0aW5nIHRyYWNlLgotICAgICAgICBwcmVzc0hvbWVCdXR0b24oKTsKLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoVEVTVF9BQ1RJVklUWV9OQU1FKTsKLQotICAgICAgICBjbWQgPSAiYW0gcHJvZmlsZSBzdG9wICIgKyBjb21wb25lbnROYW1lOwotICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKGNtZCk7Ci0gICAgICAgIC8vIFNsZWVwIGZvciAwLjEgc2Vjb25kICgxMDAgbWlsbGlzZWNvbmRzKSBzbyB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgcHJvZmlsaW5nCi0gICAgICAgIC8vIGZpbGUgaXMgY29tcGxldGUuCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMzAwKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy9pZ25vcmVkCi0gICAgICAgIH0KLSAgICAgICAgdmVyaWZ5T3V0cHV0RmlsZUZvcm1hdChzdHJlYW1pbmcpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldFN0YXJ0Q21kKFN0cmluZyBhY3Rpdml0eU5hbWUsIGJvb2xlYW4gYWN0aXZpdHlBbHJlYWR5U3RhcnRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNhbXBsaW5nLCBib29sZWFuIHN0cmVhbWluZykgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigiYW0iKTsKLSAgICAgICAgaWYgKGFjdGl2aXR5QWxyZWFkeVN0YXJ0ZWQpIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIgcHJvZmlsZSBzdGFydCIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiIHN0YXJ0IC1uICVzLy4lcyAtVyAtUyAtLXN0YXJ0LXByb2ZpbGVyICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50TmFtZSwgYWN0aXZpdHlOYW1lLCBPVVRQVVRfRklMRV9QQVRIKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNhbXBsaW5nKSB7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiIC0tc2FtcGxpbmcgMTAwMCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzdHJlYW1pbmcpIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIgLS1zdHJlYW1pbmciKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYWN0aXZpdHlBbHJlYWR5U3RhcnRlZCkgewotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiICVzICVzIiwgY29tcG9uZW50TmFtZSwgT1VUUFVUX0ZJTEVfUEFUSCkpOwotICAgICAgICB9IGVsc2UgewotCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdmVyaWZ5T3V0cHV0RmlsZUZvcm1hdChib29sZWFuIHN0cmVhbWluZykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBleHBlY3RlZEZpcnN0V29yZCA9IHN0cmVhbWluZyA/IEZJUlNUX1dPUkRfU1RSRUFNSU5HIDogRklSU1RfV09SRF9OT19TVFJFQU1JTkc7Ci0gICAgICAgIGJ5dGVbXSBkYXRhID0gcmVhZEZpbGVPbkNsaWVudChPVVRQVVRfRklMRV9QQVRIKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiZGF0YSBzaXplPSIgKyBkYXRhLmxlbmd0aCwgZGF0YS5sZW5ndGggPj0gZXhwZWN0ZWRGaXJzdFdvcmQubGVuZ3RoKCkpOwotICAgICAgICBTdHJpbmcgYWN0dWFsRmlyc3RXb3JkID0gbmV3IFN0cmluZyhkYXRhLCAwLCBleHBlY3RlZEZpcnN0V29yZC5sZW5ndGgoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoIlVuZXhwZWN0ZWQgZmlyc3Qgd29yZDogJyIgKyBhY3R1YWxGaXJzdFdvcmQgKyAiJyIsCi0gICAgICAgICAgICAgICAgICAgYWN0dWFsRmlyc3RXb3JkLmVxdWFscyhleHBlY3RlZEZpcnN0V29yZCkpOwotICAgICAgICAvLyBDbGVhbiB1cC4KLSAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZCgicm0gLWYgIiArIE9VVFBVVF9GSUxFX1BBVEgpOwotICAgIH0KLQotICAgIHByaXZhdGUgYnl0ZVtdIHJlYWRGaWxlT25DbGllbnQoU3RyaW5nIGNsaWVudFBhdGgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRUcnVlKCJGaWxlIG5vdCBmb3VuZCBvbiBjbGllbnQ6ICIgKyBjbGllbnRQYXRoLAotICAgICAgICAgICAgICAgIG1EZXZpY2UuZG9lc0ZpbGVFeGlzdChjbGllbnRQYXRoKSk7Ci0gICAgICAgIEZpbGUgY29weU9uSG9zdCA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoImhvc3QiLCAiY29weSIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZXhlY3V0ZUFkYkNvbW1hbmQoInB1bGwiLCBjbGllbnRQYXRoLCBjb3B5T25Ib3N0LmdldFBhdGgoKSk7Ci0gICAgICAgICAgICByZXR1cm4gRmlsZXMudG9CeXRlQXJyYXkoY29weU9uSG9zdCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBGaWxlVXRpbC5kZWxldGVGaWxlKGNvcHlPbkhvc3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBleGVjdXRlQWRiQ29tbWFuZChTdHJpbmcuLi4gY29tbWFuZCkgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBvdXRwdXQgPSBtRGV2aWNlLmV4ZWN1dGVBZGJDb21tYW5kKGNvbW1hbmQpOwotICAgICAgICAvLyAiIi5zcGxpdCgpIHJldHVybnMgeyAiIiB9LCBidXQgd2Ugd2FudCBhbiBlbXB0eSBhcnJheQotICAgICAgICBTdHJpbmdbXSBsaW5lcyA9IG91dHB1dC5lcXVhbHMoIiIpID8gbmV3IFN0cmluZ1swXSA6IG91dHB1dC5zcGxpdCgiXG4iKTsKLSAgICAgICAgcmV0dXJuIGxpbmVzOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvQWN0aXZpdHlNYW5hZ2VyQW1TdGFydE9wdGlvbnNUZXN0cy5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvQWN0aXZpdHlNYW5hZ2VyQW1TdGFydE9wdGlvbnNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmRmNGE4Li4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0FjdGl2aXR5TWFuYWdlckFtU3RhcnRPcHRpb25zVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnNlcnZlci5jdHM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci0KLS8qKgotICogQnVpbGQ6IG1tbWEgLWozMiBjdHMvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcwotICogUnVuOiBjdHMvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvdXRpbC9ydW4tdGVzdCBDdHNTZXJ2aWNlc0hvc3RUZXN0Q2FzZXMgYW5kcm9pZC5zZXJ2ZXIuY3RzLkFjdGl2aXR5TWFuYWdlckFtU3RhcnRPcHRpb25zVGVzdHMKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5TWFuYWdlckFtU3RhcnRPcHRpb25zVGVzdHMgZXh0ZW5kcyBBY3Rpdml0eU1hbmFnZXJUZXN0QmFzZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9BQ1RJVklUWV9OQU1FID0gIlRlc3RBY3Rpdml0eSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVFJZUE9JTlRfQUNUSVZJVFlfTkFNRSA9ICJFbnRyeVBvaW50QWxpYXNBY3Rpdml0eSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNJTkdMRV9UQVNLX0FDVElWSVRZX05BTUUgPSAiU2luZ2xlVGFza0FjdGl2aXR5IjsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3REYXNoRCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBTdHJpbmcgYWN0aXZpdHlDb21wb25lbnROYW1lID0KLSAgICAgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXJUZXN0QmFzZS5nZXRBY3Rpdml0eUNvbXBvbmVudE5hbWUoVEVTVF9BQ1RJVklUWV9OQU1FKTsKLQotICAgICAgICBmaW5hbCBTdHJpbmdbXSB3YWl0Rm9yQWN0aXZpdHlSZWNvcmRzID0gbmV3IFN0cmluZ1tdIHthY3Rpdml0eUNvbXBvbmVudE5hbWV9OwotCi0gICAgICAgIC8vIFJ1biBhdCBsZWFzdCAyIHJvdW5kcyB0byB2ZXJpZnkgdGhhdCAtRCB3b3JrcyB3aXRoIGFuIGV4aXN0aW5nIHByb2Nlc3MuCi0gICAgICAgIC8vIC1EIGNvdWxkIGZhaWwgaW4gdGhpcyBjYXNlIGlmIHRoZSBmb3JjZSBzdG9wIG9mIHByb2Nlc3MgaXMgYnJva2VuLgotICAgICAgICBpbnQgcHJldlByb2NJZCA9IC0xOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgewotICAgICAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChnZXRBbVN0YXJ0Q21kKFRFU1RfQUNUSVZJVFlfTkFNRSkgKyAiIC1EIik7Ci0KLSAgICAgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvckRlYnVnZ2VyV2luZG93VmlzaWJsZShtRGV2aWNlLCB3YWl0Rm9yQWN0aXZpdHlSZWNvcmRzKTsKLSAgICAgICAgICAgIGludCBwcm9jSWQgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRBY3Rpdml0eVByb2NJZChhY3Rpdml0eUNvbXBvbmVudE5hbWUpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKCJJbnZhbGlkIFByb2NJZC4iLCBwcm9jSWQgPj0gMCk7Ci0gICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJSdW4gIiArIGkgKyAiIGRpZG4ndCBzdGFydCBuZXcgcHJvYy4iLCBwcmV2UHJvY0lkICE9IHByb2NJZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcmV2UHJvY0lkID0gcHJvY0lkOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdERhc2hXX0RpcmVjdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0RGFzaFcoU0lOR0xFX1RBU0tfQUNUSVZJVFlfTkFNRSwgU0lOR0xFX1RBU0tfQUNUSVZJVFlfTkFNRSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdERhc2hXX0luZGlyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3REYXNoVyhFTlRSWVBPSU5UX0FDVElWSVRZX05BTUUsIFNJTkdMRV9UQVNLX0FDVElWSVRZX05BTUUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0RGFzaFcoZmluYWwgU3RyaW5nIGVudHJ5QWN0aXZpdHksIGZpbmFsIFN0cmluZyBhY3R1YWxBY3Rpdml0eSkKLSAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBUZXN0IGNvbGQgc3RhcnQKLSAgICAgICAgc3RhcnRBY3Rpdml0eUFuZFZlcmlmeVJlc3VsdChlbnRyeUFjdGl2aXR5LCBhY3R1YWxBY3Rpdml0eSwgdHJ1ZSk7Ci0KLSAgICAgICAgLy8gVGVzdCB3YXJtIHN0YXJ0Ci0gICAgICAgIHByZXNzSG9tZUJ1dHRvbigpOwotICAgICAgICBzdGFydEFjdGl2aXR5QW5kVmVyaWZ5UmVzdWx0KGVudHJ5QWN0aXZpdHksIGFjdHVhbEFjdGl2aXR5LCBmYWxzZSk7Ci0KLSAgICAgICAgLy8gVGVzdCAiaG90IiBzdGFydCAoYXBwIGFscmVhZHkgaW4gZnJvbnQpCi0gICAgICAgIHN0YXJ0QWN0aXZpdHlBbmRWZXJpZnlSZXN1bHQoZW50cnlBY3Rpdml0eSwgYWN0dWFsQWN0aXZpdHksIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc3RhcnRBY3Rpdml0eUFuZFZlcmlmeVJlc3VsdChmaW5hbCBTdHJpbmcgZW50cnlBY3Rpdml0eSwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBhY3R1YWxBY3Rpdml0eSwgYm9vbGVhbiBzaG91bGRTdGFydCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFNlZSBUT0RPIGJlbG93Ci0gICAgICAgIC8vIGZpbmFsIFN0cmluZyBsb2dTZXBhcmF0b3IgPSBjbGVhckxvZ2NhdCgpOwotCi0gICAgICAgIC8vIFBhc3MgaW4gZGlmZmVyZW50IGRhdGEgb25seSB3aGVuIGNvbGQgc3RhcnRpbmcuIFRoaXMgaXMgdG8gbWFrZSB0aGUgaW50ZW50Ci0gICAgICAgIC8vIGRpZmZlcmVudCBpbiBzdWJzZXF1ZW50IHdhcm0vaG90IGxhdW5jaGVzLCBzbyB0aGF0IHRoZSBlbnRyeXBvaW50IGFsaWFzCi0gICAgICAgIC8vIGFjdGl2aXR5IGlzIGFsd2F5cyBzdGFydGVkLCBidXQgdGhlIGFjdHVhbCBhY3Rpdml0eSBpcyBub3Qgc3RhcnRlZCBhZ2FpbgotICAgICAgICAvLyBiZWNhdXNlIG9mIHRoZSBORVdfVEFTSyBhbmQgc2luZ2xlVGFzayBmbGFncy4KLSAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdCA9IGV4ZWN1dGVTaGVsbENvbW1hbmQoZ2V0QW1TdGFydENtZChlbnRyeUFjdGl2aXR5KSArICIgLVciCi0gICAgICAgICAgICAgICAgKyAoc2hvdWxkU3RhcnQgPyAiIC1kIGFib3V0OmJsYW5rIiA6ICIiKSk7Ci0KLSAgICAgICAgLy8gVmVyaWZ5IHNoZWxsIGNvbW1hbmQgcmV0dXJuIHZhbHVlCi0gICAgICAgIHZlcmlmeVNoZWxsT3V0cHV0KHJlc3VsdCwgYWN0dWFsQWN0aXZpdHksIHNob3VsZFN0YXJ0KTsKLQotICAgICAgICAvLyBUT0RPOiBEaXNhYmxlIGxvZ2NhdCBjaGVjayBmb3Igbm93LgotICAgICAgICAvLyBMb2djYXQgb2YgV00gb3IgQU0gdGFnIGNvdWxkIGJlIGxvc3QgKGVnLiBjaGF0dHkgaWYgZWFybGllciBldmVudHMgZ2VuZXJhdGVkCi0gICAgICAgIC8vIHRvbyBtYW55IGxpbmVzKSwgYW5kIG1ha2UgdGhlIHRlc3QgbG9vayBmbGFreS4gV2UgbmVlZCB0byBlaXRoZXIgdXNlIGV2ZW50Ci0gICAgICAgIC8vIGxvZyBvciBzd2l0aCB0byBvdGhlciBtZWNoYW5pc21zLiBPbmx5IHZlcmlmeSBzaGVsbCBvdXRwdXQgZm9yIG5vdywgaXQgc2hvdWxkCi0gICAgICAgIC8vIHN0aWxsIGNhdGNoIG1vc3QgZmFpbHVyZXMuCi0KLSAgICAgICAgLy8gVmVyaWZ5IGFkYiBsb2djYXQgbG9nCi0gICAgICAgIC8vdmVyaWZ5TG9nY2F0KGFjdHVhbEFjdGl2aXR5LCBzaG91bGRTdGFydCwgbG9nU2VwYXJhdG9yKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHNOb3RTdGFydGVkV2FybmluZ1BhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoCi0gICAgICAgICAgICAiV2FybmluZzogQWN0aXZpdHkgbm90IHN0YXJ0ZWQoLiopIik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBzU3RhdHVzUGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgKLSAgICAgICAgICAgICJTdGF0dXM6ICguKikiKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHNBY3Rpdml0eVBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoCi0gICAgICAgICAgICAiQWN0aXZpdHk6ICguKikiKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc1N0YXR1c09rID0gIm9rIjsKLQotICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlTaGVsbE91dHB1dCgKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyByZXN1bHQsIGZpbmFsIFN0cmluZyBhY3Rpdml0eSwgYm9vbGVhbiBzaG91bGRTdGFydCkgewotICAgICAgICBib29sZWFuIHdhcm5pbmdGb3VuZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc3RhdHVzID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIHJlcG9ydGVkQWN0aXZpdHkgPSBudWxsOwotICAgICAgICBTdHJpbmcgY29tcG9uZW50QWN0aXZpdHlOYW1lID0gZ2V0QWN0aXZpdHlDb21wb25lbnROYW1lKGFjdGl2aXR5KTsKLQotICAgICAgICBmaW5hbCBTdHJpbmdbXSBsaW5lcyA9IHJlc3VsdC5zcGxpdCgiXFxuIik7Ci0gICAgICAgIC8vIEdvaW5nIGZyb20gdGhlIGVuZCBvZiBsb2dzIHRvIGJlZ2lubmluZyBpbiBjYXNlIGlmIHNvbWUgb3RoZXIgYWN0aXZpdHkgaXMgc3RhcnRlZCBmaXJzdC4KLSAgICAgICAgZm9yIChpbnQgaSA9IGxpbmVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbGluZSA9IGxpbmVzW2ldLnRyaW0oKTsKLSAgICAgICAgICAgIE1hdGNoZXIgbWF0Y2hlciA9IHNOb3RTdGFydGVkV2FybmluZ1BhdHRlcm4ubWF0Y2hlcihsaW5lKTsKLSAgICAgICAgICAgIGlmIChtYXRjaGVyLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgIHdhcm5pbmdGb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaGVyID0gc1N0YXR1c1BhdHRlcm4ubWF0Y2hlcihsaW5lKTsKLSAgICAgICAgICAgIGlmIChtYXRjaGVyLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IG1hdGNoZXIuZ3JvdXAoMSk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaGVyID0gc0FjdGl2aXR5UGF0dGVybi5tYXRjaGVyKGxpbmUpOwotICAgICAgICAgICAgaWYgKG1hdGNoZXIubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgcmVwb3J0ZWRBY3Rpdml0eSA9IG1hdGNoZXIuZ3JvdXAoMSk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnRUcnVlKCJTdGF0dXMgIiArIHN0YXR1cyArICIgaXMgbm90IG9rIiwgc1N0YXR1c09rLmVxdWFscyhzdGF0dXMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiUmVwb3J0ZWQgYWN0aXZpdHkgaXMgIiArIHJlcG9ydGVkQWN0aXZpdHkgKyAiIG5vdCAiICsgY29tcG9uZW50QWN0aXZpdHlOYW1lLAotICAgICAgICAgICAgICAgIGNvbXBvbmVudEFjdGl2aXR5TmFtZS5lcXVhbHMocmVwb3J0ZWRBY3Rpdml0eSkpOwotCi0gICAgICAgIGlmIChzaG91bGRTdGFydCAmJiB3YXJuaW5nRm91bmQpIHsKLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCBzdGFydCBuZXcgYWN0aXZpdHkgYnV0IGJyb3VnaHQgc29tZXRoaW5nIHRvIGZyb250LiIpOwotICAgICAgICB9IGVsc2UgaWYgKCFzaG91bGRTdGFydCAmJiAhd2FybmluZ0ZvdW5kKXsKLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCBicmluZyBleGlzdGluZyBhY3Rpdml0eSB0byBmcm9udCBidXQgc3RhcnRlZCBuZXcgYWN0aXZpdHkuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHNEaXNwbGF5VGltZVBhdHRlcm4gPQotICAgICAgICAgICAgUGF0dGVybi5jb21waWxlKCIoLispOiBEaXNwbGF5ZWQgKC4qKTogKFxcK3swLDF9KShbMC05XSspbXMoLiopIik7Ci0KLSAgICB2b2lkIHZlcmlmeUxvZ2NhdChTdHJpbmcgYWN0dWFsQWN0aXZpdHlOYW1lLCBib29sZWFuIHNob3VsZFN0YXJ0LCBTdHJpbmcgbG9nU2VwYXJhdG9yKQotICAgICAgICAgICAgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBkaXNwbGF5Q291bnQgPSAwOwotICAgICAgICBTdHJpbmcgYWN0aXZpdHlOYW1lID0gbnVsbDsKLQotICAgICAgICBmb3IgKFN0cmluZyBsaW5lIDogZ2V0RGV2aWNlTG9nc0ZvckNvbXBvbmVudCgiQWN0aXZpdHlNYW5hZ2VyIiwgbG9nU2VwYXJhdG9yKSkgewotICAgICAgICAgICAgbGluZSA9IGxpbmUudHJpbSgpOwotCi0gICAgICAgICAgICBNYXRjaGVyIG1hdGNoZXIgPSBzRGlzcGxheVRpbWVQYXR0ZXJuLm1hdGNoZXIobGluZSk7Ci0gICAgICAgICAgICBpZiAobWF0Y2hlci5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICBhY3Rpdml0eU5hbWUgPSBtYXRjaGVyLmdyb3VwKDIpOwotICAgICAgICAgICAgICAgIC8vIElnbm9yZSBhY3Rpdml0aXkgZGlzcGxheXMgZnJvbSBvdGhlciBwYWNrYWdlcywgd2UgZG9uJ3QKLSAgICAgICAgICAgICAgICAvLyB3YW50IHNvbWUgcmFuZG9tIGFjdGl2aXR5IHN0YXJ0cyB0byBydWluIG91ciB0ZXN0LgotICAgICAgICAgICAgICAgIGlmICghYWN0aXZpdHlOYW1lLnN0YXJ0c1dpdGgoImFuZHJvaWQuc2VydmVyLmN0cyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIXNob3VsZFN0YXJ0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGZhaWwoIlNob3VsZG4ndCBkaXNwbGF5IGFueXRoaW5nIGJ1dCBkaXNwbGF5ZWQgIiArIGFjdGl2aXR5TmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRpc3BsYXlDb3VudCsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIFN0cmluZyBleHBlY3RlZEFjdGl2aXR5TmFtZSA9IGdldEFjdGl2aXR5Q29tcG9uZW50TmFtZShhY3R1YWxBY3Rpdml0eU5hbWUpOwotICAgICAgICBpZiAoc2hvdWxkU3RhcnQpIHsKLSAgICAgICAgICAgIGlmIChkaXNwbGF5Q291bnQgIT0gMSkgewotICAgICAgICAgICAgICAgIGZhaWwoIlNob3VsZCBkaXNwbGF5IGV4YWN0bHkgb25lIGFjdGl2aXR5IGJ1dCBkaXNwbGF5ZWQgIiArIGRpc3BsYXlDb3VudCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFleHBlY3RlZEFjdGl2aXR5TmFtZS5lcXVhbHMoYWN0aXZpdHlOYW1lKSkgewotICAgICAgICAgICAgICAgIGZhaWwoIlNob3VsZCBkaXNwbGF5ICIgKyBleHBlY3RlZEFjdGl2aXR5TmFtZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGJ1dCBkaXNwbGF5ZWQgIiArIGFjdGl2aXR5TmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9BY3Rpdml0eU1hbmFnZXJBcHBDb25maWd1cmF0aW9uVGVzdHMuamF2YSBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0FjdGl2aXR5TWFuYWdlckFwcENvbmZpZ3VyYXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZTFlZDhmLi4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0FjdGl2aXR5TWFuYWdlckFwcENvbmZpZ3VyYXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjA4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAotICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSAqIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAotICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCi0gKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgotICogdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuY3RzOwotCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmN0cy5BY3Rpdml0eU1hbmFnZXJTdGF0ZS5TVEFURV9SRVNVTUVEOwotCi1pbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlByZXN1Ym1pdDsKLQotaW1wb3J0IGFuZHJvaWQuc2VydmVyLmN0cy5BY3Rpdml0eU1hbmFnZXJTdGF0ZS5BY3Rpdml0eVN0YWNrOwotaW1wb3J0IGFuZHJvaWQuc2VydmVyLmN0cy5BY3Rpdml0eU1hbmFnZXJTdGF0ZS5BY3Rpdml0eVRhc2s7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkxvZy5Mb2dMZXZlbDsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5sb2cuTG9nVXRpbC5DTG9nOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DZGRUZXN0OwotCi1pbXBvcnQgamF2YS5hd3QuUmVjdGFuZ2xlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuY3RzLkFjdGl2aXR5QW5kV2luZG93TWFuYWdlcnNTdGF0ZS5kcFRvUHg7Ci0KLS8qKgotICogQnVpbGQ6IG1tbWEgLWozMiBjdHMvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcwotICogUnVuOiBjdHMvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvdXRpbC9ydW4tdGVzdCBDdHNTZXJ2aWNlc0hvc3RUZXN0Q2FzZXMgYW5kcm9pZC5zZXJ2ZXIuY3RzLkFjdGl2aXR5TWFuYWdlckFwcENvbmZpZ3VyYXRpb25UZXN0cwotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlNYW5hZ2VyQXBwQ29uZmlndXJhdGlvblRlc3RzIGV4dGVuZHMgQWN0aXZpdHlNYW5hZ2VyVGVzdEJhc2UgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNJWkVBQkxFX0FDVElWSVRZX05BTUUgPSAiUmVzaXplYWJsZUFjdGl2aXR5IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9BQ1RJVklUWV9OQU1FID0gIlRlc3RBY3Rpdml0eSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBPUlRSQUlUX0FDVElWSVRZX05BTUUgPSAiUG9ydHJhaXRPcmllbnRhdGlvbkFjdGl2aXR5IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFORFNDQVBFX0FDVElWSVRZX05BTUUgPSAiTGFuZHNjYXBlT3JpZW50YXRpb25BY3Rpdml0eSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5JR0hUX01PREVfQUNUSVZJVFkgPSAiTmlnaHRNb2RlQWN0aXZpdHkiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESUFMT0dfV0hFTl9MQVJHRV9BQ1RJVklUWSA9ICJEaWFsb2dXaGVuTGFyZ2VBY3Rpdml0eSI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBTlNMVUNFTlRfQUNUSVZJVFkgPSAiVHJhbnNsdWNlbnRMYW5kc2NhcGVBY3Rpdml0eSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQU5TTFVDRU5UX0NVUlJFTlRfUEFDS0FHRSA9ICJhbmRyb2lkLnNlcnZlci50cmFuc2x1Y2VudGFwcCI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfTEFVTkNIX05FV19UQVNLID0gImxhdW5jaF9uZXdfdGFzayI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU01BTExfV0lEVEhfRFAgPSA0MjY7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNNQUxMX0hFSUdIVF9EUCA9IDMyMDsKLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoYXQgdGhlIFdpbmRvd01hbmFnZXIjZ2V0RGVmYXVsdERpc3BsYXkoKSBhbmQgdGhlIENvbmZpZ3VyYXRpb24gb2YgdGhlIEFjdGl2aXR5Ci0gICAgICogaGFzIGFuIHVwZGF0ZWQgc2l6ZSB3aGVuIHRoZSBBY3Rpdml0eSBpcyByZXNpemVkIGZyb20gZnVsbHNjcmVlbiB0byBkb2NrZWQgc3RhdGUuCi0gICAgICoKLSAgICAgKiBUaGUgQWN0aXZpdHkgaGFuZGxlcyBjb25maWd1cmF0aW9uIGNoYW5nZXMsIHNvIGl0IHdpbGwgbm90IGJlIHJlc3RhcnRlZCBiZXR3ZWVuIHJlc2l6ZXMuCi0gICAgICogT24gQ29uZmlndXJhdGlvbiBjaGFuZ2VzLCB0aGUgQWN0aXZpdHkgbG9ncyB0aGUgRGlzcGxheSBzaXplIGFuZCBDb25maWd1cmF0aW9uIHdpZHRoCi0gICAgICogYW5kIGhlaWdodHMuIFRoZSB2YWx1ZXMgcmVwb3J0ZWQgaW4gZnVsbHNjcmVlbiBzaG91bGQgYmUgbGFyZ2VyIHRoYW4gdGhvc2UgcmVwb3J0ZWQgaW4KLSAgICAgKiBkb2NrZWQgc3RhdGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdENvbmZpZ3VyYXRpb25VcGRhdGVzV2hlblJlc2l6ZWRGcm9tRnVsbHNjcmVlbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIXN1cHBvcnRzU3BsaXRTY3JlZW5NdWx0aVdpbmRvdygpKSB7Ci0gICAgICAgICAgICBDTG9nLmxvZ0FuZERpc3BsYXkoTG9nTGV2ZWwuSU5GTywgIlNraXBwaW5nIHRlc3Q6IG5vIG11bHRpLXdpbmRvdyBzdXBwb3J0Iik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgbG9nU2VwYXJhdG9yID0gY2xlYXJMb2djYXQoKTsKLSAgICAgICAgbGF1bmNoQWN0aXZpdHlJblN0YWNrKFJFU0laRUFCTEVfQUNUSVZJVFlfTkFNRSwgRlVMTFNDUkVFTl9XT1JLU1BBQ0VfU1RBQ0tfSUQpOwotICAgICAgICBmaW5hbCBSZXBvcnRlZFNpemVzIGZ1bGxzY3JlZW5TaXplcyA9IGdldEFjdGl2aXR5RGlzcGxheVNpemUoUkVTSVpFQUJMRV9BQ1RJVklUWV9OQU1FLAotICAgICAgICAgICAgICAgIGxvZ1NlcGFyYXRvcik7Ci0KLSAgICAgICAgbG9nU2VwYXJhdG9yID0gY2xlYXJMb2djYXQoKTsKLSAgICAgICAgbW92ZUFjdGl2aXR5VG9TdGFjayhSRVNJWkVBQkxFX0FDVElWSVRZX05BTUUsIERPQ0tFRF9TVEFDS19JRCk7Ci0gICAgICAgIGZpbmFsIFJlcG9ydGVkU2l6ZXMgZG9ja2VkU2l6ZXMgPSBnZXRBY3Rpdml0eURpc3BsYXlTaXplKFJFU0laRUFCTEVfQUNUSVZJVFlfTkFNRSwKLSAgICAgICAgICAgICAgICBsb2dTZXBhcmF0b3IpOwotCi0gICAgICAgIGFzc2VydFNpemVzQXJlU2FuZShmdWxsc2NyZWVuU2l6ZXMsIGRvY2tlZFNpemVzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTYW1lIGFzIHtAbGluayAjdGVzdENvbmZpZ3VyYXRpb25VcGRhdGVzV2hlblJlc2l6ZWRGcm9tRnVsbHNjcmVlbigpfSBidXQgcmVzaXppbmcKLSAgICAgKiBmcm9tIGRvY2tlZCBzdGF0ZSB0byBmdWxsc2NyZWVuIChyZXZlcnNlKS4KLSAgICAgKi8KLSAgICAvLyBUT0RPOiBGbGFreSwgYWRkIHRvIHByZXN1Ym1pdCB3aGVuIGIvNjM0MDQ1NzUgaXMgZml4ZWQuCi0gICAgcHVibGljIHZvaWQgdGVzdENvbmZpZ3VyYXRpb25VcGRhdGVzV2hlblJlc2l6ZWRGcm9tRG9ja2VkU3RhY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0c1NwbGl0U2NyZWVuTXVsdGlXaW5kb3coKSkgewotICAgICAgICAgICAgQ0xvZy5sb2dBbmREaXNwbGF5KExvZ0xldmVsLklORk8sICJTa2lwcGluZyB0ZXN0OiBubyBtdWx0aS13aW5kb3cgc3VwcG9ydCIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGxvZ1NlcGFyYXRvciA9IGNsZWFyTG9nY2F0KCk7Ci0gICAgICAgIGxhdW5jaEFjdGl2aXR5SW5TdGFjayhSRVNJWkVBQkxFX0FDVElWSVRZX05BTUUsIERPQ0tFRF9TVEFDS19JRCk7Ci0gICAgICAgIGZpbmFsIFJlcG9ydGVkU2l6ZXMgZG9ja2VkU2l6ZXMgPSBnZXRBY3Rpdml0eURpc3BsYXlTaXplKFJFU0laRUFCTEVfQUNUSVZJVFlfTkFNRSwKLSAgICAgICAgICAgICAgICBsb2dTZXBhcmF0b3IpOwotCi0gICAgICAgIGxvZ1NlcGFyYXRvciA9IGNsZWFyTG9nY2F0KCk7Ci0gICAgICAgIG1vdmVBY3Rpdml0eVRvU3RhY2soUkVTSVpFQUJMRV9BQ1RJVklUWV9OQU1FLCBGVUxMU0NSRUVOX1dPUktTUEFDRV9TVEFDS19JRCk7Ci0gICAgICAgIGZpbmFsIFJlcG9ydGVkU2l6ZXMgZnVsbHNjcmVlblNpemVzID0gZ2V0QWN0aXZpdHlEaXNwbGF5U2l6ZShSRVNJWkVBQkxFX0FDVElWSVRZX05BTUUsCi0gICAgICAgICAgICAgICAgbG9nU2VwYXJhdG9yKTsKLQotICAgICAgICBhc3NlcnRTaXplc0FyZVNhbmUoZnVsbHNjcmVlblNpemVzLCBkb2NrZWRTaXplcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgd2hldGhlciB0aGUgRGlzcGxheSBzaXplcyBjaGFuZ2Ugd2hlbiByb3RhdGluZyB0aGUgZGV2aWNlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RDb25maWd1cmF0aW9uVXBkYXRlc1doZW5Sb3RhdGluZ1doaWxlRnVsbHNjcmVlbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIXN1cHBvcnRzUm90YXRpb24oKSkgewotICAgICAgICAgICAgQ0xvZy5sb2dBbmREaXNwbGF5KExvZ0xldmVsLklORk8sICJTa2lwcGluZyB0ZXN0OiBubyByb3RhdGlvbiBzdXBwb3J0Iik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc2V0RGV2aWNlUm90YXRpb24oMCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBsb2dTZXBhcmF0b3IgPSBjbGVhckxvZ2NhdCgpOwotICAgICAgICBsYXVuY2hBY3Rpdml0eUluU3RhY2soUkVTSVpFQUJMRV9BQ1RJVklUWV9OQU1FLCBGVUxMU0NSRUVOX1dPUktTUEFDRV9TVEFDS19JRCk7Ci0gICAgICAgIGZpbmFsIFJlcG9ydGVkU2l6ZXMgaW5pdGlhbFNpemVzID0gZ2V0QWN0aXZpdHlEaXNwbGF5U2l6ZShSRVNJWkVBQkxFX0FDVElWSVRZX05BTUUsCi0gICAgICAgICAgICAgICAgbG9nU2VwYXJhdG9yKTsKLQotICAgICAgICByb3RhdGVBbmRDaGVja1NpemVzKGluaXRpYWxTaXplcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2FtZSBhcyB7QGxpbmsgI3Rlc3RDb25maWd1cmF0aW9uVXBkYXRlc1doZW5Sb3RhdGluZ1doaWxlRnVsbHNjcmVlbigpfSBidXQgd2hlbiB0aGUgQWN0aXZpdHkKLSAgICAgKiBpcyBpbiB0aGUgZG9ja2VkIHN0YWNrLgotICAgICAqLwotICAgIC8vIFRPRE86IEZsYWt5LCBhZGQgdG8gcHJlc3VibWl0IHdoZW4gYi82MzQwNDU3NSBpcyBmaXhlZC4KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uZmlndXJhdGlvblVwZGF0ZXNXaGVuUm90YXRpbmdXaGlsZURvY2tlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIXN1cHBvcnRzU3BsaXRTY3JlZW5NdWx0aVdpbmRvdygpKSB7Ci0gICAgICAgICAgICBDTG9nLmxvZ0FuZERpc3BsYXkoTG9nTGV2ZWwuSU5GTywgIlNraXBwaW5nIHRlc3Q6IG5vIG11bHRpLXdpbmRvdyBzdXBwb3J0Iik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBzZXREZXZpY2VSb3RhdGlvbigwKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGxvZ1NlcGFyYXRvciA9IGNsZWFyTG9nY2F0KCk7Ci0gICAgICAgIGxhdW5jaEFjdGl2aXR5SW5Eb2NrU3RhY2soTEFVTkNISU5HX0FDVElWSVRZKTsKLSAgICAgICAgLy8gTGF1bmNoIG91ciBvd24gYWN0aXZpdHkgdG8gc2lkZSBpbiBjYXNlIFJlY2VudHMgKG9yIG90aGVyIGFjdGl2aXR5IHRvIHNpZGUpIGRvZXNuJ3QKLSAgICAgICAgLy8gc3VwcG9ydCByb3RhdGlvbi4KLSAgICAgICAgZ2V0TGF1bmNoQWN0aXZpdHlCdWlsZGVyKCkuc2V0VG9TaWRlKHRydWUpLnNldFRhcmdldEFjdGl2aXR5TmFtZShURVNUX0FDVElWSVRZX05BTUUpCi0gICAgICAgICAgICAgICAgLmV4ZWN1dGUoKTsKLSAgICAgICAgLy8gTGF1bmNoIHRhcmdldCBhY3Rpdml0eSBpbiBkb2NrZWQgc3RhY2suCi0gICAgICAgIGdldExhdW5jaEFjdGl2aXR5QnVpbGRlcigpLnNldFRhcmdldEFjdGl2aXR5TmFtZShSRVNJWkVBQkxFX0FDVElWSVRZX05BTUUpLmV4ZWN1dGUoKTsKLSAgICAgICAgZmluYWwgUmVwb3J0ZWRTaXplcyBpbml0aWFsU2l6ZXMgPSBnZXRBY3Rpdml0eURpc3BsYXlTaXplKFJFU0laRUFCTEVfQUNUSVZJVFlfTkFNRSwKLSAgICAgICAgICAgICAgICBsb2dTZXBhcmF0b3IpOwotCi0gICAgICAgIHJvdGF0ZUFuZENoZWNrU2l6ZXMoaW5pdGlhbFNpemVzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTYW1lIGFzIHtAbGluayAjdGVzdENvbmZpZ3VyYXRpb25VcGRhdGVzV2hlblJvdGF0aW5nV2hpbGVEb2NrZWQoKX0gYnV0IHdoZW4gdGhlIEFjdGl2aXR5Ci0gICAgICogaXMgbGF1bmNoZWQgdG8gc2lkZSBmcm9tIGRvY2tlZCBzdGFjay4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uZmlndXJhdGlvblVwZGF0ZXNXaGVuUm90YXRpbmdUb1NpZGVGcm9tRG9ja2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghc3VwcG9ydHNTcGxpdFNjcmVlbk11bHRpV2luZG93KCkpIHsKLSAgICAgICAgICAgIENMb2cubG9nQW5kRGlzcGxheShMb2dMZXZlbC5JTkZPLCAiU2tpcHBpbmcgdGVzdDogbm8gbXVsdGktd2luZG93IHN1cHBvcnQiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHNldERldmljZVJvdGF0aW9uKDApOwotCi0gICAgICAgIGZpbmFsIFN0cmluZyBsb2dTZXBhcmF0b3IgPSBjbGVhckxvZ2NhdCgpOwotICAgICAgICBsYXVuY2hBY3Rpdml0eUluRG9ja1N0YWNrKExBVU5DSElOR19BQ1RJVklUWSk7Ci0KLSAgICAgICAgZ2V0TGF1bmNoQWN0aXZpdHlCdWlsZGVyKCkuc2V0VG9TaWRlKHRydWUpLnNldFRhcmdldEFjdGl2aXR5TmFtZShSRVNJWkVBQkxFX0FDVElWSVRZX05BTUUpCi0gICAgICAgICAgICAgICAgLmV4ZWN1dGUoKTsKLSAgICAgICAgZmluYWwgUmVwb3J0ZWRTaXplcyBpbml0aWFsU2l6ZXMgPSBnZXRBY3Rpdml0eURpc3BsYXlTaXplKFJFU0laRUFCTEVfQUNUSVZJVFlfTkFNRSwKLSAgICAgICAgICAgICAgICBsb2dTZXBhcmF0b3IpOwotCi0gICAgICAgIHJvdGF0ZUFuZENoZWNrU2l6ZXMoaW5pdGlhbFNpemVzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcm90YXRlQW5kQ2hlY2tTaXplcyhSZXBvcnRlZFNpemVzIHByZXZTaXplcykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZvciAoaW50IHJvdGF0aW9uID0gMzsgcm90YXRpb24gPj0gMDsgLS1yb3RhdGlvbikgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxvZ1NlcGFyYXRvciA9IGNsZWFyTG9nY2F0KCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgYWN0dWFsU3RhY2tJZCA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFRhc2tCeUFjdGl2aXR5TmFtZSgKLSAgICAgICAgICAgICAgICAgICAgUkVTSVpFQUJMRV9BQ1RJVklUWV9OQU1FKS5tU3RhY2tJZDsKLSAgICAgICAgICAgIGZpbmFsIGludCBkaXNwbGF5SWQgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja0J5SWQoYWN0dWFsU3RhY2tJZCkubURpc3BsYXlJZDsKLSAgICAgICAgICAgIHNldERldmljZVJvdGF0aW9uKHJvdGF0aW9uKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBuZXdEZXZpY2VSb3RhdGlvbiA9IGdldERldmljZVJvdGF0aW9uKGRpc3BsYXlJZCk7Ci0gICAgICAgICAgICBpZiAobmV3RGV2aWNlUm90YXRpb24gPT0gSU5WQUxJRF9ERVZJQ0VfUk9UQVRJT04pIHsKLSAgICAgICAgICAgICAgICBDTG9nLmxvZ0FuZERpc3BsYXkoTG9nTGV2ZWwuV0FSTiwgIkdvdCBhbiBpbnZhbGlkIGRldmljZSByb3RhdGlvbiB2YWx1ZS4gIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiQ29udGludWluZyB0aGUgdGVzdCBkZXNwaXRlIG9mIHRoYXQsIGJ1dCBpdCBpcyBsaWtlbHkgdG8gZmFpbC4iKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocm90YXRpb24gIT0gbmV3RGV2aWNlUm90YXRpb24pIHsKLSAgICAgICAgICAgICAgICBDTG9nLmxvZ0FuZERpc3BsYXkoTG9nTGV2ZWwuSU5GTywgIlRoaXMgZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBsb2NrZWQgdXNlciAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJyb3RhdGlvbiBtb2RlLiBOb3QgY29udGludWluZyB0aGUgcm90YXRpb24gY2hlY2tzLiIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZmluYWwgUmVwb3J0ZWRTaXplcyByb3RhdGVkU2l6ZXMgPSBnZXRBY3Rpdml0eURpc3BsYXlTaXplKFJFU0laRUFCTEVfQUNUSVZJVFlfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgbG9nU2VwYXJhdG9yKTsKLSAgICAgICAgICAgIGFzc2VydFNpemVzUm90YXRlKHByZXZTaXplcywgcm90YXRlZFNpemVzKTsKLSAgICAgICAgICAgIHByZXZTaXplcyA9IHJvdGF0ZWRTaXplczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHdoZW4gYWN0aXZpdHkgbW92ZWQgZnJvbSBmdWxsc2NyZWVuIHN0YWNrIHRvIGRvY2tlZCBhbmQgYmFjay4gQWN0aXZpdHkgd2lsbCBiZQotICAgICAqIHJlbGF1bmNoZWQgdHdpY2UgYW5kIGl0IHNob3VsZCBoYXZlIHNhbWUgY29uZmlnIGFzIGluaXRpYWwgb25lLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTYW1lQ29uZmlndXJhdGlvbkZ1bGxTcGxpdEZ1bGxSZWxhdW5jaCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtb3ZlQWN0aXZpdHlGdWxsU3BsaXRGdWxsKFRFU1RfQUNUSVZJVFlfTkFNRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2FtZSBhcyB7QGxpbmsgI3Rlc3RTYW1lQ29uZmlndXJhdGlvbkZ1bGxTcGxpdEZ1bGxSZWxhdW5jaH0gYnV0IHdpdGhvdXQgcmVsYXVuY2guCi0gICAgICovCi0gICAgQFByZXN1Ym1pdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTYW1lQ29uZmlndXJhdGlvbkZ1bGxTcGxpdEZ1bGxOb1JlbGF1bmNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1vdmVBY3Rpdml0eUZ1bGxTcGxpdEZ1bGwoUkVTSVpFQUJMRV9BQ1RJVklUWV9OQU1FKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMYXVuY2hlcyBhY3Rpdml0eSBpbiBmdWxsc2NyZWVuIHN0YWNrLCBtb3ZlcyB0byBkb2NrZWQgc3RhY2sgYW5kIGJhY2sgdG8gZnVsbHNjcmVlbiBzdGFjay4KLSAgICAgKiBMYXN0IG9wZXJhdGlvbiBpcyBkb25lIGluIGEgd2F5IHdoaWNoIHNpbXVsYXRlcyBzcGxpdC1zY3JlZW4gZGl2aWRlciBtb3ZlbWVudCBtYXhpbWl6aW5nCi0gICAgICogZG9ja2VkIHN0YWNrIHNpemUgYW5kIHRoZW4gbW92aW5nIHRhc2sgdG8gZnVsbHNjcmVlbiBzdGFjayAtIHRoZSBzYW1lIHdheSBpdCBpcyBkb25lIHdoZW4KLSAgICAgKiB1c2VyIGxvbmctcHJlc3NlcyBvdmVydmlldy9yZWNlbnRzIGJ1dHRvbiB0byBleGl0IHNwbGl0LXNjcmVlbi4KLSAgICAgKiBBc3NlcnRzIHRoYXQgaW5pdGlhbCBhbmQgZmluYWwgcmVwb3J0ZWQgc2l6ZXMgaW4gZnVsbHNjcmVlbiBzdGFjayBhcmUgdGhlIHNhbWUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIG1vdmVBY3Rpdml0eUZ1bGxTcGxpdEZ1bGwoU3RyaW5nIGFjdGl2aXR5TmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghc3VwcG9ydHNTcGxpdFNjcmVlbk11bHRpV2luZG93KCkpIHsKLSAgICAgICAgICAgIENMb2cubG9nQW5kRGlzcGxheShMb2dMZXZlbC5JTkZPLCAiU2tpcHBpbmcgdGVzdDogbm8gbXVsdGktd2luZG93IHN1cHBvcnQiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIExhdW5jaCB0byBmdWxsc2NyZWVuIHN0YWNrIGFuZCByZWNvcmQgc2l6ZS4KLSAgICAgICAgU3RyaW5nIGxvZ1NlcGFyYXRvciA9IGNsZWFyTG9nY2F0KCk7Ci0gICAgICAgIGxhdW5jaEFjdGl2aXR5SW5TdGFjayhhY3Rpdml0eU5hbWUsIEZVTExTQ1JFRU5fV09SS1NQQUNFX1NUQUNLX0lEKTsKLSAgICAgICAgZmluYWwgUmVwb3J0ZWRTaXplcyBpbml0aWFsRnVsbHNjcmVlblNpemVzID0gZ2V0QWN0aXZpdHlEaXNwbGF5U2l6ZShhY3Rpdml0eU5hbWUsCi0gICAgICAgICAgICAgICAgbG9nU2VwYXJhdG9yKTsKLSAgICAgICAgZmluYWwgUmVjdGFuZ2xlIGRpc3BsYXlSZWN0ID0gZ2V0RGlzcGxheVJlY3QoYWN0aXZpdHlOYW1lKTsKLQotICAgICAgICAvLyBNb3ZlIHRvIGRvY2tlZCBzdGFjay4KLSAgICAgICAgbG9nU2VwYXJhdG9yID0gY2xlYXJMb2djYXQoKTsKLSAgICAgICAgbW92ZUFjdGl2aXR5VG9TdGFjayhhY3Rpdml0eU5hbWUsIERPQ0tFRF9TVEFDS19JRCk7Ci0gICAgICAgIGZpbmFsIFJlcG9ydGVkU2l6ZXMgZG9ja2VkU2l6ZXMgPSBnZXRBY3Rpdml0eURpc3BsYXlTaXplKGFjdGl2aXR5TmFtZSwgbG9nU2VwYXJhdG9yKTsKLSAgICAgICAgYXNzZXJ0U2l6ZXNBcmVTYW5lKGluaXRpYWxGdWxsc2NyZWVuU2l6ZXMsIGRvY2tlZFNpemVzKTsKLSAgICAgICAgLy8gTWFrZSBzdXJlIGRvY2tlZCBzdGFjayBpcyBmb2N1c2VkLiBUaGlzIHdheSB3aGVuIHdlIGRpc21pc3MgaXQgbGF0ZXIgZnVsbHNjcmVlbiBzdGFjawotICAgICAgICAvLyB3aWxsIGNvbWUgdXAuCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5SW5TdGFjayhhY3Rpdml0eU5hbWUsIERPQ0tFRF9TVEFDS19JRCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIG5ldyBTdHJpbmdbXSB7IGFjdGl2aXR5TmFtZSB9LAotICAgICAgICAgICAgICAgIGZhbHNlIC8qIGNvbXBhcmVUYXNrQW5kU3RhY2tCb3VuZHMgKi8pOwotCi0gICAgICAgIC8vIFJlc2l6ZSBkb2NrZWQgc3RhY2sgdG8gZnVsbHNjcmVlbiBzaXplLiBUaGlzIHdpbGwgdHJpZ2dlciBhY3Rpdml0eSByZWxhdW5jaCB3aXRoCi0gICAgICAgIC8vIG5vbi1lbXB0eSBvdmVycmlkZSBjb25maWd1cmF0aW9uIGNvcnJlc3BvbmRpbmcgdG8gZnVsbHNjcmVlbiBzaXplLgotICAgICAgICBsb2dTZXBhcmF0b3IgPSBjbGVhckxvZ2NhdCgpOwotICAgICAgICBydW5Db21tYW5kQW5kUHJpbnRPdXRwdXQoImFtIHN0YWNrIHJlc2l6ZSAiICsgRE9DS0VEX1NUQUNLX0lEICsgIiAwIDAgIgotICAgICAgICAgICAgICAgICsgZGlzcGxheVJlY3Qud2lkdGggKyAiICIgKyBkaXNwbGF5UmVjdC5oZWlnaHQpOwotICAgICAgICAvLyBNb3ZlIGFjdGl2aXR5IGJhY2sgdG8gZnVsbHNjcmVlbiBzdGFjay4KLSAgICAgICAgbW92ZUFjdGl2aXR5VG9TdGFjayhhY3Rpdml0eU5hbWUsIEZVTExTQ1JFRU5fV09SS1NQQUNFX1NUQUNLX0lEKTsKLSAgICAgICAgZmluYWwgUmVwb3J0ZWRTaXplcyBmaW5hbEZ1bGxzY3JlZW5TaXplcyA9IGdldEFjdGl2aXR5RGlzcGxheVNpemUoYWN0aXZpdHlOYW1lLAotICAgICAgICAgICAgICAgIGxvZ1NlcGFyYXRvcik7Ci0KLSAgICAgICAgLy8gQWZ0ZXIgYWN0aXZpdHkgY29uZmlndXJhdGlvbiB3YXMgY2hhbmdlZCB0d2ljZSBpdCBtdXN0IHJlcG9ydCBzYW1lIHNpemUgYXMgb3JpZ2luYWwgb25lLgotICAgICAgICBhc3NlcnRTaXplc0FyZVNhbWUoaW5pdGlhbEZ1bGxzY3JlZW5TaXplcywgZmluYWxGdWxsc2NyZWVuU2l6ZXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHdoZW4gYWN0aXZpdHkgbW92ZWQgZnJvbSBkb2NrZWQgc3RhY2sgdG8gZnVsbHNjcmVlbiBhbmQgYmFjay4gQWN0aXZpdHkgd2lsbCBiZQotICAgICAqIHJlbGF1bmNoZWQgdHdpY2UgYW5kIGl0IHNob3VsZCBoYXZlIHNhbWUgY29uZmlnIGFzIGluaXRpYWwgb25lLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTYW1lQ29uZmlndXJhdGlvblNwbGl0RnVsbFNwbGl0UmVsYXVuY2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbW92ZUFjdGl2aXR5U3BsaXRGdWxsU3BsaXQoVEVTVF9BQ1RJVklUWV9OQU1FKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTYW1lIGFzIHtAbGluayAjdGVzdFNhbWVDb25maWd1cmF0aW9uU3BsaXRGdWxsU3BsaXRSZWxhdW5jaH0gYnV0IHdpdGhvdXQgcmVsYXVuY2guCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFNhbWVDb25maWd1cmF0aW9uU3BsaXRGdWxsU3BsaXROb1JlbGF1bmNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1vdmVBY3Rpdml0eVNwbGl0RnVsbFNwbGl0KFJFU0laRUFCTEVfQUNUSVZJVFlfTkFNRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhhdCBhbiBhY3Rpdml0eSB3aXRoIHRoZSBEaWFsb2dXaGVuTGFyZ2UgdGhlbWUgY2FuIHRyYW5zZm9ybSBwcm9wZXJseSB3aGVuIGluIHNwbGl0Ci0gICAgICogc2NyZWVuLgotICAgICAqLwotICAgIEBQcmVzdWJtaXQKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGlhbG9nV2hlbkxhcmdlU3BsaXRTbWFsbCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIXN1cHBvcnRzU3BsaXRTY3JlZW5NdWx0aVdpbmRvdygpKSB7Ci0gICAgICAgICAgICBDTG9nLmxvZ0FuZERpc3BsYXkoTG9nTGV2ZWwuSU5GTywgIlNraXBwaW5nIHRlc3Q6IG5vIG11bHRpLXdpbmRvdyBzdXBwb3J0Iik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBsYXVuY2hBY3Rpdml0eUluU3RhY2soRElBTE9HX1dIRU5fTEFSR0VfQUNUSVZJVFksIERPQ0tFRF9TVEFDS19JRCk7Ci0gICAgICAgIGZpbmFsIEFjdGl2aXR5TWFuYWdlclN0YXRlLkFjdGl2aXR5U3RhY2sgc3RhY2sgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKQotICAgICAgICAgICAgICAgIC5nZXRTdGFja0J5SWQoRE9DS0VEX1NUQUNLX0lEKTsKLSAgICAgICAgZmluYWwgV2luZG93TWFuYWdlclN0YXRlLkRpc3BsYXkgZGlzcGxheSA9Ci0gICAgICAgICAgICAgICAgbUFtV21TdGF0ZS5nZXRXbVN0YXRlKCkuZ2V0RGlzcGxheShzdGFjay5tRGlzcGxheUlkKTsKLSAgICAgICAgZmluYWwgaW50IGRlbnNpdHkgPSBkaXNwbGF5LmdldERwaSgpOwotICAgICAgICBmaW5hbCBpbnQgc21hbGxXaWR0aFB4ID0gZHBUb1B4KFNNQUxMX1dJRFRIX0RQLCBkZW5zaXR5KTsKLSAgICAgICAgZmluYWwgaW50IHNtYWxsSGVpZ2h0UHggPSBkcFRvUHgoU01BTExfSEVJR0hUX0RQLCBkZW5zaXR5KTsKLQotICAgICAgICBydW5Db21tYW5kQW5kUHJpbnRPdXRwdXQoImFtIHN0YWNrIHJlc2l6ZSAiICsgRE9DS0VEX1NUQUNLX0lEICsgIiAwIDAgIgotICAgICAgICAgICAgICAgICsgc21hbGxXaWR0aFB4ICsgIiAiICsgc21hbGxIZWlnaHRQeCk7Ci0gICAgICAgIG1BbVdtU3RhdGUud2FpdEZvclZhbGlkU3RhdGUobURldmljZSwgRElBTE9HX1dIRU5fTEFSR0VfQUNUSVZJVFksIERPQ0tFRF9TVEFDS19JRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCB0aGF0IGRldmljZSBoYW5kbGVzIGNvbnNlcXVlbnQgcmVxdWVzdGVkIG9yaWVudGF0aW9ucyBhbmQgZGlzcGxheXMgdGhlIGFjdGl2aXRpZXMuCi0gICAgICovCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuMS4zL0MtMS0xIikKLSAgICBAUHJlc3VibWl0Ci0gICAgcHVibGljIHZvaWQgdGVzdEZ1bGxzY3JlZW5BcHBPcmllbnRhdGlvblJlcXVlc3RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghc3VwcG9ydHNSb3RhdGlvbigpKSB7Ci0gICAgICAgICAgICBDTG9nLmxvZ0FuZERpc3BsYXkoTG9nTGV2ZWwuSU5GTywgIlNraXBwaW5nIHRlc3Q6IG5vIHJvdGF0aW9uIHN1cHBvcnQiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgbG9nU2VwYXJhdG9yID0gY2xlYXJMb2djYXQoKTsKLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoUE9SVFJBSVRfQUNUSVZJVFlfTkFNRSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShQT1JUUkFJVF9BQ1RJVklUWV9OQU1FLCB0cnVlIC8qIHZpc2libGUgKi8pOwotICAgICAgICBSZXBvcnRlZFNpemVzIHJlcG9ydGVkU2l6ZXMgPQotICAgICAgICAgICAgICAgIGdldExhc3RSZXBvcnRlZFNpemVzRm9yQWN0aXZpdHkoUE9SVFJBSVRfQUNUSVZJVFlfTkFNRSwgbG9nU2VwYXJhdG9yKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJwb3J0cmFpdCBhY3Rpdml0eSBzaG91bGQgYmUgaW4gcG9ydHJhaXQiLAotICAgICAgICAgICAgICAgIDEgLyogcG9ydHJhaXQgKi8sIHJlcG9ydGVkU2l6ZXMub3JpZW50YXRpb24pOwotICAgICAgICBsb2dTZXBhcmF0b3IgPSBjbGVhckxvZ2NhdCgpOwotCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5KExBTkRTQ0FQRV9BQ1RJVklUWV9OQU1FKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KExBTkRTQ0FQRV9BQ1RJVklUWV9OQU1FLCB0cnVlIC8qIHZpc2libGUgKi8pOwotICAgICAgICByZXBvcnRlZFNpemVzID0KLSAgICAgICAgICAgICAgICBnZXRMYXN0UmVwb3J0ZWRTaXplc0ZvckFjdGl2aXR5KExBTkRTQ0FQRV9BQ1RJVklUWV9OQU1FLCBsb2dTZXBhcmF0b3IpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImxhbmRzY2FwZSBhY3Rpdml0eSBzaG91bGQgYmUgaW4gbGFuZHNjYXBlIiwKLSAgICAgICAgICAgICAgICAyIC8qIGxhbmRzY2FwZSAqLywgcmVwb3J0ZWRTaXplcy5vcmllbnRhdGlvbik7Ci0gICAgICAgIGxvZ1NlcGFyYXRvciA9IGNsZWFyTG9nY2F0KCk7Ci0KLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoUE9SVFJBSVRfQUNUSVZJVFlfTkFNRSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShQT1JUUkFJVF9BQ1RJVklUWV9OQU1FLCB0cnVlIC8qIHZpc2libGUgKi8pOwotICAgICAgICByZXBvcnRlZFNpemVzID0KLSAgICAgICAgICAgICAgICBnZXRMYXN0UmVwb3J0ZWRTaXplc0ZvckFjdGl2aXR5KFBPUlRSQUlUX0FDVElWSVRZX05BTUUsIGxvZ1NlcGFyYXRvcik7Ci0gICAgICAgIGFzc2VydEVxdWFscygicG9ydHJhaXQgYWN0aXZpdHkgc2hvdWxkIGJlIGluIHBvcnRyYWl0IiwKLSAgICAgICAgICAgICAgICAxIC8qIHBvcnRyYWl0ICovLCByZXBvcnRlZFNpemVzLm9yaWVudGF0aW9uKTsKLSAgICAgICAgbG9nU2VwYXJhdG9yID0gY2xlYXJMb2djYXQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uZnVsbHNjcmVlbkFwcE9yaWVudGF0aW9uUmVxdWVzdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0c1JvdGF0aW9uKCkpIHsKLSAgICAgICAgICAgIENMb2cubG9nQW5kRGlzcGxheShMb2dMZXZlbC5JTkZPLCAiU2tpcHBpbmcgdGVzdDogbm8gcm90YXRpb24gc3VwcG9ydCIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBsb2dTZXBhcmF0b3IgPSBjbGVhckxvZ2NhdCgpOwotICAgICAgICBsYXVuY2hBY3Rpdml0eShQT1JUUkFJVF9BQ1RJVklUWV9OQU1FKTsKLSAgICAgICAgZmluYWwgUmVwb3J0ZWRTaXplcyBpbml0aWFsUmVwb3J0ZWRTaXplcyA9Ci0gICAgICAgICAgICAgICAgZ2V0TGFzdFJlcG9ydGVkU2l6ZXNGb3JBY3Rpdml0eShQT1JUUkFJVF9BQ1RJVklUWV9OQU1FLCBsb2dTZXBhcmF0b3IpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInBvcnRyYWl0IGFjdGl2aXR5IHNob3VsZCBiZSBpbiBwb3J0cmFpdCIsCi0gICAgICAgICAgICAgICAgMSAvKiBwb3J0cmFpdCAqLywgaW5pdGlhbFJlcG9ydGVkU2l6ZXMub3JpZW50YXRpb24pOwotICAgICAgICBsb2dTZXBhcmF0b3IgPSBjbGVhckxvZ2NhdCgpOwotCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5SW5Db21wb25lbnQoVFJBTlNMVUNFTlRfQ1VSUkVOVF9QQUNLQUdFLCBUUkFOU0xVQ0VOVF9BQ1RJVklUWSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJub24tZnVsbHNjcmVlbiBhY3Rpdml0eSByZXF1ZXN0ZWQgbGFuZHNjYXBlIG9yaWVudGF0aW9uIiwKLSAgICAgICAgICAgICAgICAwIC8qIGxhbmRzY2FwZSAqLywgbUFtV21TdGF0ZS5nZXRXbVN0YXRlKCkuZ2V0TGFzdE9yaWVudGF0aW9uKCkpOwotCi0gICAgICAgIC8vIFRPRE8oYi8zNjg5Nzk2OCk6IHVuY29tbWVudCBvbmNlIHdlIGNhbiBzdXBwcmVzcyB1bnN1cHBvcnRlZCBjb25maWd1cmF0aW9ucwotICAgICAgICAvLyBmaW5hbCBSZXBvcnRlZFNpemVzIHVwZGF0ZWRSZXBvcnRlZFNpemVzID0KLSAgICAgICAgLy8gICAgICBnZXRMYXN0UmVwb3J0ZWRTaXplc0ZvckFjdGl2aXR5KFBPUlRSQUlUX0FDVElWSVRZX05BTUUsIGxvZ1NlcGFyYXRvcik7Ci0gICAgICAgIC8vIGFzc2VydEVxdWFscygicG9ydHJhaXQgYWN0aXZpdHkgc2hvdWxkIG5vdCBoYXZlIG1vdmVkIGZyb20gcG9ydHJhaXQiLAotICAgICAgICAvLyAgICAgICAgIDEgLyogcG9ydHJhaXQgKi8sIHVwZGF0ZWRSZXBvcnRlZFNpemVzLm9yaWVudGF0aW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uRnVsbHNjcmVlbkFjdGl2aXR5UGVybWl0dGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNldENvbXBvbmVudE5hbWUoVFJBTlNMVUNFTlRfQ1VSUkVOVF9QQUNLQUdFKTsKLSAgICAgICAgc2V0RGV2aWNlUm90YXRpb24oMCk7Ci0KLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoVFJBTlNMVUNFTlRfQUNUSVZJVFkpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFJlc3VtZWRBY3Rpdml0eSgKLSAgICAgICAgICAgICAgICAidGFyZ2V0IFNESyBub24tZnVsbHNjcmVlbiBhY3Rpdml0eSBzaG91bGQgYmUgYWxsb3dlZCB0byBsYXVuY2giLAotICAgICAgICAgICAgICAgIFRSQU5TTFVDRU5UX0FDVElWSVRZKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJub24tZnVsbHNjcmVlbiBhY3Rpdml0eSByZXF1ZXN0ZWQgbGFuZHNjYXBlIG9yaWVudGF0aW9uIiwKLSAgICAgICAgICAgICAgICAwIC8qIGxhbmRzY2FwZSAqLywgbUFtV21TdGF0ZS5nZXRXbVN0YXRlKCkuZ2V0TGFzdE9yaWVudGF0aW9uKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgdGhhdCBkZXZpY2UgaGFuZGxlcyBtb3ZpbmcgYmV0d2VlbiB0d28gdGFza3Mgd2l0aCBkaWZmZXJlbnQgb3JpZW50YXRpb25zLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RUYXNrQ2xvc2VSZXN0b3JlT3JpZW50YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0c1JvdGF0aW9uKCkpIHsKLSAgICAgICAgICAgIENMb2cubG9nQW5kRGlzcGxheShMb2dMZXZlbC5JTkZPLCAiU2tpcHBpbmcgdGVzdDogbm8gcm90YXRpb24gc3VwcG9ydCIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIC8vIFN0YXJ0IGxhbmRzY2FwZSBhY3Rpdml0eS4KLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoTEFORFNDQVBFX0FDVElWSVRZX05BTUUpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoTEFORFNDQVBFX0FDVElWSVRZX05BTUUsIHRydWUgLyogdmlzaWJsZSAqLyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRnVsbHNjcmVlbiBhcHAgcmVxdWVzdGVkIGxhbmRzY2FwZSBvcmllbnRhdGlvbiIsCi0gICAgICAgICAgICAgICAgMCAvKiBsYW5kc2NhcGUgKi8sIG1BbVdtU3RhdGUuZ2V0V21TdGF0ZSgpLmdldExhc3RPcmllbnRhdGlvbigpKTsKLQotICAgICAgICAvLyBTdGFydCBhbm90aGVyIGFjdGl2aXR5IGluIGEgZGlmZmVyZW50IHRhc2suCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5SW5OZXdUYXNrKEJST0FEQ0FTVF9SRUNFSVZFUl9BQ1RJVklUWSk7Ci0KLSAgICAgICAgLy8gUmVxdWVzdCBwb3J0cmFpdAotICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKGdldE9yaWVudGF0aW9uQnJvYWRjYXN0KDEgLypwb3J0cmFpdCovKSk7Ci0gICAgICAgIG1BbVdtU3RhdGUud2FpdEZvclJvdGF0aW9uKG1EZXZpY2UsIDEpOwotCi0gICAgICAgIC8vIEZpbmlzaCBhY3Rpdml0eQotICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKEZJTklTSF9BQ1RJVklUWV9CUk9BRENBU1QpOwotCi0gICAgICAgIC8vIFZlcmlmeSB0aGF0IGFjdGl2aXR5IGJyb3VnaHQgdG8gZnJvbnQgaXMgaW4gb3JpZ2luYWxseSByZXF1ZXN0ZWQgb3JpZW50YXRpb24uCi0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIG5ldyBTdHJpbmdbXXtMQU5EU0NBUEVfQUNUSVZJVFlfTkFNRX0pOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlNob3VsZCByZXR1cm4gdG8gYXBwIGluIGxhbmRzY2FwZSBvcmllbnRhdGlvbiIsCi0gICAgICAgICAgICAgICAgMCAvKiBsYW5kc2NhcGUgKi8sIG1BbVdtU3RhdGUuZ2V0V21TdGF0ZSgpLmdldExhc3RPcmllbnRhdGlvbigpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHRoYXQgZGV2aWNlIGhhbmRsZXMgbW92aW5nIGJldHdlZW4gdHdvIHRhc2tzIHdpdGggZGlmZmVyZW50IG9yaWVudGF0aW9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VGFza01vdmVUb0JhY2tPcmllbnRhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIXN1cHBvcnRzUm90YXRpb24oKSkgewotICAgICAgICAgICAgQ0xvZy5sb2dBbmREaXNwbGF5KExvZ0xldmVsLklORk8sICJTa2lwcGluZyB0ZXN0OiBubyByb3RhdGlvbiBzdXBwb3J0Iik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgLy8gU3RhcnQgbGFuZHNjYXBlIGFjdGl2aXR5LgotICAgICAgICBsYXVuY2hBY3Rpdml0eShMQU5EU0NBUEVfQUNUSVZJVFlfTkFNRSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShMQU5EU0NBUEVfQUNUSVZJVFlfTkFNRSwgdHJ1ZSAvKiB2aXNpYmxlICovKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJGdWxsc2NyZWVuIGFwcCByZXF1ZXN0ZWQgbGFuZHNjYXBlIG9yaWVudGF0aW9uIiwKLSAgICAgICAgICAgICAgICAwIC8qIGxhbmRzY2FwZSAqLywgbUFtV21TdGF0ZS5nZXRXbVN0YXRlKCkuZ2V0TGFzdE9yaWVudGF0aW9uKCkpOwotCi0gICAgICAgIC8vIFN0YXJ0IGFub3RoZXIgYWN0aXZpdHkgaW4gYSBkaWZmZXJlbnQgdGFzay4KLSAgICAgICAgbGF1bmNoQWN0aXZpdHlJbk5ld1Rhc2soQlJPQURDQVNUX1JFQ0VJVkVSX0FDVElWSVRZKTsKLQotICAgICAgICAvLyBSZXF1ZXN0IHBvcnRyYWl0Ci0gICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoZ2V0T3JpZW50YXRpb25Ccm9hZGNhc3QoMSAvKnBvcnRyYWl0Ki8pKTsKLSAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yUm90YXRpb24obURldmljZSwgMSk7Ci0KLSAgICAgICAgLy8gRmluaXNoIGFjdGl2aXR5Ci0gICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoTU9WRV9UQVNLX1RPX0JBQ0tfQlJPQURDQVNUKTsKLQotICAgICAgICAvLyBWZXJpZnkgdGhhdCBhY3Rpdml0eSBicm91Z2h0IHRvIGZyb250IGlzIGluIG9yaWdpbmFsbHkgcmVxdWVzdGVkIG9yaWVudGF0aW9uLgotICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JWYWxpZFN0YXRlKG1EZXZpY2UsIExBTkRTQ0FQRV9BQ1RJVklUWV9OQU1FKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJTaG91bGQgcmV0dXJuIHRvIGFwcCBpbiBsYW5kc2NhcGUgb3JpZW50YXRpb24iLAotICAgICAgICAgICAgICAgIDAgLyogbGFuZHNjYXBlICovLCBtQW1XbVN0YXRlLmdldFdtU3RhdGUoKS5nZXRMYXN0T3JpZW50YXRpb24oKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCB0aGF0IGRldmljZSBkb2Vzbid0IGNoYW5nZSBkZXZpY2Ugb3JpZW50YXRpb24gYnkgYXBwIHJlcXVlc3Qgd2hpbGUgaW4gbXVsdGktd2luZG93LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTcGxpdHNjcmVlblBvcnRyYWl0QXBwT3JpZW50YXRpb25SZXF1ZXN0cygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIXN1cHBvcnRzU3BsaXRTY3JlZW5NdWx0aVdpbmRvdygpKSB7Ci0gICAgICAgICAgQ0xvZy5sb2dBbmREaXNwbGF5KExvZ0xldmVsLklORk8sICJTa2lwcGluZyB0ZXN0OiBubyBtdWx0aS13aW5kb3cgc3VwcG9ydCIpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICByZXF1ZXN0T3JpZW50YXRpb25JblNwbGl0U2NyZWVuKDEgLyogcG9ydHJhaXQgKi8sIExBTkRTQ0FQRV9BQ1RJVklUWV9OQU1FKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHRoYXQgZGV2aWNlIGRvZXNuJ3QgY2hhbmdlIGRldmljZSBvcmllbnRhdGlvbiBieSBhcHAgcmVxdWVzdCB3aGlsZSBpbiBtdWx0aS13aW5kb3cuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFNwbGl0c2NyZWVuTGFuZHNjYXBlQXBwT3JpZW50YXRpb25SZXF1ZXN0cygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIXN1cHBvcnRzU3BsaXRTY3JlZW5NdWx0aVdpbmRvdygpKSB7Ci0gICAgICAgICAgQ0xvZy5sb2dBbmREaXNwbGF5KExvZ0xldmVsLklORk8sICJTa2lwcGluZyB0ZXN0OiBubyBtdWx0aS13aW5kb3cgc3VwcG9ydCIpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICByZXF1ZXN0T3JpZW50YXRpb25JblNwbGl0U2NyZWVuKDAgLyogbGFuZHNjYXBlICovLCBQT1JUUkFJVF9BQ1RJVklUWV9OQU1FKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSb3RhdGUgdGhlIGRldmljZSBhbmQgbGF1bmNoIHNwZWNpZmllZCBhY3Rpdml0eSBpbiBzcGxpdC1zY3JlZW4sIGNoZWNraW5nIGlmIG9yaWVudGF0aW9uCi0gICAgICogZGlkbid0IGNoYW5nZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcmVxdWVzdE9yaWVudGF0aW9uSW5TcGxpdFNjcmVlbihpbnQgb3JpZW50YXRpb24sIFN0cmluZyBhY3Rpdml0eSkKLSAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIXN1cHBvcnRzU3BsaXRTY3JlZW5NdWx0aVdpbmRvdygpKSB7Ci0gICAgICAgICAgICBDTG9nLmxvZ0FuZERpc3BsYXkoTG9nTGV2ZWwuSU5GTywgIlNraXBwaW5nIHRlc3Q6IG5vIG11bHRpLXdpbmRvdyBzdXBwb3J0Iik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZXQgaW5pdGlhbCBvcmllbnRhdGlvbi4KLSAgICAgICAgc2V0RGV2aWNlUm90YXRpb24ob3JpZW50YXRpb24pOwotCi0gICAgICAgIC8vIExhdW5jaCBhY3Rpdml0aWVzIHRoYXQgcmVxdWVzdCBvcmllbnRhdGlvbnMgYW5kIGNoZWNrIHRoYXQgZGV2aWNlIGRvZXNuJ3Qgcm90YXRlLgotICAgICAgICBsYXVuY2hBY3Rpdml0eUluRG9ja1N0YWNrKExBVU5DSElOR19BQ1RJVklUWSk7Ci0KLSAgICAgICAgZ2V0TGF1bmNoQWN0aXZpdHlCdWlsZGVyKCkuc2V0VG9TaWRlKHRydWUpLnNldE11bHRpcGxlVGFzayh0cnVlKQotICAgICAgICAgICAgICAgIC5zZXRUYXJnZXRBY3Rpdml0eU5hbWUoYWN0aXZpdHkpLmV4ZWN1dGUoKTsKLSAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwgbmV3IFN0cmluZ1tdIHthY3Rpdml0eX0pOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoYWN0aXZpdHksIHRydWUgLyogdmlzaWJsZSAqLyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiU3BsaXQtc2NyZWVuIGFwcHMgc2hvdWxkbid0IGluZmx1ZW5jZSBkZXZpY2Ugb3JpZW50YXRpb24iLAotICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uLCBtQW1XbVN0YXRlLmdldFdtU3RhdGUoKS5nZXRSb3RhdGlvbigpKTsKLQotICAgICAgICBnZXRMYXVuY2hBY3Rpdml0eUJ1aWxkZXIoKS5zZXRNdWx0aXBsZVRhc2sodHJ1ZSkuc2V0VGFyZ2V0QWN0aXZpdHlOYW1lKGFjdGl2aXR5KS5leGVjdXRlKCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIG5ldyBTdHJpbmdbXSB7YWN0aXZpdHl9KTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KGFjdGl2aXR5LCB0cnVlIC8qIHZpc2libGUgKi8pOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlNwbGl0LXNjcmVlbiBhcHBzIHNob3VsZG4ndCBpbmZsdWVuY2UgZGV2aWNlIG9yaWVudGF0aW9uIiwKLSAgICAgICAgICAgICAgICBvcmllbnRhdGlvbiwgbUFtV21TdGF0ZS5nZXRXbVN0YXRlKCkuZ2V0Um90YXRpb24oKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTGF1bmNoZXMgYWN0aXZpdHkgaW4gZG9ja2VkIHN0YWNrLCBtb3ZlcyB0byBmdWxsc2NyZWVuIHN0YWNrIGFuZCBiYWNrIHRvIGRvY2tlZCBzdGFjay4KLSAgICAgKiBBc3NlcnRzIHRoYXQgaW5pdGlhbCBhbmQgZmluYWwgcmVwb3J0ZWQgc2l6ZXMgaW4gZG9ja2VkIHN0YWNrIGFyZSB0aGUgc2FtZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgbW92ZUFjdGl2aXR5U3BsaXRGdWxsU3BsaXQoU3RyaW5nIGFjdGl2aXR5TmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghc3VwcG9ydHNTcGxpdFNjcmVlbk11bHRpV2luZG93KCkpIHsKLSAgICAgICAgICAgIENMb2cubG9nQW5kRGlzcGxheShMb2dMZXZlbC5JTkZPLCAiU2tpcHBpbmcgdGVzdDogbm8gbXVsdGktd2luZG93IHN1cHBvcnQiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIExhdW5jaCB0byBkb2NrZWQgc3RhY2sgYW5kIHJlY29yZCBzaXplLgotICAgICAgICBTdHJpbmcgbG9nU2VwYXJhdG9yID0gY2xlYXJMb2djYXQoKTsKLSAgICAgICAgbGF1bmNoQWN0aXZpdHlJblN0YWNrKGFjdGl2aXR5TmFtZSwgRE9DS0VEX1NUQUNLX0lEKTsKLSAgICAgICAgZmluYWwgUmVwb3J0ZWRTaXplcyBpbml0aWFsRG9ja2VkU2l6ZXMgPSBnZXRBY3Rpdml0eURpc3BsYXlTaXplKGFjdGl2aXR5TmFtZSwgbG9nU2VwYXJhdG9yKTsKLSAgICAgICAgLy8gTWFrZSBzdXJlIGRvY2tlZCBzdGFjayBpcyBmb2N1c2VkLiBUaGlzIHdheSB3aGVuIHdlIGRpc21pc3MgaXQgbGF0ZXIgZnVsbHNjcmVlbiBzdGFjawotICAgICAgICAvLyB3aWxsIGNvbWUgdXAuCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5SW5TdGFjayhhY3Rpdml0eU5hbWUsIERPQ0tFRF9TVEFDS19JRCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIG5ldyBTdHJpbmdbXSB7IGFjdGl2aXR5TmFtZSB9LAotICAgICAgICAgICAgICAgIGZhbHNlIC8qIGNvbXBhcmVUYXNrQW5kU3RhY2tCb3VuZHMgKi8pOwotCi0gICAgICAgIC8vIE1vdmUgdG8gZnVsbHNjcmVlbiBzdGFjay4KLSAgICAgICAgbG9nU2VwYXJhdG9yID0gY2xlYXJMb2djYXQoKTsKLSAgICAgICAgbW92ZUFjdGl2aXR5VG9TdGFjayhhY3Rpdml0eU5hbWUsIEZVTExTQ1JFRU5fV09SS1NQQUNFX1NUQUNLX0lEKTsKLSAgICAgICAgZmluYWwgUmVwb3J0ZWRTaXplcyBmdWxsc2NyZWVuU2l6ZXMgPSBnZXRBY3Rpdml0eURpc3BsYXlTaXplKGFjdGl2aXR5TmFtZSwgbG9nU2VwYXJhdG9yKTsKLSAgICAgICAgYXNzZXJ0U2l6ZXNBcmVTYW5lKGZ1bGxzY3JlZW5TaXplcywgaW5pdGlhbERvY2tlZFNpemVzKTsKLQotICAgICAgICAvLyBNb3ZlIGFjdGl2aXR5IGJhY2sgdG8gZG9ja2VkIHN0YWNrLgotICAgICAgICBsb2dTZXBhcmF0b3IgPSBjbGVhckxvZ2NhdCgpOwotICAgICAgICBtb3ZlQWN0aXZpdHlUb1N0YWNrKGFjdGl2aXR5TmFtZSwgRE9DS0VEX1NUQUNLX0lEKTsKLSAgICAgICAgZmluYWwgUmVwb3J0ZWRTaXplcyBmaW5hbERvY2tlZFNpemVzID0gZ2V0QWN0aXZpdHlEaXNwbGF5U2l6ZShhY3Rpdml0eU5hbWUsIGxvZ1NlcGFyYXRvcik7Ci0gICAgICAgIGFzc2VydFNpemVzQXJlU2FuZShmdWxsc2NyZWVuU2l6ZXMsIGZpbmFsRG9ja2VkU2l6ZXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFzc2VydHMgdGhhdCBhZnRlciByb3RhdGlvbiwgdGhlIGFzcGVjdCByYXRpb3Mgb2YgZGlzcGxheSBzaXplLCBtZXRyaWNzLCBhbmQgY29uZmlndXJhdGlvbgotICAgICAqIGhhdmUgZmxpcHBlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydFNpemVzUm90YXRlKFJlcG9ydGVkU2l6ZXMgcm90YXRpb25BLCBSZXBvcnRlZFNpemVzIHJvdGF0aW9uQikKLSAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRFcXVhbHMocm90YXRpb25BLmRpc3BsYXlXaWR0aCwgcm90YXRpb25BLm1ldHJpY3NXaWR0aCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyb3RhdGlvbkEuZGlzcGxheUhlaWdodCwgcm90YXRpb25BLm1ldHJpY3NIZWlnaHQpOwotICAgICAgICBhc3NlcnRFcXVhbHMocm90YXRpb25CLmRpc3BsYXlXaWR0aCwgcm90YXRpb25CLm1ldHJpY3NXaWR0aCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyb3RhdGlvbkIuZGlzcGxheUhlaWdodCwgcm90YXRpb25CLm1ldHJpY3NIZWlnaHQpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhyb3dzIGFuIEFzc2VydGlvbkVycm9yIGlmIGZ1bGxzY3JlZW5TaXplcyBoYXMgd2lkdGhzL2hlaWdodHMgKGRlcGVuZGluZyBvbiBhc3BlY3QgcmF0aW8pCi0gICAgICogdGhhdCBhcmUgc21hbGxlciB0aGFuIHRoZSBkb2NrZWRTaXplcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydFNpemVzQXJlU2FuZShSZXBvcnRlZFNpemVzIGZ1bGxzY3JlZW5TaXplcywgUmVwb3J0ZWRTaXplcyBkb2NrZWRTaXplcykKLSAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBib29sZWFuIHBvcnRyYWl0ID0gZnVsbHNjcmVlblNpemVzLmRpc3BsYXlXaWR0aCA8IGZ1bGxzY3JlZW5TaXplcy5kaXNwbGF5SGVpZ2h0OwotICAgICAgICBpZiAocG9ydHJhaXQpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZG9ja2VkU2l6ZXMuZGlzcGxheUhlaWdodCA8IGZ1bGxzY3JlZW5TaXplcy5kaXNwbGF5SGVpZ2h0KTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZG9ja2VkU2l6ZXMuaGVpZ2h0RHAgPCBmdWxsc2NyZWVuU2l6ZXMuaGVpZ2h0RHApOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShkb2NrZWRTaXplcy5tZXRyaWNzSGVpZ2h0IDwgZnVsbHNjcmVlblNpemVzLm1ldHJpY3NIZWlnaHQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShkb2NrZWRTaXplcy5kaXNwbGF5V2lkdGggPCBmdWxsc2NyZWVuU2l6ZXMuZGlzcGxheVdpZHRoKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZG9ja2VkU2l6ZXMud2lkdGhEcCA8IGZ1bGxzY3JlZW5TaXplcy53aWR0aERwKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZG9ja2VkU2l6ZXMubWV0cmljc1dpZHRoIDwgZnVsbHNjcmVlblNpemVzLm1ldHJpY3NXaWR0aCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaHJvd3MgYW4gQXNzZXJ0aW9uRXJyb3IgaWYgc2l6ZXMgYXJlIGRpZmZlcmVudC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydFNpemVzQXJlU2FtZShSZXBvcnRlZFNpemVzIGZpcnN0U2l6ZSwgUmVwb3J0ZWRTaXplcyBzZWNvbmRTaXplKQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydEVxdWFscyhmaXJzdFNpemUud2lkdGhEcCwgc2Vjb25kU2l6ZS53aWR0aERwKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZpcnN0U2l6ZS5oZWlnaHREcCwgc2Vjb25kU2l6ZS5oZWlnaHREcCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhmaXJzdFNpemUuZGlzcGxheVdpZHRoLCBzZWNvbmRTaXplLmRpc3BsYXlXaWR0aCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhmaXJzdFNpemUuZGlzcGxheUhlaWdodCwgc2Vjb25kU2l6ZS5kaXNwbGF5SGVpZ2h0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZpcnN0U2l6ZS5tZXRyaWNzV2lkdGgsIHNlY29uZFNpemUubWV0cmljc1dpZHRoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZpcnN0U2l6ZS5tZXRyaWNzSGVpZ2h0LCBzZWNvbmRTaXplLm1ldHJpY3NIZWlnaHQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZmlyc3RTaXplLnNtYWxsZXN0V2lkdGhEcCwgc2Vjb25kU2l6ZS5zbWFsbGVzdFdpZHRoRHApOwotICAgIH0KLQotICAgIHByaXZhdGUgUmVwb3J0ZWRTaXplcyBnZXRBY3Rpdml0eURpc3BsYXlTaXplKFN0cmluZyBhY3Rpdml0eU5hbWUsIFN0cmluZyBsb2dTZXBhcmF0b3IpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwgbmV3IFN0cmluZ1tdIHsgYWN0aXZpdHlOYW1lIH0sCi0gICAgICAgICAgICAgICAgZmFsc2UgLyogY29tcGFyZVRhc2tBbmRTdGFja0JvdW5kcyAqLyk7Ci0gICAgICAgIGZpbmFsIFJlcG9ydGVkU2l6ZXMgZGV0YWlscyA9IGdldExhc3RSZXBvcnRlZFNpemVzRm9yQWN0aXZpdHkoYWN0aXZpdHlOYW1lLCBsb2dTZXBhcmF0b3IpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGRldGFpbHMpOwotICAgICAgICByZXR1cm4gZGV0YWlsczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFJlY3RhbmdsZSBnZXREaXNwbGF5UmVjdChTdHJpbmcgYWN0aXZpdHlOYW1lKQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyB3aW5kb3dOYW1lID0gZ2V0V2luZG93TmFtZShhY3Rpdml0eU5hbWUpOwotCi0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIG5ldyBTdHJpbmdbXSB7YWN0aXZpdHlOYW1lfSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZFdpbmRvdygiVGVzdCB3aW5kb3cgbXVzdCBiZSB0aGUgZnJvbnQgd2luZG93LiIsIHdpbmRvd05hbWUpOwotCi0gICAgICAgIGZpbmFsIExpc3Q8V2luZG93TWFuYWdlclN0YXRlLldpbmRvd1N0YXRlPiB0ZW1wV2luZG93TGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBtQW1XbVN0YXRlLmdldFdtU3RhdGUoKS5nZXRNYXRjaGluZ1Zpc2libGVXaW5kb3dTdGF0ZSh3aW5kb3dOYW1lLCB0ZW1wV2luZG93TGlzdCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJTaG91bGQgaGF2ZSBleGFjdGx5IG9uZSB3aW5kb3cgc3RhdGUgZm9yIHRoZSBhY3Rpdml0eS4iLCAxLAotICAgICAgICAgICAgICAgIHRlbXBXaW5kb3dMaXN0LnNpemUoKSk7Ci0KLSAgICAgICAgV2luZG93TWFuYWdlclN0YXRlLldpbmRvd1N0YXRlIHdpbmRvd1N0YXRlID0gdGVtcFdpbmRvd0xpc3QuZ2V0KDApOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJTaG91bGQgaGF2ZSBhIHZhbGlkIHdpbmRvdyIsIHdpbmRvd1N0YXRlKTsKLQotICAgICAgICBXaW5kb3dNYW5hZ2VyU3RhdGUuRGlzcGxheSBkaXNwbGF5ID0gbUFtV21TdGF0ZS5nZXRXbVN0YXRlKCkKLSAgICAgICAgICAgICAgICAuZ2V0RGlzcGxheSh3aW5kb3dTdGF0ZS5nZXREaXNwbGF5SWQoKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIlNob3VsZCBiZSBvbiBhIGRpc3BsYXkiLCBkaXNwbGF5KTsKLQotICAgICAgICByZXR1cm4gZGlzcGxheS5nZXREaXNwbGF5UmVjdCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgbGF1bmNoaW5nIGFuIGFjdGl2aXR5IHdoaWNoIHJlcXVlc3RzIHNwZWNpZmljIFVJIG1vZGUgZHVyaW5nIGNyZWF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RMYXVuY2hXaXRoVWlNb2RlQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIExhdW5jaCBhY3Rpdml0eSB0aGF0IGNoYW5nZXMgVUkgbW9kZSBhbmQgaGFuZGxlcyB0aGlzIGNvbmZpZ3VyYXRpb24gY2hhbmdlLgotICAgICAgICBsYXVuY2hBY3Rpdml0eShOSUdIVF9NT0RFX0FDVElWSVRZKTsKLSAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yQWN0aXZpdHlTdGF0ZShtRGV2aWNlLCBOSUdIVF9NT0RFX0FDVElWSVRZLCBTVEFURV9SRVNVTUVEKTsKLQotICAgICAgICAvLyBDaGVjayBpZiBhY3Rpdml0eSBpcyBsYXVuY2hlZCBzdWNjZXNzZnVsbHkuCi0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShOSUdIVF9NT0RFX0FDVElWSVRZLCB0cnVlIC8qIHZpc2libGUgKi8pOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRBY3Rpdml0eSgiTGF1bmNoZWQgYWN0aXZpdHkgc2hvdWxkIGJlIGZvY3VzZWQiLAotICAgICAgICAgICAgICAgIE5JR0hUX01PREVfQUNUSVZJVFkpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFJlc3VtZWRBY3Rpdml0eSgiTGF1bmNoZWQgYWN0aXZpdHkgbXVzdCBiZSByZXN1bWVkIiwgTklHSFRfTU9ERV9BQ1RJVklUWSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvQWN0aXZpdHlNYW5hZ2VyQXNzaXN0YW50U3RhY2tUZXN0cy5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvQWN0aXZpdHlNYW5hZ2VyQXNzaXN0YW50U3RhY2tUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzM2ZmEyLi4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0FjdGl2aXR5TWFuYWdlckFzc2lzdGFudFN0YWNrVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuc2VydmVyLmN0czsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5jdHMuQWN0aXZpdHlNYW5hZ2VyU3RhdGUuU1RBVEVfUkVTVU1FRDsKLQotLyoqCi0gKiBCdWlsZDogbW1tYSAtajMyIGN0cy9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzCi0gKiBSdW46IGN0cy9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci91dGlsL3J1bi10ZXN0IGFuZHJvaWQuc2VydmVyLmN0cy5BY3Rpdml0eU1hbmFnZXJBc3Npc3RhbnRTdGFja1Rlc3RzCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eU1hbmFnZXJBc3Npc3RhbnRTdGFja1Rlc3RzIGV4dGVuZHMgQWN0aXZpdHlNYW5hZ2VyVGVzdEJhc2UgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZPSUNFX0lOVEVSQUNUSU9OX1NFUlZJQ0UgPSAiQXNzaXN0YW50Vm9pY2VJbnRlcmFjdGlvblNlcnZpY2UiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQUNUSVZJVFkgPSAiVGVzdEFjdGl2aXR5IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5JTUFUSU9OX1RFU1RfQUNUSVZJVFkgPSAiQW5pbWF0aW9uVGVzdEFjdGl2aXR5IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DS0VEX0FDVElWSVRZID0gIkRvY2tlZEFjdGl2aXR5IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNTSVNUQU5UX0FDVElWSVRZID0gIkFzc2lzdGFudEFjdGl2aXR5IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBTlNMVUNFTlRfQVNTSVNUQU5UX0FDVElWSVRZID0gIlRyYW5zbHVjZW50QXNzaXN0YW50QWN0aXZpdHkiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQVVOQ0hfQVNTSVNUQU5UX0FDVElWSVRZX0ZST01fU0VTU0lPTiA9Ci0gICAgICAgICAgICAiTGF1bmNoQXNzaXN0YW50QWN0aXZpdHlGcm9tU2Vzc2lvbiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBVU5DSF9BU1NJU1RBTlRfQUNUSVZJVFlfSU5UT19TVEFDSyA9Ci0gICAgICAgICAgICAiTGF1bmNoQXNzaXN0YW50QWN0aXZpdHlJbnRvQXNzaXN0YW50U3RhY2siOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQSVBfQUNUSVZJVFkgPSAiUGlwQWN0aXZpdHkiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0VOVEVSX1BJUCA9ICJlbnRlcl9waXAiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9MQVVOQ0hfTkVXX1RBU0sgPSAibGF1bmNoX25ld190YXNrIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfRklOSVNIX1NFTEYgPSAiZmluaXNoX3NlbGYiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0lTX1RSQU5TTFVDRU5UID0gImlzX3RyYW5zbHVjZW50IjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0FDVElWSVRZX0FDVElPTl9GSU5JU0hfU0VMRiA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5zZXJ2ZXIuY3RzLlRlc3RBY3Rpdml0eS5maW5pc2hfc2VsZiI7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TGF1bmNoaW5nQXNzaXN0YW50QWN0aXZpdHlJbnRvQXNzaXN0YW50U3RhY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gRW5hYmxlIHRoZSBhc3Npc3RhbnQgYW5kIGxhdW5jaCBhbiBhc3Npc3RhbnQgYWN0aXZpdHkKLSAgICAgICAgZW5hYmxlQXNzaXN0YW50KCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoNTAwKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgICBsYXVuY2hBY3Rpdml0eShMQVVOQ0hfQVNTSVNUQU5UX0FDVElWSVRZX0ZST01fU0VTU0lPTik7Ci0gICAgICAgIG1BbVdtU3RhdGUud2FpdEZvclZhbGlkU3RhdGUobURldmljZSwgQVNTSVNUQU5UX0FDVElWSVRZLCBBU1NJU1RBTlRfU1RBQ0tfSUQpOwotCi0gICAgICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBhY3Rpdml0eSBsYXVuY2hlZCBpbiB0aGUgZnVsbHNjcmVlbiBhc3Npc3RhbnQgc3RhY2sKLSAgICAgICAgYXNzZXJ0QXNzaXN0YW50U3RhY2tFeGlzdHMoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgYXNzaXN0YW50IHN0YWNrIHRvIGJlIGZ1bGxzY3JlZW4iLAotICAgICAgICAgICAgICAgIG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFN0YWNrQnlJZChBU1NJU1RBTlRfU1RBQ0tfSUQpLmlzRnVsbHNjcmVlbigpKTsKLQotICAgICAgICBkaXNhYmxlQXNzaXN0YW50KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFzc2lzdGFudFN0YWNrWk9yZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghc3VwcG9ydHNQaXAoKSB8fCAhc3VwcG9ydHNTcGxpdFNjcmVlbk11bHRpV2luZG93KCkpIHJldHVybjsKLSAgICAgICAgLy8gTGF1bmNoIGEgcGlubmVkIHN0YWNrIHRhc2sKLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoUElQX0FDVElWSVRZLCBFWFRSQV9FTlRFUl9QSVAsICJ0cnVlIik7Ci0gICAgICAgIG1BbVdtU3RhdGUud2FpdEZvclZhbGlkU3RhdGUobURldmljZSwgUElQX0FDVElWSVRZLCBQSU5ORURfU1RBQ0tfSUQpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydENvbnRhaW5zU3RhY2soIk11c3QgY29udGFpbiBwaW5uZWQgc3RhY2suIiwgUElOTkVEX1NUQUNLX0lEKTsKLQotICAgICAgICAvLyBEb2NrIGEgdGFzawotICAgICAgICBsYXVuY2hBY3Rpdml0eShURVNUX0FDVElWSVRZKTsKLSAgICAgICAgbGF1bmNoQWN0aXZpdHlJbkRvY2tTdGFjayhET0NLRURfQUNUSVZJVFkpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydENvbnRhaW5zU3RhY2soIk11c3QgY29udGFpbiBmdWxsc2NyZWVuIHN0YWNrLiIsCi0gICAgICAgICAgICAgICAgRlVMTFNDUkVFTl9XT1JLU1BBQ0VfU1RBQ0tfSUQpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydENvbnRhaW5zU3RhY2soIk11c3QgY29udGFpbiBkb2NrZWQgc3RhY2suIiwgRE9DS0VEX1NUQUNLX0lEKTsKLQotICAgICAgICAvLyBFbmFibGUgdGhlIGFzc2lzdGFudCBhbmQgbGF1bmNoIGFuIGFzc2lzdGFudCBhY3Rpdml0eSwgZW5zdXJlIGl0IGlzIG9uIHRvcAotICAgICAgICBlbmFibGVBc3Npc3RhbnQoKTsKLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoTEFVTkNIX0FTU0lTVEFOVF9BQ1RJVklUWV9GUk9NX1NFU1NJT04pOwotICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JWYWxpZFN0YXRlKG1EZXZpY2UsIEFTU0lTVEFOVF9BQ1RJVklUWSwgQVNTSVNUQU5UX1NUQUNLX0lEKTsKLSAgICAgICAgYXNzZXJ0QXNzaXN0YW50U3RhY2tFeGlzdHMoKTsKLQotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZyb250U3RhY2soIlBpbm5lZCBzdGFjayBzaG91bGQgYmUgb24gdG9wLiIsIFBJTk5FRF9TVEFDS19JRCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZFN0YWNrKCJBc3Npc3RhbnQgc3RhY2sgc2hvdWxkIGJlIGZvY3VzZWQuIiwgQVNTSVNUQU5UX1NUQUNLX0lEKTsKLQotICAgICAgICBkaXNhYmxlQXNzaXN0YW50KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFzc2lzdGFudFN0YWNrTGF1bmNoTmV3VGFzaygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBlbmFibGVBc3Npc3RhbnQoKTsKLSAgICAgICAgYXNzZXJ0QXNzaXN0YW50U3RhY2tDYW5MYXVuY2hBbmRSZXR1cm5Gcm9tTmV3VGFzaygpOwotICAgICAgICBkaXNhYmxlQXNzaXN0YW50KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFzc2lzdGFudFN0YWNrTGF1bmNoTmV3VGFza1dpdGhEb2NrZWRTdGFjaygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIXN1cHBvcnRzU3BsaXRTY3JlZW5NdWx0aVdpbmRvdygpKSByZXR1cm47Ci0gICAgICAgIC8vIERvY2sgYSB0YXNrCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5KFRFU1RfQUNUSVZJVFkpOwotICAgICAgICBsYXVuY2hBY3Rpdml0eUluRG9ja1N0YWNrKERPQ0tFRF9BQ1RJVklUWSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Q29udGFpbnNTdGFjaygiTXVzdCBjb250YWluIGZ1bGxzY3JlZW4gc3RhY2suIiwKLSAgICAgICAgICAgICAgICBGVUxMU0NSRUVOX1dPUktTUEFDRV9TVEFDS19JRCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Q29udGFpbnNTdGFjaygiTXVzdCBjb250YWluIGRvY2tlZCBzdGFjay4iLCBET0NLRURfU1RBQ0tfSUQpOwotCi0gICAgICAgIGVuYWJsZUFzc2lzdGFudCgpOwotICAgICAgICBhc3NlcnRBc3Npc3RhbnRTdGFja0NhbkxhdW5jaEFuZFJldHVybkZyb21OZXdUYXNrKCk7Ci0gICAgICAgIGRpc2FibGVBc3Npc3RhbnQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0QXNzaXN0YW50U3RhY2tDYW5MYXVuY2hBbmRSZXR1cm5Gcm9tTmV3VGFzaygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBFbmFibGUgdGhlIGFzc2lzdGFudCBhbmQgbGF1bmNoIGFuIGFzc2lzdGFudCBhY3Rpdml0eSB3aGljaCB3aWxsIGxhdW5jaCBhIG5ldyB0YXNrCi0gICAgICAgIGVuYWJsZUFzc2lzdGFudCgpOwotICAgICAgICBsYXVuY2hBY3Rpdml0eShMQVVOQ0hfQVNTSVNUQU5UX0FDVElWSVRZX0lOVE9fU1RBQ0ssCi0gICAgICAgICAgICAgICAgRVhUUkFfTEFVTkNIX05FV19UQVNLLCBURVNUX0FDVElWSVRZKTsKLSAgICAgICAgZGlzYWJsZUFzc2lzdGFudCgpOwotCi0gICAgICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBmdWxsc2NyZWVuIHN0YWNrIGlzIG9uIHRvcCBhbmQgdGhlIHRlc3QgYWN0aXZpdHkgaXMgbm93IHZpc2libGUKLSAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yVmFsaWRTdGF0ZShtRGV2aWNlLCBURVNUX0FDVElWSVRZLCBGVUxMU0NSRUVOX1dPUktTUEFDRV9TVEFDS19JRCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZEFjdGl2aXR5KCJUZXN0QWN0aXZpdHkgc2hvdWxkIGJlIHJlc3VtZWQiLCBURVNUX0FDVElWSVRZKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGcm9udFN0YWNrKCJGdWxsc2NyZWVuIHN0YWNrIHNob3VsZCBiZSBvbiB0b3AuIiwKLSAgICAgICAgICAgICAgICBGVUxMU0NSRUVOX1dPUktTUEFDRV9TVEFDS19JRCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZFN0YWNrKCJGdWxsc2NyZWVuIHN0YWNrIHNob3VsZCBiZSBmb2N1c2VkLiIsCi0gICAgICAgICAgICAgICAgRlVMTFNDUkVFTl9XT1JLU1BBQ0VfU1RBQ0tfSUQpOwotCi0gICAgICAgIC8vIE5vdywgdGVsbCBpdCB0byBmaW5pc2ggaXRzZWxmIGFuZCBlbnN1cmUgdGhhdCB0aGUgYXNzaXN0YW50IHN0YWNrIGlzIGJyb3VnaHQgYmFjayBmb3J3YXJkCi0gICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoImFtIGJyb2FkY2FzdCAtYSAiICsgVEVTVF9BQ1RJVklUWV9BQ1RJT05fRklOSVNIX1NFTEYpOwotICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JGb2N1c2VkU3RhY2sobURldmljZSwgQVNTSVNUQU5UX1NUQUNLX0lEKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGcm9udFN0YWNrKCJBc3Npc3RhbnQgc3RhY2sgc2hvdWxkIGJlIG9uIHRvcC4iLCBBU1NJU1RBTlRfU1RBQ0tfSUQpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRTdGFjaygiQXNzaXN0YW50IHN0YWNrIHNob3VsZCBiZSBmb2N1c2VkLiIsIEFTU0lTVEFOVF9TVEFDS19JRCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFzc2lzdGFudFN0YWNrRmluaXNoVG9QcmV2aW91c0FwcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBMYXVuY2ggYW4gYXNzaXN0YW50IGFjdGl2aXR5IG9uIHRvcCBvZiBhbiBleGlzdGluZyBmdWxsc2NyZWVuIGFjdGl2aXR5LCBhbmQgZW5zdXJlIHRoYXQKLSAgICAgICAgLy8gdGhlIGZ1bGxzY3JlZW4gYWN0aXZpdHkgaXMgc3RpbGwgdmlzaWJsZSBhbmQgb24gdG9wIGFmdGVyIHRoZSBhc3Npc3RhbnQgYWN0aXZpdHkgZmluaXNoZXMKLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoVEVTVF9BQ1RJVklUWSk7Ci0gICAgICAgIGVuYWJsZUFzc2lzdGFudCgpOwotICAgICAgICBsYXVuY2hBY3Rpdml0eShMQVVOQ0hfQVNTSVNUQU5UX0FDVElWSVRZX0lOVE9fU1RBQ0ssCi0gICAgICAgICAgICAgICAgRVhUUkFfRklOSVNIX1NFTEYsICJ0cnVlIik7Ci0gICAgICAgIGRpc2FibGVBc3Npc3RhbnQoKTsKLSAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yVmFsaWRTdGF0ZShtRGV2aWNlLCBURVNUX0FDVElWSVRZLCBGVUxMU0NSRUVOX1dPUktTUEFDRV9TVEFDS19JRCk7Ci0gICAgICAgIG1BbVdtU3RhdGUud2FpdEZvckFjdGl2aXR5U3RhdGUobURldmljZSwgVEVTVF9BQ1RJVklUWSwgU1RBVEVfUkVTVU1FRCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZEFjdGl2aXR5KCJUZXN0QWN0aXZpdHkgc2hvdWxkIGJlIHJlc3VtZWQiLCBURVNUX0FDVElWSVRZKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGcm9udFN0YWNrKCJGdWxsc2NyZWVuIHN0YWNrIHNob3VsZCBiZSBvbiB0b3AuIiwKLSAgICAgICAgICAgICAgICBGVUxMU0NSRUVOX1dPUktTUEFDRV9TVEFDS19JRCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZFN0YWNrKCJGdWxsc2NyZWVuIHN0YWNrIHNob3VsZCBiZSBmb2N1c2VkLiIsCi0gICAgICAgICAgICAgICAgRlVMTFNDUkVFTl9XT1JLU1BBQ0VfU1RBQ0tfSUQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REaXNhbGxvd0VudGVyUGlQRnJvbUFzc2lzdGFudFN0YWNrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGVuYWJsZUFzc2lzdGFudCgpOwotICAgICAgICBsYXVuY2hBY3Rpdml0eShMQVVOQ0hfQVNTSVNUQU5UX0FDVElWSVRZX0lOVE9fU1RBQ0ssCi0gICAgICAgICAgICAgICAgRVhUUkFfRU5URVJfUElQLCAidHJ1ZSIpOwotICAgICAgICBkaXNhYmxlQXNzaXN0YW50KCk7Ci0gICAgICAgIG1BbVdtU3RhdGUud2FpdEZvclZhbGlkU3RhdGUobURldmljZSwgQVNTSVNUQU5UX0FDVElWSVRZLCBBU1NJU1RBTlRfU1RBQ0tfSUQpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydERvZXNOb3RDb250YWluU3RhY2soIk11c3Qgbm90IGNvbnRhaW4gcGlubmVkIHN0YWNrLiIsIFBJTk5FRF9TVEFDS19JRCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFRyYW5zbHVjZW50QXNzaXN0YW50QWN0aXZpdHlTdGFja1Zpc2liaWxpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZW5hYmxlQXNzaXN0YW50KCk7Ci0gICAgICAgIC8vIEdvIGhvbWUsIGxhdW5jaCB0aGUgYXNzaXN0YW50IGFuZCBjaGVjayB0byBzZWUgdGhhdCBob21lIGlzIHZpc2libGUKLSAgICAgICAgcmVtb3ZlU3RhY2tzKEZVTExTQ1JFRU5fV09SS1NQQUNFX1NUQUNLX0lEKTsKLSAgICAgICAgbGF1bmNoSG9tZUFjdGl2aXR5KCk7Ci0gICAgICAgIGxhdW5jaEFjdGl2aXR5KExBVU5DSF9BU1NJU1RBTlRfQUNUSVZJVFlfSU5UT19TVEFDSywKLSAgICAgICAgICAgICAgICBFWFRSQV9JU19UUkFOU0xVQ0VOVCwgU3RyaW5nLnZhbHVlT2YodHJ1ZSkpOwotICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JWYWxpZFN0YXRlKG1EZXZpY2UsIFRSQU5TTFVDRU5UX0FTU0lTVEFOVF9BQ1RJVklUWSwgQVNTSVNUQU5UX1NUQUNLX0lEKTsKLSAgICAgICAgYXNzZXJ0QXNzaXN0YW50U3RhY2tFeGlzdHMoKTsKLSAgICAgICAgaWYgKCFub0hvbWVTY3JlZW4oKSkgewotICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRIb21lQWN0aXZpdHlWaXNpYmxlKHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTGF1bmNoIGEgZnVsbHNjcmVlbiBhcHAgYW5kIHRoZW4gbGF1bmNoIHRoZSBhc3Npc3RhbnQgYW5kIGNoZWNrIHRvIHNlZSB0aGF0IGl0IGlzCi0gICAgICAgIC8vIGFsc28gdmlzaWJsZQotICAgICAgICByZW1vdmVTdGFja3MoQVNTSVNUQU5UX1NUQUNLX0lEKTsKLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoVEVTVF9BQ1RJVklUWSk7Ci0gICAgICAgIGxhdW5jaEFjdGl2aXR5KExBVU5DSF9BU1NJU1RBTlRfQUNUSVZJVFlfSU5UT19TVEFDSywKLSAgICAgICAgICAgICAgICBFWFRSQV9JU19UUkFOU0xVQ0VOVCwgU3RyaW5nLnZhbHVlT2YodHJ1ZSkpOwotICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JWYWxpZFN0YXRlKG1EZXZpY2UsIFRSQU5TTFVDRU5UX0FTU0lTVEFOVF9BQ1RJVklUWSwgQVNTSVNUQU5UX1NUQUNLX0lEKTsKLSAgICAgICAgYXNzZXJ0QXNzaXN0YW50U3RhY2tFeGlzdHMoKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFRFU1RfQUNUSVZJVFksIHRydWUpOwotCi0gICAgICAgIC8vIEdvIGhvbWUsIGxhdW5jaCBhc3Npc3RhbnQsIGxhdW5jaCBhcHAgaW50byBmdWxsc2NyZWVuIHdpdGggYWN0aXZpdHkgcHJlc2VudCwgYW5kIGdvIGJhY2suCi0gICAgICAgIC8vIEVuc3VyZSBob21lIGlzIHZpc2libGUuCi0gICAgICAgIHJlbW92ZVN0YWNrcyhBU1NJU1RBTlRfU1RBQ0tfSUQpOwotICAgICAgICBsYXVuY2hIb21lQWN0aXZpdHkoKTsKLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoTEFVTkNIX0FTU0lTVEFOVF9BQ1RJVklUWV9JTlRPX1NUQUNLLAotICAgICAgICAgICAgICAgIEVYVFJBX0lTX1RSQU5TTFVDRU5ULCBTdHJpbmcudmFsdWVPZih0cnVlKSwgRVhUUkFfTEFVTkNIX05FV19UQVNLLAotICAgICAgICAgICAgICAgIFRFU1RfQUNUSVZJVFkpOwotICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JWYWxpZFN0YXRlKG1EZXZpY2UsIFRFU1RfQUNUSVZJVFksIEZVTExTQ1JFRU5fV09SS1NQQUNFX1NUQUNLX0lEKTsKLSAgICAgICAgaWYgKCFub0hvbWVTY3JlZW4oKSkgewotICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRIb21lQWN0aXZpdHlWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgICBwcmVzc0JhY2tCdXR0b24oKTsKLSAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yRm9jdXNlZFN0YWNrKG1EZXZpY2UsIEFTU0lTVEFOVF9TVEFDS19JRCk7Ci0gICAgICAgIGFzc2VydEFzc2lzdGFudFN0YWNrRXhpc3RzKCk7Ci0gICAgICAgIGlmICghbm9Ib21lU2NyZWVuKCkpIHsKLSAgICAgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvckhvbWVBY3Rpdml0eVZpc2libGUobURldmljZSk7Ci0gICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEhvbWVBY3Rpdml0eVZpc2libGUodHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBMYXVuY2ggYSBmdWxsc2NyZWVuIGFuZCBkb2NrZWQgYXBwIGFuZCB0aGVuIGxhdW5jaCB0aGUgYXNzaXN0YW50IGFuZCBjaGVjayB0byBzZWUgdGhhdCBpdAotICAgICAgICAvLyBpcyBhbHNvIHZpc2libGUKLSAgICAgICAgaWYgKHN1cHBvcnRzU3BsaXRTY3JlZW5NdWx0aVdpbmRvdygpKSB7Ci0gICAgICAgICAgICByZW1vdmVTdGFja3MoQVNTSVNUQU5UX1NUQUNLX0lEKTsKLSAgICAgICAgICAgIGxhdW5jaEFjdGl2aXR5SW5Eb2NrU3RhY2soRE9DS0VEX0FDVElWSVRZKTsKLSAgICAgICAgICAgIGxhdW5jaEFjdGl2aXR5KFRFU1RfQUNUSVZJVFkpOwotICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRDb250YWluc1N0YWNrKCJNdXN0IGNvbnRhaW4gZG9ja2VkIHN0YWNrLiIsIERPQ0tFRF9TVEFDS19JRCk7Ci0gICAgICAgICAgICBsYXVuY2hBY3Rpdml0eShMQVVOQ0hfQVNTSVNUQU5UX0FDVElWSVRZX0lOVE9fU1RBQ0ssCi0gICAgICAgICAgICAgICAgICAgIEVYVFJBX0lTX1RSQU5TTFVDRU5ULCBTdHJpbmcudmFsdWVPZih0cnVlKSk7Ci0gICAgICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JWYWxpZFN0YXRlKG1EZXZpY2UsIFRSQU5TTFVDRU5UX0FTU0lTVEFOVF9BQ1RJVklUWSwgQVNTSVNUQU5UX1NUQUNLX0lEKTsKLSAgICAgICAgICAgIGFzc2VydEFzc2lzdGFudFN0YWNrRXhpc3RzKCk7Ci0gICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoRE9DS0VEX0FDVElWSVRZLCB0cnVlKTsKLSAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShURVNUX0FDVElWSVRZLCB0cnVlKTsKLSAgICAgICAgfQotICAgICAgICBkaXNhYmxlQXNzaXN0YW50KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdExhdW5jaEludG9TYW1lVGFzaygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBlbmFibGVBc3Npc3RhbnQoKTsKLQotICAgICAgICAvLyBMYXVuY2ggdGhlIGFzc2lzdGFudAotICAgICAgICBsYXVuY2hBY3Rpdml0eShMQVVOQ0hfQVNTSVNUQU5UX0FDVElWSVRZX0ZST01fU0VTU0lPTik7Ci0gICAgICAgIGFzc2VydEFzc2lzdGFudFN0YWNrRXhpc3RzKCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShBU1NJU1RBTlRfQUNUSVZJVFksIHRydWUpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRTdGFjaygiRXhwZWN0ZWQgYXNzaXN0YW50IHN0YWNrIGZvY3VzZWQiLCBBU1NJU1RBTlRfU1RBQ0tfSUQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0U3RhY2tCeUlkKEFTU0lTVEFOVF9TVEFDS19JRCkuZ2V0VGFza3MoKS5zaXplKCkpOwotICAgICAgICBmaW5hbCBpbnQgdGFza0lkID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0VGFza0J5QWN0aXZpdHlOYW1lKEFTU0lTVEFOVF9BQ1RJVklUWSkKLSAgICAgICAgICAgICAgICAubVRhc2tJZDsKLQotICAgICAgICAvLyBMYXVuY2ggYSBuZXcgZnVsbHNjcmVlbiBhY3Rpdml0eQotICAgICAgICAvLyBVc2luZyBBbmltYXRpb24gVGVzdCBBY3Rpdml0eSBiZWNhdXNlIGl0IGlzIG9wYXF1ZSBvbiBhbGwgZGV2aWNlcy4KLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoQU5JTUFUSU9OX1RFU1RfQUNUSVZJVFkpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoQVNTSVNUQU5UX0FDVElWSVRZLCBmYWxzZSk7Ci0KLSAgICAgICAgLy8gTGF1bmNoIHRoZSBhc3Npc3RhbnQgYWdhaW4gYW5kIGVuc3VyZSB0aGF0IGl0IGdvZXMgaW50byB0aGUgc2FtZSB0YXNrCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5KExBVU5DSF9BU1NJU1RBTlRfQUNUSVZJVFlfRlJPTV9TRVNTSU9OKTsKLSAgICAgICAgYXNzZXJ0QXNzaXN0YW50U3RhY2tFeGlzdHMoKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KEFTU0lTVEFOVF9BQ1RJVklUWSwgdHJ1ZSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZFN0YWNrKCJFeHBlY3RlZCBhc3Npc3RhbnQgc3RhY2sgZm9jdXNlZCIsIEFTU0lTVEFOVF9TVEFDS19JRCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja0J5SWQoQVNTSVNUQU5UX1NUQUNLX0lEKS5nZXRUYXNrcygpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyh0YXNrSWQsCi0gICAgICAgICAgICAgICAgbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0VGFza0J5QWN0aXZpdHlOYW1lKEFTU0lTVEFOVF9BQ1RJVklUWSkubVRhc2tJZCk7Ci0KLSAgICAgICAgZGlzYWJsZUFzc2lzdGFudCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaW5uZWRTdGFja1dpdGhBc3Npc3RhbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0c1BpcCgpIHx8ICFzdXBwb3J0c1NwbGl0U2NyZWVuTXVsdGlXaW5kb3coKSkgcmV0dXJuOwotCi0gICAgICAgIGVuYWJsZUFzc2lzdGFudCgpOwotCi0gICAgICAgIC8vIExhdW5jaCBhIGZ1bGxzY3JlZW4gYWN0aXZpdHkgYW5kIGEgUElQIGFjdGl2aXR5LCB0aGVuIGxhdW5jaCB0aGUgYXNzaXN0YW50LCBhbmQgZW5zdXJlCi0gICAgICAgIC8vIHRoYXQgdGhlIHRlc3QgYWN0aXZpdHkgaXMgc3RpbGwgdmlzaWJsZQotICAgICAgICBsYXVuY2hBY3Rpdml0eShURVNUX0FDVElWSVRZKTsKLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoUElQX0FDVElWSVRZLCBFWFRSQV9FTlRFUl9QSVAsICJ0cnVlIik7Ci0gICAgICAgIGxhdW5jaEFjdGl2aXR5KExBVU5DSF9BU1NJU1RBTlRfQUNUSVZJVFlfSU5UT19TVEFDSywKLSAgICAgICAgICAgICAgICBFWFRSQV9JU19UUkFOU0xVQ0VOVCwgU3RyaW5nLnZhbHVlT2YodHJ1ZSkpOwotICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JWYWxpZFN0YXRlKG1EZXZpY2UsIFRSQU5TTFVDRU5UX0FTU0lTVEFOVF9BQ1RJVklUWSwgQVNTSVNUQU5UX1NUQUNLX0lEKTsKLSAgICAgICAgYXNzZXJ0QXNzaXN0YW50U3RhY2tFeGlzdHMoKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFRSQU5TTFVDRU5UX0FTU0lTVEFOVF9BQ1RJVklUWSwgdHJ1ZSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShQSVBfQUNUSVZJVFksIHRydWUpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoVEVTVF9BQ1RJVklUWSwgdHJ1ZSk7Ci0KLSAgICAgICAgZGlzYWJsZUFzc2lzdGFudCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFzc2VydHMgdGhhdCB0aGUgYXNzaXN0YW50IHN0YWNrIGV4aXN0cy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0QXNzaXN0YW50U3RhY2tFeGlzdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRDb250YWluc1N0YWNrKCJNdXN0IGNvbnRhaW4gYXNzaXN0YW50IHN0YWNrLiIsIEFTU0lTVEFOVF9TVEFDS19JRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXNzZXJ0cyB0aGF0IHRoZSBhc3Npc3RhbnQgc3RhY2sgZG9lcyBub3QgZXhpc3QuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydEFzc2lzdGFudFN0YWNrRG9lc05vdEV4aXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0RG9lc05vdENvbnRhaW5TdGFjaygiTXVzdCBub3QgY29udGFpbiBhc3Npc3RhbnQgc3RhY2suIiwKLSAgICAgICAgICAgICAgICBBU1NJU1RBTlRfU1RBQ0tfSUQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHN5c3RlbSB2b2ljZSBpbnRlcmFjdGlvbiBzZXJ2aWNlLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBlbmFibGVBc3Npc3RhbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZCgic2V0dGluZ3MgcHV0IHNlY3VyZSB2b2ljZV9pbnRlcmFjdGlvbl9zZXJ2aWNlICIgKwotICAgICAgICAgICAgICAgIGdldEFjdGl2aXR5Q29tcG9uZW50TmFtZShWT0lDRV9JTlRFUkFDVElPTl9TRVJWSUNFKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVzZXRzIHRoZSBzeXN0ZW0gdm9pY2UgaW50ZXJhY3Rpb24gc2VydmljZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZGlzYWJsZUFzc2lzdGFudCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKCJzZXR0aW5ncyBkZWxldGUgc2VjdXJlIHZvaWNlX2ludGVyYWN0aW9uX3NlcnZpY2UgIiArCi0gICAgICAgICAgICAgICAgZ2V0QWN0aXZpdHlDb21wb25lbnROYW1lKFZPSUNFX0lOVEVSQUNUSU9OX1NFUlZJQ0UpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9BY3Rpdml0eU1hbmFnZXJDb25maWdDaGFuZ2VUZXN0cy5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvQWN0aXZpdHlNYW5hZ2VyQ29uZmlnQ2hhbmdlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I2ZGZkOC4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9BY3Rpdml0eU1hbmFnZXJDb25maWdDaGFuZ2VUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuc2VydmVyLmN0czsKLQotaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5QcmVzdWJtaXQ7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuY3RzLkFjdGl2aXR5TWFuYWdlclN0YXRlLlNUQVRFX1JFU1VNRUQ7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmN0cy5TdGF0ZUxvZ2dlci5sb2dFOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkxvZy5Mb2dMZXZlbDsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5sb2cuTG9nVXRpbC5DTG9nOwotCi1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLS8qKgotICogQnVpbGQ6IG1tbWEgLWozMiBjdHMvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcwotICogUnVuOiBjdHMvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvdXRpbC9ydW4tdGVzdCBDdHNTZXJ2aWNlc0hvc3RUZXN0Q2FzZXMgYW5kcm9pZC5zZXJ2ZXIuY3RzLkFjdGl2aXR5TWFuYWdlckNvbmZpZ0NoYW5nZVRlc3RzCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eU1hbmFnZXJDb25maWdDaGFuZ2VUZXN0cyBleHRlbmRzIEFjdGl2aXR5TWFuYWdlclRlc3RCYXNlIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9BQ1RJVklUWV9OQU1FID0gIlRlc3RBY3Rpdml0eSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PX1JFTEFVTkNIX0FDVElWSVRZX05BTUUgPSAiTm9SZWxhdW5jaEFjdGl2aXR5IjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT05UX1NDQUxFX0FDVElWSVRZX05BTUUgPSAiRm9udFNjYWxlQWN0aXZpdHkiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT05UX1NDQUxFX05PX1JFTEFVTkNIX0FDVElWSVRZX05BTUUgPQotICAgICAgICAgICAgIkZvbnRTY2FsZU5vUmVsYXVuY2hBY3Rpdml0eSI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBFWFBFQ1RFRF9GT05UX1NJWkVfU1AgPSAxMC4wZjsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSb3RhdGlvbjkwUmVsYXVuY2goKSB0aHJvd3MgRXhjZXB0aW9uewotICAgICAgICAvLyBTaG91bGQgcmVsYXVuY2ggb24gZXZlcnkgcm90YXRpb24gYW5kIHJlY2VpdmUgbm8gb25Db25maWd1cmF0aW9uQ2hhbmdlZCgpCi0gICAgICAgIHRlc3RSb3RhdGlvbihURVNUX0FDVElWSVRZX05BTUUsIDEsIDEsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSb3RhdGlvbjkwTm9SZWxhdW5jaCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBTaG91bGQgcmVjZWl2ZSBvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKCkgb24gZXZlcnkgcm90YXRpb24gYW5kIG5vIHJlbGF1bmNoCi0gICAgICAgIHRlc3RSb3RhdGlvbihOT19SRUxBVU5DSF9BQ1RJVklUWV9OQU1FLCAxLCAwLCAxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Um90YXRpb24xODBSZWxhdW5jaCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoaGFzRGlzcGxheUN1dG91dCgpKSB7Ci0gICAgICAgICAgICAvLyBTa2lwIGNhc2UgaW4gQ1RTIDguMQotICAgICAgICAgICAgLy8gU2tpcHBpbmcgdGVzdDogZGlzcGxheSBjdXRvdXQgcHJlc2VudCwgY2FuJ3QgcHJlZGljdCBleGFjdCBsaWZlY3ljbGUiCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgLy8gU2hvdWxkIHJlY2VpdmUgbm90aGluZwotICAgICAgICB0ZXN0Um90YXRpb24oVEVTVF9BQ1RJVklUWV9OQU1FLCAyLCAwLCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Um90YXRpb24xODBOb1JlbGF1bmNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChoYXNEaXNwbGF5Q3V0b3V0KCkpIHsKLSAgICAgICAgICAgIC8vIFNraXAgY2FzZSBpbiBDVFMgOC4xCi0gICAgICAgICAgICAvLyBTa2lwcGluZyB0ZXN0OiBkaXNwbGF5IGN1dG91dCBwcmVzZW50LCBjYW4ndCBwcmVkaWN0IGV4YWN0IGxpZmVjeWNsZSIKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAvLyBTaG91bGQgcmVjZWl2ZSBub3RoaW5nCi0gICAgICAgIHRlc3RSb3RhdGlvbihOT19SRUxBVU5DSF9BQ1RJVklUWV9OQU1FLCAyLCAwLCAwKTsKLSAgICB9Ci0KLSAgICBAUHJlc3VibWl0Ci0gICAgcHVibGljIHZvaWQgdGVzdENoYW5nZUZvbnRTY2FsZVJlbGF1bmNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFNob3VsZCByZWxhdW5jaCBhbmQgcmVjZWl2ZSBubyBvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKCkKLSAgICAgICAgdGVzdENoYW5nZUZvbnRTY2FsZShGT05UX1NDQUxFX0FDVElWSVRZX05BTUUsIHRydWUgLyogcmVsYXVuY2ggKi8pOwotICAgIH0KLQotICAgIEBQcmVzdWJtaXQKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlRm9udFNjYWxlTm9SZWxhdW5jaCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBTaG91bGQgcmVjZWl2ZSBvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKCkgYW5kIG5vIHJlbGF1bmNoCi0gICAgICAgIHRlc3RDaGFuZ2VGb250U2NhbGUoRk9OVF9TQ0FMRV9OT19SRUxBVU5DSF9BQ1RJVklUWV9OQU1FLCBmYWxzZSAvKiByZWxhdW5jaCAqLyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RSb3RhdGlvbigKLSAgICAgICAgICAgIFN0cmluZyBhY3Rpdml0eU5hbWUsIGludCByb3RhdGlvblN0ZXAsIGludCBudW1SZWxhdW5jaCwgaW50IG51bUNvbmZpZ0NoYW5nZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGxhdW5jaEFjdGl2aXR5KGFjdGl2aXR5TmFtZSk7Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nW10gd2FpdEZvckFjdGl2aXRpZXNWaXNpYmxlID0gbmV3IFN0cmluZ1tdIHthY3Rpdml0eU5hbWV9OwotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCB3YWl0Rm9yQWN0aXZpdGllc1Zpc2libGUpOwotCi0gICAgICAgIGZpbmFsIGludCBpbml0aWFsUm90YXRpb24gPSA0IC0gcm90YXRpb25TdGVwOwotICAgICAgICBzZXREZXZpY2VSb3RhdGlvbihpbml0aWFsUm90YXRpb24pOwotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCB3YWl0Rm9yQWN0aXZpdGllc1Zpc2libGUpOwotICAgICAgICBmaW5hbCBpbnQgYWN0dWFsU3RhY2tJZCA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFRhc2tCeUFjdGl2aXR5TmFtZSgKLSAgICAgICAgICAgICAgICBhY3Rpdml0eU5hbWUpLm1TdGFja0lkOwotICAgICAgICBmaW5hbCBpbnQgZGlzcGxheUlkID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0U3RhY2tCeUlkKGFjdHVhbFN0YWNrSWQpLm1EaXNwbGF5SWQ7Ci0gICAgICAgIGZpbmFsIGludCBuZXdEZXZpY2VSb3RhdGlvbiA9IGdldERldmljZVJvdGF0aW9uKGRpc3BsYXlJZCk7Ci0gICAgICAgIGlmIChuZXdEZXZpY2VSb3RhdGlvbiA9PSBJTlZBTElEX0RFVklDRV9ST1RBVElPTikgewotICAgICAgICAgICAgQ0xvZy5sb2dBbmREaXNwbGF5KExvZ0xldmVsLldBUk4sICJHb3QgYW4gaW52YWxpZCBkZXZpY2Ugcm90YXRpb24gdmFsdWUuICIKLSAgICAgICAgICAgICAgICAgICAgKyAiQ29udGludWluZyB0aGUgdGVzdCBkZXNwaXRlIG9mIHRoYXQsIGJ1dCBpdCBpcyBsaWtlbHkgdG8gZmFpbC4iKTsKLSAgICAgICAgfSBlbHNlIGlmIChuZXdEZXZpY2VSb3RhdGlvbiAhPSBpbml0aWFsUm90YXRpb24pIHsKLSAgICAgICAgICAgIENMb2cubG9nQW5kRGlzcGxheShMb2dMZXZlbC5JTkZPLCAiVGhpcyBkZXZpY2UgZG9lc24ndCBzdXBwb3J0IHVzZXIgcm90YXRpb24gIgotICAgICAgICAgICAgICAgICAgICArICJtb2RlLiBOb3QgY29udGludWluZyB0aGUgcm90YXRpb24gY2hlY2tzLiIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpbnQgcm90YXRpb24gPSAwOyByb3RhdGlvbiA8IDQ7IHJvdGF0aW9uICs9IHJvdGF0aW9uU3RlcCkgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxvZ1NlcGFyYXRvciA9IGNsZWFyTG9nY2F0KCk7Ci0gICAgICAgICAgICBzZXREZXZpY2VSb3RhdGlvbihyb3RhdGlvbik7Ci0gICAgICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCB3YWl0Rm9yQWN0aXZpdGllc1Zpc2libGUpOwotICAgICAgICAgICAgYXNzZXJ0UmVsYXVuY2hPckNvbmZpZ0NoYW5nZWQoYWN0aXZpdHlOYW1lLCBudW1SZWxhdW5jaCwgbnVtQ29uZmlnQ2hhbmdlLCBsb2dTZXBhcmF0b3IpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RDaGFuZ2VGb250U2NhbGUoCi0gICAgICAgICAgICBTdHJpbmcgYWN0aXZpdHlOYW1lLCBib29sZWFuIHJlbGF1bmNoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc2V0Rm9udFNjYWxlKDEuMGYpOwotICAgICAgICBTdHJpbmcgbG9nU2VwYXJhdG9yID0gY2xlYXJMb2djYXQoKTsKLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoYWN0aXZpdHlOYW1lKTsKLSAgICAgICAgZmluYWwgU3RyaW5nW10gd2FpdEZvckFjdGl2aXRpZXNWaXNpYmxlID0gbmV3IFN0cmluZ1tdIHthY3Rpdml0eU5hbWV9OwotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCB3YWl0Rm9yQWN0aXZpdGllc1Zpc2libGUpOwotCi0gICAgICAgIGZpbmFsIGludCBkZW5zaXR5RHBpID0gZ2V0QWN0aXZpdHlEZW5zaXR5RHBpKGFjdGl2aXR5TmFtZSwgbG9nU2VwYXJhdG9yKTsKLQotICAgICAgICBmb3IgKGZsb2F0IGZvbnRTY2FsZSA9IDAuODVmOyBmb250U2NhbGUgPD0gMS4zZjsgZm9udFNjYWxlICs9IDAuMTVmKSB7Ci0gICAgICAgICAgICBsb2dTZXBhcmF0b3IgPSBjbGVhckxvZ2NhdCgpOwotICAgICAgICAgICAgc2V0Rm9udFNjYWxlKGZvbnRTY2FsZSk7Ci0gICAgICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCB3YWl0Rm9yQWN0aXZpdGllc1Zpc2libGUpOwotICAgICAgICAgICAgYXNzZXJ0UmVsYXVuY2hPckNvbmZpZ0NoYW5nZWQoYWN0aXZpdHlOYW1lLCByZWxhdW5jaCA/IDEgOiAwLCByZWxhdW5jaCA/IDAgOiAxLAotICAgICAgICAgICAgICAgICAgICBsb2dTZXBhcmF0b3IpOwotCi0gICAgICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgZGlzcGxheSBtZXRyaWNzIGFyZSB1cGRhdGVkLCBhbmQgdGhlcmVmb3JlIHRoZSB0ZXh0IHNpemUgaXMgYWxzbwotICAgICAgICAgICAgLy8gdXBkYXRlZCBhY2NvcmRpbmdseS4KLSAgICAgICAgICAgIGFzc2VydEV4cGVjdGVkRm9udFBpeGVsU2l6ZShhY3Rpdml0eU5hbWUsCi0gICAgICAgICAgICAgICAgICAgIHNjYWxlZFBpeGVsc1RvUGl4ZWxzKEVYUEVDVEVEX0ZPTlRfU0laRV9TUCwgZm9udFNjYWxlLCBkZW5zaXR5RHBpKSwKLSAgICAgICAgICAgICAgICAgICAgbG9nU2VwYXJhdG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgdXBkYXRpbmcgYXBwbGljYXRpb24gaW5mbyB3aGVuIGFwcCBpcyBydW5uaW5nLiBBbiBhY3Rpdml0eSB3aXRoIG1hdGNoaW5nIHBhY2thZ2UgbmFtZQotICAgICAqIG11c3QgYmUgcmVjcmVhdGVkIGFuZCBpdHMgYXNzZXQgc2VxdWVuY2UgbnVtYmVyIG11c3QgYmUgaW5jcmVtZW50ZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFVwZGF0ZUFwcGxpY2F0aW9uSW5mbygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBTdHJpbmcgZmlyc3RMb2dTZXBhcmF0b3IgPSBjbGVhckxvZ2NhdCgpOwotCi0gICAgICAgIC8vIExhdW5jaCBhbiBhY3Rpdml0eSB0aGF0IHByaW50cyBhcHBsaWVkIGNvbmZpZy4KLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoVEVTVF9BQ1RJVklUWV9OQU1FKTsKLSAgICAgICAgZmluYWwgaW50IGFzc2V0U2VxID0gcmVhZEFzc2V0U2VxTnVtYmVyKFRFU1RfQUNUSVZJVFlfTkFNRSwgZmlyc3RMb2dTZXBhcmF0b3IpOwotCi0gICAgICAgIGZpbmFsIFN0cmluZyBsb2dTZXBhcmF0b3IgPSBjbGVhckxvZ2NhdCgpOwotICAgICAgICAvLyBVcGRhdGUgcGFja2FnZSBpbmZvLgotICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKCJhbSB1cGRhdGUtYXBwaW5mbyBhbGwgIiArIGNvbXBvbmVudE5hbWUpOwotICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JXaXRoQW1TdGF0ZShtRGV2aWNlLCAoYW1TdGF0ZSkgLT4gewotICAgICAgICAgICAgLy8gV2FpdCBmb3IgYWN0aXZpdHkgdG8gYmUgcmVzdW1lZCBhbmQgYXNzZXQgc2VxIG51bWJlciB0byBiZSB1cGRhdGVkLgotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVhZEFzc2V0U2VxTnVtYmVyKFRFU1RfQUNUSVZJVFlfTkFNRSwgbG9nU2VwYXJhdG9yKSA9PSBhc3NldFNlcSArIDEKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIGFtU3RhdGUuaGFzQWN0aXZpdHlTdGF0ZShURVNUX0FDVElWSVRZX05BTUUsIFNUQVRFX1JFU1VNRUQpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBsb2dFKCJFcnJvciB3YWl0aW5nIGZvciB2YWxpZCBzdGF0ZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0sICJXYWl0aW5nIGFzc2V0IHNlcXVlbmNlIG51bWJlciB0byBiZSB1cGRhdGVkIGFuZCBmb3IgYWN0aXZpdHkgdG8gYmUgcmVzdW1lZC4iKTsKLQotICAgICAgICAvLyBDaGVjayBpZiBhY3Rpdml0eSBpcyByZWxhdW5jaGVkIGFuZCBhc3NldCBzZXEgaXMgdXBkYXRlZC4KLSAgICAgICAgYXNzZXJ0UmVsYXVuY2hPckNvbmZpZ0NoYW5nZWQoVEVTVF9BQ1RJVklUWV9OQU1FLCAxIC8qIG51bVJlbGF1bmNoICovLAotICAgICAgICAgICAgICAgIDAgLyogbnVtQ29uZmlnQ2hhbmdlICovLCBsb2dTZXBhcmF0b3IpOwotICAgICAgICBmaW5hbCBpbnQgbmV3QXNzZXRTZXEgPSByZWFkQXNzZXRTZXFOdW1iZXIoVEVTVF9BQ1RJVklUWV9OQU1FLCBsb2dTZXBhcmF0b3IpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkFzc2V0IHNlcXVlbmNlIG51bWJlciBtdXN0IGJlIGluY3JlbWVudGVkLiIsIGFzc2V0U2VxICsgMSwgbmV3QXNzZXRTZXEpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gc0NvbmZpZ3VyYXRpb25QYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKAotICAgICAgICAgICAgIiguKyk6IENvbmZpZ3VyYXRpb246IFxceyguKikgYXMuKFxcZCspKC4qKVxcfSIpOwotCi0gICAgLyoqIFJlYWQgYXNzZXQgc2VxdWVuY2UgbnVtYmVyIGluIGxhc3QgYXBwbGllZCBjb25maWd1cmF0aW9uIGZyb20gbG9ncy4gKi8KLSAgICBwcml2YXRlIGludCByZWFkQXNzZXRTZXFOdW1iZXIoU3RyaW5nIGFjdGl2aXR5TmFtZSwgU3RyaW5nIGxvZ1NlcGFyYXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFN0cmluZ1tdIGxpbmVzID0gZ2V0RGV2aWNlTG9nc0ZvckNvbXBvbmVudChhY3Rpdml0eU5hbWUsIGxvZ1NlcGFyYXRvcik7Ci0gICAgICAgIGZvciAoaW50IGkgPSBsaW5lcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxpbmUgPSBsaW5lc1tpXS50cmltKCk7Ci0gICAgICAgICAgICBmaW5hbCBNYXRjaGVyIG1hdGNoZXIgPSBzQ29uZmlndXJhdGlvblBhdHRlcm4ubWF0Y2hlcihsaW5lKTsKLSAgICAgICAgICAgIGlmIChtYXRjaGVyLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBhc3NldFNlcU51bWJlciA9IG1hdGNoZXIuZ3JvdXAoMyk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEludGVnZXIudmFsdWVPZihhc3NldFNlcU51bWJlcik7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlLCBhc3NldCBzZXEgbnVtYmVyIGlzIG5vdCBwcmludGVkIHdoZW4gbm90IHNldC4KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLy8gQ2FsY3VsYXRlIHRoZSBzY2FsZWQgcGl4ZWwgc2l6ZSBqdXN0IGxpa2UgdGhlIGRldmljZSBpcyBzdXBwb3NlZCB0by4KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgc2NhbGVkUGl4ZWxzVG9QaXhlbHMoZmxvYXQgc3AsIGZsb2F0IGZvbnRTY2FsZSwgaW50IGRlbnNpdHlEcGkpIHsKLSAgICAgICAgZmluYWwgaW50IERFRkFVTFRfREVOU0lUWSA9IDE2MDsKLSAgICAgICAgZmxvYXQgZiA9IGRlbnNpdHlEcGkgKiAoMS4wZiAvIERFRkFVTFRfREVOU0lUWSkgKiBmb250U2NhbGUgKiBzcDsKLSAgICAgICAgcmV0dXJuIChpbnQpICgoZiA+PSAwKSA/IChmICsgMC41ZikgOiAoZiAtIDAuNWYpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBQYXR0ZXJuIHNEZXZpY2VEZW5zaXR5UGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiXiguKyk6IGZvbnRBY3Rpdml0eURwaT0oLispJCIpOwotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0QWN0aXZpdHlEZW5zaXR5RHBpKFN0cmluZyBhY3Rpdml0eU5hbWUsIFN0cmluZyBsb2dTZXBhcmF0b3IpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBTdHJpbmdbXSBsaW5lcyA9IGdldERldmljZUxvZ3NGb3JDb21wb25lbnQoYWN0aXZpdHlOYW1lLCBsb2dTZXBhcmF0b3IpOwotICAgICAgICBmb3IgKGludCBpID0gbGluZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsaW5lID0gbGluZXNbaV0udHJpbSgpOwotICAgICAgICAgICAgZmluYWwgTWF0Y2hlciBtYXRjaGVyID0gc0RldmljZURlbnNpdHlQYXR0ZXJuLm1hdGNoZXIobGluZSk7Ci0gICAgICAgICAgICBpZiAobWF0Y2hlci5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gSW50ZWdlci5wYXJzZUludChtYXRjaGVyLmdyb3VwKDIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmYWlsKCJObyBmb250QWN0aXZpdHlEcGkgcmVwb3J0ZWQgZnJvbSBhY3Rpdml0eSAiICsgYWN0aXZpdHlOYW1lKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gc0ZvbnRTaXplUGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiXiguKyk6IGZvbnRQaXhlbFNpemU9KC4rKSQiKTsKLQotICAgIC8qKiBSZWFkIHRoZSBmb250IHNpemUgaW4gdGhlIGxhc3QgbG9nIGxpbmUuICovCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydEV4cGVjdGVkRm9udFBpeGVsU2l6ZShTdHJpbmcgYWN0aXZpdHlOYW1lLCBpbnQgZm9udFBpeGVsU2l6ZSwKLSAgICAgICAgICAgIFN0cmluZyBsb2dTZXBhcmF0b3IpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBTdHJpbmdbXSBsaW5lcyA9IGdldERldmljZUxvZ3NGb3JDb21wb25lbnQoYWN0aXZpdHlOYW1lLCBsb2dTZXBhcmF0b3IpOwotICAgICAgICBmb3IgKGludCBpID0gbGluZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsaW5lID0gbGluZXNbaV0udHJpbSgpOwotICAgICAgICAgICAgZmluYWwgTWF0Y2hlciBtYXRjaGVyID0gc0ZvbnRTaXplUGF0dGVybi5tYXRjaGVyKGxpbmUpOwotICAgICAgICAgICAgaWYgKG1hdGNoZXIubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCBmb250IHBpeGVsIHNpemUgZG9lcyBub3QgbWF0Y2giLCBmb250UGl4ZWxTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci5wYXJzZUludChtYXRjaGVyLmdyb3VwKDIpKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZhaWwoIk5vIGZvbnRQaXhlbFNpemUgcmVwb3J0ZWQgZnJvbSBhY3Rpdml0eSAiICsgYWN0aXZpdHlOYW1lKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9BY3Rpdml0eU1hbmFnZXJEaXNwbGF5TG9ja2VkS2V5Z3VhcmRUZXN0cy5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvQWN0aXZpdHlNYW5hZ2VyRGlzcGxheUxvY2tlZEtleWd1YXJkVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU4YzVhMS4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9BY3Rpdml0eU1hbmFnZXJEaXNwbGF5TG9ja2VkS2V5Z3VhcmRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnNlcnZlci5jdHM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uOwotCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmN0cy5BY3Rpdml0eU1hbmFnZXJTdGF0ZS5TVEFURV9SRVNVTUVEOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5jdHMuQWN0aXZpdHlNYW5hZ2VyU3RhdGUuU1RBVEVfU1RPUFBFRDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuY3RzLlN0YXRlTG9nZ2VyLmxvZ0U7Ci0KLS8qKgotICogRGlzcGxheSB0ZXN0cyB0aGF0IHJlcXVpcmUgYSBsb2NrZWQga2V5Z3VhcmQuCi0gKgotICogQnVpbGQ6IG1tbWEgLWozMiBjdHMvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcwotICogUnVuOiBjdHMvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvdXRpbC9ydW4tdGVzdCBDdHNTZXJ2aWNlc0hvc3RUZXN0Q2FzZXMgYW5kcm9pZC5zZXJ2ZXIuY3RzLkFjdGl2aXR5TWFuYWdlckRpc3BsYXlMb2NrZWRLZXlndWFyZFRlc3RzCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eU1hbmFnZXJEaXNwbGF5TG9ja2VkS2V5Z3VhcmRUZXN0cyBleHRlbmRzIEFjdGl2aXR5TWFuYWdlckRpc3BsYXlUZXN0QmFzZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9BQ1RJVklUWV9OQU1FID0gIlRlc3RBY3Rpdml0eSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZJUlRVQUxfRElTUExBWV9BQ1RJVklUWSA9ICJWaXJ0dWFsRGlzcGxheUFjdGl2aXR5IjsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIHNldExvY2tDcmVkZW50aWFsKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRlYXJEb3duTG9ja0NyZWRlbnRpYWxzKCk7Ci0gICAgICAgIH0gY2F0Y2ggKERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2dFKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgICAgICBzdXBlci50ZWFyRG93bigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgdGhhdCB2aXJ0dWFsIGRpc3BsYXkgY29udGVudCBpcyBoaWRkZW4gd2hlbiBkZXZpY2UgaXMgbG9ja2VkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsRGlzcGxheUhpZGVzQ29udGVudFdoZW5Mb2NrZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0c011bHRpRGlzcGxheSgpIHx8ICFpc0hhbmRoZWxkKCkpIHsgcmV0dXJuOyB9Ci0KLSAgICAgICAgLy8gQ3JlYXRlIG5ldyB1c3VhbCB2aXJ0dWFsIGRpc3BsYXkuCi0gICAgICAgIGZpbmFsIERpc3BsYXlTdGF0ZSBuZXdEaXNwbGF5ID0gbmV3IFZpcnR1YWxEaXNwbGF5QnVpbGRlcih0aGlzKS5idWlsZCgpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoVklSVFVBTF9ESVNQTEFZX0FDVElWSVRZLCB0cnVlIC8qIHZpc2libGUgKi8pOwotCi0gICAgICAgIC8vIExhdW5jaCBhY3Rpdml0eSBvbiBuZXcgc2Vjb25kYXJ5IGRpc3BsYXkuCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5T25EaXNwbGF5KFRFU1RfQUNUSVZJVFlfTkFNRSwgbmV3RGlzcGxheS5tRGlzcGxheUlkKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFRFU1RfQUNUSVZJVFlfTkFNRSwgdHJ1ZSAvKiB2aXNpYmxlICovKTsKLQotICAgICAgICAvLyBMb2NrIHRoZSBkZXZpY2UuCi0gICAgICAgIGdvdG9LZXlndWFyZCgpOwotICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JLZXlndWFyZFNob3dpbmdBbmROb3RPY2NsdWRlZChtRGV2aWNlKTsKLSAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yQWN0aXZpdHlTdGF0ZShtRGV2aWNlLCBURVNUX0FDVElWSVRZX05BTUUsIFNUQVRFX1NUT1BQRUQpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoVEVTVF9BQ1RJVklUWV9OQU1FLCBmYWxzZSAvKiB2aXNpYmxlICovKTsKLQotICAgICAgICAvLyBVbmxvY2sgYW5kIGNoZWNrIGlmIHZpc2liaWxpdHkgaXMgYmFjay4KLSAgICAgICAgdW5sb2NrRGV2aWNlV2l0aENyZWRlbnRpYWwoKTsKLSAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yS2V5Z3VhcmRHb25lKG1EZXZpY2UpOwotICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JBY3Rpdml0eVN0YXRlKG1EZXZpY2UsIFRFU1RfQUNUSVZJVFlfTkFNRSwgU1RBVEVfUkVTVU1FRCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShURVNUX0FDVElWSVRZX05BTUUsIHRydWUgLyogdmlzaWJsZSAqLyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvQWN0aXZpdHlNYW5hZ2VyRGlzcGxheVRlc3RCYXNlLmphdmEgYi9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9BY3Rpdml0eU1hbmFnZXJEaXNwbGF5VGVzdEJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MwYTI1Ny4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9BY3Rpdml0eU1hbmFnZXJEaXNwbGF5VGVzdEJhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuc2VydmVyLmN0czsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5Db2xsZWN0aW5nT3V0cHV0UmVjZWl2ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLkRldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5jdHMuQWN0aXZpdHlBbmRXaW5kb3dNYW5hZ2Vyc1N0YXRlLkRFRkFVTFRfRElTUExBWV9JRDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuY3RzLlN0YXRlTG9nZ2VyLmxvZzsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuY3RzLlN0YXRlTG9nZ2VyLmxvZ0U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIEFjdGl2aXR5TWFuYWdlciBkaXNwbGF5IHRlc3RzLgotICoKLSAqIEBzZWUgQWN0aXZpdHlNYW5hZ2VyRGlzcGxheVRlc3RzCi0gKiBAc2VlIEFjdGl2aXR5TWFuYWdlckRpc3BsYXlMb2NrZWRLZXlndWFyZFRlc3RzCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eU1hbmFnZXJEaXNwbGF5VGVzdEJhc2UgZXh0ZW5kcyBBY3Rpdml0eU1hbmFnZXJUZXN0QmFzZSB7Ci0KLSAgICBzdGF0aWMgZmluYWwgaW50IENVU1RPTV9ERU5TSVRZX0RQSSA9IDIyMjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEVU1QU1lTX0FDVElWSVRZX1BST0NFU1NFUyA9ICJkdW1wc3lzIGFjdGl2aXR5IHByb2Nlc3NlcyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERVTVBTWVNfRElTUExBWSA9ICJkdW1wc3lzIGRpc3BsYXkiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWSVJUVUFMX0RJU1BMQVlfQUNUSVZJVFkgPSAiVmlydHVhbERpc3BsYXlBY3Rpdml0eSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfREVOU0lUWV9EUEkgPSAtMTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBtVmlydHVhbERpc3BsYXlDcmVhdGVkOwotICAgIHByaXZhdGUgYm9vbGVhbiBtRGlzcGxheVNpbXVsYXRlZDsKLQotICAgIC8qKiBUZW1wIHN0b3JhZ2UgdXNlZCBmb3IgcGFyc2luZy4gKi8KLSAgICBmaW5hbCBMaW5rZWRMaXN0PFN0cmluZz4gbUR1bXBMaW5lcyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKLSAgICBmaW5hbCBMaW5rZWRMaXN0PFN0cmluZz4gbUFsdER1bXBMaW5lcyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBkZXN0cm95VmlydHVhbERpc3BsYXlzKCk7Ci0gICAgICAgICAgICBkZXN0cm95U2ltdWxhdGVkRGlzcGxheXMoKTsKLSAgICAgICAgfSBjYXRjaCAoRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZ0UoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgfQotCi0gICAgLyoqIENvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9ucyBhcHBsaWVkIHRvIGF0dGFjaGVkIGRpc3BsYXlzLiAqLwotICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBEaXNwbGF5U3RhdGUgewotICAgICAgICBpbnQgbURpc3BsYXlJZDsKLSAgICAgICAgU3RyaW5nIG1PdmVycmlkZUNvbmZpZzsKLSAgICAgICAgU3RyaW5nIG1EaXNwbGF5Vmlld3BvcnRJZDsKLQotICAgICAgICBwcml2YXRlIERpc3BsYXlTdGF0ZShpbnQgZGlzcGxheUlkLCBTdHJpbmcgb3ZlcnJpZGVDb25maWcsIFN0cmluZyB1bmlxdWVJZCkgewotICAgICAgICAgICAgbURpc3BsYXlJZCA9IGRpc3BsYXlJZDsKLSAgICAgICAgICAgIG1PdmVycmlkZUNvbmZpZyA9IG92ZXJyaWRlQ29uZmlnOwotICAgICAgICAgICAgbURpc3BsYXlWaWV3cG9ydElkID0gdW5pcXVlSWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGludCBnZXRXaWR0aCgpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIGNvbmZpZ1BhcnRzID0gbU92ZXJyaWRlQ29uZmlnLnNwbGl0KCIgIik7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBwYXJ0IDogY29uZmlnUGFydHMpIHsKLSAgICAgICAgICAgICAgICBpZiAocGFydC5lbmRzV2l0aCgiZHAiKSAmJiBwYXJ0LnN0YXJ0c1dpdGgoInciKSkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgd2lkdGhTdHJpbmcgPSBwYXJ0LnN1YnN0cmluZygxLCBwYXJ0Lmxlbmd0aCgpIC0gMyk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHdpZHRoU3RyaW5nKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgaW50IGdldEhlaWdodCgpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIGNvbmZpZ1BhcnRzID0gbU92ZXJyaWRlQ29uZmlnLnNwbGl0KCIgIik7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBwYXJ0IDogY29uZmlnUGFydHMpIHsKLSAgICAgICAgICAgICAgICBpZiAocGFydC5lbmRzV2l0aCgiZHAiKSAmJiBwYXJ0LnN0YXJ0c1dpdGgoImgiKSkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaGVpZ2h0U3RyaW5nID0gcGFydC5zdWJzdHJpbmcoMSwgcGFydC5sZW5ndGgoKSAtIDMpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gSW50ZWdlci5wYXJzZUludChoZWlnaHRTdHJpbmcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGdldERwaSgpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIGNvbmZpZ1BhcnRzID0gbU92ZXJyaWRlQ29uZmlnLnNwbGl0KCIgIik7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBwYXJ0IDogY29uZmlnUGFydHMpIHsKLSAgICAgICAgICAgICAgICBpZiAocGFydC5lbmRzV2l0aCgiZHBpIikpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGRlbnNpdHlEcGlTdHJpbmcgPSBwYXJ0LnN1YnN0cmluZygwLCBwYXJ0Lmxlbmd0aCgpIC0gMyk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KGRlbnNpdHlEcGlTdHJpbmcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGdldERpc3BsYXlWaWV3UG9ydElkKCkgewotICAgICAgICAgICAgcmV0dXJuIG1EaXNwbGF5Vmlld3BvcnRJZDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiBDb250YWlucyB0aGUgY29uZmlndXJhdGlvbnMgYXBwbGllZCB0byBhdHRhY2hlZCBkaXNwbGF5cy4gKi8KLSAgICBzdGF0aWMgZmluYWwgY2xhc3MgUmVwb3J0ZWREaXNwbGF5cyB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gc0dsb2JhbENvbmZpZ3VyYXRpb25QYXR0ZXJuID0KLSAgICAgICAgICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoIm1HbG9iYWxDb25maWd1cmF0aW9uOiAoXFx7LipcXH0pIik7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gc0Rpc3BsYXlPdmVycmlkZUNvbmZpZ3VyYXRpb25zUGF0dGVybiA9Ci0gICAgICAgICAgICAgICAgUGF0dGVybi5jb21waWxlKCJEaXNwbGF5IG92ZXJyaWRlIGNvbmZpZ3VyYXRpb25zOiIpOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHNEaXNwbGF5Q29uZmlnUGF0dGVybiA9Ci0gICAgICAgICAgICAgICAgUGF0dGVybi5jb21waWxlKCIoXFxkKyk6IChcXHsuKlxcfSkiKTsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBzVmlydHVhbFRvdWNoVmlld3BvcnRQYXR0ZXJuID0KLSAgICAgICAgICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoIm1WaXJ0dWFsVG91Y2hWaWV3cG9ydHMuKmRpc3BsYXlJZD0oXFxkKyksIHVuaXF1ZUlkPScoW14nXSspJywgLioiKTsKLQotICAgICAgICBTdHJpbmcgbUdsb2JhbENvbmZpZzsKLSAgICAgICAgcHJpdmF0ZSBNYXA8SW50ZWdlciwgRGlzcGxheVN0YXRlPiBtRGlzcGxheVN0YXRlcyA9IG5ldyBIYXNoTWFwPD4oKTsKLQotICAgICAgICBzdGF0aWMgUmVwb3J0ZWREaXNwbGF5cyBjcmVhdGUoTGlua2VkTGlzdDxTdHJpbmc+IGFjdGl2aXR5UHJvY2Vzc0R1bXAsCi0gICAgICAgICAgICAgICAgTGlua2VkTGlzdDxTdHJpbmc+IGRpc3BsYXlEdW1wKSB7Ci0gICAgICAgICAgICBmaW5hbCBSZXBvcnRlZERpc3BsYXlzIHJlc3VsdCA9IG5ldyBSZXBvcnRlZERpc3BsYXlzKCk7Ci0gICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiB2aXJ0dWFsVW5pcXVlSWRNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQotICAgICAgICAgICAgd2hpbGUgKCFkaXNwbGF5RHVtcC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbGluZSA9IGRpc3BsYXlEdW1wLnBvcCgpLnRyaW0oKTsKLQotICAgICAgICAgICAgICAgIE1hdGNoZXIgbWF0Y2hlciA9IHNWaXJ0dWFsVG91Y2hWaWV3cG9ydFBhdHRlcm4ubWF0Y2hlcihsaW5lKTsKLSAgICAgICAgICAgICAgICBpZiAobWF0Y2hlci5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdmlydHVhbFVuaXF1ZUlkTWFwLnB1dChtYXRjaGVyLmdyb3VwKDEpLCBtYXRjaGVyLmdyb3VwKDIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHdoaWxlICghYWN0aXZpdHlQcm9jZXNzRHVtcC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbGluZSA9IGFjdGl2aXR5UHJvY2Vzc0R1bXAucG9wKCkudHJpbSgpOwotCi0KLSAgICAgICAgICAgICAgICBNYXRjaGVyIGFjdE1hdGNoZXIgPSBzRGlzcGxheU92ZXJyaWRlQ29uZmlndXJhdGlvbnNQYXR0ZXJuLm1hdGNoZXIobGluZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGFjdE1hdGNoZXIubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZyhsaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKFJlcG9ydGVkRGlzcGxheXMuc2hvdWxkQ29udGludWVFeHRyYWN0aW5nKGFjdGl2aXR5UHJvY2Vzc0R1bXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzRGlzcGxheUNvbmZpZ1BhdHRlcm4pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZGlzcGxheU92ZXJyaWRlQ29uZmlnTGluZSA9IGFjdGl2aXR5UHJvY2Vzc0R1bXAucG9wKCkudHJpbSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbG9nKGRpc3BsYXlPdmVycmlkZUNvbmZpZ0xpbmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWN0TWF0Y2hlciA9IHNEaXNwbGF5Q29uZmlnUGF0dGVybi5tYXRjaGVyKGRpc3BsYXlPdmVycmlkZUNvbmZpZ0xpbmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWN0TWF0Y2hlci5tYXRjaGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdGVtcFVuaXF1ZUlkID0gImxvY2FsOiIgKyBhY3RNYXRjaGVyLmdyb3VwKDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSW50ZWdlciBkaXNwbGF5SWQgPSBJbnRlZ2VyLnZhbHVlT2YoYWN0TWF0Y2hlci5ncm91cCgxKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBEZWZhdWx0IHVuaXF1ZSBpZHMgZm9yIG5vbiB2aXJ0dWFsIGRpc3BsYXkuCi0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdW5pcXVlSWQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmlydHVhbFVuaXF1ZUlkTWFwLmNvbnRhaW5zS2V5KGFjdE1hdGNoZXIuZ3JvdXAoMSkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHZpcnR1YWxVbmlxdWVJZE1hcC5nZXQoYWN0TWF0Y2hlci5ncm91cCgxKSkgOiB0ZW1wVW5pcXVlSWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQubURpc3BsYXlTdGF0ZXMucHV0KGRpc3BsYXlJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERpc3BsYXlTdGF0ZShkaXNwbGF5SWQsIGFjdE1hdGNoZXIuZ3JvdXAoMiksIHVuaXF1ZUlkKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYWN0TWF0Y2hlciA9IHNHbG9iYWxDb25maWd1cmF0aW9uUGF0dGVybi5tYXRjaGVyKGxpbmUpOwotICAgICAgICAgICAgICAgIGlmIChhY3RNYXRjaGVyLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cobGluZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5tR2xvYmFsQ29uZmlnID0gYWN0TWF0Y2hlci5ncm91cCgxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiogQ2hlY2sgaWYgbmV4dCBsaW5lIGluIGR1bXAgbWF0Y2hlcyB0aGUgcGF0dGVybiBhbmQgd2Ugc2hvdWxkIGNvbnRpbnVlIGV4dHJhY3RpbmcuICovCi0gICAgICAgIHN0YXRpYyBib29sZWFuIHNob3VsZENvbnRpbnVlRXh0cmFjdGluZyhMaW5rZWRMaXN0PFN0cmluZz4gZHVtcCwgUGF0dGVybiBtYXRjaGluZ1BhdHRlcm4pIHsKLSAgICAgICAgICAgIGlmIChkdW1wLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxpbmUgPSBkdW1wLnBlZWsoKS50cmltKCk7Ci0gICAgICAgICAgICByZXR1cm4gbWF0Y2hpbmdQYXR0ZXJuLm1hdGNoZXIobGluZSkubWF0Y2hlcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgRGlzcGxheVN0YXRlIGdldERpc3BsYXlTdGF0ZShpbnQgZGlzcGxheUlkKSB7Ci0gICAgICAgICAgICByZXR1cm4gbURpc3BsYXlTdGF0ZXMuZ2V0KGRpc3BsYXlJZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZ2V0TnVtYmVyT2ZEaXNwbGF5cygpIHsKLSAgICAgICAgICAgIHJldHVybiBtRGlzcGxheVN0YXRlcy5zaXplKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiogUmV0dXJuIHRoZSBkaXNwbGF5IHN0YXRlIHdpdGggd2lkdGgsIGhlaWdodCwgZHBpICovCi0gICAgICAgIERpc3BsYXlTdGF0ZSBnZXREaXNwbGF5U3RhdGUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZHBpKSB7Ci0gICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxJbnRlZ2VyLCBEaXNwbGF5U3RhdGU+IGVudHJ5IDogbURpc3BsYXlTdGF0ZXMuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIERpc3BsYXlTdGF0ZSBkcyA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGRzLm1EaXNwbGF5SWQgIT0gREVGQVVMVF9ESVNQTEFZX0lEICYmIGRzLmdldERwaSgpID09IGRwaQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgZHMuZ2V0V2lkdGgoKSA9PSB3aWR0aCAmJiBkcy5nZXRIZWlnaHQoKSA9PSBoZWlnaHQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqIFJldHVybiB0aGUgZGlzcGxheSBzdGF0ZSB3aXRoIHRoZSBnaXZlbiB1bmlxdWUgaWQgKi8KLSAgICAgICAgRGlzcGxheVN0YXRlIGdldERpc3BsYXlTdGF0ZShTdHJpbmcgdmlld3BvcnRJZCkgewotICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8SW50ZWdlciwgRGlzcGxheVN0YXRlPiBlbnRyeSA6IG1EaXNwbGF5U3RhdGVzLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBEaXNwbGF5U3RhdGUgZHMgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGlmIChkcy5tRGlzcGxheVZpZXdwb3J0SWQuZXF1YWxzKHZpZXdwb3J0SWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBkczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKiBDaGVjayBpZiByZXBvcnRlZCBzdGF0ZSBpcyB2YWxpZC4gKi8KLSAgICAgICAgYm9vbGVhbiBpc1ZhbGlkU3RhdGUoaW50IGV4cGVjdGVkRGlzcGxheUNvdW50KSB7Ci0gICAgICAgICAgICBpZiAobURpc3BsYXlTdGF0ZXMuc2l6ZSgpICE9IGV4cGVjdGVkRGlzcGxheUNvdW50KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxJbnRlZ2VyLCBEaXNwbGF5U3RhdGU+IGVudHJ5IDogbURpc3BsYXlTdGF0ZXMuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIERpc3BsYXlTdGF0ZSBkcyA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGRzLm1EaXNwbGF5SWQgIT0gREVGQVVMVF9ESVNQTEFZX0lEICYmIGRzLmdldERwaSgpID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIFJlcG9ydGVkRGlzcGxheXMgZ2V0RGlzcGxheXNTdGF0ZXMoKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gUGFyc2UgZHVtcHN5cyBhY3Rpdml0eSBwcm9jZXNzZXMuCi0gICAgICAgIGZpbmFsIENvbGxlY3RpbmdPdXRwdXRSZWNlaXZlciBvdXRwdXRSZWNlaXZlciA9IG5ldyBDb2xsZWN0aW5nT3V0cHV0UmVjZWl2ZXIoKTsKLSAgICAgICAgbURldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKERVTVBTWVNfQUNUSVZJVFlfUFJPQ0VTU0VTLCBvdXRwdXRSZWNlaXZlcik7Ci0gICAgICAgIFN0cmluZyBkdW1wID0gb3V0cHV0UmVjZWl2ZXIuZ2V0T3V0cHV0KCk7Ci0gICAgICAgIG1EdW1wTGluZXMuY2xlYXIoKTsKLQotICAgICAgICBDb2xsZWN0aW9ucy5hZGRBbGwobUR1bXBMaW5lcywgZHVtcC5zcGxpdCgiXFxuIikpOwotCi0gICAgICAgIC8vIFBhcnNlIGR1bXBzeXMgZGlzcGxheQotICAgICAgICBmaW5hbCBDb2xsZWN0aW5nT3V0cHV0UmVjZWl2ZXIgb3V0cHV0UmVjZWl2ZXJOZXcgPSBuZXcgQ29sbGVjdGluZ091dHB1dFJlY2VpdmVyKCk7Ci0gICAgICAgIG1EZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZChEVU1QU1lTX0RJU1BMQVksIG91dHB1dFJlY2VpdmVyTmV3KTsKLSAgICAgICAgU3RyaW5nIGR1bXBOZXcgPSBvdXRwdXRSZWNlaXZlck5ldy5nZXRPdXRwdXQoKTsKLSAgICAgICAgbUFsdER1bXBMaW5lcy5jbGVhcigpOwotCi0gICAgICAgIENvbGxlY3Rpb25zLmFkZEFsbChtQWx0RHVtcExpbmVzLCBkdW1wTmV3LnNwbGl0KCJcXG4iKSk7Ci0KLSAgICAgICAgcmV0dXJuIFJlcG9ydGVkRGlzcGxheXMuY3JlYXRlKG1EdW1wTGluZXMsIG1BbHREdW1wTGluZXMpOwotICAgIH0KLQotICAgIC8qKiBGaW5kIHRoZSBkaXNwbGF5IHRoYXQgd2FzIG5vdCBvcmlnaW5hbGx5IHJlcG9ydGVkIGluIG9sZERpc3BsYXlzIGFuZCBhZGRlZCBpbiBuZXdEaXNwbGF5cyAqLwotICAgIHByb3RlY3RlZCBMaXN0PEFjdGl2aXR5TWFuYWdlckRpc3BsYXlUZXN0cy5EaXNwbGF5U3RhdGU+IGZpbmROZXdEaXNwbGF5U3RhdGVzKAotICAgICAgICAgICAgUmVwb3J0ZWREaXNwbGF5cyBvbGREaXNwbGF5cywgUmVwb3J0ZWREaXNwbGF5cyBuZXdEaXNwbGF5cykgewotICAgICAgICBmaW5hbCBBcnJheUxpc3Q8RGlzcGxheVN0YXRlPiBkaXNwbGF5cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBmb3IgKEludGVnZXIgZGlzcGxheUlkIDogbmV3RGlzcGxheXMubURpc3BsYXlTdGF0ZXMua2V5U2V0KCkpIHsKLSAgICAgICAgICAgIGlmICghb2xkRGlzcGxheXMubURpc3BsYXlTdGF0ZXMuY29udGFpbnNLZXkoZGlzcGxheUlkKSkgewotICAgICAgICAgICAgICAgIGRpc3BsYXlzLmFkZChuZXdEaXNwbGF5cy5nZXREaXNwbGF5U3RhdGUoZGlzcGxheUlkKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZGlzcGxheXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIG5ldyB2aXJ0dWFsIGRpc3BsYXkuCi0gICAgICogQHBhcmFtIGRlbnNpdHlEcGkgcHJvdmlkZSBjdXN0b20gZGVuc2l0eSBmb3IgdGhlIGRpc3BsYXkuCi0gICAgICogQHBhcmFtIGxhdW5jaEluU3BsaXRTY3JlZW4gc3RhcnQge0BsaW5rIFZpcnR1YWxEaXNwbGF5QWN0aXZpdHl9IHRvIHNpZGUgZnJvbQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAbGluayBMYXVuY2hpbmdBY3Rpdml0eX0gb24gcHJpbWFyeSBkaXNwbGF5LgotICAgICAqIEBwYXJhbSBjYW5TaG93V2l0aEluc2VjdXJlS2V5Z3VhcmQgYWxsb3cgc2hvd2luZyBjb250ZW50IHdoZW4gZGV2aWNlIGlzIHNob3dpbmcgYW4gaW5zZWN1cmUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleWd1YXJkLgotICAgICAqIEBwYXJhbSBtdXN0QmVDcmVhdGVkIHNob3VsZCBhc3NlcnQgaWYgdGhlIGRpc3BsYXkgd2FzIG9yIHdhc24ndCBjcmVhdGVkLgotICAgICAqIEBwYXJhbSBwdWJsaWNEaXNwbGF5IG1ha2UgZGlzcGxheSBwdWJsaWMuCi0gICAgICogQHBhcmFtIHJlc2l6ZURpc3BsYXkgc2hvdWxkIHJlc2l6ZSBkaXNwbGF5IHdoZW4gc3VyZmFjZSBzaXplIGNoYW5nZXMuCi0gICAgICogQHBhcmFtIGxhdW5jaEFjdGl2aXR5IHNob3VsZCBsYXVuY2ggdGVzdCBhY3Rpdml0eSBpbW1lZGlhdGVseSBhZnRlciBkaXNwbGF5IGNyZWF0aW9uLgotICAgICAqIEByZXR1cm4ge0BsaW5rIEFjdGl2aXR5TWFuYWdlckRpc3BsYXlUZXN0cy5EaXNwbGF5U3RhdGV9IG9mIG5ld2x5IGNyZWF0ZWQgZGlzcGxheS4KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgTGlzdDxBY3Rpdml0eU1hbmFnZXJEaXNwbGF5VGVzdHMuRGlzcGxheVN0YXRlPiBjcmVhdGVWaXJ0dWFsRGlzcGxheXMoaW50IGRlbnNpdHlEcGksCi0gICAgICAgICAgICBib29sZWFuIGxhdW5jaEluU3BsaXRTY3JlZW4sIGJvb2xlYW4gY2FuU2hvd1dpdGhJbnNlY3VyZUtleWd1YXJkLCBib29sZWFuIG11c3RCZUNyZWF0ZWQsCi0gICAgICAgICAgICBib29sZWFuIHB1YmxpY0Rpc3BsYXksIGJvb2xlYW4gcmVzaXplRGlzcGxheSwgU3RyaW5nIGxhdW5jaEFjdGl2aXR5LCBpbnQgZGlzcGxheUNvdW50KQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFN0YXJ0IGFuIGFjdGl2aXR5IHRoYXQgaXMgYWJsZSB0byBjcmVhdGUgdmlydHVhbCBkaXNwbGF5cy4KLSAgICAgICAgaWYgKGxhdW5jaEluU3BsaXRTY3JlZW4pIHsKLSAgICAgICAgICAgIGdldExhdW5jaEFjdGl2aXR5QnVpbGRlcigpLnNldFRvU2lkZSh0cnVlKQotICAgICAgICAgICAgICAgICAgICAuc2V0VGFyZ2V0QWN0aXZpdHlOYW1lKFZJUlRVQUxfRElTUExBWV9BQ1RJVklUWSkuZXhlY3V0ZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbGF1bmNoQWN0aXZpdHkoVklSVFVBTF9ESVNQTEFZX0FDVElWSVRZKTsKLSAgICAgICAgfQotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCBuZXcgU3RyaW5nW10ge1ZJUlRVQUxfRElTUExBWV9BQ1RJVklUWX0sCi0gICAgICAgICAgICAgICAgZmFsc2UgLyogY29tcGFyZVRhc2tBbmRTdGFja0JvdW5kcyAqLyk7Ci0gICAgICAgIGZpbmFsIEFjdGl2aXR5TWFuYWdlckRpc3BsYXlUZXN0cy5SZXBvcnRlZERpc3BsYXlzIG9yaWdpbmFsRFMgPSBnZXREaXNwbGF5c1N0YXRlcygpOwotCi0gICAgICAgIC8vIENyZWF0ZSB2aXJ0dWFsIGRpc3BsYXkgd2l0aCBjdXN0b20gZGVuc2l0eSBkcGkuCi0gICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoZ2V0Q3JlYXRlVmlydHVhbERpc3BsYXlDb21tYW5kKGRlbnNpdHlEcGksIGNhblNob3dXaXRoSW5zZWN1cmVLZXlndWFyZCwKLSAgICAgICAgICAgICAgICBwdWJsaWNEaXNwbGF5LCByZXNpemVEaXNwbGF5LCBsYXVuY2hBY3Rpdml0eSwgZGlzcGxheUNvdW50KSk7Ci0gICAgICAgIG1WaXJ0dWFsRGlzcGxheUNyZWF0ZWQgPSB0cnVlOwotCi0gICAgICAgIHJldHVybiBhc3NlcnRBbmRHZXROZXdEaXNwbGF5cyhtdXN0QmVDcmVhdGVkID8gZGlzcGxheUNvdW50IDogLTEsIG9yaWdpbmFsRFMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNpbXVsYXRlIG5ldyBkaXNwbGF5LgotICAgICAqIEBwYXJhbSBkZW5zaXR5RHBpIHByb3ZpZGUgY3VzdG9tIGRlbnNpdHkgZm9yIHRoZSBkaXNwbGF5LgotICAgICAqIEByZXR1cm4ge0BsaW5rIEFjdGl2aXR5TWFuYWdlckRpc3BsYXlUZXN0cy5EaXNwbGF5U3RhdGV9IG9mIG5ld2x5IGNyZWF0ZWQgZGlzcGxheS4KLSAgICAgKi8KLSAgICBwcml2YXRlIExpc3Q8QWN0aXZpdHlNYW5hZ2VyRGlzcGxheVRlc3RzLkRpc3BsYXlTdGF0ZT4gc2ltdWxhdGVEaXNwbGF5KGludCBkZW5zaXR5RHBpKQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIEFjdGl2aXR5TWFuYWdlckRpc3BsYXlUZXN0cy5SZXBvcnRlZERpc3BsYXlzIG9yaWdpbmFsRHMgPSBnZXREaXNwbGF5c1N0YXRlcygpOwotCi0gICAgICAgIC8vIENyZWF0ZSB2aXJ0dWFsIGRpc3BsYXkgd2l0aCBjdXN0b20gZGVuc2l0eSBkcGkuCi0gICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoZ2V0U2ltdWxhdGVEaXNwbGF5Q29tbWFuZChkZW5zaXR5RHBpKSk7Ci0gICAgICAgIG1EaXNwbGF5U2ltdWxhdGVkID0gdHJ1ZTsKLQotICAgICAgICByZXR1cm4gYXNzZXJ0QW5kR2V0TmV3RGlzcGxheXMoMSwgb3JpZ2luYWxEcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2FpdCBmb3IgZGVzaXJlZCBudW1iZXIgb2YgZGlzcGxheXMgdG8gYmUgY3JlYXRlZCBhbmQgZ2V0IHRoZWlyIHByb3BlcnRpZXMuCi0gICAgICogQHBhcmFtIG5ld0Rpc3BsYXlDb3VudCBleHBlY3RlZCBkaXNwbGF5IGNvdW50LCAtMSBpZiBkaXNwbGF5IHNob3VsZCBub3QgYmUgY3JlYXRlZC4KLSAgICAgKiBAcGFyYW0gb3JpZ2luYWxEUyBkaXNwbGF5IHN0YXRlcyBiZWZvcmUgY3JlYXRpb24gb2YgbmV3IGRpc3BsYXkocykuCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0PEFjdGl2aXR5TWFuYWdlckRpc3BsYXlUZXN0cy5EaXNwbGF5U3RhdGU+IGFzc2VydEFuZEdldE5ld0Rpc3BsYXlzKAotICAgICAgICAgICAgaW50IG5ld0Rpc3BsYXlDb3VudCwgQWN0aXZpdHlNYW5hZ2VyRGlzcGxheVRlc3RzLlJlcG9ydGVkRGlzcGxheXMgb3JpZ2luYWxEUykKLSAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBpbnQgb3JpZ2luYWxEaXNwbGF5Q291bnQgPSBvcmlnaW5hbERTLm1EaXNwbGF5U3RhdGVzLnNpemUoKTsKLQotICAgICAgICAvLyBXYWl0IGZvciB0aGUgZGlzcGxheShzKSB0byBiZSBjcmVhdGVkIGFuZCBnZXQgY29uZmlndXJhdGlvbnMuCi0gICAgICAgIGZpbmFsIEFjdGl2aXR5TWFuYWdlckRpc3BsYXlUZXN0cy5SZXBvcnRlZERpc3BsYXlzIGRzID0KLSAgICAgICAgICAgICAgICBnZXREaXNwbGF5U3RhdGVBZnRlckNoYW5nZShvcmlnaW5hbERpc3BsYXlDb3VudCArIG5ld0Rpc3BsYXlDb3VudCk7Ci0gICAgICAgIGlmIChuZXdEaXNwbGF5Q291bnQgIT0gLTEpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiTmV3IHZpcnR1YWwgZGlzcGxheShzKSBtdXN0IGJlIGNyZWF0ZWQiLAotICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbERpc3BsYXlDb3VudCArIG5ld0Rpc3BsYXlDb3VudCwgZHMubURpc3BsYXlTdGF0ZXMuc2l6ZSgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiTmV3IHZpcnR1YWwgZGlzcGxheSBtdXN0IG5vdCBiZSBjcmVhdGVkIiwKLSAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxEaXNwbGF5Q291bnQsIGRzLm1EaXNwbGF5U3RhdGVzLnNpemUoKSk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEZpbmQgdGhlIG5ld2x5IGFkZGVkIGRpc3BsYXkocykuCi0gICAgICAgIGZpbmFsIExpc3Q8QWN0aXZpdHlNYW5hZ2VyRGlzcGxheVRlc3RzLkRpc3BsYXlTdGF0ZT4gbmV3RGlzcGxheXMKLSAgICAgICAgICAgICAgICA9IGZpbmROZXdEaXNwbGF5U3RhdGVzKG9yaWdpbmFsRFMsIGRzKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiTmV3IHZpcnR1YWwgZGlzcGxheSBtdXN0IGJlIGNyZWF0ZWQiLCBuZXdEaXNwbGF5Q291bnQgPT0gbmV3RGlzcGxheXMuc2l6ZSgpKTsKLQotICAgICAgICByZXR1cm4gbmV3RGlzcGxheXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVzdHJveSBleGlzdGluZyB2aXJ0dWFsIGRpc3BsYXkuCi0gICAgICovCi0gICAgdm9pZCBkZXN0cm95VmlydHVhbERpc3BsYXlzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChtVmlydHVhbERpc3BsYXlDcmVhdGVkKSB7Ci0gICAgICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKGdldERlc3Ryb3lWaXJ0dWFsRGlzcGxheUNvbW1hbmQoKSk7Ci0gICAgICAgICAgICBtVmlydHVhbERpc3BsYXlDcmVhdGVkID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZXN0cm95IGV4aXN0aW5nIHNpbXVsYXRlZCBkaXNwbGF5LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBkZXN0cm95U2ltdWxhdGVkRGlzcGxheXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG1EaXNwbGF5U2ltdWxhdGVkKSB7Ci0gICAgICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKGdldERlc3Ryb3lTaW11bGF0ZWREaXNwbGF5Q29tbWFuZCgpKTsKLSAgICAgICAgICAgIG1EaXNwbGF5U2ltdWxhdGVkID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgY2xhc3MgVmlydHVhbERpc3BsYXlCdWlsZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBBY3Rpdml0eU1hbmFnZXJEaXNwbGF5VGVzdEJhc2UgbVRlc3RzOwotCi0gICAgICAgIHByaXZhdGUgaW50IG1EZW5zaXR5RHBpID0gQ1VTVE9NX0RFTlNJVFlfRFBJOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUxhdW5jaEluU3BsaXRTY3JlZW4gPSBmYWxzZTsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1DYW5TaG93V2l0aEluc2VjdXJlS2V5Z3VhcmQgPSBmYWxzZTsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1QdWJsaWNEaXNwbGF5ID0gZmFsc2U7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtUmVzaXplRGlzcGxheSA9IHRydWU7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIG1MYXVuY2hBY3Rpdml0eSA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtU2ltdWxhdGVEaXNwbGF5ID0gZmFsc2U7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtTXVzdEJlQ3JlYXRlZCA9IHRydWU7Ci0KLSAgICAgICAgcHVibGljIFZpcnR1YWxEaXNwbGF5QnVpbGRlcihBY3Rpdml0eU1hbmFnZXJEaXNwbGF5VGVzdEJhc2UgdGVzdHMpIHsKLSAgICAgICAgICAgIG1UZXN0cyA9IHRlc3RzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFZpcnR1YWxEaXNwbGF5QnVpbGRlciBzZXREZW5zaXR5RHBpKGludCBkZW5zaXR5RHBpKSB7Ci0gICAgICAgICAgICBtRGVuc2l0eURwaSA9IGRlbnNpdHlEcGk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBWaXJ0dWFsRGlzcGxheUJ1aWxkZXIgc2V0TGF1bmNoSW5TcGxpdFNjcmVlbihib29sZWFuIGxhdW5jaEluU3BsaXRTY3JlZW4pIHsKLSAgICAgICAgICAgIG1MYXVuY2hJblNwbGl0U2NyZWVuID0gbGF1bmNoSW5TcGxpdFNjcmVlbjsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFZpcnR1YWxEaXNwbGF5QnVpbGRlciBzZXRDYW5TaG93V2l0aEluc2VjdXJlS2V5Z3VhcmQoCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBjYW5TaG93V2l0aEluc2VjdXJlS2V5Z3VhcmQpIHsKLSAgICAgICAgICAgIG1DYW5TaG93V2l0aEluc2VjdXJlS2V5Z3VhcmQgPSBjYW5TaG93V2l0aEluc2VjdXJlS2V5Z3VhcmQ7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBWaXJ0dWFsRGlzcGxheUJ1aWxkZXIgc2V0UHVibGljRGlzcGxheShib29sZWFuIHB1YmxpY0Rpc3BsYXkpIHsKLSAgICAgICAgICAgIG1QdWJsaWNEaXNwbGF5ID0gcHVibGljRGlzcGxheTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFZpcnR1YWxEaXNwbGF5QnVpbGRlciBzZXRSZXNpemVEaXNwbGF5KGJvb2xlYW4gcmVzaXplRGlzcGxheSkgewotICAgICAgICAgICAgbVJlc2l6ZURpc3BsYXkgPSByZXNpemVEaXNwbGF5OwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgVmlydHVhbERpc3BsYXlCdWlsZGVyIHNldExhdW5jaEFjdGl2aXR5KFN0cmluZyBsYXVuY2hBY3Rpdml0eSkgewotICAgICAgICAgICAgbUxhdW5jaEFjdGl2aXR5ID0gbGF1bmNoQWN0aXZpdHk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBWaXJ0dWFsRGlzcGxheUJ1aWxkZXIgc2V0U2ltdWxhdGVEaXNwbGF5KGJvb2xlYW4gc2ltdWxhdGVEaXNwbGF5KSB7Ci0gICAgICAgICAgICBtU2ltdWxhdGVEaXNwbGF5ID0gc2ltdWxhdGVEaXNwbGF5OwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgVmlydHVhbERpc3BsYXlCdWlsZGVyIHNldE11c3RCZUNyZWF0ZWQoYm9vbGVhbiBtdXN0QmVDcmVhdGVkKSB7Ci0gICAgICAgICAgICBtTXVzdEJlQ3JlYXRlZCA9IG11c3RCZUNyZWF0ZWQ7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBEaXNwbGF5U3RhdGUgYnVpbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGZpbmFsIExpc3Q8RGlzcGxheVN0YXRlPiBkaXNwbGF5cyA9IGJ1aWxkKDEpOwotICAgICAgICAgICAgcmV0dXJuIGRpc3BsYXlzICE9IG51bGwgJiYgIWRpc3BsYXlzLmlzRW1wdHkoKSA/IGRpc3BsYXlzLmdldCgwKSA6IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTGlzdDxEaXNwbGF5U3RhdGU+IGJ1aWxkKGludCBjb3VudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAobVNpbXVsYXRlRGlzcGxheSkgewotICAgICAgICAgICAgICAgIHJldHVybiBtVGVzdHMuc2ltdWxhdGVEaXNwbGF5KG1EZW5zaXR5RHBpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG1UZXN0cy5jcmVhdGVWaXJ0dWFsRGlzcGxheXMobURlbnNpdHlEcGksIG1MYXVuY2hJblNwbGl0U2NyZWVuLAotICAgICAgICAgICAgICAgICAgICBtQ2FuU2hvd1dpdGhJbnNlY3VyZUtleWd1YXJkLCBtTXVzdEJlQ3JlYXRlZCwgbVB1YmxpY0Rpc3BsYXksIG1SZXNpemVEaXNwbGF5LAotICAgICAgICAgICAgICAgICAgICBtTGF1bmNoQWN0aXZpdHksIGNvdW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRDcmVhdGVWaXJ0dWFsRGlzcGxheUNvbW1hbmQoaW50IGRlbnNpdHlEcGksCi0gICAgICAgICAgICBib29sZWFuIGNhblNob3dXaXRoSW5zZWN1cmVLZXlndWFyZCwgYm9vbGVhbiBwdWJsaWNEaXNwbGF5LCBib29sZWFuIHJlc2l6ZURpc3BsYXksCi0gICAgICAgICAgICBTdHJpbmcgbGF1bmNoQWN0aXZpdHksIGludCBkaXNwbGF5Q291bnQpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBjb21tYW5kQnVpbGRlcgotICAgICAgICAgICAgICAgID0gbmV3IFN0cmluZ0J1aWxkZXIoZ2V0QW1TdGFydENtZChWSVJUVUFMX0RJU1BMQVlfQUNUSVZJVFkpKTsKLSAgICAgICAgY29tbWFuZEJ1aWxkZXIuYXBwZW5kKCIgLWYgMHgyMDAwMDAwMCIpOwotICAgICAgICBjb21tYW5kQnVpbGRlci5hcHBlbmQoIiAtLWVzIGNvbW1hbmQgY3JlYXRlX2Rpc3BsYXkiKTsKLSAgICAgICAgaWYgKGRlbnNpdHlEcGkgIT0gSU5WQUxJRF9ERU5TSVRZX0RQSSkgewotICAgICAgICAgICAgY29tbWFuZEJ1aWxkZXIuYXBwZW5kKCIgLS1laSBkZW5zaXR5X2RwaSAiKS5hcHBlbmQoZGVuc2l0eURwaSk7Ci0gICAgICAgIH0KLSAgICAgICAgY29tbWFuZEJ1aWxkZXIuYXBwZW5kKCIgLS1laSBjb3VudCAiKS5hcHBlbmQoZGlzcGxheUNvdW50KTsKLSAgICAgICAgY29tbWFuZEJ1aWxkZXIuYXBwZW5kKCIgLS1leiBjYW5fc2hvd193aXRoX2luc2VjdXJlX2tleWd1YXJkICIpCi0gICAgICAgICAgICAgICAgLmFwcGVuZChjYW5TaG93V2l0aEluc2VjdXJlS2V5Z3VhcmQpOwotICAgICAgICBjb21tYW5kQnVpbGRlci5hcHBlbmQoIiAtLWV6IHB1YmxpY19kaXNwbGF5ICIpLmFwcGVuZChwdWJsaWNEaXNwbGF5KTsKLSAgICAgICAgY29tbWFuZEJ1aWxkZXIuYXBwZW5kKCIgLS1leiByZXNpemVfZGlzcGxheSAiKS5hcHBlbmQocmVzaXplRGlzcGxheSk7Ci0gICAgICAgIGlmIChsYXVuY2hBY3Rpdml0eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb21tYW5kQnVpbGRlci5hcHBlbmQoIiAtLWVzIGxhdW5jaF90YXJnZXRfYWN0aXZpdHkgIikuYXBwZW5kKGxhdW5jaEFjdGl2aXR5KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29tbWFuZEJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RGVzdHJveVZpcnR1YWxEaXNwbGF5Q29tbWFuZCgpIHsKLSAgICAgICAgcmV0dXJuIGdldEFtU3RhcnRDbWQoVklSVFVBTF9ESVNQTEFZX0FDVElWSVRZKSArICIgLWYgMHgyMDAwMDAwMCIgKwotICAgICAgICAgICAgICAgICIgLS1lcyBjb21tYW5kIGRlc3Ryb3lfZGlzcGxheSI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFNpbXVsYXRlRGlzcGxheUNvbW1hbmQoaW50IGRlbnNpdHlEcGkpIHsKLSAgICAgICAgcmV0dXJuICJzZXR0aW5ncyBwdXQgZ2xvYmFsIG92ZXJsYXlfZGlzcGxheV9kZXZpY2VzIDEwMjR4NzY4LyIgKyBkZW5zaXR5RHBpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXREZXN0cm95U2ltdWxhdGVkRGlzcGxheUNvbW1hbmQoKSB7Ci0gICAgICAgIHJldHVybiAic2V0dGluZ3MgZGVsZXRlIGdsb2JhbCBvdmVybGF5X2Rpc3BsYXlfZGV2aWNlcyI7Ci0gICAgfQotCi0gICAgLyoqIFdhaXQgZm9yIHByb3ZpZGVkIG51bWJlciBvZiBkaXNwbGF5cyBhbmQgcmVwb3J0IHRoZWlyIGNvbmZpZ3VyYXRpb25zLiAqLwotICAgIFJlcG9ydGVkRGlzcGxheXMgZ2V0RGlzcGxheVN0YXRlQWZ0ZXJDaGFuZ2UoaW50IGV4cGVjdGVkRGlzcGxheUNvdW50KQotICAgICAgICAgICAgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFJlcG9ydGVkRGlzcGxheXMgZHMgPSBnZXREaXNwbGF5c1N0YXRlcygpOwotCi0gICAgICAgIGludCByZXRyaWVzTGVmdCA9IDU7Ci0gICAgICAgIHdoaWxlICghZHMuaXNWYWxpZFN0YXRlKGV4cGVjdGVkRGlzcGxheUNvdW50KSAmJiByZXRyaWVzTGVmdC0tID4gMCkgewotICAgICAgICAgICAgbG9nKCIqKipXYWl0aW5nIGZvciB0aGUgY29ycmVjdCBudW1iZXIgb2YgZGlzcGxheXMuLi4iKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOwotICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGxvZyhlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZHMgPSBnZXREaXNwbGF5c1N0YXRlcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGRzOwotICAgIH0KLQotICAgIC8qKiBDaGVja3MgaWYgdGhlIGRldmljZSBzdXBwb3J0cyBtdWx0aS1kaXNwbGF5LiAqLwotICAgIGJvb2xlYW4gc3VwcG9ydHNNdWx0aURpc3BsYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGhhc0RldmljZUZlYXR1cmUoImFuZHJvaWQuc29mdHdhcmUuYWN0aXZpdGllc19vbl9zZWNvbmRhcnlfZGlzcGxheXMiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9BY3Rpdml0eU1hbmFnZXJEaXNwbGF5VGVzdHMuamF2YSBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0FjdGl2aXR5TWFuYWdlckRpc3BsYXlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDRhNjk5Li4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0FjdGl2aXR5TWFuYWdlckRpc3BsYXlUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA3NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKLSAqLwotcGFja2FnZSBhbmRyb2lkLnNlcnZlci5jdHM7Ci0KLWltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUHJlc3VibWl0OwotaW1wb3J0IGFuZHJvaWQuc2VydmVyLmRpc3BsYXlzZXJ2aWNlLkRpc3BsYXlIZWxwZXI7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuQ29sbGVjdGluZ091dHB1dFJlY2VpdmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5EZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb247Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNkZFRlc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuY3RzLkFjdGl2aXR5QW5kV2luZG93TWFuYWdlcnNTdGF0ZS5ERUZBVUxUX0RJU1BMQVlfSUQ7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmN0cy5BY3Rpdml0eU1hbmFnZXJTdGF0ZS5TVEFURV9QQVVTRUQ7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmN0cy5BY3Rpdml0eU1hbmFnZXJTdGF0ZS5TVEFURV9SRVNVTUVEOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5jdHMuQWN0aXZpdHlNYW5hZ2VyU3RhdGUuU1RBVEVfU1RPUFBFRDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuY3RzLlN0YXRlTG9nZ2VyLmxvZzsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuY3RzLlN0YXRlTG9nZ2VyLmxvZ0U7Ci0KLS8qKgotICogQnVpbGQ6IG1tbWEgLWozMiBjdHMvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcwotICogUnVuOiBjdHMvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvdXRpbC9ydW4tdGVzdCBDdHNTZXJ2aWNlc0hvc3RUZXN0Q2FzZXMgYW5kcm9pZC5zZXJ2ZXIuY3RzLkFjdGl2aXR5TWFuYWdlckRpc3BsYXlUZXN0cwotICovCi1AQ2RkVGVzdChyZXF1aXJlbWVudD0iMy4yLjQvQy0xLTIiKQotcHVibGljIGNsYXNzIEFjdGl2aXR5TWFuYWdlckRpc3BsYXlUZXN0cyBleHRlbmRzIEFjdGl2aXR5TWFuYWdlckRpc3BsYXlUZXN0QmFzZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdNX1NJWkUgPSAid20gc2l6ZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdNX0RFTlNJVFkgPSAid20gZGVuc2l0eSI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9BQ1RJVklUWV9OQU1FID0gIlRlc3RBY3Rpdml0eSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZJUlRVQUxfRElTUExBWV9BQ1RJVklUWSA9ICJWaXJ0dWFsRGlzcGxheUFjdGl2aXR5IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTSVpFQUJMRV9BQ1RJVklUWV9OQU1FID0gIlJlc2l6ZWFibGVBY3Rpdml0eSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PTl9SRVNJWkVBQkxFX0FDVElWSVRZX05BTUUgPSAiTm9uUmVzaXplYWJsZUFjdGl2aXR5IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VDT05EX0FDVElWSVRZX05BTUUgPSAiU2Vjb25kQWN0aXZpdHkiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRUNPTkRfQUNUSVZJVFlfTk9fRU1CRURESU5HX05BTUUgPSAiU2Vjb25kQWN0aXZpdHlOb0VtYmVkZGluZyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRISVJEX0FDVElWSVRZX05BTUUgPSAiVGhpcmRBY3Rpdml0eSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZSX1RFU1RfQUNUSVZJVFlfTkFNRSA9ICJWclRlc3RBY3Rpdml0eSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1dfV0hFTl9MT0NLRURfQVRUUl9BQ1RJVklUWV9OQU1FID0gIlNob3dXaGVuTG9ja2VkQXR0ckFjdGl2aXR5IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VDT05EX1BBQ0tBR0VfTkFNRSA9ICJhbmRyb2lkLnNlcnZlci5jdHMuc2Vjb25kIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEhJUkRfUEFDS0FHRV9OQU1FID0gImFuZHJvaWQuc2VydmVyLmN0cy50aGlyZCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZSX1VOSVFVRV9ESVNQTEFZX0lEID0KLSAgICAgICAgICAgICJ2aXJ0dWFsOmFuZHJvaWQ6Mjc3ZjFhMDktYjg4ZC00ZDFlLTg3MTYtNzk2ZjExNGQwODBiIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVlJfU1RBTkRBTE9ORV9ERVZJQ0VfUFJPUEVSVFkgPSAicm8uYm9vdC52ciI7Ci0KLSAgICBwcml2YXRlIERpc3BsYXlIZWxwZXIgbUV4dGVybmFsRGlzcGxheUhlbHBlcjsKLQotICAgIC8qKiBQaHlzaWNhbCBkaXNwbGF5IG1ldHJpY3MgYW5kIG92ZXJyaWRlcyBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0ZXN0LiAqLwotICAgIHByaXZhdGUgUmVwb3J0ZWREaXNwbGF5TWV0cmljcyBtSW5pdGlhbERpc3BsYXlNZXRyaWNzOwotCi0gICAgLy8gU2V0IG9uIHN0YW5kYWxvbmUgVlIgZGV2aWNlcyB0byBpbmRpY2F0ZSB0aGF0IHRoZSBWUiB2aXJ0dWFsIGRpc3BsYXkgaXMgdGhlIGRpc3BsYXkgd2hlcmUgMmQKLSAgICAvLyBhY3Rpdml0aWVzIGFyZSBsYXVuY2hlZC4KLSAgICBwcml2YXRlIGJvb2xlYW4gbVZySGVhZHNldDsKLSAgICBwcml2YXRlIGludCBtVnJWaXJ0dWFsRGlzcGxheUlkOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgbUluaXRpYWxEaXNwbGF5TWV0cmljcyA9IGdldERpc3BsYXlNZXRyaWNzKCk7Ci0gICAgICAgIG1WckhlYWRzZXQgPSBpc1ZySGVhZHNldCgpOwotICAgICAgICBmaW5hbCBEaXNwbGF5U3RhdGUgdnJEaXNwbGF5ID0gZ2V0RGlzcGxheXNTdGF0ZXMoKS5nZXREaXNwbGF5U3RhdGUoVlJfVU5JUVVFX0RJU1BMQVlfSUQpOwotICAgICAgICBtVnJWaXJ0dWFsRGlzcGxheUlkID0gbVZySGVhZHNldCA/IHZyRGlzcGxheS5tRGlzcGxheUlkIDogLTE7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGVuYWJsZVBlcnNpc3RlbnRWck1vZGUoZmFsc2UpOwotICAgICAgICAgICAgcmVzdG9yZURpc3BsYXlNZXRyaWNzT3ZlcnJpZGVzKCk7Ci0gICAgICAgICAgICBpZiAobUV4dGVybmFsRGlzcGxheUhlbHBlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUV4dGVybmFsRGlzcGxheUhlbHBlci5yZWxlYXNlRGlzcGxheSgpOwotICAgICAgICAgICAgICAgIG1FeHRlcm5hbERpc3BsYXlIZWxwZXIgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0UHJpbWFyeURpc3BsYXlTdGF0ZSh0cnVlKTsKLSAgICAgICAgfSBjYXRjaCAoRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZ0UoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRW5hYmxlcyBvciBkaXNhYmxlcyBwZXJzaXN0ZW50IHZyIG1vZGUgYW5kIHRoZSB2ciB2aXJ0dWFsIGRpc3BsYXkuIEZvciBzdGFuZGFsb25lIHZyIGRldmljZXMsCi0gICAgICogY2FsbHMgdG8gZW5hYmxlUGVyc2lzdGVudFZyTW9kZSgpIGFyZSBpZ25vcmVkLCBiZWNhdXNlIHRoZSBkZXZpY2UgaXMgYWxyZWFkeSBpbiBwZXJzaXN0ZW50IHZyCi0gICAgICogbW9kZSB3aGVuZXZlciBpdCdzIG9uLCBhbmQgdHVybmluZyBvZmYgcGVyc2lzdGVudCB2ciBtb2RlIG9uIGEgc3RhbmRhbG9uZSB2ciBkZXZpY2UgcHV0cyB0aGUKLSAgICAgKiBkZXZpY2UgaW4gYSBiYWQgc3RhdGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGVuYWJsZVBlcnNpc3RlbnRWck1vZGUoYm9vbGVhbiBlbmFibGVkKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG1WckhlYWRzZXQpIHsgcmV0dXJuOyB9Ci0gICAgICAgIGlmIChlbmFibGVkKSB7Ci0gICAgICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKCJzZXRwcm9wIHZyX3ZpcnR1YWxkaXNwbGF5IHRydWUiKTsKLSAgICAgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoInZyIHNldC1wZXJzaXN0ZW50LXZyLW1vZGUtZW5hYmxlZCB0cnVlIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKCJ2ciBzZXQtcGVyc2lzdGVudC12ci1tb2RlLWVuYWJsZWQgZmFsc2UiKTsKLSAgICAgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoInNldHByb3AgdnJfdmlydHVhbGRpc3BsYXkgZmFsc2UiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1ZySGVhZHNldCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICgiMSIuZXF1YWxzKG1EZXZpY2UuZ2V0UHJvcGVydHkoVlJfU1RBTkRBTE9ORV9ERVZJQ0VfUFJPUEVSVFkpKSkgewotICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGNhdGNoIChEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlc3RvcmVEaXNwbGF5TWV0cmljc092ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAobUluaXRpYWxEaXNwbGF5TWV0cmljcy5zaXplT3ZlcnJpZGVTZXQpIHsKLSAgICAgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoV01fU0laRSArICIgIiArIG1Jbml0aWFsRGlzcGxheU1ldHJpY3Mub3ZlcnJpZGVXaWR0aCArICJ4IgotICAgICAgICAgICAgICAgICAgICArIG1Jbml0aWFsRGlzcGxheU1ldHJpY3Mub3ZlcnJpZGVIZWlnaHQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZCgid20gc2l6ZSByZXNldCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtSW5pdGlhbERpc3BsYXlNZXRyaWNzLmRlbnNpdHlPdmVycmlkZVNldCkgewotICAgICAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChXTV9ERU5TSVRZICsgIiAiICsgbUluaXRpYWxEaXNwbGF5TWV0cmljcy5vdmVycmlkZURlbnNpdHkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZCgid20gZGVuc2l0eSByZXNldCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhhdCB0aGUgZ2xvYmFsIGNvbmZpZ3VyYXRpb24gaXMgZXF1YWwgdG8gdGhlIGRlZmF1bHQgZGlzcGxheSdzIG92ZXJyaWRlIGNvbmZpZ3VyYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHREaXNwbGF5T3ZlcnJpZGVDb25maWd1cmF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFJlcG9ydGVkRGlzcGxheXMgcmVwb3J0ZWREaXNwbGF5cyA9IGdldERpc3BsYXlzU3RhdGVzKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIkdsb2JhbCBjb25maWd1cmF0aW9uIG11c3Qgbm90IGJlIGVtcHR5LiIsIHJlcG9ydGVkRGlzcGxheXMubUdsb2JhbENvbmZpZyk7Ci0gICAgICAgIGZpbmFsIERpc3BsYXlTdGF0ZSBwcmltYXJ5RGlzcGxheSA9IHJlcG9ydGVkRGlzcGxheXMuZ2V0RGlzcGxheVN0YXRlKERFRkFVTFRfRElTUExBWV9JRCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiUHJpbWFyeSBkaXNwbGF5J3MgY29uZmlndXJhdGlvbiBzaG91bGQgbm90IGJlIGVxdWFsIHRvIGdsb2JhbCBjb25maWd1cmF0aW9uLiIsCi0gICAgICAgICAgICAgICAgcmVwb3J0ZWREaXNwbGF5cy5tR2xvYmFsQ29uZmlnLCBwcmltYXJ5RGlzcGxheS5tT3ZlcnJpZGVDb25maWcpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoYXQgc2Vjb25kYXJ5IGRpc3BsYXkgaGFzIG92ZXJyaWRlIGNvbmZpZ3VyYXRpb24gc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVWaXJ0dWFsRGlzcGxheVdpdGhDdXN0b21Db25maWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gQ3JlYXRlIG5ldyB2aXJ0dWFsIGRpc3BsYXkuCi0gICAgICAgIGZpbmFsIERpc3BsYXlTdGF0ZSBuZXdEaXNwbGF5ID0gbmV3IFZpcnR1YWxEaXNwbGF5QnVpbGRlcih0aGlzKS5idWlsZCgpOwotCi0gICAgICAgIC8vIEZpbmQgdGhlIGRlbnNpdHkgb2YgY3JlYXRlZCBkaXNwbGF5LgotICAgICAgICBmaW5hbCBpbnQgbmV3RGVuc2l0eURwaSA9IG5ld0Rpc3BsYXkuZ2V0RHBpKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhDVVNUT01fREVOU0lUWV9EUEksIG5ld0RlbnNpdHlEcGkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoYXQgbGF1bmNoIG9uIHNlY29uZGFyeSBkaXNwbGF5IGlzIG5vdCBwZXJtaXR0ZWQgaWYgZGV2aWNlIGhhcyB0aGUgZmVhdHVyZSBkaXNhYmxlZC4KLSAgICAgKiBBY3Rpdml0aWVzIHJlcXVlc3RlZCB0byBiZSBsYXVuY2hlZCBvbiBhIHNlY29uZGFyeSBkaXNwbGF5IGluIHRoaXMgY2FzZSBzaG91bGQgbGFuZCBvbiB0aGUKLSAgICAgKiBkZWZhdWx0IGRpc3BsYXkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE11bHRpRGlzcGxheURpc2FibGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChzdXBwb3J0c011bHRpRGlzcGxheSgpKSB7Ci0gICAgICAgICAgICAvLyBPbmx5IGNoZWNrIGRldmljZXMgd2l0aCB0aGUgZmVhdHVyZSBkaXNhYmxlZC4KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENyZWF0ZSBuZXcgdmlydHVhbCBkaXNwbGF5LgotICAgICAgICBmaW5hbCBEaXNwbGF5U3RhdGUgbmV3RGlzcGxheSA9IG5ldyBWaXJ0dWFsRGlzcGxheUJ1aWxkZXIodGhpcykuYnVpbGQoKTsKLQotICAgICAgICAvLyBMYXVuY2ggYWN0aXZpdHkgb24gbmV3IHNlY29uZGFyeSBkaXNwbGF5LgotICAgICAgICBsYXVuY2hBY3Rpdml0eU9uRGlzcGxheShURVNUX0FDVElWSVRZX05BTUUsIG5ld0Rpc3BsYXkubURpc3BsYXlJZCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIG5ldyBTdHJpbmdbXSB7VEVTVF9BQ1RJVklUWV9OQU1FfSk7Ci0KLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkQWN0aXZpdHkoIkxhdW5jaGVkIGFjdGl2aXR5IG11c3QgYmUgZm9jdXNlZCIsIFRFU1RfQUNUSVZJVFlfTkFNRSk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgdGhhdCBhY3Rpdml0eSBpcyBvbiB0aGUgcmlnaHQgZGlzcGxheS4KLSAgICAgICAgZmluYWwgaW50IGZyb250U3RhY2tJZCA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEZyb250U3RhY2tJZChERUZBVUxUX0RJU1BMQVlfSUQpOwotICAgICAgICBmaW5hbCBBY3Rpdml0eU1hbmFnZXJTdGF0ZS5BY3Rpdml0eVN0YWNrIGZyb250U3RhY2sKLSAgICAgICAgICAgICAgICA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFN0YWNrQnlJZChmcm9udFN0YWNrSWQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkxhdW5jaGVkIGFjdGl2aXR5IG11c3QgYmUgcmVzdW1lZCIsCi0gICAgICAgICAgICAgICAgZ2V0QWN0aXZpdHlDb21wb25lbnROYW1lKFRFU1RfQUNUSVZJVFlfTkFNRSksIGZyb250U3RhY2subVJlc3VtZWRBY3Rpdml0eSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRnJvbnQgc3RhY2sgbXVzdCBiZSBvbiB0aGUgZGVmYXVsdCBkaXNwbGF5IiwgREVGQVVMVF9ESVNQTEFZX0lELAotICAgICAgICAgICAgICAgIGZyb250U3RhY2subURpc3BsYXlJZCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZFN0YWNrKCJGb2N1cyBtdXN0IGJlIG9uIHRoZSBkZWZhdWx0IGRpc3BsYXkiLCBmcm9udFN0YWNrSWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoYXQgYW55IG5ldyBhY3Rpdml0eSBsYXVuY2ggaW4gVnIgbW9kZSBpcyBpbiBWciBkaXNwbGF5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RWckFjdGl2aXR5TGF1bmNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghc3VwcG9ydHNWck1vZGUoKSB8fCAhc3VwcG9ydHNNdWx0aURpc3BsYXkoKSkgewotICAgICAgICAgICAgLy8gVlIgTW9kZSBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgZGV2aWNlLCBiYWlsIGZyb20gdGhpcyB0ZXN0LgotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUHV0IHRoZSBkZXZpY2UgaW4gcGVyc2lzdGVudCB2ciBtb2RlLgotICAgICAgICBlbmFibGVQZXJzaXN0ZW50VnJNb2RlKHRydWUpOwotCi0gICAgICAgIC8vIExhdW5jaCB0aGUgVlIgYWN0aXZpdHkuCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5KFZSX1RFU1RfQUNUSVZJVFlfTkFNRSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIG5ldyBTdHJpbmdbXSB7VlJfVEVTVF9BQ1RJVklUWV9OQU1FfSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShWUl9URVNUX0FDVElWSVRZX05BTUUsIHRydWUgLyogdmlzaWJsZSAqLyk7Ci0KLSAgICAgICAgLy8gTGF1bmNoIHRoZSBub24tVlIgMkQgYWN0aXZpdHkgYW5kIGNoZWNrIHdoZXJlIGl0IGVuZHMgdXAuCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5KExBVU5DSElOR19BQ1RJVklUWSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIG5ldyBTdHJpbmdbXSB7TEFVTkNISU5HX0FDVElWSVRZfSk7Ci0KLSAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlIHN1YnNlcXVlbnQgYWN0aXZpdHkgaXMgdmlzaWJsZQotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoTEFVTkNISU5HX0FDVElWSVRZLCB0cnVlIC8qIHZpc2libGUgKi8pOwotCi0gICAgICAgIC8vIENoZWNrIHRoYXQgYWN0aXZpdHkgaXMgbGF1bmNoZWQgaW4gZm9jdXNlZCBzdGFjayBvbiBwcmltYXJ5IGRpc3BsYXkuCi0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZEFjdGl2aXR5KCJMYXVuY2hlZCBhY3Rpdml0eSBtdXN0IGJlIGZvY3VzZWQiLCBMQVVOQ0hJTkdfQUNUSVZJVFkpOwotICAgICAgICBmaW5hbCBpbnQgZm9jdXNlZFN0YWNrSWQgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRGb2N1c2VkU3RhY2tJZCgpOwotICAgICAgICBmaW5hbCBBY3Rpdml0eU1hbmFnZXJTdGF0ZS5BY3Rpdml0eVN0YWNrIGZvY3VzZWRTdGFjawotICAgICAgICAgICAgICAgID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0U3RhY2tCeUlkKGZvY3VzZWRTdGFja0lkKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJMYXVuY2hlZCBhY3Rpdml0eSBtdXN0IGJlIHJlc3VtZWQgaW4gZm9jdXNlZCBzdGFjayIsCi0gICAgICAgICAgICBnZXRBY3Rpdml0eUNvbXBvbmVudE5hbWUoTEFVTkNISU5HX0FDVElWSVRZKSwgZm9jdXNlZFN0YWNrLm1SZXN1bWVkQWN0aXZpdHkpOwotCi0gICAgICAgIC8vIENoZWNrIGlmIHRoZSBsYXVuY2ggYWN0aXZpdHkgaXMgaW4gVnIgdmlydHVhbCBkaXNwbGF5IGlkLgotICAgICAgICBmaW5hbCBSZXBvcnRlZERpc3BsYXlzIHJlcG9ydGVkRGlzcGxheXMgPSBnZXREaXNwbGF5c1N0YXRlcygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJHbG9iYWwgY29uZmlndXJhdGlvbiBtdXN0IG5vdCBiZSBlbXB0eS4iLCByZXBvcnRlZERpc3BsYXlzLm1HbG9iYWxDb25maWcpOwotICAgICAgICBmaW5hbCBEaXNwbGF5U3RhdGUgdnJEaXNwbGF5ID0gcmVwb3J0ZWREaXNwbGF5cy5nZXREaXNwbGF5U3RhdGUoVlJfVU5JUVVFX0RJU1BMQVlfSUQpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJWciBtb2RlIHNob3VsZCBoYXZlIGEgdmlydHVhbCBkaXNwbGF5IiwgdnJEaXNwbGF5KTsKLQotICAgICAgICAvLyBDaGVjayBpZiB0aGUgZm9jdXNlZCBhY3Rpdml0eSBpcyBvbiB0aGlzIHZpcnR1YWwgc3RhY2suCi0gICAgICAgIGFzc2VydEVxdWFscygiTGF1bmNoIGluIFZyIG1vZGUgc2hvdWxkIGJlIGluIHZpcnR1YWwgc3RhY2siLCB2ckRpc3BsYXkubURpc3BsYXlJZCwKLSAgICAgICAgICAgIGZvY3VzZWRTdGFjay5tRGlzcGxheUlkKTsKLQotICAgICAgICAvLyBQdXQgdGhlIGRldmljZSBvdXQgb2YgcGVyc2lzdGVudCB2ciBtb2RlLgotICAgICAgICBlbmFibGVQZXJzaXN0ZW50VnJNb2RlKGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGF0IGFueSBhY3Rpdml0eSBhbHJlYWR5IHByZXNlbnQgaXMgcmUtbGF1bmNoZWQgaW4gVnIgZGlzcGxheSBpbiB2ciBtb2RlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RWckFjdGl2aXR5UmVMYXVuY2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0c1ZyTW9kZSgpIHx8ICFzdXBwb3J0c011bHRpRGlzcGxheSgpKSB7Ci0gICAgICAgICAgICAvLyBWUiBNb2RlIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBkZXZpY2UsIGJhaWwgZnJvbSB0aGlzIHRlc3QuCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBMYXVuY2ggYSAyRCBhY3Rpdml0eS4KLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoTEFVTkNISU5HX0FDVElWSVRZKTsKLQotICAgICAgICAvLyBQdXQgdGhlIGRldmljZSBpbiBwZXJzaXN0ZW50IHZyIG1vZGUuCi0gICAgICAgIGVuYWJsZVBlcnNpc3RlbnRWck1vZGUodHJ1ZSk7Ci0KLSAgICAgICAgLy8gTGF1bmNoIHRoZSBWUiBhY3Rpdml0eS4KLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoVlJfVEVTVF9BQ1RJVklUWV9OQU1FKTsKLSAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwgbmV3IFN0cmluZ1tdIHtWUl9URVNUX0FDVElWSVRZX05BTUV9KTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFZSX1RFU1RfQUNUSVZJVFlfTkFNRSwgdHJ1ZSAvKiB2aXNpYmxlICovKTsKLQotICAgICAgICAvLyBSZS1sYXVuY2ggdGhlIG5vbi1WUiAyRCBhY3Rpdml0eSBhbmQgY2hlY2sgd2hlcmUgaXQgZW5kcyB1cC4KLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoTEFVTkNISU5HX0FDVElWSVRZKTsKLSAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwgbmV3IFN0cmluZ1tdIHtMQVVOQ0hJTkdfQUNUSVZJVFl9KTsKLQotICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgc3Vic2VxdWVudCBhY3Rpdml0eSBpcyB2aXNpYmxlCi0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShMQVVOQ0hJTkdfQUNUSVZJVFksIHRydWUgLyogdmlzaWJsZSAqLyk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgdGhhdCBhY3Rpdml0eSBpcyBsYXVuY2hlZCBpbiBmb2N1c2VkIHN0YWNrIG9uIHByaW1hcnkgZGlzcGxheS4KLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkQWN0aXZpdHkoIkxhdW5jaGVkIGFjdGl2aXR5IG11c3QgYmUgZm9jdXNlZCIsIExBVU5DSElOR19BQ1RJVklUWSk7Ci0gICAgICAgIGZpbmFsIGludCBmb2N1c2VkU3RhY2tJZCA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEZvY3VzZWRTdGFja0lkKCk7Ci0gICAgICAgIGZpbmFsIEFjdGl2aXR5TWFuYWdlclN0YXRlLkFjdGl2aXR5U3RhY2sgZm9jdXNlZFN0YWNrCi0gICAgICAgICAgICAgICAgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja0J5SWQoZm9jdXNlZFN0YWNrSWQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkxhdW5jaGVkIGFjdGl2aXR5IG11c3QgYmUgcmVzdW1lZCBpbiBmb2N1c2VkIHN0YWNrIiwKLSAgICAgICAgICAgIGdldEFjdGl2aXR5Q29tcG9uZW50TmFtZShMQVVOQ0hJTkdfQUNUSVZJVFkpLCBmb2N1c2VkU3RhY2subVJlc3VtZWRBY3Rpdml0eSk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGxhdW5jaCBhY3Rpdml0eSBpcyBpbiBWciB2aXJ0dWFsIGRpc3BsYXkgaWQuCi0gICAgICAgIGZpbmFsIFJlcG9ydGVkRGlzcGxheXMgcmVwb3J0ZWREaXNwbGF5cyA9IGdldERpc3BsYXlzU3RhdGVzKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIkdsb2JhbCBjb25maWd1cmF0aW9uIG11c3Qgbm90IGJlIGVtcHR5LiIsIHJlcG9ydGVkRGlzcGxheXMubUdsb2JhbENvbmZpZyk7Ci0gICAgICAgIGZpbmFsIERpc3BsYXlTdGF0ZSB2ckRpc3BsYXkgPSByZXBvcnRlZERpc3BsYXlzLmdldERpc3BsYXlTdGF0ZShWUl9VTklRVUVfRElTUExBWV9JRCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIlZyIG1vZGUgc2hvdWxkIGhhdmUgYSB2aXJ0dWFsIGRpc3BsYXkiLCB2ckRpc3BsYXkpOwotCi0gICAgICAgIC8vIENoZWNrIGlmIHRoZSBmb2N1c2VkIGFjdGl2aXR5IGlzIG9uIHRoaXMgdmlydHVhbCBzdGFjay4KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJMYXVuY2ggaW4gVnIgbW9kZSBzaG91bGQgYmUgaW4gdmlydHVhbCBzdGFjayIsIHZyRGlzcGxheS5tRGlzcGxheUlkLAotICAgICAgICAgICAgZm9jdXNlZFN0YWNrLm1EaXNwbGF5SWQpOwotCi0gICAgICAgIC8vIFB1dCB0aGUgZGV2aWNlIG91dCBvZiBwZXJzaXN0ZW50IHZyIG1vZGUuCi0gICAgICAgIGVuYWJsZVBlcnNpc3RlbnRWck1vZGUoZmFsc2UpOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGdldEN1cnJlbnREZWZhdWx0RGlzcGxheUlkKCkgewotICAgICAgICByZXR1cm4gbVZySGVhZHNldCA/IG1WclZpcnR1YWxEaXNwbGF5SWQgOiBERUZBVUxUX0RJU1BMQVlfSUQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhhdCBhbnkgbmV3IGFjdGl2aXR5IGxhdW5jaCBwb3N0IFZyIG1vZGUgaXMgaW4gdGhlIG1haW4gZGlzcGxheS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWN0aXZpdHlMYXVuY2hQb3N0VnIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0c1ZyTW9kZSgpIHx8ICFzdXBwb3J0c011bHRpRGlzcGxheSgpKSB7Ci0gICAgICAgICAgICAvLyBWUiBNb2RlIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBkZXZpY2UsIGJhaWwgZnJvbSB0aGlzIHRlc3QuCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVZySGVhZHNldCkgewotICAgICAgICAgICAgLy8gVGhpcyB0ZXN0IGRvZXNuJ3QgYXBwbHkgdG8gYSBzdGFuZGFsb25lIHZyIGRldmljZSwgc2luY2UgdnIgaXMgYWx3YXlzIGVuYWJsZWQsIGFuZAotICAgICAgICAgICAgLy8gdGhlcmUgaXMgbm8gInBvc3QgdnIiIGJlaGF2aW9yIHRvIHZlcmlmeS4KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFB1dCB0aGUgZGV2aWNlIGluIHBlcnNpc3RlbnQgdnIgbW9kZS4KLSAgICAgICAgZW5hYmxlUGVyc2lzdGVudFZyTW9kZSh0cnVlKTsKLQotICAgICAgICAvLyBMYXVuY2ggdGhlIFZSIGFjdGl2aXR5LgotICAgICAgICBsYXVuY2hBY3Rpdml0eShWUl9URVNUX0FDVElWSVRZX05BTUUpOwotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCBuZXcgU3RyaW5nW10ge1ZSX1RFU1RfQUNUSVZJVFlfTkFNRX0pOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoVlJfVEVTVF9BQ1RJVklUWV9OQU1FLCB0cnVlIC8qIHZpc2libGUgKi8pOwotCi0gICAgICAgIC8vIExhdW5jaCB0aGUgbm9uLVZSIDJEIGFjdGl2aXR5IGFuZCBjaGVjayB3aGVyZSBpdCBlbmRzIHVwLgotICAgICAgICBsYXVuY2hBY3Rpdml0eShBTFRfTEFVTkNISU5HX0FDVElWSVRZKTsKLSAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwgbmV3IFN0cmluZ1tdIHtBTFRfTEFVTkNISU5HX0FDVElWSVRZfSk7Ci0KLSAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlIHN1YnNlcXVlbnQgYWN0aXZpdHkgaXMgdmlzaWJsZQotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoQUxUX0xBVU5DSElOR19BQ1RJVklUWSwgdHJ1ZSAvKiB2aXNpYmxlICovKTsKLQotICAgICAgICAvLyBDaGVjayB0aGF0IGFjdGl2aXR5IGlzIGxhdW5jaGVkIGluIGZvY3VzZWQgc3RhY2sgb24gcHJpbWFyeSBkaXNwbGF5LgotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRBY3Rpdml0eSgiTGF1bmNoZWQgYWN0aXZpdHkgbXVzdCBiZSBmb2N1c2VkIiwgQUxUX0xBVU5DSElOR19BQ1RJVklUWSk7Ci0gICAgICAgIGZpbmFsIGludCBmb2N1c2VkU3RhY2tJZCA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEZvY3VzZWRTdGFja0lkKCk7Ci0gICAgICAgIGZpbmFsIEFjdGl2aXR5TWFuYWdlclN0YXRlLkFjdGl2aXR5U3RhY2sgZm9jdXNlZFN0YWNrCi0gICAgICAgICAgICAgICAgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja0J5SWQoZm9jdXNlZFN0YWNrSWQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkxhdW5jaGVkIGFjdGl2aXR5IG11c3QgYmUgcmVzdW1lZCBpbiBmb2N1c2VkIHN0YWNrIiwKLSAgICAgICAgICAgIGdldEFjdGl2aXR5Q29tcG9uZW50TmFtZShBTFRfTEFVTkNISU5HX0FDVElWSVRZKSwgZm9jdXNlZFN0YWNrLm1SZXN1bWVkQWN0aXZpdHkpOwotCi0gICAgICAgIC8vIENoZWNrIGlmIHRoZSBsYXVuY2ggYWN0aXZpdHkgaXMgaW4gVnIgdmlydHVhbCBkaXNwbGF5IGlkLgotICAgICAgICBmaW5hbCBSZXBvcnRlZERpc3BsYXlzIHJlcG9ydGVkRGlzcGxheXMgPSBnZXREaXNwbGF5c1N0YXRlcygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJHbG9iYWwgY29uZmlndXJhdGlvbiBtdXN0IG5vdCBiZSBlbXB0eS4iLCByZXBvcnRlZERpc3BsYXlzLm1HbG9iYWxDb25maWcpOwotICAgICAgICBmaW5hbCBEaXNwbGF5U3RhdGUgdnJEaXNwbGF5ID0gcmVwb3J0ZWREaXNwbGF5cy5nZXREaXNwbGF5U3RhdGUoVlJfVU5JUVVFX0RJU1BMQVlfSUQpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJWciBtb2RlIHNob3VsZCBoYXZlIGEgdmlydHVhbCBkaXNwbGF5IiwgdnJEaXNwbGF5KTsKLQotICAgICAgICAvLyBDaGVjayBpZiB0aGUgZm9jdXNlZCBhY3Rpdml0eSBpcyBvbiB0aGlzIHZpcnR1YWwgc3RhY2suCi0gICAgICAgIGFzc2VydEVxdWFscygiTGF1bmNoIGluIFZyIG1vZGUgc2hvdWxkIGJlIGluIHZpcnR1YWwgc3RhY2siLCB2ckRpc3BsYXkubURpc3BsYXlJZCwKLSAgICAgICAgICAgIGZvY3VzZWRTdGFjay5tRGlzcGxheUlkKTsKLQotICAgICAgICAvLyBQdXQgdGhlIGRldmljZSBvdXQgb2YgcGVyc2lzdGVudCB2ciBtb2RlLgotICAgICAgICBlbmFibGVQZXJzaXN0ZW50VnJNb2RlKGZhbHNlKTsKLQotICAgICAgICAvLyBUaGVyZSBpc24ndCBhIGRpcmVjdCBsYXVuY2ggb2YgYWN0aXZpdHkgd2hpY2ggY2FuIHRha2UgYW4gdXNlciBvdXQgb2YgcGVyc2lzdGVudCBWUiBtb2RlLgotICAgICAgICAvLyBUaGlzIHNsZWVwIGlzIHRvIGFjY291bnQgZm9yIHRoYXQgZGVsYXkgYW5kIGxldCBkZXZpY2Ugc2V0dGxlIG9uY2UgaXQgY29tZXMgb3V0IG9mIFZSCi0gICAgICAgIC8vIG1vZGUuCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMjAwMCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTGF1bmNoIHRoZSBub24tVlIgMkQgYWN0aXZpdHkgYW5kIGNoZWNrIHdoZXJlIGl0IGVuZHMgdXAuCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5KFJFU0laRUFCTEVfQUNUSVZJVFlfTkFNRSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIG5ldyBTdHJpbmdbXSB7UkVTSVpFQUJMRV9BQ1RJVklUWV9OQU1FfSk7Ci0KLSAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlIHN1YnNlcXVlbnQgYWN0aXZpdHkgaXMgdmlzaWJsZQotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoUkVTSVpFQUJMRV9BQ1RJVklUWV9OQU1FLCB0cnVlIC8qIHZpc2libGUgKi8pOwotCi0gICAgICAgIC8vIENoZWNrIHRoYXQgYWN0aXZpdHkgaXMgbGF1bmNoZWQgaW4gZm9jdXNlZCBzdGFjayBvbiB0aGUgY29ycmVjdCBkaXNwbGF5LgotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRBY3Rpdml0eSgiTGF1bmNoZWQgYWN0aXZpdHkgbXVzdCBiZSBmb2N1c2VkIiwKLSAgICAgICAgICAgICAgICBSRVNJWkVBQkxFX0FDVElWSVRZX05BTUUpOwotICAgICAgICAvLyBUaGUgZGVmYXVsdCBkaXNwbGF5IGlkIGZvciBhIDJkIGFjdGl2aXR5IGxhdW5jaCBpcyB2ciB2aXJ0dWFsIGRpc3BsYXkgZm9yIGEgdnIgaGVhZHNldC4KLSAgICAgICAgaW50IGRpc3BsYXlJZCA9IGdldEN1cnJlbnREZWZhdWx0RGlzcGxheUlkKCk7Ci0gICAgICAgIGZpbmFsIGludCBmcm9udFN0YWNrSWQgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRGcm9udFN0YWNrSWQoZGlzcGxheUlkKTsKLSAgICAgICAgZmluYWwgQWN0aXZpdHlNYW5hZ2VyU3RhdGUuQWN0aXZpdHlTdGFjayBmcm9udFN0YWNrCi0gICAgICAgICAgICAgICAgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja0J5SWQoZnJvbnRTdGFja0lkKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJMYXVuY2hlZCBhY3Rpdml0eSBtdXN0IGJlIHJlc3VtZWQgaW4gZnJvbnQgc3RhY2siLAotICAgICAgICAgICAgICAgIGdldEFjdGl2aXR5Q29tcG9uZW50TmFtZShSRVNJWkVBQkxFX0FDVElWSVRZX05BTUUpLCBmcm9udFN0YWNrLm1SZXN1bWVkQWN0aXZpdHkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkZyb250IHN0YWNrIG11c3QgYmUgb24gdGhlIGNvcnJlY3QgZGlzcGxheSIsCi0gICAgICAgICAgICAgICAgZGlzcGxheUlkLCBmcm9udFN0YWNrLm1EaXNwbGF5SWQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVNdWx0aXBsZVZpcnR1YWxEaXNwbGF5cygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBDcmVhdGUgbmV3IHZpcnR1YWwgZGlzcGxheS4KLSAgICAgICAgZmluYWwgTGlzdDxEaXNwbGF5U3RhdGU+IG5ld0Rpc3BsYXlzID0gbmV3IFZpcnR1YWxEaXNwbGF5QnVpbGRlcih0aGlzKS5idWlsZCgzKTsKLSAgICAgICAgZGVzdHJveVZpcnR1YWxEaXNwbGF5cygpOwotICAgICAgICBnZXREaXNwbGF5U3RhdGVBZnRlckNoYW5nZSgxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyBsYXVuY2hpbmcgYW4gYWN0aXZpdHkgb24gdmlydHVhbCBkaXNwbGF5LgotICAgICAqLwotICAgIEBQcmVzdWJtaXQKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TGF1bmNoQWN0aXZpdHlPblNlY29uZGFyeURpc3BsYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0c011bHRpRGlzcGxheSgpKSB7IHJldHVybjsgfQotCi0gICAgICAgIC8vIENyZWF0ZSBuZXcgdmlydHVhbCBkaXNwbGF5LgotICAgICAgICBmaW5hbCBEaXNwbGF5U3RhdGUgbmV3RGlzcGxheSA9IG5ldyBWaXJ0dWFsRGlzcGxheUJ1aWxkZXIodGhpcykuYnVpbGQoKTsKLQotICAgICAgICAvLyBMYXVuY2ggYWN0aXZpdHkgb24gbmV3IHNlY29uZGFyeSBkaXNwbGF5LgotICAgICAgICBmaW5hbCBTdHJpbmcgbG9nU2VwYXJhdG9yID0gY2xlYXJMb2djYXQoKTsKLSAgICAgICAgbGF1bmNoQWN0aXZpdHlPbkRpc3BsYXkoVEVTVF9BQ1RJVklUWV9OQU1FLCBuZXdEaXNwbGF5Lm1EaXNwbGF5SWQpOwotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCBuZXcgU3RyaW5nW10ge1RFU1RfQUNUSVZJVFlfTkFNRX0pOwotCi0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZEFjdGl2aXR5KCJBY3Rpdml0eSBsYXVuY2hlZCBvbiBzZWNvbmRhcnkgZGlzcGxheSBtdXN0IGJlIGZvY3VzZWQiLAotICAgICAgICAgICAgICAgIFRFU1RfQUNUSVZJVFlfTkFNRSk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgdGhhdCBhY3Rpdml0eSBpcyBvbiB0aGUgcmlnaHQgZGlzcGxheS4KLSAgICAgICAgZmluYWwgaW50IGZyb250U3RhY2tJZCA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEZyb250U3RhY2tJZChuZXdEaXNwbGF5Lm1EaXNwbGF5SWQpOwotICAgICAgICBmaW5hbCBBY3Rpdml0eU1hbmFnZXJTdGF0ZS5BY3Rpdml0eVN0YWNrIGZyb250U3RhY2sKLSAgICAgICAgICAgICAgICA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFN0YWNrQnlJZChmcm9udFN0YWNrSWQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkxhdW5jaGVkIGFjdGl2aXR5IG11c3QgYmUgb24gdGhlIHNlY29uZGFyeSBkaXNwbGF5IGFuZCByZXN1bWVkIiwKLSAgICAgICAgICAgICAgICBnZXRBY3Rpdml0eUNvbXBvbmVudE5hbWUoVEVTVF9BQ1RJVklUWV9OQU1FKSwgZnJvbnRTdGFjay5tUmVzdW1lZEFjdGl2aXR5KTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkU3RhY2soIkZvY3VzIG11c3QgYmUgb24gc2Vjb25kYXJ5IGRpc3BsYXkiLCBmcm9udFN0YWNrSWQpOwotCi0gICAgICAgIC8vIENoZWNrIHRoYXQgYWN0aXZpdHkgY29uZmlnIGNvcnJlc3BvbmRzIHRvIGRpc3BsYXkgY29uZmlnLgotICAgICAgICBmaW5hbCBSZXBvcnRlZFNpemVzIHJlcG9ydGVkU2l6ZXMgPSBnZXRMYXN0UmVwb3J0ZWRTaXplc0ZvckFjdGl2aXR5KFRFU1RfQUNUSVZJVFlfTkFNRSwKLSAgICAgICAgICAgICAgICBsb2dTZXBhcmF0b3IpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkFjdGl2aXR5IGxhdW5jaGVkIG9uIHNlY29uZGFyeSBkaXNwbGF5IG11c3QgaGF2ZSBwcm9wZXIgY29uZmlndXJhdGlvbiIsCi0gICAgICAgICAgICAgICAgQ1VTVE9NX0RFTlNJVFlfRFBJLCByZXBvcnRlZFNpemVzLmRlbnNpdHlEcGkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIGxhdW5jaGluZyBhIG5vbi1yZXNpemVhYmxlIGFjdGl2aXR5IG9uIHZpcnR1YWwgZGlzcGxheS4gSXQgc2hvdWxkIGxhbmQgb24gdGhlCi0gICAgICogZGVmYXVsdCBkaXNwbGF5LgotICAgICAqLwotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSIzLjIuNC9DLTItMSIpCi0gICAgcHVibGljIHZvaWQgdGVzdExhdW5jaE5vblJlc2l6ZWFibGVBY3Rpdml0eU9uU2Vjb25kYXJ5RGlzcGxheSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIXN1cHBvcnRzTXVsdGlEaXNwbGF5KCkpIHsgcmV0dXJuOyB9Ci0KLSAgICAgICAgLy8gQ3JlYXRlIG5ldyB2aXJ0dWFsIGRpc3BsYXkuCi0gICAgICAgIGZpbmFsIERpc3BsYXlTdGF0ZSBuZXdEaXNwbGF5ID0gbmV3IFZpcnR1YWxEaXNwbGF5QnVpbGRlcih0aGlzKS5idWlsZCgpOwotCi0gICAgICAgIC8vIExhdW5jaCBhY3Rpdml0eSBvbiBuZXcgc2Vjb25kYXJ5IGRpc3BsYXkuCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5T25EaXNwbGF5KE5PTl9SRVNJWkVBQkxFX0FDVElWSVRZX05BTUUsIG5ld0Rpc3BsYXkubURpc3BsYXlJZCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIG5ldyBTdHJpbmdbXSB7Tk9OX1JFU0laRUFCTEVfQUNUSVZJVFlfTkFNRX0pOwotCi0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZEFjdGl2aXR5KCJBY3Rpdml0eSBsYXVuY2hlZCBvbiBzZWNvbmRhcnkgZGlzcGxheSBtdXN0IGJlIGZvY3VzZWQiLAotICAgICAgICAgICAgICAgIE5PTl9SRVNJWkVBQkxFX0FDVElWSVRZX05BTUUpOwotCi0gICAgICAgIC8vIENoZWNrIHRoYXQgYWN0aXZpdHkgaXMgb24gdGhlIHJpZ2h0IGRpc3BsYXkuCi0gICAgICAgIGZpbmFsIGludCBmcm9udFN0YWNrSWQgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRGcm9udFN0YWNrSWQoREVGQVVMVF9ESVNQTEFZX0lEKTsKLSAgICAgICAgZmluYWwgQWN0aXZpdHlNYW5hZ2VyU3RhdGUuQWN0aXZpdHlTdGFjayBmcm9udFN0YWNrID0KLSAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja0J5SWQoZnJvbnRTdGFja0lkKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJMYXVuY2hlZCBhY3Rpdml0eSBtdXN0IGJlIG9uIHRoZSBwcmltYXJ5IGRpc3BsYXkgYW5kIHJlc3VtZWQiLAotICAgICAgICAgICAgICAgIGdldEFjdGl2aXR5Q29tcG9uZW50TmFtZShOT05fUkVTSVpFQUJMRV9BQ1RJVklUWV9OQU1FKSwKLSAgICAgICAgICAgICAgICBmcm9udFN0YWNrLm1SZXN1bWVkQWN0aXZpdHkpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRTdGFjaygiRm9jdXMgbXVzdCBiZSBvbiB0aGUgcHJpbWFyeSBkaXNwbGF5IiwgZnJvbnRTdGFja0lkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyBsYXVuY2hpbmcgYSBub24tcmVzaXplYWJsZSBhY3Rpdml0eSBvbiB2aXJ0dWFsIGRpc3BsYXkgd2hpbGUgc3BsaXQtc2NyZWVuIGlzIGFjdGl2ZQotICAgICAqIG9uIHRoZSBwcmltYXJ5IGRpc3BsYXkuIEl0IHNob3VsZCBsYW5kIG9uIHRoZSBwcmltYXJ5IGRpc3BsYXkgYW5kIGRpc21pc3MgZG9ja2VkIHN0YWNrLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RMYXVuY2hOb25SZXNpemVhYmxlQWN0aXZpdHlXaXRoU3BsaXRTY3JlZW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0c011bHRpRGlzcGxheSgpIHx8ICFzdXBwb3J0c1NwbGl0U2NyZWVuTXVsdGlXaW5kb3coKSkgeyByZXR1cm47IH0KLQotICAgICAgICAvLyBTdGFydCBsYXVuY2hpbmcgYWN0aXZpdHkuCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5SW5Eb2NrU3RhY2soTEFVTkNISU5HX0FDVElWSVRZKTsKLSAgICAgICAgLy8gQ3JlYXRlIG5ldyB2aXJ0dWFsIGRpc3BsYXkuCi0gICAgICAgIGZpbmFsIERpc3BsYXlTdGF0ZSBuZXdEaXNwbGF5ID0KLSAgICAgICAgICAgICAgICBuZXcgVmlydHVhbERpc3BsYXlCdWlsZGVyKHRoaXMpLnNldExhdW5jaEluU3BsaXRTY3JlZW4odHJ1ZSkuYnVpbGQoKTsKLQotICAgICAgICAvLyBMYXVuY2ggYWN0aXZpdHkgb24gbmV3IHNlY29uZGFyeSBkaXNwbGF5LgotICAgICAgICBsYXVuY2hBY3Rpdml0eU9uRGlzcGxheShOT05fUkVTSVpFQUJMRV9BQ1RJVklUWV9OQU1FLCBuZXdEaXNwbGF5Lm1EaXNwbGF5SWQpOwotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCBuZXcgU3RyaW5nW10ge05PTl9SRVNJWkVBQkxFX0FDVElWSVRZX05BTUV9KTsKLQotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRBY3Rpdml0eSgiQWN0aXZpdHkgbGF1bmNoZWQgb24gc2Vjb25kYXJ5IGRpc3BsYXkgbXVzdCBiZSBmb2N1c2VkIiwKLSAgICAgICAgICAgICAgICBOT05fUkVTSVpFQUJMRV9BQ1RJVklUWV9OQU1FKTsKLQotICAgICAgICAvLyBDaGVjayB0aGF0IGFjdGl2aXR5IGlzIG9uIHRoZSByaWdodCBkaXNwbGF5LgotICAgICAgICBmaW5hbCBpbnQgZnJvbnRTdGFja0lkID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0RnJvbnRTdGFja0lkKERFRkFVTFRfRElTUExBWV9JRCk7Ci0gICAgICAgIGZpbmFsIEFjdGl2aXR5TWFuYWdlclN0YXRlLkFjdGl2aXR5U3RhY2sgZnJvbnRTdGFjayA9Ci0gICAgICAgICAgICAgICAgbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0U3RhY2tCeUlkKGZyb250U3RhY2tJZCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiTGF1bmNoZWQgYWN0aXZpdHkgbXVzdCBiZSBvbiB0aGUgcHJpbWFyeSBkaXNwbGF5IGFuZCByZXN1bWVkIiwKLSAgICAgICAgICAgICAgICBnZXRBY3Rpdml0eUNvbXBvbmVudE5hbWUoTk9OX1JFU0laRUFCTEVfQUNUSVZJVFlfTkFNRSksCi0gICAgICAgICAgICAgICAgZnJvbnRTdGFjay5tUmVzdW1lZEFjdGl2aXR5KTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkU3RhY2soIkZvY3VzIG11c3QgYmUgb24gdGhlIHByaW1hcnkgZGlzcGxheSIsIGZyb250U3RhY2tJZCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0RG9lc05vdENvbnRhaW5TdGFjaygiTXVzdCBub3QgY29udGFpbiBkb2NrZWQgc3RhY2suIiwgRE9DS0VEX1NUQUNLX0lEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyBtb3ZpbmcgYSBub24tcmVzaXplYWJsZSBhY3Rpdml0eSB0byBhIHZpcnR1YWwgZGlzcGxheS4gSXQgc2hvdWxkIGxhbmQgb24gdGhlIGRlZmF1bHQKLSAgICAgKiBkaXNwbGF5LgotICAgICAqLwotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSIzLjIuNC9DLTItMSIpCi0gICAgcHVibGljIHZvaWQgdGVzdE1vdmVOb25SZXNpemVhYmxlQWN0aXZpdHlUb1NlY29uZGFyeURpc3BsYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0c011bHRpRGlzcGxheSgpKSB7IHJldHVybjsgfQotCi0gICAgICAgIC8vIENyZWF0ZSBuZXcgdmlydHVhbCBkaXNwbGF5LgotICAgICAgICBmaW5hbCBEaXNwbGF5U3RhdGUgbmV3RGlzcGxheSA9IG5ldyBWaXJ0dWFsRGlzcGxheUJ1aWxkZXIodGhpcykuYnVpbGQoKTsKLSAgICAgICAgLy8gTGF1bmNoIGEgbm9uLXJlc2l6ZWFibGUgYWN0aXZpdHkgb24gYSBwcmltYXJ5IGRpc3BsYXkuCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5SW5OZXdUYXNrKE5PTl9SRVNJWkVBQkxFX0FDVElWSVRZX05BTUUpOwotICAgICAgICAvLyBMYXVuY2ggYSByZXNpemVhYmxlIGFjdGl2aXR5IG9uIG5ldyBzZWNvbmRhcnkgZGlzcGxheSB0byBjcmVhdGUgYSBuZXcgc3RhY2sgdGhlcmUuCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5T25EaXNwbGF5KFJFU0laRUFCTEVfQUNUSVZJVFlfTkFNRSwgbmV3RGlzcGxheS5tRGlzcGxheUlkKTsKLSAgICAgICAgaW50IGZyb250U3RhY2tJZCA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEZyb250U3RhY2tJZChuZXdEaXNwbGF5Lm1EaXNwbGF5SWQpOwotCi0gICAgICAgIC8vIFRyeSB0byBtb3ZlIHRoZSBub24tcmVzaXplYWJsZSBhY3Rpdml0eSB0byBuZXcgc2Vjb25kYXJ5IGRpc3BsYXkuCi0gICAgICAgIG1vdmVBY3Rpdml0eVRvU3RhY2soTk9OX1JFU0laRUFCTEVfQUNUSVZJVFlfTkFNRSwgZnJvbnRTdGFja0lkKTsKLSAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwgbmV3IFN0cmluZ1tdIHtOT05fUkVTSVpFQUJMRV9BQ1RJVklUWV9OQU1FfSk7Ci0KLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkQWN0aXZpdHkoIkFjdGl2aXR5IGxhdW5jaGVkIG9uIHNlY29uZGFyeSBkaXNwbGF5IG11c3QgYmUgZm9jdXNlZCIsCi0gICAgICAgICAgICAgICAgTk9OX1JFU0laRUFCTEVfQUNUSVZJVFlfTkFNRSk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgdGhhdCBhY3Rpdml0eSBpcyBvbiB0aGUgcmlnaHQgZGlzcGxheS4KLSAgICAgICAgZnJvbnRTdGFja0lkID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0RnJvbnRTdGFja0lkKERFRkFVTFRfRElTUExBWV9JRCk7Ci0gICAgICAgIGZpbmFsIEFjdGl2aXR5TWFuYWdlclN0YXRlLkFjdGl2aXR5U3RhY2sgZnJvbnRTdGFjayA9Ci0gICAgICAgICAgICAgICAgbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0U3RhY2tCeUlkKGZyb250U3RhY2tJZCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiTGF1bmNoZWQgYWN0aXZpdHkgbXVzdCBiZSBvbiB0aGUgcHJpbWFyeSBkaXNwbGF5IGFuZCByZXN1bWVkIiwKLSAgICAgICAgICAgICAgICBnZXRBY3Rpdml0eUNvbXBvbmVudE5hbWUoTk9OX1JFU0laRUFCTEVfQUNUSVZJVFlfTkFNRSksCi0gICAgICAgICAgICAgICAgZnJvbnRTdGFjay5tUmVzdW1lZEFjdGl2aXR5KTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkU3RhY2soIkZvY3VzIG11c3QgYmUgb24gdGhlIHByaW1hcnkgZGlzcGxheSIsIGZyb250U3RhY2tJZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgbGF1bmNoaW5nIGEgbm9uLXJlc2l6ZWFibGUgYWN0aXZpdHkgb24gdmlydHVhbCBkaXNwbGF5IGZyb20gYWN0aXZpdHkgdGhlcmUuIEl0IHNob3VsZAotICAgICAqIGxhbmQgb24gdGhlIHNlY29uZGFyeSBkaXNwbGF5IGJhc2VkIG9uIHRoZSByZXNpemVhYmlsaXR5IG9mIHRoZSByb290IGFjdGl2aXR5IG9mIHRoZSB0YXNrLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RMYXVuY2hOb25SZXNpemVhYmxlQWN0aXZpdHlGcm9tU2Vjb25kYXJ5RGlzcGxheVNhbWVUYXNrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghc3VwcG9ydHNNdWx0aURpc3BsYXkoKSkgeyByZXR1cm47IH0KLQotICAgICAgICAvLyBDcmVhdGUgbmV3IHZpcnR1YWwgZGlzcGxheS4KLSAgICAgICAgZmluYWwgRGlzcGxheVN0YXRlIG5ld0Rpc3BsYXkgPSBuZXcgVmlydHVhbERpc3BsYXlCdWlsZGVyKHRoaXMpLnNldFNpbXVsYXRlRGlzcGxheSh0cnVlKQotICAgICAgICAgICAgICAgIC5idWlsZCgpOwotCi0gICAgICAgIC8vIExhdW5jaCBhY3Rpdml0eSBvbiBuZXcgc2Vjb25kYXJ5IGRpc3BsYXkuCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5T25EaXNwbGF5KEJST0FEQ0FTVF9SRUNFSVZFUl9BQ1RJVklUWSwgbmV3RGlzcGxheS5tRGlzcGxheUlkKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkQWN0aXZpdHkoIkFjdGl2aXR5IGxhdW5jaGVkIG9uIHNlY29uZGFyeSBkaXNwbGF5IG11c3QgYmUgZm9jdXNlZCIsCi0gICAgICAgICAgICAgICAgQlJPQURDQVNUX1JFQ0VJVkVSX0FDVElWSVRZKTsKLQotICAgICAgICAvLyBDaGVjayB0aGF0IGxhdW5jaGluZyBhY3Rpdml0eSBpcyBvbiB0aGUgc2Vjb25kYXJ5IGRpc3BsYXkuCi0gICAgICAgIGludCBmcm9udFN0YWNrSWQgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRGcm9udFN0YWNrSWQobmV3RGlzcGxheS5tRGlzcGxheUlkKTsKLSAgICAgICAgQWN0aXZpdHlNYW5hZ2VyU3RhdGUuQWN0aXZpdHlTdGFjayBmcm9udFN0YWNrID0KLSAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja0J5SWQoZnJvbnRTdGFja0lkKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJMYXVuY2hlZCBhY3Rpdml0eSBtdXN0IGJlIG9uIHRoZSBzZWNvbmRhcnkgZGlzcGxheSBhbmQgcmVzdW1lZCIsCi0gICAgICAgICAgICAgICAgZ2V0QWN0aXZpdHlDb21wb25lbnROYW1lKEJST0FEQ0FTVF9SRUNFSVZFUl9BQ1RJVklUWSksCi0gICAgICAgICAgICAgICAgZnJvbnRTdGFjay5tUmVzdW1lZEFjdGl2aXR5KTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkU3RhY2soIkZvY3VzIG11c3QgYmUgb24gdGhlIHNlY29uZGFyeSBkaXNwbGF5IiwgZnJvbnRTdGFja0lkKTsKLQotICAgICAgICAvLyBMYXVuY2ggbm9uLXJlc2l6ZWFibGUgYWN0aXZpdHkgZnJvbSBzZWNvbmRhcnkgZGlzcGxheS4KLSAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZCgiYW0gYnJvYWRjYXN0IC1hIHRyaWdnZXJfYnJvYWRjYXN0IC0tZXogbGF1bmNoX2FjdGl2aXR5IHRydWUgIgotICAgICAgICAgICAgICAgICsgIi0tZXogbmV3X3Rhc2sgdHJ1ZSAtLWVzIHRhcmdldF9hY3Rpdml0eSAiICsgTk9OX1JFU0laRUFCTEVfQUNUSVZJVFlfTkFNRSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIG5ldyBTdHJpbmdbXSB7Tk9OX1JFU0laRUFCTEVfQUNUSVZJVFlfTkFNRX0pOwotCi0gICAgICAgIC8vIENoZWNrIHRoYXQgbm9uLXJlc2l6ZWFibGUgYWN0aXZpdHkgaXMgb24gdGhlIHNlY29uZGFyeSBkaXNwbGF5LCBiZWNhdXNlIG9mIHRoZSByZXNpemVhYmxlCi0gICAgICAgIC8vIHJvb3Qgb2YgdGhlIHRhc2suCi0gICAgICAgIGZyb250U3RhY2tJZCA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEZyb250U3RhY2tJZChuZXdEaXNwbGF5Lm1EaXNwbGF5SWQpOwotICAgICAgICBmcm9udFN0YWNrID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0U3RhY2tCeUlkKGZyb250U3RhY2tJZCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiTGF1bmNoZWQgYWN0aXZpdHkgbXVzdCBiZSBvbiB0aGUgcHJpbWFyeSBkaXNwbGF5IGFuZCByZXN1bWVkIiwKLSAgICAgICAgICAgICAgICBnZXRBY3Rpdml0eUNvbXBvbmVudE5hbWUoTk9OX1JFU0laRUFCTEVfQUNUSVZJVFlfTkFNRSksCi0gICAgICAgICAgICAgICAgZnJvbnRTdGFjay5tUmVzdW1lZEFjdGl2aXR5KTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkU3RhY2soIkZvY3VzIG11c3QgYmUgb24gdGhlIHByaW1hcnkgZGlzcGxheSIsIGZyb250U3RhY2tJZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgbGF1bmNoaW5nIGEgbm9uLXJlc2l6ZWFibGUgYWN0aXZpdHkgb24gdmlydHVhbCBkaXNwbGF5IGZyb20gYWN0aXZpdHkgdGhlcmUuIEl0IHNob3VsZAotICAgICAqIGxhbmQgb24gc29tZSBkaWZmZXJlbnQgc3VpdGFibGUgZGlzcGxheSAodXN1YWxseSAtIG9uIHRoZSBkZWZhdWx0IG9uZSkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdExhdW5jaE5vblJlc2l6ZWFibGVBY3Rpdml0eUZyb21TZWNvbmRhcnlEaXNwbGF5TmV3VGFzaygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIXN1cHBvcnRzTXVsdGlEaXNwbGF5KCkpIHsgcmV0dXJuOyB9Ci0KLSAgICAgICAgLy8gQ3JlYXRlIG5ldyB2aXJ0dWFsIGRpc3BsYXkuCi0gICAgICAgIGZpbmFsIERpc3BsYXlTdGF0ZSBuZXdEaXNwbGF5ID0gbmV3IFZpcnR1YWxEaXNwbGF5QnVpbGRlcih0aGlzKS5idWlsZCgpOwotCi0gICAgICAgIC8vIExhdW5jaCBhY3Rpdml0eSBvbiBuZXcgc2Vjb25kYXJ5IGRpc3BsYXkuCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5T25EaXNwbGF5KExBVU5DSElOR19BQ1RJVklUWSwgbmV3RGlzcGxheS5tRGlzcGxheUlkKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkQWN0aXZpdHkoIkFjdGl2aXR5IGxhdW5jaGVkIG9uIHNlY29uZGFyeSBkaXNwbGF5IG11c3QgYmUgZm9jdXNlZCIsCi0gICAgICAgICAgICAgICAgTEFVTkNISU5HX0FDVElWSVRZKTsKLQotICAgICAgICAvLyBDaGVjayB0aGF0IGxhdW5jaGluZyBhY3Rpdml0eSBpcyBvbiB0aGUgc2Vjb25kYXJ5IGRpc3BsYXkuCi0gICAgICAgIGludCBmcm9udFN0YWNrSWQgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRGcm9udFN0YWNrSWQobmV3RGlzcGxheS5tRGlzcGxheUlkKTsKLSAgICAgICAgQWN0aXZpdHlNYW5hZ2VyU3RhdGUuQWN0aXZpdHlTdGFjayBmcm9udFN0YWNrID0KLSAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja0J5SWQoZnJvbnRTdGFja0lkKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJMYXVuY2hlZCBhY3Rpdml0eSBtdXN0IGJlIG9uIHRoZSBzZWNvbmRhcnkgZGlzcGxheSBhbmQgcmVzdW1lZCIsCi0gICAgICAgICAgICAgICAgZ2V0QWN0aXZpdHlDb21wb25lbnROYW1lKExBVU5DSElOR19BQ1RJVklUWSksCi0gICAgICAgICAgICAgICAgZnJvbnRTdGFjay5tUmVzdW1lZEFjdGl2aXR5KTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkU3RhY2soIkZvY3VzIG11c3QgYmUgb24gdGhlIHNlY29uZGFyeSBkaXNwbGF5IiwgZnJvbnRTdGFja0lkKTsKLQotICAgICAgICAvLyBMYXVuY2ggbm9uLXJlc2l6ZWFibGUgYWN0aXZpdHkgZnJvbSBzZWNvbmRhcnkgZGlzcGxheS4KLSAgICAgICAgZ2V0TGF1bmNoQWN0aXZpdHlCdWlsZGVyKCkuc2V0VGFyZ2V0QWN0aXZpdHlOYW1lKE5PTl9SRVNJWkVBQkxFX0FDVElWSVRZX05BTUUpCi0gICAgICAgICAgICAgICAgLnNldE5ld1Rhc2sodHJ1ZSkuc2V0TXVsdGlwbGVUYXNrKHRydWUpLmV4ZWN1dGUoKTsKLQotICAgICAgICAvLyBDaGVjayB0aGF0IG5vbi1yZXNpemVhYmxlIGFjdGl2aXR5IGlzIG9uIHRoZSBwcmltYXJ5IGRpc3BsYXkuCi0gICAgICAgIGZyb250U3RhY2tJZCA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEZvY3VzZWRTdGFja0lkKCk7Ci0gICAgICAgIGZyb250U3RhY2sgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja0J5SWQoZnJvbnRTdGFja0lkKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIkxhdW5jaGVkIGFjdGl2aXR5IG11c3QgYmUgb24gYSBkaWZmZXJlbnQgZGlzcGxheSIsCi0gICAgICAgICAgICAgICAgbmV3RGlzcGxheS5tRGlzcGxheUlkID09IGZyb250U3RhY2subURpc3BsYXlJZCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiTGF1bmNoZWQgYWN0aXZpdHkgbXVzdCBiZSByZXN1bWVkIiwKLSAgICAgICAgICAgICAgICBnZXRBY3Rpdml0eUNvbXBvbmVudE5hbWUoTk9OX1JFU0laRUFCTEVfQUNUSVZJVFlfTkFNRSksCi0gICAgICAgICAgICAgICAgZnJvbnRTdGFjay5tUmVzdW1lZEFjdGl2aXR5KTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkU3RhY2soIkZvY3VzIG11c3QgYmUgb24gYSBqdXN0IGxhdW5jaGVkIGFjdGl2aXR5IiwgZnJvbnRTdGFja0lkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyBsYXVuY2hpbmcgYW4gYWN0aXZpdHkgb24gYSB2aXJ0dWFsIGRpc3BsYXkgd2l0aG91dCBzcGVjaWFsIHBlcm1pc3Npb24gbXVzdCBub3QgYmUKLSAgICAgKiBhbGxvd2VkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RMYXVuY2hXaXRob3V0UGVybWlzc2lvbk9uVmlydHVhbERpc3BsYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0c011bHRpRGlzcGxheSgpKSB7IHJldHVybjsgfQotCi0gICAgICAgIC8vIENyZWF0ZSBuZXcgdmlydHVhbCBkaXNwbGF5LgotICAgICAgICBmaW5hbCBEaXNwbGF5U3RhdGUgbmV3RGlzcGxheSA9IG5ldyBWaXJ0dWFsRGlzcGxheUJ1aWxkZXIodGhpcykuYnVpbGQoKTsKLQotICAgICAgICBmaW5hbCBTdHJpbmcgbG9nU2VwYXJhdG9yID0gY2xlYXJMb2djYXQoKTsKLQotICAgICAgICAvLyBUcnkgdG8gbGF1bmNoIGFuIGFjdGl2aXR5IGFuZCBjaGVjayBpdCBzZWN1cml0eSBleGNlcHRpb24gd2FzIHRyaWdnZXJlZC4KLSAgICAgICAgZmluYWwgU3RyaW5nIGJyb2FkY2FzdFRhcmdldCA9ICItYSAiICsgU0VDT05EX1BBQ0tBR0VfTkFNRSArICIuTEFVTkNIX0JST0FEQ0FTVF9BQ1RJT04iCi0gICAgICAgICAgICAgICAgKyAiIC1wICIgKyBTRUNPTkRfUEFDS0FHRV9OQU1FOwotICAgICAgICBmaW5hbCBTdHJpbmcgaW5jbHVkZVN0b3BwZWRQYWNrYWdlc0ZsYWcgPSAiIC1mIDB4MDAwMDAwMjAiOwotICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKCJhbSBicm9hZGNhc3QgIiArIGJyb2FkY2FzdFRhcmdldAotICAgICAgICAgICAgICAgICsgIiAtLWV6IGxhdW5jaF9hY3Rpdml0eSB0cnVlIC0tZXMgdGFyZ2V0X2FjdGl2aXR5ICIgKyBURVNUX0FDVElWSVRZX05BTUUKLSAgICAgICAgICAgICAgICArICIgLS1lcyBwYWNrYWdlX25hbWUgIiArIGNvbXBvbmVudE5hbWUKLSAgICAgICAgICAgICAgICArICIgLS1laSBkaXNwbGF5X2lkICIgKyBuZXdEaXNwbGF5Lm1EaXNwbGF5SWQKLSAgICAgICAgICAgICAgICArIGluY2x1ZGVTdG9wcGVkUGFja2FnZXNGbGFnKTsKLQotICAgICAgICBhc3NlcnRTZWN1cml0eUV4Y2VwdGlvbigiTGF1bmNoQnJvYWRjYXN0UmVjZWl2ZXIiLCBsb2dTZXBhcmF0b3IpOwotCi0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIG5ldyBTdHJpbmdbXSB7VEVTVF9BQ1RJVklUWV9OQU1FfSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJSZXN0cmljdGVkIGFjdGl2aXR5IG11c3Qgbm90IGJlIGxhdW5jaGVkIiwKLSAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5jb250YWluc0FjdGl2aXR5KFRFU1RfQUNUSVZJVFlfTkFNRSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIGxhdW5jaGluZyBhbiBhY3Rpdml0eSBvbiBhIHZpcnR1YWwgZGlzcGxheSB3aXRob3V0IHNwZWNpYWwgcGVybWlzc2lvbiBtdXN0IGJlIGFsbG93ZWQKLSAgICAgKiBmb3IgYWN0aXZpdGllcyB3aXRoIHNhbWUgVUlELgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RMYXVuY2hXaXRob3V0UGVybWlzc2lvbk9uVmlydHVhbERpc3BsYXlCeU93bmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghc3VwcG9ydHNNdWx0aURpc3BsYXkoKSkgeyByZXR1cm47IH0KLQotICAgICAgICAvLyBDcmVhdGUgbmV3IHZpcnR1YWwgZGlzcGxheS4KLSAgICAgICAgZmluYWwgRGlzcGxheVN0YXRlIG5ld0Rpc3BsYXkgPSBuZXcgVmlydHVhbERpc3BsYXlCdWlsZGVyKHRoaXMpLmJ1aWxkKCk7Ci0KLSAgICAgICAgLy8gVHJ5IHRvIGxhdW5jaCBhbiBhY3Rpdml0eSBhbmQgY2hlY2sgaXQgc2VjdXJpdHkgZXhjZXB0aW9uIHdhcyB0cmlnZ2VyZWQuCi0gICAgICAgIGZpbmFsIFN0cmluZyBicm9hZGNhc3RUYXJnZXQgPSAiLWEgIiArIGNvbXBvbmVudE5hbWUgKyAiLkxBVU5DSF9CUk9BRENBU1RfQUNUSU9OIgotICAgICAgICAgICAgICAgICsgIiAtcCAiICsgY29tcG9uZW50TmFtZTsKLSAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZCgiYW0gYnJvYWRjYXN0ICIgKyBicm9hZGNhc3RUYXJnZXQKLSAgICAgICAgICAgICAgICArICIgLS1leiBsYXVuY2hfYWN0aXZpdHkgdHJ1ZSAtLWVzIHRhcmdldF9hY3Rpdml0eSAiICsgVEVTVF9BQ1RJVklUWV9OQU1FCi0gICAgICAgICAgICAgICAgKyAiIC0tZXMgcGFja2FnZV9uYW1lICIgKyBjb21wb25lbnROYW1lCi0gICAgICAgICAgICAgICAgKyAiIC0tZWkgZGlzcGxheV9pZCAiICsgbmV3RGlzcGxheS5tRGlzcGxheUlkKTsKLQotICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JWYWxpZFN0YXRlKG1EZXZpY2UsIFRFU1RfQUNUSVZJVFlfTkFNRSk7Ci0KLSAgICAgICAgZmluYWwgaW50IGV4dGVybmFsRm9jdXNlZFN0YWNrSWQgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRGb2N1c2VkU3RhY2tJZCgpOwotICAgICAgICBmaW5hbCBBY3Rpdml0eU1hbmFnZXJTdGF0ZS5BY3Rpdml0eVN0YWNrIGZvY3VzZWRTdGFjayA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpCi0gICAgICAgICAgICAgICAgLmdldFN0YWNrQnlJZChleHRlcm5hbEZvY3VzZWRTdGFja0lkKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJGb2N1c2VkIHN0YWNrIG11c3QgYmUgb24gc2Vjb25kYXJ5IGRpc3BsYXkiLCBuZXdEaXNwbGF5Lm1EaXNwbGF5SWQsCi0gICAgICAgICAgICAgICAgZm9jdXNlZFN0YWNrLm1EaXNwbGF5SWQpOwotCi0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZEFjdGl2aXR5KCJGb2N1cyBtdXN0IGJlIG9uIG5ld2x5IGxhdW5jaGVkIGFwcCIsIFRFU1RfQUNUSVZJVFlfTkFNRSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiQWN0aXZpdHkgbGF1bmNoZWQgYnkgb3duZXIgbXVzdCBiZSBvbiBleHRlcm5hbCBkaXNwbGF5IiwKLSAgICAgICAgICAgICAgICBleHRlcm5hbEZvY3VzZWRTdGFja0lkLCBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRGb2N1c2VkU3RhY2tJZCgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyBsYXVuY2hpbmcgYW4gYWN0aXZpdHkgb24gdmlydHVhbCBkaXNwbGF5IGFuZCB0aGVuIGxhdW5jaGluZyBhbm90aGVyIGFjdGl2aXR5IHZpYSBzaGVsbAotICAgICAqIGNvbW1hbmQgYW5kIHdpdGhvdXQgc3BlY2lmeWluZyB0aGUgZGlzcGxheSBpZCAtIHRoZSBzZWNvbmQgYWN0aXZpdHkgbXVzdCBhcHBlYXIgb24gdGhlCi0gICAgICogcHJpbWFyeSBkaXNwbGF5LgotICAgICAqLwotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSIzLjIuNC9DLTEtMyIpCi0gICAgQFByZXN1Ym1pdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zZXF1ZW50TGF1bmNoQWN0aXZpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0c011bHRpRGlzcGxheSgpKSB7IHJldHVybjsgfQotCi0gICAgICAgIC8vIENyZWF0ZSBuZXcgdmlydHVhbCBkaXNwbGF5LgotICAgICAgICBmaW5hbCBEaXNwbGF5U3RhdGUgbmV3RGlzcGxheSA9IG5ldyBWaXJ0dWFsRGlzcGxheUJ1aWxkZXIodGhpcykuYnVpbGQoKTsKLQotICAgICAgICAvLyBMYXVuY2ggYWN0aXZpdHkgb24gbmV3IHNlY29uZGFyeSBkaXNwbGF5LgotICAgICAgICBsYXVuY2hBY3Rpdml0eU9uRGlzcGxheShURVNUX0FDVElWSVRZX05BTUUsIG5ld0Rpc3BsYXkubURpc3BsYXlJZCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIG5ldyBTdHJpbmdbXSB7VEVTVF9BQ1RJVklUWV9OQU1FfSk7Ci0KLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkQWN0aXZpdHkoIkFjdGl2aXR5IGxhdW5jaGVkIG9uIHNlY29uZGFyeSBkaXNwbGF5IG11c3QgYmUgZm9jdXNlZCIsCi0gICAgICAgICAgICAgICAgVEVTVF9BQ1RJVklUWV9OQU1FKTsKLQotICAgICAgICAvLyBMYXVuY2ggc2Vjb25kIGFjdGl2aXR5IHdpdGhvdXQgc3BlY2lmeWluZyBkaXNwbGF5LgotICAgICAgICBsYXVuY2hBY3Rpdml0eShMQVVOQ0hJTkdfQUNUSVZJVFkpOwotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCBuZXcgU3RyaW5nW10ge0xBVU5DSElOR19BQ1RJVklUWX0pOwotCi0gICAgICAgIC8vIENoZWNrIHRoYXQgYWN0aXZpdHkgaXMgbGF1bmNoZWQgaW4gZm9jdXNlZCBzdGFjayBvbiB0aGUgY29ycmVjdCBkaXNwbGF5LgotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRBY3Rpdml0eSgiTGF1bmNoZWQgYWN0aXZpdHkgbXVzdCBiZSBmb2N1c2VkIiwgTEFVTkNISU5HX0FDVElWSVRZKTsKLQotICAgICAgICAvLyBUaGUgZGVmYXVsdCBkaXNwbGF5IGlkIGZvciBhIDJkIGFjdGl2aXR5IGxhdW5jaCBpcyB2ciB2aXJ0dWFsIGRpc3BsYXkgZm9yIGEgdnIgaGVhZHNldC4KLSAgICAgICAgaW50IGRpc3BsYXlJZCA9IGdldEN1cnJlbnREZWZhdWx0RGlzcGxheUlkKCk7Ci0gICAgICAgIGZpbmFsIGludCBmcm9udFN0YWNrSWQgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRGcm9udFN0YWNrSWQoZGlzcGxheUlkKTsKLSAgICAgICAgZmluYWwgQWN0aXZpdHlNYW5hZ2VyU3RhdGUuQWN0aXZpdHlTdGFjayBmcm9udFN0YWNrCi0gICAgICAgICAgICAgICAgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja0J5SWQoZnJvbnRTdGFja0lkKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJMYXVuY2hlZCBhY3Rpdml0eSBtdXN0IGJlIHJlc3VtZWQgaW4gZnJvbnQgc3RhY2siLAotICAgICAgICAgICAgICAgIGdldEFjdGl2aXR5Q29tcG9uZW50TmFtZShMQVVOQ0hJTkdfQUNUSVZJVFkpLCBmcm9udFN0YWNrLm1SZXN1bWVkQWN0aXZpdHkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkZyb250IHN0YWNrIG11c3QgYmUgb24gdGhlIGNvcnJlY3QgZGlzcGxheSIsCi0gICAgICAgICAgICAgICAgZGlzcGxheUlkLCBmcm9udFN0YWNrLm1EaXNwbGF5SWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIGxhdW5jaGluZyBhbiBhY3Rpdml0eSBvbiBzaW11bGF0ZWQgZGlzcGxheSBhbmQgdGhlbiBsYXVuY2hpbmcgYW5vdGhlciBhY3Rpdml0eSBmcm9tIHRoZQotICAgICAqIGZpcnN0IG9uZSAtIGl0IG11c3QgYXBwZWFyIG9uIHRoZSBzZWNvbmRhcnkgZGlzcGxheSwgYmVjYXVzZSBpdCB3YXMgbGF1bmNoZWQgZnJvbSB0aGVyZS4KLSAgICAgKi8KLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iMy4yLjQvQy0xLTMiKQotICAgIEBQcmVzdWJtaXQKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc2VxdWVudExhdW5jaEFjdGl2aXR5RnJvbVNlY29uZGFyeURpc3BsYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0c011bHRpRGlzcGxheSgpKSB7IHJldHVybjsgfQotCi0gICAgICAgIC8vIENyZWF0ZSBuZXcgdmlydHVhbCBkaXNwbGF5LgotICAgICAgICBmaW5hbCBEaXNwbGF5U3RhdGUgbmV3RGlzcGxheSA9IG5ldyBWaXJ0dWFsRGlzcGxheUJ1aWxkZXIodGhpcykuc2V0U2ltdWxhdGVEaXNwbGF5KHRydWUpCi0gICAgICAgICAgICAgICAgLmJ1aWxkKCk7Ci0KLSAgICAgICAgLy8gTGF1bmNoIGFjdGl2aXR5IG9uIG5ldyBzZWNvbmRhcnkgZGlzcGxheS4KLSAgICAgICAgbGF1bmNoQWN0aXZpdHlPbkRpc3BsYXkoTEFVTkNISU5HX0FDVElWSVRZLCBuZXdEaXNwbGF5Lm1EaXNwbGF5SWQpOwotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCBuZXcgU3RyaW5nW10ge0xBVU5DSElOR19BQ1RJVklUWX0pOwotCi0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZEFjdGl2aXR5KCJBY3Rpdml0eSBsYXVuY2hlZCBvbiBzZWNvbmRhcnkgZGlzcGxheSBtdXN0IGJlIHJlc3VtZWQiLAotICAgICAgICAgICAgICAgIExBVU5DSElOR19BQ1RJVklUWSk7Ci0KLSAgICAgICAgLy8gTGF1bmNoIHNlY29uZCBhY3Rpdml0eSBmcm9tIGFwcCBvbiBzZWNvbmRhcnkgZGlzcGxheSB3aXRob3V0IHNwZWNpZnlpbmcgZGlzcGxheSBpZC4KLSAgICAgICAgZ2V0TGF1bmNoQWN0aXZpdHlCdWlsZGVyKCkuc2V0VGFyZ2V0QWN0aXZpdHlOYW1lKFRFU1RfQUNUSVZJVFlfTkFNRSkuZXhlY3V0ZSgpOwotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCBuZXcgU3RyaW5nW10ge1RFU1RfQUNUSVZJVFlfTkFNRX0pOwotCi0gICAgICAgIC8vIENoZWNrIHRoYXQgYWN0aXZpdHkgaXMgbGF1bmNoZWQgaW4gZm9jdXNlZCBzdGFjayBvbiBleHRlcm5hbCBkaXNwbGF5LgotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRBY3Rpdml0eSgiTGF1bmNoZWQgYWN0aXZpdHkgbXVzdCBiZSBmb2N1c2VkIiwgVEVTVF9BQ1RJVklUWV9OQU1FKTsKLSAgICAgICAgZmluYWwgaW50IGZyb250U3RhY2tJZCA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEZyb250U3RhY2tJZChuZXdEaXNwbGF5Lm1EaXNwbGF5SWQpOwotICAgICAgICBmaW5hbCBBY3Rpdml0eU1hbmFnZXJTdGF0ZS5BY3Rpdml0eVN0YWNrIGZyb250U3RhY2sKLSAgICAgICAgICAgICAgICA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFN0YWNrQnlJZChmcm9udFN0YWNrSWQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkxhdW5jaGVkIGFjdGl2aXR5IG11c3QgYmUgcmVzdW1lZCBpbiBmcm9udCBzdGFjayIsCi0gICAgICAgICAgICAgICAgZ2V0QWN0aXZpdHlDb21wb25lbnROYW1lKFRFU1RfQUNUSVZJVFlfTkFNRSksIGZyb250U3RhY2subVJlc3VtZWRBY3Rpdml0eSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgbGF1bmNoaW5nIGFuIGFjdGl2aXR5IG9uIHZpcnR1YWwgZGlzcGxheSBhbmQgdGhlbiBsYXVuY2hpbmcgYW5vdGhlciBhY3Rpdml0eSBmcm9tIHRoZQotICAgICAqIGZpcnN0IG9uZSAtIGl0IG11c3QgYXBwZWFyIG9uIHRoZSBzZWNvbmRhcnkgZGlzcGxheSwgYmVjYXVzZSBpdCB3YXMgbGF1bmNoZWQgZnJvbSB0aGVyZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc2VxdWVudExhdW5jaEFjdGl2aXR5RnJvbVZpcnR1YWxEaXNwbGF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghc3VwcG9ydHNNdWx0aURpc3BsYXkoKSkgeyByZXR1cm47IH0KLQotICAgICAgICAvLyBDcmVhdGUgbmV3IHZpcnR1YWwgZGlzcGxheS4KLSAgICAgICAgZmluYWwgRGlzcGxheVN0YXRlIG5ld0Rpc3BsYXkgPSBuZXcgVmlydHVhbERpc3BsYXlCdWlsZGVyKHRoaXMpLmJ1aWxkKCk7Ci0KLSAgICAgICAgLy8gTGF1bmNoIGFjdGl2aXR5IG9uIG5ldyBzZWNvbmRhcnkgZGlzcGxheS4KLSAgICAgICAgbGF1bmNoQWN0aXZpdHlPbkRpc3BsYXkoTEFVTkNISU5HX0FDVElWSVRZLCBuZXdEaXNwbGF5Lm1EaXNwbGF5SWQpOwotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCBuZXcgU3RyaW5nW10ge0xBVU5DSElOR19BQ1RJVklUWX0pOwotCi0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZEFjdGl2aXR5KCJBY3Rpdml0eSBsYXVuY2hlZCBvbiBzZWNvbmRhcnkgZGlzcGxheSBtdXN0IGJlIHJlc3VtZWQiLAotICAgICAgICAgICAgICAgIExBVU5DSElOR19BQ1RJVklUWSk7Ci0KLSAgICAgICAgLy8gTGF1bmNoIHNlY29uZCBhY3Rpdml0eSBmcm9tIGFwcCBvbiBzZWNvbmRhcnkgZGlzcGxheSB3aXRob3V0IHNwZWNpZnlpbmcgZGlzcGxheSBpZC4KLSAgICAgICAgZ2V0TGF1bmNoQWN0aXZpdHlCdWlsZGVyKCkuc2V0VGFyZ2V0QWN0aXZpdHlOYW1lKFRFU1RfQUNUSVZJVFlfTkFNRSkuZXhlY3V0ZSgpOwotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCBuZXcgU3RyaW5nW10ge1RFU1RfQUNUSVZJVFlfTkFNRX0pOwotCi0gICAgICAgIC8vIENoZWNrIHRoYXQgYWN0aXZpdHkgaXMgbGF1bmNoZWQgaW4gZm9jdXNlZCBzdGFjayBvbiBleHRlcm5hbCBkaXNwbGF5LgotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRBY3Rpdml0eSgiTGF1bmNoZWQgYWN0aXZpdHkgbXVzdCBiZSBmb2N1c2VkIiwgVEVTVF9BQ1RJVklUWV9OQU1FKTsKLSAgICAgICAgZmluYWwgaW50IGZyb250U3RhY2tJZCA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEZyb250U3RhY2tJZChuZXdEaXNwbGF5Lm1EaXNwbGF5SWQpOwotICAgICAgICBmaW5hbCBBY3Rpdml0eU1hbmFnZXJTdGF0ZS5BY3Rpdml0eVN0YWNrIGZyb250U3RhY2sKLSAgICAgICAgICAgICAgICA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFN0YWNrQnlJZChmcm9udFN0YWNrSWQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkxhdW5jaGVkIGFjdGl2aXR5IG11c3QgYmUgcmVzdW1lZCBpbiBmcm9udCBzdGFjayIsCi0gICAgICAgICAgICAgICAgZ2V0QWN0aXZpdHlDb21wb25lbnROYW1lKFRFU1RfQUNUSVZJVFlfTkFNRSksIGZyb250U3RhY2subVJlc3VtZWRBY3Rpdml0eSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgbGF1bmNoaW5nIGFuIGFjdGl2aXR5IG9uIHZpcnR1YWwgZGlzcGxheSBhbmQgdGhlbiBsYXVuY2hpbmcgYW5vdGhlciBhY3Rpdml0eSBmcm9tIHRoZQotICAgICAqIGZpcnN0IG9uZSB3aXRoIHNwZWNpZnlpbmcgdGhlIHRhcmdldCBkaXNwbGF5IC0gaXQgbXVzdCBhcHBlYXIgb24gdGhlIHNlY29uZGFyeSBkaXNwbGF5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zZXF1ZW50TGF1bmNoQWN0aXZpdHlGcm9tVmlydHVhbERpc3BsYXlUb1RhcmdldERpc3BsYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0c011bHRpRGlzcGxheSgpKSB7IHJldHVybjsgfQotCi0gICAgICAgIC8vIENyZWF0ZSBuZXcgdmlydHVhbCBkaXNwbGF5LgotICAgICAgICBmaW5hbCBEaXNwbGF5U3RhdGUgbmV3RGlzcGxheSA9IG5ldyBWaXJ0dWFsRGlzcGxheUJ1aWxkZXIodGhpcykuYnVpbGQoKTsKLQotICAgICAgICAvLyBMYXVuY2ggYWN0aXZpdHkgb24gbmV3IHNlY29uZGFyeSBkaXNwbGF5LgotICAgICAgICBsYXVuY2hBY3Rpdml0eU9uRGlzcGxheShMQVVOQ0hJTkdfQUNUSVZJVFksIG5ld0Rpc3BsYXkubURpc3BsYXlJZCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIG5ldyBTdHJpbmdbXSB7TEFVTkNISU5HX0FDVElWSVRZfSk7Ci0KLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkQWN0aXZpdHkoIkFjdGl2aXR5IGxhdW5jaGVkIG9uIHNlY29uZGFyeSBkaXNwbGF5IG11c3QgYmUgcmVzdW1lZCIsCi0gICAgICAgICAgICAgICAgTEFVTkNISU5HX0FDVElWSVRZKTsKLQotICAgICAgICAvLyBMYXVuY2ggc2Vjb25kIGFjdGl2aXR5IGZyb20gYXBwIG9uIHNlY29uZGFyeSBkaXNwbGF5IHNwZWNpZnlpbmcgc2FtZSBkaXNwbGF5IGlkLgotICAgICAgICBnZXRMYXVuY2hBY3Rpdml0eUJ1aWxkZXIoKS5zZXRUYXJnZXRBY3Rpdml0eU5hbWUoU0VDT05EX0FDVElWSVRZX05BTUUpCi0gICAgICAgICAgICAgICAgLnNldFRhcmdldFBhY2thZ2UoU0VDT05EX1BBQ0tBR0VfTkFNRSkKLSAgICAgICAgICAgICAgICAuc2V0RGlzcGxheUlkKG5ld0Rpc3BsYXkubURpc3BsYXlJZCkuZXhlY3V0ZSgpOwotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCBuZXcgU3RyaW5nW10ge1RFU1RfQUNUSVZJVFlfTkFNRX0pOwotCi0gICAgICAgIC8vIENoZWNrIHRoYXQgYWN0aXZpdHkgaXMgbGF1bmNoZWQgaW4gZm9jdXNlZCBzdGFjayBvbiBleHRlcm5hbCBkaXNwbGF5LgotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRBY3Rpdml0eSgiTGF1bmNoZWQgYWN0aXZpdHkgbXVzdCBiZSBmb2N1c2VkIiwgU0VDT05EX1BBQ0tBR0VfTkFNRSwKLSAgICAgICAgICAgICAgICBTRUNPTkRfQUNUSVZJVFlfTkFNRSk7Ci0gICAgICAgIGludCBmcm9udFN0YWNrSWQgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRGcm9udFN0YWNrSWQobmV3RGlzcGxheS5tRGlzcGxheUlkKTsKLSAgICAgICAgQWN0aXZpdHlNYW5hZ2VyU3RhdGUuQWN0aXZpdHlTdGFjayBmcm9udFN0YWNrCi0gICAgICAgICAgICAgICAgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja0J5SWQoZnJvbnRTdGFja0lkKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJMYXVuY2hlZCBhY3Rpdml0eSBtdXN0IGJlIHJlc3VtZWQgaW4gZnJvbnQgc3RhY2siLAotICAgICAgICAgICAgICAgIGdldEFjdGl2aXR5Q29tcG9uZW50TmFtZShTRUNPTkRfUEFDS0FHRV9OQU1FLCBTRUNPTkRfQUNUSVZJVFlfTkFNRSksCi0gICAgICAgICAgICAgICAgZnJvbnRTdGFjay5tUmVzdW1lZEFjdGl2aXR5KTsKLQotICAgICAgICAvLyBMYXVuY2ggb3RoZXIgYWN0aXZpdHkgd2l0aCBkaWZmZXJlbnQgdWlkIGFuZCBjaGVjayBpZiBpdCBoYXMgbGF1bmNoZWQgc3VjY2Vzc2Z1bGx5LgotICAgICAgICBmaW5hbCBTdHJpbmcgYnJvYWRjYXN0QWN0aW9uID0gU0VDT05EX1BBQ0tBR0VfTkFNRSArICIuTEFVTkNIX0JST0FEQ0FTVF9BQ1RJT04iOwotICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKCJhbSBicm9hZGNhc3QgLWEgIiArIGJyb2FkY2FzdEFjdGlvbiArICIgLXAgIiArIFNFQ09ORF9QQUNLQUdFX05BTUUKLSAgICAgICAgICAgICAgICArICIgLS1laSBkaXNwbGF5X2lkICIgKyBuZXdEaXNwbGF5Lm1EaXNwbGF5SWQKLSAgICAgICAgICAgICAgICArICIgLS1lcyB0YXJnZXRfYWN0aXZpdHkgIiArIFRISVJEX0FDVElWSVRZX05BTUUKLSAgICAgICAgICAgICAgICArICIgLS1lcyBwYWNrYWdlX25hbWUgIiArIFRISVJEX1BBQ0tBR0VfTkFNRSk7Ci0gICAgICAgIG1BbVdtU3RhdGUud2FpdEZvclZhbGlkU3RhdGUobURldmljZSwgbmV3IFN0cmluZ1tdIHtUSElSRF9BQ1RJVklUWV9OQU1FfSwKLSAgICAgICAgICAgICAgICBudWxsIC8qIHN0YWNrSWRzICovLCBmYWxzZSAvKiBjb21wYXJlVGFza0FuZFN0YWNrQm91bmRzICovLCBUSElSRF9QQUNLQUdFX05BTUUpOwotCi0gICAgICAgIC8vIENoZWNrIHRoYXQgYWN0aXZpdHkgaXMgbGF1bmNoZWQgaW4gZm9jdXNlZCBzdGFjayBvbiBleHRlcm5hbCBkaXNwbGF5LgotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRBY3Rpdml0eSgiTGF1bmNoZWQgYWN0aXZpdHkgbXVzdCBiZSBmb2N1c2VkIiwgVEhJUkRfUEFDS0FHRV9OQU1FLAotICAgICAgICAgICAgICAgIFRISVJEX0FDVElWSVRZX05BTUUpOwotICAgICAgICBmcm9udFN0YWNrSWQgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRGcm9udFN0YWNrSWQobmV3RGlzcGxheS5tRGlzcGxheUlkKTsKLSAgICAgICAgZnJvbnRTdGFjayA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFN0YWNrQnlJZChmcm9udFN0YWNrSWQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkxhdW5jaGVkIGFjdGl2aXR5IG11c3QgYmUgcmVzdW1lZCBpbiBmcm9udCBzdGFjayIsCi0gICAgICAgICAgICAgICAgZ2V0QWN0aXZpdHlDb21wb25lbnROYW1lKFRISVJEX1BBQ0tBR0VfTkFNRSwgVEhJUkRfQUNUSVZJVFlfTkFNRSksCi0gICAgICAgICAgICAgICAgZnJvbnRTdGFjay5tUmVzdW1lZEFjdGl2aXR5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyBsYXVuY2hpbmcgYW4gYWN0aXZpdHkgb24gdmlydHVhbCBkaXNwbGF5IGFuZCB0aGVuIGxhdW5jaGluZyBhbm90aGVyIGFjdGl2aXR5IHRoYXQKLSAgICAgKiBkb2Vzbid0IGFsbG93IGVtYmVkZGluZyAtIGl0IHNob3VsZCBmYWlsIHdpdGggc2VjdXJpdHkgZXhjZXB0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zZXF1ZW50TGF1bmNoQWN0aXZpdHlGcm9tVmlydHVhbERpc3BsYXlOb0VtYmVkZGluZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIXN1cHBvcnRzTXVsdGlEaXNwbGF5KCkpIHsgcmV0dXJuOyB9Ci0KLSAgICAgICAgLy8gQ3JlYXRlIG5ldyB2aXJ0dWFsIGRpc3BsYXkuCi0gICAgICAgIGZpbmFsIERpc3BsYXlTdGF0ZSBuZXdEaXNwbGF5ID0gbmV3IFZpcnR1YWxEaXNwbGF5QnVpbGRlcih0aGlzKS5idWlsZCgpOwotCi0gICAgICAgIC8vIExhdW5jaCBhY3Rpdml0eSBvbiBuZXcgc2Vjb25kYXJ5IGRpc3BsYXkuCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5T25EaXNwbGF5KExBVU5DSElOR19BQ1RJVklUWSwgbmV3RGlzcGxheS5tRGlzcGxheUlkKTsKLSAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwgbmV3IFN0cmluZ1tdIHtMQVVOQ0hJTkdfQUNUSVZJVFl9KTsKLQotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRBY3Rpdml0eSgiQWN0aXZpdHkgbGF1bmNoZWQgb24gc2Vjb25kYXJ5IGRpc3BsYXkgbXVzdCBiZSByZXN1bWVkIiwKLSAgICAgICAgICAgICAgICBMQVVOQ0hJTkdfQUNUSVZJVFkpOwotCi0gICAgICAgIGZpbmFsIFN0cmluZyBsb2dTZXBhcmF0b3IgPSBjbGVhckxvZ2NhdCgpOwotCi0gICAgICAgIC8vIExhdW5jaCBzZWNvbmQgYWN0aXZpdHkgZnJvbSBhcHAgb24gc2Vjb25kYXJ5IGRpc3BsYXkgc3BlY2lmeWluZyBzYW1lIGRpc3BsYXkgaWQuCi0gICAgICAgIGdldExhdW5jaEFjdGl2aXR5QnVpbGRlcigpLnNldFRhcmdldEFjdGl2aXR5TmFtZShTRUNPTkRfQUNUSVZJVFlfTk9fRU1CRURESU5HX05BTUUpCi0gICAgICAgICAgICAgICAgLnNldFRhcmdldFBhY2thZ2UoU0VDT05EX1BBQ0tBR0VfTkFNRSkKLSAgICAgICAgICAgICAgICAuc2V0RGlzcGxheUlkKG5ld0Rpc3BsYXkubURpc3BsYXlJZCkuZXhlY3V0ZSgpOwotCi0gICAgICAgIGFzc2VydFNlY3VyaXR5RXhjZXB0aW9uKCJBY3Rpdml0eUxhdW5jaGVyIiwgbG9nU2VwYXJhdG9yKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyBsYXVuY2hpbmcgYW4gYWN0aXZpdHkgdG8gc2Vjb25kYXJ5IGRpc3BsYXkgZnJvbSBhY3Rpdml0eSBvbiBwcmltYXJ5IGRpc3BsYXkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdExhdW5jaEFjdGl2aXR5RnJvbUFwcFRvU2Vjb25kYXJ5RGlzcGxheSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIXN1cHBvcnRzTXVsdGlEaXNwbGF5KCkpIHsgcmV0dXJuOyB9Ci0KLSAgICAgICAgLy8gU3RhcnQgbGF1bmNoaW5nIGFjdGl2aXR5LgotICAgICAgICBsYXVuY2hBY3Rpdml0eShMQVVOQ0hJTkdfQUNUSVZJVFkpOwotICAgICAgICAvLyBDcmVhdGUgbmV3IHZpcnR1YWwgZGlzcGxheS4KLSAgICAgICAgZmluYWwgRGlzcGxheVN0YXRlIG5ld0Rpc3BsYXkgPSBuZXcgVmlydHVhbERpc3BsYXlCdWlsZGVyKHRoaXMpLnNldFNpbXVsYXRlRGlzcGxheSh0cnVlKQotICAgICAgICAgICAgICAgIC5idWlsZCgpOwotCi0gICAgICAgIC8vIExhdW5jaCBhY3Rpdml0eSBvbiBzZWNvbmRhcnkgZGlzcGxheSBmcm9tIHRoZSBhcHAgb24gcHJpbWFyeSBkaXNwbGF5LgotICAgICAgICBnZXRMYXVuY2hBY3Rpdml0eUJ1aWxkZXIoKS5zZXRUYXJnZXRBY3Rpdml0eU5hbWUoVEVTVF9BQ1RJVklUWV9OQU1FKQotICAgICAgICAgICAgICAgIC5zZXREaXNwbGF5SWQobmV3RGlzcGxheS5tRGlzcGxheUlkKS5leGVjdXRlKCk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgdGhhdCBhY3Rpdml0eSBpcyBsYXVuY2hlZCBvbiBleHRlcm5hbCBkaXNwbGF5LgotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCBuZXcgU3RyaW5nW10ge1RFU1RfQUNUSVZJVFlfTkFNRX0pOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRBY3Rpdml0eSgiQWN0aXZpdHkgbGF1bmNoZWQgb24gc2Vjb25kYXJ5IGRpc3BsYXkgbXVzdCBiZSBmb2N1c2VkIiwKLSAgICAgICAgICAgICAgICBURVNUX0FDVElWSVRZX05BTUUpOwotICAgICAgICBmaW5hbCBpbnQgZnJvbnRTdGFja0lkID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0RnJvbnRTdGFja0lkKG5ld0Rpc3BsYXkubURpc3BsYXlJZCk7Ci0gICAgICAgIGZpbmFsIEFjdGl2aXR5TWFuYWdlclN0YXRlLkFjdGl2aXR5U3RhY2sgZnJvbnRTdGFjawotICAgICAgICAgICAgICAgID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0U3RhY2tCeUlkKGZyb250U3RhY2tJZCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiTGF1bmNoZWQgYWN0aXZpdHkgbXVzdCBiZSByZXN1bWVkIGluIGZyb250IHN0YWNrIiwKLSAgICAgICAgICAgICAgICBnZXRBY3Rpdml0eUNvbXBvbmVudE5hbWUoVEVTVF9BQ1RJVklUWV9OQU1FKSwgZnJvbnRTdGFjay5tUmVzdW1lZEFjdGl2aXR5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyBsYXVuY2hpbmcgYWN0aXZpdGllcyBvbiBzZWNvbmRhcnkgYW5kIHRoZW4gb24gcHJpbWFyeSBkaXNwbGF5IHRvIHNlZSBpZiB0aGUgc3RhY2sKLSAgICAgKiB2aXNpYmlsaXR5IGlzIG5vdCBhZmZlY3RlZC4KLSAgICAgKi8KLSAgICBAUHJlc3VibWl0Ci0gICAgcHVibGljIHZvaWQgdGVzdExhdW5jaEFjdGl2aXRpZXNBZmZlY3RzVmlzaWJpbGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIXN1cHBvcnRzTXVsdGlEaXNwbGF5KCkpIHsgcmV0dXJuOyB9Ci0KLSAgICAgICAgLy8gU3RhcnQgbGF1bmNoaW5nIGFjdGl2aXR5LgotICAgICAgICBsYXVuY2hBY3Rpdml0eShMQVVOQ0hJTkdfQUNUSVZJVFkpOwotICAgICAgICAvLyBDcmVhdGUgbmV3IHZpcnR1YWwgZGlzcGxheS4KLSAgICAgICAgZmluYWwgRGlzcGxheVN0YXRlIG5ld0Rpc3BsYXkgPSBuZXcgVmlydHVhbERpc3BsYXlCdWlsZGVyKHRoaXMpLmJ1aWxkKCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShWSVJUVUFMX0RJU1BMQVlfQUNUSVZJVFksIHRydWUgLyogdmlzaWJsZSAqLyk7Ci0KLSAgICAgICAgLy8gTGF1bmNoIGFjdGl2aXR5IG9uIG5ldyBzZWNvbmRhcnkgZGlzcGxheS4KLSAgICAgICAgbGF1bmNoQWN0aXZpdHlPbkRpc3BsYXkoVEVTVF9BQ1RJVklUWV9OQU1FLCBuZXdEaXNwbGF5Lm1EaXNwbGF5SWQpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoVEVTVF9BQ1RJVklUWV9OQU1FLCB0cnVlIC8qIHZpc2libGUgKi8pOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoVklSVFVBTF9ESVNQTEFZX0FDVElWSVRZLCB0cnVlIC8qIHZpc2libGUgKi8pOwotCi0gICAgICAgIC8vIExhdW5jaCBhY3Rpdml0eSBvbiBwcmltYXJ5IGRpc3BsYXkgYW5kIGNoZWNrIGlmIGl0IGRvZXNuJ3QgYWZmZWN0IGFjdGl2aXR5IG9uIHNlY29uZGFyeQotICAgICAgICAvLyBkaXNwbGF5LgotICAgICAgICBnZXRMYXVuY2hBY3Rpdml0eUJ1aWxkZXIoKS5zZXRUYXJnZXRBY3Rpdml0eU5hbWUoUkVTSVpFQUJMRV9BQ1RJVklUWV9OQU1FKS5leGVjdXRlKCk7Ci0gICAgICAgIG1BbVdtU3RhdGUud2FpdEZvclZhbGlkU3RhdGUobURldmljZSwgUkVTSVpFQUJMRV9BQ1RJVklUWV9OQU1FKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFRFU1RfQUNUSVZJVFlfTkFNRSwgdHJ1ZSAvKiB2aXNpYmxlICovKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFJFU0laRUFCTEVfQUNUSVZJVFlfTkFNRSwgdHJ1ZSAvKiB2aXNpYmxlICovKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHRoYXQgbW92ZS10YXNrIHdvcmtzIHdoZW4gbW92aW5nIGJldHdlZW4gZGlzcGxheXMuCi0gICAgICovCi0gICAgQFByZXN1Ym1pdAotICAgIHB1YmxpYyB2b2lkIHRlc3RNb3ZlVGFza0JldHdlZW5EaXNwbGF5cygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIXN1cHBvcnRzTXVsdGlEaXNwbGF5KCkpIHsgcmV0dXJuOyB9Ci0KLSAgICAgICAgLy8gQ3JlYXRlIG5ldyB2aXJ0dWFsIGRpc3BsYXkuCi0gICAgICAgIGZpbmFsIERpc3BsYXlTdGF0ZSBuZXdEaXNwbGF5ID0gbmV3IFZpcnR1YWxEaXNwbGF5QnVpbGRlcih0aGlzKS5idWlsZCgpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoVklSVFVBTF9ESVNQTEFZX0FDVElWSVRZLCB0cnVlIC8qIHZpc2libGUgKi8pOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRBY3Rpdml0eSgiVmlydHVhbCBkaXNwbGF5IGFjdGl2aXR5IG11c3QgYmUgZm9jdXNlZCIsCi0gICAgICAgICAgICAgICAgVklSVFVBTF9ESVNQTEFZX0FDVElWSVRZKTsKLSAgICAgICAgLy8gVGhlIGRlZmF1bHQgZGlzcGxheSBpZCBmb3IgYSAyZCBhY3Rpdml0eSBsYXVuY2ggaXMgdnIgdmlydHVhbCBkaXNwbGF5IGZvciBhIHZyIGhlYWRzZXQuCi0gICAgICAgIGludCBkaXNwbGF5SWQgPSBnZXRDdXJyZW50RGVmYXVsdERpc3BsYXlJZCgpOwotICAgICAgICBmaW5hbCBpbnQgZGVmYXVsdERpc3BsYXlTdGFja0lkID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0Rm9jdXNlZFN0YWNrSWQoKTsKLSAgICAgICAgQWN0aXZpdHlNYW5hZ2VyU3RhdGUuQWN0aXZpdHlTdGFjayBmb2N1c2VkU3RhY2sKLSAgICAgICAgICAgICAgICA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFN0YWNrQnlJZChkZWZhdWx0RGlzcGxheVN0YWNrSWQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkZvY3VzIG11c3QgcmVtYWluIG9uIHRoZSBjb3JyZWN0IGRpc3BsYXkiLCBkaXNwbGF5SWQsCi0gICAgICAgICAgICAgICAgZm9jdXNlZFN0YWNrLm1EaXNwbGF5SWQpOwotCi0gICAgICAgIC8vIExhdW5jaCBhY3Rpdml0eSBvbiBuZXcgc2Vjb25kYXJ5IGRpc3BsYXkuCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5T25EaXNwbGF5KFRFU1RfQUNUSVZJVFlfTkFNRSwgbmV3RGlzcGxheS5tRGlzcGxheUlkKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkQWN0aXZpdHkoIkZvY3VzIG11c3QgYmUgb24gc2Vjb25kYXJ5IGRpc3BsYXkiLCBURVNUX0FDVElWSVRZX05BTUUpOwotICAgICAgICBpbnQgZm9jdXNlZFN0YWNrSWQgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRGb2N1c2VkU3RhY2tJZCgpOwotICAgICAgICBmb2N1c2VkU3RhY2sgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja0J5SWQoZm9jdXNlZFN0YWNrSWQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkZvY3VzZWQgc3RhY2sgbXVzdCBiZSBvbiBzZWNvbmRhcnkgZGlzcGxheSIsCi0gICAgICAgICAgICAgICAgbmV3RGlzcGxheS5tRGlzcGxheUlkLCBmb2N1c2VkU3RhY2subURpc3BsYXlJZCk7Ci0KLSAgICAgICAgLy8gTW92ZSBhY3Rpdml0eSBmcm9tIHNlY29uZGFyeSBkaXNwbGF5IHRvIHByaW1hcnkuCi0gICAgICAgIG1vdmVBY3Rpdml0eVRvU3RhY2soVEVTVF9BQ1RJVklUWV9OQU1FLCBkZWZhdWx0RGlzcGxheVN0YWNrSWQpOwotICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JGb2N1c2VkU3RhY2sobURldmljZSwgZGVmYXVsdERpc3BsYXlTdGFja0lkKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkQWN0aXZpdHkoIkZvY3VzIG11c3QgYmUgb24gbW92ZWQgYWN0aXZpdHkiLCBURVNUX0FDVElWSVRZX05BTUUpOwotICAgICAgICBmb2N1c2VkU3RhY2tJZCA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEZvY3VzZWRTdGFja0lkKCk7Ci0gICAgICAgIGZvY3VzZWRTdGFjayA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFN0YWNrQnlJZChmb2N1c2VkU3RhY2tJZCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRm9jdXMgbXVzdCByZXR1cm4gdG8gcHJpbWFyeSBkaXNwbGF5IiwgZGlzcGxheUlkLAotICAgICAgICAgICAgICAgIGZvY3VzZWRTdGFjay5tRGlzcGxheUlkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyBsYXVuY2hpbmcgYWN0aXZpdGllcyBvbiBzZWNvbmRhcnkgZGlzcGxheSBhbmQgdGhlbiByZW1vdmluZyBpdCB0byBzZWUgaWYgc3RhY2sgZm9jdXMKLSAgICAgKiBpcyBtb3ZlZCBjb3JyZWN0bHkuCi0gICAgICogVGhpcyB2ZXJzaW9uIGxhdW5jaGVzIHZpcnR1YWwgZGlzcGxheSBjcmVhdG9yIHRvIGZ1bGxzY3JlZW4gc3RhY2sgaW4gc3BsaXQtc2NyZWVuLgotICAgICAqLwotICAgIEBQcmVzdWJtaXQKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhY2tGb2N1c1N3aXRjaE9uRGlzcGxheVJlbW92ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0c011bHRpRGlzcGxheSgpIHx8ICFzdXBwb3J0c1NwbGl0U2NyZWVuTXVsdGlXaW5kb3coKSkgeyByZXR1cm47IH0KLQotICAgICAgICAvLyBTdGFydCBsYXVuY2hpbmcgYWN0aXZpdHkgaW50byBkb2NrZWQgc3RhY2suCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5SW5Eb2NrU3RhY2soTEFVTkNISU5HX0FDVElWSVRZKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KExBVU5DSElOR19BQ1RJVklUWSwgdHJ1ZSAvKiB2aXNpYmxlICovKTsKLQotICAgICAgICB0cnlDcmVhdGluZ0FuZFJlbW92aW5nRGlzcGxheVdpdGhBY3Rpdml0eSh0cnVlIC8qIHNwbGl0U2NyZWVuICovLAotICAgICAgICAgICAgICAgIEZVTExTQ1JFRU5fV09SS1NQQUNFX1NUQUNLX0lEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyBsYXVuY2hpbmcgYWN0aXZpdGllcyBvbiBzZWNvbmRhcnkgZGlzcGxheSBhbmQgdGhlbiByZW1vdmluZyBpdCB0byBzZWUgaWYgc3RhY2sgZm9jdXMKLSAgICAgKiBpcyBtb3ZlZCBjb3JyZWN0bHkuCi0gICAgICogVGhpcyB2ZXJzaW9uIGxhdW5jaGVzIHZpcnR1YWwgZGlzcGxheSBjcmVhdG9yIHRvIGRvY2tlZCBzdGFjayBpbiBzcGxpdC1zY3JlZW4uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFN0YWNrRm9jdXNTd2l0Y2hPbkRpc3BsYXlSZW1vdmVkMigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIXN1cHBvcnRzTXVsdGlEaXNwbGF5KCkgfHwgIXN1cHBvcnRzU3BsaXRTY3JlZW5NdWx0aVdpbmRvdygpKSB7IHJldHVybjsgfQotCi0gICAgICAgIC8vIFNldHVwIHNwbGl0LXNjcmVlbi4KLSAgICAgICAgbGF1bmNoQWN0aXZpdHlJbkRvY2tTdGFjayhSRVNJWkVBQkxFX0FDVElWSVRZX05BTUUpOwotCi0gICAgICAgIC8vIFN0YXJ0IGxhdW5jaGluZyBhY3Rpdml0eSBpbnRvIGZ1bGxzY3JlZW4gc3RhY2suCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5SW5TdGFjayhMQVVOQ0hJTkdfQUNUSVZJVFksIEZVTExTQ1JFRU5fV09SS1NQQUNFX1NUQUNLX0lEKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KExBVU5DSElOR19BQ1RJVklUWSwgdHJ1ZSAvKiB2aXNpYmxlICovKTsKLQotICAgICAgICB0cnlDcmVhdGluZ0FuZFJlbW92aW5nRGlzcGxheVdpdGhBY3Rpdml0eSh0cnVlIC8qIHNwbGl0U2NyZWVuICovLAotICAgICAgICAgICAgICAgIEZVTExTQ1JFRU5fV09SS1NQQUNFX1NUQUNLX0lEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyBsYXVuY2hpbmcgYWN0aXZpdGllcyBvbiBzZWNvbmRhcnkgZGlzcGxheSBhbmQgdGhlbiByZW1vdmluZyBpdCB0byBzZWUgaWYgc3RhY2sgZm9jdXMKLSAgICAgKiBpcyBtb3ZlZCBjb3JyZWN0bHkuCi0gICAgICogVGhpcyB2ZXJzaW9uIHdvcmtzIHdpdGhvdXQgc3BsaXQtc2NyZWVuLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFja0ZvY3VzU3dpdGNoT25EaXNwbGF5UmVtb3ZlZDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0c011bHRpRGlzcGxheSgpKSB7IHJldHVybjsgfQotCi0gICAgICAgIC8vIFN0YXJ0IGFuIGFjdGl2aXR5IG9uIGRlZmF1bHQgZGlzcGxheSB0byBkZXRlcm1pbmUgZGVmYXVsdCBzdGFjay4KLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoQlJPQURDQVNUX1JFQ0VJVkVSX0FDVElWSVRZKTsKLSAgICAgICAgZmluYWwgaW50IGZvY3VzZWRTdGFja0lkID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0RnJvbnRTdGFja0lkKERFRkFVTFRfRElTUExBWV9JRCk7Ci0gICAgICAgIC8vIEZpbmlzaCBwcm9iaW5nIGFjdGl2aXR5LgotICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKEZJTklTSF9BQ1RJVklUWV9CUk9BRENBU1QpOwotCi0gICAgICAgIHRyeUNyZWF0aW5nQW5kUmVtb3ZpbmdEaXNwbGF5V2l0aEFjdGl2aXR5KGZhbHNlIC8qIHNwbGl0U2NyZWVuICovLCBmb2N1c2VkU3RhY2tJZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgdmlydHVhbCBkaXNwbGF5LCBsYXVuY2ggYSB0ZXN0IGFjdGl2aXR5IHRoZXJlLCBkZXN0cm95IHRoZSBkaXNwbGF5IGFuZCBjaGVjayBpZiB0ZXN0Ci0gICAgICogYWN0aXZpdHkgaXMgbW92ZWQgdG8gYSBzdGFjayBvbiB0aGUgZGVmYXVsdCBkaXNwbGF5LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB0cnlDcmVhdGluZ0FuZFJlbW92aW5nRGlzcGxheVdpdGhBY3Rpdml0eShib29sZWFuIHNwbGl0U2NyZWVuLCBpbnQgZGVmYXVsdFN0YWNrSWQpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gQ3JlYXRlIG5ldyB2aXJ0dWFsIGRpc3BsYXkuCi0gICAgICAgIGZpbmFsIFZpcnR1YWxEaXNwbGF5QnVpbGRlciBidWlsZGVyID0gbmV3IFZpcnR1YWxEaXNwbGF5QnVpbGRlcih0aGlzKQotICAgICAgICAgICAgICAgIC5zZXRQdWJsaWNEaXNwbGF5KHRydWUpOwotICAgICAgICBpZiAoc3BsaXRTY3JlZW4pIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuc2V0TGF1bmNoSW5TcGxpdFNjcmVlbih0cnVlKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBEaXNwbGF5U3RhdGUgbmV3RGlzcGxheSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFZJUlRVQUxfRElTUExBWV9BQ1RJVklUWSwgdHJ1ZSAvKiB2aXNpYmxlICovKTsKLSAgICAgICAgaWYgKHNwbGl0U2NyZWVuKSB7Ci0gICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoTEFVTkNISU5HX0FDVElWSVRZLCB0cnVlIC8qIHZpc2libGUgKi8pOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTGF1bmNoIGFjdGl2aXR5IG9uIG5ldyBzZWNvbmRhcnkgZGlzcGxheS4KLSAgICAgICAgbGF1bmNoQWN0aXZpdHlPbkRpc3BsYXkoVEVTVF9BQ1RJVklUWV9OQU1FLCBuZXdEaXNwbGF5Lm1EaXNwbGF5SWQpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRBY3Rpdml0eSgiRm9jdXMgbXVzdCBiZSBvbiBzZWNvbmRhcnkgZGlzcGxheSIsCi0gICAgICAgICAgICAgICAgVEVTVF9BQ1RJVklUWV9OQU1FKTsKLSAgICAgICAgZmluYWwgaW50IGZyb250U3RhY2tJZCA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEZyb250U3RhY2tJZChuZXdEaXNwbGF5Lm1EaXNwbGF5SWQpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRTdGFjaygiRm9jdXMgbXVzdCBiZSBvbiBzZWNvbmRhcnkgZGlzcGxheSIsIGZyb250U3RhY2tJZCk7Ci0KLSAgICAgICAgLy8gRGVzdHJveSB2aXJ0dWFsIGRpc3BsYXkuCi0gICAgICAgIGRlc3Ryb3lWaXJ0dWFsRGlzcGxheXMoKTsKLSAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yVmFsaWRTdGF0ZShtRGV2aWNlLCBURVNUX0FDVElWSVRZX05BTUUsIGRlZmF1bHRTdGFja0lkKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRTYW5pdHkoKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWYWxpZEJvdW5kcyh0cnVlIC8qIGNvbXBhcmVUYXNrQW5kU3RhY2tCb3VuZHMgKi8pOwotCi0gICAgICAgIC8vIENoZWNrIGlmIHRoZSBmb2N1cyBpcyBzd2l0Y2hlZCBiYWNrIHRvIHByaW1hcnkgZGlzcGxheS4KLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFRFU1RfQUNUSVZJVFlfTkFNRSwgdHJ1ZSAvKiB2aXNpYmxlICovKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkU3RhY2soCi0gICAgICAgICAgICAgICAgIkRlZmF1bHQgc3RhY2sgb24gcHJpbWFyeSBkaXNwbGF5IG11c3QgYmUgZm9jdXNlZCBhZnRlciBkaXNwbGF5IHJlbW92ZWQiLAotICAgICAgICAgICAgICAgIGRlZmF1bHRTdGFja0lkKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkQWN0aXZpdHkoCi0gICAgICAgICAgICAgICAgIkZvY3VzIG11c3QgYmUgc3dpdGNoZWQgYmFjayB0byBhY3Rpdml0eSBvbiBwcmltYXJ5IGRpc3BsYXkiLAotICAgICAgICAgICAgICAgIFRFU1RfQUNUSVZJVFlfTkFNRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgbGF1bmNoaW5nIGFjdGl2aXRpZXMgb24gc2Vjb25kYXJ5IGRpc3BsYXkgYW5kIHRoZW4gcmVtb3ZpbmcgaXQgdG8gc2VlIGlmIHN0YWNrIGZvY3VzCi0gICAgICogaXMgbW92ZWQgY29ycmVjdGx5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFja0ZvY3VzU3dpdGNoT25TdGFja0VtcHRpZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0c011bHRpRGlzcGxheSgpKSB7IHJldHVybjsgfQotCi0gICAgICAgIC8vIENyZWF0ZSBuZXcgdmlydHVhbCBkaXNwbGF5LgotICAgICAgICBmaW5hbCBEaXNwbGF5U3RhdGUgbmV3RGlzcGxheSA9IG5ldyBWaXJ0dWFsRGlzcGxheUJ1aWxkZXIodGhpcykuYnVpbGQoKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFZJUlRVQUxfRElTUExBWV9BQ1RJVklUWSwgdHJ1ZSAvKiB2aXNpYmxlICovKTsKLSAgICAgICAgZmluYWwgaW50IGZvY3VzZWRTdGFja0lkID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0RnJvbnRTdGFja0lkKERFRkFVTFRfRElTUExBWV9JRCk7Ci0KLSAgICAgICAgLy8gTGF1bmNoIGFjdGl2aXR5IG9uIG5ldyBzZWNvbmRhcnkgZGlzcGxheS4KLSAgICAgICAgbGF1bmNoQWN0aXZpdHlPbkRpc3BsYXkoQlJPQURDQVNUX1JFQ0VJVkVSX0FDVElWSVRZLCBuZXdEaXNwbGF5Lm1EaXNwbGF5SWQpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRBY3Rpdml0eSgiRm9jdXMgbXVzdCBiZSBvbiBzZWNvbmRhcnkgZGlzcGxheSIsCi0gICAgICAgICAgICAgICAgQlJPQURDQVNUX1JFQ0VJVkVSX0FDVElWSVRZKTsKLQotICAgICAgICAvLyBMb2NrIHRoZSBkZXZpY2UsIHNvIHRoYXQgYWN0aXZpdHkgY29udGFpbmVycyB3aWxsIGJlIGRldGFjaGVkLgotICAgICAgICBzbGVlcERldmljZSgpOwotCi0gICAgICAgIC8vIEZpbmlzaCBhY3Rpdml0eSBvbiBzZWNvbmRhcnkgZGlzcGxheS4KLSAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChGSU5JU0hfQUNUSVZJVFlfQlJPQURDQVNUKTsKLQotICAgICAgICAvLyBVbmxvY2sgYW5kIGNoZWNrIGlmIHRoZSBmb2N1cyBpcyBzd2l0Y2hlZCBiYWNrIHRvIHByaW1hcnkgZGlzcGxheS4KLSAgICAgICAgd2FrZVVwQW5kVW5sb2NrRGV2aWNlKCk7Ci0gICAgICAgIG1BbVdtU3RhdGUud2FpdEZvckZvY3VzZWRTdGFjayhtRGV2aWNlLCBmb2N1c2VkU3RhY2tJZCk7Ci0gICAgICAgIG1BbVdtU3RhdGUud2FpdEZvclZhbGlkU3RhdGUobURldmljZSwgVklSVFVBTF9ESVNQTEFZX0FDVElWSVRZKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFZJUlRVQUxfRElTUExBWV9BQ1RJVklUWSwgdHJ1ZSAvKiB2aXNpYmxlICovKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkQWN0aXZpdHkoIkZvY3VzIG11c3QgYmUgc3dpdGNoZWQgYmFjayB0byBwcmltYXJ5IGRpc3BsYXkiLAotICAgICAgICAgICAgICAgIFZJUlRVQUxfRElTUExBWV9BQ1RJVklUWSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhhdCBpbnB1dCBldmVudHMgb24gdGhlIHByaW1hcnkgZGlzcGxheSB0YWtlIGZvY3VzIGZyb20gdGhlIHZpcnR1YWwgZGlzcGxheS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhY2tGb2N1c1N3aXRjaE9uVG91Y2hFdmVudCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIXN1cHBvcnRzTXVsdGlEaXNwbGF5KCkpIHsgcmV0dXJuOyB9Ci0KLSAgICAgICAgLy8gQ3JlYXRlIG5ldyB2aXJ0dWFsIGRpc3BsYXkuCi0gICAgICAgIGZpbmFsIERpc3BsYXlTdGF0ZSBuZXdEaXNwbGF5ID0gbmV3IFZpcnR1YWxEaXNwbGF5QnVpbGRlcih0aGlzKS5idWlsZCgpOwotCi0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIG5ldyBTdHJpbmdbXSB7VklSVFVBTF9ESVNQTEFZX0FDVElWSVRZfSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZEFjdGl2aXR5KCJGb2N1cyBtdXN0IGJlIHN3aXRjaGVkIGJhY2sgdG8gcHJpbWFyeSBkaXNwbGF5IiwKLSAgICAgICAgICAgICAgICBWSVJUVUFMX0RJU1BMQVlfQUNUSVZJVFkpOwotCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5T25EaXNwbGF5KFRFU1RfQUNUSVZJVFlfTkFNRSwgbmV3RGlzcGxheS5tRGlzcGxheUlkKTsKLQotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCBuZXcgU3RyaW5nW10ge1RFU1RfQUNUSVZJVFlfTkFNRX0pOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRBY3Rpdml0eSgiQWN0aXZpdHkgbGF1bmNoZWQgb24gc2Vjb25kYXJ5IGRpc3BsYXkgbXVzdCBiZSBmb2N1c2VkIiwKLSAgICAgICAgICAgICAgICBURVNUX0FDVElWSVRZX05BTUUpOwotCi0gICAgICAgIGZpbmFsIFJlcG9ydGVkRGlzcGxheU1ldHJpY3MgZGlzcGxheU1ldHJpY3MgPSBnZXREaXNwbGF5TWV0cmljcygpOwotICAgICAgICBmaW5hbCBpbnQgd2lkdGggPSBkaXNwbGF5TWV0cmljcy5nZXRXaWR0aCgpOwotICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gZGlzcGxheU1ldHJpY3MuZ2V0SGVpZ2h0KCk7Ci0gICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoImlucHV0IHRhcCAiICsgKHdpZHRoIC8gMikgKyAiICIgKyAoaGVpZ2h0IC8gMikpOwotCi0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIG5ldyBTdHJpbmdbXSB7VklSVFVBTF9ESVNQTEFZX0FDVElWSVRZfSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZEFjdGl2aXR5KCJGb2N1cyBtdXN0IGJlIHN3aXRjaGVkIGJhY2sgdG8gcHJpbWFyeSBkaXNwbGF5IiwKLSAgICAgICAgICAgICAgICBWSVJUVUFMX0RJU1BMQVlfQUNUSVZJVFkpOwotICAgIH0KLQotICAgIC8qKiBUZXN0IHRoYXQgc2hlbGwgaXMgYWxsb3dlZCB0byBsYXVuY2ggb24gc2Vjb25kYXJ5IGRpc3BsYXlzLiAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RQZXJtaXNzaW9uTGF1bmNoRnJvbVNoZWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghc3VwcG9ydHNNdWx0aURpc3BsYXkoKSkgeyByZXR1cm47IH0KLQotICAgICAgICAvLyBDcmVhdGUgbmV3IHZpcnR1YWwgZGlzcGxheS4KLSAgICAgICAgZmluYWwgRGlzcGxheVN0YXRlIG5ld0Rpc3BsYXkgPSBuZXcgVmlydHVhbERpc3BsYXlCdWlsZGVyKHRoaXMpLmJ1aWxkKCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShWSVJUVUFMX0RJU1BMQVlfQUNUSVZJVFksIHRydWUgLyogdmlzaWJsZSAqLyk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZEFjdGl2aXR5KCJWaXJ0dWFsIGRpc3BsYXkgYWN0aXZpdHkgbXVzdCBiZSBmb2N1c2VkIiwKLSAgICAgICAgICAgICAgICBWSVJUVUFMX0RJU1BMQVlfQUNUSVZJVFkpOwotICAgICAgICBmaW5hbCBpbnQgZGVmYXVsdERpc3BsYXlGb2N1c2VkU3RhY2tJZCA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEZvY3VzZWRTdGFja0lkKCk7Ci0gICAgICAgIC8vIFRoZSBkZWZhdWx0IGRpc3BsYXkgaWQgZm9yIGEgMmQgYWN0aXZpdHkgbGF1bmNoIGlzIHZyIHZpcnR1YWwgZGlzcGxheSBmb3IgYSB2ciBoZWFkc2V0LgotICAgICAgICBpbnQgZGlzcGxheUlkID0gZ2V0Q3VycmVudERlZmF1bHREaXNwbGF5SWQoKTsKLSAgICAgICAgQWN0aXZpdHlNYW5hZ2VyU3RhdGUuQWN0aXZpdHlTdGFjayBmb2N1c2VkU3RhY2sKLSAgICAgICAgICAgICAgICA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFN0YWNrQnlJZChkZWZhdWx0RGlzcGxheUZvY3VzZWRTdGFja0lkKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJGb2N1cyBtdXN0IHJlbWFpbiBvbiB0aGUgY29ycmVjdCBkaXNwbGF5IiwgZGlzcGxheUlkLAotICAgICAgICAgICAgICAgIGZvY3VzZWRTdGFjay5tRGlzcGxheUlkKTsKLQotICAgICAgICAvLyBMYXVuY2ggYWN0aXZpdHkgb24gbmV3IHNlY29uZGFyeSBkaXNwbGF5LgotICAgICAgICBsYXVuY2hBY3Rpdml0eU9uRGlzcGxheShURVNUX0FDVElWSVRZX05BTUUsIG5ld0Rpc3BsYXkubURpc3BsYXlJZCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZEFjdGl2aXR5KCJGb2N1cyBtdXN0IGJlIG9uIHNlY29uZGFyeSBkaXNwbGF5IiwKLSAgICAgICAgICAgICAgICBURVNUX0FDVElWSVRZX05BTUUpOwotICAgICAgICBmaW5hbCBpbnQgZXh0ZXJuYWxGb2N1c2VkU3RhY2tJZCA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEZvY3VzZWRTdGFja0lkKCk7Ci0gICAgICAgIGZvY3VzZWRTdGFjayA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFN0YWNrQnlJZChleHRlcm5hbEZvY3VzZWRTdGFja0lkKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJGb2N1c2VkIHN0YWNrIG11c3QgYmUgb24gc2Vjb25kYXJ5IGRpc3BsYXkiLCBuZXdEaXNwbGF5Lm1EaXNwbGF5SWQsCi0gICAgICAgICAgICAgICAgZm9jdXNlZFN0YWNrLm1EaXNwbGF5SWQpOwotCi0gICAgICAgIC8vIExhdW5jaCBvdGhlciBhY3Rpdml0eSB3aXRoIGRpZmZlcmVudCB1aWQgYW5kIGNoZWNrIGl0IGlzIGxhdW5jaGVkIG9uIGR5bmFtaWMgc3RhY2sgb24KLSAgICAgICAgLy8gc2Vjb25kYXJ5IGRpc3BsYXkuCi0gICAgICAgIGZpbmFsIFN0cmluZyBzdGFydENtZCA9ICAiYW0gc3RhcnQgLW4gIiArIFNFQ09ORF9QQUNLQUdFX05BTUUgKyAiLy4iICsgU0VDT05EX0FDVElWSVRZX05BTUUKLSAgICAgICAgICAgICAgICArICIgLS1kaXNwbGF5ICIgKyBuZXdEaXNwbGF5Lm1EaXNwbGF5SWQ7Ci0gICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoc3RhcnRDbWQpOwotCi0gICAgICAgIG1BbVdtU3RhdGUud2FpdEZvclZhbGlkU3RhdGUobURldmljZSwgbmV3IFN0cmluZ1tdIHtTRUNPTkRfQUNUSVZJVFlfTkFNRX0sCi0gICAgICAgICAgICAgICAgbnVsbCAvKiBzdGFja0lkcyAqLywgZmFsc2UgLyogY29tcGFyZVRhc2tBbmRTdGFja0JvdW5kcyAqLywgU0VDT05EX1BBQ0tBR0VfTkFNRSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZEFjdGl2aXR5KCJGb2N1cyBtdXN0IGJlIG9uIG5ld2x5IGxhdW5jaGVkIGFwcCIsIFNFQ09ORF9QQUNLQUdFX05BTUUsCi0gICAgICAgICAgICAgICAgU0VDT05EX0FDVElWSVRZX05BTUUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkFjdGl2aXR5IGxhdW5jaGVkIGJ5IHN5c3RlbSBtdXN0IGJlIG9uIGV4dGVybmFsIGRpc3BsYXkiLAotICAgICAgICAgICAgICAgIGV4dGVybmFsRm9jdXNlZFN0YWNrSWQsIG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEZvY3VzZWRTdGFja0lkKCkpOwotICAgIH0KLQotICAgIC8qKiBUZXN0IHRoYXQgbGF1bmNoaW5nIGZyb20gYXBwIHRoYXQgaXMgb24gZXh0ZXJuYWwgZGlzcGxheSBpcyBhbGxvd2VkLiAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RQZXJtaXNzaW9uTGF1bmNoRnJvbUFwcE9uU2Vjb25kYXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghc3VwcG9ydHNNdWx0aURpc3BsYXkoKSkgeyByZXR1cm47IH0KLQotICAgICAgICAvLyBDcmVhdGUgbmV3IHZpcnR1YWwgZGlzcGxheS4KLSAgICAgICAgZmluYWwgRGlzcGxheVN0YXRlIG5ld0Rpc3BsYXkgPSBuZXcgVmlydHVhbERpc3BsYXlCdWlsZGVyKHRoaXMpLnNldFNpbXVsYXRlRGlzcGxheSh0cnVlKQotICAgICAgICAgICAgICAgIC5idWlsZCgpOwotCi0gICAgICAgIC8vIExhdW5jaCBhY3Rpdml0eSB3aXRoIGRpZmZlcmVudCB1aWQgb24gc2Vjb25kYXJ5IGRpc3BsYXkuCi0gICAgICAgIGZpbmFsIFN0cmluZyBzdGFydENtZCA9ICAiYW0gc3RhcnQgLW4gIiArIFNFQ09ORF9QQUNLQUdFX05BTUUgKyAiLy4iICsgU0VDT05EX0FDVElWSVRZX05BTUU7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBkaXNwbGF5VGFyZ2V0ID0gIiAtLWRpc3BsYXkgIiArIG5ld0Rpc3BsYXkubURpc3BsYXlJZDsKLSAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChzdGFydENtZCArIGRpc3BsYXlUYXJnZXQpOwotCi0gICAgICAgIG1BbVdtU3RhdGUud2FpdEZvclZhbGlkU3RhdGUobURldmljZSwgbmV3IFN0cmluZ1tdIHtTRUNPTkRfQUNUSVZJVFlfTkFNRX0sCi0gICAgICAgICAgICAgICAgbnVsbCAvKiBzdGFja0lkcyAqLywgZmFsc2UgLyogY29tcGFyZVRhc2tBbmRTdGFja0JvdW5kcyAqLywgU0VDT05EX1BBQ0tBR0VfTkFNRSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZEFjdGl2aXR5KCJGb2N1cyBtdXN0IGJlIG9uIG5ld2x5IGxhdW5jaGVkIGFwcCIsCi0gICAgICAgICAgICAgICAgU0VDT05EX1BBQ0tBR0VfTkFNRSwgU0VDT05EX0FDVElWSVRZX05BTUUpOwotICAgICAgICBmaW5hbCBpbnQgZXh0ZXJuYWxGb2N1c2VkU3RhY2tJZCA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEZvY3VzZWRTdGFja0lkKCk7Ci0gICAgICAgIEFjdGl2aXR5TWFuYWdlclN0YXRlLkFjdGl2aXR5U3RhY2sgZm9jdXNlZFN0YWNrCi0gICAgICAgICAgICAgICAgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja0J5SWQoZXh0ZXJuYWxGb2N1c2VkU3RhY2tJZCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRm9jdXNlZCBzdGFjayBtdXN0IGJlIG9uIHNlY29uZGFyeSBkaXNwbGF5IiwgbmV3RGlzcGxheS5tRGlzcGxheUlkLAotICAgICAgICAgICAgICAgIGZvY3VzZWRTdGFjay5tRGlzcGxheUlkKTsKLQotICAgICAgICAvLyBMYXVuY2ggYW5vdGhlciBhY3Rpdml0eSB3aXRoIHRoaXJkIGRpZmZlcmVudCB1aWQgZnJvbSBhcHAgb24gc2Vjb25kYXJ5IGRpc3BsYXkgYW5kIGNoZWNrCi0gICAgICAgIC8vIGl0IGlzIGxhdW5jaGVkIG9uIHNlY29uZGFyeSBkaXNwbGF5LgotICAgICAgICBmaW5hbCBTdHJpbmcgYnJvYWRjYXN0QWN0aW9uID0gU0VDT05EX1BBQ0tBR0VfTkFNRSArICIuTEFVTkNIX0JST0FEQ0FTVF9BQ1RJT04iOwotICAgICAgICBmaW5hbCBTdHJpbmcgdGFyZ2V0QWN0aXZpdHkgPSAiIC0tZXMgdGFyZ2V0X2FjdGl2aXR5ICIgKyBUSElSRF9BQ1RJVklUWV9OQU1FCi0gICAgICAgICAgICAgICAgKyAiIC0tZXMgcGFja2FnZV9uYW1lICIgKyBUSElSRF9QQUNLQUdFX05BTUUKLSAgICAgICAgICAgICAgICArICIgLS1laSBkaXNwbGF5X2lkICIgKyBuZXdEaXNwbGF5Lm1EaXNwbGF5SWQ7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBpbmNsdWRlU3RvcHBlZFBhY2thZ2VzRmxhZyA9ICIgLWYgMHgwMDAwMDAyMCI7Ci0gICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoImFtIGJyb2FkY2FzdCAtYSAiICsgYnJvYWRjYXN0QWN0aW9uICsgIiAtcCAiICsgU0VDT05EX1BBQ0tBR0VfTkFNRQotICAgICAgICAgICAgICAgICsgdGFyZ2V0QWN0aXZpdHkgKyBpbmNsdWRlU3RvcHBlZFBhY2thZ2VzRmxhZyk7Ci0KLSAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yVmFsaWRTdGF0ZShtRGV2aWNlLCBuZXcgU3RyaW5nW10ge1RISVJEX0FDVElWSVRZX05BTUV9LAotICAgICAgICAgICAgICAgIG51bGwgLyogc3RhY2tJZHMgKi8sIGZhbHNlIC8qIGNvbXBhcmVUYXNrQW5kU3RhY2tCb3VuZHMgKi8sIFRISVJEX1BBQ0tBR0VfTkFNRSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZEFjdGl2aXR5KCJGb2N1cyBtdXN0IGJlIG9uIG5ld2x5IGxhdW5jaGVkIGFwcCIsCi0gICAgICAgICAgICAgICAgVEhJUkRfUEFDS0FHRV9OQU1FLCBUSElSRF9BQ1RJVklUWV9OQU1FKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJBY3Rpdml0eSBsYXVuY2hlZCBieSBhcHAgb24gc2Vjb25kYXJ5IGRpc3BsYXkgbXVzdCBiZSBvbiB0aGF0IGRpc3BsYXkiLAotICAgICAgICAgICAgICAgIGV4dGVybmFsRm9jdXNlZFN0YWNrSWQsIG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEZvY3VzZWRTdGFja0lkKCkpOwotICAgIH0KLQotICAgIC8qKiBUZXN0cyB0aGF0IGFuIGFjdGl2aXR5IGNhbiBsYXVuY2ggYW4gYWN0aXZpdHkgZnJvbSBhIGRpZmZlcmVudCBVSUQgaW50byBpdHMgb3duIHRhc2suICovCi0gICAgcHVibGljIHZvaWQgdGVzdFBlcm1pc3Npb25MYXVuY2hNdWx0aVVpZFRhc2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0c011bHRpRGlzcGxheSgpKSB7IHJldHVybjsgfQotCi0gICAgICAgIGZpbmFsIERpc3BsYXlTdGF0ZSBuZXdEaXNwbGF5ID0gbmV3IFZpcnR1YWxEaXNwbGF5QnVpbGRlcih0aGlzKS5zZXRTaW11bGF0ZURpc3BsYXkodHJ1ZSkKLSAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLQotICAgICAgICBsYXVuY2hBY3Rpdml0eU9uRGlzcGxheShMQVVOQ0hJTkdfQUNUSVZJVFksIG5ld0Rpc3BsYXkubURpc3BsYXlJZCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIG5ldyBTdHJpbmdbXSB7TEFVTkNISU5HX0FDVElWSVRZfSk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgZmlyc3QgYWN0aXZpdHkgaXMgbGF1bmNoZWQgb250byB0aGUgc2Vjb25kYXJ5IGRpc3BsYXkKLSAgICAgICAgZmluYWwgaW50IGZyb250U3RhY2tJZCA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEZyb250U3RhY2tJZChuZXdEaXNwbGF5Lm1EaXNwbGF5SWQpOwotICAgICAgICBBY3Rpdml0eU1hbmFnZXJTdGF0ZS5BY3Rpdml0eVN0YWNrIGZyb250U3RhY2sgPQotICAgICAgICAgICAgICAgIG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFN0YWNrQnlJZChmcm9udFN0YWNrSWQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkFjdGl2aXR5IGxhdW5jaGVkIG9uIHNlY29uZGFyeSBkaXNwbGF5IG11c3QgYmUgcmVzdW1lZCIsCi0gICAgICAgICAgICAgICAgZ2V0QWN0aXZpdHlDb21wb25lbnROYW1lKExBVU5DSElOR19BQ1RJVklUWSksCi0gICAgICAgICAgICAgICAgZnJvbnRTdGFjay5tUmVzdW1lZEFjdGl2aXR5KTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkU3RhY2soIkZvY3VzIG11c3QgYmUgb24gc2Vjb25kYXJ5IGRpc3BsYXkiLCBmcm9udFN0YWNrSWQpOwotCi0gICAgICAgIC8vIExhdW5jaCBhbiBhY3Rpdml0eSBmcm9tIGEgZGlmZmVyZW50IFVJRCBpbnRvIHRoZSBmaXJzdCBhY3Rpdml0eSdzIHRhc2sKLSAgICAgICAgZ2V0TGF1bmNoQWN0aXZpdHlCdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAuc2V0VGFyZ2V0UGFja2FnZShTRUNPTkRfUEFDS0FHRV9OQU1FKQotICAgICAgICAgICAgICAgIC5zZXRUYXJnZXRBY3Rpdml0eU5hbWUoU0VDT05EX0FDVElWSVRZX05BTUUpLmV4ZWN1dGUoKTsKLQotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRTdGFjaygiRm9jdXMgbXVzdCBiZSBvbiBzZWNvbmRhcnkgZGlzcGxheSIsIGZyb250U3RhY2tJZCk7Ci0gICAgICAgIGZyb250U3RhY2sgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja0J5SWQoZnJvbnRTdGFja0lkKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkQWN0aXZpdHkoIkZvY3VzIG11c3QgYmUgb24gbmV3bHkgbGF1bmNoZWQgYXBwIiwKLSAgICAgICAgICAgICAgICBTRUNPTkRfUEFDS0FHRV9OQU1FLCBTRUNPTkRfQUNUSVZJVFlfTkFNRSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiU2Vjb25kYXJ5IGRpc3BsYXkgbXVzdCBjb250YWluIDEgdGFzayIsIDEsIGZyb250U3RhY2suZ2V0VGFza3MoKS5zaXplKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgdGhhdCBsYXVuY2hpbmcgZnJvbSBkaXNwbGF5IG93bmVyIGlzIGFsbG93ZWQgZXZlbiB3aGVuIHRoZSB0aGUgZGlzcGxheSBvd25lcgotICAgICAqIGRvZXNuJ3QgaGF2ZSBhbnl0aGluZyBvbiB0aGUgZGlzcGxheS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGVybWlzc2lvbkxhdW5jaEZyb21Pd25lcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIXN1cHBvcnRzTXVsdGlEaXNwbGF5KCkpIHsgcmV0dXJuOyB9Ci0KLSAgICAgICAgLy8gQ3JlYXRlIG5ldyB2aXJ0dWFsIGRpc3BsYXkuCi0gICAgICAgIGZpbmFsIERpc3BsYXlTdGF0ZSBuZXdEaXNwbGF5ID0gbmV3IFZpcnR1YWxEaXNwbGF5QnVpbGRlcih0aGlzKS5idWlsZCgpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoVklSVFVBTF9ESVNQTEFZX0FDVElWSVRZLCB0cnVlIC8qIHZpc2libGUgKi8pOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRBY3Rpdml0eSgiVmlydHVhbCBkaXNwbGF5IGFjdGl2aXR5IG11c3QgYmUgZm9jdXNlZCIsCi0gICAgICAgICAgICAgICAgVklSVFVBTF9ESVNQTEFZX0FDVElWSVRZKTsKLSAgICAgICAgZmluYWwgaW50IGRlZmF1bHREaXNwbGF5Rm9jdXNlZFN0YWNrSWQgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRGb2N1c2VkU3RhY2tJZCgpOwotICAgICAgICBBY3Rpdml0eU1hbmFnZXJTdGF0ZS5BY3Rpdml0eVN0YWNrIGZvY3VzZWRTdGFjawotICAgICAgICAgICAgICAgID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0U3RhY2tCeUlkKGRlZmF1bHREaXNwbGF5Rm9jdXNlZFN0YWNrSWQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkZvY3VzIG11c3QgcmVtYWluIG9uIHByaW1hcnkgZGlzcGxheSIsIERFRkFVTFRfRElTUExBWV9JRCwKLSAgICAgICAgICAgICAgICBmb2N1c2VkU3RhY2subURpc3BsYXlJZCk7Ci0KLSAgICAgICAgLy8gTGF1bmNoIG90aGVyIGFjdGl2aXR5IHdpdGggZGlmZmVyZW50IHVpZCBvbiBzZWNvbmRhcnkgZGlzcGxheS4KLSAgICAgICAgZmluYWwgU3RyaW5nIHN0YXJ0Q21kID0gICJhbSBzdGFydCAtbiAiICsgU0VDT05EX1BBQ0tBR0VfTkFNRSArICIvLiIgKyBTRUNPTkRfQUNUSVZJVFlfTkFNRTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGRpc3BsYXlUYXJnZXQgPSAiIC0tZGlzcGxheSAiICsgbmV3RGlzcGxheS5tRGlzcGxheUlkOwotICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKHN0YXJ0Q21kICsgZGlzcGxheVRhcmdldCk7Ci0KLSAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yVmFsaWRTdGF0ZShtRGV2aWNlLCBuZXcgU3RyaW5nW10ge1NFQ09ORF9BQ1RJVklUWV9OQU1FfSwKLSAgICAgICAgICAgICAgICBudWxsIC8qIHN0YWNrSWRzICovLCBmYWxzZSAvKiBjb21wYXJlVGFza0FuZFN0YWNrQm91bmRzICovLCBTRUNPTkRfUEFDS0FHRV9OQU1FKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkQWN0aXZpdHkoIkZvY3VzIG11c3QgYmUgb24gbmV3bHkgbGF1bmNoZWQgYXBwIiwKLSAgICAgICAgICAgICAgICBTRUNPTkRfUEFDS0FHRV9OQU1FLCBTRUNPTkRfQUNUSVZJVFlfTkFNRSk7Ci0gICAgICAgIGZpbmFsIGludCBleHRlcm5hbEZvY3VzZWRTdGFja0lkID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0Rm9jdXNlZFN0YWNrSWQoKTsKLSAgICAgICAgZm9jdXNlZFN0YWNrID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0U3RhY2tCeUlkKGV4dGVybmFsRm9jdXNlZFN0YWNrSWQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkZvY3VzZWQgc3RhY2sgbXVzdCBiZSBvbiBzZWNvbmRhcnkgZGlzcGxheSIsIG5ld0Rpc3BsYXkubURpc3BsYXlJZCwKLSAgICAgICAgICAgICAgICBmb2N1c2VkU3RhY2subURpc3BsYXlJZCk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgdGhhdCBvd25lciB1aWQgY2FuIGxhdW5jaCBpdHMgb3duIGFjdGl2aXR5IG9uIHNlY29uZGFyeSBkaXNwbGF5LgotICAgICAgICBmaW5hbCBTdHJpbmcgYnJvYWRjYXN0QWN0aW9uID0gY29tcG9uZW50TmFtZSArICIuTEFVTkNIX0JST0FEQ0FTVF9BQ1RJT04iOwotICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKCJhbSBicm9hZGNhc3QgLWEgIiArIGJyb2FkY2FzdEFjdGlvbiArICIgLXAgIiArIGNvbXBvbmVudE5hbWUKLSAgICAgICAgICAgICAgICArICIgLS1leiBsYXVuY2hfYWN0aXZpdHkgdHJ1ZSAtLWV6IG5ld190YXNrIHRydWUgLS1leiBtdWx0aXBsZV90YXNrIHRydWUiCi0gICAgICAgICAgICAgICAgKyAiIC0tZWkgZGlzcGxheV9pZCAiICsgbmV3RGlzcGxheS5tRGlzcGxheUlkKTsKLQotICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JWYWxpZFN0YXRlKG1EZXZpY2UsIFRFU1RfQUNUSVZJVFlfTkFNRSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZEFjdGl2aXR5KCJGb2N1cyBtdXN0IGJlIG9uIG5ld2x5IGxhdW5jaGVkIGFwcCIsIFRFU1RfQUNUSVZJVFlfTkFNRSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiQWN0aXZpdHkgbGF1bmNoZWQgYnkgb3duZXIgbXVzdCBiZSBvbiBleHRlcm5hbCBkaXNwbGF5IiwKLSAgICAgICAgICAgICAgICBleHRlcm5hbEZvY3VzZWRTdGFja0lkLCBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRGb2N1c2VkU3RhY2tJZCgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHRoYXQgbGF1bmNoaW5nIGZyb20gYXBwIHRoYXQgaXMgbm90IHByZXNlbnQgb24gZXh0ZXJuYWwgZGlzcGxheSBhbmQgZG9lc24ndCBvd24gaXQgdG8KLSAgICAgKiB0aGF0IGV4dGVybmFsIGRpc3BsYXkgaXMgbm90IGFsbG93ZWQuCi0gICAgICovCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjMuMi40L0MtMy0xIikKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGVybWlzc2lvbkxhdW5jaEZyb21EaWZmZXJlbnRBcHAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0c011bHRpRGlzcGxheSgpKSB7IHJldHVybjsgfQotCi0gICAgICAgIC8vIENyZWF0ZSBuZXcgdmlydHVhbCBkaXNwbGF5LgotICAgICAgICBmaW5hbCBEaXNwbGF5U3RhdGUgbmV3RGlzcGxheSA9IG5ldyBWaXJ0dWFsRGlzcGxheUJ1aWxkZXIodGhpcykuYnVpbGQoKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFZJUlRVQUxfRElTUExBWV9BQ1RJVklUWSwgdHJ1ZSAvKiB2aXNpYmxlICovKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkQWN0aXZpdHkoIlZpcnR1YWwgZGlzcGxheSBhY3Rpdml0eSBtdXN0IGJlIGZvY3VzZWQiLAotICAgICAgICAgICAgICAgIFZJUlRVQUxfRElTUExBWV9BQ1RJVklUWSk7Ci0gICAgICAgIGZpbmFsIGludCBkZWZhdWx0RGlzcGxheUZvY3VzZWRTdGFja0lkID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0Rm9jdXNlZFN0YWNrSWQoKTsKLSAgICAgICAgLy8gVGhlIGRlZmF1bHQgZGlzcGxheSBpZCBmb3IgYSAyZCBhY3Rpdml0eSBsYXVuY2ggaXMgdnIgdmlydHVhbCBkaXNwbGF5IGZvciBhIHZyIGhlYWRzZXQuCi0gICAgICAgIGludCBkaXNwbGF5SWQgPSBnZXRDdXJyZW50RGVmYXVsdERpc3BsYXlJZCgpOwotICAgICAgICBBY3Rpdml0eU1hbmFnZXJTdGF0ZS5BY3Rpdml0eVN0YWNrIGZvY3VzZWRTdGFjawotICAgICAgICAgICAgICAgID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0U3RhY2tCeUlkKGRlZmF1bHREaXNwbGF5Rm9jdXNlZFN0YWNrSWQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkZvY3VzIG11c3QgcmVtYWluIG9uIHRoZSBjb3JyZWN0IGRpc3BsYXkiLCBkaXNwbGF5SWQsCi0gICAgICAgICAgICAgICAgZm9jdXNlZFN0YWNrLm1EaXNwbGF5SWQpOwotCi0gICAgICAgIC8vIExhdW5jaCBhY3Rpdml0eSBvbiBuZXcgc2Vjb25kYXJ5IGRpc3BsYXkuCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5T25EaXNwbGF5KFRFU1RfQUNUSVZJVFlfTkFNRSwgbmV3RGlzcGxheS5tRGlzcGxheUlkKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkQWN0aXZpdHkoIkZvY3VzIG11c3QgYmUgb24gc2Vjb25kYXJ5IGRpc3BsYXkiLAotICAgICAgICAgICAgICAgIFRFU1RfQUNUSVZJVFlfTkFNRSk7Ci0gICAgICAgIGZpbmFsIGludCBleHRlcm5hbEZvY3VzZWRTdGFja0lkID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0Rm9jdXNlZFN0YWNrSWQoKTsKLSAgICAgICAgZm9jdXNlZFN0YWNrID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0U3RhY2tCeUlkKGV4dGVybmFsRm9jdXNlZFN0YWNrSWQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkZvY3VzZWQgc3RhY2sgbXVzdCBiZSBvbiBzZWNvbmRhcnkgZGlzcGxheSIsIG5ld0Rpc3BsYXkubURpc3BsYXlJZCwKLSAgICAgICAgICAgICAgICBmb2N1c2VkU3RhY2subURpc3BsYXlJZCk7Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIGxvZ1NlcGFyYXRvciA9IGNsZWFyTG9nY2F0KCk7Ci0KLSAgICAgICAgLy8gTGF1bmNoIG90aGVyIGFjdGl2aXR5IHdpdGggZGlmZmVyZW50IHVpZCBhbmQgY2hlY2sgc2VjdXJpdHkgZXhjZXB0aW9uIGlzIHRyaWdnZXJlZC4KLSAgICAgICAgZmluYWwgU3RyaW5nIGJyb2FkY2FzdEFjdGlvbiA9IFNFQ09ORF9QQUNLQUdFX05BTUUgKyAiLkxBVU5DSF9CUk9BRENBU1RfQUNUSU9OIjsKLSAgICAgICAgZmluYWwgU3RyaW5nIGluY2x1ZGVTdG9wcGVkUGFja2FnZXNGbGFnID0gIiAtZiAweDAwMDAwMDIwIjsKLSAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZCgiYW0gYnJvYWRjYXN0IC1hICIgKyBicm9hZGNhc3RBY3Rpb24gKyAiIC1wICIgKyBTRUNPTkRfUEFDS0FHRV9OQU1FCi0gICAgICAgICAgICAgICAgKyAiIC0tZWkgZGlzcGxheV9pZCAiICsgbmV3RGlzcGxheS5tRGlzcGxheUlkICsgaW5jbHVkZVN0b3BwZWRQYWNrYWdlc0ZsYWcpOwotCi0gICAgICAgIGFzc2VydFNlY3VyaXR5RXhjZXB0aW9uKCJMYXVuY2hCcm9hZGNhc3RSZWNlaXZlciIsIGxvZ1NlcGFyYXRvcik7Ci0KLSAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yVmFsaWRTdGF0ZShtRGV2aWNlLCBuZXcgU3RyaW5nW10ge1RFU1RfQUNUSVZJVFlfTkFNRX0sCi0gICAgICAgICAgICAgICAgbnVsbCAvKiBzdGFja0lkcyAqLywgZmFsc2UgLyogY29tcGFyZVRhc2tBbmRTdGFja0JvdW5kcyAqLywgY29tcG9uZW50TmFtZSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZEFjdGl2aXR5KAotICAgICAgICAgICAgICAgICJGb2N1cyBtdXN0IGJlIG9uIGZpcnN0IGFjdGl2aXR5IiwgY29tcG9uZW50TmFtZSwgVEVTVF9BQ1RJVklUWV9OQU1FKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJGb2N1c2VkIHN0YWNrIG11c3QgYmUgb24gc2Vjb25kYXJ5IGRpc3BsYXkncyBzdGFjayIsCi0gICAgICAgICAgICAgICAgZXh0ZXJuYWxGb2N1c2VkU3RhY2tJZCwgbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0Rm9jdXNlZFN0YWNrSWQoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydFNlY3VyaXR5RXhjZXB0aW9uKFN0cmluZyBjb21wb25lbnQsIFN0cmluZyBsb2dTZXBhcmF0b3IpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpbnQgdHJpZXMgPSAwOwotICAgICAgICBib29sZWFuIG1hdGNoID0gZmFsc2U7Ci0gICAgICAgIGZpbmFsIFBhdHRlcm4gcGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiLipTZWN1cml0eUV4Y2VwdGlvbiBsYXVuY2hpbmcgYWN0aXZpdHkuKiIpOwotICAgICAgICB3aGlsZSAodHJpZXMgPCA1ICYmICFtYXRjaCkgewotICAgICAgICAgICAgU3RyaW5nW10gbG9ncyA9IGdldERldmljZUxvZ3NGb3JDb21wb25lbnQoY29tcG9uZW50LCBsb2dTZXBhcmF0b3IpOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgbGluZSA6IGxvZ3MpIHsKLSAgICAgICAgICAgICAgICBNYXRjaGVyIG0gPSBwYXR0ZXJuLm1hdGNoZXIobGluZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG0ubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1hdGNoID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJpZXMrKzsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDUwMCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCBleGNlcHRpb24gbm90IGZvdW5kIiwgbWF0Y2gpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgdGhhdCBvbmx5IHByaXZhdGUgdmlydHVhbCBkaXNwbGF5IGNhbiBzaG93IGNvbnRlbnQgd2l0aCBpbnNlY3VyZSBrZXlndWFyZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmxhZ1Nob3dXaXRoSW5zZWN1cmVLZXlndWFyZE9uUHVibGljVmlydHVhbERpc3BsYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0c011bHRpRGlzcGxheSgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUcnkgdG8gY3JlYXRlIG5ldyBzaG93LXdpdGgtaW5zZWN1cmUta2V5Z3VhcmQgcHVibGljIHZpcnR1YWwgZGlzcGxheS4KLSAgICAgICAgZmluYWwgRGlzcGxheVN0YXRlIG5ld0Rpc3BsYXkgPSBuZXcgVmlydHVhbERpc3BsYXlCdWlsZGVyKHRoaXMpCi0gICAgICAgICAgICAgICAgLnNldFB1YmxpY0Rpc3BsYXkodHJ1ZSkKLSAgICAgICAgICAgICAgICAuc2V0Q2FuU2hvd1dpdGhJbnNlY3VyZUtleWd1YXJkKHRydWUpCi0gICAgICAgICAgICAgICAgLnNldE11c3RCZUNyZWF0ZWQoZmFsc2UpCi0gICAgICAgICAgICAgICAgLmJ1aWxkKCk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgZGlzcGxheSBpcyBub3QgY3JlYXRlZC4KLSAgICAgICAgYXNzZXJ0TnVsbChuZXdEaXNwbGF5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHRoYXQgYWxsIGFjdGl2aXRpZXMgdGhhdCB3ZXJlIG9uIHRoZSBwcml2YXRlIGRpc3BsYXkgYXJlIGRlc3Ryb3llZCBvbiBkaXNwbGF5IHJlbW92YWwuCi0gICAgICovCi0gICAgLy8gVE9ETzogRmxha3ksIGFkZCB0byBwcmVzdWJtaXQgd2hlbiBiLzYzNDA0NTc1IGlzIGZpeGVkLgotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSIzLjIuNC9DLTEtNCIpCi0gICAgcHVibGljIHZvaWQgdGVzdENvbnRlbnREZXN0cm95T25EaXNwbGF5UmVtb3ZlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIXN1cHBvcnRzTXVsdGlEaXNwbGF5KCkpIHsgcmV0dXJuOyB9Ci0KLSAgICAgICAgLy8gQ3JlYXRlIG5ldyBwcml2YXRlIHZpcnR1YWwgZGlzcGxheS4KLSAgICAgICAgZmluYWwgRGlzcGxheVN0YXRlIG5ld0Rpc3BsYXkgPSBuZXcgVmlydHVhbERpc3BsYXlCdWlsZGVyKHRoaXMpLmJ1aWxkKCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShWSVJUVUFMX0RJU1BMQVlfQUNUSVZJVFksIHRydWUgLyogdmlzaWJsZSAqLyk7Ci0KLSAgICAgICAgLy8gTGF1bmNoIGFjdGl2aXRpZXMgb24gbmV3IHNlY29uZGFyeSBkaXNwbGF5LgotICAgICAgICBsYXVuY2hBY3Rpdml0eU9uRGlzcGxheShURVNUX0FDVElWSVRZX05BTUUsIG5ld0Rpc3BsYXkubURpc3BsYXlJZCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShURVNUX0FDVElWSVRZX05BTUUsIHRydWUgLyogdmlzaWJsZSAqLyk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZEFjdGl2aXR5KCJMYXVuY2hlZCBhY3Rpdml0eSBtdXN0IGJlIGZvY3VzZWQiLCBURVNUX0FDVElWSVRZX05BTUUpOwotICAgICAgICBsYXVuY2hBY3Rpdml0eU9uRGlzcGxheShSRVNJWkVBQkxFX0FDVElWSVRZX05BTUUsIG5ld0Rpc3BsYXkubURpc3BsYXlJZCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShSRVNJWkVBQkxFX0FDVElWSVRZX05BTUUsIHRydWUgLyogdmlzaWJsZSAqLyk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZEFjdGl2aXR5KCJMYXVuY2hlZCBhY3Rpdml0eSBtdXN0IGJlIGZvY3VzZWQiLAotICAgICAgICAgICAgICAgIFJFU0laRUFCTEVfQUNUSVZJVFlfTkFNRSk7Ci0KLSAgICAgICAgLy8gRGVzdHJveSB0aGUgZGlzcGxheSBhbmQgY2hlY2sgaWYgYWN0aXZpdGllcyBhcmUgcmVtb3ZlZCBmcm9tIHN5c3RlbS4KLSAgICAgICAgZmluYWwgU3RyaW5nIGxvZ1NlcGFyYXRvciA9IGNsZWFyTG9nY2F0KCk7Ci0gICAgICAgIGRlc3Ryb3lWaXJ0dWFsRGlzcGxheXMoKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGFjdGl2aXR5TmFtZTEKLSAgICAgICAgICAgICAgICA9IEFjdGl2aXR5TWFuYWdlclRlc3RCYXNlLmdldEFjdGl2aXR5Q29tcG9uZW50TmFtZShURVNUX0FDVElWSVRZX05BTUUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgYWN0aXZpdHlOYW1lMgotICAgICAgICAgICAgICAgID0gQWN0aXZpdHlNYW5hZ2VyVGVzdEJhc2UuZ2V0QWN0aXZpdHlDb21wb25lbnROYW1lKFJFU0laRUFCTEVfQUNUSVZJVFlfTkFNRSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyB3aW5kb3dOYW1lMQotICAgICAgICAgICAgICAgID0gQWN0aXZpdHlNYW5hZ2VyVGVzdEJhc2UuZ2V0V2luZG93TmFtZShURVNUX0FDVElWSVRZX05BTUUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgd2luZG93TmFtZTIKLSAgICAgICAgICAgICAgICA9IEFjdGl2aXR5TWFuYWdlclRlc3RCYXNlLmdldFdpbmRvd05hbWUoUkVTSVpFQUJMRV9BQ1RJVklUWV9OQU1FKTsKLSAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yV2l0aEFtU3RhdGUobURldmljZSwKLSAgICAgICAgICAgICAgICAoc3RhdGUpIC0+ICFzdGF0ZS5jb250YWluc0FjdGl2aXR5KGFjdGl2aXR5TmFtZTEpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAhc3RhdGUuY29udGFpbnNBY3Rpdml0eShhY3Rpdml0eU5hbWUyKSwKLSAgICAgICAgICAgICAgICAiV2FpdGluZyBmb3IgYWN0aXZpdHkgdG8gYmUgcmVtb3ZlZCIpOwotICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JXaXRoV21TdGF0ZShtRGV2aWNlLAotICAgICAgICAgICAgICAgIChzdGF0ZSkgLT4gIXN0YXRlLmNvbnRhaW5zV2luZG93KHdpbmRvd05hbWUxKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXN0YXRlLmNvbnRhaW5zV2luZG93KHdpbmRvd05hbWUyKSwKLSAgICAgICAgICAgICAgICAiV2FpdGluZyBmb3IgYWN0aXZpdHkgd2luZG93IHRvIGJlIGdvbmUiKTsKLQotICAgICAgICAvLyBDaGVjayBBTSBzdGF0ZS4KLSAgICAgICAgYXNzZXJ0RmFsc2UoIkFjdGl2aXR5IGZyb20gcmVtb3ZlZCBkaXNwbGF5IG11c3QgYmUgZGVzdHJveWVkIiwKLSAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5jb250YWluc0FjdGl2aXR5KGFjdGl2aXR5TmFtZTEpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIkFjdGl2aXR5IGZyb20gcmVtb3ZlZCBkaXNwbGF5IG11c3QgYmUgZGVzdHJveWVkIiwKLSAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5jb250YWluc0FjdGl2aXR5KGFjdGl2aXR5TmFtZTIpKTsKLSAgICAgICAgLy8gQ2hlY2sgV00gc3RhdGUuCi0gICAgICAgIGFzc2VydEZhbHNlKCJBY3Rpdml0eSB3aW5kb3dzIGZyb20gcmVtb3ZlZCBkaXNwbGF5IG11c3QgYmUgZGVzdHJveWVkIiwKLSAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLmdldFdtU3RhdGUoKS5jb250YWluc1dpbmRvdyh3aW5kb3dOYW1lMSkpOwotICAgICAgICBhc3NlcnRGYWxzZSgiQWN0aXZpdHkgd2luZG93cyBmcm9tIHJlbW92ZWQgZGlzcGxheSBtdXN0IGJlIGRlc3Ryb3llZCIsCi0gICAgICAgICAgICAgICAgbUFtV21TdGF0ZS5nZXRXbVN0YXRlKCkuY29udGFpbnNXaW5kb3cod2luZG93TmFtZTIpKTsKLSAgICAgICAgLy8gQ2hlY2sgYWN0aXZpdHkgbG9ncy4KLSAgICAgICAgYXNzZXJ0QWN0aXZpdHlEZXN0cm95ZWQoVEVTVF9BQ1RJVklUWV9OQU1FLCBsb2dTZXBhcmF0b3IpOwotICAgICAgICBhc3NlcnRBY3Rpdml0eURlc3Ryb3llZChSRVNJWkVBQkxFX0FDVElWSVRZX05BTUUsIGxvZ1NlcGFyYXRvcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCB0aGF0IHRoZSB1cGRhdGUgb2YgZGlzcGxheSBtZXRyaWNzIHVwZGF0ZXMgYWxsIGl0cyBjb250ZW50LgotICAgICAqLwotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSIzLjIuNC9DLTEtNSIpCi0gICAgQFByZXN1Ym1pdAotICAgIHB1YmxpYyB2b2lkIHRlc3REaXNwbGF5UmVzaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghc3VwcG9ydHNNdWx0aURpc3BsYXkoKSkgeyByZXR1cm47IH0KLQotICAgICAgICAvLyBDcmVhdGUgbmV3IHZpcnR1YWwgZGlzcGxheS4KLSAgICAgICAgZmluYWwgRGlzcGxheVN0YXRlIG5ld0Rpc3BsYXkgPSBuZXcgVmlydHVhbERpc3BsYXlCdWlsZGVyKHRoaXMpLmJ1aWxkKCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShWSVJUVUFMX0RJU1BMQVlfQUNUSVZJVFksIHRydWUgLyogdmlzaWJsZSAqLyk7Ci0KLSAgICAgICAgLy8gTGF1bmNoIGEgcmVzaXplYWJsZSBhY3Rpdml0eSBvbiBuZXcgc2Vjb25kYXJ5IGRpc3BsYXkuCi0gICAgICAgIGZpbmFsIFN0cmluZyBpbml0aWFsTG9nU2VwYXJhdG9yID0gY2xlYXJMb2djYXQoKTsKLSAgICAgICAgbGF1bmNoQWN0aXZpdHlPbkRpc3BsYXkoUkVTSVpFQUJMRV9BQ1RJVklUWV9OQU1FLCBuZXdEaXNwbGF5Lm1EaXNwbGF5SWQpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoUkVTSVpFQUJMRV9BQ1RJVklUWV9OQU1FLCB0cnVlIC8qIHZpc2libGUgKi8pOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRBY3Rpdml0eSgiTGF1bmNoZWQgYWN0aXZpdHkgbXVzdCBiZSBmb2N1c2VkIiwKLSAgICAgICAgICAgICAgICBSRVNJWkVBQkxFX0FDVElWSVRZX05BTUUpOwotCi0gICAgICAgIC8vIEdyYWIgcmVwb3J0ZWQgc2l6ZXMgYW5kIGNvbXB1dGUgbmV3IHdpdGggc2xpZ2h0IHNpemUgY2hhbmdlLgotICAgICAgICBmaW5hbCBSZXBvcnRlZFNpemVzIGluaXRpYWxTaXplID0gZ2V0TGFzdFJlcG9ydGVkU2l6ZXNGb3JBY3Rpdml0eShSRVNJWkVBQkxFX0FDVElWSVRZX05BTUUsCi0gICAgICAgICAgICAgICAgaW5pdGlhbExvZ1NlcGFyYXRvcik7Ci0KLSAgICAgICAgLy8gUmVzaXplIHRoZSBkb2NrZWQgc3RhY2ssIHNvIHRoYXQgYWN0aXZpdHkgd2l0aCB2aXJ0dWFsIGRpc3BsYXkgd2lsbCBhbHNvIGJlIHJlc2l6ZWQuCi0gICAgICAgIGZpbmFsIFN0cmluZyBsb2dTZXBhcmF0b3IgPSBjbGVhckxvZ2NhdCgpOwotICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKGdldFJlc2l6ZVZpcnR1YWxEaXNwbGF5Q29tbWFuZCgpKTsKLQotICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JXaXRoQW1TdGF0ZShtRGV2aWNlLCBhbVN0YXRlIC0+IHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRDb25maWdDaGFuZ2VOdW1iZXIoUkVTSVpFQUJMRV9BQ1RJVklUWV9OQU1FLCBsb2dTZXBhcmF0b3IpID09IDEKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIGFtU3RhdGUuaGFzQWN0aXZpdHlTdGF0ZShSRVNJWkVBQkxFX0FDVElWSVRZX05BTUUsIFNUQVRFX1JFU1VNRUQpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBsb2dFKCJFcnJvciB3YWl0aW5nIGZvciB2YWxpZCBzdGF0ZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0sICJXYWl0IGZvciB0aGUgY29uZmlndXJhdGlvbiBjaGFuZ2UgdG8gaGFwcGVuIGFuZCBmb3IgYWN0aXZpdHkgdG8gYmUgcmVzdW1lZC4iKTsKLQotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCBuZXcgU3RyaW5nW10ge1JFU0laRUFCTEVfQUNUSVZJVFlfTkFNRSwKLSAgICAgICAgICAgICAgICBWSVJUVUFMX0RJU1BMQVlfQUNUSVZJVFl9LCBmYWxzZSAvKiBjb21wYXJlVGFza0FuZFN0YWNrQm91bmRzICovKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFZJUlRVQUxfRElTUExBWV9BQ1RJVklUWSwgdHJ1ZSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShSRVNJWkVBQkxFX0FDVElWSVRZX05BTUUsIHRydWUpOwotCi0gICAgICAgIC8vIENoZWNrIGlmIGFjdGl2aXR5IGluIHZpcnR1YWwgZGlzcGxheSB3YXMgcmVzaXplZCBwcm9wZXJseS4KLSAgICAgICAgYXNzZXJ0UmVsYXVuY2hPckNvbmZpZ0NoYW5nZWQoUkVTSVpFQUJMRV9BQ1RJVklUWV9OQU1FLCAwIC8qIG51bVJlbGF1bmNoICovLAotICAgICAgICAgICAgICAgIDEgLyogbnVtQ29uZmlnQ2hhbmdlICovLCBsb2dTZXBhcmF0b3IpOwotCi0gICAgICAgIGZpbmFsIFJlcG9ydGVkU2l6ZXMgdXBkYXRlZFNpemUgPSBnZXRMYXN0UmVwb3J0ZWRTaXplc0ZvckFjdGl2aXR5KFJFU0laRUFCTEVfQUNUSVZJVFlfTkFNRSwKLSAgICAgICAgICAgICAgICBsb2dTZXBhcmF0b3IpOwotICAgICAgICBhc3NlcnRUcnVlKHVwZGF0ZWRTaXplLndpZHRoRHAgPD0gaW5pdGlhbFNpemUud2lkdGhEcCk7Ci0gICAgICAgIGFzc2VydFRydWUodXBkYXRlZFNpemUuaGVpZ2h0RHAgPD0gaW5pdGlhbFNpemUuaGVpZ2h0RHApOwotICAgICAgICBhc3NlcnRUcnVlKHVwZGF0ZWRTaXplLmRpc3BsYXlXaWR0aCA9PSBpbml0aWFsU2l6ZS5kaXNwbGF5V2lkdGggLyAyKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh1cGRhdGVkU2l6ZS5kaXNwbGF5SGVpZ2h0ID09IGluaXRpYWxTaXplLmRpc3BsYXlIZWlnaHQgLyAyKTsKLSAgICB9Ci0KLSAgICAvKiogUmVhZCB0aGUgbnVtYmVyIG9mIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyBzZW50IHRvIGFjdGl2aXR5IGZyb20gbG9ncy4gKi8KLSAgICBwcml2YXRlIGludCByZWFkQ29uZmlnQ2hhbmdlTnVtYmVyKFN0cmluZyBhY3Rpdml0eU5hbWUsIFN0cmluZyBsb2dTZXBhcmF0b3IpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gKG5ldyBBY3Rpdml0eUxpZmVjeWNsZUNvdW50cyhhY3Rpdml0eU5hbWUsIGxvZ1NlcGFyYXRvcikpLm1Db25maWd1cmF0aW9uQ2hhbmdlZENvdW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoYXQgd2hlbiBhbiBhY3Rpdml0eSBpcyBsYXVuY2hlZCB3aXRoIGRpc3BsYXlJZCBzcGVjaWZpZWQgYW5kIHRoZXJlIGlzIGFuIGV4aXN0aW5nCi0gICAgICogbWF0Y2hpbmcgdGFzayBvbiBzb21lIG90aGVyIGRpc3BsYXkgLSB0aGF0IHRhc2sgd2lsbCBtb3ZlZCB0byB0aGUgdGFyZ2V0IGRpc3BsYXkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE1vdmVUb0Rpc3BsYXlPbkxhdW5jaCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIXN1cHBvcnRzTXVsdGlEaXNwbGF5KCkpIHsgcmV0dXJuOyB9Ci0KLSAgICAgICAgLy8gTGF1bmNoIGFjdGl2aXR5IHdpdGggdW5pcXVlIGFmZmluaXR5LCBzbyBpdCB3aWxsIHRoZSBvbmx5IG9uZSBpbiBpdHMgdGFzay4KLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoTEFVTkNISU5HX0FDVElWSVRZKTsKLQotICAgICAgICAvLyBDcmVhdGUgbmV3IHZpcnR1YWwgZGlzcGxheS4KLSAgICAgICAgZmluYWwgRGlzcGxheVN0YXRlIG5ld0Rpc3BsYXkgPSBuZXcgVmlydHVhbERpc3BsYXlCdWlsZGVyKHRoaXMpLmJ1aWxkKCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShWSVJUVUFMX0RJU1BMQVlfQUNUSVZJVFksIHRydWUgLyogdmlzaWJsZSAqLyk7Ci0gICAgICAgIGZpbmFsIGludCBkZWZhdWx0RGlzcGxheVN0YWNrSWQgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRGb2N1c2VkU3RhY2tJZCgpOwotICAgICAgICAvLyBMYXVuY2ggc29tZXRoaW5nIHRvIHRoYXQgZGlzcGxheSBzbyB0aGF0IGEgbmV3IHN0YWNrIGlzIGNyZWF0ZWQuIFdlIG5lZWQgdGhpcyB0byBiZSBhYmxlCi0gICAgICAgIC8vIHRvIGNvbXBhcmUgdGFzayBudW1iZXJzIGluIHN0YWNrcyBsYXRlci4KLSAgICAgICAgbGF1bmNoQWN0aXZpdHlPbkRpc3BsYXkoUkVTSVpFQUJMRV9BQ1RJVklUWV9OQU1FLCBuZXdEaXNwbGF5Lm1EaXNwbGF5SWQpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoUkVTSVpFQUJMRV9BQ1RJVklUWV9OQU1FLCB0cnVlIC8qIHZpc2libGUgKi8pOwotCi0gICAgICAgIGZpbmFsIGludCB0YXNrTnVtID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0U3RhY2tCeUlkKGRlZmF1bHREaXNwbGF5U3RhY2tJZCkKLSAgICAgICAgICAgICAgICAuZ2V0VGFza3MoKS5zaXplKCk7Ci0gICAgICAgIGZpbmFsIGludCBmcm9udFN0YWNrSWQgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRGcm9udFN0YWNrSWQobmV3RGlzcGxheS5tRGlzcGxheUlkKTsKLSAgICAgICAgZmluYWwgaW50IHRhc2tOdW1PblNlY29uZGFyeSA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFN0YWNrQnlJZChmcm9udFN0YWNrSWQpCi0gICAgICAgICAgICAgICAgLmdldFRhc2tzKCkuc2l6ZSgpOwotCi0gICAgICAgIC8vIExhdW5jaCBhY3Rpdml0eSBvbiBuZXcgc2Vjb25kYXJ5IGRpc3BsYXkuCi0gICAgICAgIC8vIFVzaW5nIGN1c3RvbSBjb21tYW5kIGhlcmUsIGJlY2F1c2Ugbm9ybWFsbHkgd2UgYWRkIGZsYWdzIEludGVudCNGTEFHX0FDVElWSVRZX05FV19UQVNLCi0gICAgICAgIC8vIGFuZCBJbnRlbnQjRkxBR19BQ1RJVklUWV9NVUxUSVBMRV9UQVNLIHdoZW4gbGF1bmNoaW5nIG9uIHNvbWUgc3BlY2lmaWMgZGlzcGxheS4gV2UgZG9uJ3QKLSAgICAgICAgLy8gZG8gaXQgaGVyZSBhcyB3ZSB3YW50IGFuIGV4aXN0aW5nIHRhc2sgdG8gYmUgdXNlZC4KLSAgICAgICAgZmluYWwgU3RyaW5nIGxhdW5jaENvbW1hbmQgPSAiYW0gc3RhcnQgLW4gIiArIGdldEFjdGl2aXR5Q29tcG9uZW50TmFtZShMQVVOQ0hJTkdfQUNUSVZJVFkpCi0gICAgICAgICAgICAgICAgKyAiIC0tZGlzcGxheSAiICsgbmV3RGlzcGxheS5tRGlzcGxheUlkOwotICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKGxhdW5jaENvbW1hbmQpOwotICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JBY3Rpdml0eVN0YXRlKG1EZXZpY2UsIExBVU5DSElOR19BQ1RJVklUWSwgU1RBVEVfUkVTVU1FRCk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgdGhhdCBhY3Rpdml0eSBpcyBicm91Z2h0IHRvIGZyb250LgotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRBY3Rpdml0eSgiRXhpc3RpbmcgdGFzayBtdXN0IGJlIGJyb3VnaHQgdG8gZnJvbnQiLAotICAgICAgICAgICAgICAgIExBVU5DSElOR19BQ1RJVklUWSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0UmVzdW1lZEFjdGl2aXR5KCJFeGlzdGluZyB0YXNrIG11c3QgYmUgcmVzdW1lZCIsIExBVU5DSElOR19BQ1RJVklUWSk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgdGhhdCBhY3Rpdml0eSBpcyBvbiB0aGUgcmlnaHQgZGlzcGxheS4KLSAgICAgICAgZmluYWwgQWN0aXZpdHlNYW5hZ2VyU3RhdGUuQWN0aXZpdHlTdGFjayBmaXJzdEZyb250U3RhY2sgPQotICAgICAgICAgICAgICAgIG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFN0YWNrQnlJZChmcm9udFN0YWNrSWQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkFjdGl2aXR5IG11c3QgYmUgbW92ZWQgdG8gdGhlIHNlY29uZGFyeSBkaXNwbGF5IiwKLSAgICAgICAgICAgICAgICBnZXRBY3Rpdml0eUNvbXBvbmVudE5hbWUoTEFVTkNISU5HX0FDVElWSVRZKSwgZmlyc3RGcm9udFN0YWNrLm1SZXN1bWVkQWN0aXZpdHkpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRTdGFjaygiRm9jdXMgbXVzdCBiZSBvbiBzZWNvbmRhcnkgZGlzcGxheSIsIGZyb250U3RhY2tJZCk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgdGhhdCB0YXNrIGhhcyBtb3ZlZCBmcm9tIHByaW1hcnkgZGlzcGxheSB0byBzZWNvbmRhcnkuCi0gICAgICAgIGZpbmFsIGludCB0YXNrTnVtRmluYWwgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja0J5SWQoZGVmYXVsdERpc3BsYXlTdGFja0lkKQotICAgICAgICAgICAgICAgIC5nZXRUYXNrcygpLnNpemUoKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRFcXVhbHMoIlRhc2sgbnVtYmVyIGluIGRlZmF1bHQgc3RhY2sgbXVzdCBiZSBkZWNyZW1lbnRlZC4iLCB0YXNrTnVtIC0gMSwKLSAgICAgICAgICAgICAgICB0YXNrTnVtRmluYWwpOwotICAgICAgICBmaW5hbCBpbnQgdGFza051bUZpbmFsT25TZWNvbmRhcnkgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja0J5SWQoZnJvbnRTdGFja0lkKQotICAgICAgICAgICAgICAgIC5nZXRUYXNrcygpLnNpemUoKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRFcXVhbHMoIlRhc2sgbnVtYmVyIGluIHN0YWNrIG9uIGV4dGVybmFsIGRpc3BsYXkgbXVzdCBiZSBpbmNyZW1lbnRlZC4iLAotICAgICAgICAgICAgICAgIHRhc2tOdW1PblNlY29uZGFyeSArIDEsIHRhc2tOdW1GaW5hbE9uU2Vjb25kYXJ5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGF0IHdoZW4gcHJpbWFyeSBkaXNwbGF5IGlzIHJvdGF0ZWQgc2Vjb25kYXJ5IGRpc3BsYXlzIGFyZSBub3QgYWZmZWN0ZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFJvdGF0aW9uTm90QWZmZWN0aW5nU2Vjb25kYXJ5U2NyZWVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghc3VwcG9ydHNNdWx0aURpc3BsYXkoKSkgeyByZXR1cm47IH0KLQotICAgICAgICAvLyBDcmVhdGUgbmV3IHZpcnR1YWwgZGlzcGxheS4KLSAgICAgICAgZmluYWwgRGlzcGxheVN0YXRlIG5ld0Rpc3BsYXkgPSBuZXcgVmlydHVhbERpc3BsYXlCdWlsZGVyKHRoaXMpCi0gICAgICAgICAgICAgICAgLnNldFJlc2l6ZURpc3BsYXkoZmFsc2UpCi0gICAgICAgICAgICAgICAgLmJ1aWxkKCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShWSVJUVUFMX0RJU1BMQVlfQUNUSVZJVFksIHRydWUgLyogdmlzaWJsZSAqLyk7Ci0KLSAgICAgICAgLy8gTGF1bmNoIGFjdGl2aXR5IG9uIG5ldyBzZWNvbmRhcnkgZGlzcGxheS4KLSAgICAgICAgU3RyaW5nIGxvZ1NlcGFyYXRvciA9IGNsZWFyTG9nY2F0KCk7Ci0gICAgICAgIGxhdW5jaEFjdGl2aXR5T25EaXNwbGF5KFJFU0laRUFCTEVfQUNUSVZJVFlfTkFNRSwgbmV3RGlzcGxheS5tRGlzcGxheUlkKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkQWN0aXZpdHkoIkZvY3VzIG11c3QgYmUgb24gc2Vjb25kYXJ5IGRpc3BsYXkiLAotICAgICAgICAgICAgICAgIFJFU0laRUFCTEVfQUNUSVZJVFlfTkFNRSk7Ci0gICAgICAgIGZpbmFsIFJlcG9ydGVkU2l6ZXMgaW5pdGlhbFNpemVzID0gZ2V0TGFzdFJlcG9ydGVkU2l6ZXNGb3JBY3Rpdml0eSgKLSAgICAgICAgICAgICAgICBSRVNJWkVBQkxFX0FDVElWSVRZX05BTUUsIGxvZ1NlcGFyYXRvcik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIlRlc3QgYWN0aXZpdHkgbXVzdCBoYXZlIHJlcG9ydGVkIGluaXRpYWwgc2l6ZXMgb24gbGF1bmNoIiwgaW5pdGlhbFNpemVzKTsKLQotICAgICAgICAvLyBSb3RhdGUgcHJpbWFyeSBkaXNwbGF5IGFuZCBjaGVjayB0aGF0IGFjdGl2aXR5IG9uIHNlY29uZGFyeSBkaXNwbGF5IGlzIG5vdCBhZmZlY3RlZC4KLSAgICAgICAgcm90YXRlQW5kQ2hlY2tTYW1lU2l6ZXMoUkVTSVpFQUJMRV9BQ1RJVklUWV9OQU1FKTsKLQotICAgICAgICAvLyBMYXVuY2ggYWN0aXZpdHkgdG8gc2Vjb25kYXJ5IGRpc3BsYXkgd2hlbiBwcmltYXJ5IG9uZSBpcyByb3RhdGVkLgotICAgICAgICBmaW5hbCBpbnQgaW5pdGlhbFJvdGF0aW9uID0gbUFtV21TdGF0ZS5nZXRXbVN0YXRlKCkuZ2V0Um90YXRpb24oKTsKLSAgICAgICAgc2V0RGV2aWNlUm90YXRpb24oKGluaXRpYWxSb3RhdGlvbiArIDEpICUgNCk7Ci0KLSAgICAgICAgbG9nU2VwYXJhdG9yID0gY2xlYXJMb2djYXQoKTsKLSAgICAgICAgbGF1bmNoQWN0aXZpdHlPbkRpc3BsYXkoVEVTVF9BQ1RJVklUWV9OQU1FLCBuZXdEaXNwbGF5Lm1EaXNwbGF5SWQpOwotICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JBY3Rpdml0eVN0YXRlKG1EZXZpY2UsIFRFU1RfQUNUSVZJVFlfTkFNRSwgU1RBVEVfUkVTVU1FRCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZEFjdGl2aXR5KCJGb2N1cyBtdXN0IGJlIG9uIHNlY29uZGFyeSBkaXNwbGF5IiwKLSAgICAgICAgICAgICAgICBURVNUX0FDVElWSVRZX05BTUUpOwotICAgICAgICBmaW5hbCBSZXBvcnRlZFNpemVzIHRlc3RBY3Rpdml0eVNpemVzID0gZ2V0TGFzdFJlcG9ydGVkU2l6ZXNGb3JBY3Rpdml0eSgKLSAgICAgICAgICAgICAgICBURVNUX0FDVElWSVRZX05BTUUsIGxvZ1NlcGFyYXRvcik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiU2l6ZXMgb2Ygc2Vjb25kYXJ5IGRpc3BsYXkgbXVzdCBub3QgY2hhbmdlIGFmdGVyIHJvdGF0aW9uIG9mIHByaW1hcnkgZGlzcGxheSIsCi0gICAgICAgICAgICAgICAgaW5pdGlhbFNpemVzLCB0ZXN0QWN0aXZpdHlTaXplcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJvdGF0ZUFuZENoZWNrU2FtZVNpemVzKFN0cmluZyBhY3Rpdml0eU5hbWUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmb3IgKGludCByb3RhdGlvbiA9IDM7IHJvdGF0aW9uID49IDA7IC0tcm90YXRpb24pIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsb2dTZXBhcmF0b3IgPSBjbGVhckxvZ2NhdCgpOwotICAgICAgICAgICAgc2V0RGV2aWNlUm90YXRpb24ocm90YXRpb24pOwotICAgICAgICAgICAgZmluYWwgUmVwb3J0ZWRTaXplcyByb3RhdGVkU2l6ZXMgPSBnZXRMYXN0UmVwb3J0ZWRTaXplc0ZvckFjdGl2aXR5KGFjdGl2aXR5TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgbG9nU2VwYXJhdG9yKTsKLSAgICAgICAgICAgIGFzc2VydE51bGwoIlNpemVzIG11c3Qgbm90IGNoYW5nZSBhZnRlciByb3RhdGlvbiIsIHJvdGF0ZWRTaXplcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGF0IHRhc2sgYWZmaW5pdHkgZG9lcyBhZmZlY3Qgd2hhdCBkaXNwbGF5IGFuIGFjdGl2aXR5IGlzIGxhdW5jaGVkIG9uIGJ1dCB0aGF0Ci0gICAgICogbWF0Y2hpbmcgdGhlIHRhc2sgY29tcG9uZW50IHJvb3QgZG9lcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VGFza01hdGNoQWNyb3NzRGlzcGxheXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0c011bHRpRGlzcGxheSgpKSB7IHJldHVybjsgfQotCi0gICAgICAgIGZpbmFsIERpc3BsYXlTdGF0ZSBuZXdEaXNwbGF5ID0gbmV3IFZpcnR1YWxEaXNwbGF5QnVpbGRlcih0aGlzKS5idWlsZCgpOwotCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5T25EaXNwbGF5KExBVU5DSElOR19BQ1RJVklUWSwgbmV3RGlzcGxheS5tRGlzcGxheUlkKTsKLSAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwgbmV3IFN0cmluZ1tdIHtMQVVOQ0hJTkdfQUNUSVZJVFl9KTsKLQotICAgICAgICAvLyBDaGVjayB0aGF0IGFjdGl2aXR5IGlzIG9uIHRoZSByaWdodCBkaXNwbGF5LgotICAgICAgICBmaW5hbCBpbnQgZnJvbnRTdGFja0lkID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0RnJvbnRTdGFja0lkKG5ld0Rpc3BsYXkubURpc3BsYXlJZCk7Ci0gICAgICAgIGZpbmFsIEFjdGl2aXR5TWFuYWdlclN0YXRlLkFjdGl2aXR5U3RhY2sgZmlyc3RGcm9udFN0YWNrID0KLSAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja0J5SWQoZnJvbnRTdGFja0lkKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJBY3Rpdml0eSBsYXVuY2hlZCBvbiBzZWNvbmRhcnkgZGlzcGxheSBtdXN0IGJlIHJlc3VtZWQiLAotICAgICAgICAgICAgICAgIGdldEFjdGl2aXR5Q29tcG9uZW50TmFtZShMQVVOQ0hJTkdfQUNUSVZJVFkpLCBmaXJzdEZyb250U3RhY2subVJlc3VtZWRBY3Rpdml0eSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZFN0YWNrKCJGb2N1cyBtdXN0IGJlIG9uIHNlY29uZGFyeSBkaXNwbGF5IiwgZnJvbnRTdGFja0lkKTsKLQotICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKCJhbSBzdGFydCAtbiAiICsgZ2V0QWN0aXZpdHlDb21wb25lbnROYW1lKEFMVF9MQVVOQ0hJTkdfQUNUSVZJVFkpKTsKLSAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yVmFsaWRTdGF0ZShtRGV2aWNlLCBuZXcgU3RyaW5nW10ge0FMVF9MQVVOQ0hJTkdfQUNUSVZJVFl9LAotICAgICAgICAgICAgICAgIG51bGwgLyogc3RhY2tJZHMgKi8sIGZhbHNlIC8qIGNvbXBhcmVUYXNrQW5kU3RhY2tCb3VuZHMgKi8sIGNvbXBvbmVudE5hbWUpOwotCi0gICAgICAgIC8vIFRoZSBkZWZhdWx0IGRpc3BsYXkgaWQgZm9yIGEgMmQgYWN0aXZpdHkgbGF1bmNoIGlzIHZyIHZpcnR1YWwgZGlzcGxheSBmb3IgYSB2ciBoZWFkc2V0LgotICAgICAgICBmaW5hbCBpbnQgZGlzcGxheUlkID0gZ2V0Q3VycmVudERlZmF1bHREaXNwbGF5SWQoKTsKLSAgICAgICAgLy8gQ2hlY2sgdGhhdCBzZWNvbmQgYWN0aXZpdHkgZ2V0cyBsYXVuY2hlZCBvbiB0aGUgY29ycmVjdCBkaXNwbGF5Ci0gICAgICAgIGZpbmFsIGludCBkZWZhdWx0RGlzcGxheUZyb250U3RhY2tJZCA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEZyb250U3RhY2tJZCgKLSAgICAgICAgICAgICAgICBkaXNwbGF5SWQpOwotICAgICAgICBmaW5hbCBBY3Rpdml0eU1hbmFnZXJTdGF0ZS5BY3Rpdml0eVN0YWNrIGRlZmF1bHREaXNwbGF5RnJvbnRTdGFjayA9Ci0gICAgICAgICAgICAgICAgbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0U3RhY2tCeUlkKGRlZmF1bHREaXNwbGF5RnJvbnRTdGFja0lkKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJBY3Rpdml0eSBsYXVuY2hlZCBvbiBkZWZhdWx0IGRpc3BsYXkgbXVzdCBiZSByZXN1bWVkIiwKLSAgICAgICAgICAgICAgICBnZXRBY3Rpdml0eUNvbXBvbmVudE5hbWUoQUxUX0xBVU5DSElOR19BQ1RJVklUWSksCi0gICAgICAgICAgICAgICAgZGVmYXVsdERpc3BsYXlGcm9udFN0YWNrLm1SZXN1bWVkQWN0aXZpdHkpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRTdGFjaygiRm9jdXMgbXVzdCBiZSBvbiBwcmltYXJ5IGRpc3BsYXkiLAotICAgICAgICAgICAgICAgIGRlZmF1bHREaXNwbGF5RnJvbnRTdGFja0lkKTsKLQotICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKCJhbSBzdGFydCAtbiAiICsgZ2V0QWN0aXZpdHlDb21wb25lbnROYW1lKExBVU5DSElOR19BQ1RJVklUWSkpOwotICAgICAgICBmaW5hbCBpbnQgc3RhY2tJZCA9IG1WckhlYWRzZXQgPyBkZWZhdWx0RGlzcGxheUZyb250U3RhY2tJZCA6IGZyb250U3RhY2tJZDsKLSAgICAgICAgZmluYWwgaW50IGZvY3VzZWRTdGFja1Rhc2tDb3VudCA9IG1WckhlYWRzZXQgPyAzIDogMTsKLSAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yRm9jdXNlZFN0YWNrKG1EZXZpY2UsIHN0YWNrSWQpOwotCi0gICAgICAgIC8vIENoZWNrIHRoYXQgdGhlIHRoaXJkIGludGVudCBpcyByZWRpcmVjdGVkIHRvIHRoZSBmaXJzdCB0YXNrCi0gICAgICAgIGZpbmFsIEFjdGl2aXR5TWFuYWdlclN0YXRlLkFjdGl2aXR5U3RhY2sgc2Vjb25kRnJvbnRTdGFjawotICAgICAgICAgICAgICAgID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0U3RhY2tCeUlkKHN0YWNrSWQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkFjdGl2aXR5IGxhdW5jaGVkIG9uIGRlZmF1bHQgZGlzcGxheSBtdXN0IGJlIHJlc3VtZWQiLAotICAgICAgICAgICAgICAgIGdldEFjdGl2aXR5Q29tcG9uZW50TmFtZShMQVVOQ0hJTkdfQUNUSVZJVFkpLCBzZWNvbmRGcm9udFN0YWNrLm1SZXN1bWVkQWN0aXZpdHkpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRTdGFjaygiRm9jdXMgbXVzdCBiZSBvbiBwcmltYXJ5IGRpc3BsYXkiLCBzdGFja0lkKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJGb2N1c2VkIHN0YWNrIG11c3QgY29udGFpbiBjb3JyZWN0IHRhc2tzIiwKLSAgICAgICAgICAgICAgICBmb2N1c2VkU3RhY2tUYXNrQ291bnQsIHNlY29uZEZyb250U3RhY2suZ2V0VGFza3MoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkZvY3VzZWQgdGFzayBtdXN0IG9ubHkgY29udGFpbiAxIGFjdGl2aXR5IiwKLSAgICAgICAgICAgICAgICAxLCBzZWNvbmRGcm9udFN0YWNrLmdldFRhc2tzKCkuZ2V0KDApLm1BY3Rpdml0aWVzLnNpemUoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhhbiBhIG5ldyB0YXNrIGxhdW5jaGVkIGJ5IGFuIGFjdGl2aXR5IHdpbGwgZW5kIHVwIG9uIHRoYXQgYWN0aXZpdHkncyBkaXNwbGF5Ci0gICAgICogZXZlbiBpZiB0aGUgZm9jdXNlZCBzdGFjayBpcyBub3Qgb24gdGhhdCBhY3Rpdml0eSdzIGRpc3BsYXkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE5ld1Rhc2tTYW1lRGlzcGxheSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIXN1cHBvcnRzTXVsdGlEaXNwbGF5KCkpIHsgcmV0dXJuOyB9Ci0KLSAgICAgICAgZmluYWwgRGlzcGxheVN0YXRlIG5ld0Rpc3BsYXkgPSBuZXcgVmlydHVhbERpc3BsYXlCdWlsZGVyKHRoaXMpLnNldFNpbXVsYXRlRGlzcGxheSh0cnVlKQotICAgICAgICAgICAgICAgIC5idWlsZCgpOwotCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5T25EaXNwbGF5KEJST0FEQ0FTVF9SRUNFSVZFUl9BQ1RJVklUWSwgbmV3RGlzcGxheS5tRGlzcGxheUlkKTsKLSAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwgbmV3IFN0cmluZ1tdIHtCUk9BRENBU1RfUkVDRUlWRVJfQUNUSVZJVFl9KTsKLQotICAgICAgICAvLyBDaGVjayB0aGF0IHRoZSBmaXJzdCBhY3Rpdml0eSBpcyBsYXVuY2hlZCBvbnRvIHRoZSBzZWNvbmRhcnkgZGlzcGxheQotICAgICAgICBmaW5hbCBpbnQgZnJvbnRTdGFja0lkID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0RnJvbnRTdGFja0lkKG5ld0Rpc3BsYXkubURpc3BsYXlJZCk7Ci0gICAgICAgIGZpbmFsIEFjdGl2aXR5TWFuYWdlclN0YXRlLkFjdGl2aXR5U3RhY2sgZmlyc3RGcm9udFN0YWNrID0KLSAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja0J5SWQoZnJvbnRTdGFja0lkKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJBY3Rpdml0eSBsYXVuY2hlZCBvbiBzZWNvbmRhcnkgZGlzcGxheSBtdXN0IGJlIHJlc3VtZWQiLAotICAgICAgICAgICAgICAgIGdldEFjdGl2aXR5Q29tcG9uZW50TmFtZShCUk9BRENBU1RfUkVDRUlWRVJfQUNUSVZJVFkpLAotICAgICAgICAgICAgICAgIGZpcnN0RnJvbnRTdGFjay5tUmVzdW1lZEFjdGl2aXR5KTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkU3RhY2soIkZvY3VzIG11c3QgYmUgb24gc2Vjb25kYXJ5IGRpc3BsYXkiLCBmcm9udFN0YWNrSWQpOwotCi0gICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoImFtIHN0YXJ0IC1uICIgKyBnZXRBY3Rpdml0eUNvbXBvbmVudE5hbWUoVEVTVF9BQ1RJVklUWV9OQU1FKSk7Ci0gICAgICAgIG1BbVdtU3RhdGUud2FpdEZvclZhbGlkU3RhdGUobURldmljZSwgbmV3IFN0cmluZ1tdIHtURVNUX0FDVElWSVRZX05BTUV9LAotICAgICAgICAgICAgICAgIG51bGwgLyogc3RhY2tJZHMgKi8sIGZhbHNlIC8qIGNvbXBhcmVUYXNrQW5kU3RhY2tCb3VuZHMgKi8sIGNvbXBvbmVudE5hbWUpOwotCi0gICAgICAgIC8vIENoZWNrIHRoYXQgdGhlIHNlY29uZCBhY3Rpdml0eSBpcyBsYXVuY2hlZCBvbiB0aGUgZGVmYXVsdCBkaXNwbGF5Ci0gICAgICAgIGZpbmFsIGludCBmb2N1c2VkU3RhY2tJZCA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEZvY3VzZWRTdGFja0lkKCk7Ci0gICAgICAgIGZpbmFsIEFjdGl2aXR5TWFuYWdlclN0YXRlLkFjdGl2aXR5U3RhY2sgZm9jdXNlZFN0YWNrCi0gICAgICAgICAgICAgICAgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja0J5SWQoZm9jdXNlZFN0YWNrSWQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkFjdGl2aXR5IGxhdW5jaGVkIG9uIGRlZmF1bHQgZGlzcGxheSBtdXN0IGJlIHJlc3VtZWQiLAotICAgICAgICAgICAgICAgIGdldEFjdGl2aXR5Q29tcG9uZW50TmFtZShURVNUX0FDVElWSVRZX05BTUUpLCBmb2N1c2VkU3RhY2subVJlc3VtZWRBY3Rpdml0eSk7Ci0gICAgICAgIC8vIFRoZSBkZWZhdWx0IGRpc3BsYXkgaWQgZm9yIGEgMmQgYWN0aXZpdHkgbGF1bmNoIGlzIHZyIHZpcnR1YWwgZGlzcGxheSBmb3IgYSB2ciBoZWFkc2V0LgotICAgICAgICBpbnQgZGlzcGxheUlkID0gZ2V0Q3VycmVudERlZmF1bHREaXNwbGF5SWQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJGb2N1cyBtdXN0IGJlIG9uIHRoZSBjb3JyZWN0IGRpc3BsYXkiLCBkaXNwbGF5SWQsCi0gICAgICAgICAgICAgICAgZm9jdXNlZFN0YWNrLm1EaXNwbGF5SWQpOwotCi0gICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoImFtIGJyb2FkY2FzdCAtYSB0cmlnZ2VyX2Jyb2FkY2FzdCAtLWV6IGxhdW5jaF9hY3Rpdml0eSB0cnVlICIKLSAgICAgICAgICAgICAgICArICItLWV6IG5ld190YXNrIHRydWUgLS1lcyB0YXJnZXRfYWN0aXZpdHkgIiArIExBVU5DSElOR19BQ1RJVklUWSk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgdGhpcmQgYWN0aXZpdHkgZW5kcyB1cCBpbiBhIG5ldyB0YXNrIGluIHRoZSBzYW1lIHN0YWNrIGFzIHRoZQotICAgICAgICAvLyBmaXJzdCBhY3Rpdml0eSAodGhlIGRpc3BsYXkgc2hvdWxkIGJlIG5ld0Rpc3BsYXkubURpc3BsYXlJZCkuCi0gICAgICAgIGRpc3BsYXlJZCA9IG1WckhlYWRzZXQgPyBtVnJWaXJ0dWFsRGlzcGxheUlkIDogbmV3RGlzcGxheS5tRGlzcGxheUlkOwotICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JWYWxpZFN0YXRlKG1EZXZpY2UsIG5ldyBTdHJpbmdbXSB7TEFVTkNISU5HX0FDVElWSVRZfSwKLSAgICAgICAgICAgICAgICBudWxsIC8qIHN0YWNrSWRzICovLCBmYWxzZSAvKiBjb21wYXJlVGFza0FuZFN0YWNrQm91bmRzICovLCBjb21wb25lbnROYW1lKTsKLQotICAgICAgICBpbnQgc3RhY2tJZCA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEZyb250U3RhY2tJZChkaXNwbGF5SWQpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRTdGFjaygiRm9jdXMgbXVzdCBiZSBvbiBzZWNvbmRhcnkgZGlzcGxheSIsIHN0YWNrSWQpOwotICAgICAgICBmaW5hbCBBY3Rpdml0eU1hbmFnZXJTdGF0ZS5BY3Rpdml0eVN0YWNrIHNlY29uZEZyb250U3RhY2sgPQotICAgICAgICAgICAgICAgIG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFN0YWNrQnlJZChzdGFja0lkKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJBY3Rpdml0eSBtdXN0IGJlIGxhdW5jaGVkIG9uIHNlY29uZGFyeSBkaXNwbGF5IiwKLSAgICAgICAgICAgICAgICBnZXRBY3Rpdml0eUNvbXBvbmVudE5hbWUoTEFVTkNISU5HX0FDVElWSVRZKSwKLSAgICAgICAgICAgICAgICBzZWNvbmRGcm9udFN0YWNrLm1SZXN1bWVkQWN0aXZpdHkpOwotICAgICAgICBmaW5hbCBpbnQgdGFza0NvdW50ID0gbVZySGVhZHNldCA/IDMgOiAyOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlNlY29uZGFyeSBkaXNwbGF5IG11c3QgY29udGFpbiBjb3JyZWN0IHRhc2tzIiwKLSAgICAgICAgICAgICAgICB0YXNrQ291bnQsIHNlY29uZEZyb250U3RhY2suZ2V0VGFza3MoKS5zaXplKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgdGhhdCBkaXNwbGF5IG92ZXJyaWRlcyBhcHBseSBjb3JyZWN0bHkgYW5kIHdvbid0IGJlIGFmZmVjdGVkIGJ5IGRpc3BsYXkgY2hhbmdlcy4KLSAgICAgKiBUaGlzIHNldHMgb3ZlcnJpZGVzIHRvIGRpc3BsYXkgc2l6ZSBhbmQgZGVuc2l0eSwgaW5pdGlhdGVzIGEgZGlzcGxheSBjaGFuZ2VkIGV2ZW50IGJ5IGxvY2tpbmcKLSAgICAgKiBhbmQgdW5sb2NraW5nIHRoZSBwaG9uZSBhbmQgdmVyaWZpZXMgdGhhdCBvdmVycmlkZXMgYXJlIGtlcHQuCi0gICAgICovCi0gICAgQFByZXN1Ym1pdAotICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JjZURpc3BsYXlNZXRyaWNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGxhdW5jaEhvbWVBY3Rpdml0eSgpOwotCi0gICAgICAgIC8vIFJlYWQgaW5pdGlhbCBzaXplcy4KLSAgICAgICAgZmluYWwgUmVwb3J0ZWREaXNwbGF5TWV0cmljcyBvcmlnaW5hbERpc3BsYXlNZXRyaWNzID0gZ2V0RGlzcGxheU1ldHJpY3MoKTsKLQotICAgICAgICAvLyBBcHBseSBuZXcgb3ZlcnJpZGUgdmFsdWVzIHRoYXQgZG9uJ3QgbWF0Y2ggdGhlIHBoeXNpY2FsIG1ldHJpY3MuCi0gICAgICAgIGZpbmFsIGludCBvdmVycmlkZVdpZHRoID0gKGludCkgKG9yaWdpbmFsRGlzcGxheU1ldHJpY3MucGh5c2ljYWxXaWR0aCAqIDEuNSk7Ci0gICAgICAgIGZpbmFsIGludCBvdmVycmlkZUhlaWdodCA9IChpbnQpIChvcmlnaW5hbERpc3BsYXlNZXRyaWNzLnBoeXNpY2FsSGVpZ2h0ICogMS41KTsKLSAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChXTV9TSVpFICsgIiAiICsgb3ZlcnJpZGVXaWR0aCArICJ4IiArIG92ZXJyaWRlSGVpZ2h0KTsKLSAgICAgICAgZmluYWwgaW50IG92ZXJyaWRlRGVuc2l0eSA9IChpbnQpIChvcmlnaW5hbERpc3BsYXlNZXRyaWNzLnBoeXNpY2FsRGVuc2l0eSAqIDEuMSk7Ci0gICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoV01fREVOU0lUWSArICIgIiArIG92ZXJyaWRlRGVuc2l0eSk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgaWYgb3ZlcnJpZGVzIGFwcGxpZWQgY29ycmVjdGx5LgotICAgICAgICBSZXBvcnRlZERpc3BsYXlNZXRyaWNzIGRpc3BsYXlNZXRyaWNzID0gZ2V0RGlzcGxheU1ldHJpY3MoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG92ZXJyaWRlV2lkdGgsIGRpc3BsYXlNZXRyaWNzLm92ZXJyaWRlV2lkdGgpOwotICAgICAgICBhc3NlcnRFcXVhbHMob3ZlcnJpZGVIZWlnaHQsIGRpc3BsYXlNZXRyaWNzLm92ZXJyaWRlSGVpZ2h0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG92ZXJyaWRlRGVuc2l0eSwgZGlzcGxheU1ldHJpY3Mub3ZlcnJpZGVEZW5zaXR5KTsKLQotICAgICAgICAvLyBMb2NrIGFuZCB1bmxvY2sgZGV2aWNlLiBUaGlzIHdpbGwgY2F1c2UgYSBESVNQTEFZX0NIQU5HRUQgZXZlbnQgdG8gYmUgdHJpZ2dlcmVkIGFuZAotICAgICAgICAvLyBtaWdodCB1cGRhdGUgdGhlIG1ldHJpY3MuCi0gICAgICAgIHNsZWVwRGV2aWNlKCk7Ci0gICAgICAgIHdha2VVcEFuZFVubG9ja0RldmljZSgpOwotICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JIb21lQWN0aXZpdHlWaXNpYmxlKG1EZXZpY2UpOwotCi0gICAgICAgIC8vIENoZWNrIGlmIG92ZXJyaWRlcyBhcmUgc3RpbGwgYXBwbGllZC4KLSAgICAgICAgZGlzcGxheU1ldHJpY3MgPSBnZXREaXNwbGF5TWV0cmljcygpOwotICAgICAgICBhc3NlcnRFcXVhbHMob3ZlcnJpZGVXaWR0aCwgZGlzcGxheU1ldHJpY3Mub3ZlcnJpZGVXaWR0aCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhvdmVycmlkZUhlaWdodCwgZGlzcGxheU1ldHJpY3Mub3ZlcnJpZGVIZWlnaHQpOwotICAgICAgICBhc3NlcnRFcXVhbHMob3ZlcnJpZGVEZW5zaXR5LCBkaXNwbGF5TWV0cmljcy5vdmVycmlkZURlbnNpdHkpOwotCi0gICAgICAgIC8vIEFsbCBvdmVycmlkZXMgd2lsbCBiZSBjbGVhcmVkIGluIHRlYXJEb3duLgotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoYW4gYW4gaW1tZWRpYXRlIGxhdW5jaCBhZnRlciBuZXcgZGlzcGxheSBjcmVhdGlvbiBpcyBoYW5kbGVkIGNvcnJlY3RseS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW1tZWRpYXRlTGF1bmNoT25OZXdEaXNwbGF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghc3VwcG9ydHNNdWx0aURpc3BsYXkoKSkgeyByZXR1cm47IH0KLQotICAgICAgICAvLyBDcmVhdGUgbmV3IHZpcnR1YWwgZGlzcGxheSBhbmQgaW1tZWRpYXRlbHkgbGF1bmNoIGFuIGFjdGl2aXR5IG9uIGl0LgotICAgICAgICBmaW5hbCBEaXNwbGF5U3RhdGUgbmV3RGlzcGxheSA9IG5ldyBWaXJ0dWFsRGlzcGxheUJ1aWxkZXIodGhpcykKLSAgICAgICAgICAgICAgICAuc2V0TGF1bmNoQWN0aXZpdHkoVEVTVF9BQ1RJVklUWV9OQU1FKS5idWlsZCgpOwotCi0gICAgICAgIC8vIENoZWNrIHRoYXQgYWN0aXZpdHkgaXMgbGF1bmNoZWQgYW5kIHBsYWNlZCBjb3JyZWN0bHkuCi0gICAgICAgIG1BbVdtU3RhdGUud2FpdEZvckFjdGl2aXR5U3RhdGUobURldmljZSwgVEVTVF9BQ1RJVklUWV9OQU1FLCBTVEFURV9SRVNVTUVEKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRSZXN1bWVkQWN0aXZpdHkoIlRlc3QgYWN0aXZpdHkgbXVzdCBiZSBsYXVuY2hlZCBvbiBhIG5ldyBkaXNwbGF5IiwKLSAgICAgICAgICAgICAgICBURVNUX0FDVElWSVRZX05BTUUpOwotICAgICAgICBmaW5hbCBpbnQgZnJvbnRTdGFja0lkID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0RnJvbnRTdGFja0lkKG5ld0Rpc3BsYXkubURpc3BsYXlJZCk7Ci0gICAgICAgIGZpbmFsIEFjdGl2aXR5TWFuYWdlclN0YXRlLkFjdGl2aXR5U3RhY2sgZmlyc3RGcm9udFN0YWNrID0KLSAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja0J5SWQoZnJvbnRTdGFja0lkKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJBY3Rpdml0eSBsYXVuY2hlZCBvbiBzZWNvbmRhcnkgZGlzcGxheSBtdXN0IGJlIHJlc3VtZWQiLAotICAgICAgICAgICAgICAgIGdldEFjdGl2aXR5Q29tcG9uZW50TmFtZShURVNUX0FDVElWSVRZX05BTUUpLCBmaXJzdEZyb250U3RhY2subVJlc3VtZWRBY3Rpdml0eSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZFN0YWNrKCJGb2N1cyBtdXN0IGJlIG9uIHNlY29uZGFyeSBkaXNwbGF5IiwgZnJvbnRTdGFja0lkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGF0IHR1cm5pbmcgdGhlIHByaW1hcnkgZGlzcGxheSBvZmYgZG9lcyBub3QgYWZmZWN0IHRoZSBhY3Rpdml0eSBydW5uaW5nCi0gICAgICogb24gYW4gZXh0ZXJuYWwgc2Vjb25kYXJ5IGRpc3BsYXkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEV4dGVybmFsRGlzcGxheUFjdGl2aXR5VHVyblByaW1hcnlPZmYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0c011bHRpRGlzcGxheSgpKSB7IHJldHVybjsgfQotCi0gICAgICAgIC8vIExhdW5jaCBzb21ldGhpbmcgb24gdGhlIHByaW1hcnkgZGlzcGxheSBzbyB3ZSBrbm93IHRoZXJlIGlzIGEgcmVzdW1lZCBhY3Rpdml0eSB0aGVyZQotICAgICAgICBsYXVuY2hBY3Rpdml0eShSRVNJWkVBQkxFX0FDVElWSVRZX05BTUUpOwotICAgICAgICB3YWl0QW5kQXNzZXJ0QWN0aXZpdHlSZXN1bWVkKFJFU0laRUFCTEVfQUNUSVZJVFlfTkFNRSwgREVGQVVMVF9ESVNQTEFZX0lELAotICAgICAgICAgICAgICAgICJBY3Rpdml0eSBsYXVuY2hlZCBvbiBwcmltYXJ5IGRpc3BsYXkgbXVzdCBiZSByZXN1bWVkIik7Ci0KLSAgICAgICAgZmluYWwgRGlzcGxheVN0YXRlIG5ld0Rpc3BsYXkgPSBjcmVhdGVFeHRlcm5hbFZpcnR1YWxEaXNwbGF5KAotICAgICAgICAgICAgICAgIHRydWUgLyogc2hvd0NvbnRlbnRXaGVuTG9ja2VkICovKTsKLQotICAgICAgICBsYXVuY2hBY3Rpdml0eU9uRGlzcGxheShURVNUX0FDVElWSVRZX05BTUUsIG5ld0Rpc3BsYXkubURpc3BsYXlJZCk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgYWN0aXZpdHkgaXMgbGF1bmNoZWQgb250byB0aGUgZXh0ZXJuYWwgZGlzcGxheQotICAgICAgICB3YWl0QW5kQXNzZXJ0QWN0aXZpdHlSZXN1bWVkKFRFU1RfQUNUSVZJVFlfTkFNRSwgbmV3RGlzcGxheS5tRGlzcGxheUlkLAotICAgICAgICAgICAgICAgICJBY3Rpdml0eSBsYXVuY2hlZCBvbiBleHRlcm5hbCBkaXNwbGF5IG11c3QgYmUgcmVzdW1lZCIpOwotCi0gICAgICAgIHNldFByaW1hcnlEaXNwbGF5U3RhdGUoZmFsc2UpOwotCi0gICAgICAgIC8vIFdhaXQgZm9yIHRoZSBmdWxsc2NyZWVuIHN0YWNrIHRvIHN0YXJ0IHNsZWVwaW5nLCBhbmQgdGhlbiBtYWtlIHN1cmUgdGhlCi0gICAgICAgIC8vIHRlc3QgYWN0aXZpdHkgaXMgc3RpbGwgcmVzdW1lZC4gTm90ZSB0aGF0IG9uIHNvbWUgZGV2aWNlcywgdGhlIHRvcCBhY3Rpdml0eSBtYXkgZ28gdG8KLSAgICAgICAgLy8gdGhlIHN0b3BwZWQgc3RhdGUgYnkgaXRzZWxmIG9uIHNsZWVwLCBjYXVzaW5nIHRoZSBzZXJ2ZXIgc2lkZSB0byBiZWxpZXZlIGl0IGlzIHN0aWxsCi0gICAgICAgIC8vIHBhdXNlZC4KLSAgICAgICAgd2FpdEFuZEFzc2VydEFjdGl2aXR5UGF1c2VkT3JTdG9wcGVkKFJFU0laRUFCTEVfQUNUSVZJVFlfTkFNRSwKLSAgICAgICAgICAgICAgICAiQWN0aXZpdHkgbGF1bmNoZWQgb24gcHJpbWFyeSBkaXNwbGF5IG11c3QgYmUgc3RvcHBlZCBvciBwYXVzZWQgYWZ0ZXIgdHVybmluZyBvZmYiKTsKLSAgICAgICAgd2FpdEFuZEFzc2VydEFjdGl2aXR5UmVzdW1lZChURVNUX0FDVElWSVRZX05BTUUsIG5ld0Rpc3BsYXkubURpc3BsYXlJZCwKLSAgICAgICAgICAgICAgICAiQWN0aXZpdHkgbGF1bmNoZWQgb24gZXh0ZXJuYWwgZGlzcGxheSBtdXN0IGJlIHJlc3VtZWQiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGF0IGFuIGFjdGl2aXR5IGNhbiBiZSBsYXVuY2hlZCBvbiBhIHNlY29uZGFyeSBkaXNwbGF5IHdoaWxlIHRoZSBwcmltYXJ5Ci0gICAgICogZGlzcGxheSBpcyBvZmYuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdExhdW5jaEV4dGVybmFsRGlzcGxheUFjdGl2aXR5V2hpbGVQcmltYXJ5T2ZmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghc3VwcG9ydHNNdWx0aURpc3BsYXkoKSkgeyByZXR1cm47IH0KLQotICAgICAgICAvLyBMYXVuY2ggc29tZXRoaW5nIG9uIHRoZSBwcmltYXJ5IGRpc3BsYXkgc28gd2Uga25vdyB0aGVyZSBpcyBhIHJlc3VtZWQgYWN0aXZpdHkgdGhlcmUKLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoUkVTSVpFQUJMRV9BQ1RJVklUWV9OQU1FKTsKLSAgICAgICAgd2FpdEFuZEFzc2VydEFjdGl2aXR5UmVzdW1lZChSRVNJWkVBQkxFX0FDVElWSVRZX05BTUUsIERFRkFVTFRfRElTUExBWV9JRCwKLSAgICAgICAgICAgICAgICAiQWN0aXZpdHkgbGF1bmNoZWQgb24gcHJpbWFyeSBkaXNwbGF5IG11c3QgYmUgcmVzdW1lZCIpOwotCi0gICAgICAgIHNldFByaW1hcnlEaXNwbGF5U3RhdGUoZmFsc2UpOwotCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGVyZSBpcyBubyByZXN1bWVkIGFjdGl2aXR5IHdoZW4gdGhlIHByaW1hcnkgZGlzcGxheSBpcyBvZmYKLSAgICAgICAgd2FpdEFuZEFzc2VydEFjdGl2aXR5U3RvcHBlZChSRVNJWkVBQkxFX0FDVElWSVRZX05BTUUsCi0gICAgICAgICAgICAgICAgIkFjdGl2aXR5IGxhdW5jaGVkIG9uIHByaW1hcnkgZGlzcGxheSBtdXN0IGJlIHN0b3BwZWQgYWZ0ZXIgdHVybmluZyBvZmYiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIHJlc3VtZWQgYWN0aXZpdHkiLAotICAgICAgICAgICAgICAgIDAsIG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFJlc3VtZWRBY3Rpdml0aWVzQ291bnQoKSk7Ci0KLSAgICAgICAgZmluYWwgRGlzcGxheVN0YXRlIG5ld0Rpc3BsYXkgPSBjcmVhdGVFeHRlcm5hbFZpcnR1YWxEaXNwbGF5KAotICAgICAgICAgICAgICAgIHRydWUgLyogc2hvd0NvbnRlbnRXaGVuTG9ja2VkICovKTsKLQotICAgICAgICBsYXVuY2hBY3Rpdml0eU9uRGlzcGxheShURVNUX0FDVElWSVRZX05BTUUsIG5ld0Rpc3BsYXkubURpc3BsYXlJZCk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgdGVzdCBhY3Rpdml0eSBpcyByZXN1bWVkIG9uIHRoZSBleHRlcm5hbCBkaXNwbGF5Ci0gICAgICAgIHdhaXRBbmRBc3NlcnRBY3Rpdml0eVJlc3VtZWQoVEVTVF9BQ1RJVklUWV9OQU1FLCBuZXdEaXNwbGF5Lm1EaXNwbGF5SWQsCi0gICAgICAgICAgICAgICAgIkFjdGl2aXR5IGxhdW5jaGVkIG9uIGV4dGVybmFsIGRpc3BsYXkgbXVzdCBiZSByZXN1bWVkIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhhdCB0dXJuaW5nIHRoZSBzZWNvbmRhcnkgZGlzcGxheSBvZmYgc3RvcHMgYWN0aXZpdGllcyBydW5uaW5nIG9uIHRoYXQgZGlzcGxheS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXh0ZXJuYWxEaXNwbGF5VG9nZ2xlU3RhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0c011bHRpRGlzcGxheSgpKSB7IHJldHVybjsgfQotCi0gICAgICAgIGZpbmFsIERpc3BsYXlTdGF0ZSBuZXdEaXNwbGF5ID0gY3JlYXRlRXh0ZXJuYWxWaXJ0dWFsRGlzcGxheSgKLSAgICAgICAgICAgICAgICBmYWxzZSAvKiBzaG93Q29udGVudFdoZW5Mb2NrZWQgKi8pOwotCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5T25EaXNwbGF5KFRFU1RfQUNUSVZJVFlfTkFNRSwgbmV3RGlzcGxheS5tRGlzcGxheUlkKTsKLQotICAgICAgICAvLyBDaGVjayB0aGF0IHRoZSB0ZXN0IGFjdGl2aXR5IGlzIHJlc3VtZWQgb24gdGhlIGV4dGVybmFsIGRpc3BsYXkKLSAgICAgICAgd2FpdEFuZEFzc2VydEFjdGl2aXR5UmVzdW1lZChURVNUX0FDVElWSVRZX05BTUUsIG5ld0Rpc3BsYXkubURpc3BsYXlJZCwKLSAgICAgICAgICAgICAgICAiQWN0aXZpdHkgbGF1bmNoZWQgb24gZXh0ZXJuYWwgZGlzcGxheSBtdXN0IGJlIHJlc3VtZWQiKTsKLQotICAgICAgICBtRXh0ZXJuYWxEaXNwbGF5SGVscGVyLnR1cm5EaXNwbGF5T2ZmKCk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgdGhhdCB0dXJuaW5nIG9mZiB0aGUgZXh0ZXJuYWwgZGlzcGxheSBzdG9wcyB0aGUgYWN0aXZpdHkKLSAgICAgICAgd2FpdEFuZEFzc2VydEFjdGl2aXR5U3RvcHBlZChURVNUX0FDVElWSVRZX05BTUUsCi0gICAgICAgICAgICAgICAgIkFjdGl2aXR5IGxhdW5jaGVkIG9uIGV4dGVybmFsIGRpc3BsYXkgbXVzdCBiZSBzdG9wcGVkIGFmdGVyIHR1cm5pbmcgb2ZmIik7Ci0KLSAgICAgICAgbUV4dGVybmFsRGlzcGxheUhlbHBlci50dXJuRGlzcGxheU9uKCk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgdGhhdCB0dXJuaW5nIG9uIHRoZSBleHRlcm5hbCBkaXNwbGF5IHJlc3VtZXMgdGhlIGFjdGl2aXR5Ci0gICAgICAgIHdhaXRBbmRBc3NlcnRBY3Rpdml0eVJlc3VtZWQoVEVTVF9BQ1RJVklUWV9OQU1FLCBuZXdEaXNwbGF5Lm1EaXNwbGF5SWQsCi0gICAgICAgICAgICAgICAgIkFjdGl2aXR5IGxhdW5jaGVkIG9uIGV4dGVybmFsIGRpc3BsYXkgbXVzdCBiZSByZXN1bWVkIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhhdCB0YXBwaW5nIG9uIHRoZSBwcmltYXJ5IGRpc3BsYXkgYWZ0ZXIgc2hvd2luZyB0aGUga2V5Z3VhcmQgcmVzdW1lcyB0aGUKLSAgICAgKiBhY3Rpdml0eSBvbiB0aGUgcHJpbWFyeSBkaXNwbGF5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFja0ZvY3VzU3dpdGNoT25Ub3VjaEV2ZW50QWZ0ZXJLZXlndWFyZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIXN1cHBvcnRzTXVsdGlEaXNwbGF5KCkpIHsgcmV0dXJuOyB9Ci0KLSAgICAgICAgLy8gTGF1bmNoIHNvbWV0aGluZyBvbiB0aGUgcHJpbWFyeSBkaXNwbGF5IHNvIHdlIGtub3cgdGhlcmUgaXMgYSByZXN1bWVkIGFjdGl2aXR5IHRoZXJlCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5KFJFU0laRUFCTEVfQUNUSVZJVFlfTkFNRSk7Ci0gICAgICAgIHdhaXRBbmRBc3NlcnRBY3Rpdml0eVJlc3VtZWQoUkVTSVpFQUJMRV9BQ1RJVklUWV9OQU1FLCBERUZBVUxUX0RJU1BMQVlfSUQsCi0gICAgICAgICAgICAgICAgIkFjdGl2aXR5IGxhdW5jaGVkIG9uIHByaW1hcnkgZGlzcGxheSBtdXN0IGJlIHJlc3VtZWQiKTsKLQotICAgICAgICBzbGVlcERldmljZSgpOwotCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGVyZSBpcyBubyByZXN1bWVkIGFjdGl2aXR5IHdoZW4gdGhlIHByaW1hcnkgZGlzcGxheSBpcyBvZmYKLSAgICAgICAgd2FpdEFuZEFzc2VydEFjdGl2aXR5U3RvcHBlZChSRVNJWkVBQkxFX0FDVElWSVRZX05BTUUsCi0gICAgICAgICAgICAgICAgIkFjdGl2aXR5IGxhdW5jaGVkIG9uIHByaW1hcnkgZGlzcGxheSBtdXN0IGJlIHN0b3BwZWQgYWZ0ZXIgdHVybmluZyBvZmYiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIHJlc3VtZWQgYWN0aXZpdHkiLAotICAgICAgICAgICAgICAgIDAsIG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFJlc3VtZWRBY3Rpdml0aWVzQ291bnQoKSk7Ci0KLSAgICAgICAgZmluYWwgRGlzcGxheVN0YXRlIG5ld0Rpc3BsYXkgPSBjcmVhdGVFeHRlcm5hbFZpcnR1YWxEaXNwbGF5KAotICAgICAgICAgICAgICAgIHRydWUgLyogc2hvd0NvbnRlbnRXaGVuTG9ja2VkICovKTsKLQotICAgICAgICBsYXVuY2hBY3Rpdml0eU9uRGlzcGxheShURVNUX0FDVElWSVRZX05BTUUsIG5ld0Rpc3BsYXkubURpc3BsYXlJZCk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgdGVzdCBhY3Rpdml0eSBpcyByZXN1bWVkIG9uIHRoZSBleHRlcm5hbCBkaXNwbGF5Ci0gICAgICAgIHdhaXRBbmRBc3NlcnRBY3Rpdml0eVJlc3VtZWQoVEVTVF9BQ1RJVklUWV9OQU1FLCBuZXdEaXNwbGF5Lm1EaXNwbGF5SWQsCi0gICAgICAgICAgICAgICAgIkFjdGl2aXR5IGxhdW5jaGVkIG9uIGV4dGVybmFsIGRpc3BsYXkgbXVzdCBiZSByZXN1bWVkIik7Ci0KLSAgICAgICAgLy8gVW5sb2NrIHRoZSBkZXZpY2UgYW5kIHRhcCBvbiB0aGUgbWlkZGxlIG9mIHRoZSBwcmltYXJ5IGRpc3BsYXkKLSAgICAgICAgd2FrZVVwRGV2aWNlKCk7Ci0gICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoIndtIGRpc21pc3Mta2V5Z3VhcmQiKTsKLSAgICAgICAgZmluYWwgUmVwb3J0ZWREaXNwbGF5TWV0cmljcyBkaXNwbGF5TWV0cmljcyA9IGdldERpc3BsYXlNZXRyaWNzKCk7Ci0gICAgICAgIGZpbmFsIGludCB3aWR0aCA9IGRpc3BsYXlNZXRyaWNzLmdldFdpZHRoKCk7Ci0gICAgICAgIGZpbmFsIGludCBoZWlnaHQgPSBkaXNwbGF5TWV0cmljcy5nZXRIZWlnaHQoKTsKLSAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZCgiaW5wdXQgdGFwICIgKyAod2lkdGggLyAyKSArICIgIiArIChoZWlnaHQgLyAyKSk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgYWN0aXZpdHkgb24gdGhlIHByaW1hcnkgZGlzcGxheSBpcyByZXN1bWVkCi0gICAgICAgIHdhaXRBbmRBc3NlcnRBY3Rpdml0eVJlc3VtZWQoUkVTSVpFQUJMRV9BQ1RJVklUWV9OQU1FLCBERUZBVUxUX0RJU1BMQVlfSUQsCi0gICAgICAgICAgICAgICAgIkFjdGl2aXR5IGxhdW5jaGVkIG9uIHByaW1hcnkgZGlzcGxheSBtdXN0IGJlIHJlc3VtZWQiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIHJlc3VtZWQgYWN0aXZpdHkiLAotICAgICAgICAgICAgICAgIDEsIG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFJlc3VtZWRBY3Rpdml0aWVzQ291bnQoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHdhaXRBbmRBc3NlcnRBY3Rpdml0eVJlc3VtZWQoU3RyaW5nIGFjdGl2aXR5TmFtZSwgaW50IGRpc3BsYXlJZCwgU3RyaW5nIG1lc3NhZ2UpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yQWN0aXZpdHlTdGF0ZShtRGV2aWNlLCBhY3Rpdml0eU5hbWUsIFNUQVRFX1JFU1VNRUQpOwotCi0gICAgICAgIGZpbmFsIFN0cmluZyBmdWxsQWN0aXZpdHlOYW1lID0gZ2V0QWN0aXZpdHlDb21wb25lbnROYW1lKGFjdGl2aXR5TmFtZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLCBmdWxsQWN0aXZpdHlOYW1lLCBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRSZXN1bWVkQWN0aXZpdHkoKSk7Ci0gICAgICAgIGZpbmFsIGludCBmcm9udFN0YWNrSWQgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRGcm9udFN0YWNrSWQoZGlzcGxheUlkKTsKLSAgICAgICAgQWN0aXZpdHlNYW5hZ2VyU3RhdGUuQWN0aXZpdHlTdGFjayBmaXJzdEZyb250U3RhY2sgPQotICAgICAgICAgICAgICAgIG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFN0YWNrQnlJZChmcm9udFN0YWNrSWQpOwotICAgICAgICBhc3NlcnRFcXVhbHMobWVzc2FnZSwgZnVsbEFjdGl2aXR5TmFtZSwgZmlyc3RGcm9udFN0YWNrLm1SZXN1bWVkQWN0aXZpdHkpOwotICAgICAgICBhc3NlcnRUcnVlKG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuaGFzQWN0aXZpdHlTdGF0ZShhY3Rpdml0eU5hbWUsIFNUQVRFX1JFU1VNRUQpKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkU3RhY2soIkZvY3VzIG11c3QgYmUgb24gZXh0ZXJuYWwgZGlzcGxheSIsIGZyb250U3RhY2tJZCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShhY3Rpdml0eU5hbWUsIHRydWUgLyogdmlzaWJsZSAqLyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHdhaXRBbmRBc3NlcnRBY3Rpdml0eVN0b3BwZWQoU3RyaW5nIGFjdGl2aXR5TmFtZSwgU3RyaW5nIG1lc3NhZ2UpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgd2FpdEFuZEFzc2VydEFjdGl2aXR5U3RhdGUoYWN0aXZpdHlOYW1lLCBtZXNzYWdlLCBTVEFURV9TVE9QUEVEKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgd2FpdEFuZEFzc2VydEFjdGl2aXR5UGF1c2VkT3JTdG9wcGVkKFN0cmluZyBhY3Rpdml0eU5hbWUsIFN0cmluZyBtZXNzYWdlKQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHdhaXRBbmRBc3NlcnRBY3Rpdml0eVN0YXRlKGFjdGl2aXR5TmFtZSwgbWVzc2FnZSwgU1RBVEVfUEFVU0VELCBTVEFURV9TVE9QUEVEKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgd2FpdEFuZEFzc2VydEFjdGl2aXR5U3RhdGUoU3RyaW5nIGFjdGl2aXR5TmFtZSwgU3RyaW5nIG1lc3NhZ2UsIFN0cmluZy4uLiBzdGF0ZXMpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yQWN0aXZpdHlTdGF0ZShtRGV2aWNlLCBhY3Rpdml0eU5hbWUsIHN0YXRlcyk7Ci0KLSAgICAgICAgYm9vbGVhbiBzdGF0ZUZvdW5kID0gZmFsc2U7Ci0KLSAgICAgICAgZm9yIChTdHJpbmcgc3RhdGUgOiBzdGF0ZXMpIHsKLSAgICAgICAgICAgIGlmIChtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5oYXNBY3Rpdml0eVN0YXRlKGFjdGl2aXR5TmFtZSwgc3RhdGUpKSB7Ci0gICAgICAgICAgICAgICAgc3RhdGVGb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnRUcnVlKG1lc3NhZ2UsIHN0YXRlRm91bmQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoYXQgc2hvd1doZW5Mb2NrZWQgd29ya3Mgb24gYSBzZWNvbmRhcnkgZGlzcGxheS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2Vjb25kYXJ5RGlzcGxheVNob3dXaGVuTG9ja2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghc3VwcG9ydHNNdWx0aURpc3BsYXkoKSkgeyByZXR1cm47IH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2V0TG9ja0NyZWRlbnRpYWwoKTsKLQotICAgICAgICAgICAgbGF1bmNoQWN0aXZpdHkoVEVTVF9BQ1RJVklUWV9OQU1FKTsKLQotICAgICAgICAgICAgZmluYWwgRGlzcGxheVN0YXRlIG5ld0Rpc3BsYXkgPSBjcmVhdGVFeHRlcm5hbFZpcnR1YWxEaXNwbGF5KAotICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBzaG93Q29udGVudFdoZW5Mb2NrZWQgKi8pOwotICAgICAgICAgICAgbGF1bmNoQWN0aXZpdHlPbkRpc3BsYXkoU0hPV19XSEVOX0xPQ0tFRF9BVFRSX0FDVElWSVRZX05BTUUsIG5ld0Rpc3BsYXkubURpc3BsYXlJZCk7Ci0KLSAgICAgICAgICAgIGdvdG9LZXlndWFyZCgpOwotICAgICAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yS2V5Z3VhcmRTaG93aW5nQW5kTm90T2NjbHVkZWQobURldmljZSk7Ci0KLSAgICAgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvckFjdGl2aXR5U3RhdGUobURldmljZSwgVEVTVF9BQ1RJVklUWV9OQU1FLCBTVEFURV9TVE9QUEVEKTsKLSAgICAgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvckFjdGl2aXR5U3RhdGUoCi0gICAgICAgICAgICAgICAgICAgIG1EZXZpY2UsIFNIT1dfV0hFTl9MT0NLRURfQVRUUl9BQ1RJVklUWV9OQU1FLCBTVEFURV9SRVNVTUVEKTsKLQotICAgICAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwgbmV3IFN0cmluZ1tdIHsgU0hPV19XSEVOX0xPQ0tFRF9BVFRSX0FDVElWSVRZX05BTUUgfSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCByZXN1bWVkIGFjdGl2aXR5IG9uIHNlY29uZGFyeSBkaXNwbGF5IiwgbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkKLSAgICAgICAgICAgICAgICAgICAgLmhhc0FjdGl2aXR5U3RhdGUoU0hPV19XSEVOX0xPQ0tFRF9BVFRSX0FDVElWSVRZX05BTUUsIFNUQVRFX1JFU1VNRUQpKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHRlYXJEb3duTG9ja0NyZWRlbnRpYWxzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogR2V0IHBoeXNpY2FsIGFuZCBvdmVycmlkZSBkaXNwbGF5IG1ldHJpY3MgZnJvbSBXTS4gKi8KLSAgICBwcml2YXRlIFJlcG9ydGVkRGlzcGxheU1ldHJpY3MgZ2V0RGlzcGxheU1ldHJpY3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbUR1bXBMaW5lcy5jbGVhcigpOwotICAgICAgICBmaW5hbCBDb2xsZWN0aW5nT3V0cHV0UmVjZWl2ZXIgb3V0cHV0UmVjZWl2ZXIgPSBuZXcgQ29sbGVjdGluZ091dHB1dFJlY2VpdmVyKCk7Ci0gICAgICAgIG1EZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZChXTV9TSVpFLCBvdXRwdXRSZWNlaXZlcik7Ci0gICAgICAgIG1EZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZChXTV9ERU5TSVRZLCBvdXRwdXRSZWNlaXZlcik7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBkdW1wID0gb3V0cHV0UmVjZWl2ZXIuZ2V0T3V0cHV0KCk7Ci0gICAgICAgIG1EdW1wTGluZXMuY2xlYXIoKTsKLSAgICAgICAgQ29sbGVjdGlvbnMuYWRkQWxsKG1EdW1wTGluZXMsIGR1bXAuc3BsaXQoIlxcbiIpKTsKLSAgICAgICAgcmV0dXJuIFJlcG9ydGVkRGlzcGxheU1ldHJpY3MuY3JlYXRlKG1EdW1wTGluZXMpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFJlcG9ydGVkRGlzcGxheU1ldHJpY3MgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHNQaHlzaWNhbFNpemVQYXR0ZXJuID0KLSAgICAgICAgICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoIlBoeXNpY2FsIHNpemU6IChcXGQrKXgoXFxkKykiKTsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBzT3ZlcnJpZGVTaXplUGF0dGVybiA9Ci0gICAgICAgICAgICAgICAgUGF0dGVybi5jb21waWxlKCJPdmVycmlkZSBzaXplOiAoXFxkKyl4KFxcZCspIik7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gc1BoeXNpY2FsRGVuc2l0eVBhdHRlcm4gPQotICAgICAgICAgICAgICAgIFBhdHRlcm4uY29tcGlsZSgiUGh5c2ljYWwgZGVuc2l0eTogKFxcZCspIik7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gc092ZXJyaWRlRGVuc2l0eVBhdHRlcm4gPQotICAgICAgICAgICAgICAgIFBhdHRlcm4uY29tcGlsZSgiT3ZlcnJpZGUgZGVuc2l0eTogKFxcZCspIik7Ci0KLSAgICAgICAgaW50IHBoeXNpY2FsV2lkdGg7Ci0gICAgICAgIGludCBwaHlzaWNhbEhlaWdodDsKLSAgICAgICAgaW50IHBoeXNpY2FsRGVuc2l0eTsKLQotICAgICAgICBib29sZWFuIHNpemVPdmVycmlkZVNldDsKLSAgICAgICAgaW50IG92ZXJyaWRlV2lkdGg7Ci0gICAgICAgIGludCBvdmVycmlkZUhlaWdodDsKLSAgICAgICAgYm9vbGVhbiBkZW5zaXR5T3ZlcnJpZGVTZXQ7Ci0gICAgICAgIGludCBvdmVycmlkZURlbnNpdHk7Ci0KLSAgICAgICAgLyoqIEdldCB3aWR0aCB0aGF0IFdNIG9wZXJhdGVzIHdpdGguICovCi0gICAgICAgIGludCBnZXRXaWR0aCgpIHsKLSAgICAgICAgICAgIHJldHVybiBzaXplT3ZlcnJpZGVTZXQgPyBvdmVycmlkZVdpZHRoIDogcGh5c2ljYWxXaWR0aDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKiBHZXQgaGVpZ2h0IHRoYXQgV00gb3BlcmF0ZXMgd2l0aC4gKi8KLSAgICAgICAgaW50IGdldEhlaWdodCgpIHsKLSAgICAgICAgICAgIHJldHVybiBzaXplT3ZlcnJpZGVTZXQgPyBvdmVycmlkZUhlaWdodCA6IHBoeXNpY2FsSGVpZ2h0OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqIEdldCBkZW5zaXR5IHRoYXQgV00gb3BlcmF0ZXMgd2l0aC4gKi8KLSAgICAgICAgaW50IGdldERlbnNpdHkoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGVuc2l0eU92ZXJyaWRlU2V0ID8gb3ZlcnJpZGVEZW5zaXR5IDogcGh5c2ljYWxEZW5zaXR5OwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdGljIFJlcG9ydGVkRGlzcGxheU1ldHJpY3MgY3JlYXRlKExpbmtlZExpc3Q8U3RyaW5nPiBkdW1wKSB7Ci0gICAgICAgICAgICBmaW5hbCBSZXBvcnRlZERpc3BsYXlNZXRyaWNzIHJlc3VsdCA9IG5ldyBSZXBvcnRlZERpc3BsYXlNZXRyaWNzKCk7Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gcGh5c2ljYWxTaXplRm91bmQgPSBmYWxzZTsKLSAgICAgICAgICAgIGJvb2xlYW4gcGh5c2ljYWxEZW5zaXR5Rm91bmQgPSBmYWxzZTsKLQotICAgICAgICAgICAgd2hpbGUgKCFkdW1wLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsaW5lID0gZHVtcC5wb3AoKS50cmltKCk7Ci0KLSAgICAgICAgICAgICAgICBNYXRjaGVyIG1hdGNoZXIgPSBzUGh5c2ljYWxTaXplUGF0dGVybi5tYXRjaGVyKGxpbmUpOwotICAgICAgICAgICAgICAgIGlmIChtYXRjaGVyLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbFNpemVGb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGxvZyhsaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnBoeXNpY2FsV2lkdGggPSBJbnRlZ2VyLnBhcnNlSW50KG1hdGNoZXIuZ3JvdXAoMSkpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHQucGh5c2ljYWxIZWlnaHQgPSBJbnRlZ2VyLnBhcnNlSW50KG1hdGNoZXIuZ3JvdXAoMikpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtYXRjaGVyID0gc092ZXJyaWRlU2l6ZVBhdHRlcm4ubWF0Y2hlcihsaW5lKTsKLSAgICAgICAgICAgICAgICBpZiAobWF0Y2hlci5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKGxpbmUpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHQub3ZlcnJpZGVXaWR0aCA9IEludGVnZXIucGFyc2VJbnQobWF0Y2hlci5ncm91cCgxKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5vdmVycmlkZUhlaWdodCA9IEludGVnZXIucGFyc2VJbnQobWF0Y2hlci5ncm91cCgyKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zaXplT3ZlcnJpZGVTZXQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtYXRjaGVyID0gc1BoeXNpY2FsRGVuc2l0eVBhdHRlcm4ubWF0Y2hlcihsaW5lKTsKLSAgICAgICAgICAgICAgICBpZiAobWF0Y2hlci5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxEZW5zaXR5Rm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBsb2cobGluZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5waHlzaWNhbERlbnNpdHkgPSBJbnRlZ2VyLnBhcnNlSW50KG1hdGNoZXIuZ3JvdXAoMSkpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtYXRjaGVyID0gc092ZXJyaWRlRGVuc2l0eVBhdHRlcm4ubWF0Y2hlcihsaW5lKTsKLSAgICAgICAgICAgICAgICBpZiAobWF0Y2hlci5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKGxpbmUpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHQub3ZlcnJpZGVEZW5zaXR5ID0gSW50ZWdlci5wYXJzZUludChtYXRjaGVyLmdyb3VwKDEpKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmRlbnNpdHlPdmVycmlkZVNldCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiUGh5c2ljYWwgZGlzcGxheSBzaXplIG11c3QgYmUgcmVwb3J0ZWQiLCBwaHlzaWNhbFNpemVGb3VuZCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJQaHlzaWNhbCBkaXNwbGF5IGRlbnNpdHkgbXVzdCBiZSByZXBvcnRlZCIsIHBoeXNpY2FsRGVuc2l0eUZvdW5kKTsKLQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiBBc3NlcnQgdGhhdCBjb21wb25lbnQgcmVjZWl2ZWQgb25Nb3ZlZFRvRGlzcGxheSBhbmQgb25Db25maWd1cmF0aW9uQ2hhbmdlZCBjYWxsYmFja3MuICovCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydE1vdmVkVG9EaXNwbGF5KFN0cmluZyBjb21wb25lbnROYW1lLCBTdHJpbmcgbG9nU2VwYXJhdG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgQWN0aXZpdHlMaWZlY3ljbGVDb3VudHMgbGlmZWN5Y2xlQ291bnRzCi0gICAgICAgICAgICAgICAgPSBuZXcgQWN0aXZpdHlMaWZlY3ljbGVDb3VudHMoY29tcG9uZW50TmFtZSwgbG9nU2VwYXJhdG9yKTsKLSAgICAgICAgaWYgKGxpZmVjeWNsZUNvdW50cy5tRGVzdHJveUNvdW50ICE9IDApIHsKLSAgICAgICAgICAgIGZhaWwoY29tcG9uZW50TmFtZSArICIgaGFzIGJlZW4gZGVzdHJveWVkICIgKyBsaWZlY3ljbGVDb3VudHMubURlc3Ryb3lDb3VudAotICAgICAgICAgICAgICAgICAgICArICIgdGltZShzKSwgd2Fzbid0IGV4cGVjdGluZyBhbnkiKTsKLSAgICAgICAgfSBlbHNlIGlmIChsaWZlY3ljbGVDb3VudHMubUNyZWF0ZUNvdW50ICE9IDApIHsKLSAgICAgICAgICAgIGZhaWwoY29tcG9uZW50TmFtZSArICIgaGFzIGJlZW4gKHJlKWNyZWF0ZWQgIiArIGxpZmVjeWNsZUNvdW50cy5tQ3JlYXRlQ291bnQKLSAgICAgICAgICAgICAgICAgICAgKyAiIHRpbWUocyksIHdhc24ndCBleHBlY3RpbmcgYW55Iik7Ci0gICAgICAgIH0gZWxzZSBpZiAobGlmZWN5Y2xlQ291bnRzLm1Db25maWd1cmF0aW9uQ2hhbmdlZENvdW50ICE9IDEpIHsKLSAgICAgICAgICAgIGZhaWwoY29tcG9uZW50TmFtZSArICIgaGFzIHJlY2VpdmVkICIKLSAgICAgICAgICAgICAgICAgICAgKyBsaWZlY3ljbGVDb3VudHMubUNvbmZpZ3VyYXRpb25DaGFuZ2VkQ291bnQKLSAgICAgICAgICAgICAgICAgICAgKyAiIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQoKSBjYWxscywgZXhwZWN0aW5nICIgKyAxKTsKLSAgICAgICAgfSBlbHNlIGlmIChsaWZlY3ljbGVDb3VudHMubU1vdmVkVG9EaXNwbGF5Q291bnQgIT0gMSkgewotICAgICAgICAgICAgZmFpbChjb21wb25lbnROYW1lICsgIiBoYXMgcmVjZWl2ZWQgIgotICAgICAgICAgICAgICAgICAgICArIGxpZmVjeWNsZUNvdW50cy5tTW92ZWRUb0Rpc3BsYXlDb3VudAotICAgICAgICAgICAgICAgICAgICArICIgb25Nb3ZlZFRvRGlzcGxheSgpIGNhbGxzLCBleHBlY3RpbmcgIiArIDEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFJlc2l6ZVZpcnR1YWxEaXNwbGF5Q29tbWFuZCgpIHsKLSAgICAgICAgcmV0dXJuIGdldEFtU3RhcnRDbWQoVklSVFVBTF9ESVNQTEFZX0FDVElWSVRZKSArICIgLWYgMHgyMDAwMDAwMCIgKwotICAgICAgICAgICAgICAgICIgLS1lcyBjb21tYW5kIHJlc2l6ZV9kaXNwbGF5IjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgcHJpdmF0ZSB2aXJ0dWFsIGRpc3BsYXkgd2l0aCB0aGUgZXh0ZXJuYWwgYW5kIHNob3cgd2l0aCBpbnNlY3VyZQotICAgICAqIGtleWd1YXJkIGZsYWdzIHNldC4KLSAgICAgKi8KLSAgICBwcml2YXRlIERpc3BsYXlTdGF0ZSBjcmVhdGVFeHRlcm5hbFZpcnR1YWxEaXNwbGF5KGJvb2xlYW4gc2hvd0NvbnRlbnRXaGVuTG9ja2VkKQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFJlcG9ydGVkRGlzcGxheXMgb3JpZ2luYWxEUyA9IGdldERpc3BsYXlzU3RhdGVzKCk7Ci0gICAgICAgIGZpbmFsIGludCBvcmlnaW5hbERpc3BsYXlDb3VudCA9IG9yaWdpbmFsRFMuZ2V0TnVtYmVyT2ZEaXNwbGF5cygpOwotCi0gICAgICAgIG1FeHRlcm5hbERpc3BsYXlIZWxwZXIgPSBuZXcgRGlzcGxheUhlbHBlcihnZXREZXZpY2UoKSk7Ci0gICAgICAgIG1FeHRlcm5hbERpc3BsYXlIZWxwZXIuY3JlYXRlQW5kV2FpdEZvckRpc3BsYXkodHJ1ZSAvKiBleHRlcm5hbCAqLywgc2hvd0NvbnRlbnRXaGVuTG9ja2VkKTsKLQotICAgICAgICAvLyBXYWl0IGZvciB0aGUgdmlydHVhbCBkaXNwbGF5IHRvIGJlIGNyZWF0ZWQgYW5kIGdldCBjb25maWd1cmF0aW9ucy4KLSAgICAgICAgZmluYWwgUmVwb3J0ZWREaXNwbGF5cyBkcyA9Ci0gICAgICAgICAgICAgICAgZ2V0RGlzcGxheVN0YXRlQWZ0ZXJDaGFuZ2Uob3JpZ2luYWxEaXNwbGF5Q291bnQgKyAxKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJOZXcgdmlydHVhbCBkaXNwbGF5IG11c3QgYmUgY3JlYXRlZCIsCi0gICAgICAgICAgICAgICAgb3JpZ2luYWxEaXNwbGF5Q291bnQgKyAxLCBkcy5nZXROdW1iZXJPZkRpc3BsYXlzKCkpOwotCi0gICAgICAgIC8vIEZpbmQgdGhlIG5ld2x5IGFkZGVkIGRpc3BsYXkuCi0gICAgICAgIGZpbmFsIExpc3Q8RGlzcGxheVN0YXRlPiBuZXdEaXNwbGF5cyA9IGZpbmROZXdEaXNwbGF5U3RhdGVzKG9yaWdpbmFsRFMsIGRzKTsKLSAgICAgICAgcmV0dXJuIG5ld0Rpc3BsYXlzLmdldCgwKTsKLSAgICB9Ci0KLSAgICAvKiogVHVybnMgdGhlIHByaW1hcnkgZGlzcGxheSBvbi9vZmYgYnkgcHJlc3NpbmcgdGhlIHBvd2VyIGtleSAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRQcmltYXJ5RGlzcGxheVN0YXRlKGJvb2xlYW4gd2FudE9uKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gRWl0aGVyIEtleUV2ZW50LktFWUNPREVfV0FLRVVQIG9yIEtleUV2ZW50LktFWUNPREVfU0xFRVAKLSAgICAgICAgaW50IGtleWNvZGUgPSB3YW50T24gPyAyMjQgOiAyMjM7Ci0gICAgICAgIGdldERldmljZSgpLmV4ZWN1dGVTaGVsbENvbW1hbmQoImlucHV0IGtleWV2ZW50ICIgKyBrZXljb2RlKTsKLSAgICAgICAgRGlzcGxheUhlbHBlci53YWl0Rm9yRGVmYXVsdERpc3BsYXlTdGF0ZShnZXREZXZpY2UoKSwgd2FudE9uKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9BY3Rpdml0eU1hbmFnZXJEb2NrZWRTdGFja1Rlc3RzLmphdmEgYi9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9BY3Rpdml0eU1hbmFnZXJEb2NrZWRTdGFja1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxOGZiMDAuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvQWN0aXZpdHlNYW5hZ2VyRG9ja2VkU3RhY2tUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjA0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuc2VydmVyLmN0czsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5Mb2cuTG9nTGV2ZWw7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQubG9nLkxvZ1V0aWwuQ0xvZzsKLQotaW1wb3J0IGphdmEuYXd0LlJlY3RhbmdsZTsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5jdHMuV2luZG93TWFuYWdlclN0YXRlLlRSQU5TSVRfV0FMTFBBUEVSX09QRU47Ci0KLS8qKgotICogQnVpbGQ6IG1tbWEgLWozMiBjdHMvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcwotICogUnVuOiBjdHMvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvdXRpbC9ydW4tdGVzdCBDdHNTZXJ2aWNlc0hvc3RUZXN0Q2FzZXMgYW5kcm9pZC5zZXJ2ZXIuY3RzLkFjdGl2aXR5TWFuYWdlckRvY2tlZFN0YWNrVGVzdHMKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5TWFuYWdlckRvY2tlZFN0YWNrVGVzdHMgZXh0ZW5kcyBBY3Rpdml0eU1hbmFnZXJUZXN0QmFzZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9BQ1RJVklUWV9OQU1FID0gIlRlc3RBY3Rpdml0eSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTklTSEFCTEVfQUNUSVZJVFlfTkFNRSA9ICJGaW5pc2hhYmxlQWN0aXZpdHkiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT05fUkVTSVpFQUJMRV9BQ1RJVklUWV9OQU1FID0gIk5vblJlc2l6ZWFibGVBY3Rpdml0eSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ0tFRF9BQ1RJVklUWV9OQU1FID0gIkRvY2tlZEFjdGl2aXR5IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9fUkVMQVVOQ0hfQUNUSVZJVFlfTkFNRSA9ICJOb1JlbGF1bmNoQWN0aXZpdHkiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSU5HTEVfSU5TVEFOQ0VfQUNUSVZJVFlfTkFNRSA9ICJTaW5nbGVJbnN0YW5jZUFjdGl2aXR5IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lOR0xFX1RBU0tfQUNUSVZJVFlfTkFNRSA9ICJTaW5nbGVUYXNrQWN0aXZpdHkiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRBU0tfU0laRSA9IDYwMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBQ0tfU0laRSA9IDMwMDsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNaW5pbXVtRGV2aWNlU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIXN1cHBvcnRzU3BsaXRTY3JlZW5NdWx0aVdpbmRvdygpKSB7Ci0gICAgICAgICAgICBDTG9nLmxvZ0FuZERpc3BsYXkoTG9nTGV2ZWwuSU5GTywgIlNraXBwaW5nIHRlc3Q6IG5vIHNwbGl0IG11bHRpLXdpbmRvdyBzdXBwb3J0Iik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydERldmljZURlZmF1bHREaXNwbGF5U2l6ZShtRGV2aWNlLAotICAgICAgICAgICAgICAgICJEZXZpY2VzIHN1cHBvcnRpbmcgbXVsdGktd2luZG93IG11c3QgYmUgbGFyZ2VyIHRoYW4gdGhlIGRlZmF1bHQgbWluaW11bSIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiB0YXNrIHNpemUiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhY2tMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghc3VwcG9ydHNTcGxpdFNjcmVlbk11bHRpV2luZG93KCkpIHsKLSAgICAgICAgICAgIENMb2cubG9nQW5kRGlzcGxheShMb2dMZXZlbC5JTkZPLCAiU2tpcHBpbmcgdGVzdDogbm8gc3BsaXQgbXVsdGktd2luZG93IHN1cHBvcnQiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5KFRFU1RfQUNUSVZJVFlfTkFNRSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIG5ldyBTdHJpbmdbXSB7VEVTVF9BQ1RJVklUWV9OQU1FfSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Q29udGFpbnNTdGFjaygiTXVzdCBjb250YWluIGhvbWUgc3RhY2suIiwgSE9NRV9TVEFDS19JRCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Q29udGFpbnNTdGFjaygKLSAgICAgICAgICAgICAgICAiTXVzdCBjb250YWluIGZ1bGxzY3JlZW4gc3RhY2suIiwgRlVMTFNDUkVFTl9XT1JLU1BBQ0VfU1RBQ0tfSUQpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydERvZXNOb3RDb250YWluU3RhY2soIk11c3Qgbm90IGNvbnRhaW4gZG9ja2VkIHN0YWNrLiIsIERPQ0tFRF9TVEFDS19JRCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdERvY2tBY3Rpdml0eSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIXN1cHBvcnRzU3BsaXRTY3JlZW5NdWx0aVdpbmRvdygpKSB7Ci0gICAgICAgICAgICBDTG9nLmxvZ0FuZERpc3BsYXkoTG9nTGV2ZWwuSU5GTywgIlNraXBwaW5nIHRlc3Q6IG5vIHNwbGl0IG11bHRpLXdpbmRvdyBzdXBwb3J0Iik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBsYXVuY2hBY3Rpdml0eUluRG9ja1N0YWNrKFRFU1RfQUNUSVZJVFlfTkFNRSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIG5ldyBTdHJpbmdbXSB7VEVTVF9BQ1RJVklUWV9OQU1FfSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Q29udGFpbnNTdGFjaygiTXVzdCBjb250YWluIGhvbWUgc3RhY2suIiwgSE9NRV9TVEFDS19JRCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Q29udGFpbnNTdGFjaygiTXVzdCBjb250YWluIGRvY2tlZCBzdGFjay4iLCBET0NLRURfU1RBQ0tfSUQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROb25SZXNpemVhYmxlTm90RG9ja2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghc3VwcG9ydHNTcGxpdFNjcmVlbk11bHRpV2luZG93KCkpIHsKLSAgICAgICAgICAgIENMb2cubG9nQW5kRGlzcGxheShMb2dMZXZlbC5JTkZPLCAiU2tpcHBpbmcgdGVzdDogbm8gc3BsaXQgbXVsdGktd2luZG93IHN1cHBvcnQiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5SW5Eb2NrU3RhY2soTk9OX1JFU0laRUFCTEVfQUNUSVZJVFlfTkFNRSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIG5ldyBTdHJpbmdbXSB7Tk9OX1JFU0laRUFCTEVfQUNUSVZJVFlfTkFNRX0pOwotCi0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Q29udGFpbnNTdGFjaygiTXVzdCBjb250YWluIGhvbWUgc3RhY2suIiwgSE9NRV9TVEFDS19JRCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0RG9lc05vdENvbnRhaW5TdGFjaygiTXVzdCBub3QgY29udGFpbiBkb2NrZWQgc3RhY2suIiwgRE9DS0VEX1NUQUNLX0lEKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGcm9udFN0YWNrKAotICAgICAgICAgICAgICAgICJGdWxsc2NyZWVuIHN0YWNrIG11c3QgYmUgZnJvbnQgc3RhY2suIiwgRlVMTFNDUkVFTl9XT1JLU1BBQ0VfU1RBQ0tfSUQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RMYXVuY2hUb1NpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0c1NwbGl0U2NyZWVuTXVsdGlXaW5kb3coKSkgewotICAgICAgICAgICAgQ0xvZy5sb2dBbmREaXNwbGF5KExvZ0xldmVsLklORk8sICJTa2lwcGluZyB0ZXN0OiBubyBzcGxpdCBtdWx0aS13aW5kb3cgc3VwcG9ydCIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbGF1bmNoQWN0aXZpdHlJbkRvY2tTdGFjayhMQVVOQ0hJTkdfQUNUSVZJVFkpOwotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCBuZXcgU3RyaW5nW10ge0xBVU5DSElOR19BQ1RJVklUWX0pOwotICAgICAgICBnZXRMYXVuY2hBY3Rpdml0eUJ1aWxkZXIoKS5zZXRUb1NpZGUodHJ1ZSkuZXhlY3V0ZSgpOwotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCBuZXcgU3RyaW5nW10ge1RFU1RfQUNUSVZJVFlfTkFNRX0pOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydENvbnRhaW5zU3RhY2soCi0gICAgICAgICAgICAgICAgIk11c3QgY29udGFpbiBmdWxsc2NyZWVuIHN0YWNrLiIsIEZVTExTQ1JFRU5fV09SS1NQQUNFX1NUQUNLX0lEKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRDb250YWluc1N0YWNrKCJNdXN0IGNvbnRhaW4gZG9ja2VkIHN0YWNrLiIsIERPQ0tFRF9TVEFDS19JRCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdExhdW5jaFRvU2lkZU11bHRpV2luZG93Q2FsbGJhY2tzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghc3VwcG9ydHNTcGxpdFNjcmVlbk11bHRpV2luZG93KCkpIHsKLSAgICAgICAgICAgIENMb2cubG9nQW5kRGlzcGxheShMb2dMZXZlbC5JTkZPLCAiU2tpcHBpbmcgdGVzdDogbm8gc3BsaXQgbXVsdGktd2luZG93IHN1cHBvcnQiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIExhdW5jaCB0d28gYWN0aXZpdGllcywgb25lIGRvY2tlZCwgb25lIGFkamFjZW50Ci0gICAgICAgIGxhdW5jaEFjdGl2aXR5SW5Eb2NrU3RhY2soTEFVTkNISU5HX0FDVElWSVRZKTsKLSAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwgbmV3IFN0cmluZ1tdIHtMQVVOQ0hJTkdfQUNUSVZJVFl9KTsKLSAgICAgICAgZ2V0TGF1bmNoQWN0aXZpdHlCdWlsZGVyKCkuc2V0VG9TaWRlKHRydWUpLmV4ZWN1dGUoKTsKLSAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwgbmV3IFN0cmluZ1tdIHtURVNUX0FDVElWSVRZX05BTUV9KTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRDb250YWluc1N0YWNrKAotICAgICAgICAgICAgICAgICJNdXN0IGNvbnRhaW4gZnVsbHNjcmVlbiBzdGFjay4iLCBGVUxMU0NSRUVOX1dPUktTUEFDRV9TVEFDS19JRCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Q29udGFpbnNTdGFjaygiTXVzdCBjb250YWluIGRvY2tlZCBzdGFjay4iLCBET0NLRURfU1RBQ0tfSUQpOwotCi0gICAgICAgIC8vIFJlbW92ZSB0aGUgZG9ja2VkIHN0YWNrLCBhbmQgZW5zdXJlIHRoYXQKLSAgICAgICAgZmluYWwgU3RyaW5nIGxvZ1NlcGFyYXRvciA9IGNsZWFyTG9nY2F0KCk7Ci0gICAgICAgIHJlbW92ZVN0YWNrcyhET0NLRURfU1RBQ0tfSUQpOwotICAgICAgICBmaW5hbCBBY3Rpdml0eUxpZmVjeWNsZUNvdW50cyBsaWZlY3ljbGVDb3VudHMgPSB3YWl0Rm9yT25NdWx0aVdpbmRvd01vZGVDaGFuZ2VkKAotICAgICAgICAgICAgICAgIFRFU1RfQUNUSVZJVFlfTkFNRSwgbG9nU2VwYXJhdG9yKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGxpZmVjeWNsZUNvdW50cy5tTXVsdGlXaW5kb3dNb2RlQ2hhbmdlZENvdW50KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TGF1bmNoVG9TaWRlQW5kQnJpbmdUb0Zyb250KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghc3VwcG9ydHNTcGxpdFNjcmVlbk11bHRpV2luZG93KCkpIHsKLSAgICAgICAgICAgIENMb2cubG9nQW5kRGlzcGxheShMb2dMZXZlbC5JTkZPLCAiU2tpcHBpbmcgdGVzdDogbm8gc3BsaXQgbXVsdGktd2luZG93IHN1cHBvcnQiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5SW5Eb2NrU3RhY2soTEFVTkNISU5HX0FDVElWSVRZKTsKLSAgICAgICAgZmluYWwgU3RyaW5nW10gd2FpdEZvckZpcnN0VmlzaWJsZSA9IG5ldyBTdHJpbmdbXSB7VEVTVF9BQ1RJVklUWV9OQU1FfTsKLSAgICAgICAgZmluYWwgU3RyaW5nW10gd2FpdEZvclNlY29uZFZpc2libGUgPSBuZXcgU3RyaW5nW10ge05PX1JFTEFVTkNIX0FDVElWSVRZX05BTUV9OwotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCBuZXcgU3RyaW5nW10ge0xBVU5DSElOR19BQ1RJVklUWX0pOwotCi0gICAgICAgIC8vIExhdW5jaCBhY3Rpdml0eSB0byBzaWRlLgotICAgICAgICBnZXRMYXVuY2hBY3Rpdml0eUJ1aWxkZXIoKS5zZXRUb1NpZGUodHJ1ZSkuZXhlY3V0ZSgpOwotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCB3YWl0Rm9yRmlyc3RWaXNpYmxlKTsKLSAgICAgICAgaW50IHRhc2tOdW1iZXJJbml0aWFsID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0U3RhY2tCeUlkKEZVTExTQ1JFRU5fV09SS1NQQUNFX1NUQUNLX0lEKQotICAgICAgICAgICAgICAgIC5nZXRUYXNrcygpLnNpemUoKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkQWN0aXZpdHkoIkxhdW5jaGVkIHRvIHNpZGUgYWN0aXZpdHkgbXVzdCBiZSBpbiBmcm9udC4iLAotICAgICAgICAgICAgICAgIFRFU1RfQUNUSVZJVFlfTkFNRSk7Ci0KLSAgICAgICAgLy8gTGF1bmNoIGFub3RoZXIgYWN0aXZpdHkgdG8gc2lkZSB0byBjb3ZlciBmaXJzdCBvbmUuCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5SW5TdGFjayhOT19SRUxBVU5DSF9BQ1RJVklUWV9OQU1FLCBGVUxMU0NSRUVOX1dPUktTUEFDRV9TVEFDS19JRCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIHdhaXRGb3JTZWNvbmRWaXNpYmxlKTsKLSAgICAgICAgaW50IHRhc2tOdW1iZXJDb3ZlcmVkID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0U3RhY2tCeUlkKEZVTExTQ1JFRU5fV09SS1NQQUNFX1NUQUNLX0lEKQotICAgICAgICAgICAgICAgIC5nZXRUYXNrcygpLnNpemUoKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRFcXVhbHMoIkZ1bGxzY3JlZW4gc3RhY2sgbXVzdCBoYXZlIG9uZSB0YXNrIGFkZGVkLiIsCi0gICAgICAgICAgICAgICAgdGFza051bWJlckluaXRpYWwgKyAxLCB0YXNrTnVtYmVyQ292ZXJlZCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZEFjdGl2aXR5KCJMYXVuY2hlZCB0byBzaWRlIGNvdmVyaW5nIGFjdGl2aXR5IG11c3QgYmUgaW4gZnJvbnQuIiwKLSAgICAgICAgICAgICAgICBOT19SRUxBVU5DSF9BQ1RJVklUWV9OQU1FKTsKLQotICAgICAgICAvLyBMYXVuY2ggYWN0aXZpdHkgdGhhdCB3YXMgZmlyc3QgbGF1bmNoZWQgdG8gc2lkZS4gSXQgc2hvdWxkIGJlIGJyb3VnaHQgdG8gZnJvbnQuCi0gICAgICAgIGdldExhdW5jaEFjdGl2aXR5QnVpbGRlcigpLnNldFRvU2lkZSh0cnVlKS5leGVjdXRlKCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIHdhaXRGb3JGaXJzdFZpc2libGUpOwotICAgICAgICBpbnQgdGFza051bWJlckZpbmFsID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0U3RhY2tCeUlkKEZVTExTQ1JFRU5fV09SS1NQQUNFX1NUQUNLX0lEKQotICAgICAgICAgICAgICAgIC5nZXRUYXNrcygpLnNpemUoKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRFcXVhbHMoIlRhc2sgbnVtYmVyIGluIGZ1bGxzY3JlZW4gc3RhY2sgbXVzdCByZW1haW4gdGhlIHNhbWUuIiwKLSAgICAgICAgICAgICAgICB0YXNrTnVtYmVyQ292ZXJlZCwgdGFza051bWJlckZpbmFsKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkQWN0aXZpdHkoIkxhdW5jaGVkIHRvIHNpZGUgY292ZXJpbmcgYWN0aXZpdHkgbXVzdCBiZSBpbiBmcm9udC4iLAotICAgICAgICAgICAgICAgIFRFU1RfQUNUSVZJVFlfTkFNRSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdExhdW5jaFRvU2lkZU11bHRpcGxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghc3VwcG9ydHNTcGxpdFNjcmVlbk11bHRpV2luZG93KCkpIHsKLSAgICAgICAgICAgIENMb2cubG9nQW5kRGlzcGxheShMb2dMZXZlbC5JTkZPLCAiU2tpcHBpbmcgdGVzdDogbm8gc3BsaXQgbXVsdGktd2luZG93IHN1cHBvcnQiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5SW5Eb2NrU3RhY2soTEFVTkNISU5HX0FDVElWSVRZKTsKLSAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwgbmV3IFN0cmluZ1tdIHtMQVVOQ0hJTkdfQUNUSVZJVFl9KTsKLSAgICAgICAgZmluYWwgU3RyaW5nW10gd2FpdEZvckFjdGl2aXRpZXNWaXNpYmxlID0KLSAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7VEVTVF9BQ1RJVklUWV9OQU1FLCBMQVVOQ0hJTkdfQUNUSVZJVFl9OwotCi0gICAgICAgIC8vIExhdW5jaCBhY3Rpdml0eSB0byBzaWRlLgotICAgICAgICBnZXRMYXVuY2hBY3Rpdml0eUJ1aWxkZXIoKS5zZXRUb1NpZGUodHJ1ZSkuZXhlY3V0ZSgpOwotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCB3YWl0Rm9yQWN0aXZpdGllc1Zpc2libGUpOwotICAgICAgICBpbnQgdGFza051bWJlckluaXRpYWwgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja0J5SWQoRlVMTFNDUkVFTl9XT1JLU1BBQ0VfU1RBQ0tfSUQpCi0gICAgICAgICAgICAgICAgLmdldFRhc2tzKCkuc2l6ZSgpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydE5vdE51bGwoIkxhdW5jaGVkIHRvIHNpZGUgYWN0aXZpdHkgbXVzdCBiZSBpbiBmdWxsc2NyZWVuIHN0YWNrLiIsCi0gICAgICAgICAgICAgICAgbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRUYXNrQnlBY3Rpdml0eU5hbWUoVEVTVF9BQ1RJVklUWV9OQU1FLCBGVUxMU0NSRUVOX1dPUktTUEFDRV9TVEFDS19JRCkpOwotCi0gICAgICAgIC8vIFRyeSB0byBsYXVuY2ggdG8gc2lkZSBzYW1lIGFjdGl2aXR5IGFnYWluLgotICAgICAgICBnZXRMYXVuY2hBY3Rpdml0eUJ1aWxkZXIoKS5zZXRUb1NpZGUodHJ1ZSkuZXhlY3V0ZSgpOwotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCB3YWl0Rm9yQWN0aXZpdGllc1Zpc2libGUpOwotICAgICAgICBpbnQgdGFza051bWJlckZpbmFsID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0U3RhY2tCeUlkKEZVTExTQ1JFRU5fV09SS1NQQUNFX1NUQUNLX0lEKQotICAgICAgICAgICAgICAgIC5nZXRUYXNrcygpLnNpemUoKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRFcXVhbHMoIlRhc2sgbnVtYmVyIG11c3RuJ3QgY2hhbmdlLiIsIHRhc2tOdW1iZXJJbml0aWFsLCB0YXNrTnVtYmVyRmluYWwpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRBY3Rpdml0eSgiTGF1bmNoZWQgdG8gc2lkZSBhY3Rpdml0eSBtdXN0IHJlbWFpbiBpbiBmcm9udC4iLAotICAgICAgICAgICAgICAgIFRFU1RfQUNUSVZJVFlfTkFNRSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Tm90TnVsbCgiTGF1bmNoZWQgdG8gc2lkZSBhY3Rpdml0eSBtdXN0IHJlbWFpbiBpbiBmdWxsc2NyZWVuIHN0YWNrLiIsCi0gICAgICAgICAgICAgICAgbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRUYXNrQnlBY3Rpdml0eU5hbWUoVEVTVF9BQ1RJVklUWV9OQU1FLCBGVUxMU0NSRUVOX1dPUktTUEFDRV9TVEFDS19JRCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RMYXVuY2hUb1NpZGVTaW5nbGVJbnN0YW5jZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBsYXVuY2hUYXJnZXRUb1NpZGUoU0lOR0xFX0lOU1RBTkNFX0FDVElWSVRZX05BTUUsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TGF1bmNoVG9TaWRlU2luZ2xlVGFzaygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBsYXVuY2hUYXJnZXRUb1NpZGUoU0lOR0xFX1RBU0tfQUNUSVZJVFlfTkFNRSwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RMYXVuY2hUb1NpZGVNdWx0aXBsZVdpdGhEaWZmZXJlbnRJbnRlbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbGF1bmNoVGFyZ2V0VG9TaWRlKFRFU1RfQUNUSVZJVFlfTkFNRSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGxhdW5jaFRhcmdldFRvU2lkZShTdHJpbmcgdGFyZ2V0QWN0aXZpdHlOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB0YXNrQ291bnRNdXN0SW5jcmVtZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0c1NwbGl0U2NyZWVuTXVsdGlXaW5kb3coKSkgewotICAgICAgICAgICAgQ0xvZy5sb2dBbmREaXNwbGF5KExvZ0xldmVsLklORk8sICJTa2lwcGluZyB0ZXN0OiBubyBzcGxpdCBtdWx0aS13aW5kb3cgc3VwcG9ydCIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbGF1bmNoQWN0aXZpdHlJbkRvY2tTdGFjayhMQVVOQ0hJTkdfQUNUSVZJVFkpOwotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCBuZXcgU3RyaW5nW10ge0xBVU5DSElOR19BQ1RJVklUWX0pOwotCi0gICAgICAgIGZpbmFsIFN0cmluZ1tdIHdhaXRGb3JBY3Rpdml0aWVzVmlzaWJsZSA9Ci0gICAgICAgICAgICBuZXcgU3RyaW5nW10ge3RhcmdldEFjdGl2aXR5TmFtZSwgTEFVTkNISU5HX0FDVElWSVRZfTsKLQotICAgICAgICAvLyBMYXVuY2ggYWN0aXZpdHkgdG8gc2lkZSB3aXRoIGRhdGEuCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5VG9TaWRlKHRydWUsIGZhbHNlLCB0YXJnZXRBY3Rpdml0eU5hbWUpOwotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCB3YWl0Rm9yQWN0aXZpdGllc1Zpc2libGUpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydENvbnRhaW5zU3RhY2soCi0gICAgICAgICAgICAgICAgIk11c3QgY29udGFpbiBmdWxsc2NyZWVuIHN0YWNrLiIsIEZVTExTQ1JFRU5fV09SS1NQQUNFX1NUQUNLX0lEKTsKLSAgICAgICAgaW50IHRhc2tOdW1iZXJJbml0aWFsID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0U3RhY2tCeUlkKEZVTExTQ1JFRU5fV09SS1NQQUNFX1NUQUNLX0lEKQotICAgICAgICAgICAgICAgIC5nZXRUYXNrcygpLnNpemUoKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnROb3ROdWxsKCJMYXVuY2hlZCB0byBzaWRlIGFjdGl2aXR5IG11c3QgYmUgaW4gZnVsbHNjcmVlbiBzdGFjay4iLAotICAgICAgICAgICAgICAgIG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VGFza0J5QWN0aXZpdHlOYW1lKHRhcmdldEFjdGl2aXR5TmFtZSwgRlVMTFNDUkVFTl9XT1JLU1BBQ0VfU1RBQ0tfSUQpKTsKLQotICAgICAgICAvLyBUcnkgdG8gbGF1bmNoIHRvIHNpZGUgc2FtZSBhY3Rpdml0eSBhZ2FpbiB3aXRoIGRpZmZlcmVudCBkYXRhLgotICAgICAgICBsYXVuY2hBY3Rpdml0eVRvU2lkZSh0cnVlLCBmYWxzZSwgdGFyZ2V0QWN0aXZpdHlOYW1lKTsKLSAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwgd2FpdEZvckFjdGl2aXRpZXNWaXNpYmxlKTsKLSAgICAgICAgaW50IHRhc2tOdW1iZXJTZWNvbmRMYXVuY2ggPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKQotICAgICAgICAgICAgICAgIC5nZXRTdGFja0J5SWQoRlVMTFNDUkVFTl9XT1JLU1BBQ0VfU1RBQ0tfSUQpLmdldFRhc2tzKCkuc2l6ZSgpOwotICAgICAgICBpZiAodGFza0NvdW50TXVzdEluY3JlbWVudCkgewotICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRFcXVhbHMoIlRhc2sgbnVtYmVyIG11c3QgYmUgaW5jcmVtZW50ZWQuIiwgdGFza051bWJlckluaXRpYWwgKyAxLAotICAgICAgICAgICAgICAgICAgICB0YXNrTnVtYmVyU2Vjb25kTGF1bmNoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0RXF1YWxzKCJUYXNrIG51bWJlciBtdXN0IG5vdCBjaGFuZ2UuIiwgdGFza051bWJlckluaXRpYWwsCi0gICAgICAgICAgICAgICAgICAgIHRhc2tOdW1iZXJTZWNvbmRMYXVuY2gpOwotICAgICAgICB9Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZEFjdGl2aXR5KCJMYXVuY2hlZCB0byBzaWRlIGFjdGl2aXR5IG11c3QgYmUgaW4gZnJvbnQuIiwKLSAgICAgICAgICAgICAgICB0YXJnZXRBY3Rpdml0eU5hbWUpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydE5vdE51bGwoIkxhdW5jaGVkIHRvIHNpZGUgYWN0aXZpdHkgbXVzdCBiZSBsYXVuY2hlZCBpbiBmdWxsc2NyZWVuIHN0YWNrLiIsCi0gICAgICAgICAgICAgICAgbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRUYXNrQnlBY3Rpdml0eU5hbWUodGFyZ2V0QWN0aXZpdHlOYW1lLCBGVUxMU0NSRUVOX1dPUktTUEFDRV9TVEFDS19JRCkpOwotCi0gICAgICAgIC8vIFRyeSB0byBsYXVuY2ggdG8gc2lkZSBzYW1lIGFjdGl2aXR5IGFnYWluIHdpdGggbm8gZGF0YS4KLSAgICAgICAgbGF1bmNoQWN0aXZpdHlUb1NpZGUoZmFsc2UsIGZhbHNlLCB0YXJnZXRBY3Rpdml0eU5hbWUpOwotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCB3YWl0Rm9yQWN0aXZpdGllc1Zpc2libGUpOwotICAgICAgICBpbnQgdGFza051bWJlckZpbmFsID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0U3RhY2tCeUlkKEZVTExTQ1JFRU5fV09SS1NQQUNFX1NUQUNLX0lEKQotICAgICAgICAgICAgICAgIC5nZXRUYXNrcygpLnNpemUoKTsKLSAgICAgICAgaWYgKHRhc2tDb3VudE11c3RJbmNyZW1lbnQpIHsKLSAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0RXF1YWxzKCJUYXNrIG51bWJlciBtdXN0IGJlIGluY3JlbWVudGVkLiIsIHRhc2tOdW1iZXJTZWNvbmRMYXVuY2ggKyAxLAotICAgICAgICAgICAgICAgICAgICB0YXNrTnVtYmVyRmluYWwpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRFcXVhbHMoIlRhc2sgbnVtYmVyIG11c3Qgbm90IGNoYW5nZS4iLCB0YXNrTnVtYmVyU2Vjb25kTGF1bmNoLAotICAgICAgICAgICAgICAgICAgICB0YXNrTnVtYmVyRmluYWwpOwotICAgICAgICB9Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZEFjdGl2aXR5KCJMYXVuY2hlZCB0byBzaWRlIGFjdGl2aXR5IG11c3QgYmUgaW4gZnJvbnQuIiwKLSAgICAgICAgICAgICAgICB0YXJnZXRBY3Rpdml0eU5hbWUpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydE5vdE51bGwoIkxhdW5jaGVkIHRvIHNpZGUgYWN0aXZpdHkgbXVzdCBiZSBsYXVuY2hlZCBpbiBmdWxsc2NyZWVuIHN0YWNrLiIsCi0gICAgICAgICAgICAgICAgbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRUYXNrQnlBY3Rpdml0eU5hbWUodGFyZ2V0QWN0aXZpdHlOYW1lLCBGVUxMU0NSRUVOX1dPUktTUEFDRV9TVEFDS19JRCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RMYXVuY2hUb1NpZGVNdWx0aXBsZVdpdGhGbGFnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghc3VwcG9ydHNTcGxpdFNjcmVlbk11bHRpV2luZG93KCkpIHsKLSAgICAgICAgICAgIENMb2cubG9nQW5kRGlzcGxheShMb2dMZXZlbC5JTkZPLCAiU2tpcHBpbmcgdGVzdDogbm8gc3BsaXQgbXVsdGktd2luZG93IHN1cHBvcnQiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5SW5Eb2NrU3RhY2soTEFVTkNISU5HX0FDVElWSVRZKTsKLSAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwgbmV3IFN0cmluZ1tdIHtMQVVOQ0hJTkdfQUNUSVZJVFl9KTsKLSAgICAgICAgZmluYWwgU3RyaW5nW10gd2FpdEZvckFjdGl2aXRpZXNWaXNpYmxlID0KLSAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7TEFVTkNISU5HX0FDVElWSVRZLCBURVNUX0FDVElWSVRZX05BTUV9OwotCi0gICAgICAgIC8vIExhdW5jaCBhY3Rpdml0eSB0byBzaWRlLgotICAgICAgICBnZXRMYXVuY2hBY3Rpdml0eUJ1aWxkZXIoKS5zZXRUb1NpZGUodHJ1ZSkuZXhlY3V0ZSgpOwotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCB3YWl0Rm9yQWN0aXZpdGllc1Zpc2libGUpOwotICAgICAgICBpbnQgdGFza051bWJlckluaXRpYWwgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja0J5SWQoRlVMTFNDUkVFTl9XT1JLU1BBQ0VfU1RBQ0tfSUQpCi0gICAgICAgICAgICAgICAgLmdldFRhc2tzKCkuc2l6ZSgpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydE5vdE51bGwoIkxhdW5jaGVkIHRvIHNpZGUgYWN0aXZpdHkgbXVzdCBiZSBpbiBmdWxsc2NyZWVuIHN0YWNrLiIsCi0gICAgICAgICAgICAgICAgbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRUYXNrQnlBY3Rpdml0eU5hbWUoVEVTVF9BQ1RJVklUWV9OQU1FLCBGVUxMU0NSRUVOX1dPUktTUEFDRV9TVEFDS19JRCkpOwotCi0gICAgICAgIC8vIFRyeSB0byBsYXVuY2ggdG8gc2lkZSBzYW1lIGFjdGl2aXR5IGFnYWluLCBidXQgd2l0aCBJbnRlbnQjRkxBR19BQ1RJVklUWV9NVUxUSVBMRV9UQVNLLgotICAgICAgICBnZXRMYXVuY2hBY3Rpdml0eUJ1aWxkZXIoKS5zZXRUb1NpZGUodHJ1ZSkuc2V0TXVsdGlwbGVUYXNrKHRydWUpLmV4ZWN1dGUoKTsKLSAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwgd2FpdEZvckFjdGl2aXRpZXNWaXNpYmxlKTsKLSAgICAgICAgaW50IHRhc2tOdW1iZXJGaW5hbCA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFN0YWNrQnlJZChGVUxMU0NSRUVOX1dPUktTUEFDRV9TVEFDS19JRCkKLSAgICAgICAgICAgICAgICAuZ2V0VGFza3MoKS5zaXplKCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0RXF1YWxzKCJUYXNrIG51bWJlciBtdXN0IGJlIGluY3JlbWVudGVkLiIsIHRhc2tOdW1iZXJJbml0aWFsICsgMSwKLSAgICAgICAgICAgICAgICB0YXNrTnVtYmVyRmluYWwpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRBY3Rpdml0eSgiTGF1bmNoZWQgdG8gc2lkZSBhY3Rpdml0eSBtdXN0IGJlIGluIGZyb250LiIsCi0gICAgICAgICAgICAgICAgVEVTVF9BQ1RJVklUWV9OQU1FKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnROb3ROdWxsKCJMYXVuY2hlZCB0byBzaWRlIGFjdGl2aXR5IG11c3QgcmVtYWluIGluIGZ1bGxzY3JlZW4gc3RhY2suIiwKLSAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFRhc2tCeUFjdGl2aXR5TmFtZShURVNUX0FDVElWSVRZX05BTUUsIEZVTExTQ1JFRU5fV09SS1NQQUNFX1NUQUNLX0lEKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJvdGF0aW9uV2hlbkRvY2tlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIXN1cHBvcnRzU3BsaXRTY3JlZW5NdWx0aVdpbmRvdygpKSB7Ci0gICAgICAgICAgICBDTG9nLmxvZ0FuZERpc3BsYXkoTG9nTGV2ZWwuSU5GTywgIlNraXBwaW5nIHRlc3Q6IG5vIHNwbGl0IG11bHRpLXdpbmRvdyBzdXBwb3J0Iik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBsYXVuY2hBY3Rpdml0eUluRG9ja1N0YWNrKExBVU5DSElOR19BQ1RJVklUWSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIG5ldyBTdHJpbmdbXSB7TEFVTkNISU5HX0FDVElWSVRZfSk7Ci0gICAgICAgIGdldExhdW5jaEFjdGl2aXR5QnVpbGRlcigpLnNldFRvU2lkZSh0cnVlKS5leGVjdXRlKCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIG5ldyBTdHJpbmdbXSB7VEVTVF9BQ1RJVklUWV9OQU1FfSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Q29udGFpbnNTdGFjaygKLSAgICAgICAgICAgICAgICAiTXVzdCBjb250YWluIGZ1bGxzY3JlZW4gc3RhY2suIiwgRlVMTFNDUkVFTl9XT1JLU1BBQ0VfU1RBQ0tfSUQpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydENvbnRhaW5zU3RhY2soIk11c3QgY29udGFpbiBkb2NrZWQgc3RhY2suIiwgRE9DS0VEX1NUQUNLX0lEKTsKLQotICAgICAgICAvLyBSb3RhdGUgZGV2aWNlIHNpbmdsZSBzdGVwcyAoOTDCsCkgMC0xLTItMy4KLSAgICAgICAgLy8gRWFjaCB0aW1lIHdlIGNvbXB1dGUgdGhlIHN0YXRlIHdlIGltcGxpY2l0bHkgYXNzZXJ0IHZhbGlkIGJvdW5kcy4KLSAgICAgICAgU3RyaW5nW10gd2FpdEZvckFjdGl2aXRpZXNWaXNpYmxlID0KLSAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7TEFVTkNISU5HX0FDVElWSVRZLCBURVNUX0FDVElWSVRZX05BTUV9OwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotICAgICAgICAgICAgc2V0RGV2aWNlUm90YXRpb24oaSk7Ci0gICAgICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCB3YWl0Rm9yQWN0aXZpdGllc1Zpc2libGUpOwotICAgICAgICB9Ci0gICAgICAgIC8vIERvdWJsZSBzdGVwcyAoMTgwwrApIFdlIGVuZGVkIHRoZSBzaW5nbGUgc3RlcCBhdCAzLiBTbywgd2UganVtcCBkaXJlY3RseSB0byAxIGZvciBkb3VibGUKLSAgICAgICAgLy8gc3RlcC4gU28sIHdlIGFyZSB0ZXN0aW5nIDMtMS0zIGZvciBvbmUgc2lkZSBhbmQgMC0yLTAgZm9yIHRoZSBvdGhlciBzaWRlLgotICAgICAgICBzZXREZXZpY2VSb3RhdGlvbigxKTsKLSAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwgd2FpdEZvckFjdGl2aXRpZXNWaXNpYmxlKTsKLSAgICAgICAgc2V0RGV2aWNlUm90YXRpb24oMyk7Ci0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIHdhaXRGb3JBY3Rpdml0aWVzVmlzaWJsZSk7Ci0gICAgICAgIHNldERldmljZVJvdGF0aW9uKDApOwotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCB3YWl0Rm9yQWN0aXZpdGllc1Zpc2libGUpOwotICAgICAgICBzZXREZXZpY2VSb3RhdGlvbigyKTsKLSAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwgd2FpdEZvckFjdGl2aXRpZXNWaXNpYmxlKTsKLSAgICAgICAgc2V0RGV2aWNlUm90YXRpb24oMCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIHdhaXRGb3JBY3Rpdml0aWVzVmlzaWJsZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJvdGF0aW9uV2hlbkRvY2tlZFdoaWxlTG9ja2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghc3VwcG9ydHNTcGxpdFNjcmVlbk11bHRpV2luZG93KCkpIHsKLSAgICAgICAgICAgIENMb2cubG9nQW5kRGlzcGxheShMb2dMZXZlbC5JTkZPLCAiU2tpcHBpbmcgdGVzdDogbm8gc3BsaXQgbXVsdGktd2luZG93IHN1cHBvcnQiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5SW5Eb2NrU3RhY2soTEFVTkNISU5HX0FDVElWSVRZKTsKLSAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwgbmV3IFN0cmluZ1tdIHtMQVVOQ0hJTkdfQUNUSVZJVFl9KTsKLSAgICAgICAgZ2V0TGF1bmNoQWN0aXZpdHlCdWlsZGVyKCkuc2V0VG9TaWRlKHRydWUpLmV4ZWN1dGUoKTsKLSAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwgbmV3IFN0cmluZ1tdIHtURVNUX0FDVElWSVRZX05BTUV9KTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRTYW5pdHkoKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRDb250YWluc1N0YWNrKAotICAgICAgICAgICAgICAgICJNdXN0IGNvbnRhaW4gZnVsbHNjcmVlbiBzdGFjay4iLCBGVUxMU0NSRUVOX1dPUktTUEFDRV9TVEFDS19JRCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Q29udGFpbnNTdGFjaygiTXVzdCBjb250YWluIGRvY2tlZCBzdGFjay4iLCBET0NLRURfU1RBQ0tfSUQpOwotCi0gICAgICAgIFN0cmluZ1tdIHdhaXRGb3JBY3Rpdml0aWVzVmlzaWJsZSA9Ci0gICAgICAgICAgICBuZXcgU3RyaW5nW10ge0xBVU5DSElOR19BQ1RJVklUWSwgVEVTVF9BQ1RJVklUWV9OQU1FfTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKLSAgICAgICAgICAgIHNsZWVwRGV2aWNlKCk7Ci0gICAgICAgICAgICBzZXREZXZpY2VSb3RhdGlvbihpKTsKLSAgICAgICAgICAgIHdha2VVcEFuZFVubG9ja0RldmljZSgpOwotICAgICAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwgd2FpdEZvckFjdGl2aXRpZXNWaXNpYmxlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSb3RhdGlvbldoaWxlRG9ja01pbmltaXplZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIXN1cHBvcnRzU3BsaXRTY3JlZW5NdWx0aVdpbmRvdygpKSB7Ci0gICAgICAgICAgICBDTG9nLmxvZ0FuZERpc3BsYXkoTG9nTGV2ZWwuSU5GTywgIlNraXBwaW5nIHRlc3Q6IG5vIHNwbGl0IG11bHRpLXdpbmRvdyBzdXBwb3J0Iik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBsYXVuY2hBY3Rpdml0eUluRG9ja1N0YWNrQW5kTWluaW1pemUoVEVTVF9BQ1RJVklUWV9OQU1FKTsKLSAgICAgICAgYXNzZXJ0RG9ja01pbmltaXplZCgpOwotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCBuZXcgU3RyaW5nW10ge1RFU1RfQUNUSVZJVFlfTkFNRX0pOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydENvbnRhaW5zU3RhY2soIk11c3QgY29udGFpbiBkb2NrZWQgc3RhY2suIiwgRE9DS0VEX1NUQUNLX0lEKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkU3RhY2soIkhvbWUgYWN0aXZpdHkgc2hvdWxkIGJlIGZvY3VzZWQgaW4gbWluaW1pemVkIG1vZGUiLAotICAgICAgICAgICAgICAgIEhPTUVfU1RBQ0tfSUQpOwotCi0gICAgICAgIC8vIFJvdGF0ZSBkZXZpY2Ugc2luZ2xlIHN0ZXBzICg5MMKwKSAwLTEtMi0zLgotICAgICAgICAvLyBFYWNoIHRpbWUgd2UgY29tcHV0ZSB0aGUgc3RhdGUgd2UgaW1wbGljaXRseSBhc3NlcnQgdmFsaWQgYm91bmRzIGluIG1pbmltaXplZCBtb2RlLgotICAgICAgICBTdHJpbmdbXSB3YWl0Rm9yQWN0aXZpdGllc1Zpc2libGUgPSBuZXcgU3RyaW5nW10ge1RFU1RfQUNUSVZJVFlfTkFNRX07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0gICAgICAgICAgICBzZXREZXZpY2VSb3RhdGlvbihpKTsKLSAgICAgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIHdhaXRGb3JBY3Rpdml0aWVzVmlzaWJsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBEb3VibGUgc3RlcHMgKDE4MMKwKSBXZSBlbmRlZCB0aGUgc2luZ2xlIHN0ZXAgYXQgMy4gU28sIHdlIGp1bXAgZGlyZWN0bHkgdG8gMSBmb3IgZG91YmxlCi0gICAgICAgIC8vIHN0ZXAuIFNvLCB3ZSBhcmUgdGVzdGluZyAzLTEtMyBmb3Igb25lIHNpZGUgYW5kIDAtMi0wIGZvciB0aGUgb3RoZXIgc2lkZSBpbiBtaW5pbWl6ZWQKLSAgICAgICAgLy8gbW9kZS4KLSAgICAgICAgc2V0RGV2aWNlUm90YXRpb24oMSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIHdhaXRGb3JBY3Rpdml0aWVzVmlzaWJsZSk7Ci0gICAgICAgIHNldERldmljZVJvdGF0aW9uKDMpOwotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCB3YWl0Rm9yQWN0aXZpdGllc1Zpc2libGUpOwotICAgICAgICBzZXREZXZpY2VSb3RhdGlvbigwKTsKLSAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwgd2FpdEZvckFjdGl2aXRpZXNWaXNpYmxlKTsKLSAgICAgICAgc2V0RGV2aWNlUm90YXRpb24oMik7Ci0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIHdhaXRGb3JBY3Rpdml0aWVzVmlzaWJsZSk7Ci0gICAgICAgIHNldERldmljZVJvdGF0aW9uKDApOwotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCB3YWl0Rm9yQWN0aXZpdGllc1Zpc2libGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNaW5pbWl6ZUFuZFVubWluaW1pemVUaGVuR29pbmdIb21lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghc3VwcG9ydHNTcGxpdFNjcmVlbk11bHRpV2luZG93KCkpIHsKLSAgICAgICAgICAgIENMb2cubG9nQW5kRGlzcGxheShMb2dMZXZlbC5JTkZPLCAiU2tpcHBpbmcgdGVzdDogbm8gc3BsaXQgbXVsdGktd2luZG93IHN1cHBvcnQiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJvdGF0ZSB0aGUgc2NyZWVuIHRvIGNoZWNrIHRoYXQgbWluaW1pemUsIHVubWluaW1pemUsIGRpc21pc3MgdGhlIGRvY2tlZCBzdGFjayBhbmQgdGhlbgotICAgICAgICAvLyBnb2luZyBob21lIGhhcyB0aGUgY29ycmVjdCBhcHAgdHJhbnNpdGlvbgotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotICAgICAgICAgICAgc2V0RGV2aWNlUm90YXRpb24oaSk7Ci0gICAgICAgICAgICBsYXVuY2hBY3Rpdml0eUluRG9ja1N0YWNrQW5kTWluaW1pemUoRE9DS0VEX0FDVElWSVRZX05BTUUpOwotICAgICAgICAgICAgYXNzZXJ0RG9ja01pbmltaXplZCgpOwotCi0gICAgICAgICAgICAvLyBVbm1pbmltaXplIHRoZSBkb2NrZWQgc3RhY2sKLSAgICAgICAgICAgIHByZXNzQXBwU3dpdGNoQnV0dG9uKCk7Ci0gICAgICAgICAgICB3YWl0Rm9yRG9ja05vdE1pbmltaXplZCgpOwotICAgICAgICAgICAgYXNzZXJ0RG9ja05vdE1pbmltaXplZCgpOwotCi0gICAgICAgICAgICAvLyBEaXNtaXNzIHRoZSBkb2NrIHN0YWNrCi0gICAgICAgICAgICBsYXVuY2hBY3Rpdml0eUluU3RhY2soVEVTVF9BQ1RJVklUWV9OQU1FLCBGVUxMU0NSRUVOX1dPUktTUEFDRV9TVEFDS19JRCk7Ci0gICAgICAgICAgICBtb3ZlQWN0aXZpdHlUb1N0YWNrKERPQ0tFRF9BQ1RJVklUWV9OQU1FLCBGVUxMU0NSRUVOX1dPUktTUEFDRV9TVEFDS19JRCk7Ci0gICAgICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCBuZXcgU3RyaW5nW117RE9DS0VEX0FDVElWSVRZX05BTUV9KTsKLQotICAgICAgICAgICAgLy8gR28gaG9tZSBhbmQgY2hlY2sgdGhlIGFwcCB0cmFuc2l0aW9uCi0gICAgICAgICAgICBhc3NlcnROb3RTYW1lKFRSQU5TSVRfV0FMTFBBUEVSX09QRU4sIG1BbVdtU3RhdGUuZ2V0V21TdGF0ZSgpLmdldExhc3RUcmFuc2l0aW9uKCkpOwotICAgICAgICAgICAgcHJlc3NIb21lQnV0dG9uKCk7Ci0gICAgICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JIb21lQWN0aXZpdHlWaXNpYmxlKG1EZXZpY2UpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFRSQU5TSVRfV0FMTFBBUEVSX09QRU4sIG1BbVdtU3RhdGUuZ2V0V21TdGF0ZSgpLmdldExhc3RUcmFuc2l0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEZpbmlzaERvY2tBY3Rpdml0eVdoaWxlTWluaW1pemVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghc3VwcG9ydHNTcGxpdFNjcmVlbk11bHRpV2luZG93KCkpIHsKLSAgICAgICAgICAgIENMb2cubG9nQW5kRGlzcGxheShMb2dMZXZlbC5JTkZPLCAiU2tpcHBpbmcgdGVzdDogbm8gc3BsaXQgbXVsdGktd2luZG93IHN1cHBvcnQiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5SW5Eb2NrU3RhY2tBbmRNaW5pbWl6ZShGSU5JU0hBQkxFX0FDVElWSVRZX05BTUUpOwotICAgICAgICBhc3NlcnREb2NrTWluaW1pemVkKCk7Ci0KLSAgICAgICAgcnVuQ29tbWFuZEFuZFByaW50T3V0cHV0KCJhbSBicm9hZGNhc3QgLWEgJ2FuZHJvaWQuc2VydmVyLmN0cy5GaW5pc2hhYmxlQWN0aXZpdHkuZmluaXNoJyIpOwotICAgICAgICB3YWl0Rm9yRG9ja05vdE1pbmltaXplZCgpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoRklOSVNIQUJMRV9BQ1RJVklUWV9OQU1FLCBmYWxzZSk7Ci0gICAgICAgIGFzc2VydERvY2tOb3RNaW5pbWl6ZWQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RG9ja2VkU3RhY2tUb01pbmltaXplV2hlblVubG9ja2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghc3VwcG9ydHNTcGxpdFNjcmVlbk11bHRpV2luZG93KCkpIHsKLSAgICAgICAgICAgIENMb2cubG9nQW5kRGlzcGxheShMb2dMZXZlbC5JTkZPLCAiU2tpcHBpbmcgdGVzdDogbm8gc3BsaXQgbXVsdGktd2luZG93IHN1cHBvcnQiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5SW5Eb2NrU3RhY2soVEVTVF9BQ1RJVklUWV9OQU1FKTsKLSAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwgbmV3IFN0cmluZ1tdIHtURVNUX0FDVElWSVRZX05BTUV9KTsKLSAgICAgICAgc2xlZXBEZXZpY2UoKTsKLSAgICAgICAgd2FrZVVwQW5kVW5sb2NrRGV2aWNlKCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIG5ldyBTdHJpbmdbXSB7VEVTVF9BQ1RJVklUWV9OQU1FfSk7Ci0gICAgICAgIGFzc2VydERvY2tNaW5pbWl6ZWQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWluaW1pemVkU3RhdGVXaGVuVW5sb2NrZWRBbmRVbk1pbmltaXplZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIXN1cHBvcnRzU3BsaXRTY3JlZW5NdWx0aVdpbmRvdygpKSB7Ci0gICAgICAgICAgICBDTG9nLmxvZ0FuZERpc3BsYXkoTG9nTGV2ZWwuSU5GTywgIlNraXBwaW5nIHRlc3Q6IG5vIHNwbGl0IG11bHRpLXdpbmRvdyBzdXBwb3J0Iik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBsYXVuY2hBY3Rpdml0eUluRG9ja1N0YWNrQW5kTWluaW1pemUoRklOSVNIQUJMRV9BQ1RJVklUWV9OQU1FKTsKLSAgICAgICAgYXNzZXJ0RG9ja01pbmltaXplZCgpOwotCi0gICAgICAgIHNsZWVwRGV2aWNlKCk7Ci0gICAgICAgIHdha2VVcEFuZFVubG9ja0RldmljZSgpOwotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCBuZXcgU3RyaW5nW10ge1RFU1RfQUNUSVZJVFlfTkFNRX0pOwotCi0gICAgICAgIC8vIFVubWluaW1pemVkIGJhY2sgdG8gc3BsaXRzY3JlZW4KLSAgICAgICAgcHJlc3NBcHBTd2l0Y2hCdXR0b24oKTsKLSAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwgbmV3IFN0cmluZ1tdIHtURVNUX0FDVElWSVRZX05BTUV9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzaXplRG9ja2VkU3RhY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0c1NwbGl0U2NyZWVuTXVsdGlXaW5kb3coKSkgewotICAgICAgICAgICAgQ0xvZy5sb2dBbmREaXNwbGF5KExvZ0xldmVsLklORk8sICJTa2lwcGluZyB0ZXN0OiBubyBzcGxpdCBtdWx0aS13aW5kb3cgc3VwcG9ydCIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbGF1bmNoQWN0aXZpdHlJbkRvY2tTdGFjayhET0NLRURfQUNUSVZJVFlfTkFNRSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIG5ldyBTdHJpbmdbXSB7RE9DS0VEX0FDVElWSVRZX05BTUV9KTsKLSAgICAgICAgbGF1bmNoQWN0aXZpdHlJblN0YWNrKFRFU1RfQUNUSVZJVFlfTkFNRSwgRlVMTFNDUkVFTl9XT1JLU1BBQ0VfU1RBQ0tfSUQpOwotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCBuZXcgU3RyaW5nW10ge1RFU1RfQUNUSVZJVFlfTkFNRX0pOwotICAgICAgICByZXNpemVEb2NrZWRTdGFjayhTVEFDS19TSVpFLCBTVEFDS19TSVpFLCBUQVNLX1NJWkUsIFRBU0tfU0laRSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIG5ldyBTdHJpbmdbXSB7VEVTVF9BQ1RJVklUWV9OQU1FLCBET0NLRURfQUNUSVZJVFlfTkFNRX0sCi0gICAgICAgICAgICAgICAgZmFsc2UgLyogY29tcGFyZVRhc2tBbmRTdGFja0JvdW5kcyAqLyk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Q29udGFpbnNTdGFjaygiTXVzdCBjb250YWluIGRvY2tlZCBzdGFjayIsIERPQ0tFRF9TVEFDS19JRCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Q29udGFpbnNTdGFjaygiTXVzdCBjb250YWluIGZ1bGxzY3JlZW4gc3RhY2siLAotICAgICAgICAgICAgICAgIEZVTExTQ1JFRU5fV09SS1NQQUNFX1NUQUNLX0lEKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgU1RBQ0tfU0laRSwgU1RBQ0tfU0laRSksCi0gICAgICAgICAgICAgICAgbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0U3RhY2tCeUlkKERPQ0tFRF9TVEFDS19JRCkuZ2V0Qm91bmRzKCkpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydERvY2tlZFRhc2tCb3VuZHMoVEFTS19TSVpFLCBUQVNLX1NJWkUsIERPQ0tFRF9BQ1RJVklUWV9OQU1FKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KERPQ0tFRF9BQ1RJVklUWV9OQU1FLCB0cnVlKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFRFU1RfQUNUSVZJVFlfTkFNRSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFjdGl2aXR5TGlmZUN5Y2xlT25SZXNpemVEb2NrZWRTdGFjaygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIXN1cHBvcnRzU3BsaXRTY3JlZW5NdWx0aVdpbmRvdygpKSB7Ci0gICAgICAgICAgICBDTG9nLmxvZ0FuZERpc3BsYXkoTG9nTGV2ZWwuSU5GTywgIlNraXBwaW5nIHRlc3Q6IG5vIHNwbGl0IG11bHRpLXdpbmRvdyBzdXBwb3J0Iik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBTdHJpbmdbXSB3YWl0VGVzdEFjdGl2aXR5TmFtZSA9IG5ldyBTdHJpbmdbXSB7VEVTVF9BQ1RJVklUWV9OQU1FfTsKLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoVEVTVF9BQ1RJVklUWV9OQU1FKTsKLSAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwgd2FpdFRlc3RBY3Rpdml0eU5hbWUpOwotICAgICAgICBmaW5hbCBSZWN0YW5nbGUgZnVsbFNjcmVlbkJvdW5kcyA9Ci0gICAgICAgICAgICAgICAgbUFtV21TdGF0ZS5nZXRXbVN0YXRlKCkuZ2V0U3RhY2soRlVMTFNDUkVFTl9XT1JLU1BBQ0VfU1RBQ0tfSUQpLmdldEJvdW5kcygpOwotCi0gICAgICAgIG1vdmVBY3Rpdml0eVRvRG9ja1N0YWNrKFRFU1RfQUNUSVZJVFlfTkFNRSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIHdhaXRUZXN0QWN0aXZpdHlOYW1lKTsKLSAgICAgICAgbGF1bmNoQWN0aXZpdHlJblN0YWNrKE5PX1JFTEFVTkNIX0FDVElWSVRZX05BTUUsIEZVTExTQ1JFRU5fV09SS1NQQUNFX1NUQUNLX0lEKTsKLQotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXXtURVNUX0FDVElWSVRZX05BTUUsIE5PX1JFTEFVTkNIX0FDVElWSVRZX05BTUV9KTsKLSAgICAgICAgZmluYWwgUmVjdGFuZ2xlIGluaXRpYWxEb2NrQm91bmRzID0KLSAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLmdldFdtU3RhdGUoKS5nZXRTdGFjayhET0NLRURfU1RBQ0tfSUQpLmdldEJvdW5kcygpOwotCi0gICAgICAgIGZpbmFsIFN0cmluZyBsb2dTZXBhcmF0b3IgPSBjbGVhckxvZ2NhdCgpOwotCi0gICAgICAgIFJlY3RhbmdsZSBuZXdCb3VuZHMgPSBjb21wdXRlTmV3RG9ja0JvdW5kcyhmdWxsU2NyZWVuQm91bmRzLCBpbml0aWFsRG9ja0JvdW5kcywgdHJ1ZSk7Ci0gICAgICAgIHJlc2l6ZURvY2tlZFN0YWNrKG5ld0JvdW5kcy53aWR0aCwgbmV3Qm91bmRzLmhlaWdodCwgbmV3Qm91bmRzLndpZHRoLCBuZXdCb3VuZHMuaGVpZ2h0KTsKLSAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW117VEVTVF9BQ1RJVklUWV9OQU1FLCBOT19SRUxBVU5DSF9BQ1RJVklUWV9OQU1FfSk7Ci0KLSAgICAgICAgLy8gV2UgcmVzaXplIHR3aWNlIHRvIG1ha2Ugc3VyZSB3ZSBjcm9zcyBhbiBvcmllbnRhdGlvbiBjaGFuZ2UgdGhyZXNob2xkIGZvciBib3RoCi0gICAgICAgIC8vIGFjdGl2aXRpZXMuCi0gICAgICAgIG5ld0JvdW5kcyA9IGNvbXB1dGVOZXdEb2NrQm91bmRzKGZ1bGxTY3JlZW5Cb3VuZHMsIGluaXRpYWxEb2NrQm91bmRzLCBmYWxzZSk7Ci0gICAgICAgIHJlc2l6ZURvY2tlZFN0YWNrKG5ld0JvdW5kcy53aWR0aCwgbmV3Qm91bmRzLmhlaWdodCwgbmV3Qm91bmRzLndpZHRoLCBuZXdCb3VuZHMuaGVpZ2h0KTsKLSAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW117VEVTVF9BQ1RJVklUWV9OQU1FLCBOT19SRUxBVU5DSF9BQ1RJVklUWV9OQU1FfSk7Ci0gICAgICAgIGFzc2VydEFjdGl2aXR5TGlmZWN5Y2xlKFRFU1RfQUNUSVZJVFlfTkFNRSwgdHJ1ZSAvKiByZWxhdW5jaGVkICovLCBsb2dTZXBhcmF0b3IpOwotICAgICAgICBhc3NlcnRBY3Rpdml0eUxpZmVjeWNsZShOT19SRUxBVU5DSF9BQ1RJVklUWV9OQU1FLCBmYWxzZSAvKiByZWxhdW5jaGVkICovLCBsb2dTZXBhcmF0b3IpOwotICAgIH0KLQotICAgIHByaXZhdGUgUmVjdGFuZ2xlIGNvbXB1dGVOZXdEb2NrQm91bmRzKAotICAgICAgICAgICAgUmVjdGFuZ2xlIGZ1bGxzY3JlZW5Cb3VuZHMsIFJlY3RhbmdsZSBkb2NrQm91bmRzLCBib29sZWFuIHJlZHVjZVNpemUpIHsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBpbkxhbmRzY2FwZSA9IGZ1bGxzY3JlZW5Cb3VuZHMud2lkdGggPiBkb2NrQm91bmRzLndpZHRoOwotICAgICAgICAvLyBXZSBhcmUgZWl0aGVyIGluY3JlYXNpbmcgc2l6ZSBvciByZWR1Y2luZyBpdC4KLSAgICAgICAgZmluYWwgZmxvYXQgc2l6ZUNoYW5nZUZhY3RvciA9IHJlZHVjZVNpemUgPyAwLjVmIDogMS41ZjsKLSAgICAgICAgZmluYWwgUmVjdGFuZ2xlIG5ld0JvdW5kcyA9IG5ldyBSZWN0YW5nbGUoZG9ja0JvdW5kcyk7Ci0gICAgICAgIGlmIChpbkxhbmRzY2FwZSkgewotICAgICAgICAgICAgLy8gSW4gbGFuZHNjYXBlIHdlIGNoYW5nZSB0aGUgd2lkdGguCi0gICAgICAgICAgICBuZXdCb3VuZHMud2lkdGggKj0gc2l6ZUNoYW5nZUZhY3RvcjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIEluIHBvcnRyYWl0IHdlIGNoYW5nZSB0aGUgaGVpZ2h0Ci0gICAgICAgICAgICBuZXdCb3VuZHMuaGVpZ2h0ICo9IHNpemVDaGFuZ2VGYWN0b3I7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3Qm91bmRzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFja0xpc3RPcmRlckxhdW5jaERvY2tlZEFjdGl2aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghc3VwcG9ydHNTcGxpdFNjcmVlbk11bHRpV2luZG93KCkpIHsKLSAgICAgICAgICAgIENMb2cubG9nQW5kRGlzcGxheShMb2dMZXZlbC5JTkZPLCAiU2tpcHBpbmcgdGVzdDogbm8gc3BsaXQgbXVsdGktd2luZG93IHN1cHBvcnQiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5SW5Eb2NrU3RhY2soVEVTVF9BQ1RJVklUWV9OQU1FKTsKLSAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwgbmV3IFN0cmluZ1tde1RFU1RfQUNUSVZJVFlfTkFNRX0pOwotCi0gICAgICAgIGZpbmFsIGludCBob21lU3RhY2tJbmRleCA9IG1BbVdtU3RhdGUuZ2V0U3RhY2tQb3NpdGlvbihIT01FX1NUQUNLX0lEKTsKLSAgICAgICAgZmluYWwgaW50IHJlY2VudHNTdGFja0luZGV4ID0gbUFtV21TdGF0ZS5nZXRTdGFja1Bvc2l0aW9uKFJFQ0VOVFNfU1RBQ0tfSUQpOwotICAgICAgICBhc3NlcnRUcnVlKCJSZWNlbnRzIHN0YWNrIHNob3VsZCBiZSBvbiB0b3Agb2YgaG9tZSBzdGFjayIsCi0gICAgICAgICAgICAgICAgcmVjZW50c1N0YWNrSW5kZXggPCBob21lU3RhY2tJbmRleCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGxhdW5jaEFjdGl2aXR5SW5Eb2NrU3RhY2tBbmRNaW5pbWl6ZShTdHJpbmcgYWN0aXZpdHlOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbGF1bmNoQWN0aXZpdHlJbkRvY2tTdGFjayhhY3Rpdml0eU5hbWUpOwotICAgICAgICBwcmVzc0hvbWVCdXR0b24oKTsKLSAgICAgICAgd2FpdEZvckRvY2tNaW5pbWl6ZWQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0RG9ja01pbmltaXplZCgpIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZShtQW1XbVN0YXRlLmdldFdtU3RhdGUoKS5pc0RvY2tlZFN0YWNrTWluaW1pemVkKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhc3NlcnREb2NrTm90TWluaW1pemVkKCkgewotICAgICAgICBhc3NlcnRGYWxzZShtQW1XbVN0YXRlLmdldFdtU3RhdGUoKS5pc0RvY2tlZFN0YWNrTWluaW1pemVkKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB3YWl0Rm9yRG9ja01pbmltaXplZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JXaXRoV21TdGF0ZShtRGV2aWNlLCBzdGF0ZSAtPiBzdGF0ZS5pc0RvY2tlZFN0YWNrTWluaW1pemVkKCksCi0gICAgICAgICAgICAgICAgIioqKldhaXRpbmcgZm9yIERvY2sgc3RhY2sgdG8gYmUgbWluaW1pemVkIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHdhaXRGb3JEb2NrTm90TWluaW1pemVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1BbVdtU3RhdGUud2FpdEZvcldpdGhXbVN0YXRlKG1EZXZpY2UsIHN0YXRlIC0+ICFzdGF0ZS5pc0RvY2tlZFN0YWNrTWluaW1pemVkKCksCi0gICAgICAgICAgICAgICAgIioqKldhaXRpbmcgZm9yIERvY2sgc3RhY2sgdG8gbm90IGJlIG1pbmltaXplZCIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0FjdGl2aXR5TWFuYWdlckZyZWVmb3JtU3RhY2tUZXN0cy5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvQWN0aXZpdHlNYW5hZ2VyRnJlZWZvcm1TdGFja1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExZDc2YzguLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvQWN0aXZpdHlNYW5hZ2VyRnJlZWZvcm1TdGFja1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnNlcnZlci5jdHM7Ci0KLWltcG9ydCBhbmRyb2lkLnNlcnZlci5jdHMuQWN0aXZpdHlNYW5hZ2VyU3RhdGUuQWN0aXZpdHlTdGFjazsKLWltcG9ydCBhbmRyb2lkLnNlcnZlci5jdHMuQWN0aXZpdHlNYW5hZ2VyU3RhdGUuQWN0aXZpdHlUYXNrOwotCi1pbXBvcnQgamF2YS5hd3QuUmVjdGFuZ2xlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLS8qKgotICogQnVpbGQ6IG1tbWEgLWozMiBjdHMvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcwotICogUnVuOiBjdHMvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvdXRpbC9ydW4tdGVzdCBDdHNTZXJ2aWNlc0hvc3RUZXN0Q2FzZXMgYW5kcm9pZC5zZXJ2ZXIuY3RzLkFjdGl2aXR5TWFuYWdlckZyZWVmb3JtU3RhY2tUZXN0cwotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlNYW5hZ2VyRnJlZWZvcm1TdGFja1Rlc3RzIGV4dGVuZHMgQWN0aXZpdHlNYW5hZ2VyVGVzdEJhc2UgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQUNUSVZJVFkgPSAiVGVzdEFjdGl2aXR5IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEVTVF9UQVNLX09GRlNFVCA9IDIwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBURVNUX1RBU0tfT0ZGU0VUXzIgPSAxMDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRFU1RfVEFTS19TSVpFXzEgPSA5MDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRFU1RfVEFTS19TSVpFXzIgPSBURVNUX1RBU0tfU0laRV8xICogMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEVTVF9UQVNLX1NJWkVfRFBfMSA9IDIyMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEVTVF9UQVNLX1NJWkVfRFBfMiA9IFRFU1RfVEFTS19TSVpFX0RQXzEgKiAyOwotCi0gICAgLy8gTk9URTogTGF1bmNoaW5nIHRoZSBGcmVlZm9ybUFjdGl2aXR5IHdpbGwgYXV0b21hdGljYWxseSBsYXVuY2ggdGhlIFRlc3RBY3Rpdml0eQotICAgIC8vIHdpdGggYm91bmRzICgwLCAwLCA5MDAsIDkwMCkKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlJFRUZPUk1fQUNUSVZJVFkgPSAiRnJlZWZvcm1BY3Rpdml0eSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PTl9SRVNJWkVBQkxFX0FDVElWSVRZID0gIk5vblJlc2l6ZWFibGVBY3Rpdml0eSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PX1JFTEFVTkNIX0FDVElWSVRZID0gIk5vUmVsYXVuY2hBY3Rpdml0eSI7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RnJlZWZvcm1XaW5kb3dNYW5hZ2VtZW50U3VwcG9ydCgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5SW5TdGFjayhGUkVFRk9STV9BQ1RJVklUWSwgRlJFRUZPUk1fV09SS1NQQUNFX1NUQUNLX0lEKTsKLQotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCBuZXcgU3RyaW5nW10ge0ZSRUVGT1JNX0FDVElWSVRZLCBURVNUX0FDVElWSVRZfSk7Ci0KLSAgICAgICAgaWYgKCFzdXBwb3J0c0ZyZWVmb3JtKCkpIHsKLSAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0RG9lc05vdENvbnRhaW5TdGFjaygKLSAgICAgICAgICAgICAgICAgICAgIk11c3Qgbm90IGNvbnRhaW4gZnJlZWZvcm0gc3RhY2suIiwgRlJFRUZPUk1fV09SS1NQQUNFX1NUQUNLX0lEKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0RnJvbnRTdGFjaygKLSAgICAgICAgICAgICAgICAiRnJlZWZvcm0gc3RhY2sgbXVzdCBiZSB0aGUgZnJvbnQgc3RhY2suIiwgRlJFRUZPUk1fV09SS1NQQUNFX1NUQUNLX0lEKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KEZSRUVGT1JNX0FDVElWSVRZLCB0cnVlKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFRFU1RfQUNUSVZJVFksIHRydWUpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRBY3Rpdml0eSgKLSAgICAgICAgICAgICAgICBURVNUX0FDVElWSVRZICsgIiBtdXN0IGJlIGZvY3VzZWQgQWN0aXZpdHkiLCBURVNUX0FDVElWSVRZKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgVEVTVF9UQVNLX1NJWkVfMSwgVEVTVF9UQVNLX1NJWkVfMSksCi0gICAgICAgICAgICAgICAgbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0VGFza0J5QWN0aXZpdHlOYW1lKFRFU1RfQUNUSVZJVFkpLmdldEJvdW5kcygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uUmVzaXplYWJsZUFjdGl2aXR5SGFzRnVsbERpc3BsYXlCb3VuZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbGF1bmNoQWN0aXZpdHlJblN0YWNrKE5PTl9SRVNJWkVBQkxFX0FDVElWSVRZLCBGUkVFRk9STV9XT1JLU1BBQ0VfU1RBQ0tfSUQpOwotCi0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIG5ldyBTdHJpbmdbXSB7Tk9OX1JFU0laRUFCTEVfQUNUSVZJVFl9KTsKLQotICAgICAgICBmaW5hbCBBY3Rpdml0eVRhc2sgdGFzayA9Ci0gICAgICAgICAgICAgICAgbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0VGFza0J5QWN0aXZpdHlOYW1lKE5PTl9SRVNJWkVBQkxFX0FDVElWSVRZKTsKLSAgICAgICAgZmluYWwgQWN0aXZpdHlTdGFjayBzdGFjayA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFN0YWNrQnlJZCh0YXNrLm1TdGFja0lkKTsKLQotICAgICAgICBpZiAodGFzay5pc0Z1bGxzY3JlZW4oKSkgewotICAgICAgICAgICAgLy8gSWYgdGhlIHRhc2sgaXMgb24gdGhlIGZ1bGxzY3JlZW4gc3RhY2ssIHRoZW4gd2Uga25vdyB0aGF0IGl0IHdpbGwgaGF2ZSBib3VuZHMgdGhhdAotICAgICAgICAgICAgLy8gZmlsbCB0aGUgZW50aXJlIGRpc3BsYXkuCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiB0aGUgdGFzayBpcyBub3Qgb24gdGhlIGZ1bGxzY3JlZW4gc3RhY2ssIHRoZW4gY29tcGFyZSB0aGUgdGFzayBib3VuZHMgdG8gdGhlIGRpc3BsYXkKLSAgICAgICAgLy8gYm91bmRzLgotICAgICAgICBhc3NlcnRFcXVhbHMobUFtV21TdGF0ZS5nZXRXbVN0YXRlKCkuZ2V0RGlzcGxheShzdGFjay5tRGlzcGxheUlkKS5nZXREaXNwbGF5UmVjdCgpLAotICAgICAgICAgICAgICAgIHRhc2suZ2V0Qm91bmRzKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBY3Rpdml0eUxpZmVDeWNsZU9uUmVzaXplRnJlZWZvcm1UYXNrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGxhdW5jaEFjdGl2aXR5SW5TdGFjayhURVNUX0FDVElWSVRZLCBGUkVFRk9STV9XT1JLU1BBQ0VfU1RBQ0tfSUQpOwotICAgICAgICBsYXVuY2hBY3Rpdml0eUluU3RhY2soTk9fUkVMQVVOQ0hfQUNUSVZJVFksIEZSRUVGT1JNX1dPUktTUEFDRV9TVEFDS19JRCk7Ci0KLSAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwgbmV3IFN0cmluZ1tde1RFU1RfQUNUSVZJVFksIE5PX1JFTEFVTkNIX0FDVElWSVRZfSk7Ci0KLSAgICAgICAgaWYgKCFzdXBwb3J0c0ZyZWVmb3JtKCkpIHsKLSAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0RG9lc05vdENvbnRhaW5TdGFjaygKLSAgICAgICAgICAgICAgICAgICAgIk11c3Qgbm90IGNvbnRhaW4gZnJlZWZvcm0gc3RhY2suIiwgRlJFRUZPUk1fV09SS1NQQUNFX1NUQUNLX0lEKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIGludCBkaXNwbGF5SWQgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja0J5SWQoCi0gICAgICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyVGVzdEJhc2UuRlJFRUZPUk1fV09SS1NQQUNFX1NUQUNLX0lEKS5tRGlzcGxheUlkOwotICAgICAgICBmaW5hbCBpbnQgZGVuc2l0eURwaSA9Ci0gICAgICAgICAgICAgICAgbUFtV21TdGF0ZS5nZXRXbVN0YXRlKCkuZ2V0RGlzcGxheShkaXNwbGF5SWQpLmdldERwaSgpOwotICAgICAgICBmaW5hbCBpbnQgdGVzdFRhc2tTaXplMSA9Ci0gICAgICAgICAgICAgICAgQWN0aXZpdHlBbmRXaW5kb3dNYW5hZ2Vyc1N0YXRlLmRwVG9QeChURVNUX1RBU0tfU0laRV9EUF8xLCBkZW5zaXR5RHBpKTsKLSAgICAgICAgZmluYWwgaW50IHRlc3RUYXNrU2l6ZTIgPQotICAgICAgICAgICAgICAgIEFjdGl2aXR5QW5kV2luZG93TWFuYWdlcnNTdGF0ZS5kcFRvUHgoVEVTVF9UQVNLX1NJWkVfRFBfMiwgZGVuc2l0eURwaSk7Ci0KLSAgICAgICAgcmVzaXplQWN0aXZpdHlUYXNrKFRFU1RfQUNUSVZJVFksCi0gICAgICAgICAgICAgICAgVEVTVF9UQVNLX09GRlNFVCwgVEVTVF9UQVNLX09GRlNFVCwgdGVzdFRhc2tTaXplMSwgdGVzdFRhc2tTaXplMik7Ci0gICAgICAgIHJlc2l6ZUFjdGl2aXR5VGFzayhOT19SRUxBVU5DSF9BQ1RJVklUWSwKLSAgICAgICAgICAgICAgICBURVNUX1RBU0tfT0ZGU0VUXzIsIFRFU1RfVEFTS19PRkZTRVRfMiwgdGVzdFRhc2tTaXplMSwgdGVzdFRhc2tTaXplMik7Ci0KLSAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwgbmV3IFN0cmluZ1tde1RFU1RfQUNUSVZJVFksIE5PX1JFTEFVTkNIX0FDVElWSVRZfSk7Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIGxvZ1NlcGFyYXRvciA9IGNsZWFyTG9nY2F0KCk7Ci0gICAgICAgIHJlc2l6ZUFjdGl2aXR5VGFzayhURVNUX0FDVElWSVRZLAotICAgICAgICAgICAgICAgIFRFU1RfVEFTS19PRkZTRVQsIFRFU1RfVEFTS19PRkZTRVQsIHRlc3RUYXNrU2l6ZTIsIHRlc3RUYXNrU2l6ZTEpOwotICAgICAgICByZXNpemVBY3Rpdml0eVRhc2soTk9fUkVMQVVOQ0hfQUNUSVZJVFksCi0gICAgICAgICAgICAgICAgVEVTVF9UQVNLX09GRlNFVF8yLCBURVNUX1RBU0tfT0ZGU0VUXzIsIHRlc3RUYXNrU2l6ZTIsIHRlc3RUYXNrU2l6ZTEpOwotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCBuZXcgU3RyaW5nW117VEVTVF9BQ1RJVklUWSwgTk9fUkVMQVVOQ0hfQUNUSVZJVFl9KTsKLQotICAgICAgICBhc3NlcnRBY3Rpdml0eUxpZmVjeWNsZShURVNUX0FDVElWSVRZLCB0cnVlIC8qIHJlbGF1bmNoZWQgKi8sIGxvZ1NlcGFyYXRvcik7Ci0gICAgICAgIGFzc2VydEFjdGl2aXR5TGlmZWN5Y2xlKE5PX1JFTEFVTkNIX0FDVElWSVRZLCBmYWxzZSAvKiByZWxhdW5jaGVkICovLCBsb2dTZXBhcmF0b3IpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0FjdGl2aXR5TWFuYWdlck1hbmlmZXN0TGF5b3V0VGVzdHMuamF2YSBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0FjdGl2aXR5TWFuYWdlck1hbmlmZXN0TGF5b3V0VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZkZjRiMi4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9BY3Rpdml0eU1hbmFnZXJNYW5pZmVzdExheW91dFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuY3RzOwotCi1pbXBvcnQgamF2YS5sYW5nLkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuU3RyaW5nOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotCi1pbXBvcnQgamF2YS5hd3QuUmVjdGFuZ2xlOwotaW1wb3J0IGFuZHJvaWQuc2VydmVyLmN0cy5XaW5kb3dNYW5hZ2VyU3RhdGUuV2luZG93U3RhdGU7Ci1pbXBvcnQgYW5kcm9pZC5zZXJ2ZXIuY3RzLldpbmRvd01hbmFnZXJTdGF0ZS5EaXNwbGF5OwotCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmN0cy5BY3Rpdml0eUFuZFdpbmRvd01hbmFnZXJzU3RhdGUuZHBUb1B4OwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5kZG1saWIuTG9nLkxvZ0xldmVsLklORk87Ci0KLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5sb2cuTG9nVXRpbC5DTG9nOwotCi0vKioKLSAqIEJ1aWxkOiBtbW1hIC1qMzIgY3RzL2hvc3RzaWRldGVzdHMvc2VydmljZXMKLSAqIFJ1bjogY3RzL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL3V0aWwvcnVuLXRlc3QgQ3RzU2VydmljZXNIb3N0VGVzdENhc2VzIGFuZHJvaWQuc2VydmVyLmN0cy5BY3Rpdml0eU1hbmFnZXJNYW5pZmVzdExheW91dFRlc3RzCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eU1hbmFnZXJNYW5pZmVzdExheW91dFRlc3RzIGV4dGVuZHMgQWN0aXZpdHlNYW5hZ2VyVGVzdEJhc2UgewotCi0gICAgLy8gVGVzdCBwYXJhbWV0ZXJzCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfV0lEVEhfRFAgPSAyNDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfSEVJR0hUX0RQID0gMTYwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IERFRkFVTFRfV0lEVEhfRlJBQ1RJT04gPSAwLjI1ZjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBERUZBVUxUX0hFSUdIVF9GUkFDVElPTiA9IDAuMzVmOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNSU5fV0lEVEhfRFAgPSAxMDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1JTl9IRUlHSFRfRFAgPSA4MDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHUkFWSVRZX1ZFUl9DRU5URVIgPSAweDAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHUkFWSVRZX1ZFUl9UT1AgICAgPSAweDAyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHUkFWSVRZX1ZFUl9CT1RUT00gPSAweDA0OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHUkFWSVRZX0hPUl9DRU5URVIgPSAweDEwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHUkFWSVRZX0hPUl9MRUZUICAgPSAweDIwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHUkFWSVRZX0hPUl9SSUdIVCAgPSAweDQwOwotCi0gICAgcHJpdmF0ZSBMaXN0PFdpbmRvd1N0YXRlPiBtVGVtcFdpbmRvd0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgcHJpdmF0ZSBEaXNwbGF5IG1EaXNwbGF5OwotICAgIHByaXZhdGUgV2luZG93U3RhdGUgbVdpbmRvd1N0YXRlOwotCi0gICAgcHVibGljIHZvaWQgdGVzdEdyYXZpdHlBbmREZWZhdWx0U2l6ZVRvcExlZnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdExheW91dChHUkFWSVRZX1ZFUl9UT1AsIEdSQVZJVFlfSE9SX0xFRlQsIGZhbHNlIC8qZnJhY3Rpb24qLyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdyYXZpdHlBbmREZWZhdWx0U2l6ZVRvcFJpZ2h0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RMYXlvdXQoR1JBVklUWV9WRVJfVE9QLCBHUkFWSVRZX0hPUl9SSUdIVCwgdHJ1ZSAvKmZyYWN0aW9uKi8pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHcmF2aXR5QW5kRGVmYXVsdFNpemVCb3R0b21MZWZ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RMYXlvdXQoR1JBVklUWV9WRVJfQk9UVE9NLCBHUkFWSVRZX0hPUl9MRUZULCB0cnVlIC8qZnJhY3Rpb24qLyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdyYXZpdHlBbmREZWZhdWx0U2l6ZUJvdHRvbVJpZ2h0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RMYXlvdXQoR1JBVklUWV9WRVJfQk9UVE9NLCBHUkFWSVRZX0hPUl9SSUdIVCwgZmFsc2UgLypmcmFjdGlvbiovKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWluaW1hbFNpemVGcmVlZm9ybSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIXN1cHBvcnRzRnJlZWZvcm0oKSkgewotICAgICAgICAgICAgQ0xvZy5sb2dBbmREaXNwbGF5KElORk8sICJTa2lwcGluZyB0ZXN0OiBubyBmcmVlZm9ybSBzdXBwb3J0Iik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgdGVzdE1pbmltYWxTaXplKEZSRUVGT1JNX1dPUktTUEFDRV9TVEFDS19JRCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1pbmltYWxTaXplRG9ja2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghc3VwcG9ydHNTcGxpdFNjcmVlbk11bHRpV2luZG93KCkpIHsKLSAgICAgICAgICAgIENMb2cubG9nQW5kRGlzcGxheShJTkZPLCAiU2tpcHBpbmcgdGVzdDogbm8gbXVsdGktd2luZG93IHN1cHBvcnQiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICB0ZXN0TWluaW1hbFNpemUoRE9DS0VEX1NUQUNLX0lEKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdE1pbmltYWxTaXplKGludCBzdGFja0lkKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIGFjdGl2aXR5TmFtZSA9ICJCb3R0b21SaWdodExheW91dEFjdGl2aXR5IjsKLQotICAgICAgICAvLyBJc3N1ZSBjb21tYW5kIHRvIHJlc2l6ZSB0byA8MCwwLDEsMT4uIFdlIGV4cGVjdCB0aGUgc2l6ZSB0byBiZSBmbG9vcmVkIGF0Ci0gICAgICAgIC8vIE1JTl9XSURUSF9EUHhNSU5fSEVJR0hUX0RQLgotICAgICAgICBpZiAoc3RhY2tJZCA9PSBGUkVFRk9STV9XT1JLU1BBQ0VfU1RBQ0tfSUQpIHsKLSAgICAgICAgICAgIGxhdW5jaEFjdGl2aXR5SW5TdGFjayhhY3Rpdml0eU5hbWUsIHN0YWNrSWQpOwotICAgICAgICAgICAgcmVzaXplQWN0aXZpdHlUYXNrKGFjdGl2aXR5TmFtZSwgMCwgMCwgMSwgMSk7Ci0gICAgICAgIH0gZWxzZSB7IC8vIHN0YWNrSWQgPT0gRE9DS0VEX1NUQUNLX0lECi0gICAgICAgICAgICBsYXVuY2hBY3Rpdml0eUluRG9ja1N0YWNrKGFjdGl2aXR5TmFtZSk7Ci0gICAgICAgICAgICByZXNpemVEb2NrZWRTdGFjaygxLCAxLCAxLCAxKTsKLSAgICAgICAgfQotICAgICAgICBnZXREaXNwbGF5QW5kV2luZG93U3RhdGUoYWN0aXZpdHlOYW1lLCBmYWxzZSk7Ci0KLSAgICAgICAgZmluYWwgaW50IG1pbldpZHRoID0gZHBUb1B4KE1JTl9XSURUSF9EUCwgbURpc3BsYXkuZ2V0RHBpKCkpOwotICAgICAgICBmaW5hbCBpbnQgbWluSGVpZ2h0ID0gZHBUb1B4KE1JTl9IRUlHSFRfRFAsIG1EaXNwbGF5LmdldERwaSgpKTsKLSAgICAgICAgZmluYWwgUmVjdGFuZ2xlIGNvbnRhaW5pbmdSZWN0ID0gbVdpbmRvd1N0YXRlLmdldENvbnRhaW5pbmdGcmFtZSgpOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIk1pbiB3aWR0aCBpcyBpbmNvcnJlY3QiLCBtaW5XaWR0aCwgY29udGFpbmluZ1JlY3Qud2lkdGgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJNaW4gaGVpZ2h0IGlzIGluY29ycmVjdCIsIG1pbkhlaWdodCwgY29udGFpbmluZ1JlY3QuaGVpZ2h0KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdExheW91dCgKLSAgICAgICAgICAgIGludCB2R3Jhdml0eSwgaW50IGhHcmF2aXR5LCBib29sZWFuIGZyYWN0aW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0c0ZyZWVmb3JtKCkpIHsKLSAgICAgICAgICAgIENMb2cubG9nQW5kRGlzcGxheShJTkZPLCAiU2tpcHBpbmcgdGVzdDogbm8gZnJlZWZvcm0gc3VwcG9ydCIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIGFjdGl2aXR5TmFtZSA9ICh2R3Jhdml0eSA9PSBHUkFWSVRZX1ZFUl9UT1AgPyAiVG9wIiA6ICJCb3R0b20iKQotICAgICAgICAgICAgICAgICsgKGhHcmF2aXR5ID09IEdSQVZJVFlfSE9SX0xFRlQgPyAiTGVmdCIgOiAiUmlnaHQiKSArICJMYXlvdXRBY3Rpdml0eSI7Ci0KLSAgICAgICAgLy8gTGF1bmNoIGluIGZyZWVmb3JtIHN0YWNrCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5SW5TdGFjayhhY3Rpdml0eU5hbWUsIEZSRUVGT1JNX1dPUktTUEFDRV9TVEFDS19JRCk7Ci0KLSAgICAgICAgZ2V0RGlzcGxheUFuZFdpbmRvd1N0YXRlKGFjdGl2aXR5TmFtZSwgdHJ1ZSk7Ci0KLSAgICAgICAgZmluYWwgUmVjdGFuZ2xlIGNvbnRhaW5pbmdSZWN0ID0gbVdpbmRvd1N0YXRlLmdldENvbnRhaW5pbmdGcmFtZSgpOwotICAgICAgICBmaW5hbCBSZWN0YW5nbGUgYXBwUmVjdCA9IG1EaXNwbGF5LmdldEFwcFJlY3QoKTsKLSAgICAgICAgZmluYWwgaW50IGV4cGVjdGVkV2lkdGhQeCwgZXhwZWN0ZWRIZWlnaHRQeDsKLSAgICAgICAgLy8gRXZhbHVhdGUgdGhlIGV4cGVjdGVkIHdpbmRvdyBzaXplIGluIHB4LiBJZiB3ZSdyZSB1c2luZyBmcmFjdGlvbiBkaW1lbnNpb25zLAotICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIHNpemUgYmFzZWQgb24gdGhlIGFwcCByZWN0IHNpemUuIE90aGVyd2lzZSwgY29udmVydCB0aGUgZXhwZWN0ZWQKLSAgICAgICAgLy8gc2l6ZSBpbiBkcCB0byBweC4KLSAgICAgICAgaWYgKGZyYWN0aW9uKSB7Ci0gICAgICAgICAgICBleHBlY3RlZFdpZHRoUHggPSAoaW50KSAoYXBwUmVjdC53aWR0aCAqIERFRkFVTFRfV0lEVEhfRlJBQ1RJT04pOwotICAgICAgICAgICAgZXhwZWN0ZWRIZWlnaHRQeCA9IChpbnQpIChhcHBSZWN0LmhlaWdodCAqIERFRkFVTFRfSEVJR0hUX0ZSQUNUSU9OKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBkZW5zaXR5RHBpID0gbURpc3BsYXkuZ2V0RHBpKCk7Ci0gICAgICAgICAgICBleHBlY3RlZFdpZHRoUHggPSBkcFRvUHgoREVGQVVMVF9XSURUSF9EUCwgZGVuc2l0eURwaSk7Ci0gICAgICAgICAgICBleHBlY3RlZEhlaWdodFB4ID0gZHBUb1B4KERFRkFVTFRfSEVJR0hUX0RQLCBkZW5zaXR5RHBpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZlcmlmeUZyYW1lU2l6ZUFuZFBvc2l0aW9uKAotICAgICAgICAgICAgICAgIHZHcmF2aXR5LCBoR3Jhdml0eSwgZXhwZWN0ZWRXaWR0aFB4LCBleHBlY3RlZEhlaWdodFB4LCBjb250YWluaW5nUmVjdCwgYXBwUmVjdCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGdldERpc3BsYXlBbmRXaW5kb3dTdGF0ZShTdHJpbmcgYWN0aXZpdHlOYW1lLCBib29sZWFuIGNoZWNrRm9jdXMpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHdpbmRvd05hbWUgPSBnZXRXaW5kb3dOYW1lKGFjdGl2aXR5TmFtZSk7Ci0KLSAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwgbmV3IFN0cmluZ1tdIHthY3Rpdml0eU5hbWV9KTsKLQotICAgICAgICBpZiAoY2hlY2tGb2N1cykgewotICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkV2luZG93KCJUZXN0IHdpbmRvdyBtdXN0IGJlIHRoZSBmcm9udCB3aW5kb3cuIiwgd2luZG93TmFtZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoYWN0aXZpdHlOYW1lLCB0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1BbVdtU3RhdGUuZ2V0V21TdGF0ZSgpLmdldE1hdGNoaW5nVmlzaWJsZVdpbmRvd1N0YXRlKHdpbmRvd05hbWUsIG1UZW1wV2luZG93TGlzdCk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiU2hvdWxkIGhhdmUgZXhhY3RseSBvbmUgd2luZG93IHN0YXRlIGZvciB0aGUgYWN0aXZpdHkuIiwKLSAgICAgICAgICAgICAgICAxLCBtVGVtcFdpbmRvd0xpc3Quc2l6ZSgpKTsKLQotICAgICAgICBtV2luZG93U3RhdGUgPSBtVGVtcFdpbmRvd0xpc3QuZ2V0KDApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiU2hvdWxkIGhhdmUgYSB2YWxpZCB3aW5kb3ciLCBtV2luZG93U3RhdGUpOwotCi0gICAgICAgIG1EaXNwbGF5ID0gbUFtV21TdGF0ZS5nZXRXbVN0YXRlKCkuZ2V0RGlzcGxheShtV2luZG93U3RhdGUuZ2V0RGlzcGxheUlkKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiU2hvdWxkIGJlIG9uIGEgZGlzcGxheSIsIG1EaXNwbGF5KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdmVyaWZ5RnJhbWVTaXplQW5kUG9zaXRpb24oCi0gICAgICAgICAgICBpbnQgdkdyYXZpdHksIGludCBoR3Jhdml0eSwgaW50IGV4cGVjdGVkV2lkdGhQeCwgaW50IGV4cGVjdGVkSGVpZ2h0UHgsCi0gICAgICAgICAgICBSZWN0YW5nbGUgY29udGFpbmluZ0ZyYW1lLCBSZWN0YW5nbGUgcGFyZW50RnJhbWUpIHsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiV2lkdGggaXMgaW5jb3JyZWN0IiwgZXhwZWN0ZWRXaWR0aFB4LCBjb250YWluaW5nRnJhbWUud2lkdGgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJIZWlnaHQgaXMgaW5jb3JyZWN0IiwgZXhwZWN0ZWRIZWlnaHRQeCwgY29udGFpbmluZ0ZyYW1lLmhlaWdodCk7Ci0KLSAgICAgICAgaWYgKHZHcmF2aXR5ID09IEdSQVZJVFlfVkVSX1RPUCkgewotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiU2hvdWxkIGJlIG9uIHRoZSB0b3AiLCBwYXJlbnRGcmFtZS55LCBjb250YWluaW5nRnJhbWUueSk7Ci0gICAgICAgIH0gZWxzZSBpZiAodkdyYXZpdHkgPT0gR1JBVklUWV9WRVJfQk9UVE9NKSB7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJTaG91bGQgYmUgb24gdGhlIGJvdHRvbSIsCi0gICAgICAgICAgICAgICAgICAgIHBhcmVudEZyYW1lLnkgKyBwYXJlbnRGcmFtZS5oZWlnaHQsIGNvbnRhaW5pbmdGcmFtZS55ICsgY29udGFpbmluZ0ZyYW1lLmhlaWdodCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaEdyYXZpdHkgPT0gR1JBVklUWV9IT1JfTEVGVCkgewotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiU2hvdWxkIGJlIG9uIHRoZSBsZWZ0IiwgcGFyZW50RnJhbWUueCwgY29udGFpbmluZ0ZyYW1lLngpOwotICAgICAgICB9IGVsc2UgaWYgKGhHcmF2aXR5ID09IEdSQVZJVFlfSE9SX1JJR0hUKXsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIlNob3VsZCBiZSBvbiB0aGUgcmlnaHQiLAotICAgICAgICAgICAgICAgICAgICBwYXJlbnRGcmFtZS54ICsgcGFyZW50RnJhbWUud2lkdGgsIGNvbnRhaW5pbmdGcmFtZS54ICsgY29udGFpbmluZ0ZyYW1lLndpZHRoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0FjdGl2aXR5TWFuYWdlclBpbm5lZFN0YWNrVGVzdHMuamF2YSBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0FjdGl2aXR5TWFuYWdlclBpbm5lZFN0YWNrVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVlYjMyMC4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9BY3Rpdml0eU1hbmFnZXJQaW5uZWRTdGFja1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuY3RzOwotCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmN0cy5BY3Rpdml0eUFuZFdpbmRvd01hbmFnZXJzU3RhdGUuREVGQVVMVF9ESVNQTEFZX0lEOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5jdHMuQWN0aXZpdHlNYW5hZ2VyU3RhdGUuU1RBVEVfU1RPUFBFRDsKLQotaW1wb3J0IGFuZHJvaWQuc2VydmVyLmN0cy5BY3Rpdml0eU1hbmFnZXJTdGF0ZS5BY3Rpdml0eVN0YWNrOwotaW1wb3J0IGFuZHJvaWQuc2VydmVyLmN0cy5BY3Rpdml0eU1hbmFnZXJTdGF0ZS5BY3Rpdml0eVRhc2s7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNkZFRlc3Q7Ci0KLWltcG9ydCBqYXZhLmF3dC5SZWN0YW5nbGU7Ci1pbXBvcnQgamF2YS5sYW5nLkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuU3RyaW5nOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLS8qKgotICogQnVpbGQ6IG1tbWEgLWozMiBjdHMvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcwotICogUnVuOiBjdHMvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvdXRpbC9ydW4tdGVzdCBDdHNTZXJ2aWNlc0hvc3RUZXN0Q2FzZXMgYW5kcm9pZC5zZXJ2ZXIuY3RzLkFjdGl2aXR5TWFuYWdlclBpbm5lZFN0YWNrVGVzdHMKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5TWFuYWdlclBpbm5lZFN0YWNrVGVzdHMgZXh0ZW5kcyBBY3Rpdml0eU1hbmFnZXJUZXN0QmFzZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQUNUSVZJVFkgPSAiVGVzdEFjdGl2aXR5IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9BQ1RJVklUWV9XSVRIX1NBTUVfQUZGSU5JVFkgPSAiVGVzdEFjdGl2aXR5V2l0aFNhbWVBZmZpbml0eSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQU5TTFVDRU5UX1RFU1RfQUNUSVZJVFkgPSAiVHJhbnNsdWNlbnRUZXN0QWN0aXZpdHkiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT05fUkVTSVpFQUJMRV9BQ1RJVklUWSA9ICJOb25SZXNpemVhYmxlQWN0aXZpdHkiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTUVfV0hJTEVfUEFVU0lOR19BQ1RJVklUWSA9ICJSZXN1bWVXaGlsZVBhdXNpbmdBY3Rpdml0eSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBJUF9BQ1RJVklUWSA9ICJQaXBBY3Rpdml0eSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBJUF9BQ1RJVklUWTIgPSAiUGlwQWN0aXZpdHkyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUElQX0FDVElWSVRZX1dJVEhfU0FNRV9BRkZJTklUWSA9ICJQaXBBY3Rpdml0eVdpdGhTYW1lQWZmaW5pdHkiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTFdBWVNfRk9DVVNBQkxFX1BJUF9BQ1RJVklUWSA9ICJBbHdheXNGb2N1c2FibGVQaXBBY3Rpdml0eSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBVU5DSF9JTlRPX1BJTk5FRF9TVEFDS19QSVBfQUNUSVZJVFkgPQotICAgICAgICAgICAgIkxhdW5jaEludG9QaW5uZWRTdGFja1BpcEFjdGl2aXR5IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFVTkNIX0VOVEVSX1BJUF9BQ1RJVklUWSA9ICJMYXVuY2hFbnRlclBpcEFjdGl2aXR5IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUElQX09OX1NUT1BfQUNUSVZJVFkgPSAiUGlwT25TdG9wQWN0aXZpdHkiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0ZJWEVEX09SSUVOVEFUSU9OID0gImZpeGVkX29yaWVudGF0aW9uIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfRU5URVJfUElQID0gImVudGVyX3BpcCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0VOVEVSX1BJUF9BU1BFQ1RfUkFUSU9fTlVNRVJBVE9SID0KLSAgICAgICAgICAgICJlbnRlcl9waXBfYXNwZWN0X3JhdGlvX251bWVyYXRvciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0VOVEVSX1BJUF9BU1BFQ1RfUkFUSU9fREVOT01JTkFUT1IgPQotICAgICAgICAgICAgImVudGVyX3BpcF9hc3BlY3RfcmF0aW9fZGVub21pbmF0b3IiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9TRVRfQVNQRUNUX1JBVElPX05VTUVSQVRPUiA9ICJzZXRfYXNwZWN0X3JhdGlvX251bWVyYXRvciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1NFVF9BU1BFQ1RfUkFUSU9fREVOT01JTkFUT1IgPSAic2V0X2FzcGVjdF9yYXRpb19kZW5vbWluYXRvciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1NFVF9BU1BFQ1RfUkFUSU9fV0lUSF9ERUxBWV9OVU1FUkFUT1IgPQotICAgICAgICAgICAgInNldF9hc3BlY3RfcmF0aW9fd2l0aF9kZWxheV9udW1lcmF0b3IiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9TRVRfQVNQRUNUX1JBVElPX1dJVEhfREVMQVlfREVOT01JTkFUT1IgPQotICAgICAgICAgICAgInNldF9hc3BlY3RfcmF0aW9fd2l0aF9kZWxheV9kZW5vbWluYXRvciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0VOVEVSX1BJUF9PTl9QQVVTRSA9ICJlbnRlcl9waXBfb25fcGF1c2UiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9UQVBfVE9fRklOSVNIID0gInRhcF90b19maW5pc2giOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9TVEFSVF9BQ1RJVklUWSA9ICJzdGFydF9hY3Rpdml0eSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0ZJTklTSF9TRUxGX09OX1JFU1VNRSA9ICJmaW5pc2hfc2VsZl9vbl9yZXN1bWUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9SRUVOVEVSX1BJUF9PTl9FWElUID0gInJlZW50ZXJfcGlwX29uX2V4aXQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9BU1NFUlRfTk9fT05fU1RPUF9CRUZPUkVfUElQID0gImFzc2VydF9ub19vbl9zdG9wX2JlZm9yZV9waXAiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9PTl9QQVVTRV9ERUxBWSA9ICJvbl9wYXVzZV9kZWxheSI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUElQX0FDVElWSVRZX0FDVElPTl9FTlRFUl9QSVAgPQotICAgICAgICAgICAgImFuZHJvaWQuc2VydmVyLmN0cy5QaXBBY3Rpdml0eS5lbnRlcl9waXAiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQSVBfQUNUSVZJVFlfQUNUSU9OX01PVkVfVE9fQkFDSyA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5zZXJ2ZXIuY3RzLlBpcEFjdGl2aXR5Lm1vdmVfdG9fYmFjayI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBJUF9BQ1RJVklUWV9BQ1RJT05fRVhQQU5EX1BJUCA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5zZXJ2ZXIuY3RzLlBpcEFjdGl2aXR5LmV4cGFuZF9waXAiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQSVBfQUNUSVZJVFlfQUNUSU9OX1NFVF9SRVFVRVNURURfT1JJRU5UQVRJT04gPQotICAgICAgICAgICAgImFuZHJvaWQuc2VydmVyLmN0cy5QaXBBY3Rpdml0eS5zZXRfcmVxdWVzdGVkX29yaWVudGF0aW9uIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUElQX0FDVElWSVRZX0FDVElPTl9GSU5JU0ggPQotICAgICAgICAgICAgImFuZHJvaWQuc2VydmVyLmN0cy5QaXBBY3Rpdml0eS5maW5pc2giOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0FDVElWSVRZX0FDVElPTl9GSU5JU0ggPQotICAgICAgICAgICAgImFuZHJvaWQuc2VydmVyLmN0cy5UZXN0QWN0aXZpdHkuZmluaXNoX3NlbGYiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUF9PUFNfT1BfRU5URVJfUElDVFVSRV9JTl9QSUNUVVJFID0gIlBJQ1RVUkVfSU5fUElDVFVSRSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFQUF9PUFNfTU9ERV9BTExPV0VEID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVBQX09QU19NT0RFX0lHTk9SRUQgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBUFBfT1BTX01PREVfRVJST1JFRCA9IDI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUk9UQVRJT05fMCA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJPVEFUSU9OXzkwID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUk9UQVRJT05fMTgwID0gMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUk9UQVRJT05fMjcwID0gMzsKLQotICAgIC8vIENvcnJlc3BvbmRzIHRvIEFjdGl2aXR5SW5mby5TQ1JFRU5fT1JJRU5UQVRJT05fTEFORFNDQVBFCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9SSUVOVEFUSU9OX0xBTkRTQ0FQRSA9IDA7Ci0gICAgLy8gQ29ycmVzcG9uZHMgdG8gQWN0aXZpdHlJbmZvLlNDUkVFTl9PUklFTlRBVElPTl9QT1JUUkFJVAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPUklFTlRBVElPTl9QT1JUUkFJVCA9IDE7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBGTE9BVF9DT01QQVJFX0VQU0lMT04gPSAwLjAwNWY7Ci0KLSAgICAvLyBDb3JyZXNwb25kcyB0byBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRpbWVuLmNvbmZpZ19waWN0dXJlSW5QaWN0dXJlTWluQXNwZWN0UmF0aW8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUlOX0FTUEVDVF9SQVRJT19OVU1FUkFUT1IgPSAxMDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1JTl9BU1BFQ1RfUkFUSU9fREVOT01JTkFUT1IgPSAyMzk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJFTE9XX01JTl9BU1BFQ1RfUkFUSU9fREVOT01JTkFUT1IgPSBNSU5fQVNQRUNUX1JBVElPX0RFTk9NSU5BVE9SICsgMTsKLSAgICAvLyBDb3JyZXNwb25kcyB0byBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRpbWVuLmNvbmZpZ19waWN0dXJlSW5QaWN0dXJlTWF4QXNwZWN0UmF0aW8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0FTUEVDVF9SQVRJT19OVU1FUkFUT1IgPSAyMzk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9BU1BFQ1RfUkFUSU9fREVOT01JTkFUT1IgPSAxMDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFCT1ZFX01BWF9BU1BFQ1RfUkFUSU9fTlVNRVJBVE9SID0gTUFYX0FTUEVDVF9SQVRJT19OVU1FUkFUT1IgKyAxOwotCi0gICAgcHVibGljIHZvaWQgdGVzdE1pbmltdW1EZXZpY2VTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghc3VwcG9ydHNQaXAoKSkgcmV0dXJuOwotCi0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0RGV2aWNlRGVmYXVsdERpc3BsYXlTaXplKG1EZXZpY2UsCi0gICAgICAgICAgICAgICAgIkRldmljZXMgc3VwcG9ydGluZyBwaWN0dXJlLWluLXBpY3R1cmUgbXVzdCBiZSBsYXJnZXIgdGhhbiB0aGUgZGVmYXVsdCBtaW5pbXVtIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHRhc2sgc2l6ZSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbnRlclBpY3R1cmVJblBpY3R1cmVNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHBpbm5lZFN0YWNrVGVzdGVyKGdldEFtU3RhcnRDbWQoUElQX0FDVElWSVRZLCBFWFRSQV9FTlRFUl9QSVAsICJ0cnVlIiksIFBJUF9BQ1RJVklUWSwKLSAgICAgICAgICAgICAgICBmYWxzZSAvKiBtb3ZlVG9wVG9QaW5uZWRTdGFjayAqLywgZmFsc2UgLyogaXNGb2N1c2FibGUgKi8pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb3ZlVG9wQWN0aXZpdHlUb1Bpbm5lZFN0YWNrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHBpbm5lZFN0YWNrVGVzdGVyKGdldEFtU3RhcnRDbWQoUElQX0FDVElWSVRZKSwgUElQX0FDVElWSVRZLAotICAgICAgICAgICAgICAgIHRydWUgLyogbW92ZVRvcFRvUGlubmVkU3RhY2sgKi8sIGZhbHNlIC8qIGlzRm9jdXNhYmxlICovKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWx3YXlzRm9jdXNhYmxlUGlwQWN0aXZpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcGlubmVkU3RhY2tUZXN0ZXIoZ2V0QW1TdGFydENtZChBTFdBWVNfRk9DVVNBQkxFX1BJUF9BQ1RJVklUWSksCi0gICAgICAgICAgICAgICAgQUxXQVlTX0ZPQ1VTQUJMRV9QSVBfQUNUSVZJVFksIGZhbHNlIC8qIG1vdmVUb3BUb1Bpbm5lZFN0YWNrICovLAotICAgICAgICAgICAgICAgIHRydWUgLyogaXNGb2N1c2FibGUgKi8pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RMYXVuY2hJbnRvUGlubmVkU3RhY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcGlubmVkU3RhY2tUZXN0ZXIoZ2V0QW1TdGFydENtZChMQVVOQ0hfSU5UT19QSU5ORURfU1RBQ0tfUElQX0FDVElWSVRZKSwKLSAgICAgICAgICAgICAgICBBTFdBWVNfRk9DVVNBQkxFX1BJUF9BQ1RJVklUWSwgZmFsc2UgLyogbW92ZVRvcFRvUGlubmVkU3RhY2sgKi8sCi0gICAgICAgICAgICAgICAgdHJ1ZSAvKiBpc0ZvY3VzYWJsZSAqLyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5vblRhcHBhYmxlUGlwQWN0aXZpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0c1BpcCgpKSByZXR1cm47Ci0KLSAgICAgICAgLy8gTGF1bmNoIHRoZSB0YXAtdG8tZmluaXNoIGFjdGl2aXR5IGF0IGEgc3BlY2lmaWMgcGxhY2UKLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoUElQX0FDVElWSVRZLAotICAgICAgICAgICAgICAgIEVYVFJBX0VOVEVSX1BJUCwgInRydWUiLAotICAgICAgICAgICAgICAgIEVYVFJBX1RBUF9UT19GSU5JU0gsICJ0cnVlIik7Ci0gICAgICAgIG1BbVdtU3RhdGUud2FpdEZvclZhbGlkU3RhdGUobURldmljZSwgUElQX0FDVElWSVRZLCBQSU5ORURfU1RBQ0tfSUQpOwotICAgICAgICBhc3NlcnRQaW5uZWRTdGFja0V4aXN0cygpOwotCi0gICAgICAgIC8vIFRhcCB0aGUgc2NyZWVuIGF0IGEga25vd24gbG9jYXRpb24gaW4gdGhlIHBpbm5lZCBzdGFjayBib3VuZHMsIGFuZCBlbnN1cmUgdGhhdCBpdCBpcwotICAgICAgICAvLyBub3QgcGFzc2VkIGRvd24gdG8gdGhlIHRvcCB0YXNrCi0gICAgICAgIHRhcFRvRmluaXNoUGlwKCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIG5ldyBTdHJpbmdbXSB7UElQX0FDVElWSVRZfSwKLSAgICAgICAgICAgICAgICBmYWxzZSAvKiBjb21wYXJlVGFza0FuZFN0YWNrQm91bmRzICovKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFBJUF9BQ1RJVklUWSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBpbm5lZFN0YWNrRGVmYXVsdEJvdW5kcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIXN1cHBvcnRzUGlwKCkpIHJldHVybjsKLQotICAgICAgICAvLyBMYXVuY2ggYSBQSVAgYWN0aXZpdHkKLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoUElQX0FDVElWSVRZLCBFWFRSQV9FTlRFUl9QSVAsICJ0cnVlIik7Ci0KLSAgICAgICAgc2V0RGV2aWNlUm90YXRpb24oUk9UQVRJT05fMCk7Ci0gICAgICAgIFdpbmRvd01hbmFnZXJTdGF0ZSB3bVN0YXRlID0gbUFtV21TdGF0ZS5nZXRXbVN0YXRlKCk7Ci0gICAgICAgIHdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UpOwotICAgICAgICBSZWN0YW5nbGUgZGVmYXVsdFBpcEJvdW5kcyA9IHdtU3RhdGUuZ2V0RGVmYXVsdFBpbm5lZFN0YWNrQm91bmRzKCk7Ci0gICAgICAgIFJlY3RhbmdsZSBzdGFibGVCb3VuZHMgPSB3bVN0YXRlLmdldFN0YWJsZUJvdW5kcygpOwotICAgICAgICBhc3NlcnRUcnVlKGRlZmF1bHRQaXBCb3VuZHMud2lkdGggPiAwICYmIGRlZmF1bHRQaXBCb3VuZHMuaGVpZ2h0ID4gMCk7Ci0gICAgICAgIGFzc2VydFRydWUoc3RhYmxlQm91bmRzLmNvbnRhaW5zKGRlZmF1bHRQaXBCb3VuZHMpKTsKLQotICAgICAgICBzZXREZXZpY2VSb3RhdGlvbihST1RBVElPTl85MCk7Ci0gICAgICAgIHdtU3RhdGUgPSBtQW1XbVN0YXRlLmdldFdtU3RhdGUoKTsKLSAgICAgICAgd21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSk7Ci0gICAgICAgIGRlZmF1bHRQaXBCb3VuZHMgPSB3bVN0YXRlLmdldERlZmF1bHRQaW5uZWRTdGFja0JvdW5kcygpOwotICAgICAgICBzdGFibGVCb3VuZHMgPSB3bVN0YXRlLmdldFN0YWJsZUJvdW5kcygpOwotICAgICAgICBhc3NlcnRUcnVlKGRlZmF1bHRQaXBCb3VuZHMud2lkdGggPiAwICYmIGRlZmF1bHRQaXBCb3VuZHMuaGVpZ2h0ID4gMCk7Ci0gICAgICAgIGFzc2VydFRydWUoc3RhYmxlQm91bmRzLmNvbnRhaW5zKGRlZmF1bHRQaXBCb3VuZHMpKTsKLSAgICAgICAgc2V0RGV2aWNlUm90YXRpb24oUk9UQVRJT05fMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBpbm5lZFN0YWNrTW92ZW1lbnRCb3VuZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0c1BpcCgpKSByZXR1cm47Ci0KLSAgICAgICAgLy8gTGF1bmNoIGEgUElQIGFjdGl2aXR5Ci0gICAgICAgIGxhdW5jaEFjdGl2aXR5KFBJUF9BQ1RJVklUWSwgRVhUUkFfRU5URVJfUElQLCAidHJ1ZSIpOwotCi0gICAgICAgIHNldERldmljZVJvdGF0aW9uKFJPVEFUSU9OXzApOwotICAgICAgICBXaW5kb3dNYW5hZ2VyU3RhdGUgd21TdGF0ZSA9IG1BbVdtU3RhdGUuZ2V0V21TdGF0ZSgpOwotICAgICAgICB3bVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlKTsKLSAgICAgICAgUmVjdGFuZ2xlIHBpcE1vdmVtZW50Qm91bmRzID0gd21TdGF0ZS5nZXRQaW5uZWRTdGFja01vbWVudEJvdW5kcygpOwotICAgICAgICBSZWN0YW5nbGUgc3RhYmxlQm91bmRzID0gd21TdGF0ZS5nZXRTdGFibGVCb3VuZHMoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShwaXBNb3ZlbWVudEJvdW5kcy53aWR0aCA+IDAgJiYgcGlwTW92ZW1lbnRCb3VuZHMuaGVpZ2h0ID4gMCk7Ci0gICAgICAgIGFzc2VydFRydWUoc3RhYmxlQm91bmRzLmNvbnRhaW5zKHBpcE1vdmVtZW50Qm91bmRzKSk7Ci0KLSAgICAgICAgc2V0RGV2aWNlUm90YXRpb24oUk9UQVRJT05fOTApOwotICAgICAgICB3bVN0YXRlID0gbUFtV21TdGF0ZS5nZXRXbVN0YXRlKCk7Ci0gICAgICAgIHdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UpOwotICAgICAgICBwaXBNb3ZlbWVudEJvdW5kcyA9IHdtU3RhdGUuZ2V0UGlubmVkU3RhY2tNb21lbnRCb3VuZHMoKTsKLSAgICAgICAgc3RhYmxlQm91bmRzID0gd21TdGF0ZS5nZXRTdGFibGVCb3VuZHMoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShwaXBNb3ZlbWVudEJvdW5kcy53aWR0aCA+IDAgJiYgcGlwTW92ZW1lbnRCb3VuZHMuaGVpZ2h0ID4gMCk7Ci0gICAgICAgIGFzc2VydFRydWUoc3RhYmxlQm91bmRzLmNvbnRhaW5zKHBpcE1vdmVtZW50Qm91bmRzKSk7Ci0gICAgICAgIHNldERldmljZVJvdGF0aW9uKFJPVEFUSU9OXzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaW5uZWRTdGFja091dE9mQm91bmRzSW5zZXRzTm9uTmVnYXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0c1BpcCgpKSByZXR1cm47Ci0KLSAgICAgICAgZmluYWwgV2luZG93TWFuYWdlclN0YXRlIHdtU3RhdGUgPSBtQW1XbVN0YXRlLmdldFdtU3RhdGUoKTsKLQotICAgICAgICAvLyBMYXVuY2ggYW4gYWN0aXZpdHkgaW50byB0aGUgcGlubmVkIHN0YWNrCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5KFBJUF9BQ1RJVklUWSwKLSAgICAgICAgICAgICAgICBFWFRSQV9FTlRFUl9QSVAsICJ0cnVlIiwKLSAgICAgICAgICAgICAgICBFWFRSQV9UQVBfVE9fRklOSVNILCAidHJ1ZSIpOwotICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JWYWxpZFN0YXRlKG1EZXZpY2UsIFBJUF9BQ1RJVklUWSwgUElOTkVEX1NUQUNLX0lEKTsKLQotICAgICAgICAvLyBHZXQgdGhlIGRpc3BsYXkgZGltZW5zaW9ucwotICAgICAgICBXaW5kb3dNYW5hZ2VyU3RhdGUuV2luZG93U3RhdGUgd2luZG93U3RhdGUgPSBnZXRXaW5kb3dTdGF0ZShQSVBfQUNUSVZJVFkpOwotICAgICAgICBXaW5kb3dNYW5hZ2VyU3RhdGUuRGlzcGxheSBkaXNwbGF5ID0gd21TdGF0ZS5nZXREaXNwbGF5KHdpbmRvd1N0YXRlLmdldERpc3BsYXlJZCgpKTsKLSAgICAgICAgUmVjdGFuZ2xlIGRpc3BsYXlSZWN0ID0gZGlzcGxheS5nZXREaXNwbGF5UmVjdCgpOwotCi0gICAgICAgIC8vIE1vdmUgdGhlIHBpbm5lZCBzdGFjayBvZmZzY3JlZW4KLSAgICAgICAgU3RyaW5nIG1vdmVTdGFja09mZnNjcmVlbkNvbW1hbmQgPSBTdHJpbmcuZm9ybWF0KCJhbSBzdGFjayByZXNpemUgNCAlZCAlZCAlZCAlZCIsCi0gICAgICAgICAgICAgICAgZGlzcGxheVJlY3Qud2lkdGggLSAyMDAsIDAsIGRpc3BsYXlSZWN0LndpZHRoICsgMjAwLCA1MDApOwotICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKG1vdmVTdGFja09mZnNjcmVlbkNvbW1hbmQpOwotCi0gICAgICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBzdXJmYWNlIGluc2V0cyBhcmUgbm90IG5lZ2F0aXZlCi0gICAgICAgIHdpbmRvd1N0YXRlID0gZ2V0V2luZG93U3RhdGUoUElQX0FDVElWSVRZKTsKLSAgICAgICAgUmVjdGFuZ2xlIGNvbnRlbnRJbnNldHMgPSB3aW5kb3dTdGF0ZS5nZXRDb250ZW50SW5zZXRzKCk7Ci0gICAgICAgIGFzc2VydFRydWUoY29udGVudEluc2V0cy54ID49IDAgJiYgY29udGVudEluc2V0cy55ID49IDAgJiYgY29udGVudEluc2V0cy53aWR0aCA+PSAwICYmCi0gICAgICAgICAgICAgICAgY29udGVudEluc2V0cy5oZWlnaHQgPj0gMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBpbm5lZFN0YWNrSW5Cb3VuZHNBZnRlclJvdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghc3VwcG9ydHNQaXAoKSkgcmV0dXJuOwotCi0gICAgICAgIC8vIExhdW5jaCBhbiBhY3Rpdml0eSBpbnRvIHRoZSBwaW5uZWQgc3RhY2sKLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoUElQX0FDVElWSVRZLAotICAgICAgICAgICAgICAgIEVYVFJBX0VOVEVSX1BJUCwgInRydWUiLAotICAgICAgICAgICAgICAgIEVYVFJBX1RBUF9UT19GSU5JU0gsICJ0cnVlIik7Ci0gICAgICAgIG1BbVdtU3RhdGUud2FpdEZvclZhbGlkU3RhdGUobURldmljZSwgUElQX0FDVElWSVRZLCBQSU5ORURfU1RBQ0tfSUQpOwotCi0gICAgICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBQSVAgc3RhY2sgaXMgZnVsbHkgdmlzaWJsZSBpbiBlYWNoIG9yaWVudGF0aW9uCi0gICAgICAgIHNldERldmljZVJvdGF0aW9uKFJPVEFUSU9OXzApOwotICAgICAgICBhc3NlcnRQaW5uZWRTdGFja0FjdGl2aXR5SXNJbkRpc3BsYXlCb3VuZHMoUElQX0FDVElWSVRZKTsKLSAgICAgICAgc2V0RGV2aWNlUm90YXRpb24oUk9UQVRJT05fOTApOwotICAgICAgICBhc3NlcnRQaW5uZWRTdGFja0FjdGl2aXR5SXNJbkRpc3BsYXlCb3VuZHMoUElQX0FDVElWSVRZKTsKLSAgICAgICAgc2V0RGV2aWNlUm90YXRpb24oUk9UQVRJT05fMTgwKTsKLSAgICAgICAgYXNzZXJ0UGlubmVkU3RhY2tBY3Rpdml0eUlzSW5EaXNwbGF5Qm91bmRzKFBJUF9BQ1RJVklUWSk7Ci0gICAgICAgIHNldERldmljZVJvdGF0aW9uKFJPVEFUSU9OXzI3MCk7Ci0gICAgICAgIGFzc2VydFBpbm5lZFN0YWNrQWN0aXZpdHlJc0luRGlzcGxheUJvdW5kcyhQSVBfQUNUSVZJVFkpOwotICAgICAgICBzZXREZXZpY2VSb3RhdGlvbihST1RBVElPTl8wKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW50ZXJQaXBUb090aGVyT3JpZW50YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0c1BpcCgpKSByZXR1cm47Ci0KLSAgICAgICAgLy8gTGF1bmNoIGEgcG9ydHJhaXQgb25seSBhcHAgb24gdGhlIGZ1bGxzY3JlZW4gc3RhY2sKLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoVEVTVF9BQ1RJVklUWSwKLSAgICAgICAgICAgICAgICBFWFRSQV9GSVhFRF9PUklFTlRBVElPTiwgU3RyaW5nLnZhbHVlT2YoT1JJRU5UQVRJT05fUE9SVFJBSVQpKTsKLSAgICAgICAgLy8gTGF1bmNoIHRoZSBQaVAgYWN0aXZpdHkgZml4ZWQgYXMgbGFuZHNjYXBlCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5KFBJUF9BQ1RJVklUWSwKLSAgICAgICAgICAgICAgICBFWFRSQV9GSVhFRF9PUklFTlRBVElPTiwgU3RyaW5nLnZhbHVlT2YoT1JJRU5UQVRJT05fTEFORFNDQVBFKSk7Ci0gICAgICAgIC8vIEVudGVyIFBpUCwgYW5kIGFzc2VydCB0aGF0IHRoZSBQaVAgaXMgd2l0aGluIGJvdW5kcyBub3cgdGhhdCB0aGUgZGV2aWNlIGlzIGJhY2sgaW4KLSAgICAgICAgLy8gcG9ydHJhaXQKLSAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZCgiYW0gYnJvYWRjYXN0IC1hICIgKyBQSVBfQUNUSVZJVFlfQUNUSU9OX0VOVEVSX1BJUCk7Ci0gICAgICAgIG1BbVdtU3RhdGUud2FpdEZvclZhbGlkU3RhdGUobURldmljZSwgUElQX0FDVElWSVRZLCBQSU5ORURfU1RBQ0tfSUQpOwotICAgICAgICBhc3NlcnRQaW5uZWRTdGFja0V4aXN0cygpOwotICAgICAgICBhc3NlcnRQaW5uZWRTdGFja0FjdGl2aXR5SXNJbkRpc3BsYXlCb3VuZHMoUElQX0FDVElWSVRZKTsKLSAgICB9Ci0KLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iMy44LjE0L0MtMy0zIikKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW50ZXJQaXBBc3BlY3RSYXRpb01pbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0RW50ZXJQaXBBc3BlY3RSYXRpbyhNSU5fQVNQRUNUX1JBVElPX05VTUVSQVRPUiwgTUlOX0FTUEVDVF9SQVRJT19ERU5PTUlOQVRPUik7Ci0gICAgfQotCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjMuOC4xNC9DLTMtMyIpCi0gICAgcHVibGljIHZvaWQgdGVzdEVudGVyUGlwQXNwZWN0UmF0aW9NYXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdEVudGVyUGlwQXNwZWN0UmF0aW8oTUFYX0FTUEVDVF9SQVRJT19OVU1FUkFUT1IsIE1BWF9BU1BFQ1RfUkFUSU9fREVOT01JTkFUT1IpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0RW50ZXJQaXBBc3BlY3RSYXRpbyhpbnQgbnVtLCBpbnQgZGVub20pIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIXN1cHBvcnRzUGlwKCkpIHJldHVybjsKLQotICAgICAgICBsYXVuY2hBY3Rpdml0eShQSVBfQUNUSVZJVFksCi0gICAgICAgICAgICAgICAgRVhUUkFfRU5URVJfUElQLCAidHJ1ZSIsCi0gICAgICAgICAgICAgICAgRVhUUkFfRU5URVJfUElQX0FTUEVDVF9SQVRJT19OVU1FUkFUT1IsIEludGVnZXIudG9TdHJpbmcobnVtKSwKLSAgICAgICAgICAgICAgICBFWFRSQV9FTlRFUl9QSVBfQVNQRUNUX1JBVElPX0RFTk9NSU5BVE9SLCBJbnRlZ2VyLnRvU3RyaW5nKGRlbm9tKSk7Ci0gICAgICAgIGFzc2VydFBpbm5lZFN0YWNrRXhpc3RzKCk7Ci0KLSAgICAgICAgLy8gQXNzZXJ0IHRoYXQgd2UgaGF2ZSBlbnRlcmVkIFBJUCBhbmQgdGhhdCB0aGUgYXNwZWN0IHJhdGlvIGlzIGNvcnJlY3QKLSAgICAgICAgUmVjdGFuZ2xlIHBpbm5lZFN0YWNrQm91bmRzID0KLSAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja0J5SWQoUElOTkVEX1NUQUNLX0lEKS5nZXRCb3VuZHMoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShmbG9hdEVxdWFscygoZmxvYXQpIHBpbm5lZFN0YWNrQm91bmRzLndpZHRoIC8gcGlubmVkU3RhY2tCb3VuZHMuaGVpZ2h0LAotICAgICAgICAgICAgICAgIChmbG9hdCkgbnVtIC8gZGVub20pKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzaXplUGlwQXNwZWN0UmF0aW9NaW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdFJlc2l6ZVBpcEFzcGVjdFJhdGlvKE1JTl9BU1BFQ1RfUkFUSU9fTlVNRVJBVE9SLCBNSU5fQVNQRUNUX1JBVElPX0RFTk9NSU5BVE9SKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzaXplUGlwQXNwZWN0UmF0aW9NYXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdFJlc2l6ZVBpcEFzcGVjdFJhdGlvKE1BWF9BU1BFQ1RfUkFUSU9fTlVNRVJBVE9SLCBNQVhfQVNQRUNUX1JBVElPX0RFTk9NSU5BVE9SKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdFJlc2l6ZVBpcEFzcGVjdFJhdGlvKGludCBudW0sIGludCBkZW5vbSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghc3VwcG9ydHNQaXAoKSkgcmV0dXJuOwotCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5KFBJUF9BQ1RJVklUWSwKLSAgICAgICAgICAgICAgICBFWFRSQV9FTlRFUl9QSVAsICJ0cnVlIiwKLSAgICAgICAgICAgICAgICBFWFRSQV9TRVRfQVNQRUNUX1JBVElPX05VTUVSQVRPUiwgSW50ZWdlci50b1N0cmluZyhudW0pLAotICAgICAgICAgICAgICAgIEVYVFJBX1NFVF9BU1BFQ1RfUkFUSU9fREVOT01JTkFUT1IsIEludGVnZXIudG9TdHJpbmcoZGVub20pKTsKLSAgICAgICAgYXNzZXJ0UGlubmVkU3RhY2tFeGlzdHMoKTsKLQotICAgICAgICAvLyBIYWNreSwgYnV0IHdlIG5lZWQgdG8gd2FpdCBmb3IgdGhlIGVudGVyUGljdHVyZUluUGljdHVyZSBhbmltYXRpb24gdG8gY29tcGxldGUgYW5kCi0gICAgICAgIC8vIHRoZSByZXNpemUgdG8gYmUgY2FsbGVkIGJlZm9yZSB3ZSBjYW4gY2hlY2sgdGhlIHBpbm5lZCBzdGFjayBib3VuZHMKLSAgICAgICAgZmluYWwgYm9vbGVhbltdIHJlc3VsdCA9IG5ldyBib29sZWFuWzFdOwotICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JXaXRoQW1TdGF0ZShtRGV2aWNlLCAoc3RhdGUpIC0+IHsKLSAgICAgICAgICAgIFJlY3RhbmdsZSBwaW5uZWRTdGFja0JvdW5kcyA9IHN0YXRlLmdldFN0YWNrQnlJZChQSU5ORURfU1RBQ0tfSUQpLmdldEJvdW5kcygpOwotICAgICAgICAgICAgYm9vbGVhbiBpc1ZhbGlkQXNwZWN0UmF0aW8gPSBmbG9hdEVxdWFscygKLSAgICAgICAgICAgICAgICAgICAgKGZsb2F0KSBwaW5uZWRTdGFja0JvdW5kcy53aWR0aCAvIHBpbm5lZFN0YWNrQm91bmRzLmhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgKGZsb2F0KSBudW0gLyBkZW5vbSk7Ci0gICAgICAgICAgICByZXN1bHRbMF0gPSBpc1ZhbGlkQXNwZWN0UmF0aW87Ci0gICAgICAgICAgICByZXR1cm4gaXNWYWxpZEFzcGVjdFJhdGlvOwotICAgICAgICB9LCAiV2FpdGluZyBmb3IgcGlubmVkIHN0YWNrIHRvIGJlIHJlc2l6ZWQiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRbMF0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbnRlclBpcEV4dHJlbWVBc3BlY3RSYXRpb01pbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0RW50ZXJQaXBFeHRyZW1lQXNwZWN0UmF0aW8oTUlOX0FTUEVDVF9SQVRJT19OVU1FUkFUT1IsCi0gICAgICAgICAgICAgICAgQkVMT1dfTUlOX0FTUEVDVF9SQVRJT19ERU5PTUlOQVRPUik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVudGVyUGlwRXh0cmVtZUFzcGVjdFJhdGlvTWF4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RFbnRlclBpcEV4dHJlbWVBc3BlY3RSYXRpbyhBQk9WRV9NQVhfQVNQRUNUX1JBVElPX05VTUVSQVRPUiwKLSAgICAgICAgICAgICAgICBNQVhfQVNQRUNUX1JBVElPX0RFTk9NSU5BVE9SKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdEVudGVyUGlwRXh0cmVtZUFzcGVjdFJhdGlvKGludCBudW0sIGludCBkZW5vbSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghc3VwcG9ydHNQaXAoKSkgcmV0dXJuOwotCi0gICAgICAgIC8vIEFzc2VydCB0aGF0IHdlIGNvdWxkIG5vdCBjcmVhdGUgYSBwaW5uZWQgc3RhY2sgd2l0aCBhbiBleHRyZW1lIGFzcGVjdCByYXRpbwotICAgICAgICBsYXVuY2hBY3Rpdml0eShQSVBfQUNUSVZJVFksCi0gICAgICAgICAgICAgICAgRVhUUkFfRU5URVJfUElQLCAidHJ1ZSIsCi0gICAgICAgICAgICAgICAgRVhUUkFfRU5URVJfUElQX0FTUEVDVF9SQVRJT19OVU1FUkFUT1IsIEludGVnZXIudG9TdHJpbmcobnVtKSwKLSAgICAgICAgICAgICAgICBFWFRSQV9FTlRFUl9QSVBfQVNQRUNUX1JBVElPX0RFTk9NSU5BVE9SLCBJbnRlZ2VyLnRvU3RyaW5nKGRlbm9tKSk7Ci0gICAgICAgIGFzc2VydFBpbm5lZFN0YWNrRG9lc05vdEV4aXN0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNldFBpcEV4dHJlbWVBc3BlY3RSYXRpb01pbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0U2V0UGlwRXh0cmVtZUFzcGVjdFJhdGlvKE1JTl9BU1BFQ1RfUkFUSU9fTlVNRVJBVE9SLAotICAgICAgICAgICAgICAgIEJFTE9XX01JTl9BU1BFQ1RfUkFUSU9fREVOT01JTkFUT1IpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRQaXBFeHRyZW1lQXNwZWN0UmF0aW9NYXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdFNldFBpcEV4dHJlbWVBc3BlY3RSYXRpbyhBQk9WRV9NQVhfQVNQRUNUX1JBVElPX05VTUVSQVRPUiwKLSAgICAgICAgICAgICAgICBNQVhfQVNQRUNUX1JBVElPX0RFTk9NSU5BVE9SKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdFNldFBpcEV4dHJlbWVBc3BlY3RSYXRpbyhpbnQgbnVtLCBpbnQgZGVub20pIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIXN1cHBvcnRzUGlwKCkpIHJldHVybjsKLQotICAgICAgICAvLyBUcnkgdG8gcmVzaXplIHRoZSBhIG5vcm1hbCBwaW5uZWQgc3RhY2sgdG8gYW4gZXh0cmVtZSBhc3BlY3QgcmF0aW8gYW5kIGVuc3VyZSB0aGF0Ci0gICAgICAgIC8vIGZhaWxzICh0aGUgYXNwZWN0IHJhdGlvIHJlbWFpbnMgdGhlIHNhbWUpCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5KFBJUF9BQ1RJVklUWSwKLSAgICAgICAgICAgICAgICBFWFRSQV9FTlRFUl9QSVAsICJ0cnVlIiwKLSAgICAgICAgICAgICAgICBFWFRSQV9FTlRFUl9QSVBfQVNQRUNUX1JBVElPX05VTUVSQVRPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcoTUFYX0FTUEVDVF9SQVRJT19OVU1FUkFUT1IpLAotICAgICAgICAgICAgICAgIEVYVFJBX0VOVEVSX1BJUF9BU1BFQ1RfUkFUSU9fREVOT01JTkFUT1IsCi0gICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKE1BWF9BU1BFQ1RfUkFUSU9fREVOT01JTkFUT1IpLAotICAgICAgICAgICAgICAgIEVYVFJBX1NFVF9BU1BFQ1RfUkFUSU9fTlVNRVJBVE9SLCBJbnRlZ2VyLnRvU3RyaW5nKG51bSksCi0gICAgICAgICAgICAgICAgRVhUUkFfU0VUX0FTUEVDVF9SQVRJT19ERU5PTUlOQVRPUiwgSW50ZWdlci50b1N0cmluZyhkZW5vbSkpOwotICAgICAgICBhc3NlcnRQaW5uZWRTdGFja0V4aXN0cygpOwotICAgICAgICBSZWN0YW5nbGUgcGlubmVkU3RhY2tCb3VuZHMgPQotICAgICAgICAgICAgICAgIG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFN0YWNrQnlJZChQSU5ORURfU1RBQ0tfSUQpLmdldEJvdW5kcygpOwotICAgICAgICBhc3NlcnRUcnVlKGZsb2F0RXF1YWxzKChmbG9hdCkgcGlubmVkU3RhY2tCb3VuZHMud2lkdGggLyBwaW5uZWRTdGFja0JvdW5kcy5oZWlnaHQsCi0gICAgICAgICAgICAgICAgKGZsb2F0KSBNQVhfQVNQRUNUX1JBVElPX05VTUVSQVRPUiAvIE1BWF9BU1BFQ1RfUkFUSU9fREVOT01JTkFUT1IpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzYWxsb3dQaXBMYXVuY2hGcm9tU3RvcHBlZEFjdGl2aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghc3VwcG9ydHNQaXAoKSkgcmV0dXJuOwotCi0gICAgICAgIC8vIExhdW5jaCB0aGUgYm90dG9tIHBpcCBhY3Rpdml0eQotICAgICAgICBsYXVuY2hBY3Rpdml0eShQSVBfT05fU1RPUF9BQ1RJVklUWSk7Ci0gICAgICAgIG1BbVdtU3RhdGUud2FpdEZvclZhbGlkU3RhdGUobURldmljZSwgUElQX0FDVElWSVRZLCBQSU5ORURfU1RBQ0tfSUQpOwotCi0gICAgICAgIC8vIFdhaXQgZm9yIHRoZSBib3R0b20gcGlwIGFjdGl2aXR5IHRvIGJlIHN0b3BwZWQKLSAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yQWN0aXZpdHlTdGF0ZShtRGV2aWNlLCBQSVBfT05fU1RPUF9BQ1RJVklUWSwgU1RBVEVfU1RPUFBFRCk7Ci0KLSAgICAgICAgLy8gQXNzZXJ0IHRoYXQgdGhlcmUgaXMgbm8gcGlubmVkIHN0YWNrICh0aGF0IGVudGVyUGljdHVyZUluUGljdHVyZSgpIGZhaWxlZCkKLSAgICAgICAgYXNzZXJ0UGlubmVkU3RhY2tEb2VzTm90RXhpc3QoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0b0VudGVyUGljdHVyZUluUGljdHVyZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIXN1cHBvcnRzUGlwKCkpIHJldHVybjsKLQotICAgICAgICAvLyBMYXVuY2ggYSB0ZXN0IGFjdGl2aXR5IHNvIHRoYXQgd2UncmUgbm90IG92ZXIgaG9tZQotICAgICAgICBsYXVuY2hBY3Rpdml0eShURVNUX0FDVElWSVRZKTsKLQotICAgICAgICAvLyBMYXVuY2ggdGhlIFBJUCBhY3Rpdml0eSBvbiBwYXVzZQotICAgICAgICBsYXVuY2hBY3Rpdml0eShQSVBfQUNUSVZJVFksIEVYVFJBX0VOVEVSX1BJUF9PTl9QQVVTRSwgInRydWUiKTsKLSAgICAgICAgYXNzZXJ0UGlubmVkU3RhY2tEb2VzTm90RXhpc3QoKTsKLQotICAgICAgICAvLyBHbyBob21lIGFuZCBlbnN1cmUgdGhhdCB0aGVyZSBpcyBhIHBpbm5lZCBzdGFjawotICAgICAgICBsYXVuY2hIb21lQWN0aXZpdHkoKTsKLSAgICAgICAgYXNzZXJ0UGlubmVkU3RhY2tFeGlzdHMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0b0VudGVyUGljdHVyZUluUGljdHVyZUxhdW5jaEFjdGl2aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghc3VwcG9ydHNQaXAoKSkgcmV0dXJuOwotCi0gICAgICAgIC8vIExhdW5jaCBhIHRlc3QgYWN0aXZpdHkgc28gdGhhdCB3ZSdyZSBub3Qgb3ZlciBob21lCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5KFRFU1RfQUNUSVZJVFkpOwotCi0gICAgICAgIC8vIExhdW5jaCB0aGUgUElQIGFjdGl2aXR5IG9uIHBhdXNlLCBhbmQgaGF2ZSBpdCBzdGFydCBhbm90aGVyIGFjdGl2aXR5IG9uCi0gICAgICAgIC8vIHRvcCBvZiBpdHNlbGYuICBXYWl0IGZvciB0aGUgbmV3IGFjdGl2aXR5IHRvIGJlIHZpc2libGUgYW5kIGVuc3VyZSB0aGF0IHRoZSBwaW5uZWQgc3RhY2sKLSAgICAgICAgLy8gd2FzIG5vdCBjcmVhdGVkIGluIHRoZSBwcm9jZXNzCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5KFBJUF9BQ1RJVklUWSwKLSAgICAgICAgICAgICAgICBFWFRSQV9FTlRFUl9QSVBfT05fUEFVU0UsICJ0cnVlIiwKLSAgICAgICAgICAgICAgICBFWFRSQV9TVEFSVF9BQ1RJVklUWSwgZ2V0QWN0aXZpdHlDb21wb25lbnROYW1lKE5PTl9SRVNJWkVBQkxFX0FDVElWSVRZKSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIG5ldyBTdHJpbmdbXSB7Tk9OX1JFU0laRUFCTEVfQUNUSVZJVFl9LAotICAgICAgICAgICAgICAgIGZhbHNlIC8qIGNvbXBhcmVUYXNrQW5kU3RhY2tCb3VuZHMgKi8pOwotICAgICAgICBhc3NlcnRQaW5uZWRTdGFja0RvZXNOb3RFeGlzdCgpOwotCi0gICAgICAgIC8vIEdvIGhvbWUgd2hpbGUgdGhlIHBpcCBhY3Rpdml0eSBpcyBvcGVuIGFuZCBlbnN1cmUgdGhlIHByZXZpb3VzIGFjdGl2aXR5IGlzIG5vdCBQSVBlZAotICAgICAgICBsYXVuY2hIb21lQWN0aXZpdHkoKTsKLSAgICAgICAgYXNzZXJ0UGlubmVkU3RhY2tEb2VzTm90RXhpc3QoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0b0VudGVyUGljdHVyZUluUGljdHVyZUZpbmlzaCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIXN1cHBvcnRzUGlwKCkpIHJldHVybjsKLQotICAgICAgICAvLyBMYXVuY2ggYSB0ZXN0IGFjdGl2aXR5IHNvIHRoYXQgd2UncmUgbm90IG92ZXIgaG9tZQotICAgICAgICBsYXVuY2hBY3Rpdml0eShURVNUX0FDVElWSVRZKTsKLQotICAgICAgICAvLyBMYXVuY2ggdGhlIFBJUCBhY3Rpdml0eSBvbiBwYXVzZSwgYW5kIHNldCBpdCB0byBmaW5pc2ggaXRzZWxmIGFmdGVyCi0gICAgICAgIC8vIHNvbWUgcGVyaW9kLiAgV2FpdCBmb3IgdGhlIHByZXZpb3VzIGFjdGl2aXR5IHRvIGJlIHZpc2libGUsIGFuZCBlbnN1cmUgdGhhdCB0aGUgcGlubmVkCi0gICAgICAgIC8vIHN0YWNrIHdhcyBub3QgY3JlYXRlZCBpbiB0aGUgcHJvY2VzcwotICAgICAgICBsYXVuY2hBY3Rpdml0eShQSVBfQUNUSVZJVFksCi0gICAgICAgICAgICAgICAgRVhUUkFfRU5URVJfUElQX09OX1BBVVNFLCAidHJ1ZSIsCi0gICAgICAgICAgICAgICAgRVhUUkFfRklOSVNIX1NFTEZfT05fUkVTVU1FLCAidHJ1ZSIpOwotICAgICAgICBhc3NlcnRQaW5uZWRTdGFja0RvZXNOb3RFeGlzdCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvRW50ZXJQaWN0dXJlSW5QaWN0dXJlQXNwZWN0UmF0aW8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0c1BpcCgpKSByZXR1cm47Ci0KLSAgICAgICAgLy8gTGF1bmNoIHRoZSBQSVAgYWN0aXZpdHkgb24gcGF1c2UsIGFuZCBzZXQgdGhlIGFzcGVjdCByYXRpbwotICAgICAgICBsYXVuY2hBY3Rpdml0eShQSVBfQUNUSVZJVFksCi0gICAgICAgICAgICAgICAgRVhUUkFfRU5URVJfUElQX09OX1BBVVNFLCAidHJ1ZSIsCi0gICAgICAgICAgICAgICAgRVhUUkFfU0VUX0FTUEVDVF9SQVRJT19OVU1FUkFUT1IsIEludGVnZXIudG9TdHJpbmcoTUFYX0FTUEVDVF9SQVRJT19OVU1FUkFUT1IpLAotICAgICAgICAgICAgICAgIEVYVFJBX1NFVF9BU1BFQ1RfUkFUSU9fREVOT01JTkFUT1IsIEludGVnZXIudG9TdHJpbmcoTUFYX0FTUEVDVF9SQVRJT19ERU5PTUlOQVRPUikpOwotCi0gICAgICAgIC8vIEdvIGhvbWUgd2hpbGUgdGhlIHBpcCBhY3Rpdml0eSBpcyBvcGVuIHRvIHRyaWdnZXIgYXV0by1QSVAKLSAgICAgICAgbGF1bmNoSG9tZUFjdGl2aXR5KCk7Ci0gICAgICAgIGFzc2VydFBpbm5lZFN0YWNrRXhpc3RzKCk7Ci0KLSAgICAgICAgLy8gSGFja3ksIGJ1dCB3ZSBuZWVkIHRvIHdhaXQgZm9yIHRoZSBhdXRvLWVudGVyIHBpY3R1cmUtaW4tcGljdHVyZSBhbmltYXRpb24gdG8gY29tcGxldGUKLSAgICAgICAgLy8gYW5kIGJlZm9yZSB3ZSBjYW4gY2hlY2sgdGhlIHBpbm5lZCBzdGFjayBib3VuZHMKLSAgICAgICAgZmluYWwgYm9vbGVhbltdIHJlc3VsdCA9IG5ldyBib29sZWFuWzFdOwotICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JXaXRoQW1TdGF0ZShtRGV2aWNlLCAoc3RhdGUpIC0+IHsKLSAgICAgICAgICAgIFJlY3RhbmdsZSBwaW5uZWRTdGFja0JvdW5kcyA9IHN0YXRlLmdldFN0YWNrQnlJZChQSU5ORURfU1RBQ0tfSUQpLmdldEJvdW5kcygpOwotICAgICAgICAgICAgYm9vbGVhbiBpc1ZhbGlkQXNwZWN0UmF0aW8gPSBmbG9hdEVxdWFscygKLSAgICAgICAgICAgICAgICAgICAgKGZsb2F0KSBwaW5uZWRTdGFja0JvdW5kcy53aWR0aCAvIHBpbm5lZFN0YWNrQm91bmRzLmhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgKGZsb2F0KSBNQVhfQVNQRUNUX1JBVElPX05VTUVSQVRPUiAvIE1BWF9BU1BFQ1RfUkFUSU9fREVOT01JTkFUT1IpOwotICAgICAgICAgICAgcmVzdWx0WzBdID0gaXNWYWxpZEFzcGVjdFJhdGlvOwotICAgICAgICAgICAgcmV0dXJuIGlzVmFsaWRBc3BlY3RSYXRpbzsKLSAgICAgICAgfSwgIldhaXRpbmcgZm9yIHBpbm5lZCBzdGFjayB0byBiZSByZXNpemVkIik7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0WzBdKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0b0VudGVyUGljdHVyZUluUGljdHVyZU92ZXJQaXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0c1BpcCgpKSByZXR1cm47Ci0KLSAgICAgICAgLy8gTGF1bmNoIGFub3RoZXIgUElQIGFjdGl2aXR5Ci0gICAgICAgIGxhdW5jaEFjdGl2aXR5KExBVU5DSF9JTlRPX1BJTk5FRF9TVEFDS19QSVBfQUNUSVZJVFkpOwotICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JWYWxpZFN0YXRlKG1EZXZpY2UsIFBJUF9BQ1RJVklUWSwgUElOTkVEX1NUQUNLX0lEKTsKLSAgICAgICAgYXNzZXJ0UGlubmVkU3RhY2tFeGlzdHMoKTsKLQotICAgICAgICAvLyBMYXVuY2ggdGhlIFBJUCBhY3Rpdml0eSBvbiBwYXVzZQotICAgICAgICBsYXVuY2hBY3Rpdml0eShQSVBfQUNUSVZJVFksIEVYVFJBX0VOVEVSX1BJUF9PTl9QQVVTRSwgInRydWUiKTsKLQotICAgICAgICAvLyBHbyBob21lIHdoaWxlIHRoZSBQSVAgYWN0aXZpdHkgaXMgb3BlbiB0byB0cmlnZ2VyIGF1dG8tZW50ZXIgUElQCi0gICAgICAgIGxhdW5jaEhvbWVBY3Rpdml0eSgpOwotICAgICAgICBhc3NlcnRQaW5uZWRTdGFja0V4aXN0cygpOwotCi0gICAgICAgIC8vIEVuc3VyZSB0aGF0IGF1dG8tZW50ZXIgcGlwIGZhaWxlZCBhbmQgdGhhdCB0aGUgcmVzdW1lZCBhY3Rpdml0eSBpbiB0aGUgcGlubmVkIHN0YWNrIGlzCi0gICAgICAgIC8vIHN0aWxsIHRoZSBmaXJzdCBhY3Rpdml0eQotICAgICAgICBmaW5hbCBBY3Rpdml0eVN0YWNrIHBpbm5lZFN0YWNrID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0U3RhY2tCeUlkKFBJTk5FRF9TVEFDS19JRCk7Ci0gICAgICAgIGFzc2VydFRydWUocGlubmVkU3RhY2suZ2V0VGFza3MoKS5zaXplKCkgPT0gMSk7Ci0gICAgICAgIGFzc2VydFRydWUocGlubmVkU3RhY2suZ2V0VGFza3MoKS5nZXQoMCkubVJlYWxBY3Rpdml0eS5lcXVhbHMoZ2V0QWN0aXZpdHlDb21wb25lbnROYW1lKAotICAgICAgICAgICAgICAgIEFMV0FZU19GT0NVU0FCTEVfUElQX0FDVElWSVRZKSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REaXNhbGxvd011bHRpcGxlVGFza3NJblBpbm5lZFN0YWNrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghc3VwcG9ydHNQaXAoKSkgcmV0dXJuOwotCi0gICAgICAgIC8vIExhdW5jaCBhIHRlc3QgYWN0aXZpdHkgc28gdGhhdCB3ZSBoYXZlIG11bHRpcGxlIGZ1bGxzY3JlZW4gdGFza3MKLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoVEVTVF9BQ1RJVklUWSk7Ci0KLSAgICAgICAgLy8gTGF1bmNoIGZpcnN0IFBJUCBhY3Rpdml0eQotICAgICAgICBsYXVuY2hBY3Rpdml0eShQSVBfQUNUSVZJVFksIEVYVFJBX0VOVEVSX1BJUCwgInRydWUiKTsKLQotICAgICAgICAvLyBMYXVuY2ggc2Vjb25kIFBJUCBhY3Rpdml0eQotICAgICAgICBsYXVuY2hBY3Rpdml0eShQSVBfQUNUSVZJVFkyLCBFWFRSQV9FTlRFUl9QSVAsICJ0cnVlIik7Ci0KLSAgICAgICAgZmluYWwgQWN0aXZpdHlTdGFjayBwaW5uZWRTdGFjayA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFN0YWNrQnlJZChQSU5ORURfU1RBQ0tfSUQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcGlubmVkU3RhY2suZ2V0VGFza3MoKS5zaXplKCkpOwotCi0gICAgICAgIGFzc2VydFRydWUocGlubmVkU3RhY2suZ2V0VGFza3MoKS5nZXQoMCkubVJlYWxBY3Rpdml0eS5lcXVhbHMoZ2V0QWN0aXZpdHlDb21wb25lbnROYW1lKAotICAgICAgICAgICAgICAgIFBJUF9BQ1RJVklUWTIpKSk7Ci0KLSAgICAgICAgZmluYWwgQWN0aXZpdHlTdGFjayBmdWxsU2NyZWVuU3RhY2sgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja0J5SWQoCi0gICAgICAgICAgICAgICAgRlVMTFNDUkVFTl9XT1JLU1BBQ0VfU1RBQ0tfSUQpOwotICAgICAgICBhc3NlcnRUcnVlKGZ1bGxTY3JlZW5TdGFjay5nZXRCb3R0b21UYXNrKCkubVJlYWxBY3Rpdml0eS5lcXVhbHMoZ2V0QWN0aXZpdHlDb21wb25lbnROYW1lKAotICAgICAgICAgICAgICAgIFBJUF9BQ1RJVklUWSkpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGlwVW5QaXBPdmVySG9tZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIXN1cHBvcnRzUGlwKCkpIHJldHVybjsKLQotICAgICAgICAvLyBHbyBob21lCi0gICAgICAgIGxhdW5jaEhvbWVBY3Rpdml0eSgpOwotICAgICAgICAvLyBMYXVuY2ggYW4gYXV0byBwaXAgYWN0aXZpdHkKLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoUElQX0FDVElWSVRZLAotICAgICAgICAgICAgICAgIEVYVFJBX0VOVEVSX1BJUCwgInRydWUiLAotICAgICAgICAgICAgICAgIEVYVFJBX1JFRU5URVJfUElQX09OX0VYSVQsICJ0cnVlIik7Ci0gICAgICAgIGFzc2VydFBpbm5lZFN0YWNrRXhpc3RzKCk7Ci0KLSAgICAgICAgLy8gUmVsYXVuY2ggdGhlIGFjdGl2aXR5IHRvIGZ1bGxzY3JlZW4gdG8gdHJpZ2dlciB0aGUgYWN0aXZpdHkgdG8gZXhpdCBhbmQgcmUtZW50ZXIgcGlwCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5KFBJUF9BQ1RJVklUWSk7Ci0gICAgICAgIG1BbVdtU3RhdGUud2FpdEZvcldpdGhBbVN0YXRlKG1EZXZpY2UsIChhbVN0YXRlKSAtPiB7Ci0gICAgICAgICAgICByZXR1cm4gYW1TdGF0ZS5nZXRGcm9udFN0YWNrSWQoREVGQVVMVF9ESVNQTEFZX0lEKSA9PSBGVUxMU0NSRUVOX1dPUktTUEFDRV9TVEFDS19JRDsKLSAgICAgICAgfSwgIldhaXRpbmcgZm9yIFBJUCB0byBleGl0IHRvIGZ1bGxzY3JlZW4iKTsKLSAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yV2l0aEFtU3RhdGUobURldmljZSwgKGFtU3RhdGUpIC0+IHsKLSAgICAgICAgICAgIHJldHVybiBhbVN0YXRlLmdldEZyb250U3RhY2tJZChERUZBVUxUX0RJU1BMQVlfSUQpID09IFBJTk5FRF9TVEFDS19JRDsKLSAgICAgICAgfSwgIldhaXRpbmcgdG8gcmUtZW50ZXIgUElQIik7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZFN0YWNrKCJFeHBlY3RlZCBob21lIHN0YWNrIGZvY3VzZWQiLCBIT01FX1NUQUNLX0lEKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGlwVW5QaXBPdmVyQXBwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghc3VwcG9ydHNQaXAoKSkgcmV0dXJuOwotCi0gICAgICAgIC8vIExhdW5jaCBhIHRlc3QgYWN0aXZpdHkgc28gdGhhdCB3ZSdyZSBub3Qgb3ZlciBob21lCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5KFRFU1RfQUNUSVZJVFkpOwotCi0gICAgICAgIC8vIExhdW5jaCBhbiBhdXRvIHBpcCBhY3Rpdml0eQotICAgICAgICBsYXVuY2hBY3Rpdml0eShQSVBfQUNUSVZJVFksCi0gICAgICAgICAgICAgICAgRVhUUkFfRU5URVJfUElQLCAidHJ1ZSIsCi0gICAgICAgICAgICAgICAgRVhUUkFfUkVFTlRFUl9QSVBfT05fRVhJVCwgInRydWUiKTsKLSAgICAgICAgYXNzZXJ0UGlubmVkU3RhY2tFeGlzdHMoKTsKLQotICAgICAgICAvLyBSZWxhdW5jaCB0aGUgYWN0aXZpdHkgdG8gZnVsbHNjcmVlbiB0byB0cmlnZ2VyIHRoZSBhY3Rpdml0eSB0byBleGl0IGFuZCByZS1lbnRlciBwaXAKLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoUElQX0FDVElWSVRZKTsKLSAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yV2l0aEFtU3RhdGUobURldmljZSwgKGFtU3RhdGUpIC0+IHsKLSAgICAgICAgICAgIHJldHVybiBhbVN0YXRlLmdldEZyb250U3RhY2tJZChERUZBVUxUX0RJU1BMQVlfSUQpID09IEZVTExTQ1JFRU5fV09SS1NQQUNFX1NUQUNLX0lEOwotICAgICAgICB9LCAiV2FpdGluZyBmb3IgUElQIHRvIGV4aXQgdG8gZnVsbHNjcmVlbiIpOwotICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JXaXRoQW1TdGF0ZShtRGV2aWNlLCAoYW1TdGF0ZSkgLT4gewotICAgICAgICAgICAgcmV0dXJuIGFtU3RhdGUuZ2V0RnJvbnRTdGFja0lkKERFRkFVTFRfRElTUExBWV9JRCkgPT0gUElOTkVEX1NUQUNLX0lEOwotICAgICAgICB9LCAiV2FpdGluZyB0byByZS1lbnRlciBQSVAiKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkU3RhY2soIkV4cGVjdGVkIGZ1bGxzY3JlZW4gc3RhY2sgZm9jdXNlZCIsCi0gICAgICAgICAgICAgICAgRlVMTFNDUkVFTl9XT1JLU1BBQ0VfU1RBQ0tfSUQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVQaXBXaXRoTm9GdWxsc2NyZWVuU3RhY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0c1BpcCgpKSByZXR1cm47Ci0KLSAgICAgICAgLy8gU3RhcnQgd2l0aCBhIGNsZWFuIHNsYXRlLCByZW1vdmUgYWxsIHRoZSBzdGFja3MgYnV0IGhvbWUKLSAgICAgICAgcmVtb3ZlU3RhY2tzKEFMTF9TVEFDS19JRFNfQlVUX0hPTUUpOwotCi0gICAgICAgIC8vIExhdW5jaCBhIHBpcCBhY3Rpdml0eQotICAgICAgICBsYXVuY2hBY3Rpdml0eShQSVBfQUNUSVZJVFksIEVYVFJBX0VOVEVSX1BJUCwgInRydWUiKTsKLSAgICAgICAgYXNzZXJ0UGlubmVkU3RhY2tFeGlzdHMoKTsKLQotICAgICAgICAvLyBSZW1vdmUgdGhlIHN0YWNrIGFuZCBlbnN1cmUgdGhhdCB0aGUgdGFzayBpcyBub3cgaW4gdGhlIGZ1bGxzY3JlZW4gc3RhY2sgKHdoZW4gbm8KLSAgICAgICAgLy8gZnVsbHNjcmVlbiBzdGFjayBleGlzdGVkIGJlZm9yZSkKLSAgICAgICAgcmVtb3ZlU3RhY2tzKFBJTk5FRF9TVEFDS19JRCk7Ci0gICAgICAgIGFzc2VydFBpbm5lZFN0YWNrU3RhdGVPbk1vdmVUb0Z1bGxzY3JlZW4oUElQX0FDVElWSVRZLCBIT01FX1NUQUNLX0lELAotICAgICAgICAgICAgICAgIHRydWUgLyogZXhwZWN0VG9wVGFza0hhc0FjdGl2aXR5ICovLCB0cnVlIC8qIGV4cGVjdEJvdHRvbVRhc2tIYXNBY3Rpdml0eSAqLyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZVBpcFdpdGhWaXNpYmxlRnVsbHNjcmVlblN0YWNrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghc3VwcG9ydHNQaXAoKSkgcmV0dXJuOwotCi0gICAgICAgIC8vIExhdW5jaCBhIGZ1bGxzY3JlZW4gYWN0aXZpdHksIGFuZCBhIHBpcCBhY3Rpdml0eSBvdmVyIHRoYXQKLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoVEVTVF9BQ1RJVklUWSk7Ci0gICAgICAgIGxhdW5jaEFjdGl2aXR5KFBJUF9BQ1RJVklUWSwgRVhUUkFfRU5URVJfUElQLCAidHJ1ZSIpOwotICAgICAgICBhc3NlcnRQaW5uZWRTdGFja0V4aXN0cygpOwotCi0gICAgICAgIC8vIFJlbW92ZSB0aGUgc3RhY2sgYW5kIGVuc3VyZSB0aGF0IHRoZSB0YXNrIGlzIHBsYWNlZCBpbiB0aGUgZnVsbHNjcmVlbiBzdGFjaywgYmVoaW5kIHRoZQotICAgICAgICAvLyB0b3AgZnVsbHNjcmVlbiBhY3Rpdml0eQotICAgICAgICByZW1vdmVTdGFja3MoUElOTkVEX1NUQUNLX0lEKTsKLSAgICAgICAgYXNzZXJ0UGlubmVkU3RhY2tTdGF0ZU9uTW92ZVRvRnVsbHNjcmVlbihQSVBfQUNUSVZJVFksIEZVTExTQ1JFRU5fV09SS1NQQUNFX1NUQUNLX0lELAotICAgICAgICAgICAgICAgIGZhbHNlIC8qIGV4cGVjdFRvcFRhc2tIYXNBY3Rpdml0eSAqLywgdHJ1ZSAvKiBleHBlY3RCb3R0b21UYXNrSGFzQWN0aXZpdHkgKi8pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVQaXBXaXRoSGlkZGVuRnVsbHNjcmVlblN0YWNrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghc3VwcG9ydHNQaXAoKSkgcmV0dXJuOwotCi0gICAgICAgIC8vIExhdW5jaCBhIGZ1bGxzY3JlZW4gYWN0aXZpdHksIHJldHVybiBob21lIGFuZCB3aGlsZSB0aGUgZnVsbHNjcmVlbiBzdGFjayBpcyBoaWRkZW4sCi0gICAgICAgIC8vIGxhdW5jaCBhIHBpcCBhY3Rpdml0eSBvdmVyIGhvbWUKLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoVEVTVF9BQ1RJVklUWSk7Ci0gICAgICAgIGxhdW5jaEhvbWVBY3Rpdml0eSgpOwotICAgICAgICBsYXVuY2hBY3Rpdml0eShQSVBfQUNUSVZJVFksIEVYVFJBX0VOVEVSX1BJUCwgInRydWUiKTsKLSAgICAgICAgYXNzZXJ0UGlubmVkU3RhY2tFeGlzdHMoKTsKLQotICAgICAgICAvLyBSZW1vdmUgdGhlIHN0YWNrIGFuZCBlbnN1cmUgdGhhdCB0aGUgdGFzayBpcyBwbGFjZWQgb24gdG9wIG9mIHRoZSBoaWRkZW4gZnVsbHNjcmVlbgotICAgICAgICAvLyBzdGFjaywgYnV0IHRoYXQgdGhlIGhvbWUgc3RhY2sgaXMgc3RpbGwgZm9jdXNlZAotICAgICAgICByZW1vdmVTdGFja3MoUElOTkVEX1NUQUNLX0lEKTsKLSAgICAgICAgYXNzZXJ0UGlubmVkU3RhY2tTdGF0ZU9uTW92ZVRvRnVsbHNjcmVlbihQSVBfQUNUSVZJVFksIEhPTUVfU1RBQ0tfSUQsCi0gICAgICAgICAgICAgICAgZmFsc2UgLyogZXhwZWN0VG9wVGFza0hhc0FjdGl2aXR5ICovLCB0cnVlIC8qIGV4cGVjdEJvdHRvbVRhc2tIYXNBY3Rpdml0eSAqLyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1vdmVQaXBUb0JhY2tXaXRoTm9GdWxsc2NyZWVuU3RhY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0c1BpcCgpKSByZXR1cm47Ci0KLSAgICAgICAgLy8gU3RhcnQgd2l0aCBhIGNsZWFuIHNsYXRlLCByZW1vdmUgYWxsIHRoZSBzdGFja3MgYnV0IGhvbWUKLSAgICAgICAgcmVtb3ZlU3RhY2tzKEFMTF9TVEFDS19JRFNfQlVUX0hPTUUpOwotCi0gICAgICAgIC8vIExhdW5jaCBhIHBpcCBhY3Rpdml0eQotICAgICAgICBsYXVuY2hBY3Rpdml0eShQSVBfQUNUSVZJVFksIEVYVFJBX0VOVEVSX1BJUCwgInRydWUiKTsKLSAgICAgICAgYXNzZXJ0UGlubmVkU3RhY2tFeGlzdHMoKTsKLQotICAgICAgICAvLyBSZW1vdmUgdGhlIHN0YWNrIGFuZCBlbnN1cmUgdGhhdCB0aGUgdGFzayBpcyBub3cgaW4gdGhlIGZ1bGxzY3JlZW4gc3RhY2sgKHdoZW4gbm8KLSAgICAgICAgLy8gZnVsbHNjcmVlbiBzdGFjayBleGlzdGVkIGJlZm9yZSkKLSAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZCgiYW0gYnJvYWRjYXN0IC1hICIgKyBQSVBfQUNUSVZJVFlfQUNUSU9OX01PVkVfVE9fQkFDSyk7Ci0gICAgICAgIGFzc2VydFBpbm5lZFN0YWNrU3RhdGVPbk1vdmVUb0Z1bGxzY3JlZW4oUElQX0FDVElWSVRZLCBIT01FX1NUQUNLX0lELAotICAgICAgICAgICAgICAgIGZhbHNlIC8qIGV4cGVjdFRvcFRhc2tIYXNBY3Rpdml0eSAqLywgdHJ1ZSAvKiBleHBlY3RCb3R0b21UYXNrSGFzQWN0aXZpdHkgKi8pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb3ZlUGlwVG9CYWNrV2l0aFZpc2libGVGdWxsc2NyZWVuU3RhY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0c1BpcCgpKSByZXR1cm47Ci0KLSAgICAgICAgLy8gTGF1bmNoIGEgZnVsbHNjcmVlbiBhY3Rpdml0eSwgYW5kIGEgcGlwIGFjdGl2aXR5IG92ZXIgdGhhdAotICAgICAgICBsYXVuY2hBY3Rpdml0eShURVNUX0FDVElWSVRZKTsKLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoUElQX0FDVElWSVRZLCBFWFRSQV9FTlRFUl9QSVAsICJ0cnVlIik7Ci0gICAgICAgIGFzc2VydFBpbm5lZFN0YWNrRXhpc3RzKCk7Ci0KLSAgICAgICAgLy8gUmVtb3ZlIHRoZSBzdGFjayBhbmQgZW5zdXJlIHRoYXQgdGhlIHRhc2sgaXMgcGxhY2VkIGluIHRoZSBmdWxsc2NyZWVuIHN0YWNrLCBiZWhpbmQgdGhlCi0gICAgICAgIC8vIHRvcCBmdWxsc2NyZWVuIGFjdGl2aXR5Ci0gICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoImFtIGJyb2FkY2FzdCAtYSAiICsgUElQX0FDVElWSVRZX0FDVElPTl9NT1ZFX1RPX0JBQ0spOwotICAgICAgICBhc3NlcnRQaW5uZWRTdGFja1N0YXRlT25Nb3ZlVG9GdWxsc2NyZWVuKFBJUF9BQ1RJVklUWSwgRlVMTFNDUkVFTl9XT1JLU1BBQ0VfU1RBQ0tfSUQsCi0gICAgICAgICAgICAgICAgZmFsc2UgLyogZXhwZWN0VG9wVGFza0hhc0FjdGl2aXR5ICovLCB0cnVlIC8qIGV4cGVjdEJvdHRvbVRhc2tIYXNBY3Rpdml0eSAqLyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1vdmVQaXBUb0JhY2tXaXRoSGlkZGVuRnVsbHNjcmVlblN0YWNrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghc3VwcG9ydHNQaXAoKSkgcmV0dXJuOwotCi0gICAgICAgIC8vIExhdW5jaCBhIGZ1bGxzY3JlZW4gYWN0aXZpdHksIHJldHVybiBob21lIGFuZCB3aGlsZSB0aGUgZnVsbHNjcmVlbiBzdGFjayBpcyBoaWRkZW4sCi0gICAgICAgIC8vIGxhdW5jaCBhIHBpcCBhY3Rpdml0eSBvdmVyIGhvbWUKLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoVEVTVF9BQ1RJVklUWSk7Ci0gICAgICAgIGxhdW5jaEhvbWVBY3Rpdml0eSgpOwotICAgICAgICBsYXVuY2hBY3Rpdml0eShQSVBfQUNUSVZJVFksIEVYVFJBX0VOVEVSX1BJUCwgInRydWUiKTsKLSAgICAgICAgYXNzZXJ0UGlubmVkU3RhY2tFeGlzdHMoKTsKLQotICAgICAgICAvLyBSZW1vdmUgdGhlIHN0YWNrIGFuZCBlbnN1cmUgdGhhdCB0aGUgdGFzayBpcyBwbGFjZWQgb24gdG9wIG9mIHRoZSBoaWRkZW4gZnVsbHNjcmVlbgotICAgICAgICAvLyBzdGFjaywgYnV0IHRoYXQgdGhlIGhvbWUgc3RhY2sgaXMgc3RpbGwgZm9jdXNlZAotICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKCJhbSBicm9hZGNhc3QgLWEgIiArIFBJUF9BQ1RJVklUWV9BQ1RJT05fTU9WRV9UT19CQUNLKTsKLSAgICAgICAgYXNzZXJ0UGlubmVkU3RhY2tTdGF0ZU9uTW92ZVRvRnVsbHNjcmVlbihQSVBfQUNUSVZJVFksIEhPTUVfU1RBQ0tfSUQsCi0gICAgICAgICAgICAgICAgZmFsc2UgLyogZXhwZWN0VG9wVGFza0hhc0FjdGl2aXR5ICovLCB0cnVlIC8qIGV4cGVjdEJvdHRvbVRhc2tIYXNBY3Rpdml0eSAqLyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBpbm5lZFN0YWNrQWx3YXlzT25Ub3AoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0c1BpcCgpKSByZXR1cm47Ci0KLSAgICAgICAgLy8gTGF1bmNoIGFjdGl2aXR5IGludG8gcGlubmVkIHN0YWNrIGFuZCBhc3NlcnQgaXQncyBvbiB0b3AuCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5KFBJUF9BQ1RJVklUWSwgRVhUUkFfRU5URVJfUElQLCAidHJ1ZSIpOwotICAgICAgICBhc3NlcnRQaW5uZWRTdGFja0V4aXN0cygpOwotICAgICAgICBhc3NlcnRQaW5uZWRTdGFja0lzT25Ub3AoKTsKLQotICAgICAgICAvLyBMYXVuY2ggYW5vdGhlciBhY3Rpdml0eSBpbiBmdWxsc2NyZWVuIHN0YWNrIGFuZCBjaGVjayB0aGF0IHBpbm5lZCBzdGFjayBpcyBzdGlsbCBvbiB0b3AuCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5KFRFU1RfQUNUSVZJVFkpOwotICAgICAgICBhc3NlcnRQaW5uZWRTdGFja0V4aXN0cygpOwotICAgICAgICBhc3NlcnRQaW5uZWRTdGFja0lzT25Ub3AoKTsKLQotICAgICAgICAvLyBMYXVuY2ggaG9tZSBhbmQgY2hlY2sgdGhhdCBwaW5uZWQgc3RhY2sgaXMgc3RpbGwgb24gdG9wLgotICAgICAgICBsYXVuY2hIb21lQWN0aXZpdHkoKTsKLSAgICAgICAgYXNzZXJ0UGlubmVkU3RhY2tFeGlzdHMoKTsKLSAgICAgICAgYXNzZXJ0UGlubmVkU3RhY2tJc09uVG9wKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFwcE9wc0RlbnlQaXBPblBhdXNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghc3VwcG9ydHNQaXAoKSkgcmV0dXJuOwotCi0gICAgICAgIC8vIERpc2FibGUgZW50ZXItcGlwIGFuZCB0cnkgdG8gZW50ZXIgcGlwCi0gICAgICAgIHNldEFwcE9wc09wVG9Nb2RlKEFjdGl2aXR5TWFuYWdlclRlc3RCYXNlLmNvbXBvbmVudE5hbWUsCi0gICAgICAgICAgICAgICAgQVBQX09QU19PUF9FTlRFUl9QSUNUVVJFX0lOX1BJQ1RVUkUsIEFQUF9PUFNfTU9ERV9JR05PUkVEKTsKLQotICAgICAgICAvLyBMYXVuY2ggdGhlIFBJUCBhY3Rpdml0eSBvbiBwYXVzZQotICAgICAgICBsYXVuY2hBY3Rpdml0eShQSVBfQUNUSVZJVFksIEVYVFJBX0VOVEVSX1BJUCwgInRydWUiKTsKLSAgICAgICAgYXNzZXJ0UGlubmVkU3RhY2tEb2VzTm90RXhpc3QoKTsKLQotICAgICAgICAvLyBHbyBob21lIGFuZCBlbnN1cmUgdGhhdCB0aGVyZSBpcyBubyBwaW5uZWQgc3RhY2sKLSAgICAgICAgbGF1bmNoSG9tZUFjdGl2aXR5KCk7Ci0gICAgICAgIGFzc2VydFBpbm5lZFN0YWNrRG9lc05vdEV4aXN0KCk7Ci0KLSAgICAgICAgLy8gUmUtZW5hYmxlIGVudGVyLXBpcC1vbi1oaWRlCi0gICAgICAgIHNldEFwcE9wc09wVG9Nb2RlKEFjdGl2aXR5TWFuYWdlclRlc3RCYXNlLmNvbXBvbmVudE5hbWUsCi0gICAgICAgICAgICAgICAgQVBQX09QU19PUF9FTlRFUl9QSUNUVVJFX0lOX1BJQ1RVUkUsIEFQUF9PUFNfTU9ERV9BTExPV0VEKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW50ZXJQaXBGcm9tVGFza1dpdGhNdWx0aXBsZUFjdGl2aXRpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0c1BpcCgpKSByZXR1cm47Ci0KLSAgICAgICAgLy8gVHJ5IHRvIGVudGVyIHBpY3R1cmUtaW4tcGljdHVyZSBmcm9tIGFuIGFjdGl2aXR5IHRoYXQgaGFzIG1vcmUgdGhhbiBvbmUgYWN0aXZpdHkgaW4gdGhlCi0gICAgICAgIC8vIHRhc2sgYW5kIGVuc3VyZSB0aGF0IGl0IHdvcmtzCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5KExBVU5DSF9FTlRFUl9QSVBfQUNUSVZJVFkpOwotICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JWYWxpZFN0YXRlKG1EZXZpY2UsIFBJUF9BQ1RJVklUWSwgUElOTkVEX1NUQUNLX0lEKTsKLSAgICAgICAgYXNzZXJ0UGlubmVkU3RhY2tFeGlzdHMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW50ZXJQaXBXaXRoUmVzdW1lV2hpbGVQYXVzaW5nQWN0aXZpdHlOb1N0b3AoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0c1BpcCgpKSByZXR1cm47Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogTGF1bmNoIHRoZSByZXN1bWVXaGlsZVBhdXNpbmcgYWN0aXZpdHkgYW5kIGVuc3VyZSB0aGF0IHRoZSBQaVAgYWN0aXZpdHkgZGlkIG5vdCBnZXQKLSAgICAgICAgICogc3RvcHBlZCBhbmQgYWN0dWFsbHkgd2VudCBpbnRvIHRoZSBwaW5uZWQgc3RhY2suCi0gICAgICAgICAqCi0gICAgICAgICAqIE5vdGUgdGhhdCB0aGlzIGlzIGEgd29ya2Fyb3VuZCBiZWNhdXNlIHRvIHRyaWdnZXIgdGhlIHBhdGggdGhhdCB3ZSB3YW50IHRvIGhhcHBlbiBpbgotICAgICAgICAgKiBhY3Rpdml0eSBtYW5hZ2VyLCB3ZSBuZWVkIHRvIGFkZCB0aGUgbGVhdmluZyBhY3Rpdml0eSB0byB0aGUgc3RvcHBpbmcgc3RhdGUsIHdoaWNoIG9ubHkKLSAgICAgICAgICogaGFwcGVucyB3aGVuIGEgaGlkZGVuIHN0YWNrIGlzIGJyb3VnaHQgZm9yd2FyZC4gTm9ybWFsbHksIHRoaXMgaGFwcGVucyB3aGVuIHlvdSBnbyBob21lLAotICAgICAgICAgKiBidXQgc2luY2Ugd2UgY2FuJ3QgbGF1bmNoIGludG8gdGhlIGhvbWUgc3RhY2sgZGlyZWN0bHksIHdlIGhhdmUgYSB3b3JrYXJvdW5kLgotICAgICAgICAgKgotICAgICAgICAgKiAxKSBMYXVuY2ggYW4gYWN0aXZpdHkgaW4gYSBuZXcgZHluYW1pYyBzdGFjawotICAgICAgICAgKiAyKSBSZXNpemUgdGhlIGR5bmFtaWMgc3RhY2sgdG8gbm9uLWZ1bGxzY3JlZW4gYm91bmRzCi0gICAgICAgICAqIDMpIFN0YXJ0IHRoZSBQaVAgYWN0aXZpdHkgdGhhdCB3aWxsIGVudGVyIHBpY3R1cmUtaW4tcGljdHVyZSB3aGVuIHBhdXNlZCBpbiB0aGUKLSAgICAgICAgICogICAgZnVsbHNjcmVlbiBzdGFjawotICAgICAgICAgKiA0KSBCcmluZyB0aGUgYWN0aXZpdHkgaW4gdGhlIGR5bmFtaWMgc3RhY2sgZm9yd2FyZCB0byB0cmlnZ2VyIFBpUAotICAgICAgICAgKi8KLSAgICAgICAgaW50IHN0YWNrSWQgPSBsYXVuY2hBY3Rpdml0eUluTmV3RHluYW1pY1N0YWNrKFJFU1VNRV9XSElMRV9QQVVTSU5HX0FDVElWSVRZKTsKLSAgICAgICAgcmVzaXplU3RhY2soc3RhY2tJZCwgMCwgMCwgNTAwLCA1MDApOwotICAgICAgICAvLyBMYXVuY2ggYW4gYWN0aXZpdHkgdGhhdCB3aWxsIGVudGVyIFBpUCB3aGVuIGl0IGlzIHBhdXNlZCB3aXRoIGEgZGVsYXkgdGhhdCBpcyBsb25nIGVub3VnaAotICAgICAgICAvLyBmb3IgdGhlIG5leHQgcmVzdW1lV2hpbGVQYXVzaW5nIGFjdGl2aXR5IHRvIGZpbmlzaCByZXN1bWluZywgYnV0IHNsb3cgZW5vdWdoIHRvIG5vdAotICAgICAgICAvLyB0cmlnZ2VyIHRoZSBjdXJyZW50IHN5c3RlbSBwYXVzZSB0aW1lb3V0IChjdXJyZW50bHkgNTAwbXMpCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5SW5TdGFjayhQSVBfQUNUSVZJVFksIEZVTExTQ1JFRU5fV09SS1NQQUNFX1NUQUNLX0lELAotICAgICAgICAgICAgICAgIEVYVFJBX0VOVEVSX1BJUF9PTl9QQVVTRSwgInRydWUiLAotICAgICAgICAgICAgICAgIEVYVFJBX09OX1BBVVNFX0RFTEFZLCAiMzUwIiwKLSAgICAgICAgICAgICAgICBFWFRSQV9BU1NFUlRfTk9fT05fU1RPUF9CRUZPUkVfUElQLCAidHJ1ZSIpOwotICAgICAgICBsYXVuY2hBY3Rpdml0eShSRVNVTUVfV0hJTEVfUEFVU0lOR19BQ1RJVklUWSk7Ci0gICAgICAgIGFzc2VydFBpbm5lZFN0YWNrRXhpc3RzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdERpc2FsbG93RW50ZXJQaXBBY3Rpdml0eUxvY2tlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIXN1cHBvcnRzUGlwKCkpIHJldHVybjsKLQotICAgICAgICBsYXVuY2hBY3Rpdml0eShQSVBfQUNUSVZJVFksIEVYVFJBX0VOVEVSX1BJUF9PTl9QQVVTRSwgInRydWUiKTsKLSAgICAgICAgQWN0aXZpdHlUYXNrIHRhc2sgPQotICAgICAgICAgICAgICAgIG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFN0YWNrQnlJZChGVUxMU0NSRUVOX1dPUktTUEFDRV9TVEFDS19JRCkuZ2V0VG9wVGFzaygpOwotCi0gICAgICAgIC8vIExvY2sgdGhlIHRhc2sgYW5kIGVuc3VyZSB0aGF0IHdlIGNhbid0IGVudGVyIHBpY3R1cmUtaW4tcGljdHVyZSBib3RoIGV4cGxpY2l0bHkgYW5kCi0gICAgICAgIC8vIHdoZW4gcGF1c2VkCi0gICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoImFtIHRhc2sgbG9jayAiICsgdGFzay5tVGFza0lkKTsKLSAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZCgiYW0gYnJvYWRjYXN0IC1hICIgKyBQSVBfQUNUSVZJVFlfQUNUSU9OX0VOVEVSX1BJUCk7Ci0gICAgICAgIG1BbVdtU3RhdGUud2FpdEZvclZhbGlkU3RhdGUobURldmljZSwgUElQX0FDVElWSVRZLCBQSU5ORURfU1RBQ0tfSUQpOwotICAgICAgICBhc3NlcnRQaW5uZWRTdGFja0RvZXNOb3RFeGlzdCgpOwotICAgICAgICBsYXVuY2hIb21lQWN0aXZpdHkoKTsKLSAgICAgICAgYXNzZXJ0UGlubmVkU3RhY2tEb2VzTm90RXhpc3QoKTsKLSAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZCgiYW0gdGFzayBsb2NrIHN0b3AiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uZmlndXJhdGlvbkNoYW5nZU9yZGVyRHVyaW5nVHJhbnNpdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIXN1cHBvcnRzUGlwKCkpIHJldHVybjsKLQotICAgICAgICAvLyBMYXVuY2ggYSBQaVAgYWN0aXZpdHkgYW5kIGVuc3VyZSBjb25maWd1cmF0aW9uIGNoYW5nZSBvbmx5IGhhcHBlbmVkIG9uY2UsIGFuZCB0aGF0IHRoZQotICAgICAgICAvLyBjb25maWd1cmF0aW9uIGNoYW5nZSBoYXBwZW5lZCBhZnRlciB0aGUgcGljdHVyZS1pbi1waWN0dXJlIGFuZCBtdWx0aS13aW5kb3cgY2FsbGJhY2tzCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5KFBJUF9BQ1RJVklUWSk7Ci0gICAgICAgIFN0cmluZyBsb2dTZXBhcmF0b3IgPSBjbGVhckxvZ2NhdCgpOwotICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKCJhbSBicm9hZGNhc3QgLWEgIiArIFBJUF9BQ1RJVklUWV9BQ1RJT05fRU5URVJfUElQKTsKLSAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yVmFsaWRTdGF0ZShtRGV2aWNlLCBQSVBfQUNUSVZJVFksIFBJTk5FRF9TVEFDS19JRCk7Ci0gICAgICAgIGFzc2VydFBpbm5lZFN0YWNrRXhpc3RzKCk7Ci0gICAgICAgIHdhaXRGb3JWYWxpZFBpY3R1cmVJblBpY3R1cmVDYWxsYmFja3MoUElQX0FDVElWSVRZLCBsb2dTZXBhcmF0b3IpOwotICAgICAgICBhc3NlcnRWYWxpZFBpY3R1cmVJblBpY3R1cmVDYWxsYmFja09yZGVyKFBJUF9BQ1RJVklUWSwgbG9nU2VwYXJhdG9yKTsKLQotICAgICAgICAvLyBUcmlnZ2VyIGl0IHRvIGdvIGJhY2sgdG8gZnVsbHNjcmVlbiBhbmQgZW5zdXJlIHRoYXQgb25seSB0cmlnZ2VyZWQgb25lIGNvbmZpZ3VyYXRpb24KLSAgICAgICAgLy8gY2hhbmdlIGFzIHdlbGwKLSAgICAgICAgbG9nU2VwYXJhdG9yID0gY2xlYXJMb2djYXQoKTsKLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoUElQX0FDVElWSVRZKTsKLSAgICAgICAgd2FpdEZvclZhbGlkUGljdHVyZUluUGljdHVyZUNhbGxiYWNrcyhQSVBfQUNUSVZJVFksIGxvZ1NlcGFyYXRvcik7Ci0gICAgICAgIGFzc2VydFZhbGlkUGljdHVyZUluUGljdHVyZUNhbGxiYWNrT3JkZXIoUElQX0FDVElWSVRZLCBsb2dTZXBhcmF0b3IpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbnRlclBpcEludGVycnVwdGVkQ2FsbGJhY2tzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghc3VwcG9ydHNQaXAoKSkgcmV0dXJuOwotCi0gICAgICAgIC8vIFNsb3cgZG93biB0aGUgdHJhbnNpdGlvbiBhbmltYXRpb25zIGZvciB0aGlzIHRlc3QKLSAgICAgICAgc2V0V2luZG93VHJhbnNpdGlvbkFuaW1hdGlvbkR1cmF0aW9uU2NhbGUoMjApOwotCi0gICAgICAgIC8vIExhdW5jaCBhIFBpUCBhY3Rpdml0eQotICAgICAgICBsYXVuY2hBY3Rpdml0eShQSVBfQUNUSVZJVFksIEVYVFJBX0VOVEVSX1BJUCwgInRydWUiKTsKLSAgICAgICAgLy8gV2FpdCB1bnRpbCB0aGUgUGlQIGFjdGl2aXR5IGhhcyBtb3ZlZCBpbnRvIHRoZSBwaW5uZWQgc3RhY2sgKGhhcHBlbnMgYmVmb3JlIHRoZQotICAgICAgICAvLyB0cmFuc2l0aW9uIGhhcyBzdGFydGVkKQotICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JWYWxpZFN0YXRlKG1EZXZpY2UsIFBJUF9BQ1RJVklUWSwgUElOTkVEX1NUQUNLX0lEKTsKLSAgICAgICAgYXNzZXJ0UGlubmVkU3RhY2tFeGlzdHMoKTsKLQotICAgICAgICAvLyBSZWxhdW5jaCB0aGUgUGlQIGFjdGl2aXR5IGJhY2sgaW50byBmdWxsc2NyZWVuCi0gICAgICAgIFN0cmluZyBsb2dTZXBhcmF0b3IgPSBjbGVhckxvZ2NhdCgpOwotICAgICAgICBsYXVuY2hBY3Rpdml0eShQSVBfQUNUSVZJVFkpOwotICAgICAgICAvLyBXYWl0IHVudGlsIHRoZSBQaVAgYWN0aXZpdHkgaXMgcmVwYXJlbnRlZCBpbnRvIHRoZSBmdWxsc2NyZWVuIHN0YWNrIChoYXBwZW5zIGFmdGVyIHRoZQotICAgICAgICAvLyB0cmFuc2l0aW9uIGhhcyBmaW5pc2hlZCkKLSAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yVmFsaWRTdGF0ZShtRGV2aWNlLCBQSVBfQUNUSVZJVFksIEZVTExTQ1JFRU5fV09SS1NQQUNFX1NUQUNLX0lEKTsKLQotICAgICAgICAvLyBFbnN1cmUgdGhhdCB3ZSBnZXQgdGhlIGNhbGxiYWNrcyBpbmRpY2F0aW5nIHRoYXQgUGlQL01XIG1vZGUgd2FzIGNhbmNlbGxlZCwgYnV0IG5vCi0gICAgICAgIC8vIGNvbmZpZ3VyYXRpb24gY2hhbmdlIChzaW5jZSBub25lIHdhcyBzZW50KQotICAgICAgICBmaW5hbCBBY3Rpdml0eUxpZmVjeWNsZUNvdW50cyBsaWZlY3ljbGVDb3VudHMgPSBuZXcgQWN0aXZpdHlMaWZlY3ljbGVDb3VudHMoCi0gICAgICAgICAgICAgICAgUElQX0FDVElWSVRZLCBsb2dTZXBhcmF0b3IpOwotICAgICAgICBhc3NlcnRUcnVlKGxpZmVjeWNsZUNvdW50cy5tQ29uZmlndXJhdGlvbkNoYW5nZWRDb3VudCA9PSAwKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShsaWZlY3ljbGVDb3VudHMubVBpY3R1cmVJblBpY3R1cmVNb2RlQ2hhbmdlZENvdW50ID09IDEpOwotICAgICAgICBhc3NlcnRUcnVlKGxpZmVjeWNsZUNvdW50cy5tTXVsdGlXaW5kb3dNb2RlQ2hhbmdlZENvdW50ID09IDEpOwotCi0gICAgICAgIC8vIFJlc2V0IHRoZSBhbmltYXRpb24gc2NhbGUKLSAgICAgICAgc2V0V2luZG93VHJhbnNpdGlvbkFuaW1hdGlvbkR1cmF0aW9uU2NhbGUoMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0b3BCZWZvcmVNdWx0aVdpbmRvd0NhbGxiYWNrc09uRGlzbWlzcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIXN1cHBvcnRzUGlwKCkpIHJldHVybjsKLQotICAgICAgICAvLyBMYXVuY2ggYSBQaVAgYWN0aXZpdHkKLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoUElQX0FDVElWSVRZLCBFWFRSQV9FTlRFUl9QSVAsICJ0cnVlIik7Ci0gICAgICAgIGFzc2VydFBpbm5lZFN0YWNrRXhpc3RzKCk7Ci0KLSAgICAgICAgLy8gRGlzbWlzcyBpdAotICAgICAgICBTdHJpbmcgbG9nU2VwYXJhdG9yID0gY2xlYXJMb2djYXQoKTsKLSAgICAgICAgcmVtb3ZlU3RhY2tzKFBJTk5FRF9TVEFDS19JRCk7Ci0gICAgICAgIG1BbVdtU3RhdGUud2FpdEZvclZhbGlkU3RhdGUobURldmljZSwgUElQX0FDVElWSVRZLCBGVUxMU0NSRUVOX1dPUktTUEFDRV9TVEFDS19JRCk7Ci0KLSAgICAgICAgLy8gQ29uZmlybSB0aGF0IHdlIGdldCBzdG9wIGJlZm9yZSB0aGUgbXVsdGktd2luZG93IGFuZCBwaWN0dXJlLWluLXBpY3R1cmUgbW9kZSBjaGFuZ2UKLSAgICAgICAgLy8gY2FsbGJhY2tzCi0gICAgICAgIGZpbmFsIEFjdGl2aXR5TGlmZWN5Y2xlQ291bnRzIGxpZmVjeWNsZUNvdW50cyA9IG5ldyBBY3Rpdml0eUxpZmVjeWNsZUNvdW50cyhQSVBfQUNUSVZJVFksCi0gICAgICAgICAgICAgICAgbG9nU2VwYXJhdG9yKTsKLSAgICAgICAgaWYgKGxpZmVjeWNsZUNvdW50cy5tU3RvcENvdW50ICE9IDEpIHsKLSAgICAgICAgICAgIGZhaWwoUElQX0FDVElWSVRZICsgIiBoYXMgcmVjZWl2ZWQgIiArIGxpZmVjeWNsZUNvdW50cy5tU3RvcENvdW50Ci0gICAgICAgICAgICAgICAgICAgICsgIiBvblN0b3AoKSBjYWxscywgZXhwZWN0aW5nIDEiKTsKLSAgICAgICAgfSBlbHNlIGlmIChsaWZlY3ljbGVDb3VudHMubVBpY3R1cmVJblBpY3R1cmVNb2RlQ2hhbmdlZENvdW50ICE9IDEpIHsKLSAgICAgICAgICAgIGZhaWwoUElQX0FDVElWSVRZICsgIiBoYXMgcmVjZWl2ZWQgIiArIGxpZmVjeWNsZUNvdW50cy5tUGljdHVyZUluUGljdHVyZU1vZGVDaGFuZ2VkQ291bnQKLSAgICAgICAgICAgICAgICAgICAgKyAiIG9uUGljdHVyZUluUGljdHVyZU1vZGVDaGFuZ2VkKCkgY2FsbHMsIGV4cGVjdGluZyAxIik7Ci0gICAgICAgIH0gZWxzZSBpZiAobGlmZWN5Y2xlQ291bnRzLm1NdWx0aVdpbmRvd01vZGVDaGFuZ2VkQ291bnQgIT0gMSkgewotICAgICAgICAgICAgZmFpbChQSVBfQUNUSVZJVFkgKyAiIGhhcyByZWNlaXZlZCAiICsgbGlmZWN5Y2xlQ291bnRzLm1NdWx0aVdpbmRvd01vZGVDaGFuZ2VkQ291bnQKLSAgICAgICAgICAgICAgICAgICAgKyAiIG9uTXVsdGlXaW5kb3dNb2RlQ2hhbmdlZCgpIGNhbGxzLCBleHBlY3RpbmcgMSIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50IGxhc3RTdG9wTGluZSA9IGxpZmVjeWNsZUNvdW50cy5tTGFzdFN0b3BMaW5lSW5kZXg7Ci0gICAgICAgICAgICBpbnQgbGFzdFBpcExpbmUgPSBsaWZlY3ljbGVDb3VudHMubUxhc3RQaWN0dXJlSW5QaWN0dXJlTW9kZUNoYW5nZWRMaW5lSW5kZXg7Ci0gICAgICAgICAgICBpbnQgbGFzdE13TGluZSA9IGxpZmVjeWNsZUNvdW50cy5tTGFzdE11bHRpV2luZG93TW9kZUNoYW5nZWRMaW5lSW5kZXg7Ci0gICAgICAgICAgICBpZiAoIShsYXN0U3RvcExpbmUgPCBsYXN0UGlwTGluZSAmJiBsYXN0UGlwTGluZSA8IGxhc3RNd0xpbmUpKSB7Ci0gICAgICAgICAgICAgICAgZmFpbChQSVBfQUNUSVZJVFkgKyAiIGhhcyByZWNlaXZlZCBjYWxsYmFja3MgaW4gdW5leHBlY3RlZCBvcmRlci4gIEV4cGVjdGVkOiIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiBzdG9wIDwgcGlwIDwgbXcsIGJ1dCBnb3QgbGluZSBpbmRpY2VzOiAiICsgbGFzdFN0b3BMaW5lICsgIiwgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBsYXN0UGlwTGluZSArICIsICIgKyBsYXN0TXdMaW5lICsgIiByZXNwZWN0aXZlbHkiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQcmV2ZW50U2V0QXNwZWN0UmF0aW9XaGlsZUV4cGFuZGluZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIXN1cHBvcnRzUGlwKCkpIHJldHVybjsKLQotICAgICAgICAvLyBMYXVuY2ggdGhlIFBpUCBhY3Rpdml0eQotICAgICAgICBsYXVuY2hBY3Rpdml0eShQSVBfQUNUSVZJVFksIEVYVFJBX0VOVEVSX1BJUCwgInRydWUiKTsKLQotICAgICAgICAvLyBUcmlnZ2VyIGl0IHRvIGdvIGJhY2sgdG8gZnVsbHNjcmVlbiBhbmQgdHJ5IHRvIHNldCB0aGUgYXNwZWN0IHJhdGlvLCBhbmQgZW5zdXJlIHRoYXQgdGhlCi0gICAgICAgIC8vIGNhbGwgdG8gc2V0IHRoZSBhc3BlY3QgcmF0aW8gZGlkIG5vdCBwcmV2ZW50IHRoZSBQaVAgZnJvbSByZXR1cm5pbmcgdG8gZnVsbHNjcmVlbgotICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKCJhbSBicm9hZGNhc3QgLWEgIiArIFBJUF9BQ1RJVklUWV9BQ1RJT05fRVhQQU5EX1BJUAotICAgICAgICAgICAgICAgICsgIiAtZSAiICsgRVhUUkFfU0VUX0FTUEVDVF9SQVRJT19XSVRIX0RFTEFZX05VTUVSQVRPUiArICIgMTIzNDU2Nzg5IgotICAgICAgICAgICAgICAgICsgIiAtZSAiICsgRVhUUkFfU0VUX0FTUEVDVF9SQVRJT19XSVRIX0RFTEFZX0RFTk9NSU5BVE9SICsgIiAxMDAwMDAwMDAiKTsKLSAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yVmFsaWRTdGF0ZShtRGV2aWNlLCBQSVBfQUNUSVZJVFksIEZVTExTQ1JFRU5fV09SS1NQQUNFX1NUQUNLX0lEKTsKLSAgICAgICAgYXNzZXJ0UGlubmVkU3RhY2tEb2VzTm90RXhpc3QoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0UmVxdWVzdGVkT3JpZW50YXRpb25XaGlsZVBpbm5lZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIXN1cHBvcnRzUGlwKCkpIHJldHVybjsKLQotICAgICAgICAvLyBMYXVuY2ggdGhlIFBpUCBhY3Rpdml0eSBmaXhlZCBhcyBwb3J0cmFpdCwgYW5kIGVudGVyIHBpY3R1cmUtaW4tcGljdHVyZQotICAgICAgICBsYXVuY2hBY3Rpdml0eShQSVBfQUNUSVZJVFksCi0gICAgICAgICAgICAgICAgRVhUUkFfRklYRURfT1JJRU5UQVRJT04sIFN0cmluZy52YWx1ZU9mKE9SSUVOVEFUSU9OX1BPUlRSQUlUKSwKLSAgICAgICAgICAgICAgICBFWFRSQV9FTlRFUl9QSVAsICJ0cnVlIik7Ci0gICAgICAgIGFzc2VydFBpbm5lZFN0YWNrRXhpc3RzKCk7Ci0KLSAgICAgICAgLy8gUmVxdWVzdCB0aGF0IHRoZSBvcmllbnRhdGlvbiBpcyBzZXQgdG8gbGFuZHNjYXBlCi0gICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoImFtIGJyb2FkY2FzdCAtYSAiCi0gICAgICAgICAgICAgICAgKyBQSVBfQUNUSVZJVFlfQUNUSU9OX1NFVF9SRVFVRVNURURfT1JJRU5UQVRJT04gKyAiIC1lICIKLSAgICAgICAgICAgICAgICArIEVYVFJBX0ZJWEVEX09SSUVOVEFUSU9OICsgIiAiICsgU3RyaW5nLnZhbHVlT2YoT1JJRU5UQVRJT05fTEFORFNDQVBFKSk7Ci0KLSAgICAgICAgLy8gTGF1bmNoIHRoZSBhY3Rpdml0eSBiYWNrIGludG8gZnVsbHNjcmVlbiBhbmQgZW5zdXJlIHRoYXQgaXQgaXMgbm93IGluIGxhbmRzY2FwZQotICAgICAgICBsYXVuY2hBY3Rpdml0eShQSVBfQUNUSVZJVFkpOwotICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JWYWxpZFN0YXRlKG1EZXZpY2UsIFBJUF9BQ1RJVklUWSwgRlVMTFNDUkVFTl9XT1JLU1BBQ0VfU1RBQ0tfSUQpOwotICAgICAgICBhc3NlcnRQaW5uZWRTdGFja0RvZXNOb3RFeGlzdCgpOwotICAgICAgICBhc3NlcnRUcnVlKG1BbVdtU3RhdGUuZ2V0V21TdGF0ZSgpLmdldExhc3RPcmllbnRhdGlvbigpID09IE9SSUVOVEFUSU9OX0xBTkRTQ0FQRSk7Ci0gICAgfQotCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjMuOC4xNC9DLTMtNCIpCi0gICAgcHVibGljIHZvaWQgdGVzdFdpbmRvd0J1dHRvbkVudGVyc1BpcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIXN1cHBvcnRzUGlwKCkpIHJldHVybjsKLQotICAgICAgICAvLyBMYXVuY2ggdGhlIFBpUCBhY3Rpdml0eSB0cmlnZ2VyIHRoZSB3aW5kb3cgYnV0dG9uLCBlbnN1cmUgdGhhdCB3ZSBoYXZlIGVudGVyZWQgUGlQCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5KFBJUF9BQ1RJVklUWSk7Ci0gICAgICAgIHByZXNzV2luZG93QnV0dG9uKCk7Ci0gICAgICAgIG1BbVdtU3RhdGUud2FpdEZvclZhbGlkU3RhdGUobURldmljZSwgUElQX0FDVElWSVRZLCBQSU5ORURfU1RBQ0tfSUQpOwotICAgICAgICBhc3NlcnRQaW5uZWRTdGFja0V4aXN0cygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RGaW5pc2hQaXBBY3Rpdml0eVdpdGhUYXNrT3ZlcmxheSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIXN1cHBvcnRzUGlwKCkpIHJldHVybjsKLQotICAgICAgICAvLyBMYXVuY2ggUGlQIGFjdGl2aXR5Ci0gICAgICAgIGxhdW5jaEFjdGl2aXR5KFBJUF9BQ1RJVklUWSwgRVhUUkFfRU5URVJfUElQLCAidHJ1ZSIpOwotICAgICAgICBhc3NlcnRQaW5uZWRTdGFja0V4aXN0cygpOwotICAgICAgICBpbnQgdGFza0lkID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0U3RhY2tCeUlkKFBJTk5FRF9TVEFDS19JRCkuZ2V0VG9wVGFzaygpLm1UYXNrSWQ7Ci0KLSAgICAgICAgLy8gRW5zdXJlIHRoYXQgd2UgZG9uJ3QgYW55IGFueSBvdGhlciBvdmVybGF5cyBhcyBhIHJlc3VsdCBvZiBsYXVuY2hpbmcgaW50byBQSVAKLSAgICAgICAgbGF1bmNoSG9tZUFjdGl2aXR5KCk7Ci0KLSAgICAgICAgLy8gTGF1bmNoIHRhc2sgb3ZlcmxheSBhY3Rpdml0eSBpbnRvIFBpUCBhY3Rpdml0eSB0YXNrCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5QXNUYXNrT3ZlcmxheShUUkFOU0xVQ0VOVF9URVNUX0FDVElWSVRZLCB0YXNrSWQsIFBJTk5FRF9TVEFDS19JRCk7Ci0KLSAgICAgICAgLy8gRmluaXNoIHRoZSBQaVAgYWN0aXZpdHkgYW5kIGVuc3VyZSB0aGF0IHRoZXJlIGlzIG5vIHBpbm5lZCBzdGFjawotICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKCJhbSBicm9hZGNhc3QgLWEgIiArIFBJUF9BQ1RJVklUWV9BQ1RJT05fRklOSVNIKTsKLSAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yV2l0aEFtU3RhdGUobURldmljZSwgKGFtU3RhdGUpIC0+IHsKLSAgICAgICAgICAgIEFjdGl2aXR5U3RhY2sgc3RhY2sgPSBhbVN0YXRlLmdldFN0YWNrQnlJZChQSU5ORURfU1RBQ0tfSUQpOwotICAgICAgICAgICAgcmV0dXJuIHN0YWNrID09IG51bGw7Ci0gICAgICAgIH0sICJXYWl0aW5nIGZvciBwaW5uZWQgc3RhY2sgdG8gYmUgcmVtb3ZlZC4uLiIpOwotICAgICAgICBhc3NlcnRQaW5uZWRTdGFja0RvZXNOb3RFeGlzdCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROb1Jlc3VtZUFmdGVyVGFza092ZXJsYXlGaW5pc2hlcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIXN1cHBvcnRzUGlwKCkpIHJldHVybjsKLQotICAgICAgICAvLyBMYXVuY2ggUGlQIGFjdGl2aXR5Ci0gICAgICAgIGxhdW5jaEFjdGl2aXR5KFBJUF9BQ1RJVklUWSwgRVhUUkFfRU5URVJfUElQLCAidHJ1ZSIpOwotICAgICAgICBhc3NlcnRQaW5uZWRTdGFja0V4aXN0cygpOwotICAgICAgICBpbnQgdGFza0lkID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0U3RhY2tCeUlkKFBJTk5FRF9TVEFDS19JRCkuZ2V0VG9wVGFzaygpLm1UYXNrSWQ7Ci0KLSAgICAgICAgLy8gTGF1bmNoIHRhc2sgb3ZlcmxheSBhY3Rpdml0eSBpbnRvIFBpUCBhY3Rpdml0eSB0YXNrCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5QXNUYXNrT3ZlcmxheShUUkFOU0xVQ0VOVF9URVNUX0FDVElWSVRZLCB0YXNrSWQsIFBJTk5FRF9TVEFDS19JRCk7Ci0KLSAgICAgICAgLy8gRmluaXNoIHRoZSB0YXNrIG92ZXJsYXkgYWN0aXZpdHkgd2hpbGUgYW5pbWF0aW5nIGFuZCBlbnN1cmUgdGhhdCB0aGUgUGlQIGFjdGl2aXR5IG5ldmVyCi0gICAgICAgIC8vIGdvdCByZXN1bWVkCi0gICAgICAgIFN0cmluZyBsb2dTZXBhcmF0b3IgPSBjbGVhckxvZ2NhdCgpOwotICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKCJhbSBzdGFjayByZXNpemUtYW5pbWF0ZWQgNCAyMCAyMCA1MDAgNTAwIik7Ci0gICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoImFtIGJyb2FkY2FzdCAtYSAiICsgVEVTVF9BQ1RJVklUWV9BQ1RJT05fRklOSVNIKTsKLSAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yKG1EZXZpY2UsIChhbVN0YXRlLCB3bVN0YXRlKSAtPiAhYW1TdGF0ZS5jb250YWluc0FjdGl2aXR5KAotICAgICAgICAgICAgICAgIFRSQU5TTFVDRU5UX1RFU1RfQUNUSVZJVFkpLCAiV2FpdGluZyBmb3IgdGVzdCBhY3Rpdml0eSB0byBmaW5pc2guLi4iKTsKLSAgICAgICAgZmluYWwgQWN0aXZpdHlMaWZlY3ljbGVDb3VudHMgbGlmZWN5Y2xlQ291bnRzID0gbmV3IEFjdGl2aXR5TGlmZWN5Y2xlQ291bnRzKFBJUF9BQ1RJVklUWSwKLSAgICAgICAgICAgICAgICBsb2dTZXBhcmF0b3IpOwotICAgICAgICBhc3NlcnRUcnVlKGxpZmVjeWNsZUNvdW50cy5tUmVzdW1lQ291bnQgPT0gMCk7Ci0gICAgICAgIGFzc2VydFRydWUobGlmZWN5Y2xlQ291bnRzLm1QYXVzZUNvdW50ID09IDApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaW5uZWRTdGFja1dpdGhEb2NrZWRTdGFjaygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIXN1cHBvcnRzUGlwKCkgfHwgIXN1cHBvcnRzU3BsaXRTY3JlZW5NdWx0aVdpbmRvdygpKSByZXR1cm47Ci0KLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoUElQX0FDVElWSVRZLCBFWFRSQV9FTlRFUl9QSVAsICJ0cnVlIik7Ci0gICAgICAgIGxhdW5jaEFjdGl2aXR5SW5Eb2NrU3RhY2soTEFVTkNISU5HX0FDVElWSVRZKTsKLSAgICAgICAgbGF1bmNoQWN0aXZpdHlUb1NpZGUodHJ1ZSwgZmFsc2UsIFRFU1RfQUNUSVZJVFkpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoUElQX0FDVElWSVRZLCB0cnVlKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KExBVU5DSElOR19BQ1RJVklUWSwgdHJ1ZSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShURVNUX0FDVElWSVRZLCB0cnVlKTsKLQotICAgICAgICAvLyBMYXVuY2ggdGhlIGFjdGl2aXRpZXMgYWdhaW4gdG8gdGFrZSBmb2N1cyBhbmQgbWFrZSBzdXJlIG5vdGhpbmcgaXMgaGlkZGVuCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5SW5Eb2NrU3RhY2soTEFVTkNISU5HX0FDVElWSVRZKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KExBVU5DSElOR19BQ1RJVklUWSwgdHJ1ZSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShURVNUX0FDVElWSVRZLCB0cnVlKTsKLQotICAgICAgICBsYXVuY2hBY3Rpdml0eVRvU2lkZSh0cnVlLCBmYWxzZSwgVEVTVF9BQ1RJVklUWSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShMQVVOQ0hJTkdfQUNUSVZJVFksIHRydWUpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoVEVTVF9BQ1RJVklUWSwgdHJ1ZSk7Ci0KLSAgICAgICAgLy8gR28gdG8gcmVjZW50cyB0byBtYWtlIHN1cmUgdGhhdCBmdWxsc2NyZWVuIHN0YWNrIGlzIGludmlzaWJsZQotICAgICAgICAvLyBTb21lIGRldmljZXMgZG8gbm90IHN1cHBvcnQgcmVjZW50cyBvciBpbXBsZW1lbnQgaXQgZGlmZmVyZW50bHkgKGluc3RlYWQgb2YgdXNpbmcgYQotICAgICAgICAvLyBzZXBhcmF0ZSBzdGFjayBpZCBvciBhcyBhbiBhY3Rpdml0eSksIGZvciB0aG9zZSBjYXNlcyB0aGUgdmlzaWJpbGl0eSBhc3NlcnRzIHdpbGwgYmUKLSAgICAgICAgLy8gaWdub3JlZAotICAgICAgICBwcmVzc0FwcFN3aXRjaEJ1dHRvbigpOwotICAgICAgICBpZiAobUFtV21TdGF0ZS53YWl0Rm9yUmVjZW50c0FjdGl2aXR5VmlzaWJsZShtRGV2aWNlKSkgewotICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KExBVU5DSElOR19BQ1RJVklUWSwgdHJ1ZSk7Ci0gICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoVEVTVF9BQ1RJVklUWSwgZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdExhdW5jaFRhc2tCeUNvbXBvbmVudE1hdGNoTXVsdGlwbGVUYXNrcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIXN1cHBvcnRzUGlwKCkpIHJldHVybjsKLQotICAgICAgICAvLyBMYXVuY2ggYSBmdWxsc2NyZWVuIGFjdGl2aXR5IHdoaWNoIHdpbGwgbGF1bmNoIGEgUGlQIGFjdGl2aXR5IGluIGEgbmV3IHRhc2sgd2l0aCB0aGUgc2FtZQotICAgICAgICAvLyBhZmZpbml0eQotICAgICAgICBsYXVuY2hBY3Rpdml0eShURVNUX0FDVElWSVRZX1dJVEhfU0FNRV9BRkZJTklUWSk7Ci0gICAgICAgIGxhdW5jaEFjdGl2aXR5KFBJUF9BQ1RJVklUWV9XSVRIX1NBTUVfQUZGSU5JVFkpOwotICAgICAgICBhc3NlcnRQaW5uZWRTdGFja0V4aXN0cygpOwotCi0gICAgICAgIC8vIExhdW5jaCB0aGUgcm9vdCBhY3Rpdml0eSBhZ2Fpbi4uLgotICAgICAgICBpbnQgcm9vdEFjdGl2aXR5VGFza0lkID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0VGFza0J5QWN0aXZpdHlOYW1lKAotICAgICAgICAgICAgICAgIFRFU1RfQUNUSVZJVFlfV0lUSF9TQU1FX0FGRklOSVRZKS5tVGFza0lkOwotICAgICAgICBsYXVuY2hIb21lQWN0aXZpdHkoKTsKLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoVEVTVF9BQ1RJVklUWV9XSVRIX1NBTUVfQUZGSU5JVFkpOwotCi0gICAgICAgIC8vIC4uLmFuZCBlbnN1cmUgdGhhdCB0aGUgcm9vdCBhY3Rpdml0eSB0YXNrIGlzIGZvdW5kIGFuZCByZXVzZWQsIGFuZCB0aGF0IHRoZSBwaW5uZWQgc3RhY2sKLSAgICAgICAgLy8gaXMgdW5hZmZlY3RlZAotICAgICAgICBhc3NlcnRQaW5uZWRTdGFja0V4aXN0cygpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRBY3Rpdml0eSgiRXhwZWN0ZWQgcm9vdCBhY3Rpdml0eSBmb2N1c2VkIiwKLSAgICAgICAgICAgICAgICBURVNUX0FDVElWSVRZX1dJVEhfU0FNRV9BRkZJTklUWSk7Ci0gICAgICAgIGFzc2VydFRydWUocm9vdEFjdGl2aXR5VGFza0lkID09IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFRhc2tCeUFjdGl2aXR5TmFtZSgKLSAgICAgICAgICAgICAgICBURVNUX0FDVElWSVRZX1dJVEhfU0FNRV9BRkZJTklUWSkubVRhc2tJZCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdExhdW5jaFRhc2tCeUFmZmluaXR5TWF0Y2hNdWx0aXBsZVRhc2tzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghc3VwcG9ydHNQaXAoKSkgcmV0dXJuOwotCi0gICAgICAgIC8vIExhdW5jaCBhIGZ1bGxzY3JlZW4gYWN0aXZpdHkgd2hpY2ggd2lsbCBsYXVuY2ggYSBQaVAgYWN0aXZpdHkgaW4gYSBuZXcgdGFzayB3aXRoIHRoZSBzYW1lCi0gICAgICAgIC8vIGFmZmluaXR5LCBhbmQgYWxzbyBsYXVuY2ggYW5vdGhlciBhY3Rpdml0eSBpbiB0aGUgc2FtZSB0YXNrLCB3aGlsZSBmaW5pc2hpbmcgaXRzZWxmLiBBcwotICAgICAgICAvLyBhIHJlc3VsdCwgdGhlIHRhc2sgd2lsbCBub3QgaGF2ZSBhIGNvbXBvbmVudCBtYXRjaGluZyB0aGUgc2FtZSBhY3Rpdml0eSBhcyB3aGF0IGl0IHdhcwotICAgICAgICAvLyBzdGFydGVkIHdpdGgKLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoVEVTVF9BQ1RJVklUWV9XSVRIX1NBTUVfQUZGSU5JVFksCi0gICAgICAgICAgICAgICAgRVhUUkFfU1RBUlRfQUNUSVZJVFksIGdldEFjdGl2aXR5Q29tcG9uZW50TmFtZShURVNUX0FDVElWSVRZKSwKLSAgICAgICAgICAgICAgICBFWFRSQV9GSU5JU0hfU0VMRl9PTl9SRVNVTUUsICJ0cnVlIik7Ci0gICAgICAgIG1BbVdtU3RhdGUud2FpdEZvclZhbGlkU3RhdGUobURldmljZSwgVEVTVF9BQ1RJVklUWSwgRlVMTFNDUkVFTl9XT1JLU1BBQ0VfU1RBQ0tfSUQpOwotICAgICAgICBsYXVuY2hBY3Rpdml0eShQSVBfQUNUSVZJVFlfV0lUSF9TQU1FX0FGRklOSVRZKTsKLSAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yVmFsaWRTdGF0ZShtRGV2aWNlLCBQSVBfQUNUSVZJVFlfV0lUSF9TQU1FX0FGRklOSVRZLCBQSU5ORURfU1RBQ0tfSUQpOwotICAgICAgICBhc3NlcnRQaW5uZWRTdGFja0V4aXN0cygpOwotCi0gICAgICAgIC8vIExhdW5jaCB0aGUgcm9vdCBhY3Rpdml0eSBhZ2Fpbi4uLgotICAgICAgICBpbnQgcm9vdEFjdGl2aXR5VGFza0lkID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0VGFza0J5QWN0aXZpdHlOYW1lKAotICAgICAgICAgICAgICAgIFRFU1RfQUNUSVZJVFkpLm1UYXNrSWQ7Ci0gICAgICAgIGxhdW5jaEhvbWVBY3Rpdml0eSgpOwotICAgICAgICBsYXVuY2hBY3Rpdml0eShURVNUX0FDVElWSVRZX1dJVEhfU0FNRV9BRkZJTklUWSk7Ci0KLSAgICAgICAgLy8gLi4uYW5kIGVuc3VyZSB0aGF0IGV2ZW4gd2hpbGUgbWF0Y2hpbmcgcHVyZWx5IGJ5IHRhc2sgYWZmaW5pdHksIHRoZSByb290IGFjdGl2aXR5IHRhc2sgaXMKLSAgICAgICAgLy8gZm91bmQgYW5kIHJldXNlZCwgYW5kIHRoYXQgdGhlIHBpbm5lZCBzdGFjayBpcyB1bmFmZmVjdGVkCi0gICAgICAgIGFzc2VydFBpbm5lZFN0YWNrRXhpc3RzKCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZEFjdGl2aXR5KCJFeHBlY3RlZCByb290IGFjdGl2aXR5IGZvY3VzZWQiLCBURVNUX0FDVElWSVRZKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyb290QWN0aXZpdHlUYXNrSWQgPT0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0VGFza0J5QWN0aXZpdHlOYW1lKAotICAgICAgICAgICAgICAgIFRFU1RfQUNUSVZJVFkpLm1UYXNrSWQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RMYXVuY2hUYXNrQnlBZmZpbml0eU1hdGNoU2luZ2xlVGFzaygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIXN1cHBvcnRzUGlwKCkpIHJldHVybjsKLQotICAgICAgICAvLyBMYXVuY2ggYW4gYWN0aXZpdHkgaW50byB0aGUgcGlubmVkIHN0YWNrIHdpdGggYSBmaXhlZCBhZmZpbml0eQotICAgICAgICBsYXVuY2hBY3Rpdml0eShURVNUX0FDVElWSVRZX1dJVEhfU0FNRV9BRkZJTklUWSwKLSAgICAgICAgICAgICAgICBFWFRSQV9FTlRFUl9QSVAsICJ0cnVlIiwKLSAgICAgICAgICAgICAgICBFWFRSQV9TVEFSVF9BQ1RJVklUWSwgZ2V0QWN0aXZpdHlDb21wb25lbnROYW1lKFBJUF9BQ1RJVklUWSksCi0gICAgICAgICAgICAgICAgRVhUUkFfRklOSVNIX1NFTEZfT05fUkVTVU1FLCAidHJ1ZSIpOwotICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JWYWxpZFN0YXRlKG1EZXZpY2UsIFBJUF9BQ1RJVklUWSwgUElOTkVEX1NUQUNLX0lEKTsKLSAgICAgICAgYXNzZXJ0UGlubmVkU3RhY2tFeGlzdHMoKTsKLQotICAgICAgICAvLyBMYXVuY2ggdGhlIHJvb3QgYWN0aXZpdHkgYWdhaW4sIG9mIHRoZSBtYXRjaGluZyB0YXNrIGFuZCBlbnN1cmUgdGhhdCB3ZSBleHBhbmQgdG8KLSAgICAgICAgLy8gZnVsbHNjcmVlbgotICAgICAgICBpbnQgYWN0aXZpdHlUYXNrSWQgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRUYXNrQnlBY3Rpdml0eU5hbWUoCi0gICAgICAgICAgICAgICAgUElQX0FDVElWSVRZKS5tVGFza0lkOwotICAgICAgICBsYXVuY2hIb21lQWN0aXZpdHkoKTsKLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoVEVTVF9BQ1RJVklUWV9XSVRIX1NBTUVfQUZGSU5JVFkpOwotICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JWYWxpZFN0YXRlKG1EZXZpY2UsIFBJUF9BQ1RJVklUWSwgRlVMTFNDUkVFTl9XT1JLU1BBQ0VfU1RBQ0tfSUQpOwotICAgICAgICBhc3NlcnRQaW5uZWRTdGFja0RvZXNOb3RFeGlzdCgpOwotICAgICAgICBhc3NlcnRUcnVlKGFjdGl2aXR5VGFza0lkID09IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFRhc2tCeUFjdGl2aXR5TmFtZSgKLSAgICAgICAgICAgICAgICBQSVBfQUNUSVZJVFkpLm1UYXNrSWQpOwotICAgIH0KLQotICAgIC8qKiBUZXN0IHRoYXQgcmVwb3J0ZWQgZGlzcGxheSBzaXplIGNvcnJlc3BvbmRzIHRvIGZ1bGxzY3JlZW4gYWZ0ZXIgZXhpdGluZyBQaVAuICovCi0gICAgcHVibGljIHZvaWQgdGVzdERpc3BsYXlNZXRyaWNzUGluVW5waW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0c1BpcCgpKSByZXR1cm47Ci0KLSAgICAgICAgU3RyaW5nIGxvZ1NlcGFyYXRvciA9IGNsZWFyTG9nY2F0KCk7Ci0gICAgICAgIGxhdW5jaEFjdGl2aXR5KFRFU1RfQUNUSVZJVFkpOwotICAgICAgICBmaW5hbCBpbnQgZGVmYXVsdERpc3BsYXlTdGFja0lkID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0Rm9jdXNlZFN0YWNrSWQoKTsKLSAgICAgICAgZmluYWwgUmVwb3J0ZWRTaXplcyBpbml0aWFsU2l6ZXMgPSBnZXRMYXN0UmVwb3J0ZWRTaXplc0ZvckFjdGl2aXR5KFRFU1RfQUNUSVZJVFksCi0gICAgICAgICAgICAgICAgbG9nU2VwYXJhdG9yKTsKLSAgICAgICAgZmluYWwgUmVjdGFuZ2xlIGluaXRpYWxBcHBCb3VuZHMgPSByZWFkQXBwQm91bmRzKFRFU1RfQUNUSVZJVFksIGxvZ1NlcGFyYXRvcik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIk11c3QgcmVwb3J0IGRpc3BsYXkgZGltZW5zaW9ucyIsIGluaXRpYWxTaXplcyk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIk11c3QgcmVwb3J0IGFwcCBib3VuZHMiLCBpbml0aWFsQXBwQm91bmRzKTsKLQotICAgICAgICBsb2dTZXBhcmF0b3IgPSBjbGVhckxvZ2NhdCgpOwotICAgICAgICBsYXVuY2hBY3Rpdml0eShQSVBfQUNUSVZJVFksIEVYVFJBX0VOVEVSX1BJUCwgInRydWUiKTsKLSAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yVmFsaWRTdGF0ZShtRGV2aWNlLCBQSVBfQUNUSVZJVFksIFBJTk5FRF9TVEFDS19JRCk7Ci0gICAgICAgIGZpbmFsIFJlcG9ydGVkU2l6ZXMgcGlubmVkU2l6ZXMgPSBnZXRMYXN0UmVwb3J0ZWRTaXplc0ZvckFjdGl2aXR5KFBJUF9BQ1RJVklUWSwKLSAgICAgICAgICAgICAgICBsb2dTZXBhcmF0b3IpOwotICAgICAgICBmaW5hbCBSZWN0YW5nbGUgcGlubmVkQXBwQm91bmRzID0gcmVhZEFwcEJvdW5kcyhQSVBfQUNUSVZJVFksIGxvZ1NlcGFyYXRvcik7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJSZXBvcnRlZCBkaXNwbGF5IHNpemUgd2hlbiBwaW5uZWQgbXVzdCBiZSBkaWZmZXJlbnQgZnJvbSBkZWZhdWx0IiwKLSAgICAgICAgICAgICAgICBpbml0aWFsU2l6ZXMuZXF1YWxzKHBpbm5lZFNpemVzKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJSZXBvcnRlZCBhcHAgYm91bmRzIHdoZW4gcGlubmVkIG11c3QgYmUgZGlmZmVyZW50IGZyb20gZGVmYXVsdCIsCi0gICAgICAgICAgICAgICAgaW5pdGlhbEFwcEJvdW5kcy53aWR0aCA9PSBwaW5uZWRBcHBCb3VuZHMud2lkdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIGluaXRpYWxBcHBCb3VuZHMuaGVpZ2h0ID09IHBpbm5lZEFwcEJvdW5kcy5oZWlnaHQpOwotCi0gICAgICAgIGxvZ1NlcGFyYXRvciA9IGNsZWFyTG9nY2F0KCk7Ci0gICAgICAgIGxhdW5jaEFjdGl2aXR5SW5TdGFjayhQSVBfQUNUSVZJVFksIGRlZmF1bHREaXNwbGF5U3RhY2tJZCk7Ci0gICAgICAgIGZpbmFsIFJlcG9ydGVkU2l6ZXMgZmluYWxTaXplcyA9IGdldExhc3RSZXBvcnRlZFNpemVzRm9yQWN0aXZpdHkoUElQX0FDVElWSVRZLAotICAgICAgICAgICAgICAgIGxvZ1NlcGFyYXRvcik7Ci0gICAgICAgIGZpbmFsIFJlY3RhbmdsZSBmaW5hbEFwcEJvdW5kcyA9IHJlYWRBcHBCb3VuZHMoUElQX0FDVElWSVRZLCBsb2dTZXBhcmF0b3IpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIk11c3QgcmVwb3J0IGRlZmF1bHQgc2l6ZSBhZnRlciBleGl0aW5nIFBpUCIsIGluaXRpYWxTaXplcywgZmluYWxTaXplcyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiTXVzdCByZXBvcnQgZGVmYXVsdCBhcHAgd2lkdGggYWZ0ZXIgZXhpdGluZyBQaVAiLCBpbml0aWFsQXBwQm91bmRzLndpZHRoLAotICAgICAgICAgICAgICAgIGZpbmFsQXBwQm91bmRzLndpZHRoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJNdXN0IHJlcG9ydCBkZWZhdWx0IGFwcCBoZWlnaHQgYWZ0ZXIgZXhpdGluZyBQaVAiLCBpbml0aWFsQXBwQm91bmRzLmhlaWdodCwKLSAgICAgICAgICAgICAgICBmaW5hbEFwcEJvdW5kcy5oZWlnaHQpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gc0FwcEJvdW5kc1BhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoCi0gICAgICAgICAgICAiKC4rKWFwcEJvdW5kcz1SZWN0XFwoKFxcZCspLCAoXFxkKykgLSAoXFxkKyksIChcXGQrKVxcKSguKikiKTsKLQotICAgIC8qKiBSZWFkIGFwcCBib3VuZHMgaW4gbGFzdCBhcHBsaWVkIGNvbmZpZ3VyYXRpb24gZnJvbSBsb2dzLiAqLwotICAgIHByaXZhdGUgUmVjdGFuZ2xlIHJlYWRBcHBCb3VuZHMoU3RyaW5nIGFjdGl2aXR5TmFtZSwgU3RyaW5nIGxvZ1NlcGFyYXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFN0cmluZ1tdIGxpbmVzID0gZ2V0RGV2aWNlTG9nc0ZvckNvbXBvbmVudChhY3Rpdml0eU5hbWUsIGxvZ1NlcGFyYXRvcik7Ci0gICAgICAgIGZvciAoaW50IGkgPSBsaW5lcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxpbmUgPSBsaW5lc1tpXS50cmltKCk7Ci0gICAgICAgICAgICBmaW5hbCBNYXRjaGVyIG1hdGNoZXIgPSBzQXBwQm91bmRzUGF0dGVybi5tYXRjaGVyKGxpbmUpOwotICAgICAgICAgICAgaWYgKG1hdGNoZXIubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGxlZnQgPSBJbnRlZ2VyLnBhcnNlSW50KG1hdGNoZXIuZ3JvdXAoMikpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCB0b3AgPSBJbnRlZ2VyLnBhcnNlSW50KG1hdGNoZXIuZ3JvdXAoMykpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCByaWdodCA9IEludGVnZXIucGFyc2VJbnQobWF0Y2hlci5ncm91cCg0KSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGJvdHRvbSA9IEludGVnZXIucGFyc2VJbnQobWF0Y2hlci5ncm91cCg1KSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWN0YW5nbGUobGVmdCwgdG9wLCByaWdodCAtIGxlZnQsIGJvdHRvbSAtIHRvcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGFmdGVyIHRoZSBnaXZlbiB7QHBhcmFtIGFjdGl2aXR5TmFtZX0gaGFzIGJlZW4gbW92ZWQgdG8gdGhlIGZ1bGxzY3JlZW4gc3RhY2suIEVuc3VyZXMKLSAgICAgKiB0aGF0IHRoZSB7QHBhcmFtIGZvY3VzZWRTdGFja0lkfSBpcyBmb2N1c2VkLCBhbmQgY2hlY2tzIHRoZSB0b3AgYW5kL29yIGJvdHRvbSB0YXNrcyBpbiB0aGUKLSAgICAgKiBmdWxsc2NyZWVuIHN0YWNrIGlmIHtAcGFyYW0gZXhwZWN0VG9wVGFza0hhc0FjdGl2aXR5fSBvciB7QHBhcmFtIGV4cGVjdEJvdHRvbVRhc2tIYXNBY3Rpdml0eX0KLSAgICAgKiBhcmUgc2V0IHJlc3BlY3RpdmVseS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0UGlubmVkU3RhY2tTdGF0ZU9uTW92ZVRvRnVsbHNjcmVlbihTdHJpbmcgYWN0aXZpdHlOYW1lLCBpbnQgZm9jdXNlZFN0YWNrSWQsCi0gICAgICAgICAgICBib29sZWFuIGV4cGVjdFRvcFRhc2tIYXNBY3Rpdml0eSwgYm9vbGVhbiBleHBlY3RCb3R0b21UYXNrSGFzQWN0aXZpdHkpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JGb2N1c2VkU3RhY2sobURldmljZSwgZm9jdXNlZFN0YWNrSWQpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRTdGFjaygiV3JvbmcgZm9jdXNlZCBzdGFjayIsIGZvY3VzZWRTdGFja0lkKTsKLSAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yQWN0aXZpdHlTdGF0ZShtRGV2aWNlLCBhY3Rpdml0eU5hbWUsIFNUQVRFX1NUT1BQRUQpOwotICAgICAgICBhc3NlcnRUcnVlKG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmhhc0FjdGl2aXR5U3RhdGUoYWN0aXZpdHlOYW1lLCBTVEFURV9TVE9QUEVEKSk7Ci0gICAgICAgIGFzc2VydFBpbm5lZFN0YWNrRG9lc05vdEV4aXN0KCk7Ci0KLSAgICAgICAgaWYgKGV4cGVjdFRvcFRhc2tIYXNBY3Rpdml0eSkgewotICAgICAgICAgICAgQWN0aXZpdHlUYXNrIHRvcFRhc2sgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja0J5SWQoCi0gICAgICAgICAgICAgICAgICAgIEZVTExTQ1JFRU5fV09SS1NQQUNFX1NUQUNLX0lEKS5nZXRUb3BUYXNrKCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHRvcFRhc2suY29udGFpbnNBY3Rpdml0eShBY3Rpdml0eU1hbmFnZXJUZXN0QmFzZS5nZXRBY3Rpdml0eUNvbXBvbmVudE5hbWUoCi0gICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5TmFtZSkpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZXhwZWN0Qm90dG9tVGFza0hhc0FjdGl2aXR5KSB7Ci0gICAgICAgICAgICBBY3Rpdml0eVRhc2sgYm90dG9tVGFzayA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFN0YWNrQnlJZCgKLSAgICAgICAgICAgICAgICAgICAgRlVMTFNDUkVFTl9XT1JLU1BBQ0VfU1RBQ0tfSUQpLmdldEJvdHRvbVRhc2soKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoYm90dG9tVGFzay5jb250YWluc0FjdGl2aXR5KEFjdGl2aXR5TWFuYWdlclRlc3RCYXNlLmdldEFjdGl2aXR5Q29tcG9uZW50TmFtZSgKLSAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHlOYW1lKSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXNzZXJ0cyB0aGF0IHRoZSBwaW5uZWQgc3RhY2sgYm91bmRzIGRvZXMgbm90IGludGVyc2VjdCB3aXRoIHRoZSBJTUUgYm91bmRzLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRQaW5uZWRTdGFja0RvZXNOb3RJbnRlcnNlY3RJTUUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlIElNRSBpcyB2aXNpYmxlCi0gICAgICAgIFdpbmRvd01hbmFnZXJTdGF0ZSB3bVN0YXRlID0gbUFtV21TdGF0ZS5nZXRXbVN0YXRlKCk7Ci0gICAgICAgIHdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UpOwotICAgICAgICBXaW5kb3dNYW5hZ2VyU3RhdGUuV2luZG93U3RhdGUgaW1lV2luU3RhdGUgPSB3bVN0YXRlLmdldElucHV0TWV0aG9kV2luZG93U3RhdGUoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShpbWVXaW5TdGF0ZSAhPSBudWxsKTsKLQotICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgUElQIG1vdmVtZW50IGlzIGNvbnN0cmFpbmVkIGJ5IHRoZSBkaXNwbGF5IGJvdW5kcyBpbnRlcnNlY3RpbmcgdGhlCi0gICAgICAgIC8vIG5vbi1JTUUgYm91bmRzCi0gICAgICAgIFJlY3RhbmdsZSBpbWVDb250ZW50RnJhbWUgPSBpbWVXaW5TdGF0ZS5nZXRDb250ZW50RnJhbWUoKTsKLSAgICAgICAgUmVjdGFuZ2xlIGltZUNvbnRlbnRJbnNldHMgPSBpbWVXaW5TdGF0ZS5nZXRHaXZlbkNvbnRlbnRJbnNldHMoKTsKLSAgICAgICAgUmVjdGFuZ2xlIGltZUJvdW5kcyA9IG5ldyBSZWN0YW5nbGUoaW1lQ29udGVudEZyYW1lLnggKyBpbWVDb250ZW50SW5zZXRzLngsCi0gICAgICAgICAgICAgICAgaW1lQ29udGVudEZyYW1lLnkgKyBpbWVDb250ZW50SW5zZXRzLnksCi0gICAgICAgICAgICAgICAgaW1lQ29udGVudEZyYW1lLndpZHRoIC0gaW1lQ29udGVudEluc2V0cy53aWR0aCwKLSAgICAgICAgICAgICAgICBpbWVDb250ZW50RnJhbWUuaGVpZ2h0IC0gaW1lQ29udGVudEluc2V0cy5oZWlnaHQpOwotICAgICAgICB3bVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlKTsKLSAgICAgICAgUmVjdGFuZ2xlIHBpcE1vdmVtZW50Qm91bmRzID0gd21TdGF0ZS5nZXRQaW5uZWRTdGFja01vbWVudEJvdW5kcygpOwotICAgICAgICBhc3NlcnRUcnVlKCFwaXBNb3ZlbWVudEJvdW5kcy5pbnRlcnNlY3RzKGltZUJvdW5kcykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFzc2VydHMgdGhhdCB0aGUgcGlubmVkIHN0YWNrIGJvdW5kcyBpcyBjb250YWluZWQgaW4gdGhlIGRpc3BsYXkgYm91bmRzLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRQaW5uZWRTdGFja0FjdGl2aXR5SXNJbkRpc3BsYXlCb3VuZHMoU3RyaW5nIGFjdGl2aXR5KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgV2luZG93TWFuYWdlclN0YXRlLldpbmRvd1N0YXRlIHdpbmRvd1N0YXRlID0gZ2V0V2luZG93U3RhdGUoYWN0aXZpdHkpOwotICAgICAgICBmaW5hbCBXaW5kb3dNYW5hZ2VyU3RhdGUuRGlzcGxheSBkaXNwbGF5ID0gbUFtV21TdGF0ZS5nZXRXbVN0YXRlKCkuZ2V0RGlzcGxheSgKLSAgICAgICAgICAgICAgICB3aW5kb3dTdGF0ZS5nZXREaXNwbGF5SWQoKSk7Ci0gICAgICAgIGZpbmFsIFJlY3RhbmdsZSBkaXNwbGF5UmVjdCA9IGRpc3BsYXkuZ2V0RGlzcGxheVJlY3QoKTsKLSAgICAgICAgZmluYWwgUmVjdGFuZ2xlIHBpbm5lZFN0YWNrQm91bmRzID0KLSAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja0J5SWQoUElOTkVEX1NUQUNLX0lEKS5nZXRCb3VuZHMoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShkaXNwbGF5UmVjdC5jb250YWlucyhwaW5uZWRTdGFja0JvdW5kcykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFzc2VydHMgdGhhdCB0aGUgcGlubmVkIHN0YWNrIGV4aXN0cy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0UGlubmVkU3RhY2tFeGlzdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRDb250YWluc1N0YWNrKCJNdXN0IGNvbnRhaW4gcGlubmVkIHN0YWNrLiIsIFBJTk5FRF9TVEFDS19JRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXNzZXJ0cyB0aGF0IHRoZSBwaW5uZWQgc3RhY2sgZG9lcyBub3QgZXhpc3QuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydFBpbm5lZFN0YWNrRG9lc05vdEV4aXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0RG9lc05vdENvbnRhaW5TdGFjaygiTXVzdCBub3QgY29udGFpbiBwaW5uZWQgc3RhY2suIiwgUElOTkVEX1NUQUNLX0lEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBc3NlcnRzIHRoYXQgdGhlIHBpbm5lZCBzdGFjayBpcyB0aGUgZnJvbnQgc3RhY2suCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydFBpbm5lZFN0YWNrSXNPblRvcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZyb250U3RhY2soIlBpbm5lZCBzdGFjayBtdXN0IGFsd2F5cyBiZSBvbiB0b3AuIiwgUElOTkVEX1NUQUNLX0lEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBc3NlcnRzIHRoYXQgdGhlIGFjdGl2aXR5IHJlY2VpdmVkIGV4YWN0bHkgb25lIG9mIGVhY2ggb2YgdGhlIGNhbGxiYWNrcyB3aGVuIGVudGVyaW5nIGFuZAotICAgICAqIGV4aXRpbmcgcGljdHVyZS1pbi1waWN0dXJlLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRWYWxpZFBpY3R1cmVJblBpY3R1cmVDYWxsYmFja09yZGVyKFN0cmluZyBhY3Rpdml0eU5hbWUsIFN0cmluZyBsb2dTZXBhcmF0b3IpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgQWN0aXZpdHlMaWZlY3ljbGVDb3VudHMgbGlmZWN5Y2xlQ291bnRzID0gbmV3IEFjdGl2aXR5TGlmZWN5Y2xlQ291bnRzKGFjdGl2aXR5TmFtZSwKLSAgICAgICAgICAgICAgICBsb2dTZXBhcmF0b3IpOwotCi0gICAgICAgIGlmIChsaWZlY3ljbGVDb3VudHMubUNvbmZpZ3VyYXRpb25DaGFuZ2VkQ291bnQgIT0gMSkgewotICAgICAgICAgICAgZmFpbChhY3Rpdml0eU5hbWUgKyAiIGhhcyByZWNlaXZlZCAiICsgbGlmZWN5Y2xlQ291bnRzLm1Db25maWd1cmF0aW9uQ2hhbmdlZENvdW50Ci0gICAgICAgICAgICAgICAgICAgICsgIiBvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKCkgY2FsbHMsIGV4cGVjdGluZyAxIik7Ci0gICAgICAgIH0gZWxzZSBpZiAobGlmZWN5Y2xlQ291bnRzLm1QaWN0dXJlSW5QaWN0dXJlTW9kZUNoYW5nZWRDb3VudCAhPSAxKSB7Ci0gICAgICAgICAgICBmYWlsKGFjdGl2aXR5TmFtZSArICIgaGFzIHJlY2VpdmVkICIgKyBsaWZlY3ljbGVDb3VudHMubVBpY3R1cmVJblBpY3R1cmVNb2RlQ2hhbmdlZENvdW50Ci0gICAgICAgICAgICAgICAgICAgICsgIiBvblBpY3R1cmVJblBpY3R1cmVNb2RlQ2hhbmdlZCgpIGNhbGxzLCBleHBlY3RpbmcgMSIpOwotICAgICAgICB9IGVsc2UgaWYgKGxpZmVjeWNsZUNvdW50cy5tTXVsdGlXaW5kb3dNb2RlQ2hhbmdlZENvdW50ICE9IDEpIHsKLSAgICAgICAgICAgIGZhaWwoYWN0aXZpdHlOYW1lICsgIiBoYXMgcmVjZWl2ZWQgIiArIGxpZmVjeWNsZUNvdW50cy5tTXVsdGlXaW5kb3dNb2RlQ2hhbmdlZENvdW50Ci0gICAgICAgICAgICAgICAgICAgICsgIiBvbk11bHRpV2luZG93TW9kZUNoYW5nZWQoKSBjYWxscywgZXhwZWN0aW5nIDEiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludCBsYXN0UGlwTGluZSA9IGxpZmVjeWNsZUNvdW50cy5tTGFzdFBpY3R1cmVJblBpY3R1cmVNb2RlQ2hhbmdlZExpbmVJbmRleDsKLSAgICAgICAgICAgIGludCBsYXN0TXdMaW5lID0gbGlmZWN5Y2xlQ291bnRzLm1MYXN0TXVsdGlXaW5kb3dNb2RlQ2hhbmdlZExpbmVJbmRleDsKLSAgICAgICAgICAgIGludCBsYXN0Q29uZmlnTGluZSA9IGxpZmVjeWNsZUNvdW50cy5tTGFzdENvbmZpZ3VyYXRpb25DaGFuZ2VkTGluZUluZGV4OwotICAgICAgICAgICAgaWYgKCEobGFzdFBpcExpbmUgPCBsYXN0TXdMaW5lICYmIGxhc3RNd0xpbmUgPCBsYXN0Q29uZmlnTGluZSkpIHsKLSAgICAgICAgICAgICAgICBmYWlsKGFjdGl2aXR5TmFtZSArICIgaGFzIHJlY2VpdmVkIGNhbGxiYWNrcyBpbiB1bmV4cGVjdGVkIG9yZGVyLiAgRXhwZWN0ZWQ6IgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHBpcCA8IG13IDwgY29uZmlnIGNoYW5nZSwgYnV0IGdvdCBsaW5lIGluZGljZXM6ICIgKyBsYXN0UGlwTGluZSArICIsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbGFzdE13TGluZSArICIsICIgKyBsYXN0Q29uZmlnTGluZSArICIgcmVzcGVjdGl2ZWx5Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXYWl0cyB1bnRpbCB0aGUgZXhwZWN0ZWQgcGljdHVyZS1pbi1waWN0dXJlIGNhbGxiYWNrcyBoYXZlIGJlZW4gbWFkZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgd2FpdEZvclZhbGlkUGljdHVyZUluUGljdHVyZUNhbGxiYWNrcyhTdHJpbmcgYWN0aXZpdHlOYW1lLCBTdHJpbmcgbG9nU2VwYXJhdG9yKQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1BbVdtU3RhdGUud2FpdEZvcihtRGV2aWNlLCAoYW1TdGF0ZSwgd21TdGF0ZSkgLT4gewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBmaW5hbCBBY3Rpdml0eUxpZmVjeWNsZUNvdW50cyBsaWZlY3ljbGVDb3VudHMgPSBuZXcgQWN0aXZpdHlMaWZlY3ljbGVDb3VudHMoCi0gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eU5hbWUsIGxvZ1NlcGFyYXRvcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGxpZmVjeWNsZUNvdW50cy5tQ29uZmlndXJhdGlvbkNoYW5nZWRDb3VudCA9PSAxICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBsaWZlY3ljbGVDb3VudHMubVBpY3R1cmVJblBpY3R1cmVNb2RlQ2hhbmdlZENvdW50ID09IDEgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpZmVjeWNsZUNvdW50cy5tTXVsdGlXaW5kb3dNb2RlQ2hhbmdlZENvdW50ID09IDE7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSwgIldhaXRpbmcgZm9yIHBpY3R1cmUtaW4tcGljdHVyZSBhY3Rpdml0eSBjYWxsYmFja3MuLi4iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSB3aW5kb3cgc3RhdGUgZm9yIHRoZSBnaXZlbiB7QHBhcmFtIGFjdGl2aXR5fSdzIHdpbmRvdy4KLSAgICAgKi8KLSAgICBwcml2YXRlIFdpbmRvd01hbmFnZXJTdGF0ZS5XaW5kb3dTdGF0ZSBnZXRXaW5kb3dTdGF0ZShTdHJpbmcgYWN0aXZpdHkpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgd2luZG93TmFtZSA9IGdldFdpbmRvd05hbWUoYWN0aXZpdHkpOwotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCBuZXcgU3RyaW5nW10ge2FjdGl2aXR5fSk7Ci0gICAgICAgIGZpbmFsIExpc3Q8V2luZG93TWFuYWdlclN0YXRlLldpbmRvd1N0YXRlPiB0ZW1wV2luZG93TGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBtQW1XbVN0YXRlLmdldFdtU3RhdGUoKS5nZXRNYXRjaGluZ1Zpc2libGVXaW5kb3dTdGF0ZSh3aW5kb3dOYW1lLCB0ZW1wV2luZG93TGlzdCk7Ci0gICAgICAgIHJldHVybiB0ZW1wV2luZG93TGlzdC5nZXQoMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcGFyZXMgdHdvIGZsb2F0cyB3aXRoIGEgY29tbW9uIGVwc2lsb24uCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGZsb2F0RXF1YWxzKGZsb2F0IGYxLCBmbG9hdCBmMikgewotICAgICAgICByZXR1cm4gTWF0aC5hYnMoZjEgLSBmMikgPCBGTE9BVF9DT01QQVJFX0VQU0lMT047Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJpZ2dlcnMgYSB0YXAgb3ZlciB0aGUgcGlubmVkIHN0YWNrIGJvdW5kcyB0byB0cmlnZ2VyIHRoZSBQSVAgdG8gY2xvc2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHRhcFRvRmluaXNoUGlwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFJlY3RhbmdsZSBwaW5uZWRTdGFja0JvdW5kcyA9Ci0gICAgICAgICAgICAgICAgbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0U3RhY2tCeUlkKFBJTk5FRF9TVEFDS19JRCkuZ2V0Qm91bmRzKCk7Ci0gICAgICAgIGludCB0YXBYID0gcGlubmVkU3RhY2tCb3VuZHMueCArIHBpbm5lZFN0YWNrQm91bmRzLndpZHRoIC0gMTAwOwotICAgICAgICBpbnQgdGFwWSA9IHBpbm5lZFN0YWNrQm91bmRzLnkgKyBwaW5uZWRTdGFja0JvdW5kcy5oZWlnaHQgLSAxMDA7Ci0gICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoU3RyaW5nLmZvcm1hdCgiaW5wdXQgdGFwICVkICVkIiwgdGFwWCwgdGFwWSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExhdW5jaGVzIHRoZSBnaXZlbiB7QHBhcmFtIGFjdGl2aXR5TmFtZX0gaW50byB0aGUge0BwYXJhbSB0YXNrSWR9IGFzIGEgdGFzayBvdmVybGF5LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBsYXVuY2hBY3Rpdml0eUFzVGFza092ZXJsYXkoU3RyaW5nIGFjdGl2aXR5TmFtZSwgaW50IHRhc2tJZCwgaW50IHN0YWNrSWQpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChnZXRBbVN0YXJ0Q21kKGFjdGl2aXR5TmFtZSkgKyAiIC0tdGFzayAiICsgdGFza0lkICsgIiAtLXRhc2stb3ZlcmxheSIpOwotCi0gICAgICAgIG1BbVdtU3RhdGUud2FpdEZvclZhbGlkU3RhdGUobURldmljZSwgYWN0aXZpdHlOYW1lLCBzdGFja0lkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGFuIGFwcC1vcHMgb3AgZm9yIGEgZ2l2ZW4gcGFja2FnZSB0byBhIGdpdmVuIG1vZGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldEFwcE9wc09wVG9Nb2RlKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIG9wLCBpbnQgbW9kZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoU3RyaW5nLmZvcm1hdCgiYXBwb3BzIHNldCAlcyAlcyAlZCIsIHBhY2thZ2VOYW1lLCBvcCwgbW9kZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRyaWdnZXJzIHRoZSB3aW5kb3cga2V5Y29kZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcHJlc3NXaW5kb3dCdXR0b24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChJTlBVVF9LRVlFVkVOVF9XSU5ET1cpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRPRE86IEltcHJvdmUgdGVzdHMgY2hlY2sgdG8gYWN0dWFsbHkgY2hlY2sgdGhhdCBhcHBzIGFyZSBub3QgaW50ZXJhY3RpdmUgaW5zdGVhZCBvZiBjaGVja2luZwotICAgICAqICAgICAgIGlmIHRoZSBzdGFjayBpcyBmb2N1c2VkLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwaW5uZWRTdGFja1Rlc3RlcihTdHJpbmcgc3RhcnRBY3Rpdml0eUNtZCwgU3RyaW5nIHRvcEFjdGl2aXR5TmFtZSwKLSAgICAgICAgICAgIGJvb2xlYW4gbW92ZVRvcFRvUGlubmVkU3RhY2ssIGJvb2xlYW4gaXNGb2N1c2FibGUpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoc3RhcnRBY3Rpdml0eUNtZCk7Ci0gICAgICAgIGlmIChtb3ZlVG9wVG9QaW5uZWRTdGFjaykgewotICAgICAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChBTV9NT1ZFX1RPUF9BQ1RJVklUWV9UT19QSU5ORURfU1RBQ0tfQ09NTUFORCk7Ci0gICAgICAgIH0KLQotICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JWYWxpZFN0YXRlKG1EZXZpY2UsIHRvcEFjdGl2aXR5TmFtZSwgUElOTkVEX1NUQUNLX0lEKTsKLSAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwgbnVsbCk7Ci0KLSAgICAgICAgaWYgKHN1cHBvcnRzUGlwKCkpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyB3aW5kb3dOYW1lID0gZ2V0V2luZG93TmFtZSh0b3BBY3Rpdml0eU5hbWUpOwotICAgICAgICAgICAgYXNzZXJ0UGlubmVkU3RhY2tFeGlzdHMoKTsKLSAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0RnJvbnRTdGFjaygiUGlubmVkIHN0YWNrIG11c3QgYmUgdGhlIGZyb250IHN0YWNrLiIsIFBJTk5FRF9TVEFDS19JRCk7Ci0gICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkodG9wQWN0aXZpdHlOYW1lLCB0cnVlKTsKLQotICAgICAgICAgICAgaWYgKGlzRm9jdXNhYmxlKSB7Ci0gICAgICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkU3RhY2soCi0gICAgICAgICAgICAgICAgICAgICAgICAiUGlubmVkIHN0YWNrIG11c3QgYmUgdGhlIGZvY3VzZWQgc3RhY2suIiwgUElOTkVEX1NUQUNLX0lEKTsKLSAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRBY3Rpdml0eSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJQaW5uZWQgYWN0aXZpdHkgbXVzdCBiZSBmb2N1c2VkIGFjdGl2aXR5LiIsIHRvcEFjdGl2aXR5TmFtZSk7Ci0gICAgICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkV2luZG93KAotICAgICAgICAgICAgICAgICAgICAgICAgIlBpbm5lZCB3aW5kb3cgbXVzdCBiZSBmb2N1c2VkIHdpbmRvdy4iLCB3aW5kb3dOYW1lKTsKLSAgICAgICAgICAgICAgICAvLyBOb3QgY2hlY2tpbmcgZm9yIHJlc3VtZWQgc3RhdGUgaGVyZSBiZWNhdXNlIFBpUCBvdmVybGF5IGNhbiBiZSBsYXVuY2hlZCBvbiB0b3AKLSAgICAgICAgICAgICAgICAvLyBpbiBkaWZmZXJlbnQgdGFzayBieSBTeXN0ZW1VSS4KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gRG9uJ3QgYXNzZXJ0IHRoYXQgdGhlIHN0YWNrIGlzIG5vdCBmb2N1c2VkIGFzIGEgZm9jdXNhYmxlIFBpUCBvdmVybGF5IGNhbiBiZQotICAgICAgICAgICAgICAgIC8vIGxhdW5jaGVkIG9uIHRvcCBhcyBhIHRhc2sgb3ZlcmxheSBieSBTeXN0ZW1VSS4KLSAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydE5vdEZvY3VzZWRBY3Rpdml0eSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJQaW5uZWQgYWN0aXZpdHkgY2FuJ3QgYmUgdGhlIGZvY3VzZWQgYWN0aXZpdHkuIiwgdG9wQWN0aXZpdHlOYW1lKTsKLSAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydE5vdFJlc3VtZWRBY3Rpdml0eSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJQaW5uZWQgYWN0aXZpdHkgY2FuJ3QgYmUgdGhlIHJlc3VtZWQgYWN0aXZpdHkuIiwgdG9wQWN0aXZpdHlOYW1lKTsKLSAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydE5vdEZvY3VzZWRXaW5kb3coCi0gICAgICAgICAgICAgICAgICAgICAgICAiUGlubmVkIHdpbmRvdyBjYW4ndCBiZSBmb2N1c2VkIHdpbmRvdy4iLCB3aW5kb3dOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0RG9lc05vdENvbnRhaW5TdGFjaygKLSAgICAgICAgICAgICAgICAgICAgIk11c3Qgbm90IGNvbnRhaW4gcGlubmVkIHN0YWNrLiIsIFBJTk5FRF9TVEFDS19JRCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9BY3Rpdml0eU1hbmFnZXJSZXBsYWNlV2luZG93VGVzdHMuamF2YSBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0FjdGl2aXR5TWFuYWdlclJlcGxhY2VXaW5kb3dUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWEzY2UwLi4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0FjdGl2aXR5TWFuYWdlclJlcGxhY2VXaW5kb3dUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuc2VydmVyLmN0czsKLQotaW1wb3J0IGphdmEubGFuZy5FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLlN0cmluZzsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci0KLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuZGRtbGliLkxvZy5Mb2dMZXZlbC5JTkZPOwotCi1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLkRldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5sb2cuTG9nVXRpbC5DTG9nOwotCi0vKioKLSAqIEJ1aWxkOiBtbW1hIC1qMzIgY3RzL2hvc3RzaWRldGVzdHMvc2VydmljZXMKLSAqIFJ1bjogY3RzL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL3V0aWwvcnVuLXRlc3QgQ3RzU2VydmljZXNIb3N0VGVzdENhc2VzIGFuZHJvaWQuc2VydmVyLmN0cy5BY3Rpdml0eU1hbmFnZXJSZXBsYWNlV2luZG93VGVzdHMKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5TWFuYWdlclJlcGxhY2VXaW5kb3dUZXN0cyBleHRlbmRzIEFjdGl2aXR5TWFuYWdlclRlc3RCYXNlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTTE9XX0NSRUFURV9BQ1RJVklUWV9OQU1FID0gIlNsb3dDcmVhdGVBY3Rpdml0eSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PX1JFTEFVTkNIX0FDVElWSVRZX05BTUUgPSAiTm9SZWxhdW5jaEFjdGl2aXR5IjsKLQotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1UZW1wV2luZG93VG9rZW5zID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlcGxhY2VXaW5kb3dfRG9ja19SZWxhdW5jaCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0UmVwbGFjZVdpbmRvd19Eb2NrKHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlV2luZG93X0RvY2tfTm9SZWxhdW5jaCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0UmVwbGFjZVdpbmRvd19Eb2NrKGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdFJlcGxhY2VXaW5kb3dfRG9jayhib29sZWFuIHJlbGF1bmNoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0c1NwbGl0U2NyZWVuTXVsdGlXaW5kb3coKSkgewotICAgICAgICAgICAgQ0xvZy5sb2dBbmREaXNwbGF5KElORk8sICJTa2lwcGluZyB0ZXN0OiBubyBtdWx0aS13aW5kb3cgc3VwcG9ydCIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIGFjdGl2aXR5TmFtZSA9Ci0gICAgICAgICAgICAgICAgcmVsYXVuY2ggPyBTTE9XX0NSRUFURV9BQ1RJVklUWV9OQU1FIDogTk9fUkVMQVVOQ0hfQUNUSVZJVFlfTkFNRTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHdpbmRvd05hbWUgPSBnZXRXaW5kb3dOYW1lKGFjdGl2aXR5TmFtZSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBhbVN0YXJ0Q21kID0gZ2V0QW1TdGFydENtZChhY3Rpdml0eU5hbWUpOwotCi0gICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoYW1TdGFydENtZCk7Ci0KLSAgICAgICAgLy8gU2xlZXAgMiBzZWNvbmRzLCB0aGVuIGNoZWNrIGlmIHRoZSB3aW5kb3cgaXMgc3RhcnRlZCBwcm9wZXJseS4KLSAgICAgICAgLy8gU2xvd0NyZWF0ZUFjdGl2aXR5IHdpbGwgZG8gYSBzbGVlcCBpbnNpZGUgaXRzIG9uQ3JlYXRlKCkgdG8gc2ltdWxhdGUgYQotICAgICAgICAvLyBzbG93LXN0YXJ0aW5nIGFwcC4gU28gaW5zdGVhZCBvZiByZWx5aW5nIG9uIFdpbmRvd01hbmFnZXJTdGF0ZSdzCi0gICAgICAgIC8vIHJldHJ5aW5nIG1lY2hhbmlzbSwgd2UgZG8gYW4gZXhwbGljaXQgc2xlZXAgdG8gYXZvaWQgZXhjZXNzIHNwZXdzCi0gICAgICAgIC8vIGZyb20gV2luZG93TWFuYWdlclN0YXRlLgotICAgICAgICBpZiAoU0xPV19DUkVBVEVfQUNUSVZJVFlfTkFNRS5lcXVhbHMoYWN0aXZpdHlOYW1lKSkgewotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDIwMDApOwotICAgICAgICB9Ci0KLSAgICAgICAgQ0xvZy5sb2dBbmREaXNwbGF5KElORk8sICI9PT09PT09PT09QmVmb3JlIERvY2tpbmc9PT09PT09PSIpOwotICAgICAgICBmaW5hbCBTdHJpbmcgb2xkVG9rZW4gPSBnZXRXaW5kb3dUb2tlbih3aW5kb3dOYW1lLCBhY3Rpdml0eU5hbWUpOwotCi0gICAgICAgIC8vIE1vdmUgdG8gZG9ja2VkIHN0YWNrCi0gICAgICAgIGZpbmFsIGludCB0YXNrSWQgPSBnZXRBY3Rpdml0eVRhc2tJZChhY3Rpdml0eU5hbWUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgY21kID0gQU1fTU9WRV9UQVNLICsgdGFza0lkICsgIiAiICsgRE9DS0VEX1NUQUNLX0lEICsgIiB0cnVlIjsKLSAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChjbWQpOwotCi0gICAgICAgIC8vIFNsZWVwIDUgc2Vjb25kcywgdGhlbiBjaGVjayBpZiB0aGUgd2luZG93IGlzIHJlcGxhY2VkIHByb3Blcmx5LgotICAgICAgICBUaHJlYWQuc2xlZXAoNTAwMCk7Ci0KLSAgICAgICAgQ0xvZy5sb2dBbmREaXNwbGF5KElORk8sICI9PT09PT09PT09QWZ0ZXIgRG9ja2luZz09PT09PT09Iik7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBuZXdUb2tlbiA9IGdldFdpbmRvd1Rva2VuKHdpbmRvd05hbWUsIGFjdGl2aXR5TmFtZSk7Ci0KLSAgICAgICAgLy8gRm9yIGJvdGggcmVsYXVuY2ggYW5kIG5vdCByZWxhdW5jaCBjYXNlLCB3ZSdkIGxpa2UgdGhlIHdpbmRvdyB0byBiZSBrZXB0LgotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJXaW5kb3cgcmVwbGFjZWQgd2hpbGUgZG9ja2luZy4iLCBvbGRUb2tlbiwgbmV3VG9rZW4pOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldFdpbmRvd1Rva2VuKFN0cmluZyB3aW5kb3dOYW1lLCBTdHJpbmcgYWN0aXZpdHlOYW1lKQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIG5ldyBTdHJpbmdbXSB7YWN0aXZpdHlOYW1lfSk7Ci0KLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KGFjdGl2aXR5TmFtZSwgdHJ1ZSk7Ci0KLSAgICAgICAgbUFtV21TdGF0ZS5nZXRXbVN0YXRlKCkuZ2V0TWF0Y2hpbmdXaW5kb3dUb2tlbnMod2luZG93TmFtZSwgbVRlbXBXaW5kb3dUb2tlbnMpOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIlNob3VsZCBoYXZlIGV4YWN0bHkgb25lIHdpbmRvdyBmb3IgdGhlIGFjdGl2aXR5LiIsCi0gICAgICAgICAgICAgICAgMSwgbVRlbXBXaW5kb3dUb2tlbnMuc2l6ZSgpKTsKLQotICAgICAgICByZXR1cm4gbVRlbXBXaW5kb3dUb2tlbnMuZ2V0KDApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0FjdGl2aXR5TWFuYWdlclRyYW5zaXRpb25TZWxlY3Rpb25UZXN0cy5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvQWN0aXZpdHlNYW5hZ2VyVHJhbnNpdGlvblNlbGVjdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzYWExYWIuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvQWN0aXZpdHlNYW5hZ2VyVHJhbnNpdGlvblNlbGVjdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuY3RzOwotCi1pbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlByZXN1Ym1pdDsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5jdHMuV2luZG93TWFuYWdlclN0YXRlLlRSQU5TSVRfQUNUSVZJVFlfQ0xPU0U7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmN0cy5XaW5kb3dNYW5hZ2VyU3RhdGUuVFJBTlNJVF9BQ1RJVklUWV9PUEVOOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5jdHMuV2luZG93TWFuYWdlclN0YXRlLlRSQU5TSVRfVEFTS19DTE9TRTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuY3RzLldpbmRvd01hbmFnZXJTdGF0ZS5UUkFOU0lUX1RBU0tfT1BFTjsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuY3RzLldpbmRvd01hbmFnZXJTdGF0ZS5UUkFOU0lUX1dBTExQQVBFUl9DTE9TRTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuY3RzLldpbmRvd01hbmFnZXJTdGF0ZS5UUkFOU0lUX1dBTExQQVBFUl9JTlRSQV9DTE9TRTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuY3RzLldpbmRvd01hbmFnZXJTdGF0ZS5UUkFOU0lUX1dBTExQQVBFUl9JTlRSQV9PUEVOOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5jdHMuV2luZG93TWFuYWdlclN0YXRlLlRSQU5TSVRfV0FMTFBBUEVSX09QRU47Ci0KLS8qKgotICogVGhpcyB0ZXN0IHRlc3RzIHRoZSB0cmFuc2l0aW9uIHR5cGUgc2VsZWN0aW9uIGxvZ2ljIGluIEFjdGl2aXR5TWFuYWdlci8KLSAqIFdpbmRvd01hbmFnZXIuIEJvdHRvbUFjdGl2aXR5IGlzIHN0YXJ0ZWQgZmlyc3QsIHRoZW4gVG9wQWN0aXZpdHksIGFuZCB3ZQotICogY2hlY2sgdGhlIHRyYW5zaXRpb24gdHlwZSB0aGF0IHRoZSBzeXN0ZW0gc2VsZWN0cyB3aGVuIFRvcEFjdGl2aXR5IGVudGVycwotICogb3IgZXhpdHMgdW5kZXIgdmFyaW91cyBzZXR1cHMuCi0gKgotICogTm90ZSB0aGF0IHdlIG9ubHkgcmVxdWlyZSB0aGUgY29ycmVjdCB0cmFuc2l0aW9uIHR5cGUgdG8gYmUgcmVwb3J0ZWQgKGVnLgotICogVFJBTlNJVF9BQ1RJVklUWV9PUEVOLCBUUkFOU0lUX1RBU0tfQ0xPU0UsIFRSQU5TSVRfV0FMTFBBUEVSX09QRU4sIGV0Yy4pLgotICogVGhlIGV4YWN0IGFuaW1hdGlvbiBpcyB1bnNwZWNpZmllZCBhbmQgY2FuIGJlIG92ZXJyaWRkZW4uCi0gKgotICogQnVpbGQ6IG1tbWEgLWozMiBjdHMvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcwotICogUnVuOiBjdHMvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvdXRpbC9ydW4tdGVzdCBDdHNTZXJ2aWNlc0hvc3RUZXN0Q2FzZXMgYW5kcm9pZC5zZXJ2ZXIuY3RzLkFjdGl2aXR5TWFuYWdlclRyYW5zaXRpb25TZWxlY3Rpb25UZXN0cwotICovCi1AUHJlc3VibWl0Ci1wdWJsaWMgY2xhc3MgQWN0aXZpdHlNYW5hZ2VyVHJhbnNpdGlvblNlbGVjdGlvblRlc3RzIGV4dGVuZHMgQWN0aXZpdHlNYW5hZ2VyVGVzdEJhc2UgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJPVFRPTV9BQ1RJVklUWV9OQU1FID0gIkJvdHRvbUFjdGl2aXR5IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QX0FDVElWSVRZX05BTUUgPSAiVG9wQWN0aXZpdHkiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFOU0xVQ0VOVF9UT1BfQUNUSVZJVFlfTkFNRSA9ICJUcmFuc2x1Y2VudFRvcEFjdGl2aXR5IjsKLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KLQotICAgIC8vIFRlc3QgYWN0aXZpdHkgb3Blbi9jbG9zZSB1bmRlciBub3JtYWwgdGltaW5nCi0gICAgcHVibGljIHZvaWQgdGVzdE9wZW5BY3Rpdml0eV9OZWl0aGVyV2FsbHBhcGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RPcGVuQWN0aXZpdHkoZmFsc2UgLypib3R0b21XYWxscGFwZXIqLywgZmFsc2UgLyp0b3BXYWxscGFwZXIqLywKLSAgICAgICAgICAgICAgICBmYWxzZSAvKnNsb3dTdG9wKi8sIFRSQU5TSVRfQUNUSVZJVFlfT1BFTik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENsb3NlQWN0aXZpdHlfTmVpdGhlcldhbGxwYXBlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0Q2xvc2VBY3Rpdml0eShmYWxzZSAvKmJvdHRvbVdhbGxwYXBlciovLCBmYWxzZSAvKnRvcFdhbGxwYXBlciovLAotICAgICAgICAgICAgICAgIGZhbHNlIC8qc2xvd1N0b3AqLywgVFJBTlNJVF9BQ1RJVklUWV9DTE9TRSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE9wZW5BY3Rpdml0eV9Cb3R0b21XYWxscGFwZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdE9wZW5BY3Rpdml0eSh0cnVlIC8qYm90dG9tV2FsbHBhcGVyKi8sIGZhbHNlIC8qdG9wV2FsbHBhcGVyKi8sCi0gICAgICAgICAgICAgICAgZmFsc2UgLypzbG93U3RvcCovLCBUUkFOU0lUX1dBTExQQVBFUl9DTE9TRSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENsb3NlQWN0aXZpdHlfQm90dG9tV2FsbHBhcGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RDbG9zZUFjdGl2aXR5KHRydWUgLypib3R0b21XYWxscGFwZXIqLywgZmFsc2UgLyp0b3BXYWxscGFwZXIqLywKLSAgICAgICAgICAgICAgICBmYWxzZSAvKnNsb3dTdG9wKi8sIFRSQU5TSVRfV0FMTFBBUEVSX09QRU4pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RPcGVuQWN0aXZpdHlfQm90aFdhbGxwYXBlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0T3BlbkFjdGl2aXR5KHRydWUgLypib3R0b21XYWxscGFwZXIqLywgdHJ1ZSAvKnRvcFdhbGxwYXBlciovLAotICAgICAgICAgICAgICAgIGZhbHNlIC8qc2xvd1N0b3AqLywgVFJBTlNJVF9XQUxMUEFQRVJfSU5UUkFfT1BFTik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENsb3NlQWN0aXZpdHlfQm90aFdhbGxwYXBlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0Q2xvc2VBY3Rpdml0eSh0cnVlIC8qYm90dG9tV2FsbHBhcGVyKi8sIHRydWUgLyp0b3BXYWxscGFwZXIqLywKLSAgICAgICAgICAgICAgICBmYWxzZSAvKnNsb3dTdG9wKi8sIFRSQU5TSVRfV0FMTFBBUEVSX0lOVFJBX0NMT1NFKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCi0KLSAgICAvLyBUZXN0IHRhc2sgb3Blbi9jbG9zZSB1bmRlciBub3JtYWwgdGltaW5nCi0gICAgcHVibGljIHZvaWQgdGVzdE9wZW5UYXNrX05laXRoZXJXYWxscGFwZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdE9wZW5UYXNrKGZhbHNlIC8qYm90dG9tV2FsbHBhcGVyKi8sIGZhbHNlIC8qdG9wV2FsbHBhcGVyKi8sCi0gICAgICAgICAgICAgICAgZmFsc2UgLypzbG93U3RvcCovLCBUUkFOU0lUX1RBU0tfT1BFTik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENsb3NlVGFza19OZWl0aGVyV2FsbHBhcGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RDbG9zZVRhc2soZmFsc2UgLypib3R0b21XYWxscGFwZXIqLywgZmFsc2UgLyp0b3BXYWxscGFwZXIqLywKLSAgICAgICAgICAgICAgICBmYWxzZSAvKnNsb3dTdG9wKi8sIFRSQU5TSVRfVEFTS19DTE9TRSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE9wZW5UYXNrX0JvdHRvbVdhbGxwYXBlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0T3BlblRhc2sodHJ1ZSAvKmJvdHRvbVdhbGxwYXBlciovLCBmYWxzZSAvKnRvcFdhbGxwYXBlciovLAotICAgICAgICAgICAgICAgIGZhbHNlIC8qc2xvd1N0b3AqLywgVFJBTlNJVF9XQUxMUEFQRVJfQ0xPU0UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9zZVRhc2tfQm90dG9tV2FsbHBhcGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RDbG9zZVRhc2sodHJ1ZSAvKmJvdHRvbVdhbGxwYXBlciovLCBmYWxzZSAvKnRvcFdhbGxwYXBlciovLAotICAgICAgICAgICAgICAgIGZhbHNlIC8qc2xvd1N0b3AqLywgVFJBTlNJVF9XQUxMUEFQRVJfT1BFTik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE9wZW5UYXNrX0JvdGhXYWxscGFwZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdE9wZW5UYXNrKHRydWUgLypib3R0b21XYWxscGFwZXIqLywgdHJ1ZSAvKnRvcFdhbGxwYXBlciovLAotICAgICAgICAgICAgICAgIGZhbHNlIC8qc2xvd1N0b3AqLywgVFJBTlNJVF9XQUxMUEFQRVJfSU5UUkFfT1BFTik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENsb3NlVGFza19Cb3RoV2FsbHBhcGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RDbG9zZVRhc2sodHJ1ZSAvKmJvdHRvbVdhbGxwYXBlciovLCB0cnVlIC8qdG9wV2FsbHBhcGVyKi8sCi0gICAgICAgICAgICAgICAgZmFsc2UgLypzbG93U3RvcCovLCBUUkFOU0lUX1dBTExQQVBFUl9JTlRSQV9DTE9TRSk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLwotCi0gICAgLy8gVGVzdCBhY3Rpdml0eSBjbG9zZSAtLSBib3R0b20gYWN0aXZpdHkgc2xvdyBpbiBzdG9wcGluZwotICAgIC8vIFRoZXNlIHNpbXVsYXRlIHRoZSBjYXNlIHdoZXJlIHRoZSBib3R0b20gYWN0aXZpdHkgaXMgcmVzdW1lZAotICAgIC8vIGJlZm9yZSBBTSByZWNlaXZlcyBpdHMgYWN0aXZpdGl5U3RvcHBlZAotICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9zZUFjdGl2aXR5X05laXRoZXJXYWxscGFwZXJfU2xvd1N0b3AoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdENsb3NlQWN0aXZpdHkoZmFsc2UgLypib3R0b21XYWxscGFwZXIqLywgZmFsc2UgLyp0b3BXYWxscGFwZXIqLywKLSAgICAgICAgICAgICAgICB0cnVlIC8qc2xvd1N0b3AqLywgVFJBTlNJVF9BQ1RJVklUWV9DTE9TRSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENsb3NlQWN0aXZpdHlfQm90dG9tV2FsbHBhcGVyX1Nsb3dTdG9wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RDbG9zZUFjdGl2aXR5KHRydWUgLypib3R0b21XYWxscGFwZXIqLywgZmFsc2UgLyp0b3BXYWxscGFwZXIqLywKLSAgICAgICAgICAgICAgICB0cnVlIC8qc2xvd1N0b3AqLywgVFJBTlNJVF9XQUxMUEFQRVJfT1BFTik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENsb3NlQWN0aXZpdHlfQm90aFdhbGxwYXBlcl9TbG93U3RvcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0Q2xvc2VBY3Rpdml0eSh0cnVlIC8qYm90dG9tV2FsbHBhcGVyKi8sIHRydWUgLyp0b3BXYWxscGFwZXIqLywKLSAgICAgICAgICAgICAgICB0cnVlIC8qc2xvd1N0b3AqLywgVFJBTlNJVF9XQUxMUEFQRVJfSU5UUkFfQ0xPU0UpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KLQotICAgIC8vIFRlc3QgdGFzayBjbG9zZSAtLSBib3R0b20gdGFzayB0b3AgYWN0aXZpdHkgc2xvdyBpbiBzdG9wcGluZwotICAgIC8vIFRoZXNlIHNpbXVsYXRlIHRoZSBjYXNlIHdoZXJlIHRoZSBib3R0b20gYWN0aXZpdHkgaXMgcmVzdW1lZAotICAgIC8vIGJlZm9yZSBBTSByZWNlaXZlcyBpdHMgYWN0aXZpdGl5U3RvcHBlZAotICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9zZVRhc2tfTmVpdGhlcldhbGxwYXBlcl9TbG93U3RvcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0Q2xvc2VUYXNrKGZhbHNlIC8qYm90dG9tV2FsbHBhcGVyKi8sIGZhbHNlIC8qdG9wV2FsbHBhcGVyKi8sCi0gICAgICAgICAgICAgICAgdHJ1ZSAvKnNsb3dTdG9wKi8sIFRSQU5TSVRfVEFTS19DTE9TRSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENsb3NlVGFza19Cb3R0b21XYWxscGFwZXJfU2xvd1N0b3AoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdENsb3NlVGFzayh0cnVlIC8qYm90dG9tV2FsbHBhcGVyKi8sIGZhbHNlIC8qdG9wV2FsbHBhcGVyKi8sCi0gICAgICAgICAgICAgICAgdHJ1ZSAvKnNsb3dTdG9wKi8sIFRSQU5TSVRfV0FMTFBBUEVSX09QRU4pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9zZVRhc2tfQm90aFdhbGxwYXBlcl9TbG93U3RvcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0Q2xvc2VUYXNrKHRydWUgLypib3R0b21XYWxscGFwZXIqLywgdHJ1ZSAvKnRvcFdhbGxwYXBlciovLAotICAgICAgICAgICAgICAgIHRydWUgLypzbG93U3RvcCovLCBUUkFOU0lUX1dBTExQQVBFUl9JTlRSQV9DTE9TRSk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLwotCi0gICAgLy8vIFRlc3QgY2xvc2luZyBvZiB0cmFuc2x1Y2VudCBhY3Rpdml0eS90YXNrCi0gICAgcHVibGljIHZvaWQgdGVzdENsb3NlQWN0aXZpdHlfTmVpdGhlcldhbGxwYXBlcl9UcmFuc2x1Y2VudCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0Q2xvc2VBY3Rpdml0eVRyYW5zbHVjZW50KGZhbHNlIC8qYm90dG9tV2FsbHBhcGVyKi8sIGZhbHNlIC8qdG9wV2FsbHBhcGVyKi8sCi0gICAgICAgICAgICAgICAgVFJBTlNJVF9BQ1RJVklUWV9DTE9TRSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENsb3NlQWN0aXZpdHlfQm90dG9tV2FsbHBhcGVyX1RyYW5zbHVjZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RDbG9zZUFjdGl2aXR5VHJhbnNsdWNlbnQodHJ1ZSAvKmJvdHRvbVdhbGxwYXBlciovLCBmYWxzZSAvKnRvcFdhbGxwYXBlciovLAotICAgICAgICAgICAgICAgIFRSQU5TSVRfV0FMTFBBUEVSX09QRU4pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9zZUFjdGl2aXR5X0JvdGhXYWxscGFwZXJfVHJhbnNsdWNlbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdENsb3NlQWN0aXZpdHlUcmFuc2x1Y2VudCh0cnVlIC8qYm90dG9tV2FsbHBhcGVyKi8sIHRydWUgLyp0b3BXYWxscGFwZXIqLywKLSAgICAgICAgICAgICAgICBUUkFOU0lUX1dBTExQQVBFUl9JTlRSQV9DTE9TRSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENsb3NlVGFza19OZWl0aGVyV2FsbHBhcGVyX1RyYW5zbHVjZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RDbG9zZVRhc2tUcmFuc2x1Y2VudChmYWxzZSAvKmJvdHRvbVdhbGxwYXBlciovLCBmYWxzZSAvKnRvcFdhbGxwYXBlciovLAotICAgICAgICAgICAgICAgIFRSQU5TSVRfVEFTS19DTE9TRSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENsb3NlVGFza19Cb3R0b21XYWxscGFwZXJfVHJhbnNsdWNlbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdENsb3NlVGFza1RyYW5zbHVjZW50KHRydWUgLypib3R0b21XYWxscGFwZXIqLywgZmFsc2UgLyp0b3BXYWxscGFwZXIqLywKLSAgICAgICAgICAgICAgICBUUkFOU0lUX1dBTExQQVBFUl9PUEVOKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc2VUYXNrX0JvdGhXYWxscGFwZXJfVHJhbnNsdWNlbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdENsb3NlVGFza1RyYW5zbHVjZW50KHRydWUgLypib3R0b21XYWxscGFwZXIqLywgdHJ1ZSAvKnRvcFdhbGxwYXBlciovLAotICAgICAgICAgICAgICAgIFRSQU5TSVRfV0FMTFBBUEVSX0lOVFJBX0NMT1NFKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCi0KLSAgICBwcml2YXRlIHZvaWQgdGVzdE9wZW5BY3Rpdml0eShib29sZWFuIGJvdHRvbVdhbGxwYXBlciwKLSAgICAgICAgICAgIGJvb2xlYW4gdG9wV2FsbHBhcGVyLCBib29sZWFuIHNsb3dTdG9wLCBTdHJpbmcgZXhwZWN0ZWRUcmFuc2l0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdFRyYW5zaXRpb25TZWxlY3Rpb24odHJ1ZSAvKnRlc3RPcGVuKi8sIGZhbHNlIC8qdGVzdE5ld1Rhc2sqLywKLSAgICAgICAgICAgICAgICBib3R0b21XYWxscGFwZXIsIHRvcFdhbGxwYXBlciwgZmFsc2UgLyp0b3BUcmFuc2x1Y2VudCovLCBzbG93U3RvcCwgZXhwZWN0ZWRUcmFuc2l0KTsKLSAgICB9Ci0gICAgcHJpdmF0ZSB2b2lkIHRlc3RDbG9zZUFjdGl2aXR5KGJvb2xlYW4gYm90dG9tV2FsbHBhcGVyLAotICAgICAgICAgICAgYm9vbGVhbiB0b3BXYWxscGFwZXIsIGJvb2xlYW4gc2xvd1N0b3AsIFN0cmluZyBleHBlY3RlZFRyYW5zaXQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0VHJhbnNpdGlvblNlbGVjdGlvbihmYWxzZSAvKnRlc3RPcGVuKi8sIGZhbHNlIC8qdGVzdE5ld1Rhc2sqLywKLSAgICAgICAgICAgICAgICBib3R0b21XYWxscGFwZXIsIHRvcFdhbGxwYXBlciwgZmFsc2UgLyp0b3BUcmFuc2x1Y2VudCovLCBzbG93U3RvcCwgZXhwZWN0ZWRUcmFuc2l0KTsKLSAgICB9Ci0gICAgcHJpdmF0ZSB2b2lkIHRlc3RPcGVuVGFzayhib29sZWFuIGJvdHRvbVdhbGxwYXBlciwKLSAgICAgICAgICAgIGJvb2xlYW4gdG9wV2FsbHBhcGVyLCBib29sZWFuIHNsb3dTdG9wLCBTdHJpbmcgZXhwZWN0ZWRUcmFuc2l0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdFRyYW5zaXRpb25TZWxlY3Rpb24odHJ1ZSAvKnRlc3RPcGVuKi8sIHRydWUgLyp0ZXN0TmV3VGFzayovLAotICAgICAgICAgICAgICAgIGJvdHRvbVdhbGxwYXBlciwgdG9wV2FsbHBhcGVyLCBmYWxzZSAvKnRvcFRyYW5zbHVjZW50Ki8sIHNsb3dTdG9wLCBleHBlY3RlZFRyYW5zaXQpOwotICAgIH0KLSAgICBwcml2YXRlIHZvaWQgdGVzdENsb3NlVGFzayhib29sZWFuIGJvdHRvbVdhbGxwYXBlciwKLSAgICAgICAgICAgIGJvb2xlYW4gdG9wV2FsbHBhcGVyLCBib29sZWFuIHNsb3dTdG9wLCBTdHJpbmcgZXhwZWN0ZWRUcmFuc2l0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdFRyYW5zaXRpb25TZWxlY3Rpb24oZmFsc2UgLyp0ZXN0T3BlbiovLCB0cnVlIC8qdGVzdE5ld1Rhc2sqLywKLSAgICAgICAgICAgICAgICBib3R0b21XYWxscGFwZXIsIHRvcFdhbGxwYXBlciwgZmFsc2UgLyp0b3BUcmFuc2x1Y2VudCovLCBzbG93U3RvcCwgZXhwZWN0ZWRUcmFuc2l0KTsKLSAgICB9Ci0gICAgcHJpdmF0ZSB2b2lkIHRlc3RDbG9zZUFjdGl2aXR5VHJhbnNsdWNlbnQoYm9vbGVhbiBib3R0b21XYWxscGFwZXIsCi0gICAgICAgICAgICBib29sZWFuIHRvcFdhbGxwYXBlciwgU3RyaW5nIGV4cGVjdGVkVHJhbnNpdCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RUcmFuc2l0aW9uU2VsZWN0aW9uKGZhbHNlIC8qdGVzdE9wZW4qLywgZmFsc2UgLyp0ZXN0TmV3VGFzayovLAotICAgICAgICAgICAgICAgIGJvdHRvbVdhbGxwYXBlciwgdG9wV2FsbHBhcGVyLCB0cnVlIC8qdG9wVHJhbnNsdWNlbnQqLywKLSAgICAgICAgICAgICAgICBmYWxzZSAvKnNsb3dTdG9wKi8sIGV4cGVjdGVkVHJhbnNpdCk7Ci0gICAgfQotICAgIHByaXZhdGUgdm9pZCB0ZXN0Q2xvc2VUYXNrVHJhbnNsdWNlbnQoYm9vbGVhbiBib3R0b21XYWxscGFwZXIsCi0gICAgICAgICAgICBib29sZWFuIHRvcFdhbGxwYXBlciwgU3RyaW5nIGV4cGVjdGVkVHJhbnNpdCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RUcmFuc2l0aW9uU2VsZWN0aW9uKGZhbHNlIC8qdGVzdE9wZW4qLywgdHJ1ZSAvKnRlc3ROZXdUYXNrKi8sCi0gICAgICAgICAgICAgICAgYm90dG9tV2FsbHBhcGVyLCB0b3BXYWxscGFwZXIsIHRydWUgLyp0b3BUcmFuc2x1Y2VudCovLAotICAgICAgICAgICAgICAgIGZhbHNlIC8qc2xvd1N0b3AqLywgZXhwZWN0ZWRUcmFuc2l0KTsKLSAgICB9Ci0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLwotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RUcmFuc2l0aW9uU2VsZWN0aW9uKAotICAgICAgICAgICAgYm9vbGVhbiB0ZXN0T3BlbiwgYm9vbGVhbiB0ZXN0TmV3VGFzaywKLSAgICAgICAgICAgIGJvb2xlYW4gYm90dG9tV2FsbHBhcGVyLCBib29sZWFuIHRvcFdhbGxwYXBlciwgYm9vbGVhbiB0b3BUcmFuc2x1Y2VudCwKLSAgICAgICAgICAgIGJvb2xlYW4gdGVzdFNsb3dTdG9wLCBTdHJpbmcgZXhwZWN0ZWRUcmFuc2l0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGJvdHRvbVN0YXJ0Q21kID0gZ2V0QW1TdGFydENtZChCT1RUT01fQUNUSVZJVFlfTkFNRSk7Ci0gICAgICAgIGlmIChib3R0b21XYWxscGFwZXIpIHsKLSAgICAgICAgICAgIGJvdHRvbVN0YXJ0Q21kICs9ICIgLS1leiBVU0VfV0FMTFBBUEVSIHRydWUiOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0ZXN0U2xvd1N0b3ApIHsKLSAgICAgICAgICAgIGJvdHRvbVN0YXJ0Q21kICs9ICIgLS1laSBTVE9QX0RFTEFZIDMwMDAiOwotICAgICAgICB9Ci0gICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoYm90dG9tU3RhcnRDbWQpOwotCi0gICAgICAgIGZpbmFsIFN0cmluZyB0b3BBY3Rpdml0eU5hbWUgPSB0b3BUcmFuc2x1Y2VudCA/Ci0gICAgICAgICAgICAgICAgVFJBTlNMVUNFTlRfVE9QX0FDVElWSVRZX05BTUUgOiBUT1BfQUNUSVZJVFlfTkFNRTsKLSAgICAgICAgZmluYWwgU3RyaW5nW10gYm90dG9tQWN0aXZpdHlBcnJheSA9IG5ldyBTdHJpbmdbXSB7Qk9UVE9NX0FDVElWSVRZX05BTUV9OwotICAgICAgICBmaW5hbCBTdHJpbmdbXSB0b3BBY3Rpdml0eUFycmF5ID0gbmV3IFN0cmluZ1tdIHt0b3BBY3Rpdml0eU5hbWV9OwotCi0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIGJvdHRvbUFjdGl2aXR5QXJyYXkpOwotCi0gICAgICAgIFN0cmluZyB0b3BTdGFydENtZCA9IGdldEFtU3RhcnRDbWQodG9wQWN0aXZpdHlOYW1lKTsKLSAgICAgICAgaWYgKHRlc3ROZXdUYXNrKSB7Ci0gICAgICAgICAgICB0b3BTdGFydENtZCArPSAiIC1mIDB4MTgwMDAwMDAiOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0b3BXYWxscGFwZXIpIHsKLSAgICAgICAgICAgIHRvcFN0YXJ0Q21kICs9ICIgLS1leiBVU0VfV0FMTFBBUEVSIHRydWUiOwotICAgICAgICB9Ci0gICAgICAgIGlmICghdGVzdE9wZW4pIHsKLSAgICAgICAgICAgIHRvcFN0YXJ0Q21kICs9ICIgLS1laSBGSU5JU0hfREVMQVkgMTAwMCI7Ci0gICAgICAgIH0KLSAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZCh0b3BTdGFydENtZCk7Ci0gICAgICAgIFRocmVhZC5zbGVlcCg1MDAwKTsKLSAgICAgICAgaWYgKHRlc3RPcGVuKSB7Ci0gICAgICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCB0b3BBY3Rpdml0eUFycmF5KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIGJvdHRvbUFjdGl2aXR5QXJyYXkpOwotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJQaWNrZWQgd3JvbmcgdHJhbnNpdGlvbiIsIGV4cGVjdGVkVHJhbnNpdCwKLSAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLmdldFdtU3RhdGUoKS5nZXRMYXN0VHJhbnNpdGlvbigpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9BbmltYXRpb25CYWNrZ3JvdW5kVGVzdHMuamF2YSBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0FuaW1hdGlvbkJhY2tncm91bmRUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWY0YjVkLi4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0FuaW1hdGlvbkJhY2tncm91bmRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuY3RzOwotCi0KLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5jdHMuQWN0aXZpdHlBbmRXaW5kb3dNYW5hZ2Vyc1N0YXRlLkRFRkFVTFRfRElTUExBWV9JRDsKLQotCi0vKioKLSAqIEJ1aWxkOiBtbW1hIC1qMzIgY3RzL2hvc3RzaWRldGVzdHMvc2VydmljZXMKLSAqIFJ1bjogY3RzL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL3V0aWwvcnVuLXRlc3QgQ3RzU2VydmljZXNIb3N0VGVzdENhc2VzIGFuZHJvaWQuc2VydmVyLmN0cy5BbmltYXRpb25CYWNrZ3JvdW5kVGVzdHMKLSAqLwotcHVibGljIGNsYXNzIEFuaW1hdGlvbkJhY2tncm91bmRUZXN0cyBleHRlbmRzIEFjdGl2aXR5TWFuYWdlclRlc3RCYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBbmltYXRpb25CYWNrZ3JvdW5kX2R1cmluZ0FuaW1hdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBsYXVuY2hBY3Rpdml0eU9uRGlzcGxheShMQVVOQ0hJTkdfQUNUSVZJVFksIERFRkFVTFRfRElTUExBWV9JRCk7Ci0gICAgICAgIGdldExhdW5jaEFjdGl2aXR5QnVpbGRlcigpCi0gICAgICAgICAgICAgICAgLnNldFRhcmdldEFjdGl2aXR5TmFtZSgiQW5pbWF0aW9uVGVzdEFjdGl2aXR5IikKLSAgICAgICAgICAgICAgICAuc2V0V2FpdEZvckxhdW5jaGVkKGZhbHNlKQotICAgICAgICAgICAgICAgIC5leGVjdXRlKCk7Ci0KLSAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIHRoZSBhbmltYXRpb24uCi0gICAgICAgIG1BbVdtU3RhdGUud2FpdEZvcldpdGhXbVN0YXRlKG1EZXZpY2UsIHN0YXRlIC0+IHN0YXRlCi0gICAgICAgICAgICAgICAgLmdldFN0YWNrKEZVTExTQ1JFRU5fV09SS1NQQUNFX1NUQUNLX0lEKQotICAgICAgICAgICAgICAgICAgICAgICAgLmlzV2luZG93QW5pbWF0aW9uQmFja2dyb3VuZFN1cmZhY2VTaG93aW5nKCksCi0gICAgICAgICAgICAgICAgIioqKldhaXRpbmcgZm9yIGFuaW1hdGlvbiBiYWNrZ3JvdW5kIHNob3dpbmciKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgid2luZG93IGFuaW1hdGlvbiBiYWNrZ3JvdW5kIG5lZWRzIHRvIGJlIHNob3dpbmciLCBtQW1XbVN0YXRlLmdldFdtU3RhdGUoKQotICAgICAgICAgICAgICAgIC5nZXRTdGFjayhGVUxMU0NSRUVOX1dPUktTUEFDRV9TVEFDS19JRCkKLSAgICAgICAgICAgICAgICAuaXNXaW5kb3dBbmltYXRpb25CYWNrZ3JvdW5kU3VyZmFjZVNob3dpbmcoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFuaW1hdGlvbkJhY2tncm91bmRfZ29uZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBsYXVuY2hBY3Rpdml0eU9uRGlzcGxheShMQVVOQ0hJTkdfQUNUSVZJVFksIERFRkFVTFRfRElTUExBWV9JRCk7Ci0gICAgICAgIGdldExhdW5jaEFjdGl2aXR5QnVpbGRlcigpLnNldFRhcmdldEFjdGl2aXR5TmFtZSgiQW5pbWF0aW9uVGVzdEFjdGl2aXR5IikuZXhlY3V0ZSgpOwotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCBuZXcgU3RyaW5nW10geyAiQW5pbWF0aW9uVGVzdEFjdGl2aXR5ICJ9KTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIndpbmRvdyBhbmltYXRpb24gYmFja2dyb3VuZCBuZWVkcyB0byBiZSBnb25lIiwgbUFtV21TdGF0ZS5nZXRXbVN0YXRlKCkKLSAgICAgICAgICAgICAgICAuZ2V0U3RhY2soRlVMTFNDUkVFTl9XT1JLU1BBQ0VfU1RBQ0tfSUQpCi0gICAgICAgICAgICAgICAgLmlzV2luZG93QW5pbWF0aW9uQmFja2dyb3VuZFN1cmZhY2VTaG93aW5nKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0Rpc3BsYXlTaXplVGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvRGlzcGxheVNpemVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYmJmZTIuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvRGlzcGxheVNpemVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuY3RzOwotCi1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLkRldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuSVRlc3REZXZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuRGV2aWNlVGVzdENhc2U7Ci0KLS8qKgotICogRW5zdXJlIHRoYXQgY29tcGF0aWJpbGl0eSBkaWFsb2cgaXMgc2hvd24gd2hlbiBsYXVuY2hpbmcgYW4gYXBwbGljYXRpb24gd2l0aAotICogYW4gdW5zdXBwb3J0ZWQgc21hbGxlc3Qgd2lkdGguCi0gKgotICogQnVpbGQ6IG1tbWEgLWozMiBjdHMvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcwotICogUnVuOiBjdHMvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvdXRpbC9ydW4tdGVzdCBDdHNTZXJ2aWNlc0hvc3RUZXN0Q2FzZXMgYW5kcm9pZC5zZXJ2ZXIuY3RzLkRpc3BsYXlTaXplVGVzdAotICovCi1wdWJsaWMgY2xhc3MgRGlzcGxheVNpemVUZXN0IGV4dGVuZHMgRGV2aWNlVGVzdENhc2UgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERU5TSVRZX1BST1BfREVWSUNFID0gInJvLnNmLmxjZF9kZW5zaXR5IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVOU0lUWV9QUk9QX0VNVUxBVE9SID0gInFlbXUuc2YubGNkX2RlbnNpdHkiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFNX1NUQVJUX0NPTU1BTkQgPSAiYW0gc3RhcnQgLW4gJXMvJXMuJXMiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTV9GT1JDRV9TVE9QID0gImFtIGZvcmNlLXN0b3AgJXMiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFDVElWSVRZX1RJTUVPVVRfTUlMTElTID0gMTAwMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0lORE9XX1RJTUVPVVRfTUlMTElTID0gMTAwMDsKLQotICAgIHByaXZhdGUgSVRlc3REZXZpY2UgbURldmljZTsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0KLSAgICAgICAgbURldmljZSA9IGdldERldmljZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlc2V0RGVuc2l0eSgpOwotCi0gICAgICAgICAgICAvLyBFbnN1cmUgYXBwIHByb2Nlc3MgaXMgc3RvcHBlZC4KLSAgICAgICAgICAgIGZvcmNlU3RvcFBhY2thZ2UoImFuZHJvaWQuZGlzcGxheXNpemUuYXBwIik7Ci0gICAgICAgICAgICBmb3JjZVN0b3BQYWNrYWdlKCJhbmRyb2lkLnNlcnZlci5jdHMiKTsKLSAgICAgICAgfSBjYXRjaCAoRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIERvIG5vdGhpbmcuCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGF0aWJpbGl0eURpYWxvZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBMYXVuY2ggc29tZSBvdGhlciBhcHAgKG5vdCB0byBwZXJmb3JtIGRlbnNpdHkgY2hhbmdlIG9uIGxhdW5jaGVyKS4KLSAgICAgICAgc3RhcnRBY3Rpdml0eSgiYW5kcm9pZC5zZXJ2ZXIuY3RzIiwgIlRlc3RBY3Rpdml0eSIpOwotICAgICAgICB2ZXJpZnlXaW5kb3dEaXNwbGF5ZWQoIlRlc3RBY3Rpdml0eSIsIEFDVElWSVRZX1RJTUVPVVRfTUlMTElTKTsKLQotICAgICAgICBzZXRVbnN1cHBvcnRlZERlbnNpdHkoKTsKLQotICAgICAgICAvLyBMYXVuY2ggdGFyZ2V0IGFwcC4KLSAgICAgICAgc3RhcnRBY3Rpdml0eSgiYW5kcm9pZC5kaXNwbGF5c2l6ZS5hcHAiLCAiU21hbGxlc3RXaWR0aEFjdGl2aXR5Iik7Ci0gICAgICAgIHZlcmlmeVdpbmRvd0Rpc3BsYXllZCgiU21hbGxlc3RXaWR0aEFjdGl2aXR5IiwgQUNUSVZJVFlfVElNRU9VVF9NSUxMSVMpOwotICAgICAgICB2ZXJpZnlXaW5kb3dEaXNwbGF5ZWQoIlVuc3VwcG9ydGVkRGlzcGxheVNpemVEaWFsb2ciLCBXSU5ET1dfVElNRU9VVF9NSUxMSVMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wYXRpYmlsaXR5RGlhbG9nV2hlbkZvY3VzZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3RhcnRBY3Rpdml0eSgiYW5kcm9pZC5kaXNwbGF5c2l6ZS5hcHAiLCAiU21hbGxlc3RXaWR0aEFjdGl2aXR5Iik7Ci0gICAgICAgIHZlcmlmeVdpbmRvd0Rpc3BsYXllZCgiU21hbGxlc3RXaWR0aEFjdGl2aXR5IiwgQUNUSVZJVFlfVElNRU9VVF9NSUxMSVMpOwotCi0gICAgICAgIHNldFVuc3VwcG9ydGVkRGVuc2l0eSgpOwotCi0gICAgICAgIHZlcmlmeVdpbmRvd0Rpc3BsYXllZCgiVW5zdXBwb3J0ZWREaXNwbGF5U2l6ZURpYWxvZyIsIFdJTkRPV19USU1FT1VUX01JTExJUyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvbXBhdGliaWxpdHlEaWFsb2dBZnRlclJldHVybigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBMYXVuY2ggdGFyZ2V0IGFwcC4KLSAgICAgICAgc3RhcnRBY3Rpdml0eSgiYW5kcm9pZC5kaXNwbGF5c2l6ZS5hcHAiLCAiU21hbGxlc3RXaWR0aEFjdGl2aXR5Iik7Ci0gICAgICAgIHZlcmlmeVdpbmRvd0Rpc3BsYXllZCgiU21hbGxlc3RXaWR0aEFjdGl2aXR5IiwgQUNUSVZJVFlfVElNRU9VVF9NSUxMSVMpOwotICAgICAgICAvLyBMYXVuY2ggYW5vdGhlciBhY3Rpdml0eS4KLSAgICAgICAgc3RhcnRPdGhlckFjdGl2aXR5T25Ub3AoImFuZHJvaWQuZGlzcGxheXNpemUuYXBwIiwgIlNtYWxsZXN0V2lkdGhBY3Rpdml0eSIpOwotICAgICAgICB2ZXJpZnlXaW5kb3dEaXNwbGF5ZWQoIlRlc3RBY3Rpdml0eSIsIEFDVElWSVRZX1RJTUVPVVRfTUlMTElTKTsKLQotICAgICAgICBzZXRVbnN1cHBvcnRlZERlbnNpdHkoKTsKLQotICAgICAgICAvLyBHbyBiYWNrLgotICAgICAgICBtRGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoImlucHV0IGtleWV2ZW50IDQiKTsKLQotICAgICAgICB2ZXJpZnlXaW5kb3dEaXNwbGF5ZWQoIlNtYWxsZXN0V2lkdGhBY3Rpdml0eSIsIEFDVElWSVRZX1RJTUVPVVRfTUlMTElTKTsKLSAgICAgICAgdmVyaWZ5V2luZG93RGlzcGxheWVkKCJVbnN1cHBvcnRlZERpc3BsYXlTaXplRGlhbG9nIiwgV0lORE9XX1RJTUVPVVRfTUlMTElTKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0VW5zdXBwb3J0ZWREZW5zaXR5KCkgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFNldCBkZXZpY2UgdG8gMC44NSB6b29tLiBJdCBkb2Vzbid0IG1hdHRlciB0aGF0IHdlJ3JlIHpvb21pbmcgb3V0Ci0gICAgICAgIC8vIHNpbmNlIHRoZSBmZWF0dXJlIHZlcmlmaWVzIHRoYXQgd2UncmUgaW4gYSBub24tZGVmYXVsdCBkZW5zaXR5LgotICAgICAgICBmaW5hbCBpbnQgc3RhYmxlRGVuc2l0eSA9IGdldFN0YWJsZURlbnNpdHkoKTsKLSAgICAgICAgZmluYWwgaW50IHRhcmdldERlbnNpdHkgPSAoaW50KSAoc3RhYmxlRGVuc2l0eSAqIDAuODUpOwotICAgICAgICBzZXREZW5zaXR5KHRhcmdldERlbnNpdHkpOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGdldFN0YWJsZURlbnNpdHkoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZGVuc2l0eVByb3A7Ci0gICAgICAgICAgICBpZiAobURldmljZS5nZXRTZXJpYWxOdW1iZXIoKS5zdGFydHNXaXRoKCJlbXVsYXRvci0iKSkgewotICAgICAgICAgICAgICAgIGRlbnNpdHlQcm9wID0gREVOU0lUWV9QUk9QX0VNVUxBVE9SOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkZW5zaXR5UHJvcCA9IERFTlNJVFlfUFJPUF9ERVZJQ0U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KG1EZXZpY2UuZ2V0UHJvcGVydHkoZGVuc2l0eVByb3ApKTsKLSAgICAgICAgfSBjYXRjaCAoRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldERlbnNpdHkoaW50IHRhcmdldERlbnNpdHkpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBtRGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoIndtIGRlbnNpdHkgIiArIHRhcmdldERlbnNpdHkpOwotCi0gICAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBkZW5zaXR5IGlzIGNoYW5nZWQuCi0gICAgICAgIGZpbmFsIFN0cmluZyBvdXRwdXQgPSBtRGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoIndtIGRlbnNpdHkiKTsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBzdWNjZXNzID0gb3V0cHV0LmNvbnRhaW5zKCJPdmVycmlkZSBkZW5zaXR5OiAiICsgdGFyZ2V0RGVuc2l0eSk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIHNldCBkZW5zaXR5IHRvICIgKyB0YXJnZXREZW5zaXR5LCBzdWNjZXNzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVzZXREZW5zaXR5KCkgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIG1EZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZCgid20gZGVuc2l0eSByZXNldCIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBmb3JjZVN0b3BQYWNrYWdlKFN0cmluZyBwYWNrYWdlTmFtZSkgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBmb3JjZVN0b3BDbWQgPSBTdHJpbmcuZm9ybWF0KEFNX0ZPUkNFX1NUT1AsIHBhY2thZ2VOYW1lKTsKLSAgICAgICAgbURldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKGZvcmNlU3RvcENtZCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHN0YXJ0QWN0aXZpdHkoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgYWN0aXZpdHlOYW1lKQotICAgICAgICAgICAgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIG1EZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZChnZXRTdGFydENvbW1hbmQocGFja2FnZU5hbWUsIGFjdGl2aXR5TmFtZSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzdGFydE90aGVyQWN0aXZpdHlPblRvcChTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBhY3Rpdml0eU5hbWUpCi0gICAgICAgICAgICB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHN0YXJ0Q21kID0gZ2V0U3RhcnRDb21tYW5kKHBhY2thZ2VOYW1lLCBhY3Rpdml0eU5hbWUpCi0gICAgICAgICAgICAgICAgKyAiIC1mIDB4MjAwMDAwMDAgLS1leiBsYXVuY2hfYW5vdGhlcl9hY3Rpdml0eSB0cnVlIjsKLSAgICAgICAgbURldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKHN0YXJ0Q21kKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRTdGFydENvbW1hbmQoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgYWN0aXZpdHlOYW1lKSB7Ci0gICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KEFNX1NUQVJUX0NPTU1BTkQsIHBhY2thZ2VOYW1lLCBwYWNrYWdlTmFtZSwgYWN0aXZpdHlOYW1lKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdmVyaWZ5V2luZG93RGlzcGxheWVkKFN0cmluZyB3aW5kb3dOYW1lLCBsb25nIHRpbWVvdXRNaWxsaXMpCi0gICAgICAgICAgICB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7Ci0KLSAgICAgICAgLy8gVmVyaWZ5IHRoYXQgY29tcGF0aWJpbGl0eSBkaWFsb2cgaXMgc2hvd24gd2l0aGluIDEwMDBtcy4KLSAgICAgICAgZmluYWwgbG9uZyB0aW1lb3V0VGltZU1pbGxpcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgdGltZW91dE1pbGxpczsKLSAgICAgICAgd2hpbGUgKCFzdWNjZXNzICYmIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIDwgdGltZW91dFRpbWVNaWxsaXMpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBvdXRwdXQgPSBtRGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoImR1bXBzeXMgd2luZG93Iik7Ci0gICAgICAgICAgICBzdWNjZXNzID0gb3V0cHV0LmNvbnRhaW5zKHdpbmRvd05hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSh3aW5kb3dOYW1lICsgIiB3YXMgbm90IGRpc3BsYXllZCIsIHN1Y2Nlc3MpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0tleWd1YXJkTG9ja2VkVGVzdHMuamF2YSBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0tleWd1YXJkTG9ja2VkVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNkN2FkZC4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9LZXlndWFyZExvY2tlZFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnNlcnZlci5jdHM7Ci0KLS8qKgotICogQnVpbGQ6IG1tbWEgLWozMiBjdHMvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcwotICogUnVuOiBjdHMvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvdXRpbC9ydW4tdGVzdCBDdHNTZXJ2aWNlc0hvc3RUZXN0Q2FzZXMgYW5kcm9pZC5zZXJ2ZXIuY3RzLktleWd1YXJkTG9ja2VkVGVzdHMKLSAqLwotcHVibGljIGNsYXNzIEtleWd1YXJkTG9ja2VkVGVzdHMgZXh0ZW5kcyBLZXlndWFyZFRlc3RCYXNlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSE9XX1dIRU5fTE9DS0VEX0FDVElWSVRZID0gIlNob3dXaGVuTG9ja2VkQWN0aXZpdHkiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQSVBfQUNUSVZJVFkgPSAiUGlwQWN0aXZpdHkiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQSVBfQUNUSVZJVFlfQUNUSU9OX0VOVEVSX1BJUCA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5zZXJ2ZXIuY3RzLlBpcEFjdGl2aXR5LmVudGVyX3BpcCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1NIT1dfT1ZFUl9LRVlHVUFSRCA9ICJzaG93X292ZXJfa2V5Z3VhcmQiOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgc2V0TG9ja0NyZWRlbnRpYWwoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci50ZWFyRG93bigpOwotICAgICAgICB0ZWFyRG93bkxvY2tDcmVkZW50aWFscygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RMb2NrQW5kVW5sb2NrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghaXNIYW5kaGVsZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZ290b0tleWd1YXJkKCk7Ci0gICAgICAgIG1BbVdtU3RhdGUud2FpdEZvcktleWd1YXJkU2hvd2luZ0FuZE5vdE9jY2x1ZGVkKG1EZXZpY2UpOwotICAgICAgICBhc3NlcnRTaG93aW5nQW5kTm90T2NjbHVkZWQoKTsKLSAgICAgICAgdW5sb2NrRGV2aWNlV2l0aENyZWRlbnRpYWwoKTsKLSAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yS2V5Z3VhcmRHb25lKG1EZXZpY2UpOwotICAgICAgICBhc3NlcnRLZXlndWFyZEdvbmUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzbWlzc0tleWd1YXJkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghaXNIYW5kaGVsZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZ290b0tleWd1YXJkKCk7Ci0gICAgICAgIG1BbVdtU3RhdGUud2FpdEZvcktleWd1YXJkU2hvd2luZ0FuZE5vdE9jY2x1ZGVkKG1EZXZpY2UpOwotICAgICAgICBhc3NlcnRTaG93aW5nQW5kTm90T2NjbHVkZWQoKTsKLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoIkRpc21pc3NLZXlndWFyZEFjdGl2aXR5Iik7Ci0gICAgICAgIGVudGVyQW5kQ29uZmlybUxvY2tDcmVkZW50aWFsKCk7Ci0gICAgICAgIG1BbVdtU3RhdGUud2FpdEZvcktleWd1YXJkR29uZShtRGV2aWNlKTsKLSAgICAgICAgYXNzZXJ0S2V5Z3VhcmRHb25lKCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eSgiRGlzbWlzc0tleWd1YXJkQWN0aXZpdHkiLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzbWlzc0tleWd1YXJkX3doaWxlT2NjbHVkZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFpc0hhbmRoZWxkKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBnb3RvS2V5Z3VhcmQoKTsKLSAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yS2V5Z3VhcmRTaG93aW5nQW5kTm90T2NjbHVkZWQobURldmljZSk7Ci0gICAgICAgIGFzc2VydFNob3dpbmdBbmROb3RPY2NsdWRlZCgpOwotICAgICAgICBsYXVuY2hBY3Rpdml0eShTSE9XX1dIRU5fTE9DS0VEX0FDVElWSVRZKTsKLSAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwgbmV3IFN0cmluZ1tdIHsgU0hPV19XSEVOX0xPQ0tFRF9BQ1RJVklUWSB9KTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFNIT1dfV0hFTl9MT0NLRURfQUNUSVZJVFksIHRydWUpOwotICAgICAgICBsYXVuY2hBY3Rpdml0eSgiRGlzbWlzc0tleWd1YXJkQWN0aXZpdHkiKTsKLSAgICAgICAgZW50ZXJBbmRDb25maXJtTG9ja0NyZWRlbnRpYWwoKTsKLSAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yS2V5Z3VhcmRHb25lKG1EZXZpY2UpOwotICAgICAgICBhc3NlcnRLZXlndWFyZEdvbmUoKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KCJEaXNtaXNzS2V5Z3VhcmRBY3Rpdml0eSIsIHRydWUpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoU0hPV19XSEVOX0xPQ0tFRF9BQ1RJVklUWSwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REaXNtaXNzS2V5Z3VhcmRfZnJvbVNob3dXaGVuTG9ja2VkX25vdEFsbG93ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFpc0hhbmRoZWxkKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBnb3RvS2V5Z3VhcmQoKTsKLSAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yS2V5Z3VhcmRTaG93aW5nQW5kTm90T2NjbHVkZWQobURldmljZSk7Ci0gICAgICAgIGFzc2VydFNob3dpbmdBbmROb3RPY2NsdWRlZCgpOwotICAgICAgICBsYXVuY2hBY3Rpdml0eShTSE9XX1dIRU5fTE9DS0VEX0FDVElWSVRZKTsKLSAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwgbmV3IFN0cmluZ1tdIHsgU0hPV19XSEVOX0xPQ0tFRF9BQ1RJVklUWSB9KTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFNIT1dfV0hFTl9MT0NLRURfQUNUSVZJVFksIHRydWUpOwotICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKCJhbSBicm9hZGNhc3QgLWEgdHJpZ2dlcl9icm9hZGNhc3QgLS1leiBkaXNtaXNzS2V5Z3VhcmQgdHJ1ZSIpOwotICAgICAgICBlbnRlckFuZENvbmZpcm1Mb2NrQ3JlZGVudGlhbCgpOwotCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBzdGF5IG9uIEtleWd1YXJkLgotICAgICAgICBhc3NlcnRTaG93aW5nQW5kT2NjbHVkZWQoKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFNIT1dfV0hFTl9MT0NLRURfQUNUSVZJVFksIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REaXNtaXNzS2V5Z3VhcmRBY3Rpdml0eV9tZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFpc0hhbmRoZWxkKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBTdHJpbmcgbG9nU2VwYXJhdG9yID0gY2xlYXJMb2djYXQoKTsKLSAgICAgICAgZ290b0tleWd1YXJkKCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIG51bGwpOwotICAgICAgICBhc3NlcnRUcnVlKG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEtleWd1YXJkQ29udHJvbGxlclN0YXRlKCkua2V5Z3VhcmRTaG93aW5nKTsKLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoIkRpc21pc3NLZXlndWFyZE1ldGhvZEFjdGl2aXR5Iik7Ci0gICAgICAgIGVudGVyQW5kQ29uZmlybUxvY2tDcmVkZW50aWFsKCk7Ci0gICAgICAgIG1BbVdtU3RhdGUud2FpdEZvcktleWd1YXJkR29uZShtRGV2aWNlKTsKLSAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwgbmV3IFN0cmluZ1tdIHsgIkRpc21pc3NLZXlndWFyZE1ldGhvZEFjdGl2aXR5In0pOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoIkRpc21pc3NLZXlndWFyZE1ldGhvZEFjdGl2aXR5IiwgdHJ1ZSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEtleWd1YXJkQ29udHJvbGxlclN0YXRlKCkua2V5Z3VhcmRTaG93aW5nKTsKLSAgICAgICAgYXNzZXJ0T25EaXNtaXNzU3VjY2VlZGVkSW5Mb2djYXQobG9nU2VwYXJhdG9yKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzbWlzc0tleWd1YXJkQWN0aXZpdHlfbWV0aG9kX2NhbmNlbGxlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIWlzSGFuZGhlbGQoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIFN0cmluZyBsb2dTZXBhcmF0b3IgPSBjbGVhckxvZ2NhdCgpOwotICAgICAgICBnb3RvS2V5Z3VhcmQoKTsKLSAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwgbnVsbCk7Ci0gICAgICAgIGFzc2VydFRydWUobUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0S2V5Z3VhcmRDb250cm9sbGVyU3RhdGUoKS5rZXlndWFyZFNob3dpbmcpOwotICAgICAgICBsYXVuY2hBY3Rpdml0eSgiRGlzbWlzc0tleWd1YXJkTWV0aG9kQWN0aXZpdHkiKTsKLSAgICAgICAgcHJlc3NCYWNrQnV0dG9uKCk7Ci0gICAgICAgIGFzc2VydE9uRGlzbWlzc0NhbmNlbGxlZEluTG9nY2F0KGxvZ1NlcGFyYXRvcik7Ci0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIG5ldyBTdHJpbmdbXSB7fSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eSgiRGlzbWlzc0tleWd1YXJkTWV0aG9kQWN0aXZpdHkiLCBmYWxzZSk7Ci0gICAgICAgIGFzc2VydFRydWUobUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0S2V5Z3VhcmRDb250cm9sbGVyU3RhdGUoKS5rZXlndWFyZFNob3dpbmcpOwotICAgICAgICB1bmxvY2tEZXZpY2VXaXRoQ3JlZGVudGlhbCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbnRlclBpcE92ZXJLZXlndWFyZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIWlzSGFuZGhlbGQoKSB8fCAhc3VwcG9ydHNQaXAoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gR28gdG8gdGhlIGtleWd1YXJkCi0gICAgICAgIGdvdG9LZXlndWFyZCgpOwotICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JLZXlndWFyZFNob3dpbmdBbmROb3RPY2NsdWRlZChtRGV2aWNlKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRLZXlndWFyZENvbnRyb2xsZXJTdGF0ZSgpLmtleWd1YXJkU2hvd2luZyk7Ci0KLSAgICAgICAgLy8gRW50ZXIgUGlQIG9uIGFuIGFjdGl2aXR5IG9uIHRvcCBvZiB0aGUga2V5Z3VhcmQsIGFuZCBlbnN1cmUgdGhhdCBpdCBwcm9tcHRzIHRoZSB1c2VyIGZvcgotICAgICAgICAvLyB0aGVpciBjcmVkZW50aWFscyBhbmQgZG9lcyBub3QgZW50ZXIgcGljdHVyZS1pbi1waWN0dXJlIHlldAotICAgICAgICBsYXVuY2hBY3Rpdml0eShQSVBfQUNUSVZJVFksIEVYVFJBX1NIT1dfT1ZFUl9LRVlHVUFSRCwgInRydWUiKTsKLSAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZCgiYW0gYnJvYWRjYXN0IC1hICIgKyBQSVBfQUNUSVZJVFlfQUNUSU9OX0VOVEVSX1BJUCk7Ci0gICAgICAgIG1BbVdtU3RhdGUud2FpdEZvcktleWd1YXJkU2hvd2luZ0FuZE9jY2x1ZGVkKG1EZXZpY2UpOwotICAgICAgICBhc3NlcnRTaG93aW5nQW5kT2NjbHVkZWQoKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnREb2VzTm90Q29udGFpblN0YWNrKCJNdXN0IG5vdCBjb250YWluIHBpbm5lZCBzdGFjay4iLCBQSU5ORURfU1RBQ0tfSUQpOwotCi0gICAgICAgIC8vIEVudGVyIHRoZSBjcmVkZW50aWFscyBhbmQgZW5zdXJlIHRoYXQgdGhlIGFjdGl2aXR5IGFjdHVhbGx5IGVudGVyZWQgcGljdHVyZS1pbi1waWN0dXJlCi0gICAgICAgIGVudGVyQW5kQ29uZmlybUxvY2tDcmVkZW50aWFsKCk7Ci0gICAgICAgIG1BbVdtU3RhdGUud2FpdEZvcktleWd1YXJkR29uZShtRGV2aWNlKTsKLSAgICAgICAgYXNzZXJ0S2V5Z3VhcmRHb25lKCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Q29udGFpbnNTdGFjaygiTXVzdCBjb250YWluIHBpbm5lZCBzdGFjay4iLCBQSU5ORURfU1RBQ0tfSUQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTaG93V2hlbkxvY2tlZEFjdGl2aXR5QW5kUGlwQWN0aXZpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFpc0hhbmRoZWxkKCkgfHwgIXN1cHBvcnRzUGlwKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGxhdW5jaEFjdGl2aXR5KFBJUF9BQ1RJVklUWSk7Ci0gICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoImFtIGJyb2FkY2FzdCAtYSAiICsgUElQX0FDVElWSVRZX0FDVElPTl9FTlRFUl9QSVApOwotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCBuZXcgU3RyaW5nW10geyBQSVBfQUNUSVZJVFkgfSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Q29udGFpbnNTdGFjaygiTXVzdCBjb250YWluIHBpbm5lZCBzdGFjay4iLCBQSU5ORURfU1RBQ0tfSUQpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoUElQX0FDVElWSVRZLCB0cnVlKTsKLQotICAgICAgICBsYXVuY2hBY3Rpdml0eShTSE9XX1dIRU5fTE9DS0VEX0FDVElWSVRZKTsKLSAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwgbmV3IFN0cmluZ1tdIHsgU0hPV19XSEVOX0xPQ0tFRF9BQ1RJVklUWSB9KTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFNIT1dfV0hFTl9MT0NLRURfQUNUSVZJVFksIHRydWUpOwotCi0gICAgICAgIGdvdG9LZXlndWFyZCgpOwotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCBudWxsKTsKLSAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yS2V5Z3VhcmRTaG93aW5nQW5kT2NjbHVkZWQobURldmljZSk7Ci0gICAgICAgIGFzc2VydFNob3dpbmdBbmRPY2NsdWRlZCgpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoU0hPV19XSEVOX0xPQ0tFRF9BQ1RJVklUWSwgdHJ1ZSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShQSVBfQUNUSVZJVFksIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2hvd1doZW5Mb2NrZWRQaXBBY3Rpdml0eSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIWlzSGFuZGhlbGQoKSB8fCAhc3VwcG9ydHNQaXAoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoUElQX0FDVElWSVRZLCBFWFRSQV9TSE9XX09WRVJfS0VZR1VBUkQsICJ0cnVlIik7Ci0gICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoImFtIGJyb2FkY2FzdCAtYSAiICsgUElQX0FDVElWSVRZX0FDVElPTl9FTlRFUl9QSVApOwotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCBuZXcgU3RyaW5nW10geyBQSVBfQUNUSVZJVFkgfSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Q29udGFpbnNTdGFjaygiTXVzdCBjb250YWluIHBpbm5lZCBzdGFjay4iLCBQSU5ORURfU1RBQ0tfSUQpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoUElQX0FDVElWSVRZLCB0cnVlKTsKLQotICAgICAgICBnb3RvS2V5Z3VhcmQoKTsKLSAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yS2V5Z3VhcmRTaG93aW5nQW5kTm90T2NjbHVkZWQobURldmljZSk7Ci0gICAgICAgIGFzc2VydFNob3dpbmdBbmROb3RPY2NsdWRlZCgpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoUElQX0FDVElWSVRZLCBmYWxzZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvS2V5Z3VhcmRUZXN0QmFzZS5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvS2V5Z3VhcmRUZXN0QmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTc4NjQ0Li4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0tleWd1YXJkVGVzdEJhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuY3RzOwotCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmN0cy5TdGF0ZUxvZ2dlci5sb2c7Ci0KLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotcHVibGljIGNsYXNzIEtleWd1YXJkVGVzdEJhc2UgZXh0ZW5kcyBBY3Rpdml0eU1hbmFnZXJUZXN0QmFzZSB7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRTaG93aW5nQW5kT2NjbHVkZWQoKSB7Ci0gICAgICAgIGFzc2VydFRydWUobUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0S2V5Z3VhcmRDb250cm9sbGVyU3RhdGUoKS5rZXlndWFyZFNob3dpbmcpOwotICAgICAgICBhc3NlcnRUcnVlKG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEtleWd1YXJkQ29udHJvbGxlclN0YXRlKCkua2V5Z3VhcmRPY2NsdWRlZCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0U2hvd2luZ0FuZE5vdE9jY2x1ZGVkKCkgewotICAgICAgICBhc3NlcnRUcnVlKG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEtleWd1YXJkQ29udHJvbGxlclN0YXRlKCkua2V5Z3VhcmRTaG93aW5nKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UobUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0S2V5Z3VhcmRDb250cm9sbGVyU3RhdGUoKS5rZXlndWFyZE9jY2x1ZGVkKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRLZXlndWFyZEdvbmUoKSB7Ci0gICAgICAgIGFzc2VydEZhbHNlKG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEtleWd1YXJkQ29udHJvbGxlclN0YXRlKCkua2V5Z3VhcmRTaG93aW5nKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRPbkRpc21pc3NTdWNjZWVkZWRJbkxvZ2NhdChTdHJpbmcgbG9nU2VwYXJhdG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0SW5Mb2djYXQoIktleWd1YXJkRGlzbWlzc0xvZ2dlckNhbGxiYWNrIiwgIm9uRGlzbWlzc1N1Y2NlZWRlZCIsIGxvZ1NlcGFyYXRvcik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0T25EaXNtaXNzQ2FuY2VsbGVkSW5Mb2djYXQoU3RyaW5nIGxvZ1NlcGFyYXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydEluTG9nY2F0KCJLZXlndWFyZERpc21pc3NMb2dnZXJDYWxsYmFjayIsICJvbkRpc21pc3NDYW5jZWxsZWQiLCBsb2dTZXBhcmF0b3IpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydE9uRGlzbWlzc0Vycm9ySW5Mb2djYXQoU3RyaW5nIGxvZ1NlcGFyYXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydEluTG9nY2F0KCJLZXlndWFyZERpc21pc3NMb2dnZXJDYWxsYmFjayIsICJvbkRpc21pc3NFcnJvciIsIGxvZ1NlcGFyYXRvcik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydEluTG9nY2F0KFN0cmluZyBhY3Rpdml0eU5hbWUsIFN0cmluZyBlbnRyeSwgU3RyaW5nIGxvZ1NlcGFyYXRvcikKLSAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBQYXR0ZXJuIHBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoIiguKykiICsgZW50cnkpOwotICAgICAgICBpbnQgdHJpZXMgPSAwOwotICAgICAgICB3aGlsZSAodHJpZXMgPCA1KSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBsaW5lcyA9IGdldERldmljZUxvZ3NGb3JDb21wb25lbnQoYWN0aXZpdHlOYW1lLCBsb2dTZXBhcmF0b3IpOwotICAgICAgICAgICAgbG9nKCJMb29raW5nIGF0IGxvZ2NhdCIpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IGxpbmVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxpbmUgPSBsaW5lc1tpXS50cmltKCk7Ci0gICAgICAgICAgICAgICAgbG9nKGxpbmUpOwotICAgICAgICAgICAgICAgIE1hdGNoZXIgbWF0Y2hlciA9IHBhdHRlcm4ubWF0Y2hlcihsaW5lKTsKLSAgICAgICAgICAgICAgICBpZiAobWF0Y2hlci5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRyaWVzKys7Ci0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoNTAwKTsKLSAgICAgICAgfQotICAgICAgICBmYWlsKCJOb3QgaW4gbG9nY2F0OiAiICsgZW50cnkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0tleWd1YXJkVGVzdHMuamF2YSBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0tleWd1YXJkVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM2ZjAzNy4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9LZXlndWFyZFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnNlcnZlci5jdHM7Ci0KLWltcG9ydCBhbmRyb2lkLnNlcnZlci5jdHMuV2luZG93TWFuYWdlclN0YXRlLldpbmRvd1N0YXRlOwotCi0vKioKLSAqIEJ1aWxkOiBtbW1hIC1qMzIgY3RzL2hvc3RzaWRldGVzdHMvc2VydmljZXMKLSAqIFJ1bjogY3RzL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL3V0aWwvcnVuLXRlc3QgQ3RzU2VydmljZXNIb3N0VGVzdENhc2VzIGFuZHJvaWQuc2VydmVyLmN0cy5LZXlndWFyZFRlc3RzCi0gKi8KLXB1YmxpYyBjbGFzcyBLZXlndWFyZFRlc3RzIGV4dGVuZHMgS2V5Z3VhcmRUZXN0QmFzZSB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotCi0gICAgICAgIC8vIFNldCBzY3JlZW4gbG9jayAoc3dpcGUpCi0gICAgICAgIHNldExvY2tEaXNhYmxlZChmYWxzZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLQotICAgICAgICB0ZWFyRG93bkxvY2tDcmVkZW50aWFscygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RLZXlndWFyZEhpZGVzQWN0aXZpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFpc0hhbmRoZWxkKCkgfHwgaXNVaU1vZGVMb2NrZWRUb1ZySGVhZHNldCgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoIlRlc3RBY3Rpdml0eSIpOwotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCBuZXcgU3RyaW5nW10geyAiVGVzdEFjdGl2aXR5In0pOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoIlRlc3RBY3Rpdml0eSIsIHRydWUpOwotICAgICAgICBnb3RvS2V5Z3VhcmQoKTsKLSAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwgbnVsbCk7Ci0gICAgICAgIGFzc2VydFNob3dpbmdBbmROb3RPY2NsdWRlZCgpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoIlRlc3RBY3Rpdml0eSIsIGZhbHNlKTsKLSAgICAgICAgdW5sb2NrRGV2aWNlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNob3dXaGVuTG9ja2VkQWN0aXZpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFpc0hhbmRoZWxkKCkgfHwgaXNVaU1vZGVMb2NrZWRUb1ZySGVhZHNldCgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoIlNob3dXaGVuTG9ja2VkQWN0aXZpdHkiKTsKLSAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwgbmV3IFN0cmluZ1tdIHsgIlNob3dXaGVuTG9ja2VkQWN0aXZpdHkifSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eSgiU2hvd1doZW5Mb2NrZWRBY3Rpdml0eSIsIHRydWUpOwotICAgICAgICBnb3RvS2V5Z3VhcmQoKTsKLSAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwgbnVsbCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eSgiU2hvd1doZW5Mb2NrZWRBY3Rpdml0eSIsIHRydWUpOwotICAgICAgICBhc3NlcnRTaG93aW5nQW5kT2NjbHVkZWQoKTsKLSAgICAgICAgcHJlc3NIb21lQnV0dG9uKCk7Ci0gICAgICAgIHVubG9ja0RldmljZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHdoZXRoZXIgZGlhbG9ncyBmcm9tIFNIT1dfV0hFTl9MT0NLRUQgYWN0aXZpdGllcyBhcmUgYWxzbyB2aXNpYmxlIGlmIEtleWd1YXJkIGlzCi0gICAgICogc2hvd2luZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2hvd1doZW5Mb2NrZWRBY3Rpdml0eV93aXRoRGlhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghaXNIYW5kaGVsZCgpIHx8IGlzVWlNb2RlTG9ja2VkVG9WckhlYWRzZXQoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGxhdW5jaEFjdGl2aXR5KCJTaG93V2hlbkxvY2tlZFdpdGhEaWFsb2dBY3Rpdml0eSIpOwotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCBuZXcgU3RyaW5nW10geyAiU2hvd1doZW5Mb2NrZWRXaXRoRGlhbG9nQWN0aXZpdHkifSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eSgiU2hvd1doZW5Mb2NrZWRXaXRoRGlhbG9nQWN0aXZpdHkiLCB0cnVlKTsKLSAgICAgICAgZ290b0tleWd1YXJkKCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIG51bGwpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoIlNob3dXaGVuTG9ja2VkV2l0aERpYWxvZ0FjdGl2aXR5IiwgdHJ1ZSk7Ci0gICAgICAgIGFzc2VydFRydWUobUFtV21TdGF0ZS5nZXRXbVN0YXRlKCkuYWxsV2luZG93c1Zpc2libGUoCi0gICAgICAgICAgICAgICAgZ2V0V2luZG93TmFtZSgiU2hvd1doZW5Mb2NrZWRXaXRoRGlhbG9nQWN0aXZpdHkiKSkpOwotICAgICAgICBhc3NlcnRTaG93aW5nQW5kT2NjbHVkZWQoKTsKLSAgICAgICAgcHJlc3NIb21lQnV0dG9uKCk7Ci0gICAgICAgIHVubG9ja0RldmljZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHdoZXRoZXIgbXVsdGlwbGUgU0hPV19XSEVOX0xPQ0tFRCBhY3Rpdml0aWVzIGFyZSBzaG93biBpZiB0aGUgdG9wbW9zdCBpcyB0cmFuc2x1Y2VudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVTaG93V2hlbkxvY2tlZEFjdGl2aXRpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFpc0hhbmRoZWxkKCkgfHwgaXNVaU1vZGVMb2NrZWRUb1ZySGVhZHNldCgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoIlNob3dXaGVuTG9ja2VkQWN0aXZpdHkiKTsKLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoIlNob3dXaGVuTG9ja2VkVHJhbnNsdWNlbnRBY3Rpdml0eSIpOwotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCBuZXcgU3RyaW5nW10geyAiU2hvd1doZW5Mb2NrZWRBY3Rpdml0eSIsCi0gICAgICAgICAgICAgICAgIlNob3dXaGVuTG9ja2VkVHJhbnNsdWNlbnRBY3Rpdml0eSJ9KTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KCJTaG93V2hlbkxvY2tlZEFjdGl2aXR5IiwgdHJ1ZSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eSgiU2hvd1doZW5Mb2NrZWRUcmFuc2x1Y2VudEFjdGl2aXR5IiwgdHJ1ZSk7Ci0gICAgICAgIGdvdG9LZXlndWFyZCgpOwotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCBudWxsKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KCJTaG93V2hlbkxvY2tlZEFjdGl2aXR5IiwgdHJ1ZSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eSgiU2hvd1doZW5Mb2NrZWRUcmFuc2x1Y2VudEFjdGl2aXR5IiwgdHJ1ZSk7Ci0gICAgICAgIGFzc2VydFNob3dpbmdBbmRPY2NsdWRlZCgpOwotICAgICAgICBwcmVzc0hvbWVCdXR0b24oKTsKLSAgICAgICAgdW5sb2NrRGV2aWNlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgd2UgaGF2ZSBhIHRyYW5zbHVjZW50IFNIT1dfV0hFTl9MT0NLRURfQUNUSVZJVFksIHRoZSB3YWxscGFwZXIgc2hvdWxkIGFsc28gYmUgc2hvd2luZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VHJhbnNsdWNlbnRTaG93V2hlbkxvY2tlZEFjdGl2aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghaXNIYW5kaGVsZCgpIHx8IGlzVWlNb2RlTG9ja2VkVG9WckhlYWRzZXQoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGxhdW5jaEFjdGl2aXR5KCJTaG93V2hlbkxvY2tlZFRyYW5zbHVjZW50QWN0aXZpdHkiKTsKLSAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwgbmV3IFN0cmluZ1tdIHsgIlNob3dXaGVuTG9ja2VkVHJhbnNsdWNlbnRBY3Rpdml0eSJ9KTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KCJTaG93V2hlbkxvY2tlZFRyYW5zbHVjZW50QWN0aXZpdHkiLCB0cnVlKTsKLSAgICAgICAgZ290b0tleWd1YXJkKCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIG51bGwpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoIlNob3dXaGVuTG9ja2VkVHJhbnNsdWNlbnRBY3Rpdml0eSIsIHRydWUpOwotICAgICAgICBhc3NlcnRXYWxscGFwZXJTaG93aW5nKCk7Ci0gICAgICAgIGFzc2VydFNob3dpbmdBbmRPY2NsdWRlZCgpOwotICAgICAgICBwcmVzc0hvbWVCdXR0b24oKTsKLSAgICAgICAgdW5sb2NrRGV2aWNlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgd2UgaGF2ZSBhIHRyYW5zbHVjZW50IFNIT1dfV0hFTl9MT0NLRUQgYWN0aXZpdHksIHRoZSBhY3Rpdml0eSBiZWhpbmQgc2hvdWxkIG5vdCBiZSBzaG93bi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VHJhbnNsdWNlbnREb2VzbnRSZXZlYWxCZWhpbmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFpc0hhbmRoZWxkKCkgfHwgaXNVaU1vZGVMb2NrZWRUb1ZySGVhZHNldCgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoIlRlc3RBY3Rpdml0eSIpOwotICAgICAgICBsYXVuY2hBY3Rpdml0eSgiU2hvd1doZW5Mb2NrZWRUcmFuc2x1Y2VudEFjdGl2aXR5Iik7Ci0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIG5ldyBTdHJpbmdbXSB7ICJUZXN0QWN0aXZpdHkiLAotICAgICAgICAgICAgICAgICJTaG93V2hlbkxvY2tlZFRyYW5zbHVjZW50QWN0aXZpdHkifSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eSgiVGVzdEFjdGl2aXR5IiwgdHJ1ZSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eSgiU2hvd1doZW5Mb2NrZWRUcmFuc2x1Y2VudEFjdGl2aXR5IiwgdHJ1ZSk7Ci0gICAgICAgIGdvdG9LZXlndWFyZCgpOwotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCBudWxsKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KCJTaG93V2hlbkxvY2tlZFRyYW5zbHVjZW50QWN0aXZpdHkiLCB0cnVlKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KCJUZXN0QWN0aXZpdHkiLCBmYWxzZSk7Ci0gICAgICAgIGFzc2VydFNob3dpbmdBbmRPY2NsdWRlZCgpOwotICAgICAgICBwcmVzc0hvbWVCdXR0b24oKTsKLSAgICAgICAgdW5sb2NrRGV2aWNlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdERpYWxvZ1Nob3dXaGVuTG9ja2VkQWN0aXZpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFpc0hhbmRoZWxkKCkgfHwgaXNVaU1vZGVMb2NrZWRUb1ZySGVhZHNldCgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoIlNob3dXaGVuTG9ja2VkRGlhbG9nQWN0aXZpdHkiKTsKLSAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwgbmV3IFN0cmluZ1tdIHsgIlNob3dXaGVuTG9ja2VkRGlhbG9nQWN0aXZpdHkifSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eSgiU2hvd1doZW5Mb2NrZWREaWFsb2dBY3Rpdml0eSIsIHRydWUpOwotICAgICAgICBnb3RvS2V5Z3VhcmQoKTsKLSAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwgbnVsbCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eSgiU2hvd1doZW5Mb2NrZWREaWFsb2dBY3Rpdml0eSIsIHRydWUpOwotICAgICAgICBhc3NlcnRXYWxscGFwZXJTaG93aW5nKCk7Ci0gICAgICAgIGFzc2VydFNob3dpbmdBbmRPY2NsdWRlZCgpOwotICAgICAgICBwcmVzc0hvbWVCdXR0b24oKTsKLSAgICAgICAgdW5sb2NrRGV2aWNlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCB0aGF0IHNob3dXaGVuTG9ja2VkIGFjdGl2aXR5IGlzIGZ1bGxzY3JlZW4gd2hlbiBzaG93biBvdmVyIGtleWd1YXJkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFNob3dXaGVuTG9ja2VkQWN0aXZpdHlXaGlsZVNwbGl0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghaXNIYW5kaGVsZCgpIHx8IGlzVWlNb2RlTG9ja2VkVG9WckhlYWRzZXQoKSB8fCAhc3VwcG9ydHNTcGxpdFNjcmVlbk11bHRpV2luZG93KCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBsYXVuY2hBY3Rpdml0eUluRG9ja1N0YWNrKExBVU5DSElOR19BQ1RJVklUWSk7Ci0gICAgICAgIGxhdW5jaEFjdGl2aXR5VG9TaWRlKHRydWUsIGZhbHNlLCAiU2hvd1doZW5Mb2NrZWRBY3Rpdml0eSIpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoIlNob3dXaGVuTG9ja2VkQWN0aXZpdHkiLCB0cnVlKTsKLSAgICAgICAgZ290b0tleWd1YXJkKCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIG5ldyBTdHJpbmdbXSB7ICJTaG93V2hlbkxvY2tlZEFjdGl2aXR5IiB9KTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KCJTaG93V2hlbkxvY2tlZEFjdGl2aXR5IiwgdHJ1ZSk7Ci0gICAgICAgIGFzc2VydFNob3dpbmdBbmRPY2NsdWRlZCgpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydERvZXNOb3RDb250YWluU3RhY2soIkFjdGl2aXR5IG11c3QgYmUgZnVsbCBzY3JlZW4uIiwKLSAgICAgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXJUZXN0QmFzZS5ET0NLRURfU1RBQ0tfSUQpOwotICAgICAgICBwcmVzc0hvbWVCdXR0b24oKTsKLSAgICAgICAgdW5sb2NrRGV2aWNlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgd2hldGhlciBhIEZMQUdfRElTTUlTU19LRVlHVUFSRCBhY3Rpdml0eSBvY2NsdWRlcyBLZXlndWFyZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzbWlzc0tleWd1YXJkQWN0aXZpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFpc0hhbmRoZWxkKCkgfHwgaXNVaU1vZGVMb2NrZWRUb1ZySGVhZHNldCgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZ290b0tleWd1YXJkKCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIG51bGwpOwotICAgICAgICBhc3NlcnRUcnVlKG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEtleWd1YXJkQ29udHJvbGxlclN0YXRlKCkua2V5Z3VhcmRTaG93aW5nKTsKLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoIkRpc21pc3NLZXlndWFyZEFjdGl2aXR5Iik7Ci0gICAgICAgIG1BbVdtU3RhdGUud2FpdEZvcktleWd1YXJkU2hvd2luZ0FuZE9jY2x1ZGVkKG1EZXZpY2UpOwotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCBuZXcgU3RyaW5nW10geyAiRGlzbWlzc0tleWd1YXJkQWN0aXZpdHkifSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eSgiRGlzbWlzc0tleWd1YXJkQWN0aXZpdHkiLCB0cnVlKTsKLSAgICAgICAgYXNzZXJ0U2hvd2luZ0FuZE9jY2x1ZGVkKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdERpc21pc3NLZXlndWFyZEFjdGl2aXR5X21ldGhvZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIWlzSGFuZGhlbGQoKSB8fCBpc1VpTW9kZUxvY2tlZFRvVnJIZWFkc2V0KCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBTdHJpbmcgbG9nU2VwYXJhdG9yID0gY2xlYXJMb2djYXQoKTsKLSAgICAgICAgZ290b0tleWd1YXJkKCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIG51bGwpOwotICAgICAgICBhc3NlcnRUcnVlKG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEtleWd1YXJkQ29udHJvbGxlclN0YXRlKCkua2V5Z3VhcmRTaG93aW5nKTsKLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoIkRpc21pc3NLZXlndWFyZE1ldGhvZEFjdGl2aXR5Iik7Ci0gICAgICAgIG1BbVdtU3RhdGUud2FpdEZvcktleWd1YXJkR29uZShtRGV2aWNlKTsKLSAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwgbmV3IFN0cmluZ1tdIHsgIkRpc21pc3NLZXlndWFyZE1ldGhvZEFjdGl2aXR5In0pOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoIkRpc21pc3NLZXlndWFyZE1ldGhvZEFjdGl2aXR5IiwgdHJ1ZSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEtleWd1YXJkQ29udHJvbGxlclN0YXRlKCkua2V5Z3VhcmRTaG93aW5nKTsKLSAgICAgICAgYXNzZXJ0T25EaXNtaXNzU3VjY2VlZGVkSW5Mb2djYXQobG9nU2VwYXJhdG9yKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzbWlzc0tleWd1YXJkQWN0aXZpdHlfbWV0aG9kX25vdFRvcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIWlzSGFuZGhlbGQoKSB8fCBpc1VpTW9kZUxvY2tlZFRvVnJIZWFkc2V0KCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBTdHJpbmcgbG9nU2VwYXJhdG9yID0gY2xlYXJMb2djYXQoKTsKLSAgICAgICAgZ290b0tleWd1YXJkKCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIG51bGwpOwotICAgICAgICBhc3NlcnRUcnVlKG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEtleWd1YXJkQ29udHJvbGxlclN0YXRlKCkua2V5Z3VhcmRTaG93aW5nKTsKLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoIkJyb2FkY2FzdFJlY2VpdmVyQWN0aXZpdHkiKTsKLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoIlRlc3RBY3Rpdml0eSIpOwotICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKCJhbSBicm9hZGNhc3QgLWEgdHJpZ2dlcl9icm9hZGNhc3QgLS1leiBkaXNtaXNzS2V5Z3VhcmRNZXRob2QgdHJ1ZSIpOwotICAgICAgICBhc3NlcnRPbkRpc21pc3NFcnJvckluTG9nY2F0KGxvZ1NlcGFyYXRvcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdERpc21pc3NLZXlndWFyZEFjdGl2aXR5X21ldGhvZF90dXJuU2NyZWVuT24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFpc0hhbmRoZWxkKCkgfHwgaXNVaU1vZGVMb2NrZWRUb1ZySGVhZHNldCgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgU3RyaW5nIGxvZ1NlcGFyYXRvciA9IGNsZWFyTG9nY2F0KCk7Ci0gICAgICAgIHNsZWVwRGV2aWNlKCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIG51bGwpOwotICAgICAgICBhc3NlcnRUcnVlKG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEtleWd1YXJkQ29udHJvbGxlclN0YXRlKCkua2V5Z3VhcmRTaG93aW5nKTsKLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoIlR1cm5TY3JlZW5PbkRpc21pc3NLZXlndWFyZEFjdGl2aXR5Iik7Ci0gICAgICAgIG1BbVdtU3RhdGUud2FpdEZvcktleWd1YXJkR29uZShtRGV2aWNlKTsKLSAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwgbmV3IFN0cmluZ1tdIHsgIlR1cm5TY3JlZW5PbkRpc21pc3NLZXlndWFyZEFjdGl2aXR5In0pOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoIlR1cm5TY3JlZW5PbkRpc21pc3NLZXlndWFyZEFjdGl2aXR5IiwgdHJ1ZSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEtleWd1YXJkQ29udHJvbGxlclN0YXRlKCkua2V5Z3VhcmRTaG93aW5nKTsKLSAgICAgICAgYXNzZXJ0T25EaXNtaXNzU3VjY2VlZGVkSW5Mb2djYXQobG9nU2VwYXJhdG9yKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzbWlzc0tleWd1YXJkX2Zyb21TaG93V2hlbkxvY2tlZF9ub3RBbGxvd2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghaXNIYW5kaGVsZCgpIHx8IGlzVWlNb2RlTG9ja2VkVG9WckhlYWRzZXQoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGdvdG9LZXlndWFyZCgpOwotICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JLZXlndWFyZFNob3dpbmdBbmROb3RPY2NsdWRlZChtRGV2aWNlKTsKLSAgICAgICAgYXNzZXJ0U2hvd2luZ0FuZE5vdE9jY2x1ZGVkKCk7Ci0gICAgICAgIGxhdW5jaEFjdGl2aXR5KCJTaG93V2hlbkxvY2tlZEFjdGl2aXR5Iik7Ci0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIG5ldyBTdHJpbmdbXSB7ICJTaG93V2hlbkxvY2tlZEFjdGl2aXR5IiB9KTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KCJTaG93V2hlbkxvY2tlZEFjdGl2aXR5IiwgdHJ1ZSk7Ci0gICAgICAgIGFzc2VydFNob3dpbmdBbmRPY2NsdWRlZCgpOwotICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKCJhbSBicm9hZGNhc3QgLWEgdHJpZ2dlcl9icm9hZGNhc3QgLS1leiBkaXNtaXNzS2V5Z3VhcmQgdHJ1ZSIpOwotICAgICAgICBhc3NlcnRTaG93aW5nQW5kT2NjbHVkZWQoKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KCJTaG93V2hlbkxvY2tlZEFjdGl2aXR5IiwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEtleWd1YXJkTG9jaygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIWlzSGFuZGhlbGQoKSB8fCBpc1VpTW9kZUxvY2tlZFRvVnJIZWFkc2V0KCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBnb3RvS2V5Z3VhcmQoKTsKLSAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yS2V5Z3VhcmRTaG93aW5nQW5kTm90T2NjbHVkZWQobURldmljZSk7Ci0gICAgICAgIGFzc2VydFNob3dpbmdBbmROb3RPY2NsdWRlZCgpOwotICAgICAgICBsYXVuY2hBY3Rpdml0eSgiS2V5Z3VhcmRMb2NrQWN0aXZpdHkiKTsKLSAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwgbmV3IFN0cmluZ1tdIHsgIktleWd1YXJkTG9ja0FjdGl2aXR5IiB9KTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KCJLZXlndWFyZExvY2tBY3Rpdml0eSIsIHRydWUpOwotICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKEZJTklTSF9BQ1RJVklUWV9CUk9BRENBU1QpOwotICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JLZXlndWFyZFNob3dpbmdBbmROb3RPY2NsdWRlZChtRGV2aWNlKTsKLSAgICAgICAgYXNzZXJ0U2hvd2luZ0FuZE5vdE9jY2x1ZGVkKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFVub2NjbHVkZVJvdGF0aW9uQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghaXNIYW5kaGVsZCgpIHx8IGlzVWlNb2RlTG9ja2VkVG9WckhlYWRzZXQoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGdvdG9LZXlndWFyZCgpOwotICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JLZXlndWFyZFNob3dpbmdBbmROb3RPY2NsdWRlZChtRGV2aWNlKTsKLSAgICAgICAgYXNzZXJ0U2hvd2luZ0FuZE5vdE9jY2x1ZGVkKCk7Ci0gICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoZ2V0QW1TdGFydENtZCgiU2hvd1doZW5Mb2NrZWRBY3Rpdml0eSIpKTsKLSAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwgbmV3IFN0cmluZ1tdIHsgIlNob3dXaGVuTG9ja2VkQWN0aXZpdHkiIH0pOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoIlNob3dXaGVuTG9ja2VkQWN0aXZpdHkiLCB0cnVlKTsKLSAgICAgICAgc2V0RGV2aWNlUm90YXRpb24oMSk7Ci0gICAgICAgIHByZXNzSG9tZUJ1dHRvbigpOwotICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JLZXlndWFyZFNob3dpbmdBbmROb3RPY2NsdWRlZChtRGV2aWNlKTsKLSAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yRGlzcGxheVVuZnJvemVuKG1EZXZpY2UpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFNhbml0eSgpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEhvbWVBY3Rpdml0eVZpc2libGUoZmFsc2UpOwotICAgICAgICBhc3NlcnRTaG93aW5nQW5kTm90T2NjbHVkZWQoKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KCJTaG93V2hlbkxvY2tlZEFjdGl2aXR5IiwgZmFsc2UpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRXYWxscGFwZXJTaG93aW5nKCkgewotICAgICAgICBXaW5kb3dTdGF0ZSB3YWxscGFwZXIgPQotICAgICAgICAgICAgICAgIG1BbVdtU3RhdGUuZ2V0V21TdGF0ZSgpLmZpbmRGaXJzdFdpbmRvd1dpdGhUeXBlKFdpbmRvd1N0YXRlLlRZUEVfV0FMTFBBUEVSKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh3YWxscGFwZXIpOwotICAgICAgICBhc3NlcnRUcnVlKHdhbGxwYXBlci5pc1Nob3duKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REaXNtaXNzS2V5Z3VhcmRBdHRyQWN0aXZpdHlfbWV0aG9kX3R1cm5TY3JlZW5PbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIWlzSGFuZGhlbGQoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIGFjdGl2aXR5TmFtZSA9ICJUdXJuU2NyZWVuT25BdHRyRGlzbWlzc0tleWd1YXJkQWN0aXZpdHkiOwotICAgICAgICBzbGVlcERldmljZSgpOwotCi0gICAgICAgIGZpbmFsIFN0cmluZyBsb2dTZXBhcmF0b3IgPSBjbGVhckxvZ2NhdCgpOwotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRLZXlndWFyZENvbnRyb2xsZXJTdGF0ZSgpLmtleWd1YXJkU2hvd2luZyk7Ci0gICAgICAgIGxhdW5jaEFjdGl2aXR5KGFjdGl2aXR5TmFtZSk7Ci0gICAgICAgIG1BbVdtU3RhdGUud2FpdEZvcktleWd1YXJkR29uZShtRGV2aWNlKTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KGFjdGl2aXR5TmFtZSwgdHJ1ZSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEtleWd1YXJkQ29udHJvbGxlclN0YXRlKCkua2V5Z3VhcmRTaG93aW5nKTsKLSAgICAgICAgYXNzZXJ0T25EaXNtaXNzU3VjY2VlZGVkSW5Mb2djYXQobG9nU2VwYXJhdG9yKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShpc0Rpc3BsYXlPbigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzbWlzc0tleWd1YXJkQXR0ckFjdGl2aXR5X21ldGhvZF90dXJuU2NyZWVuT25fd2l0aFNlY3VyZUtleWd1YXJkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghaXNIYW5kaGVsZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBTdHJpbmcgYWN0aXZpdHlOYW1lID0gIlR1cm5TY3JlZW5PbkF0dHJEaXNtaXNzS2V5Z3VhcmRBY3Rpdml0eSI7Ci0KLSAgICAgICAgc2V0TG9ja0NyZWRlbnRpYWwoKTsKLSAgICAgICAgc2xlZXBEZXZpY2UoKTsKLQotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRLZXlndWFyZENvbnRyb2xsZXJTdGF0ZSgpLmtleWd1YXJkU2hvd2luZyk7Ci0gICAgICAgIGxhdW5jaEFjdGl2aXR5KGFjdGl2aXR5TmFtZSk7Ci0gICAgICAgIG1BbVdtU3RhdGUud2FpdEZvcktleWd1YXJkU2hvd2luZ0FuZE5vdE9jY2x1ZGVkKG1EZXZpY2UpOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoYWN0aXZpdHlOYW1lLCBmYWxzZSk7Ci0gICAgICAgIGFzc2VydFRydWUobUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0S2V5Z3VhcmRDb250cm9sbGVyU3RhdGUoKS5rZXlndWFyZFNob3dpbmcpOwotICAgICAgICBhc3NlcnRUcnVlKGlzRGlzcGxheU9uKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTY3JlZW5PZmZXaGlsZU9jY2x1ZGVkU3RvcHNBY3Rpdml0eSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIWlzSGFuZGhlbGQoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIGxvZ1NlcGFyYXRvciA9IGNsZWFyTG9nY2F0KCk7Ci0gICAgICAgIGdvdG9LZXlndWFyZCgpOwotICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JLZXlndWFyZFNob3dpbmdBbmROb3RPY2NsdWRlZChtRGV2aWNlKTsKLSAgICAgICAgYXNzZXJ0U2hvd2luZ0FuZE5vdE9jY2x1ZGVkKCk7Ci0gICAgICAgIGxhdW5jaEFjdGl2aXR5KCJTaG93V2hlbkxvY2tlZEF0dHJBY3Rpdml0eSIpOwotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCBuZXcgU3RyaW5nW10geyAiU2hvd1doZW5Mb2NrZWRBdHRyQWN0aXZpdHkiIH0pOwotICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoIlNob3dXaGVuTG9ja2VkQXR0ckFjdGl2aXR5IiwgdHJ1ZSk7Ci0gICAgICAgIGFzc2VydFNob3dpbmdBbmRPY2NsdWRlZCgpOwotICAgICAgICBzbGVlcERldmljZSgpOwotICAgICAgICBhc3NlcnRTaW5nbGVMYXVuY2hBbmRTdG9wKCJTaG93V2hlbkxvY2tlZEF0dHJBY3Rpdml0eSIsIGxvZ1NlcGFyYXRvcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNjcmVlbk9mZkNhdXNlc1NpbmdsZVN0b3AoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFpc0hhbmRoZWxkKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIFN0cmluZyBsb2dTZXBhcmF0b3IgPSBjbGVhckxvZ2NhdCgpOwotICAgICAgICBsYXVuY2hBY3Rpdml0eSgiVGVzdEFjdGl2aXR5Iik7Ci0gICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eSgiVGVzdEFjdGl2aXR5IiwgdHJ1ZSk7Ci0gICAgICAgIHNsZWVwRGV2aWNlKCk7Ci0gICAgICAgIGFzc2VydFNpbmdsZUxhdW5jaEFuZFN0b3AoIlRlc3RBY3Rpdml0eSIsIGxvZ1NlcGFyYXRvcik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvS2V5Z3VhcmRUcmFuc2l0aW9uVGVzdHMuamF2YSBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0tleWd1YXJkVHJhbnNpdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NzFjY2IuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvS2V5Z3VhcmRUcmFuc2l0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuc2VydmVyLmN0czsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5jdHMuV2luZG93TWFuYWdlclN0YXRlLlRSQU5TSVRfQUNUSVZJVFlfT1BFTjsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuY3RzLldpbmRvd01hbmFnZXJTdGF0ZS5UUkFOU0lUX0tFWUdVQVJEX0dPSU5HX0FXQVk7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmN0cy5XaW5kb3dNYW5hZ2VyU3RhdGUuVFJBTlNJVF9LRVlHVUFSRF9HT0lOR19BV0FZX09OX1dBTExQQVBFUjsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuY3RzLldpbmRvd01hbmFnZXJTdGF0ZS5UUkFOU0lUX0tFWUdVQVJEX09DQ0xVREU7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmN0cy5XaW5kb3dNYW5hZ2VyU3RhdGUuVFJBTlNJVF9LRVlHVUFSRF9VTk9DQ0xVREU7Ci0KLS8qKgotICogQnVpbGQ6IG1tbWEgLWozMiBjdHMvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcwotICogUnVuOiBjdHMvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvdXRpbC9ydW4tdGVzdCBDdHNTZXJ2aWNlc0hvc3RUZXN0Q2FzZXMgYW5kcm9pZC5zZXJ2ZXIuY3RzLktleWd1YXJkVHJhbnNpdGlvblRlc3RzCi0gKi8KLXB1YmxpYyBjbGFzcyBLZXlndWFyZFRyYW5zaXRpb25UZXN0cyBleHRlbmRzIEFjdGl2aXR5TWFuYWdlclRlc3RCYXNlIHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0KLSAgICAgICAgLy8gU2V0IHNjcmVlbiBsb2NrIChzd2lwZSkKLSAgICAgICAgc2V0TG9ja0Rpc2FibGVkKGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VW5sb2NrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghaXNIYW5kaGVsZCgpIHx8IGlzVWlNb2RlTG9ja2VkVG9WckhlYWRzZXQoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGxhdW5jaEFjdGl2aXR5KCJUZXN0QWN0aXZpdHkiKTsKLSAgICAgICAgZ290b0tleWd1YXJkKCk7Ci0gICAgICAgIHVubG9ja0RldmljZSgpOwotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCBuZXcgU3RyaW5nW10geyAiVGVzdEFjdGl2aXR5In0gKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJQaWNrZWQgd3JvbmcgdHJhbnNpdGlvbiIsIFRSQU5TSVRfS0VZR1VBUkRfR09JTkdfQVdBWSwKLSAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLmdldFdtU3RhdGUoKS5nZXRMYXN0VHJhbnNpdGlvbigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VW5sb2NrV2FsbHBhcGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghaXNIYW5kaGVsZCgpIHx8IGlzVWlNb2RlTG9ja2VkVG9WckhlYWRzZXQoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGxhdW5jaEFjdGl2aXR5KCJXYWxscGFwZXJBY3Rpdml0eSIpOwotICAgICAgICBnb3RvS2V5Z3VhcmQoKTsKLSAgICAgICAgdW5sb2NrRGV2aWNlKCk7Ci0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIG5ldyBTdHJpbmdbXSB7ICJXYWxscGFwZXJBY3Rpdml0eSJ9ICk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiUGlja2VkIHdyb25nIHRyYW5zaXRpb24iLCBUUkFOU0lUX0tFWUdVQVJEX0dPSU5HX0FXQVlfT05fV0FMTFBBUEVSLAotICAgICAgICAgICAgICAgIG1BbVdtU3RhdGUuZ2V0V21TdGF0ZSgpLmdldExhc3RUcmFuc2l0aW9uKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RPY2NsdWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghaXNIYW5kaGVsZCgpIHx8IGlzVWlNb2RlTG9ja2VkVG9WckhlYWRzZXQoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGdvdG9LZXlndWFyZCgpOwotICAgICAgICBsYXVuY2hBY3Rpdml0eSgiU2hvd1doZW5Mb2NrZWRBY3Rpdml0eSIpOwotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCBuZXcgU3RyaW5nW10geyAiU2hvd1doZW5Mb2NrZWRBY3Rpdml0eSJ9ICk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiUGlja2VkIHdyb25nIHRyYW5zaXRpb24iLCBUUkFOU0lUX0tFWUdVQVJEX09DQ0xVREUsCi0gICAgICAgICAgICAgICAgbUFtV21TdGF0ZS5nZXRXbVN0YXRlKCkuZ2V0TGFzdFRyYW5zaXRpb24oKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFVub2NjbHVkZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIWlzSGFuZGhlbGQoKSB8fCBpc1VpTW9kZUxvY2tlZFRvVnJIZWFkc2V0KCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBnb3RvS2V5Z3VhcmQoKTsKLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoIlNob3dXaGVuTG9ja2VkQWN0aXZpdHkiKTsKLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoIlRlc3RBY3Rpdml0eSIpOwotICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JLZXlndWFyZFNob3dpbmdBbmROb3RPY2NsdWRlZChtRGV2aWNlKTsKLSAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiUGlja2VkIHdyb25nIHRyYW5zaXRpb24iLCBUUkFOU0lUX0tFWUdVQVJEX1VOT0NDTFVERSwKLSAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLmdldFdtU3RhdGUoKS5nZXRMYXN0VHJhbnNpdGlvbigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmV3QWN0aXZpdHlEdXJpbmdPY2NsdWRlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIWlzSGFuZGhlbGQoKSB8fCBpc1VpTW9kZUxvY2tlZFRvVnJIZWFkc2V0KCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBsYXVuY2hBY3Rpdml0eSgiU2hvd1doZW5Mb2NrZWRBY3Rpdml0eSIpOwotICAgICAgICBnb3RvS2V5Z3VhcmQoKTsKLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoIlNob3dXaGVuTG9ja2VkV2l0aERpYWxvZ0FjdGl2aXR5Iik7Ci0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIG5ldyBTdHJpbmdbXSB7ICJTaG93V2hlbkxvY2tlZFdpdGhEaWFsb2dBY3Rpdml0eSIgfSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiUGlja2VkIHdyb25nIHRyYW5zaXRpb24iLCBUUkFOU0lUX0FDVElWSVRZX09QRU4sCi0gICAgICAgICAgICAgICAgbUFtV21TdGF0ZS5nZXRXbVN0YXRlKCkuZ2V0TGFzdFRyYW5zaXRpb24oKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE9jY2x1ZGVNYW5pZmVzdEF0dHIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgIGlmICghaXNIYW5kaGVsZCgpKSB7Ci0gICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgfQotCi0gICAgICAgICBTdHJpbmcgYWN0aXZpdHlOYW1lID0gIlNob3dXaGVuTG9ja2VkQXR0ckFjdGl2aXR5IjsKLQotICAgICAgICAgZ290b0tleWd1YXJkKCk7Ci0gICAgICAgICBmaW5hbCBTdHJpbmcgbG9nU2VwYXJhdG9yID0gY2xlYXJMb2djYXQoKTsKLSAgICAgICAgIGxhdW5jaEFjdGl2aXR5KGFjdGl2aXR5TmFtZSk7Ci0gICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCBuZXcgU3RyaW5nW10ge2FjdGl2aXR5TmFtZX0pOwotICAgICAgICAgYXNzZXJ0RXF1YWxzKCJQaWNrZWQgd3JvbmcgdHJhbnNpdGlvbiIsIFRSQU5TSVRfS0VZR1VBUkRfT0NDTFVERSwKLSAgICAgICAgICAgICAgICAgbUFtV21TdGF0ZS5nZXRXbVN0YXRlKCkuZ2V0TGFzdFRyYW5zaXRpb24oKSk7Ci0gICAgICAgICBhc3NlcnRTaW5nbGVMYXVuY2goYWN0aXZpdHlOYW1lLCBsb2dTZXBhcmF0b3IpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RPY2NsdWRlQXR0clJlbW92ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIWlzSGFuZGhlbGQoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGFjdGl2aXR5TmFtZSA9ICJTaG93V2hlbkxvY2tlZEF0dHJSZW1vdmVBdHRyQWN0aXZpdHkiOwotCi0gICAgICAgIGdvdG9LZXlndWFyZCgpOwotICAgICAgICBTdHJpbmcgbG9nU2VwYXJhdG9yID0gY2xlYXJMb2djYXQoKTsKLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoYWN0aXZpdHlOYW1lKTsKLSAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwgbmV3IFN0cmluZ1tdIHthY3Rpdml0eU5hbWV9KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJQaWNrZWQgd3JvbmcgdHJhbnNpdGlvbiIsIFRSQU5TSVRfS0VZR1VBUkRfT0NDTFVERSwKLSAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLmdldFdtU3RhdGUoKS5nZXRMYXN0VHJhbnNpdGlvbigpKTsKLSAgICAgICAgYXNzZXJ0U2luZ2xlTGF1bmNoKGFjdGl2aXR5TmFtZSwgbG9nU2VwYXJhdG9yKTsKLQotICAgICAgICBnb3RvS2V5Z3VhcmQoKTsKLSAgICAgICAgbG9nU2VwYXJhdG9yID0gY2xlYXJMb2djYXQoKTsKLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoYWN0aXZpdHlOYW1lKTsKLSAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwgbmV3IFN0cmluZ1tdIHthY3Rpdml0eU5hbWV9KTsKLSAgICAgICAgYXNzZXJ0U2luZ2xlU3RhcnRBbmRTdG9wKGFjdGl2aXR5TmFtZSwgbG9nU2VwYXJhdG9yKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmV3QWN0aXZpdHlEdXJpbmdPY2NsdWRlZFdpdGhBdHRyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghaXNIYW5kaGVsZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgYWN0aXZpdHlOYW1lMSA9ICJTaG93V2hlbkxvY2tlZEF0dHJBY3Rpdml0eSI7Ci0gICAgICAgIFN0cmluZyBhY3Rpdml0eU5hbWUyID0gIlNob3dXaGVuTG9ja2VkQXR0cldpdGhEaWFsb2dBY3Rpdml0eSI7Ci0KLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoYWN0aXZpdHlOYW1lMSk7Ci0gICAgICAgIGdvdG9LZXlndWFyZCgpOwotICAgICAgICBsYXVuY2hBY3Rpdml0eShhY3Rpdml0eU5hbWUyKTsKLSAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobURldmljZSwgbmV3IFN0cmluZ1tdIHsgYWN0aXZpdHlOYW1lMiB9KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJQaWNrZWQgd3JvbmcgdHJhbnNpdGlvbiIsIFRSQU5TSVRfQUNUSVZJVFlfT1BFTiwKLSAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLmdldFdtU3RhdGUoKS5nZXRMYXN0VHJhbnNpdGlvbigpKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL1NwbGFzaHNjcmVlblRlc3RzLmphdmEgYi9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9TcGxhc2hzY3JlZW5UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDdmMzgzLi4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL1NwbGFzaHNjcmVlblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuc2VydmVyLmN0czsKLQotaW1wb3J0IGphdmEuYXd0LkNvbG9yOwotaW1wb3J0IGphdmEuYXd0LlJlY3RhbmdsZTsKLWltcG9ydCBqYXZhLmF3dC5pbWFnZS5CdWZmZXJlZEltYWdlOwotCi0vKioKLSAqIEJ1aWxkOiBtbW1hIC1qMzIgY3RzL2hvc3RzaWRldGVzdHMvc2VydmljZXMKLSAqIFJ1bjogY3RzL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL3V0aWwvcnVuLXRlc3QgQ3RzU2VydmljZXNIb3N0VGVzdENhc2VzIGFuZHJvaWQuc2VydmVyLmN0cy5TcGxhc2hzY3JlZW5UZXN0cwotICovCi1wdWJsaWMgY2xhc3MgU3BsYXNoc2NyZWVuVGVzdHMgZXh0ZW5kcyBBY3Rpdml0eU1hbmFnZXJUZXN0QmFzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3BsYXNoc2NyZWVuQ29udGVudCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBsYXVuY2hBY3Rpdml0eU5vV2FpdCgiU3BsYXNoc2NyZWVuQWN0aXZpdHkiKTsKLSAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yQXBwVHJhbnNpdGlvbklkbGUobURldmljZSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuZ2V0V21TdGF0ZSgpLmdldFN0YWJsZUJvdW5kcygpOwotICAgICAgICBmaW5hbCBCdWZmZXJlZEltYWdlIGltYWdlID0gdGFrZVNjcmVlbnNob3QoKTsKLQotICAgICAgICAvLyBVc2UgcmF0aW9zIHRvIGZsZXhpYmx5IGFjY29tb2RhdGUgY2lyY3VsYXIgb3Igbm90IHF1aXRlIHJlY3Rhbmd1bGFyIGRpc3BsYXlzCi0gICAgICAgIC8vIE5vdGU6IENvbG9yLkJMQUNLIGlzIHRoZSBwaXhlbCBjb2xvciBvdXRzaWRlIG9mIHRoZSBkaXNwbGF5IHJlZ2lvbgotICAgICAgICBhc3NlcnRDb2xvcnMoaW1hZ2UsIG1BbVdtU3RhdGUuZ2V0V21TdGF0ZSgpLmdldFN0YWJsZUJvdW5kcygpLAotICAgICAgICAgICAgQ29sb3IuUkVELmdldFJHQigpLCAwLjUwZiwgQ29sb3IuQkxBQ0suZ2V0UkdCKCksIDAuMDFmKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0Q29sb3JzKEJ1ZmZlcmVkSW1hZ2UgaW1nLCBSZWN0YW5nbGUgYm91bmRzLCBpbnQgcHJpbWFyeUNvbG9yLAotICAgICAgICBmbG9hdCBleHBlY3RlZFByaW1hcnlSYXRpbywgaW50IHNlY29uZGFyeUNvbG9yLCBmbG9hdCBhY2NlcHRhYmxlV3JvbmdSYXRpbykgewotCi0gICAgICAgIGludCBwcmltYXJ5UGl4ZWxzID0gMDsKLSAgICAgICAgaW50IHNlY29uZGFyeVBpeGVscyA9IDA7Ci0gICAgICAgIGludCB3cm9uZ1BpeGVscyA9IDA7Ci0gICAgICAgIGZvciAoaW50IHggPSBib3VuZHMueDsgeCA8IGJvdW5kcy54ICsgYm91bmRzLndpZHRoOyB4KyspIHsKLSAgICAgICAgICAgIGZvciAoaW50IHkgPSBib3VuZHMueTsgeSA8IGJvdW5kcy55ICsgYm91bmRzLmhlaWdodDsgeSsrKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh4IDwgaW1nLmdldFdpZHRoKCkpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoeSA8IGltZy5nZXRIZWlnaHQoKSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGNvbG9yID0gaW1nLmdldFJHQih4LCB5KTsKLSAgICAgICAgICAgICAgICBpZiAocHJpbWFyeUNvbG9yID09IGNvbG9yKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW1hcnlQaXhlbHMrKzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlY29uZGFyeUNvbG9yID09IGNvbG9yKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlY29uZGFyeVBpeGVscysrOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHdyb25nUGl4ZWxzKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgaW50IHRvdGFsUGl4ZWxzID0gYm91bmRzLndpZHRoICogYm91bmRzLmhlaWdodDsKLSAgICAgICAgZmluYWwgZmxvYXQgcHJpbWFyeVJhdGlvID0gKGZsb2F0KSBwcmltYXJ5UGl4ZWxzIC8gdG90YWxQaXhlbHM7Ci0gICAgICAgIGlmIChwcmltYXJ5UmF0aW8gPCBleHBlY3RlZFByaW1hcnlSYXRpbykgewotICAgICAgICAgICAgZmFpbCgiTGVzcyB0aGFuICIgKyAoZXhwZWN0ZWRQcmltYXJ5UmF0aW8gKiAxMDAuMGYpCi0gICAgICAgICAgICAgICAgICAgICsgIiUgb2YgcGl4ZWxzIGhhdmUgbm9uLXByaW1hcnkgY29sb3IgcHJpbWFyeVBpeGVscz0iICsgcHJpbWFyeVBpeGVscwotICAgICAgICAgICAgICAgICAgICArICIgc2Vjb25kYXJ5UGl4ZWxzPSIgKyBzZWNvbmRhcnlQaXhlbHMgKyAiIHdyb25nUGl4ZWxzPSIgKyB3cm9uZ1BpeGVscyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTb21lIHBpeGVscyBtaWdodCBiZSBjb3ZlcmVkIGJ5IHNjcmVlbiBzaGFwZSBkZWNvcmF0aW9ucywgbGlrZSByb3VuZGVkIGNvcm5lcnMuCi0gICAgICAgIC8vIE9uIGNpcmN1bGFyIGRpc3BsYXlzLCB0aGVyZSBpcyBhbiBhbnRpYWxpYXNlZCBlZGdlLgotICAgICAgICBmaW5hbCBmbG9hdCB3cm9uZ1JhdGlvID0gKGZsb2F0KSB3cm9uZ1BpeGVscyAvIHRvdGFsUGl4ZWxzOwotICAgICAgICBpZiAod3JvbmdSYXRpbyA+IGFjY2VwdGFibGVXcm9uZ1JhdGlvKSB7Ci0gICAgICAgICAgICBmYWlsKCJNb3JlIHRoYW4gIiArIChhY2NlcHRhYmxlV3JvbmdSYXRpbyAqIDEwMC4wZikKLSAgICAgICAgICAgICAgICAgICAgKyAiJSBvZiBwaXhlbHMgaGF2ZSB3cm9uZyBjb2xvciBwcmltYXJ5UGl4ZWxzPSIgKyBwcmltYXJ5UGl4ZWxzCi0gICAgICAgICAgICAgICAgICAgICsgIiBzZWNvbmRhcnlQaXhlbHM9IiArIHNlY29uZGFyeVBpeGVscyArICIgd3JvbmdQaXhlbHM9IiArIHdyb25nUGl4ZWxzKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci90cmFuc2x1Y2VudGFwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL3RyYW5zbHVjZW50YXBwL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMDc1ZTEuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL3RyYW5zbHVjZW50YXBwL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLSMgRG9uJ3QgaW5jbHVkZSB0aGlzIHBhY2thZ2UgaW4gYW55IHRhcmdldC4KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSBcCi0gICAgJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpIFwKLQotTE9DQUxfU0RLX1ZFUlNJT04gOj0gdGVzdF9jdXJyZW50Ci0KLSMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCi0KLUxPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNEZXZpY2VUcmFuc2x1Y2VudFRlc3RBcHAKLQotaW5jbHVkZSAkKEJVSUxEX0NUU19TVVBQT1JUX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvdHJhbnNsdWNlbnRhcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci90cmFuc2x1Y2VudGFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZTNiZmY4Li4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci90cmFuc2x1Y2VudGFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0KLSAgfiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQotICAtLT4KLQotPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgICB4bWxuczphbmRyb2lkcHJ2PSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcHJ2L3Jlcy9hbmRyb2lkIgotICAgICAgICAgIHBhY2thZ2U9ImFuZHJvaWQuc2VydmVyLnRyYW5zbHVjZW50YXBwIj4KLSAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpsYWJlbD0iQ3RzVHJhbnNsdWNlbnRBcHAiPgotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuVHJhbnNsdWNlbnRMYW5kc2NhcGVBY3Rpdml0eSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5UcmFuc2x1Y2VudC5Ob1RpdGxlQmFyIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpzY3JlZW5PcmllbnRhdGlvbj0ibGFuZHNjYXBlIj4KLSAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgotICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIvPgotICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIi8+Ci0gICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+Ci0gICAgICAgIDwvYWN0aXZpdHk+Ci0gICAgPC9hcHBsaWNhdGlvbj4KLTwvbWFuaWZlc3Q+Ci0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci90cmFuc2x1Y2VudGFwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvdHJhbnNsdWNlbnRhcHAvVHJhbnNsdWNlbnRMYW5kc2NhcGVBY3Rpdml0eS5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL3RyYW5zbHVjZW50YXBwL3NyYy9hbmRyb2lkL3NlcnZlci90cmFuc2x1Y2VudGFwcC9UcmFuc2x1Y2VudExhbmRzY2FwZUFjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MWUzYjYuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL3RyYW5zbHVjZW50YXBwL3NyYy9hbmRyb2lkL3NlcnZlci90cmFuc2x1Y2VudGFwcC9UcmFuc2x1Y2VudExhbmRzY2FwZUFjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuc2VydmVyLnRyYW5zbHVjZW50YXBwOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7Ci0KLXB1YmxpYyBjbGFzcyBUcmFuc2x1Y2VudExhbmRzY2FwZUFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgewotfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvZGlzcGxheXNlcnZpY2VhcHAvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2Rpc3BsYXlzZXJ2aWNlYXBwL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3OThkODcuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvZGlzcGxheXNlcnZpY2VhcHAvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWluY2x1ZGUgJChjYWxsIGFsbC1zdWJkaXItbWFrZWZpbGVzKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvZGlzcGxheXNlcnZpY2VhcHAvYXBwL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9kaXNwbGF5c2VydmljZWFwcC9hcHAvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzljYjdlZi4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9kaXNwbGF5c2VydmljZWFwcC9hcHAvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotIyBEb24ndCBpbmNsdWRlIHRoaXMgcGFja2FnZSBpbiBhbnkgdGFyZ2V0LgotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLQotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKSBcCi0KLUxPQ0FMX1NES19WRVJTSU9OIDo9IHRlc3RfY3VycmVudAotCi0jIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0Ci1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cwotCi1MT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzRGlzcGxheVNlcnZpY2VBcHAKLQotaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQotCi1pbmNsdWRlICQoQlVJTERfQ1RTX1NVUFBPUlRfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2Rpc3BsYXlzZXJ2aWNlYXBwL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvZGlzcGxheXNlcnZpY2VhcHAvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzYWU1NWUuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvZGlzcGxheXNlcnZpY2VhcHAvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLQotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci08bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICAgIHhtbG5zOmFuZHJvaWRwcnY9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9wcnYvcmVzL2FuZHJvaWQiCi0gICAgICAgICAgcGFja2FnZT0iYW5kcm9pZC5zZXJ2ZXIuZGlzcGxheXNlcnZpY2UiPgotICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uV0FLRV9MT0NLIiAvPgotICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJDdHNEaXNwbGF5U2VydmljZSI+Ci0gICAgICAgIDxzZXJ2aWNlIGFuZHJvaWQ6bmFtZT0iLlZpcnR1YWxEaXNwbGF5U2VydmljZSIKLSAgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIgLz4KLSAgICA8L2FwcGxpY2F0aW9uPgotPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2Rpc3BsYXlzZXJ2aWNlYXBwL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvZGlzcGxheXNlcnZpY2UvVmlydHVhbERpc3BsYXlTZXJ2aWNlLmphdmEgYi9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9kaXNwbGF5c2VydmljZWFwcC9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2Rpc3BsYXlzZXJ2aWNlL1ZpcnR1YWxEaXNwbGF5U2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjU4OTYzLi4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2Rpc3BsYXlzZXJ2aWNlYXBwL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvZGlzcGxheXNlcnZpY2UvVmlydHVhbERpc3BsYXlTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnNlcnZlci5kaXNwbGF5c2VydmljZTsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmhhcmR3YXJlLmRpc3BsYXkuRGlzcGxheU1hbmFnZXIuVklSVFVBTF9ESVNQTEFZX0ZMQUdfT1dOX0NPTlRFTlRfT05MWTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5oYXJkd2FyZS5kaXNwbGF5LkRpc3BsYXlNYW5hZ2VyLlZJUlRVQUxfRElTUExBWV9GTEFHX1BSRVNFTlRBVElPTjsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbjsKLWltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb25DaGFubmVsOwotaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbk1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuU2VydmljZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGl4ZWxGb3JtYXQ7Ci1pbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5kaXNwbGF5LkRpc3BsYXlNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuZGlzcGxheS5WaXJ0dWFsRGlzcGxheTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkltYWdlUmVhZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlOwotCi1wdWJsaWMgY2xhc3MgVmlydHVhbERpc3BsYXlTZXJ2aWNlIGV4dGVuZHMgU2VydmljZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVElGSUNBVElPTl9DSEFOTkVMX0lEID0gImN0cy9WaXJ0dWFsRGlzcGxheVNlcnZpY2UiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiVmlydHVhbERpc3BsYXlTZXJ2aWNlIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGT1JFR1JPVU5EX0lEID0gMTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERU5TSVRZID0gMTYwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIRUlHSFQgPSA0ODA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdJRFRIID0gODAwOwotCi0gICAgcHJpdmF0ZSBJbWFnZVJlYWRlciBtUmVhZGVyOwotICAgIHByaXZhdGUgVmlydHVhbERpc3BsYXkgbVZpcnR1YWxEaXNwbGF5OwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25DcmVhdGUoKSB7Ci0gICAgICAgIHN1cGVyLm9uQ3JlYXRlKCk7Ci0KLSAgICAgICAgTm90aWZpY2F0aW9uTWFuYWdlciBub3RpZmljYXRpb25NYW5hZ2VyID0gZ2V0U3lzdGVtU2VydmljZShOb3RpZmljYXRpb25NYW5hZ2VyLmNsYXNzKTsKLSAgICAgICAgbm90aWZpY2F0aW9uTWFuYWdlci5jcmVhdGVOb3RpZmljYXRpb25DaGFubmVsKG5ldyBOb3RpZmljYXRpb25DaGFubmVsKAotICAgICAgICAgICAgTk9USUZJQ0FUSU9OX0NIQU5ORUxfSUQsIE5PVElGSUNBVElPTl9DSEFOTkVMX0lELAotICAgICAgICAgICAgTm90aWZpY2F0aW9uTWFuYWdlci5JTVBPUlRBTkNFX0RFRkFVTFQpKTsKLSAgICAgICAgTm90aWZpY2F0aW9uIG5vdGlmID0gbmV3IE5vdGlmaWNhdGlvbi5CdWlsZGVyKHRoaXMsIE5PVElGSUNBVElPTl9DSEFOTkVMX0lEKQotICAgICAgICAgICAgICAgIC5zZXRTbWFsbEljb24oYW5kcm9pZC5SLmRyYXdhYmxlLmljX2RpYWxvZ19hbGVydCkKLSAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLSAgICAgICAgc3RhcnRGb3JlZ3JvdW5kKEZPUkVHUk9VTkRfSUQsIG5vdGlmKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IG9uU3RhcnRDb21tYW5kKEludGVudCBpbnRlbnQsIGludCBmbGFncywgaW50IHN0YXJ0SWQpIHsKLSAgICAgICAgU3RyaW5nIGNvbW1hbmQgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoImNvbW1hbmQiKTsKLSAgICAgICAgTG9nLmQoVEFHLCAiR290IGNvbW1hbmQ6ICIgKyBjb21tYW5kKTsKLQotICAgICAgICBpZiAoImNyZWF0ZSIuZXF1YWxzKGNvbW1hbmQpKSB7Ci0gICAgICAgICAgICBjcmVhdGVWaXJ0dWFsRGlzcGxheShpbnRlbnQpOwotICAgICAgICB9IGlmICgib2ZmIi5lcXVhbHMoY29tbWFuZCkpIHsKLSAgICAgICAgICAgIG1WaXJ0dWFsRGlzcGxheS5zZXRTdXJmYWNlKG51bGwpOwotICAgICAgICB9IGVsc2UgaWYgKCJvbiIuZXF1YWxzKGNvbW1hbmQpKSB7Ci0gICAgICAgICAgICBtVmlydHVhbERpc3BsYXkuc2V0U3VyZmFjZShtUmVhZGVyLmdldFN1cmZhY2UoKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoImRlc3Ryb3kiLmVxdWFscyhjb21tYW5kKSkgewotICAgICAgICAgICAgZGVzdHJveVZpcnR1YWxEaXNwbGF5KCk7Ci0gICAgICAgICAgICBzdG9wU2VsZigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIFNUQVJUX05PVF9TVElDS1k7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElCaW5kZXIgb25CaW5kKEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVZpcnR1YWxEaXNwbGF5KEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgbVJlYWRlciA9IEltYWdlUmVhZGVyLm5ld0luc3RhbmNlKFdJRFRILCBIRUlHSFQsIFBpeGVsRm9ybWF0LlJHQkFfODg4OCwgMik7Ci0KLSAgICAgICAgZmluYWwgRGlzcGxheU1hbmFnZXIgZGlzcGxheU1hbmFnZXIgPSBnZXRTeXN0ZW1TZXJ2aWNlKERpc3BsYXlNYW5hZ2VyLmNsYXNzKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSAiQ3RzVmlydHVhbERpc3BsYXkiOwotCi0gICAgICAgIGludCBmbGFncyA9IFZJUlRVQUxfRElTUExBWV9GTEFHX1BSRVNFTlRBVElPTiB8IFZJUlRVQUxfRElTUExBWV9GTEFHX09XTl9DT05URU5UX09OTFk7Ci0gICAgICAgIGlmIChpbnRlbnQuZ2V0Qm9vbGVhbkV4dHJhKCJzaG93X2NvbnRlbnRfd2hlbl9sb2NrZWQiLCBmYWxzZSAvKiBkZWZhdWx0VmFsdWUgKi8pKSB7Ci0gICAgICAgICAgICBmbGFncyB8PSAxIDw8IDU7IC8vIFZJUlRVQUxfRElTUExBWV9GTEFHX0NBTl9TSE9XX1dJVEhfSU5TRUNVUkVfS0VZR1VBUkQKLSAgICAgICAgfQotICAgICAgICBtVmlydHVhbERpc3BsYXkgPSBkaXNwbGF5TWFuYWdlci5jcmVhdGVWaXJ0dWFsRGlzcGxheSgKLSAgICAgICAgICAgICAgICBuYW1lLCBXSURUSCwgSEVJR0hULCBERU5TSVRZLCBtUmVhZGVyLmdldFN1cmZhY2UoKSwgZmxhZ3MpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkZXN0cm95VmlydHVhbERpc3BsYXkoKSB7Ci0gICAgICAgIG1WaXJ0dWFsRGlzcGxheS5yZWxlYXNlKCk7Ci0gICAgICAgIG1SZWFkZXIuY2xvc2UoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9kaXNwbGF5c2VydmljZWFwcC91dGlsL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9kaXNwbGF5c2VydmljZWFwcC91dGlsL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZjU5ZTcuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvZGlzcGxheXNlcnZpY2VhcHAvdXRpbC9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLQotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQotCi1MT0NBTF9BRERJVElPTkFMX0RFUEVOREVOQ0lFUyA6PSAkKExPQ0FMX1BBVEgpL0FuZHJvaWQubWsKLQotTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gY3RzLXRyYWRlZmVkIHRyYWRlZmVkCi0KLUxPQ0FMX01PRFVMRSA6PSBjdHMtZGlzcGxheS1zZXJ2aWNlLWFwcC11dGlsCi0KLUxPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKLQotaW5jbHVkZSAkKEJVSUxEX0hPU1RfSkFWQV9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvZGlzcGxheXNlcnZpY2VhcHAvdXRpbC9zcmMvYW5kcm9pZC9zZXJ2ZXIvZGlzcGxheXNlcnZpY2UvRGlzcGxheUhlbHBlci5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvZGlzcGxheXNlcnZpY2VhcHAvdXRpbC9zcmMvYW5kcm9pZC9zZXJ2ZXIvZGlzcGxheXNlcnZpY2UvRGlzcGxheUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTY4M2EwLi4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2Rpc3BsYXlzZXJ2aWNlYXBwL3V0aWwvc3JjL2FuZHJvaWQvc2VydmVyL2Rpc3BsYXlzZXJ2aWNlL0Rpc3BsYXlIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKLSAqLwotcGFja2FnZSBhbmRyb2lkLnNlcnZlci5kaXNwbGF5c2VydmljZTsKLQotaW1wb3J0IHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0LmFzc2VydFRydWU7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuQ29sbGVjdGluZ091dHB1dFJlY2VpdmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5EZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLklUZXN0RGV2aWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkRldmljZVRlc3RDYXNlOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotCi1wdWJsaWMgY2xhc3MgRGlzcGxheUhlbHBlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZJUlRVQUxfRElTUExBWV9OQU1FID0gIkN0c1ZpcnR1YWxEaXNwbGF5IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklSVFVBTF9ESVNQTEFZX1NFUlZJQ0UgPQotICAgICAgICAgICAgImFuZHJvaWQuc2VydmVyLmRpc3BsYXlzZXJ2aWNlLy5WaXJ0dWFsRGlzcGxheVNlcnZpY2UiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gbURpc3BsYXlEZXZpY2VQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKAotICAgICAgICAgICAgIi4qRGlzcGxheURldmljZUluZm9cXHtcIihbXlwiXSspXCI6LiosIHN0YXRlIChcXFMrKSwuKlxcfS4qIik7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbUNyZWF0ZWQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBJVGVzdERldmljZSBtRGV2aWNlOwotCi0gICAgcHVibGljIERpc3BsYXlIZWxwZXIoSVRlc3REZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIG1EZXZpY2UgPSBkZXZpY2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlQW5kV2FpdEZvckRpc3BsYXkoYm9vbGVhbiBleHRlcm5hbCwgYm9vbGVhbiByZXF1ZXN0U2hvd1doZW5Mb2NrZWQpCi0gICAgICAgICAgICB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjb21tYW5kID0KLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nQnVpbGRlcigiYW0gc3RhcnRmZ3NlcnZpY2UgLW4gIiArIFZJUlRVQUxfRElTUExBWV9TRVJWSUNFKTsKLSAgICAgICAgY29tbWFuZC5hcHBlbmQoIiAtLWVzIGNvbW1hbmQgY3JlYXRlIik7Ci0gICAgICAgIGlmIChleHRlcm5hbCkgewotICAgICAgICAgICAgY29tbWFuZC5hcHBlbmQoIiAtLWV6IGV4dGVybmFsX2Rpc3BsYXkgdHJ1ZSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXF1ZXN0U2hvd1doZW5Mb2NrZWQpIHsKLSAgICAgICAgICAgIGNvbW1hbmQuYXBwZW5kKCIgLS1leiBzaG93X2NvbnRlbnRfd2hlbl9sb2NrZWQgdHJ1ZSIpOwotICAgICAgICB9Ci0gICAgICAgIG1EZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZChjb21tYW5kLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIHdhaXRGb3JEaXNwbGF5U3RhdGUobURldmljZSwgZmFsc2UgLyogZGVmYXVsdCAqLywgdHJ1ZSAvKiBleGlzdHMgKi8sIHRydWUgLyogb24gKi8pOwotICAgICAgICBtQ3JlYXRlZCA9IHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdHVybkRpc3BsYXlPZmYoKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgbURldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKAotICAgICAgICAgICAgICAgICJhbSBzdGFydC1zZXJ2aWNlIC1uICIgKyBWSVJUVUFMX0RJU1BMQVlfU0VSVklDRSArICIgLS1lcyBjb21tYW5kIG9mZiIpOwotICAgICAgICB3YWl0Rm9yRGlzcGxheVN0YXRlKG1EZXZpY2UsIGZhbHNlIC8qIGRlZmF1bHQgKi8sIHRydWUgLyogZXhpc3RzICovLCBmYWxzZSAvKiBvbiAqLyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdHVybkRpc3BsYXlPbigpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBtRGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoCi0gICAgICAgICAgICAgICAgImFtIHN0YXJ0LXNlcnZpY2UgLW4gIiArIFZJUlRVQUxfRElTUExBWV9TRVJWSUNFICsgIiAtLWVzIGNvbW1hbmQgb24iKTsKLSAgICAgICAgd2FpdEZvckRpc3BsYXlTdGF0ZShtRGV2aWNlLCBmYWxzZSAvKiBkZWZhdWx0ICovLCB0cnVlIC8qIGV4aXN0cyAqLywgdHJ1ZSAvKiBvbiAqLyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVsZWFzZURpc3BsYXkoKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG1DcmVhdGVkKSB7Ci0gICAgICAgICAgICBtRGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoCi0gICAgICAgICAgICAgICAgICAgICJhbSBzdGFydC1zZXJ2aWNlIC1uICIgKyBWSVJUVUFMX0RJU1BMQVlfU0VSVklDRSArICIgLS1lcyBjb21tYW5kIGRlc3Ryb3kiKTsKLSAgICAgICAgICAgIHdhaXRGb3JEaXNwbGF5U3RhdGUobURldmljZSwgZmFsc2UgLyogZGVmYXVsdCAqLywgZmFsc2UgLyogZXhpc3RzICovLCB0cnVlIC8qIG9uICovKTsKLSAgICAgICAgfQotICAgICAgICBtQ3JlYXRlZCA9IGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3YWl0Rm9yRGVmYXVsdERpc3BsYXlTdGF0ZShJVGVzdERldmljZSBkZXZpY2UsIGJvb2xlYW4gd2FudE9uKQotICAgICAgICAgICAgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHdhaXRGb3JEaXNwbGF5U3RhdGUoZGV2aWNlLCB0cnVlIC8qIGRlZmF1bHQgKi8sIHRydWUgLyogZXhpc3RzICovLCB3YW50T24pOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXREZWZhdWx0RGlzcGxheVN0YXRlKElUZXN0RGV2aWNlIGRldmljZSkKLSAgICAgICAgICAgIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0RGlzcGxheVN0YXRlKGRldmljZSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB3YWl0Rm9yRGlzcGxheVN0YXRlKAotICAgICAgICAgICAgSVRlc3REZXZpY2UgZGV2aWNlLCBib29sZWFuIGRlZmF1bHREaXNwbGF5LCBib29sZWFuIHdhbnRFeGlzdHMsIGJvb2xlYW4gd2FudE9uKQotICAgICAgICAgICAgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCB0cmllcyA9IDA7Ci0gICAgICAgIGJvb2xlYW4gZG9uZSA9IGZhbHNlOwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBpZiAodHJpZXMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDUwMCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBPaCB3ZWxsCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBCb29sZWFuIHN0YXRlID0gZ2V0RGlzcGxheVN0YXRlKGRldmljZSwgZGVmYXVsdERpc3BsYXkpOwotICAgICAgICAgICAgZG9uZSA9ICghd2FudEV4aXN0cyAmJiBzdGF0ZSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICB8fCAod2FudEV4aXN0cyAmJiBzdGF0ZSAhPSBudWxsICYmIHN0YXRlID09IHdhbnRPbik7Ci0KLSAgICAgICAgICAgIHRyaWVzKys7Ci0gICAgICAgIH0gd2hpbGUgKHRyaWVzIDwgMTAgJiYgIWRvbmUpOwotCi0gICAgICAgIGFzc2VydFRydWUoZG9uZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgQm9vbGVhbiBnZXREaXNwbGF5U3RhdGUoSVRlc3REZXZpY2UgZGV2aWNlLCBib29sZWFuIGRlZmF1bHREaXNwbGF5KQotICAgICAgICAgICAgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIENvbGxlY3RpbmdPdXRwdXRSZWNlaXZlciBvdXRwdXRSZWNlaXZlciA9IG5ldyBDb2xsZWN0aW5nT3V0cHV0UmVjZWl2ZXIoKTsKLSAgICAgICAgZGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoImR1bXBzeXMgZGlzcGxheSIsIG91dHB1dFJlY2VpdmVyKTsKLSAgICAgICAgU3RyaW5nIGR1bXAgPSBvdXRwdXRSZWNlaXZlci5nZXRPdXRwdXQoKTsKLQotICAgICAgICBib29sZWFuIGRpc3BsYXlFeGlzdHMgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBkaXNwbGF5T24gPSBmYWxzZTsKLSAgICAgICAgZm9yIChTdHJpbmcgbGluZSA6IGR1bXAuc3BsaXQoIlxcbiIpKSB7Ci0gICAgICAgICAgICBNYXRjaGVyIG1hdGNoZXIgPSBtRGlzcGxheURldmljZVBhdHRlcm4ubWF0Y2hlcihsaW5lKTsKLSAgICAgICAgICAgIGlmIChtYXRjaGVyLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgIGlmICgoZGVmYXVsdERpc3BsYXkgJiYgbGluZS5jb250YWlucygiRkxBR19ERUZBVUxUX0RJU1BMQVkiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8ICghZGVmYXVsdERpc3BsYXkgJiYgVklSVFVBTF9ESVNQTEFZX05BTUUuZXF1YWxzKG1hdGNoZXIuZ3JvdXAoMSkpKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gIk9OIi5lcXVhbHMobWF0Y2hlci5ncm91cCgyKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL3V0aWwvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL3V0aWwvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkzYmE5NC4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci91dGlsL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSBcCi0gICAgJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCi0KLUxPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTIDo9ICQoTE9DQUxfUEFUSCkvQW5kcm9pZC5tawotCi1MT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBjdHMtdHJhZGVmZWQgdHJhZGVmZWQKLQotTE9DQUxfTU9EVUxFIDo9IGN0cy1hbXdtLXV0aWwKLQotTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAotCi1pbmNsdWRlICQoQlVJTERfSE9TVF9KQVZBX0xJQlJBUlkpCi0KLWluY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL3V0aWwvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9BY3Rpdml0eUFuZFdpbmRvd01hbmFnZXJzU3RhdGUuamF2YSBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL3V0aWwvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9BY3Rpdml0eUFuZFdpbmRvd01hbmFnZXJzU3RhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU0ZWQxOS4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci91dGlsL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvQWN0aXZpdHlBbmRXaW5kb3dNYW5hZ2Vyc1N0YXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnNlcnZlci5jdHM7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuY3RzLkFjdGl2aXR5TWFuYWdlclN0YXRlLlJFU0laRV9NT0RFX1JFU0laRUFCTEU7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmN0cy5BY3Rpdml0eU1hbmFnZXJUZXN0QmFzZS5ET0NLRURfU1RBQ0tfSUQ7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmN0cy5BY3Rpdml0eU1hbmFnZXJUZXN0QmFzZS5GUkVFRk9STV9XT1JLU1BBQ0VfU1RBQ0tfSUQ7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmN0cy5BY3Rpdml0eU1hbmFnZXJUZXN0QmFzZS5IT01FX1NUQUNLX0lEOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5jdHMuQWN0aXZpdHlNYW5hZ2VyVGVzdEJhc2UuUElOTkVEX1NUQUNLX0lEOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5jdHMuQWN0aXZpdHlNYW5hZ2VyVGVzdEJhc2UuY29tcG9uZW50TmFtZTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuY3RzLlN0YXRlTG9nZ2VyLmxvZzsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuY3RzLlN0YXRlTG9nZ2VyLmxvZ0U7Ci0KLWltcG9ydCBhbmRyb2lkLnNlcnZlci5jdHMuQWN0aXZpdHlNYW5hZ2VyU3RhdGUuQWN0aXZpdHlTdGFjazsKLWltcG9ydCBhbmRyb2lkLnNlcnZlci5jdHMuQWN0aXZpdHlNYW5hZ2VyU3RhdGUuQWN0aXZpdHlUYXNrOwotaW1wb3J0IGFuZHJvaWQuc2VydmVyLmN0cy5XaW5kb3dNYW5hZ2VyU3RhdGUuRGlzcGxheTsKLWltcG9ydCBhbmRyb2lkLnNlcnZlci5jdHMuV2luZG93TWFuYWdlclN0YXRlLldpbmRvd1N0YWNrOwotaW1wb3J0IGFuZHJvaWQuc2VydmVyLmN0cy5XaW5kb3dNYW5hZ2VyU3RhdGUuV2luZG93U3RhdGU7Ci1pbXBvcnQgYW5kcm9pZC5zZXJ2ZXIuY3RzLldpbmRvd01hbmFnZXJTdGF0ZS5XaW5kb3dUYXNrOwotCi1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLklUZXN0RGV2aWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5EZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotCi1pbXBvcnQgamF2YS5hd3QuUmVjdGFuZ2xlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk9iamVjdHM7Ci1pbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkJpUHJlZGljYXRlOwotaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Cb29sZWFuU3VwcGxpZXI7Ci1pbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTsKLQotLyoqIENvbWJpbmVkIHN0YXRlIG9mIHRoZSBhY3Rpdml0eSBtYW5hZ2VyIGFuZCB3aW5kb3cgbWFuYWdlci4gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUFuZFdpbmRvd01hbmFnZXJzU3RhdGUgZXh0ZW5kcyBBc3NlcnQgewotCi0gICAgLy8gQ2xvbmUgb2YgYW5kcm9pZCBEaXNwbGF5TWV0cmljcy5ERU5TSVRZX0RFRkFVTFQgKERFTlNJVFlfTUVESVVNKQotICAgIC8vIChOZWVkZWQgaW4gaG9zdC1zaWRlIHRlc3RzIHRvIGNvbnZlcnQgZHAgdG8gcHguKQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBESVNQTEFZX0RFTlNJVFlfREVGQVVMVCA9IDE2MDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0RJU1BMQVlfSUQgPSAwOwotCi0gICAgLy8gRGVmYXVsdCBtaW5pbWFsIHNpemUgb2YgcmVzaXphYmxlIHRhc2ssIHVzZWQgaWYgbm9uZSBpcyBzZXQgZXhwbGljaXRseS4KLSAgICAvLyBNdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoICdkZWZhdWx0X21pbmltYWxfc2l6ZV9yZXNpemFibGVfdGFzaycgZGltZW4gZnJvbSBmcmFtZXdvcmtzL2Jhc2UuCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfUkVTSVpBQkxFX1RBU0tfU0laRV9EUCA9IDIyMDsKLQotICAgIC8vIERlZmF1bHQgbWluaW1hbCBzaXplIG9mIGEgcmVzaXphYmxlIFBpUCB0YXNrLCB1c2VkIGlmIG5vbmUgaXMgc2V0IGV4cGxpY2l0bHkuCi0gICAgLy8gTXVzdCBiZSBrZXB0IGluIHN5bmMgd2l0aCAnZGVmYXVsdF9taW5pbWFsX3NpemVfcGlwX3Jlc2l6YWJsZV90YXNrJyBkaW1lbiBmcm9tCi0gICAgLy8gZnJhbWV3b3Jrcy9iYXNlLgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1BJUF9SRVNJWkFCTEVfVEFTS19TSVpFX0RQID0gMTA4OwotCi0gICAgcHJpdmF0ZSBBY3Rpdml0eU1hbmFnZXJTdGF0ZSBtQW1TdGF0ZSA9IG5ldyBBY3Rpdml0eU1hbmFnZXJTdGF0ZSgpOwotICAgIHByaXZhdGUgV2luZG93TWFuYWdlclN0YXRlIG1XbVN0YXRlID0gbmV3IFdpbmRvd01hbmFnZXJTdGF0ZSgpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFdpbmRvd01hbmFnZXJTdGF0ZS5XaW5kb3dTdGF0ZT4gbVRlbXBXaW5kb3dMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbVVzZUFjdGl2aXR5TmFtZXMgPSB0cnVlOwotCi0gICAgLyoqCi0gICAgICogQ29tcHV0ZSBBTSBhbmQgV00gc3RhdGUgb2YgZGV2aWNlLCBjaGVjayBzYW5pdHkgYW5kIGJvdW5kcy4KLSAgICAgKiBXTSBzdGF0ZSB3aWxsIGluY2x1ZGUgb25seSB2aXNpYmxlIHdpbmRvd3MsIHN0YWNrIGFuZCB0YXNrIGJvdW5kcyB3aWxsIGJlIGNvbXBhcmVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGRldmljZSB0ZXN0IGRldmljZS4KLSAgICAgKiBAcGFyYW0gd2FpdEZvckFjdGl2aXRpZXNWaXNpYmxlIGFycmF5IG9mIGFjdGl2aXR5IG5hbWVzIHRvIHdhaXQgZm9yLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvbXB1dGVTdGF0ZShJVGVzdERldmljZSBkZXZpY2UsIFN0cmluZ1tdIHdhaXRGb3JBY3Rpdml0aWVzVmlzaWJsZSkKLSAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBjb21wdXRlU3RhdGUoZGV2aWNlLCB3YWl0Rm9yQWN0aXZpdGllc1Zpc2libGUsIHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXB1dGUgQU0gYW5kIFdNIHN0YXRlIG9mIGRldmljZSwgY2hlY2sgc2FuaXR5IGFuZCBib3VuZHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGV2aWNlIHRlc3QgZGV2aWNlLgotICAgICAqIEBwYXJhbSB3YWl0Rm9yQWN0aXZpdGllc1Zpc2libGUgYXJyYXkgb2YgYWN0aXZpdHkgbmFtZXMgdG8gd2FpdCBmb3IuCi0gICAgICogQHBhcmFtIGNvbXBhcmVUYXNrQW5kU3RhY2tCb3VuZHMgcGFzcyAndHJ1ZScgaWYgc3RhY2sgYW5kIHRhc2sgYm91bmRzIHNob3VsZCBiZSBjb21wYXJlZCwKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmFsc2UnIG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICB2b2lkIGNvbXB1dGVTdGF0ZShJVGVzdERldmljZSBkZXZpY2UsIFN0cmluZ1tdIHdhaXRGb3JBY3Rpdml0aWVzVmlzaWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGNvbXBhcmVUYXNrQW5kU3RhY2tCb3VuZHMpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB3YWl0Rm9yVmFsaWRTdGF0ZShkZXZpY2UsIHdhaXRGb3JBY3Rpdml0aWVzVmlzaWJsZSwgbnVsbCAvKiBzdGFja0lkcyAqLywKLSAgICAgICAgICAgICAgICBjb21wYXJlVGFza0FuZFN0YWNrQm91bmRzKTsKLQotICAgICAgICBhc3NlcnRTYW5pdHkoKTsKLSAgICAgICAgYXNzZXJ0VmFsaWRCb3VuZHMoY29tcGFyZVRhc2tBbmRTdGFja0JvdW5kcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnkgZGVmYXVsdCBjb21wdXRlU3RhdGUgYWxsb3dzIHlvdSB0byBwYXNzIG9ubHkgdGhlIGFjdGl2aXR5IG5hbWUgaXQgYW5kCi0gICAgICogaXQgd2lsbCBnZW5lcmF0ZSB0aGUgZnVsbCB3aW5kb3cgbmFtZSBmb3IgdGhlIG1haW4gYWN0aXZpdHkgd2luZG93LiBJbiB0aGUKLSAgICAgKiBjYXNlIG9mIHNlY29uZGFyeSBhcHBsaWNhdGlvbiB3aW5kb3dzIHRob3VnaCB0aGlzIGlzbid0IGhlbHBmdWwsIGFzIHRoZXkKLSAgICAgKiBtYXkgZm9sbG93IGEgZGlmZmVyZW50IGZvcm1hdCwgc28gdGhpcyBtZXRob2QgbGV0cyB5b3UgZGlzYWJsZSB0aGF0IGJlaGF2aW9yLAotICAgICAqIHByaW9yIHRvIGNhbGxpbmcgYSBjb21wdXRlU3RhdGUgdmFyaWFudAotICAgICAqLwotICAgIHZvaWQgc2V0VXNlQWN0aXZpdHlOYW1lc0ZvcldpbmRvd05hbWVzKGJvb2xlYW4gdXNlQWN0aXZpdHlOYW1lcykgewotICAgICAgICBtVXNlQWN0aXZpdHlOYW1lcyA9IHVzZUFjdGl2aXR5TmFtZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcHV0ZSBBTSBhbmQgV00gc3RhdGUgb2YgZGV2aWNlLCB3YWl0IGZvciB0aGUgYWN0aXZpdHkgcmVjb3JkcyB0byBiZSBhZGRlZCwgYW5kCi0gICAgICogd2FpdCBmb3IgZGVidWdnZXIgd2luZG93IHRvIHNob3cgdXAuCi0gICAgICoKLSAgICAgKiBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgd2hlbiBzdGFydGluZyB3aXRoIC1EIChkZWJ1Z2dlcikgb3B0aW9uLCB3aGVyZSB3ZSBwb3AgdXAgdGhlCi0gICAgICogd2FpdGluZy1mb3ItZGVidWdnZXIgd2luZG93LCBidXQgcmVhbCBhY3Rpdml0eSB3aW5kb3cgd29uJ3Qgc2hvdyB1cCBzaW5jZSB3ZSdyZSB3YWl0aW5nCi0gICAgICogZm9yIGRlYnVnZ2VyLgotICAgICAqLwotICAgIHZvaWQgd2FpdEZvckRlYnVnZ2VyV2luZG93VmlzaWJsZSgKLSAgICAgICAgICAgIElUZXN0RGV2aWNlIGRldmljZSwgU3RyaW5nW10gd2FpdEZvckFjdGl2aXR5UmVjb3JkcykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCByZXRyaWVzTGVmdCA9IDU7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIG1BbVN0YXRlLmNvbXB1dGVTdGF0ZShkZXZpY2UpOwotICAgICAgICAgICAgbVdtU3RhdGUuY29tcHV0ZVN0YXRlKGRldmljZSk7Ci0gICAgICAgICAgICBpZiAoc2hvdWxkV2FpdEZvckRlYnVnZ2VyV2luZG93KCkgfHwKLSAgICAgICAgICAgICAgICAgICAgc2hvdWxkV2FpdEZvckFjdGl2aXR5UmVjb3Jkcyh3YWl0Rm9yQWN0aXZpdHlSZWNvcmRzKSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZyhlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICAvLyBXZWxsIEkgZ3Vlc3Mgd2UgYXJlIG5vdCB3YWl0aW5nLi4uCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSB3aGlsZSAocmV0cmllc0xlZnQtLSA+IDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdhaXQgZm9yIHRoZSBhY3Rpdml0eSB0byBhcHBlYXIgYW5kIGZvciB2YWxpZCBzdGF0ZSBpbiBBTSBhbmQgV00uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGV2aWNlIHRlc3QgZGV2aWNlLgotICAgICAqIEBwYXJhbSB3YWl0Rm9yQWN0aXZpdHlWaXNpYmxlIG5hbWUgb2YgYWN0aXZpdHkgdG8gd2FpdCBmb3IuCi0gICAgICovCi0gICAgdm9pZCB3YWl0Rm9yVmFsaWRTdGF0ZShJVGVzdERldmljZSBkZXZpY2UsIFN0cmluZyB3YWl0Rm9yQWN0aXZpdHlWaXNpYmxlKQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHdhaXRGb3JWYWxpZFN0YXRlKGRldmljZSwgbmV3IFN0cmluZ1tde3dhaXRGb3JBY3Rpdml0eVZpc2libGV9LCBudWxsIC8qIHN0YWNrSWRzICovLAotICAgICAgICAgICAgICAgIGZhbHNlIC8qIGNvbXBhcmVUYXNrQW5kU3RhY2tCb3VuZHMgKi8pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdhaXQgZm9yIHRoZSBhY3Rpdml0eSB0byBhcHBlYXIgaW4gcHJvcGVyIHN0YWNrIGFuZCBmb3IgdmFsaWQgc3RhdGUgaW4gQU0gYW5kIFdNLgotICAgICAqCi0gICAgICogQHBhcmFtIGRldmljZSB0ZXN0IGRldmljZS4KLSAgICAgKiBAcGFyYW0gd2FpdEZvckFjdGl2aXR5VmlzaWJsZSBuYW1lIG9mIGFjdGl2aXR5IHRvIHdhaXQgZm9yLgotICAgICAqIEBwYXJhbSBzdGFja0lkIGlkIG9mIHRoZSBzdGFjayB3aGVyZSBwcm92aWRlZCBhY3Rpdml0eSBzaG91bGQgYmUgZm91bmQuCi0gICAgICovCi0gICAgdm9pZCB3YWl0Rm9yVmFsaWRTdGF0ZShJVGVzdERldmljZSBkZXZpY2UsIFN0cmluZyB3YWl0Rm9yQWN0aXZpdHlWaXNpYmxlLCBpbnQgc3RhY2tJZCkKLSAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB3YWl0Rm9yVmFsaWRTdGF0ZShkZXZpY2UsIG5ldyBTdHJpbmdbXXt3YWl0Rm9yQWN0aXZpdHlWaXNpYmxlfSwgbmV3IGludFtde3N0YWNrSWR9LAotICAgICAgICAgICAgICAgIGZhbHNlIC8qIGNvbXBhcmVUYXNrQW5kU3RhY2tCb3VuZHMgKi8pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdhaXQgZm9yIHRoZSBhY3Rpdml0aWVzIHRvIGFwcGVhciBpbiBwcm9wZXIgc3RhY2tzIGFuZCBmb3IgdmFsaWQgc3RhdGUgaW4gQU0gYW5kIFdNLgotICAgICAqCi0gICAgICogQHBhcmFtIGRldmljZSB0ZXN0IGRldmljZS4KLSAgICAgKiBAcGFyYW0gd2FpdEZvckFjdGl2aXRpZXNWaXNpYmxlIGFycmF5IG9mIGFjdGl2aXR5IG5hbWVzIHRvIHdhaXQgZm9yLgotICAgICAqIEBwYXJhbSBzdGFja0lkcyBpZHMgb2Ygc3RhY2sgd2hlcmUgcHJvdmlkZWQgYWN0aXZpdGllcyBzaG91bGQgYmUgZm91bmQuCi0gICAgICogICAgICAgICAgICAgICAgIFBhc3MgbnVsbCB0byBza2lwIHRoaXMgY2hlY2suCi0gICAgICogQHBhcmFtIGNvbXBhcmVUYXNrQW5kU3RhY2tCb3VuZHMgZmxhZyBpbmRpY2F0aW5nIGlmIHdlIHNob3VsZCBjb21wYXJlIHRhc2sgYW5kIHN0YWNrIGJvdW5kcwotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBlcXVhbGl0eS4KLSAgICAgKi8KLSAgICB2b2lkIHdhaXRGb3JWYWxpZFN0YXRlKElUZXN0RGV2aWNlIGRldmljZSwgU3RyaW5nW10gd2FpdEZvckFjdGl2aXRpZXNWaXNpYmxlLCBpbnRbXSBzdGFja0lkcywKLSAgICAgICAgICAgIGJvb2xlYW4gY29tcGFyZVRhc2tBbmRTdGFja0JvdW5kcykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHdhaXRGb3JWYWxpZFN0YXRlKGRldmljZSwgd2FpdEZvckFjdGl2aXRpZXNWaXNpYmxlLCBzdGFja0lkcywgY29tcGFyZVRhc2tBbmRTdGFja0JvdW5kcywKLSAgICAgICAgICAgICAgICBjb21wb25lbnROYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXYWl0IGZvciB0aGUgYWN0aXZpdGllcyB0byBhcHBlYXIgaW4gcHJvcGVyIHN0YWNrcyBhbmQgZm9yIHZhbGlkIHN0YXRlIGluIEFNIGFuZCBXTS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkZXZpY2UgdGVzdCBkZXZpY2UuCi0gICAgICogQHBhcmFtIHdhaXRGb3JBY3Rpdml0aWVzVmlzaWJsZSBhcnJheSBvZiBhY3Rpdml0eSBuYW1lcyB0byB3YWl0IGZvci4KLSAgICAgKiBAcGFyYW0gc3RhY2tJZHMgaWRzIG9mIHN0YWNrIHdoZXJlIHByb3ZpZGVkIGFjdGl2aXRpZXMgc2hvdWxkIGJlIGZvdW5kLgotICAgICAqICAgICAgICAgICAgICAgICBQYXNzIG51bGwgdG8gc2tpcCB0aGlzIGNoZWNrLgotICAgICAqIEBwYXJhbSBjb21wYXJlVGFza0FuZFN0YWNrQm91bmRzIGZsYWcgaW5kaWNhdGluZyBpZiB3ZSBzaG91bGQgY29tcGFyZSB0YXNrIGFuZCBzdGFjayBib3VuZHMKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgZXF1YWxpdHkuCi0gICAgICogQHBhcmFtIHBhY2thZ2VOYW1lIG5hbWUgb2YgdGhlIHBhY2thZ2Ugb2YgYWN0aXZpdGllcyB0aGF0IHdlJ3JlIHdhaXRpbmcgZm9yLgotICAgICAqLwotICAgIHZvaWQgd2FpdEZvclZhbGlkU3RhdGUoSVRlc3REZXZpY2UgZGV2aWNlLCBTdHJpbmdbXSB3YWl0Rm9yQWN0aXZpdGllc1Zpc2libGUsIGludFtdIHN0YWNrSWRzLAotICAgICAgICAgICAgYm9vbGVhbiBjb21wYXJlVGFza0FuZFN0YWNrQm91bmRzLCBTdHJpbmcgcGFja2FnZU5hbWUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpbnQgcmV0cmllc0xlZnQgPSA1OwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICAvLyBUT0RPOiBHZXQgc3RhdGUgb2YgQU0gYW5kIFdNIGF0IHRoZSBzYW1lIHRpbWUgdG8gYXZvaWQgbWlzbWF0Y2hlcyBjYXVzZWQgYnkKLSAgICAgICAgICAgIC8vIHJlcXVlc3RpbmcgZHVtcCBpbiBzb21lIGludGVybWVkaWF0ZSBzdGF0ZS4KLSAgICAgICAgICAgIG1BbVN0YXRlLmNvbXB1dGVTdGF0ZShkZXZpY2UpOwotICAgICAgICAgICAgbVdtU3RhdGUuY29tcHV0ZVN0YXRlKGRldmljZSk7Ci0gICAgICAgICAgICBpZiAoc2hvdWxkV2FpdEZvclZhbGlkU3RhY2tzKGNvbXBhcmVUYXNrQW5kU3RhY2tCb3VuZHMpCi0gICAgICAgICAgICAgICAgICAgIHx8IHNob3VsZFdhaXRGb3JBY3Rpdml0aWVzKHdhaXRGb3JBY3Rpdml0aWVzVmlzaWJsZSwgc3RhY2tJZHMsIHBhY2thZ2VOYW1lKQotICAgICAgICAgICAgICAgICAgICB8fCBzaG91bGRXYWl0Rm9yV2luZG93cygpKSB7Ci0gICAgICAgICAgICAgICAgbG9nKCIqKipXYWl0aW5nIGZvciB2YWxpZCBzdGFja3MgYW5kIGFjdGl2aXRpZXMgc3RhdGVzLi4uIik7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFdlbGwgSSBndWVzcyB3ZSBhcmUgbm90IHdhaXRpbmcuLi4KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlIChyZXRyaWVzTGVmdC0tID4gMCk7Ci0gICAgfQotCi0gICAgdm9pZCB3YWl0Rm9yQWxsU3RvcHBlZEFjdGl2aXRpZXMoSVRlc3REZXZpY2UgZGV2aWNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IHJldHJpZXNMZWZ0ID0gNTsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgbUFtU3RhdGUuY29tcHV0ZVN0YXRlKGRldmljZSk7Ci0gICAgICAgICAgICBpZiAobUFtU3RhdGUuY29udGFpbnNTdGFydGVkQWN0aXZpdGllcygpKXsKLSAgICAgICAgICAgICAgICBsb2coIioqKldhaXRpbmcgZm9yIHZhbGlkIHN0YWNrcyBhbmQgYWN0aXZpdGllcyBzdGF0ZXMuLi4iKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTUwMCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBsb2coZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gV2VsbCBJIGd1ZXNzIHdlIGFyZSBub3Qgd2FpdGluZy4uLgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gd2hpbGUgKHJldHJpZXNMZWZ0LS0gPiAwKTsKLQotICAgICAgICBhc3NlcnRGYWxzZShtQW1TdGF0ZS5jb250YWluc1N0YXJ0ZWRBY3Rpdml0aWVzKCkpOwotICAgIH0KLQotICAgIHZvaWQgd2FpdEZvckhvbWVBY3Rpdml0eVZpc2libGUoSVRlc3REZXZpY2UgZGV2aWNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgd2FpdEZvclZhbGlkU3RhdGUoZGV2aWNlLCBtQW1TdGF0ZS5nZXRIb21lQWN0aXZpdHlOYW1lKCkpOwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIHRydWUgaWYgcmVjZW50cyBhY3Rpdml0eSBpcyB2aXNpYmxlLiBEZXZpY2VzIHdpdGhvdXQgcmVjZW50cyB3aWxsIHJldHVybiBmYWxzZSAqLwotICAgIGJvb2xlYW4gd2FpdEZvclJlY2VudHNBY3Rpdml0eVZpc2libGUoSVRlc3REZXZpY2UgZGV2aWNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgd2FpdEZvcldpdGhBbVN0YXRlKGRldmljZSwgQWN0aXZpdHlNYW5hZ2VyU3RhdGU6OmlzUmVjZW50c0FjdGl2aXR5VmlzaWJsZSwKLSAgICAgICAgICAgICAgICAiKioqV2FpdGluZyBmb3IgcmVjZW50cyBhY3Rpdml0eSB0byBiZSB2aXNpYmxlLi4uIik7Ci0gICAgICAgIHJldHVybiBtQW1TdGF0ZS5pc1JlY2VudHNBY3Rpdml0eVZpc2libGUoKTsKLSAgICB9Ci0KLSAgICB2b2lkIHdhaXRGb3JLZXlndWFyZFNob3dpbmdBbmROb3RPY2NsdWRlZChJVGVzdERldmljZSBkZXZpY2UpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB3YWl0Rm9yV2l0aEFtU3RhdGUoZGV2aWNlLCBzdGF0ZSAtPiBzdGF0ZS5nZXRLZXlndWFyZENvbnRyb2xsZXJTdGF0ZSgpLmtleWd1YXJkU2hvd2luZwotICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXN0YXRlLmdldEtleWd1YXJkQ29udHJvbGxlclN0YXRlKCkua2V5Z3VhcmRPY2NsdWRlZCwKLSAgICAgICAgICAgICAgICAiKioqV2FpdGluZyBmb3IgS2V5Z3VhcmQgc2hvd2luZy4uLiIpOwotICAgIH0KLQotICAgIHZvaWQgd2FpdEZvcktleWd1YXJkU2hvd2luZ0FuZE9jY2x1ZGVkKElUZXN0RGV2aWNlIGRldmljZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHdhaXRGb3JXaXRoQW1TdGF0ZShkZXZpY2UsIHN0YXRlIC0+IHN0YXRlLmdldEtleWd1YXJkQ29udHJvbGxlclN0YXRlKCkua2V5Z3VhcmRTaG93aW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBzdGF0ZS5nZXRLZXlndWFyZENvbnRyb2xsZXJTdGF0ZSgpLmtleWd1YXJkT2NjbHVkZWQsCi0gICAgICAgICAgICAgICAgIioqKldhaXRpbmcgZm9yIEtleWd1YXJkIHNob3dpbmcgYW5kIG9jY2x1ZGVkLi4uIik7Ci0gICAgfQotCi0gICAgdm9pZCB3YWl0Rm9yS2V5Z3VhcmRHb25lKElUZXN0RGV2aWNlIGRldmljZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHdhaXRGb3JXaXRoQW1TdGF0ZShkZXZpY2UsIHN0YXRlIC0+ICFzdGF0ZS5nZXRLZXlndWFyZENvbnRyb2xsZXJTdGF0ZSgpLmtleWd1YXJkU2hvd2luZywKLSAgICAgICAgICAgICAgICAiKioqV2FpdGluZyBmb3IgS2V5Z3VhcmQgZ29uZS4uLiIpOwotICAgIH0KLQotICAgIHZvaWQgd2FpdEZvclJvdGF0aW9uKElUZXN0RGV2aWNlIGRldmljZSwgaW50IHJvdGF0aW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgd2FpdEZvcldpdGhXbVN0YXRlKGRldmljZSwgc3RhdGUgLT4gc3RhdGUuZ2V0Um90YXRpb24oKSA9PSByb3RhdGlvbiwKLSAgICAgICAgICAgICAgICAiKioqV2FpdGluZyBmb3IgUm90YXRpb246ICIgKyByb3RhdGlvbik7Ci0gICAgfQotCi0gICAgdm9pZCB3YWl0Rm9yRGlzcGxheVVuZnJvemVuKElUZXN0RGV2aWNlIGRldmljZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHdhaXRGb3JXaXRoV21TdGF0ZShkZXZpY2UsIHN0YXRlIC0+ICFzdGF0ZS5pc0Rpc3BsYXlGcm96ZW4oKSwKLSAgICAgICAgICAgICAgICAiKioqV2FpdGluZyBmb3IgRGlzcGxheSB1bmZyb3plbiIpOwotICAgIH0KLQotICAgIHZvaWQgd2FpdEZvckFjdGl2aXR5U3RhdGUoSVRlc3REZXZpY2UgZGV2aWNlLCBTdHJpbmcgYWN0aXZpdHlOYW1lLCBTdHJpbmcuLi4gYWN0aXZpdHlTdGF0ZXMpCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB3YWl0Rm9yV2l0aEFtU3RhdGUoZGV2aWNlLCBzdGF0ZSAtPiB7Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgYWN0aXZpdHlTdGF0ZSA6IGFjdGl2aXR5U3RhdGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5oYXNBY3Rpdml0eVN0YXRlKGFjdGl2aXR5TmFtZSwgYWN0aXZpdHlTdGF0ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAiKioqV2FpdGluZyBmb3IgQWN0aXZpdHkgU3RhdGU6ICIgKyBhY3Rpdml0eVN0YXRlcyk7Ci0gICAgfQotCi0gICAgdm9pZCB3YWl0Rm9yRm9jdXNlZFN0YWNrKElUZXN0RGV2aWNlIGRldmljZSwgaW50IHN0YWNrSWQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB3YWl0Rm9yV2l0aEFtU3RhdGUoZGV2aWNlLCBzdGF0ZSAtPiBzdGF0ZS5nZXRGb2N1c2VkU3RhY2tJZCgpID09IHN0YWNrSWQsCi0gICAgICAgICAgICAgICAgIioqKldhaXRpbmcgZm9yIGZvY3VzZWQgc3RhY2suLi4iKTsKLSAgICB9Ci0KLSAgICB2b2lkIHdhaXRGb3JBcHBUcmFuc2l0aW9uSWRsZShJVGVzdERldmljZSBkZXZpY2UpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB3YWl0Rm9yV2l0aFdtU3RhdGUoZGV2aWNlLAotICAgICAgICAgICAgICAgIHN0YXRlIC0+IFdpbmRvd01hbmFnZXJTdGF0ZS5BUFBfU1RBVEVfSURMRS5lcXVhbHMoc3RhdGUuZ2V0QXBwVHJhbnNpdGlvblN0YXRlKCkpLAotICAgICAgICAgICAgICAgICIqKipXYWl0aW5nIGZvciBhcHAgdHJhbnNpdGlvbiBpZGxlLi4uIik7Ci0gICAgfQotCi0gICAgdm9pZCB3YWl0Rm9yV2l0aEFtU3RhdGUoSVRlc3REZXZpY2UgZGV2aWNlLCBQcmVkaWNhdGU8QWN0aXZpdHlNYW5hZ2VyU3RhdGU+IHdhaXRDb25kaXRpb24sCi0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSkgdGhyb3dzIEV4Y2VwdGlvbnsKLSAgICAgICAgd2FpdEZvcihkZXZpY2UsIChhbVN0YXRlLCB3bVN0YXRlKSAtPiB3YWl0Q29uZGl0aW9uLnRlc3QoYW1TdGF0ZSksIG1lc3NhZ2UpOwotICAgIH0KLQotICAgIHZvaWQgd2FpdEZvcldpdGhXbVN0YXRlKElUZXN0RGV2aWNlIGRldmljZSwgUHJlZGljYXRlPFdpbmRvd01hbmFnZXJTdGF0ZT4gd2FpdENvbmRpdGlvbiwKLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlKSB0aHJvd3MgRXhjZXB0aW9uewotICAgICAgICB3YWl0Rm9yKGRldmljZSwgKGFtU3RhdGUsIHdtU3RhdGUpIC0+IHdhaXRDb25kaXRpb24udGVzdCh3bVN0YXRlKSwgbWVzc2FnZSk7Ci0gICAgfQotCi0gICAgdm9pZCB3YWl0Rm9yKElUZXN0RGV2aWNlIGRldmljZSwKLSAgICAgICAgICAgIEJpUHJlZGljYXRlPEFjdGl2aXR5TWFuYWdlclN0YXRlLCBXaW5kb3dNYW5hZ2VyU3RhdGU+IHdhaXRDb25kaXRpb24sIFN0cmluZyBtZXNzYWdlKQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHdhaXRGb3IobWVzc2FnZSwgKCkgLT4gewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtQW1TdGF0ZS5jb21wdXRlU3RhdGUoZGV2aWNlKTsKLSAgICAgICAgICAgICAgICBtV21TdGF0ZS5jb21wdXRlU3RhdGUoZGV2aWNlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgbG9nRShlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB3YWl0Q29uZGl0aW9uLnRlc3QobUFtU3RhdGUsIG1XbVN0YXRlKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCB3YWl0Rm9yKFN0cmluZyBtZXNzYWdlLCBCb29sZWFuU3VwcGxpZXIgd2FpdENvbmRpdGlvbikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCByZXRyaWVzTGVmdCA9IDU7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIGlmICghd2FpdENvbmRpdGlvbi5nZXRBc0Jvb2xlYW4oKSkgewotICAgICAgICAgICAgICAgIGxvZyhtZXNzYWdlKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBsb2coZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gV2VsbCBJIGd1ZXNzIHdlIGFyZSBub3Qgd2FpdGluZy4uLgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gd2hpbGUgKHJldHJpZXNMZWZ0LS0gPiAwKTsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiB0cnVlIGlmIHNob3VsZCB3YWl0IGZvciB2YWxpZCBzdGFja3Mgc3RhdGUuICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHNob3VsZFdhaXRGb3JWYWxpZFN0YWNrcyhib29sZWFuIGNvbXBhcmVUYXNrQW5kU3RhY2tCb3VuZHMpIHsKLSAgICAgICAgaWYgKCF0YXNrTGlzdHNJbkFtQW5kV21BcmVFcXVhbCgpKSB7Ci0gICAgICAgICAgICAvLyBXZSB3YW50IHRvIHdhaXQgZm9yIGVxdWFsIHRhc2sgbGlzdHMgaW4gQU0gYW5kIFdNIGluIGNhc2Ugd2UgY2F1Z2h0IHRoZW0gaW4gdGhlCi0gICAgICAgICAgICAvLyBtaWRkbGUgb2Ygc29tZSBzdGF0ZSBjaGFuZ2Ugb3BlcmF0aW9ucy4KLSAgICAgICAgICAgIGxvZygiKioqdGFza0xpc3RzSW5BbUFuZFdtQXJlRXF1YWw9ZmFsc2UiKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghc3RhY2tCb3VuZHNJbkFNQW5kV01BcmVFcXVhbCgpKSB7Ci0gICAgICAgICAgICAvLyBXZSB3YW50IHRvIHdhaXQgYSBsaXR0bGUgZm9yIHRoZSBzdGFja3MgaW4gQU0gYW5kIFdNIHRvIGhhdmUgZXF1YWwgYm91bmRzIGFzIHRoZXJlCi0gICAgICAgICAgICAvLyBtaWdodCBiZSBhIHRyYW5zaXRpb24gYW5pbWF0aW9uIG9uZ29pbmcgd2hlbiB3ZSBnb3QgdGhlIHN0YXRlcyBmcm9tIFdNIEFNIHNlcGFyYXRlbHkuCi0gICAgICAgICAgICBsb2coIioqKnN0YWNrQm91bmRzSW5BTUFuZFdNQXJlRXF1YWw9ZmFsc2UiKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBUZW1wb3JhcnkgZml4IHRvIGF2b2lkIGNhdGNoaW5nIGludGVybWVkaWF0ZSBzdGF0ZSB3aXRoIGRpZmZlcmVudCB0YXNrIGJvdW5kcyBpbiBBTQotICAgICAgICAgICAgLy8gYW5kIFdNLgotICAgICAgICAgICAgYXNzZXJ0VmFsaWRCb3VuZHMoY29tcGFyZVRhc2tBbmRTdGFja0JvdW5kcyk7Ci0gICAgICAgIH0gY2F0Y2ggKEFzc2VydGlvbkVycm9yIGUpIHsKLSAgICAgICAgICAgIGxvZygiKioqdGFza0JvdW5kc0luQU1BbmRXTUFyZUVxdWFsPWZhbHNlIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIGludCBzdGFja0NvdW50ID0gbUFtU3RhdGUuZ2V0U3RhY2tDb3VudCgpOwotICAgICAgICBpZiAoc3RhY2tDb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICBsb2coIioqKnN0YWNrQ291bnQ9IiArIHN0YWNrQ291bnQpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgaW50IHJlc3VtZWRBY3Rpdml0aWVzQ291bnQgPSBtQW1TdGF0ZS5nZXRSZXN1bWVkQWN0aXZpdGllc0NvdW50KCk7Ci0gICAgICAgIGlmICghbUFtU3RhdGUuZ2V0S2V5Z3VhcmRDb250cm9sbGVyU3RhdGUoKS5rZXlndWFyZFNob3dpbmcgJiYgcmVzdW1lZEFjdGl2aXRpZXNDb3VudCAhPSAxKSB7Ci0gICAgICAgICAgICBsb2coIioqKnJlc3VtZWRBY3Rpdml0aWVzQ291bnQ9IiArIHJlc3VtZWRBY3Rpdml0aWVzQ291bnQpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1BbVN0YXRlLmdldEZvY3VzZWRBY3Rpdml0eSgpID09IG51bGwpIHsKLSAgICAgICAgICAgIGxvZygiKioqZm9jdXNlZEFjdGl2aXR5PW51bGwiKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiB0cnVlIGlmIHNob3VsZCB3YWl0IGZvciBzb21lIGFjdGl2aXRpZXMgdG8gYmVjb21lIHZpc2libGUuICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHNob3VsZFdhaXRGb3JBY3Rpdml0aWVzKFN0cmluZ1tdIHdhaXRGb3JBY3Rpdml0aWVzVmlzaWJsZSwgaW50W10gc3RhY2tJZHMsCi0gICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUpIHsKLSAgICAgICAgaWYgKHdhaXRGb3JBY3Rpdml0aWVzVmlzaWJsZSA9PSBudWxsIHx8IHdhaXRGb3JBY3Rpdml0aWVzVmlzaWJsZS5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIC8vIElmIHRoZSBjYWxsZXIgaXMgaW50ZXJlc3RlZCBpbiB1cyB3YWl0aW5nIGZvciBzb21lIHBhcnRpY3VsYXIgYWN0aXZpdHkgd2luZG93cyB0byBiZQotICAgICAgICAvLyB2aXNpYmxlIGJlZm9yZSBjb21wdXRlIHRoZSBzdGF0ZS4gQ2hlY2sgZm9yIHRoZSB2aXNpYmlsaXR5IG9mIHRob3NlIGFjdGl2aXR5IHdpbmRvd3MKLSAgICAgICAgLy8gYW5kIGZvciBwbGFjaW5nIHRoZW0gaW4gY29ycmVjdCBzdGFja3MgKGlmIHJlcXVlc3RlZCkuCi0gICAgICAgIGJvb2xlYW4gYWxsQWN0aXZpdHlXaW5kb3dzVmlzaWJsZSA9IHRydWU7Ci0gICAgICAgIGJvb2xlYW4gdGFza3NJbkNvcnJlY3RTdGFja3MgPSB0cnVlOwotICAgICAgICBMaXN0PFdpbmRvd01hbmFnZXJTdGF0ZS5XaW5kb3dTdGF0ZT4gbWF0Y2hpbmdXaW5kb3dTdGF0ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3YWl0Rm9yQWN0aXZpdGllc1Zpc2libGUubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIC8vIENoZWNrIGlmIHdpbmRvdyBpcyB2aXNpYmxlIC0gaXQgc2hvdWxkIGJlIHJlcHJlc2VudGVkIGFzIG9uZSBvZiB0aGUgd2luZG93IHN0YXRlcy4KLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyB3aW5kb3dOYW1lID0gbVVzZUFjdGl2aXR5TmFtZXMgPwotICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXJUZXN0QmFzZS5nZXRXaW5kb3dOYW1lKHBhY2thZ2VOYW1lLCB3YWl0Rm9yQWN0aXZpdGllc1Zpc2libGVbaV0pCi0gICAgICAgICAgICAgICAgICAgIDogd2FpdEZvckFjdGl2aXRpZXNWaXNpYmxlW2ldOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGFjdGl2aXR5Q29tcG9uZW50TmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5TWFuYWdlclRlc3RCYXNlLmdldEFjdGl2aXR5Q29tcG9uZW50TmFtZShwYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0Rm9yQWN0aXZpdGllc1Zpc2libGVbaV0pOwotCi0gICAgICAgICAgICBtV21TdGF0ZS5nZXRNYXRjaGluZ1Zpc2libGVXaW5kb3dTdGF0ZSh3aW5kb3dOYW1lLCBtYXRjaGluZ1dpbmRvd1N0YXRlcyk7Ci0gICAgICAgICAgICBib29sZWFuIGFjdGl2aXR5V2luZG93VmlzaWJsZSA9ICFtYXRjaGluZ1dpbmRvd1N0YXRlcy5pc0VtcHR5KCk7Ci0gICAgICAgICAgICBpZiAoIWFjdGl2aXR5V2luZG93VmlzaWJsZSkgewotICAgICAgICAgICAgICAgIGxvZygiQWN0aXZpdHkgd2luZG93IG5vdCB2aXNpYmxlOiAiICsgd2luZG93TmFtZSk7Ci0gICAgICAgICAgICAgICAgYWxsQWN0aXZpdHlXaW5kb3dzVmlzaWJsZSA9IGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIGlmICghbUFtU3RhdGUuaXNBY3Rpdml0eVZpc2libGUoYWN0aXZpdHlDb21wb25lbnROYW1lKSkgewotICAgICAgICAgICAgICAgIGxvZygiQWN0aXZpdHkgbm90IHZpc2libGU6ICIgKyBhY3Rpdml0eUNvbXBvbmVudE5hbWUpOwotICAgICAgICAgICAgICAgIGFsbEFjdGl2aXR5V2luZG93c1Zpc2libGUgPSBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhY2tJZHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHdpbmRvdyBpcyBhbHJlYWR5IGluIHN0YWNrIHJlcXVlc3RlZCBieSB0ZXN0LgotICAgICAgICAgICAgICAgIGJvb2xlYW4gd2luZG93SW5Db3JyZWN0U3RhY2sgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBmb3IgKFdpbmRvd01hbmFnZXJTdGF0ZS5XaW5kb3dTdGF0ZSB3cyA6IG1hdGNoaW5nV2luZG93U3RhdGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh3cy5nZXRTdGFja0lkKCkgPT0gc3RhY2tJZHNbaV0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvd0luQ29ycmVjdFN0YWNrID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghd2luZG93SW5Db3JyZWN0U3RhY2spIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKCJXaW5kb3cgaW4gaW5jb3JyZWN0IHN0YWNrOiAiICsgd2FpdEZvckFjdGl2aXRpZXNWaXNpYmxlW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgdGFza3NJbkNvcnJlY3RTdGFja3MgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICFhbGxBY3Rpdml0eVdpbmRvd3NWaXNpYmxlIHx8ICF0YXNrc0luQ29ycmVjdFN0YWNrczsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiB0cnVlIGlmIHNob3VsZCB3YWl0IHZhbGlkIHdpbmRvd3Mgc3RhdGUuICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHNob3VsZFdhaXRGb3JXaW5kb3dzKCkgewotICAgICAgICBpZiAobVdtU3RhdGUuZ2V0RnJvbnRXaW5kb3coKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsb2coIioqKmZyb250V2luZG93PW51bGwiKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtV21TdGF0ZS5nZXRGb2N1c2VkV2luZG93KCkgPT0gbnVsbCkgewotICAgICAgICAgICAgbG9nKCIqKipmb2N1c2VkV2luZG93PW51bGwiKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtV21TdGF0ZS5nZXRGb2N1c2VkQXBwKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgbG9nKCIqKipmb2N1c2VkQXBwPW51bGwiKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBzaG91bGRXYWl0Rm9yRGVidWdnZXJXaW5kb3coKSB7Ci0gICAgICAgIExpc3Q8V2luZG93TWFuYWdlclN0YXRlLldpbmRvd1N0YXRlPiBtYXRjaGluZ1dpbmRvd1N0YXRlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBtV21TdGF0ZS5nZXRNYXRjaGluZ1Zpc2libGVXaW5kb3dTdGF0ZSgiYW5kcm9pZC5zZXJ2ZXIuY3RzIiwgbWF0Y2hpbmdXaW5kb3dTdGF0ZXMpOwotICAgICAgICBmb3IgKFdpbmRvd1N0YXRlIHdzIDogbWF0Y2hpbmdXaW5kb3dTdGF0ZXMpIHsKLSAgICAgICAgICAgIGlmICh3cy5pc0RlYnVnZ2VyV2luZG93KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbG9nKCJEZWJ1Z2dlciB3aW5kb3cgbm90IGF2YWlsYWJsZSB5ZXQiKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHNob3VsZFdhaXRGb3JBY3Rpdml0eVJlY29yZHMoU3RyaW5nW10gd2FpdEZvckFjdGl2aXR5UmVjb3JkcykgewotICAgICAgICBpZiAod2FpdEZvckFjdGl2aXR5UmVjb3JkcyA9PSBudWxsIHx8IHdhaXRGb3JBY3Rpdml0eVJlY29yZHMubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAvLyBDaGVjayBpZiB0aGUgYWN0aXZpdHkgcmVjb3JkcyB3ZSdyZSBsb29raW5nIGZvciBpcyBhbHJlYWR5IGFkZGVkLgotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdhaXRGb3JBY3Rpdml0eVJlY29yZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmICghbUFtU3RhdGUuaXNBY3Rpdml0eVZpc2libGUod2FpdEZvckFjdGl2aXR5UmVjb3Jkc1tpXSkpIHsKLSAgICAgICAgICAgICAgICBsb2coIkFjdGl2aXR5UmVjb3JkICIgKyB3YWl0Rm9yQWN0aXZpdHlSZWNvcmRzW2ldICsgIiBub3QgdmlzaWJsZSB5ZXQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQWN0aXZpdHlNYW5hZ2VyU3RhdGUgZ2V0QW1TdGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1BbVN0YXRlOwotICAgIH0KLQotICAgIHB1YmxpYyBXaW5kb3dNYW5hZ2VyU3RhdGUgZ2V0V21TdGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1XbVN0YXRlOwotICAgIH0KLQotICAgIHZvaWQgYXNzZXJ0U2FuaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydFRydWUoIk11c3QgaGF2ZSBzdGFja3MiLCBtQW1TdGF0ZS5nZXRTdGFja0NvdW50KCkgPiAwKTsKLSAgICAgICAgaWYgKCFtQW1TdGF0ZS5nZXRLZXlndWFyZENvbnRyb2xsZXJTdGF0ZSgpLmtleWd1YXJkU2hvd2luZykgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGVyZSBzaG91bGQgYmUgb25lIGFuZCBvbmx5IG9uZSByZXN1bWVkIGFjdGl2aXR5IGluIHRoZSBzeXN0ZW0uIiwKLSAgICAgICAgICAgICAgICAgICAgMSwgbUFtU3RhdGUuZ2V0UmVzdW1lZEFjdGl2aXRpZXNDb3VudCgpKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnROb3ROdWxsKCJNdXN0IGhhdmUgZm9jdXMgYWN0aXZpdHkuIiwgbUFtU3RhdGUuZ2V0Rm9jdXNlZEFjdGl2aXR5KCkpOwotCi0gICAgICAgIGZvciAoQWN0aXZpdHlTdGFjayBhU3RhY2sgOiBtQW1TdGF0ZS5nZXRTdGFja3MoKSkgewotICAgICAgICAgICAgZmluYWwgaW50IHN0YWNrSWQgPSBhU3RhY2subVN0YWNrSWQ7Ci0gICAgICAgICAgICBmb3IgKEFjdGl2aXR5VGFzayBhVGFzayA6IGFTdGFjay5nZXRUYXNrcygpKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJTdGFjayBjYW4gb25seSBjb250YWluIGl0cyBvd24gdGFza3MiLCBzdGFja0lkLCBhVGFzay5tU3RhY2tJZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnROb3ROdWxsKCJNdXN0IGhhdmUgZnJvbnQgd2luZG93LiIsIG1XbVN0YXRlLmdldEZyb250V2luZG93KCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJNdXN0IGhhdmUgZm9jdXNlZCB3aW5kb3cuIiwgbVdtU3RhdGUuZ2V0Rm9jdXNlZFdpbmRvdygpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiTXVzdCBoYXZlIGFwcC4iLCBtV21TdGF0ZS5nZXRGb2N1c2VkQXBwKCkpOwotICAgIH0KLQotICAgIHZvaWQgYXNzZXJ0Q29udGFpbnNTdGFjayhTdHJpbmcgbXNnLCBpbnQgc3RhY2tJZCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydFRydWUobXNnLCBtQW1TdGF0ZS5jb250YWluc1N0YWNrKHN0YWNrSWQpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShtc2csIG1XbVN0YXRlLmNvbnRhaW5zU3RhY2soc3RhY2tJZCkpOwotICAgIH0KLQotICAgIHZvaWQgYXNzZXJ0RG9lc05vdENvbnRhaW5TdGFjayhTdHJpbmcgbXNnLCBpbnQgc3RhY2tJZCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydEZhbHNlKG1zZywgbUFtU3RhdGUuY29udGFpbnNTdGFjayhzdGFja0lkKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKG1zZywgbVdtU3RhdGUuY29udGFpbnNTdGFjayhzdGFja0lkKSk7Ci0gICAgfQotCi0gICAgdm9pZCBhc3NlcnRGcm9udFN0YWNrKFN0cmluZyBtc2csIGludCBzdGFja0lkKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG1zZywgc3RhY2tJZCwgbUFtU3RhdGUuZ2V0RnJvbnRTdGFja0lkKERFRkFVTFRfRElTUExBWV9JRCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMobXNnLCBzdGFja0lkLCBtV21TdGF0ZS5nZXRGcm9udFN0YWNrSWQoREVGQVVMVF9ESVNQTEFZX0lEKSk7Ci0gICAgfQotCi0gICAgdm9pZCBhc3NlcnRGb2N1c2VkU3RhY2soU3RyaW5nIG1zZywgaW50IHN0YWNrSWQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRFcXVhbHMobXNnLCBzdGFja0lkLCBtQW1TdGF0ZS5nZXRGb2N1c2VkU3RhY2tJZCgpKTsKLSAgICB9Ci0KLSAgICB2b2lkIGFzc2VydE5vdEZvY3VzZWRTdGFjayhTdHJpbmcgbXNnLCBpbnQgc3RhY2tJZCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChzdGFja0lkID09IG1BbVN0YXRlLmdldEZvY3VzZWRTdGFja0lkKCkpIHsKLSAgICAgICAgICAgIGZhaWxOb3RFcXVhbHMobXNnLCBzdGFja0lkLCBtQW1TdGF0ZS5nZXRGb2N1c2VkU3RhY2tJZCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgYXNzZXJ0Rm9jdXNlZEFjdGl2aXR5KFN0cmluZyBtc2csIFN0cmluZyBhY3Rpdml0eU5hbWUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRGb2N1c2VkQWN0aXZpdHkobXNnLCBjb21wb25lbnROYW1lLCBhY3Rpdml0eU5hbWUpOwotICAgIH0KLQotICAgIHZvaWQgYXNzZXJ0Rm9jdXNlZEFjdGl2aXR5KFN0cmluZyBtc2csIFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGFjdGl2aXR5TmFtZSkKLSAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBTdHJpbmcgY29tcG9uZW50TmFtZSA9IEFjdGl2aXR5TWFuYWdlclRlc3RCYXNlLmdldEFjdGl2aXR5Q29tcG9uZW50TmFtZShwYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICBhY3Rpdml0eU5hbWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMobXNnLCBjb21wb25lbnROYW1lLCBtQW1TdGF0ZS5nZXRGb2N1c2VkQWN0aXZpdHkoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhtc2csIGNvbXBvbmVudE5hbWUsIG1XbVN0YXRlLmdldEZvY3VzZWRBcHAoKSk7Ci0gICAgfQotCi0gICAgdm9pZCBhc3NlcnROb3RGb2N1c2VkQWN0aXZpdHkoU3RyaW5nIG1zZywgU3RyaW5nIGFjdGl2aXR5TmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBjb21wb25lbnROYW1lID0gQWN0aXZpdHlNYW5hZ2VyVGVzdEJhc2UuZ2V0QWN0aXZpdHlDb21wb25lbnROYW1lKGFjdGl2aXR5TmFtZSk7Ci0gICAgICAgIGlmIChtQW1TdGF0ZS5nZXRGb2N1c2VkQWN0aXZpdHkoKS5lcXVhbHMoY29tcG9uZW50TmFtZSkpIHsKLSAgICAgICAgICAgIGZhaWxOb3RFcXVhbHMobXNnLCBtQW1TdGF0ZS5nZXRGb2N1c2VkQWN0aXZpdHkoKSwgY29tcG9uZW50TmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1XbVN0YXRlLmdldEZvY3VzZWRBcHAoKS5lcXVhbHMoY29tcG9uZW50TmFtZSkpIHsKLSAgICAgICAgICAgIGZhaWxOb3RFcXVhbHMobXNnLCBtV21TdGF0ZS5nZXRGb2N1c2VkQXBwKCksIGNvbXBvbmVudE5hbWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBhc3NlcnRSZXN1bWVkQWN0aXZpdHkoU3RyaW5nIG1zZywgU3RyaW5nIGFjdGl2aXR5TmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBjb21wb25lbnROYW1lID0gQWN0aXZpdHlNYW5hZ2VyVGVzdEJhc2UuZ2V0QWN0aXZpdHlDb21wb25lbnROYW1lKGFjdGl2aXR5TmFtZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhtc2csIGNvbXBvbmVudE5hbWUsIG1BbVN0YXRlLmdldFJlc3VtZWRBY3Rpdml0eSgpKTsKLSAgICB9Ci0KLSAgICB2b2lkIGFzc2VydE5vdFJlc3VtZWRBY3Rpdml0eShTdHJpbmcgbXNnLCBTdHJpbmcgYWN0aXZpdHlOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIGNvbXBvbmVudE5hbWUgPSBBY3Rpdml0eU1hbmFnZXJUZXN0QmFzZS5nZXRBY3Rpdml0eUNvbXBvbmVudE5hbWUoYWN0aXZpdHlOYW1lKTsKLSAgICAgICAgaWYgKG1BbVN0YXRlLmdldFJlc3VtZWRBY3Rpdml0eSgpLmVxdWFscyhjb21wb25lbnROYW1lKSkgewotICAgICAgICAgICAgZmFpbE5vdEVxdWFscyhtc2csIG1BbVN0YXRlLmdldFJlc3VtZWRBY3Rpdml0eSgpLCBjb21wb25lbnROYW1lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgYXNzZXJ0Rm9jdXNlZFdpbmRvdyhTdHJpbmcgbXNnLCBTdHJpbmcgd2luZG93TmFtZSkgewotICAgICAgICBhc3NlcnRFcXVhbHMobXNnLCB3aW5kb3dOYW1lLCBtV21TdGF0ZS5nZXRGb2N1c2VkV2luZG93KCkpOwotICAgIH0KLQotICAgIHZvaWQgYXNzZXJ0Tm90Rm9jdXNlZFdpbmRvdyhTdHJpbmcgbXNnLCBTdHJpbmcgd2luZG93TmFtZSkgewotICAgICAgICBpZiAobVdtU3RhdGUuZ2V0Rm9jdXNlZFdpbmRvdygpLmVxdWFscyh3aW5kb3dOYW1lKSkgewotICAgICAgICAgICAgZmFpbE5vdEVxdWFscyhtc2csIG1XbVN0YXRlLmdldEZvY3VzZWRXaW5kb3coKSwgd2luZG93TmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGFzc2VydEZyb250V2luZG93KFN0cmluZyBtc2csIFN0cmluZyB3aW5kb3dOYW1lKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscyhtc2csIHdpbmRvd05hbWUsIG1XbVN0YXRlLmdldEZyb250V2luZG93KCkpOwotICAgIH0KLQotICAgIHZvaWQgYXNzZXJ0VmlzaWJpbGl0eShTdHJpbmcgYWN0aXZpdHlOYW1lLCBib29sZWFuIHZpc2libGUpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIGFjdGl2aXR5Q29tcG9uZW50TmFtZSA9Ci0gICAgICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyVGVzdEJhc2UuZ2V0QWN0aXZpdHlDb21wb25lbnROYW1lKGFjdGl2aXR5TmFtZSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyB3aW5kb3dOYW1lID0KLSAgICAgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXJUZXN0QmFzZS5nZXRXaW5kb3dOYW1lKGFjdGl2aXR5TmFtZSk7Ci0gICAgICAgIGFzc2VydFZpc2liaWxpdHkoYWN0aXZpdHlDb21wb25lbnROYW1lLCB3aW5kb3dOYW1lLCB2aXNpYmxlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0VmlzaWJpbGl0eShTdHJpbmcgYWN0aXZpdHlDb21wb25lbnROYW1lLCBTdHJpbmcgd2luZG93TmFtZSwKLSAgICAgICAgICAgIGJvb2xlYW4gdmlzaWJsZSkgewotICAgICAgICBmaW5hbCBib29sZWFuIGFjdGl2aXR5VmlzaWJsZSA9IG1BbVN0YXRlLmlzQWN0aXZpdHlWaXNpYmxlKGFjdGl2aXR5Q29tcG9uZW50TmFtZSk7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gd2luZG93VmlzaWJsZSA9IG1XbVN0YXRlLmlzV2luZG93VmlzaWJsZSh3aW5kb3dOYW1lKTsKLQotICAgICAgICBpZiAodmlzaWJsZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQWN0aXZpdHk9IiArIGFjdGl2aXR5Q29tcG9uZW50TmFtZSArICIgbXVzdCBiZSB2aXNpYmxlLiIsIGFjdGl2aXR5VmlzaWJsZSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJXaW5kb3c9IiArIHdpbmRvd05hbWUgKyAiIG11c3QgYmUgdmlzaWJsZS4iLCB3aW5kb3dWaXNpYmxlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKCJBY3Rpdml0eT0iICsgYWN0aXZpdHlDb21wb25lbnROYW1lICsgIiBtdXN0IE5PVCBiZSB2aXNpYmxlLiIsCi0gICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5VmlzaWJsZSk7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZSgiV2luZG93PSIgKyB3aW5kb3dOYW1lICsgIiBtdXN0IE5PVCBiZSB2aXNpYmxlLiIsIHdpbmRvd1Zpc2libGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBhc3NlcnRIb21lQWN0aXZpdHlWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotICAgICAgICBTdHJpbmcgbmFtZSA9IG1BbVN0YXRlLmdldEhvbWVBY3Rpdml0eU5hbWUoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChuYW1lKTsKLSAgICAgICAgYXNzZXJ0VmlzaWJpbGl0eShuYW1lLCBnZXRXaW5kb3dOYW1lRm9yQWN0aXZpdHlOYW1lKG5hbWUpLCB2aXNpYmxlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBc3NlcnRzIHRoYXQgdGhlIGRldmljZSBkZWZhdWx0IGRpc3BsYXkgbWluaW1pbSB3aWR0aCBpcyBsYXJnZXIgdGhhbiB0aGUgbWluaW11bSB0YXNrIHdpZHRoLgotICAgICAqLwotICAgIHZvaWQgYXNzZXJ0RGV2aWNlRGVmYXVsdERpc3BsYXlTaXplKElUZXN0RGV2aWNlIGRldmljZSwgU3RyaW5nIGVycm9yTWVzc2FnZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNvbXB1dGVTdGF0ZShkZXZpY2UsIG51bGwpOwotICAgICAgICBmaW5hbCBpbnQgbWluVGFza1NpemVQeCA9IGRlZmF1bHRNaW5pbWFsVGFza1NpemUoREVGQVVMVF9ESVNQTEFZX0lEKTsKLSAgICAgICAgZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gZ2V0V21TdGF0ZSgpLmdldERpc3BsYXkoREVGQVVMVF9ESVNQTEFZX0lEKTsKLSAgICAgICAgZmluYWwgUmVjdGFuZ2xlIGRpc3BsYXlSZWN0ID0gZGlzcGxheS5nZXREaXNwbGF5UmVjdCgpOwotICAgICAgICBpZiAoTWF0aC5taW4oZGlzcGxheVJlY3Qud2lkdGgsIGRpc3BsYXlSZWN0LmhlaWdodCkgPCBtaW5UYXNrU2l6ZVB4KSB7Ci0gICAgICAgICAgICBmYWlsKGVycm9yTWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRXaW5kb3dOYW1lRm9yQWN0aXZpdHlOYW1lKFN0cmluZyBhY3Rpdml0eU5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGFjdGl2aXR5TmFtZS5yZXBsYWNlQWxsKCIoLiopXFwvXFwuIiwgIiQxLyQxLiIpOwotICAgIH0KLQotICAgIGJvb2xlYW4gdGFza0xpc3RzSW5BbUFuZFdtQXJlRXF1YWwoKSB7Ci0gICAgICAgIGZvciAoQWN0aXZpdHlTdGFjayBhU3RhY2sgOiBtQW1TdGF0ZS5nZXRTdGFja3MoKSkgewotICAgICAgICAgICAgZmluYWwgaW50IHN0YWNrSWQgPSBhU3RhY2subVN0YWNrSWQ7Ci0gICAgICAgICAgICBmaW5hbCBXaW5kb3dTdGFjayB3U3RhY2sgPSBtV21TdGF0ZS5nZXRTdGFjayhzdGFja0lkKTsKLSAgICAgICAgICAgIGlmICh3U3RhY2sgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxvZygiV2FpdGluZyBmb3Igc3RhY2sgc2V0dXAgaW4gV00sIHN0YWNrSWQ9IiArIHN0YWNrSWQpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yIChBY3Rpdml0eVRhc2sgYVRhc2sgOiBhU3RhY2suZ2V0VGFza3MoKSkgewotICAgICAgICAgICAgICAgIGlmICh3U3RhY2suZ2V0VGFzayhhVGFzay5tVGFza0lkKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZygiVGFzayBpcyBpbiBBTSBidXQgbm90IGluIFdNLCB3YWl0aW5nIGZvciBpdCB0byBzZXR0bGUsIHRhc2tJZD0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBhVGFzay5tVGFza0lkKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yIChXaW5kb3dUYXNrIHdUYXNrIDogd1N0YWNrLm1UYXNrcykgewotICAgICAgICAgICAgICAgIGlmIChhU3RhY2suZ2V0VGFzayh3VGFzay5tVGFza0lkKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZygiVGFzayBpcyBpbiBXTSBidXQgbm90IGluIEFNLCB3YWl0aW5nIGZvciBpdCB0byBzZXR0bGUsIHRhc2tJZD0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB3VGFzay5tVGFza0lkKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpbnQgZ2V0U3RhY2tQb3NpdGlvbihpbnQgc3RhY2tJZCkgewotICAgICAgICBpbnQgd21TdGFja0luZGV4ID0gbVdtU3RhdGUuZ2V0U3RhY2tQb3NpdGlvbihzdGFja0lkKTsKLSAgICAgICAgaW50IGFtU3RhY2tJbmRleCA9IG1BbVN0YXRlLmdldFN0YWNrUG9zaXRpb24oc3RhY2tJZCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiV2luZG93IGFuZCBhY3Rpdml0eSBtYW5hZ2VyIG11c3QgaGF2ZSB0aGUgc2FtZSBzdGFjayBwb3NpdGlvbiBpbmRleCIsCi0gICAgICAgICAgICAgICAgYW1TdGFja0luZGV4LCB3bVN0YWNrSW5kZXgpOwotICAgICAgICByZXR1cm4gd21TdGFja0luZGV4OwotICAgIH0KLQotICAgIGJvb2xlYW4gc3RhY2tCb3VuZHNJbkFNQW5kV01BcmVFcXVhbCgpIHsKLSAgICAgICAgZm9yIChBY3Rpdml0eVN0YWNrIGFTdGFjayA6IG1BbVN0YXRlLmdldFN0YWNrcygpKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgc3RhY2tJZCA9IGFTdGFjay5tU3RhY2tJZDsKLSAgICAgICAgICAgIGZpbmFsIFdpbmRvd1N0YWNrIHdTdGFjayA9IG1XbVN0YXRlLmdldFN0YWNrKHN0YWNrSWQpOwotICAgICAgICAgICAgaWYgKGFTdGFjay5pc0Z1bGxzY3JlZW4oKSAhPSB3U3RhY2suaXNGdWxsc2NyZWVuKCkpIHsKLSAgICAgICAgICAgICAgICBsb2coIldhaXRpbmcgZm9yIGNvcnJlY3QgZnVsbHNjcmVlbiBzdGF0ZSwgc3RhY2tJZD0iICsgc3RhY2tJZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmaW5hbCBSZWN0YW5nbGUgYVN0YWNrQm91bmRzID0gYVN0YWNrLmdldEJvdW5kcygpOwotICAgICAgICAgICAgZmluYWwgUmVjdGFuZ2xlIHdTdGFja0JvdW5kcyA9IHdTdGFjay5nZXRCb3VuZHMoKTsKLQotICAgICAgICAgICAgaWYgKGFTdGFjay5pc0Z1bGxzY3JlZW4oKSkgewotICAgICAgICAgICAgICAgIGlmIChhU3RhY2tCb3VuZHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBsb2coIldhaXRpbmcgZm9yIGNvcnJlY3Qgc3RhY2sgc3RhdGUgaW4gQU0sIHN0YWNrSWQ9IiArIHN0YWNrSWQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICghT2JqZWN0cy5lcXVhbHMoYVN0YWNrQm91bmRzLCB3U3RhY2tCb3VuZHMpKSB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgc3RhY2sgaXMgbm90IGZ1bGxzY3JlZW4gLSBjb21wYXJpbmcgYm91bmRzLiBOb3QgZG9pbmcgaXQgYWx3YXlzIGJlY2F1c2UKLSAgICAgICAgICAgICAgICAvLyBmb3IgZnVsbHNjcmVlbiBzdGFjayBib3VuZHMgaW4gV00gY2FuIGJlIGVpdGhlciBudWxsIG9yIGVxdWFsIHRvIGRpc3BsYXkgc2l6ZS4KLSAgICAgICAgICAgICAgICBsb2coIldhaXRpbmcgZm9yIHN0YWNrIGJvdW5kIGVxdWFsaXR5IGluIEFNIGFuZCBXTSwgc3RhY2tJZD0iICsgc3RhY2tJZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqIENoZWNrIHRhc2sgYm91bmRzIHdoZW4gZG9ja2VkIHRvIHRvcC9sZWZ0LiAqLwotICAgIHZvaWQgYXNzZXJ0RG9ja2VkVGFza0JvdW5kcyhpbnQgdGFza1dpZHRoLCBpbnQgdGFza0hlaWdodCwgU3RyaW5nIGFjdGl2aXR5TmFtZSkgewotICAgICAgICAvLyBUYXNrIHNpemUgY2FuIGJlIGFmZmVjdGVkIGJ5IGRlZmF1bHQgbWluaW1hbCBzaXplLgotICAgICAgICBpbnQgZGVmYXVsdE1pbmltYWxUYXNrU2l6ZSA9IGRlZmF1bHRNaW5pbWFsVGFza1NpemUoCi0gICAgICAgICAgICAgICAgbUFtU3RhdGUuZ2V0U3RhY2tCeUlkKEFjdGl2aXR5TWFuYWdlclRlc3RCYXNlLkRPQ0tFRF9TVEFDS19JRCkubURpc3BsYXlJZCk7Ci0gICAgICAgIGludCB0YXJnZXRXaWR0aCA9IE1hdGgubWF4KHRhc2tXaWR0aCwgZGVmYXVsdE1pbmltYWxUYXNrU2l6ZSk7Ci0gICAgICAgIGludCB0YXJnZXRIZWlnaHQgPSBNYXRoLm1heCh0YXNrSGVpZ2h0LCBkZWZhdWx0TWluaW1hbFRhc2tTaXplKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCB0YXJnZXRXaWR0aCwgdGFyZ2V0SGVpZ2h0KSwKLSAgICAgICAgICAgICAgICBtQW1TdGF0ZS5nZXRUYXNrQnlBY3Rpdml0eU5hbWUoYWN0aXZpdHlOYW1lKS5nZXRCb3VuZHMoKSk7Ci0gICAgfQotCi0gICAgdm9pZCBhc3NlcnRWYWxpZEJvdW5kcyhib29sZWFuIGNvbXBhcmVUYXNrQW5kU3RhY2tCb3VuZHMpIHsKLSAgICAgICAgLy8gQ3ljbGUgdGhyb3VnaCB0aGUgc3RhY2tzIGFuZCB0YXNrcyB0byBmaWd1cmUgb3V0IGlmIHRoZSBob21lIHN0YWNrIGlzIHJlc2l6YWJsZQotICAgICAgICBmaW5hbCBBY3Rpdml0eVRhc2sgaG9tZVRhc2sgPSBtQW1TdGF0ZS5nZXRIb21lVGFzaygpOwotICAgICAgICBmaW5hbCBib29sZWFuIGhvbWVTdGFja0lzUmVzaXphYmxlID0gaG9tZVRhc2sgIT0gbnVsbAotICAgICAgICAgICAgICAgICYmIGhvbWVUYXNrLmdldFJlc2l6ZU1vZGUoKS5lcXVhbHMoUkVTSVpFX01PREVfUkVTSVpFQUJMRSk7Ci0KLSAgICAgICAgZm9yIChBY3Rpdml0eVN0YWNrIGFTdGFjayA6IG1BbVN0YXRlLmdldFN0YWNrcygpKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgc3RhY2tJZCA9IGFTdGFjay5tU3RhY2tJZDsKLSAgICAgICAgICAgIGZpbmFsIFdpbmRvd1N0YWNrIHdTdGFjayA9IG1XbVN0YXRlLmdldFN0YWNrKHN0YWNrSWQpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgic3RhY2tJZD0iICsgc3RhY2tJZCArICIgaW4gQU0gYnV0IG5vdCBpbiBXTT8iLCB3U3RhY2spOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlN0YWNrIGZ1bGxzY3JlZW4gc3RhdGUgaW4gQU0gYW5kIFdNIG11c3QgYmUgZXF1YWwgc3RhY2tJZD0iICsgc3RhY2tJZCwKLSAgICAgICAgICAgICAgICAgICAgYVN0YWNrLmlzRnVsbHNjcmVlbigpLCB3U3RhY2suaXNGdWxsc2NyZWVuKCkpOwotCi0gICAgICAgICAgICBmaW5hbCBSZWN0YW5nbGUgYVN0YWNrQm91bmRzID0gYVN0YWNrLmdldEJvdW5kcygpOwotICAgICAgICAgICAgZmluYWwgUmVjdGFuZ2xlIHdTdGFja0JvdW5kcyA9IHdTdGFjay5nZXRCb3VuZHMoKTsKLQotICAgICAgICAgICAgaWYgKGFTdGFjay5pc0Z1bGxzY3JlZW4oKSkgewotICAgICAgICAgICAgICAgIGFzc2VydE51bGwoIlN0YWNrIGJvdW5kcyBpbiBBTSBtdXN0IGJlIG51bGwgc3RhY2tJZD0iICsgc3RhY2tJZCwgYVN0YWNrQm91bmRzKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJTdGFjayBib3VuZHMgaW4gQU0gYW5kIFdNIG11c3QgYmUgZXF1YWwgc3RhY2tJZD0iICsgc3RhY2tJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFTdGFja0JvdW5kcywgd1N0YWNrQm91bmRzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yIChBY3Rpdml0eVRhc2sgYVRhc2sgOiBhU3RhY2suZ2V0VGFza3MoKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCB0YXNrSWQgPSBhVGFzay5tVGFza0lkOwotICAgICAgICAgICAgICAgIGZpbmFsIFdpbmRvd1Rhc2sgd1Rhc2sgPSB3U3RhY2suZ2V0VGFzayh0YXNrSWQpOwotICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoCi0gICAgICAgICAgICAgICAgICAgICAgICAidGFza0lkPSIgKyB0YXNrSWQgKyAiIGluIEFNIGJ1dCBub3QgaW4gV00/IHN0YWNrSWQ9IiArIHN0YWNrSWQsIHdUYXNrKTsKLQotICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYVRhc2tJc0Z1bGxzY3JlZW4gPSBhVGFzay5pc0Z1bGxzY3JlZW4oKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHdUYXNrSXNGdWxsc2NyZWVuID0gd1Rhc2suaXNGdWxsc2NyZWVuKCk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUYXNrIGZ1bGxzY3JlZW4gc3RhdGUgaW4gQU0gYW5kIFdNIG11c3QgYmUgZXF1YWwgdGFza0lkPSIgKyB0YXNrSWQKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgc3RhY2tJZD0iICsgc3RhY2tJZCwgYVRhc2tJc0Z1bGxzY3JlZW4sIHdUYXNrSXNGdWxsc2NyZWVuKTsKLQotICAgICAgICAgICAgICAgIGZpbmFsIFJlY3RhbmdsZSBhVGFza0JvdW5kcyA9IGFUYXNrLmdldEJvdW5kcygpOwotICAgICAgICAgICAgICAgIGZpbmFsIFJlY3RhbmdsZSB3VGFza0JvdW5kcyA9IHdUYXNrLmdldEJvdW5kcygpOwotICAgICAgICAgICAgICAgIGZpbmFsIFJlY3RhbmdsZSBkaXNwbGF5UmVjdCA9IG1XbVN0YXRlLmdldERpc3BsYXkoYVN0YWNrLm1EaXNwbGF5SWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RGlzcGxheVJlY3QoKTsKLQotICAgICAgICAgICAgICAgIGlmIChhVGFza0lzRnVsbHNjcmVlbikgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnROdWxsKCJUYXNrIGJvdW5kcyBpbiBBTSBtdXN0IGJlIG51bGwgZm9yIGZ1bGxzY3JlZW4gdGFza0lkPSIgKyB0YXNrSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYVRhc2tCb3VuZHMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWhvbWVTdGFja0lzUmVzaXphYmxlICYmIG1XbVN0YXRlLmlzRG9ja2VkU3RhY2tNaW5pbWl6ZWQoKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgZGlzcGxheVJlY3QuZ2V0V2lkdGgoKSA+IGRpc3BsYXlSZWN0LmdldEhlaWdodCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gbWluaW1pemVkIHVzaW5nIG5vbi1yZXNpemFibGUgbGF1bmNoZXIgaW4gbGFuZHNjYXBlIG1vZGUsIGl0IHdpbGwgbW92ZQotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdGFzayBvZmZzY3JlZW4gaW4gdGhlIG5lZ2F0aXZlIHggZGlyZWN0aW9uIHVubGlrZSBwb3J0cmFpdCB0aGF0IGNyb3BzLgotICAgICAgICAgICAgICAgICAgICAvLyBUaGUgeCB2YWx1ZSBpbiB0aGUgdGFzayBib3VuZHMgd2lsbCBub3QgbWF0Y2ggdGhlIHN0YWNrIGJvdW5kcyBzaW5jZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgLy8gb25seSB0aGUgdGFzayB3YXMgbW92ZWQuCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGFzayBib3VuZHMgaW4gQU0gYW5kIFdNIG11c3QgbWF0Y2ggd2lkdGggdGFza0lkPSIgKyB0YXNrSWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHN0YWNrSWQiICsgc3RhY2tJZCwgYVRhc2tCb3VuZHMuZ2V0V2lkdGgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3VGFza0JvdW5kcy5nZXRXaWR0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUYXNrIGJvdW5kcyBpbiBBTSBhbmQgV00gbXVzdCBtYXRjaCBoZWlnaHQgdGFza0lkPSIgKyB0YXNrSWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgc3RhY2tJZCIgKyBzdGFja0lkLCBhVGFza0JvdW5kcy5nZXRIZWlnaHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3VGFza0JvdW5kcy5nZXRIZWlnaHQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGFzayBib3VuZHMgbXVzdCBtYXRjaCBzdGFjayBib3VuZHMgeSB0YXNrSWQ9IiArIHRhc2tJZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBzdGFja0lkIiArIHN0YWNrSWQsIGFUYXNrQm91bmRzLmdldFkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3VGFza0JvdW5kcy5nZXRZKCkpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRhc2sgYW5kIHN0YWNrIGJvdW5kcyBtdXN0IG1hdGNoIHdpZHRoIHRhc2tJZD0iICsgdGFza0lkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHN0YWNrSWQiICsgc3RhY2tJZCwgYVN0YWNrQm91bmRzLmdldFdpZHRoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd1Rhc2tCb3VuZHMuZ2V0V2lkdGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGFzayBhbmQgc3RhY2sgYm91bmRzIG11c3QgbWF0Y2ggaGVpZ2h0IHRhc2tJZD0iICsgdGFza0lkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHN0YWNrSWQiICsgc3RhY2tJZCwgYVN0YWNrQm91bmRzLmdldEhlaWdodCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdUYXNrQm91bmRzLmdldEhlaWdodCgpKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUYXNrIGFuZCBzdGFjayBib3VuZHMgbXVzdCBtYXRjaCB5IHRhc2tJZD0iICsgdGFza0lkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHN0YWNrSWQiICsgc3RhY2tJZCwgYVN0YWNrQm91bmRzLmdldFkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3VGFza0JvdW5kcy5nZXRZKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGFzayBib3VuZHMgaW4gQU0gYW5kIFdNIG11c3QgYmUgZXF1YWwgdGFza0lkPSIgKyB0YXNrSWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHN0YWNrSWQ9IiArIHN0YWNrSWQsIGFUYXNrQm91bmRzLCB3VGFza0JvdW5kcyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBhcmVUYXNrQW5kU3RhY2tCb3VuZHMgJiYgc3RhY2tJZCAhPSBGUkVFRk9STV9XT1JLU1BBQ0VfU1RBQ0tfSUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBhVGFza01pbldpZHRoID0gYVRhc2suZ2V0TWluV2lkdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBhVGFza01pbkhlaWdodCA9IGFUYXNrLmdldE1pbkhlaWdodCgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYVRhc2tNaW5XaWR0aCA9PSAtMSB8fCBhVGFza01pbkhlaWdodCA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1pbmltYWwgZGltZW5zaW9uKHMpIG5vdCBzZXQgZm9yIHRhc2sgLSBpdCBzaG91bGQgYmUgdXNpbmcgZGVmYXVsdHMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlZmF1bHRNaW5pbWFsU2l6ZSA9IChzdGFja0lkID09IFBJTk5FRF9TVEFDS19JRCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZGVmYXVsdE1pbmltYWxQaW5uZWRUYXNrU2l6ZShhU3RhY2subURpc3BsYXlJZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZGVmYXVsdE1pbmltYWxUYXNrU2l6ZShhU3RhY2subURpc3BsYXlJZCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYVRhc2tNaW5XaWR0aCA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVGFza01pbldpZHRoID0gZGVmYXVsdE1pbmltYWxTaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYVRhc2tNaW5IZWlnaHQgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVRhc2tNaW5IZWlnaHQgPSBkZWZhdWx0TWluaW1hbFNpemU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYVN0YWNrQm91bmRzLmdldFdpZHRoKCkgPj0gYVRhc2tNaW5XaWR0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBhU3RhY2tCb3VuZHMuZ2V0SGVpZ2h0KCkgPj0gYVRhc2tNaW5IZWlnaHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgc3RhY2tJZCA9PSBQSU5ORURfU1RBQ0tfSUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCb3VuZHMgYXJlIG5vdCBzbWFsbGVyIHRoZW4gbWluaW1hbCBwb3NzaWJsZSwgc28gc3RhY2sgYW5kIHRhc2sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBib3VuZHMgbXVzdCBiZSBlcXVhbC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRhc2sgYm91bmRzIG11c3QgYmUgZXF1YWwgdG8gc3RhY2sgYm91bmRzIHRhc2tJZD0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRhc2tJZCArICIsIHN0YWNrSWQ9IiArIHN0YWNrSWQsIGFTdGFja0JvdW5kcywgd1Rhc2tCb3VuZHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGFja0lkID09IERPQ0tFRF9TVEFDS19JRCAmJiBob21lU3RhY2tJc1Jlc2l6YWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtV21TdGF0ZS5pc0RvY2tlZFN0YWNrTWluaW1pemVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQb3J0cmFpdCBpZiB0aGUgZGlzcGxheSBoZWlnaHQgaXMgbGFyZ2VyIHRoYW4gdGhlIHdpZHRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpc3BsYXlSZWN0LmdldEhlaWdodCgpID4gZGlzcGxheVJlY3QuZ2V0V2lkdGgoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRhc2sgd2lkdGggbXVzdCBiZSBlcXVhbCB0byBzdGFjayB3aWR0aCB0YXNrSWQ9IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdGFza0lkICsgIiwgc3RhY2tJZD0iICsgc3RhY2tJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhU3RhY2tCb3VuZHMuZ2V0V2lkdGgoKSwgd1Rhc2tCb3VuZHMuZ2V0V2lkdGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIlRhc2sgaGVpZ2h0IG11c3QgYmUgZ3JlYXRlciB0aGFuIHN0YWNrIGhlaWdodCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAidGFza0lkPSIgKyB0YXNrSWQgKyAiLCBzdGFja0lkPSIgKyBzdGFja0lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFTdGFja0JvdW5kcy5nZXRIZWlnaHQoKSA8IHdUYXNrQm91bmRzLmdldEhlaWdodCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUYXNrIGFuZCBzdGFjayB4IHBvc2l0aW9uIG11c3QgYmUgZXF1YWwgdGFza0lkPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRhc2tJZCArICIsIHN0YWNrSWQ9IiArIHN0YWNrSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd1Rhc2tCb3VuZHMuZ2V0WCgpLCB3U3RhY2tCb3VuZHMuZ2V0WCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJUYXNrIHdpZHRoIG11c3QgYmUgZ3JlYXRlciB0aGFuIHN0YWNrIHdpZHRoIHRhc2tJZD0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0YXNrSWQgKyAiLCBzdGFja0lkPSIgKyBzdGFja0lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFTdGFja0JvdW5kcy5nZXRXaWR0aCgpIDwgd1Rhc2tCb3VuZHMuZ2V0V2lkdGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGFzayBoZWlnaHQgbXVzdCBiZSBlcXVhbCB0byBzdGFjayBoZWlnaHQgdGFza0lkPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRhc2tJZCArICIsIHN0YWNrSWQ9IiArIHN0YWNrSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVN0YWNrQm91bmRzLmdldEhlaWdodCgpLCB3VGFza0JvdW5kcy5nZXRIZWlnaHQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGFzayBhbmQgc3RhY2sgeSBwb3NpdGlvbiBtdXN0IGJlIGVxdWFsIHRhc2tJZD0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0YXNrSWQgKyAiLCBzdGFja0lkPSIgKyBzdGFja0lkLCB3VGFza0JvdW5kcy5nZXRZKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd1N0YWNrQm91bmRzLmdldFkoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNaW5pbWFsIGRpbWVuc2lvbnMgYWZmZWN0IHRhc2sgc2l6ZSwgc28gYm91bmRzIG9mIHRhc2sgYW5kIHN0YWNrIG11c3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZSBkaWZmZXJlbnQgLSB3aWxsIGNvbXBhcmUgZGltZW5zaW9ucyBpbnN0ZWFkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0YXJnZXRXaWR0aCA9IChpbnQpIE1hdGgubWF4KGFUYXNrTWluV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhU3RhY2tCb3VuZHMuZ2V0V2lkdGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUYXNrIHdpZHRoIG11c3QgYmUgc2V0IGFjY29yZGluZyB0byBtaW5pbWFsIHdpZHRoIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgdGFza0lkPSIgKyB0YXNrSWQgKyAiLCBzdGFja0lkPSIgKyBzdGFja0lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0V2lkdGgsIChpbnQpIHdUYXNrQm91bmRzLmdldFdpZHRoKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0YXJnZXRIZWlnaHQgPSAoaW50KSBNYXRoLm1heChhVGFza01pbkhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFTdGFja0JvdW5kcy5nZXRIZWlnaHQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUYXNrIGhlaWdodCBtdXN0IGJlIHNldCBhY2NvcmRpbmcgdG8gbWluaW1hbCBoZWlnaHQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB0YXNrSWQ9IiArIHRhc2tJZCArICIsIHN0YWNrSWQ9IiArIHN0YWNrSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRIZWlnaHQsIChpbnQpIHdUYXNrQm91bmRzLmdldEhlaWdodCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBpbnQgZHBUb1B4KGZsb2F0IGRwLCBpbnQgZGVuc2l0eURwaSl7Ci0gICAgICAgIHJldHVybiAoaW50KSAoZHAgKiBkZW5zaXR5RHBpIC8gRElTUExBWV9ERU5TSVRZX0RFRkFVTFQgKyAwLjVmKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBkZWZhdWx0TWluaW1hbFRhc2tTaXplKGludCBkaXNwbGF5SWQpIHsKLSAgICAgICAgcmV0dXJuIGRwVG9QeChERUZBVUxUX1JFU0laQUJMRV9UQVNLX1NJWkVfRFAsIG1XbVN0YXRlLmdldERpc3BsYXkoZGlzcGxheUlkKS5nZXREcGkoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZGVmYXVsdE1pbmltYWxQaW5uZWRUYXNrU2l6ZShpbnQgZGlzcGxheUlkKSB7Ci0gICAgICAgIHJldHVybiBkcFRvUHgoREVGQVVMVF9QSVBfUkVTSVpBQkxFX1RBU0tfU0laRV9EUCwgbVdtU3RhdGUuZ2V0RGlzcGxheShkaXNwbGF5SWQpLmdldERwaSgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci91dGlsL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvQWN0aXZpdHlNYW5hZ2VyU3RhdGUuamF2YSBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL3V0aWwvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9BY3Rpdml0eU1hbmFnZXJTdGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTc5YzVlLi4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL3V0aWwvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9BY3Rpdml0eU1hbmFnZXJTdGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuY3RzOwotCi1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLkNvbGxlY3RpbmdPdXRwdXRSZWNlaXZlcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5JVGVzdERldmljZTsKLQotaW1wb3J0IGphdmEuYXd0LlJlY3RhbmdsZTsKLWltcG9ydCBqYXZhLmxhbmcuSW50ZWdlcjsKLWltcG9ydCBqYXZhLmxhbmcuU3RyaW5nOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5jdHMuQWN0aXZpdHlNYW5hZ2VyVGVzdEJhc2UuSE9NRV9TVEFDS19JRDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuY3RzLkFjdGl2aXR5TWFuYWdlclRlc3RCYXNlLlJFQ0VOVFNfU1RBQ0tfSUQ7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmN0cy5TdGF0ZUxvZ2dlci5sb2c7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmN0cy5TdGF0ZUxvZ2dlci5sb2dFOwotCi1jbGFzcyBBY3Rpdml0eU1hbmFnZXJTdGF0ZSB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRFVNUF9NT0RFX0FDVElWSVRJRVMgPSAwOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVEVfUkVTVU1FRCA9ICJSRVNVTUVEIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFURV9QQVVTRUQgPSAiUEFVU0VEIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFURV9TVE9QUEVEID0gIlNUT1BQRUQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRFX0RFU1RST1lFRCA9ICJERVNUUk9ZRUQiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTSVpFX01PREVfUkVTSVpFQUJMRSA9ICJSRVNJWkVfTU9ERV9SRVNJWkVBQkxFIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEVU1QU1lTX0FDVElWSVRZX0FDVElWSVRJRVMgPSAiZHVtcHN5cyBhY3Rpdml0eSBhY3Rpdml0aWVzIjsKLQotICAgIC8vIENvcGllZCBmcm9tIEFjdGl2aXR5UmVjb3JkLmphdmEKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVBQTElDQVRJT05fQUNUSVZJVFlfVFlQRSA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhPTUVfQUNUSVZJVFlfVFlQRSA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFQ0VOVFNfQUNUSVZJVFlfVFlQRSA9IDI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFBhdHRlcm4gbURpc3BsYXlJZFBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoIkRpc3BsYXkgIyhcXGQrKS4qIik7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQYXR0ZXJuIG1TdGFja0lkUGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiU3RhY2sgIyhcXGQrKVxcOiIpOwotICAgIHByaXZhdGUgZmluYWwgUGF0dGVybiBtUmVzdW1lZEFjdGl2aXR5UGF0dGVybiA9Ci0gICAgICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoIlJlc3VtZWRBY3Rpdml0eVxcOiBBY3Rpdml0eVJlY29yZFxceyguKykgdShcXGQrKSAoXFxTKykgKFxcUyspXFx9Iik7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQYXR0ZXJuIG1Gb2N1c2VkU3RhY2tQYXR0ZXJuID0KLSAgICAgICAgICAgIFBhdHRlcm4uY29tcGlsZSgibUZvY3VzZWRTdGFjaz1BY3Rpdml0eVN0YWNrXFx7KC4rKSBzdGFja0lkPShcXGQrKSwgKC4rKVxcfSguKykiKTsKLQotICAgIHByaXZhdGUgZmluYWwgUGF0dGVybltdIG1FeHRyYWN0U3RhY2tFeGl0UGF0dGVybnMgPQotICAgICAgICAgICAgeyBtU3RhY2tJZFBhdHRlcm4sIG1SZXN1bWVkQWN0aXZpdHlQYXR0ZXJuLCBtRm9jdXNlZFN0YWNrUGF0dGVybiwgbURpc3BsYXlJZFBhdHRlcm4gfTsKLQotICAgIC8vIFN0YWNrcyBpbiB6LW9yZGVyIHdpdGggdGhlIHRvcCBtb3N0IGF0IHRoZSBmcm9udCBvZiB0aGUgbGlzdCwgc3RhcnRpbmcgd2l0aCBwcmltYXJ5IGRpc3BsYXkuCi0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0PEFjdGl2aXR5U3RhY2s+IG1TdGFja3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgLy8gU3RhY2tzIG9uIGFsbCBhdHRhY2hlZCBkaXNwbGF5cywgaW4gei1vcmRlciB3aXRoIHRoZSB0b3AgbW9zdCBhdCB0aGUgZnJvbnQgb2YgdGhlIGxpc3QuCi0gICAgcHJpdmF0ZSBmaW5hbCBNYXA8SW50ZWdlciwgTGlzdDxBY3Rpdml0eVN0YWNrPj4gbURpc3BsYXlTdGFja3MgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgcHJpdmF0ZSBLZXlndWFyZENvbnRyb2xsZXJTdGF0ZSBtS2V5Z3VhcmRDb250cm9sbGVyU3RhdGU7Ci0gICAgcHJpdmF0ZSBpbnQgbUZvY3VzZWRTdGFja0lkID0gLTE7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbVJlc3VtZWRBY3Rpdml0eVJlY29yZCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFN0cmluZz4gbVJlc3VtZWRBY3Rpdml0aWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHByaXZhdGUgZmluYWwgTGlua2VkTGlzdDxTdHJpbmc+IG1TeXNEdW1wID0gbmV3IExpbmtlZExpc3QoKTsKLQotICAgIHZvaWQgY29tcHV0ZVN0YXRlKElUZXN0RGV2aWNlIGRldmljZSkgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGNvbXB1dGVTdGF0ZShkZXZpY2UsIERVTVBfTU9ERV9BQ1RJVklUSUVTKTsKLSAgICB9Ci0KLSAgICB2b2lkIGNvbXB1dGVTdGF0ZShJVGVzdERldmljZSBkZXZpY2UsIGludCBkdW1wTW9kZSkgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIEl0IGlzIHBvc3NpYmxlIHRoZSBzeXN0ZW0gaXMgaW4gdGhlIG1pZGRsZSBvZiB0cmFuc2l0aW9uIHRvIHRoZSByaWdodCBzdGF0ZSB3aGVuIHdlIGdldAotICAgICAgICAvLyB0aGUgZHVtcC4gV2UgdHJ5IGEgZmV3IHRpbWVzIHRvIGdldCB0aGUgaW5mb3JtYXRpb24gd2UgbmVlZCBiZWZvcmUgZ2l2aW5nIHVwLgotICAgICAgICBpbnQgcmV0cmllc0xlZnQgPSAzOwotICAgICAgICBib29sZWFuIHJldHJ5ID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBkdW1wID0gbnVsbDsKLQotICAgICAgICBsb2coIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwotICAgICAgICBsb2coIiAgICAgQWN0aXZpdHlNYW5hZ2VyU3RhdGUgICAgICIpOwotICAgICAgICBsb2coIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwotCi0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIGlmIChyZXRyeSkgewotICAgICAgICAgICAgICAgIGxvZygiKioqSW5jb21wbGV0ZSBBTSBzdGF0ZS4gUmV0cnlpbmcuLi4iKTsKLSAgICAgICAgICAgICAgICAvLyBXYWl0IGhhbGYgYSBzZWNvbmQgYmV0d2VlbiByZXRyaWVzIGZvciBhY3Rpdml0eSBtYW5hZ2VyIHRvIGZpbmlzaCB0cmFuc2l0aW9uaW5nLgotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCg1MDApOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFdlbGwgSSBndWVzcyB3ZSBhcmUgbm90IHdhaXRpbmcuLi4KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZpbmFsIENvbGxlY3RpbmdPdXRwdXRSZWNlaXZlciBvdXRwdXRSZWNlaXZlciA9IG5ldyBDb2xsZWN0aW5nT3V0cHV0UmVjZWl2ZXIoKTsKLSAgICAgICAgICAgIFN0cmluZyBkdW1wc3lzQ21kID0gIiI7Ci0gICAgICAgICAgICBzd2l0Y2ggKGR1bXBNb2RlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBEVU1QX01PREVfQUNUSVZJVElFUzoKLSAgICAgICAgICAgICAgICAgICAgZHVtcHN5c0NtZCA9IERVTVBTWVNfQUNUSVZJVFlfQUNUSVZJVElFUzsgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZChkdW1wc3lzQ21kLCBvdXRwdXRSZWNlaXZlcik7Ci0gICAgICAgICAgICBkdW1wID0gb3V0cHV0UmVjZWl2ZXIuZ2V0T3V0cHV0KCk7Ci0gICAgICAgICAgICBwYXJzZVN5c0R1bXAoZHVtcCk7Ci0KLSAgICAgICAgICAgIHJldHJ5ID0gbVN0YWNrcy5pc0VtcHR5KCkgfHwgbUZvY3VzZWRTdGFja0lkID09IC0xIHx8IChtUmVzdW1lZEFjdGl2aXR5UmVjb3JkID09IG51bGwKLSAgICAgICAgICAgICAgICAgICAgfHwgbVJlc3VtZWRBY3Rpdml0aWVzLmlzRW1wdHkoKSkgJiYgIW1LZXlndWFyZENvbnRyb2xsZXJTdGF0ZS5rZXlndWFyZFNob3dpbmc7Ci0gICAgICAgIH0gd2hpbGUgKHJldHJ5ICYmIHJldHJpZXNMZWZ0LS0gPiAwKTsKLQotICAgICAgICBpZiAocmV0cnkpIHsKLSAgICAgICAgICAgIGxvZyhkdW1wKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtU3RhY2tzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgbG9nRSgiTm8gc3RhY2tzIGZvdW5kLi4uIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1Gb2N1c2VkU3RhY2tJZCA9PSAtMSkgewotICAgICAgICAgICAgbG9nRSgiTm8gZm9jdXNlZCBzdGFjayBmb3VuZC4uLiIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtUmVzdW1lZEFjdGl2aXR5UmVjb3JkID09IG51bGwpIHsKLSAgICAgICAgICAgIGxvZ0UoIk5vIGZvY3VzZWQgYWN0aXZpdHkgZm91bmQuLi4iKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobVJlc3VtZWRBY3Rpdml0aWVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgbG9nRSgiTm8gcmVzdW1lZCBhY3Rpdml0aWVzIGZvdW5kLi4uIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcGFyc2VTeXNEdW1wKFN0cmluZyBzeXNEdW1wKSB7Ci0gICAgICAgIHJlc2V0KCk7Ci0KLSAgICAgICAgQ29sbGVjdGlvbnMuYWRkQWxsKG1TeXNEdW1wLCBzeXNEdW1wLnNwbGl0KCJcXG4iKSk7Ci0KLSAgICAgICAgaW50IGN1cnJlbnREaXNwbGF5SWQgPSAwOwotICAgICAgICB3aGlsZSAoIW1TeXNEdW1wLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgZmluYWwgQWN0aXZpdHlTdGFjayBzdGFjayA9IEFjdGl2aXR5U3RhY2suY3JlYXRlKG1TeXNEdW1wLCBtU3RhY2tJZFBhdHRlcm4sCi0gICAgICAgICAgICAgICAgICAgIG1FeHRyYWN0U3RhY2tFeGl0UGF0dGVybnMsIGN1cnJlbnREaXNwbGF5SWQpOwotCi0gICAgICAgICAgICBpZiAoc3RhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TdGFja3MuYWRkKHN0YWNrKTsKLSAgICAgICAgICAgICAgICBtRGlzcGxheVN0YWNrcy5nZXQoY3VycmVudERpc3BsYXlJZCkuYWRkKHN0YWNrKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RhY2subVJlc3VtZWRBY3Rpdml0eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1SZXN1bWVkQWN0aXZpdGllcy5hZGQoc3RhY2subVJlc3VtZWRBY3Rpdml0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBLZXlndWFyZENvbnRyb2xsZXJTdGF0ZSBjb250cm9sbGVyID0gS2V5Z3VhcmRDb250cm9sbGVyU3RhdGUuY3JlYXRlKAotICAgICAgICAgICAgICAgICAgICBtU3lzRHVtcCwgbmV3IFBhdHRlcm5bMF0pOwotICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1LZXlndWFyZENvbnRyb2xsZXJTdGF0ZSA9IGNvbnRyb2xsZXI7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsaW5lID0gbVN5c0R1bXAucG9wKCkudHJpbSgpOwotCi0gICAgICAgICAgICBNYXRjaGVyIG1hdGNoZXIgPSBtRm9jdXNlZFN0YWNrUGF0dGVybi5tYXRjaGVyKGxpbmUpOwotICAgICAgICAgICAgaWYgKG1hdGNoZXIubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgbG9nKGxpbmUpOwotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzdGFja0lkID0gbWF0Y2hlci5ncm91cCgyKTsKLSAgICAgICAgICAgICAgICBsb2coc3RhY2tJZCk7Ci0gICAgICAgICAgICAgICAgbUZvY3VzZWRTdGFja0lkID0gSW50ZWdlci5wYXJzZUludChzdGFja0lkKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbWF0Y2hlciA9IG1SZXN1bWVkQWN0aXZpdHlQYXR0ZXJuLm1hdGNoZXIobGluZSk7Ci0gICAgICAgICAgICBpZiAobWF0Y2hlci5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cobGluZSk7Ci0gICAgICAgICAgICAgICAgbVJlc3VtZWRBY3Rpdml0eVJlY29yZCA9IG1hdGNoZXIuZ3JvdXAoMyk7Ci0gICAgICAgICAgICAgICAgbG9nKG1SZXN1bWVkQWN0aXZpdHlSZWNvcmQpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtYXRjaGVyID0gbURpc3BsYXlJZFBhdHRlcm4ubWF0Y2hlcihsaW5lKTsKLSAgICAgICAgICAgIGlmIChtYXRjaGVyLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgIGxvZyhsaW5lKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZGlzcGxheUlkID0gbWF0Y2hlci5ncm91cCgxKTsKLSAgICAgICAgICAgICAgICBsb2coZGlzcGxheUlkKTsKLSAgICAgICAgICAgICAgICBjdXJyZW50RGlzcGxheUlkID0gSW50ZWdlci5wYXJzZUludChkaXNwbGF5SWQpOwotICAgICAgICAgICAgICAgIG1EaXNwbGF5U3RhY2tzLnB1dChjdXJyZW50RGlzcGxheUlkLCBuZXcgQXJyYXlMaXN0PD4oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVzZXQoKSB7Ci0gICAgICAgIG1TdGFja3MuY2xlYXIoKTsKLSAgICAgICAgbUZvY3VzZWRTdGFja0lkID0gLTE7Ci0gICAgICAgIG1SZXN1bWVkQWN0aXZpdHlSZWNvcmQgPSBudWxsOwotICAgICAgICBtUmVzdW1lZEFjdGl2aXRpZXMuY2xlYXIoKTsKLSAgICAgICAgbVN5c0R1bXAuY2xlYXIoKTsKLSAgICAgICAgbUtleWd1YXJkQ29udHJvbGxlclN0YXRlID0gbnVsbDsKLSAgICB9Ci0KLSAgICBpbnQgZ2V0RnJvbnRTdGFja0lkKGludCBkaXNwbGF5SWQpIHsKLSAgICAgICAgcmV0dXJuIG1EaXNwbGF5U3RhY2tzLmdldChkaXNwbGF5SWQpLmdldCgwKS5tU3RhY2tJZDsKLSAgICB9Ci0KLSAgICBpbnQgZ2V0Rm9jdXNlZFN0YWNrSWQoKSB7Ci0gICAgICAgIHJldHVybiBtRm9jdXNlZFN0YWNrSWQ7Ci0gICAgfQotCi0gICAgU3RyaW5nIGdldEZvY3VzZWRBY3Rpdml0eSgpIHsKLSAgICAgICAgcmV0dXJuIG1SZXN1bWVkQWN0aXZpdHlSZWNvcmQ7Ci0gICAgfQotCi0gICAgU3RyaW5nIGdldFJlc3VtZWRBY3Rpdml0eSgpIHsKLSAgICAgICAgcmV0dXJuIG1SZXN1bWVkQWN0aXZpdGllcy5nZXQoMCk7Ci0gICAgfQotCi0gICAgaW50IGdldFJlc3VtZWRBY3Rpdml0aWVzQ291bnQoKSB7Ci0gICAgICAgIHJldHVybiBtUmVzdW1lZEFjdGl2aXRpZXMuc2l6ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBLZXlndWFyZENvbnRyb2xsZXJTdGF0ZSBnZXRLZXlndWFyZENvbnRyb2xsZXJTdGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1LZXlndWFyZENvbnRyb2xsZXJTdGF0ZTsKLSAgICB9Ci0KLSAgICBib29sZWFuIGNvbnRhaW5zU3RhY2soaW50IHN0YWNrSWQpIHsKLSAgICAgICAgcmV0dXJuIGdldFN0YWNrQnlJZChzdGFja0lkKSAhPSBudWxsOwotICAgIH0KLQotICAgIEFjdGl2aXR5U3RhY2sgZ2V0U3RhY2tCeUlkKGludCBzdGFja0lkKSB7Ci0gICAgICAgIGZvciAoQWN0aXZpdHlTdGFjayBzdGFjayA6IG1TdGFja3MpIHsKLSAgICAgICAgICAgIGlmIChzdGFja0lkID09IHN0YWNrLm1TdGFja0lkKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN0YWNrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIGludCBnZXRTdGFja1Bvc2l0aW9uKGludCBzdGFja0lkKSB7Ci0gICAgICAgIGZvciAoSW50ZWdlciBkaXNwbGF5SWQgOiBtRGlzcGxheVN0YWNrcy5rZXlTZXQoKSkgewotICAgICAgICAgICAgTGlzdDxBY3Rpdml0eVN0YWNrPiBzdGFja3MgPSBtRGlzcGxheVN0YWNrcy5nZXQoZGlzcGxheUlkKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RhY2tzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YWNrSWQgPT0gc3RhY2tzLmdldChpKS5tU3RhY2tJZCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIExpc3Q8QWN0aXZpdHlTdGFjaz4gZ2V0U3RhY2tzKCkgewotICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdChtU3RhY2tzKTsKLSAgICB9Ci0KLSAgICBpbnQgZ2V0U3RhY2tDb3VudCgpIHsKLSAgICAgICAgcmV0dXJuIG1TdGFja3Muc2l6ZSgpOwotICAgIH0KLQotICAgIGJvb2xlYW4gY29udGFpbnNBY3Rpdml0eShTdHJpbmcgYWN0aXZpdHlOYW1lKSB7Ci0gICAgICAgIGZvciAoQWN0aXZpdHlTdGFjayBzdGFjayA6IG1TdGFja3MpIHsKLSAgICAgICAgICAgIGZvciAoQWN0aXZpdHlUYXNrIHRhc2sgOiBzdGFjay5tVGFza3MpIHsKLSAgICAgICAgICAgICAgICBmb3IgKEFjdGl2aXR5IGFjdGl2aXR5IDogdGFzay5tQWN0aXZpdGllcykgewotICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZpdHkubmFtZS5lcXVhbHMoYWN0aXZpdHlOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJvb2xlYW4gaXNBY3Rpdml0eVZpc2libGUoU3RyaW5nIGFjdGl2aXR5TmFtZSkgewotICAgICAgICBmb3IgKEFjdGl2aXR5U3RhY2sgc3RhY2sgOiBtU3RhY2tzKSB7Ci0gICAgICAgICAgICBmb3IgKEFjdGl2aXR5VGFzayB0YXNrIDogc3RhY2subVRhc2tzKSB7Ci0gICAgICAgICAgICAgICBmb3IgKEFjdGl2aXR5IGFjdGl2aXR5IDogdGFzay5tQWN0aXZpdGllcykgewotICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpdml0eS5uYW1lLmVxdWFscyhhY3Rpdml0eU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhY3Rpdml0eS52aXNpYmxlOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBjb250YWluc1N0YXJ0ZWRBY3Rpdml0aWVzKCkgewotICAgICAgICBmb3IgKEFjdGl2aXR5U3RhY2sgc3RhY2sgOiBtU3RhY2tzKSB7Ci0gICAgICAgICAgICBmb3IgKEFjdGl2aXR5VGFzayB0YXNrIDogc3RhY2subVRhc2tzKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChBY3Rpdml0eSBhY3Rpdml0eSA6IHRhc2subUFjdGl2aXRpZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFhY3Rpdml0eS5zdGF0ZS5lcXVhbHMoU1RBVEVfU1RPUFBFRCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhYWN0aXZpdHkuc3RhdGUuZXF1YWxzKFNUQVRFX0RFU1RST1lFRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBib29sZWFuIGhhc0FjdGl2aXR5U3RhdGUoU3RyaW5nIGFjdGl2aXR5TmFtZSwgU3RyaW5nIGFjdGl2aXR5U3RhdGUpIHsKLSAgICAgICAgU3RyaW5nIGZ1bGxOYW1lID0gQWN0aXZpdHlNYW5hZ2VyVGVzdEJhc2UuZ2V0QWN0aXZpdHlDb21wb25lbnROYW1lKGFjdGl2aXR5TmFtZSk7Ci0gICAgICAgIGZvciAoQWN0aXZpdHlTdGFjayBzdGFjayA6IG1TdGFja3MpIHsKLSAgICAgICAgICAgIGZvciAoQWN0aXZpdHlUYXNrIHRhc2sgOiBzdGFjay5tVGFza3MpIHsKLSAgICAgICAgICAgICAgICBmb3IgKEFjdGl2aXR5IGFjdGl2aXR5IDogdGFzay5tQWN0aXZpdGllcykgewotICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZpdHkubmFtZS5lcXVhbHMoZnVsbE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWN0aXZpdHkuc3RhdGUuZXF1YWxzKGFjdGl2aXR5U3RhdGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpbnQgZ2V0QWN0aXZpdHlQcm9jSWQoU3RyaW5nIGFjdGl2aXR5TmFtZSkgewotICAgICAgICBmb3IgKEFjdGl2aXR5U3RhY2sgc3RhY2sgOiBtU3RhY2tzKSB7Ci0gICAgICAgICAgICBmb3IgKEFjdGl2aXR5VGFzayB0YXNrIDogc3RhY2subVRhc2tzKSB7Ci0gICAgICAgICAgICAgICBmb3IgKEFjdGl2aXR5IGFjdGl2aXR5IDogdGFzay5tQWN0aXZpdGllcykgewotICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpdml0eS5uYW1lLmVxdWFscyhhY3Rpdml0eU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhY3Rpdml0eS5wcm9jSWQ7Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBib29sZWFuIGlzSG9tZUFjdGl2aXR5VmlzaWJsZSgpIHsKLSAgICAgICAgZmluYWwgQWN0aXZpdHkgaG9tZUFjdGl2aXR5ID0gZ2V0SG9tZUFjdGl2aXR5KCk7Ci0gICAgICAgIHJldHVybiBob21lQWN0aXZpdHkgIT0gbnVsbCAmJiBob21lQWN0aXZpdHkudmlzaWJsZTsKLSAgICB9Ci0KLSAgICBib29sZWFuIGlzUmVjZW50c0FjdGl2aXR5VmlzaWJsZSgpIHsKLSAgICAgICAgZmluYWwgQWN0aXZpdHkgcmVjZW50c0FjdGl2aXR5ID0gZ2V0UmVjZW50c0FjdGl2aXR5KCk7Ci0gICAgICAgIHJldHVybiByZWNlbnRzQWN0aXZpdHkgIT0gbnVsbCAmJiByZWNlbnRzQWN0aXZpdHkudmlzaWJsZTsKLSAgICB9Ci0KLSAgICBTdHJpbmcgZ2V0SG9tZUFjdGl2aXR5TmFtZSgpIHsKLSAgICAgICAgQWN0aXZpdHkgYWN0aXZpdHkgPSBnZXRIb21lQWN0aXZpdHkoKTsKLSAgICAgICAgaWYgKGFjdGl2aXR5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhY3Rpdml0eS5uYW1lOwotICAgIH0KLQotICAgIEFjdGl2aXR5VGFzayBnZXRIb21lVGFzaygpIHsKLSAgICAgICAgQWN0aXZpdHlTdGFjayBob21lU3RhY2sgPSBnZXRTdGFja0J5SWQoSE9NRV9TVEFDS19JRCk7Ci0gICAgICAgIGlmIChob21lU3RhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChBY3Rpdml0eVRhc2sgdGFzayA6IGhvbWVTdGFjay5tVGFza3MpIHsKLSAgICAgICAgICAgICAgICBpZiAodGFzay5tVGFza1R5cGUgPT0gSE9NRV9BQ1RJVklUWV9UWVBFKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXNrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEFjdGl2aXR5VGFzayBnZXRSZWNlbnRzVGFzaygpIHsKLSAgICAgICAgQWN0aXZpdHlTdGFjayByZWNlbnRzU3RhY2sgPSBnZXRTdGFja0J5SWQoUkVDRU5UU19TVEFDS19JRCk7Ci0gICAgICAgIGlmIChyZWNlbnRzU3RhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChBY3Rpdml0eVRhc2sgdGFzayA6IHJlY2VudHNTdGFjay5tVGFza3MpIHsKLSAgICAgICAgICAgICAgICBpZiAodGFzay5tVGFza1R5cGUgPT0gUkVDRU5UU19BQ1RJVklUWV9UWVBFKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXNrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgQWN0aXZpdHkgZ2V0SG9tZUFjdGl2aXR5KCkgewotICAgICAgICBmaW5hbCBBY3Rpdml0eVRhc2sgaG9tZVRhc2sgPSBnZXRIb21lVGFzaygpOwotICAgICAgICByZXR1cm4gaG9tZVRhc2sgIT0gbnVsbCA/IGhvbWVUYXNrLm1BY3Rpdml0aWVzLmdldChob21lVGFzay5tQWN0aXZpdGllcy5zaXplKCkgLSAxKSA6IG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBBY3Rpdml0eSBnZXRSZWNlbnRzQWN0aXZpdHkoKSB7Ci0gICAgICAgIGZpbmFsIEFjdGl2aXR5VGFzayByZWNlbnRzVGFzayA9IGdldFJlY2VudHNUYXNrKCk7Ci0gICAgICAgIHJldHVybiByZWNlbnRzVGFzayAhPSBudWxsID8gcmVjZW50c1Rhc2subUFjdGl2aXRpZXMuZ2V0KHJlY2VudHNUYXNrLm1BY3Rpdml0aWVzLnNpemUoKSAtIDEpCi0gICAgICAgICAgICAgICAgOiBudWxsOwotICAgIH0KLQotICAgIEFjdGl2aXR5VGFzayBnZXRUYXNrQnlBY3Rpdml0eU5hbWUoU3RyaW5nIGFjdGl2aXR5TmFtZSkgewotICAgICAgICByZXR1cm4gZ2V0VGFza0J5QWN0aXZpdHlOYW1lKGFjdGl2aXR5TmFtZSwgLTEpOwotICAgIH0KLQotICAgIEFjdGl2aXR5VGFzayBnZXRUYXNrQnlBY3Rpdml0eU5hbWUoU3RyaW5nIGFjdGl2aXR5TmFtZSwgaW50IHN0YWNrSWQpIHsKLSAgICAgICAgU3RyaW5nIGZ1bGxOYW1lID0gQWN0aXZpdHlNYW5hZ2VyVGVzdEJhc2UuZ2V0QWN0aXZpdHlDb21wb25lbnROYW1lKGFjdGl2aXR5TmFtZSk7Ci0gICAgICAgIGZvciAoQWN0aXZpdHlTdGFjayBzdGFjayA6IG1TdGFja3MpIHsKLSAgICAgICAgICAgIGlmIChzdGFja0lkID09IC0xIHx8IHN0YWNrSWQgPT0gc3RhY2subVN0YWNrSWQpIHsKLSAgICAgICAgICAgICAgICBmb3IgKEFjdGl2aXR5VGFzayB0YXNrIDogc3RhY2subVRhc2tzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoQWN0aXZpdHkgYWN0aXZpdHkgOiB0YXNrLm1BY3Rpdml0aWVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZpdHkubmFtZS5lcXVhbHMoZnVsbE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhc2s7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIEFjdGl2aXR5U3RhY2sgZXh0ZW5kcyBBY3Rpdml0eUNvbnRhaW5lciB7Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBUQVNLX0lEX1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoIlRhc2sgaWQgIyhcXGQrKSIpOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIFJFU1VNRURfQUNUSVZJVFlfUEFUVEVSTiA9IFBhdHRlcm4uY29tcGlsZSgKLSAgICAgICAgICAgICAgICAibVJlc3VtZWRBY3Rpdml0eVxcOiBBY3Rpdml0eVJlY29yZFxceyguKykgdShcXGQrKSAoXFxTKykgKFxcUyspXFx9Iik7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gU0xFRVBJTkdfUEFUVEVSTiA9IFBhdHRlcm4uY29tcGlsZSgiaXNTbGVlcGluZz0oXFxTKykiKTsKLQotICAgICAgICBpbnQgbURpc3BsYXlJZDsKLSAgICAgICAgaW50IG1TdGFja0lkOwotICAgICAgICBTdHJpbmcgbVJlc3VtZWRBY3Rpdml0eTsKLSAgICAgICAgQm9vbGVhbiBtU2xlZXBpbmc7IC8vIEEgQm9vbGVhbiB0byB0cmlnZ2VyIGFuIE5QRSBpZiBpdCdzIG5vdCBpbml0aWFsaXplZAotICAgICAgICBBcnJheUxpc3Q8QWN0aXZpdHlUYXNrPiBtVGFza3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgcHJpdmF0ZSBBY3Rpdml0eVN0YWNrKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdGljIEFjdGl2aXR5U3RhY2sgY3JlYXRlKExpbmtlZExpc3Q8U3RyaW5nPiBkdW1wLCBQYXR0ZXJuIHN0YWNrSWRQYXR0ZXJuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF0dGVybltdIGV4aXRQYXR0ZXJucywgaW50IGRpc3BsYXlJZCkgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxpbmUgPSBkdW1wLnBlZWsoKS50cmltKCk7Ci0KLSAgICAgICAgICAgIGZpbmFsIE1hdGNoZXIgbWF0Y2hlciA9IHN0YWNrSWRQYXR0ZXJuLm1hdGNoZXIobGluZSk7Ci0gICAgICAgICAgICBpZiAoIW1hdGNoZXIubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgLy8gTm90IGEgc3RhY2suCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBGb3IgdGhlIHN0YWNrIElkIGxpbmUgd2UganVzdCByZWFkLgotICAgICAgICAgICAgZHVtcC5wb3AoKTsKLQotICAgICAgICAgICAgZmluYWwgQWN0aXZpdHlTdGFjayBzdGFjayA9IG5ldyBBY3Rpdml0eVN0YWNrKCk7Ci0gICAgICAgICAgICBzdGFjay5tRGlzcGxheUlkID0gZGlzcGxheUlkOwotICAgICAgICAgICAgbG9nKGxpbmUpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHN0YWNrSWQgPSBtYXRjaGVyLmdyb3VwKDEpOwotICAgICAgICAgICAgbG9nKHN0YWNrSWQpOwotICAgICAgICAgICAgc3RhY2subVN0YWNrSWQgPSBJbnRlZ2VyLnBhcnNlSW50KHN0YWNrSWQpOwotICAgICAgICAgICAgc3RhY2suZXh0cmFjdChkdW1wLCBleGl0UGF0dGVybnMpOwotICAgICAgICAgICAgcmV0dXJuIHN0YWNrOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGV4dHJhY3QoTGlua2VkTGlzdDxTdHJpbmc+IGR1bXAsIFBhdHRlcm5bXSBleGl0UGF0dGVybnMpIHsKLQotICAgICAgICAgICAgZmluYWwgTGlzdDxQYXR0ZXJuPiB0YXNrRXhpdFBhdHRlcm5zID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgQ29sbGVjdGlvbnMuYWRkQWxsKHRhc2tFeGl0UGF0dGVybnMsIGV4aXRQYXR0ZXJucyk7Ci0gICAgICAgICAgICB0YXNrRXhpdFBhdHRlcm5zLmFkZChUQVNLX0lEX1BBVFRFUk4pOwotICAgICAgICAgICAgdGFza0V4aXRQYXR0ZXJucy5hZGQoUkVTVU1FRF9BQ1RJVklUWV9QQVRURVJOKTsKLSAgICAgICAgICAgIGZpbmFsIFBhdHRlcm5bXSB0YXNrRXhpdFBhdHRlcm5zQXJyYXkgPQotICAgICAgICAgICAgICAgICAgICB0YXNrRXhpdFBhdHRlcm5zLnRvQXJyYXkobmV3IFBhdHRlcm5bdGFza0V4aXRQYXR0ZXJucy5zaXplKCldKTsKLQotICAgICAgICAgICAgd2hpbGUgKCFkb25lRXh0cmFjdGluZyhkdW1wLCBleGl0UGF0dGVybnMpKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgQWN0aXZpdHlUYXNrIHRhc2sgPQotICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlUYXNrLmNyZWF0ZShkdW1wLCBUQVNLX0lEX1BBVFRFUk4sIHRhc2tFeGl0UGF0dGVybnNBcnJheSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAodGFzayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1UYXNrcy5hZGQodGFzayk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsaW5lID0gZHVtcC5wb3AoKS50cmltKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZXh0cmFjdEZ1bGxzY3JlZW4obGluZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGV4dHJhY3RCb3VuZHMobGluZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgTWF0Y2hlciBtYXRjaGVyID0gUkVTVU1FRF9BQ1RJVklUWV9QQVRURVJOLm1hdGNoZXIobGluZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1hdGNoZXIubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZyhsaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgbVJlc3VtZWRBY3Rpdml0eSA9IG1hdGNoZXIuZ3JvdXAoMyk7Ci0gICAgICAgICAgICAgICAgICAgIGxvZyhtUmVzdW1lZEFjdGl2aXR5KTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbWF0Y2hlciA9IFNMRUVQSU5HX1BBVFRFUk4ubWF0Y2hlcihsaW5lKTsKLSAgICAgICAgICAgICAgICBpZiAobWF0Y2hlci5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKGxpbmUpOwotICAgICAgICAgICAgICAgICAgICBtU2xlZXBpbmcgPSAidHJ1ZSIuZXF1YWxzKG1hdGNoZXIuZ3JvdXAoMSkpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQHJldHVybiB0aGUgYm90dG9tIHRhc2sgaW4gdGhlIHN0YWNrLgotICAgICAgICAgKi8KLSAgICAgICAgQWN0aXZpdHlUYXNrIGdldEJvdHRvbVRhc2soKSB7Ci0gICAgICAgICAgICBpZiAoIW1UYXNrcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAvLyBOT1RFOiBVbmxpa2UgdGhlIEFjdGl2aXR5TWFuYWdlciBpbnRlcm5hbHMsIHdlIGR1bXAgdGhlIHN0YXRlIGZyb20gdG9wIHRvIGJvdHRvbSwKLSAgICAgICAgICAgICAgICAvLyAgICAgICBzbyB0aGUgaW5kaWNlcyBhcmUgaW52ZXJ0ZWQKLSAgICAgICAgICAgICAgICByZXR1cm4gbVRhc2tzLmdldChtVGFza3Muc2l6ZSgpIC0gMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAcmV0dXJuIHRoZSB0b3AgdGFzayBpbiB0aGUgc3RhY2suCi0gICAgICAgICAqLwotICAgICAgICBBY3Rpdml0eVRhc2sgZ2V0VG9wVGFzaygpIHsKLSAgICAgICAgICAgIGlmICghbVRhc2tzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIC8vIE5PVEU6IFVubGlrZSB0aGUgQWN0aXZpdHlNYW5hZ2VyIGludGVybmFscywgd2UgZHVtcCB0aGUgc3RhdGUgZnJvbSB0b3AgdG8gYm90dG9tLAotICAgICAgICAgICAgICAgIC8vICAgICAgIHNvIHRoZSBpbmRpY2VzIGFyZSBpbnZlcnRlZAotICAgICAgICAgICAgICAgIHJldHVybiBtVGFza3MuZ2V0KDApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0PEFjdGl2aXR5VGFzaz4gZ2V0VGFza3MoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdChtVGFza3MpOwotICAgICAgICB9Ci0KLSAgICAgICAgQWN0aXZpdHlUYXNrIGdldFRhc2soaW50IHRhc2tJZCkgewotICAgICAgICAgICAgZm9yIChBY3Rpdml0eVRhc2sgdGFzayA6IG1UYXNrcykgewotICAgICAgICAgICAgICAgIGlmICh0YXNrSWQgPT0gdGFzay5tVGFza0lkKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXNrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIEFjdGl2aXR5VGFzayBleHRlbmRzIEFjdGl2aXR5Q29udGFpbmVyIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBUQVNLX1JFQ09SRF9QQVRURVJOID0gUGF0dGVybi5jb21waWxlKCJcXCogVGFza1JlY29yZFxcIgotICAgICAgICAgICAgICAgICsgInsoXFxTKykgIyhcXGQrKSAoXFxTKyk9KFxcUyspIFU9KFxcZCspIFN0YWNrSWQ9KFxcZCspIHN6PShcXGQrKVxcfSIpOwotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gTEFTVF9OT05fRlVMTFNDUkVFTl9CT1VORFNfUEFUVEVSTiA9IFBhdHRlcm4uY29tcGlsZSgKLSAgICAgICAgICAgICAgICAibUxhc3ROb25GdWxsc2NyZWVuQm91bmRzPVJlY3RcXCgoXFxkKyksIChcXGQrKSAtIChcXGQrKSwgKFxcZCspXFwpIik7Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBPUklHX0FDVElWSVRZX1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoIm9yaWdBY3Rpdml0eT0oXFxTKykiKTsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBSRUFMX0FDVElWSVRZX1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoInJlYWxBY3Rpdml0eT0oXFxTKykiKTsKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIEFDVElWSVRZX05BTUVfUEFUVEVSTiA9IFBhdHRlcm4uY29tcGlsZSgKLSAgICAgICAgICAgICAgICAiXFwqIEhpc3QgIyhcXGQrKVxcOiBBY3Rpdml0eVJlY29yZFxceyhcXFMrKSB1KFxcZCspIChcXFMrKSB0KFxcZCspXFx9Iik7Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBUQVNLX1RZUEVfUEFUVEVSTiA9IFBhdHRlcm4uY29tcGlsZSgiYXV0b1JlbW92ZVJlY2VudHM9KFxcUyspICIKLSAgICAgICAgICAgICAgICArICJpc1BlcnNpc3RhYmxlPShcXFMrKSBudW1GdWxsc2NyZWVuPShcXGQrKSB0YXNrVHlwZT0oXFxkKykgIgotICAgICAgICAgICAgICAgICsgIm1UYXNrVG9SZXR1cm5Ubz0oXFxkKykiKTsKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIFJFU0laQUJMRV9QQVRURVJOID0gUGF0dGVybi5jb21waWxlKAotICAgICAgICAgICAgICAgICIuKm1SZXNpemVNb2RlPShbXlxcc10rKS4qIik7Ci0KLSAgICAgICAgaW50IG1UYXNrSWQ7Ci0gICAgICAgIGludCBtU3RhY2tJZDsKLSAgICAgICAgUmVjdGFuZ2xlIG1MYXN0Tm9uRnVsbHNjcmVlbkJvdW5kczsKLSAgICAgICAgU3RyaW5nIG1SZWFsQWN0aXZpdHk7Ci0gICAgICAgIFN0cmluZyBtT3JpZ0FjdGl2aXR5OwotICAgICAgICBBcnJheUxpc3Q8QWN0aXZpdHk+IG1BY3Rpdml0aWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBpbnQgbVRhc2tUeXBlID0gLTE7Ci0gICAgICAgIGludCBtUmV0dXJuVG9UeXBlID0gLTE7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIG1SZXNpemVNb2RlOwotCi0gICAgICAgIHByaXZhdGUgQWN0aXZpdHlUYXNrKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdGljIEFjdGl2aXR5VGFzayBjcmVhdGUoCi0gICAgICAgICAgICAgICAgTGlua2VkTGlzdDxTdHJpbmc+IGR1bXAsIFBhdHRlcm4gdGFza0lkUGF0dGVybiwgUGF0dGVybltdIGV4aXRQYXR0ZXJucykgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxpbmUgPSBkdW1wLnBlZWsoKS50cmltKCk7Ci0KLSAgICAgICAgICAgIGZpbmFsIE1hdGNoZXIgbWF0Y2hlciA9IHRhc2tJZFBhdHRlcm4ubWF0Y2hlcihsaW5lKTsKLSAgICAgICAgICAgIGlmICghbWF0Y2hlci5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBOb3QgYSB0YXNrLgotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gRm9yIHRoZSB0YXNrIElkIGxpbmUgd2UganVzdCByZWFkLgotICAgICAgICAgICAgZHVtcC5wb3AoKTsKLQotICAgICAgICAgICAgZmluYWwgQWN0aXZpdHlUYXNrIHRhc2sgPSBuZXcgQWN0aXZpdHlUYXNrKCk7Ci0gICAgICAgICAgICBsb2cobGluZSk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgdGFza0lkID0gbWF0Y2hlci5ncm91cCgxKTsKLSAgICAgICAgICAgIGxvZyh0YXNrSWQpOwotICAgICAgICAgICAgdGFzay5tVGFza0lkID0gSW50ZWdlci5wYXJzZUludCh0YXNrSWQpOwotICAgICAgICAgICAgdGFzay5leHRyYWN0KGR1bXAsIGV4aXRQYXR0ZXJucyk7Ci0gICAgICAgICAgICByZXR1cm4gdGFzazsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBleHRyYWN0KExpbmtlZExpc3Q8U3RyaW5nPiBkdW1wLCBQYXR0ZXJuW10gZXhpdFBhdHRlcm5zKSB7Ci0gICAgICAgICAgICBmaW5hbCBMaXN0PFBhdHRlcm4+IGFjdGl2aXR5RXhpdFBhdHRlcm5zID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgQ29sbGVjdGlvbnMuYWRkQWxsKGFjdGl2aXR5RXhpdFBhdHRlcm5zLCBleGl0UGF0dGVybnMpOwotICAgICAgICAgICAgYWN0aXZpdHlFeGl0UGF0dGVybnMuYWRkKEFDVElWSVRZX05BTUVfUEFUVEVSTik7Ci0gICAgICAgICAgICBmaW5hbCBQYXR0ZXJuW10gYWN0aXZpdHlFeGl0UGF0dGVybnNBcnJheSA9Ci0gICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5RXhpdFBhdHRlcm5zLnRvQXJyYXkobmV3IFBhdHRlcm5bYWN0aXZpdHlFeGl0UGF0dGVybnMuc2l6ZSgpXSk7Ci0KLSAgICAgICAgICAgIHdoaWxlICghZG9uZUV4dHJhY3RpbmcoZHVtcCwgZXhpdFBhdHRlcm5zKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIEFjdGl2aXR5IGFjdGl2aXR5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5LmNyZWF0ZShkdW1wLCBBQ1RJVklUWV9OQU1FX1BBVFRFUk4sIGFjdGl2aXR5RXhpdFBhdHRlcm5zQXJyYXkpOwotCi0gICAgICAgICAgICAgICAgaWYgKGFjdGl2aXR5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUFjdGl2aXRpZXMuYWRkKGFjdGl2aXR5KTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxpbmUgPSBkdW1wLnBvcCgpLnRyaW0oKTsKLQotICAgICAgICAgICAgICAgIGlmIChleHRyYWN0RnVsbHNjcmVlbihsaW5lKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoZXh0cmFjdEJvdW5kcyhsaW5lKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoZXh0cmFjdE1pbmltYWxTaXplKGxpbmUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIE1hdGNoZXIgbWF0Y2hlciA9IFRBU0tfUkVDT1JEX1BBVFRFUk4ubWF0Y2hlcihsaW5lKTsKLSAgICAgICAgICAgICAgICBpZiAobWF0Y2hlci5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKGxpbmUpOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc3RhY2tJZCA9IG1hdGNoZXIuZ3JvdXAoNik7Ci0gICAgICAgICAgICAgICAgICAgIG1TdGFja0lkID0gSW50ZWdlci52YWx1ZU9mKHN0YWNrSWQpOwotICAgICAgICAgICAgICAgICAgICBsb2coc3RhY2tJZCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1hdGNoZXIgPSBMQVNUX05PTl9GVUxMU0NSRUVOX0JPVU5EU19QQVRURVJOLm1hdGNoZXIobGluZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1hdGNoZXIubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZyhsaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgbUxhc3ROb25GdWxsc2NyZWVuQm91bmRzID0gZXh0cmFjdEJvdW5kcyhtYXRjaGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtYXRjaGVyID0gUkVBTF9BQ1RJVklUWV9QQVRURVJOLm1hdGNoZXIobGluZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1hdGNoZXIubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtUmVhbEFjdGl2aXR5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhsaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1SZWFsQWN0aXZpdHkgPSBtYXRjaGVyLmdyb3VwKDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgbG9nKG1SZWFsQWN0aXZpdHkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1hdGNoZXIgPSBPUklHX0FDVElWSVRZX1BBVFRFUk4ubWF0Y2hlcihsaW5lKTsKLSAgICAgICAgICAgICAgICBpZiAobWF0Y2hlci5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1PcmlnQWN0aXZpdHkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nKGxpbmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbU9yaWdBY3Rpdml0eSA9IG1hdGNoZXIuZ3JvdXAoMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cobU9yaWdBY3Rpdml0eSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbWF0Y2hlciA9IFRBU0tfVFlQRV9QQVRURVJOLm1hdGNoZXIobGluZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1hdGNoZXIubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZyhsaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgbVRhc2tUeXBlID0gSW50ZWdlci52YWx1ZU9mKG1hdGNoZXIuZ3JvdXAoNCkpOwotICAgICAgICAgICAgICAgICAgICBtUmV0dXJuVG9UeXBlID0gSW50ZWdlci52YWx1ZU9mKG1hdGNoZXIuZ3JvdXAoNSkpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtYXRjaGVyID0gUkVTSVpBQkxFX1BBVFRFUk4ubWF0Y2hlcihsaW5lKTsKLSAgICAgICAgICAgICAgICBpZiAobWF0Y2hlci5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKGxpbmUpOwotICAgICAgICAgICAgICAgICAgICBtUmVzaXplTW9kZSA9IG1hdGNoZXIuZ3JvdXAoMSk7Ci0gICAgICAgICAgICAgICAgICAgIGxvZyhtUmVzaXplTW9kZSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzaXplTW9kZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtUmVzaXplTW9kZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyB0YXNrIGNvbnRhaW5zIHRoZSBnaXZlbiBhY3Rpdml0eS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWN0aXZpdHkoU3RyaW5nIGFjdGl2aXR5TmFtZSkgewotICAgICAgICAgICAgZm9yIChBY3Rpdml0eSBhY3Rpdml0eSA6IG1BY3Rpdml0aWVzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGFjdGl2aXR5Lm5hbWUuZXF1YWxzKGFjdGl2aXR5TmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIEFjdGl2aXR5IHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBTVEFURV9QQVRURVJOID0gUGF0dGVybi5jb21waWxlKCJzdGF0ZT0oXFxTKykuKiIpOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIFZJU0lCSUxJVFlfUEFUVEVSTiA9IFBhdHRlcm4uY29tcGlsZSgia2V5c1BhdXNlZD0oXFxTKykgIgotICAgICAgICAgICAgICAgICsgImluSGlzdG9yeT0oXFxTKykgdmlzaWJsZT0oXFxTKykgc2xlZXBpbmc9KFxcUyspIGlkbGU9KFxcUyspICIKLSAgICAgICAgICAgICAgICArICJtU3RhcnRpbmdXaW5kb3dTdGF0ZT0oXFxTKykiKTsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBGUk9OVF9PRl9UQVNLX1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoImZyb250T2ZUYXNrPShcXFMrKSAiCi0gICAgICAgICAgICAgICAgKyAidGFzaz1UYXNrUmVjb3JkXFx7KFxcUyspICMoXFxkKykgQT0oXFxTKykgVT0oXFxkKykgU3RhY2tJZD0oXFxkKykgc3o9KFxcZCspXFx9Iik7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gUFJPQ0VTU19SRUNPUkRfUEFUVEVSTiA9IFBhdHRlcm4uY29tcGlsZSgKLSAgICAgICAgICAgICAgICAiYXBwPVByb2Nlc3NSZWNvcmRcXHsoXFxTKykgKFxcZCspOihcXFMrKS8oLispXFx9Iik7Ci0KLSAgICAgICAgU3RyaW5nIG5hbWU7Ci0gICAgICAgIFN0cmluZyBzdGF0ZTsKLSAgICAgICAgYm9vbGVhbiB2aXNpYmxlOwotICAgICAgICBib29sZWFuIGZyb250T2ZUYXNrOwotICAgICAgICBpbnQgcHJvY0lkID0gLTE7Ci0KLSAgICAgICAgcHJpdmF0ZSBBY3Rpdml0eSgpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXRpYyBBY3Rpdml0eSBjcmVhdGUoCi0gICAgICAgICAgICAgICAgTGlua2VkTGlzdDxTdHJpbmc+IGR1bXAsIFBhdHRlcm4gYWN0aXZpdHlOYW1lUGF0dGVybiwgUGF0dGVybltdIGV4aXRQYXR0ZXJucykgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxpbmUgPSBkdW1wLnBlZWsoKS50cmltKCk7Ci0KLSAgICAgICAgICAgIGZpbmFsIE1hdGNoZXIgbWF0Y2hlciA9IGFjdGl2aXR5TmFtZVBhdHRlcm4ubWF0Y2hlcihsaW5lKTsKLSAgICAgICAgICAgIGlmICghbWF0Y2hlci5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBOb3QgYW4gYWN0aXZpdHkuCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBGb3IgdGhlIGFjdGl2aXR5IG5hbWUgbGluZSB3ZSBqdXN0IHJlYWQuCi0gICAgICAgICAgICBkdW1wLnBvcCgpOwotCi0gICAgICAgICAgICBmaW5hbCBBY3Rpdml0eSBhY3Rpdml0eSA9IG5ldyBBY3Rpdml0eSgpOwotICAgICAgICAgICAgbG9nKGxpbmUpOwotICAgICAgICAgICAgYWN0aXZpdHkubmFtZSA9IG1hdGNoZXIuZ3JvdXAoNCk7Ci0gICAgICAgICAgICBsb2coYWN0aXZpdHkubmFtZSk7Ci0gICAgICAgICAgICBhY3Rpdml0eS5leHRyYWN0KGR1bXAsIGV4aXRQYXR0ZXJucyk7Ci0gICAgICAgICAgICByZXR1cm4gYWN0aXZpdHk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgZXh0cmFjdChMaW5rZWRMaXN0PFN0cmluZz4gZHVtcCwgUGF0dGVybltdIGV4aXRQYXR0ZXJucykgewotCi0gICAgICAgICAgICB3aGlsZSAoIWRvbmVFeHRyYWN0aW5nKGR1bXAsIGV4aXRQYXR0ZXJucykpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbGluZSA9IGR1bXAucG9wKCkudHJpbSgpOwotCi0gICAgICAgICAgICAgICAgLy8gQnJlYWsgdGhlIGFjdGl2aXR5IGV4dHJhY3Rpb24gb25jZSB3ZSBoaXQgYW4gZW1wdHkgbGluZQotICAgICAgICAgICAgICAgIGlmIChsaW5lLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBNYXRjaGVyIG1hdGNoZXIgPSBWSVNJQklMSVRZX1BBVFRFUk4ubWF0Y2hlcihsaW5lKTsKLSAgICAgICAgICAgICAgICBpZiAobWF0Y2hlci5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKGxpbmUpOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmlzaWJsZVN0cmluZyA9IG1hdGNoZXIuZ3JvdXAoMyk7Ci0gICAgICAgICAgICAgICAgICAgIHZpc2libGUgPSBCb29sZWFuLnZhbHVlT2YodmlzaWJsZVN0cmluZyk7Ci0gICAgICAgICAgICAgICAgICAgIGxvZyh2aXNpYmxlU3RyaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbWF0Y2hlciA9IFNUQVRFX1BBVFRFUk4ubWF0Y2hlcihsaW5lKTsKLSAgICAgICAgICAgICAgICBpZiAobWF0Y2hlci5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKGxpbmUpOwotICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IG1hdGNoZXIuZ3JvdXAoMSk7Ci0gICAgICAgICAgICAgICAgICAgIGxvZyhzdGF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1hdGNoZXIgPSBQUk9DRVNTX1JFQ09SRF9QQVRURVJOLm1hdGNoZXIobGluZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1hdGNoZXIubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZyhsaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByb2NJZFN0cmluZyA9IG1hdGNoZXIuZ3JvdXAoMik7Ci0gICAgICAgICAgICAgICAgICAgIHByb2NJZCA9IEludGVnZXIudmFsdWVPZihwcm9jSWRTdHJpbmcpOwotICAgICAgICAgICAgICAgICAgICBsb2cocHJvY0lkU3RyaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbWF0Y2hlciA9IEZST05UX09GX1RBU0tfUEFUVEVSTi5tYXRjaGVyKGxpbmUpOwotICAgICAgICAgICAgICAgIGlmIChtYXRjaGVyLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cobGluZSk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmcm9udE9mVGFza1N0cmluZyA9IG1hdGNoZXIuZ3JvdXAoMSk7Ci0gICAgICAgICAgICAgICAgICAgIGZyb250T2ZUYXNrID0gQm9vbGVhbi52YWx1ZU9mKGZyb250T2ZUYXNrU3RyaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgbG9nKGZyb250T2ZUYXNrU3RyaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIGFic3RyYWN0IGNsYXNzIEFjdGl2aXR5Q29udGFpbmVyIHsKLSAgICAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIEZVTExTQ1JFRU5fUEFUVEVSTiA9IFBhdHRlcm4uY29tcGlsZSgibUZ1bGxzY3JlZW49KFxcUyspIik7Ci0gICAgICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgUGF0dGVybiBCT1VORFNfUEFUVEVSTiA9Ci0gICAgICAgICAgICAgICAgUGF0dGVybi5jb21waWxlKCJtQm91bmRzPVJlY3RcXCgoXFxkKyksIChcXGQrKSAtIChcXGQrKSwgKFxcZCspXFwpIik7Ci0gICAgICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgUGF0dGVybiBNSU5fV0lEVEhfUEFUVEVSTiA9Ci0gICAgICAgICAgICAgICAgUGF0dGVybi5jb21waWxlKCJtTWluV2lkdGg9KFxcZCspIik7Ci0gICAgICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgUGF0dGVybiBNSU5fSEVJR0hUX1BBVFRFUk4gPQotICAgICAgICAgICAgICAgIFBhdHRlcm4uY29tcGlsZSgibU1pbkhlaWdodD0oXFxkKykiKTsKLQotICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtRnVsbHNjcmVlbjsKLSAgICAgICAgcHJvdGVjdGVkIFJlY3RhbmdsZSBtQm91bmRzOwotICAgICAgICBwcm90ZWN0ZWQgaW50IG1NaW5XaWR0aCA9IC0xOwotICAgICAgICBwcm90ZWN0ZWQgaW50IG1NaW5IZWlnaHQgPSAtMTsKLQotICAgICAgICBib29sZWFuIGV4dHJhY3RGdWxsc2NyZWVuKFN0cmluZyBsaW5lKSB7Ci0gICAgICAgICAgICBmaW5hbCBNYXRjaGVyIG1hdGNoZXIgPSBGVUxMU0NSRUVOX1BBVFRFUk4ubWF0Y2hlcihsaW5lKTsKLSAgICAgICAgICAgIGlmICghbWF0Y2hlci5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsb2cobGluZSk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZnVsbHNjcmVlbiA9IG1hdGNoZXIuZ3JvdXAoMSk7Ci0gICAgICAgICAgICBsb2coZnVsbHNjcmVlbik7Ci0gICAgICAgICAgICBtRnVsbHNjcmVlbiA9IEJvb2xlYW4udmFsdWVPZihmdWxsc2NyZWVuKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBleHRyYWN0Qm91bmRzKFN0cmluZyBsaW5lKSB7Ci0gICAgICAgICAgICBmaW5hbCBNYXRjaGVyIG1hdGNoZXIgPSBCT1VORFNfUEFUVEVSTi5tYXRjaGVyKGxpbmUpOwotICAgICAgICAgICAgaWYgKCFtYXRjaGVyLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxvZyhsaW5lKTsKLSAgICAgICAgICAgIG1Cb3VuZHMgPSBleHRyYWN0Qm91bmRzKG1hdGNoZXIpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0aWMgUmVjdGFuZ2xlIGV4dHJhY3RCb3VuZHMoTWF0Y2hlciBtYXRjaGVyKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgbGVmdCA9IEludGVnZXIudmFsdWVPZihtYXRjaGVyLmdyb3VwKDEpKTsKLSAgICAgICAgICAgIGZpbmFsIGludCB0b3AgPSBJbnRlZ2VyLnZhbHVlT2YobWF0Y2hlci5ncm91cCgyKSk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgcmlnaHQgPSBJbnRlZ2VyLnZhbHVlT2YobWF0Y2hlci5ncm91cCgzKSk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgYm90dG9tID0gSW50ZWdlci52YWx1ZU9mKG1hdGNoZXIuZ3JvdXAoNCkpOwotICAgICAgICAgICAgZmluYWwgUmVjdGFuZ2xlIHJlY3QgPSBuZXcgUmVjdGFuZ2xlKGxlZnQsIHRvcCwgcmlnaHQgLSBsZWZ0LCBib3R0b20gLSB0b3ApOwotCi0gICAgICAgICAgICBsb2cocmVjdC50b1N0cmluZygpKTsKLSAgICAgICAgICAgIHJldHVybiByZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBleHRyYWN0TWluaW1hbFNpemUoU3RyaW5nIGxpbmUpIHsKLSAgICAgICAgICAgIGZpbmFsIE1hdGNoZXIgbWluV2lkdGhNYXRjaGVyID0gTUlOX1dJRFRIX1BBVFRFUk4ubWF0Y2hlcihsaW5lKTsKLSAgICAgICAgICAgIGZpbmFsIE1hdGNoZXIgbWluSGVpZ2h0TWF0Y2hlciA9IE1JTl9IRUlHSFRfUEFUVEVSTi5tYXRjaGVyKGxpbmUpOwotCi0gICAgICAgICAgICBpZiAobWluV2lkdGhNYXRjaGVyLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgIGxvZyhsaW5lKTsKLSAgICAgICAgICAgICAgICBtTWluV2lkdGggPSBJbnRlZ2VyLnZhbHVlT2YobWluV2lkdGhNYXRjaGVyLmdyb3VwKDEpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobWluSGVpZ2h0TWF0Y2hlci5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cobGluZSk7Ci0gICAgICAgICAgICAgICAgbU1pbkhlaWdodCA9IEludGVnZXIudmFsdWVPZihtaW5IZWlnaHRNYXRjaGVyLmdyb3VwKDEpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBSZWN0YW5nbGUgZ2V0Qm91bmRzKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Cb3VuZHM7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIGlzRnVsbHNjcmVlbigpIHsKLSAgICAgICAgICAgIHJldHVybiBtRnVsbHNjcmVlbjsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBnZXRNaW5XaWR0aCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtTWluV2lkdGg7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZ2V0TWluSGVpZ2h0KCkgewotICAgICAgICAgICAgcmV0dXJuIG1NaW5IZWlnaHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgY2xhc3MgS2V5Z3VhcmRDb250cm9sbGVyU3RhdGUgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIE5BTUVfUEFUVEVSTiA9IFBhdHRlcm4uY29tcGlsZSgiS2V5Z3VhcmRDb250cm9sbGVyOiIpOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIFNIT1dJTkdfUEFUVEVSTiA9IFBhdHRlcm4uY29tcGlsZSgibUtleWd1YXJkU2hvd2luZz0oXFxTKykiKTsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBPQ0NMVURFRF9QQVRURVJOID0gUGF0dGVybi5jb21waWxlKCJtT2NjbHVkZWQ9KFxcUyspIik7Ci0KLSAgICAgICAgYm9vbGVhbiBrZXlndWFyZFNob3dpbmc7Ci0gICAgICAgIGJvb2xlYW4ga2V5Z3VhcmRPY2NsdWRlZDsKLQotICAgICAgICBwcml2YXRlIEtleWd1YXJkQ29udHJvbGxlclN0YXRlKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdGljIEtleWd1YXJkQ29udHJvbGxlclN0YXRlIGNyZWF0ZShMaW5rZWRMaXN0PFN0cmluZz4gZHVtcCwgUGF0dGVybltdIGV4aXRQYXR0ZXJucykgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxpbmUgPSBkdW1wLnBlZWsoKS50cmltKCk7Ci0KLSAgICAgICAgICAgIGZpbmFsIE1hdGNoZXIgbWF0Y2hlciA9IE5BTUVfUEFUVEVSTi5tYXRjaGVyKGxpbmUpOwotICAgICAgICAgICAgaWYgKCFtYXRjaGVyLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgIC8vIE5vdCBLZXlndWFyZENvbnRyb2xsZXIKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gRm9yIHRoZSBLZXlndWFyZENvbnRyb2xsZXIgbGluZSB3ZSBqdXN0IHJlYWQuCi0gICAgICAgICAgICBkdW1wLnBvcCgpOwotCi0gICAgICAgICAgICBmaW5hbCBLZXlndWFyZENvbnRyb2xsZXJTdGF0ZSBjb250cm9sbGVyID0gbmV3IEtleWd1YXJkQ29udHJvbGxlclN0YXRlKCk7Ci0gICAgICAgICAgICBjb250cm9sbGVyLmV4dHJhY3QoZHVtcCwgZXhpdFBhdHRlcm5zKTsKLSAgICAgICAgICAgIHJldHVybiBjb250cm9sbGVyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGV4dHJhY3QoTGlua2VkTGlzdDxTdHJpbmc+IGR1bXAsIFBhdHRlcm5bXSBleGl0UGF0dGVybnMpIHsKLQotICAgICAgICAgICAgd2hpbGUgKCFkb25lRXh0cmFjdGluZyhkdW1wLCBleGl0UGF0dGVybnMpKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxpbmUgPSBkdW1wLnBvcCgpLnRyaW0oKTsKLQotICAgICAgICAgICAgICAgIE1hdGNoZXIgbWF0Y2hlciA9IFNIT1dJTkdfUEFUVEVSTi5tYXRjaGVyKGxpbmUpOwotICAgICAgICAgICAgICAgIGlmIChtYXRjaGVyLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cobGluZSk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzaG93aW5nU3RyaW5nID0gbWF0Y2hlci5ncm91cCgxKTsKLSAgICAgICAgICAgICAgICAgICAga2V5Z3VhcmRTaG93aW5nID0gQm9vbGVhbi52YWx1ZU9mKHNob3dpbmdTdHJpbmcpOwotICAgICAgICAgICAgICAgICAgICBsb2coc2hvd2luZ1N0cmluZyk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1hdGNoZXIgPSBPQ0NMVURFRF9QQVRURVJOLm1hdGNoZXIobGluZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1hdGNoZXIubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZyhsaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG9jY2x1ZGVkU3RyaW5nID0gbWF0Y2hlci5ncm91cCgxKTsKLSAgICAgICAgICAgICAgICAgICAga2V5Z3VhcmRPY2NsdWRlZCA9IEJvb2xlYW4udmFsdWVPZihvY2NsdWRlZFN0cmluZyk7Ci0gICAgICAgICAgICAgICAgICAgIGxvZyhvY2NsdWRlZFN0cmluZyk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBib29sZWFuIGRvbmVFeHRyYWN0aW5nKExpbmtlZExpc3Q8U3RyaW5nPiBkdW1wLCBQYXR0ZXJuW10gZXhpdFBhdHRlcm5zKSB7Ci0gICAgICAgIGlmIChkdW1wLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgU3RyaW5nIGxpbmUgPSBkdW1wLnBlZWsoKS50cmltKCk7Ci0KLSAgICAgICAgZm9yIChQYXR0ZXJuIHBhdHRlcm4gOiBleGl0UGF0dGVybnMpIHsKLSAgICAgICAgICAgIGlmIChwYXR0ZXJuLm1hdGNoZXIobGluZSkubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL3V0aWwvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9BY3Rpdml0eU1hbmFnZXJUZXN0QmFzZS5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvdXRpbC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0FjdGl2aXR5TWFuYWdlclRlc3RCYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMwYjBhZjkuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvdXRpbC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0FjdGl2aXR5TWFuYWdlclRlc3RCYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTM2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuY3RzOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLkxvZy5Mb2dMZXZlbDsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuQ29sbGVjdGluZ091dHB1dFJlY2VpdmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5EZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLklUZXN0RGV2aWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmxvZy5Mb2dVdGlsLkNMb2c7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQucmVzdWx0LklucHV0U3RyZWFtU291cmNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkRldmljZVRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS5hd3QuaW1hZ2UuQnVmZmVyZWRJbWFnZTsKLWltcG9ydCBqYXZhLmxhbmcuRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5JbnRlZ2VyOwotaW1wb3J0IGphdmEubGFuZy5TdHJpbmc7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlVVSUQ7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuY3RzLlN0YXRlTG9nZ2VyLmxvZzsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuY3RzLlN0YXRlTG9nZ2VyLmxvZ0U7Ci0KLWltcG9ydCBhbmRyb2lkLnNlcnZlci5jdHMuQWN0aXZpdHlNYW5hZ2VyU3RhdGUuQWN0aXZpdHlTdGFjazsKLQotaW1wb3J0IGphdmF4LmltYWdlaW8uSW1hZ2VJTzsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFjdGl2aXR5TWFuYWdlclRlc3RCYXNlIGV4dGVuZHMgRGV2aWNlVGVzdENhc2UgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gUFJFVEVORF9ERVZJQ0VfU1VQUE9SVFNfUElQID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBQUkVURU5EX0RFVklDRV9TVVBQT1JUU19GUkVFRk9STSA9IGZhbHNlOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfU0VQQVJBVE9SID0gIkxPR19TRVBBUkFUT1IiOwotCi0gICAgLy8gQ29uc3RhbnRzIGNvcGllZCBmcm9tIEFjdGl2aXR5TWFuYWdlci5TdGFja0lkLiBJZiB0aGV5IGFyZSBjaGFuZ2VkIHRoZXJlLCB0aGVzZSBtdXN0IGJlCi0gICAgLy8gdXBkYXRlZC4KLSAgICAvKiogSW52YWxpZCBzdGFjayBJRC4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX1NUQUNLX0lEID0gLTE7Ci0KLSAgICAvKiogRmlyc3Qgc3RhdGljIHN0YWNrIElELiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJUlNUX1NUQVRJQ19TVEFDS19JRCA9IDA7Ci0KLSAgICAvKiogSG9tZSBhY3Rpdml0eSBzdGFjayBJRC4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIT01FX1NUQUNLX0lEID0gRklSU1RfU1RBVElDX1NUQUNLX0lEOwotCi0gICAgLyoqIElEIG9mIHN0YWNrIHdoZXJlIGZ1bGxzY3JlZW4gYWN0aXZpdGllcyBhcmUgbm9ybWFsbHkgbGF1bmNoZWQgaW50by4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGVUxMU0NSRUVOX1dPUktTUEFDRV9TVEFDS19JRCA9IDE7Ci0KLSAgICAvKiogSUQgb2Ygc3RhY2sgd2hlcmUgZnJlZWZvcm0vcmVzaXplZCBhY3Rpdml0aWVzIGFyZSBub3JtYWxseSBsYXVuY2hlZCBpbnRvLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZSRUVGT1JNX1dPUktTUEFDRV9TVEFDS19JRCA9IEZVTExTQ1JFRU5fV09SS1NQQUNFX1NUQUNLX0lEICsgMTsKLQotICAgIC8qKiBJRCBvZiBzdGFjayB0aGF0IG9jY3VwaWVzIGEgZGVkaWNhdGVkIHJlZ2lvbiBvZiB0aGUgc2NyZWVuLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERPQ0tFRF9TVEFDS19JRCA9IEZSRUVGT1JNX1dPUktTUEFDRV9TVEFDS19JRCArIDE7Ci0KLSAgICAvKiogSUQgb2Ygc3RhY2sgdGhhdCBhbHdheXMgb24gdG9wIChhbHdheXMgdmlzaWJsZSkgd2hlbiBpdCBleGlzdC4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQSU5ORURfU1RBQ0tfSUQgPSBET0NLRURfU1RBQ0tfSUQgKyAxOwotCi0gICAgLyoqIFJlY2VudHMgYWN0aXZpdHkgc3RhY2sgSUQuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVDRU5UU19TVEFDS19JRCA9IFBJTk5FRF9TVEFDS19JRCArIDE7Ci0KLSAgICAvKiogQXNzaXN0YW50IGFjdGl2aXR5IHN0YWNrIElELiAgVGhpcyBzdGFjayBpcyBmdWxsc2NyZWVuIGFuZCBub24tcmVzaXplYWJsZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBU1NJU1RBTlRfU1RBQ0tfSUQgPSBSRUNFTlRTX1NUQUNLX0lEICsgMTsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gQUxMX1NUQUNLX0lEU19CVVRfSE9NRSA9IHsKLSAgICAgICAgICAgIEZVTExTQ1JFRU5fV09SS1NQQUNFX1NUQUNLX0lELCBGUkVFRk9STV9XT1JLU1BBQ0VfU1RBQ0tfSUQsIERPQ0tFRF9TVEFDS19JRCwKLSAgICAgICAgICAgIFBJTk5FRF9TVEFDS19JRCwgQVNTSVNUQU5UX1NUQUNLX0lECi0gICAgfTsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gQUxMX1NUQUNLX0lEU19CVVRfSE9NRV9BTkRfRlVMTFNDUkVFTiA9IHsKLSAgICAgICAgICAgIEZSRUVGT1JNX1dPUktTUEFDRV9TVEFDS19JRCwgRE9DS0VEX1NUQUNLX0lELCBQSU5ORURfU1RBQ0tfSUQsIEFTU0lTVEFOVF9TVEFDS19JRAotICAgIH07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19JRF9QUkVGSVggPSAidGFza0lkIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTV9TVEFDS19MSVNUID0gImFtIHN0YWNrIGxpc3QiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFNX0ZPUkNFX1NUT1BfVEVTVF9QQUNLQUdFID0gImFtIGZvcmNlLXN0b3AgYW5kcm9pZC5zZXJ2ZXIuY3RzIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU1fRk9SQ0VfU1RPUF9TRUNPTkRfVEVTVF9QQUNLQUdFCi0gICAgICAgICAgICA9ICJhbSBmb3JjZS1zdG9wIGFuZHJvaWQuc2VydmVyLmN0cy5zZWNvbmQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTV9GT1JDRV9TVE9QX1RISVJEX1RFU1RfUEFDS0FHRQotICAgICAgICAgICAgPSAiYW0gZm9yY2Utc3RvcCBhbmRyb2lkLnNlcnZlci5jdHMudGhpcmQiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFNX1JFTU9WRV9TVEFDSyA9ICJhbSBzdGFjayByZW1vdmUgIjsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFNX1NUQVJUX0hPTUVfQUNUSVZJVFlfQ09NTUFORCA9Ci0gICAgICAgICAgICAiYW0gc3RhcnQgLWEgYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4gLWMgYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuSE9NRSI7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBTV9NT1ZFX1RPUF9BQ1RJVklUWV9UT19QSU5ORURfU1RBQ0tfQ09NTUFORCA9Ci0gICAgICAgICAgICAiYW0gc3RhY2sgbW92ZS10b3AtYWN0aXZpdHktdG8tcGlubmVkLXN0YWNrIDEgMCAwIDUwMCA1MDAiOwotCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBMQVVOQ0hJTkdfQUNUSVZJVFkgPSAiTGF1bmNoaW5nQWN0aXZpdHkiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxUX0xBVU5DSElOR19BQ1RJVklUWSA9ICJBbHRMYXVuY2hpbmdBY3Rpdml0eSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBCUk9BRENBU1RfUkVDRUlWRVJfQUNUSVZJVFkgPSAiQnJvYWRjYXN0UmVjZWl2ZXJBY3Rpdml0eSI7Ci0KLSAgICAvKiogQnJvYWRjYXN0IHNoZWxsIGNvbW1hbmQgZm9yIGZpbmlzaGluZyB7QGxpbmsgQnJvYWRjYXN0UmVjZWl2ZXJBY3Rpdml0eX0uICovCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBGSU5JU0hfQUNUSVZJVFlfQlJPQURDQVNUCi0gICAgICAgICAgICA9ICJhbSBicm9hZGNhc3QgLWEgdHJpZ2dlcl9icm9hZGNhc3QgLS1leiBmaW5pc2ggdHJ1ZSI7Ci0KLSAgICAvKiogQnJvYWRjYXN0IHNoZWxsIGNvbW1hbmQgZm9yIGZpbmlzaGluZyB7QGxpbmsgQnJvYWRjYXN0UmVjZWl2ZXJBY3Rpdml0eX0uICovCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBNT1ZFX1RBU0tfVE9fQkFDS19CUk9BRENBU1QKLSAgICAgICAgICAgID0gImFtIGJyb2FkY2FzdCAtYSB0cmlnZ2VyX2Jyb2FkY2FzdCAtLWV6IG1vdmVUb0JhY2sgdHJ1ZSI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU1fUkVTSVpFX0RPQ0tFRF9TVEFDSyA9ICJhbSBzdGFjayByZXNpemUtZG9ja2VkLXN0YWNrICI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFNX1JFU0laRV9TVEFDSyA9ICJhbSBzdGFjayByZXNpemUgIjsKLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU1fTU9WRV9UQVNLID0gImFtIHN0YWNrIG1vdmUtdGFzayAiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFNX1NVUFBPUlRTX1NQTElUX1NDUkVFTl9NVUxUSVdJTkRPVyA9Ci0gICAgICAgICAgICAiYW0gc3VwcG9ydHMtc3BsaXQtc2NyZWVuLW11bHRpLXdpbmRvdyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFNX05PX0hPTUVfU0NSRUVOID0gImFtIG5vLWhvbWUtc2NyZWVuIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlBVVF9LRVlFVkVOVF9IT01FID0gImlucHV0IGtleWV2ZW50IDMiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlBVVF9LRVlFVkVOVF9CQUNLID0gImlucHV0IGtleWV2ZW50IDQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlBVVF9LRVlFVkVOVF9BUFBfU1dJVENIID0gImlucHV0IGtleWV2ZW50IDE4NyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5QVVRfS0VZRVZFTlRfV0lORE9XID0gImlucHV0IGtleWV2ZW50IDE3MSI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DS19DUkVERU5USUFMID0gIjEyMzQiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfRElTUExBWV9JRCA9IC0xOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ09NUE9ORU5UX05BTUUgPSAiYW5kcm9pZC5zZXJ2ZXIuY3RzIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVSV9NT0RFX1RZUEVfTUFTSyA9IDB4MGY7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVJX01PREVfVFlQRV9WUl9IRUFEU0VUID0gMHgwNzsKLQotICAgIHN0YXRpYyBTdHJpbmcgY29tcG9uZW50TmFtZSA9IERFRkFVTFRfQ09NUE9ORU5UX05BTUU7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX0RFVklDRV9ST1RBVElPTiA9IC0xOwotCi0gICAgLyoqIEEgcmVmZXJlbmNlIHRvIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC4gKi8KLSAgICBwcm90ZWN0ZWQgSVRlc3REZXZpY2UgbURldmljZTsKLQotICAgIHByaXZhdGUgSGFzaFNldDxTdHJpbmc+IG1BdmFpbGFibGVGZWF0dXJlczsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBtTG9ja0NyZWRlbnRpYWxzU2V0OwotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Mb2NrRGlzYWJsZWQ7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRBbVN0YXJ0Q21kKGZpbmFsIFN0cmluZyBhY3Rpdml0eU5hbWUpIHsKLSAgICAgICAgcmV0dXJuICJhbSBzdGFydCAtbiAiICsgZ2V0QWN0aXZpdHlDb21wb25lbnROYW1lKGFjdGl2aXR5TmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgYW0gY29tbWFuZCB0byBzdGFydCB0aGUgZ2l2ZW4gYWN0aXZpdHkgd2l0aCB0aGUgZm9sbG93aW5nIGV4dHJhIGtleS92YWx1ZSBwYWlycy4KLSAgICAgKiAgICAgICAgIHtAcGFyYW0ga2V5VmFsdWVQYWlyc30gbXVzdCBiZSBhIGxpc3Qgb2YgYXJndW1lbnRzIGRlZmluaW5nIGVhY2gga2V5L3ZhbHVlIGV4dHJhLgotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldEFtU3RhcnRDbWQoZmluYWwgU3RyaW5nIGFjdGl2aXR5TmFtZSwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZy4uLiBrZXlWYWx1ZVBhaXJzKSB7Ci0gICAgICAgIFN0cmluZyBiYXNlID0gZ2V0QW1TdGFydENtZChhY3Rpdml0eU5hbWUpOwotICAgICAgICBpZiAoa2V5VmFsdWVQYWlycy5sZW5ndGggJSAyICE9IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJrZXlWYWx1ZVBhaXJzIG11c3QgYmUgcGFpcnMgb2Yga2V5L3ZhbHVlIGFyZ3VtZW50cyIpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2V5VmFsdWVQYWlycy5sZW5ndGg7IGkgKz0gMikgewotICAgICAgICAgICAgYmFzZSArPSAiIC0tZXMgIiArIGtleVZhbHVlUGFpcnNbaV0gKyAiICIgKyBrZXlWYWx1ZVBhaXJzW2kgKyAxXTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYmFzZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRBbVN0YXJ0Q21kKGZpbmFsIFN0cmluZyBhY3Rpdml0eU5hbWUsIGZpbmFsIGludCBkaXNwbGF5SWQpIHsKLSAgICAgICAgcmV0dXJuICJhbSBzdGFydCAtbiAiICsgZ2V0QWN0aXZpdHlDb21wb25lbnROYW1lKGFjdGl2aXR5TmFtZSkgKyAiIC1mIDB4MTgwMDAwMDAiCi0gICAgICAgICAgICAgICAgKyAiIC0tZGlzcGxheSAiICsgZGlzcGxheUlkOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldEFtU3RhcnRDbWRJbk5ld1Rhc2soZmluYWwgU3RyaW5nIGFjdGl2aXR5TmFtZSkgewotICAgICAgICByZXR1cm4gImFtIHN0YXJ0IC1uICIgKyBnZXRBY3Rpdml0eUNvbXBvbmVudE5hbWUoYWN0aXZpdHlOYW1lKSArICIgLWYgMHgxODAwMDAwMCI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0QW1TdGFydENtZE92ZXJIb21lKGZpbmFsIFN0cmluZyBhY3Rpdml0eU5hbWUpIHsKLSAgICAgICAgcmV0dXJuICJhbSBzdGFydCAtLWFjdGl2aXR5LXRhc2stb24taG9tZSAtbiAiICsgZ2V0QWN0aXZpdHlDb21wb25lbnROYW1lKGFjdGl2aXR5TmFtZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0T3JpZW50YXRpb25Ccm9hZGNhc3QoaW50IG9yaWVudGF0aW9uKSB7Ci0gICAgICAgIHJldHVybiAiYW0gYnJvYWRjYXN0IC1hIHRyaWdnZXJfYnJvYWRjYXN0IC0tZWkgb3JpZW50YXRpb24gIiArIG9yaWVudGF0aW9uOwotICAgIH0KLQotICAgIHN0YXRpYyBTdHJpbmcgZ2V0QWN0aXZpdHlDb21wb25lbnROYW1lKGZpbmFsIFN0cmluZyBhY3Rpdml0eU5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGdldEFjdGl2aXR5Q29tcG9uZW50TmFtZShjb21wb25lbnROYW1lLCBhY3Rpdml0eU5hbWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNGdWxseVF1YWxpZmllZEFjdGl2aXR5TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gbmFtZSAhPSBudWxsICYmIG5hbWUuY29udGFpbnMoIi4iKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nIGdldEFjdGl2aXR5Q29tcG9uZW50TmFtZShmaW5hbCBTdHJpbmcgcGFja2FnZU5hbWUsIGZpbmFsIFN0cmluZyBhY3Rpdml0eU5hbWUpIHsKLSAgICAgICAgcmV0dXJuIHBhY2thZ2VOYW1lICsgIi8iICsgKGlzRnVsbHlRdWFsaWZpZWRBY3Rpdml0eU5hbWUoYWN0aXZpdHlOYW1lKSA/ICIiIDogIi4iKSArCi0gICAgICAgICAgICAgICAgYWN0aXZpdHlOYW1lOwotICAgIH0KLQotICAgIC8vIEEgbGl0dGxlIHVnbHksIGJ1dCBsZXRzIGF2b2lkIGhhdmluZyB0byBzdHJpcCBzdGF0aWMgZXZlcnl3aGVyZSBmb3IKLSAgICAvLyBub3cuCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldENvbXBvbmVudE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgY29tcG9uZW50TmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHNldERlZmF1bHRDb21wb25lbnROYW1lKCkgewotICAgICAgICBzZXRDb21wb25lbnROYW1lKERFRkFVTFRfQ09NUE9ORU5UX05BTUUpOwotICAgIH0KLQotICAgIHN0YXRpYyBTdHJpbmcgZ2V0QmFzZVdpbmRvd05hbWUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRCYXNlV2luZG93TmFtZShjb21wb25lbnROYW1lKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nIGdldEJhc2VXaW5kb3dOYW1lKGZpbmFsIFN0cmluZyBwYWNrYWdlTmFtZSkgewotICAgICAgICByZXR1cm4gZ2V0QmFzZVdpbmRvd05hbWUocGFja2FnZU5hbWUsIHRydWUgLypwcmVwZW5kUGFja2FnZU5hbWUqLyk7Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cmluZyBnZXRCYXNlV2luZG93TmFtZShmaW5hbCBTdHJpbmcgcGFja2FnZU5hbWUsIGJvb2xlYW4gcHJlcGVuZFBhY2thZ2VOYW1lKSB7Ci0gICAgICAgIHJldHVybiBwYWNrYWdlTmFtZSArICIvIiArIChwcmVwZW5kUGFja2FnZU5hbWUgPyBwYWNrYWdlTmFtZSArICIuIiA6ICIiKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nIGdldFdpbmRvd05hbWUoZmluYWwgU3RyaW5nIGFjdGl2aXR5TmFtZSkgewotICAgICAgICByZXR1cm4gZ2V0V2luZG93TmFtZShjb21wb25lbnROYW1lLCBhY3Rpdml0eU5hbWUpOwotICAgIH0KLQotICAgIHN0YXRpYyBTdHJpbmcgZ2V0V2luZG93TmFtZShmaW5hbCBTdHJpbmcgcGFja2FnZU5hbWUsIGZpbmFsIFN0cmluZyBhY3Rpdml0eU5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGdldEJhc2VXaW5kb3dOYW1lKHBhY2thZ2VOYW1lLCAhaXNGdWxseVF1YWxpZmllZEFjdGl2aXR5TmFtZShhY3Rpdml0eU5hbWUpKQotICAgICAgICAgICAgICAgICsgYWN0aXZpdHlOYW1lOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBBY3Rpdml0eUFuZFdpbmRvd01hbmFnZXJzU3RhdGUgbUFtV21TdGF0ZSA9IG5ldyBBY3Rpdml0eUFuZFdpbmRvd01hbmFnZXJzU3RhdGUoKTsKLQotICAgIHByaXZhdGUgaW50IG1Jbml0aWFsQWNjZWxlcm9tZXRlclJvdGF0aW9uOwotICAgIHByaXZhdGUgaW50IG1Vc2VyUm90YXRpb247Ci0gICAgcHJpdmF0ZSBmbG9hdCBtRm9udFNjYWxlOwotCi0gICAgcHJpdmF0ZSBTdXJmYWNlVHJhY2VSZWNlaXZlciBtU3VyZmFjZVRyYWNlUmVjZWl2ZXI7Ci0gICAgcHJpdmF0ZSBUaHJlYWQgbVN1cmZhY2VUcmFjZVRocmVhZDsKLQotICAgIHZvaWQgaW5zdGFsbFN1cmZhY2VPYnNlcnZlcihTdXJmYWNlVHJhY2VSZWNlaXZlci5TdXJmYWNlT2JzZXJ2ZXIgb2JzZXJ2ZXIpIHsKLSAgICAgICAgbVN1cmZhY2VUcmFjZVJlY2VpdmVyID0gbmV3IFN1cmZhY2VUcmFjZVJlY2VpdmVyKG9ic2VydmVyKTsKLSAgICAgICAgbVN1cmZhY2VUcmFjZVRocmVhZCA9IG5ldyBUaHJlYWQoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBtRGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoIndtIHN1cmZhY2UtdHJhY2UiLCBtU3VyZmFjZVRyYWNlUmVjZWl2ZXIpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ0UoIkRldmljZSBub3QgYXZhaWxhYmxlOiAiICsgZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIG1TdXJmYWNlVHJhY2VUaHJlYWQuc3RhcnQoKTsKLSAgICB9Ci0KLSAgICB2b2lkIHJlbW92ZVN1cmZhY2VPYnNlcnZlcigpIHsKLSAgICAgICAgbVN1cmZhY2VUcmFjZVJlY2VpdmVyLmNhbmNlbCgpOwotICAgICAgICBtU3VyZmFjZVRyYWNlVGhyZWFkLmludGVycnVwdCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIHNldERlZmF1bHRDb21wb25lbnROYW1lKCk7Ci0KLSAgICAgICAgLy8gR2V0IHRoZSBkZXZpY2UsIHRoaXMgZ2l2ZXMgYSBoYW5kbGUgdG8gcnVuIGNvbW1hbmRzIGFuZCBpbnN0YWxsIEFQS3MuCi0gICAgICAgIG1EZXZpY2UgPSBnZXREZXZpY2UoKTsKLSAgICAgICAgd2FrZVVwQW5kVW5sb2NrRGV2aWNlKCk7Ci0gICAgICAgIHByZXNzSG9tZUJ1dHRvbigpOwotICAgICAgICAvLyBSZW1vdmUgc3BlY2lhbCBzdGFja3MuCi0gICAgICAgIHJlbW92ZVN0YWNrcyhBTExfU1RBQ0tfSURTX0JVVF9IT01FX0FORF9GVUxMU0NSRUVOKTsKLSAgICAgICAgLy8gU3RvcmUgcm90YXRpb24gc2V0dGluZ3MuCi0gICAgICAgIG1Jbml0aWFsQWNjZWxlcm9tZXRlclJvdGF0aW9uID0gZ2V0QWNjZWxlcm9tZXRlclJvdGF0aW9uKCk7Ci0gICAgICAgIG1Vc2VyUm90YXRpb24gPSBnZXRVc2VyUm90YXRpb24oKTsKLSAgICAgICAgbUZvbnRTY2FsZSA9IGdldEZvbnRTY2FsZSgpOwotICAgICAgICBtTG9ja0NyZWRlbnRpYWxzU2V0ID0gZmFsc2U7Ci0gICAgICAgIG1Mb2NrRGlzYWJsZWQgPSBpc0xvY2tEaXNhYmxlZCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXRMb2NrRGlzYWJsZWQobUxvY2tEaXNhYmxlZCk7Ci0gICAgICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKEFNX0ZPUkNFX1NUT1BfVEVTVF9QQUNLQUdFKTsKLSAgICAgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoQU1fRk9SQ0VfU1RPUF9TRUNPTkRfVEVTVF9QQUNLQUdFKTsKLSAgICAgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoQU1fRk9SQ0VfU1RPUF9USElSRF9URVNUX1BBQ0tBR0UpOwotICAgICAgICAgICAgLy8gUmVzdG9yZSByb3RhdGlvbiBzZXR0aW5ncyB0byB0aGUgc3RhdGUgdGhleSB3ZXJlIGJlZm9yZSB0ZXN0LgotICAgICAgICAgICAgc2V0QWNjZWxlcm9tZXRlclJvdGF0aW9uKG1Jbml0aWFsQWNjZWxlcm9tZXRlclJvdGF0aW9uKTsKLSAgICAgICAgICAgIHNldFVzZXJSb3RhdGlvbihtVXNlclJvdGF0aW9uKTsKLSAgICAgICAgICAgIHNldEZvbnRTY2FsZShtRm9udFNjYWxlKTsKLSAgICAgICAgICAgIHNldFdpbmRvd1RyYW5zaXRpb25BbmltYXRpb25EdXJhdGlvblNjYWxlKDEpOwotICAgICAgICAgICAgLy8gUmVtb3ZlIHNwZWNpYWwgc3RhY2tzLgotICAgICAgICAgICAgcmVtb3ZlU3RhY2tzKEFMTF9TVEFDS19JRFNfQlVUX0hPTUVfQU5EX0ZVTExTQ1JFRU4pOwotICAgICAgICAgICAgd2FrZVVwQW5kVW5sb2NrRGV2aWNlKCk7Ci0gICAgICAgICAgICBwcmVzc0hvbWVCdXR0b24oKTsKLSAgICAgICAgfSBjYXRjaCAoRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHJlbW92ZVN0YWNrcyhpbnQuLi4gc3RhY2tJZHMpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZvciAoSW50ZWdlciBzdGFja0lkIDogc3RhY2tJZHMpIHsKLSAgICAgICAgICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKEFNX1JFTU9WRV9TVEFDSyArIHN0YWNrSWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBleGVjdXRlU2hlbGxDb21tYW5kKFN0cmluZyBjb21tYW5kKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGV4ZWN1dGVTaGVsbENvbW1hbmQobURldmljZSwgY29tbWFuZCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZXhlY3V0ZVNoZWxsQ29tbWFuZChJVGVzdERldmljZSBkZXZpY2UsIFN0cmluZyBjb21tYW5kKQotICAgICAgICAgICAgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGxvZygiYWRiIHNoZWxsICIgKyBjb21tYW5kKTsKLSAgICAgICAgcmV0dXJuIGRldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKGNvbW1hbmQpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGV4ZWN1dGVTaGVsbENvbW1hbmQoU3RyaW5nIGNvbW1hbmQsIENvbGxlY3RpbmdPdXRwdXRSZWNlaXZlciBvdXRwdXRSZWNlaXZlcikKLSAgICAgICAgICAgIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBsb2coImFkYiBzaGVsbCAiICsgY29tbWFuZCk7Ci0gICAgICAgIG1EZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZChjb21tYW5kLCBvdXRwdXRSZWNlaXZlcik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEJ1ZmZlcmVkSW1hZ2UgdGFrZVNjcmVlbnNob3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgSW5wdXRTdHJlYW1Tb3VyY2Ugc3RyZWFtID0gbURldmljZS5nZXRTY3JlZW5zaG90KCJQTkciLCBmYWxzZSAvKiByZXNjYWxlICovKTsKLSAgICAgICAgaWYgKHN0cmVhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBmYWlsKCJGYWlsZWQgdG8gdGFrZSBzY3JlZW5zaG90IG9mIGRldmljZSIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBJbWFnZUlPLnJlYWQoc3RyZWFtLmNyZWF0ZUlucHV0U3RyZWFtKCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGxhdW5jaEFjdGl2aXR5SW5Db21wb25lbnQoZmluYWwgU3RyaW5nIGNvbXBvbmVudE5hbWUsCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgdGFyZ2V0QWN0aXZpdHlOYW1lLCBmaW5hbCBTdHJpbmcuLi4ga2V5VmFsdWVQYWlycykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBvcmlnaW5hbENvbXBvbmVudE5hbWUgPSBBY3Rpdml0eU1hbmFnZXJUZXN0QmFzZS5jb21wb25lbnROYW1lOwotICAgICAgICBzZXRDb21wb25lbnROYW1lKGNvbXBvbmVudE5hbWUpOwotICAgICAgICBsYXVuY2hBY3Rpdml0eSh0YXJnZXRBY3Rpdml0eU5hbWUsIGtleVZhbHVlUGFpcnMpOwotICAgICAgICBzZXRDb21wb25lbnROYW1lKG9yaWdpbmFsQ29tcG9uZW50TmFtZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgbGF1bmNoQWN0aXZpdHkoZmluYWwgU3RyaW5nIHRhcmdldEFjdGl2aXR5TmFtZSwgZmluYWwgU3RyaW5nLi4uIGtleVZhbHVlUGFpcnMpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChnZXRBbVN0YXJ0Q21kKHRhcmdldEFjdGl2aXR5TmFtZSwga2V5VmFsdWVQYWlycykpOwotICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JWYWxpZFN0YXRlKG1EZXZpY2UsIHRhcmdldEFjdGl2aXR5TmFtZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgbGF1bmNoQWN0aXZpdHlOb1dhaXQoZmluYWwgU3RyaW5nIHRhcmdldEFjdGl2aXR5TmFtZSwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZy4uLiBrZXlWYWx1ZVBhaXJzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChnZXRBbVN0YXJ0Q21kKHRhcmdldEFjdGl2aXR5TmFtZSwga2V5VmFsdWVQYWlycykpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGxhdW5jaEFjdGl2aXR5SW5OZXdUYXNrKGZpbmFsIFN0cmluZyB0YXJnZXRBY3Rpdml0eU5hbWUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKGdldEFtU3RhcnRDbWRJbk5ld1Rhc2sodGFyZ2V0QWN0aXZpdHlOYW1lKSk7Ci0gICAgICAgIG1BbVdtU3RhdGUud2FpdEZvclZhbGlkU3RhdGUobURldmljZSwgdGFyZ2V0QWN0aXZpdHlOYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydHMgYW4gYWN0aXZpdHkgaW4gYSBuZXcgc3RhY2suCi0gICAgICogQHJldHVybiB0aGUgc3RhY2sgaWQgb2YgdGhlIG5ld2x5IGNyZWF0ZWQgc3RhY2suCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGludCBsYXVuY2hBY3Rpdml0eUluTmV3RHluYW1pY1N0YWNrKGZpbmFsIFN0cmluZyBhY3Rpdml0eU5hbWUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBIYXNoU2V0PEludGVnZXI+IHN0YWNrSWRzID0gZ2V0U3RhY2tJZHMoKTsKLSAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZCgiYW0gc3RhY2sgc3RhcnQgIiArIEFjdGl2aXR5QW5kV2luZG93TWFuYWdlcnNTdGF0ZS5ERUZBVUxUX0RJU1BMQVlfSUQKLSAgICAgICAgICAgICAgICArICIgIiArIGdldEFjdGl2aXR5Q29tcG9uZW50TmFtZShhY3Rpdml0eU5hbWUpKTsKLSAgICAgICAgSGFzaFNldDxJbnRlZ2VyPiBuZXdTdGFja0lkcyA9IGdldFN0YWNrSWRzKCk7Ci0gICAgICAgIG5ld1N0YWNrSWRzLnJlbW92ZUFsbChzdGFja0lkcyk7Ci0gICAgICAgIGlmIChuZXdTdGFja0lkcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX1NUQUNLX0lEOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShuZXdTdGFja0lkcy5zaXplKCkgPT0gMSk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3U3RhY2tJZHMuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzZXQgb2Ygc3RhY2sgaWRzLgotICAgICAqLwotICAgIHByaXZhdGUgSGFzaFNldDxJbnRlZ2VyPiBnZXRTdGFja0lkcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCBudWxsKTsKLSAgICAgICAgZmluYWwgTGlzdDxBY3Rpdml0eVN0YWNrPiBzdGFja3MgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja3MoKTsKLSAgICAgICAgZmluYWwgSGFzaFNldDxJbnRlZ2VyPiBzdGFja0lkcyA9IG5ldyBIYXNoU2V0PD4oKTsKLSAgICAgICAgZm9yIChBY3Rpdml0eVN0YWNrIHMgOiBzdGFja3MpIHsKLSAgICAgICAgICAgIHN0YWNrSWRzLmFkZChzLm1TdGFja0lkKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhY2tJZHM7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgbGF1bmNoSG9tZUFjdGl2aXR5KCkKLSAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKEFNX1NUQVJUX0hPTUVfQUNUSVZJVFlfQ09NTUFORCk7Ci0gICAgICAgIG1BbVdtU3RhdGUud2FpdEZvckhvbWVBY3Rpdml0eVZpc2libGUobURldmljZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgbGF1bmNoQWN0aXZpdHlPbkRpc3BsYXkoU3RyaW5nIHRhcmdldEFjdGl2aXR5TmFtZSwgaW50IGRpc3BsYXlJZCkKLSAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKGdldEFtU3RhcnRDbWQodGFyZ2V0QWN0aXZpdHlOYW1lLCBkaXNwbGF5SWQpKTsKLQotICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JWYWxpZFN0YXRlKG1EZXZpY2UsIHRhcmdldEFjdGl2aXR5TmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTGF1bmNoIHNwZWNpZmljIHRhcmdldCBhY3Rpdml0eS4gSXQgdXNlcyBleGlzdGluZyBpbnN0YW5jZSBvZiB7QGxpbmsgI0xBVU5DSElOR19BQ1RJVklUWX0sIHNvCi0gICAgICogdGhhdCBvbmUgc2hvdWxkIGJlIHN0YXJ0ZWQgZmlyc3QuCi0gICAgICogQHBhcmFtIHRvU2lkZSBMYXVuY2ggdG8gc2lkZSBpbiBzcGxpdC1zY3JlZW4uCi0gICAgICogQHBhcmFtIHJhbmRvbURhdGEgTWFrZSBpbnRlbnQgVVJJIHJhbmRvbSBieSBnZW5lcmF0aW5nIHJhbmRvbSBkYXRhLgotICAgICAqIEBwYXJhbSBtdWx0aXBsZVRhc2sgQWxsb3cgbXVsdGlwbGUgdGFzayBsYXVuY2guCi0gICAgICogQHBhcmFtIHRhcmdldEFjdGl2aXR5TmFtZSBUYXJnZXQgYWN0aXZpdHkgdG8gYmUgbGF1bmNoZWQuIE9ubHkgY2xhc3MgbmFtZSBzaG91bGQgYmUgcHJvdmlkZWQsCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlIG5hbWUgb2Yge0BsaW5rICNMQVVOQ0hJTkdfQUNUSVZJVFl9IHdpbGwgYmUgYWRkZWQKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkuCi0gICAgICogQHBhcmFtIGRpc3BsYXlJZCBEaXNwbGF5IGlkIHdoZXJlIHRhcmdldCBhY3Rpdml0eSBzaG91bGQgYmUgbGF1bmNoZWQuCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBsYXVuY2hBY3Rpdml0eUZyb21MYXVuY2hpbmcoYm9vbGVhbiB0b1NpZGUsIGJvb2xlYW4gcmFuZG9tRGF0YSwKLSAgICAgICAgICAgIGJvb2xlYW4gbXVsdGlwbGVUYXNrLCBTdHJpbmcgdGFyZ2V0QWN0aXZpdHlOYW1lLCBpbnQgZGlzcGxheUlkKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjb21tYW5kQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKGdldEFtU3RhcnRDbWQoTEFVTkNISU5HX0FDVElWSVRZKSk7Ci0gICAgICAgIGNvbW1hbmRCdWlsZGVyLmFwcGVuZCgiIC1mIDB4MjAwMDAwMDAiKTsKLSAgICAgICAgaWYgKHRvU2lkZSkgewotICAgICAgICAgICAgY29tbWFuZEJ1aWxkZXIuYXBwZW5kKCIgLS1leiBsYXVuY2hfdG9fdGhlX3NpZGUgdHJ1ZSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyYW5kb21EYXRhKSB7Ci0gICAgICAgICAgICBjb21tYW5kQnVpbGRlci5hcHBlbmQoIiAtLWV6IHJhbmRvbV9kYXRhIHRydWUiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobXVsdGlwbGVUYXNrKSB7Ci0gICAgICAgICAgICBjb21tYW5kQnVpbGRlci5hcHBlbmQoIiAtLWV6IG11bHRpcGxlX3Rhc2sgdHJ1ZSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0YXJnZXRBY3Rpdml0eU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgY29tbWFuZEJ1aWxkZXIuYXBwZW5kKCIgLS1lcyB0YXJnZXRfYWN0aXZpdHkgIikuYXBwZW5kKHRhcmdldEFjdGl2aXR5TmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRpc3BsYXlJZCAhPSBJTlZBTElEX0RJU1BMQVlfSUQpIHsKLSAgICAgICAgICAgIGNvbW1hbmRCdWlsZGVyLmFwcGVuZCgiIC0tZWkgZGlzcGxheV9pZCAiKS5hcHBlbmQoZGlzcGxheUlkKTsKLSAgICAgICAgfQotICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKGNvbW1hbmRCdWlsZGVyLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIG1BbVdtU3RhdGUud2FpdEZvclZhbGlkU3RhdGUobURldmljZSwgdGFyZ2V0QWN0aXZpdHlOYW1lKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBsYXVuY2hBY3Rpdml0eUluU3RhY2soU3RyaW5nIGFjdGl2aXR5TmFtZSwgaW50IHN0YWNrSWQsCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcuLi4ga2V5VmFsdWVQYWlycykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoZ2V0QW1TdGFydENtZChhY3Rpdml0eU5hbWUsIGtleVZhbHVlUGFpcnMpICsgIiAtLXN0YWNrICIgKyBzdGFja0lkKTsKLQotICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JWYWxpZFN0YXRlKG1EZXZpY2UsIGFjdGl2aXR5TmFtZSwgc3RhY2tJZCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgbGF1bmNoQWN0aXZpdHlJbkRvY2tTdGFjayhTdHJpbmcgYWN0aXZpdHlOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbGF1bmNoQWN0aXZpdHkoYWN0aXZpdHlOYW1lKTsKLSAgICAgICAgLy8gVE9ETyhiLzM2Mjc5NDE1KTogVGhlIHdheSB3ZSBsYXVuY2ggYW4gYWN0aXZpdHkgaW50byB0aGUgZG9ja2VkIHN0YWNrIGlzIGRpZmZlcmVudCBmcm9tCi0gICAgICAgIC8vIHdoYXQgdGhlIHVzZXIgYWN0dWFsbHkgZG9lcy4gTG9uZyB0ZXJtIHdlIHNob3VsZCB1c2UKLSAgICAgICAgLy8gImFkYiBzaGVsbCBpbnB1dCBrZXlldmVudCAtLWxvbmdwcmVzcyBfYXBwX3N3aWNoX2tleV9jb2RlXyIgdG8gdHJpZ2dlciBhIGxvbmcgcHJlc3Mgb24KLSAgICAgICAgLy8gdGhlIHJlY2VudHMgYnV0dG9uIHdoaWNoIGlzIGNvbnNpc3RlbnQgd2l0aCB3aGF0IHRoZSB1c2VyIGRvZXMuIEhvd2V2ZXIsIGN1cnJlbnRseSBzeXMtdWkKLSAgICAgICAgLy8gZG9lcyBoYW5kbGUgRkxBR19MT05HX1BSRVNTIGZvciB0aGUgYXBwIHN3aXRjaCBrZXkuIEl0IGp1c3QgbGlzdGVucyBmb3IgbG9uZyBwcmVzcyBvbiB0aGUKLSAgICAgICAgLy8gdmlldy4gV2UgbmVlZCB0byBmaXggdGhhdCBpbiBzeXMtdWkgYmVmb3JlIHdlIGNhbiBjaGFuZ2UgdGhpcy4KLSAgICAgICAgbW92ZUFjdGl2aXR5VG9Eb2NrU3RhY2soYWN0aXZpdHlOYW1lKTsKLQotICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JWYWxpZFN0YXRlKG1EZXZpY2UsIGFjdGl2aXR5TmFtZSwgRE9DS0VEX1NUQUNLX0lEKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBsYXVuY2hBY3Rpdml0eVRvU2lkZShib29sZWFuIHJhbmRvbURhdGEsIGJvb2xlYW4gbXVsdGlwbGVUYXNrRmxhZywKLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXRBY3Rpdml0eSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBhY3Rpdml0eVRvTGF1bmNoID0gdGFyZ2V0QWN0aXZpdHkgIT0gbnVsbCA/IHRhcmdldEFjdGl2aXR5IDogIlRlc3RBY3Rpdml0eSI7Ci0gICAgICAgIGdldExhdW5jaEFjdGl2aXR5QnVpbGRlcigpLnNldFRvU2lkZSh0cnVlKS5zZXRSYW5kb21EYXRhKHJhbmRvbURhdGEpCi0gICAgICAgICAgICAgICAgLnNldE11bHRpcGxlVGFzayhtdWx0aXBsZVRhc2tGbGFnKS5zZXRUYXJnZXRBY3Rpdml0eU5hbWUoYWN0aXZpdHlUb0xhdW5jaCkKLSAgICAgICAgICAgICAgICAuZXhlY3V0ZSgpOwotCi0gICAgICAgIG1BbVdtU3RhdGUud2FpdEZvclZhbGlkU3RhdGUobURldmljZSwgYWN0aXZpdHlUb0xhdW5jaCwgRlVMTFNDUkVFTl9XT1JLU1BBQ0VfU1RBQ0tfSUQpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIG1vdmVBY3Rpdml0eVRvRG9ja1N0YWNrKFN0cmluZyBhY3Rpdml0eU5hbWUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtb3ZlQWN0aXZpdHlUb1N0YWNrKGFjdGl2aXR5TmFtZSwgRE9DS0VEX1NUQUNLX0lEKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBtb3ZlQWN0aXZpdHlUb1N0YWNrKFN0cmluZyBhY3Rpdml0eU5hbWUsIGludCBzdGFja0lkKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgaW50IHRhc2tJZCA9IGdldEFjdGl2aXR5VGFza0lkKGFjdGl2aXR5TmFtZSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBjbWQgPSBBTV9NT1ZFX1RBU0sgKyB0YXNrSWQgKyAiICIgKyBzdGFja0lkICsgIiB0cnVlIjsKLSAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChjbWQpOwotCi0gICAgICAgIG1BbVdtU3RhdGUud2FpdEZvclZhbGlkU3RhdGUobURldmljZSwgYWN0aXZpdHlOYW1lLCBzdGFja0lkKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZXNpemVBY3Rpdml0eVRhc2soU3RyaW5nIGFjdGl2aXR5TmFtZSwgaW50IGxlZnQsIGludCB0b3AsIGludCByaWdodCwgaW50IGJvdHRvbSkKLSAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBpbnQgdGFza0lkID0gZ2V0QWN0aXZpdHlUYXNrSWQoYWN0aXZpdHlOYW1lKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGNtZCA9ICJhbSB0YXNrIHJlc2l6ZSAiCi0gICAgICAgICAgICAgICAgKyB0YXNrSWQgKyAiICIgKyBsZWZ0ICsgIiAiICsgdG9wICsgIiAiICsgcmlnaHQgKyAiICIgKyBib3R0b207Ci0gICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoY21kKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZXNpemVEb2NrZWRTdGFjaygKLSAgICAgICAgICAgIGludCBzdGFja1dpZHRoLCBpbnQgc3RhY2tIZWlnaHQsIGludCB0YXNrV2lkdGgsIGludCB0YXNrSGVpZ2h0KQotICAgICAgICAgICAgICAgICAgICB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChBTV9SRVNJWkVfRE9DS0VEX1NUQUNLCi0gICAgICAgICAgICAgICAgKyAiMCAwICIgKyBzdGFja1dpZHRoICsgIiAiICsgc3RhY2tIZWlnaHQKLSAgICAgICAgICAgICAgICArICIgMCAwICIgKyB0YXNrV2lkdGggKyAiICIgKyB0YXNrSGVpZ2h0KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZXNpemVTdGFjayhpbnQgc3RhY2tJZCwgaW50IHN0YWNrTGVmdCwgaW50IHN0YWNrVG9wLCBpbnQgc3RhY2tXaWR0aCwKLSAgICAgICAgICAgIGludCBzdGFja0hlaWdodCkgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoQU1fUkVTSVpFX1NUQUNLICsgU3RyaW5nLmZvcm1hdCgiJWQgJWQgJWQgJWQgJWQiLCBzdGFja0lkLCBzdGFja0xlZnQsCi0gICAgICAgICAgICAgICAgc3RhY2tUb3AsIHN0YWNrV2lkdGgsIHN0YWNrSGVpZ2h0KSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJlc3NIb21lQnV0dG9uKCkgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoSU5QVVRfS0VZRVZFTlRfSE9NRSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJlc3NCYWNrQnV0dG9uKCkgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoSU5QVVRfS0VZRVZFTlRfQkFDSyk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJlc3NBcHBTd2l0Y2hCdXR0b24oKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChJTlBVVF9LRVlFVkVOVF9BUFBfU1dJVENIKTsKLSAgICB9Ci0KLSAgICAvLyBVdGlsaXR5IG1ldGhvZCBmb3IgZGVidWdnaW5nLCBub3QgdXNlZCBkaXJlY3RseSBoZXJlLCBidXQgdXNlZnVsLCBzbyBrZXB0IGFyb3VuZC4KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcmludFN0YWNrc0FuZFRhc2tzKCkgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIENvbGxlY3RpbmdPdXRwdXRSZWNlaXZlciBvdXRwdXRSZWNlaXZlciA9IG5ldyBDb2xsZWN0aW5nT3V0cHV0UmVjZWl2ZXIoKTsKLSAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChBTV9TVEFDS19MSVNULCBvdXRwdXRSZWNlaXZlcik7Ci0gICAgICAgIFN0cmluZyBvdXRwdXQgPSBvdXRwdXRSZWNlaXZlci5nZXRPdXRwdXQoKTsKLSAgICAgICAgZm9yIChTdHJpbmcgbGluZSA6IG91dHB1dC5zcGxpdCgiXFxuIikpIHsKLSAgICAgICAgICAgIENMb2cubG9nQW5kRGlzcGxheShMb2dMZXZlbC5JTkZPLCBsaW5lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBpbnQgZ2V0QWN0aXZpdHlUYXNrSWQoU3RyaW5nIG5hbWUpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBDb2xsZWN0aW5nT3V0cHV0UmVjZWl2ZXIgb3V0cHV0UmVjZWl2ZXIgPSBuZXcgQ29sbGVjdGluZ091dHB1dFJlY2VpdmVyKCk7Ci0gICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoQU1fU1RBQ0tfTElTVCwgb3V0cHV0UmVjZWl2ZXIpOwotICAgICAgICBmaW5hbCBTdHJpbmcgb3V0cHV0ID0gb3V0cHV0UmVjZWl2ZXIuZ2V0T3V0cHV0KCk7Ci0gICAgICAgIGZpbmFsIFBhdHRlcm4gYWN0aXZpdHlQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCIoLiopICIgKyBnZXRXaW5kb3dOYW1lKG5hbWUpICsgIiAoLiopIik7Ci0gICAgICAgIGZvciAoU3RyaW5nIGxpbmUgOiBvdXRwdXQuc3BsaXQoIlxcbiIpKSB7Ci0gICAgICAgICAgICBNYXRjaGVyIG1hdGNoZXIgPSBhY3Rpdml0eVBhdHRlcm4ubWF0Y2hlcihsaW5lKTsKLSAgICAgICAgICAgIGlmIChtYXRjaGVyLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHdvcmQgOiBsaW5lLnNwbGl0KCJcXHMrIikpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmQuc3RhcnRzV2l0aChUQVNLX0lEX1BSRUZJWCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB3aXRoQ29sb24gPSB3b3JkLnNwbGl0KCI9IilbMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSW50ZWdlci5wYXJzZUludCh3aXRoQ29sb24uc3Vic3RyaW5nKDAsIHdpdGhDb2xvbi5sZW5ndGgoKSAtIDEpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gc3VwcG9ydHNWck1vZGUoKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGhhc0RldmljZUZlYXR1cmUoImFuZHJvaWQuc29mdHdhcmUudnIubW9kZSIpICYmCi0gICAgICAgICAgICAgICAgaGFzRGV2aWNlRmVhdHVyZSgiYW5kcm9pZC5oYXJkd2FyZS52ci5oaWdoX3BlcmZvcm1hbmNlIik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gc3VwcG9ydHNQaXAoKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGhhc0RldmljZUZlYXR1cmUoImFuZHJvaWQuc29mdHdhcmUucGljdHVyZV9pbl9waWN0dXJlIikKLSAgICAgICAgICAgICAgICB8fCBQUkVURU5EX0RFVklDRV9TVVBQT1JUU19QSVA7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gc3VwcG9ydHNGcmVlZm9ybSgpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gaGFzRGV2aWNlRmVhdHVyZSgiYW5kcm9pZC5zb2Z0d2FyZS5mcmVlZm9ybV93aW5kb3dfbWFuYWdlbWVudCIpCi0gICAgICAgICAgICAgICAgfHwgUFJFVEVORF9ERVZJQ0VfU1VQUE9SVFNfRlJFRUZPUk07Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNIYW5kaGVsZCgpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gIWhhc0RldmljZUZlYXR1cmUoImFuZHJvaWQuc29mdHdhcmUubGVhbmJhY2siKQotICAgICAgICAgICAgICAgICYmICFoYXNEZXZpY2VGZWF0dXJlKCJhbmRyb2lkLmhhcmR3YXJlLnR5cGUud2F0Y2giKQotICAgICAgICAgICAgICAgICYmICFoYXNEZXZpY2VGZWF0dXJlKCJhbmRyb2lkLmhhcmR3YXJlLnR5cGUuZW1iZWRkZWQiKQotICAgICAgICAgICAgICAgICYmICFoYXNEZXZpY2VGZWF0dXJlKCJhbmRyb2lkLmhhcmR3YXJlLnR5cGUuYXV0b21vdGl2ZSIpOwotICAgIH0KLQotICAgIC8vIFRPRE86IFN3aXRjaCB0byB1c2luZyBhIGZlYXR1cmUgZmxhZywgd2hlbiBhdmFpbGFibGUuCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNVaU1vZGVMb2NrZWRUb1ZySGVhZHNldCgpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBTdHJpbmcgb3V0cHV0ID0gcnVuQ29tbWFuZEFuZFByaW50T3V0cHV0KCJkdW1wc3lzIHVpbW9kZSIpOwotCi0gICAgICAgIEludGVnZXIgY3VyVWlNb2RlID0gbnVsbDsKLSAgICAgICAgQm9vbGVhbiB1aU1vZGVMb2NrZWQgPSBudWxsOwotICAgICAgICBmb3IgKFN0cmluZyBsaW5lIDogb3V0cHV0LnNwbGl0KCJcXG4iKSkgewotICAgICAgICAgICAgbGluZSA9IGxpbmUudHJpbSgpOwotICAgICAgICAgICAgTWF0Y2hlciBtYXRjaGVyID0gc0N1cnJlbnRVaU1vZGVQYXR0ZXJuLm1hdGNoZXIobGluZSk7Ci0gICAgICAgICAgICBpZiAobWF0Y2hlci5maW5kKCkpIHsKLSAgICAgICAgICAgICAgICBjdXJVaU1vZGUgPSBJbnRlZ2VyLnBhcnNlSW50KG1hdGNoZXIuZ3JvdXAoMSksIDE2KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoZXIgPSBzVWlNb2RlTG9ja2VkUGF0dGVybi5tYXRjaGVyKGxpbmUpOwotICAgICAgICAgICAgaWYgKG1hdGNoZXIuZmluZCgpKSB7Ci0gICAgICAgICAgICAgICAgdWlNb2RlTG9ja2VkID0gbWF0Y2hlci5ncm91cCgxKS5lcXVhbHMoInRydWUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gdWlNb2RlTG9ja2VkVG9WckhlYWRzZXQgPSAoY3VyVWlNb2RlICE9IG51bGwpICYmICh1aU1vZGVMb2NrZWQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAmJiAoKGN1clVpTW9kZSAmIFVJX01PREVfVFlQRV9NQVNLKSA9PSBVSV9NT0RFX1RZUEVfVlJfSEVBRFNFVCkgJiYgdWlNb2RlTG9ja2VkOwotCi0gICAgICAgIGlmICh1aU1vZGVMb2NrZWRUb1ZySGVhZHNldCkgewotICAgICAgICAgICAgQ0xvZy5sb2dBbmREaXNwbGF5KExvZ0xldmVsLklORk8sICJVSSBtb2RlIGlzIGxvY2tlZCB0byBWUiBoZWFkc2V0Iik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdWlNb2RlTG9ja2VkVG9WckhlYWRzZXQ7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gc3VwcG9ydHNTcGxpdFNjcmVlbk11bHRpV2luZG93KCkgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIENvbGxlY3RpbmdPdXRwdXRSZWNlaXZlciBvdXRwdXRSZWNlaXZlciA9IG5ldyBDb2xsZWN0aW5nT3V0cHV0UmVjZWl2ZXIoKTsKLSAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChBTV9TVVBQT1JUU19TUExJVF9TQ1JFRU5fTVVMVElXSU5ET1csIG91dHB1dFJlY2VpdmVyKTsKLSAgICAgICAgU3RyaW5nIG91dHB1dCA9IG91dHB1dFJlY2VpdmVyLmdldE91dHB1dCgpOwotICAgICAgICByZXR1cm4gIW91dHB1dC5zdGFydHNXaXRoKCJmYWxzZSIpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIG5vSG9tZVNjcmVlbigpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBDb2xsZWN0aW5nT3V0cHV0UmVjZWl2ZXIgb3V0cHV0UmVjZWl2ZXIgPSBuZXcgQ29sbGVjdGluZ091dHB1dFJlY2VpdmVyKCk7Ci0gICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoQU1fTk9fSE9NRV9TQ1JFRU4sIG91dHB1dFJlY2VpdmVyKTsKLSAgICAgICAgU3RyaW5nIG91dHB1dCA9IG91dHB1dFJlY2VpdmVyLmdldE91dHB1dCgpOwotICAgICAgICByZXR1cm4gb3V0cHV0LnN0YXJ0c1dpdGgoInRydWUiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSb3RhdGlvbiBzdXBwb3J0IGlzIGluZGljYXRlZCBieSBleHBsaWNpdGx5IGhhdmluZyBib3RoIGxhbmRzY2FwZSBhbmQgcG9ydHJhaXQKLSAgICAgKiBmZWF0dXJlcyBvciBub3QgbGlzdGluZyBlaXRoZXIgYXQgYWxsLgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHN1cHBvcnRzUm90YXRpb24oKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIChoYXNEZXZpY2VGZWF0dXJlKCJhbmRyb2lkLmhhcmR3YXJlLnNjcmVlbi5sYW5kc2NhcGUiKQotICAgICAgICAgICAgICAgICAgICAmJiBoYXNEZXZpY2VGZWF0dXJlKCJhbmRyb2lkLmhhcmR3YXJlLnNjcmVlbi5wb3J0cmFpdCIpKQotICAgICAgICAgICAgfHwgKCFoYXNEZXZpY2VGZWF0dXJlKCJhbmRyb2lkLmhhcmR3YXJlLnNjcmVlbi5sYW5kc2NhcGUiKQotICAgICAgICAgICAgICAgICAgICAmJiAhaGFzRGV2aWNlRmVhdHVyZSgiYW5kcm9pZC5oYXJkd2FyZS5zY3JlZW4ucG9ydHJhaXQiKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFzRGV2aWNlRmVhdHVyZShTdHJpbmcgcmVxdWlyZWRGZWF0dXJlKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG1BdmFpbGFibGVGZWF0dXJlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBUT0RPOiBNb3ZlIHRoaXMgbG9naWMgdG8gSVRlc3REZXZpY2UuCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgb3V0cHV0ID0gcnVuQ29tbWFuZEFuZFByaW50T3V0cHV0KCJwbSBsaXN0IGZlYXR1cmVzIik7Ci0KLSAgICAgICAgICAgIC8vIEV4dHJhY3QgdGhlIGlkIG9mIHRoZSBuZXcgdXNlci4KLSAgICAgICAgICAgIG1BdmFpbGFibGVGZWF0dXJlcyA9IG5ldyBIYXNoU2V0PD4oKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGZlYXR1cmU6IG91dHB1dC5zcGxpdCgiXFxzKyIpKSB7Ci0gICAgICAgICAgICAgICAgLy8gRWFjaCBsaW5lIGluIHRoZSBvdXRwdXQgb2YgdGhlIGNvbW1hbmQgaGFzIHRoZSBmb3JtYXQgImZlYXR1cmU6e0ZFQVRVUkVfVkFMVUV9Ii4KLSAgICAgICAgICAgICAgICBTdHJpbmdbXSB0b2tlbnMgPSBmZWF0dXJlLnNwbGl0KCI6Iik7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiXCIiICsgZmVhdHVyZSArICJcIiBleHBlY3RlZCB0byBoYXZlIGZvcm1hdCBmZWF0dXJlOntGRUFUVVJFX1ZBTFVFfSIsCi0gICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnMubGVuZ3RoID4gMSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGZlYXR1cmUsICJmZWF0dXJlIiwgdG9rZW5zWzBdKTsKLSAgICAgICAgICAgICAgICBtQXZhaWxhYmxlRmVhdHVyZXMuYWRkKHRva2Vuc1sxXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBtQXZhaWxhYmxlRmVhdHVyZXMuY29udGFpbnMocmVxdWlyZWRGZWF0dXJlKTsKLSAgICAgICAgaWYgKCFyZXN1bHQpIHsKLSAgICAgICAgICAgIENMb2cubG9nQW5kRGlzcGxheShMb2dMZXZlbC5JTkZPLCAiRGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCAiICsgcmVxdWlyZWRGZWF0dXJlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzRGlzcGxheU9uKCkgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIENvbGxlY3RpbmdPdXRwdXRSZWNlaXZlciBvdXRwdXRSZWNlaXZlciA9IG5ldyBDb2xsZWN0aW5nT3V0cHV0UmVjZWl2ZXIoKTsKLSAgICAgICAgbURldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKCJkdW1wc3lzIHBvd2VyIiwgb3V0cHV0UmVjZWl2ZXIpOwotCi0gICAgICAgIGZvciAoU3RyaW5nIGxpbmUgOiBvdXRwdXRSZWNlaXZlci5nZXRPdXRwdXQoKS5zcGxpdCgiXFxuIikpIHsKLSAgICAgICAgICAgIGxpbmUgPSBsaW5lLnRyaW0oKTsKLQotICAgICAgICAgICAgZmluYWwgTWF0Y2hlciBtYXRjaGVyID0gc0Rpc3BsYXlTdGF0ZVBhdHRlcm4ubWF0Y2hlcihsaW5lKTsKLSAgICAgICAgICAgIGlmIChtYXRjaGVyLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzdGF0ZSA9IG1hdGNoZXIuZ3JvdXAoMSk7Ci0gICAgICAgICAgICAgICAgbG9nKCJwb3dlciBzdGF0ZT0iICsgc3RhdGUpOwotICAgICAgICAgICAgICAgIHJldHVybiAiT04iLmVxdWFscyhzdGF0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbG9nKCJwb3dlciBzdGF0ZSA6KCIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2xlZXBEZXZpY2UoKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IHJldHJpZXNMZWZ0ID0gNTsKLSAgICAgICAgcnVuQ29tbWFuZEFuZFByaW50T3V0cHV0KCJpbnB1dCBrZXlldmVudCBTTEVFUCIpOwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBpZiAoaXNEaXNwbGF5T24oKSkgewotICAgICAgICAgICAgICAgIGxvZygiKioqV2FpdGluZyBmb3IgZGlzcGxheSB0byB0dXJuIG9mZi4uLiIpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZyhlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICAvLyBXZWxsIEkgZ3Vlc3Mgd2UgYXJlIG5vdCB3YWl0aW5nLi4uCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSB3aGlsZSAocmV0cmllc0xlZnQtLSA+IDApOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHdha2VVcEFuZFVubG9ja0RldmljZSgpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICB3YWtlVXBEZXZpY2UoKTsKLSAgICAgICAgdW5sb2NrRGV2aWNlKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgd2FrZVVwQW5kUmVtb3ZlTG9jaygpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICB3YWtlVXBEZXZpY2UoKTsKLSAgICAgICAgc2V0TG9ja0Rpc2FibGVkKHRydWUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHdha2VVcERldmljZSgpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBydW5Db21tYW5kQW5kUHJpbnRPdXRwdXQoImlucHV0IGtleWV2ZW50IFdBS0VVUCIpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHVubG9ja0RldmljZSgpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBydW5Db21tYW5kQW5kUHJpbnRPdXRwdXQoImlucHV0IGtleWV2ZW50IDgyIik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdW5sb2NrRGV2aWNlV2l0aENyZWRlbnRpYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcnVuQ29tbWFuZEFuZFByaW50T3V0cHV0KCJpbnB1dCBrZXlldmVudCA4MiIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDMwMDApOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvL2lnbm9yZWQKLSAgICAgICAgfQotICAgICAgICBlbnRlckFuZENvbmZpcm1Mb2NrQ3JlZGVudGlhbCgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGVudGVyQW5kQ29uZmlybUxvY2tDcmVkZW50aWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFRPRE86IFRoaXMgc2hvdWxkIHVzZSB3YWl0Rm9ySWRsZS4uYnV0IHRoZXJlIGFpbid0IHN1Y2ggYSB0aGluZyBvbiBob3N0c2lkZSB0ZXN0cywgYm9vIDooCi0gICAgICAgIFRocmVhZC5zbGVlcCg1MDApOwotCi0gICAgICAgIHJ1bkNvbW1hbmRBbmRQcmludE91dHB1dCgiaW5wdXQgdGV4dCAiICsgTE9DS19DUkVERU5USUFMKTsKLSAgICAgICAgcnVuQ29tbWFuZEFuZFByaW50T3V0cHV0KCJpbnB1dCBrZXlldmVudCBLRVlDT0RFX0VOVEVSIik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZ290b0tleWd1YXJkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNsZWVwRGV2aWNlKCk7Ci0gICAgICAgIHdha2VVcERldmljZSgpOwotICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JLZXlndWFyZFNob3dpbmdBbmROb3RPY2NsdWRlZChtRGV2aWNlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRMb2NrQ3JlZGVudGlhbCgpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBtTG9ja0NyZWRlbnRpYWxzU2V0ID0gdHJ1ZTsKLSAgICAgICAgcnVuQ29tbWFuZEFuZFByaW50T3V0cHV0KCJsb2Nrc2V0dGluZ3Mgc2V0LXBpbiAiICsgTE9DS19DUkVERU5USUFMKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVtb3ZlTG9ja0NyZWRlbnRpYWwoKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgcnVuQ29tbWFuZEFuZFByaW50T3V0cHV0KCJsb2Nrc2V0dGluZ3MgY2xlYXIgLS1vbGQgIiArIExPQ0tfQ1JFREVOVElBTCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBsb2NrIHNjcmVlbiBpcyBkaXNhYmxlZC4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGxvY2sgc2NyZWVuIGlzIGRpc2FibGVkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzTG9ja0Rpc2FibGVkKCkgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBpc0xvY2tEaXNhYmxlZCA9IHJ1bkNvbW1hbmRBbmRQcmludE91dHB1dCgibG9ja3NldHRpbmdzIGdldC1kaXNhYmxlZCIpLnRyaW0oKTsKLSAgICAgICAgaWYgKCJudWxsIi5lcXVhbHMoaXNMb2NrRGlzYWJsZWQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEJvb2xlYW4ucGFyc2VCb29sZWFuKGlzTG9ja0Rpc2FibGVkKTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIERpc2FibGUgdGhlIGxvY2sgc2NyZWVuLgotICAgICAqIEBwYXJhbSBsb2NrRGlzYWJsZWQgdHJ1ZSBpZiBzaG91bGQgZGlzYWJsZSwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHZvaWQgc2V0TG9ja0Rpc2FibGVkKGJvb2xlYW4gbG9ja0Rpc2FibGVkKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgcnVuQ29tbWFuZEFuZFByaW50T3V0cHV0KCJsb2Nrc2V0dGluZ3Mgc2V0LWRpc2FibGVkICIgKyBsb2NrRGlzYWJsZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRldmljZSByb3RhdGlvbiwgdmFsdWUgY29ycmVzcG9uZHMgdG8gb25lIG9mIHtAbGluayBTdXJmYWNlLlJPVEFUSU9OXzB9LAotICAgICAqIHtAbGluayBTdXJmYWNlLlJPVEFUSU9OXzkwfSwge0BsaW5rIFN1cmZhY2UuUk9UQVRJT05fMTgwfSwge0BsaW5rIFN1cmZhY2UuUk9UQVRJT05fMjcwfS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXREZXZpY2VSb3RhdGlvbihpbnQgcm90YXRpb24pIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzZXRBY2NlbGVyb21ldGVyUm90YXRpb24oMCk7Ci0gICAgICAgIHNldFVzZXJSb3RhdGlvbihyb3RhdGlvbik7Ci0gICAgICAgIG1BbVdtU3RhdGUud2FpdEZvclJvdGF0aW9uKG1EZXZpY2UsIHJvdGF0aW9uKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgaW50IGdldERldmljZVJvdGF0aW9uKGludCBkaXNwbGF5SWQpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBTdHJpbmcgZGlzcGxheXMgPSBydW5Db21tYW5kQW5kUHJpbnRPdXRwdXQoImR1bXBzeXMgZGlzcGxheSBkaXNwbGF5cyIpLnRyaW0oKTsKLSAgICAgICAgUGF0dGVybiBwYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKAotICAgICAgICAgICAgICAgICIobURpc3BsYXlJZD0iICsgZGlzcGxheUlkICsgIikoW1xcc1xcU10qKShtT3ZlcnJpZGVEaXNwbGF5SW5mbykoLiopIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiKHJvdGF0aW9uKShcXHMrKShcXGQrKSIpOwotICAgICAgICBNYXRjaGVyIG1hdGNoZXIgPSBwYXR0ZXJuLm1hdGNoZXIoZGlzcGxheXMpOwotICAgICAgICB3aGlsZSAobWF0Y2hlci5maW5kKCkpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtYXRjaCA9IG1hdGNoZXIuZ3JvdXAoNyk7Ci0gICAgICAgICAgICByZXR1cm4gSW50ZWdlci5wYXJzZUludChtYXRjaCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gSU5WQUxJRF9ERVZJQ0VfUk9UQVRJT047Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0QWNjZWxlcm9tZXRlclJvdGF0aW9uKCkgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyByb3RhdGlvbiA9Ci0gICAgICAgICAgICAgICAgcnVuQ29tbWFuZEFuZFByaW50T3V0cHV0KCJzZXR0aW5ncyBnZXQgc3lzdGVtIGFjY2VsZXJvbWV0ZXJfcm90YXRpb24iKTsKLSAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQocm90YXRpb24udHJpbSgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0QWNjZWxlcm9tZXRlclJvdGF0aW9uKGludCByb3RhdGlvbikgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJ1bkNvbW1hbmRBbmRQcmludE91dHB1dCgKLSAgICAgICAgICAgICAgICAic2V0dGluZ3MgcHV0IHN5c3RlbSBhY2NlbGVyb21ldGVyX3JvdGF0aW9uICIgKyByb3RhdGlvbik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGludCBnZXRVc2VyUm90YXRpb24oKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHJvdGF0aW9uID0KLSAgICAgICAgICAgICAgICBydW5Db21tYW5kQW5kUHJpbnRPdXRwdXQoInNldHRpbmdzIGdldCBzeXN0ZW0gdXNlcl9yb3RhdGlvbiIpLnRyaW0oKTsKLSAgICAgICAgaWYgKCJudWxsIi5lcXVhbHMocm90YXRpb24pKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQocm90YXRpb24pOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRVc2VyUm90YXRpb24oaW50IHJvdGF0aW9uKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHJvdGF0aW9uID09IC0xKSB7Ci0gICAgICAgICAgICBydW5Db21tYW5kQW5kUHJpbnRPdXRwdXQoCi0gICAgICAgICAgICAgICAgICAgICJzZXR0aW5ncyBkZWxldGUgc3lzdGVtIHVzZXJfcm90YXRpb24iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJ1bkNvbW1hbmRBbmRQcmludE91dHB1dCgKLSAgICAgICAgICAgICAgICAgICAgInNldHRpbmdzIHB1dCBzeXN0ZW0gdXNlcl9yb3RhdGlvbiAiICsgcm90YXRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0Rm9udFNjYWxlKGZsb2F0IGZvbnRTY2FsZSkgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChmb250U2NhbGUgPT0gMC4wZikgewotICAgICAgICAgICAgcnVuQ29tbWFuZEFuZFByaW50T3V0cHV0KAotICAgICAgICAgICAgICAgICAgICAic2V0dGluZ3MgZGVsZXRlIHN5c3RlbSBmb250X3NjYWxlIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBydW5Db21tYW5kQW5kUHJpbnRPdXRwdXQoCi0gICAgICAgICAgICAgICAgICAgICJzZXR0aW5ncyBwdXQgc3lzdGVtIGZvbnRfc2NhbGUgIiArIGZvbnRTY2FsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRXaW5kb3dUcmFuc2l0aW9uQW5pbWF0aW9uRHVyYXRpb25TY2FsZShmbG9hdCBhbmltRHVyYXRpb25TY2FsZSkKLSAgICAgICAgICAgIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBydW5Db21tYW5kQW5kUHJpbnRPdXRwdXQoCi0gICAgICAgICAgICAgICAgInNldHRpbmdzIHB1dCBnbG9iYWwgdHJhbnNpdGlvbl9hbmltYXRpb25fc2NhbGUgIiArIGFuaW1EdXJhdGlvblNjYWxlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgZmxvYXQgZ2V0Rm9udFNjYWxlKCkgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZm9udFNjYWxlID0KLSAgICAgICAgICAgICAgICAgICAgcnVuQ29tbWFuZEFuZFByaW50T3V0cHV0KCJzZXR0aW5ncyBnZXQgc3lzdGVtIGZvbnRfc2NhbGUiKS50cmltKCk7Ci0gICAgICAgICAgICByZXR1cm4gRmxvYXQucGFyc2VGbG9hdChmb250U2NhbGUpOwotICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIHZhbGlkIGZvbnQgc2NhbGUga2V5LCByZXR1cm4gMC4wZiBub3cgc28KLSAgICAgICAgICAgIC8vIHRoYXQgd2UgZGVsZXRlIHRoZSBrZXkgaW4gdGVhckRvd24oKS4KLSAgICAgICAgICAgIHJldHVybiAwLjBmOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBydW5Db21tYW5kQW5kUHJpbnRPdXRwdXQoU3RyaW5nIGNvbW1hbmQpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBTdHJpbmcgb3V0cHV0ID0gZXhlY3V0ZVNoZWxsQ29tbWFuZChjb21tYW5kKTsKLSAgICAgICAgbG9nKG91dHB1dCk7Ci0gICAgICAgIHJldHVybiBvdXRwdXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJpZXMgdG8gY2xlYXIgbG9nY2F0IGFuZCBpbnNlcnRzIGxvZyBzZXBhcmF0b3IgaW4gY2FzZSBjbGVhcmluZyBkaWRuJ3Qgc3VjY2VlZCwgc28gd2UgY2FuCi0gICAgICogYWx3YXlzIGZpbmQgdGhlIHN0YXJ0aW5nIHBvaW50IGZyb20gd2hlcmUgdG8gZXZhbHVhdGUgZm9sbG93aW5nIGxvZ3MuCi0gICAgICogQHJldHVybiBVbmlxdWUgbG9nIHNlcGFyYXRvci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNsZWFyTG9nY2F0KCkgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIG1EZXZpY2UuZXhlY3V0ZUFkYkNvbW1hbmQoImxvZ2NhdCIsICItYyIpOwotICAgICAgICBmaW5hbCBTdHJpbmcgdW5pcXVlU3RyaW5nID0gVVVJRC5yYW5kb21VVUlEKCkudG9TdHJpbmcoKTsKLSAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZCgibG9nIC10ICIgKyBMT0dfU0VQQVJBVE9SICsgIiAiICsgdW5pcXVlU3RyaW5nKTsKLSAgICAgICAgcmV0dXJuIHVuaXF1ZVN0cmluZzsKLSAgICB9Ci0KLSAgICB2b2lkIGFzc2VydEFjdGl2aXR5TGlmZWN5Y2xlKFN0cmluZyBhY3Rpdml0eU5hbWUsIGJvb2xlYW4gcmVsYXVuY2hlZCwKLSAgICAgICAgICAgIFN0cmluZyBsb2dTZXBhcmF0b3IpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBpbnQgcmV0cmllc0xlZnQgPSA1OwotICAgICAgICBTdHJpbmcgcmVzdWx0U3RyaW5nOwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICByZXN1bHRTdHJpbmcgPSB2ZXJpZnlMaWZlY3ljbGVDb25kaXRpb24oYWN0aXZpdHlOYW1lLCBsb2dTZXBhcmF0b3IsIHJlbGF1bmNoZWQpOwotICAgICAgICAgICAgaWYgKHJlc3VsdFN0cmluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9nKCIqKipXYWl0aW5nIGZvciB2YWxpZCBsaWZlY3ljbGUgc3RhdGU6ICIgKyByZXN1bHRTdHJpbmcpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZyhlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gd2hpbGUgKHJldHJpZXNMZWZ0LS0gPiAwKTsKLQotICAgICAgICBhc3NlcnROdWxsKHJlc3VsdFN0cmluZywgcmVzdWx0U3RyaW5nKTsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBFcnJvciBzdHJpbmcgaWYgbGlmZWN5Y2xlIGNvdW50cyBkb24ndCBtYXRjaCwgbnVsbCBpZiBldmVyeXRoaW5nIGlzIGZpbmUuICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmVyaWZ5TGlmZWN5Y2xlQ29uZGl0aW9uKFN0cmluZyBhY3Rpdml0eU5hbWUsIFN0cmluZyBsb2dTZXBhcmF0b3IsCi0gICAgICAgICAgICBib29sZWFuIHJlbGF1bmNoZWQpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBBY3Rpdml0eUxpZmVjeWNsZUNvdW50cyBsaWZlY3ljbGVDb3VudHMgPSBuZXcgQWN0aXZpdHlMaWZlY3ljbGVDb3VudHMoYWN0aXZpdHlOYW1lLAotICAgICAgICAgICAgICAgIGxvZ1NlcGFyYXRvcik7Ci0gICAgICAgIGlmIChyZWxhdW5jaGVkKSB7Ci0gICAgICAgICAgICBpZiAobGlmZWN5Y2xlQ291bnRzLm1EZXN0cm95Q291bnQgPCAxKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFjdGl2aXR5TmFtZSArICIgbXVzdCBoYXZlIGJlZW4gZGVzdHJveWVkLiBtRGVzdHJveUNvdW50PSIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbGlmZWN5Y2xlQ291bnRzLm1EZXN0cm95Q291bnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobGlmZWN5Y2xlQ291bnRzLm1DcmVhdGVDb3VudCA8IDEpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYWN0aXZpdHlOYW1lICsgIiBtdXN0IGhhdmUgYmVlbiAocmUpY3JlYXRlZC4gbUNyZWF0ZUNvdW50PSIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbGlmZWN5Y2xlQ291bnRzLm1DcmVhdGVDb3VudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChsaWZlY3ljbGVDb3VudHMubURlc3Ryb3lDb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYWN0aXZpdHlOYW1lICsgIiBtdXN0ICpOT1QqIGhhdmUgYmVlbiBkZXN0cm95ZWQuIG1EZXN0cm95Q291bnQ9IgotICAgICAgICAgICAgICAgICAgICAgICAgKyBsaWZlY3ljbGVDb3VudHMubURlc3Ryb3lDb3VudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChsaWZlY3ljbGVDb3VudHMubUNyZWF0ZUNvdW50ID4gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBhY3Rpdml0eU5hbWUgKyAiIG11c3QgKk5PVCogaGF2ZSBiZWVuIChyZSljcmVhdGVkLiBtQ3JlYXRlQ291bnQ9IgotICAgICAgICAgICAgICAgICAgICAgICAgKyBsaWZlY3ljbGVDb3VudHMubUNyZWF0ZUNvdW50OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGxpZmVjeWNsZUNvdW50cy5tQ29uZmlndXJhdGlvbkNoYW5nZWRDb3VudCA8IDEpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYWN0aXZpdHlOYW1lICsgIiBtdXN0IGhhdmUgcmVjZWl2ZWQgY29uZmlndXJhdGlvbiBjaGFuZ2VkLiAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJtQ29uZmlndXJhdGlvbkNoYW5nZWRDb3VudD0iCi0gICAgICAgICAgICAgICAgICAgICAgICArIGxpZmVjeWNsZUNvdW50cy5tQ29uZmlndXJhdGlvbkNoYW5nZWRDb3VudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRSZWxhdW5jaE9yQ29uZmlnQ2hhbmdlZCgKLSAgICAgICAgICAgIFN0cmluZyBhY3Rpdml0eU5hbWUsIGludCBudW1SZWxhdW5jaCwgaW50IG51bUNvbmZpZ0NoYW5nZSwgU3RyaW5nIGxvZ1NlcGFyYXRvcikKLSAgICAgICAgICAgIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBpbnQgcmV0cmllc0xlZnQgPSA1OwotICAgICAgICBTdHJpbmcgcmVzdWx0U3RyaW5nOwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICByZXN1bHRTdHJpbmcgPSB2ZXJpZnlSZWxhdW5jaE9yQ29uZmlnQ2hhbmdlZChhY3Rpdml0eU5hbWUsIG51bVJlbGF1bmNoLCBudW1Db25maWdDaGFuZ2UsCi0gICAgICAgICAgICAgICAgICAgIGxvZ1NlcGFyYXRvcik7Ci0gICAgICAgICAgICBpZiAocmVzdWx0U3RyaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsb2coIioqKldhaXRpbmcgZm9yIHJlbGF1bmNoIG9yIGNvbmZpZyBjaGFuZ2VkOiAiICsgcmVzdWx0U3RyaW5nKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBsb2coZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlIChyZXRyaWVzTGVmdC0tID4gMCk7Ci0KLSAgICAgICAgYXNzZXJ0TnVsbChyZXN1bHRTdHJpbmcsIHJlc3VsdFN0cmluZyk7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gRXJyb3Igc3RyaW5nIGlmIGxpZmVjeWNsZSBjb3VudHMgZG9uJ3QgbWF0Y2gsIG51bGwgaWYgZXZlcnl0aGluZyBpcyBmaW5lLiAqLwotICAgIHByaXZhdGUgU3RyaW5nIHZlcmlmeVJlbGF1bmNoT3JDb25maWdDaGFuZ2VkKFN0cmluZyBhY3Rpdml0eU5hbWUsIGludCBudW1SZWxhdW5jaCwKLSAgICAgICAgICAgIGludCBudW1Db25maWdDaGFuZ2UsIFN0cmluZyBsb2dTZXBhcmF0b3IpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBBY3Rpdml0eUxpZmVjeWNsZUNvdW50cyBsaWZlY3ljbGVDb3VudHMgPSBuZXcgQWN0aXZpdHlMaWZlY3ljbGVDb3VudHMoYWN0aXZpdHlOYW1lLAotICAgICAgICAgICAgICAgIGxvZ1NlcGFyYXRvcik7Ci0KLSAgICAgICAgaWYgKGxpZmVjeWNsZUNvdW50cy5tRGVzdHJveUNvdW50ICE9IG51bVJlbGF1bmNoKSB7Ci0gICAgICAgICAgICByZXR1cm4gYWN0aXZpdHlOYW1lICsgIiBoYXMgYmVlbiBkZXN0cm95ZWQgIiArIGxpZmVjeWNsZUNvdW50cy5tRGVzdHJveUNvdW50Ci0gICAgICAgICAgICAgICAgICAgICsgIiB0aW1lKHMpLCBleHBlY3RpbmcgIiArIG51bVJlbGF1bmNoOwotICAgICAgICB9IGVsc2UgaWYgKGxpZmVjeWNsZUNvdW50cy5tQ3JlYXRlQ291bnQgIT0gbnVtUmVsYXVuY2gpIHsKLSAgICAgICAgICAgIHJldHVybiBhY3Rpdml0eU5hbWUgKyAiIGhhcyBiZWVuIChyZSljcmVhdGVkICIgKyBsaWZlY3ljbGVDb3VudHMubUNyZWF0ZUNvdW50Ci0gICAgICAgICAgICAgICAgICAgICsgIiB0aW1lKHMpLCBleHBlY3RpbmcgIiArIG51bVJlbGF1bmNoOwotICAgICAgICB9IGVsc2UgaWYgKGxpZmVjeWNsZUNvdW50cy5tQ29uZmlndXJhdGlvbkNoYW5nZWRDb3VudCAhPSBudW1Db25maWdDaGFuZ2UpIHsKLSAgICAgICAgICAgIHJldHVybiBhY3Rpdml0eU5hbWUgKyAiIGhhcyByZWNlaXZlZCAiICsgbGlmZWN5Y2xlQ291bnRzLm1Db25maWd1cmF0aW9uQ2hhbmdlZENvdW50Ci0gICAgICAgICAgICAgICAgICAgICsgIiBvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKCkgY2FsbHMsIGV4cGVjdGluZyAiICsgbnVtQ29uZmlnQ2hhbmdlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydEFjdGl2aXR5RGVzdHJveWVkKFN0cmluZyBhY3Rpdml0eU5hbWUsIFN0cmluZyBsb2dTZXBhcmF0b3IpCi0gICAgICAgICAgICB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IHJldHJpZXNMZWZ0ID0gNTsKLSAgICAgICAgU3RyaW5nIHJlc3VsdFN0cmluZzsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgcmVzdWx0U3RyaW5nID0gdmVyaWZ5QWN0aXZpdHlEZXN0cm95ZWQoYWN0aXZpdHlOYW1lLCBsb2dTZXBhcmF0b3IpOwotICAgICAgICAgICAgaWYgKHJlc3VsdFN0cmluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9nKCIqKipXYWl0aW5nIGZvciBhY3Rpdml0eSBkZXN0cm95ZWQ6ICIgKyByZXN1bHRTdHJpbmcpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZyhlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gd2hpbGUgKHJldHJpZXNMZWZ0LS0gPiAwKTsKLQotICAgICAgICBhc3NlcnROdWxsKHJlc3VsdFN0cmluZywgcmVzdWx0U3RyaW5nKTsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBFcnJvciBzdHJpbmcgaWYgbGlmZWN5Y2xlIGNvdW50cyBkb24ndCBtYXRjaCwgbnVsbCBpZiBldmVyeXRoaW5nIGlzIGZpbmUuICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmVyaWZ5QWN0aXZpdHlEZXN0cm95ZWQoU3RyaW5nIGFjdGl2aXR5TmFtZSwgU3RyaW5nIGxvZ1NlcGFyYXRvcikKLSAgICAgICAgICAgIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBBY3Rpdml0eUxpZmVjeWNsZUNvdW50cyBsaWZlY3ljbGVDb3VudHMgPSBuZXcgQWN0aXZpdHlMaWZlY3ljbGVDb3VudHMoYWN0aXZpdHlOYW1lLAotICAgICAgICAgICAgICAgIGxvZ1NlcGFyYXRvcik7Ci0KLSAgICAgICAgaWYgKGxpZmVjeWNsZUNvdW50cy5tRGVzdHJveUNvdW50ICE9IDEpIHsKLSAgICAgICAgICAgIHJldHVybiBhY3Rpdml0eU5hbWUgKyAiIGhhcyBiZWVuIGRlc3Ryb3llZCAiICsgbGlmZWN5Y2xlQ291bnRzLm1EZXN0cm95Q291bnQKLSAgICAgICAgICAgICAgICAgICAgKyAiIHRpbWUocyksIGV4cGVjdGluZyBzaW5nbGUgZGVzdHJ1Y3Rpb24uIjsKLSAgICAgICAgfSBlbHNlIGlmIChsaWZlY3ljbGVDb3VudHMubUNyZWF0ZUNvdW50ICE9IDApIHsKLSAgICAgICAgICAgIHJldHVybiBhY3Rpdml0eU5hbWUgKyAiIGhhcyBiZWVuIChyZSljcmVhdGVkICIgKyBsaWZlY3ljbGVDb3VudHMubUNyZWF0ZUNvdW50Ci0gICAgICAgICAgICAgICAgICAgICsgIiB0aW1lKHMpLCBub3QgZXhwZWN0aW5nIGFueS4iOwotICAgICAgICB9IGVsc2UgaWYgKGxpZmVjeWNsZUNvdW50cy5tQ29uZmlndXJhdGlvbkNoYW5nZWRDb3VudCAhPSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gYWN0aXZpdHlOYW1lICsgIiBoYXMgcmVjZWl2ZWQgIiArIGxpZmVjeWNsZUNvdW50cy5tQ29uZmlndXJhdGlvbkNoYW5nZWRDb3VudAotICAgICAgICAgICAgICAgICAgICArICIgb25Db25maWd1cmF0aW9uQ2hhbmdlZCgpIGNhbGxzLCBub3QgZXhwZWN0aW5nIGFueS4iOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmdbXSBnZXREZXZpY2VMb2dzRm9yQ29tcG9uZW50KFN0cmluZyBjb21wb25lbnROYW1lLCBTdHJpbmcgbG9nU2VwYXJhdG9yKQotICAgICAgICAgICAgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXREZXZpY2VMb2dzRm9yQ29tcG9uZW50cyhuZXcgU3RyaW5nW117Y29tcG9uZW50TmFtZX0sIGxvZ1NlcGFyYXRvcik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZ1tdIGdldERldmljZUxvZ3NGb3JDb21wb25lbnRzKGZpbmFsIFN0cmluZ1tdIGNvbXBvbmVudE5hbWVzLAotICAgICAgICAgICAgU3RyaW5nIGxvZ1NlcGFyYXRvcikgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBmaWx0ZXJzID0gTE9HX1NFUEFSQVRPUiArICI6SSAiOwotICAgICAgICBmb3IgKFN0cmluZyBjb21wb25lbnQgOiBjb21wb25lbnROYW1lcykgewotICAgICAgICAgICAgZmlsdGVycyArPSBjb21wb25lbnQgKyAiOkkgIjsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBTdHJpbmdbXSByZXN1bHQgPSBtRGV2aWNlLmV4ZWN1dGVBZGJDb21tYW5kKAotICAgICAgICAgICAgICAgICJsb2djYXQiLCAiLXYiLCAiYnJpZWYiLCAiLWQiLCBmaWx0ZXJzLCAiKjpTIikuc3BsaXQoIlxcbiIpOwotICAgICAgICBpZiAobG9nU2VwYXJhdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB3ZSBvbmx5IGNoZWNrIGxvZ3MgYWZ0ZXIgdGhlIHNlcGFyYXRvci4KLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICBib29sZWFuIGxvb2tpbmdGb3JTZXBhcmF0b3IgPSB0cnVlOwotICAgICAgICB3aGlsZSAoaSA8IHJlc3VsdC5sZW5ndGggJiYgbG9va2luZ0ZvclNlcGFyYXRvcikgewotICAgICAgICAgICAgaWYgKHJlc3VsdFtpXS5jb250YWlucyhsb2dTZXBhcmF0b3IpKSB7Ci0gICAgICAgICAgICAgICAgbG9va2luZ0ZvclNlcGFyYXRvciA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaSsrOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIFN0cmluZ1tdIGZpbHRlcmVkUmVzdWx0ID0gbmV3IFN0cmluZ1tyZXN1bHQubGVuZ3RoIC0gaV07Ci0gICAgICAgIGZvciAoaW50IGN1clBvcyA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBjdXJQb3MrKywgaSsrKSB7Ci0gICAgICAgICAgICBmaWx0ZXJlZFJlc3VsdFtjdXJQb3NdID0gcmVzdWx0W2ldOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmaWx0ZXJlZFJlc3VsdDsKLSAgICB9Ci0KLSAgICB2b2lkIGFzc2VydFNpbmdsZUxhdW5jaChTdHJpbmcgYWN0aXZpdHlOYW1lLCBTdHJpbmcgbG9nU2VwYXJhdG9yKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IHJldHJpZXNMZWZ0ID0gNTsKLSAgICAgICAgU3RyaW5nIHJlc3VsdFN0cmluZzsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgcmVzdWx0U3RyaW5nID0gdmFsaWRhdGVMaWZlY3ljbGVDb3VudHMoYWN0aXZpdHlOYW1lLCBsb2dTZXBhcmF0b3IsIDEgLyogY3JlYXRlQ291bnQgKi8sCi0gICAgICAgICAgICAgICAgICAgIDEgLyogc3RhcnRDb3VudCAqLywgMSAvKiByZXN1bWVDb3VudCAqLywgMCAvKiBwYXVzZUNvdW50ICovLCAwIC8qIHN0b3BDb3VudCAqLywKLSAgICAgICAgICAgICAgICAgICAgMCAvKiBkZXN0cm95Q291bnQgKi8pOwotICAgICAgICAgICAgaWYgKHJlc3VsdFN0cmluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9nKCIqKipXYWl0aW5nIGZvciB2YWxpZCBsaWZlY3ljbGUgc3RhdGU6ICIgKyByZXN1bHRTdHJpbmcpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZyhlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gd2hpbGUgKHJldHJpZXNMZWZ0LS0gPiAwKTsKLQotICAgICAgICBhc3NlcnROdWxsKHJlc3VsdFN0cmluZywgcmVzdWx0U3RyaW5nKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhc3NlcnRTaW5nbGVMYXVuY2hBbmRTdG9wKFN0cmluZyBhY3Rpdml0eU5hbWUsIFN0cmluZyBsb2dTZXBhcmF0b3IpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBpbnQgcmV0cmllc0xlZnQgPSA1OwotICAgICAgICBTdHJpbmcgcmVzdWx0U3RyaW5nOwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICByZXN1bHRTdHJpbmcgPSB2YWxpZGF0ZUxpZmVjeWNsZUNvdW50cyhhY3Rpdml0eU5hbWUsIGxvZ1NlcGFyYXRvciwgMSAvKiBjcmVhdGVDb3VudCAqLywKLSAgICAgICAgICAgICAgICAgICAgMSAvKiBzdGFydENvdW50ICovLCAxIC8qIHJlc3VtZUNvdW50ICovLCAxIC8qIHBhdXNlQ291bnQgKi8sIDEgLyogc3RvcENvdW50ICovLAotICAgICAgICAgICAgICAgICAgICAwIC8qIGRlc3Ryb3lDb3VudCAqLyk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0U3RyaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsb2coIioqKldhaXRpbmcgZm9yIHZhbGlkIGxpZmVjeWNsZSBzdGF0ZTogIiArIHJlc3VsdFN0cmluZyk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSB3aGlsZSAocmV0cmllc0xlZnQtLSA+IDApOwotCi0gICAgICAgIGFzc2VydE51bGwocmVzdWx0U3RyaW5nLCByZXN1bHRTdHJpbmcpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFzc2VydFNpbmdsZVN0YXJ0QW5kU3RvcChTdHJpbmcgYWN0aXZpdHlOYW1lLCBTdHJpbmcgbG9nU2VwYXJhdG9yKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IHJldHJpZXNMZWZ0ID0gNTsKLSAgICAgICAgU3RyaW5nIHJlc3VsdFN0cmluZzsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgcmVzdWx0U3RyaW5nID0gIHZhbGlkYXRlTGlmZWN5Y2xlQ291bnRzKGFjdGl2aXR5TmFtZSwgbG9nU2VwYXJhdG9yLCAwIC8qIGNyZWF0ZUNvdW50ICovLAotICAgICAgICAgICAgICAgICAgICAxIC8qIHN0YXJ0Q291bnQgKi8sIDEgLyogcmVzdW1lQ291bnQgKi8sIDEgLyogcGF1c2VDb3VudCAqLywgMSAvKiBzdG9wQ291bnQgKi8sCi0gICAgICAgICAgICAgICAgICAgIDAgLyogZGVzdHJveUNvdW50ICovKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHRTdHJpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxvZygiKioqV2FpdGluZyBmb3IgdmFsaWQgbGlmZWN5Y2xlIHN0YXRlOiAiICsgcmVzdWx0U3RyaW5nKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBsb2coZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlIChyZXRyaWVzTGVmdC0tID4gMCk7Ci0KLSAgICAgICAgYXNzZXJ0TnVsbChyZXN1bHRTdHJpbmcsIHJlc3VsdFN0cmluZyk7Ci0gICAgfQotCi0gICAgdm9pZCBhc3NlcnRTaW5nbGVTdGFydChTdHJpbmcgYWN0aXZpdHlOYW1lLCBTdHJpbmcgbG9nU2VwYXJhdG9yKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IHJldHJpZXNMZWZ0ID0gNTsKLSAgICAgICAgU3RyaW5nIHJlc3VsdFN0cmluZzsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgcmVzdWx0U3RyaW5nID0gdmFsaWRhdGVMaWZlY3ljbGVDb3VudHMoYWN0aXZpdHlOYW1lLCBsb2dTZXBhcmF0b3IsIDAgLyogY3JlYXRlQ291bnQgKi8sCi0gICAgICAgICAgICAgICAgICAgIDEgLyogc3RhcnRDb3VudCAqLywgMSAvKiByZXN1bWVDb3VudCAqLywgMCAvKiBwYXVzZUNvdW50ICovLCAwIC8qIHN0b3BDb3VudCAqLywKLSAgICAgICAgICAgICAgICAgICAgMCAvKiBkZXN0cm95Q291bnQgKi8pOwotICAgICAgICAgICAgaWYgKHJlc3VsdFN0cmluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9nKCIqKipXYWl0aW5nIGZvciB2YWxpZCBsaWZlY3ljbGUgc3RhdGU6ICIgKyByZXN1bHRTdHJpbmcpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZyhlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gd2hpbGUgKHJldHJpZXNMZWZ0LS0gPiAwKTsKLQotICAgICAgICBhc3NlcnROdWxsKHJlc3VsdFN0cmluZywgcmVzdWx0U3RyaW5nKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyB2YWxpZGF0ZUxpZmVjeWNsZUNvdW50cyhTdHJpbmcgYWN0aXZpdHlOYW1lLCBTdHJpbmcgbG9nU2VwYXJhdG9yLAotICAgICAgICAgICAgaW50IGNyZWF0ZUNvdW50LCBpbnQgc3RhcnRDb3VudCwgaW50IHJlc3VtZUNvdW50LCBpbnQgcGF1c2VDb3VudCwgaW50IHN0b3BDb3VudCwKLSAgICAgICAgICAgIGludCBkZXN0cm95Q291bnQpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotCi0gICAgICAgIGZpbmFsIEFjdGl2aXR5TGlmZWN5Y2xlQ291bnRzIGxpZmVjeWNsZUNvdW50cyA9IG5ldyBBY3Rpdml0eUxpZmVjeWNsZUNvdW50cyhhY3Rpdml0eU5hbWUsCi0gICAgICAgICAgICAgICAgbG9nU2VwYXJhdG9yKTsKLQotICAgICAgICBpZiAobGlmZWN5Y2xlQ291bnRzLm1DcmVhdGVDb3VudCAhPSBjcmVhdGVDb3VudCkgewotICAgICAgICAgICAgcmV0dXJuIGFjdGl2aXR5TmFtZSArICIgY3JlYXRlZCAiICsgbGlmZWN5Y2xlQ291bnRzLm1DcmVhdGVDb3VudCArICIgdGltZXMuIjsKLSAgICAgICAgfQotICAgICAgICBpZiAobGlmZWN5Y2xlQ291bnRzLm1TdGFydENvdW50ICE9IHN0YXJ0Q291bnQpIHsKLSAgICAgICAgICAgIHJldHVybiBhY3Rpdml0eU5hbWUgKyAiIHN0YXJ0ZWQgIiArIGxpZmVjeWNsZUNvdW50cy5tU3RhcnRDb3VudCArICIgdGltZXMuIjsKLSAgICAgICAgfQotICAgICAgICBpZiAobGlmZWN5Y2xlQ291bnRzLm1SZXN1bWVDb3VudCAhPSByZXN1bWVDb3VudCkgewotICAgICAgICAgICAgcmV0dXJuIGFjdGl2aXR5TmFtZSArICIgcmVzdW1lZCAiICsgbGlmZWN5Y2xlQ291bnRzLm1SZXN1bWVDb3VudCArICIgdGltZXMuIjsKLSAgICAgICAgfQotICAgICAgICBpZiAobGlmZWN5Y2xlQ291bnRzLm1QYXVzZUNvdW50ICE9IHBhdXNlQ291bnQpIHsKLSAgICAgICAgICAgIHJldHVybiBhY3Rpdml0eU5hbWUgKyAiIHBhdXNlZCAiICsgbGlmZWN5Y2xlQ291bnRzLm1QYXVzZUNvdW50ICsgIiB0aW1lcy4iOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsaWZlY3ljbGVDb3VudHMubVN0b3BDb3VudCAhPSBzdG9wQ291bnQpIHsKLSAgICAgICAgICAgIHJldHVybiBhY3Rpdml0eU5hbWUgKyAiIHN0b3BwZWQgIiArIGxpZmVjeWNsZUNvdW50cy5tU3RvcENvdW50ICsgIiB0aW1lcy4iOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsaWZlY3ljbGVDb3VudHMubURlc3Ryb3lDb3VudCAhPSBkZXN0cm95Q291bnQpIHsKLSAgICAgICAgICAgIHJldHVybiBhY3Rpdml0eU5hbWUgKyAiIGRlc3Ryb3llZCAiICsgbGlmZWN5Y2xlQ291bnRzLm1EZXN0cm95Q291bnQgKyAiIHRpbWVzLiI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBzQ3JlYXRlUGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiKC4rKTogb25DcmVhdGUiKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHNTdGFydFBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoIiguKyk6IG9uU3RhcnQiKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHNSZXN1bWVQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCIoLispOiBvblJlc3VtZSIpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gc1BhdXNlUGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiKC4rKTogb25QYXVzZSIpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gc0NvbmZpZ3VyYXRpb25DaGFuZ2VkUGF0dGVybiA9Ci0gICAgICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoIiguKyk6IG9uQ29uZmlndXJhdGlvbkNoYW5nZWQiKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHNNb3ZlZFRvRGlzcGxheVBhdHRlcm4gPQotICAgICAgICAgICAgUGF0dGVybi5jb21waWxlKCIoLispOiBvbk1vdmVkVG9EaXNwbGF5Iik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBzU3RvcFBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoIiguKyk6IG9uU3RvcCIpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gc0Rlc3Ryb3lQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCIoLispOiBvbkRlc3Ryb3kiKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHNNdWx0aVdpbmRvd01vZGVDaGFuZ2VkUGF0dGVybiA9Ci0gICAgICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoIiguKyk6IG9uTXVsdGlXaW5kb3dNb2RlQ2hhbmdlZCIpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gc1BpY3R1cmVJblBpY3R1cmVNb2RlQ2hhbmdlZFBhdHRlcm4gPQotICAgICAgICAgICAgUGF0dGVybi5jb21waWxlKCIoLispOiBvblBpY3R1cmVJblBpY3R1cmVNb2RlQ2hhbmdlZCIpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gc05ld0NvbmZpZ1BhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoCi0gICAgICAgICAgICAiKC4rKTogY29uZmlnIHNpemU9XFwoKFxcZCspLChcXGQrKVxcKSBkaXNwbGF5U2l6ZT1cXCgoXFxkKyksKFxcZCspXFwpIgotICAgICAgICAgICAgKyAiIG1ldHJpY3NTaXplPVxcKChcXGQrKSwoXFxkKylcXCkgc21hbGxlc3RTY3JlZW5XaWR0aD0oXFxkKykgZGVuc2l0eURwaT0oXFxkKykiCi0gICAgICAgICAgICArICIgb3JpZW50YXRpb249KFxcZCspIik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBzRGlzcGxheUN1dG91dFBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoCi0gICAgICAgICIoLispOiBjdXRvdXQ9KHRydWV8ZmFsc2UpIik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBzRGlzcGxheVN0YXRlUGF0dGVybiA9Ci0gICAgICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoIkRpc3BsYXkgUG93ZXI6IHN0YXRlPSguKykiKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHNDdXJyZW50VWlNb2RlUGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgibUN1clVpTW9kZT0weChcXGQrKSIpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gc1VpTW9kZUxvY2tlZFBhdHRlcm4gPQotICAgICAgICAgICAgUGF0dGVybi5jb21waWxlKCJtVWlNb2RlTG9ja2VkPSh0cnVlfGZhbHNlKSIpOwotCi0gICAgY2xhc3MgUmVwb3J0ZWRTaXplcyB7Ci0gICAgICAgIGludCB3aWR0aERwOwotICAgICAgICBpbnQgaGVpZ2h0RHA7Ci0gICAgICAgIGludCBkaXNwbGF5V2lkdGg7Ci0gICAgICAgIGludCBkaXNwbGF5SGVpZ2h0OwotICAgICAgICBpbnQgbWV0cmljc1dpZHRoOwotICAgICAgICBpbnQgbWV0cmljc0hlaWdodDsKLSAgICAgICAgaW50IHNtYWxsZXN0V2lkdGhEcDsKLSAgICAgICAgaW50IGRlbnNpdHlEcGk7Ci0gICAgICAgIGludCBvcmllbnRhdGlvbjsKLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiAiUmVwb3J0ZWRTaXplczoge3dpZHRoRHA9IiArIHdpZHRoRHAgKyAiIGhlaWdodERwPSIgKyBoZWlnaHREcAotICAgICAgICAgICAgICAgICAgICArICIgZGlzcGxheVdpZHRoPSIgKyBkaXNwbGF5V2lkdGggKyAiIGRpc3BsYXlIZWlnaHQ9IiArIGRpc3BsYXlIZWlnaHQKLSAgICAgICAgICAgICAgICAgICAgKyAiIG1ldHJpY3NXaWR0aD0iICsgbWV0cmljc1dpZHRoICsgIiBtZXRyaWNzSGVpZ2h0PSIgKyBtZXRyaWNzSGVpZ2h0Ci0gICAgICAgICAgICAgICAgICAgICsgIiBzbWFsbGVzdFdpZHRoRHA9IiArIHNtYWxsZXN0V2lkdGhEcCArICIgZGVuc2l0eURwaT0iICsgZGVuc2l0eURwaQotICAgICAgICAgICAgICAgICAgICArICIgb3JpZW50YXRpb249IiArIG9yaWVudGF0aW9uICsgIn0iOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgICBpZiAoIHRoaXMgPT0gb2JqICkgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBpZiAoICEob2JqIGluc3RhbmNlb2YgUmVwb3J0ZWRTaXplcykgKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBSZXBvcnRlZFNpemVzIHRoYXQgPSAoUmVwb3J0ZWRTaXplcykgb2JqOwotICAgICAgICAgICAgcmV0dXJuIHdpZHRoRHAgPT0gdGhhdC53aWR0aERwCi0gICAgICAgICAgICAgICAgICAgICYmIGhlaWdodERwID09IHRoYXQuaGVpZ2h0RHAKLSAgICAgICAgICAgICAgICAgICAgJiYgZGlzcGxheVdpZHRoID09IHRoYXQuZGlzcGxheVdpZHRoCi0gICAgICAgICAgICAgICAgICAgICYmIGRpc3BsYXlIZWlnaHQgPT0gdGhhdC5kaXNwbGF5SGVpZ2h0Ci0gICAgICAgICAgICAgICAgICAgICYmIG1ldHJpY3NXaWR0aCA9PSB0aGF0Lm1ldHJpY3NXaWR0aAotICAgICAgICAgICAgICAgICAgICAmJiBtZXRyaWNzSGVpZ2h0ID09IHRoYXQubWV0cmljc0hlaWdodAotICAgICAgICAgICAgICAgICAgICAmJiBzbWFsbGVzdFdpZHRoRHAgPT0gdGhhdC5zbWFsbGVzdFdpZHRoRHAKLSAgICAgICAgICAgICAgICAgICAgJiYgZGVuc2l0eURwaSA9PSB0aGF0LmRlbnNpdHlEcGkKLSAgICAgICAgICAgICAgICAgICAgJiYgb3JpZW50YXRpb24gPT0gdGhhdC5vcmllbnRhdGlvbjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIFJlcG9ydGVkU2l6ZXMgZ2V0TGFzdFJlcG9ydGVkU2l6ZXNGb3JBY3Rpdml0eShTdHJpbmcgYWN0aXZpdHlOYW1lLCBTdHJpbmcgbG9nU2VwYXJhdG9yKQotICAgICAgICAgICAgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCByZXRyaWVzTGVmdCA9IDU7Ci0gICAgICAgIFJlcG9ydGVkU2l6ZXMgcmVzdWx0OwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICByZXN1bHQgPSByZWFkTGFzdFJlcG9ydGVkU2l6ZXMoYWN0aXZpdHlOYW1lLCBsb2dTZXBhcmF0b3IpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9nKCIqKipXYWl0aW5nIGZvciBzaXplcyB0byBiZSByZXBvcnRlZC4uLiIpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZyhlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICAvLyBXZWxsIEkgZ3Vlc3Mgd2UgYXJlIG5vdCB3YWl0aW5nLi4uCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSB3aGlsZSAocmV0cmllc0xlZnQtLSA+IDApOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByaXZhdGUgUmVwb3J0ZWRTaXplcyByZWFkTGFzdFJlcG9ydGVkU2l6ZXMoU3RyaW5nIGFjdGl2aXR5TmFtZSwgU3RyaW5nIGxvZ1NlcGFyYXRvcikKLSAgICAgICAgICAgIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBTdHJpbmdbXSBsaW5lcyA9IGdldERldmljZUxvZ3NGb3JDb21wb25lbnQoYWN0aXZpdHlOYW1lLCBsb2dTZXBhcmF0b3IpOwotICAgICAgICBmb3IgKGludCBpID0gbGluZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsaW5lID0gbGluZXNbaV0udHJpbSgpOwotICAgICAgICAgICAgZmluYWwgTWF0Y2hlciBtYXRjaGVyID0gc05ld0NvbmZpZ1BhdHRlcm4ubWF0Y2hlcihsaW5lKTsKLSAgICAgICAgICAgIGlmIChtYXRjaGVyLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgIFJlcG9ydGVkU2l6ZXMgZGV0YWlscyA9IG5ldyBSZXBvcnRlZFNpemVzKCk7Ci0gICAgICAgICAgICAgICAgZGV0YWlscy53aWR0aERwID0gSW50ZWdlci5wYXJzZUludChtYXRjaGVyLmdyb3VwKDIpKTsKLSAgICAgICAgICAgICAgICBkZXRhaWxzLmhlaWdodERwID0gSW50ZWdlci5wYXJzZUludChtYXRjaGVyLmdyb3VwKDMpKTsKLSAgICAgICAgICAgICAgICBkZXRhaWxzLmRpc3BsYXlXaWR0aCA9IEludGVnZXIucGFyc2VJbnQobWF0Y2hlci5ncm91cCg0KSk7Ci0gICAgICAgICAgICAgICAgZGV0YWlscy5kaXNwbGF5SGVpZ2h0ID0gSW50ZWdlci5wYXJzZUludChtYXRjaGVyLmdyb3VwKDUpKTsKLSAgICAgICAgICAgICAgICBkZXRhaWxzLm1ldHJpY3NXaWR0aCA9IEludGVnZXIucGFyc2VJbnQobWF0Y2hlci5ncm91cCg2KSk7Ci0gICAgICAgICAgICAgICAgZGV0YWlscy5tZXRyaWNzSGVpZ2h0ID0gSW50ZWdlci5wYXJzZUludChtYXRjaGVyLmdyb3VwKDcpKTsKLSAgICAgICAgICAgICAgICBkZXRhaWxzLnNtYWxsZXN0V2lkdGhEcCA9IEludGVnZXIucGFyc2VJbnQobWF0Y2hlci5ncm91cCg4KSk7Ci0gICAgICAgICAgICAgICAgZGV0YWlscy5kZW5zaXR5RHBpID0gSW50ZWdlci5wYXJzZUludChtYXRjaGVyLmdyb3VwKDkpKTsKLSAgICAgICAgICAgICAgICBkZXRhaWxzLm9yaWVudGF0aW9uID0gSW50ZWdlci5wYXJzZUludChtYXRjaGVyLmdyb3VwKDEwKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGRldGFpbHM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqIENoZWNrIGlmIGEgZGV2aWNlIGhhcyBkaXNwbGF5IGN1dG91dC4gKi8KLSAgICBib29sZWFuIGhhc0Rpc3BsYXlDdXRvdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gTGF1bmNoIGFuIGFjdGl2aXR5IHRvIHJlcG9ydCBjdXRvdXQgc3RhdGUKLSAgICAgICAgZmluYWwgU3RyaW5nIGxvZ1NlcGFyYXRvciA9IGNsZWFyTG9nY2F0KCk7Ci0gICAgICAgIGxhdW5jaEFjdGl2aXR5KEJST0FEQ0FTVF9SRUNFSVZFUl9BQ1RJVklUWSk7Ci0KLSAgICAgICAgLy8gUmVhZCB0aGUgbG9ncyB0byBjaGVjayBpZiBjdXRvdXQgaXMgcHJlc2VudAotICAgICAgICBmaW5hbCBib29sZWFuIGRpc3BsYXlDdXRvdXRQcmVzZW50ID0gZ2V0Q3V0b3V0U3RhdGVGb3JBY3Rpdml0eSgKLSAgICAgICAgICAgIEJST0FEQ0FTVF9SRUNFSVZFUl9BQ1RJVklUWSwgbG9nU2VwYXJhdG9yKTsKLQotICAgICAgICAvLyBGaW5pc2ggYWN0aXZpdHkKLSAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChGSU5JU0hfQUNUSVZJVFlfQlJPQURDQVNUKTsKLSAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yV2l0aEFtU3RhdGUobURldmljZSwgKHN0YXRlKSAtPiAhc3RhdGUuY29udGFpbnNBY3Rpdml0eSgKLSAgICAgICAgICAgIEJST0FEQ0FTVF9SRUNFSVZFUl9BQ1RJVklUWSksICJXYWl0aW5nIGZvciBhY3Rpdml0eSB0byBiZSByZW1vdmVkIik7Ci0KLSAgICAgICAgcmV0dXJuIGRpc3BsYXlDdXRvdXRQcmVzZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdhaXQgZm9yIGFjdGl2aXR5IHRvIHJlcG9ydCBjdXRvdXQgc3RhdGUgaW4gbG9ncyBhbmQgcmV0dXJuIGl0LiBXaWxsIHJldHVybiB7QGNvZGUgbnVsbH0KLSAgICAgKiBhZnRlciB0aW1lb3V0LgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBnZXRDdXRvdXRTdGF0ZUZvckFjdGl2aXR5KFN0cmluZyBhY3Rpdml0eU5hbWUsIFN0cmluZyBsb2dTZXBhcmF0b3IpCi0gICAgICAgICAgICB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIGxvZ1RhZyA9IGFjdGl2aXR5TmFtZTsKLSAgICAgICAgZm9yIChpbnQgcmV0cnkgPSAxOyByZXRyeSA8PSA1OyByZXRyeSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBib29sZWFuIHJlc3VsdCA9IHJlYWRMYXN0UmVwb3J0ZWRDdXRvdXRTdGF0ZShsb2dTZXBhcmF0b3IsIGxvZ1RhZyk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOwotICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKiogUmVhZCBkaXNwbGF5IGN1dG91dCBzdGF0ZSBmcm9tIGRldmljZSBsb2dzLiAqLwotICAgIHByaXZhdGUgYm9vbGVhbiByZWFkTGFzdFJlcG9ydGVkQ3V0b3V0U3RhdGUoU3RyaW5nIGxvZ1NlcGFyYXRvciwgU3RyaW5nIGxvZ1RhZykKLSAgICAgICAgICAgIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBTdHJpbmdbXSBsaW5lcyA9IGdldERldmljZUxvZ3NGb3JDb21wb25lbnRzKG5ldyBTdHJpbmdbXXtsb2dUYWd9LCBsb2dTZXBhcmF0b3IpOwotICAgICAgICBmb3IgKGludCBpID0gbGluZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsaW5lID0gbGluZXNbaV0udHJpbSgpOwotICAgICAgICAgICAgZmluYWwgTWF0Y2hlciBtYXRjaGVyID0gc0Rpc3BsYXlDdXRvdXRQYXR0ZXJuLm1hdGNoZXIobGluZSk7Ci0gICAgICAgICAgICBpZiAobWF0Y2hlci5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gInRydWUiLmVxdWFscyhtYXRjaGVyLmdyb3VwKDIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqIFdhaXRzIGZvciBhdCBsZWFzdCBvbmUgb25NdWx0aVdpbmRvd01vZGVDaGFuZ2VkIGV2ZW50LiAqLwotICAgIEFjdGl2aXR5TGlmZWN5Y2xlQ291bnRzIHdhaXRGb3JPbk11bHRpV2luZG93TW9kZUNoYW5nZWQoCi0gICAgICAgICAgICBTdHJpbmcgYWN0aXZpdHlOYW1lLCBTdHJpbmcgbG9nU2VwYXJhdG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IHJldHJpZXNMZWZ0ID0gNTsKLSAgICAgICAgQWN0aXZpdHlMaWZlY3ljbGVDb3VudHMgcmVzdWx0OwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICByZXN1bHQgPSBuZXcgQWN0aXZpdHlMaWZlY3ljbGVDb3VudHMoYWN0aXZpdHlOYW1lLCBsb2dTZXBhcmF0b3IpOwotICAgICAgICAgICAgaWYgKHJlc3VsdC5tTXVsdGlXaW5kb3dNb2RlQ2hhbmdlZENvdW50IDwgMSkgewotICAgICAgICAgICAgICAgIGxvZygiKioqd2FpdEZvck9uTXVsdGlXaW5kb3dNb2RlQ2hhbmdlZC4uLiIpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZyhlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICAvLyBXZWxsIEkgZ3Vlc3Mgd2UgYXJlIG5vdCB3YWl0aW5nLi4uCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSB3aGlsZSAocmV0cmllc0xlZnQtLSA+IDApOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIGNsYXNzIEFjdGl2aXR5TGlmZWN5Y2xlQ291bnRzIHsKLSAgICAgICAgaW50IG1DcmVhdGVDb3VudDsKLSAgICAgICAgaW50IG1TdGFydENvdW50OwotICAgICAgICBpbnQgbVJlc3VtZUNvdW50OwotICAgICAgICBpbnQgbUNvbmZpZ3VyYXRpb25DaGFuZ2VkQ291bnQ7Ci0gICAgICAgIGludCBtTGFzdENvbmZpZ3VyYXRpb25DaGFuZ2VkTGluZUluZGV4OwotICAgICAgICBpbnQgbU1vdmVkVG9EaXNwbGF5Q291bnQ7Ci0gICAgICAgIGludCBtTXVsdGlXaW5kb3dNb2RlQ2hhbmdlZENvdW50OwotICAgICAgICBpbnQgbUxhc3RNdWx0aVdpbmRvd01vZGVDaGFuZ2VkTGluZUluZGV4OwotICAgICAgICBpbnQgbVBpY3R1cmVJblBpY3R1cmVNb2RlQ2hhbmdlZENvdW50OwotICAgICAgICBpbnQgbUxhc3RQaWN0dXJlSW5QaWN0dXJlTW9kZUNoYW5nZWRMaW5lSW5kZXg7Ci0gICAgICAgIGludCBtUGF1c2VDb3VudDsKLSAgICAgICAgaW50IG1TdG9wQ291bnQ7Ci0gICAgICAgIGludCBtTGFzdFN0b3BMaW5lSW5kZXg7Ci0gICAgICAgIGludCBtRGVzdHJveUNvdW50OwotCi0gICAgICAgIHB1YmxpYyBBY3Rpdml0eUxpZmVjeWNsZUNvdW50cyhTdHJpbmcgYWN0aXZpdHlOYW1lLCBTdHJpbmcgbG9nU2VwYXJhdG9yKQotICAgICAgICAgICAgICAgIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICAgICAgaW50IGxpbmVJbmRleCA9IDA7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBsaW5lIDogZ2V0RGV2aWNlTG9nc0ZvckNvbXBvbmVudChhY3Rpdml0eU5hbWUsIGxvZ1NlcGFyYXRvcikpIHsKLSAgICAgICAgICAgICAgICBsaW5lID0gbGluZS50cmltKCk7Ci0gICAgICAgICAgICAgICAgbGluZUluZGV4Kys7Ci0KLSAgICAgICAgICAgICAgICBNYXRjaGVyIG1hdGNoZXIgPSBzQ3JlYXRlUGF0dGVybi5tYXRjaGVyKGxpbmUpOwotICAgICAgICAgICAgICAgIGlmIChtYXRjaGVyLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgICAgICBtQ3JlYXRlQ291bnQrKzsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbWF0Y2hlciA9IHNTdGFydFBhdHRlcm4ubWF0Y2hlcihsaW5lKTsKLSAgICAgICAgICAgICAgICBpZiAobWF0Y2hlci5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbVN0YXJ0Q291bnQrKzsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbWF0Y2hlciA9IHNSZXN1bWVQYXR0ZXJuLm1hdGNoZXIobGluZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1hdGNoZXIubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1SZXN1bWVDb3VudCsrOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtYXRjaGVyID0gc0NvbmZpZ3VyYXRpb25DaGFuZ2VkUGF0dGVybi5tYXRjaGVyKGxpbmUpOwotICAgICAgICAgICAgICAgIGlmIChtYXRjaGVyLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgICAgICBtQ29uZmlndXJhdGlvbkNoYW5nZWRDb3VudCsrOwotICAgICAgICAgICAgICAgICAgICBtTGFzdENvbmZpZ3VyYXRpb25DaGFuZ2VkTGluZUluZGV4ID0gbGluZUluZGV4OwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtYXRjaGVyID0gc01vdmVkVG9EaXNwbGF5UGF0dGVybi5tYXRjaGVyKGxpbmUpOwotICAgICAgICAgICAgICAgIGlmIChtYXRjaGVyLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgICAgICBtTW92ZWRUb0Rpc3BsYXlDb3VudCsrOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtYXRjaGVyID0gc011bHRpV2luZG93TW9kZUNoYW5nZWRQYXR0ZXJuLm1hdGNoZXIobGluZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1hdGNoZXIubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1NdWx0aVdpbmRvd01vZGVDaGFuZ2VkQ291bnQrKzsKLSAgICAgICAgICAgICAgICAgICAgbUxhc3RNdWx0aVdpbmRvd01vZGVDaGFuZ2VkTGluZUluZGV4ID0gbGluZUluZGV4OwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtYXRjaGVyID0gc1BpY3R1cmVJblBpY3R1cmVNb2RlQ2hhbmdlZFBhdHRlcm4ubWF0Y2hlcihsaW5lKTsKLSAgICAgICAgICAgICAgICBpZiAobWF0Y2hlci5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbVBpY3R1cmVJblBpY3R1cmVNb2RlQ2hhbmdlZENvdW50Kys7Ci0gICAgICAgICAgICAgICAgICAgIG1MYXN0UGljdHVyZUluUGljdHVyZU1vZGVDaGFuZ2VkTGluZUluZGV4ID0gbGluZUluZGV4OwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtYXRjaGVyID0gc1BhdXNlUGF0dGVybi5tYXRjaGVyKGxpbmUpOwotICAgICAgICAgICAgICAgIGlmIChtYXRjaGVyLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgICAgICBtUGF1c2VDb3VudCsrOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtYXRjaGVyID0gc1N0b3BQYXR0ZXJuLm1hdGNoZXIobGluZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1hdGNoZXIubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdG9wQ291bnQrKzsKLSAgICAgICAgICAgICAgICAgICAgbUxhc3RTdG9wTGluZUluZGV4ID0gbGluZUluZGV4OwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtYXRjaGVyID0gc0Rlc3Ryb3lQYXR0ZXJuLm1hdGNoZXIobGluZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1hdGNoZXIubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1EZXN0cm95Q291bnQrKzsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc3RvcFRlc3RDYXNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoImFtIGZvcmNlLXN0b3AgIiArIGNvbXBvbmVudE5hbWUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBMYXVuY2hBY3Rpdml0eUJ1aWxkZXIgZ2V0TGF1bmNoQWN0aXZpdHlCdWlsZGVyKCkgewotICAgICAgICByZXR1cm4gbmV3IExhdW5jaEFjdGl2aXR5QnVpbGRlcihtQW1XbVN0YXRlLCBtRGV2aWNlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIExhdW5jaEFjdGl2aXR5QnVpbGRlciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQWN0aXZpdHlBbmRXaW5kb3dNYW5hZ2Vyc1N0YXRlIG1BbVdtU3RhdGU7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgSVRlc3REZXZpY2UgbURldmljZTsKLQotICAgICAgICBwcml2YXRlIFN0cmluZyBtVGFyZ2V0QWN0aXZpdHlOYW1lOwotICAgICAgICBwcml2YXRlIFN0cmluZyBtVGFyZ2V0UGFja2FnZSA9IGNvbXBvbmVudE5hbWU7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtVG9TaWRlOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbVJhbmRvbURhdGE7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtTmV3VGFzazsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1NdWx0aXBsZVRhc2s7Ci0gICAgICAgIHByaXZhdGUgaW50IG1EaXNwbGF5SWQgPSBJTlZBTElEX0RJU1BMQVlfSUQ7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIG1MYXVuY2hpbmdBY3Rpdml0eU5hbWUgPSBMQVVOQ0hJTkdfQUNUSVZJVFk7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtUmVvcmRlclRvRnJvbnQ7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtV2FpdEZvckxhdW5jaGVkOwotCi0gICAgICAgIHB1YmxpYyBMYXVuY2hBY3Rpdml0eUJ1aWxkZXIoQWN0aXZpdHlBbmRXaW5kb3dNYW5hZ2Vyc1N0YXRlIGFtV21TdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVGVzdERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgICAgIG1BbVdtU3RhdGUgPSBhbVdtU3RhdGU7Ci0gICAgICAgICAgICBtRGV2aWNlID0gZGV2aWNlOwotICAgICAgICAgICAgbVdhaXRGb3JMYXVuY2hlZCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTGF1bmNoQWN0aXZpdHlCdWlsZGVyIHNldFRvU2lkZShib29sZWFuIHRvU2lkZSkgewotICAgICAgICAgICAgbVRvU2lkZSA9IHRvU2lkZTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIExhdW5jaEFjdGl2aXR5QnVpbGRlciBzZXRSYW5kb21EYXRhKGJvb2xlYW4gcmFuZG9tRGF0YSkgewotICAgICAgICAgICAgbVJhbmRvbURhdGEgPSByYW5kb21EYXRhOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTGF1bmNoQWN0aXZpdHlCdWlsZGVyIHNldE5ld1Rhc2soYm9vbGVhbiBuZXdUYXNrKSB7Ci0gICAgICAgICAgICBtTmV3VGFzayA9IG5ld1Rhc2s7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBMYXVuY2hBY3Rpdml0eUJ1aWxkZXIgc2V0TXVsdGlwbGVUYXNrKGJvb2xlYW4gbXVsdGlwbGVUYXNrKSB7Ci0gICAgICAgICAgICBtTXVsdGlwbGVUYXNrID0gbXVsdGlwbGVUYXNrOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTGF1bmNoQWN0aXZpdHlCdWlsZGVyIHNldFJlb3JkZXJUb0Zyb250KGJvb2xlYW4gcmVvcmRlclRvRnJvbnQpIHsKLSAgICAgICAgICAgIG1SZW9yZGVyVG9Gcm9udCA9IHJlb3JkZXJUb0Zyb250OwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTGF1bmNoQWN0aXZpdHlCdWlsZGVyIHNldFRhcmdldEFjdGl2aXR5TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICAgICAgbVRhcmdldEFjdGl2aXR5TmFtZSA9IG5hbWU7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBMYXVuY2hBY3Rpdml0eUJ1aWxkZXIgc2V0VGFyZ2V0UGFja2FnZShTdHJpbmcgcGtnKSB7Ci0gICAgICAgICAgICBtVGFyZ2V0UGFja2FnZSA9IHBrZzsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIExhdW5jaEFjdGl2aXR5QnVpbGRlciBzZXREaXNwbGF5SWQoaW50IGlkKSB7Ci0gICAgICAgICAgICBtRGlzcGxheUlkID0gaWQ7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBMYXVuY2hBY3Rpdml0eUJ1aWxkZXIgc2V0TGF1bmNoaW5nQWN0aXZpdHlOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgICAgICBtTGF1bmNoaW5nQWN0aXZpdHlOYW1lID0gbmFtZTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIExhdW5jaEFjdGl2aXR5QnVpbGRlciBzZXRXYWl0Rm9yTGF1bmNoZWQoYm9vbGVhbiBzaG91bGRXYWl0KSB7Ci0gICAgICAgICAgICBtV2FpdEZvckxhdW5jaGVkID0gc2hvdWxkV2FpdDsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBjb21tYW5kQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKGdldEFtU3RhcnRDbWQobUxhdW5jaGluZ0FjdGl2aXR5TmFtZSkpOwotICAgICAgICAgICAgY29tbWFuZEJ1aWxkZXIuYXBwZW5kKCIgLWYgMHgyMDAwMDAwMCIpOwotCi0gICAgICAgICAgICAvLyBBZGQgYSBmbGFnIHRvIGVuc3VyZSB3ZSBhY3R1YWxseSBtZWFuIHRvIGxhdW5jaCBhbiBhY3Rpdml0eS4KLSAgICAgICAgICAgIGNvbW1hbmRCdWlsZGVyLmFwcGVuZCgiIC0tZXogbGF1bmNoX2FjdGl2aXR5IHRydWUiKTsKLQotICAgICAgICAgICAgaWYgKG1Ub1NpZGUpIHsKLSAgICAgICAgICAgICAgICBjb21tYW5kQnVpbGRlci5hcHBlbmQoIiAtLWV6IGxhdW5jaF90b190aGVfc2lkZSB0cnVlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVJhbmRvbURhdGEpIHsKLSAgICAgICAgICAgICAgICBjb21tYW5kQnVpbGRlci5hcHBlbmQoIiAtLWV6IHJhbmRvbV9kYXRhIHRydWUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtTmV3VGFzaykgewotICAgICAgICAgICAgICAgIGNvbW1hbmRCdWlsZGVyLmFwcGVuZCgiIC0tZXogbmV3X3Rhc2sgdHJ1ZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1NdWx0aXBsZVRhc2spIHsKLSAgICAgICAgICAgICAgICBjb21tYW5kQnVpbGRlci5hcHBlbmQoIiAtLWV6IG11bHRpcGxlX3Rhc2sgdHJ1ZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1SZW9yZGVyVG9Gcm9udCkgewotICAgICAgICAgICAgICAgIGNvbW1hbmRCdWlsZGVyLmFwcGVuZCgiIC0tZXogcmVvcmRlcl90b19mcm9udCB0cnVlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVRhcmdldEFjdGl2aXR5TmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29tbWFuZEJ1aWxkZXIuYXBwZW5kKCIgLS1lcyB0YXJnZXRfYWN0aXZpdHkgIikuYXBwZW5kKG1UYXJnZXRBY3Rpdml0eU5hbWUpOwotICAgICAgICAgICAgICAgIGNvbW1hbmRCdWlsZGVyLmFwcGVuZCgiIC0tZXMgcGFja2FnZV9uYW1lICIpLmFwcGVuZChtVGFyZ2V0UGFja2FnZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobURpc3BsYXlJZCAhPSBJTlZBTElEX0RJU1BMQVlfSUQpIHsKLSAgICAgICAgICAgICAgICBjb21tYW5kQnVpbGRlci5hcHBlbmQoIiAtLWVpIGRpc3BsYXlfaWQgIikuYXBwZW5kKG1EaXNwbGF5SWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChtRGV2aWNlLCBjb21tYW5kQnVpbGRlci50b1N0cmluZygpKTsKLQotICAgICAgICAgICAgaWYgKG1XYWl0Rm9yTGF1bmNoZWQpIHsKLSAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JWYWxpZFN0YXRlKG1EZXZpY2UsIG5ldyBTdHJpbmdbXXttVGFyZ2V0QWN0aXZpdHlOYW1lfSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgLyogc3RhY2tJZHMgKi8sIGZhbHNlIC8qIGNvbXBhcmVUYXNrQW5kU3RhY2tCb3VuZHMgKi8sIG1UYXJnZXRQYWNrYWdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgdGVhckRvd25Mb2NrQ3JlZGVudGlhbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFtTG9ja0NyZWRlbnRpYWxzU2V0KSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICByZW1vdmVMb2NrQ3JlZGVudGlhbCgpOwotICAgICAgICAvLyBEaXNtaXNzIGFjdGl2ZSBrZXlndWFyZCBhZnRlciBjcmVkZW50aWFsIGlzIGNsZWFyZWQsIHNvCi0gICAgICAgIC8vIGtleWd1YXJkIGRvZXNuJ3QgYXNrIGZvciB0aGUgc3RhbGUgY3JlZGVudGlhbC4KLSAgICAgICAgcHJlc3NCYWNrQnV0dG9uKCk7Ci0gICAgICAgIHNsZWVwRGV2aWNlKCk7Ci0gICAgICAgIHdha2VVcEFuZFVubG9ja0RldmljZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL3V0aWwvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9TdGF0ZUxvZ2dlci5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvdXRpbC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL1N0YXRlTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNWYyNmMuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvdXRpbC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL1N0YXRlTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuc2VydmVyLmN0czsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmxvZy5Mb2dVdGlsLkNMb2c7Ci0KLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuZGRtbGliLkxvZy5Mb2dMZXZlbC5JTkZPOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5kZG1saWIuTG9nLkxvZ0xldmVsLkVSUk9SOwotCi0vKioKLSAqIFV0aWwgY2xhc3MgdG8gcGVyZm9ybSBzaW1wbGUgc3RhdGUgbG9nZ2luZy4KLSAqLwotcHVibGljIGNsYXNzIFN0YXRlTG9nZ2VyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0KLSAgICAvKiogU2ltcGxlIGluZm8tbGV2ZWwgbG9nZ2luZyBnYXRlZCBieSB7QGxpbmsgI0RFQlVHfSBmbGFnICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbG9nVGV4dCkgewotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIENMb2cubG9nQW5kRGlzcGxheShJTkZPLCBsb2dUZXh0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFKFN0cmluZyBsb2dUZXh0KSB7Ci0gICAgICAgIENMb2cubG9nQW5kRGlzcGxheShFUlJPUiwgbG9nVGV4dCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvdXRpbC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL1N1cmZhY2VUcmFjZVJlY2VpdmVyLmphdmEgYi9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci91dGlsL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvU3VyZmFjZVRyYWNlUmVjZWl2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAyNmU4MC4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci91dGlsL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvU3VyZmFjZVRyYWNlUmVjZWl2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuc2VydmVyLmN0czsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5JU2hlbGxPdXRwdXRSZWNlaXZlcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5JVGVzdERldmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5sb2cuTG9nVXRpbC5DTG9nOwotCi1pbXBvcnQgamF2YS5hd3QuUmVjdGFuZ2xlOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5EYXRhSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuU3lzdGVtOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuY3RzLlN0YXRlTG9nZ2VyLmxvZ0U7Ci0KLS8vIFBhcnNlcyBhIHRyYWNlIG9mIHN1cmZhY2UgY29tbWFuZHMgZnJvbSB0aGUgV00gKGluIHJlYWwgdGltZSkKLS8vIGFuZCBkaXNwZW5zZXMgdGhlbSB2aWEgdGhlIFN1cmZhY2VPYnNlcnZlciBpbnRlcmZhY2UuCi0vLwotLy8gRGF0YSBlbnRlcnMgdGhyb3VnaCBhZGRPdXRwdXQKLXB1YmxpYyBjbGFzcyBTdXJmYWNlVHJhY2VSZWNlaXZlciBpbXBsZW1lbnRzIElTaGVsbE91dHB1dFJlY2VpdmVyIHsKLSAgICBmaW5hbCBTdXJmYWNlT2JzZXJ2ZXIgbU9ic2VydmVyOwotCi0gICAgcHJpdmF0ZSBTdGF0ZSBtU3RhdGUgPSBTdGF0ZS5DTUQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbUN1cnJlbnRXaW5kb3dOYW1lID0gbnVsbDsKLSAgICBwcml2YXRlIGludCBtQXJnUG9zaXRpb24gPSAwOwotICAgIHByaXZhdGUgZmxvYXRbXSBtVG1wRmxvYXRzID0gbmV3IGZsb2F0WzEwXTsKLSAgICBwcml2YXRlIGludFtdIG1UbXBJbnRzID0gbmV3IGludFsxMF07Ci0gICAgcHJpdmF0ZSBSZWN0YW5nbGUuRmxvYXQgbVRtcFJlY3QgPSBuZXcgUmVjdGFuZ2xlLkZsb2F0KCk7Ci0gICAgcHJpdmF0ZSBieXRlW10gbVVucHJvY2Vzc2VkQnl0ZXMgPSBuZXcgYnl0ZVsxNjM4NF07Ci0gICAgcHJpdmF0ZSBieXRlW10gbUZ1bGxEYXRhID0gbmV3IGJ5dGVbMzI3NjhdOwotICAgIHByaXZhdGUgaW50IG1VbnByb2Nlc3NlZEJ5dGVzTGVuZ3RoOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1DYW5jZWxsZWQgPSBmYWxzZTsKLQotICAgIGludGVyZmFjZSBTdXJmYWNlT2JzZXJ2ZXIgewotICAgICAgICBkZWZhdWx0IHZvaWQgc2V0QWxwaGEoU3RyaW5nIHdpbmRvd05hbWUsIGZsb2F0IGFscGhhKSB7fQotICAgICAgICBkZWZhdWx0IHZvaWQgc2V0TGF5ZXIoU3RyaW5nIHdpbmRvd05hbWUsIGludCBsYXllcikge30KLSAgICAgICAgZGVmYXVsdCB2b2lkIHNldFBvc2l0aW9uKFN0cmluZyB3aW5kb3dOYW1lLCBmbG9hdCB4LCBmbG9hdCB5KSB7fQotICAgICAgICBkZWZhdWx0IHZvaWQgc2V0U2l6ZShTdHJpbmcgd2lkbm93TmFtZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7fQotICAgICAgICBkZWZhdWx0IHZvaWQgc2V0TGF5ZXJTdGFjayhTdHJpbmcgd2luZG93TmFtZSwgaW50IGxheWVyU3RhY2spIHt9Ci0gICAgICAgIGRlZmF1bHQgdm9pZCBzZXRNYXRyaXgoU3RyaW5nIHdpbmRvd05hbWUsIGZsb2F0IGRzZHgsIGZsb2F0IGR0ZHgsIGZsb2F0IGRzZHksIGZsb2F0IGR0ZHkpIHt9Ci0gICAgICAgIGRlZmF1bHQgdm9pZCBzZXRDcm9wKFN0cmluZyB3aW5kb3dOYW1lLCBSZWN0YW5nbGUuRmxvYXQgY3JvcCkge30KLSAgICAgICAgZGVmYXVsdCB2b2lkIHNldEZpbmFsQ3JvcChTdHJpbmcgd2luZG93TmFtZSwgUmVjdGFuZ2xlLkZsb2F0IGZpbmFsQ3JvcCkge30KLSAgICAgICAgZGVmYXVsdCB2b2lkIGhpZGUoU3RyaW5nIHdpbmRvd05hbWUpIHt9Ci0gICAgICAgIGRlZmF1bHQgdm9pZCBzaG93KFN0cmluZyB3aW5kb3dOYW1lKSB7fQotICAgICAgICBkZWZhdWx0IHZvaWQgc2V0R2VvbWV0cnlBcHBsaWVzV2l0aFJlc2l6ZShTdHJpbmcgd2luZG93TmFtZSkge30KLSAgICAgICAgZGVmYXVsdCB2b2lkIG9wZW5UcmFuc2FjdGlvbigpIHt9Ci0gICAgICAgIGRlZmF1bHQgdm9pZCBjbG9zZVRyYW5zYWN0aW9uKCkge30KLSAgICB9OwotCi0gICAgZW51bSBTdGF0ZSB7Ci0gICAgICAgIENNRCwKLSAgICAgICAgU0VUX0FMUEhBLAotICAgICAgICBTRVRfTEFZRVIsCi0gICAgICAgIFNFVF9QT1NJVElPTiwKLSAgICAgICAgU0VUX1NJWkUsCi0gICAgICAgIFNFVF9DUk9QLAotICAgICAgICBTRVRfRklOQUxfQ1JPUCwKLSAgICAgICAgU0VUX0xBWUVSX1NUQUNLLAotICAgICAgICBTRVRfTUFUUklYLAotICAgICAgICBISURFLAotICAgICAgICBTSE9XLAotICAgICAgICBHRU9NRVRSWV9BUFBMSUVTX1dJVEhfUkVTSVpFCi0gICAgfTsKLQotICAgIFN1cmZhY2VUcmFjZVJlY2VpdmVyKFN1cmZhY2VPYnNlcnZlciBvYnNlcnZlcikgewotICAgICAgICBtT2JzZXJ2ZXIgPSBvYnNlcnZlcjsKLSAgICB9Ci0KLSAgICAvLyBSZXNldCBzdGF0ZSBhbmQgcHJlcGFyZSB0byBhY2NlcHQgYSBuZXcgY29tbWFuZC4KLSAgICB2b2lkIG5leHRDbWQoRGF0YUlucHV0U3RyZWFtIGQpIHsKLSAgICAgICAgbVN0YXRlID0gU3RhdGUuQ01EOwotICAgICAgICBtQ3VycmVudFdpbmRvd05hbWUgPSBudWxsOwotICAgICAgICBtQXJnUG9zaXRpb24gPSAwOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBDb25zdW1lIHRoZSBzaWdpbAotICAgICAgICAgICAgZC5yZWFkQnl0ZSgpOwotICAgICAgICAgICAgZC5yZWFkQnl0ZSgpOwotICAgICAgICAgICAgZC5yZWFkQnl0ZSgpOwotICAgICAgICAgICAgZC5yZWFkQnl0ZSgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nRSgiRXhjZXB0aW9uIGNvbnN1bWluZyBzaWdpbDogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gV2hlbiB0aGUgY29tbWFuZCBwYXJzaW5nIGZ1bmN0aW9ucyBiZWxvdyBhcmUgY2FsbGVkLCB0aGUgd2luZG93IG5hbWUKLSAgICAvLyB3aWxsIGFscmVhZHkgYmUgcGFyc2VkLiBUaGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlc2UgZnVuY3Rpb25zCi0gICAgLy8gaXMgdG8gcGFyc2Ugb3RoZXIgYXJndW1lbnRzIDEgYnkgMSBhbmQgYWNjdW1sYXRlIHRoZW0gdW50aWwgdGhlIGFwcHJvcHJpYXRlIG51bWJlcgotICAgIC8vIGlzIHJlYWNoZWQuIEF0IHRoYXQgcG9pbnQgdGhlIHBhcnNlciBzaG91bGQgZW1pdCBhbiBldmVudCB0byB0aGUgb2JzZXJ2ZXIgYW5kCi0gICAgLy8gY2FsbCBuZXh0Q21kCi0gICAgdm9pZCBwYXJzZUFscGhhKERhdGFJbnB1dFN0cmVhbSBkKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBmbG9hdCBhbHBoYSA9IGQucmVhZEZsb2F0KCk7Ci0gICAgICAgIG1PYnNlcnZlci5zZXRBbHBoYShtQ3VycmVudFdpbmRvd05hbWUsIGFscGhhKTsKLSAgICAgICAgbmV4dENtZChkKTsKLSAgICB9Ci0KLSAgICB2b2lkIHBhcnNlTGF5ZXIoRGF0YUlucHV0U3RyZWFtIGQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBsYXllciA9IGQucmVhZEludCgpOwotICAgICAgICBtT2JzZXJ2ZXIuc2V0TGF5ZXIobUN1cnJlbnRXaW5kb3dOYW1lLCBsYXllcik7Ci0gICAgICAgIG5leHRDbWQoZCk7Ci0gICAgfQotCi0gICAgdm9pZCBwYXJzZVBvc2l0aW9uKERhdGFJbnB1dFN0cmVhbSBkKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBtVG1wRmxvYXRzW21BcmdQb3NpdGlvbl0gPSBkLnJlYWRGbG9hdCgpOwotICAgICAgICBtQXJnUG9zaXRpb24rKzsKLSAgICAgICAgaWYgKG1BcmdQb3NpdGlvbiA9PSAyKSAgewotICAgICAgICAgICAgbU9ic2VydmVyLnNldFBvc2l0aW9uKG1DdXJyZW50V2luZG93TmFtZSwgbVRtcEZsb2F0c1swXSwgbVRtcEZsb2F0c1sxXSk7Ci0gICAgICAgICAgICBuZXh0Q21kKGQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBwYXJzZVNpemUoRGF0YUlucHV0U3RyZWFtIGQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIG1UbXBJbnRzW21BcmdQb3NpdGlvbl0gPSBkLnJlYWRJbnQoKTsKLSAgICAgICAgbUFyZ1Bvc2l0aW9uKys7Ci0gICAgICAgIGlmIChtQXJnUG9zaXRpb24gPT0gMikgewotICAgICAgICAgICAgbU9ic2VydmVyLnNldFNpemUobUN1cnJlbnRXaW5kb3dOYW1lLCBtVG1wSW50c1swXSwgbVRtcEludHNbMV0pOwotICAgICAgICAgICAgbmV4dENtZChkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIENhcmVmdWwgQW5kcm9pZCByZWN0YW5nbGUgcmVwIGlzIHRvcC1sZWZ0LXJpZ2h0LWJvdHRvbSBhd3QgaXMgdG9wLWxlZnQtd2lkdGgtaGVpZ2h0Ci0gICAgdm9pZCBwYXJzZUNyb3AoRGF0YUlucHV0U3RyZWFtIGQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIG1UbXBGbG9hdHNbbUFyZ1Bvc2l0aW9uXSA9IGQucmVhZEZsb2F0KCk7Ci0gICAgICAgIG1BcmdQb3NpdGlvbisrOwotICAgICAgICBpZiAobUFyZ1Bvc2l0aW9uID09IDQpIHsKLSAgICAgICAgICAgIG1UbXBSZWN0LnNldFJlY3QobVRtcEZsb2F0c1swXSwgbVRtcEZsb2F0c1sxXSwgbVRtcEZsb2F0c1syXS1tVG1wRmxvYXRzWzBdLAotICAgICAgICAgICAgICAgICAgICBtVG1wRmxvYXRzWzNdLW1UbXBGbG9hdHNbMV0pOwotICAgICAgICAgICAgbU9ic2VydmVyLnNldENyb3AobUN1cnJlbnRXaW5kb3dOYW1lLCBtVG1wUmVjdCk7Ci0gICAgICAgICAgICBuZXh0Q21kKGQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBwYXJzZUZpbmFsQ3JvcChEYXRhSW5wdXRTdHJlYW0gZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgbVRtcEZsb2F0c1ttQXJnUG9zaXRpb25dID0gZC5yZWFkSW50KCk7Ci0gICAgICAgIG1BcmdQb3NpdGlvbisrOwotICAgICAgICBpZiAobUFyZ1Bvc2l0aW9uID09IDQpIHsKLSAgICAgICAgICAgIG1UbXBSZWN0LnNldFJlY3QobVRtcEZsb2F0c1swXSwgbVRtcEZsb2F0c1sxXSwgbVRtcEZsb2F0c1syXS1tVG1wRmxvYXRzWzBdLAotICAgICAgICAgICAgICAgICAgICBtVG1wRmxvYXRzWzNdLW1UbXBGbG9hdHNbMV0pOwotICAgICAgICAgICAgbU9ic2VydmVyLnNldEZpbmFsQ3JvcChtQ3VycmVudFdpbmRvd05hbWUsIG1UbXBSZWN0KTsKLSAgICAgICAgICAgIG5leHRDbWQoZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHBhcnNlTGF5ZXJTdGFjayhEYXRhSW5wdXRTdHJlYW0gZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IGxheWVyU3RhY2sgPSBkLnJlYWRJbnQoKTsKLSAgICAgICAgbU9ic2VydmVyLnNldExheWVyU3RhY2sobUN1cnJlbnRXaW5kb3dOYW1lLCBsYXllclN0YWNrKTsKLSAgICAgICAgbmV4dENtZChkKTsKLSAgICB9Ci0KLSAgICB2b2lkIHBhcnNlU2V0TWF0cml4KERhdGFJbnB1dFN0cmVhbSBkKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBtVG1wRmxvYXRzW21BcmdQb3NpdGlvbl0gPSBkLnJlYWRGbG9hdCgpOwotICAgICAgICBtQXJnUG9zaXRpb24rKzsKLSAgICAgICAgaWYgKG1BcmdQb3NpdGlvbiA9PSA0KSB7Ci0gICAgICAgICAgICBtT2JzZXJ2ZXIuc2V0TWF0cml4KG1DdXJyZW50V2luZG93TmFtZSwgbVRtcEZsb2F0c1swXSwKLSAgICAgICAgICAgICAgICAgICAgbVRtcEZsb2F0c1sxXSwgbVRtcEZsb2F0c1syXSwgbVRtcEZsb2F0c1szXSk7Ci0gICAgICAgICAgICBuZXh0Q21kKGQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBwYXJzZUhpZGUoRGF0YUlucHV0U3RyZWFtIGQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIG1PYnNlcnZlci5oaWRlKG1DdXJyZW50V2luZG93TmFtZSk7Ci0gICAgICAgIG5leHRDbWQoZCk7Ci0gICAgfQotCi0gICAgdm9pZCBwYXJzZVNob3coRGF0YUlucHV0U3RyZWFtIGQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIG1PYnNlcnZlci5zaG93KG1DdXJyZW50V2luZG93TmFtZSk7Ci0gICAgICAgIG5leHRDbWQoZCk7Ci0gICAgfQotCi0gICAgdm9pZCBwYXJzZUdlb21ldHJ5QXBwbGllc1dpdGhSZXNpemUoRGF0YUlucHV0U3RyZWFtIGQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIG1PYnNlcnZlci5zZXRHZW9tZXRyeUFwcGxpZXNXaXRoUmVzaXplKG1DdXJyZW50V2luZG93TmFtZSk7Ci0gICAgICAgIG5leHRDbWQoZCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBpbmRleEFmdGVyTGFzdFNpZ2lsKGJ5dGVbXSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0gICAgICAgIGludCBpZHggPSBvZmZzZXQgKyBsZW5ndGggLSAxOwotICAgICAgICBpbnQgc2lnaWxzTmVlZGVkID0gNDsKLSAgICAgICAgYnl0ZSBzaWdpbCA9IChieXRlKTB4ZmM7Ci0gICAgICAgIHdoaWxlIChpZHggPiBvZmZzZXQpIHsKLSAgICAgICAgICAgIGlmIChkYXRhW2lkeF0gPT0gc2lnaWwpIHsKLSAgICAgICAgICAgICAgICBzaWdpbHNOZWVkZWQtLTsKLSAgICAgICAgICAgICAgICBpZiAoc2lnaWxzTmVlZGVkID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlkeCs0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2lnaWxzTmVlZGVkID0gNDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlkeC0tOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpZHg7IC8vIGlkeCA9PSBvZmZzZXQgYXQgdGhpcyBwb2ludAotICAgIH0KLQotICAgIC8vIFRoZSB0cmlja3kgYml0IGhlcmUgaXMgQURCIG1heSBicmVhayB1cCBvdXIgd29yZHMsIGFuZCBub3Qgc2VuZCB1cyBjb21wbGV0ZSBtZXNzYWdlcywKLSAgICAvLyBvciBldmVuIGNvbXBsZXRlIGludGVnZXJzISBUbyBlbnN1cmUgd2UgcHJvY2VzcyB0aGUgZGF0YSBpbiBhcHByb3BjaWF0ZSBjaHVua3MsCi0gICAgLy8gV2UgbG9vayBmb3IgYSBzaWdpbCAoMHhmY2ZjZmNmYykgYW5kIG9ubHkgcHJvY2VzcyBkYXRhIHdoZW4gaXQgZW5kcyBpbiBhcyBpZ2lsLgotICAgIC8vIE90aGVyd2lzZSB3ZSBzYXZlIGl0IGFuZCB3YWl0IHRvIHJlY2VpdmUgYSBzaWdpbCwgdGhlbiBwcm9jZXNzIHRoZSBtZXJnZWQgZGF0YS4KLSAgICBwdWJsaWMgdm9pZCBhZGRPdXRwdXQoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLSAgICAgICAgYnl0ZVtdIGNvbWJpbmVkRGF0YSA9IGRhdGE7Ci0KLSAgICAgICAgLy8gRmlyc3Qgd2UgaGF2ZSB0byBtZXJnZSBhbnkgdW5wcm9jZXNzZWQgYnl0ZXMgZnJvbSB0aGUgbGFzdCBjYWxsIGluIHRvCi0gICAgICAgIC8vIGEgY29tYmluZWQgYXJyYXkuCi0gICAgICAgIGlmIChtVW5wcm9jZXNzZWRCeXRlc0xlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobVVucHJvY2Vzc2VkQnl0ZXMsIDAsIG1GdWxsRGF0YSwgMCwgbVVucHJvY2Vzc2VkQnl0ZXNMZW5ndGgpOwotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShkYXRhLCBvZmZzZXQsIG1GdWxsRGF0YSwgbVVucHJvY2Vzc2VkQnl0ZXNMZW5ndGgsIGxlbmd0aCk7Ci0gICAgICAgICAgICBjb21iaW5lZERhdGEgPSBtRnVsbERhdGE7Ci0gICAgICAgICAgICBsZW5ndGggPSBtVW5wcm9jZXNzZWRCeXRlc0xlbmd0aCArIGxlbmd0aDsKLSAgICAgICAgICAgIG9mZnNldCA9IDA7Ci0gICAgICAgICAgICBtVW5wcm9jZXNzZWRCeXRlc0xlbmd0aCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBOb3cgd2UgZmluZCB0aGUgbGFzdCBzaWdpbCBpbiBvdXIgY29tYmluZWQgYXJyYXkuIEV2ZXJ5dGhpbmcgYmVmb3JlIHRoaXMgaW5kZXggaXMKLSAgICAgICAgLy8gYSBwcm9wZXJseSB0ZXJtaW5hdGVkIG1lc3NhZ2UgcmVhZHkgdG8gYmUgcGFyc2VkLgotICAgICAgICBpbnQgY29tcGxldGVkSW5kZXggPSBpbmRleEFmdGVyTGFzdFNpZ2lsKGNvbWJpbmVkRGF0YSwgb2Zmc2V0LCBsZW5ndGgpOwotICAgICAgICAvLyBJZiB0aGVyZSBhcmUgYW55IGJ5dGVzIGxlZnQgYWZ0ZXIgdGhlIGxhc3Qgc2lnaWwsIHNhdmUgdGhlbSBmb3IgbmV4dCB0aW1lLgotICAgICAgICBpZiAoY29tcGxldGVkSW5kZXggIT0gbGVuZ3RoICsgb2Zmc2V0KSB7Ci0gICAgICAgICAgICBtVW5wcm9jZXNzZWRCeXRlc0xlbmd0aCA9IChsZW5ndGgrb2Zmc2V0KS0oY29tcGxldGVkSW5kZXgpOwotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShjb21iaW5lZERhdGEsIGNvbXBsZXRlZEluZGV4LAotICAgICAgICAgICAgICAgICAgICBtVW5wcm9jZXNzZWRCeXRlcywgMCwgbVVucHJvY2Vzc2VkQnl0ZXNMZW5ndGgpOwotICAgICAgICB9Ci0gICAgICAgIC8vICBJZiB0aGVyZSB3YXMgbm8gc2lnaWwsIHdlIGhhdmUgbm90aGluZyB0byBwcm9jZXNzIHlldC4KLSAgICAgICAgaWYgKGNvbXBsZXRlZEluZGV4IDw9IG9mZnNldCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGIgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oY29tYmluZWREYXRhLCBvZmZzZXQsIGNvbXBsZXRlZEluZGV4IC0gb2Zmc2V0KTsKLSAgICAgICAgRGF0YUlucHV0U3RyZWFtIGQgPSBuZXcgRGF0YUlucHV0U3RyZWFtKGIpOwotCi0gICAgICAgIC8vIFdlIG1heSBub3QgcmVjZWl2ZSBhbiBlbnRpcmUgbWVzc2FnZSBhdCBvbmNlIChmb3IgZXhhbXBsZSB3ZSBtYXkgcmVjZWl2ZQotICAgICAgICAvLyBhIGNvbW1hbmQgd2l0aG91dCBpdHMgYXJndW1lbnRzKSwgc28gd2UgdHJhY2sgb3VyIGN1cnJlbnQgc3RhdGUsIG92ZXIgbXVsdGlwbGUKLSAgICAgICAgLy8gYWRkT3V0cHV0IGNhbGxzLiBXaGVuIHdlIGFyZSBpbiBTdGF0ZS5DTUQgaXQgbWVhbnMgd2UgbmV4dCBleHBlY3QgYSBuZXcgY29tbWFuZC4KLSAgICAgICAgLy8gSWYgd2UgYXJlIG5vdCBleHBlY3RpbmcgYSBjb21tYW5kLCB0aGVuIGFsbCBjb21tYW5kcyB3aXRoIGFyZ3VtZW50cywgYmVnaW4gd2l0aAotICAgICAgICAvLyBhIHdpbmRvdyBuYW1lLiBPbmNlIHdlIGhhdmUgdGhlIHdpbmRvdyBuYW1lLCBpbmRpdmlkdWFsIHBhcnNlQWxwaGEsCi0gICAgICAgIC8vIHBhcnNlTGF5ZXIsIGV0Yy4uLnN0YXRlbWVudHMgd2lsbCBwYXJzZSBjb21tYW5kIGFyZ3VtZW50cyBvbmUgYXQgYSB0aW1lLiBPbmNlCi0gICAgICAgIC8vIHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgb2YgYXJndW1lbnRzIGlzIGNvbGxlY3RlZCB0aGUgb2JzZXJ2ZXIgd2lsbCBiZSBpbnZva2VkCi0gICAgICAgIC8vIGFuZCB0aGUgc3RhdGUgcmVzZXQuIEZvciBjb21tYW5kcyB3aGljaCBoYXZlIG5vIGFyZ3VtZW50cyAoZS5nLiBvcGVuL2Nsb3NlIHRyYW5zYWN0aW9uKSwKLSAgICAgICAgLy8gcGFyc2VDbWQgY2FuIGVtaXQgdGhlIG9ic2VydmVyIGV2ZW50IGFuZCBjYWxsIG5leHRDbWQoKSByaWdodCBhd2F5LgotICAgICAgICB0cnkgewotICAgICAgICAgICAgd2hpbGUgKGIuYXZhaWxhYmxlKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBTdGF0ZS5DTUQgJiYgbUN1cnJlbnRXaW5kb3dOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRXaW5kb3dOYW1lID0gZC5yZWFkVVRGKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChiLmF2YWlsYWJsZSgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzd2l0Y2ggKG1TdGF0ZSkgewotICAgICAgICAgICAgICAgIGNhc2UgQ01EOiB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbWQgPSBkLnJlYWRVVEYoKTsKLSAgICAgICAgICAgICAgICAgICAgcGFyc2VDbWQoZCwgY21kKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgU0VUX0FMUEhBOiB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcnNlQWxwaGEoZCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlIFNFVF9MQVlFUjogewotICAgICAgICAgICAgICAgICAgICBwYXJzZUxheWVyKGQpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSBTRVRfUE9TSVRJT046IHsKLSAgICAgICAgICAgICAgICAgICAgcGFyc2VQb3NpdGlvbihkKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgU0VUX1NJWkU6IHsKLSAgICAgICAgICAgICAgICAgICAgcGFyc2VTaXplKGQpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSBTRVRfQ1JPUDogewotICAgICAgICAgICAgICAgICAgICBwYXJzZUNyb3AoZCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlIFNFVF9GSU5BTF9DUk9QOiB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcnNlRmluYWxDcm9wKGQpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSBTRVRfTEFZRVJfU1RBQ0s6IHsKLSAgICAgICAgICAgICAgICAgICAgcGFyc2VMYXllclN0YWNrKGQpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSBTRVRfTUFUUklYOiB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcnNlU2V0TWF0cml4KGQpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSBISURFOiB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcnNlSGlkZShkKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgU0hPVzogewotICAgICAgICAgICAgICAgICAgICBwYXJzZVNob3coZCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlIEdFT01FVFJZX0FQUExJRVNfV0lUSF9SRVNJWkU6IHsKLSAgICAgICAgICAgICAgICAgICAgcGFyc2VHZW9tZXRyeUFwcGxpZXNXaXRoUmVzaXplKGQpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nRSgiRXJyb3IgaW4gc3VyZmFjZSB0cmFjZSByZWNlaXZlcjogIiArIGUudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHBhcnNlQ21kKERhdGFJbnB1dFN0cmVhbSBkLCBTdHJpbmcgY21kKSB7Ci0gICAgICAgIHN3aXRjaCAoY21kKSB7Ci0gICAgICAgIGNhc2UgIkFscGhhIjoKLSAgICAgICAgICAgIG1TdGF0ZSA9IFN0YXRlLlNFVF9BTFBIQTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICJMYXllciI6Ci0gICAgICAgICAgICBtU3RhdGUgPSBTdGF0ZS5TRVRfTEFZRVI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAiUG9zaXRpb24iOgotICAgICAgICAgICAgbVN0YXRlID0gU3RhdGUuU0VUX1BPU0lUSU9OOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgIlNpemUiOgotICAgICAgICAgICAgbVN0YXRlID0gU3RhdGUuU0VUX1NJWkU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAiQ3JvcCI6Ci0gICAgICAgICAgICBtU3RhdGUgPSBTdGF0ZS5TRVRfQ1JPUDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICJGaW5hbENyb3AiOgotICAgICAgICAgICAgbVN0YXRlID0gU3RhdGUuU0VUX0ZJTkFMX0NST1A7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAiTGF5ZXJTdGFjayI6Ci0gICAgICAgICAgICBtU3RhdGUgPSBTdGF0ZS5TRVRfTEFZRVJfU1RBQ0s7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAiTWF0cml4IjoKLSAgICAgICAgICAgIG1TdGF0ZSA9IFN0YXRlLlNFVF9NQVRSSVg7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAiSGlkZSI6Ci0gICAgICAgICAgICBtU3RhdGUgPSBTdGF0ZS5ISURFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgIlNob3ciOgotICAgICAgICAgICAgbVN0YXRlID0gU3RhdGUuU0hPVzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICJHZW9tZXRyeUFwcGxpZXNXaXRoUmVzaXplIjoKLSAgICAgICAgICAgIG1TdGF0ZSA9IFN0YXRlLkdFT01FVFJZX0FQUExJRVNfV0lUSF9SRVNJWkU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAiT3BlblRyYW5zYWN0aW9uIjoKLSAgICAgICAgICAgIG1PYnNlcnZlci5vcGVuVHJhbnNhY3Rpb24oKTsKLSAgICAgICAgICAgIG5leHRDbWQoZCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAiQ2xvc2VUcmFuc2FjdGlvbiI6Ci0gICAgICAgICAgICBtT2JzZXJ2ZXIuY2xvc2VUcmFuc2FjdGlvbigpOwotICAgICAgICAgICAgbmV4dENtZChkKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQXNzZXJ0LmZhaWwoIlVuZXhwZWN0ZWQgc3VyZmFjZSBjb21tYW5kOiAiICsgY21kKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZmx1c2goKSB7Ci0gICAgfQotCi0gICAgdm9pZCBjYW5jZWwoKSB7Ci0gICAgICAgIG1DYW5jZWxsZWQgPSB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzQ2FuY2VsbGVkKCkgewotICAgICAgICByZXR1cm4gbUNhbmNlbGxlZDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci91dGlsL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvV2luZG93TWFuYWdlclN0YXRlLmphdmEgYi9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci91dGlsL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvV2luZG93TWFuYWdlclN0YXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMTJhMTQuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvdXRpbC9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL1dpbmRvd01hbmFnZXJTdGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuc2VydmVyLmN0czsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5jdHMuQWN0aXZpdHlBbmRXaW5kb3dNYW5hZ2Vyc1N0YXRlLkRFRkFVTFRfRElTUExBWV9JRDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuY3RzLlN0YXRlTG9nZ2VyLmxvZzsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuY3RzLlN0YXRlTG9nZ2VyLmxvZ0U7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuQ29sbGVjdGluZ091dHB1dFJlY2VpdmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5EZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLklUZXN0RGV2aWNlOwotCi1pbXBvcnQgamF2YS5hd3QuKjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1wdWJsaWMgY2xhc3MgV2luZG93TWFuYWdlclN0YXRlIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQU5TSVRfQUNUSVZJVFlfT1BFTiA9ICJUUkFOU0lUX0FDVElWSVRZX09QRU4iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQU5TSVRfQUNUSVZJVFlfQ0xPU0UgPSAiVFJBTlNJVF9BQ1RJVklUWV9DTE9TRSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBTlNJVF9UQVNLX09QRU4gPSAiVFJBTlNJVF9UQVNLX09QRU4iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQU5TSVRfVEFTS19DTE9TRSA9ICJUUkFOU0lUX1RBU0tfQ0xPU0UiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBTlNJVF9XQUxMUEFQRVJfT1BFTiA9ICJUUkFOU0lUX1dBTExQQVBFUl9PUEVOIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFOU0lUX1dBTExQQVBFUl9DTE9TRSA9ICJUUkFOU0lUX1dBTExQQVBFUl9DTE9TRSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBTlNJVF9XQUxMUEFQRVJfSU5UUkFfT1BFTiA9ICJUUkFOU0lUX1dBTExQQVBFUl9JTlRSQV9PUEVOIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFOU0lUX1dBTExQQVBFUl9JTlRSQV9DTE9TRSA9ICJUUkFOU0lUX1dBTExQQVBFUl9JTlRSQV9DTE9TRSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFOU0lUX0tFWUdVQVJEX0dPSU5HX0FXQVkgPSAiVFJBTlNJVF9LRVlHVUFSRF9HT0lOR19BV0FZIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFOU0lUX0tFWUdVQVJEX0dPSU5HX0FXQVlfT05fV0FMTFBBUEVSID0KLSAgICAgICAgICAgICJUUkFOU0lUX0tFWUdVQVJEX0dPSU5HX0FXQVlfT05fV0FMTFBBUEVSIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFOU0lUX0tFWUdVQVJEX09DQ0xVREUgPSAiVFJBTlNJVF9LRVlHVUFSRF9PQ0NMVURFIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFOU0lUX0tFWUdVQVJEX1VOT0NDTFVERSA9ICJUUkFOU0lUX0tFWUdVQVJEX1VOT0NDTFVERSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBfU1RBVEVfSURMRSA9ICJBUFBfU1RBVEVfSURMRSI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFVNUFNZU19XSU5ET1cgPSAiZHVtcHN5cyB3aW5kb3cgLWEiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBzV2luZG93UGF0dGVybiA9Ci0gICAgICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoIldpbmRvdyAjKFxcZCspIFdpbmRvd1xceyhbMC05YS1mQS1GXSspIHUoXFxkKykgKC4rKVxcfVxcOiIpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gc1N0YXJ0aW5nV2luZG93UGF0dGVybiA9Ci0gICAgICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoIldpbmRvdyAjKFxcZCspIFdpbmRvd1xceyhbMC05YS1mQS1GXSspIHUoXFxkKykgU3RhcnRpbmcgKC4rKVxcfVxcOiIpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gc0V4aXRpbmdXaW5kb3dQYXR0ZXJuID0KLSAgICAgICAgICAgIFBhdHRlcm4uY29tcGlsZSgiV2luZG93ICMoXFxkKykgV2luZG93XFx7KFswLTlhLWZBLUZdKykgdShcXGQrKSAoLispIEVYSVRJTkdcXH1cXDoiKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHNEZWJ1Z2dlcldpbmRvd1BhdHRlcm4gPQotICAgICAgICAgICAgUGF0dGVybi5jb21waWxlKCJXaW5kb3cgIyhcXGQrKSBXaW5kb3dcXHsoWzAtOWEtZkEtRl0rKSB1KFxcZCspIFdhaXRpbmcgRm9yIERlYnVnZ2VyOiAoLispXFx9XFw6Iik7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHNGb2N1c2VkV2luZG93UGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgKLSAgICAgICAgICAgICJtQ3VycmVudEZvY3VzPVdpbmRvd1xceyhbMC05YS1mQS1GXSspIHUoXFxkKykgKFxcUyspXFx9Iik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBzQXBwRXJyb3JGb2N1c2VkV2luZG93UGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgKLSAgICAgICAgICAgICJtQ3VycmVudEZvY3VzPVdpbmRvd1xceyhbMC05YS1mQS1GXSspIHUoXFxkKykgQXBwbGljYXRpb24gRXJyb3JcXDogKFxcUyspXFx9Iik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBzV2FpdGluZ0ZvckRlYnVnZ2VyRm9jdXNlZFdpbmRvd1BhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoCi0gICAgICAgICAgICAibUN1cnJlbnRGb2N1cz1XaW5kb3dcXHsoWzAtOWEtZkEtRl0rKSB1KFxcZCspIFdhaXRpbmcgRm9yIERlYnVnZ2VyXFw6IChcXFMrKVxcfSIpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBzRm9jdXNlZEFwcFBhdHRlcm4gPQotICAgICAgICAgICAgUGF0dGVybi5jb21waWxlKCJtRm9jdXNlZEFwcD1BcHBXaW5kb3dUb2tlblxceyguKykgdG9rZW49VG9rZW5cXHsoLispICIKLSAgICAgICAgICAgICAgICAgICAgKyAiQWN0aXZpdHlSZWNvcmRcXHsoLispIHUoXFxkKykgKFxcUyspIChcXFMrKSIpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gc1N0YWJsZUJvdW5kc1BhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoCi0gICAgICAgICAgICAibVN0YWJsZT1cXCgoXFxkKyksKFxcZCspXFwpLVxcKChcXGQrKSwoXFxkKylcXCkiKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHNEZWZhdWx0UGlubmVkU3RhY2tCb3VuZHNQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKAotICAgICAgICAgICAgImRlZmF1bHRCb3VuZHM9XFxbKFxcZCspLChcXGQrKVxcXVxcWyhcXGQrKSwoXFxkKylcXF0iKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHNQaW5uZWRTdGFja01vdmVtZW50Qm91bmRzUGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgKLSAgICAgICAgICAgICJtb3ZlbWVudEJvdW5kcz1cXFsoXFxkKyksKFxcZCspXFxdXFxbKFxcZCspLChcXGQrKVxcXSIpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gc1JvdGF0aW9uUGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgKLSAgICAgICAgICAgICJtUm90YXRpb249KFxcZCkuKiIpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gc0xhc3RPcmllbnRhdGlvblBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoCi0gICAgICAgICAgICAiLiptTGFzdE9yaWVudGF0aW9uPShcXGQpIik7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHNMYXN0QXBwVHJhbnNpdGlvblBhdHRlcm4gPQotICAgICAgICAgICAgUGF0dGVybi5jb21waWxlKCJtTGFzdFVzZWRBcHBUcmFuc2l0aW9uPSguKykiKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHNBcHBUcmFuc2l0aW9uU3RhdGVQYXR0ZXJuID0KLSAgICAgICAgICAgIFBhdHRlcm4uY29tcGlsZSgibUFwcFRyYW5zaXRpb25TdGF0ZT0oLispIik7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHNTdGFja0lkUGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgibVN0YWNrSWQ9KFxcZCspIik7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHNJbnB1dE1ldGhvZFdpbmRvd1BhdHRlcm4gPQotICAgICAgICAgICAgUGF0dGVybi5jb21waWxlKCJtSW5wdXRNZXRob2RXaW5kb3c9V2luZG93XFx7KFswLTlhLWZBLUZdKykgdVxcZCsgLitcXH0uKiIpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBzRGlzcGxheUlkUGF0dGVybiA9Ci0gICAgICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoIkRpc3BsYXk6IG1EaXNwbGF5SWQ9KFxcZCspIik7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHNEaXNwbGF5RnJvemVuUGF0dGVybiA9Ci0gICAgICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoIm1EaXNwbGF5RnJvemVuPShbYS16XSopIC4qIik7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHNEb2NrZWRTdGFja01pbmltaXplZFBhdHRlcm4gPQotICAgICAgICAgICAgUGF0dGVybi5jb21waWxlKCJtTWluaW1pemVkRG9jaz0oW2Etel0qKSIpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybltdIHNFeHRyYWN0U3RhY2tFeGl0UGF0dGVybnMgPSB7Ci0gICAgICAgICAgICBzU3RhY2tJZFBhdHRlcm4sIHNXaW5kb3dQYXR0ZXJuLCBzU3RhcnRpbmdXaW5kb3dQYXR0ZXJuLCBzRXhpdGluZ1dpbmRvd1BhdHRlcm4sCi0gICAgICAgICAgICBzRGVidWdnZXJXaW5kb3dQYXR0ZXJuLCBzRm9jdXNlZFdpbmRvd1BhdHRlcm4sIHNBcHBFcnJvckZvY3VzZWRXaW5kb3dQYXR0ZXJuLAotICAgICAgICAgICAgc1dhaXRpbmdGb3JEZWJ1Z2dlckZvY3VzZWRXaW5kb3dQYXR0ZXJuLAotICAgICAgICAgICAgc0ZvY3VzZWRBcHBQYXR0ZXJuLCBzTGFzdEFwcFRyYW5zaXRpb25QYXR0ZXJuLCBzRGVmYXVsdFBpbm5lZFN0YWNrQm91bmRzUGF0dGVybiwKLSAgICAgICAgICAgIHNQaW5uZWRTdGFja01vdmVtZW50Qm91bmRzUGF0dGVybiwgc0Rpc3BsYXlJZFBhdHRlcm4sIHNEb2NrZWRTdGFja01pbmltaXplZFBhdHRlcm59OwotCi0gICAgLy8gV2luZG93cyBpbiB6LW9yZGVyIHdpdGggdGhlIHRvcCBtb3N0IGF0IHRoZSBmcm9udCBvZiB0aGUgbGlzdC4KLSAgICBwcml2YXRlIExpc3Q8V2luZG93U3RhdGU+IG1XaW5kb3dTdGF0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgLy8gU3RhY2tzIGluIHotb3JkZXIgd2l0aCB0aGUgdG9wIG1vc3QgYXQgdGhlIGZyb250IG9mIHRoZSBsaXN0LCBzdGFydGluZyB3aXRoIHByaW1hcnkgZGlzcGxheS4KLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8V2luZG93U3RhY2s+IG1TdGFja3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgLy8gU3RhY2tzIG9uIGFsbCBhdHRhY2hlZCBkaXNwbGF5cywgaW4gei1vcmRlciB3aXRoIHRoZSB0b3AgbW9zdCBhdCB0aGUgZnJvbnQgb2YgdGhlIGxpc3QuCi0gICAgcHJpdmF0ZSBmaW5hbCBNYXA8SW50ZWdlciwgTGlzdDxXaW5kb3dTdGFjaz4+IG1EaXNwbGF5U3RhY2tzCi0gICAgICAgICAgICA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICBwcml2YXRlIExpc3Q8RGlzcGxheT4gbURpc3BsYXlzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHByaXZhdGUgU3RyaW5nIG1Gb2N1c2VkV2luZG93ID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyBtRm9jdXNlZEFwcCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbUxhc3RUcmFuc2l0aW9uID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyBtQXBwVHJhbnNpdGlvblN0YXRlID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyBtSW5wdXRNZXRob2RXaW5kb3dBcHBUb2tlbiA9IG51bGw7Ci0gICAgcHJpdmF0ZSBSZWN0YW5nbGUgbVN0YWJsZUJvdW5kcyA9IG5ldyBSZWN0YW5nbGUoKTsKLSAgICBwcml2YXRlIGZpbmFsIFJlY3RhbmdsZSBtRGVmYXVsdFBpbm5lZFN0YWNrQm91bmRzID0gbmV3IFJlY3RhbmdsZSgpOwotICAgIHByaXZhdGUgZmluYWwgUmVjdGFuZ2xlIG1QaW5uZWRTdGFja01vdmVtZW50Qm91bmRzID0gbmV3IFJlY3RhbmdsZSgpOwotICAgIHByaXZhdGUgZmluYWwgTGlua2VkTGlzdDxTdHJpbmc+IG1TeXNEdW1wID0gbmV3IExpbmtlZExpc3QoKTsKLSAgICBwcml2YXRlIGludCBtUm90YXRpb247Ci0gICAgcHJpdmF0ZSBpbnQgbUxhc3RPcmllbnRhdGlvbjsKLSAgICBwcml2YXRlIGJvb2xlYW4gbURpc3BsYXlGcm96ZW47Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc0RvY2tlZFN0YWNrTWluaW1pemVkOwotCi0gICAgdm9pZCBjb21wdXRlU3RhdGUoSVRlc3REZXZpY2UgZGV2aWNlKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gSXQgaXMgcG9zc2libGUgdGhlIHN5c3RlbSBpcyBpbiB0aGUgbWlkZGxlIG9mIHRyYW5zaXRpb24gdG8gdGhlIHJpZ2h0IHN0YXRlIHdoZW4gd2UgZ2V0Ci0gICAgICAgIC8vIHRoZSBkdW1wLiBXZSB0cnkgYSBmZXcgdGltZXMgdG8gZ2V0IHRoZSBpbmZvcm1hdGlvbiB3ZSBuZWVkIGJlZm9yZSBnaXZpbmcgdXAuCi0gICAgICAgIGludCByZXRyaWVzTGVmdCA9IDM7Ci0gICAgICAgIGJvb2xlYW4gcmV0cnkgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIGR1bXAgPSBudWxsOwotCi0gICAgICAgIGxvZygiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7Ci0gICAgICAgIGxvZygiICAgICAgV2luZG93TWFuYWdlclN0YXRlICAgICAgIik7Ci0gICAgICAgIGxvZygiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIGlmIChyZXRyeSkgewotICAgICAgICAgICAgICAgIGxvZygiKioqSW5jb21wbGV0ZSBXTSBzdGF0ZS4gUmV0cnlpbmcuLi4iKTsKLSAgICAgICAgICAgICAgICAvLyBXYWl0IGhhbGYgYSBzZWNvbmQgYmV0d2VlbiByZXRyaWVzIGZvciB3aW5kb3cgbWFuYWdlciB0byBmaW5pc2ggdHJhbnNpdGlvbmluZy4uLgotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCg1MDApOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFdlbGwgSSBndWVzcyB3ZSBhcmUgbm90IHdhaXRpbmcuLi4KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZpbmFsIENvbGxlY3RpbmdPdXRwdXRSZWNlaXZlciBvdXRwdXRSZWNlaXZlciA9IG5ldyBDb2xsZWN0aW5nT3V0cHV0UmVjZWl2ZXIoKTsKLSAgICAgICAgICAgIGRldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKERVTVBTWVNfV0lORE9XLCBvdXRwdXRSZWNlaXZlcik7Ci0gICAgICAgICAgICBkdW1wID0gb3V0cHV0UmVjZWl2ZXIuZ2V0T3V0cHV0KCk7Ci0gICAgICAgICAgICBwYXJzZVN5c0R1bXAoZHVtcCk7Ci0KLSAgICAgICAgICAgIHJldHJ5ID0gbVdpbmRvd1N0YXRlcy5pc0VtcHR5KCkgfHwgbUZvY3VzZWRBcHAgPT0gbnVsbDsKLSAgICAgICAgfSB3aGlsZSAocmV0cnkgJiYgcmV0cmllc0xlZnQtLSA+IDApOwotCi0gICAgICAgIGlmIChyZXRyeSkgewotICAgICAgICAgICAgbG9nKGR1bXApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1XaW5kb3dTdGF0ZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBsb2dFKCJObyBXaW5kb3dzIGZvdW5kLi4uIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1Gb2N1c2VkV2luZG93ID09IG51bGwpIHsKLSAgICAgICAgICAgIGxvZ0UoIk5vIEZvY3VzZWQgV2luZG93Li4uIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1Gb2N1c2VkQXBwID09IG51bGwpIHsKLSAgICAgICAgICAgIGxvZ0UoIk5vIEZvY3VzZWQgQXBwLi4uIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcGFyc2VTeXNEdW1wKFN0cmluZyBzeXNEdW1wKSB7Ci0gICAgICAgIHJlc2V0KCk7Ci0KLSAgICAgICAgQ29sbGVjdGlvbnMuYWRkQWxsKG1TeXNEdW1wLCBzeXNEdW1wLnNwbGl0KCJcXG4iKSk7Ci0KLSAgICAgICAgaW50IGN1cnJlbnREaXNwbGF5SWQgPSBERUZBVUxUX0RJU1BMQVlfSUQ7Ci0gICAgICAgIHdoaWxlICghbVN5c0R1bXAuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPQotICAgICAgICAgICAgICAgICAgICBEaXNwbGF5LmNyZWF0ZShtU3lzRHVtcCwgc0V4dHJhY3RTdGFja0V4aXRQYXR0ZXJucyk7Ci0gICAgICAgICAgICBpZiAoZGlzcGxheSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9nKGRpc3BsYXkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgbURpc3BsYXlzLmFkZChkaXNwbGF5KTsKLSAgICAgICAgICAgICAgICBjdXJyZW50RGlzcGxheUlkID0gZGlzcGxheS5tRGlzcGxheUlkOwotICAgICAgICAgICAgICAgIG1EaXNwbGF5U3RhY2tzLnB1dChjdXJyZW50RGlzcGxheUlkLCBuZXcgQXJyYXlMaXN0PD4oKSk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZpbmFsIFdpbmRvd1N0YWNrIHN0YWNrID0KLSAgICAgICAgICAgICAgICAgICAgV2luZG93U3RhY2suY3JlYXRlKG1TeXNEdW1wLCBzU3RhY2tJZFBhdHRlcm4sIHNFeHRyYWN0U3RhY2tFeGl0UGF0dGVybnMpOwotCi0gICAgICAgICAgICBpZiAoc3RhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TdGFja3MuYWRkKHN0YWNrKTsKLSAgICAgICAgICAgICAgICBtRGlzcGxheVN0YWNrcy5nZXQoY3VycmVudERpc3BsYXlJZCkuYWRkKHN0YWNrKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICBmaW5hbCBXaW5kb3dTdGF0ZSB3cyA9IFdpbmRvd1N0YXRlLmNyZWF0ZShtU3lzRHVtcCwgc0V4dHJhY3RTdGFja0V4aXRQYXR0ZXJucyk7Ci0gICAgICAgICAgICBpZiAod3MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxvZyh3cy50b1N0cmluZygpKTsKLQotICAgICAgICAgICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBhcmUgaW4gdGhlIG1pZGRsZSBvZiB0cmFuc2l0aW9uaW5nLiBJZiB3ZSBhcmUsIHdlIHdhbnQgdG8KLSAgICAgICAgICAgICAgICAvLyBza2lwIGR1bXBpbmcgdW50aWwgd2luZG93IG1hbmFnZXIgaXMgZG9uZSB0cmFuc2l0aW9uaW5nIHdpbmRvd3MuCi0gICAgICAgICAgICAgICAgaWYgKHdzLmlzU3RhcnRpbmdXaW5kb3coKSkgewotICAgICAgICAgICAgICAgICAgICBsb2coIlNraXBwaW5nIGR1bXAgZHVlIHRvIHN0YXJ0aW5nIHdpbmRvdyB0cmFuc2l0aW9uLi4uIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAod3MuaXNFeGl0aW5nV2luZG93KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKCJTa2lwcGluZyBkdW1wIGR1ZSB0byBleGl0aW5nIHdpbmRvdyB0cmFuc2l0aW9uLi4uIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtV2luZG93U3RhdGVzLmFkZCh3cyk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsaW5lID0gbVN5c0R1bXAucG9wKCkudHJpbSgpOwotCi0gICAgICAgICAgICBNYXRjaGVyIG1hdGNoZXIgPSBzRm9jdXNlZFdpbmRvd1BhdHRlcm4ubWF0Y2hlcihsaW5lKTsKLSAgICAgICAgICAgIGlmIChtYXRjaGVyLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgIGxvZyhsaW5lKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZm9jdXNlZFdpbmRvdyA9IG1hdGNoZXIuZ3JvdXAoMyk7Ci0gICAgICAgICAgICAgICAgbG9nKGZvY3VzZWRXaW5kb3cpOwotICAgICAgICAgICAgICAgIG1Gb2N1c2VkV2luZG93ID0gZm9jdXNlZFdpbmRvdzsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbWF0Y2hlciA9IHNBcHBFcnJvckZvY3VzZWRXaW5kb3dQYXR0ZXJuLm1hdGNoZXIobGluZSk7Ci0gICAgICAgICAgICBpZiAobWF0Y2hlci5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cobGluZSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZvY3VzZWRXaW5kb3cgPSBtYXRjaGVyLmdyb3VwKDMpOwotICAgICAgICAgICAgICAgIGxvZyhmb2N1c2VkV2luZG93KTsKLSAgICAgICAgICAgICAgICBtRm9jdXNlZFdpbmRvdyA9IGZvY3VzZWRXaW5kb3c7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1hdGNoZXIgPSBzV2FpdGluZ0ZvckRlYnVnZ2VyRm9jdXNlZFdpbmRvd1BhdHRlcm4ubWF0Y2hlcihsaW5lKTsKLSAgICAgICAgICAgIGlmIChtYXRjaGVyLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgIGxvZyhsaW5lKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZm9jdXNlZFdpbmRvdyA9IG1hdGNoZXIuZ3JvdXAoMyk7Ci0gICAgICAgICAgICAgICAgbG9nKGZvY3VzZWRXaW5kb3cpOwotICAgICAgICAgICAgICAgIG1Gb2N1c2VkV2luZG93ID0gZm9jdXNlZFdpbmRvdzsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbWF0Y2hlciA9IHNGb2N1c2VkQXBwUGF0dGVybi5tYXRjaGVyKGxpbmUpOwotICAgICAgICAgICAgaWYgKG1hdGNoZXIubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgbG9nKGxpbmUpOwotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmb2N1c2VkQXBwID0gbWF0Y2hlci5ncm91cCg1KTsKLSAgICAgICAgICAgICAgICBsb2coZm9jdXNlZEFwcCk7Ci0gICAgICAgICAgICAgICAgbUZvY3VzZWRBcHAgPSBmb2N1c2VkQXBwOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtYXRjaGVyID0gc0FwcFRyYW5zaXRpb25TdGF0ZVBhdHRlcm4ubWF0Y2hlcihsaW5lKTsKLSAgICAgICAgICAgIGlmIChtYXRjaGVyLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgIGxvZyhsaW5lKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYXBwVHJhbnNpdGlvblN0YXRlID0gbWF0Y2hlci5ncm91cCgxKTsKLSAgICAgICAgICAgICAgICBsb2coYXBwVHJhbnNpdGlvblN0YXRlKTsKLSAgICAgICAgICAgICAgICBtQXBwVHJhbnNpdGlvblN0YXRlID0gYXBwVHJhbnNpdGlvblN0YXRlOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtYXRjaGVyID0gc0xhc3RBcHBUcmFuc2l0aW9uUGF0dGVybi5tYXRjaGVyKGxpbmUpOwotICAgICAgICAgICAgaWYgKG1hdGNoZXIubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgbG9nKGxpbmUpOwotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsYXN0QXBwVHJhbnNpdGlvblBhdHRlcm4gPSBtYXRjaGVyLmdyb3VwKDEpOwotICAgICAgICAgICAgICAgIGxvZyhsYXN0QXBwVHJhbnNpdGlvblBhdHRlcm4pOwotICAgICAgICAgICAgICAgIG1MYXN0VHJhbnNpdGlvbiA9IGxhc3RBcHBUcmFuc2l0aW9uUGF0dGVybjsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbWF0Y2hlciA9IHNTdGFibGVCb3VuZHNQYXR0ZXJuLm1hdGNoZXIobGluZSk7Ci0gICAgICAgICAgICBpZiAobWF0Y2hlci5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cobGluZSk7Ci0gICAgICAgICAgICAgICAgaW50IGxlZnQgPSBJbnRlZ2VyLnBhcnNlSW50KG1hdGNoZXIuZ3JvdXAoMSkpOwotICAgICAgICAgICAgICAgIGludCB0b3AgPSBJbnRlZ2VyLnBhcnNlSW50KG1hdGNoZXIuZ3JvdXAoMikpOwotICAgICAgICAgICAgICAgIGludCByaWdodCA9IEludGVnZXIucGFyc2VJbnQobWF0Y2hlci5ncm91cCgzKSk7Ci0gICAgICAgICAgICAgICAgaW50IGJvdHRvbSA9IEludGVnZXIucGFyc2VJbnQobWF0Y2hlci5ncm91cCg0KSk7Ci0gICAgICAgICAgICAgICAgbVN0YWJsZUJvdW5kcy5zZXRCb3VuZHMobGVmdCwgdG9wLCByaWdodCAtIGxlZnQsIGJvdHRvbSAtIHRvcCk7Ci0gICAgICAgICAgICAgICAgbG9nKG1TdGFibGVCb3VuZHMudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1hdGNoZXIgPSBzRGVmYXVsdFBpbm5lZFN0YWNrQm91bmRzUGF0dGVybi5tYXRjaGVyKGxpbmUpOwotICAgICAgICAgICAgaWYgKG1hdGNoZXIubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgbG9nKGxpbmUpOwotICAgICAgICAgICAgICAgIGludCBsZWZ0ID0gSW50ZWdlci5wYXJzZUludChtYXRjaGVyLmdyb3VwKDEpKTsKLSAgICAgICAgICAgICAgICBpbnQgdG9wID0gSW50ZWdlci5wYXJzZUludChtYXRjaGVyLmdyb3VwKDIpKTsKLSAgICAgICAgICAgICAgICBpbnQgcmlnaHQgPSBJbnRlZ2VyLnBhcnNlSW50KG1hdGNoZXIuZ3JvdXAoMykpOwotICAgICAgICAgICAgICAgIGludCBib3R0b20gPSBJbnRlZ2VyLnBhcnNlSW50KG1hdGNoZXIuZ3JvdXAoNCkpOwotICAgICAgICAgICAgICAgIG1EZWZhdWx0UGlubmVkU3RhY2tCb3VuZHMuc2V0Qm91bmRzKGxlZnQsIHRvcCwgcmlnaHQgLSBsZWZ0LCBib3R0b20gLSB0b3ApOwotICAgICAgICAgICAgICAgIGxvZyhtRGVmYXVsdFBpbm5lZFN0YWNrQm91bmRzLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtYXRjaGVyID0gc1Bpbm5lZFN0YWNrTW92ZW1lbnRCb3VuZHNQYXR0ZXJuLm1hdGNoZXIobGluZSk7Ci0gICAgICAgICAgICBpZiAobWF0Y2hlci5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cobGluZSk7Ci0gICAgICAgICAgICAgICAgaW50IGxlZnQgPSBJbnRlZ2VyLnBhcnNlSW50KG1hdGNoZXIuZ3JvdXAoMSkpOwotICAgICAgICAgICAgICAgIGludCB0b3AgPSBJbnRlZ2VyLnBhcnNlSW50KG1hdGNoZXIuZ3JvdXAoMikpOwotICAgICAgICAgICAgICAgIGludCByaWdodCA9IEludGVnZXIucGFyc2VJbnQobWF0Y2hlci5ncm91cCgzKSk7Ci0gICAgICAgICAgICAgICAgaW50IGJvdHRvbSA9IEludGVnZXIucGFyc2VJbnQobWF0Y2hlci5ncm91cCg0KSk7Ci0gICAgICAgICAgICAgICAgbVBpbm5lZFN0YWNrTW92ZW1lbnRCb3VuZHMuc2V0Qm91bmRzKGxlZnQsIHRvcCwgcmlnaHQgLSBsZWZ0LCBib3R0b20gLSB0b3ApOwotICAgICAgICAgICAgICAgIGxvZyhtUGlubmVkU3RhY2tNb3ZlbWVudEJvdW5kcy50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbWF0Y2hlciA9IHNJbnB1dE1ldGhvZFdpbmRvd1BhdHRlcm4ubWF0Y2hlcihsaW5lKTsKLSAgICAgICAgICAgIGlmIChtYXRjaGVyLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgIGxvZyhsaW5lKTsKLSAgICAgICAgICAgICAgICBtSW5wdXRNZXRob2RXaW5kb3dBcHBUb2tlbiA9IG1hdGNoZXIuZ3JvdXAoMSk7Ci0gICAgICAgICAgICAgICAgbG9nKG1JbnB1dE1ldGhvZFdpbmRvd0FwcFRva2VuKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbWF0Y2hlciA9IHNSb3RhdGlvblBhdHRlcm4ubWF0Y2hlcihsaW5lKTsKLSAgICAgICAgICAgIGlmIChtYXRjaGVyLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgIGxvZyhsaW5lKTsKLSAgICAgICAgICAgICAgICBtUm90YXRpb24gPSBJbnRlZ2VyLnBhcnNlSW50KG1hdGNoZXIuZ3JvdXAoMSkpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtYXRjaGVyID0gc0xhc3RPcmllbnRhdGlvblBhdHRlcm4ubWF0Y2hlcihsaW5lKTsKLSAgICAgICAgICAgIGlmIChtYXRjaGVyLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgIGxvZyhsaW5lKTsKLSAgICAgICAgICAgICAgICBtTGFzdE9yaWVudGF0aW9uID0gSW50ZWdlci5wYXJzZUludChtYXRjaGVyLmdyb3VwKDEpKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbWF0Y2hlciA9IHNEaXNwbGF5RnJvemVuUGF0dGVybi5tYXRjaGVyKGxpbmUpOwotICAgICAgICAgICAgaWYgKG1hdGNoZXIubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgbG9nKGxpbmUpOwotICAgICAgICAgICAgICAgIG1EaXNwbGF5RnJvemVuID0gQm9vbGVhbi5wYXJzZUJvb2xlYW4obWF0Y2hlci5ncm91cCgxKSk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1hdGNoZXIgPSBzRG9ja2VkU3RhY2tNaW5pbWl6ZWRQYXR0ZXJuLm1hdGNoZXIobGluZSk7Ci0gICAgICAgICAgICBpZiAobWF0Y2hlci5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cobGluZSk7Ci0gICAgICAgICAgICAgICAgbUlzRG9ja2VkU3RhY2tNaW5pbWl6ZWQgPSBCb29sZWFuLnBhcnNlQm9vbGVhbihtYXRjaGVyLmdyb3VwKDEpKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgZ2V0TWF0Y2hpbmdXaW5kb3dUb2tlbnMoZmluYWwgU3RyaW5nIHdpbmRvd05hbWUsIExpc3Q8U3RyaW5nPiB0b2tlbkxpc3QpIHsKLSAgICAgICAgdG9rZW5MaXN0LmNsZWFyKCk7Ci0KLSAgICAgICAgZm9yIChXaW5kb3dTdGF0ZSB3cyA6IG1XaW5kb3dTdGF0ZXMpIHsKLSAgICAgICAgICAgIGlmICh3aW5kb3dOYW1lLmVxdWFscyh3cy5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgdG9rZW5MaXN0LmFkZCh3cy5nZXRUb2tlbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgZ2V0TWF0Y2hpbmdWaXNpYmxlV2luZG93U3RhdGUoZmluYWwgU3RyaW5nIHdpbmRvd05hbWUsIExpc3Q8V2luZG93U3RhdGU+IHdpbmRvd0xpc3QpIHsKLSAgICAgICAgd2luZG93TGlzdC5jbGVhcigpOwotICAgICAgICBmb3IgKFdpbmRvd1N0YXRlIHdzIDogbVdpbmRvd1N0YXRlcykgewotICAgICAgICAgICAgaWYgKHdzLmlzU2hvd24oKSAmJiB3aW5kb3dOYW1lLmVxdWFscyh3cy5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgd2luZG93TGlzdC5hZGQod3MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBnZXRQcmVmaXhNYXRjaGluZ1Zpc2libGVXaW5kb3dTdGF0ZShmaW5hbCBTdHJpbmcgd2luZG93TmFtZSwgTGlzdDxXaW5kb3dTdGF0ZT4gd2luZG93TGlzdCkgewotICAgICAgICB3aW5kb3dMaXN0LmNsZWFyKCk7Ci0gICAgICAgIGZvciAoV2luZG93U3RhdGUgd3MgOiBtV2luZG93U3RhdGVzKSB7Ci0gICAgICAgICAgICBpZiAod3MuaXNTaG93bigpICYmIHdzLmdldE5hbWUoKS5zdGFydHNXaXRoKHdpbmRvd05hbWUpKSB7Ci0gICAgICAgICAgICAgICAgd2luZG93TGlzdC5hZGQod3MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgV2luZG93U3RhdGUgZ2V0V2luZG93QnlQYWNrYWdlTmFtZShTdHJpbmcgcGFja2FnZU5hbWUsIGludCB3aW5kb3dUeXBlKSB7Ci0gICAgICAgIGZvciAoV2luZG93U3RhdGUgd3MgOiBtV2luZG93U3RhdGVzKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IHdzLmdldE5hbWUoKTsKLSAgICAgICAgICAgIGlmIChuYW1lID09IG51bGwgfHwgIW5hbWUuY29udGFpbnMocGFja2FnZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAod2luZG93VHlwZSAhPSB3cy5nZXRUeXBlKCkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB3czsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHZvaWQgZ2V0V2luZG93c0J5UGFja2FnZU5hbWUoU3RyaW5nIHBhY2thZ2VOYW1lLCBMaXN0PEludGVnZXI+IHJlc3RyaWN0VG9UeXBlTGlzdCwKLSAgICAgICAgICAgIExpc3Q8V2luZG93U3RhdGU+IG91dFdpbmRvd0xpc3QpIHsKLSAgICAgICAgb3V0V2luZG93TGlzdC5jbGVhcigpOwotICAgICAgICBmb3IgKFdpbmRvd1N0YXRlIHdzIDogbVdpbmRvd1N0YXRlcykgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSB3cy5nZXROYW1lKCk7Ci0gICAgICAgICAgICBpZiAobmFtZSA9PSBudWxsIHx8ICFuYW1lLmNvbnRhaW5zKHBhY2thZ2VOYW1lKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJlc3RyaWN0VG9UeXBlTGlzdCAhPSBudWxsICYmICFyZXN0cmljdFRvVHlwZUxpc3QuY29udGFpbnMod3MuZ2V0VHlwZSgpKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3V0V2luZG93TGlzdC5hZGQod3MpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBzb3J0V2luZG93c0J5TGF5ZXIoTGlzdDxXaW5kb3dTdGF0ZT4gd2luZG93cykgewotICAgICAgICB3aW5kb3dzLnNvcnQoQ29tcGFyYXRvci5jb21wYXJpbmdJbnQoV2luZG93U3RhdGU6OmdldExheWVyKSk7Ci0gICAgfQotCi0gICAgV2luZG93U3RhdGUgZ2V0V2luZG93U3RhdGVGb3JBcHBUb2tlbihTdHJpbmcgYXBwVG9rZW4pIHsKLSAgICAgICAgZm9yIChXaW5kb3dTdGF0ZSB3cyA6IG1XaW5kb3dTdGF0ZXMpIHsKLSAgICAgICAgICAgIGlmICh3cy5nZXRUb2tlbigpLmVxdWFscyhhcHBUb2tlbikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gd3M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgRGlzcGxheSBnZXREaXNwbGF5KGludCBkaXNwbGF5SWQpIHsKLSAgICAgICAgZm9yIChEaXNwbGF5IGRpc3BsYXkgOiBtRGlzcGxheXMpIHsKLSAgICAgICAgICAgIGlmIChkaXNwbGF5SWQgPT0gZGlzcGxheS5nZXREaXNwbGF5SWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBkaXNwbGF5OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIFN0cmluZyBnZXRGcm9udFdpbmRvdygpIHsKLSAgICAgICAgaWYgKG1XaW5kb3dTdGF0ZXMgPT0gbnVsbCB8fCBtV2luZG93U3RhdGVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1XaW5kb3dTdGF0ZXMuZ2V0KDApLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBTdHJpbmcgZ2V0Rm9jdXNlZFdpbmRvdygpIHsKLSAgICAgICAgcmV0dXJuIG1Gb2N1c2VkV2luZG93OwotICAgIH0KLQotICAgIFN0cmluZyBnZXRGb2N1c2VkQXBwKCkgewotICAgICAgICByZXR1cm4gbUZvY3VzZWRBcHA7Ci0gICAgfQotCi0gICAgU3RyaW5nIGdldExhc3RUcmFuc2l0aW9uKCkgewotICAgICAgICByZXR1cm4gbUxhc3RUcmFuc2l0aW9uOwotICAgIH0KLQotICAgIFN0cmluZyBnZXRBcHBUcmFuc2l0aW9uU3RhdGUoKSB7Ci0gICAgICAgIHJldHVybiBtQXBwVHJhbnNpdGlvblN0YXRlOwotICAgIH0KLQotICAgIGludCBnZXRGcm9udFN0YWNrSWQoaW50IGRpc3BsYXlJZCkgewotICAgICAgICByZXR1cm4gbURpc3BsYXlTdGFja3MuZ2V0KGRpc3BsYXlJZCkuZ2V0KDApLm1TdGFja0lkOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0Um90YXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBtUm90YXRpb247Ci0gICAgfQotCi0gICAgaW50IGdldExhc3RPcmllbnRhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG1MYXN0T3JpZW50YXRpb247Ci0gICAgfQotCi0gICAgYm9vbGVhbiBjb250YWluc1N0YWNrKGludCBzdGFja0lkKSB7Ci0gICAgICAgIGZvciAoV2luZG93U3RhY2sgc3RhY2sgOiBtU3RhY2tzKSB7Ci0gICAgICAgICAgICBpZiAoc3RhY2tJZCA9PSBzdGFjay5tU3RhY2tJZCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKiogQ2hlY2sgaWYgdGhlcmUgZXhpc3RzIGEgd2luZG93IHJlY29yZCB3aXRoIG1hdGNoaW5nIHdpbmRvd05hbWUuICovCi0gICAgYm9vbGVhbiBjb250YWluc1dpbmRvdyhTdHJpbmcgd2luZG93TmFtZSkgewotICAgICAgICBmb3IgKFdpbmRvd1N0YXRlIHdpbmRvdyA6IG1XaW5kb3dTdGF0ZXMpIHsKLSAgICAgICAgICAgIGlmICh3aW5kb3cuZ2V0TmFtZSgpLmVxdWFscyh3aW5kb3dOYW1lKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKiogQ2hlY2sgaWYgYXQgbGVhc3Qgb25lIHdpbmRvdyB3aGljaCBtYXRjaGVzIHByb3ZpZGVkIHdpbmRvdyBuYW1lIGlzIHZpc2libGUuICovCi0gICAgYm9vbGVhbiBpc1dpbmRvd1Zpc2libGUoU3RyaW5nIHdpbmRvd05hbWUpIHsKLSAgICAgICAgZm9yIChXaW5kb3dTdGF0ZSB3aW5kb3cgOiBtV2luZG93U3RhdGVzKSB7Ci0gICAgICAgICAgICBpZiAod2luZG93LmdldE5hbWUoKS5lcXVhbHMod2luZG93TmFtZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAod2luZG93LmlzU2hvd24oKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJvb2xlYW4gYWxsV2luZG93c1Zpc2libGUoU3RyaW5nIHdpbmRvd05hbWUpIHsKLSAgICAgICAgYm9vbGVhbiBhbGxWaXNpYmxlID0gZmFsc2U7Ci0gICAgICAgIGZvciAoV2luZG93U3RhdGUgd2luZG93IDogbVdpbmRvd1N0YXRlcykgewotICAgICAgICAgICAgaWYgKHdpbmRvdy5nZXROYW1lKCkuZXF1YWxzKHdpbmRvd05hbWUpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuaXNTaG93bigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZygiW1ZJU0lCTEVdIG5vdCB2aXNpYmxlIiArIHdpbmRvd05hbWUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxvZygiW1ZJU0lCTEVdIHZpc2libGUiICsgd2luZG93TmFtZSk7Ci0gICAgICAgICAgICAgICAgYWxsVmlzaWJsZSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFsbFZpc2libGU7Ci0gICAgfQotCi0gICAgV2luZG93U3RhY2sgZ2V0U3RhY2soaW50IHN0YWNrSWQpIHsKLSAgICAgICAgZm9yIChXaW5kb3dTdGFjayBzdGFjayA6IG1TdGFja3MpIHsKLSAgICAgICAgICAgIGlmIChzdGFja0lkID09IHN0YWNrLm1TdGFja0lkKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN0YWNrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotCi0gICAgaW50IGdldFN0YWNrUG9zaXRpb24oaW50IHN0YWNrSWQpIHsKLSAgICAgICAgZm9yIChJbnRlZ2VyIGRpc3BsYXlJZCA6IG1EaXNwbGF5U3RhY2tzLmtleVNldCgpKSB7Ci0gICAgICAgICAgICBMaXN0PFdpbmRvd1N0YWNrPiBzdGFja3MgPSBtRGlzcGxheVN0YWNrcy5nZXQoZGlzcGxheUlkKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RhY2tzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YWNrSWQgPT0gc3RhY2tzLmdldChpKS5tU3RhY2tJZCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIFdpbmRvd1N0YXRlIGdldElucHV0TWV0aG9kV2luZG93U3RhdGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRXaW5kb3dTdGF0ZUZvckFwcFRva2VuKG1JbnB1dE1ldGhvZFdpbmRvd0FwcFRva2VuKTsKLSAgICB9Ci0KLSAgICBSZWN0YW5nbGUgZ2V0U3RhYmxlQm91bmRzKCkgewotICAgICAgICByZXR1cm4gbVN0YWJsZUJvdW5kczsKLSAgICB9Ci0KLSAgICBSZWN0YW5nbGUgZ2V0RGVmYXVsdFBpbm5lZFN0YWNrQm91bmRzKCkgewotICAgICAgICByZXR1cm4gbURlZmF1bHRQaW5uZWRTdGFja0JvdW5kczsKLSAgICB9Ci0KLSAgICBSZWN0YW5nbGUgZ2V0UGlubmVkU3RhY2tNb21lbnRCb3VuZHMoKSB7Ci0gICAgICAgIHJldHVybiBtUGlubmVkU3RhY2tNb3ZlbWVudEJvdW5kczsKLSAgICB9Ci0KLSAgICBXaW5kb3dTdGF0ZSBmaW5kRmlyc3RXaW5kb3dXaXRoVHlwZShpbnQgdHlwZSkgewotICAgICAgICBmb3IgKFdpbmRvd1N0YXRlIHdpbmRvdyA6IG1XaW5kb3dTdGF0ZXMpIHsKLSAgICAgICAgICAgIGlmICh3aW5kb3cuZ2V0VHlwZSgpID09IHR5cGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gd2luZG93OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRGlzcGxheUZyb3plbigpIHsKLSAgICAgICAgcmV0dXJuIG1EaXNwbGF5RnJvemVuOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRG9ja2VkU3RhY2tNaW5pbWl6ZWQoKSB7Ci0gICAgICAgIHJldHVybiBtSXNEb2NrZWRTdGFja01pbmltaXplZDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVzZXQoKSB7Ci0gICAgICAgIG1TeXNEdW1wLmNsZWFyKCk7Ci0gICAgICAgIG1TdGFja3MuY2xlYXIoKTsKLSAgICAgICAgbURpc3BsYXlzLmNsZWFyKCk7Ci0gICAgICAgIG1XaW5kb3dTdGF0ZXMuY2xlYXIoKTsKLSAgICAgICAgbUZvY3VzZWRXaW5kb3cgPSBudWxsOwotICAgICAgICBtRm9jdXNlZEFwcCA9IG51bGw7Ci0gICAgICAgIG1JbnB1dE1ldGhvZFdpbmRvd0FwcFRva2VuID0gbnVsbDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgY2xhc3MgV2luZG93U3RhY2sgZXh0ZW5kcyBXaW5kb3dDb250YWluZXIgewotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gc1Rhc2tJZFBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoInRhc2tJZD0oXFxkKykiKTsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBzV2luZG93QW5pbWF0aW9uQmFja2dyb3VuZFN1cmZhY2VQYXR0ZXJuID0KLSAgICAgICAgICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoIm1XaW5kb3dBbmltYXRpb25CYWNrZ3JvdW5kU3VyZmFjZToiKTsKLQotICAgICAgICBpbnQgbVN0YWNrSWQ7Ci0gICAgICAgIEFycmF5TGlzdDxXaW5kb3dUYXNrPiBtVGFza3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGJvb2xlYW4gbVdpbmRvd0FuaW1hdGlvbkJhY2tncm91bmRTdXJmYWNlU2hvd2luZzsKLQotICAgICAgICBwcml2YXRlIFdpbmRvd1N0YWNrKCkgewotCi0gICAgICAgIH0KLQotICAgICAgICBzdGF0aWMgV2luZG93U3RhY2sgY3JlYXRlKAotICAgICAgICAgICAgICAgIExpbmtlZExpc3Q8U3RyaW5nPiBkdW1wLCBQYXR0ZXJuIHN0YWNrSWRQYXR0ZXJuLCBQYXR0ZXJuW10gZXhpdFBhdHRlcm5zKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbGluZSA9IGR1bXAucGVlaygpLnRyaW0oKTsKLQotICAgICAgICAgICAgZmluYWwgTWF0Y2hlciBtYXRjaGVyID0gc3RhY2tJZFBhdHRlcm4ubWF0Y2hlcihsaW5lKTsKLSAgICAgICAgICAgIGlmICghbWF0Y2hlci5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBOb3QgYSBzdGFjay4KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEZvciB0aGUgc3RhY2sgSWQgbGluZSB3ZSBqdXN0IHJlYWQuCi0gICAgICAgICAgICBkdW1wLnBvcCgpOwotCi0gICAgICAgICAgICBmaW5hbCBXaW5kb3dTdGFjayBzdGFjayA9IG5ldyBXaW5kb3dTdGFjaygpOwotICAgICAgICAgICAgbG9nKGxpbmUpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHN0YWNrSWQgPSBtYXRjaGVyLmdyb3VwKDEpOwotICAgICAgICAgICAgbG9nKHN0YWNrSWQpOwotICAgICAgICAgICAgc3RhY2subVN0YWNrSWQgPSBJbnRlZ2VyLnBhcnNlSW50KHN0YWNrSWQpOwotICAgICAgICAgICAgc3RhY2suZXh0cmFjdChkdW1wLCBleGl0UGF0dGVybnMpOwotICAgICAgICAgICAgcmV0dXJuIHN0YWNrOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBleHRyYWN0KExpbmtlZExpc3Q8U3RyaW5nPiBkdW1wLCBQYXR0ZXJuW10gZXhpdFBhdHRlcm5zKSB7Ci0KLSAgICAgICAgICAgIGZpbmFsIExpc3Q8UGF0dGVybj4gdGFza0V4aXRQYXR0ZXJucyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIENvbGxlY3Rpb25zLmFkZEFsbCh0YXNrRXhpdFBhdHRlcm5zLCBleGl0UGF0dGVybnMpOwotICAgICAgICAgICAgdGFza0V4aXRQYXR0ZXJucy5hZGQoc1Rhc2tJZFBhdHRlcm4pOwotICAgICAgICAgICAgdGFza0V4aXRQYXR0ZXJucy5hZGQoc1dpbmRvd0FuaW1hdGlvbkJhY2tncm91bmRTdXJmYWNlUGF0dGVybik7Ci0gICAgICAgICAgICBmaW5hbCBQYXR0ZXJuW10gdGFza0V4aXRQYXR0ZXJuc0FycmF5ID0KLSAgICAgICAgICAgICAgICAgICAgdGFza0V4aXRQYXR0ZXJucy50b0FycmF5KG5ldyBQYXR0ZXJuW3Rhc2tFeGl0UGF0dGVybnMuc2l6ZSgpXSk7Ci0KLSAgICAgICAgICAgIHdoaWxlICghZG9uZUV4dHJhY3RpbmcoZHVtcCwgZXhpdFBhdHRlcm5zKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIFdpbmRvd1Rhc2sgdGFzayA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBXaW5kb3dUYXNrLmNyZWF0ZShkdW1wLCBzVGFza0lkUGF0dGVybiwgdGFza0V4aXRQYXR0ZXJuc0FycmF5KTsKLQotICAgICAgICAgICAgICAgIGlmICh0YXNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVRhc2tzLmFkZCh0YXNrKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxpbmUgPSBkdW1wLnBvcCgpLnRyaW0oKTsKLQotICAgICAgICAgICAgICAgIGlmIChleHRyYWN0RnVsbHNjcmVlbihsaW5lKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoZXh0cmFjdEJvdW5kcyhsaW5lKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoZXh0cmFjdFdpbmRvd0FuaW1hdGlvbkJhY2tncm91bmRTdXJmYWNlKGxpbmUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gZXh0cmFjdFdpbmRvd0FuaW1hdGlvbkJhY2tncm91bmRTdXJmYWNlKFN0cmluZyBsaW5lKSB7Ci0gICAgICAgICAgICBpZiAoc1dpbmRvd0FuaW1hdGlvbkJhY2tncm91bmRTdXJmYWNlUGF0dGVybi5tYXRjaGVyKGxpbmUpLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgIGxvZyhsaW5lKTsKLSAgICAgICAgICAgICAgICBtV2luZG93QW5pbWF0aW9uQmFja2dyb3VuZFN1cmZhY2VTaG93aW5nID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIFdpbmRvd1Rhc2sgZ2V0VGFzayhpbnQgdGFza0lkKSB7Ci0gICAgICAgICAgICBmb3IgKFdpbmRvd1Rhc2sgdGFzayA6IG1UYXNrcykgewotICAgICAgICAgICAgICAgIGlmICh0YXNrSWQgPT0gdGFzay5tVGFza0lkKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXNrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBpc1dpbmRvd0FuaW1hdGlvbkJhY2tncm91bmRTdXJmYWNlU2hvd2luZygpIHsKLSAgICAgICAgICAgIHJldHVybiBtV2luZG93QW5pbWF0aW9uQmFja2dyb3VuZFN1cmZhY2VTaG93aW5nOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIFdpbmRvd1Rhc2sgZXh0ZW5kcyBXaW5kb3dDb250YWluZXIgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHNUZW1wSW5zZXRCb3VuZHNQYXR0ZXJuID0KLSAgICAgICAgICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoIm1UZW1wSW5zZXRCb3VuZHM9XFxbKFxcZCspLChcXGQrKVxcXVxcWyhcXGQrKSwoXFxkKylcXF0iKTsKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHNBcHBUb2tlblBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoCi0gICAgICAgICAgICAgICAgIkFjdGl2aXR5ICMoXFxkKykgQXBwV2luZG93VG9rZW5cXHsoXFxTKykgdG9rZW49VG9rZW5cXHsoXFxTKykgIgotICAgICAgICAgICAgICAgICsgIkFjdGl2aXR5UmVjb3JkXFx7KFxcUyspIHUoXFxkKykgKFxcUyspIHQoXFxkKylcXH1cXH1cXH0iKTsKLQotCi0gICAgICAgIGludCBtVGFza0lkOwotICAgICAgICBSZWN0YW5nbGUgbVRlbXBJbnNldEJvdW5kczsKLSAgICAgICAgTGlzdDxTdHJpbmc+IG1BcHBUb2tlbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgcHJpdmF0ZSBXaW5kb3dUYXNrKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdGljIFdpbmRvd1Rhc2sgY3JlYXRlKAotICAgICAgICAgICAgICAgIExpbmtlZExpc3Q8U3RyaW5nPiBkdW1wLCBQYXR0ZXJuIHRhc2tJZFBhdHRlcm4sIFBhdHRlcm5bXSBleGl0UGF0dGVybnMpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsaW5lID0gZHVtcC5wZWVrKCkudHJpbSgpOwotCi0gICAgICAgICAgICBmaW5hbCBNYXRjaGVyIG1hdGNoZXIgPSB0YXNrSWRQYXR0ZXJuLm1hdGNoZXIobGluZSk7Ci0gICAgICAgICAgICBpZiAoIW1hdGNoZXIubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgLy8gTm90IGEgdGFzay4KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEZvciB0aGUgdGFzayBJZCBsaW5lIHdlIGp1c3QgcmVhZC4KLSAgICAgICAgICAgIGR1bXAucG9wKCk7Ci0KLSAgICAgICAgICAgIGZpbmFsIFdpbmRvd1Rhc2sgdGFzayA9IG5ldyBXaW5kb3dUYXNrKCk7Ci0gICAgICAgICAgICBsb2cobGluZSk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgdGFza0lkID0gbWF0Y2hlci5ncm91cCgxKTsKLSAgICAgICAgICAgIGxvZyh0YXNrSWQpOwotICAgICAgICAgICAgdGFzay5tVGFza0lkID0gSW50ZWdlci5wYXJzZUludCh0YXNrSWQpOwotICAgICAgICAgICAgdGFzay5leHRyYWN0KGR1bXAsIGV4aXRQYXR0ZXJucyk7Ci0gICAgICAgICAgICByZXR1cm4gdGFzazsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBleHRyYWN0KExpbmtlZExpc3Q8U3RyaW5nPiBkdW1wLCBQYXR0ZXJuW10gZXhpdFBhdHRlcm5zKSB7Ci0gICAgICAgICAgICB3aGlsZSAoIWRvbmVFeHRyYWN0aW5nKGR1bXAsIGV4aXRQYXR0ZXJucykpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbGluZSA9IGR1bXAucG9wKCkudHJpbSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKGV4dHJhY3RGdWxsc2NyZWVuKGxpbmUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChleHRyYWN0Qm91bmRzKGxpbmUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIE1hdGNoZXIgbWF0Y2hlciA9IHNUZW1wSW5zZXRCb3VuZHNQYXR0ZXJuLm1hdGNoZXIobGluZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1hdGNoZXIubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZyhsaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgbVRlbXBJbnNldEJvdW5kcyA9IGV4dHJhY3RCb3VuZHMobWF0Y2hlcik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbWF0Y2hlciA9IHNBcHBUb2tlblBhdHRlcm4ubWF0Y2hlcihsaW5lKTsKLSAgICAgICAgICAgICAgICBpZiAobWF0Y2hlci5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKGxpbmUpOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYXBwVG9rZW4gPSBtYXRjaGVyLmdyb3VwKDYpOwotICAgICAgICAgICAgICAgICAgICBsb2coYXBwVG9rZW4pOwotICAgICAgICAgICAgICAgICAgICBtQXBwVG9rZW5zLmFkZChhcHBUb2tlbik7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBXaW5kb3dDb250YWluZXIgewotICAgICAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFBhdHRlcm4gc0Z1bGxzY3JlZW5QYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCJtRmlsbHNQYXJlbnQ9KFxcUyspIik7Ci0gICAgICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgUGF0dGVybiBzQm91bmRzUGF0dGVybiA9Ci0gICAgICAgICAgICAgICAgUGF0dGVybi5jb21waWxlKCJtQm91bmRzPVxcWygtP1xcZCspLCgtP1xcZCspXFxdXFxbKC0/XFxkKyksKC0/XFxkKylcXF0iKTsKLQotICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtRnVsbHNjcmVlbjsKLSAgICAgICAgcHJvdGVjdGVkIFJlY3RhbmdsZSBtQm91bmRzOwotCi0gICAgICAgIHN0YXRpYyBib29sZWFuIGRvbmVFeHRyYWN0aW5nKExpbmtlZExpc3Q8U3RyaW5nPiBkdW1wLCBQYXR0ZXJuW10gZXhpdFBhdHRlcm5zKSB7Ci0gICAgICAgICAgICBpZiAoZHVtcC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsaW5lID0gZHVtcC5wZWVrKCkudHJpbSgpOwotCi0gICAgICAgICAgICBmb3IgKFBhdHRlcm4gcGF0dGVybiA6IGV4aXRQYXR0ZXJucykgewotICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuLm1hdGNoZXIobGluZSkubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gZXh0cmFjdEZ1bGxzY3JlZW4oU3RyaW5nIGxpbmUpIHsKLSAgICAgICAgICAgIGZpbmFsIE1hdGNoZXIgbWF0Y2hlciA9IHNGdWxsc2NyZWVuUGF0dGVybi5tYXRjaGVyKGxpbmUpOwotICAgICAgICAgICAgaWYgKCFtYXRjaGVyLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxvZyhsaW5lKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmdWxsc2NyZWVuID0gbWF0Y2hlci5ncm91cCgxKTsKLSAgICAgICAgICAgIGxvZyhmdWxsc2NyZWVuKTsKLSAgICAgICAgICAgIG1GdWxsc2NyZWVuID0gQm9vbGVhbi52YWx1ZU9mKGZ1bGxzY3JlZW4pOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIGV4dHJhY3RCb3VuZHMoU3RyaW5nIGxpbmUpIHsKLSAgICAgICAgICAgIGZpbmFsIE1hdGNoZXIgbWF0Y2hlciA9IHNCb3VuZHNQYXR0ZXJuLm1hdGNoZXIobGluZSk7Ci0gICAgICAgICAgICBpZiAoIW1hdGNoZXIubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbG9nKGxpbmUpOwotICAgICAgICAgICAgbUJvdW5kcyA9IGV4dHJhY3RCb3VuZHMobWF0Y2hlcik7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXRpYyBSZWN0YW5nbGUgZXh0cmFjdEJvdW5kcyhNYXRjaGVyIG1hdGNoZXIpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBsZWZ0ID0gSW50ZWdlci52YWx1ZU9mKG1hdGNoZXIuZ3JvdXAoMSkpOwotICAgICAgICAgICAgZmluYWwgaW50IHRvcCA9IEludGVnZXIudmFsdWVPZihtYXRjaGVyLmdyb3VwKDIpKTsKLSAgICAgICAgICAgIGZpbmFsIGludCByaWdodCA9IEludGVnZXIudmFsdWVPZihtYXRjaGVyLmdyb3VwKDMpKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBib3R0b20gPSBJbnRlZ2VyLnZhbHVlT2YobWF0Y2hlci5ncm91cCg0KSk7Ci0gICAgICAgICAgICBmaW5hbCBSZWN0YW5nbGUgcmVjdCA9IG5ldyBSZWN0YW5nbGUobGVmdCwgdG9wLCByaWdodCAtIGxlZnQsIGJvdHRvbSAtIHRvcCk7Ci0KLSAgICAgICAgICAgIGxvZyhyZWN0LnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgcmV0dXJuIHJlY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0aWMgdm9pZCBleHRyYWN0TXVsdGlwbGVCb3VuZHMoTWF0Y2hlciBtYXRjaGVyLCBpbnQgZ3JvdXBJbmRleCwgUmVjdGFuZ2xlLi4uIHJlY3RMaXN0KSB7Ci0gICAgICAgICAgICBmb3IgKFJlY3RhbmdsZSByZWN0IDogcmVjdExpc3QpIHsKLSAgICAgICAgICAgICAgICBpZiAocmVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGxlZnQgPSBJbnRlZ2VyLnZhbHVlT2YobWF0Y2hlci5ncm91cChncm91cEluZGV4KyspKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdG9wID0gSW50ZWdlci52YWx1ZU9mKG1hdGNoZXIuZ3JvdXAoZ3JvdXBJbmRleCsrKSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHJpZ2h0ID0gSW50ZWdlci52YWx1ZU9mKG1hdGNoZXIuZ3JvdXAoZ3JvdXBJbmRleCsrKSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGJvdHRvbSA9IEludGVnZXIudmFsdWVPZihtYXRjaGVyLmdyb3VwKGdyb3VwSW5kZXgrKykpOwotICAgICAgICAgICAgICAgIHJlY3Quc2V0Qm91bmRzKGxlZnQsIHRvcCwgcmlnaHQgLSBsZWZ0LCBib3R0b20gLSB0b3ApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgUmVjdGFuZ2xlIGdldEJvdW5kcygpIHsKLSAgICAgICAgICAgIHJldHVybiBtQm91bmRzOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBpc0Z1bGxzY3JlZW4oKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUZ1bGxzY3JlZW47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgY2xhc3MgRGlzcGxheSBleHRlbmRzIFdpbmRvd0NvbnRhaW5lciB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiW0Rpc3BsYXldICI7Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBzRGlzcGxheUluZm9QYXR0ZXJuID0KLSAgICAgICAgICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoIiguKykgKFxcZCspZHBpIGN1cj0oXFxkKyl4KFxcZCspIGFwcD0oXFxkKyl4KFxcZCspICguKykiKTsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtRGlzcGxheUlkOwotICAgICAgICBwcml2YXRlIFJlY3RhbmdsZSBtRGlzcGxheVJlY3QgPSBuZXcgUmVjdGFuZ2xlKCk7Ci0gICAgICAgIHByaXZhdGUgUmVjdGFuZ2xlIG1BcHBSZWN0ID0gbmV3IFJlY3RhbmdsZSgpOwotICAgICAgICBwcml2YXRlIGludCBtRHBpOwotCi0gICAgICAgIHByaXZhdGUgRGlzcGxheShpbnQgZGlzcGxheUlkKSB7Ci0gICAgICAgICAgICBtRGlzcGxheUlkID0gZGlzcGxheUlkOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGdldERpc3BsYXlJZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtRGlzcGxheUlkOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGdldERwaSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtRHBpOwotICAgICAgICB9Ci0KLSAgICAgICAgUmVjdGFuZ2xlIGdldERpc3BsYXlSZWN0KCkgewotICAgICAgICAgICAgcmV0dXJuIG1EaXNwbGF5UmVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIFJlY3RhbmdsZSBnZXRBcHBSZWN0KCkgewotICAgICAgICAgICAgcmV0dXJuIG1BcHBSZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdGljIERpc3BsYXkgY3JlYXRlKExpbmtlZExpc3Q8U3RyaW5nPiBkdW1wLCBQYXR0ZXJuW10gZXhpdFBhdHRlcm5zKSB7Ci0gICAgICAgICAgICAvLyBUT0RPOiBleGl0IHBhdHRlcm4gZm9yIGRpc3BsYXlzPwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxpbmUgPSBkdW1wLnBlZWsoKS50cmltKCk7Ci0KLSAgICAgICAgICAgIE1hdGNoZXIgbWF0Y2hlciA9IHNEaXNwbGF5SWRQYXR0ZXJuLm1hdGNoZXIobGluZSk7Ci0gICAgICAgICAgICBpZiAoIW1hdGNoZXIubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGxvZyhUQUcgKyAiRElTUExBWV9JRDogIiArIGxpbmUpOwotICAgICAgICAgICAgZHVtcC5wb3AoKTsKLQotICAgICAgICAgICAgZmluYWwgaW50IGRpc3BsYXlJZCA9IEludGVnZXIudmFsdWVPZihtYXRjaGVyLmdyb3VwKDEpKTsKLSAgICAgICAgICAgIGZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KGRpc3BsYXlJZCk7Ci0gICAgICAgICAgICBkaXNwbGF5LmV4dHJhY3QoZHVtcCwgZXhpdFBhdHRlcm5zKTsKLSAgICAgICAgICAgIHJldHVybiBkaXNwbGF5OwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGV4dHJhY3QoTGlua2VkTGlzdDxTdHJpbmc+IGR1bXAsIFBhdHRlcm5bXSBleGl0UGF0dGVybnMpIHsKLSAgICAgICAgICAgIHdoaWxlICghZG9uZUV4dHJhY3RpbmcoZHVtcCwgZXhpdFBhdHRlcm5zKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsaW5lID0gZHVtcC5wb3AoKS50cmltKCk7Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBNYXRjaGVyIG1hdGNoZXIgPSBzRGlzcGxheUluZm9QYXR0ZXJuLm1hdGNoZXIobGluZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1hdGNoZXIubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZyhUQUcgKyAiRElTUExBWV9JTkZPOiAiICsgbGluZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1EcGkgPSBJbnRlZ2VyLnZhbHVlT2YobWF0Y2hlci5ncm91cCgyKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGRpc3BsYXlXaWR0aCA9IEludGVnZXIudmFsdWVPZihtYXRjaGVyLmdyb3VwKDMpKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGRpc3BsYXlIZWlnaHQgPSBJbnRlZ2VyLnZhbHVlT2YobWF0Y2hlci5ncm91cCg0KSk7Ci0gICAgICAgICAgICAgICAgICAgIG1EaXNwbGF5UmVjdC5zZXRCb3VuZHMoMCwgMCwgZGlzcGxheVdpZHRoLCBkaXNwbGF5SGVpZ2h0KTsKLQotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgYXBwV2lkdGggPSBJbnRlZ2VyLnZhbHVlT2YobWF0Y2hlci5ncm91cCg1KSk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBhcHBIZWlnaHQgPSBJbnRlZ2VyLnZhbHVlT2YobWF0Y2hlci5ncm91cCg2KSk7Ci0gICAgICAgICAgICAgICAgICAgIG1BcHBSZWN0LnNldEJvdW5kcygwLCAwLCBhcHBXaWR0aCwgYXBwSGVpZ2h0KTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBicmVhayBhcyB3ZSBkb24ndCBuZWVkIG90aGVyIGluZm8gZm9yIG5vdwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gRXh0cmFjdCBvdGhlciBpbmZvIGhlcmUgaWYgbmVlZGVkCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiAiRGlzcGxheSAjIiArIG1EaXNwbGF5SWQgKyAiOiBtRGlzcGxheVJlY3Q9IiArIG1EaXNwbGF5UmVjdAotICAgICAgICAgICAgICAgICAgICArICIgbUFwcFJlY3Q9IiArIG1BcHBSZWN0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBXaW5kb3dTdGF0ZSBleHRlbmRzIFdpbmRvd0NvbnRhaW5lciB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiW1dpbmRvd1N0YXRlXSAiOwotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfV0FMTFBBUEVSID0gMjAxMzsKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0lORE9XX1RZUEVfTk9STUFMICAgPSAwOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0lORE9XX1RZUEVfU1RBUlRJTkcgPSAxOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0lORE9XX1RZUEVfRVhJVElORyAgPSAyOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0lORE9XX1RZUEVfREVCVUdHRVIgPSAzOwotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUNUX1NUUiA9ICJcXFsoXFxkKyksKFxcZCspXFxdXFxbKFxcZCspLChcXGQrKVxcXSI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBORUdBVElWRV9WQUxVRVNfQUxMT1dFRF9SRUNUX1NUUiA9Ci0gICAgICAgICAgICAgICAgIlxcWyhbLVxcZF0rKSwoWy1cXGRdKylcXF1cXFsoWy1cXGRdKyksKFstXFxkXSspXFxdIjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBzTWFpbkZyYW1lUGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgibUZyYW1lPSIgKyBSRUNUX1NUUiArICIuKyIpOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHNGcmFtZVBhdHRlcm4gPQotICAgICAgICAgICAgICAgIFBhdHRlcm4uY29tcGlsZSgiRnJhbWVzOiBjb250YWluaW5nPSIgKyBSRUNUX1NUUiArICIgcGFyZW50PSIgKyBSRUNUX1NUUik7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gc0NvbnRlbnRGcmFtZVBhdHRlcm4gPQotICAgICAgICAgICAgUGF0dGVybi5jb21waWxlKCJjb250ZW50PSIgKyBSRUNUX1NUUiArICIgLisiKTsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBzV2luZG93QXNzb2NpYXRpb25QYXR0ZXJuID0KLSAgICAgICAgICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoIm1EaXNwbGF5SWQ9KFxcZCspIHN0YWNrSWQ9KFxcZCspICguKykiKTsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBzU3VyZmFjZUluc2V0c1BhdHRlcm4gPQotICAgICAgICAgICAgUGF0dGVybi5jb21waWxlKCJDdXIgaW5zZXRzLitzdXJmYWNlPSIgKyBSRUNUX1NUUiArICIuKyIpOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHNDb250ZW50SW5zZXRzUGF0dGVybiA9Ci0gICAgICAgICAgICAgICAgUGF0dGVybi5jb21waWxlKCJDdXIgaW5zZXRzLitjb250ZW50PSIgKyBORUdBVElWRV9WQUxVRVNfQUxMT1dFRF9SRUNUX1NUUiArICIuKyIpOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHNHaXZlbkNvbnRlbnRJbnNldHNQYXR0ZXJuID0KLSAgICAgICAgICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoIm1HaXZlbkNvbnRlbnRJbnNldHM9IiArIFJFQ1RfU1RSICsgIi4rIik7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gc0Nyb3BQYXR0ZXJuID0KLSAgICAgICAgICAgIFBhdHRlcm4uY29tcGlsZSgiLittTGFzdENsaXBSZWN0PSIgKyBSRUNUX1NUUiArICIuKiIpOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHNTdXJmYWNlUGF0dGVybiA9Ci0gICAgICAgICAgICAgICAgUGF0dGVybi5jb21waWxlKCJTdXJmYWNlOiBzaG93bj0oXFxTKykgbGF5ZXI9KFxcZCspIGFscGhhPVtcXGQuXSsgcmVjdD1cXChbXFxkLi1dKyxbXFxkLi1dK1xcKSBbXFxkLl0rIHggW1xcZC5dKy4qIik7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gc0F0dHJzUGF0dGVybj0KLSAgICAgICAgICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoIm1BdHRycz1XTVxcLkxheW91dFBhcmFtc1xcey4qdHk9KFxcZCspLipcXH0iKTsKLQotCi0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1OYW1lOwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQXBwVG9rZW47Ci0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1XaW5kb3dUeXBlOwotICAgICAgICBwcml2YXRlIGludCBtVHlwZTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbURpc3BsYXlJZDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVN0YWNrSWQ7Ci0gICAgICAgIHByaXZhdGUgaW50IG1MYXllcjsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1TaG93bjsKLSAgICAgICAgcHJpdmF0ZSBSZWN0YW5nbGUgbUNvbnRhaW5pbmdGcmFtZSA9IG5ldyBSZWN0YW5nbGUoKTsKLSAgICAgICAgcHJpdmF0ZSBSZWN0YW5nbGUgbVBhcmVudEZyYW1lID0gbmV3IFJlY3RhbmdsZSgpOwotICAgICAgICBwcml2YXRlIFJlY3RhbmdsZSBtQ29udGVudEZyYW1lID0gbmV3IFJlY3RhbmdsZSgpOwotICAgICAgICBwcml2YXRlIFJlY3RhbmdsZSBtRnJhbWUgPSBuZXcgUmVjdGFuZ2xlKCk7Ci0gICAgICAgIHByaXZhdGUgUmVjdGFuZ2xlIG1TdXJmYWNlSW5zZXRzID0gbmV3IFJlY3RhbmdsZSgpOwotICAgICAgICBwcml2YXRlIFJlY3RhbmdsZSBtQ29udGVudEluc2V0cyA9IG5ldyBSZWN0YW5nbGUoKTsKLSAgICAgICAgcHJpdmF0ZSBSZWN0YW5nbGUgbUdpdmVuQ29udGVudEluc2V0cyA9IG5ldyBSZWN0YW5nbGUoKTsKLSAgICAgICAgcHJpdmF0ZSBSZWN0YW5nbGUgbUNyb3AgPSBuZXcgUmVjdGFuZ2xlKCk7Ci0KLQotICAgICAgICBwcml2YXRlIFdpbmRvd1N0YXRlKE1hdGNoZXIgbWF0Y2hlciwgaW50IHdpbmRvd1R5cGUpIHsKLSAgICAgICAgICAgIG1OYW1lID0gbWF0Y2hlci5ncm91cCg0KTsKLSAgICAgICAgICAgIG1BcHBUb2tlbiA9IG1hdGNoZXIuZ3JvdXAoMik7Ci0gICAgICAgICAgICBtV2luZG93VHlwZSA9IHdpbmRvd1R5cGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbU5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgZ2V0VG9rZW4oKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUFwcFRva2VuOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBpc1N0YXJ0aW5nV2luZG93KCkgewotICAgICAgICAgICAgcmV0dXJuIG1XaW5kb3dUeXBlID09IFdJTkRPV19UWVBFX1NUQVJUSU5HOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBpc0V4aXRpbmdXaW5kb3coKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVdpbmRvd1R5cGUgPT0gV0lORE9XX1RZUEVfRVhJVElORzsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gaXNEZWJ1Z2dlcldpbmRvdygpIHsKLSAgICAgICAgICAgIHJldHVybiBtV2luZG93VHlwZSA9PSBXSU5ET1dfVFlQRV9ERUJVR0dFUjsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBnZXREaXNwbGF5SWQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbURpc3BsYXlJZDsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBnZXRTdGFja0lkKCkgewotICAgICAgICAgICAgcmV0dXJuIG1TdGFja0lkOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGdldExheWVyKCkgewotICAgICAgICAgICAgcmV0dXJuIG1MYXllcjsKLSAgICAgICAgfQotCi0gICAgICAgIFJlY3RhbmdsZSBnZXRDb250YWluaW5nRnJhbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbnRhaW5pbmdGcmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIFJlY3RhbmdsZSBnZXRGcmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtRnJhbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBSZWN0YW5nbGUgZ2V0U3VyZmFjZUluc2V0cygpIHsKLSAgICAgICAgICAgIHJldHVybiBtU3VyZmFjZUluc2V0czsKLSAgICAgICAgfQotCi0gICAgICAgIFJlY3RhbmdsZSBnZXRDb250ZW50SW5zZXRzKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db250ZW50SW5zZXRzOwotICAgICAgICB9Ci0KLSAgICAgICAgUmVjdGFuZ2xlIGdldEdpdmVuQ29udGVudEluc2V0cygpIHsKLSAgICAgICAgICAgIHJldHVybiBtR2l2ZW5Db250ZW50SW5zZXRzOwotICAgICAgICB9Ci0KLSAgICAgICAgUmVjdGFuZ2xlIGdldENvbnRlbnRGcmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29udGVudEZyYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgUmVjdGFuZ2xlIGdldFBhcmVudEZyYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIG1QYXJlbnRGcmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIFJlY3RhbmdsZSBnZXRDcm9wKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Dcm9wOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBpc1Nob3duKCkgewotICAgICAgICAgICAgcmV0dXJuIG1TaG93bjsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBnZXRUeXBlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1UeXBlOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdGljIFdpbmRvd1N0YXRlIGNyZWF0ZShMaW5rZWRMaXN0PFN0cmluZz4gZHVtcCwgUGF0dGVybltdIGV4aXRQYXR0ZXJucykgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxpbmUgPSBkdW1wLnBlZWsoKS50cmltKCk7Ci0KLSAgICAgICAgICAgIE1hdGNoZXIgbWF0Y2hlciA9IHNXaW5kb3dQYXR0ZXJuLm1hdGNoZXIobGluZSk7Ci0gICAgICAgICAgICBpZiAoIW1hdGNoZXIubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGxvZyhUQUcgKyAiV0lORE9XOiAiICsgbGluZSk7Ci0gICAgICAgICAgICBkdW1wLnBvcCgpOwotCi0gICAgICAgICAgICBmaW5hbCBXaW5kb3dTdGF0ZSB3aW5kb3c7Ci0gICAgICAgICAgICBNYXRjaGVyIHNwZWNpYWxNYXRjaGVyOwotICAgICAgICAgICAgaWYgKChzcGVjaWFsTWF0Y2hlciA9IHNTdGFydGluZ1dpbmRvd1BhdHRlcm4ubWF0Y2hlcihsaW5lKSkubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgbG9nKFRBRyArICJTVEFSVElORzogIiArIGxpbmUpOwotICAgICAgICAgICAgICAgIHdpbmRvdyA9IG5ldyBXaW5kb3dTdGF0ZShzcGVjaWFsTWF0Y2hlciwgV0lORE9XX1RZUEVfU1RBUlRJTkcpOwotICAgICAgICAgICAgfSBlbHNlIGlmICgoc3BlY2lhbE1hdGNoZXIgPSBzRXhpdGluZ1dpbmRvd1BhdHRlcm4ubWF0Y2hlcihsaW5lKSkubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgbG9nKFRBRyArICJFWElUSU5HOiAiICsgbGluZSk7Ci0gICAgICAgICAgICAgICAgd2luZG93ID0gbmV3IFdpbmRvd1N0YXRlKHNwZWNpYWxNYXRjaGVyLCBXSU5ET1dfVFlQRV9FWElUSU5HKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoKHNwZWNpYWxNYXRjaGVyID0gc0RlYnVnZ2VyV2luZG93UGF0dGVybi5tYXRjaGVyKGxpbmUpKS5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICBsb2coVEFHICsgIkRFQlVHR0VSOiAiICsgbGluZSk7Ci0gICAgICAgICAgICAgICAgd2luZG93ID0gbmV3IFdpbmRvd1N0YXRlKHNwZWNpYWxNYXRjaGVyLCBXSU5ET1dfVFlQRV9ERUJVR0dFUik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHdpbmRvdyA9IG5ldyBXaW5kb3dTdGF0ZShtYXRjaGVyLCBXSU5ET1dfVFlQRV9OT1JNQUwpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB3aW5kb3cuZXh0cmFjdChkdW1wLCBleGl0UGF0dGVybnMpOwotICAgICAgICAgICAgcmV0dXJuIHdpbmRvdzsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBleHRyYWN0KExpbmtlZExpc3Q8U3RyaW5nPiBkdW1wLCBQYXR0ZXJuW10gZXhpdFBhdHRlcm5zKSB7Ci0gICAgICAgICAgICB3aGlsZSAoIWRvbmVFeHRyYWN0aW5nKGR1bXAsIGV4aXRQYXR0ZXJucykpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbGluZSA9IGR1bXAucG9wKCkudHJpbSgpOwotCi0gICAgICAgICAgICAgICAgTWF0Y2hlciBtYXRjaGVyID0gc1dpbmRvd0Fzc29jaWF0aW9uUGF0dGVybi5tYXRjaGVyKGxpbmUpOwotICAgICAgICAgICAgICAgIGlmIChtYXRjaGVyLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2coVEFHICsgIldJTkRPV19BU1NPQ0lBVElPTjogIiArIGxpbmUpOwotICAgICAgICAgICAgICAgICAgICBtRGlzcGxheUlkID0gSW50ZWdlci52YWx1ZU9mKG1hdGNoZXIuZ3JvdXAoMSkpOwotICAgICAgICAgICAgICAgICAgICBtU3RhY2tJZCA9IEludGVnZXIudmFsdWVPZihtYXRjaGVyLmdyb3VwKDIpKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbWF0Y2hlciA9IHNNYWluRnJhbWVQYXR0ZXJuLm1hdGNoZXIobGluZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1hdGNoZXIubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZyhUQUcgKyAiTUFJTiBXSU5ET1cgRlJBTUU6ICIgKyBsaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgbUZyYW1lID0gZXh0cmFjdEJvdW5kcyhtYXRjaGVyKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbWF0Y2hlciA9IHNGcmFtZVBhdHRlcm4ubWF0Y2hlcihsaW5lKTsKLSAgICAgICAgICAgICAgICBpZiAobWF0Y2hlci5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKFRBRyArICJGUkFNRTogIiArIGxpbmUpOwotICAgICAgICAgICAgICAgICAgICBleHRyYWN0TXVsdGlwbGVCb3VuZHMobWF0Y2hlciwgMSwgbUNvbnRhaW5pbmdGcmFtZSwgbVBhcmVudEZyYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbWF0Y2hlciA9IHNDb250ZW50RnJhbWVQYXR0ZXJuLm1hdGNoZXIobGluZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1hdGNoZXIubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZyhUQUcgKyAiQ09OVEVOVCBGUkFNRTogIiArIGxpbmUpOwotICAgICAgICAgICAgICAgICAgICBtQ29udGVudEZyYW1lID0gZXh0cmFjdEJvdW5kcyhtYXRjaGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtYXRjaGVyID0gc1N1cmZhY2VJbnNldHNQYXR0ZXJuLm1hdGNoZXIobGluZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1hdGNoZXIubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZyhUQUcgKyAiSU5TRVRTOiAiICsgbGluZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1TdXJmYWNlSW5zZXRzID0gZXh0cmFjdEJvdW5kcyhtYXRjaGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtYXRjaGVyID0gc0NvbnRlbnRJbnNldHNQYXR0ZXJuLm1hdGNoZXIobGluZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1hdGNoZXIubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZyhUQUcgKyAiQ09OVEVOVCBJTlNFVFM6ICIgKyBsaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRlbnRJbnNldHMgPSBleHRyYWN0Qm91bmRzKG1hdGNoZXIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1hdGNoZXIgPSBzQ3JvcFBhdHRlcm4ubWF0Y2hlcihsaW5lKTsKLSAgICAgICAgICAgICAgICBpZiAobWF0Y2hlci5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKFRBRyArICJDUk9QOiAiICsgbGluZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1Dcm9wID0gZXh0cmFjdEJvdW5kcyhtYXRjaGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtYXRjaGVyID0gc1N1cmZhY2VQYXR0ZXJuLm1hdGNoZXIobGluZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1hdGNoZXIubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZyhUQUcgKyAiU1VSRkFDRTogIiArIGxpbmUpOwotICAgICAgICAgICAgICAgICAgICBtU2hvd24gPSBCb29sZWFuLnZhbHVlT2YobWF0Y2hlci5ncm91cCgxKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1MYXllciA9IEludGVnZXIudmFsdWVPZihtYXRjaGVyLmdyb3VwKDIpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtYXRjaGVyID0gc0F0dHJzUGF0dGVybi5tYXRjaGVyKGxpbmUpOwotICAgICAgICAgICAgICAgIGlmIChtYXRjaGVyLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2coVEFHICsgIkFUVFJTOiAiICsgbGluZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1UeXBlID0gSW50ZWdlci52YWx1ZU9mKG1hdGNoZXIuZ3JvdXAoMSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1hdGNoZXIgPSBzR2l2ZW5Db250ZW50SW5zZXRzUGF0dGVybi5tYXRjaGVyKGxpbmUpOwotICAgICAgICAgICAgICAgIGlmIChtYXRjaGVyLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2coVEFHICsgIkdJVkVOIENPTlRFTlQgSU5TRVRTOiAiICsgbGluZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1HaXZlbkNvbnRlbnRJbnNldHMgPSBleHRyYWN0Qm91bmRzKG1hdGNoZXIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIEV4dHJhY3Qgb3RoZXIgaW5mbyBoZXJlIGlmIG5lZWRlZAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFdpbmRvd1R5cGVTdWZmaXgoaW50IHdpbmRvd1R5cGUpIHsKLSAgICAgICAgICAgIHN3aXRjaCAod2luZG93VHlwZSkgewotICAgICAgICAgICAgY2FzZSBXSU5ET1dfVFlQRV9TVEFSVElORzogcmV0dXJuICIgU1RBUlRJTkciOwotICAgICAgICAgICAgY2FzZSBXSU5ET1dfVFlQRV9FWElUSU5HOiByZXR1cm4gIiBFWElUSU5HIjsKLSAgICAgICAgICAgIGNhc2UgV0lORE9XX1RZUEVfREVCVUdHRVI6IHJldHVybiAiIERFQlVHR0VSIjsKLSAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gIldpbmRvd1N0YXRlOiB7IiArIG1BcHBUb2tlbiArICIgIiArIG1OYW1lCi0gICAgICAgICAgICAgICAgICAgICsgZ2V0V2luZG93VHlwZVN1ZmZpeChtV2luZG93VHlwZSkgKyAifSIgKyAiIHR5cGU9IiArIG1UeXBlCi0gICAgICAgICAgICAgICAgICAgICsgIiBjZj0iICsgbUNvbnRhaW5pbmdGcmFtZSArICIgcGY9IiArIG1QYXJlbnRGcmFtZTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL3dpbmRvd21hbmFnZXIvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL3dpbmRvd21hbmFnZXIvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDczOTc0My4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci93aW5kb3dtYW5hZ2VyL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotCi1MT0NBTF9NT0RVTEUgOj0gQ3RzV2luZG93TWFuYWdlckhvc3RUZXN0Q2FzZXMKLQotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQotCi1MT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBjdHMtdHJhZGVmZWQgdHJhZGVmZWQgQ3RzU2VydmljZXNIb3N0VGVzdENhc2VzCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAotICAgIGN0cy1hbXdtLXV0aWwgXAotICAgIHBsYXRmb3JtLXRlc3QtYW5ub3RhdGlvbnMtaG9zdAotCi1MT0NBTF9DVFNfVEVTVF9QQUNLQUdFIDo9IGFuZHJvaWQuc2VydmVyLmN0cwotCi0jIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0Ci1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cwotCi1pbmNsdWRlICQoQlVJTERfQ1RTX0hPU1RfSkFWQV9MSUJSQVJZKQotCi0jIEJ1aWxkIHRoZSB0ZXN0IEFQS3MgdXNpbmcgdGhlaXIgb3duIG1ha2VmaWxlcwotaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvd2luZG93bWFuYWdlci9BbmRyb2lkVGVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci93aW5kb3dtYW5hZ2VyL0FuZHJvaWRUZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJmMDA5OS4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci93aW5kb3dtYW5hZ2VyL0FuZHJvaWRUZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgd2luZG93IG1hbmFnZXIgaG9zdCB0ZXN0IGNhc2VzIj4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImZyYW1ld29yayIgLz4KLSAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzRHJhZ0FuZERyb3BTb3VyY2VBcHAuYXBrIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzRHJhZ0FuZERyb3BUYXJnZXRBcHAuYXBrIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzRHJhZ0FuZERyb3BUYXJnZXRBcHBTZGsyMy5hcGsiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJDdHNEZXZpY2VXaW5kb3dGcmFtZXNUZXN0QXBwLmFwayIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0RldmljZUFsZXJ0V2luZG93VGVzdEFwcC5hcGsiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJDdHNEZXZpY2VBbGVydFdpbmRvd1Rlc3RBcHBTZGsyNS5hcGsiIC8+Ci0gICAgPC90YXJnZXRfcHJlcGFyZXI+Ci0gICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRlc3R0eXBlLkphckhvc3RUZXN0IiA+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iamFyIiB2YWx1ZT0iQ3RzV2luZG93TWFuYWdlckhvc3RUZXN0Q2FzZXMuamFyIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjIwbTQwcyIgLz4KLSAgICA8L3Rlc3Q+Ci08L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci93aW5kb3dtYW5hZ2VyL2FsZXJ0d2luZG93YXBwL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci93aW5kb3dtYW5hZ2VyL2FsZXJ0d2luZG93YXBwL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMjQ4NWQuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvd2luZG93bWFuYWdlci9hbGVydHdpbmRvd2FwcC9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi0jIERvbid0IGluY2x1ZGUgdGhpcyBwYWNrYWdlIGluIGFueSB0YXJnZXQuCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotCi1MT0NBTF9TUkNfRklMRVMgOj0gXAotICAgICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKSBcCi0gICAgJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCAuLi9hbGVydHdpbmRvd2FwcHNkazI1L3NyYykgXAotCi1MT0NBTF9TREtfVkVSU0lPTiA6PSB0ZXN0X2N1cnJlbnQKLQotIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKLQotTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0RldmljZUFsZXJ0V2luZG93VGVzdEFwcAotCi1pbmNsdWRlICQoQlVJTERfQ1RTX1NVUFBPUlRfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL3dpbmRvd21hbmFnZXIvYWxlcnR3aW5kb3dhcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL3dpbmRvd21hbmFnZXIvYWxlcnR3aW5kb3dhcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWM2YTZhZC4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci93aW5kb3dtYW5hZ2VyL2FsZXJ0d2luZG93YXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLQotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgICAgeG1sbnM6YW5kcm9pZHBydj0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Bydi9yZXMvYW5kcm9pZCIKLSAgICAgICAgICBwYWNrYWdlPSJhbmRyb2lkLnNlcnZlci5hbGVydHdpbmRvd2FwcCI+Ci0gICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5TWVNURU1fQUxFUlRfV0lORE9XIiAvPgotCi0gICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFiZWw9IkN0c0FsZXJ0V2luZG93Ij4KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLkFsZXJ0V2luZG93VGVzdEFjdGl2aXR5IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIgYW5kcm9pZDp3aW5kb3dTb2Z0SW5wdXRNb2RlPSJzdGF0ZUFsd2F5c1Zpc2libGUiPgotICAgICAgICAgICAgPGludGVudC1maWx0ZXI+Ci0gICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIi8+Ci0gICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiLz4KLSAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KLSAgICAgICAgPC9hY3Rpdml0eT4KLSAgICA8L2FwcGxpY2F0aW9uPgotPC9tYW5pZmVzdD4KLQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvd2luZG93bWFuYWdlci9hbGVydHdpbmRvd2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYWxlcnR3aW5kb3dhcHAvQWxlcnRXaW5kb3dUZXN0QWN0aXZpdHkuamF2YSBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL3dpbmRvd21hbmFnZXIvYWxlcnR3aW5kb3dhcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FsZXJ0d2luZG93YXBwL0FsZXJ0V2luZG93VGVzdEFjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMDA3ZTIuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvd2luZG93bWFuYWdlci9hbGVydHdpbmRvd2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYWxlcnR3aW5kb3dhcHAvQWxlcnRXaW5kb3dUZXN0QWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYWxlcnR3aW5kb3dhcHA7Ci0KLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnNlcnZlci5hbGVydHdpbmRvd2FwcHNkazI1LkFsZXJ0V2luZG93VGVzdEJhc2VBY3Rpdml0eTsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9BUFBMSUNBVElPTl9PVkVSTEFZOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9QSE9ORTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlRZUEVfUFJJT1JJVFlfUEhPTkU7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5UWVBFX1NZU1RFTV9BTEVSVDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlRZUEVfU1lTVEVNX0VSUk9SOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9TWVNURU1fT1ZFUkxBWTsKLQotcHVibGljIGNsYXNzIEFsZXJ0V2luZG93VGVzdEFjdGl2aXR5IGV4dGVuZHMgQWxlcnRXaW5kb3dUZXN0QmFzZUFjdGl2aXR5IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBBTEVSVF9XSU5ET1dfVFlQRVMgPSB7Ci0gICAgICAgICAgICBUWVBFX1BIT05FLAotICAgICAgICAgICAgVFlQRV9QUklPUklUWV9QSE9ORSwKLSAgICAgICAgICAgIFRZUEVfU1lTVEVNX0FMRVJULAotICAgICAgICAgICAgVFlQRV9TWVNURU1fRVJST1IsCi0gICAgICAgICAgICBUWVBFX1NZU1RFTV9PVkVSTEFZLAotICAgICAgICAgICAgVFlQRV9BUFBMSUNBVElPTl9PVkVSTEFZCi0gICAgfTsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKLSAgICAgICAgY3JlYXRlQWxsQWxlcnRXaW5kb3dzKGdldFBhY2thZ2VOYW1lKCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBpbnRbXSBnZXRBbGVydFdpbmRvd1R5cGVzKCkgewotICAgICAgICByZXR1cm4gQUxFUlRfV0lORE9XX1RZUEVTOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL3dpbmRvd21hbmFnZXIvYWxlcnR3aW5kb3dhcHBzZGsyNS9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvd2luZG93bWFuYWdlci9hbGVydHdpbmRvd2FwcHNkazI1L0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNDZjOTQuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvd2luZG93bWFuYWdlci9hbGVydHdpbmRvd2FwcHNkazI1L0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLSMgRG9uJ3QgaW5jbHVkZSB0aGlzIHBhY2thZ2UgaW4gYW55IHRhcmdldC4KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSBcCi0gICAgJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpIFwKLQotTE9DQUxfU0RLX1ZFUlNJT04gOj0gMjUKLQotIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKLQotTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0RldmljZUFsZXJ0V2luZG93VGVzdEFwcFNkazI1Ci0KLWluY2x1ZGUgJChCVUlMRF9DVFNfU1VQUE9SVF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvd2luZG93bWFuYWdlci9hbGVydHdpbmRvd2FwcHNkazI1L0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci93aW5kb3dtYW5hZ2VyL2FsZXJ0d2luZG93YXBwc2RrMjUvQW5kcm9pZE1hbmlmZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWZjODBlYS4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci93aW5kb3dtYW5hZ2VyL2FsZXJ0d2luZG93YXBwc2RrMjUvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tCi0gIH4gQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAgfgotICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKLSAgLS0+Ci0KLTxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgICAgcGFja2FnZT0iYW5kcm9pZC5zZXJ2ZXIuYWxlcnR3aW5kb3dhcHBzZGsyNSI+Ci0gICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5TWVNURU1fQUxFUlRfV0lORE9XIiAvPgotCi0gICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFiZWw9IkN0c0FsZXJ0V2luZG93U2RrMjUiPgotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuQWxlcnRXaW5kb3dUZXN0QWN0aXZpdHlTZGsyNSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiIGFuZHJvaWQ6d2luZG93U29mdElucHV0TW9kZT0ic3RhdGVBbHdheXNWaXNpYmxlIj4KLSAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgotICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIvPgotICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIi8+Ci0gICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+Ci0gICAgICAgIDwvYWN0aXZpdHk+Ci0gICAgPC9hcHBsaWNhdGlvbj4KLTwvbWFuaWZlc3Q+Ci0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL3dpbmRvd21hbmFnZXIvYWxlcnR3aW5kb3dhcHBzZGsyNS9zcmMvYW5kcm9pZC9zZXJ2ZXIvYWxlcnR3aW5kb3dhcHBzZGsyNS9BbGVydFdpbmRvd1Rlc3RBY3Rpdml0eVNkazI1LmphdmEgYi9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci93aW5kb3dtYW5hZ2VyL2FsZXJ0d2luZG93YXBwc2RrMjUvc3JjL2FuZHJvaWQvc2VydmVyL2FsZXJ0d2luZG93YXBwc2RrMjUvQWxlcnRXaW5kb3dUZXN0QWN0aXZpdHlTZGsyNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDY4NzlmLi4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL3dpbmRvd21hbmFnZXIvYWxlcnR3aW5kb3dhcHBzZGsyNS9zcmMvYW5kcm9pZC9zZXJ2ZXIvYWxlcnR3aW5kb3dhcHBzZGsyNS9BbGVydFdpbmRvd1Rlc3RBY3Rpdml0eVNkazI1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuc2VydmVyLmFsZXJ0d2luZG93YXBwc2RrMjU7Ci0KLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9QSE9ORTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlRZUEVfUFJJT1JJVFlfUEhPTkU7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5UWVBFX1NZU1RFTV9BTEVSVDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlRZUEVfU1lTVEVNX0VSUk9SOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9TWVNURU1fT1ZFUkxBWTsKLQotcHVibGljIGNsYXNzIEFsZXJ0V2luZG93VGVzdEFjdGl2aXR5U2RrMjUgZXh0ZW5kcyBBbGVydFdpbmRvd1Rlc3RCYXNlQWN0aXZpdHkgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIEFMRVJUX1dJTkRPV19UWVBFUyA9IHsKLSAgICAgICAgICAgIFRZUEVfUEhPTkUsCi0gICAgICAgICAgICBUWVBFX1BSSU9SSVRZX1BIT05FLAotICAgICAgICAgICAgVFlQRV9TWVNURU1fQUxFUlQsCi0gICAgICAgICAgICBUWVBFX1NZU1RFTV9FUlJPUiwKLSAgICAgICAgICAgIFRZUEVfU1lTVEVNX09WRVJMQVkKLSAgICB9OwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOwotICAgICAgICBjcmVhdGVBbGxBbGVydFdpbmRvd3MoZ2V0UGFja2FnZU5hbWUoKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGludFtdIGdldEFsZXJ0V2luZG93VHlwZXMoKSB7Ci0gICAgICAgIHJldHVybiBBTEVSVF9XSU5ET1dfVFlQRVM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvd2luZG93bWFuYWdlci9hbGVydHdpbmRvd2FwcHNkazI1L3NyYy9hbmRyb2lkL3NlcnZlci9hbGVydHdpbmRvd2FwcHNkazI1L0FsZXJ0V2luZG93VGVzdEJhc2VBY3Rpdml0eS5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvd2luZG93bWFuYWdlci9hbGVydHdpbmRvd2FwcHNkazI1L3NyYy9hbmRyb2lkL3NlcnZlci9hbGVydHdpbmRvd2FwcHNkazI1L0FsZXJ0V2luZG93VGVzdEJhc2VBY3Rpdml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDBkYWQwLi4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL3dpbmRvd21hbmFnZXIvYWxlcnR3aW5kb3dhcHBzZGsyNS9zcmMvYW5kcm9pZC9zZXJ2ZXIvYWxlcnR3aW5kb3dhcHBzZGsyNS9BbGVydFdpbmRvd1Rlc3RCYXNlQWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYWxlcnR3aW5kb3dhcHBzZGsyNTsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwotCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5HcmF2aXR5LkxFRlQ7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5HcmF2aXR5LlRPUDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX0ZPQ1VTQUJMRTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX1RPVUNIQUJMRTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfV0FUQ0hfT1VUU0lERV9UT1VDSDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFsZXJ0V2luZG93VGVzdEJhc2VBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKLQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUFsbEFsZXJ0V2luZG93cyhTdHJpbmcgd2luZG93TmFtZSkgewotICAgICAgICBmaW5hbCBpbnRbXSBhbGVydFdpbmRvd1R5cGVzID0gZ2V0QWxlcnRXaW5kb3dUeXBlcygpOwotICAgICAgICBmb3IgKGludCB0eXBlIDogYWxlcnRXaW5kb3dUeXBlcykgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjcmVhdGVBbGVydFdpbmRvdyh0eXBlLCB3aW5kb3dOYW1lKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoIkFsZXJ0V2luZG93VGVzdEJhc2VBY3Rpdml0eSIsICJDYW4ndCBjcmVhdGUgdHlwZT0iICsgdHlwZSwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBbGVydFdpbmRvdyhpbnQgdHlwZSkgewotICAgICAgICBjcmVhdGVBbGVydFdpbmRvdyh0eXBlLCBnZXRQYWNrYWdlTmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBbGVydFdpbmRvdyhpbnQgdHlwZSwgU3RyaW5nIHdpbmRvd05hbWUpIHsKLSAgICAgICAgaWYgKCFpc1N5c3RlbUFsZXJ0V2luZG93VHlwZSh0eXBlKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiV2VsbC4uLnlvdSBhcmUgbm90IGFuIGFsZXJ0IHdpbmRvdyB0eXBlPSIgKyB0eXBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIFBvaW50IHNpemUgPSBuZXcgUG9pbnQoKTsKLSAgICAgICAgZmluYWwgV2luZG93TWFuYWdlciB3bSA9IGdldFN5c3RlbVNlcnZpY2UoV2luZG93TWFuYWdlci5jbGFzcyk7Ci0gICAgICAgIHdtLmdldERlZmF1bHREaXNwbGF5KCkuZ2V0U2l6ZShzaXplKTsKLQotICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBwYXJhbXMgPSBuZXcgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMoCi0gICAgICAgICAgICAgICAgdHlwZSwgRkxBR19OT1RfRk9DVVNBQkxFIHwgRkxBR19XQVRDSF9PVVRTSURFX1RPVUNIIHwgRkxBR19OT1RfVE9VQ0hBQkxFKTsKLSAgICAgICAgcGFyYW1zLndpZHRoID0gc2l6ZS54IC8gMzsKLSAgICAgICAgcGFyYW1zLmhlaWdodCA9IHNpemUueSAvIDM7Ci0gICAgICAgIHBhcmFtcy5ncmF2aXR5ID0gVE9QIHwgTEVGVDsKLSAgICAgICAgcGFyYW1zLnNldFRpdGxlKHdpbmRvd05hbWUpOwotCi0gICAgICAgIGZpbmFsIFRleHRWaWV3IHZpZXcgPSBuZXcgVGV4dFZpZXcodGhpcyk7Ci0gICAgICAgIHZpZXcuc2V0VGV4dCh3aW5kb3dOYW1lICsgIiAgIHR5cGU9IiArIHR5cGUpOwotICAgICAgICB2aWV3LnNldEJhY2tncm91bmRDb2xvcihDb2xvci5SRUQpOwotICAgICAgICB3bS5hZGRWaWV3KHZpZXcsIHBhcmFtcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzU3lzdGVtQWxlcnRXaW5kb3dUeXBlKGludCB0eXBlKSB7Ci0gICAgICAgIGZpbmFsIGludFtdIGFsZXJ0V2luZG93VHlwZXMgPSBnZXRBbGVydFdpbmRvd1R5cGVzKCk7Ci0gICAgICAgIGZvciAoaW50IGN1cnJlbnQgOiBhbGVydFdpbmRvd1R5cGVzKSB7Ci0gICAgICAgICAgICBpZiAoY3VycmVudCA9PSB0eXBlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBpbnRbXSBnZXRBbGVydFdpbmRvd1R5cGVzKCk7Ci19CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci93aW5kb3dtYW5hZ2VyL2RuZHNvdXJjZWFwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvd2luZG93bWFuYWdlci9kbmRzb3VyY2VhcHAvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJhMDRlZC4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci93aW5kb3dtYW5hZ2VyL2RuZHNvdXJjZWFwcC9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi0jIERvbid0IGluY2x1ZGUgdGhpcyBwYWNrYWdlIGluIGFueSB0YXJnZXQuCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotCi1MT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCi0KLUxPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKLQotIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKLQotTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0RyYWdBbmREcm9wU291cmNlQXBwCi0KLWluY2x1ZGUgJChCVUlMRF9DVFNfU1VQUE9SVF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvd2luZG93bWFuYWdlci9kbmRzb3VyY2VhcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL3dpbmRvd21hbmFnZXIvZG5kc291cmNlYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NmE5NzkuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvd2luZG93bWFuYWdlci9kbmRzb3VyY2VhcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIHBhY2thZ2U9ImFuZHJvaWQud20uY3RzLmRuZHNvdXJjZWFwcCI+Ci0gICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFiZWw9IkN0c0RuRFNvdXJjZSI+Ci0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQud20uY3RzLmRuZHNvdXJjZWFwcC5EcmFnU291cmNlIj4KLSAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgotICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIvPgotICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIi8+Ci0gICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+Ci0gICAgICAgIDwvYWN0aXZpdHk+Ci0KLSAgICAgICAgPHByb3ZpZGVyIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC53bS5jdHMuZG5kc291cmNlYXBwLkRyYWdTb3VyY2VDb250ZW50UHJvdmlkZXIiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmF1dGhvcml0aWVzPSJhbmRyb2lkLndtLmN0cy5kbmRzb3VyY2UuY29udGVudHByb3ZpZGVyIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmFudFVyaVBlcm1pc3Npb25zPSJ0cnVlIi8+Ci0gICAgPC9hcHBsaWNhdGlvbj4KLTwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci93aW5kb3dtYW5hZ2VyL2RuZHNvdXJjZWFwcC9zcmMvYW5kcm9pZC93bS9jdHMvZG5kc291cmNlYXBwL0RyYWdTb3VyY2UuamF2YSBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL3dpbmRvd21hbmFnZXIvZG5kc291cmNlYXBwL3NyYy9hbmRyb2lkL3dtL2N0cy9kbmRzb3VyY2VhcHAvRHJhZ1NvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2I3YjhiLi4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL3dpbmRvd21hbmFnZXIvZG5kc291cmNlYXBwL3NyYy9hbmRyb2lkL3dtL2N0cy9kbmRzb3VyY2VhcHAvRHJhZ1NvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQud20uY3RzLmRuZHNvdXJjZWFwcDsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5DbGlwRGF0YTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ2xpcERlc2NyaXB0aW9uOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5GaWxlVXJpRXhwb3NlZEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLlBlcnNpc3RhYmxlQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1wdWJsaWMgY2xhc3MgRHJhZ1NvdXJjZSBleHRlbmRzIEFjdGl2aXR5ewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkRyYWdTb3VyY2UiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9LRVlfU1RBUlRfRFJBRyA9ICJTVEFSVF9EUkFHIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVUxUX0tFWV9ERVRBSUxTID0gIkRFVEFJTFMiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRfT0sgPSAiT0siOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRfRVhDRVBUSU9OID0gIkV4Y2VwdGlvbiI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJX1BSRUZJWCA9Ci0gICAgICAgICAgICAiY29udGVudDovLyIgKyBEcmFnU291cmNlQ29udGVudFByb3ZpZGVyLkFVVEhPUklUWSArICIvZGF0YSI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFHSUNfVkFMVUUgPSAiNDIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVElNRU9VVF9DQU5DRUwgPSAxNTA7Ci0KLSAgICBwcml2YXRlIFRleHRWaWV3IG1UZXh0VmlldzsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLQotICAgICAgICBWaWV3IHZpZXcgPSBnZXRMYXlvdXRJbmZsYXRlcigpLmluZmxhdGUoUi5sYXlvdXQuc291cmNlX2FjdGl2aXR5LCBudWxsKTsKLSAgICAgICAgc2V0Q29udGVudFZpZXcodmlldyk7Ci0KLSAgICAgICAgZmluYWwgVXJpIHBsYWluVXJpID0gVXJpLnBhcnNlKFVSSV9QUkVGSVggKyAiLyIgKyBNQUdJQ19WQUxVRSk7Ci0KLSAgICAgICAgc2V0VXBEcmFnU291cmNlKCJkaXNhbGxvd19nbG9iYWwiLCBwbGFpblVyaSwgMCk7Ci0gICAgICAgIHNldFVwRHJhZ1NvdXJjZSgiY2FuY2VsX3Nvb24iLCBwbGFpblVyaSwgVmlldy5EUkFHX0ZMQUdfR0xPQkFMKTsKLQotICAgICAgICBzZXRVcERyYWdTb3VyY2UoImdyYW50X25vbmUiLCBwbGFpblVyaSwgVmlldy5EUkFHX0ZMQUdfR0xPQkFMKTsKLSAgICAgICAgc2V0VXBEcmFnU291cmNlKCJncmFudF9yZWFkIiwgcGxhaW5VcmksCi0gICAgICAgICAgICAgICAgVmlldy5EUkFHX0ZMQUdfR0xPQkFMIHwgVmlldy5EUkFHX0ZMQUdfR0xPQkFMX1VSSV9SRUFEKTsKLSAgICAgICAgc2V0VXBEcmFnU291cmNlKCJncmFudF93cml0ZSIsIHBsYWluVXJpLAotICAgICAgICAgICAgICAgIFZpZXcuRFJBR19GTEFHX0dMT0JBTCB8IFZpZXcuRFJBR19GTEFHX0dMT0JBTF9VUklfV1JJVEUpOwotICAgICAgICBzZXRVcERyYWdTb3VyY2UoImdyYW50X3JlYWRfcGVyc2lzdGFibGUiLCBwbGFpblVyaSwKLSAgICAgICAgICAgICAgICBWaWV3LkRSQUdfRkxBR19HTE9CQUwgfCBWaWV3LkRSQUdfRkxBR19HTE9CQUxfVVJJX1JFQUQgfAotICAgICAgICAgICAgICAgICAgICAgICAgVmlldy5EUkFHX0ZMQUdfR0xPQkFMX1BFUlNJU1RBQkxFX1VSSV9QRVJNSVNTSU9OKTsKLQotICAgICAgICBmaW5hbCBVcmkgcHJlZml4VXJpID0gVXJpLnBhcnNlKFVSSV9QUkVGSVgpOwotCi0gICAgICAgIHNldFVwRHJhZ1NvdXJjZSgiZ3JhbnRfcmVhZF9wcmVmaXgiLCBwcmVmaXhVcmksCi0gICAgICAgICAgICAgICAgVmlldy5EUkFHX0ZMQUdfR0xPQkFMIHwgVmlldy5EUkFHX0ZMQUdfR0xPQkFMX1VSSV9SRUFEIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcuRFJBR19GTEFHX0dMT0JBTF9QUkVGSVhfVVJJX1BFUk1JU1NJT04pOwotICAgICAgICBzZXRVcERyYWdTb3VyY2UoImdyYW50X3JlYWRfbm9wcmVmaXgiLCBwcmVmaXhVcmksCi0gICAgICAgICAgICAgICAgVmlldy5EUkFHX0ZMQUdfR0xPQkFMIHwgVmlldy5EUkFHX0ZMQUdfR0xPQkFMX1VSSV9SRUFEKTsKLQotICAgICAgICBmaW5hbCBVcmkgZmlsZVVyaSA9IFVyaS5mcm9tRmlsZShuZXcgRmlsZSgiL3NkY2FyZC9zYW1wbGUuanBnIikpOwotCi0gICAgICAgIHNldFVwRHJhZ1NvdXJjZSgiZmlsZV9sb2NhbCIsIGZpbGVVcmksIDApOwotICAgICAgICBzZXRVcERyYWdTb3VyY2UoImZpbGVfZ2xvYmFsIiwgZmlsZVVyaSwgVmlldy5EUkFHX0ZMQUdfR0xPQkFMKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0VXBEcmFnU291cmNlKFN0cmluZyBtb2RlLCBmaW5hbCBVcmkgdXJpLCBmaW5hbCBpbnQgZmxhZ3MpIHsKLSAgICAgICAgaWYgKCFtb2RlLmVxdWFscyhnZXRJbnRlbnQoKS5nZXRTdHJpbmdFeHRyYSgibW9kZSIpKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1UZXh0VmlldyA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuZHJhZ19zb3VyY2UpOwotICAgICAgICBtVGV4dFZpZXcuc2V0VGV4dChtb2RlKTsKLSAgICAgICAgbVRleHRWaWV3LnNldE9uVG91Y2hMaXN0ZW5lcihuZXcgVmlldy5PblRvdWNoTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2goVmlldyB2LCBNb3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIGlmIChldmVudC5nZXRBY3Rpb24oKSAhPSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIENsaXBEZXNjcmlwdGlvbiBjbGlwRGVzY3JpcHRpb24gPSBuZXcgQ2xpcERlc2NyaXB0aW9uKCIiLCBuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaXBEZXNjcmlwdGlvbi5NSU1FVFlQRV9URVhUX1VSSUxJU1QgfSk7Ci0gICAgICAgICAgICAgICAgICAgIFBlcnNpc3RhYmxlQnVuZGxlIGV4dHJhcyA9IG5ldyBQZXJzaXN0YWJsZUJ1bmRsZSgxKTsKLSAgICAgICAgICAgICAgICAgICAgZXh0cmFzLnB1dFN0cmluZygiZXh0cmFLZXkiLCAiZXh0cmFWYWx1ZSIpOwotICAgICAgICAgICAgICAgICAgICBjbGlwRGVzY3JpcHRpb24uc2V0RXh0cmFzKGV4dHJhcyk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIENsaXBEYXRhIGNsaXBEYXRhID0gbmV3IENsaXBEYXRhKGNsaXBEZXNjcmlwdGlvbiwgbmV3IENsaXBEYXRhLkl0ZW0odXJpKSk7Ci0gICAgICAgICAgICAgICAgICAgIHYuc3RhcnREcmFnQW5kRHJvcCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVmlldy5EcmFnU2hhZG93QnVpbGRlcih2KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLSAgICAgICAgICAgICAgICAgICAgbG9nUmVzdWx0KFJFU1VMVF9LRVlfU1RBUlRfRFJBRywgUkVTVUxUX09LKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChGaWxlVXJpRXhwb3NlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ1Jlc3VsdChSRVNVTFRfS0VZX0RFVEFJTFMsIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgbG9nUmVzdWx0KFJFU1VMVF9LRVlfU1RBUlRfRFJBRywgUkVTVUxUX0VYQ0VQVElPTik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtb2RlLmVxdWFscygiY2FuY2VsX3Nvb24iKSkgewotICAgICAgICAgICAgICAgICAgICBuZXcgSGFuZGxlcigpLnBvc3REZWxheWVkKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYuY2FuY2VsRHJhZ0FuZERyb3AoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSwgVElNRU9VVF9DQU5DRUwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGxvZ1Jlc3VsdChTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgTG9nLmkoTE9HX1RBRywga2V5ICsgIj0iICsgdmFsdWUpOwotICAgICAgICBtVGV4dFZpZXcuc2V0VGV4dChtVGV4dFZpZXcuZ2V0VGV4dCgpICsgIlxuIiArIGtleSArICI9IiArIHZhbHVlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci93aW5kb3dtYW5hZ2VyL2RuZHNvdXJjZWFwcC9zcmMvYW5kcm9pZC93bS9jdHMvZG5kc291cmNlYXBwL0RyYWdTb3VyY2VDb250ZW50UHJvdmlkZXIuamF2YSBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL3dpbmRvd21hbmFnZXIvZG5kc291cmNlYXBwL3NyYy9hbmRyb2lkL3dtL2N0cy9kbmRzb3VyY2VhcHAvRHJhZ1NvdXJjZUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmE5NGFhLi4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL3dpbmRvd21hbmFnZXIvZG5kc291cmNlYXBwL3NyYy9hbmRyb2lkL3dtL2N0cy9kbmRzb3VyY2VhcHAvRHJhZ1NvdXJjZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC53bS5jdHMuZG5kc291cmNlYXBwOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuVXJpTWF0Y2hlcjsKLWltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci0KLXB1YmxpYyBjbGFzcyBEcmFnU291cmNlQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgQ29udGVudFByb3ZpZGVyIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVEhPUklUWSA9ICJhbmRyb2lkLndtLmN0cy5kbmRzb3VyY2UuY29udGVudHByb3ZpZGVyIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVyaU1hdGNoZXIgc01hdGNoZXIgPSBuZXcgVXJpTWF0Y2hlcihVcmlNYXRjaGVyLk5PX01BVENIKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVUklfREFUQSA9IDE7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBzTWF0Y2hlci5hZGRVUkkoQVVUSE9SSVRZLCAiZGF0YS8jIiwgVVJJX0RBVEEpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEN1cnNvciBxdWVyeShVcmkgdXJpLCBTdHJpbmdbXSBwcm9qZWN0aW9uLCBTdHJpbmcgc2VsZWN0aW9uLCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNvcnRPcmRlcikgewotICAgICAgICBzd2l0Y2ggKHNNYXRjaGVyLm1hdGNoKHVyaSkpIHsKLSAgICAgICAgICAgIGNhc2UgVVJJX0RBVEE6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEcmFnU291cmNlQ3Vyc29yKHVyaS5nZXRMYXN0UGF0aFNlZ21lbnQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRUeXBlKFVyaSB1cmkpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFVyaSBpbnNlcnQoVXJpIHVyaSwgQ29udGVudFZhbHVlcyB2YWx1ZXMpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBkZWxldGUoVXJpIHVyaSwgU3RyaW5nIHNlbGVjdGlvbiwgU3RyaW5nW10gc2VsZWN0aW9uQXJncykgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IHVwZGF0ZShVcmkgdXJpLCBDb250ZW50VmFsdWVzIHZhbHVlcywgU3RyaW5nIHNlbGVjdGlvbiwgU3RyaW5nW10gc2VsZWN0aW9uQXJncykgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci93aW5kb3dtYW5hZ2VyL2RuZHNvdXJjZWFwcC9zcmMvYW5kcm9pZC93bS9jdHMvZG5kc291cmNlYXBwL0RyYWdTb3VyY2VDdXJzb3IuamF2YSBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL3dpbmRvd21hbmFnZXIvZG5kc291cmNlYXBwL3NyYy9hbmRyb2lkL3dtL2N0cy9kbmRzb3VyY2VhcHAvRHJhZ1NvdXJjZUN1cnNvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTRkZjY1Li4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL3dpbmRvd21hbmFnZXIvZG5kc291cmNlYXBwL3NyYy9hbmRyb2lkL3dtL2N0cy9kbmRzb3VyY2VhcHAvRHJhZ1NvdXJjZUN1cnNvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC53bS5jdHMuZG5kc291cmNlYXBwOwotCi1pbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5BYnN0cmFjdEN1cnNvcjsKLQotcHVibGljIGNsYXNzIERyYWdTb3VyY2VDdXJzb3IgZXh0ZW5kcyBBYnN0cmFjdEN1cnNvciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9LRVkgPSAia2V5IjsKLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1WYWx1ZTsKLQotICAgIHB1YmxpYyBEcmFnU291cmNlQ3Vyc29yKFN0cmluZyB2YWx1ZSkgewotICAgICAgICBtVmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldENvdW50KCkgewotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q29sdW1uTmFtZXMoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10ge0NPTFVNTl9LRVl9OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKGludCBjb2x1bW4pIHsKLSAgICAgICAgaWYgKGdldFBvc2l0aW9uKCkgIT0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW5jb3JyZWN0IHBvc2l0aW9uOiAiICsgZ2V0UG9zaXRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbHVtbiAhPSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbmNvcnJlY3QgY29sdW1uOiAiICsgY29sdW1uKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbVZhbHVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBzaG9ydCBnZXRTaG9ydChpbnQgY29sdW1uKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0SW50KGludCBjb2x1bW4pIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGxvbmcgZ2V0TG9uZyhpbnQgY29sdW1uKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmbG9hdCBnZXRGbG9hdChpbnQgY29sdW1uKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBkb3VibGUgZ2V0RG91YmxlKGludCBjb2x1bW4pIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNOdWxsKGludCBjb2x1bW4pIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL3dpbmRvd21hbmFnZXIvZG5kdGFyZ2V0YXBwL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci93aW5kb3dtYW5hZ2VyL2RuZHRhcmdldGFwcC9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjQzYThiLi4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL3dpbmRvd21hbmFnZXIvZG5kdGFyZ2V0YXBwL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLSMgRG9uJ3QgaW5jbHVkZSB0aGlzIHBhY2thZ2UgaW4gYW55IHRhcmdldC4KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKLQotTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAotCi0jIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0Ci1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cwotCi1MT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzRHJhZ0FuZERyb3BUYXJnZXRBcHAKLQotaW5jbHVkZSAkKEJVSUxEX0NUU19TVVBQT1JUX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci93aW5kb3dtYW5hZ2VyL2RuZHRhcmdldGFwcC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvd2luZG93bWFuYWdlci9kbmR0YXJnZXRhcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ3YjljMi4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci93aW5kb3dtYW5hZ2VyL2RuZHRhcmdldGFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgcGFja2FnZT0iYW5kcm9pZC53bS5jdHMuZG5kdGFyZ2V0YXBwIj4KLSAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpsYWJlbD0iQ3RzRG5EVGFyZ2V0Ij4KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC53bS5jdHMuZG5kdGFyZ2V0YXBwLkRyb3BUYXJnZXQiPgotICAgICAgICAgICAgPGludGVudC1maWx0ZXI+Ci0gICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIi8+Ci0gICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiLz4KLSAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KLSAgICAgICAgPC9hY3Rpdml0eT4KLSAgICA8L2FwcGxpY2F0aW9uPgotPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL3dpbmRvd21hbmFnZXIvZG5kdGFyZ2V0YXBwL3NyYy9hbmRyb2lkL3dtL2N0cy9kbmR0YXJnZXRhcHAvRHJvcFRhcmdldC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvd2luZG93bWFuYWdlci9kbmR0YXJnZXRhcHAvc3JjL2FuZHJvaWQvd20vY3RzL2RuZHRhcmdldGFwcC9Ecm9wVGFyZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4OTJjNmYuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvd2luZG93bWFuYWdlci9kbmR0YXJnZXRhcHAvc3JjL2FuZHJvaWQvd20vY3RzL2RuZHRhcmdldGFwcC9Ecm9wVGFyZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC53bS5jdHMuZG5kdGFyZ2V0YXBwOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNsaXBEYXRhOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5DbGlwRGVzY3JpcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7Ci1pbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuUGVyc2lzdGFibGVCdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuRHJhZ0FuZERyb3BQZXJtaXNzaW9uczsKLWltcG9ydCBhbmRyb2lkLnZpZXcuRHJhZ0V2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwotCi1wdWJsaWMgY2xhc3MgRHJvcFRhcmdldCBleHRlbmRzIEFjdGl2aXR5IHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkRyb3BUYXJnZXQiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9LRVlfRFJBR19TVEFSVEVEID0gIkRSQUdfU1RBUlRFRCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9LRVlfRFJBR19FTkRFRCA9ICJEUkFHX0VOREVEIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVUxUX0tFWV9FWFRSQVMgPSAiRVhUUkFTIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVUxUX0tFWV9EUk9QX1JFU1VMVCA9ICJEUk9QIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVUxUX0tFWV9ERVRBSUxTID0gIkRFVEFJTFMiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRfS0VZX0FDQ0VTU19BRlRFUiA9ICJBRlRFUiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9LRVlfQUNDRVNTX0JFRk9SRSA9ICJCRUZPUkUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRfS0VZX0NMSVBfREFUQV9FUlJPUiA9ICJDTElQX0RBVEFfRVJST1IiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRfS0VZX0NMSVBfREVTQ1JfRVJST1IgPSAiQ0xJUF9ERVNDUl9FUlJPUiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9LRVlfTE9DQUxfU1RBVEVfRVJST1IgPSAiTE9DQUxfU1RBVEVfRVJST1IiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVUxUX09LID0gIk9LIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRfRVhDRVBUSU9OID0gIkV4Y2VwdGlvbiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVUxUX01JU1NJTkcgPSAiTUlTU0lORyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVUxUX0xFQUtJTkcgPSAiTEVBS0lORyI7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNQUdJQ19WQUxVRSA9ICI0MiI7Ci0KLSAgICBwcml2YXRlIFRleHRWaWV3IG1UZXh0VmlldzsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLQotICAgICAgICBWaWV3IHZpZXcgPSBnZXRMYXlvdXRJbmZsYXRlcigpLmluZmxhdGUoUi5sYXlvdXQudGFyZ2V0X2FjdGl2aXR5LCBudWxsKTsKLSAgICAgICAgc2V0Q29udGVudFZpZXcodmlldyk7Ci0KLSAgICAgICAgc2V0VXBEcm9wVGFyZ2V0KCJyZXF1ZXN0X25vbmUiLCBuZXcgT25EcmFnVXJpUmVhZExpc3RlbmVyKGZhbHNlKSk7Ci0gICAgICAgIHNldFVwRHJvcFRhcmdldCgicmVxdWVzdF9yZWFkIiwgbmV3IE9uRHJhZ1VyaVJlYWRMaXN0ZW5lcigpKTsKLSAgICAgICAgc2V0VXBEcm9wVGFyZ2V0KCJyZXF1ZXN0X3dyaXRlIiwgbmV3IE9uRHJhZ1VyaVdyaXRlTGlzdGVuZXIoKSk7Ci0gICAgICAgIHNldFVwRHJvcFRhcmdldCgicmVxdWVzdF9yZWFkX25lc3RlZCIsIG5ldyBPbkRyYWdVcmlSZWFkUHJlZml4TGlzdGVuZXIoKSk7Ci0gICAgICAgIHNldFVwRHJvcFRhcmdldCgicmVxdWVzdF90YWtlX3BlcnNpc3RhYmxlIiwgbmV3IE9uRHJhZ1VyaVRha2VQZXJzaXN0YWJsZUxpc3RlbmVyKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRVcERyb3BUYXJnZXQoU3RyaW5nIG1vZGUsIE9uRHJhZ1VyaUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIGlmICghbW9kZS5lcXVhbHMoZ2V0SW50ZW50KCkuZ2V0U3RyaW5nRXh0cmEoIm1vZGUiKSkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtVGV4dFZpZXcgPSAoVGV4dFZpZXcpZmluZFZpZXdCeUlkKFIuaWQuZHJhZ190YXJnZXQpOwotICAgICAgICBtVGV4dFZpZXcuc2V0VGV4dChtb2RlKTsKLSAgICAgICAgbVRleHRWaWV3LnNldE9uRHJhZ0xpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBjaGVja0V4dHJhVmFsdWUoRHJhZ0V2ZW50IGV2ZW50KSB7Ci0gICAgICAgIFBlcnNpc3RhYmxlQnVuZGxlIGV4dHJhcyA9IGV2ZW50LmdldENsaXBEZXNjcmlwdGlvbigpLmdldEV4dHJhcygpOwotICAgICAgICBpZiAoZXh0cmFzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAiTnVsbCI7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWUgPSBleHRyYXMuZ2V0U3RyaW5nKCJleHRyYUtleSIpOwotICAgICAgICBpZiAoImV4dHJhVmFsdWUiLmVxdWFscyh2YWx1ZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBSRVNVTFRfT0s7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBsb2dSZXN1bHQoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIExvZy5pKExPR19UQUcsIGtleSArICI9IiArIHZhbHVlKTsKLSAgICAgICAgbVRleHRWaWV3LnNldFRleHQobVRleHRWaWV3LmdldFRleHQoKSArICJcbiIgKyBrZXkgKyAiPSIgKyB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBhYnN0cmFjdCBjbGFzcyBPbkRyYWdVcmlMaXN0ZW5lciBpbXBsZW1lbnRzIFZpZXcuT25EcmFnTGlzdGVuZXIgewotICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gcmVxdWVzdFBlcm1pc3Npb25zOwotCi0gICAgICAgIHB1YmxpYyBPbkRyYWdVcmlMaXN0ZW5lcihib29sZWFuIHJlcXVlc3RQZXJtaXNzaW9ucykgewotICAgICAgICAgICAgdGhpcy5yZXF1ZXN0UGVybWlzc2lvbnMgPSByZXF1ZXN0UGVybWlzc2lvbnM7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25EcmFnKFZpZXcgdiwgRHJhZ0V2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICBjaGVja0RyYWdFdmVudChldmVudCk7Ci0KLSAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQuZ2V0QWN0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICBjYXNlIERyYWdFdmVudC5BQ1RJT05fRFJBR19TVEFSVEVEOgotICAgICAgICAgICAgICAgICAgICBsb2dSZXN1bHQoUkVTVUxUX0tFWV9EUkFHX1NUQVJURUQsIFJFU1VMVF9PSyk7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ1Jlc3VsdChSRVNVTFRfS0VZX0VYVFJBUywgY2hlY2tFeHRyYVZhbHVlKGV2ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgICAgICAgICAgY2FzZSBEcmFnRXZlbnQuQUNUSU9OX0RSQUdfRU5URVJFRDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIERyYWdFdmVudC5BQ1RJT05fRFJBR19MT0NBVElPTjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIERyYWdFdmVudC5BQ1RJT05fRFJBR19FWElURUQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgICAgICAgICAgY2FzZSBEcmFnRXZlbnQuQUNUSU9OX0RST1A6Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRyeSBhY2Nlc3NpbmcgdGhlIFVyaSB3aXRob3V0IHRoZSBwZXJtaXNzaW9ucyBncmFudC4KLSAgICAgICAgICAgICAgICAgICAgYWNjZXNzQ29udGVudChldmVudCwgUkVTVUxUX0tFWV9BQ0NFU1NfQkVGT1JFLCBmYWxzZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gVHJ5IGFjY2Vzc2luZyB0aGUgVXJpIHdpdGggdGhlIHBlcm1pc3Npb24gZ3JhbnQgKGlmIHJlcXVpcmVkKTsKLSAgICAgICAgICAgICAgICAgICAgYWNjZXNzQ29udGVudChldmVudCwgUkVTVUxUX0tFWV9EUk9QX1JFU1VMVCwgcmVxdWVzdFBlcm1pc3Npb25zKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBUcnkgYWNjZXNzaW5nIHRoZSBVcmkgYWZ0ZXIgdGhlIHBlcm1pc3Npb25zIGhhdmUgYmVlbiByZWxlYXNlZC4KLSAgICAgICAgICAgICAgICAgICAgYWNjZXNzQ29udGVudChldmVudCwgUkVTVUxUX0tFWV9BQ0NFU1NfQUZURVIsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIERyYWdFdmVudC5BQ1RJT05fRFJBR19FTkRFRDoKLSAgICAgICAgICAgICAgICAgICAgbG9nUmVzdWx0KFJFU1VMVF9LRVlfRFJBR19FTkRFRCwgUkVTVUxUX09LKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgYWNjZXNzQ29udGVudChEcmFnRXZlbnQgZXZlbnQsIFN0cmluZyByZXN1bHRLZXksIGJvb2xlYW4gcmVxdWVzdFBlcm1pc3Npb25zKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcmVzdWx0OwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBwcm9jZXNzRHJvcChldmVudCwgcmVxdWVzdFBlcm1pc3Npb25zKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBSRVNVTFRfRVhDRVBUSU9OOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHRLZXkuZXF1YWxzKFJFU1VMVF9LRVlfRFJPUF9SRVNVTFQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ1Jlc3VsdChSRVNVTFRfS0VZX0RFVEFJTFMsIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsb2dSZXN1bHQocmVzdWx0S2V5LCByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcHJvY2Vzc0Ryb3AoRHJhZ0V2ZW50IGV2ZW50LCBib29sZWFuIHJlcXVlc3RQZXJtaXNzaW9ucykgewotICAgICAgICAgICAgZmluYWwgQ2xpcERhdGEgY2xpcERhdGEgPSBldmVudC5nZXRDbGlwRGF0YSgpOwotICAgICAgICAgICAgaWYgKGNsaXBEYXRhID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIk51bGwgQ2xpcERhdGEiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNsaXBEYXRhLmdldEl0ZW1Db3VudCgpID09IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIkVtcHR5IENsaXBEYXRhIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENsaXBEYXRhLkl0ZW0gaXRlbSA9IGNsaXBEYXRhLmdldEl0ZW1BdCgwKTsKLSAgICAgICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIk51bGwgQ2xpcERhdGEuSXRlbSI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBVcmkgdXJpID0gaXRlbS5nZXRVcmkoKTsKLSAgICAgICAgICAgIGlmICh1cmkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiAiTnVsbCBVcmkiOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBEcmFnQW5kRHJvcFBlcm1pc3Npb25zIHBlcm1pc3Npb25zID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChyZXF1ZXN0UGVybWlzc2lvbnMpIHsKLSAgICAgICAgICAgICAgICBwZXJtaXNzaW9ucyA9IHJlcXVlc3REcmFnQW5kRHJvcFBlcm1pc3Npb25zKGV2ZW50KTsKLSAgICAgICAgICAgICAgICBpZiAocGVybWlzc2lvbnMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gIk51bGwgRHJhZ0FuZERyb3BQZXJtaXNzaW9ucyI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiBwcm9jZXNzVXJpKHVyaSk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIGlmIChwZXJtaXNzaW9ucyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zLnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBhYnN0cmFjdCBwcm90ZWN0ZWQgU3RyaW5nIHByb2Nlc3NVcmkoVXJpIHVyaSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrRHJhZ0V2ZW50KERyYWdFdmVudCBldmVudCkgewotICAgICAgICBmaW5hbCBpbnQgYWN0aW9uID0gZXZlbnQuZ2V0QWN0aW9uKCk7Ci0KLSAgICAgICAgLy8gQ2xpcERhdGEgc2hvdWxkIGJlIGF2YWlsYWJsZSBmb3IgQUNUSU9OX0RST1Agb25seS4KLSAgICAgICAgZmluYWwgQ2xpcERhdGEgY2xpcERhdGEgPSBldmVudC5nZXRDbGlwRGF0YSgpOwotICAgICAgICBpZiAoYWN0aW9uID09IERyYWdFdmVudC5BQ1RJT05fRFJPUCkgewotICAgICAgICAgICAgaWYgKGNsaXBEYXRhID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsb2dSZXN1bHQoUkVTVUxUX0tFWV9DTElQX0RBVEFfRVJST1IsIFJFU1VMVF9NSVNTSU5HKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChjbGlwRGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9nUmVzdWx0KFJFU1VMVF9LRVlfQ0xJUF9EQVRBX0VSUk9SLCBSRVNVTFRfTEVBS0lORyArIGFjdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDbGlwRGVzY3JpcHRpb24gc2hvdWxkIGJlIGFsd2F5cyBhdmFpbGFibGUgZXhjZXB0IGZvciBBQ1RJT05fRFJBR19FTkRFRC4KLSAgICAgICAgZmluYWwgQ2xpcERlc2NyaXB0aW9uIGNsaXBEZXNjcmlwdGlvbiA9IGV2ZW50LmdldENsaXBEZXNjcmlwdGlvbigpOwotICAgICAgICBpZiAoYWN0aW9uICE9IERyYWdFdmVudC5BQ1RJT05fRFJBR19FTkRFRCkgewotICAgICAgICAgICAgaWYgKGNsaXBEZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9nUmVzdWx0KFJFU1VMVF9LRVlfQ0xJUF9ERVNDUl9FUlJPUiwgUkVTVUxUX01JU1NJTkcgKyBhY3Rpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGNsaXBEZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9nUmVzdWx0KFJFU1VMVF9LRVlfQ0xJUF9ERVNDUl9FUlJPUiwgUkVTVUxUX0xFQUtJTkcpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTG9jYWwgc3RhdGUgc2hvdWxkIGJlIGFsd2F5cyBudWxsIGZvciBjcm9zcy1hcHAgZHJhZ3MuCi0gICAgICAgIGZpbmFsIE9iamVjdCBsb2NhbFN0YXRlID0gZXZlbnQuZ2V0TG9jYWxTdGF0ZSgpOwotICAgICAgICBpZiAobG9jYWxTdGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBsb2dSZXN1bHQoUkVTVUxUX0tFWV9MT0NBTF9TVEFURV9FUlJPUiwgUkVTVUxUX0xFQUtJTkcgKyBhY3Rpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBPbkRyYWdVcmlSZWFkTGlzdGVuZXIgZXh0ZW5kcyBPbkRyYWdVcmlMaXN0ZW5lciB7Ci0gICAgICAgIE9uRHJhZ1VyaVJlYWRMaXN0ZW5lcihib29sZWFuIHJlcXVlc3RQZXJtaXNzaW9ucykgewotICAgICAgICAgICAgc3VwZXIocmVxdWVzdFBlcm1pc3Npb25zKTsKLSAgICAgICAgfQotCi0gICAgICAgIE9uRHJhZ1VyaVJlYWRMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHN1cGVyKHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBwcm9jZXNzVXJpKFVyaSB1cmkpIHsKLSAgICAgICAgICAgIHJldHVybiBjaGVja1F1ZXJ5UmVzdWx0KHVyaSwgTUFHSUNfVkFMVUUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBjaGVja1F1ZXJ5UmVzdWx0KFVyaSB1cmksIFN0cmluZyBleHBlY3RlZFZhbHVlKSB7Ci0gICAgICAgICAgICBDdXJzb3IgY3Vyc29yID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgY3Vyc29yID0gZ2V0Q29udGVudFJlc29sdmVyKCkucXVlcnkodXJpLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgICAgICBpZiAoY3Vyc29yID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJOdWxsIEN1cnNvciI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGN1cnNvci5tb3ZlVG9Qb3NpdGlvbigwKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBjdXJzb3IuZ2V0U3RyaW5nKDApOwotICAgICAgICAgICAgICAgIGlmICghZXhwZWN0ZWRWYWx1ZS5lcXVhbHModmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAiV3JvbmcgdmFsdWU6ICIgKyB2YWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFJFU1VMVF9PSzsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGN1cnNvci5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgT25EcmFnVXJpV3JpdGVMaXN0ZW5lciBleHRlbmRzIE9uRHJhZ1VyaUxpc3RlbmVyIHsKLSAgICAgICAgT25EcmFnVXJpV3JpdGVMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHN1cGVyKHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBwcm9jZXNzVXJpKFVyaSB1cmkpIHsKLSAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgICAgIHZhbHVlcy5wdXQoImtleSIsIDEwMCk7Ci0gICAgICAgICAgICBnZXRDb250ZW50UmVzb2x2ZXIoKS51cGRhdGUodXJpLCB2YWx1ZXMsIG51bGwsIG51bGwpOwotICAgICAgICAgICAgcmV0dXJuIFJFU1VMVF9PSzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgT25EcmFnVXJpUmVhZFByZWZpeExpc3RlbmVyIGV4dGVuZHMgT25EcmFnVXJpUmVhZExpc3RlbmVyIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBTdHJpbmcgcHJvY2Vzc1VyaShVcmkgdXJpKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmVzdWx0MSA9IHF1ZXJ5UHJlZml4ZWQodXJpLCAiMSIpOwotICAgICAgICAgICAgaWYgKCFyZXN1bHQxLmVxdWFscyhSRVNVTFRfT0spKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmVzdWx0MiA9IHF1ZXJ5UHJlZml4ZWQodXJpLCAiMiIpOwotICAgICAgICAgICAgaWYgKCFyZXN1bHQyLmVxdWFscyhSRVNVTFRfT0spKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcXVlcnlQcmVmaXhlZCh1cmksICIzIik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFN0cmluZyBxdWVyeVByZWZpeGVkKFVyaSB1cmksIFN0cmluZyBzZWxlY3RvcikgewotICAgICAgICAgICAgZmluYWwgVXJpIHByZWZpeGVkVXJpID0gVXJpLnBhcnNlKHVyaS50b1N0cmluZygpICsgIi8iICsgc2VsZWN0b3IpOwotICAgICAgICAgICAgcmV0dXJuIGNoZWNrUXVlcnlSZXN1bHQocHJlZml4ZWRVcmksIHNlbGVjdG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgT25EcmFnVXJpVGFrZVBlcnNpc3RhYmxlTGlzdGVuZXIgZXh0ZW5kcyBPbkRyYWdVcmlMaXN0ZW5lciB7Ci0gICAgICAgIE9uRHJhZ1VyaVRha2VQZXJzaXN0YWJsZUxpc3RlbmVyKCkgewotICAgICAgICAgICAgc3VwZXIodHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBwcm9jZXNzVXJpKFVyaSB1cmkpIHsKLSAgICAgICAgICAgIGdldENvbnRlbnRSZXNvbHZlcigpLnRha2VQZXJzaXN0YWJsZVVyaVBlcm1pc3Npb24oCi0gICAgICAgICAgICAgICAgICAgIHVyaSwgVmlldy5EUkFHX0ZMQUdfR0xPQkFMX1VSSV9SRUFEKTsKLSAgICAgICAgICAgIGdldENvbnRlbnRSZXNvbHZlcigpLnJlbGVhc2VQZXJzaXN0YWJsZVVyaVBlcm1pc3Npb24oCi0gICAgICAgICAgICAgICAgICAgIHVyaSwgVmlldy5EUkFHX0ZMQUdfR0xPQkFMX1VSSV9SRUFEKTsKLSAgICAgICAgICAgIHJldHVybiBSRVNVTFRfT0s7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci93aW5kb3dtYW5hZ2VyL2RuZHRhcmdldGFwcHNkazIzL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci93aW5kb3dtYW5hZ2VyL2RuZHRhcmdldGFwcHNkazIzL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzM2UxYmMuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvd2luZG93bWFuYWdlci9kbmR0YXJnZXRhcHBzZGsyMy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi0jIERvbid0IGluY2x1ZGUgdGhpcyBwYWNrYWdlIGluIGFueSB0YXJnZXQuCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotCi1MT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCi0KLUxPQ0FMX1NES19WRVJTSU9OIDo9IDIzCi0KLSMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCi0KLUxPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNEcmFnQW5kRHJvcFRhcmdldEFwcFNkazIzCi0KLWluY2x1ZGUgJChCVUlMRF9DVFNfU1VQUE9SVF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvd2luZG93bWFuYWdlci9kbmR0YXJnZXRhcHBzZGsyMy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvd2luZG93bWFuYWdlci9kbmR0YXJnZXRhcHBzZGsyMy9BbmRyb2lkTWFuaWZlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTYzNmE4Li4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL3dpbmRvd21hbmFnZXIvZG5kdGFyZ2V0YXBwc2RrMjMvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIHBhY2thZ2U9ImFuZHJvaWQud20uY3RzLmRuZHRhcmdldGFwcHNkazIzIj4KLSAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpsYWJlbD0iQ3RzRG5EVGFyZ2V0Ij4KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC53bS5jdHMuZG5kdGFyZ2V0YXBwc2RrMjMuRHJvcFRhcmdldCI+Ci0gICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KLSAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iLz4KLSAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIvPgotICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgotICAgICAgICA8L2FjdGl2aXR5PgotICAgIDwvYXBwbGljYXRpb24+Ci08L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvd2luZG93bWFuYWdlci9kbmR0YXJnZXRhcHBzZGsyMy9zcmMvYW5kcm9pZC93bS9jdHMvZG5kdGFyZ2V0YXBwc2RrMjMvRHJvcFRhcmdldC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvd2luZG93bWFuYWdlci9kbmR0YXJnZXRhcHBzZGsyMy9zcmMvYW5kcm9pZC93bS9jdHMvZG5kdGFyZ2V0YXBwc2RrMjMvRHJvcFRhcmdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2I3Nzc5Li4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL3dpbmRvd21hbmFnZXIvZG5kdGFyZ2V0YXBwc2RrMjMvc3JjL2FuZHJvaWQvd20vY3RzL2RuZHRhcmdldGFwcHNkazIzL0Ryb3BUYXJnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQud20uY3RzLmRuZHRhcmdldGFwcHNkazIzOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuRHJhZ0V2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwotCi0vKioKLSAqIFRoaXMgYXBwbGljYXRpb24gaXMgY29tcGlsZWQgYWdhaW5zdCBTREsgMjMgYW5kIHVzZWQgdG8gdmVyaWZ5IHRoYXQgYXBwcyB0YXJnZXRpbmcgU0RLIDIzIGFuZAotICogYmVsb3cgZG8gbm90IHJlY2VpdmUgZ2xvYmFsIGRyYWdzLgotICovCi1wdWJsaWMgY2xhc3MgRHJvcFRhcmdldCBleHRlbmRzIEFjdGl2aXR5IHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkRyb3BUYXJnZXQiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9LRVlfRFJBR19TVEFSVEVEID0gIkRSQUdfU1RBUlRFRCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9LRVlfRFJPUF9SRVNVTFQgPSAiRFJPUCI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRfT0sgPSAiT0siOwotCi0gICAgcHJpdmF0ZSBUZXh0VmlldyBtVGV4dFZpZXc7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7Ci0gICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7Ci0KLSAgICAgICAgVmlldyB2aWV3ID0gZ2V0TGF5b3V0SW5mbGF0ZXIoKS5pbmZsYXRlKFIubGF5b3V0LnRhcmdldF9hY3Rpdml0eSwgbnVsbCk7Ci0gICAgICAgIHNldENvbnRlbnRWaWV3KHZpZXcpOwotCi0gICAgICAgIG1UZXh0VmlldyA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuZHJhZ190YXJnZXQpOwotICAgICAgICBtVGV4dFZpZXcuc2V0T25EcmFnTGlzdGVuZXIobmV3IE9uRHJhZ0xpc3RlbmVyKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBsb2dSZXN1bHQoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIFN0cmluZyByZXN1bHQgPSBrZXkgKyAiPSIgKyB2YWx1ZTsKLSAgICAgICAgTG9nLmkoTE9HX1RBRywgcmVzdWx0KTsKLSAgICAgICAgbVRleHRWaWV3LnNldFRleHQocmVzdWx0KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIE9uRHJhZ0xpc3RlbmVyIGltcGxlbWVudHMgVmlldy5PbkRyYWdMaXN0ZW5lciB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkRyYWcoVmlldyB2LCBEcmFnRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQuZ2V0QWN0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICBjYXNlIERyYWdFdmVudC5BQ1RJT05fRFJBR19TVEFSVEVEOgotICAgICAgICAgICAgICAgICAgICBsb2dSZXN1bHQoUkVTVUxUX0tFWV9EUkFHX1NUQVJURUQsIFJFU1VMVF9PSyk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgICAgICAgICAgY2FzZSBEcmFnRXZlbnQuQUNUSU9OX0RSQUdfRU5URVJFRDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIERyYWdFdmVudC5BQ1RJT05fRFJBR19MT0NBVElPTjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIERyYWdFdmVudC5BQ1RJT05fRFJBR19FWElURUQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgICAgICAgICAgY2FzZSBEcmFnRXZlbnQuQUNUSU9OX0RST1A6Ci0gICAgICAgICAgICAgICAgICAgIGxvZ1Jlc3VsdChSRVNVTFRfS0VZX0RST1BfUkVTVUxULCBSRVNVTFRfT0spOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICAgICAgICAgIGNhc2UgRHJhZ0V2ZW50LkFDVElPTl9EUkFHX0VOREVEOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL3dpbmRvd21hbmFnZXIvZnJhbWV0ZXN0YXBwL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci93aW5kb3dtYW5hZ2VyL2ZyYW1ldGVzdGFwcC9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmU4MmQzLi4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL3dpbmRvd21hbmFnZXIvZnJhbWV0ZXN0YXBwL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLSMgRG9uJ3QgaW5jbHVkZSB0aGlzIHBhY2thZ2UgaW4gYW55IHRhcmdldC4KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKLQotTE9DQUxfU0RLX1ZFUlNJT04gOj0gdGVzdF9jdXJyZW50Ci0KLSMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCi0KLUxPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNEZXZpY2VXaW5kb3dGcmFtZXNUZXN0QXBwCi0KLWluY2x1ZGUgJChCVUlMRF9DVFNfU1VQUE9SVF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvd2luZG93bWFuYWdlci9mcmFtZXRlc3RhcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL3dpbmRvd21hbmFnZXIvZnJhbWV0ZXN0YXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdmODk5YzIuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvd2luZG93bWFuYWdlci9mcmFtZXRlc3RhcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgICB4bWxuczphbmRyb2lkcHJ2PSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcHJ2L3Jlcy9hbmRyb2lkIgotICAgICAgICAgIHBhY2thZ2U9ImFuZHJvaWQuc2VydmVyLkZyYW1lVGVzdEFwcCI+Ci0gICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLk1hdGVyaWFsIj4KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLkRpYWxvZ1Rlc3RBY3Rpdml0eSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIgotICAgICAgICAvPgotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuTW92aW5nQ2hpbGRUZXN0QWN0aXZpdHkiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIgotICAgICAgICAvPgotICAgIDwvYXBwbGljYXRpb24+Ci08L21hbmlmZXN0PgotCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci93aW5kb3dtYW5hZ2VyL2ZyYW1ldGVzdGFwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvZnJhbWV0ZXN0YXBwL0RpYWxvZ1Rlc3RBY3Rpdml0eS5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvd2luZG93bWFuYWdlci9mcmFtZXRlc3RhcHAvc3JjL2FuZHJvaWQvc2VydmVyL2ZyYW1ldGVzdGFwcC9EaWFsb2dUZXN0QWN0aXZpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I4NmI1ZS4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci93aW5kb3dtYW5hZ2VyL2ZyYW1ldGVzdGFwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvZnJhbWV0ZXN0YXBwL0RpYWxvZ1Rlc3RBY3Rpdml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuc2VydmVyLkZyYW1lVGVzdEFwcDsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvdzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKLQotcHVibGljIGNsYXNzIERpYWxvZ1Rlc3RBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKLQotICAgIEFsZXJ0RGlhbG9nIG1EaWFsb2c7Ci0gICAgaW50IG1TaXplOwotCi0gICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIG9uU3RvcCgpIHsKLSAgICAgICAgc3VwZXIub25TdG9wKCk7Ci0gICAgICAgIG1EaWFsb2cuZGlzbWlzcygpOwotICAgIH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKLSAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKLSAgICAgICAgc2V0dXBUZXN0KGdldEludGVudCgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0dXBUZXN0KEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgU3RyaW5nIHRlc3RDYXNlID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKAotICAgICAgICAgICAgICAgICJhbmRyb2lkLnNlcnZlci5GcmFtZVRlc3RBcHAuRGlhbG9nVGVzdENhc2UiKTsKLSAgICAgICAgbVNpemUgPSBnZXRTaXplKCk7Ci0gICAgICAgIHN3aXRjaCAodGVzdENhc2UpIHsKLSAgICAgICAgICAgY2FzZSAiTWF0Y2hQYXJlbnQiOiB7Ci0gICAgICAgICAgICAgICB0ZXN0TWF0Y2hQYXJlbnQoKTsKLSAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICB9IGNhc2UgIk1hdGNoUGFyZW50TGF5b3V0SW5PdmVyc2NhbiI6IHsKLSAgICAgICAgICAgICAgIHRlc3RNYXRjaFBhcmVudExheW91dEluT3ZlcnNjYW4oKTsKLSAgICAgICAgICAgfSAgYnJlYWs7Ci0gICAgICAgICAgIGNhc2UgIkV4cGxpY2l0U2l6ZSI6IHsKLSAgICAgICAgICAgICAgIHRlc3RFeHBsaWNpdFNpemUoKTsKLSAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGNhc2UgIkV4cGxpY2l0U2l6ZVRvcExlZnRHcmF2aXR5IjogewotICAgICAgICAgICAgICAgdGVzdEV4cGxpY2l0U2l6ZVRvcExlZnRHcmF2aXR5KCk7Ci0gICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgfQotICAgICAgICAgICBjYXNlICJFeHBsaWNpdFNpemVCb3R0b21SaWdodEdyYXZpdHkiOiB7Ci0gICAgICAgICAgICAgICB0ZXN0RXhwbGljaXRTaXplQm90dG9tUmlnaHRHcmF2aXR5KCk7Ci0gICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgfQotICAgICAgICAgICBjYXNlICJPdmVyc2l6ZWREaW1lbnNpb25zIjogewotICAgICAgICAgICAgICAgdGVzdE92ZXJzaXplZERpbWVuc2lvbnMoKTsKLSAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGNhc2UgIk92ZXJzaXplZERpbWVuc2lvbnNOb0xpbWl0cyI6IHsKLSAgICAgICAgICAgICAgIHRlc3RPdmVyc2l6ZWREaW1lbnNpb25zTm9MaW1pdHMoKTsKLSAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGNhc2UgIkV4cGxpY2l0UG9zaXRpb25NYXRjaFBhcmVudCI6IHsKLSAgICAgICAgICAgICAgIHRlc3RFeHBsaWNpdFBvc2l0aW9uTWF0Y2hQYXJlbnQoKTsKLSAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGNhc2UgIkV4cGxpY2l0UG9zaXRpb25NYXRjaFBhcmVudE5vTGltaXRzIjogewotICAgICAgICAgICAgICAgdGVzdEV4cGxpY2l0UG9zaXRpb25NYXRjaFBhcmVudE5vTGltaXRzKCk7Ci0gICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgfQotICAgICAgICAgICBjYXNlICJOb0ZvY3VzIjogewotICAgICAgICAgICAgICAgdGVzdE5vRm9jdXMoKTsKLSAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGNhc2UgIldpdGhNYXJnaW5zIjogewotICAgICAgICAgICAgICAgdGVzdFdpdGhNYXJnaW5zKCk7Ci0gICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgfQotICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnRlcmZhY2UgRGlhbG9nTGF5b3V0UGFyYW1zVGVzdCB7Ci0gICAgICAgIHZvaWQgZG9TZXR1cChXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZG9MYXlvdXRQYXJhbVRlc3QoRGlhbG9nTGF5b3V0UGFyYW1zVGVzdCB0KSB7Ci0gICAgICAgIG1EaWFsb2cgPSBuZXcgQWxlcnREaWFsb2cuQnVpbGRlcih0aGlzKS5jcmVhdGUoKTsKLQotICAgICAgICBtRGlhbG9nLnNldE1lc3NhZ2UoIlRlc3RpbmcgaXMgZnVuISIpOwotICAgICAgICBtRGlhbG9nLnNldFRpdGxlKCJhbmRyb2lkLnNlcnZlci5GcmFtZVRlc3RBcHAvYW5kcm9pZC5zZXJ2ZXIuRnJhbWVUZXN0QXBwLlRlc3REaWFsb2ciKTsKLSAgICAgICAgbURpYWxvZy5jcmVhdGUoKTsKLQotICAgICAgICBXaW5kb3cgdyA9IG1EaWFsb2cuZ2V0V2luZG93KCk7Ci0gICAgICAgIGZpbmFsIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIHBhcmFtcyA9IHcuZ2V0QXR0cmlidXRlcygpOwotICAgICAgICB0LmRvU2V0dXAocGFyYW1zKTsKLSAgICAgICAgdy5zZXRBdHRyaWJ1dGVzKHBhcmFtcyk7Ci0KLSAgICAgICAgbURpYWxvZy5zaG93KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RNYXRjaFBhcmVudCgpIHsKLSAgICAgICAgZG9MYXlvdXRQYXJhbVRlc3QoKFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIHBhcmFtcykgLT4gewotICAgICAgICAgICAgcGFyYW1zLndpZHRoID0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UOwotICAgICAgICAgICAgcGFyYW1zLmhlaWdodCA9IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVDsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RNYXRjaFBhcmVudExheW91dEluT3ZlcnNjYW4oKSB7Ci0gICAgICAgIGRvTGF5b3V0UGFyYW1UZXN0KChXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBwYXJhbXMpIC0+IHsKLSAgICAgICAgICAgIHBhcmFtcy53aWR0aCA9IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVDsKLSAgICAgICAgICAgIHBhcmFtcy5oZWlnaHQgPSBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQ7Ci0gICAgICAgICAgICBwYXJhbXMuZmxhZ3MgfD0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19MQVlPVVRfSU5fU0NSRUVOOwotICAgICAgICAgICAgcGFyYW1zLmZsYWdzIHw9IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTEFZT1VUX0lOX09WRVJTQ0FOOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdEV4cGxpY2l0U2l6ZSgpIHsKLSAgICAgICAgZG9MYXlvdXRQYXJhbVRlc3QoKFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIHBhcmFtcykgLT4gewotICAgICAgICAgICAgcGFyYW1zLndpZHRoID0gbVNpemU7Ci0gICAgICAgICAgICBwYXJhbXMuaGVpZ2h0ID0gbVNpemU7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0RXhwbGljaXRTaXplVG9wTGVmdEdyYXZpdHkoKSB7Ci0gICAgICAgIGRvTGF5b3V0UGFyYW1UZXN0KChXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBwYXJhbXMpIC0+IHsKLSAgICAgICAgICAgIHBhcmFtcy53aWR0aCA9IG1TaXplOwotICAgICAgICAgICAgcGFyYW1zLmhlaWdodCA9IG1TaXplOwotICAgICAgICAgICAgcGFyYW1zLmdyYXZpdHkgPSBHcmF2aXR5LlRPUCB8IEdyYXZpdHkuTEVGVDsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RFeHBsaWNpdFNpemVCb3R0b21SaWdodEdyYXZpdHkoKSB7Ci0gICAgICAgIGRvTGF5b3V0UGFyYW1UZXN0KChXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBwYXJhbXMpIC0+IHsKLSAgICAgICAgICAgIHBhcmFtcy53aWR0aCA9IG1TaXplOwotICAgICAgICAgICAgcGFyYW1zLmhlaWdodCA9IG1TaXplOwotICAgICAgICAgICAgcGFyYW1zLmdyYXZpdHkgPSBHcmF2aXR5LkJPVFRPTSB8IEdyYXZpdHkuUklHSFQ7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0T3ZlcnNpemVkRGltZW5zaW9ucygpIHsKLSAgICAgICAgZG9MYXlvdXRQYXJhbVRlc3QoKFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIHBhcmFtcykgLT4gewotICAgICAgICAgICAgcGFyYW1zLndpZHRoID0gMTAwMDAwOwotICAgICAgICAgICAgcGFyYW1zLmhlaWdodCA9IDEwMDAwMDsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RPdmVyc2l6ZWREaW1lbnNpb25zTm9MaW1pdHMoKSB7Ci0gICAgICAgIGRvTGF5b3V0UGFyYW1UZXN0KChXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBwYXJhbXMpIC0+IHsKLSAgICAgICAgICAgIHBhcmFtcy53aWR0aCA9IDUwMDA7Ci0gICAgICAgICAgICBwYXJhbXMuaGVpZ2h0ID0gNTAwMDsKLSAgICAgICAgICAgIHBhcmFtcy5mbGFncyB8PSBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0xBWU9VVF9OT19MSU1JVFM7Ci0gICAgICAgICAgICBwYXJhbXMuZ3Jhdml0eSA9IEdyYXZpdHkuTEVGVCB8IEdyYXZpdHkuVE9QOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdEV4cGxpY2l0UG9zaXRpb25NYXRjaFBhcmVudCgpIHsKLSAgICAgICAgZG9MYXlvdXRQYXJhbVRlc3QoKFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIHBhcmFtcykgLT4gewotICAgICAgICAgICAgcGFyYW1zLndpZHRoID0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UOwotICAgICAgICAgICAgcGFyYW1zLmhlaWdodCA9IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVDsKLSAgICAgICAgICAgIHBhcmFtcy54ID0gMTAwOwotICAgICAgICAgICAgcGFyYW1zLnkgPSAxMDA7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0RXhwbGljaXRQb3NpdGlvbk1hdGNoUGFyZW50Tm9MaW1pdHMoKSB7Ci0gICAgICAgIGRvTGF5b3V0UGFyYW1UZXN0KChXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBwYXJhbXMpIC0+IHsKLSAgICAgICAgICAgIHBhcmFtcy53aWR0aCA9IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVDsKLSAgICAgICAgICAgIHBhcmFtcy5oZWlnaHQgPSBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQ7Ci0gICAgICAgICAgICBwYXJhbXMuZ3Jhdml0eSA9IEdyYXZpdHkuTEVGVCB8IEdyYXZpdHkuVE9QOwotICAgICAgICAgICAgcGFyYW1zLmZsYWdzIHw9IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTEFZT1VUX05PX0xJTUlUUzsKLSAgICAgICAgICAgIHBhcmFtcy54ID0gMTAwOwotICAgICAgICAgICAgcGFyYW1zLnkgPSAxMDA7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0Tm9Gb2N1cygpIHsKLSAgICAgICAgZG9MYXlvdXRQYXJhbVRlc3QoKFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIHBhcmFtcykgLT4gewotICAgICAgICAgICAgcGFyYW1zLmZsYWdzIHw9IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX0ZPQ1VTQUJMRTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RXaXRoTWFyZ2lucygpIHsKLSAgICAgICAgZG9MYXlvdXRQYXJhbVRlc3QoKFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIHBhcmFtcykgLT4gewotICAgICAgICAgICAgcGFyYW1zLmdyYXZpdHkgPSBHcmF2aXR5LkxFRlQgfCBHcmF2aXR5LlRPUDsKLSAgICAgICAgICAgIHBhcmFtcy5ob3Jpem9udGFsTWFyZ2luID0gLjI1ZjsKLSAgICAgICAgICAgIHBhcmFtcy52ZXJ0aWNhbE1hcmdpbiA9IC4zNWY7Ci0gICAgICAgICAgICBwYXJhbXMud2lkdGggPSBtU2l6ZTsKLSAgICAgICAgICAgIHBhcmFtcy5oZWlnaHQgPSBtU2l6ZTsKLSAgICAgICAgICAgIHBhcmFtcy54ID0gMDsKLSAgICAgICAgICAgIHBhcmFtcy55ID0gMDsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0U2l6ZSgpIHsKLSAgICAgICAgZmxvYXQgZGVuc2l0eSA9IGdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCkuZGVuc2l0eTsKLSAgICAgICAgcmV0dXJuIGRlbnNpdHkgPiAxLjAgPyAyMDAgOiAoaW50KSgyMDAgKiBkZW5zaXR5KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci93aW5kb3dtYW5hZ2VyL2ZyYW1ldGVzdGFwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvZnJhbWV0ZXN0YXBwL01vdmluZ0NoaWxkVGVzdEFjdGl2aXR5LmphdmEgYi9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci93aW5kb3dtYW5hZ2VyL2ZyYW1ldGVzdGFwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvZnJhbWV0ZXN0YXBwL01vdmluZ0NoaWxkVGVzdEFjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNmY1OTcuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvd2luZG93bWFuYWdlci9mcmFtZXRlc3RhcHAvc3JjL2FuZHJvaWQvc2VydmVyL2ZyYW1ldGVzdGFwcC9Nb3ZpbmdDaGlsZFRlc3RBY3Rpdml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuRnJhbWVUZXN0QXBwOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OwotaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNwYWNlOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwLkxheW91dFBhcmFtczsKLWltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKLQotLy8gVGhpcyBhY3Rpdml0eSB3aWxsIHBhcmVudCBhIENoaWxkIHRvIHRoZSBtYWluIHdpbmRvdywgYW5kIHRoZW4gbW92ZQotLy8gdGhlIG1haW4gd2luZG93IGFyb3VuZC4gV2UgY2FuIHVzZSB0aGlzIHRvIHZlcmlmeSB0aGUgQ2hpbGQKLS8vIGlzIHByb3Blcmx5IHVwZGF0ZWQuCi1wdWJsaWMgY2xhc3MgTW92aW5nQ2hpbGRUZXN0QWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7Ci0gICAgU3BhY2UgbVZpZXc7Ci0gICAgaW50IG1YID0gMDsKLSAgICBpbnQgbVkgPSAwOwotCi0gICAgZmluYWwgUnVubmFibGUgbW92ZVdpbmRvdyA9IG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIGZpbmFsIFdpbmRvdyB3ID0gZ2V0V2luZG93KCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgYXR0cmlicyA9IHcuZ2V0QXR0cmlidXRlcygpOwotICAgICAgICAgICAgICAgIGF0dHJpYnMucHJpdmF0ZUZsYWdzID0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuUFJJVkFURV9GTEFHX05PX01PVkVfQU5JTUFUSU9OOwotICAgICAgICAgICAgICAgIGF0dHJpYnMueCA9IG1YICUgMTAwMDsKLSAgICAgICAgICAgICAgICBhdHRyaWJzLnkgPSBtWSAlIDEwMDA7Ci0gICAgICAgICAgICAgICAgdy5zZXRBdHRyaWJ1dGVzKGF0dHJpYnMpOwotICAgICAgICAgICAgICAgIG1YICs9IDU7Ci0gICAgICAgICAgICAgICAgbVkgKz0gNTsKLSAgICAgICAgICAgICAgICBtVmlldy5wb3N0RGVsYXllZCh0aGlzLCA1MCk7Ci0gICAgICAgICAgICB9Ci0gICAgfTsKLQotICAgIGZpbmFsIFJ1bm5hYmxlIG1ha2VDaGlsZCA9IG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIEJ1dHRvbiBiID0gbmV3IEJ1dHRvbihNb3ZpbmdDaGlsZFRlc3RBY3Rpdml0eS50aGlzKTsKLSAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBwID0gbmV3IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zKAotICAgICAgICAgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9BUFBMSUNBVElPTl9QQU5FTCk7Ci0gICAgICAgICAgICAgICAgcC5wcml2YXRlRmxhZ3MgPSBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5QUklWQVRFX0ZMQUdfTk9fTU9WRV9BTklNQVRJT047Ci0gICAgICAgICAgICAgICAgcC54ID0gMDsKLSAgICAgICAgICAgICAgICBwLnkgPSAwOwotICAgICAgICAgICAgICAgIHAudG9rZW4gPSBtVmlldy5nZXRXaW5kb3dUb2tlbigpOwotICAgICAgICAgICAgICAgIHAuc2V0VGl0bGUoIkNoaWxkV2luZG93Iik7Ci0KLSAgICAgICAgICAgICAgICAoKFdpbmRvd01hbmFnZXIpZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LldJTkRPV19TRVJWSUNFKSkuYWRkVmlldyhiLCBwKTsKLQotICAgICAgICAgICAgICAgIG1WaWV3LnBvc3REZWxheWVkKG1vdmVXaW5kb3csIDUwKTsKLSAgICAgICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOwotCi0gICAgICAgIGZpbmFsIExheW91dFBhcmFtcyBwID0gbmV3IExheW91dFBhcmFtcygxMDAsIDEwMCk7Ci0gICAgICAgIGZpbmFsIFdpbmRvdyB3ID0gZ2V0V2luZG93KCk7Ci0gICAgICAgIHcuc2V0TGF5b3V0KDEwMCwgMTAwKTsKLSAgICAgICAgbVZpZXcgPSBuZXcgU3BhY2UodGhpcyk7Ci0KLSAgICAgICAgc2V0Q29udGVudFZpZXcobVZpZXcsIHApOwotICAgICAgICBtVmlldy5wb3N0KG1ha2VDaGlsZCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvd2luZG93bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0FsZXJ0V2luZG93c1Rlc3RzLmphdmEgYi9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci93aW5kb3dtYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvQWxlcnRXaW5kb3dzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI5MGRkYi4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci93aW5kb3dtYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvQWxlcnRXaW5kb3dzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuc2VydmVyLmN0czsKLQotaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5QcmVzdWJtaXQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLkRldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBCdWlsZDogbW1tYSAtajMyIGN0cy9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzCi0gKiBSdW46IGN0cy9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci91dGlsL3J1bi10ZXN0IEN0c1dpbmRvd01hbmFnZXJIb3N0VGVzdENhc2VzIGFuZHJvaWQuc2VydmVyLmN0cy5BbGVydFdpbmRvd3NUZXN0cwotICovCi1AUHJlc3VibWl0Ci1wdWJsaWMgY2xhc3MgQWxlcnRXaW5kb3dzVGVzdHMgZXh0ZW5kcyBBY3Rpdml0eU1hbmFnZXJUZXN0QmFzZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRV9OQU1FID0gImFuZHJvaWQuc2VydmVyLmFsZXJ0d2luZG93YXBwIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSVZJVFlfTkFNRSA9ICJBbGVydFdpbmRvd1Rlc3RBY3Rpdml0eSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNES18yNV9QQUNLQUdFX05BTUUgPSAiYW5kcm9pZC5zZXJ2ZXIuYWxlcnR3aW5kb3dhcHBzZGsyNSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNES18yNV9BQ1RJVklUWV9OQU1FID0gIkFsZXJ0V2luZG93VGVzdEFjdGl2aXR5U2RrMjUiOwotCi0gICAgLy8gRnJvbSBXaW5kb3dNYW5hZ2VyLmphdmEKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9CQVNFX0FQUExJQ0FUSU9OICAgICAgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGSVJTVF9TWVNURU1fV0lORE9XICAgICAgICA9IDIwMDA7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9QSE9ORSAgICAgICAgICAgICAgICAgPSBGSVJTVF9TWVNURU1fV0lORE9XICsgMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9TWVNURU1fQUxFUlQgICAgICAgICAgPSBGSVJTVF9TWVNURU1fV0lORE9XICsgMzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9TWVNURU1fT1ZFUkxBWSAgICAgICAgPSBGSVJTVF9TWVNURU1fV0lORE9XICsgNjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9QUklPUklUWV9QSE9ORSAgICAgICAgPSBGSVJTVF9TWVNURU1fV0lORE9XICsgNzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9TWVNURU1fRVJST1IgICAgICAgICAgPSBGSVJTVF9TWVNURU1fV0lORE9XICsgMTA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRZUEVfQVBQTElDQVRJT05fT1ZFUkxBWSAgID0gRklSU1RfU1lTVEVNX1dJTkRPVyArIDM4OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRZUEVfU1RBVFVTX0JBUiAgICAgICAgICAgID0gRklSU1RfU1lTVEVNX1dJTkRPVzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9JTlBVVF9NRVRIT0QgICAgICAgICAgPSBGSVJTVF9TWVNURU1fV0lORE9XICsgMTE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRZUEVfTkFWSUdBVElPTl9CQVIgICAgICAgID0gRklSU1RfU1lTVEVNX1dJTkRPVyArIDE5OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0PEludGVnZXI+IG1BbGVydFdpbmRvd1R5cGVzID0gQXJyYXlzLmFzTGlzdCgKLSAgICAgICAgICAgIFRZUEVfUEhPTkUsCi0gICAgICAgICAgICBUWVBFX1BSSU9SSVRZX1BIT05FLAotICAgICAgICAgICAgVFlQRV9TWVNURU1fQUxFUlQsCi0gICAgICAgICAgICBUWVBFX1NZU1RFTV9FUlJPUiwKLSAgICAgICAgICAgIFRZUEVfU1lTVEVNX09WRVJMQVksCi0gICAgICAgICAgICBUWVBFX0FQUExJQ0FUSU9OX09WRVJMQVkpOwotICAgIHByaXZhdGUgZmluYWwgTGlzdDxJbnRlZ2VyPiBtU3lzdGVtV2luZG93VHlwZXMgPSBBcnJheXMuYXNMaXN0KAotICAgICAgICAgICAgVFlQRV9TVEFUVVNfQkFSLAotICAgICAgICAgICAgVFlQRV9JTlBVVF9NRVRIT0QsCi0gICAgICAgICAgICBUWVBFX05BVklHQVRJT05fQkFSKTsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXRBbGVydFdpbmRvd1Blcm1pc3Npb24oUEFDS0FHRV9OQU1FLCBmYWxzZSk7Ci0gICAgICAgICAgICBzZXRBbGVydFdpbmRvd1Blcm1pc3Npb24oU0RLXzI1X1BBQ0tBR0VfTkFNRSwgZmFsc2UpOwotICAgICAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZCgiYW0gZm9yY2Utc3RvcCAiICsgUEFDS0FHRV9OQU1FKTsKLSAgICAgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoImFtIGZvcmNlLXN0b3AgIiArIFNES18yNV9QQUNLQUdFX05BTUUpOwotICAgICAgICB9IGNhdGNoIChEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFsZXJ0V2luZG93QWxsb3dlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBydW5BbGVydFdpbmRvd1Rlc3QoUEFDS0FHRV9OQU1FLCBBQ1RJVklUWV9OQU1FLCB0cnVlIC8qIGhhc0FsZXJ0V2luZG93UGVybWlzc2lvbiAqLywKLSAgICAgICAgICAgICAgICB0cnVlIC8qIGF0TGVhc3RPICovKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWxlcnRXaW5kb3dEaXNhbGxvd2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJ1bkFsZXJ0V2luZG93VGVzdChQQUNLQUdFX05BTUUsIEFDVElWSVRZX05BTUUsIGZhbHNlIC8qIGhhc0FsZXJ0V2luZG93UGVybWlzc2lvbiAqLywKLSAgICAgICAgICAgICAgICB0cnVlIC8qIGF0TGVhc3RPICovKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWxlcnRXaW5kb3dBbGxvd2VkU2RrMjUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcnVuQWxlcnRXaW5kb3dUZXN0KFNES18yNV9QQUNLQUdFX05BTUUsIFNES18yNV9BQ1RJVklUWV9OQU1FLAotICAgICAgICAgICAgICAgIHRydWUgLyogaGFzQWxlcnRXaW5kb3dQZXJtaXNzaW9uICovLCBmYWxzZSAvKiBhdExlYXN0TyAqLyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFsZXJ0V2luZG93RGlzYWxsb3dlZFNkazI1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJ1bkFsZXJ0V2luZG93VGVzdChTREtfMjVfUEFDS0FHRV9OQU1FLCBTREtfMjVfQUNUSVZJVFlfTkFNRSwKLSAgICAgICAgICAgICAgICBmYWxzZSAvKiBoYXNBbGVydFdpbmRvd1Blcm1pc3Npb24gKi8sIGZhbHNlIC8qIGF0TGVhc3RPICovKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcnVuQWxlcnRXaW5kb3dUZXN0KFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGFjdGl2aXR5TmFtZSwKLSAgICAgICAgICAgIGJvb2xlYW4gaGFzQWxlcnRXaW5kb3dQZXJtaXNzaW9uLCBib29sZWFuIGF0TGVhc3RPKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc2V0Q29tcG9uZW50TmFtZShwYWNrYWdlTmFtZSk7Ci0gICAgICAgIHNldEFsZXJ0V2luZG93UGVybWlzc2lvbihwYWNrYWdlTmFtZSwgaGFzQWxlcnRXaW5kb3dQZXJtaXNzaW9uKTsKLQotICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKGdldEFtU3RhcnRDbWQoYWN0aXZpdHlOYW1lKSk7Ci0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIG5ldyBTdHJpbmdbXSB7IGFjdGl2aXR5TmFtZSB9KTsKLSAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KGFjdGl2aXR5TmFtZSwgdHJ1ZSk7Ci0KLSAgICAgICAgYXNzZXJ0QWxlcnRXaW5kb3dzKHBhY2thZ2VOYW1lLCBoYXNBbGVydFdpbmRvd1Blcm1pc3Npb24sIGF0TGVhc3RPKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gYWxsV2luZG93c0hpZGRlbihBcnJheUxpc3Q8V2luZG93TWFuYWdlclN0YXRlLldpbmRvd1N0YXRlPiB3aW5kb3dzKSB7Ci0gICAgICAgIGZvciAoV2luZG93TWFuYWdlclN0YXRlLldpbmRvd1N0YXRlIHdzIDogd2luZG93cykgewotICAgICAgICAgICAgaWYgKHdzLmlzU2hvd24oKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0QWxlcnRXaW5kb3dzKFN0cmluZyBwYWNrYWdlTmFtZSwgYm9vbGVhbiBoYXNBbGVydFdpbmRvd1Blcm1pc3Npb24sCi0gICAgICAgICAgICBib29sZWFuIGF0TGVhc3RPKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgV2luZG93TWFuYWdlclN0YXRlIHdNU3RhdGUgPSBtQW1XbVN0YXRlLmdldFdtU3RhdGUoKTsKLQotICAgICAgICBmaW5hbCBBcnJheUxpc3Q8V2luZG93TWFuYWdlclN0YXRlLldpbmRvd1N0YXRlPiBhbGVydFdpbmRvd3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHdNU3RhdGUuZ2V0V2luZG93c0J5UGFja2FnZU5hbWUocGFja2FnZU5hbWUsIG1BbGVydFdpbmRvd1R5cGVzLCBhbGVydFdpbmRvd3MpOwotCi0gICAgICAgIGlmICghaGFzQWxlcnRXaW5kb3dQZXJtaXNzaW9uKSB7Ci0gICAgICAgICAgICAvLyBXaGVuIHJ1bm5pbmcgaW4gVlIgTW9kZSwgYW4gQXBwIE9wIHJlc3RyaWN0aW9uIGlzCi0gICAgICAgICAgICAvLyBpbiBwbGFjZSBmb3IgU1lTVEVNX0FMRVJUX1dJTkRPVywgd2hpY2ggYWxsb3dzIHRoZSB3aW5kb3cKLSAgICAgICAgICAgIC8vIHRvIGJlIGNyZWF0ZWQsIGJ1dCB3aWxsIGJlIGhpZGRlbiBpbnN0ZWFkLgotICAgICAgICAgICAgaWYgKGlzVWlNb2RlTG9ja2VkVG9WckhlYWRzZXQoKSkgewotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIlNob3VsZCBub3QgYmUgZW1wdHkgYWxlcnRXaW5kb3dzPSIgKyBhbGVydFdpbmRvd3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAhYWxlcnRXaW5kb3dzLmlzRW1wdHkoKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQWxsIGFsZXJ0IHdpbmRvd3Mgc2hvdWxkIGJlIGhpZGRlbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBhbGxXaW5kb3dzSGlkZGVuKGFsZXJ0V2luZG93cykpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJTaG91bGQgYmUgZW1wdHkgYWxlcnRXaW5kb3dzPSIgKyBhbGVydFdpbmRvd3MsIGFsZXJ0V2luZG93cy5pc0VtcHR5KCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGF0TGVhc3RPKSB7Ci0gICAgICAgICAgICAvLyBBc3NlcnQgdGhhdCBvbmx5IFRZUEVfQVBQTElDQVRJT05fT1ZFUkxBWSB3YXMgY3JlYXRlZC4KLSAgICAgICAgICAgIGZvciAoV2luZG93TWFuYWdlclN0YXRlLldpbmRvd1N0YXRlIHdpbiA6IGFsZXJ0V2luZG93cykgewotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkNhbid0IGNyZWF0ZSB3aW49IiArIHdpbiArICIgb24gU0RLIE8gb3IgZ3JlYXRlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICB3aW4uZ2V0VHlwZSgpID09IFRZUEVfQVBQTElDQVRJT05fT1ZFUkxBWSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBXaW5kb3dNYW5hZ2VyU3RhdGUuV2luZG93U3RhdGUgbWFpbkFwcFdpbmRvdyA9Ci0gICAgICAgICAgICAgICAgd01TdGF0ZS5nZXRXaW5kb3dCeVBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lLCBUWVBFX0JBU0VfQVBQTElDQVRJT04pOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwobWFpbkFwcFdpbmRvdyk7Ci0KLSAgICAgICAgd01TdGF0ZS5zb3J0V2luZG93c0J5TGF5ZXIoYWxlcnRXaW5kb3dzKTsKLSAgICAgICAgZmluYWwgV2luZG93TWFuYWdlclN0YXRlLldpbmRvd1N0YXRlIGxvd2VzdEFsZXJ0V2luZG93ID0gYWxlcnRXaW5kb3dzLmdldCgwKTsKLSAgICAgICAgZmluYWwgV2luZG93TWFuYWdlclN0YXRlLldpbmRvd1N0YXRlIGhpZ2hlc3RBbGVydFdpbmRvdyA9Ci0gICAgICAgICAgICAgICAgYWxlcnRXaW5kb3dzLmdldChhbGVydFdpbmRvd3Muc2l6ZSgpIC0gMSk7Ci0KLSAgICAgICAgLy8gQXNzZXJ0IHRoYXQgdGhlIGFsZXJ0IHdpbmRvd3MgaGF2ZSBoaWdoZXIgei1vcmRlciB0aGFuIHRoZSBtYWluIGFwcCB3aW5kb3cKLSAgICAgICAgYXNzZXJ0VHJ1ZSgibG93ZXN0QWxlcnRXaW5kb3c9IiArIGxvd2VzdEFsZXJ0V2luZG93ICsgIiBsZXNzIHRoYW4gbWFpbkFwcFdpbmRvdz0iCi0gICAgICAgICAgICAgICAgICAgICAgICArIG1haW5BcHBXaW5kb3csIGxvd2VzdEFsZXJ0V2luZG93LmdldExheWVyKCkgPiBtYWluQXBwV2luZG93LmdldExheWVyKCkpOwotCi0gICAgICAgIC8vIEFzc2VydCB0aGF0IGxlZ2FjeSBhbGVydCB3aW5kb3dzIGhhdmUgYSBsb3dlciB6LW9yZGVyIHRoYW4gdGhlIG5ldyBhbGVydCB3aW5kb3cgbGF5ZXIuCi0gICAgICAgIGZpbmFsIFdpbmRvd01hbmFnZXJTdGF0ZS5XaW5kb3dTdGF0ZSBhcHBPdmVybGF5V2luZG93ID0KLSAgICAgICAgICAgICAgICB3TVN0YXRlLmdldFdpbmRvd0J5UGFja2FnZU5hbWUocGFja2FnZU5hbWUsIFRZUEVfQVBQTElDQVRJT05fT1ZFUkxBWSk7Ci0gICAgICAgIGlmIChhcHBPdmVybGF5V2luZG93ICE9IG51bGwgJiYgaGlnaGVzdEFsZXJ0V2luZG93ICE9IGFwcE92ZXJsYXlXaW5kb3cpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoImhpZ2hlc3RBbGVydFdpbmRvdz0iICsgaGlnaGVzdEFsZXJ0V2luZG93Ci0gICAgICAgICAgICAgICAgICAgICsgIiBncmVhdGVyIHRoYW4gYXBwT3ZlcmxheVdpbmRvdz0iICsgYXBwT3ZlcmxheVdpbmRvdywKLSAgICAgICAgICAgICAgICAgICAgaGlnaGVzdEFsZXJ0V2luZG93LmdldExheWVyKCkgPCBhcHBPdmVybGF5V2luZG93LmdldExheWVyKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQXNzZXJ0IHRoYXQgYWxlcnQgd2luZG93cyBhcmUgYmVsb3cga2V5IHN5c3RlbSB3aW5kb3dzLgotICAgICAgICBmaW5hbCBBcnJheUxpc3Q8V2luZG93TWFuYWdlclN0YXRlLldpbmRvd1N0YXRlPiBzeXN0ZW1XaW5kb3dzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICB3TVN0YXRlLmdldFdpbmRvd3NCeVBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lLCBtU3lzdGVtV2luZG93VHlwZXMsIHN5c3RlbVdpbmRvd3MpOwotICAgICAgICBpZiAoIXN5c3RlbVdpbmRvd3MuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICB3TVN0YXRlLnNvcnRXaW5kb3dzQnlMYXllcihzeXN0ZW1XaW5kb3dzKTsKLSAgICAgICAgICAgIGZpbmFsIFdpbmRvd01hbmFnZXJTdGF0ZS5XaW5kb3dTdGF0ZSBsb3dlc3RTeXN0ZW1XaW5kb3cgPSBhbGVydFdpbmRvd3MuZ2V0KDApOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiaGlnaGVzdEFsZXJ0V2luZG93PSIgKyBoaWdoZXN0QWxlcnRXaW5kb3cKLSAgICAgICAgICAgICAgICAgICAgKyAiIGdyZWF0ZXIgdGhhbiBsb3dlc3RTeXN0ZW1XaW5kb3c9IiArIGxvd2VzdFN5c3RlbVdpbmRvdywKLSAgICAgICAgICAgICAgICAgICAgaGlnaGVzdEFsZXJ0V2luZG93LmdldExheWVyKCkgPCBsb3dlc3RTeXN0ZW1XaW5kb3cuZ2V0TGF5ZXIoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0QWxlcnRXaW5kb3dQZXJtaXNzaW9uKFN0cmluZyBwYWNrYWdlTmFtZSwgYm9vbGVhbiBhbGxvdykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoImFwcG9wcyBzZXQgIiArIHBhY2thZ2VOYW1lICsgIiBhbmRyb2lkOnN5c3RlbV9hbGVydF93aW5kb3cgIgotICAgICAgICAgICAgICAgICsgKGFsbG93ID8gImFsbG93IiA6ICJkZW55IikpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL3dpbmRvd21hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9DaGlsZE1vdmVtZW50VGVzdHMuamF2YSBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL3dpbmRvd21hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9DaGlsZE1vdmVtZW50VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE4ZmNmZS4uMDAwMDAwMAotLS0gYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci93aW5kb3dtYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvQ2hpbGRNb3ZlbWVudFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuY3RzOwotCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmN0cy5TdGF0ZUxvZ2dlci5sb2dFOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLmF3dC5SZWN0YW5nbGU7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuTG9nLkxvZ0xldmVsOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5Db2xsZWN0aW5nT3V0cHV0UmVjZWl2ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLkRldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuSVRlc3REZXZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQubG9nLkxvZ1V0aWwuQ0xvZzsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5EZXZpY2VUZXN0Q2FzZTsKLQotaW1wb3J0IGFuZHJvaWQuc2VydmVyLmN0cy5BY3Rpdml0eU1hbmFnZXJUZXN0QmFzZTsKLWltcG9ydCBhbmRyb2lkLnNlcnZlci5jdHMuV2luZG93TWFuYWdlclN0YXRlLldpbmRvd1N0YXRlOwotCi1wdWJsaWMgY2xhc3MgQ2hpbGRNb3ZlbWVudFRlc3RzIGV4dGVuZHMgUGFyZW50Q2hpbGRUZXN0QmFzZSB7Ci0gICAgcHJpdmF0ZSBMaXN0PFdpbmRvd1N0YXRlPiBtV2luZG93TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIEBPdmVycmlkZQotICAgIFN0cmluZyBpbnRlbnRLZXkoKSB7Ci0gICAgICAgIHJldHVybiAiYW5kcm9pZC5zZXJ2ZXIuRnJhbWVUZXN0QXBwLkNoaWxkVGVzdENhc2UiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIFN0cmluZyBhY3Rpdml0eU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiTW92aW5nQ2hpbGRUZXN0QWN0aXZpdHkiOwotICAgIH0KLQotICAgIFdpbmRvd1N0YXRlIGdldFNpbmdsZVdpbmRvdyhTdHJpbmcgZnVsbFdpbmRvd05hbWUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1BbVdtU3RhdGUuZ2V0V21TdGF0ZSgpLmdldE1hdGNoaW5nVmlzaWJsZVdpbmRvd1N0YXRlKGZ1bGxXaW5kb3dOYW1lLCBtV2luZG93TGlzdCk7Ci0gICAgICAgICAgICByZXR1cm4gbVdpbmRvd0xpc3QuZ2V0KDApOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgQ0xvZy5sb2dBbmREaXNwbGF5KExvZ0xldmVsLklORk8sICJDb3VsZG4ndCBmaW5kIHdpbmRvdzogIiArIGZ1bGxXaW5kb3dOYW1lKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgV2luZG93U3RhdGUgZ2V0U2luZ2xlV2luZG93QnlQcmVmaXgoU3RyaW5nIHByZWZpeCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgbUFtV21TdGF0ZS5nZXRXbVN0YXRlKCkuZ2V0UHJlZml4TWF0Y2hpbmdWaXNpYmxlV2luZG93U3RhdGUocHJlZml4LCBtV2luZG93TGlzdCk7Ci0gICAgICAgICAgICByZXR1cm4gbVdpbmRvd0xpc3QuZ2V0KDApOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgQ0xvZy5sb2dBbmREaXNwbGF5KExvZ0xldmVsLklORk8sICJDb3VsZG4ndCBmaW5kIHdpbmRvdzogIiArIHByZWZpeCk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgZG9TaW5nbGVUZXN0KFBhcmVudENoaWxkVGVzdCB0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHBvcHVwTmFtZSA9ICJDaGlsZFdpbmRvdyI7Ci0gICAgICAgIGZpbmFsIFN0cmluZ1tdIHdhaXRGb3JWaXNpYmxlID0gbmV3IFN0cmluZ1tdIHsgcG9wdXBOYW1lIH07Ci0KLSAgICAgICAgbUFtV21TdGF0ZS5zZXRVc2VBY3Rpdml0eU5hbWVzRm9yV2luZG93TmFtZXMoZmFsc2UpOwotICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShtRGV2aWNlLCB3YWl0Rm9yVmlzaWJsZSk7Ci0gICAgICAgIFdpbmRvd1N0YXRlIHBvcHVwID0gZ2V0U2luZ2xlV2luZG93QnlQcmVmaXgocG9wdXBOYW1lKTsKLSAgICAgICAgV2luZG93U3RhdGUgcGFyZW50ID0gZ2V0U2luZ2xlV2luZG93KGdldEJhc2VXaW5kb3dOYW1lKCkgKyBhY3Rpdml0eU5hbWUoKSk7Ci0KLSAgICAgICAgdC5kb1Rlc3QocGFyZW50LCBwb3B1cCk7Ci0gICAgfQotCi0KLSAgICBPYmplY3QgbW9uaXRvciA9IG5ldyBPYmplY3QoKTsKLSAgICBib29sZWFuIHRlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICBTdHJpbmcgcG9wdXBOYW1lID0gbnVsbDsKLSAgICBTdHJpbmcgbWFpbk5hbWUgPSBudWxsOwotCi0gICAgU3VyZmFjZVRyYWNlUmVjZWl2ZXIuU3VyZmFjZU9ic2VydmVyIG9ic2VydmVyID0gbmV3IFN1cmZhY2VUcmFjZVJlY2VpdmVyLlN1cmZhY2VPYnNlcnZlcigpIHsKLSAgICAgICAgaW50IHRyYW5zYWN0aW9uQ291bnQgPSAwOwotICAgICAgICBib29sZWFuIHNhd0NoaWxkTW92ZSA9IGZhbHNlOwotICAgICAgICBib29sZWFuIHNhd01haW5Nb3ZlID0gZmFsc2U7Ci0gICAgICAgIGludCB0aW1lc1NlZW4gPSAwOwotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvcGVuVHJhbnNhY3Rpb24oKSB7Ci0gICAgICAgICAgICB0cmFuc2FjdGlvbkNvdW50Kys7Ci0gICAgICAgICAgICBpZiAodHJhbnNhY3Rpb25Db3VudCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgc2F3Q2hpbGRNb3ZlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgc2F3TWFpbk1vdmUgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZVRyYW5zYWN0aW9uKCkgewotICAgICAgICAgICAgdHJhbnNhY3Rpb25Db3VudC0tOwotICAgICAgICAgICAgaWYgKHRyYW5zYWN0aW9uQ291bnQgIT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcikgewotICAgICAgICAgICAgICAgIGlmIChzYXdDaGlsZE1vdmUgXiBzYXdNYWluTW92ZSApIHsKLSAgICAgICAgICAgICAgICAgICAgbW9uaXRvci5ub3RpZnlBbGwoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAodGltZXNTZWVuID4gMTApIHsKLSAgICAgICAgICAgICAgICAgICAgdGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIG1vbml0b3Iubm90aWZ5QWxsKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFBvc2l0aW9uKFN0cmluZyB3aW5kb3dOYW1lLCBmbG9hdCB4LCBmbG9hdCB5KSB7Ci0gICAgICAgICAgICBpZiAod2luZG93TmFtZS5lcXVhbHMocG9wdXBOYW1lKSkgewotICAgICAgICAgICAgICAgIHNhd0NoaWxkTW92ZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgdGltZXNTZWVuKys7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHdpbmRvd05hbWUuZXF1YWxzKG1haW5OYW1lKSkgewotICAgICAgICAgICAgICAgIHNhd01haW5Nb3ZlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH07Ci0KLSAgICAvKioKLSAgICAgKiBIZXJlIHdlIHRlc3QgdGhhdCBhIENoaWxkIG1vdmVzIGluIHRoZSBzYW1lIHRyYW5zYWN0aW9uCi0gICAgICogYXMgaXRzIHBhcmVudC4gV2UgbGF1bmNoIGFuIGFjdGl2aXR5IHdpdGggYSBDaGlsZCB3aGljaCB3aWxsCi0gICAgICogbW92ZSBhcm91bmQgaXRzIG93biBtYWluIHdpbmRvdy4gVGhlbiB3ZSBsaXN0ZW4gdG8gV2luZG93TWFuYWdlciB0cmFuc2FjdGlvbnMuCi0gICAgICogU2luY2UgdGhlIENoaWxkIGlzIHN0YXRpYyB3aXRoaW4gdGhlIHdpbmRvdywgaWYgd2UgZXZlciBzZWUgb25lIG9mCi0gICAgICogdGhlbSBtb3ZlIHhvciB0aGUgb3RoZXIgb25lIHdlIGhhdmUgYSBwcm9ibGVtIQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTdXJmYWNlTW92ZXNXaXRoUGFyZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGRvRnVsbHNjcmVlblRlc3QoIk1vdmVzV2l0aFBhcmVudCIsCi0gICAgICAgICAgICAoV2luZG93U3RhdGUgcGFyZW50LCBXaW5kb3dTdGF0ZSBwb3B1cCkgLT4gewotICAgICAgICAgICAgICAgICAgICBwb3B1cE5hbWUgPSBwb3B1cC5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1haW5OYW1lID0gcGFyZW50LmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaW5zdGFsbFN1cmZhY2VPYnNlcnZlcihvYnNlcnZlcik7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb25pdG9yLndhaXQoNTAwMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUodGVzdFBhc3NlZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVTdXJmYWNlT2JzZXJ2ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvd2luZG93bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0Nyb3NzQXBwRHJhZ0FuZERyb3BUZXN0cy5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvd2luZG93bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0Nyb3NzQXBwRHJhZ0FuZERyb3BUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2VkZTM1Li4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL3dpbmRvd21hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9Dcm9zc0FwcERyYWdBbmREcm9wVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnNlcnZlci5jdHM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuQ29sbGVjdGluZ091dHB1dFJlY2VpdmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5EZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLklUZXN0RGV2aWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmxvZy5Mb2dVdGlsLkNMb2c7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuRGV2aWNlVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1wdWJsaWMgY2xhc3MgQ3Jvc3NBcHBEcmFnQW5kRHJvcFRlc3RzIGV4dGVuZHMgRGV2aWNlVGVzdENhc2UgewotICAgIC8vIENvbnN0YW50cyBjb3BpZWQgZnJvbSBBY3Rpdml0eU1hbmFnZXIuU3RhY2tJZC4gSWYgdGhleSBhcmUgY2hhbmdlZCB0aGVyZSwgdGhlc2UgbXVzdCBiZQotICAgIC8vIHVwZGF0ZWQuCi0gICAgLyoqIElEIG9mIHN0YWNrIHdoZXJlIGZ1bGxzY3JlZW4gYWN0aXZpdGllcyBhcmUgbm9ybWFsbHkgbGF1bmNoZWQgaW50by4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRlVMTFNDUkVFTl9XT1JLU1BBQ0VfU1RBQ0tfSUQgPSAxOwotCi0gICAgLyoqIElEIG9mIHN0YWNrIHdoZXJlIGZyZWVmb3JtL3Jlc2l6ZWQgYWN0aXZpdGllcyBhcmUgbm9ybWFsbHkgbGF1bmNoZWQgaW50by4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRlJFRUZPUk1fV09SS1NQQUNFX1NUQUNLX0lEID0gRlVMTFNDUkVFTl9XT1JLU1BBQ0VfU1RBQ0tfSUQgKyAxOwotCi0gICAgLyoqIElEIG9mIHN0YWNrIHRoYXQgb2NjdXBpZXMgYSBkZWRpY2F0ZWQgcmVnaW9uIG9mIHRoZSBzY3JlZW4uICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERPQ0tFRF9TVEFDS19JRCA9IEZSRUVGT1JNX1dPUktTUEFDRV9TVEFDS19JRCArIDE7Ci0KLSAgICAvKiogSUQgb2Ygc3RhY2sgdGhhdCBhbHdheXMgb24gdG9wIChhbHdheXMgdmlzaWJsZSkgd2hlbiBpdCBleGlzdHMuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBJTk5FRF9TVEFDS19JRCA9IERPQ0tFRF9TVEFDS19JRCArIDE7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU1fRk9SQ0VfU1RPUCA9ICJhbSBmb3JjZS1zdG9wICI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFNX01PVkVfVEFTSyA9ICJhbSBzdGFjayBtb3ZlLXRhc2sgIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU1fUkVTSVpFX1RBU0sgPSAiYW0gdGFzayByZXNpemUgIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU1fUkVNT1ZFX1NUQUNLID0gImFtIHN0YWNrIHJlbW92ZSAiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTV9TVEFSVF9OID0gImFtIHN0YXJ0IC1uICI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFNX1NUQUNLX0xJU1QgPSAiYW0gc3RhY2sgbGlzdCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOUFVUX01PVVNFX1NXSVBFID0gImlucHV0IG1vdXNlIHN3aXBlICI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfSURfUFJFRklYID0gInRhc2tJZCI7Ci0KLSAgICAvLyBSZWdleCBwYXR0ZXJuIHRvIG1hdGNoIGFkYiBzaGVsbCBhbSBzdGFjayBsaXN0IG91dHB1dCBvZiB0aGUgZm9ybToKLSAgICAvLyB0YXNrSWQ9PFRBU0tfSUQ+OiA8Y29tcG9uZW50TmFtZT4gYm91bmRzPVtMRUZULFRPUF1bUklHSFQsQk9UVE9NXQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX1JFR0VYX1BBVFRFUk5fU1RSSU5HID0KLSAgICAgICAgICAgICJ0YXNrSWQ9WzAtOV0rOiAlcyBib3VuZHM9XFxbWzAtOV0rLFswLTldK1xcXVxcW1swLTldKyxbMC05XStcXF0iOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNXSVBFX0RVUkFUSU9OX01TID0gNTAwOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNPVVJDRV9QQUNLQUdFX05BTUUgPSAiYW5kcm9pZC53bS5jdHMuZG5kc291cmNlYXBwIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX1BBQ0tBR0VfTkFNRSA9ICJhbmRyb2lkLndtLmN0cy5kbmR0YXJnZXRhcHAiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfMjNfUEFDS0FHRV9OQU1FID0gImFuZHJvaWQud20uY3RzLmRuZHRhcmdldGFwcHNkazIzIjsKLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNPVVJDRV9BQ1RJVklUWV9OQU1FID0gIkRyYWdTb3VyY2UiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfQUNUSVZJVFlfTkFNRSA9ICJEcm9wVGFyZ2V0IjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX0dMT0JBTCA9ICJmaWxlX2dsb2JhbCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfTE9DQUwgPSAiZmlsZV9sb2NhbCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FMTE9XX0dMT0JBTCA9ICJkaXNhbGxvd19nbG9iYWwiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDQU5DRUxfU09PTiA9ICJjYW5jZWxfc29vbiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdSQU5UX05PTkUgPSAiZ3JhbnRfbm9uZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdSQU5UX1JFQUQgPSAiZ3JhbnRfcmVhZCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdSQU5UX1dSSVRFID0gImdyYW50X3dyaXRlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JBTlRfUkVBRF9QUkVGSVggPSAiZ3JhbnRfcmVhZF9wcmVmaXgiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHUkFOVF9SRUFEX05PUFJFRklYID0gImdyYW50X3JlYWRfbm9wcmVmaXgiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHUkFOVF9SRUFEX1BFUlNJU1RBQkxFID0gImdyYW50X3JlYWRfcGVyc2lzdGFibGUiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVFU1RfTk9ORSA9ICJyZXF1ZXN0X25vbmUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVRVNUX1JFQUQgPSAicmVxdWVzdF9yZWFkIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVRVUVTVF9SRUFEX05FU1RFRCA9ICJyZXF1ZXN0X3JlYWRfbmVzdGVkIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVRVUVTVF9UQUtFX1BFUlNJU1RBQkxFID0gInJlcXVlc3RfdGFrZV9wZXJzaXN0YWJsZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVFU1RfV1JJVEUgPSAicmVxdWVzdF93cml0ZSI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09VUkNFX0xPR19UQUcgPSAiRHJhZ1NvdXJjZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9MT0dfVEFHID0gIkRyb3BUYXJnZXQiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9LRVlfU1RBUlRfRFJBRyA9ICJTVEFSVF9EUkFHIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVUxUX0tFWV9EUkFHX1NUQVJURUQgPSAiRFJBR19TVEFSVEVEIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVUxUX0tFWV9EUkFHX0VOREVEID0gIkRSQUdfRU5ERUQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRfS0VZX0VYVFJBUyA9ICJFWFRSQVMiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRfS0VZX0RST1BfUkVTVUxUID0gIkRST1AiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRfS0VZX0FDQ0VTU19CRUZPUkUgPSAiQkVGT1JFIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVUxUX0tFWV9BQ0NFU1NfQUZURVIgPSAiQUZURVIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRfS0VZX0NMSVBfREFUQV9FUlJPUiA9ICJDTElQX0RBVEFfRVJST1IiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRfS0VZX0NMSVBfREVTQ1JfRVJST1IgPSAiQ0xJUF9ERVNDUl9FUlJPUiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9LRVlfTE9DQUxfU1RBVEVfRVJST1IgPSAiTE9DQUxfU1RBVEVfRVJST1IiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9NSVNTSU5HID0gIk1pc3NpbmciOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRfT0sgPSAiT0siOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRfRVhDRVBUSU9OID0gIkV4Y2VwdGlvbiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9OVUxMX0RST1BfUEVSTUlTU0lPTlMgPSAiTnVsbCBEcmFnQW5kRHJvcFBlcm1pc3Npb25zIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTV9TVVBQT1JUU19TUExJVF9TQ1JFRU5fTVVMVElXSU5ET1cgPQotICAgICAgICAgICAgImFtIHN1cHBvcnRzLXNwbGl0LXNjcmVlbi1tdWx0aS13aW5kb3ciOwotCi0gICAgcHJpdmF0ZSBJVGVzdERldmljZSBtRGV2aWNlOwotCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IG1Tb3VyY2VSZXN1bHRzOwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBtVGFyZ2V0UmVzdWx0czsKLQotICAgIHByaXZhdGUgU3RyaW5nIG1Tb3VyY2VQYWNrYWdlTmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBtVGFyZ2V0UGFja2FnZU5hbWU7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotCi0gICAgICAgIG1EZXZpY2UgPSBnZXREZXZpY2UoKTsKLQotICAgICAgICBpZiAoIXN1cHBvcnRzRHJhZ0FuZERyb3AoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbVNvdXJjZVBhY2thZ2VOYW1lID0gU09VUkNFX1BBQ0tBR0VfTkFNRTsKLSAgICAgICAgbVRhcmdldFBhY2thZ2VOYW1lID0gVEFSR0VUX1BBQ0tBR0VfTkFNRTsKLSAgICAgICAgY2xlYW51cFN0YXRlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLQotICAgICAgICBpZiAoIXN1cHBvcnRzRHJhZ0FuZERyb3AoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbURldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKEFNX0ZPUkNFX1NUT1AgKyBtU291cmNlUGFja2FnZU5hbWUpOwotICAgICAgICBtRGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoQU1fRk9SQ0VfU1RPUCArIG1UYXJnZXRQYWNrYWdlTmFtZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZXhlY3V0ZVNoZWxsQ29tbWFuZChTdHJpbmcgY29tbWFuZCkgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBtRGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoY29tbWFuZCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNsZWFyTG9ncygpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKCJsb2djYXQgLWMiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRTdGFydENvbW1hbmQoU3RyaW5nIGNvbXBvbmVudE5hbWUsIFN0cmluZyBtb2RlRXh0cmEpIHsKLSAgICAgICAgcmV0dXJuIEFNX1NUQVJUX04gKyBjb21wb25lbnROYW1lICsgIiAtZSBtb2RlICIgKyBtb2RlRXh0cmE7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TW92ZVRhc2tDb21tYW5kKGludCB0YXNrSWQsIGludCBzdGFja0lkKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIEFNX01PVkVfVEFTSyArIHRhc2tJZCArICIgIiArIHN0YWNrSWQgKyAiIHRydWUiOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldFJlc2l6ZVRhc2tDb21tYW5kKGludCB0YXNrSWQsIFBvaW50IHRvcExlZnQsIFBvaW50IGJvdHRvbVJpZ2h0KQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBBTV9SRVNJWkVfVEFTSyArIHRhc2tJZCArICIgIiArIHRvcExlZnQueCArICIgIiArIHRvcExlZnQueSArICIgIiArIGJvdHRvbVJpZ2h0LngKLSAgICAgICAgICAgICAgICArICIgIiArIGJvdHRvbVJpZ2h0Lnk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Q29tcG9uZW50TmFtZShTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBhY3Rpdml0eU5hbWUpIHsKLSAgICAgICAgcmV0dXJuIHBhY2thZ2VOYW1lICsgIi8iICsgcGFja2FnZU5hbWUgKyAiLiIgKyBhY3Rpdml0eU5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWFrZSBzdXJlIHRoYXQgdGhlIHNwZWNpYWwgYWN0aXZpdHkgc3RhY2tzIGFyZSByZW1vdmVkIGFuZCB0aGUgQWN0aXZpdHlNYW5hZ2VyL1dpbmRvd01hbmFnZXIKLSAgICAgKiBpcyBpbiBhIGdvb2Qgc3RhdGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNsZWFudXBTdGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKEFNX0ZPUkNFX1NUT1AgKyBTT1VSQ0VfUEFDS0FHRV9OQU1FKTsKLSAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChBTV9GT1JDRV9TVE9QICsgVEFSR0VUX1BBQ0tBR0VfTkFNRSk7Ci0gICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoQU1fRk9SQ0VfU1RPUCArIFRBUkdFVF8yM19QQUNLQUdFX05BTUUpOwotICAgICAgICB1bmxvY2tEZXZpY2UoKTsKLQotICAgICAgICAvLyBSZWluaXRpYWxpemUgdGhlIGRvY2tlZCBzdGFjayB0byBmb3JjZSB0aGUgd2luZG93IG1hbmFnZXIgdG8gcmVzZXQgaXRzIGRlZmF1bHQgYm91bmRzLgotICAgICAgICAvLyBTZWUgYi8yOTA2ODkzNS4KLSAgICAgICAgY2xlYXJMb2dzKCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZShtU291cmNlUGFja2FnZU5hbWUsIFNPVVJDRV9BQ1RJVklUWV9OQU1FKTsKLSAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChnZXRTdGFydENvbW1hbmQoY29tcG9uZW50TmFtZSwgbnVsbCkgKyAiIC0tc3RhY2sgIiArCi0gICAgICAgICAgICAgICAgRlVMTFNDUkVFTl9XT1JLU1BBQ0VfU1RBQ0tfSUQpOwotICAgICAgICBmaW5hbCBpbnQgdGFza0lkID0gZ2V0QWN0aXZpdHlUYXNrSWQoY29tcG9uZW50TmFtZSk7Ci0gICAgICAgIC8vIE1vdmluZyBhIHRhc2sgZnJvbSB0aGUgZnVsbCBzY3JlZW4gc3RhY2sgdG8gdGhlIGRvY2tlZCBzdGFjayByZXNldHMKLSAgICAgICAgLy8gV2luZG93TWFuYWdlclNlcnZpY2UjbURvY2tlZFN0YWNrQ3JlYXRlQm91bmRzLgotICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKGdldE1vdmVUYXNrQ29tbWFuZCh0YXNrSWQsIERPQ0tFRF9TVEFDS19JRCkpOwotICAgICAgICB3YWl0Rm9yUmVzdW1lKG1Tb3VyY2VQYWNrYWdlTmFtZSwgU09VUkNFX0FDVElWSVRZX05BTUUpOwotICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKEFNX0ZPUkNFX1NUT1AgKyBTT1VSQ0VfUEFDS0FHRV9OQU1FKTsKLQotICAgICAgICAvLyBSZW1vdmUgc3BlY2lhbCBzdGFja3MuCi0gICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoQU1fUkVNT1ZFX1NUQUNLICsgUElOTkVEX1NUQUNLX0lEKTsKLSAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChBTV9SRU1PVkVfU1RBQ0sgKyBET0NLRURfU1RBQ0tfSUQpOwotICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKEFNX1JFTU9WRV9TVEFDSyArIEZSRUVGT1JNX1dPUktTUEFDRV9TVEFDS19JRCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGxhdW5jaERvY2tlZEFjdGl2aXR5KFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGFjdGl2aXR5TmFtZSwgU3RyaW5nIG1vZGUpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgY2xlYXJMb2dzKCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZShwYWNrYWdlTmFtZSwgYWN0aXZpdHlOYW1lKTsKLSAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChnZXRTdGFydENvbW1hbmQoY29tcG9uZW50TmFtZSwgbW9kZSkgKyAiIC0tc3RhY2sgIiArIERPQ0tFRF9TVEFDS19JRCk7Ci0gICAgICAgIHdhaXRGb3JSZXN1bWUocGFja2FnZU5hbWUsIGFjdGl2aXR5TmFtZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGxhdW5jaEZ1bGxzY3JlZW5BY3Rpdml0eShTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBhY3Rpdml0eU5hbWUsIFN0cmluZyBtb2RlKQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNsZWFyTG9ncygpOwotICAgICAgICBmaW5hbCBTdHJpbmcgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWUocGFja2FnZU5hbWUsIGFjdGl2aXR5TmFtZSk7Ci0gICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoZ2V0U3RhcnRDb21tYW5kKGNvbXBvbmVudE5hbWUsIG1vZGUpICsgIiAtLXN0YWNrICIKLSAgICAgICAgICAgICAgICArIEZVTExTQ1JFRU5fV09SS1NQQUNFX1NUQUNLX0lEKTsKLSAgICAgICAgd2FpdEZvclJlc3VtZShwYWNrYWdlTmFtZSwgYWN0aXZpdHlOYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZGlzcGxheVNpemUgc2l6ZSBvZiB0aGUgZGlzcGxheQotICAgICAqIEBwYXJhbSBsZWZ0U2lkZSB7QGNvZGUgdHJ1ZX0gdG8gbGF1bmNoIHRoZSBhcHAgdGFraW5nIHVwIHRoZSBsZWZ0IGhhbGYgb2YgdGhlIGRpc3BsYXksCi0gICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IHRvIGxhdW5jaCB0aGUgYXBwIHRha2luZyB1cCB0aGUgcmlnaHQgaGFsZiBvZiB0aGUgZGlzcGxheS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgbGF1bmNoRnJlZWZvcm1BY3Rpdml0eShTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBhY3Rpdml0eU5hbWUsIFN0cmluZyBtb2RlLAotICAgICAgICAgICAgUG9pbnQgZGlzcGxheVNpemUsIGJvb2xlYW4gbGVmdFNpZGUpIHRocm93cyBFeGNlcHRpb257Ci0gICAgICAgIGNsZWFyTG9ncygpOwotICAgICAgICBmaW5hbCBTdHJpbmcgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWUocGFja2FnZU5hbWUsIGFjdGl2aXR5TmFtZSk7Ci0gICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoZ2V0U3RhcnRDb21tYW5kKGNvbXBvbmVudE5hbWUsIG1vZGUpICsgIiAtLXN0YWNrICIKLSAgICAgICAgICAgICAgICArIEZSRUVGT1JNX1dPUktTUEFDRV9TVEFDS19JRCk7Ci0gICAgICAgIHdhaXRGb3JSZXN1bWUocGFja2FnZU5hbWUsIGFjdGl2aXR5TmFtZSk7Ci0gICAgICAgIFBvaW50IHRvcExlZnQgPSBuZXcgUG9pbnQobGVmdFNpZGUgPyAwIDogZGlzcGxheVNpemUueCAvIDIsIDApOwotICAgICAgICBQb2ludCBib3R0b21SaWdodCA9IG5ldyBQb2ludChsZWZ0U2lkZSA/IGRpc3BsYXlTaXplLnggLyAyIDogZGlzcGxheVNpemUueCwgZGlzcGxheVNpemUueSk7Ci0gICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoZ2V0UmVzaXplVGFza0NvbW1hbmQoZ2V0QWN0aXZpdHlUYXNrSWQoY29tcG9uZW50TmFtZSksIHRvcExlZnQsCi0gICAgICAgICAgICAgICAgYm90dG9tUmlnaHQpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgd2FpdEZvclJlc3VtZShTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBhY3Rpdml0eU5hbWUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBTdHJpbmcgZnVsbEFjdGl2aXR5TmFtZSA9IHBhY2thZ2VOYW1lICsgIi4iICsgYWN0aXZpdHlOYW1lOwotICAgICAgICBpbnQgcmV0cnlDb3VudCA9IDM7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCg1MDApOwotICAgICAgICAgICAgU3RyaW5nIGxvZ3MgPSBleGVjdXRlU2hlbGxDb21tYW5kKCJsb2djYXQgLWQgLWIgZXZlbnRzIik7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBsaW5lIDogbG9ncy5zcGxpdCgiXFxuIikpIHsKLSAgICAgICAgICAgICAgICBpZihsaW5lLmNvbnRhaW5zKCJhbV9vbl9yZXN1bWVfY2FsbGVkIikgJiYgbGluZS5jb250YWlucyhmdWxsQWN0aXZpdHlOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlIChyZXRyeUNvdW50LS0gPiAwKTsKLQotICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKGZ1bGxBY3Rpdml0eU5hbWUgKyAiIGhhcyBmYWlsZWQgdG8gc3RhcnQiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5qZWN0SW5wdXQoUG9pbnQgZnJvbSwgUG9pbnQgdG8sIGludCBkdXJhdGlvbk1zKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZCgKLSAgICAgICAgICAgICAgICBJTlBVVF9NT1VTRV9TV0lQRSArIGZyb20ueCArICIgIiArIGZyb20ueSArICIgIiArIHRvLnggKyAiICIgKyB0by55ICsgIiAiICsKLSAgICAgICAgICAgICAgICBkdXJhdGlvbk1zKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgY2xhc3MgUG9pbnQgewotICAgICAgICBwdWJsaWMgaW50IHgsIHk7Ci0KLSAgICAgICAgcHVibGljIFBvaW50KGludCBfeCwgaW50IF95KSB7Ci0gICAgICAgICAgICB4PV94OwotICAgICAgICAgICAgeT1feTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBQb2ludCgpIHt9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZmluZFRhc2tJbmZvKFN0cmluZyBuYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQ29sbGVjdGluZ091dHB1dFJlY2VpdmVyIG91dHB1dFJlY2VpdmVyID0gbmV3IENvbGxlY3RpbmdPdXRwdXRSZWNlaXZlcigpOwotICAgICAgICBtRGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoQU1fU1RBQ0tfTElTVCwgb3V0cHV0UmVjZWl2ZXIpOwotICAgICAgICBmaW5hbCBTdHJpbmcgb3V0cHV0ID0gb3V0cHV0UmVjZWl2ZXIuZ2V0T3V0cHV0KCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJGaW5kaW5nIHRhc2sgaW5mbyBmb3IgdGFzazogIik7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKG5hbWUpOwotICAgICAgICBidWlsZGVyLmFwcGVuZCgiXG5QYXJzaW5nIGFkYiBzaGVsbCBhbSBvdXRwdXQ6ICIgKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQob3V0cHV0KTsKLSAgICAgICAgQ0xvZy5pKGJ1aWxkZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIGZpbmFsIFBhdHRlcm4gcGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZShTdHJpbmcuZm9ybWF0KFRBU0tfUkVHRVhfUEFUVEVSTl9TVFJJTkcsIG5hbWUpKTsKLSAgICAgICAgZm9yIChTdHJpbmcgbGluZSA6IG91dHB1dC5zcGxpdCgiXFxuIikpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0cnVuY2F0ZWRMaW5lOwotICAgICAgICAgICAgLy8gT25seSBsb29rIGZvciB0aGUgYWN0aXZpdHkgbmFtZSBiZWZvcmUgdGhlICJ0b3BBY3Rpdml0eSIgc3RyaW5nLgotICAgICAgICAgICAgZmluYWwgaW50IHBvcyA9IGxpbmUuaW5kZXhPZigidG9wQWN0aXZpdHkiKTsKLSAgICAgICAgICAgIGlmIChwb3MgPiAwKSB7Ci0gICAgICAgICAgICAgICAgdHJ1bmNhdGVkTGluZSA9IGxpbmUuc3Vic3RyaW5nKDAsIHBvcyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRydW5jYXRlZExpbmUgPSBsaW5lOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBhdHRlcm4ubWF0Y2hlcih0cnVuY2F0ZWRMaW5lKS5maW5kKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1bmNhdGVkTGluZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gIiI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGdldFdpbmRvd0JvdW5kcyhTdHJpbmcgbmFtZSwgUG9pbnQgZnJvbSwgUG9pbnQgdG8pIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBTdHJpbmcgdGFza0luZm8gPSBmaW5kVGFza0luZm8obmFtZSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZ1tdIHNlY3Rpb25zID0gdGFza0luZm8uc3BsaXQoIlxcWyIpOwotICAgICAgICBpZiAoc2VjdGlvbnMubGVuZ3RoID4gMikgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBwYXJzZVBvaW50KHNlY3Rpb25zWzFdLCBmcm9tKTsKLSAgICAgICAgICAgICAgICBwYXJzZVBvaW50KHNlY3Rpb25zWzJdLCB0byk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0QWN0aXZpdHlUYXNrSWQoU3RyaW5nIG5hbWUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBTdHJpbmcgdGFza0luZm8gPSBmaW5kVGFza0luZm8obmFtZSk7Ci0gICAgICAgIGZvciAoU3RyaW5nIHdvcmQgOiB0YXNrSW5mby5zcGxpdCgiXFxzKyIpKSB7Ci0gICAgICAgICAgICBpZiAod29yZC5zdGFydHNXaXRoKFRBU0tfSURfUFJFRklYKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB3aXRoQ29sb24gPSB3b3JkLnNwbGl0KCI9IilbMV07Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQod2l0aENvbG9uLnN1YnN0cmluZygwLCB3aXRoQ29sb24ubGVuZ3RoKCkgLSAxKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHByaXZhdGUgUG9pbnQgZ2V0RGlzcGxheVNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIG91dHB1dCA9IGV4ZWN1dGVTaGVsbENvbW1hbmQoIndtIHNpemUiKTsKLSAgICAgICAgZmluYWwgU3RyaW5nW10gc2l6ZXMgPSBvdXRwdXQuc3BsaXQoIiAiKVsyXS5zcGxpdCgieCIpOwotICAgICAgICByZXR1cm4gbmV3IFBvaW50KEludGVnZXIudmFsdWVPZihzaXplc1swXS50cmltKCkpLCBJbnRlZ2VyLnZhbHVlT2Yoc2l6ZXNbMV0udHJpbSgpKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBQb2ludCBnZXRXaW5kb3dDZW50ZXIoU3RyaW5nIG5hbWUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBQb2ludCBwMSA9IG5ldyBQb2ludCgpOwotICAgICAgICBQb2ludCBwMiA9IG5ldyBQb2ludCgpOwotICAgICAgICBpZiAoZ2V0V2luZG93Qm91bmRzKG5hbWUsIHAxLCBwMikpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUG9pbnQoKHAxLnggKyBwMi54KSAvIDIsIChwMS55ICsgcDIueSkgLyAyKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcGFyc2VQb2ludChTdHJpbmcgc3RyaW5nLCBQb2ludCBwb2ludCkgewotICAgICAgICBmaW5hbCBTdHJpbmdbXSBwYXJ0cyA9IHN0cmluZy5zcGxpdCgiWyx8XFxdXSIpOwotICAgICAgICBwb2ludC54ID0gSW50ZWdlci5wYXJzZUludChwYXJ0c1swXSk7Ci0gICAgICAgIHBvaW50LnkgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnRzWzFdKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdW5sb2NrRGV2aWNlKCkgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFdha2UgdXAgdGhlIGRldmljZSwgaWYgbmVjZXNzYXJ5LgotICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKCJpbnB1dCBrZXlldmVudCAyMjQiKTsKLSAgICAgICAgLy8gVW5sb2NrIHRoZSBzY3JlZW4uCi0gICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoImlucHV0IGtleWV2ZW50IDgyIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldExvZ1Jlc3VsdHMoU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIGxhc3RSZXN1bHRLZXkpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IHJldHJ5Q291bnQgPSAxMDsKLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBvdXRwdXQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICAgICAgZG8gewotCi0gICAgICAgICAgICBTdHJpbmcgbG9ncyA9IGV4ZWN1dGVTaGVsbENvbW1hbmQoImxvZ2NhdCAtdiBicmllZiAtZCAiICsgY2xhc3NOYW1lICsgIjpJIiArICIgKjpTIik7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBsaW5lIDogbG9ncy5zcGxpdCgiXFxuIikpIHsKLSAgICAgICAgICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKCJJLyIgKyBjbGFzc05hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXlsb2FkID0gbGluZS5zcGxpdCgiOiIpWzFdLnRyaW0oKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gc3BsaXQgPSBwYXlsb2FkLnNwbGl0KCI9Iik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzcGxpdC5sZW5ndGggPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQucHV0KHNwbGl0WzBdLCBzcGxpdFsxXSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAob3V0cHV0LmNvbnRhaW5zS2V5KGxhc3RSZXN1bHRLZXkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG91dHB1dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSB3aGlsZSAocmV0cnlDb3VudC0tID4gMCk7Ci0gICAgICAgIHJldHVybiBvdXRwdXQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydERyb3BSZXN1bHQoU3RyaW5nIHNvdXJjZU1vZGUsIFN0cmluZyB0YXJnZXRNb2RlLCBTdHJpbmcgZXhwZWN0ZWREcm9wUmVzdWx0KQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydERyYWdBbmREcm9wUmVzdWx0cyhzb3VyY2VNb2RlLCB0YXJnZXRNb2RlLCBSRVNVTFRfT0ssIGV4cGVjdGVkRHJvcFJlc3VsdCwgUkVTVUxUX09LKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0Tm9HbG9iYWxEcmFnRXZlbnRzKFN0cmluZyBzb3VyY2VNb2RlLCBTdHJpbmcgZXhwZWN0ZWRTdGFydERyYWdSZXN1bHQpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0RHJhZ0FuZERyb3BSZXN1bHRzKAotICAgICAgICAgICAgICAgIHNvdXJjZU1vZGUsIFJFUVVFU1RfTk9ORSwgZXhwZWN0ZWRTdGFydERyYWdSZXN1bHQsIFJFU1VMVF9NSVNTSU5HLCBSRVNVTFRfTUlTU0lORyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydERyYWdBbmREcm9wUmVzdWx0cyhTdHJpbmcgc291cmNlTW9kZSwgU3RyaW5nIHRhcmdldE1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZXhwZWN0ZWRTdGFydERyYWdSZXN1bHQsIFN0cmluZyBleHBlY3RlZERyb3BSZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZXhwZWN0ZWRMaXN0ZW5lclJlc3VsdHMpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIXN1cHBvcnRzRHJhZ0FuZERyb3AoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHN1cHBvcnRzU3BsaXRTY3JlZW5NdWx0aVdpbmRvdygpKSB7Ci0gICAgICAgICAgICBsYXVuY2hEb2NrZWRBY3Rpdml0eShtU291cmNlUGFja2FnZU5hbWUsIFNPVVJDRV9BQ1RJVklUWV9OQU1FLCBzb3VyY2VNb2RlKTsKLSAgICAgICAgICAgIGxhdW5jaEZ1bGxzY3JlZW5BY3Rpdml0eShtVGFyZ2V0UGFja2FnZU5hbWUsIFRBUkdFVF9BQ1RJVklUWV9OQU1FLCB0YXJnZXRNb2RlKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdXBwb3J0c0ZyZWVmb3JtTXVsdGlXaW5kb3coKSkgewotICAgICAgICAgICAgLy8gRmFsbGJhY2sgdG8gdHJ5IHRvIGxhdW5jaCB0d28gZnJlZWZvcm0gd2luZG93cyBzaWRlIGJ5IHNpZGUuCi0gICAgICAgICAgICBQb2ludCBkaXNwbGF5U2l6ZSA9IGdldERpc3BsYXlTaXplKCk7Ci0gICAgICAgICAgICBsYXVuY2hGcmVlZm9ybUFjdGl2aXR5KG1Tb3VyY2VQYWNrYWdlTmFtZSwgU09VUkNFX0FDVElWSVRZX05BTUUsIHNvdXJjZU1vZGUsCi0gICAgICAgICAgICAgICAgICAgIGRpc3BsYXlTaXplLCB0cnVlIC8qIGxlZnRTaWRlICovKTsKLSAgICAgICAgICAgIGxhdW5jaEZyZWVmb3JtQWN0aXZpdHkobVRhcmdldFBhY2thZ2VOYW1lLCBUQVJHRVRfQUNUSVZJVFlfTkFNRSwgdGFyZ2V0TW9kZSwKLSAgICAgICAgICAgICAgICAgICAgZGlzcGxheVNpemUsIGZhbHNlIC8qIGxlZnRTaWRlICovKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGNsZWFyTG9ncygpOwotCi0gICAgICAgIGluamVjdElucHV0KAotICAgICAgICAgICAgICAgIGdldFdpbmRvd0NlbnRlcihnZXRDb21wb25lbnROYW1lKG1Tb3VyY2VQYWNrYWdlTmFtZSwgU09VUkNFX0FDVElWSVRZX05BTUUpKSwKLSAgICAgICAgICAgICAgICBnZXRXaW5kb3dDZW50ZXIoZ2V0Q29tcG9uZW50TmFtZShtVGFyZ2V0UGFja2FnZU5hbWUsIFRBUkdFVF9BQ1RJVklUWV9OQU1FKSksCi0gICAgICAgICAgICAgICAgU1dJUEVfRFVSQVRJT05fTVMpOwotCi0gICAgICAgIG1Tb3VyY2VSZXN1bHRzID0gZ2V0TG9nUmVzdWx0cyhTT1VSQ0VfTE9HX1RBRywgUkVTVUxUX0tFWV9TVEFSVF9EUkFHKTsKLSAgICAgICAgYXNzZXJ0U291cmNlUmVzdWx0KFJFU1VMVF9LRVlfU1RBUlRfRFJBRywgZXhwZWN0ZWRTdGFydERyYWdSZXN1bHQpOwotCi0gICAgICAgIG1UYXJnZXRSZXN1bHRzID0gZ2V0TG9nUmVzdWx0cyhUQVJHRVRfTE9HX1RBRywgUkVTVUxUX0tFWV9EUkFHX0VOREVEKTsKLSAgICAgICAgYXNzZXJ0VGFyZ2V0UmVzdWx0KFJFU1VMVF9LRVlfRFJPUF9SRVNVTFQsIGV4cGVjdGVkRHJvcFJlc3VsdCk7Ci0gICAgICAgIGlmICghUkVTVUxUX01JU1NJTkcuZXF1YWxzKGV4cGVjdGVkRHJvcFJlc3VsdCkpIHsKLSAgICAgICAgICAgIGFzc2VydFRhcmdldFJlc3VsdChSRVNVTFRfS0VZX0FDQ0VTU19CRUZPUkUsIFJFU1VMVF9FWENFUFRJT04pOwotICAgICAgICAgICAgYXNzZXJ0VGFyZ2V0UmVzdWx0KFJFU1VMVF9LRVlfQUNDRVNTX0FGVEVSLCBSRVNVTFRfRVhDRVBUSU9OKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRMaXN0ZW5lclJlc3VsdHMoZXhwZWN0ZWRMaXN0ZW5lclJlc3VsdHMpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRMaXN0ZW5lclJlc3VsdHMoU3RyaW5nIGV4cGVjdGVkUmVzdWx0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0VGFyZ2V0UmVzdWx0KFJFU1VMVF9LRVlfRFJBR19TVEFSVEVELCBleHBlY3RlZFJlc3VsdCk7Ci0gICAgICAgIGFzc2VydFRhcmdldFJlc3VsdChSRVNVTFRfS0VZX0RSQUdfRU5ERUQsIGV4cGVjdGVkUmVzdWx0KTsKLSAgICAgICAgYXNzZXJ0VGFyZ2V0UmVzdWx0KFJFU1VMVF9LRVlfRVhUUkFTLCBleHBlY3RlZFJlc3VsdCk7Ci0KLSAgICAgICAgYXNzZXJ0VGFyZ2V0UmVzdWx0KFJFU1VMVF9LRVlfQ0xJUF9EQVRBX0VSUk9SLCBSRVNVTFRfTUlTU0lORyk7Ci0gICAgICAgIGFzc2VydFRhcmdldFJlc3VsdChSRVNVTFRfS0VZX0NMSVBfREVTQ1JfRVJST1IsIFJFU1VMVF9NSVNTSU5HKTsKLSAgICAgICAgYXNzZXJ0VGFyZ2V0UmVzdWx0KFJFU1VMVF9LRVlfTE9DQUxfU1RBVEVfRVJST1IsIFJFU1VMVF9NSVNTSU5HKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0U291cmNlUmVzdWx0KFN0cmluZyByZXN1bHRLZXksIFN0cmluZyBleHBlY3RlZFJlc3VsdCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydFJlc3VsdChtU291cmNlUmVzdWx0cywgcmVzdWx0S2V5LCBleHBlY3RlZFJlc3VsdCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydFRhcmdldFJlc3VsdChTdHJpbmcgcmVzdWx0S2V5LCBTdHJpbmcgZXhwZWN0ZWRSZXN1bHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRSZXN1bHQobVRhcmdldFJlc3VsdHMsIHJlc3VsdEtleSwgZXhwZWN0ZWRSZXN1bHQpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRSZXN1bHQoTWFwPFN0cmluZywgU3RyaW5nPiByZXN1bHRzLCBTdHJpbmcgcmVzdWx0S2V5LCBTdHJpbmcgZXhwZWN0ZWRSZXN1bHQpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0c0RyYWdBbmREcm9wKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChSRVNVTFRfTUlTU0lORy5lcXVhbHMoZXhwZWN0ZWRSZXN1bHQpKSB7Ci0gICAgICAgICAgICBpZiAocmVzdWx0cy5jb250YWluc0tleShyZXN1bHRLZXkpKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCAiICsgcmVzdWx0S2V5ICsgIj0iICsgcmVzdWx0cy5nZXQocmVzdWx0S2V5KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJNaXNzaW5nICIgKyByZXN1bHRLZXksIHJlc3VsdHMuY29udGFpbnNLZXkocmVzdWx0S2V5KSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0S2V5ICsgIiByZXN1bHQgbWlzbWF0Y2gsIiwgZXhwZWN0ZWRSZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdHMuZ2V0KHJlc3VsdEtleSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHN1cHBvcnRzRHJhZ0FuZERyb3AoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHN1cHBvcnRzTXVsdGl3aW5kb3cgPSBtRGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoImFtIHN1cHBvcnRzLW11bHRpd2luZG93IikudHJpbSgpOwotICAgICAgICBpZiAoInRydWUiLmVxdWFscyhzdXBwb3J0c011bHRpd2luZG93KSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoImZhbHNlIi5lcXVhbHMoc3VwcG9ydHNNdWx0aXdpbmRvdykpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBcImFtIHN1cHBvcnRzLW11bHRpd2luZG93XCIgc2hlbGwgY29tbWFuZC4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBzdXBwb3J0c1NwbGl0U2NyZWVuTXVsdGlXaW5kb3coKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuICFleGVjdXRlU2hlbGxDb21tYW5kKEFNX1NVUFBPUlRTX1NQTElUX1NDUkVFTl9NVUxUSVdJTkRPVykuc3RhcnRzV2l0aCgiZmFsc2UiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gc3VwcG9ydHNGcmVlZm9ybU11bHRpV2luZG93KCkgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBtRGV2aWNlLmhhc0ZlYXR1cmUoImZlYXR1cmU6YW5kcm9pZC5zb2Z0d2FyZS5mcmVlZm9ybV93aW5kb3dfbWFuYWdlbWVudCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDYW5jZWxTb29uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydERyb3BSZXN1bHQoQ0FOQ0VMX1NPT04sIFJFUVVFU1RfTk9ORSwgUkVTVUxUX01JU1NJTkcpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REaXNhbGxvd0dsb2JhbCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnROb0dsb2JhbERyYWdFdmVudHMoRElTQUxMT1dfR0xPQkFMLCBSRVNVTFRfT0spOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REaXNhbGxvd0dsb2JhbEJlbG93U2RrMjQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbVRhcmdldFBhY2thZ2VOYW1lID0gVEFSR0VUXzIzX1BBQ0tBR0VfTkFNRTsKLSAgICAgICAgYXNzZXJ0Tm9HbG9iYWxEcmFnRXZlbnRzKEdSQU5UX05PTkUsIFJFU1VMVF9PSyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEZpbGVVcmlMb2NhbCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnROb0dsb2JhbERyYWdFdmVudHMoRklMRV9MT0NBTCwgUkVTVUxUX09LKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZVVyaUdsb2JhbCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnROb0dsb2JhbERyYWdFdmVudHMoRklMRV9HTE9CQUwsIFJFU1VMVF9FWENFUFRJT04pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHcmFudE5vbmVSZXF1ZXN0Tm9uZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnREcm9wUmVzdWx0KEdSQU5UX05PTkUsIFJFUVVFU1RfTk9ORSwgUkVTVUxUX0VYQ0VQVElPTik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdyYW50Tm9uZVJlcXVlc3RSZWFkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydERyb3BSZXN1bHQoR1JBTlRfTk9ORSwgUkVRVUVTVF9SRUFELCBSRVNVTFRfTlVMTF9EUk9QX1BFUk1JU1NJT05TKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R3JhbnROb25lUmVxdWVzdFdyaXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydERyb3BSZXN1bHQoR1JBTlRfTk9ORSwgUkVRVUVTVF9XUklURSwgUkVTVUxUX05VTExfRFJPUF9QRVJNSVNTSU9OUyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdyYW50UmVhZFJlcXVlc3ROb25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydERyb3BSZXN1bHQoR1JBTlRfUkVBRCwgUkVRVUVTVF9OT05FLCBSRVNVTFRfRVhDRVBUSU9OKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R3JhbnRSZWFkUmVxdWVzdFJlYWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0RHJvcFJlc3VsdChHUkFOVF9SRUFELCBSRVFVRVNUX1JFQUQsIFJFU1VMVF9PSyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdyYW50UmVhZFJlcXVlc3RXcml0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnREcm9wUmVzdWx0KEdSQU5UX1JFQUQsIFJFUVVFU1RfV1JJVEUsIFJFU1VMVF9FWENFUFRJT04pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHcmFudFJlYWROb1ByZWZpeFJlcXVlc3RSZWFkTmVzdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydERyb3BSZXN1bHQoR1JBTlRfUkVBRF9OT1BSRUZJWCwgUkVRVUVTVF9SRUFEX05FU1RFRCwgUkVTVUxUX0VYQ0VQVElPTik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdyYW50UmVhZFByZWZpeFJlcXVlc3RSZWFkTmVzdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydERyb3BSZXN1bHQoR1JBTlRfUkVBRF9QUkVGSVgsIFJFUVVFU1RfUkVBRF9ORVNURUQsIFJFU1VMVF9PSyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdyYW50UGVyc2lzdGFibGVSZXF1ZXN0VGFrZVBlcnNpc3RhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydERyb3BSZXN1bHQoR1JBTlRfUkVBRF9QRVJTSVNUQUJMRSwgUkVRVUVTVF9UQUtFX1BFUlNJU1RBQkxFLCBSRVNVTFRfT0spOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHcmFudFJlYWRSZXF1ZXN0VGFrZVBlcnNpc3RhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydERyb3BSZXN1bHQoR1JBTlRfUkVBRCwgUkVRVUVTVF9UQUtFX1BFUlNJU1RBQkxFLCBSRVNVTFRfRVhDRVBUSU9OKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R3JhbnRXcml0ZVJlcXVlc3ROb25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydERyb3BSZXN1bHQoR1JBTlRfV1JJVEUsIFJFUVVFU1RfTk9ORSwgUkVTVUxUX0VYQ0VQVElPTik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdyYW50V3JpdGVSZXF1ZXN0UmVhZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnREcm9wUmVzdWx0KEdSQU5UX1dSSVRFLCBSRVFVRVNUX1JFQUQsIFJFU1VMVF9FWENFUFRJT04pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHcmFudFdyaXRlUmVxdWVzdFdyaXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydERyb3BSZXN1bHQoR1JBTlRfV1JJVEUsIFJFUVVFU1RfV1JJVEUsIFJFU1VMVF9PSyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvd2luZG93bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0RpYWxvZ0ZyYW1lVGVzdHMuamF2YSBiL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL3dpbmRvd21hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9EaWFsb2dGcmFtZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMjhmZDcuLjAwMDAwMDAKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvd2luZG93bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvY3RzL0RpYWxvZ0ZyYW1lVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnNlcnZlci5jdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEuYXd0LlJlY3RhbmdsZTsKLWltcG9ydCBqYXZhLmxhbmcuRmxvYXQ7Ci1pbXBvcnQgamF2YS5sYW5nLlN0cmluZzsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5Mb2cuTG9nTGV2ZWw7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQubG9nLkxvZ1V0aWwuQ0xvZzsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uOwotCi1pbXBvcnQgYW5kcm9pZC5zZXJ2ZXIuY3RzLldpbmRvd01hbmFnZXJTdGF0ZS5XaW5kb3dTdGF0ZTsKLQotcHVibGljIGNsYXNzIERpYWxvZ0ZyYW1lVGVzdHMgZXh0ZW5kcyBQYXJlbnRDaGlsZFRlc3RCYXNlIHsKLSAgICBwcml2YXRlIExpc3Q8V2luZG93U3RhdGU+IG1XaW5kb3dMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgQE92ZXJyaWRlCi0gICAgU3RyaW5nIGludGVudEtleSgpIHsKLSAgICAgICAgcmV0dXJuICJhbmRyb2lkLnNlcnZlci5GcmFtZVRlc3RBcHAuRGlhbG9nVGVzdENhc2UiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIFN0cmluZyBhY3Rpdml0eU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiRGlhbG9nVGVzdEFjdGl2aXR5IjsKLSAgICB9Ci0KLSAgICBXaW5kb3dTdGF0ZSBnZXRTaW5nbGVXaW5kb3coU3RyaW5nIHdpbmRvd05hbWUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1BbVdtU3RhdGUuZ2V0V21TdGF0ZSgpLmdldE1hdGNoaW5nVmlzaWJsZVdpbmRvd1N0YXRlKAotICAgICAgICAgICAgICAgICAgICBnZXRCYXNlV2luZG93TmFtZSgpICsgd2luZG93TmFtZSwgbVdpbmRvd0xpc3QpOwotICAgICAgICAgICAgcmV0dXJuIG1XaW5kb3dMaXN0LmdldCgwKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIENMb2cubG9nQW5kRGlzcGxheShMb2dMZXZlbC5JTkZPLCAiQ291bGRuJ3QgZmluZCB3aW5kb3c6ICIgKyB3aW5kb3dOYW1lKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBkb1NpbmdsZVRlc3QoUGFyZW50Q2hpbGRUZXN0IHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBTdHJpbmdbXSB3YWl0Rm9yVmlzaWJsZSA9IG5ldyBTdHJpbmdbXSB7ICJUZXN0RGlhbG9nIiB9OwotCi0gICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG1EZXZpY2UsIHdhaXRGb3JWaXNpYmxlKTsKLSAgICAgICAgV2luZG93U3RhdGUgZGlhbG9nID0gZ2V0U2luZ2xlV2luZG93KCJUZXN0RGlhbG9nIik7Ci0gICAgICAgIFdpbmRvd1N0YXRlIHBhcmVudCA9IGdldFNpbmdsZVdpbmRvdygiRGlhbG9nVGVzdEFjdGl2aXR5Iik7Ci0gICAgICAgIHNldHVwVGVzdCgpOwotCi0gICAgICAgIHQuZG9UZXN0KHBhcmVudCwgZGlhbG9nKTsKLSAgICB9Ci0KLSAgICAvLyBXaXRoIFdpZHRoIGFuZCBIZWlnaHQgYXMgTUFUQ0hfUEFSRU5UIHdlIHNob3VsZCBmaWxsCi0gICAgLy8gdGhlIHNhbWUgY29udGVudCBmcmFtZSBhcyB0aGUgbWFpbiBhY3Rpdml0eSB3aW5kb3cKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWF0Y2hQYXJlbnREaWFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZG9QYXJlbnRDaGlsZFRlc3QoIk1hdGNoUGFyZW50IiwKLSAgICAgICAgICAgIChXaW5kb3dTdGF0ZSBwYXJlbnQsIFdpbmRvd1N0YXRlIGRpYWxvZykgLT4gewotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhwYXJlbnQuZ2V0Q29udGVudEZyYW1lKCksIGRpYWxvZy5nZXRGcmFtZSgpKTsKLSAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgZXhwbGljaXREaW1lbnNpb24gPSAyMDA7Ci0gICAgcHJpdmF0ZSBpbnQgbVNpemUgPSBleHBsaWNpdERpbWVuc2lvbjsKLQotICAgIC8vIFRoZSBkZWZhdWx0IGdyYXZpdHkgZm9yIGRpYWxvZ3Mgc2hvdWxkIGNlbnRlciB0aGVtLgotICAgIHB1YmxpYyB2b2lkIHRlc3RFeHBsaWNpdFNpemVEZWZhdWx0R3Jhdml0eSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBkb1BhcmVudENoaWxkVGVzdCgiRXhwbGljaXRTaXplIiwKLSAgICAgICAgICAgIChXaW5kb3dTdGF0ZSBwYXJlbnQsIFdpbmRvd1N0YXRlIGRpYWxvZykgLT4gewotICAgICAgICAgICAgICAgIFJlY3RhbmdsZSBjb250ZW50RnJhbWUgPSBwYXJlbnQuZ2V0Q29udGVudEZyYW1lKCk7Ci0gICAgICAgICAgICAgICAgUmVjdGFuZ2xlIGV4cGVjdGVkRnJhbWUgPSBuZXcgUmVjdGFuZ2xlKAotICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudEZyYW1lLnggKyAoY29udGVudEZyYW1lLndpZHRoIC0gbVNpemUpLzIsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50RnJhbWUueSArIChjb250ZW50RnJhbWUuaGVpZ2h0IC0gbVNpemUpLzIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtU2l6ZSwgbVNpemUpOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZEZyYW1lLCBkaWFsb2cuZ2V0RnJhbWUoKSk7Ci0gICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXhwbGljaXRTaXplVG9wTGVmdEdyYXZpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZG9QYXJlbnRDaGlsZFRlc3QoIkV4cGxpY2l0U2l6ZVRvcExlZnRHcmF2aXR5IiwKLSAgICAgICAgICAgIChXaW5kb3dTdGF0ZSBwYXJlbnQsIFdpbmRvd1N0YXRlIGRpYWxvZykgLT4gewotICAgICAgICAgICAgICAgIFJlY3RhbmdsZSBjb250ZW50RnJhbWUgPSBwYXJlbnQuZ2V0Q29udGVudEZyYW1lKCk7Ci0gICAgICAgICAgICAgICAgUmVjdGFuZ2xlIGV4cGVjdGVkRnJhbWUgPSBuZXcgUmVjdGFuZ2xlKAotICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudEZyYW1lLngsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50RnJhbWUueSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgbVNpemUpOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZEZyYW1lLCBkaWFsb2cuZ2V0RnJhbWUoKSk7Ci0gICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXhwbGljaXRTaXplQm90dG9tUmlnaHRHcmF2aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGRvUGFyZW50Q2hpbGRUZXN0KCJFeHBsaWNpdFNpemVCb3R0b21SaWdodEdyYXZpdHkiLAotICAgICAgICAgICAgKFdpbmRvd1N0YXRlIHBhcmVudCwgV2luZG93U3RhdGUgZGlhbG9nKSAtPiB7Ci0gICAgICAgICAgICAgICAgUmVjdGFuZ2xlIGNvbnRlbnRGcmFtZSA9IHBhcmVudC5nZXRDb250ZW50RnJhbWUoKTsKLSAgICAgICAgICAgICAgICBSZWN0YW5nbGUgZXhwZWN0ZWRGcmFtZSA9IG5ldyBSZWN0YW5nbGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50RnJhbWUueCArIGNvbnRlbnRGcmFtZS53aWR0aCAtIG1TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudEZyYW1lLnkgKyBjb250ZW50RnJhbWUuaGVpZ2h0IC0gbVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICBtU2l6ZSwgbVNpemUpOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZEZyYW1lLCBkaWFsb2cuZ2V0RnJhbWUoKSk7Ci0gICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvLyBUT0RPOiBDb21tZW50ZWQgb3V0IGZvciBub3cgYmVjYXVzZSBpdCBkb2Vzbid0IHdvcmsuIFdlIGVuZCB1cAotICAgIC8vIGluc2V0dGluZyB0aGUgZGVjb3Igb24gdGhlIGJvdHRvbS4gSSB0aGluayB0aGlzIGlzIGEgYnVnCi0gICAgLy8gcHJvYmFibHkgaW4gdGhlIGRlZmF1bHQgZGlhbG9nIGZsYWdzOgotICAgIC8vIGIvMzAxMjczNzMKLSAgICAvLyAgICBwdWJsaWMgdm9pZCB0ZXN0T3ZlcnNpemVkRGltZW5zaW9ucygpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vICAgICAgICBkb1BhcmVudENoaWxkVGVzdCgiT3ZlcnNpemVkRGltZW5zaW9ucyIsCi0gICAgLy8gICAgICAgICAgICAoV2luZG93U3RhdGUgcGFyZW50LCBXaW5kb3dTdGF0ZSBkaWFsb2cpIC0+IHsKLSAgICAvLyBXaXRoIHRoZSBkZWZhdWx0IGZsYWdzIG92ZXJzaXplIHNob3VsZCByZXN1bHQgaW4gY2xpcHBpbmcgdG8KLSAgICAvLyBwYXJlbnQgZnJhbWUuCi0gICAgLy8gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHBhcmVudC5nZXRDb250ZW50RnJhbWUoKSwgZGlhbG9nLmdldEZyYW1lKCkpOwotICAgIC8vICAgICAgICAgfSk7Ci0gICAgLy8gICAgfQotCi0gICAgLy8gVE9ETyhiLzYzOTkzODYzKSA6IERpc2FibGVkIHBlbmRpbmcgcHVibGljIEFQSSB0byBmZXRjaCBtYXhpbXVtIHN1cmZhY2Ugc2l6ZS4KLSAgICAvLyBzdGF0aWMgZmluYWwgaW50IG92ZXJzaXplZERpbWVuc2lvbiA9IDUwMDA7Ci0gICAgLy8gV2l0aCBGTEFHX0xBWU9VVF9OT19MSU1JVFMgIHdlIHNob3VsZCBnZXQgdGhlIHNpemUgd2UgcmVxdWVzdCwgZXZlbiBpZiBpdHMgbXVjaAotICAgIC8vIGxhcmdlciB0aGFuIHRoZSBzY3JlZW4uCi0gICAgLy8gcHVibGljIHZvaWQgdGVzdE92ZXJzaXplZERpbWVuc2lvbnNOb0xpbWl0cygpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIFRPRE8oYi8zNjg5MDk3OCk6IFdlIG9ubHkgcnVuIHRoaXMgaW4gZnVsbHNjcmVlbiBiZWNhdXNlIG9mIHRoZQotICAgIC8vIHVuY2xlYXIgc3RhdHVzIG9mIE5PX0xJTUlUUyBmb3Igbm9uLWNoaWxkIHN1cmZhY2VzIGluIE1XIG1vZGVzCi0gICAgLy8gICAgIGRvRnVsbHNjcmVlblRlc3QoIk92ZXJzaXplZERpbWVuc2lvbnNOb0xpbWl0cyIsCi0gICAgLy8gICAgICAgIChXaW5kb3dTdGF0ZSBwYXJlbnQsIFdpbmRvd1N0YXRlIGRpYWxvZykgLT4gewotICAgIC8vICAgICAgICAgICAgUmVjdGFuZ2xlIGNvbnRlbnRGcmFtZSA9IHBhcmVudC5nZXRDb250ZW50RnJhbWUoKTsKLSAgICAvLyAgICAgICAgICAgIFJlY3RhbmdsZSBleHBlY3RlZEZyYW1lID0gbmV3IFJlY3RhbmdsZShjb250ZW50RnJhbWUueCwgY29udGVudEZyYW1lLnksCi0gICAgLy8gICAgICAgICAgICAgICAgICAgIG92ZXJzaXplZERpbWVuc2lvbiwgb3ZlcnNpemVkRGltZW5zaW9uKTsKLSAgICAvLyAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZEZyYW1lLCBkaWFsb2cuZ2V0RnJhbWUoKSk7Ci0gICAgLy8gICAgICAgIH0pOwotICAgIC8vIH0KLQotICAgIC8vIElmIHdlIHJlcXVlc3QgdGhlIE1BVENIX1BBUkVOVCBhbmQgYSBub24temVybyBwb3NpdGlvbiwgd2Ugd291bGRuJ3QgYmUKLSAgICAvLyBhYmxlIHRvIGZpdCBhbGwgb2Ygb3VyIGNvbnRlbnQsIHNvIHdlIHNob3VsZCBiZSBhZGp1c3RlZCB0byBqdXN0IGZpdCB0aGUKLSAgICAvLyBjb250ZW50IGZyYW1lLgotICAgIHB1YmxpYyB2b2lkIHRlc3RFeHBsaWNpdFBvc2l0aW9uTWF0Y2hQYXJlbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZG9QYXJlbnRDaGlsZFRlc3QoIkV4cGxpY2l0UG9zaXRpb25NYXRjaFBhcmVudCIsCi0gICAgICAgICAgICAgKFdpbmRvd1N0YXRlIHBhcmVudCwgV2luZG93U3RhdGUgZGlhbG9nKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhwYXJlbnQuZ2V0Q29udGVudEZyYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhbG9nLmdldEZyYW1lKCkpOwotICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIC8vIFVubGVzcyB3ZSBwYXNzIE5PX0xJTUlUUyBpbiB3aGljaCBjYXNlIG91ciByZXF1ZXN0ZWQgcG9zaXRpb24gc2hvdWxkCi0gICAgLy8gYmUgaG9ub3JlZC4KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXhwbGljaXRQb3NpdGlvbk1hdGNoUGFyZW50Tm9MaW1pdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgaW50IGV4cGxpY2l0UG9zaXRpb24gPSAxMDA7Ci0gICAgICAgIGRvUGFyZW50Q2hpbGRUZXN0KCJFeHBsaWNpdFBvc2l0aW9uTWF0Y2hQYXJlbnROb0xpbWl0cyIsCi0gICAgICAgICAgICAoV2luZG93U3RhdGUgcGFyZW50LCBXaW5kb3dTdGF0ZSBkaWFsb2cpIC0+IHsKLSAgICAgICAgICAgICAgICBSZWN0YW5nbGUgY29udGVudEZyYW1lID0gcGFyZW50LmdldENvbnRlbnRGcmFtZSgpOwotICAgICAgICAgICAgICAgIFJlY3RhbmdsZSBleHBlY3RlZEZyYW1lID0gbmV3IFJlY3RhbmdsZShjb250ZW50RnJhbWUueCArIGV4cGxpY2l0UG9zaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50RnJhbWUueSArIGV4cGxpY2l0UG9zaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50RnJhbWUud2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50RnJhbWUuaGVpZ2h0KTsKLSAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIC8vIFdlIHJ1biB0aGUgdHdvIGZvY3VzIHRlc3RzIGZ1bGxzY3JlZW4gb25seSBiZWNhdXNlIHN3aXRjaGluZyB0byB0aGUKLSAgICAvLyBkb2NrZWQgc3RhY2sgd2lsbCBzdHJpcCBhd2F5IGZvY3VzIGZyb20gdGhlIHRhc2sgYW55d2F5LgotICAgIHB1YmxpYyB2b2lkIHRlc3REaWFsb2dSZWNlaXZlc0ZvY3VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGRvRnVsbHNjcmVlblRlc3QoIk1hdGNoUGFyZW50IiwKLSAgICAgICAgICAgIChXaW5kb3dTdGF0ZSBwYXJlbnQsIFdpbmRvd1N0YXRlIGRpYWxvZykgLT4gewotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhkaWFsb2cuZ2V0TmFtZSgpLCBtQW1XbVN0YXRlLmdldFdtU3RhdGUoKS5nZXRGb2N1c2VkV2luZG93KCkpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9Gb2N1c0RpYWxvZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBkb0Z1bGxzY3JlZW5UZXN0KCJOb0ZvY3VzIiwKLSAgICAgICAgICAgIChXaW5kb3dTdGF0ZSBwYXJlbnQsIFdpbmRvd1N0YXRlIGRpYWxvZykgLT4gewotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhwYXJlbnQuZ2V0TmFtZSgpLCBtQW1XbVN0YXRlLmdldFdtU3RhdGUoKS5nZXRGb2N1c2VkV2luZG93KCkpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWFyZ2luc0FyZVBlcmNlbnRhZ2VzT2ZDb250ZW50RnJhbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmxvYXQgaG9yaXpvbnRhbE1hcmdpbiA9IC4yNWY7Ci0gICAgICAgIGZsb2F0IHZlcnRpY2FsTWFyZ2luID0gLjM1ZjsKLSAgICAgICAgZG9QYXJlbnRDaGlsZFRlc3QoIldpdGhNYXJnaW5zIiwKLSAgICAgICAgICAgIChXaW5kb3dTdGF0ZSBwYXJlbnQsIFdpbmRvd1N0YXRlIGRpYWxvZykgLT4gewotICAgICAgICAgICAgICAgIFJlY3RhbmdsZSBmcmFtZSA9IHBhcmVudC5nZXRDb250ZW50RnJhbWUoKTsKLSAgICAgICAgICAgICAgICBSZWN0YW5nbGUgZXhwZWN0ZWRGcmFtZSA9IG5ldyBSZWN0YW5nbGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAoaW50KShob3Jpem9udGFsTWFyZ2luKmZyYW1lLndpZHRoICsgZnJhbWUueCksCi0gICAgICAgICAgICAgICAgICAgICAgICAoaW50KSh2ZXJ0aWNhbE1hcmdpbipmcmFtZS5oZWlnaHQgKyBmcmFtZS55KSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgbVNpemUpOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZEZyYW1lLCBkaWFsb2cuZ2V0RnJhbWUoKSk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdERpYWxvZ1BsYWNlZEFib3ZlUGFyZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGRvUGFyZW50Q2hpbGRUZXN0KCJNYXRjaFBhcmVudCIsCi0gICAgICAgICAgICAoV2luZG93U3RhdGUgcGFyZW50LCBXaW5kb3dTdGF0ZSBkaWFsb2cpIC0+IHsKLSAgICAgICAgICAgICAgICAvLyBOb3Qgb25seSBzaG91bGQgdGhlIGRpYWxvZyBiZSBoaWdoZXIsIGJ1dCBpdCBzaG91bGQgYmUKLSAgICAgICAgICAgICAgICAvLyBsZWF2ZSBtdWx0aXBsZSBsYXllcnMgb2Ygc3BhY2UgaW5iZXR3ZWVuIGZvciBEaW1MYXllcnMsCi0gICAgICAgICAgICAgICAgLy8gZXRjLi4uCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShkaWFsb2cuZ2V0TGF5ZXIoKSAtIHBhcmVudC5nZXRMYXllcigpID49IDUpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0dXBUZXN0KCkgewotICAgICAgICBtU2l6ZSA9IGdldFNpemUoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXRTaXplKCkgewotICAgICAgICBpbnQgc2l6ZSA9IGV4cGxpY2l0RGltZW5zaW9uOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZmxvYXQgZGVuc2l0eSA9IGdldERlbnNpdHkoKTsKLSAgICAgICAgICAgIHNpemUgPSBkZW5zaXR5ID4gMS4wID8gZXhwbGljaXREaW1lbnNpb24gOiAoaW50KShleHBsaWNpdERpbWVuc2lvbiAqIGRlbnNpdHkpOwotICAgICAgICB9IGNhdGNoIChEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzaXplOwotICAgIH0KLQotICAgIHByaXZhdGUgZmxvYXQgZ2V0RGVuc2l0eSgpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBmbG9hdCBkZW5zaXR5OwotICAgICAgICBTdHJpbmcgb3V0cHV0ID0gcnVuQ29tbWFuZEFuZFByaW50T3V0cHV0KCJ3bSBkZW5zaXR5Iik7Ci0gICAgICAgIGlmIChvdXRwdXQuY29udGFpbnMoIk92ZXJyaWRlIGRlbnNpdHkiKSkgewotICAgICAgICAgICAgaW50IGNudCA9IG91dHB1dC5pbmRleE9mKCJPdmVycmlkZSBkZW5zaXR5Iik7Ci0gICAgICAgICAgICBTdHJpbmcgdG9rZW4gPSBvdXRwdXQuc3Vic3RyaW5nKGNudCArIDE4KTsKLSAgICAgICAgICAgIGRlbnNpdHkgPSBGbG9hdC5wYXJzZUZsb2F0KHRva2VuLnJlcGxhY2UoIlxuIiwiIikpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3RyaW5nIHRva2Vuc1tdID0gb3V0cHV0LnNwbGl0KCI6ICIpOwotICAgICAgICAgICAgZGVuc2l0eSA9IEZsb2F0LnBhcnNlRmxvYXQodG9rZW5zWzFdLnJlcGxhY2UoIlxuIiwiIikpOwotICAgICAgICB9Ci0gICAgICAgIGZsb2F0IHJldCA9IGRlbnNpdHkgLyAxNjBmOwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL3dpbmRvd21hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9QYXJlbnRDaGlsZFRlc3RCYXNlLmphdmEgYi9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci93aW5kb3dtYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9jdHMvUGFyZW50Q2hpbGRUZXN0QmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGNhOWY0Li4wMDAwMDAwCi0tLSBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL3dpbmRvd21hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2N0cy9QYXJlbnRDaGlsZFRlc3RCYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnNlcnZlci5jdHM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuTG9nLkxvZ0xldmVsOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmxvZy5Mb2dVdGlsLkNMb2c7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuRGV2aWNlVGVzdENhc2U7Ci0KLWltcG9ydCBhbmRyb2lkLnNlcnZlci5jdHMuV2luZG93TWFuYWdlclN0YXRlLldpbmRvd1N0YXRlOwotaW1wb3J0IGFuZHJvaWQuc2VydmVyLmN0cy5BY3Rpdml0eU1hbmFnZXJUZXN0QmFzZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFBhcmVudENoaWxkVGVzdEJhc2UgZXh0ZW5kcyBBY3Rpdml0eU1hbmFnZXJUZXN0QmFzZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBPTkVOVF9OQU1FID0gImFuZHJvaWQuc2VydmVyLkZyYW1lVGVzdEFwcCI7Ci0KLSAgICBpbnRlcmZhY2UgUGFyZW50Q2hpbGRUZXN0IHsKLSAgICAgICAgdm9pZCBkb1Rlc3QoV2luZG93U3RhdGUgcGFyZW50LCBXaW5kb3dTdGF0ZSBjaGlsZCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnRUZXN0Q2FzZShTdHJpbmcgdGVzdENhc2UpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzZXRDb21wb25lbnROYW1lKENPTVBPTkVOVF9OQU1FKTsKLSAgICAgICAgU3RyaW5nIGNtZCA9IGdldEFtU3RhcnRDbWQoYWN0aXZpdHlOYW1lKCksIGludGVudEtleSgpLCB0ZXN0Q2FzZSk7Ci0gICAgICAgIENMb2cubG9nQW5kRGlzcGxheShMb2dMZXZlbC5JTkZPLCBjbWQpOwotICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKGNtZCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnRUZXN0Q2FzZURvY2tlZChTdHJpbmcgdGVzdENhc2UpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzZXRDb21wb25lbnROYW1lKENPTVBPTkVOVF9OQU1FKTsKLSAgICAgICAgU3RyaW5nIGNtZCA9IGdldEFtU3RhcnRDbWQoYWN0aXZpdHlOYW1lKCksIGludGVudEtleSgpLCB0ZXN0Q2FzZSk7Ci0gICAgICAgIENMb2cubG9nQW5kRGlzcGxheShMb2dMZXZlbC5JTkZPLCBjbWQpOwotICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKGNtZCk7Ci0gICAgICAgIG1vdmVBY3Rpdml0eVRvRG9ja1N0YWNrKGFjdGl2aXR5TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBhYnN0cmFjdCBTdHJpbmcgaW50ZW50S2V5KCk7Ci0gICAgYWJzdHJhY3QgU3RyaW5nIGFjdGl2aXR5TmFtZSgpOwotCi0gICAgYWJzdHJhY3Qgdm9pZCBkb1NpbmdsZVRlc3QoUGFyZW50Q2hpbGRUZXN0IHQpIHRocm93cyBFeGNlcHRpb247Ci0KLSAgICB2b2lkIGRvRnVsbHNjcmVlblRlc3QoU3RyaW5nIHRlc3RDYXNlLCBQYXJlbnRDaGlsZFRlc3QgdCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIENMb2cubG9nQW5kRGlzcGxheShMb2dMZXZlbC5JTkZPLCAiUnVubmluZyB0ZXN0IGZ1bGxzY3JlZW4iKTsKLSAgICAgICAgc3RhcnRUZXN0Q2FzZSh0ZXN0Q2FzZSk7Ci0gICAgICAgIGRvU2luZ2xlVGVzdCh0KTsKLSAgICAgICAgc3RvcFRlc3RDYXNlKCk7Ci0gICAgfQotCi0gICAgdm9pZCBkb0RvY2tlZFRlc3QoU3RyaW5nIHRlc3RDYXNlLCBQYXJlbnRDaGlsZFRlc3QgdCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIENMb2cubG9nQW5kRGlzcGxheShMb2dMZXZlbC5JTkZPLCAiUnVubmluZyB0ZXN0IGRvY2tlZCIpOwotICAgICAgICBpZiAoIXN1cHBvcnRzU3BsaXRTY3JlZW5NdWx0aVdpbmRvdygpKSB7Ci0gICAgICAgICAgICBDTG9nLmxvZ0FuZERpc3BsYXkoTG9nTGV2ZWwuSU5GTywgIlNraXBwaW5nIHRlc3Q6IG5vIHNwbGl0IG11bHRpLXdpbmRvdyBzdXBwb3J0Iik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc3RhcnRUZXN0Q2FzZURvY2tlZCh0ZXN0Q2FzZSk7Ci0gICAgICAgIGRvU2luZ2xlVGVzdCh0KTsKLSAgICAgICAgc3RvcFRlc3RDYXNlKCk7Ci0gICAgfQotCi0gICAgdm9pZCBkb1BhcmVudENoaWxkVGVzdChTdHJpbmcgdGVzdENhc2UsIFBhcmVudENoaWxkVGVzdCB0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZG9GdWxsc2NyZWVuVGVzdCh0ZXN0Q2FzZSwgdCk7Ci0gICAgICAgIGRvRG9ja2VkVGVzdCh0ZXN0Q2FzZSwgdCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvZGV2aWNlc2lkZS9iYWNrdXAvbGF1bmNoZXIxL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL3Nob3J0Y3V0cy9kZXZpY2VzaWRlL2JhY2t1cC9sYXVuY2hlcjEvQW5kcm9pZC5tawppbmRleCBkNjA3N2E0Li5lM2ZlYjY2IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL3Nob3J0Y3V0cy9kZXZpY2VzaWRlL2JhY2t1cC9sYXVuY2hlcjEvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL3Nob3J0Y3V0cy9kZXZpY2VzaWRlL2JhY2t1cC9sYXVuY2hlcjEvQW5kcm9pZC5tawpAQCAtMjksMTQgKzI5LDE2IEBACiAgICAgJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCAuLi8uLi9jb21tb24vc3JjKQogCiBMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAotICAgIGFuZHJvaWQtc3VwcG9ydC10ZXN0IFwKLSAgICBhbmRyb2lkLXN1cHBvcnQtdjQgXAorICAgIGFuZHJvaWR4LnRlc3QucnVsZXMgXAorICAgIGFuZHJvaWR4LmxlZ2FjeV9sZWdhY3ktc3VwcG9ydC12NCBcCiAgICAgbW9ja2l0by10YXJnZXQtbWludXMtanVuaXQ0IFwKLSAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsIFwKLSAgICBjdHN0ZXN0cnVubmVyIFwKKyAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBcCisgICAgY3RzdGVzdHJ1bm5lci1heHQgXAogICAgIHViLXVpYXV0b21hdG9yIFwKICAgICBTaG9ydGN1dE1hbmFnZXJUZXN0VXRpbHMKIAorTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LmJhc2Uuc3R1YnMKKwogTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAogCiBpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3Nob3J0Y3V0cy9kZXZpY2VzaWRlL2JhY2t1cC9sYXVuY2hlcjEvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL2xhdW5jaGVyMS9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDc1YjNjYTAuLmYzMzk4ZGQgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL2xhdW5jaGVyMS9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL2xhdW5jaGVyMS9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0xOSw2ICsxOSw4IEBACiAgICAgcGFja2FnZT0iYW5kcm9pZC5jb250ZW50LnBtLmN0cy5zaG9ydGN1dC5iYWNrdXAubGF1bmNoZXIxIj4KIAogICAgIDxhcHBsaWNhdGlvbj4KKyAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CisKICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iTWFpbkFjdGl2aXR5IiBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIiA+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CkBAIC0yOSw3ICszMSw3IEBACiAgICAgPC9hcHBsaWNhdGlvbj4KIAogICAgIDxpbnN0cnVtZW50YXRpb24KLSAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmNvbnRlbnQucG0uY3RzLnNob3J0Y3V0LmJhY2t1cC5sYXVuY2hlcjEiICAvPgogPC9tYW5pZmVzdD4KIApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvZGV2aWNlc2lkZS9iYWNrdXAvbGF1bmNoZXIxL3NyYy9hbmRyb2lkL2NvbnRlbnQvcG0vY3RzL3Nob3J0Y3V0L2JhY2t1cC9sYXVuY2hlcjEvU2hvcnRjdXRNYW5hZ2VyUG9zdEJhY2t1cFRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL2xhdW5jaGVyMS9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9zaG9ydGN1dC9iYWNrdXAvbGF1bmNoZXIxL1Nob3J0Y3V0TWFuYWdlclBvc3RCYWNrdXBUZXN0LmphdmEKaW5kZXggYjgyYmIxZC4uZTc2Y2YyOCAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvZGV2aWNlc2lkZS9iYWNrdXAvbGF1bmNoZXIxL3NyYy9hbmRyb2lkL2NvbnRlbnQvcG0vY3RzL3Nob3J0Y3V0L2JhY2t1cC9sYXVuY2hlcjEvU2hvcnRjdXRNYW5hZ2VyUG9zdEJhY2t1cFRlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL3Nob3J0Y3V0cy9kZXZpY2VzaWRlL2JhY2t1cC9sYXVuY2hlcjEvc3JjL2FuZHJvaWQvY29udGVudC9wbS9jdHMvc2hvcnRjdXQvYmFja3VwL2xhdW5jaGVyMS9TaG9ydGN1dE1hbmFnZXJQb3N0QmFja3VwVGVzdC5qYXZhCkBAIC0xNyw2ICsxNyw3IEBACiAKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc2VydmVyLnBtLnNob3J0Y3V0bWFuYWdlcnRlc3QuU2hvcnRjdXRNYW5hZ2VyVGVzdFV0aWxzLmFzc2VydFdpdGg7CiAKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uU2hvcnRjdXRJbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5jdHMuc2hvcnRjdXQuZGV2aWNlLmNvbW1vbi5TaG9ydGN1dE1hbmFnZXJEZXZpY2VUZXN0QmFzZTsKIAogcHVibGljIGNsYXNzIFNob3J0Y3V0TWFuYWdlclBvc3RCYWNrdXBUZXN0IGV4dGVuZHMgU2hvcnRjdXRNYW5hZ2VyRGV2aWNlVGVzdEJhc2UgewpAQCAtNTcsOSArNTgsMjIgQEAKICAgICAgICAgICAgICAgICAuc2VsZWN0QnlJZHMoIm1zMSIpCiAgICAgICAgICAgICAgICAgLmFyZUFsbE5vdFBpbm5lZCgpOwogCisgICAgICAgIC8vIFBhY2thZ2UzIGRvZXNuJ3Qgc3VwcG9ydCBiYWNrdXAmcmVzdG9yZS4KKyAgICAgICAgLy8gSG93ZXZlciwgdGhlIG1hbmlmZXN0LXNob3J0Y3V0cyB3aWxsIGJlIHJlcHVibGlzaGVkIGFueXdheSwgc28gdGhleSdyZSBzdGlsbCBwaW5uZWQuCisgICAgICAgIC8vIFRoZSBkeW5hbWljIHNob3J0Y3V0cyBjYW4ndCBiZSByZXN0b3JlZCwgYnV0IHdlJ2xsIHN0aWxsIHJlc3RvcmUgdGhlbSBhcyBkaXNhYmxlZAorICAgICAgICAvLyBzaG9ydGN1dHMgdGhhdCBhcmUgbm90IHZpc2libGUgdG8gdGhlIHB1Ymxpc2hlci4KICAgICAgICAgYXNzZXJ0V2l0aChnZXRQYWNrYWdlU2hvcnRjdXRzKFNob3J0Y3V0TWFuYWdlclByZUJhY2t1cFRlc3QuUFVCTElTSEVSM19QS0cpKQotICAgICAgICAgICAgICAgIC5oYXZlSWRzKCJtczEiLCAibXMyIikKKyAgICAgICAgICAgICAgICAuaGF2ZUlkcygibXMxIiwgIm1zMiIsICJzMSIsICJzMiIpCisgICAgICAgICAgICAgICAgLmFyZUFsbFBpbm5lZCgpCisKKyAgICAgICAgICAgICAgICAuc2VsZWN0QnlJZHMoIm1zMSIsICJtczIiKQogICAgICAgICAgICAgICAgIC5hcmVBbGxFbmFibGVkKCkKLSAgICAgICAgICAgICAgICAuYXJlQWxsTm90UGlubmVkKCk7IC8vIFAzIGRvZXNuJ3QgZ2V0IGJhY2tlZCB1cCwgc28gbm8gbG9uZ2VyIHBpbm5lZC4KKyAgICAgICAgICAgICAgICAuYXJlQWxsV2l0aERpc2FibGVkUmVhc29uKFNob3J0Y3V0SW5mby5ESVNBQkxFRF9SRUFTT05fTk9UX0RJU0FCTEVEKQorCisgICAgICAgICAgICAgICAgLnJldmVydFRvT3JpZ2luYWxMaXN0KCkKKyAgICAgICAgICAgICAgICAuc2VsZWN0QnlJZHMoInMxIiwgInMyIikKKyAgICAgICAgICAgICAgICAuYXJlQWxsRGlzYWJsZWQoKQorICAgICAgICAgICAgICAgIC5hcmVBbGxXaXRoRGlzYWJsZWRSZWFzb24oU2hvcnRjdXRJbmZvLkRJU0FCTEVEX1JFQVNPTl9CQUNLVVBfTk9UX1NVUFBPUlRFRCkKKyAgICAgICAgICAgICAgICA7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvZGV2aWNlc2lkZS9iYWNrdXAvbGF1bmNoZXIyL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL3Nob3J0Y3V0cy9kZXZpY2VzaWRlL2JhY2t1cC9sYXVuY2hlcjIvQW5kcm9pZC5tawppbmRleCA4ZjEyNGEwLi5jOTg1MGVmIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL3Nob3J0Y3V0cy9kZXZpY2VzaWRlL2JhY2t1cC9sYXVuY2hlcjIvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL3Nob3J0Y3V0cy9kZXZpY2VzaWRlL2JhY2t1cC9sYXVuY2hlcjIvQW5kcm9pZC5tawpAQCAtMjksMTQgKzI5LDE2IEBACiAgICAgJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCAuLi8uLi9jb21tb24vc3JjKQogCiBMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAotICAgIGFuZHJvaWQtc3VwcG9ydC10ZXN0IFwKLSAgICBhbmRyb2lkLXN1cHBvcnQtdjQgXAorICAgIGFuZHJvaWR4LnRlc3QucnVsZXMgXAorICAgIGFuZHJvaWR4LmxlZ2FjeV9sZWdhY3ktc3VwcG9ydC12NCBcCiAgICAgbW9ja2l0by10YXJnZXQtbWludXMtanVuaXQ0IFwKLSAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsIFwKLSAgICBjdHN0ZXN0cnVubmVyIFwKKyAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBcCisgICAgY3RzdGVzdHJ1bm5lci1heHQgXAogICAgIHViLXVpYXV0b21hdG9yIFwKICAgICBTaG9ydGN1dE1hbmFnZXJUZXN0VXRpbHMKIAorTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LmJhc2Uuc3R1YnMKKwogTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAogCiBpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3Nob3J0Y3V0cy9kZXZpY2VzaWRlL2JhY2t1cC9sYXVuY2hlcjIvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL2xhdW5jaGVyMi9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDcxZmZjNjEuLjA4YzQ4MTcgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL2xhdW5jaGVyMi9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL2xhdW5jaGVyMi9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0xOSw2ICsxOSw4IEBACiAgICAgcGFja2FnZT0iYW5kcm9pZC5jb250ZW50LnBtLmN0cy5zaG9ydGN1dC5iYWNrdXAubGF1bmNoZXIyIj4KIAogICAgIDxhcHBsaWNhdGlvbj4KKyAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CisKICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iTWFpbkFjdGl2aXR5IiBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIiA+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CkBAIC0yOSw3ICszMSw3IEBACiAgICAgPC9hcHBsaWNhdGlvbj4KIAogICAgIDxpbnN0cnVtZW50YXRpb24KLSAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmNvbnRlbnQucG0uY3RzLnNob3J0Y3V0LmJhY2t1cC5sYXVuY2hlcjIiICAvPgogPC9tYW5pZmVzdD4KIApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvZGV2aWNlc2lkZS9iYWNrdXAvbGF1bmNoZXIyL3NyYy9hbmRyb2lkL2NvbnRlbnQvcG0vY3RzL3Nob3J0Y3V0L2JhY2t1cC9sYXVuY2hlcjIvU2hvcnRjdXRNYW5hZ2VyUG9zdEJhY2t1cFRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL2xhdW5jaGVyMi9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9zaG9ydGN1dC9iYWNrdXAvbGF1bmNoZXIyL1Nob3J0Y3V0TWFuYWdlclBvc3RCYWNrdXBUZXN0LmphdmEKaW5kZXggNzVjNzljNS4uMTE1YzQ3NiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvZGV2aWNlc2lkZS9iYWNrdXAvbGF1bmNoZXIyL3NyYy9hbmRyb2lkL2NvbnRlbnQvcG0vY3RzL3Nob3J0Y3V0L2JhY2t1cC9sYXVuY2hlcjIvU2hvcnRjdXRNYW5hZ2VyUG9zdEJhY2t1cFRlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL3Nob3J0Y3V0cy9kZXZpY2VzaWRlL2JhY2t1cC9sYXVuY2hlcjIvc3JjL2FuZHJvaWQvY29udGVudC9wbS9jdHMvc2hvcnRjdXQvYmFja3VwL2xhdW5jaGVyMi9TaG9ydGN1dE1hbmFnZXJQb3N0QmFja3VwVGVzdC5qYXZhCkBAIC0xNyw2ICsxNyw3IEBACiAKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc2VydmVyLnBtLnNob3J0Y3V0bWFuYWdlcnRlc3QuU2hvcnRjdXRNYW5hZ2VyVGVzdFV0aWxzLmFzc2VydFdpdGg7CiAKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uU2hvcnRjdXRJbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5jdHMuc2hvcnRjdXQuZGV2aWNlLmNvbW1vbi5TaG9ydGN1dE1hbmFnZXJEZXZpY2VUZXN0QmFzZTsKIAogcHVibGljIGNsYXNzIFNob3J0Y3V0TWFuYWdlclBvc3RCYWNrdXBUZXN0IGV4dGVuZHMgU2hvcnRjdXRNYW5hZ2VyRGV2aWNlVGVzdEJhc2UgewpAQCAtNTEsOCArNTIsMjIgQEAKICAgICAgICAgICAgICAgICAuc2VsZWN0QnlJZHMoIm1zMiIpCiAgICAgICAgICAgICAgICAgLmFyZUFsbE5vdFBpbm5lZCgpOwogCisgICAgICAgIC8vIFBhY2thZ2UzIGRvZXNuJ3Qgc3VwcG9ydCBiYWNrdXAmcmVzdG9yZS4KKyAgICAgICAgLy8gSG93ZXZlciwgdGhlIG1hbmlmZXN0LXNob3J0Y3V0cyB3aWxsIGJlIHJlcHVibGlzaGVkIGFueXdheSwgc28gdGhleSdyZSBzdGlsbCBwaW5uZWQuCisgICAgICAgIC8vIFRoZSBkeW5hbWljIHNob3J0Y3V0cyBjYW4ndCBiZSByZXN0b3JlZCwgYnV0IHdlJ2xsIHN0aWxsIHJlc3RvcmUgdGhlbSBhcyBkaXNhYmxlZAorICAgICAgICAvLyBzaG9ydGN1dHMgdGhhdCBhcmUgbm90IHZpc2libGUgdG8gdGhlIHB1Ymxpc2hlci4KICAgICAgICAgYXNzZXJ0V2l0aChnZXRQYWNrYWdlU2hvcnRjdXRzKFNob3J0Y3V0TWFuYWdlclByZUJhY2t1cFRlc3QuUFVCTElTSEVSM19QS0cpKQotICAgICAgICAgICAgICAgIC5oYXZlSWRzKCJtczEiLCAibXMyIikKLSAgICAgICAgICAgICAgICAuYXJlQWxsRW5hYmxlZCgpOworICAgICAgICAgICAgICAgIC5oYXZlSWRzKCJtczEiLCAibXMyIiwgInMyIiwgInMzIikKKyAgICAgICAgICAgICAgICAuYXJlQWxsUGlubmVkKCkKKworICAgICAgICAgICAgICAgIC5zZWxlY3RCeUlkcygibXMxIiwgIm1zMiIpCisgICAgICAgICAgICAgICAgLmFyZUFsbEVuYWJsZWQoKQorICAgICAgICAgICAgICAgIC5hcmVBbGxXaXRoRGlzYWJsZWRSZWFzb24oU2hvcnRjdXRJbmZvLkRJU0FCTEVEX1JFQVNPTl9OT1RfRElTQUJMRUQpCisKKyAgICAgICAgICAgICAgICAucmV2ZXJ0VG9PcmlnaW5hbExpc3QoKQorICAgICAgICAgICAgICAgIC5zZWxlY3RCeUlkcygiczIiLCAiczMiKQorICAgICAgICAgICAgICAgIC5hcmVBbGxEaXNhYmxlZCgpCisgICAgICAgICAgICAgICAgLmFyZUFsbFdpdGhEaXNhYmxlZFJlYXNvbihTaG9ydGN1dEluZm8uRElTQUJMRURfUkVBU09OX0JBQ0tVUF9OT1RfU1VQUE9SVEVEKQorICAgICAgICA7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvZGV2aWNlc2lkZS9iYWNrdXAvbGF1bmNoZXIzL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL3Nob3J0Y3V0cy9kZXZpY2VzaWRlL2JhY2t1cC9sYXVuY2hlcjMvQW5kcm9pZC5tawppbmRleCA5ODgzZTVjLi42ZWRhZGI4IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL3Nob3J0Y3V0cy9kZXZpY2VzaWRlL2JhY2t1cC9sYXVuY2hlcjMvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL3Nob3J0Y3V0cy9kZXZpY2VzaWRlL2JhY2t1cC9sYXVuY2hlcjMvQW5kcm9pZC5tawpAQCAtMjksMTQgKzI5LDE2IEBACiAgICAgJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCAuLi8uLi9jb21tb24vc3JjKQogCiBMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAotICAgIGFuZHJvaWQtc3VwcG9ydC10ZXN0IFwKLSAgICBhbmRyb2lkLXN1cHBvcnQtdjQgXAorICAgIGFuZHJvaWR4LnRlc3QucnVsZXMgXAorICAgIGFuZHJvaWR4LmxlZ2FjeV9sZWdhY3ktc3VwcG9ydC12NCBcCiAgICAgbW9ja2l0by10YXJnZXQtbWludXMtanVuaXQ0IFwKLSAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsIFwKLSAgICBjdHN0ZXN0cnVubmVyIFwKKyAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBcCisgICAgY3RzdGVzdHJ1bm5lci1heHQgXAogICAgIHViLXVpYXV0b21hdG9yIFwKICAgICBTaG9ydGN1dE1hbmFnZXJUZXN0VXRpbHMKIAorTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LmJhc2Uuc3R1YnMKKwogTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAogCiBpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3Nob3J0Y3V0cy9kZXZpY2VzaWRlL2JhY2t1cC9sYXVuY2hlcjMvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL2xhdW5jaGVyMy9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDgyZGMyOGYuLjRhMjVjMGUgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL2xhdW5jaGVyMy9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL2xhdW5jaGVyMy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0xOSw2ICsxOSw4IEBACiAgICAgcGFja2FnZT0iYW5kcm9pZC5jb250ZW50LnBtLmN0cy5zaG9ydGN1dC5iYWNrdXAubGF1bmNoZXIzIj4KIAogICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmFsbG93QmFja3VwPSJmYWxzZSI+CisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgorCiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ik1haW5BY3Rpdml0eSIgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIgPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgpAQCAtMjksNyArMzEsNyBAQAogICAgIDwvYXBwbGljYXRpb24+CiAKICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5jb250ZW50LnBtLmN0cy5zaG9ydGN1dC5iYWNrdXAubGF1bmNoZXIzIiAgLz4KIDwvbWFuaWZlc3Q+CiAKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL2xhdW5jaGVyNG5ldy9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvZGV2aWNlc2lkZS9iYWNrdXAvbGF1bmNoZXI0bmV3L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVkZWUzMgotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL2xhdW5jaGVyNG5ldy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNDQgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c1Nob3J0Y3V0QmFja3VwTGF1bmNoZXI0bmV3CisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIC4uL2xhdW5jaGVyNG9sZC9zcmMpIFwKKyAgICAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIC4uLy4uL2NvbW1vbi9zcmMpCisKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCisgICAgYW5kcm9pZHgudGVzdC5ydWxlcyBcCisgICAgYW5kcm9pZHgubGVnYWN5X2xlZ2FjeS1zdXBwb3J0LXY0IFwKKyAgICBtb2NraXRvLXRhcmdldC1taW51cy1qdW5pdDQgXAorICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0IFwKKyAgICBjdHN0ZXN0cnVubmVyLWF4dCBcCisgICAgdWItdWlhdXRvbWF0b3IgXAorICAgIFNob3J0Y3V0TWFuYWdlclRlc3RVdGlscworCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicworCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CisKK2luY2x1ZGUgJChCVUlMRF9DVFNfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL2xhdW5jaGVyNG5ldy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvZGV2aWNlc2lkZS9iYWNrdXAvbGF1bmNoZXI0bmV3L0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNkOWE2YwotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL2xhdW5jaGVyNG5ldy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsNDEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJhbmRyb2lkLmNvbnRlbnQucG0uY3RzLnNob3J0Y3V0LmJhY2t1cC5sYXVuY2hlcjQiCisgICAgYW5kcm9pZDp2ZXJzaW9uQ29kZT0iMTEiPgorCisgICAgPGFwcGxpY2F0aW9uPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJNYWluQWN0aXZpdHkiIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiID4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5ERUZBVUxUIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkhPTUUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5jb250ZW50LnBtLmFjdGlvbi5DT05GSVJNX1BJTl9TSE9SVENVVCIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPGluc3RydW1lbnRhdGlvbgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmNvbnRlbnQucG0uY3RzLnNob3J0Y3V0LmJhY2t1cC5sYXVuY2hlcjQiICAvPgorPC9tYW5pZmVzdD4KKwpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvZGV2aWNlc2lkZS9iYWNrdXAvbGF1bmNoZXI0b2xkL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL3Nob3J0Y3V0cy9kZXZpY2VzaWRlL2JhY2t1cC9sYXVuY2hlcjRvbGQvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTdlNDA1Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvZGV2aWNlc2lkZS9iYWNrdXAvbGF1bmNoZXI0b2xkL0FuZHJvaWQubWsKQEAgLTAsMCArMSw0NCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCisjIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0CitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzU2hvcnRjdXRCYWNrdXBMYXVuY2hlcjRvbGQKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKSBcCisgICAgJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCAuLi8uLi9jb21tb24vc3JjKQorCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAorICAgIGFuZHJvaWR4LnRlc3QucnVsZXMgXAorICAgIGFuZHJvaWR4LmxlZ2FjeV9sZWdhY3ktc3VwcG9ydC12NCBcCisgICAgbW9ja2l0by10YXJnZXQtbWludXMtanVuaXQ0IFwKKyAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBcCisgICAgY3RzdGVzdHJ1bm5lci1heHQgXAorICAgIHViLXVpYXV0b21hdG9yIFwKKyAgICBTaG9ydGN1dE1hbmFnZXJUZXN0VXRpbHMKKworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LmJhc2Uuc3R1YnMKKworTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorCitpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3Nob3J0Y3V0cy9kZXZpY2VzaWRlL2JhY2t1cC9sYXVuY2hlcjRvbGQvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL2xhdW5jaGVyNG9sZC9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZmU4OTAKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL3Nob3J0Y3V0cy9kZXZpY2VzaWRlL2JhY2t1cC9sYXVuY2hlcjRvbGQvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDQxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iYW5kcm9pZC5jb250ZW50LnBtLmN0cy5zaG9ydGN1dC5iYWNrdXAubGF1bmNoZXI0IgorICAgIGFuZHJvaWQ6dmVyc2lvbkNvZGU9IjEwIj4KKworICAgIDxhcHBsaWNhdGlvbj4KKyAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iTWFpbkFjdGl2aXR5IiBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIiA+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuREVGQVVMVCIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5IT01FIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuY29udGVudC5wbS5hY3Rpb24uQ09ORklSTV9QSU5fU0hPUlRDVVQiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgPC9hcHBsaWNhdGlvbj4KKworICAgIDxpbnN0cnVtZW50YXRpb24KKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5jb250ZW50LnBtLmN0cy5zaG9ydGN1dC5iYWNrdXAubGF1bmNoZXI0IiAgLz4KKzwvbWFuaWZlc3Q+CisKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL2xhdW5jaGVyNG9sZC9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9zaG9ydGN1dC9iYWNrdXAvbGF1bmNoZXI0L01haW5BY3Rpdml0eS5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvZGV2aWNlc2lkZS9iYWNrdXAvbGF1bmNoZXI0b2xkL3NyYy9hbmRyb2lkL2NvbnRlbnQvcG0vY3RzL3Nob3J0Y3V0L2JhY2t1cC9sYXVuY2hlcjQvTWFpbkFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMyMTVkNgotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL2xhdW5jaGVyNG9sZC9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9zaG9ydGN1dC9iYWNrdXAvbGF1bmNoZXI0L01haW5BY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQucG0uY3RzLnNob3J0Y3V0LmJhY2t1cC5sYXVuY2hlcjQ7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uTGF1bmNoZXJBcHBzOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuUGVyc2lzdGFibGVCdW5kbGU7CisKK3B1YmxpYyBjbGFzcyBNYWluQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIC8vIEp1c3QgYWNjZXB0IGFsbCByZXF1ZXN0cy4KKyAgICAgICAgaWYgKExhdW5jaGVyQXBwcy5BQ1RJT05fQ09ORklSTV9QSU5fU0hPUlRDVVQuZXF1YWxzKGdldEludGVudCgpLmdldEFjdGlvbigpKSkgeworICAgICAgICAgICAgTGF1bmNoZXJBcHBzLlBpbkl0ZW1SZXF1ZXN0IHJlcXVlc3QgPSBnZXRTeXN0ZW1TZXJ2aWNlKExhdW5jaGVyQXBwcy5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgLmdldFBpbkl0ZW1SZXF1ZXN0KGdldEludGVudCgpKTsKKyAgICAgICAgICAgIGZpbmFsIFBlcnNpc3RhYmxlQnVuZGxlIGV4dHJhcyA9IHJlcXVlc3QuZ2V0U2hvcnRjdXRJbmZvKCkuZ2V0RXh0cmFzKCk7CisgICAgICAgICAgICBpZiAoZXh0cmFzICE9IG51bGwgJiYgZXh0cmFzLmdldEJvb2xlYW4oImFjY2VwdGl0IikpIHsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LmFjY2VwdCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZpbmlzaCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL2xhdW5jaGVyNG9sZC9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9zaG9ydGN1dC9iYWNrdXAvbGF1bmNoZXI0L1Nob3J0Y3V0TWFuYWdlclBvc3RCYWNrdXBUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL3Nob3J0Y3V0cy9kZXZpY2VzaWRlL2JhY2t1cC9sYXVuY2hlcjRvbGQvc3JjL2FuZHJvaWQvY29udGVudC9wbS9jdHMvc2hvcnRjdXQvYmFja3VwL2xhdW5jaGVyNC9TaG9ydGN1dE1hbmFnZXJQb3N0QmFja3VwVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5ZWNmZWYKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL3Nob3J0Y3V0cy9kZXZpY2VzaWRlL2JhY2t1cC9sYXVuY2hlcjRvbGQvc3JjL2FuZHJvaWQvY29udGVudC9wbS9jdHMvc2hvcnRjdXQvYmFja3VwL2xhdW5jaGVyNC9TaG9ydGN1dE1hbmFnZXJQb3N0QmFja3VwVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5jb250ZW50LnBtLmN0cy5zaG9ydGN1dC5iYWNrdXAubGF1bmNoZXI0OworCitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5zaG9ydGN1dG1hbmFnZXJ0ZXN0LlNob3J0Y3V0TWFuYWdlclRlc3RVdGlscy5hc3NlcnRXaXRoOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlNob3J0Y3V0SW5mbzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uY3RzLnNob3J0Y3V0LmRldmljZS5jb21tb24uU2hvcnRjdXRNYW5hZ2VyRGV2aWNlVGVzdEJhc2U7CisKK3B1YmxpYyBjbGFzcyBTaG9ydGN1dE1hbmFnZXJQb3N0QmFja3VwVGVzdCBleHRlbmRzIFNob3J0Y3V0TWFuYWdlckRldmljZVRlc3RCYXNlIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworCisgICAgICAgIHNldEFzRGVmYXVsdExhdW5jaGVyKE1haW5BY3Rpdml0eS5jbGFzcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlc3RvcmVkT25PbGRWZXJzaW9uKCkgeworICAgICAgICBhc3NlcnRXaXRoKGdldFBhY2thZ2VTaG9ydGN1dHMoU2hvcnRjdXRNYW5hZ2VyUHJlQmFja3VwVGVzdC5QVUJMSVNIRVI0X1BLRykpCisgICAgICAgICAgICAgICAgLmhhdmVJZHMoIm1zMSIsICJtczIiLCAiczEiLCAiczIiKQorICAgICAgICAgICAgICAgIC5hcmVBbGxQaW5uZWQoKQorCisgICAgICAgICAgICAgICAgLnNlbGVjdEJ5SWRzKCJtczEiLCAibXMyIikKKyAgICAgICAgICAgICAgICAuYXJlQWxsRW5hYmxlZCgpCisgICAgICAgICAgICAgICAgLmFyZUFsbE1hbmlmZXN0KCkKKworICAgICAgICAgICAgICAgIC8vIHMxIGlzIHJlLXB1Ymxpc2hlZCwgc28gaXQncyBlbmFibGVkIGFuZCBkeW5hbWljLgorICAgICAgICAgICAgICAgIC5yZXZlcnRUb09yaWdpbmFsTGlzdCgpCisgICAgICAgICAgICAgICAgLnNlbGVjdEJ5SWRzKCJzMSIpCisgICAgICAgICAgICAgICAgLmFyZUFsbEVuYWJsZWQoKQorICAgICAgICAgICAgICAgIC5hcmVBbGxEeW5hbWljKCkKKyAgICAgICAgICAgICAgICAuZm9yQWxsU2hvcnRjdXRzKHNpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJzaG9ydGxhYmVsMV9uZXdfb25lIiwgc2kuZ2V0U2hvcnRMYWJlbCgpKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBUaGUgYXBwIHJlLXB1Ymxpc2hlZCB0aGUgc2hvcnRjdXQsIG5vdCB1cGRhdGVkLCBzbyB0aGUgZmllbGRzIHRoYXQgZXhpc3RlZAorICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgb3JpZ2luYWwgc2hvcnRjdXQgaXMgZ29uZSBub3cuCisgICAgICAgICAgICAgICAgICAgIGFzc2VydE51bGwoc2kuZ2V0RXh0cmFzKCkpOworICAgICAgICAgICAgICAgIH0pCisKKyAgICAgICAgICAgICAgICAucmV2ZXJ0VG9PcmlnaW5hbExpc3QoKQorICAgICAgICAgICAgICAgIC5zZWxlY3RCeUlkcygiczIiKQorICAgICAgICAgICAgICAgIC5hcmVBbGxEaXNhYmxlZCgpCisgICAgICAgICAgICAgICAgLmFyZUFsbFdpdGhEaXNhYmxlZFJlYXNvbihTaG9ydGN1dEluZm8uRElTQUJMRURfUkVBU09OX1ZFUlNJT05fTE9XRVIpCisgICAgICAgICAgICAgICAgLmZvckFsbFNob3J0Y3V0cyhzaSAtPiB7CisgICAgICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhlIGxhYmVsIHNob3VsZG4ndCBiZSB1cGRhdGVkIHdpdGggdGhlIHVwZGF0ZVNob3J0Y3V0cygpIGNhbGwuCisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygic2hvcnRsYWJlbDIiLCBzaS5nZXRTaG9ydExhYmVsKCkpOworICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLmFyZUFsbE5vdER5bmFtaWMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzdG9yZWRPbk5ld1ZlcnNpb24oKSB7CisgICAgICAgIGFzc2VydFdpdGgoZ2V0UGFja2FnZVNob3J0Y3V0cyhTaG9ydGN1dE1hbmFnZXJQcmVCYWNrdXBUZXN0LlBVQkxJU0hFUjRfUEtHKSkKKyAgICAgICAgICAgICAgICAuaGF2ZUlkcygibXMxIiwgIm1zMiIsICJzMSIsICJzMiIpCisgICAgICAgICAgICAgICAgLmFyZUFsbFBpbm5lZCgpCisKKyAgICAgICAgICAgICAgICAuc2VsZWN0QnlJZHMoIm1zMSIsICJtczIiKQorICAgICAgICAgICAgICAgIC5hcmVBbGxFbmFibGVkKCkKKyAgICAgICAgICAgICAgICAuYXJlQWxsTWFuaWZlc3QoKQorCisgICAgICAgICAgICAgICAgLy8gczEgaXMgcmUtcHVibGlzaGVkLCBzbyBpdCdzIGVuYWJsZWQgYW5kIGR5bmFtaWMuCisgICAgICAgICAgICAgICAgLnJldmVydFRvT3JpZ2luYWxMaXN0KCkKKyAgICAgICAgICAgICAgICAuc2VsZWN0QnlJZHMoInMxIiwgInMyIikKKyAgICAgICAgICAgICAgICAuYXJlQWxsRW5hYmxlZCgpCisKKyAgICAgICAgICAgICAgICAucmV2ZXJ0VG9PcmlnaW5hbExpc3QoKQorICAgICAgICAgICAgICAgIC5zZWxlY3RCeUlkcygiczEiKQorICAgICAgICAgICAgICAgIC5hcmVBbGxEeW5hbWljKCkKKyAgICAgICAgICAgICAgICAuZm9yQWxsU2hvcnRjdXRzKHNpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJzaG9ydGxhYmVsMV9uZXdfb25lIiwgc2kuZ2V0U2hvcnRMYWJlbCgpKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBUaGUgYXBwIHJlLXB1Ymxpc2hlZCB0aGUgc2hvcnRjdXQsIG5vdCB1cGRhdGVkLCBzbyB0aGUgZmllbGRzIHRoYXQgZXhpc3RlZAorICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgb3JpZ2luYWwgc2hvcnRjdXQgaXMgZ29uZSBub3cuCisgICAgICAgICAgICAgICAgICAgIGFzc2VydE51bGwoc2kuZ2V0RXh0cmFzKCkpOworICAgICAgICAgICAgICAgIH0pCisKKyAgICAgICAgICAgICAgICAucmV2ZXJ0VG9PcmlnaW5hbExpc3QoKQorICAgICAgICAgICAgICAgIC5zZWxlY3RCeUlkcygiczIiKQorICAgICAgICAgICAgICAgIC5hcmVBbGxOb3REeW5hbWljKCkKKyAgICAgICAgICAgICAgICAuZm9yQWxsU2hvcnRjdXRzKHNpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJzaG9ydGxhYmVsMl91cGRhdGVkIiwgc2kuZ2V0U2hvcnRMYWJlbCgpKTsKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIDsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZXN0b3JlV3JvbmdLZXkoKSB7CisgICAgICAgIGFzc2VydFdpdGgoZ2V0UGFja2FnZVNob3J0Y3V0cyhTaG9ydGN1dE1hbmFnZXJQcmVCYWNrdXBUZXN0LlBVQkxJU0hFUjRfUEtHKSkKKyAgICAgICAgICAgICAgICAuaGF2ZUlkcygibXMxIiwgIm1zMiIsICJzMSIsICJzMiIpCisgICAgICAgICAgICAgICAgLmFyZUFsbFBpbm5lZCgpCisKKyAgICAgICAgICAgICAgICAuc2VsZWN0QnlJZHMoIm1zMSIsICJtczIiKQorICAgICAgICAgICAgICAgIC5hcmVBbGxFbmFibGVkKCkKKyAgICAgICAgICAgICAgICAuYXJlQWxsTWFuaWZlc3QoKQorCisgICAgICAgICAgICAgICAgLy8gczEgaXMgcmUtcHVibGlzaGVkLCBzbyBpdCdzIGVuYWJsZWQgYW5kIGR5bmFtaWMuCisgICAgICAgICAgICAgICAgLnJldmVydFRvT3JpZ2luYWxMaXN0KCkKKyAgICAgICAgICAgICAgICAuc2VsZWN0QnlJZHMoInMxIikKKyAgICAgICAgICAgICAgICAuYXJlQWxsRW5hYmxlZCgpCisgICAgICAgICAgICAgICAgLmFyZUFsbER5bmFtaWMoKQorICAgICAgICAgICAgICAgIC5mb3JBbGxTaG9ydGN1dHMoc2kgLT4geworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInNob3J0bGFiZWwxX25ld19vbmUiLCBzaS5nZXRTaG9ydExhYmVsKCkpOworCisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBhcHAgcmUtcHVibGlzaGVkIHRoZSBzaG9ydGN1dCwgbm90IHVwZGF0ZWQsIHNvIHRoZSBmaWVsZHMgdGhhdCBleGlzdGVkCisgICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBvcmlnaW5hbCBzaG9ydGN1dCBpcyBnb25lIG5vdy4KKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0TnVsbChzaS5nZXRFeHRyYXMoKSk7CisgICAgICAgICAgICAgICAgfSkKKworCisgICAgICAgICAgICAgICAgLy8gdXBkYXRlU2hvcnRjdXRzKCkgc2hvdWxkbid0IHdvcmsgb24gaXQsIHNvIGl0IGtlZXBzIHRoZSBvcmlnaW5hbCBsYWJlbC4KKyAgICAgICAgICAgICAgICAucmV2ZXJ0VG9PcmlnaW5hbExpc3QoKQorICAgICAgICAgICAgICAgIC5zZWxlY3RCeUlkcygiczIiKQorICAgICAgICAgICAgICAgIC5hcmVBbGxOb3REeW5hbWljKCkKKyAgICAgICAgICAgICAgICAuZm9yQWxsU2hvcnRjdXRzKHNpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJzaG9ydGxhYmVsMiIsIHNpLmdldFNob3J0TGFiZWwoKSk7CisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZXN0b3JlTm9NYW5pZmVzdE9uT2xkVmVyc2lvbigpIHsKKyAgICAgICAgYXNzZXJ0V2l0aChnZXRQYWNrYWdlU2hvcnRjdXRzKFNob3J0Y3V0TWFuYWdlclByZUJhY2t1cFRlc3QuUFVCTElTSEVSNF9QS0cpKQorICAgICAgICAgICAgICAgIC5oYXZlSWRzKCJtczEiLCAibXMyIiwgInMxIiwgInMyIikKKyAgICAgICAgICAgICAgICAuYXJlQWxsUGlubmVkKCkKKworICAgICAgICAgICAgICAgIC5zZWxlY3RCeUlkcygiczEiLCAibXMxIikKKyAgICAgICAgICAgICAgICAuYXJlQWxsRW5hYmxlZCgpCisgICAgICAgICAgICAgICAgLmFyZUFsbER5bmFtaWMoKQorICAgICAgICAgICAgICAgIC5hcmVBbGxNdXRhYmxlKCkKKworICAgICAgICAgICAgICAgIC5yZXZlcnRUb09yaWdpbmFsTGlzdCgpCisgICAgICAgICAgICAgICAgLnNlbGVjdEJ5SWRzKCJzMiIsICJtczIiKQorICAgICAgICAgICAgICAgIC5hcmVBbGxEaXNhYmxlZCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZXN0b3JlTm9NYW5pZmVzdE9uTmV3VmVyc2lvbigpIHsKKyAgICAgICAgYXNzZXJ0V2l0aChnZXRQYWNrYWdlU2hvcnRjdXRzKFNob3J0Y3V0TWFuYWdlclByZUJhY2t1cFRlc3QuUFVCTElTSEVSNF9QS0cpKQorICAgICAgICAgICAgICAgIC5oYXZlSWRzKCJtczEiLCAibXMyIiwgInMxIiwgInMyIikKKyAgICAgICAgICAgICAgICAuYXJlQWxsUGlubmVkKCkKKworICAgICAgICAgICAgICAgIC5zZWxlY3RCeUlkcygibXMxIiwgIm1zMiIpCisgICAgICAgICAgICAgICAgLmFyZUFsbERpc2FibGVkKCkKKyAgICAgICAgICAgICAgICAuYXJlQWxsSW1tdXRhYmxlKCkKKyAgICAgICAgICAgICAgICAuYXJlQWxsV2l0aERpc2FibGVkUmVhc29uKFNob3J0Y3V0SW5mby5ESVNBQkxFRF9SRUFTT05fQVBQX0NIQU5HRUQpCisKKyAgICAgICAgICAgICAgICAucmV2ZXJ0VG9PcmlnaW5hbExpc3QoKQorICAgICAgICAgICAgICAgIC5zZWxlY3RCeUlkcygiczEiLCAiczIiKQorICAgICAgICAgICAgICAgIC5hcmVBbGxFbmFibGVkKCkKKyAgICAgICAgICAgICAgICAuYXJlQWxsTXV0YWJsZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZpc2libGVJZ25vcmVkKCkgeworICAgICAgICBhc3NlcnRXaXRoKGdldFBhY2thZ2VTaG9ydGN1dHMoU2hvcnRjdXRNYW5hZ2VyUHJlQmFja3VwVGVzdC5QVUJMSVNIRVI0X1BLRykpCisgICAgICAgICAgICAgICAgLmhhdmVJZHMoIm1zMSIsICJtczIiLCAiczEiLCAiczIiKQorCisgICAgICAgICAgICAgICAgLnNlbGVjdEJ5SWRzKCJtczEiLCAiczEiLCAiczIiKQorICAgICAgICAgICAgICAgIC5hcmVBbGxQaW5uZWQoKQorICAgICAgICAgICAgICAgIC5hcmVBbGxEaXNhYmxlZCgpCisgICAgICAgICAgICAgICAgLmFyZUFsbFdpdGhEaXNhYmxlZFJlYXNvbihTaG9ydGN1dEluZm8uRElTQUJMRURfUkVBU09OX1ZFUlNJT05fTE9XRVIpCisgICAgICAgICAgICAgICAgLmFyZUFsbE5vdER5bmFtaWMoKQorICAgICAgICAgICAgICAgIC5hcmVBbGxOb3RNYW5pZmVzdCgpCisKKyAgICAgICAgICAgICAgICAucmV2ZXJ0VG9PcmlnaW5hbExpc3QoKQorICAgICAgICAgICAgICAgIC5zZWxlY3RCeUlkcygibXMyIikKKyAgICAgICAgICAgICAgICAuYXJlQWxsRW5hYmxlZCgpCisgICAgICAgICAgICAgICAgLmFyZUFsbFBpbm5lZCgpCisgICAgICAgICAgICAgICAgLmFyZUFsbE5vdER5bmFtaWMoKQorICAgICAgICAgICAgICAgIC5hcmVBbGxOb3RNYW5pZmVzdCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL2xhdW5jaGVyNG9sZC9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9zaG9ydGN1dC9iYWNrdXAvbGF1bmNoZXI0L1Nob3J0Y3V0TWFuYWdlclByZUJhY2t1cFRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL2xhdW5jaGVyNG9sZC9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9zaG9ydGN1dC9iYWNrdXAvbGF1bmNoZXI0L1Nob3J0Y3V0TWFuYWdlclByZUJhY2t1cFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDk5MjU1Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvZGV2aWNlc2lkZS9iYWNrdXAvbGF1bmNoZXI0b2xkL3NyYy9hbmRyb2lkL2NvbnRlbnQvcG0vY3RzL3Nob3J0Y3V0L2JhY2t1cC9sYXVuY2hlcjQvU2hvcnRjdXRNYW5hZ2VyUHJlQmFja3VwVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQucG0uY3RzLnNob3J0Y3V0LmJhY2t1cC5sYXVuY2hlcjQ7CisKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc2VydmVyLnBtLnNob3J0Y3V0bWFuYWdlcnRlc3QuU2hvcnRjdXRNYW5hZ2VyVGVzdFV0aWxzLmxpc3Q7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uY3RzLnNob3J0Y3V0LmRldmljZS5jb21tb24uU2hvcnRjdXRNYW5hZ2VyRGV2aWNlVGVzdEJhc2U7CitpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlNtYWxsVGVzdDsKKworQFNtYWxsVGVzdAorcHVibGljIGNsYXNzIFNob3J0Y3V0TWFuYWdlclByZUJhY2t1cFRlc3QgZXh0ZW5kcyBTaG9ydGN1dE1hbmFnZXJEZXZpY2VUZXN0QmFzZSB7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIRVI0X1BLRyA9CisgICAgICAgICAgICAiYW5kcm9pZC5jb250ZW50LnBtLmN0cy5zaG9ydGN1dC5iYWNrdXAucHVibGlzaGVyNCI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworCisgICAgICAgIHNldEFzRGVmYXVsdExhdW5jaGVyKE1haW5BY3Rpdml0eS5jbGFzcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFByZUJhY2t1cCgpIHsKKyAgICAgICAgLy8gUGluIGFsbCB0aGUgc2hvcnRjdXRzLgorICAgICAgICBnZXRMYXVuY2hlckFwcHMoKS5waW5TaG9ydGN1dHMoUFVCTElTSEVSNF9QS0csIGxpc3QoInMxIiwgInMyIiwgIm1zMSIsICJtczIiKSwKKyAgICAgICAgICAgICAgICBnZXRVc2VySGFuZGxlKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL3B1Ymxpc2hlcjEvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL3B1Ymxpc2hlcjEvQW5kcm9pZC5tawppbmRleCA3MmRhOTAzLi44YmYzZWRmIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL3Nob3J0Y3V0cy9kZXZpY2VzaWRlL2JhY2t1cC9wdWJsaXNoZXIxL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvZGV2aWNlc2lkZS9iYWNrdXAvcHVibGlzaGVyMS9BbmRyb2lkLm1rCkBAIC0yOSwxNCArMjksMTYgQEAKICAgICAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIC4uLy4uL2NvbW1vbi9zcmMpCiAKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCi0gICAgYW5kcm9pZC1zdXBwb3J0LXRlc3QgXAotICAgIGFuZHJvaWQtc3VwcG9ydC12NCBcCisgICAgYW5kcm9pZHgudGVzdC5ydWxlcyBcCisgICAgYW5kcm9pZHgubGVnYWN5X2xlZ2FjeS1zdXBwb3J0LXY0IFwKICAgICBtb2NraXRvLXRhcmdldC1taW51cy1qdW5pdDQgXAotICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwgXAotICAgIGN0c3Rlc3RydW5uZXIgXAorICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0IFwKKyAgICBjdHN0ZXN0cnVubmVyLWF4dCBcCiAgICAgdWItdWlhdXRvbWF0b3IgXAogICAgIFNob3J0Y3V0TWFuYWdlclRlc3RVdGlscwogCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicworCiBMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CiAKIGluY2x1ZGUgJChCVUlMRF9DVFNfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL3B1Ymxpc2hlcjEvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL3B1Ymxpc2hlcjEvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCAzZDIzYzcyLi5hNTM3MDc3IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL3Nob3J0Y3V0cy9kZXZpY2VzaWRlL2JhY2t1cC9wdWJsaXNoZXIxL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvZGV2aWNlc2lkZS9iYWNrdXAvcHVibGlzaGVyMS9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0xOCw2ICsxOCw4IEBACiAgICAgcGFja2FnZT0iYW5kcm9pZC5jb250ZW50LnBtLmN0cy5zaG9ydGN1dC5iYWNrdXAucHVibGlzaGVyMSI+CiAKICAgICA8YXBwbGljYXRpb24+CisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgorCiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ik1haW5BY3Rpdml0eSIgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIgPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgpAQCAtMzgsNyArNDAsNyBAQAogICAgIDwvYXBwbGljYXRpb24+CiAKICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5jb250ZW50LnBtLmN0cy5zaG9ydGN1dC5iYWNrdXAucHVibGlzaGVyMSIgIC8+CiA8L21hbmlmZXN0PgogCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3Nob3J0Y3V0cy9kZXZpY2VzaWRlL2JhY2t1cC9wdWJsaXNoZXIyL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL3Nob3J0Y3V0cy9kZXZpY2VzaWRlL2JhY2t1cC9wdWJsaXNoZXIyL0FuZHJvaWQubWsKaW5kZXggMjg2ZGRlZC4uZTIxMTUyOSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvZGV2aWNlc2lkZS9iYWNrdXAvcHVibGlzaGVyMi9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL3B1Ymxpc2hlcjIvQW5kcm9pZC5tawpAQCAtMjksMTQgKzI5LDE2IEBACiAgICAgJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCAuLi8uLi9jb21tb24vc3JjKQogCiBMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAotICAgIGFuZHJvaWQtc3VwcG9ydC10ZXN0IFwKLSAgICBhbmRyb2lkLXN1cHBvcnQtdjQgXAorICAgIGFuZHJvaWR4LnRlc3QucnVsZXMgXAorICAgIGFuZHJvaWR4LmxlZ2FjeV9sZWdhY3ktc3VwcG9ydC12NCBcCiAgICAgbW9ja2l0by10YXJnZXQtbWludXMtanVuaXQ0IFwKLSAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsIFwKLSAgICBjdHN0ZXN0cnVubmVyIFwKKyAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBcCisgICAgY3RzdGVzdHJ1bm5lci1heHQgXAogICAgIHViLXVpYXV0b21hdG9yIFwKICAgICBTaG9ydGN1dE1hbmFnZXJUZXN0VXRpbHMKIAorTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LmJhc2Uuc3R1YnMKKwogTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAogCiBpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3Nob3J0Y3V0cy9kZXZpY2VzaWRlL2JhY2t1cC9wdWJsaXNoZXIyL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL3Nob3J0Y3V0cy9kZXZpY2VzaWRlL2JhY2t1cC9wdWJsaXNoZXIyL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggYzMyNzFiNC4uMTJiNWY1YyAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvZGV2aWNlc2lkZS9iYWNrdXAvcHVibGlzaGVyMi9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL3B1Ymxpc2hlcjIvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMTgsNiArMTgsOCBAQAogICAgIHBhY2thZ2U9ImFuZHJvaWQuY29udGVudC5wbS5jdHMuc2hvcnRjdXQuYmFja3VwLnB1Ymxpc2hlcjIiPgogCiAgICAgPGFwcGxpY2F0aW9uPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKwogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJNYWluQWN0aXZpdHkiIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiID4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KQEAgLTM5LDcgKzQxLDcgQEAKICAgICA8L2FwcGxpY2F0aW9uPgogCiAgICAgPGluc3RydW1lbnRhdGlvbgotICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuY29udGVudC5wbS5jdHMuc2hvcnRjdXQuYmFja3VwLnB1Ymxpc2hlcjIiICAvPgogPC9tYW5pZmVzdD4KIApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvZGV2aWNlc2lkZS9iYWNrdXAvcHVibGlzaGVyMy9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvZGV2aWNlc2lkZS9iYWNrdXAvcHVibGlzaGVyMy9BbmRyb2lkLm1rCmluZGV4IGYxNDIxZDEuLmM4MDg1YmMgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL3B1Ymxpc2hlcjMvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL3Nob3J0Y3V0cy9kZXZpY2VzaWRlL2JhY2t1cC9wdWJsaXNoZXIzL0FuZHJvaWQubWsKQEAgLTI5LDE0ICsyOSwxNiBAQAogICAgICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgLi4vLi4vY29tbW9uL3NyYykKIAogTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKLSAgICBhbmRyb2lkLXN1cHBvcnQtdGVzdCBcCi0gICAgYW5kcm9pZC1zdXBwb3J0LXY0IFwKKyAgICBhbmRyb2lkeC50ZXN0LnJ1bGVzIFwKKyAgICBhbmRyb2lkeC5sZWdhY3lfbGVnYWN5LXN1cHBvcnQtdjQgXAogICAgIG1vY2tpdG8tdGFyZ2V0LW1pbnVzLWp1bml0NCBcCi0gICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbCBcCi0gICAgY3RzdGVzdHJ1bm5lciBcCisgICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgXAorICAgIGN0c3Rlc3RydW5uZXItYXh0IFwKICAgICB1Yi11aWF1dG9tYXRvciBcCiAgICAgU2hvcnRjdXRNYW5hZ2VyVGVzdFV0aWxzCiAKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCisKIExPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKIAogaW5jbHVkZSAkKEJVSUxEX0NUU19QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvZGV2aWNlc2lkZS9iYWNrdXAvcHVibGlzaGVyMy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvZGV2aWNlc2lkZS9iYWNrdXAvcHVibGlzaGVyMy9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDVlMDNmZjguLmZlYWMyZWIgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL3B1Ymxpc2hlcjMvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL3Nob3J0Y3V0cy9kZXZpY2VzaWRlL2JhY2t1cC9wdWJsaXNoZXIzL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTE4LDYgKzE4LDggQEAKICAgICBwYWNrYWdlPSJhbmRyb2lkLmNvbnRlbnQucG0uY3RzLnNob3J0Y3V0LmJhY2t1cC5wdWJsaXNoZXIzIj4KIAogICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmFsbG93QmFja3VwPSJmYWxzZSI+CisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgorCiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ik1haW5BY3Rpdml0eSIgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIgPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgpAQCAtMjksNyArMzEsNyBAQAogICAgIDwvYXBwbGljYXRpb24+CiAKICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5jb250ZW50LnBtLmN0cy5zaG9ydGN1dC5iYWNrdXAucHVibGlzaGVyMyIgIC8+CiA8L21hbmlmZXN0PgogCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3Nob3J0Y3V0cy9kZXZpY2VzaWRlL2JhY2t1cC9wdWJsaXNoZXIzL3NyYy9hbmRyb2lkL2NvbnRlbnQvcG0vY3RzL3Nob3J0Y3V0L2JhY2t1cC9wdWJsaXNoZXIzL1Nob3J0Y3V0TWFuYWdlclBvc3RCYWNrdXBUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL3Nob3J0Y3V0cy9kZXZpY2VzaWRlL2JhY2t1cC9wdWJsaXNoZXIzL3NyYy9hbmRyb2lkL2NvbnRlbnQvcG0vY3RzL3Nob3J0Y3V0L2JhY2t1cC9wdWJsaXNoZXIzL1Nob3J0Y3V0TWFuYWdlclBvc3RCYWNrdXBUZXN0LmphdmEKaW5kZXggODcwZGFiOS4uMzNjOGY4MiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvZGV2aWNlc2lkZS9iYWNrdXAvcHVibGlzaGVyMy9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9zaG9ydGN1dC9iYWNrdXAvcHVibGlzaGVyMy9TaG9ydGN1dE1hbmFnZXJQb3N0QmFja3VwVGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL3B1Ymxpc2hlcjMvc3JjL2FuZHJvaWQvY29udGVudC9wbS9jdHMvc2hvcnRjdXQvYmFja3VwL3B1Ymxpc2hlcjMvU2hvcnRjdXRNYW5hZ2VyUG9zdEJhY2t1cFRlc3QuamF2YQpAQCAtMjEsMTYgKzIxLDE3IEBACiAKIHB1YmxpYyBjbGFzcyBTaG9ydGN1dE1hbmFnZXJQb3N0QmFja3VwVGVzdCBleHRlbmRzIFNob3J0Y3V0TWFuYWdlckRldmljZVRlc3RCYXNlIHsKICAgICBwdWJsaWMgdm9pZCB0ZXN0V2l0aFVuaW5zdGFsbCgpIHsKKyAgICAgICAgLy8gYmFja3VwID0gZmFsc2UsIHNvIGR5bmFtaWMgc2hvdWxkbid0IGJlIHJlc3RvcmVkLgogICAgICAgICBhc3NlcnRXaXRoKGdldE1hbmFnZXIoKS5nZXREeW5hbWljU2hvcnRjdXRzKCkpCiAgICAgICAgICAgICAgICAgLmlzRW1wdHkoKTsKIAotICAgICAgICAvLyBiYWNrdXAgPSBmYWxzZSwgc28gbm8gcGlubmVkIHNob3J0Y3V0cyBzaG91bGQgYmUgcmVzdG9yZWQuCisgICAgICAgIC8vIEJ1dCBtYW5pZmVzdCBzaG9ydGN1dHMgd2lsbCBiZSByZXN0b3JlZCBhbnl3YXksIHNvIHRoZXknbGwgcmVzdG9yZWQgYXMgcGlubmVkLgogICAgICAgICBhc3NlcnRXaXRoKGdldE1hbmFnZXIoKS5nZXRQaW5uZWRTaG9ydGN1dHMoKSkKLSAgICAgICAgICAgICAgICAuaXNFbXB0eSgpOworICAgICAgICAgICAgICAgIC5oYXZlSWRzKCJtczEiLCAibXMyIik7CiAKICAgICAgICAgYXNzZXJ0V2l0aChnZXRNYW5hZ2VyKCkuZ2V0TWFuaWZlc3RTaG9ydGN1dHMoKSkKICAgICAgICAgICAgICAgICAuaGF2ZUlkcygibXMxIiwgIm1zMiIpCi0gICAgICAgICAgICAgICAgLmFyZUFsbE5vdFBpbm5lZCgpOworICAgICAgICAgICAgICAgIC5hcmVBbGxQaW5uZWQoKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0V2l0aE5vVW5pbnN0YWxsKCkgewpAQCAtMzksOCArNDAsOCBAQAogICAgICAgICAgICAgICAgIC5oYXZlSWRzKCJzMSIsICJzMiIsICJzMyIpCiAgICAgICAgICAgICAgICAgLmFyZUFsbE5vdFBpbm5lZCgpOwogCisgICAgICAgIC8vIE1hbmlmZXN0IHNob3J0Y3V0cyBzaG91bGQgc3RpbGwgYmUgcHVibGlzaGVkLgogICAgICAgICBhc3NlcnRXaXRoKGdldE1hbmFnZXIoKS5nZXRNYW5pZmVzdFNob3J0Y3V0cygpKQotICAgICAgICAgICAgICAgIC5oYXZlSWRzKCJtczEiLCAibXMyIikKLSAgICAgICAgICAgICAgICAuYXJlQWxsTm90UGlubmVkKCk7CisgICAgICAgICAgICAgICAgLmhhdmVJZHMoIm1zMSIsICJtczIiKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3Nob3J0Y3V0cy9kZXZpY2VzaWRlL2JhY2t1cC9wdWJsaXNoZXI0bmV3L0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL3Nob3J0Y3V0cy9kZXZpY2VzaWRlL2JhY2t1cC9wdWJsaXNoZXI0bmV3L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM3ZjdmOQotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL3B1Ymxpc2hlcjRuZXcvQW5kcm9pZC5tawpAQCAtMCwwICsxLDQ2IEBACisjIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKKyMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNTaG9ydGN1dEJhY2t1cFB1Ymxpc2hlcjRuZXcKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgLi4vcHVibGlzaGVyNG9sZC9zcmMpIFwKKyAgICAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIC4uLy4uL2NvbW1vbi9zcmMpCisKK0xPQ0FMX1JFU09VUkNFX0RJUiA6PSAkKExPQ0FMX1BBVEgpLy4uL3B1Ymxpc2hlcjRvbGQvcmVzCisKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCisgICAgYW5kcm9pZHgudGVzdC5ydWxlcyBcCisgICAgYW5kcm9pZHgubGVnYWN5X2xlZ2FjeS1zdXBwb3J0LXY0IFwKKyAgICBtb2NraXRvLXRhcmdldC1taW51cy1qdW5pdDQgXAorICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0IFwKKyAgICBjdHN0ZXN0cnVubmVyLWF4dCBcCisgICAgdWItdWlhdXRvbWF0b3IgXAorICAgIFNob3J0Y3V0TWFuYWdlclRlc3RVdGlscworCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicworCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CisKK2luY2x1ZGUgJChCVUlMRF9DVFNfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL3B1Ymxpc2hlcjRuZXcvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL3B1Ymxpc2hlcjRuZXcvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzM0Zjk4Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvZGV2aWNlc2lkZS9iYWNrdXAvcHVibGlzaGVyNG5ldy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsNDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iYW5kcm9pZC5jb250ZW50LnBtLmN0cy5zaG9ydGN1dC5iYWNrdXAucHVibGlzaGVyNCIKKyAgICBhbmRyb2lkOnZlcnNpb25Db2RlPSIxMSI+CisKKyAgICA8YXBwbGljYXRpb24+CisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ik1haW5BY3Rpdml0eSIgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIgPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkRFRkFVTFQiIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hcHAuc2hvcnRjdXRzIiBhbmRyb2lkOnJlc291cmNlPSJAeG1sL3Nob3J0Y3V0cyIvPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgICAgICA8YWN0aXZpdHktYWxpYXMgYW5kcm9pZDpuYW1lPSJNYWluQWN0aXZpdHkyIgorICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRBY3Rpdml0eT0iYW5kcm9pZC5jb250ZW50LnBtLmN0cy5zaG9ydGN1dC5iYWNrdXAucHVibGlzaGVyNC5NYWluQWN0aXZpdHkiCisgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIiA+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuREVGQVVMVCIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eS1hbGlhcz4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPGluc3RydW1lbnRhdGlvbgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmNvbnRlbnQucG0uY3RzLnNob3J0Y3V0LmJhY2t1cC5wdWJsaXNoZXI0IiAgLz4KKzwvbWFuaWZlc3Q+CisKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL3B1Ymxpc2hlcjRuZXdfbm9iYWNrdXAvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL3B1Ymxpc2hlcjRuZXdfbm9iYWNrdXAvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzdiMTE0Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvZGV2aWNlc2lkZS9iYWNrdXAvcHVibGlzaGVyNG5ld19ub2JhY2t1cC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNDYgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c1Nob3J0Y3V0QmFja3VwUHVibGlzaGVyNG5ld19ub2JhY2t1cAorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCAuLi9wdWJsaXNoZXI0b2xkL3NyYykgXAorICAgICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgLi4vLi4vY29tbW9uL3NyYykKKworTE9DQUxfUkVTT1VSQ0VfRElSIDo9ICQoTE9DQUxfUEFUSCkvLi4vcHVibGlzaGVyNG9sZC9yZXMKKworTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKKyAgICBhbmRyb2lkeC50ZXN0LnJ1bGVzIFwKKyAgICBhbmRyb2lkeC5sZWdhY3lfbGVnYWN5LXN1cHBvcnQtdjQgXAorICAgIG1vY2tpdG8tdGFyZ2V0LW1pbnVzLWp1bml0NCBcCisgICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgXAorICAgIGN0c3Rlc3RydW5uZXItYXh0IFwKKyAgICB1Yi11aWF1dG9tYXRvciBcCisgICAgU2hvcnRjdXRNYW5hZ2VyVGVzdFV0aWxzCisKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCisKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKKworaW5jbHVkZSAkKEJVSUxEX0NUU19QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvZGV2aWNlc2lkZS9iYWNrdXAvcHVibGlzaGVyNG5ld19ub2JhY2t1cC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvZGV2aWNlc2lkZS9iYWNrdXAvcHVibGlzaGVyNG5ld19ub2JhY2t1cC9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3M2I0YTgKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL3Nob3J0Y3V0cy9kZXZpY2VzaWRlL2JhY2t1cC9wdWJsaXNoZXI0bmV3X25vYmFja3VwL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSw0NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJhbmRyb2lkLmNvbnRlbnQucG0uY3RzLnNob3J0Y3V0LmJhY2t1cC5wdWJsaXNoZXI0IgorICAgIGFuZHJvaWQ6dmVyc2lvbkNvZGU9IjExIj4KKworICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmFsbG93QmFja3VwPSJmYWxzZSI+CisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ik1haW5BY3Rpdml0eSIgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIgPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkRFRkFVTFQiIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hcHAuc2hvcnRjdXRzIiBhbmRyb2lkOnJlc291cmNlPSJAeG1sL3Nob3J0Y3V0cyIvPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgICAgICA8YWN0aXZpdHktYWxpYXMgYW5kcm9pZDpuYW1lPSJNYWluQWN0aXZpdHkyIgorICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRBY3Rpdml0eT0iYW5kcm9pZC5jb250ZW50LnBtLmN0cy5zaG9ydGN1dC5iYWNrdXAucHVibGlzaGVyNC5NYWluQWN0aXZpdHkiCisgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIiA+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuREVGQVVMVCIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eS1hbGlhcz4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPGluc3RydW1lbnRhdGlvbgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmNvbnRlbnQucG0uY3RzLnNob3J0Y3V0LmJhY2t1cC5wdWJsaXNoZXI0IiAgLz4KKzwvbWFuaWZlc3Q+CisKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL3B1Ymxpc2hlcjRuZXdfbm9tYW5pZmVzdC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvZGV2aWNlc2lkZS9iYWNrdXAvcHVibGlzaGVyNG5ld19ub21hbmlmZXN0L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMwYjQ5NwotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL3B1Ymxpc2hlcjRuZXdfbm9tYW5pZmVzdC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNDYgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c1Nob3J0Y3V0QmFja3VwUHVibGlzaGVyNG5ld19ub21hbmlmZXN0CisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIC4uL3B1Ymxpc2hlcjRvbGQvc3JjKSBcCisgICAgJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCAuLi8uLi9jb21tb24vc3JjKQorCitMT0NBTF9SRVNPVVJDRV9ESVIgOj0gJChMT0NBTF9QQVRIKS8uLi9wdWJsaXNoZXI0b2xkL3JlcworCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAorICAgIGFuZHJvaWR4LnRlc3QucnVsZXMgXAorICAgIGFuZHJvaWR4LmxlZ2FjeV9sZWdhY3ktc3VwcG9ydC12NCBcCisgICAgbW9ja2l0by10YXJnZXQtbWludXMtanVuaXQ0IFwKKyAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBcCisgICAgY3RzdGVzdHJ1bm5lci1heHQgXAorICAgIHViLXVpYXV0b21hdG9yIFwKKyAgICBTaG9ydGN1dE1hbmFnZXJUZXN0VXRpbHMKKworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LmJhc2Uuc3R1YnMKKworTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorCitpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3Nob3J0Y3V0cy9kZXZpY2VzaWRlL2JhY2t1cC9wdWJsaXNoZXI0bmV3X25vbWFuaWZlc3QvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL3B1Ymxpc2hlcjRuZXdfbm9tYW5pZmVzdC9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ZDRmNzUKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL3Nob3J0Y3V0cy9kZXZpY2VzaWRlL2JhY2t1cC9wdWJsaXNoZXI0bmV3X25vbWFuaWZlc3QvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDM3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+Cis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImFuZHJvaWQuY29udGVudC5wbS5jdHMuc2hvcnRjdXQuYmFja3VwLnB1Ymxpc2hlcjQiCisgICAgYW5kcm9pZDp2ZXJzaW9uQ29kZT0iMTEiPgorCisgICAgPGFwcGxpY2F0aW9uPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJNYWluQWN0aXZpdHkiIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiID4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5ERUZBVUxUIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgIDwvYXBwbGljYXRpb24+CisKKyAgICA8aW5zdHJ1bWVudGF0aW9uCisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuY29udGVudC5wbS5jdHMuc2hvcnRjdXQuYmFja3VwLnB1Ymxpc2hlcjQiICAvPgorPC9tYW5pZmVzdD4KKwpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvZGV2aWNlc2lkZS9iYWNrdXAvcHVibGlzaGVyNG5ld193cm9uZ2tleS9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvZGV2aWNlc2lkZS9iYWNrdXAvcHVibGlzaGVyNG5ld193cm9uZ2tleS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzM2I1NDcKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL3Nob3J0Y3V0cy9kZXZpY2VzaWRlL2JhY2t1cC9wdWJsaXNoZXI0bmV3X3dyb25na2V5L0FuZHJvaWQubWsKQEAgLTAsMCArMSw0OCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCisjIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0CitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzU2hvcnRjdXRCYWNrdXBQdWJsaXNoZXI0bmV3X3dyb25na2V5CisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIC4uL3B1Ymxpc2hlcjRvbGQvc3JjKSBcCisgICAgJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCAuLi8uLi9jb21tb24vc3JjKQorCitMT0NBTF9SRVNPVVJDRV9ESVIgOj0gJChMT0NBTF9QQVRIKS8uLi9wdWJsaXNoZXI0b2xkL3JlcworCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAorICAgIGFuZHJvaWR4LnRlc3QucnVsZXMgXAorICAgIGFuZHJvaWR4LmxlZ2FjeV9sZWdhY3ktc3VwcG9ydC12NCBcCisgICAgbW9ja2l0by10YXJnZXQtbWludXMtanVuaXQ0IFwKKyAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBcCisgICAgY3RzdGVzdHJ1bm5lci1heHQgXAorICAgIHViLXVpYXV0b21hdG9yIFwKKyAgICBTaG9ydGN1dE1hbmFnZXJUZXN0VXRpbHMKKworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LmJhc2Uuc3R1YnMKKworTE9DQUxfQ0VSVElGSUNBVEUgOj0gY3RzL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvY2VydHMvY3RzLXRlc3RrZXkxCisKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKKworaW5jbHVkZSAkKEJVSUxEX0NUU19QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvZGV2aWNlc2lkZS9iYWNrdXAvcHVibGlzaGVyNG5ld193cm9uZ2tleS9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvZGV2aWNlc2lkZS9iYWNrdXAvcHVibGlzaGVyNG5ld193cm9uZ2tleS9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3M2I0YTgKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL3Nob3J0Y3V0cy9kZXZpY2VzaWRlL2JhY2t1cC9wdWJsaXNoZXI0bmV3X3dyb25na2V5L0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSw0NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJhbmRyb2lkLmNvbnRlbnQucG0uY3RzLnNob3J0Y3V0LmJhY2t1cC5wdWJsaXNoZXI0IgorICAgIGFuZHJvaWQ6dmVyc2lvbkNvZGU9IjExIj4KKworICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmFsbG93QmFja3VwPSJmYWxzZSI+CisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ik1haW5BY3Rpdml0eSIgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIgPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkRFRkFVTFQiIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hcHAuc2hvcnRjdXRzIiBhbmRyb2lkOnJlc291cmNlPSJAeG1sL3Nob3J0Y3V0cyIvPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgICAgICA8YWN0aXZpdHktYWxpYXMgYW5kcm9pZDpuYW1lPSJNYWluQWN0aXZpdHkyIgorICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRBY3Rpdml0eT0iYW5kcm9pZC5jb250ZW50LnBtLmN0cy5zaG9ydGN1dC5iYWNrdXAucHVibGlzaGVyNC5NYWluQWN0aXZpdHkiCisgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIiA+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuREVGQVVMVCIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eS1hbGlhcz4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPGluc3RydW1lbnRhdGlvbgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmNvbnRlbnQucG0uY3RzLnNob3J0Y3V0LmJhY2t1cC5wdWJsaXNoZXI0IiAgLz4KKzwvbWFuaWZlc3Q+CisKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL3B1Ymxpc2hlcjRvbGQvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL3B1Ymxpc2hlcjRvbGQvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTk0NjJkCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvZGV2aWNlc2lkZS9iYWNrdXAvcHVibGlzaGVyNG9sZC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNDQgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c1Nob3J0Y3V0QmFja3VwUHVibGlzaGVyNG9sZAorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpIFwKKyAgICAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIC4uLy4uL2NvbW1vbi9zcmMpCisKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCisgICAgYW5kcm9pZHgudGVzdC5ydWxlcyBcCisgICAgYW5kcm9pZHgubGVnYWN5X2xlZ2FjeS1zdXBwb3J0LXY0IFwKKyAgICBtb2NraXRvLXRhcmdldC1taW51cy1qdW5pdDQgXAorICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0IFwKKyAgICBjdHN0ZXN0cnVubmVyLWF4dCBcCisgICAgdWItdWlhdXRvbWF0b3IgXAorICAgIFNob3J0Y3V0TWFuYWdlclRlc3RVdGlscworCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicworCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CisKK2luY2x1ZGUgJChCVUlMRF9DVFNfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL3B1Ymxpc2hlcjRvbGQvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL3B1Ymxpc2hlcjRvbGQvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWNjNzJlCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvZGV2aWNlc2lkZS9iYWNrdXAvcHVibGlzaGVyNG9sZC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsNDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iYW5kcm9pZC5jb250ZW50LnBtLmN0cy5zaG9ydGN1dC5iYWNrdXAucHVibGlzaGVyNCIKKyAgICBhbmRyb2lkOnZlcnNpb25Db2RlPSIxMCI+CisKKyAgICA8YXBwbGljYXRpb24+CisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ik1haW5BY3Rpdml0eSIgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIgPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkRFRkFVTFQiIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hcHAuc2hvcnRjdXRzIiBhbmRyb2lkOnJlc291cmNlPSJAeG1sL3Nob3J0Y3V0cyIvPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgICAgICA8YWN0aXZpdHktYWxpYXMgYW5kcm9pZDpuYW1lPSJNYWluQWN0aXZpdHkyIgorICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRBY3Rpdml0eT0iYW5kcm9pZC5jb250ZW50LnBtLmN0cy5zaG9ydGN1dC5iYWNrdXAucHVibGlzaGVyNC5NYWluQWN0aXZpdHkiCisgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIiA+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuREVGQVVMVCIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eS1hbGlhcz4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPGluc3RydW1lbnRhdGlvbgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmNvbnRlbnQucG0uY3RzLnNob3J0Y3V0LmJhY2t1cC5wdWJsaXNoZXI0IiAgLz4KKzwvbWFuaWZlc3Q+CisKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL3B1Ymxpc2hlcjRvbGQvcmVzL2RyYXdhYmxlLW5vZHBpL2JsYWNrXzE2eDE2LnBuZyBiL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL3B1Ymxpc2hlcjRvbGQvcmVzL2RyYXdhYmxlLW5vZHBpL2JsYWNrXzE2eDE2LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjZkYTVjCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvZGV2aWNlc2lkZS9iYWNrdXAvcHVibGlzaGVyNG9sZC9yZXMvZHJhd2FibGUtbm9kcGkvYmxhY2tfMTZ4MTYucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL3B1Ymxpc2hlcjRvbGQvcmVzL2RyYXdhYmxlLW5vZHBpL2JsYWNrXzE2eDY0LnBuZyBiL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL3B1Ymxpc2hlcjRvbGQvcmVzL2RyYXdhYmxlLW5vZHBpL2JsYWNrXzE2eDY0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDA0OWZhCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvZGV2aWNlc2lkZS9iYWNrdXAvcHVibGlzaGVyNG9sZC9yZXMvZHJhd2FibGUtbm9kcGkvYmxhY2tfMTZ4NjQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL3B1Ymxpc2hlcjRvbGQvcmVzL2RyYXdhYmxlLW5vZHBpL2JsYWNrXzY0eDE2LnBuZyBiL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL3B1Ymxpc2hlcjRvbGQvcmVzL2RyYXdhYmxlLW5vZHBpL2JsYWNrXzY0eDE2LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDk4M2M3Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvZGV2aWNlc2lkZS9iYWNrdXAvcHVibGlzaGVyNG9sZC9yZXMvZHJhd2FibGUtbm9kcGkvYmxhY2tfNjR4MTYucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL3B1Ymxpc2hlcjRvbGQvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL3B1Ymxpc2hlcjRvbGQvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODcyZWQxCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvZGV2aWNlc2lkZS9iYWNrdXAvcHVibGlzaGVyNG9sZC9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsMzcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibGFiZWwxIj5TaG9ydGN1dCAxPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb25nX2xhYmVsMSI+TG9uZyBzaG9ydGN1dCBsYWJlbDE8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpc2FibGVkX21lc3NhZ2UxIj5TaG9ydGN1dCAxIGlzIGRpc2FibGVkPC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImxhYmVsMiI+U2hvcnRjdXQgMjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9uZ19sYWJlbDIiPkxvbmcgc2hvcnRjdXQgbGFiZWwyPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaXNhYmxlZF9tZXNzYWdlMiI+U2hvcnRjdXQgMiBpcyBkaXNhYmxlZDwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJsYWJlbDMiPlNob3J0Y3V0IDM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvbmdfbGFiZWwzIj5Mb25nIHNob3J0Y3V0IGxhYmVsMzwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlzYWJsZWRfbWVzc2FnZTMiPlNob3J0Y3V0IDMgaXMgZGlzYWJsZWQ8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0ibGFiZWw0Ij5TaG9ydGN1dCA0PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb25nX2xhYmVsNCI+TG9uZyBzaG9ydGN1dCBsYWJlbDQ8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpc2FibGVkX21lc3NhZ2U0Ij5TaG9ydGN1dCA0IGlzIGRpc2FibGVkPC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImxhYmVsNSI+U2hvcnRjdXQgNTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9uZ19sYWJlbDUiPkxvbmcgc2hvcnRjdXQgbGFiZWw1PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaXNhYmxlZF9tZXNzYWdlNSI+U2hvcnRjdXQgNSBpcyBkaXNhYmxlZDwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3Nob3J0Y3V0cy9kZXZpY2VzaWRlL2JhY2t1cC9wdWJsaXNoZXI0b2xkL3Jlcy94bWwvc2hvcnRjdXRzLnhtbCBiL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL3B1Ymxpc2hlcjRvbGQvcmVzL3htbC9zaG9ydGN1dHMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExY2VkZTYKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL3Nob3J0Y3V0cy9kZXZpY2VzaWRlL2JhY2t1cC9wdWJsaXNoZXI0b2xkL3Jlcy94bWwvc2hvcnRjdXRzLnhtbApAQCAtMCwwICsxLDQ2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHNob3J0Y3V0cyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiID4KKyAgICA8c2hvcnRjdXQKKyAgICAgICAgYW5kcm9pZDpzaG9ydGN1dElkPSJtczEiCisgICAgICAgIGFuZHJvaWQ6aWNvbj0iQGRyYXdhYmxlL2JsYWNrXzE2eDE2IgorICAgICAgICBhbmRyb2lkOnNob3J0Y3V0U2hvcnRMYWJlbD0iQHN0cmluZy9sYWJlbDEiCisgICAgICAgIGFuZHJvaWQ6c2hvcnRjdXRMb25nTGFiZWw9IkBzdHJpbmcvbG9uZ19sYWJlbDEiCisgICAgICAgIGFuZHJvaWQ6c2hvcnRjdXREaXNhYmxlZE1lc3NhZ2U9IkBzdHJpbmcvZGlzYWJsZWRfbWVzc2FnZTEiPgorICAgICAgICA8aW50ZW50CisgICAgICAgICAgICBhbmRyb2lkOmFjdGlvbj0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlZJRVciIC8+CisgICAgICAgIDxjYXRlZ29yaWVzIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zaG9ydGN1dC5jb252ZXJzYXRpb24iIC8+CisgICAgICAgIDxjYXRlZ29yaWVzIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zaG9ydGN1dC5tZWRpYSIgLz4KKyAgICA8L3Nob3J0Y3V0PgorICAgIDxzaG9ydGN1dAorICAgICAgICBhbmRyb2lkOnNob3J0Y3V0SWQ9Im1zMiIKKyAgICAgICAgYW5kcm9pZDpzaG9ydGN1dFNob3J0TGFiZWw9IkBzdHJpbmcvbGFiZWwyIj4KKyAgICAgICAgYW5kcm9pZDpzaG9ydGN1dExvbmdMYWJlbD0iQHN0cmluZy9sb25nX2xhYmVsMiI+CisgICAgICAgIDxpbnRlbnQgYW5kcm9pZDphY3Rpb249ImFjdGlvbiIgLz4KKyAgICAgICAgPGludGVudCBhbmRyb2lkOmFjdGlvbj0iYWN0aW9uMiIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZGF0YT0iZGF0YSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bWltZVR5cGU9ImEvYiIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0icGtnIgorICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRDbGFzcz0icGtnLmNsYXNzIgorICAgICAgICAgICAgPgorICAgICAgICAgICAgPGNhdGVnb3JpZXMgYW5kcm9pZDpuYW1lPSJpY2F0MSIvPgorICAgICAgICAgICAgPGNhdGVnb3JpZXMgYW5kcm9pZDpuYW1lPSJpY2F0MiIvPgorICAgICAgICAgICAgPGV4dHJhIGFuZHJvaWQ6bmFtZT0ia2V5MSIgYW5kcm9pZDp2YWx1ZT0idmFsdWUxIiAvPgorICAgICAgICAgICAgPGV4dHJhIGFuZHJvaWQ6bmFtZT0ia2V5MiIgYW5kcm9pZDp2YWx1ZT0iMTIzIiAvPgorICAgICAgICAgICAgPGV4dHJhIGFuZHJvaWQ6bmFtZT0ia2V5MyIgYW5kcm9pZDp2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPC9pbnRlbnQ+CisgICAgPC9zaG9ydGN1dD4KKzwvc2hvcnRjdXRzPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvZGV2aWNlc2lkZS9iYWNrdXAvcHVibGlzaGVyNG9sZC9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9zaG9ydGN1dC9iYWNrdXAvcHVibGlzaGVyNC9NYWluQWN0aXZpdHkuamF2YSBiL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL3B1Ymxpc2hlcjRvbGQvc3JjL2FuZHJvaWQvY29udGVudC9wbS9jdHMvc2hvcnRjdXQvYmFja3VwL3B1Ymxpc2hlcjQvTWFpbkFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJhY2Y5ZAotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL3B1Ymxpc2hlcjRvbGQvc3JjL2FuZHJvaWQvY29udGVudC9wbS9jdHMvc2hvcnRjdXQvYmFja3VwL3B1Ymxpc2hlcjQvTWFpbkFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQuY29udGVudC5wbS5jdHMuc2hvcnRjdXQuYmFja3VwLnB1Ymxpc2hlcjQ7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKKworcHVibGljIGNsYXNzIE1haW5BY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL3B1Ymxpc2hlcjRvbGQvc3JjL2FuZHJvaWQvY29udGVudC9wbS9jdHMvc2hvcnRjdXQvYmFja3VwL3B1Ymxpc2hlcjQvU2hvcnRjdXRNYW5hZ2VyUG9zdEJhY2t1cFRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL3B1Ymxpc2hlcjRvbGQvc3JjL2FuZHJvaWQvY29udGVudC9wbS9jdHMvc2hvcnRjdXQvYmFja3VwL3B1Ymxpc2hlcjQvU2hvcnRjdXRNYW5hZ2VyUG9zdEJhY2t1cFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjRjOGJhCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvZGV2aWNlc2lkZS9iYWNrdXAvcHVibGlzaGVyNG9sZC9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9zaG9ydGN1dC9iYWNrdXAvcHVibGlzaGVyNC9TaG9ydGN1dE1hbmFnZXJQb3N0QmFja3VwVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5jb250ZW50LnBtLmN0cy5zaG9ydGN1dC5iYWNrdXAucHVibGlzaGVyNDsKKworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uc2hvcnRjdXRtYW5hZ2VydGVzdC5TaG9ydGN1dE1hbmFnZXJUZXN0VXRpbHMuYXNzZXJ0V2l0aDsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc2VydmVyLnBtLnNob3J0Y3V0bWFuYWdlcnRlc3QuU2hvcnRjdXRNYW5hZ2VyVGVzdFV0aWxzLmxpc3Q7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5zaG9ydGN1dG1hbmFnZXJ0ZXN0LlNob3J0Y3V0TWFuYWdlclRlc3RVdGlscy5zZXREZWZhdWx0TGF1bmNoZXI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlNob3J0Y3V0SW5mbzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uY3RzLnNob3J0Y3V0LmRldmljZS5jb21tb24uU2hvcnRjdXRNYW5hZ2VyRGV2aWNlVGVzdEJhc2U7CitpbXBvcnQgYW5kcm9pZC5vcy5QZXJzaXN0YWJsZUJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworCitpbXBvcnQgamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb207CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK3B1YmxpYyBjbGFzcyBTaG9ydGN1dE1hbmFnZXJQb3N0QmFja3VwVGVzdCBleHRlbmRzIFNob3J0Y3V0TWFuYWdlckRldmljZVRlc3RCYXNlIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzdG9yZWRPbk9sZFZlcnNpb24oKSB7CisgICAgICAgIGFzc2VydFdpdGgoZ2V0TWFuYWdlcigpLmdldER5bmFtaWNTaG9ydGN1dHMoKSkKKyAgICAgICAgICAgICAgICAuaXNFbXB0eSgpOworCisgICAgICAgIGFzc2VydFdpdGgoZ2V0TWFuYWdlcigpLmdldFBpbm5lZFNob3J0Y3V0cygpKQorICAgICAgICAgICAgICAgIC5oYXZlSWRzKCJtczEiLCAibXMyIikKKyAgICAgICAgICAgICAgICAuYXJlQWxsRW5hYmxlZCgpOworCisgICAgICAgIGFzc2VydFdpdGgoZ2V0TWFuYWdlcigpLmdldE1hbmlmZXN0U2hvcnRjdXRzKCkpCisgICAgICAgICAgICAgICAgLmhhdmVJZHMoIm1zMSIsICJtczIiKQorICAgICAgICAgICAgICAgIC5hcmVBbGxQaW5uZWQoKQorICAgICAgICAgICAgICAgIC5hcmVBbGxFbmFibGVkKCk7CisKKyAgICAgICAgLy8gQXQgdGhpcyBwb2ludCwgczEgYW5kIHMyIGRvbid0IGxvb2sgdG8gZXhpc3QgdG8gdGhlIHB1Ymxpc2hlciwgc28gaXQgY2FuIHB1Ymxpc2ggYQorICAgICAgICAvLyBkeW5hbWljIHNob3J0Y3V0IGFuZCB0aGF0IHNob3VsZCB3b3JrLgorICAgICAgICAvLyBCdXQgdXBkYXRlU2hvcnRjdXRzKCkgZG9uJ3QuCisKKyAgICAgICAgZmluYWwgU2hvcnRjdXRJbmZvIHMxID0gbmV3IFNob3J0Y3V0SW5mby5CdWlsZGVyKGdldENvbnRleHQoKSwgInMxIikKKyAgICAgICAgICAgICAgICAuc2V0U2hvcnRMYWJlbCgic2hvcnRsYWJlbDFfbmV3X29uZSIpCisgICAgICAgICAgICAgICAgLnNldEFjdGl2aXR5KGdldEFjdGl2aXR5KCJNYWluQWN0aXZpdHkiKSkKKyAgICAgICAgICAgICAgICAuc2V0SW50ZW50cyhuZXcgSW50ZW50W117bmV3IEludGVudCgibWFpbiIpfSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgICAgICBhc3NlcnRUcnVlKGdldE1hbmFnZXIoKS5hZGREeW5hbWljU2hvcnRjdXRzKGxpc3QoczEpKSk7CisKKyAgICAgICAgZmluYWwgU2hvcnRjdXRJbmZvIHMyID0gbmV3IFNob3J0Y3V0SW5mby5CdWlsZGVyKGdldENvbnRleHQoKSwgInMyIikKKyAgICAgICAgICAgICAgICAuc2V0U2hvcnRMYWJlbCgic2hvcnRsYWJlbDJfdXBkYXRlZCIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIGFzc2VydFRydWUoZ2V0TWFuYWdlcigpLnVwZGF0ZVNob3J0Y3V0cyhsaXN0KHMyKSkpOworCisgICAgICAgIGFzc2VydFdpdGgoZ2V0TWFuYWdlcigpLmdldER5bmFtaWNTaG9ydGN1dHMoKSkKKyAgICAgICAgICAgICAgICAuaGF2ZUlkcygiczEiKSAvLyBzMiBub3QgaW4gdGhlIGxpc3QuCisgICAgICAgICAgICAgICAgLmFyZUFsbEVuYWJsZWQoKTsKKworICAgICAgICBhc3NlcnRXaXRoKGdldE1hbmFnZXIoKS5nZXRQaW5uZWRTaG9ydGN1dHMoKSkKKyAgICAgICAgICAgICAgICAuaGF2ZUlkcygibXMxIiwgIm1zMiIsICJzMSIpIC8vIHMyIG5vdCBpbiB0aGUgbGlzdC4KKyAgICAgICAgICAgICAgICAuYXJlQWxsRW5hYmxlZCgpOworCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlc3RvcmVkT25OZXdWZXJzaW9uKCkgeworICAgICAgICBhc3NlcnRXaXRoKGdldE1hbmFnZXIoKS5nZXREeW5hbWljU2hvcnRjdXRzKCkpCisgICAgICAgICAgICAgICAgLmhhdmVJZHMoInMxIikKKyAgICAgICAgICAgICAgICAuYXJlQWxsRW5hYmxlZCgpCisgICAgICAgICAgICAgICAgLmFyZUFsbFBpbm5lZCgpOworCisgICAgICAgIGFzc2VydFdpdGgoZ2V0TWFuYWdlcigpLmdldE1hbmlmZXN0U2hvcnRjdXRzKCkpCisgICAgICAgICAgICAgICAgLmhhdmVJZHMoIm1zMSIsICJtczIiKQorICAgICAgICAgICAgICAgIC5hcmVBbGxQaW5uZWQoKQorICAgICAgICAgICAgICAgIC5hcmVBbGxFbmFibGVkKCk7CisKKyAgICAgICAgYXNzZXJ0V2l0aChnZXRNYW5hZ2VyKCkuZ2V0UGlubmVkU2hvcnRjdXRzKCkpCisgICAgICAgICAgICAgICAgLmhhdmVJZHMoIm1zMSIsICJtczIiLCAiczEiLCAiczIiKQorICAgICAgICAgICAgICAgIC5hcmVBbGxFbmFibGVkKCk7CisKKyAgICAgICAgLy8gVGhpcyB0aW1lLCB1cGRhdGUgc2hvdWxkIHdvcmsuCisgICAgICAgIGZpbmFsIFNob3J0Y3V0SW5mbyBzMiA9IG5ldyBTaG9ydGN1dEluZm8uQnVpbGRlcihnZXRDb250ZXh0KCksICJzMiIpCisgICAgICAgICAgICAgICAgLnNldFNob3J0TGFiZWwoInNob3J0bGFiZWwyX3VwZGF0ZWQiKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICBhc3NlcnRUcnVlKGdldE1hbmFnZXIoKS51cGRhdGVTaG9ydGN1dHMobGlzdChzMikpKTsKKworICAgICAgICBhc3NlcnRXaXRoKGdldE1hbmFnZXIoKS5nZXRQaW5uZWRTaG9ydGN1dHMoKSkKKyAgICAgICAgICAgICAgICAuc2VsZWN0QnlJZHMoInMyIikKKyAgICAgICAgICAgICAgICAuZm9yQWxsU2hvcnRjdXRzKHNpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJzaG9ydGxhYmVsMl91cGRhdGVkIiwgc2kuZ2V0U2hvcnRMYWJlbCgpKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmFja3VwRGlzYWJsZWQoKSB7CisgICAgICAgIGFzc2VydFdpdGgoZ2V0TWFuYWdlcigpLmdldER5bmFtaWNTaG9ydGN1dHMoKSkKKyAgICAgICAgICAgICAgICAuaXNFbXB0eSgpOworCisgICAgICAgIGFzc2VydFdpdGgoZ2V0TWFuYWdlcigpLmdldFBpbm5lZFNob3J0Y3V0cygpKQorICAgICAgICAgICAgICAgIC5oYXZlSWRzKCJtczEiLCAibXMyIikKKyAgICAgICAgICAgICAgICAuYXJlQWxsRW5hYmxlZCgpOworCisgICAgICAgIGFzc2VydFdpdGgoZ2V0TWFuYWdlcigpLmdldE1hbmlmZXN0U2hvcnRjdXRzKCkpCisgICAgICAgICAgICAgICAgLmhhdmVJZHMoIm1zMSIsICJtczIiKQorICAgICAgICAgICAgICAgIC5hcmVBbGxQaW5uZWQoKQorICAgICAgICAgICAgICAgIC5hcmVBbGxFbmFibGVkKCk7CisKKyAgICAgICAgLy8gQmFja3VwIHdhcyBkaXNhYmxlZCwgc28gZWl0aGVyIHMxIG5vciBzMiBsb29rIHRvIGJlIHJlc3RvcmVkIHRvIHRoZSBhcHAuCisgICAgICAgIC8vIFNvIHdoZW4gdGhlIGFwcCBwdWJsaXNoZXMgczEsIGl0J2xsIGJlIHB1Ymxpc2hlZCBhcyBuZXcuCisgICAgICAgIC8vIEJ1dCBpdCdsbCBzdGlsbCBiZSBwaW5uZWQuCisgICAgICAgIGZpbmFsIFNob3J0Y3V0SW5mbyBzMSA9IG5ldyBTaG9ydGN1dEluZm8uQnVpbGRlcihnZXRDb250ZXh0KCksICJzMSIpCisgICAgICAgICAgICAgICAgLnNldFNob3J0TGFiZWwoInNob3J0bGFiZWwxX25ld19vbmUiKQorICAgICAgICAgICAgICAgIC5zZXRBY3Rpdml0eShnZXRBY3Rpdml0eSgiTWFpbkFjdGl2aXR5IikpCisgICAgICAgICAgICAgICAgLnNldEludGVudHMobmV3IEludGVudFtde25ldyBJbnRlbnQoIm1haW4iKX0pCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShnZXRNYW5hZ2VyKCkuYWRkRHluYW1pY1Nob3J0Y3V0cyhsaXN0KHMxKSkpOworCisgICAgICAgIGFzc2VydFdpdGgoZ2V0TWFuYWdlcigpLmdldER5bmFtaWNTaG9ydGN1dHMoKSkKKyAgICAgICAgICAgICAgICAuaGF2ZUlkcygiczEiKSAvLyBzMiBub3QgaW4gdGhlIGxpc3QuCisgICAgICAgICAgICAgICAgLmFyZUFsbFBpbm5lZCgpCisgICAgICAgICAgICAgICAgLmFyZUFsbEVuYWJsZWQoKQorICAgICAgICAgICAgICAgIC5mb3JBbGxTaG9ydGN1dHMoc2kgLT4geworICAgICAgICAgICAgICAgICAgICAvLyBUaGUgYXBwIHJlLXB1Ymxpc2hlZCB0aGUgc2hvcnRjdXQsIG5vdCB1cGRhdGVkLCBzbyB0aGUgZmllbGRzIHRoYXQgZXhpc3RlZAorICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgb3JpZ2luYWwgc2hvcnRjdXQgaXMgZ29uZSBub3cuCisgICAgICAgICAgICAgICAgICAgIGFzc2VydE51bGwoc2kuZ2V0RXh0cmFzKCkpOworICAgICAgICAgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZXN0b3JlV3JvbmdLZXkoKSB7CisgICAgICAgIC8vIFJlc3RvcmVkIHBpbm5lZCBzaG9ydGN1dHMgYXJlIGZyb20gYSBwYWNrYWdlIHdpdGggYSBkaWZmZXJlbnQgc2lnbmF0dXJlLCBzbyB0aGUgZHluYW1pYworICAgICAgICAvLyBwaW5uZWQgc2hvcnRjdXRzIHNob3VsZCBiZSBkaXNhYmxlZC1pbnZpc2libGUuCisKKyAgICAgICAgYXNzZXJ0V2l0aChnZXRNYW5hZ2VyKCkuZ2V0RHluYW1pY1Nob3J0Y3V0cygpKQorICAgICAgICAgICAgICAgIC5pc0VtcHR5KCk7CisKKyAgICAgICAgYXNzZXJ0V2l0aChnZXRNYW5hZ2VyKCkuZ2V0UGlubmVkU2hvcnRjdXRzKCkpCisgICAgICAgICAgICAgICAgLmhhdmVJZHMoIm1zMSIsICJtczIiKTsKKworICAgICAgICBhc3NlcnRXaXRoKGdldE1hbmFnZXIoKS5nZXRNYW5pZmVzdFNob3J0Y3V0cygpKQorICAgICAgICAgICAgICAgIC5oYXZlSWRzKCJtczEiLCAibXMyIikKKyAgICAgICAgICAgICAgICAuYXJlQWxsUGlubmVkKCkKKyAgICAgICAgICAgICAgICAuYXJlQWxsRW5hYmxlZCgpOworCisgICAgICAgIGZpbmFsIFNob3J0Y3V0SW5mbyBzMSA9IG5ldyBTaG9ydGN1dEluZm8uQnVpbGRlcihnZXRDb250ZXh0KCksICJzMSIpCisgICAgICAgICAgICAgICAgLnNldFNob3J0TGFiZWwoInNob3J0bGFiZWwxX25ld19vbmUiKQorICAgICAgICAgICAgICAgIC5zZXRBY3Rpdml0eShnZXRBY3Rpdml0eSgiTWFpbkFjdGl2aXR5IikpCisgICAgICAgICAgICAgICAgLnNldEludGVudHMobmV3IEludGVudFtde25ldyBJbnRlbnQoIm1haW4iKX0pCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShnZXRNYW5hZ2VyKCkuYWRkRHluYW1pY1Nob3J0Y3V0cyhsaXN0KHMxKSkpOworCisgICAgICAgIGZpbmFsIFNob3J0Y3V0SW5mbyBzMiA9IG5ldyBTaG9ydGN1dEluZm8uQnVpbGRlcihnZXRDb250ZXh0KCksICJzMiIpCisgICAgICAgICAgICAgICAgLnNldFNob3J0TGFiZWwoInNob3J0bGFiZWwyX3VwZGF0ZWQiKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICBhc3NlcnRUcnVlKGdldE1hbmFnZXIoKS51cGRhdGVTaG9ydGN1dHMobGlzdChzMikpKTsKKworICAgICAgICBhc3NlcnRXaXRoKGdldE1hbmFnZXIoKS5nZXREeW5hbWljU2hvcnRjdXRzKCkpCisgICAgICAgICAgICAgICAgLmhhdmVJZHMoInMxIikgLy8gczIgbm90IGluIHRoZSBsaXN0LgorICAgICAgICAgICAgICAgIC5hcmVBbGxFbmFibGVkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzdG9yZWQgb24gYW4gb2xkZXIgdmVyc2lvbiB0aGF0IGhhdmUgbm8gbWFuaWZlc3Qgc2hvcnRjdXRzLgorICAgICAqCisgICAgICogSW4gdGhpcyBjYXNlLCB0aGUgcHVibGlzaGVyIHdvdWxkbid0IHNlZSB0aGUgbWFuaWZlc3Qgc2hvcnRjdXRzLCBhbmQgdGhleSdyZSBvdmVyd3JpdGFibGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFJlc3RvcmVOb01hbmlmZXN0T25PbGRWZXJzaW9uKCkgeworICAgICAgICBhc3NlcnRXaXRoKGdldE1hbmFnZXIoKS5nZXRNYW5pZmVzdFNob3J0Y3V0cygpKQorICAgICAgICAgICAgICAgIC5pc0VtcHR5KCk7CisKKyAgICAgICAgYXNzZXJ0V2l0aChnZXRNYW5hZ2VyKCkuZ2V0RHluYW1pY1Nob3J0Y3V0cygpKQorICAgICAgICAgICAgICAgIC5pc0VtcHR5KCk7CisKKyAgICAgICAgYXNzZXJ0V2l0aChnZXRNYW5hZ2VyKCkuZ2V0UGlubmVkU2hvcnRjdXRzKCkpCisgICAgICAgICAgICAgICAgLmlzRW1wdHkoKTsKKworICAgICAgICAvLyBtczEgd2FzIG1hbmlmZXN0L2ltbXV0YWJsZSwgYnV0IGNhbiBiZSBvdmVyd3JpdHRlbi4KKyAgICAgICAgZmluYWwgU2hvcnRjdXRJbmZvIG1zMSA9IG5ldyBTaG9ydGN1dEluZm8uQnVpbGRlcihnZXRDb250ZXh0KCksICJtczEiKQorICAgICAgICAgICAgICAgIC5zZXRTaG9ydExhYmVsKCJtczFfbmV3X29uZSIpCisgICAgICAgICAgICAgICAgLnNldEFjdGl2aXR5KGdldEFjdGl2aXR5KCJNYWluQWN0aXZpdHkiKSkKKyAgICAgICAgICAgICAgICAuc2V0SW50ZW50cyhuZXcgSW50ZW50W117bmV3IEludGVudCgibWFpbiIpfSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgICAgICBhc3NlcnRUcnVlKGdldE1hbmFnZXIoKS5zZXREeW5hbWljU2hvcnRjdXRzKGxpc3QobXMxKSkpOworCisgICAgICAgIGFzc2VydFdpdGgoZ2V0TWFuYWdlcigpLmdldER5bmFtaWNTaG9ydGN1dHMoKSkKKyAgICAgICAgICAgICAgICAuaGF2ZUlkcygibXMxIik7CisgICAgICAgIGFzc2VydFdpdGgoZ2V0TWFuYWdlcigpLmdldFBpbm5lZFNob3J0Y3V0cygpKQorICAgICAgICAgICAgICAgIC5oYXZlSWRzKCJtczEiKTsKKworICAgICAgICAvLyBBZGRpbmcgczEgc2hvdWxkIGFsc28gd29yay4KKyAgICAgICAgZmluYWwgU2hvcnRjdXRJbmZvIHMxID0gbmV3IFNob3J0Y3V0SW5mby5CdWlsZGVyKGdldENvbnRleHQoKSwgInMxIikKKyAgICAgICAgICAgICAgICAuc2V0U2hvcnRMYWJlbCgiczFfbmV3X29uZSIpCisgICAgICAgICAgICAgICAgLnNldEFjdGl2aXR5KGdldEFjdGl2aXR5KCJNYWluQWN0aXZpdHkiKSkKKyAgICAgICAgICAgICAgICAuc2V0SW50ZW50cyhuZXcgSW50ZW50W117bmV3IEludGVudCgibWFpbiIpfSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgICAgICBhc3NlcnRUcnVlKGdldE1hbmFnZXIoKS5hZGREeW5hbWljU2hvcnRjdXRzKGxpc3QoczEpKSk7CisKKyAgICAgICAgYXNzZXJ0V2l0aChnZXRNYW5hZ2VyKCkuZ2V0RHluYW1pY1Nob3J0Y3V0cygpKQorICAgICAgICAgICAgICAgIC5oYXZlSWRzKCJzMSIsICJtczEiKTsKKyAgICAgICAgYXNzZXJ0V2l0aChnZXRNYW5hZ2VyKCkuZ2V0UGlubmVkU2hvcnRjdXRzKCkpCisgICAgICAgICAgICAgICAgLmhhdmVJZHMoInMxIiwgIm1zMSIpOworCisgICAgICAgIC8vIFVwZGF0ZSBvbiBtczIgc2hvdWxkIGJlIG5vLW9wLgorICAgICAgICBmaW5hbCBTaG9ydGN1dEluZm8gbXMyID0gbmV3IFNob3J0Y3V0SW5mby5CdWlsZGVyKGdldENvbnRleHQoKSwgIm1zMiIpCisgICAgICAgICAgICAgICAgLnNldFNob3J0TGFiZWwoIm1zMi11cGRhdGVkIikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShnZXRNYW5hZ2VyKCkudXBkYXRlU2hvcnRjdXRzKGxpc3QobXMyKSkpOworCisgICAgICAgIGFzc2VydFdpdGgoZ2V0TWFuYWdlcigpLmdldE1hbmlmZXN0U2hvcnRjdXRzKCkpCisgICAgICAgICAgICAgICAgLmlzRW1wdHkoKTsKKyAgICAgICAgYXNzZXJ0V2l0aChnZXRNYW5hZ2VyKCkuZ2V0RHluYW1pY1Nob3J0Y3V0cygpKQorICAgICAgICAgICAgICAgIC5oYXZlSWRzKCJzMSIsICJtczEiKQorICAgICAgICAgICAgICAgIC5hcmVBbGxFbmFibGVkKCkKKyAgICAgICAgICAgICAgICAuYXJlQWxsUGlubmVkKCkKKyAgICAgICAgICAgICAgICAuYXJlQWxsTXV0YWJsZSgpCisKKyAgICAgICAgICAgICAgICAuc2VsZWN0QnlJZHMoInMxIikKKyAgICAgICAgICAgICAgICAuZm9yQWxsU2hvcnRjdXRzKHNpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJzMV9uZXdfb25lIiwgc2kuZ2V0U2hvcnRMYWJlbCgpKTsKKyAgICAgICAgICAgICAgICB9KQorCisgICAgICAgICAgICAgICAgLnJldmVydFRvT3JpZ2luYWxMaXN0KCkKKyAgICAgICAgICAgICAgICAuc2VsZWN0QnlJZHMoIm1zMSIpCisgICAgICAgICAgICAgICAgLmZvckFsbFNob3J0Y3V0cyhzaSAtPiB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygibXMxX25ld19vbmUiLCBzaS5nZXRTaG9ydExhYmVsKCkpOworICAgICAgICAgICAgICAgIH0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc3RvcmVkIG9uIHRoZSBzYW1lIChvciBuZXdlcikgdmVyc2lvbiB0aGF0IGhhdmUgbm8gbWFuaWZlc3Qgc2hvcnRjdXRzLgorICAgICAqCisgICAgICogSW4gdGhpcyBjYXNlLCB0aGUgcHVibGlzaGVyIHdpbGwgc2VlIHRoZSBtYW5pZmVzdCBzaG9ydGN1dHMgKGFzIGltbXV0YWJsZSBwaW5uZWQpLAorICAgICAqIGFuZCB0aGV5ICpjYW5ub3QqIGJlIG92ZXJ3cml0dGVuLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RSZXN0b3JlTm9NYW5pZmVzdE9uTmV3VmVyc2lvbigpIHsKKyAgICAgICAgYXNzZXJ0V2l0aChnZXRNYW5hZ2VyKCkuZ2V0TWFuaWZlc3RTaG9ydGN1dHMoKSkKKyAgICAgICAgICAgICAgICAuaXNFbXB0eSgpOworCisgICAgICAgIGFzc2VydFdpdGgoZ2V0TWFuYWdlcigpLmdldER5bmFtaWNTaG9ydGN1dHMoKSkKKyAgICAgICAgICAgICAgICAuaXNFbXB0eSgpOworCisgICAgICAgIGFzc2VydFdpdGgoZ2V0TWFuYWdlcigpLmdldFBpbm5lZFNob3J0Y3V0cygpKQorICAgICAgICAgICAgICAgIC5oYXZlSWRzKCJtczEiLCAibXMyIiwgInMxIiwgInMyIikKKyAgICAgICAgICAgICAgICAuc2VsZWN0QnlJZHMoIm1zMSIsICJtczIiKQorICAgICAgICAgICAgICAgIC5hcmVBbGxEaXNhYmxlZCgpCisKKyAgICAgICAgICAgICAgICAucmV2ZXJ0VG9PcmlnaW5hbExpc3QoKQorICAgICAgICAgICAgICAgIC5zZWxlY3RCeUlkcygiczEiLCAiczIiKQorICAgICAgICAgICAgICAgIC5hcmVBbGxFbmFibGVkKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydE5vU2hvcnRjdXRzKCkgeworICAgICAgICBhc3NlcnRXaXRoKGdldE1hbmFnZXIoKS5nZXREeW5hbWljU2hvcnRjdXRzKCkpLmlzRW1wdHkoKTsKKyAgICAgICAgYXNzZXJ0V2l0aChnZXRNYW5hZ2VyKCkuZ2V0UGlubmVkU2hvcnRjdXRzKCkpLmlzRW1wdHkoKTsKKyAgICAgICAgYXNzZXJ0V2l0aChnZXRNYW5hZ2VyKCkuZ2V0TWFuaWZlc3RTaG9ydGN1dHMoKSkuaXNFbXB0eSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZpc2libGVJZ25vcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydE5vU2hvcnRjdXRzKCk7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlICJkaXNhYmxlIiB3b24ndCBjaGFuZ2UgdGhlIGRpc2FibGVkIHJlYXNvbi4gQWxzbyBtYWtlIHN1cmUgImVuYWJsZSIgd29uJ3QKKyAgICAgICAgLy8gZW5hYmxlIHRoZW0uCisgICAgICAgIGdldE1hbmFnZXIoKS5kaXNhYmxlU2hvcnRjdXRzKGxpc3QoInMxIiwgInMyIiwgIm1zMSIpKTsKKyAgICAgICAgYXNzZXJ0Tm9TaG9ydGN1dHMoKTsKKworICAgICAgICBnZXRNYW5hZ2VyKCkuZW5hYmxlU2hvcnRjdXRzKGxpc3QoIm1zMSIsICJzMiIpKTsKKyAgICAgICAgYXNzZXJ0Tm9TaG9ydGN1dHMoKTsKKworICAgICAgICBnZXRNYW5hZ2VyKCkuZW5hYmxlU2hvcnRjdXRzKGxpc3QoIm1zMSIpKTsKKyAgICAgICAgYXNzZXJ0Tm9TaG9ydGN1dHMoKTsKKworICAgICAgICBnZXRNYW5hZ2VyKCkucmVtb3ZlRHluYW1pY1Nob3J0Y3V0cyhsaXN0KCJzMSIsICJtczEiKSk7CisgICAgICAgIGFzc2VydE5vU2hvcnRjdXRzKCk7CisKKyAgICAgICAgZ2V0TWFuYWdlcigpLnJlbW92ZUFsbER5bmFtaWNTaG9ydGN1dHMoKTsKKyAgICAgICAgYXNzZXJ0Tm9TaG9ydGN1dHMoKTsKKworCisgICAgICAgIC8vIEZvcmNlIGxhdW5jaGVyIDQgdG8gYmUgdGhlIGRlZmF1bHQgbGF1bmNoZXIgc28gaXQnbGwgcmVjZWl2ZSB0aGUgcGluIHJlcXVlc3QuCisgICAgICAgIHNldERlZmF1bHRMYXVuY2hlcihnZXRJbnN0cnVtZW50YXRpb24oKSwKKyAgICAgICAgICAgICAgICAiYW5kcm9pZC5jb250ZW50LnBtLmN0cy5zaG9ydGN1dC5iYWNrdXAubGF1bmNoZXI0Ly5NYWluQWN0aXZpdHkiKTsKKworICAgICAgICAvLyBVcGRhdGUsIHNldCBhbmQgYWRkIGhhdmUgYmVlbiB0ZXN0ZWQgYWxyZWFkeSwgc28gbGV0J3MgdGVzdCAicGluIi4KKworICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKworICAgICAgICBQZXJzaXN0YWJsZUJ1bmRsZSBwYiA9IG5ldyBQZXJzaXN0YWJsZUJ1bmRsZSgpOworICAgICAgICBwYi5wdXRCb29sZWFuKCJhY2NlcHRpdCIsIHRydWUpOworCisgICAgICAgIGZpbmFsIFNob3J0Y3V0SW5mbyBtczIgPSBuZXcgU2hvcnRjdXRJbmZvLkJ1aWxkZXIoZ2V0Q29udGV4dCgpLCAibXMyIikKKyAgICAgICAgICAgICAgICAuc2V0U2hvcnRMYWJlbCgibXMyX25ld19vbmUiKQorICAgICAgICAgICAgICAgIC5zZXRBY3Rpdml0eShnZXRBY3Rpdml0eSgiTWFpbkFjdGl2aXR5IikpCisgICAgICAgICAgICAgICAgLnNldEludGVudHMobmV3IEludGVudFtde25ldyBJbnRlbnQoIm1haW4yIil9KQorICAgICAgICAgICAgICAgIC5zZXRFeHRyYXMocGIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIG15SW50ZW50QWN0aW9uID0gImN0cy1zaG9ydGN1dC1pbnRlbnRfIiArIG5ldyBTZWN1cmVSYW5kb20oKS5uZXh0SW50KCk7CisgICAgICAgIGZpbmFsIEludGVudEZpbHRlciBteUZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIobXlJbnRlbnRBY3Rpb24pOworCisgICAgICAgIGZpbmFsIEJyb2FkY2FzdFJlY2VpdmVyIG9uUmVzdWx0ID0gbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICAgICAgbGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIGdldENvbnRleHQoKS5yZWdpc3RlclJlY2VpdmVyKG9uUmVzdWx0LCBteUZpbHRlcik7CisgICAgICAgIGFzc2VydFRydWUoZ2V0TWFuYWdlcigpLnJlcXVlc3RQaW5TaG9ydGN1dChtczIsCisgICAgICAgICAgICAgICAgUGVuZGluZ0ludGVudC5nZXRCcm9hZGNhc3QoZ2V0Q29udGV4dCgpLCAwLCBuZXcgSW50ZW50KG15SW50ZW50QWN0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFBlbmRpbmdJbnRlbnQuRkxBR19DQU5DRUxfQ1VSUkVOVCkuZ2V0SW50ZW50U2VuZGVyKCkpKTsKKworICAgICAgICBhc3NlcnRUcnVlKCJEaWRuJ3QgcmVjZWl2ZSByZXF1ZXN0UGluU2hvcnRjdXQoKSBjYWxsYmFjay4iLAorICAgICAgICAgICAgICAgIGxhdGNoLmF3YWl0KDMwLCBUaW1lVW5pdC5TRUNPTkRTKSk7CisKKyAgICAgICAgYXNzZXJ0V2l0aChnZXRNYW5hZ2VyKCkuZ2V0UGlubmVkU2hvcnRjdXRzKCkpCisgICAgICAgICAgICAgICAgLmhhdmVJZHMoIm1zMiIpCisgICAgICAgICAgICAgICAgLmFyZUFsbE5vdER5bmFtaWMoKQorICAgICAgICAgICAgICAgIC5hcmVBbGxOb3RNYW5pZmVzdCgpCisgICAgICAgICAgICAgICAgLmFyZUFsbE11dGFibGUoKQorICAgICAgICAgICAgICAgIC5hcmVBbGxQaW5uZWQoKQorICAgICAgICAgICAgICAgIC5mb3JBbGxTaG9ydGN1dHMoc2kgLT4geworICAgICAgICAgICAgICAgICAgICAvLyByZXF1ZXN0UGluU2hvcnRjdXQoKSBhY3RzIGFzIGFuIHVwZGF0ZSBpbiB0aGlzIGNhc2UsIHNvIGV2ZW4gdGhvdWdoCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBvcmlnaW5hbCBzaG9ydGN1dCBoYWRhICBsb25nIGxhYmVsLCB0aGlzIG9uZSBkb2VzIG5vdC4KKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShUZXh0VXRpbHMuaXNFbXB0eShzaS5nZXRMb25nTGFiZWwoKSkpOworICAgICAgICAgICAgICAgIH0pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL3B1Ymxpc2hlcjRvbGQvc3JjL2FuZHJvaWQvY29udGVudC9wbS9jdHMvc2hvcnRjdXQvYmFja3VwL3B1Ymxpc2hlcjQvU2hvcnRjdXRNYW5hZ2VyUHJlQmFja3VwVGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvZGV2aWNlc2lkZS9iYWNrdXAvcHVibGlzaGVyNG9sZC9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9zaG9ydGN1dC9iYWNrdXAvcHVibGlzaGVyNC9TaG9ydGN1dE1hbmFnZXJQcmVCYWNrdXBUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTViMzg1MwotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL3B1Ymxpc2hlcjRvbGQvc3JjL2FuZHJvaWQvY29udGVudC9wbS9jdHMvc2hvcnRjdXQvYmFja3VwL3B1Ymxpc2hlcjQvU2hvcnRjdXRNYW5hZ2VyUHJlQmFja3VwVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQucG0uY3RzLnNob3J0Y3V0LmJhY2t1cC5wdWJsaXNoZXI0OworCitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5zaG9ydGN1dG1hbmFnZXJ0ZXN0LlNob3J0Y3V0TWFuYWdlclRlc3RVdGlscy5hc3NlcnRXaXRoOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uc2hvcnRjdXRtYW5hZ2VydGVzdC5TaG9ydGN1dE1hbmFnZXJUZXN0VXRpbHMubGlzdDsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc2VydmVyLnBtLnNob3J0Y3V0bWFuYWdlcnRlc3QuU2hvcnRjdXRNYW5hZ2VyVGVzdFV0aWxzLm1ha2VQZXJzaXN0YWJsZUJ1bmRsZTsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc2VydmVyLnBtLnNob3J0Y3V0bWFuYWdlcnRlc3QuU2hvcnRjdXRNYW5hZ2VyVGVzdFV0aWxzLnNldDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlNob3J0Y3V0SW5mbzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uY3RzLnNob3J0Y3V0LmRldmljZS5jb21tb24uU2hvcnRjdXRNYW5hZ2VyRGV2aWNlVGVzdEJhc2U7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuSWNvbjsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OworCitAU21hbGxUZXN0CitwdWJsaWMgY2xhc3MgU2hvcnRjdXRNYW5hZ2VyUHJlQmFja3VwVGVzdCBleHRlbmRzIFNob3J0Y3V0TWFuYWdlckRldmljZVRlc3RCYXNlIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlQmFja3VwKCkgeworICAgICAgICBmaW5hbCBJY29uIGljb24xID0gSWNvbi5jcmVhdGVXaXRoQml0bWFwKEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UoCisgICAgICAgICAgICAgICAgZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLCBSLmRyYXdhYmxlLmJsYWNrXzE2eDY0KSk7CisgICAgICAgIGZpbmFsIEljb24gaWNvbjMgPSBJY29uLmNyZWF0ZVdpdGhSZXNvdXJjZShnZXRDb250ZXh0KCksIFIuZHJhd2FibGUuYmxhY2tfNjR4MTYpOworCisgICAgICAgIGZpbmFsIFNob3J0Y3V0SW5mbyBzMSA9IG5ldyBTaG9ydGN1dEluZm8uQnVpbGRlcihnZXRDb250ZXh0KCksICJzMSIpCisgICAgICAgICAgICAgICAgLnNldFNob3J0TGFiZWwoInNob3J0bGFiZWwxIikKKyAgICAgICAgICAgICAgICAuc2V0TG9uZ0xhYmVsKCJsb25nbGFiZWwxIikKKyAgICAgICAgICAgICAgICAuc2V0SWNvbihpY29uMSkKKyAgICAgICAgICAgICAgICAuc2V0QWN0aXZpdHkoZ2V0QWN0aXZpdHkoIk1haW5BY3Rpdml0eSIpKQorICAgICAgICAgICAgICAgIC5zZXREaXNhYmxlZE1lc3NhZ2UoImRpc2FibGVkbWVzc2FnZTEiKQorICAgICAgICAgICAgICAgIC5zZXRJbnRlbnRzKG5ldyBJbnRlbnRbXXtuZXcgSW50ZW50KCJ2aWV3IikucHV0RXh0cmEoImsxIiwgInYxIil9KQorICAgICAgICAgICAgICAgIC5zZXRFeHRyYXMobWFrZVBlcnNpc3RhYmxlQnVuZGxlKCJlazEiLCAiZXYxIikpCisgICAgICAgICAgICAgICAgLnNldENhdGVnb3JpZXMoc2V0KCJjYXQxIikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisKKyAgICAgICAgZmluYWwgU2hvcnRjdXRJbmZvIHMyID0gbmV3IFNob3J0Y3V0SW5mby5CdWlsZGVyKGdldENvbnRleHQoKSwgInMyIikKKyAgICAgICAgICAgICAgICAuc2V0U2hvcnRMYWJlbCgic2hvcnRsYWJlbDIiKQorICAgICAgICAgICAgICAgIC5zZXRBY3Rpdml0eShnZXRBY3Rpdml0eSgiTWFpbkFjdGl2aXR5MiIpKQorICAgICAgICAgICAgICAgIC5zZXRJbnRlbnRzKG5ldyBJbnRlbnRbXXtuZXcgSW50ZW50KCJtYWluIil9KQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworCisgICAgICAgIGZpbmFsIFNob3J0Y3V0SW5mbyBzMyA9IG5ldyBTaG9ydGN1dEluZm8uQnVpbGRlcihnZXRDb250ZXh0KCksICJzMyIpCisgICAgICAgICAgICAgICAgLnNldFNob3J0TGFiZWwoInNob3J0bGFiZWwzIikKKyAgICAgICAgICAgICAgICAuc2V0SWNvbihpY29uMykKKyAgICAgICAgICAgICAgICAuc2V0QWN0aXZpdHkoZ2V0QWN0aXZpdHkoIk1haW5BY3Rpdml0eTIiKSkKKyAgICAgICAgICAgICAgICAuc2V0SW50ZW50cyhuZXcgSW50ZW50W117bmV3IEludGVudCgibWFpbiIpfSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgICAgICBhc3NlcnRUcnVlKGdldE1hbmFnZXIoKS5zZXREeW5hbWljU2hvcnRjdXRzKGxpc3QoczEsIHMyLCBzMykpKTsKKworICAgICAgICBhc3NlcnRXaXRoKGdldE1hbmFnZXIoKS5nZXREeW5hbWljU2hvcnRjdXRzKCkpCisgICAgICAgICAgICAgICAgLmhhdmVJZHMoInMxIiwgInMyIiwgInMzIikKKyAgICAgICAgICAgICAgICAuYXJlQWxsTm90UGlubmVkKCk7CisKKyAgICAgICAgYXNzZXJ0V2l0aChnZXRNYW5hZ2VyKCkuZ2V0TWFuaWZlc3RTaG9ydGN1dHMoKSkKKyAgICAgICAgICAgICAgICAuaGF2ZUlkcygibXMxIiwgIm1zMiIpCisgICAgICAgICAgICAgICAgLmFyZUFsbE5vdFBpbm5lZCgpOworICAgfQorfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvZGV2aWNlc2lkZS9iYWNrdXAvcHVibGlzaGVyNG9sZF9ub21hbmlmZXN0L0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL3Nob3J0Y3V0cy9kZXZpY2VzaWRlL2JhY2t1cC9wdWJsaXNoZXI0b2xkX25vbWFuaWZlc3QvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODJlZjRjCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvZGV2aWNlc2lkZS9iYWNrdXAvcHVibGlzaGVyNG9sZF9ub21hbmlmZXN0L0FuZHJvaWQubWsKQEAgLTAsMCArMSw0NiBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCisjIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0CitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzU2hvcnRjdXRCYWNrdXBQdWJsaXNoZXI0b2xkX25vbWFuaWZlc3QKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgLi4vcHVibGlzaGVyNG9sZC9zcmMpIFwKKyAgICAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIC4uLy4uL2NvbW1vbi9zcmMpCisKK0xPQ0FMX1JFU09VUkNFX0RJUiA6PSAkKExPQ0FMX1BBVEgpLy4uL3B1Ymxpc2hlcjRvbGQvcmVzCisKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCisgICAgYW5kcm9pZHgudGVzdC5ydWxlcyBcCisgICAgYW5kcm9pZHgubGVnYWN5X2xlZ2FjeS1zdXBwb3J0LXY0IFwKKyAgICBtb2NraXRvLXRhcmdldC1taW51cy1qdW5pdDQgXAorICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0IFwKKyAgICBjdHN0ZXN0cnVubmVyLWF4dCBcCisgICAgdWItdWlhdXRvbWF0b3IgXAorICAgIFNob3J0Y3V0TWFuYWdlclRlc3RVdGlscworCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicworCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CisKK2luY2x1ZGUgJChCVUlMRF9DVFNfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL3B1Ymxpc2hlcjRvbGRfbm9tYW5pZmVzdC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvZGV2aWNlc2lkZS9iYWNrdXAvcHVibGlzaGVyNG9sZF9ub21hbmlmZXN0L0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMyNmQxNQotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvYmFja3VwL3B1Ymxpc2hlcjRvbGRfbm9tYW5pZmVzdC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iYW5kcm9pZC5jb250ZW50LnBtLmN0cy5zaG9ydGN1dC5iYWNrdXAucHVibGlzaGVyNCIKKyAgICBhbmRyb2lkOnZlcnNpb25Db2RlPSIxMCI+CisKKyAgICA8YXBwbGljYXRpb24+CisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ik1haW5BY3Rpdml0eSIgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIgPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkRFRkFVTFQiIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgPC9hcHBsaWNhdGlvbj4KKworICAgIDxpbnN0cnVtZW50YXRpb24KKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5jb250ZW50LnBtLmN0cy5zaG9ydGN1dC5iYWNrdXAucHVibGlzaGVyNCIgIC8+Cis8L21hbmlmZXN0PgorCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3Nob3J0Y3V0cy9kZXZpY2VzaWRlL211bHRpdXNlci9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvZGV2aWNlc2lkZS9tdWx0aXVzZXIvQW5kcm9pZC5tawppbmRleCA2MTliZGZlLi40OGI1N2M4IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL3Nob3J0Y3V0cy9kZXZpY2VzaWRlL211bHRpdXNlci9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvbXVsdGl1c2VyL0FuZHJvaWQubWsKQEAgLTMxLDE0ICszMSwxNiBAQAogICAgICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgLi4vY29tbW9uL3NyYykKIAogTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKLSAgICBhbmRyb2lkLXN1cHBvcnQtdGVzdCBcCi0gICAgYW5kcm9pZC1zdXBwb3J0LXY0IFwKKyAgICBhbmRyb2lkeC50ZXN0LnJ1bGVzIFwKKyAgICBhbmRyb2lkeC5sZWdhY3lfbGVnYWN5LXN1cHBvcnQtdjQgXAogICAgIG1vY2tpdG8tdGFyZ2V0LW1pbnVzLWp1bml0NCBcCi0gICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbCBcCi0gICAgY3RzdGVzdHJ1bm5lciBcCisgICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgXAorICAgIGN0c3Rlc3RydW5uZXItYXh0IFwKICAgICB1Yi11aWF1dG9tYXRvciBcCiAgICAgU2hvcnRjdXRNYW5hZ2VyVGVzdFV0aWxzCiAKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCisKIExPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKIAogaW5jbHVkZSAkKEJVSUxEX0NUU19QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvZGV2aWNlc2lkZS9tdWx0aXVzZXIvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvbXVsdGl1c2VyL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggM2ZiZWQ1Zi4uZTAwY2UwZSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvZGV2aWNlc2lkZS9tdWx0aXVzZXIvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL3Nob3J0Y3V0cy9kZXZpY2VzaWRlL211bHRpdXNlci9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0xOCw2ICsxOCw4IEBACiAgICAgcGFja2FnZT0iYW5kcm9pZC5jb250ZW50LnBtLmN0cy5zaG9ydGN1dC5tdWx0aXVzZXIiPgogCiAgICAgPGFwcGxpY2F0aW9uPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKwogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJMYXVuY2hlciIgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIgPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgpAQCAtMzYsNyArMzgsNyBAQAogICAgIDwvYXBwbGljYXRpb24+CiAKICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5jb250ZW50LnBtLmN0cy5zaG9ydGN1dC5tdWx0aXVzZXIiICAvPgogPC9tYW5pZmVzdD4KIApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvZGV2aWNlc2lkZS9tdWx0aXVzZXIvc3JjL2FuZHJvaWQvY29udGVudC9wbS9jdHMvc2hvcnRjdXQvbXVsdGl1c2VyL1Nob3J0Y3V0TWFuYWdlck1hbmFnZWRVc2VyVGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvZGV2aWNlc2lkZS9tdWx0aXVzZXIvc3JjL2FuZHJvaWQvY29udGVudC9wbS9jdHMvc2hvcnRjdXQvbXVsdGl1c2VyL1Nob3J0Y3V0TWFuYWdlck1hbmFnZWRVc2VyVGVzdC5qYXZhCmluZGV4IDYwYTUwNjEuLjQ4Zjg1NzggMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvbXVsdGl1c2VyL3NyYy9hbmRyb2lkL2NvbnRlbnQvcG0vY3RzL3Nob3J0Y3V0L211bHRpdXNlci9TaG9ydGN1dE1hbmFnZXJNYW5hZ2VkVXNlclRlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL3Nob3J0Y3V0cy9kZXZpY2VzaWRlL211bHRpdXNlci9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9zaG9ydGN1dC9tdWx0aXVzZXIvU2hvcnRjdXRNYW5hZ2VyTWFuYWdlZFVzZXJUZXN0LmphdmEKQEAgLTExNSw2ICsxMTUsOCBAQAogICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHModXNlckN1cnJlbnQsIHNpLmdldFVzZXJIYW5kbGUoKSk7CiAgICAgICAgICAgICAgICAgfSk7CiAKKyAgICAgICAgLy8gQWNjZXNzaW5nIHRoZSBtYWluIHByb2ZpbGUgZnJvbSB0aGUgbWFuYWdlZCBwcm9maWxlLCB3aGljaCB3aWxsIG5vdCB0aHJvdywgYnV0IHdpbGwKKyAgICAgICAgLy8gcmV0dXJuIGFuIGVtcHR5IHJlc3VsdC4KICAgICAgICAgYXNzZXJ0V2l0aChnZXRMYXVuY2hlckFwcHMoKS5nZXRTaG9ydGN1dHMocSwgdXNlck90aGVyKSkuaXNFbXB0eSgpOwogCiAgICAgICAgIC8vIFRPRE8gTWFrZSBzdXJlIHRoZSBhY3Rpdml0eSBhY3R1YWxseSBzdGFydHMuCkBAIC0xMjIsNiArMTI0LDcgQEAKICAgICAgICAgICAgICAgICB1c2VyQ3VycmVudCk7CiAKICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIFRoaXMgd29uJ3QgdGhyb3cgU2VjdXJpdHlFeGNlcHRpb24gZWl0aGVyLgogICAgICAgICAgICAgZ2V0TGF1bmNoZXJBcHBzKCkuc3RhcnRTaG9ydGN1dChnZXRDb250ZXh0KCkuZ2V0UGFja2FnZU5hbWUoKSwgInMxIiwgbnVsbCwgbnVsbCwKICAgICAgICAgICAgICAgICAgICAgdXNlck90aGVyKTsKICAgICAgICAgICAgIGZhaWwoIkRpZG4ndCB0aHJvdyBBY3Rpdml0eU5vdEZvdW5kRXhjZXB0aW9uIik7CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3Nob3J0Y3V0cy9kZXZpY2VzaWRlL3VwZ3JhZGUvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvdXBncmFkZS9BbmRyb2lkLm1rCmluZGV4IGFlMGJmNzUuLjBkZTIwNmYgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvdXBncmFkZS9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvdXBncmFkZS9BbmRyb2lkLm1rCkBAIC0zNSwxNCArMzUsMTYgQEAKIExPQ0FMX1JFU09VUkNFX0RJUiA6PSAgJChMT0NBTF9QQVRIKS92ZXJzaW9uMS9yZXMKIAogTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKLSAgICBhbmRyb2lkLXN1cHBvcnQtdGVzdCBcCi0gICAgYW5kcm9pZC1zdXBwb3J0LXY0IFwKKyAgICBhbmRyb2lkeC50ZXN0LnJ1bGVzIFwKKyAgICBhbmRyb2lkeC5sZWdhY3lfbGVnYWN5LXN1cHBvcnQtdjQgXAogICAgIG1vY2tpdG8tdGFyZ2V0LW1pbnVzLWp1bml0NCBcCi0gICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbCBcCi0gICAgY3RzdGVzdHJ1bm5lciBcCisgICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgXAorICAgIGN0c3Rlc3RydW5uZXItYXh0IFwKICAgICB1Yi11aWF1dG9tYXRvciBcCiAgICAgU2hvcnRjdXRNYW5hZ2VyVGVzdFV0aWxzCiAKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCisKIExPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKIAogaW5jbHVkZSAkKEJVSUxEX0NUU19QQUNLQUdFKQpAQCAtNjYsMTQgKzY4LDE2IEBACiBMT0NBTF9SRVNPVVJDRV9ESVIgOj0gICQoTE9DQUxfUEFUSCkvdmVyc2lvbjIvcmVzCiAKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCi0gICAgYW5kcm9pZC1zdXBwb3J0LXRlc3QgXAotICAgIGFuZHJvaWQtc3VwcG9ydC12NCBcCisgICAgYW5kcm9pZHgudGVzdC5ydWxlcyBcCisgICAgYW5kcm9pZHgubGVnYWN5X2xlZ2FjeS1zdXBwb3J0LXY0IFwKICAgICBtb2NraXRvLXRhcmdldC1taW51cy1qdW5pdDQgXAotICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwgXAotICAgIGN0c3Rlc3RydW5uZXIgXAorICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0IFwKKyAgICBjdHN0ZXN0cnVubmVyLWF4dCBcCiAgICAgdWItdWlhdXRvbWF0b3IgXAogICAgIFNob3J0Y3V0TWFuYWdlclRlc3RVdGlscwogCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicworCiBMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CiAKIGluY2x1ZGUgJChCVUlMRF9DVFNfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2RldmljZXNpZGUvdXBncmFkZS9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvZGV2aWNlc2lkZS91cGdyYWRlL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggMWI4OGQ1ZS4uNDY4Y2VhMSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvZGV2aWNlc2lkZS91cGdyYWRlL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvZGV2aWNlc2lkZS91cGdyYWRlL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTE4LDYgKzE4LDggQEAKICAgICBwYWNrYWdlPSJhbmRyb2lkLmNvbnRlbnQucG0uY3RzLnNob3J0Y3V0LnVwZ3JhZGUiPgogCiAgICAgPGFwcGxpY2F0aW9uPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKwogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJMYXVuY2hlciIgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIgPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgpAQCAtMzYsNyArMzgsNyBAQAogICAgIDwvYXBwbGljYXRpb24+CiAKICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5jb250ZW50LnBtLmN0cy5zaG9ydGN1dC51cGdyYWRlIiAgLz4KIDwvbWFuaWZlc3Q+CiAKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2hvc3RzaWRlL0FuZHJvaWRUZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2hvc3RzaWRlL0FuZHJvaWRUZXN0LnhtbAppbmRleCA4YjUzYjJlLi5iMDYwOTQwIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL3Nob3J0Y3V0cy9ob3N0c2lkZS9BbmRyb2lkVGVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvaG9zdHNpZGUvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciB0aGUgQ1RTIFNob3J0Y3V0TWFuYWdlciBob3N0IHRlc3RzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iZnJhbWV3b3JrIiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImFuZHJvaWQuY3RzLmJhY2t1cC5CYWNrdXBQcmVwYXJlciI+CiAgICAgICAgIDxvcHRpb24gbmFtZT0iZW5hYmxlLWJhY2t1cC1pZi1uZWVkZWQiIHZhbHVlPSJ0cnVlIiAvPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvaG9zdHNpZGUvc3JjL2FuZHJvaWQvY29udGVudC9wbS9jdHMvc2hvcnRjdXRob3N0L0Jhc2VTaG9ydGN1dE1hbmFnZXJIb3N0VGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvaG9zdHNpZGUvc3JjL2FuZHJvaWQvY29udGVudC9wbS9jdHMvc2hvcnRjdXRob3N0L0Jhc2VTaG9ydGN1dE1hbmFnZXJIb3N0VGVzdC5qYXZhCmluZGV4IGM3MDNlN2YuLjA5MzE3OTIgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2hvc3RzaWRlL3NyYy9hbmRyb2lkL2NvbnRlbnQvcG0vY3RzL3Nob3J0Y3V0aG9zdC9CYXNlU2hvcnRjdXRNYW5hZ2VySG9zdFRlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL3Nob3J0Y3V0cy9ob3N0c2lkZS9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9zaG9ydGN1dGhvc3QvQmFzZVNob3J0Y3V0TWFuYWdlckhvc3RUZXN0LmphdmEKQEAgLTE3LDE0ICsxNywxNCBAQAogCiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQuYnVpbGQuQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi50ZXN0cnVubmVyLlJlbW90ZUFuZHJvaWRUZXN0UnVubmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi50ZXN0cnVubmVyLlRlc3RJZGVudGlmaWVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi50ZXN0cnVubmVyLlRlc3RSZXN1bHQ7CiBpbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLnRlc3RydW5uZXIuVGVzdFJlc3VsdC5UZXN0U3RhdHVzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi50ZXN0cnVubmVyLlRlc3RSdW5SZXN1bHQ7CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuYnVpbGQuSUJ1aWxkSW5mbzsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmxvZy5Mb2dVdGlsLkNMb2c7CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQucmVzdWx0LkNvbGxlY3RpbmdUZXN0TGlzdGVuZXI7CitpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQucmVzdWx0LlRlc3REZXNjcmlwdGlvbjsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5yZXN1bHQuVGVzdFJlc3VsdDsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5yZXN1bHQuVGVzdFJ1blJlc3VsdDsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5EZXZpY2VUZXN0Q2FzZTsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JQnVpbGRSZWNlaXZlcjsKIApAQCAtNDEsMTMgKzQxLDE2IEBACiBhYnN0cmFjdCBwdWJsaWMgY2xhc3MgQmFzZVNob3J0Y3V0TWFuYWdlckhvc3RUZXN0IGV4dGVuZHMgRGV2aWNlVGVzdENhc2UgaW1wbGVtZW50cyBJQnVpbGRSZWNlaXZlciB7CiAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIERVTVBTWVNfSU5fVEVBUkRPV04gPSBmYWxzZTsgLy8gRE8gTk9UIFNVQk1JVCBXSVRIIFRSVUUKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSVU5ORVIgPSAiYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciI7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE5PX1VOSU5TVEFMTF9JTl9URUFSRE9XTiA9IGZhbHNlOyAvLyBETyBOT1QgU1VCTUlUIFdJVEggVFJVRQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJVTk5FUiA9ICJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiOwogCiAgICAgcHJpdmF0ZSBJQnVpbGRJbmZvIG1DdHNCdWlsZDsKIAogICAgIHByb3RlY3RlZCBib29sZWFuIG1Jc011bHRpdXNlclN1cHBvcnRlZDsKICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtSXNNYW5hZ2VkVXNlclN1cHBvcnRlZDsKIAorICAgIHByaXZhdGUgaW50IG1Jbml0aWFsVXNlcklkOwogICAgIHByaXZhdGUgQXJyYXlMaXN0PEludGVnZXI+IG1PcmlnaW5hbFVzZXJzOwogCiAgICAgQE92ZXJyaWRlCkBAIC03MCw2ICs3Myw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAobUlzTXVsdGl1c2VyU3VwcG9ydGVkKSB7CisgICAgICAgICAgICBtSW5pdGlhbFVzZXJJZCA9IGdldERldmljZSgpLmdldEN1cnJlbnRVc2VyKCk7CiAgICAgICAgICAgICBtT3JpZ2luYWxVc2VycyA9IG5ldyBBcnJheUxpc3Q8PihnZXREZXZpY2UoKS5saXN0VXNlcnMoKSk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xNjMsNyArMTY3LDcgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgcHJpbnRUZXN0UmVzdWx0KFRlc3RSdW5SZXN1bHQgcnVuUmVzdWx0KSB7Ci0gICAgICAgIGZvciAoTWFwLkVudHJ5PFRlc3RJZGVudGlmaWVyLCBUZXN0UmVzdWx0PiB0ZXN0RW50cnkgOgorICAgICAgICBmb3IgKE1hcC5FbnRyeTxUZXN0RGVzY3JpcHRpb24sIFRlc3RSZXN1bHQ+IHRlc3RFbnRyeSA6CiAgICAgICAgICAgICAgICAgcnVuUmVzdWx0LmdldFRlc3RSZXN1bHRzKCkuZW50cnlTZXQoKSkgewogICAgICAgICAgICAgVGVzdFJlc3VsdCB0ZXN0UmVzdWx0ID0gdGVzdEVudHJ5LmdldFZhbHVlKCk7CiAKQEAgLTE4MSw3ICsxODUsNyBAQAogICAgICAgICBpZiAoIW1Jc011bHRpdXNlclN1cHBvcnRlZCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIGdldERldmljZSgpLnN3aXRjaFVzZXIoZ2V0UHJpbWFyeVVzZXJJZCgpKTsKKyAgICAgICAgZ2V0RGV2aWNlKCkuc3dpdGNoVXNlcihtSW5pdGlhbFVzZXJJZCk7CiAgICAgICAgIGZvciAoaW50IHVzZXJJZCA6IGdldERldmljZSgpLmxpc3RVc2VycygpKSB7CiAgICAgICAgICAgICBpZiAoIW1PcmlnaW5hbFVzZXJzLmNvbnRhaW5zKHVzZXJJZCkpIHsKICAgICAgICAgICAgICAgICBnZXREZXZpY2UoKS5yZW1vdmVVc2VyKHVzZXJJZCk7CkBAIC0xODksNiArMTkzLDE4IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcm90ZWN0ZWQgaW50IGdldE9yQ3JlYXRlU2Vjb25kYXJ5VXNlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoZ2V0RGV2aWNlKCkuaXNVc2VyU2Vjb25kYXJ5KG1Jbml0aWFsVXNlcklkKSkgeworICAgICAgICAgICAgcmV0dXJuIG1Jbml0aWFsVXNlcklkOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IHVzZXJJZCA6IGdldERldmljZSgpLmxpc3RVc2VycygpKSB7CisgICAgICAgICAgICBpZiAoZ2V0RGV2aWNlKCkuaXNVc2VyU2Vjb25kYXJ5KHVzZXJJZCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdXNlcklkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBjcmVhdGVVc2VyKCk7CisgICAgfQorCiAgICAgcHJvdGVjdGVkIGludCBjcmVhdGVVc2VyKCkgdGhyb3dzIEV4Y2VwdGlvbnsKICAgICAgICAgcmV0dXJuIGdldERldmljZSgpLmNyZWF0ZVVzZXIoIlRlc3RVc2VyXyIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CiAgICAgfQpAQCAtMjEyLDYgKzIyOCwyOSBAQAogICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CiAgICAgfQogCisgICAgLyoqIFN0YXJ0cyB1c2VyIHtAY29kZSB1c2VySWR9IGFuZCB3YWl0cyB1bnRpbCBpdCBpcyBpbiBzdGF0ZSBSVU5OSU5HX1VOTE9DS0VELiAqLworICAgIHByb3RlY3RlZCB2b2lkIHN0YXJ0VXNlckFuZFdhaXQoaW50IHVzZXJJZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGdldERldmljZSgpLnN0YXJ0VXNlcih1c2VySWQpOworCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNpcmVkU3RhdGUgPSAiUlVOTklOR19VTkxPQ0tFRCI7CisgICAgICAgIGZpbmFsIGxvbmcgVVNFUl9TVEFURV9USU1FT1VUX01TID0gNjBfMDAwMDsgLy8gMSBtaW51dGUKKyAgICAgICAgZmluYWwgbG9uZyB0aW1lb3V0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyBVU0VSX1NUQVRFX1RJTUVPVVRfTVM7CisgICAgICAgIGZpbmFsIFN0cmluZyBjb21tYW5kID0gU3RyaW5nLmZvcm1hdCgiYW0gZ2V0LXN0YXJ0ZWQtdXNlci1zdGF0ZSAlZCIsIHVzZXJJZCk7CisgICAgICAgIFN0cmluZyBvdXRwdXQgPSAiIjsKKyAgICAgICAgd2hpbGUgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIDw9IHRpbWVvdXQpIHsKKyAgICAgICAgICAgIG91dHB1dCA9IGdldERldmljZSgpLmV4ZWN1dGVTaGVsbENvbW1hbmQoY29tbWFuZCk7CisgICAgICAgICAgICBpZiAob3V0cHV0LmNvbnRhaW5zKGRlc2lyZWRTdGF0ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDApOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIERvIG5vdGhpbmcuCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZmFpbCgiVXNlciBzdGF0ZSBvZiAiICsgdXNlcklkICsgIiB3YXMgJyIgKyBvdXRwdXQgKyAiJyByYXRoZXIgdGhhbiAiICsgZGVzaXJlZFN0YXRlKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBWYXJpYW50IG9mIHtAbGluayAjYXNzZXJ0Q29udGFpbnNSZWdleChTdHJpbmcsU3RyaW5nLFN0cmluZyl9IHVzaW5nIGEKICAgICAgKiBnZW5lcmljIG1lc3NhZ2UuCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3Nob3J0Y3V0cy9ob3N0c2lkZS9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9zaG9ydGN1dGhvc3QvU2hvcnRjdXRNYW5hZ2VyQmFja3VwVGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvaG9zdHNpZGUvc3JjL2FuZHJvaWQvY29udGVudC9wbS9jdHMvc2hvcnRjdXRob3N0L1Nob3J0Y3V0TWFuYWdlckJhY2t1cFRlc3QuamF2YQppbmRleCA5NjBiNDFmLi4zY2FhY2FkIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL3Nob3J0Y3V0cy9ob3N0c2lkZS9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9zaG9ydGN1dGhvc3QvU2hvcnRjdXRNYW5hZ2VyQmFja3VwVGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2hvc3RzaWRlL3NyYy9hbmRyb2lkL2NvbnRlbnQvcG0vY3RzL3Nob3J0Y3V0aG9zdC9TaG9ydGN1dE1hbmFnZXJCYWNrdXBUZXN0LmphdmEKQEAgLTI2LDkgKzI2LDIyIEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBVU5DSEVSMV9BUEsgPSAiQ3RzU2hvcnRjdXRCYWNrdXBMYXVuY2hlcjEuYXBrIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFVTkNIRVIyX0FQSyA9ICJDdHNTaG9ydGN1dEJhY2t1cExhdW5jaGVyMi5hcGsiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQVVOQ0hFUjNfQVBLID0gIkN0c1Nob3J0Y3V0QmFja3VwTGF1bmNoZXIzLmFwayI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBVU5DSEVSNF9PTERfQVBLID0gIkN0c1Nob3J0Y3V0QmFja3VwTGF1bmNoZXI0b2xkLmFwayI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBVU5DSEVSNF9ORVdfQVBLID0gIkN0c1Nob3J0Y3V0QmFja3VwTGF1bmNoZXI0bmV3LmFwayI7CisKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSEVSMV9BUEsgPSAiQ3RzU2hvcnRjdXRCYWNrdXBQdWJsaXNoZXIxLmFwayI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hFUjJfQVBLID0gIkN0c1Nob3J0Y3V0QmFja3VwUHVibGlzaGVyMi5hcGsiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIRVIzX0FQSyA9ICJDdHNTaG9ydGN1dEJhY2t1cFB1Ymxpc2hlcjMuYXBrIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSEVSNF9PTERfQVBLID0gIkN0c1Nob3J0Y3V0QmFja3VwUHVibGlzaGVyNG9sZC5hcGsiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIRVI0X05FV19BUEsgPSAiQ3RzU2hvcnRjdXRCYWNrdXBQdWJsaXNoZXI0bmV3LmFwayI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hFUjRfTkVXX05PQkFDS1VQX0FQSworICAgICAgICAgICAgPSAiQ3RzU2hvcnRjdXRCYWNrdXBQdWJsaXNoZXI0bmV3X25vYmFja3VwLmFwayI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hFUjRfTkVXX1dST05HS0VZX0FQSworICAgICAgICAgICAgPSAiQ3RzU2hvcnRjdXRCYWNrdXBQdWJsaXNoZXI0bmV3X3dyb25na2V5LmFwayI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hFUjRfT0xEX05PX01BTklGU1RfQVBLCisgICAgICAgICAgICA9ICJDdHNTaG9ydGN1dEJhY2t1cFB1Ymxpc2hlcjRvbGRfbm9tYW5pZmVzdC5hcGsiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIRVI0X05FV19OT19NQU5JRlNUX0FQSworICAgICAgICAgICAgPSAiQ3RzU2hvcnRjdXRCYWNrdXBQdWJsaXNoZXI0bmV3X25vbWFuaWZlc3QuYXBrIjsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQVVOQ0hFUjFfUEtHID0KICAgICAgICAgICAgICJhbmRyb2lkLmNvbnRlbnQucG0uY3RzLnNob3J0Y3V0LmJhY2t1cC5sYXVuY2hlcjEiOwpAQCAtMzYsMTIgKzQ5LDE3IEBACiAgICAgICAgICAgICAiYW5kcm9pZC5jb250ZW50LnBtLmN0cy5zaG9ydGN1dC5iYWNrdXAubGF1bmNoZXIyIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFVTkNIRVIzX1BLRyA9CiAgICAgICAgICAgICAiYW5kcm9pZC5jb250ZW50LnBtLmN0cy5zaG9ydGN1dC5iYWNrdXAubGF1bmNoZXIzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFVTkNIRVI0X1BLRyA9CisgICAgICAgICAgICAiYW5kcm9pZC5jb250ZW50LnBtLmN0cy5zaG9ydGN1dC5iYWNrdXAubGF1bmNoZXI0IjsKKwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIRVIxX1BLRyA9CiAgICAgICAgICAgICAiYW5kcm9pZC5jb250ZW50LnBtLmN0cy5zaG9ydGN1dC5iYWNrdXAucHVibGlzaGVyMSI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hFUjJfUEtHID0KICAgICAgICAgICAgICJhbmRyb2lkLmNvbnRlbnQucG0uY3RzLnNob3J0Y3V0LmJhY2t1cC5wdWJsaXNoZXIyIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSEVSM19QS0cgPQogICAgICAgICAgICAgImFuZHJvaWQuY29udGVudC5wbS5jdHMuc2hvcnRjdXQuYmFja3VwLnB1Ymxpc2hlcjMiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIRVI0X1BLRyA9CisgICAgICAgICAgICAiYW5kcm9pZC5jb250ZW50LnBtLmN0cy5zaG9ydGN1dC5iYWNrdXAucHVibGlzaGVyNCI7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlJPQURDQVNUX1RJTUVPVVRfU0VDT05EUyA9IDEyMDsKIApAQCAtNTksMTYgKzc3LDIyIEBACiAgICAgICAgICAgICBjbGVhclNob3J0Y3V0cyhMQVVOQ0hFUjFfUEtHLCBnZXRQcmltYXJ5VXNlcklkKCkpOwogICAgICAgICAgICAgY2xlYXJTaG9ydGN1dHMoTEFVTkNIRVIyX1BLRywgZ2V0UHJpbWFyeVVzZXJJZCgpKTsKICAgICAgICAgICAgIGNsZWFyU2hvcnRjdXRzKExBVU5DSEVSM19QS0csIGdldFByaW1hcnlVc2VySWQoKSk7CisgICAgICAgICAgICBjbGVhclNob3J0Y3V0cyhMQVVOQ0hFUjRfUEtHLCBnZXRQcmltYXJ5VXNlcklkKCkpOworCiAgICAgICAgICAgICBjbGVhclNob3J0Y3V0cyhQVUJMSVNIRVIxX1BLRywgZ2V0UHJpbWFyeVVzZXJJZCgpKTsKICAgICAgICAgICAgIGNsZWFyU2hvcnRjdXRzKFBVQkxJU0hFUjJfUEtHLCBnZXRQcmltYXJ5VXNlcklkKCkpOwogICAgICAgICAgICAgY2xlYXJTaG9ydGN1dHMoUFVCTElTSEVSM19QS0csIGdldFByaW1hcnlVc2VySWQoKSk7CisgICAgICAgICAgICBjbGVhclNob3J0Y3V0cyhQVUJMSVNIRVI0X1BLRywgZ2V0UHJpbWFyeVVzZXJJZCgpKTsKIAogICAgICAgICAgICAgdW5pbnN0YWxsUGFja2FnZUFuZFdhaXRVbnRpbEJyb2FkY2FzdHNEcmFpbihMQVVOQ0hFUjFfUEtHKTsKICAgICAgICAgICAgIHVuaW5zdGFsbFBhY2thZ2VBbmRXYWl0VW50aWxCcm9hZGNhc3RzRHJhaW4oTEFVTkNIRVIyX1BLRyk7CiAgICAgICAgICAgICB1bmluc3RhbGxQYWNrYWdlQW5kV2FpdFVudGlsQnJvYWRjYXN0c0RyYWluKExBVU5DSEVSM19QS0cpOworICAgICAgICAgICAgdW5pbnN0YWxsUGFja2FnZUFuZFdhaXRVbnRpbEJyb2FkY2FzdHNEcmFpbihMQVVOQ0hFUjRfUEtHKTsKKwogICAgICAgICAgICAgdW5pbnN0YWxsUGFja2FnZUFuZFdhaXRVbnRpbEJyb2FkY2FzdHNEcmFpbihQVUJMSVNIRVIxX1BLRyk7CiAgICAgICAgICAgICB1bmluc3RhbGxQYWNrYWdlQW5kV2FpdFVudGlsQnJvYWRjYXN0c0RyYWluKFBVQkxJU0hFUjJfUEtHKTsKICAgICAgICAgICAgIHVuaW5zdGFsbFBhY2thZ2VBbmRXYWl0VW50aWxCcm9hZGNhc3RzRHJhaW4oUFVCTElTSEVSM19QS0cpOworICAgICAgICAgICAgdW5pbnN0YWxsUGFja2FnZUFuZFdhaXRVbnRpbEJyb2FkY2FzdHNEcmFpbihQVUJMSVNIRVI0X1BLRyk7CiAKICAgICAgICAgICAgIHdhaXRVbnRpbFBhY2thZ2VzR29uZSgpOwogICAgICAgICB9CkBAIC04MCwxNCArMTA0LDE2IEBACiAgICAgICAgICAgICBkdW1wc3lzKCJ0ZWFyRG93biIpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG1TdXBwb3J0c0JhY2t1cCkgeworICAgICAgICBpZiAobVN1cHBvcnRzQmFja3VwICYmICFOT19VTklOU1RBTExfSU5fVEVBUkRPV04pIHsKICAgICAgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoTEFVTkNIRVIxX1BLRyk7CiAgICAgICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKExBVU5DSEVSMl9QS0cpOwogICAgICAgICAgICAgZ2V0RGV2aWNlKCkudW5pbnN0YWxsUGFja2FnZShMQVVOQ0hFUjNfUEtHKTsKKyAgICAgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoTEFVTkNIRVI0X1BLRyk7CiAKICAgICAgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoUFVCTElTSEVSMV9QS0cpOwogICAgICAgICAgICAgZ2V0RGV2aWNlKCkudW5pbnN0YWxsUGFja2FnZShQVUJMSVNIRVIyX1BLRyk7CiAgICAgICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKFBVQkxJU0hFUjNfUEtHKTsKKyAgICAgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoUFVCTElTSEVSNF9QS0cpOwogICAgICAgICB9CiAKICAgICAgICAgc3VwZXIudGVhckRvd24oKTsKQEAgLTE2OSw4ICsxOTUsOCBAQAogICAgICAgICBDTG9nLmkoIldhaXRpbmcgdW50aWwgYWxsIHBhY2thZ2VzIGFyZSByZW1vdmVkIGZyb20gc2hvcnRjdXQgbWFuYWdlci4uLiIpOwogCiAgICAgICAgIGZpbmFsIFN0cmluZyBwYWNrYWdlc1tdID0gewotICAgICAgICAgICAgICAgIExBVU5DSEVSMV9QS0csICBMQVVOQ0hFUjJfUEtHLCBMQVVOQ0hFUjNfUEtHLAotICAgICAgICAgICAgICAgIFBVQkxJU0hFUjFfUEtHLCBQVUJMSVNIRVIyX1BLRywgUFVCTElTSEVSM19QS0csCisgICAgICAgICAgICAgICAgTEFVTkNIRVIxX1BLRywgIExBVU5DSEVSMl9QS0csIExBVU5DSEVSM19QS0csIExBVU5DSEVSNF9QS0csCisgICAgICAgICAgICAgICAgUFVCTElTSEVSMV9QS0csIFBVQkxJU0hFUjJfUEtHLCBQVUJMSVNIRVIzX1BLRywgUFVCTElTSEVSNF9QS0csCiAgICAgICAgIH07CiAKICAgICAgICAgU3RyaW5nIGR1bXBzeXMgPSAiIjsKQEAgLTE4NCw5ICsyMTAsMTEgQEAKICAgICAgICAgICAgIGlmIChkdW1wc3lzLmNvbnRhaW5zKCJMYXVuY2hlcjogIiArIExBVU5DSEVSMV9QS0cpKSBjb250aW51ZTsKICAgICAgICAgICAgIGlmIChkdW1wc3lzLmNvbnRhaW5zKCJMYXVuY2hlcjogIiArIExBVU5DSEVSMl9QS0cpKSBjb250aW51ZTsKICAgICAgICAgICAgIGlmIChkdW1wc3lzLmNvbnRhaW5zKCJMYXVuY2hlcjogIiArIExBVU5DSEVSM19QS0cpKSBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChkdW1wc3lzLmNvbnRhaW5zKCJMYXVuY2hlcjogIiArIExBVU5DSEVSNF9QS0cpKSBjb250aW51ZTsKICAgICAgICAgICAgIGlmIChkdW1wc3lzLmNvbnRhaW5zKCJQYWNrYWdlOiAiICsgUFVCTElTSEVSMV9QS0cpKSBjb250aW51ZTsKICAgICAgICAgICAgIGlmIChkdW1wc3lzLmNvbnRhaW5zKCJQYWNrYWdlOiAiICsgUFVCTElTSEVSMl9QS0cpKSBjb250aW51ZTsKICAgICAgICAgICAgIGlmIChkdW1wc3lzLmNvbnRhaW5zKCJQYWNrYWdlOiAiICsgUFVCTElTSEVSM19QS0cpKSBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChkdW1wc3lzLmNvbnRhaW5zKCJQYWNrYWdlOiAiICsgUFVCTElTSEVSNF9QS0cpKSBjb250aW51ZTsKIAogICAgICAgICAgICAgZHVtcHN5cygiU2hvcnRjdXQgbWFuYWdlciBoYW5kbGVkIGJyb2FkY2FzdHMiKTsKIApAQCAtMjk4LDYgKzMyNiwzNTMgQEAKICAgICAgICAgICAgICAgICBnZXRQcmltYXJ5VXNlcklkKCkpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHRlc3RCYWNrdXBBbmRSZXN0b3JlX2Rvd25ncmFkZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIW1TdXBwb3J0c0JhY2t1cCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGR1bXBzeXMoIlRlc3Qgc3RhcnQiKTsKKworICAgICAgICAvLyBGaXJzdCwgcHVibGlzaCBzaG9ydGN1dHMgZnJvbSB0aGUgbmV3IHZlcnNpb24gYW5kIHBpbiB0aGVtLgorCisgICAgICAgIGluc3RhbGxBcHBBc1VzZXIoUFVCTElTSEVSNF9ORVdfQVBLLCBnZXRQcmltYXJ5VXNlcklkKCkpOworICAgICAgICBpbnN0YWxsQXBwQXNVc2VyKExBVU5DSEVSNF9ORVdfQVBLLCBnZXRQcmltYXJ5VXNlcklkKCkpOworCisgICAgICAgIHJ1bkRldmljZVRlc3RzQXNVc2VyKFBVQkxJU0hFUjRfUEtHLCAiLlNob3J0Y3V0TWFuYWdlclByZUJhY2t1cFRlc3QiLCBnZXRQcmltYXJ5VXNlcklkKCkpOworICAgICAgICBydW5EZXZpY2VUZXN0c0FzVXNlcihMQVVOQ0hFUjRfUEtHLCAiLlNob3J0Y3V0TWFuYWdlclByZUJhY2t1cFRlc3QiLCBnZXRQcmltYXJ5VXNlcklkKCkpOworCisgICAgICAgIGR1bXBzeXMoIkJlZm9yZSBiYWNrdXAiKTsKKworICAgICAgICAvLyBCYWNrdXAKKyAgICAgICAgZG9CYWNrdXAoKTsKKworICAgICAgICAvLyBVbmluc3RhbGwgYWxsIGFwcHMKKyAgICAgICAgdW5pbnN0YWxsUGFja2FnZUFuZFdhaXRVbnRpbEJyb2FkY2FzdHNEcmFpbihMQVVOQ0hFUjRfUEtHKTsKKyAgICAgICAgdW5pbnN0YWxsUGFja2FnZUFuZFdhaXRVbnRpbEJyb2FkY2FzdHNEcmFpbihQVUJMSVNIRVI0X1BLRyk7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBzaG9ydGN1dCBzZXJ2aWNlIGhhbmRsZWQgYWxsIHRoZSB1bmluc3RhbGwgYnJvYWRjYXN0cy4KKyAgICAgICAgd2FpdFVudGlsUGFja2FnZXNHb25lKCk7CisKKyAgICAgICAgLy8gRG8gaXQgb25lIG1vcmUgdGltZSBqdXN0IGluIGNhc2UuLi4KKyAgICAgICAgd2FpdFVudGlsQnJvYWRjYXN0c0RyYWluKCk7CisKKyAgICAgICAgLy8gVGhlbiByZXN0b3JlCisgICAgICAgIGRvUmVzdG9yZSgpOworCisgICAgICAgIGR1bXBzeXMoIkFmdGVyIHJlc3RvcmUiKTsKKworICAgICAgICAvLyBSZXN0b3JlIHRoZSBvbGQgdmVyc2lvbiBvZiB0aGUgYXBwLCBhbmQgdGhlIGxhdW5jaGVyLgorICAgICAgICAvLyAoQnV0IHdlIGRvbid0IGNoZWNrIHRoZSBsYXVuY2hlcidzIHZlcnNpb24sIHNvIHVzaW5nIG9sZCBpcyBmaW5lLikKKyAgICAgICAgaW5zdGFsbEFwcEFzVXNlcihMQVVOQ0hFUjRfT0xEX0FQSywgZ2V0UHJpbWFyeVVzZXJJZCgpKTsKKyAgICAgICAgaW5zdGFsbEFwcEFzVXNlcihQVUJMSVNIRVI0X09MRF9BUEssIGdldFByaW1hcnlVc2VySWQoKSk7CisgICAgICAgIHdhaXRVbnRpbEJyb2FkY2FzdHNEcmFpbigpOworCisgICAgICAgIHJ1bkRldmljZVRlc3RzQXNVc2VyKFBVQkxJU0hFUjRfUEtHLCAiLlNob3J0Y3V0TWFuYWdlclBvc3RCYWNrdXBUZXN0IiwKKyAgICAgICAgICAgICAgICAidGVzdFJlc3RvcmVkT25PbGRWZXJzaW9uIiwKKyAgICAgICAgICAgICAgICBnZXRQcmltYXJ5VXNlcklkKCkpOworCisgICAgICAgIHJ1bkRldmljZVRlc3RzQXNVc2VyKExBVU5DSEVSNF9QS0csICIuU2hvcnRjdXRNYW5hZ2VyUG9zdEJhY2t1cFRlc3QiLAorICAgICAgICAgICAgICAgICJ0ZXN0UmVzdG9yZWRPbk9sZFZlcnNpb24iLAorICAgICAgICAgICAgICAgIGdldFByaW1hcnlVc2VySWQoKSk7CisKKyAgICAgICAgLy8gTmV3IGluc3RhbGwgdGhlIG9yaWdpbmFsIHZlcnNpb24uIEFsbCBibG9ja2VkIHNob3J0Y3V0cyBzaG91bGQgcmUtYXBwZWFyLgorICAgICAgICBpbnN0YWxsQXBwQXNVc2VyKFBVQkxJU0hFUjRfTkVXX0FQSywgZ2V0UHJpbWFyeVVzZXJJZCgpKTsKKyAgICAgICAgd2FpdFVudGlsQnJvYWRjYXN0c0RyYWluKCk7CisKKyAgICAgICAgcnVuRGV2aWNlVGVzdHNBc1VzZXIoUFVCTElTSEVSNF9QS0csICIuU2hvcnRjdXRNYW5hZ2VyUG9zdEJhY2t1cFRlc3QiLAorICAgICAgICAgICAgICAgICJ0ZXN0UmVzdG9yZWRPbk5ld1ZlcnNpb24iLAorICAgICAgICAgICAgICAgIGdldFByaW1hcnlVc2VySWQoKSk7CisKKyAgICAgICAgcnVuRGV2aWNlVGVzdHNBc1VzZXIoTEFVTkNIRVI0X1BLRywgIi5TaG9ydGN1dE1hbmFnZXJQb3N0QmFja3VwVGVzdCIsCisgICAgICAgICAgICAgICAgInRlc3RSZXN0b3JlZE9uTmV3VmVyc2lvbiIsCisgICAgICAgICAgICAgICAgZ2V0UHJpbWFyeVVzZXJJZCgpKTsKKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RCYWNrdXBBbmRSZXN0b3JlX2JhY2t1cFdhc0Rpc2FibGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghbVN1cHBvcnRzQmFja3VwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZHVtcHN5cygiVGVzdCBzdGFydCIpOworCisgICAgICAgIC8vIEZpcnN0LCBwdWJsaXNoIHNob3J0Y3V0cyBmcm9tICJub2JhY2t1cCIgdmVyc2lvbi4KKworICAgICAgICBpbnN0YWxsQXBwQXNVc2VyKFBVQkxJU0hFUjRfTkVXX05PQkFDS1VQX0FQSywgZ2V0UHJpbWFyeVVzZXJJZCgpKTsKKyAgICAgICAgaW5zdGFsbEFwcEFzVXNlcihMQVVOQ0hFUjRfTkVXX0FQSywgZ2V0UHJpbWFyeVVzZXJJZCgpKTsKKworICAgICAgICBydW5EZXZpY2VUZXN0c0FzVXNlcihQVUJMSVNIRVI0X1BLRywgIi5TaG9ydGN1dE1hbmFnZXJQcmVCYWNrdXBUZXN0IiwgZ2V0UHJpbWFyeVVzZXJJZCgpKTsKKyAgICAgICAgcnVuRGV2aWNlVGVzdHNBc1VzZXIoTEFVTkNIRVI0X1BLRywgIi5TaG9ydGN1dE1hbmFnZXJQcmVCYWNrdXBUZXN0IiwgZ2V0UHJpbWFyeVVzZXJJZCgpKTsKKworICAgICAgICBkdW1wc3lzKCJCZWZvcmUgYmFja3VwIik7CisKKyAgICAgICAgLy8gQmFja3VwCisgICAgICAgIGRvQmFja3VwKCk7CisKKyAgICAgICAgLy8gVW5pbnN0YWxsIGFsbCBhcHBzCisgICAgICAgIHVuaW5zdGFsbFBhY2thZ2VBbmRXYWl0VW50aWxCcm9hZGNhc3RzRHJhaW4oTEFVTkNIRVI0X1BLRyk7CisgICAgICAgIHVuaW5zdGFsbFBhY2thZ2VBbmRXYWl0VW50aWxCcm9hZGNhc3RzRHJhaW4oUFVCTElTSEVSNF9QS0cpOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgc2hvcnRjdXQgc2VydmljZSBoYW5kbGVkIGFsbCB0aGUgdW5pbnN0YWxsIGJyb2FkY2FzdHMuCisgICAgICAgIHdhaXRVbnRpbFBhY2thZ2VzR29uZSgpOworCisgICAgICAgIC8vIERvIGl0IG9uZSBtb3JlIHRpbWUganVzdCBpbiBjYXNlLi4uCisgICAgICAgIHdhaXRVbnRpbEJyb2FkY2FzdHNEcmFpbigpOworCisgICAgICAgIC8vIFRoZW4gcmVzdG9yZQorICAgICAgICBkb1Jlc3RvcmUoKTsKKworICAgICAgICBkdW1wc3lzKCJBZnRlciByZXN0b3JlIik7CisKKyAgICAgICAgLy8gSW5zdGFsbCB0aGUgImJhY2t1cC1vayIgdmVyc2lvbi4gQnV0IHJlc3RvcmF0aW9uIGlzIGxpbWl0ZWQuCisgICAgICAgIGluc3RhbGxBcHBBc1VzZXIoTEFVTkNIRVI0X05FV19BUEssIGdldFByaW1hcnlVc2VySWQoKSk7CisgICAgICAgIGluc3RhbGxBcHBBc1VzZXIoUFVCTElTSEVSNF9ORVdfQVBLLCBnZXRQcmltYXJ5VXNlcklkKCkpOworICAgICAgICB3YWl0VW50aWxCcm9hZGNhc3RzRHJhaW4oKTsKKworICAgICAgICBydW5EZXZpY2VUZXN0c0FzVXNlcihQVUJMSVNIRVI0X1BLRywgIi5TaG9ydGN1dE1hbmFnZXJQb3N0QmFja3VwVGVzdCIsCisgICAgICAgICAgICAgICAgInRlc3RCYWNrdXBEaXNhYmxlZCIsCisgICAgICAgICAgICAgICAgZ2V0UHJpbWFyeVVzZXJJZCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmFja3VwQW5kUmVzdG9yZV9iYWNrdXBJc0Rpc2FibGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghbVN1cHBvcnRzQmFja3VwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZHVtcHN5cygiVGVzdCBzdGFydCIpOworCisgICAgICAgIC8vIEZpcnN0LCBwdWJsaXNoIHNob3J0Y3V0cyBmcm9tIGJhY2t1cC1vayB2ZXJzaW9uLgorCisgICAgICAgIGluc3RhbGxBcHBBc1VzZXIoUFVCTElTSEVSNF9ORVdfQVBLLCBnZXRQcmltYXJ5VXNlcklkKCkpOworICAgICAgICBpbnN0YWxsQXBwQXNVc2VyKExBVU5DSEVSNF9ORVdfQVBLLCBnZXRQcmltYXJ5VXNlcklkKCkpOworCisgICAgICAgIHJ1bkRldmljZVRlc3RzQXNVc2VyKFBVQkxJU0hFUjRfUEtHLCAiLlNob3J0Y3V0TWFuYWdlclByZUJhY2t1cFRlc3QiLCBnZXRQcmltYXJ5VXNlcklkKCkpOworICAgICAgICBydW5EZXZpY2VUZXN0c0FzVXNlcihMQVVOQ0hFUjRfUEtHLCAiLlNob3J0Y3V0TWFuYWdlclByZUJhY2t1cFRlc3QiLCBnZXRQcmltYXJ5VXNlcklkKCkpOworCisgICAgICAgIGR1bXBzeXMoIkJlZm9yZSBiYWNrdXAiKTsKKworICAgICAgICAvLyBCYWNrdXAKKyAgICAgICAgZG9CYWNrdXAoKTsKKworICAgICAgICAvLyBVbmluc3RhbGwgYWxsIGFwcHMKKyAgICAgICAgdW5pbnN0YWxsUGFja2FnZUFuZFdhaXRVbnRpbEJyb2FkY2FzdHNEcmFpbihMQVVOQ0hFUjRfUEtHKTsKKyAgICAgICAgdW5pbnN0YWxsUGFja2FnZUFuZFdhaXRVbnRpbEJyb2FkY2FzdHNEcmFpbihQVUJMSVNIRVI0X1BLRyk7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBzaG9ydGN1dCBzZXJ2aWNlIGhhbmRsZWQgYWxsIHRoZSB1bmluc3RhbGwgYnJvYWRjYXN0cy4KKyAgICAgICAgd2FpdFVudGlsUGFja2FnZXNHb25lKCk7CisKKyAgICAgICAgLy8gRG8gaXQgb25lIG1vcmUgdGltZSBqdXN0IGluIGNhc2UuLi4KKyAgICAgICAgd2FpdFVudGlsQnJvYWRjYXN0c0RyYWluKCk7CisKKyAgICAgICAgLy8gVGhlbiByZXN0b3JlCisgICAgICAgIGRvUmVzdG9yZSgpOworCisgICAgICAgIGR1bXBzeXMoIkFmdGVyIHJlc3RvcmUiKTsKKworICAgICAgICAvLyBJbnN0YWxsIHRoZSBub2JhY2t1cCB2ZXJzaW9uLiBSZXN0b3JhdGlvbiBpcyBsaW1pdGVkLgorICAgICAgICBpbnN0YWxsQXBwQXNVc2VyKExBVU5DSEVSNF9ORVdfQVBLLCBnZXRQcmltYXJ5VXNlcklkKCkpOworICAgICAgICBpbnN0YWxsQXBwQXNVc2VyKFBVQkxJU0hFUjRfTkVXX05PQkFDS1VQX0FQSywgZ2V0UHJpbWFyeVVzZXJJZCgpKTsKKyAgICAgICAgd2FpdFVudGlsQnJvYWRjYXN0c0RyYWluKCk7CisKKyAgICAgICAgcnVuRGV2aWNlVGVzdHNBc1VzZXIoUFVCTElTSEVSNF9QS0csICIuU2hvcnRjdXRNYW5hZ2VyUG9zdEJhY2t1cFRlc3QiLAorICAgICAgICAgICAgICAgICJ0ZXN0QmFja3VwRGlzYWJsZWQiLAorICAgICAgICAgICAgICAgIGdldFByaW1hcnlVc2VySWQoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEJhY2t1cEFuZFJlc3RvcmVfd3JvbmdLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFtU3VwcG9ydHNCYWNrdXApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBkdW1wc3lzKCJUZXN0IHN0YXJ0Iik7CisKKyAgICAgICAgLy8gRmlyc3QsIHB1Ymxpc2ggc2hvcnRjdXRzIGZyb20gYmFja3VwLW9rIHZlcnNpb24uCisKKyAgICAgICAgaW5zdGFsbEFwcEFzVXNlcihQVUJMSVNIRVI0X05FV19BUEssIGdldFByaW1hcnlVc2VySWQoKSk7CisgICAgICAgIGluc3RhbGxBcHBBc1VzZXIoTEFVTkNIRVI0X05FV19BUEssIGdldFByaW1hcnlVc2VySWQoKSk7CisKKyAgICAgICAgcnVuRGV2aWNlVGVzdHNBc1VzZXIoUFVCTElTSEVSNF9QS0csICIuU2hvcnRjdXRNYW5hZ2VyUHJlQmFja3VwVGVzdCIsIGdldFByaW1hcnlVc2VySWQoKSk7CisgICAgICAgIHJ1bkRldmljZVRlc3RzQXNVc2VyKExBVU5DSEVSNF9QS0csICIuU2hvcnRjdXRNYW5hZ2VyUHJlQmFja3VwVGVzdCIsIGdldFByaW1hcnlVc2VySWQoKSk7CisKKyAgICAgICAgZHVtcHN5cygiQmVmb3JlIGJhY2t1cCIpOworCisgICAgICAgIC8vIEJhY2t1cAorICAgICAgICBkb0JhY2t1cCgpOworCisgICAgICAgIC8vIFVuaW5zdGFsbCBhbGwgYXBwcworICAgICAgICB1bmluc3RhbGxQYWNrYWdlQW5kV2FpdFVudGlsQnJvYWRjYXN0c0RyYWluKExBVU5DSEVSNF9QS0cpOworICAgICAgICB1bmluc3RhbGxQYWNrYWdlQW5kV2FpdFVudGlsQnJvYWRjYXN0c0RyYWluKFBVQkxJU0hFUjRfUEtHKTsKKworICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHNob3J0Y3V0IHNlcnZpY2UgaGFuZGxlZCBhbGwgdGhlIHVuaW5zdGFsbCBicm9hZGNhc3RzLgorICAgICAgICB3YWl0VW50aWxQYWNrYWdlc0dvbmUoKTsKKworICAgICAgICAvLyBEbyBpdCBvbmUgbW9yZSB0aW1lIGp1c3QgaW4gY2FzZS4uLgorICAgICAgICB3YWl0VW50aWxCcm9hZGNhc3RzRHJhaW4oKTsKKworICAgICAgICAvLyBUaGVuIHJlc3RvcmUKKyAgICAgICAgZG9SZXN0b3JlKCk7CisKKyAgICAgICAgZHVtcHN5cygiQWZ0ZXIgcmVzdG9yZSIpOworCisgICAgICAgIC8vIEluc3RhbGwgdGhlIG5vYmFja3VwIHZlcnNpb24uIFJlc3RvcmF0aW9uIGlzIGxpbWl0ZWQuCisgICAgICAgIGluc3RhbGxBcHBBc1VzZXIoTEFVTkNIRVI0X05FV19BUEssIGdldFByaW1hcnlVc2VySWQoKSk7CisgICAgICAgIGluc3RhbGxBcHBBc1VzZXIoUFVCTElTSEVSNF9ORVdfV1JPTkdLRVlfQVBLLCBnZXRQcmltYXJ5VXNlcklkKCkpOworICAgICAgICB3YWl0VW50aWxCcm9hZGNhc3RzRHJhaW4oKTsKKworICAgICAgICBydW5EZXZpY2VUZXN0c0FzVXNlcihQVUJMSVNIRVI0X1BLRywgIi5TaG9ydGN1dE1hbmFnZXJQb3N0QmFja3VwVGVzdCIsCisgICAgICAgICAgICAgICAgInRlc3RSZXN0b3JlV3JvbmdLZXkiLAorICAgICAgICAgICAgICAgIGdldFByaW1hcnlVc2VySWQoKSk7CisKKyAgICAgICAgcnVuRGV2aWNlVGVzdHNBc1VzZXIoTEFVTkNIRVI0X1BLRywgIi5TaG9ydGN1dE1hbmFnZXJQb3N0QmFja3VwVGVzdCIsCisgICAgICAgICAgICAgICAgInRlc3RSZXN0b3JlV3JvbmdLZXkiLAorICAgICAgICAgICAgICAgIGdldFByaW1hcnlVc2VySWQoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEJhY2t1cEFuZFJlc3RvcmVfbm9NYW5pZmVzdE9uT2xkVmVyc2lvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIW1TdXBwb3J0c0JhY2t1cCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGR1bXBzeXMoIlRlc3Qgc3RhcnQiKTsKKworICAgICAgICAvLyBGaXJzdCwgcHVibGlzaCBzaG9ydGN1dHMgZnJvbSBiYWNrdXAtb2sgdmVyc2lvbi4KKworICAgICAgICBpbnN0YWxsQXBwQXNVc2VyKFBVQkxJU0hFUjRfTkVXX0FQSywgZ2V0UHJpbWFyeVVzZXJJZCgpKTsKKyAgICAgICAgaW5zdGFsbEFwcEFzVXNlcihMQVVOQ0hFUjRfTkVXX0FQSywgZ2V0UHJpbWFyeVVzZXJJZCgpKTsKKworICAgICAgICBydW5EZXZpY2VUZXN0c0FzVXNlcihQVUJMSVNIRVI0X1BLRywgIi5TaG9ydGN1dE1hbmFnZXJQcmVCYWNrdXBUZXN0IiwgZ2V0UHJpbWFyeVVzZXJJZCgpKTsKKyAgICAgICAgcnVuRGV2aWNlVGVzdHNBc1VzZXIoTEFVTkNIRVI0X1BLRywgIi5TaG9ydGN1dE1hbmFnZXJQcmVCYWNrdXBUZXN0IiwgZ2V0UHJpbWFyeVVzZXJJZCgpKTsKKworICAgICAgICBkdW1wc3lzKCJCZWZvcmUgYmFja3VwIik7CisKKyAgICAgICAgLy8gQmFja3VwCisgICAgICAgIGRvQmFja3VwKCk7CisKKyAgICAgICAgLy8gVW5pbnN0YWxsIGFsbCBhcHBzCisgICAgICAgIHVuaW5zdGFsbFBhY2thZ2VBbmRXYWl0VW50aWxCcm9hZGNhc3RzRHJhaW4oTEFVTkNIRVI0X1BLRyk7CisgICAgICAgIHVuaW5zdGFsbFBhY2thZ2VBbmRXYWl0VW50aWxCcm9hZGNhc3RzRHJhaW4oUFVCTElTSEVSNF9QS0cpOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgc2hvcnRjdXQgc2VydmljZSBoYW5kbGVkIGFsbCB0aGUgdW5pbnN0YWxsIGJyb2FkY2FzdHMuCisgICAgICAgIHdhaXRVbnRpbFBhY2thZ2VzR29uZSgpOworCisgICAgICAgIC8vIERvIGl0IG9uZSBtb3JlIHRpbWUganVzdCBpbiBjYXNlLi4uCisgICAgICAgIHdhaXRVbnRpbEJyb2FkY2FzdHNEcmFpbigpOworCisgICAgICAgIC8vIFRoZW4gcmVzdG9yZQorICAgICAgICBkb1Jlc3RvcmUoKTsKKworICAgICAgICBkdW1wc3lzKCJBZnRlciByZXN0b3JlIik7CisKKyAgICAgICAgLy8gSW5zdGFsbCB0aGUgbm9iYWNrdXAgdmVyc2lvbi4gUmVzdG9yYXRpb24gaXMgbGltaXRlZC4KKyAgICAgICAgaW5zdGFsbEFwcEFzVXNlcihMQVVOQ0hFUjRfTkVXX0FQSywgZ2V0UHJpbWFyeVVzZXJJZCgpKTsKKyAgICAgICAgaW5zdGFsbEFwcEFzVXNlcihQVUJMSVNIRVI0X09MRF9OT19NQU5JRlNUX0FQSywgZ2V0UHJpbWFyeVVzZXJJZCgpKTsKKyAgICAgICAgd2FpdFVudGlsQnJvYWRjYXN0c0RyYWluKCk7CisKKyAgICAgICAgcnVuRGV2aWNlVGVzdHNBc1VzZXIoUFVCTElTSEVSNF9QS0csICIuU2hvcnRjdXRNYW5hZ2VyUG9zdEJhY2t1cFRlc3QiLAorICAgICAgICAgICAgICAgICJ0ZXN0UmVzdG9yZU5vTWFuaWZlc3RPbk9sZFZlcnNpb24iLAorICAgICAgICAgICAgICAgIGdldFByaW1hcnlVc2VySWQoKSk7CisKKyAgICAgICAgcnVuRGV2aWNlVGVzdHNBc1VzZXIoTEFVTkNIRVI0X1BLRywgIi5TaG9ydGN1dE1hbmFnZXJQb3N0QmFja3VwVGVzdCIsCisgICAgICAgICAgICAgICAgInRlc3RSZXN0b3JlTm9NYW5pZmVzdE9uT2xkVmVyc2lvbiIsCisgICAgICAgICAgICAgICAgZ2V0UHJpbWFyeVVzZXJJZCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmFja3VwQW5kUmVzdG9yZV9ub01hbmlmZXN0T25OZXdWZXJzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghbVN1cHBvcnRzQmFja3VwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZHVtcHN5cygiVGVzdCBzdGFydCIpOworCisgICAgICAgIC8vIEZpcnN0LCBwdWJsaXNoIHNob3J0Y3V0cyBmcm9tIGJhY2t1cC1vayB2ZXJzaW9uLgorCisgICAgICAgIGluc3RhbGxBcHBBc1VzZXIoUFVCTElTSEVSNF9ORVdfQVBLLCBnZXRQcmltYXJ5VXNlcklkKCkpOworICAgICAgICBpbnN0YWxsQXBwQXNVc2VyKExBVU5DSEVSNF9ORVdfQVBLLCBnZXRQcmltYXJ5VXNlcklkKCkpOworCisgICAgICAgIHJ1bkRldmljZVRlc3RzQXNVc2VyKFBVQkxJU0hFUjRfUEtHLCAiLlNob3J0Y3V0TWFuYWdlclByZUJhY2t1cFRlc3QiLCBnZXRQcmltYXJ5VXNlcklkKCkpOworICAgICAgICBydW5EZXZpY2VUZXN0c0FzVXNlcihMQVVOQ0hFUjRfUEtHLCAiLlNob3J0Y3V0TWFuYWdlclByZUJhY2t1cFRlc3QiLCBnZXRQcmltYXJ5VXNlcklkKCkpOworCisgICAgICAgIGR1bXBzeXMoIkJlZm9yZSBiYWNrdXAiKTsKKworICAgICAgICAvLyBCYWNrdXAKKyAgICAgICAgZG9CYWNrdXAoKTsKKworICAgICAgICAvLyBVbmluc3RhbGwgYWxsIGFwcHMKKyAgICAgICAgdW5pbnN0YWxsUGFja2FnZUFuZFdhaXRVbnRpbEJyb2FkY2FzdHNEcmFpbihMQVVOQ0hFUjRfUEtHKTsKKyAgICAgICAgdW5pbnN0YWxsUGFja2FnZUFuZFdhaXRVbnRpbEJyb2FkY2FzdHNEcmFpbihQVUJMSVNIRVI0X1BLRyk7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBzaG9ydGN1dCBzZXJ2aWNlIGhhbmRsZWQgYWxsIHRoZSB1bmluc3RhbGwgYnJvYWRjYXN0cy4KKyAgICAgICAgd2FpdFVudGlsUGFja2FnZXNHb25lKCk7CisKKyAgICAgICAgLy8gRG8gaXQgb25lIG1vcmUgdGltZSBqdXN0IGluIGNhc2UuLi4KKyAgICAgICAgd2FpdFVudGlsQnJvYWRjYXN0c0RyYWluKCk7CisKKyAgICAgICAgLy8gVGhlbiByZXN0b3JlCisgICAgICAgIGRvUmVzdG9yZSgpOworCisgICAgICAgIGR1bXBzeXMoIkFmdGVyIHJlc3RvcmUiKTsKKworICAgICAgICAvLyBJbnN0YWxsIHRoZSBub2JhY2t1cCB2ZXJzaW9uLiBSZXN0b3JhdGlvbiBpcyBsaW1pdGVkLgorICAgICAgICBpbnN0YWxsQXBwQXNVc2VyKExBVU5DSEVSNF9ORVdfQVBLLCBnZXRQcmltYXJ5VXNlcklkKCkpOworICAgICAgICBpbnN0YWxsQXBwQXNVc2VyKFBVQkxJU0hFUjRfTkVXX05PX01BTklGU1RfQVBLLCBnZXRQcmltYXJ5VXNlcklkKCkpOworICAgICAgICB3YWl0VW50aWxCcm9hZGNhc3RzRHJhaW4oKTsKKworICAgICAgICBydW5EZXZpY2VUZXN0c0FzVXNlcihQVUJMSVNIRVI0X1BLRywgIi5TaG9ydGN1dE1hbmFnZXJQb3N0QmFja3VwVGVzdCIsCisgICAgICAgICAgICAgICAgInRlc3RSZXN0b3JlTm9NYW5pZmVzdE9uTmV3VmVyc2lvbiIsCisgICAgICAgICAgICAgICAgZ2V0UHJpbWFyeVVzZXJJZCgpKTsKKworICAgICAgICBydW5EZXZpY2VUZXN0c0FzVXNlcihMQVVOQ0hFUjRfUEtHLCAiLlNob3J0Y3V0TWFuYWdlclBvc3RCYWNrdXBUZXN0IiwKKyAgICAgICAgICAgICAgICAidGVzdFJlc3RvcmVOb01hbmlmZXN0T25OZXdWZXJzaW9uIiwKKyAgICAgICAgICAgICAgICBnZXRQcmltYXJ5VXNlcklkKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ha2Ugc3VyZSBpbnZpc2libGUgc2hvcnRjdXRzIGFyZSBpZ25vcmVkIGJ5IGFsbCBBUEkgY2FsbHMuCisgICAgICoKKyAgICAgKiAoUmVzdG9yZSBmcm9tIG5ldyB0byBvbGQtbm9tYW5pZmVzdCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmFja3VwQW5kUmVzdG9yZV9pbnZpc2libGVJZ25vcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghbVN1cHBvcnRzQmFja3VwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZHVtcHN5cygiVGVzdCBzdGFydCIpOworCisgICAgICAgIC8vIEZpcnN0LCBwdWJsaXNoIHNob3J0Y3V0cyBmcm9tIGJhY2t1cC1vayB2ZXJzaW9uLgorCisgICAgICAgIGluc3RhbGxBcHBBc1VzZXIoUFVCTElTSEVSNF9ORVdfQVBLLCBnZXRQcmltYXJ5VXNlcklkKCkpOworICAgICAgICBpbnN0YWxsQXBwQXNVc2VyKExBVU5DSEVSNF9ORVdfQVBLLCBnZXRQcmltYXJ5VXNlcklkKCkpOworCisgICAgICAgIHJ1bkRldmljZVRlc3RzQXNVc2VyKFBVQkxJU0hFUjRfUEtHLCAiLlNob3J0Y3V0TWFuYWdlclByZUJhY2t1cFRlc3QiLCBnZXRQcmltYXJ5VXNlcklkKCkpOworICAgICAgICBydW5EZXZpY2VUZXN0c0FzVXNlcihMQVVOQ0hFUjRfUEtHLCAiLlNob3J0Y3V0TWFuYWdlclByZUJhY2t1cFRlc3QiLCBnZXRQcmltYXJ5VXNlcklkKCkpOworCisgICAgICAgIGR1bXBzeXMoIkJlZm9yZSBiYWNrdXAiKTsKKworICAgICAgICAvLyBCYWNrdXAKKyAgICAgICAgZG9CYWNrdXAoKTsKKworICAgICAgICAvLyBVbmluc3RhbGwgYWxsIGFwcHMKKyAgICAgICAgdW5pbnN0YWxsUGFja2FnZUFuZFdhaXRVbnRpbEJyb2FkY2FzdHNEcmFpbihMQVVOQ0hFUjRfUEtHKTsKKyAgICAgICAgdW5pbnN0YWxsUGFja2FnZUFuZFdhaXRVbnRpbEJyb2FkY2FzdHNEcmFpbihQVUJMSVNIRVI0X1BLRyk7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBzaG9ydGN1dCBzZXJ2aWNlIGhhbmRsZWQgYWxsIHRoZSB1bmluc3RhbGwgYnJvYWRjYXN0cy4KKyAgICAgICAgd2FpdFVudGlsUGFja2FnZXNHb25lKCk7CisKKyAgICAgICAgLy8gRG8gaXQgb25lIG1vcmUgdGltZSBqdXN0IGluIGNhc2UuLi4KKyAgICAgICAgd2FpdFVudGlsQnJvYWRjYXN0c0RyYWluKCk7CisKKyAgICAgICAgLy8gVGhlbiByZXN0b3JlCisgICAgICAgIGRvUmVzdG9yZSgpOworCisgICAgICAgIGR1bXBzeXMoIkFmdGVyIHJlc3RvcmUiKTsKKworICAgICAgICAvLyBJbnN0YWxsIHRoZSBub2JhY2t1cCB2ZXJzaW9uLiBSZXN0b3JhdGlvbiBpcyBsaW1pdGVkLgorICAgICAgICBpbnN0YWxsQXBwQXNVc2VyKExBVU5DSEVSNF9ORVdfQVBLLCBnZXRQcmltYXJ5VXNlcklkKCkpOworICAgICAgICBpbnN0YWxsQXBwQXNVc2VyKFBVQkxJU0hFUjRfT0xEX05PX01BTklGU1RfQVBLLCBnZXRQcmltYXJ5VXNlcklkKCkpOworICAgICAgICB3YWl0VW50aWxCcm9hZGNhc3RzRHJhaW4oKTsKKworICAgICAgICBydW5EZXZpY2VUZXN0c0FzVXNlcihQVUJMSVNIRVI0X1BLRywgIi5TaG9ydGN1dE1hbmFnZXJQb3N0QmFja3VwVGVzdCIsCisgICAgICAgICAgICAgICAgInRlc3RJbnZpc2libGVJZ25vcmVkIiwKKyAgICAgICAgICAgICAgICBnZXRQcmltYXJ5VXNlcklkKCkpOworCisgICAgICAgIHJ1bkRldmljZVRlc3RzQXNVc2VyKExBVU5DSEVSNF9QS0csICIuU2hvcnRjdXRNYW5hZ2VyUG9zdEJhY2t1cFRlc3QiLAorICAgICAgICAgICAgICAgICJ0ZXN0SW52aXNpYmxlSWdub3JlZCIsCisgICAgICAgICAgICAgICAgZ2V0UHJpbWFyeVVzZXJJZCgpKTsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCB0ZXN0QmFja3VwQW5kUmVzdG9yZV93aXRoTm9Vbmluc3RhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFtU3VwcG9ydHNCYWNrdXApIHsKICAgICAgICAgICAgIHJldHVybjsKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2hvc3RzaWRlL3NyYy9hbmRyb2lkL2NvbnRlbnQvcG0vY3RzL3Nob3J0Y3V0aG9zdC9TaG9ydGN1dE1hbmFnZXJNdWx0aXVzZXJUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL3Nob3J0Y3V0cy9ob3N0c2lkZS9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9zaG9ydGN1dGhvc3QvU2hvcnRjdXRNYW5hZ2VyTXVsdGl1c2VyVGVzdC5qYXZhCmluZGV4IDNjMjY1YmEuLjk1NDllYjAgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvc2hvcnRjdXRzL2hvc3RzaWRlL3NyYy9hbmRyb2lkL2NvbnRlbnQvcG0vY3RzL3Nob3J0Y3V0aG9zdC9TaG9ydGN1dE1hbmFnZXJNdWx0aXVzZXJUZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9zaG9ydGN1dHMvaG9zdHNpZGUvc3JjL2FuZHJvaWQvY29udGVudC9wbS9jdHMvc2hvcnRjdXRob3N0L1Nob3J0Y3V0TWFuYWdlck11bHRpdXNlclRlc3QuamF2YQpAQCAtNDUsNyArNDUsNyBAQAogICAgICAgICBydW5EZXZpY2VUZXN0c0FzVXNlcihUQVJHRVRfUEtHLCAiLlNob3J0Y3V0TWFuYWdlck1hbmFnZWRVc2VyVGVzdCIsCiAgICAgICAgICAgICAgICAgInRlc3QwMV9tYW5hZ2VkUHJvZmlsZU5vdFN0YXJ0ZWQiLCBnZXRQcmltYXJ5VXNlcklkKCkpOwogCi0gICAgICAgIGdldERldmljZSgpLnN0YXJ0VXNlcihwcm9maWxlSWQpOworICAgICAgICBzdGFydFVzZXJBbmRXYWl0KHByb2ZpbGVJZCk7CiAKICAgICAgICAgcnVuRGV2aWNlVGVzdHNBc1VzZXIoVEFSR0VUX1BLRywgIi5TaG9ydGN1dE1hbmFnZXJNYW5hZ2VkVXNlclRlc3QiLAogICAgICAgICAgICAgICAgICJ0ZXN0MDJfY3JlYXRlU2hvcnR1Y3RzT25QcmltYXJ5VXNlciIsIGdldFByaW1hcnlVc2VySWQoKSk7CkBAIC02Miw3ICs2Miw3IEBACiAgICAgICAgIGlmICghbUlzTXVsdGl1c2VyU3VwcG9ydGVkKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgZmluYWwgaW50IHNlY29uZFVzZXJJRCA9IGNyZWF0ZVVzZXIoKTsKKyAgICAgICAgZmluYWwgaW50IHNlY29uZFVzZXJJRCA9IGdldE9yQ3JlYXRlU2Vjb25kYXJ5VXNlcigpOwogCiAgICAgICAgIGdldERldmljZSgpLnN0YXJ0VXNlcihzZWNvbmRVc2VySUQpOwogICAgICAgICBnZXREZXZpY2UoKS5zd2l0Y2hVc2VyKHNlY29uZFVzZXJJRCk7CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3N0YXRzZC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9zdGF0c2QvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjE0Y2IxCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9zdGF0c2QvQW5kcm9pZC5tawpAQCAtMCwwICsxLDMzIEBACisjIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCisKKyMgdGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworCitMT0NBTF9NT0RVTEUgOj0gQ3RzU3RhdHNkSG9zdFRlc3RDYXNlcworCitMT0NBTF9QUk9UT0NfT1BUSU1JWkVfVFlQRSA6PSBmdWxsCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gcGxhdGZvcm1wcm90b3MKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGN0cy10cmFkZWZlZCB0cmFkZWZlZCBjb21wYXRpYmlsaXR5LWhvc3QtdXRpbCBob3N0LWxpYnByb3RvYnVmLWphdmEtZnVsbAorCitpbmNsdWRlICQoQlVJTERfSE9TVF9KQVZBX0xJQlJBUlkpCisKK2luY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc3RhdHNkL0FuZHJvaWRUZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvc3RhdHNkL0FuZHJvaWRUZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjBhZTc1Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9zdGF0c2QvQW5kcm9pZFRlc3QueG1sCkBAIC0wLDAgKzEsMjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgU3RhdHNkIGhvc3QgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KKyAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9InN0YXRzZCIgLz4KKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGVzdHR5cGUuSmFySG9zdFRlc3QiID4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJqYXIiIHZhbHVlPSJDdHNTdGF0c2RIb3N0VGVzdENhc2VzLmphciIgLz4KKyAgICA8L3Rlc3Q+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5SdW5Db21tYW5kVGFyZ2V0UHJlcGFyZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bi1jb21tYW5kIiB2YWx1ZT0ic2V0cHJvcCBwZXJzaXN0LnRyYWNlZC5lbmFibGUgMSIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKzwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc3RhdHNkL2FwcHMvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvc3RhdHNkL2FwcHMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTc0ZTgwCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9zdGF0c2QvYXBwcy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjAgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKKyMgQnVpbGQgdGhlIHRlc3QgQVBLcyB1c2luZyB0aGVpciBvd24gbWFrZWZpbGVzCitpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3N0YXRzZC9hcHBzL3N0YXRzZGFwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9zdGF0c2QvYXBwcy9zdGF0c2RhcHAvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjE1ZDNjCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9zdGF0c2QvYXBwcy9zdGF0c2RhcHAvQW5kcm9pZC5tawpAQCAtMCwwICsxLDQ1IEBACisjIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNTdGF0c2RBcHAKK0xPQ0FMX1BSSVZBVEVfUExBVEZPUk1fQVBJUyA6PSB0cnVlCisKKyMgZG9uJ3QgaW5jbHVkZSB0aGlzIHBhY2thZ2UgaW4gYW55IHRhcmdldAorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKyMgYW5kIHdoZW4gYnVpbHQgZXhwbGljaXRseSBwdXQgaXQgaW4gdGhlIGRhdGEgcGFydGl0aW9uCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQorCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzIGN0cy1qdW5pdCBvcmcuYXBhY2hlLmh0dHAubGVnYWN5CisKK0xPQ0FMX1BSSVZJTEVHRURfTU9EVUxFIDo9IHRydWUKKworTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKKyAgICBjdHN0ZXN0cnVubmVyLWF4dCBcCisgICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgXAorICAgIGFuZHJvaWR4LmxlZ2FjeV9sZWdhY3ktc3VwcG9ydC12NCBcCisgICAgbGVnYWN5LWFuZHJvaWQtdGVzdCBcCisgICAgYW5kcm9pZHgudGVzdC5ydWxlcyBcCisgICAgc3RhdHNkcHJvdG9saXRlCisKKyMgdGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCisKK2luY2x1ZGUgJChCVUlMRF9DVFNfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc3RhdHNkL2FwcHMvc3RhdHNkYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL3N0YXRzZC9hcHBzL3N0YXRzZGFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YWZhODgKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL3N0YXRzZC9hcHBzL3N0YXRzZGFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsOTAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgICAgcGFja2FnZT0iY29tLmFuZHJvaWQuc2VydmVyLmN0cy5kZXZpY2Uuc3RhdHNkIiA+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5BQ0NFU1NfTkVUV09SS19TVEFURSIvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX1dJRklfU1RBVEUiLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkFDQ0VTU19GSU5FX0xPQ0FUSU9OIi8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5CTFVFVE9PVEgiLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkJMVUVUT09USF9BRE1JTiIvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQ0FNRVJBIi8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5DSEFOR0VfV0lGSV9TVEFURSIvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQ0hBTkdFX1dJRklfTVVMVElDQVNUX1NUQVRFIi8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5JTlRFUk5FVCIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldBS0VfTE9DSyIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfU1lOQ19TVEFUUyIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX1NZTkNfU0VUVElOR1MiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5TWVNURU1fQUxFUlRfV0lORE9XIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uRFVNUCIgLz4gPCEtLSBtdXN0IGJlIGdyYW50ZWQgdmlhIHBtIGdyYW50IC0tPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uRk9SRUdST1VORF9TRVJWSUNFIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQ09ORklHVVJFX0RJU1BMQVlfQlJJR0hUTkVTUyIgLz4KKworICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2FwcF9uYW1lIj4KKyAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJvcmcuYXBhY2hlLmh0dHAubGVnYWN5IiBhbmRyb2lkOnJlcXVpcmVkPSJmYWxzZSIgLz4KKworICAgICAgICA8c2VydmljZSBhbmRyb2lkOm5hbWU9Ii5TdGF0c2RDdHNCYWNrZ3JvdW5kU2VydmljZSIgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIgLz4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLlN0YXRzZEN0c0ZvcmVncm91bmRBY3Rpdml0eSIgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIgLz4KKyAgICAgICAgPHNlcnZpY2UgYW5kcm9pZDpuYW1lPSIuU3RhdHNkQ3RzRm9yZWdyb3VuZFNlcnZpY2UiIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiIC8+CisKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICBhbmRyb2lkOm5hbWU9Ii5WaWRlb1BsYXllckFjdGl2aXR5IgorICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9hcHBfbmFtZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6cmVzaXplYWJsZUFjdGl2aXR5PSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpzdXBwb3J0c1BpY3R1cmVJblBpY3R1cmU9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmNvbmZpZ0NoYW5nZXM9InNjcmVlblNpemV8c21hbGxlc3RTY3JlZW5TaXplfHNjcmVlbkxheW91dHxvcmllbnRhdGlvbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF1bmNoTW9kZT0ic2luZ2xlVG9wIiA+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLkRhdmV5QWN0aXZpdHkiIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiIC8+CisKKyAgICAgICAgPHNlcnZpY2UgYW5kcm9pZDpuYW1lPSIuU3RhdHNkQXV0aGVudGljYXRvciIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9ImZhbHNlIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFjY291bnRzLkFjY291bnRBdXRoZW50aWNhdG9yIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorCisgICAgICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hY2NvdW50cy5BY2NvdW50QXV0aGVudGljYXRvciIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnJlc291cmNlPSJAeG1sL2F1dGhlbnRpY2F0b3IiIC8+CisgICAgICAgIDwvc2VydmljZT4KKyAgICAgICAgPHNlcnZpY2UgYW5kcm9pZDpuYW1lPSJTdGF0c2RTeW5jU2VydmljZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9ImZhbHNlIiA+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5jb250ZW50LlN5bmNBZGFwdGVyIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuY29udGVudC5TeW5jQWRhcHRlciIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnJlc291cmNlPSJAeG1sL3N5bmNhZGFwdGVyIiAvPgorICAgICAgICA8L3NlcnZpY2U+CisKKyAgICAgICAgPHByb3ZpZGVyIGFuZHJvaWQ6bmFtZT0iLlN0YXRzZFByb3ZpZGVyIgorICAgICAgICAgICAgYW5kcm9pZDphdXRob3JpdGllcz0iY29tLmFuZHJvaWQuc2VydmVyLmN0cy5kZXZpY2Uuc3RhdHNkLnByb3ZpZGVyIiAvPgorCisgICAgICAgIDxzZXJ2aWNlIGFuZHJvaWQ6bmFtZT0iLlN0YXRzZEpvYlNlcnZpY2UiCisgICAgICAgICAgICBhbmRyb2lkOnBlcm1pc3Npb249ImFuZHJvaWQucGVybWlzc2lvbi5CSU5EX0pPQl9TRVJWSUNFIiAvPgorICAgIDwvYXBwbGljYXRpb24+CisKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5zZXJ2ZXIuY3RzLmRldmljZS5zdGF0c2QiCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgdGVzdHMgb2YgYW5kcm9pZC5vcy5zdGF0c2Qgc3RhdHMgY29sbGVjdGlvbiI+CisgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJsaXN0ZW5lciIKKyAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZhbHVlPSJjb20uYW5kcm9pZC5jdHMucnVubmVyLkN0c1Rlc3RSdW5MaXN0ZW5lciIgLz4KKyAgICA8L2luc3RydW1lbnRhdGlvbj4vPgorPC9tYW5pZmVzdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3N0YXRzZC9hcHBzL3N0YXRzZGFwcC9yZXMvbGF5b3V0L2FjdGl2aXR5X2RhdmV5LnhtbCBiL2hvc3RzaWRldGVzdHMvc3RhdHNkL2FwcHMvc3RhdHNkYXBwL3Jlcy9sYXlvdXQvYWN0aXZpdHlfZGF2ZXkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNDM5MzEKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL3N0YXRzZC9hcHBzL3N0YXRzZGFwcC9yZXMvbGF5b3V0L2FjdGl2aXR5X2RhdmV5LnhtbApAQCAtMCwwICsxLDI3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczpjdXN0b209Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvY29tLmFuZHJvaWQuc2VydmVyLmN0cy5kZXZpY2Uuc3RhdHNkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgorICA8Y29tLmFuZHJvaWQuc2VydmVyLmN0cy5kZXZpY2Uuc3RhdHNkLkRhdmV5VmlldworICAgICAgYW5kcm9pZDppZD0iQCtpZC9kYXZleV92aWV3IgorICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgY3VzdG9tOmNhdXNlRGF2ZXk9ImZhbHNlIiAvPgorPC9MaW5lYXJMYXlvdXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zdGF0c2QvYXBwcy9zdGF0c2RhcHAvcmVzL2xheW91dC9hY3Rpdml0eV9tYWluLnhtbCBiL2hvc3RzaWRldGVzdHMvc3RhdHNkL2FwcHMvc3RhdHNkYXBwL3Jlcy9sYXlvdXQvYWN0aXZpdHlfbWFpbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAyOWM4MAotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvc3RhdHNkL2FwcHMvc3RhdHNkYXBwL3Jlcy9sYXlvdXQvYWN0aXZpdHlfbWFpbi54bWwKQEAgLTAsMCArMSwzMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPFJlbGF0aXZlTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+CisKKyAgICA8RnJhbWVMYXlvdXQKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC92aWRlb19mcmFtZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50Ij4KKworICAgICAgICA8VmlkZW9WaWV3CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3ZpZGVvX3BsYXllcl92aWV3IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCIgLz4KKyAgICA8L0ZyYW1lTGF5b3V0PgorPC9SZWxhdGl2ZUxheW91dD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3N0YXRzZC9hcHBzL3N0YXRzZGFwcC9yZXMvcmF3L2NvbG9yc192aWRlby5tcDQgYi9ob3N0c2lkZXRlc3RzL3N0YXRzZC9hcHBzL3N0YXRzZGFwcC9yZXMvcmF3L2NvbG9yc192aWRlby5tcDQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJlYzY3MAotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvc3RhdHNkL2FwcHMvc3RhdHNkYXBwL3Jlcy9yYXcvY29sb3JzX3ZpZGVvLm1wNApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3N0YXRzZC9hcHBzL3N0YXRzZGFwcC9yZXMvcmF3L2dvb2QubXAzIGIvaG9zdHNpZGV0ZXN0cy9zdGF0c2QvYXBwcy9zdGF0c2RhcHAvcmVzL3Jhdy9nb29kLm1wMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjBmNzcyCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9zdGF0c2QvYXBwcy9zdGF0c2RhcHAvcmVzL3Jhdy9nb29kLm1wMwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3N0YXRzZC9hcHBzL3N0YXRzZGFwcC9yZXMvdmFsdWVzL2F0dHJzLnhtbCBiL2hvc3RzaWRldGVzdHMvc3RhdHNkL2FwcHMvc3RhdHNkYXBwL3Jlcy92YWx1ZXMvYXR0cnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NjkxNDYKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL3N0YXRzZC9hcHBzL3N0YXRzZGFwcC9yZXMvdmFsdWVzL2F0dHJzLnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHJlc291cmNlcz4KKyAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IkRhdmV5VmlldyI+CisgICAgPGF0dHIgbmFtZT0iY2F1c2VEYXZleSIgZm9ybWF0PSJib29sZWFuIiAvPgorICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorPC9yZXNvdXJjZXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zdGF0c2QvYXBwcy9zdGF0c2RhcHAvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL2hvc3RzaWRldGVzdHMvc3RhdHNkL2FwcHMvc3RhdHNkYXBwL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQwZDJhYwotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvc3RhdHNkL2FwcHMvc3RhdHNkYXBwL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwyMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9ImFwcF9uYW1lIj5DVFMgU3RhdHNkIEF0b21zIEFwcDwvc3RyaW5nPgorPC9yZXNvdXJjZXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zdGF0c2QvYXBwcy9zdGF0c2RhcHAvcmVzL3htbC9hdXRoZW50aWNhdG9yLnhtbCBiL2hvc3RzaWRldGVzdHMvc3RhdHNkL2FwcHMvc3RhdHNkYXBwL3Jlcy94bWwvYXV0aGVudGljYXRvci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFjNzNkNwotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvc3RhdHNkL2FwcHMvc3RhdHNkYXBwL3Jlcy94bWwvYXV0aGVudGljYXRvci54bWwKQEAgLTAsMCArMSwxNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxhY2NvdW50LWF1dGhlbnRpY2F0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6YWNjb3VudFR5cGU9ImNvbS5hbmRyb2lkLmN0cy5zdGF0c2QiCisgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9hcHBfbmFtZSIgLz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3N0YXRzZC9hcHBzL3N0YXRzZGFwcC9yZXMveG1sL3N5bmNhZGFwdGVyLnhtbCBiL2hvc3RzaWRldGVzdHMvc3RhdHNkL2FwcHMvc3RhdHNkYXBwL3Jlcy94bWwvc3luY2FkYXB0ZXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4Y2I1MmUKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL3N0YXRzZC9hcHBzL3N0YXRzZGFwcC9yZXMveG1sL3N5bmNhZGFwdGVyLnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c3luYy1hZGFwdGVyIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmNvbnRlbnRBdXRob3JpdHk9ICJjb20uYW5kcm9pZC5zZXJ2ZXIuY3RzLmRldmljZS5zdGF0c2QucHJvdmlkZXIiCisgICAgYW5kcm9pZDphY2NvdW50VHlwZT0iY29tLmFuZHJvaWQuY3RzLnN0YXRzZCIKKy8+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zdGF0c2QvYXBwcy9zdGF0c2RhcHAvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvZGV2aWNlL3N0YXRzZC9BdG9tVGVzdHMuamF2YSBiL2hvc3RzaWRldGVzdHMvc3RhdHNkL2FwcHMvc3RhdHNkYXBwL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY3RzL2RldmljZS9zdGF0c2QvQXRvbVRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVmYTBmNQotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvc3RhdHNkL2FwcHMvc3RhdHNkYXBwL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY3RzL2RldmljZS9zdGF0c2QvQXRvbVRlc3RzLmphdmEKQEAgLTAsMCArMSw0NzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlci5jdHMuZGV2aWNlLnN0YXRzZDsKKworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlN5c3RlbVV0aWwucnVuU2hlbGxDb21tYW5kOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGFuZHJvaWQuYWNjb3VudHMuQWNjb3VudDsKK2ltcG9ydCBhbmRyb2lkLmFjY291bnRzLkFjY291bnRNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuYXBwLkFsYXJtTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OworaW1wb3J0IGFuZHJvaWQuYXBwLmpvYi5Kb2JJbmZvOworaW1wb3J0IGFuZHJvaWQuYXBwLmpvYi5Kb2JTY2hlZHVsZXI7CitpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5sZS5CbHVldG9vdGhMZVNjYW5uZXI7CitpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGgubGUuU2NhbkNhbGxiYWNrOworaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLmxlLlNjYW5GaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGgubGUuU2NhblJlc3VsdDsKK2ltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5sZS5TY2FuU2V0dGluZ3M7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYW1lcmFDaGFyYWN0ZXJpc3RpY3M7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYURldmljZTsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FtZXJhTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uOworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uTG9jYXRpb25MaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyOworaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Rhc2s7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlclRocmVhZDsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlBvd2VyTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCitwdWJsaWMgY2xhc3MgQXRvbVRlc3RzIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gQXRvbVRlc3RzLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEF1ZGlvU3RhdGUoKSB7CisgICAgICAgIC8vIFRPRE86IFRoaXMgc2hvdWxkIHN1cmVseSBiZSBnZXRUYXJnZXRDb250ZXh0KCksIGhlcmUgYW5kIGV2ZXJ5d2hlcmUsIGJ1dCB0ZXN0IGZpcnN0LgorICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCk7CisgICAgICAgIE1lZGlhUGxheWVyIG1lZGlhUGxheWVyID0gTWVkaWFQbGF5ZXIuY3JlYXRlKGNvbnRleHQsIFIucmF3Lmdvb2QpOworICAgICAgICBtZWRpYVBsYXllci5zdGFydCgpOworICAgICAgICBzbGVlcCgyXzAwMCk7CisgICAgICAgIG1lZGlhUGxheWVyLnN0b3AoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCbGVTY2FuT3Bwb3J0dW5pc3RpYygpIHsKKyAgICAgICAgU2NhblNldHRpbmdzIHNjYW5TZXR0aW5ncyA9IG5ldyBTY2FuU2V0dGluZ3MuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldFNjYW5Nb2RlKFNjYW5TZXR0aW5ncy5TQ0FOX01PREVfT1BQT1JUVU5JU1RJQykuYnVpbGQoKTsKKyAgICAgICAgcGVyZm9ybUJsZVNjYW4oc2NhblNldHRpbmdzLCBudWxsLGZhbHNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCbGVTY2FuVW5vcHRpbWl6ZWQoKSB7CisgICAgICAgIFNjYW5TZXR0aW5ncyBzY2FuU2V0dGluZ3MgPSBuZXcgU2NhblNldHRpbmdzLkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRTY2FuTW9kZShTY2FuU2V0dGluZ3MuU0NBTl9NT0RFX0xPV19MQVRFTkNZKS5idWlsZCgpOworICAgICAgICBwZXJmb3JtQmxlU2NhbihzY2FuU2V0dGluZ3MsIG51bGwsIGZhbHNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCbGVTY2FuUmVzdWx0KCkgeworICAgICAgICBTY2FuU2V0dGluZ3Mgc2NhblNldHRpbmdzID0gbmV3IFNjYW5TZXR0aW5ncy5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0U2Nhbk1vZGUoU2NhblNldHRpbmdzLlNDQU5fTU9ERV9MT1dfTEFURU5DWSkuYnVpbGQoKTsKKyAgICAgICAgU2NhbkZpbHRlci5CdWlsZGVyIHNjYW5GaWx0ZXIgPSBuZXcgU2NhbkZpbHRlci5CdWlsZGVyKCk7CisgICAgICAgIHBlcmZvcm1CbGVTY2FuKHNjYW5TZXR0aW5ncywgQXJyYXlzLmFzTGlzdChzY2FuRmlsdGVyLmJ1aWxkKCkpLCB0cnVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHBlcmZvcm1CbGVTY2FuKFNjYW5TZXR0aW5ncyBzY2FuU2V0dGluZ3MsIExpc3Q8U2NhbkZpbHRlcj4gc2NhbkZpbHRlcnMsIGJvb2xlYW4gd2FpdEZvclJlc3VsdCkgeworICAgICAgICBCbHVldG9vdGhBZGFwdGVyIGJsdWV0b290aEFkYXB0ZXIgPSBCbHVldG9vdGhBZGFwdGVyLmdldERlZmF1bHRBZGFwdGVyKCk7CisgICAgICAgIGlmIChibHVldG9vdGhBZGFwdGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkRldmljZSBkb2VzIG5vdCBzdXBwb3J0IEJsdWV0b290aCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gYmx1ZXRvb3RoRW5hYmxlZEJ5VGVzdCA9IGZhbHNlOworICAgICAgICBpZiAoIWJsdWV0b290aEFkYXB0ZXIuaXNFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGlmICghYmx1ZXRvb3RoQWRhcHRlci5lbmFibGUoKSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkJsdWV0b290aCBpcyBub3QgZW5hYmxlZCIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNsZWVwKDhfMDAwKTsKKyAgICAgICAgICAgIGJsdWV0b290aEVuYWJsZWRCeVRlc3QgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIEJsdWV0b290aExlU2Nhbm5lciBibGVTY2FubmVyID0gYmx1ZXRvb3RoQWRhcHRlci5nZXRCbHVldG9vdGhMZVNjYW5uZXIoKTsKKyAgICAgICAgaWYgKGJsZVNjYW5uZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ2Fubm90IGFjY2VzcyBCTEUgc2Nhbm5lciIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgQ291bnREb3duTGF0Y2ggcmVzdWx0c0xhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworICAgICAgICBTY2FuQ2FsbGJhY2sgc2NhbkNhbGxiYWNrID0gbmV3IFNjYW5DYWxsYmFjaygpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25TY2FuUmVzdWx0KGludCBjYWxsYmFja1R5cGUsIFNjYW5SZXN1bHQgcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiY2FsbGVkIG9uU2NhblJlc3VsdCIpOworICAgICAgICAgICAgICAgIHJlc3VsdHNMYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25TY2FuRmFpbGVkKGludCBlcnJvckNvZGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudihUQUcsICJjYWxsZWQgb25TY2FuRmFpbGVkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQmF0Y2hTY2FuUmVzdWx0cyhMaXN0PFNjYW5SZXN1bHQ+IHJlc3VsdHMpIHsKKyAgICAgICAgICAgICAgICBMb2cudihUQUcsICJjYWxsZWQgb25CYXRjaFNjYW5SZXN1bHRzIik7CisgICAgICAgICAgICAgICAgcmVzdWx0c0xhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIGJsZVNjYW5uZXIuc3RhcnRTY2FuKHNjYW5GaWx0ZXJzLCBzY2FuU2V0dGluZ3MsIHNjYW5DYWxsYmFjayk7CisgICAgICAgIGlmICh3YWl0Rm9yUmVzdWx0KSB7CisgICAgICAgICAgICB3YWl0Rm9yUmVjZWl2ZXIoSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpLCA1OV8wMDAsIHJlc3VsdHNMYXRjaCwgbnVsbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzbGVlcCgyXzAwMCk7CisgICAgICAgIH0KKyAgICAgICAgYmxlU2Nhbm5lci5zdG9wU2NhbihzY2FuQ2FsbGJhY2spOworCisgICAgICAgIC8vIFJlc3RvcmUgYWRhcHRlciBzdGF0ZSBhdCBlbmQgb2YgdGVzdAorICAgICAgICBpZiAoYmx1ZXRvb3RoRW5hYmxlZEJ5VGVzdCkgeworICAgICAgICAgICAgYmx1ZXRvb3RoQWRhcHRlci5kaXNhYmxlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDYW1lcmFTdGF0ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCk7CisgICAgICAgIENhbWVyYU1hbmFnZXIgY2FtID0gY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENhbWVyYU1hbmFnZXIuY2xhc3MpOworICAgICAgICBTdHJpbmdbXSBjYW1lcmFJZHMgPSBjYW0uZ2V0Q2FtZXJhSWRMaXN0KCk7CisgICAgICAgIGlmIChjYW1lcmFJZHMubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIk5vIGNhbWVyYSBmb3VuZCBvbiBkZXZpY2UiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIENvdW50RG93bkxhdGNoIGxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworICAgICAgICBmaW5hbCBDYW1lcmFEZXZpY2UuU3RhdGVDYWxsYmFjayBjYiA9IG5ldyBDYW1lcmFEZXZpY2UuU3RhdGVDYWxsYmFjaygpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25PcGVuZWQoQ2FtZXJhRGV2aWNlIGNkKSB7CisgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiQ2FtZXJhRGV2aWNlICIgKyBjZC5nZXRJZCgpICsgIiBvcGVuZWQiKTsKKyAgICAgICAgICAgICAgICBzbGVlcCgyXzAwMCk7CisgICAgICAgICAgICAgICAgY2QuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbG9zZWQoQ2FtZXJhRGV2aWNlIGNkKSB7CisgICAgICAgICAgICAgICAgbGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiQ2FtZXJhRGV2aWNlICIgKyBjZC5nZXRJZCgpICsgIiBjbG9zZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25EaXNjb25uZWN0ZWQoQ2FtZXJhRGV2aWNlIGNkKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2FtZXJhRGV2aWNlICAiICsgY2QuZ2V0SWQoKSArICIgZGlzY29ubmVjdGVkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoQ2FtZXJhRGV2aWNlIGNkLCBpbnQgZXJyb3IpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJDYW1lcmFEZXZpY2UgIiArIGNkLmdldElkKCkgKyAiaGFkIGVycm9yICIgKyBlcnJvcik7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgSGFuZGxlclRocmVhZCBoYW5kbGVyVGhyZWFkID0gbmV3IEhhbmRsZXJUaHJlYWQoImJyX2hhbmRsZXJfdGhyZWFkIik7CisgICAgICAgIGhhbmRsZXJUaHJlYWQuc3RhcnQoKTsKKyAgICAgICAgTG9vcGVyIGxvb3BlciA9IGhhbmRsZXJUaHJlYWQuZ2V0TG9vcGVyKCk7CisgICAgICAgIEhhbmRsZXIgaGFuZGxlciA9IG5ldyBIYW5kbGVyKGxvb3Blcik7CisKKyAgICAgICAgY2FtLm9wZW5DYW1lcmEoY2FtZXJhSWRzWzBdLCBjYiwgaGFuZGxlcik7CisgICAgICAgIHdhaXRGb3JSZWNlaXZlcihjb250ZXh0LCAxMF8wMDAsIGxhdGNoLCBudWxsKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGbGFzaGxpZ2h0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENvbnRleHQgY29udGV4dCA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKTsKKyAgICAgICAgQ2FtZXJhTWFuYWdlciBjYW0gPSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ2FtZXJhTWFuYWdlci5jbGFzcyk7CisgICAgICAgIFN0cmluZ1tdIGNhbWVyYUlkcyA9IGNhbS5nZXRDYW1lcmFJZExpc3QoKTsKKyAgICAgICAgYm9vbGVhbiBmb3VuZEZsYXNoID0gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FtZXJhSWRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgaWQgPSBjYW1lcmFJZHNbaV07CisgICAgICAgICAgICBpZihjYW0uZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGlkKS5nZXQoQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLkZMQVNIX0lORk9fQVZBSUxBQkxFKSkgeworICAgICAgICAgICAgICAgIGNhbS5zZXRUb3JjaE1vZGUoaWQsIHRydWUpOworICAgICAgICAgICAgICAgIHNsZWVwKDUwMCk7CisgICAgICAgICAgICAgICAgY2FtLnNldFRvcmNoTW9kZShpZCwgZmFsc2UpOworICAgICAgICAgICAgICAgIGZvdW5kRmxhc2ggPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmKCFmb3VuZEZsYXNoKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJObyBmbGFzaGxpZ2h0IGZvdW5kIG9uIGRldmljZSIpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9yZWdyb3VuZFNlcnZpY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpOworICAgICAgICAvLyBUaGUgc2VydmljZSBnb2VzIGludG8gZm9yZWdyb3VuZCBhbmQgZXhpdHMgc2hvcnRseQorICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChjb250ZXh0LCBTdGF0c2RDdHNGb3JlZ3JvdW5kU2VydmljZS5jbGFzcyk7CisgICAgICAgIGNvbnRleHQuc3RhcnRTZXJ2aWNlKGludGVudCk7CisgICAgICAgIHNsZWVwKDUwMCk7CisgICAgICAgIGNvbnRleHQuc3RvcFNlcnZpY2UoaW50ZW50KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHcHNTY2FuKCkgeworICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCk7CisgICAgICAgIGZpbmFsIExvY2F0aW9uTWFuYWdlciBsb2NNYW5hZ2VyID0gY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKExvY2F0aW9uTWFuYWdlci5jbGFzcyk7CisgICAgICAgIGlmICghbG9jTWFuYWdlci5pc1Byb3ZpZGVyRW5hYmxlZChMb2NhdGlvbk1hbmFnZXIuR1BTX1BST1ZJREVSKSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiR1BTIHByb3ZpZGVyIGlzIG5vdCBlbmFibGVkIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisKKyAgICAgICAgZmluYWwgTG9jYXRpb25MaXN0ZW5lciBsb2NMaXN0ZW5lciA9IG5ldyBMb2NhdGlvbkxpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25Mb2NhdGlvbkNoYW5nZWQoTG9jYXRpb24gbG9jYXRpb24pIHsKKyAgICAgICAgICAgICAgICBMb2cudihUQUcsICJvbkxvY2F0aW9uQ2hhbmdlZDogbG9jYXRpb24gaGFzIGJlZW4gb2J0YWluZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvdmlkZXJEaXNhYmxlZChTdHJpbmcgcHJvdmlkZXIpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJvblByb3ZpZGVyRGlzYWJsZWQgIiArIHByb3ZpZGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvdmlkZXJFbmFibGVkKFN0cmluZyBwcm92aWRlcikgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIm9uUHJvdmlkZXJFbmFibGVkICIgKyBwcm92aWRlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXR1c0NoYW5nZWQoU3RyaW5nIHByb3ZpZGVyLCBpbnQgc3RhdHVzLCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAib25TdGF0dXNDaGFuZ2VkICIgKyBwcm92aWRlciArICIgIiArIHN0YXR1cyk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgbmV3IEFzeW5jVGFzazxWb2lkLCBWb2lkLCBWb2lkPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIFZvaWQgZG9JbkJhY2tncm91bmQoVm9pZC4uLiBwYXJhbXMpIHsKKyAgICAgICAgICAgICAgICBMb29wZXIucHJlcGFyZSgpOworICAgICAgICAgICAgICAgIGxvY01hbmFnZXIucmVxdWVzdExvY2F0aW9uVXBkYXRlcyhMb2NhdGlvbk1hbmFnZXIuR1BTX1BST1ZJREVSLCA5OTAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBsb2NMaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgc2xlZXAoMV8wMDApOworICAgICAgICAgICAgICAgIGxvY01hbmFnZXIucmVtb3ZlVXBkYXRlcyhsb2NMaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgbGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0uZXhlY3V0ZSgpOworCisgICAgICAgIHdhaXRGb3JSZWNlaXZlcihjb250ZXh0LCA1OV8wMDAsIGxhdGNoLCBudWxsKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTY3JlZW5CcmlnaHRuZXNzKCkgeworICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCk7CisgICAgICAgIFBvd2VyTWFuYWdlciBwbSA9IGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShQb3dlck1hbmFnZXIuY2xhc3MpOworICAgICAgICBQb3dlck1hbmFnZXIuV2FrZUxvY2sgd2wgPSBwbS5uZXdXYWtlTG9jayhQb3dlck1hbmFnZXIuU0NSRUVOX0JSSUdIVF9XQUtFX0xPQ0sgfAorICAgICAgICAgICAgICAgIFBvd2VyTWFuYWdlci5BQ1FVSVJFX0NBVVNFU19XQUtFVVAsICJTdGF0c2RCcmlnaHRuZXNzVGVzdCIpOworICAgICAgICB3bC5hY3F1aXJlKCk7CisgICAgICAgIHNsZWVwKDUwMCk7CisKKyAgICAgICAgc2V0U2NyZWVuQnJpZ2h0bmVzcyg0Nyk7CisgICAgICAgIHNsZWVwKDUwMCk7CisgICAgICAgIHNldFNjcmVlbkJyaWdodG5lc3MoMTAwKTsKKyAgICAgICAgc2xlZXAoNTAwKTsKKyAgICAgICAgc2V0U2NyZWVuQnJpZ2h0bmVzcygxOTgpOworICAgICAgICBzbGVlcCg1MDApOworCisKKyAgICAgICAgd2wucmVsZWFzZSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN5bmNTdGF0ZSgpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIENvbnRleHQgY29udGV4dCA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKTsKKyAgICAgICAgU3RhdHNkQXV0aGVudGljYXRvci5yZW1vdmVBbGxBY2NvdW50cyhjb250ZXh0KTsKKyAgICAgICAgQWNjb3VudE1hbmFnZXIgYW0gPSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQWNjb3VudE1hbmFnZXIuY2xhc3MpOworICAgICAgICBDb3VudERvd25MYXRjaCBsYXRjaCA9IFN0YXRzZFN5bmNBZGFwdGVyLnJlc2V0Q291bnREb3duTGF0Y2goKTsKKworICAgICAgICBBY2NvdW50IGFjY291bnQgPSBTdGF0c2RBdXRoZW50aWNhdG9yLmdldFRlc3RBY2NvdW50KCk7CisgICAgICAgIFN0YXRzZEF1dGhlbnRpY2F0b3IuZW5zdXJlVGVzdEFjY291bnQoY29udGV4dCk7CisgICAgICAgIHNsZWVwKDUwMCk7CisKKyAgICAgICAgLy8gSnVzdCBmb3JjZSBzZXQgaXMgc3luY2FibGUuCisgICAgICAgIENvbnRlbnRSZXNvbHZlci5zZXRNYXN0ZXJTeW5jQXV0b21hdGljYWxseSh0cnVlKTsKKyAgICAgICAgc2xlZXAoNTAwKTsKKyAgICAgICAgQ29udGVudFJlc29sdmVyLnNldElzU3luY2FibGUoYWNjb3VudCwgU3RhdHNkUHJvdmlkZXIuQVVUSE9SSVRZLCAxKTsKKyAgICAgICAgLy8gV2FpdCBmb3IgdGhlIGZpcnN0IChhdXRvbWF0aWMpIHN5bmMgdG8gZmluaXNoCisgICAgICAgIHdhaXRGb3JSZWNlaXZlcihjb250ZXh0LCAxMjBfMDAwLCBsYXRjaCwgbnVsbCk7CisKKyAgICAgICAgLy9TbGVlcCBmb3IgNTAwbXMsIHNpbmNlIHdlIGFzc2VydCBlYWNoIHN0YXJ0L3N0b3AgdG8gYmUgfjUwMG1zIGFwYXJ0LgorICAgICAgICBzbGVlcCg1MDApOworCisgICAgICAgIC8vIFJlcXVlc3QgYW5kIHdhaXQgZm9yIHRoZSBzZWNvbmQgc3luYyB0byBmaW5pc2gKKyAgICAgICAgbGF0Y2ggPSBTdGF0c2RTeW5jQWRhcHRlci5yZXNldENvdW50RG93bkxhdGNoKCk7CisgICAgICAgIFN0YXRzZFN5bmNBZGFwdGVyLnJlcXVlc3RTeW5jKGFjY291bnQpOworICAgICAgICB3YWl0Rm9yUmVjZWl2ZXIoY29udGV4dCwgMTIwXzAwMCwgbGF0Y2gsIG51bGwpOworICAgICAgICBTdGF0c2RBdXRoZW50aWNhdG9yLnJlbW92ZUFsbEFjY291bnRzKGNvbnRleHQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNjaGVkdWxlZEpvYigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBDb21wb25lbnROYW1lIG5hbWUgPSBuZXcgQ29tcG9uZW50TmFtZSgiY29tLmFuZHJvaWQuc2VydmVyLmN0cy5kZXZpY2Uuc3RhdHNkIiwKKyAgICAgICAgICAgICAgICBTdGF0c2RKb2JTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpOworICAgICAgICBKb2JTY2hlZHVsZXIganMgPSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoSm9iU2NoZWR1bGVyLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiSm9iU2NoZWR1bGVyIHNlcnZpY2Ugbm90IGF2YWlsYWJsZSIsIGpzICE9IG51bGwpOworCisgICAgICAgIEpvYkluZm8uQnVpbGRlciBidWlsZGVyID0gbmV3IEpvYkluZm8uQnVpbGRlcigxLCBuYW1lKTsKKyAgICAgICAgYnVpbGRlci5zZXRPdmVycmlkZURlYWRsaW5lKDApOworICAgICAgICBKb2JJbmZvIGpvYiA9IGJ1aWxkZXIuYnVpbGQoKTsKKworICAgICAgICBsb25nIHN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBDb3VudERvd25MYXRjaCBsYXRjaCA9IFN0YXRzZEpvYlNlcnZpY2UucmVzZXRDb3VudERvd25MYXRjaCgpOworICAgICAgICBqcy5zY2hlZHVsZShqb2IpOworICAgICAgICB3YWl0Rm9yUmVjZWl2ZXIoY29udGV4dCwgMl81MDAsIGxhdGNoLCBudWxsKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXYWtlbG9ja1N0YXRlKCkgeworICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCk7CisgICAgICAgIFBvd2VyTWFuYWdlciBwbSA9IGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShQb3dlck1hbmFnZXIuY2xhc3MpOworICAgICAgICBQb3dlck1hbmFnZXIuV2FrZUxvY2sgd2wgPSBwbS5uZXdXYWtlTG9jayhQb3dlck1hbmFnZXIuUEFSVElBTF9XQUtFX0xPQ0ssCisgICAgICAgICAgICAgICAgIlN0YXRzZFBhcnRpYWxXYWtlbG9jayIpOworICAgICAgICB3bC5hY3F1aXJlKCk7CisgICAgICAgIHNsZWVwKDUwMCk7CisgICAgICAgIHdsLnJlbGVhc2UoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXYWtlbG9ja0xvYWQoKSB7CisgICAgICAgIGZpbmFsIGludCBOVU1fVEhSRUFEUyA9IDE2OworICAgICAgICBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaChOVU1fVEhSRUFEUyk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1RIUkVBRFM7IGkrKykgeworICAgICAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBXYWtlbG9ja0xvYWRUZXN0UnVubmFibGUoIlN0YXRzZFBhcnRpYWxXYWtlbG9jayIgKyBpLCBsYXRjaCkpOworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICB9CisgICAgICAgIHdhaXRGb3JSZWNlaXZlcihudWxsLCAxMjBfMDAwLCBsYXRjaCwgbnVsbCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2FrZXVwQWxhcm0oKSB7CisgICAgICAgIENvbnRleHQgY29udGV4dCA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKTsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSAiYW5kcm9pZC5jdHMuc3RhdHNkLnRlc3RXYWtldXBBbGFybSI7CisgICAgICAgIENvdW50RG93bkxhdGNoIG9uUmVjZWl2ZUxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworICAgICAgICBCcm9hZGNhc3RSZWNlaXZlciByZWNlaXZlciA9CisgICAgICAgICAgICAgICAgcmVnaXN0ZXJSZWNlaXZlcihjb250ZXh0LCBvblJlY2VpdmVMYXRjaCwgbmV3IEludGVudEZpbHRlcihuYW1lKSk7CisgICAgICAgIEFsYXJtTWFuYWdlciBtYW5hZ2VyID0gKEFsYXJtTWFuYWdlcikgKGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShBbGFybU1hbmFnZXIuY2xhc3MpKTsKKyAgICAgICAgUGVuZGluZ0ludGVudCBwaW50ZW50ID0gUGVuZGluZ0ludGVudC5nZXRCcm9hZGNhc3QoY29udGV4dCwgMCwgbmV3IEludGVudChuYW1lKSwgMCk7CisgICAgICAgIG1hbmFnZXIuc2V0RXhhY3QoQWxhcm1NYW5hZ2VyLkVMQVBTRURfUkVBTFRJTUVfV0FLRVVQLAorICAgICAgICAgICAgU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCkgKyAyXzAwMCwgcGludGVudCk7CisgICAgICAgIHdhaXRGb3JSZWNlaXZlcihjb250ZXh0LCAxMF8wMDAsIG9uUmVjZWl2ZUxhdGNoLCByZWNlaXZlcik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2lmaUxvY2soKSB7CisgICAgICAgIENvbnRleHQgY29udGV4dCA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKTsKKyAgICAgICAgV2lmaU1hbmFnZXIgd20gPSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoV2lmaU1hbmFnZXIuY2xhc3MpOworICAgICAgICBXaWZpTWFuYWdlci5XaWZpTG9jayBsb2NrID0gd20uY3JlYXRlV2lmaUxvY2soIlN0YXRzZENUU1dpZmlMb2NrIik7CisgICAgICAgIGxvY2suYWNxdWlyZSgpOworICAgICAgICBzbGVlcCg1MDApOworICAgICAgICBsb2NrLnJlbGVhc2UoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXaWZpTXVsdGljYXN0TG9jaygpIHsKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpOworICAgICAgICBXaWZpTWFuYWdlciB3bSA9IGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShXaWZpTWFuYWdlci5jbGFzcyk7CisgICAgICAgIFdpZmlNYW5hZ2VyLk11bHRpY2FzdExvY2sgbG9jayA9IHdtLmNyZWF0ZU11bHRpY2FzdExvY2soIlN0YXRzZENUU011bHRpY2FzdExvY2siKTsKKyAgICAgICAgbG9jay5hY3F1aXJlKCk7CisgICAgICAgIHNsZWVwKDUwMCk7CisgICAgICAgIGxvY2sucmVsZWFzZSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgLyoqIERvZXMgdHdvIHdpZmkgc2NhbnMuICovCisgICAgLy8gVE9ETzogQ29waWVkIHRoaXMgZnJvbSBCYXR0ZXJ5c3RhdHNWYWxpZGF0aW9uIGJ1dCB3ZSBwcm9iYWJseSBkb24ndCBuZWVkIHRvIHdhaXQgZm9yIHJlc3VsdHMuCisgICAgcHVibGljIHZvaWQgdGVzdFdpZmlTY2FuKCkgeworICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCk7CisgICAgICAgIEludGVudEZpbHRlciBpbnRlbnRGaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKFdpZmlNYW5hZ2VyLlNDQU5fUkVTVUxUU19BVkFJTEFCTEVfQUNUSU9OKTsKKyAgICAgICAgLy8gU29tZXRpbWVzIGEgc2NhbiB3YXMgYWxyZWFkeSBydW5uaW5nIChmcm9tIGEgZGlmZmVyZW50IHVpZCksIHNvIHRoZSBmaXJzdCBzY2FuIGRvZXNuJ3QKKyAgICAgICAgLy8gc3RhcnQgd2hlbiByZXF1ZXN0ZWQuIFRoZXJlZm9yZSwgYWRkaXRpb25hbGx5IHdhaXQgZm9yIHdoYXRldmVyIHNjYW4gaXMgY3VycmVudGx5IHJ1bm5pbmcKKyAgICAgICAgLy8gdG8gZmluaXNoLCB0aGVuIHJlcXVlc3QgYSBzY2FuIGFnYWluIC0gYXQgbGVhc3Qgb25lIG9mIHRoZXNlIHR3byBzY2FucyBzaG91bGQgYmUKKyAgICAgICAgLy8gYXR0cmlidXRlZCB0byB0aGlzIGFwcC4KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgICAgIENvdW50RG93bkxhdGNoIG9uUmVjZWl2ZUxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworICAgICAgICAgICAgQnJvYWRjYXN0UmVjZWl2ZXIgcmVjZWl2ZXIgPSByZWdpc3RlclJlY2VpdmVyKGNvbnRleHQsIG9uUmVjZWl2ZUxhdGNoLCBpbnRlbnRGaWx0ZXIpOworICAgICAgICAgICAgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKFdpZmlNYW5hZ2VyLmNsYXNzKS5zdGFydFNjYW4oKTsKKyAgICAgICAgICAgIHdhaXRGb3JSZWNlaXZlcihjb250ZXh0LCA2MF8wMDAsIG9uUmVjZWl2ZUxhdGNoLCByZWNlaXZlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVDcHUoKSB7CisgICAgICAgIGxvbmcgdGltZXN0YW1wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDA7IGkgKyspIHsKKyAgICAgICAgICAgIHRpbWVzdGFtcCArPSBpOworICAgICAgICB9CisgICAgICAgIExvZy5pKFRBRywgIlRoZSBhbnN3ZXIgaXMgIiArIHRpbWVzdGFtcCk7CisgICAgfQorCisgICAgLy8gLS0tLS0tLSBIZWxwZXIgbWV0aG9kcworCisgICAgLyoqIFB1dHMgdGhlIGN1cnJlbnQgdGhyZWFkIHRvIHNsZWVwLiAqLworICAgIHN0YXRpYyB2b2lkIHNsZWVwKGludCBtaWxsaXMpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChtaWxsaXMpOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJJbnRlcnJ1cHRlZCBleGNlcHRpb24gd2hpbGUgc2xlZXBpbmciLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBSZWdpc3RlciByZWNlaXZlciB0byBkZXRlcm1pbmUgd2hlbiBnaXZlbiBhY3Rpb24gaXMgY29tcGxldGUuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQnJvYWRjYXN0UmVjZWl2ZXIgcmVnaXN0ZXJSZWNlaXZlcigKKyAgICAgICAgICAgIENvbnRleHQgY3R4LCBDb3VudERvd25MYXRjaCBvblJlY2VpdmVMYXRjaCwgSW50ZW50RmlsdGVyIGludGVudEZpbHRlcikgeworICAgICAgICBCcm9hZGNhc3RSZWNlaXZlciByZWNlaXZlciA9IG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJlY2VpdmVkIGJyb2FkY2FzdC4iKTsKKyAgICAgICAgICAgICAgICBvblJlY2VpdmVMYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgLy8gUnVuIEJyb2FkY2FzdCByZWNlaXZlciBpbiBhIGRpZmZlcmVudCB0aHJlYWQgc2luY2UgdGhlIG1haW4gdGhyZWFkIHdpbGwgd2FpdC4KKyAgICAgICAgSGFuZGxlclRocmVhZCBoYW5kbGVyVGhyZWFkID0gbmV3IEhhbmRsZXJUaHJlYWQoImJyX2hhbmRsZXJfdGhyZWFkIik7CisgICAgICAgIGhhbmRsZXJUaHJlYWQuc3RhcnQoKTsKKyAgICAgICAgTG9vcGVyIGxvb3BlciA9IGhhbmRsZXJUaHJlYWQuZ2V0TG9vcGVyKCk7CisgICAgICAgIEhhbmRsZXIgaGFuZGxlciA9IG5ldyBIYW5kbGVyKGxvb3Blcik7CisgICAgICAgIGN0eC5yZWdpc3RlclJlY2VpdmVyKHJlY2VpdmVyLCBpbnRlbnRGaWx0ZXIsIG51bGwsIGhhbmRsZXIpOworICAgICAgICByZXR1cm4gcmVjZWl2ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlcyB0aGUgcmVjZWl2ZXIgdG8gd2FpdCB1bnRpbCB0aGUgYWN0aW9uIGlzIGNvbXBsZXRlLiBjdHggYW5kIHJlY2VpdmVyIG1heSBiZSBudWxsIGlmIG5vCisgICAgICogcmVjZWl2ZXIgaXMgbmVlZGVkIHRvIGJlIHVucmVnaXN0ZXJlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHdhaXRGb3JSZWNlaXZlcihDb250ZXh0IGN0eCwKKyAgICAgICAgICAgIGludCBtYXhXYWl0VGltZU1zLCBDb3VudERvd25MYXRjaCBsYXRjaCwgQnJvYWRjYXN0UmVjZWl2ZXIgcmVjZWl2ZXIpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJvb2xlYW4gZGlkRmluaXNoID0gbGF0Y2guYXdhaXQobWF4V2FpdFRpbWVNcywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgIGlmIChkaWRGaW5pc2gpIHsKKyAgICAgICAgICAgICAgICBMb2cudihUQUcsICJGaW5pc2hlZCBwZXJmb3JtaW5nIGFjdGlvbiIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIG5vdCBuZWNlc3NhcmlseSBhIHByb2JsZW0uIElmIHdlIGp1c3Qgd2FudCB0byBtYWtlIHN1cmUgYSBjb3VudCB3YXMKKyAgICAgICAgICAgICAgICAvLyByZWNvcmRlZCBmb3IgdGhlIHJlcXVlc3QsIGl0IGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSBhY3Rpb24gYWN0dWFsbHkgZmluaXNoZWQuCisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRGlkIG5vdCBmaW5pc2ggaW4gc3BlY2lmaWVkIHRpbWUuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkludGVycnVwdGVkIGV4Y2VwdGlvbiB3aGlsZSBhd2FpdGluZyBhY3Rpb24gdG8gZmluaXNoIiwgZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGN0eCAhPSBudWxsICYmIHJlY2VpdmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGN0eC51bnJlZ2lzdGVyUmVjZWl2ZXIocmVjZWl2ZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRTY3JlZW5CcmlnaHRuZXNzKGludCBicmlnaHRuZXNzKSB7CisgICAgICAgIHJ1blNoZWxsQ29tbWFuZCgic2V0dGluZ3MgcHV0IHN5c3RlbSBzY3JlZW5fYnJpZ2h0bmVzcyAiICsgYnJpZ2h0bmVzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zdGF0c2QvYXBwcy9zdGF0c2RhcHAvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvZGV2aWNlL3N0YXRzZC9DaGVja2Vycy5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zdGF0c2QvYXBwcy9zdGF0c2RhcHAvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvZGV2aWNlL3N0YXRzZC9DaGVja2Vycy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYWY5MmUKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL3N0YXRzZC9hcHBzL3N0YXRzZGFwcC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9kZXZpY2Uvc3RhdHNkL0NoZWNrZXJzLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyLmN0cy5kZXZpY2Uuc3RhdHNkOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXI7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogTWV0aG9kcyB0byBjaGVjayBkZXZpY2UgcHJvcGVydGllcy4gVGhleSBwYXNzIGlmZiB0aGUgY2hlY2sgcmV0dXJucyB0cnVlLgorICovCitwdWJsaWMgY2xhc3MgQ2hlY2tlcnMgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBDaGVja2Vycy5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGNoZWNrV2lmaUVuaGFuY2VkUG93ZXJSZXBvcnRpbmdTdXBwb3J0ZWQoKSB7CisgICAgICAgIFdpZmlNYW5hZ2VyIHdtID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoV2lmaU1hbmFnZXIuY2xhc3MpOworICAgICAgICBhc3NlcnRUcnVlKHdtLmlzRW5oYW5jZWRQb3dlclJlcG9ydGluZ1N1cHBvcnRlZCgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3N0YXRzZC9hcHBzL3N0YXRzZGFwcC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9kZXZpY2Uvc3RhdHNkL0RhdmV5QWN0aXZpdHkuamF2YSBiL2hvc3RzaWRldGVzdHMvc3RhdHNkL2FwcHMvc3RhdHNkYXBwL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY3RzL2RldmljZS9zdGF0c2QvRGF2ZXlBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZWM3ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL3N0YXRzZC9hcHBzL3N0YXRzZGFwcC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9kZXZpY2Uvc3RhdHNkL0RhdmV5QWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXIuY3RzLmRldmljZS5zdGF0c2Q7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlZpZGVvVmlldzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKK3B1YmxpYyBjbGFzcyBEYXZleUFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAic3RhdHNkRGF2ZXlBY3Rpdml0eSI7CisKKyAgICAvKiogQ2FsbGVkIHdoZW4gdGhlIGFjdGl2aXR5IGlzIGZpcnN0IGNyZWF0ZWQuICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5hY3Rpdml0eV9kYXZleSk7CisgICAgICAgIERhdmV5VmlldyB2aWV3ID0gKERhdmV5VmlldylmaW5kVmlld0J5SWQoUi5pZC5kYXZleV92aWV3KTsKKyAgICAgICAgdmlldy5jYXVzZURhdmV5KHRydWUpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3N0YXRzZC9hcHBzL3N0YXRzZGFwcC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9kZXZpY2Uvc3RhdHNkL0RhdmV5Vmlldy5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zdGF0c2QvYXBwcy9zdGF0c2RhcHAvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvZGV2aWNlL3N0YXRzZC9EYXZleVZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjFjZDM1Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9zdGF0c2QvYXBwcy9zdGF0c2RhcHAvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvZGV2aWNlL3N0YXRzZC9EYXZleVZpZXcuamF2YQpAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXIuY3RzLmRldmljZS5zdGF0c2Q7CisKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQuRm9udE1ldHJpY3M7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKworcHVibGljIGNsYXNzIERhdmV5VmlldyBleHRlbmRzIFZpZXcgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJzdGF0c2REYXZleVZpZXciOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBEQVZFWV9USU1FX01TID0gNzUwOyAvLyBBIGJpdCBtb3JlIHRoYW4gNzAwbXMgdG8gYmUgc2FmZS4KKyAgICBwcml2YXRlIGJvb2xlYW4gbUNhdXNlRGF2ZXk7CisgICAgcHJpdmF0ZSBQYWludCBtUGFpbnQ7CisgICAgcHJpdmF0ZSBpbnQgbVRleHR5OworCisgICAgcHVibGljIERhdmV5VmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CisgICAgICAgIFR5cGVkQXJyYXkgYSA9IGNvbnRleHQuZ2V0VGhlbWUoKS5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKAorICAgICAgICAgICAgICAgIGF0dHJzLAorICAgICAgICAgICAgICAgIFIuc3R5bGVhYmxlLkRhdmV5VmlldywKKyAgICAgICAgICAgICAgICAwLCAwKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUNhdXNlRGF2ZXkgPSBhLmdldEJvb2xlYW4oUi5zdHlsZWFibGUuRGF2ZXlWaWV3X2NhdXNlRGF2ZXksIGZhbHNlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGEucmVjeWNsZSgpOworICAgICAgICB9CisKKyAgICAgICAgbVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgIG1QYWludC5zZXRDb2xvcihDb2xvci5CTEFDSyk7CisgICAgICAgIG1QYWludC5zZXRUZXh0U2l6ZSgyMCk7CisgICAgICAgIEZvbnRNZXRyaWNzIG1ldHJpYyA9IG1QYWludC5nZXRGb250TWV0cmljcygpOworICAgICAgICBpbnQgdGV4dEhlaWdodCA9IChpbnQpIE1hdGguY2VpbChtZXRyaWMuZGVzY2VudCAtIG1ldHJpYy5hc2NlbnQpOworICAgICAgICBtVGV4dHkgPSB0ZXh0SGVpZ2h0IC0gKGludCkgbWV0cmljLmRlc2NlbnQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2F1c2VEYXZleShib29sZWFuIGNhdXNlKSB7CisgICAgICAgIG1DYXVzZURhdmV5ID0gY2F1c2U7CisgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKKyAgICAgICAgaWYgKG1DYXVzZURhdmV5KSB7CisgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIkRhdmV5ISIsIDAsIG1UZXh0eSwgbVBhaW50KTsKKyAgICAgICAgICAgIFN5c3RlbUNsb2NrLnNsZWVwKERBVkVZX1RJTUVfTVMpOworICAgICAgICAgICAgbUNhdXNlRGF2ZXkgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCgiTm8gRGF2ZXkiLCAwLCBtVGV4dHksIG1QYWludCk7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zdGF0c2QvYXBwcy9zdGF0c2RhcHAvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvZGV2aWNlL3N0YXRzZC9TdGF0c2RBdXRoZW50aWNhdG9yLmphdmEgYi9ob3N0c2lkZXRlc3RzL3N0YXRzZC9hcHBzL3N0YXRzZGFwcC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9kZXZpY2Uvc3RhdHNkL1N0YXRzZEF1dGhlbnRpY2F0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWFjZDA3Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9zdGF0c2QvYXBwcy9zdGF0c2RhcHAvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvZGV2aWNlL3N0YXRzZC9TdGF0c2RBdXRoZW50aWNhdG9yLmphdmEKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyLmN0cy5kZXZpY2Uuc3RhdHNkOworCitpbXBvcnQgYW5kcm9pZC5hY2NvdW50cy5BYnN0cmFjdEFjY291bnRBdXRoZW50aWNhdG9yOworaW1wb3J0IGFuZHJvaWQuYWNjb3VudHMuQWNjb3VudDsKK2ltcG9ydCBhbmRyb2lkLmFjY291bnRzLkFjY291bnRBdXRoZW50aWNhdG9yUmVzcG9uc2U7CitpbXBvcnQgYW5kcm9pZC5hY2NvdW50cy5BY2NvdW50TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmFjY291bnRzLk5ldHdvcmtFcnJvckV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5TZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCisvKioKKyAqIEF1dGhlbnRpY2F0b3IgZm9yIHRoZSBzeW5jIHRlc3QuCisgKi8KK3B1YmxpYyBjbGFzcyBTdGF0c2RBdXRoZW50aWNhdG9yIGV4dGVuZHMgU2VydmljZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJBdG9tVGVzdHNBdXRoZW50aWNhdG9yIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NPVU5UX05BTUUgPSAiU3RhdHNkQ3RzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDT1VOVF9UWVBFID0gImNvbS5hbmRyb2lkLmN0cy5zdGF0c2QiOworICAgIHByaXZhdGUgc3RhdGljIEF1dGhlbnRpY2F0b3Igc0luc3RhbmNlOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElCaW5kZXIgb25CaW5kKEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgaWYgKHNJbnN0YW5jZSA9PSBudWxsKSB7CisgICAgICAgICAgICBzSW5zdGFuY2UgPSBuZXcgQXV0aGVudGljYXRvcihnZXRBcHBsaWNhdGlvbkNvbnRleHQoKSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc0luc3RhbmNlLmdldElCaW5kZXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEFjY291bnQgZ2V0VGVzdEFjY291bnQoKSB7CisgICAgICAgIHJldHVybiBuZXcgQWNjb3VudChBQ0NPVU5UX05BTUUsIEFDQ09VTlRfVFlQRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyB0aGUgdGVzdCBhY2NvdW50LCBpZiBpdCBkb2Vzbid0IGV4aXN0IHlldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZW5zdXJlVGVzdEFjY291bnQoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGZpbmFsIEFjY291bnQgYWNjb3VudCA9IGdldFRlc3RBY2NvdW50KCk7CisKKyAgICAgICAgQnVuZGxlIHJlc3VsdCA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgcmVzdWx0LnB1dFN0cmluZyhBY2NvdW50TWFuYWdlci5LRVlfQUNDT1VOVF9UWVBFLCBhY2NvdW50LnR5cGUpOworICAgICAgICByZXN1bHQucHV0U3RyaW5nKEFjY291bnRNYW5hZ2VyLktFWV9BQ0NPVU5UX05BTUUsIGFjY291bnQubmFtZSk7CisKKyAgICAgICAgZmluYWwgQWNjb3VudE1hbmFnZXIgYW0gPSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQWNjb3VudE1hbmFnZXIuY2xhc3MpOworCisgICAgICAgIGlmICghQXJyYXlzLmFzTGlzdChhbS5nZXRBY2NvdW50c0J5VHlwZShhY2NvdW50LnR5cGUpKS5jb250YWlucyhhY2NvdW50KSApeworICAgICAgICAgICAgYW0uYWRkQWNjb3VudEV4cGxpY2l0bHkoYWNjb3VudCwgInBhc3N3b3JkIiwgbmV3IEJ1bmRsZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgdGVzdCBhY2NvdW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxBY2NvdW50cyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgZmluYWwgQWNjb3VudE1hbmFnZXIgYW0gPSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQWNjb3VudE1hbmFnZXIuY2xhc3MpOworCisgICAgICAgIGZvciAoQWNjb3VudCBhY2NvdW50IDogYW0uZ2V0QWNjb3VudHNCeVR5cGUoQUNDT1VOVF9UWVBFKSkgeworICAgICAgICAgICAgTG9nLmkoVEFHLCAiUmVtb3ZpbmcgIiArIGFjY291bnQgKyAiLi4uIik7CisgICAgICAgICAgICBhbS5yZW1vdmVBY2NvdW50RXhwbGljaXRseShhY2NvdW50KTsKKyAgICAgICAgICAgIExvZy5pKFRBRywgIlJlbW92ZWQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQXV0aGVudGljYXRvciBleHRlbmRzIEFic3RyYWN0QWNjb3VudEF1dGhlbnRpY2F0b3IgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udHhldDsKKworICAgICAgICBwdWJsaWMgQXV0aGVudGljYXRvcihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICAgICAgbUNvbnR4ZXQgPSBjb250ZXh0OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCdW5kbGUgYWRkQWNjb3VudChBY2NvdW50QXV0aGVudGljYXRvclJlc3BvbnNlIHJlc3BvbnNlLCBTdHJpbmcgYWNjb3VudFR5cGUsCisgICAgICAgICAgICAgICAgU3RyaW5nIGF1dGhUb2tlblR5cGUsIFN0cmluZ1tdIHJlcXVpcmVkRmVhdHVyZXMsIEJ1bmRsZSBvcHRpb25zKQorICAgICAgICAgICAgICAgIHRocm93cyBOZXR3b3JrRXJyb3JFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIG5ldyBCdW5kbGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQnVuZGxlIGVkaXRQcm9wZXJ0aWVzKEFjY291bnRBdXRoZW50aWNhdG9yUmVzcG9uc2UgcmVzcG9uc2UsIFN0cmluZyBhY2NvdW50VHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBCdW5kbGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQnVuZGxlIHVwZGF0ZUNyZWRlbnRpYWxzKEFjY291bnRBdXRoZW50aWNhdG9yUmVzcG9uc2UgcmVzcG9uc2UsIEFjY291bnQgYWNjb3VudCwKKyAgICAgICAgICAgICAgICBTdHJpbmcgYXV0aFRva2VuVHlwZSwgQnVuZGxlIG9wdGlvbnMpIHRocm93cyBOZXR3b3JrRXJyb3JFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIG5ldyBCdW5kbGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQnVuZGxlIGNvbmZpcm1DcmVkZW50aWFscyhBY2NvdW50QXV0aGVudGljYXRvclJlc3BvbnNlIHJlc3BvbnNlLCBBY2NvdW50IGFjY291bnQsCisgICAgICAgICAgICAgICAgQnVuZGxlIG9wdGlvbnMpIHRocm93cyBOZXR3b3JrRXJyb3JFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIG5ldyBCdW5kbGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQnVuZGxlIGdldEF1dGhUb2tlbihBY2NvdW50QXV0aGVudGljYXRvclJlc3BvbnNlIHJlc3BvbnNlLCBBY2NvdW50IGFjY291bnQsCisgICAgICAgICAgICAgICAgU3RyaW5nIGF1dGhUb2tlblR5cGUsIEJ1bmRsZSBvcHRpb25zKSB0aHJvd3MgTmV0d29ya0Vycm9yRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQnVuZGxlKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRBdXRoVG9rZW5MYWJlbChTdHJpbmcgYXV0aFRva2VuVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuICJ0b2tlbl9sYWJlbCI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJ1bmRsZSBoYXNGZWF0dXJlcyhBY2NvdW50QXV0aGVudGljYXRvclJlc3BvbnNlIHJlc3BvbnNlLCBBY2NvdW50IGFjY291bnQsCisgICAgICAgICAgICAgICAgU3RyaW5nW10gZmVhdHVyZXMpIHRocm93cyBOZXR3b3JrRXJyb3JFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIG5ldyBCdW5kbGUoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc3RhdHNkL2FwcHMvc3RhdHNkYXBwL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY3RzL2RldmljZS9zdGF0c2QvU3RhdHNkQ3RzQmFja2dyb3VuZFNlcnZpY2UuamF2YSBiL2hvc3RzaWRldGVzdHMvc3RhdHNkL2FwcHMvc3RhdHNkYXBwL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY3RzL2RldmljZS9zdGF0c2QvU3RhdHNkQ3RzQmFja2dyb3VuZFNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzFjNDcyCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9zdGF0c2QvYXBwcy9zdGF0c2RhcHAvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvZGV2aWNlL3N0YXRzZC9TdGF0c2RDdHNCYWNrZ3JvdW5kU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlci5jdHMuZGV2aWNlLnN0YXRzZDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5jdHMuZGV2aWNlLnN0YXRzZC5BdG9tVGVzdHM7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5JbnRlbnRTZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworLyoqIEFuIHNlcnZpY2UgKHRvIGJlIHJ1biBhcyBhIGJhY2tncm91bmQgcHJvY2Vzcykgd2hpY2ggcGVyZm9ybXMgb25lIG9mIGEgbnVtYmVyIG9mIGFjdGlvbnMuICovCitwdWJsaWMgY2xhc3MgU3RhdHNkQ3RzQmFja2dyb3VuZFNlcnZpY2UgZXh0ZW5kcyBJbnRlbnRTZXJ2aWNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gU3RhdHNkQ3RzQmFja2dyb3VuZFNlcnZpY2UuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0FDVElPTiA9ICJhY3Rpb24iOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9CQUNLR1JPVU5EX1NMRUVQID0gImFjdGlvbi5iYWNrZ3JvdW5kX3NsZWVwIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fRU5EX0lNTUVESUFURUxZID0gImFjdGlvbi5lbmRfaW1tZWRpYXRlbHkiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0xFRVBfT0ZfQUNUSU9OX0JBQ0tHUk9VTkRfU0xFRVAgPSAyXzAwMDsKKworICAgIHB1YmxpYyBTdGF0c2RDdHNCYWNrZ3JvdW5kU2VydmljZSgpIHsKKyAgICAgICAgc3VwZXIoU3RhdHNkQ3RzQmFja2dyb3VuZFNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkhhbmRsZUludGVudChJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIFN0cmluZyBhY3Rpb24gPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoS0VZX0FDVElPTik7CisgICAgICAgIExvZy5pKFRBRywgIlN0YXJ0aW5nICIgKyBhY3Rpb24gKyAiIGZyb20gYmFja2dyb3VuZCBzZXJ2aWNlLiIpOworCisgICAgICAgIHN3aXRjaCAoYWN0aW9uKSB7CisgICAgICAgICAgICBjYXNlIEFDVElPTl9CQUNLR1JPVU5EX1NMRUVQOgorICAgICAgICAgICAgICAgIEF0b21UZXN0cy5zbGVlcChTTEVFUF9PRl9BQ1RJT05fQkFDS0dST1VORF9TTEVFUCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFDVElPTl9FTkRfSU1NRURJQVRFTFk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkludGVudCBoYWQgaW52YWxpZCBhY3Rpb24iKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc3RhdHNkL2FwcHMvc3RhdHNkYXBwL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY3RzL2RldmljZS9zdGF0c2QvU3RhdHNkQ3RzRm9yZWdyb3VuZEFjdGl2aXR5LmphdmEgYi9ob3N0c2lkZXRlc3RzL3N0YXRzZC9hcHBzL3N0YXRzZGFwcC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9kZXZpY2Uvc3RhdHNkL1N0YXRzZEN0c0ZvcmVncm91bmRBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNWJiYzAKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL3N0YXRzZC9hcHBzL3N0YXRzZGFwcC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9kZXZpY2Uvc3RhdHNkL1N0YXRzZEN0c0ZvcmVncm91bmRBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMTI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXIuY3RzLmRldmljZS5zdGF0c2Q7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIuY3RzLmRldmljZS5zdGF0c2QuQXRvbVRlc3RzOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Rhc2s7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOworCisvKiogQW4gYWN0aXZpdHkgKHRvIGJlIHJ1biBhcyBhIGZvcmVncm91bmQgcHJvY2Vzcykgd2hpY2ggcGVyZm9ybXMgb25lIG9mIGEgbnVtYmVyIG9mIGFjdGlvbnMuICovCitwdWJsaWMgY2xhc3MgU3RhdHNkQ3RzRm9yZWdyb3VuZEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBTdGF0c2RDdHNGb3JlZ3JvdW5kQWN0aXZpdHkuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0FDVElPTiA9ICJhY3Rpb24iOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9FTkRfSU1NRURJQVRFTFkgPSAiYWN0aW9uLmVuZF9pbW1lZGlhdGVseSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1NMRUVQX1dISUxFX1RPUCA9ICJhY3Rpb24uc2xlZXBfdG9wIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fU0hPV19BUFBMSUNBVElPTl9PVkVSTEFZID0gImFjdGlvbi5zaG93X2FwcGxpY2F0aW9uX292ZXJsYXkiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9DUkFTSCA9ICJhY3Rpb24uY3Jhc2giOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0xFRVBfT0ZfQUNUSU9OX1NMRUVQX1dISUxFX1RPUCA9IDJfMDAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNMRUVQX09GX0FDVElPTl9TSE9XX0FQUExJQ0FUSU9OX09WRVJMQVkgPSAyXzAwMDsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBidW5kbGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoYnVuZGxlKTsKKworICAgICAgICBJbnRlbnQgaW50ZW50ID0gdGhpcy5nZXRJbnRlbnQoKTsKKyAgICAgICAgaWYgKGludGVudCA9PSBudWxsKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJJbnRlbnQgd2FzIG51bGwuIik7CisgICAgICAgICAgICBmaW5pc2goKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBhY3Rpb24gPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoS0VZX0FDVElPTik7CisgICAgICAgIExvZy5pKFRBRywgIlN0YXJ0aW5nICIgKyBhY3Rpb24gKyAiIGZyb20gZm9yZWdyb3VuZCBhY3Rpdml0eS4iKTsKKworICAgICAgICBzd2l0Y2ggKGFjdGlvbikgeworICAgICAgICAgICAgY2FzZSBBQ1RJT05fRU5EX0lNTUVESUFURUxZOgorICAgICAgICAgICAgICAgIGZpbmlzaCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBQ1RJT05fU0xFRVBfV0hJTEVfVE9QOgorICAgICAgICAgICAgICAgIGRvU2xlZXBXaGlsZVRvcCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBQ1RJT05fU0hPV19BUFBMSUNBVElPTl9PVkVSTEFZOgorICAgICAgICAgICAgICAgIGRvU2hvd0FwcGxpY2F0aW9uT3ZlcmxheSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBQ1RJT05fQ1JBU0g6CisgICAgICAgICAgICAgICAgZG9DcmFzaCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJJbnRlbnQgaGFkIGludmFsaWQgYWN0aW9uICIgKyBhY3Rpb24pOworICAgICAgICAgICAgICAgIGZpbmlzaCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIERvZXMgbm90aGluZywgYnV0IGFzeW5jaHJvbm91c2x5LiAqLworICAgIHByaXZhdGUgdm9pZCBkb1NsZWVwV2hpbGVUb3AoKSB7CisgICAgICAgIG5ldyBBc3luY1Rhc2s8Vm9pZCwgVm9pZCwgVm9pZD4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBWb2lkIGRvSW5CYWNrZ3JvdW5kKFZvaWQuLi4gcGFyYW1zKSB7CisgICAgICAgICAgICAgICAgQXRvbVRlc3RzLnNsZWVwKFNMRUVQX09GX0FDVElPTl9TTEVFUF9XSElMRV9UT1ApOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uUG9zdEV4ZWN1dGUoVm9pZCBub3RoaW5nKSB7CisgICAgICAgICAgICAgICAgZmluaXNoKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0uZXhlY3V0ZSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkb1Nob3dBcHBsaWNhdGlvbk92ZXJsYXkoKSB7CisgICAgICAgIC8vIEFkYXB0ZWQgZnJvbSBCYXR0ZXJ5U3RhdHNCZ1ZzRmdBY3Rpb25zLmphdmEuCisgICAgICAgIGZpbmFsIFdpbmRvd01hbmFnZXIgd20gPSBnZXRTeXN0ZW1TZXJ2aWNlKFdpbmRvd01hbmFnZXIuY2xhc3MpOworICAgICAgICBQb2ludCBzaXplID0gbmV3IFBvaW50KCk7CisgICAgICAgIHdtLmdldERlZmF1bHREaXNwbGF5KCkuZ2V0U2l6ZShzaXplKTsKKworICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyB3bWxwID0gbmV3IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zKAorICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlRZUEVfQVBQTElDQVRJT05fT1ZFUkxBWSwKKyAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX05PVF9GT0NVU0FCTEUKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19LRUVQX1NDUkVFTl9PTgorICAgICAgICAgICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX05PVF9UT1VDSEFCTEUpOworICAgICAgICB3bWxwLndpZHRoID0gc2l6ZS54IC8gNDsKKyAgICAgICAgd21scC5oZWlnaHQgPSBzaXplLnkgLyA0OworICAgICAgICB3bWxwLmdyYXZpdHkgPSBHcmF2aXR5LkNFTlRFUiB8IEdyYXZpdHkuTEVGVDsKKyAgICAgICAgd21scC5zZXRUaXRsZShnZXRQYWNrYWdlTmFtZSgpKTsKKworICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIHZnbHAgPSBuZXcgVmlld0dyb3VwLkxheW91dFBhcmFtcygKKyAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwKKyAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCk7CisKKyAgICAgICAgVmlldyB2ID0gbmV3IFZpZXcodGhpcyk7CisgICAgICAgIHYuc2V0QmFja2dyb3VuZENvbG9yKENvbG9yLkdSRUVOKTsKKyAgICAgICAgdi5zZXRMYXlvdXRQYXJhbXModmdscCk7CisgICAgICAgIHdtLmFkZFZpZXcodiwgd21scCk7CisKKyAgICAgICAgLy8gVGhlIG92ZXJsYXkgY29udGludWVzIGxvbmcgYWZ0ZXIgdGhlIGZpbmlzaC4gVGhlIGZvbGxvd2luZyBpcyBqdXN0IHRvIGVuZCB0aGUgYWN0aXZpdHkuCisgICAgICAgIEF0b21UZXN0cy5zbGVlcChTTEVFUF9PRl9BQ1RJT05fU0hPV19BUFBMSUNBVElPTl9PVkVSTEFZKTsKKyAgICAgICAgZmluaXNoKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRvQ3Jhc2goKSB7CisgICAgICAgIExvZy5lKFRBRywgIkFib3V0IHRvIGNyYXNoIHRoZSBhcHAgd2l0aCAxLzAgIiArIChsb25nKTEvMCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zdGF0c2QvYXBwcy9zdGF0c2RhcHAvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvZGV2aWNlL3N0YXRzZC9TdGF0c2RDdHNGb3JlZ3JvdW5kU2VydmljZS5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zdGF0c2QvYXBwcy9zdGF0c2RhcHAvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvZGV2aWNlL3N0YXRzZC9TdGF0c2RDdHNGb3JlZ3JvdW5kU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNDZmNWYKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL3N0YXRzZC9hcHBzL3N0YXRzZGFwcC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9kZXZpY2Uvc3RhdHNkL1N0YXRzZEN0c0ZvcmVncm91bmRTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlci5jdHMuZGV2aWNlLnN0YXRzZDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb25DaGFubmVsOworaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbk1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5hcHAuU2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlclRocmVhZDsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQub3MuUHJvY2VzczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5BcGlMZXZlbFV0aWw7CisKK3B1YmxpYyBjbGFzcyBTdGF0c2RDdHNGb3JlZ3JvdW5kU2VydmljZSBleHRlbmRzIFNlcnZpY2UgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU2ltcGxlRm9yZWdyb3VuZFNlcnZpY2UiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RJRklDQVRJT05fQ0hBTk5FTF9JRCA9ICJGb3JlZ3JvdW5kIFNlcnZpY2UiOworCisgICAgLy8gVE9ETzogcGFzcyB0aGlzIGluIGZyb20gaG9zdCBzaWRlLgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNMRUVQX09GX0ZPUkVHUk9VTkRfU0VSVklDRSA9IDJfMDAwOworCisgICAgcHJpdmF0ZSBMb29wZXIgbVNlcnZpY2VMb29wZXI7CisgICAgcHJpdmF0ZSBTZXJ2aWNlSGFuZGxlciBtU2VydmljZUhhbmRsZXI7CisgICAgcHJpdmF0ZSBib29sZWFuIG1DaGFubmVsQ3JlYXRlZDsKKworICAgIHByaXZhdGUgZmluYWwgY2xhc3MgU2VydmljZUhhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyIHsKKyAgICAgICAgcHVibGljIFNlcnZpY2VIYW5kbGVyKExvb3BlciBsb29wZXIpIHsKKyAgICAgICAgICAgIHN1cGVyKGxvb3Blcik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgTG9nLmkoVEFHLCAiSGFuZGxpbmcgbWVzc2FnZS4iKTsKKyAgICAgICAgICAgIC8vIFNsZWVwLgorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0xFRVBfT0ZfRk9SRUdST1VORF9TRVJWSUNFKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBSZXN0b3JlIGludGVycnVwdCBzdGF0dXMuCisgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExvZy5pKFRBRywgIlN0b3BwaW5nIHNlcnZpY2UuIik7CisgICAgICAgICAgICAvLyBTdG9wIHRoZSBzZXJ2aWNlIHVzaW5nIHRoZSBzdGFydElkLCBzbyB0aGF0IHdlIGRvbid0IHN0b3AKKyAgICAgICAgICAgIC8vIHRoZSBzZXJ2aWNlIGluIHRoZSBtaWRkbGUgb2YgaGFuZGxpbmcgYW5vdGhlciBqb2IKKyAgICAgICAgICAgIHN0b3BTZWxmKG1zZy5hcmcxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKCkgeworICAgICAgICAvLyBTdGFydCB1cCB0aGUgdGhyZWFkIHJ1bm5pbmcgdGhlIHNlcnZpY2UuICBOb3RlIHRoYXQgd2UgY3JlYXRlIGEKKyAgICAgICAgLy8gc2VwYXJhdGUgdGhyZWFkIGJlY2F1c2UgdGhlIHNlcnZpY2Ugbm9ybWFsbHkgcnVucyBpbiB0aGUgcHJvY2VzcydzCisgICAgICAgIC8vIG1haW4gdGhyZWFkLCB3aGljaCB3ZSBkb24ndCB3YW50IHRvIGJsb2NrLiAgV2UgYWxzbyBtYWtlIGl0CisgICAgICAgIC8vIGJhY2tncm91bmQgcHJpb3JpdHkgc28gQ1BVLWludGVuc2l2ZSB3b3JrIHdpbGwgbm90IGRpc3J1cHQgb3VyIFVJLgorICAgICAgICBIYW5kbGVyVGhyZWFkIHRocmVhZCA9IG5ldyBIYW5kbGVyVGhyZWFkKCJTZXJ2aWNlU3RhcnRBcmd1bWVudHMiLAorICAgICAgICAgICAgICAgIFByb2Nlc3MuVEhSRUFEX1BSSU9SSVRZX0JBQ0tHUk9VTkQpOworICAgICAgICB0aHJlYWQuc3RhcnQoKTsKKworICAgICAgICAvLyBHZXQgdGhlIEhhbmRsZXJUaHJlYWQncyBMb29wZXIgYW5kIHVzZSBpdCBmb3Igb3VyIEhhbmRsZXIKKyAgICAgICAgbVNlcnZpY2VMb29wZXIgPSB0aHJlYWQuZ2V0TG9vcGVyKCk7CisgICAgICAgIG1TZXJ2aWNlSGFuZGxlciA9IG5ldyBTZXJ2aWNlSGFuZGxlcihtU2VydmljZUxvb3Blcik7CisKKyAgICAgICAgaWYgKEFwaUxldmVsVXRpbC5pc0JlZm9yZShCdWlsZC5WRVJTSU9OX0NPREVTLk9fTVIxKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIE9NUjEgcmVxdWlyZXMgbm90aWZpY2F0aW9uIGNoYW5uZWwgdG8gYmUgc2V0CisgICAgICAgIE5vdGlmaWNhdGlvbk1hbmFnZXIgbm90aWZpY2F0aW9uTWFuYWdlciA9CisgICAgICAgICAgICAgICAgKE5vdGlmaWNhdGlvbk1hbmFnZXIpIGdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5OT1RJRklDQVRJT05fU0VSVklDRSk7CisgICAgICAgIE5vdGlmaWNhdGlvbkNoYW5uZWwgY2hhbm5lbCA9IG5ldyBOb3RpZmljYXRpb25DaGFubmVsKE5PVElGSUNBVElPTl9DSEFOTkVMX0lELAorICAgICAgICAgICAgICAgIE5PVElGSUNBVElPTl9DSEFOTkVMX0lELAorICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbk1hbmFnZXIuSU1QT1JUQU5DRV9ISUdIKTsKKyAgICAgICAgbm90aWZpY2F0aW9uTWFuYWdlci5jcmVhdGVOb3RpZmljYXRpb25DaGFubmVsKGNoYW5uZWwpOworICAgICAgICBtQ2hhbm5lbENyZWF0ZWQgPSB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgb25TdGFydENvbW1hbmQoSW50ZW50IGludGVudCwgaW50IGZsYWdzLCBpbnQgc3RhcnRJZCkgeworICAgICAgICBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uID0gbmV3IE5vdGlmaWNhdGlvbi5CdWlsZGVyKHRoaXMsIE5PVElGSUNBVElPTl9DSEFOTkVMX0lEKQorICAgICAgICAgICAgICAgIC5zZXRDb250ZW50VGl0bGUoIkNUUyBGb3JlZ3JvdW5kIikKKyAgICAgICAgICAgICAgICAuc2V0U21hbGxJY29uKGFuZHJvaWQuUi5kcmF3YWJsZS5pY19zZWN1cmUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIExvZy5pKFRBRywgIlN0YXJ0aW5nIEZvcmVncm91bmQuIik7CisgICAgICAgIHN0YXJ0Rm9yZWdyb3VuZCgxLCBub3RpZmljYXRpb24pOworCisgICAgICAgIE1lc3NhZ2UgbXNnID0gbVNlcnZpY2VIYW5kbGVyLm9idGFpbk1lc3NhZ2UoKTsKKyAgICAgICAgbXNnLmFyZzEgPSBzdGFydElkOworICAgICAgICBtU2VydmljZUhhbmRsZXIuc2VuZE1lc3NhZ2UobXNnKTsKKworICAgICAgICByZXR1cm4gU1RBUlRfTk9UX1NUSUNLWTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSUJpbmRlciBvbkJpbmQoSW50ZW50IGludGVudCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3kgKCkgeworICAgICAgICBpZiAobUNoYW5uZWxDcmVhdGVkKSB7CisgICAgICAgICAgICBOb3RpZmljYXRpb25NYW5hZ2VyIG5vdGlmaWNhdGlvbk1hbmFnZXIgPQorICAgICAgICAgICAgICAgICAgICAoTm90aWZpY2F0aW9uTWFuYWdlcikgZ2V0U3lzdGVtU2VydmljZShDb250ZXh0Lk5PVElGSUNBVElPTl9TRVJWSUNFKTsKKyAgICAgICAgICAgIG5vdGlmaWNhdGlvbk1hbmFnZXIuZGVsZXRlTm90aWZpY2F0aW9uQ2hhbm5lbChOT1RJRklDQVRJT05fQ0hBTk5FTF9JRCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3N0YXRzZC9hcHBzL3N0YXRzZGFwcC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9kZXZpY2Uvc3RhdHNkL1N0YXRzZEpvYlNlcnZpY2UuamF2YSBiL2hvc3RzaWRldGVzdHMvc3RhdHNkL2FwcHMvc3RhdHNkYXBwL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY3RzL2RldmljZS9zdGF0c2QvU3RhdHNkSm9iU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyOWJkZmEKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL3N0YXRzZC9hcHBzL3N0YXRzZGFwcC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9kZXZpY2Uvc3RhdHNkL1N0YXRzZEpvYlNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXIuY3RzLmRldmljZS5zdGF0c2Q7CisKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uVGFyZ2V0QXBpOworaW1wb3J0IGFuZHJvaWQuYXBwLmpvYi5Kb2JJbmZvOworaW1wb3J0IGFuZHJvaWQuYXBwLmpvYi5Kb2JQYXJhbWV0ZXJzOworaW1wb3J0IGFuZHJvaWQuYXBwLmpvYi5Kb2JTY2hlZHVsZXI7CitpbXBvcnQgYW5kcm9pZC5hcHAuam9iLkpvYlNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworLyoqCisgKiBIYW5kbGVzIGNhbGxiYWNrIGZyb20gdGhlIGZyYW1ld29yayB7QGxpbmsgYW5kcm9pZC5hcHAuam9iLkpvYlNjaGVkdWxlcn0uCisgKiBSdW5zIGEgam9iIGZvciAwLjUgc2Vjb25kcy4gUHJvdmlkZXMgYSBjb3VudGRvd24gbGF0Y2ggdG8gd2FpdCBvbiwgYnkgdGhlIHRlc3QgdGhhdCBzY2hlZHVsZXMgaXQuCisgKi8KK0BUYXJnZXRBcGkoMjEpCitwdWJsaWMgY2xhc3MgU3RhdHNkSm9iU2VydmljZSBleHRlbmRzIEpvYlNlcnZpY2UgeworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkF0b21UZXN0c0pvYlNlcnZpY2UiOworCisgIEpvYkluZm8gbVJ1bm5pbmdKb2JJbmZvOworICBKb2JQYXJhbWV0ZXJzIG1SdW5uaW5nUGFyYW1zOworICBwcml2YXRlIHN0YXRpYyBDb3VudERvd25MYXRjaCBzTGF0Y2g7CisKKyAgZmluYWwgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7CisgIGZpbmFsIFJ1bm5hYmxlIG1Xb3JrZXIgPSBuZXcgUnVubmFibGUoKSB7CisgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIFRocmVhZC5zbGVlcCg1MDApOworICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgfQorICAgICAgam9iRmluaXNoZWQobVJ1bm5pbmdQYXJhbXMsIGZhbHNlKTsKKyAgICAgIGlmIChzTGF0Y2ggIT0gbnVsbCkgeworICAgICAgICBzTGF0Y2guY291bnREb3duKCk7CisgICAgICB9CisgICAgfQorICB9OworCisgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIENvdW50RG93bkxhdGNoIHJlc2V0Q291bnREb3duTGF0Y2goKSB7CisgICAgc0xhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworICAgIHJldHVybiBzTGF0Y2g7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgb25DcmVhdGUoKSB7CisgICAgc3VwZXIub25DcmVhdGUoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBvblN0YXJ0Sm9iKEpvYlBhcmFtZXRlcnMgcGFyYW1zKSB7CisgICAgbVJ1bm5pbmdQYXJhbXMgPSBwYXJhbXM7CisgICAgbUhhbmRsZXIucG9zdChtV29ya2VyKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBvblN0b3BKb2IoSm9iUGFyYW1ldGVycyBwYXJhbXMpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3N0YXRzZC9hcHBzL3N0YXRzZGFwcC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9kZXZpY2Uvc3RhdHNkL1N0YXRzZFByb3ZpZGVyLmphdmEgYi9ob3N0c2lkZXRlc3RzL3N0YXRzZC9hcHBzL3N0YXRzZGFwcC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9kZXZpY2Uvc3RhdHNkL1N0YXRzZFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ2NTJiMgotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvc3RhdHNkL2FwcHMvc3RhdHNkYXBwL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY3RzL2RldmljZS9zdGF0c2QvU3RhdHNkUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlci5jdHMuZGV2aWNlLnN0YXRzZDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworCisvKioKKyAqIFByb3ZpZGVyIGZvciB0aGUgc3luYyB0ZXN0LgorICovCitwdWJsaWMgY2xhc3MgU3RhdHNkUHJvdmlkZXIgZXh0ZW5kcyBDb250ZW50UHJvdmlkZXIgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVEhPUklUWSA9ICJjb20uYW5kcm9pZC5zZXJ2ZXIuY3RzLmRldmljZS5zdGF0c2QucHJvdmlkZXIiOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25DcmVhdGUoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ3Vyc29yIHF1ZXJ5KFVyaSB1cmksIFN0cmluZ1tdIHByb2plY3Rpb24sIFN0cmluZyBzZWxlY3Rpb24sIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MsCisgICAgICAgICAgICBTdHJpbmcgc29ydE9yZGVyKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZShVcmkgdXJpKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBVcmkgaW5zZXJ0KFVyaSB1cmksIENvbnRlbnRWYWx1ZXMgdmFsdWVzKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZGVsZXRlKFVyaSB1cmksIFN0cmluZyBzZWxlY3Rpb24sIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCB1cGRhdGUoVXJpIHVyaSwgQ29udGVudFZhbHVlcyB2YWx1ZXMsIFN0cmluZyBzZWxlY3Rpb24sIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc3RhdHNkL2FwcHMvc3RhdHNkYXBwL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY3RzL2RldmljZS9zdGF0c2QvU3RhdHNkU3luY0FkYXB0ZXIuamF2YSBiL2hvc3RzaWRldGVzdHMvc3RhdHNkL2FwcHMvc3RhdHNkYXBwL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY3RzL2RldmljZS9zdGF0c2QvU3RhdHNkU3luY0FkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmYxMTBiCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9zdGF0c2QvYXBwcy9zdGF0c2RhcHAvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvZGV2aWNlL3N0YXRzZC9TdGF0c2RTeW5jQWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyLmN0cy5kZXZpY2Uuc3RhdHNkOworCitpbXBvcnQgYW5kcm9pZC5hY2NvdW50cy5BY2NvdW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5BYnN0cmFjdFRocmVhZGVkU3luY0FkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlckNsaWVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5TeW5jUmVzdWx0OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uY29uY3VycmVudC5HdWFyZGVkQnk7CisKKy8qKgorICogU3luYyBhZGFwdGVyIGZvciB0aGUgc3luYyB0ZXN0LgorICovCitwdWJsaWMgY2xhc3MgU3RhdHNkU3luY0FkYXB0ZXIgZXh0ZW5kcyBBYnN0cmFjdFRocmVhZGVkU3luY0FkYXB0ZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQXRvbVRlc3RzU3luY0FkYXB0ZXIiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRJTUVPVVRfU0VDT05EUyA9IDYwICogMjsKKworICAgIHByaXZhdGUgc3RhdGljIENvdW50RG93bkxhdGNoIHNMYXRjaDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBzTG9jayA9IG5ldyBPYmplY3QoKTsKKworCisgICAgcHVibGljIFN0YXRzZFN5bmNBZGFwdGVyKENvbnRleHQgY29udGV4dCkgeworICAgICAgICAvLyBObyBuZWVkIGZvciBhdXRvLWluaXRpYWxpemF0aW9uIGJlY2F1c2Ugd2Ugc2V0IGlzU3luY2FibGUgaW4gdGhlIHRlc3QgYW55d2F5LgorICAgICAgICBzdXBlcihjb250ZXh0LCAvKiBhdXRvSW5pdGlhbGl6ZT0gKi8gZmFsc2UpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uUGVyZm9ybVN5bmMoQWNjb3VudCBhY2NvdW50LCBCdW5kbGUgZXh0cmFzLCBTdHJpbmcgYXV0aG9yaXR5LAorICAgICAgICAgICAgQ29udGVudFByb3ZpZGVyQ2xpZW50IHByb3ZpZGVyLCBTeW5jUmVzdWx0IHN5bmNSZXN1bHQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcCg1MDApOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgc3luY2hyb25pemVkIChzTG9jaykgeworICAgICAgICAgICAgTG9nLmkoVEFHLCAib25QZXJmb3JtU3luYyIpOworICAgICAgICAgICAgc0xvY2subm90aWZ5QWxsKCk7CisgICAgICAgICAgICBpZiAoc0xhdGNoICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzTGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgInNMYXRjaCBpcyBudWxsLCByZXNldENvdW50RG93bkxhdGNoIHByb2JhYmx5IHNob3VsZCBoYXZlIGJlZW4gY2FsbGVkIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXF1ZXN0IGEgc3luYyBvbiB0aGUgZ2l2ZW4gYWNjb3VudCwgYW5kIHdhaXQgZm9yIGl0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXF1ZXN0U3luYyhBY2NvdW50IGFjY291bnQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBCdW5kbGUgZXh0cmFzID0gbmV3IEJ1bmRsZSgpOworICAgICAgICBleHRyYXMucHV0Qm9vbGVhbihDb250ZW50UmVzb2x2ZXIuU1lOQ19FWFRSQVNfRVhQRURJVEVELCB0cnVlKTsKKyAgICAgICAgZXh0cmFzLnB1dEJvb2xlYW4oQ29udGVudFJlc29sdmVyLlNZTkNfRVhUUkFTX0lHTk9SRV9CQUNLT0ZGLCB0cnVlKTsKKyAgICAgICAgZXh0cmFzLnB1dEJvb2xlYW4oQ29udGVudFJlc29sdmVyLlNZTkNfRVhUUkFTX0lHTk9SRV9TRVRUSU5HUywgdHJ1ZSk7CisKKyAgICAgICAgQ29udGVudFJlc29sdmVyLnJlcXVlc3RTeW5jKGFjY291bnQsIFN0YXRzZFByb3ZpZGVyLkFVVEhPUklUWSwgZXh0cmFzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBDb3VudERvd25MYXRjaCByZXNldENvdW50RG93bkxhdGNoKCkgeworICAgICAgICBzTGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgICAgIHJldHVybiBzTGF0Y2g7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zdGF0c2QvYXBwcy9zdGF0c2RhcHAvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvZGV2aWNlL3N0YXRzZC9TdGF0c2RTeW5jU2VydmljZS5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zdGF0c2QvYXBwcy9zdGF0c2RhcHAvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jdHMvZGV2aWNlL3N0YXRzZC9TdGF0c2RTeW5jU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMDZjNmYKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL3N0YXRzZC9hcHBzL3N0YXRzZGFwcC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9kZXZpY2Uvc3RhdHNkL1N0YXRzZFN5bmNTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlci5jdHMuZGV2aWNlLnN0YXRzZDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLlNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CisKKy8qKgorICogU2VydmljZSBmb3IgdGhlIHN5bmMgdGVzdC4KKyAqLworcHVibGljIGNsYXNzIFN0YXRzZFN5bmNTZXJ2aWNlIGV4dGVuZHMgU2VydmljZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdGF0c2RTeW5jQWRhcHRlciBzQWRhcHRlcjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgSUJpbmRlciBvbkJpbmQoSW50ZW50IGludGVudCkgeworICAgICAgICBpZiAoc0FkYXB0ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgc0FkYXB0ZXIgPSBuZXcgU3RhdHNkU3luY0FkYXB0ZXIoZ2V0QXBwbGljYXRpb25Db250ZXh0KCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzQWRhcHRlci5nZXRTeW5jQWRhcHRlckJpbmRlcigpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3N0YXRzZC9hcHBzL3N0YXRzZGFwcC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9kZXZpY2Uvc3RhdHNkL1ZpZGVvUGxheWVyQWN0aXZpdHkuamF2YSBiL2hvc3RzaWRldGVzdHMvc3RhdHNkL2FwcHMvc3RhdHNkYXBwL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY3RzL2RldmljZS9zdGF0c2QvVmlkZW9QbGF5ZXJBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMWZjZWMKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL3N0YXRzZC9hcHBzL3N0YXRzZGFwcC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9kZXZpY2Uvc3RhdHNkL1ZpZGVvUGxheWVyQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDg4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXIuY3RzLmRldmljZS5zdGF0c2Q7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNUYXNrOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5WaWRlb1ZpZXc7CisKK3B1YmxpYyBjbGFzcyBWaWRlb1BsYXllckFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBWaWRlb1BsYXllckFjdGl2aXR5LmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9BQ1RJT04gPSAiYWN0aW9uIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fUExBWV9WSURFTyA9ICJhY3Rpb24ucGxheV92aWRlbyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1BMQVlfVklERU9fUElDVFVSRV9JTl9QSUNUVVJFX01PREUgPQorICAgICAgICAgICAgImFjdGlvbi5wbGF5X3ZpZGVvX3BpY3R1cmVfaW5fcGljdHVyZV9tb2RlIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFTEFZX01JTExJUyA9IDIwMDA7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgSW50ZW50IGludGVudCA9IHRoaXMuZ2V0SW50ZW50KCk7CisgICAgICAgIGlmIChpbnRlbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiSW50ZW50IHdhcyBudWxsLiIpOworICAgICAgICAgICAgZmluaXNoKCk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgYWN0aW9uID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKEtFWV9BQ1RJT04pOworICAgICAgICBMb2cuaShUQUcsICJTdGFydGluZyAiICsgYWN0aW9uICsgIiBmcm9tIGZvcmVncm91bmQgYWN0aXZpdHkuIik7CisKKyAgICAgICAgc3dpdGNoIChhY3Rpb24pIHsKKyAgICAgICAgICAgIGNhc2UgQUNUSU9OX1BMQVlfVklERU86CisgICAgICAgICAgICAgICAgcGxheVZpZGVvKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFDVElPTl9QTEFZX1ZJREVPX1BJQ1RVUkVfSU5fUElDVFVSRV9NT0RFOgorICAgICAgICAgICAgICAgIHBsYXlWaWRlbygpOworICAgICAgICAgICAgICAgIHRoaXMuZW50ZXJQaWN0dXJlSW5QaWN0dXJlTW9kZSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJJbnRlbnQgaGFkIGludmFsaWQgYWN0aW9uICIgKyBhY3Rpb24pOworICAgICAgICAgICAgICAgIGZpbmlzaCgpOworICAgICAgICB9CisgICAgICAgIGRlbGF5KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHBsYXlWaWRlbygpIHsKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQuYWN0aXZpdHlfbWFpbik7CisgICAgICAgIFZpZGVvVmlldyB2aWRlb1ZpZXcgPSAoVmlkZW9WaWV3KWZpbmRWaWV3QnlJZChSLmlkLnZpZGVvX3BsYXllcl92aWV3KTsKKyAgICAgICAgdmlkZW9WaWV3LnNldFZpZGVvUGF0aCgiYW5kcm9pZC5yZXNvdXJjZTovLyIgKyBnZXRQYWNrYWdlTmFtZSgpICsgIi8iICsgUi5yYXcuY29sb3JzX3ZpZGVvKTsKKyAgICAgICAgdmlkZW9WaWV3LnN0YXJ0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRlbGF5KCkgeworICAgICAgICBuZXcgQXN5bmNUYXNrPFZvaWQsIFZvaWQsIFZvaWQ+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgVm9pZCBkb0luQmFja2dyb3VuZChWb2lkLi4uIHBhcmFtcykgeworICAgICAgICAgICAgICAgIFN5c3RlbUNsb2NrLnNsZWVwKERFTEFZX01JTExJUyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uUG9zdEV4ZWN1dGUoVm9pZCBub3RoaW5nKSB7CisgICAgICAgICAgICAgICAgZmluaXNoKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0uZXhlY3V0ZSgpOworICAgIH0KK30KKworCisKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc3RhdHNkL2FwcHMvc3RhdHNkYXBwL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY3RzL2RldmljZS9zdGF0c2QvV2FrZWxvY2tMb2FkVGVzdFJ1bm5hYmxlLmphdmEgYi9ob3N0c2lkZXRlc3RzL3N0YXRzZC9hcHBzL3N0YXRzZGFwcC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9kZXZpY2Uvc3RhdHNkL1dha2Vsb2NrTG9hZFRlc3RSdW5uYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhM2QzMmEKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL3N0YXRzZC9hcHBzL3N0YXRzZGFwcC9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2N0cy9kZXZpY2Uvc3RhdHNkL1dha2Vsb2NrTG9hZFRlc3RSdW5uYWJsZS5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXIuY3RzLmRldmljZS5zdGF0c2Q7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBvd2VyTWFuYWdlcjsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKKworcHVibGljIGNsYXNzIFdha2Vsb2NrTG9hZFRlc3RSdW5uYWJsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKyAgICBTdHJpbmcgdGFnOworICAgIENvdW50RG93bkxhdGNoIGxhdGNoOworICAgIFdha2Vsb2NrTG9hZFRlc3RSdW5uYWJsZShTdHJpbmcgdCwgQ291bnREb3duTGF0Y2ggbCkgeworICAgICAgICB0YWcgPSB0OworICAgICAgICBsYXRjaCA9IGw7CisgICAgfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpOworICAgICAgICBQb3dlck1hbmFnZXIgcG0gPSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoUG93ZXJNYW5hZ2VyLmNsYXNzKTsKKyAgICAgICAgUG93ZXJNYW5hZ2VyLldha2VMb2NrIHdsID0gcG0ubmV3V2FrZUxvY2soUG93ZXJNYW5hZ2VyLlBBUlRJQUxfV0FLRV9MT0NLLCB0YWcpOworICAgICAgICBsb25nIHNsZWVwVGltZU5zID0gNzAwXzAwMDsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDA7IGkrKykgeworICAgICAgICAgICAgd2wuYWNxdWlyZSgpOworICAgICAgICAgICAgbG9uZyBzdGFydFRpbWUgPSBTeXN0ZW0ubmFub1RpbWUoKTsKKyAgICAgICAgICAgIHdoaWxlIChTeXN0ZW0ubmFub1RpbWUoKSAtIHN0YXJ0VGltZSA8IHNsZWVwVGltZU5zKSB7fQorICAgICAgICAgICAgd2wucmVsZWFzZSgpOworICAgICAgICAgICAgc3RhcnRUaW1lID0gU3lzdGVtLm5hbm9UaW1lKCk7CisgICAgICAgICAgICB3aGlsZSAoU3lzdGVtLm5hbm9UaW1lKCkgLSBzdGFydFRpbWUgPCBzbGVlcFRpbWVOcykge30KKyAgICAgICAgfQorICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc3RhdHNkL3NyYy9hbmRyb2lkL2N0cy9zdGF0c2QvYWxhcm0vQWxhcm1UZXN0cy5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zdGF0c2Qvc3JjL2FuZHJvaWQvY3RzL3N0YXRzZC9hbGFybS9BbGFybVRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk4M2QwNgotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvc3RhdHNkL3NyYy9hbmRyb2lkL2N0cy9zdGF0c2QvYWxhcm0vQWxhcm1UZXN0cy5qYXZhCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLmN0cy5zdGF0c2QuYWxhcm07CisKK2ltcG9ydCBhbmRyb2lkLmN0cy5zdGF0c2QuYXRvbS5BdG9tVGVzdENhc2U7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5vcy5TdGF0c2RDb25maWdQcm90bzsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5vcy5TdGF0c2RDb25maWdQcm90by5BbGFybTsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5vcy5TdGF0c2RDb25maWdQcm90by5JbmNpZGVudGREZXRhaWxzOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLm9zLlN0YXRzZENvbmZpZ1Byb3RvLlN0YXRzZENvbmZpZzsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5vcy5TdGF0c2RDb25maWdQcm90by5TdWJzY3JpcHRpb247CitpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQubG9nLkxvZ1V0aWwuQ0xvZzsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFN0YXRzZCBBbm9tYWx5IERldGVjdGlvbiB0ZXN0cy4KKyAqLworcHVibGljIGNsYXNzIEFsYXJtVGVzdHMgZXh0ZW5kcyBBdG9tVGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTdGF0c2QuQW5vbWFseURldGVjdGlvblRlc3RzIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gSU5DSURFTlREX1RFU1RTX0VOQUJMRUQgPSBmYWxzZTsKKworICAgIC8vIENvbmZpZyBjb25zdGFudHMKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUxBUk1fSUQgPSAxMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1VCU0NSSVBUSU9OX0lEX0lOQ0lERU5URCA9IDQxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTkNJREVOVERfU0VDVElPTiA9IC0xOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgaWYgKCFJTkNJREVOVERfVEVTVFNfRU5BQkxFRCkgeworICAgICAgICAgICAgQ0xvZy53KFRBRywgVEFHICsgIiBhbGFybSB0ZXN0cyBhcmUgZGlzYWJsZWQgYnkgYSBmbGFnLiBDaGFuZ2UgZmxhZyB0byB0cnVlIHRvIHJ1biIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFsYXJtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChzdGF0c2REaXNhYmxlZCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU3RhdHNkQ29uZmlnLkJ1aWxkZXIgY29uZmlnID0gZ2V0QmFzZUNvbmZpZygpOworICAgICAgICB0dXJuU2NyZWVuT24oKTsKKyAgICAgICAgdXBsb2FkQ29uZmlnKGNvbmZpZyk7CisKKyAgICAgICAgU3RyaW5nIG1hcmtUaW1lID0gZ2V0Q3VycmVudExvZ2NhdERhdGUoKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKDlfMDAwKTsKKworICAgICAgICBpZiAoSU5DSURFTlREX1RFU1RTX0VOQUJMRUQpIGFzc2VydFRydWUoIk5vIGluY2lkZW50IiwgZGlkSW5jaWRlbnRkRmlyZVNpbmNlKG1hcmtUaW1lKSk7CisgICAgfQorCisKKyAgICBwcml2YXRlIGZpbmFsIFN0YXRzZENvbmZpZy5CdWlsZGVyIGdldEJhc2VDb25maWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIFN0YXRzZENvbmZpZy5uZXdCdWlsZGVyKCkuc2V0SWQoQ09ORklHX0lEKQorICAgICAgICAgICAgICAgIC5hZGRBbGFybShBbGFybS5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJZChBTEFSTV9JRCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRPZmZzZXRNaWxsaXMoMikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQZXJpb2RNaWxsaXMoNV8wMDApIC8vIGV2ZXJ5IDUgc2Vjb25kcy4KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgLmFkZFN1YnNjcmlwdGlvbihTdWJzY3JpcHRpb24ubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0SWQoU1VCU0NSSVBUSU9OX0lEX0lOQ0lERU5URCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRSdWxlVHlwZShTdWJzY3JpcHRpb24uUnVsZVR5cGUuQUxBUk0pCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UnVsZUlkKEFMQVJNX0lEKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEluY2lkZW50ZERldGFpbHMoSW5jaWRlbnRkRGV0YWlscy5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFNlY3Rpb24oSU5DSURFTlREX1NFQ1RJT04pKQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAuYWRkQWxsb3dlZExvZ1NvdXJjZSgiQUlEX1NZU1RFTSIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc3RhdHNkL3NyYy9hbmRyb2lkL2N0cy9zdGF0c2QvYWxlcnQvQW5vbWFseURldGVjdGlvblRlc3RzLmphdmEgYi9ob3N0c2lkZXRlc3RzL3N0YXRzZC9zcmMvYW5kcm9pZC9jdHMvc3RhdHNkL2FsZXJ0L0Fub21hbHlEZXRlY3Rpb25UZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3OGE5Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL3N0YXRzZC9zcmMvYW5kcm9pZC9jdHMvc3RhdHNkL2FsZXJ0L0Fub21hbHlEZXRlY3Rpb25UZXN0cy5qYXZhCkBAIC0wLDAgKzEsNDM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5jdHMuc3RhdHNkLmFsZXJ0OworCitpbXBvcnQgYW5kcm9pZC5jdHMuc3RhdHNkLmF0b20uQXRvbVRlc3RDYXNlOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuU3RhdHNkQ29uZmlnUHJvdG87CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuU3RhdHNkQ29uZmlnUHJvdG8uQWxlcnQ7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuU3RhdHNkQ29uZmlnUHJvdG8uQ291bnRNZXRyaWM7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuU3RhdHNkQ29uZmlnUHJvdG8uRHVyYXRpb25NZXRyaWM7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuU3RhdHNkQ29uZmlnUHJvdG8uRmllbGRGaWx0ZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuU3RhdHNkQ29uZmlnUHJvdG8uRmllbGRNYXRjaGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLm9zLlN0YXRzZENvbmZpZ1Byb3RvLkdhdWdlTWV0cmljOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLm9zLlN0YXRzZENvbmZpZ1Byb3RvLkluY2lkZW50ZERldGFpbHM7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuU3RhdHNkQ29uZmlnUHJvdG8uUGVyZmV0dG9EZXRhaWxzOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLm9zLlN0YXRzZENvbmZpZ1Byb3RvLlN0YXRzZENvbmZpZzsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5vcy5TdGF0c2RDb25maWdQcm90by5TdWJzY3JpcHRpb247CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuU3RhdHNkQ29uZmlnUHJvdG8uVGltZVVuaXQ7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuU3RhdHNkQ29uZmlnUHJvdG8uVmFsdWVNZXRyaWM7CitpbXBvcnQgY29tLmFuZHJvaWQub3MuQXRvbXNQcm90by5Bbm9tYWx5RGV0ZWN0ZWQ7CitpbXBvcnQgY29tLmFuZHJvaWQub3MuQXRvbXNQcm90by5BcHBCcmVhZGNydW1iUmVwb3J0ZWQ7CitpbXBvcnQgY29tLmFuZHJvaWQub3MuQXRvbXNQcm90by5BdG9tOworaW1wb3J0IGNvbS5hbmRyb2lkLm9zLlN0YXRzTG9nLkV2ZW50TWV0cmljRGF0YTsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5sb2cuTG9nVXRpbC5DTG9nOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogU3RhdHNkIEFub21hbHkgRGV0ZWN0aW9uIHRlc3RzLgorICovCitwdWJsaWMgY2xhc3MgQW5vbWFseURldGVjdGlvblRlc3RzIGV4dGVuZHMgQXRvbVRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3RhdHNkLkFub21hbHlEZXRlY3Rpb25UZXN0cyI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIElOQ0lERU5URF9URVNUU19FTkFCTEVEID0gZmFsc2U7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBQRVJGRVRUT19URVNUU19FTkFCTEVEID0gZmFsc2U7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0FJVF9BRlRFUl9CUkVBRENSVU1CX01TID0gMjAwMDsKKworICAgIC8vIENvbmZpZyBjb25zdGFudHMKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVBQX0JSRUFEQ1JVTUJfUkVQT1JURURfTUFUQ0hfU1RBUlRfSUQgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBUFBfQlJFQURDUlVNQl9SRVBPUlRFRF9NQVRDSF9TVE9QX0lEID0gMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVUUklDX0lEID0gODsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUxFUlRfSUQgPSAxMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1VCU0NSSVBUSU9OX0lEX0lOQ0lERU5URCA9IDQxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVUJTQ1JJUFRJT05fSURfUEVSRkVUVE8gPSA0MjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQU5PTUFMWV9ERVRFQ1RfTUFUQ0hfSUQgPSAxMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQU5PTUFMWV9FVkVOVF9JRCA9IDEwMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5DSURFTlREX1NFQ1RJT04gPSAtMTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgIGlmICghSU5DSURFTlREX1RFU1RTX0VOQUJMRUQpIHsKKyAgICAgICAgICAgIENMb2cudyhUQUcsIFRBRyArICIgYW5vbWFseSB0ZXN0cyBhcmUgZGlzYWJsZWQgYnkgYSBmbGFnLiBDaGFuZ2UgZmxhZyB0byB0cnVlIHRvIHJ1biIpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVGVzdHMgdGhhdCBhbm9tYWx5IGRldGVjdGlvbiBmb3IgY291bnQgd29ya3MuCisgICAgLy8gQWxzbyB0ZXN0cyB0aGF0IGFub21hbHkgZGV0ZWN0aW9uIHdvcmtzIHdoZW4gc3Bhbm5pbmcgbXVsdGlwbGUgYnVja2V0cy4KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q291bnRBbm9tYWx5RGV0ZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChzdGF0c2REaXNhYmxlZCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU3RhdHNkQ29uZmlnLkJ1aWxkZXIgY29uZmlnID0gZ2V0QmFzZUNvbmZpZygxMCwgMjAsIDIgLyogdGhyZXNob2xkOiA+IDIgY291bnRzICovKQorICAgICAgICAgICAgICAgIC5hZGRDb3VudE1ldHJpYyhDb3VudE1ldHJpYy5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJZChNRVRSSUNfSUQpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0V2hhdChBUFBfQlJFQURDUlVNQl9SRVBPUlRFRF9NQVRDSF9TVEFSVF9JRCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRCdWNrZXQoVGltZVVuaXQuQ1RTKSAvLyAxIHNlY29uZAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2xpY2UgYnkgbGFiZWwKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXREaW1lbnNpb25zSW5XaGF0KEZpZWxkTWF0Y2hlci5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKEF0b20uQVBQX0JSRUFEQ1JVTUJfUkVQT1JURURfRklFTERfTlVNQkVSKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2hpbGQoRmllbGRNYXRjaGVyLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChBcHBCcmVhZGNydW1iUmVwb3J0ZWQuTEFCRUxfRklFTERfTlVNQkVSKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgdXBsb2FkQ29uZmlnKGNvbmZpZyk7CisKKyAgICAgICAgU3RyaW5nIG1hcmtUaW1lID0gZ2V0Q3VycmVudExvZ2NhdERhdGUoKTsKKyAgICAgICAgLy8gY291bnQobGFiZWw9NikgLT4gMSAobm90IGFuIGFub21hbHksIHNpbmNlIG5vdCAiZ3JlYXRlciB0aGFuIDIiKQorICAgICAgICBkb0FwcEJyZWFkY3J1bWJSZXBvcnRlZFN0YXJ0KDYpOworICAgICAgICBUaHJlYWQuc2xlZXAoNTAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJQcmVtYXR1cmUgYW5vbWFseSIsIDAsIGdldEV2ZW50TWV0cmljRGF0YUxpc3QoKS5zaXplKCkpOworICAgICAgICBpZiAoSU5DSURFTlREX1RFU1RTX0VOQUJMRUQpIGFzc2VydEZhbHNlKCJJbmNpZGVudCIsIGRpZEluY2lkZW50ZEZpcmVTaW5jZShtYXJrVGltZSkpOworCisgICAgICAgIC8vIGNvdW50KGxhYmVsPTYpIC0+IDIgKG5vdCBhbiBhbm9tYWx5LCBzaW5jZSBub3QgImdyZWF0ZXIgdGhhbiAyIikKKyAgICAgICAgZG9BcHBCcmVhZGNydW1iUmVwb3J0ZWRTdGFydCg2KTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKDUwMCk7CisgICAgICAgIGFzc2VydEVxdWFscygiUHJlbWF0dXJlIGFub21hbHkiLCAwLCBnZXRFdmVudE1ldHJpY0RhdGFMaXN0KCkuc2l6ZSgpKTsKKyAgICAgICAgaWYgKElOQ0lERU5URF9URVNUU19FTkFCTEVEKSBhc3NlcnRGYWxzZSgiSW5jaWRlbnQiLCBkaWRJbmNpZGVudGRGaXJlU2luY2UobWFya1RpbWUpKTsKKworICAgICAgICAvLyBjb3VudChsYWJlbD0xMikgLT4gMSAobm90IGFuIGFub21hbHksIHNpbmNlIG5vdCAiZ3JlYXRlciB0aGFuIDIiKQorICAgICAgICBkb0FwcEJyZWFkY3J1bWJSZXBvcnRlZFN0YXJ0KDEyKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOworICAgICAgICBhc3NlcnRFcXVhbHMoIlByZW1hdHVyZSBhbm9tYWx5IiwgMCwgZ2V0RXZlbnRNZXRyaWNEYXRhTGlzdCgpLnNpemUoKSk7CisgICAgICAgIGlmIChJTkNJREVOVERfVEVTVFNfRU5BQkxFRCkgYXNzZXJ0RmFsc2UoIkluY2lkZW50IiwgZGlkSW5jaWRlbnRkRmlyZVNpbmNlKG1hcmtUaW1lKSk7CisKKyAgICAgICAgZG9BcHBCcmVhZGNydW1iUmVwb3J0ZWRTdGFydCg2KTsgLy8gY291bnQobGFiZWw9NikgLT4gMyAoYW5vbWFseSwgc2luY2UgImdyZWF0ZXIgdGhhbiAyIiEpCisgICAgICAgIFRocmVhZC5zbGVlcChXQUlUX0FGVEVSX0JSRUFEQ1JVTUJfTVMpOworCisgICAgICAgIExpc3Q8RXZlbnRNZXRyaWNEYXRhPiBkYXRhID0gZ2V0RXZlbnRNZXRyaWNEYXRhTGlzdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIDEgYW5vbWFseSIsIDEsIGRhdGEuc2l6ZSgpKTsKKyAgICAgICAgQW5vbWFseURldGVjdGVkIGEgPSBkYXRhLmdldCgwKS5nZXRBdG9tKCkuZ2V0QW5vbWFseURldGVjdGVkKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiV3JvbmcgYWxlcnRfaWQiLCBBTEVSVF9JRCwgYS5nZXRBbGVydElkKCkpOworICAgICAgICBpZiAoSU5DSURFTlREX1RFU1RTX0VOQUJMRUQpIGFzc2VydFRydWUoIk5vIGluY2lkZW50IiwgZGlkSW5jaWRlbnRkRmlyZVNpbmNlKG1hcmtUaW1lKSk7CisgICAgfQorCisgICAgLy8gVGVzdHMgdGhhdCBhbm9tYWx5IGRldGVjdGlvbiBmb3IgZHVyYXRpb24gd29ya3MuCisgICAgLy8gQWxzbyB0ZXN0cyB0aGF0IHJlZnJhY3RvcnkgcGVyaW9kcyBpbiBhbm9tYWx5IGRldGVjdGlvbiB3b3JrLgorICAgIHB1YmxpYyB2b2lkIHRlc3REdXJhdGlvbkFub21hbHlEZXRlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHN0YXRzZERpc2FibGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBpbnQgQVBQX0JSRUFEQ1JVTUJfUkVQT1JURURfSVNfT05fUFJFRElDQVRFID0gMTQyMzsKKyAgICAgICAgU3RhdHNkQ29uZmlnLkJ1aWxkZXIgY29uZmlnID0KKyAgICAgICAgICAgICAgICBnZXRCYXNlQ29uZmlnKDE3LCAxNywgMTBfMDAwXzAwMF8wMDBMICAvKnRocmVzaG9sZDogPiAxMCBzZWNvbmRzIGluIG5hbm9zZWNvbmRzKi8pCisgICAgICAgICAgICAgICAgICAgICAgICAuYWRkRHVyYXRpb25NZXRyaWMoRHVyYXRpb25NZXRyaWMubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJZChNRVRSSUNfSUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRXaGF0KEFQUF9CUkVBRENSVU1CX1JFUE9SVEVEX0lTX09OX1BSRURJQ0FURSkgLy8gcHJlZGljYXRlIGJlbG93CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRBZ2dyZWdhdGlvblR5cGUoRHVyYXRpb25NZXRyaWMuQWdncmVnYXRpb25UeXBlLlNVTSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEJ1Y2tldChUaW1lVW5pdC5DVFMpIC8vIDEgc2Vjb25kCisgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUHJlZGljYXRlKFN0YXRzZENvbmZpZ1Byb3RvLlByZWRpY2F0ZS5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldElkKEFQUF9CUkVBRENSVU1CX1JFUE9SVEVEX0lTX09OX1BSRURJQ0FURSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFNpbXBsZVByZWRpY2F0ZShTdGF0c2RDb25maWdQcm90by5TaW1wbGVQcmVkaWNhdGUubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFN0YXJ0KEFQUF9CUkVBRENSVU1CX1JFUE9SVEVEX01BVENIX1NUQVJUX0lEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTdG9wKEFQUF9CUkVBRENSVU1CX1JFUE9SVEVEX01BVENIX1NUT1BfSUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIHVwbG9hZENvbmZpZyhjb25maWcpOworCisgICAgICAgIC8vIFNpbmNlIHRpbWluZyBpcyBjcnVjaWFsIGFuZCBjaGVja2luZyBsb2djYXQgZm9yIGluY2lkZW50ZCBpcyBzbG93LCB3ZSBkb24ndCB0ZXN0IGZvciBpdC4KKworICAgICAgICAvLyBUZXN0IHRoYXQgYWxhcm0gZG9lc24ndCBmaXJlIGVhcmx5LgorICAgICAgICBTdHJpbmcgbWFya1RpbWUgPSBnZXRDdXJyZW50TG9nY2F0RGF0ZSgpOworICAgICAgICBkb0FwcEJyZWFkY3J1bWJSZXBvcnRlZFN0YXJ0KDEpOworICAgICAgICBUaHJlYWQuc2xlZXAoNl8wMDApOyAgLy8gUmVjb3JkZWQgZHVyYXRpb24gYXQgZW5kOiA2cworICAgICAgICBhc3NlcnRFcXVhbHMoIlByZW1hdHVyZSBhbm9tYWx5LCIsIDAsIGdldEV2ZW50TWV0cmljRGF0YUxpc3QoKS5zaXplKCkpOworCisgICAgICAgIGRvQXBwQnJlYWRjcnVtYlJlcG9ydGVkU3RvcCgxKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKDRfMDAwKTsgIC8vIFJlY29yZGVkIGR1cmF0aW9uIGF0IGVuZDogNnMKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJQcmVtYXR1cmUgYW5vbWFseSwiLCAwLCBnZXRFdmVudE1ldHJpY0RhdGFMaXN0KCkuc2l6ZSgpKTsKKworICAgICAgICAvLyBUZXN0IHRoYXQgYWxhcm0gZG9lcyBmaXJlIHdoZW4gaXQgaXMgc3VwcG9zZWQgdG8gKGFmdGVyIDRzLCBwbHVzIHVwIHRvIDVzIGFsYXJtIGRlbGF5KS4KKyAgICAgICAgZG9BcHBCcmVhZGNydW1iUmVwb3J0ZWRTdGFydCgxKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKDlfMDAwKTsgIC8vIFJlY29yZGVkIGR1cmF0aW9uIGF0IGVuZDogMTNzCisgICAgICAgIExpc3Q8RXZlbnRNZXRyaWNEYXRhPiBkYXRhID0gZ2V0RXZlbnRNZXRyaWNEYXRhTGlzdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIGFuIGFub21hbHksIiwgMSwgZGF0YS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoQUxFUlRfSUQsIGRhdGEuZ2V0KDApLmdldEF0b20oKS5nZXRBbm9tYWx5RGV0ZWN0ZWQoKS5nZXRBbGVydElkKCkpOworCisgICAgICAgIC8vIE5vdyB0ZXN0IHRoYXQgdGhlIHJlZnJhY3RvcnkgcGVyaW9kIGlzIG9iZXllZC4KKyAgICAgICAgbWFya1RpbWUgPSBnZXRDdXJyZW50TG9nY2F0RGF0ZSgpOworICAgICAgICBkb0FwcEJyZWFkY3J1bWJSZXBvcnRlZFN0b3AoMSk7CisgICAgICAgIGRvQXBwQnJlYWRjcnVtYlJlcG9ydGVkU3RhcnQoMSk7CisgICAgICAgIFRocmVhZC5zbGVlcCgzXzAwMCk7ICAvLyBSZWNvcmRlZCBkdXJhdGlvbiBhdCBlbmQ6IDEzcworICAgICAgICAvLyBOQjogdGhlIHByZXZpb3VzIGdldEV2ZW50TWV0cmljRGF0YUxpc3QgYWxzbyByZW1vdmVzIHRoZSByZXBvcnQsIHNvIHNpemUgaXMgYmFjayB0byAwLgorICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIG9ubHkgMSBhbm9tYWx5LCIsIDAsIGdldEV2ZW50TWV0cmljRGF0YUxpc3QoKS5zaXplKCkpOworCisgICAgICAgIC8vIFRlc3QgdGhhdCBkZXRlY3Rpb24gd29ya3MgYWdhaW4gYWZ0ZXIgcmVmcmFjdG9yeSBwZXJpb2QgZmluaXNoZXMuCisgICAgICAgIGRvQXBwQnJlYWRjcnVtYlJlcG9ydGVkU3RvcCgxKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKDhfMDAwKTsgIC8vIFJlY29yZGVkIGR1cmF0aW9uIGF0IGVuZDogOXMKKyAgICAgICAgZG9BcHBCcmVhZGNydW1iUmVwb3J0ZWRTdGFydCgxKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKDE1XzAwMCk7ICAvLyBSZWNvcmRlZCBkdXJhdGlvbiBhdCBlbmQ6IDE1cworICAgICAgICAvLyBXZSBjYW4gZG8gYW4gaW5jaWRlbnRkIHRlc3Qgbm93IHRoYXQgYWxsIHRoZSB0aW1pbmcgaXNzdWVzIGFyZSBkb25lLgorICAgICAgICBkYXRhID0gZ2V0RXZlbnRNZXRyaWNEYXRhTGlzdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIGFub3RoZXIgYW5vbWFseSwiLCAxLCBkYXRhLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhBTEVSVF9JRCwgZGF0YS5nZXQoMCkuZ2V0QXRvbSgpLmdldEFub21hbHlEZXRlY3RlZCgpLmdldEFsZXJ0SWQoKSk7CisgICAgICAgIGlmIChJTkNJREVOVERfVEVTVFNfRU5BQkxFRCkgYXNzZXJ0VHJ1ZSgiTm8gaW5jaWRlbnQiLCBkaWRJbmNpZGVudGRGaXJlU2luY2UobWFya1RpbWUpKTsKKworICAgICAgICBkb0FwcEJyZWFkY3J1bWJSZXBvcnRlZFN0b3AoMSk7CisgICAgfQorCisgICAgLy8gVGVzdHMgdGhhdCBhbm9tYWx5IGRldGVjdGlvbiBmb3IgZHVyYXRpb24gd29ya3MgZXZlbiB3aGVuIHRoZSBhbGFybSBmaXJlcyB0b28gbGF0ZS4KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RHVyYXRpb25Bbm9tYWx5RGV0ZWN0aW9uRm9yTGF0ZUFsYXJtcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoc3RhdHNkRGlzYWJsZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZpbmFsIGludCBBUFBfQlJFQURDUlVNQl9SRVBPUlRFRF9JU19PTl9QUkVESUNBVEUgPSAxNDIzOworICAgICAgICBTdGF0c2RDb25maWcuQnVpbGRlciBjb25maWcgPQorICAgICAgICAgICAgICAgIGdldEJhc2VDb25maWcoNTAsIDAsIDZfMDAwXzAwMF8wMDBMIC8qIHRocmVzaG9sZDogPiA2IHNlY29uZHMgaW4gbmFub3NlY29uZHMgKi8pCisgICAgICAgICAgICAgICAgICAgICAgICAuYWRkRHVyYXRpb25NZXRyaWMoRHVyYXRpb25NZXRyaWMubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJZChNRVRSSUNfSUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRXaGF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQUF9CUkVBRENSVU1CX1JFUE9SVEVEX0lTX09OX1BSRURJQ0FURSkgLy8gUHJlZGljYXRlIGJlbG93LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0QWdncmVnYXRpb25UeXBlKER1cmF0aW9uTWV0cmljLkFnZ3JlZ2F0aW9uVHlwZS5TVU0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRCdWNrZXQoVGltZVVuaXQuQ1RTKSAvLyAxIHNlY29uZAorICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFByZWRpY2F0ZShTdGF0c2RDb25maWdQcm90by5QcmVkaWNhdGUubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJZChBUFBfQlJFQURDUlVNQl9SRVBPUlRFRF9JU19PTl9QUkVESUNBVEUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTaW1wbGVQcmVkaWNhdGUoU3RhdHNkQ29uZmlnUHJvdG8uU2ltcGxlUHJlZGljYXRlLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTdGFydChBUFBfQlJFQURDUlVNQl9SRVBPUlRFRF9NQVRDSF9TVEFSVF9JRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0U3RvcChBUFBfQlJFQURDUlVNQl9SRVBPUlRFRF9NQVRDSF9TVE9QX0lEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICB1cGxvYWRDb25maWcoY29uZmlnKTsKKworICAgICAgICBkb0FwcEJyZWFkY3J1bWJSZXBvcnRlZFN0YXJ0KDEpOworICAgICAgICBUaHJlYWQuc2xlZXAoNV8wMDApOworICAgICAgICBkb0FwcEJyZWFkY3J1bWJSZXBvcnRlZFN0b3AoMSk7CisgICAgICAgIFRocmVhZC5zbGVlcCgyXzAwMCk7CisgICAgICAgIGFzc2VydEVxdWFscygiUHJlbWF0dXJlIGFub21hbHksIiwgMCwgZ2V0RXZlbnRNZXRyaWNEYXRhTGlzdCgpLnNpemUoKSk7CisKKyAgICAgICAgLy8gVGVzdCB0aGF0IGFsYXJtIGRvZXMgZmlyZSB3aGVuIGl0IGlzIHN1cHBvc2VkIHRvLgorICAgICAgICAvLyBUaGUgYW5vbWFseSBvY2N1cnMgaW4gMXMsIGJ1dCBhbGFybXMgd29uJ3QgZmlyZSB0aGF0IHF1aWNrbHkuCisgICAgICAgIC8vIEl0IGlzIGxpa2VseSB0aGF0IHRoZSBhbGFybSB3aWxsIG9ubHkgZmlyZSBhZnRlciB0aGlzIHBlcmlvZCBpcyBhbHJlYWR5IG92ZXIsIGJ1dCB0aGUKKyAgICAgICAgLy8gYW5vbWFseSBzaG91bGQgbm9uZXRoZWxlc3MgYmUgZGV0ZWN0ZWQgd2hlbiB0aGUgZXZlbnQgc3RvcHMuCisgICAgICAgIGRvQXBwQnJlYWRjcnVtYlJlcG9ydGVkU3RhcnQoMSk7CisgICAgICAgIFRocmVhZC5zbGVlcCgxXzIwMCk7CisgICAgICAgIC8vIEFub21hbHkgc2hvdWxkIGJlIGRldGVjdGVkIGhlcmUgaWYgdGhlIGFsYXJtIGRpZG4ndCBmaXJlIHlldC4KKyAgICAgICAgZG9BcHBCcmVhZGNydW1iUmVwb3J0ZWRTdG9wKDEpOworICAgICAgICBUaHJlYWQuc2xlZXAoMjAwKTsKKyAgICAgICAgTGlzdDxFdmVudE1ldHJpY0RhdGE+IGRhdGEgPSBnZXRFdmVudE1ldHJpY0RhdGFMaXN0KCk7CisgICAgICAgIGlmIChkYXRhLnNpemUoKSA9PSAyKSB7CisgICAgICAgICAgICAvLyBBbHRob3VnaCB3ZSBleHBlY3QgdGhhdCB0aGUgYWxhcm0gd29uJ3QgZmlyZSwgd2UgY2VydGFpbmx5IGNhbm5vdCBkZW1hbmQgdGhhdC4KKyAgICAgICAgICAgIENMb2cudyhUQUcsICJUaGUgYW5vbWFseSB3YXMgZGV0ZWN0ZWQgdHdpY2UuIFByZXN1bWFibHkgdGhlIGFsYXJtIGRpZCBtYW5hZ2UgdG8gZmlyZS4iKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCAxIChvciBwb3NzaWJseSAyKSBhbm9tYWxpZXMsIGluc3RlYWQgb2YgIiArIGRhdGEuc2l6ZSgpLAorICAgICAgICAgICAgICAgIDEgPT0gZGF0YS5zaXplKCkgfHwgMiA9PSBkYXRhLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhBTEVSVF9JRCwgZGF0YS5nZXQoMCkuZ2V0QXRvbSgpLmdldEFub21hbHlEZXRlY3RlZCgpLmdldEFsZXJ0SWQoKSk7CisgICAgfQorCisgICAgLy8gVGVzdHMgdGhhdCBhbm9tYWx5IGRldGVjdGlvbiBmb3IgdmFsdWUgd29ya3MuCisgICAgcHVibGljIHZvaWQgdGVzdFZhbHVlQW5vbWFseURldGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoc3RhdHNkRGlzYWJsZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFN0YXRzZENvbmZpZy5CdWlsZGVyIGNvbmZpZyA9IGdldEJhc2VDb25maWcoNCwgMCwgNiAvKiB0aHJlc2hvbGQ6IHZhbHVlID4gNiAqLykKKyAgICAgICAgICAgICAgICAuYWRkVmFsdWVNZXRyaWMoVmFsdWVNZXRyaWMubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0SWQoTUVUUklDX0lEKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFdoYXQoQVBQX0JSRUFEQ1JVTUJfUkVQT1JURURfTUFUQ0hfU1RBUlRfSUQpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0QnVja2V0KFRpbWVVbml0Lk9ORV9NSU5VVEUpCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIGxhYmVsIGZpZWxkJ3MgdmFsdWU6CisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0VmFsdWVGaWVsZChGaWVsZE1hdGNoZXIubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChBdG9tLkFQUF9CUkVBRENSVU1CX1JFUE9SVEVEX0ZJRUxEX05VTUJFUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENoaWxkKEZpZWxkTWF0Y2hlci5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoQXBwQnJlYWRjcnVtYlJlcG9ydGVkLkxBQkVMX0ZJRUxEX05VTUJFUikpCisgICAgICAgICAgICAgICAgICAgICAgICApCisKKyAgICAgICAgICAgICAgICApOworICAgICAgICB1cGxvYWRDb25maWcoY29uZmlnKTsKKworICAgICAgICBTdHJpbmcgbWFya1RpbWUgPSBnZXRDdXJyZW50TG9nY2F0RGF0ZSgpOworICAgICAgICBkb0FwcEJyZWFkY3J1bWJSZXBvcnRlZFN0YXJ0KDYpOyAvLyB2YWx1ZSA9IDYsIHdoaWNoIGlzIE5PVCA+IHRyaWdnZXIKKyAgICAgICAgVGhyZWFkLnNsZWVwKFdBSVRfQUZURVJfQlJFQURDUlVNQl9NUyk7CisgICAgICAgIGFzc2VydEVxdWFscygiUHJlbWF0dXJlIGFub21hbHkiLCAwLCBnZXRFdmVudE1ldHJpY0RhdGFMaXN0KCkuc2l6ZSgpKTsKKyAgICAgICAgaWYgKElOQ0lERU5URF9URVNUU19FTkFCTEVEKSBhc3NlcnRGYWxzZSgiSW5jaWRlbnQiLCBkaWRJbmNpZGVudGRGaXJlU2luY2UobWFya1RpbWUpKTsKKworICAgICAgICBkb0FwcEJyZWFkY3J1bWJSZXBvcnRlZFN0YXJ0KDE0KTsgLy8gdmFsdWUgPSAxNCA+IHRyaWdnZXIKKyAgICAgICAgVGhyZWFkLnNsZWVwKFdBSVRfQUZURVJfQlJFQURDUlVNQl9NUyk7CisKKyAgICAgICAgTGlzdDxFdmVudE1ldHJpY0RhdGE+IGRhdGEgPSBnZXRFdmVudE1ldHJpY0RhdGFMaXN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiRXhwZWN0ZWQgMSBhbm9tYWx5IiwgMSwgZGF0YS5zaXplKCkpOworICAgICAgICBBbm9tYWx5RGV0ZWN0ZWQgYSA9IGRhdGEuZ2V0KDApLmdldEF0b20oKS5nZXRBbm9tYWx5RGV0ZWN0ZWQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBhbGVydF9pZCIsIEFMRVJUX0lELCBhLmdldEFsZXJ0SWQoKSk7CisgICAgICAgIGlmIChJTkNJREVOVERfVEVTVFNfRU5BQkxFRCkgYXNzZXJ0VHJ1ZSgiTm8gaW5jaWRlbnQiLCBkaWRJbmNpZGVudGRGaXJlU2luY2UobWFya1RpbWUpKTsKKyAgICB9CisKKyAgICAvLyBUZXN0IHRoYXQgYW5vbWFseSBkZXRlY3Rpb24gaW50ZWdyYXRlcyB3aXRoIHBlcmZldHRvIHByb3Blcmx5LgorICAgIHB1YmxpYyB2b2lkIHRlc3RQZXJmZXR0bygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoc3RhdHNkRGlzYWJsZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBjaGFycyA9IGdldERldmljZSgpLmdldFByb3BlcnR5KCJyby5idWlsZC5jaGFyYWN0ZXJpc3RpY3MiKTsKKyAgICAgICAgaWYgKGNoYXJzLmNvbnRhaW5zKCJ3YXRjaCIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgU3RhdHNkQ29uZmlnLkJ1aWxkZXIgY29uZmlnID0gZ2V0QmFzZUNvbmZpZyg0LCAwLCA2IC8qIHRocmVzaG9sZDogdmFsdWUgPiA2ICovKQorICAgICAgICAgICAgICAgIC5hZGRTdWJzY3JpcHRpb24oU3Vic2NyaXB0aW9uLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldElkKFNVQlNDUklQVElPTl9JRF9QRVJGRVRUTykKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRSdWxlVHlwZShTdWJzY3JpcHRpb24uUnVsZVR5cGUuQUxFUlQpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UnVsZUlkKEFMRVJUX0lEKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFBlcmZldHRvRGV0YWlscyhQZXJmZXR0b0RldGFpbHMubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRUcmFjZUNvbmZpZyhjcmVhdGVQZXJmZXR0b1RyYWNlQ29uZmlnKCkpCisgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIC5hZGRWYWx1ZU1ldHJpYyhWYWx1ZU1ldHJpYy5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJZChNRVRSSUNfSUQpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0V2hhdChBUFBfQlJFQURDUlVNQl9SRVBPUlRFRF9NQVRDSF9TVEFSVF9JRCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRCdWNrZXQoVGltZVVuaXQuT05FX01JTlVURSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbGFiZWwgZmllbGQncyB2YWx1ZToKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZUZpZWxkKEZpZWxkTWF0Y2hlci5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKEF0b20uQVBQX0JSRUFEQ1JVTUJfUkVQT1JURURfRklFTERfTlVNQkVSKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2hpbGQoRmllbGRNYXRjaGVyLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChBcHBCcmVhZGNydW1iUmVwb3J0ZWQuTEFCRUxfRklFTERfTlVNQkVSKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICkKKworICAgICAgICAgICAgICAgICk7CisgICAgICAgIHVwbG9hZENvbmZpZyhjb25maWcpOworCisgICAgICAgIFN0cmluZyBtYXJrVGltZSA9IGdldEN1cnJlbnRMb2djYXREYXRlKCk7CisgICAgICAgIGRvQXBwQnJlYWRjcnVtYlJlcG9ydGVkU3RhcnQoNik7IC8vIHZhbHVlID0gNiwgd2hpY2ggaXMgTk9UID4gdHJpZ2dlcgorICAgICAgICBUaHJlYWQuc2xlZXAoV0FJVF9BRlRFUl9CUkVBRENSVU1CX01TKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJQcmVtYXR1cmUgYW5vbWFseSIsIDAsIGdldEV2ZW50TWV0cmljRGF0YUxpc3QoKS5zaXplKCkpOworICAgICAgICBpZiAoUEVSRkVUVE9fVEVTVFNfRU5BQkxFRCkgYXNzZXJ0RmFsc2UoIlBlZmV0dG8iLCBkaWRQZXJmZXR0b1N0YXJ0U2luY2UobWFya1RpbWUpKTsKKworICAgICAgICBkb0FwcEJyZWFkY3J1bWJSZXBvcnRlZFN0YXJ0KDE0KTsgLy8gdmFsdWUgPSAxNCA+IHRyaWdnZXIKKyAgICAgICAgVGhyZWFkLnNsZWVwKFdBSVRfQUZURVJfQlJFQURDUlVNQl9NUyk7CisKKyAgICAgICAgTGlzdDxFdmVudE1ldHJpY0RhdGE+IGRhdGEgPSBnZXRFdmVudE1ldHJpY0RhdGFMaXN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiRXhwZWN0ZWQgMSBhbm9tYWx5IiwgMSwgZGF0YS5zaXplKCkpOworICAgICAgICBBbm9tYWx5RGV0ZWN0ZWQgYSA9IGRhdGEuZ2V0KDApLmdldEF0b20oKS5nZXRBbm9tYWx5RGV0ZWN0ZWQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBhbGVydF9pZCIsIEFMRVJUX0lELCBhLmdldEFsZXJ0SWQoKSk7CisgICAgICAgIGlmIChQRVJGRVRUT19URVNUU19FTkFCTEVEKSBhc3NlcnRUcnVlKCJObyBwZXJmZXR0byIsIGRpZFBlcmZldHRvU3RhcnRTaW5jZShtYXJrVGltZSkpOworICAgIH0KKworICAgIC8vIFRlc3RzIHRoYXQgYW5vbWFseSBkZXRlY3Rpb24gZm9yIGdhdWdlIHdvcmtzLgorICAgIHB1YmxpYyB2b2lkIHRlc3RHYXVnZUFub21hbHlEZXRlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHN0YXRzZERpc2FibGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBTdGF0c2RDb25maWcuQnVpbGRlciBjb25maWcgPSBnZXRCYXNlQ29uZmlnKDEsIDIwLCA2IC8qIHRocmVzaG9sZDogdmFsdWUgPiA2ICovKQorICAgICAgICAgICAgICAgIC5hZGRHYXVnZU1ldHJpYyhHYXVnZU1ldHJpYy5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJZChNRVRSSUNfSUQpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0V2hhdChBUFBfQlJFQURDUlVNQl9SRVBPUlRFRF9NQVRDSF9TVEFSVF9JRCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRCdWNrZXQoVGltZVVuaXQuQ1RTKQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBsYWJlbCBmaWVsZCdzIHZhbHVlIGludG8gdGhlIGdhdWdlOgorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEdhdWdlRmllbGRzRmlsdGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZEZpbHRlci5uZXdCdWlsZGVyKCkuc2V0RmllbGRzKEZpZWxkTWF0Y2hlci5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoQXRvbS5BUFBfQlJFQURDUlVNQl9SRVBPUlRFRF9GSUVMRF9OVU1CRVIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENoaWxkKEZpZWxkTWF0Y2hlci5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChBcHBCcmVhZGNydW1iUmVwb3J0ZWQuTEFCRUxfRklFTERfTlVNQkVSKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICk7CisgICAgICAgIHVwbG9hZENvbmZpZyhjb25maWcpOworCisgICAgICAgIFN0cmluZyBtYXJrVGltZSA9IGdldEN1cnJlbnRMb2djYXREYXRlKCk7CisgICAgICAgIGRvQXBwQnJlYWRjcnVtYlJlcG9ydGVkU3RhcnQoNik7IC8vIGdhdWdlID0gNiwgd2hpY2ggaXMgTk9UID4gdHJpZ2dlcgorICAgICAgICBUaHJlYWQuc2xlZXAoTWF0aC5tYXgoV0FJVF9BRlRFUl9CUkVBRENSVU1CX01TLCAxXzEwMCkpOyAvLyBNdXN0IGJlID4xcyB0byBwdXNoIG5leHQgYnVja2V0LgorICAgICAgICBhc3NlcnRFcXVhbHMoIlByZW1hdHVyZSBhbm9tYWx5IiwgMCwgZ2V0RXZlbnRNZXRyaWNEYXRhTGlzdCgpLnNpemUoKSk7CisgICAgICAgIGlmIChJTkNJREVOVERfVEVTVFNfRU5BQkxFRCkgYXNzZXJ0RmFsc2UoIkluY2lkZW50IiwgZGlkSW5jaWRlbnRkRmlyZVNpbmNlKG1hcmtUaW1lKSk7CisKKyAgICAgICAgLy8gV2Ugd2FpdGVkIGZvciA+MXMgYWJvdmUsIHNvIHdlIGFyZSBub3cgaW4gdGhlIG5leHQgYnVja2V0ICh3aGljaCBpcyBlc3NlbnRpYWwpLgorICAgICAgICBkb0FwcEJyZWFkY3J1bWJSZXBvcnRlZFN0YXJ0KDE0KTsgLy8gZ2F1Z2UgPSAxNCA+IHRyaWdnZXIKKyAgICAgICAgVGhyZWFkLnNsZWVwKFdBSVRfQUZURVJfQlJFQURDUlVNQl9NUyk7CisKKyAgICAgICAgTGlzdDxFdmVudE1ldHJpY0RhdGE+IGRhdGEgPSBnZXRFdmVudE1ldHJpY0RhdGFMaXN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiRXhwZWN0ZWQgMSBhbm9tYWx5IiwgMSwgZGF0YS5zaXplKCkpOworICAgICAgICBBbm9tYWx5RGV0ZWN0ZWQgYSA9IGRhdGEuZ2V0KDApLmdldEF0b20oKS5nZXRBbm9tYWx5RGV0ZWN0ZWQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBhbGVydF9pZCIsIEFMRVJUX0lELCBhLmdldEFsZXJ0SWQoKSk7CisgICAgICAgIGlmIChJTkNJREVOVERfVEVTVFNfRU5BQkxFRCkgYXNzZXJ0VHJ1ZSgiTm8gaW5jaWRlbnQiLCBkaWRJbmNpZGVudGRGaXJlU2luY2UobWFya1RpbWUpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIFN0YXRzZENvbmZpZy5CdWlsZGVyIGdldEJhc2VDb25maWcoaW50IG51bUJ1Y2tldHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWZyYWN0b3J5U2VjcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyB0cmlnZ2VySWZTdW1HdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBTdGF0c2RDb25maWcubmV3QnVpbGRlcigpLnNldElkKENPTkZJR19JRCkKKyAgICAgICAgICAgICAgICAvLyBJdGVtcyBvZiByZWxldmFuY2UgZm9yIGRldGVjdGluZyB0aGUgYW5vbWFseToKKyAgICAgICAgICAgICAgICAuYWRkQXRvbU1hdGNoZXIoU3RhdHNkQ29uZmlnUHJvdG8uQXRvbU1hdGNoZXIubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0SWQoQVBQX0JSRUFEQ1JVTUJfUkVQT1JURURfTUFUQ0hfU1RBUlRfSUQpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0U2ltcGxlQXRvbU1hdGNoZXIoU3RhdHNkQ29uZmlnUHJvdG8uU2ltcGxlQXRvbU1hdGNoZXIubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRBdG9tSWQoQXRvbS5BUFBfQlJFQURDUlVNQl9SRVBPUlRFRF9GSUVMRF9OVU1CRVIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV2ZW50IG9ubHkgd2hlbiB0aGUgdWlkIGlzIHRoaXMgYXBwJ3MgdWlkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkRmllbGRWYWx1ZU1hdGNoZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlRnZtKEFwcEJyZWFkY3J1bWJSZXBvcnRlZC5VSURfRklFTERfTlVNQkVSKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEVxSW50KGdldEhvc3RVaWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkRmllbGRWYWx1ZU1hdGNoZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlRnZtKEFwcEJyZWFkY3J1bWJSZXBvcnRlZC5TVEFURV9GSUVMRF9OVU1CRVIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RXFJbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwcEJyZWFkY3J1bWJSZXBvcnRlZC5TdGF0ZS5TVEFSVC5vcmRpbmFsKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgLmFkZEF0b21NYXRjaGVyKFN0YXRzZENvbmZpZ1Byb3RvLkF0b21NYXRjaGVyLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldElkKEFQUF9CUkVBRENSVU1CX1JFUE9SVEVEX01BVENIX1NUT1BfSUQpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0U2ltcGxlQXRvbU1hdGNoZXIoU3RhdHNkQ29uZmlnUHJvdG8uU2ltcGxlQXRvbU1hdGNoZXIubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRBdG9tSWQoQXRvbS5BUFBfQlJFQURDUlVNQl9SRVBPUlRFRF9GSUVMRF9OVU1CRVIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV2ZW50IG9ubHkgd2hlbiB0aGUgdWlkIGlzIHRoaXMgYXBwJ3MgdWlkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkRmllbGRWYWx1ZU1hdGNoZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlRnZtKEFwcEJyZWFkY3J1bWJSZXBvcnRlZC5VSURfRklFTERfTlVNQkVSKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEVxSW50KGdldEhvc3RVaWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkRmllbGRWYWx1ZU1hdGNoZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlRnZtKEFwcEJyZWFkY3J1bWJSZXBvcnRlZC5TVEFURV9GSUVMRF9OVU1CRVIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RXFJbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwcEJyZWFkY3J1bWJSZXBvcnRlZC5TdGF0ZS5TVE9QLm9yZGluYWwoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAuYWRkQWxlcnQoQWxlcnQubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0SWQoQUxFUlRfSUQpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0TWV0cmljSWQoTUVUUklDX0lEKSAvLyBUaGUgbWV0cmljIGl0c2VsZiBtdXN0IHlldCBiZSBhZGRlZCBieSB0aGUgdGVzdC4KKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXROdW1CdWNrZXRzKG51bUJ1Y2tldHMpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UmVmcmFjdG9yeVBlcmlvZFNlY3MocmVmcmFjdG9yeVNlY3MpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0VHJpZ2dlcklmU3VtR3QodHJpZ2dlcklmU3VtR3QpCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIC5hZGRTdWJzY3JpcHRpb24oU3Vic2NyaXB0aW9uLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldElkKFNVQlNDUklQVElPTl9JRF9JTkNJREVOVEQpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UnVsZVR5cGUoU3Vic2NyaXB0aW9uLlJ1bGVUeXBlLkFMRVJUKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFJ1bGVJZChBTEVSVF9JRCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJbmNpZGVudGREZXRhaWxzKEluY2lkZW50ZERldGFpbHMubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRTZWN0aW9uKElOQ0lERU5URF9TRUNUSU9OKSkKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgLy8gV2Ugd2FudCB0byB0cmlnZ2VyIGFub21hbGllcyBvbiBNRVRSSUNfSUQsIGJ1dCBkb24ndCB3YW50IHRoZSBhY3R1YWwgZGF0YS4KKyAgICAgICAgICAgICAgICAuYWRkTm9SZXBvcnRNZXRyaWMoTUVUUklDX0lEKQorICAgICAgICAgICAgICAgIC5hZGRBbGxvd2VkTG9nU291cmNlKCJBSURfUk9PVCIpIC8vIG5lZWRlZCBmb3IgQXBwQnJlYWRjcnVtYiAoaWYgcm9vdGVkKQorICAgICAgICAgICAgICAgIC5hZGRBbGxvd2VkTG9nU291cmNlKCJBSURfU0hFTEwiKSAvLyBuZWVkZWQgZm9yIEFwcEJyZWFkY3J1bWIgKGlmIHVucm9vdGVkKQorICAgICAgICAgICAgICAgIC5hZGRBbGxvd2VkTG9nU291cmNlKCJBSURfU1RBVFNEIikgLy8gbmVlZGVkIGZvciBBbm9tYWx5RGV0ZWN0ZWQKKyAgICAgICAgICAgICAgICAvLyBObyBuZWVkIGluIHRoaXMgdGVzdCBmb3IgLmFkZEFsbG93ZWRMb2dTb3VyY2UoIkFJRF9TWVNURU0iKQorCisgICAgICAgICAgICAgICAgLy8gSXRlbXMgb2YgcmVsZXZhbmNlIHRvIHJlcG9ydGluZyB0aGUgYW5vbWFseSAod2UgZG8gd2FudCB0aGlzIGRhdGEpOgorICAgICAgICAgICAgICAgIC5hZGRBdG9tTWF0Y2hlcihTdGF0c2RDb25maWdQcm90by5BdG9tTWF0Y2hlci5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJZChBTk9NQUxZX0RFVEVDVF9NQVRDSF9JRCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTaW1wbGVBdG9tTWF0Y2hlcihTdGF0c2RDb25maWdQcm90by5TaW1wbGVBdG9tTWF0Y2hlci5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEF0b21JZChBdG9tLkFOT01BTFlfREVURUNURURfRklFTERfTlVNQkVSKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkRmllbGRWYWx1ZU1hdGNoZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlRnZtKEFub21hbHlEZXRlY3RlZC5DT05GSUdfVUlEX0ZJRUxEX05VTUJFUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRFcUludChnZXRIb3N0VWlkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZEZpZWxkVmFsdWVNYXRjaGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUZ2bShBbm9tYWx5RGV0ZWN0ZWQuQ09ORklHX0lEX0ZJRUxEX05VTUJFUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRFcUludChDT05GSUdfSUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgLmFkZEV2ZW50TWV0cmljKFN0YXRzZENvbmZpZ1Byb3RvLkV2ZW50TWV0cmljLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldElkKEFOT01BTFlfRVZFTlRfSUQpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0V2hhdChBTk9NQUxZX0RFVEVDVF9NQVRDSF9JRCkKKyAgICAgICAgICAgICAgICApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc3RhdHNkL3NyYy9hbmRyb2lkL2N0cy9zdGF0c2QvYXRvbS9BdG9tVGVzdENhc2UuamF2YSBiL2hvc3RzaWRldGVzdHMvc3RhdHNkL3NyYy9hbmRyb2lkL2N0cy9zdGF0c2QvYXRvbS9BdG9tVGVzdENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2UyZDZjCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9zdGF0c2Qvc3JjL2FuZHJvaWQvY3RzL3N0YXRzZC9hdG9tL0F0b21UZXN0Q2FzZS5qYXZhCkBAIC0wLDAgKzEsNjkxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5jdHMuc3RhdHNkLmF0b207CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5jdHMuc3RhdHNkLmF0b20uRGV2aWNlQXRvbVRlc3RDYXNlLkRFVklDRV9TSURFX1RFU1RfQVBLOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmN0cy5zdGF0c2QuYXRvbS5EZXZpY2VBdG9tVGVzdENhc2UuREVWSUNFX1NJREVfVEVTVF9QQUNLQUdFOworCitpbXBvcnQgYW5kcm9pZC5vcy5CYXR0ZXJ5U3RhdHNQcm90bzsKK2ltcG9ydCBhbmRyb2lkLnNlcnZpY2UuYmF0dGVyeS5CYXR0ZXJ5U2VydmljZUR1bXBQcm90bzsKK2ltcG9ydCBhbmRyb2lkLnNlcnZpY2UuYmF0dGVyeXN0YXRzLkJhdHRlcnlTdGF0c1NlcnZpY2VEdW1wUHJvdG87CitpbXBvcnQgYW5kcm9pZC52aWV3LkRpc3BsYXlTdGF0ZUVudW07CisKK2ltcG9ydCBjb20uYW5kcm9pZC5hbm5vdGF0aW9ucy5OdWxsYWJsZTsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5vcy5TdGF0c2RDb25maWdQcm90by5BdG9tTWF0Y2hlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5vcy5TdGF0c2RDb25maWdQcm90by5FdmVudE1ldHJpYzsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5vcy5TdGF0c2RDb25maWdQcm90by5GaWVsZEZpbHRlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5vcy5TdGF0c2RDb25maWdQcm90by5GaWVsZE1hdGNoZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuU3RhdHNkQ29uZmlnUHJvdG8uRmllbGRWYWx1ZU1hdGNoZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuU3RhdHNkQ29uZmlnUHJvdG8uR2F1Z2VNZXRyaWM7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuU3RhdHNkQ29uZmlnUHJvdG8uUHJlZGljYXRlOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLm9zLlN0YXRzZENvbmZpZ1Byb3RvLlNpbXBsZUF0b21NYXRjaGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLm9zLlN0YXRzZENvbmZpZ1Byb3RvLlNpbXBsZVByZWRpY2F0ZTsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5vcy5TdGF0c2RDb25maWdQcm90by5TdGF0c2RDb25maWc7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuU3RhdHNkQ29uZmlnUHJvdG8uVGltZVVuaXQ7CitpbXBvcnQgY29tLmFuZHJvaWQub3MuQXRvbXNQcm90by5BcHBCcmVhZGNydW1iUmVwb3J0ZWQ7CitpbXBvcnQgY29tLmFuZHJvaWQub3MuQXRvbXNQcm90by5BdG9tOworaW1wb3J0IGNvbS5hbmRyb2lkLm9zLkF0b21zUHJvdG8uU2NyZWVuU3RhdGVDaGFuZ2VkOworaW1wb3J0IGNvbS5hbmRyb2lkLm9zLlN0YXRzTG9nLkNvbmZpZ01ldHJpY3NSZXBvcnQ7CitpbXBvcnQgY29tLmFuZHJvaWQub3MuU3RhdHNMb2cuQ29uZmlnTWV0cmljc1JlcG9ydExpc3Q7CitpbXBvcnQgY29tLmFuZHJvaWQub3MuU3RhdHNMb2cuRXZlbnRNZXRyaWNEYXRhOworaW1wb3J0IGNvbS5hbmRyb2lkLm9zLlN0YXRzTG9nLkdhdWdlTWV0cmljRGF0YTsKK2ltcG9ydCBjb20uYW5kcm9pZC5vcy5TdGF0c0xvZy5TdGF0c0xvZ1JlcG9ydDsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uOworaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmxvZy5Mb2dVdGlsOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uaW8uRmlsZXM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworCitpbXBvcnQgcGVyZmV0dG8ucHJvdG9zLlBlcmZldHRvQ29uZmlnLkRhdGFTb3VyY2VDb25maWc7CitpbXBvcnQgcGVyZmV0dG8ucHJvdG9zLlBlcmZldHRvQ29uZmlnLlRyYWNlQ29uZmlnOworaW1wb3J0IHBlcmZldHRvLnByb3Rvcy5QZXJmZXR0b0NvbmZpZy5UcmFjZUNvbmZpZy5CdWZmZXJDb25maWc7CitpbXBvcnQgcGVyZmV0dG8ucHJvdG9zLlBlcmZldHRvQ29uZmlnLlRyYWNlQ29uZmlnLkRhdGFTb3VyY2U7CisKKy8qKgorICogQmFzZSBjbGFzcyBmb3IgdGVzdGluZyBTdGF0c2QgYXRvbXMuCisgKiBWYWxpZGF0ZXMgcmVwb3J0aW5nIG9mIHN0YXRzZCBsb2dnaW5nIGJhc2VkIG9uIGRpZmZlcmVudCBldmVudHMKKyAqLworcHVibGljIGNsYXNzIEF0b21UZXN0Q2FzZSBleHRlbmRzIEJhc2VUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUERBVEVfQ09ORklHX0NNRCA9ICJjbWQgc3RhdHMgY29uZmlnIHVwZGF0ZSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFVNUF9SRVBPUlRfQ01EID0gImNtZCBzdGF0cyBkdW1wLXJlcG9ydCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFVNUF9CQVRURVJZX0NNRCA9ICJkdW1wc3lzIGJhdHRlcnkiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERVTVBfQkFUVEVSWVNUQVRTX0NNRCA9ICJkdW1wc3lzIGJhdHRlcnlzdGF0cyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1ZFX0NPTkZJR19DTUQgPSAiY21kIHN0YXRzIGNvbmZpZyByZW1vdmUiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19VSUQgPSAiMTAwMCI7CisgICAgLyoqIElEIG9mIHRoZSBjb25maWcsIHdoaWNoIGV2YWx1YXRlcyB0byAtMTU3Mjg4MzQ1Ny4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgQ09ORklHX0lEID0gImN0c19jb25maWciLmhhc2hDb2RlKCk7CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBXQUlUX1RJTUVfU0hPUlQgPSA1MDA7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgV0FJVF9USU1FX0xPTkcgPSAyXzAwMDsKKworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgbG9uZyBTQ1JFRU5fU1RBVEVfQ0hBTkdFX1RJTUVPVVQgPSA0MDAwOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgbG9uZyBTQ1JFRU5fU1RBVEVfUE9MTElOR19JTlRFUlZBTCA9IDUwMDsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisKKyAgICAgICAgaWYgKHN0YXRzZERpc2FibGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFVuaW5zdGFsbCB0byBjbGVhciB0aGUgaGlzdG9yeSBpbiBjYXNlIGl0J3Mgc3RpbGwgb24gdGhlIGRldmljZS4KKyAgICAgICAgcmVtb3ZlQ29uZmlnKENPTkZJR19JRCk7CisgICAgICAgIGdldFJlcG9ydExpc3QoKTsgLy8gQ2xlYXJzIGRhdGEuCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmVtb3ZlQ29uZmlnKENPTkZJR19JRCk7CisgICAgICAgIGdldERldmljZSgpLnVuaW5zdGFsbFBhY2thZ2UoREVWSUNFX1NJREVfVEVTVF9QQUNLQUdFKTsKKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgbG9nY2F0IGluZGljYXRlcyB0aGF0IGluY2lkZW50ZCBmaXJlZCBzaW5jZSB0aGUgZ2l2ZW4gZGV2aWNlIGRhdGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZGlkSW5jaWRlbnRkRmlyZVNpbmNlKFN0cmluZyBkYXRlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIElOQ0lERU5URF9UQUcgPSAiaW5jaWRlbnRkIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIElOQ0lERU5URF9TVEFSVEVEX1NUUklORyA9ICJyZXBvcnRJbmNpZGVudCI7CisgICAgICAgIC8vIFRPRE86IERvIHNvbWV0aGluZyBtb3JlIHJvYnVzdCB0aGFuIHRoaXMgaW4gY2FzZSBvZiBkZWxheWVkIGxvZ2dpbmcuCisgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKKyAgICAgICAgU3RyaW5nIGxvZyA9IGdldExvZ2NhdFNpbmNlKGRhdGUsIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgIi1zICVzIC1lICVzIiwgSU5DSURFTlREX1RBRywgSU5DSURFTlREX1NUQVJURURfU1RSSU5HKSk7CisgICAgICAgIHJldHVybiBsb2cuY29udGFpbnMoSU5DSURFTlREX1NUQVJURURfU1RSSU5HKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgbG9nY2F0IGluZGljYXRlcyB0aGF0IHBlcmZldHRvIGZpcmVkIHNpbmNlIHRoZSBnaXZlbiBkZXZpY2UgZGF0ZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBkaWRQZXJmZXR0b1N0YXJ0U2luY2UoU3RyaW5nIGRhdGUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgUEVSRkVUVE9fVEFHID0gInBlcmZldHRvIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIFBFUkZFVFRPX1NUQVJURURfU1RSSU5HID0gIkVuYWJsZWQgdHJhY2luZyI7CisgICAgICAgIGZpbmFsIFN0cmluZyBQRVJGRVRUT19TVEFSVEVEX1JFR0VYID0gIi4qIiArIFBFUkZFVFRPX1NUQVJURURfU1RSSU5HICsgIi4qIjsKKyAgICAgICAgLy8gVE9ETzogRG8gc29tZXRoaW5nIG1vcmUgcm9idXN0IHRoYW4gdGhpcyBpbiBjYXNlIG9mIGRlbGF5ZWQgbG9nZ2luZy4KKyAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOworICAgICAgICBTdHJpbmcgbG9nID0gZ2V0TG9nY2F0U2luY2UoZGF0ZSwgU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAiLXMgJXMgLWUgJXMiLCBQRVJGRVRUT19UQUcsIFBFUkZFVFRPX1NUQVJURURfUkVHRVgpKTsKKyAgICAgICAgcmV0dXJuIGxvZy5jb250YWlucyhQRVJGRVRUT19TVEFSVEVEX1NUUklORyk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tEZXZpY2VGb3IoU3RyaW5nIG1ldGhvZE5hbWUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW5zdGFsbFBhY2thZ2UoREVWSUNFX1NJREVfVEVTVF9BUEssIHRydWUpOworICAgICAgICAgICAgcnVuRGV2aWNlVGVzdHMoREVWSUNFX1NJREVfVEVTVF9QQUNLQUdFLCAiLkNoZWNrZXJzIiwgbWV0aG9kTmFtZSk7CisgICAgICAgICAgICAvLyBUZXN0IHBhc3NlcywgbWVhbmluZyB0aGF0IHRoZSBhbnN3ZXIgaXMgdHJ1ZS4KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGNhdGNoIChBc3NlcnRpb25FcnJvciBlKSB7CisgICAgICAgICAgICAvLyBNZXRob2QgaXMgZGVzaWduZWQgdG8gZmFpbCBpZiB0aGUgYW5zd2VyIGlzIGZhbHNlLgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdGF0c2RDb25maWcuQnVpbGRlciBjcmVhdGVDb25maWdCdWlsZGVyKCkgeworICAgICAgICByZXR1cm4gU3RhdHNkQ29uZmlnLm5ld0J1aWxkZXIoKS5zZXRJZChDT05GSUdfSUQpCisgICAgICAgICAgICAgICAgLmFkZEFsbG93ZWRMb2dTb3VyY2UoIkFJRF9TWVNURU0iKQorICAgICAgICAgICAgICAgIC5hZGRBbGxvd2VkTG9nU291cmNlKCJBSURfQkxVRVRPT1RIIikKKyAgICAgICAgICAgICAgICAvLyBUT0RPKGIvMTM0MDkxMTY3KTogRml4IGJsdWV0b290aCBzb3VyY2UgbmFtZSBpc3N1ZSBpbiBBdXRvIHBsYXRmb3JtLgorICAgICAgICAgICAgICAgIC5hZGRBbGxvd2VkTG9nU291cmNlKCJjb20uYW5kcm9pZC5ibHVldG9vdGgiKQorICAgICAgICAgICAgICAgIC5hZGRBbGxvd2VkTG9nU291cmNlKERldmljZUF0b21UZXN0Q2FzZS5ERVZJQ0VfU0lERV9URVNUX1BBQ0tBR0UpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUFuZFVwbG9hZENvbmZpZyhpbnQgYXRvbVRhZykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0YXRzZENvbmZpZy5CdWlsZGVyIGNvbmYgPSBjcmVhdGVDb25maWdCdWlsZGVyKCk7CisgICAgICAgIGFkZEF0b21FdmVudChjb25mLCBhdG9tVGFnKTsKKyAgICAgICAgdXBsb2FkQ29uZmlnKGNvbmYpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHVwbG9hZENvbmZpZyhTdGF0c2RDb25maWcuQnVpbGRlciBjb25maWcpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB1cGxvYWRDb25maWcoY29uZmlnLmJ1aWxkKCkpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHVwbG9hZENvbmZpZyhTdGF0c2RDb25maWcgY29uZmlnKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTG9nVXRpbC5DTG9nLmQoIlVwbG9hZGluZyB0aGUgZm9sbG93aW5nIGNvbmZpZzpcbiIgKyBjb25maWcudG9TdHJpbmcoKSk7CisgICAgICAgIEZpbGUgY29uZmlnRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoInN0YXRzZGNvbmZpZyIsICIuY29uZmlnIik7CisgICAgICAgIGNvbmZpZ0ZpbGUuZGVsZXRlT25FeGl0KCk7CisgICAgICAgIEZpbGVzLndyaXRlKGNvbmZpZy50b0J5dGVBcnJheSgpLCBjb25maWdGaWxlKTsKKyAgICAgICAgU3RyaW5nIHJlbW90ZVBhdGggPSAiL2RhdGEvbG9jYWwvdG1wLyIgKyBjb25maWdGaWxlLmdldE5hbWUoKTsKKyAgICAgICAgZ2V0RGV2aWNlKCkucHVzaEZpbGUoY29uZmlnRmlsZSwgcmVtb3RlUGF0aCk7CisgICAgICAgIGdldERldmljZSgpLmV4ZWN1dGVTaGVsbENvbW1hbmQoCisgICAgICAgICAgICAgICAgU3RyaW5nLmpvaW4oIiAiLCAiY2F0IiwgcmVtb3RlUGF0aCwgInwiLCBVUERBVEVfQ09ORklHX0NNRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKENPTkZJR19JRCkpKTsKKyAgICAgICAgZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZCgicm0gIiArIHJlbW90ZVBhdGgpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHJlbW92ZUNvbmZpZyhsb25nIGNvbmZpZ0lkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZCgKKyAgICAgICAgICAgICAgICBTdHJpbmcuam9pbigiICIsIFJFTU9WRV9DT05GSUdfQ01ELCBTdHJpbmcudmFsdWVPZihjb25maWdJZCkpKTsKKyAgICB9CisKKyAgICAvKiogR2V0cyB0aGUgc3RhdHNkIHJlcG9ydCBhbmQgc29ydHMgaXQuIE5vdGUgdGhhdCB0aGlzIGFsc28gZGVsZXRlcyB0aGF0IHJlcG9ydCBmcm9tIHN0YXRzZC4gKi8KKyAgICBwcm90ZWN0ZWQgTGlzdDxFdmVudE1ldHJpY0RhdGE+IGdldEV2ZW50TWV0cmljRGF0YUxpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQ29uZmlnTWV0cmljc1JlcG9ydExpc3QgcmVwb3J0TGlzdCA9IGdldFJlcG9ydExpc3QoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgb25lIHJlcG9ydCIsIHJlcG9ydExpc3QuZ2V0UmVwb3J0c0NvdW50KCkgPT0gMSk7CisgICAgICAgIENvbmZpZ01ldHJpY3NSZXBvcnQgcmVwb3J0ID0gcmVwb3J0TGlzdC5nZXRSZXBvcnRzKDApOworCisgICAgICAgIExpc3Q8RXZlbnRNZXRyaWNEYXRhPiBkYXRhID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGZvciAoU3RhdHNMb2dSZXBvcnQgbWV0cmljIDogcmVwb3J0LmdldE1ldHJpY3NMaXN0KCkpIHsKKyAgICAgICAgICAgIGRhdGEuYWRkQWxsKG1ldHJpYy5nZXRFdmVudE1ldHJpY3MoKS5nZXREYXRhTGlzdCgpKTsKKyAgICAgICAgfQorICAgICAgICBkYXRhLnNvcnQoQ29tcGFyYXRvci5jb21wYXJpbmcoRXZlbnRNZXRyaWNEYXRhOjpnZXRFbGFwc2VkVGltZXN0YW1wTmFub3MpKTsKKworICAgICAgICBMb2dVdGlsLkNMb2cuZCgiR2V0IEV2ZW50TWV0cmljRGF0YUxpc3QgYXMgZm9sbG93aW5nOlxuIik7CisgICAgICAgIGZvciAoRXZlbnRNZXRyaWNEYXRhIGQgOiBkYXRhKSB7CisgICAgICAgICAgICBMb2dVdGlsLkNMb2cuZCgiQXRvbSBhdCAiICsgZC5nZXRFbGFwc2VkVGltZXN0YW1wTmFub3MoKSArICI6XG4iICsgZC5nZXRBdG9tKCkudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgfQorCisgICAgcHJvdGVjdGVkIExpc3Q8QXRvbT4gZ2V0R2F1Z2VNZXRyaWNEYXRhTGlzdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDb25maWdNZXRyaWNzUmVwb3J0TGlzdCByZXBvcnRMaXN0ID0gZ2V0UmVwb3J0TGlzdCgpOworICAgICAgICBhc3NlcnRUcnVlKHJlcG9ydExpc3QuZ2V0UmVwb3J0c0NvdW50KCkgPT0gMSk7CisgICAgICAgIC8vIG9ubHkgY29uZmlnCisgICAgICAgIENvbmZpZ01ldHJpY3NSZXBvcnQgcmVwb3J0ID0gcmVwb3J0TGlzdC5nZXRSZXBvcnRzKDApOworCisgICAgICAgIExpc3Q8QXRvbT4gZGF0YSA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBmb3IgKEdhdWdlTWV0cmljRGF0YSBnYXVnZU1ldHJpY0RhdGEgOgorICAgICAgICAgICAgICAgIHJlcG9ydC5nZXRNZXRyaWNzKDApLmdldEdhdWdlTWV0cmljcygpLmdldERhdGFMaXN0KCkpIHsKKyAgICAgICAgICAgIGZvciAoQXRvbSBhdG9tIDogZ2F1Z2VNZXRyaWNEYXRhLmdldEJ1Y2tldEluZm8oMCkuZ2V0QXRvbUxpc3QoKSkgeworICAgICAgICAgICAgICAgIGRhdGEuYWRkKGF0b20pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgTG9nVXRpbC5DTG9nLmQoIkdldCBHYXVnZU1ldHJpY0RhdGFMaXN0IGFzIGZvbGxvd2luZzpcbiIpOworICAgICAgICBmb3IgKEF0b20gZCA6IGRhdGEpIHsKKyAgICAgICAgICAgIExvZ1V0aWwuQ0xvZy5kKCJBdG9tOlxuIiArIGQudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFN0YXRzTG9nUmVwb3J0IGdldFN0YXRzTG9nUmVwb3J0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENvbmZpZ01ldHJpY3NSZXBvcnRMaXN0IHJlcG9ydExpc3QgPSBnZXRSZXBvcnRMaXN0KCk7CisgICAgICAgIGFzc2VydFRydWUocmVwb3J0TGlzdC5nZXRSZXBvcnRzQ291bnQoKSA9PSAxKTsKKyAgICAgICAgQ29uZmlnTWV0cmljc1JlcG9ydCByZXBvcnQgPSByZXBvcnRMaXN0LmdldFJlcG9ydHMoMCk7CisgICAgICAgIGFzc2VydFRydWUocmVwb3J0Lmhhc1VpZE1hcCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlcG9ydC5nZXRNZXRyaWNzQ291bnQoKSk7CisgICAgICAgIHJldHVybiByZXBvcnQuZ2V0TWV0cmljcygwKTsKKyAgICB9CisKKyAgICAvKiogR2V0cyB0aGUgc3RhdHNkIHJlcG9ydC4gTm90ZSB0aGF0IHRoaXMgYWxzbyBkZWxldGVzIHRoYXQgcmVwb3J0IGZyb20gc3RhdHNkLiAqLworICAgIHByb3RlY3RlZCBDb25maWdNZXRyaWNzUmVwb3J0TGlzdCBnZXRSZXBvcnRMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDb25maWdNZXRyaWNzUmVwb3J0TGlzdCByZXBvcnRMaXN0ID0gZ2V0RHVtcChDb25maWdNZXRyaWNzUmVwb3J0TGlzdC5wYXJzZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmpvaW4oIiAiLCBEVU1QX1JFUE9SVF9DTUQsIFN0cmluZy52YWx1ZU9mKENPTkZJR19JRCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tcHJvdG8iKSk7CisgICAgICAgICAgICByZXR1cm4gcmVwb3J0TGlzdDsKKyAgICAgICAgfSBjYXRjaCAoY29tLmdvb2dsZS5wcm90b2J1Zi5JbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nVXRpbC5DTG9nLmUoIkZhaWxlZCB0byBmZXRjaCBhbmQgcGFyc2UgdGhlIHN0YXRzZCBvdXRwdXQgcmVwb3J0LiAiCisgICAgICAgICAgICAgICAgICAgICsgIlBlcmhhcHMgdGhlcmUgaXMgbm90IGEgdmFsaWQgc3RhdHNkIGNvbmZpZyBmb3IgdGhlIHJlcXVlc3RlZCAiCisgICAgICAgICAgICAgICAgICAgICsgInVpZD0iICsgQ09ORklHX1VJRCArICIsIGlkPSIgKyBDT05GSUdfSUQgKyAiLiIpOworICAgICAgICAgICAgdGhyb3cgKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIEJhdHRlcnlTdGF0c1Byb3RvIGdldEJhdHRlcnlTdGF0c1Byb3RvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBCYXR0ZXJ5U3RhdHNQcm90byBiYXR0ZXJ5U3RhdHNQcm90byA9IGdldER1bXAoQmF0dGVyeVN0YXRzU2VydmljZUR1bXBQcm90by5wYXJzZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmpvaW4oIiAiLCBEVU1QX0JBVFRFUllTVEFUU19DTUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tcHJvdG8iKSkuZ2V0QmF0dGVyeXN0YXRzKCk7CisgICAgICAgICAgICBMb2dVdGlsLkNMb2cuZCgiR290IGJhdHRlcnlzdGF0czpcbiAiICsgYmF0dGVyeVN0YXRzUHJvdG8udG9TdHJpbmcoKSk7CisgICAgICAgICAgICByZXR1cm4gYmF0dGVyeVN0YXRzUHJvdG87CisgICAgICAgIH0gY2F0Y2ggKGNvbS5nb29nbGUucHJvdG9idWYuSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZ1V0aWwuQ0xvZy5lKCJGYWlsZWQgdG8gZHVtcCBiYXR0ZXJ5c3RhdHMgcHJvdG8iKTsKKyAgICAgICAgICAgIHRocm93IChlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBDcmVhdGVzIGEgRmllbGRWYWx1ZU1hdGNoZXIuQnVpbGRlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBmaWVsZC4gKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIEZpZWxkVmFsdWVNYXRjaGVyLkJ1aWxkZXIgY3JlYXRlRnZtKGludCBmaWVsZCkgeworICAgICAgICByZXR1cm4gRmllbGRWYWx1ZU1hdGNoZXIubmV3QnVpbGRlcigpLnNldEZpZWxkKGZpZWxkKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIFRyYWNlQ29uZmlnIGNyZWF0ZVBlcmZldHRvVHJhY2VDb25maWcoKSB7CisgICAgICAgIHJldHVybiBUcmFjZUNvbmZpZy5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgIC5hZGRCdWZmZXJzKEJ1ZmZlckNvbmZpZy5uZXdCdWlsZGVyKCkuc2V0U2l6ZUtiKDMyKSkKKyAgICAgICAgICAgIC5hZGREYXRhU291cmNlcyhEYXRhU291cmNlLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRDb25maWcoRGF0YVNvdXJjZUNvbmZpZy5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgLnNldE5hbWUoImxpbnV4LmZ0cmFjZSIpCisgICAgICAgICAgICAgICAgICAgIC5zZXRUYXJnZXRCdWZmZXIoMCkKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICApCisgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRBdG9tRXZlbnQoU3RhdHNkQ29uZmlnLkJ1aWxkZXIgY29uZiwgaW50IGF0b21UYWcpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhZGRBdG9tRXZlbnQoY29uZiwgYXRvbVRhZywgbmV3IEFycmF5TGlzdDxGaWVsZFZhbHVlTWF0Y2hlci5CdWlsZGVyPigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGFuIGV2ZW50IHRvIHRoZSBjb25maWcgZm9yIGFuIGF0b20gdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBrZXkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29uZiAgICBjb25maWd1cmF0aW9uCisgICAgICogQHBhcmFtIGF0b21UYWcgYXRvbSB0YWcgKGZyb20gYXRvbXMucHJvdG8pCisgICAgICogQHBhcmFtIGZ2bSAgICAgRmllbGRWYWx1ZU1hdGNoZXIuQnVpbGRlciBmb3IgdGhlIHJlbGV2YW50IGtleQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGFkZEF0b21FdmVudChTdGF0c2RDb25maWcuQnVpbGRlciBjb25mLCBpbnQgYXRvbVRhZywKKyAgICAgICAgICAgIEZpZWxkVmFsdWVNYXRjaGVyLkJ1aWxkZXIgZnZtKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFkZEF0b21FdmVudChjb25mLCBhdG9tVGFnLCBBcnJheXMuYXNMaXN0KGZ2bSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYW4gZXZlbnQgdG8gdGhlIGNvbmZpZyBmb3IgYW4gYXRvbSB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIGtleXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29uZiAgIGNvbmZpZ3VyYXRpb24KKyAgICAgKiBAcGFyYW0gYXRvbUlkIGF0b20gdGFnIChmcm9tIGF0b21zLnByb3RvKQorICAgICAqIEBwYXJhbSBmdm1zICAgbGlzdCBvZiBGaWVsZFZhbHVlTWF0Y2hlci5CdWlsZGVycyB0byBhdHRhY2ggdG8gdGhlIGF0b20uIE1heSBiZSBudWxsLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGFkZEF0b21FdmVudChTdGF0c2RDb25maWcuQnVpbGRlciBjb25mLCBpbnQgYXRvbUlkLAorICAgICAgICAgICAgTGlzdDxGaWVsZFZhbHVlTWF0Y2hlci5CdWlsZGVyPiBmdm1zKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBmaW5hbCBTdHJpbmcgYXRvbU5hbWUgPSAiQXRvbSIgKyBTeXN0ZW0ubmFub1RpbWUoKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGV2ZW50TmFtZSA9ICJFdmVudCIgKyBTeXN0ZW0ubmFub1RpbWUoKTsKKworICAgICAgICBTaW1wbGVBdG9tTWF0Y2hlci5CdWlsZGVyIHNhbSA9IFNpbXBsZUF0b21NYXRjaGVyLm5ld0J1aWxkZXIoKS5zZXRBdG9tSWQoYXRvbUlkKTsKKyAgICAgICAgaWYgKGZ2bXMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChGaWVsZFZhbHVlTWF0Y2hlci5CdWlsZGVyIGZ2bSA6IGZ2bXMpIHsKKyAgICAgICAgICAgICAgICBzYW0uYWRkRmllbGRWYWx1ZU1hdGNoZXIoZnZtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25mLmFkZEF0b21NYXRjaGVyKEF0b21NYXRjaGVyLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRJZChhdG9tTmFtZS5oYXNoQ29kZSgpKQorICAgICAgICAgICAgICAgIC5zZXRTaW1wbGVBdG9tTWF0Y2hlcihzYW0pKTsKKyAgICAgICAgY29uZi5hZGRFdmVudE1ldHJpYyhFdmVudE1ldHJpYy5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0SWQoZXZlbnROYW1lLmhhc2hDb2RlKCkpCisgICAgICAgICAgICAgICAgLnNldFdoYXQoYXRvbU5hbWUuaGFzaENvZGUoKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYW4gYXRvbSB0byBhIGdhdWdlIG1ldHJpYyBvZiBhIGNvbmZpZworICAgICAqCisgICAgICogQHBhcmFtIGNvbmYgICAgICBjb25maWd1cmF0aW9uCisgICAgICogQHBhcmFtIGF0b21JZCAgICBhdG9tIGlkIChmcm9tIGF0b21zLnByb3RvKQorICAgICAqIEBwYXJhbSBkaW1lbnNpb24gZGltZW5zaW9uIGlzIG5lZWRlZCBmb3IgbW9zdCBwdWxsZWQgYXRvbXMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRHYXVnZUF0b20oU3RhdHNkQ29uZmlnLkJ1aWxkZXIgY29uZiwgaW50IGF0b21JZCwKKyAgICAgICAgICAgIEBOdWxsYWJsZSBGaWVsZE1hdGNoZXIuQnVpbGRlciBkaW1lbnNpb24pIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgYXRvbU5hbWUgPSAiQXRvbSIgKyBTeXN0ZW0ubmFub1RpbWUoKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGdhdWdlTmFtZSA9ICJHYXVnZSIgKyBTeXN0ZW0ubmFub1RpbWUoKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHByZWRpY2F0ZU5hbWUgPSAiQVBQX0JSRUFEQ1JVTUIiOworICAgICAgICBTaW1wbGVBdG9tTWF0Y2hlci5CdWlsZGVyIHNhbSA9IFNpbXBsZUF0b21NYXRjaGVyLm5ld0J1aWxkZXIoKS5zZXRBdG9tSWQoYXRvbUlkKTsKKyAgICAgICAgY29uZi5hZGRBdG9tTWF0Y2hlcihBdG9tTWF0Y2hlci5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0SWQoYXRvbU5hbWUuaGFzaENvZGUoKSkKKyAgICAgICAgICAgICAgICAuc2V0U2ltcGxlQXRvbU1hdGNoZXIoc2FtKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBwcmVkaWNhdGVUcnVlTmFtZSA9ICJBUFBfQlJFQURDUlVNQl8xIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIHByZWRpY2F0ZUZhbHNlTmFtZSA9ICJBUFBfQlJFQURDUlVNQl8yIjsKKyAgICAgICAgY29uZi5hZGRBdG9tTWF0Y2hlcihBdG9tTWF0Y2hlci5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0SWQocHJlZGljYXRlVHJ1ZU5hbWUuaGFzaENvZGUoKSkKKyAgICAgICAgICAgICAgICAuc2V0U2ltcGxlQXRvbU1hdGNoZXIoU2ltcGxlQXRvbU1hdGNoZXIubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0QXRvbUlkKEF0b20uQVBQX0JSRUFEQ1JVTUJfUkVQT1JURURfRklFTERfTlVNQkVSKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFkZEZpZWxkVmFsdWVNYXRjaGVyKEZpZWxkVmFsdWVNYXRjaGVyLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoQXBwQnJlYWRjcnVtYlJlcG9ydGVkLkxBQkVMX0ZJRUxEX05VTUJFUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEVxSW50KDEpCisgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgKQorICAgICAgICApCisgICAgICAgICAgICAgICAgLy8gVXNlZCB0byB0cmlnZ2VyIHByZWRpY2F0ZQorICAgICAgICAgICAgICAgIC5hZGRBdG9tTWF0Y2hlcihBdG9tTWF0Y2hlci5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJZChwcmVkaWNhdGVGYWxzZU5hbWUuaGFzaENvZGUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTaW1wbGVBdG9tTWF0Y2hlcihTaW1wbGVBdG9tTWF0Y2hlci5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEF0b21JZChBdG9tLkFQUF9CUkVBRENSVU1CX1JFUE9SVEVEX0ZJRUxEX05VTUJFUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZEZpZWxkVmFsdWVNYXRjaGVyKEZpZWxkVmFsdWVNYXRjaGVyLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChBcHBCcmVhZGNydW1iUmVwb3J0ZWQuTEFCRUxfRklFTERfTlVNQkVSKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRFcUludCgyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgY29uZi5hZGRQcmVkaWNhdGUoUHJlZGljYXRlLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRJZChwcmVkaWNhdGVOYW1lLmhhc2hDb2RlKCkpCisgICAgICAgICAgICAgICAgLnNldFNpbXBsZVByZWRpY2F0ZShTaW1wbGVQcmVkaWNhdGUubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0U3RhcnQocHJlZGljYXRlVHJ1ZU5hbWUuaGFzaENvZGUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTdG9wKHByZWRpY2F0ZUZhbHNlTmFtZS5oYXNoQ29kZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvdW50TmVzdGluZyhmYWxzZSkKKyAgICAgICAgICAgICAgICApCisgICAgICAgICk7CisgICAgICAgIEdhdWdlTWV0cmljLkJ1aWxkZXIgZ2F1Z2VNZXRyaWMgPSBHYXVnZU1ldHJpYy5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0SWQoZ2F1Z2VOYW1lLmhhc2hDb2RlKCkpCisgICAgICAgICAgICAgICAgLnNldFdoYXQoYXRvbU5hbWUuaGFzaENvZGUoKSkKKyAgICAgICAgICAgICAgICAuc2V0R2F1Z2VGaWVsZHNGaWx0ZXIoRmllbGRGaWx0ZXIubmV3QnVpbGRlcigpLnNldEluY2x1ZGVBbGwodHJ1ZSkuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuc2V0U2FtcGxpbmdUeXBlKEdhdWdlTWV0cmljLlNhbXBsaW5nVHlwZS5BTExfQ09ORElUSU9OX0NIQU5HRVMpCisgICAgICAgICAgICAgICAgLnNldEJ1Y2tldChUaW1lVW5pdC5DVFMpCisgICAgICAgICAgICAgICAgLnNldENvbmRpdGlvbihwcmVkaWNhdGVOYW1lLmhhc2hDb2RlKCkpOworICAgICAgICBpZiAoZGltZW5zaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIGdhdWdlTWV0cmljLnNldERpbWVuc2lvbnNJbldoYXQoZGltZW5zaW9uLmJ1aWxkKCkpOworICAgICAgICB9CisgICAgICAgIGNvbmYuYWRkR2F1Z2VNZXRyaWMoZ2F1Z2VNZXRyaWMuYnVpbGQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNzZXJ0cyB0aGF0IGVhY2ggc2V0IG9mIHN0YXRlcyBpbiBzdGF0ZVNldHMgb2NjdXJzIGF0IGxlYXN0IG9uY2UgaW4gZGF0YS4KKyAgICAgKiBBc3NlcnRzIHRoYXQgdGhlIHN0YXRlcyBpbiBkYXRhIG9jY3VyIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBzZXRzIGluIHN0YXRlU2V0cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdGF0ZVNldHMgICAgICAgIEEgbGlzdCBvZiBzZXQgb2Ygc3RhdGVzLCB3aGVyZSBlYWNoIHNldCByZXByZXNlbnRzIGFuIGVxdWl2YWxlbnQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSBvZiB0aGUgZGV2aWNlIGZvciB0aGUgcHVycG9zZSBvZiBDVFMuCisgICAgICogQHBhcmFtIGRhdGEgICAgICAgICAgICAgbGlzdCBvZiBFdmVudE1ldHJpY0RhdGEgZnJvbSBzdGF0c2QsIHByb2R1Y2VkIGJ5CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UmVwb3J0TWV0cmljTGlzdERhdGEoKQorICAgICAqIEBwYXJhbSB3YWl0ICAgICAgICAgICAgIGV4cGVjdGVkIGR1cmF0aW9uIChpbiBtcykgYmV0d2VlbiBzdGF0ZSBjaGFuZ2VzOyBhc3NlcnRzIHRoYXQgdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsIHdhaXQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lIHdhcyB3YWl0LzIgPD0gYWN0dWFsX3dhaXQgPD0gNSp3YWl0LiBVc2UgMCB0byBpZ25vcmUgdGhpcworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydGlvbi4KKyAgICAgKiBAcGFyYW0gZ2V0U3RhdGVGcm9tQXRvbSBleHByZXNzaW9uIHRoYXQgdGFrZXMgaW4gYW4gQXRvbSBhbmQgcmV0dXJucyB0aGUgc3RhdGUgaXQgY29udGFpbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhc3NlcnRTdGF0ZXNPY2N1cnJlZChMaXN0PFNldDxJbnRlZ2VyPj4gc3RhdGVTZXRzLCBMaXN0PEV2ZW50TWV0cmljRGF0YT4gZGF0YSwKKyAgICAgICAgICAgIGludCB3YWl0LCBGdW5jdGlvbjxBdG9tLCBJbnRlZ2VyPiBnZXRTdGF0ZUZyb21BdG9tKSB7CisgICAgICAgIC8vIFNvbWV0aW1lcywgdGhlcmUgYXJlIG1vcmUgZXZlbnRzIHRoYW4gdGhlcmUgYXJlIHN0YXRlcy4KKyAgICAgICAgLy8gRWc6IFdoZW4gdGhlIHNjcmVlbiB0dXJucyBvZmYsIGl0IG1heSBnbyBpbnRvIE9GRiBhbmQgdGhlbiBET1pFIGltbWVkaWF0ZWx5LgorICAgICAgICBhc3NlcnRUcnVlKCJUb28gZmV3IHN0YXRlcyBmb3VuZCAoIiArIGRhdGEuc2l6ZSgpICsgIikiLCBkYXRhLnNpemUoKSA+PSBzdGF0ZVNldHMuc2l6ZSgpKTsKKyAgICAgICAgaW50IHN0YXRlU2V0SW5kZXggPSAwOyAvLyBUcmFja3Mgd2hpY2ggc3RhdGUgc2V0IHdlIGV4cGVjdCB0aGUgZGF0YSB0byBiZSBpbi4KKyAgICAgICAgZm9yIChpbnQgZGF0YUluZGV4ID0gMDsgZGF0YUluZGV4IDwgZGF0YS5zaXplKCk7IGRhdGFJbmRleCsrKSB7CisgICAgICAgICAgICBBdG9tIGF0b20gPSBkYXRhLmdldChkYXRhSW5kZXgpLmdldEF0b20oKTsKKyAgICAgICAgICAgIGludCBzdGF0ZSA9IGdldFN0YXRlRnJvbUF0b20uYXBwbHkoYXRvbSk7CisgICAgICAgICAgICAvLyBJZiBzdGF0ZSBpcyBpbiB0aGUgY3VycmVudCBzdGF0ZSBzZXQsIHdlIGRvIG5vdCBhc3NlcnQgYW55dGhpbmcuCisgICAgICAgICAgICAvLyBJZiBpdCBpcyBub3QsIHdlIGV4cGVjdCB0byBoYXZlIHRyYW5zaXRpb25lZCB0byB0aGUgbmV4dCBzdGF0ZSBzZXQuCisgICAgICAgICAgICBpZiAoc3RhdGVTZXRzLmdldChzdGF0ZVNldEluZGV4KS5jb250YWlucyhzdGF0ZSkpIHsKKyAgICAgICAgICAgICAgICAvLyBObyBuZWVkIHRvIGFzc2VydCBhbnl0aGluZy4gSnVzdCBsb2cgaXQuCisgICAgICAgICAgICAgICAgTG9nVXRpbC5DTG9nLmkoIlRoZSBmb2xsb3dpbmcgYXRvbSBhdCBkYXRhSW5kZXg9IiArIGRhdGFJbmRleCArICIgaXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiaW4gc3RhdGVTZXRJbmRleCAiICsgc3RhdGVTZXRJbmRleCArICI6XG4iCisgICAgICAgICAgICAgICAgICAgICAgICArIGRhdGEuZ2V0KGRhdGFJbmRleCkuZ2V0QXRvbSgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdGF0ZVNldEluZGV4ICs9IDE7CisgICAgICAgICAgICAgICAgTG9nVXRpbC5DTG9nLmkoIkFzc2VydCB0aGF0IHRoZSBmb2xsb3dpbmcgYXRvbSBhdCBkYXRhSW5kZXg9IiArIGRhdGFJbmRleCArICIgaXMiCisgICAgICAgICAgICAgICAgICAgICAgICArICIgaW4gc3RhdGVTZXRJbmRleCAiICsgc3RhdGVTZXRJbmRleCArICI6XG4iCisgICAgICAgICAgICAgICAgICAgICAgICArIGRhdGEuZ2V0KGRhdGFJbmRleCkuZ2V0QXRvbSgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIk1pc3NlZCBmaXJzdCBzdGF0ZSIsIGRhdGFJbmRleCAhPSAwKTsgLy8gc2hvdWxkIG5vdCBiZSBvbiBmaXJzdCBkYXRhCisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVG9vIG1hbnkgc3RhdGVzICgiICsgKHN0YXRlU2V0SW5kZXggKyAxKSArICIpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlU2V0SW5kZXggPCBzdGF0ZVNldHMuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJJcyBpbiB3cm9uZyBzdGF0ZSAoIiArIHN0YXRlICsgIikiLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVTZXRzLmdldChzdGF0ZVNldEluZGV4KS5jb250YWlucyhzdGF0ZSkpOworICAgICAgICAgICAgICAgIGlmICh3YWl0ID4gMCkgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUaW1lRGlmZkJldHdlZW4oZGF0YS5nZXQoZGF0YUluZGV4IC0gMSksIGRhdGEuZ2V0KGRhdGFJbmRleCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdCAvIDIsIHdhaXQgKiA1KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVG9vIGZldyBzdGF0ZXMgKCIgKyAoc3RhdGVTZXRJbmRleCArIDEpICsgIikiLAorICAgICAgICAgICAgICAgIHN0YXRlU2V0SW5kZXggPT0gc3RhdGVTZXRzLnNpemUoKSAtIDEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYWxsIGVsZW1lbnRzIGZyb20gZGF0YSBwcmlvciB0byB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBhbiBlbGVtZW50IG9mIHN0YXRlLiBBZnRlcgorICAgICAqIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgdGhlIGZpcnN0IGVsZW1lbnQgb2YgZGF0YSAoaWYgbm9uLWVtcHR5KSBpcyBndWFyYW50ZWVkIHRvIGJlIGFuCisgICAgICogZWxlbWVudCBpbiBzdGF0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBnZXRTdGF0ZUZyb21BdG9tIGV4cHJlc3Npb24gdGhhdCB0YWtlcyBpbiBhbiBBdG9tIGFuZCByZXR1cm5zIHRoZSBzdGF0ZSBpdCBjb250YWlucworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBvcFVudGlsRmluZChMaXN0PEV2ZW50TWV0cmljRGF0YT4gZGF0YSwgU2V0PEludGVnZXI+IHN0YXRlLAorICAgICAgICAgICAgRnVuY3Rpb248QXRvbSwgSW50ZWdlcj4gZ2V0U3RhdGVGcm9tQXRvbSkgeworICAgICAgICBpbnQgZmlyc3RTdGF0ZUlkeDsKKyAgICAgICAgZm9yIChmaXJzdFN0YXRlSWR4ID0gMDsgZmlyc3RTdGF0ZUlkeCA8IGRhdGEuc2l6ZSgpOyBmaXJzdFN0YXRlSWR4KyspIHsKKyAgICAgICAgICAgIEF0b20gYXRvbSA9IGRhdGEuZ2V0KGZpcnN0U3RhdGVJZHgpLmdldEF0b20oKTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5jb250YWlucyhnZXRTdGF0ZUZyb21BdG9tLmFwcGx5KGF0b20pKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChmaXJzdFN0YXRlSWR4ID09IDApIHsKKyAgICAgICAgICAgIC8vIEZpcnN0IGZpcnN0IGVsZW1lbnQgYWxyZWFkeSBpcyBpbiBzdGF0ZSwgc28gdGhlcmUncyBub3RoaW5nIHRvIGRvLgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGRhdGEuc3ViTGlzdCgwLCBmaXJzdFN0YXRlSWR4KS5jbGVhcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYWxsIGVsZW1lbnRzIGZyb20gZGF0YSBhZnRlciB0byB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIGFuIGVsZW1lbnQgb2Ygc3RhdGUuIEFmdGVyCisgICAgICogdGhpcyBtZXRob2QgaXMgY2FsbGVkLCB0aGUgbGFzdCBlbGVtZW50IG9mIGRhdGEgKGlmIG5vbi1lbXB0eSkgaXMgZ3VhcmFudGVlZCB0byBiZSBhbgorICAgICAqIGVsZW1lbnQgaW4gc3RhdGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZ2V0U3RhdGVGcm9tQXRvbSBleHByZXNzaW9uIHRoYXQgdGFrZXMgaW4gYW4gQXRvbSBhbmQgcmV0dXJucyB0aGUgc3RhdGUgaXQgY29udGFpbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwb3BVbnRpbEZpbmRGcm9tRW5kKExpc3Q8RXZlbnRNZXRyaWNEYXRhPiBkYXRhLCBTZXQ8SW50ZWdlcj4gc3RhdGUsCisgICAgICAgIEZ1bmN0aW9uPEF0b20sIEludGVnZXI+IGdldFN0YXRlRnJvbUF0b20pIHsKKyAgICAgICAgaW50IGxhc3RTdGF0ZUlkeDsKKyAgICAgICAgZm9yIChsYXN0U3RhdGVJZHggPSBkYXRhLnNpemUoKSAtIDE7IGxhc3RTdGF0ZUlkeCA+PSAwOyBsYXN0U3RhdGVJZHgtLSkgeworICAgICAgICAgICAgQXRvbSBhdG9tID0gZGF0YS5nZXQobGFzdFN0YXRlSWR4KS5nZXRBdG9tKCk7CisgICAgICAgICAgICBpZiAoc3RhdGUuY29udGFpbnMoZ2V0U3RhdGVGcm9tQXRvbS5hcHBseShhdG9tKSkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobGFzdFN0YXRlSWR4ID09IGRhdGEuc2l6ZSgpLTEpIHsKKyAgICAgICAgICAgIC8vIExhc3QgZWxlbWVudCBhbHJlYWR5IGlzIGluIHN0YXRlLCBzbyB0aGVyZSdzIG5vdGhpbmcgdG8gZG8uCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZGF0YS5zdWJMaXN0KGxhc3RTdGF0ZUlkeCsxLCBkYXRhLnNpemUoKSkuY2xlYXIoKTsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyB0aGUgVUlEIG9mIHRoZSBob3N0LCB3aGljaCBzaG91bGQgYWx3YXlzIGVpdGhlciBiZSBTSEVMTCAoMjAwMCkgb3IgUk9PVCAoMCkuICovCisgICAgcHJvdGVjdGVkIGludCBnZXRIb3N0VWlkKCkgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBzdHJVaWQgPSAiIjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN0clVpZCA9IGdldERldmljZSgpLmV4ZWN1dGVTaGVsbENvbW1hbmQoImlkIC11Iik7CisgICAgICAgICAgICByZXR1cm4gSW50ZWdlci5wYXJzZUludChzdHJVaWQudHJpbSgpKTsKKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZ1V0aWwuQ0xvZy5lKCJGYWlsZWQgdG8gZ2V0IGhvc3QncyB1aWQgdmlhIHNoZWxsIGNvbW1hbmQuIEZvdW5kICIgKyBzdHJVaWQpOworICAgICAgICAgICAgLy8gRmFsbCBiYWNrIHRvIGFsdGVybmF0aXZlIG1ldGhvZC4uLgorICAgICAgICAgICAgaWYgKGdldERldmljZSgpLmlzQWRiUm9vdCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7IC8vIFJPT1QKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDIwMDA7IC8vIFNIRUxMCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB0dXJuU2NyZWVuT24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZCgiaW5wdXQga2V5ZXZlbnQgS0VZQ09ERV9XQUtFVVAiKTsKKyAgICAgICAgZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZCgid20gZGlzbWlzcy1rZXlndWFyZCIpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHR1cm5TY3JlZW5PZmYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZCgiaW5wdXQga2V5ZXZlbnQgS0VZQ09ERV9TTEVFUCIpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHNldENoYXJnaW5nU3RhdGUoaW50IHN0YXRlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZCgiY21kIGJhdHRlcnkgc2V0IHN0YXR1cyAiICsgc3RhdGUpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHVucGx1Z0RldmljZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBPbiBiYXR0ZXJ5bGVzcyBkZXZpY2VzIG9uIEFuZHJvaWQgUCBvciBhYm92ZSwgdGhlICd1bnBsdWcnIGNvbW1hbmQKKyAgICAgICAgLy8gYWxvbmUgZG9lcyBub3Qgc2ltdWxhdGUgdGhlIHJlYWxseSB1bnBsdWdnZWQgc3RhdGUuCisgICAgICAgIC8vCisgICAgICAgIC8vIFRoaXMgaXMgYmVjYXVzZSBjaGFyZ2luZyBzdGF0ZSBpcyBsZWZ0IGFzICJ1bmtub3duIi4gVW5sZXNzIGEgdmFsaWQKKyAgICAgICAgLy8gc3RhdGUgbGlrZSAzID0gQmF0dGVyeU1hbmFnZXIuQkFUVEVSWV9TVEFUVVNfRElTQ0hBUkdJTkcgaXMgc2V0LAorICAgICAgICAvLyBmcmFtZXdvcmsgZG9lcyBub3QgY29uc2lkZXIgdGhlIGRldmljZSBhcyBydW5uaW5nIG9uIGJhdHRlcnkuCisgICAgICAgIHNldENoYXJnaW5nU3RhdGUoMyk7CisKKyAgICAgICAgZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZCgiY21kIGJhdHRlcnkgdW5wbHVnIik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgcGx1Z0luQWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZCgiY21kIGJhdHRlcnkgc2V0IGFjIDEiKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBwbHVnSW5Vc2IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZCgiY21kIGJhdHRlcnkgc2V0IHVzYiAxIik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgcGx1Z0luV2lyZWxlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZCgiY21kIGJhdHRlcnkgc2V0IHdpcmVsZXNzIDEiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBcHBCcmVhZGNydW1iUHJlZGljYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGRvQXBwQnJlYWRjcnVtYlJlcG9ydGVkU3RhcnQoMSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xlYXJBcHBCcmVhZGNydW1iUHJlZGljYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGRvQXBwQnJlYWRjcnVtYlJlcG9ydGVkU3RhcnQoMik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZG9BcHBCcmVhZGNydW1iUmVwb3J0ZWRTdGFydChpbnQgbGFiZWwpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkb0FwcEJyZWFkY3J1bWJSZXBvcnRlZChsYWJlbCwgQXBwQnJlYWRjcnVtYlJlcG9ydGVkLlN0YXRlLlNUQVJULm9yZGluYWwoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZG9BcHBCcmVhZGNydW1iUmVwb3J0ZWRTdG9wKGludCBsYWJlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGRvQXBwQnJlYWRjcnVtYlJlcG9ydGVkKGxhYmVsLCBBcHBCcmVhZGNydW1iUmVwb3J0ZWQuU3RhdGUuU1RPUC5vcmRpbmFsKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRvQXBwQnJlYWRjcnVtYlJlcG9ydGVkKGludCBsYWJlbCwgaW50IHN0YXRlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZChTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICJjbWQgc3RhdHMgbG9nLWFwcC1icmVhZGNydW1iICVkICVkIiwgbGFiZWwsIHN0YXRlKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0QmF0dGVyeUxldmVsKGludCBsZXZlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGdldERldmljZSgpLmV4ZWN1dGVTaGVsbENvbW1hbmQoImNtZCBiYXR0ZXJ5IHNldCBsZXZlbCAiICsgbGV2ZWwpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHJlc2V0QmF0dGVyeVN0YXR1cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBnZXREZXZpY2UoKS5leGVjdXRlU2hlbGxDb21tYW5kKCJjbWQgYmF0dGVyeSByZXNldCIpOworICAgIH0KKworICAgIHByb3RlY3RlZCBpbnQgZ2V0U2NyZWVuQnJpZ2h0bmVzcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZXR1cm4gSW50ZWdlci5wYXJzZUludCgKKyAgICAgICAgICAgICAgICBnZXREZXZpY2UoKS5leGVjdXRlU2hlbGxDb21tYW5kKCJzZXR0aW5ncyBnZXQgc3lzdGVtIHNjcmVlbl9icmlnaHRuZXNzIikudHJpbSgpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRTY3JlZW5CcmlnaHRuZXNzKGludCBicmlnaHRuZXNzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZCgic2V0dGluZ3MgcHV0IHN5c3RlbSBzY3JlZW5fYnJpZ2h0bmVzcyAiICsgYnJpZ2h0bmVzcyk7CisgICAgfQorCisgICAgLy8gR2V0cyB3aGV0aGVyICJBbHdheXMgb24gRGlzcGxheSIgc2V0dGluZyBpcyBlbmFibGVkLgorICAgIC8vIEluIHJhcmUgY2FzZXMsIHRoaXMgaXMgZGlmZmVyZW50IGZyb20gd2hldGhlciB0aGUgZGV2aWNlIGNhbiBlbnRlciBTQ1JFRU5fU1RBVEVfRE9aRS4KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEFvZFN0YXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXREZXZpY2UoKS5leGVjdXRlU2hlbGxDb21tYW5kKCJzZXR0aW5ncyBnZXQgc2VjdXJlIGRvemVfYWx3YXlzX29uIik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0QW9kU3RhdGUoU3RyaW5nIHN0YXRlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZCgic2V0dGluZ3MgcHV0IHNlY3VyZSBkb3plX2Fsd2F5c19vbiAiICsgc3RhdGUpOworICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIGlzU2NyZWVuQnJpZ2h0bmVzc01vZGVNYW51YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIG1vZGUgPSBnZXREZXZpY2UoKS5leGVjdXRlU2hlbGxDb21tYW5kKCJzZXR0aW5ncyBnZXQgc3lzdGVtIHNjcmVlbl9icmlnaHRuZXNzX21vZGUiKTsKKyAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQobW9kZS50cmltKCkpID09IDA7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0U2NyZWVuQnJpZ2h0bmVzc01vZGUoYm9vbGVhbiBtYW51YWwpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBnZXREZXZpY2UoKS5leGVjdXRlU2hlbGxDb21tYW5kKAorICAgICAgICAgICAgICAgICJzZXR0aW5ncyBwdXQgc3lzdGVtIHNjcmVlbl9icmlnaHRuZXNzX21vZGUgIiArIChtYW51YWwgPyAwIDogMSkpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGVudGVyRG96ZU1vZGVMaWdodCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBnZXREZXZpY2UoKS5leGVjdXRlU2hlbGxDb21tYW5kKCJkdW1wc3lzIGRldmljZWlkbGUgZm9yY2UtaWRsZSBsaWdodCIpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGVudGVyRG96ZU1vZGVEZWVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGdldERldmljZSgpLmV4ZWN1dGVTaGVsbENvbW1hbmQoImR1bXBzeXMgZGV2aWNlaWRsZSBmb3JjZS1pZGxlIGRlZXAiKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBsZWF2ZURvemVNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGdldERldmljZSgpLmV4ZWN1dGVTaGVsbENvbW1hbmQoImR1bXBzeXMgZGV2aWNlaWRsZSB1bmZvcmNlIik7CisgICAgICAgIGdldERldmljZSgpLmV4ZWN1dGVTaGVsbENvbW1hbmQoImR1bXBzeXMgZGV2aWNlaWRsZSBkaXNhYmxlIik7CisgICAgICAgIGdldERldmljZSgpLmV4ZWN1dGVTaGVsbENvbW1hbmQoImR1bXBzeXMgZGV2aWNlaWRsZSBlbmFibGUiKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB0dXJuQmF0dGVyeVNhdmVyT24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdW5wbHVnRGV2aWNlKCk7CisgICAgICAgIGdldERldmljZSgpLmV4ZWN1dGVTaGVsbENvbW1hbmQoInNldHRpbmdzIHB1dCBnbG9iYWwgbG93X3Bvd2VyIDEiKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB0dXJuQmF0dGVyeVNhdmVyT2ZmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGdldERldmljZSgpLmV4ZWN1dGVTaGVsbENvbW1hbmQoInNldHRpbmdzIHB1dCBnbG9iYWwgbG93X3Bvd2VyIDAiKTsKKyAgICAgICAgZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZCgiY21kIGJhdHRlcnkgcmVzZXQiKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCByZWJvb3REZXZpY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZ2V0RGV2aWNlKCkucmVib290VW50aWxPbmxpbmUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBc3NlcnRzIHRoYXQgdGhlIHR3byBldmVudHMgYXJlIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHJhbmdlIG9mIGVhY2ggb3RoZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZDAgICAgICAgIHRoZSBldmVudCB0aGF0IHNob3VsZCBvY2N1ciBmaXJzdAorICAgICAqIEBwYXJhbSBkMSAgICAgICAgdGhlIGV2ZW50IHRoYXQgc2hvdWxkIG9jY3VyIHNlY29uZAorICAgICAqIEBwYXJhbSBtaW5EaWZmTXMgZDAgc2hvdWxkIHByZWNlZGUgZDEgYnkgYXQgbGVhc3QgdGhpcyBhbW91bnQKKyAgICAgKiBAcGFyYW0gbWF4RGlmZk1zIGQwIHNob3VsZCBwcmVjZWRlIGQxIGJ5IGF0IG1vc3QgdGhpcyBhbW91bnQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0VGltZURpZmZCZXR3ZWVuKEV2ZW50TWV0cmljRGF0YSBkMCwgRXZlbnRNZXRyaWNEYXRhIGQxLAorICAgICAgICAgICAgaW50IG1pbkRpZmZNcywgaW50IG1heERpZmZNcykgeworICAgICAgICBsb25nIGRpZmZNcyA9IChkMS5nZXRFbGFwc2VkVGltZXN0YW1wTmFub3MoKSAtIGQwLmdldEVsYXBzZWRUaW1lc3RhbXBOYW5vcygpKSAvIDFfMDAwXzAwMDsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiSWxsZWdhbCB0aW1lIGRpZmZlcmVuY2UgKCIgKyBkaWZmTXMgKyAibXMpIiwgbWluRGlmZk1zIDw9IGRpZmZNcyk7CisgICAgICAgIGFzc2VydFRydWUoIklsbGVnYWwgdGltZSBkaWZmZXJlbmNlICgiICsgZGlmZk1zICsgIm1zKSIsIGRpZmZNcyA8PSBtYXhEaWZmTXMpOworICAgIH0KKworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VycmVudExvZ2NhdERhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gVE9ETzogRG8gc29tZXRoaW5nIG1vcmUgcm9idXN0IHRoYW4gdGhpcyBmb3IgZ2V0dGluZyBsb2djYXQgbWFya2Vycy4KKyAgICAgICAgbG9uZyB0aW1lc3RhbXBNcyA9IGdldERldmljZSgpLmdldERldmljZURhdGUoKTsKKyAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJNTS1kZCBISDptbTpzcy5TU1MiKQorICAgICAgICAgICAgICAgIC5mb3JtYXQobmV3IERhdGUodGltZXN0YW1wTXMpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldExvZ2NhdFNpbmNlKFN0cmluZyBkYXRlLCBTdHJpbmcgbG9nY2F0UGFyYW1zKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdldERldmljZSgpLmV4ZWN1dGVTaGVsbENvbW1hbmQoU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAibG9nY2F0IC12IHRocmVhZHRpbWUgLXQgJyVzJyAtZCAlcyIsIGRhdGUsIGxvZ2NhdFBhcmFtcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFB1bGxlZCBhdG9tcyBzaG91bGQgaGF2ZSBhIGJldHRlciB3YXkgb2YgY29uc3RydWN0aW5nIHRoZSBjb25maWcuCisgICAgICogUmVtb3ZlIHRoaXMgY29uZmlnIHdoZW4gdGhhdCBoYXBwZW5zLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdGF0c2RDb25maWcuQnVpbGRlciBnZXRQdWxsZWRDb25maWcoKSB7CisgICAgICAgIHJldHVybiBTdGF0c2RDb25maWcubmV3QnVpbGRlcigpLnNldElkKENPTkZJR19JRCkKKyAgICAgICAgICAgICAgICAuYWRkQWxsb3dlZExvZ1NvdXJjZSgiQUlEX1NZU1RFTSIpCisgICAgICAgICAgICAgICAgLmFkZEFsbG93ZWRMb2dTb3VyY2UoRGV2aWNlQXRvbVRlc3RDYXNlLkRFVklDRV9TSURFX1RFU1RfUEFDS0FHRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgZGV2aWNlIGhhcyB0aGUgZ2l2ZW4gZmVhdHVyZS4KKyAgICAgKiBQcmludHMgYSB3YXJuaW5nIGlmIGl0cyB2YWx1ZSBkaWZmZXJzIGZyb20gcmVxdWlyZWRBbnN3ZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFzRmVhdHVyZShTdHJpbmcgZmVhdHVyZU5hbWUsIGJvb2xlYW4gcmVxdWlyZWRBbnN3ZXIpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgZmVhdHVyZXMgPSBnZXREZXZpY2UoKS5leGVjdXRlU2hlbGxDb21tYW5kKCJwbSBsaXN0IGZlYXR1cmVzIik7CisgICAgICAgIGJvb2xlYW4gaGFzSXQgPSBmZWF0dXJlcy5jb250YWlucyhmZWF0dXJlTmFtZSk7CisgICAgICAgIGlmIChoYXNJdCAhPSByZXF1aXJlZEFuc3dlcikgeworICAgICAgICAgICAgTG9nVXRpbC5DTG9nLncoIkRldmljZSBkb2VzICIgKyAocmVxdWlyZWRBbnN3ZXIgPyAibm90ICIgOiAiIikgKyAiaGF2ZSBmZWF0dXJlICIKKyAgICAgICAgICAgICAgICAgICAgKyBmZWF0dXJlTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGhhc0l0ID09IHJlcXVpcmVkQW5zd2VyOworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZXMgaWYgdGhlIGRldmljZSBoYXMgYSBiYXR0ZXJ5LgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGhhc0JhdHRlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEJhdHRlcnlTZXJ2aWNlRHVtcFByb3RvIGJhdHRlcnlQcm90byA9IGdldER1bXAoQmF0dGVyeVNlcnZpY2VEdW1wUHJvdG8ucGFyc2VyKCksCisgICAgICAgICAgICAgICAgICAgIFN0cmluZy5qb2luKCIgIiwgRFVNUF9CQVRURVJZX0NNRCwgIi0tcHJvdG8iKSk7CisgICAgICAgICAgICBMb2dVdGlsLkNMb2cuZCgiR290IGJhdHRlcnkgc2VydmljZSBkdW1wOlxuICIgKyBiYXR0ZXJ5UHJvdG8udG9TdHJpbmcoKSk7CisgICAgICAgICAgICByZXR1cm4gYmF0dGVyeVByb3RvLmdldElzUHJlc2VudCgpOworICAgICAgICB9IGNhdGNoIChjb20uZ29vZ2xlLnByb3RvYnVmLkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2dVdGlsLkNMb2cuZSgiRmFpbGVkIHRvIGR1bXAgYmF0dGVyeXNlcnZpY2UgcHJvdG8iKTsKKyAgICAgICAgICAgIHRocm93IChlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZXMgaWYgdGhlIGRldmljZSBoYXMgfGZpbGV8LgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGRvZXNGaWxlRXhpc3QoU3RyaW5nIGZpbGUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2V0RGV2aWNlKCkuZG9lc0ZpbGVFeGlzdChmaWxlKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc3RhdHNkL3NyYy9hbmRyb2lkL2N0cy9zdGF0c2QvYXRvbS9CYXNlVGVzdENhc2UuamF2YSBiL2hvc3RzaWRldGVzdHMvc3RhdHNkL3NyYy9hbmRyb2lkL2N0cy9zdGF0c2QvYXRvbS9CYXNlVGVzdENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjVjNzY4Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9zdGF0c2Qvc3JjL2FuZHJvaWQvY3RzL3N0YXRzZC9hdG9tL0Jhc2VUZXN0Q2FzZS5qYXZhCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmN0cy5zdGF0c2QuYXRvbTsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLmJ1aWxkLkNvbXBhdGliaWxpdHlCdWlsZEhlbHBlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIudGVzdHJ1bm5lci5SZW1vdGVBbmRyb2lkVGVzdFJ1bm5lcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIudGVzdHJ1bm5lci5UZXN0UmVzdWx0LlRlc3RTdGF0dXM7CitpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuYnVpbGQuSUJ1aWxkSW5mbzsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuQ29sbGVjdGluZ0J5dGVPdXRwdXRSZWNlaXZlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uOworaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmxvZy5Mb2dVdGlsLkNMb2c7CitpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQucmVzdWx0LkNvbGxlY3RpbmdUZXN0TGlzdGVuZXI7CitpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQucmVzdWx0LlRlc3REZXNjcmlwdGlvbjsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5yZXN1bHQuVGVzdFJlc3VsdDsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5yZXN1bHQuVGVzdFJ1blJlc3VsdDsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5EZXZpY2VUZXN0Q2FzZTsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JQnVpbGRSZWNlaXZlcjsKKworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuTWVzc2FnZUxpdGU7CitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5QYXJzZXI7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Ob25udWxsOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uTnVsbGFibGU7CisKKy8vIExhcmdlbHkgY29waWVkIGZyb20gaW5jaWRlbnQncyBQcm90b0R1bXBUZXN0Q2FzZQorcHVibGljIGNsYXNzIEJhc2VUZXN0Q2FzZSBleHRlbmRzIERldmljZVRlc3RDYXNlIGltcGxlbWVudHMgSUJ1aWxkUmVjZWl2ZXIgeworCisgICAgcHJvdGVjdGVkIElCdWlsZEluZm8gbUN0c0J1aWxkOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUlVOTkVSID0gImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICBhc3NlcnROb3ROdWxsKG1DdHNCdWlsZCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0QnVpbGQoSUJ1aWxkSW5mbyBidWlsZEluZm8pIHsKKyAgICAgICAgbUN0c0J1aWxkID0gYnVpbGRJbmZvOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGwgb250byB0aGUgZGV2aWNlIHdpdGggYW4gYWRiIHNoZWxsIGNvbW1hbmQgYW5kIGdldCB0aGUgcmVzdWx0cyBvZgorICAgICAqIHRoYXQgYXMgYSBwcm90byBvZiB0aGUgZ2l2ZW4gdHlwZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJzZXIgQSBwcm90b2J1ZiBwYXJzZXIgb2JqZWN0LiBlLmcuIE15UHJvdG8ucGFyc2VyKCkKKyAgICAgKiBAcGFyYW0gY29tbWFuZCBUaGUgYWRiIHNoZWxsIGNvbW1hbmQgdG8gcnVuLiBlLmcuICJkdW1wc3lzIGZpbmdlcnByaW50IC0tcHJvdG8iCisgICAgICoKKyAgICAgKiBAdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiBJZiB0aGVyZSB3YXMgYSBwcm9ibGVtIGNvbW11bmljYXRpbmcgd2l0aAorICAgICAqICAgICAgdGhlIHRlc3QgZGV2aWNlLgorICAgICAqIEB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIElmIHRoZXJlIHdhcyBhbiBlcnJvciBwYXJzaW5nCisgICAgICogICAgICB0aGUgcHJvdG8uIE5vdGUgdGhhdCBhIDAgbGVuZ3RoIGJ1ZmZlciBpcyBub3QgbmVjZXNzYXJpbHkgYW4gZXJyb3IuCisgICAgICovCisgICAgcHVibGljIDxUIGV4dGVuZHMgTWVzc2FnZUxpdGU+IFQgZ2V0RHVtcChQYXJzZXI8VD4gcGFyc2VyLCBTdHJpbmcgY29tbWFuZCkKKyAgICAgICAgICAgIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24sIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIENvbGxlY3RpbmdCeXRlT3V0cHV0UmVjZWl2ZXIgcmVjZWl2ZXIgPSBuZXcgQ29sbGVjdGluZ0J5dGVPdXRwdXRSZWNlaXZlcigpOworICAgICAgICBnZXREZXZpY2UoKS5leGVjdXRlU2hlbGxDb21tYW5kKGNvbW1hbmQsIHJlY2VpdmVyKTsKKyAgICAgICAgcmV0dXJuIHBhcnNlci5wYXJzZUZyb20ocmVjZWl2ZXIuZ2V0T3V0cHV0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluc3RhbGwgYSBkZXZpY2Ugc2lkZSB0ZXN0IHBhY2thZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXBwRmlsZU5hbWUgQXBrIGZpbGUgbmFtZSwgc3VjaCBhcyAiQ3RzTmV0U3RhdHNBcHAuYXBrIi4KKyAgICAgKiBAcGFyYW0gZ3JhbnRQZXJtaXNzaW9ucyB3aGV0aGVyIHRvIGdpdmUgcnVudGltZSBwZXJtaXNzaW9ucy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBpbnN0YWxsUGFja2FnZShTdHJpbmcgYXBwRmlsZU5hbWUsIGJvb2xlYW4gZ3JhbnRQZXJtaXNzaW9ucykKKyAgICAgICAgICAgIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7CisgICAgICAgIENMb2cuZCgiSW5zdGFsbGluZyBhcHAgIiArIGFwcEZpbGVOYW1lKTsKKyAgICAgICAgQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyIGJ1aWxkSGVscGVyID0gbmV3IENvbXBhdGliaWxpdHlCdWlsZEhlbHBlcihtQ3RzQnVpbGQpOworICAgICAgICBmaW5hbCBTdHJpbmcgcmVzdWx0ID0gZ2V0RGV2aWNlKCkuaW5zdGFsbFBhY2thZ2UoCisgICAgICAgICAgICAgICAgYnVpbGRIZWxwZXIuZ2V0VGVzdEZpbGUoYXBwRmlsZU5hbWUpLCB0cnVlLCBncmFudFBlcm1pc3Npb25zKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiRmFpbGVkIHRvIGluc3RhbGwgIiArIGFwcEZpbGVOYW1lICsgIjogIiArIHJlc3VsdCwgcmVzdWx0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSdW4gYSBkZXZpY2Ugc2lkZSB0ZXN0LgorICAgICAqCisgICAgICogQHBhcmFtIHBrZ05hbWUgVGVzdCBwYWNrYWdlIG5hbWUsIHN1Y2ggYXMgImNvbS5hbmRyb2lkLnNlcnZlci5jdHMubmV0c3RhdHMiLgorICAgICAqIEBwYXJhbSB0ZXN0Q2xhc3NOYW1lIFRlc3QgY2xhc3MgbmFtZTsgZWl0aGVyIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUsIG9yICIuIiArIGEgY2xhc3MgbmFtZS4KKyAgICAgKiBAcGFyYW0gdGVzdE1ldGhvZE5hbWUgVGVzdCBtZXRob2QgbmFtZS4KKyAgICAgKiBAdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHJ1bkRldmljZVRlc3RzKEBOb25udWxsIFN0cmluZyBwa2dOYW1lLAorICAgICAgICAgICAgQE51bGxhYmxlIFN0cmluZyB0ZXN0Q2xhc3NOYW1lLCBATnVsbGFibGUgU3RyaW5nIHRlc3RNZXRob2ROYW1lKQorICAgICAgICAgICAgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7CisgICAgICAgIGlmICh0ZXN0Q2xhc3NOYW1lICE9IG51bGwgJiYgdGVzdENsYXNzTmFtZS5zdGFydHNXaXRoKCIuIikpIHsKKyAgICAgICAgICAgIHRlc3RDbGFzc05hbWUgPSBwa2dOYW1lICsgdGVzdENsYXNzTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIFJlbW90ZUFuZHJvaWRUZXN0UnVubmVyIHRlc3RSdW5uZXIgPSBuZXcgUmVtb3RlQW5kcm9pZFRlc3RSdW5uZXIoCisgICAgICAgICAgICAgICAgcGtnTmFtZSwgVEVTVF9SVU5ORVIsIGdldERldmljZSgpLmdldElEZXZpY2UoKSk7CisgICAgICAgIGlmICh0ZXN0Q2xhc3NOYW1lICE9IG51bGwgJiYgdGVzdE1ldGhvZE5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgdGVzdFJ1bm5lci5zZXRNZXRob2ROYW1lKHRlc3RDbGFzc05hbWUsIHRlc3RNZXRob2ROYW1lKTsKKyAgICAgICAgfSBlbHNlIGlmICh0ZXN0Q2xhc3NOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRlc3RSdW5uZXIuc2V0Q2xhc3NOYW1lKHRlc3RDbGFzc05hbWUpOworICAgICAgICB9CisKKyAgICAgICAgQ29sbGVjdGluZ1Rlc3RMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBDb2xsZWN0aW5nVGVzdExpc3RlbmVyKCk7CisgICAgICAgIGFzc2VydFRydWUoZ2V0RGV2aWNlKCkucnVuSW5zdHJ1bWVudGF0aW9uVGVzdHModGVzdFJ1bm5lciwgbGlzdGVuZXIpKTsKKworICAgICAgICBmaW5hbCBUZXN0UnVuUmVzdWx0IHJlc3VsdCA9IGxpc3RlbmVyLmdldEN1cnJlbnRSdW5SZXN1bHRzKCk7CisgICAgICAgIGlmIChyZXN1bHQuaXNSdW5GYWlsdXJlKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiRmFpbGVkIHRvIHN1Y2Nlc3NmdWxseSBydW4gZGV2aWNlIHRlc3RzIGZvciAiCisgICAgICAgICAgICAgICAgICAgICsgcmVzdWx0LmdldE5hbWUoKSArICI6ICIgKyByZXN1bHQuZ2V0UnVuRmFpbHVyZU1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlc3VsdC5nZXROdW1UZXN0cygpID09IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiTm8gdGVzdHMgd2VyZSBydW4gb24gdGhlIGRldmljZSIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlc3VsdC5oYXNGYWlsZWRUZXN0cygpKSB7CisgICAgICAgICAgICAvLyBidWlsZCBhIG1lYW5pbmdmdWwgZXJyb3IgbWVzc2FnZQorICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBlcnJvckJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigiT24tZGV2aWNlIHRlc3RzIGZhaWxlZDpcbiIpOworICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8VGVzdERlc2NyaXB0aW9uLCBUZXN0UmVzdWx0PiByZXN1bHRFbnRyeSA6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXRUZXN0UmVzdWx0cygpLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdEVudHJ5LmdldFZhbHVlKCkuZ2V0U3RhdHVzKCkuZXF1YWxzKFRlc3RTdGF0dXMuUEFTU0VEKSkgeworICAgICAgICAgICAgICAgICAgICBlcnJvckJ1aWxkZXIuYXBwZW5kKHJlc3VsdEVudHJ5LmdldEtleSgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICBlcnJvckJ1aWxkZXIuYXBwZW5kKCI6XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JCdWlsZGVyLmFwcGVuZChyZXN1bHRFbnRyeS5nZXRWYWx1ZSgpLmdldFN0YWNrVHJhY2UoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGVycm9yQnVpbGRlci50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIHN0YXRzZERpc2FibGVkKCkgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGlmIHJvLnN0YXRzZC5lbmFibGUgZG9lc24ndCBleGlzdCwgc3RhdHNkIGlzIHJ1bm5pbmcgYnkgZGVmYXVsdC4KKyAgICAgICAgaWYgKCJmYWxzZSIuZXF1YWxzKGdldERldmljZSgpLmdldFByb3BlcnR5KCJyby5zdGF0c2QuZW5hYmxlIikpCisgICAgICAgICAgICAgICAgJiYgInRydWUiLmVxdWFscyhnZXREZXZpY2UoKS5nZXRQcm9wZXJ0eSgicm8uY29uZmlnLmxvd19yYW0iKSkpIHsKKyAgICAgICAgICAgIENMb2cuZCgiU3RhdHNkIGlzIG5vdCBlbmFibGVkIG9uIHRoZSBkZXZpY2UiKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3N0YXRzZC9zcmMvYW5kcm9pZC9jdHMvc3RhdHNkL2F0b20vRGV2aWNlQXRvbVRlc3RDYXNlLmphdmEgYi9ob3N0c2lkZXRlc3RzL3N0YXRzZC9zcmMvYW5kcm9pZC9jdHMvc3RhdHNkL2F0b20vRGV2aWNlQXRvbVRlc3RDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUxODI2YwotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvc3RhdHNkL3NyYy9hbmRyb2lkL2N0cy9zdGF0c2QvYXRvbS9EZXZpY2VBdG9tVGVzdENhc2UuamF2YQpAQCAtMCwwICsxLDIyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQuY3RzLnN0YXRzZC5hdG9tOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuU3RhdHNkQ29uZmlnUHJvdG8uRmllbGRWYWx1ZU1hdGNoZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuU3RhdHNkQ29uZmlnUHJvdG8uTWVzc2FnZU1hdGNoZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuU3RhdHNkQ29uZmlnUHJvdG8uUG9zaXRpb247CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuU3RhdHNkQ29uZmlnUHJvdG8uU3RhdHNkQ29uZmlnOworaW1wb3J0IGNvbS5hbmRyb2lkLm9zLlN0YXRzTG9nLkV2ZW50TWV0cmljRGF0YTsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5sb2cuTG9nVXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQmFzZSBjbGFzcyBmb3IgdGVzdGluZyBTdGF0c2QgYXRvbXMgdGhhdCByZXBvcnQgYSB1aWQuIFRlc3RzIGFyZSBwZXJmb3JtZWQgdmlhIGEgZGV2aWNlLXNpZGUgYXBwLgorICovCitwdWJsaWMgY2xhc3MgRGV2aWNlQXRvbVRlc3RDYXNlIGV4dGVuZHMgQXRvbVRlc3RDYXNlIHsKKworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFVklDRV9TSURFX1RFU1RfQVBLID0gIkN0c1N0YXRzZEFwcC5hcGsiOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFVklDRV9TSURFX1RFU1RfUEFDS0FHRSA9CisgICAgICAgICAgICAiY29tLmFuZHJvaWQuc2VydmVyLmN0cy5kZXZpY2Uuc3RhdHNkIjsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGxvbmcgREVWSUNFX1NJREVfVEVTVF9QS0dfSEFTSCA9CisgICAgICAgICAgICBMb25nLnBhcnNlVW5zaWduZWRMb25nKCIxNTY5NDA1MjkyNDU0NDA5ODU4MiIpOworCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX05BTUUgPSAiY3RzX2NvbmZpZyI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKERFVklDRV9TSURFX1RFU1RfUEFDS0FHRSk7CisgICAgICAgIGluc3RhbGxUZXN0QXBwKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZ2V0RGV2aWNlKCkudW5pbnN0YWxsUGFja2FnZShERVZJQ0VfU0lERV9URVNUX1BBQ0tBR0UpOworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm1zIGEgZGV2aWNlLXNpZGUgdGVzdCBieSBjYWxsaW5nIGEgbWV0aG9kIG9uIHRoZSBhcHAgYW5kIHJldHVybnMgaXRzIHN0YXRzIGV2ZW50cy4KKyAgICAgKiBAcGFyYW0gbWV0aG9kTmFtZSB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIGluIHRoZSBhcHAncyBBdG9tVGVzdHMgdG8gcGVyZm9ybQorICAgICAqIEBwYXJhbSBhdG9tIGF0b20gdGFnIChmcm9tIGF0b21zLnByb3RvKQorICAgICAqIEBwYXJhbSBrZXkgYXRvbSdzIGZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gc3RhdGUKKyAgICAgKiBAcGFyYW0gc3RhdGVPbiAnb24nIHZhbHVlCisgICAgICogQHBhcmFtIHN0YXRlT2ZmICdvZmYnIHZhbHVlCisgICAgICogQHBhcmFtIG1pblRpbWVEaWZmTXMgbWF4IGFsbG93ZWQgdGltZSBiZXR3ZWVuIHN0YXJ0IGFuZCBzdG9wCisgICAgICogQHBhcmFtIG1heFRpbWVEaWZmTXMgbWluIGFsbG93ZWQgdGltZSBiZXR3ZWVuIHN0YXJ0IGFuZCBzdG9wCisgICAgICogQHBhcmFtIGRlbWFuZEV4YWN0bHlUd28gd2hldGhlciB0aGVyZSBtdXN0IGJlIHByZWNpc2VseSB0d28gZXZlbnRzIGxvZ2dlZCAoMSBzdGFydCwgMSBzdG9wKQorICAgICAqIEByZXR1cm4gbGlzdCBvZiBldmVudHMgd2l0aCB0aGUgYXBwJ3MgdWlkIG1hdGNoaW5nIHRoZSBjb25maWd1cmF0aW9uIGRlZmluZWQgYnkgdGhlIHBhcmFtcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTGlzdDxFdmVudE1ldHJpY0RhdGE+IGRvRGV2aWNlTWV0aG9kT25PZmYoCisgICAgICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSwgaW50IGF0b20sIGludCBrZXksIGludCBzdGF0ZU9uLCBpbnQgc3RhdGVPZmYsCisgICAgICAgICAgICBpbnQgbWluVGltZURpZmZNcywgaW50IG1heFRpbWVEaWZmTXMsIGJvb2xlYW4gZGVtYW5kRXhhY3RseVR3bykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0YXRzZENvbmZpZy5CdWlsZGVyIGNvbmYgPSBjcmVhdGVDb25maWdCdWlsZGVyKCk7CisgICAgICAgIGFkZEF0b21FdmVudChjb25mLCBhdG9tLCBjcmVhdGVGdm0oa2V5KS5zZXRFcUludChzdGF0ZU9uKSk7CisgICAgICAgIGFkZEF0b21FdmVudChjb25mLCBhdG9tLCBjcmVhdGVGdm0oa2V5KS5zZXRFcUludChzdGF0ZU9mZikpOworICAgICAgICBMaXN0PEV2ZW50TWV0cmljRGF0YT4gZGF0YSA9IGRvRGV2aWNlTWV0aG9kKG1ldGhvZE5hbWUsIGNvbmYpOworCisgICAgICAgIGlmIChkZW1hbmRFeGFjdGx5VHdvKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGRhdGEuc2l6ZSgpID09IDIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShkYXRhLnNpemUoKSA+PSAyKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUaW1lRGlmZkJldHdlZW4oZGF0YS5nZXQoMCksIGRhdGEuZ2V0KDEpLCBtaW5UaW1lRGlmZk1zLCBtYXhUaW1lRGlmZk1zKTsKKyAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgfQorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWV0aG9kTmFtZSB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIGluIHRoZSBhcHAncyBBdG9tVGVzdHMgdG8gcGVyZm9ybQorICAgICAqIEBwYXJhbSBjZmcgc3RhdHNkIGNvbmZpZ3VyYXRpb24KKyAgICAgKiBAcmV0dXJuIGxpc3Qgb2YgZXZlbnRzIHdpdGggdGhlIGFwcCdzIHVpZCBtYXRjaGluZyB0aGUgY29uZmlndXJhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTGlzdDxFdmVudE1ldHJpY0RhdGE+IGRvRGV2aWNlTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lLCBTdGF0c2RDb25maWcuQnVpbGRlciBjZmcpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmVtb3ZlQ29uZmlnKENPTkZJR19JRCk7CisgICAgICAgIGdldFJlcG9ydExpc3QoKTsgIC8vIENsZWFycyBwcmV2aW91cyBkYXRhIG9uIGRpc2suCisgICAgICAgIHVwbG9hZENvbmZpZyhjZmcpOworICAgICAgICBpbnQgYXBwVWlkID0gZ2V0VWlkKCk7CisgICAgICAgIExvZ1V0aWwuQ0xvZy5kKCJcblBlcmZvcm1pbmcgZGV2aWNlLXNpZGUgdGVzdCBvZiAiICsgbWV0aG9kTmFtZSArICIgZm9yIHVpZCAiICsgYXBwVWlkKTsKKyAgICAgICAgcnVuRGV2aWNlVGVzdHMoREVWSUNFX1NJREVfVEVTVF9QQUNLQUdFLCAiLkF0b21UZXN0cyIsIG1ldGhvZE5hbWUpOworCisgICAgICAgIHJldHVybiBnZXRFdmVudE1ldHJpY0RhdGFMaXN0KCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQW5kVXBsb2FkQ29uZmlnKGludCBhdG9tVGFnLCBib29sZWFuIHVzZUF0dHJpYnV0aW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RhdHNkQ29uZmlnLkJ1aWxkZXIgY29uZiA9IGNyZWF0ZUNvbmZpZ0J1aWxkZXIoKTsKKyAgICAgICAgYWRkQXRvbUV2ZW50KGNvbmYsIGF0b21UYWcsIHVzZUF0dHJpYnV0aW9uKTsKKyAgICAgICAgdXBsb2FkQ29uZmlnKGNvbmYpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYW4gZXZlbnQgdG8gdGhlIGNvbmZpZyBmb3IgYW4gYXRvbSB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIGtleSBBTkQgaGFzIHRoZSBhcHAncyB1aWQuCisgICAgICogQHBhcmFtIGNvbmYgY29uZmlndXJhdGlvbgorICAgICAqIEBwYXJhbSBhdG9tVGFnIGF0b20gdGFnIChmcm9tIGF0b21zLnByb3RvKQorICAgICAqIEBwYXJhbSBmdm0gRmllbGRWYWx1ZU1hdGNoZXIuQnVpbGRlciBmb3IgdGhlIHJlbGV2YW50IGtleQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGFkZEF0b21FdmVudChTdGF0c2RDb25maWcuQnVpbGRlciBjb25mLCBpbnQgYXRvbVRhZywgRmllbGRWYWx1ZU1hdGNoZXIuQnVpbGRlciBmdm0pCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBmaW5hbCBpbnQgVUlEX0tFWSA9IDE7CisgICAgICAgIEZpZWxkVmFsdWVNYXRjaGVyLkJ1aWxkZXIgZnZtVWlkID0gY3JlYXRlQXR0cmlidXRpb25Gdm0oVUlEX0tFWSk7CisgICAgICAgIGFkZEF0b21FdmVudChjb25mLCBhdG9tVGFnLCBBcnJheXMuYXNMaXN0KGZ2bSwgZnZtVWlkKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhbiBldmVudCB0byB0aGUgY29uZmlnIGZvciBhbiBhdG9tIHRoYXQgbWF0Y2hlcyB0aGUgYXBwJ3MgdWlkLgorICAgICAqIEBwYXJhbSBjb25mIGNvbmZpZ3VyYXRpb24KKyAgICAgKiBAcGFyYW0gYXRvbVRhZyBhdG9tIHRhZyAoZnJvbSBhdG9tcy5wcm90bykKKyAgICAgKiBAcGFyYW0gdXNlQXR0cmlidXRpb24gaWYgdGhlIGF0b20gaGFzIGEgdWlkIG9yIEF0dHJpYnV0aW9uTm9kZQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGFkZEF0b21FdmVudChTdGF0c2RDb25maWcuQnVpbGRlciBjb25mLCBpbnQgYXRvbVRhZywKKyAgICAgICAgICAgIGJvb2xlYW4gdXNlQXR0cmlidXRpb24pIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBpbnQgVUlEX0tFWSA9IDE7CisgICAgICAgIEZpZWxkVmFsdWVNYXRjaGVyLkJ1aWxkZXIgZnZtVWlkOworICAgICAgICBpZiAodXNlQXR0cmlidXRpb24pIHsKKyAgICAgICAgICAgIGZ2bVVpZCA9IGNyZWF0ZUF0dHJpYnV0aW9uRnZtKFVJRF9LRVkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZnZtVWlkID0gY3JlYXRlRnZtKFVJRF9LRVkpLnNldEVxSW50KGdldFVpZCgpKTsKKyAgICAgICAgfQorICAgICAgICBhZGRBdG9tRXZlbnQoY29uZiwgYXRvbVRhZywgQXJyYXlzLmFzTGlzdChmdm1VaWQpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgRmllbGRWYWx1ZU1hdGNoZXIgZm9yIGF0b21zIHRoYXQgdXNlIEF0dHJpYnV0aW9uTm9kZQorICAgICAqLworICAgIHByb3RlY3RlZCBGaWVsZFZhbHVlTWF0Y2hlci5CdWlsZGVyIGNyZWF0ZUF0dHJpYnV0aW9uRnZtKGludCBmaWVsZCkgeworICAgICAgICBmaW5hbCBpbnQgQVRUUklCVVRJT05fTk9ERV9VSURfS0VZID0gMTsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZUZ2bShmaWVsZCkuc2V0UG9zaXRpb24oUG9zaXRpb24uQU5ZKQorICAgICAgICAgICAgICAgIC5zZXRNYXRjaGVzVHVwbGUoTWVzc2FnZU1hdGNoZXIubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuYWRkRmllbGRWYWx1ZU1hdGNoZXIoY3JlYXRlRnZtKEFUVFJJQlVUSU9OX05PREVfVUlEX0tFWSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEVxU3RyaW5nKERFVklDRV9TSURFX1RFU1RfUEFDS0FHRSkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB1aWQgb2YgdGhlIHRlc3QgYXBwLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgZ2V0VWlkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGludCBjdXJyZW50VXNlciA9IGdldERldmljZSgpLmdldEN1cnJlbnRVc2VyKCk7CisgICAgICAgIFN0cmluZyB1aWRMaW5lID0gZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZCgiY21kIHBhY2thZ2UgbGlzdCBwYWNrYWdlcyAtVSAtLXVzZXIgIgorICAgICAgICAgICAgICAgICsgY3VycmVudFVzZXIgKyAiICIgKyBERVZJQ0VfU0lERV9URVNUX1BBQ0tBR0UpOworICAgICAgICBTdHJpbmdbXSB1aWRMaW5lUGFydHMgPSB1aWRMaW5lLnNwbGl0KCI6Iik7CisgICAgICAgIC8vIDNyZCBlbnRyeSBpcyBwYWNrYWdlIHVpZAorICAgICAgICBhc3NlcnRUcnVlKHVpZExpbmVQYXJ0cy5sZW5ndGggPiAyKTsKKyAgICAgICAgaW50IHVpZCA9IEludGVnZXIucGFyc2VJbnQodWlkTGluZVBhcnRzWzJdLnRyaW0oKSk7CisgICAgICAgIGFzc2VydFRydWUodWlkID4gMTAwMDApOworICAgICAgICByZXR1cm4gdWlkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluc3RhbGxzIHRoZSB0ZXN0IGFway4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBpbnN0YWxsVGVzdEFwcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbnN0YWxsUGFja2FnZShERVZJQ0VfU0lERV9URVNUX0FQSywgdHJ1ZSk7CisgICAgICAgIExvZ1V0aWwuQ0xvZy5pKCJJbnN0YWxsaW5nIGRldmljZS1zaWRlIHRlc3QgYXBwIHdpdGggdWlkICIgKyBnZXRVaWQoKSk7CisgICAgICAgIGFsbG93QmFja2dyb3VuZFNlcnZpY2VzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVxdWlyZWQgdG8gc3VjY2Vzc2Z1bGx5IHN0YXJ0IGEgYmFja2dyb3VuZCBzZXJ2aWNlIGZyb20gYWRiIGluIE8uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgYWxsb3dCYWNrZ3JvdW5kU2VydmljZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZChTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICJjbWQgZGV2aWNlaWRsZSB0ZW1wd2hpdGVsaXN0ICVzIiwgREVWSUNFX1NJREVfVEVTVF9QQUNLQUdFKSk7CisgICAgfQorCisgICAgLyoqIE1ha2UgdGhlIHRlc3QgYXBwIHN0YW5kYnktYWN0aXZlIHNvIGl0IGNhbiBydW4gc3luY3MgYW5kIGpvYnMgaW1tZWRpYXRlbHkuICovCisgICAgcHJvdGVjdGVkIHZvaWQgYWxsb3dJbW1lZGlhdGVTeW5jcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBnZXREZXZpY2UoKS5leGVjdXRlU2hlbGxDb21tYW5kKCJhbSBzZXQtc3RhbmRieS1idWNrZXQgIgorICAgICAgICAgICAgICAgICsgREVWSUNFX1NJREVfVEVTVF9QQUNLQUdFICsgIiBhY3RpdmUiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSdW5zIHRoZSBzcGVjaWZpZWQgYWN0aXZpdHkuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcnVuQWN0aXZpdHkoU3RyaW5nIGFjdGl2aXR5LCBTdHJpbmcgYWN0aW9uS2V5LCBTdHJpbmcgYWN0aW9uVmFsdWUpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcnVuQWN0aXZpdHkoYWN0aXZpdHksIGFjdGlvbktleSwgYWN0aW9uVmFsdWUsIFdBSVRfVElNRV9MT05HKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSdW5zIHRoZSBzcGVjaWZpZWQgYWN0aXZpdHkuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcnVuQWN0aXZpdHkoU3RyaW5nIGFjdGl2aXR5LCBTdHJpbmcgYWN0aW9uS2V5LCBTdHJpbmcgYWN0aW9uVmFsdWUsCisgICAgICAgICAgICBsb25nIHdhaXRUaW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGludGVudFN0cmluZyA9IG51bGw7CisgICAgICAgIGlmIChhY3Rpb25LZXkgIT0gbnVsbCAmJiBhY3Rpb25WYWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBpbnRlbnRTdHJpbmcgPSBhY3Rpb25LZXkgKyAiICIgKyBhY3Rpb25WYWx1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW50ZW50U3RyaW5nID09IG51bGwpIHsKKyAgICAgICAgICAgIGdldERldmljZSgpLmV4ZWN1dGVTaGVsbENvbW1hbmQoCisgICAgICAgICAgICAgICAgICAgICJhbSBzdGFydCAtbiAiICsgREVWSUNFX1NJREVfVEVTVF9QQUNLQUdFICsgIi8uIiArIGFjdGl2aXR5KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdldERldmljZSgpLmV4ZWN1dGVTaGVsbENvbW1hbmQoCisgICAgICAgICAgICAgICAgICAgICJhbSBzdGFydCAtbiAiICsgREVWSUNFX1NJREVfVEVTVF9QQUNLQUdFICsgIi8uIiArIGFjdGl2aXR5ICsgIiAtZSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnRTdHJpbmcpOworICAgICAgICB9CisKKyAgICAgICAgVGhyZWFkLnNsZWVwKHdhaXRUaW1lKTsKKyAgICAgICAgZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZCgKKyAgICAgICAgICAgICAgICAiYW0gZm9yY2Utc3RvcCAiICsgREVWSUNFX1NJREVfVEVTVF9QQUNLQUdFKTsKKworICAgICAgICBUaHJlYWQuc2xlZXAoV0FJVF9USU1FX1NIT1JUKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCByZXNldEJhdHRlcnlTdGF0cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBnZXREZXZpY2UoKS5leGVjdXRlU2hlbGxDb21tYW5kKCJkdW1wc3lzIGJhdHRlcnlzdGF0cyAtLXJlc2V0Iik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zdGF0c2Qvc3JjL2FuZHJvaWQvY3RzL3N0YXRzZC9hdG9tL0hvc3RBdG9tVGVzdHMuamF2YSBiL2hvc3RzaWRldGVzdHMvc3RhdHNkL3NyYy9hbmRyb2lkL2N0cy9zdGF0c2QvYXRvbS9Ib3N0QXRvbVRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA2NjNhZAotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvc3RhdHNkL3NyYy9hbmRyb2lkL2N0cy9zdGF0c2QvYXRvbS9Ib3N0QXRvbVRlc3RzLmphdmEKQEAgLTAsMCArMSw0ODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLmN0cy5zdGF0c2QuYXRvbTsKKworaW1wb3J0IGFuZHJvaWQub3MuQmF0dGVyeVBsdWdnZWRTdGF0ZUVudW07CitpbXBvcnQgYW5kcm9pZC5vcy5CYXR0ZXJ5U3RhdHVzRW51bTsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUmVzdHJpY3RlZEJ1aWxkVGVzdDsKK2ltcG9ydCBhbmRyb2lkLnNlcnZlci5EZXZpY2VJZGxlTW9kZUVudW07CitpbXBvcnQgYW5kcm9pZC52aWV3LkRpc3BsYXlTdGF0ZUVudW07CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5vcy5TdGF0c2RDb25maWdQcm90by5GaWVsZE1hdGNoZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuU3RhdHNkQ29uZmlnUHJvdG8uU3RhdHNkQ29uZmlnOworaW1wb3J0IGNvbS5hbmRyb2lkLm9zLkF0b21zUHJvdG8uQXBwQnJlYWRjcnVtYlJlcG9ydGVkOworaW1wb3J0IGNvbS5hbmRyb2lkLm9zLkF0b21zUHJvdG8uQXRvbTsKK2ltcG9ydCBjb20uYW5kcm9pZC5vcy5BdG9tc1Byb3RvLkJhdHRlcnlTYXZlck1vZGVTdGF0ZUNoYW5nZWQ7CitpbXBvcnQgY29tLmFuZHJvaWQub3MuQXRvbXNQcm90by5GdWxsQmF0dGVyeUNhcGFjaXR5OworaW1wb3J0IGNvbS5hbmRyb2lkLm9zLkF0b21zUHJvdG8uS2VybmVsV2FrZWxvY2s7CitpbXBvcnQgY29tLmFuZHJvaWQub3MuQXRvbXNQcm90by5SZW1haW5pbmdCYXR0ZXJ5Q2FwYWNpdHk7CitpbXBvcnQgY29tLmFuZHJvaWQub3MuU3RhdHNMb2cuRXZlbnRNZXRyaWNEYXRhOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLyoqCisgKiBTdGF0c2QgYXRvbSB0ZXN0cyB0aGF0IGFyZSBkb25lIHZpYSBhZGIgKGhvc3RzaWRlKS4KKyAqLworcHVibGljIGNsYXNzIEhvc3RBdG9tVGVzdHMgZXh0ZW5kcyBBdG9tVGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTdGF0c2QuSG9zdEF0b21UZXN0cyI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVBVFVSRV9BVVRPTU9USVZFID0gImFuZHJvaWQuaGFyZHdhcmUudHlwZS5hdXRvbW90aXZlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVBVFVSRV9CTFVFVE9PVEggPSAiYW5kcm9pZC5oYXJkd2FyZS5ibHVldG9vdGgiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX1dJRkkgPSAiYW5kcm9pZC5oYXJkd2FyZS53aWZpIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVBVFVSRV9URUxFUEhPTlkgPSAiYW5kcm9pZC5oYXJkd2FyZS50ZWxlcGhvbnkiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX1dBVENIID0gImFuZHJvaWQuaGFyZHdhcmUudHlwZS53YXRjaCI7CisKKyAgICAvLyBFaXRoZXIgZmlsZSBtdXN0IGV4aXN0IHRvIHJlYWQga2VybmVsIHdha2UgbG9jayBzdGF0cy4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FLRV9MT0NLX0ZJTEUgPSAiL3Byb2Mvd2FrZWxvY2tzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FLRV9TT1VSQ0VTX0ZJTEUgPSAiL2Qvd2FrZXVwX3NvdXJjZXMiOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2NyZWVuU3RhdGVDaGFuZ2VkQXRvbSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoc3RhdHNkRGlzYWJsZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIFNldHVwLCBtYWtlIHN1cmUgdGhlIHNjcmVlbiBpcyBvZmYgYW5kIHR1cm4gb2ZmIEFvRCBpZiBpdCBpcyBvbi4KKyAgICAgICAgLy8gQW9EIG5lZWRzIHRvIGJlIHR1cm5lZCBvZmYgYmVjYXVzZSB0aGUgc2NyZWVuIHNob3VsZCBnbyBpbnRvIGFuIG9mZiBzdGF0ZS4gQnV0LCBpZiBBb0QgaXMKKyAgICAgICAgLy8gb24gYW5kIHRoZSBkZXZpY2UgZG9lc24ndCBzdXBwb3J0IFNUQVRFX0RPWkUsIHRoZSBzY3JlZW4gc2FkbHkgZ29lcyBiYWNrIHRvIFNUQVRFX09OLgorICAgICAgICBTdHJpbmcgYW9kU3RhdGUgPSBnZXRBb2RTdGF0ZSgpOworICAgICAgICBzZXRBb2RTdGF0ZSgiMCIpOworICAgICAgICB0dXJuU2NyZWVuT24oKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKFdBSVRfVElNRV9TSE9SVCk7CisgICAgICAgIHR1cm5TY3JlZW5PZmYoKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKFdBSVRfVElNRV9TSE9SVCk7CisKKyAgICAgICAgZmluYWwgaW50IGF0b21UYWcgPSBBdG9tLlNDUkVFTl9TVEFURV9DSEFOR0VEX0ZJRUxEX05VTUJFUjsKKworICAgICAgICBTZXQ8SW50ZWdlcj4gc2NyZWVuT25TdGF0ZXMgPSBuZXcgSGFzaFNldDw+KAorICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoRGlzcGxheVN0YXRlRW51bS5ESVNQTEFZX1NUQVRFX09OX1ZBTFVFLAorICAgICAgICAgICAgICAgICAgICAgICAgRGlzcGxheVN0YXRlRW51bS5ESVNQTEFZX1NUQVRFX09OX1NVU1BFTkRfVkFMVUUsCisgICAgICAgICAgICAgICAgICAgICAgICBEaXNwbGF5U3RhdGVFbnVtLkRJU1BMQVlfU1RBVEVfVlJfVkFMVUUpKTsKKyAgICAgICAgU2V0PEludGVnZXI+IHNjcmVlbk9mZlN0YXRlcyA9IG5ldyBIYXNoU2V0PD4oCisgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChEaXNwbGF5U3RhdGVFbnVtLkRJU1BMQVlfU1RBVEVfT0ZGX1ZBTFVFLAorICAgICAgICAgICAgICAgICAgICAgICAgRGlzcGxheVN0YXRlRW51bS5ESVNQTEFZX1NUQVRFX0RPWkVfVkFMVUUsCisgICAgICAgICAgICAgICAgICAgICAgICBEaXNwbGF5U3RhdGVFbnVtLkRJU1BMQVlfU1RBVEVfRE9aRV9TVVNQRU5EX1ZBTFVFLAorICAgICAgICAgICAgICAgICAgICAgICAgRGlzcGxheVN0YXRlRW51bS5ESVNQTEFZX1NUQVRFX1VOS05PV05fVkFMVUUpKTsKKworICAgICAgICAvLyBBZGQgc3RhdGUgc2V0cyB0byB0aGUgbGlzdCBpbiBvcmRlci4KKyAgICAgICAgTGlzdDxTZXQ8SW50ZWdlcj4+IHN0YXRlU2V0ID0gQXJyYXlzLmFzTGlzdChzY3JlZW5PblN0YXRlcywgc2NyZWVuT2ZmU3RhdGVzKTsKKworICAgICAgICBjcmVhdGVBbmRVcGxvYWRDb25maWcoYXRvbVRhZyk7CisgICAgICAgIFRocmVhZC5zbGVlcChXQUlUX1RJTUVfU0hPUlQpOworCisgICAgICAgIC8vIFRyaWdnZXIgZXZlbnRzIGluIHNhbWUgb3JkZXIuCisgICAgICAgIHR1cm5TY3JlZW5PbigpOworICAgICAgICBUaHJlYWQuc2xlZXAoV0FJVF9USU1FX0xPTkcpOworICAgICAgICB0dXJuU2NyZWVuT2ZmKCk7CisgICAgICAgIFRocmVhZC5zbGVlcChXQUlUX1RJTUVfTE9ORyk7CisKKyAgICAgICAgLy8gU29ydGVkIGxpc3Qgb2YgZXZlbnRzIGluIG9yZGVyIGluIHdoaWNoIHRoZXkgb2NjdXJyZWQuCisgICAgICAgIExpc3Q8RXZlbnRNZXRyaWNEYXRhPiBkYXRhID0gZ2V0RXZlbnRNZXRyaWNEYXRhTGlzdCgpOworICAgICAgICAvLyByZXNldCBzY3JlZW4gdG8gb24KKyAgICAgICAgdHVyblNjcmVlbk9uKCk7CisgICAgICAgIC8vIFJlc3RvcmVzIEFvRCB0byBpbml0aWFsIHN0YXRlLgorICAgICAgICBzZXRBb2RTdGF0ZShhb2RTdGF0ZSk7CisgICAgICAgIC8vIEFzc2VydCB0aGF0IHRoZSBldmVudHMgaGFwcGVuZWQgaW4gdGhlIGV4cGVjdGVkIG9yZGVyLgorICAgICAgICBhc3NlcnRTdGF0ZXNPY2N1cnJlZChzdGF0ZVNldCwgZGF0YSwgV0FJVF9USU1FX0xPTkcsCisgICAgICAgICAgICAgICAgYXRvbSAtPiBhdG9tLmdldFNjcmVlblN0YXRlQ2hhbmdlZCgpLmdldFN0YXRlKCkuZ2V0TnVtYmVyKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDaGFyZ2luZ1N0YXRlQ2hhbmdlZEF0b20oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHN0YXRzZERpc2FibGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWhhc0ZlYXR1cmUoRkVBVFVSRV9BVVRPTU9USVZFLCBmYWxzZSkpIHJldHVybjsKKyAgICAgICAgLy8gU2V0dXAsIHNldCBjaGFyZ2luZyBzdGF0ZSB0byBmdWxsLgorICAgICAgICBzZXRDaGFyZ2luZ1N0YXRlKDUpOworICAgICAgICBUaHJlYWQuc2xlZXAoV0FJVF9USU1FX1NIT1JUKTsKKworICAgICAgICBmaW5hbCBpbnQgYXRvbVRhZyA9IEF0b20uQ0hBUkdJTkdfU1RBVEVfQ0hBTkdFRF9GSUVMRF9OVU1CRVI7CisKKyAgICAgICAgU2V0PEludGVnZXI+IGJhdHRlcnlVbmtub3duU3RhdGVzID0gbmV3IEhhc2hTZXQ8PigKKyAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KEJhdHRlcnlTdGF0dXNFbnVtLkJBVFRFUllfU1RBVFVTX1VOS05PV05fVkFMVUUpKTsKKyAgICAgICAgU2V0PEludGVnZXI+IGJhdHRlcnlDaGFyZ2luZ1N0YXRlcyA9IG5ldyBIYXNoU2V0PD4oCisgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChCYXR0ZXJ5U3RhdHVzRW51bS5CQVRURVJZX1NUQVRVU19DSEFSR0lOR19WQUxVRSkpOworICAgICAgICBTZXQ8SW50ZWdlcj4gYmF0dGVyeURpc2NoYXJnaW5nU3RhdGVzID0gbmV3IEhhc2hTZXQ8PigKKyAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KEJhdHRlcnlTdGF0dXNFbnVtLkJBVFRFUllfU1RBVFVTX0RJU0NIQVJHSU5HX1ZBTFVFKSk7CisgICAgICAgIFNldDxJbnRlZ2VyPiBiYXR0ZXJ5Tm90Q2hhcmdpbmdTdGF0ZXMgPSBuZXcgSGFzaFNldDw+KAorICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoQmF0dGVyeVN0YXR1c0VudW0uQkFUVEVSWV9TVEFUVVNfTk9UX0NIQVJHSU5HX1ZBTFVFKSk7CisgICAgICAgIFNldDxJbnRlZ2VyPiBiYXR0ZXJ5RnVsbFN0YXRlcyA9IG5ldyBIYXNoU2V0PD4oCisgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChCYXR0ZXJ5U3RhdHVzRW51bS5CQVRURVJZX1NUQVRVU19GVUxMX1ZBTFVFKSk7CisKKyAgICAgICAgLy8gQWRkIHN0YXRlIHNldHMgdG8gdGhlIGxpc3QgaW4gb3JkZXIuCisgICAgICAgIExpc3Q8U2V0PEludGVnZXI+PiBzdGF0ZVNldCA9IEFycmF5cy5hc0xpc3QoYmF0dGVyeVVua25vd25TdGF0ZXMsIGJhdHRlcnlDaGFyZ2luZ1N0YXRlcywKKyAgICAgICAgICAgICAgICBiYXR0ZXJ5RGlzY2hhcmdpbmdTdGF0ZXMsIGJhdHRlcnlOb3RDaGFyZ2luZ1N0YXRlcywgYmF0dGVyeUZ1bGxTdGF0ZXMpOworCisgICAgICAgIGNyZWF0ZUFuZFVwbG9hZENvbmZpZyhhdG9tVGFnKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKFdBSVRfVElNRV9TSE9SVCk7CisKKyAgICAgICAgLy8gVHJpZ2dlciBldmVudHMgaW4gc2FtZSBvcmRlci4KKyAgICAgICAgc2V0Q2hhcmdpbmdTdGF0ZSgxKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKFdBSVRfVElNRV9TSE9SVCk7CisgICAgICAgIHNldENoYXJnaW5nU3RhdGUoMik7CisgICAgICAgIFRocmVhZC5zbGVlcChXQUlUX1RJTUVfU0hPUlQpOworICAgICAgICBzZXRDaGFyZ2luZ1N0YXRlKDMpOworICAgICAgICBUaHJlYWQuc2xlZXAoV0FJVF9USU1FX1NIT1JUKTsKKyAgICAgICAgc2V0Q2hhcmdpbmdTdGF0ZSg0KTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKFdBSVRfVElNRV9TSE9SVCk7CisgICAgICAgIHNldENoYXJnaW5nU3RhdGUoNSk7CisgICAgICAgIFRocmVhZC5zbGVlcChXQUlUX1RJTUVfU0hPUlQpOworCisgICAgICAgIC8vIFNvcnRlZCBsaXN0IG9mIGV2ZW50cyBpbiBvcmRlciBpbiB3aGljaCB0aGV5IG9jY3VycmVkLgorICAgICAgICBMaXN0PEV2ZW50TWV0cmljRGF0YT4gZGF0YSA9IGdldEV2ZW50TWV0cmljRGF0YUxpc3QoKTsKKworICAgICAgICAvLyBVbmZyZWV6ZSBiYXR0ZXJ5IHN0YXRlIGFmdGVyIHRlc3QKKyAgICAgICAgcmVzZXRCYXR0ZXJ5U3RhdHVzKCk7CisgICAgICAgIFRocmVhZC5zbGVlcChXQUlUX1RJTUVfU0hPUlQpOworCisgICAgICAgIC8vIEFzc2VydCB0aGF0IHRoZSBldmVudHMgaGFwcGVuZWQgaW4gdGhlIGV4cGVjdGVkIG9yZGVyLgorICAgICAgICBhc3NlcnRTdGF0ZXNPY2N1cnJlZChzdGF0ZVNldCwgZGF0YSwgV0FJVF9USU1FX1NIT1JULAorICAgICAgICAgICAgICAgIGF0b20gLT4gYXRvbS5nZXRDaGFyZ2luZ1N0YXRlQ2hhbmdlZCgpLmdldFN0YXRlKCkuZ2V0TnVtYmVyKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQbHVnZ2VkU3RhdGVDaGFuZ2VkQXRvbSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoc3RhdHNkRGlzYWJsZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICghaGFzRmVhdHVyZShGRUFUVVJFX0FVVE9NT1RJVkUsIGZhbHNlKSkgcmV0dXJuOworICAgICAgICAvLyBTZXR1cCwgdW5wbHVnIGRldmljZS4KKyAgICAgICAgdW5wbHVnRGV2aWNlKCk7CisgICAgICAgIFRocmVhZC5zbGVlcChXQUlUX1RJTUVfU0hPUlQpOworCisgICAgICAgIGZpbmFsIGludCBhdG9tVGFnID0gQXRvbS5QTFVHR0VEX1NUQVRFX0NIQU5HRURfRklFTERfTlVNQkVSOworCisgICAgICAgIFNldDxJbnRlZ2VyPiB1bnBsdWdnZWRTdGF0ZXMgPSBuZXcgSGFzaFNldDw+KAorICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoQmF0dGVyeVBsdWdnZWRTdGF0ZUVudW0uQkFUVEVSWV9QTFVHR0VEX05PTkVfVkFMVUUpKTsKKyAgICAgICAgU2V0PEludGVnZXI+IGFjU3RhdGVzID0gbmV3IEhhc2hTZXQ8PigKKyAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KEJhdHRlcnlQbHVnZ2VkU3RhdGVFbnVtLkJBVFRFUllfUExVR0dFRF9BQ19WQUxVRSkpOworICAgICAgICBTZXQ8SW50ZWdlcj4gdXNiU3RhdGVzID0gbmV3IEhhc2hTZXQ8PigKKyAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KEJhdHRlcnlQbHVnZ2VkU3RhdGVFbnVtLkJBVFRFUllfUExVR0dFRF9VU0JfVkFMVUUpKTsKKyAgICAgICAgU2V0PEludGVnZXI+IHdpcmVsZXNzU3RhdGVzID0gbmV3IEhhc2hTZXQ8PigKKyAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KEJhdHRlcnlQbHVnZ2VkU3RhdGVFbnVtLkJBVFRFUllfUExVR0dFRF9XSVJFTEVTU19WQUxVRSkpOworCisgICAgICAgIC8vIEFkZCBzdGF0ZSBzZXRzIHRvIHRoZSBsaXN0IGluIG9yZGVyLgorICAgICAgICBMaXN0PFNldDxJbnRlZ2VyPj4gc3RhdGVTZXQgPSBBcnJheXMuYXNMaXN0KGFjU3RhdGVzLCB1bnBsdWdnZWRTdGF0ZXMsIHVzYlN0YXRlcywKKyAgICAgICAgICAgICAgICB1bnBsdWdnZWRTdGF0ZXMsIHdpcmVsZXNzU3RhdGVzLCB1bnBsdWdnZWRTdGF0ZXMpOworCisgICAgICAgIGNyZWF0ZUFuZFVwbG9hZENvbmZpZyhhdG9tVGFnKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKFdBSVRfVElNRV9TSE9SVCk7CisKKyAgICAgICAgLy8gVHJpZ2dlciBldmVudHMgaW4gc2FtZSBvcmRlci4KKyAgICAgICAgcGx1Z0luQWMoKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKFdBSVRfVElNRV9TSE9SVCk7CisgICAgICAgIHVucGx1Z0RldmljZSgpOworICAgICAgICBUaHJlYWQuc2xlZXAoV0FJVF9USU1FX1NIT1JUKTsKKyAgICAgICAgcGx1Z0luVXNiKCk7CisgICAgICAgIFRocmVhZC5zbGVlcChXQUlUX1RJTUVfU0hPUlQpOworICAgICAgICB1bnBsdWdEZXZpY2UoKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKFdBSVRfVElNRV9TSE9SVCk7CisgICAgICAgIHBsdWdJbldpcmVsZXNzKCk7CisgICAgICAgIFRocmVhZC5zbGVlcChXQUlUX1RJTUVfU0hPUlQpOworICAgICAgICB1bnBsdWdEZXZpY2UoKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKFdBSVRfVElNRV9TSE9SVCk7CisKKyAgICAgICAgLy8gU29ydGVkIGxpc3Qgb2YgZXZlbnRzIGluIG9yZGVyIGluIHdoaWNoIHRoZXkgb2NjdXJyZWQuCisgICAgICAgIExpc3Q8RXZlbnRNZXRyaWNEYXRhPiBkYXRhID0gZ2V0RXZlbnRNZXRyaWNEYXRhTGlzdCgpOworCisgICAgICAgIC8vIFVuZnJlZXplIGJhdHRlcnkgc3RhdGUgYWZ0ZXIgdGVzdAorICAgICAgICByZXNldEJhdHRlcnlTdGF0dXMoKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKFdBSVRfVElNRV9TSE9SVCk7CisKKyAgICAgICAgLy8gQXNzZXJ0IHRoYXQgdGhlIGV2ZW50cyBoYXBwZW5lZCBpbiB0aGUgZXhwZWN0ZWQgb3JkZXIuCisgICAgICAgIGFzc2VydFN0YXRlc09jY3VycmVkKHN0YXRlU2V0LCBkYXRhLCBXQUlUX1RJTUVfU0hPUlQsCisgICAgICAgICAgICAgICAgYXRvbSAtPiBhdG9tLmdldFBsdWdnZWRTdGF0ZUNoYW5nZWQoKS5nZXRTdGF0ZSgpLmdldE51bWJlcigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmF0dGVyeUxldmVsQ2hhbmdlZEF0b20oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHN0YXRzZERpc2FibGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWhhc0ZlYXR1cmUoRkVBVFVSRV9BVVRPTU9USVZFLCBmYWxzZSkpIHJldHVybjsKKyAgICAgICAgLy8gU2V0dXAsIHNldCBiYXR0ZXJ5IGxldmVsIHRvIGZ1bGwuCisgICAgICAgIHNldEJhdHRlcnlMZXZlbCgxMDApOworICAgICAgICBUaHJlYWQuc2xlZXAoV0FJVF9USU1FX1NIT1JUKTsKKworICAgICAgICBmaW5hbCBpbnQgYXRvbVRhZyA9IEF0b20uQkFUVEVSWV9MRVZFTF9DSEFOR0VEX0ZJRUxEX05VTUJFUjsKKworICAgICAgICBTZXQ8SW50ZWdlcj4gYmF0dGVyeURlYWQgPSBuZXcgSGFzaFNldDw+KEFycmF5cy5hc0xpc3QoMCkpOworICAgICAgICBTZXQ8SW50ZWdlcj4gYmF0dGVyeTI1cCA9IG5ldyBIYXNoU2V0PD4oQXJyYXlzLmFzTGlzdCgyNSkpOworICAgICAgICBTZXQ8SW50ZWdlcj4gYmF0dGVyeTUwcCA9IG5ldyBIYXNoU2V0PD4oQXJyYXlzLmFzTGlzdCg1MCkpOworICAgICAgICBTZXQ8SW50ZWdlcj4gYmF0dGVyeTc1cCA9IG5ldyBIYXNoU2V0PD4oQXJyYXlzLmFzTGlzdCg3NSkpOworICAgICAgICBTZXQ8SW50ZWdlcj4gYmF0dGVyeUZ1bGwgPSBuZXcgSGFzaFNldDw+KEFycmF5cy5hc0xpc3QoMTAwKSk7CisKKyAgICAgICAgLy8gQWRkIHN0YXRlIHNldHMgdG8gdGhlIGxpc3QgaW4gb3JkZXIuCisgICAgICAgIExpc3Q8U2V0PEludGVnZXI+PiBzdGF0ZVNldCA9IEFycmF5cy5hc0xpc3QoYmF0dGVyeURlYWQsIGJhdHRlcnkyNXAsIGJhdHRlcnk1MHAsCisgICAgICAgICAgICAgICAgYmF0dGVyeTc1cCwgYmF0dGVyeUZ1bGwpOworCisgICAgICAgIGNyZWF0ZUFuZFVwbG9hZENvbmZpZyhhdG9tVGFnKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKFdBSVRfVElNRV9TSE9SVCk7CisKKyAgICAgICAgLy8gVHJpZ2dlciBldmVudHMgaW4gc2FtZSBvcmRlci4KKyAgICAgICAgc2V0QmF0dGVyeUxldmVsKDApOworICAgICAgICBUaHJlYWQuc2xlZXAoV0FJVF9USU1FX1NIT1JUKTsKKyAgICAgICAgc2V0QmF0dGVyeUxldmVsKDI1KTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKFdBSVRfVElNRV9TSE9SVCk7CisgICAgICAgIHNldEJhdHRlcnlMZXZlbCg1MCk7CisgICAgICAgIFRocmVhZC5zbGVlcChXQUlUX1RJTUVfU0hPUlQpOworICAgICAgICBzZXRCYXR0ZXJ5TGV2ZWwoNzUpOworICAgICAgICBUaHJlYWQuc2xlZXAoV0FJVF9USU1FX1NIT1JUKTsKKyAgICAgICAgc2V0QmF0dGVyeUxldmVsKDEwMCk7CisgICAgICAgIFRocmVhZC5zbGVlcChXQUlUX1RJTUVfU0hPUlQpOworCisgICAgICAgIC8vIFNvcnRlZCBsaXN0IG9mIGV2ZW50cyBpbiBvcmRlciBpbiB3aGljaCB0aGV5IG9jY3VycmVkLgorICAgICAgICBMaXN0PEV2ZW50TWV0cmljRGF0YT4gZGF0YSA9IGdldEV2ZW50TWV0cmljRGF0YUxpc3QoKTsKKworICAgICAgICAvLyBVbmZyZWV6ZSBiYXR0ZXJ5IHN0YXRlIGFmdGVyIHRlc3QKKyAgICAgICAgcmVzZXRCYXR0ZXJ5U3RhdHVzKCk7CisgICAgICAgIFRocmVhZC5zbGVlcChXQUlUX1RJTUVfU0hPUlQpOworCisgICAgICAgIC8vIEFzc2VydCB0aGF0IHRoZSBldmVudHMgaGFwcGVuZWQgaW4gdGhlIGV4cGVjdGVkIG9yZGVyLgorICAgICAgICBhc3NlcnRTdGF0ZXNPY2N1cnJlZChzdGF0ZVNldCwgZGF0YSwgV0FJVF9USU1FX1NIT1JULAorICAgICAgICAgICAgICAgIGF0b20gLT4gYXRvbS5nZXRCYXR0ZXJ5TGV2ZWxDaGFuZ2VkKCkuZ2V0QmF0dGVyeUxldmVsKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3REZXZpY2VJZGxlTW9kZVN0YXRlQ2hhbmdlZEF0b20oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHN0YXRzZERpc2FibGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBTZXR1cCwgbGVhdmUgZG96ZSBtb2RlLgorICAgICAgICBsZWF2ZURvemVNb2RlKCk7CisgICAgICAgIFRocmVhZC5zbGVlcChXQUlUX1RJTUVfU0hPUlQpOworCisgICAgICAgIGZpbmFsIGludCBhdG9tVGFnID0gQXRvbS5ERVZJQ0VfSURMRV9NT0RFX1NUQVRFX0NIQU5HRURfRklFTERfTlVNQkVSOworCisgICAgICAgIFNldDxJbnRlZ2VyPiBkb3plT2ZmID0gbmV3IEhhc2hTZXQ8PigKKyAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KERldmljZUlkbGVNb2RlRW51bS5ERVZJQ0VfSURMRV9NT0RFX09GRl9WQUxVRSkpOworICAgICAgICBTZXQ8SW50ZWdlcj4gZG96ZUxpZ2h0ID0gbmV3IEhhc2hTZXQ8PigKKyAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KERldmljZUlkbGVNb2RlRW51bS5ERVZJQ0VfSURMRV9NT0RFX0xJR0hUX1ZBTFVFKSk7CisgICAgICAgIFNldDxJbnRlZ2VyPiBkb3plRGVlcCA9IG5ldyBIYXNoU2V0PD4oCisgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChEZXZpY2VJZGxlTW9kZUVudW0uREVWSUNFX0lETEVfTU9ERV9ERUVQX1ZBTFVFKSk7CisKKyAgICAgICAgLy8gQWRkIHN0YXRlIHNldHMgdG8gdGhlIGxpc3QgaW4gb3JkZXIuCisgICAgICAgIExpc3Q8U2V0PEludGVnZXI+PiBzdGF0ZVNldCA9IEFycmF5cy5hc0xpc3QoZG96ZUxpZ2h0LCBkb3plRGVlcCwgZG96ZU9mZik7CisKKyAgICAgICAgY3JlYXRlQW5kVXBsb2FkQ29uZmlnKGF0b21UYWcpOworICAgICAgICBUaHJlYWQuc2xlZXAoV0FJVF9USU1FX1NIT1JUKTsKKworICAgICAgICAvLyBUcmlnZ2VyIGV2ZW50cyBpbiBzYW1lIG9yZGVyLgorICAgICAgICBlbnRlckRvemVNb2RlTGlnaHQoKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKFdBSVRfVElNRV9TSE9SVCk7CisgICAgICAgIGVudGVyRG96ZU1vZGVEZWVwKCk7CisgICAgICAgIFRocmVhZC5zbGVlcChXQUlUX1RJTUVfU0hPUlQpOworICAgICAgICBsZWF2ZURvemVNb2RlKCk7CisgICAgICAgIFRocmVhZC5zbGVlcChXQUlUX1RJTUVfU0hPUlQpOworCisgICAgICAgIC8vIFNvcnRlZCBsaXN0IG9mIGV2ZW50cyBpbiBvcmRlciBpbiB3aGljaCB0aGV5IG9jY3VycmVkLgorICAgICAgICBMaXN0PEV2ZW50TWV0cmljRGF0YT4gZGF0YSA9IGdldEV2ZW50TWV0cmljRGF0YUxpc3QoKTs7CisKKyAgICAgICAgLy8gQXNzZXJ0IHRoYXQgdGhlIGV2ZW50cyBoYXBwZW5lZCBpbiB0aGUgZXhwZWN0ZWQgb3JkZXIuCisgICAgICAgIGFzc2VydFN0YXRlc09jY3VycmVkKHN0YXRlU2V0LCBkYXRhLCBXQUlUX1RJTUVfU0hPUlQsCisgICAgICAgICAgICAgICAgYXRvbSAtPiBhdG9tLmdldERldmljZUlkbGVNb2RlU3RhdGVDaGFuZ2VkKCkuZ2V0U3RhdGUoKS5nZXROdW1iZXIoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEJhdHRlcnlTYXZlck1vZGVTdGF0ZUNoYW5nZWRBdG9tKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChzdGF0c2REaXNhYmxlZCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFoYXNGZWF0dXJlKEZFQVRVUkVfQVVUT01PVElWRSwgZmFsc2UpKSByZXR1cm47CisgICAgICAgIC8vIFNldHVwLCB0dXJuIG9mZiBiYXR0ZXJ5IHNhdmVyLgorICAgICAgICB0dXJuQmF0dGVyeVNhdmVyT2ZmKCk7CisgICAgICAgIFRocmVhZC5zbGVlcChXQUlUX1RJTUVfU0hPUlQpOworCisgICAgICAgIGZpbmFsIGludCBhdG9tVGFnID0gQXRvbS5CQVRURVJZX1NBVkVSX01PREVfU1RBVEVfQ0hBTkdFRF9GSUVMRF9OVU1CRVI7CisKKyAgICAgICAgU2V0PEludGVnZXI+IGJhdHRlcnlTYXZlck9uID0gbmV3IEhhc2hTZXQ8PigKKyAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KEJhdHRlcnlTYXZlck1vZGVTdGF0ZUNoYW5nZWQuU3RhdGUuT05fVkFMVUUpKTsKKyAgICAgICAgU2V0PEludGVnZXI+IGJhdHRlcnlTYXZlck9mZiA9IG5ldyBIYXNoU2V0PD4oCisgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChCYXR0ZXJ5U2F2ZXJNb2RlU3RhdGVDaGFuZ2VkLlN0YXRlLk9GRl9WQUxVRSkpOworCisgICAgICAgIC8vIEFkZCBzdGF0ZSBzZXRzIHRvIHRoZSBsaXN0IGluIG9yZGVyLgorICAgICAgICBMaXN0PFNldDxJbnRlZ2VyPj4gc3RhdGVTZXQgPSBBcnJheXMuYXNMaXN0KGJhdHRlcnlTYXZlck9uLCBiYXR0ZXJ5U2F2ZXJPZmYpOworCisgICAgICAgIGNyZWF0ZUFuZFVwbG9hZENvbmZpZyhhdG9tVGFnKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKFdBSVRfVElNRV9TSE9SVCk7CisKKyAgICAgICAgLy8gVHJpZ2dlciBldmVudHMgaW4gc2FtZSBvcmRlci4KKyAgICAgICAgdHVybkJhdHRlcnlTYXZlck9uKCk7CisgICAgICAgIFRocmVhZC5zbGVlcChXQUlUX1RJTUVfTE9ORyk7CisgICAgICAgIHR1cm5CYXR0ZXJ5U2F2ZXJPZmYoKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKFdBSVRfVElNRV9MT05HKTsKKworICAgICAgICAvLyBTb3J0ZWQgbGlzdCBvZiBldmVudHMgaW4gb3JkZXIgaW4gd2hpY2ggdGhleSBvY2N1cnJlZC4KKyAgICAgICAgTGlzdDxFdmVudE1ldHJpY0RhdGE+IGRhdGEgPSBnZXRFdmVudE1ldHJpY0RhdGFMaXN0KCk7CisKKyAgICAgICAgLy8gQXNzZXJ0IHRoYXQgdGhlIGV2ZW50cyBoYXBwZW5lZCBpbiB0aGUgZXhwZWN0ZWQgb3JkZXIuCisgICAgICAgIGFzc2VydFN0YXRlc09jY3VycmVkKHN0YXRlU2V0LCBkYXRhLCBXQUlUX1RJTUVfTE9ORywKKyAgICAgICAgICAgICAgICBhdG9tIC0+IGF0b20uZ2V0QmF0dGVyeVNhdmVyTW9kZVN0YXRlQ2hhbmdlZCgpLmdldFN0YXRlKCkuZ2V0TnVtYmVyKCkpOworICAgIH0KKworICAgIEBSZXN0cmljdGVkQnVpbGRUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlbWFpbmluZ0JhdHRlcnlDYXBhY2l0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoc3RhdHNkRGlzYWJsZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICghaGFzRmVhdHVyZShGRUFUVVJFX1dBVENILCBmYWxzZSkpIHJldHVybjsKKyAgICAgICAgaWYgKCFoYXNGZWF0dXJlKEZFQVRVUkVfQVVUT01PVElWRSwgZmFsc2UpKSByZXR1cm47CisgICAgICAgIGlmICghaGFzQmF0dGVyeSgpKSByZXR1cm47CisgICAgICAgIFN0YXRzZENvbmZpZy5CdWlsZGVyIGNvbmZpZyA9IGdldFB1bGxlZENvbmZpZygpOworICAgICAgICBGaWVsZE1hdGNoZXIuQnVpbGRlciBkaW1lbnNpb24gPSBGaWVsZE1hdGNoZXIubmV3QnVpbGRlcigpCisgICAgICAgICAgICAuc2V0RmllbGQoQXRvbS5SRU1BSU5JTkdfQkFUVEVSWV9DQVBBQ0lUWV9GSUVMRF9OVU1CRVIpCisgICAgICAgICAgICAuYWRkQ2hpbGQoRmllbGRNYXRjaGVyLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRGaWVsZChSZW1haW5pbmdCYXR0ZXJ5Q2FwYWNpdHkuQ0hBUkdFX1VBSF9GSUVMRF9OVU1CRVIpKTsKKyAgICAgICAgYWRkR2F1Z2VBdG9tKGNvbmZpZywgQXRvbS5SRU1BSU5JTkdfQkFUVEVSWV9DQVBBQ0lUWV9GSUVMRF9OVU1CRVIsIGRpbWVuc2lvbik7CisKKyAgICAgICAgdXBsb2FkQ29uZmlnKGNvbmZpZyk7CisKKyAgICAgICAgVGhyZWFkLnNsZWVwKFdBSVRfVElNRV9MT05HKTsKKyAgICAgICAgc2V0QXBwQnJlYWRjcnVtYlByZWRpY2F0ZSgpOworICAgICAgICBUaHJlYWQuc2xlZXAoV0FJVF9USU1FX0xPTkcpOworCisgICAgICAgIExpc3Q8QXRvbT4gZGF0YSA9IGdldEdhdWdlTWV0cmljRGF0YUxpc3QoKTsKKworICAgICAgICBhc3NlcnRUcnVlKGRhdGEuc2l6ZSgpID4gMCk7CisgICAgICAgIEF0b20gYXRvbSA9IGRhdGEuZ2V0KDApOworICAgICAgICBhc3NlcnRUcnVlKGF0b20uZ2V0UmVtYWluaW5nQmF0dGVyeUNhcGFjaXR5KCkuaGFzQ2hhcmdlVUFoKCkpOworICAgICAgICBhc3NlcnRUcnVlKGF0b20uZ2V0UmVtYWluaW5nQmF0dGVyeUNhcGFjaXR5KCkuZ2V0Q2hhcmdlVUFoKCkgPiAwKTsKKyAgICB9CisKKyAgICBAUmVzdHJpY3RlZEJ1aWxkVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGdWxsQmF0dGVyeUNhcGFjaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChzdGF0c2REaXNhYmxlZCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFoYXNGZWF0dXJlKEZFQVRVUkVfV0FUQ0gsIGZhbHNlKSkgcmV0dXJuOworICAgICAgICBpZiAoIWhhc0ZlYXR1cmUoRkVBVFVSRV9BVVRPTU9USVZFLCBmYWxzZSkpIHJldHVybjsKKyAgICAgICAgaWYgKCFoYXNCYXR0ZXJ5KCkpIHJldHVybjsKKyAgICAgICAgU3RhdHNkQ29uZmlnLkJ1aWxkZXIgY29uZmlnID0gZ2V0UHVsbGVkQ29uZmlnKCk7CisgICAgICAgIEZpZWxkTWF0Y2hlci5CdWlsZGVyIGRpbWVuc2lvbiA9IEZpZWxkTWF0Y2hlci5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0RmllbGQoQXRvbS5GVUxMX0JBVFRFUllfQ0FQQUNJVFlfRklFTERfTlVNQkVSKQorICAgICAgICAgICAgICAgIC5hZGRDaGlsZChGaWVsZE1hdGNoZXIubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoRnVsbEJhdHRlcnlDYXBhY2l0eS5DQVBBQ0lUWV9VQUhfRklFTERfTlVNQkVSKSk7CisgICAgICAgIGFkZEdhdWdlQXRvbShjb25maWcsIEF0b20uRlVMTF9CQVRURVJZX0NBUEFDSVRZX0ZJRUxEX05VTUJFUiwgZGltZW5zaW9uKTsKKworICAgICAgICB1cGxvYWRDb25maWcoY29uZmlnKTsKKworICAgICAgICBUaHJlYWQuc2xlZXAoV0FJVF9USU1FX0xPTkcpOworICAgICAgICBzZXRBcHBCcmVhZGNydW1iUHJlZGljYXRlKCk7CisgICAgICAgIFRocmVhZC5zbGVlcChXQUlUX1RJTUVfTE9ORyk7CisKKyAgICAgICAgTGlzdDxBdG9tPiBkYXRhID0gZ2V0R2F1Z2VNZXRyaWNEYXRhTGlzdCgpOworCisgICAgICAgIGFzc2VydFRydWUoZGF0YS5zaXplKCkgPiAwKTsKKyAgICAgICAgQXRvbSBhdG9tID0gZGF0YS5nZXQoMCk7CisgICAgICAgIGFzc2VydFRydWUoYXRvbS5nZXRGdWxsQmF0dGVyeUNhcGFjaXR5KCkuaGFzQ2FwYWNpdHlVQWgoKSk7CisgICAgICAgIGFzc2VydFRydWUoYXRvbS5nZXRGdWxsQmF0dGVyeUNhcGFjaXR5KCkuZ2V0Q2FwYWNpdHlVQWgoKSA+IDApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RLZXJuZWxXYWtlbG9jaygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoc3RhdHNkRGlzYWJsZWQoKSB8fCAha2VybmVsV2FrZWxvY2tTdGF0c0V4aXN0KCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBTdGF0c2RDb25maWcuQnVpbGRlciBjb25maWcgPSBnZXRQdWxsZWRDb25maWcoKTsKKyAgICAgICAgRmllbGRNYXRjaGVyLkJ1aWxkZXIgZGltZW5zaW9uID0gRmllbGRNYXRjaGVyLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRGaWVsZChBdG9tLktFUk5FTF9XQUtFTE9DS19GSUVMRF9OVU1CRVIpCisgICAgICAgICAgICAgICAgLmFkZENoaWxkKEZpZWxkTWF0Y2hlci5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChLZXJuZWxXYWtlbG9jay5OQU1FX0ZJRUxEX05VTUJFUikpOworICAgICAgICBhZGRHYXVnZUF0b20oY29uZmlnLCBBdG9tLktFUk5FTF9XQUtFTE9DS19GSUVMRF9OVU1CRVIsIGRpbWVuc2lvbik7CisKKyAgICAgICAgdXBsb2FkQ29uZmlnKGNvbmZpZyk7CisKKyAgICAgICAgVGhyZWFkLnNsZWVwKFdBSVRfVElNRV9MT05HKTsKKyAgICAgICAgc2V0QXBwQnJlYWRjcnVtYlByZWRpY2F0ZSgpOworICAgICAgICBUaHJlYWQuc2xlZXAoV0FJVF9USU1FX0xPTkcpOworCisgICAgICAgIExpc3Q8QXRvbT4gZGF0YSA9IGdldEdhdWdlTWV0cmljRGF0YUxpc3QoKTsKKworICAgICAgICBBdG9tIGF0b20gPSBkYXRhLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSghYXRvbS5nZXRLZXJuZWxXYWtlbG9jaygpLmdldE5hbWUoKS5lcXVhbHMoIiIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShhdG9tLmdldEtlcm5lbFdha2Vsb2NrKCkuaGFzQ291bnQoKSk7CisgICAgICAgIGFzc2VydFRydWUoYXRvbS5nZXRLZXJuZWxXYWtlbG9jaygpLmhhc1ZlcnNpb24oKSk7CisgICAgICAgIGFzc2VydFRydWUoYXRvbS5nZXRLZXJuZWxXYWtlbG9jaygpLmdldFZlcnNpb24oKSA+IDApOworICAgICAgICBhc3NlcnRUcnVlKGF0b20uZ2V0S2VybmVsV2FrZWxvY2soKS5oYXNUaW1lKCkpOworICAgIH0KKworICAgIC8vIFJldHVybnMgdHJ1ZSBpZmYgZWl0aGVyIHxXQUtFX0xPQ0tfRklMRXwgb3IgfFdBS0VfU09VUkNFU19GSUxFfCBleGlzdHMuCisgICAgcHJpdmF0ZSBib29sZWFuIGtlcm5lbFdha2Vsb2NrU3RhdHNFeGlzdCgpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIHJldHVybiBkb2VzRmlsZUV4aXN0KFdBS0VfTE9DS19GSUxFKSB8fCBkb2VzRmlsZUV4aXN0KFdBS0VfU09VUkNFU19GSUxFKTsKKyAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RXaWZpQWN0aXZpdHlJbmZvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChzdGF0c2REaXNhYmxlZCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFoYXNGZWF0dXJlKEZFQVRVUkVfV0lGSSwgdHJ1ZSkpIHJldHVybjsKKyAgICAgICAgaWYgKCFoYXNGZWF0dXJlKEZFQVRVUkVfV0FUQ0gsIGZhbHNlKSkgcmV0dXJuOworICAgICAgICBpZiAoIWNoZWNrRGV2aWNlRm9yKCJjaGVja1dpZmlFbmhhbmNlZFBvd2VyUmVwb3J0aW5nU3VwcG9ydGVkIikpIHJldHVybjsKKworICAgICAgICBTdGF0c2RDb25maWcuQnVpbGRlciBjb25maWcgPSBnZXRQdWxsZWRDb25maWcoKTsKKyAgICAgICAgYWRkR2F1Z2VBdG9tKGNvbmZpZywgQXRvbS5XSUZJX0FDVElWSVRZX0lORk9fRklFTERfTlVNQkVSLCBudWxsKTsKKworICAgICAgICB1cGxvYWRDb25maWcoY29uZmlnKTsKKworICAgICAgICBUaHJlYWQuc2xlZXAoV0FJVF9USU1FX0xPTkcpOworICAgICAgICBzZXRBcHBCcmVhZGNydW1iUHJlZGljYXRlKCk7CisgICAgICAgIFRocmVhZC5zbGVlcChXQUlUX1RJTUVfTE9ORyk7CisKKyAgICAgICAgTGlzdDxBdG9tPiBkYXRhTGlzdCA9IGdldEdhdWdlTWV0cmljRGF0YUxpc3QoKTsKKworICAgICAgICBmb3IgKEF0b20gYXRvbTogZGF0YUxpc3QpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoYXRvbS5nZXRXaWZpQWN0aXZpdHlJbmZvKCkuZ2V0VGltZXN0YW1wTWlsbGlzKCkgPiAwKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoYXRvbS5nZXRXaWZpQWN0aXZpdHlJbmZvKCkuZ2V0U3RhY2tTdGF0ZSgpID49IDApOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhdG9tLmdldFdpZmlBY3Rpdml0eUluZm8oKS5nZXRDb250cm9sbGVySWRsZVRpbWVNaWxsaXMoKSA+IDApOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhdG9tLmdldFdpZmlBY3Rpdml0eUluZm8oKS5nZXRDb250cm9sbGVyVHhUaW1lTWlsbGlzKCkgPj0gMCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGF0b20uZ2V0V2lmaUFjdGl2aXR5SW5mbygpLmdldENvbnRyb2xsZXJSeFRpbWVNaWxsaXMoKSA+PSAwKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoYXRvbS5nZXRXaWZpQWN0aXZpdHlJbmZvKCkuZ2V0Q29udHJvbGxlckVuZXJneVVzZWQoKSA+PSAwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEV4cGxpY2l0bHkgdGVzdHMgaWYgdGhlIGFkYiBjb21tYW5kIHRvIGxvZyBhIGJyZWFkY3J1bWIgaXMgd29ya2luZy4KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QnJlYWRjcnVtYkFkYigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoc3RhdHNkRGlzYWJsZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZpbmFsIGludCBhdG9tVGFnID0gQXRvbS5BUFBfQlJFQURDUlVNQl9SRVBPUlRFRF9GSUVMRF9OVU1CRVI7CisgICAgICAgIGNyZWF0ZUFuZFVwbG9hZENvbmZpZyhhdG9tVGFnKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKFdBSVRfVElNRV9TSE9SVCk7CisKKyAgICAgICAgZG9BcHBCcmVhZGNydW1iUmVwb3J0ZWRTdGFydCgxKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKFdBSVRfVElNRV9TSE9SVCk7CisKKyAgICAgICAgTGlzdDxFdmVudE1ldHJpY0RhdGE+IGRhdGEgPSBnZXRFdmVudE1ldHJpY0RhdGFMaXN0KCk7CisgICAgICAgIEFwcEJyZWFkY3J1bWJSZXBvcnRlZCBhdG9tID0gZGF0YS5nZXQoMCkuZ2V0QXRvbSgpLmdldEFwcEJyZWFkY3J1bWJSZXBvcnRlZCgpOworICAgICAgICBhc3NlcnRUcnVlKGF0b20uZ2V0TGFiZWwoKSA9PSAxKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShhdG9tLmdldFN0YXRlKCkuZ2V0TnVtYmVyKCkgPT0gQXBwQnJlYWRjcnVtYlJlcG9ydGVkLlN0YXRlLlNUQVJUX1ZBTFVFKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3N0YXRzZC9zcmMvYW5kcm9pZC9jdHMvc3RhdHNkL2F0b20vUHJvY1N0YXRlQXRvbVRlc3RzLmphdmEgYi9ob3N0c2lkZXRlc3RzL3N0YXRzZC9zcmMvYW5kcm9pZC9jdHMvc3RhdHNkL2F0b20vUHJvY1N0YXRlQXRvbVRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IwZjc1OAotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvc3RhdHNkL3NyYy9hbmRyb2lkL2N0cy9zdGF0c2QvYXRvbS9Qcm9jU3RhdGVBdG9tVGVzdHMuamF2YQpAQCAtMCwwICsxLDMxNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQuY3RzLnN0YXRzZC5hdG9tOworCitpbXBvcnQgYW5kcm9pZC5hcHAuUHJvY2Vzc1N0YXRlRW51bTsgLy8gRnJvbSBlbnVtcy5wcm90byBmb3IgYXRvbXMucHJvdG8ncyBVaWRQcm9jZXNzU3RhdGVDaGFuZ2VkLgorCitpbXBvcnQgY29tLmFuZHJvaWQub3MuQXRvbXNQcm90by5BdG9tOworaW1wb3J0IGNvbS5hbmRyb2lkLm9zLlN0YXRzTG9nLkV2ZW50TWV0cmljRGF0YTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOworCisvKioKKyAqIFN0YXRzZCBhdG9tIHRlc3RzIHRoYXQgYXJlIGRvbmUgdmlhIGFwcCwgZm9yIGF0b21zIHRoYXQgcmVwb3J0IGEgdWlkLgorICovCitwdWJsaWMgY2xhc3MgUHJvY1N0YXRlQXRvbVRlc3RzIGV4dGVuZHMgRGV2aWNlQXRvbVRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3RhdHNkLlByb2NTdGF0ZUF0b21UZXN0cyI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVWSUNFX1NJREVfQkdfU0VSVklDRV9DT01QT05FTlQKKyAgICAgICAgICAgID0gImNvbS5hbmRyb2lkLnNlcnZlci5jdHMuZGV2aWNlLnN0YXRzZC8uU3RhdHNkQ3RzQmFja2dyb3VuZFNlcnZpY2UiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERVZJQ0VfU0lERV9GR19BQ1RJVklUWV9DT01QT05FTlQKKyAgICAgICAgICAgID0gImNvbS5hbmRyb2lkLnNlcnZlci5jdHMuZGV2aWNlLnN0YXRzZC8uU3RhdHNkQ3RzRm9yZWdyb3VuZEFjdGl2aXR5IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVWSUNFX1NJREVfRkdfU0VSVklDRV9DT01QT05FTlQKKyAgICAgICAgICAgID0gImNvbS5hbmRyb2lkLnNlcnZlci5jdHMuZGV2aWNlLnN0YXRzZC8uU3RhdHNkQ3RzRm9yZWdyb3VuZFNlcnZpY2UiOworCisgICAgLy8gQ29uc3RhbnRzIGZyb20gdGhlIGRldmljZS1zaWRlIHRlc3RzIChub3QgZGlyZWN0bHkgYWNjZXNzaWJsZSBoZXJlKS4KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQUNUSU9OID0gImFjdGlvbiI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0VORF9JTU1FRElBVEVMWSA9ICJhY3Rpb24uZW5kX2ltbWVkaWF0ZWx5IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fQkFDS0dST1VORF9TTEVFUCA9ICJhY3Rpb24uYmFja2dyb3VuZF9zbGVlcCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1NMRUVQX1dISUxFX1RPUCA9ICJhY3Rpb24uc2xlZXBfdG9wIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fU0hPV19BUFBMSUNBVElPTl9PVkVSTEFZID0gImFjdGlvbi5zaG93X2FwcGxpY2F0aW9uX292ZXJsYXkiOworCisgICAgLy8gU2xlZXAgdGltZXMgKG1zKSB0aGF0IGFjdGlvbnMgaW52b2tlIGRldmljZS1zaWRlLgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNMRUVQX09GX0FDVElPTl9TTEVFUF9XSElMRV9UT1AgPSAyXzAwMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTTEVFUF9PRl9BQ1RJT05fQkFDS0dST1VORF9TTEVFUCA9IDJfMDAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNMRUVQX09GX0ZPUkVHUk9VTkRfU0VSVklDRSA9IDJfMDAwOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdBSVRfVElNRV9GT1JfQ09ORklHX1VQREFURV9NUyA9IDIwMDsKKyAgICAvLyBBY3Rpdml0eU1hbmFnZXIgY2FuIHRha2UgYSB3aGlsZSB0byByZWdpc3RlciBzY3JlZW4gc3RhdGUgY2hhbmdlcywgbWFuZGF0aW5nIGFuIGV4dHJhIGRlbGF5LgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXQUlUX1RJTUVfRk9SX0NPTkZJR19BTkRfU0NSRUVOX01TID0gMV8wMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVYVFJBX1dBSVRfVElNRV9NUyA9IDFfMDAwOyAvLyBhcyBidWZmZXIgd2hlbiBwcm9jIHN0YXRlIGNoYW5naW5nLgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFUU0RfUkVQT1JUX1dBSVRfVElNRV9NUyA9IDUwMDsgLy8gbWFrZSBzdXJlIHN0YXRzZCBmaW5pc2hlcyBsb2cuCisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVBVFVSRV9XQVRDSCA9ICJhbmRyb2lkLmhhcmR3YXJlLnR5cGUud2F0Y2giOworCisgICAgLy8gVGhlIHRlc3RzIGhlcmUgYXJlIHVzaW5nIHRoZSBCYXR0ZXJ5U3RhdHMgZGVmaW5pdGlvbiBvZiAnYmFja2dyb3VuZCcuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PEludGVnZXI+IEJHX1NUQVRFUyA9IG5ldyBIYXNoU2V0PD4oCisgICAgICAgICAgICBBcnJheXMuYXNMaXN0KAorICAgICAgICAgICAgICAgICAgICBQcm9jZXNzU3RhdGVFbnVtLlBST0NFU1NfU1RBVEVfSU1QT1JUQU5UX0JBQ0tHUk9VTkRfVkFMVUUsCisgICAgICAgICAgICAgICAgICAgIFByb2Nlc3NTdGF0ZUVudW0uUFJPQ0VTU19TVEFURV9UUkFOU0lFTlRfQkFDS0dST1VORF9WQUxVRSwKKyAgICAgICAgICAgICAgICAgICAgUHJvY2Vzc1N0YXRlRW51bS5QUk9DRVNTX1NUQVRFX0JBQ0tVUF9WQUxVRSwKKyAgICAgICAgICAgICAgICAgICAgUHJvY2Vzc1N0YXRlRW51bS5QUk9DRVNTX1NUQVRFX1NFUlZJQ0VfVkFMVUUsCisgICAgICAgICAgICAgICAgICAgIFByb2Nlc3NTdGF0ZUVudW0uUFJPQ0VTU19TVEFURV9SRUNFSVZFUl9WQUxVRSwKKyAgICAgICAgICAgICAgICAgICAgUHJvY2Vzc1N0YXRlRW51bS5QUk9DRVNTX1NUQVRFX0hFQVZZX1dFSUdIVF9WQUxVRQorICAgICAgICAgICAgKSk7CisKKyAgICAvLyBVc2luZyB0aGUgQmF0dGVyeVN0YXRzIGRlZmluaXRpb24gb2YgJ2NhY2hlZCcsIHdoaWNoIGlzIHdoeSBIT01FIChldGMpIGFyZSBjb25zaWRlcmVkIGNhY2hlZC4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8SW50ZWdlcj4gQ0FDSEVEX1NUQVRFUyA9IG5ldyBIYXNoU2V0PD4oCisgICAgICAgICAgICBBcnJheXMuYXNMaXN0KAorICAgICAgICAgICAgICAgICAgICBQcm9jZXNzU3RhdGVFbnVtLlBST0NFU1NfU1RBVEVfSE9NRV9WQUxVRSwKKyAgICAgICAgICAgICAgICAgICAgUHJvY2Vzc1N0YXRlRW51bS5QUk9DRVNTX1NUQVRFX0xBU1RfQUNUSVZJVFlfVkFMVUUsCisgICAgICAgICAgICAgICAgICAgIFByb2Nlc3NTdGF0ZUVudW0uUFJPQ0VTU19TVEFURV9DQUNIRURfQUNUSVZJVFlfVkFMVUUsCisgICAgICAgICAgICAgICAgICAgIFByb2Nlc3NTdGF0ZUVudW0uUFJPQ0VTU19TVEFURV9DQUNIRURfQUNUSVZJVFlfQ0xJRU5UX1ZBTFVFLAorICAgICAgICAgICAgICAgICAgICBQcm9jZXNzU3RhdGVFbnVtLlBST0NFU1NfU1RBVEVfQ0FDSEVEX1JFQ0VOVF9WQUxVRSwKKyAgICAgICAgICAgICAgICAgICAgUHJvY2Vzc1N0YXRlRW51bS5QUk9DRVNTX1NUQVRFX0NBQ0hFRF9FTVBUWV9WQUxVRQorICAgICAgICAgICAgKSk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8SW50ZWdlcj4gTUlTQ19TVEFURVMgPSBuZXcgSGFzaFNldDw+KAorICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgKKyAgICAgICAgICAgICAgICAgICAgUHJvY2Vzc1N0YXRlRW51bS5QUk9DRVNTX1NUQVRFX1BFUlNJU1RFTlRfVkFMVUUsIC8vIFRPRE86IHVudGVzdGVkCisgICAgICAgICAgICAgICAgICAgIFByb2Nlc3NTdGF0ZUVudW0uUFJPQ0VTU19TVEFURV9QRVJTSVNURU5UX1VJX1ZBTFVFLCAvLyBUT0RPOiB1bnRlc3RlZAorICAgICAgICAgICAgICAgICAgICBQcm9jZXNzU3RhdGVFbnVtLlBST0NFU1NfU1RBVEVfVE9QX1ZBTFVFLAorICAgICAgICAgICAgICAgICAgICBQcm9jZXNzU3RhdGVFbnVtLlBST0NFU1NfU1RBVEVfQk9VTkRfRk9SRUdST1VORF9TRVJWSUNFX1ZBTFVFLCAvLyBUT0RPOiB1bnRlc3RlZAorICAgICAgICAgICAgICAgICAgICBQcm9jZXNzU3RhdGVFbnVtLlBST0NFU1NfU1RBVEVfRk9SRUdST1VORF9TRVJWSUNFX1ZBTFVFLAorICAgICAgICAgICAgICAgICAgICBQcm9jZXNzU3RhdGVFbnVtLlBST0NFU1NfU1RBVEVfSU1QT1JUQU5UX0ZPUkVHUk9VTkRfVkFMVUUsCisgICAgICAgICAgICAgICAgICAgIFByb2Nlc3NTdGF0ZUVudW0uUFJPQ0VTU19TVEFURV9UT1BfU0xFRVBJTkdfVkFMVUUsCisKKyAgICAgICAgICAgICAgICAgICAgUHJvY2Vzc1N0YXRlRW51bS5QUk9DRVNTX1NUQVRFX1VOS05PV05fVkFMVUUsCisgICAgICAgICAgICAgICAgICAgIFByb2Nlc3NTdGF0ZUVudW0uUFJPQ0VTU19TVEFURV9OT05FWElTVEVOVF9WQUxVRQorICAgICAgICAgICAgKSk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8SW50ZWdlcj4gQUxMX1NUQVRFUyA9IFN0cmVhbS5vZihNSVNDX1NUQVRFUywgQ0FDSEVEX1NUQVRFUywgQkdfU1RBVEVTKQorICAgICAgICAgICAgLmZsYXRNYXAocyAtPiBzLnN0cmVhbSgpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGdW5jdGlvbjxBdG9tLCBJbnRlZ2VyPiBQUk9DX1NUQVRFX0ZVTkNUSU9OID0KKyAgICAgICAgICAgIGF0b20gLT4gYXRvbS5nZXRVaWRQcm9jZXNzU3RhdGVDaGFuZ2VkKCkuZ2V0U3RhdGUoKS5nZXROdW1iZXIoKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUk9DX1NUQVRFX0FUT01fVEFHID0gQXRvbS5VSURfUFJPQ0VTU19TVEFURV9DSEFOR0VEX0ZJRUxEX05VTUJFUjsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZvcmVncm91bmRTZXJ2aWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChzdGF0c2REaXNhYmxlZCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU2V0PEludGVnZXI+IG9uU3RhdGVzID0gbmV3IEhhc2hTZXQ8PihBcnJheXMuYXNMaXN0KAorICAgICAgICAgICAgICAgIFByb2Nlc3NTdGF0ZUVudW0uUFJPQ0VTU19TVEFURV9GT1JFR1JPVU5EX1NFUlZJQ0VfVkFMVUUpKTsKKyAgICAgICAgU2V0PEludGVnZXI+IG9mZlN0YXRlcyA9IGNvbXBsZW1lbnQob25TdGF0ZXMpOworCisgICAgICAgIExpc3Q8U2V0PEludGVnZXI+PiBzdGF0ZVNldCA9IEFycmF5cy5hc0xpc3Qob25TdGF0ZXMsIG9mZlN0YXRlcyk7IC8vIHN0YXRlIHNldHMsIGluIG9yZGVyCisgICAgICAgIGNyZWF0ZUFuZFVwbG9hZENvbmZpZyhQUk9DX1NUQVRFX0FUT01fVEFHLCBmYWxzZSk7ICAvLyBGYWxzZTogZG9lcyBub3QgdXNlIGF0dHJpYnV0aW9uLgorICAgICAgICBUaHJlYWQuc2xlZXAoV0FJVF9USU1FX0ZPUl9DT05GSUdfVVBEQVRFX01TKTsKKworICAgICAgICBleGVjdXRlRm9yZWdyb3VuZFNlcnZpY2UoKTsKKyAgICAgICAgZmluYWwgaW50IHdhaXRUaW1lID0gU0xFRVBfT0ZfRk9SRUdST1VORF9TRVJWSUNFICsgRVhUUkFfV0FJVF9USU1FX01TOworICAgICAgICBUaHJlYWQuc2xlZXAod2FpdFRpbWUgKyBTVEFUU0RfUkVQT1JUX1dBSVRfVElNRV9NUyk7CisKKyAgICAgICAgTGlzdDxFdmVudE1ldHJpY0RhdGE+IGRhdGEgPSBnZXRFdmVudE1ldHJpY0RhdGFMaXN0KCk7CisgICAgICAgIHBvcFVudGlsRmluZChkYXRhLCBvblN0YXRlcywgUFJPQ19TVEFURV9GVU5DVElPTik7IC8vIGNsZWFyIG91dCBpbml0aWFsIHByb2Mgc3RhdGVzLgorICAgICAgICBhc3NlcnRTdGF0ZXNPY2N1cnJlZChzdGF0ZVNldCwgZGF0YSwgd2FpdFRpbWUsIFBST0NfU1RBVEVfRlVOQ1RJT04pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JlZ3JvdW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChzdGF0c2REaXNhYmxlZCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU2V0PEludGVnZXI+IG9uU3RhdGVzID0gbmV3IEhhc2hTZXQ8PihBcnJheXMuYXNMaXN0KAorICAgICAgICAgICAgICAgIFByb2Nlc3NTdGF0ZUVudW0uUFJPQ0VTU19TVEFURV9JTVBPUlRBTlRfRk9SRUdST1VORF9WQUxVRSkpOworICAgICAgICAvLyBUaGVyZSBhcmUgbm8gb2ZmU3RhdGVzLCBzaW5jZSB0aGUgYXBwIHJlbWFpbnMgaW4gZm9yZWdyb3VuZCB1bnRpbCBraWxsZWQuCisKKyAgICAgICAgTGlzdDxTZXQ8SW50ZWdlcj4+IHN0YXRlU2V0ID0gQXJyYXlzLmFzTGlzdChvblN0YXRlcyk7IC8vIHN0YXRlIHNldHMsIGluIG9yZGVyCisgICAgICAgIGNyZWF0ZUFuZFVwbG9hZENvbmZpZyhQUk9DX1NUQVRFX0FUT01fVEFHLCBmYWxzZSk7ICAvLyBGYWxzZTogZG9lcyBub3QgdXNlIGF0dHJpYnV0aW9uLgorCisgICAgICAgIFRocmVhZC5zbGVlcChXQUlUX1RJTUVfRk9SX0NPTkZJR19BTkRfU0NSRUVOX01TKTsKKworICAgICAgICBleGVjdXRlRm9yZWdyb3VuZEFjdGl2aXR5KEFDVElPTl9TSE9XX0FQUExJQ0FUSU9OX09WRVJMQVkpOworICAgICAgICBmaW5hbCBpbnQgd2FpdFRpbWUgPSBFWFRSQV9XQUlUX1RJTUVfTVMgKyA1XzAwMDsgLy8gT3ZlcmxheSBtYXkgbmVlZCB0byBzaXQgdGhlcmUgYSB3aGlsZS4KKyAgICAgICAgVGhyZWFkLnNsZWVwKHdhaXRUaW1lICsgU1RBVFNEX1JFUE9SVF9XQUlUX1RJTUVfTVMpOworCisgICAgICAgIExpc3Q8RXZlbnRNZXRyaWNEYXRhPiBkYXRhID0gZ2V0RXZlbnRNZXRyaWNEYXRhTGlzdCgpOworICAgICAgICBwb3BVbnRpbEZpbmQoZGF0YSwgb25TdGF0ZXMsIFBST0NfU1RBVEVfRlVOQ1RJT04pOyAvLyBjbGVhciBvdXQgaW5pdGlhbCBwcm9jIHN0YXRlcy4KKyAgICAgICAgYXNzZXJ0U3RhdGVzT2NjdXJyZWQoc3RhdGVTZXQsIGRhdGEsIDAsIFBST0NfU1RBVEVfRlVOQ1RJT04pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RCYWNrZ3JvdW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChzdGF0c2REaXNhYmxlZCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU2V0PEludGVnZXI+IG9uU3RhdGVzID0gQkdfU1RBVEVTOworICAgICAgICBTZXQ8SW50ZWdlcj4gb2ZmU3RhdGVzID0gY29tcGxlbWVudChvblN0YXRlcyk7CisKKyAgICAgICAgTGlzdDxTZXQ8SW50ZWdlcj4+IHN0YXRlU2V0ID0gQXJyYXlzLmFzTGlzdChvblN0YXRlcywgb2ZmU3RhdGVzKTsgLy8gc3RhdGUgc2V0cywgaW4gb3JkZXIKKyAgICAgICAgY3JlYXRlQW5kVXBsb2FkQ29uZmlnKFBST0NfU1RBVEVfQVRPTV9UQUcsIGZhbHNlKTsgIC8vIEZhbHNlOiBkb2VzIG5vdCB1c2UgYXR0cmlidXRpb24uCisgICAgICAgIFRocmVhZC5zbGVlcChXQUlUX1RJTUVfRk9SX0NPTkZJR19VUERBVEVfTVMpOworCisgICAgICAgIGV4ZWN1dGVCYWNrZ3JvdW5kU2VydmljZShBQ1RJT05fQkFDS0dST1VORF9TTEVFUCk7CisgICAgICAgIGZpbmFsIGludCB3YWl0VGltZSA9IFNMRUVQX09GX0FDVElPTl9CQUNLR1JPVU5EX1NMRUVQICsgRVhUUkFfV0FJVF9USU1FX01TOworICAgICAgICBUaHJlYWQuc2xlZXAod2FpdFRpbWUgKyBTVEFUU0RfUkVQT1JUX1dBSVRfVElNRV9NUyk7CisKKyAgICAgICAgTGlzdDxFdmVudE1ldHJpY0RhdGE+IGRhdGEgPSBnZXRFdmVudE1ldHJpY0RhdGFMaXN0KCk7CisgICAgICAgIHBvcFVudGlsRmluZChkYXRhLCBvblN0YXRlcywgUFJPQ19TVEFURV9GVU5DVElPTik7IC8vIGNsZWFyIG91dCBpbml0aWFsIHByb2Mgc3RhdGVzLgorICAgICAgICBhc3NlcnRTdGF0ZXNPY2N1cnJlZChzdGF0ZVNldCwgZGF0YSwgd2FpdFRpbWUsIFBST0NfU1RBVEVfRlVOQ1RJT04pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RUb3AoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHN0YXRzZERpc2FibGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBTZXQ8SW50ZWdlcj4gb25TdGF0ZXMgPSBuZXcgSGFzaFNldDw+KEFycmF5cy5hc0xpc3QoCisgICAgICAgICAgICAgICAgUHJvY2Vzc1N0YXRlRW51bS5QUk9DRVNTX1NUQVRFX1RPUF9WQUxVRSkpOworICAgICAgICBTZXQ8SW50ZWdlcj4gb2ZmU3RhdGVzID0gY29tcGxlbWVudChvblN0YXRlcyk7CisKKyAgICAgICAgTGlzdDxTZXQ8SW50ZWdlcj4+IHN0YXRlU2V0ID0gQXJyYXlzLmFzTGlzdChvblN0YXRlcywgb2ZmU3RhdGVzKTsgLy8gc3RhdGUgc2V0cywgaW4gb3JkZXIKKyAgICAgICAgY3JlYXRlQW5kVXBsb2FkQ29uZmlnKFBST0NfU1RBVEVfQVRPTV9UQUcsIGZhbHNlKTsgIC8vIEZhbHNlOiBkb2VzIG5vdCB1c2UgYXR0cmlidXRpb24uCisKKyAgICAgICAgVGhyZWFkLnNsZWVwKFdBSVRfVElNRV9GT1JfQ09ORklHX0FORF9TQ1JFRU5fTVMpOworCisgICAgICAgIGV4ZWN1dGVGb3JlZ3JvdW5kQWN0aXZpdHkoQUNUSU9OX1NMRUVQX1dISUxFX1RPUCk7CisgICAgICAgIGZpbmFsIGludCB3YWl0VGltZSA9IFNMRUVQX09GX0FDVElPTl9TTEVFUF9XSElMRV9UT1AgKyBFWFRSQV9XQUlUX1RJTUVfTVM7CisgICAgICAgIFRocmVhZC5zbGVlcCh3YWl0VGltZSArIFNUQVRTRF9SRVBPUlRfV0FJVF9USU1FX01TKTsKKworICAgICAgICBMaXN0PEV2ZW50TWV0cmljRGF0YT4gZGF0YSA9IGdldEV2ZW50TWV0cmljRGF0YUxpc3QoKTsKKyAgICAgICAgcG9wVW50aWxGaW5kKGRhdGEsIG9uU3RhdGVzLCBQUk9DX1NUQVRFX0ZVTkNUSU9OKTsgLy8gY2xlYXIgb3V0IGluaXRpYWwgcHJvYyBzdGF0ZXMuCisgICAgICAgIGFzc2VydFN0YXRlc09jY3VycmVkKHN0YXRlU2V0LCBkYXRhLCB3YWl0VGltZSwgUFJPQ19TVEFURV9GVU5DVElPTik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFRvcFNsZWVwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChzdGF0c2REaXNhYmxlZCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFoYXNGZWF0dXJlKEZFQVRVUkVfV0FUQ0gsIGZhbHNlKSkgcmV0dXJuOworICAgICAgICBTZXQ8SW50ZWdlcj4gb25TdGF0ZXMgPSBuZXcgSGFzaFNldDw+KEFycmF5cy5hc0xpc3QoCisgICAgICAgICAgICAgICAgUHJvY2Vzc1N0YXRlRW51bS5QUk9DRVNTX1NUQVRFX1RPUF9TTEVFUElOR19WQUxVRSkpOworICAgICAgICBTZXQ8SW50ZWdlcj4gb2ZmU3RhdGVzID0gY29tcGxlbWVudChvblN0YXRlcyk7CisKKyAgICAgICAgTGlzdDxTZXQ8SW50ZWdlcj4+IHN0YXRlU2V0ID0gQXJyYXlzLmFzTGlzdChvblN0YXRlcywgb2ZmU3RhdGVzKTsgLy8gc3RhdGUgc2V0cywgaW4gb3JkZXIKKyAgICAgICAgY3JlYXRlQW5kVXBsb2FkQ29uZmlnKFBST0NfU1RBVEVfQVRPTV9UQUcsIGZhbHNlKTsgIC8vRmFsc2U6IGRvZXMgbm90IHVzZSBhdHRyaWJ1dGlvbi4KKworICAgICAgICB0dXJuU2NyZWVuT24oKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKFdBSVRfVElNRV9GT1JfQ09ORklHX0FORF9TQ1JFRU5fTVMpOworCisgICAgICAgIGV4ZWN1dGVGb3JlZ3JvdW5kQWN0aXZpdHkoQUNUSU9OX1NMRUVQX1dISUxFX1RPUCk7CisgICAgICAgIC8vIEFTQVAsIHR1cm4gb2ZmIHRoZSBzY3JlZW4gdG8gbWFrZSBwcm9jIHN0YXRlIC0+IHRvcF9zbGVlcGluZy4KKyAgICAgICAgdHVyblNjcmVlbk9mZigpOworICAgICAgICBmaW5hbCBpbnQgd2FpdFRpbWUgPSBTTEVFUF9PRl9BQ1RJT05fU0xFRVBfV0hJTEVfVE9QICsgRVhUUkFfV0FJVF9USU1FX01TOworICAgICAgICBUaHJlYWQuc2xlZXAod2FpdFRpbWUgKyBTVEFUU0RfUkVQT1JUX1dBSVRfVElNRV9NUyk7CisKKyAgICAgICAgTGlzdDxFdmVudE1ldHJpY0RhdGE+IGRhdGEgPSBnZXRFdmVudE1ldHJpY0RhdGFMaXN0KCk7CisgICAgICAgIHBvcFVudGlsRmluZChkYXRhLCBuZXcgSGFzaFNldDw+KEFycmF5cy5hc0xpc3QoUHJvY2Vzc1N0YXRlRW51bS5QUk9DRVNTX1NUQVRFX1RPUF9WQUxVRSkpLAorICAgICAgICAgICAgICAgIFBST0NfU1RBVEVfRlVOQ1RJT04pOyAvLyBjbGVhciBvdXQgYW55dGhpbmcgcHJpb3IgdG8gaXQgZW50ZXJpbmcgVE9QLgorICAgICAgICBwb3BVbnRpbEZpbmQoZGF0YSwgb25TdGF0ZXMsIFBST0NfU1RBVEVfRlVOQ1RJT04pOyAvLyBjbGVhciBvdXQgVE9QIGl0c2VsZi4KKyAgICAgICAgLy8gcmVzZXQgc2NyZWVuIGJhY2sgb24KKyAgICAgICAgdHVyblNjcmVlbk9uKCk7CisgICAgICAgIC8vIERvbid0IGNoZWNrIHRoZSB3YWl0IHRpbWUsIHNpbmNlIGl0J3MgdXAgdG8gdGhlIHN5c3RlbSBob3cgbG9uZyB0b3Agc2xlZXBpbmcgcGVyc2lzdHMuCisgICAgICAgIGFzc2VydFN0YXRlc09jY3VycmVkKHN0YXRlU2V0LCBkYXRhLCAwLCBQUk9DX1NUQVRFX0ZVTkNUSU9OKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FjaGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChzdGF0c2REaXNhYmxlZCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU2V0PEludGVnZXI+IG9uU3RhdGVzID0gQ0FDSEVEX1NUQVRFUzsKKyAgICAgICAgU2V0PEludGVnZXI+IG9mZlN0YXRlcyA9IGNvbXBsZW1lbnQob25TdGF0ZXMpOworCisgICAgICAgIExpc3Q8U2V0PEludGVnZXI+PiBzdGF0ZVNldCA9IEFycmF5cy5hc0xpc3Qob25TdGF0ZXMsIG9mZlN0YXRlcyk7IC8vIHN0YXRlIHNldHMsIGluIG9yZGVyCisgICAgICAgIGNyZWF0ZUFuZFVwbG9hZENvbmZpZyhQUk9DX1NUQVRFX0FUT01fVEFHLCBmYWxzZSk7ICAvLyBGYWxzZTogZGVzIG5vdCB1c2UgYXR0cmlidXRpb24uCisgICAgICAgIFRocmVhZC5zbGVlcChXQUlUX1RJTUVfRk9SX0NPTkZJR19VUERBVEVfTVMpOworCisgICAgICAgIC8vIFRoZSBzY2hlZHVsZSBpcyBhcyBmb2xsb3dzCisgICAgICAgIC8vICMxLiBUaGUgc3lzdGVtIG1heSBkbyBhbnl0aGluZyBpdCB3YW50cywgc3VjaCBhcyBtb3ZpbmcgdGhlIGFwcCBpbnRvIGEgY2FjaGUgc3RhdGUuCisgICAgICAgIC8vICMyLiBXZSBtb3ZlIHRoZSBhcHAgaW50byB0aGUgYmFja2dyb3VuZC4KKyAgICAgICAgLy8gIzMuIFRoZSBiYWNrZ3JvdW5kIHByb2Nlc3MgZW5kcywgc28gdGhlIGFwcCBkZWZpbml0ZWx5IG1vdmVzIHRvIGEgY2FjaGUgc3RhdGUKKyAgICAgICAgLy8gICAgICAgICAgKHRoaXMgaXMgdGhlIHVsdGltYXRlIGdvYWwgb2YgdGhlIHRlc3QpLgorICAgICAgICAvLyAjNC4gV2Ugc3RhcnQgYSBmb3JlZ3JvdW5kIGFjdGl2aXR5LCBtb3ZpbmcgdGhlIGFwcCBvdXQgb2YgY2FjaGUuCisKKyAgICAgICAgLy8gU3RhcnQgZXh0cmVtZWx5IHNob3J0LWxpdmVkIGFjdGl2aXR5LCBzbyBhcHAgZ29lcyBpbnRvIGNhY2hlIHN0YXRlICgjMSAtICMzIGFib3ZlKS4KKyAgICAgICAgZXhlY3V0ZUJhY2tncm91bmRTZXJ2aWNlKEFDVElPTl9FTkRfSU1NRURJQVRFTFkpOworICAgICAgICBmaW5hbCBpbnQgY2FjaGVUaW1lID0gMl8wMDA7IC8vIHByb2Nlc3Mgc2hvdWxkIGJlIGluIGNhY2hlZCBzdGF0ZSBmb3IgdXAgdG8gdGhpcyBsb25nCisgICAgICAgIFRocmVhZC5zbGVlcChjYWNoZVRpbWUpOworICAgICAgICAvLyBOb3cgZm9yY2libHkgYnJpbmcgdGhlIGFwcCBvdXQgb2YgY2FjaGUgKCM0IGFib3ZlKS4KKyAgICAgICAgZXhlY3V0ZUZvcmVncm91bmRBY3Rpdml0eShBQ1RJT05fU0hPV19BUFBMSUNBVElPTl9PVkVSTEFZKTsKKyAgICAgICAgLy8gTm93IGNoZWNrIHRoZSBkYXRhICpiZWZvcmUqIHRoZSBhcHAgZW50ZXJzIGNhY2hlIGFnYWluICh0byBhdm9pZCBhbm90aGVyIGNhY2hlIGV2ZW50KS4KKworICAgICAgICBMaXN0PEV2ZW50TWV0cmljRGF0YT4gZGF0YSA9IGdldEV2ZW50TWV0cmljRGF0YUxpc3QoKTsKKyAgICAgICAgLy8gRmlyc3QsIGNsZWFyIG91dCBhbnkgaW5jaWRlbnRhbCBjYWNoZWQgc3RhdGVzIG9mIHN0ZXAgIzEsIHByaW9yIHRvIHN0ZXAgIzIuCisgICAgICAgIHBvcFVudGlsRmluZChkYXRhLCBCR19TVEFURVMsIFBST0NfU1RBVEVfRlVOQ1RJT04pOworICAgICAgICAvLyBOb3cgY2xlYXIgb3V0IHRoZSBiZyBzdGF0ZSBmcm9tIHN0ZXAgIzIgKHNpbmNlIHdlIGFyZSBpbnRlcmVzdGVkIGluIHRoZSBjYWNoZSBhZnRlciBpdCkuCisgICAgICAgIHBvcFVudGlsRmluZChkYXRhLCBvblN0YXRlcywgUFJPQ19TVEFURV9GVU5DVElPTik7CisgICAgICAgIC8vIFRoZSByZXN1bHQgaXMgdGhhdCBkYXRhIHNob3VsZCBzdGFydCBhdCBzdGVwICMzLCBkZWZpbml0aXZlbHkgaW4gYSBjYWNoZWQgc3RhdGUuCisgICAgICAgIGFzc2VydFN0YXRlc09jY3VycmVkKHN0YXRlU2V0LCBkYXRhLCAxXzAwMCwgUFJPQ19TVEFURV9GVU5DVElPTik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFZhbGlkaXR5T2ZTdGF0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHN0YXRzZERpc2FibGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRGYWxzZSgiVU5LTk9XTl9UT19QUk9UTyBzaG91bGQgbm90IGJlIGEgdmFsaWQgc3RhdGUiLAorICAgICAgICAgICAgICAgIEFMTF9TVEFURVMuY29udGFpbnMoUHJvY2Vzc1N0YXRlRW51bS5QUk9DRVNTX1NUQVRFX1VOS05PV05fVE9fUFJPVE9fVkFMVUUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSdW5zIGEgKGJhY2tncm91bmQpIHNlcnZpY2UgdG8gcGVyZm9ybSB0aGUgZ2l2ZW4gYWN0aW9uLgorICAgICAqIEBwYXJhbSBhY3Rpb25WYWx1ZSB0aGUgYWN0aW9uIGNvZGUgY29uc3RhbnRzIGluZGljYXRpbmcgdGhlIGRlc2lyZWQgYWN0aW9uIHRvIHBlcmZvcm0uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGV4ZWN1dGVCYWNrZ3JvdW5kU2VydmljZShTdHJpbmcgYWN0aW9uVmFsdWUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhbGxvd0JhY2tncm91bmRTZXJ2aWNlcygpOworICAgICAgICBnZXREZXZpY2UoKS5leGVjdXRlU2hlbGxDb21tYW5kKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgImFtIHN0YXJ0c2VydmljZSAtbiAnJXMnIC1lICVzICVzIiwKKyAgICAgICAgICAgICAgICBERVZJQ0VfU0lERV9CR19TRVJWSUNFX0NPTVBPTkVOVCwKKyAgICAgICAgICAgICAgICBLRVlfQUNUSU9OLCBhY3Rpb25WYWx1ZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJ1bnMgYW4gYWN0aXZpdHkgKGluIHRoZSBmb3JlZ3JvdW5kKSB0byBwZXJmb3JtIHRoZSBnaXZlbiBhY3Rpb24uCisgICAgICogQHBhcmFtIGFjdGlvblZhbHVlIHRoZSBhY3Rpb24gY29kZSBjb25zdGFudHMgaW5kaWNhdGluZyB0aGUgZGVzaXJlZCBhY3Rpb24gdG8gcGVyZm9ybS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZXhlY3V0ZUZvcmVncm91bmRBY3Rpdml0eShTdHJpbmcgYWN0aW9uVmFsdWUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBnZXREZXZpY2UoKS5leGVjdXRlU2hlbGxDb21tYW5kKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgImFtIHN0YXJ0IC1uICclcycgLWUgJXMgJXMiLAorICAgICAgICAgICAgICAgIERFVklDRV9TSURFX0ZHX0FDVElWSVRZX0NPTVBPTkVOVCwKKyAgICAgICAgICAgICAgICBLRVlfQUNUSU9OLCBhY3Rpb25WYWx1ZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJ1bnMgYSBzaW1wbGUgZm9yZWdyb3VuZCBzZXJ2aWNlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBleGVjdXRlRm9yZWdyb3VuZFNlcnZpY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZUZvcmVncm91bmRBY3Rpdml0eShBQ1RJT05fRU5EX0lNTUVESUFURUxZKTsKKyAgICAgICAgZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZChTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICJhbSBzdGFydHNlcnZpY2UgLW4gJyVzJyIsIERFVklDRV9TSURFX0ZHX1NFUlZJQ0VfQ09NUE9ORU5UKSk7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgdGhlIGEgc2V0IGNvbnRhaW5pbmcgZWxlbWVudHMgb2YgYSB0aGF0IGFyZSBub3QgZWxlbWVudHMgb2YgYi4gKi8KKyAgICBwcml2YXRlIFNldDxJbnRlZ2VyPiBkaWZmZXJlbmNlKFNldDxJbnRlZ2VyPiBhLCBTZXQ8SW50ZWdlcj4gYikgeworICAgICAgICBTZXQ8SW50ZWdlcj4gcmVzdWx0ID0gbmV3IEhhc2hTZXQ8SW50ZWdlcj4oYSk7CisgICAgICAgIHJlc3VsdC5yZW1vdmVBbGwoYik7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgdGhlIHNldCBvZiBhbGwgc3RhdGVzIHRoYXQgYXJlIG5vdCBpbiBzZXQuICovCisgICAgcHJpdmF0ZSBTZXQ8SW50ZWdlcj4gY29tcGxlbWVudChTZXQ8SW50ZWdlcj4gc2V0KSB7CisgICAgICAgIHJldHVybiBkaWZmZXJlbmNlKEFMTF9TVEFURVMsIHNldCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zdGF0c2Qvc3JjL2FuZHJvaWQvY3RzL3N0YXRzZC9hdG9tL1VpZEF0b21UZXN0cy5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zdGF0c2Qvc3JjL2FuZHJvaWQvY3RzL3N0YXRzZC9hdG9tL1VpZEF0b21UZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNTA2OTEKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL3N0YXRzZC9zcmMvYW5kcm9pZC9jdHMvc3RhdHNkL2F0b20vVWlkQXRvbVRlc3RzLmphdmEKQEAgLTAsMCArMSw3NjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLmN0cy5zdGF0c2QuYXRvbTsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgYW5kcm9pZC5vcy5XYWtlTG9ja0xldmVsRW51bTsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUmVzdHJpY3RlZEJ1aWxkVGVzdDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLm9zLlN0YXRzZENvbmZpZ1Byb3RvLkZpZWxkTWF0Y2hlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5vcy5TdGF0c2RDb25maWdQcm90by5TdGF0c2RDb25maWc7CitpbXBvcnQgY29tLmFuZHJvaWQub3MuQXRvbXNQcm90by5BcHBDcmFzaE9jY3VycmVkOworaW1wb3J0IGNvbS5hbmRyb2lkLm9zLkF0b21zUHJvdG8uQXBwU3RhcnRPY2N1cnJlZDsKK2ltcG9ydCBjb20uYW5kcm9pZC5vcy5BdG9tc1Byb3RvLkF0b207CitpbXBvcnQgY29tLmFuZHJvaWQub3MuQXRvbXNQcm90by5BdWRpb1N0YXRlQ2hhbmdlZDsKK2ltcG9ydCBjb20uYW5kcm9pZC5vcy5BdG9tc1Byb3RvLkJsZVNjYW5SZXN1bHRSZWNlaXZlZDsKK2ltcG9ydCBjb20uYW5kcm9pZC5vcy5BdG9tc1Byb3RvLkJsZVNjYW5TdGF0ZUNoYW5nZWQ7CitpbXBvcnQgY29tLmFuZHJvaWQub3MuQXRvbXNQcm90by5DYW1lcmFTdGF0ZUNoYW5nZWQ7CitpbXBvcnQgY29tLmFuZHJvaWQub3MuQXRvbXNQcm90by5DcHVBY3RpdmVUaW1lOworaW1wb3J0IGNvbS5hbmRyb2lkLm9zLkF0b21zUHJvdG8uQ3B1VGltZVBlclVpZDsKK2ltcG9ydCBjb20uYW5kcm9pZC5vcy5BdG9tc1Byb3RvLkZsYXNobGlnaHRTdGF0ZUNoYW5nZWQ7CitpbXBvcnQgY29tLmFuZHJvaWQub3MuQXRvbXNQcm90by5Gb3JlZ3JvdW5kU2VydmljZVN0YXRlQ2hhbmdlZDsKK2ltcG9ydCBjb20uYW5kcm9pZC5vcy5BdG9tc1Byb3RvLkdwc1NjYW5TdGF0ZUNoYW5nZWQ7CitpbXBvcnQgY29tLmFuZHJvaWQub3MuQXRvbXNQcm90by5NZWRpYUNvZGVjU3RhdGVDaGFuZ2VkOworaW1wb3J0IGNvbS5hbmRyb2lkLm9zLkF0b21zUHJvdG8uT3ZlcmxheVN0YXRlQ2hhbmdlZDsKK2ltcG9ydCBjb20uYW5kcm9pZC5vcy5BdG9tc1Byb3RvLlBpY3R1cmVJblBpY3R1cmVTdGF0ZUNoYW5nZWQ7CitpbXBvcnQgY29tLmFuZHJvaWQub3MuQXRvbXNQcm90by5TY2hlZHVsZWRKb2JTdGF0ZUNoYW5nZWQ7CitpbXBvcnQgY29tLmFuZHJvaWQub3MuQXRvbXNQcm90by5TeW5jU3RhdGVDaGFuZ2VkOworaW1wb3J0IGNvbS5hbmRyb2lkLm9zLkF0b21zUHJvdG8uV2FrZWxvY2tTdGF0ZUNoYW5nZWQ7CitpbXBvcnQgY29tLmFuZHJvaWQub3MuQXRvbXNQcm90by5XaWZpTG9ja1N0YXRlQ2hhbmdlZDsKK2ltcG9ydCBjb20uYW5kcm9pZC5vcy5BdG9tc1Byb3RvLldpZmlNdWx0aWNhc3RMb2NrU3RhdGVDaGFuZ2VkOworaW1wb3J0IGNvbS5hbmRyb2lkLm9zLkF0b21zUHJvdG8uV2lmaVNjYW5TdGF0ZUNoYW5nZWQ7CitpbXBvcnQgY29tLmFuZHJvaWQub3MuU3RhdHNMb2cuRXZlbnRNZXRyaWNEYXRhOworaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmxvZy5Mb2dVdGlsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIFN0YXRzZCBhdG9tIHRlc3RzIHRoYXQgYXJlIGRvbmUgdmlhIGFwcCwgZm9yIGF0b21zIHRoYXQgcmVwb3J0IGEgdWlkLgorICovCitwdWJsaWMgY2xhc3MgVWlkQXRvbVRlc3RzIGV4dGVuZHMgRGV2aWNlQXRvbVRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3RhdHNkLlVpZEF0b21UZXN0cyI7CisKKyAgICAvLyBUaGVzZSBjb25zdGFudHMgYXJlIHRob3NlIGluIFBhY2thZ2VNYW5hZ2VyLgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX0FVVE9NT1RJVkUgPSAiYW5kcm9pZC5oYXJkd2FyZS50eXBlLmF1dG9tb3RpdmUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX0JMVUVUT09USF9MRSA9ICJhbmRyb2lkLmhhcmR3YXJlLmJsdWV0b290aF9sZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVfTE9DQVRJT05fR1BTID0gImFuZHJvaWQuaGFyZHdhcmUubG9jYXRpb24uZ3BzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVBVFVSRV9XSUZJID0gImFuZHJvaWQuaGFyZHdhcmUud2lmaSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVfQ0FNRVJBX0ZMQVNIID0gImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmZsYXNoIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVBVFVSRV9DQU1FUkEgPSAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX0NBTUVSQV9GUk9OVCA9ICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5mcm9udCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVfQVVESU9fT1VUUFVUID0gImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8ub3V0cHV0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVBVFVSRV9XQVRDSCA9ICJhbmRyb2lkLmhhcmR3YXJlLnR5cGUud2F0Y2giOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX1BJQ1RVUkVfSU5fUElDVFVSRSA9ICJhbmRyb2lkLnNvZnR3YXJlLnBpY3R1cmVfaW5fcGljdHVyZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVfUEMgPSAiYW5kcm9pZC5oYXJkd2FyZS50eXBlLnBjIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREFWRVlfRU5BQkxFRCA9IGZhbHNlOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwU3RhcnRPY2N1cnJlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoc3RhdHNkRGlzYWJsZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZpbmFsIGludCBhdG9tVGFnID0gQXRvbS5BUFBfU1RBUlRfT0NDVVJSRURfRklFTERfTlVNQkVSOworCisgICAgICAgIGNyZWF0ZUFuZFVwbG9hZENvbmZpZyhhdG9tVGFnLCBmYWxzZSk7CisgICAgICAgIFRocmVhZC5zbGVlcChXQUlUX1RJTUVfU0hPUlQpOworCisgICAgICAgIHJ1bkFjdGl2aXR5KCJTdGF0c2RDdHNGb3JlZ3JvdW5kQWN0aXZpdHkiLCAiYWN0aW9uIiwgImFjdGlvbi5zbGVlcF90b3AiKTsKKworICAgICAgICAvLyBTb3J0ZWQgbGlzdCBvZiBldmVudHMgaW4gb3JkZXIgaW4gd2hpY2ggdGhleSBvY2N1cnJlZC4KKyAgICAgICAgTGlzdDxFdmVudE1ldHJpY0RhdGE+IGRhdGEgPSBnZXRFdmVudE1ldHJpY0RhdGFMaXN0KCk7CisKKyAgICAgICAgQXBwU3RhcnRPY2N1cnJlZCBhdG9tID0gZGF0YS5nZXQoMCkuZ2V0QXRvbSgpLmdldEFwcFN0YXJ0T2NjdXJyZWQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uYW5kcm9pZC5zZXJ2ZXIuY3RzLmRldmljZS5zdGF0c2QiLCBhdG9tLmdldFBrZ05hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmFuZHJvaWQuc2VydmVyLmN0cy5kZXZpY2Uuc3RhdHNkLlN0YXRzZEN0c0ZvcmVncm91bmRBY3Rpdml0eSIsCisgICAgICAgICAgICAgICAgYXRvbS5nZXRBY3Rpdml0eU5hbWUoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGF0b20uZ2V0SXNJbnN0YW50QXBwKCkpOworICAgICAgICBhc3NlcnRUcnVlKGF0b20uZ2V0QWN0aXZpdHlTdGFydE1pbGxpcygpID4gMCk7CisgICAgICAgIGFzc2VydFRydWUoYXRvbS5nZXRUcmFuc2l0aW9uRGVsYXlNaWxsaXMoKSA+IDApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RCbGVTY2FuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChzdGF0c2REaXNhYmxlZCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFoYXNGZWF0dXJlKEZFQVRVUkVfQkxVRVRPT1RIX0xFLCB0cnVlKSkgcmV0dXJuOworCisgICAgICAgIGZpbmFsIGludCBhdG9tID0gQXRvbS5CTEVfU0NBTl9TVEFURV9DSEFOR0VEX0ZJRUxEX05VTUJFUjsKKyAgICAgICAgZmluYWwgaW50IGZpZWxkID0gQmxlU2NhblN0YXRlQ2hhbmdlZC5TVEFURV9GSUVMRF9OVU1CRVI7CisgICAgICAgIGZpbmFsIGludCBzdGF0ZU9uID0gQmxlU2NhblN0YXRlQ2hhbmdlZC5TdGF0ZS5PTl9WQUxVRTsKKyAgICAgICAgZmluYWwgaW50IHN0YXRlT2ZmID0gQmxlU2NhblN0YXRlQ2hhbmdlZC5TdGF0ZS5PRkZfVkFMVUU7CisgICAgICAgIGZpbmFsIGludCBtaW5UaW1lRGlmZk1pbGxpcyA9IDFfNTAwOworICAgICAgICBmaW5hbCBpbnQgbWF4VGltZURpZmZNaWxsaXMgPSAzXzAwMDsKKworICAgICAgICBMaXN0PEV2ZW50TWV0cmljRGF0YT4gZGF0YSA9IGRvRGV2aWNlTWV0aG9kT25PZmYoInRlc3RCbGVTY2FuVW5vcHRpbWl6ZWQiLCBhdG9tLCBmaWVsZCwKKyAgICAgICAgICAgICAgICBzdGF0ZU9uLCBzdGF0ZU9mZiwgbWluVGltZURpZmZNaWxsaXMsIG1heFRpbWVEaWZmTWlsbGlzLCB0cnVlKTsKKworICAgICAgICBCbGVTY2FuU3RhdGVDaGFuZ2VkIGEwID0gZGF0YS5nZXQoMCkuZ2V0QXRvbSgpLmdldEJsZVNjYW5TdGF0ZUNoYW5nZWQoKTsKKyAgICAgICAgQmxlU2NhblN0YXRlQ2hhbmdlZCBhMSA9IGRhdGEuZ2V0KDEpLmdldEF0b20oKS5nZXRCbGVTY2FuU3RhdGVDaGFuZ2VkKCk7CisgICAgICAgIGFzc2VydFRydWUoYTAuZ2V0U3RhdGUoKS5nZXROdW1iZXIoKSA9PSBzdGF0ZU9uKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShhMS5nZXRTdGF0ZSgpLmdldE51bWJlcigpID09IHN0YXRlT2ZmKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmxlVW5vcHRpbWl6ZWRTY2FuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChzdGF0c2REaXNhYmxlZCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFoYXNGZWF0dXJlKEZFQVRVUkVfQkxVRVRPT1RIX0xFLCB0cnVlKSkgcmV0dXJuOworCisgICAgICAgIGZpbmFsIGludCBhdG9tID0gQXRvbS5CTEVfU0NBTl9TVEFURV9DSEFOR0VEX0ZJRUxEX05VTUJFUjsKKyAgICAgICAgZmluYWwgaW50IGZpZWxkID0gQmxlU2NhblN0YXRlQ2hhbmdlZC5TVEFURV9GSUVMRF9OVU1CRVI7CisgICAgICAgIGZpbmFsIGludCBzdGF0ZU9uID0gQmxlU2NhblN0YXRlQ2hhbmdlZC5TdGF0ZS5PTl9WQUxVRTsKKyAgICAgICAgZmluYWwgaW50IHN0YXRlT2ZmID0gQmxlU2NhblN0YXRlQ2hhbmdlZC5TdGF0ZS5PRkZfVkFMVUU7CisgICAgICAgIGZpbmFsIGludCBtaW5UaW1lRGlmZk1pbGxpcyA9IDFfNTAwOworICAgICAgICBmaW5hbCBpbnQgbWF4VGltZURpZmZNaWxsaXMgPSAzXzAwMDsKKworICAgICAgICBMaXN0PEV2ZW50TWV0cmljRGF0YT4gZGF0YSA9IGRvRGV2aWNlTWV0aG9kT25PZmYoInRlc3RCbGVTY2FuVW5vcHRpbWl6ZWQiLCBhdG9tLCBmaWVsZCwKKyAgICAgICAgICAgICAgICBzdGF0ZU9uLCBzdGF0ZU9mZiwgbWluVGltZURpZmZNaWxsaXMsIG1heFRpbWVEaWZmTWlsbGlzLCB0cnVlKTsKKworICAgICAgICBCbGVTY2FuU3RhdGVDaGFuZ2VkIGEwID0gZGF0YS5nZXQoMCkuZ2V0QXRvbSgpLmdldEJsZVNjYW5TdGF0ZUNoYW5nZWQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShhMC5nZXRTdGF0ZSgpLmdldE51bWJlcigpID09IHN0YXRlT24pOworICAgICAgICBhc3NlcnRGYWxzZShhMC5nZXRJc0ZpbHRlcmVkKCkpOworICAgICAgICBhc3NlcnRGYWxzZShhMC5nZXRJc0ZpcnN0TWF0Y2goKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGEwLmdldElzT3Bwb3J0dW5pc3RpYygpKTsKKyAgICAgICAgQmxlU2NhblN0YXRlQ2hhbmdlZCBhMSA9IGRhdGEuZ2V0KDEpLmdldEF0b20oKS5nZXRCbGVTY2FuU3RhdGVDaGFuZ2VkKCk7CisgICAgICAgIGFzc2VydFRydWUoYTEuZ2V0U3RhdGUoKS5nZXROdW1iZXIoKSA9PSBzdGF0ZU9mZik7CisgICAgICAgIGFzc2VydEZhbHNlKGExLmdldElzRmlsdGVyZWQoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGExLmdldElzRmlyc3RNYXRjaCgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoYTEuZ2V0SXNPcHBvcnR1bmlzdGljKCkpOworCisKKyAgICAgICAgLy8gTm93IHJlcGVhdCB0aGUgdGVzdCBmb3Igb3Bwb3J0dW5pc3RpYyBzY2FubmluZyBhbmQgbWFrZSBzdXJlIGl0IGlzIHJlcG9ydGVkIGNvcnJlY3RseS4KKyAgICAgICAgZGF0YSA9IGRvRGV2aWNlTWV0aG9kT25PZmYoInRlc3RCbGVTY2FuT3Bwb3J0dW5pc3RpYyIsIGF0b20sIGZpZWxkLAorICAgICAgICAgICAgICAgIHN0YXRlT24sIHN0YXRlT2ZmLCBtaW5UaW1lRGlmZk1pbGxpcywgbWF4VGltZURpZmZNaWxsaXMsIHRydWUpOworCisgICAgICAgIGEwID0gZGF0YS5nZXQoMCkuZ2V0QXRvbSgpLmdldEJsZVNjYW5TdGF0ZUNoYW5nZWQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShhMC5nZXRTdGF0ZSgpLmdldE51bWJlcigpID09IHN0YXRlT24pOworICAgICAgICBhc3NlcnRGYWxzZShhMC5nZXRJc0ZpbHRlcmVkKCkpOworICAgICAgICBhc3NlcnRGYWxzZShhMC5nZXRJc0ZpcnN0TWF0Y2goKSk7CisgICAgICAgIGFzc2VydFRydWUoYTAuZ2V0SXNPcHBvcnR1bmlzdGljKCkpOyAgLy8gVGhpcyBzY2FuIGlzIG9wcG9ydHVuaXN0aWMuCisgICAgICAgIGExID0gZGF0YS5nZXQoMSkuZ2V0QXRvbSgpLmdldEJsZVNjYW5TdGF0ZUNoYW5nZWQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShhMS5nZXRTdGF0ZSgpLmdldE51bWJlcigpID09IHN0YXRlT2ZmKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoYTEuZ2V0SXNGaWx0ZXJlZCgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoYTEuZ2V0SXNGaXJzdE1hdGNoKCkpOworICAgICAgICBhc3NlcnRUcnVlKGExLmdldElzT3Bwb3J0dW5pc3RpYygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmxlU2NhblJlc3VsdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoc3RhdHNkRGlzYWJsZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICghaGFzRmVhdHVyZShGRUFUVVJFX0JMVUVUT09USF9MRSwgdHJ1ZSkpIHJldHVybjsKKworICAgICAgICBmaW5hbCBpbnQgYXRvbSA9IEF0b20uQkxFX1NDQU5fUkVTVUxUX1JFQ0VJVkVEX0ZJRUxEX05VTUJFUjsKKyAgICAgICAgZmluYWwgaW50IGZpZWxkID0gQmxlU2NhblJlc3VsdFJlY2VpdmVkLk5VTV9SRVNVTFRTX0ZJRUxEX05VTUJFUjsKKworICAgICAgICBTdGF0c2RDb25maWcuQnVpbGRlciBjb25mID0gY3JlYXRlQ29uZmlnQnVpbGRlcigpOworICAgICAgICBhZGRBdG9tRXZlbnQoY29uZiwgYXRvbSwgY3JlYXRlRnZtKGZpZWxkKS5zZXRHdGVJbnQoMCkpOworICAgICAgICBMaXN0PEV2ZW50TWV0cmljRGF0YT4gZGF0YSA9IGRvRGV2aWNlTWV0aG9kKCJ0ZXN0QmxlU2NhblJlc3VsdCIsIGNvbmYpOworCisgICAgICAgIGFzc2VydFRydWUoZGF0YS5zaXplKCkgPj0gMSk7CisgICAgICAgIEJsZVNjYW5SZXN1bHRSZWNlaXZlZCBhMCA9IGRhdGEuZ2V0KDApLmdldEF0b20oKS5nZXRCbGVTY2FuUmVzdWx0UmVjZWl2ZWQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShhMC5nZXROdW1SZXN1bHRzKCkgPj0gMSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENhbWVyYVN0YXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChzdGF0c2REaXNhYmxlZCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFoYXNGZWF0dXJlKEZFQVRVUkVfQ0FNRVJBLCB0cnVlKSAmJiAhaGFzRmVhdHVyZShGRUFUVVJFX0NBTUVSQV9GUk9OVCwgdHJ1ZSkpIHJldHVybjsKKworICAgICAgICBmaW5hbCBpbnQgYXRvbVRhZyA9IEF0b20uQ0FNRVJBX1NUQVRFX0NIQU5HRURfRklFTERfTlVNQkVSOworICAgICAgICBTZXQ8SW50ZWdlcj4gY2FtZXJhT24gPSBuZXcgSGFzaFNldDw+KEFycmF5cy5hc0xpc3QoQ2FtZXJhU3RhdGVDaGFuZ2VkLlN0YXRlLk9OX1ZBTFVFKSk7CisgICAgICAgIFNldDxJbnRlZ2VyPiBjYW1lcmFPZmYgPSBuZXcgSGFzaFNldDw+KEFycmF5cy5hc0xpc3QoQ2FtZXJhU3RhdGVDaGFuZ2VkLlN0YXRlLk9GRl9WQUxVRSkpOworCisgICAgICAgIC8vIEFkZCBzdGF0ZSBzZXRzIHRvIHRoZSBsaXN0IGluIG9yZGVyLgorICAgICAgICBMaXN0PFNldDxJbnRlZ2VyPj4gc3RhdGVTZXQgPSBBcnJheXMuYXNMaXN0KGNhbWVyYU9uLCBjYW1lcmFPZmYpOworCisgICAgICAgIGNyZWF0ZUFuZFVwbG9hZENvbmZpZyhhdG9tVGFnLCB0cnVlKTsgIC8vIFRydWU6IHVzZXMgYXR0cmlidXRpb24uCisgICAgICAgIHJ1bkRldmljZVRlc3RzKERFVklDRV9TSURFX1RFU1RfUEFDS0FHRSwgIi5BdG9tVGVzdHMiLCAidGVzdENhbWVyYVN0YXRlIik7CisKKyAgICAgICAgLy8gU29ydGVkIGxpc3Qgb2YgZXZlbnRzIGluIG9yZGVyIGluIHdoaWNoIHRoZXkgb2NjdXJyZWQuCisgICAgICAgIExpc3Q8RXZlbnRNZXRyaWNEYXRhPiBkYXRhID0gZ2V0RXZlbnRNZXRyaWNEYXRhTGlzdCgpOworCisgICAgICAgIC8vIEFzc2VydCB0aGF0IHRoZSBldmVudHMgaGFwcGVuZWQgaW4gdGhlIGV4cGVjdGVkIG9yZGVyLgorICAgICAgICBhc3NlcnRTdGF0ZXNPY2N1cnJlZChzdGF0ZVNldCwgZGF0YSwgV0FJVF9USU1FX0xPTkcsCisgICAgICAgICAgICAgICAgYXRvbSAtPiBhdG9tLmdldENhbWVyYVN0YXRlQ2hhbmdlZCgpLmdldFN0YXRlKCkuZ2V0TnVtYmVyKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDcHVUaW1lUGVyVWlkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChzdGF0c2REaXNhYmxlZCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFoYXNGZWF0dXJlKEZFQVRVUkVfV0FUQ0gsIGZhbHNlKSkgcmV0dXJuOworICAgICAgICBTdGF0c2RDb25maWcuQnVpbGRlciBjb25maWcgPSBnZXRQdWxsZWRDb25maWcoKTsKKyAgICAgICAgRmllbGRNYXRjaGVyLkJ1aWxkZXIgZGltZW5zaW9uID0gRmllbGRNYXRjaGVyLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRGaWVsZChBdG9tLkNQVV9USU1FX1BFUl9VSURfRklFTERfTlVNQkVSKQorICAgICAgICAgICAgICAgIC5hZGRDaGlsZChGaWVsZE1hdGNoZXIubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoQ3B1VGltZVBlclVpZC5VSURfRklFTERfTlVNQkVSKSk7CisgICAgICAgIGFkZEdhdWdlQXRvbShjb25maWcsIEF0b20uQ1BVX1RJTUVfUEVSX1VJRF9GSUVMRF9OVU1CRVIsIGRpbWVuc2lvbik7CisKKyAgICAgICAgdXBsb2FkQ29uZmlnKGNvbmZpZyk7CisKKyAgICAgICAgcnVuRGV2aWNlVGVzdHMoREVWSUNFX1NJREVfVEVTVF9QQUNLQUdFLCAiLkF0b21UZXN0cyIsICJ0ZXN0U2ltcGxlQ3B1Iik7CisKKyAgICAgICAgVGhyZWFkLnNsZWVwKFdBSVRfVElNRV9TSE9SVCk7CisgICAgICAgIHNldEFwcEJyZWFkY3J1bWJQcmVkaWNhdGUoKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKFdBSVRfVElNRV9MT05HKTsKKworICAgICAgICBMaXN0PEF0b20+IGF0b21MaXN0ID0gZ2V0R2F1Z2VNZXRyaWNEYXRhTGlzdCgpOworCisgICAgICAgIC8vIFRPRE86IFdlIGRvbid0IGhhdmUgYXRvbSBtYXRjaGluZyBvbiBnYXVnZSB5ZXQuIExldCdzIHJlZmFjdG9yIHRoaXMgYWZ0ZXIgdGhhdCBmZWF0dXJlIGlzCisgICAgICAgIC8vIGltcGxlbWVudGVkLgorICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7CisgICAgICAgIGludCB1aWQgPSBnZXRVaWQoKTsKKyAgICAgICAgZm9yIChBdG9tIGF0b20gOiBhdG9tTGlzdCkgeworICAgICAgICAgICAgaWYgKGF0b20uZ2V0Q3B1VGltZVBlclVpZCgpLmdldFVpZCgpID09IHVpZCkgeworICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGF0b20uZ2V0Q3B1VGltZVBlclVpZCgpLmdldFVzZXJUaW1lTWlsbGlzKCkgPiAwKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGF0b20uZ2V0Q3B1VGltZVBlclVpZCgpLmdldFN5c1RpbWVNaWxsaXMoKSA+IDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoImZvdW5kIHVpZCAiICsgdWlkLCBmb3VuZCk7CisgICAgfQorCisgICAgQFJlc3RyaWN0ZWRCdWlsZFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3B1QWN0aXZlVGltZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoc3RhdHNkRGlzYWJsZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICghaGFzRmVhdHVyZShGRUFUVVJFX1dBVENILCBmYWxzZSkpIHJldHVybjsKKyAgICAgICAgU3RhdHNkQ29uZmlnLkJ1aWxkZXIgY29uZmlnID0gZ2V0UHVsbGVkQ29uZmlnKCk7CisgICAgICAgIEZpZWxkTWF0Y2hlci5CdWlsZGVyIGRpbWVuc2lvbiA9IEZpZWxkTWF0Y2hlci5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0RmllbGQoQXRvbS5DUFVfQUNUSVZFX1RJTUVfRklFTERfTlVNQkVSKQorICAgICAgICAgICAgICAgIC5hZGRDaGlsZChGaWVsZE1hdGNoZXIubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoQ3B1QWN0aXZlVGltZS5VSURfRklFTERfTlVNQkVSKSk7CisgICAgICAgIGFkZEdhdWdlQXRvbShjb25maWcsIEF0b20uQ1BVX0FDVElWRV9USU1FX0ZJRUxEX05VTUJFUiwgZGltZW5zaW9uKTsKKworICAgICAgICB1cGxvYWRDb25maWcoY29uZmlnKTsKKworICAgICAgICBUaHJlYWQuc2xlZXAoV0FJVF9USU1FX0xPTkcpOworICAgICAgICBydW5EZXZpY2VUZXN0cyhERVZJQ0VfU0lERV9URVNUX1BBQ0tBR0UsICIuQXRvbVRlc3RzIiwgInRlc3RTaW1wbGVDcHUiKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKFdBSVRfVElNRV9TSE9SVCk7CisgICAgICAgIHNldEFwcEJyZWFkY3J1bWJQcmVkaWNhdGUoKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKFdBSVRfVElNRV9MT05HKTsKKworICAgICAgICBMaXN0PEF0b20+IGF0b21MaXN0ID0gZ2V0R2F1Z2VNZXRyaWNEYXRhTGlzdCgpOworCisgICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKKyAgICAgICAgaW50IHVpZCA9IGdldFVpZCgpOworICAgICAgICBsb25nIHRpbWVTcGVudCA9IDA7CisgICAgICAgIGZvciAoQXRvbSBhdG9tIDogYXRvbUxpc3QpIHsKKyAgICAgICAgICAgIGlmIChhdG9tLmdldENwdUFjdGl2ZVRpbWUoKS5nZXRVaWQoKSA9PSB1aWQpIHsKKyAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgdGltZVNwZW50ICs9IGF0b20uZ2V0Q3B1QWN0aXZlVGltZSgpLmdldFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKHRpbWVTcGVudCA+IDApOworICAgICAgICBhc3NlcnRUcnVlKCJmb3VuZCB1aWQgIiArIHVpZCwgZm91bmQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGbGFzaGxpZ2h0U3RhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHN0YXRzZERpc2FibGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWhhc0ZlYXR1cmUoRkVBVFVSRV9DQU1FUkFfRkxBU0gsIHRydWUpKSByZXR1cm47CisKKyAgICAgICAgZmluYWwgaW50IGF0b21UYWcgPSBBdG9tLkZMQVNITElHSFRfU1RBVEVfQ0hBTkdFRF9GSUVMRF9OVU1CRVI7CisgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gInRlc3RGbGFzaGxpZ2h0IjsKKworICAgICAgICBTZXQ8SW50ZWdlcj4gZmxhc2hsaWdodE9uID0gbmV3IEhhc2hTZXQ8PigKKyAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoRmxhc2hsaWdodFN0YXRlQ2hhbmdlZC5TdGF0ZS5PTl9WQUxVRSkpOworICAgICAgICBTZXQ8SW50ZWdlcj4gZmxhc2hsaWdodE9mZiA9IG5ldyBIYXNoU2V0PD4oCisgICAgICAgICAgICBBcnJheXMuYXNMaXN0KEZsYXNobGlnaHRTdGF0ZUNoYW5nZWQuU3RhdGUuT0ZGX1ZBTFVFKSk7CisKKyAgICAgICAgLy8gQWRkIHN0YXRlIHNldHMgdG8gdGhlIGxpc3QgaW4gb3JkZXIuCisgICAgICAgIExpc3Q8U2V0PEludGVnZXI+PiBzdGF0ZVNldCA9IEFycmF5cy5hc0xpc3QoZmxhc2hsaWdodE9uLCBmbGFzaGxpZ2h0T2ZmKTsKKworICAgICAgICBjcmVhdGVBbmRVcGxvYWRDb25maWcoYXRvbVRhZywgdHJ1ZSk7ICAvLyBUcnVlOiB1c2VzIGF0dHJpYnV0aW9uLgorICAgICAgICBUaHJlYWQuc2xlZXAoV0FJVF9USU1FX1NIT1JUKTsKKworICAgICAgICBydW5EZXZpY2VUZXN0cyhERVZJQ0VfU0lERV9URVNUX1BBQ0tBR0UsICIuQXRvbVRlc3RzIiwgbmFtZSk7CisKKyAgICAgICAgLy8gU29ydGVkIGxpc3Qgb2YgZXZlbnRzIGluIG9yZGVyIGluIHdoaWNoIHRoZXkgb2NjdXJyZWQuCisgICAgICAgIExpc3Q8RXZlbnRNZXRyaWNEYXRhPiBkYXRhID0gZ2V0RXZlbnRNZXRyaWNEYXRhTGlzdCgpOworCisgICAgICAgIC8vIEFzc2VydCB0aGF0IHRoZSBldmVudHMgaGFwcGVuZWQgaW4gdGhlIGV4cGVjdGVkIG9yZGVyLgorICAgICAgICBhc3NlcnRTdGF0ZXNPY2N1cnJlZChzdGF0ZVNldCwgZGF0YSwgV0FJVF9USU1FX1NIT1JULAorICAgICAgICAgICAgICAgIGF0b20gLT4gYXRvbS5nZXRGbGFzaGxpZ2h0U3RhdGVDaGFuZ2VkKCkuZ2V0U3RhdGUoKS5nZXROdW1iZXIoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZvcmVncm91bmRTZXJ2aWNlU3RhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHN0YXRzZERpc2FibGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBpbnQgYXRvbVRhZyA9IEF0b20uRk9SRUdST1VORF9TRVJWSUNFX1NUQVRFX0NIQU5HRURfRklFTERfTlVNQkVSOworICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9ICJ0ZXN0Rm9yZWdyb3VuZFNlcnZpY2UiOworCisgICAgICAgIFNldDxJbnRlZ2VyPiBlbnRlckZvcmVncm91bmQgPSBuZXcgSGFzaFNldDw+KAorICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoRm9yZWdyb3VuZFNlcnZpY2VTdGF0ZUNoYW5nZWQuU3RhdGUuRU5URVJfVkFMVUUpKTsKKyAgICAgICAgU2V0PEludGVnZXI+IGV4aXRGb3JlZ3JvdW5kID0gbmV3IEhhc2hTZXQ8PigKKyAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KEZvcmVncm91bmRTZXJ2aWNlU3RhdGVDaGFuZ2VkLlN0YXRlLkVYSVRfVkFMVUUpKTsKKworICAgICAgICAvLyBBZGQgc3RhdGUgc2V0cyB0byB0aGUgbGlzdCBpbiBvcmRlci4KKyAgICAgICAgTGlzdDxTZXQ8SW50ZWdlcj4+IHN0YXRlU2V0ID0gQXJyYXlzLmFzTGlzdChlbnRlckZvcmVncm91bmQsIGV4aXRGb3JlZ3JvdW5kKTsKKworICAgICAgICBjcmVhdGVBbmRVcGxvYWRDb25maWcoYXRvbVRhZywgZmFsc2UpOworICAgICAgICBUaHJlYWQuc2xlZXAoV0FJVF9USU1FX1NIT1JUKTsKKworICAgICAgICBydW5EZXZpY2VUZXN0cyhERVZJQ0VfU0lERV9URVNUX1BBQ0tBR0UsICIuQXRvbVRlc3RzIiwgbmFtZSk7CisKKyAgICAgICAgLy8gU29ydGVkIGxpc3Qgb2YgZXZlbnRzIGluIG9yZGVyIGluIHdoaWNoIHRoZXkgb2NjdXJyZWQuCisgICAgICAgIExpc3Q8RXZlbnRNZXRyaWNEYXRhPiBkYXRhID0gZ2V0RXZlbnRNZXRyaWNEYXRhTGlzdCgpOworCisgICAgICAgIC8vIEFzc2VydCB0aGF0IHRoZSBldmVudHMgaGFwcGVuZWQgaW4gdGhlIGV4cGVjdGVkIG9yZGVyLgorICAgICAgICBhc3NlcnRTdGF0ZXNPY2N1cnJlZChzdGF0ZVNldCwgZGF0YSwgV0FJVF9USU1FX1NIT1JULAorICAgICAgICAgICAgICAgIGF0b20gLT4gYXRvbS5nZXRGb3JlZ3JvdW5kU2VydmljZVN0YXRlQ2hhbmdlZCgpLmdldFN0YXRlKCkuZ2V0TnVtYmVyKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHcHNTY2FuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChzdGF0c2REaXNhYmxlZCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFoYXNGZWF0dXJlKEZFQVRVUkVfTE9DQVRJT05fR1BTLCB0cnVlKSkgcmV0dXJuOworICAgICAgICAvLyBXaGl0ZWxpc3QgdGhpcyBhcHAgYWdhaW5zdCBiYWNrZ3JvdW5kIGxvY2F0aW9uIHJlcXVlc3QgdGhyb3R0bGluZworICAgICAgICBnZXREZXZpY2UoKS5leGVjdXRlU2hlbGxDb21tYW5kKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgInNldHRpbmdzIHB1dCBnbG9iYWwgbG9jYXRpb25fYmFja2dyb3VuZF90aHJvdHRsZV9wYWNrYWdlX3doaXRlbGlzdCAlcyIsCisgICAgICAgICAgICAgICAgREVWSUNFX1NJREVfVEVTVF9QQUNLQUdFKSk7CisKKyAgICAgICAgZmluYWwgaW50IGF0b20gPSBBdG9tLkdQU19TQ0FOX1NUQVRFX0NIQU5HRURfRklFTERfTlVNQkVSOworICAgICAgICBmaW5hbCBpbnQga2V5ID0gR3BzU2NhblN0YXRlQ2hhbmdlZC5TVEFURV9GSUVMRF9OVU1CRVI7CisgICAgICAgIGZpbmFsIGludCBzdGF0ZU9uID0gR3BzU2NhblN0YXRlQ2hhbmdlZC5TdGF0ZS5PTl9WQUxVRTsKKyAgICAgICAgZmluYWwgaW50IHN0YXRlT2ZmID0gR3BzU2NhblN0YXRlQ2hhbmdlZC5TdGF0ZS5PRkZfVkFMVUU7CisgICAgICAgIGZpbmFsIGludCBtaW5UaW1lRGlmZk1pbGxpcyA9IDUwMDsKKyAgICAgICAgZmluYWwgaW50IG1heFRpbWVEaWZmTWlsbGlzID0gNjBfMDAwOworCisgICAgICAgIExpc3Q8RXZlbnRNZXRyaWNEYXRhPiBkYXRhID0gZG9EZXZpY2VNZXRob2RPbk9mZigidGVzdEdwc1NjYW4iLCBhdG9tLCBrZXksCisgICAgICAgICAgICAgICAgc3RhdGVPbiwgc3RhdGVPZmYsIG1pblRpbWVEaWZmTWlsbGlzLCBtYXhUaW1lRGlmZk1pbGxpcywgdHJ1ZSk7CisKKyAgICAgICAgR3BzU2NhblN0YXRlQ2hhbmdlZCBhMCA9IGRhdGEuZ2V0KDApLmdldEF0b20oKS5nZXRHcHNTY2FuU3RhdGVDaGFuZ2VkKCk7CisgICAgICAgIEdwc1NjYW5TdGF0ZUNoYW5nZWQgYTEgPSBkYXRhLmdldCgxKS5nZXRBdG9tKCkuZ2V0R3BzU2NhblN0YXRlQ2hhbmdlZCgpOworICAgICAgICBhc3NlcnRUcnVlKGEwLmdldFN0YXRlKCkuZ2V0TnVtYmVyKCkgPT0gc3RhdGVPbik7CisgICAgICAgIGFzc2VydFRydWUoYTEuZ2V0U3RhdGUoKS5nZXROdW1iZXIoKSA9PSBzdGF0ZU9mZik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE92ZXJsYXlTdGF0ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoc3RhdHNkRGlzYWJsZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICghaGFzRmVhdHVyZShGRUFUVVJFX1dBVENILCBmYWxzZSkpIHJldHVybjsKKyAgICAgICAgZmluYWwgaW50IGF0b21UYWcgPSBBdG9tLk9WRVJMQVlfU1RBVEVfQ0hBTkdFRF9GSUVMRF9OVU1CRVI7CisKKyAgICAgICAgU2V0PEludGVnZXI+IGVudGVyZWQgPSBuZXcgSGFzaFNldDw+KAorICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoT3ZlcmxheVN0YXRlQ2hhbmdlZC5TdGF0ZS5FTlRFUkVEX1ZBTFVFKSk7CisgICAgICAgIFNldDxJbnRlZ2VyPiBleGl0ZWQgPSBuZXcgSGFzaFNldDw+KAorICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoT3ZlcmxheVN0YXRlQ2hhbmdlZC5TdGF0ZS5FWElURURfVkFMVUUpKTsKKworICAgICAgICAvLyBBZGQgc3RhdGUgc2V0cyB0byB0aGUgbGlzdCBpbiBvcmRlci4KKyAgICAgICAgTGlzdDxTZXQ8SW50ZWdlcj4+IHN0YXRlU2V0ID0gQXJyYXlzLmFzTGlzdChlbnRlcmVkLCBleGl0ZWQpOworCisgICAgICAgIGNyZWF0ZUFuZFVwbG9hZENvbmZpZyhhdG9tVGFnLCBmYWxzZSk7CisKKyAgICAgICAgcnVuQWN0aXZpdHkoIlN0YXRzZEN0c0ZvcmVncm91bmRBY3Rpdml0eSIsICJhY3Rpb24iLCAiYWN0aW9uLnNob3dfYXBwbGljYXRpb25fb3ZlcmxheSIsCisgICAgICAgICAgICAgICAgM18wMDApOworCisgICAgICAgIC8vIFNvcnRlZCBsaXN0IG9mIGV2ZW50cyBpbiBvcmRlciBpbiB3aGljaCB0aGV5IG9jY3VycmVkLgorICAgICAgICBMaXN0PEV2ZW50TWV0cmljRGF0YT4gZGF0YSA9IGdldEV2ZW50TWV0cmljRGF0YUxpc3QoKTsKKworICAgICAgICAvLyBBc3NlcnQgdGhhdCB0aGUgZXZlbnRzIGhhcHBlbmVkIGluIHRoZSBleHBlY3RlZCBvcmRlci4KKyAgICAgICAgLy8gVGhlIG92ZXJsYXkgYm94IHNob3VsZCBhcHBlYXIgYWJvdXQgMnNlYyBhZnRlciB0aGUgYXBwIHN0YXJ0CisgICAgICAgIGFzc2VydFN0YXRlc09jY3VycmVkKHN0YXRlU2V0LCBkYXRhLCAwLAorICAgICAgICAgICAgICAgIGF0b20gLT4gYXRvbS5nZXRPdmVybGF5U3RhdGVDaGFuZ2VkKCkuZ2V0U3RhdGUoKS5nZXROdW1iZXIoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERhdmV5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChzdGF0c2REaXNhYmxlZCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFEQVZFWV9FTkFCTEVEICkgcmV0dXJuOworICAgICAgICBsb25nIE1BWF9EVVJBVElPTiA9IDIwMDA7CisgICAgICAgIGxvbmcgTUlOX0RVUkFUSU9OID0gNzUwOworICAgICAgICBmaW5hbCBpbnQgYXRvbVRhZyA9IEF0b20uREFWRVlfT0NDVVJSRURfRklFTERfTlVNQkVSOworICAgICAgICBjcmVhdGVBbmRVcGxvYWRDb25maWcoYXRvbVRhZywgZmFsc2UpOyAvLyBVSUQgaXMgbG9nZ2VkIHdpdGhvdXQgYXR0cmlidXRpb24gbm9kZQorCisgICAgICAgIHJ1bkFjdGl2aXR5KCJEYXZleUFjdGl2aXR5IiwgbnVsbCwgbnVsbCk7CisKKyAgICAgICAgTGlzdDxFdmVudE1ldHJpY0RhdGE+IGRhdGEgPSBnZXRFdmVudE1ldHJpY0RhdGFMaXN0KCk7CisgICAgICAgIGFzc2VydFRydWUoZGF0YS5zaXplKCkgPT0gMSk7CisgICAgICAgIGxvbmcgZHVyYXRpb24gPSBkYXRhLmdldCgwKS5nZXRBdG9tKCkuZ2V0RGF2ZXlPY2N1cnJlZCgpLmdldEphbmtEdXJhdGlvbk1pbGxpcygpOworICAgICAgICBhc3NlcnRUcnVlKCJKYW5rIGR1cmF0aW9uIG9mICIgKyBkdXJhdGlvbiArICJtcyB3YXMgbGVzcyB0aGFuICIgKyBNSU5fRFVSQVRJT04gKyAibXMiLAorICAgICAgICAgICAgICAgIGR1cmF0aW9uID49IE1JTl9EVVJBVElPTik7CisgICAgICAgIGFzc2VydFRydWUoIkphbmsgZHVyYXRpb24gb2YgIiArIGR1cmF0aW9uICsgIm1zIHdhcyBsb25nZXIgdGhhbiAiICsgTUFYX0RVUkFUSU9OICsgIm1zIiwKKyAgICAgICAgICAgICAgICBkdXJhdGlvbiA8PSBNQVhfRFVSQVRJT04pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTY2hlZHVsZWRKb2JTdGF0ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoc3RhdHNkRGlzYWJsZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBleHBlY3RlZE5hbWUgPSAiY29tLmFuZHJvaWQuc2VydmVyLmN0cy5kZXZpY2Uuc3RhdHNkLy5TdGF0c2RKb2JTZXJ2aWNlIjsKKyAgICAgICAgZmluYWwgaW50IGF0b21UYWcgPSBBdG9tLlNDSEVEVUxFRF9KT0JfU1RBVEVfQ0hBTkdFRF9GSUVMRF9OVU1CRVI7CisgICAgICAgIFNldDxJbnRlZ2VyPiBqb2JTY2hlZHVsZSA9IG5ldyBIYXNoU2V0PD4oCisgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChTY2hlZHVsZWRKb2JTdGF0ZUNoYW5nZWQuU3RhdGUuU0NIRURVTEVEX1ZBTFVFKSk7CisgICAgICAgIFNldDxJbnRlZ2VyPiBqb2JPbiA9IG5ldyBIYXNoU2V0PD4oCisgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChTY2hlZHVsZWRKb2JTdGF0ZUNoYW5nZWQuU3RhdGUuU1RBUlRFRF9WQUxVRSkpOworICAgICAgICBTZXQ8SW50ZWdlcj4gam9iT2ZmID0gbmV3IEhhc2hTZXQ8PigKKyAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KFNjaGVkdWxlZEpvYlN0YXRlQ2hhbmdlZC5TdGF0ZS5GSU5JU0hFRF9WQUxVRSkpOworCisgICAgICAgIC8vIEFkZCBzdGF0ZSBzZXRzIHRvIHRoZSBsaXN0IGluIG9yZGVyLgorICAgICAgICBMaXN0PFNldDxJbnRlZ2VyPj4gc3RhdGVTZXQgPSBBcnJheXMuYXNMaXN0KGpvYlNjaGVkdWxlLCBqb2JPbiwgam9iT2ZmKTsKKworICAgICAgICBjcmVhdGVBbmRVcGxvYWRDb25maWcoYXRvbVRhZywgdHJ1ZSk7ICAvLyBUcnVlOiB1c2VzIGF0dHJpYnV0aW9uLgorICAgICAgICBhbGxvd0ltbWVkaWF0ZVN5bmNzKCk7CisgICAgICAgIHJ1bkRldmljZVRlc3RzKERFVklDRV9TSURFX1RFU1RfUEFDS0FHRSwgIi5BdG9tVGVzdHMiLCAidGVzdFNjaGVkdWxlZEpvYiIpOworCisgICAgICAgIC8vIFNvcnRlZCBsaXN0IG9mIGV2ZW50cyBpbiBvcmRlciBpbiB3aGljaCB0aGV5IG9jY3VycmVkLgorICAgICAgICBMaXN0PEV2ZW50TWV0cmljRGF0YT4gZGF0YSA9IGdldEV2ZW50TWV0cmljRGF0YUxpc3QoKTsKKworICAgICAgICBhc3NlcnRTdGF0ZXNPY2N1cnJlZChzdGF0ZVNldCwgZGF0YSwgMCwKKyAgICAgICAgICAgICAgICBhdG9tIC0+IGF0b20uZ2V0U2NoZWR1bGVkSm9iU3RhdGVDaGFuZ2VkKCkuZ2V0U3RhdGUoKS5nZXROdW1iZXIoKSk7CisKKyAgICAgICAgZm9yIChFdmVudE1ldHJpY0RhdGEgZSA6IGRhdGEpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZS5nZXRBdG9tKCkuZ2V0U2NoZWR1bGVkSm9iU3RhdGVDaGFuZ2VkKCkuZ2V0Sm9iTmFtZSgpLmVxdWFscyhleHBlY3RlZE5hbWUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vTm90ZTogdGhpcyB0ZXN0IGRvZXMgbm90IGhhdmUgdWlkLCBidXQgbXVzdCBydW4gb24gdGhlIGRldmljZQorICAgIHB1YmxpYyB2b2lkIHRlc3RTY3JlZW5CcmlnaHRuZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChzdGF0c2REaXNhYmxlZCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaW50IGluaXRpYWxCcmlnaHRuZXNzID0gZ2V0U2NyZWVuQnJpZ2h0bmVzcygpOworICAgICAgICBib29sZWFuIGlzSW5pdGlhbE1hbnVhbCA9IGlzU2NyZWVuQnJpZ2h0bmVzc01vZGVNYW51YWwoKTsKKyAgICAgICAgc2V0U2NyZWVuQnJpZ2h0bmVzc01vZGUodHJ1ZSk7CisgICAgICAgIHNldFNjcmVlbkJyaWdodG5lc3MoMjAwKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKFdBSVRfVElNRV9MT05HKTsKKworICAgICAgICBmaW5hbCBpbnQgYXRvbVRhZyA9IEF0b20uU0NSRUVOX0JSSUdIVE5FU1NfQ0hBTkdFRF9GSUVMRF9OVU1CRVI7CisKKyAgICAgICAgU2V0PEludGVnZXI+IHNjcmVlbk1pbiA9IG5ldyBIYXNoU2V0PD4oQXJyYXlzLmFzTGlzdCg0NykpOworICAgICAgICBTZXQ8SW50ZWdlcj4gc2NyZWVuMTAwID0gbmV3IEhhc2hTZXQ8PihBcnJheXMuYXNMaXN0KDEwMCkpOworICAgICAgICBTZXQ8SW50ZWdlcj4gc2NyZWVuMjAwID0gbmV3IEhhc2hTZXQ8PihBcnJheXMuYXNMaXN0KDE5OCkpOworICAgICAgICAvLyBTZXQ8SW50ZWdlcj4gc2NyZWVuTWF4ID0gbmV3IEhhc2hTZXQ8PihBcnJheXMuYXNMaXN0KDI1NSkpOworCisgICAgICAgIC8vIEFkZCBzdGF0ZSBzZXRzIHRvIHRoZSBsaXN0IGluIG9yZGVyLgorICAgICAgICBMaXN0PFNldDxJbnRlZ2VyPj4gc3RhdGVTZXQgPSBBcnJheXMuYXNMaXN0KHNjcmVlbk1pbiwgc2NyZWVuMTAwLCBzY3JlZW4yMDApOworCisgICAgICAgIGNyZWF0ZUFuZFVwbG9hZENvbmZpZyhhdG9tVGFnKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKFdBSVRfVElNRV9TSE9SVCk7CisgICAgICAgIHJ1bkRldmljZVRlc3RzKERFVklDRV9TSURFX1RFU1RfUEFDS0FHRSwgIi5BdG9tVGVzdHMiLCAidGVzdFNjcmVlbkJyaWdodG5lc3MiKTsKKworICAgICAgICAvLyBTb3J0ZWQgbGlzdCBvZiBldmVudHMgaW4gb3JkZXIgaW4gd2hpY2ggdGhleSBvY2N1cnJlZC4KKyAgICAgICAgTGlzdDxFdmVudE1ldHJpY0RhdGE+IGRhdGEgPSBnZXRFdmVudE1ldHJpY0RhdGFMaXN0KCk7CisKKyAgICAgICAgLy8gUmVzdG9yZSBpbml0aWFsIHNjcmVlbiBicmlnaHRuZXNzCisgICAgICAgIHNldFNjcmVlbkJyaWdodG5lc3MoaW5pdGlhbEJyaWdodG5lc3MpOworICAgICAgICBzZXRTY3JlZW5CcmlnaHRuZXNzTW9kZShpc0luaXRpYWxNYW51YWwpOworCisgICAgICAgIHBvcFVudGlsRmluZChkYXRhLCBzY3JlZW5NaW4sIGF0b20tPmF0b20uZ2V0U2NyZWVuQnJpZ2h0bmVzc0NoYW5nZWQoKS5nZXRMZXZlbCgpKTsKKyAgICAgICAgcG9wVW50aWxGaW5kRnJvbUVuZChkYXRhLCBzY3JlZW4yMDAsIGF0b20tPmF0b20uZ2V0U2NyZWVuQnJpZ2h0bmVzc0NoYW5nZWQoKS5nZXRMZXZlbCgpKTsKKyAgICAgICAgLy8gQXNzZXJ0IHRoYXQgdGhlIGV2ZW50cyBoYXBwZW5lZCBpbiB0aGUgZXhwZWN0ZWQgb3JkZXIuCisgICAgICAgIGFzc2VydFN0YXRlc09jY3VycmVkKHN0YXRlU2V0LCBkYXRhLCBXQUlUX1RJTUVfU0hPUlQsCisgICAgICAgICAgICBhdG9tIC0+IGF0b20uZ2V0U2NyZWVuQnJpZ2h0bmVzc0NoYW5nZWQoKS5nZXRMZXZlbCgpKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdFN5bmNTdGF0ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoc3RhdHNkRGlzYWJsZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZpbmFsIGludCBhdG9tVGFnID0gQXRvbS5TWU5DX1NUQVRFX0NIQU5HRURfRklFTERfTlVNQkVSOworICAgICAgICBTZXQ8SW50ZWdlcj4gc3luY09uID0gbmV3IEhhc2hTZXQ8PihBcnJheXMuYXNMaXN0KFN5bmNTdGF0ZUNoYW5nZWQuU3RhdGUuT05fVkFMVUUpKTsKKyAgICAgICAgU2V0PEludGVnZXI+IHN5bmNPZmYgPSBuZXcgSGFzaFNldDw+KEFycmF5cy5hc0xpc3QoU3luY1N0YXRlQ2hhbmdlZC5TdGF0ZS5PRkZfVkFMVUUpKTsKKworICAgICAgICAvLyBBZGQgc3RhdGUgc2V0cyB0byB0aGUgbGlzdCBpbiBvcmRlci4KKyAgICAgICAgTGlzdDxTZXQ8SW50ZWdlcj4+IHN0YXRlU2V0ID0gQXJyYXlzLmFzTGlzdChzeW5jT24sIHN5bmNPZmYsIHN5bmNPbiwgc3luY09mZik7CisKKyAgICAgICAgY3JlYXRlQW5kVXBsb2FkQ29uZmlnKGF0b21UYWcsIHRydWUpOworICAgICAgICBhbGxvd0ltbWVkaWF0ZVN5bmNzKCk7CisgICAgICAgIHJ1bkRldmljZVRlc3RzKERFVklDRV9TSURFX1RFU1RfUEFDS0FHRSwgIi5BdG9tVGVzdHMiLCAidGVzdFN5bmNTdGF0ZSIpOworCisgICAgICAgIC8vIFNvcnRlZCBsaXN0IG9mIGV2ZW50cyBpbiBvcmRlciBpbiB3aGljaCB0aGV5IG9jY3VycmVkLgorICAgICAgICBMaXN0PEV2ZW50TWV0cmljRGF0YT4gZGF0YSA9IGdldEV2ZW50TWV0cmljRGF0YUxpc3QoKTsKKworICAgICAgICAvLyBBc3NlcnQgdGhhdCB0aGUgZXZlbnRzIGhhcHBlbmVkIGluIHRoZSBleHBlY3RlZCBvcmRlci4KKyAgICAgICAgYXNzZXJ0U3RhdGVzT2NjdXJyZWQoc3RhdGVTZXQsIGRhdGEsIFdBSVRfVElNRV9TSE9SVCwKKyAgICAgICAgICAgICAgICBhdG9tIC0+IGF0b20uZ2V0U3luY1N0YXRlQ2hhbmdlZCgpLmdldFN0YXRlKCkuZ2V0TnVtYmVyKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RXYWtlbG9ja1N0YXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChzdGF0c2REaXNhYmxlZCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgaW50IGF0b21UYWcgPSBBdG9tLldBS0VMT0NLX1NUQVRFX0NIQU5HRURfRklFTERfTlVNQkVSOworICAgICAgICBTZXQ8SW50ZWdlcj4gd2FrZWxvY2tPbiA9IG5ldyBIYXNoU2V0PD4oQXJyYXlzLmFzTGlzdCgKKyAgICAgICAgICAgICAgICBXYWtlbG9ja1N0YXRlQ2hhbmdlZC5TdGF0ZS5BQ1FVSVJFX1ZBTFVFLAorICAgICAgICAgICAgICAgIFdha2Vsb2NrU3RhdGVDaGFuZ2VkLlN0YXRlLkNIQU5HRV9BQ1FVSVJFX1ZBTFVFKSk7CisgICAgICAgIFNldDxJbnRlZ2VyPiB3YWtlbG9ja09mZiA9IG5ldyBIYXNoU2V0PD4oQXJyYXlzLmFzTGlzdCgKKyAgICAgICAgICAgICAgICBXYWtlbG9ja1N0YXRlQ2hhbmdlZC5TdGF0ZS5SRUxFQVNFX1ZBTFVFLAorICAgICAgICAgICAgICAgIFdha2Vsb2NrU3RhdGVDaGFuZ2VkLlN0YXRlLkNIQU5HRV9SRUxFQVNFX1ZBTFVFKSk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIEVYUEVDVEVEX1RBRyA9ICJTdGF0c2RQYXJ0aWFsV2FrZWxvY2siOworICAgICAgICBmaW5hbCBXYWtlTG9ja0xldmVsRW51bSBFWFBFQ1RFRF9MRVZFTCA9IFdha2VMb2NrTGV2ZWxFbnVtLlBBUlRJQUxfV0FLRV9MT0NLOworCisgICAgICAgIC8vIEFkZCBzdGF0ZSBzZXRzIHRvIHRoZSBsaXN0IGluIG9yZGVyLgorICAgICAgICBMaXN0PFNldDxJbnRlZ2VyPj4gc3RhdGVTZXQgPSBBcnJheXMuYXNMaXN0KHdha2Vsb2NrT24sIHdha2Vsb2NrT2ZmKTsKKworICAgICAgICBjcmVhdGVBbmRVcGxvYWRDb25maWcoYXRvbVRhZywgdHJ1ZSk7ICAvLyBUcnVlOiB1c2VzIGF0dHJpYnV0aW9uLgorICAgICAgICBydW5EZXZpY2VUZXN0cyhERVZJQ0VfU0lERV9URVNUX1BBQ0tBR0UsICIuQXRvbVRlc3RzIiwgInRlc3RXYWtlbG9ja1N0YXRlIik7CisKKyAgICAgICAgLy8gU29ydGVkIGxpc3Qgb2YgZXZlbnRzIGluIG9yZGVyIGluIHdoaWNoIHRoZXkgb2NjdXJyZWQuCisgICAgICAgIExpc3Q8RXZlbnRNZXRyaWNEYXRhPiBkYXRhID0gZ2V0RXZlbnRNZXRyaWNEYXRhTGlzdCgpOworCisgICAgICAgIC8vIEFzc2VydCB0aGF0IHRoZSBldmVudHMgaGFwcGVuZWQgaW4gdGhlIGV4cGVjdGVkIG9yZGVyLgorICAgICAgICBhc3NlcnRTdGF0ZXNPY2N1cnJlZChzdGF0ZVNldCwgZGF0YSwgV0FJVF9USU1FX1NIT1JULAorICAgICAgICAgICAgYXRvbSAtPiBhdG9tLmdldFdha2Vsb2NrU3RhdGVDaGFuZ2VkKCkuZ2V0U3RhdGUoKS5nZXROdW1iZXIoKSk7CisKKyAgICAgICAgZm9yIChFdmVudE1ldHJpY0RhdGEgZXZlbnQ6IGRhdGEpIHsKKyAgICAgICAgICAgIFN0cmluZyB0YWcgPSBldmVudC5nZXRBdG9tKCkuZ2V0V2FrZWxvY2tTdGF0ZUNoYW5nZWQoKS5nZXRUYWcoKTsKKyAgICAgICAgICAgIFdha2VMb2NrTGV2ZWxFbnVtIHR5cGUgPSBldmVudC5nZXRBdG9tKCkuZ2V0V2FrZWxvY2tTdGF0ZUNoYW5nZWQoKS5nZXRMZXZlbCgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgdGFnOiAiICsgRVhQRUNURURfVEFHICsgIiwgYnV0IGdvdCB0YWc6ICIgKyB0YWcsCisgICAgICAgICAgICAgICAgICAgIHRhZy5lcXVhbHMoRVhQRUNURURfVEFHKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCB3YWtlbG9jayBsZXZlbDogIiArIEVYUEVDVEVEX0xFVkVMICArICIsIGJ1dCBnb3QgbGV2ZWw6ICIgKyB0eXBlLAorICAgICAgICAgICAgICAgICAgICB0eXBlID09IEVYUEVDVEVEX0xFVkVMKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RXYWtldXBBbGFybSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoc3RhdHNkRGlzYWJsZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIEZvciBhdXRvbW90aXZlLCBhbGwgd2FrZXVwIGFsYXJtIGJlY29tZXMgbm9ybWFsIGFsYXJtLiBTbyB0aGlzCisgICAgICAgIC8vIHRlc3QgZG9lcyBub3Qgd29yay4KKyAgICAgICAgaWYgKCFoYXNGZWF0dXJlKEZFQVRVUkVfQVVUT01PVElWRSwgZmFsc2UpKSByZXR1cm47CisgICAgICAgIGZpbmFsIGludCBhdG9tVGFnID0gQXRvbS5XQUtFVVBfQUxBUk1fT0NDVVJSRURfRklFTERfTlVNQkVSOworCisgICAgICAgIFN0YXRzZENvbmZpZy5CdWlsZGVyIGNvbmZpZyA9IGNyZWF0ZUNvbmZpZ0J1aWxkZXIoKTsKKyAgICAgICAgYWRkQXRvbUV2ZW50KGNvbmZpZywgYXRvbVRhZywgdHJ1ZSk7ICAvLyBUcnVlOiB1c2VzIGF0dHJpYnV0aW9uLgorCisgICAgICAgIExpc3Q8RXZlbnRNZXRyaWNEYXRhPiBkYXRhID0gZG9EZXZpY2VNZXRob2QoInRlc3RXYWtldXBBbGFybSIsIGNvbmZpZyk7CisgICAgICAgIGFzc2VydFRydWUoZGF0YS5zaXplKCkgPj0gMSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIHRhZyA9IGRhdGEuZ2V0KGkpLmdldEF0b20oKS5nZXRXYWtldXBBbGFybU9jY3VycmVkKCkuZ2V0VGFnKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHRhZy5lcXVhbHMoIip3YWxhcm0qOmFuZHJvaWQuY3RzLnN0YXRzZC50ZXN0V2FrZXVwQWxhcm0iKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2lmaUxvY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHN0YXRzZERpc2FibGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWhhc0ZlYXR1cmUoRkVBVFVSRV9XSUZJLCB0cnVlKSkgcmV0dXJuOworICAgICAgICBpZiAoIWhhc0ZlYXR1cmUoRkVBVFVSRV9QQywgZmFsc2UpKSByZXR1cm47CisKKyAgICAgICAgZmluYWwgaW50IGF0b21UYWcgPSBBdG9tLldJRklfTE9DS19TVEFURV9DSEFOR0VEX0ZJRUxEX05VTUJFUjsKKyAgICAgICAgU2V0PEludGVnZXI+IGxvY2tPbiA9IG5ldyBIYXNoU2V0PD4oQXJyYXlzLmFzTGlzdChXaWZpTG9ja1N0YXRlQ2hhbmdlZC5TdGF0ZS5PTl9WQUxVRSkpOworICAgICAgICBTZXQ8SW50ZWdlcj4gbG9ja09mZiA9IG5ldyBIYXNoU2V0PD4oQXJyYXlzLmFzTGlzdChXaWZpTG9ja1N0YXRlQ2hhbmdlZC5TdGF0ZS5PRkZfVkFMVUUpKTsKKworICAgICAgICAvLyBBZGQgc3RhdGUgc2V0cyB0byB0aGUgbGlzdCBpbiBvcmRlci4KKyAgICAgICAgTGlzdDxTZXQ8SW50ZWdlcj4+IHN0YXRlU2V0ID0gQXJyYXlzLmFzTGlzdChsb2NrT24sIGxvY2tPZmYpOworCisgICAgICAgIGNyZWF0ZUFuZFVwbG9hZENvbmZpZyhhdG9tVGFnLCB0cnVlKTsgIC8vIFRydWU6IHVzZXMgYXR0cmlidXRpb24uCisgICAgICAgIHJ1bkRldmljZVRlc3RzKERFVklDRV9TSURFX1RFU1RfUEFDS0FHRSwgIi5BdG9tVGVzdHMiLCAidGVzdFdpZmlMb2NrIik7CisKKyAgICAgICAgLy8gU29ydGVkIGxpc3Qgb2YgZXZlbnRzIGluIG9yZGVyIGluIHdoaWNoIHRoZXkgb2NjdXJyZWQuCisgICAgICAgIExpc3Q8RXZlbnRNZXRyaWNEYXRhPiBkYXRhID0gZ2V0RXZlbnRNZXRyaWNEYXRhTGlzdCgpOworCisgICAgICAgIC8vIEFzc2VydCB0aGF0IHRoZSBldmVudHMgaGFwcGVuZWQgaW4gdGhlIGV4cGVjdGVkIG9yZGVyLgorICAgICAgICBhc3NlcnRTdGF0ZXNPY2N1cnJlZChzdGF0ZVNldCwgZGF0YSwgV0FJVF9USU1FX1NIT1JULAorICAgICAgICAgICAgICAgIGF0b20gLT4gYXRvbS5nZXRXaWZpTG9ja1N0YXRlQ2hhbmdlZCgpLmdldFN0YXRlKCkuZ2V0TnVtYmVyKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RXaWZpTXVsdGljYXN0TG9jaygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoc3RhdHNkRGlzYWJsZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICghaGFzRmVhdHVyZShGRUFUVVJFX1dJRkksIHRydWUpKSByZXR1cm47CisgICAgICAgIGlmICghaGFzRmVhdHVyZShGRUFUVVJFX1BDLCBmYWxzZSkpIHJldHVybjsKKworICAgICAgICBmaW5hbCBpbnQgYXRvbVRhZyA9IEF0b20uV0lGSV9NVUxUSUNBU1RfTE9DS19TVEFURV9DSEFOR0VEX0ZJRUxEX05VTUJFUjsKKyAgICAgICAgU2V0PEludGVnZXI+IGxvY2tPbiA9IG5ldyBIYXNoU2V0PD4oCisgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChXaWZpTXVsdGljYXN0TG9ja1N0YXRlQ2hhbmdlZC5TdGF0ZS5PTl9WQUxVRSkpOworICAgICAgICBTZXQ8SW50ZWdlcj4gbG9ja09mZiA9IG5ldyBIYXNoU2V0PD4oCisgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChXaWZpTXVsdGljYXN0TG9ja1N0YXRlQ2hhbmdlZC5TdGF0ZS5PRkZfVkFMVUUpKTsKKworICAgICAgICAvLyBBZGQgc3RhdGUgc2V0cyB0byB0aGUgbGlzdCBpbiBvcmRlci4KKyAgICAgICAgTGlzdDxTZXQ8SW50ZWdlcj4+IHN0YXRlU2V0ID0gQXJyYXlzLmFzTGlzdChsb2NrT24sIGxvY2tPZmYpOworCisgICAgICAgIGNyZWF0ZUFuZFVwbG9hZENvbmZpZyhhdG9tVGFnLCB0cnVlKTsKKyAgICAgICAgcnVuRGV2aWNlVGVzdHMoREVWSUNFX1NJREVfVEVTVF9QQUNLQUdFLCAiLkF0b21UZXN0cyIsICJ0ZXN0V2lmaU11bHRpY2FzdExvY2siKTsKKworICAgICAgICAvLyBTb3J0ZWQgbGlzdCBvZiBldmVudHMgaW4gb3JkZXIgaW4gd2hpY2ggdGhleSBvY2N1cnJlZC4KKyAgICAgICAgTGlzdDxFdmVudE1ldHJpY0RhdGE+IGRhdGEgPSBnZXRFdmVudE1ldHJpY0RhdGFMaXN0KCk7CisKKyAgICAgICAgLy8gQXNzZXJ0IHRoYXQgdGhlIGV2ZW50cyBoYXBwZW5lZCBpbiB0aGUgZXhwZWN0ZWQgb3JkZXIuCisgICAgICAgIGFzc2VydFN0YXRlc09jY3VycmVkKHN0YXRlU2V0LCBkYXRhLCBXQUlUX1RJTUVfU0hPUlQsCisgICAgICAgICAgICAgICAgYXRvbSAtPiBhdG9tLmdldFdpZmlNdWx0aWNhc3RMb2NrU3RhdGVDaGFuZ2VkKCkuZ2V0U3RhdGUoKS5nZXROdW1iZXIoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFdpZmlTY2FuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChzdGF0c2REaXNhYmxlZCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFoYXNGZWF0dXJlKEZFQVRVUkVfV0lGSSwgdHJ1ZSkpIHJldHVybjsKKworICAgICAgICBmaW5hbCBpbnQgYXRvbSA9IEF0b20uV0lGSV9TQ0FOX1NUQVRFX0NIQU5HRURfRklFTERfTlVNQkVSOworICAgICAgICBmaW5hbCBpbnQga2V5ID0gV2lmaVNjYW5TdGF0ZUNoYW5nZWQuU1RBVEVfRklFTERfTlVNQkVSOworICAgICAgICBmaW5hbCBpbnQgc3RhdGVPbiA9IFdpZmlTY2FuU3RhdGVDaGFuZ2VkLlN0YXRlLk9OX1ZBTFVFOworICAgICAgICBmaW5hbCBpbnQgc3RhdGVPZmYgPSBXaWZpU2NhblN0YXRlQ2hhbmdlZC5TdGF0ZS5PRkZfVkFMVUU7CisgICAgICAgIGZpbmFsIGludCBtaW5UaW1lRGlmZk1pbGxpcyA9IDI1MDsKKyAgICAgICAgZmluYWwgaW50IG1heFRpbWVEaWZmTWlsbGlzID0gNjBfMDAwOworICAgICAgICBmaW5hbCBib29sZWFuIGRlbWFuZEV4YWN0bHlUd28gPSBmYWxzZTsgLy8gVHdvIHNjYW5zIGFyZSBwZXJmb3JtZWQsIHNvIHVwIHRvIDQgYXRvbXMgbG9nZ2VkLgorCisgICAgICAgIExpc3Q8RXZlbnRNZXRyaWNEYXRhPiBkYXRhID0gZG9EZXZpY2VNZXRob2RPbk9mZigidGVzdFdpZmlTY2FuIiwgYXRvbSwga2V5LAorICAgICAgICAgICAgICAgIHN0YXRlT24sIHN0YXRlT2ZmLCBtaW5UaW1lRGlmZk1pbGxpcywgbWF4VGltZURpZmZNaWxsaXMsIGRlbWFuZEV4YWN0bHlUd28pOworCisgICAgICAgIGFzc2VydFRydWUoZGF0YS5zaXplKCkgPj0gMik7CisgICAgICAgIGFzc2VydFRydWUoZGF0YS5zaXplKCkgPD0gNCk7CisgICAgICAgIFdpZmlTY2FuU3RhdGVDaGFuZ2VkIGEwID0gZGF0YS5nZXQoMCkuZ2V0QXRvbSgpLmdldFdpZmlTY2FuU3RhdGVDaGFuZ2VkKCk7CisgICAgICAgIFdpZmlTY2FuU3RhdGVDaGFuZ2VkIGExID0gZGF0YS5nZXQoMSkuZ2V0QXRvbSgpLmdldFdpZmlTY2FuU3RhdGVDaGFuZ2VkKCk7CisgICAgICAgIGFzc2VydFRydWUoYTAuZ2V0U3RhdGUoKS5nZXROdW1iZXIoKSA9PSBzdGF0ZU9uKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShhMS5nZXRTdGF0ZSgpLmdldE51bWJlcigpID09IHN0YXRlT2ZmKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXVkaW9TdGF0ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoc3RhdHNkRGlzYWJsZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICghaGFzRmVhdHVyZShGRUFUVVJFX0FVRElPX09VVFBVVCwgdHJ1ZSkpIHJldHVybjsKKworICAgICAgICBmaW5hbCBpbnQgYXRvbVRhZyA9IEF0b20uQVVESU9fU1RBVEVfQ0hBTkdFRF9GSUVMRF9OVU1CRVI7CisgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gInRlc3RBdWRpb1N0YXRlIjsKKworICAgICAgICBTZXQ8SW50ZWdlcj4gb25TdGF0ZSA9IG5ldyBIYXNoU2V0PD4oCisgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChBdWRpb1N0YXRlQ2hhbmdlZC5TdGF0ZS5PTl9WQUxVRSkpOworICAgICAgICBTZXQ8SW50ZWdlcj4gb2ZmU3RhdGUgPSBuZXcgSGFzaFNldDw+KAorICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoQXVkaW9TdGF0ZUNoYW5nZWQuU3RhdGUuT0ZGX1ZBTFVFKSk7CisKKyAgICAgICAgLy8gQWRkIHN0YXRlIHNldHMgdG8gdGhlIGxpc3QgaW4gb3JkZXIuCisgICAgICAgIExpc3Q8U2V0PEludGVnZXI+PiBzdGF0ZVNldCA9IEFycmF5cy5hc0xpc3Qob25TdGF0ZSwgb2ZmU3RhdGUpOworCisgICAgICAgIGNyZWF0ZUFuZFVwbG9hZENvbmZpZyhhdG9tVGFnLCB0cnVlKTsgIC8vIFRydWU6IHVzZXMgYXR0cmlidXRpb24uCisgICAgICAgIFRocmVhZC5zbGVlcChXQUlUX1RJTUVfU0hPUlQpOworCisgICAgICAgIHJ1bkRldmljZVRlc3RzKERFVklDRV9TSURFX1RFU1RfUEFDS0FHRSwgIi5BdG9tVGVzdHMiLCBuYW1lKTsKKworICAgICAgICBUaHJlYWQuc2xlZXAoV0FJVF9USU1FX1NIT1JUKTsKKyAgICAgICAgLy8gU29ydGVkIGxpc3Qgb2YgZXZlbnRzIGluIG9yZGVyIGluIHdoaWNoIHRoZXkgb2NjdXJyZWQuCisgICAgICAgIExpc3Q8RXZlbnRNZXRyaWNEYXRhPiBkYXRhID0gZ2V0RXZlbnRNZXRyaWNEYXRhTGlzdCgpOworCisgICAgICAgIC8vIEF1ZGlvU3RhdGVDaGFuZ2VkIHRpbWVzdGFtcCBpcyBmdXp6ZWQgdG8gNW1pbiBidWNrZXRzCisgICAgICAgIGFzc2VydFN0YXRlc09jY3VycmVkKHN0YXRlU2V0LCBkYXRhLCAwLAorICAgICAgICAgICAgICAgIGF0b20gLT4gYXRvbS5nZXRBdWRpb1N0YXRlQ2hhbmdlZCgpLmdldFN0YXRlKCkuZ2V0TnVtYmVyKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RNZWRpYUNvZGVjQWN0aXZpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHN0YXRzZERpc2FibGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWhhc0ZlYXR1cmUoRkVBVFVSRV9XQVRDSCwgZmFsc2UpKSByZXR1cm47CisgICAgICAgIGZpbmFsIGludCBhdG9tVGFnID0gQXRvbS5NRURJQV9DT0RFQ19TVEFURV9DSEFOR0VEX0ZJRUxEX05VTUJFUjsKKworICAgICAgICBTZXQ8SW50ZWdlcj4gb25TdGF0ZSA9IG5ldyBIYXNoU2V0PD4oCisgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChNZWRpYUNvZGVjU3RhdGVDaGFuZ2VkLlN0YXRlLk9OX1ZBTFVFKSk7CisgICAgICAgIFNldDxJbnRlZ2VyPiBvZmZTdGF0ZSA9IG5ldyBIYXNoU2V0PD4oCisgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChNZWRpYUNvZGVjU3RhdGVDaGFuZ2VkLlN0YXRlLk9GRl9WQUxVRSkpOworCisgICAgICAgIC8vIEFkZCBzdGF0ZSBzZXRzIHRvIHRoZSBsaXN0IGluIG9yZGVyLgorICAgICAgICBMaXN0PFNldDxJbnRlZ2VyPj4gc3RhdGVTZXQgPSBBcnJheXMuYXNMaXN0KG9uU3RhdGUsIG9mZlN0YXRlKTsKKworICAgICAgICBjcmVhdGVBbmRVcGxvYWRDb25maWcoYXRvbVRhZywgdHJ1ZSk7ICAvLyBUcnVlOiB1c2VzIGF0dHJpYnV0aW9uLgorICAgICAgICBUaHJlYWQuc2xlZXAoV0FJVF9USU1FX1NIT1JUKTsKKworICAgICAgICBydW5BY3Rpdml0eSgiVmlkZW9QbGF5ZXJBY3Rpdml0eSIsICJhY3Rpb24iLCAiYWN0aW9uLnBsYXlfdmlkZW8iKTsKKworICAgICAgICAvLyBTb3J0ZWQgbGlzdCBvZiBldmVudHMgaW4gb3JkZXIgaW4gd2hpY2ggdGhleSBvY2N1cnJlZC4KKyAgICAgICAgTGlzdDxFdmVudE1ldHJpY0RhdGE+IGRhdGEgPSBnZXRFdmVudE1ldHJpY0RhdGFMaXN0KCk7CisKKyAgICAgICAgLy8gQXNzZXJ0IHRoYXQgdGhlIGV2ZW50cyBoYXBwZW5lZCBpbiB0aGUgZXhwZWN0ZWQgb3JkZXIuCisgICAgICAgIGFzc2VydFN0YXRlc09jY3VycmVkKHN0YXRlU2V0LCBkYXRhLCBXQUlUX1RJTUVfTE9ORywKKyAgICAgICAgICAgICAgICBhdG9tIC0+IGF0b20uZ2V0TWVkaWFDb2RlY1N0YXRlQ2hhbmdlZCgpLmdldFN0YXRlKCkuZ2V0TnVtYmVyKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQaWN0dXJlSW5QaWN0dXJlU3RhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHN0YXRzZERpc2FibGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgc3VwcG9ydGVkID0gZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZCgiYW0gc3VwcG9ydHMtbXVsdGl3aW5kb3ciKTsKKyAgICAgICAgaWYgKCFoYXNGZWF0dXJlKEZFQVRVUkVfV0FUQ0gsIGZhbHNlKSB8fAorICAgICAgICAgICAgIWhhc0ZlYXR1cmUoRkVBVFVSRV9QSUNUVVJFX0lOX1BJQ1RVUkUsIHRydWUpIHx8CisgICAgICAgICAgICAhc3VwcG9ydGVkLmNvbnRhaW5zKCJ0cnVlIikpIHsKKyAgICAgICAgICAgIExvZ1V0aWwuQ0xvZy5kKCJTa2lwcGluZyBwaWN0dXJlIGluIHBpY3R1cmUgYXRvbSB0ZXN0LiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgaW50IGF0b21UYWcgPSBBdG9tLlBJQ1RVUkVfSU5fUElDVFVSRV9TVEFURV9DSEFOR0VEX0ZJRUxEX05VTUJFUjsKKworICAgICAgICBTZXQ8SW50ZWdlcj4gZW50ZXJlZCA9IG5ldyBIYXNoU2V0PD4oCisgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChQaWN0dXJlSW5QaWN0dXJlU3RhdGVDaGFuZ2VkLlN0YXRlLkVOVEVSRURfVkFMVUUpKTsKKworICAgICAgICAvLyBBZGQgc3RhdGUgc2V0cyB0byB0aGUgbGlzdCBpbiBvcmRlci4KKyAgICAgICAgTGlzdDxTZXQ8SW50ZWdlcj4+IHN0YXRlU2V0ID0gQXJyYXlzLmFzTGlzdChlbnRlcmVkKTsKKworICAgICAgICBjcmVhdGVBbmRVcGxvYWRDb25maWcoYXRvbVRhZywgZmFsc2UpOworCisgICAgICAgIExvZ1V0aWwuQ0xvZy5kKCJQbGF5aW5nIHZpZGVvIGluIFBpY3R1cmUtaW4tUGljdHVyZSBtb2RlIik7CisgICAgICAgIHJ1bkFjdGl2aXR5KCJWaWRlb1BsYXllckFjdGl2aXR5IiwgImFjdGlvbiIsICJhY3Rpb24ucGxheV92aWRlb19waWN0dXJlX2luX3BpY3R1cmVfbW9kZSIpOworCisgICAgICAgIC8vIFNvcnRlZCBsaXN0IG9mIGV2ZW50cyBpbiBvcmRlciBpbiB3aGljaCB0aGV5IG9jY3VycmVkLgorICAgICAgICBMaXN0PEV2ZW50TWV0cmljRGF0YT4gZGF0YSA9IGdldEV2ZW50TWV0cmljRGF0YUxpc3QoKTsKKworICAgICAgICAvLyBBc3NlcnQgdGhhdCB0aGUgZXZlbnRzIGhhcHBlbmVkIGluIHRoZSBleHBlY3RlZCBvcmRlci4KKyAgICAgICAgYXNzZXJ0U3RhdGVzT2NjdXJyZWQoc3RhdGVTZXQsIGRhdGEsIFdBSVRfVElNRV9MT05HLAorICAgICAgICAgICAgICAgIGF0b20gLT4gYXRvbS5nZXRQaWN0dXJlSW5QaWN0dXJlU3RhdGVDaGFuZ2VkKCkuZ2V0U3RhdGUoKS5nZXROdW1iZXIoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFwcENyYXNoT2NjdXJyZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHN0YXRzZERpc2FibGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBpbnQgYXRvbVRhZyA9IEF0b20uQVBQX0NSQVNIX09DQ1VSUkVEX0ZJRUxEX05VTUJFUjsKKyAgICAgICAgY3JlYXRlQW5kVXBsb2FkQ29uZmlnKGF0b21UYWcsIGZhbHNlKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKFdBSVRfVElNRV9TSE9SVCk7CisKKyAgICAgICAgcnVuQWN0aXZpdHkoIlN0YXRzZEN0c0ZvcmVncm91bmRBY3Rpdml0eSIsICJhY3Rpb24iLCAiYWN0aW9uLmNyYXNoIik7CisKKyAgICAgICAgVGhyZWFkLnNsZWVwKFdBSVRfVElNRV9TSE9SVCk7CisgICAgICAgIC8vIFNvcnRlZCBsaXN0IG9mIGV2ZW50cyBpbiBvcmRlciBpbiB3aGljaCB0aGV5IG9jY3VycmVkLgorICAgICAgICBMaXN0PEV2ZW50TWV0cmljRGF0YT4gZGF0YSA9IGdldEV2ZW50TWV0cmljRGF0YUxpc3QoKTsKKworICAgICAgICBBcHBDcmFzaE9jY3VycmVkIGF0b20gPSBkYXRhLmdldCgwKS5nZXRBdG9tKCkuZ2V0QXBwQ3Jhc2hPY2N1cnJlZCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNyYXNoIiwgYXRvbS5nZXRFdmVudFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhBcHBDcmFzaE9jY3VycmVkLkluc3RhbnRBcHAuRkFMU0VfVkFMVUUsIGF0b20uZ2V0SXNJbnN0YW50QXBwKCkuZ2V0TnVtYmVyKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoQXBwQ3Jhc2hPY2N1cnJlZC5Gb3JlZ3JvdW5kU3RhdGUuRk9SRUdST1VORF9WQUxVRSwKKyAgICAgICAgICAgICAgICBhdG9tLmdldEZvcmVncm91bmRTdGF0ZSgpLmdldE51bWJlcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uYW5kcm9pZC5zZXJ2ZXIuY3RzLmRldmljZS5zdGF0c2QiLCBhdG9tLmdldFBhY2thZ2VOYW1lKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc3RhdHNkL3NyYy9hbmRyb2lkL2N0cy9zdGF0c2QvbWV0YWRhdGEvTWV0YWRhdGFUZXN0Q2FzZS5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zdGF0c2Qvc3JjL2FuZHJvaWQvY3RzL3N0YXRzZC9tZXRhZGF0YS9NZXRhZGF0YVRlc3RDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjlmYWMyYwotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvc3RhdHNkL3NyYy9hbmRyb2lkL2N0cy9zdGF0c2QvbWV0YWRhdGEvTWV0YWRhdGFUZXN0Q2FzZS5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuY3RzLnN0YXRzZC5tZXRhZGF0YTsKKworaW1wb3J0IGFuZHJvaWQuY3RzLnN0YXRzZC5hdG9tLkF0b21UZXN0Q2FzZTsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5vcy5TdGF0c2RDb25maWdQcm90bzsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5vcy5TdGF0c2RDb25maWdQcm90by5TdGF0c2RDb25maWc7CitpbXBvcnQgY29tLmFuZHJvaWQub3MuQXRvbXNQcm90by5BdG9tOworaW1wb3J0IGNvbS5hbmRyb2lkLm9zLlN0YXRzTG9nLlN0YXRzZFN0YXRzUmVwb3J0OworaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmxvZy5Mb2dVdGlsOworCitwdWJsaWMgY2xhc3MgTWV0YWRhdGFUZXN0Q2FzZSBleHRlbmRzIEF0b21UZXN0Q2FzZSB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFVNUF9NRVRBREFUQV9DTUQgPSAiY21kIHN0YXRzIHByaW50LXN0YXRzIjsKKworICAgIHByb3RlY3RlZCBTdGF0c2RTdGF0c1JlcG9ydCBnZXRTdGF0c2RTdGF0c1JlcG9ydCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RhdHNkU3RhdHNSZXBvcnQgcmVwb3J0ID0gZ2V0RHVtcChTdGF0c2RTdGF0c1JlcG9ydC5wYXJzZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmpvaW4oIiAiLCBEVU1QX01FVEFEQVRBX0NNRCwgIi0tcHJvdG8iKSk7CisgICAgICAgICAgICByZXR1cm4gcmVwb3J0OworICAgICAgICB9IGNhdGNoIChjb20uZ29vZ2xlLnByb3RvYnVmLkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2dVdGlsLkNMb2cuZSgiRmFpbGVkIHRvIGZldGNoIGFuZCBwYXJzZSB0aGUgc3RhdHNkc3RhdHMgb3V0cHV0IHJlcG9ydC4iKTsKKyAgICAgICAgICAgIHRocm93IChlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBmaW5hbCBTdGF0c2RDb25maWcuQnVpbGRlciBnZXRCYXNlQ29uZmlnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0YXRzZENvbmZpZy5CdWlsZGVyIGJ1aWxkZXIgPSAgU3RhdHNkQ29uZmlnLm5ld0J1aWxkZXIoKS5zZXRJZChDT05GSUdfSUQpCisgICAgICAgICAgICAgICAgLmFkZEFsbG93ZWRMb2dTb3VyY2UoIkFJRF9TSEVMTCIpCisgICAgICAgICAgICAgICAgLmFkZEFsbG93ZWRMb2dTb3VyY2UoIkFJRF9ST09UIik7CisgICAgICAgIGFkZEF0b21FdmVudChidWlsZGVyLCBBdG9tLkFQUF9CUkVBRENSVU1CX1JFUE9SVEVEX0ZJRUxEX05VTUJFUik7CisgICAgICAgIHJldHVybiBidWlsZGVyOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc3RhdHNkL3NyYy9hbmRyb2lkL2N0cy9zdGF0c2QvbWV0YWRhdGEvTWV0YWRhdGFUZXN0cy5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zdGF0c2Qvc3JjL2FuZHJvaWQvY3RzL3N0YXRzZC9tZXRhZGF0YS9NZXRhZGF0YVRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkyZTdiMgotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvc3RhdHNkL3NyYy9hbmRyb2lkL2N0cy9zdGF0c2QvbWV0YWRhdGEvTWV0YWRhdGFUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5jdHMuc3RhdHNkLm1ldGFkYXRhOworCitpbXBvcnQgYW5kcm9pZC5jdHMuc3RhdHNkLmF0b20uQXRvbVRlc3RDYXNlOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuU3RhdHNkQ29uZmlnUHJvdG87CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuU3RhdHNkQ29uZmlnUHJvdG8uU3RhdHNkQ29uZmlnOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLm9zLlN0YXRzZENvbmZpZ1Byb3RvLlN1YnNjcmlwdGlvbjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5vcy5TdGF0c2RDb25maWdQcm90by5UaW1lVW5pdDsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5vcy5TdGF0c2RDb25maWdQcm90by5WYWx1ZU1ldHJpYzsKK2ltcG9ydCBjb20uYW5kcm9pZC5vcy5BdG9tc1Byb3RvLkFub21hbHlEZXRlY3RlZDsKK2ltcG9ydCBjb20uYW5kcm9pZC5vcy5BdG9tc1Byb3RvLkFwcEJyZWFkY3J1bWJSZXBvcnRlZDsKK2ltcG9ydCBjb20uYW5kcm9pZC5vcy5BdG9tc1Byb3RvLkF0b207CitpbXBvcnQgY29tLmFuZHJvaWQub3MuU3RhdHNMb2cuRXZlbnRNZXRyaWNEYXRhOworaW1wb3J0IGNvbS5hbmRyb2lkLm9zLlN0YXRzTG9nLlN0YXRzZFN0YXRzUmVwb3J0OworaW1wb3J0IGNvbS5hbmRyb2lkLm9zLlN0YXRzTG9nLlN0YXRzZFN0YXRzUmVwb3J0LkNvbmZpZ1N0YXRzOworaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmxvZy5Mb2dVdGlsOworCisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBTdGF0c2QgTWV0YWRhdGEgdGVzdHMuCisgKi8KK3B1YmxpYyBjbGFzcyBNZXRhZGF0YVRlc3RzIGV4dGVuZHMgTWV0YWRhdGFUZXN0Q2FzZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlN0YXRzZC5NZXRhZGF0YVRlc3RzIjsKKworICAgIC8vIFRlc3RzIHRoYXQgdGhlIHN0YXRzZCBjb25maWcgaXMgcmVzZXQgYWZ0ZXIgdGhlIHNwZWNpZmllZCB0dGwuCisgICAgcHVibGljIHZvaWQgdGVzdENvbmZpZ1R0bCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoc3RhdHNkRGlzYWJsZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZpbmFsIGludCBUVExfVElNRV9TRUMgPSA4OworICAgICAgICBTdGF0c2RDb25maWcuQnVpbGRlciBjb25maWcgPSBnZXRCYXNlQ29uZmlnKCk7CisgICAgICAgIGNvbmZpZy5zZXRUdGxJblNlY29uZHMoVFRMX1RJTUVfU0VDKTsgLy8gc2hvdWxkIHJlc2V0IGluIHRoaXMgbWFueSBzZWNvbmRzLgorCisgICAgICAgIHVwbG9hZENvbmZpZyhjb25maWcpOworICAgICAgICBsb25nIHN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBUaHJlYWQuc2xlZXAoV0FJVF9USU1FX1NIT1JUKTsKKyAgICAgICAgZG9BcHBCcmVhZGNydW1iUmVwb3J0ZWRTdGFydCgvKiBpcnJlbGV2YW50IHZhbCAqLyA2KTsgLy8gRXZlbnQsIHdpdGhpbiA8IFRUTF9USU1FX1NFQyBzZWNzLgorICAgICAgICBUaHJlYWQuc2xlZXAoV0FJVF9USU1FX1NIT1JUKTsKKyAgICAgICAgU3RhdHNkU3RhdHNSZXBvcnQgcmVwb3J0ID0gZ2V0U3RhdHNkU3RhdHNSZXBvcnQoKTsgLy8gSGFzIG9ubHkgYmVlbiAxIHNlY29uZAorICAgICAgICBMb2dVdGlsLkNMb2cuZCgiZ290IGZvbGxvd2luZyBzdGF0c2RzdGF0cyByZXBvcnQ6ICIgKyByZXBvcnQudG9TdHJpbmcoKSk7CisgICAgICAgIGJvb2xlYW4gZm91bmRBY3RpdmVDb25maWcgPSBmYWxzZTsKKyAgICAgICAgaW50IGNyZWF0aW9uVGltZSA9IDA7CisgICAgICAgIGZvciAoQ29uZmlnU3RhdHMgc3RhdHM6IHJlcG9ydC5nZXRDb25maWdTdGF0c0xpc3QoKSkgeworICAgICAgICAgICAgaWYgKHN0YXRzLmdldElkKCkgPT0gQ09ORklHX0lEICYmIHN0YXRzLmdldFVpZCgpID09IGdldEhvc3RVaWQoKSkgeworICAgICAgICAgICAgICAgIGlmKCFzdGF0cy5oYXNEZWxldGlvblRpbWVTZWMoKSkgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJGb3VuZCBtdWx0aXBsZSBhY3RpdmUgQ1RTIGNvbmZpZ3MhIiwgZm91bmRBY3RpdmVDb25maWcgPT0gZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBmb3VuZEFjdGl2ZUNvbmZpZyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGNyZWF0aW9uVGltZSA9IHN0YXRzLmdldENyZWF0aW9uVGltZVNlYygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKCJEaWQgbm90IGZpbmQgYW4gYWN0aXZlIENUUyBjb25maWciLCBmb3VuZEFjdGl2ZUNvbmZpZyk7CisKKyAgICAgICAgd2hpbGUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydFRpbWUgPCA4XzAwMCkgeworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwKTsKKyAgICAgICAgfQorICAgICAgICBkb0FwcEJyZWFkY3J1bWJSZXBvcnRlZFN0YXJ0KC8qIGlycmVsZXZhbnQgdmFsICovIDYpOyAvLyBFdmVudCwgYWZ0ZXIgVFRMX1RJTUVfU0VDIHNlY3MuCisgICAgICAgIHJlcG9ydCA9IGdldFN0YXRzZFN0YXRzUmVwb3J0KCk7CisgICAgICAgIExvZ1V0aWwuQ0xvZy5kKCJnb3QgZm9sbG93aW5nIHN0YXRzZHN0YXRzIHJlcG9ydDogIiArIHJlcG9ydC50b1N0cmluZygpKTsKKyAgICAgICAgZm91bmRBY3RpdmVDb25maWcgPSBmYWxzZTsKKyAgICAgICAgaW50IGV4cGVjdGVkVGltZSA9IGNyZWF0aW9uVGltZSArIFRUTF9USU1FX1NFQzsKKyAgICAgICAgZm9yIChDb25maWdTdGF0cyBzdGF0czogcmVwb3J0LmdldENvbmZpZ1N0YXRzTGlzdCgpKSB7CisgICAgICAgICAgICBpZiAoc3RhdHMuZ2V0SWQoKSA9PSBDT05GSUdfSUQgJiYgc3RhdHMuZ2V0VWlkKCkgPT0gZ2V0SG9zdFVpZCgpKSB7CisgICAgICAgICAgICAgICAgLy8gT3JpZ2luYWwgY29uZmlnIHNob3VsZCBiZSBUVEwnZAorICAgICAgICAgICAgICAgIGlmIChzdGF0cy5nZXRDcmVhdGlvblRpbWVTZWMoKSA9PSBjcmVhdGlvblRpbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQ29uZmlnIHNob3VsZCBoYXZlIFRUTCdkIGJ1dCBpcyBzdGlsbCBhY3RpdmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRzLmhhc0RlbGV0aW9uVGltZVNlYygpKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQ29uZmlnIGRlbGV0aW9uIHRpbWUgc2hvdWxkIGJlIGFib3V0ICIgKyBUVExfVElNRV9TRUMgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgYWZ0ZXIgY3JlYXRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguYWJzKHN0YXRzLmdldERlbGV0aW9uVGltZVNlYygpIC0gZXhwZWN0ZWRUaW1lKSA8PSAyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gVGhlcmUgc2hvdWxkIHN0aWxsIGJlIG9uZSBhY3RpdmUgY29uZmlnLCB0aGF0IGlzIG1hcmtlZCBhcyByZXNldC4KKyAgICAgICAgICAgICAgICBpZighc3RhdHMuaGFzRGVsZXRpb25UaW1lU2VjKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRm91bmQgbXVsdGlwbGUgYWN0aXZlIENUUyBjb25maWdzISIsIGZvdW5kQWN0aXZlQ29uZmlnID09IGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgZm91bmRBY3RpdmVDb25maWcgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBjcmVhdGlvblRpbWUgPSBzdGF0cy5nZXRDcmVhdGlvblRpbWVTZWMoKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQWN0aXZlIGNvbmZpZyBhZnRlciBUVEwgc2hvdWxkIGJlIG1hcmtlZCBhcyByZXNldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHMuaGFzUmVzZXRUaW1lU2VjKCkpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlJlc2V0IHRpbWUgYW5kIGNyZWF0aW9uIHRpbWUgc2hvdWxkIGJlIGVxdWFsIGZvciBUVGwnZCBjb25maWdzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0cy5nZXRSZXNldFRpbWVTZWMoKSwgc3RhdHMuZ2V0Q3JlYXRpb25UaW1lU2VjKCkpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJSZXNldCBjb25maWcgc2hvdWxkIGJlIGNyZWF0ZWQgd2hlbiB0aGUgb3JpZ2luYWwgY29uZmlnIFRUTCdkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLmFicyhzdGF0cy5nZXRDcmVhdGlvblRpbWVTZWMoKSAtIGV4cGVjdGVkVGltZSkgPD0gMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoIkRpZCBub3QgZmluZCBhbiBhY3RpdmUgQ1RTIGNvbmZpZyBhZnRlciB0aGUgVFRMIiwgZm91bmRBY3RpdmVDb25maWcpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc3RhdHNkL3NyYy9hbmRyb2lkL2N0cy9zdGF0c2QvbWV0cmljL0NvdW50TWV0cmljc1Rlc3RzLmphdmEgYi9ob3N0c2lkZXRlc3RzL3N0YXRzZC9zcmMvYW5kcm9pZC9jdHMvc3RhdHNkL21ldHJpYy9Db3VudE1ldHJpY3NUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMjExYzYKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL3N0YXRzZC9zcmMvYW5kcm9pZC9jdHMvc3RhdHNkL21ldHJpYy9Db3VudE1ldHJpY3NUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMTgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5jdHMuc3RhdHNkLm1ldHJpYzsKKworaW1wb3J0IGFuZHJvaWQuY3RzLnN0YXRzZC5hdG9tLkRldmljZUF0b21UZXN0Q2FzZTsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLm9zLlN0YXRzZENvbmZpZ1Byb3RvOworaW1wb3J0IGNvbS5hbmRyb2lkLm9zLkF0b21zUHJvdG8uQXRvbTsKK2ltcG9ydCBjb20uYW5kcm9pZC5vcy5BdG9tc1Byb3RvLkFwcEJyZWFkY3J1bWJSZXBvcnRlZDsKK2ltcG9ydCBjb20uYW5kcm9pZC5vcy5TdGF0c0xvZzsKK2ltcG9ydCBjb20uYW5kcm9pZC5vcy5TdGF0c0xvZy5Db25maWdNZXRyaWNzUmVwb3J0OworaW1wb3J0IGNvbS5hbmRyb2lkLm9zLlN0YXRzTG9nLkNvbmZpZ01ldHJpY3NSZXBvcnRMaXN0OworaW1wb3J0IGNvbS5hbmRyb2lkLm9zLlN0YXRzTG9nLkNvdW50QnVja2V0SW5mbzsKK2ltcG9ydCBjb20uYW5kcm9pZC5vcy5TdGF0c0xvZy5Db3VudE1ldHJpY0RhdGE7CitpbXBvcnQgY29tLmFuZHJvaWQub3MuU3RhdHNMb2cuU3RhdHNMb2dSZXBvcnQ7CitpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLkRldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5sb2cuTG9nVXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBDb3VudE1ldHJpY3NUZXN0cyBleHRlbmRzIERldmljZUF0b21UZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlRXZlbnRDb3VudE1ldHJpYygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoc3RhdHNkRGlzYWJsZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGludCBtYXRjaGVySWQgPSAxOworICAgICAgICBTdGF0c2RDb25maWdQcm90by5TdGF0c2RDb25maWcuQnVpbGRlciBidWlsZGVyID0gY3JlYXRlQ29uZmlnQnVpbGRlcigpOworICAgICAgICBidWlsZGVyLmFkZENvdW50TWV0cmljKFN0YXRzZENvbmZpZ1Byb3RvLkNvdW50TWV0cmljLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRJZChNZXRyaWNzVXRpbHMuQ09VTlRfTUVUUklDX0lEKQorICAgICAgICAgICAgICAgIC5zZXRCdWNrZXQoU3RhdHNkQ29uZmlnUHJvdG8uVGltZVVuaXQuQ1RTKQorICAgICAgICAgICAgICAgIC5zZXRXaGF0KG1hdGNoZXJJZCkpCisgICAgICAgICAgICAgICAgLmFkZEF0b21NYXRjaGVyKE1ldHJpY3NVdGlscy5zaW1wbGVBdG9tTWF0Y2hlcihtYXRjaGVySWQpKTsKKyAgICAgICAgdXBsb2FkQ29uZmlnKGJ1aWxkZXIpOworCisgICAgICAgIGRvQXBwQnJlYWRjcnVtYlJlcG9ydGVkU3RhcnQoMCk7CisgICAgICAgIGRvQXBwQnJlYWRjcnVtYlJlcG9ydGVkU3RvcCgwKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKDIwMDApOyAgLy8gV2FpdCBmb3IgdGhlIG1ldHJpY3MgdG8gcHJvcGFnYXRlIHRvIHN0YXRzZC4KKworICAgICAgICBTdGF0c0xvZ1JlcG9ydCBtZXRyaWNSZXBvcnQgPSBnZXRTdGF0c0xvZ1JlcG9ydCgpOworICAgICAgICBMb2dVdGlsLkNMb2cuZCgiR290IHRoZSBmb2xsb3dpbmcgc3RhdHMgbG9nIHJlcG9ydDogXG4iICsgbWV0cmljUmVwb3J0LnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWV0cmljc1V0aWxzLkNPVU5UX01FVFJJQ19JRCwgbWV0cmljUmVwb3J0LmdldE1ldHJpY0lkKCkpOworICAgICAgICBhc3NlcnRUcnVlKG1ldHJpY1JlcG9ydC5oYXNDb3VudE1ldHJpY3MoKSk7CisKKyAgICAgICAgU3RhdHNMb2dSZXBvcnQuQ291bnRNZXRyaWNEYXRhV3JhcHBlciBjb3VudERhdGEgPSBtZXRyaWNSZXBvcnQuZ2V0Q291bnRNZXRyaWNzKCk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudERhdGEuZ2V0RGF0YUNvdW50KCkgPiAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGNvdW50RGF0YS5nZXREYXRhKDApLmdldEJ1Y2tldEluZm8oMCkuZ2V0Q291bnQoKSk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RFdmVudENvdW50V2l0aENvbmRpdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoc3RhdHNkRGlzYWJsZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGludCBzdGFydE1hdGNoZXJJZCA9IDE7CisgICAgICAgIGludCBlbmRNYXRjaGVySWQgPSAyOworICAgICAgICBpbnQgd2hhdE1hdGNoZXJJZCA9IDM7CisgICAgICAgIGludCBjb25kaXRpb25JZCA9IDQ7CisKKyAgICAgICAgU3RhdHNkQ29uZmlnUHJvdG8uQXRvbU1hdGNoZXIgd2hhdE1hdGNoZXIgPQorICAgICAgICAgICAgICAgTWV0cmljc1V0aWxzLnVuc3BlY2lmaWVkQXRvbU1hdGNoZXIod2hhdE1hdGNoZXJJZCk7CisKKyAgICAgICAgU3RhdHNkQ29uZmlnUHJvdG8uQXRvbU1hdGNoZXIgcHJlZGljYXRlU3RhcnRNYXRjaGVyID0KKyAgICAgICAgICAgICAgICBNZXRyaWNzVXRpbHMuc3RhcnRBdG9tTWF0Y2hlcihzdGFydE1hdGNoZXJJZCk7CisKKyAgICAgICAgU3RhdHNkQ29uZmlnUHJvdG8uQXRvbU1hdGNoZXIgcHJlZGljYXRlRW5kTWF0Y2hlciA9CisgICAgICAgICAgICAgICAgTWV0cmljc1V0aWxzLnN0b3BBdG9tTWF0Y2hlcihlbmRNYXRjaGVySWQpOworCisgICAgICAgIFN0YXRzZENvbmZpZ1Byb3RvLlByZWRpY2F0ZSBwID0gU3RhdHNkQ29uZmlnUHJvdG8uUHJlZGljYXRlLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRTaW1wbGVQcmVkaWNhdGUoU3RhdHNkQ29uZmlnUHJvdG8uU2ltcGxlUHJlZGljYXRlLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFN0YXJ0KHN0YXJ0TWF0Y2hlcklkKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFN0b3AoZW5kTWF0Y2hlcklkKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvdW50TmVzdGluZyhmYWxzZSkpCisgICAgICAgICAgICAgICAgLnNldElkKGNvbmRpdGlvbklkKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworCisgICAgICAgIFN0YXRzZENvbmZpZ1Byb3RvLlN0YXRzZENvbmZpZy5CdWlsZGVyIGJ1aWxkZXIgPSBjcmVhdGVDb25maWdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuYWRkQ291bnRNZXRyaWMoU3RhdHNkQ29uZmlnUHJvdG8uQ291bnRNZXRyaWMubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0SWQoTWV0cmljc1V0aWxzLkNPVU5UX01FVFJJQ19JRCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRCdWNrZXQoU3RhdHNkQ29uZmlnUHJvdG8uVGltZVVuaXQuQ1RTKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFdoYXQod2hhdE1hdGNoZXJJZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb25kaXRpb24oY29uZGl0aW9uSWQpKQorICAgICAgICAgICAgICAgIC5hZGRBdG9tTWF0Y2hlcih3aGF0TWF0Y2hlcikKKyAgICAgICAgICAgICAgICAuYWRkQXRvbU1hdGNoZXIocHJlZGljYXRlU3RhcnRNYXRjaGVyKQorICAgICAgICAgICAgICAgIC5hZGRBdG9tTWF0Y2hlcihwcmVkaWNhdGVFbmRNYXRjaGVyKQorICAgICAgICAgICAgICAgIC5hZGRQcmVkaWNhdGUocCk7CisKKyAgICAgICAgdXBsb2FkQ29uZmlnKGJ1aWxkZXIpOworCisgICAgICAgIGRvQXBwQnJlYWRjcnVtYlJlcG9ydGVkKDAsIEFwcEJyZWFkY3J1bWJSZXBvcnRlZC5TdGF0ZS5VTlNQRUNJRklFRC5vcmRpbmFsKCkpOworICAgICAgICBUaHJlYWQuc2xlZXAoMTApOworICAgICAgICBkb0FwcEJyZWFkY3J1bWJSZXBvcnRlZFN0YXJ0KDApOworICAgICAgICBUaHJlYWQuc2xlZXAoMTApOworICAgICAgICBkb0FwcEJyZWFkY3J1bWJSZXBvcnRlZCgwLCBBcHBCcmVhZGNydW1iUmVwb3J0ZWQuU3RhdGUuVU5TUEVDSUZJRUQub3JkaW5hbCgpKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKDEwKTsKKyAgICAgICAgZG9BcHBCcmVhZGNydW1iUmVwb3J0ZWRTdG9wKDApOworICAgICAgICBUaHJlYWQuc2xlZXAoMTApOworICAgICAgICBkb0FwcEJyZWFkY3J1bWJSZXBvcnRlZCgwLCBBcHBCcmVhZGNydW1iUmVwb3J0ZWQuU3RhdGUuVU5TUEVDSUZJRUQub3JkaW5hbCgpKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKDIwMDApOyAgLy8gV2FpdCBmb3IgdGhlIG1ldHJpY3MgdG8gcHJvcGFnYXRlIHRvIHN0YXRzZC4KKworICAgICAgICBTdGF0c0xvZ1JlcG9ydCBtZXRyaWNSZXBvcnQgPSBnZXRTdGF0c0xvZ1JlcG9ydCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWV0cmljc1V0aWxzLkNPVU5UX01FVFJJQ19JRCwgbWV0cmljUmVwb3J0LmdldE1ldHJpY0lkKCkpOworICAgICAgICBhc3NlcnRUcnVlKG1ldHJpY1JlcG9ydC5oYXNDb3VudE1ldHJpY3MoKSk7CisKKyAgICAgICAgU3RhdHNMb2dSZXBvcnQuQ291bnRNZXRyaWNEYXRhV3JhcHBlciBjb3VudERhdGEgPSBtZXRyaWNSZXBvcnQuZ2V0Q291bnRNZXRyaWNzKCk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudERhdGEuZ2V0RGF0YUNvdW50KCkgPiAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGNvdW50RGF0YS5nZXREYXRhKDApLmdldEJ1Y2tldEluZm8oMCkuZ2V0Q291bnQoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFBhcnRpYWxCdWNrZXRDb3VudE1ldHJpYygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoc3RhdHNkRGlzYWJsZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGludCBtYXRjaGVySWQgPSAxOworICAgICAgICBTdGF0c2RDb25maWdQcm90by5TdGF0c2RDb25maWcuQnVpbGRlciBidWlsZGVyID0gY3JlYXRlQ29uZmlnQnVpbGRlcigpOworICAgICAgICBidWlsZGVyLmFkZENvdW50TWV0cmljKFN0YXRzZENvbmZpZ1Byb3RvLkNvdW50TWV0cmljLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRJZChNZXRyaWNzVXRpbHMuQ09VTlRfTUVUUklDX0lEKQorICAgICAgICAgICAgICAgIC5zZXRCdWNrZXQoU3RhdHNkQ29uZmlnUHJvdG8uVGltZVVuaXQuT05FX0RBWSkgIC8vIFNob3VsZCBlbnN1cmUgcGFydGlhbCBidWNrZXQuCisgICAgICAgICAgICAgICAgLnNldFdoYXQobWF0Y2hlcklkKSkKKyAgICAgICAgICAgICAgICAuYWRkQXRvbU1hdGNoZXIoTWV0cmljc1V0aWxzLnNpbXBsZUF0b21NYXRjaGVyKG1hdGNoZXJJZCkpOworICAgICAgICB1cGxvYWRDb25maWcoYnVpbGRlcik7CisKKyAgICAgICAgZG9BcHBCcmVhZGNydW1iUmVwb3J0ZWRTdGFydCgwKTsKKworICAgICAgICBidWlsZGVyLmdldENvdW50TWV0cmljQnVpbGRlcigwKS5zZXRCdWNrZXQoU3RhdHNkQ29uZmlnUHJvdG8uVGltZVVuaXQuQ1RTKTsKKyAgICAgICAgdXBsb2FkQ29uZmlnKGJ1aWxkZXIpOyAgLy8gVGhlIGNvdW50IG1ldHJpYyBoYWQgYSBwYXJ0aWFsIGJ1Y2tldC4KKyAgICAgICAgZG9BcHBCcmVhZGNydW1iUmVwb3J0ZWRTdGFydCgwKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKDEwKTsKKyAgICAgICAgZG9BcHBCcmVhZGNydW1iUmVwb3J0ZWRTdGFydCgwKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKFdBSVRfVElNRV9MT05HKTsgLy8gRmluaXNoIHRoZSBjdXJyZW50IGJ1Y2tldC4KKworICAgICAgICBDb25maWdNZXRyaWNzUmVwb3J0TGlzdCByZXBvcnRzID0gZ2V0UmVwb3J0TGlzdCgpOworICAgICAgICBMb2dVdGlsLkNMb2cuZCgiR290IGZvbGxvd2luZyByZXBvcnQgbGlzdDogIiArIHJlcG9ydHMudG9TdHJpbmcoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCAyIHJlcG9ydHMsIGdvdCAiICsgcmVwb3J0cy5nZXRSZXBvcnRzQ291bnQoKSwKKyAgICAgICAgICAgICAgICAyLCByZXBvcnRzLmdldFJlcG9ydHNDb3VudCgpKTsKKyAgICAgICAgYm9vbGVhbiBpbk9yZGVyID0gcmVwb3J0cy5nZXRSZXBvcnRzKDApLmdldEN1cnJlbnRSZXBvcnRXYWxsQ2xvY2tOYW5vcygpIDwKKyAgICAgICAgICAgICAgICByZXBvcnRzLmdldFJlcG9ydHMoMSkuZ2V0Q3VycmVudFJlcG9ydFdhbGxDbG9ja05hbm9zKCk7CisKKyAgICAgICAgLy8gT25seSAxIG1ldHJpYywgc28gdGhlcmUgc2hvdWxkIG9ubHkgYmUgMSBTdGF0c0xvZ1JlcG9ydC4KKyAgICAgICAgZm9yIChDb25maWdNZXRyaWNzUmVwb3J0IHJlcG9ydCA6IHJlcG9ydHMuZ2V0UmVwb3J0c0xpc3QoKSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCAxIFN0YXRzTG9nUmVwb3J0IGluIGVhY2ggQ29uZmlnTWV0cmljc1JlcG9ydCIsCisgICAgICAgICAgICAgICAgICAgIDEsIHJlcG9ydC5nZXRNZXRyaWNzQ291bnQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIDEgQ291bnRNZXRyaWNEYXRhIGluIGVhY2ggcmVwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgMSwgcmVwb3J0LmdldE1ldHJpY3MoMCkuZ2V0Q291bnRNZXRyaWNzKCkuZ2V0RGF0YUNvdW50KCkpOworICAgICAgICB9CisgICAgICAgIENvdW50TWV0cmljRGF0YSBkYXRhMSA9CisgICAgICAgICAgICAgICAgcmVwb3J0cy5nZXRSZXBvcnRzKGluT3JkZXI/IDAgOiAxKS5nZXRNZXRyaWNzKDApLmdldENvdW50TWV0cmljcygpLmdldERhdGEoMCk7CisgICAgICAgIENvdW50TWV0cmljRGF0YSBkYXRhMiA9CisgICAgICAgICAgICAgICAgcmVwb3J0cy5nZXRSZXBvcnRzKGluT3JkZXI/IDEgOiAwKS5nZXRNZXRyaWNzKDApLmdldENvdW50TWV0cmljcygpLmdldERhdGEoMCk7CisgICAgICAgIC8vIERhdGExIHNob3VsZCBoYXZlIG9ubHkgMSBidWNrZXQsIGFuZCBpdCBzaG91bGQgYmUgYSBwYXJ0aWFsIGJ1Y2tldC4KKyAgICAgICAgLy8gVGhlIGNvdW50IHNob3VsZCBiZSAxLgorICAgICAgICBhc3NlcnRFcXVhbHMoIkZpcnN0IHJlcG9ydCBzaG91bGQgb25seSBoYXZlIDEgYnVja2V0IiwgMSwgZGF0YTEuZ2V0QnVja2V0SW5mb0NvdW50KCkpOworICAgICAgICBDb3VudEJ1Y2tldEluZm8gYnVja2V0SW5mbyA9IGRhdGExLmdldEJ1Y2tldEluZm8oMCk7CisgICAgICAgIGFzc2VydEVxdWFscygiRmlyc3QgcmVwb3J0IHNob3VsZCBoYXZlIGEgY291bnQgb2YgMSIsIDEsIGJ1Y2tldEluZm8uZ2V0Q291bnQoKSk7CisgICAgICAgIGFzc2VydFRydWUoIkZpcnN0IHJlcG9ydCdzIGJ1Y2tldCBzaG91bGQgYmUgbGVzcyB0aGFuIDEgZGF5IiwKKyAgICAgICAgICAgICAgICBidWNrZXRJbmZvLmdldEVuZEJ1Y2tldEVsYXBzZWROYW5vcygpIDwKKyAgICAgICAgICAgICAgICAoYnVja2V0SW5mby5nZXRTdGFydEJ1Y2tldEVsYXBzZWROYW5vcygpICsgMV8wMDBfMDAwXzAwMEwgKiA2MEwgKiA2MEwgKiAyNEwpKTsKKworICAgICAgICAvL1NlY29uZCByZXBvcnQgc2hvdWxkIGhhdmUgYSBjb3VudCBvZiAyLgorICAgICAgICBhc3NlcnRUcnVlKCJTZWNvbmQgcmVwb3J0IHNob3VsZCBoYXZlIGF0IG1vc3QgMiBidWNrZXRzIiwgZGF0YTIuZ2V0QnVja2V0SW5mb0NvdW50KCkgPCAzKTsKKyAgICAgICAgaW50IHRvdGFsQ291bnQgPSAwOworICAgICAgICBmb3IgKENvdW50QnVja2V0SW5mbyBidWNrZXQgOiBkYXRhMi5nZXRCdWNrZXRJbmZvTGlzdCgpKSB7CisgICAgICAgICAgICB0b3RhbENvdW50ICs9IGJ1Y2tldC5nZXRDb3VudCgpOworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscygiU2Vjb25kIHJlcG9ydCBzaG91bGQgaGF2ZSBhIGNvdW50IG9mIDIiLCAyLCB0b3RhbENvdW50KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3N0YXRzZC9zcmMvYW5kcm9pZC9jdHMvc3RhdHNkL21ldHJpYy9EdXJhdGlvbk1ldHJpY3NUZXN0cy5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zdGF0c2Qvc3JjL2FuZHJvaWQvY3RzL3N0YXRzZC9tZXRyaWMvRHVyYXRpb25NZXRyaWNzVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTc0Mzg2Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9zdGF0c2Qvc3JjL2FuZHJvaWQvY3RzL3N0YXRzZC9tZXRyaWMvRHVyYXRpb25NZXRyaWNzVGVzdHMuamF2YQpAQCAtMCwwICsxLDE5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQuY3RzLnN0YXRzZC5tZXRyaWM7CisKK2ltcG9ydCBhbmRyb2lkLmN0cy5zdGF0c2QuYXRvbS5EZXZpY2VBdG9tVGVzdENhc2U7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5vcy5TdGF0c2RDb25maWdQcm90bzsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5vcy5TdGF0c2RDb25maWdQcm90by5BdG9tTWF0Y2hlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5vcy5TdGF0c2RDb25maWdQcm90by5GaWVsZE1hdGNoZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuU3RhdHNkQ29uZmlnUHJvdG8uRmllbGRWYWx1ZU1hdGNoZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuU3RhdHNkQ29uZmlnUHJvdG8uUG9zaXRpb247CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuU3RhdHNkQ29uZmlnUHJvdG8uUHJlZGljYXRlOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLm9zLlN0YXRzZENvbmZpZ1Byb3RvLlNpbXBsZUF0b21NYXRjaGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLm9zLlN0YXRzZENvbmZpZ1Byb3RvLlNpbXBsZVByZWRpY2F0ZTsKK2ltcG9ydCBjb20uYW5kcm9pZC5vcy5BdG9tc1Byb3RvLkFwcEJyZWFkY3J1bWJSZXBvcnRlZDsKK2ltcG9ydCBjb20uYW5kcm9pZC5vcy5BdG9tc1Byb3RvLkF0b207CitpbXBvcnQgY29tLmFuZHJvaWQub3MuU3RhdHNMb2cuQ29uZmlnTWV0cmljc1JlcG9ydDsKK2ltcG9ydCBjb20uYW5kcm9pZC5vcy5TdGF0c0xvZy5Db25maWdNZXRyaWNzUmVwb3J0TGlzdDsKK2ltcG9ydCBjb20uYW5kcm9pZC5vcy5TdGF0c0xvZy5EdXJhdGlvbkJ1Y2tldEluZm87CitpbXBvcnQgY29tLmFuZHJvaWQub3MuU3RhdHNMb2cuU3RhdHNMb2dSZXBvcnQ7CitpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLkRldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgRHVyYXRpb25NZXRyaWNzVGVzdHMgZXh0ZW5kcyBEZXZpY2VBdG9tVGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFQUF9CUkVBRENSVU1CX1JFUE9SVEVEX0FfTUFUQ0hfU1RBUlRfSUQgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBUFBfQlJFQURDUlVNQl9SRVBPUlRFRF9BX01BVENIX1NUT1BfSUQgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBUFBfQlJFQURDUlVNQl9SRVBPUlRFRF9CX01BVENIX1NUQVJUX0lEID0gMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVBQX0JSRUFEQ1JVTUJfUkVQT1JURURfQl9NQVRDSF9TVE9QX0lEID0gMzsKKworICAgIHB1YmxpYyB2b2lkIHRlc3REdXJhdGlvbk1ldHJpYygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoc3RhdHNkRGlzYWJsZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIEFkZCBBdG9tTWF0Y2hlcidzLgorICAgICAgICBBdG9tTWF0Y2hlciBzdGFydEF0b21NYXRjaGVyID0KKyAgICAgICAgICAgIE1ldHJpY3NVdGlscy5zdGFydEF0b21NYXRjaGVyKEFQUF9CUkVBRENSVU1CX1JFUE9SVEVEX0FfTUFUQ0hfU1RBUlRfSUQpOworICAgICAgICBBdG9tTWF0Y2hlciBzdG9wQXRvbU1hdGNoZXIgPQorICAgICAgICAgICAgTWV0cmljc1V0aWxzLnN0b3BBdG9tTWF0Y2hlcihBUFBfQlJFQURDUlVNQl9SRVBPUlRFRF9BX01BVENIX1NUT1BfSUQpOworCisgICAgICAgIFN0YXRzZENvbmZpZ1Byb3RvLlN0YXRzZENvbmZpZy5CdWlsZGVyIGJ1aWxkZXIgPSBjcmVhdGVDb25maWdCdWlsZGVyKCk7CisgICAgICAgIGJ1aWxkZXIuYWRkQXRvbU1hdGNoZXIoc3RhcnRBdG9tTWF0Y2hlcik7CisgICAgICAgIGJ1aWxkZXIuYWRkQXRvbU1hdGNoZXIoc3RvcEF0b21NYXRjaGVyKTsKKworICAgICAgICAvLyBBZGQgUHJlZGljYXRlJ3MuCisgICAgICAgIFNpbXBsZVByZWRpY2F0ZSBzaW1wbGVQcmVkaWNhdGUgPSBTaW1wbGVQcmVkaWNhdGUubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldFN0YXJ0KEFQUF9CUkVBRENSVU1CX1JFUE9SVEVEX0FfTUFUQ0hfU1RBUlRfSUQpCisgICAgICAgICAgICAgICAgLnNldFN0b3AoQVBQX0JSRUFEQ1JVTUJfUkVQT1JURURfQV9NQVRDSF9TVE9QX0lEKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICBQcmVkaWNhdGUgcHJlZGljYXRlID0gUHJlZGljYXRlLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJZChNZXRyaWNzVXRpbHMuU3RyaW5nVG9JZCgiUHJlZGljYXRlIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFNpbXBsZVByZWRpY2F0ZShzaW1wbGVQcmVkaWNhdGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIGJ1aWxkZXIuYWRkUHJlZGljYXRlKHByZWRpY2F0ZSk7CisKKyAgICAgICAgLy8gQWRkIER1cmF0aW9uTWV0cmljLgorICAgICAgICBidWlsZGVyLmFkZER1cmF0aW9uTWV0cmljKAorICAgICAgICAgICAgU3RhdHNkQ29uZmlnUHJvdG8uRHVyYXRpb25NZXRyaWMubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldElkKE1ldHJpY3NVdGlscy5EVVJBVElPTl9NRVRSSUNfSUQpCisgICAgICAgICAgICAgICAgLnNldFdoYXQocHJlZGljYXRlLmdldElkKCkpCisgICAgICAgICAgICAgICAgLnNldEFnZ3JlZ2F0aW9uVHlwZShTdGF0c2RDb25maWdQcm90by5EdXJhdGlvbk1ldHJpYy5BZ2dyZWdhdGlvblR5cGUuU1VNKQorICAgICAgICAgICAgICAgIC5zZXRCdWNrZXQoU3RhdHNkQ29uZmlnUHJvdG8uVGltZVVuaXQuQ1RTKSk7CisKKyAgICAgICAgLy8gVXBsb2FkIGNvbmZpZy4KKyAgICAgICAgdXBsb2FkQ29uZmlnKGJ1aWxkZXIpOworCisgICAgICAgIC8vIENyZWF0ZSBBcHBCcmVhZGNydW1iUmVwb3J0ZWQgU3RhcnQvU3RvcCBldmVudHMuCisgICAgICAgIGRvQXBwQnJlYWRjcnVtYlJlcG9ydGVkU3RhcnQoMSk7CisgICAgICAgIFRocmVhZC5zbGVlcCgyMDAwKTsKKyAgICAgICAgZG9BcHBCcmVhZGNydW1iUmVwb3J0ZWRTdG9wKDEpOworCisgICAgICAgIC8vIFdhaXQgZm9yIHRoZSBtZXRyaWNzIHRvIHByb3BhZ2F0ZSB0byBzdGF0c2QuCisgICAgICAgIFRocmVhZC5zbGVlcCgyMDAwKTsKKworICAgICAgICBTdGF0c0xvZ1JlcG9ydCBtZXRyaWNSZXBvcnQgPSBnZXRTdGF0c0xvZ1JlcG9ydCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWV0cmljc1V0aWxzLkRVUkFUSU9OX01FVFJJQ19JRCwgbWV0cmljUmVwb3J0LmdldE1ldHJpY0lkKCkpOworICAgICAgICBhc3NlcnRUcnVlKG1ldHJpY1JlcG9ydC5oYXNEdXJhdGlvbk1ldHJpY3MoKSk7CisgICAgICAgIFN0YXRzTG9nUmVwb3J0LkR1cmF0aW9uTWV0cmljRGF0YVdyYXBwZXIgZHVyYXRpb25EYXRhCisgICAgICAgICAgICAgICAgPSBtZXRyaWNSZXBvcnQuZ2V0RHVyYXRpb25NZXRyaWNzKCk7CisgICAgICAgIGFzc2VydFRydWUoZHVyYXRpb25EYXRhLmdldERhdGFDb3VudCgpID09IDEpOworICAgICAgICBhc3NlcnRUcnVlKGR1cmF0aW9uRGF0YS5nZXREYXRhKDApLmdldEJ1Y2tldEluZm8oMCkuZ2V0RHVyYXRpb25OYW5vcygpID4gMCk7CisgICAgICAgIGFzc2VydFRydWUoZHVyYXRpb25EYXRhLmdldERhdGEoMCkuZ2V0QnVja2V0SW5mbygwKS5nZXREdXJhdGlvbk5hbm9zKCkgPCAxZTEwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RHVyYXRpb25NZXRyaWNXaXRoRGltZW5zaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChzdGF0c2REaXNhYmxlZCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gQWRkIEF0b21NYXRjaGVyJ3MuCisgICAgICAgIEF0b21NYXRjaGVyIHN0YXJ0QXRvbU1hdGNoZXJBID0KKyAgICAgICAgICAgIE1ldHJpY3NVdGlscy5zdGFydEF0b21NYXRjaGVyKEFQUF9CUkVBRENSVU1CX1JFUE9SVEVEX0FfTUFUQ0hfU1RBUlRfSUQpOworICAgICAgICBBdG9tTWF0Y2hlciBzdG9wQXRvbU1hdGNoZXJBID0KKyAgICAgICAgICAgIE1ldHJpY3NVdGlscy5zdG9wQXRvbU1hdGNoZXIoQVBQX0JSRUFEQ1JVTUJfUkVQT1JURURfQV9NQVRDSF9TVE9QX0lEKTsKKyAgICAgICAgQXRvbU1hdGNoZXIgc3RhcnRBdG9tTWF0Y2hlckIgPQorICAgICAgICAgICAgTWV0cmljc1V0aWxzLnN0YXJ0QXRvbU1hdGNoZXIoQVBQX0JSRUFEQ1JVTUJfUkVQT1JURURfQl9NQVRDSF9TVEFSVF9JRCk7CisgICAgICAgIEF0b21NYXRjaGVyIHN0b3BBdG9tTWF0Y2hlckIgPQorICAgICAgICAgICAgTWV0cmljc1V0aWxzLnN0b3BBdG9tTWF0Y2hlcihBUFBfQlJFQURDUlVNQl9SRVBPUlRFRF9CX01BVENIX1NUT1BfSUQpOworCisgICAgICAgIFN0YXRzZENvbmZpZ1Byb3RvLlN0YXRzZENvbmZpZy5CdWlsZGVyIGJ1aWxkZXIgPSBjcmVhdGVDb25maWdCdWlsZGVyKCk7CisgICAgICAgIGJ1aWxkZXIuYWRkQXRvbU1hdGNoZXIoc3RhcnRBdG9tTWF0Y2hlckEpOworICAgICAgICBidWlsZGVyLmFkZEF0b21NYXRjaGVyKHN0b3BBdG9tTWF0Y2hlckEpOworICAgICAgICBidWlsZGVyLmFkZEF0b21NYXRjaGVyKHN0YXJ0QXRvbU1hdGNoZXJCKTsKKyAgICAgICAgYnVpbGRlci5hZGRBdG9tTWF0Y2hlcihzdG9wQXRvbU1hdGNoZXJCKTsKKworICAgICAgICAvLyBBZGQgUHJlZGljYXRlJ3MuCisgICAgICAgIFNpbXBsZVByZWRpY2F0ZSBzaW1wbGVQcmVkaWNhdGVBID0gU2ltcGxlUHJlZGljYXRlLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRTdGFydChBUFBfQlJFQURDUlVNQl9SRVBPUlRFRF9BX01BVENIX1NUQVJUX0lEKQorICAgICAgICAgICAgICAgIC5zZXRTdG9wKEFQUF9CUkVBRENSVU1CX1JFUE9SVEVEX0FfTUFUQ0hfU1RPUF9JRCkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgUHJlZGljYXRlIHByZWRpY2F0ZUEgPSBQcmVkaWNhdGUubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJZChNZXRyaWNzVXRpbHMuU3RyaW5nVG9JZCgiUHJlZGljYXRlX0EiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFNpbXBsZVByZWRpY2F0ZShzaW1wbGVQcmVkaWNhdGVBKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgYnVpbGRlci5hZGRQcmVkaWNhdGUocHJlZGljYXRlQSk7CisKKyAgICAgICAgRmllbGRNYXRjaGVyLkJ1aWxkZXIgZGltZW5zaW9uc0J1aWxkZXIgPSBGaWVsZE1hdGNoZXIubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldEZpZWxkKEFwcEJyZWFkY3J1bWJSZXBvcnRlZC5TVEFURV9GSUVMRF9OVU1CRVIpOworICAgICAgICBkaW1lbnNpb25zQnVpbGRlci5hZGRDaGlsZChGaWVsZE1hdGNoZXIubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldEZpZWxkKEFwcEJyZWFkY3J1bWJSZXBvcnRlZC5MQUJFTF9GSUVMRF9OVU1CRVIpCisgICAgICAgICAgICAgICAgLnNldFBvc2l0aW9uKFBvc2l0aW9uLkZJUlNUKQorICAgICAgICAgICAgICAgIC5hZGRDaGlsZChGaWVsZE1hdGNoZXIubmV3QnVpbGRlcigpLnNldEZpZWxkKAorICAgICAgICAgICAgICAgICAgICAgICAgQXBwQnJlYWRjcnVtYlJlcG9ydGVkLkxBQkVMX0ZJRUxEX05VTUJFUikpKTsKKyAgICAgICAgUHJlZGljYXRlIHByZWRpY2F0ZUIgPQorICAgICAgICAgICAgUHJlZGljYXRlLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRJZChNZXRyaWNzVXRpbHMuU3RyaW5nVG9JZCgiUHJlZGljYXRlX0IiKSkKKyAgICAgICAgICAgICAgICAuc2V0U2ltcGxlUHJlZGljYXRlKFNpbXBsZVByZWRpY2F0ZS5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0U3RhcnQoQVBQX0JSRUFEQ1JVTUJfUkVQT1JURURfQl9NQVRDSF9TVEFSVF9JRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0U3RvcChBUFBfQlJFQURDUlVNQl9SRVBPUlRFRF9CX01BVENIX1NUT1BfSUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldERpbWVuc2lvbnMoZGltZW5zaW9uc0J1aWxkZXIuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgYnVpbGRlci5hZGRQcmVkaWNhdGUocHJlZGljYXRlQik7CisKKyAgICAgICAgLy8gQWRkIER1cmF0aW9uTWV0cmljLgorICAgICAgICBidWlsZGVyLmFkZER1cmF0aW9uTWV0cmljKAorICAgICAgICAgICAgU3RhdHNkQ29uZmlnUHJvdG8uRHVyYXRpb25NZXRyaWMubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldElkKE1ldHJpY3NVdGlscy5EVVJBVElPTl9NRVRSSUNfSUQpCisgICAgICAgICAgICAgICAgLnNldFdoYXQocHJlZGljYXRlQi5nZXRJZCgpKQorICAgICAgICAgICAgICAgIC5zZXRDb25kaXRpb24ocHJlZGljYXRlQS5nZXRJZCgpKQorICAgICAgICAgICAgICAgIC5zZXRBZ2dyZWdhdGlvblR5cGUoU3RhdHNkQ29uZmlnUHJvdG8uRHVyYXRpb25NZXRyaWMuQWdncmVnYXRpb25UeXBlLlNVTSkKKyAgICAgICAgICAgICAgICAuc2V0QnVja2V0KFN0YXRzZENvbmZpZ1Byb3RvLlRpbWVVbml0LkNUUykKKyAgICAgICAgICAgICAgICAuc2V0RGltZW5zaW9uc0luV2hhdCgKKyAgICAgICAgICAgICAgICAgICAgRmllbGRNYXRjaGVyLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKEF0b20uQkFUVEVSWV9TQVZFUl9NT0RFX1NUQVRFX0NIQU5HRURfRklFTERfTlVNQkVSKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENoaWxkKEZpZWxkTWF0Y2hlci5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKEFwcEJyZWFkY3J1bWJSZXBvcnRlZC5TVEFURV9GSUVMRF9OVU1CRVIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQb3NpdGlvbihQb3NpdGlvbi5GSVJTVCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENoaWxkKEZpZWxkTWF0Y2hlci5uZXdCdWlsZGVyKCkuc2V0RmllbGQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcHBCcmVhZGNydW1iUmVwb3J0ZWQuTEFCRUxfRklFTERfTlVNQkVSKSkpKSk7CisKKyAgICAgICAgLy8gVXBsb2FkIGNvbmZpZy4KKyAgICAgICAgdXBsb2FkQ29uZmlnKGJ1aWxkZXIpOworCisgICAgICAgIC8vIFRyaWdnZXIgZXZlbnRzLgorICAgICAgICBkb0FwcEJyZWFkY3J1bWJSZXBvcnRlZFN0YXJ0KDEpOworICAgICAgICBUaHJlYWQuc2xlZXAoMjAwMCk7CisgICAgICAgIGRvQXBwQnJlYWRjcnVtYlJlcG9ydGVkU3RhcnQoMik7CisgICAgICAgIFRocmVhZC5zbGVlcCgyMDAwKTsKKyAgICAgICAgZG9BcHBCcmVhZGNydW1iUmVwb3J0ZWRTdG9wKDEpOworICAgICAgICBUaHJlYWQuc2xlZXAoMjAwMCk7CisgICAgICAgIGRvQXBwQnJlYWRjcnVtYlJlcG9ydGVkU3RvcCgyKTsKKworICAgICAgICAvLyBXYWl0IGZvciB0aGUgbWV0cmljcyB0byBwcm9wYWdhdGUgdG8gc3RhdHNkLgorICAgICAgICBUaHJlYWQuc2xlZXAoMjAwMCk7CisKKyAgICAgICAgU3RhdHNMb2dSZXBvcnQgbWV0cmljUmVwb3J0ID0gZ2V0U3RhdHNMb2dSZXBvcnQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1ldHJpY3NVdGlscy5EVVJBVElPTl9NRVRSSUNfSUQsIG1ldHJpY1JlcG9ydC5nZXRNZXRyaWNJZCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtZXRyaWNSZXBvcnQuaGFzRHVyYXRpb25NZXRyaWNzKCkpOworICAgICAgICBTdGF0c0xvZ1JlcG9ydC5EdXJhdGlvbk1ldHJpY0RhdGFXcmFwcGVyIGR1cmF0aW9uRGF0YQorICAgICAgICAgICAgICAgID0gbWV0cmljUmVwb3J0LmdldER1cmF0aW9uTWV0cmljcygpOworICAgICAgICBhc3NlcnRUcnVlKGR1cmF0aW9uRGF0YS5nZXREYXRhQ291bnQoKSA9PSAxKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkdXJhdGlvbkRhdGEuZ2V0RGF0YSgwKS5nZXRCdWNrZXRJbmZvTGlzdCgpLnNpemUoKSA+IDEpOworICAgICAgICBmb3IgKER1cmF0aW9uQnVja2V0SW5mbyBidWNrZXRJbmZvIDogZHVyYXRpb25EYXRhLmdldERhdGEoMCkuZ2V0QnVja2V0SW5mb0xpc3QoKSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShidWNrZXRJbmZvLmdldER1cmF0aW9uTmFub3MoKSA+IDApOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShidWNrZXRJbmZvLmdldER1cmF0aW9uTmFub3MoKSA8IDFlMTApOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zdGF0c2Qvc3JjL2FuZHJvaWQvY3RzL3N0YXRzZC9tZXRyaWMvR2F1Z2VNZXRyaWNzVGVzdHMuamF2YSBiL2hvc3RzaWRldGVzdHMvc3RhdHNkL3NyYy9hbmRyb2lkL2N0cy9zdGF0c2QvbWV0cmljL0dhdWdlTWV0cmljc1Rlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJjNWE5YgotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvc3RhdHNkL3NyYy9hbmRyb2lkL2N0cy9zdGF0c2QvbWV0cmljL0dhdWdlTWV0cmljc1Rlc3RzLmphdmEKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLmN0cy5zdGF0c2QubWV0cmljOworCitpbXBvcnQgYW5kcm9pZC5jdHMuc3RhdHNkLmF0b20uRGV2aWNlQXRvbVRlc3RDYXNlOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuU3RhdHNkQ29uZmlnUHJvdG87CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuU3RhdHNkQ29uZmlnUHJvdG8uQXRvbU1hdGNoZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuU3RhdHNkQ29uZmlnUHJvdG8uRmllbGRGaWx0ZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuU3RhdHNkQ29uZmlnUHJvdG8uRmllbGRNYXRjaGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLm9zLlN0YXRzZENvbmZpZ1Byb3RvLkZpZWxkVmFsdWVNYXRjaGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLm9zLlN0YXRzZENvbmZpZ1Byb3RvLlByZWRpY2F0ZTsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5vcy5TdGF0c2RDb25maWdQcm90by5TaW1wbGVBdG9tTWF0Y2hlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5vcy5TdGF0c2RDb25maWdQcm90by5TaW1wbGVQcmVkaWNhdGU7CitpbXBvcnQgY29tLmFuZHJvaWQub3MuQXRvbXNQcm90by5BcHBCcmVhZGNydW1iUmVwb3J0ZWQ7CitpbXBvcnQgY29tLmFuZHJvaWQub3MuQXRvbXNQcm90by5BdG9tOworaW1wb3J0IGNvbS5hbmRyb2lkLm9zLlN0YXRzTG9nLkdhdWdlTWV0cmljRGF0YTsKK2ltcG9ydCBjb20uYW5kcm9pZC5vcy5TdGF0c0xvZy5TdGF0c0xvZ1JlcG9ydDsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5sb2cuTG9nVXRpbDsKKworcHVibGljIGNsYXNzIEdhdWdlTWV0cmljc1Rlc3RzIGV4dGVuZHMgRGV2aWNlQXRvbVRlc3RDYXNlIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVBQX0JSRUFEQ1JVTUJfUkVQT1JURURfQV9NQVRDSF9TVEFSVF9JRCA9IDA7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBUFBfQlJFQURDUlVNQl9SRVBPUlRFRF9BX01BVENIX1NUT1BfSUQgPSAxOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVBQX0JSRUFEQ1JVTUJfUkVQT1JURURfQl9NQVRDSF9TVEFSVF9JRCA9IDI7CisKKyAgcHVibGljIHZvaWQgdGVzdEdhdWdlTWV0cmljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgaWYgKHN0YXRzZERpc2FibGVkKCkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gQWRkIEF0b21NYXRjaGVyJ3MuCisgICAgQXRvbU1hdGNoZXIgc3RhcnRBdG9tTWF0Y2hlciA9CisgICAgICAgIE1ldHJpY3NVdGlscy5zdGFydEF0b21NYXRjaGVyKEFQUF9CUkVBRENSVU1CX1JFUE9SVEVEX0FfTUFUQ0hfU1RBUlRfSUQpOworICAgIEF0b21NYXRjaGVyIHN0b3BBdG9tTWF0Y2hlciA9CisgICAgICAgIE1ldHJpY3NVdGlscy5zdG9wQXRvbU1hdGNoZXIoQVBQX0JSRUFEQ1JVTUJfUkVQT1JURURfQV9NQVRDSF9TVE9QX0lEKTsKKyAgICBBdG9tTWF0Y2hlciBhdG9tTWF0Y2hlciA9CisgICAgICAgIE1ldHJpY3NVdGlscy5zaW1wbGVBdG9tTWF0Y2hlcihBUFBfQlJFQURDUlVNQl9SRVBPUlRFRF9CX01BVENIX1NUQVJUX0lEKTsKKworICAgIFN0YXRzZENvbmZpZ1Byb3RvLlN0YXRzZENvbmZpZy5CdWlsZGVyIGJ1aWxkZXIgPSBjcmVhdGVDb25maWdCdWlsZGVyKCk7CisgICAgYnVpbGRlci5hZGRBdG9tTWF0Y2hlcihzdGFydEF0b21NYXRjaGVyKTsKKyAgICBidWlsZGVyLmFkZEF0b21NYXRjaGVyKHN0b3BBdG9tTWF0Y2hlcik7CisgICAgYnVpbGRlci5hZGRBdG9tTWF0Y2hlcihhdG9tTWF0Y2hlcik7CisKKyAgICAvLyBBZGQgUHJlZGljYXRlJ3MuCisgICAgU2ltcGxlUHJlZGljYXRlIHNpbXBsZVByZWRpY2F0ZSA9IFNpbXBsZVByZWRpY2F0ZS5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTdGFydChBUFBfQlJFQURDUlVNQl9SRVBPUlRFRF9BX01BVENIX1NUQVJUX0lEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFN0b3AoQVBQX0JSRUFEQ1JVTUJfUkVQT1JURURfQV9NQVRDSF9TVE9QX0lEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgUHJlZGljYXRlIHByZWRpY2F0ZSA9IFByZWRpY2F0ZS5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJZChNZXRyaWNzVXRpbHMuU3RyaW5nVG9JZCgiUHJlZGljYXRlIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0U2ltcGxlUHJlZGljYXRlKHNpbXBsZVByZWRpY2F0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgIGJ1aWxkZXIuYWRkUHJlZGljYXRlKHByZWRpY2F0ZSk7CisKKyAgICAvLyBBZGQgR2F1Z2VNZXRyaWMuCisgICAgRmllbGRNYXRjaGVyIGZpZWxkTWF0Y2hlciA9CisgICAgICAgIEZpZWxkTWF0Y2hlci5uZXdCdWlsZGVyKCkuc2V0RmllbGQoQVBQX0JSRUFEQ1JVTUJfUkVQT1JURURfQl9NQVRDSF9TVEFSVF9JRCkuYnVpbGQoKTsKKyAgICBidWlsZGVyLmFkZEdhdWdlTWV0cmljKAorICAgICAgICBTdGF0c2RDb25maWdQcm90by5HYXVnZU1ldHJpYy5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgIC5zZXRJZChNZXRyaWNzVXRpbHMuR0FVR0VfTUVUUklDX0lEKQorICAgICAgICAgICAgLnNldFdoYXQoQVBQX0JSRUFEQ1JVTUJfUkVQT1JURURfQl9NQVRDSF9TVEFSVF9JRCkKKyAgICAgICAgICAgIC5zZXRDb25kaXRpb24ocHJlZGljYXRlLmdldElkKCkpCisgICAgICAgICAgICAuc2V0R2F1Z2VGaWVsZHNGaWx0ZXIoCisgICAgICAgICAgICAgICAgRmllbGRGaWx0ZXIubmV3QnVpbGRlcigpLnNldEluY2x1ZGVBbGwoZmFsc2UpLnNldEZpZWxkcyhmaWVsZE1hdGNoZXIpLmJ1aWxkKCkpCisgICAgICAgICAgICAuc2V0RGltZW5zaW9uc0luV2hhdCgKKyAgICAgICAgICAgICAgICBGaWVsZE1hdGNoZXIubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChBUFBfQlJFQURDUlVNQl9SRVBPUlRFRF9CX01BVENIX1NUQVJUX0lEKQorICAgICAgICAgICAgICAgICAgICAuYWRkQ2hpbGQoRmllbGRNYXRjaGVyLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChBcHBCcmVhZGNydW1iUmVwb3J0ZWQuU1RBVEVfRklFTERfTlVNQkVSKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgICAgIC5zZXRCdWNrZXQoU3RhdHNkQ29uZmlnUHJvdG8uVGltZVVuaXQuQ1RTKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgLy8gVXBsb2FkIGNvbmZpZy4KKyAgICB1cGxvYWRDb25maWcoYnVpbGRlcik7CisKKyAgICAvLyBDcmVhdGUgQXBwQnJlYWRjcnVtYlJlcG9ydGVkIFN0YXJ0L1N0b3AgZXZlbnRzLgorICAgIGRvQXBwQnJlYWRjcnVtYlJlcG9ydGVkU3RhcnQoMCk7CisgICAgVGhyZWFkLnNsZWVwKDEwKTsKKyAgICBkb0FwcEJyZWFkY3J1bWJSZXBvcnRlZFN0YXJ0KDEpOworICAgIFRocmVhZC5zbGVlcCgxMCk7CisgICAgZG9BcHBCcmVhZGNydW1iUmVwb3J0ZWRTdGFydCgyKTsKKyAgICBUaHJlYWQuc2xlZXAoMjAwMCk7CisgICAgZG9BcHBCcmVhZGNydW1iUmVwb3J0ZWRTdG9wKDIpOworICAgIFRocmVhZC5zbGVlcCgxMCk7CisgICAgZG9BcHBCcmVhZGNydW1iUmVwb3J0ZWRTdG9wKDApOworICAgIFRocmVhZC5zbGVlcCgxMCk7CisgICAgZG9BcHBCcmVhZGNydW1iUmVwb3J0ZWRTdG9wKDEpOworICAgIGRvQXBwQnJlYWRjcnVtYlJlcG9ydGVkU3RhcnQoMik7CisgICAgVGhyZWFkLnNsZWVwKDEwKTsKKyAgICBkb0FwcEJyZWFkY3J1bWJSZXBvcnRlZFN0YXJ0KDEpOworICAgIFRocmVhZC5zbGVlcCgyMDAwKTsKKyAgICBkb0FwcEJyZWFkY3J1bWJSZXBvcnRlZFN0b3AoMik7CisgICAgVGhyZWFkLnNsZWVwKDEwKTsKKyAgICBkb0FwcEJyZWFkY3J1bWJSZXBvcnRlZFN0b3AoMSk7CisKKyAgICAvLyBXYWl0IGZvciB0aGUgbWV0cmljcyB0byBwcm9wYWdhdGUgdG8gc3RhdHNkLgorICAgIFRocmVhZC5zbGVlcCgyMDAwKTsKKworICAgIFN0YXRzTG9nUmVwb3J0IG1ldHJpY1JlcG9ydCA9IGdldFN0YXRzTG9nUmVwb3J0KCk7CisgICAgTG9nVXRpbC5DTG9nLmQoIkdvdCB0aGUgZm9sbG93aW5nIGdhdWdlIG1ldHJpYyBkYXRhOiAiICsgbWV0cmljUmVwb3J0LnRvU3RyaW5nKCkpOworICAgIGFzc2VydEVxdWFscyhNZXRyaWNzVXRpbHMuR0FVR0VfTUVUUklDX0lELCBtZXRyaWNSZXBvcnQuZ2V0TWV0cmljSWQoKSk7CisgICAgYXNzZXJ0VHJ1ZShtZXRyaWNSZXBvcnQuaGFzR2F1Z2VNZXRyaWNzKCkpOworICAgIFN0YXRzTG9nUmVwb3J0LkdhdWdlTWV0cmljRGF0YVdyYXBwZXIgZ2F1Z2VEYXRhID0gbWV0cmljUmVwb3J0LmdldEdhdWdlTWV0cmljcygpOworICAgIGFzc2VydEVxdWFscyhnYXVnZURhdGEuZ2V0RGF0YUNvdW50KCksIDEpOworCisgICAgaW50IGJ1Y2tldENvdW50ID0gZ2F1Z2VEYXRhLmdldERhdGEoMCkuZ2V0QnVja2V0SW5mb0NvdW50KCk7CisgICAgR2F1Z2VNZXRyaWNEYXRhIGRhdGEgPSBnYXVnZURhdGEuZ2V0RGF0YSgwKTsKKyAgICBhc3NlcnRUcnVlKGJ1Y2tldENvdW50ID4gMik7CisgICAgTWV0cmljc1V0aWxzLmFzc2VydEJ1Y2tldFRpbWVQcmVzZW50KGRhdGEuZ2V0QnVja2V0SW5mbygwKSk7CisgICAgYXNzZXJ0RXF1YWxzKGRhdGEuZ2V0QnVja2V0SW5mbygwKS5nZXRBdG9tQ291bnQoKSwgMSk7CisgICAgYXNzZXJ0RXF1YWxzKGRhdGEuZ2V0QnVja2V0SW5mbygwKS5nZXRBdG9tKDApLmdldEFwcEJyZWFkY3J1bWJSZXBvcnRlZCgpLmdldExhYmVsKCksIDApOworICAgIGFzc2VydEVxdWFscyhkYXRhLmdldEJ1Y2tldEluZm8oMCkuZ2V0QXRvbSgwKS5nZXRBcHBCcmVhZGNydW1iUmVwb3J0ZWQoKS5nZXRTdGF0ZSgpLAorICAgICAgICBBcHBCcmVhZGNydW1iUmVwb3J0ZWQuU3RhdGUuU1RBUlQpOworCisgICAgTWV0cmljc1V0aWxzLmFzc2VydEJ1Y2tldFRpbWVQcmVzZW50KGRhdGEuZ2V0QnVja2V0SW5mbygxKSk7CisgICAgYXNzZXJ0RXF1YWxzKGRhdGEuZ2V0QnVja2V0SW5mbygxKS5nZXRBdG9tQ291bnQoKSwgMSk7CisKKyAgICBNZXRyaWNzVXRpbHMuYXNzZXJ0QnVja2V0VGltZVByZXNlbnQoZGF0YS5nZXRCdWNrZXRJbmZvKGJ1Y2tldENvdW50LTEpKTsKKyAgICBhc3NlcnRFcXVhbHMoZGF0YS5nZXRCdWNrZXRJbmZvKGJ1Y2tldENvdW50IC0gMSkuZ2V0QXRvbUNvdW50KCksIDEpOworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgZGF0YS5nZXRCdWNrZXRJbmZvKGJ1Y2tldENvdW50IC0gMSkuZ2V0QXRvbSgwKS5nZXRBcHBCcmVhZGNydW1iUmVwb3J0ZWQoKS5nZXRMYWJlbCgpLCAyKTsKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgIGRhdGEuZ2V0QnVja2V0SW5mbyhidWNrZXRDb3VudCAtIDEpLmdldEF0b20oMCkuZ2V0QXBwQnJlYWRjcnVtYlJlcG9ydGVkKCkuZ2V0U3RhdGUoKSwKKyAgICAgICAgQXBwQnJlYWRjcnVtYlJlcG9ydGVkLlN0YXRlLlNUT1ApOworICB9Cit9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3N0YXRzZC9zcmMvYW5kcm9pZC9jdHMvc3RhdHNkL21ldHJpYy9NZXRyaWNzVXRpbHMuamF2YSBiL2hvc3RzaWRldGVzdHMvc3RhdHNkL3NyYy9hbmRyb2lkL2N0cy9zdGF0c2QvbWV0cmljL01ldHJpY3NVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NWVhYzkKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL3N0YXRzZC9zcmMvYW5kcm9pZC9jdHMvc3RhdHNkL21ldHJpYy9NZXRyaWNzVXRpbHMuamF2YQpAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQuY3RzLnN0YXRzZC5tZXRyaWM7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5vcy5TdGF0c2RDb25maWdQcm90bzsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5vcy5TdGF0c2RDb25maWdQcm90by5BdG9tTWF0Y2hlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5vcy5TdGF0c2RDb25maWdQcm90by5GaWVsZFZhbHVlTWF0Y2hlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5vcy5TdGF0c2RDb25maWdQcm90by5TaW1wbGVBdG9tTWF0Y2hlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5vcy5BdG9tc1Byb3RvLkF0b207CitpbXBvcnQgY29tLmFuZHJvaWQub3MuQXRvbXNQcm90by5BcHBCcmVhZGNydW1iUmVwb3J0ZWQ7CitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlOworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRGVzY3JpcHRvcjsKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvcjsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK3B1YmxpYyBjbGFzcyBNZXRyaWNzVXRpbHMgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBDT1VOVF9NRVRSSUNfSUQgPSAzMzMzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBEVVJBVElPTl9NRVRSSUNfSUQgPSA0NDQ0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBHQVVHRV9NRVRSSUNfSUQgPSA1NTU1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBWQUxVRV9NRVRSSUNfSUQgPSA2NjY2OworCisgICAgcHVibGljIHN0YXRpYyBBdG9tTWF0Y2hlci5CdWlsZGVyIGdldEF0b21NYXRjaGVyKGludCBhdG9tSWQpIHsKKyAgICAgICAgQXRvbU1hdGNoZXIuQnVpbGRlciBidWlsZGVyID0gQXRvbU1hdGNoZXIubmV3QnVpbGRlcigpOworICAgICAgICBidWlsZGVyLnNldFNpbXBsZUF0b21NYXRjaGVyKFNpbXBsZUF0b21NYXRjaGVyLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEF0b21JZChhdG9tSWQpKTsKKyAgICAgICAgcmV0dXJuIGJ1aWxkZXI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBBdG9tTWF0Y2hlciBzdGFydEF0b21NYXRjaGVyKGludCBpZCkgeworICAgICAgcmV0dXJuIEF0b21NYXRjaGVyLm5ld0J1aWxkZXIoKQorICAgICAgICAgIC5zZXRJZChpZCkKKyAgICAgICAgICAuc2V0U2ltcGxlQXRvbU1hdGNoZXIoCisgICAgICAgICAgICAgIFNpbXBsZUF0b21NYXRjaGVyLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgLnNldEF0b21JZChBdG9tLkFQUF9CUkVBRENSVU1CX1JFUE9SVEVEX0ZJRUxEX05VTUJFUikKKyAgICAgICAgICAgICAgICAgIC5hZGRGaWVsZFZhbHVlTWF0Y2hlcihGaWVsZFZhbHVlTWF0Y2hlci5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKEFwcEJyZWFkY3J1bWJSZXBvcnRlZC5TVEFURV9GSUVMRF9OVU1CRVIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRFcUludChBcHBCcmVhZGNydW1iUmVwb3J0ZWQuU3RhdGUuU1RBUlQub3JkaW5hbCgpKSkpCisgICAgICAgICAgLmJ1aWxkKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBBdG9tTWF0Y2hlciBzdG9wQXRvbU1hdGNoZXIoaW50IGlkKSB7CisgICAgICByZXR1cm4gQXRvbU1hdGNoZXIubmV3QnVpbGRlcigpCisgICAgICAgICAgLnNldElkKGlkKQorICAgICAgICAgIC5zZXRTaW1wbGVBdG9tTWF0Y2hlcigKKyAgICAgICAgICAgICAgU2ltcGxlQXRvbU1hdGNoZXIubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAuc2V0QXRvbUlkKEF0b20uQVBQX0JSRUFEQ1JVTUJfUkVQT1JURURfRklFTERfTlVNQkVSKQorICAgICAgICAgICAgICAgICAgLmFkZEZpZWxkVmFsdWVNYXRjaGVyKEZpZWxkVmFsdWVNYXRjaGVyLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoQXBwQnJlYWRjcnVtYlJlcG9ydGVkLlNUQVRFX0ZJRUxEX05VTUJFUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEVxSW50KEFwcEJyZWFkY3J1bWJSZXBvcnRlZC5TdGF0ZS5TVE9QLm9yZGluYWwoKSkpKQorICAgICAgICAgIC5idWlsZCgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQXRvbU1hdGNoZXIgdW5zcGVjaWZpZWRBdG9tTWF0Y2hlcihpbnQgaWQpIHsKKyAgICAgICAgcmV0dXJuIEF0b21NYXRjaGVyLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRJZChpZCkKKyAgICAgICAgICAgICAgICAuc2V0U2ltcGxlQXRvbU1hdGNoZXIoU2ltcGxlQXRvbU1hdGNoZXIubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0QXRvbUlkKEF0b20uQVBQX0JSRUFEQ1JVTUJfUkVQT1JURURfRklFTERfTlVNQkVSKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFkZEZpZWxkVmFsdWVNYXRjaGVyKEZpZWxkVmFsdWVNYXRjaGVyLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoQXBwQnJlYWRjcnVtYlJlcG9ydGVkLlNUQVRFX0ZJRUxEX05VTUJFUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEVxSW50KEFwcEJyZWFkY3J1bWJSZXBvcnRlZC5TdGF0ZS5VTlNQRUNJRklFRC5vcmRpbmFsKCkpKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEF0b21NYXRjaGVyIHNpbXBsZUF0b21NYXRjaGVyKGludCBpZCkgeworICAgICAgcmV0dXJuIEF0b21NYXRjaGVyLm5ld0J1aWxkZXIoKQorICAgICAgICAgIC5zZXRJZChpZCkKKyAgICAgICAgICAuc2V0U2ltcGxlQXRvbU1hdGNoZXIoCisgICAgICAgICAgICAgIFNpbXBsZUF0b21NYXRjaGVyLm5ld0J1aWxkZXIoKS5zZXRBdG9tSWQoQXRvbS5BUFBfQlJFQURDUlVNQl9SRVBPUlRFRF9GSUVMRF9OVU1CRVIpKQorICAgICAgICAgIC5idWlsZCgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBTdHJpbmdUb0lkKFN0cmluZyBzdHIpIHsKKyAgICAgIHJldHVybiBzdHIuaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0QnVja2V0VGltZVByZXNlbnQoTWVzc2FnZSBidWNrZXRJbmZvKSB7CisgICAgICAgIERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGJ1Y2tldEluZm8uZ2V0RGVzY3JpcHRvckZvclR5cGUoKTsKKyAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworICAgICAgICBGaWVsZERlc2NyaXB0b3IgYnVja2V0TnVtID0gZGVzY3JpcHRvci5maW5kRmllbGRCeU5hbWUoImJ1Y2tldF9udW0iKTsKKyAgICAgICAgRmllbGREZXNjcmlwdG9yIHN0YXJ0TWlsbGlzID0gZGVzY3JpcHRvci5maW5kRmllbGRCeU5hbWUoInN0YXJ0X2J1Y2tldF9lbGFwc2VkX21pbGxpcyIpOworICAgICAgICBGaWVsZERlc2NyaXB0b3IgZW5kTWlsbGlzID0gZGVzY3JpcHRvci5maW5kRmllbGRCeU5hbWUoImVuZF9idWNrZXRfZWxhcHNlZF9taWxsaXMiKTsKKyAgICAgICAgaWYgKGJ1Y2tldE51bSAhPSBudWxsICYmIGJ1Y2tldEluZm8uaGFzRmllbGQoYnVja2V0TnVtKSkgeworICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0TWlsbGlzICE9IG51bGwgJiYgYnVja2V0SW5mby5oYXNGaWVsZChzdGFydE1pbGxpcykgJiYKKyAgICAgICAgICAgICAgICAgICBlbmRNaWxsaXMgIT0gbnVsbCAmJiBidWNrZXRJbmZvLmhhc0ZpZWxkKGVuZE1pbGxpcykpIHsKKyAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKCJCdWNrZXQgaW5mbyBkaWQgbm90IGhhdmUgZWl0aGVyIGJ1Y2tldCBudW0gb3Igc3RhcnQgYW5kIGVuZCBlbGFwc2VkIG1pbGxpcyIsCisgICAgICAgICAgICAgICAgZm91bmQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc3RhdHNkL3NyYy9hbmRyb2lkL2N0cy9zdGF0c2QvbWV0cmljL1ZhbHVlTWV0cmljc1Rlc3RzLmphdmEgYi9ob3N0c2lkZXRlc3RzL3N0YXRzZC9zcmMvYW5kcm9pZC9jdHMvc3RhdHNkL21ldHJpYy9WYWx1ZU1ldHJpY3NUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNDBmZDIKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL3N0YXRzZC9zcmMvYW5kcm9pZC9jdHMvc3RhdHNkL21ldHJpYy9WYWx1ZU1ldHJpY3NUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMjgwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5jdHMuc3RhdHNkLm1ldHJpYzsKKworaW1wb3J0IGFuZHJvaWQuY3RzLnN0YXRzZC5hdG9tLkRldmljZUF0b21UZXN0Q2FzZTsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLm9zLlN0YXRzZENvbmZpZ1Byb3RvOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLm9zLlN0YXRzZENvbmZpZ1Byb3RvLkF0b21NYXRjaGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLm9zLlN0YXRzZENvbmZpZ1Byb3RvLkZpZWxkTWF0Y2hlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5vcy5TdGF0c2RDb25maWdQcm90by5WYWx1ZU1ldHJpYzsKK2ltcG9ydCBjb20uYW5kcm9pZC5vcy5BdG9tc1Byb3RvLkFwcEJyZWFkY3J1bWJSZXBvcnRlZDsKK2ltcG9ydCBjb20uYW5kcm9pZC5vcy5BdG9tc1Byb3RvLlN5c3RlbUVsYXBzZWRSZWFsdGltZTsKKworaW1wb3J0IGNvbS5hbmRyb2lkLm9zLkF0b21zUHJvdG8uQXRvbTsKK2ltcG9ydCBjb20uYW5kcm9pZC5vcy5TdGF0c0xvZy5WYWx1ZUJ1Y2tldEluZm87CitpbXBvcnQgY29tLmFuZHJvaWQub3MuU3RhdHNMb2cuVmFsdWVNZXRyaWNEYXRhOworaW1wb3J0IGNvbS5hbmRyb2lkLm9zLlN0YXRzTG9nLlN0YXRzTG9nUmVwb3J0OworaW1wb3J0IGNvbS5hbmRyb2lkLmFubm90YXRpb25zLk51bGxhYmxlOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLm9zLlN0YXRzZENvbmZpZ1Byb3RvLkF0b21NYXRjaGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLm9zLlN0YXRzZENvbmZpZ1Byb3RvLkV2ZW50TWV0cmljOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLm9zLlN0YXRzZENvbmZpZ1Byb3RvLkZpZWxkRmlsdGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLm9zLlN0YXRzZENvbmZpZ1Byb3RvLkZpZWxkTWF0Y2hlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5vcy5TdGF0c2RDb25maWdQcm90by5GaWVsZFZhbHVlTWF0Y2hlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5vcy5TdGF0c2RDb25maWdQcm90by5HYXVnZU1ldHJpYzsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5vcy5TdGF0c2RDb25maWdQcm90by5QcmVkaWNhdGU7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuU3RhdHNkQ29uZmlnUHJvdG8uU2ltcGxlQXRvbU1hdGNoZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuU3RhdHNkQ29uZmlnUHJvdG8uU2ltcGxlUHJlZGljYXRlOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLm9zLlN0YXRzZENvbmZpZ1Byb3RvLlN0YXRzZENvbmZpZzsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5vcy5TdGF0c2RDb25maWdQcm90by5UaW1lVW5pdDsKK2ltcG9ydCBjb20uYW5kcm9pZC5vcy5BdG9tc1Byb3RvLkF0b207CitpbXBvcnQgY29tLmFuZHJvaWQub3MuQXRvbXNQcm90by5BcHBCcmVhZGNydW1iUmVwb3J0ZWQ7CitpbXBvcnQgY29tLmFuZHJvaWQub3MuQXRvbXNQcm90by5TY3JlZW5TdGF0ZUNoYW5nZWQ7CitpbXBvcnQgY29tLmFuZHJvaWQub3MuU3RhdHNMb2cuQ29uZmlnTWV0cmljc1JlcG9ydDsKK2ltcG9ydCBjb20uYW5kcm9pZC5vcy5TdGF0c0xvZy5Db25maWdNZXRyaWNzUmVwb3J0TGlzdDsKK2ltcG9ydCBjb20uYW5kcm9pZC5vcy5TdGF0c0xvZy5FdmVudE1ldHJpY0RhdGE7CitpbXBvcnQgY29tLmFuZHJvaWQub3MuU3RhdHNMb2cuR2F1Z2VNZXRyaWNEYXRhOworaW1wb3J0IGNvbS5hbmRyb2lkLm9zLlN0YXRzTG9nLlN0YXRzTG9nUmVwb3J0OworaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmxvZy5Mb2dVdGlsOworCitwdWJsaWMgY2xhc3MgVmFsdWVNZXRyaWNzVGVzdHMgZXh0ZW5kcyBEZXZpY2VBdG9tVGVzdENhc2UgeworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVBQX0JSRUFEQ1JVTUJfUkVQT1JURURfQV9NQVRDSF9TVEFSVF9JRCA9IDA7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBUFBfQlJFQURDUlVNQl9SRVBPUlRFRF9BX01BVENIX1NUT1BfSUQgPSAxOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVBQX0JSRUFEQ1JVTUJfUkVQT1JURURfQl9NQVRDSF9TVEFSVF9JRCA9IDI7CisKKyAgcHVibGljIHZvaWQgdGVzdFZhbHVlTWV0cmljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgaWYgKHN0YXRzZERpc2FibGVkKCkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gQWRkIEF0b21NYXRjaGVyJ3MuCisgICAgQXRvbU1hdGNoZXIgc3RhcnRBdG9tTWF0Y2hlciA9CisgICAgICAgIE1ldHJpY3NVdGlscy5zdGFydEF0b21NYXRjaGVyKEFQUF9CUkVBRENSVU1CX1JFUE9SVEVEX0FfTUFUQ0hfU1RBUlRfSUQpOworICAgIEF0b21NYXRjaGVyIHN0b3BBdG9tTWF0Y2hlciA9CisgICAgICAgIE1ldHJpY3NVdGlscy5zdG9wQXRvbU1hdGNoZXIoQVBQX0JSRUFEQ1JVTUJfUkVQT1JURURfQV9NQVRDSF9TVE9QX0lEKTsKKyAgICBBdG9tTWF0Y2hlciBhdG9tTWF0Y2hlciA9CisgICAgICAgIE1ldHJpY3NVdGlscy5zaW1wbGVBdG9tTWF0Y2hlcihBUFBfQlJFQURDUlVNQl9SRVBPUlRFRF9CX01BVENIX1NUQVJUX0lEKTsKKworICAgIFN0YXRzZENvbmZpZ1Byb3RvLlN0YXRzZENvbmZpZy5CdWlsZGVyIGJ1aWxkZXIgPSBjcmVhdGVDb25maWdCdWlsZGVyKCk7CisgICAgYnVpbGRlci5hZGRBdG9tTWF0Y2hlcihzdGFydEF0b21NYXRjaGVyKTsKKyAgICBidWlsZGVyLmFkZEF0b21NYXRjaGVyKHN0b3BBdG9tTWF0Y2hlcik7CisgICAgYnVpbGRlci5hZGRBdG9tTWF0Y2hlcihhdG9tTWF0Y2hlcik7CisKKyAgICAvLyBBZGQgVmFsdWVNZXRyaWMuCisgICAgYnVpbGRlci5hZGRWYWx1ZU1ldHJpYygKKyAgICAgICAgVmFsdWVNZXRyaWMubmV3QnVpbGRlcigpCisgICAgICAgICAgICAuc2V0SWQoTWV0cmljc1V0aWxzLlZBTFVFX01FVFJJQ19JRCkKKyAgICAgICAgICAgIC5zZXRXaGF0KEFQUF9CUkVBRENSVU1CX1JFUE9SVEVEX0JfTUFUQ0hfU1RBUlRfSUQpCisgICAgICAgICAgICAuc2V0QnVja2V0KFN0YXRzZENvbmZpZ1Byb3RvLlRpbWVVbml0LkNUUykKKyAgICAgICAgICAgIC5zZXRWYWx1ZUZpZWxkKEZpZWxkTWF0Y2hlci5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoQXRvbS5BUFBfQlJFQURDUlVNQl9SRVBPUlRFRF9GSUVMRF9OVU1CRVIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENoaWxkKEZpZWxkTWF0Y2hlci5uZXdCdWlsZGVyKCkuc2V0RmllbGQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwcEJyZWFkY3J1bWJSZXBvcnRlZC5MQUJFTF9GSUVMRF9OVU1CRVIpKSkKKyAgICAgICAgICAgIC5zZXREaW1lbnNpb25zSW5XaGF0KEZpZWxkTWF0Y2hlci5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoQVBQX0JSRUFEQ1JVTUJfUkVQT1JURURfQl9NQVRDSF9TVEFSVF9JRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIC8vIFVwbG9hZCBjb25maWcuCisgICAgdXBsb2FkQ29uZmlnKGJ1aWxkZXIpOworCisgICAgLy8gQ3JlYXRlIEFwcEJyZWFkY3J1bWJSZXBvcnRlZCBTdGFydC9TdG9wIGV2ZW50cy4KKyAgICBkb0FwcEJyZWFkY3J1bWJSZXBvcnRlZFN0YXJ0KDEpOworICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKKyAgICBkb0FwcEJyZWFkY3J1bWJSZXBvcnRlZFN0b3AoMSk7CisgICAgZG9BcHBCcmVhZGNydW1iUmVwb3J0ZWRTdGFydCgzKTsKKyAgICBkb0FwcEJyZWFkY3J1bWJSZXBvcnRlZFN0b3AoMyk7CisKKyAgICAvLyBXYWl0IGZvciB0aGUgbWV0cmljcyB0byBwcm9wYWdhdGUgdG8gc3RhdHNkLgorICAgIFRocmVhZC5zbGVlcCgyMDAwKTsKKworICAgIFN0YXRzTG9nUmVwb3J0IG1ldHJpY1JlcG9ydCA9IGdldFN0YXRzTG9nUmVwb3J0KCk7CisgICAgTG9nVXRpbC5DTG9nLmQoIkdvdCB0aGUgZm9sbG93aW5nIHZhbHVlIG1ldHJpYyBkYXRhOiAiICsgbWV0cmljUmVwb3J0LnRvU3RyaW5nKCkpOworICAgIGFzc2VydEVxdWFscyhNZXRyaWNzVXRpbHMuVkFMVUVfTUVUUklDX0lELCBtZXRyaWNSZXBvcnQuZ2V0TWV0cmljSWQoKSk7CisgICAgYXNzZXJ0VHJ1ZShtZXRyaWNSZXBvcnQuaGFzVmFsdWVNZXRyaWNzKCkpOworICAgIFN0YXRzTG9nUmVwb3J0LlZhbHVlTWV0cmljRGF0YVdyYXBwZXIgdmFsdWVEYXRhID0gbWV0cmljUmVwb3J0LmdldFZhbHVlTWV0cmljcygpOworICAgIGFzc2VydEVxdWFscyh2YWx1ZURhdGEuZ2V0RGF0YUNvdW50KCksIDEpOworCisgICAgaW50IGJ1Y2tldENvdW50ID0gdmFsdWVEYXRhLmdldERhdGEoMCkuZ2V0QnVja2V0SW5mb0NvdW50KCk7CisgICAgYXNzZXJ0VHJ1ZShidWNrZXRDb3VudCA+IDEpOworICAgIFZhbHVlTWV0cmljRGF0YSBkYXRhID0gdmFsdWVEYXRhLmdldERhdGEoMCk7CisgICAgaW50IHRvdGFsVmFsdWUgPSAwOworICAgIGZvciAoVmFsdWVCdWNrZXRJbmZvIGJ1Y2tldEluZm8gOiBkYXRhLmdldEJ1Y2tldEluZm9MaXN0KCkpIHsKKyAgICAgIE1ldHJpY3NVdGlscy5hc3NlcnRCdWNrZXRUaW1lUHJlc2VudChidWNrZXRJbmZvKTsKKyAgICAgIHRvdGFsVmFsdWUgKz0gKGludCkgYnVja2V0SW5mby5nZXRWYWx1ZSgpOworICAgIH0KKyAgICBhc3NlcnRFcXVhbHModG90YWxWYWx1ZSwgOCk7CisgIH0KKworICAvLyBUZXN0IHZhbHVlIG1ldHJpYyB3aXRoIHB1bGxlZCBhdG9tcyBhbmQgYWNyb3NzIG11bHRpcGxlIGJ1Y2tldHMKKyAgcHVibGljIHZvaWQgdGVzdFB1bGxlckFjcm9zc0J1Y2tldHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBpZiAoc3RhdHNkRGlzYWJsZWQoKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBBZGQgQXRvbU1hdGNoZXIncy4KKyAgICBmaW5hbCBTdHJpbmcgcHJlZGljYXRlVHJ1ZU5hbWUgPSAiQVBQX0JSRUFEQ1JVTUJfUkVQT1JURURfU1RBUlQiOworICAgIGZpbmFsIFN0cmluZyBwcmVkaWNhdGVGYWxzZU5hbWUgPSAiQVBQX0JSRUFEQ1JVTUJfUkVQT1JURURfU1RPUCI7CisgICAgZmluYWwgU3RyaW5nIHByZWRpY2F0ZU5hbWUgPSAiQVBQX0JSRUFEQ1JVTUJfUkVQT1JURURfSVNfU1RPUCI7CisKKyAgICBBdG9tTWF0Y2hlciBzdGFydEF0b21NYXRjaGVyID0KKyAgICAgICAgICAgIE1ldHJpY3NVdGlscy5zdGFydEF0b21NYXRjaGVyKHByZWRpY2F0ZVRydWVOYW1lLmhhc2hDb2RlKCkpOworICAgIEF0b21NYXRjaGVyIHN0b3BBdG9tTWF0Y2hlciA9CisgICAgICAgICAgICBNZXRyaWNzVXRpbHMuc3RvcEF0b21NYXRjaGVyKHByZWRpY2F0ZUZhbHNlTmFtZS5oYXNoQ29kZSgpKTsKKworICAgIFN0YXRzZENvbmZpZ1Byb3RvLlN0YXRzZENvbmZpZy5CdWlsZGVyIGJ1aWxkZXIgPSBjcmVhdGVDb25maWdCdWlsZGVyKCk7CisgICAgYnVpbGRlci5hZGRBdG9tTWF0Y2hlcihzdGFydEF0b21NYXRjaGVyKTsKKyAgICBidWlsZGVyLmFkZEF0b21NYXRjaGVyKHN0b3BBdG9tTWF0Y2hlcik7CisgICAgYnVpbGRlci5hZGRQcmVkaWNhdGUoUHJlZGljYXRlLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgLnNldElkKHByZWRpY2F0ZU5hbWUuaGFzaENvZGUoKSkKKyAgICAgICAgICAgIC5zZXRTaW1wbGVQcmVkaWNhdGUoU2ltcGxlUHJlZGljYXRlLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAuc2V0U3RhcnQocHJlZGljYXRlVHJ1ZU5hbWUuaGFzaENvZGUoKSkKKyAgICAgICAgICAgICAgICAgICAgLnNldFN0b3AocHJlZGljYXRlRmFsc2VOYW1lLmhhc2hDb2RlKCkpCisgICAgICAgICAgICAgICAgICAgIC5zZXRDb3VudE5lc3RpbmcoZmFsc2UpCisgICAgICAgICAgICApCisgICAgKTsKKworICAgIGZpbmFsIFN0cmluZyBhdG9tTmFtZSA9ICJTWVNURU1fRUxBUFNFRF9SRUFMVElNRSI7CisgICAgU2ltcGxlQXRvbU1hdGNoZXIuQnVpbGRlciBzYW0gPSBTaW1wbGVBdG9tTWF0Y2hlci5uZXdCdWlsZGVyKCkuc2V0QXRvbUlkKEF0b20uU1lTVEVNX0VMQVBTRURfUkVBTFRJTUVfRklFTERfTlVNQkVSKTsKKyAgICBidWlsZGVyLmFkZEF0b21NYXRjaGVyKEF0b21NYXRjaGVyLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgLnNldElkKGF0b21OYW1lLmhhc2hDb2RlKCkpCisgICAgICAgICAgICAuc2V0U2ltcGxlQXRvbU1hdGNoZXIoc2FtKSk7CisKKyAgICAvLyBBZGQgVmFsdWVNZXRyaWMuCisgICAgYnVpbGRlci5hZGRWYWx1ZU1ldHJpYygKKyAgICAgICAgICAgIFZhbHVlTWV0cmljLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAuc2V0SWQoTWV0cmljc1V0aWxzLlZBTFVFX01FVFJJQ19JRCkKKyAgICAgICAgICAgICAgICAgICAgLnNldFdoYXQoYXRvbU5hbWUuaGFzaENvZGUoKSkKKyAgICAgICAgICAgICAgICAgICAgLnNldEJ1Y2tldChTdGF0c2RDb25maWdQcm90by5UaW1lVW5pdC5PTkVfTUlOVVRFKQorICAgICAgICAgICAgICAgICAgICAuc2V0VmFsdWVGaWVsZChGaWVsZE1hdGNoZXIubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKEF0b20uU1lTVEVNX0VMQVBTRURfUkVBTFRJTUVfRklFTERfTlVNQkVSKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDaGlsZChGaWVsZE1hdGNoZXIubmV3QnVpbGRlcigpLnNldEZpZWxkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtRWxhcHNlZFJlYWx0aW1lLlRJTUVfTUlMTElTX0ZJRUxEX05VTUJFUikpKQorICAgICAgICAgICAgICAgICAgICAuc2V0Q29uZGl0aW9uKHByZWRpY2F0ZU5hbWUuaGFzaENvZGUoKSkKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgLy8gVXBsb2FkIGNvbmZpZy4KKyAgICB1cGxvYWRDb25maWcoYnVpbGRlcik7CisKKyAgICAvLyBDcmVhdGUgQXBwQnJlYWRjcnVtYlJlcG9ydGVkIFN0YXJ0L1N0b3AgZXZlbnRzLgorICAgIGRvQXBwQnJlYWRjcnVtYlJlcG9ydGVkU3RhcnQoMSk7CisgICAgLy8gV2FpdCBmb3IgMiBtaW4gYW5kIDEgc2VjIHRvIGNhcHR1cmUgYXQgbGVhc3QgMiBidWNrZXRzCisgICAgVGhyZWFkLnNsZWVwKDIqNjBfMDAwICsgMTBfMDAwKTsKKyAgICBkb0FwcEJyZWFkY3J1bWJSZXBvcnRlZFN0b3AoMSk7CisKKyAgICAvLyBXYWl0IGZvciB0aGUgbWV0cmljcyB0byBwcm9wYWdhdGUgdG8gc3RhdHNkLgorICAgIFRocmVhZC5zbGVlcCgxXzAwMCk7CisKKyAgICBTdGF0c0xvZ1JlcG9ydCBtZXRyaWNSZXBvcnQgPSBnZXRTdGF0c0xvZ1JlcG9ydCgpOworICAgIExvZ1V0aWwuQ0xvZy5kKCJHb3QgdGhlIGZvbGxvd2luZyB2YWx1ZSBtZXRyaWMgZGF0YTogIiArIG1ldHJpY1JlcG9ydC50b1N0cmluZygpKTsKKyAgICBhc3NlcnRFcXVhbHMoTWV0cmljc1V0aWxzLlZBTFVFX01FVFJJQ19JRCwgbWV0cmljUmVwb3J0LmdldE1ldHJpY0lkKCkpOworICAgIGFzc2VydFRydWUobWV0cmljUmVwb3J0Lmhhc1ZhbHVlTWV0cmljcygpKTsKKyAgICBTdGF0c0xvZ1JlcG9ydC5WYWx1ZU1ldHJpY0RhdGFXcmFwcGVyIHZhbHVlRGF0YSA9IG1ldHJpY1JlcG9ydC5nZXRWYWx1ZU1ldHJpY3MoKTsKKyAgICBhc3NlcnRFcXVhbHModmFsdWVEYXRhLmdldERhdGFDb3VudCgpLCAxKTsKKworICAgIGludCBidWNrZXRDb3VudCA9IHZhbHVlRGF0YS5nZXREYXRhKDApLmdldEJ1Y2tldEluZm9Db3VudCgpOworICAgIC8vIHNob3VsZCBoYXZlIGF0IGxlYXN0IDIgYnVja2V0cworICAgIGFzc2VydFRydWUoYnVja2V0Q291bnQgPj0gMik7CisgICAgVmFsdWVNZXRyaWNEYXRhIGRhdGEgPSB2YWx1ZURhdGEuZ2V0RGF0YSgwKTsKKyAgICBpbnQgdG90YWxWYWx1ZSA9IDA7CisgICAgZm9yIChWYWx1ZUJ1Y2tldEluZm8gYnVja2V0SW5mbyA6IGRhdGEuZ2V0QnVja2V0SW5mb0xpc3QoKSkgeworICAgICAgTWV0cmljc1V0aWxzLmFzc2VydEJ1Y2tldFRpbWVQcmVzZW50KGJ1Y2tldEluZm8pOworICAgICAgdG90YWxWYWx1ZSArPSAoaW50KSBidWNrZXRJbmZvLmdldFZhbHVlKCk7CisgICAgfQorICAgIC8vIEF0IG1vc3Qgd2UgbG9zZSBvbmUgZnVsbCBtaW4gYnVja2V0CisgICAgYXNzZXJ0VHJ1ZSh0b3RhbFZhbHVlID4gKDEzMF8wMDAgLSA2MF8wMDApKTsKKyAgfQorCisgIC8vIFRlc3QgdmFsdWUgbWV0cmljIHdpdGggcHVsbGVkIGF0b21zIGFuZCBhY3Jvc3MgbXVsdGlwbGUgYnVja2V0cworICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVFdmVudHNQZXJCdWNrZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBpZiAoc3RhdHNkRGlzYWJsZWQoKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBBZGQgQXRvbU1hdGNoZXIncy4KKyAgICBmaW5hbCBTdHJpbmcgcHJlZGljYXRlVHJ1ZU5hbWUgPSAiQVBQX0JSRUFEQ1JVTUJfUkVQT1JURURfU1RBUlQiOworICAgIGZpbmFsIFN0cmluZyBwcmVkaWNhdGVGYWxzZU5hbWUgPSAiQVBQX0JSRUFEQ1JVTUJfUkVQT1JURURfU1RPUCI7CisgICAgZmluYWwgU3RyaW5nIHByZWRpY2F0ZU5hbWUgPSAiQVBQX0JSRUFEQ1JVTUJfUkVQT1JURURfSVNfU1RPUCI7CisKKyAgICBBdG9tTWF0Y2hlciBzdGFydEF0b21NYXRjaGVyID0KKyAgICAgICAgICAgIE1ldHJpY3NVdGlscy5zdGFydEF0b21NYXRjaGVyKHByZWRpY2F0ZVRydWVOYW1lLmhhc2hDb2RlKCkpOworICAgIEF0b21NYXRjaGVyIHN0b3BBdG9tTWF0Y2hlciA9CisgICAgICAgICAgICBNZXRyaWNzVXRpbHMuc3RvcEF0b21NYXRjaGVyKHByZWRpY2F0ZUZhbHNlTmFtZS5oYXNoQ29kZSgpKTsKKworICAgIFN0YXRzZENvbmZpZ1Byb3RvLlN0YXRzZENvbmZpZy5CdWlsZGVyIGJ1aWxkZXIgPSBjcmVhdGVDb25maWdCdWlsZGVyKCk7CisgICAgYnVpbGRlci5hZGRBdG9tTWF0Y2hlcihzdGFydEF0b21NYXRjaGVyKTsKKyAgICBidWlsZGVyLmFkZEF0b21NYXRjaGVyKHN0b3BBdG9tTWF0Y2hlcik7CisgICAgYnVpbGRlci5hZGRQcmVkaWNhdGUoUHJlZGljYXRlLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgLnNldElkKHByZWRpY2F0ZU5hbWUuaGFzaENvZGUoKSkKKyAgICAgICAgICAgIC5zZXRTaW1wbGVQcmVkaWNhdGUoU2ltcGxlUHJlZGljYXRlLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAuc2V0U3RhcnQocHJlZGljYXRlVHJ1ZU5hbWUuaGFzaENvZGUoKSkKKyAgICAgICAgICAgICAgICAgICAgLnNldFN0b3AocHJlZGljYXRlRmFsc2VOYW1lLmhhc2hDb2RlKCkpCisgICAgICAgICAgICAgICAgICAgIC5zZXRDb3VudE5lc3RpbmcoZmFsc2UpCisgICAgICAgICAgICApCisgICAgKTsKKworICAgIGZpbmFsIFN0cmluZyBhdG9tTmFtZSA9ICJTWVNURU1fRUxBUFNFRF9SRUFMVElNRSI7CisgICAgU2ltcGxlQXRvbU1hdGNoZXIuQnVpbGRlciBzYW0gPSBTaW1wbGVBdG9tTWF0Y2hlci5uZXdCdWlsZGVyKCkuc2V0QXRvbUlkKEF0b20uU1lTVEVNX0VMQVBTRURfUkVBTFRJTUVfRklFTERfTlVNQkVSKTsKKyAgICBidWlsZGVyLmFkZEF0b21NYXRjaGVyKEF0b21NYXRjaGVyLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgLnNldElkKGF0b21OYW1lLmhhc2hDb2RlKCkpCisgICAgICAgICAgICAuc2V0U2ltcGxlQXRvbU1hdGNoZXIoc2FtKSk7CisKKyAgICAvLyBBZGQgVmFsdWVNZXRyaWMuCisgICAgYnVpbGRlci5hZGRWYWx1ZU1ldHJpYygKKyAgICAgICAgICAgIFZhbHVlTWV0cmljLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAuc2V0SWQoTWV0cmljc1V0aWxzLlZBTFVFX01FVFJJQ19JRCkKKyAgICAgICAgICAgICAgICAgICAgLnNldFdoYXQoYXRvbU5hbWUuaGFzaENvZGUoKSkKKyAgICAgICAgICAgICAgICAgICAgLnNldEJ1Y2tldChTdGF0c2RDb25maWdQcm90by5UaW1lVW5pdC5PTkVfTUlOVVRFKQorICAgICAgICAgICAgICAgICAgICAuc2V0VmFsdWVGaWVsZChGaWVsZE1hdGNoZXIubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKEF0b20uU1lTVEVNX0VMQVBTRURfUkVBTFRJTUVfRklFTERfTlVNQkVSKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDaGlsZChGaWVsZE1hdGNoZXIubmV3QnVpbGRlcigpLnNldEZpZWxkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtRWxhcHNlZFJlYWx0aW1lLlRJTUVfTUlMTElTX0ZJRUxEX05VTUJFUikpKQorICAgICAgICAgICAgICAgICAgICAuc2V0Q29uZGl0aW9uKHByZWRpY2F0ZU5hbWUuaGFzaENvZGUoKSkKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgLy8gVXBsb2FkIGNvbmZpZy4KKyAgICB1cGxvYWRDb25maWcoYnVpbGRlcik7CisKKyAgICBmaW5hbCBpbnQgTlVNX0VWRU5UUyA9IDEwOworICAgIGZpbmFsIGxvbmcgR0FQX0lOVEVSVkFMID0gMTBfMDAwOworICAgIC8vIENyZWF0ZSBBcHBCcmVhZGNydW1iUmVwb3J0ZWQgU3RhcnQvU3RvcCBldmVudHMuCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fRVZFTlRTOyBpICsrKSB7CisgICAgICBkb0FwcEJyZWFkY3J1bWJSZXBvcnRlZFN0YXJ0KDEpOworICAgICAgVGhyZWFkLnNsZWVwKEdBUF9JTlRFUlZBTCk7CisgICAgICBkb0FwcEJyZWFkY3J1bWJSZXBvcnRlZFN0b3AoMSk7CisgICAgICBUaHJlYWQuc2xlZXAoR0FQX0lOVEVSVkFMKTsKKyAgICB9CisKKyAgICAvLyBXYWl0IGZvciB0aGUgbWV0cmljcyB0byBwcm9wYWdhdGUgdG8gc3RhdHNkLgorICAgIFRocmVhZC5zbGVlcCgxXzAwMCk7CisKKyAgICBTdGF0c0xvZ1JlcG9ydCBtZXRyaWNSZXBvcnQgPSBnZXRTdGF0c0xvZ1JlcG9ydCgpOworICAgIExvZ1V0aWwuQ0xvZy5kKCJHb3QgdGhlIGZvbGxvd2luZyB2YWx1ZSBtZXRyaWMgZGF0YTogIiArIG1ldHJpY1JlcG9ydC50b1N0cmluZygpKTsKKyAgICBhc3NlcnRFcXVhbHMoTWV0cmljc1V0aWxzLlZBTFVFX01FVFJJQ19JRCwgbWV0cmljUmVwb3J0LmdldE1ldHJpY0lkKCkpOworICAgIGFzc2VydFRydWUobWV0cmljUmVwb3J0Lmhhc1ZhbHVlTWV0cmljcygpKTsKKyAgICBTdGF0c0xvZ1JlcG9ydC5WYWx1ZU1ldHJpY0RhdGFXcmFwcGVyIHZhbHVlRGF0YSA9IG1ldHJpY1JlcG9ydC5nZXRWYWx1ZU1ldHJpY3MoKTsKKyAgICBhc3NlcnRFcXVhbHModmFsdWVEYXRhLmdldERhdGFDb3VudCgpLCAxKTsKKworICAgIGludCBidWNrZXRDb3VudCA9IHZhbHVlRGF0YS5nZXREYXRhKDApLmdldEJ1Y2tldEluZm9Db3VudCgpOworICAgIC8vIHNob3VsZCBoYXZlIGF0IGxlYXN0IDIgYnVja2V0cworICAgIGFzc2VydFRydWUoYnVja2V0Q291bnQgPj0gMik7CisgICAgVmFsdWVNZXRyaWNEYXRhIGRhdGEgPSB2YWx1ZURhdGEuZ2V0RGF0YSgwKTsKKyAgICBpbnQgdG90YWxWYWx1ZSA9IDA7CisgICAgZm9yIChWYWx1ZUJ1Y2tldEluZm8gYnVja2V0SW5mbyA6IGRhdGEuZ2V0QnVja2V0SW5mb0xpc3QoKSkgeworICAgICAgTWV0cmljc1V0aWxzLmFzc2VydEJ1Y2tldFRpbWVQcmVzZW50KGJ1Y2tldEluZm8pOworICAgICAgdG90YWxWYWx1ZSArPSAoaW50KSBidWNrZXRJbmZvLmdldFZhbHVlKCk7CisgICAgfQorICAgIC8vIEF0IG1vc3Qgd2UgbG9zZSBvbmUgZnVsbCBtaW4gYnVja2V0CisgICAgYXNzZXJ0VHJ1ZSh0b3RhbFZhbHVlID4gKEdBUF9JTlRFUlZBTCpOVU1fRVZFTlRTIC0gNjBfMDAwKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc3RhdHNkL3NyYy9hbmRyb2lkL2N0cy9zdGF0c2QvdWlkbWFwL1VpZE1hcFRlc3RzLmphdmEgYi9ob3N0c2lkZXRlc3RzL3N0YXRzZC9zcmMvYW5kcm9pZC9jdHMvc3RhdHNkL3VpZG1hcC9VaWRNYXBUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNTk5ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL3N0YXRzZC9zcmMvYW5kcm9pZC9jdHMvc3RhdHNkL3VpZG1hcC9VaWRNYXBUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5jdHMuc3RhdHNkLnVpZG1hcDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBhbmRyb2lkLmN0cy5zdGF0c2QuYXRvbS5EZXZpY2VBdG9tVGVzdENhc2U7CitpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQuYnVpbGQuQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLm9zLlN0YXRzZENvbmZpZ1Byb3RvOworaW1wb3J0IGNvbS5hbmRyb2lkLm9zLkF0b21zUHJvdG87CitpbXBvcnQgY29tLmFuZHJvaWQub3MuU3RhdHNMb2cuQ29uZmlnTWV0cmljc1JlcG9ydExpc3Q7CitpbXBvcnQgY29tLmFuZHJvaWQub3MuU3RhdHNMb2cuQ29uZmlnTWV0cmljc1JlcG9ydDsKK2ltcG9ydCBjb20uYW5kcm9pZC5vcy5TdGF0c0xvZy5VaWRNYXBwaW5nOworaW1wb3J0IGNvbS5hbmRyb2lkLm9zLlN0YXRzTG9nLlVpZE1hcHBpbmcuUGFja2FnZUluZm9TbmFwc2hvdDsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5sb2cuTG9nVXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgVWlkTWFwVGVzdHMgZXh0ZW5kcyBEZXZpY2VBdG9tVGVzdENhc2UgeworCisgICAgLy8gVGVzdHMgdGhhdCBldmVyeSByZXBvcnQgaGFzIGF0IGxlYXN0IG9uZSBzbmFwc2hvdC4KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VWlkU25hcHNob3RJbmNsdWRlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoc3RhdHNkRGlzYWJsZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIFRoZXJlIHNob3VsZCBiZSBhdCBsZWFzdCB0aGUgdGVzdCBhcHAgaW5zdGFsbGVkIGR1cmluZyB0aGUgdGVzdCBzZXR1cC4KKyAgICAgICAgY3JlYXRlQW5kVXBsb2FkQ29uZmlnKEF0b21zUHJvdG8uQXRvbS5VSURfUFJPQ0VTU19TVEFURV9DSEFOR0VEX0ZJRUxEX05VTUJFUik7CisKKyAgICAgICAgQ29uZmlnTWV0cmljc1JlcG9ydExpc3QgcmVwb3J0cyA9IGdldFJlcG9ydExpc3QoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZXBvcnRzLmdldFJlcG9ydHNDb3VudCgpID4gMCk7CisKKyAgICAgICAgZm9yIChDb25maWdNZXRyaWNzUmVwb3J0IHJlcG9ydCA6IHJlcG9ydHMuZ2V0UmVwb3J0c0xpc3QoKSkgeworICAgICAgICAgICAgVWlkTWFwcGluZyB1aWRtYXAgPSByZXBvcnQuZ2V0VWlkTWFwKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHVpZG1hcC5nZXRTbmFwc2hvdHNDb3VudCgpID4gMCk7CisgICAgICAgICAgICBmb3IgKFBhY2thZ2VJbmZvU25hcHNob3Qgc25hcHNob3QgOiB1aWRtYXAuZ2V0U25hcHNob3RzTGlzdCgpKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgZWxlbWVudCBpbiBlYWNoIHNuYXBzaG90IChhdCBsZWFzdCBvbmUgcGFja2FnZSBpcworICAgICAgICAgICAgICAgIC8vIGluc3RhbGxlZCkuCisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzbmFwc2hvdC5nZXRQYWNrYWdlSW5mb0NvdW50KCkgPiAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBoYXNNYXRjaGluZ0NoYW5nZShVaWRNYXBwaW5nIHVpZG1hcCwgaW50IHVpZCwgYm9vbGVhbiBleHBlY3REZWxldGlvbikgeworICAgICAgICBMb2dVdGlsLkNMb2cuZCgiVGhlIHVpZCB3ZSBhcmUgbG9va2luZyBmb3IgaXMgIiArIHVpZCk7CisgICAgICAgIGZvciAoVWlkTWFwcGluZy5DaGFuZ2UgY2hhbmdlIDogdWlkbWFwLmdldENoYW5nZXNMaXN0KCkpIHsKKyAgICAgICAgICAgIGlmIChjaGFuZ2UuZ2V0QXBwSGFzaCgpID09IERFVklDRV9TSURFX1RFU1RfUEtHX0hBU0ggJiYgY2hhbmdlLmdldFVpZCgpID09IHVpZCkgeworICAgICAgICAgICAgICAgIGlmIChjaGFuZ2UuZ2V0RGVsZXRpb24oKSA9PSBleHBlY3REZWxldGlvbikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIFRlc3RzIHRoYXQgZGVsdGEgZXZlbnQgaW5jbHVkZWQgZHVyaW5nIGFwcCBpbnN0YWxsYXRpb24uCisgICAgcHVibGljIHZvaWQgdGVzdENoYW5nZUZyb21JbnN0YWxsYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHN0YXRzZERpc2FibGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKERFVklDRV9TSURFX1RFU1RfUEFDS0FHRSk7CisgICAgICAgIGNyZWF0ZUFuZFVwbG9hZENvbmZpZyhBdG9tc1Byb3RvLkF0b20uVUlEX1BST0NFU1NfU1RBVEVfQ0hBTkdFRF9GSUVMRF9OVU1CRVIpOworICAgICAgICAvLyBJbnN0YWxsIHRoZSBwYWNrYWdlIGFmdGVyIHRoZSBjb25maWcgaXMgc2VudCB0byBzdGF0c2QuIFRoZSB1aWQgbWFwIGlzIG5vdCBndWFyYW50ZWVkIHRvCisgICAgICAgIC8vIGJlIHVwZGF0ZWQgaWYgdGhlcmUncyBubyBjb25maWcgaW4gc3RhdHNkLgorICAgICAgICBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIgYnVpbGRIZWxwZXIgPSBuZXcgQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyKG1DdHNCdWlsZCk7CisgICAgICAgIGZpbmFsIFN0cmluZyByZXN1bHQgPSBnZXREZXZpY2UoKS5pbnN0YWxsUGFja2FnZSgKKyAgICAgICAgICAgICAgICBidWlsZEhlbHBlci5nZXRUZXN0RmlsZShERVZJQ0VfU0lERV9URVNUX0FQSyksIGZhbHNlLCB0cnVlKTsKKworICAgICAgICBUaHJlYWQuc2xlZXAoV0FJVF9USU1FX1NIT1JUKTsKKworICAgICAgICBDb25maWdNZXRyaWNzUmVwb3J0TGlzdCByZXBvcnRzID0gZ2V0UmVwb3J0TGlzdCgpOworICAgICAgICBhc3NlcnRUcnVlKHJlcG9ydHMuZ2V0UmVwb3J0c0NvdW50KCkgPiAwKTsKKworICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7CisgICAgICAgIGludCB1aWQgPSBnZXRVaWQoKTsKKyAgICAgICAgZm9yIChDb25maWdNZXRyaWNzUmVwb3J0IHJlcG9ydCA6IHJlcG9ydHMuZ2V0UmVwb3J0c0xpc3QoKSkgeworICAgICAgICAgICAgTG9nVXRpbC5DTG9nLmQoIkdvdCB0aGUgZm9sbG93aW5nIHJlcG9ydDogXG4iICsgcmVwb3J0LnRvU3RyaW5nKCkpOworICAgICAgICAgICAgaWYgKGhhc01hdGNoaW5nQ2hhbmdlKHJlcG9ydC5nZXRVaWRNYXAoKSwgdWlkLCBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZShmb3VuZCk7CisgICAgfQorCisgICAgLy8gV2UgY2hlY2sgdGhhdCBhIHJlLWluc3RhbGxhdGlvbiBnaXZlcyBhIGNoYW5nZSBldmVudCAoc2ltaWxhciB0byBhbiBhcHAgdXBncmFkZSkuCisgICAgcHVibGljIHZvaWQgdGVzdENoYW5nZUZyb21SZWluc3RhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHN0YXRzZERpc2FibGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIgYnVpbGRIZWxwZXIgPSBuZXcgQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyKG1DdHNCdWlsZCk7CisgICAgICAgIGdldERldmljZSgpLmluc3RhbGxQYWNrYWdlKGJ1aWxkSGVscGVyLmdldFRlc3RGaWxlKERFVklDRV9TSURFX1RFU1RfQVBLKSwgZmFsc2UsIHRydWUpOworICAgICAgICBjcmVhdGVBbmRVcGxvYWRDb25maWcoQXRvbXNQcm90by5BdG9tLlVJRF9QUk9DRVNTX1NUQVRFX0NIQU5HRURfRklFTERfTlVNQkVSKTsKKyAgICAgICAgLy8gTm93IGVuYWJsZSByZS1pbnN0YWxsYXRpb24uCisgICAgICAgIGdldERldmljZSgpLmluc3RhbGxQYWNrYWdlKGJ1aWxkSGVscGVyLmdldFRlc3RGaWxlKERFVklDRV9TSURFX1RFU1RfQVBLKSwgdHJ1ZSwgdHJ1ZSk7CisKKyAgICAgICAgVGhyZWFkLnNsZWVwKFdBSVRfVElNRV9TSE9SVCk7CisKKyAgICAgICAgQ29uZmlnTWV0cmljc1JlcG9ydExpc3QgcmVwb3J0cyA9IGdldFJlcG9ydExpc3QoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZXBvcnRzLmdldFJlcG9ydHNDb3VudCgpID4gMCk7CisKKyAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworICAgICAgICBpbnQgdWlkID0gZ2V0VWlkKCk7CisgICAgICAgIGZvciAoQ29uZmlnTWV0cmljc1JlcG9ydCByZXBvcnQgOiByZXBvcnRzLmdldFJlcG9ydHNMaXN0KCkpIHsKKyAgICAgICAgICAgIExvZ1V0aWwuQ0xvZy5kKCJHb3QgdGhlIGZvbGxvd2luZyByZXBvcnQ6IFxuIiArIHJlcG9ydC50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGlmIChoYXNNYXRjaGluZ0NoYW5nZShyZXBvcnQuZ2V0VWlkTWFwKCksIHVpZCwgZmFsc2UpKSB7CisgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoZm91bmQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VGcm9tVW5pbnN0YWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChzdGF0c2REaXNhYmxlZCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyIGJ1aWxkSGVscGVyID0gbmV3IENvbXBhdGliaWxpdHlCdWlsZEhlbHBlcihtQ3RzQnVpbGQpOworICAgICAgICBnZXREZXZpY2UoKS5pbnN0YWxsUGFja2FnZShidWlsZEhlbHBlci5nZXRUZXN0RmlsZShERVZJQ0VfU0lERV9URVNUX0FQSyksIHRydWUsIHRydWUpOworICAgICAgICBjcmVhdGVBbmRVcGxvYWRDb25maWcoQXRvbXNQcm90by5BdG9tLlVJRF9QUk9DRVNTX1NUQVRFX0NIQU5HRURfRklFTERfTlVNQkVSKTsKKyAgICAgICAgaW50IHVpZCA9IGdldFVpZCgpOworICAgICAgICBnZXREZXZpY2UoKS51bmluc3RhbGxQYWNrYWdlKERFVklDRV9TSURFX1RFU1RfUEFDS0FHRSk7CisKKyAgICAgICAgVGhyZWFkLnNsZWVwKFdBSVRfVElNRV9TSE9SVCk7CisKKyAgICAgICAgQ29uZmlnTWV0cmljc1JlcG9ydExpc3QgcmVwb3J0cyA9IGdldFJlcG9ydExpc3QoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZXBvcnRzLmdldFJlcG9ydHNDb3VudCgpID4gMCk7CisKKyAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworICAgICAgICBmb3IgKENvbmZpZ01ldHJpY3NSZXBvcnQgcmVwb3J0IDogcmVwb3J0cy5nZXRSZXBvcnRzTGlzdCgpKSB7CisgICAgICAgICAgICBMb2dVdGlsLkNMb2cuZCgiR290IHRoZSBmb2xsb3dpbmcgcmVwb3J0OiBcbiIgKyByZXBvcnQudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBpZiAoaGFzTWF0Y2hpbmdDaGFuZ2UocmVwb3J0LmdldFVpZE1hcCgpLCB1aWQsIHRydWUpKSB7CisgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoZm91bmQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc3RhdHNkL3NyYy9hbmRyb2lkL2N0cy9zdGF0c2QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uVGVzdHMuamF2YSBiL2hvc3RzaWRldGVzdHMvc3RhdHNkL3NyYy9hbmRyb2lkL2N0cy9zdGF0c2QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWIxOWMzCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy9zdGF0c2Qvc3JjL2FuZHJvaWQvY3RzL3N0YXRzZC92YWxpZGF0aW9uL1ZhbGlkYXRpb25UZXN0cy5qYXZhCkBAIC0wLDAgKzEsNjg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5jdHMuc3RhdHNkLnZhbGlkYXRpb247CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgYW5kcm9pZC5jdHMuc3RhdHNkLmF0b20uRGV2aWNlQXRvbVRlc3RDYXNlOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5SZXN0cmljdGVkQnVpbGRUZXN0OworaW1wb3J0IGFuZHJvaWQub3MuQmF0dGVyeVN0YXRzUHJvdG87CitpbXBvcnQgYW5kcm9pZC5vcy5VaWRQcm90bzsKK2ltcG9ydCBhbmRyb2lkLm9zLlVpZFByb3RvLldha2Vsb2NrOworaW1wb3J0IGFuZHJvaWQub3MuQmF0dGVyeVBsdWdnZWRTdGF0ZUVudW07CitpbXBvcnQgYW5kcm9pZC5vcy5XYWtlTG9ja0xldmVsRW51bTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuRGlzcGxheVN0YXRlRW51bTsKKworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuU3RhdHNkQ29uZmlnUHJvdG8uQXRvbU1hdGNoZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuU3RhdHNkQ29uZmlnUHJvdG8uRmllbGRNYXRjaGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLm9zLlN0YXRzZENvbmZpZ1Byb3RvLkZpZWxkVmFsdWVNYXRjaGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLm9zLlN0YXRzZENvbmZpZ1Byb3RvLkR1cmF0aW9uTWV0cmljOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLm9zLlN0YXRzZENvbmZpZ1Byb3RvLkxvZ2ljYWxPcGVyYXRpb247CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuU3RhdHNkQ29uZmlnUHJvdG8uUG9zaXRpb247CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuU3RhdHNkQ29uZmlnUHJvdG8uUHJlZGljYXRlOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLm9zLlN0YXRzZENvbmZpZ1Byb3RvLlNpbXBsZUF0b21NYXRjaGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLm9zLlN0YXRzZENvbmZpZ1Byb3RvLlNpbXBsZVByZWRpY2F0ZTsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5vcy5TdGF0c2RDb25maWdQcm90by5TdGF0c2RDb25maWc7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuU3RhdHNkQ29uZmlnUHJvdG8uVGltZVVuaXQ7CitpbXBvcnQgY29tLmFuZHJvaWQub3MuQXRvbXNQcm90by5BdG9tOworaW1wb3J0IGNvbS5hbmRyb2lkLm9zLkF0b21zUHJvdG8uUGx1Z2dlZFN0YXRlQ2hhbmdlZDsKK2ltcG9ydCBjb20uYW5kcm9pZC5vcy5BdG9tc1Byb3RvLlNjcmVlblN0YXRlQ2hhbmdlZDsKK2ltcG9ydCBjb20uYW5kcm9pZC5vcy5BdG9tc1Byb3RvLldha2Vsb2NrU3RhdGVDaGFuZ2VkOworaW1wb3J0IGNvbS5hbmRyb2lkLm9zLlN0YXRzTG9nLkV2ZW50TWV0cmljRGF0YTsKK2ltcG9ydCBjb20uYW5kcm9pZC5vcy5TdGF0c0xvZy5EaW1lbnNpb25zVmFsdWU7CitpbXBvcnQgY29tLmFuZHJvaWQub3MuU3RhdHNMb2cuRHVyYXRpb25CdWNrZXRJbmZvOworaW1wb3J0IGNvbS5hbmRyb2lkLm9zLlN0YXRzTG9nLkR1cmF0aW9uTWV0cmljRGF0YTsKK2ltcG9ydCBjb20uYW5kcm9pZC5vcy5TdGF0c0xvZy5TdGF0c0xvZ1JlcG9ydDsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5sb2cuTG9nVXRpbC5DTG9nOworCisKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLyoqCisgKiBTaWRlLWJ5LXNpZGUgY29tcGFyaXNvbiBiZXR3ZWVuIHN0YXRzZCBhbmQgYmF0dGVyeXN0YXRzLgorICovCitwdWJsaWMgY2xhc3MgVmFsaWRhdGlvblRlc3RzIGV4dGVuZHMgRGV2aWNlQXRvbVRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3RhdHNkLlZhbGlkYXRpb25UZXN0cyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVfQVVUT01PVElWRSA9ICJhbmRyb2lkLmhhcmR3YXJlLnR5cGUuYXV0b21vdGl2ZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBFTkFCTEVfTE9BRF9URVNUID0gZmFsc2U7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJlc2V0QmF0dGVyeVN0YXR1cygpOyAvLyBVbmRvIGFueSB1bnBsdWdEZXZpY2UoKS4KKyAgICAgICAgdHVyblNjcmVlbk9uKCk7IC8vIFJlc2V0IHNjcmVlbiB0byBvbiBzdGF0ZQorICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJ0aWFsV2FrZWxvY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHN0YXRzZERpc2FibGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWhhc0ZlYXR1cmUoRkVBVFVSRV9BVVRPTU9USVZFLCBmYWxzZSkpIHJldHVybjsKKyAgICAgICAgcmVzZXRCYXR0ZXJ5U3RhdHMoKTsKKyAgICAgICAgdW5wbHVnRGV2aWNlKCk7CisgICAgICAgIC8vIEFvRCBuZWVkcyB0byBiZSB0dXJuZWQgb2ZmIGJlY2F1c2UgdGhlIHNjcmVlbiBzaG91bGQgZ28gaW50byBhbiBvZmYgc3RhdGUuIEJ1dCwgaWYgQW9EIGlzCisgICAgICAgIC8vIG9uIGFuZCB0aGUgZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBTVEFURV9ET1pFLCB0aGUgc2NyZWVuIHNhZGx5IGdvZXMgYmFjayB0byBTVEFURV9PTi4KKyAgICAgICAgU3RyaW5nIGFvZFN0YXRlID0gZ2V0QW9kU3RhdGUoKTsKKyAgICAgICAgc2V0QW9kU3RhdGUoIjAiKTsKKyAgICAgICAgdHVyblNjcmVlbk9mZigpOworCisgICAgICAgIGZpbmFsIGludCBhdG9tVGFnID0gQXRvbS5XQUtFTE9DS19TVEFURV9DSEFOR0VEX0ZJRUxEX05VTUJFUjsKKyAgICAgICAgU2V0PEludGVnZXI+IHdha2Vsb2NrT24gPSBuZXcgSGFzaFNldDw+KEFycmF5cy5hc0xpc3QoCisgICAgICAgICAgICAgICAgV2FrZWxvY2tTdGF0ZUNoYW5nZWQuU3RhdGUuQUNRVUlSRV9WQUxVRSwKKyAgICAgICAgICAgICAgICBXYWtlbG9ja1N0YXRlQ2hhbmdlZC5TdGF0ZS5DSEFOR0VfQUNRVUlSRV9WQUxVRSkpOworICAgICAgICBTZXQ8SW50ZWdlcj4gd2FrZWxvY2tPZmYgPSBuZXcgSGFzaFNldDw+KEFycmF5cy5hc0xpc3QoCisgICAgICAgICAgICAgICAgV2FrZWxvY2tTdGF0ZUNoYW5nZWQuU3RhdGUuUkVMRUFTRV9WQUxVRSwKKyAgICAgICAgICAgICAgICBXYWtlbG9ja1N0YXRlQ2hhbmdlZC5TdGF0ZS5DSEFOR0VfUkVMRUFTRV9WQUxVRSkpOworCisgICAgICAgIGZpbmFsIFN0cmluZyBFWFBFQ1RFRF9UQUcgPSAiU3RhdHNkUGFydGlhbFdha2Vsb2NrIjsKKyAgICAgICAgZmluYWwgV2FrZUxvY2tMZXZlbEVudW0gRVhQRUNURURfTEVWRUwgPSBXYWtlTG9ja0xldmVsRW51bS5QQVJUSUFMX1dBS0VfTE9DSzsKKworICAgICAgICAvLyBBZGQgc3RhdGUgc2V0cyB0byB0aGUgbGlzdCBpbiBvcmRlci4KKyAgICAgICAgTGlzdDxTZXQ8SW50ZWdlcj4+IHN0YXRlU2V0ID0gQXJyYXlzLmFzTGlzdCh3YWtlbG9ja09uLCB3YWtlbG9ja09mZik7CisKKyAgICAgICAgY3JlYXRlQW5kVXBsb2FkQ29uZmlnKGF0b21UYWcsIHRydWUpOyAgLy8gVHJ1ZTogdXNlcyBhdHRyaWJ1dGlvbi4KKyAgICAgICAgcnVuRGV2aWNlVGVzdHMoREVWSUNFX1NJREVfVEVTVF9QQUNLQUdFLCAiLkF0b21UZXN0cyIsICJ0ZXN0V2FrZWxvY2tTdGF0ZSIpOworCisgICAgICAgIC8vIFNvcnRlZCBsaXN0IG9mIGV2ZW50cyBpbiBvcmRlciBpbiB3aGljaCB0aGV5IG9jY3VycmVkLgorICAgICAgICBMaXN0PEV2ZW50TWV0cmljRGF0YT4gZGF0YSA9IGdldEV2ZW50TWV0cmljRGF0YUxpc3QoKTsKKworICAgICAgICBCYXR0ZXJ5U3RhdHNQcm90byBiYXR0ZXJ5c3RhdHNQcm90byA9IGdldEJhdHRlcnlTdGF0c1Byb3RvKCk7CisKKyAgICAgICAgLy89PT09PT09PT09PT09PT09PT09IHZlcmlmeSB0aGF0IHN0YXRzZCBpcyBjb3JyZWN0ID09PT09PT09PT09PT09PS8vCisgICAgICAgIC8vIEFzc2VydCB0aGF0IHRoZSBldmVudHMgaGFwcGVuZWQgaW4gdGhlIGV4cGVjdGVkIG9yZGVyLgorICAgICAgICBhc3NlcnRTdGF0ZXNPY2N1cnJlZChzdGF0ZVNldCwgZGF0YSwgV0FJVF9USU1FX1NIT1JULAorICAgICAgICAgICAgICAgIGF0b20gLT4gYXRvbS5nZXRXYWtlbG9ja1N0YXRlQ2hhbmdlZCgpLmdldFN0YXRlKCkuZ2V0TnVtYmVyKCkpOworCisgICAgICAgIGZvciAoRXZlbnRNZXRyaWNEYXRhIGV2ZW50IDogZGF0YSkgeworICAgICAgICAgICAgU3RyaW5nIHRhZyA9IGV2ZW50LmdldEF0b20oKS5nZXRXYWtlbG9ja1N0YXRlQ2hhbmdlZCgpLmdldFRhZygpOworICAgICAgICAgICAgV2FrZUxvY2tMZXZlbEVudW0gdHlwZSA9IGV2ZW50LmdldEF0b20oKS5nZXRXYWtlbG9ja1N0YXRlQ2hhbmdlZCgpLmdldExldmVsKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCB0YWc6ICIgKyBFWFBFQ1RFRF9UQUcgKyAiLCBidXQgZ290IHRhZzogIiArIHRhZywKKyAgICAgICAgICAgICAgICAgICAgdGFnLmVxdWFscyhFWFBFQ1RFRF9UQUcpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkV4cGVjdGVkIHdha2Vsb2NrIGxldmVsOiAiICsgRVhQRUNURURfTEVWRUwgKyAiLCBidXQgZ290IGxldmVsOiAiICsgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgdHlwZSA9PSBFWFBFQ1RFRF9MRVZFTCk7CisgICAgICAgIH0KKworICAgICAgICAvLz09PT09PT09PT09PT09PT09PT0gdmVyaWZ5IHRoYXQgYmF0dGVyeXN0YXRzIGlzIGNvcnJlY3QgPT09PT09PT09PT09PT09Ly8KKyAgICAgICAgaW50IHVpZCA9IGdldFVpZCgpOworICAgICAgICBhbmRyb2lkLm9zLlRpbWVyUHJvdG8gd2wgPQorICAgICAgICAgICAgICAgIGdldEJhdHRlcnlTdGF0c1BhcnRpYWxXYWtlbG9jayhiYXR0ZXJ5c3RhdHNQcm90bywgdWlkLCBFWFBFQ1RFRF9UQUcpOworCisgICAgICAgIGFzc2VydE5vdE51bGwod2wpOworICAgICAgICBhc3NlcnRUcnVlKHdsLmdldER1cmF0aW9uTXMoKSA+IDApOworICAgICAgICBhc3NlcnRUcnVlKHdsLmdldENvdW50KCkgPT0gMSk7CisgICAgICAgIGFzc2VydFRydWUod2wuZ2V0TWF4RHVyYXRpb25NcygpID49IDUwMCk7CisgICAgICAgIGFzc2VydFRydWUod2wuZ2V0TWF4RHVyYXRpb25NcygpIDwgNzAwKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh3bC5nZXRUb3RhbER1cmF0aW9uTXMoKSA+PSA1MDApOworICAgICAgICBhc3NlcnRUcnVlKHdsLmdldFRvdGFsRHVyYXRpb25NcygpIDwgNzAwKTsKKworICAgICAgICBzZXRBb2RTdGF0ZShhb2RTdGF0ZSk7IC8vIHJlc3RvcmVzIEFPRCB0byBpbml0aWFsIHN0YXRlLgorICAgIH0KKworICAgIEBSZXN0cmljdGVkQnVpbGRUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBhcnRpYWxXYWtlbG9ja0R1cmF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChzdGF0c2REaXNhYmxlZCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFoYXNGZWF0dXJlKEZFQVRVUkVfQVVUT01PVElWRSwgZmFsc2UpKSByZXR1cm47CisgICAgICAgIHR1cm5TY3JlZW5PbigpOyAvLyBUbyBlbnN1cmUgdGhhdCB0aGUgU2NyZWVuT2ZmIGxhdGVyIGdldHMgbG9nZ2VkLgorICAgICAgICAvLyBBb0QgbmVlZHMgdG8gYmUgdHVybmVkIG9mZiBiZWNhdXNlIHRoZSBzY3JlZW4gc2hvdWxkIGdvIGludG8gYW4gb2ZmIHN0YXRlLiBCdXQsIGlmIEFvRCBpcworICAgICAgICAvLyBvbiBhbmQgdGhlIGRldmljZSBkb2Vzbid0IHN1cHBvcnQgU1RBVEVfRE9aRSwgdGhlIHNjcmVlbiBzYWRseSBnb2VzIGJhY2sgdG8gU1RBVEVfT04uCisgICAgICAgIFN0cmluZyBhb2RTdGF0ZSA9IGdldEFvZFN0YXRlKCk7CisgICAgICAgIHNldEFvZFN0YXRlKCIwIik7CisgICAgICAgIHVwbG9hZFdha2Vsb2NrRHVyYXRpb25CYXR0ZXJ5U3RhdHNDb25maWcoVGltZVVuaXQuQ1RTKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKFdBSVRfVElNRV9TSE9SVCk7CisgICAgICAgIHJlc2V0QmF0dGVyeVN0YXRzKCk7CisgICAgICAgIHVucGx1Z0RldmljZSgpOworICAgICAgICB0dXJuU2NyZWVuT2ZmKCk7CisKKyAgICAgICAgVGhyZWFkLnNsZWVwKFdBSVRfVElNRV9TSE9SVCk7CisKKyAgICAgICAgcnVuRGV2aWNlVGVzdHMoREVWSUNFX1NJREVfVEVTVF9QQUNLQUdFLCAiLkF0b21UZXN0cyIsICJ0ZXN0V2FrZWxvY2tTdGF0ZSIpOworICAgICAgICBUaHJlYWQuc2xlZXAoV0FJVF9USU1FX0xPTkcpOyAvLyBNYWtlIHN1cmUgdGhlIG9uZSBzZWNvbmQgYnVja2V0IGhhcyBlbmRlZC4KKworCisgICAgICAgIGZpbmFsIFN0cmluZyBFWFBFQ1RFRF9UQUcgPSAiU3RhdHNkUGFydGlhbFdha2Vsb2NrIjsKKyAgICAgICAgZmluYWwgbG9uZyBFWFBFQ1RFRF9UQUdfSEFTSCA9IExvbmcucGFyc2VVbnNpZ25lZExvbmcoIjE1ODE0NTIzNzk0NzYyODc0NDE0Iik7CisgICAgICAgIGZpbmFsIGludCBFWFBFQ1RFRF9VSUQgPSBnZXRVaWQoKTsKKyAgICAgICAgZmluYWwgaW50IE1JTl9EVVJBVElPTiA9IDM1MDsKKyAgICAgICAgZmluYWwgaW50IE1BWF9EVVJBVElPTiA9IDcwMDsKKworICAgICAgICBCYXR0ZXJ5U3RhdHNQcm90byBiYXR0ZXJ5c3RhdHNQcm90byA9IGdldEJhdHRlcnlTdGF0c1Byb3RvKCk7CisgICAgICAgIEhhc2hNYXA8SW50ZWdlciwgSGFzaE1hcDxMb25nLCBMb25nPj4gc3RhdHNkV2FrZWxvY2tEYXRhID0gZ2V0U3RhdHNkV2FrZWxvY2tEYXRhKCk7CisKKyAgICAgICAgLy8gR2V0IHRoZSBiYXR0ZXJ5c3RhdHMgd2FrZWxvY2sgdGltZSBhbmQgbWFrZSBzdXJlIGl0J3MgcmVhc29uYWJsZS4KKyAgICAgICAgYW5kcm9pZC5vcy5UaW1lclByb3RvIGJzV2FrZWxvY2sgPQorICAgICAgICAgICAgICAgIGdldEJhdHRlcnlTdGF0c1BhcnRpYWxXYWtlbG9jayhiYXR0ZXJ5c3RhdHNQcm90bywgRVhQRUNURURfVUlELCBFWFBFQ1RFRF9UQUcpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJDb3VsZCBub3QgZmluZCBhbnkgcGFydGlhbCB3YWtlbG9ja3Mgd2l0aCB1aWQgIiArIEVYUEVDVEVEX1VJRCArCisgICAgICAgICAgICAgICAgIiBhbmQgdGFnICIgKyBFWFBFQ1RFRF9UQUcgKyAiIGluIEJhdHRlcnlTdGF0cyIsIGJzV2FrZWxvY2spOworICAgICAgICBsb25nIGJzRHVyYXRpb25NcyA9IGJzV2FrZWxvY2suZ2V0VG90YWxEdXJhdGlvbk1zKCk7CisgICAgICAgIGFzc2VydFRydWUoIldha2Vsb2NrIGluIGJhdHRlcnlzdGF0cyB3aXRoIHVpZCAiICsgRVhQRUNURURfVUlEICsgIiBhbmQgdGFnICIKKyAgICAgICAgICAgICAgICArIEVYUEVDVEVEX1RBRyArICJ3YXMgdG9vIHNob3J0LiBFeHBlY3RlZCAiICsgTUlOX0RVUkFUSU9OICsKKyAgICAgICAgICAgICAgICAiLCByZWNlaXZlZCAiICsgYnNEdXJhdGlvbk1zLCBic0R1cmF0aW9uTXMgPj0gTUlOX0RVUkFUSU9OKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiV2FrZWxvY2sgaW4gYmF0dGVyeXN0YXRzIHdpdGggdWlkICIgKyBFWFBFQ1RFRF9VSUQgKyAiIGFuZCB0YWcgIgorICAgICAgICAgICAgICAgICsgRVhQRUNURURfVEFHICsgIndhcyB0b28gbG9uZy4gRXhwZWN0ZWQgIiArIE1BWF9EVVJBVElPTiArCisgICAgICAgICAgICAgICAgIiwgcmVjZWl2ZWQgIiArIGJzRHVyYXRpb25NcywgYnNEdXJhdGlvbk1zIDw9IE1BWF9EVVJBVElPTik7CisKKyAgICAgICAgLy8gR2V0IHRoZSBzdGF0c2Qgd2FrZWxvY2sgdGltZSBhbmQgbWFrZSBzdXJlIGl0J3MgcmVhc29uYWJsZS4KKyAgICAgICAgYXNzZXJ0VHJ1ZSgiQ291bGQgbm90IGZpbmQgYW55IHdha2Vsb2NrcyB3aXRoIHVpZCAiICsgRVhQRUNURURfVUlEICsgIiBpbiBzdGF0c2QiLAorICAgICAgICAgICAgICAgIHN0YXRzZFdha2Vsb2NrRGF0YS5jb250YWluc0tleShFWFBFQ1RFRF9VSUQpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRGlkIG5vdCBmaW5kIGFueSB3YWtlbG9ja3Mgd2l0aCB0YWcgIiArIEVYUEVDVEVEX1RBRyArICIgaW4gc3RhdHNkIiwKKyAgICAgICAgICAgICAgICBzdGF0c2RXYWtlbG9ja0RhdGEuZ2V0KEVYUEVDVEVEX1VJRCkuY29udGFpbnNLZXkoRVhQRUNURURfVEFHX0hBU0gpKTsKKyAgICAgICAgbG9uZyBzdGF0c2REdXJhdGlvbk1zID0gc3RhdHNkV2FrZWxvY2tEYXRhLmdldChFWFBFQ1RFRF9VSUQpCisgICAgICAgICAgICAgICAgLmdldChFWFBFQ1RFRF9UQUdfSEFTSCkgLyAxXzAwMF8wMDA7CisgICAgICAgIGFzc2VydFRydWUoIldha2Vsb2NrIGluIHN0YXRzZCB3aXRoIHVpZCAiICsgRVhQRUNURURfVUlEICsgIiBhbmQgdGFnICIgKyBFWFBFQ1RFRF9UQUcgKworICAgICAgICAgICAgICAgICAgICAid2FzIHRvbyBzaG9ydC4gRXhwZWN0ZWQgIiArIE1JTl9EVVJBVElPTiArICIsIHJlY2VpdmVkICIgKyBzdGF0c2REdXJhdGlvbk1zLAorICAgICAgICAgICAgICAgIHN0YXRzZER1cmF0aW9uTXMgPj0gTUlOX0RVUkFUSU9OKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiV2FrZWxvY2sgaW4gc3RhdHNkIHdpdGggdWlkICIgKyBFWFBFQ1RFRF9VSUQgKyAiIGFuZCB0YWcgIiArIEVYUEVDVEVEX1RBRyArCisgICAgICAgICAgICAgICAgICAgICJ3YXMgdG9vIGxvbmcuIEV4cGVjdGVkICIgKyBNQVhfRFVSQVRJT04gKyAiLCByZWNlaXZlZCAiICsgc3RhdHNkRHVyYXRpb25NcywKKyAgICAgICAgICAgICAgICBzdGF0c2REdXJhdGlvbk1zIDw9IE1BWF9EVVJBVElPTik7CisKKyAgICAgICAgLy8gQ29tcGFyZSBiYXR0ZXJ5c3RhdHMgd2l0aCBzdGF0c2QuCisgICAgICAgIGxvbmcgZGlmZmVyZW5jZSA9IE1hdGguYWJzKHN0YXRzZER1cmF0aW9uTXMgLSBic0R1cmF0aW9uTXMpOworICAgICAgICBhc3NlcnRUcnVlKCJGb3IgdWlkPSIgKyBFWFBFQ1RFRF9VSUQgKyAiIHRhZz0iICsgRVhQRUNURURfVEFHICsgIiBoYWQgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAiQmF0dGVyeVN0YXRzPSIgKyBic0R1cmF0aW9uTXMgKyAibXMgYnV0IHN0YXRzZD0iICsgc3RhdHNkRHVyYXRpb25NcyArICJtcyIsCisgICAgICAgICAgICAgICAgZGlmZmVyZW5jZSA8PSBNYXRoLm1heChic0R1cmF0aW9uTXMgLyAxMCwgMTBMKSk7CisKKyAgICAgICAgc2V0QW9kU3RhdGUoYW9kU3RhdGUpOyAvLyByZXN0b3JlcyBBT0QgdG8gaW5pdGlhbCBzdGF0ZS4KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFydGlhbFdha2Vsb2NrTG9hZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoc3RhdHNkRGlzYWJsZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICghRU5BQkxFX0xPQURfVEVTVCkgcmV0dXJuOworICAgICAgICB0dXJuU2NyZWVuT24oKTsgLy8gVG8gZW5zdXJlIHRoYXQgdGhlIFNjcmVlbk9mZiBsYXRlciBnZXRzIGxvZ2dlZC4KKyAgICAgICAgdXBsb2FkV2FrZWxvY2tEdXJhdGlvbkJhdHRlcnlTdGF0c0NvbmZpZyhUaW1lVW5pdC5DVFMpOworICAgICAgICBUaHJlYWQuc2xlZXAoV0FJVF9USU1FX1NIT1JUKTsKKyAgICAgICAgcmVzZXRCYXR0ZXJ5U3RhdHMoKTsKKyAgICAgICAgdW5wbHVnRGV2aWNlKCk7CisgICAgICAgIHR1cm5TY3JlZW5PZmYoKTsKKworICAgICAgICBydW5EZXZpY2VUZXN0cyhERVZJQ0VfU0lERV9URVNUX1BBQ0tBR0UsICIuQXRvbVRlc3RzIiwgInRlc3RXYWtlbG9ja0xvYWQiKTsKKyAgICAgICAgLy8gR2l2ZSB0aW1lIGZvciBzdHVjayB3YWtlbG9ja3MgdG8gaW5jcmVhc2UgZHVyYXRpb24uCisgICAgICAgIFRocmVhZC5zbGVlcCgxMF8wMDApOworCisKKyAgICAgICAgZmluYWwgU3RyaW5nIEVYUEVDVEVEX1RBRyA9ICJTdGF0c2RQYXJ0aWFsV2FrZWxvY2siOworICAgICAgICBmaW5hbCBpbnQgRVhQRUNURURfVUlEID0gZ2V0VWlkKCk7CisgICAgICAgIGZpbmFsIGludCBOVU1fVEhSRUFEUyA9IDE2OworICAgICAgICBmaW5hbCBpbnQgTlVNX0NPVU5UX1BFUl9USFJFQUQgPSAxMDAwOworICAgICAgICBmaW5hbCBpbnQgTUFYX0RVUkFUSU9OX01TID0gMTVfMDAwOworICAgICAgICBmaW5hbCBpbnQgTUlOX0RVUkFUSU9OX01TID0gMV8wMDA7CisKKworICAgICAgICBCYXR0ZXJ5U3RhdHNQcm90byBiYXR0ZXJ5c3RhdHNQcm90byA9IGdldEJhdHRlcnlTdGF0c1Byb3RvKCk7CisgICAgICAgIEhhc2hNYXA8SW50ZWdlciwgSGFzaE1hcDxMb25nLCBMb25nPj4gc3RhdHNkV2FrZWxvY2tEYXRhID0gZ2V0U3RhdHNkV2FrZWxvY2tEYXRhKCk7CisKKyAgICAgICAgLy8gVE9ETzogdGhpcyBmYWlscyBiZWNhdXNlIHdlIG9ubHkgaGF2ZSB0aGUgaGFzaGVzIG9mIHRoZSB3YWtlbG9jayB0YWdzIGluIHN0YXRzZC4KKyAgICAgICAgLy8gSWYgd2Ugd2FudCB0byBydW4gdGhpcyB0ZXN0LCB3ZSBuZWVkIHRvIGZpeCB0aGlzLgorCisgICAgICAgIC8vIFZlcmlmeSBiYXR0ZXJ5c3RhdHMgb3V0cHV0IGlzIHJlYXNvbmFibGUuCisgICAgICAgIC8vIGJvb2xlYW4gZm91bmRVaWQgPSBmYWxzZTsKKyAgICAgICAgLy8gZm9yIChVaWRQcm90byB1aWRQcm90byA6IGJhdHRlcnlzdGF0c1Byb3RvLmdldFVpZHNMaXN0KCkpIHsKKyAgICAgICAgLy8gICAgIGlmICh1aWRQcm90by5nZXRVaWQoKSA9PSBFWFBFQ1RFRF9VSUQpIHsKKyAgICAgICAgLy8gICAgICAgICBmb3VuZFVpZCA9IHRydWU7CisgICAgICAgIC8vICAgICAgICAgQ0xvZy5kKCJCYXR0ZXJ5IHN0YXRzIGhhcyB0aGUgZm9sbG93aW5nIHdha2Vsb2NrczogXG4iICsKKyAgICAgICAgLy8gICAgICAgICAgICAgICAgIHVpZFByb3RvLmdldFdha2Vsb2Nrc0xpc3QoKSk7CisgICAgICAgIC8vICAgICAgICAgYXNzZXJ0VHJ1ZSgiVWlkUHJvdG8gaGFzIHNpemUgIiAgKyB1aWRQcm90by5nZXRXYWtlbG9ja3NMaXN0KCkuc2l6ZSgpICsKKyAgICAgICAgLy8gICAgICAgICAgICAgICAgICIgd2FrZWxvY2tzIGluIGl0LiBFeHBlY3RlZCAiICsgTlVNX1RIUkVBRFMgKyAiIHdha2Vsb2Nrcy4iLAorICAgICAgICAvLyAgICAgICAgICAgICAgICAgdWlkUHJvdG8uZ2V0V2FrZWxvY2tzTGlzdCgpLnNpemUoKSA9PSBOVU1fVEhSRUFEUyk7CisgICAgICAgIC8vCisgICAgICAgIC8vICAgICAgICAgZm9yIChXYWtlbG9jayB3bCA6IHVpZFByb3RvLmdldFdha2Vsb2Nrc0xpc3QoKSkgeworICAgICAgICAvLyAgICAgICAgICAgICBTdHJpbmcgdGFnID0gd2wuZ2V0TmFtZSgpOworICAgICAgICAvLyAgICAgICAgICAgICBhc3NlcnRUcnVlKCJXYWtlbG9jayB0YWcgaW4gYmF0dGVyeXN0YXRzICIgKyB0YWcgKyAiIGRvZXMgbm90IGNvbnRhaW4gIgorICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICsgImV4cGVjdGVkIHRhZyAiICsgRVhQRUNURURfVEFHLCB0YWcuY29udGFpbnMoRVhQRUNURURfVEFHKSk7CisgICAgICAgIC8vICAgICAgICAgICAgIGFzc2VydFRydWUoIldha2Vsb2NrIGluIGJhdHRlcnlzdGF0cyB3aXRoIHRhZyAiICsgdGFnICsgIiBkb2VzIG5vdCBoYXZlIGFueSAiCisgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJwYXJ0aWFsIHdha2Vsb2NrIGRhdGEuIiwgd2wuaGFzUGFydGlhbCgpKTsKKyAgICAgICAgLy8gICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiV2FrZWxvY2sgaW4gYmF0dGVyeXN0YXRzIHdpdGggdGFnICIgKyB0YWcgKyAiIHRhZyBoYXMgY291bnQgIiArCisgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgd2wuZ2V0UGFydGlhbCgpLmdldENvdW50KCkgKyAiIEV4cGVjdGVkICIgKyBOVU1fQ09VTlRfUEVSX1RIUkVBRCwKKyAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICB3bC5nZXRQYXJ0aWFsKCkuZ2V0Q291bnQoKSA9PSBOVU1fQ09VTlRfUEVSX1RIUkVBRCk7CisgICAgICAgIC8vICAgICAgICAgICAgIGxvbmcgYnNEdXJhdGlvbk1zID0gd2wuZ2V0UGFydGlhbCgpLmdldFRvdGFsRHVyYXRpb25NcygpOworICAgICAgICAvLyAgICAgICAgICAgICBhc3NlcnRUcnVlKCJXYWtlbG9jayBpbiBiYXR0ZXJ5c3RhdHMgd2l0aCB1aWQgIiArIEVYUEVDVEVEX1VJRCArICIgYW5kIHRhZyAiCisgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgKyBFWFBFQ1RFRF9UQUcgKyAid2FzIHRvbyBzaG9ydC4gRXhwZWN0ZWQgIiArIE1JTl9EVVJBVElPTl9NUyArCisgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgIiwgcmVjZWl2ZWQgIiArIGJzRHVyYXRpb25NcywgYnNEdXJhdGlvbk1zID49IE1JTl9EVVJBVElPTl9NUyk7CisgICAgICAgIC8vICAgICAgICAgICAgIGFzc2VydFRydWUoIldha2Vsb2NrIGluIGJhdHRlcnlzdGF0cyB3aXRoIHVpZCAiICsgRVhQRUNURURfVUlEICsgIiBhbmQgdGFnICIKKyAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICArIEVYUEVDVEVEX1RBRyArICJ3YXMgdG9vIGxvbmcuIEV4cGVjdGVkICIgKyBNQVhfRFVSQVRJT05fTVMgKworICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICIsIHJlY2VpdmVkICIgKyBic0R1cmF0aW9uTXMsIGJzRHVyYXRpb25NcyA8PSBNQVhfRFVSQVRJT05fTVMpOworICAgICAgICAvLworICAgICAgICAvLyAgICAgICAgICAgICAvLyBWYWxpZGF0ZSBzdGF0c2QuCisgICAgICAgIC8vICAgICAgICAgICAgIGxvbmcgc3RhdHNkRHVyYXRpb25OcyA9IHN0YXRzZFdha2Vsb2NrRGF0YS5nZXQoRVhQRUNURURfVUlEKS5nZXQodGFnKTsKKyAgICAgICAgLy8gICAgICAgICAgICAgbG9uZyBzdGF0c2REdXJhdGlvbk1zID0gc3RhdHNkRHVyYXRpb25OcyAvIDFfMDAwXzAwMDsKKyAgICAgICAgLy8gICAgICAgICAgICAgbG9uZyBkaWZmZXJlbmNlID0gTWF0aC5hYnMoc3RhdHNkRHVyYXRpb25NcyAtIGJzRHVyYXRpb25Ncyk7CisgICAgICAgIC8vICAgICAgICAgICAgIGFzc2VydFRydWUoIlVudXN1YWxseSBsYXJnZSBkaWZmZXJlbmNlIGluIHdha2Vsb2NrIGR1cmF0aW9uIGZvciB0YWc6ICIgKyB0YWcgKworICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAiLiBTdGF0c2QgaGFkIGR1cmF0aW9uICIgKyBzdGF0c2REdXJhdGlvbk1zICsKKyAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgIiBhbmQgYmF0dGVyeXN0YXRzIGhhZCBkdXJhdGlvbiAiICsgYnNEdXJhdGlvbk1zLAorICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlIDw9IGJzRHVyYXRpb25NcyAvIDEwKTsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gICAgICAgICB9CisgICAgICAgIC8vICAgICB9CisgICAgICAgIC8vIH0KKyAgICAgICAgLy8gYXNzZXJ0VHJ1ZSgiRGlkIG5vdCBmaW5kIHVpZCAiICsgRVhQRUNURURfVUlEICsgIiBpbiBiYXR0ZXJ5c3RhdHMuIiwgZm91bmRVaWQpOworICAgICAgICAvLworICAgICAgICAvLyAvLyBBc3NlcnQgdGhhdCB0aGUgd2FrZWxvY2sgYXBwZWFycyBpbiBzdGF0c2QgYW5kIGlzIGNvcnJlY3QuCisgICAgICAgIC8vIGFzc2VydFRydWUoIkNvdWxkIG5vdCBmaW5kIGFueSB3YWtlbG9ja3Mgd2l0aCB1aWQgIiArIEVYUEVDVEVEX1VJRCArICIgaW4gc3RhdHNkIiwKKyAgICAgICAgLy8gICAgICAgICBzdGF0c2RXYWtlbG9ja0RhdGEuY29udGFpbnNLZXkoRVhQRUNURURfVUlEKSk7CisgICAgICAgIC8vIEhhc2hNYXA8U3RyaW5nLCBMb25nPiBleHBlY3RlZFdha2Vsb2NrcyA9IHN0YXRzZFdha2Vsb2NrRGF0YS5nZXQoRVhQRUNURURfVUlEKTsKKyAgICAgICAgLy8gYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCAiICsgTlVNX1RIUkVBRFMgKyAiIHdha2Vsb2NrcyBpbiBzdGF0c2Qgd2l0aCBVSUQgIiArIEVYUEVDVEVEX1VJRCArCisgICAgICAgIC8vICAgICAgICAgIi4gUmVjZWl2ZWQgIiArIGV4cGVjdGVkV2FrZWxvY2tzLnNpemUoKSwgZXhwZWN0ZWRXYWtlbG9ja3Muc2l6ZSgpLCBOVU1fVEhSRUFEUyk7CisgICAgfQorCisKKyAgICAvLyBIZWxwZXIgZnVuY3Rpb25zCisgICAgLy8gVE9ETzogUmVmYWN0b3IgdGhlc2UgaW50byBzb21lIHV0aWxzIGNsYXNzLgorCisgICAgcHVibGljIEhhc2hNYXA8SW50ZWdlciwgSGFzaE1hcDxMb25nLCBMb25nPj4gZ2V0U3RhdHNkV2FrZWxvY2tEYXRhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0YXRzTG9nUmVwb3J0IHJlcG9ydCA9IGdldFN0YXRzTG9nUmVwb3J0KCk7CisgICAgICAgIENMb2cuZCgiUmVjZWl2ZWQgdGhlIGZvbGxvd2luZyBzdGF0cyBsb2cgcmVwb3J0OiBcbiIgKyByZXBvcnQudG9TdHJpbmcoKSk7CisKKyAgICAgICAgLy8gU3RvcmVzIHRvdGFsIGR1cmF0aW9uIG9mIGVhY2ggd2FrZWxvY2sgYWNyb3NzIGJ1Y2tldHMuCisgICAgICAgIEhhc2hNYXA8SW50ZWdlciwgSGFzaE1hcDxMb25nLCBMb25nPj4gc3RhdHNkV2FrZWxvY2tEYXRhID0gbmV3IEhhc2hNYXA8PigpOworCisgICAgICAgIGZvciAoRHVyYXRpb25NZXRyaWNEYXRhIGRhdGEgOiByZXBvcnQuZ2V0RHVyYXRpb25NZXRyaWNzKCkuZ2V0RGF0YUxpc3QoKSkgeworICAgICAgICAgICAgLy8gR2V0cyB0YWcgYW5kIHVpZC4KKyAgICAgICAgICAgIExpc3Q8RGltZW5zaW9uc1ZhbHVlPiBkaW1zID0gZGF0YS5nZXREaW1lbnNpb25MZWFmVmFsdWVzSW5XaGF0TGlzdCgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgMiBkaW1lbnNpb25zLCByZWNlaXZlZCAiICsgZGltcy5zaXplKCksIGRpbXMuc2l6ZSgpID09IDIpOworICAgICAgICAgICAgYm9vbGVhbiBoYXNUYWcgPSBmYWxzZTsKKyAgICAgICAgICAgIGxvbmcgdGFnID0gMDsKKyAgICAgICAgICAgIGludCB1aWQgPSAtMTsKKyAgICAgICAgICAgIGxvbmcgZHVyYXRpb24gPSAwOworICAgICAgICAgICAgZm9yIChEaW1lbnNpb25zVmFsdWUgZGltIDogZGltcykgeworICAgICAgICAgICAgICAgIGlmIChkaW0uaGFzVmFsdWVJbnQoKSkgeworICAgICAgICAgICAgICAgICAgICB1aWQgPSBkaW0uZ2V0VmFsdWVJbnQoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRpbS5oYXNWYWx1ZVN0ckhhc2goKSkgeworICAgICAgICAgICAgICAgICAgICBoYXNUYWcgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB0YWcgPSBkaW0uZ2V0VmFsdWVTdHJIYXNoKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRGlkIG5vdCByZWNlaXZlIGEgdGFnIGZvciB0aGUgd2FrZWxvY2siLCBoYXNUYWcpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRGlkIG5vdCByZWNlaXZlIGEgdWlkIGZvciB0aGUgd2FrZWxvY2siLCB1aWQgIT0gLTEpOworCisgICAgICAgICAgICAvLyBHZXRzIGR1cmF0aW9uLgorICAgICAgICAgICAgZm9yIChEdXJhdGlvbkJ1Y2tldEluZm8gYnVja2V0SW5mbyA6IGRhdGEuZ2V0QnVja2V0SW5mb0xpc3QoKSkgeworICAgICAgICAgICAgICAgIGR1cmF0aW9uICs9IGJ1Y2tldEluZm8uZ2V0RHVyYXRpb25OYW5vcygpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBTdG9yZSB0aGUgaW5mby4KKyAgICAgICAgICAgIGlmIChzdGF0c2RXYWtlbG9ja0RhdGEuY29udGFpbnNLZXkodWlkKSkgeworICAgICAgICAgICAgICAgIEhhc2hNYXA8TG9uZywgTG9uZz4gdGFnVG9EdXJhdGlvbiA9IHN0YXRzZFdha2Vsb2NrRGF0YS5nZXQodWlkKTsKKyAgICAgICAgICAgICAgICB0YWdUb0R1cmF0aW9uLnB1dCh0YWcsIGR1cmF0aW9uKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgSGFzaE1hcDxMb25nLCBMb25nPiB0YWdUb0R1cmF0aW9uID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICAgICAgICAgIHRhZ1RvRHVyYXRpb24ucHV0KHRhZywgZHVyYXRpb24pOworICAgICAgICAgICAgICAgIHN0YXRzZFdha2Vsb2NrRGF0YS5wdXQodWlkLCB0YWdUb0R1cmF0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBDTG9nLmQoImZvbGxvdzogc3RhdHNkd2FrZWxvY2tkYXRhIGlzOiAiICsgc3RhdHNkV2FrZWxvY2tEYXRhKTsKKyAgICAgICAgcmV0dXJuIHN0YXRzZFdha2Vsb2NrRGF0YTsKKyAgICB9CisKKyAgICBwcml2YXRlIGFuZHJvaWQub3MuVGltZXJQcm90byBnZXRCYXR0ZXJ5U3RhdHNQYXJ0aWFsV2FrZWxvY2soQmF0dGVyeVN0YXRzUHJvdG8gcHJvdG8sCisgICAgICAgICAgICBsb25nIHVpZCwgU3RyaW5nIHRhZykgeworICAgICAgICBpZiAocHJvdG8uZ2V0VWlkc0xpc3QoKS5zaXplKCkgPCAxKSB7CisgICAgICAgICAgICBDTG9nLncoIkJhdHRlcnlzdGF0cyBwcm90byBjb250YWlucyBubyB1aWRzIik7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIGhhZFVpZCA9IGZhbHNlOworICAgICAgICBmb3IgKFVpZFByb3RvIHVpZFByb3RvIDogcHJvdG8uZ2V0VWlkc0xpc3QoKSkgeworICAgICAgICAgICAgaWYgKHVpZFByb3RvLmdldFVpZCgpID09IHVpZCkgeworICAgICAgICAgICAgICAgIGhhZFVpZCA9IHRydWU7CisgICAgICAgICAgICAgICAgZm9yIChXYWtlbG9jayB3bCA6IHVpZFByb3RvLmdldFdha2Vsb2Nrc0xpc3QoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAodGFnLmVxdWFscyh3bC5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2wuaGFzUGFydGlhbCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdsLmdldFBhcnRpYWwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIENMb2cudygiQmF0dGVyeXN0YXRzIGhhZCB3YWtlbG9jayBmb3IgdWlkICgiICsgdWlkICsgIikgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJ3aXRoIHRhZyAoIiArIHRhZyArICIpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYnV0IGl0IGRpZG4ndCBoYXZlIGEgcGFydGlhbCB3YWtlbG9jayIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENMb2cudygiQmF0dGVyeXN0YXRzIGRpZG4ndCBoYXZlIGEgcGFydGlhbCB3YWtlbG9jayBmb3IgdWlkICIgKyB1aWQKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiB3aXRoIHRhZyAiICsgdGFnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWhhZFVpZCkgQ0xvZy53KCJCYXR0ZXJ5c3RhdHMgZGlkbid0IGhhdmUgdWlkICIgKyB1aWQpOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGxvYWRXYWtlbG9ja0R1cmF0aW9uQmF0dGVyeVN0YXRzQ29uZmlnKFRpbWVVbml0IGJ1Y2tldHNpemUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBpbnQgYXRvbVRhZyA9IEF0b20uV0FLRUxPQ0tfU1RBVEVfQ0hBTkdFRF9GSUVMRF9OVU1CRVI7CisgICAgICAgIFN0cmluZyBtZXRyaWNOYW1lID0gIkRVUkFUSU9OX1BBUlRJQUxfV0FLRUxPQ0tfUEVSX1RBR19VSURfV0hJTEVfU0NSRUVOX09GRl9PTl9CQVRURVJZIjsKKyAgICAgICAgaW50IG1ldHJpY0lkID0gbWV0cmljTmFtZS5oYXNoQ29kZSgpOworCisgICAgICAgIFN0cmluZyBwYXJ0aWFsV2FrZWxvY2tJc09uTmFtZSA9ICJQQVJUSUFMX1dBS0VMT0NLX0lTX09OIjsKKyAgICAgICAgaW50IHBhcnRpYWxXYWtlbG9ja0lzT25JZCA9IHBhcnRpYWxXYWtlbG9ja0lzT25OYW1lLmhhc2hDb2RlKCk7CisKKyAgICAgICAgU3RyaW5nIHBhcnRpYWxXYWtlbG9ja09uTmFtZSA9ICJQQVJUSUFMX1dBS0VMT0NLX09OIjsKKyAgICAgICAgaW50IHBhcnRpYWxXYWtlbG9ja09uSWQgPSBwYXJ0aWFsV2FrZWxvY2tPbk5hbWUuaGFzaENvZGUoKTsKKyAgICAgICAgU3RyaW5nIHBhcnRpYWxXYWtlbG9ja09mZk5hbWUgPSAiUEFSVElBTF9XQUtFTE9DS19PRkYiOworICAgICAgICBpbnQgcGFydGlhbFdha2Vsb2NrT2ZmSWQgPSBwYXJ0aWFsV2FrZWxvY2tPZmZOYW1lLmhhc2hDb2RlKCk7CisKKyAgICAgICAgU3RyaW5nIHBhcnRpYWxXYWtlbG9ja0FjcXVpcmVOYW1lID0gIlBBUlRJQUxfV0FLRUxPQ0tfQUNRVUlSRSI7CisgICAgICAgIGludCBwYXJ0aWFsV2FrZWxvY2tBY3F1aXJlSWQgPSBwYXJ0aWFsV2FrZWxvY2tBY3F1aXJlTmFtZS5oYXNoQ29kZSgpOworICAgICAgICBTdHJpbmcgcGFydGlhbFdha2Vsb2NrQ2hhbmdlQWNxdWlyZU5hbWUgPSAiUEFSVElBTF9XQUtFTE9DS19DSEFOR0VfQUNRVUlSRSI7CisgICAgICAgIGludCBwYXJ0aWFsV2FrZWxvY2tDaGFuZ2VBY3F1aXJlSWQgPSBwYXJ0aWFsV2FrZWxvY2tDaGFuZ2VBY3F1aXJlTmFtZS5oYXNoQ29kZSgpOworCisgICAgICAgIFN0cmluZyBwYXJ0aWFsV2FrZWxvY2tSZWxlYXNlTmFtZSA9ICJQQVJUSUFMX1dBS0VMT0NLX1JFTEVBU0UiOworICAgICAgICBpbnQgcGFydGlhbFdha2Vsb2NrUmVsZWFzZUlkID0gcGFydGlhbFdha2Vsb2NrUmVsZWFzZU5hbWUuaGFzaENvZGUoKTsKKyAgICAgICAgU3RyaW5nIHBhcnRpYWxXYWtlbG9ja0NoYW5nZVJlbGVhc2VOYW1lID0gIlBBUlRJQUxfV0FLRUxPQ0tfQ0hBTkdFX1JFTEVBU0UiOworICAgICAgICBpbnQgcGFydGlhbFdha2Vsb2NrQ2hhbmdlUmVsZWFzZUlkID0gcGFydGlhbFdha2Vsb2NrQ2hhbmdlUmVsZWFzZU5hbWUuaGFzaENvZGUoKTsKKworCisgICAgICAgIFN0cmluZyBzY3JlZW5PZmZCYXR0ZXJ5T25OYW1lID0gIlNDUkVFTl9JU19PRkZfT05fQkFUVEVSWSI7CisgICAgICAgIGludCBzY3JlZW5PZmZCYXR0ZXJ5T25JZCA9IHNjcmVlbk9mZkJhdHRlcnlPbk5hbWUuaGFzaENvZGUoKTsKKworICAgICAgICBTdHJpbmcgc2NyZWVuU3RhdGVVbmtub3duTmFtZSA9ICJTQ1JFRU5fU1RBVEVfVU5LTk9XTiI7CisgICAgICAgIGludCBzY3JlZW5TdGF0ZVVua25vd25JZCA9IHNjcmVlblN0YXRlVW5rbm93bk5hbWUuaGFzaENvZGUoKTsKKyAgICAgICAgU3RyaW5nIHNjcmVlblN0YXRlT2ZmTmFtZSA9ICJTQ1JFRU5fU1RBVEVfT0ZGIjsKKyAgICAgICAgaW50IHNjcmVlblN0YXRlT2ZmSWQgPSBzY3JlZW5TdGF0ZU9mZk5hbWUuaGFzaENvZGUoKTsKKyAgICAgICAgU3RyaW5nIHNjcmVlblN0YXRlT25OYW1lID0gIlNDUkVFTl9TVEFURV9PTiI7CisgICAgICAgIGludCBzY3JlZW5TdGF0ZU9uSWQgPSBzY3JlZW5TdGF0ZU9uTmFtZS5oYXNoQ29kZSgpOworICAgICAgICBTdHJpbmcgc2NyZWVuU3RhdGVEb3plTmFtZSA9ICJTQ1JFRU5fU1RBVEVfRE9aRSI7CisgICAgICAgIGludCBzY3JlZW5TdGF0ZURvemVJZCA9IHNjcmVlblN0YXRlRG96ZU5hbWUuaGFzaENvZGUoKTsKKyAgICAgICAgU3RyaW5nIHNjcmVlblN0YXRlRG96ZVN1c3BlbmROYW1lID0gIlNDUkVFTl9TVEFURV9ET1pFX1NVU1BFTkQiOworICAgICAgICBpbnQgc2NyZWVuU3RhdGVEb3plU3VzcGVuZElkID0gc2NyZWVuU3RhdGVEb3plU3VzcGVuZE5hbWUuaGFzaENvZGUoKTsKKyAgICAgICAgU3RyaW5nIHNjcmVlblN0YXRlVnJOYW1lID0gIlNDUkVFTl9TVEFURV9WUiI7CisgICAgICAgIGludCBzY3JlZW5TdGF0ZVZySWQgPSBzY3JlZW5TdGF0ZVZyTmFtZS5oYXNoQ29kZSgpOworICAgICAgICBTdHJpbmcgc2NyZWVuU3RhdGVPblN1c3BlbmROYW1lID0gIlNDUkVFTl9TVEFURV9PTl9TVVNQRU5EIjsKKyAgICAgICAgaW50IHNjcmVlblN0YXRlT25TdXNwZW5kSWQgPSBzY3JlZW5TdGF0ZU9uU3VzcGVuZE5hbWUuaGFzaENvZGUoKTsKKworICAgICAgICBTdHJpbmcgc2NyZWVuVHVybmVkT25OYW1lID0gIlNDUkVFTl9UVVJORURfT04iOworICAgICAgICBpbnQgc2NyZWVuVHVybmVkT25JZCA9IHNjcmVlblR1cm5lZE9uTmFtZS5oYXNoQ29kZSgpOworICAgICAgICBTdHJpbmcgc2NyZWVuVHVybmVkT2ZmTmFtZSA9ICJTQ1JFRU5fVFVSTkVEX09GRiI7CisgICAgICAgIGludCBzY3JlZW5UdXJuZWRPZmZJZCA9IHNjcmVlblR1cm5lZE9mZk5hbWUuaGFzaENvZGUoKTsKKworICAgICAgICBTdHJpbmcgc2NyZWVuSXNPZmZOYW1lID0gIlNDUkVFTl9JU19PRkYiOworICAgICAgICBpbnQgc2NyZWVuSXNPZmZJZCA9IHNjcmVlbklzT2ZmTmFtZS5oYXNoQ29kZSgpOworCisgICAgICAgIFN0cmluZyBwbHVnZ2VkU3RhdGVCYXR0ZXJ5UGx1Z2dlZE5vbmVOYW1lID0gIlBMVUdHRURfU1RBVEVfQkFUVEVSWV9QTFVHR0VEX05PTkUiOworICAgICAgICBpbnQgcGx1Z2dlZFN0YXRlQmF0dGVyeVBsdWdnZWROb25lSWQgPSBwbHVnZ2VkU3RhdGVCYXR0ZXJ5UGx1Z2dlZE5vbmVOYW1lLmhhc2hDb2RlKCk7CisgICAgICAgIFN0cmluZyBwbHVnZ2VkU3RhdGVCYXR0ZXJ5UGx1Z2dlZEFjTmFtZSA9ICJQTFVHR0VEX1NUQVRFX0JBVFRFUllfUExVR0dFRF9BQyI7CisgICAgICAgIGludCBwbHVnZ2VkU3RhdGVCYXR0ZXJ5UGx1Z2dlZEFjSWQgPSBwbHVnZ2VkU3RhdGVCYXR0ZXJ5UGx1Z2dlZEFjTmFtZS5oYXNoQ29kZSgpOworICAgICAgICBTdHJpbmcgcGx1Z2dlZFN0YXRlQmF0dGVyeVBsdWdnZWRVc2JOYW1lID0gIlBMVUdHRURfU1RBVEVfQkFUVEVSWV9QTFVHR0VEX1VTQiI7CisgICAgICAgIGludCBwbHVnZ2VkU3RhdGVCYXR0ZXJ5UGx1Z2dlZFVzYklkID0gcGx1Z2dlZFN0YXRlQmF0dGVyeVBsdWdnZWRVc2JOYW1lLmhhc2hDb2RlKCk7CisgICAgICAgIFN0cmluZyBwbHVnZ2VkU3RhdGVCYXR0ZXJ5UGx1Z2dlZFdsTmFtZSA9ICJQTFVHR0VEX1NUQVRFX0JBVFRFUllfUExVR0dFRF9XSVJFTEVTUyI7CisgICAgICAgIGludCBwbHVnZ2VkU3RhdGVCYXR0ZXJ5UGx1Z2dlZFdpcmVsZXNzSWQgPSBwbHVnZ2VkU3RhdGVCYXR0ZXJ5UGx1Z2dlZFdsTmFtZS5oYXNoQ29kZSgpOworCisgICAgICAgIFN0cmluZyBwbHVnZ2VkU3RhdGVCYXR0ZXJ5UGx1Z2dlZE5hbWUgPSAiUExVR0dFRF9TVEFURV9CQVRURVJZX1BMVUdHRUQiOworICAgICAgICBpbnQgcGx1Z2dlZFN0YXRlQmF0dGVyeVBsdWdnZWRJZCA9IHBsdWdnZWRTdGF0ZUJhdHRlcnlQbHVnZ2VkTmFtZS5oYXNoQ29kZSgpOworCisgICAgICAgIFN0cmluZyBkZXZpY2VJc1VucGx1Z2dlZE5hbWUgPSAiREVWSUNFX0lTX1VOUExVR0dFRCI7CisgICAgICAgIGludCBkZXZpY2VJc1VucGx1Z2dlZElkID0gZGV2aWNlSXNVbnBsdWdnZWROYW1lLmhhc2hDb2RlKCk7CisKKworCisgICAgICAgIEZpZWxkTWF0Y2hlci5CdWlsZGVyIGRpbWVuc2lvbnMgPSBGaWVsZE1hdGNoZXIubmV3QnVpbGRlcigpCisgICAgICAgICAgICAuc2V0RmllbGQoYXRvbVRhZykKKyAgICAgICAgICAgIC5hZGRDaGlsZChGaWVsZE1hdGNoZXIubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldEZpZWxkKFdha2Vsb2NrU3RhdGVDaGFuZ2VkLlRBR19GSUVMRF9OVU1CRVIpKQorICAgICAgICAgICAgLmFkZENoaWxkKEZpZWxkTWF0Y2hlci5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0RmllbGQoMSkKKyAgICAgICAgICAgICAgICAuc2V0UG9zaXRpb24oUG9zaXRpb24uRklSU1QpCisgICAgICAgICAgICAgICAgLmFkZENoaWxkKEZpZWxkTWF0Y2hlci5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKDEpKSk7CisKKyAgICAgICAgQXRvbU1hdGNoZXIuQnVpbGRlciB3YWtlbG9ja0FjcXVpcmUgPSBBdG9tTWF0Y2hlci5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgIC5zZXRJZChwYXJ0aWFsV2FrZWxvY2tBY3F1aXJlSWQpCisgICAgICAgICAgICAuc2V0U2ltcGxlQXRvbU1hdGNoZXIoU2ltcGxlQXRvbU1hdGNoZXIubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldEF0b21JZChhdG9tVGFnKQorICAgICAgICAgICAgICAgIC5hZGRGaWVsZFZhbHVlTWF0Y2hlcihGaWVsZFZhbHVlTWF0Y2hlci5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKFdha2Vsb2NrU3RhdGVDaGFuZ2VkLkxFVkVMX0ZJRUxEX05VTUJFUikKKyAgICAgICAgICAgICAgICAgICAgLnNldEVxSW50KFdha2VMb2NrTGV2ZWxFbnVtLlBBUlRJQUxfV0FLRV9MT0NLX1ZBTFVFKSkKKyAgICAgICAgICAgICAgICAuYWRkRmllbGRWYWx1ZU1hdGNoZXIoRmllbGRWYWx1ZU1hdGNoZXIubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChXYWtlbG9ja1N0YXRlQ2hhbmdlZC5TVEFURV9GSUVMRF9OVU1CRVIpCisgICAgICAgICAgICAgICAgICAgIC5zZXRFcUludChXYWtlbG9ja1N0YXRlQ2hhbmdlZC5TdGF0ZS5BQ1FVSVJFX1ZBTFVFKSkpOworCisgICAgICAgIEF0b21NYXRjaGVyLkJ1aWxkZXIgd2FrZWxvY2tDaGFuZ2VBY3F1aXJlID0gQXRvbU1hdGNoZXIubmV3QnVpbGRlcigpCisgICAgICAgICAgICAuc2V0SWQocGFydGlhbFdha2Vsb2NrQ2hhbmdlQWNxdWlyZUlkKQorICAgICAgICAgICAgLnNldFNpbXBsZUF0b21NYXRjaGVyKFNpbXBsZUF0b21NYXRjaGVyLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRBdG9tSWQoYXRvbVRhZykKKyAgICAgICAgICAgICAgICAuYWRkRmllbGRWYWx1ZU1hdGNoZXIoRmllbGRWYWx1ZU1hdGNoZXIubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChXYWtlbG9ja1N0YXRlQ2hhbmdlZC5MRVZFTF9GSUVMRF9OVU1CRVIpCisgICAgICAgICAgICAgICAgICAgIC5zZXRFcUludChXYWtlTG9ja0xldmVsRW51bS5QQVJUSUFMX1dBS0VfTE9DS19WQUxVRSkpCisgICAgICAgICAgICAgICAgLmFkZEZpZWxkVmFsdWVNYXRjaGVyKEZpZWxkVmFsdWVNYXRjaGVyLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoV2FrZWxvY2tTdGF0ZUNoYW5nZWQuU1RBVEVfRklFTERfTlVNQkVSKQorICAgICAgICAgICAgICAgICAgICAuc2V0RXFJbnQoV2FrZWxvY2tTdGF0ZUNoYW5nZWQuU3RhdGUuQ0hBTkdFX0FDUVVJUkVfVkFMVUUpKSk7CisKKyAgICAgICAgQXRvbU1hdGNoZXIuQnVpbGRlciB3YWtlbG9ja1JlbGVhc2UgPSBBdG9tTWF0Y2hlci5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgIC5zZXRJZChwYXJ0aWFsV2FrZWxvY2tSZWxlYXNlSWQpCisgICAgICAgICAgICAuc2V0U2ltcGxlQXRvbU1hdGNoZXIoU2ltcGxlQXRvbU1hdGNoZXIubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldEF0b21JZChhdG9tVGFnKQorICAgICAgICAgICAgICAgIC5hZGRGaWVsZFZhbHVlTWF0Y2hlcihGaWVsZFZhbHVlTWF0Y2hlci5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKFdha2Vsb2NrU3RhdGVDaGFuZ2VkLkxFVkVMX0ZJRUxEX05VTUJFUikKKyAgICAgICAgICAgICAgICAgICAgLnNldEVxSW50KFdha2VMb2NrTGV2ZWxFbnVtLlBBUlRJQUxfV0FLRV9MT0NLX1ZBTFVFKSkKKyAgICAgICAgICAgICAgICAuYWRkRmllbGRWYWx1ZU1hdGNoZXIoRmllbGRWYWx1ZU1hdGNoZXIubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChXYWtlbG9ja1N0YXRlQ2hhbmdlZC5TVEFURV9GSUVMRF9OVU1CRVIpCisgICAgICAgICAgICAgICAgICAgIC5zZXRFcUludChXYWtlbG9ja1N0YXRlQ2hhbmdlZC5TdGF0ZS5SRUxFQVNFX1ZBTFVFKSkpOworCisgICAgICAgIEF0b21NYXRjaGVyLkJ1aWxkZXIgd2FrZWxvY2tDaGFuZ2VSZWxlYXNlID0gQXRvbU1hdGNoZXIubmV3QnVpbGRlcigpCisgICAgICAgICAgICAuc2V0SWQocGFydGlhbFdha2Vsb2NrQ2hhbmdlUmVsZWFzZUlkKQorICAgICAgICAgICAgLnNldFNpbXBsZUF0b21NYXRjaGVyKFNpbXBsZUF0b21NYXRjaGVyLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRBdG9tSWQoYXRvbVRhZykKKyAgICAgICAgICAgICAgICAuYWRkRmllbGRWYWx1ZU1hdGNoZXIoRmllbGRWYWx1ZU1hdGNoZXIubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChXYWtlbG9ja1N0YXRlQ2hhbmdlZC5MRVZFTF9GSUVMRF9OVU1CRVIpCisgICAgICAgICAgICAgICAgICAgIC5zZXRFcUludChXYWtlTG9ja0xldmVsRW51bS5QQVJUSUFMX1dBS0VfTE9DS19WQUxVRSkpCisgICAgICAgICAgICAgICAgLmFkZEZpZWxkVmFsdWVNYXRjaGVyKEZpZWxkVmFsdWVNYXRjaGVyLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoV2FrZWxvY2tTdGF0ZUNoYW5nZWQuU1RBVEVfRklFTERfTlVNQkVSKQorICAgICAgICAgICAgICAgICAgICAuc2V0RXFJbnQoV2FrZWxvY2tTdGF0ZUNoYW5nZWQuU3RhdGUuQ0hBTkdFX1JFTEVBU0VfVkFMVUUpKSk7CisKKyAgICAgICAgQXRvbU1hdGNoZXIuQnVpbGRlciB3YWtlbG9ja09uID0gQXRvbU1hdGNoZXIubmV3QnVpbGRlcigpCisgICAgICAgICAgICAuc2V0SWQocGFydGlhbFdha2Vsb2NrT25JZCkKKyAgICAgICAgICAgIC5zZXRDb21iaW5hdGlvbihBdG9tTWF0Y2hlci5Db21iaW5hdGlvbi5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0T3BlcmF0aW9uKExvZ2ljYWxPcGVyYXRpb24uT1IpCisgICAgICAgICAgICAgICAgLmFkZE1hdGNoZXIocGFydGlhbFdha2Vsb2NrQWNxdWlyZUlkKQorICAgICAgICAgICAgICAgIC5hZGRNYXRjaGVyKHBhcnRpYWxXYWtlbG9ja0NoYW5nZUFjcXVpcmVJZCkpOworCisgICAgICAgIEF0b21NYXRjaGVyLkJ1aWxkZXIgd2FrZWxvY2tPZmYgPSBBdG9tTWF0Y2hlci5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgIC5zZXRJZChwYXJ0aWFsV2FrZWxvY2tPZmZJZCkKKyAgICAgICAgICAgIC5zZXRDb21iaW5hdGlvbihBdG9tTWF0Y2hlci5Db21iaW5hdGlvbi5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0T3BlcmF0aW9uKExvZ2ljYWxPcGVyYXRpb24uT1IpCisgICAgICAgICAgICAgICAgLmFkZE1hdGNoZXIocGFydGlhbFdha2Vsb2NrUmVsZWFzZUlkKQorICAgICAgICAgICAgICAgIC5hZGRNYXRjaGVyKHBhcnRpYWxXYWtlbG9ja0NoYW5nZVJlbGVhc2VJZCkpOworCisKKyAgICAgICAgUHJlZGljYXRlLkJ1aWxkZXIgd2FrZWxvY2tQcmVkaWNhdGUgPSBQcmVkaWNhdGUubmV3QnVpbGRlcigpCisgICAgICAgICAgICAuc2V0SWQocGFydGlhbFdha2Vsb2NrSXNPbklkKQorICAgICAgICAgICAgLnNldFNpbXBsZVByZWRpY2F0ZShTaW1wbGVQcmVkaWNhdGUubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldFN0YXJ0KHBhcnRpYWxXYWtlbG9ja09uSWQpCisgICAgICAgICAgICAgICAgLnNldFN0b3AocGFydGlhbFdha2Vsb2NrT2ZmSWQpCisgICAgICAgICAgICAgICAgLnNldENvdW50TmVzdGluZyh0cnVlKQorICAgICAgICAgICAgICAgIC5zZXREaW1lbnNpb25zKGRpbWVuc2lvbnMpKTsKKworICAgICAgICBBdG9tTWF0Y2hlci5CdWlsZGVyIHBsdWdnZWRTdGF0ZUJhdHRlcnlQbHVnZ2VkTm9uZSA9IEF0b21NYXRjaGVyLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgLnNldElkKHBsdWdnZWRTdGF0ZUJhdHRlcnlQbHVnZ2VkTm9uZUlkKQorICAgICAgICAgICAgLnNldFNpbXBsZUF0b21NYXRjaGVyKFNpbXBsZUF0b21NYXRjaGVyLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRBdG9tSWQoQXRvbS5QTFVHR0VEX1NUQVRFX0NIQU5HRURfRklFTERfTlVNQkVSKQorICAgICAgICAgICAgICAgIC5hZGRGaWVsZFZhbHVlTWF0Y2hlcihGaWVsZFZhbHVlTWF0Y2hlci5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKFBsdWdnZWRTdGF0ZUNoYW5nZWQuU1RBVEVfRklFTERfTlVNQkVSKQorICAgICAgICAgICAgICAgICAgICAuc2V0RXFJbnQoQmF0dGVyeVBsdWdnZWRTdGF0ZUVudW0uQkFUVEVSWV9QTFVHR0VEX05PTkVfVkFMVUUpKSk7CisKKyAgICAgICAgQXRvbU1hdGNoZXIuQnVpbGRlciBwbHVnZ2VkU3RhdGVCYXR0ZXJ5UGx1Z2dlZEFjID0gQXRvbU1hdGNoZXIubmV3QnVpbGRlcigpCisgICAgICAgICAgICAuc2V0SWQocGx1Z2dlZFN0YXRlQmF0dGVyeVBsdWdnZWRBY0lkKQorICAgICAgICAgICAgLnNldFNpbXBsZUF0b21NYXRjaGVyKFNpbXBsZUF0b21NYXRjaGVyLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRBdG9tSWQoQXRvbS5QTFVHR0VEX1NUQVRFX0NIQU5HRURfRklFTERfTlVNQkVSKQorICAgICAgICAgICAgICAgIC5hZGRGaWVsZFZhbHVlTWF0Y2hlcihGaWVsZFZhbHVlTWF0Y2hlci5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKFBsdWdnZWRTdGF0ZUNoYW5nZWQuU1RBVEVfRklFTERfTlVNQkVSKQorICAgICAgICAgICAgICAgICAgICAuc2V0RXFJbnQoQmF0dGVyeVBsdWdnZWRTdGF0ZUVudW0uQkFUVEVSWV9QTFVHR0VEX0FDX1ZBTFVFKSkpOworCisgICAgICAgIEF0b21NYXRjaGVyLkJ1aWxkZXIgcGx1Z2dlZFN0YXRlQmF0dGVyeVBsdWdnZWRVc2IgPSBBdG9tTWF0Y2hlci5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgIC5zZXRJZChwbHVnZ2VkU3RhdGVCYXR0ZXJ5UGx1Z2dlZFVzYklkKQorICAgICAgICAgICAgLnNldFNpbXBsZUF0b21NYXRjaGVyKFNpbXBsZUF0b21NYXRjaGVyLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRBdG9tSWQoQXRvbS5QTFVHR0VEX1NUQVRFX0NIQU5HRURfRklFTERfTlVNQkVSKQorICAgICAgICAgICAgICAgIC5hZGRGaWVsZFZhbHVlTWF0Y2hlcihGaWVsZFZhbHVlTWF0Y2hlci5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKFBsdWdnZWRTdGF0ZUNoYW5nZWQuU1RBVEVfRklFTERfTlVNQkVSKQorICAgICAgICAgICAgICAgICAgICAuc2V0RXFJbnQoQmF0dGVyeVBsdWdnZWRTdGF0ZUVudW0uQkFUVEVSWV9QTFVHR0VEX1VTQl9WQUxVRSkpKTsKKworICAgICAgICBBdG9tTWF0Y2hlci5CdWlsZGVyIHBsdWdnZWRTdGF0ZUJhdHRlcnlQbHVnZ2VkV2lyZWxlc3MgPSBBdG9tTWF0Y2hlci5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgIC5zZXRJZChwbHVnZ2VkU3RhdGVCYXR0ZXJ5UGx1Z2dlZFdpcmVsZXNzSWQpCisgICAgICAgICAgICAuc2V0U2ltcGxlQXRvbU1hdGNoZXIoU2ltcGxlQXRvbU1hdGNoZXIubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldEF0b21JZChBdG9tLlBMVUdHRURfU1RBVEVfQ0hBTkdFRF9GSUVMRF9OVU1CRVIpCisgICAgICAgICAgICAgICAgLmFkZEZpZWxkVmFsdWVNYXRjaGVyKEZpZWxkVmFsdWVNYXRjaGVyLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoUGx1Z2dlZFN0YXRlQ2hhbmdlZC5TVEFURV9GSUVMRF9OVU1CRVIpCisgICAgICAgICAgICAgICAgICAgIC5zZXRFcUludChCYXR0ZXJ5UGx1Z2dlZFN0YXRlRW51bS5CQVRURVJZX1BMVUdHRURfV0lSRUxFU1NfVkFMVUUpKSk7CisKKyAgICAgICAgQXRvbU1hdGNoZXIuQnVpbGRlciBwbHVnZ2VkU3RhdGVCYXR0ZXJ5UGx1Z2dlZCA9IEF0b21NYXRjaGVyLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgLnNldElkKHBsdWdnZWRTdGF0ZUJhdHRlcnlQbHVnZ2VkSWQpCisgICAgICAgICAgICAuc2V0Q29tYmluYXRpb24oQXRvbU1hdGNoZXIuQ29tYmluYXRpb24ubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldE9wZXJhdGlvbihMb2dpY2FsT3BlcmF0aW9uLk9SKQorICAgICAgICAgICAgICAgIC5hZGRNYXRjaGVyKHBsdWdnZWRTdGF0ZUJhdHRlcnlQbHVnZ2VkQWNJZCkKKyAgICAgICAgICAgICAgICAuYWRkTWF0Y2hlcihwbHVnZ2VkU3RhdGVCYXR0ZXJ5UGx1Z2dlZFVzYklkKQorICAgICAgICAgICAgICAgIC5hZGRNYXRjaGVyKHBsdWdnZWRTdGF0ZUJhdHRlcnlQbHVnZ2VkV2lyZWxlc3NJZCkpOworCisgICAgICAgIFByZWRpY2F0ZS5CdWlsZGVyIGRldmljZUlzVW5wbHVnZ2VkID0gUHJlZGljYXRlLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgLnNldElkKGRldmljZUlzVW5wbHVnZ2VkSWQpCisgICAgICAgICAgICAuc2V0U2ltcGxlUHJlZGljYXRlKFNpbXBsZVByZWRpY2F0ZS5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0U3RhcnQocGx1Z2dlZFN0YXRlQmF0dGVyeVBsdWdnZWROb25lSWQpCisgICAgICAgICAgICAgICAgLnNldFN0b3AocGx1Z2dlZFN0YXRlQmF0dGVyeVBsdWdnZWRJZCkKKyAgICAgICAgICAgICAgICAuc2V0Q291bnROZXN0aW5nKGZhbHNlKSk7CisKKyAgICAgICAgQXRvbU1hdGNoZXIuQnVpbGRlciBzY3JlZW5TdGF0ZVVua25vd24gPSBBdG9tTWF0Y2hlci5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgIC5zZXRJZChzY3JlZW5TdGF0ZVVua25vd25JZCkKKyAgICAgICAgICAgIC5zZXRTaW1wbGVBdG9tTWF0Y2hlcihTaW1wbGVBdG9tTWF0Y2hlci5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0QXRvbUlkKEF0b20uU0NSRUVOX1NUQVRFX0NIQU5HRURfRklFTERfTlVNQkVSKQorICAgICAgICAgICAgICAgIC5hZGRGaWVsZFZhbHVlTWF0Y2hlcihGaWVsZFZhbHVlTWF0Y2hlci5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKFNjcmVlblN0YXRlQ2hhbmdlZC5TVEFURV9GSUVMRF9OVU1CRVIpCisgICAgICAgICAgICAgICAgICAgIC5zZXRFcUludChEaXNwbGF5U3RhdGVFbnVtLkRJU1BMQVlfU1RBVEVfVU5LTk9XTl9WQUxVRSkpKTsKKworICAgICAgICBBdG9tTWF0Y2hlci5CdWlsZGVyIHNjcmVlblN0YXRlT2ZmID0gQXRvbU1hdGNoZXIubmV3QnVpbGRlcigpCisgICAgICAgICAgICAuc2V0SWQoc2NyZWVuU3RhdGVPZmZJZCkKKyAgICAgICAgICAgIC5zZXRTaW1wbGVBdG9tTWF0Y2hlcihTaW1wbGVBdG9tTWF0Y2hlci5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0QXRvbUlkKEF0b20uU0NSRUVOX1NUQVRFX0NIQU5HRURfRklFTERfTlVNQkVSKQorICAgICAgICAgICAgICAgIC5hZGRGaWVsZFZhbHVlTWF0Y2hlcihGaWVsZFZhbHVlTWF0Y2hlci5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKFNjcmVlblN0YXRlQ2hhbmdlZC5TVEFURV9GSUVMRF9OVU1CRVIpCisgICAgICAgICAgICAgICAgICAgIC5zZXRFcUludChEaXNwbGF5U3RhdGVFbnVtLkRJU1BMQVlfU1RBVEVfT0ZGX1ZBTFVFKSkpOworCisgICAgICAgIEF0b21NYXRjaGVyLkJ1aWxkZXIgc2NyZWVuU3RhdGVPbiA9IEF0b21NYXRjaGVyLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgLnNldElkKHNjcmVlblN0YXRlT25JZCkKKyAgICAgICAgICAgIC5zZXRTaW1wbGVBdG9tTWF0Y2hlcihTaW1wbGVBdG9tTWF0Y2hlci5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0QXRvbUlkKEF0b20uU0NSRUVOX1NUQVRFX0NIQU5HRURfRklFTERfTlVNQkVSKQorICAgICAgICAgICAgICAgIC5hZGRGaWVsZFZhbHVlTWF0Y2hlcihGaWVsZFZhbHVlTWF0Y2hlci5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKFNjcmVlblN0YXRlQ2hhbmdlZC5TVEFURV9GSUVMRF9OVU1CRVIpCisgICAgICAgICAgICAgICAgICAgIC5zZXRFcUludChEaXNwbGF5U3RhdGVFbnVtLkRJU1BMQVlfU1RBVEVfT05fVkFMVUUpKSk7CisKKyAgICAgICAgQXRvbU1hdGNoZXIuQnVpbGRlciBzY3JlZW5TdGF0ZURvemUgPSBBdG9tTWF0Y2hlci5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgIC5zZXRJZChzY3JlZW5TdGF0ZURvemVJZCkKKyAgICAgICAgICAgIC5zZXRTaW1wbGVBdG9tTWF0Y2hlcihTaW1wbGVBdG9tTWF0Y2hlci5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0QXRvbUlkKEF0b20uU0NSRUVOX1NUQVRFX0NIQU5HRURfRklFTERfTlVNQkVSKQorICAgICAgICAgICAgICAgIC5hZGRGaWVsZFZhbHVlTWF0Y2hlcihGaWVsZFZhbHVlTWF0Y2hlci5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKFNjcmVlblN0YXRlQ2hhbmdlZC5TVEFURV9GSUVMRF9OVU1CRVIpCisgICAgICAgICAgICAgICAgICAgIC5zZXRFcUludChEaXNwbGF5U3RhdGVFbnVtLkRJU1BMQVlfU1RBVEVfRE9aRV9WQUxVRSkpKTsKKworICAgICAgICBBdG9tTWF0Y2hlci5CdWlsZGVyIHNjcmVlblN0YXRlRG96ZVN1c3BlbmQgPSBBdG9tTWF0Y2hlci5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgIC5zZXRJZChzY3JlZW5TdGF0ZURvemVTdXNwZW5kSWQpCisgICAgICAgICAgICAuc2V0U2ltcGxlQXRvbU1hdGNoZXIoU2ltcGxlQXRvbU1hdGNoZXIubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldEF0b21JZChBdG9tLlNDUkVFTl9TVEFURV9DSEFOR0VEX0ZJRUxEX05VTUJFUikKKyAgICAgICAgICAgICAgICAuYWRkRmllbGRWYWx1ZU1hdGNoZXIoRmllbGRWYWx1ZU1hdGNoZXIubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChTY3JlZW5TdGF0ZUNoYW5nZWQuU1RBVEVfRklFTERfTlVNQkVSKQorICAgICAgICAgICAgICAgICAgICAuc2V0RXFJbnQoRGlzcGxheVN0YXRlRW51bS5ESVNQTEFZX1NUQVRFX0RPWkVfU1VTUEVORF9WQUxVRSkpKTsKKworICAgICAgICBBdG9tTWF0Y2hlci5CdWlsZGVyIHNjcmVlblN0YXRlVnIgPSBBdG9tTWF0Y2hlci5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgIC5zZXRJZChzY3JlZW5TdGF0ZVZySWQpCisgICAgICAgICAgICAuc2V0U2ltcGxlQXRvbU1hdGNoZXIoU2ltcGxlQXRvbU1hdGNoZXIubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldEF0b21JZChBdG9tLlNDUkVFTl9TVEFURV9DSEFOR0VEX0ZJRUxEX05VTUJFUikKKyAgICAgICAgICAgICAgICAuYWRkRmllbGRWYWx1ZU1hdGNoZXIoRmllbGRWYWx1ZU1hdGNoZXIubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChTY3JlZW5TdGF0ZUNoYW5nZWQuU1RBVEVfRklFTERfTlVNQkVSKQorICAgICAgICAgICAgICAgICAgICAuc2V0RXFJbnQoRGlzcGxheVN0YXRlRW51bS5ESVNQTEFZX1NUQVRFX1ZSX1ZBTFVFKSkpOworCisgICAgICAgIEF0b21NYXRjaGVyLkJ1aWxkZXIgc2NyZWVuU3RhdGVPblN1c3BlbmQgPSBBdG9tTWF0Y2hlci5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgIC5zZXRJZChzY3JlZW5TdGF0ZU9uU3VzcGVuZElkKQorICAgICAgICAgICAgLnNldFNpbXBsZUF0b21NYXRjaGVyKFNpbXBsZUF0b21NYXRjaGVyLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRBdG9tSWQoQXRvbS5TQ1JFRU5fU1RBVEVfQ0hBTkdFRF9GSUVMRF9OVU1CRVIpCisgICAgICAgICAgICAgICAgLmFkZEZpZWxkVmFsdWVNYXRjaGVyKEZpZWxkVmFsdWVNYXRjaGVyLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoU2NyZWVuU3RhdGVDaGFuZ2VkLlNUQVRFX0ZJRUxEX05VTUJFUikKKyAgICAgICAgICAgICAgICAgICAgLnNldEVxSW50KERpc3BsYXlTdGF0ZUVudW0uRElTUExBWV9TVEFURV9PTl9TVVNQRU5EX1ZBTFVFKSkpOworCisKKyAgICAgICAgQXRvbU1hdGNoZXIuQnVpbGRlciBzY3JlZW5UdXJuZWRPZmYgPSBBdG9tTWF0Y2hlci5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgIC5zZXRJZChzY3JlZW5UdXJuZWRPZmZJZCkKKyAgICAgICAgICAgIC5zZXRDb21iaW5hdGlvbihBdG9tTWF0Y2hlci5Db21iaW5hdGlvbi5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0T3BlcmF0aW9uKExvZ2ljYWxPcGVyYXRpb24uT1IpCisgICAgICAgICAgICAgICAgLmFkZE1hdGNoZXIoc2NyZWVuU3RhdGVPZmZJZCkKKyAgICAgICAgICAgICAgICAuYWRkTWF0Y2hlcihzY3JlZW5TdGF0ZURvemVJZCkKKyAgICAgICAgICAgICAgICAuYWRkTWF0Y2hlcihzY3JlZW5TdGF0ZURvemVTdXNwZW5kSWQpCisgICAgICAgICAgICAgICAgLmFkZE1hdGNoZXIoc2NyZWVuU3RhdGVVbmtub3duSWQpKTsKKworICAgICAgICBBdG9tTWF0Y2hlci5CdWlsZGVyIHNjcmVlblR1cm5lZE9uID0gQXRvbU1hdGNoZXIubmV3QnVpbGRlcigpCisgICAgICAgICAgICAuc2V0SWQoc2NyZWVuVHVybmVkT25JZCkKKyAgICAgICAgICAgIC5zZXRDb21iaW5hdGlvbihBdG9tTWF0Y2hlci5Db21iaW5hdGlvbi5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0T3BlcmF0aW9uKExvZ2ljYWxPcGVyYXRpb24uT1IpCisgICAgICAgICAgICAgICAgLmFkZE1hdGNoZXIoc2NyZWVuU3RhdGVPbklkKQorICAgICAgICAgICAgICAgIC5hZGRNYXRjaGVyKHNjcmVlblN0YXRlT25TdXNwZW5kSWQpCisgICAgICAgICAgICAgICAgLmFkZE1hdGNoZXIoc2NyZWVuU3RhdGVWcklkKSk7CisKKyAgICAgICAgUHJlZGljYXRlLkJ1aWxkZXIgc2NyZWVuSXNPZmYgPSBQcmVkaWNhdGUubmV3QnVpbGRlcigpCisgICAgICAgICAgICAuc2V0SWQoc2NyZWVuSXNPZmZJZCkKKyAgICAgICAgICAgIC5zZXRTaW1wbGVQcmVkaWNhdGUoU2ltcGxlUHJlZGljYXRlLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRTdGFydChzY3JlZW5UdXJuZWRPZmZJZCkKKyAgICAgICAgICAgICAgICAuc2V0U3RvcChzY3JlZW5UdXJuZWRPbklkKQorICAgICAgICAgICAgICAgIC5zZXRDb3VudE5lc3RpbmcoZmFsc2UpKTsKKworCisgICAgICAgIFByZWRpY2F0ZS5CdWlsZGVyIHNjcmVlbk9mZkJhdHRlcnlPbiA9IFByZWRpY2F0ZS5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgIC5zZXRJZChzY3JlZW5PZmZCYXR0ZXJ5T25JZCkKKyAgICAgICAgICAgIC5zZXRDb21iaW5hdGlvbihQcmVkaWNhdGUuQ29tYmluYXRpb24ubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldE9wZXJhdGlvbihMb2dpY2FsT3BlcmF0aW9uLkFORCkKKyAgICAgICAgICAgICAgICAuYWRkUHJlZGljYXRlKHNjcmVlbklzT2ZmSWQpCisgICAgICAgICAgICAgICAgLmFkZFByZWRpY2F0ZShkZXZpY2VJc1VucGx1Z2dlZElkKSk7CisKKyAgICAgICAgU3RhdHNkQ29uZmlnLkJ1aWxkZXIgYnVpbGRlciA9IGNyZWF0ZUNvbmZpZ0J1aWxkZXIoKTsKKyAgICAgICAgYnVpbGRlci5hZGREdXJhdGlvbk1ldHJpYyhEdXJhdGlvbk1ldHJpYy5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0SWQobWV0cmljSWQpCisgICAgICAgICAgICAgICAgLnNldFdoYXQocGFydGlhbFdha2Vsb2NrSXNPbklkKQorICAgICAgICAgICAgICAgIC5zZXRDb25kaXRpb24oc2NyZWVuT2ZmQmF0dGVyeU9uSWQpCisgICAgICAgICAgICAgICAgLnNldERpbWVuc2lvbnNJbldoYXQoZGltZW5zaW9ucykKKyAgICAgICAgICAgICAgICAuc2V0QnVja2V0KGJ1Y2tldHNpemUpKQorICAgICAgICAgICAgLmFkZEF0b21NYXRjaGVyKHdha2Vsb2NrQWNxdWlyZSkKKyAgICAgICAgICAgIC5hZGRBdG9tTWF0Y2hlcih3YWtlbG9ja0NoYW5nZUFjcXVpcmUpCisgICAgICAgICAgICAuYWRkQXRvbU1hdGNoZXIod2FrZWxvY2tSZWxlYXNlKQorICAgICAgICAgICAgLmFkZEF0b21NYXRjaGVyKHdha2Vsb2NrQ2hhbmdlUmVsZWFzZSkKKyAgICAgICAgICAgIC5hZGRBdG9tTWF0Y2hlcih3YWtlbG9ja09uKQorICAgICAgICAgICAgLmFkZEF0b21NYXRjaGVyKHdha2Vsb2NrT2ZmKQorICAgICAgICAgICAgLmFkZEF0b21NYXRjaGVyKHBsdWdnZWRTdGF0ZUJhdHRlcnlQbHVnZ2VkTm9uZSkKKyAgICAgICAgICAgIC5hZGRBdG9tTWF0Y2hlcihwbHVnZ2VkU3RhdGVCYXR0ZXJ5UGx1Z2dlZEFjKQorICAgICAgICAgICAgLmFkZEF0b21NYXRjaGVyKHBsdWdnZWRTdGF0ZUJhdHRlcnlQbHVnZ2VkVXNiKQorICAgICAgICAgICAgLmFkZEF0b21NYXRjaGVyKHBsdWdnZWRTdGF0ZUJhdHRlcnlQbHVnZ2VkV2lyZWxlc3MpCisgICAgICAgICAgICAuYWRkQXRvbU1hdGNoZXIocGx1Z2dlZFN0YXRlQmF0dGVyeVBsdWdnZWQpCisgICAgICAgICAgICAuYWRkQXRvbU1hdGNoZXIoc2NyZWVuU3RhdGVVbmtub3duKQorICAgICAgICAgICAgLmFkZEF0b21NYXRjaGVyKHNjcmVlblN0YXRlT2ZmKQorICAgICAgICAgICAgLmFkZEF0b21NYXRjaGVyKHNjcmVlblN0YXRlT24pCisgICAgICAgICAgICAuYWRkQXRvbU1hdGNoZXIoc2NyZWVuU3RhdGVEb3plKQorICAgICAgICAgICAgLmFkZEF0b21NYXRjaGVyKHNjcmVlblN0YXRlRG96ZVN1c3BlbmQpCisgICAgICAgICAgICAuYWRkQXRvbU1hdGNoZXIoc2NyZWVuU3RhdGVWcikKKyAgICAgICAgICAgIC5hZGRBdG9tTWF0Y2hlcihzY3JlZW5TdGF0ZU9uU3VzcGVuZCkKKyAgICAgICAgICAgIC5hZGRBdG9tTWF0Y2hlcihzY3JlZW5UdXJuZWRPZmYpCisgICAgICAgICAgICAuYWRkQXRvbU1hdGNoZXIoc2NyZWVuVHVybmVkT24pCisgICAgICAgICAgICAuYWRkUHJlZGljYXRlKHdha2Vsb2NrUHJlZGljYXRlKQorICAgICAgICAgICAgLmFkZFByZWRpY2F0ZShkZXZpY2VJc1VucGx1Z2dlZCkKKyAgICAgICAgICAgIC5hZGRQcmVkaWNhdGUoc2NyZWVuSXNPZmYpCisgICAgICAgICAgICAuYWRkUHJlZGljYXRlKHNjcmVlbk9mZkJhdHRlcnlPbik7CisKKyAgICAgICAgdXBsb2FkQ29uZmlnKGJ1aWxkZXIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc3VzdGFpbmVkcGVyZi9BbmRyb2lkVGVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL3N1c3RhaW5lZHBlcmYvQW5kcm9pZFRlc3QueG1sCmluZGV4IGU3Y2JlZTguLmRkNDk2NzQgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvc3VzdGFpbmVkcGVyZi9BbmRyb2lkVGVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy9zdXN0YWluZWRwZXJmL0FuZHJvaWRUZXN0LnhtbApAQCAtMTQsNiArMTQsNyBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIFN1c3RhaW5lZCBQZXJmb3JtYW5jZSBob3N0IHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJzeXN0ZW1zIiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3N1c3RhaW5lZHBlcmYvZGhyeXN0b25lL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL3N1c3RhaW5lZHBlcmYvZGhyeXN0b25lL0FuZHJvaWQubWsKaW5kZXggYWJjYmU2NjkuLjg2NDUzMTggMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvc3VzdGFpbmVkcGVyZi9kaHJ5c3RvbmUvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL3N1c3RhaW5lZHBlcmYvZGhyeXN0b25lL0FuZHJvaWQubWsKQEAgLTksNiArOSw3IEBACiBMT0NBTF9NT0RVTEUgOj0gZGhyeQogTE9DQUxfU1JDX0ZJTEVTIDo9IGRocnlfMS5jIGRocnlfMi5jCiBMT0NBTF9DRkxBR1MgOj0gLU8zIC1mbm8taW5saW5lLWZ1bmN0aW9ucyAtRE1TQ19DTE9DSyAtRENMS19UQ0s9MTAwMDAwMAorTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXJyb3IgLVduby1pbmNvbXBhdGlibGUtbGlicmFyeS1yZWRlY2xhcmF0aW9uCiBMT0NBTF9DRkxBR1MgKz0gLVduby1yZXR1cm4tdHlwZSAtV25vLWltcGxpY2l0LWZ1bmN0aW9uLWRlY2xhcmF0aW9uIC1Xbm8taW1wbGljaXQtaW50CiAjIEluY2x1ZGUgYm90aCB0aGUgMzIgYW5kIDY0IGJpdCB2ZXJzaW9ucwogTE9DQUxfTVVMVElMSUIgOj0gYm90aApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zdXN0YWluZWRwZXJmL2RocnlzdG9uZS9kaHJ5XzEuYyBiL2hvc3RzaWRldGVzdHMvc3VzdGFpbmVkcGVyZi9kaHJ5c3RvbmUvZGhyeV8xLmMKaW5kZXggYzExOThkMS4uMzY4MjA1MiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zdXN0YWluZWRwZXJmL2RocnlzdG9uZS9kaHJ5XzEuYworKysgYi9ob3N0c2lkZXRlc3RzL3N1c3RhaW5lZHBlcmYvZGhyeXN0b25lL2RocnlfMS5jCkBAIC0yOCw3ICsyOCw2IEBACiBpbnQgICAgICAgICAgICAgQXJyXzFfR2xvYiBbNTBdOwogaW50ICAgICAgICAgICAgIEFycl8yX0dsb2IgWzUwXSBbNTBdOwogCi1leHRlcm4gY2hhciAgICAgKm1hbGxvYyAoKTsKIEVudW1lcmF0aW9uICAgICBGdW5jXzEgKCk7CiAgIC8qIGZvcndhcmQgZGVjbGFyYXRpb24gbmVjZXNzYXJ5IHNpbmNlIEVudW1lcmF0aW9uIG1heSBub3Qgc2ltcGx5IGJlIGludCAqLwogCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3N1c3RhaW5lZHBlcmYvc2hhZGVydG95X2FuZHJvaWQvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvc3VzdGFpbmVkcGVyZi9zaGFkZXJ0b3lfYW5kcm9pZC9BbmRyb2lkLm1rCmluZGV4IGJhNmJmNjQuLjJlMWJiZGQgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvc3VzdGFpbmVkcGVyZi9zaGFkZXJ0b3lfYW5kcm9pZC9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvc3VzdGFpbmVkcGVyZi9zaGFkZXJ0b3lfYW5kcm9pZC9BbmRyb2lkLm1rCkBAIC0yNCw3ICsyNCw3IEBACiAjIEluY2x1ZGUgYm90aCB0aGUgMzIgYW5kIDY0IGJpdCB2ZXJzaW9ucwogTE9DQUxfTVVMVElMSUIgOj0gYm90aAogCi1MT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJnbHRlc3QgbGliYysrCitMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJnbHRlc3QKICNMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmMrKwogI0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGliYysrX3N0YXRpYwogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zdXN0YWluZWRwZXJmL3NoYWRlcnRveV9hbmRyb2lkL2puaS9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy9zdXN0YWluZWRwZXJmL3NoYWRlcnRveV9hbmRyb2lkL2puaS9BbmRyb2lkLm1rCmluZGV4IDI4NTliMzAuLjc5YWI1ZmUgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvc3VzdGFpbmVkcGVyZi9zaGFkZXJ0b3lfYW5kcm9pZC9qbmkvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL3N1c3RhaW5lZHBlcmYvc2hhZGVydG95X2FuZHJvaWQvam5pL0FuZHJvaWQubWsKQEAgLTI1LDYgKzI1LDggQEAKICAgICAgICAgICAgICAgICAgICBob29rc19hbmRyb2lkLmNwcCBcDQogICAgICAgICAgICAgICAgICAgIHV0aWxzLmNwcA0KIA0KK0xPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yIC1Xbm8tdW51c2VkLXZhcmlhYmxlDQorDQogTE9DQUxfU0RLX1ZFUlNJT04gOj0gMjENCiBMT0NBTF9OREtfU1RMX1ZBUklBTlQgOj0gYysrX3N0YXRpYw0KIA0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc3VzdGFpbmVkcGVyZi9zaGFkZXJ0b3lfYW5kcm9pZC9zcmMvR0x0ZXN0Vmlldy5qYXZhIGIvaG9zdHNpZGV0ZXN0cy9zdXN0YWluZWRwZXJmL3NoYWRlcnRveV9hbmRyb2lkL3NyYy9HTHRlc3RWaWV3LmphdmEKaW5kZXggYTZkYWI2Mi4uNzg5Mzg4NiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy9zdXN0YWluZWRwZXJmL3NoYWRlcnRveV9hbmRyb2lkL3NyYy9HTHRlc3RWaWV3LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy9zdXN0YWluZWRwZXJmL3NoYWRlcnRveV9hbmRyb2lkL3NyYy9HTHRlc3RWaWV3LmphdmEKQEAgLTExMCw5ICsxMTAsOSBAQAogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENvbnRleHRGYWN0b3J5IGltcGxlbWVudHMgR0xTdXJmYWNlVmlldy5FR0xDb250ZXh0RmFjdG9yeSB7DQogICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgRUdMX0NPTlRFWFRfQ0xJRU5UX1ZFUlNJT04gPSAweDMwOTg7DQogICAgICAgICBwdWJsaWMgRUdMQ29udGV4dCBjcmVhdGVDb250ZXh0KEVHTDEwIGVnbCwgRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xDb25maWcgZWdsQ29uZmlnKSB7DQotICAgICAgICAgICAgTG9nLncoVEFHLCAiY3JlYXRpbmcgT3BlbkdMIEVTIDMuMCBjb250ZXh0Iik7DQorICAgICAgICAgICAgTG9nLncoVEFHLCAiY3JlYXRpbmcgT3BlbkdMIEVTIDIuMCBjb250ZXh0Iik7DQogICAgICAgICAgICAgY2hlY2tFZ2xFcnJvcigiQmVmb3JlIGVnbENyZWF0ZUNvbnRleHQiLCBlZ2wpOw0KLSAgICAgICAgICAgIGludFtdIGF0dHJpYl9saXN0ID0ge0VHTF9DT05URVhUX0NMSUVOVF9WRVJTSU9OLCAzLCBFR0wxMC5FR0xfTk9ORSB9Ow0KKyAgICAgICAgICAgIGludFtdIGF0dHJpYl9saXN0ID0ge0VHTF9DT05URVhUX0NMSUVOVF9WRVJTSU9OLCAyLCBFR0wxMC5FR0xfTk9ORSB9Ow0KICAgICAgICAgICAgIEVHTENvbnRleHQgY29udGV4dCA9IGVnbC5lZ2xDcmVhdGVDb250ZXh0KGRpc3BsYXksIGVnbENvbmZpZywgRUdMMTAuRUdMX05PX0NPTlRFWFQsIGF0dHJpYl9saXN0KTsNCiAgICAgICAgICAgICBjaGVja0VnbEVycm9yKCJBZnRlciBlZ2xDcmVhdGVDb250ZXh0IiwgZWdsKTsNCiAgICAgICAgICAgICByZXR1cm4gY29udGV4dDsNCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3N5c3RlbXVpL0FuZHJvaWRUZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvc3lzdGVtdWkvQW5kcm9pZFRlc3QueG1sCmluZGV4IDE4ZTQ0ZWUuLmUxYWU2ZTkgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvc3lzdGVtdWkvQW5kcm9pZFRlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvc3lzdGVtdWkvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgU3lzdGVtIFVJIGhvc3QgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9InN5c3VpIiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3RoZW1lL0FuZHJvaWRUZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvdGhlbWUvQW5kcm9pZFRlc3QueG1sCmluZGV4IGZiNWQ2YmIuLmJlYjkyMTggMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvdGhlbWUvQW5kcm9pZFRlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvdGhlbWUvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgVGhlbWUgaG9zdCB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0idWl0b29sa2l0IiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3RoZW1lL1JFQURNRSBiL2hvc3RzaWRldGVzdHMvdGhlbWUvUkVBRE1FCmluZGV4IDRmOTNlNWEuLjRiZjMyY2QgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvdGhlbWUvUkVBRE1FCisrKyBiL2hvc3RzaWRldGVzdHMvdGhlbWUvUkVBRE1FCkBAIC02Nyw2ICs2NywyMiBAQAogCiAgICAgIC4vY3RzL2hvc3RzaWRldGVzdHMvdGhlbWUvZ2VuZXJhdGVfaW1hZ2VzLnB5CiAKK1RoZXJlIGlzIGFuIG9wdGlvbiB0byBidWlsZCBsb2NhbGx5IGFuIEFuZHJvaWQgc3lzdGVtIGltYWdlIGFuZCB1c2UgYW4gZW11bGF0b3IgdGhhdCBpcyBzdG9yZWQgaW4KK0FuZHJvaWQgc291cmNlIHRyZWUgdW5kZXIgInByZWJ1aWx0cy9hbmRyb2lkLWVtdWxhdG9yL2xpbnV4LXg4Nl82NC9lbXVsYXRvciIuIFRoaXMgb3B0aW9uIGRvZXMgbm90CityZXF1aXJlIGEgU0RLIGFuZCBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBpbWFnZXMgd2l0aCBsb2NhbGx5IG1vZGlmaWVkIHNvdXJjZSBjb2RlOiBmb3IgZXhhbXBsZQorcmlnaHQgYmVmb3JlIG1ha2luZyBhIHRlc3QgYnJlYWtpbmcgY2hhbmdlLgorCisgIDEuIEZyb20gdGhlIGNvbnNvbGUsIHNldCB1cCB5b3VyIGJ1aWxkIGVudmlyb25tZW50IGZvciBzZGtfcGhvbmVfeDg2XzY0IGFuZCBidWlsZCBBbmRyb2lkIGFuZCBDVFM6CisKKyAgICAgbHVuY2ggc2RrX3Bob25lX3g4Nl82NC11c2VyZGVidWcgJiYgbWFrZSAtajMyICYmIG1ha2UgY3RzIC1qMzIKKworICAyLiBVc2UgdGhlIHJlZmVyZW5jZSBpbWFnZSBzY3JpcHQgdG8gZ2VuZXJhdGUgdGhlIHJlZmVyZW5jZSBpbWFnZXMuIFRoZSBzY3JpcHQKKyAgICAgd2lsbCBhdXRvbWF0aWNhbGx5IHN0YXJ0IHRoZSBlbXVsYXRvciBpbiB0aGUgcmVxdWlyZWQgY29uZmlndXJhdGlvbnMgYW5kCisgICAgIGluc3RhbGwgdGhlIHJlc3VsdGluZyByZWZlcmVuY2UgaW1hZ2VzIGluIGFzc2V0cy88cGxhdGZvcm0+LzxkcGk+LnppcCwKKyAgICAgb3ZlcndyaXRpbmcgYW55IGV4aXN0aW5nIGltYWdlcy4KKworICAgICAuL2N0cy9ob3N0c2lkZXRlc3RzL3RoZW1lL2dlbmVyYXRlX2ltYWdlcy5weSBsb2NhbAorCiBBIGNvbXBsZXRlIGNvbGxlY3Rpb24gb2YgcmVmZXJlbmNlIGltYWdlcyBmb3IgYSBnaXZlbiBBUEkgcmV2aXNpb24gbXVzdCBpbmNsdWRlCiBhIHNldCBmb3IgZWFjaCBwb3NzaWJsZSBEUEkgYnVja2V0ICh0dmRwaSwgeHhoZHBpLCBldGMuKSB0aGF0IG1heSBiZSB0ZXN0ZWQuCiAKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvdGhlbWUvYXBwL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL3RoZW1lL2FwcC9BbmRyb2lkLm1rCmluZGV4IGRlNjMzNTUuLjFkNWE2ZjAgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvdGhlbWUvYXBwL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy90aGVtZS9hcHAvQW5kcm9pZC5tawpAQCAtMjYsNyArMjYsNyBAQAogCiBMT0NBTF9QUk9HVUFSRF9FTkFCTEVEIDo9IGRpc2FibGVkCiAKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLXN1cHBvcnQtdGVzdAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWR4LnRlc3QucnVsZXMKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3RoZW1lL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy90aGVtZS9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCAyYTAzZGI5Li4wZjNjMWRlIDEwMDc1NQotLS0gYS9ob3N0c2lkZXRlc3RzL3RoZW1lL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvdGhlbWUvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTM5LDcgKzM5LDcgQEAKICAgICA8L2FwcGxpY2F0aW9uPgogCiAgICAgPCEtLSAgc2VsZi1pbnN0cnVtZW50aW5nIHRlc3QgcGFja2FnZS4gLS0+Ci0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC50aGVtZS5hcHAiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJHZW5lcmF0ZXMgVGhlbWUgcmVmZXJlbmNlIGltYWdlcyIvPgogCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3RoZW1lL2Fzc2V0cy8yOC8yNjBkcGkuemlwIGIvaG9zdHNpZGV0ZXN0cy90aGVtZS9hc3NldHMvMjgvMjYwZHBpLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzhlNWU4Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy90aGVtZS9hc3NldHMvMjgvMjYwZHBpLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3RoZW1lL2Fzc2V0cy8yOC8yODBkcGkuemlwIGIvaG9zdHNpZGV0ZXN0cy90aGVtZS9hc3NldHMvMjgvMjgwZHBpLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDE1Yjg1Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy90aGVtZS9hc3NldHMvMjgvMjgwZHBpLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3RoZW1lL2Fzc2V0cy8yOC8zMDBkcGkuemlwIGIvaG9zdHNpZGV0ZXN0cy90aGVtZS9hc3NldHMvMjgvMzAwZHBpLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDE3NjFiCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy90aGVtZS9hc3NldHMvMjgvMzAwZHBpLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3RoZW1lL2Fzc2V0cy8yOC8zNDBkcGkuemlwIGIvaG9zdHNpZGV0ZXN0cy90aGVtZS9hc3NldHMvMjgvMzQwZHBpLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDc3NGE5Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy90aGVtZS9hc3NldHMvMjgvMzQwZHBpLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3RoZW1lL2Fzc2V0cy8yOC8zNjBkcGkuemlwIGIvaG9zdHNpZGV0ZXN0cy90aGVtZS9hc3NldHMvMjgvMzYwZHBpLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTFmODAxCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy90aGVtZS9hc3NldHMvMjgvMzYwZHBpLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3RoZW1lL2Fzc2V0cy8yOC80MDBkcGkuemlwIGIvaG9zdHNpZGV0ZXN0cy90aGVtZS9hc3NldHMvMjgvNDAwZHBpLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmI4OTNjCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy90aGVtZS9hc3NldHMvMjgvNDAwZHBpLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3RoZW1lL2Fzc2V0cy8yOC80MjBkcGkuemlwIGIvaG9zdHNpZGV0ZXN0cy90aGVtZS9hc3NldHMvMjgvNDIwZHBpLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjgzZDg4Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy90aGVtZS9hc3NldHMvMjgvNDIwZHBpLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3RoZW1lL2Fzc2V0cy8yOC80NDBkcGkuemlwIGIvaG9zdHNpZGV0ZXN0cy90aGVtZS9hc3NldHMvMjgvNDQwZHBpLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjdlNTY0Ci0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy90aGVtZS9hc3NldHMvMjgvNDQwZHBpLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3RoZW1lL2Fzc2V0cy8yOC81NjBkcGkuemlwIGIvaG9zdHNpZGV0ZXN0cy90aGVtZS9hc3NldHMvMjgvNTYwZHBpLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzk4YzgwCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy90aGVtZS9hc3NldHMvMjgvNTYwZHBpLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3RoZW1lL2Fzc2V0cy8yOC9oZHBpLnppcCBiL2hvc3RzaWRldGVzdHMvdGhlbWUvYXNzZXRzLzI4L2hkcGkuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNzNhZDQKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL3RoZW1lL2Fzc2V0cy8yOC9oZHBpLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3RoZW1lL2Fzc2V0cy8yOC9sZHBpLnppcCBiL2hvc3RzaWRldGVzdHMvdGhlbWUvYXNzZXRzLzI4L2xkcGkuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YjdjMzUKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL3RoZW1lL2Fzc2V0cy8yOC9sZHBpLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3RoZW1lL2Fzc2V0cy8yOC9tZHBpLnppcCBiL2hvc3RzaWRldGVzdHMvdGhlbWUvYXNzZXRzLzI4L21kcGkuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZTQzMGIKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL3RoZW1lL2Fzc2V0cy8yOC9tZHBpLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3RoZW1lL2Fzc2V0cy8yOC90dmRwaS56aXAgYi9ob3N0c2lkZXRlc3RzL3RoZW1lL2Fzc2V0cy8yOC90dmRwaS56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIwZWI2NQotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvdGhlbWUvYXNzZXRzLzI4L3R2ZHBpLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3RoZW1lL2Fzc2V0cy8yOC94aGRwaS56aXAgYi9ob3N0c2lkZXRlc3RzL3RoZW1lL2Fzc2V0cy8yOC94aGRwaS56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgyMDIwOQotLS0gL2Rldi9udWxsCisrKyBiL2hvc3RzaWRldGVzdHMvdGhlbWUvYXNzZXRzLzI4L3hoZHBpLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3RoZW1lL2Fzc2V0cy8yOC94eGhkcGkuemlwIGIvaG9zdHNpZGV0ZXN0cy90aGVtZS9hc3NldHMvMjgveHhoZHBpLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmJiNDlhCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdHNpZGV0ZXN0cy90aGVtZS9hc3NldHMvMjgveHhoZHBpLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3RoZW1lL2Fzc2V0cy8yOC94eHhoZHBpLnppcCBiL2hvc3RzaWRldGVzdHMvdGhlbWUvYXNzZXRzLzI4L3h4eGhkcGkuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMzM4MDAKLS0tIC9kZXYvbnVsbAorKysgYi9ob3N0c2lkZXRlc3RzL3RoZW1lL2Fzc2V0cy8yOC94eHhoZHBpLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3RoZW1lL2F2ZC5weSBiL2hvc3RzaWRldGVzdHMvdGhlbWUvYXZkLnB5CmluZGV4IDRjNDQ0YTIuLjJhNDMxMjkgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvdGhlbWUvYXZkLnB5CisrKyBiL2hvc3RzaWRldGVzdHMvdGhlbWUvYXZkLnB5CkBAIC00Niw4ICs0NiwxMiBAQAogICAgICAgICBwb3J0X2FkYiA9IGZpbmRfZnJlZV9wb3J0KCkKICAgICAgICAgcG9ydF90dHkgPSBmaW5kX2ZyZWVfcG9ydCgpCiAgICAgICAgICMgLW5vLXdpbmRvdyBtaWdodCBiZSB1c2VmdWwgaGVyZQotICAgICAgICBlbXVfY21kID0gIiVzIC1hdmQgJXMgJXMtcG9ydHMgJWQsJWQiIFwKLSAgICAgICAgICAgICAgICAgICUgKHNlbGYuX2VtdV9wYXRoLCBzZWxmLl9uYW1lLCBzZWxmLl9vcHRzLCBwb3J0X2FkYiwgcG9ydF90dHkpCisgICAgICAgIGlmIHNlbGYuX25hbWUgPT0gImxvY2FsIjoKKyAgICAgICAgICAgIGVtdV9jbWQgPSAiZW11bGF0b3IgJXMtcG9ydHMgJWQsJWQgLWdwdSBvbiAtd2lwZS1kYXRhIiBcCisgICAgICAgICAgICAgICAgICAgICAgJSAoc2VsZi5fb3B0cywgcG9ydF9hZGIsIHBvcnRfdHR5KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZW11X2NtZCA9ICIlcyAtYXZkICVzICVzLXBvcnRzICVkLCVkIiBcCisgICAgICAgICAgICAgICAgICAgICAgJSAoc2VsZi5fZW11X3BhdGgsIHNlbGYuX25hbWUsIHNlbGYuX29wdHMsIHBvcnRfYWRiLCBwb3J0X3R0eSkKICAgICAgICAgcHJpbnQoZW11X2NtZCkKIAogICAgICAgICBlbXVfcHJvYyA9IHN1YnByb2Nlc3MuUG9wZW4oZW11X2NtZC5zcGxpdCgiICIpLCBidWZzaXplPS0xLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy90aGVtZS9nZW5lcmF0ZV9pbWFnZXMucHkgYi9ob3N0c2lkZXRlc3RzL3RoZW1lL2dlbmVyYXRlX2ltYWdlcy5weQppbmRleCBmMjQzZWE0Li40YjFiNTgxIDEwMDc1NQotLS0gYS9ob3N0c2lkZXRlc3RzL3RoZW1lL2dlbmVyYXRlX2ltYWdlcy5weQorKysgYi9ob3N0c2lkZXRlc3RzL3RoZW1lL2dlbmVyYXRlX2ltYWdlcy5weQpAQCAtNDEsNiArNDEsNyBAQAogICAgIDM2MDogIjM2MGRwaSIsCiAgICAgNDAwOiAiNDAwZHBpIiwKICAgICA0MjA6ICI0MjBkcGkiLAorICAgIDQ0MDogIjQ0MGRwaSIsCiAgICAgNDgwOiAieHhoZHBpIiwKICAgICA1NjA6ICI1NjBkcGkiLAogICAgIDY0MDogInh4eGhkcGkiLApAQCAtMTMyLDcgKzEzMyw3IEBACiAgICAgcHJpbnQoIkdlbmVyYXRpbmcgaW1hZ2VzIG9uICIgKyBkZXZpY2Vfc2VyaWFsICsgIi4uLiIpCiAgICAgdHJ5OgogICAgICAgICAob3V0LCBlcnIpID0gZGV2aWNlLnJ1bl9pbnN0cnVtZW50YXRpb25fdGVzdCgKLSAgICAgICAgICAgICJhbmRyb2lkLnRoZW1lLmFwcC9hbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIikKKyAgICAgICAgICAgICJhbmRyb2lkLnRoZW1lLmFwcC9hbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiKQogICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKICAgICAgICAgcmFpc2UKICAgICBleGNlcHQ6CkBAIC0xODEsNyArMTgyLDEwIEBACiAKIAogZGVmIHN0YXJ0X2VtdWxhdG9yKG5hbWUsIGRlbnNpdHkpOgotICAgIGVtdV9wYXRoID0gZ2V0X2VtdWxhdG9yX3BhdGgoKQorICAgIGlmIG5hbWUgPT0gImxvY2FsIjoKKyAgICAgICAgZW11X3BhdGggPSAiIgorICAgIGVsc2U6CisgICAgICAgIGVtdV9wYXRoID0gZ2V0X2VtdWxhdG9yX3BhdGgoKQogCiAgICAgIyBTdGFydCBlbXVsYXRvciBmb3IgNTYwZHBpLCBub3JtYWwgc2NyZWVuIHNpemUuCiAgICAgdGVzdF9hdmQgPSBBVkQobmFtZSwgZW11X3BhdGgpCkBAIC0yMjgsMTYgKzIzMiwxOSBAQAogCiAgICAgICAgIGRldmljZXMgPSBlbnVtZXJhdGVfYW5kcm9pZF9kZXZpY2VzKCkKIAotICAgICAgICBkZXZpY2VfcXVldWUgPSBRdWV1ZSgpCi0gICAgICAgIGZvciBkZXZpY2UgaW4gZGV2aWNlczoKLSAgICAgICAgICAgIGRldmljZV9xdWV1ZS5wdXQoZGV2aWNlKQorICAgICAgICBpZiBsZW4oZGV2aWNlcykgPiAwOgorICAgICAgICAgICAgZGV2aWNlX3F1ZXVlID0gUXVldWUoKQorICAgICAgICAgICAgZm9yIGRldmljZSBpbiBkZXZpY2VzOgorICAgICAgICAgICAgICAgIGRldmljZV9xdWV1ZS5wdXQoZGV2aWNlKQogCi0gICAgICAgIHJlc3VsdCA9IGV4ZWN1dGVfcGFyYWxsZWwodGFza3MsIHNldHVwLCBkZXZpY2VfcXVldWUsIGxlbihkZXZpY2VzKSkKKyAgICAgICAgICAgIHJlc3VsdCA9IGV4ZWN1dGVfcGFyYWxsZWwodGFza3MsIHNldHVwLCBkZXZpY2VfcXVldWUsIGxlbihkZXZpY2VzKSkKIAotICAgICAgICBpZiByZXN1bHQgPiAwOgotICAgICAgICAgICAgcHJpbnQoJ0dlbmVyYXRlZCByZWZlcmVuY2UgaW1hZ2VzIGZvciAlKGNvdW50KWQgZGV2aWNlcycgJSB7ImNvdW50IjogcmVzdWx0fSkKKyAgICAgICAgICAgIGlmIHJlc3VsdCA+IDA6CisgICAgICAgICAgICAgICAgcHJpbnQoJ0dlbmVyYXRlZCByZWZlcmVuY2UgaW1hZ2VzIGZvciAlKGNvdW50KWQgZGV2aWNlcycgJSB7ImNvdW50IjogcmVzdWx0fSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJpbnQoJ0ZhaWxlZCB0byBnZW5lcmF0ZSByZWZlcmVuY2UgaW1hZ2VzJykKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHByaW50KCdGYWlsZWQgdG8gZ2VuZXJhdGUgcmVmZXJlbmNlIGltYWdlcycpCisgICAgICAgICAgICBwcmludCgnTm8gZGV2aWNlcyBmb3VuZCcpCiAKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvdGhlbWUvc3JjL2FuZHJvaWQvdGhlbWUvY3RzL0NvbXBhcmlzb25UYXNrLmphdmEgYi9ob3N0c2lkZXRlc3RzL3RoZW1lL3NyYy9hbmRyb2lkL3RoZW1lL2N0cy9Db21wYXJpc29uVGFzay5qYXZhCmluZGV4IDM3MWUxYTkuLjYzNDQxNDMgMTAwNzU1Ci0tLSBhL2hvc3RzaWRldGVzdHMvdGhlbWUvc3JjL2FuZHJvaWQvdGhlbWUvY3RzL0NvbXBhcmlzb25UYXNrLmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy90aGVtZS9zcmMvYW5kcm9pZC90aGVtZS9jdHMvQ29tcGFyaXNvblRhc2suamF2YQpAQCAtNDEsNyArNDEsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHUkFZID0gMHhGRjgwODA4MDsKIAogICAgIC8qKiBNYXhpbXVtIGFsbG93YWJsZSBudW1iZXIgb2YgY29uc2VjdXRpdmUgZmFpbGVkIHBpeGVscy4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0NPTlNFQ1VUSVZFX0ZBSUxVUkVTID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0NPTlNFQ1VUSVZFX0ZBSUxVUkVTID0gMjsKIAogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1OYW1lOwogICAgIHByaXZhdGUgZmluYWwgRmlsZSBtRXhwZWN0ZWQ7CkBAIC04Nyw2ICs4NywzNSBAQAogICAgICAgICByZXR1cm4gKGNvbG9yICYgMHhGRjAwMDAwMCkgPj4+IDI0OwogICAgIH0KIAorICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2hlY2tOZWlnaGJvcnMoaW50IHgsIGludCB5LCBCdWZmZXJlZEltYWdlIHJlZmVyZW5jZSwKKyAgICAgICAgICAgIEJ1ZmZlcmVkSW1hZ2UgZ2VuZXJhdGVkLCBpbnQgdGhyZXNob2xkKSB7CisgICAgICAgIGZpbmFsIGludCB3ID0gZ2VuZXJhdGVkLmdldFdpZHRoKCk7CisgICAgICAgIGZpbmFsIGludCBoID0gZ2VuZXJhdGVkLmdldEhlaWdodCgpOworICAgICAgICBmb3IgKGludCBpID0geCAtIE1BWF9DT05TRUNVVElWRV9GQUlMVVJFUzsgaSA8PSB4ICsgTUFYX0NPTlNFQ1VUSVZFX0ZBSUxVUkVTOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChpID49IDAgJiYgaSAhPSB4ICYmIGkgPCB3KSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IHkgLSBNQVhfQ09OU0VDVVRJVkVfRkFJTFVSRVM7IGogPD0geSArIE1BWF9DT05TRUNVVElWRV9GQUlMVVJFUzsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChqID49IDAgJiYgaiAhPSB5ICYmIGogPCBoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcDEgPSByZWZlcmVuY2UuZ2V0UkdCKGksIGopOworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHAyID0gZ2VuZXJhdGVkLmdldFJHQihpLCBqKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGRyID0gZ2V0QWxwaGFTY2FsZWRSZWQocDEpIC0gZ2V0QWxwaGFTY2FsZWRSZWQocDIpOworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGRnID0gZ2V0QWxwaGFTY2FsZWRHcmVlbihwMSkgLSBnZXRBbHBoYVNjYWxlZEdyZWVuKHAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBkYiA9IGdldEFscGhhU2NhbGVkQmx1ZShwMSkgLSBnZXRBbHBoYVNjYWxlZEJsdWUocDIpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMoZGIpIDw9IHRocmVzaG9sZCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguYWJzKGRnKSA8PSB0aHJlc2hvbGQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLmFicyhkcikgPD0gdGhyZXNob2xkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgZmluZCBhdCBsZWFzdCBvbmUgbWF0Y2hpbmcgbmVpZ2hib3IsIHdlIGFzc3VtZSB0aGUgZGlmZmVyZW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIGluIGFudGlhbGlhc2luZy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCiAKICAgICAvKioKICAgICAgKiBWZXJpZmllcyB0aGF0IHRoZSBwaXhlbHMgb2YgcmVmZXJlbmNlIGFuZCBnZW5lcmF0ZWQgaW1hZ2VzIGFyZSBzaW1pbGFyCkBAIC0xMDcsNyArMTM2LDYgQEAKIAogICAgICAgICBkb3VibGUgbWF4RGlzdCA9IDA7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdzsgaSsrKSB7Ci0gICAgICAgICAgICBpbnQgY29uc2VjdXRpdmUgPSAwOwogCiAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGg7IGorKykgewogICAgICAgICAgICAgICAgIGZpbmFsIGludCBwMSA9IHJlZmVyZW5jZS5nZXRSR0IoaSwgaik7CkBAIC0xMjEsMTUgKzE0OSwxMCBAQAogICAgICAgICAgICAgICAgICAgICBNYXRoLmFicyhkZykgPiB0aHJlc2hvbGQgfHwKICAgICAgICAgICAgICAgICAgICAgTWF0aC5hYnMoZHIpID4gdGhyZXNob2xkKSB7CiAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiZmFpbCBkcj0iICsgZHIrICIgZGc9IiArIGRnKyAiIGRiPSIgKyBkYik7Ci0KLSAgICAgICAgICAgICAgICAgICAgY29uc2VjdXRpdmUrKzsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoY29uc2VjdXRpdmUgPiBNQVhfQ09OU0VDVVRJVkVfRkFJTFVSRVMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGVja05laWdoYm9ycyhpLCBqLCByZWZlcmVuY2UsIGdlbmVyYXRlZCwgdGhyZXNob2xkKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJjb25zZWN1dGl2ZSBmYWlsIik7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjb25zZWN1dGl2ZSA9IDA7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3RoZW1lL3NyYy9hbmRyb2lkL3RoZW1lL2N0cy9UaGVtZUhvc3RUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL3RoZW1lL3NyYy9hbmRyb2lkL3RoZW1lL2N0cy9UaGVtZUhvc3RUZXN0LmphdmEKaW5kZXggZDU0OWUwMy4uNGRjNTZmOCAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy90aGVtZS9zcmMvYW5kcm9pZC90aGVtZS9jdHMvVGhlbWVIb3N0VGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvdGhlbWUvc3JjL2FuZHJvaWQvdGhlbWUvY3RzL1RoZW1lSG9zdFRlc3QuamF2YQpAQCAtNDQsOCArNDQsNiBAQAogaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7CiBpbXBvcnQgamF2YS51dGlsLnppcC5aaXBJbnB1dFN0cmVhbTsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ2RkVGVzdDsKLQogLyoqCiAgKiBUZXN0IHRvIGNoZWNrIG5vbi1tb2RpZmlhYmxlIHRoZW1lcyBoYXZlIG5vdCBiZWVuIGNoYW5nZWQuCiAgKi8KQEAgLTU3LDcgKzU1LDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVEVEX0FTU0VUU19aSVAgPSAiL3NkY2FyZC9jdHMtdGhlbWUtYXNzZXRzLnppcCI7CiAKICAgICAvKiogVGhlIGNsYXNzIG5hbWUgb2YgdGhlIG1haW4gYWN0aXZpdHkgaW4gdGhlIEFQSy4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9DTEFTUyA9ICJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9DTEFTUyA9ICJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiOwogCiAgICAgLyoqIFRoZSBjb21tYW5kIHRvIGxhdW5jaCB0aGUgbWFpbiBpbnN0cnVtZW50YXRpb24gdGVzdC4gKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRfQ01EID0gU3RyaW5nLmZvcm1hdCgKQEAgLTg1LDEzICs4MywxNiBAQAogCiAgICAgcHJpdmF0ZSBFeGVjdXRvckNvbXBsZXRpb25TZXJ2aWNlPFBhaXI8U3RyaW5nLCBGaWxlPj4gbUNvbXBsZXRpb25TZXJ2aWNlOwogCisgICAgLy8gRGVuc2l0eSB0byB3aGljaCB0aGUgZGV2aWNlIHNob3VsZCBiZSByZXN0b3JlZCwgb3IgLTEgaWYgdW5uZWNlc3NhcnkuCisgICAgcHJpdmF0ZSBpbnQgbVJlc3RvcmVEZW5zaXR5OwogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgc3VwZXIuc2V0VXAoKTsKIAogICAgICAgICBtRGV2aWNlID0gZ2V0RGV2aWNlKCk7Ci0KKyAgICAgICAgbVJlc3RvcmVEZW5zaXR5ID0gcmVzZXREZW5zaXR5SWZOZWVkZWQobURldmljZSk7CisgICAgICAgIG1EZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZCgic2V0dGluZ3MgcHV0IHN5c3RlbSBmb250X3NjYWxlIDEuMCIpOwogICAgICAgICBmaW5hbCBTdHJpbmcgZGVuc2l0eSA9IGdldERlbnNpdHlCdWNrZXRGb3JEZXZpY2UobURldmljZSk7CiAgICAgICAgIGZpbmFsIFN0cmluZyByZWZlcmVuY2VaaXBBc3NldFBhdGggPSBTdHJpbmcuZm9ybWF0KCIvJXMuemlwIiwgZGVuc2l0eSk7CiAgICAgICAgIG1SZWZlcmVuY2VzID0gZXh0cmFjdFJlZmVyZW5jZUltYWdlcyhyZWZlcmVuY2VaaXBBc3NldFBhdGgpOwpAQCAtMTQxLDkgKzE0MiwxMSBAQAogICAgICAgICAvLyBSZW1vdmUgZ2VuZXJhdGVkIGltYWdlcy4KICAgICAgICAgbURldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKENMRUFSX0dFTkVSQVRFRF9DTUQpOwogCisgICAgICAgIHJlc3RvcmVEZW5zaXR5SWZOZWVkZWQobURldmljZSwgbVJlc3RvcmVEZW5zaXR5KTsKKwogICAgICAgICBzdXBlci50ZWFyRG93bigpOwogICAgIH0KLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iMy44LjYvQy0xLTEsQy0xLTIiKQorCiAgICAgcHVibGljIHZvaWQgdGVzdFRoZW1lcygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBpZiAoY2hlY2tIYXJkd2FyZVR5cGVTa2lwVGVzdChtRGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoSEFSRFdBUkVfVFlQRV9DTUQpLnRyaW0oKSkpIHsKICAgICAgICAgICAgIExvZy5sb2dBbmREaXNwbGF5KExvZ0xldmVsLklORk8sIExPR19UQUcsICJTa2lwcGVkIHRoZW1lcyB0ZXN0IGZvciB3YXRjaCAvIFRWIC8gYXV0b21vdGl2ZSIpOwpAQCAtMjcwLDE0ICsyNzMsMjYgQEAKICAgICAgICAgcmV0dXJuIGJ1Y2tldDsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0RGVuc2l0eUZvckRldmljZShJVGVzdERldmljZSBkZXZpY2UpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24geworICAgIHByaXZhdGUgc3RhdGljIGludCByZXNldERlbnNpdHlJZk5lZWRlZChJVGVzdERldmljZSBkZXZpY2UpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewogICAgICAgICBmaW5hbCBTdHJpbmcgb3V0cHV0ID0gZGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoV01fREVOU0lUWSk7CiAgICAgICAgIGZpbmFsIFBhdHRlcm4gcCA9IFBhdHRlcm4uY29tcGlsZSgiT3ZlcnJpZGUgZGVuc2l0eTogKFxcZCspIik7CiAgICAgICAgIGZpbmFsIE1hdGNoZXIgbSA9IHAubWF0Y2hlcihvdXRwdXQpOwogICAgICAgICBpZiAobS5maW5kKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDYW5ub3QgdGVzdCBkZXZpY2UgcnVubmluZyBhdCBub24tZGVmYXVsdCBkZW5zaXR5OiAiCi0gICAgICAgICAgICAgICAgICAgICsgSW50ZWdlci5wYXJzZUludChtLmdyb3VwKDEpKSk7CisgICAgICAgICAgICBkZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZChXTV9ERU5TSVRZICsgIiByZXNldCIpOworICAgICAgICAgICAgaW50IHJlc3RvcmVEZW5zaXR5ID0gSW50ZWdlci5wYXJzZUludChtLmdyb3VwKDEpKTsKKyAgICAgICAgICAgIHJldHVybiByZXN0b3JlRGVuc2l0eTsKICAgICAgICAgfQorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCByZXN0b3JlRGVuc2l0eUlmTmVlZGVkKElUZXN0RGV2aWNlIGRldmljZSwgaW50IHJlc3RvcmVEZW5zaXR5KQorICAgICAgICAgICAgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChyZXN0b3JlRGVuc2l0eSA+IDApIHsKKyAgICAgICAgICAgIGRldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKFdNX0RFTlNJVFkgKyAiICIgKyByZXN0b3JlRGVuc2l0eSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0RGVuc2l0eUZvckRldmljZShJVGVzdERldmljZSBkZXZpY2UpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewogCiAgICAgICAgIGZpbmFsIFN0cmluZyBkZW5zaXR5UHJvcDsKICAgICAgICAgaWYgKGRldmljZS5nZXRTZXJpYWxOdW1iZXIoKS5zdGFydHNXaXRoKCJlbXVsYXRvci0iKSkgewpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy90cnVzdGVkdm9pY2UvQW5kcm9pZFRlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy90cnVzdGVkdm9pY2UvQW5kcm9pZFRlc3QueG1sCmluZGV4IDNlMjMyMzYuLjI3Njc5OTIgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvdHJ1c3RlZHZvaWNlL0FuZHJvaWRUZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL3RydXN0ZWR2b2ljZS9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBUcnVzdGVkdm9pY2UgaG9zdCB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iZnJhbWV3b3JrIiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3R2L0FuZHJvaWRUZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvdHYvQW5kcm9pZFRlc3QueG1sCmluZGV4IGQ5ZWRhZDAuLjA3YzM4ZGUgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvdHYvQW5kcm9pZFRlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvdHYvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgdHYgaG9zdCB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0idHYiIC8+CiAgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRlc3R0eXBlLkphckhvc3RUZXN0IiA+CiAgICAgICAgIDxvcHRpb24gbmFtZT0iamFyIiB2YWx1ZT0iQ3RzSG9zdHNpZGVUdlRlc3RzLmphciIgLz4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvdHYvYXBwL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL3R2L2FwcC9BbmRyb2lkLm1rCmluZGV4IDVmZmRlYjQuLjBiNDk4ODUgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvdHYvYXBwL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy90di9hcHAvQW5kcm9pZC5tawpAQCAtMjAsNyArMjAsNyBAQAogCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwogTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwgY3RzdGVzdHJ1bm5lcgorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0IGN0c3Rlc3RydW5uZXItYXh0CiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy90di9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvdHYvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggOTllZWI0NC4uYmVjN2RhYSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy90di9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL3R2L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0zMCw3ICszMCw3IEBACiAgICAgPC9hcHBsaWNhdGlvbj4KIAogICAgIDxpbnN0cnVtZW50YXRpb24KLSAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5jdHMudHYuaG9zdHNpZGUiIC8+CiAKIDwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3R2L2FwcDIvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvdHYvYXBwMi9BbmRyb2lkLm1rCmluZGV4IDc2YWU3NjUuLjgyNTc5MDkgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvdHYvYXBwMi9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvdHYvYXBwMi9BbmRyb2lkLm1rCkBAIC0yOSw5ICsyOSw5IEBACiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNIb3N0c2lkZVR2SW5wdXRNb25pdG9yCiAKLUxPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIuc3R1YnMKIAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwgY3RzdGVzdHJ1bm5lcgorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0IGN0c3Rlc3RydW5uZXItYXh0CiAKIExPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKIApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy90di9hcHAyL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL3R2L2FwcDIvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCAwYjIwZWU1Li41YjBmN2I2IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL3R2L2FwcDIvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL3R2L2FwcDIvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjgsNyArMjgsNyBAQAogICAgIDwvYXBwbGljYXRpb24+CiAKICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmFuZHJvaWQuY3RzLnR2Lmhvc3RzaWRlLmFwcDIiIC8+CiAKIDwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3R6ZGF0YS9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy90emRhdGEvQW5kcm9pZC5tawppbmRleCA1MGMyMmFiLi5lNmUzMWZiIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL3R6ZGF0YS9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvdHpkYXRhL0FuZHJvaWQubWsKQEAgLTIzLDcgKzIzLDcgQEAKIAogTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gdHJhZGVmZWQKIAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IHR6ZGF0YS10ZXN0aW5nLWhvc3QgdGltZV96b25lX2Rpc3Ryby1ob3N0IHRpbWVfem9uZV9kaXN0cm9fdG9vbHMtaG9zdAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IHR6ZGF0YS10ZXN0aW5nIHRpbWVfem9uZV9kaXN0cm8gdGltZV96b25lX2Rpc3Ryb190b29scwogCiBMT0NBTF9DVFNfVEVTVF9QQUNLQUdFIDo9IGFuZHJvaWQuaG9zdC50emRhdGEKIApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy90emRhdGEvQW5kcm9pZFRlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy90emRhdGEvQW5kcm9pZFRlc3QueG1sCmluZGV4IDFhMjcxNmUuLjM5ZmMxMDkgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvdHpkYXRhL0FuZHJvaWRUZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL3R6ZGF0YS9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyB0emRhdGFjaGVjayBob3N0IHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJsaWJjb3JlIiAvPgogICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5KYXJIb3N0VGVzdCIgPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImphciIgdmFsdWU9IkN0c0hvc3RUekRhdGFUZXN0cy5qYXIiIC8+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3VpL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL3VpL0FuZHJvaWQubWsKaW5kZXggYWY3ZTJjOS4uNTQ1MDQ1NCAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy91aS9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvdWkvQW5kcm9pZC5tawpAQCAtMzAsOCArMzAsOCBAQAogCiBMT0NBTF9DVFNfVEVTVF9QQUNLQUdFIDo9IGFuZHJvaWQudWkuY3RzCiAKLSMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCisjICpOb3QqIHRhZ2dlZCBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0IGludGVudGlvbmFsbHk6IGIvMTA5NjYwMTMyCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGdlbmVyYWwtdGVzdHMKIAogaW5jbHVkZSAkKEJVSUxEX0NUU19IT1NUX0pBVkFfTElCUkFSWSkKIApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy91aS9BbmRyb2lkVGVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL3VpL0FuZHJvaWRUZXN0LnhtbAppbmRleCA5YWFmN2E0Li44OGM1MTVhIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL3VpL0FuZHJvaWRUZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL3VpL0FuZHJvaWRUZXN0LnhtbApAQCAtMTQsNiArMTQsNyBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIFVJIGhvc3QgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9Im1pc2MiIC8+CiAgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRlc3R0eXBlLkphckhvc3RUZXN0IiA+CiAgICAgICAgIDxvcHRpb24gbmFtZT0iamFyIiB2YWx1ZT0iQ3RzVWlIb3N0VGVzdENhc2VzLmphciIgLz4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvdWkvYXBwQS9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy91aS9hcHBBL0FuZHJvaWQubWsKaW5kZXggN2RhNTYwNi4uMTdkYTY3NiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy91aS9hcHBBL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy91aS9hcHBBL0FuZHJvaWQubWsKQEAgLTIwLDcgKzIwLDEwIEBACiAKIExPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCiAKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsIGN0c3Rlc3RydW5uZXIKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCisgICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgXAorICAgIGN0c3Rlc3RydW5uZXItYXh0IFwKKwogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKQEAgLTI5LDYgKzMyLDYgQEAKICMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKIExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiAKLUxPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKK0xPQ0FMX1NES19WRVJTSU9OIDo9IHRlc3RfY3VycmVudAogCiBpbmNsdWRlICQoQlVJTERfQ1RTX1NVUFBPUlRfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvdWkvYXBwQS9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy91aS9hcHBBL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggZjMzNmFiZC4uOGQ1NzRkNSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy91aS9hcHBBL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy91aS9hcHBBL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTEsNiArMSw1IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLQotICAgICBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogCiAgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNiwyMSArMTUsMjkgQEAKIC0tPgogCiA8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBwYWNrYWdlPSJhbmRyb2lkLnRhc2tzd2l0Y2hpbmcuYXBwYSI+Ci0KLSAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkRJU0FCTEVfS0VZR1VBUkQiIC8+CisgICAgICAgIHBhY2thZ2U9ImFuZHJvaWQudGFza3N3aXRjaGluZy5hcHBhIgorICAgICAgICBhbmRyb2lkOnRhcmdldFNhbmRib3hWZXJzaW9uPSIyIj4KIAogICAgIDxhcHBsaWNhdGlvbj4KKyAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CisKICAgICAgICAgPGFjdGl2aXR5CiAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9Ii5BcHBBQWN0aXZpdHkiCi0gICAgICAgICAgICBhbmRyb2lkOmNvbmZpZ0NoYW5nZXM9ImtleWJvYXJkfGtleWJvYXJkSGlkZGVufG9yaWVudGF0aW9ufHNjcmVlblNpemV8dWlNb2RlIgogICAgICAgICAgICAgYW5kcm9pZDpzY3JlZW5PcmllbnRhdGlvbj0icG9ydHJhaXQiID4KLSAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgotICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KIAotICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5WSUVXIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkRFRkFVTFQiIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuQlJPV1NBQkxFIiAvPgorICAgICAgICAgICAgICAgIDxkYXRhIGFuZHJvaWQ6c2NoZW1lPSJodHRwcyIgLz4KKyAgICAgICAgICAgICAgICA8ZGF0YSBhbmRyb2lkOmhvc3Q9ImZvby5jb20iIC8+CisgICAgICAgICAgICAgICAgPGRhdGEgYW5kcm9pZDpwYXRoPSIvYXBwYSIgLz4KICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKwogICAgICAgICA8L2FjdGl2aXR5PgogICAgIDwvYXBwbGljYXRpb24+CiAKLTwvbWFuaWZlc3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQudGFza3N3aXRjaGluZy5hcHBhIiAvPgorCis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy91aS9hcHBBL3NyYy9hbmRyb2lkL3Rhc2tzd2l0Y2hpbmcvYXBwYS9BcHBBQWN0aXZpdHkuamF2YSBiL2hvc3RzaWRldGVzdHMvdWkvYXBwQS9zcmMvYW5kcm9pZC90YXNrc3dpdGNoaW5nL2FwcGEvQXBwQUFjdGl2aXR5LmphdmEKaW5kZXggMzJjY2ZjMS4uMmZlNDlhYyAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy91aS9hcHBBL3NyYy9hbmRyb2lkL3Rhc2tzd2l0Y2hpbmcvYXBwYS9BcHBBQWN0aXZpdHkuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL3VpL2FwcEEvc3JjL2FuZHJvaWQvdGFza3N3aXRjaGluZy9hcHBhL0FwcEFBY3Rpdml0eS5qYXZhCkBAIC0xNywxMCArMTcsOSBAQAogcGFja2FnZSBhbmRyb2lkLnRhc2tzd2l0Y2hpbmcuYXBwYTsKIAogaW1wb3J0IGFuZHJvaWQuYXBwLkxpc3RBY3Rpdml0eTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotCiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlQ2FsbGJhY2s7CiBpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OwpAQCAtMzAsOSArMjksNyBAQAogICogVGhpcyBpcyBmb3IgbWVhc3VyaW5nIHRhc2tzd2l0Y2hpbmcgdGltZSBiZXR3ZWVuIHR3byBhcHBzLgogICovCiBwdWJsaWMgY2xhc3MgQXBwQUFjdGl2aXR5IGV4dGVuZHMgTGlzdEFjdGl2aXR5IHsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJBcHBBQWN0aXZpdHkiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOVU1CRVJfRUxFTUVOVFMgPSAxMDAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLU1dJVENISU5HX0lOVEVOVCA9ICJhbmRyb2lkLnRhc2tzd2l0Y2hpbmcuYXBwYSI7CiAgICAgcHJpdmF0ZSBIYW5kbGVyIG1IYW5kbGVyOwogCiAgICAgcHJpdmF0ZSBTdHJpbmdbXSBtSXRlbXMgPSBuZXcgU3RyaW5nW05VTUJFUl9FTEVNRU5UU107CkBAIC01MywxMyArNTAsOCBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG9uUmVzdW1lKCkgewogICAgICAgICBzdXBlci5vblJlc3VtZSgpOwotICAgICAgICBtSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoVEFTS1NXSVRDSElOR19JTlRFTlQpOwotICAgICAgICAgICAgICAgIHNlbmRCcm9hZGNhc3QoaW50ZW50KTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgbUhhbmRsZXIucG9zdCgoKSAtPiB7CisgICAgICAgICAgICBnZXRJbnRlbnQoKS48UmVtb3RlQ2FsbGJhY2s+Z2V0UGFyY2VsYWJsZUV4dHJhKCJjYWxsYmFjayIpLnNlbmRSZXN1bHQobnVsbCk7CiAgICAgICAgIH0pOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvdWkvYXBwQi9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy91aS9hcHBCL0FuZHJvaWQubWsKaW5kZXggMDdlMjg1OC4uMTFmYzJiMCAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy91aS9hcHBCL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy91aS9hcHBCL0FuZHJvaWQubWsKQEAgLTIwLDcgKzIwLDEwIEBACiAKIExPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCiAKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsIGN0c3Rlc3RydW5uZXIKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCisgICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgXAorICAgIGN0c3Rlc3RydW5uZXItYXh0IFwKKwogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKQEAgLTI5LDYgKzMyLDYgQEAKICMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKIExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiAKLUxPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKK0xPQ0FMX1NES19WRVJTSU9OIDo9IHRlc3RfY3VycmVudAogCiBpbmNsdWRlICQoQlVJTERfQ1RTX1NVUFBPUlRfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvdWkvYXBwQi9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy91aS9hcHBCL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggYWFmN2EyYy4uOWIzNzBjMSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy91aS9hcHBCL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy91aS9hcHBCL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTE1LDIwICsxNSwzMiBAQAogLS0+CiAKIDxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIHBhY2thZ2U9ImFuZHJvaWQudGFza3N3aXRjaGluZy5hcHBiIj4KKyAgICAgICAgcGFja2FnZT0iYW5kcm9pZC50YXNrc3dpdGNoaW5nLmFwcGIiCisgICAgICAgIGFuZHJvaWQ6dGFyZ2V0U2FuZGJveFZlcnNpb249IjIiPgogCiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5ESVNBQkxFX0tFWUdVQVJEIiAvPgogCiAgICAgPGFwcGxpY2F0aW9uPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKwogICAgICAgICA8YWN0aXZpdHkKICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iLkFwcEJBY3Rpdml0eSIKICAgICAgICAgICAgIGFuZHJvaWQ6Y29uZmlnQ2hhbmdlcz0ia2V5Ym9hcmR8a2V5Ym9hcmRIaWRkZW58b3JpZW50YXRpb258c2NyZWVuU2l6ZXx1aU1vZGUiCiAgICAgICAgICAgICBhbmRyb2lkOnNjcmVlbk9yaWVudGF0aW9uPSJwb3J0cmFpdCIgPgogCiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KLSAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+Ci0gICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiLz4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlZJRVciIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuREVGQVVMVCIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5CUk9XU0FCTEUiIC8+CisgICAgICAgICAgICAgICAgPGRhdGEgYW5kcm9pZDpzY2hlbWU9Imh0dHBzIiAvPgorICAgICAgICAgICAgICAgIDxkYXRhIGFuZHJvaWQ6aG9zdD0iZm9vLmNvbSIgLz4KKyAgICAgICAgICAgICAgICA8ZGF0YSBhbmRyb2lkOnBhdGg9Ii9hcHBiIiAvPgogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorCiAgICAgICAgIDwvYWN0aXZpdHk+CiAgICAgPC9hcHBsaWNhdGlvbj4KKworICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQudGFza3N3aXRjaGluZy5hcHBiIiAvPgorCiA8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy91aS9hcHBCL3NyYy9hbmRyb2lkL3Rhc2tzd2l0Y2hpbmcvYXBwYi9BcHBCQWN0aXZpdHkuamF2YSBiL2hvc3RzaWRldGVzdHMvdWkvYXBwQi9zcmMvYW5kcm9pZC90YXNrc3dpdGNoaW5nL2FwcGIvQXBwQkFjdGl2aXR5LmphdmEKaW5kZXggZWE3ZjUyYS4uYzc5OWQ0NiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy91aS9hcHBCL3NyYy9hbmRyb2lkL3Rhc2tzd2l0Y2hpbmcvYXBwYi9BcHBCQWN0aXZpdHkuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL3VpL2FwcEIvc3JjL2FuZHJvaWQvdGFza3N3aXRjaGluZy9hcHBiL0FwcEJBY3Rpdml0eS5qYXZhCkBAIC0xNyw5ICsxNyw5IEBACiBwYWNrYWdlIGFuZHJvaWQudGFza3N3aXRjaGluZy5hcHBiOwogCiBpbXBvcnQgYW5kcm9pZC5hcHAuTGlzdEFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlQ2FsbGJhY2s7CiBpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OwpAQCAtMjksOSArMjksNyBAQAogICogVGhpcyBpcyBmb3IgbWVhc3VyaW5nIHRhc2tzd2l0Y2hpbmcgdGltZSBiZXR3ZWVuIHR3byBhcHBzLgogICovCiBwdWJsaWMgY2xhc3MgQXBwQkFjdGl2aXR5IGV4dGVuZHMgTGlzdEFjdGl2aXR5IHsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJBcHBCQWN0aXZpdHkiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOVU1CRVJfRUxFTUVOVFMgPSAxMDAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLU1dJVENISU5HX0lOVEVOVCA9ICJhbmRyb2lkLnRhc2tzd2l0Y2hpbmcuYXBwYiI7CiAgICAgcHJpdmF0ZSBIYW5kbGVyIG1IYW5kbGVyOwogCiAgICAgcHJpdmF0ZSBTdHJpbmdbXSBtSXRlbXMgPSBuZXcgU3RyaW5nW05VTUJFUl9FTEVNRU5UU107CkBAIC01MiwxMyArNTAsOCBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG9uUmVzdW1lKCkgewogICAgICAgICBzdXBlci5vblJlc3VtZSgpOwotICAgICAgICBtSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoVEFTS1NXSVRDSElOR19JTlRFTlQpOwotICAgICAgICAgICAgICAgIHNlbmRCcm9hZGNhc3QoaW50ZW50KTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgbUhhbmRsZXIucG9zdCgoKSAtPiB7CisgICAgICAgICAgICBnZXRJbnRlbnQoKS48UmVtb3RlQ2FsbGJhY2s+Z2V0UGFyY2VsYWJsZUV4dHJhKCJjYWxsYmFjayIpLnNlbmRSZXN1bHQobnVsbCk7CiAgICAgICAgIH0pOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvdWkvY29udHJvbC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy91aS9jb250cm9sL0FuZHJvaWQubWsKaW5kZXggNjg4YWNlNy4uMmEzMDMzOCAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy91aS9jb250cm9sL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy91aS9jb250cm9sL0FuZHJvaWQubWsKQEAgLTIwLDcgKzIwLDkgQEAKIAogTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKIAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwgY3RzdGVzdHJ1bm5lcgorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0IGN0c3Rlc3RydW5uZXItYXh0CisKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIuc3R1YnMgYW5kcm9pZC50ZXN0LmJhc2Uuc3R1YnMKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogCkBAIC0yOSw2ICszMSw2IEBACiAjIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0CiBMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cwogCi1MT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CitMT0NBTF9TREtfVkVSU0lPTiA6PSB0ZXN0X2N1cnJlbnQKIAogaW5jbHVkZSAkKEJVSUxEX0NUU19TVVBQT1JUX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3VpL2NvbnRyb2wvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2hvc3RzaWRldGVzdHMvdWkvY29udHJvbC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDgxMDI2MjAuLjg1ZjBiYTggMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvdWkvY29udHJvbC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvdWkvY29udHJvbC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0xNSw3ICsxNSw4IEBACiAtLT4KIAogPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgcGFja2FnZT0iYW5kcm9pZC50YXNrc3dpdGNoaW5nLmNvbnRyb2wuY3RzIj4KKyAgICAgICAgcGFja2FnZT0iYW5kcm9pZC50YXNrc3dpdGNoaW5nLmNvbnRyb2wuY3RzIgorICAgICAgICBhbmRyb2lkOnRhcmdldFNhbmRib3hWZXJzaW9uPSIyIj4KIAogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uRElTQUJMRV9LRVlHVUFSRCIgLz4KICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0VYVEVSTkFMX1NUT1JBR0UiIC8+CkBAIC0yNSw3ICsyNiw3IEBACiAgICAgPC9hcHBsaWNhdGlvbj4KICAgICA8aW5zdHJ1bWVudGF0aW9uCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC50YXNrc3dpdGNoaW5nLmNvbnRyb2wuY3RzIgotICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiID4KKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiID4KICAgICAgICAgPG1ldGEtZGF0YQogICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJsaXN0ZW5lciIKICAgICAgICAgICAgIGFuZHJvaWQ6dmFsdWU9ImNvbS5hbmRyb2lkLmN0cy5ydW5uZXIuQ3RzVGVzdFJ1bkxpc3RlbmVyIiAvPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy91aS9jb250cm9sL3NyYy9hbmRyb2lkL3Rhc2tzd2l0Y2hpbmcvY29udHJvbC9jdHMvVGFza1N3aXRjaGluZ0RldmljZVRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvdWkvY29udHJvbC9zcmMvYW5kcm9pZC90YXNrc3dpdGNoaW5nL2NvbnRyb2wvY3RzL1Rhc2tTd2l0Y2hpbmdEZXZpY2VUZXN0LmphdmEKaW5kZXggNmI5OWMyMC4uMTQ3MTU1MCAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy91aS9jb250cm9sL3NyYy9hbmRyb2lkL3Rhc2tzd2l0Y2hpbmcvY29udHJvbC9jdHMvVGFza1N3aXRjaGluZ0RldmljZVRlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL3VpL2NvbnRyb2wvc3JjL2FuZHJvaWQvdGFza3N3aXRjaGluZy9jb250cm9sL2N0cy9UYXNrU3dpdGNoaW5nRGV2aWNlVGVzdC5qYXZhCkBAIC0xNiwxNyArMTYsMTEgQEAKIAogcGFja2FnZSBhbmRyb2lkLnRhc2tzd2l0Y2hpbmcuY29udHJvbC5jdHM7CiAKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TZW1hcGhvcmU7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUNhbGxiYWNrOwogCiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DdHNBbmRyb2lkVGVzdENhc2U7Ci0KIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkRldmljZVJlcG9ydExvZzsKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLk1lYXN1cmVSdW47CiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5NZWFzdXJlVGltZTsKQEAgLTM0LDYgKzI4LDExIEBACiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5SZXN1bHRVbml0OwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuU3RhdDsKIAoraW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TZW1hcGhvcmU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZW91dEV4Y2VwdGlvbjsKKwogLyoqCiAgKiBEZXZpY2UgdGVzdCB3aGljaCBhY3R1YWxseSBsYXVuY2hlcyB0d28gYXBwcyBzZXF1ZW50aWFsbHkgYW5kCiAgKiBtZWFzdXJlIHRpbWUgZm9yIHN3aXRjaGluZy4KQEAgLTQxLDMyICs0MCwxNSBAQAogICovCiBwdWJsaWMgY2xhc3MgVGFza1N3aXRjaGluZ0RldmljZVRlc3QgZXh0ZW5kcyBDdHNBbmRyb2lkVGVzdENhc2UgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBPUlRfTE9HX05BTUUgPSAiQ3RzVWlIb3N0VGVzdENhc2VzIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEtHX0EgPSAiYW5kcm9pZC50YXNrc3dpdGNoaW5nLmFwcGEiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQS0dfQiA9ICJhbmRyb2lkLnRhc2tzd2l0Y2hpbmcuYXBwYiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElWSVRZX0EgPSAiQXBwQUFjdGl2aXR5IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSVZJVFlfQiA9ICJBcHBCQWN0aXZpdHkiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVEFTS19TV0lUQ0hJTkdfV0FJVF9USU1FID0gNTsKLSAgICBwcml2YXRlIGZpbmFsIEFwcEJyb2FkY2FzdFJlY2VpdmVyIG1SZWNlaXZlckEgPSBuZXcgQXBwQnJvYWRjYXN0UmVjZWl2ZXIoKTsKLSAgICBwcml2YXRlIGZpbmFsIEFwcEJyb2FkY2FzdFJlY2VpdmVyIG1SZWNlaXZlckIgPSBuZXcgQXBwQnJvYWRjYXN0UmVjZWl2ZXIoKTsKKworICAgIHByaXZhdGUgZmluYWwgU2VtYXBob3JlIG1TZW1hcGhvcmUgPSBuZXcgU2VtYXBob3JlKDApOwogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgZ2V0Q29udGV4dCgpLnJlZ2lzdGVyUmVjZWl2ZXIobVJlY2VpdmVyQSwgbmV3IEludGVudEZpbHRlcihQS0dfQSkpOwotICAgICAgICBnZXRDb250ZXh0KCkucmVnaXN0ZXJSZWNlaXZlcihtUmVjZWl2ZXJCLCBuZXcgSW50ZW50RmlsdGVyKFBLR19CKSk7CiAKLSAgICAgICAgc3RhcnRBY3Rpdml0eShQS0dfQSwgQUNUSVZJVFlfQSk7Ci0gICAgICAgIGFzc2VydFRydWUobVJlY2VpdmVyQS53YWl0Rm9yQnJvYWRjYXN0KFRBU0tfU1dJVENISU5HX1dBSVRfVElNRSkpOwotCi0gICAgICAgIHN0YXJ0QWN0aXZpdHkoUEtHX0IsIEFDVElWSVRZX0IpOwotICAgICAgICBhc3NlcnRUcnVlKG1SZWNlaXZlckIud2FpdEZvckJyb2FkY2FzdChUQVNLX1NXSVRDSElOR19XQUlUX1RJTUUpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBnZXRDb250ZXh0KCkudW5yZWdpc3RlclJlY2VpdmVyKG1SZWNlaXZlckEpOwotICAgICAgICBnZXRDb250ZXh0KCkudW5yZWdpc3RlclJlY2VpdmVyKG1SZWNlaXZlckIpOwotICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgICAgICBzdGFydEFjdGl2aXRpZXNBQlNlcXVlbnRpYWxseSgpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RNZWFzdXJlVGFza1N3aXRjaGluZygpIHRocm93cyBFeGNlcHRpb24gewpAQCAtNzgsMTAgKzYwLDcgQEAKICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKGludCBpKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IFNXSVRDSElOR19QRVJfT05FX1RSWTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXJ0QWN0aXZpdHkoUEtHX0EsIEFDVElWSVRZX0EpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKG1SZWNlaXZlckEud2FpdEZvckJyb2FkY2FzdChUQVNLX1NXSVRDSElOR19XQUlUX1RJTUUpKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhcnRBY3Rpdml0eShQS0dfQiwgQUNUSVZJVFlfQik7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUobVJlY2VpdmVyQi53YWl0Rm9yQnJvYWRjYXN0KFRBU0tfU1dJVENISU5HX1dBSVRfVElNRSkpOworICAgICAgICAgICAgICAgICAgICBzdGFydEFjdGl2aXRpZXNBQlNlcXVlbnRpYWxseSgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfSk7CkBAIC05NCwyNCArNzMsMjAgQEAKICAgICAgICAgcmVwb3J0LnN1Ym1pdChnZXRJbnN0cnVtZW50YXRpb24oKSk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHN0YXJ0QWN0aXZpdHkoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgYWN0aXZpdHlOYW1lKSB7Ci0gICAgICAgIENvbnRleHQgY29udGV4dCA9IGdldENvbnRleHQoKTsKLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoKTsKLSAgICAgICAgaW50ZW50LnNldEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLKTsKLSAgICAgICAgaW50ZW50LmFkZENhdGVnb3J5KEludGVudC5DQVRFR09SWV9MQVVOQ0hFUik7Ci0gICAgICAgIGludGVudC5zZXRDb21wb25lbnQobmV3IENvbXBvbmVudE5hbWUocGFja2FnZU5hbWUsIHBhY2thZ2VOYW1lICsgIi4iICsgYWN0aXZpdHlOYW1lKSk7Ci0gICAgICAgIGNvbnRleHQuc3RhcnRBY3Rpdml0eShpbnRlbnQpOworICAgIHByaXZhdGUgdm9pZCBzdGFydEFjdGl2aXRpZXNBQlNlcXVlbnRpYWxseSgpCisgICAgICAgICAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24sIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHN0YXJ0QWN0aXZpdHlBbmRXYWl0KCdhJyk7CisgICAgICAgIHN0YXJ0QWN0aXZpdHlBbmRXYWl0KCdiJyk7CiAgICAgfQogCi0gICAgY2xhc3MgQXBwQnJvYWRjYXN0UmVjZWl2ZXIgZXh0ZW5kcyBCcm9hZGNhc3RSZWNlaXZlciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU2VtYXBob3JlIG1TZW1hcGhvcmUgPSBuZXcgU2VtYXBob3JlKDApOwotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHdhaXRGb3JCcm9hZGNhc3QobG9uZyB0aW1lb3V0SW5TZWMpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXR1cm4gbVNlbWFwaG9yZS50cnlBY3F1aXJlKHRpbWVvdXRJblNlYywgVGltZVVuaXQuU0VDT05EUyk7Ci0gICAgICAgIH0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgICAgIG1TZW1hcGhvcmUucmVsZWFzZSgpOwotICAgICAgICB9CisgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0QWN0aXZpdHlBbmRXYWl0KGNoYXIgYWN0aXZpdHlMZXR0ZXIpCisgICAgICAgICAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24sIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIGdldENvbnRleHQoKS5zdGFydEFjdGl2aXR5KG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9WSUVXKQorICAgICAgICAgICAgICAgIC5zZXREYXRhKFVyaS5wYXJzZSgiaHR0cHM6Ly9mb28uY29tL2FwcCIgKyBhY3Rpdml0eUxldHRlcikpCisgICAgICAgICAgICAgICAgLmFkZENhdGVnb3J5KEludGVudC5DQVRFR09SWV9ERUZBVUxUKQorICAgICAgICAgICAgICAgIC5hZGRDYXRlZ29yeShJbnRlbnQuQ0FURUdPUllfQlJPV1NBQkxFKQorICAgICAgICAgICAgICAgIC5zZXRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSykKKyAgICAgICAgICAgICAgICAucHV0RXh0cmEoImNhbGxiYWNrIiwgbmV3IFJlbW90ZUNhbGxiYWNrKGIgLT4gbVNlbWFwaG9yZS5yZWxlYXNlKCkpKSk7CisgICAgICAgIG1TZW1hcGhvcmUudHJ5QWNxdWlyZShUQVNLX1NXSVRDSElOR19XQUlUX1RJTUUsIFRpbWVVbml0LlNFQ09ORFMpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvdWkvc3JjL2FuZHJvaWQvdWkvY3RzL0luc3RhbGxUaW1lVGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy91aS9zcmMvYW5kcm9pZC91aS9jdHMvSW5zdGFsbFRpbWVUZXN0LmphdmEKaW5kZXggMWI0OWVjYS4uYzQ1YjAyMSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy91aS9zcmMvYW5kcm9pZC91aS9jdHMvSW5zdGFsbFRpbWVUZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy91aS9zcmMvYW5kcm9pZC91aS9jdHMvSW5zdGFsbFRpbWVUZXN0LmphdmEKQEAgLTE2LDYgKzE2LDkgQEAKIAogcGFja2FnZSBhbmRyb2lkLnVpLmN0czsKIAoraW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUluc3RhbnQ7CisKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC5idWlsZC5Db21wYXRpYmlsaXR5QnVpbGRIZWxwZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5NZWFzdXJlUnVuOwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuTWVhc3VyZVRpbWU7CkBAIC0yNSw3ICsyOCw2IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5TdGF0OwogaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5Mb2c7CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuYnVpbGQuSUJ1aWxkSW5mbzsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5idWlsZC5JQnVpbGRJbmZvOwogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5JVGVzdERldmljZTsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5EZXZpY2VUZXN0Q2FzZTsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JQWJpOwpAQCAtNzIsNyArNzQsMTcgQEAKICAgICAgICAgc3VwZXIudGVhckRvd24oKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbFRpbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBAQXBwTW9kZUluc3RhbnQKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbFRpbWVJbnN0YW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RJbnN0YWxsVGltZSh0cnVlKTsKKyAgICB9CisKKyAgICBAQXBwTW9kZUZ1bGwKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbFRpbWVGdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RJbnN0YWxsVGltZShmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RJbnN0YWxsVGltZShib29sZWFuIGluc3RhbnQpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBTdHJpbmcgc3RyZWFtTmFtZSA9ICJ0ZXN0X2luc3RhbGxfdGltZSI7CiAgICAgICAgIE1ldHJpY3NSZXBvcnRMb2cgcmVwb3J0ID0gbmV3IE1ldHJpY3NSZXBvcnRMb2cobUJ1aWxkLCBtQWJpLmdldE5hbWUoKSwKICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCIlcyMlcyIsIGdldENsYXNzKCkuZ2V0TmFtZSgpLCAidGVzdEluc3RhbGxUaW1lIiksIFJFUE9SVF9MT0dfTkFNRSwKQEAgLTg4LDcgKzEwMCw4IEBACiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bihpbnQgaSkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICAgICAgRmlsZSBhcHAgPSBidWlsZEhlbHBlci5nZXRUZXN0RmlsZShBUEspOwotICAgICAgICAgICAgICAgIFN0cmluZ1tdIG9wdGlvbnMgPSB7QWJpVXRpbHMuY3JlYXRlQWJpRmxhZyhtQWJpLmdldE5hbWUoKSl9OworICAgICAgICAgICAgICAgIFN0cmluZ1tdIG9wdGlvbnMgPQorICAgICAgICAgICAgICAgICAgICAgICAge0FiaVV0aWxzLmNyZWF0ZUFiaUZsYWcobUFiaS5nZXROYW1lKCkpLCBpbnN0YW50ID8gIi0taW5zdGFudCIgOiAiIn07CiAgICAgICAgICAgICAgICAgZGV2aWNlLmluc3RhbGxQYWNrYWdlKGFwcCwgZmFsc2UsIG9wdGlvbnMpOwogICAgICAgICAgICAgfQogICAgICAgICB9KTsKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvdWkvc3JjL2FuZHJvaWQvdWkvY3RzL1Rhc2tTd2l0Y2hpbmdUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL3VpL3NyYy9hbmRyb2lkL3VpL2N0cy9UYXNrU3dpdGNoaW5nVGVzdC5qYXZhCmluZGV4IDljZmQ5NTcuLjYyM2YwMTEgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvdWkvc3JjL2FuZHJvaWQvdWkvY3RzL1Rhc2tTd2l0Y2hpbmdUZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy91aS9zcmMvYW5kcm9pZC91aS9jdHMvVGFza1N3aXRjaGluZ1Rlc3QuamF2YQpAQCAtMTYsMTUgKzE2LDE4IEBACiAKIHBhY2thZ2UgYW5kcm9pZC51aS5jdHM7CiAKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVJbnN0YW50OworCiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQuYnVpbGQuQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuTWV0cmljc1N0b3JlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuUmVwb3J0TG9nOwogaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi50ZXN0cnVubmVyLlJlbW90ZUFuZHJvaWRUZXN0UnVubmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi50ZXN0cnVubmVyLlRlc3RJZGVudGlmaWVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi50ZXN0cnVubmVyLlRlc3RSdW5SZXN1bHQ7CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuYnVpbGQuSUJ1aWxkSW5mbzsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuSVRlc3REZXZpY2U7CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQucmVzdWx0LkNvbGxlY3RpbmdUZXN0TGlzdGVuZXI7CitpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQucmVzdWx0LlRlc3REZXNjcmlwdGlvbjsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5yZXN1bHQuVGVzdFJ1blJlc3VsdDsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5EZXZpY2VUZXN0Q2FzZTsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JQWJpOwogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLklBYmlSZWNlaXZlcjsKQEAgLTQ0LDcgKzQ3LDcgQEAKICAqLwogcHVibGljIGNsYXNzIFRhc2tTd2l0Y2hpbmdUZXN0IGV4dGVuZHMgRGV2aWNlVGVzdENhc2UgaW1wbGVtZW50cyBJQWJpUmVjZWl2ZXIsIElCdWlsZFJlY2VpdmVyIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlRhc2tTd2l0Y2hpbmdUZXN0IjsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUlVOTkVSID0gImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBSVU5ORVIgPSAiYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVUxUX0tFWSA9ICJDT01QQVRJQklMSVRZX1RFU1RfUkVTVUxUIjsKICAgICBwcml2YXRlIElCdWlsZEluZm8gbUJ1aWxkOwogICAgIHByaXZhdGUgSVRlc3REZXZpY2UgbURldmljZTsKQEAgLTc2LDkgKzc5LDEzIEBACiAgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgc3VwZXIuc2V0VXAoKTsKICAgICAgICAgbURldmljZSA9IGdldERldmljZSgpOwotICAgICAgICBTdHJpbmdbXSBvcHRpb25zID0ge0FiaVV0aWxzLmNyZWF0ZUFiaUZsYWcobUFiaS5nZXROYW1lKCkpfTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5zdGFsbFBhY2thZ2VzKGJvb2xlYW4gaW5zdGFudCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIENvbXBhdGliaWxpdHlCdWlsZEhlbHBlciBidWlsZEhlbHBlciA9IG5ldyBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIobUJ1aWxkKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBQQUNLQUdFUy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nW10gb3B0aW9ucyA9IHtBYmlVdGlscy5jcmVhdGVBYmlGbGFnKG1BYmkuZ2V0TmFtZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgaW5zdGFudCAmJiAhUEFDS0FHRVNbaV0uY29udGFpbnMoImNvbnRyb2wiKSA/ICItLWluc3RhbnQiIDogIiJ9OwogICAgICAgICAgICAgbURldmljZS51bmluc3RhbGxQYWNrYWdlKFBBQ0tBR0VTW2ldKTsKICAgICAgICAgICAgIEZpbGUgYXBwID0gYnVpbGRIZWxwZXIuZ2V0VGVzdEZpbGUoQVBLU1tpXSk7CiAgICAgICAgICAgICBtRGV2aWNlLmluc3RhbGxQYWNrYWdlKGFwcCwgZmFsc2UsIG9wdGlvbnMpOwpAQCAtOTQsNyArMTAxLDE5IEBACiAgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgdGVzdFRhc2tTd2l0Y2hpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBAQXBwTW9kZUluc3RhbnQKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGFza1N3aXRjaGluZ0luc3RhbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW5zdGFsbFBhY2thZ2VzKHRydWUpOworICAgICAgICBkb1Rlc3RUYXNrU3dpdGNoaW5nKCk7CisgICAgfQorCisgICAgQEFwcE1vZGVGdWxsCisgICAgcHVibGljIHZvaWQgdGVzdFRhc2tTd2l0Y2hpbmdGdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGluc3RhbGxQYWNrYWdlcyhmYWxzZSk7CisgICAgICAgIGRvVGVzdFRhc2tTd2l0Y2hpbmcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZG9UZXN0VGFza1N3aXRjaGluZygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBSZW1vdGVBbmRyb2lkVGVzdFJ1bm5lciB0ZXN0UnVubmVyID0gbmV3IFJlbW90ZUFuZHJvaWRUZXN0UnVubmVyKFBBQ0tBR0VTWzBdLCBSVU5ORVIsCiAgICAgICAgICAgICAgICAgbURldmljZS5nZXRJRGV2aWNlKCkpOwogICAgICAgICBMb2NhbExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExvY2FsTGlzdGVuZXIoKTsKQEAgLTExMSw3ICsxMzAsNyBAQAogCiAgICAgcHVibGljIGNsYXNzIExvY2FsTGlzdGVuZXIgZXh0ZW5kcyBDb2xsZWN0aW5nVGVzdExpc3RlbmVyIHsKICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RFbmRlZChUZXN0SWRlbnRpZmllciB0ZXN0LCBNYXA8U3RyaW5nLCBTdHJpbmc+IHRlc3RNZXRyaWNzKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RFbmRlZChUZXN0RGVzY3JpcHRpb24gdGVzdCwgTWFwPFN0cmluZywgU3RyaW5nPiB0ZXN0TWV0cmljcykgewogICAgICAgICAgICAgLy8gbmVjZXNzYXJ5IGFzIHRlc3RNZXRyaWNzIHBhc3NlZCBmcm9tIENvbGxlY3RpbmdUZXN0TGlzdGVybmVyIGlzIGVtcHR5CiAgICAgICAgICAgICBpZiAodGVzdE1ldHJpY3MuY29udGFpbnNLZXkoUkVTVUxUX0tFWSkpIHsKICAgICAgICAgICAgICAgICB0cnkgewpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy91c2FnZS9BbmRyb2lkVGVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL3VzYWdlL0FuZHJvaWRUZXN0LnhtbAppbmRleCA2ZGQ4ZTZmLi43MDc4NzA1IDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL3VzYWdlL0FuZHJvaWRUZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL3VzYWdlL0FuZHJvaWRUZXN0LnhtbApAQCAtMTQsMTMgKzE0LDE1IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgQXBwIFVzYWdlIGhvc3QgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImZyYW1ld29yayIgLz4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgogICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzQXBwVXNhZ2VUZXN0QXBwLmFwayIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0FwcFVzYWdlVGVzdEFwcFRvby5hcGsiIC8+CiAgICAgPC90YXJnZXRfcHJlcGFyZXI+CiAgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRlc3R0eXBlLkphckhvc3RUZXN0IiA+CiAgICAgICAgIDxvcHRpb24gbmFtZT0iamFyIiB2YWx1ZT0iQ3RzQXBwVXNhZ2VIb3N0VGVzdENhc2VzLmphciIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJydW50aW1lLWhpbnQiIHZhbHVlPSI4bSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJydW50aW1lLWhpbnQiIHZhbHVlPSIybSIgLz4KICAgICA8L3Rlc3Q+CiA8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3VzYWdlL2FwcC9BbmRyb2lkLm1rIGIvaG9zdHNpZGV0ZXN0cy91c2FnZS9hcHAvQW5kcm9pZC5tawppbmRleCA1OTYyNmQ2Li4zZDUxMjMwIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL3VzYWdlL2FwcC9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvdXNhZ2UvYXBwL0FuZHJvaWQubWsKQEAgLTI5LDMgKzI5LDIzIEBACiBMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cwogCiBpbmNsdWRlICQoQlVJTERfQ1RTX1NVUFBPUlRfUEFDS0FHRSkKKworIyBCdWlsZCBhIHNlY29uZCBvbmUgc2ltaWxhciB0byB0aGUgZmlyc3QKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKKyMgRG9uJ3QgaW5jbHVkZSB0aGlzIHBhY2thZ2UgaW4gYW55IHRhcmdldC4KK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKKworTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzQXBwVXNhZ2VUZXN0QXBwVG9vCisKKyMgdGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCisKK0xPQ0FMX0FBUFRfRkxBR1MgKz0gLS1yZW5hbWUtbWFuaWZlc3QtcGFja2FnZSBhbmRyb2lkLmFwcC51c2FnZS5hcHB0b28KKworaW5jbHVkZSAkKEJVSUxEX0NUU19TVVBQT1JUX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3VzYWdlL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy91c2FnZS9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA3ZDVjZTQ4Li4zMDNjMjZmIDEwMDc1NQotLS0gYS9ob3N0c2lkZXRlc3RzL3VzYWdlL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvdXNhZ2UvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTE5LDcgKzE5LDcgQEAKICAgICBwYWNrYWdlPSJhbmRyb2lkLmFwcC51c2FnZS5hcHAiPgogCiAgICAgPGFwcGxpY2F0aW9uPgotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuVGVzdEFjdGl2aXR5Ij4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hcHAudXNhZ2UuYXBwLlRlc3RBY3Rpdml0eSI+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CiAgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuREVGQVVMVCIgLz4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvdXNhZ2Uvc3JjL2FuZHJvaWQvYXBwL3VzYWdlL2N0cy9BcHBJZGxlSG9zdFRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvdXNhZ2Uvc3JjL2FuZHJvaWQvYXBwL3VzYWdlL2N0cy9BcHBJZGxlSG9zdFRlc3QuamF2YQppbmRleCAzY2Q3YmRhLi5iMzQ4NWQxIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL3VzYWdlL3NyYy9hbmRyb2lkL2FwcC91c2FnZS9jdHMvQXBwSWRsZUhvc3RUZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy91c2FnZS9zcmMvYW5kcm9pZC9hcHAvdXNhZ2UvY3RzL0FwcElkbGVIb3N0VGVzdC5qYXZhCkBAIC0xNiwyNiArMTYsNDEgQEAKIAogcGFja2FnZSBhbmRyb2lkLmFwcC51c2FnZS5jdHM7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzdW1lLmFzc3VtZVRydWU7CisKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5JVGVzdERldmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5EZXZpY2VUZXN0Q2FzZTsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5EZXZpY2VKVW5pdDRDbGFzc1J1bm5lcjsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5qdW5pdDQuQmFzZUhvc3RKVW5pdDRUZXN0OwogCi1wdWJsaWMgY2xhc3MgQXBwSWRsZUhvc3RUZXN0IGV4dGVuZHMgRGV2aWNlVGVzdENhc2UgeworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworCitAUnVuV2l0aChEZXZpY2VKVW5pdDRDbGFzc1J1bm5lci5jbGFzcykKK3B1YmxpYyBjbGFzcyBBcHBJZGxlSG9zdFRlc3QgZXh0ZW5kcyBCYXNlSG9zdEpVbml0NFRlc3QgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRUSU5HU19BUFBfSURMRV9DT05TVEFOVFMgPSAiYXBwX2lkbGVfY29uc3RhbnRzIjsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0FQUF9QQUNLQUdFID0gImFuZHJvaWQuYXBwLnVzYWdlLmFwcCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQVBQX0NMQVNTID0gIlRlc3RBY3Rpdml0eSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQVBQX1BBQ0tBR0UyID0gImFuZHJvaWQuYXBwLnVzYWdlLmFwcHRvbyI7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEFDVElWSVRZX0xBVU5DSF9XQUlUX01JTExJUyA9IDUwMDsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTQl9BQ1RJVkUgPSAxMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0JfV09SS0lOR19TRVQgPSAyMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0JfRlJFUVVFTlQgPSAzMDsKKwogICAgIC8qKgogICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC4KICAgICAgKi8KICAgICBwcml2YXRlIElUZXN0RGV2aWNlIG1EZXZpY2U7CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKICAgICAgICAgLy8gR2V0IHRoZSBkZXZpY2UsIHRoaXMgZ2l2ZXMgYSBoYW5kbGUgdG8gcnVuIGNvbW1hbmRzIGFuZCBpbnN0YWxsIEFQS3MuCiAgICAgICAgIG1EZXZpY2UgPSBnZXREZXZpY2UoKTsKICAgICB9CkBAIC05Miw2ICsxMDcsNyBAQAogICAgIC8qKgogICAgICAqIFRlc3RzIHRoYXQgdGhlIGFwcCBpcyBub3QgaWRsZSByaWdodCBhZnRlciBpdCBpcyBsYXVuY2hlZC4KICAgICAgKi8KKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBJc05vdElkbGVBZnRlckJlaW5nTGF1bmNoZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgU3RyaW5nIHByZXZpb3VzU3RhdGUgPSBnZXRBcHBJZGxlU2V0dGluZ3MoKTsKICAgICAgICAgdHJ5IHsKQEAgLTEwNCw2ICsxMjAsNjkgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBzZXRBcHBTdGFuZGJ5QnVja2V0KFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IGJ1Y2tldCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1EZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZCgKKyAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJhbSBzZXQtc3RhbmRieS1idWNrZXQgJXMgJXMiLCBwYWNrYWdlTmFtZSwgYnVja2V0KSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzQXBwU3RhbmRieUVuYWJsZWQoKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdCA9IG1EZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZCgKKyAgICAgICAgICAgICAgICAiZHVtcHN5cyB1c2FnZXN0YXRzIGlzLWFwcC1zdGFuZGJ5LWVuYWJsZWQiKS50cmltKCk7CisgICAgICAgIHJldHVybiBCb29sZWFuLnBhcnNlQm9vbGVhbihyZXN1bHQpOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGdldEFwcFN0YW5kYnlCdWNrZXQoU3RyaW5nIHBhY2thZ2VOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGJ1Y2tldFN0cmluZyA9IG1EZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZCgKKyAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJhbSBnZXQtc3RhbmRieS1idWNrZXQgJXMiLCBwYWNrYWdlTmFtZSkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQoYnVja2V0U3RyaW5nLnRyaW0oKSk7CisgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0QXBwU3RhbmRieUJ1Y2tldCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3N1bWVUcnVlKCJBcHAgc3RhbmRieSBub3QgZW5hYmxlZCBvbiBkZXZpY2UiLCBpc0FwcFN0YW5kYnlFbmFibGVkKCkpOworICAgICAgICAvLyBTZXQgdG8gQUNUSVZFCisgICAgICAgIHNldEFwcFN0YW5kYnlCdWNrZXQoVEVTVF9BUFBfUEFDS0FHRSwgU0JfQUNUSVZFKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNCX0FDVElWRSwgZ2V0QXBwU3RhbmRieUJ1Y2tldChURVNUX0FQUF9QQUNLQUdFKSk7CisgICAgICAgIC8vIHNldCB0byBXT1JLSU5HX1NFVAorICAgICAgICBzZXRBcHBTdGFuZGJ5QnVja2V0KFRFU1RfQVBQX1BBQ0tBR0UsIDIwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwLCBnZXRBcHBTdGFuZGJ5QnVja2V0KFRFU1RfQVBQX1BBQ0tBR0UpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRBcHBTdGFuZGJ5QnVja2V0cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3N1bWVUcnVlKCJBcHAgc3RhbmRieSBub3QgZW5hYmxlZCBvbiBkZXZpY2UiLCBpc0FwcFN0YW5kYnlFbmFibGVkKCkpOworICAgICAgICAvLyBTZXQgbXVsdGlwbGUgcGFja2FnZXMgc3RhdGVzCisgICAgICAgIFN0cmluZyBjb21tYW5kID0gU3RyaW5nLmZvcm1hdCgiYW0gc2V0LXN0YW5kYnktYnVja2V0ICVzICVkICVzICVkIiwKKyAgICAgICAgICAgICAgICBURVNUX0FQUF9QQUNLQUdFLCBTQl9GUkVRVUVOVCwgVEVTVF9BUFBfUEFDS0FHRTIsIFNCX1dPUktJTkdfU0VUKTsKKyAgICAgICAgbURldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKGNvbW1hbmQpOworICAgICAgICBhc3NlcnRFcXVhbHMoU0JfRlJFUVVFTlQsIGdldEFwcFN0YW5kYnlCdWNrZXQoVEVTVF9BUFBfUEFDS0FHRSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoU0JfV09SS0lOR19TRVQsIGdldEFwcFN0YW5kYnlCdWNrZXQoVEVTVF9BUFBfUEFDS0FHRTIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDYW50U2V0T3duU3RhbmRieUJ1Y2tldCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3N1bWVUcnVlKCJBcHAgc3RhbmRieSBub3QgZW5hYmxlZCBvbiBkZXZpY2UiLCBpc0FwcFN0YW5kYnlFbmFibGVkKCkpOworICAgICAgICBzZXRBcHBTdGFuZGJ5QnVja2V0KCJjb20uYW5kcm9pZC5zaGVsbCIsIDQwKTsKKyAgICAgICAgYXNzZXJ0Tm90RXF1YWxzKDQwLCBnZXRBcHBTdGFuZGJ5QnVja2V0KCJjb20uYW5kcm9pZC5zaGVsbCIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPdXRPZkJvdW5kc1N0YW5kYnlCdWNrZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzdW1lVHJ1ZSgiQXBwIHN0YW5kYnkgbm90IGVuYWJsZWQgb24gZGV2aWNlIiwgaXNBcHBTdGFuZGJ5RW5hYmxlZCgpKTsKKyAgICAgICAgc2V0QXBwU3RhbmRieUJ1Y2tldChURVNUX0FQUF9QQUNLQUdFLCBTQl9BQ1RJVkUpOworICAgICAgICBhc3NlcnRFcXVhbHMoU0JfQUNUSVZFLCBnZXRBcHBTdGFuZGJ5QnVja2V0KFRFU1RfQVBQX1BBQ0tBR0UpKTsKKyAgICAgICAgLy8gVHJ5IGxvd2VyIHRoYW4gbWluCisgICAgICAgIHNldEFwcFN0YW5kYnlCdWNrZXQoVEVTVF9BUFBfUEFDS0FHRSwgU0JfQUNUSVZFIC0gMSk7CisgICAgICAgIGFzc2VydEVxdWFscyhTQl9BQ1RJVkUsIGdldEFwcFN0YW5kYnlCdWNrZXQoVEVTVF9BUFBfUEFDS0FHRSkpOworICAgICAgICAvLyBUcnkgaGlnaGVyIHRoYW4gbWF4CisgICAgICAgIHNldEFwcFN0YW5kYnlCdWNrZXQoVEVTVF9BUFBfUEFDS0FHRSwgNTAgKyAxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNCX0FDVElWRSwgZ2V0QXBwU3RhbmRieUJ1Y2tldChURVNUX0FQUF9QQUNLQUdFKSk7CisgICAgfQorCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzbGVlcFVuaW50ZXJydXB0ZWQobG9uZyB0aW1lTWlsbGlzKSB7CiAgICAgICAgIGJvb2xlYW4gaW50ZXJydXB0ZWQ7CiAgICAgICAgIGRvIHsKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvdXNiL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL3VzYi9BbmRyb2lkLm1rCmluZGV4IGYwODI2MWUuLjExNmZhMzkgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvdXNiL0FuZHJvaWQubWsKKysrIGIvaG9zdHNpZGV0ZXN0cy91c2IvQW5kcm9pZC5tawpAQCAtMjYsNyArMjYsNyBAQAogTE9DQUxfQ1RTX1RFU1RfUEFDS0FHRSA6PSBhbmRyb2lkLnVzYgogCiAjIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0Ci1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMgY3RzX2luc3RhbnQKIAogaW5jbHVkZSAkKEJVSUxEX0NUU19IT1NUX0pBVkFfTElCUkFSWSkKIApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy91c2IvQW5kcm9pZFRlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy91c2IvQW5kcm9pZFRlc3QueG1sCmluZGV4IGNmZGNhZWEuLmJhZDRmZjkgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvdXNiL0FuZHJvaWRUZXN0LnhtbAorKysgYi9ob3N0c2lkZXRlc3RzL3VzYi9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBVU0IgaG9zdCB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0ibWlzYyIgLz4KICAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGVzdHR5cGUuSmFySG9zdFRlc3QiID4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJqYXIiIHZhbHVlPSJDdHNVc2JUZXN0cy5qYXIiIC8+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3VzYi9TZXJpYWxUZXN0QXBwL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL3VzYi9TZXJpYWxUZXN0QXBwL0FuZHJvaWQubWsKaW5kZXggMmRkZjMwZi4uNTNiOTI2NiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy91c2IvU2VyaWFsVGVzdEFwcC9BbmRyb2lkLm1rCisrKyBiL2hvc3RzaWRldGVzdHMvdXNiL1NlcmlhbFRlc3RBcHAvQW5kcm9pZC5tawpAQCAtMjAsNyArMjAsOSBAQAogCiBMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQogCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY3RzdGVzdHJ1bm5lciBsZWdhY3ktYW5kcm9pZC10ZXN0CitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY3RzdGVzdHJ1bm5lci1heHQKKworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LmJhc2Uuc3R1YnMKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogCkBAIC0yOSw2ICszMSw2IEBACiBMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CiAKICMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cyBjdHNfaW5zdGFudAogCiBpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3VzYi9TZXJpYWxUZXN0QXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL3VzYi9TZXJpYWxUZXN0QXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggYTc1ZGQ3NS4uNGEwODEwMCAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy91c2IvU2VyaWFsVGVzdEFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvdXNiL1NlcmlhbFRlc3RBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMTUsMTIgKzE1LDE3IEBACiAtLT4KIAogPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgcGFja2FnZT0iY29tLmFuZHJvaWQuY3RzLnVzYi5zZXJpYWx0ZXN0Ij4KKyAgICAgICAgcGFja2FnZT0iY29tLmFuZHJvaWQuY3RzLnVzYi5zZXJpYWx0ZXN0IgorICAgICAgICBhbmRyb2lkOnRhcmdldFNhbmRib3hWZXJzaW9uPSIyIj4KKworICAgIDx1c2VzLXNkayBhbmRyb2lkOm1pblNka1ZlcnNpb249IjI3IiBhbmRyb2lkOnRhcmdldFNka1ZlcnNpb249IjI4IiAvPgorCisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX1BIT05FX1NUQVRFIiAvPgogCiAgICAgPGFwcGxpY2F0aW9uPgogICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KICAgICA8L2FwcGxpY2F0aW9uPgogICAgIDxpbnN0cnVtZW50YXRpb24KICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5jdHMudXNiLnNlcmlhbHRlc3QiCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIgLz4KKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiIC8+CiA8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy91c2IvU2VyaWFsVGVzdEFwcC9zcmMvY29tL2FuZHJvaWQvY3RzL3VzYi9zZXJpYWx0ZXN0L1VzYlNlcmlhbFRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvdXNiL1NlcmlhbFRlc3RBcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy91c2Ivc2VyaWFsdGVzdC9Vc2JTZXJpYWxUZXN0LmphdmEKaW5kZXggYTJiMGM3Mi4uZTU0ZDFjYiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy91c2IvU2VyaWFsVGVzdEFwcC9zcmMvY29tL2FuZHJvaWQvY3RzL3VzYi9zZXJpYWx0ZXN0L1VzYlNlcmlhbFRlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL3VzYi9TZXJpYWxUZXN0QXBwL3NyYy9jb20vYW5kcm9pZC9jdHMvdXNiL3NlcmlhbHRlc3QvVXNiU2VyaWFsVGVzdC5qYXZhCkBAIC0xNywxNyArMTcsMjcgQEAKIHBhY2thZ2UgY29tLmFuZHJvaWQuY3RzLnVzYi5zZXJpYWx0ZXN0OwogCiBpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKLWltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCiAvKioKICAqIERldmljZSB0ZXN0IHdoaWNoIHJlYWRzIEJ1aWxkLlNFUklBTCBhbmQganVzdCBwcmludCBpdC4KICAqLwotcHVibGljIGNsYXNzIFVzYlNlcmlhbFRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBVc2JTZXJpYWxUZXN0IHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkN0c1VzYlNlcmlhbFRlc3QiOwogCi0gICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBMb2cuZShUQUcsIEJ1aWxkLlNFUklBTCk7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBsb2dTZXJpYWwoKSB7CisgICAgICAgIExvZy5lKFRBRywgQnVpbGQuZ2V0U2VyaWFsKCkpOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gU2VjdXJpdHlFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdmVyaWZ5U2VyaWFsQ2Fubm90QmVSZWFkKCkgeworICAgICAgICBCdWlsZC5nZXRTZXJpYWwoKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3VzYi9zcmMvY29tL2FuZHJvaWQvY3RzL3VzYi9UZXN0VXNiVGVzdC5qYXZhIGIvaG9zdHNpZGV0ZXN0cy91c2Ivc3JjL2NvbS9hbmRyb2lkL2N0cy91c2IvVGVzdFVzYlRlc3QuamF2YQppbmRleCBiNzhkNjA2Li45ZGYyZDVjIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL3VzYi9zcmMvY29tL2FuZHJvaWQvY3RzL3VzYi9UZXN0VXNiVGVzdC5qYXZhCisrKyBiL2hvc3RzaWRldGVzdHMvdXNiL3NyYy9jb20vYW5kcm9pZC9jdHMvdXNiL1Rlc3RVc2JUZXN0LmphdmEKQEAgLTE1LDEzICsxNSwxOCBAQAogICovCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy51c2I7CiAKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVJbnN0YW50OworCiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQuYnVpbGQuQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi50ZXN0cnVubmVyLlJlbW90ZUFuZHJvaWRUZXN0UnVubmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi50ZXN0cnVubmVyLlRlc3RSdW5SZXN1bHQ7CitpbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLnRlc3RydW5uZXIuVGVzdFJlc3VsdC5UZXN0U3RhdHVzOwogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmJ1aWxkLklCdWlsZEluZm87CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLkRldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UuSVRlc3REZXZpY2U7CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQucmVzdWx0LkNvbGxlY3RpbmdUZXN0TGlzdGVuZXI7CitpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQucmVzdWx0LlRlc3RSZXN1bHQ7CitpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQucmVzdWx0LlRlc3RSdW5SZXN1bHQ7CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuRGV2aWNlVGVzdENhc2U7CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSUFiaTsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JQWJpUmVjZWl2ZXI7CkBAIC0zNCw2ICszOSw3IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DZGRUZXN0OwogCiBpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwogaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwogCkBAIC00Miw4ICs0OCw5IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBUZXN0VXNiVGVzdCBleHRlbmRzIERldmljZVRlc3RDYXNlIGltcGxlbWVudHMgSUFiaVJlY2VpdmVyLCBJQnVpbGRSZWNlaXZlciB7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1RTX1JVTk5FUiA9ICJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1RTX1JVTk5FUiA9ICJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFX05BTUUgPSAiY29tLmFuZHJvaWQuY3RzLnVzYi5zZXJpYWx0ZXN0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9DTEFTU19OQU1FID0gUEFDS0FHRV9OQU1FICsgIi5Vc2JTZXJpYWxUZXN0IjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBLX05BTUU9IkN0c1VzYlNlcmlhbFRlc3RBcHAuYXBrIjsKICAgICBwcml2YXRlIElUZXN0RGV2aWNlIG1EZXZpY2U7CiAgICAgcHJpdmF0ZSBJQWJpIG1BYmk7CkBAIC02NCwxMCArNzEsMjAgQEAKICAgICAgICAgc3VwZXIuc2V0VXAoKTsKICAgICAgICAgbURldmljZSA9IGdldERldmljZSgpOwogICAgICAgICBtRGV2aWNlLnVuaW5zdGFsbFBhY2thZ2UoUEFDS0FHRV9OQU1FKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5zdGFsbEFwcChib29sZWFuIGluc3RhbGxBc0luc3RhbnRBcHApCisgICAgICAgICAgICB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewogICAgICAgICBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIgYnVpbGRIZWxwZXIgPSBuZXcgQ29tcGF0aWJpbGl0eUJ1aWxkSGVscGVyKG1CdWlsZCk7CiAgICAgICAgIEZpbGUgYXBwID0gYnVpbGRIZWxwZXIuZ2V0VGVzdEZpbGUoQVBLX05BTUUpOwotICAgICAgICBTdHJpbmdbXSBvcHRpb25zID0ge0FiaVV0aWxzLmNyZWF0ZUFiaUZsYWcobUFiaS5nZXROYW1lKCkpfTsKLSAgICAgICAgbURldmljZS5pbnN0YWxsUGFja2FnZShhcHAsIGZhbHNlLCBvcHRpb25zKTsKKyAgICAgICAgU3RyaW5nW10gb3B0aW9uczsKKworICAgICAgICBpZiAoaW5zdGFsbEFzSW5zdGFudEFwcCkgeworICAgICAgICAgICAgb3B0aW9ucyA9IG5ldyBTdHJpbmdbXXtBYmlVdGlscy5jcmVhdGVBYmlGbGFnKG1BYmkuZ2V0TmFtZSgpKSwgIi0taW5zdGFudCJ9OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3B0aW9ucyA9IG5ldyBTdHJpbmdbXXtBYmlVdGlscy5jcmVhdGVBYmlGbGFnKG1BYmkuZ2V0TmFtZSgpKX07CisgICAgICAgIH0KKyAgICAgICAgbURldmljZS5pbnN0YWxsUGFja2FnZShhcHAsIGZhbHNlLCB0cnVlLCBvcHRpb25zKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTc2LDEyICs5Myw0OSBAQAogICAgICAgICBtRGV2aWNlLnVuaW5zdGFsbFBhY2thZ2UoUEFDS0FHRV9OQU1FKTsKICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgcnVuVGVzdE9uRGV2aWNlKFN0cmluZyB0ZXN0TWV0aG9kKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKKyAgICAgICAgQ29sbGVjdGluZ1Rlc3RMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBDb2xsZWN0aW5nVGVzdExpc3RlbmVyKCk7CisgICAgICAgIFJlbW90ZUFuZHJvaWRUZXN0UnVubmVyIHRlc3RSdW5uZXIgPSBuZXcgUmVtb3RlQW5kcm9pZFRlc3RSdW5uZXIoUEFDS0FHRV9OQU1FLCBDVFNfUlVOTkVSLAorICAgICAgICAgICAgICAgIG1EZXZpY2UuZ2V0SURldmljZSgpKTsKKyAgICAgICAgdGVzdFJ1bm5lci5zZXRNZXRob2ROYW1lKFRFU1RfQ0xBU1NfTkFNRSwgdGVzdE1ldGhvZCk7CisgICAgICAgIG1EZXZpY2UucnVuSW5zdHJ1bWVudGF0aW9uVGVzdHModGVzdFJ1bm5lciwgbGlzdGVuZXIpOworCisgICAgICAgIHdoaWxlICghbGlzdGVuZXIuZ2V0Q3VycmVudFJ1blJlc3VsdHMoKS5pc1J1bkNvbXBsZXRlKCkpIHsKKyAgICAgICAgICAgIC8vIHdhaXQKKyAgICAgICAgfQorCisgICAgICAgIFRlc3RSdW5SZXN1bHQgcnVuUmVzdWx0ID0gbGlzdGVuZXIuZ2V0Q3VycmVudFJ1blJlc3VsdHMoKTsKKyAgICAgICAgaWYgKHJ1blJlc3VsdC5pc1J1bkZhaWx1cmUoKSkgeworICAgICAgICAgICAgZmFpbChydW5SZXN1bHQuZ2V0UnVuRmFpbHVyZU1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKFRlc3RSZXN1bHQgcmVzdWx0IDogcnVuUmVzdWx0LmdldFRlc3RSZXN1bHRzKCkudmFsdWVzKCkpIHsKKyAgICAgICAgICAgIGlmICghcmVzdWx0LmdldFN0YXR1cygpLmVxdWFscyhUZXN0U3RhdHVzLlBBU1NFRCkpIHsKKyAgICAgICAgICAgICAgICBmYWlsKHJlc3VsdC5nZXRTdGFja1RyYWNlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgYWRiIHNlcmlhbCBudW1iZXIsIFVTQiBzZXJpYWwgbnVtYmVyLCByby5zZXJpYWxubywgYW5kIGFuZHJvaWQub3MuQnVpbGQuU0VSSUFMCisgICAgICogYWxsIG1hdGNoZXMgYW5kIG1lZXRzIHRoZSBmb3JtYXQgcmVxdWlyZW1lbnQgW2EtekEtWjAtOV17NiwyMH0KKyAgICAgKi8KKyAgICBAQXBwTW9kZUluc3RhbnQocmVhc29uID0gIm9ubHkgaW5zdGFudCBhcHBzIGZhaWwgd2hlbiByZWFkaW5nIHNlcmlhbCIpCisgICAgcHVibGljIHZvaWQgdGVzdEluc3RhbnRBcHBzQ2Fubm90UmVhZFNlcmlhbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbnN0YWxsQXBwKHRydWUpOworCisgICAgICAgIHJ1blRlc3RPbkRldmljZSgidmVyaWZ5U2VyaWFsQ2Fubm90QmVSZWFkIik7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQ2hlY2sgaWYgYWRiIHNlcmlhbCBudW1iZXIsIFVTQiBzZXJpYWwgbnVtYmVyLCByby5zZXJpYWxubywgYW5kIGFuZHJvaWQub3MuQnVpbGQuU0VSSUFMCiAgICAgICogYWxsIG1hdGNoZXMgYW5kIG1lZXRzIHRoZSBmb3JtYXQgcmVxdWlyZW1lbnQgW2EtekEtWjAtOV17NiwyMH0KICAgICAgKi8KICAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iNy43LjEvQy0xLTIiKQotICAgIHB1YmxpYyB2b2lkIHRlc3RVc2JTZXJpYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBAQXBwTW9kZUZ1bGwocmVhc29uID0gInNlcmlhbCBjYW4gbm90IGJlIHJlYWQgYnkgaW5zdGFudCBhcHBzIikKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXNiU2VyaWFsUmVhZE9uRGV2aWNlTWF0Y2hlcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbnN0YWxsQXBwKGZhbHNlKTsKKwogICAgICAgICBTdHJpbmcgYWRiU2VyaWFsID0gbURldmljZS5nZXRTZXJpYWxOdW1iZXIoKS50b0xvd2VyQ2FzZSgpLnRyaW0oKTsKICAgICAgICAgaWYgKGFkYlNlcmlhbC5zdGFydHNXaXRoKCJlbXVsYXRvci0iKSkgewogICAgICAgICAgICAgcmV0dXJuOwpAQCAtMTEyLDE0ICsxNjYsNyBAQAogCiAgICAgICAgIC8vIG5vdyBjaGVjayBCdWlsZC5TRVJJQUwKICAgICAgICAgY2xlYXJMb2dDYXQoKTsKLSAgICAgICAgQ29sbGVjdGluZ1Rlc3RMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBDb2xsZWN0aW5nVGVzdExpc3RlbmVyKCk7Ci0gICAgICAgIFJlbW90ZUFuZHJvaWRUZXN0UnVubmVyIHRlc3RSdW5uZXIgPSBuZXcgUmVtb3RlQW5kcm9pZFRlc3RSdW5uZXIoUEFDS0FHRV9OQU1FLCBDVFNfUlVOTkVSLAotICAgICAgICAgICAgICAgIG1EZXZpY2UuZ2V0SURldmljZSgpKTsKLSAgICAgICAgbURldmljZS5ydW5JbnN0cnVtZW50YXRpb25UZXN0cyh0ZXN0UnVubmVyLCBsaXN0ZW5lcik7Ci0gICAgICAgIFRlc3RSdW5SZXN1bHQgcnVuUmVzdWx0ID0gbGlzdGVuZXIuZ2V0Q3VycmVudFJ1blJlc3VsdHMoKTsKLSAgICAgICAgaWYgKHJ1blJlc3VsdC5pc1J1bkZhaWx1cmUoKSkgewotICAgICAgICAgICAgZmFpbChydW5SZXN1bHQuZ2V0UnVuRmFpbHVyZU1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgcnVuVGVzdE9uRGV2aWNlKCJsb2dTZXJpYWwiKTsKICAgICAgICAgU3RyaW5nIGxvZ3MgPSBtRGV2aWNlLmV4ZWN1dGVBZGJDb21tYW5kKAogICAgICAgICAgICAgICAgICJsb2djYXQiLCAiLXYiLCAiYnJpZWYiLCAiLWQiLCAiQ3RzVXNiU2VyaWFsVGVzdDpXIiwgIio6UyIpOwogICAgICAgICBwYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCJeLipDdHNVc2JTZXJpYWxUZXN0XFwoLipcXCk6XFxzKyhbYS16QS1aMC05XXs2LDIwfSkiLApkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy93ZWJraXQvQW5kcm9pZC5tayBiL2hvc3RzaWRldGVzdHMvd2Via2l0L0FuZHJvaWQubWsKaW5kZXggNjYzYTA3OS4uODE0NzYwYSAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy93ZWJraXQvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL3dlYmtpdC9BbmRyb2lkLm1rCkBAIC0yMSwxMiArMjEsMTIgQEAKIAogTE9DQUxfTU9EVUxFIDo9IEN0c0hvc3RzaWRlV2ViVmlld1Rlc3RzCiAKLUxPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IHRyYWRlZmVkCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSB0cmFkZWZlZCBjb21wYXRpYmlsaXR5LWhvc3QtdXRpbAogCiBMT0NBTF9DVFNfVEVTVF9QQUNLQUdFIDo9IGFuZHJvaWQud2Via2l0Lmhvc3RzaWRlCiAKICMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cyBjdHNfaW5zdGFudAogCiBpbmNsdWRlICQoQlVJTERfQ1RTX0hPU1RfSkFWQV9MSUJSQVJZKQogCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3dlYmtpdC9BbmRyb2lkVGVzdC54bWwgYi9ob3N0c2lkZXRlc3RzL3dlYmtpdC9BbmRyb2lkVGVzdC54bWwKaW5kZXggMzdkMDQ2Ny4uNDE0ZmFkNCAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy93ZWJraXQvQW5kcm9pZFRlc3QueG1sCisrKyBiL2hvc3RzaWRldGVzdHMvd2Via2l0L0FuZHJvaWRUZXN0LnhtbApAQCAtMTQsNiArMTQsNyBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIFdlYlZpZXcgaG9zdCB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0id2VidmlldyIgLz4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy93ZWJraXQvYXBwL0FuZHJvaWQubWsgYi9ob3N0c2lkZXRlc3RzL3dlYmtpdC9hcHAvQW5kcm9pZC5tawppbmRleCA2MGU5ZjNmLi45OGE3MDkyIDEwMDY0NAotLS0gYS9ob3N0c2lkZXRlc3RzL3dlYmtpdC9hcHAvQW5kcm9pZC5taworKysgYi9ob3N0c2lkZXRlc3RzL3dlYmtpdC9hcHAvQW5kcm9pZC5tawpAQCAtMjIsMTAgKzIyLDEyIEBACiBMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwogTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAogTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKLSAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsIFwKLSAgICBjdHNkZXZpY2V1dGlsbGVnYWN5IFwKKyAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBcCisgICAgY3RzZGV2aWNldXRpbGxlZ2FjeS1heHQgXAogICAgIGN0c3Rlc3RzZXJ2ZXIgXAotICAgIGN0c3Rlc3RydW5uZXIKKyAgICBjdHN0ZXN0cnVubmVyLWF4dAorCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzIGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCiAKICMgV2hlbiBidWlsdCwgZXhwbGljaXRseSBwdXQgaXQgaW4gdGhlIGRhdGEgcGFydGl0aW9uLgogI0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCkBAIC0zOCw2ICs0MCw2IEBACiBMT0NBTF9ERVhfUFJFT1BUIDo9IGZhbHNlCiAKICMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cyBjdHNfaW5zdGFudAogCiBpbmNsdWRlICQoQlVJTERfQ1RTX1NVUFBPUlRfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvd2Via2l0L2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvaG9zdHNpZGV0ZXN0cy93ZWJraXQvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggMjQ5MWQ2Yy4uYjdiMTdkYiAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy93ZWJraXQvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvaG9zdHNpZGV0ZXN0cy93ZWJraXQvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTE1LDEyICsxNSwxNSBAQAogLS0+CiAKIDxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgcGFja2FnZT0iY29tLmFuZHJvaWQuY3RzLndlYmtpdCI+CisgICAgcGFja2FnZT0iY29tLmFuZHJvaWQuY3RzLndlYmtpdCIgYW5kcm9pZDp0YXJnZXRTYW5kYm94VmVyc2lvbj0iMiI+CiAKICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkRJU0FCTEVfS0VZR1VBUkQiIC8+CiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5JTlRFUk5FVCIgLz4KIAotICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOm1heFJlY2VudHM9IjEiPgorICAgIDxhcHBsaWNhdGlvbgorICAgICAgYW5kcm9pZDptYXhSZWNlbnRzPSIxIgorICAgICAgYW5kcm9pZDp1c2VzQ2xlYXJ0ZXh0VHJhZmZpYz0idHJ1ZSIgPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0ib3JnLmFwYWNoZS5odHRwLmxlZ2FjeSIgLz4KICAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5XZWJWaWV3U3RhcnR1cEN0c0FjdGl2aXR5IgogICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iV2ViVmlld1N0YXJ0dXBDdHNBY3Rpdml0eSIKQEAgLTM1LDcgKzM4LDcgQEAKIAogCiAgICAgPGluc3RydW1lbnRhdGlvbgotICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5hbmRyb2lkLmN0cy53ZWJraXQiLz4KIAogPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvd2Via2l0L2FwcC9zcmMvY29tL2FuZHJvaWQvY3RzL3dlYmtpdC9XZWJWaWV3RGV2aWNlU2lkZVN0YXJ0dXBUZXN0LmphdmEgYi9ob3N0c2lkZXRlc3RzL3dlYmtpdC9hcHAvc3JjL2NvbS9hbmRyb2lkL2N0cy93ZWJraXQvV2ViVmlld0RldmljZVNpZGVTdGFydHVwVGVzdC5qYXZhCmluZGV4IGE0N2Q2NTMuLjY5MjMxMGIgMTAwNjQ0Ci0tLSBhL2hvc3RzaWRldGVzdHMvd2Via2l0L2FwcC9zcmMvY29tL2FuZHJvaWQvY3RzL3dlYmtpdC9XZWJWaWV3RGV2aWNlU2lkZVN0YXJ0dXBUZXN0LmphdmEKKysrIGIvaG9zdHNpZGV0ZXN0cy93ZWJraXQvYXBwL3NyYy9jb20vYW5kcm9pZC9jdHMvd2Via2l0L1dlYlZpZXdEZXZpY2VTaWRlU3RhcnR1cFRlc3QuamF2YQpAQCAtMTgsMTUgKzE4LDIxIEBACiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZUluZm87CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubmV0Lmh0dHAuU3NsRXJyb3I7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlclRocmVhZDsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKIGltcG9ydCBhbmRyb2lkLm9zLlN0cmljdE1vZGU7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyOwogaW1wb3J0IGFuZHJvaWQudGVzdC5VaVRocmVhZFRlc3Q7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLndlYmtpdC5Db29raWVNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQud2Via2l0LkNvb2tpZVN5bmNNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQud2Via2l0LlNzbEVycm9ySGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJWaWV3OwogaW1wb3J0IGFuZHJvaWQud2Via2l0LmN0cy5DdHNUZXN0U2VydmVyOwogaW1wb3J0IGFuZHJvaWQud2Via2l0LmN0cy5XZWJWaWV3T25VaVRocmVhZDsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5jdHMuV2ViVmlld09uVWlUaHJlYWQuV2FpdEZvckxvYWRlZENsaWVudDsKIGltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJWaWV3OwogCiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5OdWxsV2ViVmlld1V0aWxzOwpAQCAtNDgsNiArNTQsNyBAQAogICAgICAgICBleHRlbmRzIEFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyPFdlYlZpZXdTdGFydHVwQ3RzQWN0aXZpdHk+IHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBXZWJWaWV3RGV2aWNlU2lkZVN0YXJ0dXBUZXN0LmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFRFU1RfVElNRU9VVF9NUyA9IDMwMDA7CiAKICAgICBwcml2YXRlIFdlYlZpZXdTdGFydHVwQ3RzQWN0aXZpdHkgbUFjdGl2aXR5OwogCkBAIC02Myw3ICs3MCw4IEBACiAKICAgICBAVWlUaHJlYWRUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdENvb2tpZU1hbmFnZXJCbG9ja2luZ1VpVGhyZWFkKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIEN0c1Rlc3RTZXJ2ZXIgc2VydmVyID0gbmV3IEN0c1Rlc3RTZXJ2ZXIobUFjdGl2aXR5LCBmYWxzZSk7CisgICAgICAgIC8vIEluc3RhbnQgYXBwIGNhbiBvbmx5IGhhdmUgaHR0cHMgY29ubmVjdGlvbi4KKyAgICAgICAgQ3RzVGVzdFNlcnZlciBzZXJ2ZXIgPSBuZXcgQ3RzVGVzdFNlcnZlcihtQWN0aXZpdHksIHRydWUpOwogICAgICAgICBmaW5hbCBTdHJpbmcgdXJsID0gc2VydmVyLmdldENvb2tpZVVybCgiZGVhdGguaHRtbCIpOwogCiAgICAgICAgIFRocmVhZCBiYWNrZ3JvdW5kID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CkBAIC05MSw3ICs5OSwxNSBAQAogCiAgICAgICAgIC8vIE5vdyBjcmVhdGUgV2ViVmlldyBhbmQgdGVzdCB0aGF0IHNldHRpbmcgdGhlIGNvb2tpZSBiZWZvcmVoYW5kIHJlYWxseSB3b3JrZWQuCiAgICAgICAgIG1BY3Rpdml0eS5jcmVhdGVBbmRBdHRhY2hXZWJWaWV3KCk7CisgICAgICAgIFdlYlZpZXcgd2ViVmlldyA9IG1BY3Rpdml0eS5nZXRXZWJWaWV3KCk7CiAgICAgICAgIFdlYlZpZXdPblVpVGhyZWFkIG9uVWlUaHJlYWQgPSBuZXcgV2ViVmlld09uVWlUaHJlYWQodGhpcywgbUFjdGl2aXR5LmdldFdlYlZpZXcoKSk7CisgICAgICAgIHdlYlZpZXcuc2V0V2ViVmlld0NsaWVudChuZXcgV2FpdEZvckxvYWRlZENsaWVudChvblVpVGhyZWFkKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZWRTc2xFcnJvcihXZWJWaWV3IHZpZXcsIFNzbEVycm9ySGFuZGxlciBoYW5kbGVyLCBTc2xFcnJvciBlcnJvcikgeworICAgICAgICAgICAgICAgIC8vIE5vdCBpbnRlbmRlZCB0byB2ZXJpZnkgc2VydmVyIGNlcnRpZmljYXRlLCBpZ25vcmUgdGhlIGVycm9yLgorICAgICAgICAgICAgICAgIGlmIChlcnJvci5nZXRQcmltYXJ5RXJyb3IoKSA9PSBTc2xFcnJvci5TU0xfSURNSVNNQVRDSCkgaGFuZGxlci5wcm9jZWVkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOwogICAgICAgICBvblVpVGhyZWFkLmxvYWRVcmxBbmRXYWl0Rm9yQ29tcGxldGlvbih1cmwpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIjF8Y291bnQ9NDEiLCBvblVpVGhyZWFkLmdldFRpdGxlKCkpOyAvLyBvdXRnb2luZyBjb29raWUKICAgICAgICAgQ29va2llTWFuYWdlciBjb29raWVNYW5hZ2VyID0gQ29va2llTWFuYWdlci5nZXRJbnN0YW5jZSgpOwpAQCAtMTk5LDQgKzIxNSw2NyBAQAogICAgICAgICBvblVpVGhyZWFkLmxvYWRVcmxBbmRXYWl0Rm9yQ29tcGxldGlvbigiYWJvdXQ6YmxhbmsiKTsKICAgICAgICAgb25VaVRocmVhZC5sb2FkVXJsQW5kV2FpdEZvckNvbXBsZXRpb24oIiIpOwogICAgIH0KKworICAgIEBVaVRocmVhZFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0V2ViVmlld0xvb3Blck9uVWlUaHJlYWQoKSB7CisgICAgICAgIFBhY2thZ2VNYW5hZ2VyIHBtID0gbUFjdGl2aXR5LmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgIGlmICghcG0uaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX1dFQlZJRVcpKSByZXR1cm47CisKKyAgICAgICAgY3JlYXRlQW5kQ2hlY2tXZWJWaWV3TG9vcGVyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5zdXJlIHRoYXQgYSBXZWJWaWV3IGNyZWF0ZWQgb24gdGhlIFVJIHRocmVhZCByZXR1cm5zIHRoYXQgdGhyZWFkIGFzIGl0cyBjcmVhdG9yIHRocmVhZC4KKyAgICAgKiBUaGlzIGVuc3VyZXMgV2ViVmlldy5nZXRXZWJWaWV3TG9vcGVyKCkgaXMgbm90IGltcGxlbWVudGVkIGFzICdyZXR1cm4gTG9vcGVyLm15TG9vcGVyKCk7Jy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0V2ViVmlld0xvb3BlckNyZWF0ZWRPblVpVGhyZWFkRnJvbUluc3RyVGhyZWFkKCkgeworICAgICAgICBQYWNrYWdlTWFuYWdlciBwbSA9IG1BY3Rpdml0eS5nZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICBpZiAoIXBtLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9XRUJWSUVXKSkgcmV0dXJuOworCisgICAgICAgIFdlYlZpZXdbXSB3ZWJ2aWV3SG9sZGVyID0gbmV3IFdlYlZpZXdbMV07CisgICAgICAgIC8vIENyZWF0ZSB0aGUgV2ViVmlldyBvbiB0aGUgVUkgdGhyZWFkIGFuZCB0aGVuIGVuc3VyZSB3ZWJ2aWV3LmdldFdlYlZpZXdMb29wZXIoKSByZXR1cm5zCisgICAgICAgIC8vIHRoZSBVSSB0aHJlYWQuCisgICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpLnJ1bk9uTWFpblN5bmMobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgd2Vidmlld0hvbGRlclswXSA9IGNyZWF0ZUFuZENoZWNrV2ViVmlld0xvb3BlcigpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKExvb3Blci5nZXRNYWluTG9vcGVyKCksIHdlYnZpZXdIb2xkZXJbMF0uZ2V0V2ViVmlld0xvb3BlcigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmUgdGhhdCBhIFdlYlZpZXcgY3JlYXRlZCBvbiBhIGJhY2tncm91bmQgdGhyZWFkIHJldHVybnMgdGhhdCB0aHJlYWQgYXMgaXRzIGNyZWF0b3IKKyAgICAgKiB0aHJlYWQuCisgICAgICogVGhpcyBlbnN1cmVzIFdlYlZpZXcuZ2V0V2ViVmlld0xvb3BlcigpIGlzIG5vdCBib3VuZCB0byB0aGUgVUkgdGhyZWFkIHJlZ2FyZGxlc3Mgb2YgdGhlCisgICAgICogdGhyZWFkIGl0IGlzIGNyZWF0ZWQgb24uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRXZWJWaWV3TG9vcGVyQ3JlYXRlZE9uQmFja2dyb3VuZFRocmVhZEZyb21JbnN0VGhyZWFkKCkKKyAgICAgICAgICAgIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIFBhY2thZ2VNYW5hZ2VyIHBtID0gbUFjdGl2aXR5LmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgIGlmICghcG0uaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX1dFQlZJRVcpKSByZXR1cm47CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgV2ViVmlldyBvbiBhIGJhY2tncm91bmQgdGhyZWFkLCBjaGVjayBpdCBmcm9tIHRoZSBVSSB0aHJlYWQKKyAgICAgICAgZmluYWwgV2ViVmlldyB3ZWJ2aWV3SG9sZGVyW10gPSBuZXcgV2ViVmlld1sxXTsKKworICAgICAgICAvLyBVc2UgYSBIYW5kbGVyVGhyZWFkLCBiZWNhdXNlIHN1Y2ggYSB0aHJlYWQgb3ducyBhIExvb3Blci4KKyAgICAgICAgSGFuZGxlclRocmVhZCBiYWNrZ3JvdW5kVGhyZWFkID0gbmV3IEhhbmRsZXJUaHJlYWQoIldlYlZpZXdMb29wZXJDdHNIYW5kbGVyVGhyZWFkIik7CisgICAgICAgIGJhY2tncm91bmRUaHJlYWQuc3RhcnQoKTsKKyAgICAgICAgbmV3IEhhbmRsZXIoYmFja2dyb3VuZFRocmVhZC5nZXRMb29wZXIoKSkucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICB3ZWJ2aWV3SG9sZGVyWzBdID0gY3JlYXRlQW5kQ2hlY2tXZWJWaWV3TG9vcGVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBiYWNrZ3JvdW5kVGhyZWFkLmpvaW4oVEVTVF9USU1FT1VUX01TKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGJhY2tncm91bmRUaHJlYWQuZ2V0TG9vcGVyKCksIHdlYnZpZXdIb2xkZXJbMF0uZ2V0V2ViVmlld0xvb3BlcigpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFdlYlZpZXcgY3JlYXRlQW5kQ2hlY2tXZWJWaWV3TG9vcGVyKCkgeworICAgICAgICAvLyBFbnN1cmUgd2UgYXJlIHJ1bm5pbmcgdGhpcyBvbiBhIHRocmVhZCB3aXRoIGEgTG9vcGVyIC0gb3RoZXJ3aXNlIHRoZXJlJ3Mgbm8gcG9pbnQuCisgICAgICAgIGFzc2VydE5vdE51bGwoTG9vcGVyLm15TG9vcGVyKCkpOworICAgICAgICBXZWJWaWV3IHdlYnZpZXcgPSBuZXcgV2ViVmlldyhtQWN0aXZpdHkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTG9vcGVyLm15TG9vcGVyKCksIHdlYnZpZXcuZ2V0V2ViVmlld0xvb3BlcigpKTsKKyAgICAgICAgcmV0dXJuIHdlYnZpZXc7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy93ZWJraXQvc3JjL2NvbS9hbmRyb2lkL2N0cy93ZWJraXQvV2ViVmlld0hvc3RTaWRlU3RhcnR1cFRlc3QuamF2YSBiL2hvc3RzaWRldGVzdHMvd2Via2l0L3NyYy9jb20vYW5kcm9pZC9jdHMvd2Via2l0L1dlYlZpZXdIb3N0U2lkZVN0YXJ0dXBUZXN0LmphdmEKaW5kZXggNTNmNGE0OS4uZDQwMzYxOCAxMDA2NDQKLS0tIGEvaG9zdHNpZGV0ZXN0cy93ZWJraXQvc3JjL2NvbS9hbmRyb2lkL2N0cy93ZWJraXQvV2ViVmlld0hvc3RTaWRlU3RhcnR1cFRlc3QuamF2YQorKysgYi9ob3N0c2lkZXRlc3RzL3dlYmtpdC9zcmMvY29tL2FuZHJvaWQvY3RzL3dlYmtpdC9XZWJWaWV3SG9zdFNpZGVTdGFydHVwVGVzdC5qYXZhCkBAIC0xNSwxNyArMTUsMjAgQEAKICAqLwogcGFja2FnZSBjb20uYW5kcm9pZC5jdHMud2Via2l0OwogCitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOworCiBpbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLnRlc3RydW5uZXIuUmVtb3RlQW5kcm9pZFRlc3RSdW5uZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLnRlc3RydW5uZXIuVGVzdFJlc3VsdC5UZXN0U3RhdHVzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi50ZXN0cnVubmVyLlRlc3RSdW5SZXN1bHQ7CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLkRldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5yZXN1bHQuQ29sbGVjdGluZ1Rlc3RMaXN0ZW5lcjsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5yZXN1bHQuVGVzdFJlc3VsdDsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5yZXN1bHQuVGVzdFJ1blJlc3VsdDsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5EZXZpY2VUZXN0Q2FzZTsKIAotaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiAKIHB1YmxpYyBjbGFzcyBXZWJWaWV3SG9zdFNpZGVTdGFydHVwVGVzdCBleHRlbmRzIERldmljZVRlc3RDYXNlIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlVOTkVSID0gImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSVU5ORVIgPSAiYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIjsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERVZJQ0VfV0VCVklFV19TVEFSVFVQX1BLRyA9ICJjb20uYW5kcm9pZC5jdHMud2Via2l0IjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVWSUNFX1dFQlZJRVdfU1RBUlRVUF9URVNUX0NMQVNTID0gIldlYlZpZXdEZXZpY2VTaWRlU3RhcnR1cFRlc3QiOwpAQCAtMzQsMjcgKzM3LDUwIEBACiAgICAgICAgIHN1cGVyLnNldFVwKCk7CiAgICAgfQogCisgICAgQEFwcE1vZGVGdWxsKHJlYXNvbiA9ICJJbnN0YW50IGFwcHMgY2Fubm90IG9wZW4gVENQIHNvY2tldHMuIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29va2llTWFuYWdlcigpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRUcnVlKHJ1bkRldmljZVRlc3QoREVWSUNFX1dFQlZJRVdfU1RBUlRVUF9QS0csIERFVklDRV9XRUJWSUVXX1NUQVJUVVBfVEVTVF9DTEFTUywKLSAgICAgICAgICAgICAgICAgICAgInRlc3RDb29raWVNYW5hZ2VyQmxvY2tpbmdVaVRocmVhZCIpKTsKKyAgICAgICAgYXNzZXJ0RGV2aWNlVGVzdFBhc3NlcygidGVzdENvb2tpZU1hbmFnZXJCbG9ja2luZ1VpVGhyZWFkIik7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdFdlYlZpZXdWZXJzaW9uQXBpT25VaVRocmVhZCgpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRUcnVlKHJ1bkRldmljZVRlc3QoREVWSUNFX1dFQlZJRVdfU1RBUlRVUF9QS0csIERFVklDRV9XRUJWSUVXX1NUQVJUVVBfVEVTVF9DTEFTUywKLSAgICAgICAgICAgICAgICAgICAgInRlc3RHZXRDdXJyZW50V2ViVmlld1BhY2thZ2VPblVpVGhyZWFkIikpOworICAgICAgICBhc3NlcnREZXZpY2VUZXN0UGFzc2VzKCJ0ZXN0R2V0Q3VycmVudFdlYlZpZXdQYWNrYWdlT25VaVRocmVhZCIpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJWaWV3VmVyc2lvbkFwaSgpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRUcnVlKHJ1bkRldmljZVRlc3QoREVWSUNFX1dFQlZJRVdfU1RBUlRVUF9QS0csIERFVklDRV9XRUJWSUVXX1NUQVJUVVBfVEVTVF9DTEFTUywKLSAgICAgICAgICAgICAgICAgICAgInRlc3RHZXRDdXJyZW50V2ViVmlld1BhY2thZ2UiKSk7CisgICAgICAgIGFzc2VydERldmljZVRlc3RQYXNzZXMoInRlc3RHZXRDdXJyZW50V2ViVmlld1BhY2thZ2UiKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaWN0TW9kZSgpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRUcnVlKHJ1bkRldmljZVRlc3QoREVWSUNFX1dFQlZJRVdfU1RBUlRVUF9QS0csIERFVklDRV9XRUJWSUVXX1NUQVJUVVBfVEVTVF9DTEFTUywKLSAgICAgICAgICAgICAgICAgICAgInRlc3RTdHJpY3RNb2RlTm90VmlvbGF0ZWRPblN0YXJ0dXAiKSk7CisgICAgICAgIGFzc2VydERldmljZVRlc3RQYXNzZXMoInRlc3RTdHJpY3RNb2RlTm90VmlvbGF0ZWRPblN0YXJ0dXAiKTsKICAgICB9CiAKLSAgICBwcml2YXRlIGJvb2xlYW4gcnVuRGV2aWNlVGVzdChTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyB0ZXN0Q2xhc3NOYW1lLAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRXZWJWaWV3TG9vcGVyT25VaVRocmVhZCgpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24geworICAgICAgICBhc3NlcnREZXZpY2VUZXN0UGFzc2VzKCJ0ZXN0R2V0V2ViVmlld0xvb3Blck9uVWlUaHJlYWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0V2ViVmlld0xvb3BlckZyb21VaVRocmVhZCgpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24geworICAgICAgICBhc3NlcnREZXZpY2VUZXN0UGFzc2VzKCJ0ZXN0R2V0V2ViVmlld0xvb3BlckNyZWF0ZWRPblVpVGhyZWFkRnJvbUluc3RyVGhyZWFkIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldFdlYlZpZXdMb29wZXJDcmVhdGVkT25CYWNrZ3JvdW5kVGhyZWFkRnJvbUluc3RUaHJlYWQoKQorICAgICAgICAgICAgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydERldmljZVRlc3RQYXNzZXMoInRlc3RHZXRXZWJWaWV3TG9vcGVyQ3JlYXRlZE9uQmFja2dyb3VuZFRocmVhZEZyb21JbnN0VGhyZWFkIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydERldmljZVRlc3RQYXNzZXMoU3RyaW5nIHRlc3RNZXRob2ROYW1lKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKKyAgICAgICAgVGVzdFJ1blJlc3VsdCB0ZXN0UnVuUmVzdWx0ID0gcnVuU2luZ2xlRGV2aWNlVGVzdChERVZJQ0VfV0VCVklFV19TVEFSVFVQX1BLRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVZJQ0VfV0VCVklFV19TVEFSVFVQX1RFU1RfQ0xBU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdE1ldGhvZE5hbWUpOworICAgICAgICBhc3NlcnRUcnVlKHRlc3RSdW5SZXN1bHQuaXNSdW5Db21wbGV0ZSgpKTsKKworICAgICAgICBDb2xsZWN0aW9uPFRlc3RSZXN1bHQ+IHRlc3RSZXN1bHRzID0gdGVzdFJ1blJlc3VsdC5nZXRUZXN0UmVzdWx0cygpLnZhbHVlcygpOworICAgICAgICAvLyBXZSdyZSBvbmx5IHJ1bm5pbmcgYSBzaW5nbGUgdGVzdC4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHRlc3RSZXN1bHRzLnNpemUoKSk7CisgICAgICAgIFRlc3RSZXN1bHQgdGVzdFJlc3VsdCA9IHRlc3RSZXN1bHRzLnRvQXJyYXkobmV3IFRlc3RSZXN1bHRbMV0pWzBdOworICAgICAgICBhc3NlcnRUcnVlKHRlc3RSZXN1bHQuZ2V0U3RhY2tUcmFjZSgpLCBUZXN0U3RhdHVzLlBBU1NFRC5lcXVhbHModGVzdFJlc3VsdC5nZXRTdGF0dXMoKSkpOworICAgIH0KKworICAgIHByaXZhdGUgVGVzdFJ1blJlc3VsdCBydW5TaW5nbGVEZXZpY2VUZXN0KFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHRlc3RDbGFzc05hbWUsCiAgICAgICAgICAgICBTdHJpbmcgdGVzdE1ldGhvZE5hbWUpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewogICAgICAgICB0ZXN0Q2xhc3NOYW1lID0gcGFja2FnZU5hbWUgKyAiLiIgKyB0ZXN0Q2xhc3NOYW1lOwogCkBAIC02NSw3ICs5MSw2IEBACiAgICAgICAgIENvbGxlY3RpbmdUZXN0TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgQ29sbGVjdGluZ1Rlc3RMaXN0ZW5lcigpOwogICAgICAgICBhc3NlcnRUcnVlKGdldERldmljZSgpLnJ1bkluc3RydW1lbnRhdGlvblRlc3RzKHRlc3RSdW5uZXIsIGxpc3RlbmVyKSk7CiAKLSAgICAgICAgVGVzdFJ1blJlc3VsdCBydW5SZXN1bHQgPSBsaXN0ZW5lci5nZXRDdXJyZW50UnVuUmVzdWx0cygpOwotICAgICAgICByZXR1cm4gIXJ1blJlc3VsdC5oYXNGYWlsZWRUZXN0cygpICYmIHJ1blJlc3VsdC5nZXROdW1UZXN0c0luU3RhdGUoVGVzdFN0YXR1cy5QQVNTRUQpID4gMDsKKyAgICAgICAgcmV0dXJuIGxpc3RlbmVyLmdldEN1cnJlbnRSdW5SZXN1bHRzKCk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGlicy9kZXZpY2V1dGlsbGVnYWN5LWF4dC9BbmRyb2lkLm1rIGIvbGlicy9kZXZpY2V1dGlsbGVnYWN5LWF4dC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NDgwODAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2RldmljZXV0aWxsZWdhY3ktYXh0L0FuZHJvaWQubWsKQEAgLTAsMCArMSwzNiBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAorICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0IFwKKyAgICBqdW5pdAorCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicworCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQorCitMT0NBTF9BRERJVElPTkFMX0RFUEVOREVOQ0lFUyA6PSAkKExPQ0FMX1BBVEgpL0FuZHJvaWQubWsKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfTU9EVUxFIDo9IGN0c2RldmljZXV0aWxsZWdhY3ktYXh0CisKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19KQVZBX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9saWJzL2RldmljZXV0aWxsZWdhY3ktYXh0L3NyYy9hbmRyb2lkL3dlYmtpdC9jdHMvV2ViVmlld09uVWlUaHJlYWQuamF2YSBiL2xpYnMvZGV2aWNldXRpbGxlZ2FjeS1heHQvc3JjL2FuZHJvaWQvd2Via2l0L2N0cy9XZWJWaWV3T25VaVRocmVhZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNzJiMDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2RldmljZXV0aWxsZWdhY3ktYXh0L3NyYy9hbmRyb2lkL3dlYmtpdC9jdHMvV2ViVmlld09uVWlUaHJlYWQuamF2YQpAQCAtMCwwICsxLDExMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQud2Via2l0LmN0czsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuUG9sbGluZ0NoZWNrOworaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuVGVzdFRocmVhZDsKKworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGljdHVyZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQucHJpbnQuUHJpbnREb2N1bWVudEFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RDYXNlOworaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3UGFyZW50OworaW1wb3J0IGFuZHJvaWQud2Via2l0LkRvd25sb2FkTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuQ29va2llTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5WYWx1ZUNhbGxiYWNrOworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYkJhY2tGb3J3YXJkTGlzdDsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJDaHJvbWVDbGllbnQ7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuV2ViTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJNZXNzYWdlUG9ydDsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5nczsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJWaWV3LkhpdFRlc3RSZXN1bHQ7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuV2ViVmlldy5QaWN0dXJlTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuV2ViVmlldy5WaXN1YWxTdGF0ZUNhbGxiYWNrOworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXc7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuV2ViVmlld0NsaWVudDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBNYW55IHRlc3RzIG5lZWQgdG8gcnVuIFdlYlZpZXcgY29kZSBpbiB0aGUgVUkgdGhyZWFkLiBUaGlzIGNsYXNzCisgKiB3cmFwcyBhIFdlYlZpZXcgc28gdGhhdCBjYWxscyBhcmUgZW5zdXJlZCB0byBhcnJpdmUgb24gdGhlIFVJIHRocmVhZC4KKyAqCisgKiBBbGwgbWV0aG9kcyBtYXkgYmUgcnVuIG9uIGVpdGhlciB0aGUgVUkgdGhyZWFkIG9yIHRlc3QgdGhyZWFkLgorICovCitwdWJsaWMgY2xhc3MgV2ViVmlld09uVWlUaHJlYWQgeworICAgIC8qKgorICAgICAqIFRoZSBtYXhpbXVtIHRpbWUsIGluIG1pbGxpc2Vjb25kcyAoMTAgc2Vjb25kcykgdG8gd2FpdCBmb3IgYSBsb2FkCisgICAgICogdG8gYmUgdHJpZ2dlcmVkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgTE9BRF9USU1FT1VUID0gMTAwMDA7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdG8gdHJ1ZSBhZnRlciBvblBhZ2VGaW5pc2hlZCBpcyBjYWxsZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1Mb2FkZWQ7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdG8gdHJ1ZSBhZnRlciBvbk5ld1BpY3R1cmUgaXMgY2FsbGVkLiBSZXNldCB3aGVuIG9uUGFnZVN0YXJ0ZWQKKyAgICAgKiBpcyBjYWxsZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1OZXdQaWN0dXJlOworCisgICAgLyoqCisgICAgICogVGhlIHByb2dyZXNzLCBpbiBwZXJjZW50YWdlLCBvZiB0aGUgcGFnZSBsb2FkLiBWYWxpZCB2YWx1ZXMgYXJlIGJldHdlZW4KKyAgICAgKiAwIGFuZCAxMDAuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgbVByb2dyZXNzOworCisgICAgLyoqCisgICAgICogVGhlIHRlc3QgdGhhdCB0aGlzIGNsYXNzIGlzIGJlaW5nIHVzZWQgaW4uIFVzZWQgZm9yIHJ1blRlc3RPblVpVGhyZWFkLgorICAgICAqLworICAgIHByaXZhdGUgSW5zdHJ1bWVudGF0aW9uVGVzdENhc2UgbVRlc3Q7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdGVzdCBydWxlIHRoYXQgdGhpcyBjbGFzcyBpcyBiZWluZyB1c2VkIGluLiBVc2VkIGZvciBydW5UZXN0T25VaVRocmVhZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEFjdGl2aXR5VGVzdFJ1bGUgbUFjdGl2aXR5VGVzdFJ1bGU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgV2ViVmlldyB0aGF0IGNhbGxzIHdpbGwgYmUgbWFkZSBvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFdlYlZpZXcgbVdlYlZpZXc7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplcyB0aGUgd2ViVmlldyB3aXRoIGEgV2ViVmlld0NsaWVudCwgV2ViQ2hyb21lQ2xpZW50LAorICAgICAqIGFuZCBQaWN0dXJlTGlzdGVuZXIgdG8gcHJlcGFyZSBmb3IgbG9hZFVybEFuZFdhaXRGb3JDb21wbGV0aW9uLgorICAgICAqCisgICAgICogQSBuZXcgV2ViVmlld09uVWlUaHJlYWQgc2hvdWxkIGJlIGNhbGxlZCBkdXJpbmcgc2V0VXAgc28gYXMgdG8KKyAgICAgKiByZWluaXRpYWxpemUgYmV0d2VlbiBjYWxscy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXN0IFRoZSB0ZXN0IGluIHdoaWNoIHRoaXMgaXMgYmVpbmcgcnVuLgorICAgICAqIEBwYXJhbSB3ZWJWaWV3IFRoZSB3ZWJWaWV3IHRoYXQgdGhlIG1ldGhvZHMgc2hvdWxkIGNhbGwuCisgICAgICogQHNlZSAjbG9hZERhdGFBbmRXYWl0Rm9yQ29tcGxldGlvbihTdHJpbmcsIFN0cmluZywgU3RyaW5nKQorICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgV2ViVmlld09uVWlUaHJlYWQjV2ViVmlld09uVWlUaHJlYWQoQWN0aXZpdHlUZXN0UnVsZSwgV2ViVmlldyl9CisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgV2ViVmlld09uVWlUaHJlYWQoSW5zdHJ1bWVudGF0aW9uVGVzdENhc2UgdGVzdCwgV2ViVmlldyB3ZWJWaWV3KSB7CisgICAgICAgIG1UZXN0ID0gdGVzdDsKKyAgICAgICAgbVdlYlZpZXcgPSB3ZWJWaWV3OworICAgICAgICBmaW5hbCBXZWJWaWV3Q2xpZW50IHdlYlZpZXdDbGllbnQgPSBuZXcgV2FpdEZvckxvYWRlZENsaWVudCh0aGlzKTsKKyAgICAgICAgZmluYWwgV2ViQ2hyb21lQ2xpZW50IHdlYkNocm9tZUNsaWVudCA9IG5ldyBXYWl0Rm9yUHJvZ3Jlc3NDbGllbnQodGhpcyk7CisgICAgICAgIHJ1bk9uVWlUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgbVdlYlZpZXcuc2V0V2ViVmlld0NsaWVudCh3ZWJWaWV3Q2xpZW50KTsKKyAgICAgICAgICAgICAgICBtV2ViVmlldy5zZXRXZWJDaHJvbWVDbGllbnQod2ViQ2hyb21lQ2xpZW50KTsKKyAgICAgICAgICAgICAgICBtV2ViVmlldy5zZXRQaWN0dXJlTGlzdGVuZXIobmV3IFdhaXRGb3JOZXdQaWN0dXJlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplcyB0aGUgd2ViVmlldyB3aXRoIGEgV2ViVmlld0NsaWVudCwgV2ViQ2hyb21lQ2xpZW50LAorICAgICAqIGFuZCBQaWN0dXJlTGlzdGVuZXIgdG8gcHJlcGFyZSBmb3IgbG9hZFVybEFuZFdhaXRGb3JDb21wbGV0aW9uLgorICAgICAqCisgICAgICogQSBuZXcgV2ViVmlld09uVWlUaHJlYWQgc2hvdWxkIGJlIGNhbGxlZCBkdXJpbmcgc2V0VXAgc28gYXMgdG8KKyAgICAgKiByZWluaXRpYWxpemUgYmV0d2VlbiBjYWxscy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhY3Rpdml0eVRlc3RSdWxlIFRoZSB0ZXN0IHJ1bGUgaW4gd2hpY2ggdGhpcyBpcyBiZWluZyBydW4uCisgICAgICogQHBhcmFtIHdlYlZpZXcgVGhlIHdlYlZpZXcgdGhhdCB0aGUgbWV0aG9kcyBzaG91bGQgY2FsbC4KKyAgICAgKiBAc2VlICNsb2FkRGF0YUFuZFdhaXRGb3JDb21wbGV0aW9uKFN0cmluZywgU3RyaW5nLCBTdHJpbmcpCisgICAgICovCisgICAgcHVibGljIFdlYlZpZXdPblVpVGhyZWFkKEFjdGl2aXR5VGVzdFJ1bGUgYWN0aXZpdHlUZXN0UnVsZSwgV2ViVmlldyB3ZWJWaWV3KSB7CisgICAgICAgIG1BY3Rpdml0eVRlc3RSdWxlID0gYWN0aXZpdHlUZXN0UnVsZTsKKyAgICAgICAgbVdlYlZpZXcgPSB3ZWJWaWV3OworICAgICAgICBmaW5hbCBXZWJWaWV3Q2xpZW50IHdlYlZpZXdDbGllbnQgPSBuZXcgV2FpdEZvckxvYWRlZENsaWVudCh0aGlzKTsKKyAgICAgICAgZmluYWwgV2ViQ2hyb21lQ2xpZW50IHdlYkNocm9tZUNsaWVudCA9IG5ldyBXYWl0Rm9yUHJvZ3Jlc3NDbGllbnQodGhpcyk7CisgICAgICAgIHJ1bk9uVWlUaHJlYWQoKCkgLT4geworICAgICAgICAgICAgbVdlYlZpZXcuc2V0V2ViVmlld0NsaWVudCh3ZWJWaWV3Q2xpZW50KTsKKyAgICAgICAgICAgIG1XZWJWaWV3LnNldFdlYkNocm9tZUNsaWVudCh3ZWJDaHJvbWVDbGllbnQpOworICAgICAgICAgICAgbVdlYlZpZXcuc2V0UGljdHVyZUxpc3RlbmVyKG5ldyBXYWl0Rm9yTmV3UGljdHVyZSgpKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGFmdGVyIGEgdGVzdCBpcyBjb21wbGV0ZSBhbmQgdGhlIFdlYlZpZXcgc2hvdWxkIGJlIGRpc2VuZ2FnZWQgZnJvbQorICAgICAqIHRoZSB0ZXN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhblVwKCkgeworICAgICAgICBjbGVhckhpc3RvcnkoKTsKKyAgICAgICAgY2xlYXJDYWNoZSh0cnVlKTsKKyAgICAgICAgc2V0UGljdHVyZUxpc3RlbmVyKG51bGwpOworICAgICAgICBzZXRXZWJDaHJvbWVDbGllbnQobnVsbCk7CisgICAgICAgIHNldFdlYlZpZXdDbGllbnQobnVsbCk7CisgICAgICAgIHJ1bk9uVWlUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgbVdlYlZpZXcuZGVzdHJveSgpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgZnJvbSBXYWl0Rm9yTmV3UGljdHVyZSwgdGhpcyBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQKKyAgICAgKiB0aGUgcGFnZSBoYXMgYmVlbiBkcmF3bi4KKyAgICAgKi8KKyAgICBzeW5jaHJvbml6ZWQgcHVibGljIHZvaWQgb25OZXdQaWN0dXJlKCkgeworICAgICAgICBtTmV3UGljdHVyZSA9IHRydWU7CisgICAgICAgIHRoaXMubm90aWZ5QWxsKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGZyb20gV2FpdEZvckxvYWRlZENsaWVudCwgdGhpcyBpcyB1c2VkIHRvIGNsZWFyIHRoZSBwaWN0dXJlCisgICAgICogZHJhdyBzdGF0ZSBzbyB0aGF0IGRyYXdzIGJlZm9yZSB0aGUgVVJMIGJlZ2lucyBsb2FkaW5nIGRvbid0IGNvdW50LgorICAgICAqLworICAgIHN5bmNocm9uaXplZCBwdWJsaWMgdm9pZCBvblBhZ2VTdGFydGVkKCkgeworICAgICAgICBtTmV3UGljdHVyZSA9IGZhbHNlOyAvLyBFYXJsaWVyIHBhaW50cyB3b24ndCBjb3VudC4KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgZnJvbSBXYWl0Rm9yTG9hZGVkQ2xpZW50LCB0aGlzIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhhdAorICAgICAqIHRoZSBwYWdlIGlzIGxvYWRlZCwgYnV0IG5vdCBkcmF3biB5ZXQuCisgICAgICovCisgICAgc3luY2hyb25pemVkIHB1YmxpYyB2b2lkIG9uUGFnZUZpbmlzaGVkKCkgeworICAgICAgICBtTG9hZGVkID0gdHJ1ZTsKKyAgICAgICAgdGhpcy5ub3RpZnlBbGwoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgZnJvbSB0aGUgV2ViQ2hyb21lIGNsaWVudCwgdGhpcyBzZXRzIHRoZSBjdXJyZW50IHByb2dyZXNzCisgICAgICogZm9yIGEgcGFnZS4KKyAgICAgKiBAcGFyYW0gcHJvZ3Jlc3MgVGhlIHByb2dyZXNzIG1hZGUgc28gZmFyIGJldHdlZW4gMCBhbmQgMTAwLgorICAgICAqLworICAgIHN5bmNocm9uaXplZCBwdWJsaWMgdm9pZCBvblByb2dyZXNzQ2hhbmdlZChpbnQgcHJvZ3Jlc3MpIHsKKyAgICAgICAgbVByb2dyZXNzID0gcHJvZ3Jlc3M7CisgICAgICAgIHRoaXMubm90aWZ5QWxsKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0V2ViVmlld0NsaWVudChmaW5hbCBXZWJWaWV3Q2xpZW50IHdlYlZpZXdDbGllbnQpIHsKKyAgICAgICAgcnVuT25VaVRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBtV2ViVmlldy5zZXRXZWJWaWV3Q2xpZW50KHdlYlZpZXdDbGllbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRXZWJDaHJvbWVDbGllbnQoZmluYWwgV2ViQ2hyb21lQ2xpZW50IHdlYkNocm9tZUNsaWVudCkgeworICAgICAgICBydW5PblVpVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIG1XZWJWaWV3LnNldFdlYkNocm9tZUNsaWVudCh3ZWJDaHJvbWVDbGllbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQaWN0dXJlTGlzdGVuZXIoZmluYWwgUGljdHVyZUxpc3RlbmVyIHBpY3R1cmVMaXN0ZW5lcikgeworICAgICAgICBydW5PblVpVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIG1XZWJWaWV3LnNldFBpY3R1cmVMaXN0ZW5lcihwaWN0dXJlTGlzdGVuZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROZXR3b3JrQXZhaWxhYmxlKGZpbmFsIGJvb2xlYW4gYXZhaWxhYmxlKSB7CisgICAgICAgIHJ1bk9uVWlUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgbVdlYlZpZXcuc2V0TmV0d29ya0F2YWlsYWJsZShhdmFpbGFibGUpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREb3dubG9hZExpc3RlbmVyKGZpbmFsIERvd25sb2FkTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgcnVuT25VaVRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBtV2ViVmlldy5zZXREb3dubG9hZExpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKGZpbmFsIGludCBjb2xvcikgeworICAgICAgICBydW5PblVpVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIG1XZWJWaWV3LnNldEJhY2tncm91bmRDb2xvcihjb2xvcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsZWFyQ2FjaGUoZmluYWwgYm9vbGVhbiBpbmNsdWRlRGlza0ZpbGVzKSB7CisgICAgICAgIHJ1bk9uVWlUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgbVdlYlZpZXcuY2xlYXJDYWNoZShpbmNsdWRlRGlza0ZpbGVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xlYXJIaXN0b3J5KCkgeworICAgICAgICBydW5PblVpVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIG1XZWJWaWV3LmNsZWFySGlzdG9yeSgpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZXF1ZXN0Rm9jdXMoKSB7CisgICAgICAgIG5ldyBQb2xsaW5nQ2hlY2soTE9BRF9USU1FT1VUKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBib29sZWFuIGNoZWNrKCkgeworICAgICAgICAgICAgICAgIHJlcXVlc3RGb2N1c09uVWlUaHJlYWQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaGFzRm9jdXMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfS5ydW4oKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVxdWVzdEZvY3VzT25VaVRocmVhZCgpIHsKKyAgICAgICAgcnVuT25VaVRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBtV2ViVmlldy5yZXF1ZXN0Rm9jdXMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGhhc0ZvY3VzKCkgeworICAgICAgICByZXR1cm4gZ2V0VmFsdWUobmV3IFZhbHVlR2V0dGVyPEJvb2xlYW4+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgQm9vbGVhbiBjYXB0dXJlKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBtV2ViVmlldy5oYXNGb2N1cygpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBjYW5ab29tSW4oKSB7CisgICAgICAgIHJldHVybiBnZXRWYWx1ZShuZXcgVmFsdWVHZXR0ZXI8Qm9vbGVhbj4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBCb29sZWFuIGNhcHR1cmUoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1XZWJWaWV3LmNhblpvb21JbigpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBjYW5ab29tT3V0KCkgeworICAgICAgICByZXR1cm4gZ2V0VmFsdWUobmV3IFZhbHVlR2V0dGVyPEJvb2xlYW4+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgQm9vbGVhbiBjYXB0dXJlKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBtV2ViVmlldy5jYW5ab29tT3V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHpvb21JbigpIHsKKyAgICAgICAgcmV0dXJuIGdldFZhbHVlKG5ldyBWYWx1ZUdldHRlcjxCb29sZWFuPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIEJvb2xlYW4gY2FwdHVyZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVdlYlZpZXcuem9vbUluKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHpvb21PdXQoKSB7CisgICAgICAgIHJldHVybiBnZXRWYWx1ZShuZXcgVmFsdWVHZXR0ZXI8Qm9vbGVhbj4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBCb29sZWFuIGNhcHR1cmUoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1XZWJWaWV3Lnpvb21PdXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgem9vbUJ5KGZpbmFsIGZsb2F0IHpvb21GYWN0b3IpIHsKKyAgICAgICAgcnVuT25VaVRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBtV2ViVmlldy56b29tQnkoem9vbUZhY3Rvcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEZpbmRMaXN0ZW5lcihmaW5hbCBXZWJWaWV3LkZpbmRMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBydW5PblVpVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIG1XZWJWaWV3LnNldEZpbmRMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUphdmFzY3JpcHRJbnRlcmZhY2UoZmluYWwgU3RyaW5nIGludGVyZmFjZU5hbWUpIHsKKyAgICAgICAgcnVuT25VaVRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBtV2ViVmlldy5yZW1vdmVKYXZhc2NyaXB0SW50ZXJmYWNlKGludGVyZmFjZU5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgV2ViTWVzc2FnZVBvcnRbXSBjcmVhdGVXZWJNZXNzYWdlQ2hhbm5lbCgpIHsKKyAgICAgICAgcmV0dXJuIGdldFZhbHVlKG5ldyBWYWx1ZUdldHRlcjxXZWJNZXNzYWdlUG9ydFtdPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFdlYk1lc3NhZ2VQb3J0W10gY2FwdHVyZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVdlYlZpZXcuY3JlYXRlV2ViTWVzc2FnZUNoYW5uZWwoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcG9zdFdlYk1lc3NhZ2UoZmluYWwgV2ViTWVzc2FnZSBtZXNzYWdlLCBmaW5hbCBVcmkgdGFyZ2V0T3JpZ2luKSB7CisgICAgICAgIHJ1bk9uVWlUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgbVdlYlZpZXcucG9zdFdlYk1lc3NhZ2UobWVzc2FnZSwgdGFyZ2V0T3JpZ2luKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkSmF2YXNjcmlwdEludGVyZmFjZShmaW5hbCBPYmplY3Qgb2JqZWN0LCBmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICBydW5PblVpVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIG1XZWJWaWV3LmFkZEphdmFzY3JpcHRJbnRlcmZhY2Uob2JqZWN0LCBuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZmxpbmdTY3JvbGwoZmluYWwgaW50IHZ4LCBmaW5hbCBpbnQgdnkpIHsKKyAgICAgICAgcnVuT25VaVRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBtV2ViVmlldy5mbGluZ1Njcm9sbCh2eCwgdnkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZXF1ZXN0Rm9jdXNOb2RlSHJlZihmaW5hbCBNZXNzYWdlIGhyZWZNc2cpIHsKKyAgICAgICAgcnVuT25VaVRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBtV2ViVmlldy5yZXF1ZXN0Rm9jdXNOb2RlSHJlZihocmVmTXNnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVxdWVzdEltYWdlUmVmKGZpbmFsIE1lc3NhZ2UgbXNnKSB7CisgICAgICAgIHJ1bk9uVWlUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgbVdlYlZpZXcucmVxdWVzdEltYWdlUmVmKG1zZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEluaXRpYWxTY2FsZShmaW5hbCBpbnQgc2NhbGVJblBlcmNlbnQpIHsKKyAgICAgICAgcnVuT25VaVRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBtV2ViVmlldy5zZXRJbml0aWFsU2NhbGUoc2NhbGVJblBlcmNlbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbGVhclNzbFByZWZlcmVuY2VzKCkgeworICAgICAgICBydW5PblVpVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIG1XZWJWaWV3LmNsZWFyU3NsUHJlZmVyZW5jZXMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xlYXJDbGllbnRDZXJ0UHJlZmVyZW5jZXMoZmluYWwgUnVubmFibGUgb25DbGVhcmVkKSB7CisgICAgICAgIHJ1bk9uVWlUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgV2ViVmlldy5jbGVhckNsaWVudENlcnRQcmVmZXJlbmNlcyhvbkNsZWFyZWQpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZXN1bWVUaW1lcnMoKSB7CisgICAgICAgIHJ1bk9uVWlUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgbVdlYlZpZXcucmVzdW1lVGltZXJzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGZpbmROZXh0KGZpbmFsIGJvb2xlYW4gZm9yd2FyZCkgeworICAgICAgICBydW5PblVpVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIG1XZWJWaWV3LmZpbmROZXh0KGZvcndhcmQpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbGVhck1hdGNoZXMoKSB7CisgICAgICAgIHJ1bk9uVWlUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgbVdlYlZpZXcuY2xlYXJNYXRjaGVzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxzIGxvYWRVcmwgb24gdGhlIFdlYlZpZXcgYW5kIHRoZW4gd2FpdHMgb25QYWdlRmluaXNoZWQsCisgICAgICogb25OZXdQaWN0dXJlIGFuZCBvblByb2dyZXNzQ2hhbmdlIHRvIHJlYWNoIDEwMC4KKyAgICAgKiBUZXN0IGZhaWxzIGlmIHRoZSBsb2FkIHRpbWVvdXQgZWxhcHNlcy4KKyAgICAgKiBAcGFyYW0gdXJsIFRoZSBVUkwgdG8gbG9hZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsb2FkVXJsQW5kV2FpdEZvckNvbXBsZXRpb24oZmluYWwgU3RyaW5nIHVybCkgeworICAgICAgICBjYWxsQW5kV2FpdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBtV2ViVmlldy5sb2FkVXJsKHVybCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxzIGxvYWRVcmwgb24gdGhlIFdlYlZpZXcgYW5kIHRoZW4gd2FpdHMgb25QYWdlRmluaXNoZWQsCisgICAgICogb25OZXdQaWN0dXJlIGFuZCBvblByb2dyZXNzQ2hhbmdlIHRvIHJlYWNoIDEwMC4KKyAgICAgKiBUZXN0IGZhaWxzIGlmIHRoZSBsb2FkIHRpbWVvdXQgZWxhcHNlcy4KKyAgICAgKiBAcGFyYW0gdXJsIFRoZSBVUkwgdG8gbG9hZC4KKyAgICAgKiBAcGFyYW0gZXh0cmFIZWFkZXJzIFRoZSBhZGRpdGlvbmFsIGhlYWRlcnMgdG8gYmUgdXNlZCBpbiB0aGUgSFRUUCByZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGxvYWRVcmxBbmRXYWl0Rm9yQ29tcGxldGlvbihmaW5hbCBTdHJpbmcgdXJsLAorICAgICAgICAgICAgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBleHRyYUhlYWRlcnMpIHsKKyAgICAgICAgY2FsbEFuZFdhaXQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgbVdlYlZpZXcubG9hZFVybCh1cmwsIGV4dHJhSGVhZGVycyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxvYWRVcmwoZmluYWwgU3RyaW5nIHVybCkgeworICAgICAgICBydW5PblVpVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIG1XZWJWaWV3LmxvYWRVcmwodXJsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcExvYWRpbmcoKSB7CisgICAgICAgIHJ1bk9uVWlUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgbVdlYlZpZXcuc3RvcExvYWRpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcG9zdFVybEFuZFdhaXRGb3JDb21wbGV0aW9uKGZpbmFsIFN0cmluZyB1cmwsIGZpbmFsIGJ5dGVbXSBwb3N0RGF0YSkgeworICAgICAgICBjYWxsQW5kV2FpdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBtV2ViVmlldy5wb3N0VXJsKHVybCwgcG9zdERhdGEpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsb2FkRGF0YUFuZFdhaXRGb3JDb21wbGV0aW9uKGZpbmFsIFN0cmluZyBkYXRhLAorICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1pbWVUeXBlLCBmaW5hbCBTdHJpbmcgZW5jb2RpbmcpIHsKKyAgICAgICAgY2FsbEFuZFdhaXQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgbVdlYlZpZXcubG9hZERhdGEoZGF0YSwgbWltZVR5cGUsIGVuY29kaW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbG9hZERhdGFXaXRoQmFzZVVSTEFuZFdhaXRGb3JDb21wbGV0aW9uKGZpbmFsIFN0cmluZyBiYXNlVXJsLAorICAgICAgICAgICAgZmluYWwgU3RyaW5nIGRhdGEsIGZpbmFsIFN0cmluZyBtaW1lVHlwZSwgZmluYWwgU3RyaW5nIGVuY29kaW5nLAorICAgICAgICAgICAgZmluYWwgU3RyaW5nIGhpc3RvcnlVcmwpIHsKKyAgICAgICAgY2FsbEFuZFdhaXQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgbVdlYlZpZXcubG9hZERhdGFXaXRoQmFzZVVSTChiYXNlVXJsLCBkYXRhLCBtaW1lVHlwZSwgZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBoaXN0b3J5VXJsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVsb2FkcyBhIHBhZ2UgYW5kIHdhaXRzIGZvciBpdCB0byBjb21wbGV0ZSByZWxvYWRpbmcuIFVzZSByZWxvYWQKKyAgICAgKiBpZiBpdCBpcyBhIGZvcm0gcmVzdWJtaXNzaW9uIGFuZCB0aGUgb25Gb3JtUmVzdWJtaXNzaW9uIHJlc3BvbmRzCisgICAgICogYnkgdGVsbGluZyBXZWJWaWV3IG5vdCB0byByZXN1Ym1pdCBpdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWxvYWRBbmRXYWl0Rm9yQ29tcGxldGlvbigpIHsKKyAgICAgICAgY2FsbEFuZFdhaXQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgbVdlYlZpZXcucmVsb2FkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbG9hZCB0aGUgcHJldmlvdXMgVVJMLiBVc2UgcmVsb2FkQW5kV2FpdEZvckNvbXBsZXRpb24gdW5sZXNzCisgICAgICogaXQgaXMgYSBmb3JtIHJlc3VibWlzc2lvbiBhbmQgdGhlIG9uRm9ybVJlc3VibWlzc2lvbiByZXNwb25kcworICAgICAqIGJ5IHRlbGxpbmcgV2ViVmlldyBub3QgdG8gcmVzdWJtaXQgaXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVsb2FkKCkgeworICAgICAgICBydW5PblVpVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIG1XZWJWaWV3LnJlbG9hZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2UgdGhpcyBvbmx5IHdoZW4gSmF2YVNjcmlwdCBjYXVzZXMgYSBwYWdlIGxvYWQgdG8gd2FpdCBmb3IgdGhlCisgICAgICogcGFnZSBsb2FkIHRvIGNvbXBsZXRlLiBPdGhlcndpc2UgdXNlIGxvYWRVcmxBbmRXYWl0Rm9yQ29tcGxldGlvbiBvcgorICAgICAqIHNpbWlsYXIgZnVuY3Rpb25zLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdhaXRGb3JMb2FkQ29tcGxldGlvbigpIHsKKyAgICAgICAgd2FpdEZvckNyaXRlcmlhKExPQURfVElNRU9VVCwKKyAgICAgICAgICAgICAgICBuZXcgQ2FsbGFibGU8Qm9vbGVhbj4oKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgQm9vbGVhbiBjYWxsKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzTG9hZGVkKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgY2xlYXJMb2FkKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdhaXRGb3JDcml0ZXJpYShsb25nIHRpbWVvdXQsIENhbGxhYmxlPEJvb2xlYW4+IGRvbmVDcml0ZXJpYSkgeworICAgICAgICBpZiAoaXNVaVRocmVhZCgpKSB7CisgICAgICAgICAgICB3YWl0T25VaVRocmVhZCh0aW1lb3V0LCBkb25lQ3JpdGVyaWEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd2FpdE9uVGVzdFRocmVhZCh0aW1lb3V0LCBkb25lQ3JpdGVyaWEpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldFZhbHVlKG5ldyBWYWx1ZUdldHRlcjxTdHJpbmc+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGNhcHR1cmUoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1XZWJWaWV3LmdldFRpdGxlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyBXZWJTZXR0aW5ncyBnZXRTZXR0aW5ncygpIHsKKyAgICAgICAgcmV0dXJuIGdldFZhbHVlKG5ldyBWYWx1ZUdldHRlcjxXZWJTZXR0aW5ncz4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBXZWJTZXR0aW5ncyBjYXB0dXJlKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBtV2ViVmlldy5nZXRTZXR0aW5ncygpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgV2ViQmFja0ZvcndhcmRMaXN0IGNvcHlCYWNrRm9yd2FyZExpc3QoKSB7CisgICAgICAgIHJldHVybiBnZXRWYWx1ZShuZXcgVmFsdWVHZXR0ZXI8V2ViQmFja0ZvcndhcmRMaXN0PigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFdlYkJhY2tGb3J3YXJkTGlzdCBjYXB0dXJlKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBtV2ViVmlldy5jb3B5QmFja0ZvcndhcmRMaXN0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyBCaXRtYXAgZ2V0RmF2aWNvbigpIHsKKyAgICAgICAgcmV0dXJuIGdldFZhbHVlKG5ldyBWYWx1ZUdldHRlcjxCaXRtYXA+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgQml0bWFwIGNhcHR1cmUoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1XZWJWaWV3LmdldEZhdmljb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRVcmwoKSB7CisgICAgICAgIHJldHVybiBnZXRWYWx1ZShuZXcgVmFsdWVHZXR0ZXI8U3RyaW5nPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyBjYXB0dXJlKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBtV2ViVmlldy5nZXRVcmwoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRQcm9ncmVzcygpIHsKKyAgICAgICAgcmV0dXJuIGdldFZhbHVlKG5ldyBWYWx1ZUdldHRlcjxJbnRlZ2VyPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIEludGVnZXIgY2FwdHVyZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVdlYlZpZXcuZ2V0UHJvZ3Jlc3MoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRIZWlnaHQoKSB7CisgICAgICAgIHJldHVybiBnZXRWYWx1ZShuZXcgVmFsdWVHZXR0ZXI8SW50ZWdlcj4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBJbnRlZ2VyIGNhcHR1cmUoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1XZWJWaWV3LmdldEhlaWdodCgpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldENvbnRlbnRIZWlnaHQoKSB7CisgICAgICAgIHJldHVybiBnZXRWYWx1ZShuZXcgVmFsdWVHZXR0ZXI8SW50ZWdlcj4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBJbnRlZ2VyIGNhcHR1cmUoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1XZWJWaWV3LmdldENvbnRlbnRIZWlnaHQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcGFnZVVwKGZpbmFsIGJvb2xlYW4gdG9wKSB7CisgICAgICAgIHJldHVybiBnZXRWYWx1ZShuZXcgVmFsdWVHZXR0ZXI8Qm9vbGVhbj4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBCb29sZWFuIGNhcHR1cmUoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1XZWJWaWV3LnBhZ2VVcCh0b3ApOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBwYWdlRG93bihmaW5hbCBib29sZWFuIGJvdHRvbSkgeworICAgICAgICByZXR1cm4gZ2V0VmFsdWUobmV3IFZhbHVlR2V0dGVyPEJvb2xlYW4+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgQm9vbGVhbiBjYXB0dXJlKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBtV2ViVmlldy5wYWdlRG93bihib3R0b20pOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwb3N0VmlzdWFsU3RhdGVDYWxsYmFjayhmaW5hbCBsb25nIHJlcXVlc3RJZCwgZmluYWwgVmlzdWFsU3RhdGVDYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICBydW5PblVpVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIG1XZWJWaWV3LnBvc3RWaXN1YWxTdGF0ZUNhbGxiYWNrKHJlcXVlc3RJZCwgY2FsbGJhY2spOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50W10gZ2V0TG9jYXRpb25PblNjcmVlbigpIHsKKyAgICAgICAgZmluYWwgaW50W10gbG9jYXRpb24gPSBuZXcgaW50WzJdOworICAgICAgICByZXR1cm4gZ2V0VmFsdWUobmV3IFZhbHVlR2V0dGVyPGludFtdPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGludFtdIGNhcHR1cmUoKSB7CisgICAgICAgICAgICAgICAgbVdlYlZpZXcuZ2V0TG9jYXRpb25PblNjcmVlbihsb2NhdGlvbik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2F0aW9uOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmxvYXQgZ2V0U2NhbGUoKSB7CisgICAgICAgIHJldHVybiBnZXRWYWx1ZShuZXcgVmFsdWVHZXR0ZXI8RmxvYXQ+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgRmxvYXQgY2FwdHVyZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVdlYlZpZXcuZ2V0U2NhbGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcmVxdWVzdEZvY3VzKGZpbmFsIGludCBkaXJlY3Rpb24sCisgICAgICAgICAgICBmaW5hbCBSZWN0IHByZXZpb3VzbHlGb2N1c2VkUmVjdCkgeworICAgICAgICByZXR1cm4gZ2V0VmFsdWUobmV3IFZhbHVlR2V0dGVyPEJvb2xlYW4+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgQm9vbGVhbiBjYXB0dXJlKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBtV2ViVmlldy5yZXF1ZXN0Rm9jdXMoZGlyZWN0aW9uLCBwcmV2aW91c2x5Rm9jdXNlZFJlY3QpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgSGl0VGVzdFJlc3VsdCBnZXRIaXRUZXN0UmVzdWx0KCkgeworICAgICAgICByZXR1cm4gZ2V0VmFsdWUobmV3IFZhbHVlR2V0dGVyPEhpdFRlc3RSZXN1bHQ+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgSGl0VGVzdFJlc3VsdCBjYXB0dXJlKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBtV2ViVmlldy5nZXRIaXRUZXN0UmVzdWx0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0U2Nyb2xsWCgpIHsKKyAgICAgICAgcmV0dXJuIGdldFZhbHVlKG5ldyBWYWx1ZUdldHRlcjxJbnRlZ2VyPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIEludGVnZXIgY2FwdHVyZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVdlYlZpZXcuZ2V0U2Nyb2xsWCgpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFNjcm9sbFkoKSB7CisgICAgICAgIHJldHVybiBnZXRWYWx1ZShuZXcgVmFsdWVHZXR0ZXI8SW50ZWdlcj4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBJbnRlZ2VyIGNhcHR1cmUoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1XZWJWaWV3LmdldFNjcm9sbFkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIERpc3BsYXlNZXRyaWNzIGdldERpc3BsYXlNZXRyaWNzKCkgeworICAgICAgICByZXR1cm4gZ2V0VmFsdWUobmV3IFZhbHVlR2V0dGVyPERpc3BsYXlNZXRyaWNzPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIERpc3BsYXlNZXRyaWNzIGNhcHR1cmUoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1XZWJWaWV3LmdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiByZXF1ZXN0Q2hpbGRSZWN0YW5nbGVPblNjcmVlbihmaW5hbCBWaWV3IGNoaWxkLAorICAgICAgICAgICAgZmluYWwgUmVjdCByZWN0LAorICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpbW1lZGlhdGUpIHsKKyAgICAgICAgcmV0dXJuIGdldFZhbHVlKG5ldyBWYWx1ZUdldHRlcjxCb29sZWFuPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIEJvb2xlYW4gY2FwdHVyZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVdlYlZpZXcucmVxdWVzdENoaWxkUmVjdGFuZ2xlT25TY3JlZW4oY2hpbGQsIHJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICBpbW1lZGlhdGUpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGZpbmRBbGwoZmluYWwgU3RyaW5nIGZpbmQpIHsKKyAgICAgICAgcmV0dXJuIGdldFZhbHVlKG5ldyBWYWx1ZUdldHRlcjxJbnRlZ2VyPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIEludGVnZXIgY2FwdHVyZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVdlYlZpZXcuZmluZEFsbChmaW5kKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIFBpY3R1cmUgY2FwdHVyZVBpY3R1cmUoKSB7CisgICAgICAgIHJldHVybiBnZXRWYWx1ZShuZXcgVmFsdWVHZXR0ZXI8UGljdHVyZT4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBQaWN0dXJlIGNhcHR1cmUoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1XZWJWaWV3LmNhcHR1cmVQaWN0dXJlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGV2YWx1YXRlSmF2YXNjcmlwdChmaW5hbCBTdHJpbmcgc2NyaXB0LCBmaW5hbCBWYWx1ZUNhbGxiYWNrPFN0cmluZz4gcmVzdWx0KSB7CisgICAgICAgIHJ1bk9uVWlUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgbVdlYlZpZXcuZXZhbHVhdGVKYXZhc2NyaXB0KHNjcmlwdCwgcmVzdWx0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2F2ZVdlYkFyY2hpdmUoZmluYWwgU3RyaW5nIGJhc2VuYW1lLCBmaW5hbCBib29sZWFuIGF1dG9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFZhbHVlQ2FsbGJhY2s8U3RyaW5nPiBjYWxsYmFjaykgeworICAgICAgICBydW5PblVpVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIG1XZWJWaWV3LnNhdmVXZWJBcmNoaXZlKGJhc2VuYW1lLCBhdXRvbmFtZSwgY2FsbGJhY2spOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgV2ViVmlldyBjcmVhdGVXZWJWaWV3KCkgeworICAgICAgICByZXR1cm4gZ2V0VmFsdWUobmV3IFZhbHVlR2V0dGVyPFdlYlZpZXc+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgV2ViVmlldyBjYXB0dXJlKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgV2ViVmlldyhtV2ViVmlldy5nZXRDb250ZXh0KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJpbnREb2N1bWVudEFkYXB0ZXIgY3JlYXRlUHJpbnREb2N1bWVudEFkYXB0ZXIoKSB7CisgICAgICAgIHJldHVybiBnZXRWYWx1ZShuZXcgVmFsdWVHZXR0ZXI8UHJpbnREb2N1bWVudEFkYXB0ZXI+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgUHJpbnREb2N1bWVudEFkYXB0ZXIgY2FwdHVyZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVdlYlZpZXcuY3JlYXRlUHJpbnREb2N1bWVudEFkYXB0ZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TGF5b3V0SGVpZ2h0VG9NYXRjaFBhcmVudCgpIHsKKyAgICAgICAgcnVuT25VaVRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBWaWV3UGFyZW50IHBhcmVudCA9IG1XZWJWaWV3LmdldFBhcmVudCgpOworICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBWaWV3R3JvdXApIHsKKyAgICAgICAgICAgICAgICAgICAgKChWaWV3R3JvdXApIHBhcmVudCkuZ2V0TGF5b3V0UGFyYW1zKCkuaGVpZ2h0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtV2ViVmlldy5nZXRMYXlvdXRQYXJhbXMoKS5oZWlnaHQgPSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVDsKKyAgICAgICAgICAgICAgICBtV2ViVmlldy5yZXF1ZXN0TGF5b3V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldExheW91dFRvTWF0Y2hQYXJlbnQoKSB7CisgICAgICAgIHJ1bk9uVWlUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgc2V0TWF0Y2hQYXJlbnQoKFZpZXcpIG1XZWJWaWV3LmdldFBhcmVudCgpKTsKKyAgICAgICAgICAgICAgICBzZXRNYXRjaFBhcmVudChtV2ViVmlldyk7CisgICAgICAgICAgICAgICAgbVdlYlZpZXcucmVxdWVzdExheW91dCgpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBY2NlcHRUaGlyZFBhcnR5Q29va2llcyhmaW5hbCBib29sZWFuIGFjY2VwdCkgeworICAgICAgICBydW5PblVpVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIENvb2tpZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5zZXRBY2NlcHRUaGlyZFBhcnR5Q29va2llcyhtV2ViVmlldywgYWNjZXB0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0VGhpcmRQYXJ0eUNvb2tpZXMoKSB7CisgICAgICAgIHJldHVybiBnZXRWYWx1ZShuZXcgVmFsdWVHZXR0ZXI8Qm9vbGVhbj4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBCb29sZWFuIGNhcHR1cmUoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIENvb2tpZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5hY2NlcHRUaGlyZFBhcnR5Q29va2llcyhtV2ViVmlldyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhlbHBlciBmb3IgcnVubmluZyBjb2RlIG9uIHRoZSBVSSB0aHJlYWQgd2hlcmUgYW4gZXhjZXB0aW9uIGlzCisgICAgICogYSB0ZXN0IGZhaWx1cmUuIElmIHRoaXMgaXMgYWxyZWFkeSB0aGUgVUkgdGhyZWFkIHRoZW4gaXQgcnVucworICAgICAqIHRoZSBjb2RlIGltbWVkaWF0ZWx5LgorICAgICAqCisgICAgICogQHNlZSBJbnN0cnVtZW50YXRpb25UZXN0Q2FzZSNydW5UZXN0T25VaVRocmVhZChSdW5uYWJsZSkKKyAgICAgKiBAc2VlIEFjdGl2aXR5VGVzdFJ1bGUjcnVuT25VaVRocmVhZChSdW5uYWJsZSkKKyAgICAgKiBAcGFyYW0gciBUaGUgY29kZSB0byBydW4gaW4gdGhlIFVJIHRocmVhZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJ1bk9uVWlUaHJlYWQoUnVubmFibGUgcikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGlzVWlUaHJlYWQoKSkgeworICAgICAgICAgICAgICAgIHIucnVuKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChtQWN0aXZpdHlUZXN0UnVsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1BY3Rpdml0eVRlc3RSdWxlLnJ1bk9uVWlUaHJlYWQocik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbVRlc3QucnVuVGVzdE9uVWlUaHJlYWQocik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgQXNzZXJ0LmZhaWwoIlVuZXhwZWN0ZWQgZXJyb3Igd2hpbGUgcnVubmluZyBvbiBVSSB0aHJlYWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgKyB0LmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBY2Nlc3NvciBmb3IgdW5kZXJseWluZyBXZWJWaWV3LgorICAgICAqIEByZXR1cm4gVGhlIFdlYlZpZXcgYmVpbmcgd3JhcHBlZCBieSB0aGlzIGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBXZWJWaWV3IGdldFdlYlZpZXcoKSB7CisgICAgICAgIHJldHVybiBtV2ViVmlldzsKKyAgICB9CisKKyAgICBwcml2YXRlPFQ+IFQgZ2V0VmFsdWUoVmFsdWVHZXR0ZXI8VD4gZ2V0dGVyKSB7CisgICAgICAgIHJ1bk9uVWlUaHJlYWQoZ2V0dGVyKTsKKyAgICAgICAgcmV0dXJuIGdldHRlci5nZXRWYWx1ZSgpOworICAgIH0KKworICAgIHByaXZhdGUgYWJzdHJhY3QgY2xhc3MgVmFsdWVHZXR0ZXI8VD4gaW1wbGVtZW50cyBSdW5uYWJsZSB7CisgICAgICAgIHByaXZhdGUgVCBtVmFsdWU7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIG1WYWx1ZSA9IGNhcHR1cmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBhYnN0cmFjdCBUIGNhcHR1cmUoKTsKKworICAgICAgICBwdWJsaWMgVCBnZXRWYWx1ZSgpIHsKKyAgICAgICAgICAgcmV0dXJuIG1WYWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCB0aHJlYWQgaXMgdGhlIFVJIHRocmVhZCBiYXNlZCBvbiB0aGUKKyAgICAgKiBMb29wZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1VpVGhyZWFkKCkgeworICAgICAgICByZXR1cm4gKExvb3Blci5teUxvb3BlcigpID09IExvb3Blci5nZXRNYWluTG9vcGVyKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gV2hldGhlciBvciBub3QgdGhlIGxvYWQgaGFzIGZpbmlzaGVkLgorICAgICAqLworICAgIHByaXZhdGUgc3luY2hyb25pemVkIGJvb2xlYW4gaXNMb2FkZWQoKSB7CisgICAgICAgIHJldHVybiBtTG9hZGVkICYmIG1OZXdQaWN0dXJlICYmIG1Qcm9ncmVzcyA9PSAxMDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFrZXMgYSBXZWJWaWV3IGNhbGwsIHdhaXRzIGZvciBjb21wbGV0aW9uIGFuZCB0aGVuIHJlc2V0cyB0aGUKKyAgICAgKiBsb2FkIHN0YXRlIGluIHByZXBhcmF0aW9uIGZvciB0aGUgbmV4dCBsb2FkIGNhbGwuCisgICAgICogQHBhcmFtIGNhbGwgVGhlIGNhbGwgdG8gbWFrZSBvbiB0aGUgVUkgdGhyZWFkIHByaW9yIHRvIHdhaXRpbmcuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNhbGxBbmRXYWl0KFJ1bm5hYmxlIGNhbGwpIHsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIldlYlZpZXdPblVpVGhyZWFkLmxvYWQqQW5kV2FpdEZvckNvbXBsZXRpb24gY2FsbHMgIgorICAgICAgICAgICAgICAgICsgIm1heSBub3QgYmUgbWl4ZWQgd2l0aCBsb2FkKiBjYWxscyBkaXJlY3RseSBvbiBXZWJWaWV3ICIKKyAgICAgICAgICAgICAgICArICJ3aXRob3V0IGNhbGxpbmcgd2FpdEZvckxvYWRDb21wbGV0aW9uIGFmdGVyIHRoZSBsb2FkIiwKKyAgICAgICAgICAgICAgICAhaXNMb2FkZWQoKSk7CisgICAgICAgIGNsZWFyTG9hZCgpOyAvLyBjbGVhciBhbnkgZXh0cmFuZW91cyBzaWduYWxzIGZyb20gYSBwcmV2aW91cyBsb2FkLgorICAgICAgICBydW5PblVpVGhyZWFkKGNhbGwpOworICAgICAgICB3YWl0Rm9yTG9hZENvbXBsZXRpb24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbmV2ZXIgYSBsb2FkIGhhcyBiZWVuIGNvbXBsZXRlZCBzbyB0aGF0IGEgc3Vic2VxdWVudCBjYWxsIHRvCisgICAgICogd2FpdEZvckxvYWRDb21wbGV0aW9uIGRvZXNuJ3QgcmV0dXJuIGltbWVkaWF0ZWx5LgorICAgICAqLworICAgIHN5bmNocm9uaXplZCBwcml2YXRlIHZvaWQgY2xlYXJMb2FkKCkgeworICAgICAgICBtTG9hZGVkID0gZmFsc2U7CisgICAgICAgIG1OZXdQaWN0dXJlID0gZmFsc2U7CisgICAgICAgIG1Qcm9ncmVzcyA9IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlcyBhIHBvbGxpbmcgbWVjaGFuaXNtLCB3aGlsZSBwdW1waW5nIG1lc3NhZ2VzIHRvIGNoZWNrIHdoZW4gdGhlCisgICAgICogY3JpdGVyaWEgaXMgbWV0LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB3YWl0T25VaVRocmVhZChsb25nIHRpbWVvdXQsIGZpbmFsIENhbGxhYmxlPEJvb2xlYW4+IGRvbmVDcml0ZXJpYSkgeworICAgICAgICBuZXcgUG9sbGluZ0NoZWNrKHRpbWVvdXQpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2soKSB7CisgICAgICAgICAgICAgICAgcHVtcE1lc3NhZ2VzKCk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvbmVDcml0ZXJpYS5jYWxsKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmZhaWwoIlVuZXhwZWN0ZWQgZXJyb3Igd2hpbGUgY2hlY2tpbmcgdGhlIGNyaXRlcmlhOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfS5ydW4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2VzIGEgd2FpdC9ub3RpZnkgdG8gY2hlY2sgd2hlbiB0aGUgY3JpdGVyaWEgaXMgbWV0LgorICAgICAqLworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgd2FpdE9uVGVzdFRocmVhZChsb25nIHRpbWVvdXQsIENhbGxhYmxlPEJvb2xlYW4+IGRvbmVDcml0ZXJpYSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbG9uZyB3YWl0RW5kID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkgKyB0aW1lb3V0OworICAgICAgICAgICAgbG9uZyB0aW1lUmVtYWluaW5nID0gdGltZW91dDsKKyAgICAgICAgICAgIHdoaWxlICghZG9uZUNyaXRlcmlhLmNhbGwoKSAmJiB0aW1lUmVtYWluaW5nID4gMCkgeworICAgICAgICAgICAgICAgIHRoaXMud2FpdCh0aW1lUmVtYWluaW5nKTsKKyAgICAgICAgICAgICAgICB0aW1lUmVtYWluaW5nID0gd2FpdEVuZCAtIFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkFjdGlvbiBmYWlsZWQgdG8gY29tcGxldGUgYmVmb3JlIHRpbWVvdXQiLCBkb25lQ3JpdGVyaWEuY2FsbCgpKTsKKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gV2UnbGwganVzdCBkcm9wIG91dCBvZiB0aGUgbG9vcCBhbmQgZmFpbAorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgQXNzZXJ0LmZhaWwoIlVuZXhwZWN0ZWQgZXJyb3Igd2hpbGUgY2hlY2tpbmcgdGhlIGNyaXRlcmlhOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUHVtcHMgYWxsIGN1cnJlbnRseS1xdWV1ZWQgbWVzc2FnZXMgaW4gdGhlIFVJIHRocmVhZCBhbmQgdGhlbiBleGl0cy4KKyAgICAgKiBUaGlzIGlzIHVzZWZ1bCB0byBmb3JjZSBwcm9jZXNzaW5nIHdoaWxlIHJ1bm5pbmcgdGVzdHMgaW4gdGhlIFVJIHRocmVhZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcHVtcE1lc3NhZ2VzKCkgeworICAgICAgICBjbGFzcyBFeGl0TG9vcEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24geworICAgICAgICB9CisKKyAgICAgICAgLy8gRm9yY2UgbG9vcCB0byBleGl0IHdoZW4gcHJvY2Vzc2luZyB0aGlzLiBMb29wLnF1aXQoKSBkb2Vzbid0CisgICAgICAgIC8vIHdvcmsgYmVjYXVzZSB0aGlzIGlzIHRoZSBtYWluIExvb3AuCisgICAgICAgIG1XZWJWaWV3LmdldEhhbmRsZXIoKS5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGl0TG9vcEV4Y2VwdGlvbigpOyAvLyBleGl0IGxvb3AhCisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gUHVtcCBtZXNzYWdlcyB1bnRpbCBvdXIgbWVzc2FnZSBnZXRzIHRocm91Z2guCisgICAgICAgICAgICBMb29wZXIubG9vcCgpOworICAgICAgICB9IGNhdGNoIChFeGl0TG9vcEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgTGF5b3V0UGFyYW1zIHRvIE1BVENIX1BBUkVOVC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2aWV3IFRhcmdldCB2aWV3CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldE1hdGNoUGFyZW50KFZpZXcgdmlldykgeworICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIHBhcmFtcyA9IHZpZXcuZ2V0TGF5b3V0UGFyYW1zKCk7CisgICAgICAgIHBhcmFtcy5oZWlnaHQgPSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVDsKKyAgICAgICAgcGFyYW1zLndpZHRoID0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQ7CisgICAgICAgIHZpZXcuc2V0TGF5b3V0UGFyYW1zKHBhcmFtcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBXZWJDaHJvbWVDbGllbnQgdXNlZCB0byBjYXB0dXJlIHRoZSBvblByb2dyZXNzQ2hhbmdlZCBmb3IgdXNlCisgICAgICogaW4gd2FpdEZvciBmdW5jdGlvbnMuIElmIGEgdGVzdCBtdXN0IG92ZXJyaWRlIHRoZSBXZWJDaHJvbWVDbGllbnQsCisgICAgICogaXQgY2FuIGRlcml2ZSBmcm9tIHRoaXMgY2xhc3Mgb3IgY2FsbCBvblByb2dyZXNzQ2hhbmdlZAorICAgICAqIGRpcmVjdGx5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgV2FpdEZvclByb2dyZXNzQ2xpZW50IGV4dGVuZHMgV2ViQ2hyb21lQ2xpZW50IHsKKyAgICAgICAgcHJpdmF0ZSBXZWJWaWV3T25VaVRocmVhZCBtT25VaVRocmVhZDsKKworICAgICAgICBwdWJsaWMgV2FpdEZvclByb2dyZXNzQ2xpZW50KFdlYlZpZXdPblVpVGhyZWFkIG9uVWlUaHJlYWQpIHsKKyAgICAgICAgICAgIG1PblVpVGhyZWFkID0gb25VaVRocmVhZDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblByb2dyZXNzQ2hhbmdlZChXZWJWaWV3IHZpZXcsIGludCBuZXdQcm9ncmVzcykgeworICAgICAgICAgICAgc3VwZXIub25Qcm9ncmVzc0NoYW5nZWQodmlldywgbmV3UHJvZ3Jlc3MpOworICAgICAgICAgICAgbU9uVWlUaHJlYWQub25Qcm9ncmVzc0NoYW5nZWQobmV3UHJvZ3Jlc3MpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBXZWJWaWV3Q2xpZW50IHRoYXQgY2FwdHVyZXMgdGhlIG9uUGFnZUZpbmlzaGVkIGZvciB1c2UgaW4KKyAgICAgKiB3YWl0Rm9yIGZ1bmN0aW9ucy4gVXNpbmcgaW5pdGlhbGl6ZVdlYlZpZXcgc2V0cyB0aGUgV2FpdEZvckxvYWRlZENsaWVudAorICAgICAqIGludG8gdGhlIFdlYlZpZXcuIElmIGEgdGVzdCBuZWVkcyB0byBzZXQgYSBzcGVjaWZpYyBXZWJWaWV3Q2xpZW50IGFuZAorICAgICAqIG5lZWRzIHRoZSB3YWl0Rm9yQ29tcGxldGlvbiBjYXBhYmlsaXR5IHRoZW4gaXQgc2hvdWxkIGRlcml2ZSBmcm9tCisgICAgICogV2FpdEZvckxvYWRlZENsaWVudCBvciBjYWxsIFdlYlZpZXdPblVpVGhyZWFkLm9uUGFnZUZpbmlzaGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgV2FpdEZvckxvYWRlZENsaWVudCBleHRlbmRzIFdlYlZpZXdDbGllbnQgeworICAgICAgICBwcml2YXRlIFdlYlZpZXdPblVpVGhyZWFkIG1PblVpVGhyZWFkOworCisgICAgICAgIHB1YmxpYyBXYWl0Rm9yTG9hZGVkQ2xpZW50KFdlYlZpZXdPblVpVGhyZWFkIG9uVWlUaHJlYWQpIHsKKyAgICAgICAgICAgIG1PblVpVGhyZWFkID0gb25VaVRocmVhZDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblBhZ2VGaW5pc2hlZChXZWJWaWV3IHZpZXcsIFN0cmluZyB1cmwpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uUGFnZUZpbmlzaGVkKHZpZXcsIHVybCk7CisgICAgICAgICAgICBtT25VaVRocmVhZC5vblBhZ2VGaW5pc2hlZCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUGFnZVN0YXJ0ZWQoV2ViVmlldyB2aWV3LCBTdHJpbmcgdXJsLCBCaXRtYXAgZmF2aWNvbikgeworICAgICAgICAgICAgc3VwZXIub25QYWdlU3RhcnRlZCh2aWV3LCB1cmwsIGZhdmljb24pOworICAgICAgICAgICAgbU9uVWlUaHJlYWQub25QYWdlU3RhcnRlZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBQaWN0dXJlTGlzdGVuZXIgdGhhdCBjYXB0dXJlcyB0aGUgb25OZXdQaWN0dXJlIGZvciB1c2UgaW4KKyAgICAgKiB3YWl0Rm9yTG9hZENvbXBsZXRpb24uIFVzaW5nIGluaXRpYWxpemVXZWJWaWV3IHNldHMgdGhlIFBpY3R1cmVMaXN0ZW5lcgorICAgICAqIGludG8gdGhlIFdlYlZpZXcuIElmIGEgdGVzdCBuZWVkcyB0byBzZXQgYSBzcGVjaWZpYyBQaWN0dXJlTGlzdGVuZXIgYW5kCisgICAgICogbmVlZHMgdGhlIHdhaXRGb3JDb21wbGV0aW9uIGNhcGFiaWxpdHkgdGhlbiBpdCBzaG91bGQgY2FsbAorICAgICAqIFdlYlZpZXdPblVpVGhyZWFkLm9uTmV3UGljdHVyZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIFdhaXRGb3JOZXdQaWN0dXJlIGltcGxlbWVudHMgUGljdHVyZUxpc3RlbmVyIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uTmV3UGljdHVyZShXZWJWaWV3IHZpZXcsIFBpY3R1cmUgcGljdHVyZSkgeworICAgICAgICAgICAgV2ViVmlld09uVWlUaHJlYWQudGhpcy5vbk5ld1BpY3R1cmUoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYnMvZGV2aWNldXRpbGxlZ2FjeS1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvU3luY2hyb25vdXNQaXhlbENvcHkuamF2YSBiL2xpYnMvZGV2aWNldXRpbGxlZ2FjeS1heHQvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvU3luY2hyb25vdXNQaXhlbENvcHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmE4NjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9kZXZpY2V1dGlsbGVnYWN5LWF4dC9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9jb21tb24vdXRpbC9TeW5jaHJvbm91c1BpeGVsQ29weS5qYXZhCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWw7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXJUaHJlYWQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LlBpeGVsQ29weTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OworaW1wb3J0IGFuZHJvaWQudmlldy5QaXhlbENvcHkuT25QaXhlbENvcHlGaW5pc2hlZExpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlVmlldzsKKworcHVibGljIGNsYXNzIFN5bmNocm9ub3VzUGl4ZWxDb3B5IGltcGxlbWVudHMgT25QaXhlbENvcHlGaW5pc2hlZExpc3RlbmVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBIYW5kbGVyIHNIYW5kbGVyOworICAgIHN0YXRpYyB7CisgICAgICAgIEhhbmRsZXJUaHJlYWQgdGhyZWFkID0gbmV3IEhhbmRsZXJUaHJlYWQoIlBpeGVsQ29weUhlbHBlciIpOworICAgICAgICB0aHJlYWQuc3RhcnQoKTsKKyAgICAgICAgc0hhbmRsZXIgPSBuZXcgSGFuZGxlcih0aHJlYWQuZ2V0TG9vcGVyKCkpOworICAgIH0KKworICAgIHByaXZhdGUgaW50IG1TdGF0dXMgPSAtMTsKKworICAgIHB1YmxpYyBpbnQgcmVxdWVzdChTdXJmYWNlIHNvdXJjZSwgQml0bWFwIGRlc3QpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBQaXhlbENvcHkucmVxdWVzdChzb3VyY2UsIGRlc3QsIHRoaXMsIHNIYW5kbGVyKTsKKyAgICAgICAgICAgIHJldHVybiBnZXRSZXN1bHRMb2NrZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgcmVxdWVzdChTdXJmYWNlIHNvdXJjZSwgUmVjdCBzcmNSZWN0LCBCaXRtYXAgZGVzdCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIFBpeGVsQ29weS5yZXF1ZXN0KHNvdXJjZSwgc3JjUmVjdCwgZGVzdCwgdGhpcywgc0hhbmRsZXIpOworICAgICAgICAgICAgcmV0dXJuIGdldFJlc3VsdExvY2tlZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCByZXF1ZXN0KFN1cmZhY2VWaWV3IHNvdXJjZSwgQml0bWFwIGRlc3QpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBQaXhlbENvcHkucmVxdWVzdChzb3VyY2UsIGRlc3QsIHRoaXMsIHNIYW5kbGVyKTsKKyAgICAgICAgICAgIHJldHVybiBnZXRSZXN1bHRMb2NrZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgcmVxdWVzdChTdXJmYWNlVmlldyBzb3VyY2UsIFJlY3Qgc3JjUmVjdCwgQml0bWFwIGRlc3QpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBQaXhlbENvcHkucmVxdWVzdChzb3VyY2UsIHNyY1JlY3QsIGRlc3QsIHRoaXMsIHNIYW5kbGVyKTsKKyAgICAgICAgICAgIHJldHVybiBnZXRSZXN1bHRMb2NrZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgcmVxdWVzdChXaW5kb3cgc291cmNlLCBCaXRtYXAgZGVzdCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIFBpeGVsQ29weS5yZXF1ZXN0KHNvdXJjZSwgZGVzdCwgdGhpcywgc0hhbmRsZXIpOworICAgICAgICAgICAgcmV0dXJuIGdldFJlc3VsdExvY2tlZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCByZXF1ZXN0KFdpbmRvdyBzb3VyY2UsIFJlY3Qgc3JjUmVjdCwgQml0bWFwIGRlc3QpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBQaXhlbENvcHkucmVxdWVzdChzb3VyY2UsIHNyY1JlY3QsIGRlc3QsIHRoaXMsIHNIYW5kbGVyKTsKKyAgICAgICAgICAgIHJldHVybiBnZXRSZXN1bHRMb2NrZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgaW50IGdldFJlc3VsdExvY2tlZCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRoaXMud2FpdCgyNTApOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJQaXhlbENvcHkgcmVxdWVzdCBkaWRuJ3QgY29tcGxldGUgd2l0aGluIDI1MG1zIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1TdGF0dXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25QaXhlbENvcHlGaW5pc2hlZChpbnQgY29weVJlc3VsdCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIG1TdGF0dXMgPSBjb3B5UmVzdWx0OworICAgICAgICAgICAgdGhpcy5ub3RpZnkoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYnMvZGV2aWNldXRpbGxlZ2FjeS9BbmRyb2lkLm1rIGIvbGlicy9kZXZpY2V1dGlsbGVnYWN5L0FuZHJvaWQubWsKaW5kZXggZjE2OWNhOC4uOGNmYTZkMSAxMDA2NDQKLS0tIGEvbGlicy9kZXZpY2V1dGlsbGVnYWN5L0FuZHJvaWQubWsKKysrIGIvbGlicy9kZXZpY2V1dGlsbGVnYWN5L0FuZHJvaWQubWsKQEAgLTE4LDggKzE4LDkgQEAKIAogTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKICAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsIFwKLSAgICBqdW5pdCBcCi0gICAgbGVnYWN5LWFuZHJvaWQtdGVzdAorICAgIGp1bml0CisKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSBcCiAgICAgJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCkBAIC0zMCw0ICszMSw2IEBACiAKIExPQ0FMX01PRFVMRSA6PSBjdHNkZXZpY2V1dGlsbGVnYWN5CiAKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKKwogaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19KQVZBX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9saWJzL2RldmljZXV0aWxsZWdhY3kvc3JjL2FuZHJvaWQvd2Via2l0L2N0cy9XZWJWaWV3T25VaVRocmVhZC5qYXZhIGIvbGlicy9kZXZpY2V1dGlsbGVnYWN5L3NyYy9hbmRyb2lkL3dlYmtpdC9jdHMvV2ViVmlld09uVWlUaHJlYWQuamF2YQppbmRleCBiNTI4NDE3Li5kMjBlMWE0IDEwMDY0NAotLS0gYS9saWJzL2RldmljZXV0aWxsZWdhY3kvc3JjL2FuZHJvaWQvd2Via2l0L2N0cy9XZWJWaWV3T25VaVRocmVhZC5qYXZhCisrKyBiL2xpYnMvZGV2aWNldXRpbGxlZ2FjeS9zcmMvYW5kcm9pZC93ZWJraXQvY3RzL1dlYlZpZXdPblVpVGhyZWFkLmphdmEKQEAgLTI3Nyw2ICsyNzcsMTYgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCByZXF1ZXN0Rm9jdXMoKSB7CisgICAgICAgIG5ldyBQb2xsaW5nQ2hlY2soTE9BRF9USU1FT1VUKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBib29sZWFuIGNoZWNrKCkgeworICAgICAgICAgICAgICAgIHJlcXVlc3RGb2N1c09uVWlUaHJlYWQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaGFzRm9jdXMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfS5ydW4oKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVxdWVzdEZvY3VzT25VaVRocmVhZCgpIHsKICAgICAgICAgcnVuT25VaVRocmVhZChuZXcgUnVubmFibGUoKSB7CiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKQEAgLTI4NSw2ICsyOTUsMTUgQEAKICAgICAgICAgfSk7CiAgICAgfQogCisgICAgcHJpdmF0ZSBib29sZWFuIGhhc0ZvY3VzKCkgeworICAgICAgICByZXR1cm4gZ2V0VmFsdWUobmV3IFZhbHVlR2V0dGVyPEJvb2xlYW4+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgQm9vbGVhbiBjYXB0dXJlKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBtV2ViVmlldy5oYXNGb2N1cygpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKICAgICBwdWJsaWMgYm9vbGVhbiBjYW5ab29tSW4oKSB7CiAgICAgICAgIHJldHVybiBnZXRWYWx1ZShuZXcgVmFsdWVHZXR0ZXI8Qm9vbGVhbj4oKSB7CiAgICAgICAgICAgICBAT3ZlcnJpZGUKQEAgLTY2MSwxNSArNjgwLDYgQEAKICAgICAgICAgfSk7CiAgICAgfQogCi0gICAgcHVibGljIGJvb2xlYW4gc2F2ZVBpY3R1cmUoZmluYWwgQnVuZGxlIGIsIGZpbmFsIEZpbGUgZGVzdCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWUobmV3IFZhbHVlR2V0dGVyPEJvb2xlYW4+KCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgQm9vbGVhbiBjYXB0dXJlKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtV2ViVmlldy5zYXZlUGljdHVyZShiLCBkZXN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCiAgICAgcHVibGljIGJvb2xlYW4gcGFnZVVwKGZpbmFsIGJvb2xlYW4gdG9wKSB7CiAgICAgICAgIHJldHVybiBnZXRWYWx1ZShuZXcgVmFsdWVHZXR0ZXI8Qm9vbGVhbj4oKSB7CiAgICAgICAgICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2xpYnMvanNvbi9BbmRyb2lkLm1rIGIvbGlicy9qc29uL0FuZHJvaWQubWsKaW5kZXggMjMxZjYzNS4uZDFiMjA1MSAxMDA2NDQKLS0tIGEvbGlicy9qc29uL0FuZHJvaWQubWsKKysrIGIvbGlicy9qc29uL0FuZHJvaWQubWsKQEAgLTMzLDYgKzMzLDcgQEAKIAogTE9DQUxfTU9EVUxFIDo9IGpzb24KIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CiAKIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfSkFWQV9MSUJSQVJZKQogCmRpZmYgLS1naXQgYS9saWJzL3J1bm5lci9BbmRyb2lkLm1rIGIvbGlicy9ydW5uZXIvQW5kcm9pZC5tawppbmRleCAxNWY2NGEzLi5mMjQ1MzUxIDEwMDY0NAotLS0gYS9saWJzL3J1bm5lci9BbmRyb2lkLm1rCisrKyBiL2xpYnMvcnVubmVyL0FuZHJvaWQubWsKQEAgLTE2LDYgKzE2LDggQEAKIAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKKyMgVGhlIGxlZ2FjeSBsaWJyYXJ5IHRoYXQgYnJpbmdzIGluIGFuZHJvaWQtc3VwcG9ydC10ZXN0IHRyYW5zaXRpdmVseQorCiBMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY3RzLXRlc3QtcnVubmVyCiAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCkBAIC0yNSwzICsyNywxOSBAQAogTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAogCiBpbmNsdWRlICQoQlVJTERfU1RBVElDX0pBVkFfTElCUkFSWSkKKworCisjIFRoZSBsaWJyYXJ5IHZhcmlhbnQgdGhhdCBicmluZ3MgaW4gYW5kcm9pZHgudGVzdCB0cmFuc2l0aXZlbHkKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY3RzLXRlc3QtcnVubmVyLWF4dAorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9NT0RVTEUgOj0gY3RzdGVzdHJ1bm5lci1heHQKKworTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0pBVkFfTElCUkFSWSkKKworCmRpZmYgLS1naXQgYS9saWJzL3Rlc3RzZXJ2ZXIvc3JjL2FuZHJvaWQvd2Via2l0L2N0cy9DdHNUZXN0U2VydmVyLmphdmEgYi9saWJzL3Rlc3RzZXJ2ZXIvc3JjL2FuZHJvaWQvd2Via2l0L2N0cy9DdHNUZXN0U2VydmVyLmphdmEKaW5kZXggZDkyNTZiOC4uMTRkODI5YyAxMDA2NDQKLS0tIGEvbGlicy90ZXN0c2VydmVyL3NyYy9hbmRyb2lkL3dlYmtpdC9jdHMvQ3RzVGVzdFNlcnZlci5qYXZhCisrKyBiL2xpYnMvdGVzdHNlcnZlci9zcmMvYW5kcm9pZC93ZWJraXQvY3RzL0N0c1Rlc3RTZXJ2ZXIuamF2YQpAQCAtNTcsNyArNTcsNiBAQAogaW1wb3J0IGphdmEubmV0LlNlcnZlclNvY2tldDsKIGltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7CiBpbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSTDsKIGltcG9ydCBqYXZhLm5ldC5VUkxFbmNvZGVyOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5U3RvcmU7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZTsKQEAgLTc5LDYgKzc4LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKIAogaW1wb3J0IGphdmF4Lm5ldC5zc2wuSG9zdG5hbWVWZXJpZmllcjsKK2ltcG9ydCBqYXZheC5uZXQuc3NsLkh0dHBzVVJMQ29ubmVjdGlvbjsKIGltcG9ydCBqYXZheC5uZXQuc3NsLktleU1hbmFnZXI7CiBpbXBvcnQgamF2YXgubmV0LnNzbC5LZXlNYW5hZ2VyRmFjdG9yeTsKIGltcG9ydCBqYXZheC5uZXQuc3NsLlNTTENvbnRleHQ7CkBAIC0xMzAsNiArMTMwLDcgQEAKICAgICAgICAgTk9fQ0xJRU5UX0FVVEgsCiAgICAgICAgIFdBTlRTX0NMSUVOVF9BVVRILAogICAgICAgICBORUVEU19DTElFTlRfQVVUSCwKKyAgICAgICAgVFJVU1RfQU5ZX0NMSUVOVAogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIEhhc2h0YWJsZTxJbnRlZ2VyLCBTdHJpbmc+IHNSZWFzb25zOwpAQCAtOTI2LDcgKzkyNywxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbVNzbENvbnRleHQgPSBTU0xDb250ZXh0LmdldEluc3RhbmNlKCJUTFMiKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1Tc2xDb250ZXh0LmluaXQoZ2V0S2V5TWFuYWdlcnMoKSwgbVNlcnZlci5nZXRUcnVzdE1hbmFnZXJzKCksIG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgbVNvY2tldCA9IG1Tc2xDb250ZXh0LmdldFNlcnZlclNvY2tldEZhY3RvcnkoKS5jcmVhdGVTZXJ2ZXJTb2NrZXQoMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobVNzbCA9PSBTc2xNb2RlLldBTlRTX0NMSUVOVF9BVVRIKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVNzbCA9PSBTc2xNb2RlLlRSVVNUX0FOWV9DTElFTlQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwc1VSTENvbm5lY3Rpb24uc2V0RGVmYXVsdEhvc3RuYW1lVmVyaWZpZXIobmV3IEhvc3RuYW1lVmVyaWZpZXIoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiB2ZXJpZnkoU3RyaW5nIHMsIFNTTFNlc3Npb24gc3NsU2Vzc2lvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwc1VSTENvbm5lY3Rpb24uc2V0RGVmYXVsdFNTTFNvY2tldEZhY3RvcnkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3NsQ29udGV4dC5nZXRTb2NrZXRGYWN0b3J5KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtU3NsID09IFNzbE1vZGUuV0FOVFNfQ0xJRU5UX0FVVEgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNTTFNlcnZlclNvY2tldCkgbVNvY2tldCkuc2V0V2FudENsaWVudEF1dGgodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1Tc2wgPT0gU3NsTW9kZS5ORUVEU19DTElFTlRfQVVUSCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU1NMU2VydmVyU29ja2V0KSBtU29ja2V0KS5zZXROZWVkQ2xpZW50QXV0aCh0cnVlKTsKZGlmZiAtLWdpdCBhL2xpYnMvdm9nYXItZXhwZWN0L0FuZHJvaWQubWsgYi9saWJzL3ZvZ2FyLWV4cGVjdC9BbmRyb2lkLm1rCmluZGV4IDJiNWUwNzQuLmY4ODhkMjYgMTAwNjQ0Ci0tLSBhL2xpYnMvdm9nYXItZXhwZWN0L0FuZHJvaWQubWsKKysrIGIvbGlicy92b2dhci1leHBlY3QvQW5kcm9pZC5tawpAQCAtMzIsNiArMzIsNyBAQAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogTE9DQUxfTU9EVUxFIDo9IHZvZ2FyZXhwZWN0CiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAogCiBMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gZ3VhdmEganNvbgogaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19KQVZBX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9saWJzL3dyYXBwZWRndGVzdC9BbmRyb2lkLm1rIGIvbGlicy93cmFwcGVkZ3Rlc3QvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg5YmE5ZC4uMDAwMDAwMAotLS0gYS9saWJzL3dyYXBwZWRndGVzdC9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotIyBDb3B5cmlnaHQgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfTU9EVUxFIDo9IGN0c3dyYXBwZWRndGVzdAotCi1pbmNsdWRlICQoQlVJTERfU1RBVElDX0pBVkFfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2xpYnMvd3JhcHBlZGd0ZXN0L3NyYy9XcmFwcGVkR1Rlc3RBY3Rpdml0eS5qYXZhIGIvbGlicy93cmFwcGVkZ3Rlc3Qvc3JjL1dyYXBwZWRHVGVzdEFjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MzNhNWIuLjAwMDAwMDAKLS0tIGEvbGlicy93cmFwcGVkZ3Rlc3Qvc3JjL1dyYXBwZWRHVGVzdEFjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQudGVzdC53cmFwcGVkZ3Rlc3Q7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKLWltcG9ydCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb247Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBXcmFwcGVkR1Rlc3RBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKLQotICAgIHByaXZhdGUgV3JhcHBlZEdUZXN0SW5zdHJ1bWVudGF0aW9uIG1JbnN0cnVtZW50YXRpb247Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbnN0cnVtZW50YXRpb24oV3JhcHBlZEdUZXN0SW5zdHJ1bWVudGF0aW9uIGluc3RydW1lbnRhdGlvbikgewotICAgICAgICBtSW5zdHJ1bWVudGF0aW9uID0gaW5zdHJ1bWVudGF0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgcnVuR1Rlc3RzKCkgewotICAgICAgICByZXR1cm4gcnVuVGVzdHModGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VuZFN0YXR1cyhTdHJpbmcgb3V0cHV0KSB7Ci0gICAgICAgIEJ1bmRsZSBvdXRwdXRCdW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgIG91dHB1dEJ1bmRsZS5wdXRTdHJpbmcoImd0ZXN0Iiwgb3V0cHV0KTsKLSAgICAgICAgbUluc3RydW1lbnRhdGlvbi5zZW5kU3RhdHVzKDEsIG91dHB1dEJ1bmRsZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBuYXRpdmUgaW50IHJ1blRlc3RzKFdyYXBwZWRHVGVzdEFjdGl2aXR5IGFjdGl2aXR5KTsKLX0KZGlmZiAtLWdpdCBhL2xpYnMvd3JhcHBlZGd0ZXN0L3NyYy9XcmFwcGVkR1Rlc3RJbnN0cnVtZW50YXRpb24uamF2YSBiL2xpYnMvd3JhcHBlZGd0ZXN0L3NyYy9XcmFwcGVkR1Rlc3RJbnN0cnVtZW50YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI5YWFhYi4uMDAwMDAwMAotLS0gYS9saWJzL3dyYXBwZWRndGVzdC9zcmMvV3JhcHBlZEdUZXN0SW5zdHJ1bWVudGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQudGVzdC53cmFwcGVkZ3Rlc3Q7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKLWltcG9ydCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb247Ci1pbXBvcnQgYW5kcm9pZC5hcHAuS2V5Z3VhcmRNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLQotcHVibGljIGNsYXNzIFdyYXBwZWRHVGVzdEluc3RydW1lbnRhdGlvbiBleHRlbmRzIEluc3RydW1lbnRhdGlvbiB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIldyYXBwZWRHVGVzdEluc3RydW1lbnRhdGlvbiI7Ci0gICAgcHJpdmF0ZSBXcmFwcGVkR1Rlc3RBY3Rpdml0eSBtQWN0aXZpdHk7Ci0gICAgcHJvdGVjdGVkIENsYXNzIG1BY3Rpdml0eUNsYXNzOwotCi0gICAgcHVibGljIFdyYXBwZWRHVGVzdEluc3RydW1lbnRhdGlvbigpIHsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgYXJndW1lbnRzKSB7Ci0gICAgICAgIC8vIGF0dGVtcHQgdG8gZGlzYWJsZSBrZXlndWFyZCwgIGlmIGN1cnJlbnQgdGVzdCBoYXMgcGVybWlzc2lvbiB0byBkbyBzbwotICAgICAgICBpZiAoZ2V0Q29udGV4dCgpLmNoZWNrQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkRJU0FCTEVfS0VZR1VBUkQpCi0gICAgICAgICAgICAgICAgPT0gUGFja2FnZU1hbmFnZXIuUEVSTUlTU0lPTl9HUkFOVEVEKSB7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICJEaXNhYmxpbmcga2V5Z3VhcmQiKTsKLSAgICAgICAgICAgIEtleWd1YXJkTWFuYWdlciBrZXlndWFyZE1hbmFnZXIgPQotICAgICAgICAgICAgICAgIChLZXlndWFyZE1hbmFnZXIpIGdldENvbnRleHQoKS5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuS0VZR1VBUkRfU0VSVklDRSk7Ci0gICAgICAgICAgICBrZXlndWFyZE1hbmFnZXIubmV3S2V5Z3VhcmRMb2NrKCJjdHMiKS5kaXNhYmxlS2V5Z3VhcmQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIlRlc3QgbGFja3MgcGVybWlzc2lvbiB0byBkaXNhYmxlIGtleWd1YXJkLiAiICsKLSAgICAgICAgICAgICAgICAgICAgIlVJIGJhc2VkIHRlc3RzIG1heSBmYWlsIGlmIGtleWd1YXJkIGlzIHVwIik7Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIub25DcmVhdGUoYXJndW1lbnRzKTsKLSAgICAgICAgc3RhcnQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblN0YXJ0KCkgewotICAgICAgICBzdXBlci5vblN0YXJ0KCk7Ci0KLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoZ2V0VGFyZ2V0Q29udGV4dCgpLCBtQWN0aXZpdHlDbGFzcyk7Ci0gICAgICAgIGludGVudC5zZXRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7Ci0KLSAgICAgICAgbUFjdGl2aXR5ID0gKFdyYXBwZWRHVGVzdEFjdGl2aXR5KXN0YXJ0QWN0aXZpdHlTeW5jKGludGVudCk7Ci0gICAgICAgIG1BY3Rpdml0eS5zZXRJbnN0cnVtZW50YXRpb24odGhpcyk7Ci0gICAgICAgIG1BY3Rpdml0eS5ydW5HVGVzdHMoKTsKLQotICAgICAgICBmaW5pc2goQWN0aXZpdHkuUkVTVUxUX09LLCBuZXcgQnVuZGxlKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3J1bl91bml0X3Rlc3RzLnNoIGIvcnVuX3VuaXRfdGVzdHMuc2gKaW5kZXggM2YyOTgzMi4uMzllODU3NSAxMDA3NTUKLS0tIGEvcnVuX3VuaXRfdGVzdHMuc2gKKysrIGIvcnVuX3VuaXRfdGVzdHMuc2gKQEAgLTY3LDkgKzY3LDkgQEAKIGVjaG8KIAogIyMjIyMjIyMjIyMjIyMjIFJ1biB0aGUgaG9zdCBzaWRlIHRlc3RzICMjIyMjIyMjIyMjIyMjIwotJHtDVFNfRElSfS9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3Rlc3RzL3J1bl90ZXN0cy5zaAotJHtDVFNfRElSfS9jb21tb24vaG9zdC1zaWRlL21hbmlmZXN0LWdlbmVyYXRvci90ZXN0cy9ydW5fdGVzdHMuc2gKLSR7Q1RTX0RJUn0vY29tbW9uL2hvc3Qtc2lkZS91dGlsL3Rlc3RzL3J1bl90ZXN0cy5zaAotJHtDVFNfRElSfS9jb21tb24vdXRpbC90ZXN0cy9ydW5fdGVzdHMuc2gKKyR7Q1RTX0RJUn0vLi4vdGVzdC9zdWl0ZV9oYXJuZXNzL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvdGVzdHMvcnVuX3Rlc3RzLnNoCiske0NUU19ESVJ9Ly4uL3Rlc3Qvc3VpdGVfaGFybmVzcy9jb21tb24vaG9zdC1zaWRlL21hbmlmZXN0LWdlbmVyYXRvci90ZXN0cy9ydW5fdGVzdHMuc2gKKyR7Q1RTX0RJUn0vLi4vdGVzdC9zdWl0ZV9oYXJuZXNzL2NvbW1vbi9ob3N0LXNpZGUvdXRpbC90ZXN0cy9ydW5fdGVzdHMuc2gKKyR7Q1RTX0RJUn0vLi4vdGVzdC9zdWl0ZV9oYXJuZXNzL2NvbW1vbi91dGlsL3Rlc3RzL3J1bl90ZXN0cy5zaAogCi0ke0NUU19ESVJ9L3Rvb2xzL2N0cy10cmFkZWZlZC90ZXN0cy9ydW5fdGVzdHMuc2gKKyR7Q1RTX0RJUn0vLi4vdGVzdC9zdWl0ZV9oYXJuZXNzL3Rvb2xzL2N0cy10cmFkZWZlZC90ZXN0cy9ydW5fdGVzdHMuc2gKZGlmZiAtLWdpdCBhL3N1aXRlL2F1ZGlvX3F1YWxpdHkvQW5kcm9pZC5tayBiL3N1aXRlL2F1ZGlvX3F1YWxpdHkvQW5kcm9pZC5tawppbmRleCBjMzQwNGQyLi45Y2Y1ZGM4IDEwMDY0NAotLS0gYS9zdWl0ZS9hdWRpb19xdWFsaXR5L0FuZHJvaWQubWsKKysrIGIvc3VpdGUvYXVkaW9fcXVhbGl0eS9BbmRyb2lkLm1rCkBAIC01MCw4ICs1MCw2IEBACiAKIGN0czogJChDVFNfQVVESU9fUVVBTElUWV9aSVApCiAKLWlmbmVxICgkKGZpbHRlciBjdHMsICQoTUFLRUNNREdPQUxTKSksKQogJChjYWxsIGRpc3QtZm9yLWdvYWxzLCBjdHMsICQoQ1RTX0FVRElPX1FVQUxJVFlfWklQKSkKLWVuZGlmICMgY3RzCiAKIGVuZGlmICMgbGludXgKZGlmZiAtLWdpdCBhL3N1aXRlL2F1ZGlvX3F1YWxpdHkvZXhlY3V0YWJsZS9BbmRyb2lkLmJwIGIvc3VpdGUvYXVkaW9fcXVhbGl0eS9leGVjdXRhYmxlL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhlY2QwMAotLS0gL2Rldi9udWxsCisrKyBiL3N1aXRlL2F1ZGlvX3F1YWxpdHkvZXhlY3V0YWJsZS9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDQgQEAKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy8vCisKK2NjX2JpbmFyeV9ob3N0IHsKKyAgICBuYW1lOiAiY3RzX2F1ZGlvX3F1YWxpdHkiLAorICAgIHNyY3M6IFsic3JjL21haW4uY3BwIl0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlidGlueWFsc2EiLAorICAgICAgICAibGlidGlueXhtbDIiLAorICAgIF0sCisgICAgd2hvbGVfc3RhdGljX2xpYnM6IFsibGliY3RzX2F1ZGlvX3F1YWxpdHkiXSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLWciLAorICAgICAgICAiLWZuby1leGNlcHRpb25zIiwKKyAgICBdLAorICAgIGxkZmxhZ3M6IFsKKyAgICAgICAgIi1nIiwKKyAgICAgICAgIi1mbm8tZXhjZXB0aW9ucyIsCisgICAgXSwKKyAgICBzdGw6ICJsaWJjKytfc3RhdGljIiwKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvc3VpdGUvYXVkaW9fcXVhbGl0eS9leGVjdXRhYmxlL0FuZHJvaWQubWsgYi9zdWl0ZS9hdWRpb19xdWFsaXR5L2V4ZWN1dGFibGUvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIyZDU0Mi4uMDAwMDAwMAotLS0gYS9zdWl0ZS9hdWRpb19xdWFsaXR5L2V4ZWN1dGFibGUvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1zdWJkaXItY3BwLWZpbGVzKQotTE9DQUxfQ19JTkNMVURFUyArPSAkKExPQ0FMX1BBVEgpLy4uL2xpYi9pbmNsdWRlICQoTE9DQUxfUEFUSCkvLi4vbGliL3NyYwotTE9DQUxfU1RBVElDX0xJQlJBUklFUyArPSBsaWJ1dGlscyBsaWJsb2cgbGliY3V0aWxzIGxpYnRpbnlhbHNhIGxpYnRpbnl4bWwyCi1MT0NBTF9XSE9MRV9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYmN0c19hdWRpb19xdWFsaXR5Ci1MT0NBTF9DRkxBR1M6PSAtZyAtZm5vLWV4Y2VwdGlvbnMKLUxPQ0FMX0xERkxBR1M6PSAtZyAtbHJ0IC1sZGwgLWxtIC1mbm8tZXhjZXB0aW9ucyAtbHB0aHJlYWQKLUxPQ0FMX0NYWF9TVEwgOj0gbGliYysrX3N0YXRpYwotTE9DQUxfTU9EVUxFX0hPU1RfT1MgOj0gbGludXgKLUxPQ0FMX01PRFVMRTo9IGN0c19hdWRpb19xdWFsaXR5Ci1pbmNsdWRlICQoQlVJTERfSE9TVF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvc3VpdGUvYXVkaW9fcXVhbGl0eS9saWIvQW5kcm9pZC5icCBiL3N1aXRlL2F1ZGlvX3F1YWxpdHkvbGliL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkwMDIyNwotLS0gL2Rldi9udWxsCisrKyBiL3N1aXRlL2F1ZGlvX3F1YWxpdHkvbGliL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw0OCBAQAorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8KKworY2NfbGlicmFyeV9ob3N0X3N0YXRpYyB7CisgICAgbmFtZTogImxpYmN0c19hdWRpb19xdWFsaXR5IiwKKyAgICBzcmNzOiBbIioqLyouY3BwIl0sCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgICAgICJzcmMiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ0aW55YWxzYSIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlidGlueXhtbDIiLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1nIiwKKyAgICAgICAgIi1mbm8tZXhjZXB0aW9ucyIsCisgICAgICAgICItV25vLXVudXNlZC1wYXJhbWV0ZXIiLAorICAgICAgICAiLVduby11bnVzZWQtdmFyaWFibGUiLAorICAgICAgICAiLVduby1mb3JtYXQiLAorICAgIF0sCisgICAgbGRmbGFnczogWworICAgICAgICAiLWZuby1leGNlcHRpb25zIiwKKyAgICBdLAorICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9zdWl0ZS9hdWRpb19xdWFsaXR5L2xpYi9BbmRyb2lkLm1rIGIvc3VpdGUvYXVkaW9fcXVhbGl0eS9saWIvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIzYzIyYS4uMDAwMDAwMAotLS0gYS9zdWl0ZS9hdWRpb19xdWFsaXR5L2xpYi9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLXN1YmRpci1jcHAtZmlsZXMpCi1MT0NBTF9DX0lOQ0xVREVTICs9ICQoTE9DQUxfUEFUSCkvaW5jbHVkZSAkKExPQ0FMX1BBVEgpL3NyYwotTE9DQUxfU1RBVElDX0xJQlJBUklFUyArPSBsaWJ1dGlscyBsaWJsb2cgbGlidGlueWFsc2EgbGliY3V0aWxzIGxpYnRpbnl4bWwyCi1MT0NBTF9DRkxBR1M6PSAtZyAtZm5vLWV4Y2VwdGlvbnMgLVduby11bnVzZWQtcGFyYW1ldGVyCi1MT0NBTF9MREZMQUdTOj0gLWcgLWxydCAtbGRsIC1sbSAtZm5vLWV4Y2VwdGlvbnMKLUxPQ0FMX01PRFVMRV9IT1NUX09TIDo9IGxpbnV4Ci1MT0NBTF9NT0RVTEU6PSBsaWJjdHNfYXVkaW9fcXVhbGl0eQotaW5jbHVkZSAkKEJVSUxEX0hPU1RfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9zdWl0ZS9hdWRpb19xdWFsaXR5L2xpYi9zcmMvdGFzay9Nb2RlbEJ1aWxkZXIuY3BwIGIvc3VpdGUvYXVkaW9fcXVhbGl0eS9saWIvc3JjL3Rhc2svTW9kZWxCdWlsZGVyLmNwcAppbmRleCA3OGU1MTM4Li5mMWE1MDZiIDEwMDY0NAotLS0gYS9zdWl0ZS9hdWRpb19xdWFsaXR5L2xpYi9zcmMvdGFzay9Nb2RlbEJ1aWxkZXIuY3BwCisrKyBiL3N1aXRlL2F1ZGlvX3F1YWxpdHkvbGliL3NyYy90YXNrL01vZGVsQnVpbGRlci5jcHAKQEAgLTg3LDcgKzg3LDcgQEAKIHsKICAgICBYTUxEb2N1bWVudCBkb2M7CiAgICAgaW50IGVycm9yID0gZG9jLkxvYWRGaWxlKHhtbEZpbGVOYW1lLnN0cmluZygpKTsKLSAgICBpZiAoZXJyb3IgIT0gWE1MX05PX0VSUk9SKSB7CisgICAgaWYgKGVycm9yICE9IFhNTF9TVUNDRVNTKSB7CiAgICAgICAgIExPR0UoIk1vZGVsQnVpbGRlcjo6cGFyc2VUZXN0RGVzY3JpcHRpb25YbWwgY2Fubm90IGxvYWQgZmlsZSAlczogJWQiLCB4bWxGaWxlTmFtZS5zdHJpbmcoKSwgZXJyb3IpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CmRpZmYgLS1naXQgYS9zdWl0ZS9hdWRpb19xdWFsaXR5L2xpYi9zcmMvdGFzay9UYXNrU2F2ZS5jcHAgYi9zdWl0ZS9hdWRpb19xdWFsaXR5L2xpYi9zcmMvdGFzay9UYXNrU2F2ZS5jcHAKaW5kZXggMThkZmI1ZS4uNjRhMTkyOCAxMDA2NDQKLS0tIGEvc3VpdGUvYXVkaW9fcXVhbGl0eS9saWIvc3JjL3Rhc2svVGFza1NhdmUuY3BwCisrKyBiL3N1aXRlL2F1ZGlvX3F1YWxpdHkvbGliL3NyYy90YXNrL1Rhc2tTYXZlLmNwcApAQCAtMTQsNiArMTQsNyBAQAogICogdGhlIExpY2Vuc2UuCiAgKi8KIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxlcnJuby5oPgpAQCAtMTI3LDcgKzEyOCw4IEBACiAgICAgICAgICAgICBpZiAoaXQtPnNlY29uZC5nZXRUeXBlKCkgPT0gVGFza0Nhc2U6OlZhbHVlOjpFVHlwZURvdWJsZSkgewogICAgICAgICAgICAgICAgIGRldGFpbHMuYXBwZW5kRm9ybWF0KCIgICAlczogJWZcbiIsIGl0LT5maXJzdC5zdHJpbmcoKSwgaXQtPnNlY29uZC5nZXREb3VibGUoKSk7CiAgICAgICAgICAgICB9IGVsc2UgeyAvLzY0Yml0IGludAotICAgICAgICAgICAgICAgIGRldGFpbHMuYXBwZW5kRm9ybWF0KCIgICAlczogJWxsZFxuIiwgaXQtPmZpcnN0LnN0cmluZygpLCBpdC0+c2Vjb25kLmdldEludDY0KCkpOworICAgICAgICAgICAgICAgIGRldGFpbHMuYXBwZW5kRm9ybWF0KCIgICAlczogJSIgUFJJZDY0ICJcbiIsIGl0LT5maXJzdC5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLmdldEludDY0KCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIE1TRygiJXMiLCBkZXRhaWxzLnN0cmluZygpKTsKZGlmZiAtLWdpdCBhL3N1aXRlL2F1ZGlvX3F1YWxpdHkvdGVzdC9BbmRyb2lkLmJwIGIvc3VpdGUvYXVkaW9fcXVhbGl0eS90ZXN0L0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzllNmVhZAotLS0gL2Rldi9udWxsCisrKyBiL3N1aXRlL2F1ZGlvX3F1YWxpdHkvdGVzdC9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNTIgQEAKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy8vCisKK2NjX3Rlc3RfaG9zdCB7CisgICAgbmFtZTogImN0c19hdWRpb19xdWFsaXR5X3Rlc3QiLAorICAgIHNyY3M6IFsiKi5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYnRpbnlhbHNhIiwKKyAgICAgICAgImxpYnRpbnl4bWwyIiwKKyAgICBdLAorCisgICAgLy8gbmVlZCB0byBrZWVwIGV2ZXJ5dGhpbmcgaW4gbGliY3RzXy4uIE90aGVyd2lzZSwgbGlua2VyIHdpbGwgZHJvcCBzb21lCisgICAgLy8gZnVuY3Rpb25zIGFuZCBsaW5rZXIgZXJyb3IgaGFwcGVucworICAgIHdob2xlX3N0YXRpY19saWJzOiBbImxpYmN0c19hdWRpb19xdWFsaXR5Il0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1nIiwKKyAgICAgICAgIi1mbm8tZXhjZXB0aW9ucyIsCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1Xbm8tdW51c2VkLXBhcmFtZXRlciIsCisgICAgICAgICItV25vLXVudXNlZC12YXJpYWJsZSIsCisgICAgXSwKKyAgICBsZGZsYWdzOiBbCisgICAgICAgICItZyIsCisgICAgICAgICItZm5vLWV4Y2VwdGlvbnMiLAorICAgIF0sCisgICAgc3RsOiAibGliYysrX3N0YXRpYyIsCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKKyAgICBjb21waWxlX211bHRpbGliOiAiZmlyc3QiLAorfQpkaWZmIC0tZ2l0IGEvc3VpdGUvYXVkaW9fcXVhbGl0eS90ZXN0L0FuZHJvaWQubWsgYi9zdWl0ZS9hdWRpb19xdWFsaXR5L3Rlc3QvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhmZTEzYy4uMDAwMDAwMAotLS0gYS9zdWl0ZS9hdWRpb19xdWFsaXR5L3Rlc3QvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1zdWJkaXItY3BwLWZpbGVzKQotCi0jJChpbmZvICQoTE9DQUxfU1JDX0ZJTEVTKSkKLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgICQoTE9DQUxfUEFUSCkvLi4vbGliL2luY2x1ZGUgXAotICAgICQoTE9DQUxfUEFUSCkvLi4vbGliL3NyYyBcCi0KLUxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAotICAgIGxpYnV0aWxzIFwKLSAgICBsaWJsb2cgXAotICAgIGxpYmN1dGlscyBcCi0gICAgbGlidGlueWFsc2EgXAotICAgIGxpYnRpbnl4bWwyIFwKLQotIyBuZWVkIHRvIGtlZXAgZXZlcnl0aGluZyBpbiBsaWJjdHNfLi4gT3RoZXJ3aXNlLCBsaW5rZXIgd2lsbCBkcm9wIHNvbWUKLSMgZnVuY3Rpb25zIGFuZCBsaW5rZXIgZXJyb3IgaGFwcGVucwotTE9DQUxfV0hPTEVfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJjdHNfYXVkaW9fcXVhbGl0eQotTE9DQUxfQ0ZMQUdTOj0gLWcgLWZuby1leGNlcHRpb25zIC1Xbm8tdW51c2VkLXBhcmFtZXRlcgotTE9DQUxfTERGTEFHUzo9IC1nIC1scnQgLWxkbCAtbG0gLWZuby1leGNlcHRpb25zIC1scHRocmVhZAotTE9DQUxfQ1hYX1NUTCA6PSBsaWJjKytfc3RhdGljCi1MT0NBTF9NT0RVTEVfSE9TVF9PUyA6PSBsaW51eAotTE9DQUxfTU9EVUxFIDo9IGN0c19hdWRpb19xdWFsaXR5X3Rlc3QKLUxPQ0FMX01VTFRJTElCIDo9IGZpcnN0Ci1pbmNsdWRlICQoQlVJTERfSE9TVF9OQVRJVkVfVEVTVCkKZGlmZiAtLWdpdCBhL3Rlc3RzL0FsYXJtTWFuYWdlci9BbmRyb2lkLm1rIGIvdGVzdHMvQWxhcm1NYW5hZ2VyL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTI3Y2M1ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0FsYXJtTWFuYWdlci9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzggQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworIyBEb24ndCBpbmNsdWRlIHRoaXMgcGFja2FnZSBpbiBhbnkgdGFyZ2V0LgorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworIyBXaGVuIGJ1aWx0LCBleHBsaWNpdGx5IHB1dCBpdCBpbiB0aGUgZGF0YSBwYXJ0aXRpb24uCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQorCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gdWItdWlhdXRvbWF0b3IgYW5kcm9pZHgudGVzdC5ydWxlcyBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dAorCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCitMT0NBTF9TUkNfRklMRVMgKz0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBhcHAvc3JjKQorCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzQWxhcm1NYW5hZ2VyVGVzdENhc2VzCisKK0xPQ0FMX1BSSVZBVEVfUExBVEZPUk1fQVBJUyA6PSB0cnVlCisKK2luY2x1ZGUgJChCVUlMRF9DVFNfUEFDS0FHRSkKKworaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwgJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL3Rlc3RzL0FsYXJtTWFuYWdlci9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvQWxhcm1NYW5hZ2VyL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAzOTVjMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0FsYXJtTWFuYWdlci9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgICAgcGFja2FnZT0iYW5kcm9pZC5hbGFybW1hbmFnZXIuY3RzIiA+CisKKyAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpsYWJlbD0iQ3RzIEFsYXJtIE1hbmFnZXIgVGVzdCI+CisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIi8+CisgICAgPC9hcHBsaWNhdGlvbj4KKworICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmZ1bmN0aW9uYWxUZXN0PSJ0cnVlIgorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmFsYXJtbWFuYWdlci5jdHMiCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJBbGFybSBNYW5hZ2VyIFRlc3RzIi8+Cis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvQWxhcm1NYW5hZ2VyL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL0FsYXJtTWFuYWdlci9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThjODk1NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0FsYXJtTWFuYWdlci9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwzMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIEFsYXJtIE1hbmFnZXIgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KKyAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImZyYW1ld29yayIgLz4KKworICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJDdHNBbGFybU1hbmFnZXJUZXN0Q2FzZXMuYXBrIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQWxhcm1UZXN0QXBwLmFwayIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKworICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5BbmRyb2lkSlVuaXRUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0icGFja2FnZSIgdmFsdWU9ImFuZHJvaWQuYWxhcm1tYW5hZ2VyLmN0cyIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJydW50aW1lLWhpbnQiIHZhbHVlPSIxbSIgLz4KKyAgICA8L3Rlc3Q+CisKKzwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL0FsYXJtTWFuYWdlci9hcHAvQW5kcm9pZC5tayBiL3Rlc3RzL0FsYXJtTWFuYWdlci9hcHAvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjAyM2U5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvQWxhcm1NYW5hZ2VyL2FwcC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzMgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKKworTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBBbGFybVRlc3RBcHAKKworTE9DQUxfREVYX1BSRU9QVCA6PSBmYWxzZQorCitpbmNsdWRlICQoQlVJTERfQ1RTX1NVUFBPUlRfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL3Rlc3RzL0FsYXJtTWFuYWdlci9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL0FsYXJtTWFuYWdlci9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWIwNGI2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvQWxhcm1NYW5hZ2VyL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIHBhY2thZ2U9ImFuZHJvaWQuYWxhcm1tYW5hZ2VyLmFsYXJtdGVzdGFwcC5jdHMiPgorCisgICAgPGFwcGxpY2F0aW9uPgorICAgICAgICA8cmVjZWl2ZXIgYW5kcm9pZDpuYW1lPSIuVGVzdEFsYXJtU2NoZWR1bGVyIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIgLz4KKyAgICAgICAgPHJlY2VpdmVyIGFuZHJvaWQ6bmFtZT0iLlRlc3RBbGFybVJlY2VpdmVyIiAvPgorICAgIDwvYXBwbGljYXRpb24+CisKKzwvbWFuaWZlc3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvQWxhcm1NYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9hbGFybW1hbmFnZXIvYWxhcm10ZXN0YXBwL2N0cy9UZXN0QWxhcm1SZWNlaXZlci5qYXZhIGIvdGVzdHMvQWxhcm1NYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9hbGFybW1hbmFnZXIvYWxhcm10ZXN0YXBwL2N0cy9UZXN0QWxhcm1SZWNlaXZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ZWE2Y2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9BbGFybU1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL2FsYXJtbWFuYWdlci9hbGFybXRlc3RhcHAvY3RzL1Rlc3RBbGFybVJlY2VpdmVyLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hbGFybW1hbmFnZXIuYWxhcm10ZXN0YXBwLmN0czsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK3B1YmxpYyBjbGFzcyBUZXN0QWxhcm1SZWNlaXZlciBleHRlbmRzIEJyb2FkY2FzdFJlY2VpdmVyeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBUZXN0QWxhcm1SZWNlaXZlci5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0VfTkFNRSA9ICJhbmRyb2lkLmFsYXJtbWFuYWdlci5hbGFybXRlc3RhcHAuY3RzIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fUkVQT1JUX0FMQVJNX0VYUElSRUQgPSBQQUNLQUdFX05BTUUgKyAiLmFjdGlvbi5BTEFSTV9FWFBJUkVEIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9BTEFSTV9DT1VOVCA9IFBBQ0tBR0VfTkFNRSArICIuZXh0cmEuQUxBUk1fQ09VTlQiOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBpbnRlbnQuZ2V0SW50RXh0cmEoSW50ZW50LkVYVFJBX0FMQVJNX0NPVU5ULCAxKTsKKyAgICAgICAgTG9nLmQoVEFHLCAiQWxhcm0gZXhwaXJlZCAiICsgY291bnQgKyAiIHRpbWVzIik7CisgICAgICAgIGZpbmFsIEludGVudCByZXBvcnRBbGFybUludGVudCA9IG5ldyBJbnRlbnQoQUNUSU9OX1JFUE9SVF9BTEFSTV9FWFBJUkVEKTsKKyAgICAgICAgcmVwb3J0QWxhcm1JbnRlbnQucHV0RXh0cmEoRVhUUkFfQUxBUk1fQ09VTlQsIGNvdW50KTsKKyAgICAgICAgcmVwb3J0QWxhcm1JbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfUkVDRUlWRVJfUkVHSVNURVJFRF9PTkxZKTsKKyAgICAgICAgcmVwb3J0QWxhcm1JbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfUkVDRUlWRVJfRk9SRUdST1VORCk7CisgICAgICAgIGNvbnRleHQuc2VuZEJyb2FkY2FzdChyZXBvcnRBbGFybUludGVudCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvQWxhcm1NYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9hbGFybW1hbmFnZXIvYWxhcm10ZXN0YXBwL2N0cy9UZXN0QWxhcm1TY2hlZHVsZXIuamF2YSBiL3Rlc3RzL0FsYXJtTWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvYWxhcm1tYW5hZ2VyL2FsYXJtdGVzdGFwcC9jdHMvVGVzdEFsYXJtU2NoZWR1bGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU3NjNiZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0FsYXJtTWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvYWxhcm1tYW5hZ2VyL2FsYXJtdGVzdGFwcC9jdHMvVGVzdEFsYXJtU2NoZWR1bGVyLmphdmEKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hbGFybW1hbmFnZXIuYWxhcm10ZXN0YXBwLmN0czsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFsYXJtTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKy8qKgorICogVGhpcyByZWNlaXZlciBpcyB0byBiZSB1c2VkIHRvIHNjaGVkdWxlIGFsYXJtcyBhcyBwYXJ0IG9mIHRlc3RzIGluCisgKiB7QGxpbmsgYW5kcm9pZC5hbGFybW1hbmFnZXIuY3RzfQorICovCitwdWJsaWMgY2xhc3MgVGVzdEFsYXJtU2NoZWR1bGVyIGV4dGVuZHMgQnJvYWRjYXN0UmVjZWl2ZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBUZXN0QWxhcm1TY2hlZHVsZXIuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFX05BTUUgPSAiYW5kcm9pZC5hbGFybW1hbmFnZXIuYWxhcm10ZXN0YXBwLmN0cyI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fU0VUX0FMQVJNID0gUEFDS0FHRV9OQU1FICsgIi5hY3Rpb24uU0VUX0FMQVJNIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9UUklHR0VSX1RJTUUgPSBQQUNLQUdFX05BTUUgKyAiLmV4dHJhLlRSSUdHRVJfVElNRSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfUkVQRUFUX0lOVEVSVkFMID0gUEFDS0FHRV9OQU1FICsgIi5leHRyYS5SRVBFQVRfSU5URVJWQUwiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1RZUEUgPSBQQUNLQUdFX05BTUUgKyAiLmV4dHJhLlRZUEUiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0FMTE9XX1dISUxFX0lETEUgPSBQQUNLQUdFX05BTUUgKyAiLmV4dHJhLkFMTE9XX1dISUxFX0lETEUiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TRVRfQUxBUk1fQ0xPQ0sgPSBQQUNLQUdFX05BTUUgKyAiLmFjdGlvbi5TRVRfQUxBUk1fQ0xPQ0siOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0FMQVJNX0NMT0NLX0lORk8gPSBQQUNLQUdFX05BTUUgKyAiLmV4dHJhLkFMQVJNX0NMT0NLX0lORk8iOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9DQU5DRUxfQUxMX0FMQVJNUyA9IFBBQ0tBR0VfTkFNRSArICIuYWN0aW9uLkNBTkNFTF9BTEFSTVMiOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICBmaW5hbCBBbGFybU1hbmFnZXIgYW0gPSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQWxhcm1NYW5hZ2VyLmNsYXNzKTsKKyAgICAgICAgZmluYWwgSW50ZW50IHJlY2VpdmVySW50ZW50ID0gbmV3IEludGVudChjb250ZXh0LCBUZXN0QWxhcm1SZWNlaXZlci5jbGFzcyk7CisgICAgICAgIHJlY2VpdmVySW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX1JFQ0VJVkVSX0ZPUkVHUk9VTkQpOworICAgICAgICBmaW5hbCBQZW5kaW5nSW50ZW50IGFsYXJtQ2xvY2tTZW5kZXIgPQorICAgICAgICAgICAgICAgIFBlbmRpbmdJbnRlbnQuZ2V0QnJvYWRjYXN0KGNvbnRleHQsIDAsIHJlY2VpdmVySW50ZW50LCAwKTsKKyAgICAgICAgZmluYWwgUGVuZGluZ0ludGVudCBhbGFybVNlbmRlciA9IFBlbmRpbmdJbnRlbnQuZ2V0QnJvYWRjYXN0KGNvbnRleHQsIDEsIHJlY2VpdmVySW50ZW50LCAwKTsKKyAgICAgICAgc3dpdGNoIChpbnRlbnQuZ2V0QWN0aW9uKCkpIHsKKyAgICAgICAgICAgIGNhc2UgQUNUSU9OX1NFVF9BTEFSTV9DTE9DSzoKKyAgICAgICAgICAgICAgICBpZiAoIWludGVudC5oYXNFeHRyYShFWFRSQV9BTEFSTV9DTE9DS19JTkZPKSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJObyBhbGFybSBjbG9jayBzdXBwbGllZCIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmluYWwgQWxhcm1NYW5hZ2VyLkFsYXJtQ2xvY2tJbmZvIGFsYXJtQ2xvY2tJbmZvID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVudC5nZXRQYXJjZWxhYmxlRXh0cmEoRVhUUkFfQUxBUk1fQ0xPQ0tfSU5GTyk7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU2V0dGluZyBhbGFybSBjbG9jayAiICsgYWxhcm1DbG9ja0luZm8pOworICAgICAgICAgICAgICAgIGFtLnNldEFsYXJtQ2xvY2soYWxhcm1DbG9ja0luZm8sIGFsYXJtQ2xvY2tTZW5kZXIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBQ1RJT05fU0VUX0FMQVJNOgorICAgICAgICAgICAgICAgIGlmICghaW50ZW50Lmhhc0V4dHJhKEVYVFJBX1RZUEUpIHx8ICFpbnRlbnQuaGFzRXh0cmEoRVhUUkFfVFJJR0dFUl9USU1FKSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJBbGFybSB0eXBlIG9yIHRyaWdnZXIgdGltZSBub3Qgc3VwcGxpZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbmFsIGludCB0eXBlID0gaW50ZW50LmdldEludEV4dHJhKEVYVFJBX1RZUEUsIDApOworICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgdHJpZ2dlclRpbWUgPSBpbnRlbnQuZ2V0TG9uZ0V4dHJhKEVYVFJBX1RSSUdHRVJfVElNRSwgMCk7CisgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBpbnRlcnZhbCA9IGludGVudC5nZXRMb25nRXh0cmEoRVhUUkFfUkVQRUFUX0lOVEVSVkFMLCAwKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGFsbG93V2hpbGVJZGxlID0gaW50ZW50LmdldEJvb2xlYW5FeHRyYShFWFRSQV9BTExPV19XSElMRV9JRExFLAorICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlNldHRpbmcgYWxhcm06IHR5cGU9IiArIHR5cGUgKyAiLCB0cmlnZ2VyVGltZT0iICsgdHJpZ2dlclRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgaW50ZXJ2YWw9IiArIGludGVydmFsICsgIiwgYWxsb3dXaGlsZUlkbGU9IiArIGFsbG93V2hpbGVJZGxlKTsKKyAgICAgICAgICAgICAgICBpZiAoaW50ZXJ2YWwgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGFtLnNldFJlcGVhdGluZyh0eXBlLCB0cmlnZ2VyVGltZSwgaW50ZXJ2YWwsIGFsYXJtU2VuZGVyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFsbG93V2hpbGVJZGxlKSB7CisgICAgICAgICAgICAgICAgICAgIGFtLnNldEV4YWN0QW5kQWxsb3dXaGlsZUlkbGUodHlwZSwgdHJpZ2dlclRpbWUsIGFsYXJtU2VuZGVyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhbS5zZXRFeGFjdCh0eXBlLCB0cmlnZ2VyVGltZSwgYWxhcm1TZW5kZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQUNUSU9OX0NBTkNFTF9BTExfQUxBUk1TOgorICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkNhbmNlbGxpbmcgYWxsIGFsYXJtcyIpOworICAgICAgICAgICAgICAgIGFtLmNhbmNlbChhbGFybUNsb2NrU2VuZGVyKTsKKyAgICAgICAgICAgICAgICBhbS5jYW5jZWwoYWxhcm1TZW5kZXIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJVbnNwZWNpZmllZCBhY3Rpb24gIiArIGludGVudC5nZXRBY3Rpb24oKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvQWxhcm1NYW5hZ2VyL3NyYy9hbmRyb2lkL2FsYXJtbWFuYWdlci9jdHMvQXBwU3RhbmRieVRlc3RzLmphdmEgYi90ZXN0cy9BbGFybU1hbmFnZXIvc3JjL2FuZHJvaWQvYWxhcm1tYW5hZ2VyL2N0cy9BcHBTdGFuZGJ5VGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODM4NDkyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvQWxhcm1NYW5hZ2VyL3NyYy9hbmRyb2lkL2FsYXJtbWFuYWdlci9jdHMvQXBwU3RhbmRieVRlc3RzLmphdmEKQEAgLTAsMCArMSwzMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYWxhcm1tYW5hZ2VyLmN0czsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5BbGFybU1hbmFnZXIuRUxBUFNFRF9SRUFMVElNRV9XQUtFVVA7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzdW1lLmFzc3VtZVRydWU7CisKK2ltcG9ydCBhbmRyb2lkLmFsYXJtbWFuYWdlci5hbGFybXRlc3RhcHAuY3RzLlRlc3RBbGFybVJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuYWxhcm1tYW5hZ2VyLmFsYXJtdGVzdGFwcC5jdHMuVGVzdEFsYXJtU2NoZWR1bGVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CYXR0ZXJ5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLlVpRGV2aWNlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5MYXJnZVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQXBwU3RhbmRieVV0aWxzOworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5BZnRlckNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CisKKy8qKgorICogVGVzdHMgdGhhdCBhcHAgc3RhbmRieSBpbXBvc2VzIHRoZSBhcHByb3ByaWF0ZSByZXN0cmljdGlvbnMgb24gYWxhcm1zCisgKi8KK0BMYXJnZVRlc3QKK0BSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgQXBwU3RhbmRieVRlc3RzIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gQXBwU3RhbmRieVRlc3RzLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9BUFBfUEFDS0FHRSA9ICJhbmRyb2lkLmFsYXJtbWFuYWdlci5hbGFybXRlc3RhcHAuY3RzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9BUFBfUkVDRUlWRVIgPSBURVNUX0FQUF9QQUNLQUdFICsgIi5UZXN0QWxhcm1TY2hlZHVsZXIiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBERUZBVUxUX1dBSVQgPSA0XzAwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFBPTExfSU5URVJWQUwgPSAyMDA7CisKKyAgICAvLyBUd2Vha2VkIGFsYXJtIG1hbmFnZXIgY29uc3RhbnRzIHRvIGZhY2lsaXRhdGUgdGVzdGluZworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgQUxMT1dfV0hJTEVfSURMRV9TSE9SVF9USU1FID0gMTVfMDAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgTUlOX0ZVVFVSSVRZID0gMl8wMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIEFQUF9TVEFOREJZX0RFTEFZUyA9IHswLCAxMF8wMDAsIDIwXzAwMCwgMzBfMDAwLCA2MDBfMDAwfTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBBUFBfQlVDS0VUX1RBR1MgPSB7CisgICAgICAgICAgICAiYWN0aXZlIiwKKyAgICAgICAgICAgICJ3b3JraW5nX3NldCIsCisgICAgICAgICAgICAiZnJlcXVlbnQiLAorICAgICAgICAgICAgInJhcmUiLAorICAgICAgICAgICAgIm5ldmVyIgorICAgIH07CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gQVBQX0JVQ0tFVF9LRVlTID0geworICAgICAgICAgICAgInN0YW5kYnlfYWN0aXZlX2RlbGF5IiwKKyAgICAgICAgICAgICJzdGFuZGJ5X3dvcmtpbmdfZGVsYXkiLAorICAgICAgICAgICAgInN0YW5kYnlfZnJlcXVlbnRfZGVsYXkiLAorICAgICAgICAgICAgInN0YW5kYnlfcmFyZV9kZWxheSIsCisgICAgICAgICAgICAic3RhbmRieV9uZXZlcl9kZWxheSIsCisgICAgfTsKKworICAgIC8vIFNhdmUgdGhlIHN0YXRlIGJlZm9yZSBydW5uaW5nIHRlc3RzIHRvIHJlc3RvcmUgaXQgYWZ0ZXIgd2UgZmluaXNoIHRlc3RpbmcuCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzT3JpZ0FwcFN0YW5kYnlFbmFibGVkOworCisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgQ29tcG9uZW50TmFtZSBtQWxhcm1TY2hlZHVsZXI7CisgICAgcHJpdmF0ZSBVaURldmljZSBtVWlEZXZpY2U7CisgICAgcHJpdmF0ZSBBdG9taWNJbnRlZ2VyIG1BbGFybUNvdW50OworICAgIHByaXZhdGUgdm9sYXRpbGUgbG9uZyBtTGFzdEFsYXJtVGltZTsKKworICAgIHByaXZhdGUgZmluYWwgQnJvYWRjYXN0UmVjZWl2ZXIgbUFsYXJtU3RhdGVSZWNlaXZlciA9IG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgICAgIG1BbGFybUNvdW50LmdldEFuZEFkZChpbnRlbnQuZ2V0SW50RXh0cmEoVGVzdEFsYXJtUmVjZWl2ZXIuRVhUUkFfQUxBUk1fQ09VTlQsIDEpKTsKKyAgICAgICAgICAgIG1MYXN0QWxhcm1UaW1lID0gU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCk7CisgICAgICAgICAgICBMb2cuZChUQUcsICJOby4gb2YgZXhwaXJhdGlvbnM6ICIgKyBtQWxhcm1Db3VudAorICAgICAgICAgICAgICAgICAgICArICIgZWxhcHNlZDogIiArIFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBAQmVmb3JlQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXBUZXN0cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzT3JpZ0FwcFN0YW5kYnlFbmFibGVkID0gQXBwU3RhbmRieVV0aWxzLmlzQXBwU3RhbmRieUVuYWJsZWRBdFJ1bnRpbWUoKTsKKyAgICAgICAgaWYgKCFzT3JpZ0FwcFN0YW5kYnlFbmFibGVkKSB7CisgICAgICAgICAgICBBcHBTdGFuZGJ5VXRpbHMuc2V0QXBwU3RhbmRieUVuYWJsZWRBdFJ1bnRpbWUodHJ1ZSk7CisKKyAgICAgICAgICAgIC8vIEdpdmUgc3lzdGVtIHNvbWV0aW1lIHRvIGluaXRpYWxpemUgaXRzZWxmLgorICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbUNvbnRleHQgPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRUYXJnZXRDb250ZXh0KCk7CisgICAgICAgIG1VaURldmljZSA9IFVpRGV2aWNlLmdldEluc3RhbmNlKEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpKTsKKyAgICAgICAgbUFsYXJtU2NoZWR1bGVyID0gbmV3IENvbXBvbmVudE5hbWUoVEVTVF9BUFBfUEFDS0FHRSwgVEVTVF9BUFBfUkVDRUlWRVIpOworICAgICAgICBtQWxhcm1Db3VudCA9IG5ldyBBdG9taWNJbnRlZ2VyKDApOworICAgICAgICB1cGRhdGVBbGFybU1hbmFnZXJDb25zdGFudHMoKTsKKyAgICAgICAgc2V0QmF0dGVyeUNoYXJnaW5nKGZhbHNlKTsKKyAgICAgICAgZmluYWwgSW50ZW50RmlsdGVyIGludGVudEZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKKyAgICAgICAgaW50ZW50RmlsdGVyLmFkZEFjdGlvbihUZXN0QWxhcm1SZWNlaXZlci5BQ1RJT05fUkVQT1JUX0FMQVJNX0VYUElSRUQpOworICAgICAgICBtQ29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG1BbGFybVN0YXRlUmVjZWl2ZXIsIGludGVudEZpbHRlcik7CisgICAgICAgIGFzc3VtZVRydWUoIkFwcCBTdGFuZGJ5IG5vdCBlbmFibGVkIG9uIGRldmljZSIsIEFwcFN0YW5kYnlVdGlscy5pc0FwcFN0YW5kYnlFbmFibGVkKCkpOworICAgICAgICBzZXRBcHBTdGFuZGJ5QnVja2V0KCJhY3RpdmUiKTsKKyAgICAgICAgc2NoZWR1bGVBbGFybShTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKSwgZmFsc2UsIDApOworICAgICAgICBUaHJlYWQuc2xlZXAoTUlOX0ZVVFVSSVRZKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiQWxhcm0gbm90IHNlbnQgd2hlbiBhcHAgaW4gYWN0aXZlIiwgd2FpdEZvckFsYXJtcygxKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNjaGVkdWxlQWxhcm0obG9uZyB0cmlnZ2VyTWlsbGlzLCBib29sZWFuIGFsbG93V2hpbGVJZGxlLCBsb25nIGludGVydmFsKSB7CisgICAgICAgIGZpbmFsIEludGVudCBzZXRBbGFybUludGVudCA9IG5ldyBJbnRlbnQoVGVzdEFsYXJtU2NoZWR1bGVyLkFDVElPTl9TRVRfQUxBUk0pOworICAgICAgICBzZXRBbGFybUludGVudC5zZXRDb21wb25lbnQobUFsYXJtU2NoZWR1bGVyKTsKKyAgICAgICAgc2V0QWxhcm1JbnRlbnQucHV0RXh0cmEoVGVzdEFsYXJtU2NoZWR1bGVyLkVYVFJBX1RZUEUsIEVMQVBTRURfUkVBTFRJTUVfV0FLRVVQKTsKKyAgICAgICAgc2V0QWxhcm1JbnRlbnQucHV0RXh0cmEoVGVzdEFsYXJtU2NoZWR1bGVyLkVYVFJBX1RSSUdHRVJfVElNRSwgdHJpZ2dlck1pbGxpcyk7CisgICAgICAgIHNldEFsYXJtSW50ZW50LnB1dEV4dHJhKFRlc3RBbGFybVNjaGVkdWxlci5FWFRSQV9SRVBFQVRfSU5URVJWQUwsIGludGVydmFsKTsKKyAgICAgICAgc2V0QWxhcm1JbnRlbnQucHV0RXh0cmEoVGVzdEFsYXJtU2NoZWR1bGVyLkVYVFJBX0FMTE9XX1dISUxFX0lETEUsIGFsbG93V2hpbGVJZGxlKTsKKyAgICAgICAgc2V0QWxhcm1JbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfUkVDRUlWRVJfRk9SRUdST1VORCk7CisgICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3Qoc2V0QWxhcm1JbnRlbnQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0QnVja2V0RGVsYXkoaW50IGJ1Y2tldEluZGV4KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc2V0QXBwU3RhbmRieUJ1Y2tldChBUFBfQlVDS0VUX1RBR1NbYnVja2V0SW5kZXhdKTsKKyAgICAgICAgZmluYWwgbG9uZyB0cmlnZ2VyVGltZSA9IFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpICsgTUlOX0ZVVFVSSVRZOworICAgICAgICBmaW5hbCBsb25nIG1pblRyaWdnZXJUaW1lID0gbUxhc3RBbGFybVRpbWUgKyBBUFBfU1RBTkRCWV9ERUxBWVNbYnVja2V0SW5kZXhdOworICAgICAgICBzY2hlZHVsZUFsYXJtKHRyaWdnZXJUaW1lLCBmYWxzZSwgMCk7CisgICAgICAgIFRocmVhZC5zbGVlcChNSU5fRlVUVVJJVFkpOworICAgICAgICBpZiAodHJpZ2dlclRpbWUgKyBERUZBVUxUX1dBSVQgPCBtaW5UcmlnZ2VyVGltZSkgeworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoIkFsYXJtIHdlbnQgb2ZmIGJlZm9yZSAiICsgQVBQX0JVQ0tFVF9UQUdTW2J1Y2tldEluZGV4XSArICIgZGVsYXkiLAorICAgICAgICAgICAgICAgICAgICB3YWl0Rm9yQWxhcm1zKDEpKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChtaW5UcmlnZ2VyVGltZSAtIFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKCJEZWZlcnJlZCBhbGFybSBkaWQgbm90IGdvIG9mZiBhZnRlciAiICsgQVBQX0JVQ0tFVF9UQUdTW2J1Y2tldEluZGV4XSArICIgZGVsYXkiLAorICAgICAgICAgICAgICAgIHdhaXRGb3JBbGFybXMoMSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdvcmtpbmdTZXREZWxheSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0QnVja2V0RGVsYXkoMSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RnJlcXVlbnREZWxheSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0QnVja2V0RGVsYXkoMik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmFyZURlbGF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RCdWNrZXREZWxheSgzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCdWNrZXRVcGdyYWRlVG9TbWFsbGVyRGVsYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc2V0QXBwU3RhbmRieUJ1Y2tldChBUFBfQlVDS0VUX1RBR1NbMl0pOworICAgICAgICBmaW5hbCBsb25nIHRyaWdnZXJUaW1lID0gU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCkgKyBNSU5fRlVUVVJJVFk7CisgICAgICAgIGZpbmFsIGxvbmcgd29ya2luZ1NldEV4cGVjdGVkVHJpZ2dlciA9IG1MYXN0QWxhcm1UaW1lICsgQVBQX1NUQU5EQllfREVMQVlTWzFdOworICAgICAgICBzY2hlZHVsZUFsYXJtKHRyaWdnZXJUaW1lLCBmYWxzZSwgMCk7CisgICAgICAgIFRocmVhZC5zbGVlcCh3b3JraW5nU2V0RXhwZWN0ZWRUcmlnZ2VyIC0gU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCkpOworICAgICAgICBhc3NlcnRGYWxzZSgiVGhlIGFsYXJtIHdlbnQgb2ZmIGJlZm9yZSBmcmVxdWVudCBkZWxheSIsIHdhaXRGb3JBbGFybXMoMSkpOworICAgICAgICBzZXRBcHBTdGFuZGJ5QnVja2V0KEFQUF9CVUNLRVRfVEFHU1sxXSk7CisgICAgICAgIGFzc2VydFRydWUoIlRoZSBhbGFybSBkaWQgbm90IGdvIG9mZiB3aGVuIGFwcCBidWNrZXQgdXBncmFkZWQgdG8gd29ya2luZ19zZXQiLAorICAgICAgICAgICAgICAgIHdhaXRGb3JBbGFybXMoMSkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhpcyBpcyBkaWZmZXJlbnQgdG8ge0BsaW5rICN0ZXN0QnVja2V0VXBncmFkZVRvU21hbGxlckRlbGF5KCl9IGluIHRoZSBzZW5zZSB0aGF0IHRoZSBidWNrZXQKKyAgICAgKiB1cGdyYWRlIHNoaWZ0cyBlbGlnaWJpbGl0eSB0byBhIHBvaW50IGVhcmxpZXIgdGhhbiB3aGVuIHRoZSBhbGFybSBpcyBzY2hlZHVsZWQgZm9yLgorICAgICAqIFRoZSBhbGFybSBtdXN0IHRoZW4gZ28gb2ZmIGFzIHNvb24gYXMgcG9zc2libGUgLSBhdCBlaXRoZXIgdGhlIHNjaGVkdWxlZCB0aW1lIG9yIHRoZSBidWNrZXQKKyAgICAgKiBjaGFuZ2UsIHdoaWNoZXZlciBoYXBwZW5lZCBsYXRlci4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCdWNrZXRVcGdyYWRlVG9Ob0RlbGF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHNldEFwcFN0YW5kYnlCdWNrZXQoQVBQX0JVQ0tFVF9UQUdTWzNdKTsKKyAgICAgICAgZmluYWwgbG9uZyB0cmlnZ2VyVGltZTEgPSBtTGFzdEFsYXJtVGltZSArIEFQUF9TVEFOREJZX0RFTEFZU1syXTsKKyAgICAgICAgc2NoZWR1bGVBbGFybSh0cmlnZ2VyVGltZTEsIGZhbHNlLCAwKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKHRyaWdnZXJUaW1lMSAtIFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSBhbGFybSB3ZW50IG9mZiBhZnRlciBmcmVxdWVudCBkZWxheSB3aGVuIGFwcCBpbiByYXJlIGJ1Y2tldCIsCisgICAgICAgICAgICAgICAgd2FpdEZvckFsYXJtcygxKSk7CisgICAgICAgIHNldEFwcFN0YW5kYnlCdWNrZXQoQVBQX0JVQ0tFVF9UQUdTWzFdKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGFsYXJtIGRpZCBub3QgZ28gb2ZmIHdoZW4gYXBwIGJ1Y2tldCB1cGdyYWRlZCB0byB3b3JraW5nX3NldCIsCisgICAgICAgICAgICAgICAgd2FpdEZvckFsYXJtcygxKSk7CisKKyAgICAgICAgLy8gT25jZSBtb3JlCisgICAgICAgIHNldEFwcFN0YW5kYnlCdWNrZXQoQVBQX0JVQ0tFVF9UQUdTWzNdKTsKKyAgICAgICAgZmluYWwgbG9uZyB0cmlnZ2VyVGltZTIgPSBtTGFzdEFsYXJtVGltZSArIEFQUF9TVEFOREJZX0RFTEFZU1syXTsKKyAgICAgICAgc2NoZWR1bGVBbGFybSh0cmlnZ2VyVGltZTIsIGZhbHNlLCAwKTsKKyAgICAgICAgc2V0QXBwU3RhbmRieUJ1Y2tldChBUFBfQlVDS0VUX1RBR1NbMF0pOworICAgICAgICBUaHJlYWQuc2xlZXAodHJpZ2dlclRpbWUyIC0gU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCkpOworICAgICAgICBhc3NlcnRUcnVlKCJUaGUgYWxhcm0gZGlkIG5vdCBnbyBvZmYgYXMgc2NoZWR1bGVkIHdoZW4gdGhlIGFwcCB3YXMgaW4gYWN0aXZlIiwKKyAgICAgICAgICAgICAgICB3YWl0Rm9yQWxhcm1zKDEpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBbGxvd1doaWxlSWRsZUFsYXJtcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBsb25nIGZpcnN0VHJpZ2dlciA9IFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpICsgTUlOX0ZVVFVSSVRZOworICAgICAgICBzY2hlZHVsZUFsYXJtKGZpcnN0VHJpZ2dlciwgdHJ1ZSwgMCk7CisgICAgICAgIFRocmVhZC5zbGVlcChNSU5fRlVUVVJJVFkpOworICAgICAgICBhc3NlcnRUcnVlKCJmaXJzdCBhbGxvd193aGlsZV9pZGxlIGFsYXJtIGRpZCBub3QgZ28gb2ZmIGFzIHNjaGVkdWxlZCIsIHdhaXRGb3JBbGFybXMoMSkpOworICAgICAgICBzY2hlZHVsZUFsYXJtKG1MYXN0QWxhcm1UaW1lICsgOV8wMDAsIHRydWUsIDApOworICAgICAgICAvLyBGaXJzdCBjaGVjayBmb3IgdGhlIGNhc2Ugd2hlcmUgYWxsb3dfd2hpbGVfaWRsZSBkZWxheSBzaG91bGQgc3VwZXJzZWRlIGFwcCBzdGFuZGJ5CisgICAgICAgIHNldEFwcFN0YW5kYnlCdWNrZXQoQVBQX0JVQ0tFVF9UQUdTWzFdKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKEFQUF9TVEFOREJZX0RFTEFZU1sxXSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJhbGxvd193aGlsZV9pZGxlIGFsYXJtIHdlbnQgb2ZmIGJlZm9yZSBzaG9ydCB0aW1lIiwgd2FpdEZvckFsYXJtcygxKSk7CisgICAgICAgIGxvbmcgZXhwZWN0ZWRUcmlnZ2VyVGltZSA9IG1MYXN0QWxhcm1UaW1lICsgQUxMT1dfV0hJTEVfSURMRV9TSE9SVF9USU1FOworICAgICAgICBUaHJlYWQuc2xlZXAoZXhwZWN0ZWRUcmlnZ2VyVGltZSAtIFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiYWxsb3dfd2hpbGVfaWRsZSBhbGFybSBkaWQgbm90IGdvIG9mZiBhZnRlciBzaG9ydCB0aW1lIiwgd2FpdEZvckFsYXJtcygxKSk7CisKKyAgICAgICAgLy8gTm93IHRoZSBvdGhlciBjYXNlLCBhcHAgc3RhbmRieSBkZWxheSBzdXBlcnNlZGVzIHRoZSBhbGxvd193aGlsZV9pZGxlIGRlbGF5CisgICAgICAgIHNjaGVkdWxlQWxhcm0obUxhc3RBbGFybVRpbWUgKyAxMl8wMDAsIHRydWUsIDApOworICAgICAgICBzZXRBcHBTdGFuZGJ5QnVja2V0KEFQUF9CVUNLRVRfVEFHU1syXSk7CisgICAgICAgIFRocmVhZC5zbGVlcChBTExPV19XSElMRV9JRExFX1NIT1JUX1RJTUUpOworICAgICAgICBhc3NlcnRGYWxzZSgiYWxsb3dfd2hpbGVfaWRsZSBhbGFybSB3ZW50IG9mZiBiZWZvcmUgIiArIEFQUF9TVEFOREJZX0RFTEFZU1syXQorICAgICAgICAgICAgICAgICsgIm1zLCB3aGVuIGluIGJ1Y2tldCAiICsgQVBQX0JVQ0tFVF9UQUdTWzJdLCB3YWl0Rm9yQWxhcm1zKDEpKTsKKyAgICAgICAgZXhwZWN0ZWRUcmlnZ2VyVGltZSA9IG1MYXN0QWxhcm1UaW1lICsgQVBQX1NUQU5EQllfREVMQVlTWzJdOworICAgICAgICBUaHJlYWQuc2xlZXAoZXhwZWN0ZWRUcmlnZ2VyVGltZSAtIFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiYWxsb3dfd2hpbGVfaWRsZSBhbGFybSBkaWQgbm90IGdvIG9mZiBldmVuIGFmdGVyICIgKyBBUFBfU1RBTkRCWV9ERUxBWVNbMl0KKyAgICAgICAgICAgICAgICArICJtcywgd2hlbiBpbiBidWNrZXQgIiArIEFQUF9CVUNLRVRfVEFHU1syXSwgd2FpdEZvckFsYXJtcygxKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG93ZXJXaGl0ZWxpc3RlZEFsYXJtTm90QmxvY2tlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzZXRBcHBTdGFuZGJ5QnVja2V0KEFQUF9CVUNLRVRfVEFHU1szXSk7CisgICAgICAgIHNldFBvd2VyV2hpdGVsaXN0ZWQodHJ1ZSk7CisgICAgICAgIGZpbmFsIGxvbmcgdHJpZ2dlclRpbWUgPSBTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKSArIE1JTl9GVVRVUklUWTsKKyAgICAgICAgc2NoZWR1bGVBbGFybSh0cmlnZ2VyVGltZSwgZmFsc2UsIDApOworICAgICAgICBUaHJlYWQuc2xlZXAoTUlOX0ZVVFVSSVRZKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiQWxhcm0gZGlkIG5vdCBnbyBvZmYgZm9yIHdoaXRlbGlzdGVkIGFwcCBpbiByYXJlIGJ1Y2tldCIsIHdhaXRGb3JBbGFybXMoMSkpOworICAgICAgICBzZXRQb3dlcldoaXRlbGlzdGVkKGZhbHNlKTsKKyAgICB9CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzZXRQb3dlcldoaXRlbGlzdGVkKGZhbHNlKTsKKyAgICAgICAgc2V0QmF0dGVyeUNoYXJnaW5nKHRydWUpOworICAgICAgICBkZWxldGVBbGFybU1hbmFnZXJDb25zdGFudHMoKTsKKyAgICAgICAgZmluYWwgSW50ZW50IGNhbmNlbEFsYXJtc0ludGVudCA9IG5ldyBJbnRlbnQoVGVzdEFsYXJtU2NoZWR1bGVyLkFDVElPTl9DQU5DRUxfQUxMX0FMQVJNUyk7CisgICAgICAgIGNhbmNlbEFsYXJtc0ludGVudC5zZXRDb21wb25lbnQobUFsYXJtU2NoZWR1bGVyKTsKKyAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChjYW5jZWxBbGFybXNJbnRlbnQpOworICAgICAgICBtQ29udGV4dC51bnJlZ2lzdGVyUmVjZWl2ZXIobUFsYXJtU3RhdGVSZWNlaXZlcik7CisgICAgICAgIC8vIEJyb2FkY2FzdCB1bnJlZ2lzdGVyIG1heSByYWNlIHdpdGggdGhlIG5leHQgcmVnaXN0ZXIgaW4gc2V0VXAKKyAgICAgICAgVGhyZWFkLnNsZWVwKDUwMCk7CisgICAgfQorCisgICAgQEFmdGVyQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVhckRvd25UZXN0cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIXNPcmlnQXBwU3RhbmRieUVuYWJsZWQpIHsKKyAgICAgICAgICAgIEFwcFN0YW5kYnlVdGlscy5zZXRBcHBTdGFuZGJ5RW5hYmxlZEF0UnVudGltZShzT3JpZ0FwcFN0YW5kYnlFbmFibGVkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVBbGFybU1hbmFnZXJDb25zdGFudHMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmdCdWZmZXIgY21kID0gbmV3IFN0cmluZ0J1ZmZlcigic2V0dGluZ3MgcHV0IGdsb2JhbCBhbGFybV9tYW5hZ2VyX2NvbnN0YW50cyAiKTsKKyAgICAgICAgY21kLmFwcGVuZCgibWluX2Z1dHVyaXR5PSIpOyBjbWQuYXBwZW5kKE1JTl9GVVRVUklUWSk7CisgICAgICAgIGNtZC5hcHBlbmQoIixhbGxvd193aGlsZV9pZGxlX3Nob3J0X3RpbWU9Iik7IGNtZC5hcHBlbmQoQUxMT1dfV0hJTEVfSURMRV9TSE9SVF9USU1FKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBBUFBfU1RBTkRCWV9ERUxBWVMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGNtZC5hcHBlbmQoIiwiKTsKKyAgICAgICAgICAgIGNtZC5hcHBlbmQoQVBQX0JVQ0tFVF9LRVlTW2ldKTsgY21kLmFwcGVuZCgiPSIpOyBjbWQuYXBwZW5kKEFQUF9TVEFOREJZX0RFTEFZU1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgZXhlY3V0ZUFuZExvZyhjbWQudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldFBvd2VyV2hpdGVsaXN0ZWQoYm9vbGVhbiB3aGl0ZWxpc3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZ0J1ZmZlciBjbWQgPSBuZXcgU3RyaW5nQnVmZmVyKCJjbWQgZGV2aWNlaWRsZSB3aGl0ZWxpc3QgIik7CisgICAgICAgIGNtZC5hcHBlbmQod2hpdGVsaXN0ID8gIisiIDogIi0iKTsKKyAgICAgICAgY21kLmFwcGVuZChURVNUX0FQUF9QQUNLQUdFKTsKKyAgICAgICAgZXhlY3V0ZUFuZExvZyhjbWQudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRlbGV0ZUFsYXJtTWFuYWdlckNvbnN0YW50cygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVBbmRMb2coInNldHRpbmdzIGRlbGV0ZSBnbG9iYWwgYWxhcm1fbWFuYWdlcl9jb25zdGFudHMiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0QXBwU3RhbmRieUJ1Y2tldChTdHJpbmcgYnVja2V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBleGVjdXRlQW5kTG9nKCJhbSBzZXQtc3RhbmRieS1idWNrZXQgIiArIFRFU1RfQVBQX1BBQ0tBR0UgKyAiICIgKyBidWNrZXQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRCYXR0ZXJ5Q2hhcmdpbmcoZmluYWwgYm9vbGVhbiBjaGFyZ2luZykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEJhdHRlcnlNYW5hZ2VyIGJtID0gbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShCYXR0ZXJ5TWFuYWdlci5jbGFzcyk7CisgICAgICAgIGlmIChjaGFyZ2luZykgeworICAgICAgICAgICAgZXhlY3V0ZUFuZExvZygiZHVtcHN5cyBiYXR0ZXJ5IHJlc2V0Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBleGVjdXRlQW5kTG9nKCJkdW1wc3lzIGJhdHRlcnkgdW5wbHVnIik7CisgICAgICAgICAgICBleGVjdXRlQW5kTG9nKCJkdW1wc3lzIGJhdHRlcnkgc2V0IHN0YXR1cyAiICsKKyAgICAgICAgICAgICAgICAgICAgQmF0dGVyeU1hbmFnZXIuQkFUVEVSWV9TVEFUVVNfRElTQ0hBUkdJTkcpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQmF0dGVyeSBjb3VsZCBub3QgYmUgdW5wbHVnZ2VkIiwgd2FpdFVudGlsKCgpIC0+ICFibS5pc0NoYXJnaW5nKCksIDVfMDAwKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBleGVjdXRlQW5kTG9nKFN0cmluZyBjbWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBvdXRwdXQgPSBtVWlEZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZChjbWQpLnRyaW0oKTsKKyAgICAgICAgTG9nLmQoVEFHLCAiY29tbWFuZDogWyIgKyBjbWQgKyAiXSwgb3V0cHV0OiBbIiArIG91dHB1dCArICJdIik7CisgICAgICAgIHJldHVybiBvdXRwdXQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHdhaXRGb3JBbGFybXMoZmluYWwgaW50IG51bUFsYXJtcykgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBzdWNjZXNzID0gd2FpdFVudGlsKCgpIC0+IChtQWxhcm1Db3VudC5nZXQoKSA9PSBudW1BbGFybXMpLCBERUZBVUxUX1dBSVQpOworICAgICAgICBtQWxhcm1Db3VudC5zZXQoMCk7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiB3YWl0VW50aWwoQ29uZGl0aW9uIGNvbmRpdGlvbiwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBsb25nIGRlYWRMaW5lID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkgKyB0aW1lb3V0OworICAgICAgICB3aGlsZSAoIWNvbmRpdGlvbi5pc01ldCgpICYmIFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpIDwgZGVhZExpbmUpIHsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChQT0xMX0lOVEVSVkFMKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29uZGl0aW9uLmlzTWV0KCk7CisgICAgfQorCisgICAgQEZ1bmN0aW9uYWxJbnRlcmZhY2UKKyAgICBpbnRlcmZhY2UgQ29uZGl0aW9uIHsKKyAgICAgICAgYm9vbGVhbiBpc01ldCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0FsYXJtTWFuYWdlci9zcmMvYW5kcm9pZC9hbGFybW1hbmFnZXIvY3RzL0JhY2tncm91bmRSZXN0cmljdGVkQWxhcm1zVGVzdC5qYXZhIGIvdGVzdHMvQWxhcm1NYW5hZ2VyL3NyYy9hbmRyb2lkL2FsYXJtbWFuYWdlci9jdHMvQmFja2dyb3VuZFJlc3RyaWN0ZWRBbGFybXNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg1ZWMxOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0FsYXJtTWFuYWdlci9zcmMvYW5kcm9pZC9hbGFybW1hbmFnZXIvY3RzL0JhY2tncm91bmRSZXN0cmljdGVkQWxhcm1zVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFsYXJtbWFuYWdlci5jdHM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgYW5kcm9pZC5hbGFybW1hbmFnZXIuYWxhcm10ZXN0YXBwLmN0cy5UZXN0QWxhcm1SZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLmFsYXJtbWFuYWdlci5hbGFybXRlc3RhcHAuY3RzLlRlc3RBbGFybVNjaGVkdWxlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BbGFybU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLlVpRGV2aWNlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5MYXJnZVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogVGVzdHMgdGhhdCBhcHBzIHB1dCBpbiBmb3JjZWQgYXBwIHN0YW5kYnkgYnkgdGhlIHVzZXIgZG8gbm90IGdldCB0byBydW4gYWxhcm1zIHdoaWxlIGluIHRoZQorICogYmFja2dyb3VuZAorICovCitATGFyZ2VUZXN0CitAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIEJhY2tncm91bmRSZXN0cmljdGVkQWxhcm1zVGVzdCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IEJhY2tncm91bmRSZXN0cmljdGVkQWxhcm1zVGVzdC5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQVBQX1BBQ0tBR0UgPSAiYW5kcm9pZC5hbGFybW1hbmFnZXIuYWxhcm10ZXN0YXBwLmN0cyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQVBQX1JFQ0VJVkVSID0gVEVTVF9BUFBfUEFDS0FHRSArICIuVGVzdEFsYXJtU2NoZWR1bGVyIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQX09QX1JVTl9BTllfSU5fQkFDS0dST1VORCA9ICJSVU5fQU5ZX0lOX0JBQ0tHUk9VTkQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBfT1BfTU9ERV9BTExPV0VEID0gImFsbG93IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQX09QX01PREVfSUdOT1JFRCA9ICJpZ25vcmUiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBERUZBVUxUX1dBSVQgPSAxXzAwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFBPTExfSU5URVJWQUwgPSAyMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBNSU5fUkVQRUFUSU5HX0lOVEVSVkFMID0gMTBfMDAwOworCisgICAgcHJpdmF0ZSBPYmplY3QgbUxvY2sgPSBuZXcgT2JqZWN0KCk7CisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgQ29tcG9uZW50TmFtZSBtQWxhcm1TY2hlZHVsZXI7CisgICAgcHJpdmF0ZSBVaURldmljZSBtVWlEZXZpY2U7CisgICAgcHJpdmF0ZSBpbnQgbUFsYXJtQ291bnQ7CisKKyAgICBwcml2YXRlIGZpbmFsIEJyb2FkY2FzdFJlY2VpdmVyIG1BbGFybVN0YXRlUmVjZWl2ZXIgPSBuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJSZWNlaXZlZCBhY3Rpb24gIiArIGludGVudC5nZXRBY3Rpb24oKQorICAgICAgICAgICAgICAgICAgICArICIgZWxhcHNlZDogIiArIFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpKTsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgICAgICBtQWxhcm1Db3VudCA9IGludGVudC5nZXRJbnRFeHRyYShUZXN0QWxhcm1SZWNlaXZlci5FWFRSQV9BTEFSTV9DT1VOVCwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1Db250ZXh0ID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0VGFyZ2V0Q29udGV4dCgpOworICAgICAgICBtVWlEZXZpY2UgPSBVaURldmljZS5nZXRJbnN0YW5jZShJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKSk7CisgICAgICAgIG1BbGFybVNjaGVkdWxlciA9IG5ldyBDb21wb25lbnROYW1lKFRFU1RfQVBQX1BBQ0tBR0UsIFRFU1RfQVBQX1JFQ0VJVkVSKTsKKyAgICAgICAgbUFsYXJtQ291bnQgPSAwOworICAgICAgICB1cGRhdGVBbGFybU1hbmFnZXJDb25zdGFudHMoKTsKKyAgICAgICAgc2V0QXBwT3BzTW9kZShBUFBfT1BfTU9ERV9JR05PUkVEKTsKKyAgICAgICAgZmluYWwgSW50ZW50RmlsdGVyIGludGVudEZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKKyAgICAgICAgaW50ZW50RmlsdGVyLmFkZEFjdGlvbihUZXN0QWxhcm1SZWNlaXZlci5BQ1RJT05fUkVQT1JUX0FMQVJNX0VYUElSRUQpOworICAgICAgICBtQ29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG1BbGFybVN0YXRlUmVjZWl2ZXIsIGludGVudEZpbHRlcik7CisgICAgICAgIHNldEFwcFN0YW5kYnlCdWNrZXQoImFjdGl2ZSIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzY2hlZHVsZUFsYXJtKGludCB0eXBlLCBsb25nIHRyaWdnZXJNaWxsaXMsIGxvbmcgaW50ZXJ2YWwpIHsKKyAgICAgICAgZmluYWwgSW50ZW50IHNldEFsYXJtSW50ZW50ID0gbmV3IEludGVudChUZXN0QWxhcm1TY2hlZHVsZXIuQUNUSU9OX1NFVF9BTEFSTSk7CisgICAgICAgIHNldEFsYXJtSW50ZW50LnNldENvbXBvbmVudChtQWxhcm1TY2hlZHVsZXIpOworICAgICAgICBzZXRBbGFybUludGVudC5wdXRFeHRyYShUZXN0QWxhcm1TY2hlZHVsZXIuRVhUUkFfVFlQRSwgdHlwZSk7CisgICAgICAgIHNldEFsYXJtSW50ZW50LnB1dEV4dHJhKFRlc3RBbGFybVNjaGVkdWxlci5FWFRSQV9UUklHR0VSX1RJTUUsIHRyaWdnZXJNaWxsaXMpOworICAgICAgICBzZXRBbGFybUludGVudC5wdXRFeHRyYShUZXN0QWxhcm1TY2hlZHVsZXIuRVhUUkFfUkVQRUFUX0lOVEVSVkFMLCBpbnRlcnZhbCk7CisgICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3Qoc2V0QWxhcm1JbnRlbnQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzY2hlZHVsZUFsYXJtQ2xvY2sobG9uZyB0cmlnZ2VyUlRDKSB7CisgICAgICAgIEFsYXJtTWFuYWdlci5BbGFybUNsb2NrSW5mbyBhbGFybUluZm8gPSBuZXcgQWxhcm1NYW5hZ2VyLkFsYXJtQ2xvY2tJbmZvKHRyaWdnZXJSVEMsIG51bGwpOworCisgICAgICAgIGZpbmFsIEludGVudCBzZXRBbGFybUNsb2NrSW50ZW50ID0gbmV3IEludGVudChUZXN0QWxhcm1TY2hlZHVsZXIuQUNUSU9OX1NFVF9BTEFSTV9DTE9DSyk7CisgICAgICAgIHNldEFsYXJtQ2xvY2tJbnRlbnQuc2V0Q29tcG9uZW50KG1BbGFybVNjaGVkdWxlcik7CisgICAgICAgIHNldEFsYXJtQ2xvY2tJbnRlbnQucHV0RXh0cmEoVGVzdEFsYXJtU2NoZWR1bGVyLkVYVFJBX0FMQVJNX0NMT0NLX0lORk8sIGFsYXJtSW5mbyk7CisgICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3Qoc2V0QWxhcm1DbG9ja0ludGVudCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldE1pbkV4cGVjdGVkRXhwaXJhdGlvbnMobG9uZyBub3csIGxvbmcgc3RhcnQsIGxvbmcgaW50ZXJ2YWwpIHsKKyAgICAgICAgaWYgKG5vdyAtIHN0YXJ0IDw9IDEwMDApIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiAxICsgKGludCkoKG5vdyAtIHN0YXJ0IC0gMTAwMCkvaW50ZXJ2YWwpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcGVhdGluZ0FsYXJtQmxvY2tlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBsb25nIGludGVydmFsID0gTUlOX1JFUEVBVElOR19JTlRFUlZBTDsKKyAgICAgICAgZmluYWwgbG9uZyB0cmlnZ2VyRWxhcHNlZCA9IFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpICsgaW50ZXJ2YWw7CisgICAgICAgIHNjaGVkdWxlQWxhcm0oQWxhcm1NYW5hZ2VyLkVMQVBTRURfUkVBTFRJTUVfV0FLRVVQLCB0cmlnZ2VyRWxhcHNlZCwgaW50ZXJ2YWwpOworICAgICAgICBUaHJlYWQuc2xlZXAoREVGQVVMVF9XQUlUKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKDIgKiBpbnRlcnZhbCk7CisgICAgICAgIGFzc2VydEZhbHNlKCJBbGFybSBnb3QgdHJpZ2dlcmVkIGV2ZW4gdW5kZXIgcmVzdHJpY3Rpb25zIiwgd2FpdEZvckFsYXJtcygxLCBERUZBVUxUX1dBSVQpKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKGludGVydmFsKTsKKyAgICAgICAgc2V0QXBwT3BzTW9kZShBUFBfT1BfTU9ERV9BTExPV0VEKTsKKyAgICAgICAgLy8gVGhlIGFsYXJtIGlzIGR1ZSB0byBnbyBvZmYgYWJvdXQgMyB0aW1lcyBieSBub3cuIEFkZGluZyBzb21lIHRvbGVyYW5jZSBqdXN0IGluIGNhc2UKKyAgICAgICAgLy8gYW4gZXhwaXJhdGlvbiBpcyBkdWUgcmlnaHQgYWJvdXQgbm93LgorICAgICAgICBmaW5hbCBpbnQgbWluQ291bnQgPSBnZXRNaW5FeHBlY3RlZEV4cGlyYXRpb25zKFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpLAorICAgICAgICAgICAgICAgIHRyaWdnZXJFbGFwc2VkLCBpbnRlcnZhbCk7CisgICAgICAgIGFzc2VydFRydWUoIkFsYXJtIHNob3VsZCBoYXZlIGV4cGlyZWQgYXQgbGVhc3QgIiArIG1pbkNvdW50CisgICAgICAgICAgICAgICAgKyAiIHRpbWVzIHdoZW4gcmVzdHJpY3Rpb25zIHdlcmUgbGlmdGVkIiwgd2FpdEZvckFsYXJtcyhtaW5Db3VudCwgREVGQVVMVF9XQUlUKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWxhcm1DbG9ja05vdEJsb2NrZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgbG9uZyBub3dSVEMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgZmluYWwgbG9uZyB3YWl0SW50ZXJ2YWwgPSAxMF8wMDA7CisgICAgICAgIGZpbmFsIGxvbmcgdHJpZ2dlclJUQyA9IG5vd1JUQyArIHdhaXRJbnRlcnZhbDsKKyAgICAgICAgc2NoZWR1bGVBbGFybUNsb2NrKHRyaWdnZXJSVEMpOworICAgICAgICBUaHJlYWQuc2xlZXAod2FpdEludGVydmFsKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiQWxhcm1DbG9jayBkaWQgbm90IGdvIG9mZiBhcyBzY2hlZHVsZWQgd2hlbiB1bmRlciByZXN0cmljdGlvbnMiLAorICAgICAgICAgICAgICAgIHdhaXRGb3JBbGFybXMoMSwgREVGQVVMVF9XQUlUKSk7CisgICAgfQorCisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZGVsZXRlQWxhcm1NYW5hZ2VyQ29uc3RhbnRzKCk7CisgICAgICAgIHNldEFwcE9wc01vZGUoQVBQX09QX01PREVfQUxMT1dFRCk7CisgICAgICAgIC8vIENhbmNlbCBhbnkgbGVmdG92ZXIgYWxhcm1zCisgICAgICAgIGZpbmFsIEludGVudCBjYW5jZWxBbGFybXNJbnRlbnQgPSBuZXcgSW50ZW50KFRlc3RBbGFybVNjaGVkdWxlci5BQ1RJT05fQ0FOQ0VMX0FMTF9BTEFSTVMpOworICAgICAgICBjYW5jZWxBbGFybXNJbnRlbnQuc2V0Q29tcG9uZW50KG1BbGFybVNjaGVkdWxlcik7CisgICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3QoY2FuY2VsQWxhcm1zSW50ZW50KTsKKyAgICAgICAgbUNvbnRleHQudW5yZWdpc3RlclJlY2VpdmVyKG1BbGFybVN0YXRlUmVjZWl2ZXIpOworICAgICAgICAvLyBCcm9hZGNhc3QgdW5yZWdpc3RlciBtYXkgcmFjZSB3aXRoIHRoZSBuZXh0IHJlZ2lzdGVyIGluIHNldFVwCisgICAgICAgIFRocmVhZC5zbGVlcChERUZBVUxUX1dBSVQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVBbGFybU1hbmFnZXJDb25zdGFudHMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgY21kID0gInNldHRpbmdzIHB1dCBnbG9iYWwgYWxhcm1fbWFuYWdlcl9jb25zdGFudHMgbWluX2ludGVydmFsPSIKKyAgICAgICAgICAgICAgICArIE1JTl9SRVBFQVRJTkdfSU5URVJWQUw7CisgICAgICAgIG1VaURldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKGNtZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRlbGV0ZUFsYXJtTWFuYWdlckNvbnN0YW50cygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG1VaURldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKCJzZXR0aW5ncyBkZWxldGUgZ2xvYmFsIGFsYXJtX21hbmFnZXJfY29uc3RhbnRzIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldEFwcFN0YW5kYnlCdWNrZXQoU3RyaW5nIGJ1Y2tldCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgbVVpRGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoImFtIHNldC1zdGFuZGJ5LWJ1Y2tldCAiICsgVEVTVF9BUFBfUEFDS0FHRSArICIgIiArIGJ1Y2tldCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldEFwcE9wc01vZGUoU3RyaW5nIG1vZGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgY29tbWFuZEJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigiYXBwb3BzIHNldCAiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoVEVTVF9BUFBfUEFDS0FHRSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCIgIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKEFQUF9PUF9SVU5fQU5ZX0lOX0JBQ0tHUk9VTkQpCisgICAgICAgICAgICAgICAgLmFwcGVuZCgiICIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChtb2RlKTsKKyAgICAgICAgbVVpRGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoY29tbWFuZEJ1aWxkZXIudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHdhaXRGb3JBbGFybXMoaW50IGV4cGVjdGVkQWxhcm1zLCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIGxvbmcgZGVhZExpbmUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSArIHRpbWVvdXQ7CisgICAgICAgIGludCBhbGFybUNvdW50OworICAgICAgICBkbyB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoUE9MTF9JTlRFUlZBTCk7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICAgICAgYWxhcm1Db3VudCA9IG1BbGFybUNvdW50OworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlIChhbGFybUNvdW50IDwgZXhwZWN0ZWRBbGFybXMgJiYgU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkgPCBkZWFkTGluZSk7CisgICAgICAgIHJldHVybiBhbGFybUNvdW50ID49IGV4cGVjdGVkQWxhcm1zOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0pvYlNjaGVkdWxlci9BbmRyb2lkLm1rIGIvdGVzdHMvSm9iU2NoZWR1bGVyL0FuZHJvaWQubWsKaW5kZXggZTU4YTQ5NC4uMTE2ZDc0ZiAxMDA3NTUKLS0tIGEvdGVzdHMvSm9iU2NoZWR1bGVyL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvSm9iU2NoZWR1bGVyL0FuZHJvaWQubWsKQEAgLTIyLDkgKzIyLDEyIEBACiAjIFdoZW4gYnVpbHQsIGV4cGxpY2l0bHkgcHV0IGl0IGluIHRoZSBkYXRhIHBhcnRpdGlvbi4KIExPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCiAKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsIGN0c3Rlc3RydW5uZXIgdWItdWlhdXRvbWF0b3IKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCB1Yi11aWF1dG9tYXRvciBhbmRyb2lkeC50ZXN0LnJ1bGVzCisKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKK0xPQ0FMX1NSQ19GSUxFUyArPSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIEpvYlRlc3RBcHAvc3JjKQogCiAjIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0CiBMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cwpAQCAtMzIsNyArMzUsOCBAQAogIyBNdXN0IG1hdGNoIHRoZSBwYWNrYWdlIG5hbWUgaW4gQ3RzVGVzdENhc2VMaXN0Lm1rCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzSm9iU2NoZWR1bGVyVGVzdENhc2VzCiAKLUxPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKKyNMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CitMT0NBTF9QUklWQVRFX1BMQVRGT1JNX0FQSVMgOj0gdHJ1ZQogCiBpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCiAKZGlmZiAtLWdpdCBhL3Rlc3RzL0pvYlNjaGVkdWxlci9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvSm9iU2NoZWR1bGVyL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggZTQzMzI1Mi4uZGIwYjZiYiAxMDA3NTUKLS0tIGEvdGVzdHMvSm9iU2NoZWR1bGVyL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvSm9iU2NoZWR1bGVyL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTE3LDcgKzE3LDcgQEAKIAogPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKICAgICBwYWNrYWdlPSJhbmRyb2lkLmpvYnNjaGVkdWxlci5jdHMiCi0gICAgYW5kcm9pZDpzaGFyZWRVc2VySWQ9ImFuZHJvaWQuam9ic2NoZWR1bGVyLmN0cy5zaGFyZWQudWlkIj4KKyAgICBhbmRyb2lkOnRhcmdldFNhbmRib3hWZXJzaW9uPSIyIj4KICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkRJU0FCTEVfS0VZR1VBUkQiIC8+CiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5BQ0NFU1NfTkVUV09SS19TVEFURSIgLz4KICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkFDQ0VTU19XSUZJX1NUQVRFIiAvPgpAQCAtMjUsNiArMjUsNyBAQAogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQ0hBTkdFX1dJRklfU1RBVEUiIC8+CiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX0VYVEVSTkFMX1NUT1JBR0UiIC8+CiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9FWFRFUk5BTF9TVE9SQUdFIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uV1JJVEVfU0VDVVJFX1NFVFRJTkdTIiAvPgogCiAgICAgPGFwcGxpY2F0aW9uPgogICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KQEAgLTQwLDExICs0MSw4IEBACiAKICAgICA8IS0tICBzZWxmLWluc3RydW1lbnRpbmcgdGVzdCBwYWNrYWdlLiAtLT4KICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkpvYlNjaGVkdWxlciBkZXZpY2Utc2lkZSB0ZXN0cyIKICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmpvYnNjaGVkdWxlci5jdHMiID4KLSAgICAgICAgPG1ldGEtZGF0YQotICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJsaXN0ZW5lciIKLSAgICAgICAgICAgIGFuZHJvaWQ6dmFsdWU9ImNvbS5hbmRyb2lkLmN0cy5ydW5uZXIuQ3RzVGVzdFJ1bkxpc3RlbmVyIiAvPgogICAgIDwvaW5zdHJ1bWVudGF0aW9uPgogPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL0pvYlNjaGVkdWxlci9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy9Kb2JTY2hlZHVsZXIvQW5kcm9pZFRlc3QueG1sCmluZGV4IDg1NWFkNDguLjQ4MjBhYTIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0pvYlNjaGVkdWxlci9BbmRyb2lkVGVzdC54bWwKKysrIGIvdGVzdHMvSm9iU2NoZWR1bGVyL0FuZHJvaWRUZXN0LnhtbApAQCAtMTQsMTIgKzE0LDEyIEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgSm9iIFNjaGVkdWxlciB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iZnJhbWV3b3JrIiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJDdHNKb2JTY2hlZHVsZXJUZXN0Q2FzZXMuYXBrIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzSm9iU2NoZWR1bGVySm9iUGVybS5hcGsiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJDdHNKb2JTY2hlZHVsZXJTaGFyZWRVaWQuYXBrIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzSm9iVGVzdEFwcC5hcGsiIC8+CiAgICAgPC90YXJnZXRfcHJlcGFyZXI+CiAgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkFuZHJvaWRKVW5pdFRlc3QiID4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJwYWNrYWdlIiB2YWx1ZT0iYW5kcm9pZC5qb2JzY2hlZHVsZXIuY3RzIiAvPgpkaWZmIC0tZ2l0IGEvdGVzdHMvSm9iU2NoZWR1bGVyL0pvYlRlc3RBcHAvQW5kcm9pZC5tayBiL3Rlc3RzL0pvYlNjaGVkdWxlci9Kb2JUZXN0QXBwL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFmNzExNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0pvYlNjaGVkdWxlci9Kb2JUZXN0QXBwL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCisjIERvbid0IGluY2x1ZGUgdGhpcyBwYWNrYWdlIGluIGFueSB0YXJnZXQuCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKSBcCisKKyMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNKb2JUZXN0QXBwCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CisKK2luY2x1ZGUgJChCVUlMRF9DVFNfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL3Rlc3RzL0pvYlNjaGVkdWxlci9Kb2JUZXN0QXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9Kb2JTY2hlZHVsZXIvSm9iVGVzdEFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2NmM1ZDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Kb2JTY2hlZHVsZXIvSm9iVGVzdEFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIHBhY2thZ2U9ImFuZHJvaWQuam9ic2NoZWR1bGVyLmN0cy5qb2J0ZXN0YXBwIj4KKworICAgIDwhLS0gVGhpcyBhcHBsaWNhdGlvbiBzY2hlZHVsZXMgam9icyBpbmRlcGVuZGVudGx5IG9mIHRoZSB0ZXN0IGluc3RydW1lbnRhdGlvbiB0byBtYWtlCisgICAgaXQgcG9zc2libGUgdG8gdGVzdCBiZWhhdmlvdXIgZm9yIGRpZmZlcmVudCBhcHAgc3RhdGVzLCB3aGl0ZWxpc3RzIGFuZCBkZXZpY2UgaWRsZSBtb2RlcyAtLT4KKyAgICA8YXBwbGljYXRpb24+CisgICAgICAgIDxzZXJ2aWNlIGFuZHJvaWQ6bmFtZT0iLlRlc3RKb2JTZXJ2aWNlIgorICAgICAgICAgICAgICAgICBhbmRyb2lkOnBlcm1pc3Npb249ImFuZHJvaWQucGVybWlzc2lvbi5CSU5EX0pPQl9TRVJWSUNFIiAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuVGVzdEFjdGl2aXR5IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIgLz4KKyAgICAgICAgPHJlY2VpdmVyIGFuZHJvaWQ6bmFtZT0iLlRlc3RKb2JTY2hlZHVsZXJSZWNlaXZlciIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiIC8+CisgICAgPC9hcHBsaWNhdGlvbj4KKworPC9tYW5pZmVzdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9Kb2JTY2hlZHVsZXIvSm9iVGVzdEFwcC9zcmMvYW5kcm9pZC9qb2JzY2hlZHVsZXIvY3RzL2pvYnRlc3RhcHAvVGVzdEFjdGl2aXR5LmphdmEgYi90ZXN0cy9Kb2JTY2hlZHVsZXIvSm9iVGVzdEFwcC9zcmMvYW5kcm9pZC9qb2JzY2hlZHVsZXIvY3RzL2pvYnRlc3RhcHAvVGVzdEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM2OGYwNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0pvYlNjaGVkdWxlci9Kb2JUZXN0QXBwL3NyYy9hbmRyb2lkL2pvYnNjaGVkdWxlci9jdHMvam9idGVzdGFwcC9UZXN0QWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQuam9ic2NoZWR1bGVyLmN0cy5qb2J0ZXN0YXBwOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKy8qKgorICogSnVzdCBhIGR1bW15IGFjdGl2aXR5IHRvIGtlZXAgdGhlIHRlc3QgYXBwIHByb2Nlc3MgaW4gdGhlIGZvcmVncm91bmQgc3RhdGUgd2hlbiBkZXNpcmVkLgorICovCitwdWJsaWMgY2xhc3MgVGVzdEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBUZXN0QWN0aXZpdHkuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFX05BTUUgPSAiYW5kcm9pZC5qb2JzY2hlZHVsZXIuY3RzLmpvYnRlc3RhcHAiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgREVGQVVMVF9XQUlUX0RVUkFUSU9OID0gMzBfMDAwOworCisgICAgc3RhdGljIGZpbmFsIGludCBGSU5JU0hfQUNUSVZJVFlfTVNHID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fRklOSVNIX0FDVElWSVRZID0gUEFDS0FHRV9OQU1FICsgIi5hY3Rpb24uRklOSVNIX0FDVElWSVRZIjsKKworICAgIEhhbmRsZXIgbUZpbmlzaEhhbmRsZXIgPSBuZXcgSGFuZGxlcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEZJTklTSF9BQ1RJVklUWV9NU0c6CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkZpbmlzaGluZyB0ZXN0IGFjdGl2aXR5OiAiICsgVGVzdEFjdGl2aXR5LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIHVucmVnaXN0ZXJSZWNlaXZlcihtRmluaXNoUmVjZWl2ZXIpOworICAgICAgICAgICAgICAgICAgICBmaW5pc2goKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBmaW5hbCBCcm9hZGNhc3RSZWNlaXZlciBtRmluaXNoUmVjZWl2ZXIgPSBuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICBtRmluaXNoSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhGSU5JU0hfQUNUSVZJVFlfTVNHKTsKKyAgICAgICAgICAgIG1GaW5pc2hIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoRklOSVNIX0FDVElWSVRZX01TRyk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2UpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAiU3RhcnRlZCB0ZXN0IGFjdGl2aXR5OiAiICsgVGVzdEFjdGl2aXR5LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2UpOworICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IGZpbmlzaCBhZnRlciAzMCBzZWNvbmRzLgorICAgICAgICBtRmluaXNoSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlRGVsYXllZChGSU5JU0hfQUNUSVZJVFlfTVNHLCBERUZBVUxUX1dBSVRfRFVSQVRJT04pOworICAgICAgICByZWdpc3RlclJlY2VpdmVyKG1GaW5pc2hSZWNlaXZlciwgbmV3IEludGVudEZpbHRlcihBQ1RJT05fRklOSVNIX0FDVElWSVRZKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvSm9iU2NoZWR1bGVyL0pvYlRlc3RBcHAvc3JjL2FuZHJvaWQvam9ic2NoZWR1bGVyL2N0cy9qb2J0ZXN0YXBwL1Rlc3RKb2JTY2hlZHVsZXJSZWNlaXZlci5qYXZhIGIvdGVzdHMvSm9iU2NoZWR1bGVyL0pvYlRlc3RBcHAvc3JjL2FuZHJvaWQvam9ic2NoZWR1bGVyL2N0cy9qb2J0ZXN0YXBwL1Rlc3RKb2JTY2hlZHVsZXJSZWNlaXZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMWUwNTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Kb2JTY2hlZHVsZXIvSm9iVGVzdEFwcC9zcmMvYW5kcm9pZC9qb2JzY2hlZHVsZXIvY3RzL2pvYnRlc3RhcHAvVGVzdEpvYlNjaGVkdWxlclJlY2VpdmVyLmphdmEKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5qb2JzY2hlZHVsZXIuY3RzLmpvYnRlc3RhcHA7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5qb2IuSm9iSW5mbzsKK2ltcG9ydCBhbmRyb2lkLmFwcC5qb2IuSm9iU2NoZWR1bGVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKy8qKgorICogU2NoZWR1bGVzIGpvYnMgZm9yIHRoaXMgcGFja2FnZSBidXQgZG9lcyBub3QsIGJ5IGl0c2VsZiwgb2NjdXB5IGEgZm9yZWdyb3VuZCB1aWQgc3RhdGUKKyAqIHdoaWxlIGRvaW5nIHNvLgorICovCitwdWJsaWMgY2xhc3MgVGVzdEpvYlNjaGVkdWxlclJlY2VpdmVyIGV4dGVuZHMgQnJvYWRjYXN0UmVjZWl2ZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBUZXN0Sm9iU2NoZWR1bGVyUmVjZWl2ZXIuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFX05BTUUgPSAiYW5kcm9pZC5qb2JzY2hlZHVsZXIuY3RzLmpvYnRlc3RhcHAiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfSk9CX0lEX0tFWSA9IFBBQ0tBR0VfTkFNRSArICIuZXh0cmEuSk9CX0lEIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9BTExPV19JTl9JRExFID0gUEFDS0FHRV9OQU1FICsgIi5leHRyYS5BTExPV19JTl9JRExFIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fU0NIRURVTEVfSk9CID0gUEFDS0FHRV9OQU1FICsgIi5hY3Rpb24uU0NIRURVTEVfSk9CIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fQ0FOQ0VMX0pPQlMgPSBQQUNLQUdFX05BTUUgKyAiLmFjdGlvbi5DQU5DRUxfSk9CUyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSk9CX0lOSVRJQUxfQkFDS09GRiA9IDEwXzAwMDsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgZmluYWwgQ29tcG9uZW50TmFtZSBqb2JTZXJ2aWNlQ29tcG9uZW50ID0gbmV3IENvbXBvbmVudE5hbWUoY29udGV4dCwgVGVzdEpvYlNlcnZpY2UuY2xhc3MpOworICAgICAgICBmaW5hbCBKb2JTY2hlZHVsZXIgam9iU2NoZWR1bGVyID0gY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKEpvYlNjaGVkdWxlci5jbGFzcyk7CisgICAgICAgIHN3aXRjaCAoaW50ZW50LmdldEFjdGlvbigpKSB7CisgICAgICAgICAgICBjYXNlIEFDVElPTl9DQU5DRUxfSk9CUzoKKyAgICAgICAgICAgICAgICBqb2JTY2hlZHVsZXIuY2FuY2VsQWxsKCk7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQ2FuY2VsbGVkIGFsbCBqb2JzIGZvciAiICsgY29udGV4dC5nZXRQYWNrYWdlTmFtZSgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQUNUSU9OX1NDSEVEVUxFX0pPQjoKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgam9iSWQgPSBpbnRlbnQuZ2V0SW50RXh0cmEoRVhUUkFfSk9CX0lEX0tFWSwgaGFzaENvZGUoKSk7CisgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBhbGxvd0luSWRsZSA9IGludGVudC5nZXRCb29sZWFuRXh0cmEoRVhUUkFfQUxMT1dfSU5fSURMRSwgZmFsc2UpOworICAgICAgICAgICAgICAgIEpvYkluZm8uQnVpbGRlciBqb2JCdWlsZGVyID0gbmV3IEpvYkluZm8uQnVpbGRlcihqb2JJZCwgam9iU2VydmljZUNvbXBvbmVudCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRCYWNrb2ZmQ3JpdGVyaWEoSk9CX0lOSVRJQUxfQkFDS09GRiwgSm9iSW5mby5CQUNLT0ZGX1BPTElDWV9MSU5FQVIpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0T3ZlcnJpZGVEZWFkbGluZSgwKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEltcG9ydGFudFdoaWxlRm9yZWdyb3VuZChhbGxvd0luSWRsZSk7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHJlc3VsdCA9IGpvYlNjaGVkdWxlci5zY2hlZHVsZShqb2JCdWlsZGVyLmJ1aWxkKCkpOworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gSm9iU2NoZWR1bGVyLlJFU1VMVF9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkNvdWxkIG5vdCBzY2hlZHVsZSBqb2IgIiArIGpvYklkKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJTdWNjZXNzZnVsbHkgc2NoZWR1bGVkIGpvYiB3aXRoIGlkICIgKyBqb2JJZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJVbmtub3duIGFjdGlvbiAiICsgaW50ZW50LmdldEFjdGlvbigpKTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9Kb2JTY2hlZHVsZXIvSm9iVGVzdEFwcC9zcmMvYW5kcm9pZC9qb2JzY2hlZHVsZXIvY3RzL2pvYnRlc3RhcHAvVGVzdEpvYlNlcnZpY2UuamF2YSBiL3Rlc3RzL0pvYlNjaGVkdWxlci9Kb2JUZXN0QXBwL3NyYy9hbmRyb2lkL2pvYnNjaGVkdWxlci9jdHMvam9idGVzdGFwcC9UZXN0Sm9iU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MDMxYzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Kb2JTY2hlZHVsZXIvSm9iVGVzdEFwcC9zcmMvYW5kcm9pZC9qb2JzY2hlZHVsZXIvY3RzL2pvYnRlc3RhcHAvVGVzdEpvYlNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQuam9ic2NoZWR1bGVyLmN0cy5qb2J0ZXN0YXBwOworCitpbXBvcnQgYW5kcm9pZC5hcHAuam9iLkpvYlBhcmFtZXRlcnM7CitpbXBvcnQgYW5kcm9pZC5hcHAuam9iLkpvYlNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitwdWJsaWMgY2xhc3MgVGVzdEpvYlNlcnZpY2UgZXh0ZW5kcyBKb2JTZXJ2aWNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gVGVzdEpvYlNlcnZpY2UuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFX05BTUUgPSAiYW5kcm9pZC5qb2JzY2hlZHVsZXIuY3RzLmpvYnRlc3RhcHAiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9KT0JfU1RBUlRFRCA9IFBBQ0tBR0VfTkFNRSArICIuYWN0aW9uLkpPQl9TVEFSVEVEIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fSk9CX1NUT1BQRUQgPSBQQUNLQUdFX05BTUUgKyAiLmFjdGlvbi5KT0JfU1RPUFBFRCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSk9CX1BBUkFNU19FWFRSQV9LRVkgPSBQQUNLQUdFX05BTUUgKyAiLmV4dHJhLkpPQl9QQVJBTUVURVJTIjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uU3RhcnRKb2IoSm9iUGFyYW1ldGVycyBwYXJhbXMpIHsKKyAgICAgICAgTG9nLmkoVEFHLCAiVGVzdCBqb2IgZXhlY3V0aW5nOiAiICsgcGFyYW1zLmdldEpvYklkKCkpOworICAgICAgICBmaW5hbCBJbnRlbnQgcmVwb3J0Sm9iU3RhcnRJbnRlbnQgPSBuZXcgSW50ZW50KEFDVElPTl9KT0JfU1RBUlRFRCk7CisgICAgICAgIHJlcG9ydEpvYlN0YXJ0SW50ZW50LnB1dEV4dHJhKEpPQl9QQVJBTVNfRVhUUkFfS0VZLCBwYXJhbXMpOworICAgICAgICBzZW5kQnJvYWRjYXN0KHJlcG9ydEpvYlN0YXJ0SW50ZW50KTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25TdG9wSm9iKEpvYlBhcmFtZXRlcnMgcGFyYW1zKSB7CisgICAgICAgIExvZy5pKFRBRywgIlRlc3Qgam9iIHN0b3BwZWQgZXhlY3V0aW5nOiAiICsgcGFyYW1zLmdldEpvYklkKCkpOworICAgICAgICBmaW5hbCBJbnRlbnQgcmVwb3J0Sm9iU3RvcEludGVudCA9IG5ldyBJbnRlbnQoQUNUSU9OX0pPQl9TVE9QUEVEKTsKKyAgICAgICAgcmVwb3J0Sm9iU3RvcEludGVudC5wdXRFeHRyYShKT0JfUEFSQU1TX0VYVFJBX0tFWSwgcGFyYW1zKTsKKyAgICAgICAgc2VuZEJyb2FkY2FzdChyZXBvcnRKb2JTdG9wSW50ZW50KTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvSm9iU2NoZWR1bGVyL2pvYnBlcm0vQW5kcm9pZC5tayBiL3Rlc3RzL0pvYlNjaGVkdWxlci9qb2JwZXJtL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NGY4ZDYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvSm9iU2NoZWR1bGVyL2pvYnBlcm0vQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotIyBEb24ndCBpbmNsdWRlIHRoaXMgcGFja2FnZSBpbiBhbnkgdGFyZ2V0LgotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLQotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKLSAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsIFwKLQotTE9DQUxfU1JDX0ZJTEVTIDo9IFwKLSAgICAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykgXAotCi0jIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0Ci1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cwotCi1MT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzSm9iU2NoZWR1bGVySm9iUGVybQotCi1pbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS90ZXN0cy9Kb2JTY2hlZHVsZXIvam9icGVybS9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvSm9iU2NoZWR1bGVyL2pvYnBlcm0vQW5kcm9pZE1hbmlmZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTRlYjAyYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9Kb2JTY2hlZHVsZXIvam9icGVybS9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0KLSAgfiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQotICAtLT4KLQotPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgICBwYWNrYWdlPSJhbmRyb2lkLmpvYnNjaGVkdWxlci5jdHMuam9icGVybSI+Ci0KLSAgICA8IS0tCi0gICAgQW4gYXBwIHRoYXQgZGVjbGFyZXMgYSBwZXJtaXNzaW9uIHRoYXQgcmVxdWlyZXMgYSBtYXRjaGluZyBzaWduYXR1cmUgdG8KLSAgICBhY2Nlc3MuCi0gICAgLS0+Ci0gICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmpvYnNjaGVkdWxlci5jdHMuam9icGVybS5wZXJtIgotICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic2lnbmF0dXJlIiAvPgotICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmpvYnNjaGVkdWxlci5jdHMuam9icGVybS5wZXJtIiAvPgotCi0gICAgPGFwcGxpY2F0aW9uPgotICAgICAgICA8IS0tIE5lZWQgYSB3YXkgZm9yIGFub3RoZXIgYXBwIHRvIHRyeSB0byBhY2Nlc3MgdGhlIHBlcm1pc3Npb24uIFNvIGNyZWF0ZSBhIGNvbnRlbnQKLSAgICAgICAgcHJvdmlkZXIgd2hpY2ggaXMgZW5mb3JjZWQgYnkgdGhlIHBlcm1pc3Npb24gLS0+Ci0gICAgICAgIDxwcm92aWRlciBhbmRyb2lkOm5hbWU9Ii5Kb2JQZXJtUHJvdmlkZXIiCi0gICAgICAgICAgICBhbmRyb2lkOmF1dGhvcml0aWVzPSJhbmRyb2lkLmpvYnNjaGVkdWxlci5jdHMuam9icGVybS5wcm92aWRlciIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiPgotICAgICAgICAgICAgPHBhdGgtcGVybWlzc2lvbgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGF0aFByZWZpeD0iL3Byb3RlY3RlZCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnJlYWRQZXJtaXNzaW9uPSJhbmRyb2lkLmpvYnNjaGVkdWxlci5jdHMuam9icGVybS5wZXJtIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6d3JpdGVQZXJtaXNzaW9uPSJhbmRyb2lkLmpvYnNjaGVkdWxlci5jdHMuam9icGVybS5wZXJtIiAvPgotICAgICAgICAgICAgPGdyYW50LXVyaS1wZXJtaXNzaW9uIGFuZHJvaWQ6cGF0aFBhdHRlcm49Ii4qIiAvPgotICAgICAgICA8L3Byb3ZpZGVyPgotICAgIDwvYXBwbGljYXRpb24+Ci08L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvSm9iU2NoZWR1bGVyL2pvYnBlcm0vUkVBRE1FLnR4dCBiL3Rlc3RzL0pvYlNjaGVkdWxlci9qb2JwZXJtL1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyODU4MTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvSm9iU2NoZWR1bGVyL2pvYnBlcm0vUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotVGhpcyBBUEsgdXNlcyB0aGUgc2FtZSBzaGFyZWQgVUlEIGFzIEN0c0pvYlNjaGVkdWxlclRlc3RDYXNlcy4gSXQgaGFzIG5vIGNvZGUgYnV0IGV4aXN0cyBmb3IKLWEgc2hhcmVkLVVJRCB0ZXN0cy4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9Kb2JTY2hlZHVsZXIvam9icGVybS9zcmMvYW5kcm9pZC9qb2JzY2hlZHVsZXIvY3RzL2pvYnBlcm0vSm9iUGVybVByb3ZpZGVyLmphdmEgYi90ZXN0cy9Kb2JTY2hlZHVsZXIvam9icGVybS9zcmMvYW5kcm9pZC9qb2JzY2hlZHVsZXIvY3RzL2pvYnBlcm0vSm9iUGVybVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViM2JhYzcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvSm9iU2NoZWR1bGVyL2pvYnBlcm0vc3JjL2FuZHJvaWQvam9ic2NoZWR1bGVyL2N0cy9qb2JwZXJtL0pvYlBlcm1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5qb2JzY2hlZHVsZXIuY3RzLmpvYnBlcm07Ci0KLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotCi0vKioKLSAqIEVtcHR5IGNvbnRlbnQgcHJvdmlkZXIsIGFsbCBwZXJtaXNzaW9ucyBhcmUgZW5mb3JjZWQgaW4gbWFuaWZlc3QKLSAqLwotcHVibGljIGNsYXNzIEpvYlBlcm1Qcm92aWRlciBleHRlbmRzIENvbnRlbnRQcm92aWRlciB7Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1bmRsZSBjYWxsKEBOb25OdWxsIFN0cmluZyBtZXRob2QsIEBOdWxsYWJsZSBTdHJpbmcgYXJnLCBATnVsbGFibGUgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBpZiAobWV0aG9kID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHN3aXRjaCAobWV0aG9kKSB7Ci0gICAgICAgICAgICBjYXNlICJncmFudCI6IHsKLSAgICAgICAgICAgICAgICBVcmkgdXJpID0gZXh0cmFzLmdldFBhcmNlbGFibGUoInVyaSIpOwotICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5ncmFudFVyaVBlcm1pc3Npb24oYXJnLCB1cmksCi0gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbnQuRkxBR19HUkFOVF9SRUFEX1VSSV9QRVJNSVNTSU9OIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZW50LkZMQUdfR1JBTlRfV1JJVEVfVVJJX1BFUk1JU1NJT04pOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSAicmV2b2tlIjogewotICAgICAgICAgICAgICAgIFVyaSB1cmkgPSBleHRyYXMuZ2V0UGFyY2VsYWJsZSgidXJpIik7Ci0gICAgICAgICAgICAgICAgZ2V0Q29udGV4dCgpLnJldm9rZVVyaVBlcm1pc3Npb24oYXJnLCB1cmksCi0gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbnQuRkxBR19HUkFOVF9SRUFEX1VSSV9QRVJNSVNTSU9OIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZW50LkZMQUdfR1JBTlRfV1JJVEVfVVJJX1BFUk1JU1NJT04pOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmNhbGwobWV0aG9kLCBhcmcsIGV4dHJhcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBkZWxldGUoVXJpIHVyaSwgU3RyaW5nIHNlbGVjdGlvbiwgU3RyaW5nW10gc2VsZWN0aW9uQXJncykgewotICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZShVcmkgdXJpKSB7Ci0gICAgICAgIHJldHVybiAiZ290L3RoZU1JTUUiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBVcmkgaW5zZXJ0KFVyaSB1cmksIENvbnRlbnRWYWx1ZXMgdmFsdWVzKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEN1cnNvciBxdWVyeShVcmkgdXJpLCBTdHJpbmdbXSBwcm9qZWN0aW9uLCBTdHJpbmcgc2VsZWN0aW9uLAotICAgICAgICAgICAgU3RyaW5nW10gc2VsZWN0aW9uQXJncywgU3RyaW5nIHNvcnRPcmRlcikgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IHVwZGF0ZShVcmkgdXJpLCBDb250ZW50VmFsdWVzIHZhbHVlcywgU3RyaW5nIHNlbGVjdGlvbiwKLSAgICAgICAgICAgIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFBhcmNlbEZpbGVEZXNjcmlwdG9yIG9wZW5GaWxlKFVyaSB1cmksIFN0cmluZyBtb2RlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIFBhcmNlbEZpbGVEZXNjcmlwdG9yLm9wZW4oCi0gICAgICAgICAgICAgICAgbmV3IEZpbGUoIi9kZXYvbnVsbCIpLCBQYXJjZWxGaWxlRGVzY3JpcHRvci5NT0RFX1JFQURfT05MWSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvSm9iU2NoZWR1bGVyL3NoYXJlZHVpZC9BbmRyb2lkLm1rIGIvdGVzdHMvSm9iU2NoZWR1bGVyL3NoYXJlZHVpZC9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzRkOGIzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL0pvYlNjaGVkdWxlci9zaGFyZWR1aWQvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotIyBEb24ndCBpbmNsdWRlIHRoaXMgcGFja2FnZSBpbiBhbnkgdGFyZ2V0LgotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLQotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKLSAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsIFwKLQotTE9DQUxfU1JDX0ZJTEVTIDo9IFwKLSAgICAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykgXAotCi0jIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0Ci1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cwotCi1MT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzSm9iU2NoZWR1bGVyU2hhcmVkVWlkCi0KLWluY2x1ZGUgJChCVUlMRF9DVFNfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL3Rlc3RzL0pvYlNjaGVkdWxlci9zaGFyZWR1aWQvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL0pvYlNjaGVkdWxlci9zaGFyZWR1aWQvQW5kcm9pZE1hbmlmZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzU2YTA2Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9Kb2JTY2hlZHVsZXIvc2hhcmVkdWlkL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLQotICB+IENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gIH4KLSAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCi0gIC0tPgotCi08bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICAgIHBhY2thZ2U9ImFuZHJvaWQuam9ic2NoZWR1bGVyLmN0cy5zaGFyZWR1aWQiCi0gICAgICAgICAgYW5kcm9pZDpzaGFyZWRVc2VySWQ9ImFuZHJvaWQuam9ic2NoZWR1bGVyLmN0cy5zaGFyZWQudWlkIj4KLSAgICA8YXBwbGljYXRpb24+Ci0gICAgPC9hcHBsaWNhdGlvbj4KLTwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9Kb2JTY2hlZHVsZXIvc2hhcmVkdWlkL3NyYy9hbmRyb2lkL2pvYnNjaGVkdWxlci9jdHMvc2hhcmVkdWlkL0VtcHR5LmphdmEgYi90ZXN0cy9Kb2JTY2hlZHVsZXIvc2hhcmVkdWlkL3NyYy9hbmRyb2lkL2pvYnNjaGVkdWxlci9jdHMvc2hhcmVkdWlkL0VtcHR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyOWVkMWYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvSm9iU2NoZWR1bGVyL3NoYXJlZHVpZC9zcmMvYW5kcm9pZC9qb2JzY2hlZHVsZXIvY3RzL3NoYXJlZHVpZC9FbXB0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQuam9ic2NoZWR1bGVyLmN0cy5zaGFyZWR1aWQ7Ci0KLXB1YmxpYyBjbGFzcyBFbXB0eSB7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9Kb2JTY2hlZHVsZXIvc3JjL2FuZHJvaWQvam9ic2NoZWR1bGVyL01vY2tKb2JTZXJ2aWNlLmphdmEgYi90ZXN0cy9Kb2JTY2hlZHVsZXIvc3JjL2FuZHJvaWQvam9ic2NoZWR1bGVyL01vY2tKb2JTZXJ2aWNlLmphdmEKaW5kZXggOTRhZWUyMC4uOTY0ODUzYyAxMDA2NDQKLS0tIGEvdGVzdHMvSm9iU2NoZWR1bGVyL3NyYy9hbmRyb2lkL2pvYnNjaGVkdWxlci9Nb2NrSm9iU2VydmljZS5qYXZhCisrKyBiL3Rlc3RzL0pvYlNjaGVkdWxlci9zcmMvYW5kcm9pZC9qb2JzY2hlZHVsZXIvTW9ja0pvYlNlcnZpY2UuamF2YQpAQCAtNTIsNiArNTIsOCBAQAogCiAgICAgQXJyYXlMaXN0PEpvYldvcmtJdGVtPiBtUmVjZWl2ZWRXb3JrID0gbmV3IEFycmF5TGlzdDw+KCk7CiAKKyAgICBBcnJheUxpc3Q8Sm9iV29ya0l0ZW0+IG1QZW5kaW5nQ29tcGxldGlvbnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwogICAgIHByaXZhdGUgYm9vbGVhbiBtV2FpdGluZ0ZvclN0b3A7CiAKICAgICBAT3ZlcnJpZGUKQEAgLTEwNCw2ICsxMDYsOCBAQAogICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIlJlY2VpdmVkIHdvcmsgIyIgKyBpbmRleCArICI6ICIgKyB3b3JrLmdldEludGVudCgpKTsKICAgICAgICAgICAgICAgICBtUmVjZWl2ZWRXb3JrLmFkZCh3b3JrKTsKIAorICAgICAgICAgICAgICAgIGludCBmbGFncyA9IDA7CisKICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCBleHBlY3RlZFdvcmsubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgIFRlc3RXb3JrSXRlbSBleHBlY3RlZCA9IGV4cGVjdGVkV29ya1tpbmRleF07CiAgICAgICAgICAgICAgICAgICAgIGludCBncmFudEZsYWdzID0gd29yay5nZXRJbnRlbnQoKS5nZXRGbGFncygpOwpAQCAtMTcwLDE1ICsxNzQsMzMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIGlmICgoZXhwZWN0ZWQuZmxhZ3MgJiBUZXN0V29ya0l0ZW0uRkxBR19XQUlUX0ZPUl9TVE9QKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gZXhwZWN0ZWQuZmxhZ3M7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKChmbGFncyAmIFRlc3RXb3JrSXRlbS5GTEFHX1dBSVRfRk9SX1NUT1ApICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIk5vdyB3YWl0aW5nIHRvIHN0b3AiKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1XYWl0aW5nRm9yU3RvcCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0RW52aXJvbm1lbnQuZ2V0VGVzdEVudmlyb25tZW50KCkubm90aWZ5V2FpdGluZ0ZvclN0b3AoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKChmbGFncyAmIFRlc3RXb3JrSXRlbS5GTEFHX0NPTVBMRVRFX05FWFQpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHJvY2Vzc05leHRQZW5kaW5nQ29tcGxldGlvbigpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdEVudmlyb25tZW50LmdldFRlc3RFbnZpcm9ubWVudCgpLm5vdGlmeUV4ZWN1dGlvbihwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIHRvIGNvbXBsZXRlIG5leHQgcGVuZGluZyB3b3JrIGJ1dCB0aGVyZSB3YXMgbm9uZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgQCAjIiArIGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBtUGFyYW1zLmNvbXBsZXRlV29yayh3b3JrKTsKKyAgICAgICAgICAgICAgICBpZiAoKGZsYWdzICYgVGVzdFdvcmtJdGVtLkZMQUdfREVMQVlfQ09NUExFVEVfUFVTSF9CQUNLKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1QZW5kaW5nQ29tcGxldGlvbnMuYWRkKHdvcmspOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGZsYWdzICYgVGVzdFdvcmtJdGVtLkZMQUdfREVMQVlfQ09NUExFVEVfUFVTSF9UT1ApICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdDb21wbGV0aW9ucy5hZGQoMCwgd29yayk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbVBhcmFtcy5jb21wbGV0ZVdvcmsod29yayk7CisgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgZXhwZWN0ZWRXb3JrLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICBUZXN0V29ya0l0ZW0gZXhwZWN0ZWQgPSBleHBlY3RlZFdvcmtbaW5kZXhdOwpAQCAtMTk1LDYgKzIxNywyMCBAQAogCiAgICAgICAgICAgICAgICAgaW5kZXgrKzsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHByb2Nlc3NOZXh0UGVuZGluZ0NvbXBsZXRpb24oKSkgeworICAgICAgICAgICAgICAgIC8vIFdlIGhhZCBzb21lIHBlbmRpbmcgY29tcGxldGlvbnMsIGNsZWFuIHRoZW0gYWxsIG91dC4uLgorICAgICAgICAgICAgICAgIHdoaWxlIChwcm9jZXNzTmV4dFBlbmRpbmdDb21wbGV0aW9uKCkpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gLi4uYW5kIHdlIG5lZWQgdG8gZG8gYSBmaW5hbCBkZXF1ZXVlIHRvIGNvbXBsZXRlIHRoZSBqb2IsIHdoaWNoIHNob3VsZCBub3QKKyAgICAgICAgICAgICAgICAvLyByZXR1cm4gYW55IHJlbWFpbmluZyB3b3JrLgorICAgICAgICAgICAgICAgIGlmICgod29yayA9IHBhcmFtcy5kZXF1ZXVlV29yaygpKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIFRlc3RFbnZpcm9ubWVudC5nZXRUZXN0RW52aXJvbm1lbnQoKS5ub3RpZnlFeGVjdXRpb24ocGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIG5vIHJlbWFpbmluZyB3b3JrIGFmdGVyIGRlcXVldWUgcGVuZGluZywgYnV0IGdvdDogIiArIHdvcmspOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgTG9nLmkoVEFHLCAiRG9uZSB3aXRoIGFsbCB3b3JrIGF0ICMiICsgaW5kZXgpOwogICAgICAgICAgICAgLy8gV2UgZG9uJ3Qgbm90aWZ5RXhlY3V0aW9uIGhlcmUgYmVjYXVzZSB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGUgam9iIHByb3Blcmx5CiAgICAgICAgICAgICAvLyBzdG9wcyBpdHNlbGYuCkBAIC0yMTksNiArMjU1LDE2IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBib29sZWFuIHByb2Nlc3NOZXh0UGVuZGluZ0NvbXBsZXRpb24oKSB7CisgICAgICAgIGlmIChtUGVuZGluZ0NvbXBsZXRpb25zLnNpemUoKSA8PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBKb2JXb3JrSXRlbSBuZXh0ID0gbVBlbmRpbmdDb21wbGV0aW9ucy5yZW1vdmUoMCk7CisgICAgICAgIG1QYXJhbXMuY29tcGxldGVXb3JrKG5leHQpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBvblN0b3BKb2IoSm9iUGFyYW1ldGVycyBwYXJhbXMpIHsKICAgICAgICAgTG9nLmkoVEFHLCAiUmVjZWl2ZWQgc3RvcCBjYWxsYmFjayIpOwpAQCAtMjI3LDcgKzI3MywyNCBAQAogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgVGVzdFdvcmtJdGVtIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFN0b3AgcHJvY2Vzc2luZyB3b3JrIGZvciBub3csIHdhaXRpbmcgZm9yIHRoZSBzZXJ2aWNlIHRvIGJlIHN0b3BwZWQuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1dBSVRfRk9SX1NUT1AgPSAxPDwwOworICAgICAgICAvKioKKyAgICAgICAgICogRG9uJ3QgY29tcGxldGUgdGhpcyB3b3JrIG5vdywgaW5zdGVhZCBwdXNoIGl0IG9uIHRoZSBiYWNrIG9mIHRoZSBzdGFjayBvZgorICAgICAgICAgKiBwZW5kaW5nIGNvbXBsZXRpb25zLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19ERUxBWV9DT01QTEVURV9QVVNIX0JBQ0sgPSAxPDwxOworICAgICAgICAvKioKKyAgICAgICAgICogRG9uJ3QgY29tcGxldGUgdGhpcyB3b3JrIG5vdywgaW5zdGVhZCBpbnNlcnQgdG8gdGhlIHRvcCBvZiB0aGUgc3RhY2sgb2YKKyAgICAgICAgICogcGVuZGluZyBjb21wbGV0aW9ucy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfREVMQVlfQ09NUExFVEVfUFVTSF9UT1AgPSAxPDwyOworICAgICAgICAvKioKKyAgICAgICAgICogQ29tcGxldGUgbmV4dCBwZW5kaW5nIGNvbXBsZXRpb24gb24gdGhlIHN0YWNrIGJlZm9yZSBjb21wbGV0aW5nIHRoaXMgb25lLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19DT01QTEVURV9ORVhUID0gMTw8MzsKIAogICAgICAgICBwdWJsaWMgZmluYWwgSW50ZW50IGludGVudDsKICAgICAgICAgcHVibGljIGZpbmFsIEpvYkluZm8gam9iSW5mbzsKQEAgLTI0Nyw2ICszMTAsMTYgQEAKICAgICAgICAgICAgIHJlcXVpcmVVcmlzTm90R3JhbnRlZCA9IG51bGw7CiAgICAgICAgIH0KIAorICAgICAgICBwdWJsaWMgVGVzdFdvcmtJdGVtKEludGVudCBfaW50ZW50LCBpbnQgX2ZsYWdzKSB7CisgICAgICAgICAgICBpbnRlbnQgPSBfaW50ZW50OworICAgICAgICAgICAgam9iSW5mbyA9IG51bGw7CisgICAgICAgICAgICBmbGFncyA9IF9mbGFnczsKKyAgICAgICAgICAgIGRlbGl2ZXJ5Q291bnQgPSAxOworICAgICAgICAgICAgc3ViaXRlbXMgPSBudWxsOworICAgICAgICAgICAgcmVxdWlyZVVyaXNHcmFudGVkID0gbnVsbDsKKyAgICAgICAgICAgIHJlcXVpcmVVcmlzTm90R3JhbnRlZCA9IG51bGw7CisgICAgICAgIH0KKwogICAgICAgICBwdWJsaWMgVGVzdFdvcmtJdGVtKEludGVudCBfaW50ZW50LCBpbnQgX2ZsYWdzLCBpbnQgX2RlbGl2ZXJ5Q291bnQpIHsKICAgICAgICAgICAgIGludGVudCA9IF9pbnRlbnQ7CiAgICAgICAgICAgICBqb2JJbmZvID0gbnVsbDsKZGlmZiAtLWdpdCBhL3Rlc3RzL0pvYlNjaGVkdWxlci9zcmMvYW5kcm9pZC9qb2JzY2hlZHVsZXIvY3RzL0JhdHRlcnlDb25zdHJhaW50VGVzdC5qYXZhIGIvdGVzdHMvSm9iU2NoZWR1bGVyL3NyYy9hbmRyb2lkL2pvYnNjaGVkdWxlci9jdHMvQmF0dGVyeUNvbnN0cmFpbnRUZXN0LmphdmEKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA5ZDVjNWYyLi45MzMxYjMyCi0tLSBhL3Rlc3RzL0pvYlNjaGVkdWxlci9zcmMvYW5kcm9pZC9qb2JzY2hlZHVsZXIvY3RzL0JhdHRlcnlDb25zdHJhaW50VGVzdC5qYXZhCisrKyBiL3Rlc3RzL0pvYlNjaGVkdWxlci9zcmMvYW5kcm9pZC9qb2JzY2hlZHVsZXIvY3RzL0JhdHRlcnlDb25zdHJhaW50VGVzdC5qYXZhCkBAIC0yOCw3ICsyOCw5IEBACiBpbXBvcnQgYW5kcm9pZC5uZXQuQ29ubmVjdGl2aXR5TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbzsKIGltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuQmF0dGVyeU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CiAKQEAgLTQ0LDExICs0NiwxOSBAQAogcHVibGljIGNsYXNzIEJhdHRlcnlDb25zdHJhaW50VGVzdCBleHRlbmRzIENvbnN0cmFpbnRUZXN0IHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkJhdHRlcnlDb25zdHJhaW50VGVzdCI7CiAKKyAgICBwcml2YXRlIFN0cmluZyBGRUFUVVJFX1dBVENIID0gImFuZHJvaWQuaGFyZHdhcmUudHlwZS53YXRjaCI7CisgICAgcHJpdmF0ZSBTdHJpbmcgVFdNX0hBUkRXQVJFX0ZFQVRVUkUgPSAiY29tLmdvb2dsZS5jbG9ja3dvcmsuaGFyZHdhcmUudHJhZGl0aW9uYWxfd2F0Y2hfbW9kZSI7CisKICAgICAvKiogVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBqb2Igc2NoZWR1bGVkIGJ5IHRoaXMgc3VpdGUgb2YgdGVzdHMuICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkFUVEVSWV9KT0JfSUQgPSBCYXR0ZXJ5Q29uc3RyYWludFRlc3QuY2xhc3MuaGFzaENvZGUoKTsKIAogICAgIHByaXZhdGUgSm9iSW5mby5CdWlsZGVyIG1CdWlsZGVyOwogICAgIHByaXZhdGUgaW50IG1Mb3dCYXR0ZXJ5V2FybmluZ0xldmVsID0gMTU7CisgICAgLyoqCisgICAgICogUmVjb3JkIG9mIHRoZSBwcmV2aW91cyBzdGF0ZSBvZiBwb3dlciBzYXZlIG1vZGUgdHJpZ2dlciBsZXZlbCB0byByZXNldCBpdCBhZnRlciB0aGUgdGVzdAorICAgICAqIGZpbmlzaGVzLgorICAgICAqLworICAgIHByaXZhdGUgaW50IG1QcmV2aW91c0xvd1Bvd2VyVHJpZ2dlckxldmVsOwogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTU3LDYgKzY3LDEzIEBACiAgICAgICAgIG1Mb3dCYXR0ZXJ5V2FybmluZ0xldmVsID0gUmVzb3VyY2VzLmdldFN5c3RlbSgpLmdldEludGVnZXIoCiAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZXMuZ2V0U3lzdGVtKCkuZ2V0SWRlbnRpZmllcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbmZpZ19sb3dCYXR0ZXJ5V2FybmluZ0xldmVsIiwgImludGVnZXIiLCAiYW5kcm9pZCIpKTsKKyAgICAgICAgLy8gRGlzYWJsZSBwb3dlciBzYXZlIG1vZGUgYXMgc29tZSBkZXZpY2VzIG1heSB0dXJuIG9mZiBBbmRyb2lkIHdoZW4gcG93ZXIgc2F2ZSBtb2RlIGlzCisgICAgICAgIC8vIGVuYWJsZWQsIGNhdXNpbmcgdGhlIHRlc3QgdG8gZmFpbC4KKyAgICAgICAgbVByZXZpb3VzTG93UG93ZXJUcmlnZ2VyTGV2ZWwgPSBTZXR0aW5ncy5HbG9iYWwuZ2V0SW50KGdldENvbnRleHQoKS5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5HbG9iYWwuTE9XX1BPV0VSX01PREVfVFJJR0dFUl9MRVZFTCwgLTEpOworICAgICAgICBTZXR0aW5ncy5HbG9iYWwucHV0SW50KGdldENvbnRleHQoKS5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5HbG9iYWwuTE9XX1BPV0VSX01PREVfVFJJR0dFUl9MRVZFTCwgMCk7CisKICAgICAgICAgbUJ1aWxkZXIgPSBuZXcgSm9iSW5mby5CdWlsZGVyKEJBVFRFUllfSk9CX0lELCBrSm9iU2VydmljZUNvbXBvbmVudCk7CiAgICAgICAgIFN5c3RlbVV0aWwucnVuU2hlbGxDb21tYW5kKGdldEluc3RydW1lbnRhdGlvbigpLCAiY21kIGpvYnNjaGVkdWxlciBtb25pdG9yLWJhdHRlcnkgb24iKTsKICAgICB9CkBAIC02Nyw2ICs4NCwyNSBAQAogICAgICAgICAvLyBQdXQgYmF0dGVyeSBzZXJ2aWNlIGJhY2sgaW4gdG8gbm9ybWFsIG9wZXJhdGlvbi4KICAgICAgICAgU3lzdGVtVXRpbC5ydW5TaGVsbENvbW1hbmQoZ2V0SW5zdHJ1bWVudGF0aW9uKCksICJjbWQgam9ic2NoZWR1bGVyIG1vbml0b3ItYmF0dGVyeSBvZmYiKTsKICAgICAgICAgU3lzdGVtVXRpbC5ydW5TaGVsbENvbW1hbmQoZ2V0SW5zdHJ1bWVudGF0aW9uKCksICJjbWQgYmF0dGVyeSByZXNldCIpOworCisgICAgICAgIC8vIFJlc2V0IHBvd2VyIHNhdmUgbW9kZSB0byBpdHMgcHJldmlvdXMgc3RhdGUuCisgICAgICAgIGlmIChtUHJldmlvdXNMb3dQb3dlclRyaWdnZXJMZXZlbCA9PSAtMSkgeworICAgICAgICAgICAgU2V0dGluZ3MuR2xvYmFsLnB1dFN0cmluZyhnZXRDb250ZXh0KCkuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLkdsb2JhbC5MT1dfUE9XRVJfTU9ERV9UUklHR0VSX0xFVkVMLCBudWxsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFNldHRpbmdzLkdsb2JhbC5wdXRJbnQoZ2V0Q29udGV4dCgpLmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5HbG9iYWwuTE9XX1BPV0VSX01PREVfVFJJR0dFUl9MRVZFTCwgbVByZXZpb3VzTG93UG93ZXJUcmlnZ2VyTGV2ZWwpOworICAgICAgICB9CisgICAgfQorCisgICAgYm9vbGVhbiBoYXNCYXR0ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEludGVudCBiYXR0ZXJ5SW5mbyA9IGdldENvbnRleHQoKS5yZWdpc3RlclJlY2VpdmVyKAorICAgICAgICAgICAgICAgIG51bGwsIG5ldyBJbnRlbnRGaWx0ZXIoSW50ZW50LkFDVElPTl9CQVRURVJZX0NIQU5HRUQpKTsKKyAgICAgICAgYm9vbGVhbiBwcmVzZW50ID0gYmF0dGVyeUluZm8uZ2V0Qm9vbGVhbkV4dHJhKEJhdHRlcnlNYW5hZ2VyLkVYVFJBX1BSRVNFTlQsIHRydWUpOworICAgICAgICBpZiAoIXByZXNlbnQpIHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgIkRldmljZSBkb2Vzbid0IGhhdmUgYSBiYXR0ZXJ5LiIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwcmVzZW50OwogICAgIH0KIAogICAgIHZvaWQgc2V0QmF0dGVyeVN0YXRlKGJvb2xlYW4gcGx1Z2dlZCwgaW50IGxldmVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTk1LDcgKzEzMSw3IEBACiAgICAgICAgICAgICBpZiAoY3VyU2VxID09IHNlcSAmJiBjdXJDaGFyZ2luZyA9PSBwbHVnZ2VkKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlICgoU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCktc3RhcnRUaW1lKSA8IDUwMDApOworICAgICAgICB9IHdoaWxlICgoU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCkgLSBzdGFydFRpbWUpIDwgNTAwMCk7CiAKICAgICAgICAgZmFpbCgiVGltZWQgb3V0IHdhaXRpbmcgZm9yIGpvYiBzY2hlZHVsZXI6IGV4cGVjdGVkIHNlcT0iICsgc2VxICsgIiwgY3VyPSIgKyBjdXJTZXEKICAgICAgICAgICAgICAgICArICIsIHBsdWdnZWQ9IiArIHBsdWdnZWQgKyAiIGN1ckNoYXJnaW5nPSIgKyBjdXJDaGFyZ2luZyk7CkBAIC0xMTEsNiArMTQ3LDEwIEBACiAgICAgICAgIGJvb2xlYW4gY3VyTm90TG93ID0gQm9vbGVhbi5wYXJzZUJvb2xlYW4oU3lzdGVtVXRpbC5ydW5TaGVsbENvbW1hbmQoZ2V0SW5zdHJ1bWVudGF0aW9uKCksCiAgICAgICAgICAgICAgICAgImNtZCBqb2JzY2hlZHVsZXIgZ2V0LWJhdHRlcnktbm90LWxvdyIpLnRyaW0oKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhub3RMb3csIGN1ck5vdExvdyk7CisgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKEludGVudC5BQ1RJT05fQkFUVEVSWV9DSEFOR0VEKTsKKyAgICAgICAgSW50ZW50IGJhdHRlcnlTdGF0ZSA9IGdldENvbnRleHQoKS5yZWdpc3RlclJlY2VpdmVyKG51bGwsIGZpbHRlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhub3RMb3csCisgICAgICAgICAgICAgICAgIWJhdHRlcnlTdGF0ZS5nZXRCb29sZWFuRXh0cmEoQmF0dGVyeU1hbmFnZXIuRVhUUkFfQkFUVEVSWV9MT1csIG5vdExvdykpOwogICAgIH0KIAogICAgIFN0cmluZyBnZXRKb2JTdGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewpAQCAtMTI5LDYgKzE2OSwxMyBAQAogICAgICAgICBhc3NlcnRKb2JOb3RSZWFkeShCQVRURVJZX0pPQl9JRCk7CiAgICAgfQogCisgICAgc3RhdGljIHZvaWQgd2FpdEZvcihsb25nIHdhaXRNaWxsaXMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBsb25nIGRlYWRsaW5lID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkgKyB3YWl0TWlsbGlzOworICAgICAgICBkbyB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNTAwTCk7CisgICAgICAgIH0gd2hpbGUgKFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpIDwgZGVhZGxpbmUpOworICAgIH0KKwogICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgLy8gUG9zaXRpdmVzIC0gc2NoZWR1bGUgam9icyB1bmRlciBjb25kaXRpb25zIHRoYXQgcmVxdWlyZSB0aGVtIHRvIHBhc3MuCiAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTE1Nyw2ICsyMDQsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHRlc3RCYXR0ZXJ5Tm90TG93Q29uc3RyYWludEV4ZWN1dGVzX3dpdGhQb3dlcigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBzZXRCYXR0ZXJ5U3RhdGUodHJ1ZSwgMTAwKTsKKyAgICAgICAgd2FpdEZvcigyXzAwMCk7CiAgICAgICAgIHZlcmlmeUNoYXJnaW5nU3RhdGUodHJ1ZSk7CiAgICAgICAgIHZlcmlmeUJhdHRlcnlOb3RMb3dTdGF0ZSh0cnVlKTsKIApAQCAtMTc1LDcgKzIyMywxMyBAQAogICAgICAqIG5vdCBwbHVnZ2VkIGluIGJ1dCBoYXMgc3VmZmljaWVudCBwb3dlci4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB0ZXN0QmF0dGVyeU5vdExvd0NvbnN0cmFpbnRFeGVjdXRlc193aXRob3V0UG93ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gIldpdGhvdXQgcG93ZXIiIHRlc3QgY2FzZSBpcyB2YWxpZCBvbmx5IGZvciBkZXZpY2VzIHdpdGggYSBiYXR0ZXJ5LgorICAgICAgICBpZiAoIWhhc0JhdHRlcnkoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKICAgICAgICAgc2V0QmF0dGVyeVN0YXRlKGZhbHNlLCAxMDApOworICAgICAgICB3YWl0Rm9yKDJfMDAwKTsKICAgICAgICAgdmVyaWZ5Q2hhcmdpbmdTdGF0ZShmYWxzZSk7CiAgICAgICAgIHZlcmlmeUJhdHRlcnlOb3RMb3dTdGF0ZSh0cnVlKTsKIApAQCAtMTk4LDYgKzI1MiwxMSBAQAogICAgICAqIHRoZSBkZXZpY2UgaXMgbm90IG9uIHBvd2VyLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHRlc3RDaGFyZ2luZ0NvbnN0cmFpbnRGYWlscygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyAiV2l0aG91dCBwb3dlciIgdGVzdCBjYXNlIGlzIHZhbGlkIG9ubHkgZm9yIGRldmljZXMgd2l0aCBhIGJhdHRlcnkuCisgICAgICAgIGlmICghaGFzQmF0dGVyeSgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKwogICAgICAgICBzZXRCYXR0ZXJ5U3RhdGUoZmFsc2UsIDEwMCk7CiAgICAgICAgIHZlcmlmeUNoYXJnaW5nU3RhdGUoZmFsc2UpOwogCkBAIC0yMzcsNyArMjk2LDIyIEBACiAgICAgICogdGhlIGJhdHRlcnkgbGV2ZWwgaXMgY3JpdGljYWwgYW5kIG5vdCBvbiBwb3dlci4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB0ZXN0QmF0dGVyeU5vdExvd0NvbnN0cmFpbnRGYWlsc193aXRob3V0UG93ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gIldpdGhvdXQgcG93ZXIiIHRlc3QgY2FzZSBpcyB2YWxpZCBvbmx5IGZvciBkZXZpY2VzIHdpdGggYSBiYXR0ZXJ5LgorICAgICAgICBpZiAoIWhhc0JhdHRlcnkoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2tpcCB0aGlzIHRlc3Qgb24gcHJvZHVjdHMgdGhhdCBkbyBub3Qgc3VwcG9ydCBhIGxvdyBiYXR0ZXJ5IHN0YXRlCisgICAgICAgIGlmIChtTG93QmF0dGVyeVdhcm5pbmdMZXZlbCA8PSAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKwogICAgICAgICBzZXRCYXR0ZXJ5U3RhdGUoZmFsc2UsIG1Mb3dCYXR0ZXJ5V2FybmluZ0xldmVsKTsKKworICAgICAgICAvLyBzZXRCYXR0ZXJ5U3RhdGUoKSB3YWl0ZWQgZm9yIHRoZSBjaGFyZ2luZy9ub3QtY2hhcmdpbmcgc3RhdGUgdG8gZm9ybWFsbHkgc2V0dGxlLAorICAgICAgICAvLyBidXQgYmF0dGVyeSBsZXZlbCByZXBvcnRpbmcgbGFncyBiZWhpbmQgdGhhdC4gIHdhaXQgYSBtb21lbnQgdG8gbGV0IHRoYXQgaGFwcGVuCisgICAgICAgIC8vIGJlZm9yZSBwcm9jZWVkaW5nLgorICAgICAgICB3YWl0Rm9yKDJfMDAwKTsKICAgICAgICAgdmVyaWZ5Q2hhcmdpbmdTdGF0ZShmYWxzZSk7CiAgICAgICAgIHZlcmlmeUJhdHRlcnlOb3RMb3dTdGF0ZShmYWxzZSk7CiAKQEAgLTI1OCw2ICszMzIsNyBAQAogICAgICAgICBrVGVzdEVudmlyb25tZW50LnNldEV4cGVjdGVkV2FpdEZvclJ1bigpOwogICAgICAgICBrVGVzdEVudmlyb25tZW50LnNldENvbnRpbnVlQWZ0ZXJTdGFydCgpOwogICAgICAgICBzZXRCYXR0ZXJ5U3RhdGUoZmFsc2UsIDUwKTsKKyAgICAgICAgd2FpdEZvcigyXzAwMCk7CiAgICAgICAgIHZlcmlmeUNoYXJnaW5nU3RhdGUoZmFsc2UpOwogICAgICAgICB2ZXJpZnlCYXR0ZXJ5Tm90TG93U3RhdGUodHJ1ZSk7CiAgICAgICAgIGtUZXN0RW52aXJvbm1lbnQuc2V0RXhwZWN0ZWRTdG9wcGVkKCk7CkBAIC0yNjksNiArMzQ0LDcgQEAKICAgICAgICAgLy8gQW5kIGNoZWNrIHRoYXQgdGhlIGpvYiBpcyBzdG9wcGVkIGlmIGJhdHRlcnkgZ29lcyBsb3cgYWdhaW4uCiAgICAgICAgIHNldEJhdHRlcnlTdGF0ZShmYWxzZSwgbUxvd0JhdHRlcnlXYXJuaW5nTGV2ZWwpOwogICAgICAgICBzZXRCYXR0ZXJ5U3RhdGUoZmFsc2UsIG1Mb3dCYXR0ZXJ5V2FybmluZ0xldmVsIC0gMSk7CisgICAgICAgIHdhaXRGb3IoMl8wMDApOwogICAgICAgICB2ZXJpZnlDaGFyZ2luZ1N0YXRlKGZhbHNlKTsKICAgICAgICAgdmVyaWZ5QmF0dGVyeU5vdExvd1N0YXRlKGZhbHNlKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiSm9iIHdpdGggbm90IGxvdyBjb25zdHJhaW50IGRpZCBub3Qgc3RvcCB3aGVuIGJhdHRlcnkgd2VudCBsb3cuIiwKZGlmZiAtLWdpdCBhL3Rlc3RzL0pvYlNjaGVkdWxlci9zcmMvYW5kcm9pZC9qb2JzY2hlZHVsZXIvY3RzL0NsaXBEYXRhSm9iVGVzdC5qYXZhIGIvdGVzdHMvSm9iU2NoZWR1bGVyL3NyYy9hbmRyb2lkL2pvYnNjaGVkdWxlci9jdHMvQ2xpcERhdGFKb2JUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZDk0MWUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvSm9iU2NoZWR1bGVyL3NyYy9hbmRyb2lkL2pvYnNjaGVkdWxlci9jdHMvQ2xpcERhdGFKb2JUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5qb2JzY2hlZHVsZXIuY3RzOwotCi0KLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uVGFyZ2V0QXBpOwotaW1wb3J0IGFuZHJvaWQuYXBwLmpvYi5Kb2JJbmZvOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXJDbGllbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOwotCi0vKioKLSAqIFNjaGVkdWxlcyBqb2JzIHdpdGggdGhlIHtAbGluayBhbmRyb2lkLmFwcC5qb2IuSm9iU2NoZWR1bGVyfSB0aGF0IGdyYW50IHBlcm1pc3Npb25zIHRocm91Z2gKLSAqIENsaXBEYXRhLgotICovCi1AVGFyZ2V0QXBpKDI2KQotcHVibGljIGNsYXNzIENsaXBEYXRhSm9iVGVzdCBleHRlbmRzIENvbnN0cmFpbnRUZXN0IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkNsaXBEYXRhSm9iVGVzdCI7Ci0KLSAgICAvKiogVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBqb2Igc2NoZWR1bGVkIGJ5IHRoaXMgc3VpdGUgb2YgdGVzdHMuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJUF9EQVRBX0pPQl9JRCA9IENsaXBEYXRhSm9iVGVzdC5jbGFzcy5oYXNoQ29kZSgpOwotCi0gICAgSm9iSW5mby5CdWlsZGVyIG1CdWlsZGVyOwotICAgIHByaXZhdGUgQ29udGVudFByb3ZpZGVyQ2xpZW50IG1Qcm92aWRlcjsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0KLSAgICAgICAgbUJ1aWxkZXIgPSBuZXcgSm9iSW5mby5CdWlsZGVyKENMSVBfREFUQV9KT0JfSUQsIGtKb2JTZXJ2aWNlQ29tcG9uZW50KTsKLSAgICAgICAgbVByb3ZpZGVyID0gZ2V0Q29udGV4dCgpLmdldENvbnRlbnRSZXNvbHZlcigpLmFjcXVpcmVDb250ZW50UHJvdmlkZXJDbGllbnQobUZpcnN0VXJpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtUHJvdmlkZXIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgICAgIG1Qcm92aWRlci5jbG9zZSgpOwotICAgICAgICBtSm9iU2NoZWR1bGVyLmNhbmNlbChDTElQX0RBVEFfSk9CX0lEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGJhc2ljIGdyYW50aW5nIG9mIFVSSSBwZXJtaXNzaW9ucyBhc3NvY2lhdGVkIHdpdGggam9icy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xpcERhdGFHcmFudCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBTdGFydCBvdXQgd2l0aCBzdG9yYWdlIGxvdywgc28gam9iIGlzIGVucXVldWVkIGJ1dCBub3QgZXhlY3V0ZWQgeWV0LgotICAgICAgICBzZXRTdG9yYWdlU3RhdGUodHJ1ZSk7Ci0KLSAgICAgICAgLy8gV2UgbmVlZCB0byBnZXQgYSBwZXJtaXNzaW9uIGdyYW50IHNvIHRoYXQgd2UgY2FuIGdyYW50IGl0IHRvIG91cnNlbGYuCi0gICAgICAgIG1Qcm92aWRlci5jYWxsKCJncmFudCIsIE1ZX1BBQ0tBR0UsIG1GaXJzdFVyaUJ1bmRsZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhQYWNrYWdlTWFuYWdlci5QRVJNSVNTSU9OX0dSQU5URUQsCi0gICAgICAgICAgICAgICAgZ2V0Q29udGV4dCgpLmNoZWNrVXJpUGVybWlzc2lvbihtRmlyc3RVcmksIFByb2Nlc3MubXlQaWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFByb2Nlc3MubXlVaWQoKSwgSW50ZW50LkZMQUdfR1JBTlRfUkVBRF9VUklfUEVSTUlTU0lPTikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoUGFja2FnZU1hbmFnZXIuUEVSTUlTU0lPTl9HUkFOVEVELAotICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5jaGVja1VyaVBlcm1pc3Npb24obUZpcnN0VXJpLCBQcm9jZXNzLm15UGlkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBQcm9jZXNzLm15VWlkKCksIEludGVudC5GTEFHX0dSQU5UX1dSSVRFX1VSSV9QRVJNSVNTSU9OKSk7Ci0KLSAgICAgICAgLy8gU2NoZWR1bGUgdGhlIGpvYiwgdGhlIHN5c3RlbSBzaG91bGQgbm93IGFsc28gYmUgaG9sZGluZyBhIFVSSSBncmFudCBmb3IgdXMuCi0gICAgICAgIGtUZXN0RW52aXJvbm1lbnQuc2V0RXhwZWN0ZWRFeGVjdXRpb25zKDEpOwotICAgICAgICBtSm9iU2NoZWR1bGVyLnNjaGVkdWxlKG1CdWlsZGVyLnNldFJlcXVpcmVzU3RvcmFnZU5vdExvdyh0cnVlKQotICAgICAgICAgICAgICAgIC5zZXRDbGlwRGF0YShtRmlyc3RDbGlwRGF0YSwgSW50ZW50LkZMQUdfR1JBTlRfUkVBRF9VUklfUEVSTUlTU0lPTgotICAgICAgICAgICAgICAgICAgICAgICAgfCBJbnRlbnQuRkxBR19HUkFOVF9XUklURV9VUklfUEVSTUlTU0lPTikuYnVpbGQoKSk7Ci0KLSAgICAgICAgLy8gUmVtb3ZlIHRoZSBleHBsaWNpdCBncmFudCwgd2Ugc2hvdWxkIHN0aWxsIGhhdmUgYSBncmFudCBkdWUgdG8gdGhlIGpvYi4KLSAgICAgICAgbVByb3ZpZGVyLmNhbGwoInJldm9rZSIsIE1ZX1BBQ0tBR0UsIG1GaXJzdFVyaUJ1bmRsZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhQYWNrYWdlTWFuYWdlci5QRVJNSVNTSU9OX0dSQU5URUQsCi0gICAgICAgICAgICAgICAgZ2V0Q29udGV4dCgpLmNoZWNrVXJpUGVybWlzc2lvbihtRmlyc3RVcmksIFByb2Nlc3MubXlQaWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFByb2Nlc3MubXlVaWQoKSwgSW50ZW50LkZMQUdfR1JBTlRfUkVBRF9VUklfUEVSTUlTU0lPTikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoUGFja2FnZU1hbmFnZXIuUEVSTUlTU0lPTl9HUkFOVEVELAotICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5jaGVja1VyaVBlcm1pc3Npb24obUZpcnN0VXJpLCBQcm9jZXNzLm15UGlkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBQcm9jZXNzLm15VWlkKCksIEludGVudC5GTEFHX0dSQU5UX1dSSVRFX1VSSV9QRVJNSVNTSU9OKSk7Ci0KLSAgICAgICAgLy8gTm93IGFsbG93IHRoZSBqb2IgdG8gcnVuIGFuZCB3YWl0IGZvciBpdC4KLSAgICAgICAgc2V0U3RvcmFnZVN0YXRlKGZhbHNlKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiSm9iIHdpdGggc3RvcmFnZSBub3QgbG93IGNvbnN0cmFpbnQgZGlkIG5vdCBmaXJlIHdoZW4gc3RvcmFnZSBub3QgbG93LiIsCi0gICAgICAgICAgICAgICAga1Rlc3RFbnZpcm9ubWVudC5hd2FpdEV4ZWN1dGlvbigpKTsKLQotICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGpvYiBzdGlsbCBoYWQgdGhlIHBlcm1pc3Npb24gZ3JhbnRlZC4KLSAgICAgICAgYXNzZXJ0RXF1YWxzKFBhY2thZ2VNYW5hZ2VyLlBFUk1JU1NJT05fR1JBTlRFRCwga1Rlc3RFbnZpcm9ubWVudC5nZXRMYXN0UGVybUNoZWNrUmVhZCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFBhY2thZ2VNYW5hZ2VyLlBFUk1JU1NJT05fR1JBTlRFRCwga1Rlc3RFbnZpcm9ubWVudC5nZXRMYXN0UGVybUNoZWNrV3JpdGUoKSk7Ci0KLSAgICAgICAgLy8gQW5kIHdhaXQgZm9yIGV2ZXJ5dGhpbmcgdG8gYmUgY2xlYW5lZCB1cC4KLSAgICAgICAgd2FpdFBlcm1pc3Npb25SZXZva2UobUZpcnN0VXJpLCBJbnRlbnQuRkxBR19HUkFOVF9XUklURV9VUklfUEVSTUlTU0lPTiwgNTAwMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCB0aGF0IHdlIGNvcnJlY3RseSBmYWlsIHdoZW4gdHJ5aW5nIHRvIGdyYW50IHBlcm1pc3Npb25zIHRvIHRoaW5ncyB3ZSBkb24ndAotICAgICAqIGhhdmUgYWNjZXNzIHRvLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RDbGlwRGF0YUdyYW50X0ZhaWxlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgbUpvYlNjaGVkdWxlci5zY2hlZHVsZShtQnVpbGRlci5zZXRSZXF1aXJlc1N0b3JhZ2VOb3RMb3codHJ1ZSkKLSAgICAgICAgICAgICAgICAgICAgLnNldENsaXBEYXRhKG1GaXJzdENsaXBEYXRhLCBJbnRlbnQuRkxBR19HUkFOVF9SRUFEX1VSSV9QRVJNSVNTSU9OCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBJbnRlbnQuRkxBR19HUkFOVF9XUklURV9VUklfUEVSTUlTU0lPTikuYnVpbGQoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGZhaWwoIlNlY3VyaXR5IGV4Y2VwdGlvbiBub3QgdGhyb3duIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBiYXNpYyBncmFudGluZyBvZiBVUkkgcGVybWlzc2lvbnMgYXNzb2NpYXRlZCB3aXRoIGpvYnMgYW5kIGFyZSBjb3JyZWN0bHkKLSAgICAgKiByZXRhaW5lZCB3aGVuIHJlc2NoZWR1bGluZyB0aGUgam9iLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RDbGlwRGF0YUdyYW50UmVzY2hlZHVsZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBXZSBuZWVkIHRvIGdldCBhIHBlcm1pc3Npb24gZ3JhbnQgc28gdGhhdCB3ZSBjYW4gZ3JhbnQgaXQgdG8gb3Vyc2VsZi4KLSAgICAgICAgbVByb3ZpZGVyLmNhbGwoImdyYW50IiwgTVlfUEFDS0FHRSwgbUZpcnN0VXJpQnVuZGxlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFBhY2thZ2VNYW5hZ2VyLlBFUk1JU1NJT05fR1JBTlRFRCwKLSAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuY2hlY2tVcmlQZXJtaXNzaW9uKG1GaXJzdFVyaSwgUHJvY2Vzcy5teVBpZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgUHJvY2Vzcy5teVVpZCgpLCBJbnRlbnQuRkxBR19HUkFOVF9SRUFEX1VSSV9QRVJNSVNTSU9OKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhQYWNrYWdlTWFuYWdlci5QRVJNSVNTSU9OX0dSQU5URUQsCi0gICAgICAgICAgICAgICAgZ2V0Q29udGV4dCgpLmNoZWNrVXJpUGVybWlzc2lvbihtRmlyc3RVcmksIFByb2Nlc3MubXlQaWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFByb2Nlc3MubXlVaWQoKSwgSW50ZW50LkZMQUdfR1JBTlRfV1JJVEVfVVJJX1BFUk1JU1NJT04pKTsKLQotICAgICAgICAvLyBTY2hlZHVsZSB0aGUgam9iLCB0aGUgc3lzdGVtIHNob3VsZCBub3cgYWxzbyBiZSBob2xkaW5nIGEgVVJJIGdyYW50IGZvciB1cy4KLSAgICAgICAga1Rlc3RFbnZpcm9ubWVudC5zZXRFeHBlY3RlZEV4ZWN1dGlvbnMoMSk7Ci0gICAgICAgIG1Kb2JTY2hlZHVsZXIuc2NoZWR1bGUobUJ1aWxkZXIuc2V0TWluaW11bUxhdGVuY3koNjAqNjAqMTAwMCkKLSAgICAgICAgICAgICAgICAuc2V0Q2xpcERhdGEobUZpcnN0Q2xpcERhdGEsIEludGVudC5GTEFHX0dSQU5UX1JFQURfVVJJX1BFUk1JU1NJT04KLSAgICAgICAgICAgICAgICAgICAgICAgIHwgSW50ZW50LkZMQUdfR1JBTlRfV1JJVEVfVVJJX1BFUk1JU1NJT04pLmJ1aWxkKCkpOwotCi0gICAgICAgIC8vIFJlbW92ZSB0aGUgZXhwbGljaXQgZ3JhbnQsIHdlIHNob3VsZCBzdGlsbCBoYXZlIGEgZ3JhbnQgZHVlIHRvIHRoZSBqb2IuCi0gICAgICAgIG1Qcm92aWRlci5jYWxsKCJyZXZva2UiLCBNWV9QQUNLQUdFLCBtRmlyc3RVcmlCdW5kbGUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoUGFja2FnZU1hbmFnZXIuUEVSTUlTU0lPTl9HUkFOVEVELAotICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5jaGVja1VyaVBlcm1pc3Npb24obUZpcnN0VXJpLCBQcm9jZXNzLm15UGlkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBQcm9jZXNzLm15VWlkKCksIEludGVudC5GTEFHX0dSQU5UX1JFQURfVVJJX1BFUk1JU1NJT04pKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFBhY2thZ2VNYW5hZ2VyLlBFUk1JU1NJT05fR1JBTlRFRCwKLSAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuY2hlY2tVcmlQZXJtaXNzaW9uKG1GaXJzdFVyaSwgUHJvY2Vzcy5teVBpZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgUHJvY2Vzcy5teVVpZCgpLCBJbnRlbnQuRkxBR19HUkFOVF9XUklURV9VUklfUEVSTUlTU0lPTikpOwotCi0gICAgICAgIC8vIE5vdyByZXNjaGVkdWxlIHRoZSBqb2IgdG8gaGF2ZSBpdCBoYXBwZW4gcmlnaHQgbm93LgotICAgICAgICBtSm9iU2NoZWR1bGVyLnNjaGVkdWxlKG1CdWlsZGVyLnNldE1pbmltdW1MYXRlbmN5KDApCi0gICAgICAgICAgICAgICAgLnNldENsaXBEYXRhKG1GaXJzdENsaXBEYXRhLCBJbnRlbnQuRkxBR19HUkFOVF9SRUFEX1VSSV9QRVJNSVNTSU9OCi0gICAgICAgICAgICAgICAgICAgICAgICB8IEludGVudC5GTEFHX0dSQU5UX1dSSVRFX1VSSV9QRVJNSVNTSU9OKS5idWlsZCgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiSm9iIHdpdGggc3RvcmFnZSBub3QgbG93IGNvbnN0cmFpbnQgZGlkIG5vdCBmaXJlIHdoZW4gc3RvcmFnZSBub3QgbG93LiIsCi0gICAgICAgICAgICAgICAga1Rlc3RFbnZpcm9ubWVudC5hd2FpdEV4ZWN1dGlvbigpKTsKLQotICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGpvYiBzdGlsbCBoYWQgdGhlIHBlcm1pc3Npb24gZ3JhbnRlZC4KLSAgICAgICAgYXNzZXJ0RXF1YWxzKFBhY2thZ2VNYW5hZ2VyLlBFUk1JU1NJT05fR1JBTlRFRCwga1Rlc3RFbnZpcm9ubWVudC5nZXRMYXN0UGVybUNoZWNrUmVhZCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFBhY2thZ2VNYW5hZ2VyLlBFUk1JU1NJT05fR1JBTlRFRCwga1Rlc3RFbnZpcm9ubWVudC5nZXRMYXN0UGVybUNoZWNrV3JpdGUoKSk7Ci0KLSAgICAgICAgLy8gQW5kIHdhaXQgZm9yIGV2ZXJ5dGhpbmcgdG8gYmUgY2xlYW5lZCB1cC4KLSAgICAgICAgd2FpdFBlcm1pc3Npb25SZXZva2UobUZpcnN0VXJpLCBJbnRlbnQuRkxBR19HUkFOVF9XUklURV9VUklfUEVSTUlTU0lPTiwgNTAwMCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvSm9iU2NoZWR1bGVyL3NyYy9hbmRyb2lkL2pvYnNjaGVkdWxlci9jdHMvQ29ubmVjdGl2aXR5Q29uc3RyYWludFRlc3QuamF2YSBiL3Rlc3RzL0pvYlNjaGVkdWxlci9zcmMvYW5kcm9pZC9qb2JzY2hlZHVsZXIvY3RzL0Nvbm5lY3Rpdml0eUNvbnN0cmFpbnRUZXN0LmphdmEKaW5kZXggNDQ4NmMxNS4uZTA5MmEwZCAxMDA2NDQKLS0tIGEvdGVzdHMvSm9iU2NoZWR1bGVyL3NyYy9hbmRyb2lkL2pvYnNjaGVkdWxlci9jdHMvQ29ubmVjdGl2aXR5Q29uc3RyYWludFRlc3QuamF2YQorKysgYi90ZXN0cy9Kb2JTY2hlZHVsZXIvc3JjL2FuZHJvaWQvam9ic2NoZWR1bGVyL2N0cy9Db25uZWN0aXZpdHlDb25zdHJhaW50VGVzdC5qYXZhCkBAIC0xMTQsNiArMTE0LDggQEAKICAgICAgICAgICAgICAgICBtV2lmaU1hbmFnZXIuaXNXaWZpRW5hYmxlZCgpID09IG1Jbml0aWFsV2lGaVN0YXRlKTsKIAogICAgICAgICBtQ29udGV4dC51bnJlZ2lzdGVyUmVjZWl2ZXIocmVjZWl2ZXIpOworCisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CiAgICAgfQogCiAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3RzL0pvYlNjaGVkdWxlci9zcmMvYW5kcm9pZC9qb2JzY2hlZHVsZXIvY3RzL0NvbnN0cmFpbnRUZXN0LmphdmEgYi90ZXN0cy9Kb2JTY2hlZHVsZXIvc3JjL2FuZHJvaWQvam9ic2NoZWR1bGVyL2N0cy9Db25zdHJhaW50VGVzdC5qYXZhCmluZGV4IGYzYTg5NWUuLmJlZDBkMDcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0pvYlNjaGVkdWxlci9zcmMvYW5kcm9pZC9qb2JzY2hlZHVsZXIvY3RzL0NvbnN0cmFpbnRUZXN0LmphdmEKKysrIGIvdGVzdHMvSm9iU2NoZWR1bGVyL3NyYy9hbmRyb2lkL2pvYnNjaGVkdWxlci9jdHMvQ29uc3RyYWludFRlc3QuamF2YQpAQCAtNDEsMTAgKzQxLDYgQEAKICAqLwogQFRhcmdldEFwaSgyMSkKIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb25zdHJhaW50VGVzdCBleHRlbmRzIEluc3RydW1lbnRhdGlvblRlc3RDYXNlIHsKLSAgICAvKiogRm9yY2UgdGhlIHNjaGVkdWxlciB0byBjb25zaWRlciB0aGUgZGV2aWNlIHRvIGJlIG9uIHN0YWJsZSBjaGFyZ2luZy4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJbnRlbnQgRVhQRURJVEVfU1RBQkxFX0NIQVJHSU5HID0KLSAgICAgICAgICAgIG5ldyBJbnRlbnQoImNvbS5hbmRyb2lkLnNlcnZlci50YXNrLmNvbnRyb2xsZXJzLkJhdHRlcnlDb250cm9sbGVyLkFDVElPTl9DSEFSR0lOR19TVEFCTEUiKTsKLQogICAgIC8qKiBFbnZpcm9ubWVudCB0aGF0IG5vdGlmaWVzIG9mIEpvYlNjaGVkdWxlciBjYWxsYmFja3MuICovCiAgICAgc3RhdGljIE1vY2tKb2JTZXJ2aWNlLlRlc3RFbnZpcm9ubWVudCBrVGVzdEVudmlyb25tZW50ID0KICAgICAgICAgICAgIE1vY2tKb2JTZXJ2aWNlLlRlc3RFbnZpcm9ubWVudC5nZXRUZXN0RW52aXJvbm1lbnQoKTsKQEAgLTExMiw2ICsxMDgsNyBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3lzdGVtVXRpbC5ydW5TaGVsbENvbW1hbmQoZ2V0SW5zdHJ1bWVudGF0aW9uKCksICJjbWQgYmF0dGVyeSByZXNldCIpOwogICAgICAgICBpZiAobVN0b3JhZ2VTdGF0ZUNoYW5nZWQpIHsKICAgICAgICAgICAgIC8vIFB1dCBzdG9yYWdlIHNlcnZpY2UgYmFjayBpbiB0byBub3JtYWwgb3BlcmF0aW9uLgogICAgICAgICAgICAgU3lzdGVtVXRpbC5ydW5TaGVsbENvbW1hbmQoZ2V0SW5zdHJ1bWVudGF0aW9uKCksICJjbWQgZGV2aWNlc3RvcmFnZW1vbml0b3IgcmVzZXQiKTsKQEAgLTEyNCw4ICsxMjEsMTEgQEAKICAgICAgKiBjb25zaWRlcmVkIHRvIGJlIG9uIHN0YWJsZSBwb3dlciAtIHRoYXQgaXMsIHBsdWdnZWQgaW4gZm9yIGEgcGVyaW9kIG9mIDIgbWludXRlcy4KICAgICAgKiBSYXRoZXIgdGhhbiB3YWl0IGZvciB0aGlzIHRvIGhhcHBlbiwgd2UgY2hlYXQgYW5kIHNlbmQgdGhpcyBicm9hZGNhc3QgaW5zdGVhZC4KICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kRXhwZWRpdGVTdGFibGVDaGFyZ2luZ0Jyb2FkY2FzdCgpIHsKLSAgICAgICAgZ2V0Q29udGV4dCgpLnNlbmRCcm9hZGNhc3QoRVhQRURJVEVfU1RBQkxFX0NIQVJHSU5HKTsKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kRXhwZWRpdGVTdGFibGVDaGFyZ2luZ0Jyb2FkY2FzdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBGYWtpbmcgdGhlIGRldmljZSB0byBiZSA5MCUgY2hhcmdpbmcgYW5kIHRoZW4gdG8gYmUgOTElLCBzbyB0aGF0IGl0IHRyaWdnZXJzCisgICAgICAgIC8vIEJhdHRlcnlNYW5hZ2VyLkFDVElPTl9DSEFSR0lORyBpbiB0aGUgdXB3YXJkIGNoYW5nZS1sZXZlbCB0cmFuc2l0aW9uIGxvZ2ljLgorICAgICAgICBTeXN0ZW1VdGlsLnJ1blNoZWxsQ29tbWFuZChnZXRJbnN0cnVtZW50YXRpb24oKSwgImNtZCBiYXR0ZXJ5IHNldCBsZXZlbCA5MCIpOworICAgICAgICBTeXN0ZW1VdGlsLnJ1blNoZWxsQ29tbWFuZChnZXRJbnN0cnVtZW50YXRpb24oKSwgImNtZCBiYXR0ZXJ5IHNldCBsZXZlbCA5MSIpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGFzc2VydEhhc1VyaVBlcm1pc3Npb24oVXJpIHVyaSwgaW50IGdyYW50RmxhZ3MpIHsKQEAgLTE4NCw4ICsxODQsOCBAQAogCiAgICAgU3RyaW5nIGdldEpvYlN0YXRlKGludCBqb2JJZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBTeXN0ZW1VdGlsLnJ1blNoZWxsQ29tbWFuZChnZXRJbnN0cnVtZW50YXRpb24oKSwKLSAgICAgICAgICAgICAgICAiY21kIGpvYnNjaGVkdWxlciBnZXQtam9iLXN0YXRlICIgKyBrSm9iU2VydmljZUNvbXBvbmVudC5nZXRQYWNrYWdlTmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgIiArIGpvYklkKS50cmltKCk7CisgICAgICAgICAgICAgICAgImNtZCBqb2JzY2hlZHVsZXIgZ2V0LWpvYi1zdGF0ZSAtLXVzZXIgY3VyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsga0pvYlNlcnZpY2VDb21wb25lbnQuZ2V0UGFja2FnZU5hbWUoKSArICIgIiArIGpvYklkKS50cmltKCk7CiAgICAgfQogCiAgICAgdm9pZCBhc3NlcnRKb2JSZWFkeShpbnQgam9iSWQpIHRocm93cyBFeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvdGVzdHMvSm9iU2NoZWR1bGVyL3NyYy9hbmRyb2lkL2pvYnNjaGVkdWxlci9jdHMvRGV2aWNlSWRsZUpvYnNUZXN0LmphdmEgYi90ZXN0cy9Kb2JTY2hlZHVsZXIvc3JjL2FuZHJvaWQvam9ic2NoZWR1bGVyL2N0cy9EZXZpY2VJZGxlSm9ic1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjY5NGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSm9iU2NoZWR1bGVyL3NyYy9hbmRyb2lkL2pvYnNjaGVkdWxlci9jdHMvRGV2aWNlSWRsZUpvYnNUZXN0LmphdmEKQEAgLTAsMCArMSwzNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5qb2JzY2hlZHVsZXIuY3RzOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuam9ic2NoZWR1bGVyLmN0cy5qb2J0ZXN0YXBwLlRlc3RKb2JTZXJ2aWNlLkFDVElPTl9KT0JfU1RBUlRFRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5qb2JzY2hlZHVsZXIuY3RzLmpvYnRlc3RhcHAuVGVzdEpvYlNlcnZpY2UuQUNUSU9OX0pPQl9TVE9QUEVEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmpvYnNjaGVkdWxlci5jdHMuam9idGVzdGFwcC5UZXN0Sm9iU2VydmljZS5KT0JfUEFSQU1TX0VYVFJBX0tFWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5vcy5Qb3dlck1hbmFnZXIuQUNUSU9OX0RFVklDRV9JRExFX01PREVfQ0hBTkdFRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5vcy5Qb3dlck1hbmFnZXIuQUNUSU9OX0xJR0hUX0RFVklDRV9JRExFX01PREVfQ0hBTkdFRDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3N1bWUuYXNzdW1lVHJ1ZTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLmpvYi5Kb2JQYXJhbWV0ZXJzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5qb2JzY2hlZHVsZXIuY3RzLmpvYnRlc3RhcHAuVGVzdEFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuam9ic2NoZWR1bGVyLmN0cy5qb2J0ZXN0YXBwLlRlc3RKb2JTY2hlZHVsZXJSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlBvd2VyTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLlVpRGV2aWNlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5MYXJnZVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQXBwU3RhbmRieVV0aWxzOworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworCisvKioKKyAqIFRlc3RzIHRoYXQgdGVtcCB3aGl0ZWxpc3RlZCBhcHBzIGNhbiBydW4gam9icyBpZiBhbGwgdGhlIG90aGVyIGNvbnN0cmFpbnRzIGFyZSBtZXQKKyAqLworQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKK0BMYXJnZVRlc3QKK3B1YmxpYyBjbGFzcyBEZXZpY2VJZGxlSm9ic1Rlc3QgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBEZXZpY2VJZGxlSm9ic1Rlc3QuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0FQUF9QQUNLQUdFID0gImFuZHJvaWQuam9ic2NoZWR1bGVyLmN0cy5qb2J0ZXN0YXBwIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9BUFBfUkVDRUlWRVIgPSBURVNUX0FQUF9QQUNLQUdFICsgIi5UZXN0Sm9iU2NoZWR1bGVyUmVjZWl2ZXIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0FQUF9BQ1RJVklUWSA9IFRFU1RfQVBQX1BBQ0tBR0UgKyAiLlRlc3RBY3Rpdml0eSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBCQUNLR1JPVU5EX0pPQlNfRVhQRUNURURfREVMQVkgPSAzXzAwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFBPTExfSU5URVJWQUwgPSA1MDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBERUZBVUxUX1dBSVRfVElNRU9VVCA9IDEwMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBTSEVMTF9USU1FT1VUID0gM18wMDA7CisKKyAgICBlbnVtIEJ1Y2tldCB7CisgICAgICAgIEFDVElWRSwKKyAgICAgICAgV09SS0lOR19TRVQsCisgICAgICAgIEZSRVFVRU5ULAorICAgICAgICBSQVJFLAorICAgICAgICBORVZFUgorICAgIH0KKworICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKKyAgICBwcml2YXRlIFVpRGV2aWNlIG1VaURldmljZTsKKyAgICBwcml2YXRlIFBvd2VyTWFuYWdlciBtUG93ZXJNYW5hZ2VyOworICAgIHByaXZhdGUgbG9uZyBtVGVtcFdoaXRlbGlzdEV4cGlyeUVsYXBzZWQ7CisgICAgcHJpdmF0ZSBpbnQgbVRlc3RKb2JJZDsKKyAgICBwcml2YXRlIGludCBtVGVzdFBhY2thZ2VVaWQ7CisgICAgcHJpdmF0ZSBib29sZWFuIG1EZXZpY2VJbkRvemU7CisgICAgcHJpdmF0ZSBib29sZWFuIG1EZXZpY2VJZGxlRW5hYmxlZDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUFwcFN0YW5kYnlFbmFibGVkOworCisgICAgLyogYWNjZXNzZXMgbXVzdCBiZSBzeW5jaHJvbml6ZWQgb24gaXRzZWxmICovCisgICAgcHJpdmF0ZSBmaW5hbCBUZXN0Sm9iU3RhdHVzIG1UZXN0Sm9iU3RhdHVzID0gbmV3IFRlc3RKb2JTdGF0dXMoKTsKKyAgICBwcml2YXRlIGZpbmFsIEJyb2FkY2FzdFJlY2VpdmVyIG1SZWNlaXZlciA9IG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIlJlY2VpdmVkIGFjdGlvbiAiICsgaW50ZW50LmdldEFjdGlvbigpKTsKKyAgICAgICAgICAgIHN3aXRjaCAoaW50ZW50LmdldEFjdGlvbigpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBBQ1RJT05fSk9CX1NUQVJURUQ6CisgICAgICAgICAgICAgICAgY2FzZSBBQ1RJT05fSk9CX1NUT1BQRUQ6CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIEpvYlBhcmFtZXRlcnMgcGFyYW1zID0gaW50ZW50LmdldFBhcmNlbGFibGVFeHRyYShKT0JfUEFSQU1TX0VYVFJBX0tFWSk7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkpvYklkOiAiICsgcGFyYW1zLmdldEpvYklkKCkpOworICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1UZXN0Sm9iU3RhdHVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtVGVzdEpvYlN0YXR1cy5ydW5uaW5nID0gQUNUSU9OX0pPQl9TVEFSVEVELmVxdWFscyhpbnRlbnQuZ2V0QWN0aW9uKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbVRlc3RKb2JTdGF0dXMuam9iSWQgPSBwYXJhbXMuZ2V0Sm9iSWQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEFDVElPTl9ERVZJQ0VfSURMRV9NT0RFX0NIQU5HRUQ6CisgICAgICAgICAgICAgICAgY2FzZSBBQ1RJT05fTElHSFRfREVWSUNFX0lETEVfTU9ERV9DSEFOR0VEOgorICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKERldmljZUlkbGVKb2JzVGVzdC50aGlzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtRGV2aWNlSW5Eb3plID0gbVBvd2VyTWFuYWdlci5pc0RldmljZUlkbGVNb2RlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJtRGV2aWNlSW5Eb3plOiAiICsgbURldmljZUluRG96ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0RldmljZUlkbGVFbmFibGVkKFVpRGV2aWNlIHVpRGV2aWNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIG91dHB1dCA9IHVpRGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoImNtZCBkZXZpY2VpZGxlIGVuYWJsZWQgZGVlcCIpLnRyaW0oKTsKKyAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQob3V0cHV0KSAhPSAwOworICAgIH0KKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtQ29udGV4dCA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldFRhcmdldENvbnRleHQoKTsKKyAgICAgICAgbVVpRGV2aWNlID0gVWlEZXZpY2UuZ2V0SW5zdGFuY2UoSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkpOworICAgICAgICBtUG93ZXJNYW5hZ2VyID0gbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShQb3dlck1hbmFnZXIuY2xhc3MpOworICAgICAgICBtRGV2aWNlSW5Eb3plID0gbVBvd2VyTWFuYWdlci5pc0RldmljZUlkbGVNb2RlKCk7CisgICAgICAgIG1UZXN0UGFja2FnZVVpZCA9IG1Db250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCkuZ2V0UGFja2FnZVVpZChURVNUX0FQUF9QQUNLQUdFLCAwKTsKKyAgICAgICAgbVRlc3RKb2JJZCA9IChpbnQpIChTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSAvIDEwMDApOworICAgICAgICBtVGVzdEpvYlN0YXR1cy5yZXNldCgpOworICAgICAgICBtVGVtcFdoaXRlbGlzdEV4cGlyeUVsYXBzZWQgPSAtMTsKKyAgICAgICAgZmluYWwgSW50ZW50RmlsdGVyIGludGVudEZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKKyAgICAgICAgaW50ZW50RmlsdGVyLmFkZEFjdGlvbihBQ1RJT05fSk9CX1NUQVJURUQpOworICAgICAgICBpbnRlbnRGaWx0ZXIuYWRkQWN0aW9uKEFDVElPTl9KT0JfU1RPUFBFRCk7CisgICAgICAgIGludGVudEZpbHRlci5hZGRBY3Rpb24oQUNUSU9OX0RFVklDRV9JRExFX01PREVfQ0hBTkdFRCk7CisgICAgICAgIGludGVudEZpbHRlci5hZGRBY3Rpb24oQUNUSU9OX0xJR0hUX0RFVklDRV9JRExFX01PREVfQ0hBTkdFRCk7CisgICAgICAgIG1Db250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIobVJlY2VpdmVyLCBpbnRlbnRGaWx0ZXIpOworICAgICAgICBhc3NlcnRGYWxzZSgiVGVzdCBwYWNrYWdlIGFscmVhZHkgaW4gdGVtcCB3aGl0ZWxpc3QiLCBpc1Rlc3RBcHBUZW1wV2hpdGVsaXN0ZWQoKSk7CisgICAgICAgIG1ha2VUZXN0UGFja2FnZUlkbGUoKTsKKyAgICAgICAgbURldmljZUlkbGVFbmFibGVkID0gaXNEZXZpY2VJZGxlRW5hYmxlZChtVWlEZXZpY2UpOworICAgICAgICBtQXBwU3RhbmRieUVuYWJsZWQgPSBBcHBTdGFuZGJ5VXRpbHMuaXNBcHBTdGFuZGJ5RW5hYmxlZCgpOworICAgICAgICBpZiAobUFwcFN0YW5kYnlFbmFibGVkKSB7CisgICAgICAgICAgICBzZXRUZXN0UGFja2FnZVN0YW5kYnlCdWNrZXQoQnVja2V0LkFDVElWRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJBcHAgc3RhbmRieSBub3QgZW5hYmxlZCBvbiB0ZXN0IGRldmljZSIpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWxsb3dXaGlsZUlkbGVKb2JJblRlbXB3aGl0ZWxpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzdW1lVHJ1ZSgiZGV2aWNlIGlkbGUgbm90IGVuYWJsZWQiLCBtRGV2aWNlSWRsZUVuYWJsZWQpOworCisgICAgICAgIHRvZ2dsZURldmljZUlkbGVTdGF0ZSh0cnVlKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKERFRkFVTFRfV0FJVF9USU1FT1VUKTsKKyAgICAgICAgc2VuZFNjaGVkdWxlSm9iQnJvYWRjYXN0KHRydWUpOworICAgICAgICBhc3NlcnRGYWxzZSgiSm9iIHN0YXJ0ZWQgd2l0aG91dCBiZWluZyB0ZW1wd2hpdGVsaXN0ZWQiLCBhd2FpdEpvYlN0YXJ0KDVfMDAwKSk7CisgICAgICAgIHRlbXBXaGl0ZWxpc3RUZXN0QXBwKDVfMDAwKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiSm9iIHdpdGggYWxsb3dfd2hpbGVfaWRsZSBmbGFnIGRpZCBub3Qgc3RhcnQgd2hlbiB0aGUgYXBwIHdhcyB0ZW1wd2hpdGVsaXN0ZWQiLAorICAgICAgICAgICAgICAgIGF3YWl0Sm9iU3RhcnQoREVGQVVMVF9XQUlUX1RJTUVPVVQpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JlZ3JvdW5kSm9ic1N0YXJ0SW1tZWRpYXRlbHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzdW1lVHJ1ZSgiZGV2aWNlIGlkbGUgbm90IGVuYWJsZWQiLCBtRGV2aWNlSWRsZUVuYWJsZWQpOworCisgICAgICAgIHNlbmRTY2hlZHVsZUpvYkJyb2FkY2FzdChmYWxzZSk7CisgICAgICAgIGFzc2VydFRydWUoIkpvYiBkaWQgbm90IHN0YXJ0IGFmdGVyIHNjaGVkdWxpbmciLCBhd2FpdEpvYlN0YXJ0KERFRkFVTFRfV0FJVF9USU1FT1VUKSk7CisgICAgICAgIHRvZ2dsZURldmljZUlkbGVTdGF0ZSh0cnVlKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiSm9iIGRpZCBub3Qgc3RvcCBvbiBlbnRlcmluZyBkb3plIiwgYXdhaXRKb2JTdG9wKERFRkFVTFRfV0FJVF9USU1FT1VUKSk7CisgICAgICAgIFRocmVhZC5zbGVlcChUZXN0Sm9iU2NoZWR1bGVyUmVjZWl2ZXIuSk9CX0lOSVRJQUxfQkFDS09GRik7CisgICAgICAgIHN0YXJ0QW5kS2VlcFRlc3RBY3Rpdml0eSgpOworICAgICAgICB0b2dnbGVEZXZpY2VJZGxlU3RhdGUoZmFsc2UpOworICAgICAgICBhc3NlcnRUcnVlKCJKb2IgZm9yIGZvcmVncm91bmQgYXBwIGRpZCBub3Qgc3RhcnQgaW1tZWRpYXRlbHkgd2hlbiBkZXZpY2UgZXhpdGVkIGRvemUiLAorICAgICAgICAgICAgICAgIGF3YWl0Sm9iU3RhcnQoM18wMDApKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCYWNrZ3JvdW5kSm9ic0RlbGF5ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzdW1lVHJ1ZSgiZGV2aWNlIGlkbGUgbm90IGVuYWJsZWQiLCBtRGV2aWNlSWRsZUVuYWJsZWQpOworCisgICAgICAgIHNlbmRTY2hlZHVsZUpvYkJyb2FkY2FzdChmYWxzZSk7CisgICAgICAgIGFzc2VydFRydWUoIkpvYiBkaWQgbm90IHN0YXJ0IGFmdGVyIHNjaGVkdWxpbmciLCBhd2FpdEpvYlN0YXJ0KERFRkFVTFRfV0FJVF9USU1FT1VUKSk7CisgICAgICAgIHRvZ2dsZURldmljZUlkbGVTdGF0ZSh0cnVlKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiSm9iIGRpZCBub3Qgc3RvcCBvbiBlbnRlcmluZyBkb3plIiwgYXdhaXRKb2JTdG9wKERFRkFVTFRfV0FJVF9USU1FT1VUKSk7CisgICAgICAgIFRocmVhZC5zbGVlcChUZXN0Sm9iU2NoZWR1bGVyUmVjZWl2ZXIuSk9CX0lOSVRJQUxfQkFDS09GRik7CisgICAgICAgIHRvZ2dsZURldmljZUlkbGVTdGF0ZShmYWxzZSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJKb2IgZm9yIGJhY2tncm91bmQgYXBwIHN0YXJ0ZWQgaW1tZWRpYXRlbHkgd2hlbiBkZXZpY2UgZXhpdGVkIGRvemUiLAorICAgICAgICAgICAgICAgIGF3YWl0Sm9iU3RhcnQoREVGQVVMVF9XQUlUX1RJTUVPVVQpKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKEJBQ0tHUk9VTkRfSk9CU19FWFBFQ1RFRF9ERUxBWSAtIERFRkFVTFRfV0FJVF9USU1FT1VUKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiSm9iIGZvciBiYWNrZ3JvdW5kIGFwcCBkaWQgbm90IHN0YXJ0IGFmdGVyIHRoZSBleHBlY3RlZCBkZWxheSBvZiAiCisgICAgICAgICAgICAgICAgKyBCQUNLR1JPVU5EX0pPQlNfRVhQRUNURURfREVMQVkgKyAibXMiLCBhd2FpdEpvYlN0YXJ0KERFRkFVTFRfV0FJVF9USU1FT1VUKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Sm9ic0luTmV2ZXJBcHAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzdW1lVHJ1ZSgiYXBwIHN0YW5kYnkgbm90IGVuYWJsZWQiLCBtQXBwU3RhbmRieUVuYWJsZWQpOworCisgICAgICAgIGVudGVyRmFrZVVucGx1Z2dlZFN0YXRlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZXRUZXN0UGFja2FnZVN0YW5kYnlCdWNrZXQoQnVja2V0Lk5FVkVSKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChERUZBVUxUX1dBSVRfVElNRU9VVCk7CisgICAgICAgICAgICBzZW5kU2NoZWR1bGVKb2JCcm9hZGNhc3QoZmFsc2UpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoIk5ldyBqb2Igc3RhcnRlZCBpbiBORVZFUiBzdGFuZGJ5IiwgYXdhaXRKb2JTdGFydCgzXzAwMCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcmVzZXRGYWtlVW5wbHVnZ2VkU3RhdGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVpZEFjdGl2ZUJ5cGFzc2VzU3RhbmRieSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBlbnRlckZha2VVbnBsdWdnZWRTdGF0ZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2V0VGVzdFBhY2thZ2VTdGFuZGJ5QnVja2V0KEJ1Y2tldC5ORVZFUik7CisgICAgICAgICAgICB0ZW1wV2hpdGVsaXN0VGVzdEFwcCg2XzAwMCk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoREVGQVVMVF9XQUlUX1RJTUVPVVQpOworICAgICAgICAgICAgc2VuZFNjaGVkdWxlSm9iQnJvYWRjYXN0KGZhbHNlKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIk5ldyBqb2IgaW4gdWlkLWFjdGl2ZSBhcHAgZmFpbGVkIHRvIHN0YXJ0IGluIE5FVkVSIHN0YW5kYnkiLAorICAgICAgICAgICAgICAgICAgICBhd2FpdEpvYlN0YXJ0KDRfMDAwKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICByZXNldEZha2VVbnBsdWdnZWRTdGF0ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG1EZXZpY2VJZGxlRW5hYmxlZCkgeworICAgICAgICAgICAgdG9nZ2xlRGV2aWNlSWRsZVN0YXRlKGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBJbnRlbnQgY2FuY2VsSm9ic0ludGVudCA9IG5ldyBJbnRlbnQoVGVzdEpvYlNjaGVkdWxlclJlY2VpdmVyLkFDVElPTl9DQU5DRUxfSk9CUyk7CisgICAgICAgIGNhbmNlbEpvYnNJbnRlbnQuc2V0Q29tcG9uZW50KG5ldyBDb21wb25lbnROYW1lKFRFU1RfQVBQX1BBQ0tBR0UsIFRFU1RfQVBQX1JFQ0VJVkVSKSk7CisgICAgICAgIGNhbmNlbEpvYnNJbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOworICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0KGNhbmNlbEpvYnNJbnRlbnQpOworICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0KG5ldyBJbnRlbnQoVGVzdEFjdGl2aXR5LkFDVElPTl9GSU5JU0hfQUNUSVZJVFkpKTsKKyAgICAgICAgbUNvbnRleHQudW5yZWdpc3RlclJlY2VpdmVyKG1SZWNlaXZlcik7CisgICAgICAgIFRocmVhZC5zbGVlcCg1MDApOyAvLyBUbyBhdm9pZCBhbnkgcmFjZSBiZXR3ZWVuIHVucmVnaXN0ZXIgYW5kIHRoZSBuZXh0IHJlZ2lzdGVyIGluIHNldFVwCisgICAgICAgIHdhaXRVbnRpbFRlc3RBcHBOb3RJblRlbXBXaGl0ZWxpc3QoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNUZXN0QXBwVGVtcFdoaXRlbGlzdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBvdXRwdXQgPSBtVWlEZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZCgiY21kIGRldmljZWlkbGUgdGVtcHdoaXRlbGlzdCIpLnRyaW0oKTsKKyAgICAgICAgZm9yIChTdHJpbmcgbGluZSA6IG91dHB1dC5zcGxpdCgiXG4iKSkgeworICAgICAgICAgICAgaWYgKGxpbmUuY29udGFpbnMoIlVJRD0iK21UZXN0UGFja2FnZVVpZCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0QW5kS2VlcFRlc3RBY3Rpdml0eSgpIHsKKyAgICAgICAgZmluYWwgSW50ZW50IHRlc3RBY3Rpdml0eSA9IG5ldyBJbnRlbnQoKTsKKyAgICAgICAgdGVzdEFjdGl2aXR5LmFkZEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLKTsKKyAgICAgICAgdGVzdEFjdGl2aXR5LnNldENvbXBvbmVudChuZXcgQ29tcG9uZW50TmFtZShURVNUX0FQUF9QQUNLQUdFLCBURVNUX0FQUF9BQ1RJVklUWSkpOworICAgICAgICBtQ29udGV4dC5zdGFydEFjdGl2aXR5KHRlc3RBY3Rpdml0eSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNlbmRTY2hlZHVsZUpvYkJyb2FkY2FzdChib29sZWFuIGFsbG93V2hpbGVJZGxlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgSW50ZW50IHNjaGVkdWxlSm9iSW50ZW50ID0gbmV3IEludGVudChUZXN0Sm9iU2NoZWR1bGVyUmVjZWl2ZXIuQUNUSU9OX1NDSEVEVUxFX0pPQik7CisgICAgICAgIHNjaGVkdWxlSm9iSW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX1JFQ0VJVkVSX0ZPUkVHUk9VTkQpOworICAgICAgICBzY2hlZHVsZUpvYkludGVudC5wdXRFeHRyYShUZXN0Sm9iU2NoZWR1bGVyUmVjZWl2ZXIuRVhUUkFfSk9CX0lEX0tFWSwgbVRlc3RKb2JJZCk7CisgICAgICAgIHNjaGVkdWxlSm9iSW50ZW50LnB1dEV4dHJhKFRlc3RKb2JTY2hlZHVsZXJSZWNlaXZlci5FWFRSQV9BTExPV19JTl9JRExFLCBhbGxvd1doaWxlSWRsZSk7CisgICAgICAgIHNjaGVkdWxlSm9iSW50ZW50LnNldENvbXBvbmVudChuZXcgQ29tcG9uZW50TmFtZShURVNUX0FQUF9QQUNLQUdFLCBURVNUX0FQUF9SRUNFSVZFUikpOworICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0KHNjaGVkdWxlSm9iSW50ZW50KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdG9nZ2xlRGV2aWNlSWRsZVN0YXRlKGZpbmFsIGJvb2xlYW4gaWRsZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1VaURldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKCJjbWQgZGV2aWNlaWRsZSAiICsgKGlkbGUgPyAiZm9yY2UtaWRsZSIgOiAidW5mb3JjZSIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiQ291bGQgbm90IGNoYW5nZSBkZXZpY2UgaWRsZSBzdGF0ZSB0byAiICsgaWRsZSwKKyAgICAgICAgICAgICAgICB3YWl0VW50aWxUcnVlKFNIRUxMX1RJTUVPVVQsICgpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChEZXZpY2VJZGxlSm9ic1Rlc3QudGhpcykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1EZXZpY2VJbkRvemUgPT0gaWRsZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVtcFdoaXRlbGlzdFRlc3RBcHAobG9uZyBkdXJhdGlvbikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1VaURldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKCJjbWQgZGV2aWNlaWRsZSB0ZW1wd2hpdGVsaXN0IC1kICIgKyBkdXJhdGlvbgorICAgICAgICAgICAgICAgICsgIiAiICsgVEVTVF9BUFBfUEFDS0FHRSk7CisgICAgICAgIG1UZW1wV2hpdGVsaXN0RXhwaXJ5RWxhcHNlZCA9IFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpICsgZHVyYXRpb247CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG1ha2VUZXN0UGFja2FnZUlkbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbVVpRGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoImFtIG1ha2UtdWlkLWlkbGUgLS11c2VyIGN1cnJlbnQgIiArIFRFU1RfQVBQX1BBQ0tBR0UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRUZXN0UGFja2FnZVN0YW5kYnlCdWNrZXQoQnVja2V0IGJ1Y2tldCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBidWNrZXROYW1lOworICAgICAgICBzd2l0Y2ggKGJ1Y2tldCkgeworICAgICAgICAgICAgY2FzZSBBQ1RJVkU6IGJ1Y2tldE5hbWUgPSAiYWN0aXZlIjsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFdPUktJTkdfU0VUOiBidWNrZXROYW1lID0gIndvcmtpbmciOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRlJFUVVFTlQ6IGJ1Y2tldE5hbWUgPSAiZnJlcXVlbnQiOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUkFSRTogYnVja2V0TmFtZSA9ICJyYXJlIjsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE5FVkVSOiBidWNrZXROYW1lID0gIm5ldmVyIjsgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlcXVlc3RlZCB1bmtub3duIGJ1Y2tldCAiICsgYnVja2V0KTsKKyAgICAgICAgfQorICAgICAgICBtVWlEZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZCgiYW0gc2V0LXN0YW5kYnktYnVja2V0ICIgKyBURVNUX0FQUF9QQUNLQUdFCisgICAgICAgICAgICAgICAgKyAiICIgKyBidWNrZXROYW1lKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZW50ZXJGYWtlVW5wbHVnZ2VkU3RhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbVVpRGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoImR1bXBzeXMgYmF0dGVyeSB1bnBsdWciKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVzZXRGYWtlVW5wbHVnZ2VkU3RhdGUoKSB0aHJvd3MgRXhjZXB0aW9uICB7CisgICAgICAgIG1VaURldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKCJkdW1wc3lzIGJhdHRlcnkgcmVzZXQiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gd2FpdFVudGlsVGVzdEFwcE5vdEluVGVtcFdoaXRlbGlzdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBsb25nIG5vdzsKKyAgICAgICAgYm9vbGVhbiBpbnRlcnJ1cHRlZCA9IGZhbHNlOworICAgICAgICB3aGlsZSAoKG5vdyA9IFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpKSA8IG1UZW1wV2hpdGVsaXN0RXhwaXJ5RWxhcHNlZCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAobVRlbXBXaGl0ZWxpc3RFeHBpcnlFbGFwc2VkIC0gbm93KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGlleGMpIHsKKyAgICAgICAgICAgICAgICBpbnRlcnJ1cHRlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGludGVycnVwdGVkKSB7CisgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB3YWl0VW50aWxUcnVlKFNIRUxMX1RJTUVPVVQsICgpIC0+ICFpc1Rlc3RBcHBUZW1wV2hpdGVsaXN0ZWQoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGF3YWl0Sm9iU3RhcnQobG9uZyBtYXhXYWl0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHdhaXRVbnRpbFRydWUobWF4V2FpdCwgKCkgLT4geworICAgICAgICAgICAgc3luY2hyb25pemVkIChtVGVzdEpvYlN0YXR1cykgeworICAgICAgICAgICAgICAgIHJldHVybiAobVRlc3RKb2JTdGF0dXMuam9iSWQgPT0gbVRlc3RKb2JJZCkgJiYgbVRlc3RKb2JTdGF0dXMucnVubmluZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGF3YWl0Sm9iU3RvcChsb25nIG1heFdhaXQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZXR1cm4gd2FpdFVudGlsVHJ1ZShtYXhXYWl0LCAoKSAtPiB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1UZXN0Sm9iU3RhdHVzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChtVGVzdEpvYlN0YXR1cy5qb2JJZCA9PSBtVGVzdEpvYklkKSAmJiAhbVRlc3RKb2JTdGF0dXMucnVubmluZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHdhaXRVbnRpbFRydWUobG9uZyBtYXhXYWl0LCBDb25kaXRpb24gY29uZGl0aW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgbG9uZyBkZWFkTGluZSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpICsgbWF4V2FpdDsKKyAgICAgICAgZG8geworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFBPTExfSU5URVJWQUwpOworICAgICAgICB9IHdoaWxlICghY29uZGl0aW9uLmlzVHJ1ZSgpICYmIFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpIDwgZGVhZExpbmUpOworICAgICAgICByZXR1cm4gY29uZGl0aW9uLmlzVHJ1ZSgpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFRlc3RKb2JTdGF0dXMgeworICAgICAgICBpbnQgam9iSWQ7CisgICAgICAgIGJvb2xlYW4gcnVubmluZzsKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHJlc2V0KCkgeworICAgICAgICAgICAgcnVubmluZyA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnRlcmZhY2UgQ29uZGl0aW9uIHsKKyAgICAgICAgYm9vbGVhbiBpc1RydWUoKSB0aHJvd3MgRXhjZXB0aW9uOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0pvYlNjaGVkdWxlci9zcmMvYW5kcm9pZC9qb2JzY2hlZHVsZXIvY3RzL0RldmljZVN0YXRlc1Rlc3QuamF2YSBiL3Rlc3RzL0pvYlNjaGVkdWxlci9zcmMvYW5kcm9pZC9qb2JzY2hlZHVsZXIvY3RzL0RldmljZVN0YXRlc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2QxNDdlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSm9iU2NoZWR1bGVyL3NyYy9hbmRyb2lkL2pvYnNjaGVkdWxlci9jdHMvRGV2aWNlU3RhdGVzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmpvYnNjaGVkdWxlci5jdHM7CisKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uVGFyZ2V0QXBpOworaW1wb3J0IGFuZHJvaWQuYXBwLmpvYi5Kb2JJbmZvOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLlVpRGV2aWNlOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKKworLyoqCisgKiBNYWtlIHN1cmUgdGhlIHN0YXRlIG9mIHtAbGluayBhbmRyb2lkLmFwcC5qb2IuSm9iU2NoZWR1bGVyfSBpcyBjb3JyZWN0LgorICovCitAVGFyZ2V0QXBpKDI4KQorcHVibGljIGNsYXNzIERldmljZVN0YXRlc1Rlc3QgZXh0ZW5kcyBDb25zdHJhaW50VGVzdCB7CisgICAgLyoqIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgam9iIHNjaGVkdWxlZCBieSB0aGlzIHN1aXRlIG9mIHRlc3RzLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0pPQl9JRCA9IERldmljZVN0YXRlc1Rlc3QuY2xhc3MuaGFzaENvZGUoKTsKKworICAgIHByaXZhdGUgSm9iSW5mby5CdWlsZGVyIG1CdWlsZGVyOworICAgIHByaXZhdGUgVWlEZXZpY2UgbVVpRGV2aWNlOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgbUJ1aWxkZXIgPSBuZXcgSm9iSW5mby5CdWlsZGVyKFNUQVRFX0pPQl9JRCwga0pvYlNlcnZpY2VDb21wb25lbnQpOworICAgICAgICBtVWlEZXZpY2UgPSBVaURldmljZS5nZXRJbnN0YW5jZShJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbUpvYlNjaGVkdWxlci5jYW5jZWwoU1RBVEVfSk9CX0lEKTsKKyAgICAgICAgLy8gUHV0IGRldmljZSBiYWNrIGluIHRvIG5vcm1hbCBvcGVyYXRpb24uCisgICAgICAgIHRvZ2dsZVNjcmVlbk9uKHRydWUgLyogc2NyZWVuIG9uICovKTsKKyAgICB9CisKKyAgICB2b2lkIGFzc2VydEpvYlJlYWR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEpvYlJlYWR5KFNUQVRFX0pPQl9JRCk7CisgICAgfQorCisgICAgdm9pZCBhc3NlcnRKb2JXYWl0aW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEpvYldhaXRpbmcoU1RBVEVfSk9CX0lEKTsKKyAgICB9CisKKyAgICB2b2lkIGFzc2VydEpvYk5vdFJlYWR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEpvYk5vdFJlYWR5KFNUQVRFX0pPQl9JRCk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgd2FpdEZvcihsb25nIHdhaXRNaWxsaXMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBsb25nIGRlYWRsaW5lID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkgKyB3YWl0TWlsbGlzOworICAgICAgICBkbyB7CisgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDUwMEwpOworICAgICAgICB9IHdoaWxlIChTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSA8IGRlYWRsaW5lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUb2dnbGUgZGV2aWNlIGlzIGRvY2sgaWRsZSBvciBkb2NrIGFjdGl2ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdG9nZ2xlRmFrZURldmljZURvY2tTdGF0ZShmaW5hbCBib29sZWFuIGlkbGUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtVWlEZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZCgiY21kIGpvYnNjaGVkdWxlciB0cmlnZ2VyLWRvY2stc3RhdGUgIgorICAgICAgICAgICAgICAgICsgKGlkbGUgPyAiaWRsZSIgOiAiYWN0aXZlIikpOworICAgICAgICAvLyBXYWl0IGEgbW9tZW50IHRvIGxldCB0aGF0IGhhcHBlbiBiZWZvcmUgcHJvY2VlZGluZy4KKyAgICAgICAgd2FpdEZvcigyXzAwMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFrZSBzdXJlIHRoZSBzY3JlZW4gc3RhdGUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHRvZ2dsZVNjcmVlbk9uKGZpbmFsIGJvb2xlYW4gc2NyZWVub24pIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoc2NyZWVub24pIHsKKyAgICAgICAgICAgIG1VaURldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKCJpbnB1dCBrZXlldmVudCBLRVlDT0RFX1dBS0VVUCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVVpRGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoImlucHV0IGtleWV2ZW50IEtFWUNPREVfU0xFRVAiKTsKKyAgICAgICAgfQorICAgICAgICAvLyBTaW5jZSB0aGUgc2NyZWVuIG9uL29mZiBpbnRlbnQgaXMgb3JkZXJlZCwgdGhleSB3aWxsIG5vdCBiZSBzZW50IHJpZ2h0IG5vdy4KKyAgICAgICAgd2FpdEZvcigyXzAwMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2ltdWxhdGVkIGZvciBpZGxlLCBhbmQgdGhlbiBwZXJmb3JtIGlkbGUgbWFpbnRlbmFuY2Ugbm93LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB0cmlnZ2VySWRsZU1haW50ZW5hbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1VaURldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKCJjbWQgYWN0aXZpdHkgaWRsZS1tYWludGVuYW5jZSIpOworICAgICAgICAvLyBXYWl0IGEgbW9tZW50IHRvIGxldCB0aGF0IGhhcHBlbiBiZWZvcmUgcHJvY2VlZGluZy4KKyAgICAgICAgd2FpdEZvcigyXzAwMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2NoZWR1bGUgYSBqb2IgdGhhdCByZXF1aXJlcyB0aGUgZGV2aWNlIGlzIGlkbGUsIGFuZCBhc3NlcnQgaXQgZmlyZWQgdG8gbWFrZQorICAgICAqIHN1cmUgdGhlIGRldmljZSBpcyBpZGxlLgorICAgICAqLworICAgIHZvaWQgdmVyaWZ5SWRsZVN0YXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGtUZXN0RW52aXJvbm1lbnQuc2V0RXhwZWN0ZWRFeGVjdXRpb25zKDEpOworICAgICAgICBrVGVzdEVudmlyb25tZW50LnNldEV4cGVjdGVkV2FpdEZvclJ1bigpOworICAgICAgICBtSm9iU2NoZWR1bGVyLnNjaGVkdWxlKG1CdWlsZGVyLnNldFJlcXVpcmVzRGV2aWNlSWRsZSh0cnVlKS5idWlsZCgpKTsKKyAgICAgICAgYXNzZXJ0Sm9iUmVhZHkoKTsKKyAgICAgICAga1Rlc3RFbnZpcm9ubWVudC5yZWFkeVRvUnVuKCk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiSm9iIHdpdGggaWRsZSBjb25zdHJhaW50IGRpZCBub3QgZmlyZSBvbiBpZGxlIiwKKyAgICAgICAgICAgICAgICBrVGVzdEVudmlyb25tZW50LmF3YWl0RXhlY3V0aW9uKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNjaGVkdWxlIGEgam9iIHRoYXQgcmVxdWlyZXMgdGhlIGRldmljZSBpcyBpZGxlLCBhbmQgYXNzZXJ0IGl0IGZhaWxlZCB0byBtYWtlCisgICAgICogc3VyZSB0aGUgZGV2aWNlIGlzIGFjdGl2ZS4KKyAgICAgKi8KKyAgICB2b2lkIHZlcmlmeUFjdGl2ZVN0YXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGtUZXN0RW52aXJvbm1lbnQuc2V0RXhwZWN0ZWRFeGVjdXRpb25zKDApOworICAgICAgICBrVGVzdEVudmlyb25tZW50LnNldEV4cGVjdGVkV2FpdEZvclJ1bigpOworICAgICAgICBtSm9iU2NoZWR1bGVyLnNjaGVkdWxlKG1CdWlsZGVyLnNldFJlcXVpcmVzRGV2aWNlSWRsZSh0cnVlKS5idWlsZCgpKTsKKyAgICAgICAgYXNzZXJ0Sm9iV2FpdGluZygpOworICAgICAgICBhc3NlcnRKb2JOb3RSZWFkeSgpOworICAgICAgICBrVGVzdEVudmlyb25tZW50LnJlYWR5VG9SdW4oKTsKKworICAgICAgICBhc3NlcnRGYWxzZSgiSm9iIHdpdGggaWRsZSBjb25zdHJhaW50IGZpcmVkIHdoaWxlIG5vdCBvbiBpZGxlLiIsCisgICAgICAgICAgICAgICAga1Rlc3RFbnZpcm9ubWVudC5hd2FpdEV4ZWN1dGlvbigyNTApKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmUgdGhhdCBkZXZpY2UgY2FuIHN3aXRjaCBzdGF0ZSBub3JtYWxseS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGV2aWNlQ2hhbmdlSWRsZUFjdGl2ZVN0YXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRvZ2dsZVNjcmVlbk9uKHRydWUgLyogc2NyZWVuIG9uICovKTsKKyAgICAgICAgdmVyaWZ5QWN0aXZlU3RhdGUoKTsKKworICAgICAgICAvLyBBc3NlcnQgZGV2aWNlIGlzIGlkbGUgd2hlbiBzY3JlZW4gaXMgb2ZmIGZvciBhIHdoaWxlLgorICAgICAgICB0b2dnbGVTY3JlZW5PbihmYWxzZSAvKiBzY3JlZW4gb2ZmICovKTsKKyAgICAgICAgdHJpZ2dlcklkbGVNYWludGVuYW5jZSgpOworICAgICAgICB2ZXJpZnlJZGxlU3RhdGUoKTsKKworICAgICAgICAvLyBBc3NlcnQgZGV2aWNlIGlzIGJhY2sgdG8gYWN0aXZlIHdoZW4gc2NyZWVuIGlzIG9uLgorICAgICAgICB0b2dnbGVTY3JlZW5Pbih0cnVlIC8qIHNjcmVlbiBvbiAqLyk7CisgICAgICAgIHZlcmlmeUFjdGl2ZVN0YXRlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgZG9jayBzdGF0ZSBpcyBzdXBwb3J0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGlzRG9ja1N0YXRlU3VwcG9ydGVkKCkgeworICAgICAgICAvLyBDYXIgZG9lcyBub3Qgc3VwcG9ydCBkb2NrIHN0YXRlLgorICAgICAgICByZXR1cm4gIWdldENvbnRleHQoKS5nZXRQYWNrYWdlTWFuYWdlcigpLmhhc1N5c3RlbUZlYXR1cmUoCisgICAgICAgICAgICAgICAgUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9BVVRPTU9USVZFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmUgdGhhdCBkZXZpY2UgY2FuIHN3aXRjaCBzdGF0ZSBvbiBkb2NrIG5vcm1hbGx5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTY3JlZW5PbkRldmljZU9uRG9ja0NoYW5nZVN0YXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghaXNEb2NrU3RhdGVTdXBwb3J0ZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRvZ2dsZVNjcmVlbk9uKHRydWUgLyogc2NyZWVuIG9uICovKTsKKyAgICAgICAgdmVyaWZ5QWN0aXZlU3RhdGUoKTsKKworICAgICAgICAvLyBBc3NlcnQgZGV2aWNlIGdvIHRvIGlkbGUgaWYgdXNlciBkb2Vzbid0IGludGVyYWN0IHdpdGggZGV2aWNlIGZvciBhIHdoaWxlLgorICAgICAgICB0b2dnbGVGYWtlRGV2aWNlRG9ja1N0YXRlKHRydWUgLyogaWRsZSAqLyk7CisgICAgICAgIHRyaWdnZXJJZGxlTWFpbnRlbmFuY2UoKTsKKyAgICAgICAgdmVyaWZ5SWRsZVN0YXRlKCk7CisKKyAgICAgICAgLy8gQXNzZXJ0IGRldmljZSBnbyBiYWNrIHRvIGFjdGl2ZSBpZiB1c2VyIGludGVyYWN0cyB3aXRoIGRldmljZS4KKyAgICAgICAgdG9nZ2xlRmFrZURldmljZURvY2tTdGF0ZShmYWxzZSAvKiBhY3RpdmUgKi8pOworICAgICAgICB2ZXJpZnlBY3RpdmVTdGF0ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqICBFbnN1cmUgdGhhdCBpZ25vcmVzIHRoaXMgZG9jayBpbnRlbnQgZHVyaW5nIHNjcmVlbiBvZmYuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFNjcmVlbk9mZkRldmljZU9uRG9ja05vQ2hhbmdlU3RhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFpc0RvY2tTdGF0ZVN1cHBvcnRlZCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdG9nZ2xlU2NyZWVuT24oZmFsc2UgLyogc2NyZWVuIG9mZiAqLyk7CisgICAgICAgIHRyaWdnZXJJZGxlTWFpbnRlbmFuY2UoKTsKKyAgICAgICAgdmVyaWZ5SWRsZVN0YXRlKCk7CisKKyAgICAgICAgdG9nZ2xlRmFrZURldmljZURvY2tTdGF0ZShmYWxzZSAvKiBhY3RpdmUgKi8pOworICAgICAgICB2ZXJpZnlJZGxlU3RhdGUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9Kb2JTY2hlZHVsZXIvc3JjL2FuZHJvaWQvam9ic2NoZWR1bGVyL2N0cy9FbnF1ZXVlSm9iV29ya1Rlc3QuamF2YSBiL3Rlc3RzL0pvYlNjaGVkdWxlci9zcmMvYW5kcm9pZC9qb2JzY2hlZHVsZXIvY3RzL0VucXVldWVKb2JXb3JrVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDI1OTlmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL0pvYlNjaGVkdWxlci9zcmMvYW5kcm9pZC9qb2JzY2hlZHVsZXIvY3RzL0VucXVldWVKb2JXb3JrVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuam9ic2NoZWR1bGVyLmN0czsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5UYXJnZXRBcGk7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuam9iLkpvYkluZm87Ci1pbXBvcnQgYW5kcm9pZC5hcHAuam9iLkpvYldvcmtJdGVtOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXJDbGllbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmpvYnNjaGVkdWxlci5Nb2NrSm9iU2VydmljZS5UZXN0V29ya0l0ZW07Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5TeXN0ZW1VdGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBTY2hlZHVsZXMgam9icyB3aXRoIHRoZSB7QGxpbmsgYW5kcm9pZC5hcHAuam9iLkpvYlNjaGVkdWxlcn0gYnkgZW5xdWV1ZSB3b3JrIGluIHRvCi0gKiB0aGVtIGFuZCBwcm9jZXNzaW5nIGl0LgotICovCi1AVGFyZ2V0QXBpKDI2KQotcHVibGljIGNsYXNzIEVucXVldWVKb2JXb3JrVGVzdCBleHRlbmRzIENvbnN0cmFpbnRUZXN0IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkNsaXBEYXRhSm9iVGVzdCI7Ci0KLSAgICAvKiogVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBqb2Igc2NoZWR1bGVkIGJ5IHRoaXMgc3VpdGUgb2YgdGVzdHMuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5RVUVVRV9XT1JLX0pPQl9JRCA9IEVucXVldWVKb2JXb3JrVGVzdC5jbGFzcy5oYXNoQ29kZSgpOwotCi0gICAgcHJpdmF0ZSBKb2JJbmZvLkJ1aWxkZXIgbUJ1aWxkZXI7Ci0gICAgcHJpdmF0ZSBDb250ZW50UHJvdmlkZXJDbGllbnQgbVByb3ZpZGVyOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLQotICAgICAgICBtQnVpbGRlciA9IG5ldyBKb2JJbmZvLkJ1aWxkZXIoRU5RVUVVRV9XT1JLX0pPQl9JRCwga0pvYlNlcnZpY2VDb21wb25lbnQpOwotICAgICAgICBtUHJvdmlkZXIgPSBnZXRDb250ZXh0KCkuZ2V0Q29udGVudFJlc29sdmVyKCkuYWNxdWlyZUNvbnRlbnRQcm92aWRlckNsaWVudChtRmlyc3RVcmkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgICAgIG1Qcm92aWRlci5jbG9zZSgpOwotICAgICAgICBtSm9iU2NoZWR1bGVyLmNhbmNlbChFTlFVRVVFX1dPUktfSk9CX0lEKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaW50ZW50RXF1YWxzKEludGVudCBpMSwgSW50ZW50IGkyKSB7Ci0gICAgICAgIGlmIChpMSA9PSBpMikgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGkxID09IG51bGwgfHwgaTIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpMS5maWx0ZXJFcXVhbHMoaTIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjb21wYXJlV29yayhUZXN0V29ya0l0ZW1bXSBleHBlY3RlZCwgQXJyYXlMaXN0PEpvYldvcmtJdGVtPiByZWNlaXZlZCkgewotICAgICAgICBpZiAocmVjZWl2ZWQgPT0gbnVsbCkgewotICAgICAgICAgICAgZmFpbCgiRGlkbid0IHJlY2VpdmUgYW55IGV4cGVjdGVkIHdvcmsuIik7Ci0gICAgICAgIH0KLSAgICAgICAgQXJyYXlMaXN0PFRlc3RXb3JrSXRlbT4gZXhwZWN0ZWRBcnJheSA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBleHBlY3RlZEFycmF5LmFkZChleHBlY3RlZFtpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWNlaXZlZC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgSm9iV29ya0l0ZW0gd29yayA9IHJlY2VpdmVkLmdldChpKTsKLSAgICAgICAgICAgIGlmIChpIDwgZXhwZWN0ZWQubGVuZ3RoICYmIGV4cGVjdGVkW2ldLnN1Yml0ZW1zICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBUZXN0V29ya0l0ZW1bXSBzdWIgPSBleHBlY3RlZFtpXS5zdWJpdGVtczsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHN1Yi5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgICAgICBleHBlY3RlZEFycmF5LmFkZChzdWJbal0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpID49IGV4cGVjdGVkQXJyYXkuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiUmVjZWl2ZWQgbW9yZSB0aGFuICIgKyBleHBlY3RlZC5sZW5ndGggKyAiIHdvcmsgaXRlbXMsIGZpcnN0IGV4dHJhIGlzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgd29yayk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWludGVudEVxdWFscyh3b3JrLmdldEludGVudCgpLCBleHBlY3RlZEFycmF5LmdldChpKS5pbnRlbnQpKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiUmVjZWl2ZWQgd29yayAjIiArIGkgKyAiICIgKyB3b3JrLmdldEludGVudCgpICsgIiBidXQgZXhwZWN0ZWQgIiArIGV4cGVjdGVkW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh3b3JrLmdldERlbGl2ZXJ5Q291bnQoKSAhPSBleHBlY3RlZEFycmF5LmdldChpKS5kZWxpdmVyeUNvdW50KSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiUmVjZWl2ZWQgd29yayAjIiArIGkgKyAiICIgKyB3b3JrLmdldEludGVudCgpICsgIiBkZWxpdmVyeSBjb3VudCBpcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIHdvcmsuZ2V0RGVsaXZlcnlDb3VudCgpICsgIiBidXQgZXhwZWN0ZWQgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBleHBlY3RlZEFycmF5LmdldChpKS5kZWxpdmVyeUNvdW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocmVjZWl2ZWQuc2l6ZSgpIDwgZXhwZWN0ZWQubGVuZ3RoKSB7Ci0gICAgICAgICAgICBmYWlsKCJSZWNlaXZlZCBvbmx5ICIgKyByZWNlaXZlZC5zaXplKCkgKyAiIHdvcmsgaXRlbXMsIGJ1dCBleHBlY3RlZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBleHBlY3RlZC5sZW5ndGgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBiYXNpYyBlbnF1ZXVlaW5nIG9mIHdvcmsuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEVucXVldWVPbmVXb3JrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEludGVudCB3b3JrMSA9IG5ldyBJbnRlbnQoIndvcmsxIik7Ci0gICAgICAgIFRlc3RXb3JrSXRlbVtdIHdvcmsgPSBuZXcgVGVzdFdvcmtJdGVtW10geyBuZXcgVGVzdFdvcmtJdGVtKHdvcmsxKSB9OwotICAgICAgICBrVGVzdEVudmlyb25tZW50LnNldEV4cGVjdGVkRXhlY3V0aW9ucygxKTsKLSAgICAgICAga1Rlc3RFbnZpcm9ubWVudC5zZXRFeHBlY3RlZFdvcmsod29yayk7Ci0gICAgICAgIG1Kb2JTY2hlZHVsZXIuZW5xdWV1ZShtQnVpbGRlci5zZXRPdmVycmlkZURlYWRsaW5lKDApLmJ1aWxkKCksIG5ldyBKb2JXb3JrSXRlbSh3b3JrMSkpOwotICAgICAgICBrVGVzdEVudmlyb25tZW50LnJlYWR5VG9Xb3JrKCk7Ci0gICAgICAgIGFzc2VydFRydWUoIkpvYiB3aXRoIHdvcmsgZW5xdWV1ZWQgZGlkIG5vdCBmaXJlLiIsCi0gICAgICAgICAgICAgICAga1Rlc3RFbnZpcm9ubWVudC5hd2FpdEV4ZWN1dGlvbigpKTsKLSAgICAgICAgY29tcGFyZVdvcmsod29yaywga1Rlc3RFbnZpcm9ubWVudC5nZXRMYXN0UmVjZWl2ZWRXb3JrKCkpOwotICAgICAgICBpZiAoa1Rlc3RFbnZpcm9ubWVudC5nZXRMYXN0RXJyb3JNZXNzYWdlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgZmFpbChrVGVzdEVudmlyb25tZW50LmdldExhc3RFcnJvck1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGJhc2ljIGVucXVldWVpbmcgYmF0Y2hlcyBvZiB3b3JrLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RFbnF1ZXVlTXVsdGlwbGVXb3JrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEludGVudCB3b3JrMSA9IG5ldyBJbnRlbnQoIndvcmsxIik7Ci0gICAgICAgIEludGVudCB3b3JrMiA9IG5ldyBJbnRlbnQoIndvcmsyIik7Ci0gICAgICAgIEludGVudCB3b3JrMyA9IG5ldyBJbnRlbnQoIndvcmszIik7Ci0gICAgICAgIEludGVudCB3b3JrNCA9IG5ldyBJbnRlbnQoIndvcms0Iik7Ci0gICAgICAgIEludGVudCB3b3JrNSA9IG5ldyBJbnRlbnQoIndvcms1Iik7Ci0gICAgICAgIEludGVudCB3b3JrNiA9IG5ldyBJbnRlbnQoIndvcms2Iik7Ci0gICAgICAgIEludGVudCB3b3JrNyA9IG5ldyBJbnRlbnQoIndvcms3Iik7Ci0gICAgICAgIEludGVudCB3b3JrOCA9IG5ldyBJbnRlbnQoIndvcms4Iik7Ci0gICAgICAgIFRlc3RXb3JrSXRlbVtdIHdvcmsgPSBuZXcgVGVzdFdvcmtJdGVtW10gewotICAgICAgICAgICAgICAgIG5ldyBUZXN0V29ya0l0ZW0od29yazEpLCBuZXcgVGVzdFdvcmtJdGVtKHdvcmsyKSwgbmV3IFRlc3RXb3JrSXRlbSh3b3JrMyksCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RXb3JrSXRlbSh3b3JrNCksIG5ldyBUZXN0V29ya0l0ZW0od29yazUpLCBuZXcgVGVzdFdvcmtJdGVtKHdvcms2KSwKLSAgICAgICAgICAgICAgICBuZXcgVGVzdFdvcmtJdGVtKHdvcms3KSwgbmV3IFRlc3RXb3JrSXRlbSh3b3JrOCkgfTsKLSAgICAgICAga1Rlc3RFbnZpcm9ubWVudC5zZXRFeHBlY3RlZEV4ZWN1dGlvbnMoMSk7Ci0gICAgICAgIGtUZXN0RW52aXJvbm1lbnQuc2V0RXhwZWN0ZWRXb3JrKHdvcmspOwotICAgICAgICBKb2JJbmZvIGppID0gbUJ1aWxkZXIuc2V0T3ZlcnJpZGVEZWFkbGluZSgwKS5idWlsZCgpOwotICAgICAgICBtSm9iU2NoZWR1bGVyLmVucXVldWUoamksIG5ldyBKb2JXb3JrSXRlbSh3b3JrMSkpOwotICAgICAgICBtSm9iU2NoZWR1bGVyLmVucXVldWUoamksIG5ldyBKb2JXb3JrSXRlbSh3b3JrMikpOwotICAgICAgICBtSm9iU2NoZWR1bGVyLmVucXVldWUoamksIG5ldyBKb2JXb3JrSXRlbSh3b3JrMykpOwotICAgICAgICBtSm9iU2NoZWR1bGVyLmVucXVldWUoamksIG5ldyBKb2JXb3JrSXRlbSh3b3JrNCkpOwotICAgICAgICBtSm9iU2NoZWR1bGVyLmVucXVldWUoamksIG5ldyBKb2JXb3JrSXRlbSh3b3JrNSkpOwotICAgICAgICBtSm9iU2NoZWR1bGVyLmVucXVldWUoamksIG5ldyBKb2JXb3JrSXRlbSh3b3JrNikpOwotICAgICAgICBtSm9iU2NoZWR1bGVyLmVucXVldWUoamksIG5ldyBKb2JXb3JrSXRlbSh3b3JrNykpOwotICAgICAgICBtSm9iU2NoZWR1bGVyLmVucXVldWUoamksIG5ldyBKb2JXb3JrSXRlbSh3b3JrOCkpOwotICAgICAgICBrVGVzdEVudmlyb25tZW50LnJlYWR5VG9Xb3JrKCk7Ci0gICAgICAgIGFzc2VydFRydWUoIkpvYiB3aXRoIHdvcmsgZW5xdWV1ZWQgZGlkIG5vdCBmaXJlLiIsCi0gICAgICAgICAgICAgICAga1Rlc3RFbnZpcm9ubWVudC5hd2FpdEV4ZWN1dGlvbigpKTsKLSAgICAgICAgY29tcGFyZVdvcmsod29yaywga1Rlc3RFbnZpcm9ubWVudC5nZXRMYXN0UmVjZWl2ZWRXb3JrKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgYmFzaWMgZW5xdWV1ZWluZyBiYXRjaGVzIG9mIHdvcmssIHdpdGggbmV3IHdvcmsgY29taW5nIGluIHdoaWxlIHByb2Nlc3NpbmcgZXhpc3RpbmcKLSAgICAgKiB3b3JrLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RFbnF1ZXVlTXVsdGlwbGVTdWJXb3JrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEludGVudCB3b3JrMSA9IG5ldyBJbnRlbnQoIndvcmsxIik7Ci0gICAgICAgIEludGVudCB3b3JrMiA9IG5ldyBJbnRlbnQoIndvcmsyIik7Ci0gICAgICAgIEludGVudCB3b3JrMyA9IG5ldyBJbnRlbnQoIndvcmszIik7Ci0gICAgICAgIEludGVudCB3b3JrNCA9IG5ldyBJbnRlbnQoIndvcms0Iik7Ci0gICAgICAgIEludGVudCB3b3JrNSA9IG5ldyBJbnRlbnQoIndvcms1Iik7Ci0gICAgICAgIEludGVudCB3b3JrNiA9IG5ldyBJbnRlbnQoIndvcms2Iik7Ci0gICAgICAgIEludGVudCB3b3JrNyA9IG5ldyBJbnRlbnQoIndvcms3Iik7Ci0gICAgICAgIEludGVudCB3b3JrOCA9IG5ldyBJbnRlbnQoIndvcms4Iik7Ci0gICAgICAgIEpvYkluZm8gamkgPSBtQnVpbGRlci5zZXRPdmVycmlkZURlYWRsaW5lKDApLmJ1aWxkKCk7Ci0gICAgICAgIFRlc3RXb3JrSXRlbVtdIHdvcmsgPSBuZXcgVGVzdFdvcmtJdGVtW117Ci0gICAgICAgICAgICAgICAgbmV3IFRlc3RXb3JrSXRlbSh3b3JrMSksIG5ldyBUZXN0V29ya0l0ZW0od29yazIpLCBuZXcgVGVzdFdvcmtJdGVtKHdvcmszKSwKLSAgICAgICAgICAgICAgICBuZXcgVGVzdFdvcmtJdGVtKHdvcms0LCBqaSwgbmV3IFRlc3RXb3JrSXRlbVtdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUZXN0V29ya0l0ZW0od29yazUpLCBuZXcgVGVzdFdvcmtJdGVtKHdvcms2KSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUZXN0V29ya0l0ZW0od29yazcpLCBuZXcgVGVzdFdvcmtJdGVtKHdvcms4KX0pCi0gICAgICAgIH07Ci0gICAgICAgIGtUZXN0RW52aXJvbm1lbnQuc2V0RXhwZWN0ZWRFeGVjdXRpb25zKDEpOwotICAgICAgICBrVGVzdEVudmlyb25tZW50LnNldEV4cGVjdGVkV29yayh3b3JrKTsKLSAgICAgICAgbUpvYlNjaGVkdWxlci5lbnF1ZXVlKGppLCBuZXcgSm9iV29ya0l0ZW0od29yazEpKTsKLSAgICAgICAgbUpvYlNjaGVkdWxlci5lbnF1ZXVlKGppLCBuZXcgSm9iV29ya0l0ZW0od29yazIpKTsKLSAgICAgICAgbUpvYlNjaGVkdWxlci5lbnF1ZXVlKGppLCBuZXcgSm9iV29ya0l0ZW0od29yazMpKTsKLSAgICAgICAgbUpvYlNjaGVkdWxlci5lbnF1ZXVlKGppLCBuZXcgSm9iV29ya0l0ZW0od29yazQpKTsKLSAgICAgICAga1Rlc3RFbnZpcm9ubWVudC5yZWFkeVRvV29yaygpOwotICAgICAgICBhc3NlcnRUcnVlKCJKb2Igd2l0aCB3b3JrIGVucXVldWVkIGRpZCBub3QgZmlyZS4iLAotICAgICAgICAgICAgICAgIGtUZXN0RW52aXJvbm1lbnQuYXdhaXRFeGVjdXRpb24oKSk7Ci0gICAgICAgIGNvbXBhcmVXb3JrKHdvcmssIGtUZXN0RW52aXJvbm1lbnQuZ2V0TGFzdFJlY2VpdmVkV29yaygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGpvYiBnZXR0aW5nIHN0b3BwZWQgd2hpbGUgcHJvY2Vzc2luZyB3b3JrIGFuZCB0aGF0IHdvcmsgYmVpbmcgcmVkZWxpdmVyZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEVucXVldWVNdWx0aXBsZVJlZGVsaXZlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBJbnRlbnQgd29yazEgPSBuZXcgSW50ZW50KCJ3b3JrMSIpOwotICAgICAgICBJbnRlbnQgd29yazIgPSBuZXcgSW50ZW50KCJ3b3JrMiIpOwotICAgICAgICBJbnRlbnQgd29yazMgPSBuZXcgSW50ZW50KCJ3b3JrMyIpOwotICAgICAgICBJbnRlbnQgd29yazQgPSBuZXcgSW50ZW50KCJ3b3JrNCIpOwotICAgICAgICBJbnRlbnQgd29yazUgPSBuZXcgSW50ZW50KCJ3b3JrNSIpOwotICAgICAgICBJbnRlbnQgd29yazYgPSBuZXcgSW50ZW50KCJ3b3JrNiIpOwotICAgICAgICBUZXN0V29ya0l0ZW1bXSBpbml0aWFsV29yayA9IG5ldyBUZXN0V29ya0l0ZW1bXSB7Ci0gICAgICAgICAgICAgICAgbmV3IFRlc3RXb3JrSXRlbSh3b3JrMSksIG5ldyBUZXN0V29ya0l0ZW0od29yazIpLCBuZXcgVGVzdFdvcmtJdGVtKHdvcmszKSwKLSAgICAgICAgICAgICAgICBuZXcgVGVzdFdvcmtJdGVtKHdvcms0LCBUZXN0V29ya0l0ZW0uRkxBR19XQUlUX0ZPUl9TVE9QLCAxKSB9OwotICAgICAgICBrVGVzdEVudmlyb25tZW50LnNldEV4cGVjdGVkRXhlY3V0aW9ucygxKTsKLSAgICAgICAga1Rlc3RFbnZpcm9ubWVudC5zZXRFeHBlY3RlZFdhaXRGb3JTdG9wKCk7Ci0gICAgICAgIGtUZXN0RW52aXJvbm1lbnQuc2V0RXhwZWN0ZWRXb3JrKGluaXRpYWxXb3JrKTsKLSAgICAgICAgSm9iSW5mbyBqaSA9IG1CdWlsZGVyLnNldE92ZXJyaWRlRGVhZGxpbmUoMCkuYnVpbGQoKTsKLSAgICAgICAgbUpvYlNjaGVkdWxlci5lbnF1ZXVlKGppLCBuZXcgSm9iV29ya0l0ZW0od29yazEpKTsKLSAgICAgICAgbUpvYlNjaGVkdWxlci5lbnF1ZXVlKGppLCBuZXcgSm9iV29ya0l0ZW0od29yazIpKTsKLSAgICAgICAgbUpvYlNjaGVkdWxlci5lbnF1ZXVlKGppLCBuZXcgSm9iV29ya0l0ZW0od29yazMpKTsKLSAgICAgICAgbUpvYlNjaGVkdWxlci5lbnF1ZXVlKGppLCBuZXcgSm9iV29ya0l0ZW0od29yazQpKTsKLSAgICAgICAga1Rlc3RFbnZpcm9ubWVudC5yZWFkeVRvV29yaygpOwotCi0gICAgICAgIC8vIE5vdyB3YWl0IGZvciB0aGUgam9iIHRvIGdldCB0byB0aGUgcG9pbnQgd2hlcmUgaXQgaXMgcHJvY2Vzc2luZyB0aGUgbGFzdAotICAgICAgICAvLyB3b3JrIGFuZCB3YWl0aW5nIGZvciBpdCB0byBiZSBzdG9wcGVkLgotICAgICAgICBhc3NlcnRUcnVlKCJKb2Igd2l0aCB3b3JrIGVucXVldWVkIGRpZCBub3Qgd2FpdCB0byBzdG9wLiIsCi0gICAgICAgICAgICAgICAga1Rlc3RFbnZpcm9ubWVudC5hd2FpdFdhaXRpbmdGb3JTdG9wKCkpOwotCi0gICAgICAgIC8vIENhdXNlIHRoZSBqb2IgdG8gdGltZW91dCAoc3RvcCkgaW1tZWRpYXRlbHksIGFuZCB3YWl0IGZvciBpdHMgZXhlY3V0aW9uIHRvIGZpbmlzaC4KLSAgICAgICAgU3lzdGVtVXRpbC5ydW5TaGVsbENvbW1hbmQoZ2V0SW5zdHJ1bWVudGF0aW9uKCksICJjbWQgam9ic2NoZWR1bGVyIHRpbWVvdXQgIgotICAgICAgICAgICAgICAgICsga0pvYlNlcnZpY2VDb21wb25lbnQuZ2V0UGFja2FnZU5hbWUoKSArICIgIiArIEVOUVVFVUVfV09SS19KT0JfSUQpOwotICAgICAgICBhc3NlcnRUcnVlKCJKb2Igd2l0aCB3b3JrIGVucXVldWVkIGRpZCBub3QgZmluaXNoLiIsCi0gICAgICAgICAgICAgICAga1Rlc3RFbnZpcm9ubWVudC5hd2FpdEV4ZWN1dGlvbigpKTsKLSAgICAgICAgY29tcGFyZVdvcmsoaW5pdGlhbFdvcmssIGtUZXN0RW52aXJvbm1lbnQuZ2V0TGFzdFJlY2VpdmVkV29yaygpKTsKLQotICAgICAgICAvLyBOb3cgd2UgYXJlIGdvaW5nIHRvIGFkZCBzb21lIG1vcmUgd29yaywgcmVzdGFydCB0aGUgam9iLCBhbmQgc2VlIGlmIGl0IGNvcnJlY3RseQotICAgICAgICAvLyByZWRlbGl2ZXJzIHRoZSBsYXN0IHdvcmsgYW5kIGRlbGl2ZXJzIHRoZSBuZXcgd29yay4KLSAgICAgICAgVGVzdFdvcmtJdGVtW10gZmluYWxXb3JrID0gbmV3IFRlc3RXb3JrSXRlbVtdIHsKLSAgICAgICAgICAgICAgICBuZXcgVGVzdFdvcmtJdGVtKHdvcms0LCAwLCAyKSwgbmV3IFRlc3RXb3JrSXRlbSh3b3JrNSksIG5ldyBUZXN0V29ya0l0ZW0od29yazYpIH07Ci0gICAgICAgIGtUZXN0RW52aXJvbm1lbnQuc2V0RXhwZWN0ZWRFeGVjdXRpb25zKDEpOwotICAgICAgICBrVGVzdEVudmlyb25tZW50LnNldEV4cGVjdGVkV29yayhmaW5hbFdvcmspOwotICAgICAgICBtSm9iU2NoZWR1bGVyLmVucXVldWUoamksIG5ldyBKb2JXb3JrSXRlbSh3b3JrNSkpOwotICAgICAgICBtSm9iU2NoZWR1bGVyLmVucXVldWUoamksIG5ldyBKb2JXb3JrSXRlbSh3b3JrNikpOwotICAgICAgICBrVGVzdEVudmlyb25tZW50LnJlYWR5VG9Xb3JrKCk7Ci0gICAgICAgIFN5c3RlbVV0aWwucnVuU2hlbGxDb21tYW5kKGdldEluc3RydW1lbnRhdGlvbigpLCAiY21kIGpvYnNjaGVkdWxlciBydW4gIgotICAgICAgICAgICAgICAgICsga0pvYlNlcnZpY2VDb21wb25lbnQuZ2V0UGFja2FnZU5hbWUoKSArICIgIiArIEVOUVVFVUVfV09SS19KT0JfSUQpOwotCi0gICAgICAgIGFzc2VydFRydWUoIlJlc3RhcnRlZCB3aXRoIHdvcmsgZW5xdWV1ZWQgZGlkIG5vdCBleGVjdXRlLiIsCi0gICAgICAgICAgICAgICAga1Rlc3RFbnZpcm9ubWVudC5hd2FpdEV4ZWN1dGlvbigpKTsKLSAgICAgICAgY29tcGFyZVdvcmsoZmluYWxXb3JrLCBrVGVzdEVudmlyb25tZW50LmdldExhc3RSZWNlaXZlZFdvcmsoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBiYXNpYyBlbnF1ZXVlaW5nIGJhdGNoZXMgb2Ygd29yay4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW5xdWV1ZU11bHRpcGxlVXJpR3JhbnRXb3JrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFN0YXJ0IG91dCB3aXRoIHN0b3JhZ2UgbG93LCBzbyBqb2IgaXMgZW5xdWV1ZWQgYnV0IG5vdCBleGVjdXRlZCB5ZXQuCi0gICAgICAgIHNldFN0b3JhZ2VTdGF0ZSh0cnVlKTsKLQotICAgICAgICAvLyBXZSBuZWVkIHRvIGdldCBhIHBlcm1pc3Npb24gZ3JhbnQgc28gdGhhdCB3ZSBjYW4gZ3JhbnQgaXQgdG8gb3Vyc2VsZi4KLSAgICAgICAgbVByb3ZpZGVyLmNhbGwoImdyYW50IiwgTVlfUEFDS0FHRSwgbUZpcnN0VXJpQnVuZGxlKTsKLSAgICAgICAgbVByb3ZpZGVyLmNhbGwoImdyYW50IiwgTVlfUEFDS0FHRSwgbVNlY29uZFVyaUJ1bmRsZSk7Ci0gICAgICAgIGFzc2VydEhhc1VyaVBlcm1pc3Npb24obUZpcnN0VXJpLCBJbnRlbnQuRkxBR19HUkFOVF9SRUFEX1VSSV9QRVJNSVNTSU9OCi0gICAgICAgICAgICAgICAgfCBJbnRlbnQuRkxBR19HUkFOVF9XUklURV9VUklfUEVSTUlTU0lPTik7Ci0gICAgICAgIGFzc2VydEhhc1VyaVBlcm1pc3Npb24obVNlY29uZFVyaSwgSW50ZW50LkZMQUdfR1JBTlRfUkVBRF9VUklfUEVSTUlTU0lPTgotICAgICAgICAgICAgICAgIHwgSW50ZW50LkZMQUdfR1JBTlRfV1JJVEVfVVJJX1BFUk1JU1NJT04pOwotCi0gICAgICAgIEludGVudCB3b3JrMSA9IG5ldyBJbnRlbnQoIndvcmsxIik7Ci0gICAgICAgIHdvcmsxLnNldEZsYWdzKEludGVudC5GTEFHX0dSQU5UX1JFQURfVVJJX1BFUk1JU1NJT04KLSAgICAgICAgICAgICAgICB8IEludGVudC5GTEFHX0dSQU5UX1dSSVRFX1VSSV9QRVJNSVNTSU9OKTsKLSAgICAgICAgd29yazEuc2V0RGF0YShtRmlyc3RVcmkpOwotICAgICAgICB3b3JrMS5zZXRDbGlwRGF0YShtU2Vjb25kQ2xpcERhdGEpOwotCi0gICAgICAgIEludGVudCB3b3JrMiA9IG5ldyBJbnRlbnQoIndvcmsyIik7Ci0gICAgICAgIHdvcmsyLnNldEZsYWdzKEludGVudC5GTEFHX0dSQU5UX1JFQURfVVJJX1BFUk1JU1NJT04KLSAgICAgICAgICAgICAgICB8IEludGVudC5GTEFHX0dSQU5UX1dSSVRFX1VSSV9QRVJNSVNTSU9OKTsKLSAgICAgICAgd29yazIuc2V0RGF0YShtRmlyc3RVcmkpOwotCi0gICAgICAgIFRlc3RXb3JrSXRlbVtdIHdvcmsgPSBuZXcgVGVzdFdvcmtJdGVtW10gewotICAgICAgICAgICAgICAgIG5ldyBUZXN0V29ya0l0ZW0od29yazEsIG5ldyBVcmlbXSB7IG1GaXJzdFVyaSwgbVNlY29uZFVyaX0sIG5ldyBVcmlbMF0pLAotICAgICAgICAgICAgICAgIG5ldyBUZXN0V29ya0l0ZW0od29yazIsIG5ldyBVcmlbXSB7IG1GaXJzdFVyaSB9LCBuZXcgVXJpW10geyBtU2Vjb25kVXJpfSkgfTsKLSAgICAgICAga1Rlc3RFbnZpcm9ubWVudC5zZXRFeHBlY3RlZEV4ZWN1dGlvbnMoMSk7Ci0gICAgICAgIGtUZXN0RW52aXJvbm1lbnQuc2V0RXhwZWN0ZWRXb3JrKHdvcmspOwotICAgICAgICBKb2JJbmZvIGppID0gbUJ1aWxkZXIuc2V0T3ZlcnJpZGVEZWFkbGluZSgwKS5zZXRSZXF1aXJlc1N0b3JhZ2VOb3RMb3codHJ1ZSkuYnVpbGQoKTsKLSAgICAgICAgbUpvYlNjaGVkdWxlci5lbnF1ZXVlKGppLCBuZXcgSm9iV29ya0l0ZW0od29yazEpKTsKLSAgICAgICAgbUpvYlNjaGVkdWxlci5lbnF1ZXVlKGppLCBuZXcgSm9iV29ya0l0ZW0od29yazIpKTsKLQotICAgICAgICAvLyBSZW1vdmUgdGhlIGV4cGxpY2l0IGdyYW50LCB3ZSBzaG91bGQgc3RpbGwgaGF2ZSBhIGdyYW50IGR1ZSB0byB0aGUgam9iLgotICAgICAgICBtUHJvdmlkZXIuY2FsbCgicmV2b2tlIiwgTVlfUEFDS0FHRSwgbUZpcnN0VXJpQnVuZGxlKTsKLSAgICAgICAgbVByb3ZpZGVyLmNhbGwoInJldm9rZSIsIE1ZX1BBQ0tBR0UsIG1TZWNvbmRVcmlCdW5kbGUpOwotICAgICAgICBhc3NlcnRIYXNVcmlQZXJtaXNzaW9uKG1GaXJzdFVyaSwgSW50ZW50LkZMQUdfR1JBTlRfUkVBRF9VUklfUEVSTUlTU0lPTgotICAgICAgICAgICAgICAgIHwgSW50ZW50LkZMQUdfR1JBTlRfV1JJVEVfVVJJX1BFUk1JU1NJT04pOwotICAgICAgICBhc3NlcnRIYXNVcmlQZXJtaXNzaW9uKG1TZWNvbmRVcmksIEludGVudC5GTEFHX0dSQU5UX1JFQURfVVJJX1BFUk1JU1NJT04KLSAgICAgICAgICAgICAgICB8IEludGVudC5GTEFHX0dSQU5UX1dSSVRFX1VSSV9QRVJNSVNTSU9OKTsKLQotICAgICAgICBrVGVzdEVudmlyb25tZW50LnJlYWR5VG9Xb3JrKCk7Ci0KLSAgICAgICAgLy8gTm93IGFsbG93IHRoZSBqb2IgdG8gcnVuLgotICAgICAgICBzZXRTdG9yYWdlU3RhdGUoZmFsc2UpOwotCi0gICAgICAgIGFzc2VydFRydWUoIkpvYiB3aXRoIHdvcmsgZW5xdWV1ZWQgZGlkIG5vdCBmaXJlLiIsCi0gICAgICAgICAgICAgICAga1Rlc3RFbnZpcm9ubWVudC5hd2FpdEV4ZWN1dGlvbigpKTsKLSAgICAgICAgY29tcGFyZVdvcmsod29yaywga1Rlc3RFbnZpcm9ubWVudC5nZXRMYXN0UmVjZWl2ZWRXb3JrKCkpOwotCi0gICAgICAgIC8vIEFuZCB3YWl0IGZvciBldmVyeXRoaW5nIHRvIGJlIGNsZWFuZWQgdXAuCi0gICAgICAgIHdhaXRQZXJtaXNzaW9uUmV2b2tlKG1GaXJzdFVyaSwgSW50ZW50LkZMQUdfR1JBTlRfV1JJVEVfVVJJX1BFUk1JU1NJT04sIDUwMDApOwotICAgICAgICB3YWl0UGVybWlzc2lvblJldm9rZShtU2Vjb25kVXJpLCBJbnRlbnQuRkxBR19HUkFOVF9XUklURV9VUklfUEVSTUlTU0lPTiwgNTAwMCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvSm9iU2NoZWR1bGVyL3NyYy9hbmRyb2lkL2pvYnNjaGVkdWxlci9jdHMvU2hhcmVkVWlkVGVzdC5qYXZhIGIvdGVzdHMvSm9iU2NoZWR1bGVyL3NyYy9hbmRyb2lkL2pvYnNjaGVkdWxlci9jdHMvU2hhcmVkVWlkVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODI4MjhmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL0pvYlNjaGVkdWxlci9zcmMvYW5kcm9pZC9qb2JzY2hlZHVsZXIvY3RzL1NoYXJlZFVpZFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5qb2JzY2hlZHVsZXIuY3RzOwotCi1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLlRhcmdldEFwaTsKLWltcG9ydCBhbmRyb2lkLmFwcC5qb2IuSm9iSW5mbzsKLWltcG9ydCBhbmRyb2lkLmFwcC5qb2IuSm9iU2NoZWR1bGVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuam9ic2NoZWR1bGVyLk1vY2tKb2JTZXJ2aWNlOwotaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKLQotQFRhcmdldEFwaSgyNykKLXB1YmxpYyBjbGFzcyBTaGFyZWRVaWRUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlNoYXJlZFVpZFRlc3QiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9USEVSX1BBQ0tBR0UgPSAiYW5kcm9pZC5qb2JzY2hlZHVsZXIuY3RzLnNoYXJlZHVpZCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBCUk9BRENBU1RfVElNRU9VVF9TRUNPTkRTID0gMiAqIDYwOwotCi0gICAgLyoqCi0gICAgICogVGVzdCB0byBtYWtlIHN1cmUgZGlzYWJsaW5nIGEgcGFja2FnZSB3b3VsZG4ndCBjYW5jZWwgdGhlIGpvYnMgZnJvbSBvdGhlciBwYWNrYWdlcyB0aGF0IHVzZQotICAgICAqIHRoZSBzYW1lIHNoYXJlZCBVSUQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdENhbmNlbERpc2FibGVkUGFja2FnZUpvYigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBpbnQgSk9CSUQgPSAxMTIyMzMxOwotCi0gICAgICAgIGZpbmFsIEpvYlNjaGVkdWxlciBqcyA9IGdldENvbnRleHQoKS5nZXRTeXN0ZW1TZXJ2aWNlKEpvYlNjaGVkdWxlci5jbGFzcyk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEpvYkluZm8gamkgPSBuZXcgSm9iSW5mby5CdWlsZGVyKEpPQklELAotICAgICAgICAgICAgICAgICAgICBuZXcgQ29tcG9uZW50TmFtZShnZXRDb250ZXh0KCksIE1vY2tKb2JTZXJ2aWNlLmNsYXNzKSkKLSAgICAgICAgICAgICAgICAgICAgLnNldE1pbmltdW1MYXRlbmN5KDEwMDAgKiA2MCAqIDYwICogMjQgLyogMSBkYXkgKi8pCi0gICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwotCi0gICAgICAgICAgICBqcy5jYW5jZWwoSk9CSUQpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSm9iU2NoZWR1bGVyLlJFU1VMVF9TVUNDRVNTLCBqcy5zY2hlZHVsZShqaSkpOwotCi0gICAgICAgICAgICAvLyBUaGUgam9iIHNob3VsZCBiZSBzY2hlZHVsZWQuCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJKb2Igc2hvdWxkIGJlIHJlZ2lzdGVyZWQiLCBqcy5nZXRQZW5kaW5nSm9iKEpPQklEKSk7Ci0KLSAgICAgICAgICAgIC8vIENyZWF0ZSBhIGZpbHRlciB3aXRoIHRoZSBsb3dlc2V0IHByaW9yaXR5IHRvIHdhaXQgdW50aWwgdGhlIGpvYnNjaGVkdWVsciByZWNlaXZlcyB0aGUKLSAgICAgICAgICAgIC8vIGludGVudC4KLSAgICAgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOwotCi0gICAgICAgICAgICBmaW5hbCBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEludGVudEZpbHRlcigpOwotICAgICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX1BBQ0tBR0VfQ0hBTkdFRCk7Ci0gICAgICAgICAgICBmaWx0ZXIuYWRkRGF0YVNjaGVtZSgicGFja2FnZSIpOwotICAgICAgICAgICAgZmlsdGVyLnNldFByaW9yaXR5KEludGVudEZpbHRlci5TWVNURU1fTE9XX1BSSU9SSVRZKTsKLQotICAgICAgICAgICAgZ2V0Q29udGV4dCgpLnJlZ2lzdGVyUmVjZWl2ZXIobmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE9USEVSX1BBQ0tBR0UuZXF1YWxzKGludGVudC5nZXREYXRhKCkuZ2V0U2NoZW1lU3BlY2lmaWNQYXJ0KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0sIGZpbHRlcik7Ci0KLQotICAgICAgICAgICAgLy8gRGlzYWJsZSB0aGUgb3RoZXIgcGFja2FnZSB3aXRoIHRoZSBzYW1lIFVJRC4KLSAgICAgICAgICAgIGZpbmFsIFBhY2thZ2VNYW5hZ2VyIHBtID0gZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VNYW5hZ2VyKCk7Ci0gICAgICAgICAgICBwbS5zZXRBcHBsaWNhdGlvbkVuYWJsZWRTZXR0aW5nKAotICAgICAgICAgICAgICAgICAgICBPVEhFUl9QQUNLQUdFLAotICAgICAgICAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlci5DT01QT05FTlRfRU5BQkxFRF9TVEFURV9ESVNBQkxFRCwKLSAgICAgICAgICAgICAgICAgICAgUGFja2FnZU1hbmFnZXIuRE9OVF9LSUxMX0FQUCk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhQYWNrYWdlTWFuYWdlci5DT01QT05FTlRfRU5BQkxFRF9TVEFURV9ESVNBQkxFRCwKLSAgICAgICAgICAgICAgICAgICAgcG0uZ2V0QXBwbGljYXRpb25FbmFibGVkU2V0dGluZyhPVEhFUl9QQUNLQUdFKSk7Ci0KLSAgICAgICAgICAgIC8vIFdhaXQgdW50aWwgb3VyIHJlY2VpdmVyIGdldHMgdGhlIGJyb2FkY2FzdC4KLSAgICAgICAgICAgIGFzc2VydFRydWUobGF0Y2guYXdhaXQoQlJPQURDQVNUX1RJTUVPVVRfU0VDT05EUywgVGltZVVuaXQuU0VDT05EUykpOwotCi0gICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGpvYiBoYXNuJ3QgYmVlbiBjYW5jZWxlZC4KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIkpvYiBzaG91bGRuJ3QgYmUgY2FuY2VsZWQiLCBqcy5nZXRQZW5kaW5nSm9iKEpPQklEKSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBqcy5jYW5jZWwoSk9CSUQpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvSm9iU2NoZWR1bGVyL3NyYy9hbmRyb2lkL2pvYnNjaGVkdWxlci9jdHMvVGltaW5nQ29uc3RyYWludHNUZXN0LmphdmEgYi90ZXN0cy9Kb2JTY2hlZHVsZXIvc3JjL2FuZHJvaWQvam9ic2NoZWR1bGVyL2N0cy9UaW1pbmdDb25zdHJhaW50c1Rlc3QuamF2YQppbmRleCA3NWE3M2YyLi5iOTY4ODExIDEwMDY0NAotLS0gYS90ZXN0cy9Kb2JTY2hlZHVsZXIvc3JjL2FuZHJvaWQvam9ic2NoZWR1bGVyL2N0cy9UaW1pbmdDb25zdHJhaW50c1Rlc3QuamF2YQorKysgYi90ZXN0cy9Kb2JTY2hlZHVsZXIvc3JjL2FuZHJvaWQvam9ic2NoZWR1bGVyL2N0cy9UaW1pbmdDb25zdHJhaW50c1Rlc3QuamF2YQpAQCAtMjksNiArMjksNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDQU5DRUxfSk9CX0lEID0gVGltaW5nQ29uc3RyYWludHNUZXN0LmNsYXNzLmhhc2hDb2RlKCkgKyAxOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFWFBJUkVEX0pPQl9JRCA9IFRpbWluZ0NvbnN0cmFpbnRzVGVzdC5jbGFzcy5oYXNoQ29kZSgpICsgMjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVU5FWFBJUkVEX0pPQl9JRCA9IFRpbWluZ0NvbnN0cmFpbnRzVGVzdC5jbGFzcy5oYXNoQ29kZSgpICsgMzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWkVST19ERUxBWV9KT0JfSUQgPSBUaW1pbmdDb25zdHJhaW50c1Rlc3QuY2xhc3MuaGFzaENvZGUoKSArIDQ7CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2NoZWR1bGVPbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEpvYkluZm8gb25lVGltZUpvYiA9IG5ldyBKb2JJbmZvLkJ1aWxkZXIoVElNSU5HX0pPQl9JRCwga0pvYlNlcnZpY2VDb21wb25lbnQpCkBAIC00NSw2ICs0Niw3IEBACiAgICAgICAgIEpvYkluZm8gY2FuY2VsSm9iID0gbmV3IEpvYkluZm8uQnVpbGRlcihDQU5DRUxfSk9CX0lELCBrSm9iU2VydmljZUNvbXBvbmVudCkKICAgICAgICAgICAgICAgICAuc2V0TWluaW11bUxhdGVuY3koNTAwMEwpIC8vIG1ha2Ugc3VyZSBpdCBkb2Vzbid0IGFjdHVhbGx5IHJ1biBpbW1lZGlhdGVseQogICAgICAgICAgICAgICAgIC5zZXRPdmVycmlkZURlYWRsaW5lKDcwMDBMKQorICAgICAgICAgICAgICAgIC5zZXRSZXF1aXJlc0RldmljZUlkbGUodHJ1ZSkKICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKIAogICAgICAgICBrVGVzdEVudmlyb25tZW50LnNldEV4cGVjdGVkRXhlY3V0aW9ucygwKTsKQEAgLTU1LDYgKzU3LDE5IEBACiAgICAgICAgICAgICAgICAga1Rlc3RFbnZpcm9ubWVudC5hd2FpdFRpbWVvdXQoKSk7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgdGVzdEV4cGxpY2l0WmVyb0xhdGVuY3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSm9iSW5mbyBqb2IgPSBuZXcgSm9iSW5mby5CdWlsZGVyKFpFUk9fREVMQVlfSk9CX0lELCBrSm9iU2VydmljZUNvbXBvbmVudCkKKyAgICAgICAgICAgICAgICAuc2V0TWluaW11bUxhdGVuY3koMEwpCisgICAgICAgICAgICAgICAgLnNldFJlcXVpcmVzRGV2aWNlSWRsZSh0cnVlKQorICAgICAgICAgICAgICAgIC5zZXRPdmVycmlkZURlYWRsaW5lKDEwXzAwMEwpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIGtUZXN0RW52aXJvbm1lbnQuc2V0RXhwZWN0ZWRFeGVjdXRpb25zKDEpOworICAgICAgICBtSm9iU2NoZWR1bGVyLnNjaGVkdWxlKGpvYik7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gZXhlY3V0ZWQgPSBrVGVzdEVudmlyb25tZW50LmF3YWl0RXhlY3V0aW9uKCk7CisgICAgICAgIGFzc2VydFRydWUoIkZhaWxlZCB0byBleGVjdXRlIGpvYiB3aXRoIGV4cGxpY2l0IHplcm8gbWluIGxhdGVuY3kiLAorICAgICAgICAgICAgICAgIGtUZXN0RW52aXJvbm1lbnQuYXdhaXRFeGVjdXRpb24oKSk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogRW5zdXJlIHRoYXQgd2hlbiBhIGpvYiBpcyBleGVjdXRlZCBiZWNhdXNlIGl0cyBkZWFkbGluZSBoYXMgZXhwaXJlZCwgdGhhdAogICAgICAqIHtAbGluayBKb2JQYXJhbWV0ZXJzI2lzT3ZlcnJpZGVEZWFkbGluZUV4cGlyZWQoKX0gcmV0dXJucyB0aGUgY29ycmVjdCB2YWx1ZS4KZGlmZiAtLWdpdCBhL3Rlc3RzL0pvYlNjaGVkdWxlci9zcmMvYW5kcm9pZC9qb2JzY2hlZHVsZXIvY3RzL1RyaWdnZXJDb250ZW50VGVzdC5qYXZhIGIvdGVzdHMvSm9iU2NoZWR1bGVyL3NyYy9hbmRyb2lkL2pvYnNjaGVkdWxlci9jdHMvVHJpZ2dlckNvbnRlbnRUZXN0LmphdmEKaW5kZXggZmU0ODk1MC4uZTI5ZjFhZCAxMDA2NDQKLS0tIGEvdGVzdHMvSm9iU2NoZWR1bGVyL3NyYy9hbmRyb2lkL2pvYnNjaGVkdWxlci9jdHMvVHJpZ2dlckNvbnRlbnRUZXN0LmphdmEKKysrIGIvdGVzdHMvSm9iU2NoZWR1bGVyL3NyYy9hbmRyb2lkL2pvYnNjaGVkdWxlci9jdHMvVHJpZ2dlckNvbnRlbnRUZXN0LmphdmEKQEAgLTE2LDYgKzE2LDEwIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5qb2JzY2hlZHVsZXIuY3RzOwogCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKwogaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5UYXJnZXRBcGk7CiBpbXBvcnQgYW5kcm9pZC5hcHAuam9iLkpvYkluZm87CiBpbXBvcnQgYW5kcm9pZC5hcHAuam9iLkpvYlBhcmFtZXRlcnM7CkBAIC0xNTcsNiArMTYxLDcgQEAKICAgICAgICAgaWYgKGRlc3RGaWxlLmV4aXN0cygpKSB7CiAgICAgICAgICAgICBkZXN0RmlsZS5kZWxldGUoKTsKICAgICAgICAgfQorICAgICAgICBkZXN0RmlsZS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7CiAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZGVzdEZpbGUpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzQwOTZdOwpkaWZmIC0tZ2l0IGEvdGVzdHMvSm9iU2NoZWR1bGVyU2hhcmVkVWlkL0FuZHJvaWQubWsgYi90ZXN0cy9Kb2JTY2hlZHVsZXJTaGFyZWRVaWQvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wYjk5MTJjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSm9iU2NoZWR1bGVyU2hhcmVkVWlkL0FuZHJvaWQubWsKQEAgLTAsMCArMSw0NSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCisjIERvbid0IGluY2x1ZGUgdGhpcyBwYWNrYWdlIGluIGFueSB0YXJnZXQuCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCisjIFdoZW4gYnVpbHQsIGV4cGxpY2l0bHkgcHV0IGl0IGluIHRoZSBkYXRhIHBhcnRpdGlvbi4KK0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCisKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCB1Yi11aWF1dG9tYXRvciBhbmRyb2lkeC50ZXN0LnJ1bGVzCisKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKK0xPQ0FMX1NSQ19GSUxFUyArPSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIEpvYlNoYXJlZFVpZFRlc3RBcHAvc3JjKQorTE9DQUxfU1JDX0ZJTEVTICs9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgam9icGVybS9zcmMpCitMT0NBTF9TUkNfRklMRVMgKz0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzaGFyZWR1aWQvc3JjKQorCisjIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0CitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworCisjIE11c3QgbWF0Y2ggdGhlIHBhY2thZ2UgbmFtZSBpbiBDdHNUZXN0Q2FzZUxpc3QubWsKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNKb2JTY2hlZHVsZXJTaGFyZWRVaWRUZXN0Q2FzZXMKKworI0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKK0xPQ0FMX1BSSVZBVEVfUExBVEZPUk1fQVBJUyA6PSB0cnVlCisKK2luY2x1ZGUgJChCVUlMRF9DVFNfUEFDS0FHRSkKKworaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQpkaWZmIC0tZ2l0IGEvdGVzdHMvSm9iU2NoZWR1bGVyU2hhcmVkVWlkL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9Kb2JTY2hlZHVsZXJTaGFyZWRVaWQvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44MjRiNzNhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSm9iU2NoZWR1bGVyU2hhcmVkVWlkL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSw0NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImFuZHJvaWQuam9ic2NoZWR1bGVyLmN0cy5zaGFyZWR1aWR0ZXN0cyIKKyAgICBhbmRyb2lkOnNoYXJlZFVzZXJJZD0iYW5kcm9pZC5qb2JzY2hlZHVsZXIuY3RzLnNoYXJlZC51aWQiPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uRElTQUJMRV9LRVlHVUFSRCIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkFDQ0VTU19ORVRXT1JLX1NUQVRFIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX1dJRklfU1RBVEUiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5DSEFOR0VfTkVUV09SS19TVEFURSIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkNIQU5HRV9XSUZJX1NUQVRFIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVBRF9FWFRFUk5BTF9TVE9SQUdFIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uV1JJVEVfRVhURVJOQUxfU1RPUkFHRSIgLz4KKworICAgIDxhcHBsaWNhdGlvbj4KKyAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CisKKyAgICAgICAgPHNlcnZpY2UgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmpvYnNjaGVkdWxlci5Nb2NrSm9iU2VydmljZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGVybWlzc2lvbj0iYW5kcm9pZC5wZXJtaXNzaW9uLkJJTkRfSk9CX1NFUlZJQ0UiIC8+CisgICAgICAgIDxzZXJ2aWNlIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5qb2JzY2hlZHVsZXIuVHJpZ2dlckNvbnRlbnRKb2JTZXJ2aWNlIgorICAgICAgICAgICAgYW5kcm9pZDpwZXJtaXNzaW9uPSJhbmRyb2lkLnBlcm1pc3Npb24uQklORF9KT0JfU0VSVklDRSIgLz4KKworICAgICAgICA8cHJvdmlkZXIgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmpvYnNjaGVkdWxlci5EdW1teUpvYkNvbnRlbnRQcm92aWRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6YXV0aG9yaXRpZXM9ImFuZHJvaWQuam9ic2NoZWR1bGVyLmR1bW15cHJvdmlkZXIiIGFuZHJvaWQ6bXVsdGlwcm9jZXNzPSJmYWxzZSIgLz4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPCEtLSAgc2VsZi1pbnN0cnVtZW50aW5nIHRlc3QgcGFja2FnZS4gLS0+CisgICAgPGluc3RydW1lbnRhdGlvbgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iSm9iU2NoZWR1bGVyIHNoYXJlZC11aWQgZGV2aWNlLXNpZGUgdGVzdHMiCisgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5qb2JzY2hlZHVsZXIuY3RzLnNoYXJlZHVpZHRlc3RzIiA+CisgICAgPC9pbnN0cnVtZW50YXRpb24+Cis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvSm9iU2NoZWR1bGVyU2hhcmVkVWlkL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL0pvYlNjaGVkdWxlclNoYXJlZFVpZC9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI4ODg2MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0pvYlNjaGVkdWxlclNoYXJlZFVpZC9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKb2IgU2NoZWR1bGVyIHNoYXJlZC11aWQgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KKyAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImZyYW1ld29yayIgLz4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzSm9iU2NoZWR1bGVyU2hhcmVkVWlkVGVzdENhc2VzLmFwayIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0pvYlNjaGVkdWxlckpvYlBlcm0uYXBrIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzSm9iU2NoZWR1bGVyU2hhcmVkVWlkLmFwayIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0pvYlNoYXJlZFVpZFRlc3RBcHAuYXBrIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5BbmRyb2lkSlVuaXRUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0icGFja2FnZSIgdmFsdWU9ImFuZHJvaWQuam9ic2NoZWR1bGVyLmN0cy5zaGFyZWR1aWR0ZXN0cyIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJydW50aW1lLWhpbnQiIHZhbHVlPSIybSIgLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9Kb2JTY2hlZHVsZXJTaGFyZWRVaWQvSm9iU2hhcmVkVWlkVGVzdEFwcC9BbmRyb2lkLm1rIGIvdGVzdHMvSm9iU2NoZWR1bGVyU2hhcmVkVWlkL0pvYlNoYXJlZFVpZFRlc3RBcHAvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2QzNmRiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSm9iU2NoZWR1bGVyU2hhcmVkVWlkL0pvYlNoYXJlZFVpZFRlc3RBcHAvQW5kcm9pZC5tawpAQCAtMCwwICsxLDMxIEBACisjIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKKyMgRG9uJ3QgaW5jbHVkZSB0aGlzIHBhY2thZ2UgaW4gYW55IHRhcmdldC4KK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpIFwKKworIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0pvYlNoYXJlZFVpZFRlc3RBcHAKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKKworaW5jbHVkZSAkKEJVSUxEX0NUU19QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvdGVzdHMvSm9iU2NoZWR1bGVyU2hhcmVkVWlkL0pvYlNoYXJlZFVpZFRlc3RBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL0pvYlNjaGVkdWxlclNoYXJlZFVpZC9Kb2JTaGFyZWRVaWRUZXN0QXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MwMzBhOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0pvYlNjaGVkdWxlclNoYXJlZFVpZC9Kb2JTaGFyZWRVaWRUZXN0QXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwzMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgcGFja2FnZT0iYW5kcm9pZC5qb2JzY2hlZHVsZXIuY3RzLnNoYXJlZHVpZC5qb2J0ZXN0YXBwIj4KKworICAgIDwhLS0gVGhpcyBhcHBsaWNhdGlvbiBzY2hlZHVsZXMgam9icyBpbmRlcGVuZGVudGx5IG9mIHRoZSB0ZXN0IGluc3RydW1lbnRhdGlvbiB0byBtYWtlCisgICAgaXQgcG9zc2libGUgdG8gdGVzdCBiZWhhdmlvdXIgZm9yIGRpZmZlcmVudCBhcHAgc3RhdGVzLCB3aGl0ZWxpc3RzIGFuZCBkZXZpY2UgaWRsZSBtb2RlcyAtLT4KKyAgICA8YXBwbGljYXRpb24+CisgICAgICAgIDxzZXJ2aWNlIGFuZHJvaWQ6bmFtZT0iLlRlc3RKb2JTZXJ2aWNlIgorICAgICAgICAgICAgICAgICBhbmRyb2lkOnBlcm1pc3Npb249ImFuZHJvaWQucGVybWlzc2lvbi5CSU5EX0pPQl9TRVJWSUNFIiAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuVGVzdEFjdGl2aXR5IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIgLz4KKyAgICAgICAgPHJlY2VpdmVyIGFuZHJvaWQ6bmFtZT0iLlRlc3RKb2JTY2hlZHVsZXJSZWNlaXZlciIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiIC8+CisgICAgPC9hcHBsaWNhdGlvbj4KKworPC9tYW5pZmVzdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9Kb2JTY2hlZHVsZXJTaGFyZWRVaWQvSm9iU2hhcmVkVWlkVGVzdEFwcC9zcmMvYW5kcm9pZC9qb2JzY2hlZHVsZXIvY3RzL2pvYnRlc3RhcHAvVGVzdEFjdGl2aXR5LmphdmEgYi90ZXN0cy9Kb2JTY2hlZHVsZXJTaGFyZWRVaWQvSm9iU2hhcmVkVWlkVGVzdEFwcC9zcmMvYW5kcm9pZC9qb2JzY2hlZHVsZXIvY3RzL2pvYnRlc3RhcHAvVGVzdEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzcxMDdjMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0pvYlNjaGVkdWxlclNoYXJlZFVpZC9Kb2JTaGFyZWRVaWRUZXN0QXBwL3NyYy9hbmRyb2lkL2pvYnNjaGVkdWxlci9jdHMvam9idGVzdGFwcC9UZXN0QWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQuam9ic2NoZWR1bGVyLmN0cy5qb2J0ZXN0YXBwOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKy8qKgorICogSnVzdCBhIGR1bW15IGFjdGl2aXR5IHRvIGtlZXAgdGhlIHRlc3QgYXBwIHByb2Nlc3MgaW4gdGhlIGZvcmVncm91bmQgc3RhdGUgd2hlbiBkZXNpcmVkLgorICovCitwdWJsaWMgY2xhc3MgVGVzdEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBUZXN0QWN0aXZpdHkuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFX05BTUUgPSAiYW5kcm9pZC5qb2JzY2hlZHVsZXIuY3RzLmpvYnRlc3RhcHAiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgREVGQVVMVF9XQUlUX0RVUkFUSU9OID0gMzBfMDAwOworCisgICAgc3RhdGljIGZpbmFsIGludCBGSU5JU0hfQUNUSVZJVFlfTVNHID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fRklOSVNIX0FDVElWSVRZID0gUEFDS0FHRV9OQU1FICsgIi5hY3Rpb24uRklOSVNIX0FDVElWSVRZIjsKKworICAgIEhhbmRsZXIgbUZpbmlzaEhhbmRsZXIgPSBuZXcgSGFuZGxlcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEZJTklTSF9BQ1RJVklUWV9NU0c6CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkZpbmlzaGluZyB0ZXN0IGFjdGl2aXR5OiAiICsgVGVzdEFjdGl2aXR5LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIHVucmVnaXN0ZXJSZWNlaXZlcihtRmluaXNoUmVjZWl2ZXIpOworICAgICAgICAgICAgICAgICAgICBmaW5pc2goKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBmaW5hbCBCcm9hZGNhc3RSZWNlaXZlciBtRmluaXNoUmVjZWl2ZXIgPSBuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICBtRmluaXNoSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhGSU5JU0hfQUNUSVZJVFlfTVNHKTsKKyAgICAgICAgICAgIG1GaW5pc2hIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoRklOSVNIX0FDVElWSVRZX01TRyk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2UpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAiU3RhcnRlZCB0ZXN0IGFjdGl2aXR5OiAiICsgVGVzdEFjdGl2aXR5LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2UpOworICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IGZpbmlzaCBhZnRlciAzMCBzZWNvbmRzLgorICAgICAgICBtRmluaXNoSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlRGVsYXllZChGSU5JU0hfQUNUSVZJVFlfTVNHLCBERUZBVUxUX1dBSVRfRFVSQVRJT04pOworICAgICAgICByZWdpc3RlclJlY2VpdmVyKG1GaW5pc2hSZWNlaXZlciwgbmV3IEludGVudEZpbHRlcihBQ1RJT05fRklOSVNIX0FDVElWSVRZKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvSm9iU2NoZWR1bGVyU2hhcmVkVWlkL0pvYlNoYXJlZFVpZFRlc3RBcHAvc3JjL2FuZHJvaWQvam9ic2NoZWR1bGVyL2N0cy9qb2J0ZXN0YXBwL1Rlc3RKb2JTY2hlZHVsZXJSZWNlaXZlci5qYXZhIGIvdGVzdHMvSm9iU2NoZWR1bGVyU2hhcmVkVWlkL0pvYlNoYXJlZFVpZFRlc3RBcHAvc3JjL2FuZHJvaWQvam9ic2NoZWR1bGVyL2N0cy9qb2J0ZXN0YXBwL1Rlc3RKb2JTY2hlZHVsZXJSZWNlaXZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZTBhMDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Kb2JTY2hlZHVsZXJTaGFyZWRVaWQvSm9iU2hhcmVkVWlkVGVzdEFwcC9zcmMvYW5kcm9pZC9qb2JzY2hlZHVsZXIvY3RzL2pvYnRlc3RhcHAvVGVzdEpvYlNjaGVkdWxlclJlY2VpdmVyLmphdmEKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5qb2JzY2hlZHVsZXIuY3RzLmpvYnRlc3RhcHA7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5qb2IuSm9iSW5mbzsKK2ltcG9ydCBhbmRyb2lkLmFwcC5qb2IuSm9iU2NoZWR1bGVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKy8qKgorICogU2NoZWR1bGVzIGpvYnMgZm9yIHRoaXMgcGFja2FnZSBidXQgZG9lcyBub3QsIGJ5IGl0c2VsZiwgb2NjdXB5IGEgZm9yZWdyb3VuZCB1aWQgc3RhdGUKKyAqIHdoaWxlIGRvaW5nIHNvLgorICovCitwdWJsaWMgY2xhc3MgVGVzdEpvYlNjaGVkdWxlclJlY2VpdmVyIGV4dGVuZHMgQnJvYWRjYXN0UmVjZWl2ZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBUZXN0Sm9iU2NoZWR1bGVyUmVjZWl2ZXIuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFX05BTUUgPSAiYW5kcm9pZC5qb2JzY2hlZHVsZXIuY3RzLmpvYnRlc3RhcHAiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfSk9CX0lEX0tFWSA9IFBBQ0tBR0VfTkFNRSArICIuZXh0cmEuSk9CX0lEIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9BTExPV19JTl9JRExFID0gUEFDS0FHRV9OQU1FICsgIi5leHRyYS5BTExPV19JTl9JRExFIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fU0NIRURVTEVfSk9CID0gUEFDS0FHRV9OQU1FICsgIi5hY3Rpb24uU0NIRURVTEVfSk9CIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fQ0FOQ0VMX0pPQlMgPSBQQUNLQUdFX05BTUUgKyAiLmFjdGlvbi5DQU5DRUxfSk9CUyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSk9CX0lOSVRJQUxfQkFDS09GRiA9IDEwXzAwMDsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgZmluYWwgQ29tcG9uZW50TmFtZSBqb2JTZXJ2aWNlQ29tcG9uZW50ID0gbmV3IENvbXBvbmVudE5hbWUoY29udGV4dCwgVGVzdEpvYlNlcnZpY2UuY2xhc3MpOworICAgICAgICBmaW5hbCBKb2JTY2hlZHVsZXIgam9iU2NoZWR1bGVyID0gY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKEpvYlNjaGVkdWxlci5jbGFzcyk7CisgICAgICAgIHN3aXRjaCAoaW50ZW50LmdldEFjdGlvbigpKSB7CisgICAgICAgICAgICBjYXNlIEFDVElPTl9DQU5DRUxfSk9CUzoKKyAgICAgICAgICAgICAgICBqb2JTY2hlZHVsZXIuY2FuY2VsQWxsKCk7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQ2FuY2VsbGVkIGFsbCBqb2JzIGZvciAiICsgY29udGV4dC5nZXRQYWNrYWdlTmFtZSgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQUNUSU9OX1NDSEVEVUxFX0pPQjoKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgam9iSWQgPSBpbnRlbnQuZ2V0SW50RXh0cmEoRVhUUkFfSk9CX0lEX0tFWSwgaGFzaENvZGUoKSk7CisgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBhbGxvd0luSWRsZSA9IGludGVudC5nZXRCb29sZWFuRXh0cmEoRVhUUkFfQUxMT1dfSU5fSURMRSwgZmFsc2UpOworICAgICAgICAgICAgICAgIEpvYkluZm8uQnVpbGRlciBqb2JCdWlsZGVyID0gbmV3IEpvYkluZm8uQnVpbGRlcihqb2JJZCwgam9iU2VydmljZUNvbXBvbmVudCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRCYWNrb2ZmQ3JpdGVyaWEoSk9CX0lOSVRJQUxfQkFDS09GRiwgSm9iSW5mby5CQUNLT0ZGX1BPTElDWV9MSU5FQVIpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0T3ZlcnJpZGVEZWFkbGluZSgwKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEltcG9ydGFudFdoaWxlRm9yZWdyb3VuZChhbGxvd0luSWRsZSk7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHJlc3VsdCA9IGpvYlNjaGVkdWxlci5zY2hlZHVsZShqb2JCdWlsZGVyLmJ1aWxkKCkpOworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gSm9iU2NoZWR1bGVyLlJFU1VMVF9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkNvdWxkIG5vdCBzY2hlZHVsZSBqb2IgIiArIGpvYklkKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJTdWNjZXNzZnVsbHkgc2NoZWR1bGVkIGpvYiB3aXRoIGlkICIgKyBqb2JJZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJVbmtub3duIGFjdGlvbiAiICsgaW50ZW50LmdldEFjdGlvbigpKTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9Kb2JTY2hlZHVsZXJTaGFyZWRVaWQvSm9iU2hhcmVkVWlkVGVzdEFwcC9zcmMvYW5kcm9pZC9qb2JzY2hlZHVsZXIvY3RzL2pvYnRlc3RhcHAvVGVzdEpvYlNlcnZpY2UuamF2YSBiL3Rlc3RzL0pvYlNjaGVkdWxlclNoYXJlZFVpZC9Kb2JTaGFyZWRVaWRUZXN0QXBwL3NyYy9hbmRyb2lkL2pvYnNjaGVkdWxlci9jdHMvam9idGVzdGFwcC9UZXN0Sm9iU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYTJlYmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Kb2JTY2hlZHVsZXJTaGFyZWRVaWQvSm9iU2hhcmVkVWlkVGVzdEFwcC9zcmMvYW5kcm9pZC9qb2JzY2hlZHVsZXIvY3RzL2pvYnRlc3RhcHAvVGVzdEpvYlNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQuam9ic2NoZWR1bGVyLmN0cy5qb2J0ZXN0YXBwOworCitpbXBvcnQgYW5kcm9pZC5hcHAuam9iLkpvYlBhcmFtZXRlcnM7CitpbXBvcnQgYW5kcm9pZC5hcHAuam9iLkpvYlNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitwdWJsaWMgY2xhc3MgVGVzdEpvYlNlcnZpY2UgZXh0ZW5kcyBKb2JTZXJ2aWNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gVGVzdEpvYlNlcnZpY2UuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFX05BTUUgPSAiYW5kcm9pZC5qb2JzY2hlZHVsZXIuY3RzLmpvYnRlc3RhcHAiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9KT0JfU1RBUlRFRCA9IFBBQ0tBR0VfTkFNRSArICIuYWN0aW9uLkpPQl9TVEFSVEVEIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fSk9CX1NUT1BQRUQgPSBQQUNLQUdFX05BTUUgKyAiLmFjdGlvbi5KT0JfU1RPUFBFRCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSk9CX1BBUkFNU19FWFRSQV9LRVkgPSBQQUNLQUdFX05BTUUgKyAiLmV4dHJhLkpPQl9QQVJBTUVURVJTIjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uU3RhcnRKb2IoSm9iUGFyYW1ldGVycyBwYXJhbXMpIHsKKyAgICAgICAgTG9nLmkoVEFHLCAiVGVzdCBqb2IgZXhlY3V0aW5nOiAiICsgcGFyYW1zLmdldEpvYklkKCkpOworICAgICAgICBmaW5hbCBJbnRlbnQgcmVwb3J0Sm9iU3RhcnRJbnRlbnQgPSBuZXcgSW50ZW50KEFDVElPTl9KT0JfU1RBUlRFRCk7CisgICAgICAgIHJlcG9ydEpvYlN0YXJ0SW50ZW50LnB1dEV4dHJhKEpPQl9QQVJBTVNfRVhUUkFfS0VZLCBwYXJhbXMpOworICAgICAgICBzZW5kQnJvYWRjYXN0KHJlcG9ydEpvYlN0YXJ0SW50ZW50KTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25TdG9wSm9iKEpvYlBhcmFtZXRlcnMgcGFyYW1zKSB7CisgICAgICAgIExvZy5pKFRBRywgIlRlc3Qgam9iIHN0b3BwZWQgZXhlY3V0aW5nOiAiICsgcGFyYW1zLmdldEpvYklkKCkpOworICAgICAgICBmaW5hbCBJbnRlbnQgcmVwb3J0Sm9iU3RvcEludGVudCA9IG5ldyBJbnRlbnQoQUNUSU9OX0pPQl9TVE9QUEVEKTsKKyAgICAgICAgcmVwb3J0Sm9iU3RvcEludGVudC5wdXRFeHRyYShKT0JfUEFSQU1TX0VYVFJBX0tFWSwgcGFyYW1zKTsKKyAgICAgICAgc2VuZEJyb2FkY2FzdChyZXBvcnRKb2JTdG9wSW50ZW50KTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvSm9iU2NoZWR1bGVyU2hhcmVkVWlkL2Fzc2V0cy92aW9sZXQuanBnIGIvdGVzdHMvSm9iU2NoZWR1bGVyU2hhcmVkVWlkL2Fzc2V0cy92aW9sZXQuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ODVkZmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Kb2JTY2hlZHVsZXJTaGFyZWRVaWQvYXNzZXRzL3Zpb2xldC5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvSm9iU2NoZWR1bGVyU2hhcmVkVWlkL2pvYnBlcm0vQW5kcm9pZC5tayBiL3Rlc3RzL0pvYlNjaGVkdWxlclNoYXJlZFVpZC9qb2JwZXJtL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRlY2RmMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0pvYlNjaGVkdWxlclNoYXJlZFVpZC9qb2JwZXJtL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzNCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCisjIERvbid0IGluY2x1ZGUgdGhpcyBwYWNrYWdlIGluIGFueSB0YXJnZXQuCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAorICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0IFwKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykgXAorCisjIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0CitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzSm9iU2NoZWR1bGVySm9iUGVybQorTE9DQUxfUFJJVkFURV9QTEFURk9STV9BUElTIDo9IHRydWUKKworaW5jbHVkZSAkKEJVSUxEX0NUU19QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvdGVzdHMvSm9iU2NoZWR1bGVyU2hhcmVkVWlkL2pvYnBlcm0vQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL0pvYlNjaGVkdWxlclNoYXJlZFVpZC9qb2JwZXJtL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDVlOWNmMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0pvYlNjaGVkdWxlclNoYXJlZFVpZC9qb2JwZXJtL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSw0NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAgfiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICB+CisgIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICB+CisgIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgfgorICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgICBwYWNrYWdlPSJhbmRyb2lkLmpvYnNjaGVkdWxlci5jdHMuc2hhcmVkdWlkLmpvYnBlcm0iPgorCisgICAgPCEtLQorICAgIEFuIGFwcCB0aGF0IGRlY2xhcmVzIGEgcGVybWlzc2lvbiB0aGF0IHJlcXVpcmVzIGEgbWF0Y2hpbmcgc2lnbmF0dXJlIHRvCisgICAgYWNjZXNzLgorICAgIC0tPgorICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5qb2JzY2hlZHVsZXIuY3RzLmpvYnBlcm0ucGVybSIKKyAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9InNpZ25hdHVyZSIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5qb2JzY2hlZHVsZXIuY3RzLmpvYnBlcm0ucGVybSIgLz4KKworICAgIDxhcHBsaWNhdGlvbj4KKyAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CisKKyAgICAgICAgPCEtLSBOZWVkIGEgd2F5IGZvciBhbm90aGVyIGFwcCB0byB0cnkgdG8gYWNjZXNzIHRoZSBwZXJtaXNzaW9uLiBTbyBjcmVhdGUgYSBjb250ZW50CisgICAgICAgIHByb3ZpZGVyIHdoaWNoIGlzIGVuZm9yY2VkIGJ5IHRoZSBwZXJtaXNzaW9uIC0tPgorICAgICAgICA8cHJvdmlkZXIgYW5kcm9pZDpuYW1lPSIuSm9iUGVybVByb3ZpZGVyIgorICAgICAgICAgICAgYW5kcm9pZDphdXRob3JpdGllcz0iYW5kcm9pZC5qb2JzY2hlZHVsZXIuY3RzLnNoYXJlZHVpZC5qb2JwZXJtLnByb3ZpZGVyIgorICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSI+CisgICAgICAgICAgICA8cGF0aC1wZXJtaXNzaW9uCisgICAgICAgICAgICAgICAgYW5kcm9pZDpwYXRoUHJlZml4PSIvcHJvdGVjdGVkIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cmVhZFBlcm1pc3Npb249ImFuZHJvaWQuam9ic2NoZWR1bGVyLmN0cy5qb2JwZXJtLnBlcm0iCisgICAgICAgICAgICAgICAgYW5kcm9pZDp3cml0ZVBlcm1pc3Npb249ImFuZHJvaWQuam9ic2NoZWR1bGVyLmN0cy5qb2JwZXJtLnBlcm0iIC8+CisgICAgICAgICAgICA8Z3JhbnQtdXJpLXBlcm1pc3Npb24gYW5kcm9pZDpwYXRoUGF0dGVybj0iLioiIC8+CisgICAgICAgIDwvcHJvdmlkZXI+CisgICAgPC9hcHBsaWNhdGlvbj4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9Kb2JTY2hlZHVsZXJTaGFyZWRVaWQvam9icGVybS9SRUFETUUudHh0IGIvdGVzdHMvSm9iU2NoZWR1bGVyU2hhcmVkVWlkL2pvYnBlcm0vUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGZhMDJlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSm9iU2NoZWR1bGVyU2hhcmVkVWlkL2pvYnBlcm0vUkVBRE1FLnR4dApAQCAtMCwwICsxLDIgQEAKK1RoaXMgQVBLIHVzZXMgdGhlIHNhbWUgc2hhcmVkIFVJRCBhcyBDdHNKb2JTY2hlZHVsZXJTaGFyZWRVaWRUZXN0Q2FzZXMuIEl0IGhhcyBubyBjb2RlIGJ1dCBleGlzdHMgZm9yCithIHNoYXJlZC1VSUQgdGVzdHMuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvSm9iU2NoZWR1bGVyU2hhcmVkVWlkL2pvYnBlcm0vc3JjL2FuZHJvaWQvam9ic2NoZWR1bGVyL2N0cy9zaGFyZWR1aWQvam9icGVybS9Kb2JQZXJtUHJvdmlkZXIuamF2YSBiL3Rlc3RzL0pvYlNjaGVkdWxlclNoYXJlZFVpZC9qb2JwZXJtL3NyYy9hbmRyb2lkL2pvYnNjaGVkdWxlci9jdHMvc2hhcmVkdWlkL2pvYnBlcm0vSm9iUGVybVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM2YjRiMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0pvYlNjaGVkdWxlclNoYXJlZFVpZC9qb2JwZXJtL3NyYy9hbmRyb2lkL2pvYnNjaGVkdWxlci9jdHMvc2hhcmVkdWlkL2pvYnBlcm0vSm9iUGVybVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5qb2JzY2hlZHVsZXIuY3RzLnNoYXJlZHVpZC5qb2JwZXJtOworCitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7CitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKKworLyoqCisgKiBFbXB0eSBjb250ZW50IHByb3ZpZGVyLCBhbGwgcGVybWlzc2lvbnMgYXJlIGVuZm9yY2VkIGluIG1hbmlmZXN0CisgKi8KK3B1YmxpYyBjbGFzcyBKb2JQZXJtUHJvdmlkZXIgZXh0ZW5kcyBDb250ZW50UHJvdmlkZXIgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCdW5kbGUgY2FsbChATm9uTnVsbCBTdHJpbmcgbWV0aG9kLCBATnVsbGFibGUgU3RyaW5nIGFyZywgQE51bGxhYmxlIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgaWYgKG1ldGhvZCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKG1ldGhvZCkgeworICAgICAgICAgICAgY2FzZSAiZ3JhbnQiOiB7CisgICAgICAgICAgICAgICAgVXJpIHVyaSA9IGV4dHJhcy5nZXRQYXJjZWxhYmxlKCJ1cmkiKTsKKyAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuZ3JhbnRVcmlQZXJtaXNzaW9uKGFyZywgdXJpLAorICAgICAgICAgICAgICAgICAgICAgICAgSW50ZW50LkZMQUdfR1JBTlRfUkVBRF9VUklfUEVSTUlTU0lPTiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVudC5GTEFHX0dSQU5UX1dSSVRFX1VSSV9QRVJNSVNTSU9OKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgInJldm9rZSI6IHsKKyAgICAgICAgICAgICAgICBVcmkgdXJpID0gZXh0cmFzLmdldFBhcmNlbGFibGUoInVyaSIpOworICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5yZXZva2VVcmlQZXJtaXNzaW9uKGFyZywgdXJpLAorICAgICAgICAgICAgICAgICAgICAgICAgSW50ZW50LkZMQUdfR1JBTlRfUkVBRF9VUklfUEVSTUlTU0lPTiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVudC5GTEFHX0dSQU5UX1dSSVRFX1VSSV9QRVJNSVNTSU9OKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5jYWxsKG1ldGhvZCwgYXJnLCBleHRyYXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZGVsZXRlKFVyaSB1cmksIFN0cmluZyBzZWxlY3Rpb24sIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MpIHsKKyAgICAgICAgLy8gZG8gbm90aGluZworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoVXJpIHVyaSkgeworICAgICAgICByZXR1cm4gImdvdC90aGVNSU1FIjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVXJpIGluc2VydChVcmkgdXJpLCBDb250ZW50VmFsdWVzIHZhbHVlcykgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDdXJzb3IgcXVlcnkoVXJpIHVyaSwgU3RyaW5nW10gcHJvamVjdGlvbiwgU3RyaW5nIHNlbGVjdGlvbiwKKyAgICAgICAgICAgIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MsIFN0cmluZyBzb3J0T3JkZXIpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCB1cGRhdGUoVXJpIHVyaSwgQ29udGVudFZhbHVlcyB2YWx1ZXMsIFN0cmluZyBzZWxlY3Rpb24sCisgICAgICAgICAgICBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBQYXJjZWxGaWxlRGVzY3JpcHRvciBvcGVuRmlsZShVcmkgdXJpLCBTdHJpbmcgbW9kZSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBQYXJjZWxGaWxlRGVzY3JpcHRvci5vcGVuKAorICAgICAgICAgICAgICAgIG5ldyBGaWxlKCIvZGV2L251bGwiKSwgUGFyY2VsRmlsZURlc2NyaXB0b3IuTU9ERV9SRUFEX09OTFkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0pvYlNjaGVkdWxlclNoYXJlZFVpZC9zaGFyZWR1aWQvQW5kcm9pZC5tayBiL3Rlc3RzL0pvYlNjaGVkdWxlclNoYXJlZFVpZC9zaGFyZWR1aWQvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmM4OWNkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSm9iU2NoZWR1bGVyU2hhcmVkVWlkL3NoYXJlZHVpZC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzQgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworIyBEb24ndCBpbmNsdWRlIHRoaXMgcGFja2FnZSBpbiBhbnkgdGFyZ2V0LgorTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKKworTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKKyAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBcCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpIFwKKworIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0pvYlNjaGVkdWxlclNoYXJlZFVpZAorTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorCitpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS90ZXN0cy9Kb2JTY2hlZHVsZXJTaGFyZWRVaWQvc2hhcmVkdWlkL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9Kb2JTY2hlZHVsZXJTaGFyZWRVaWQvc2hhcmVkdWlkL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTdlNTI0NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0pvYlNjaGVkdWxlclNoYXJlZFVpZC9zaGFyZWR1aWQvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICB+IENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgIH4KKyAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIH4KKyAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICB+CisgIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgIC0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICAgIHBhY2thZ2U9ImFuZHJvaWQuam9ic2NoZWR1bGVyLmN0cy5zaGFyZWR1aWQiCisgICAgICAgICAgYW5kcm9pZDpzaGFyZWRVc2VySWQ9ImFuZHJvaWQuam9ic2NoZWR1bGVyLmN0cy5zaGFyZWQudWlkIj4KKyAgICA8YXBwbGljYXRpb24+CisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgorICAgIDwvYXBwbGljYXRpb24+Cis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvSm9iU2NoZWR1bGVyU2hhcmVkVWlkL3NoYXJlZHVpZC9zcmMvYW5kcm9pZC9qb2JzY2hlZHVsZXIvY3RzL3NoYXJlZHVpZC9FbXB0eS5qYXZhIGIvdGVzdHMvSm9iU2NoZWR1bGVyU2hhcmVkVWlkL3NoYXJlZHVpZC9zcmMvYW5kcm9pZC9qb2JzY2hlZHVsZXIvY3RzL3NoYXJlZHVpZC9FbXB0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMmEyNjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Kb2JTY2hlZHVsZXJTaGFyZWRVaWQvc2hhcmVkdWlkL3NyYy9hbmRyb2lkL2pvYnNjaGVkdWxlci9jdHMvc2hhcmVkdWlkL0VtcHR5LmphdmEKQEAgLTAsMCArMSwxOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQuam9ic2NoZWR1bGVyLmN0cy5zaGFyZWR1aWQ7CisKK3B1YmxpYyBjbGFzcyBFbXB0eSB7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9Kb2JTY2hlZHVsZXJTaGFyZWRVaWQvc3JjL2FuZHJvaWQvam9ic2NoZWR1bGVyL0R1bW15Sm9iQ29udGVudFByb3ZpZGVyLmphdmEgYi90ZXN0cy9Kb2JTY2hlZHVsZXJTaGFyZWRVaWQvc3JjL2FuZHJvaWQvam9ic2NoZWR1bGVyL0R1bW15Sm9iQ29udGVudFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZhNGM0NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0pvYlNjaGVkdWxlclNoYXJlZFVpZC9zcmMvYW5kcm9pZC9qb2JzY2hlZHVsZXIvRHVtbXlKb2JDb250ZW50UHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDE2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0LgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuam9ic2NoZWR1bGVyOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuVXJpTWF0Y2hlcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZTsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVPcGVuSGVscGVyOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKKworLyoqCisgKiBTdHViIGNvbnRlbnQgcHJvdmlkZXIgdXNlZCBmb3IgZ2VuZXJhdGluZyBjb250ZW50IGNoYW5nZSByZXBvcnRzCisgKi8KK3B1YmxpYyBjbGFzcyBEdW1teUpvYkNvbnRlbnRQcm92aWRlciBleHRlbmRzIENvbnRlbnRQcm92aWRlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFCQVNFX05BTUUgPSAiZHVtbXkuZGIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1ZBTFVFX1RBQkxFID0gIm5hbWVfdmFsdWUiOworCisgICAgcHJpdmF0ZSBEYXRhYmFzZUhlbHBlciBtRGJIZWxwZXI7CisgICAgcHJpdmF0ZSBzdGF0aWMgVXJpTWF0Y2hlciBzTWF0Y2hlciA9IG5ldyBVcmlNYXRjaGVyKFVyaU1hdGNoZXIuTk9fTUFUQ0gpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BVENIX05BTUVfVkFMVUUgICAgICA9IDE7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIT1JJVFkgPSAiYW5kcm9pZC5qb2JzY2hlZHVsZXIuZHVtbXlwcm92aWRlciI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9VUkkgPSBVcmkucGFyc2UoImNvbnRlbnQ6Ly8iICsgQVVUSE9SSVRZKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9JRCAgID0gIl9pZCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSAgPSAibmFtZSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUUgPSAidmFsdWUiOworCisgICAgc3RhdGljIHsKKyAgICAgICAgc01hdGNoZXIuYWRkVVJJKEFVVEhPUklUWSwgbnVsbCwgTUFUQ0hfTkFNRV9WQUxVRSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyI29uQ3JlYXRlKCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZSgpIHsKKyAgICAgICAgbURiSGVscGVyID0gbmV3IERhdGFiYXNlSGVscGVyKGdldENvbnRleHQoKSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgRGF0YWJhc2VIZWxwZXIgZXh0ZW5kcyBTUUxpdGVPcGVuSGVscGVyIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERBVEFCQVNFX1ZFUlNJT04gPSAxOworCisgICAgICAgIERhdGFiYXNlSGVscGVyKENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgREFUQUJBU0VfTkFNRSwgbnVsbCwgREFUQUJBU0VfVkVSU0lPTik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DcmVhdGUoU1FMaXRlRGF0YWJhc2UgZGIpIHsKKyAgICAgICAgICAgIC8vIGNyZWF0ZSBhbiBlbXB0eSBuYW1lX3ZhbHVlIHRhYmxlCisgICAgICAgICAgICBkYi5leGVjU1FMKCJDUkVBVEUgVEFCTEUgIiArIE5BTUVfVkFMVUVfVEFCTEUgKyAiICgiICsgX0lEICsgIiBJTlRFR0VSIFBSSU1BUlkgS0VZLCIKKyAgICAgICAgICAgICAgICAgICAgKyBOQU1FICsgIiBURVhULCIgKyBWQUxVRSArICIgVEVYVCIrICIpOyIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uVXBncmFkZShTUUxpdGVEYXRhYmFzZSBkYiwgaW50IG9sZFZlcnNpb24sIGludCBuZXdWZXJzaW9uKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXIjaW5zZXJ0KGFuZHJvaWQubmV0LlVyaSwKKyAgICAgKiBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlcykKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVXJpIGluc2VydChVcmkgdXJpLCBDb250ZW50VmFsdWVzIHZhbHVlcykgeworICAgICAgICBTdHJpbmcgdGJOYW1lID0gZ2V0VGFibGVOYW1lKHVyaSk7CisgICAgICAgIGlmICh0Yk5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBtRGJIZWxwZXIuZ2V0V3JpdGFibGVEYXRhYmFzZSgpOworICAgICAgICBkYi5pbnNlcnQodGJOYW1lLCBWQUxVRSwgdmFsdWVzKTsKKyAgICAgICAgZ2V0Q29udGV4dCgpLmdldENvbnRlbnRSZXNvbHZlcigpLm5vdGlmeUNoYW5nZSh1cmksIG51bGwpOworICAgICAgICByZXR1cm4gdXJpOworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIEBzZWUgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlciNxdWVyeShhbmRyb2lkLm5ldC5VcmksCisgICAgICogamF2YS5sYW5nLlN0cmluZ1tdLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nW10sCisgICAgICogamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ3Vyc29yIHF1ZXJ5KFVyaSB1cmksIFN0cmluZ1tdIHByb2plY3Rpb24sIFN0cmluZyBzZWxlY3Rpb24sIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MsCisgICAgICAgICAgICBTdHJpbmcgc29ydE9yZGVyKSB7CisgICAgICAgIFN0cmluZyB0Yk5hbWUgPSBnZXRUYWJsZU5hbWUodXJpKTsKKyAgICAgICAgaWYgKHRiTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IG1EYkhlbHBlci5nZXRSZWFkYWJsZURhdGFiYXNlKCk7CisgICAgICAgIEN1cnNvciBjID0gZGIucXVlcnkodGJOYW1lLCBwcm9qZWN0aW9uLCBzZWxlY3Rpb24sIHNlbGVjdGlvbkFyZ3MsIG51bGwsIG51bGwsIHNvcnRPcmRlcik7CisgICAgICAgIGMuc2V0Tm90aWZpY2F0aW9uVXJpKGdldENvbnRleHQoKS5nZXRDb250ZW50UmVzb2x2ZXIoKSwgdXJpKTsKKyAgICAgICAgcmV0dXJuIGM7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VGFibGVOYW1lKFVyaSB1cmkpIHsKKyAgICAgICAgc3dpdGNoIChzTWF0Y2hlci5tYXRjaCh1cmkpKSB7CisgICAgICAgICAgICBjYXNlIE1BVENIX05BTUVfVkFMVUU6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5BTUVfVkFMVUVfVEFCTEU7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyI3VwZGF0ZShhbmRyb2lkLm5ldC5VcmksCisgICAgICogYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXMsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmdbXSkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHVwZGF0ZShVcmkgdXJpLCBDb250ZW50VmFsdWVzIHZhbHVlcywgU3RyaW5nIHNlbGVjdGlvbiwgU3RyaW5nW10gc2VsZWN0aW9uQXJncykgeworICAgICAgICBTdHJpbmcgdGJOYW1lID0gZ2V0VGFibGVOYW1lKHVyaSk7CisgICAgICAgIGlmICh0Yk5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBtRGJIZWxwZXIuZ2V0V3JpdGFibGVEYXRhYmFzZSgpOworICAgICAgICBpbnQgY291bnQgPSBkYi51cGRhdGUodGJOYW1lLCB2YWx1ZXMsIHNlbGVjdGlvbiwgc2VsZWN0aW9uQXJncyk7CisgICAgICAgIGdldENvbnRleHQoKS5nZXRDb250ZW50UmVzb2x2ZXIoKS5ub3RpZnlDaGFuZ2UodXJpLCBudWxsKTsKKyAgICAgICAgcmV0dXJuIGNvdW50OworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIEBzZWUgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlciNkZWxldGUoYW5kcm9pZC5uZXQuVXJpLAorICAgICAqIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmdbXSkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGRlbGV0ZShVcmkgdXJpLCBTdHJpbmcgc2VsZWN0aW9uLCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzKSB7CisgICAgICAgIFN0cmluZyB0Yk5hbWUgPSBnZXRUYWJsZU5hbWUodXJpKTsKKyAgICAgICAgaWYgKHRiTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IG1EYkhlbHBlci5nZXRXcml0YWJsZURhdGFiYXNlKCk7CisgICAgICAgIGludCBjb3VudCA9IGRiLmRlbGV0ZSh0Yk5hbWUsIHNlbGVjdGlvbiwgc2VsZWN0aW9uQXJncyk7CisgICAgICAgIGdldENvbnRleHQoKS5nZXRDb250ZW50UmVzb2x2ZXIoKS5ub3RpZnlDaGFuZ2UodXJpLCBudWxsKTsKKyAgICAgICAgcmV0dXJuIGNvdW50OworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIEBzZWUgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlciNnZXRUeXBlKGFuZHJvaWQubmV0LlVyaSkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoVXJpIHVyaSkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9Kb2JTY2hlZHVsZXJTaGFyZWRVaWQvc3JjL2FuZHJvaWQvam9ic2NoZWR1bGVyL01vY2tKb2JTZXJ2aWNlLmphdmEgYi90ZXN0cy9Kb2JTY2hlZHVsZXJTaGFyZWRVaWQvc3JjL2FuZHJvaWQvam9ic2NoZWR1bGVyL01vY2tKb2JTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I1YTJkYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0pvYlNjaGVkdWxlclNoYXJlZFVpZC9zcmMvYW5kcm9pZC9qb2JzY2hlZHVsZXIvTW9ja0pvYlNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDU0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5qb2JzY2hlZHVsZXI7CisKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uVGFyZ2V0QXBpOworaW1wb3J0IGFuZHJvaWQuYXBwLmpvYi5Kb2JJbmZvOworaW1wb3J0IGFuZHJvaWQuYXBwLmpvYi5Kb2JQYXJhbWV0ZXJzOworaW1wb3J0IGFuZHJvaWQuYXBwLmpvYi5Kb2JTY2hlZHVsZXI7CitpbXBvcnQgYW5kcm9pZC5hcHAuam9iLkpvYlNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5hcHAuam9iLkpvYldvcmtJdGVtOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5DbGlwRGF0YTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworLyoqCisgKiBIYW5kbGVzIGNhbGxiYWNrIGZyb20gdGhlIGZyYW1ld29yayB7QGxpbmsgYW5kcm9pZC5hcHAuam9iLkpvYlNjaGVkdWxlcn0uIFRoZSBiZWhhdmlvdXIgb2YgdGhpcworICogY2xhc3MgaXMgY29uZmlndXJlZCB0aHJvdWdoIHRoZSBzdGF0aWMKKyAqIHtAbGluayBUZXN0RW52aXJvbm1lbnR9LgorICovCitAVGFyZ2V0QXBpKDIxKQorcHVibGljIGNsYXNzIE1vY2tKb2JTZXJ2aWNlIGV4dGVuZHMgSm9iU2VydmljZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNb2NrSm9iU2VydmljZSI7CisKKyAgICAvKiogV2FpdCB0aGlzIGxvbmcgYmVmb3JlIHRpbWluZyBvdXQgdGhlIHRlc3QuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBERUZBVUxUX1RJTUVPVVRfTUlMTElTID0gMzAwMDBMOyAvLyAzMCBzZWNvbmRzLgorCisgICAgcHJpdmF0ZSBKb2JQYXJhbWV0ZXJzIG1QYXJhbXM7CisKKyAgICBBcnJheUxpc3Q8Sm9iV29ya0l0ZW0+IG1SZWNlaXZlZFdvcmsgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgIEFycmF5TGlzdDxKb2JXb3JrSXRlbT4gbVBlbmRpbmdDb21wbGV0aW9ucyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgcHJpdmF0ZSBib29sZWFuIG1XYWl0aW5nRm9yU3RvcDsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveSgpIHsKKyAgICAgICAgc3VwZXIub25EZXN0cm95KCk7CisgICAgICAgIExvZy5pKFRBRywgIkRlc3Ryb3lpbmcgdGVzdCBzZXJ2aWNlIik7CisgICAgICAgIGlmIChUZXN0RW52aXJvbm1lbnQuZ2V0VGVzdEVudmlyb25tZW50KCkuZ2V0RXhwZWN0ZWRXb3JrKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgVGVzdEVudmlyb25tZW50LmdldFRlc3RFbnZpcm9ubWVudCgpLm5vdGlmeUV4ZWN1dGlvbihtUGFyYW1zLCAwLCAwLCBtUmVjZWl2ZWRXb3JrLAorICAgICAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKCkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZSgpOworICAgICAgICBMb2cuaShUQUcsICJDcmVhdGVkIHRlc3Qgc2VydmljZS4iKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvblN0YXJ0Sm9iKEpvYlBhcmFtZXRlcnMgcGFyYW1zKSB7CisgICAgICAgIExvZy5pKFRBRywgIlRlc3Qgam9iIGV4ZWN1dGluZzogIiArIHBhcmFtcy5nZXRKb2JJZCgpKTsKKyAgICAgICAgbVBhcmFtcyA9IHBhcmFtczsKKworICAgICAgICBpbnQgcGVybUNoZWNrUmVhZCA9IFBhY2thZ2VNYW5hZ2VyLlBFUk1JU1NJT05fREVOSUVEOworICAgICAgICBpbnQgcGVybUNoZWNrV3JpdGUgPSBQYWNrYWdlTWFuYWdlci5QRVJNSVNTSU9OX0RFTklFRDsKKyAgICAgICAgQ2xpcERhdGEgY2xpcCA9IHBhcmFtcy5nZXRDbGlwRGF0YSgpOworICAgICAgICBpZiAoY2xpcCAhPSBudWxsKSB7CisgICAgICAgICAgICBwZXJtQ2hlY2tSZWFkID0gY2hlY2tVcmlQZXJtaXNzaW9uKGNsaXAuZ2V0SXRlbUF0KDApLmdldFVyaSgpLCBQcm9jZXNzLm15UGlkKCksCisgICAgICAgICAgICAgICAgICAgIFByb2Nlc3MubXlVaWQoKSwgSW50ZW50LkZMQUdfR1JBTlRfUkVBRF9VUklfUEVSTUlTU0lPTik7CisgICAgICAgICAgICBwZXJtQ2hlY2tXcml0ZSA9IGNoZWNrVXJpUGVybWlzc2lvbihjbGlwLmdldEl0ZW1BdCgwKS5nZXRVcmkoKSwgUHJvY2Vzcy5teVBpZCgpLAorICAgICAgICAgICAgICAgICAgICBQcm9jZXNzLm15VWlkKCksIEludGVudC5GTEFHX0dSQU5UX1dSSVRFX1VSSV9QRVJNSVNTSU9OKTsKKyAgICAgICAgfQorCisgICAgICAgIFRlc3RXb3JrSXRlbVtdIGV4cGVjdGVkV29yayA9IFRlc3RFbnZpcm9ubWVudC5nZXRUZXN0RW52aXJvbm1lbnQoKS5nZXRFeHBlY3RlZFdvcmsoKTsKKyAgICAgICAgaWYgKGV4cGVjdGVkV29yayAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmICghVGVzdEVudmlyb25tZW50LmdldFRlc3RFbnZpcm9ubWVudCgpLmF3YWl0RG9Xb3JrKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgVGVzdEVudmlyb25tZW50LmdldFRlc3RFbnZpcm9ubWVudCgpLm5vdGlmeUV4ZWN1dGlvbihwYXJhbXMsIHBlcm1DaGVja1JlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVybUNoZWNrV3JpdGUsIG51bGwsICJTcGVudCB0b28gbG9uZyB3YWl0aW5nIHRvIHN0YXJ0IGV4ZWN1dGluZyB3b3JrIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgVGVzdEVudmlyb25tZW50LmdldFRlc3RFbnZpcm9ubWVudCgpLm5vdGlmeUV4ZWN1dGlvbihwYXJhbXMsIHBlcm1DaGVja1JlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICBwZXJtQ2hlY2tXcml0ZSwgbnVsbCwgIkZhaWxlZCB3YWl0aW5nIGZvciB3b3JrOiAiICsgZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgSm9iV29ya0l0ZW0gd29yazsKKyAgICAgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgICAgICB3aGlsZSAoKHdvcmsgPSBwYXJhbXMuZGVxdWV1ZVdvcmsoKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIlJlY2VpdmVkIHdvcmsgIyIgKyBpbmRleCArICI6ICIgKyB3b3JrLmdldEludGVudCgpKTsKKyAgICAgICAgICAgICAgICBtUmVjZWl2ZWRXb3JrLmFkZCh3b3JrKTsKKworICAgICAgICAgICAgICAgIGludCBmbGFncyA9IDA7CisKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCBleHBlY3RlZFdvcmsubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgIFRlc3RXb3JrSXRlbSBleHBlY3RlZCA9IGV4cGVjdGVkV29ya1tpbmRleF07CisgICAgICAgICAgICAgICAgICAgIGludCBncmFudEZsYWdzID0gd29yay5nZXRJbnRlbnQoKS5nZXRGbGFncygpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXhwZWN0ZWQucmVxdWlyZVVyaXNHcmFudGVkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IHVpID0gMDsgdWkgPCBleHBlY3RlZC5yZXF1aXJlVXJpc0dyYW50ZWQubGVuZ3RoOyB1aSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChncmFudEZsYWdzICYgSW50ZW50LkZMQUdfR1JBTlRfUkVBRF9VUklfUEVSTUlTU0lPTikgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tVcmlQZXJtaXNzaW9uKGV4cGVjdGVkLnJlcXVpcmVVcmlzR3JhbnRlZFt1aV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvY2Vzcy5teVBpZCgpLCBQcm9jZXNzLm15VWlkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZW50LkZMQUdfR1JBTlRfUkVBRF9VUklfUEVSTUlTU0lPTikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBQYWNrYWdlTWFuYWdlci5QRVJNSVNTSU9OX0dSQU5URUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RFbnZpcm9ubWVudC5nZXRUZXN0RW52aXJvbm1lbnQoKS5ub3RpZnlFeGVjdXRpb24ocGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJtQ2hlY2tSZWFkLCBwZXJtQ2hlY2tXcml0ZSwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIHJlYWQgcGVybWlzc2lvbiBidXQgbm90IGdyYW50ZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGV4cGVjdGVkLnJlcXVpcmVVcmlzR3JhbnRlZFt1aV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgQCAjIiArIGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGdyYW50RmxhZ3MgJiBJbnRlbnQuRkxBR19HUkFOVF9XUklURV9VUklfUEVSTUlTU0lPTikgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tVcmlQZXJtaXNzaW9uKGV4cGVjdGVkLnJlcXVpcmVVcmlzR3JhbnRlZFt1aV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvY2Vzcy5teVBpZCgpLCBQcm9jZXNzLm15VWlkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZW50LkZMQUdfR1JBTlRfV1JJVEVfVVJJX1BFUk1JU1NJT04pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gUGFja2FnZU1hbmFnZXIuUEVSTUlTU0lPTl9HUkFOVEVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0RW52aXJvbm1lbnQuZ2V0VGVzdEVudmlyb25tZW50KCkubm90aWZ5RXhlY3V0aW9uKHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVybUNoZWNrUmVhZCwgcGVybUNoZWNrV3JpdGUsIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCB3cml0ZSBwZXJtaXNzaW9uIGJ1dCBub3QgZ3JhbnRlZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZXhwZWN0ZWQucmVxdWlyZVVyaXNHcmFudGVkW3VpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBAICMiICsgaW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChleHBlY3RlZC5yZXF1aXJlVXJpc05vdEdyYW50ZWQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gWFhYIG5vdGUgbm8gZGVsYXkgaGVyZSwgY3VycmVudCBpbXBsIHdpbGwgaGF2ZSBmdWxseSByZXZva2VkIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGVybWlzc2lvbiBieSB0aGUgdGltZSB3ZSByZXR1cm4gZnJvbSBjb21wbGV0aW5nIHRoZSBsYXN0IHdvcmsuCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCB1aSA9IDA7IHVpIDwgZXhwZWN0ZWQucmVxdWlyZVVyaXNOb3RHcmFudGVkLmxlbmd0aDsgdWkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZ3JhbnRGbGFncyAmIEludGVudC5GTEFHX0dSQU5UX1JFQURfVVJJX1BFUk1JU1NJT04pICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrVXJpUGVybWlzc2lvbihleHBlY3RlZC5yZXF1aXJlVXJpc05vdEdyYW50ZWRbdWldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2Nlc3MubXlQaWQoKSwgUHJvY2Vzcy5teVVpZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVudC5GTEFHX0dSQU5UX1JFQURfVVJJX1BFUk1JU1NJT04pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gUGFja2FnZU1hbmFnZXIuUEVSTUlTU0lPTl9ERU5JRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RFbnZpcm9ubWVudC5nZXRUZXN0RW52aXJvbm1lbnQoKS5ub3RpZnlFeGVjdXRpb24ocGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJtQ2hlY2tSZWFkLCBwZXJtQ2hlY2tXcml0ZSwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vdCBleHBlY3RlZCByZWFkIHBlcm1pc3Npb24gYnV0IGdyYW50ZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGV4cGVjdGVkLnJlcXVpcmVVcmlzTm90R3JhbnRlZFt1aV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgQCAjIiArIGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGdyYW50RmxhZ3MgJiBJbnRlbnQuRkxBR19HUkFOVF9XUklURV9VUklfUEVSTUlTU0lPTikgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tVcmlQZXJtaXNzaW9uKGV4cGVjdGVkLnJlcXVpcmVVcmlzTm90R3JhbnRlZFt1aV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvY2Vzcy5teVBpZCgpLCBQcm9jZXNzLm15VWlkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZW50LkZMQUdfR1JBTlRfV1JJVEVfVVJJX1BFUk1JU1NJT04pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gUGFja2FnZU1hbmFnZXIuUEVSTUlTU0lPTl9ERU5JRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RFbnZpcm9ubWVudC5nZXRUZXN0RW52aXJvbm1lbnQoKS5ub3RpZnlFeGVjdXRpb24ocGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJtQ2hlY2tSZWFkLCBwZXJtQ2hlY2tXcml0ZSwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vdCBleHBlY3RlZCB3cml0ZSBwZXJtaXNzaW9uIGJ1dCBncmFudGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBleHBlY3RlZC5yZXF1aXJlVXJpc05vdEdyYW50ZWRbdWldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIEAgIyIgKyBpbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmbGFncyA9IGV4cGVjdGVkLmZsYWdzOworCisgICAgICAgICAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBUZXN0V29ya0l0ZW0uRkxBR19XQUlUX0ZPUl9TVE9QKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJOb3cgd2FpdGluZyB0byBzdG9wIik7CisgICAgICAgICAgICAgICAgICAgICAgICBtV2FpdGluZ0ZvclN0b3AgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgVGVzdEVudmlyb25tZW50LmdldFRlc3RFbnZpcm9ubWVudCgpLm5vdGlmeVdhaXRpbmdGb3JTdG9wKCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBUZXN0V29ya0l0ZW0uRkxBR19DT01QTEVURV9ORVhUKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXByb2Nlc3NOZXh0UGVuZGluZ0NvbXBsZXRpb24oKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RFbnZpcm9ubWVudC5nZXRUZXN0RW52aXJvbm1lbnQoKS5ub3RpZnlFeGVjdXRpb24ocGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCB0byBjb21wbGV0ZSBuZXh0IHBlbmRpbmcgd29yayBidXQgdGhlcmUgd2FzIG5vbmU6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIEAgIyIgKyBpbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKChmbGFncyAmIFRlc3RXb3JrSXRlbS5GTEFHX0RFTEFZX0NPTVBMRVRFX1BVU0hfQkFDSykgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtUGVuZGluZ0NvbXBsZXRpb25zLmFkZCh3b3JrKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChmbGFncyAmIFRlc3RXb3JrSXRlbS5GTEFHX0RFTEFZX0NPTVBMRVRFX1BVU0hfVE9QKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1QZW5kaW5nQ29tcGxldGlvbnMuYWRkKDAsIHdvcmspOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1QYXJhbXMuY29tcGxldGVXb3JrKHdvcmspOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IGV4cGVjdGVkV29yay5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgVGVzdFdvcmtJdGVtIGV4cGVjdGVkID0gZXhwZWN0ZWRXb3JrW2luZGV4XTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4cGVjdGVkLnN1Yml0ZW1zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFRlc3RXb3JrSXRlbVtdIHN1YiA9IGV4cGVjdGVkLnN1Yml0ZW1zOworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSm9iSW5mbyBqaSA9IGV4cGVjdGVkLmpvYkluZm87CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBKb2JTY2hlZHVsZXIganMgPSAoSm9iU2NoZWR1bGVyKSBnZXRTeXN0ZW1TZXJ2aWNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0LkpPQl9TQ0hFRFVMRVJfU0VSVklDRSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBzdWJpID0gMDsgc3ViaSA8IHN1Yi5sZW5ndGg7IHN1YmkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzLmVucXVldWUoamksIG5ldyBKb2JXb3JrSXRlbShzdWJbc3ViaV0uaW50ZW50KSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbmRleCsrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocHJvY2Vzc05leHRQZW5kaW5nQ29tcGxldGlvbigpKSB7CisgICAgICAgICAgICAgICAgLy8gV2UgaGFkIHNvbWUgcGVuZGluZyBjb21wbGV0aW9ucywgY2xlYW4gdGhlbSBhbGwgb3V0Li4uCisgICAgICAgICAgICAgICAgd2hpbGUgKHByb2Nlc3NOZXh0UGVuZGluZ0NvbXBsZXRpb24oKSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyAuLi5hbmQgd2UgbmVlZCB0byBkbyBhIGZpbmFsIGRlcXVldWUgdG8gY29tcGxldGUgdGhlIGpvYiwgd2hpY2ggc2hvdWxkIG5vdAorICAgICAgICAgICAgICAgIC8vIHJldHVybiBhbnkgcmVtYWluaW5nIHdvcmsuCisgICAgICAgICAgICAgICAgaWYgKCh3b3JrID0gcGFyYW1zLmRlcXVldWVXb3JrKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgVGVzdEVudmlyb25tZW50LmdldFRlc3RFbnZpcm9ubWVudCgpLm5vdGlmeUV4ZWN1dGlvbihwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgbm8gcmVtYWluaW5nIHdvcmsgYWZ0ZXIgZGVxdWV1ZSBwZW5kaW5nLCBidXQgZ290OiAiICsgd29yayk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMb2cuaShUQUcsICJEb25lIHdpdGggYWxsIHdvcmsgYXQgIyIgKyBpbmRleCk7CisgICAgICAgICAgICAvLyBXZSBkb24ndCBub3RpZnlFeGVjdXRpb24gaGVyZSBiZWNhdXNlIHdlIHdhbnQgdG8gbWFrZSBzdXJlIHRoZSBqb2IgcHJvcGVybHkKKyAgICAgICAgICAgIC8vIHN0b3BzIGl0c2VsZi4KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYm9vbGVhbiBjb250aW51ZUFmdGVyU3RhcnQKKyAgICAgICAgICAgICAgICAgICAgPSBUZXN0RW52aXJvbm1lbnQuZ2V0VGVzdEVudmlyb25tZW50KCkuaGFuZGxlQ29udGludWVBZnRlclN0YXJ0KCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmICghVGVzdEVudmlyb25tZW50LmdldFRlc3RFbnZpcm9ubWVudCgpLmF3YWl0RG9Kb2IoKSkgeworICAgICAgICAgICAgICAgICAgICBUZXN0RW52aXJvbm1lbnQuZ2V0VGVzdEVudmlyb25tZW50KCkubm90aWZ5RXhlY3V0aW9uKHBhcmFtcywgcGVybUNoZWNrUmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJtQ2hlY2tXcml0ZSwgbnVsbCwgIlNwZW50IHRvbyBsb25nIHdhaXRpbmcgdG8gc3RhcnQgam9iIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgVGVzdEVudmlyb25tZW50LmdldFRlc3RFbnZpcm9ubWVudCgpLm5vdGlmeUV4ZWN1dGlvbihwYXJhbXMsIHBlcm1DaGVja1JlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICBwZXJtQ2hlY2tXcml0ZSwgbnVsbCwgIkZhaWxlZCB3YWl0aW5nIHRvIHN0YXJ0IGpvYjogIiArIGUpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRlc3RFbnZpcm9ubWVudC5nZXRUZXN0RW52aXJvbm1lbnQoKS5ub3RpZnlFeGVjdXRpb24ocGFyYW1zLCBwZXJtQ2hlY2tSZWFkLAorICAgICAgICAgICAgICAgICAgICBwZXJtQ2hlY2tXcml0ZSwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICByZXR1cm4gY29udGludWVBZnRlclN0YXJ0OworICAgICAgICB9CisgICAgfQorCisgICAgYm9vbGVhbiBwcm9jZXNzTmV4dFBlbmRpbmdDb21wbGV0aW9uKCkgeworICAgICAgICBpZiAobVBlbmRpbmdDb21wbGV0aW9ucy5zaXplKCkgPD0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgSm9iV29ya0l0ZW0gbmV4dCA9IG1QZW5kaW5nQ29tcGxldGlvbnMucmVtb3ZlKDApOworICAgICAgICBtUGFyYW1zLmNvbXBsZXRlV29yayhuZXh0KTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25TdG9wSm9iKEpvYlBhcmFtZXRlcnMgcGFyYW1zKSB7CisgICAgICAgIExvZy5pKFRBRywgIlJlY2VpdmVkIHN0b3AgY2FsbGJhY2siKTsKKyAgICAgICAgVGVzdEVudmlyb25tZW50LmdldFRlc3RFbnZpcm9ubWVudCgpLm5vdGlmeVN0b3BwZWQoKTsKKyAgICAgICAgcmV0dXJuIG1XYWl0aW5nRm9yU3RvcDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFRlc3RXb3JrSXRlbSB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBTdG9wIHByb2Nlc3Npbmcgd29yayBmb3Igbm93LCB3YWl0aW5nIGZvciB0aGUgc2VydmljZSB0byBiZSBzdG9wcGVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19XQUlUX0ZPUl9TVE9QID0gMTw8MDsKKyAgICAgICAgLyoqCisgICAgICAgICAqIERvbid0IGNvbXBsZXRlIHRoaXMgd29yayBub3csIGluc3RlYWQgcHVzaCBpdCBvbiB0aGUgYmFjayBvZiB0aGUgc3RhY2sgb2YKKyAgICAgICAgICogcGVuZGluZyBjb21wbGV0aW9ucy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfREVMQVlfQ09NUExFVEVfUFVTSF9CQUNLID0gMTw8MTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIERvbid0IGNvbXBsZXRlIHRoaXMgd29yayBub3csIGluc3RlYWQgaW5zZXJ0IHRvIHRoZSB0b3Agb2YgdGhlIHN0YWNrIG9mCisgICAgICAgICAqIHBlbmRpbmcgY29tcGxldGlvbnMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX0RFTEFZX0NPTVBMRVRFX1BVU0hfVE9QID0gMTw8MjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbXBsZXRlIG5leHQgcGVuZGluZyBjb21wbGV0aW9uIG9uIHRoZSBzdGFjayBiZWZvcmUgY29tcGxldGluZyB0aGlzIG9uZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfQ09NUExFVEVfTkVYVCA9IDE8PDM7CisKKyAgICAgICAgcHVibGljIGZpbmFsIEludGVudCBpbnRlbnQ7CisgICAgICAgIHB1YmxpYyBmaW5hbCBKb2JJbmZvIGpvYkluZm87CisgICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgZmxhZ3M7CisgICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgZGVsaXZlcnlDb3VudDsKKyAgICAgICAgcHVibGljIGZpbmFsIFRlc3RXb3JrSXRlbVtdIHN1Yml0ZW1zOworICAgICAgICBwdWJsaWMgZmluYWwgVXJpW10gcmVxdWlyZVVyaXNHcmFudGVkOworICAgICAgICBwdWJsaWMgZmluYWwgVXJpW10gcmVxdWlyZVVyaXNOb3RHcmFudGVkOworCisgICAgICAgIHB1YmxpYyBUZXN0V29ya0l0ZW0oSW50ZW50IF9pbnRlbnQpIHsKKyAgICAgICAgICAgIGludGVudCA9IF9pbnRlbnQ7CisgICAgICAgICAgICBqb2JJbmZvID0gbnVsbDsKKyAgICAgICAgICAgIGZsYWdzID0gMDsKKyAgICAgICAgICAgIGRlbGl2ZXJ5Q291bnQgPSAxOworICAgICAgICAgICAgc3ViaXRlbXMgPSBudWxsOworICAgICAgICAgICAgcmVxdWlyZVVyaXNHcmFudGVkID0gbnVsbDsKKyAgICAgICAgICAgIHJlcXVpcmVVcmlzTm90R3JhbnRlZCA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVGVzdFdvcmtJdGVtKEludGVudCBfaW50ZW50LCBpbnQgX2ZsYWdzKSB7CisgICAgICAgICAgICBpbnRlbnQgPSBfaW50ZW50OworICAgICAgICAgICAgam9iSW5mbyA9IG51bGw7CisgICAgICAgICAgICBmbGFncyA9IF9mbGFnczsKKyAgICAgICAgICAgIGRlbGl2ZXJ5Q291bnQgPSAxOworICAgICAgICAgICAgc3ViaXRlbXMgPSBudWxsOworICAgICAgICAgICAgcmVxdWlyZVVyaXNHcmFudGVkID0gbnVsbDsKKyAgICAgICAgICAgIHJlcXVpcmVVcmlzTm90R3JhbnRlZCA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVGVzdFdvcmtJdGVtKEludGVudCBfaW50ZW50LCBpbnQgX2ZsYWdzLCBpbnQgX2RlbGl2ZXJ5Q291bnQpIHsKKyAgICAgICAgICAgIGludGVudCA9IF9pbnRlbnQ7CisgICAgICAgICAgICBqb2JJbmZvID0gbnVsbDsKKyAgICAgICAgICAgIGZsYWdzID0gX2ZsYWdzOworICAgICAgICAgICAgZGVsaXZlcnlDb3VudCA9IF9kZWxpdmVyeUNvdW50OworICAgICAgICAgICAgc3ViaXRlbXMgPSBudWxsOworICAgICAgICAgICAgcmVxdWlyZVVyaXNHcmFudGVkID0gbnVsbDsKKyAgICAgICAgICAgIHJlcXVpcmVVcmlzTm90R3JhbnRlZCA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVGVzdFdvcmtJdGVtKEludGVudCBfaW50ZW50LCBKb2JJbmZvIF9qb2JJbmZvLCBUZXN0V29ya0l0ZW1bXSBfc3ViaXRlbXMpIHsKKyAgICAgICAgICAgIGludGVudCA9IF9pbnRlbnQ7CisgICAgICAgICAgICBqb2JJbmZvID0gX2pvYkluZm87CisgICAgICAgICAgICBmbGFncyA9IDA7CisgICAgICAgICAgICBkZWxpdmVyeUNvdW50ID0gMTsKKyAgICAgICAgICAgIHN1Yml0ZW1zID0gX3N1Yml0ZW1zOworICAgICAgICAgICAgcmVxdWlyZVVyaXNHcmFudGVkID0gbnVsbDsKKyAgICAgICAgICAgIHJlcXVpcmVVcmlzTm90R3JhbnRlZCA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVGVzdFdvcmtJdGVtKEludGVudCBfaW50ZW50LCBVcmlbXSBfcmVxdWlyZVVyaXNHcmFudGVkLAorICAgICAgICAgICAgICAgIFVyaVtdIF9yZXF1aXJlVXJpc05vdEdyYW50ZWQpIHsKKyAgICAgICAgICAgIGludGVudCA9IF9pbnRlbnQ7CisgICAgICAgICAgICBqb2JJbmZvID0gbnVsbDsKKyAgICAgICAgICAgIGZsYWdzID0gMDsKKyAgICAgICAgICAgIGRlbGl2ZXJ5Q291bnQgPSAxOworICAgICAgICAgICAgc3ViaXRlbXMgPSBudWxsOworICAgICAgICAgICAgcmVxdWlyZVVyaXNHcmFudGVkID0gX3JlcXVpcmVVcmlzR3JhbnRlZDsKKyAgICAgICAgICAgIHJlcXVpcmVVcmlzTm90R3JhbnRlZCA9IF9yZXF1aXJlVXJpc05vdEdyYW50ZWQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiVGVzdFdvcmtJdGVtIHsgIiArIGludGVudCArICIgZGM9IiArIGRlbGl2ZXJ5Q291bnQgKyAiIH0iOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uZmlndXJlcyB0aGUgZXhwZWN0ZWQgYmVoYXZpb3VyIGZvciBlYWNoIHRlc3QuIFRoaXMgb2JqZWN0IGlzIHNoYXJlZCBhY3Jvc3MgY29uc2VjdXRpdmUKKyAgICAgKiB0ZXN0cywgc28gdG8gY2xlYXIgc3RhdGUgZWFjaCB0ZXN0IGlzIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nCisgICAgICoge0BsaW5rIFRlc3RFbnZpcm9ubWVudCNzZXRVcCgpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFRlc3RFbnZpcm9ubWVudCB7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgVGVzdEVudmlyb25tZW50IGtUZXN0RW52aXJvbm1lbnQ7CisgICAgICAgIC8vcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9KT0JfSUQgPSAtMTsKKworICAgICAgICBwcml2YXRlIENvdW50RG93bkxhdGNoIG1MYXRjaDsKKyAgICAgICAgcHJpdmF0ZSBDb3VudERvd25MYXRjaCBtV2FpdGluZ0ZvclN0b3BMYXRjaDsKKyAgICAgICAgcHJpdmF0ZSBDb3VudERvd25MYXRjaCBtRG9Kb2JMYXRjaDsKKyAgICAgICAgcHJpdmF0ZSBDb3VudERvd25MYXRjaCBtU3RvcHBlZExhdGNoOworICAgICAgICBwcml2YXRlIENvdW50RG93bkxhdGNoIG1Eb1dvcmtMYXRjaDsKKyAgICAgICAgcHJpdmF0ZSBUZXN0V29ya0l0ZW1bXSBtRXhwZWN0ZWRXb3JrOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUNvbnRpbnVlQWZ0ZXJTdGFydDsKKyAgICAgICAgcHJpdmF0ZSBKb2JQYXJhbWV0ZXJzIG1FeGVjdXRlZEpvYlBhcmFtZXRlcnM7CisgICAgICAgIHByaXZhdGUgaW50IG1FeGVjdXRlZFBlcm1DaGVja1JlYWQ7CisgICAgICAgIHByaXZhdGUgaW50IG1FeGVjdXRlZFBlcm1DaGVja1dyaXRlOworICAgICAgICBwcml2YXRlIEFycmF5TGlzdDxKb2JXb3JrSXRlbT4gbUV4ZWN1dGVkUmVjZWl2ZWRXb3JrOworICAgICAgICBwcml2YXRlIFN0cmluZyBtRXhlY3V0ZWRFcnJvck1lc3NhZ2U7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBUZXN0RW52aXJvbm1lbnQgZ2V0VGVzdEVudmlyb25tZW50KCkgeworICAgICAgICAgICAgaWYgKGtUZXN0RW52aXJvbm1lbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGtUZXN0RW52aXJvbm1lbnQgPSBuZXcgVGVzdEVudmlyb25tZW50KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4ga1Rlc3RFbnZpcm9ubWVudDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUZXN0V29ya0l0ZW1bXSBnZXRFeHBlY3RlZFdvcmsoKSB7CisgICAgICAgICAgICByZXR1cm4gbUV4cGVjdGVkV29yazsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBKb2JQYXJhbWV0ZXJzIGdldExhc3RKb2JQYXJhbWV0ZXJzKCkgeworICAgICAgICAgICAgcmV0dXJuIG1FeGVjdXRlZEpvYlBhcmFtZXRlcnM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldExhc3RQZXJtQ2hlY2tSZWFkKCkgeworICAgICAgICAgICAgcmV0dXJuIG1FeGVjdXRlZFBlcm1DaGVja1JlYWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldExhc3RQZXJtQ2hlY2tXcml0ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtRXhlY3V0ZWRQZXJtQ2hlY2tXcml0ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBBcnJheUxpc3Q8Sm9iV29ya0l0ZW0+IGdldExhc3RSZWNlaXZlZFdvcmsoKSB7CisgICAgICAgICAgICByZXR1cm4gbUV4ZWN1dGVkUmVjZWl2ZWRXb3JrOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRMYXN0RXJyb3JNZXNzYWdlKCkgeworICAgICAgICAgICAgcmV0dXJuIG1FeGVjdXRlZEVycm9yTWVzc2FnZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBCbG9jayB0aGUgdGVzdCB0aHJlYWQsIHdhaXRpbmcgb24gdGhlIEpvYlNjaGVkdWxlciB0byBleGVjdXRlIHNvbWUgcHJldmlvdXNseSBzY2hlZHVsZWQKKyAgICAgICAgICogam9iIG9uIHRoaXMgc2VydmljZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGF3YWl0RXhlY3V0aW9uKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdEV4ZWN1dGlvbihERUZBVUxUX1RJTUVPVVRfTUlMTElTKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGF3YWl0RXhlY3V0aW9uKGxvbmcgdGltZW91dE1pbGxpcykgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gZXhlY3V0ZWQgPSBtTGF0Y2guYXdhaXQodGltZW91dE1pbGxpcywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgIGlmIChnZXRMYXN0RXJyb3JNZXNzYWdlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEFzc2VydC5mYWlsKGdldExhc3RFcnJvck1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZXhlY3V0ZWQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQmxvY2sgdGhlIHRlc3QgdGhyZWFkLCBleHBlY3RpbmcgdG8gdGltZW91dCBidXQgc3RpbGwgbGlzdGVuaW5nIHRvIGVuc3VyZSB0aGF0IG5vIGpvYnMKKyAgICAgICAgICogbGFuZCBpbiB0aGUgaW50ZXJpbS4KKyAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBsYXRjaCB0aW1lZCBvdXQgd2FpdGluZyBvbiBhbiBleGVjdXRpb24uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBhd2FpdFRpbWVvdXQoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIGF3YWl0VGltZW91dChERUZBVUxUX1RJTUVPVVRfTUlMTElTKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGF3YWl0VGltZW91dChsb25nIHRpbWVvdXRNaWxsaXMpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gIW1MYXRjaC5hd2FpdCh0aW1lb3V0TWlsbGlzLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gYXdhaXRXYWl0aW5nRm9yU3RvcCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gbVdhaXRpbmdGb3JTdG9wTGF0Y2guYXdhaXQoREVGQVVMVF9USU1FT1VUX01JTExJUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGF3YWl0RG9Xb3JrKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBtRG9Xb3JrTGF0Y2guYXdhaXQoREVGQVVMVF9USU1FT1VUX01JTExJUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGF3YWl0RG9Kb2IoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICAgICAgaWYgKG1Eb0pvYkxhdGNoID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtRG9Kb2JMYXRjaC5hd2FpdChERUZBVUxUX1RJTUVPVVRfTUlMTElTLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gYXdhaXRTdG9wcGVkKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBtU3RvcHBlZExhdGNoLmF3YWl0KERFRkFVTFRfVElNRU9VVF9NSUxMSVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgbm90aWZ5RXhlY3V0aW9uKEpvYlBhcmFtZXRlcnMgcGFyYW1zLCBpbnQgcGVybUNoZWNrUmVhZCwgaW50IHBlcm1DaGVja1dyaXRlLAorICAgICAgICAgICAgICAgIEFycmF5TGlzdDxKb2JXb3JrSXRlbT4gcmVjZWl2ZWRXb3JrLCBTdHJpbmcgZXJyb3JNc2cpIHsKKyAgICAgICAgICAgIC8vTG9nLmQoVEFHLCAiSm9iIGV4ZWN1dGVkOiIgKyBwYXJhbXMuZ2V0Sm9iSWQoKSk7CisgICAgICAgICAgICBtRXhlY3V0ZWRKb2JQYXJhbWV0ZXJzID0gcGFyYW1zOworICAgICAgICAgICAgbUV4ZWN1dGVkUGVybUNoZWNrUmVhZCA9IHBlcm1DaGVja1JlYWQ7CisgICAgICAgICAgICBtRXhlY3V0ZWRQZXJtQ2hlY2tXcml0ZSA9IHBlcm1DaGVja1dyaXRlOworICAgICAgICAgICAgbUV4ZWN1dGVkUmVjZWl2ZWRXb3JrID0gcmVjZWl2ZWRXb3JrOworICAgICAgICAgICAgbUV4ZWN1dGVkRXJyb3JNZXNzYWdlID0gZXJyb3JNc2c7CisgICAgICAgICAgICBtTGF0Y2guY291bnREb3duKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgbm90aWZ5V2FpdGluZ0ZvclN0b3AoKSB7CisgICAgICAgICAgICBtV2FpdGluZ0ZvclN0b3BMYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBub3RpZnlTdG9wcGVkKCkgeworICAgICAgICAgICAgaWYgKG1TdG9wcGVkTGF0Y2ggIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1TdG9wcGVkTGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRFeHBlY3RlZEV4ZWN1dGlvbnMoaW50IG51bUV4ZWN1dGlvbnMpIHsKKyAgICAgICAgICAgIC8vIEZvciBubyBleGVjdXRpb25zIGV4cGVjdGVkLCBzZXQgY291bnQgdG8gMSBzbyB3ZSBjYW4gc3RpbGwgYmxvY2sgZm9yIHRoZSB0aW1lb3V0LgorICAgICAgICAgICAgaWYgKG51bUV4ZWN1dGlvbnMgPT0gMCkgeworICAgICAgICAgICAgICAgIG1MYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKG51bUV4ZWN1dGlvbnMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVdhaXRpbmdGb3JTdG9wTGF0Y2ggPSBudWxsOworICAgICAgICAgICAgbURvSm9iTGF0Y2ggPSBudWxsOworICAgICAgICAgICAgbVN0b3BwZWRMYXRjaCA9IG51bGw7CisgICAgICAgICAgICBtRG9Xb3JrTGF0Y2ggPSBudWxsOworICAgICAgICAgICAgbUV4cGVjdGVkV29yayA9IG51bGw7CisgICAgICAgICAgICBtQ29udGludWVBZnRlclN0YXJ0ID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRFeHBlY3RlZFdhaXRGb3JTdG9wKCkgeworICAgICAgICAgICAgbVdhaXRpbmdGb3JTdG9wTGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRFeHBlY3RlZFdvcmsoVGVzdFdvcmtJdGVtW10gd29yaykgeworICAgICAgICAgICAgbUV4cGVjdGVkV29yayA9IHdvcms7CisgICAgICAgICAgICBtRG9Xb3JrTGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRFeHBlY3RlZFN0b3BwZWQoKSB7CisgICAgICAgICAgICBtU3RvcHBlZExhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmVhZHlUb1dvcmsoKSB7CisgICAgICAgICAgICBtRG9Xb3JrTGF0Y2guY291bnREb3duKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRFeHBlY3RlZFdhaXRGb3JSdW4oKSB7CisgICAgICAgICAgICBtRG9Kb2JMYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJlYWR5VG9SdW4oKSB7CisgICAgICAgICAgICBtRG9Kb2JMYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldENvbnRpbnVlQWZ0ZXJTdGFydCgpIHsKKyAgICAgICAgICAgIG1Db250aW51ZUFmdGVyU3RhcnQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFuZGxlQ29udGludWVBZnRlclN0YXJ0KCkgeworICAgICAgICAgICAgYm9vbGVhbiByZXMgPSBtQ29udGludWVBZnRlclN0YXJ0OworICAgICAgICAgICAgbUNvbnRpbnVlQWZ0ZXJTdGFydCA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBDYWxsZWQgaW4gZWFjaCB0ZXN0Q2FzZSNzZXR1cCAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgICAgIG1MYXRjaCA9IG51bGw7CisgICAgICAgICAgICBtRXhlY3V0ZWRKb2JQYXJhbWV0ZXJzID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0pvYlNjaGVkdWxlclNoYXJlZFVpZC9zcmMvYW5kcm9pZC9qb2JzY2hlZHVsZXIvVHJpZ2dlckNvbnRlbnRKb2JTZXJ2aWNlLmphdmEgYi90ZXN0cy9Kb2JTY2hlZHVsZXJTaGFyZWRVaWQvc3JjL2FuZHJvaWQvam9ic2NoZWR1bGVyL1RyaWdnZXJDb250ZW50Sm9iU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MjgxMTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Kb2JTY2hlZHVsZXJTaGFyZWRVaWQvc3JjL2FuZHJvaWQvam9ic2NoZWR1bGVyL1RyaWdnZXJDb250ZW50Sm9iU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsMTg5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmpvYnNjaGVkdWxlcjsKKworaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5UYXJnZXRBcGk7CitpbXBvcnQgYW5kcm9pZC5hcHAuam9iLkpvYkluZm87CitpbXBvcnQgYW5kcm9pZC5hcHAuam9iLkpvYlBhcmFtZXRlcnM7CitpbXBvcnQgYW5kcm9pZC5hcHAuam9iLkpvYlNjaGVkdWxlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5qb2IuSm9iU2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCisvKioKKyAqIEhhbmRsZXMgY2FsbGJhY2sgZnJvbSB0aGUgZnJhbWV3b3JrIHtAbGluayBhbmRyb2lkLmFwcC5qb2IuSm9iU2NoZWR1bGVyfS4gVGhlIGJlaGF2aW91ciBvZiB0aGlzCisgKiBjbGFzcyBpcyBjb25maWd1cmVkIHRocm91Z2ggdGhlIHN0YXRpYworICoge0BsaW5rIFRlc3RFbnZpcm9ubWVudH0uCisgKi8KK0BUYXJnZXRBcGkoMjEpCitwdWJsaWMgY2xhc3MgVHJpZ2dlckNvbnRlbnRKb2JTZXJ2aWNlIGV4dGVuZHMgSm9iU2VydmljZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJUcmlnZ2VyQ29udGVudEpvYlNlcnZpY2UiOworCisgICAgLyoqIFdhaXQgdGhpcyBsb25nIGJlZm9yZSB0aW1pbmcgb3V0IHRoZSB0ZXN0LiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgREVGQVVMVF9USU1FT1VUX01JTExJUyA9IDMwMDAwTDsgLy8gMzAgc2Vjb25kcy4KKworICAgIC8qKiBIb3cgbG9uZyB0byBkZWxheSBiZWZvcmUgcmVzY2hlZHVsaW5nIHRoZSBqb2IgZWFjaCB0aW1lIHdlIHJlcGVhdC4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFJFUEVBVF9JTlRFUlZBTCA9IDEwMDBMOyAvLyAxIHNlY29uZC4KKworICAgIEpvYkluZm8gbVJ1bm5pbmdKb2JJbmZvOworICAgIEpvYlBhcmFtZXRlcnMgbVJ1bm5pbmdQYXJhbXM7CisKKyAgICBmaW5hbCBIYW5kbGVyIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKTsKKyAgICBmaW5hbCBSdW5uYWJsZSBtV29ya2VyUmVzY2hlZHVsZSA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIHNjaGVkdWxlSm9iKFRyaWdnZXJDb250ZW50Sm9iU2VydmljZS50aGlzLCBtUnVubmluZ0pvYkluZm8pOworICAgICAgICAgICAgam9iRmluaXNoZWQobVJ1bm5pbmdQYXJhbXMsIGZhbHNlKTsKKyAgICAgICAgfQorICAgIH07CisgICAgZmluYWwgUnVubmFibGUgbVdvcmtlckZpbmlzaFRydWUgPSBuZXcgUnVubmFibGUoKSB7CisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBqb2JGaW5pc2hlZChtUnVubmluZ1BhcmFtcywgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNjaGVkdWxlSm9iKENvbnRleHQgY29udGV4dCwgSm9iSW5mbyBqb2JJbmZvKSB7CisgICAgICAgIEpvYlNjaGVkdWxlciBqcyA9IGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShKb2JTY2hlZHVsZXIuY2xhc3MpOworICAgICAgICBqcy5zY2hlZHVsZShqb2JJbmZvKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZSgpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoKTsKKyAgICAgICAgTG9nLmUoVEFHLCAiQ3JlYXRlZCB0ZXN0IHNlcnZpY2UuIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25TdGFydEpvYihKb2JQYXJhbWV0ZXJzIHBhcmFtcykgeworICAgICAgICBMb2cuaShUQUcsICJUZXN0IGpvYiBleGVjdXRpbmc6ICIgKyBwYXJhbXMuZ2V0Sm9iSWQoKSk7CisKKyAgICAgICAgaW50IG1vZGUgPSBUZXN0RW52aXJvbm1lbnQuZ2V0VGVzdEVudmlyb25tZW50KCkuZ2V0TW9kZSgpOworICAgICAgICBtUnVubmluZ0pvYkluZm8gPSBUZXN0RW52aXJvbm1lbnQuZ2V0VGVzdEVudmlyb25tZW50KCkuZ2V0TW9kZUpvYkluZm8oKTsKKyAgICAgICAgVGVzdEVudmlyb25tZW50LmdldFRlc3RFbnZpcm9ubWVudCgpLnNldE1vZGUoVGVzdEVudmlyb25tZW50Lk1PREVfT05FU0hPVCwgbnVsbCk7CisgICAgICAgIFRlc3RFbnZpcm9ubWVudC5nZXRUZXN0RW52aXJvbm1lbnQoKS5ub3RpZnlFeGVjdXRpb24ocGFyYW1zKTsKKworICAgICAgICBpZiAobW9kZSA9PSBUZXN0RW52aXJvbm1lbnQuTU9ERV9PTkVfUkVQRUFUX1JFU0NIRURVTEUpIHsKKyAgICAgICAgICAgIG1SdW5uaW5nUGFyYW1zID0gcGFyYW1zOworICAgICAgICAgICAgbUhhbmRsZXIucG9zdERlbGF5ZWQobVdvcmtlclJlc2NoZWR1bGUsIFJFUEVBVF9JTlRFUlZBTCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChtb2RlID09IFRlc3RFbnZpcm9ubWVudC5NT0RFX09ORV9SRVBFQVRfRklOSVNIX1RSVUUpIHsKKyAgICAgICAgICAgIG1SdW5uaW5nUGFyYW1zID0gcGFyYW1zOworICAgICAgICAgICAgbUhhbmRsZXIucG9zdERlbGF5ZWQobVdvcmtlckZpbmlzaFRydWUsIFJFUEVBVF9JTlRFUlZBTCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsgIC8vIE5vIHdvcmsgdG8gZG8uCisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvblN0b3BKb2IoSm9iUGFyYW1ldGVycyBwYXJhbXMpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbmZpZ3VyZXMgdGhlIGV4cGVjdGVkIGJlaGF2aW91ciBmb3IgZWFjaCB0ZXN0LiBUaGlzIG9iamVjdCBpcyBzaGFyZWQgYWNyb3NzIGNvbnNlY3V0aXZlCisgICAgICogdGVzdHMsIHNvIHRvIGNsZWFyIHN0YXRlIGVhY2ggdGVzdCBpcyByZXNwb25zaWJsZSBmb3IgY2FsbGluZworICAgICAqIHtAbGluayBUZXN0RW52aXJvbm1lbnQjc2V0VXAoKX0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBUZXN0RW52aXJvbm1lbnQgeworCisgICAgICAgIHByaXZhdGUgc3RhdGljIFRlc3RFbnZpcm9ubWVudCBrVGVzdEVudmlyb25tZW50OworICAgICAgICAvL3B1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfSk9CX0lEID0gLTE7CisKKyAgICAgICAgcHJpdmF0ZSBDb3VudERvd25MYXRjaCBtTGF0Y2g7CisgICAgICAgIHByaXZhdGUgSm9iUGFyYW1ldGVycyBtRXhlY3V0ZWRKb2JQYXJhbWV0ZXJzOworICAgICAgICBwcml2YXRlIGludCBtTW9kZTsKKyAgICAgICAgcHJpdmF0ZSBKb2JJbmZvIG1Nb2RlSm9iSW5mbzsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX09ORVNIT1QgPSAwOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX09ORV9SRVBFQVRfUkVTQ0hFRFVMRSA9IDE7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfT05FX1JFUEVBVF9GSU5JU0hfVFJVRSA9IDI7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBUZXN0RW52aXJvbm1lbnQgZ2V0VGVzdEVudmlyb25tZW50KCkgeworICAgICAgICAgICAgaWYgKGtUZXN0RW52aXJvbm1lbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGtUZXN0RW52aXJvbm1lbnQgPSBuZXcgVGVzdEVudmlyb25tZW50KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4ga1Rlc3RFbnZpcm9ubWVudDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBKb2JQYXJhbWV0ZXJzIGdldExhc3RKb2JQYXJhbWV0ZXJzKCkgeworICAgICAgICAgICAgcmV0dXJuIG1FeGVjdXRlZEpvYlBhcmFtZXRlcnM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQmxvY2sgdGhlIHRlc3QgdGhyZWFkLCB3YWl0aW5nIG9uIHRoZSBKb2JTY2hlZHVsZXIgdG8gZXhlY3V0ZSBzb21lIHByZXZpb3VzbHkgc2NoZWR1bGVkCisgICAgICAgICAqIGpvYiBvbiB0aGlzIHNlcnZpY2UuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBhd2FpdEV4ZWN1dGlvbigpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBib29sZWFuIGV4ZWN1dGVkID0gbUxhdGNoLmF3YWl0KERFRkFVTFRfVElNRU9VVF9NSUxMSVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgICAgICByZXR1cm4gZXhlY3V0ZWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRNb2RlKGludCBtb2RlLCBKb2JJbmZvIGpvYkluZm8pIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgICAgIG1Nb2RlID0gbW9kZTsKKyAgICAgICAgICAgICAgICBtTW9kZUpvYkluZm8gPSBqb2JJbmZvOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRNb2RlKCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1Nb2RlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEpvYkluZm8gZ2V0TW9kZUpvYkluZm8oKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbU1vZGVKb2JJbmZvOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJsb2NrIHRoZSB0ZXN0IHRocmVhZCwgZXhwZWN0aW5nIHRvIHRpbWVvdXQgYnV0IHN0aWxsIGxpc3RlbmluZyB0byBlbnN1cmUgdGhhdCBubyBqb2JzCisgICAgICAgICAqIGxhbmQgaW4gdGhlIGludGVyaW0uCisgICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgbGF0Y2ggdGltZWQgb3V0IHdhaXRpbmcgb24gYW4gZXhlY3V0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gYXdhaXRUaW1lb3V0KCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiAhbUxhdGNoLmF3YWl0KERFRkFVTFRfVElNRU9VVF9NSUxMSVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgbm90aWZ5RXhlY3V0aW9uKEpvYlBhcmFtZXRlcnMgcGFyYW1zKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJKb2IgZXhlY3V0ZWQ6IiArIHBhcmFtcy5nZXRKb2JJZCgpKTsKKyAgICAgICAgICAgIG1FeGVjdXRlZEpvYlBhcmFtZXRlcnMgPSBwYXJhbXM7CisgICAgICAgICAgICBtTGF0Y2guY291bnREb3duKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRFeHBlY3RlZEV4ZWN1dGlvbnMoaW50IG51bUV4ZWN1dGlvbnMpIHsKKyAgICAgICAgICAgIC8vIEZvciBubyBleGVjdXRpb25zIGV4cGVjdGVkLCBzZXQgY291bnQgdG8gMSBzbyB3ZSBjYW4gc3RpbGwgYmxvY2sgZm9yIHRoZSB0aW1lb3V0LgorICAgICAgICAgICAgaWYgKG51bUV4ZWN1dGlvbnMgPT0gMCkgeworICAgICAgICAgICAgICAgIG1MYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKG51bUV4ZWN1dGlvbnMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqIENhbGxlZCBpbiBlYWNoIHRlc3RDYXNlI3NldHVwICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICAgICAgbUxhdGNoID0gbnVsbDsKKyAgICAgICAgICAgIG1FeGVjdXRlZEpvYlBhcmFtZXRlcnMgPSBudWxsOworICAgICAgICB9CisKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvSm9iU2NoZWR1bGVyU2hhcmVkVWlkL3NyYy9hbmRyb2lkL2pvYnNjaGVkdWxlci9jdHMvc2hhcmVkdWlkdGVzdHMvQ2xpcERhdGFKb2JUZXN0LmphdmEgYi90ZXN0cy9Kb2JTY2hlZHVsZXJTaGFyZWRVaWQvc3JjL2FuZHJvaWQvam9ic2NoZWR1bGVyL2N0cy9zaGFyZWR1aWR0ZXN0cy9DbGlwRGF0YUpvYlRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTE5YTlhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSm9iU2NoZWR1bGVyU2hhcmVkVWlkL3NyYy9hbmRyb2lkL2pvYnNjaGVkdWxlci9jdHMvc2hhcmVkdWlkdGVzdHMvQ2xpcERhdGFKb2JUZXN0LmphdmEKQEAgLTAsMCArMSwxNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuam9ic2NoZWR1bGVyLmN0cy5zaGFyZWR1aWR0ZXN0czsKKworCitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLlRhcmdldEFwaTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5qb2IuSm9iSW5mbzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyQ2xpZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuUHJvY2VzczsKKworLyoqCisgKiBTY2hlZHVsZXMgam9icyB3aXRoIHRoZSB7QGxpbmsgYW5kcm9pZC5hcHAuam9iLkpvYlNjaGVkdWxlcn0gdGhhdCBncmFudCBwZXJtaXNzaW9ucyB0aHJvdWdoCisgKiBDbGlwRGF0YS4KKyAqLworQFRhcmdldEFwaSgyNikKK3B1YmxpYyBjbGFzcyBDbGlwRGF0YUpvYlRlc3QgZXh0ZW5kcyBDb25zdHJhaW50VGVzdCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJDbGlwRGF0YUpvYlRlc3QiOworCisgICAgLyoqIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgam9iIHNjaGVkdWxlZCBieSB0aGlzIHN1aXRlIG9mIHRlc3RzLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSVBfREFUQV9KT0JfSUQgPSBDbGlwRGF0YUpvYlRlc3QuY2xhc3MuaGFzaENvZGUoKTsKKworICAgIEpvYkluZm8uQnVpbGRlciBtQnVpbGRlcjsKKyAgICBwcml2YXRlIENvbnRlbnRQcm92aWRlckNsaWVudCBtUHJvdmlkZXI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworCisgICAgICAgIG1CdWlsZGVyID0gbmV3IEpvYkluZm8uQnVpbGRlcihDTElQX0RBVEFfSk9CX0lELCBrSm9iU2VydmljZUNvbXBvbmVudCk7CisgICAgICAgIG1Qcm92aWRlciA9IGdldENvbnRleHQoKS5nZXRDb250ZW50UmVzb2x2ZXIoKS5hY3F1aXJlQ29udGVudFByb3ZpZGVyQ2xpZW50KG1GaXJzdFVyaSk7CisgICAgICAgIGFzc2VydE5vdE51bGwobVByb3ZpZGVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgICAgICBtUHJvdmlkZXIuY2xvc2UoKTsKKyAgICAgICAgbUpvYlNjaGVkdWxlci5jYW5jZWwoQ0xJUF9EQVRBX0pPQl9JRCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBiYXNpYyBncmFudGluZyBvZiBVUkkgcGVybWlzc2lvbnMgYXNzb2NpYXRlZCB3aXRoIGpvYnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENsaXBEYXRhR3JhbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gU3RhcnQgb3V0IHdpdGggc3RvcmFnZSBsb3csIHNvIGpvYiBpcyBlbnF1ZXVlZCBidXQgbm90IGV4ZWN1dGVkIHlldC4KKyAgICAgICAgc2V0U3RvcmFnZVN0YXRlKHRydWUpOworCisgICAgICAgIC8vIFdlIG5lZWQgdG8gZ2V0IGEgcGVybWlzc2lvbiBncmFudCBzbyB0aGF0IHdlIGNhbiBncmFudCBpdCB0byBvdXJzZWxmLgorICAgICAgICBtUHJvdmlkZXIuY2FsbCgiZ3JhbnQiLCBNWV9QQUNLQUdFLCBtRmlyc3RVcmlCdW5kbGUpOworICAgICAgICBhc3NlcnRFcXVhbHMoUGFja2FnZU1hbmFnZXIuUEVSTUlTU0lPTl9HUkFOVEVELAorICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5jaGVja1VyaVBlcm1pc3Npb24obUZpcnN0VXJpLCBQcm9jZXNzLm15UGlkKCksCisgICAgICAgICAgICAgICAgICAgICAgICBQcm9jZXNzLm15VWlkKCksIEludGVudC5GTEFHX0dSQU5UX1JFQURfVVJJX1BFUk1JU1NJT04pKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFBhY2thZ2VNYW5hZ2VyLlBFUk1JU1NJT05fR1JBTlRFRCwKKyAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuY2hlY2tVcmlQZXJtaXNzaW9uKG1GaXJzdFVyaSwgUHJvY2Vzcy5teVBpZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgUHJvY2Vzcy5teVVpZCgpLCBJbnRlbnQuRkxBR19HUkFOVF9XUklURV9VUklfUEVSTUlTU0lPTikpOworCisgICAgICAgIC8vIFNjaGVkdWxlIHRoZSBqb2IsIHRoZSBzeXN0ZW0gc2hvdWxkIG5vdyBhbHNvIGJlIGhvbGRpbmcgYSBVUkkgZ3JhbnQgZm9yIHVzLgorICAgICAgICBrVGVzdEVudmlyb25tZW50LnNldEV4cGVjdGVkRXhlY3V0aW9ucygxKTsKKyAgICAgICAgbUpvYlNjaGVkdWxlci5zY2hlZHVsZShtQnVpbGRlci5zZXRSZXF1aXJlc1N0b3JhZ2VOb3RMb3codHJ1ZSkKKyAgICAgICAgICAgICAgICAuc2V0Q2xpcERhdGEobUZpcnN0Q2xpcERhdGEsIEludGVudC5GTEFHX0dSQU5UX1JFQURfVVJJX1BFUk1JU1NJT04KKyAgICAgICAgICAgICAgICAgICAgICAgIHwgSW50ZW50LkZMQUdfR1JBTlRfV1JJVEVfVVJJX1BFUk1JU1NJT04pLmJ1aWxkKCkpOworCisgICAgICAgIC8vIFJlbW92ZSB0aGUgZXhwbGljaXQgZ3JhbnQsIHdlIHNob3VsZCBzdGlsbCBoYXZlIGEgZ3JhbnQgZHVlIHRvIHRoZSBqb2IuCisgICAgICAgIG1Qcm92aWRlci5jYWxsKCJyZXZva2UiLCBNWV9QQUNLQUdFLCBtRmlyc3RVcmlCdW5kbGUpOworICAgICAgICBhc3NlcnRFcXVhbHMoUGFja2FnZU1hbmFnZXIuUEVSTUlTU0lPTl9HUkFOVEVELAorICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5jaGVja1VyaVBlcm1pc3Npb24obUZpcnN0VXJpLCBQcm9jZXNzLm15UGlkKCksCisgICAgICAgICAgICAgICAgICAgICAgICBQcm9jZXNzLm15VWlkKCksIEludGVudC5GTEFHX0dSQU5UX1JFQURfVVJJX1BFUk1JU1NJT04pKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFBhY2thZ2VNYW5hZ2VyLlBFUk1JU1NJT05fR1JBTlRFRCwKKyAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuY2hlY2tVcmlQZXJtaXNzaW9uKG1GaXJzdFVyaSwgUHJvY2Vzcy5teVBpZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgUHJvY2Vzcy5teVVpZCgpLCBJbnRlbnQuRkxBR19HUkFOVF9XUklURV9VUklfUEVSTUlTU0lPTikpOworCisgICAgICAgIC8vIE5vdyBhbGxvdyB0aGUgam9iIHRvIHJ1biBhbmQgd2FpdCBmb3IgaXQuCisgICAgICAgIHNldFN0b3JhZ2VTdGF0ZShmYWxzZSk7CisgICAgICAgIGFzc2VydFRydWUoIkpvYiB3aXRoIHN0b3JhZ2Ugbm90IGxvdyBjb25zdHJhaW50IGRpZCBub3QgZmlyZSB3aGVuIHN0b3JhZ2Ugbm90IGxvdy4iLAorICAgICAgICAgICAgICAgIGtUZXN0RW52aXJvbm1lbnQuYXdhaXRFeGVjdXRpb24oKSk7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBqb2Igc3RpbGwgaGFkIHRoZSBwZXJtaXNzaW9uIGdyYW50ZWQuCisgICAgICAgIGFzc2VydEVxdWFscyhQYWNrYWdlTWFuYWdlci5QRVJNSVNTSU9OX0dSQU5URUQsIGtUZXN0RW52aXJvbm1lbnQuZ2V0TGFzdFBlcm1DaGVja1JlYWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhQYWNrYWdlTWFuYWdlci5QRVJNSVNTSU9OX0dSQU5URUQsIGtUZXN0RW52aXJvbm1lbnQuZ2V0TGFzdFBlcm1DaGVja1dyaXRlKCkpOworCisgICAgICAgIC8vIEFuZCB3YWl0IGZvciBldmVyeXRoaW5nIHRvIGJlIGNsZWFuZWQgdXAuCisgICAgICAgIHdhaXRQZXJtaXNzaW9uUmV2b2tlKG1GaXJzdFVyaSwgSW50ZW50LkZMQUdfR1JBTlRfV1JJVEVfVVJJX1BFUk1JU1NJT04sIDUwMDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhhdCB3ZSBjb3JyZWN0bHkgZmFpbCB3aGVuIHRyeWluZyB0byBncmFudCBwZXJtaXNzaW9ucyB0byB0aGluZ3Mgd2UgZG9uJ3QKKyAgICAgKiBoYXZlIGFjY2VzcyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xpcERhdGFHcmFudF9GYWlsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1Kb2JTY2hlZHVsZXIuc2NoZWR1bGUobUJ1aWxkZXIuc2V0UmVxdWlyZXNTdG9yYWdlTm90TG93KHRydWUpCisgICAgICAgICAgICAgICAgICAgIC5zZXRDbGlwRGF0YShtRmlyc3RDbGlwRGF0YSwgSW50ZW50LkZMQUdfR1JBTlRfUkVBRF9VUklfUEVSTUlTU0lPTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSW50ZW50LkZMQUdfR1JBTlRfV1JJVEVfVVJJX1BFUk1JU1NJT04pLmJ1aWxkKCkpOworICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmYWlsKCJTZWN1cml0eSBleGNlcHRpb24gbm90IHRocm93biIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgYmFzaWMgZ3JhbnRpbmcgb2YgVVJJIHBlcm1pc3Npb25zIGFzc29jaWF0ZWQgd2l0aCBqb2JzIGFuZCBhcmUgY29ycmVjdGx5CisgICAgICogcmV0YWluZWQgd2hlbiByZXNjaGVkdWxpbmcgdGhlIGpvYi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xpcERhdGFHcmFudFJlc2NoZWR1bGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gV2UgbmVlZCB0byBnZXQgYSBwZXJtaXNzaW9uIGdyYW50IHNvIHRoYXQgd2UgY2FuIGdyYW50IGl0IHRvIG91cnNlbGYuCisgICAgICAgIG1Qcm92aWRlci5jYWxsKCJncmFudCIsIE1ZX1BBQ0tBR0UsIG1GaXJzdFVyaUJ1bmRsZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhQYWNrYWdlTWFuYWdlci5QRVJNSVNTSU9OX0dSQU5URUQsCisgICAgICAgICAgICAgICAgZ2V0Q29udGV4dCgpLmNoZWNrVXJpUGVybWlzc2lvbihtRmlyc3RVcmksIFByb2Nlc3MubXlQaWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFByb2Nlc3MubXlVaWQoKSwgSW50ZW50LkZMQUdfR1JBTlRfUkVBRF9VUklfUEVSTUlTU0lPTikpOworICAgICAgICBhc3NlcnRFcXVhbHMoUGFja2FnZU1hbmFnZXIuUEVSTUlTU0lPTl9HUkFOVEVELAorICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5jaGVja1VyaVBlcm1pc3Npb24obUZpcnN0VXJpLCBQcm9jZXNzLm15UGlkKCksCisgICAgICAgICAgICAgICAgICAgICAgICBQcm9jZXNzLm15VWlkKCksIEludGVudC5GTEFHX0dSQU5UX1dSSVRFX1VSSV9QRVJNSVNTSU9OKSk7CisKKyAgICAgICAgLy8gU2NoZWR1bGUgdGhlIGpvYiwgdGhlIHN5c3RlbSBzaG91bGQgbm93IGFsc28gYmUgaG9sZGluZyBhIFVSSSBncmFudCBmb3IgdXMuCisgICAgICAgIGtUZXN0RW52aXJvbm1lbnQuc2V0RXhwZWN0ZWRFeGVjdXRpb25zKDEpOworICAgICAgICBtSm9iU2NoZWR1bGVyLnNjaGVkdWxlKG1CdWlsZGVyLnNldE1pbmltdW1MYXRlbmN5KDYwKjYwKjEwMDApCisgICAgICAgICAgICAgICAgLnNldENsaXBEYXRhKG1GaXJzdENsaXBEYXRhLCBJbnRlbnQuRkxBR19HUkFOVF9SRUFEX1VSSV9QRVJNSVNTSU9OCisgICAgICAgICAgICAgICAgICAgICAgICB8IEludGVudC5GTEFHX0dSQU5UX1dSSVRFX1VSSV9QRVJNSVNTSU9OKS5idWlsZCgpKTsKKworICAgICAgICAvLyBSZW1vdmUgdGhlIGV4cGxpY2l0IGdyYW50LCB3ZSBzaG91bGQgc3RpbGwgaGF2ZSBhIGdyYW50IGR1ZSB0byB0aGUgam9iLgorICAgICAgICBtUHJvdmlkZXIuY2FsbCgicmV2b2tlIiwgTVlfUEFDS0FHRSwgbUZpcnN0VXJpQnVuZGxlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFBhY2thZ2VNYW5hZ2VyLlBFUk1JU1NJT05fR1JBTlRFRCwKKyAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuY2hlY2tVcmlQZXJtaXNzaW9uKG1GaXJzdFVyaSwgUHJvY2Vzcy5teVBpZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgUHJvY2Vzcy5teVVpZCgpLCBJbnRlbnQuRkxBR19HUkFOVF9SRUFEX1VSSV9QRVJNSVNTSU9OKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhQYWNrYWdlTWFuYWdlci5QRVJNSVNTSU9OX0dSQU5URUQsCisgICAgICAgICAgICAgICAgZ2V0Q29udGV4dCgpLmNoZWNrVXJpUGVybWlzc2lvbihtRmlyc3RVcmksIFByb2Nlc3MubXlQaWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFByb2Nlc3MubXlVaWQoKSwgSW50ZW50LkZMQUdfR1JBTlRfV1JJVEVfVVJJX1BFUk1JU1NJT04pKTsKKworICAgICAgICAvLyBOb3cgcmVzY2hlZHVsZSB0aGUgam9iIHRvIGhhdmUgaXQgaGFwcGVuIHJpZ2h0IG5vdy4KKyAgICAgICAgbUpvYlNjaGVkdWxlci5zY2hlZHVsZShtQnVpbGRlci5zZXRNaW5pbXVtTGF0ZW5jeSgwKQorICAgICAgICAgICAgICAgIC5zZXRDbGlwRGF0YShtRmlyc3RDbGlwRGF0YSwgSW50ZW50LkZMQUdfR1JBTlRfUkVBRF9VUklfUEVSTUlTU0lPTgorICAgICAgICAgICAgICAgICAgICAgICAgfCBJbnRlbnQuRkxBR19HUkFOVF9XUklURV9VUklfUEVSTUlTU0lPTikuYnVpbGQoKSk7CisgICAgICAgIGFzc2VydFRydWUoIkpvYiB3aXRoIHN0b3JhZ2Ugbm90IGxvdyBjb25zdHJhaW50IGRpZCBub3QgZmlyZSB3aGVuIHN0b3JhZ2Ugbm90IGxvdy4iLAorICAgICAgICAgICAgICAgIGtUZXN0RW52aXJvbm1lbnQuYXdhaXRFeGVjdXRpb24oKSk7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBqb2Igc3RpbGwgaGFkIHRoZSBwZXJtaXNzaW9uIGdyYW50ZWQuCisgICAgICAgIGFzc2VydEVxdWFscyhQYWNrYWdlTWFuYWdlci5QRVJNSVNTSU9OX0dSQU5URUQsIGtUZXN0RW52aXJvbm1lbnQuZ2V0TGFzdFBlcm1DaGVja1JlYWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhQYWNrYWdlTWFuYWdlci5QRVJNSVNTSU9OX0dSQU5URUQsIGtUZXN0RW52aXJvbm1lbnQuZ2V0TGFzdFBlcm1DaGVja1dyaXRlKCkpOworCisgICAgICAgIC8vIEFuZCB3YWl0IGZvciBldmVyeXRoaW5nIHRvIGJlIGNsZWFuZWQgdXAuCisgICAgICAgIHdhaXRQZXJtaXNzaW9uUmV2b2tlKG1GaXJzdFVyaSwgSW50ZW50LkZMQUdfR1JBTlRfV1JJVEVfVVJJX1BFUk1JU1NJT04sIDUwMDApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0pvYlNjaGVkdWxlclNoYXJlZFVpZC9zcmMvYW5kcm9pZC9qb2JzY2hlZHVsZXIvY3RzL3NoYXJlZHVpZHRlc3RzL0NvbnN0cmFpbnRUZXN0LmphdmEgYi90ZXN0cy9Kb2JTY2hlZHVsZXJTaGFyZWRVaWQvc3JjL2FuZHJvaWQvam9ic2NoZWR1bGVyL2N0cy9zaGFyZWR1aWR0ZXN0cy9Db25zdHJhaW50VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNWIyNjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Kb2JTY2hlZHVsZXJTaGFyZWRVaWQvc3JjL2FuZHJvaWQvam9ic2NoZWR1bGVyL2N0cy9zaGFyZWR1aWR0ZXN0cy9Db25zdHJhaW50VGVzdC5qYXZhCkBAIC0wLDAgKzEsMjA1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5qb2JzY2hlZHVsZXIuY3RzLnNoYXJlZHVpZHRlc3RzOworCitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLlRhcmdldEFwaTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb247CitpbXBvcnQgYW5kcm9pZC5hcHAuam9iLkpvYlNjaGVkdWxlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ2xpcERhdGE7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5qb2JzY2hlZHVsZXIuTW9ja0pvYlNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5qb2JzY2hlZHVsZXIuVHJpZ2dlckNvbnRlbnRKb2JTZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdENhc2U7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuU3lzdGVtVXRpbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogQ29tbW9uIGZ1bmN0aW9uYWxpdHkgZnJvbSB3aGljaCB0aGUgb3RoZXIgdGVzdCBjYXNlIGNsYXNzZXMgZGVyaXZlLgorICovCitAVGFyZ2V0QXBpKDIxKQorcHVibGljIGFic3RyYWN0IGNsYXNzIENvbnN0cmFpbnRUZXN0IGV4dGVuZHMgSW5zdHJ1bWVudGF0aW9uVGVzdENhc2UgeworICAgIC8qKiBGb3JjZSB0aGUgc2NoZWR1bGVyIHRvIGNvbnNpZGVyIHRoZSBkZXZpY2UgdG8gYmUgb24gc3RhYmxlIGNoYXJnaW5nLiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEludGVudCBFWFBFRElURV9TVEFCTEVfQ0hBUkdJTkcgPQorICAgICAgICAgICAgbmV3IEludGVudCgiY29tLmFuZHJvaWQuc2VydmVyLnRhc2suY29udHJvbGxlcnMuQmF0dGVyeUNvbnRyb2xsZXIuQUNUSU9OX0NIQVJHSU5HX1NUQUJMRSIpOworCisgICAgLyoqIEVudmlyb25tZW50IHRoYXQgbm90aWZpZXMgb2YgSm9iU2NoZWR1bGVyIGNhbGxiYWNrcy4gKi8KKyAgICBzdGF0aWMgTW9ja0pvYlNlcnZpY2UuVGVzdEVudmlyb25tZW50IGtUZXN0RW52aXJvbm1lbnQgPQorICAgICAgICAgICAgTW9ja0pvYlNlcnZpY2UuVGVzdEVudmlyb25tZW50LmdldFRlc3RFbnZpcm9ubWVudCgpOworICAgIHN0YXRpYyBUcmlnZ2VyQ29udGVudEpvYlNlcnZpY2UuVGVzdEVudmlyb25tZW50IGtUcmlnZ2VyVGVzdEVudmlyb25tZW50ID0KKyAgICAgICAgICAgIFRyaWdnZXJDb250ZW50Sm9iU2VydmljZS5UZXN0RW52aXJvbm1lbnQuZ2V0VGVzdEVudmlyb25tZW50KCk7CisgICAgLyoqIEhhbmRsZSBmb3IgdGhlIHNlcnZpY2Ugd2hpY2ggcmVjZWl2ZXMgdGhlIGV4ZWN1dGlvbiBjYWxsYmFja3MgZnJvbSB0aGUgSm9iU2NoZWR1bGVyLiAqLworICAgIHN0YXRpYyBDb21wb25lbnROYW1lIGtKb2JTZXJ2aWNlQ29tcG9uZW50OworICAgIHN0YXRpYyBDb21wb25lbnROYW1lIGtUcmlnZ2VyQ29udGVudFNlcnZpY2VDb21wb25lbnQ7CisgICAgSm9iU2NoZWR1bGVyIG1Kb2JTY2hlZHVsZXI7CisKKyAgICBDb250ZXh0IG1Db250ZXh0OworCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBNWV9QQUNLQUdFID0gImFuZHJvaWQuam9ic2NoZWR1bGVyLmN0cy5zaGFyZWR1aWR0ZXN0cyI7CisKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEpPQlBFUk1fUEFDS0FHRSA9ICJhbmRyb2lkLmpvYnNjaGVkdWxlci5jdHMuc2hhcmVkdWlkLmpvYnBlcm0iOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSk9CUEVSTV9BVVRIT1JJVFkgPSAiYW5kcm9pZC5qb2JzY2hlZHVsZXIuY3RzLnNoYXJlZHVpZC5qb2JwZXJtLnByb3ZpZGVyIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEpPQlBFUk1fUEVSTSA9ICJhbmRyb2lkLmpvYnNjaGVkdWxlci5jdHMuam9icGVybS5wZXJtIjsKKworICAgIFVyaSBtRmlyc3RVcmk7CisgICAgQnVuZGxlIG1GaXJzdFVyaUJ1bmRsZTsKKyAgICBVcmkgbVNlY29uZFVyaTsKKyAgICBCdW5kbGUgbVNlY29uZFVyaUJ1bmRsZTsKKyAgICBDbGlwRGF0YSBtRmlyc3RDbGlwRGF0YTsKKyAgICBDbGlwRGF0YSBtU2Vjb25kQ2xpcERhdGE7CisKKyAgICBib29sZWFuIG1TdG9yYWdlU3RhdGVDaGFuZ2VkOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgaW5qZWN0SW5zdHJ1bWVudGF0aW9uKEluc3RydW1lbnRhdGlvbiBpbnN0cnVtZW50YXRpb24pIHsKKyAgICAgICAgc3VwZXIuaW5qZWN0SW5zdHJ1bWVudGF0aW9uKGluc3RydW1lbnRhdGlvbik7CisgICAgICAgIG1Db250ZXh0ID0gaW5zdHJ1bWVudGF0aW9uLmdldENvbnRleHQoKTsKKyAgICAgICAga0pvYlNlcnZpY2VDb21wb25lbnQgPSBuZXcgQ29tcG9uZW50TmFtZShnZXRDb250ZXh0KCksIE1vY2tKb2JTZXJ2aWNlLmNsYXNzKTsKKyAgICAgICAga1RyaWdnZXJDb250ZW50U2VydmljZUNvbXBvbmVudCA9IG5ldyBDb21wb25lbnROYW1lKGdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICBUcmlnZ2VyQ29udGVudEpvYlNlcnZpY2UuY2xhc3MpOworICAgICAgICBtSm9iU2NoZWR1bGVyID0gKEpvYlNjaGVkdWxlcikgZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5KT0JfU0NIRURVTEVSX1NFUlZJQ0UpOworICAgICAgICBtRmlyc3RVcmkgPSBVcmkucGFyc2UoImNvbnRlbnQ6Ly8iICsgSk9CUEVSTV9BVVRIT1JJVFkgKyAiL3Byb3RlY3RlZC9mb28iKTsKKyAgICAgICAgbUZpcnN0VXJpQnVuZGxlID0gbmV3IEJ1bmRsZSgpOworICAgICAgICBtRmlyc3RVcmlCdW5kbGUucHV0UGFyY2VsYWJsZSgidXJpIiwgbUZpcnN0VXJpKTsKKyAgICAgICAgbVNlY29uZFVyaSA9IFVyaS5wYXJzZSgiY29udGVudDovLyIgKyBKT0JQRVJNX0FVVEhPUklUWSArICIvcHJvdGVjdGVkL2JhciIpOworICAgICAgICBtU2Vjb25kVXJpQnVuZGxlID0gbmV3IEJ1bmRsZSgpOworICAgICAgICBtU2Vjb25kVXJpQnVuZGxlLnB1dFBhcmNlbGFibGUoInVyaSIsIG1TZWNvbmRVcmkpOworICAgICAgICBtRmlyc3RDbGlwRGF0YSA9IG5ldyBDbGlwRGF0YSgiSm9iUGVybTEiLCBuZXcgU3RyaW5nW10geyAiYXBwbGljYXRpb24vKiIgfSwKKyAgICAgICAgICAgICAgICBuZXcgQ2xpcERhdGEuSXRlbShtRmlyc3RVcmkpKTsKKyAgICAgICAgbVNlY29uZENsaXBEYXRhID0gbmV3IENsaXBEYXRhKCJKb2JQZXJtMiIsIG5ldyBTdHJpbmdbXSB7ICJhcHBsaWNhdGlvbi8qIiB9LAorICAgICAgICAgICAgICAgIG5ldyBDbGlwRGF0YS5JdGVtKG1TZWNvbmRVcmkpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN5c3RlbVV0aWwucnVuU2hlbGxDb21tYW5kKGdldEluc3RydW1lbnRhdGlvbigpLCAiY21kIGFjdGl2aXR5IHNldC1pbmFjdGl2ZSAiCisgICAgICAgICAgICAgICAgICAgICsgbUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSArICIgZmFsc2UiKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncoIkNvbnN0cmFpbnRUZXN0IiwgIkZhaWxlZCBzZXR0aW5nIGluYWN0aXZlIGZhbHNlIiwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgQ29udGV4dCBnZXRDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gbUNvbnRleHQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAga1Rlc3RFbnZpcm9ubWVudC5zZXRVcCgpOworICAgICAgICBrVHJpZ2dlclRlc3RFbnZpcm9ubWVudC5zZXRVcCgpOworICAgICAgICBtSm9iU2NoZWR1bGVyLmNhbmNlbEFsbCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChtU3RvcmFnZVN0YXRlQ2hhbmdlZCkgeworICAgICAgICAgICAgLy8gUHV0IHN0b3JhZ2Ugc2VydmljZSBiYWNrIGluIHRvIG5vcm1hbCBvcGVyYXRpb24uCisgICAgICAgICAgICBTeXN0ZW1VdGlsLnJ1blNoZWxsQ29tbWFuZChnZXRJbnN0cnVtZW50YXRpb24oKSwgImNtZCBkZXZpY2VzdG9yYWdlbW9uaXRvciByZXNldCIpOworICAgICAgICAgICAgbVN0b3JhZ2VTdGF0ZUNoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBzY2hlZHVsZXIgd2lsbCB1c3VhbGx5IG9ubHkgZmx1c2ggaXRzIHF1ZXVlIG9mIHVuZXhwaXJlZCBqb2JzIHdoZW4gdGhlIGRldmljZSBpcworICAgICAqIGNvbnNpZGVyZWQgdG8gYmUgb24gc3RhYmxlIHBvd2VyIC0gdGhhdCBpcywgcGx1Z2dlZCBpbiBmb3IgYSBwZXJpb2Qgb2YgMiBtaW51dGVzLgorICAgICAqIFJhdGhlciB0aGFuIHdhaXQgZm9yIHRoaXMgdG8gaGFwcGVuLCB3ZSBjaGVhdCBhbmQgc2VuZCB0aGlzIGJyb2FkY2FzdCBpbnN0ZWFkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNlbmRFeHBlZGl0ZVN0YWJsZUNoYXJnaW5nQnJvYWRjYXN0KCkgeworICAgICAgICBnZXRDb250ZXh0KCkuc2VuZEJyb2FkY2FzdChFWFBFRElURV9TVEFCTEVfQ0hBUkdJTkcpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFzc2VydEhhc1VyaVBlcm1pc3Npb24oVXJpIHVyaSwgaW50IGdyYW50RmxhZ3MpIHsKKyAgICAgICAgaWYgKChncmFudEZsYWdzJkludGVudC5GTEFHX0dSQU5UX1JFQURfVVJJX1BFUk1JU1NJT04pICE9IDApIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhQYWNrYWdlTWFuYWdlci5QRVJNSVNTSU9OX0dSQU5URUQsCisgICAgICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5jaGVja1VyaVBlcm1pc3Npb24odXJpLCBQcm9jZXNzLm15UGlkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvY2Vzcy5teVVpZCgpLCBJbnRlbnQuRkxBR19HUkFOVF9SRUFEX1VSSV9QRVJNSVNTSU9OKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChncmFudEZsYWdzJkludGVudC5GTEFHX0dSQU5UX1dSSVRFX1VSSV9QRVJNSVNTSU9OKSAhPSAwKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoUGFja2FnZU1hbmFnZXIuUEVSTUlTU0lPTl9HUkFOVEVELAorICAgICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuY2hlY2tVcmlQZXJtaXNzaW9uKHVyaSwgUHJvY2Vzcy5teVBpZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2Nlc3MubXlVaWQoKSwgSW50ZW50LkZMQUdfR1JBTlRfV1JJVEVfVVJJX1BFUk1JU1NJT04pKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgd2FpdFBlcm1pc3Npb25SZXZva2UoVXJpIHVyaSwgaW50IGFjY2VzcywgbG9uZyB0aW1lb3V0KSB7CisgICAgICAgIGxvbmcgc3RhcnRUaW1lID0gU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCk7CisgICAgICAgIHdoaWxlIChnZXRDb250ZXh0KCkuY2hlY2tVcmlQZXJtaXNzaW9uKHVyaSwgUHJvY2Vzcy5teVBpZCgpLCBQcm9jZXNzLm15VWlkKCksIGFjY2VzcykKKyAgICAgICAgICAgICAgICAhPSBQYWNrYWdlTWFuYWdlci5QRVJNSVNTSU9OX0RFTklFRCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNTApOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKS1zdGFydFRpbWUpID49IHRpbWVvdXQpIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJUaW1lZCBvdXQgd2FpdGluZyBmb3IgcGVybWlzc2lvbiByZXZva2UiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIE5vdGUgd2UgYXJlIGp1c3QgdXNpbmcgc3RvcmFnZSBzdGF0ZSBhcyBhIHdheSB0byBjb250cm9sIHdoZW4gdGhlIGpvYiBnZXRzIGV4ZWN1dGVkLgorICAgIHZvaWQgc2V0U3RvcmFnZVN0YXRlKGJvb2xlYW4gbG93KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbVN0b3JhZ2VTdGF0ZUNoYW5nZWQgPSB0cnVlOworICAgICAgICBTdHJpbmcgcmVzOworICAgICAgICBpZiAobG93KSB7CisgICAgICAgICAgICByZXMgPSBTeXN0ZW1VdGlsLnJ1blNoZWxsQ29tbWFuZChnZXRJbnN0cnVtZW50YXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgImNtZCBkZXZpY2VzdG9yYWdlbW9uaXRvciBmb3JjZS1sb3cgLWYiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlcyA9IFN5c3RlbVV0aWwucnVuU2hlbGxDb21tYW5kKGdldEluc3RydW1lbnRhdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAiY21kIGRldmljZXN0b3JhZ2Vtb25pdG9yIGZvcmNlLW5vdC1sb3cgLWYiKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgc2VxID0gSW50ZWdlci5wYXJzZUludChyZXMudHJpbSgpKTsKKyAgICAgICAgbG9uZyBzdGFydFRpbWUgPSBTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKTsKKworICAgICAgICAvLyBXYWl0IGZvciB0aGUgc3RvcmFnZSB1cGRhdGUgdG8gYmUgcHJvY2Vzc2VkIGJ5IGpvYiBzY2hlZHVsZXIgYmVmb3JlIHByb2NlZWRpbmcuCisgICAgICAgIGludCBjdXJTZXE7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGN1clNlcSA9IEludGVnZXIucGFyc2VJbnQoU3lzdGVtVXRpbC5ydW5TaGVsbENvbW1hbmQoZ2V0SW5zdHJ1bWVudGF0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICJjbWQgam9ic2NoZWR1bGVyIGdldC1zdG9yYWdlLXNlcSIpLnRyaW0oKSk7CisgICAgICAgICAgICBpZiAoY3VyU2VxID09IHNlcSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoKFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpLXN0YXJ0VGltZSkgPCAxMDAwKTsKKworICAgICAgICBmYWlsKCJUaW1lZCBvdXQgd2FpdGluZyBmb3Igam9iIHNjaGVkdWxlcjogZXhwZWN0ZWQgc2VxPSIgKyBzZXEgKyAiLCBjdXI9IiArIGN1clNlcSk7CisgICAgfQorCisgICAgU3RyaW5nIGdldEpvYlN0YXRlKGludCBqb2JJZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBTeXN0ZW1VdGlsLnJ1blNoZWxsQ29tbWFuZChnZXRJbnN0cnVtZW50YXRpb24oKSwKKyAgICAgICAgICAgICAgICAiY21kIGpvYnNjaGVkdWxlciBnZXQtam9iLXN0YXRlIC0tdXNlciBjdXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBrSm9iU2VydmljZUNvbXBvbmVudC5nZXRQYWNrYWdlTmFtZSgpICsgIiAiICsgam9iSWQpLnRyaW0oKTsKKyAgICB9CisKKyAgICB2b2lkIGFzc2VydEpvYlJlYWR5KGludCBqb2JJZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBzdGF0ZSA9IGdldEpvYlN0YXRlKGpvYklkKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiSm9iIHVuZXhwZWN0ZWRseSBub3QgcmVhZHksIGluIHN0YXRlOiAiICsgc3RhdGUsIHN0YXRlLmNvbnRhaW5zKCJyZWFkeSIpKTsKKyAgICB9CisKKyAgICB2b2lkIGFzc2VydEpvYldhaXRpbmcoaW50IGpvYklkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHN0YXRlID0gZ2V0Sm9iU3RhdGUoam9iSWQpOworICAgICAgICBhc3NlcnRUcnVlKCJKb2IgdW5leHBlY3RlZGx5IG5vdCB3YWl0aW5nLCBpbiBzdGF0ZTogIiArIHN0YXRlLCBzdGF0ZS5jb250YWlucygid2FpdGluZyIpKTsKKyAgICB9CisKKyAgICB2b2lkIGFzc2VydEpvYk5vdFJlYWR5KGludCBqb2JJZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBzdGF0ZSA9IGdldEpvYlN0YXRlKGpvYklkKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiSm9iIHVuZXhwZWN0ZWRseSByZWFkeSwgaW4gc3RhdGU6ICIgKyBzdGF0ZSwgIXN0YXRlLmNvbnRhaW5zKCJyZWFkeSIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9Kb2JTY2hlZHVsZXJTaGFyZWRVaWQvc3JjL2FuZHJvaWQvam9ic2NoZWR1bGVyL2N0cy9zaGFyZWR1aWR0ZXN0cy9FbnF1ZXVlSm9iV29ya1Rlc3QuamF2YSBiL3Rlc3RzL0pvYlNjaGVkdWxlclNoYXJlZFVpZC9zcmMvYW5kcm9pZC9qb2JzY2hlZHVsZXIvY3RzL3NoYXJlZHVpZHRlc3RzL0VucXVldWVKb2JXb3JrVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlNzlmMjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Kb2JTY2hlZHVsZXJTaGFyZWRVaWQvc3JjL2FuZHJvaWQvam9ic2NoZWR1bGVyL2N0cy9zaGFyZWR1aWR0ZXN0cy9FbnF1ZXVlSm9iV29ya1Rlc3QuamF2YQpAQCAtMCwwICsxLDQzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5qb2JzY2hlZHVsZXIuY3RzLnNoYXJlZHVpZHRlc3RzOworCitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLlRhcmdldEFwaTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5qb2IuSm9iSW5mbzsKK2ltcG9ydCBhbmRyb2lkLmFwcC5qb2IuSm9iV29ya0l0ZW07CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlckNsaWVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuam9ic2NoZWR1bGVyLk1vY2tKb2JTZXJ2aWNlLlRlc3RXb3JrSXRlbTsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlN5c3RlbVV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCisvKioKKyAqIFNjaGVkdWxlcyBqb2JzIHdpdGggdGhlIHtAbGluayBhbmRyb2lkLmFwcC5qb2IuSm9iU2NoZWR1bGVyfSBieSBlbnF1ZXVlIHdvcmsgaW4gdG8KKyAqIHRoZW0gYW5kIHByb2Nlc3NpbmcgaXQuCisgKi8KK0BUYXJnZXRBcGkoMjYpCitwdWJsaWMgY2xhc3MgRW5xdWV1ZUpvYldvcmtUZXN0IGV4dGVuZHMgQ29uc3RyYWludFRlc3QgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQ2xpcERhdGFKb2JUZXN0IjsKKworICAgIC8qKiBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGpvYiBzY2hlZHVsZWQgYnkgdGhpcyBzdWl0ZSBvZiB0ZXN0cy4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlFVRVVFX1dPUktfSk9CX0lEID0gRW5xdWV1ZUpvYldvcmtUZXN0LmNsYXNzLmhhc2hDb2RlKCk7CisKKyAgICBwcml2YXRlIEpvYkluZm8uQnVpbGRlciBtQnVpbGRlcjsKKyAgICBwcml2YXRlIENvbnRlbnRQcm92aWRlckNsaWVudCBtUHJvdmlkZXI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworCisgICAgICAgIG1CdWlsZGVyID0gbmV3IEpvYkluZm8uQnVpbGRlcihFTlFVRVVFX1dPUktfSk9CX0lELCBrSm9iU2VydmljZUNvbXBvbmVudCk7CisgICAgICAgIG1Qcm92aWRlciA9IGdldENvbnRleHQoKS5nZXRDb250ZW50UmVzb2x2ZXIoKS5hY3F1aXJlQ29udGVudFByb3ZpZGVyQ2xpZW50KG1GaXJzdFVyaSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICAgICAgbVByb3ZpZGVyLmNsb3NlKCk7CisgICAgICAgIG1Kb2JTY2hlZHVsZXIuY2FuY2VsKEVOUVVFVUVfV09SS19KT0JfSUQpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpbnRlbnRFcXVhbHMoSW50ZW50IGkxLCBJbnRlbnQgaTIpIHsKKyAgICAgICAgaWYgKGkxID09IGkyKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaTEgPT0gbnVsbCB8fCBpMiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGkxLmZpbHRlckVxdWFscyhpMik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNvbXBhcmVXb3JrKFRlc3RXb3JrSXRlbVtdIGV4cGVjdGVkLCBBcnJheUxpc3Q8Sm9iV29ya0l0ZW0+IHJlY2VpdmVkKSB7CisgICAgICAgIGlmIChyZWNlaXZlZCA9PSBudWxsKSB7CisgICAgICAgICAgICBmYWlsKCJEaWRuJ3QgcmVjZWl2ZSBhbnkgZXhwZWN0ZWQgd29yay4iKTsKKyAgICAgICAgfQorICAgICAgICBBcnJheUxpc3Q8VGVzdFdvcmtJdGVtPiBleHBlY3RlZEFycmF5ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGV4cGVjdGVkQXJyYXkuYWRkKGV4cGVjdGVkW2ldKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlY2VpdmVkLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBKb2JXb3JrSXRlbSB3b3JrID0gcmVjZWl2ZWQuZ2V0KGkpOworICAgICAgICAgICAgaWYgKGkgPCBleHBlY3RlZC5sZW5ndGggJiYgZXhwZWN0ZWRbaV0uc3ViaXRlbXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFRlc3RXb3JrSXRlbVtdIHN1YiA9IGV4cGVjdGVkW2ldLnN1Yml0ZW1zOworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc3ViLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkQXJyYXkuYWRkKHN1YltqXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGkgPj0gZXhwZWN0ZWRBcnJheS5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJSZWNlaXZlZCBtb3JlIHRoYW4gIiArIGV4cGVjdGVkLmxlbmd0aCArICIgd29yayBpdGVtcywgZmlyc3QgZXh0cmEgaXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyB3b3JrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghaW50ZW50RXF1YWxzKHdvcmsuZ2V0SW50ZW50KCksIGV4cGVjdGVkQXJyYXkuZ2V0KGkpLmludGVudCkpIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJSZWNlaXZlZCB3b3JrICMiICsgaSArICIgIiArIHdvcmsuZ2V0SW50ZW50KCkgKyAiIGJ1dCBleHBlY3RlZCAiICsgZXhwZWN0ZWRbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHdvcmsuZ2V0RGVsaXZlcnlDb3VudCgpICE9IGV4cGVjdGVkQXJyYXkuZ2V0KGkpLmRlbGl2ZXJ5Q291bnQpIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJSZWNlaXZlZCB3b3JrICMiICsgaSArICIgIiArIHdvcmsuZ2V0SW50ZW50KCkgKyAiIGRlbGl2ZXJ5IGNvdW50IGlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgd29yay5nZXREZWxpdmVyeUNvdW50KCkgKyAiIGJ1dCBleHBlY3RlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGV4cGVjdGVkQXJyYXkuZ2V0KGkpLmRlbGl2ZXJ5Q291bnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChyZWNlaXZlZC5zaXplKCkgPCBleHBlY3RlZC5sZW5ndGgpIHsKKyAgICAgICAgICAgIGZhaWwoIlJlY2VpdmVkIG9ubHkgIiArIHJlY2VpdmVkLnNpemUoKSArICIgd29yayBpdGVtcywgYnV0IGV4cGVjdGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGV4cGVjdGVkLmxlbmd0aCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGJhc2ljIGVucXVldWVpbmcgb2Ygd29yay4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW5xdWV1ZU9uZVdvcmsoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSW50ZW50IHdvcmsxID0gbmV3IEludGVudCgid29yazEiKTsKKyAgICAgICAgVGVzdFdvcmtJdGVtW10gd29yayA9IG5ldyBUZXN0V29ya0l0ZW1bXSB7IG5ldyBUZXN0V29ya0l0ZW0od29yazEpIH07CisgICAgICAgIGtUZXN0RW52aXJvbm1lbnQuc2V0RXhwZWN0ZWRFeGVjdXRpb25zKDEpOworICAgICAgICBrVGVzdEVudmlyb25tZW50LnNldEV4cGVjdGVkV29yayh3b3JrKTsKKyAgICAgICAgbUpvYlNjaGVkdWxlci5lbnF1ZXVlKG1CdWlsZGVyLnNldE92ZXJyaWRlRGVhZGxpbmUoMCkuYnVpbGQoKSwgbmV3IEpvYldvcmtJdGVtKHdvcmsxKSk7CisgICAgICAgIGtUZXN0RW52aXJvbm1lbnQucmVhZHlUb1dvcmsoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiSm9iIHdpdGggd29yayBlbnF1ZXVlZCBkaWQgbm90IGZpcmUuIiwKKyAgICAgICAgICAgICAgICBrVGVzdEVudmlyb25tZW50LmF3YWl0RXhlY3V0aW9uKCkpOworICAgICAgICBjb21wYXJlV29yayh3b3JrLCBrVGVzdEVudmlyb25tZW50LmdldExhc3RSZWNlaXZlZFdvcmsoKSk7CisgICAgICAgIGlmIChrVGVzdEVudmlyb25tZW50LmdldExhc3RFcnJvck1lc3NhZ2UoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBmYWlsKGtUZXN0RW52aXJvbm1lbnQuZ2V0TGFzdEVycm9yTWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgYmFzaWMgZW5xdWV1ZWluZyBiYXRjaGVzIG9mIHdvcmsuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEVucXVldWVNdWx0aXBsZVdvcmsoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSW50ZW50IHdvcmsxID0gbmV3IEludGVudCgid29yazEiKTsKKyAgICAgICAgSW50ZW50IHdvcmsyID0gbmV3IEludGVudCgid29yazIiKTsKKyAgICAgICAgSW50ZW50IHdvcmszID0gbmV3IEludGVudCgid29yazMiKTsKKyAgICAgICAgSW50ZW50IHdvcms0ID0gbmV3IEludGVudCgid29yazQiKTsKKyAgICAgICAgSW50ZW50IHdvcms1ID0gbmV3IEludGVudCgid29yazUiKTsKKyAgICAgICAgSW50ZW50IHdvcms2ID0gbmV3IEludGVudCgid29yazYiKTsKKyAgICAgICAgSW50ZW50IHdvcms3ID0gbmV3IEludGVudCgid29yazciKTsKKyAgICAgICAgSW50ZW50IHdvcms4ID0gbmV3IEludGVudCgid29yazgiKTsKKyAgICAgICAgVGVzdFdvcmtJdGVtW10gd29yayA9IG5ldyBUZXN0V29ya0l0ZW1bXSB7CisgICAgICAgICAgICAgICAgbmV3IFRlc3RXb3JrSXRlbSh3b3JrMSksIG5ldyBUZXN0V29ya0l0ZW0od29yazIpLCBuZXcgVGVzdFdvcmtJdGVtKHdvcmszKSwKKyAgICAgICAgICAgICAgICBuZXcgVGVzdFdvcmtJdGVtKHdvcms0KSwgbmV3IFRlc3RXb3JrSXRlbSh3b3JrNSksIG5ldyBUZXN0V29ya0l0ZW0od29yazYpLAorICAgICAgICAgICAgICAgIG5ldyBUZXN0V29ya0l0ZW0od29yazcpLCBuZXcgVGVzdFdvcmtJdGVtKHdvcms4KSB9OworICAgICAgICBrVGVzdEVudmlyb25tZW50LnNldEV4cGVjdGVkRXhlY3V0aW9ucygxKTsKKyAgICAgICAga1Rlc3RFbnZpcm9ubWVudC5zZXRFeHBlY3RlZFdvcmsod29yayk7CisgICAgICAgIEpvYkluZm8gamkgPSBtQnVpbGRlci5zZXRPdmVycmlkZURlYWRsaW5lKDApLmJ1aWxkKCk7CisgICAgICAgIG1Kb2JTY2hlZHVsZXIuZW5xdWV1ZShqaSwgbmV3IEpvYldvcmtJdGVtKHdvcmsxKSk7CisgICAgICAgIG1Kb2JTY2hlZHVsZXIuZW5xdWV1ZShqaSwgbmV3IEpvYldvcmtJdGVtKHdvcmsyKSk7CisgICAgICAgIG1Kb2JTY2hlZHVsZXIuZW5xdWV1ZShqaSwgbmV3IEpvYldvcmtJdGVtKHdvcmszKSk7CisgICAgICAgIG1Kb2JTY2hlZHVsZXIuZW5xdWV1ZShqaSwgbmV3IEpvYldvcmtJdGVtKHdvcms0KSk7CisgICAgICAgIG1Kb2JTY2hlZHVsZXIuZW5xdWV1ZShqaSwgbmV3IEpvYldvcmtJdGVtKHdvcms1KSk7CisgICAgICAgIG1Kb2JTY2hlZHVsZXIuZW5xdWV1ZShqaSwgbmV3IEpvYldvcmtJdGVtKHdvcms2KSk7CisgICAgICAgIG1Kb2JTY2hlZHVsZXIuZW5xdWV1ZShqaSwgbmV3IEpvYldvcmtJdGVtKHdvcms3KSk7CisgICAgICAgIG1Kb2JTY2hlZHVsZXIuZW5xdWV1ZShqaSwgbmV3IEpvYldvcmtJdGVtKHdvcms4KSk7CisgICAgICAgIGtUZXN0RW52aXJvbm1lbnQucmVhZHlUb1dvcmsoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiSm9iIHdpdGggd29yayBlbnF1ZXVlZCBkaWQgbm90IGZpcmUuIiwKKyAgICAgICAgICAgICAgICBrVGVzdEVudmlyb25tZW50LmF3YWl0RXhlY3V0aW9uKCkpOworICAgICAgICBjb21wYXJlV29yayh3b3JrLCBrVGVzdEVudmlyb25tZW50LmdldExhc3RSZWNlaXZlZFdvcmsoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBiYXNpYyBlbnF1ZXVlaW5nIGJhdGNoZXMgb2Ygd29yaywgd2l0aCBuZXcgd29yayBjb21pbmcgaW4gd2hpbGUgcHJvY2Vzc2luZyBleGlzdGluZworICAgICAqIHdvcmsuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEVucXVldWVNdWx0aXBsZVN1YldvcmsoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSW50ZW50IHdvcmsxID0gbmV3IEludGVudCgid29yazEiKTsKKyAgICAgICAgSW50ZW50IHdvcmsyID0gbmV3IEludGVudCgid29yazIiKTsKKyAgICAgICAgSW50ZW50IHdvcmszID0gbmV3IEludGVudCgid29yazMiKTsKKyAgICAgICAgSW50ZW50IHdvcms0ID0gbmV3IEludGVudCgid29yazQiKTsKKyAgICAgICAgSW50ZW50IHdvcms1ID0gbmV3IEludGVudCgid29yazUiKTsKKyAgICAgICAgSW50ZW50IHdvcms2ID0gbmV3IEludGVudCgid29yazYiKTsKKyAgICAgICAgSW50ZW50IHdvcms3ID0gbmV3IEludGVudCgid29yazciKTsKKyAgICAgICAgSW50ZW50IHdvcms4ID0gbmV3IEludGVudCgid29yazgiKTsKKyAgICAgICAgSm9iSW5mbyBqaSA9IG1CdWlsZGVyLnNldE92ZXJyaWRlRGVhZGxpbmUoMCkuYnVpbGQoKTsKKyAgICAgICAgVGVzdFdvcmtJdGVtW10gd29yayA9IG5ldyBUZXN0V29ya0l0ZW1bXXsKKyAgICAgICAgICAgICAgICBuZXcgVGVzdFdvcmtJdGVtKHdvcmsxKSwgbmV3IFRlc3RXb3JrSXRlbSh3b3JrMiksIG5ldyBUZXN0V29ya0l0ZW0od29yazMpLAorICAgICAgICAgICAgICAgIG5ldyBUZXN0V29ya0l0ZW0od29yazQsIGppLCBuZXcgVGVzdFdvcmtJdGVtW10geworICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRlc3RXb3JrSXRlbSh3b3JrNSksIG5ldyBUZXN0V29ya0l0ZW0od29yazYpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRlc3RXb3JrSXRlbSh3b3JrNyksIG5ldyBUZXN0V29ya0l0ZW0od29yazgpfSkKKyAgICAgICAgfTsKKyAgICAgICAga1Rlc3RFbnZpcm9ubWVudC5zZXRFeHBlY3RlZEV4ZWN1dGlvbnMoMSk7CisgICAgICAgIGtUZXN0RW52aXJvbm1lbnQuc2V0RXhwZWN0ZWRXb3JrKHdvcmspOworICAgICAgICBtSm9iU2NoZWR1bGVyLmVucXVldWUoamksIG5ldyBKb2JXb3JrSXRlbSh3b3JrMSkpOworICAgICAgICBtSm9iU2NoZWR1bGVyLmVucXVldWUoamksIG5ldyBKb2JXb3JrSXRlbSh3b3JrMikpOworICAgICAgICBtSm9iU2NoZWR1bGVyLmVucXVldWUoamksIG5ldyBKb2JXb3JrSXRlbSh3b3JrMykpOworICAgICAgICBtSm9iU2NoZWR1bGVyLmVucXVldWUoamksIG5ldyBKb2JXb3JrSXRlbSh3b3JrNCkpOworICAgICAgICBrVGVzdEVudmlyb25tZW50LnJlYWR5VG9Xb3JrKCk7CisgICAgICAgIGFzc2VydFRydWUoIkpvYiB3aXRoIHdvcmsgZW5xdWV1ZWQgZGlkIG5vdCBmaXJlLiIsCisgICAgICAgICAgICAgICAga1Rlc3RFbnZpcm9ubWVudC5hd2FpdEV4ZWN1dGlvbigpKTsKKyAgICAgICAgY29tcGFyZVdvcmsod29yaywga1Rlc3RFbnZpcm9ubWVudC5nZXRMYXN0UmVjZWl2ZWRXb3JrKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgYmFzaWMgZW5xdWV1ZWluZyBiYXRjaGVzIG9mIHdvcmsgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RFbnF1ZXVlUGFyYWxsZWwyV29yaygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJbnRlbnQgd29yazEgPSBuZXcgSW50ZW50KCJ3b3JrMSIpOworICAgICAgICBJbnRlbnQgd29yazIgPSBuZXcgSW50ZW50KCJ3b3JrMiIpOworICAgICAgICBUZXN0V29ya0l0ZW1bXSB3b3JrID0gbmV3IFRlc3RXb3JrSXRlbVtdIHsKKyAgICAgICAgICAgICAgICBuZXcgVGVzdFdvcmtJdGVtKHdvcmsxLCBUZXN0V29ya0l0ZW0uRkxBR19ERUxBWV9DT01QTEVURV9QVVNIX0JBQ0spLAorICAgICAgICAgICAgICAgIG5ldyBUZXN0V29ya0l0ZW0od29yazIsIFRlc3RXb3JrSXRlbS5GTEFHX0RFTEFZX0NPTVBMRVRFX1BVU0hfQkFDSykgfTsKKyAgICAgICAga1Rlc3RFbnZpcm9ubWVudC5zZXRFeHBlY3RlZEV4ZWN1dGlvbnMoMSk7CisgICAgICAgIGtUZXN0RW52aXJvbm1lbnQuc2V0RXhwZWN0ZWRXb3JrKHdvcmspOworICAgICAgICBKb2JJbmZvIGppID0gbUJ1aWxkZXIuc2V0T3ZlcnJpZGVEZWFkbGluZSgwKS5idWlsZCgpOworICAgICAgICBtSm9iU2NoZWR1bGVyLmVucXVldWUoamksIG5ldyBKb2JXb3JrSXRlbSh3b3JrMSkpOworICAgICAgICBtSm9iU2NoZWR1bGVyLmVucXVldWUoamksIG5ldyBKb2JXb3JrSXRlbSh3b3JrMikpOworICAgICAgICBrVGVzdEVudmlyb25tZW50LnJlYWR5VG9Xb3JrKCk7CisgICAgICAgIGFzc2VydFRydWUoIkpvYiB3aXRoIHdvcmsgZW5xdWV1ZWQgZGlkIG5vdCBmaXJlLiIsCisgICAgICAgICAgICAgICAga1Rlc3RFbnZpcm9ubWVudC5hd2FpdEV4ZWN1dGlvbigpKTsKKyAgICAgICAgY29tcGFyZVdvcmsod29yaywga1Rlc3RFbnZpcm9ubWVudC5nZXRMYXN0UmVjZWl2ZWRXb3JrKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgYmFzaWMgZW5xdWV1ZWluZyBiYXRjaGVzIG9mIHdvcmsgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsIGFuZCBjb21wbGV0ZWQKKyAgICAgKiBpbiByZXZlcnNlIG9yZGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RFbnF1ZXVlUGFyYWxsZWwyUmV2ZXJzZVdvcmsoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSW50ZW50IHdvcmsxID0gbmV3IEludGVudCgid29yazEiKTsKKyAgICAgICAgSW50ZW50IHdvcmsyID0gbmV3IEludGVudCgid29yazIiKTsKKyAgICAgICAgVGVzdFdvcmtJdGVtW10gd29yayA9IG5ldyBUZXN0V29ya0l0ZW1bXSB7CisgICAgICAgICAgICAgICAgbmV3IFRlc3RXb3JrSXRlbSh3b3JrMSwgVGVzdFdvcmtJdGVtLkZMQUdfREVMQVlfQ09NUExFVEVfUFVTSF9CQUNLKSwKKyAgICAgICAgICAgICAgICBuZXcgVGVzdFdvcmtJdGVtKHdvcmsyLCBUZXN0V29ya0l0ZW0uRkxBR19ERUxBWV9DT01QTEVURV9QVVNIX1RPUCkgfTsKKyAgICAgICAga1Rlc3RFbnZpcm9ubWVudC5zZXRFeHBlY3RlZEV4ZWN1dGlvbnMoMSk7CisgICAgICAgIGtUZXN0RW52aXJvbm1lbnQuc2V0RXhwZWN0ZWRXb3JrKHdvcmspOworICAgICAgICBKb2JJbmZvIGppID0gbUJ1aWxkZXIuc2V0T3ZlcnJpZGVEZWFkbGluZSgwKS5idWlsZCgpOworICAgICAgICBtSm9iU2NoZWR1bGVyLmVucXVldWUoamksIG5ldyBKb2JXb3JrSXRlbSh3b3JrMSkpOworICAgICAgICBtSm9iU2NoZWR1bGVyLmVucXVldWUoamksIG5ldyBKb2JXb3JrSXRlbSh3b3JrMikpOworICAgICAgICBrVGVzdEVudmlyb25tZW50LnJlYWR5VG9Xb3JrKCk7CisgICAgICAgIGFzc2VydFRydWUoIkpvYiB3aXRoIHdvcmsgZW5xdWV1ZWQgZGlkIG5vdCBmaXJlLiIsCisgICAgICAgICAgICAgICAga1Rlc3RFbnZpcm9ubWVudC5hd2FpdEV4ZWN1dGlvbigpKTsKKyAgICAgICAgY29tcGFyZVdvcmsod29yaywga1Rlc3RFbnZpcm9ubWVudC5nZXRMYXN0UmVjZWl2ZWRXb3JrKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgYmFzaWMgZW5xdWV1ZWluZyBiYXRjaGVzIG9mIHdvcmsgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RFbnF1ZXVlTXVsdGlwbGVQYXJhbGxlbFdvcmsoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSW50ZW50IHdvcmsxID0gbmV3IEludGVudCgid29yazEiKTsKKyAgICAgICAgSW50ZW50IHdvcmsyID0gbmV3IEludGVudCgid29yazIiKTsKKyAgICAgICAgSW50ZW50IHdvcmszID0gbmV3IEludGVudCgid29yazMiKTsKKyAgICAgICAgSW50ZW50IHdvcms0ID0gbmV3IEludGVudCgid29yazQiKTsKKyAgICAgICAgSW50ZW50IHdvcms1ID0gbmV3IEludGVudCgid29yazUiKTsKKyAgICAgICAgSW50ZW50IHdvcms2ID0gbmV3IEludGVudCgid29yazYiKTsKKyAgICAgICAgSW50ZW50IHdvcms3ID0gbmV3IEludGVudCgid29yazciKTsKKyAgICAgICAgSW50ZW50IHdvcms4ID0gbmV3IEludGVudCgid29yazgiKTsKKyAgICAgICAgVGVzdFdvcmtJdGVtW10gd29yayA9IG5ldyBUZXN0V29ya0l0ZW1bXSB7CisgICAgICAgICAgICAgICAgbmV3IFRlc3RXb3JrSXRlbSh3b3JrMSwgVGVzdFdvcmtJdGVtLkZMQUdfREVMQVlfQ09NUExFVEVfUFVTSF9CQUNLKSwKKyAgICAgICAgICAgICAgICBuZXcgVGVzdFdvcmtJdGVtKHdvcmsyLCBUZXN0V29ya0l0ZW0uRkxBR19ERUxBWV9DT01QTEVURV9QVVNIX1RPUCksCisgICAgICAgICAgICAgICAgbmV3IFRlc3RXb3JrSXRlbSh3b3JrMywgVGVzdFdvcmtJdGVtLkZMQUdfREVMQVlfQ09NUExFVEVfUFVTSF9CQUNLCisgICAgICAgICAgICAgICAgICAgICAgICB8IFRlc3RXb3JrSXRlbS5GTEFHX0NPTVBMRVRFX05FWFQpLAorICAgICAgICAgICAgICAgIG5ldyBUZXN0V29ya0l0ZW0od29yazQsIFRlc3RXb3JrSXRlbS5GTEFHX0NPTVBMRVRFX05FWFQpLAorICAgICAgICAgICAgICAgIG5ldyBUZXN0V29ya0l0ZW0od29yazUsIFRlc3RXb3JrSXRlbS5GTEFHX0RFTEFZX0NPTVBMRVRFX1BVU0hfVE9QKSwKKyAgICAgICAgICAgICAgICBuZXcgVGVzdFdvcmtJdGVtKHdvcms2LCBUZXN0V29ya0l0ZW0uRkxBR19ERUxBWV9DT01QTEVURV9QVVNIX1RPUCksCisgICAgICAgICAgICAgICAgbmV3IFRlc3RXb3JrSXRlbSh3b3JrNywgVGVzdFdvcmtJdGVtLkZMQUdfREVMQVlfQ09NUExFVEVfUFVTSF9UT1AKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgVGVzdFdvcmtJdGVtLkZMQUdfQ09NUExFVEVfTkVYVCksCisgICAgICAgICAgICAgICAgbmV3IFRlc3RXb3JrSXRlbSh3b3JrOCkgfTsKKyAgICAgICAga1Rlc3RFbnZpcm9ubWVudC5zZXRFeHBlY3RlZEV4ZWN1dGlvbnMoMSk7CisgICAgICAgIGtUZXN0RW52aXJvbm1lbnQuc2V0RXhwZWN0ZWRXb3JrKHdvcmspOworICAgICAgICBKb2JJbmZvIGppID0gbUJ1aWxkZXIuc2V0T3ZlcnJpZGVEZWFkbGluZSgwKS5idWlsZCgpOworICAgICAgICBtSm9iU2NoZWR1bGVyLmVucXVldWUoamksIG5ldyBKb2JXb3JrSXRlbSh3b3JrMSkpOworICAgICAgICBtSm9iU2NoZWR1bGVyLmVucXVldWUoamksIG5ldyBKb2JXb3JrSXRlbSh3b3JrMikpOworICAgICAgICBtSm9iU2NoZWR1bGVyLmVucXVldWUoamksIG5ldyBKb2JXb3JrSXRlbSh3b3JrMykpOworICAgICAgICBtSm9iU2NoZWR1bGVyLmVucXVldWUoamksIG5ldyBKb2JXb3JrSXRlbSh3b3JrNCkpOworICAgICAgICBtSm9iU2NoZWR1bGVyLmVucXVldWUoamksIG5ldyBKb2JXb3JrSXRlbSh3b3JrNSkpOworICAgICAgICBtSm9iU2NoZWR1bGVyLmVucXVldWUoamksIG5ldyBKb2JXb3JrSXRlbSh3b3JrNikpOworICAgICAgICBtSm9iU2NoZWR1bGVyLmVucXVldWUoamksIG5ldyBKb2JXb3JrSXRlbSh3b3JrNykpOworICAgICAgICBtSm9iU2NoZWR1bGVyLmVucXVldWUoamksIG5ldyBKb2JXb3JrSXRlbSh3b3JrOCkpOworICAgICAgICBrVGVzdEVudmlyb25tZW50LnJlYWR5VG9Xb3JrKCk7CisgICAgICAgIGFzc2VydFRydWUoIkpvYiB3aXRoIHdvcmsgZW5xdWV1ZWQgZGlkIG5vdCBmaXJlLiIsCisgICAgICAgICAgICAgICAga1Rlc3RFbnZpcm9ubWVudC5hd2FpdEV4ZWN1dGlvbigpKTsKKyAgICAgICAgY29tcGFyZVdvcmsod29yaywga1Rlc3RFbnZpcm9ubWVudC5nZXRMYXN0UmVjZWl2ZWRXb3JrKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3Qgam9iIGdldHRpbmcgc3RvcHBlZCB3aGlsZSBwcm9jZXNzaW5nIHdvcmsgYW5kIHRoYXQgd29yayBiZWluZyByZWRlbGl2ZXJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW5xdWV1ZU11bHRpcGxlUmVkZWxpdmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEludGVudCB3b3JrMSA9IG5ldyBJbnRlbnQoIndvcmsxIik7CisgICAgICAgIEludGVudCB3b3JrMiA9IG5ldyBJbnRlbnQoIndvcmsyIik7CisgICAgICAgIEludGVudCB3b3JrMyA9IG5ldyBJbnRlbnQoIndvcmszIik7CisgICAgICAgIEludGVudCB3b3JrNCA9IG5ldyBJbnRlbnQoIndvcms0Iik7CisgICAgICAgIEludGVudCB3b3JrNSA9IG5ldyBJbnRlbnQoIndvcms1Iik7CisgICAgICAgIEludGVudCB3b3JrNiA9IG5ldyBJbnRlbnQoIndvcms2Iik7CisgICAgICAgIFRlc3RXb3JrSXRlbVtdIGluaXRpYWxXb3JrID0gbmV3IFRlc3RXb3JrSXRlbVtdIHsKKyAgICAgICAgICAgICAgICBuZXcgVGVzdFdvcmtJdGVtKHdvcmsxKSwgbmV3IFRlc3RXb3JrSXRlbSh3b3JrMiksIG5ldyBUZXN0V29ya0l0ZW0od29yazMpLAorICAgICAgICAgICAgICAgIG5ldyBUZXN0V29ya0l0ZW0od29yazQsIFRlc3RXb3JrSXRlbS5GTEFHX1dBSVRfRk9SX1NUT1AsIDEpIH07CisgICAgICAgIGtUZXN0RW52aXJvbm1lbnQuc2V0RXhwZWN0ZWRFeGVjdXRpb25zKDEpOworICAgICAgICBrVGVzdEVudmlyb25tZW50LnNldEV4cGVjdGVkV2FpdEZvclN0b3AoKTsKKyAgICAgICAga1Rlc3RFbnZpcm9ubWVudC5zZXRFeHBlY3RlZFdvcmsoaW5pdGlhbFdvcmspOworICAgICAgICBKb2JJbmZvIGppID0gbUJ1aWxkZXIuc2V0T3ZlcnJpZGVEZWFkbGluZSgwKS5idWlsZCgpOworICAgICAgICBtSm9iU2NoZWR1bGVyLmVucXVldWUoamksIG5ldyBKb2JXb3JrSXRlbSh3b3JrMSkpOworICAgICAgICBtSm9iU2NoZWR1bGVyLmVucXVldWUoamksIG5ldyBKb2JXb3JrSXRlbSh3b3JrMikpOworICAgICAgICBtSm9iU2NoZWR1bGVyLmVucXVldWUoamksIG5ldyBKb2JXb3JrSXRlbSh3b3JrMykpOworICAgICAgICBtSm9iU2NoZWR1bGVyLmVucXVldWUoamksIG5ldyBKb2JXb3JrSXRlbSh3b3JrNCkpOworICAgICAgICBrVGVzdEVudmlyb25tZW50LnJlYWR5VG9Xb3JrKCk7CisKKyAgICAgICAgLy8gTm93IHdhaXQgZm9yIHRoZSBqb2IgdG8gZ2V0IHRvIHRoZSBwb2ludCB3aGVyZSBpdCBpcyBwcm9jZXNzaW5nIHRoZSBsYXN0CisgICAgICAgIC8vIHdvcmsgYW5kIHdhaXRpbmcgZm9yIGl0IHRvIGJlIHN0b3BwZWQuCisgICAgICAgIGFzc2VydFRydWUoIkpvYiB3aXRoIHdvcmsgZW5xdWV1ZWQgZGlkIG5vdCB3YWl0IHRvIHN0b3AuIiwKKyAgICAgICAgICAgICAgICBrVGVzdEVudmlyb25tZW50LmF3YWl0V2FpdGluZ0ZvclN0b3AoKSk7CisKKyAgICAgICAgLy8gQ2F1c2UgdGhlIGpvYiB0byB0aW1lb3V0IChzdG9wKSBpbW1lZGlhdGVseSwgYW5kIHdhaXQgZm9yIGl0cyBleGVjdXRpb24gdG8gZmluaXNoLgorICAgICAgICBTeXN0ZW1VdGlsLnJ1blNoZWxsQ29tbWFuZChnZXRJbnN0cnVtZW50YXRpb24oKSwgImNtZCBqb2JzY2hlZHVsZXIgdGltZW91dCAiCisgICAgICAgICAgICAgICAgKyBrSm9iU2VydmljZUNvbXBvbmVudC5nZXRQYWNrYWdlTmFtZSgpICsgIiAiICsgRU5RVUVVRV9XT1JLX0pPQl9JRCk7CisgICAgICAgIGFzc2VydFRydWUoIkpvYiB3aXRoIHdvcmsgZW5xdWV1ZWQgZGlkIG5vdCBmaW5pc2guIiwKKyAgICAgICAgICAgICAgICBrVGVzdEVudmlyb25tZW50LmF3YWl0RXhlY3V0aW9uKCkpOworICAgICAgICBjb21wYXJlV29yayhpbml0aWFsV29yaywga1Rlc3RFbnZpcm9ubWVudC5nZXRMYXN0UmVjZWl2ZWRXb3JrKCkpOworCisgICAgICAgIC8vIE5vdyB3ZSBhcmUgZ29pbmcgdG8gYWRkIHNvbWUgbW9yZSB3b3JrLCByZXN0YXJ0IHRoZSBqb2IsIGFuZCBzZWUgaWYgaXQgY29ycmVjdGx5CisgICAgICAgIC8vIHJlZGVsaXZlcnMgdGhlIGxhc3Qgd29yayBhbmQgZGVsaXZlcnMgdGhlIG5ldyB3b3JrLgorICAgICAgICBUZXN0V29ya0l0ZW1bXSBmaW5hbFdvcmsgPSBuZXcgVGVzdFdvcmtJdGVtW10geworICAgICAgICAgICAgICAgIG5ldyBUZXN0V29ya0l0ZW0od29yazQsIDAsIDIpLCBuZXcgVGVzdFdvcmtJdGVtKHdvcms1KSwgbmV3IFRlc3RXb3JrSXRlbSh3b3JrNikgfTsKKyAgICAgICAga1Rlc3RFbnZpcm9ubWVudC5zZXRFeHBlY3RlZEV4ZWN1dGlvbnMoMSk7CisgICAgICAgIGtUZXN0RW52aXJvbm1lbnQuc2V0RXhwZWN0ZWRXb3JrKGZpbmFsV29yayk7CisgICAgICAgIG1Kb2JTY2hlZHVsZXIuZW5xdWV1ZShqaSwgbmV3IEpvYldvcmtJdGVtKHdvcms1KSk7CisgICAgICAgIG1Kb2JTY2hlZHVsZXIuZW5xdWV1ZShqaSwgbmV3IEpvYldvcmtJdGVtKHdvcms2KSk7CisgICAgICAgIGtUZXN0RW52aXJvbm1lbnQucmVhZHlUb1dvcmsoKTsKKyAgICAgICAgU3lzdGVtVXRpbC5ydW5TaGVsbENvbW1hbmQoZ2V0SW5zdHJ1bWVudGF0aW9uKCksICJjbWQgam9ic2NoZWR1bGVyIHJ1biAiCisgICAgICAgICAgICAgICAgKyAiIC0tdXNlciAiICsgZ2V0Q3VycmVudFVzZXIoKSArICIgIgorICAgICAgICAgICAgICAgICsga0pvYlNlcnZpY2VDb21wb25lbnQuZ2V0UGFja2FnZU5hbWUoKSArICIgIiArIEVOUVVFVUVfV09SS19KT0JfSUQpOworCisgICAgICAgIGFzc2VydFRydWUoIlJlc3RhcnRlZCB3aXRoIHdvcmsgZW5xdWV1ZWQgZGlkIG5vdCBleGVjdXRlLiIsCisgICAgICAgICAgICAgICAga1Rlc3RFbnZpcm9ubWVudC5hd2FpdEV4ZWN1dGlvbigpKTsKKyAgICAgICAgY29tcGFyZVdvcmsoZmluYWxXb3JrLCBrVGVzdEVudmlyb25tZW50LmdldExhc3RSZWNlaXZlZFdvcmsoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBqb2IgZ2V0dGluZyBzdG9wcGVkIHdoaWxlIHByb2Nlc3Npbmcgd29yayBpbiBwYXJhbGxlbCBhbmQgdGhhdCB3b3JrIGJlaW5nIHJlZGVsaXZlcmVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RFbnF1ZXVlTXVsdGlwbGVQYXJhbGxlbFJlZGVsaXZlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJbnRlbnQgd29yazEgPSBuZXcgSW50ZW50KCJ3b3JrMSIpOworICAgICAgICBJbnRlbnQgd29yazIgPSBuZXcgSW50ZW50KCJ3b3JrMiIpOworICAgICAgICBJbnRlbnQgd29yazMgPSBuZXcgSW50ZW50KCJ3b3JrMyIpOworICAgICAgICBJbnRlbnQgd29yazQgPSBuZXcgSW50ZW50KCJ3b3JrNCIpOworICAgICAgICBJbnRlbnQgd29yazUgPSBuZXcgSW50ZW50KCJ3b3JrNSIpOworICAgICAgICBJbnRlbnQgd29yazYgPSBuZXcgSW50ZW50KCJ3b3JrNiIpOworICAgICAgICBUZXN0V29ya0l0ZW1bXSBpbml0aWFsV29yayA9IG5ldyBUZXN0V29ya0l0ZW1bXSB7CisgICAgICAgICAgICAgICAgbmV3IFRlc3RXb3JrSXRlbSh3b3JrMSksCisgICAgICAgICAgICAgICAgbmV3IFRlc3RXb3JrSXRlbSh3b3JrMiwgVGVzdFdvcmtJdGVtLkZMQUdfREVMQVlfQ09NUExFVEVfUFVTSF9CQUNLKSwKKyAgICAgICAgICAgICAgICBuZXcgVGVzdFdvcmtJdGVtKHdvcmszLCBUZXN0V29ya0l0ZW0uRkxBR19ERUxBWV9DT01QTEVURV9QVVNIX0JBQ0spLAorICAgICAgICAgICAgICAgIG5ldyBUZXN0V29ya0l0ZW0od29yazQsIFRlc3RXb3JrSXRlbS5GTEFHX1dBSVRfRk9SX1NUT1AsIDEpIH07CisgICAgICAgIGtUZXN0RW52aXJvbm1lbnQuc2V0RXhwZWN0ZWRFeGVjdXRpb25zKDEpOworICAgICAgICBrVGVzdEVudmlyb25tZW50LnNldEV4cGVjdGVkV2FpdEZvclN0b3AoKTsKKyAgICAgICAga1Rlc3RFbnZpcm9ubWVudC5zZXRFeHBlY3RlZFdvcmsoaW5pdGlhbFdvcmspOworICAgICAgICBKb2JJbmZvIGppID0gbUJ1aWxkZXIuc2V0T3ZlcnJpZGVEZWFkbGluZSgwKS5idWlsZCgpOworICAgICAgICBtSm9iU2NoZWR1bGVyLmVucXVldWUoamksIG5ldyBKb2JXb3JrSXRlbSh3b3JrMSkpOworICAgICAgICBtSm9iU2NoZWR1bGVyLmVucXVldWUoamksIG5ldyBKb2JXb3JrSXRlbSh3b3JrMikpOworICAgICAgICBtSm9iU2NoZWR1bGVyLmVucXVldWUoamksIG5ldyBKb2JXb3JrSXRlbSh3b3JrMykpOworICAgICAgICBtSm9iU2NoZWR1bGVyLmVucXVldWUoamksIG5ldyBKb2JXb3JrSXRlbSh3b3JrNCkpOworICAgICAgICBrVGVzdEVudmlyb25tZW50LnJlYWR5VG9Xb3JrKCk7CisKKyAgICAgICAgLy8gTm93IHdhaXQgZm9yIHRoZSBqb2IgdG8gZ2V0IHRvIHRoZSBwb2ludCB3aGVyZSBpdCBpcyBwcm9jZXNzaW5nIHRoZSBsYXN0CisgICAgICAgIC8vIHdvcmsgYW5kIHdhaXRpbmcgZm9yIGl0IHRvIGJlIHN0b3BwZWQuCisgICAgICAgIGFzc2VydFRydWUoIkpvYiB3aXRoIHdvcmsgZW5xdWV1ZWQgZGlkIG5vdCB3YWl0IHRvIHN0b3AuIiwKKyAgICAgICAgICAgICAgICBrVGVzdEVudmlyb25tZW50LmF3YWl0V2FpdGluZ0ZvclN0b3AoKSk7CisKKyAgICAgICAgLy8gQ2F1c2UgdGhlIGpvYiB0byB0aW1lb3V0IChzdG9wKSBpbW1lZGlhdGVseSwgYW5kIHdhaXQgZm9yIGl0cyBleGVjdXRpb24gdG8gZmluaXNoLgorICAgICAgICBTeXN0ZW1VdGlsLnJ1blNoZWxsQ29tbWFuZChnZXRJbnN0cnVtZW50YXRpb24oKSwgImNtZCBqb2JzY2hlZHVsZXIgdGltZW91dCAiCisgICAgICAgICAgICAgICAgKyBrSm9iU2VydmljZUNvbXBvbmVudC5nZXRQYWNrYWdlTmFtZSgpICsgIiAiICsgRU5RVUVVRV9XT1JLX0pPQl9JRCk7CisgICAgICAgIGFzc2VydFRydWUoIkpvYiB3aXRoIHdvcmsgZW5xdWV1ZWQgZGlkIG5vdCBmaW5pc2guIiwKKyAgICAgICAgICAgICAgICBrVGVzdEVudmlyb25tZW50LmF3YWl0RXhlY3V0aW9uKCkpOworICAgICAgICBjb21wYXJlV29yayhpbml0aWFsV29yaywga1Rlc3RFbnZpcm9ubWVudC5nZXRMYXN0UmVjZWl2ZWRXb3JrKCkpOworCisgICAgICAgIC8vIE5vdyB3ZSBhcmUgZ29pbmcgdG8gYWRkIHNvbWUgbW9yZSB3b3JrLCByZXN0YXJ0IHRoZSBqb2IsIGFuZCBzZWUgaWYgaXQgY29ycmVjdGx5CisgICAgICAgIC8vIHJlZGVsaXZlcnMgdGhlIGxhc3Qgd29yayBhbmQgZGVsaXZlcnMgdGhlIG5ldyB3b3JrLgorICAgICAgICBUZXN0V29ya0l0ZW1bXSBmaW5hbFdvcmsgPSBuZXcgVGVzdFdvcmtJdGVtW10geworICAgICAgICAgICAgICAgIG5ldyBUZXN0V29ya0l0ZW0od29yazIsIDAsIDIpLCBuZXcgVGVzdFdvcmtJdGVtKHdvcmszLCAwLCAyKSwKKyAgICAgICAgICAgICAgICBuZXcgVGVzdFdvcmtJdGVtKHdvcms0LCAwLCAyKSwgbmV3IFRlc3RXb3JrSXRlbSh3b3JrNSksIG5ldyBUZXN0V29ya0l0ZW0od29yazYpIH07CisgICAgICAgIGtUZXN0RW52aXJvbm1lbnQuc2V0RXhwZWN0ZWRFeGVjdXRpb25zKDEpOworICAgICAgICBrVGVzdEVudmlyb25tZW50LnNldEV4cGVjdGVkV29yayhmaW5hbFdvcmspOworICAgICAgICBtSm9iU2NoZWR1bGVyLmVucXVldWUoamksIG5ldyBKb2JXb3JrSXRlbSh3b3JrNSkpOworICAgICAgICBtSm9iU2NoZWR1bGVyLmVucXVldWUoamksIG5ldyBKb2JXb3JrSXRlbSh3b3JrNikpOworICAgICAgICBrVGVzdEVudmlyb25tZW50LnJlYWR5VG9Xb3JrKCk7CisgICAgICAgIFN5c3RlbVV0aWwucnVuU2hlbGxDb21tYW5kKGdldEluc3RydW1lbnRhdGlvbigpLCAiY21kIGpvYnNjaGVkdWxlciBydW4gIgorICAgICAgICAgICAgICAgICsgIiAtLXVzZXIgIiArIGdldEN1cnJlbnRVc2VyKCkgKyAiICIKKyAgICAgICAgICAgICAgICArIGtKb2JTZXJ2aWNlQ29tcG9uZW50LmdldFBhY2thZ2VOYW1lKCkgKyAiICIgKyBFTlFVRVVFX1dPUktfSk9CX0lEKTsKKworICAgICAgICBhc3NlcnRUcnVlKCJSZXN0YXJ0ZWQgd2l0aCB3b3JrIGVucXVldWVkIGRpZCBub3QgZXhlY3V0ZS4iLAorICAgICAgICAgICAgICAgIGtUZXN0RW52aXJvbm1lbnQuYXdhaXRFeGVjdXRpb24oKSk7CisgICAgICAgIGNvbXBhcmVXb3JrKGZpbmFsV29yaywga1Rlc3RFbnZpcm9ubWVudC5nZXRMYXN0UmVjZWl2ZWRXb3JrKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgYmFzaWMgZW5xdWV1ZWluZyBiYXRjaGVzIG9mIHdvcmsuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEVucXVldWVNdWx0aXBsZVVyaUdyYW50V29yaygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBTdGFydCBvdXQgd2l0aCBzdG9yYWdlIGxvdywgc28gam9iIGlzIGVucXVldWVkIGJ1dCBub3QgZXhlY3V0ZWQgeWV0LgorICAgICAgICBzZXRTdG9yYWdlU3RhdGUodHJ1ZSk7CisKKyAgICAgICAgLy8gV2UgbmVlZCB0byBnZXQgYSBwZXJtaXNzaW9uIGdyYW50IHNvIHRoYXQgd2UgY2FuIGdyYW50IGl0IHRvIG91cnNlbGYuCisgICAgICAgIG1Qcm92aWRlci5jYWxsKCJncmFudCIsIE1ZX1BBQ0tBR0UsIG1GaXJzdFVyaUJ1bmRsZSk7CisgICAgICAgIG1Qcm92aWRlci5jYWxsKCJncmFudCIsIE1ZX1BBQ0tBR0UsIG1TZWNvbmRVcmlCdW5kbGUpOworICAgICAgICBhc3NlcnRIYXNVcmlQZXJtaXNzaW9uKG1GaXJzdFVyaSwgSW50ZW50LkZMQUdfR1JBTlRfUkVBRF9VUklfUEVSTUlTU0lPTgorICAgICAgICAgICAgICAgIHwgSW50ZW50LkZMQUdfR1JBTlRfV1JJVEVfVVJJX1BFUk1JU1NJT04pOworICAgICAgICBhc3NlcnRIYXNVcmlQZXJtaXNzaW9uKG1TZWNvbmRVcmksIEludGVudC5GTEFHX0dSQU5UX1JFQURfVVJJX1BFUk1JU1NJT04KKyAgICAgICAgICAgICAgICB8IEludGVudC5GTEFHX0dSQU5UX1dSSVRFX1VSSV9QRVJNSVNTSU9OKTsKKworICAgICAgICBJbnRlbnQgd29yazEgPSBuZXcgSW50ZW50KCJ3b3JrMSIpOworICAgICAgICB3b3JrMS5zZXRGbGFncyhJbnRlbnQuRkxBR19HUkFOVF9SRUFEX1VSSV9QRVJNSVNTSU9OCisgICAgICAgICAgICAgICAgfCBJbnRlbnQuRkxBR19HUkFOVF9XUklURV9VUklfUEVSTUlTU0lPTik7CisgICAgICAgIHdvcmsxLnNldERhdGEobUZpcnN0VXJpKTsKKyAgICAgICAgd29yazEuc2V0Q2xpcERhdGEobVNlY29uZENsaXBEYXRhKTsKKworICAgICAgICBJbnRlbnQgd29yazIgPSBuZXcgSW50ZW50KCJ3b3JrMiIpOworICAgICAgICB3b3JrMi5zZXRGbGFncyhJbnRlbnQuRkxBR19HUkFOVF9SRUFEX1VSSV9QRVJNSVNTSU9OCisgICAgICAgICAgICAgICAgfCBJbnRlbnQuRkxBR19HUkFOVF9XUklURV9VUklfUEVSTUlTU0lPTik7CisgICAgICAgIHdvcmsyLnNldERhdGEobUZpcnN0VXJpKTsKKworICAgICAgICBUZXN0V29ya0l0ZW1bXSB3b3JrID0gbmV3IFRlc3RXb3JrSXRlbVtdIHsKKyAgICAgICAgICAgICAgICBuZXcgVGVzdFdvcmtJdGVtKHdvcmsxLCBuZXcgVXJpW10geyBtRmlyc3RVcmksIG1TZWNvbmRVcml9LCBuZXcgVXJpWzBdKSwKKyAgICAgICAgICAgICAgICBuZXcgVGVzdFdvcmtJdGVtKHdvcmsyLCBuZXcgVXJpW10geyBtRmlyc3RVcmkgfSwgbmV3IFVyaVtdIHsgbVNlY29uZFVyaX0pIH07CisgICAgICAgIGtUZXN0RW52aXJvbm1lbnQuc2V0RXhwZWN0ZWRFeGVjdXRpb25zKDEpOworICAgICAgICBrVGVzdEVudmlyb25tZW50LnNldEV4cGVjdGVkV29yayh3b3JrKTsKKyAgICAgICAgSm9iSW5mbyBqaSA9IG1CdWlsZGVyLnNldE92ZXJyaWRlRGVhZGxpbmUoMCkuc2V0UmVxdWlyZXNTdG9yYWdlTm90TG93KHRydWUpLmJ1aWxkKCk7CisgICAgICAgIG1Kb2JTY2hlZHVsZXIuZW5xdWV1ZShqaSwgbmV3IEpvYldvcmtJdGVtKHdvcmsxKSk7CisgICAgICAgIG1Kb2JTY2hlZHVsZXIuZW5xdWV1ZShqaSwgbmV3IEpvYldvcmtJdGVtKHdvcmsyKSk7CisKKyAgICAgICAgLy8gUmVtb3ZlIHRoZSBleHBsaWNpdCBncmFudCwgd2Ugc2hvdWxkIHN0aWxsIGhhdmUgYSBncmFudCBkdWUgdG8gdGhlIGpvYi4KKyAgICAgICAgbVByb3ZpZGVyLmNhbGwoInJldm9rZSIsIE1ZX1BBQ0tBR0UsIG1GaXJzdFVyaUJ1bmRsZSk7CisgICAgICAgIG1Qcm92aWRlci5jYWxsKCJyZXZva2UiLCBNWV9QQUNLQUdFLCBtU2Vjb25kVXJpQnVuZGxlKTsKKyAgICAgICAgYXNzZXJ0SGFzVXJpUGVybWlzc2lvbihtRmlyc3RVcmksIEludGVudC5GTEFHX0dSQU5UX1JFQURfVVJJX1BFUk1JU1NJT04KKyAgICAgICAgICAgICAgICB8IEludGVudC5GTEFHX0dSQU5UX1dSSVRFX1VSSV9QRVJNSVNTSU9OKTsKKyAgICAgICAgYXNzZXJ0SGFzVXJpUGVybWlzc2lvbihtU2Vjb25kVXJpLCBJbnRlbnQuRkxBR19HUkFOVF9SRUFEX1VSSV9QRVJNSVNTSU9OCisgICAgICAgICAgICAgICAgfCBJbnRlbnQuRkxBR19HUkFOVF9XUklURV9VUklfUEVSTUlTU0lPTik7CisKKyAgICAgICAga1Rlc3RFbnZpcm9ubWVudC5yZWFkeVRvV29yaygpOworCisgICAgICAgIC8vIE5vdyBhbGxvdyB0aGUgam9iIHRvIHJ1bi4KKyAgICAgICAgc2V0U3RvcmFnZVN0YXRlKGZhbHNlKTsKKworICAgICAgICBhc3NlcnRUcnVlKCJKb2Igd2l0aCB3b3JrIGVucXVldWVkIGRpZCBub3QgZmlyZS4iLAorICAgICAgICAgICAgICAgIGtUZXN0RW52aXJvbm1lbnQuYXdhaXRFeGVjdXRpb24oKSk7CisgICAgICAgIGNvbXBhcmVXb3JrKHdvcmssIGtUZXN0RW52aXJvbm1lbnQuZ2V0TGFzdFJlY2VpdmVkV29yaygpKTsKKworICAgICAgICAvLyBBbmQgd2FpdCBmb3IgZXZlcnl0aGluZyB0byBiZSBjbGVhbmVkIHVwLgorICAgICAgICB3YWl0UGVybWlzc2lvblJldm9rZShtRmlyc3RVcmksIEludGVudC5GTEFHX0dSQU5UX1dSSVRFX1VSSV9QRVJNSVNTSU9OLCA1MDAwKTsKKyAgICAgICAgd2FpdFBlcm1pc3Npb25SZXZva2UobVNlY29uZFVyaSwgSW50ZW50LkZMQUdfR1JBTlRfV1JJVEVfVVJJX1BFUk1JU1NJT04sIDUwMDApOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGludCBnZXRDdXJyZW50VXNlcigpIHsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQub3MuUHJvY2Vzcy5teVVzZXJIYW5kbGUoKS5nZXRJZGVudGlmaWVyKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvSm9iU2NoZWR1bGVyU2hhcmVkVWlkL3NyYy9hbmRyb2lkL2pvYnNjaGVkdWxlci9jdHMvc2hhcmVkdWlkdGVzdHMvU2hhcmVkVWlkVGVzdC5qYXZhIGIvdGVzdHMvSm9iU2NoZWR1bGVyU2hhcmVkVWlkL3NyYy9hbmRyb2lkL2pvYnNjaGVkdWxlci9jdHMvc2hhcmVkdWlkdGVzdHMvU2hhcmVkVWlkVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZTJhZWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Kb2JTY2hlZHVsZXJTaGFyZWRVaWQvc3JjL2FuZHJvaWQvam9ic2NoZWR1bGVyL2N0cy9zaGFyZWR1aWR0ZXN0cy9TaGFyZWRVaWRUZXN0LmphdmEKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLmpvYnNjaGVkdWxlci5jdHMuc2hhcmVkdWlkdGVzdHM7CisKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uVGFyZ2V0QXBpOworaW1wb3J0IGFuZHJvaWQuYXBwLmpvYi5Kb2JJbmZvOworaW1wb3J0IGFuZHJvaWQuYXBwLmpvYi5Kb2JTY2hlZHVsZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5qb2JzY2hlZHVsZXIuTW9ja0pvYlNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCitAVGFyZ2V0QXBpKDI3KQorcHVibGljIGNsYXNzIFNoYXJlZFVpZFRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU2hhcmVkVWlkVGVzdCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1RIRVJfUEFDS0FHRSA9ICJhbmRyb2lkLmpvYnNjaGVkdWxlci5jdHMuc2hhcmVkdWlkIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEJST0FEQ0FTVF9USU1FT1VUX1NFQ09ORFMgPSAyICogNjA7CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRvIG1ha2Ugc3VyZSBkaXNhYmxpbmcgYSBwYWNrYWdlIHdvdWxkbid0IGNhbmNlbCB0aGUgam9icyBmcm9tIG90aGVyIHBhY2thZ2VzIHRoYXQgdXNlCisgICAgICogdGhlIHNhbWUgc2hhcmVkIFVJRC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FuY2VsRGlzYWJsZWRQYWNrYWdlSm9iKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIGludCBKT0JJRCA9IDExMjIzMzE7CisKKyAgICAgICAgZmluYWwgSm9iU2NoZWR1bGVyIGpzID0gZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoSm9iU2NoZWR1bGVyLmNsYXNzKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgSm9iSW5mbyBqaSA9IG5ldyBKb2JJbmZvLkJ1aWxkZXIoSk9CSUQsCisgICAgICAgICAgICAgICAgICAgIG5ldyBDb21wb25lbnROYW1lKGdldENvbnRleHQoKSwgTW9ja0pvYlNlcnZpY2UuY2xhc3MpKQorICAgICAgICAgICAgICAgICAgICAuc2V0TWluaW11bUxhdGVuY3koMTAwMCAqIDYwICogNjAgKiAyNCAvKiAxIGRheSAqLykKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisKKyAgICAgICAgICAgIGpzLmNhbmNlbChKT0JJRCk7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhKb2JTY2hlZHVsZXIuUkVTVUxUX1NVQ0NFU1MsIGpzLnNjaGVkdWxlKGppKSk7CisKKyAgICAgICAgICAgIC8vIFRoZSBqb2Igc2hvdWxkIGJlIHNjaGVkdWxlZC4KKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIkpvYiBzaG91bGQgYmUgcmVnaXN0ZXJlZCIsIGpzLmdldFBlbmRpbmdKb2IoSk9CSUQpKTsKKworICAgICAgICAgICAgLy8gQ3JlYXRlIGEgZmlsdGVyIHdpdGggdGhlIGxvd2VzZXQgcHJpb3JpdHkgdG8gd2FpdCB1bnRpbCB0aGUgam9ic2NoZWR1ZWxyIHJlY2VpdmVzIHRoZQorICAgICAgICAgICAgLy8gaW50ZW50LgorICAgICAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisKKyAgICAgICAgICAgIGZpbmFsIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7CisgICAgICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fUEFDS0FHRV9DSEFOR0VEKTsKKyAgICAgICAgICAgIGZpbHRlci5hZGREYXRhU2NoZW1lKCJwYWNrYWdlIik7CisgICAgICAgICAgICBmaWx0ZXIuc2V0UHJpb3JpdHkoSW50ZW50RmlsdGVyLlNZU1RFTV9MT1dfUFJJT1JJVFkpOworCisgICAgICAgICAgICBnZXRDb250ZXh0KCkucmVnaXN0ZXJSZWNlaXZlcihuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoT1RIRVJfUEFDS0FHRS5lcXVhbHMoaW50ZW50LmdldERhdGEoKS5nZXRTY2hlbWVTcGVjaWZpY1BhcnQoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwgZmlsdGVyKTsKKworCisgICAgICAgICAgICAvLyBEaXNhYmxlIHRoZSBvdGhlciBwYWNrYWdlIHdpdGggdGhlIHNhbWUgVUlELgorICAgICAgICAgICAgZmluYWwgUGFja2FnZU1hbmFnZXIgcG0gPSBnZXRDb250ZXh0KCkuZ2V0UGFja2FnZU1hbmFnZXIoKTsKKyAgICAgICAgICAgIHBtLnNldEFwcGxpY2F0aW9uRW5hYmxlZFNldHRpbmcoCisgICAgICAgICAgICAgICAgICAgIE9USEVSX1BBQ0tBR0UsCisgICAgICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VyLkNPTVBPTkVOVF9FTkFCTEVEX1NUQVRFX0RJU0FCTEVELAorICAgICAgICAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlci5ET05UX0tJTExfQVBQKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFBhY2thZ2VNYW5hZ2VyLkNPTVBPTkVOVF9FTkFCTEVEX1NUQVRFX0RJU0FCTEVELAorICAgICAgICAgICAgICAgICAgICBwbS5nZXRBcHBsaWNhdGlvbkVuYWJsZWRTZXR0aW5nKE9USEVSX1BBQ0tBR0UpKTsKKworICAgICAgICAgICAgLy8gV2FpdCB1bnRpbCBvdXIgcmVjZWl2ZXIgZ2V0cyB0aGUgYnJvYWRjYXN0LgorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShsYXRjaC5hd2FpdChCUk9BRENBU1RfVElNRU9VVF9TRUNPTkRTLCBUaW1lVW5pdC5TRUNPTkRTKSk7CisKKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgam9iIGhhc24ndCBiZWVuIGNhbmNlbGVkLgorICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiSm9iIHNob3VsZG4ndCBiZSBjYW5jZWxlZCIsIGpzLmdldFBlbmRpbmdKb2IoSk9CSUQpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGpzLmNhbmNlbChKT0JJRCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9Qcm9jZXNzVGVzdC9BbmRyb2lkLm1rIGIvdGVzdHMvUHJvY2Vzc1Rlc3QvQW5kcm9pZC5tawppbmRleCA2M2VlMDQzLi4zMDg0YjYxIDEwMDY0NAotLS0gYS90ZXN0cy9Qcm9jZXNzVGVzdC9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL1Byb2Nlc3NUZXN0L0FuZHJvaWQubWsKQEAgLTI0LDcgKzI0LDkgQEAKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtc3ViZGlyLWphdmEtZmlsZXMpCiAKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBsZWdhY3ktYW5kcm9pZC10ZXN0IGp1bml0IGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBqdW5pdAorCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicwogCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gUHJvY2Vzc1Rlc3RzCiAKQEAgLTMzLDYgKzM1LDYgQEAKIAogTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAogCi1pbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKK2luY2x1ZGUgJChCVUlMRF9DVFNfUEFDS0FHRSkKIAogaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQpkaWZmIC0tZ2l0IGEvdGVzdHMvUHJvY2Vzc1Rlc3QvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL1Byb2Nlc3NUZXN0L0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggYzdjZjYzNS4uZjJkNzIwMiAxMDA2NDQKLS0tIGEvdGVzdHMvUHJvY2Vzc1Rlc3QvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy9Qcm9jZXNzVGVzdC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0xOCw3ICsxOCw3IEBACiAgICAgICAgYW5kcm9pZDpzaGFyZWRVc2VySWQ9ImNvbS5hbmRyb2lkLmN0cy5wcm9jZXNzLnVpZHBpZF90ZXN0Ij4KIAogICAgIDwhLS0gSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciBmb3IgQW5kcm9pZFRlc3RzIC0tPgotICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5hbmRyb2lkLmN0cy5wcm9jZXNzIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iVGVzdCBwcm9jZXNzIi8+CiAgICAgPGFwcGxpY2F0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvUHJvY2Vzc1Rlc3QvTm9TaGFyZVVpZEFwcC9BbmRyb2lkLm1rIGIvdGVzdHMvUHJvY2Vzc1Rlc3QvTm9TaGFyZVVpZEFwcC9BbmRyb2lkLm1rCmluZGV4IGM1N2Q3MWQuLjc2NDViNWMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL1Byb2Nlc3NUZXN0L05vU2hhcmVVaWRBcHAvQW5kcm9pZC5taworKysgYi90ZXN0cy9Qcm9jZXNzVGVzdC9Ob1NoYXJlVWlkQXBwL0FuZHJvaWQubWsKQEAgLTI0LDggKzI0LDkgQEAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLXN1YmRpci1qYXZhLWZpbGVzKQogCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gTm9TaGFyZVVpZEFwcAorTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAogCiBMT0NBTF9QUk9HVUFSRF9FTkFCTEVEIDo9IGRpc2FibGVkCiBMT0NBTF9ERVhfUFJFT1BUIDo9IGZhbHNlCiAKLWluY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQoraW5jbHVkZSAkKEJVSUxEX0NUU19QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvdGVzdHMvUHJvY2Vzc1Rlc3QvU2hhcmVVaWRBcHAvQW5kcm9pZC5tayBiL3Rlc3RzL1Byb2Nlc3NUZXN0L1NoYXJlVWlkQXBwL0FuZHJvaWQubWsKaW5kZXggMTMxZjc2OC4uZmRkM2ZlYiAxMDA2NDQKLS0tIGEvdGVzdHMvUHJvY2Vzc1Rlc3QvU2hhcmVVaWRBcHAvQW5kcm9pZC5taworKysgYi90ZXN0cy9Qcm9jZXNzVGVzdC9TaGFyZVVpZEFwcC9BbmRyb2lkLm1rCkBAIC0yNCw4ICsyNCw5IEBACiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1zdWJkaXItamF2YS1maWxlcykKIAogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IFNoYXJlVWlkQXBwCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CiAKIExPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKIExPQ0FMX0RFWF9QUkVPUFQgOj0gZmFsc2UKIAotaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCitpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS90ZXN0cy9hY2NlbGVyYXRpb24vQW5kcm9pZC5tayBiL3Rlc3RzL2FjY2VsZXJhdGlvbi9BbmRyb2lkLm1rCmluZGV4IDgxODY5YmYuLjc4OWE4ZjQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2FjY2VsZXJhdGlvbi9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL2FjY2VsZXJhdGlvbi9BbmRyb2lkLm1rCkBAIC0yNSw3ICsyNSw5IEBACiBMT0NBTF9QUk9HVUFSRF9FTkFCTEVEIDo9IGRpc2FibGVkCiAKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCi0gICAgY3RzdGVzdHJ1bm5lciBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsIGxlZ2FjeS1hbmRyb2lkLXRlc3QKKyAgICBjdHN0ZXN0cnVubmVyLWF4dCBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dAorCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzIGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIApkaWZmIC0tZ2l0IGEvdGVzdHMvYWNjZWxlcmF0aW9uL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9hY2NlbGVyYXRpb24vQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCAxYTIxNTU0Li4xYWE0ZTY0IDEwMDY0NAotLS0gYS90ZXN0cy9hY2NlbGVyYXRpb24vQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy9hY2NlbGVyYXRpb24vQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjgsNyArMjgsNyBAQAogICAgICAgICAgICAgICAgIGFuZHJvaWQ6aGFyZHdhcmVBY2NlbGVyYXRlZD0iZmFsc2UiIC8+CiAgICAgPC9hcHBsaWNhdGlvbj4KIAotICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuYWNjZWxlcmF0aW9uLmN0cyIKICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IlRlc3RzIGZvciB0aGUgSGFyZHdhcmUgQWNjZWxlcmF0aW9uIEFQSXMuIiA+CiAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJsaXN0ZW5lciIKZGlmZiAtLWdpdCBhL3Rlc3RzL2FjY2VsZXJhdGlvbi9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy9hY2NlbGVyYXRpb24vQW5kcm9pZFRlc3QueG1sCmluZGV4IDAxZmY0Y2MuLmIyOGY4NDUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2FjY2VsZXJhdGlvbi9BbmRyb2lkVGVzdC54bWwKKysrIGIvdGVzdHMvYWNjZWxlcmF0aW9uL0FuZHJvaWRUZXN0LnhtbApAQCAtMTQsNiArMTQsNyBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIEFjY2VsZXJhdGlvbiB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0ibG9jYXRpb24iIC8+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CiAgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KZGlmZiAtLWdpdCBhL3Rlc3RzL2FjY2VsZXJhdGlvbi9zcmMvYW5kcm9pZC9hY2NlbGVyYXRpb24vY3RzL0hhcmR3YXJlQWNjZWxlcmF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvYWNjZWxlcmF0aW9uL3NyYy9hbmRyb2lkL2FjY2VsZXJhdGlvbi9jdHMvSGFyZHdhcmVBY2NlbGVyYXRpb25UZXN0LmphdmEKaW5kZXggMTI2NjQxNS4uZGIxMmRiNSAxMDA2NDQKLS0tIGEvdGVzdHMvYWNjZWxlcmF0aW9uL3NyYy9hbmRyb2lkL2FjY2VsZXJhdGlvbi9jdHMvSGFyZHdhcmVBY2NlbGVyYXRpb25UZXN0LmphdmEKKysrIGIvdGVzdHMvYWNjZWxlcmF0aW9uL3NyYy9hbmRyb2lkL2FjY2VsZXJhdGlvbi9jdHMvSGFyZHdhcmVBY2NlbGVyYXRpb25UZXN0LmphdmEKQEAgLTE4LDEzICsxOCwxMSBAQAogCiBpbXBvcnQgYW5kcm9pZC5hY2NlbGVyYXRpb24uSGFyZHdhcmVBY2NlbGVyYXRlZEFjdGl2aXR5OwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DZGRUZXN0OwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuVmVuZG9ySW50ZXJmYWNlVGVzdDsKIAogLyoqCiAgKiBUZXN0IHRoYXQgdXNlcyBhbiBBY3Rpdml0eSB3aXRoIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBlbmFibGVkLgogICovCi1AQ2RkVGVzdChyZXF1aXJlbWVudD0iNy4xLjQuNC9DLTAtMSxDLTAtMiIpCiBwdWJsaWMgY2xhc3MgSGFyZHdhcmVBY2NlbGVyYXRpb25UZXN0CiAgICAgICAgIGV4dGVuZHMgQmFzZUFjY2VsZXJhdGlvblRlc3Q8SGFyZHdhcmVBY2NlbGVyYXRlZEFjdGl2aXR5PiB7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL2FjY2VsZXJhdGlvbi9zcmMvYW5kcm9pZC9hY2NlbGVyYXRpb24vY3RzL1dpbmRvd0ZsYWdIYXJkd2FyZUFjY2VsZXJhdGlvblRlc3QuamF2YSBiL3Rlc3RzL2FjY2VsZXJhdGlvbi9zcmMvYW5kcm9pZC9hY2NlbGVyYXRpb24vY3RzL1dpbmRvd0ZsYWdIYXJkd2FyZUFjY2VsZXJhdGlvblRlc3QuamF2YQppbmRleCA0MmNkYTMwLi4yMDcwNjY2IDEwMDY0NAotLS0gYS90ZXN0cy9hY2NlbGVyYXRpb24vc3JjL2FuZHJvaWQvYWNjZWxlcmF0aW9uL2N0cy9XaW5kb3dGbGFnSGFyZHdhcmVBY2NlbGVyYXRpb25UZXN0LmphdmEKKysrIGIvdGVzdHMvYWNjZWxlcmF0aW9uL3NyYy9hbmRyb2lkL2FjY2VsZXJhdGlvbi9jdHMvV2luZG93RmxhZ0hhcmR3YXJlQWNjZWxlcmF0aW9uVGVzdC5qYXZhCkBAIC0xOCwxMiArMTgsOSBAQAogCiBpbXBvcnQgYW5kcm9pZC5hY2NlbGVyYXRpb24uV2luZG93RmxhZ0hhcmR3YXJlQWNjZWxlcmF0ZWRBY3Rpdml0eTsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ2RkVGVzdDsKLQogLyoqCiAgKiBUZXN0IHRoYXQgdXNlcyBhbiBBY3Rpdml0eSB3aXRoIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBlbmFibGVkLgogICovCi1AQ2RkVGVzdChyZXF1aXJlbWVudD0iNy4xLjQuNC9DLTAtMS9DLTAtMiIpCiBwdWJsaWMgY2xhc3MgV2luZG93RmxhZ0hhcmR3YXJlQWNjZWxlcmF0aW9uVGVzdAogICAgICAgICBleHRlbmRzIEJhc2VBY2NlbGVyYXRpb25UZXN0PFdpbmRvd0ZsYWdIYXJkd2FyZUFjY2VsZXJhdGVkQWN0aXZpdHk+IHsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvYWNjZXNzaWJpbGl0eS9BbmRyb2lkLm1rIGIvdGVzdHMvYWNjZXNzaWJpbGl0eS9BbmRyb2lkLm1rCmluZGV4IDRjZDdlOTIuLmMxODA2YzYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2FjY2Vzc2liaWxpdHkvQW5kcm9pZC5taworKysgYi90ZXN0cy9hY2Nlc3NpYmlsaXR5L0FuZHJvaWQubWsKQEAgLTI0LDEwICsyNCwxMiBAQAogCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzQWNjZXNzaWJpbGl0eVRlc3RDYXNlcwogCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbCBjdHN0ZXN0cnVubmVyCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgY3RzdGVzdHJ1bm5lci1heHQgaGFtY3Jlc3QtbGlicmFyeSAKKworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LmJhc2Uuc3R1YnMKIAogIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzIGN0c19pbnN0YW50CiAKIExPQ0FMX1NES19WRVJTSU9OIDo9IHRlc3RfY3VycmVudAogCmRpZmYgLS1naXQgYS90ZXN0cy9hY2Nlc3NpYmlsaXR5L0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9hY2Nlc3NpYmlsaXR5L0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggOWE5ZjcyNy4uNDRhYTg0YyAxMDA2NDQKLS0tIGEvdGVzdHMvYWNjZXNzaWJpbGl0eS9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL2FjY2Vzc2liaWxpdHkvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMTcsNyArMTcsOCBAQAogIC0tPgogCiA8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICAgIHBhY2thZ2U9ImFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LmN0cyI+CisgICAgICAgICAgcGFja2FnZT0iYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuY3RzIgorICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0U2FuZGJveFZlcnNpb249IjIiPgogCiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5ESVNBQkxFX0tFWUdVQVJEIiAvPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uV1JJVEVfU0VDVVJFX1NFVFRJTkdTIiAvPgpAQCAtNTUsNyArNTYsNyBAQAogICAgICAgICA8L3NlcnZpY2U+CiAgICAgPC9hcHBsaWNhdGlvbj4KIAotICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LmN0cyIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IlRlc3RzIGZvciB0aGUgYWNjZXNzaWJpbGl0eSBBUElzLiI+CiAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJsaXN0ZW5lciIKZGlmZiAtLWdpdCBhL3Rlc3RzL2FjY2Vzc2liaWxpdHkvQW5kcm9pZFRlc3QueG1sIGIvdGVzdHMvYWNjZXNzaWJpbGl0eS9BbmRyb2lkVGVzdC54bWwKaW5kZXggNWVhOGRmMS4uNmQ1YmFjMiAxMDA2NDQKLS0tIGEvdGVzdHMvYWNjZXNzaWJpbGl0eS9BbmRyb2lkVGVzdC54bWwKKysrIGIvdGVzdHMvYWNjZXNzaWJpbGl0eS9BbmRyb2lkVGVzdC54bWwKQEAgLTE2LDEyICsxNiwxNiBAQAogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIEFjY2Vzc2liaWxpdHkgdGVzdCBjYXNlcyI+CiAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImZyYW1ld29yayIgLz4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlJ1bkNvbW1hbmRUYXJnZXRQcmVwYXJlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVuLWNvbW1hbmQiIHZhbHVlPSJjbWQgYWNjZXNzaWJpbGl0eSBzZXQtYmluZC1pbnN0YW50LXNlcnZpY2UtYWxsb3dlZCB0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlYXJkb3duLWNvbW1hbmQiIHZhbHVlPSJjbWQgYWNjZXNzaWJpbGl0eSBzZXQtYmluZC1pbnN0YW50LXNlcnZpY2UtYWxsb3dlZCBmYWxzZSIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgogICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzQWNjZXNzaWJpbGl0eVRlc3RDYXNlcy5hcGsiIC8+CiAgICAgPC90YXJnZXRfcHJlcGFyZXI+CiAgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkFuZHJvaWRKVW5pdFRlc3QiID4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJwYWNrYWdlIiB2YWx1ZT0iYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuY3RzIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjhtIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjhtIi8+CiAgICAgPC90ZXN0PgogPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvYWNjZXNzaWJpbGl0eS9zcmMvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvY3RzL0FjY2Vzc2liaWxpdHlFdmVudFRlc3QuamF2YSBiL3Rlc3RzL2FjY2Vzc2liaWxpdHkvc3JjL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L2N0cy9BY2Nlc3NpYmlsaXR5RXZlbnRUZXN0LmphdmEKaW5kZXggYWE5ZGI0Zi4uNTA5MDkyZiAxMDA2NDQKLS0tIGEvdGVzdHMvYWNjZXNzaWJpbGl0eS9zcmMvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvY3RzL0FjY2Vzc2liaWxpdHlFdmVudFRlc3QuamF2YQorKysgYi90ZXN0cy9hY2Nlc3NpYmlsaXR5L3NyYy9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9jdHMvQWNjZXNzaWJpbGl0eUV2ZW50VGVzdC5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlByZXN1Ym1pdDsKIGltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50OwpAQCAtMjksMjIgKzMwLDggQEAKIC8qKgogICogQ2xhc3MgZm9yIHRlc3Rpbmcge0BsaW5rIEFjY2Vzc2liaWxpdHlFdmVudH0uCiAgKi8KK0BQcmVzdWJtaXQKIHB1YmxpYyBjbGFzcyBBY2Nlc3NpYmlsaXR5RXZlbnRUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgLyoqIFRoZSBudW1iZXIgb2YgcHJvcGVydGllcyBvZiB0aGUge0BsaW5rIEFjY2Vzc2liaWxpdHlFdmVudH0gY2xhc3MuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PTl9TVEFUSUNfRklFTERfQ09VTlQgPSAyOTsKLQotICAgIC8qKgotICAgICAqIFRlc3QgdGhhdCBubyBuZXcgZmllbGRzIGhhdmUgYmVlbiBhZGRlZCB3aXRob3V0IHVwZGF0aW5nIHRoZQotICAgICAqIG1hcnNoYWxpbmcgdGVzdHMuCi0gICAgICovCi0gICAgQFNtYWxsVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3ROb05ld0ZpZWxkc0FkZGVkV2l0aG91dFVwZGFkaW5nTWFyc2hhbGxUZXN0cygpIHsKLSAgICAgICAgLy8gbm8gbmV3IGZpZWxkcywgc28gd2UgYXJlIHRlc3RpbmcgbWFyc2hhbGluZyBvZiBhbGwgc3VjaAotICAgICAgICBBY2Nlc3NpYmlsaXR5UmVjb3JkVGVzdC5hc3NlcnROb05ld05vblN0YXRpY0ZpZWxkc0FkZGVkKEFjY2Vzc2liaWxpdHlFdmVudC5jbGFzcywKLSAgICAgICAgICAgICAgICBOT05fU1RBVElDX0ZJRUxEX0NPVU5UKTsKLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBUZXN0cyB3aGV0aGVyIGFjY2Vzc2liaWxpdHkgZXZlbnRzIGFyZSBjb3JyZWN0bHkgd3JpdHRlbiBhbmQKICAgICAgKiByZWFkIGZyb20gYSBwYXJjZWwgKHZlcnNpb24gMSkuCkBAIC02Myw2ICs1MCw4IEBACiAKICAgICAgICAgLy8gbWFrZSBzdXJlIGFsbCBmaWVsZHMgcHJvcGVybHkgbWFyc2hhbGVkCiAgICAgICAgIGFzc2VydEVxdWFsc0FjY2Vzc2libGl0eUV2ZW50KHNlbnRFdmVudCwgcmVjZWl2ZWRFdmVudCk7CisKKyAgICAgICAgcGFyY2VsLnJlY3ljbGUoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE1Nyw2ICsxNDYsOCBAQAogICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgdW5tYXJzaGFsZWRFdmVudCA9IEFjY2Vzc2liaWxpdHlFdmVudC5vYnRhaW4oKTsKICAgICAgICAgdW5tYXJzaGFsZWRFdmVudC5pbml0RnJvbVBhcmNlbChwYXJjZWwpOwogICAgICAgICBhc3NlcnRFcXVhbHNBY2Nlc3NpYmxpdHlFdmVudChtYXJzaGFsZWRFdmVudCwgdW5tYXJzaGFsZWRFdmVudCk7CisKKyAgICAgICAgcGFyY2VsLnJlY3ljbGUoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIwNiw2ICsxOTcsOCBAQAogICAgICAgICBzZW50RXZlbnQuc2V0TWF4U2Nyb2xsWSgxKTsKICAgICAgICAgc2VudEV2ZW50LnNldFNjcm9sbFgoMSk7CiAgICAgICAgIHNlbnRFdmVudC5zZXRTY3JvbGxZKDEpOworICAgICAgICBzZW50RXZlbnQuc2V0U2Nyb2xsRGVsdGFYKDMpOworICAgICAgICBzZW50RXZlbnQuc2V0U2Nyb2xsRGVsdGFZKDMpOwogICAgICAgICBzZW50RXZlbnQuc2V0VG9JbmRleCgxKTsKICAgICAgICAgc2VudEV2ZW50LnNldFNjcm9sbGFibGUodHJ1ZSk7CiAgICAgICAgIHNlbnRFdmVudC5zZXRBY3Rpb24oQWNjZXNzaWJpbGl0eU5vZGVJbmZvLkFDVElPTl9BQ0NFU1NJQklMSVRZX0ZPQ1VTKTsKQEAgLTI2MSw2ICsyNTQsMTAgQEAKICAgICAgICAgICAgICAgICByZWNlaXZlZEV2ZW50LmdldFNjcm9sbFgoKSk7CiAgICAgICAgIGFzc2VydFNhbWUoInNjcm9sbFkgaGFzIGluY29yZWN0IHZhbHVlIiwgZXhwZWN0ZWRFdmVudC5nZXRTY3JvbGxZKCksCiAgICAgICAgICAgICAgICAgcmVjZWl2ZWRFdmVudC5nZXRTY3JvbGxZKCkpOworICAgICAgICBhc3NlcnRTYW1lKCJzY3JvbGxEZWx0YVggaGFzIGluY29yZWN0IHZhbHVlIiwgZXhwZWN0ZWRFdmVudC5nZXRTY3JvbGxEZWx0YVgoKSwKKyAgICAgICAgICAgICAgICByZWNlaXZlZEV2ZW50LmdldFNjcm9sbERlbHRhWCgpKTsKKyAgICAgICAgYXNzZXJ0U2FtZSgic2Nyb2xsRGVsdGFZIGhhcyBpbmNvcmVjdCB2YWx1ZSIsIGV4cGVjdGVkRXZlbnQuZ2V0U2Nyb2xsRGVsdGFZKCksCisgICAgICAgICAgICAgICAgcmVjZWl2ZWRFdmVudC5nZXRTY3JvbGxEZWx0YVkoKSk7CiAgICAgICAgIGFzc2VydFNhbWUoInRvSW5kZXggaGFzIGluY29yZWN0IHZhbHVlIiwgZXhwZWN0ZWRFdmVudC5nZXRUb0luZGV4KCksCiAgICAgICAgICAgICAgICAgcmVjZWl2ZWRFdmVudC5nZXRUb0luZGV4KCkpOwogICAgICAgICBhc3NlcnRTYW1lKCJzY3JvbGxhYmxlIGhhcyBpbmNvcmVjdCB2YWx1ZSIsIGV4cGVjdGVkRXZlbnQuaXNTY3JvbGxhYmxlKCksCkBAIC0yNjksNiArMjY2LDggQEAKICAgICAgICAgICAgICAgICByZWNlaXZlZEV2ZW50LmdldE1vdmVtZW50R3JhbnVsYXJpdHkoKSk7CiAgICAgICAgIGFzc2VydFNhbWUoImFjdGlvbiBoYXMgaW5jb3JlY3QgdmFsdWUiLCBleHBlY3RlZEV2ZW50LmdldEFjdGlvbigpLAogICAgICAgICAgICAgICAgIHJlY2VpdmVkRXZlbnQuZ2V0QWN0aW9uKCkpOworICAgICAgICBhc3NlcnRTYW1lKCJ3aW5kb3dDaGFuZ2VUeXBlcyBoYXMgaW5jb3JlY3QgdmFsdWUiLCBleHBlY3RlZEV2ZW50LmdldFdpbmRvd0NoYW5nZXMoKSwKKyAgICAgICAgICAgICAgICByZWNlaXZlZEV2ZW50LmdldFdpbmRvd0NoYW5nZXMoKSk7CiAKICAgICAgICAgYXNzZXJ0U2FtZSgicGFyY2VsYWJsZURhdGEgaGFzIGluY29yZWN0IHZhbHVlIiwKICAgICAgICAgICAgICAgICAoKE1lc3NhZ2UpIGV4cGVjdGVkRXZlbnQuZ2V0UGFyY2VsYWJsZURhdGEoKSkud2hhdCwKZGlmZiAtLWdpdCBhL3Rlc3RzL2FjY2Vzc2liaWxpdHkvc3JjL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L2N0cy9BY2Nlc3NpYmlsaXR5TWFuYWdlclRlc3QuamF2YSBiL3Rlc3RzL2FjY2Vzc2liaWxpdHkvc3JjL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L2N0cy9BY2Nlc3NpYmlsaXR5TWFuYWdlclRlc3QuamF2YQppbmRleCA2YTRlZmQ4Li4wY2YyYzE5IDEwMDY0NAotLS0gYS90ZXN0cy9hY2Nlc3NpYmlsaXR5L3NyYy9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9jdHMvQWNjZXNzaWJpbGl0eU1hbmFnZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvYWNjZXNzaWJpbGl0eS9zcmMvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvY3RzL0FjY2Vzc2liaWxpdHlNYW5hZ2VyVGVzdC5qYXZhCkBAIC00Niw4ICs0Niw2IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1VTFRJUExFX0ZFRURCQUNLX1RZUEVTX0FDQ0VTU0lCSUxJVFlfU0VSVklDRV9OQU1FID0KICAgICAgICAgImFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LmN0cy5TcGVha2luZ0FuZFZpYnJhdGluZ0FjY2Vzc2liaWxpdHlTZXJ2aWNlIjsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgV0FJVF9GT1JfQUNDRVNTSUJJTElUWV9FTkFCTEVEX1RJTUVPVVQgPSAzMDAwOyAvLyAzcwotCiAgICAgcHJpdmF0ZSBBY2Nlc3NpYmlsaXR5TWFuYWdlciBtQWNjZXNzaWJpbGl0eU1hbmFnZXI7CiAKICAgICBwcml2YXRlIENvbnRleHQgbVRhcmdldENvbnRleHQ7CkBAIC02MCw2ICs1OCw5IEBACiAgICAgICAgICAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoU2VydmljZS5BQ0NFU1NJQklMSVRZX1NFUlZJQ0UpOwogICAgICAgICBtVGFyZ2V0Q29udGV4dCA9IGdldEluc3RydW1lbnRhdGlvbigpLmdldFRhcmdldENvbnRleHQoKTsKICAgICAgICAgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcihtVGFyZ2V0Q29udGV4dC5nZXRNYWluTG9vcGVyKCkpOworICAgICAgICAvLyBJbiBjYXNlIHRoZSB0ZXN0IHJ1bm5lciBzdGFydGVkIGEgVWlBdXRvbWF0aW9uLCBkZXN0cm95IGl0IHRvIHN0YXJ0IHdpdGggYSBjbGVhbiBzbGF0ZS4KKyAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VWlBdXRvbWF0aW9uKCkuZGVzdHJveSgpOworICAgICAgICBTZXJ2aWNlQ29udHJvbFV0aWxzLnR1cm5BY2Nlc3NpYmlsaXR5T2ZmKGdldEluc3RydW1lbnRhdGlvbigpKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTMzNCw3ICszMzUsOCBAQAogICAgIHByaXZhdGUgdm9pZCBhc3NlcnRBdG9taWNCb29sZWFuQmVjb21lcyhBdG9taWNCb29sZWFuIGF0b21pY0Jvb2xlYW4sCiAgICAgICAgICAgICBib29sZWFuIGV4cGVjdGVkVmFsdWUsIE9iamVjdCB3YWl0T2JqZWN0LCBTdHJpbmcgbWVzc2FnZSkKICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBsb25nIHRpbWVvdXRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyBXQUlUX0ZPUl9BQ0NFU1NJQklMSVRZX0VOQUJMRURfVElNRU9VVDsKKyAgICAgICAgbG9uZyB0aW1lb3V0VGltZSA9CisgICAgICAgICAgICAgICAgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyBTZXJ2aWNlQ29udHJvbFV0aWxzLlRJTUVPVVRfRk9SX1NFUlZJQ0VfRU5BQkxFOwogICAgICAgICBzeW5jaHJvbml6ZWQgKHdhaXRPYmplY3QpIHsKICAgICAgICAgICAgIHdoaWxlICgoYXRvbWljQm9vbGVhbi5nZXQoKSAhPSBleHBlY3RlZFZhbHVlKQogICAgICAgICAgICAgICAgICAgICAmJiAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgPCB0aW1lb3V0VGltZSkpIHsKQEAgLTM1Myw3ICszNTUsOCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9OwogICAgICAgICBtQWNjZXNzaWJpbGl0eU1hbmFnZXIuYWRkQWNjZXNzaWJpbGl0eVN0YXRlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICBsb25nIHRpbWVvdXRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyBXQUlUX0ZPUl9BQ0NFU1NJQklMSVRZX0VOQUJMRURfVElNRU9VVDsKKyAgICAgICAgbG9uZyB0aW1lb3V0VGltZSA9CisgICAgICAgICAgICAgICAgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyBTZXJ2aWNlQ29udHJvbFV0aWxzLlRJTUVPVVRfRk9SX1NFUlZJQ0VfRU5BQkxFOwogICAgICAgICBzeW5jaHJvbml6ZWQgKHdhaXRPYmplY3QpIHsKICAgICAgICAgICAgIHdoaWxlICghbUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmlzRW5hYmxlZCgpCiAgICAgICAgICAgICAgICAgICAgICYmIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSA8IHRpbWVvdXRUaW1lKSkgewpkaWZmIC0tZ2l0IGEvdGVzdHMvYWNjZXNzaWJpbGl0eS9zcmMvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvY3RzL0FjY2Vzc2liaWxpdHlOb2RlSW5mb1Rlc3QuamF2YSBiL3Rlc3RzL2FjY2Vzc2liaWxpdHkvc3JjL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L2N0cy9BY2Nlc3NpYmlsaXR5Tm9kZUluZm9UZXN0LmphdmEKaW5kZXggMWRmYmY5NC4uNzIwYTRlMCAxMDA2NDQKLS0tIGEvdGVzdHMvYWNjZXNzaWJpbGl0eS9zcmMvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvY3RzL0FjY2Vzc2liaWxpdHlOb2RlSW5mb1Rlc3QuamF2YQorKysgYi90ZXN0cy9hY2Nlc3NpYmlsaXR5L3NyYy9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9jdHMvQWNjZXNzaWJpbGl0eU5vZGVJbmZvVGVzdC5qYXZhCkBAIC0xNywxNSArMTcsMjAgQEAKIHBhY2thZ2UgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuY3RzOwogCiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5QcmVzdWJtaXQ7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWQudGV4dC5JbnB1dFR5cGU7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU5vZGVJbmZvOwogaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlOb2RlSW5mby5BY2Nlc3NpYmlsaXR5QWN0aW9uOwotaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LmN0cy5SOworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlOb2RlSW5mby5Db2xsZWN0aW9uSW5mbzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5Tm9kZUluZm8uQ29sbGVjdGlvbkl0ZW1JbmZvOworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlOb2RlSW5mby5SYW5nZUluZm87CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CkBAIC0zNCwzNSArMzksMjUgQEAKIC8qKgogICogQ2xhc3MgZm9yIHRlc3Rpbmcge0BsaW5rIEFjY2Vzc2liaWxpdHlOb2RlSW5mb30uCiAgKi8KK0BQcmVzdWJtaXQKIHB1YmxpYyBjbGFzcyBBY2Nlc3NpYmlsaXR5Tm9kZUluZm9UZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKIAotICAgIC8qKiBUaGUgbnVtYmVyIG9mIHByb3BlcnRpZXMgb2YgdGhlIHtAbGluayBBY2Nlc3NpYmlsaXR5Tm9kZUluZm99IGNsYXNzIHRoYXQgYXJlIG1hcnNoYWxsZWQuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5VTV9NQVJTSEFMTEVEX1BST1BFUlRJRVMgPSAzMzsKLQotICAgIC8qKgotICAgICAqIFRoZSBudW1iZXIgb2YgcHJvcGVydGllcyB0aGF0IGFyZSBwdXJwb3NlbHkgbm90IG1hcnNoYWxsZWQKLSAgICAgKiBtT3JpZ2luYWxUZXh0IC0gVXNlZCB3aGVuIHJlc29sdmluZyBjbGlja2FibGUgc3BhbnM7IGludGVudGlvbmFsbHkgbm90IHBhcmNlbGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5VTV9OT05NQVJTSEFMTEVEX1BST1BFUlRJRVMgPSAxOwotCiAgICAgQFNtYWxsVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RNYXJzaGFsaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIG5vIG5ldyBmaWVsZHMsIHNvIHdlIGFyZSB0ZXN0aW5nIG1hcnNoYWxpbmcgb2YgYWxsIHN1Y2gKLSAgICAgICAgQWNjZXNzaWJpbGl0eVJlY29yZFRlc3QuYXNzZXJ0Tm9OZXdOb25TdGF0aWNGaWVsZHNBZGRlZChBY2Nlc3NpYmlsaXR5Tm9kZUluZm8uY2xhc3MsCi0gICAgICAgICAgICAgICAgTlVNX01BUlNIQUxMRURfUFJPUEVSVElFUyArIE5VTV9OT05NQVJTSEFMTEVEX1BST1BFUlRJRVMpOwotCiAgICAgICAgIC8vIGZ1bGx5IHBvcHVsYXRlIHRoZSBub2RlIGluZm8gdG8gbWFyc2hhbAogICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gc2VudEluZm8gPSBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8ub2J0YWluKG5ldyBWaWV3KGdldENvbnRleHQoKSkpOwogICAgICAgICBmdWxseVBvcHVsYXRlQWNjZXNzaWJpbGl0eU5vZGVJbmZvKHNlbnRJbmZvKTsKIAogICAgICAgICAvLyBtYXJzaGFsIGFuZCB1bm1hcnNoYWwgdGhlIG5vZGUgaW5mbwogICAgICAgICBQYXJjZWwgcGFyY2VsID0gUGFyY2VsLm9idGFpbigpOwotICAgICAgICBzZW50SW5mby53cml0ZVRvUGFyY2VsKHBhcmNlbCwgMCk7CisgICAgICAgIHNlbnRJbmZvLndyaXRlVG9QYXJjZWxOb1JlY3ljbGUocGFyY2VsLCAwKTsKICAgICAgICAgcGFyY2VsLnNldERhdGFQb3NpdGlvbigwKTsKICAgICAgICAgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIHJlY2VpdmVkSW5mbyA9IEFjY2Vzc2liaWxpdHlOb2RlSW5mby5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwocGFyY2VsKTsKIAogICAgICAgICAvLyBtYWtlIHN1cmUgYWxsIGZpZWxkcyBwcm9wZXJseSBtYXJzaGFsZWQKICAgICAgICAgYXNzZXJ0RXF1YWxzQWNjZXNzaWJpbGl0eU5vZGVJbmZvKHNlbnRJbmZvLCByZWNlaXZlZEluZm8pOworCisgICAgICAgIHBhcmNlbC5yZWN5Y2xlKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xOTIsNTYgKzE4NywxMTEgQEAKICAgICAgICAgYXNzZXJ0VHJ1ZShUZXh0VXRpbHMuZXF1YWxzKG9yaWdpbmFsVGV4dCwgaW5mby5nZXRDb250ZW50RGVzY3JpcHRpb24oKSkpOwogICAgIH0KIAorICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNIZWFkaW5nVGFrZXNPbGRBcGlJbnRvQWNjb3VudCgpIHsKKyAgICAgICAgZmluYWwgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIGluZm8gPSBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8ub2J0YWluKCk7CisgICAgICAgIGFzc2VydEZhbHNlKGluZm8uaXNIZWFkaW5nKCkpOworICAgICAgICBmaW5hbCBDb2xsZWN0aW9uSXRlbUluZm8gaGVhZGluZ0l0ZW1JbmZvID0gQ29sbGVjdGlvbkl0ZW1JbmZvLm9idGFpbigwLCAxLCAwLCAxLCB0cnVlKTsKKyAgICAgICAgaW5mby5zZXRDb2xsZWN0aW9uSXRlbUluZm8oaGVhZGluZ0l0ZW1JbmZvKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShpbmZvLmlzSGVhZGluZygpKTsKKyAgICAgICAgZmluYWwgQ29sbGVjdGlvbkl0ZW1JbmZvIG5vbkhlYWRpbmdJdGVtSW5mbyA9IENvbGxlY3Rpb25JdGVtSW5mby5vYnRhaW4oMCwgMSwgMCwgMSwgZmFsc2UpOworICAgICAgICBpbmZvLnNldENvbGxlY3Rpb25JdGVtSW5mbyhub25IZWFkaW5nSXRlbUluZm8pOworICAgICAgICBhc3NlcnRGYWxzZShpbmZvLmlzSGVhZGluZygpKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBGdWxseSBwb3B1bGF0ZXMgdGhlIHtAbGluayBBY2Nlc3NpYmlsaXR5Tm9kZUluZm99IHRvIG1hcnNoYWwuCiAgICAgICoKICAgICAgKiBAcGFyYW0gaW5mbyBUaGUgbm9kZSBpbmZvIHRvIHBvcHVsYXRlLgogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBmdWxseVBvcHVsYXRlQWNjZXNzaWJpbGl0eU5vZGVJbmZvKEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBpbmZvKSB7Ci0gICAgICAgIGluZm8uc2V0UGFyZW50KG5ldyBWaWV3KGdldENvbnRleHQoKSkpOwotICAgICAgICBpbmZvLnNldFNvdXJjZShuZXcgVmlldyhnZXRDb250ZXh0KCkpKTsKLSAgICAgICAgaW5mby5hZGRDaGlsZChuZXcgVmlldyhnZXRDb250ZXh0KCkpKTsKLSAgICAgICAgaW5mby5hZGRDaGlsZChuZXcgVmlldyhnZXRDb250ZXh0KCkpLCAxKTsKKyAgICAgICAgLy8gUG9wdWxhdGUgMTAgZmllbGRzCiAgICAgICAgIGluZm8uc2V0Qm91bmRzSW5QYXJlbnQobmV3IFJlY3QoMSwxLDEsMSkpOwogICAgICAgICBpbmZvLnNldEJvdW5kc0luU2NyZWVuKG5ldyBSZWN0KDIsMiwyLDIpKTsKICAgICAgICAgaW5mby5zZXRDbGFzc05hbWUoImZvby5iYXIuYmF6LkNsYXNzIik7CiAgICAgICAgIGluZm8uc2V0Q29udGVudERlc2NyaXB0aW9uKCJjb250ZW50IGRlc2NyaXB0aW9uIik7CisgICAgICAgIGluZm8uc2V0VG9vbHRpcFRleHQoInRvb2x0aXAiKTsKICAgICAgICAgaW5mby5zZXRQYWNrYWdlTmFtZSgiZm9vLmJhci5iYXoiKTsKICAgICAgICAgaW5mby5zZXRUZXh0KCJ0ZXh0Iik7CiAgICAgICAgIGluZm8uc2V0SGludFRleHQoImhpbnQiKTsKLSAgICAgICAgaW5mby5zZXRDaGVja2FibGUodHJ1ZSk7Ci0gICAgICAgIGluZm8uc2V0Q2hlY2tlZCh0cnVlKTsKLSAgICAgICAgaW5mby5zZXRDbGlja2FibGUodHJ1ZSk7Ci0gICAgICAgIGluZm8uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgaW5mby5zZXRGb2N1c2FibGUodHJ1ZSk7Ci0gICAgICAgIGluZm8uc2V0Rm9jdXNlZCh0cnVlKTsKLSAgICAgICAgaW5mby5zZXRJbXBvcnRhbnRGb3JBY2Nlc3NpYmlsaXR5KHRydWUpOwotICAgICAgICBpbmZvLnNldExvbmdDbGlja2FibGUodHJ1ZSk7Ci0gICAgICAgIGluZm8uc2V0Q29udGV4dENsaWNrYWJsZSh0cnVlKTsKLSAgICAgICAgaW5mby5zZXRQYXNzd29yZCh0cnVlKTsKLSAgICAgICAgaW5mby5zZXRTY3JvbGxhYmxlKHRydWUpOwotICAgICAgICBpbmZvLnNldFNlbGVjdGVkKHRydWUpOworICAgICAgICAvLyAyIGNoaWxkcmVuID0gMSBmaWVsZAorICAgICAgICBpbmZvLmFkZENoaWxkKG5ldyBWaWV3KGdldENvbnRleHQoKSkpOworICAgICAgICBpbmZvLmFkZENoaWxkKG5ldyBWaWV3KGdldENvbnRleHQoKSksIDEpOworICAgICAgICAvLyAyIGJ1aWx0LWluIGFjdGlvbnMgYW5kIDIgY3VzdG9tIGFjdGlvbnMsIGJ1dCBhbGwgYXJlIGluIDEgZmllbGQKICAgICAgICAgaW5mby5hZGRBY3Rpb24oQWNjZXNzaWJpbGl0eU5vZGVJbmZvLkFDVElPTl9GT0NVUyk7CiAgICAgICAgIGluZm8uYWRkQWN0aW9uKEFjY2Vzc2liaWxpdHlOb2RlSW5mby5BQ1RJT05fQ0xFQVJfRk9DVVMpOwogICAgICAgICBpbmZvLmFkZEFjdGlvbihuZXcgQWNjZXNzaWJpbGl0eUFjdGlvbihBY2Nlc3NpYmlsaXR5Tm9kZUluZm8uQUNUSU9OX0ZPQ1VTLCAiRm9vIikpOwogICAgICAgICBpbmZvLmFkZEFjdGlvbihuZXcgQWNjZXNzaWJpbGl0eUFjdGlvbihSLmlkLmZvb19jdXN0b21fYWN0aW9uLCAiRm9vIikpOwotICAgICAgICBpbmZvLnNldEFjY2Vzc2liaWxpdHlGb2N1c2VkKHRydWUpOworCisgICAgICAgIC8vIFBvcHVsYXRlIDEwIGZpZWxkcwogICAgICAgICBpbmZvLnNldE1vdmVtZW50R3JhbnVsYXJpdGllcyhBY2Nlc3NpYmlsaXR5Tm9kZUluZm8uTU9WRU1FTlRfR1JBTlVMQVJJVFlfTElORSk7Ci0gICAgICAgIGluZm8uc2V0TGFiZWxlZEJ5KG5ldyBWaWV3KGdldENvbnRleHQoKSkpOwotICAgICAgICBpbmZvLnNldExhYmVsRm9yKG5ldyBWaWV3KGdldENvbnRleHQoKSkpOwogICAgICAgICBpbmZvLnNldFZpZXdJZFJlc291cmNlTmFtZSgiZm9vLmJhcjppZC9iYXoiKTsKICAgICAgICAgaW5mby5zZXREcmF3aW5nT3JkZXIoNSk7CiAgICAgICAgIGluZm8uc2V0QXZhaWxhYmxlRXh0cmFEYXRhKAogICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoQWNjZXNzaWJpbGl0eU5vZGVJbmZvLkVYVFJBX0RBVEFfVEVYVF9DSEFSQUNURVJfTE9DQVRJT05fS0VZKSk7CisgICAgICAgIGluZm8uc2V0UGFuZVRpdGxlKCJQYW5lIHRpdGxlIik7CisgICAgICAgIGluZm8uc2V0RXJyb3IoIkVycm9yIHRleHQiKTsKKyAgICAgICAgaW5mby5zZXRNYXhUZXh0TGVuZ3RoKDQyKTsKKyAgICAgICAgLy8gVGV4dCBzZWxlY3Rpb24gaXMgMiBmaWVsZHMKKyAgICAgICAgaW5mby5zZXRUZXh0U2VsZWN0aW9uKDMsIDcpOworICAgICAgICBpbmZvLnNldExpdmVSZWdpb24oVmlldy5BQ0NFU1NJQklMSVRZX0xJVkVfUkVHSU9OX1BPTElURSk7CisKKyAgICAgICAgLy8gUG9wdWxhdGUgMTAgZmllbGRzCisgICAgICAgIEJ1bmRsZSBleHRyYXMgPSBpbmZvLmdldEV4dHJhcygpOworICAgICAgICBleHRyYXMucHV0Qm9vbGVhbigiYXJlQ2Fzc293YXJpZXNBd2Vzb21lIiwgdHJ1ZSk7CisgICAgICAgIGluZm8uc2V0SW5wdXRUeXBlKElucHV0VHlwZS5UWVBFX0NMQVNTX1RFWFQpOworICAgICAgICBpbmZvLnNldFJhbmdlSW5mbyhSYW5nZUluZm8ub2J0YWluKFJhbmdlSW5mby5SQU5HRV9UWVBFX0ZMT0FULCAwLjA1ZiwgMS4wZiwgMC4wMWYpKTsKKyAgICAgICAgaW5mby5zZXRDb2xsZWN0aW9uSW5mbygKKyAgICAgICAgICAgICAgICBDb2xsZWN0aW9uSW5mby5vYnRhaW4oMiwgMiwgdHJ1ZSwgQ29sbGVjdGlvbkluZm8uU0VMRUNUSU9OX01PREVfTVVMVElQTEUpKTsKKyAgICAgICAgaW5mby5zZXRDb2xsZWN0aW9uSXRlbUluZm8oQ29sbGVjdGlvbkl0ZW1JbmZvLm9idGFpbigxLCAyLCAzLCA0LCB0cnVlLCB0cnVlKSk7CisgICAgICAgIGluZm8uc2V0UGFyZW50KG5ldyBWaWV3KGdldENvbnRleHQoKSkpOworICAgICAgICBpbmZvLnNldFNvdXJjZShuZXcgVmlldyhnZXRDb250ZXh0KCkpKTsgLy8gUG9wdWxhdGVzIDIgZmllbGRzOiBzb3VyY2UgYW5kIHdpbmRvdyBpZAorICAgICAgICBpbmZvLnNldFRyYXZlcnNhbEJlZm9yZShuZXcgVmlldyhnZXRDb250ZXh0KCkpKTsKKyAgICAgICAgaW5mby5zZXRUcmF2ZXJzYWxBZnRlcihuZXcgVmlldyhnZXRDb250ZXh0KCkpKTsKKworICAgICAgICAvLyBQb3B1bGF0ZSAyIGZpZWxkcworICAgICAgICBpbmZvLnNldExhYmVsZWRCeShuZXcgVmlldyhnZXRDb250ZXh0KCkpKTsKKyAgICAgICAgaW5mby5zZXRMYWJlbEZvcihuZXcgVmlldyhnZXRDb250ZXh0KCkpKTsKKworICAgICAgICAvLyBBbmQgQm9vbGVhbiBwcm9wZXJ0aWVzIGFyZSBhbm90aGVyIGZpZWxkLiBUb3RhbCBpcyAzMworCisgICAgICAgIC8vIDEwIEJvb2xlYW4gcHJvcGVydGllcworICAgICAgICBpbmZvLnNldENoZWNrYWJsZSh0cnVlKTsKKyAgICAgICAgaW5mby5zZXRDaGVja2VkKHRydWUpOworICAgICAgICBpbmZvLnNldEZvY3VzYWJsZSh0cnVlKTsKKyAgICAgICAgaW5mby5zZXRGb2N1c2VkKHRydWUpOworICAgICAgICBpbmZvLnNldFNlbGVjdGVkKHRydWUpOworICAgICAgICBpbmZvLnNldENsaWNrYWJsZSh0cnVlKTsKKyAgICAgICAgaW5mby5zZXRMb25nQ2xpY2thYmxlKHRydWUpOworICAgICAgICBpbmZvLnNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgIGluZm8uc2V0UGFzc3dvcmQodHJ1ZSk7CisgICAgICAgIGluZm8uc2V0U2Nyb2xsYWJsZSh0cnVlKTsKKworICAgICAgICAvLyAxMCBCb29sZWFuIHByb3BlcnRpZXMKKyAgICAgICAgaW5mby5zZXRBY2Nlc3NpYmlsaXR5Rm9jdXNlZCh0cnVlKTsKKyAgICAgICAgaW5mby5zZXRWaXNpYmxlVG9Vc2VyKHRydWUpOworICAgICAgICBpbmZvLnNldEVkaXRhYmxlKHRydWUpOworICAgICAgICBpbmZvLnNldENhbk9wZW5Qb3B1cCh0cnVlKTsKKyAgICAgICAgaW5mby5zZXREaXNtaXNzYWJsZSh0cnVlKTsKKyAgICAgICAgaW5mby5zZXRNdWx0aUxpbmUodHJ1ZSk7CisgICAgICAgIGluZm8uc2V0Q29udGVudEludmFsaWQodHJ1ZSk7CisgICAgICAgIGluZm8uc2V0Q29udGV4dENsaWNrYWJsZSh0cnVlKTsKKyAgICAgICAgaW5mby5zZXRJbXBvcnRhbnRGb3JBY2Nlc3NpYmlsaXR5KHRydWUpOworICAgICAgICBpbmZvLnNldFNjcmVlblJlYWRlckZvY3VzYWJsZSh0cnVlKTsKKworICAgICAgICAvLyAyIEJvb2xlYW4gcHJvcGVydGllcywgZm9yIGEgdG90YWwgb2YgMjIKKyAgICAgICAgaW5mby5zZXRTaG93aW5nSGludFRleHQodHJ1ZSk7CisgICAgICAgIGluZm8uc2V0SGVhZGluZyh0cnVlKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBDb21wYXJlcyBhbGwgcHJvcGVydGllcyBvZiB0aGUgPGNvZGU+ZXhwZWN0ZWRJbmZvPC9jb2RlPiBhbmQgdGhlCi0gICAgICogPGNvZGU+cmVjZXZpZWRJbmZvPC9jb2RlPiB0byB2ZXJpZnkgdGhhdCB0aGUgcmVjZWl2ZWQgbm9kZSBpbmZvIGlzCisgICAgICogPGNvZGU+cmVjZWl2ZWRJbmZvPC9jb2RlPiB0byB2ZXJpZnkgdGhhdCB0aGUgcmVjZWl2ZWQgbm9kZSBpbmZvIGlzCiAgICAgICogdGhlIG9uZSB0aGF0IGlzIGV4cGVjdGVkLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRFcXVhbHNBY2Nlc3NpYmlsaXR5Tm9kZUluZm8oQWNjZXNzaWJpbGl0eU5vZGVJbmZvIGV4cGVjdGVkSW5mbywKICAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyByZWNlaXZlZEluZm8pIHsKKyAgICAgICAgLy8gQ2hlY2sgMTAgZmllbGRzCiAgICAgICAgIFJlY3QgZXhwZWN0ZWRCb3VuZHMgPSBuZXcgUmVjdCgpOwogICAgICAgICBSZWN0IHJlY2VpdmVkQm91bmRzID0gbmV3IFJlY3QoKTsKICAgICAgICAgZXhwZWN0ZWRJbmZvLmdldEJvdW5kc0luUGFyZW50KGV4cGVjdGVkQm91bmRzKTsKQEAgLTI1NCw0NyArMzA0LDIyIEBACiAgICAgICAgICAgICAgICAgcmVjZWl2ZWRJbmZvLmdldENsYXNzTmFtZSgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb250ZW50RGVzY3JpcHRpb24gaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkSW5mby5nZXRDb250ZW50RGVzY3JpcHRpb24oKSwKICAgICAgICAgICAgICAgICByZWNlaXZlZEluZm8uZ2V0Q29udGVudERlc2NyaXB0aW9uKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRvb2x0aXAgdGV4dCBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgZXhwZWN0ZWRJbmZvLmdldFRvb2x0aXBUZXh0KCksCisgICAgICAgICAgICAgICAgcmVjZWl2ZWRJbmZvLmdldFRvb2x0aXBUZXh0KCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoInBhY2thZ2VOYW1lIGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEluZm8uZ2V0UGFja2FnZU5hbWUoKSwKICAgICAgICAgICAgICAgICByZWNlaXZlZEluZm8uZ2V0UGFja2FnZU5hbWUoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygidGV4dCBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgZXhwZWN0ZWRJbmZvLmdldFRleHQoKSwgcmVjZWl2ZWRJbmZvLmdldFRleHQoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygiSGludCB0ZXh0IGhhcyBpbmNvcnJlY3QgdmFsdWUiLAogICAgICAgICAgICAgICAgIGV4cGVjdGVkSW5mby5nZXRIaW50VGV4dCgpLCByZWNlaXZlZEluZm8uZ2V0SGludFRleHQoKSk7Ci0gICAgICAgIGFzc2VydFNhbWUoImNoZWNrYWJsZSBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgZXhwZWN0ZWRJbmZvLmlzQ2hlY2thYmxlKCksCi0gICAgICAgICAgICAgICAgcmVjZWl2ZWRJbmZvLmlzQ2hlY2thYmxlKCkpOwotICAgICAgICBhc3NlcnRTYW1lKCJjaGVja2VkIGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEluZm8uaXNDaGVja2VkKCksCi0gICAgICAgICAgICAgICAgcmVjZWl2ZWRJbmZvLmlzQ2hlY2tlZCgpKTsKLSAgICAgICAgYXNzZXJ0U2FtZSgiY2xpY2thYmxlIGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEluZm8uaXNDbGlja2FibGUoKSwKLSAgICAgICAgICAgICAgICByZWNlaXZlZEluZm8uaXNDbGlja2FibGUoKSk7Ci0gICAgICAgIGFzc2VydFNhbWUoImVuYWJsZWQgaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkSW5mby5pc0VuYWJsZWQoKSwKLSAgICAgICAgICAgICAgICByZWNlaXZlZEluZm8uaXNFbmFibGVkKCkpOwotICAgICAgICBhc3NlcnRTYW1lKCJmb2N1c2FibGUgaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkSW5mby5pc0ZvY3VzYWJsZSgpLAotICAgICAgICAgICAgICAgIHJlY2VpdmVkSW5mby5pc0ZvY3VzYWJsZSgpKTsKLSAgICAgICAgYXNzZXJ0U2FtZSgiZm9jdXNlZCBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgZXhwZWN0ZWRJbmZvLmlzRm9jdXNlZCgpLAotICAgICAgICAgICAgICAgIHJlY2VpdmVkSW5mby5pc0ZvY3VzZWQoKSk7Ci0gICAgICAgIGFzc2VydFNhbWUoImltcG9ydGFudEZvckFjY2Vzc2liaWxpdHkgaGFzIGluY29ycmVjdCB2YWx1ZSIsCi0gICAgICAgICAgICAgICAgZXhwZWN0ZWRJbmZvLmlzSW1wb3J0YW50Rm9yQWNjZXNzaWJpbGl0eSgpLAotICAgICAgICAgICAgICAgIHJlY2VpdmVkSW5mby5pc0ltcG9ydGFudEZvckFjY2Vzc2liaWxpdHkoKSk7Ci0gICAgICAgIGFzc2VydFNhbWUoImxvbmdDbGlja2FibGUgaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkSW5mby5pc0xvbmdDbGlja2FibGUoKSwKLSAgICAgICAgICAgICAgICByZWNlaXZlZEluZm8uaXNMb25nQ2xpY2thYmxlKCkpOwotICAgICAgICBhc3NlcnRTYW1lKCJjb250ZXh0Q2xpY2thYmxlIGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEluZm8uaXNDb250ZXh0Q2xpY2thYmxlKCksCi0gICAgICAgICAgICAgICAgcmVjZWl2ZWRJbmZvLmlzQ29udGV4dENsaWNrYWJsZSgpKTsKLSAgICAgICAgYXNzZXJ0U2FtZSgicGFzc3dvcmQgaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkSW5mby5pc1Bhc3N3b3JkKCksCi0gICAgICAgICAgICAgICAgcmVjZWl2ZWRJbmZvLmlzUGFzc3dvcmQoKSk7Ci0gICAgICAgIGFzc2VydFNhbWUoInNjcm9sbGFibGUgaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkSW5mby5pc1Njcm9sbGFibGUoKSwKLSAgICAgICAgICAgICAgICByZWNlaXZlZEluZm8uaXNTY3JvbGxhYmxlKCkpOwotICAgICAgICBhc3NlcnRTYW1lKCJzZWxlY3RlZCBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgZXhwZWN0ZWRJbmZvLmlzU2VsZWN0ZWQoKSwKLSAgICAgICAgICAgICAgICByZWNlaXZlZEluZm8uaXNTZWxlY3RlZCgpKTsKKyAgICAgICAgYXNzZXJ0U2FtZSgiY2hpbGRDb3VudCBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgZXhwZWN0ZWRJbmZvLmdldENoaWxkQ291bnQoKSwKKyAgICAgICAgICAgICAgICByZWNlaXZlZEluZm8uZ2V0Q2hpbGRDb3VudCgpKTsKKyAgICAgICAgLy8gQWN0aW9ucyBpcyBqdXN0IDEgZmllbGQsIGJ1dCB3ZSBjaGVjayBpdCAyIHdheXMKICAgICAgICAgYXNzZXJ0U2FtZSgiYWN0aW9ucyBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgZXhwZWN0ZWRJbmZvLmdldEFjdGlvbnMoKSwKICAgICAgICAgICAgICAgICByZWNlaXZlZEluZm8uZ2V0QWN0aW9ucygpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJhY3Rpb25zU2V0IGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEluZm8uZ2V0QWN0aW9uTGlzdCgpLAogICAgICAgICAgICAgICAgIHJlY2VpdmVkSW5mby5nZXRBY3Rpb25MaXN0KCkpOwotICAgICAgICBhc3NlcnRTYW1lKCJjaGlsZENvdW50IGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEluZm8uZ2V0Q2hpbGRDb3VudCgpLAotICAgICAgICAgICAgICAgIHJlY2VpdmVkSW5mby5nZXRDaGlsZENvdW50KCkpOwotICAgICAgICBhc3NlcnRTYW1lKCJjaGlsZENvdW50IGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEluZm8uZ2V0Q2hpbGRDb3VudCgpLAotICAgICAgICAgICAgICAgIHJlY2VpdmVkSW5mby5nZXRDaGlsZENvdW50KCkpOwotICAgICAgICBhc3NlcnRTYW1lKCJhY2Nlc3NpYmlsaXR5Rm9jdXNlZCBoYXMgaW5jb3JyZWN0IHZhbHVlIiwKLSAgICAgICAgICAgICAgICBleHBlY3RlZEluZm8uaXNBY2Nlc3NpYmlsaXR5Rm9jdXNlZCgpLAotICAgICAgICAgICAgICAgIHJlY2VpdmVkSW5mby5pc0FjY2Vzc2liaWxpdHlGb2N1c2VkKCkpOworCisgICAgICAgIC8vIENoZWNrIDEwIGZpZWxkcwogICAgICAgICBhc3NlcnRTYW1lKCJtb3ZlbWVudEdyYW51bGFyaXRpZXMgaGFzIGluY29ycmVjdCB2YWx1ZSIsCiAgICAgICAgICAgICAgICAgZXhwZWN0ZWRJbmZvLmdldE1vdmVtZW50R3JhbnVsYXJpdGllcygpLAogICAgICAgICAgICAgICAgIHJlY2VpdmVkSW5mby5nZXRNb3ZlbWVudEdyYW51bGFyaXRpZXMoKSk7CkBAIC0zMDQsNiArMzI5LDE0MSBAQAogICAgICAgICAgICAgICAgIHJlY2VpdmVkSW5mby5nZXREcmF3aW5nT3JkZXIoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygiRXh0cmEgZGF0YSBmbGFncyBoYXZlIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkSW5mby5nZXRBdmFpbGFibGVFeHRyYURhdGEoKSwKICAgICAgICAgICAgICAgICByZWNlaXZlZEluZm8uZ2V0QXZhaWxhYmxlRXh0cmFEYXRhKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlBhbmUgdGl0bGUgaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkSW5mby5nZXRQYW5lVGl0bGUoKSwKKyAgICAgICAgICAgICAgICByZWNlaXZlZEluZm8uZ2V0UGFuZVRpdGxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkVycm9yIHRleHQgaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkSW5mby5nZXRFcnJvcigpLAorICAgICAgICAgICAgICAgIHJlY2VpdmVkSW5mby5nZXRFcnJvcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJNYXggdGV4dCBsZW5ndGggaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkSW5mby5nZXRNYXhUZXh0TGVuZ3RoKCksCisgICAgICAgICAgICAgICAgcmVjZWl2ZWRJbmZvLmdldE1heFRleHRMZW5ndGgoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiVGV4dCBzZWxlY3Rpb24gc3RhcnQgaGFzIGluY29ycmVjdCB2YWx1ZSIsCisgICAgICAgICAgICAgICAgZXhwZWN0ZWRJbmZvLmdldFRleHRTZWxlY3Rpb25TdGFydCgpLCByZWNlaXZlZEluZm8uZ2V0VGV4dFNlbGVjdGlvblN0YXJ0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlRleHQgc2VsZWN0aW9uIGVuZCBoYXMgaW5jb3JyZWN0IHZhbHVlIiwKKyAgICAgICAgICAgICAgICBleHBlY3RlZEluZm8uZ2V0VGV4dFNlbGVjdGlvbkVuZCgpLCByZWNlaXZlZEluZm8uZ2V0VGV4dFNlbGVjdGlvbkVuZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJMaXZlIHJlZ2lvbiBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgZXhwZWN0ZWRJbmZvLmdldExpdmVSZWdpb24oKSwKKyAgICAgICAgICAgICAgICByZWNlaXZlZEluZm8uZ2V0TGl2ZVJlZ2lvbigpKTsKKworICAgICAgICAvLyBDaGVjayAyIGZpZWxkcworICAgICAgICAvLyBFeHRyYXMgaXMgYSBCdW5kbGUsIGFuZCBCdW5kbGUgZG9lc24ndCBkZWNsYXJlIGVxdWFscy4gQ29tcGFyaW5nIHRoZSBrZXlzZXQgZ2V0cyB1cworICAgICAgICAvLyB3aGF0IHdlIG5lZWQsIHRob3VnaAorICAgICAgICBhc3NlcnRFcXVhbHMoIkV4dHJhcyBoYXZlIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkSW5mby5nZXRFeHRyYXMoKS5rZXlTZXQoKSwKKyAgICAgICAgICAgICAgICByZWNlaXZlZEluZm8uZ2V0RXh0cmFzKCkua2V5U2V0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIklucHV0VHlwZSBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgZXhwZWN0ZWRJbmZvLmdldElucHV0VHlwZSgpLAorICAgICAgICAgICAgICAgIHJlY2VpdmVkSW5mby5nZXRJbnB1dFR5cGUoKSk7CisKKyAgICAgICAgLy8gQ2hlY2sgMyBmaWVsZHMgd2l0aCBzdWItb2JqZWN0cworICAgICAgICBSYW5nZUluZm8gZXhwZWN0ZWRSYW5nZSA9IGV4cGVjdGVkSW5mby5nZXRSYW5nZUluZm8oKTsKKyAgICAgICAgUmFuZ2VJbmZvIHJlY2VpdmVkUmFuZ2UgPSByZWNlaXZlZEluZm8uZ2V0UmFuZ2VJbmZvKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiUmFuZ2UgaW5mbyBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgKGV4cGVjdGVkUmFuZ2UgIT0gbnVsbCksCisgICAgICAgICAgICAgICAgKHJlY2VpdmVkUmFuZ2UgIT0gbnVsbCkpOworICAgICAgICBpZiAoZXhwZWN0ZWRSYW5nZSAhPSBudWxsKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlJhbmdlSW5mbyNnZXRDdXJyZW50IGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZFJhbmdlLmdldEN1cnJlbnQoKSwKKyAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZWRSYW5nZS5nZXRDdXJyZW50KCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJSYW5nZUluZm8jZ2V0TWluIGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZFJhbmdlLmdldE1pbigpLAorICAgICAgICAgICAgICAgICAgICByZWNlaXZlZFJhbmdlLmdldE1pbigpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiUmFuZ2VJbmZvI2dldE1heCBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgZXhwZWN0ZWRSYW5nZS5nZXRNYXgoKSwKKyAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZWRSYW5nZS5nZXRNYXgoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlJhbmdlSW5mbyNnZXRUeXBlIGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZFJhbmdlLmdldFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZWRSYW5nZS5nZXRUeXBlKCkpOworICAgICAgICB9CisKKyAgICAgICAgQ29sbGVjdGlvbkluZm8gZXhwZWN0ZWRDb2xsZWN0aW9uSW5mbyA9IGV4cGVjdGVkSW5mby5nZXRDb2xsZWN0aW9uSW5mbygpOworICAgICAgICBDb2xsZWN0aW9uSW5mbyByZWNlaXZlZENvbGxlY3Rpb25JbmZvID0gcmVjZWl2ZWRJbmZvLmdldENvbGxlY3Rpb25JbmZvKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiQ29sbGVjdGlvbiBpbmZvIGhhcyBpbmNvcnJlY3QgdmFsdWUiLCAoZXhwZWN0ZWRDb2xsZWN0aW9uSW5mbyAhPSBudWxsKSwKKyAgICAgICAgICAgICAgICAocmVjZWl2ZWRDb2xsZWN0aW9uSW5mbyAhPSBudWxsKSk7CisgICAgICAgIGlmIChleHBlY3RlZENvbGxlY3Rpb25JbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiQ29sbGVjdGlvbkluZm8jZ2V0Q29sdW1uQ291bnQgaGFzIGluY29ycmVjdCB2YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkQ29sbGVjdGlvbkluZm8uZ2V0Q29sdW1uQ291bnQoKSwKKyAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZWRDb2xsZWN0aW9uSW5mby5nZXRDb2x1bW5Db3VudCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiQ29sbGVjdGlvbkluZm8jZ2V0Um93Q291bnQgaGFzIGluY29ycmVjdCB2YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkQ29sbGVjdGlvbkluZm8uZ2V0Um93Q291bnQoKSwgcmVjZWl2ZWRDb2xsZWN0aW9uSW5mby5nZXRSb3dDb3VudCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiQ29sbGVjdGlvbkluZm8jZ2V0U2VsZWN0aW9uTW9kZSBoYXMgaW5jb3JyZWN0IHZhbHVlIiwKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRDb2xsZWN0aW9uSW5mby5nZXRTZWxlY3Rpb25Nb2RlKCksCisgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVkQ29sbGVjdGlvbkluZm8uZ2V0U2VsZWN0aW9uTW9kZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIENvbGxlY3Rpb25JdGVtSW5mbyBleHBlY3RlZEl0ZW1JbmZvID0gZXhwZWN0ZWRJbmZvLmdldENvbGxlY3Rpb25JdGVtSW5mbygpOworICAgICAgICBDb2xsZWN0aW9uSXRlbUluZm8gcmVjZWl2ZWRJdGVtSW5mbyA9IHJlY2VpdmVkSW5mby5nZXRDb2xsZWN0aW9uSXRlbUluZm8oKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJDb2xsZWN0aW9uIGl0ZW0gaW5mbyBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgKGV4cGVjdGVkSXRlbUluZm8gIT0gbnVsbCksCisgICAgICAgICAgICAgICAgKHJlY2VpdmVkSXRlbUluZm8gIT0gbnVsbCkpOworICAgICAgICBpZiAoZXhwZWN0ZWRJdGVtSW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkNvbGxlY3Rpb25JdGVtSW5mbyNnZXRDb2x1bW5JbmRleCBoYXMgaW5jb3JyZWN0IHZhbHVlIiwKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRJdGVtSW5mby5nZXRDb2x1bW5JbmRleCgpLAorICAgICAgICAgICAgICAgICAgICByZWNlaXZlZEl0ZW1JbmZvLmdldENvbHVtbkluZGV4KCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJDb2xsZWN0aW9uSXRlbUluZm8jZ2V0Q29sdW1uU3BhbiBoYXMgaW5jb3JyZWN0IHZhbHVlIiwKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRJdGVtSW5mby5nZXRDb2x1bW5TcGFuKCksCisgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVkSXRlbUluZm8uZ2V0Q29sdW1uU3BhbigpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiQ29sbGVjdGlvbkl0ZW1JbmZvI2dldFJvd0luZGV4IGhhcyBpbmNvcnJlY3QgdmFsdWUiLAorICAgICAgICAgICAgICAgICAgICBleHBlY3RlZEl0ZW1JbmZvLmdldFJvd0luZGV4KCksCisgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVkSXRlbUluZm8uZ2V0Um93SW5kZXgoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkNvbGxlY3Rpb25JdGVtSW5mbyNnZXRSb3dTcGFuIGhhcyBpbmNvcnJlY3QgdmFsdWUiLAorICAgICAgICAgICAgICAgICAgICBleHBlY3RlZEl0ZW1JbmZvLmdldFJvd1NwYW4oKSwKKyAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZWRJdGVtSW5mby5nZXRSb3dTcGFuKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQW5kIHRoZSBib29sZWFuIHByb3BlcnRpZXMgYXJlIGFub3RoZXIgZmllbGQsIGZvciBhIHRvdGFsIG9mIDI2CisgICAgICAgIC8vIE1pc3NpbmcgcGFyZW50OiBUZXN0ZWQgZW5kLXRvLWVuZCBpbiBBY2Nlc3NpYmlsaXR5V2luZG93VHJhdmVyc2FsVGVzdCN0ZXN0T2JqZWN0Q29udHJhY3QKKyAgICAgICAgLy8gICAgICAgICAgICAgICAgIChnZXR0aW5nIGEgY2hpbGQgaXMgYWxzbyBjaGVja2VkIHRoZXJlKQorICAgICAgICAvLyAgICAgICAgIHRyYXZlcnNhbGJlZm9yZTogQWNjZXNzaWJpbGl0eUVuZFRvRW5kVGVzdAorICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgI3Rlc3RUcmF2ZXJzYWxCZWZvcmVSZXBvcnRlZFRvQWNjZXNzaWJpbGl0eQorICAgICAgICAvLyAgICAgICAgIHRyYXZlcnNhbGFmdGVyOiBBY2Nlc3NpYmlsaXR5RW5kVG9FbmRUZXN0CisgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICN0ZXN0VHJhdmVyc2FsQWZ0ZXJSZXBvcnRlZFRvQWNjZXNzaWJpbGl0eQorICAgICAgICAvLyAgICAgICAgIGxhYmVsZm9yOiBBY2Nlc3NpYmlsaXR5RW5kVG9FbmRUZXN0I3Rlc3RMYWJlbEZvclJlcG9ydGVkVG9BY2Nlc3NpYmlsaXR5CisgICAgICAgIC8vICAgICAgICAgbGFiZWxlZGJ5OiBBY2Nlc3NpYmlsaXR5RW5kVG9FbmRUZXN0I3Rlc3RMYWJlbEZvclJlcG9ydGVkVG9BY2Nlc3NpYmlsaXR5CisgICAgICAgIC8vICAgICAgICAgd2luZG93aWQ6IE5vdCBkaXJlY3RseSBvYnNlcnZhYmxlCisgICAgICAgIC8vICAgICAgICAgc291cmNlaWQ6IE5vdCBkaXJlY3RseSBvYnNlcnZhYmxlCisgICAgICAgIC8vIFdoaWNoIGJyaW5ncyB1cyB0byBhIHRvdGFsIG9mIDMzCisKKyAgICAgICAgLy8gMTAgQm9vbGVhbiBwcm9wZXJ0aWVzCisgICAgICAgIGFzc2VydFNhbWUoImNoZWNrYWJsZSBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgZXhwZWN0ZWRJbmZvLmlzQ2hlY2thYmxlKCksCisgICAgICAgICAgICAgICAgcmVjZWl2ZWRJbmZvLmlzQ2hlY2thYmxlKCkpOworICAgICAgICBhc3NlcnRTYW1lKCJjaGVja2VkIGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEluZm8uaXNDaGVja2VkKCksCisgICAgICAgICAgICAgICAgcmVjZWl2ZWRJbmZvLmlzQ2hlY2tlZCgpKTsKKyAgICAgICAgYXNzZXJ0U2FtZSgiZm9jdXNhYmxlIGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEluZm8uaXNGb2N1c2FibGUoKSwKKyAgICAgICAgICAgICAgICByZWNlaXZlZEluZm8uaXNGb2N1c2FibGUoKSk7CisgICAgICAgIGFzc2VydFNhbWUoImZvY3VzZWQgaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkSW5mby5pc0ZvY3VzZWQoKSwKKyAgICAgICAgICAgICAgICByZWNlaXZlZEluZm8uaXNGb2N1c2VkKCkpOworICAgICAgICBhc3NlcnRTYW1lKCJzZWxlY3RlZCBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgZXhwZWN0ZWRJbmZvLmlzU2VsZWN0ZWQoKSwKKyAgICAgICAgICAgICAgICByZWNlaXZlZEluZm8uaXNTZWxlY3RlZCgpKTsKKyAgICAgICAgYXNzZXJ0U2FtZSgiY2xpY2thYmxlIGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEluZm8uaXNDbGlja2FibGUoKSwKKyAgICAgICAgICAgICAgICByZWNlaXZlZEluZm8uaXNDbGlja2FibGUoKSk7CisgICAgICAgIGFzc2VydFNhbWUoImxvbmdDbGlja2FibGUgaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkSW5mby5pc0xvbmdDbGlja2FibGUoKSwKKyAgICAgICAgICAgICAgICByZWNlaXZlZEluZm8uaXNMb25nQ2xpY2thYmxlKCkpOworICAgICAgICBhc3NlcnRTYW1lKCJlbmFibGVkIGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEluZm8uaXNFbmFibGVkKCksCisgICAgICAgICAgICAgICAgcmVjZWl2ZWRJbmZvLmlzRW5hYmxlZCgpKTsKKyAgICAgICAgYXNzZXJ0U2FtZSgicGFzc3dvcmQgaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkSW5mby5pc1Bhc3N3b3JkKCksCisgICAgICAgICAgICAgICAgcmVjZWl2ZWRJbmZvLmlzUGFzc3dvcmQoKSk7CisgICAgICAgIGFzc2VydFNhbWUoInNjcm9sbGFibGUgaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkSW5mby5pc1Njcm9sbGFibGUoKSwKKyAgICAgICAgICAgICAgICByZWNlaXZlZEluZm8uaXNTY3JvbGxhYmxlKCkpOworCisgICAgICAgIC8vIDEwIEJvb2xlYW4gcHJvcGVydGllcworICAgICAgICBhc3NlcnRTYW1lKCJBY2Nlc3NpYmlsaXR5Rm9jdXNlZCBoYXMgaW5jb3JyZWN0IHZhbHVlIiwKKyAgICAgICAgICAgICAgICBleHBlY3RlZEluZm8uaXNBY2Nlc3NpYmlsaXR5Rm9jdXNlZCgpLAorICAgICAgICAgICAgICAgIHJlY2VpdmVkSW5mby5pc0FjY2Vzc2liaWxpdHlGb2N1c2VkKCkpOworICAgICAgICBhc3NlcnRTYW1lKCJWaXNpYmxlVG9Vc2VyIGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEluZm8uaXNWaXNpYmxlVG9Vc2VyKCksCisgICAgICAgICAgICAgICAgcmVjZWl2ZWRJbmZvLmlzVmlzaWJsZVRvVXNlcigpKTsKKyAgICAgICAgYXNzZXJ0U2FtZSgiRWRpdGFibGUgaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkSW5mby5pc0VkaXRhYmxlKCksCisgICAgICAgICAgICAgICAgcmVjZWl2ZWRJbmZvLmlzRWRpdGFibGUoKSk7CisgICAgICAgIGFzc2VydFNhbWUoImNhbk9wZW5Qb3B1cCBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgZXhwZWN0ZWRJbmZvLmNhbk9wZW5Qb3B1cCgpLAorICAgICAgICAgICAgICAgIHJlY2VpdmVkSW5mby5jYW5PcGVuUG9wdXAoKSk7CisgICAgICAgIGFzc2VydFNhbWUoIkRpc21pc3NhYmxlIGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEluZm8uaXNEaXNtaXNzYWJsZSgpLAorICAgICAgICAgICAgICAgIHJlY2VpdmVkSW5mby5pc0Rpc21pc3NhYmxlKCkpOworICAgICAgICBhc3NlcnRTYW1lKCJNdWx0aWxpbmUgaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkSW5mby5pc011bHRpTGluZSgpLAorICAgICAgICAgICAgICAgIHJlY2VpdmVkSW5mby5pc011bHRpTGluZSgpKTsKKyAgICAgICAgYXNzZXJ0U2FtZSgiQ29udGVudEludmFsaWQgaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkSW5mby5pc0NvbnRlbnRJbnZhbGlkKCksCisgICAgICAgICAgICAgICAgcmVjZWl2ZWRJbmZvLmlzQ29udGVudEludmFsaWQoKSk7CisgICAgICAgIGFzc2VydFNhbWUoImNvbnRleHRDbGlja2FibGUgaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkSW5mby5pc0NvbnRleHRDbGlja2FibGUoKSwKKyAgICAgICAgICAgICAgICByZWNlaXZlZEluZm8uaXNDb250ZXh0Q2xpY2thYmxlKCkpOworICAgICAgICBhc3NlcnRTYW1lKCJpbXBvcnRhbnRGb3JBY2Nlc3NpYmlsaXR5IGhhcyBpbmNvcnJlY3QgdmFsdWUiLAorICAgICAgICAgICAgICAgIGV4cGVjdGVkSW5mby5pc0ltcG9ydGFudEZvckFjY2Vzc2liaWxpdHkoKSwKKyAgICAgICAgICAgICAgICByZWNlaXZlZEluZm8uaXNJbXBvcnRhbnRGb3JBY2Nlc3NpYmlsaXR5KCkpOworICAgICAgICBhc3NlcnRTYW1lKCJpc1NjcmVlblJlYWRlckZvY3VzYWJsZSBoYXMgaW5jb3JyZWN0IHZhbHVlIiwKKyAgICAgICAgICAgICAgICBleHBlY3RlZEluZm8uaXNTY3JlZW5SZWFkZXJGb2N1c2FibGUoKSwgcmVjZWl2ZWRJbmZvLmlzU2NyZWVuUmVhZGVyRm9jdXNhYmxlKCkpOworCisgICAgICAgIC8vIDIgQm9vbGVhbiBwcm9wZXJ0aWVzLCBmb3IgYSB0b3RhbCBvZiAyMgorICAgICAgICBhc3NlcnRTYW1lKCJpc1Nob3dpbmdIaW50IGhhcyBpbmNvcnJlY3QgdmFsdWUiLAorICAgICAgICAgICAgICAgIGV4cGVjdGVkSW5mby5pc1Nob3dpbmdIaW50VGV4dCgpLCByZWNlaXZlZEluZm8uaXNTaG93aW5nSGludFRleHQoKSk7CisgICAgICAgIGFzc2VydFNhbWUoImlzSGVhZGluZyBoYXMgaW5jb3JyZWN0IHZhbHVlIiwKKyAgICAgICAgICAgICAgICBleHBlY3RlZEluZm8uaXNIZWFkaW5nKCksIHJlY2VpdmVkSW5mby5pc0hlYWRpbmcoKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0zMTIsNiArNDcyLDcgQEAKICAgICAgKiBAcGFyYW0gaW5mbyBUaGUgbm9kZSBpbmZvIHRvIGNoZWNrLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9DbGVhcmVkKEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBpbmZvKSB7CisgICAgICAgIC8vIENoZWNrIDEwIGZpZWxkcwogICAgICAgICBSZWN0IGJvdW5kcyA9IG5ldyBSZWN0KCk7CiAgICAgICAgIGluZm8uZ2V0Qm91bmRzSW5QYXJlbnQoYm91bmRzKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiYm91bmRzSW5QYXJlbnQgbm90IHByb3Blcmx5IHJlY3ljbGVkIiwgYm91bmRzLmlzRW1wdHkoKSk7CkBAIC0zMTksMjggKzQ4MCw3NCBAQAogICAgICAgICBhc3NlcnRUcnVlKCJib3VuZHNJblNjcmVlbiBub3QgcHJvcGVybHkgcmVjeWNsZWQiLCBib3VuZHMuaXNFbXB0eSgpKTsKICAgICAgICAgYXNzZXJ0TnVsbCgiY2xhc3NOYW1lIG5vdCBwcm9wZXJseSByZWN5Y2xlZCIsIGluZm8uZ2V0Q2xhc3NOYW1lKCkpOwogICAgICAgICBhc3NlcnROdWxsKCJjb250ZW50RGVzY3JpcHRpb24gbm90IHByb3Blcmx5IHJlY3ljbGVkIiwgaW5mby5nZXRDb250ZW50RGVzY3JpcHRpb24oKSk7CisgICAgICAgIGFzc2VydE51bGwoInRvb2x0aXB0ZXh0IG5vdCBwcm9wZXJseSByZWN5Y2xlZCIsIGluZm8uZ2V0VG9vbHRpcFRleHQoKSk7CiAgICAgICAgIGFzc2VydE51bGwoInBhY2thZ2VOYW1lIG5vdCBwcm9wZXJseSByZWN5Y2xlZCIsIGluZm8uZ2V0UGFja2FnZU5hbWUoKSk7CiAgICAgICAgIGFzc2VydE51bGwoInRleHQgbm90IHByb3Blcmx5IHJlY3ljbGVkIiwgaW5mby5nZXRUZXh0KCkpOwogICAgICAgICBhc3NlcnROdWxsKCJIaW50IHRleHQgbm90IHByb3Blcmx5IHJlY3ljbGVkIiwgaW5mby5nZXRIaW50VGV4dCgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoImNoZWNrYWJsZSBub3QgcHJvcGVybHkgcmVjeWNsZWQiLCBpbmZvLmlzQ2hlY2thYmxlKCkpOwotICAgICAgICBhc3NlcnRGYWxzZSgiY2hlY2tlZCBub3QgcHJvcGVybHkgcmVjeWNsZWQiLCBpbmZvLmlzQ2hlY2tlZCgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoImNsaWNrYWJsZSBub3QgcHJvcGVybHkgcmVjeWNsZWQiLCBpbmZvLmlzQ2xpY2thYmxlKCkpOwotICAgICAgICBhc3NlcnRGYWxzZSgiZW5hYmxlZCBub3QgcHJvcGVybHkgcmVjeWNsZWQiLCBpbmZvLmlzRW5hYmxlZCgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoImZvY3VzYWJsZSBub3QgcHJvcGVybHkgcmVjeWNsZWQiLCBpbmZvLmlzRm9jdXNhYmxlKCkpOwotICAgICAgICBhc3NlcnRGYWxzZSgiZm9jdXNlZCBub3QgcHJvcGVybHkgcmVjeWNsZWQiLCBpbmZvLmlzRm9jdXNlZCgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoImltcG9ydGFudEZvckFjY2Vzc2liaWxpdHkgbm90IHByb3Blcmx5IHJlY3ljbGVkIiwKLSAgICAgICAgICAgICAgICBpbmZvLmlzSW1wb3J0YW50Rm9yQWNjZXNzaWJpbGl0eSgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoImxvbmdDbGlja2FibGUgbm90IHByb3Blcmx5IHJlY3ljbGVkIiwgaW5mby5pc0xvbmdDbGlja2FibGUoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJjb250ZXh0Q2xpY2thYmxlIG5vdCBwcm9wZXJseSByZWN5Y2xlZCIsIGluZm8uaXNDb250ZXh0Q2xpY2thYmxlKCkpOwotICAgICAgICBhc3NlcnRGYWxzZSgicGFzc3dvcmQgbm90IHByb3Blcmx5IHJlY3ljbGVkIiwgaW5mby5pc1Bhc3N3b3JkKCkpOwotICAgICAgICBhc3NlcnRGYWxzZSgic2Nyb2xsYWJsZSBub3QgcHJvcGVybHkgcmVjeWNsZWQiLCBpbmZvLmlzU2Nyb2xsYWJsZSgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoInNlbGVjdGVkIG5vdCBwcm9wZXJseSByZWN5Y2xlZCIsIGluZm8uaXNTZWxlY3RlZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJDaGlsZHJlbiBsaXN0IG5vdCBwcm9wZXJseSByZWN5Y2xlZCIsIDAsIGluZm8uZ2V0Q2hpbGRDb3VudCgpKTsKKyAgICAgICAgLy8gQWN0aW9ucyBhcmUgaW4gb25lIGZpZWxkCiAgICAgICAgIGFzc2VydFNhbWUoImFjdGlvbnMgbm90IHByb3Blcmx5IHJlY3ljbGVkIiwgMCwgaW5mby5nZXRBY3Rpb25zKCkpOwotICAgICAgICBhc3NlcnRGYWxzZSgiYWNjZXNzaWJpbGl0eUZvY3VzZWQgbm90IHByb3Blcmx5IHJlY3ljbGVkIiwgaW5mby5pc0FjY2Vzc2liaWxpdHlGb2N1c2VkKCkpOworICAgICAgICBhc3NlcnRUcnVlKCJhY3Rpb24gbGlzdCBub3QgcHJvcGVybHkgcmVjeWNsZWQiLCBpbmZvLmdldEFjdGlvbkxpc3QoKS5pc0VtcHR5KCkpOworCisgICAgICAgIC8vIENoZWNrIDEwIGZpZWxkcwogICAgICAgICBhc3NlcnRTYW1lKCJtb3ZlbWVudEdyYW51bGFyaXRpZXMgbm90IHByb3Blcmx5IHJlY3ljbGVkIiwgMCwKICAgICAgICAgICAgICAgICBpbmZvLmdldE1vdmVtZW50R3JhbnVsYXJpdGllcygpKTsKICAgICAgICAgYXNzZXJ0TnVsbCgidmlld0lkIG5vdCBwcm9wZXJseSByZWN5Y2xlZCIsIGluZm8uZ2V0Vmlld0lkUmVzb3VyY2VOYW1lKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMCwgaW5mby5nZXREcmF3aW5nT3JkZXIoKSk7CiAgICAgICAgIGFzc2VydFRydWUoaW5mby5nZXRBdmFpbGFibGVFeHRyYURhdGEoKS5pc0VtcHR5KCkpOworICAgICAgICBhc3NlcnROdWxsKCJQYW5lIHRpdGxlIG5vdCBwcm9wZXJseSByZWN5Y2xlZCIsIGluZm8uZ2V0UGFuZVRpdGxlKCkpOworICAgICAgICBhc3NlcnROdWxsKCJFcnJvciB0ZXh0IG5vdCBwcm9wZXJseSByZWN5Y2xlZCIsIGluZm8uZ2V0RXJyb3IoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiTWF4IHRleHQgbGVuZ3RoIG5vdCBwcm9wZXJseSByZWN5Y2xlZCIsIC0xLCBpbmZvLmdldE1heFRleHRMZW5ndGgoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiVGV4dCBzZWxlY3Rpb24gc3RhcnQgbm90IHByb3Blcmx5IHJlY3ljbGVkIiwKKyAgICAgICAgICAgICAgICAtMSwgaW5mby5nZXRUZXh0U2VsZWN0aW9uU3RhcnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiVGV4dCBzZWxlY3Rpb24gZW5kIG5vdCBwcm9wZXJseSByZWN5Y2xlZCIsIC0xLCBpbmZvLmdldFRleHRTZWxlY3Rpb25FbmQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiTGl2ZSByZWdpb24gbm90IHByb3Blcmx5IHJlY3ljbGVkIiwgMCwgaW5mby5nZXRMaXZlUmVnaW9uKCkpOworCisgICAgICAgIC8vIENoZWNrIDUgZmllbGRzCisgICAgICAgIGFzc2VydEVxdWFscygiRXh0cmFzIG5vdCBwcm9wZXJseSByZWN5Y2xlZCIsIDAsIGluZm8uZ2V0RXh0cmFzKCkua2V5U2V0KCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbnB1dCB0eXBlIG5vdCBwcm9wZXJseSByZWN5Y2xlZCIsIDAsIGluZm8uZ2V0SW5wdXRUeXBlKCkpOworICAgICAgICBhc3NlcnROdWxsKCJSYW5nZSBpbmZvIG5vdCBwcm9wZXJseSByZWN5Y2xlZCIsIGluZm8uZ2V0UmFuZ2VJbmZvKCkpOworICAgICAgICBhc3NlcnROdWxsKCJDb2xsZWN0aW9uIGluZm8gbm90IHByb3Blcmx5IHJlY3ljbGVkIiwgaW5mby5nZXRDb2xsZWN0aW9uSW5mbygpKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiQ29sbGVjdGlvbiBpdGVtIGluZm8gbm90IHByb3Blcmx5IHJlY3ljbGVkIiwgaW5mby5nZXRDb2xsZWN0aW9uSXRlbUluZm8oKSk7CisKKyAgICAgICAgLy8gQW5kIEJvb2xlYW4gcHJvcGVydGllcyBicmluZ3MgdXAgdG8gMjYgZmllbGRzCisgICAgICAgIC8vIE1pc3Npbmc6CisgICAgICAgIC8vICBwYXJlbnQgKGNhbid0IGJlIHBlcmZvcm1lZCBvbiBzZWFsZWQgaW5zdGFuY2UsIGV2ZW4gaWYgbnVsbCkKKyAgICAgICAgLy8gIHRyYXZlcnNhbGJlZm9yZSAoY2FuJ3QgYmUgcGVyZm9ybWVkIG9uIHNlYWxlZCBpbnN0YW5jZSwgZXZlbiBpZiBudWxsKQorICAgICAgICAvLyAgdHJhdmVyc2FsYWZ0ZXIgKGNhbid0IGJlIHBlcmZvcm1lZCBvbiBzZWFsZWQgaW5zdGFuY2UsIGV2ZW4gaWYgbnVsbCkKKyAgICAgICAgLy8gIGxhYmVsZm9yIChjYW4ndCBiZSBwZXJmb3JtZWQgb24gc2VhbGVkIGluc3RhbmNlLCBldmVuIGlmIG51bGwpCisgICAgICAgIC8vICBsYWJlbGVkYnkgKGNhbid0IGJlIHBlcmZvcm1lZCBvbiBzZWFsZWQgaW5zdGFuY2UsIGV2ZW4gaWYgbnVsbCkKKyAgICAgICAgLy8gIHNvdXJjZUlkIChub3QgZGlyZWN0bHkgb2JzZXJ2YWJsZSkKKyAgICAgICAgLy8gIHdpbmRvd0lkIChub3QgZGlyZWN0bHkgb2JzZXJ2YWJsZSkKKyAgICAgICAgLy8gYSB0b3RhbCBvZiAzMworCisgICAgICAgIC8vIDEwIEJvb2xlYW4gcHJvcGVydGllcworICAgICAgICBhc3NlcnRGYWxzZSgiY2hlY2thYmxlIG5vdCBwcm9wZXJseSByZWN5Y2xlZCIsIGluZm8uaXNDaGVja2FibGUoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJjaGVja2VkIG5vdCBwcm9wZXJseSByZWN5Y2xlZCIsIGluZm8uaXNDaGVja2VkKCkpOworICAgICAgICBhc3NlcnRGYWxzZSgiZm9jdXNhYmxlIG5vdCBwcm9wZXJseSByZWN5Y2xlZCIsIGluZm8uaXNGb2N1c2FibGUoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJmb2N1c2VkIG5vdCBwcm9wZXJseSByZWN5Y2xlZCIsIGluZm8uaXNGb2N1c2VkKCkpOworICAgICAgICBhc3NlcnRGYWxzZSgic2VsZWN0ZWQgbm90IHByb3Blcmx5IHJlY3ljbGVkIiwgaW5mby5pc1NlbGVjdGVkKCkpOworICAgICAgICBhc3NlcnRGYWxzZSgiY2xpY2thYmxlIG5vdCBwcm9wZXJseSByZWN5Y2xlZCIsIGluZm8uaXNDbGlja2FibGUoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJsb25nQ2xpY2thYmxlIG5vdCBwcm9wZXJseSByZWN5Y2xlZCIsIGluZm8uaXNMb25nQ2xpY2thYmxlKCkpOworICAgICAgICBhc3NlcnRGYWxzZSgiZW5hYmxlZCBub3QgcHJvcGVybHkgcmVjeWNsZWQiLCBpbmZvLmlzRW5hYmxlZCgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoInBhc3N3b3JkIG5vdCBwcm9wZXJseSByZWN5Y2xlZCIsIGluZm8uaXNQYXNzd29yZCgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoInNjcm9sbGFibGUgbm90IHByb3Blcmx5IHJlY3ljbGVkIiwgaW5mby5pc1Njcm9sbGFibGUoKSk7CisKKyAgICAgICAgLy8gMTAgQm9vbGVhbiBwcm9wZXJ0aWVzCisgICAgICAgIGFzc2VydEZhbHNlKCJhY2Nlc3NpYmlsaXR5IGZvY3VzZWQgbm90IHByb3Blcmx5IHJlY3ljbGVkIiwgaW5mby5pc0FjY2Vzc2liaWxpdHlGb2N1c2VkKCkpOworICAgICAgICBhc3NlcnRGYWxzZSgiVmlzaWJsZVRvVXNlciBub3QgcHJvcGVybHkgcmVjeWNsZWQiLCBpbmZvLmlzVmlzaWJsZVRvVXNlcigpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIkVkaXRhYmxlIG5vdCBwcm9wZXJseSByZWN5Y2xlZCIsIGluZm8uaXNFZGl0YWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoImNhbk9wZW5Qb3B1cCBub3QgcHJvcGVybHkgcmVjeWNsZWQiLCBpbmZvLmNhbk9wZW5Qb3B1cCgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIkRpc21pc3NhYmxlIG5vdCBwcm9wZXJseSByZWN5Y2xlZCIsIGluZm8uaXNEaXNtaXNzYWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIk11bHRpbGluZSBub3QgcHJvcGVybHkgcmVjeWNsZWQiLCBpbmZvLmlzTXVsdGlMaW5lKCkpOworICAgICAgICBhc3NlcnRGYWxzZSgiQ29udGVudEludmFsaWQgbm90IHByb3Blcmx5IHJlY3ljbGVkIiwgaW5mby5pc0NvbnRlbnRJbnZhbGlkKCkpOworICAgICAgICBhc3NlcnRGYWxzZSgiY29udGV4dENsaWNrYWJsZSBub3QgcHJvcGVybHkgcmVjeWNsZWQiLCBpbmZvLmlzQ29udGV4dENsaWNrYWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoImltcG9ydGFudEZvckFjY2Vzc2liaWxpdHkgbm90IHByb3Blcmx5IHJlY3ljbGVkIiwKKyAgICAgICAgICAgICAgICBpbmZvLmlzSW1wb3J0YW50Rm9yQWNjZXNzaWJpbGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlNjcmVlblJlYWRlckZvY3VzYWJsZSBub3QgcHJvcGVybHkgcmVjeWNsZWQiLCBpbmZvLmlzU2NyZWVuUmVhZGVyRm9jdXNhYmxlKCkpOworCisgICAgICAgIC8vIDIgQm9vbGVhbiBwcm9wZXJ0aWVzCisgICAgICAgIGFzc2VydEZhbHNlKCJpc1Nob3dpbmdIaW50IG5vdCBwcm9wZXJseSByZXNldCIsIGluZm8uaXNTaG93aW5nSGludFRleHQoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJpc0hlYWRpbmcgbm90IHByb3Blcmx5IHJlc2V0IiwgaW5mby5pc0hlYWRpbmcoKSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYWNjZXNzaWJpbGl0eS9zcmMvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvY3RzL0FjY2Vzc2liaWxpdHlOb2RlSW5mb19Db2xsZWN0aW9uSW5mb1Rlc3QuamF2YSBiL3Rlc3RzL2FjY2Vzc2liaWxpdHkvc3JjL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L2N0cy9BY2Nlc3NpYmlsaXR5Tm9kZUluZm9fQ29sbGVjdGlvbkluZm9UZXN0LmphdmEKaW5kZXggZDY0YmQ5NC4uOThiODdmYyAxMDA2NDQKLS0tIGEvdGVzdHMvYWNjZXNzaWJpbGl0eS9zcmMvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvY3RzL0FjY2Vzc2liaWxpdHlOb2RlSW5mb19Db2xsZWN0aW9uSW5mb1Rlc3QuamF2YQorKysgYi90ZXN0cy9hY2Nlc3NpYmlsaXR5L3NyYy9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9jdHMvQWNjZXNzaWJpbGl0eU5vZGVJbmZvX0NvbGxlY3Rpb25JbmZvVGVzdC5qYXZhCkBAIC0xNiw2ICsxNiw3IEBACiAKIHBhY2thZ2UgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuY3RzOwogCitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlByZXN1Ym1pdDsKIGltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwogaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TbWFsbFRlc3Q7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU5vZGVJbmZvLkNvbGxlY3Rpb25JbmZvOwpAQCAtMjMsNiArMjQsNyBAQAogLyoqCiAgKiBDbGFzcyBmb3IgdGVzdGluZyB7QGxpbmsgQ29sbGVjdGlvbkluZm99LgogICovCitAUHJlc3VibWl0CiBwdWJsaWMgY2xhc3MgQWNjZXNzaWJpbGl0eU5vZGVJbmZvX0NvbGxlY3Rpb25JbmZvVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CiAKICAgICBAU21hbGxUZXN0CmRpZmYgLS1naXQgYS90ZXN0cy9hY2Nlc3NpYmlsaXR5L3NyYy9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9jdHMvQWNjZXNzaWJpbGl0eU5vZGVJbmZvX1JhbmdlSW5mb1Rlc3QuamF2YSBiL3Rlc3RzL2FjY2Vzc2liaWxpdHkvc3JjL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L2N0cy9BY2Nlc3NpYmlsaXR5Tm9kZUluZm9fUmFuZ2VJbmZvVGVzdC5qYXZhCmluZGV4IDk1NGQ3NjIuLjRiMDExMjkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2FjY2Vzc2liaWxpdHkvc3JjL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L2N0cy9BY2Nlc3NpYmlsaXR5Tm9kZUluZm9fUmFuZ2VJbmZvVGVzdC5qYXZhCisrKyBiL3Rlc3RzL2FjY2Vzc2liaWxpdHkvc3JjL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L2N0cy9BY2Nlc3NpYmlsaXR5Tm9kZUluZm9fUmFuZ2VJbmZvVGVzdC5qYXZhCkBAIC0xNiw2ICsxNiw3IEBACiAKIHBhY2thZ2UgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuY3RzOwogCitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlByZXN1Ym1pdDsKIGltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwogaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TbWFsbFRlc3Q7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU5vZGVJbmZvOwpAQCAtMjQsNiArMjUsNyBAQAogLyoqCiAgKiBDbGFzcyBmb3IgdGVzdGluZyB7QGxpbmsgQWNjZXNzaWJpbGl0eU5vZGVJbmZvLlJhbmdlSW5mb30uCiAgKi8KK0BQcmVzdWJtaXQKIHB1YmxpYyBjbGFzcyBBY2Nlc3NpYmlsaXR5Tm9kZUluZm9fUmFuZ2VJbmZvVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CiAKICAgICAvKiogQWxsb3dlZCB0b2xlcmFuY2UgZm9yIGZsb2F0aW5nIHBvaW50IGVxdWFsaXR5IGNvbXBhcmlzb25zLiAqLwpkaWZmIC0tZ2l0IGEvdGVzdHMvYWNjZXNzaWJpbGl0eS9zcmMvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvY3RzL0FjY2Vzc2liaWxpdHlOb2RlUHJvdmlkZXJUZXN0LmphdmEgYi90ZXN0cy9hY2Nlc3NpYmlsaXR5L3NyYy9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9jdHMvQWNjZXNzaWJpbGl0eU5vZGVQcm92aWRlclRlc3QuamF2YQppbmRleCBlZWVlMjM1Li4wYzJhMmRkIDEwMDY0NAotLS0gYS90ZXN0cy9hY2Nlc3NpYmlsaXR5L3NyYy9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9jdHMvQWNjZXNzaWJpbGl0eU5vZGVQcm92aWRlclRlc3QuamF2YQorKysgYi90ZXN0cy9hY2Nlc3NpYmlsaXR5L3NyYy9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9jdHMvQWNjZXNzaWJpbGl0eU5vZGVQcm92aWRlclRlc3QuamF2YQpAQCAtMTYsNiArMTYsNyBAQAogCiBwYWNrYWdlIGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LmN0czsKIAoraW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5QcmVzdWJtaXQ7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OwogaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlOb2RlUHJvdmlkZXI7CkBAIC0yMyw2ICsyNCw3IEBACiAvKioKICAqIENsYXNzIGZvciB0ZXN0aW5nIHtAbGluayBBY2Nlc3NpYmlsaXR5Tm9kZVByb3ZpZGVyfS4KICAqLworQFByZXN1Ym1pdAogcHVibGljIGNsYXNzIEFjY2Vzc2liaWxpdHlOb2RlUHJvdmlkZXJUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKICAgICBAU21hbGxUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRCZWhhdmlvcigpIHsKZGlmZiAtLWdpdCBhL3Rlc3RzL2FjY2Vzc2liaWxpdHkvc3JjL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L2N0cy9BY2Nlc3NpYmlsaXR5UmVjb3JkVGVzdC5qYXZhIGIvdGVzdHMvYWNjZXNzaWJpbGl0eS9zcmMvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvY3RzL0FjY2Vzc2liaWxpdHlSZWNvcmRUZXN0LmphdmEKaW5kZXggNzg2MmNiNC4uNzJiYjRlMCAxMDA2NDQKLS0tIGEvdGVzdHMvYWNjZXNzaWJpbGl0eS9zcmMvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvY3RzL0FjY2Vzc2liaWxpdHlSZWNvcmRUZXN0LmphdmEKKysrIGIvdGVzdHMvYWNjZXNzaWJpbGl0eS9zcmMvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvY3RzL0FjY2Vzc2liaWxpdHlSZWNvcmRUZXN0LmphdmEKQEAgLTE3LDYgKzE3LDcgQEAKIHBhY2thZ2UgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuY3RzOwogCiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5QcmVzdWJtaXQ7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OwogaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKQEAgLTMyLDIyICszMyw4IEBACiAvKioKICAqIENsYXNzIGZvciB0ZXN0aW5nIHtAbGluayBBY2Nlc3NpYmlsaXR5UmVjb3JkfS4KICAqLworQFByZXN1Ym1pdAogcHVibGljIGNsYXNzIEFjY2Vzc2liaWxpdHlSZWNvcmRUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKLQotICAgIC8qKiBUaGUgbnVtYmVyIG9mIHByb3BlcnRpZXMgb2YgdGhlIHtAbGluayBBY2Nlc3NpYmlsaXR5RXZlbnR9IGNsYXNzLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOT05fU1RBVElDX0ZJRUxEX0NPVU5UID0gMjI7Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHRoYXQgbm8gbmV3IGZpZWxkcyBoYXZlIGJlZW4gYWRkZWQgd2l0aG91dCB1cGRhdGluZyB0aGUKLSAgICAgKiBtYXJzaGFsaW5nIHRlc3RzLiBOb3RlIHRoYXQgdGhlIG1hcnNoYWxpbmcgdGVzdHMgYXJlIGluCi0gICAgICogQWNjZXNzaWJpbGl0eUV2ZW50VGVzdHMgc2luY2UgaXQgaXMgYSBzdXBlciBjbGFzcyB0aGF0IGlzCi0gICAgICogcmVzcG9uc2libGUgZm9yIG1hcnNoYWxpbmcgYW5kIHVubWFyc2hhbGluZy4KLSAgICAgKi8KLSAgICBAU21hbGxUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE5vTmV3RmllbGRzQWRkZWRXaXRob3V0VXBkYWRpbmdNYXJzaGFsbFRlc3RzKCkgewotICAgICAgICBhc3NlcnROb05ld05vblN0YXRpY0ZpZWxkc0FkZGVkKEFjY2Vzc2liaWxpdHlSZWNvcmQuY2xhc3MsIE5PTl9TVEFUSUNfRklFTERfQ09VTlQpOwotICAgIH0KLQogICAgIC8qKgogICAgICAqIFRlc3RzIHRoZSBjbG9uaW5nIG9idGFpbiBtZXRob2QuCiAgICAgICovCkBAIC0xOTYsMjQgKzE4Myw0IEBACiAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVkVGV4dEl0ZXJhdG9yLm5leHQoKS50b1N0cmluZygpKTsKICAgICAgICAgfQogICAgIH0KLQotICAgIC8qKgotICAgICAqIEFzc2VydHMgdGhhdCBubyBuZXcgZmllbGRzIGhhdmUgYmVlbiBhZGRlZCwgc28gd2UgYXJlIHRlc3RpbmcgbWFyc2hhbGluZwotICAgICAqIG9mIGFsbCBzdWNoLgotICAgICAqLwotICAgIHN0YXRpYyB2b2lkIGFzc2VydE5vTmV3Tm9uU3RhdGljRmllbGRzQWRkZWQoQ2xhc3M8Pz4gY2xhenosIGludCBleHBlY3RlZENvdW50KSB7Ci0gICAgICAgIGludCBub25TdGF0aWNGaWVsZENvdW50ID0gMDsKLQotICAgICAgICB3aGlsZSAoY2xhenogIT0gT2JqZWN0LmNsYXNzKSB7Ci0gICAgICAgICAgICBmb3IgKEZpZWxkIGZpZWxkIDogY2xhenouZ2V0RGVjbGFyZWRGaWVsZHMoKSkgewotICAgICAgICAgICAgICAgIGlmICgoZmllbGQuZ2V0TW9kaWZpZXJzKCkgJiBNb2RpZmllci5TVEFUSUMpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbm9uU3RhdGljRmllbGRDb3VudCsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNsYXp6ID0gY2xhenouZ2V0U3VwZXJjbGFzcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiTmV3IGZpZWxkcyBoYXZlIGJlZW4gYWRkZWQsIHNvIGFkZCBjb2RlIHRvIHRlc3QgbWFyc2hhbGluZyB0aGVtLiI7Ci0gICAgICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLCBleHBlY3RlZENvdW50LCBub25TdGF0aWNGaWVsZENvdW50KTsKLSAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9hY2Nlc3NpYmlsaXR5L3NyYy9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9jdHMvQWNjZXNzaWJpbGl0eVdpbmRvd0luZm9UZXN0LmphdmEgYi90ZXN0cy9hY2Nlc3NpYmlsaXR5L3NyYy9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9jdHMvQWNjZXNzaWJpbGl0eVdpbmRvd0luZm9UZXN0LmphdmEKaW5kZXggZmZiZTgzMy4uZTk1OTU0NCAxMDA2NDQKLS0tIGEvdGVzdHMvYWNjZXNzaWJpbGl0eS9zcmMvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvY3RzL0FjY2Vzc2liaWxpdHlXaW5kb3dJbmZvVGVzdC5qYXZhCisrKyBiL3Rlc3RzL2FjY2Vzc2liaWxpdHkvc3JjL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L2N0cy9BY2Nlc3NpYmlsaXR5V2luZG93SW5mb1Rlc3QuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogCiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5QcmVzdWJtaXQ7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CkBAIC0yNiw2ICsyNyw3IEBACiAvKioKICAqIENsYXNzIGZvciB0ZXN0aW5nIHtAbGluayBBY2Nlc3NpYmlsaXR5V2luZG93SW5mb30uCiAgKi8KK0BQcmVzdWJtaXQKIHB1YmxpYyBjbGFzcyBBY2Nlc3NpYmlsaXR5V2luZG93SW5mb1Rlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgewogCiAgICAgQFNtYWxsVGVzdApAQCAtNDcsNiArNDksNyBAQAogICAgICAgICBBY2Nlc3NpYmlsaXR5V2luZG93SW5mbyB3MiA9IEFjY2Vzc2liaWxpdHlXaW5kb3dJbmZvLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChwYXJjZWwpOwogICAgICAgICBhc3NlcnROb3RTYW1lKHcxLCB3Mik7CiAgICAgICAgIGFzc2VydFRydWUoYXJlV2luZG93c0VxdWFsKHcxLCB3MikpOworICAgICAgICBwYXJjZWwucmVjeWNsZSgpOwogICAgIH0KIAogICAgIEBTbWFsbFRlc3QKZGlmZiAtLWdpdCBhL3Rlc3RzL2FjY2Vzc2liaWxpdHkvc3JjL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L2N0cy9DYXB0aW9uaW5nTWFuYWdlclRlc3QuamF2YSBiL3Rlc3RzL2FjY2Vzc2liaWxpdHkvc3JjL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L2N0cy9DYXB0aW9uaW5nTWFuYWdlclRlc3QuamF2YQppbmRleCA4NmM2ZjQxLi5kMGRiODY4IDEwMDY0NAotLS0gYS90ZXN0cy9hY2Nlc3NpYmlsaXR5L3NyYy9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9jdHMvQ2FwdGlvbmluZ01hbmFnZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvYWNjZXNzaWJpbGl0eS9zcmMvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvY3RzL0NhcHRpb25pbmdNYW5hZ2VyVGVzdC5qYXZhCkBAIC0xNiwxOSArMTYsNiBAQAogCiBwYWNrYWdlIGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LmN0czsKIAotaW1wb3J0IGFuZHJvaWQuYXBwLlVpQXV0b21hdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOwotaW1wb3J0IGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0Q2FzZTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5DYXB0aW9uaW5nTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5DYXB0aW9uaW5nTWFuYWdlci5DYXB0aW9uU3R5bGU7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQ2FwdGlvbmluZ01hbmFnZXIuQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG87Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5NYXRjaGVycy5hbnlGbG9hdDsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTWF0Y2hlcnMuYW55T2JqZWN0OwogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLm1vY2s7CkBAIC0zNiw2ICsyMywyMCBAQAogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnZlcmlmeTsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by52ZXJpZnlaZXJvSW50ZXJhY3Rpb25zOwogCitpbXBvcnQgYW5kcm9pZC5hcHAuVWlBdXRvbWF0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3I7CitpbXBvcnQgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RDYXNlOworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkNhcHRpb25pbmdNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkNhcHRpb25pbmdNYW5hZ2VyLkNhcHRpb25TdHlsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5DYXB0aW9uaW5nTWFuYWdlci5DYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXI7CisKK2ltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvOworCitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKIC8qKgogICogVGVzdHMgd2hldGhlciB0aGUgQ2FwdGlvbmluZ01hbmFnZXIgQVBJcyBhcmUgZnVuY3Rpb25hbC4KICAqLwpkaWZmIC0tZ2l0IGEvdGVzdHMvYWNjZXNzaWJpbGl0eS9zcmMvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvY3RzL1NlcnZpY2VDb250cm9sVXRpbHMuamF2YSBiL3Rlc3RzL2FjY2Vzc2liaWxpdHkvc3JjL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L2N0cy9TZXJ2aWNlQ29udHJvbFV0aWxzLmphdmEKaW5kZXggOTc4M2NiOC4uNWU4NzU1ZiAxMDA2NDQKLS0tIGEvdGVzdHMvYWNjZXNzaWJpbGl0eS9zcmMvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvY3RzL1NlcnZpY2VDb250cm9sVXRpbHMuamF2YQorKysgYi90ZXN0cy9hY2Nlc3NpYmlsaXR5L3NyYy9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9jdHMvU2VydmljZUNvbnRyb2xVdGlscy5qYXZhCkBAIC0xNiw2ICsxNiwxMCBAQAogCiBwYWNrYWdlIGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LmN0czsKIAoraW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5jb3JlLklzRXF1YWwuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCiBpbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOwogaW1wb3J0IGFuZHJvaWQuYXBwLlVpQXV0b21hdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwpAQCAtMjgsMTIgKzMyLDEzIEBACiBpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOwogCiAvKioKICAqIFV0aWxpdHkgbWV0aG9kcyBmb3IgZW5hYmxpbmcgYW5kIGRpc2FibGluZyB0aGUgc2VydmljZXMgdXNlZCBpbiB0aGlzIHBhY2thZ2UKICAqLwogcHVibGljIGNsYXNzIFNlcnZpY2VDb250cm9sVXRpbHMgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUSU1FT1VUX0ZPUl9TRVJWSUNFX0VOQUJMRSA9IDEwMDAwOyAvLyBtaWxsaXM7IDEwcworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRJTUVPVVRfRk9SX1NFUlZJQ0VfRU5BQkxFID0gMTAwMDA7IC8vIG1pbGxpczsgMTBzCiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VUVElOR19FTkFCTEVfU1BFQUtJTkdfQU5EX1ZJQlJBVElOR19TRVJWSUNFUyA9CiAgICAgICAgICAgICAiYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuY3RzLy5TcGVha2luZ0FjY2Vzc2liaWxpdHlTZXJ2aWNlOiIKQEAgLTE4MSwyOCArMTg2LDMyIEBACiAgICAgICAgIGZpbmFsIE9iamVjdCB3YWl0TG9ja0ZvckExMXlPZmYgPSBuZXcgT2JqZWN0KCk7CiAgICAgICAgIEFjY2Vzc2liaWxpdHlNYW5hZ2VyIG1hbmFnZXIgPSAoQWNjZXNzaWJpbGl0eU1hbmFnZXIpIGluc3RydW1lbnRhdGlvbgogICAgICAgICAgICAgICAgIC5nZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkFDQ0VTU0lCSUxJVFlfU0VSVklDRSk7Ci0gICAgICAgIG1hbmFnZXIuYWRkQWNjZXNzaWJpbGl0eVN0YXRlQ2hhbmdlTGlzdGVuZXIoCi0gICAgICAgICAgICAgICAgbmV3IEFjY2Vzc2liaWxpdHlNYW5hZ2VyLkFjY2Vzc2liaWxpdHlTdGF0ZUNoYW5nZUxpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25BY2Nlc3NpYmlsaXR5U3RhdGVDaGFuZ2VkKGJvb2xlYW4gYikgewotICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh3YWl0TG9ja0ZvckExMXlPZmYpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0TG9ja0ZvckExMXlPZmYubm90aWZ5QWxsKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgbG9uZyB0aW1lb3V0VGltZU1pbGxpcyA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpICsgVElNRU9VVF9GT1JfU0VSVklDRV9FTkFCTEU7Ci0gICAgICAgIHdoaWxlIChTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSA8IHRpbWVvdXRUaW1lTWlsbGlzKSB7CisgICAgICAgIC8vIFVwZGF0ZXMgdG8gbWFuYWdlci5pc0VuYWJsZWQoKSBhcmVuJ3Qgc3luY2hyb25pemVkCisgICAgICAgIEF0b21pY0Jvb2xlYW4gYWNjZXNzaWJpbGl0eUVuYWJsZWQgPSBuZXcgQXRvbWljQm9vbGVhbihtYW5hZ2VyLmlzRW5hYmxlZCgpKTsKKyAgICAgICAgQWNjZXNzaWJpbGl0eU1hbmFnZXIuQWNjZXNzaWJpbGl0eVN0YXRlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSAoYm9vbGVhbiBiKSAtPiB7CiAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHdhaXRMb2NrRm9yQTExeU9mZikgewotICAgICAgICAgICAgICAgIGlmICghbWFuYWdlci5pc0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHdhaXRMb2NrRm9yQTExeU9mZi53YWl0KHRpbWVvdXRUaW1lTWlsbGlzIC0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlZDsgbG9vcCBhZ2FpbgorICAgICAgICAgICAgICAgIHdhaXRMb2NrRm9yQTExeU9mZi5ub3RpZnlBbGwoKTsKKyAgICAgICAgICAgICAgICBhY2Nlc3NpYmlsaXR5RW5hYmxlZC5zZXQoYik7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIG1hbmFnZXIuYWRkQWNjZXNzaWJpbGl0eVN0YXRlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbG9uZyB0aW1lb3V0VGltZU1pbGxpcyA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpICsgVElNRU9VVF9GT1JfU0VSVklDRV9FTkFCTEU7CisgICAgICAgICAgICB3aGlsZSAoU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkgPCB0aW1lb3V0VGltZU1pbGxpcykgeworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAod2FpdExvY2tGb3JBMTF5T2ZmKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYWNjZXNzaWJpbGl0eUVuYWJsZWQuZ2V0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgd2FpdExvY2tGb3JBMTF5T2ZmLndhaXQodGltZW91dFRpbWVNaWxsaXMgLSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZWQ7IGxvb3AgYWdhaW4KKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIG1hbmFnZXIucmVtb3ZlQWNjZXNzaWJpbGl0eVN0YXRlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwogICAgICAgICB9Ci0gICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmFibGUgdG8gdHVybiBhY2Nlc3NpYmlsaXR5IG9mZiIpOworICAgICAgICBhc3NlcnRUaGF0KCJVbmFibGUgdG8gdHVybiBhY2Nlc3NpYmlsaXR5IG9mZiIsIG1hbmFnZXIuaXNFbmFibGVkKCksIGlzKGVxdWFsVG8oZmFsc2UpKSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2UvQW5kcm9pZC5tayBiL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL0FuZHJvaWQubWsKaW5kZXggOWEzYmJlMi4uOWIyMzY5YyAxMDA2NDQKLS0tIGEvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2UvQW5kcm9pZC5taworKysgYi90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9BbmRyb2lkLm1rCkBAIC0xOSwxNyArMTksMjIgQEAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCiAKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCi0JY3RzdGVzdHJ1bm5lciBcCi0JbW9ja2l0by10YXJnZXQtbWludXMtanVuaXQ0IFwKLQlsZWdhY3ktYW5kcm9pZC10ZXN0CisgICAgY3RzdGVzdHJ1bm5lci1heHQgaGFtY3Jlc3QtbGlicmFyeSBcCisgICAgbW9ja2l0by10YXJnZXQtbWludXMtanVuaXQ0IFwKKyAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBcCisgICAgcGxhdGZvcm0tdGVzdC1hbm5vdGF0aW9ucworCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzIGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIAogIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzIGN0c19pbnN0YW50CiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNBY2Nlc3NpYmlsaXR5U2VydmljZVRlc3RDYXNlcwogCiBMT0NBTF9TREtfVkVSU0lPTiA6PSB0ZXN0X2N1cnJlbnQKIAogaW5jbHVkZSAkKEJVSUxEX0NUU19QQUNLQUdFKQorCitpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCmRpZmYgLS1naXQgYS90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2UvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBjNDBmN2FhLi40YzAyODRhIDEwMDY0NAotLS0gYS90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTE2LDcgKzE2LDggQEAKICAtLT4KIAogPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgICBwYWNrYWdlPSJhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLmN0cyI+CisgICAgICAgICAgcGFja2FnZT0iYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHMiCisgICAgICAgICAgYW5kcm9pZDp0YXJnZXRTYW5kYm94VmVyc2lvbj0iMiI+CiAKICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkRJU0FCTEVfS0VZR1VBUkQiIC8+CiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9TRUNVUkVfU0VUVElOR1MiIC8+CkBAIC0yOCwzNiArMjksNDcgQEAKIAogICAgICAgICA8YWN0aXZpdHkKICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYWNjZXNzaWJpbGl0eV9lbmRfdG9fZW5kX3Rlc3RfYWN0aXZpdHkiCi0gICAgICAgICAgICBhbmRyb2lkOm5hbWU9Ii5BY2Nlc3NpYmlsaXR5RW5kVG9FbmRBY3Rpdml0eSIgLz4KKyAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iLmFjdGl2aXRpZXMuQWNjZXNzaWJpbGl0eUVuZFRvRW5kQWN0aXZpdHkiCisgICAgICAgICAgICBhbmRyb2lkOnNjcmVlbk9yaWVudGF0aW9uPSJsb2NrZWQiLz4KIAogICAgICAgICA8YWN0aXZpdHkKICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYWNjZXNzaWJpbGl0eV9xdWVyeV93aW5kb3dfdGVzdF9hY3Rpdml0eSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iLkFjY2Vzc2liaWxpdHlXaW5kb3dRdWVyeUFjdGl2aXR5IgotICAgICAgICAgICAgYW5kcm9pZDpzdXBwb3J0c1BpY3R1cmVJblBpY3R1cmU9InRydWUiIC8+CisgICAgICAgICAgICBhbmRyb2lkOm5hbWU9Ii5hY3Rpdml0aWVzLkFjY2Vzc2liaWxpdHlXaW5kb3dRdWVyeUFjdGl2aXR5IgorICAgICAgICAgICAgYW5kcm9pZDpzdXBwb3J0c1BpY3R1cmVJblBpY3R1cmU9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOnNjcmVlbk9yaWVudGF0aW9uPSJsb2NrZWQiLz4KIAogICAgICAgICA8YWN0aXZpdHkKICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYWNjZXNzaWJpbGl0eV92aWV3X3RyZWVfcmVwb3J0aW5nX3Rlc3RfYWN0aXZpdHkiCi0gICAgICAgICAgICBhbmRyb2lkOm5hbWU9Ii5BY2Nlc3NpYmlsaXR5Vmlld1RyZWVSZXBvcnRpbmdBY3Rpdml0eSIgLz4KKyAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iLmFjdGl2aXRpZXMuQWNjZXNzaWJpbGl0eVZpZXdUcmVlUmVwb3J0aW5nQWN0aXZpdHkiCisgICAgICAgICAgICBhbmRyb2lkOnNjcmVlbk9yaWVudGF0aW9uPSJsb2NrZWQiLz4KIAogICAgICAgICA8YWN0aXZpdHkKICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYWNjZXNzaWJpbGl0eV9mb2N1c19hbmRfaW5wdXRfZm9jdXNfc3luY190ZXN0X2FjdGl2aXR5IgotICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSIuQWNjZXNzaWJpbGl0eUZvY3VzQW5kSW5wdXRGb2N1c1N5bmNBY3Rpdml0eSIgLz4KKyAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iLmFjdGl2aXRpZXMuQWNjZXNzaWJpbGl0eUZvY3VzQW5kSW5wdXRGb2N1c1N5bmNBY3Rpdml0eSIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2NyZWVuT3JpZW50YXRpb249ImxvY2tlZCIvPgogCiAgICAgICAgIDxhY3Rpdml0eQogICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9hY2Nlc3NpYmlsaXR5X3RleHRfdHJhdmVyc2FsX3Rlc3RfYWN0aXZpdHkiCi0gICAgICAgICAgICBhbmRyb2lkOm5hbWU9Ii5BY2Nlc3NpYmlsaXR5VGV4dFRyYXZlcnNhbEFjdGl2aXR5Ii8+CisgICAgICAgICAgICBhbmRyb2lkOm5hbWU9Ii5hY3Rpdml0aWVzLkFjY2Vzc2liaWxpdHlUZXh0VHJhdmVyc2FsQWN0aXZpdHkiCisgICAgICAgICAgICBhbmRyb2lkOnNjcmVlbk9yaWVudGF0aW9uPSJsb2NrZWQiLz4KIAogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpsYWJlbD0iQWN0aXZpdHkgZm9yIHRlc3Rpbmcgd2luZG93IGFjY2Vzc2liaWxpdHkgcmVwb3J0aW5nIgotICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iLkFjY2Vzc2liaWxpdHlXaW5kb3dSZXBvcnRpbmdBY3Rpdml0eSIvPgorICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iLmFjdGl2aXRpZXMuQWNjZXNzaWJpbGl0eVdpbmRvd1JlcG9ydGluZ0FjdGl2aXR5IgorICAgICAgICAgICAgIGFuZHJvaWQ6c3VwcG9ydHNQaWN0dXJlSW5QaWN0dXJlPSJ0cnVlIgorICAgICAgICAgICAgIGFuZHJvaWQ6c2NyZWVuT3JpZW50YXRpb249ImxvY2tlZCIvPgogCiAgICAgICAgIDxhY3Rpdml0eQogICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iRnVsbCBzY3JlZW4gYWN0aXZpdHkgZm9yIGdlc3R1cmUgZGlzcGF0Y2ggdGVzdGluZyIKICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iLkFjY2Vzc2liaWxpdHlHZXN0dXJlRGlzcGF0Y2hUZXN0JEdlc3R1cmVEaXNwYXRjaEFjdGl2aXR5IgotICAgICAgICAgICAgYW5kcm9pZDpzY3JlZW5PcmllbnRhdGlvbj0icG9ydHJhaXQiIC8+CisgICAgICAgICAgICBhbmRyb2lkOnNjcmVlbk9yaWVudGF0aW9uPSJsb2NrZWQiIC8+CisKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2FjY2Vzc2liaWxpdHlfc29mdF9rZXlib2FyZF9tb2Rlc19hY3Rpdml0eSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iLkFjY2Vzc2liaWxpdHlTb2Z0S2V5Ym9hcmRNb2Rlc1Rlc3QkU29mdEtleWJvYXJkTW9kZXNBY3Rpdml0eSIgLz4KIAogICAgICAgICA8c2VydmljZQotICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSIuU3R1Ykdlc3R1cmVBY2Nlc3NpYmlsaXR5U2VydmljZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6cGVybWlzc2lvbj0iYW5kcm9pZC5wZXJtaXNzaW9uLkJJTkRfQUNDRVNTSUJJTElUWV9TRVJWSUNFIj4KKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9Ii5TdHViR2VzdHVyZUFjY2Vzc2liaWxpdHlTZXJ2aWNlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGVybWlzc2lvbj0iYW5kcm9pZC5wZXJtaXNzaW9uLkJJTkRfQUNDRVNTSUJJTElUWV9TRVJWSUNFIj4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlIiAvPgogICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuY2F0ZWdvcnkuRkVFREJBQ0tfR0VORVJJQyIgLz4KQEAgLTY5LDIxICs4MSwxNyBAQAogICAgICAgICA8L3NlcnZpY2U+CiAKICAgICAgICAgPHNlcnZpY2UKLSAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iLkFjY2Vzc2liaWxpdHlHZXN0dXJlRGV0ZWN0b3JUZXN0JFN0dWJTZXJ2aWNlIgotICAgICAgICAgICAgYW5kcm9pZDpwZXJtaXNzaW9uPSJhbmRyb2lkLnBlcm1pc3Npb24uQklORF9BQ0NFU1NJQklMSVRZX1NFUlZJQ0UiPgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iLkFjY2Vzc2liaWxpdHlHZXN0dXJlRGV0ZWN0b3JUZXN0JFN0dWJTZXJ2aWNlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGVybWlzc2lvbj0iYW5kcm9pZC5wZXJtaXNzaW9uLkJJTkRfQUNDRVNTSUJJTElUWV9TRVJWSUNFIj4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlIiAvPgogICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuY2F0ZWdvcnkuRkVFREJBQ0tfR0VORVJJQyIgLz4KICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KICAgICAgICAgICAgIDxtZXRhLWRhdGEKLSAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpyZXNvdXJjZT0iQHhtbC9zdHViX2dlc3R1cmVfZGV0ZWN0X2ExMXlfc2VydmljZSIgLz4KKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnJlc291cmNlPSJAeG1sL3N0dWJfZ2VzdHVyZV9kZXRlY3RfYTExeV9zZXJ2aWNlIiAvPgogICAgICAgICA8L3NlcnZpY2U+CiAKLSAgICAgICAgPGFjdGl2aXR5Ci0gICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2FjY2Vzc2liaWxpdHlfc29mdF9rZXlib2FyZF9tb2Rlc19hY3Rpdml0eSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iLkFjY2Vzc2liaWxpdHlTb2Z0S2V5Ym9hcmRNb2Rlc1Rlc3QkU29mdEtleWJvYXJkTW9kZXNBY3Rpdml0eSIgLz4KLQogICAgICAgICA8c2VydmljZQogICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSIuSW5zdHJ1bWVudGVkQWNjZXNzaWJpbGl0eVNlcnZpY2UiCiAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3RpdGxlX3NvZnRfa2V5Ym9hcmRfbW9kZXNfYWNjZXNzaWJpbGl0eV9zZXJ2aWNlIgpAQCAtMTM5LDcgKzE0Nyw3IEBACiAgICAgPC9hcHBsaWNhdGlvbj4KIAogICAgIDxpbnN0cnVtZW50YXRpb24KLSAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLmN0cyIKICAgICAgICAgYW5kcm9pZDpsYWJlbD0iVGVzdHMgZm9yIHRoZSBhY2Nlc3NpYmlsaXR5IEFQSXMuIj4KICAgICAgICAgPG1ldGEtZGF0YQpkaWZmIC0tZ2l0IGEvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2UvQW5kcm9pZFRlc3QueG1sIGIvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2UvQW5kcm9pZFRlc3QueG1sCmluZGV4IDZlZGZlOGQuLjIwYThiZmYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL0FuZHJvaWRUZXN0LnhtbAorKysgYi90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDExICsxNCwyMCBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIGFjY2Vzc2liaWxpdHkgc2VydmljZSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iZnJhbWV3b3JrIiAvPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuUnVuQ29tbWFuZFRhcmdldFByZXBhcmVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJydW4tY29tbWFuZCIgdmFsdWU9ImNtZCBhY2Nlc3NpYmlsaXR5IHNldC1iaW5kLWluc3RhbnQtc2VydmljZS1hbGxvd2VkIHRydWUiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVhcmRvd24tY29tbWFuZCIgdmFsdWU9ImNtZCBhY2Nlc3NpYmlsaXR5IHNldC1iaW5kLWluc3RhbnQtc2VydmljZS1hbGxvd2VkIGZhbHNlIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJDdHNBY2Nlc3NpYmlsaXR5U2VydmljZVRlc3RDYXNlcy5hcGsiIC8+CiAgICAgPC90YXJnZXRfcHJlcGFyZXI+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0FjY2Vzc2liaWxpdHlXaWRnZXRQcm92aWRlci5hcGsiIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CiAgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkFuZHJvaWRKVW5pdFRlc3QiID4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJwYWNrYWdlIiB2YWx1ZT0iYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHMiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icnVudGltZS1oaW50IiB2YWx1ZT0iMm0xMnMiIC8+CmRpZmYgLS1naXQgYS90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9yZXMvbGF5b3V0L2FjY2Vzc2liaWxpdHlfZm9jdXNfYW5kX2lucHV0X2ZvY3VzX3N5bmNfdGVzdC54bWwgYi90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9yZXMvbGF5b3V0L2FjY2Vzc2liaWxpdHlfZm9jdXNfYW5kX2lucHV0X2ZvY3VzX3N5bmNfdGVzdC54bWwKaW5kZXggY2IzZDE1My4uNmE3Y2NmNSAxMDA2NDQKLS0tIGEvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2UvcmVzL2xheW91dC9hY2Nlc3NpYmlsaXR5X2ZvY3VzX2FuZF9pbnB1dF9mb2N1c19zeW5jX3Rlc3QueG1sCisrKyBiL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3Jlcy9sYXlvdXQvYWNjZXNzaWJpbGl0eV9mb2N1c19hbmRfaW5wdXRfZm9jdXNfc3luY190ZXN0LnhtbApAQCAtNzcsNiArNzcsNyBAQAogICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3NlY29uZEJ1dHRvbiIKICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgIGFuZHJvaWQ6c2NyZWVuUmVhZGVyRm9jdXNhYmxlPSJ0cnVlIgogICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc2Vjb25kQnV0dG9uIiAvPgogCiAgICAgICA8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3Jlcy9sYXlvdXQvZW5kX3RvX2VuZF90ZXN0LnhtbCBiL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3Jlcy9sYXlvdXQvZW5kX3RvX2VuZF90ZXN0LnhtbAppbmRleCA3OWY4N2RjLi5hNmM3MzhjIDEwMDY0NAotLS0gYS90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9yZXMvbGF5b3V0L2VuZF90b19lbmRfdGVzdC54bWwKKysrIGIvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2UvcmVzL2xheW91dC9lbmRfdG9fZW5kX3Rlc3QueG1sCkBAIC0yOSwxNiArMjksMjggQEAKICAgICA8RWRpdFRleHQgYW5kcm9pZDppZD0iQCtpZC9lZGl0dGV4dCIKICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3RleHRfaW5wdXRfYmxhaCIKICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCI+CisgICAgICAgICAgICAgIGFuZHJvaWQ6YWNjZXNzaWJpbGl0eUhlYWRpbmc9InRydWUiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgICAgICAgYW5kcm9pZDphY2Nlc3NpYmlsaXR5VHJhdmVyc2FsQWZ0ZXI9IkAraWQvYnV0dG9uV2l0aFRvb2x0aXAiPgogICAgIDwvRWRpdFRleHQ+CiAKICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiPgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiPgogICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvYnV0dG9uIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b25fdGl0bGUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDphY2Nlc3NpYmlsaXR5UGFuZVRpdGxlPSJAc3RyaW5nL3BhbmVUaXRsZSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiBhbmRyb2lkOmJ1ZmZlclR5cGU9Im5vcm1hbCI+CisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpidWZmZXJUeXBlPSJub3JtYWwiPgorICAgICAgICA8L0J1dHRvbj4KKyAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAaWQvYnV0dG9uV2l0aFRvb2x0aXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbl90aXRsZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRvb2x0aXBUZXh0PSJAc3RyaW5nL2J1dHRvbl90b29sdGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpidWZmZXJUeXBlPSJub3JtYWwiCisgICAgICAgICAgICAgICAgYW5kcm9pZDphY2Nlc3NpYmlsaXR5VHJhdmVyc2FsQmVmb3JlPSJAaWQvZWRpdHRleHQiPgogICAgICAgICA8L0J1dHRvbj4KICAgICA8L0xpbmVhckxheW91dD4KIApkaWZmIC0tZ2l0IGEvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2UvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKaW5kZXggMmUzZDVkZC4uYWQ1ZDNmZCAxMDA2NDQKLS0tIGEvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2UvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAorKysgYi90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCkBAIC0zNCw2ICszNCw4IEBACiAgICAgPCEtLSBTdHJpbmcgdGl0bGUgb2YgdGhlIGJ1dHRvbiAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImJ1dHRvbl90aXRsZSI+Q2xpY2sgbWU8L3N0cmluZz4KIAorICAgIDxzdHJpbmcgbmFtZT0iYnV0dG9uX3Rvb2x0aXAiPk5ldmVyIHByZXNzIHRoaXMgYnV0dG9uPC9zdHJpbmc+CisKICAgICA8IS0tIFN0cmluZyB2YWx1ZSBvZiB0aGUgZmlyc3QgbGlzdCBpdGVtIC0tPgogICAgIDxzdHJpbmcgbmFtZT0iZmlyc3RfbGlzdF9pdGVtIj5GaXJzdCBsaXN0IGl0ZW08L3N0cmluZz4KIApAQCAtMTIyLDYgKzEyNCw4IEBACiAgICAgPCEtLSBTdHJpbmcgc2Vjb25kIEJ1dHRvbiB0ZXh0IC0tPgogICAgIDxzdHJpbmcgbmFtZT0ic2Vjb25kQnV0dG9uIj5zQjwvc3RyaW5nPgogCisgICAgPHN0cmluZyBuYW1lPSJwYW5lVGl0bGUiPlBhbmUgVGl0bGU8L3N0cmluZz4KKwogICAgIDwhLS0gU3RyaW5nIHRpdGxlIG9mIHRoZSBhY2Nlc3NpYmlsaXR5IGZvY3VzIGFuZCBpbnB1dCBmb2N1cyBzeW5jIHRlc3QgYWN0aXZpdHkgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJhY2Nlc3NpYmlsaXR5X2ZvY3VzX2FuZF9pbnB1dF9mb2N1c19zeW5jX3Rlc3RfYWN0aXZpdHkiPkFjY2Vzc2liaWxpdHkgZm9jdXMgYW5kIGlucHV0IGZvY3VzIHN5bmMgdGVzdDwvc3RyaW5nPgogCkBAIC0xMzUsNiArMTM5LDggQEAKIAogICAgIDxzdHJpbmcgbmFtZT0iYV9iIj5BIEI8L3N0cmluZz4KIAorICAgIDxzdHJpbmcgbmFtZT0iZ2VybWFuX3RleHRfd2l0aF9zdHJvbmdfcyI+w588L3N0cmluZz4KKwogICAgIDxzdHJpbmcgbmFtZT0iYW5kcm9pZF93aWtpX3NlYXJjaCI+QW5kcm9pZCBpcyBhIExpbnV4LWJhc2VkPC9zdHJpbmc+CiAKICAgICA8c3RyaW5nIG5hbWU9ImZvb19iYXJfYmF6Ij5Gb28gYmFyIGJhei48L3N0cmluZz4KZGlmZiAtLWdpdCBhL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3Jlcy94bWwvc3R1Yl9nZXN0dXJlX2Rpc3BhdGNoX2ExMXlfc2VydmljZS54bWwgYi90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9yZXMveG1sL3N0dWJfZ2VzdHVyZV9kaXNwYXRjaF9hMTF5X3NlcnZpY2UueG1sCmluZGV4IDkxMmM5YzQuLmY0ZjYwODkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3Jlcy94bWwvc3R1Yl9nZXN0dXJlX2Rpc3BhdGNoX2ExMXlfc2VydmljZS54bWwKKysrIGIvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2UvcmVzL3htbC9zdHViX2dlc3R1cmVfZGlzcGF0Y2hfYTExeV9zZXJ2aWNlLnhtbApAQCAtMTYsOSArMTYsOSBAQAogLS0+CiAKIDxhY2Nlc3NpYmlsaXR5LXNlcnZpY2UgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmRlc2NyaXB0aW9uPSJAc3RyaW5nL3N0dWJfZ2VzdHVyZV9kaXNwYXRjaF9hMTF5X3NlcnZpY2VfZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6YWNjZXNzaWJpbGl0eUV2ZW50VHlwZXM9InR5cGVBbGxNYXNrIgotICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmFjY2Vzc2liaWxpdHlGZWVkYmFja1R5cGU9ImZlZWRiYWNrR2VuZXJpYyIKLSAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDphY2Nlc3NpYmlsaXR5RmxhZ3M9ImZsYWdEZWZhdWx0IgotICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmNhblBlcmZvcm1HZXN0dXJlcz0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpub3RpZmljYXRpb25UaW1lb3V0PSIwIiAvPgorICAgICAgICBhbmRyb2lkOmRlc2NyaXB0aW9uPSJAc3RyaW5nL3N0dWJfZ2VzdHVyZV9kaXNwYXRjaF9hMTF5X3NlcnZpY2VfZGVzY3JpcHRpb24iCisgICAgICAgIGFuZHJvaWQ6YWNjZXNzaWJpbGl0eUV2ZW50VHlwZXM9InR5cGVBbGxNYXNrIgorICAgICAgICBhbmRyb2lkOmFjY2Vzc2liaWxpdHlGZWVkYmFja1R5cGU9ImZlZWRiYWNrR2VuZXJpYyIKKyAgICAgICAgYW5kcm9pZDphY2Nlc3NpYmlsaXR5RmxhZ3M9ImZsYWdEZWZhdWx0IgorICAgICAgICBhbmRyb2lkOmNhblBlcmZvcm1HZXN0dXJlcz0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpub3RpZmljYXRpb25UaW1lb3V0PSIwIiAvPgpkaWZmIC0tZ2l0IGEvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2UvcmVzL3htbC9zdHViX21hZ25pZmljYXRpb25fYTExeV9zZXJ2aWNlLnhtbCBiL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3Jlcy94bWwvc3R1Yl9tYWduaWZpY2F0aW9uX2ExMXlfc2VydmljZS54bWwKaW5kZXggMTEwZjc0MS4uMjU1OTM5MiAxMDA2NDQKLS0tIGEvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2UvcmVzL3htbC9zdHViX21hZ25pZmljYXRpb25fYTExeV9zZXJ2aWNlLnhtbAorKysgYi90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9yZXMveG1sL3N0dWJfbWFnbmlmaWNhdGlvbl9hMTF5X3NlcnZpY2UueG1sCkBAIC0xNSwxMCArMTUsMTEgQEAKIC0tPgogCiA8YWNjZXNzaWJpbGl0eS1zZXJ2aWNlIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmFjY2Vzc2liaWxpdHlFdmVudFR5cGVzPSJ0eXBlQWxsTWFzayIKLSAgICBhbmRyb2lkOmFjY2Vzc2liaWxpdHlGZWVkYmFja1R5cGU9ImZlZWRiYWNrR2VuZXJpYyIKLSAgICBhbmRyb2lkOmNhblJldHJpZXZlV2luZG93Q29udGVudD0idHJ1ZSIKLSAgICBhbmRyb2lkOmNhblJlcXVlc3RUb3VjaEV4cGxvcmF0aW9uTW9kZT0idHJ1ZSIKLSAgICBhbmRyb2lkOmNhblJlcXVlc3RFbmhhbmNlZFdlYkFjY2Vzc2liaWxpdHk9InRydWUiCi0gICAgYW5kcm9pZDpjYW5SZXF1ZXN0RmlsdGVyS2V5RXZlbnRzPSJ0cnVlIgotICAgIGFuZHJvaWQ6Y2FuQ29udHJvbE1hZ25pZmljYXRpb249InRydWUiIC8+CisgICAgICAgIGFuZHJvaWQ6YWNjZXNzaWJpbGl0eUV2ZW50VHlwZXM9InR5cGVBbGxNYXNrIgorICAgICAgICBhbmRyb2lkOmFjY2Vzc2liaWxpdHlGZWVkYmFja1R5cGU9ImZlZWRiYWNrR2VuZXJpYyIKKyAgICAgICAgYW5kcm9pZDpjYW5SZXRyaWV2ZVdpbmRvd0NvbnRlbnQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6Y2FuUmVxdWVzdFRvdWNoRXhwbG9yYXRpb25Nb2RlPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmNhblJlcXVlc3RFbmhhbmNlZFdlYkFjY2Vzc2liaWxpdHk9InRydWUiCisgICAgICAgIGFuZHJvaWQ6Y2FuUmVxdWVzdEZpbHRlcktleUV2ZW50cz0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpjYW5Db250cm9sTWFnbmlmaWNhdGlvbj0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpjYW5QZXJmb3JtR2VzdHVyZXM9InRydWUiLz4KZGlmZiAtLWdpdCBhL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy9BY2Nlc3NpYmlsaXR5QnV0dG9uVGVzdC5qYXZhIGIvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2Uvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvY3RzL0FjY2Vzc2liaWxpdHlCdXR0b25UZXN0LmphdmEKaW5kZXggODUyMWE1Ni4uNWM4Y2YzMSAxMDA2NDQKLS0tIGEvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2Uvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvY3RzL0FjY2Vzc2liaWxpdHlCdXR0b25UZXN0LmphdmEKKysrIGIvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2Uvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvY3RzL0FjY2Vzc2liaWxpdHlCdXR0b25UZXN0LmphdmEKQEAgLTE2LDEyICsxNiwxMyBAQAogCiBpbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5QnV0dG9uQ29udHJvbGxlcjsKIGltcG9ydCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb247Ci1pbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkFmdGVyOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApAQCAtNjMsNiArNjQsNyBAQAogICAgIH0KIAogICAgIEBUZXN0CisgICAgQEFwcE1vZGVGdWxsCiAgICAgcHVibGljIHZvaWQgdGVzdENhbGxiYWNrUmVnaXN0cmF0aW9uVW5yZWdpc3RyYXRpb25fc2VydmljZURvZXNOb3RDcmFzaCgpIHsKICAgICAgICAgbUJ1dHRvbkNvbnRyb2xsZXIucmVnaXN0ZXJBY2Nlc3NpYmlsaXR5QnV0dG9uQ2FsbGJhY2sobVN0dWJDYWxsYmFjayk7CiAgICAgICAgIG1CdXR0b25Db250cm9sbGVyLnVucmVnaXN0ZXJBY2Nlc3NpYmlsaXR5QnV0dG9uQ2FsbGJhY2sobVN0dWJDYWxsYmFjayk7CmRpZmYgLS1naXQgYS90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9jdHMvQWNjZXNzaWJpbGl0eUVuZFRvRW5kQWN0aXZpdHkuamF2YSBiL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy9BY2Nlc3NpYmlsaXR5RW5kVG9FbmRBY3Rpdml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTI2YWM3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy9BY2Nlc3NpYmlsaXR5RW5kVG9FbmRBY3Rpdml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHM7Ci0KLWltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLmN0cy5SOwotCi1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5CYXNlQWRhcHRlcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGFuIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eX0gdXNlZCB0byBwZXJmb3JtIGVuZC10by1lbmQKLSAqIHRlc3Rpbmcgb2YgdGhlIGFjY2Vzc2liaWxpdHkgZmVhdHVyZSBieSBpbnRlcmFjdGlvbiB3aXRoIHRoZQotICogVUkgd2lkZ2V0cy4KLSAqLwotcHVibGljIGNsYXNzIEFjY2Vzc2liaWxpdHlFbmRUb0VuZEFjdGl2aXR5IGV4dGVuZHMgQWNjZXNzaWJpbGl0eVRlc3RBY3Rpdml0eSB7Ci0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwotICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5lbmRfdG9fZW5kX3Rlc3QpOwotCi0gICAgICAgIExpc3RBZGFwdGVyIGxpc3RBZGFwdGVyID0gbmV3IEJhc2VBZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIFZpZXcgZ2V0VmlldyhpbnQgcG9zaXRpb24sIFZpZXcgY29udmVydFZpZXcsIFZpZXdHcm91cCBwYXJlbnQpIHsKLSAgICAgICAgICAgICAgICBUZXh0VmlldyB0ZXh0VmlldyA9IChUZXh0VmlldykgVmlldwotICAgICAgICAgICAgICAgICAgICAgICAgLmluZmxhdGUoQWNjZXNzaWJpbGl0eUVuZFRvRW5kQWN0aXZpdHkudGhpcywgUi5sYXlvdXQubGlzdF92aWV3X3JvdywgbnVsbCk7Ci0gICAgICAgICAgICAgICAgdGV4dFZpZXcuc2V0VGV4dCgoU3RyaW5nKSBnZXRJdGVtKHBvc2l0aW9uKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRleHRWaWV3OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgbG9uZyBnZXRJdGVtSWQoaW50IHBvc2l0aW9uKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGdldEl0ZW0oaW50IHBvc2l0aW9uKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFjY2Vzc2liaWxpdHlFbmRUb0VuZEFjdGl2aXR5LnRoaXMuZ2V0U3RyaW5nKFIuc3RyaW5nLmZpcnN0X2xpc3RfaXRlbSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFjY2Vzc2liaWxpdHlFbmRUb0VuZEFjdGl2aXR5LnRoaXMuZ2V0U3RyaW5nKFIuc3RyaW5nLnNlY29uZF9saXN0X2l0ZW0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIGludCBnZXRDb3VudCgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICBMaXN0VmlldyBsaXN0VmlldyA9IChMaXN0VmlldykgZmluZFZpZXdCeUlkKFIuaWQubGlzdHZpZXcpOwotICAgICAgICBsaXN0Vmlldy5zZXRBZGFwdGVyKGxpc3RBZGFwdGVyKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9jdHMvQWNjZXNzaWJpbGl0eUVuZFRvRW5kVGVzdC5qYXZhIGIvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2Uvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvY3RzL0FjY2Vzc2liaWxpdHlFbmRUb0VuZFRlc3QuamF2YQppbmRleCBiMTRiNzZhLi41MzkwZjVlIDEwMDY0NAotLS0gYS90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9jdHMvQWNjZXNzaWJpbGl0eUVuZFRvRW5kVGVzdC5qYXZhCisrKyBiL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy9BY2Nlc3NpYmlsaXR5RW5kVG9FbmRUZXN0LmphdmEKQEAgLTE2LDQxICsxNiw3OCBAQAogCiBwYWNrYWdlIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuY3RzOwogCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuY3RzLnV0aWxzLkFjY2Vzc2liaWxpdHlFdmVudEZpbHRlclV0aWxzCisgICAgICAgIC5maWx0ZXJGb3JFdmVudFR5cGU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuY3RzLnV0aWxzLlJ1bk9uTWFpblV0aWxzLmdldE9uTWFpbjsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU5vZGVJbmZvLkFjY2Vzc2liaWxpdHlBY3Rpb24KKyAgICAgICAgLkFDVElPTl9ISURFX1RPT0xUSVA7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlOb2RlSW5mby5BY2Nlc3NpYmlsaXR5QWN0aW9uCisgICAgICAgIC5BQ1RJT05fU0hPV19UT09MVElQOworCitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5jb3JlLklzRXF1YWwuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LmNvcmUuSXNOdWxsLm51bGxWYWx1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LmNvcmUuSXNOdWxsLm5vdE51bGxWYWx1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmluOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMubm90OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKK2ltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLmN0cy5hY3Rpdml0aWVzLkFjY2Vzc2liaWxpdHlFbmRUb0VuZEFjdGl2aXR5OwogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwogaW1wb3J0IGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nOworaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb247CiBpbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uQ2hhbm5lbDsKIGltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb25NYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5hcHAuU2VydmljZTsKIGltcG9ydCBhbmRyb2lkLmFwcC5VaUF1dG9tYXRpb247CitpbXBvcnQgYW5kcm9pZC5hcHB3aWRnZXQuQXBwV2lkZ2V0SG9zdDsKK2ltcG9ydCBhbmRyb2lkLmFwcHdpZGdldC5BcHBXaWRnZXRNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuYXBwd2lkZ2V0LkFwcFdpZGdldFByb3ZpZGVySW5mbzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUHJlc3VibWl0OwogaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5NZWRpdW1UZXN0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU5vZGVJbmZvOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5FZGl0VGV4dDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKIAotaW1wb3J0IGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuY3RzLlI7Ci0KIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZW91dEV4Y2VwdGlvbjsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ2RkVGVzdDsKIAogLyoqCiAgKiBUaGlzIGNsYXNzIHBlcmZvcm1zIGVuZC10by1lbmQgdGVzdGluZyBvZiB0aGUgYWNjZXNzaWJpbGl0eSBmZWF0dXJlIGJ5CiAgKiBjcmVhdGluZyBhbiB7QGxpbmsgQWN0aXZpdHl9IGFuZCBwb2tpbmcgYXJvdW5kIHNvIHtAbGluayBBY2Nlc3NpYmlsaXR5RXZlbnR9cwogICogYXJlIGdlbmVyYXRlZCBhbmQgdGhlaXIgY29ycmVjdCBkaXNwYXRjaCB2ZXJpZmllZC4KICAqLworQENkZFRlc3QocmVxdWlyZW1lbnQ9IjMuMTAvQy0xLTIsVy0xLTEiKQogcHVibGljIGNsYXNzIEFjY2Vzc2liaWxpdHlFbmRUb0VuZFRlc3QgZXh0ZW5kcwogICAgICAgICBBY2Nlc3NpYmlsaXR5QWN0aXZpdHlUZXN0Q2FzZTxBY2Nlc3NpYmlsaXR5RW5kVG9FbmRBY3Rpdml0eT4gewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiQWNjZXNzaWJpbGl0eUVuZFRvRW5kVGVzdCI7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JBTlRfQklORF9BUFBfV0lER0VUX1BFUk1JU1NJT05fQ09NTUFORCA9CisgICAgICAgICAgICAiYXBwd2lkZ2V0IGdyYW50YmluZCAtLXBhY2thZ2UgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHMgLS11c2VyIDAiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFVk9LRV9CSU5EX0FQUF9XSURHRVRfUEVSTUlTU0lPTl9DT01NQU5EID0KKyAgICAgICAgICAgICJhcHB3aWRnZXQgcmV2b2tlYmluZCAtLXBhY2thZ2UgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHMgLS11c2VyIDAiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUF9XSURHRVRfUFJPVklERVJfUEFDS0FHRSA9ICJmb28uYmFyLmJheiI7CisKICAgICAvKioKICAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGZvciB0ZXN0aW5nIHtAbGluayBBY2Nlc3NpYmlsaXR5RW5kVG9FbmRBY3Rpdml0eX0uCiAgICAgICovCkBAIC01OSw2ICs5Niw3IEBACiAgICAgfQogCiAgICAgQE1lZGl1bVRlc3QKKyAgICBAUHJlc3VibWl0CiAgICAgcHVibGljIHZvaWQgdGVzdFR5cGVWaWV3U2VsZWN0ZWRBY2Nlc3NpYmlsaXR5RXZlbnQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgLy8gY3JlYXRlIGFuZCBwb3B1bGF0ZSB0aGUgZXhwZWN0ZWQgZXZlbnQKICAgICAgICAgZmluYWwgQWNjZXNzaWJpbGl0eUV2ZW50IGV4cGVjdGVkID0gQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbigpOwpAQCAtMTAwLDYgKzEzOCw3IEBACiAgICAgfQogCiAgICAgQE1lZGl1bVRlc3QKKyAgICBAUHJlc3VibWl0CiAgICAgcHVibGljIHZvaWQgdGVzdFR5cGVWaWV3Q2xpY2tlZEFjY2Vzc2liaWxpdHlFdmVudCgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICAvLyBjcmVhdGUgYW5kIHBvcHVsYXRlIHRoZSBleHBlY3RlZCBldmVudAogICAgICAgICBmaW5hbCBBY2Nlc3NpYmlsaXR5RXZlbnQgZXhwZWN0ZWQgPSBBY2Nlc3NpYmlsaXR5RXZlbnQub2J0YWluKCk7CkBAIC0xMzYsNiArMTc1LDcgQEAKICAgICB9CiAKICAgICBATWVkaXVtVGVzdAorICAgIEBQcmVzdWJtaXQKICAgICBwdWJsaWMgdm9pZCB0ZXN0VHlwZVZpZXdMb25nQ2xpY2tlZEFjY2Vzc2liaWxpdHlFdmVudCgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICAvLyBjcmVhdGUgYW5kIHBvcHVsYXRlIHRoZSBleHBlY3RlZCBldmVudAogICAgICAgICBmaW5hbCBBY2Nlc3NpYmlsaXR5RXZlbnQgZXhwZWN0ZWQgPSBBY2Nlc3NpYmlsaXR5RXZlbnQub2J0YWluKCk7CkBAIC0xNzIsNiArMjEyLDcgQEAKICAgICB9CiAKICAgICBATWVkaXVtVGVzdAorICAgIEBQcmVzdWJtaXQKICAgICBwdWJsaWMgdm9pZCB0ZXN0VHlwZVZpZXdGb2N1c2VkQWNjZXNzaWJpbGl0eUV2ZW50KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIC8vIGNyZWF0ZSBhbmQgcG9wdWxhdGUgdGhlIGV4cGVjdGVkIGV2ZW50CiAgICAgICAgIGZpbmFsIEFjY2Vzc2liaWxpdHlFdmVudCBleHBlY3RlZCA9IEFjY2Vzc2liaWxpdHlFdmVudC5vYnRhaW4oKTsKQEAgLTE3OSwzNyArMjIwLDIyIEBACiAgICAgICAgIGV4cGVjdGVkLnNldENsYXNzTmFtZShCdXR0b24uY2xhc3MuZ2V0TmFtZSgpKTsKICAgICAgICAgZXhwZWN0ZWQuc2V0UGFja2FnZU5hbWUoZ2V0QWN0aXZpdHkoKS5nZXRQYWNrYWdlTmFtZSgpKTsKICAgICAgICAgZXhwZWN0ZWQuZ2V0VGV4dCgpLmFkZChnZXRBY3Rpdml0eSgpLmdldFN0cmluZyhSLnN0cmluZy5idXR0b25fdGl0bGUpKTsKLSAgICAgICAgZXhwZWN0ZWQuc2V0SXRlbUNvdW50KDMpOwotICAgICAgICBleHBlY3RlZC5zZXRDdXJyZW50SXRlbUluZGV4KDIpOworICAgICAgICBleHBlY3RlZC5zZXRJdGVtQ291bnQoNCk7CisgICAgICAgIGV4cGVjdGVkLnNldEN1cnJlbnRJdGVtSW5kZXgoMyk7CiAgICAgICAgIGV4cGVjdGVkLnNldEVuYWJsZWQodHJ1ZSk7CiAKLSAgICAgICAgZmluYWwgQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pIGdldEFjdGl2aXR5KCkuZmluZFZpZXdCeUlkKFIuaWQuYnV0dG9uKTsKKyAgICAgICAgZmluYWwgQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pIGdldEFjdGl2aXR5KCkuZmluZFZpZXdCeUlkKFIuaWQuYnV0dG9uV2l0aFRvb2x0aXApOwogCiAgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBhd2FpdGVkRXZlbnQgPQogICAgICAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VWlBdXRvbWF0aW9uKCkuZXhlY3V0ZUFuZFdhaXRGb3JFdmVudCgKLSAgICAgICAgICAgICAgICBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIHRoZSBldmVudAotICAgICAgICAgICAgICAgIGdldEFjdGl2aXR5KCkucnVuT25VaVRocmVhZChuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidXR0b24ucmVxdWVzdEZvY3VzKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIH19LAotICAgICAgICAgICAgbmV3IFVpQXV0b21hdGlvbi5BY2Nlc3NpYmlsaXR5RXZlbnRGaWx0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhlIHJlY2VpdmVkIGV2ZW50Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEFjY2Vzc2liaWxpdHlFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXF1YWxzQWNjZXNzaWJsaXR5RXZlbnQoZXZlbnQsIGV4cGVjdGVkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9LAotICAgICAgICAgICAgVElNRU9VVF9BU1lOQ19QUk9DRVNTSU5HKTsKKyAgICAgICAgICAgICAgICAgICAgKCkgLT4gZ2V0QWN0aXZpdHkoKS5ydW5PblVpVGhyZWFkKCgpIC0+IGJ1dHRvbi5yZXF1ZXN0Rm9jdXMoKSksCisgICAgICAgICAgICAgICAgICAgIChldmVudCkgLT4gZXF1YWxzQWNjZXNzaWJsaXR5RXZlbnQoZXZlbnQsIGV4cGVjdGVkKSwKKyAgICAgICAgICAgICAgICAgICAgVElNRU9VVF9BU1lOQ19QUk9DRVNTSU5HKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiRGlkIG5vdCByZWNlaXZlIGV4cGVjdGVkIGV2ZW50OiAiICsgZXhwZWN0ZWQsIGF3YWl0ZWRFdmVudCk7CiAgICAgfQogCiAgICAgQE1lZGl1bVRlc3QKKyAgICBAUHJlc3VibWl0CiAgICAgcHVibGljIHZvaWQgdGVzdFR5cGVWaWV3VGV4dENoYW5nZWRBY2Nlc3NpYmlsaXR5RXZlbnQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgLy8gZm9jdXMgdGhlIGVkaXQgdGV4dAogICAgICAgICBmaW5hbCBFZGl0VGV4dCBlZGl0VGV4dCA9IChFZGl0VGV4dCkgZ2V0QWN0aXZpdHkoKS5maW5kVmlld0J5SWQoUi5pZC5lZGl0dGV4dCk7CkBAIC0yNzgsNiArMzA0LDcgQEAKICAgICB9CiAKICAgICBATWVkaXVtVGVzdAorICAgIEBQcmVzdWJtaXQKICAgICBwdWJsaWMgdm9pZCB0ZXN0VHlwZVdpbmRvd1N0YXRlQ2hhbmdlZEFjY2Vzc2liaWxpdHlFdmVudCgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICAvLyBjcmVhdGUgYW5kIHBvcHVsYXRlIHRoZSBleHBlY3RlZCBldmVudAogICAgICAgICBmaW5hbCBBY2Nlc3NpYmlsaXR5RXZlbnQgZXhwZWN0ZWQgPSBBY2Nlc3NpYmlsaXR5RXZlbnQub2J0YWluKCk7CkBAIC0zMTQsNyArMzQxLDkgQEAKICAgICB9CiAKICAgICBATWVkaXVtVGVzdAorICAgIEBBcHBNb2RlRnVsbAogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCisgICAgQFByZXN1Ym1pdAogICAgIHB1YmxpYyB2b2lkIHRlc3RUeXBlTm90aWZpY2F0aW9uU3RhdGVDaGFuZ2VkQWNjZXNzaWJpbGl0eUV2ZW50KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIC8vIE5vIG5vdGlmaWNhdGlvbiBVSSBvbiB0ZWxldmlzaW9ucy4KICAgICAgICAgaWYgKChnZXRBY3Rpdml0eSgpLmdldFJlc291cmNlcygpLmdldENvbmZpZ3VyYXRpb24oKS51aU1vZGUKQEAgLTMyOSw2ICszNTgsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgIiAtIFdhdGNoZXMgaGF2ZSBkaWZmZXJlbnQgbm90aWZpY2F0aW9uIHN5c3RlbS4iKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQorICAgICAgICBpZiAocG0uaGFzU3lzdGVtRmVhdHVyZShwbS5GRUFUVVJFX0FVVE9NT1RJVkUpKSB7CisgICAgICAgICAgICBMb2cuaShMT0dfVEFHLCAiU2tpcHBpbmc6IHRlc3RUeXBlTm90aWZpY2F0aW9uU3RhdGVDaGFuZ2VkQWNjZXNzaWJpbGl0eUV2ZW50IiArCisgICAgICAgICAgICAgICAgICAgICIgLSBBdXRvbW90aXZlIGhhbmRsZSBub3RpZmljYXRpb25zIGRpZmZlcmVudGx5LiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAKICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBnZXRBY3Rpdml0eSgpLmdldFN0cmluZyhSLnN0cmluZy5ub3RpZmljYXRpb25fbWVzc2FnZSk7CiAKQEAgLTQzMCw2ICs0NjQsMjk1IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBATWVkaXVtVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYWNrYWdlTmFtZUNhbm5vdEJlRmFrZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZ2V0QWN0aXZpdHkoKS5ydW5PblVpVGhyZWFkKCgpIC0+IHsKKyAgICAgICAgICAgIC8vIFNldCB0aGUgYWN0aXZpdHkgdG8gcmVwb3J0IGZha2UgcGFja2FnZSBmb3IgZXZlbnRzIGFuZCBub2RlcworICAgICAgICAgICAgZ2V0QWN0aXZpdHkoKS5zZXRSZXBvcnRlZFBhY2thZ2VOYW1lKCJmb28uYmFyLmJheiIpOworCisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgbm9kZSBwYWNrYWdlIGNhbm5vdCBiZSBmYWtlZAorICAgICAgICAgICAgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIHJvb3QgPSBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRVaUF1dG9tYXRpb24oKQorICAgICAgICAgICAgICAgICAgICAuZ2V0Um9vdEluQWN0aXZlV2luZG93KCk7CisgICAgICAgICAgICBhc3NlcnRQYWNrYWdlTmFtZShyb290LCBnZXRBY3Rpdml0eSgpLmdldFBhY2thZ2VOYW1lKCkpOworICAgICAgICB9KTsKKworICAgICAgICAvLyBNYWtlIHN1cmUgZXZlbnQgcGFja2FnZSBjYW5ub3QgYmUgZmFrZWQKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpLmdldFVpQXV0b21hdGlvbigpLmV4ZWN1dGVBbmRXYWl0Rm9yRXZlbnQoKCkgLT4KKyAgICAgICAgICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS5ydW5Pbk1haW5TeW5jKCgpIC0+CisgICAgICAgICAgICAgICAgICAgIGdldEFjdGl2aXR5KCkuZmluZFZpZXdCeUlkKFIuaWQuYnV0dG9uKS5yZXF1ZXN0Rm9jdXMoKSkKKyAgICAgICAgICAgICAgICAsIChBY2Nlc3NpYmlsaXR5RXZlbnQgZXZlbnQpIC0+CisgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldEV2ZW50VHlwZSgpID09IEFjY2Vzc2liaWxpdHlFdmVudC5UWVBFX1ZJRVdfRk9DVVNFRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGV2ZW50LmdldFBhY2thZ2VOYW1lKCkuZXF1YWxzKGdldEFjdGl2aXR5KCkuZ2V0UGFja2FnZU5hbWUoKSkKKyAgICAgICAgICAgICAgICAsIFRJTUVPVVRfQVNZTkNfUFJPQ0VTU0lORyk7CisgICAgICAgIH0gY2F0Y2ggKFRpbWVvdXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRXZlbnRzIGZyb20gZmFrZSBwYWNrYWdlIHNob3VsZCBiZSBmaXhlZCB0byB1c2UgdGhlIGNvcnJlY3QgcGFja2FnZSIpOworICAgICAgICB9CisgICAgfQorCisgICAgQEFwcE1vZGVGdWxsCisgICAgQE1lZGl1bVRlc3QKKyAgICBAUHJlc3VibWl0CisgICAgcHVibGljIHZvaWQgdGVzdFBhY2thZ2VOYW1lQ2Fubm90QmVGYWtlZEFwcFdpZGdldCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIWhhc0FwcFdpZGdldHMoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkucnVuT25NYWluU3luYygoKSAtPiB7CisgICAgICAgICAgICAvLyBTZXQgdGhlIGFjdGl2aXR5IHRvIHJlcG9ydCBmYWtlIHBhY2thZ2UgZm9yIGV2ZW50cyBhbmQgbm9kZXMKKyAgICAgICAgICAgIGdldEFjdGl2aXR5KCkuc2V0UmVwb3J0ZWRQYWNrYWdlTmFtZShBUFBfV0lER0VUX1BST1ZJREVSX1BBQ0tBR0UpOworCisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UgY2Fubm90IHJlcG9ydCBub2RlcyBhcyBpZiBmcm9tIHRoZSB3aWRnZXQgcGFja2FnZQorICAgICAgICAgICAgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIHJvb3QgPSBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRVaUF1dG9tYXRpb24oKQorICAgICAgICAgICAgICAgICAgICAuZ2V0Um9vdEluQWN0aXZlV2luZG93KCk7CisgICAgICAgICAgICBhc3NlcnRQYWNrYWdlTmFtZShyb290LCBnZXRBY3Rpdml0eSgpLmdldFBhY2thZ2VOYW1lKCkpOworICAgICAgICB9KTsKKworICAgICAgICAvLyBNYWtlIHN1cmUgd2UgY2Fubm90IHNlbmQgZXZlbnRzIGFzIGlmIGZyb20gdGhlIHdpZGdldCBwYWNrYWdlCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRVaUF1dG9tYXRpb24oKS5leGVjdXRlQW5kV2FpdEZvckV2ZW50KCgpIC0+CisgICAgICAgICAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkucnVuT25NYWluU3luYygoKSAtPgorICAgICAgICAgICAgICAgICAgICBnZXRBY3Rpdml0eSgpLmZpbmRWaWV3QnlJZChSLmlkLmJ1dHRvbikucmVxdWVzdEZvY3VzKCkpCisgICAgICAgICAgICAgICAgLCAoQWNjZXNzaWJpbGl0eUV2ZW50IGV2ZW50KSAtPgorICAgICAgICAgICAgICAgICAgICBldmVudC5nZXRFdmVudFR5cGUoKSA9PSBBY2Nlc3NpYmlsaXR5RXZlbnQuVFlQRV9WSUVXX0ZPQ1VTRUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBldmVudC5nZXRQYWNrYWdlTmFtZSgpLmVxdWFscyhnZXRBY3Rpdml0eSgpLmdldFBhY2thZ2VOYW1lKCkpCisgICAgICAgICAgICAgICAgLCBUSU1FT1VUX0FTWU5DX1BST0NFU1NJTkcpOworICAgICAgICB9IGNhdGNoIChUaW1lb3V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlNob3VsZCBub3QgYmUgYWJsZSB0byBzZW5kIGV2ZW50cyBmcm9tIGEgd2lkZ2V0IHBhY2thZ2UgaWYgbm8gd2lkZ2V0IGhvc3RlZCIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgaG9zdCBhbmQgc3RhcnQgbGlzdGVuaW5nLgorICAgICAgICBmaW5hbCBBcHBXaWRnZXRIb3N0IGhvc3QgPSBuZXcgQXBwV2lkZ2V0SG9zdChnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRUYXJnZXRDb250ZXh0KCksIDApOworICAgICAgICBob3N0LmRlbGV0ZUhvc3QoKTsKKyAgICAgICAgaG9zdC5zdGFydExpc3RlbmluZygpOworCisgICAgICAgIC8vIFdlbGwsIGFwcCBkbyBub3QgaGF2ZSB0aGlzIHBlcm1pc3Npb24gdW5sZXNzIGV4cGxpY2l0bHkgZ3JhbnRlZAorICAgICAgICAvLyBieSB0aGUgdXNlci4gTm93IHdlIHdpbGwgcHJldGVuZCBmb3IgdGhlIHVzZXIgYW5kIGdyYW50IGl0LgorICAgICAgICBncmFudEJpbmRBcHBXaWRnZXRQZXJtaXNzaW9uKCk7CisKKyAgICAgICAgLy8gQWxsb2NhdGUgYW4gYXBwIHdpZGdldCBpZCB0byBiaW5kLgorICAgICAgICBmaW5hbCBpbnQgYXBwV2lkZ2V0SWQgPSBob3N0LmFsbG9jYXRlQXBwV2lkZ2V0SWQoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEdyYWIgYSBwcm92aWRlciB3ZSBkZWZpbmVkIHRvIGJlIGJvdW5kLgorICAgICAgICAgICAgZmluYWwgQXBwV2lkZ2V0UHJvdmlkZXJJbmZvIHByb3ZpZGVyID0gZ2V0QXBwV2lkZ2V0UHJvdmlkZXJJbmZvKCk7CisKKyAgICAgICAgICAgIC8vIEJpbmQgdGhlIHdpZGdldC4KKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gd2lkZ2V0Qm91bmQgPSBnZXRBcHBXaWRnZXRNYW5hZ2VyKCkuYmluZEFwcFdpZGdldElkSWZBbGxvd2VkKAorICAgICAgICAgICAgICAgICAgICBhcHBXaWRnZXRJZCwgcHJvdmlkZXIuZ2V0UHJvZmlsZSgpLCBwcm92aWRlci5wcm92aWRlciwgbnVsbCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHdpZGdldEJvdW5kKTsKKworICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBhcHAgY2FuIHVzZSB0aGUgcGFja2FnZSBvZiBhIHdpZGdldCBpdCBob3N0cworICAgICAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkucnVuT25NYWluU3luYygoKSAtPiB7CisgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGNhbiByZXBvcnQgbm9kZXMgYXMgaWYgZnJvbSB0aGUgd2lkZ2V0IHBhY2thZ2UKKyAgICAgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gcm9vdCA9IGdldEluc3RydW1lbnRhdGlvbigpLmdldFVpQXV0b21hdGlvbigpCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Um9vdEluQWN0aXZlV2luZG93KCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0UGFja2FnZU5hbWUocm9vdCwgQVBQX1dJREdFVF9QUk9WSURFUl9QQUNLQUdFKTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UgY2FuIHNlbmQgZXZlbnRzIGFzIGlmIGZyb20gdGhlIHdpZGdldCBwYWNrYWdlCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpLmdldFVpQXV0b21hdGlvbigpLmV4ZWN1dGVBbmRXYWl0Rm9yRXZlbnQoKCkgLT4KKyAgICAgICAgICAgICAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkucnVuT25NYWluU3luYygoKSAtPgorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QWN0aXZpdHkoKS5maW5kVmlld0J5SWQoUi5pZC5idXR0b24pLnBlcmZvcm1DbGljaygpKQorICAgICAgICAgICAgICAgICAgICAsIChBY2Nlc3NpYmlsaXR5RXZlbnQgZXZlbnQpIC0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0RXZlbnRUeXBlKCkgPT0gQWNjZXNzaWJpbGl0eUV2ZW50LlRZUEVfVklFV19DTElDS0VECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBldmVudC5nZXRQYWNrYWdlTmFtZSgpLmVxdWFscyhBUFBfV0lER0VUX1BST1ZJREVSX1BBQ0tBR0UpCisgICAgICAgICAgICAgICAgICAgICwgVElNRU9VVF9BU1lOQ19QUk9DRVNTSU5HKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRpbWVvdXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGZhaWwoIlNob3VsZCBiZSBhYmxlIHRvIHNlbmQgZXZlbnRzIGZyb20gYSB3aWRnZXQgcGFja2FnZSBpZiB3aWRnZXQgaG9zdGVkIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAvLyBDbGVhbiB1cC4KKyAgICAgICAgICAgIGhvc3QuZGVsZXRlQXBwV2lkZ2V0SWQoYXBwV2lkZ2V0SWQpOworICAgICAgICAgICAgaG9zdC5kZWxldGVIb3N0KCk7CisgICAgICAgICAgICByZXZva2VCaW5kQXBwV2lkZ2V0UGVybWlzc2lvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgQE1lZGl1bVRlc3QKKyAgICBAUHJlc3VibWl0CisgICAgcHVibGljIHZvaWQgdGVzdFZpZXdIZWFkaW5nUmVwb3J0ZWRUb0FjY2Vzc2liaWxpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgSW5zdHJ1bWVudGF0aW9uIGluc3RydW1lbnRhdGlvbiA9IGdldEluc3RydW1lbnRhdGlvbigpOworICAgICAgICBmaW5hbCBFZGl0VGV4dCBlZGl0VGV4dCA9IChFZGl0VGV4dCkgZ2V0T25NYWluKGluc3RydW1lbnRhdGlvbiwgKCkgLT4geworICAgICAgICAgICAgcmV0dXJuIGdldEFjdGl2aXR5KCkuZmluZFZpZXdCeUlkKFIuaWQuZWRpdHRleHQpOworICAgICAgICB9KTsKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBlZGl0dGV4dCB3YXMgcG9wdWxhdGVkIHByb3Blcmx5IGZyb20geG1sCisgICAgICAgIGZpbmFsIGJvb2xlYW4gZWRpdFRleHRJc0hlYWRpbmcgPSBnZXRPbk1haW4oaW5zdHJ1bWVudGF0aW9uLCAoKSAtPiB7CisgICAgICAgICAgICByZXR1cm4gZWRpdFRleHQuaXNBY2Nlc3NpYmlsaXR5SGVhZGluZygpOworICAgICAgICB9KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiaXNBY2Nlc3NpYmlsaXR5SGVhZGluZyBub3QgcG9wdWxhdGVkIHByb3Blcmx5IGZyb20geG1sIiwgZWRpdFRleHRJc0hlYWRpbmcpOworCisgICAgICAgIGZpbmFsIFVpQXV0b21hdGlvbiB1aUF1dG9tYXRpb24gPSBpbnN0cnVtZW50YXRpb24uZ2V0VWlBdXRvbWF0aW9uKCk7CisgICAgICAgIGZpbmFsIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBlZGl0VGV4dE5vZGUgPSB1aUF1dG9tYXRpb24uZ2V0Um9vdEluQWN0aXZlV2luZG93KCkKKyAgICAgICAgICAgICAgICAuZmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb3NCeVZpZXdJZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLmN0czppZC9lZGl0dGV4dCIpCisgICAgICAgICAgICAgICAgLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiaXNBY2Nlc3NpYmlsaXR5SGVhZGluZyBub3QgcmVwb3J0ZWQgdG8gYWNjZXNzaWJpbGl0eSIsCisgICAgICAgICAgICAgICAgZWRpdFRleHROb2RlLmlzSGVhZGluZygpKTsKKworICAgICAgICB1aUF1dG9tYXRpb24uZXhlY3V0ZUFuZFdhaXRGb3JFdmVudCgoKSAtPiBpbnN0cnVtZW50YXRpb24ucnVuT25NYWluU3luYygoKSAtPgorICAgICAgICAgICAgICAgICAgICAgICAgZWRpdFRleHQuc2V0QWNjZXNzaWJpbGl0eUhlYWRpbmcoZmFsc2UpKSwKKyAgICAgICAgICAgICAgICBmaWx0ZXJGb3JFdmVudFR5cGUoQWNjZXNzaWJpbGl0eUV2ZW50LlRZUEVfV0lORE9XX0NPTlRFTlRfQ0hBTkdFRCksCisgICAgICAgICAgICAgICAgVElNRU9VVF9BU1lOQ19QUk9DRVNTSU5HKTsKKyAgICAgICAgZWRpdFRleHROb2RlLnJlZnJlc2goKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoImlzQWNjZXNzaWJpbGl0eUhlYWRpbmcgbm90IHJlcG9ydGVkIHRvIGFjY2Vzc2liaWxpdHkgYWZ0ZXIgdXBkYXRlIiwKKyAgICAgICAgICAgICAgICBlZGl0VGV4dE5vZGUuaXNIZWFkaW5nKCkpOworICAgIH0KKworICAgIEBNZWRpdW1UZXN0CisgICAgQFByZXN1Ym1pdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUb29sdGlwVGV4dFJlcG9ydGVkVG9BY2Nlc3NpYmlsaXR5KCkgeworICAgICAgICBmaW5hbCBJbnN0cnVtZW50YXRpb24gaW5zdHJ1bWVudGF0aW9uID0gZ2V0SW5zdHJ1bWVudGF0aW9uKCk7CisgICAgICAgIGZpbmFsIFVpQXV0b21hdGlvbiB1aUF1dG9tYXRpb24gPSBpbnN0cnVtZW50YXRpb24uZ2V0VWlBdXRvbWF0aW9uKCk7CisgICAgICAgIGZpbmFsIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBidXR0b25Ob2RlID0gdWlBdXRvbWF0aW9uLmdldFJvb3RJbkFjdGl2ZVdpbmRvdygpCisgICAgICAgICAgICAgICAgLmZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9zQnlWaWV3SWQoCisgICAgICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHM6aWQvYnV0dG9uV2l0aFRvb2x0aXAiKQorICAgICAgICAgICAgICAgIC5nZXQoMCk7CisgICAgICAgIGFzc2VydEVxdWFscygiVG9vbHRpcCB0ZXh0IG5vdCByZXBvcnRlZCB0byBhY2Nlc3NpYmlsaXR5IiwKKyAgICAgICAgICAgICAgICBpbnN0cnVtZW50YXRpb24uZ2V0Q29udGV4dCgpLmdldFN0cmluZyhSLnN0cmluZy5idXR0b25fdG9vbHRpcCksCisgICAgICAgICAgICAgICAgYnV0dG9uTm9kZS5nZXRUb29sdGlwVGV4dCgpKTsKKyAgICB9CisKKyAgICBATWVkaXVtVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUb29sdGlwVGV4dEFjdGlvbnNSZXBvcnRlZFRvQWNjZXNzaWJpbGl0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBJbnN0cnVtZW50YXRpb24gaW5zdHJ1bWVudGF0aW9uID0gZ2V0SW5zdHJ1bWVudGF0aW9uKCk7CisgICAgICAgIGZpbmFsIFVpQXV0b21hdGlvbiB1aUF1dG9tYXRpb24gPSBpbnN0cnVtZW50YXRpb24uZ2V0VWlBdXRvbWF0aW9uKCk7CisgICAgICAgIGZpbmFsIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBidXR0b25Ob2RlID0gdWlBdXRvbWF0aW9uLmdldFJvb3RJbkFjdGl2ZVdpbmRvdygpCisgICAgICAgICAgICAgICAgLmZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9zQnlWaWV3SWQoCisgICAgICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHM6aWQvYnV0dG9uV2l0aFRvb2x0aXAiKQorICAgICAgICAgICAgICAgIC5nZXQoMCk7CisgICAgICAgIGFzc2VydEZhbHNlKGhhc1Rvb2x0aXBTaG93aW5nKFIuaWQuYnV0dG9uV2l0aFRvb2x0aXApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChBQ1RJT05fU0hPV19UT09MVElQLCBpbihidXR0b25Ob2RlLmdldEFjdGlvbkxpc3QoKSkpOworICAgICAgICBhc3NlcnRUaGF0KEFDVElPTl9ISURFX1RPT0xUSVAsIG5vdChpbihidXR0b25Ob2RlLmdldEFjdGlvbkxpc3QoKSkpKTsKKyAgICAgICAgdWlBdXRvbWF0aW9uLmV4ZWN1dGVBbmRXYWl0Rm9yRXZlbnQoKCkgLT4gYnV0dG9uTm9kZS5wZXJmb3JtQWN0aW9uKAorICAgICAgICAgICAgICAgIEFDVElPTl9TSE9XX1RPT0xUSVAuZ2V0SWQoKSksCisgICAgICAgICAgICAgICAgZmlsdGVyRm9yRXZlbnRUeXBlKEFjY2Vzc2liaWxpdHlFdmVudC5UWVBFX1dJTkRPV19DT05URU5UX0NIQU5HRUQpLAorICAgICAgICAgICAgICAgIFRJTUVPVVRfQVNZTkNfUFJPQ0VTU0lORyk7CisKKyAgICAgICAgLy8gVGhlIGJ1dHRvbiBzaG91bGQgbm93IGJlIHNob3dpbmcgdGhlIHRvb2x0aXAsIHNvIGl0IHNob3VsZCBoYXZlIHRoZSBvcHRpb24gdG8gaGlkZSBpdC4KKyAgICAgICAgYnV0dG9uTm9kZS5yZWZyZXNoKCk7CisgICAgICAgIGFzc2VydFRoYXQoQUNUSU9OX0hJREVfVE9PTFRJUCwgaW4oYnV0dG9uTm9kZS5nZXRBY3Rpb25MaXN0KCkpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChBQ1RJT05fU0hPV19UT09MVElQLCBub3QoaW4oYnV0dG9uTm9kZS5nZXRBY3Rpb25MaXN0KCkpKSk7CisgICAgICAgIGFzc2VydFRydWUoaGFzVG9vbHRpcFNob3dpbmcoUi5pZC5idXR0b25XaXRoVG9vbHRpcCkpOworICAgIH0KKworICAgIEBNZWRpdW1UZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRyYXZlcnNhbEJlZm9yZVJlcG9ydGVkVG9BY2Nlc3NpYmlsaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEluc3RydW1lbnRhdGlvbiBpbnN0cnVtZW50YXRpb24gPSBnZXRJbnN0cnVtZW50YXRpb24oKTsKKyAgICAgICAgZmluYWwgVWlBdXRvbWF0aW9uIHVpQXV0b21hdGlvbiA9IGluc3RydW1lbnRhdGlvbi5nZXRVaUF1dG9tYXRpb24oKTsKKyAgICAgICAgZmluYWwgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIGJ1dHRvbk5vZGUgPSB1aUF1dG9tYXRpb24uZ2V0Um9vdEluQWN0aXZlV2luZG93KCkKKyAgICAgICAgICAgICAgICAuZmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb3NCeVZpZXdJZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLmN0czppZC9idXR0b25XaXRoVG9vbHRpcCIpCisgICAgICAgICAgICAgICAgLmdldCgwKTsKKyAgICAgICAgZmluYWwgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIGJlZm9yZU5vZGUgPSBidXR0b25Ob2RlLmdldFRyYXZlcnNhbEJlZm9yZSgpOworICAgICAgICBhc3NlcnRUaGF0KGJlZm9yZU5vZGUsIG5vdE51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChiZWZvcmVOb2RlLmdldFZpZXdJZFJlc291cmNlTmFtZSgpLAorICAgICAgICAgICAgICAgIGVxdWFsVG8oImFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuY3RzOmlkL2VkaXR0ZXh0IikpOworCisgICAgICAgIHVpQXV0b21hdGlvbi5leGVjdXRlQW5kV2FpdEZvckV2ZW50KCgpIC0+IGluc3RydW1lbnRhdGlvbi5ydW5Pbk1haW5TeW5jKAorICAgICAgICAgICAgICAgICgpIC0+IGdldEFjdGl2aXR5KCkuZmluZFZpZXdCeUlkKFIuaWQuYnV0dG9uV2l0aFRvb2x0aXApCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0QWNjZXNzaWJpbGl0eVRyYXZlcnNhbEJlZm9yZShWaWV3Lk5PX0lEKSksCisgICAgICAgICAgICAgICAgZmlsdGVyRm9yRXZlbnRUeXBlKEFjY2Vzc2liaWxpdHlFdmVudC5UWVBFX1dJTkRPV19DT05URU5UX0NIQU5HRUQpLAorICAgICAgICAgICAgICAgIFRJTUVPVVRfQVNZTkNfUFJPQ0VTU0lORyk7CisKKyAgICAgICAgYnV0dG9uTm9kZS5yZWZyZXNoKCk7CisgICAgICAgIGFzc2VydFRoYXQoYnV0dG9uTm9kZS5nZXRUcmF2ZXJzYWxCZWZvcmUoKSwgbnVsbFZhbHVlKCkpOworICAgIH0KKworICAgIEBNZWRpdW1UZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRyYXZlcnNhbEFmdGVyUmVwb3J0ZWRUb0FjY2Vzc2liaWxpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgSW5zdHJ1bWVudGF0aW9uIGluc3RydW1lbnRhdGlvbiA9IGdldEluc3RydW1lbnRhdGlvbigpOworICAgICAgICBmaW5hbCBVaUF1dG9tYXRpb24gdWlBdXRvbWF0aW9uID0gaW5zdHJ1bWVudGF0aW9uLmdldFVpQXV0b21hdGlvbigpOworICAgICAgICBmaW5hbCBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gZWRpdE5vZGUgPSB1aUF1dG9tYXRpb24uZ2V0Um9vdEluQWN0aXZlV2luZG93KCkKKyAgICAgICAgICAgICAgICAuZmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb3NCeVZpZXdJZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLmN0czppZC9lZGl0dGV4dCIpCisgICAgICAgICAgICAgICAgLmdldCgwKTsKKyAgICAgICAgZmluYWwgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIGFmdGVyTm9kZSA9IGVkaXROb2RlLmdldFRyYXZlcnNhbEFmdGVyKCk7CisgICAgICAgIGFzc2VydFRoYXQoYWZ0ZXJOb2RlLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoYWZ0ZXJOb2RlLmdldFZpZXdJZFJlc291cmNlTmFtZSgpLAorICAgICAgICAgICAgICAgIGVxdWFsVG8oImFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuY3RzOmlkL2J1dHRvbldpdGhUb29sdGlwIikpOworCisgICAgICAgIHVpQXV0b21hdGlvbi5leGVjdXRlQW5kV2FpdEZvckV2ZW50KCgpIC0+IGluc3RydW1lbnRhdGlvbi5ydW5Pbk1haW5TeW5jKAorICAgICAgICAgICAgICAgICgpIC0+IGdldEFjdGl2aXR5KCkuZmluZFZpZXdCeUlkKFIuaWQuZWRpdHRleHQpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0QWNjZXNzaWJpbGl0eVRyYXZlcnNhbEFmdGVyKFZpZXcuTk9fSUQpKSwKKyAgICAgICAgICAgICAgICBmaWx0ZXJGb3JFdmVudFR5cGUoQWNjZXNzaWJpbGl0eUV2ZW50LlRZUEVfV0lORE9XX0NPTlRFTlRfQ0hBTkdFRCksCisgICAgICAgICAgICAgICAgVElNRU9VVF9BU1lOQ19QUk9DRVNTSU5HKTsKKworICAgICAgICBlZGl0Tm9kZS5yZWZyZXNoKCk7CisgICAgICAgIGFzc2VydFRoYXQoZWRpdE5vZGUuZ2V0VHJhdmVyc2FsQWZ0ZXIoKSwgbnVsbFZhbHVlKCkpOworICAgIH0KKworICAgIEBNZWRpdW1UZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExhYmVsRm9yUmVwb3J0ZWRUb0FjY2Vzc2liaWxpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgSW5zdHJ1bWVudGF0aW9uIGluc3RydW1lbnRhdGlvbiA9IGdldEluc3RydW1lbnRhdGlvbigpOworICAgICAgICBmaW5hbCBVaUF1dG9tYXRpb24gdWlBdXRvbWF0aW9uID0gaW5zdHJ1bWVudGF0aW9uLmdldFVpQXV0b21hdGlvbigpOworICAgICAgICB1aUF1dG9tYXRpb24uZXhlY3V0ZUFuZFdhaXRGb3JFdmVudCgoKSAtPiBpbnN0cnVtZW50YXRpb24ucnVuT25NYWluU3luYygoKSAtPiBnZXRBY3Rpdml0eSgpCisgICAgICAgICAgICAgICAgLmZpbmRWaWV3QnlJZChSLmlkLmVkaXR0ZXh0KS5zZXRMYWJlbEZvcihSLmlkLmJ1dHRvbldpdGhUb29sdGlwKSksCisgICAgICAgICAgICAgICAgZmlsdGVyRm9yRXZlbnRUeXBlKEFjY2Vzc2liaWxpdHlFdmVudC5UWVBFX1dJTkRPV19DT05URU5UX0NIQU5HRUQpLAorICAgICAgICAgICAgICAgIFRJTUVPVVRfQVNZTkNfUFJPQ0VTU0lORyk7CisgICAgICAgIC8vIFRPRE86IGIvNzgwMjI2NTA6IFRoaXMgY29kZSBzaG91bGQgbW92ZSBhYm92ZSB0aGUgZXhlY3V0ZUFuZFdhaXQgZXZlbnQuIEl0J3MgaGVyZSBiZWNhdXNlCisgICAgICAgIC8vIHRoZSBhMTF5IGNhY2hlIGRvZXNuJ3QgZ2V0IG5vdGlmaWVkIHdoZW4gbGFiZWxGb3IgY2hhbmdlcywgc28gdGhlIG5vZGUgd2l0aCB0aGUKKyAgICAgICAgLy8gbGFibGVkQnkgaXNuJ3QgdXBkYXRlZC4KKyAgICAgICAgZmluYWwgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIGVkaXROb2RlID0gdWlBdXRvbWF0aW9uLmdldFJvb3RJbkFjdGl2ZVdpbmRvdygpCisgICAgICAgICAgICAgICAgLmZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9zQnlWaWV3SWQoCisgICAgICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHM6aWQvZWRpdHRleHQiKQorICAgICAgICAgICAgICAgIC5nZXQoMCk7CisgICAgICAgIGVkaXROb2RlLnJlZnJlc2goKTsKKyAgICAgICAgZmluYWwgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIGxhYmVsRm9yTm9kZSA9IGVkaXROb2RlLmdldExhYmVsRm9yKCk7CisgICAgICAgIGFzc2VydFRoYXQobGFiZWxGb3JOb2RlLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIC8vIExhYmVsZWQgbm9kZSBzaG91bGQgaW5kaWNhdGUgdGhhdCBpdCBpcyBsYWJlbGVkIGJ5IHRoZSBvdGhlciBvbmUKKyAgICAgICAgYXNzZXJ0VGhhdChsYWJlbEZvck5vZGUuZ2V0TGFiZWxlZEJ5KCksIGVxdWFsVG8oZWRpdE5vZGUpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydFBhY2thZ2VOYW1lKEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBub2RlLCBTdHJpbmcgcGFja2FnZU5hbWUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscyhwYWNrYWdlTmFtZSwgbm9kZS5nZXRQYWNrYWdlTmFtZSgpKTsKKyAgICAgICAgZmluYWwgaW50IGNoaWxkQ291bnQgPSBub2RlLmdldENoaWxkQ291bnQoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZENvdW50OyBpKyspIHsKKyAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBjaGlsZCA9IG5vZGUuZ2V0Q2hpbGQoaSk7CisgICAgICAgICAgICBpZiAoY2hpbGQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGFzc2VydFBhY2thZ2VOYW1lKGNoaWxkLCBwYWNrYWdlTmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIEFwcFdpZGdldFByb3ZpZGVySW5mbyBnZXRBcHBXaWRnZXRQcm92aWRlckluZm8oKSB7CisgICAgICAgIGZpbmFsIENvbXBvbmVudE5hbWUgY29tcG9uZW50TmFtZSA9IG5ldyBDb21wb25lbnROYW1lKAorICAgICAgICAgICAgICAgICJmb28uYmFyLmJheiIsICJmb28uYmFyLmJhei5NeUFwcFdpZGdldFByb3ZpZGVyIik7CisgICAgICAgIGZpbmFsIExpc3Q8QXBwV2lkZ2V0UHJvdmlkZXJJbmZvPiBwcm92aWRlcnMgPSBnZXRBcHBXaWRnZXRNYW5hZ2VyKCkuZ2V0SW5zdGFsbGVkUHJvdmlkZXJzKCk7CisgICAgICAgIGZpbmFsIGludCBwcm92aWRlckNvdW50ID0gcHJvdmlkZXJzLnNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm92aWRlckNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIEFwcFdpZGdldFByb3ZpZGVySW5mbyBwcm92aWRlciA9IHByb3ZpZGVycy5nZXQoaSk7CisgICAgICAgICAgICBpZiAoY29tcG9uZW50TmFtZS5lcXVhbHMocHJvdmlkZXIucHJvdmlkZXIpCisgICAgICAgICAgICAgICAgICAgICYmIFByb2Nlc3MubXlVc2VySGFuZGxlKCkuZXF1YWxzKHByb3ZpZGVyLmdldFByb2ZpbGUoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcHJvdmlkZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGdyYW50QmluZEFwcFdpZGdldFBlcm1pc3Npb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU2hlbGxDb21tYW5kQnVpbGRlci5leGVjU2hlbGxDb21tYW5kKGdldEluc3RydW1lbnRhdGlvbigpLmdldFVpQXV0b21hdGlvbigpLAorICAgICAgICAgICAgICAgIEdSQU5UX0JJTkRfQVBQX1dJREdFVF9QRVJNSVNTSU9OX0NPTU1BTkQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZXZva2VCaW5kQXBwV2lkZ2V0UGVybWlzc2lvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTaGVsbENvbW1hbmRCdWlsZGVyLmV4ZWNTaGVsbENvbW1hbmQoZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VWlBdXRvbWF0aW9uKCksCisgICAgICAgICAgICAgICAgUkVWT0tFX0JJTkRfQVBQX1dJREdFVF9QRVJNSVNTSU9OX0NPTU1BTkQpOworICAgIH0KKworICAgIHByaXZhdGUgQXBwV2lkZ2V0TWFuYWdlciBnZXRBcHBXaWRnZXRNYW5hZ2VyKCkgeworICAgICAgICByZXR1cm4gKEFwcFdpZGdldE1hbmFnZXIpIGdldEluc3RydW1lbnRhdGlvbigpLmdldFRhcmdldENvbnRleHQoKQorICAgICAgICAgICAgICAgIC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQVBQV0lER0VUX1NFUlZJQ0UpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBoYXNBcHBXaWRnZXRzKCkgeworICAgICAgICByZXR1cm4gZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VGFyZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VNYW5hZ2VyKCkKKyAgICAgICAgICAgICAgICAuaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX0FQUF9XSURHRVRTKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBDb21wYXJlcyBhbGwgcHJvcGVydGllcyBvZiB0aGUgPGNvZGU+Zmlyc3Q8L2NvZGU+IGFuZCB0aGUKICAgICAgKiA8Y29kZT5zZWNvbmQ8L2NvZGU+LgpAQCAtNDkwLDQgKzgxMywxNSBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBoYXNUb29sdGlwU2hvd2luZyhpbnQgaWQpIHsKKyAgICAgICAgcmV0dXJuIGdldE9uTWFpbihnZXRJbnN0cnVtZW50YXRpb24oKSwgKCkgLT4geworICAgICAgICAgICAgZmluYWwgVmlldyB2aWV3V2l0aFRvb2x0aXAgPSBnZXRBY3Rpdml0eSgpLmZpbmRWaWV3QnlJZChpZCk7CisgICAgICAgICAgICBpZiAodmlld1dpdGhUb29sdGlwID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBWaWV3IHRvb2x0aXBWaWV3ID0gdmlld1dpdGhUb29sdGlwLmdldFRvb2x0aXBWaWV3KCk7CisgICAgICAgICAgICByZXR1cm4gKHRvb2x0aXBWaWV3ICE9IG51bGwpICYmICh0b29sdGlwVmlldy5nZXRQYXJlbnQoKSAhPSBudWxsKTsKKyAgICAgICAgfSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2Uvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvY3RzL0FjY2Vzc2liaWxpdHlGaW5nZXJwcmludEdlc3R1cmVUZXN0LmphdmEgYi90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9jdHMvQWNjZXNzaWJpbGl0eUZpbmdlcnByaW50R2VzdHVyZVRlc3QuamF2YQppbmRleCAzZWViZmY5Li5hNjViNDFlIDEwMDY0NAotLS0gYS90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9jdHMvQWNjZXNzaWJpbGl0eUZpbmdlcnByaW50R2VzdHVyZVRlc3QuamF2YQorKysgYi90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9jdHMvQWNjZXNzaWJpbGl0eUZpbmdlcnByaW50R2VzdHVyZVRlc3QuamF2YQpAQCAtMTQsNDUgKzE0LDUzIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHM7CiAKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfRklOR0VSUFJJTlQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnJlc2V0OworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnRpbWVvdXQ7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8udmVyaWZ5OworCiBpbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5GaW5nZXJwcmludEdlc3R1cmVDb250cm9sbGVyOwogaW1wb3J0IGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuRmluZ2VycHJpbnRHZXN0dXJlQ29udHJvbGxlci5GaW5nZXJwcmludEdlc3R1cmVDYWxsYmFjazsKK2ltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLmN0cy5hY3Rpdml0aWVzLkFjY2Vzc2liaWxpdHlFbmRUb0VuZEFjdGl2aXR5OwogaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmZpbmdlcnByaW50LkZpbmdlcnByaW50TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkNhbmNlbGxhdGlvblNpZ25hbDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiBpbXBvcnQgb3JnLm1vY2tpdG8uTW9jazsKIGltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvQW5ub3RhdGlvbnM7CiAKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfRklOR0VSUFJJTlQ7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLWltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5hdExlYXN0T25jZTsKLWltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5tb2NrOwotaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnJlc2V0OwotaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnRpbWVvdXQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8udmVyaWZ5OwotCiAvKioKICAqIFZlcmlmeSB0aGF0IGEgc2VydmljZSBsaXN0ZW5pbmcgZm9yIGZpbmdlcnByaW50IGdlc3R1cmVzIGdldHMgY2FsbGVkIGJhY2sgd2hlbiBhcHBzCiAgKiB1c2UgdGhlIGZpbmdlcnByaW50IHNlbnNvciB0byBhdXRoZW50aWNhdGUuCiAgKi8KK0BBcHBNb2RlRnVsbAogQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKIHB1YmxpYyBjbGFzcyBBY2Nlc3NpYmlsaXR5RmluZ2VycHJpbnRHZXN0dXJlVGVzdCB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZJTkdFUlBSSU5UX0NBTExCQUNLX1RJTUVPVVQgPSAzMDAwOwogCi0gICAgYm9vbGVhbiBtSXNIYXJkd2FyZUF2YWlsYWJsZTsKICAgICBGaW5nZXJwcmludE1hbmFnZXIgbUZpbmdlcnByaW50TWFuYWdlcjsKICAgICBTdHViRmluZ2VycHJpbnRHZXN0dXJlU2VydmljZSBtRmluZ2VycHJpbnRHZXN0dXJlU2VydmljZTsKICAgICBGaW5nZXJwcmludEdlc3R1cmVDb250cm9sbGVyIG1GaW5nZXJwcmludEdlc3R1cmVDb250cm9sbGVyOwogICAgIENhbmNlbGxhdGlvblNpZ25hbCBtQ2FuY2VsbGF0aW9uU2lnbmFsID0gbmV3IENhbmNlbGxhdGlvblNpZ25hbCgpOwogCisgICAgQFJ1bGUKKyAgICBwdWJsaWMgQWN0aXZpdHlUZXN0UnVsZTxBY2Nlc3NpYmlsaXR5RW5kVG9FbmRBY3Rpdml0eT4gbUFjdGl2aXR5UnVsZSA9CisgICAgICAgICAgICBuZXcgQWN0aXZpdHlUZXN0UnVsZTw+KEFjY2Vzc2liaWxpdHlFbmRUb0VuZEFjdGl2aXR5LmNsYXNzLCBmYWxzZSwgZmFsc2UpOworCisKICAgICBATW9jayBGaW5nZXJwcmludE1hbmFnZXIuQXV0aGVudGljYXRpb25DYWxsYmFjayBtTW9ja0F1dGhlbnRpY2F0aW9uQ2FsbGJhY2s7CiAgICAgQE1vY2sgRmluZ2VycHJpbnRHZXN0dXJlQ2FsbGJhY2sgbU1vY2tGaW5nZXJwcmludEdlc3R1cmVDYWxsYmFjazsKIApAQCAtNjQsOCArNzIsNiBAQAogICAgICAgICAgICAgICAgIC5oYXNTeXN0ZW1GZWF0dXJlKEZFQVRVUkVfRklOR0VSUFJJTlQpCiAgICAgICAgICAgICAgICAgPyBpbnN0cnVtZW50YXRpb24uZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoRmluZ2VycHJpbnRNYW5hZ2VyLmNsYXNzKSA6IG51bGw7CiAgICAgICAgIG1GaW5nZXJwcmludEdlc3R1cmVTZXJ2aWNlID0gU3R1YkZpbmdlcnByaW50R2VzdHVyZVNlcnZpY2UuZW5hYmxlU2VsZihpbnN0cnVtZW50YXRpb24pOwotICAgICAgICBtSXNIYXJkd2FyZUF2YWlsYWJsZSA9IChtRmluZ2VycHJpbnRNYW5hZ2VyID09IG51bGwpID8gZmFsc2UgOgotICAgICAgICAgICAgICAgIG1GaW5nZXJwcmludE1hbmFnZXIuaXNIYXJkd2FyZURldGVjdGVkKCk7CiAgICAgICAgIG1GaW5nZXJwcmludEdlc3R1cmVDb250cm9sbGVyID0KICAgICAgICAgICAgICAgICBtRmluZ2VycHJpbnRHZXN0dXJlU2VydmljZS5nZXRGaW5nZXJwcmludEdlc3R1cmVDb250cm9sbGVyKCk7CiAgICAgfQpAQCAtNzYsMTYgKzgyLDEyIEBACiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2VzdHVyZURldGVjdGlvbkF2YWlsYWJsZV9pbml0aWFsU3RhdGVfc2hvdWxkQmVBdmFpbGFibGUoKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscyhtSXNIYXJkd2FyZUF2YWlsYWJsZSwKLSAgICAgICAgICAgICAgICBtRmluZ2VycHJpbnRHZXN0dXJlQ29udHJvbGxlci5pc0dlc3R1cmVEZXRlY3Rpb25BdmFpbGFibGUoKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2VzdHVyZURldGVjdGlvbkxpc3RlbmVyX3doZW5BdXRoZW50aWNhdGlvblN0YXJ0c0FuZFN0b3BzX2NhbGxlZEJhY2soKSB7Ci0gICAgICAgIGlmICghbUlzSGFyZHdhcmVBdmFpbGFibGUpIHsKKyAgICAgICAgaWYgKCFtRmluZ2VycHJpbnRHZXN0dXJlQ29udHJvbGxlci5pc0dlc3R1cmVEZXRlY3Rpb25BdmFpbGFibGUoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CisgICAgICAgIC8vIExhdW5jaCBhbiBhY3Rpdml0eSB0byBtYWtlIHN1cmUgd2UncmUgaW4gdGhlIGZvcmVncm91bmQKKyAgICAgICAgbUFjdGl2aXR5UnVsZS5sYXVuY2hBY3Rpdml0eShudWxsKTsKICAgICAgICAgbUZpbmdlcnByaW50R2VzdHVyZUNvbnRyb2xsZXIucmVnaXN0ZXJGaW5nZXJwcmludEdlc3R1cmVDYWxsYmFjaygKICAgICAgICAgICAgICAgICBtTW9ja0ZpbmdlcnByaW50R2VzdHVyZUNhbGxiYWNrLCBudWxsKTsKICAgICAgICAgdHJ5IHsKZGlmZiAtLWdpdCBhL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy9BY2Nlc3NpYmlsaXR5Rm9jdXNBbmRJbnB1dEZvY3VzU3luY0FjdGl2aXR5LmphdmEgYi90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9jdHMvQWNjZXNzaWJpbGl0eUZvY3VzQW5kSW5wdXRGb2N1c1N5bmNBY3Rpdml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjgzMWE0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy9BY2Nlc3NpYmlsaXR5Rm9jdXNBbmRJbnB1dEZvY3VzU3luY0FjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0Ci0gKiBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlCi0gKiBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKLSAqIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLmN0czsKLQotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotCi1pbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHMuUjsKLQotLyoqCi0gKiBBY3Rpdml0eSBmb3IgdGVzdGluZyB0aGUgYWNjZXNzaWJpbGl0eSBmb2N1cyBBUElzIGV4cG9zZWQgdG8KLSAqIGFjY2Vzc2liaWxpdHkgc2VydmljZXMuIFRoZXNlIEFQSXMgYWxsb3cgbW92aW5nIGFjY2Vzc2liaWxpdHkKLSAqIGZvY3VzIGluIHRoZSB2aWV3IHRyZWUgZnJvbSBhbiBBY2Nlc3NpaWJsaXR5U2VydmljZS4gU3BlY2lmaWNhbGx5LAotICogdGhpcyBhY3Rpdml0eSBpcyBmb3IgdmVyaWZ5aW5nIHRoZSB0aGUgc3luYyBiZXR3ZWVuIGFjY2Vzc2liaWxpdHkKLSAqIGFuZCBpbnB1dCBmb2N1cy4KLSAqLwotcHVibGljIGNsYXNzIEFjY2Vzc2liaWxpdHlGb2N1c0FuZElucHV0Rm9jdXNTeW5jQWN0aXZpdHkgZXh0ZW5kcyBBY2Nlc3NpYmlsaXR5VGVzdEFjdGl2aXR5IHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLSAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQuYWNjZXNzaWJpbGl0eV9mb2N1c19hbmRfaW5wdXRfZm9jdXNfc3luY190ZXN0KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9jdHMvQWNjZXNzaWJpbGl0eUZvY3VzQW5kSW5wdXRGb2N1c1N5bmNUZXN0LmphdmEgYi90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9jdHMvQWNjZXNzaWJpbGl0eUZvY3VzQW5kSW5wdXRGb2N1c1N5bmNUZXN0LmphdmEKaW5kZXggMDhlMjMxZi4uN2NiNTY5YyAxMDA2NDQKLS0tIGEvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2Uvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvY3RzL0FjY2Vzc2liaWxpdHlGb2N1c0FuZElucHV0Rm9jdXNTeW5jVGVzdC5qYXZhCisrKyBiL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy9BY2Nlc3NpYmlsaXR5Rm9jdXNBbmRJbnB1dEZvY3VzU3luY1Rlc3QuamF2YQpAQCAtMTcsMTUgKzE3LDE5IEBACiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlOb2RlSW5mby5BQ1RJT05fQUNDRVNTSUJJTElUWV9GT0NVUzsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU5vZGVJbmZvLkFDVElPTl9DTEVBUl9BQ0NFU1NJQklMSVRZX0ZPQ1VTOwogCitpbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHMuUjsKK2ltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLmN0cy5hY3Rpdml0aWVzLkFjY2Vzc2liaWxpdHlGb2N1c0FuZElucHV0Rm9jdXNTeW5jQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOwogaW1wb3J0IGFuZHJvaWQuYXBwLlVpQXV0b21hdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUHJlc3VibWl0OwogaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5Tm9kZUluZm87CiAKLWltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLmN0cy5SOwotCiBpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CiBpbXBvcnQgamF2YS51dGlsLlF1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOwogCiAvKioKICAqIFRlc3QgY2FzZXMgZm9yIHRlc3RpbmcgdGhlIGFjY2Vzc2liaWxpdHkgZm9jdXMgQVBJcyBleHBvc2VkIHRvIGFjY2Vzc2liaWxpdHkKQEAgLTQxLDYgKzQ1LDcgQEAKICAgICB9CiAKICAgICBATWVkaXVtVGVzdAorICAgIEBQcmVzdWJtaXQKICAgICBwdWJsaWMgdm9pZCB0ZXN0RmluZEFjY2Vzc2liaWxpdHlGb2N1cygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS5ydW5Pbk1haW5TeW5jKCgpIC0+IHsKICAgICAgICAgICAgIGdldEFjdGl2aXR5KCkuZmluZFZpZXdCeUlkKFIuaWQuZmlyc3RFZGl0VGV4dCkucmVxdWVzdEZvY3VzKCk7CkBAIC03Nyw2ICs4Miw3IEBACiAgICAgfQogCiAgICAgQE1lZGl1bVRlc3QKKyAgICBAUHJlc3VibWl0CiAgICAgcHVibGljIHZvaWQgdGVzdEluaXRpYWxTdGF0ZU5vQWNjZXNzaWJpbGl0eUZvY3VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIEdldCB0aGUgcm9vdCB3aGljaCBpcyBvbmx5IGFjY2Vzc2liaWxpdHkgZm9jdXNlZC4KICAgICAgICAgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIGZvY3VzZWQgPSBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRVaUF1dG9tYXRpb24oKQpAQCAtMTE0LDYgKzEyMCw3IEBACiAgICAgfQogCiAgICAgQE1lZGl1bVRlc3QKKyAgICBAUHJlc3VibWl0CiAgICAgcHVibGljIHZvaWQgdGVzdEFjdGlvbkNsZWFyQWNjZXNzaWJpbGl0eUZvY3VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIEdldCB0aGUgcm9vdCBsaW5lYXIgbGF5b3V0IGluZm8uCiAgICAgICAgIGZpbmFsIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyByb290TGluZWFyTGF5b3V0ID0gZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VWlBdXRvbWF0aW9uKCkKQEAgLTE2Miw2ICsxNjksNyBAQAogICAgIH0KIAogICAgIEBNZWRpdW1UZXN0CisgICAgQFByZXN1Ym1pdAogICAgIHB1YmxpYyB2b2lkIHRlc3RPbmx5T25lTm9kZUhhc0FjY2Vzc2liaWxpdHlGb2N1cygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBHZXQgdGhlIGZpcnN0IG5vdCBmb2N1c2VkIGVkaXQgdGV4dC4KICAgICAgICAgZmluYWwgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIGZpcnN0RWRpdFRleHQgPSBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRVaUF1dG9tYXRpb24oKQpAQCAtMjI4LDQgKzIzNiwzMCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQorCisgICAgQFByZXN1Ym1pdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTY3JlZW5SZWFkZXJGb2N1c2FibGVBdHRyaWJ1dGVfcmVwb3J0ZWRUb0FjY2Vzc2liaWxpdHkoKSB7CisgICAgICAgIGZpbmFsIEluc3RydW1lbnRhdGlvbiBpbnN0cnVtZW50YXRpb24gPSBnZXRJbnN0cnVtZW50YXRpb24oKTsKKyAgICAgICAgZmluYWwgVWlBdXRvbWF0aW9uIHVpQXV0b21hdGlvbiA9IGluc3RydW1lbnRhdGlvbi5nZXRVaUF1dG9tYXRpb24oKTsKKyAgICAgICAgZmluYWwgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIHNlY29uZEJ1dHRvbiA9IHVpQXV0b21hdGlvbi5nZXRSb290SW5BY3RpdmVXaW5kb3coKQorICAgICAgICAgICAgICAgIC5maW5kQWNjZXNzaWJpbGl0eU5vZGVJbmZvc0J5VGV4dChnZXRTdHJpbmcoUi5zdHJpbmcuc2Vjb25kQnV0dG9uKSkuZ2V0KDApOworICAgICAgICBhc3NlcnRUcnVlKCJTY3JlZW4gcmVhZGVyIGZvY3VzYWJpbGl0eSBub3QgcHJvcGFnYXRlZCBmcm9tIHhtbCB0byBhY2Nlc3NpYmlsaXR5IiwKKyAgICAgICAgICAgICAgICBzZWNvbmRCdXR0b24uaXNTY3JlZW5SZWFkZXJGb2N1c2FibGUoKSk7CisKKyAgICAgICAgLy8gVmVyaWZ5IHRoZSBzZXR0ZXIgYW5kIGdldHRlciB3b3JrCisgICAgICAgIGZpbmFsIEF0b21pY0Jvb2xlYW4gaXNTY3JlZW5SZWFkZXJGb2N1c2FibGVBdG9taWMgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7CisgICAgICAgIGluc3RydW1lbnRhdGlvbi5ydW5Pbk1haW5TeW5jKCgpIC0+IHsKKyAgICAgICAgICAgIFZpZXcgc2Vjb25kQnV0dG9uVmlldyA9IGdldEFjdGl2aXR5KCkuZmluZFZpZXdCeUlkKFIuaWQuc2Vjb25kQnV0dG9uKTsKKyAgICAgICAgICAgIHNlY29uZEJ1dHRvblZpZXcuc2V0U2NyZWVuUmVhZGVyRm9jdXNhYmxlKGZhbHNlKTsKKyAgICAgICAgICAgIGlzU2NyZWVuUmVhZGVyRm9jdXNhYmxlQXRvbWljLnNldChzZWNvbmRCdXR0b25WaWV3LmlzU2NyZWVuUmVhZGVyRm9jdXNhYmxlKCkpOworICAgICAgICB9KTsKKworICAgICAgICBhc3NlcnRGYWxzZSgiaXNTY3JlZW5SZWFkZXJGb2N1c2FibGUgZGlkIG5vdCBjaGFuZ2UgYWZ0ZXIgdmFsdWUgc2V0IiwKKyAgICAgICAgICAgICAgICBpc1NjcmVlblJlYWRlckZvY3VzYWJsZUF0b21pYy5nZXQoKSk7CisKKyAgICAgICAgc2Vjb25kQnV0dG9uLnJlZnJlc2goKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoCisgICAgICAgICAgICAgICAgIlNjcmVlbiByZWFkZXIgZm9jdXNhYmlsaXR5IG5vdCBwcm9wYWdhdGVkIHRvIGFjY2Vzc2liaWxpdHkgYWZ0ZXIgY2FsbGluZyBzZXR0ZXIiLAorICAgICAgICAgICAgICAgIHNlY29uZEJ1dHRvbi5pc1NjcmVlblJlYWRlckZvY3VzYWJsZSgpKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9jdHMvQWNjZXNzaWJpbGl0eUdlc3R1cmVEZXRlY3RvclRlc3QuamF2YSBiL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy9BY2Nlc3NpYmlsaXR5R2VzdHVyZURldGVjdG9yVGVzdC5qYXZhCmluZGV4IGZkMWE5ZmQuLjFkYWI0ZmYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy9BY2Nlc3NpYmlsaXR5R2VzdHVyZURldGVjdG9yVGVzdC5qYXZhCisrKyBiL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy9BY2Nlc3NpYmlsaXR5R2VzdHVyZURldGVjdG9yVGVzdC5qYXZhCkBAIC0xNSw3ICsxNSw2IEBACiBwYWNrYWdlIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuY3RzOwogCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8uYW55OwogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnRpbWVvdXQ7CiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8udmVyaWZ5OwpAQCAtMjgsMTIgKzI3LDEzIEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGF0aDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7CiBpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKQEAgLTQxLDYgKzQxLDggQEAKIGltcG9ydCBvcmcubW9ja2l0by5Nb2NrOwogaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG9Bbm5vdGF0aW9uczsKIAoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKIC8qKgogICogVmVyaWZ5IHRoYXQgbW90aW9uIGV2ZW50cyBhcmUgcmVjb2duaXplZCBhcyBhY2Nlc3NpYmlsaXR5IGdlc3R1cmVzLgogICovCkBAIC0xMDMsNiArMTA1LDcgQEAKICAgICB9CiAKICAgICBAVGVzdAorICAgIEBBcHBNb2RlRnVsbAogICAgIHB1YmxpYyB2b2lkIHRlc3RSZWNvZ25pemVHZXN0dXJlUGF0aCgpIHsKICAgICAgICAgaWYgKCFtSGFzVG91Y2hTY3JlZW4gfHwgIW1TY3JlZW5CaWdFbm91Z2gpIHsKICAgICAgICAgICAgIHJldHVybjsKZGlmZiAtLWdpdCBhL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy9BY2Nlc3NpYmlsaXR5R2VzdHVyZURpc3BhdGNoVGVzdC5qYXZhIGIvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2Uvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvY3RzL0FjY2Vzc2liaWxpdHlHZXN0dXJlRGlzcGF0Y2hUZXN0LmphdmEKaW5kZXggYWEzMGY3Ny4uY2RkMTA5YyAxMDA2NDQKLS0tIGEvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2Uvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvY3RzL0FjY2Vzc2liaWxpdHlHZXN0dXJlRGlzcGF0Y2hUZXN0LmphdmEKKysrIGIvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2Uvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvY3RzL0FjY2Vzc2liaWxpdHlHZXN0dXJlRGlzcGF0Y2hUZXN0LmphdmEKQEAgLTE0LDYgKzE0LDE3IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHM7CiAKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHMudXRpbHMuQXN5bmNVdGlscy5hd2FpdDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHMudXRpbHMuQXN5bmNVdGlscy5hd2FpdENhbmNlbGxhdGlvbjsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHMudXRpbHMuR2VzdHVyZVV0aWxzLmFkZDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHMudXRpbHMuR2VzdHVyZVV0aWxzLmNlaWw7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuY3RzLnV0aWxzLkdlc3R1cmVVdGlscy5jbGljazsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHMudXRpbHMuR2VzdHVyZVV0aWxzLmRpZmY7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuY3RzLnV0aWxzLkdlc3R1cmVVdGlscy5kaXNwYXRjaEdlc3R1cmU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuY3RzLnV0aWxzLkdlc3R1cmVVdGlscy5sb25nQ2xpY2s7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuY3RzLnV0aWxzLkdlc3R1cmVVdGlscy5wYXRoOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLmN0cy51dGlscy5HZXN0dXJlVXRpbHMudGltZXM7CisKIGltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5hbGxPZjsKIGltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5hbnk7CiBpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuYm90aDsKQEAgLTIxLDE5ICszMiwyMSBAQAogaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmhhc0l0ZW07CiBpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CiAKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQuTUlMTElTRUNPTkRTOworCiBpbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZTsKIGltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkdlc3R1cmVEZXNjcmlwdGlvbjsKIGltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkdlc3R1cmVEZXNjcmlwdGlvbi5TdHJva2VEZXNjcmlwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLmN0cy5hY3Rpdml0aWVzLkFjY2Vzc2liaWxpdHlUZXN0QWN0aXZpdHk7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGF0aDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvaW50OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnRGOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOwogaW1wb3J0IGFuZHJvaWQudGVzdC5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuRGlzcGxheTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CkBAIC00MSw2ICs1NCw3IEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdDb25maWd1cmF0aW9uOwogaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCiBpbXBvcnQgb3JnLmhhbWNyZXN0LkRlc2NyaXB0aW9uOwogaW1wb3J0IG9yZy5oYW1jcmVzdC5NYXRjaGVyOwogaW1wb3J0IG9yZy5oYW1jcmVzdC5UeXBlU2FmZU1hdGNoZXI7CkBAIC01Miw2ICs2Niw3IEBACiAvKioKICAqIFZlcmlmeSB0aGF0IGdlc3R1cmVzIGRpc3BhdGNoZWQgZnJvbSBhbiBhY2Nlc3NpYmlsaXR5IHNlcnZpY2Ugc2hvdyB1cCBpbiB0aGUgY3VycmVudCBVSQogICovCitAQXBwTW9kZUZ1bGwKIHB1YmxpYyBjbGFzcyBBY2Nlc3NpYmlsaXR5R2VzdHVyZURpc3BhdGNoVGVzdCBleHRlbmRzCiAgICAgICAgIEFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyPEFjY2Vzc2liaWxpdHlHZXN0dXJlRGlzcGF0Y2hUZXN0Lkdlc3R1cmVEaXNwYXRjaEFjdGl2aXR5PiB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IEFjY2Vzc2liaWxpdHlHZXN0dXJlRGlzcGF0Y2hUZXN0LmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKQEAgLTc2LDcgKzkxLDYgQEAKICAgICBmaW5hbCBMaXN0PE1vdGlvbkV2ZW50PiBtTW90aW9uRXZlbnRzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgU3R1Ykdlc3R1cmVBY2Nlc3NpYmlsaXR5U2VydmljZSBtU2VydmljZTsKICAgICBNeVRvdWNoTGlzdGVuZXIgbU15VG91Y2hMaXN0ZW5lciA9IG5ldyBNeVRvdWNoTGlzdGVuZXIoKTsKLSAgICBNeUdlc3R1cmVDYWxsYmFjayBtQ2FsbGJhY2s7CiAgICAgVGV4dFZpZXcgbUZ1bGxTY3JlZW5UZXh0VmlldzsKICAgICBpbnRbXSBtVmlld0xvY2F0aW9uID0gbmV3IGludFsyXTsKICAgICBib29sZWFuIG1Hb3RVcEV2ZW50OwpAQCAtMTExLDcgKzEyNSw2IEBACiAgICAgICAgIG1TZXJ2aWNlID0gU3R1Ykdlc3R1cmVBY2Nlc3NpYmlsaXR5U2VydmljZS5lbmFibGVTZWxmKGdldEluc3RydW1lbnRhdGlvbigpKTsKIAogICAgICAgICBtTW90aW9uRXZlbnRzLmNsZWFyKCk7Ci0gICAgICAgIG1DYWxsYmFjayA9IG5ldyBNeUdlc3R1cmVDYWxsYmFjaygpOwogICAgICAgICBtR290VXBFdmVudCA9IGZhbHNlOwogICAgIH0KIApAQCAtMTMwLDEwICsxNDMsOCBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgUG9pbnQgY2xpY2tQb2ludCA9IG5ldyBQb2ludCgxMCwgMjApOwotICAgICAgICBHZXN0dXJlRGVzY3JpcHRpb24gY2xpY2sgPSBjcmVhdGVDbGlja0luVmlld0JvdW5kcyhjbGlja1BvaW50KTsKLSAgICAgICAgbVNlcnZpY2UucnVuT25TZXJ2aWNlU3luYygoKSAtPiBtU2VydmljZS5kb0Rpc3BhdGNoR2VzdHVyZShjbGljaywgbUNhbGxiYWNrLCBudWxsKSk7Ci0gICAgICAgIG1DYWxsYmFjay5hc3NlcnRHZXN0dXJlQ29tcGxldGVzKEdFU1RVUkVfQ09NUExFVElPTl9USU1FT1VUKTsKKyAgICAgICAgUG9pbnRGIGNsaWNrUG9pbnQgPSBuZXcgUG9pbnRGKDEwLCAyMCk7CisgICAgICAgIGRpc3BhdGNoKGNsaWNrV2l0aGluVmlldyhjbGlja1BvaW50KSwgR0VTVFVSRV9DT01QTEVUSU9OX1RJTUVPVVQpOwogICAgICAgICB3YWl0Rm9yTW90aW9uRXZlbnRzKGFueShNb3Rpb25FdmVudC5jbGFzcyksIDIpOwogCiAgICAgICAgIGFzc2VydEVxdWFscygyLCBtTW90aW9uRXZlbnRzLnNpemUoKSk7CkBAIC0xNjUsMTAgKzE3Niw4IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICBQb2ludCBjbGlja1BvaW50ID0gbmV3IFBvaW50KDEwLCAyMCk7Ci0gICAgICAgIEdlc3R1cmVEZXNjcmlwdGlvbiBsb25nQ2xpY2sgPSBjcmVhdGVMb25nQ2xpY2tJblZpZXdCb3VuZHMoY2xpY2tQb2ludCk7Ci0gICAgICAgIG1TZXJ2aWNlLnJ1bk9uU2VydmljZVN5bmMoKCkgLT4gbVNlcnZpY2UuZG9EaXNwYXRjaEdlc3R1cmUobG9uZ0NsaWNrLCBtQ2FsbGJhY2ssIG51bGwpKTsKLSAgICAgICAgbUNhbGxiYWNrLmFzc2VydEdlc3R1cmVDb21wbGV0ZXMoCisgICAgICAgIFBvaW50RiBjbGlja1BvaW50ID0gbmV3IFBvaW50RigxMCwgMjApOworICAgICAgICBkaXNwYXRjaChsb25nQ2xpY2tXaXRoaW5WaWV3KGNsaWNrUG9pbnQpLAogICAgICAgICAgICAgICAgIFZpZXdDb25maWd1cmF0aW9uLmdldExvbmdQcmVzc1RpbWVvdXQoKSArIEdFU1RVUkVfQ09NUExFVElPTl9USU1FT1VUKTsKIAogICAgICAgICB3YWl0Rm9yTW90aW9uRXZlbnRzKGFueShNb3Rpb25FdmVudC5jbGFzcyksIDIpOwpAQCAtMTg3LDEzICsxOTYsMTIgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIFBvaW50IHN0YXJ0UG9pbnQgPSBuZXcgUG9pbnQoMTAsIDIwKTsKLSAgICAgICAgUG9pbnQgZW5kUG9pbnQgPSBuZXcgUG9pbnQoMjAsIDQwKTsKKyAgICAgICAgUG9pbnRGIHN0YXJ0UG9pbnQgPSBuZXcgUG9pbnRGKDEwLCAyMCk7CisgICAgICAgIFBvaW50RiBlbmRQb2ludCA9IG5ldyBQb2ludEYoMjAsIDQwKTsKICAgICAgICAgaW50IGdlc3R1cmVUaW1lID0gNTAwOwogCi0gICAgICAgIEdlc3R1cmVEZXNjcmlwdGlvbiBzd2lwZSA9IGNyZWF0ZVN3aXBlSW5WaWV3Qm91bmRzKHN0YXJ0UG9pbnQsIGVuZFBvaW50LCBnZXN0dXJlVGltZSk7Ci0gICAgICAgIG1TZXJ2aWNlLnJ1bk9uU2VydmljZVN5bmMoKCkgLT4gbVNlcnZpY2UuZG9EaXNwYXRjaEdlc3R1cmUoc3dpcGUsIG1DYWxsYmFjaywgbnVsbCkpOwotICAgICAgICBtQ2FsbGJhY2suYXNzZXJ0R2VzdHVyZUNvbXBsZXRlcyhnZXN0dXJlVGltZSArIEdFU1RVUkVfQ09NUExFVElPTl9USU1FT1VUKTsKKyAgICAgICAgZGlzcGF0Y2goc3dpcGVXaXRoaW5WaWV3KHN0YXJ0UG9pbnQsIGVuZFBvaW50LCBnZXN0dXJlVGltZSksCisgICAgICAgICAgICAgICAgZ2VzdHVyZVRpbWUgKyBHRVNUVVJFX0NPTVBMRVRJT05fVElNRU9VVCk7CiAgICAgICAgIHdhaXRGb3JNb3Rpb25FdmVudHMoSVNfQUNUSU9OX1VQLCAxKTsKIAogICAgICAgICBpbnQgbnVtRXZlbnRzID0gbU1vdGlvbkV2ZW50cy5zaXplKCk7CkBAIC0yMTAsMzAgKzIxOCwzMSBAQAogICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtb3ZlRXZlbnQuZ2V0RXZlbnRUaW1lKCkgPj0gbGFzdEV2ZW50VGltZSk7CiAgICAgICAgICAgICBmbG9hdCBmcmFjdGlvbk9mU3dpcGUgPQogICAgICAgICAgICAgICAgICAgICAoKGZsb2F0KSAobW92ZUV2ZW50LmdldEV2ZW50VGltZSgpIC0gZG93bkV2ZW50LmdldEV2ZW50VGltZSgpKSkgLyBnZXN0dXJlVGltZTsKLSAgICAgICAgICAgIGZsb2F0IGZyYWN0aW9uWCA9ICgoZmxvYXQpIChlbmRQb2ludC54IC0gc3RhcnRQb2ludC54KSkgKiBmcmFjdGlvbk9mU3dpcGUgKyAwLjVmOwotICAgICAgICAgICAgZmxvYXQgZnJhY3Rpb25ZID0gKChmbG9hdCkgKGVuZFBvaW50LnkgLSBzdGFydFBvaW50LnkpKSAqIGZyYWN0aW9uT2ZTd2lwZSArIDAuNWY7Ci0gICAgICAgICAgICBQb2ludCBpbnRlcm1lZGlhdGVQb2ludCA9IG5ldyBQb2ludChzdGFydFBvaW50KTsKLSAgICAgICAgICAgIGludGVybWVkaWF0ZVBvaW50Lm9mZnNldCgoaW50KSBmcmFjdGlvblgsIChpbnQpIGZyYWN0aW9uWSk7CisgICAgICAgICAgICBQb2ludEYgaW50ZXJtZWRpYXRlUG9pbnQgPSBhZGQoc3RhcnRQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgY2VpbCh0aW1lcyhmcmFjdGlvbk9mU3dpcGUsIGRpZmYoZW5kUG9pbnQsIHN0YXJ0UG9pbnQpKSkpOwogICAgICAgICAgICAgYXNzZXJ0VGhhdChtb3ZlRXZlbnQsIGJvdGgoSVNfQUNUSU9OX01PVkUpLmFuZChpc0F0UG9pbnQoaW50ZXJtZWRpYXRlUG9pbnQpKSk7CiAgICAgICAgICAgICBsYXN0RXZlbnRUaW1lID0gbW92ZUV2ZW50LmdldEV2ZW50VGltZSgpOwogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgZGlzcGF0Y2goR2VzdHVyZURlc2NyaXB0aW9uIGdlc3R1cmUsIGludCB0aW1lb3V0TXMpIHsKKyAgICAgICAgYXdhaXQoZGlzcGF0Y2hHZXN0dXJlKG1TZXJ2aWNlLCBnZXN0dXJlKSwgdGltZW91dE1zLCBNSUxMSVNFQ09ORFMpOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHRlc3RTbG93U3dpcGVfc2hvdWxkTm90Q29udGFpbk1vdmVzRm9yVGlueU1vdmVtZW50KCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFtSGFzVG91Y2hTY3JlZW4pIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIFBvaW50IHN0YXJ0UG9pbnQgPSBuZXcgUG9pbnQoMTAsIDIwKTsKLSAgICAgICAgUG9pbnQgaW50ZXJtZWRpYXRlUG9pbnQxID0gbmV3IFBvaW50KDEwLCAyMSk7Ci0gICAgICAgIFBvaW50IGludGVybWVkaWF0ZVBvaW50MiA9IG5ldyBQb2ludCgxMSwgMjEpOwotICAgICAgICBQb2ludCBpbnRlcm1lZGlhdGVQb2ludDMgPSBuZXcgUG9pbnQoMTEsIDIyKTsKLSAgICAgICAgUG9pbnQgZW5kUG9pbnQgPSBuZXcgUG9pbnQoMTEsIDIyKTsKKyAgICAgICAgUG9pbnRGIHN0YXJ0UG9pbnQgPSBuZXcgUG9pbnRGKDEwLCAyMCk7CisgICAgICAgIFBvaW50RiBpbnRlcm1lZGlhdGVQb2ludDEgPSBuZXcgUG9pbnRGKDEwLCAyMSk7CisgICAgICAgIFBvaW50RiBpbnRlcm1lZGlhdGVQb2ludDIgPSBuZXcgUG9pbnRGKDExLCAyMSk7CisgICAgICAgIFBvaW50RiBpbnRlcm1lZGlhdGVQb2ludDMgPSBuZXcgUG9pbnRGKDExLCAyMik7CisgICAgICAgIFBvaW50RiBlbmRQb2ludCA9IG5ldyBQb2ludEYoMTEsIDIyKTsKICAgICAgICAgaW50IGdlc3R1cmVUaW1lID0gMTAwMDsKIAotICAgICAgICBHZXN0dXJlRGVzY3JpcHRpb24gc3dpcGUgPSBjcmVhdGVTd2lwZUluVmlld0JvdW5kcyhzdGFydFBvaW50LCBlbmRQb2ludCwgZ2VzdHVyZVRpbWUpOwotICAgICAgICBtU2VydmljZS5ydW5PblNlcnZpY2VTeW5jKCgpIC0+IG1TZXJ2aWNlLmRvRGlzcGF0Y2hHZXN0dXJlKHN3aXBlLCBtQ2FsbGJhY2ssIG51bGwpKTsKLSAgICAgICAgbUNhbGxiYWNrLmFzc2VydEdlc3R1cmVDb21wbGV0ZXMoZ2VzdHVyZVRpbWUgKyBHRVNUVVJFX0NPTVBMRVRJT05fVElNRU9VVCk7CisgICAgICAgIGRpc3BhdGNoKHN3aXBlV2l0aGluVmlldyhzdGFydFBvaW50LCBlbmRQb2ludCwgZ2VzdHVyZVRpbWUpLAorICAgICAgICAgICAgICAgIGdlc3R1cmVUaW1lICsgR0VTVFVSRV9DT01QTEVUSU9OX1RJTUVPVVQpOwogICAgICAgICB3YWl0Rm9yTW90aW9uRXZlbnRzKElTX0FDVElPTl9VUCwgMSk7CiAKICAgICAgICAgYXNzZXJ0RXF1YWxzKDUsIG1Nb3Rpb25FdmVudHMuc2l6ZSgpKTsKQEAgLTI0OSwxNiArMjU4LDE0IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICBQb2ludCBjZW50ZXJQb2ludCA9IG5ldyBQb2ludCg1MCwgNjApOworICAgICAgICBQb2ludEYgY2VudGVyUG9pbnQgPSBuZXcgUG9pbnRGKDUwLCA2MCk7CiAgICAgICAgIGludCBzdGFydFNwYWNpbmcgPSAxMDA7CiAgICAgICAgIGludCBlbmRTcGFjaW5nID0gNTA7CiAgICAgICAgIGludCBnZXN0dXJlVGltZSA9IDUwMDsKICAgICAgICAgZmxvYXQgcGluY2hUb2xlcmFuY2UgPSAyLjBmOwogCi0gICAgICAgIEdlc3R1cmVEZXNjcmlwdGlvbiBwaW5jaCA9IGNyZWF0ZVBpbmNoSW5WaWV3Qm91bmRzKGNlbnRlclBvaW50LCBzdGFydFNwYWNpbmcsCi0gICAgICAgICAgICAgICAgZW5kU3BhY2luZywgNDUuMEYsIGdlc3R1cmVUaW1lKTsKLSAgICAgICAgbVNlcnZpY2UucnVuT25TZXJ2aWNlU3luYygoKSAtPiBtU2VydmljZS5kb0Rpc3BhdGNoR2VzdHVyZShwaW5jaCwgbUNhbGxiYWNrLCBudWxsKSk7Ci0gICAgICAgIG1DYWxsYmFjay5hc3NlcnRHZXN0dXJlQ29tcGxldGVzKGdlc3R1cmVUaW1lICsgR0VTVFVSRV9DT01QTEVUSU9OX1RJTUVPVVQpOworICAgICAgICBkaXNwYXRjaChwaW5jaFdpdGhpblZpZXcoY2VudGVyUG9pbnQsIHN0YXJ0U3BhY2luZywgZW5kU3BhY2luZywgNDUuMEYsIGdlc3R1cmVUaW1lKSwKKyAgICAgICAgICAgICAgICBnZXN0dXJlVGltZSArIEdFU1RVUkVfQ09NUExFVElPTl9USU1FT1VUKTsKICAgICAgICAgd2FpdEZvck1vdGlvbkV2ZW50cyhJU19BQ1RJT05fVVAsIDEpOwogICAgICAgICBpbnQgbnVtRXZlbnRzID0gbU1vdGlvbkV2ZW50cy5zaXplKCk7CiAKQEAgLTMyMywxMyArMzMwLDEwIEBACiAgICAgICAgICAgICBtYWdSZWdpb25DZW50ZXJQb2ludC5zZXQobWFnbmlmaWNhdGlvbkNvbnRyb2xsZXIuZ2V0Q2VudGVyWCgpLAogICAgICAgICAgICAgICAgICAgICBtYWduaWZpY2F0aW9uQ29udHJvbGxlci5nZXRDZW50ZXJZKCkpOwogICAgICAgICB9KTsKLSAgICAgICAgZmluYWwgUG9pbnRGIG1hZ1JlZ2lvbk9mZnNldFBvaW50ID0gbmV3IFBvaW50RigpOwotICAgICAgICBtYWdSZWdpb25PZmZzZXRQb2ludC5zZXQobWFnUmVnaW9uQ2VudGVyUG9pbnQpOwotICAgICAgICBtYWdSZWdpb25PZmZzZXRQb2ludC5vZmZzZXQoQ0xJQ0tfT0ZGU0VUX1gsIENMSUNLX09GRlNFVF9ZKTsKKyAgICAgICAgZmluYWwgUG9pbnRGIG1hZ1JlZ2lvbk9mZnNldFBvaW50CisgICAgICAgICAgICAgICAgPSBhZGQobWFnUmVnaW9uQ2VudGVyUG9pbnQsIENMSUNLX09GRlNFVF9YLCBDTElDS19PRkZTRVRfWSk7CiAKLSAgICAgICAgZmluYWwgUG9pbnRGIG1hZ1JlZ2lvbk9mZnNldENsaWNrUG9pbnQgPSBuZXcgUG9pbnRGKCk7Ci0gICAgICAgIG1hZ1JlZ2lvbk9mZnNldENsaWNrUG9pbnQuc2V0KG1hZ1JlZ2lvbkNlbnRlclBvaW50KTsKLSAgICAgICAgbWFnUmVnaW9uT2Zmc2V0Q2xpY2tQb2ludC5vZmZzZXQoCisgICAgICAgIGZpbmFsIFBvaW50RiBtYWdSZWdpb25PZmZzZXRDbGlja1BvaW50ID0gYWRkKG1hZ1JlZ2lvbkNlbnRlclBvaW50LAogICAgICAgICAgICAgICAgIENMSUNLX09GRlNFVF9YICogTUFHTklGSUNBVElPTl9GQUNUT1IsIENMSUNLX09GRlNFVF9ZICogTUFHTklGSUNBVElPTl9GQUNUT1IpOwogCiAgICAgICAgIHRyeSB7CkBAIC0zNDEsMTYgKzM0NSwxNiBAQAogICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIHNldCBzY2FsZSIsIHNldFNjYWxlLmdldCgpKTsKIAogICAgICAgICAgICAgLy8gQ2xpY2sgaW4gdGhlIGNlbnRlciBvZiB0aGUgbWFnbmlmaWNhdGlvbiByZWdpb24KLSAgICAgICAgICAgIEdlc3R1cmVEZXNjcmlwdGlvbiBtYWdSZWdpb25DZW50ZXJDbGljayA9IGNyZWF0ZUNsaWNrKG1hZ1JlZ2lvbkNlbnRlclBvaW50KTsKLSAgICAgICAgICAgIG1TZXJ2aWNlLnJ1bk9uU2VydmljZVN5bmMoKCkgLT4gbVNlcnZpY2UuZG9EaXNwYXRjaEdlc3R1cmUoCi0gICAgICAgICAgICAgICAgICAgIG1hZ1JlZ2lvbkNlbnRlckNsaWNrLCBtQ2FsbGJhY2ssIG51bGwpKTsKLSAgICAgICAgICAgIG1DYWxsYmFjay5hc3NlcnRHZXN0dXJlQ29tcGxldGVzKEdFU1RVUkVfQ09NUExFVElPTl9USU1FT1VUKTsKKyAgICAgICAgICAgIGRpc3BhdGNoKG5ldyBHZXN0dXJlRGVzY3JpcHRpb24uQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgIC5hZGRTdHJva2UoY2xpY2sobWFnUmVnaW9uQ2VudGVyUG9pbnQpKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSwKKyAgICAgICAgICAgICAgICAgICAgR0VTVFVSRV9DT01QTEVUSU9OX1RJTUVPVVQpOwogCiAgICAgICAgICAgICAvLyBDbGljayBhdCBhIHNsaWdodGx5IG9mZnNldCBwb2ludAotICAgICAgICAgICAgR2VzdHVyZURlc2NyaXB0aW9uIG1hZ1JlZ2lvbk9mZnNldENsaWNrID0gY3JlYXRlQ2xpY2sobWFnUmVnaW9uT2Zmc2V0Q2xpY2tQb2ludCk7Ci0gICAgICAgICAgICBtU2VydmljZS5ydW5PblNlcnZpY2VTeW5jKCgpIC0+IG1TZXJ2aWNlLmRvRGlzcGF0Y2hHZXN0dXJlKAotICAgICAgICAgICAgICAgICAgICBtYWdSZWdpb25PZmZzZXRDbGljaywgbUNhbGxiYWNrLCBudWxsKSk7Ci0gICAgICAgICAgICBtQ2FsbGJhY2suYXNzZXJ0R2VzdHVyZUNvbXBsZXRlcyhHRVNUVVJFX0NPTVBMRVRJT05fVElNRU9VVCk7CisgICAgICAgICAgICBkaXNwYXRjaChuZXcgR2VzdHVyZURlc2NyaXB0aW9uLkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAuYWRkU3Ryb2tlKGNsaWNrKG1hZ1JlZ2lvbk9mZnNldENsaWNrUG9pbnQpKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSwKKyAgICAgICAgICAgICAgICAgICAgR0VTVFVSRV9DT01QTEVUSU9OX1RJTUVPVVQpOwogICAgICAgICAgICAgd2FpdEZvck1vdGlvbkV2ZW50cyhhbnkoTW90aW9uRXZlbnQuY2xhc3MpLCA0KTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIC8vIFJlc2V0IG1hZ25pZmljYXRpb24KQEAgLTM4NiwzMCArMzkwLDI1IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICBQb2ludCBzdGFydCA9IG5ldyBQb2ludCgxMCwgMjApOwotICAgICAgICBQb2ludCBtaWQxID0gbmV3IFBvaW50KDIwLCAyMCk7Ci0gICAgICAgIFBvaW50IG1pZDIgPSBuZXcgUG9pbnQoMjAsIDI1KTsKLSAgICAgICAgUG9pbnQgZW5kID0gbmV3IFBvaW50KDIwLCAzMCk7CisgICAgICAgIFBvaW50RiBzdGFydCA9IG5ldyBQb2ludEYoMTAsIDIwKTsKKyAgICAgICAgUG9pbnRGIG1pZDEgPSBuZXcgUG9pbnRGKDIwLCAyMCk7CisgICAgICAgIFBvaW50RiBtaWQyID0gbmV3IFBvaW50RigyMCwgMjUpOworICAgICAgICBQb2ludEYgZW5kID0gbmV3IFBvaW50RigyMCwgMzApOwogICAgICAgICBpbnQgZ2VzdHVyZVRpbWUgPSA1MDA7CiAKICAgICAgICAgU3Ryb2tlRGVzY3JpcHRpb24gczEgPSBuZXcgU3Ryb2tlRGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgbGluZVBhdGhJblZpZXdCb3VuZHMoc3RhcnQsIG1pZDEpLCAwLCBnZXN0dXJlVGltZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgbGluZVdpdGhpblZpZXcoc3RhcnQsIG1pZDEpLCAwLCBnZXN0dXJlVGltZSwgdHJ1ZSk7CiAgICAgICAgIFN0cm9rZURlc2NyaXB0aW9uIHMyID0gczEuY29udGludWVTdHJva2UoCi0gICAgICAgICAgICAgICAgbGluZVBhdGhJblZpZXdCb3VuZHMobWlkMSwgbWlkMiksIDAsIGdlc3R1cmVUaW1lLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBsaW5lV2l0aGluVmlldyhtaWQxLCBtaWQyKSwgMCwgZ2VzdHVyZVRpbWUsIHRydWUpOwogICAgICAgICBTdHJva2VEZXNjcmlwdGlvbiBzMyA9IHMyLmNvbnRpbnVlU3Ryb2tlKAotICAgICAgICAgICAgICAgIGxpbmVQYXRoSW5WaWV3Qm91bmRzKG1pZDIsIGVuZCksIDAsIGdlc3R1cmVUaW1lLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgbGluZVdpdGhpblZpZXcobWlkMiwgZW5kKSwgMCwgZ2VzdHVyZVRpbWUsIGZhbHNlKTsKKwogICAgICAgICBHZXN0dXJlRGVzY3JpcHRpb24gZ2VzdHVyZTEgPSBuZXcgR2VzdHVyZURlc2NyaXB0aW9uLkJ1aWxkZXIoKS5hZGRTdHJva2UoczEpLmJ1aWxkKCk7CiAgICAgICAgIEdlc3R1cmVEZXNjcmlwdGlvbiBnZXN0dXJlMiA9IG5ldyBHZXN0dXJlRGVzY3JpcHRpb24uQnVpbGRlcigpLmFkZFN0cm9rZShzMikuYnVpbGQoKTsKICAgICAgICAgR2VzdHVyZURlc2NyaXB0aW9uIGdlc3R1cmUzID0gbmV3IEdlc3R1cmVEZXNjcmlwdGlvbi5CdWlsZGVyKCkuYWRkU3Ryb2tlKHMzKS5idWlsZCgpOwotCi0gICAgICAgIG1TZXJ2aWNlLnJ1bk9uU2VydmljZVN5bmMoKCkgLT4gbVNlcnZpY2UuZG9EaXNwYXRjaEdlc3R1cmUoZ2VzdHVyZTEsIG1DYWxsYmFjaywgbnVsbCkpOwotICAgICAgICBtQ2FsbGJhY2suYXNzZXJ0R2VzdHVyZUNvbXBsZXRlcyhnZXN0dXJlVGltZSArIEdFU1RVUkVfQ09NUExFVElPTl9USU1FT1VUKTsKLSAgICAgICAgbUNhbGxiYWNrLnJlc2V0KCk7Ci0gICAgICAgIG1TZXJ2aWNlLnJ1bk9uU2VydmljZVN5bmMoKCkgLT4gbVNlcnZpY2UuZG9EaXNwYXRjaEdlc3R1cmUoZ2VzdHVyZTIsIG1DYWxsYmFjaywgbnVsbCkpOwotICAgICAgICBtQ2FsbGJhY2suYXNzZXJ0R2VzdHVyZUNvbXBsZXRlcyhnZXN0dXJlVGltZSArIEdFU1RVUkVfQ09NUExFVElPTl9USU1FT1VUKTsKLSAgICAgICAgbUNhbGxiYWNrLnJlc2V0KCk7Ci0gICAgICAgIG1TZXJ2aWNlLnJ1bk9uU2VydmljZVN5bmMoKCkgLT4gbVNlcnZpY2UuZG9EaXNwYXRjaEdlc3R1cmUoZ2VzdHVyZTMsIG1DYWxsYmFjaywgbnVsbCkpOwotICAgICAgICBtQ2FsbGJhY2suYXNzZXJ0R2VzdHVyZUNvbXBsZXRlcyhnZXN0dXJlVGltZSArIEdFU1RVUkVfQ09NUExFVElPTl9USU1FT1VUKTsKKyAgICAgICAgZGlzcGF0Y2goZ2VzdHVyZTEsIGdlc3R1cmVUaW1lICsgR0VTVFVSRV9DT01QTEVUSU9OX1RJTUVPVVQpOworICAgICAgICBkaXNwYXRjaChnZXN0dXJlMiwgZ2VzdHVyZVRpbWUgKyBHRVNUVVJFX0NPTVBMRVRJT05fVElNRU9VVCk7CisgICAgICAgIGRpc3BhdGNoKGdlc3R1cmUzLCBnZXN0dXJlVGltZSArIEdFU1RVUkVfQ09NUExFVElPTl9USU1FT1VUKTsKICAgICAgICAgd2FpdEZvck1vdGlvbkV2ZW50cyhJU19BQ1RJT05fVVAsIDEpOwogCiAgICAgICAgIGFzc2VydFRoYXQobU1vdGlvbkV2ZW50cy5nZXQoMCksIGFsbE9mKElTX0FDVElPTl9ET1dOLCBpc0F0UG9pbnQoc3RhcnQpKSk7CkBAIC00MjUsMjUgKzQyNCwyNCBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgUG9pbnQgc3RhcnRQb2ludCA9IG5ldyBQb2ludCgxMCwgMjApOwotICAgICAgICBQb2ludCBtaWRQb2ludCA9IG5ldyBQb2ludCgyMCwgMjApOwotICAgICAgICBQb2ludCBlbmRQb2ludCA9IG5ldyBQb2ludCgyMCwgMzApOworICAgICAgICBQb2ludEYgc3RhcnRQb2ludCA9IG5ldyBQb2ludEYoMTAsIDIwKTsKKyAgICAgICAgUG9pbnRGIG1pZFBvaW50ID0gbmV3IFBvaW50RigyMCwgMjApOworICAgICAgICBQb2ludEYgZW5kUG9pbnQgPSBuZXcgUG9pbnRGKDIwLCAzMCk7CiAgICAgICAgIGludCBnZXN0dXJlVGltZSA9IDUwMDsKIAotICAgICAgICBTdHJva2VEZXNjcmlwdGlvbiBzdHJva2UxID0gbmV3IFN0cm9rZURlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgIGxpbmVQYXRoSW5WaWV3Qm91bmRzKHN0YXJ0UG9pbnQsIG1pZFBvaW50KSwgMCwgZ2VzdHVyZVRpbWUsIHRydWUpOwotICAgICAgICBHZXN0dXJlRGVzY3JpcHRpb24gZ2VzdHVyZTEgPSBuZXcgR2VzdHVyZURlc2NyaXB0aW9uLkJ1aWxkZXIoKS5hZGRTdHJva2Uoc3Ryb2tlMSkuYnVpbGQoKTsKLSAgICAgICAgbVNlcnZpY2UucnVuT25TZXJ2aWNlU3luYygoKSAtPiBtU2VydmljZS5kb0Rpc3BhdGNoR2VzdHVyZShnZXN0dXJlMSwgbUNhbGxiYWNrLCBudWxsKSk7Ci0gICAgICAgIG1DYWxsYmFjay5hc3NlcnRHZXN0dXJlQ29tcGxldGVzKGdlc3R1cmVUaW1lICsgR0VTVFVSRV9DT01QTEVUSU9OX1RJTUVPVVQpOworICAgICAgICBTdHJva2VEZXNjcmlwdGlvbiBzdHJva2UxID0KKyAgICAgICAgICAgICAgICBuZXcgU3Ryb2tlRGVzY3JpcHRpb24obGluZVdpdGhpblZpZXcoc3RhcnRQb2ludCwgbWlkUG9pbnQpLCAwLCBnZXN0dXJlVGltZSwgdHJ1ZSk7CisgICAgICAgIGRpc3BhdGNoKG5ldyBHZXN0dXJlRGVzY3JpcHRpb24uQnVpbGRlcigpLmFkZFN0cm9rZShzdHJva2UxKS5idWlsZCgpLAorICAgICAgICAgICAgICAgIGdlc3R1cmVUaW1lICsgR0VTVFVSRV9DT01QTEVUSU9OX1RJTUVPVVQpOwogICAgICAgICB3YWl0Rm9yTW90aW9uRXZlbnRzKGJvdGgoSVNfQUNUSU9OX01PVkUpLmFuZChpc0F0UG9pbnQobWlkUG9pbnQpKSwgMSk7CiAKLSAgICAgICAgU3Ryb2tlRGVzY3JpcHRpb24gc3Ryb2tlMiA9IHN0cm9rZTEuY29udGludWVTdHJva2UoCi0gICAgICAgICAgICAgICAgbGluZVBhdGhJblZpZXdCb3VuZHMoZW5kUG9pbnQsIG1pZFBvaW50KSwgMCwgZ2VzdHVyZVRpbWUsIGZhbHNlKTsKLSAgICAgICAgR2VzdHVyZURlc2NyaXB0aW9uIGdlc3R1cmUyID0gbmV3IEdlc3R1cmVEZXNjcmlwdGlvbi5CdWlsZGVyKCkuYWRkU3Ryb2tlKHN0cm9rZTIpLmJ1aWxkKCk7Ci0gICAgICAgIG1DYWxsYmFjay5yZXNldCgpOworICAgICAgICBTdHJva2VEZXNjcmlwdGlvbiBzdHJva2UyID0KKyAgICAgICAgICAgICAgICBzdHJva2UxLmNvbnRpbnVlU3Ryb2tlKGxpbmVXaXRoaW5WaWV3KGVuZFBvaW50LCBtaWRQb2ludCksIDAsIGdlc3R1cmVUaW1lLCBmYWxzZSk7CiAgICAgICAgIG1Nb3Rpb25FdmVudHMuY2xlYXIoKTsKLSAgICAgICAgbVNlcnZpY2UucnVuT25TZXJ2aWNlU3luYygoKSAtPiBtU2VydmljZS5kb0Rpc3BhdGNoR2VzdHVyZShnZXN0dXJlMiwgbUNhbGxiYWNrLCBudWxsKSk7Ci0gICAgICAgIG1DYWxsYmFjay5hc3NlcnRHZXN0dXJlQ2FuY2VscyhnZXN0dXJlVGltZSArIEdFU1RVUkVfQ09NUExFVElPTl9USU1FT1VUKTsKKyAgICAgICAgYXdhaXRDYW5jZWxsYXRpb24oCisgICAgICAgICAgICAgICAgZGlzcGF0Y2hHZXN0dXJlKG1TZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEdlc3R1cmVEZXNjcmlwdGlvbi5CdWlsZGVyKCkuYWRkU3Ryb2tlKHN0cm9rZTIpLmJ1aWxkKCkpLAorICAgICAgICAgICAgICAgIGdlc3R1cmVUaW1lICsgR0VTVFVSRV9DT01QTEVUSU9OX1RJTUVPVVQsIE1JTExJU0VDT05EUyk7CiAKICAgICAgICAgd2FpdEZvck1vdGlvbkV2ZW50cyhJU19BQ1RJT05fQ0FOQ0VMLCAxKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1Nb3Rpb25FdmVudHMuc2l6ZSgpKTsKQEAgLTQ1NCwyMyArNDUyLDIwIEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICBQb2ludCBzdGFydFBvaW50ID0gbmV3IFBvaW50KDEwLCAyMCk7Ci0gICAgICAgIFBvaW50IG1pZFBvaW50ID0gbmV3IFBvaW50KDIwLCAyMCk7Ci0gICAgICAgIFBvaW50IGVuZFBvaW50ID0gbmV3IFBvaW50KDIwLCAzMCk7CisgICAgICAgIFBvaW50RiBzdGFydFBvaW50ID0gbmV3IFBvaW50RigxMCwgMjApOworICAgICAgICBQb2ludEYgbWlkUG9pbnQgPSBuZXcgUG9pbnRGKDIwLCAyMCk7CisgICAgICAgIFBvaW50RiBlbmRQb2ludCA9IG5ldyBQb2ludEYoMjAsIDMwKTsKICAgICAgICAgaW50IGdlc3R1cmVUaW1lID0gNTAwOwogCi0gICAgICAgIFN0cm9rZURlc2NyaXB0aW9uIHN0cm9rZTEgPSBuZXcgU3Ryb2tlRGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgbGluZVBhdGhJblZpZXdCb3VuZHMoc3RhcnRQb2ludCwgbWlkUG9pbnQpLCAwLCBnZXN0dXJlVGltZSwgdHJ1ZSk7Ci0gICAgICAgIEdlc3R1cmVEZXNjcmlwdGlvbiBnZXN0dXJlMSA9IG5ldyBHZXN0dXJlRGVzY3JpcHRpb24uQnVpbGRlcigpLmFkZFN0cm9rZShzdHJva2UxKS5idWlsZCgpOwotICAgICAgICBtU2VydmljZS5ydW5PblNlcnZpY2VTeW5jKCgpIC0+IG1TZXJ2aWNlLmRvRGlzcGF0Y2hHZXN0dXJlKGdlc3R1cmUxLCBtQ2FsbGJhY2ssIG51bGwpKTsKLSAgICAgICAgbUNhbGxiYWNrLmFzc2VydEdlc3R1cmVDb21wbGV0ZXMoZ2VzdHVyZVRpbWUgKyBHRVNUVVJFX0NPTVBMRVRJT05fVElNRU9VVCk7CisgICAgICAgIFN0cm9rZURlc2NyaXB0aW9uIHN0cm9rZTEgPQorICAgICAgICAgICAgICAgIG5ldyBTdHJva2VEZXNjcmlwdGlvbihsaW5lV2l0aGluVmlldyhzdGFydFBvaW50LCBtaWRQb2ludCksIDAsIGdlc3R1cmVUaW1lLCB0cnVlKTsKKyAgICAgICAgZGlzcGF0Y2gobmV3IEdlc3R1cmVEZXNjcmlwdGlvbi5CdWlsZGVyKCkuYWRkU3Ryb2tlKHN0cm9rZTEpLmJ1aWxkKCksCisgICAgICAgICAgICAgICAgZ2VzdHVyZVRpbWUgKyBHRVNUVVJFX0NPTVBMRVRJT05fVElNRU9VVCk7CiAKLSAgICAgICAgU3Ryb2tlRGVzY3JpcHRpb24gc3Ryb2tlMiA9IG5ldyBTdHJva2VEZXNjcmlwdGlvbigKLSAgICAgICAgICAgICAgICBsaW5lUGF0aEluVmlld0JvdW5kcyhtaWRQb2ludCwgZW5kUG9pbnQpLCAwLCBnZXN0dXJlVGltZSwgZmFsc2UpOwotICAgICAgICBHZXN0dXJlRGVzY3JpcHRpb24gZ2VzdHVyZTIgPSBuZXcgR2VzdHVyZURlc2NyaXB0aW9uLkJ1aWxkZXIoKS5hZGRTdHJva2Uoc3Ryb2tlMikuYnVpbGQoKTsKLSAgICAgICAgbUNhbGxiYWNrLnJlc2V0KCk7Ci0gICAgICAgIG1TZXJ2aWNlLnJ1bk9uU2VydmljZVN5bmMoKCkgLT4gbVNlcnZpY2UuZG9EaXNwYXRjaEdlc3R1cmUoZ2VzdHVyZTIsIG1DYWxsYmFjaywgbnVsbCkpOwotICAgICAgICBtQ2FsbGJhY2suYXNzZXJ0R2VzdHVyZUNvbXBsZXRlcyhnZXN0dXJlVGltZSArIEdFU1RVUkVfQ09NUExFVElPTl9USU1FT1VUKTsKKyAgICAgICAgU3Ryb2tlRGVzY3JpcHRpb24gc3Ryb2tlMiA9CisgICAgICAgICAgICAgICAgbmV3IFN0cm9rZURlc2NyaXB0aW9uKGxpbmVXaXRoaW5WaWV3KG1pZFBvaW50LCBlbmRQb2ludCksIDAsIGdlc3R1cmVUaW1lLCBmYWxzZSk7CisgICAgICAgIGRpc3BhdGNoKG5ldyBHZXN0dXJlRGVzY3JpcHRpb24uQnVpbGRlcigpLmFkZFN0cm9rZShzdHJva2UyKS5idWlsZCgpLAorICAgICAgICAgICAgICAgIGdlc3R1cmVUaW1lICsgR0VTVFVSRV9DT01QTEVUSU9OX1RJTUVPVVQpOwogCiAgICAgICAgIHdhaXRGb3JNb3Rpb25FdmVudHMoSVNfQUNUSU9OX1VQLCAxKTsKIApAQCAtNDg5LDIwICs0ODQsMjAgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIFBvaW50IHN0YXJ0UG9pbnQgPSBuZXcgUG9pbnQoMTAsIDIwKTsKLSAgICAgICAgUG9pbnQgbWlkUG9pbnQgPSBuZXcgUG9pbnQoMjAsIDIwKTsKLSAgICAgICAgUG9pbnQgZW5kUG9pbnQgPSBuZXcgUG9pbnQoMjAsIDMwKTsKKyAgICAgICAgUG9pbnRGIHN0YXJ0UG9pbnQgPSBuZXcgUG9pbnRGKDEwLCAyMCk7CisgICAgICAgIFBvaW50RiBtaWRQb2ludCA9IG5ldyBQb2ludEYoMjAsIDIwKTsKKyAgICAgICAgUG9pbnRGIGVuZFBvaW50ID0gbmV3IFBvaW50RigyMCwgMzApOwogICAgICAgICBpbnQgZ2VzdHVyZVRpbWUgPSA1MDA7CiAKLSAgICAgICAgU3Ryb2tlRGVzY3JpcHRpb24gc3Ryb2tlMSA9IG5ldyBTdHJva2VEZXNjcmlwdGlvbigKLSAgICAgICAgICAgICAgICBsaW5lUGF0aEluVmlld0JvdW5kcyhzdGFydFBvaW50LCBtaWRQb2ludCksIDAsIGdlc3R1cmVUaW1lLCB0cnVlKTsKKyAgICAgICAgU3Ryb2tlRGVzY3JpcHRpb24gc3Ryb2tlMSA9CisgICAgICAgICAgICAgICAgbmV3IFN0cm9rZURlc2NyaXB0aW9uKGxpbmVXaXRoaW5WaWV3KHN0YXJ0UG9pbnQsIG1pZFBvaW50KSwgMCwgZ2VzdHVyZVRpbWUsIHRydWUpOwogCi0gICAgICAgIFN0cm9rZURlc2NyaXB0aW9uIHN0cm9rZTIgPSBzdHJva2UxLmNvbnRpbnVlU3Ryb2tlKAotICAgICAgICAgICAgICAgIGxpbmVQYXRoSW5WaWV3Qm91bmRzKG1pZFBvaW50LCBlbmRQb2ludCksIDAsIGdlc3R1cmVUaW1lLCBmYWxzZSk7Ci0gICAgICAgIEdlc3R1cmVEZXNjcmlwdGlvbiBnZXN0dXJlID0gbmV3IEdlc3R1cmVEZXNjcmlwdGlvbi5CdWlsZGVyKCkuYWRkU3Ryb2tlKHN0cm9rZTIpLmJ1aWxkKCk7Ci0gICAgICAgIG1DYWxsYmFjay5yZXNldCgpOwotICAgICAgICBtU2VydmljZS5ydW5PblNlcnZpY2VTeW5jKCgpIC0+IG1TZXJ2aWNlLmRvRGlzcGF0Y2hHZXN0dXJlKGdlc3R1cmUsIG1DYWxsYmFjaywgbnVsbCkpOwotICAgICAgICBtQ2FsbGJhY2suYXNzZXJ0R2VzdHVyZUNhbmNlbHMoZ2VzdHVyZVRpbWUgKyBHRVNUVVJFX0NPTVBMRVRJT05fVElNRU9VVCk7CisgICAgICAgIFN0cm9rZURlc2NyaXB0aW9uIHN0cm9rZTIgPQorICAgICAgICAgICAgICAgIHN0cm9rZTEuY29udGludWVTdHJva2UobGluZVdpdGhpblZpZXcobWlkUG9pbnQsIGVuZFBvaW50KSwgMCwgZ2VzdHVyZVRpbWUsIGZhbHNlKTsKKyAgICAgICAgYXdhaXRDYW5jZWxsYXRpb24oCisgICAgICAgICAgICAgICAgZGlzcGF0Y2hHZXN0dXJlKG1TZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEdlc3R1cmVEZXNjcmlwdGlvbi5CdWlsZGVyKCkuYWRkU3Ryb2tlKHN0cm9rZTIpLmJ1aWxkKCkpLAorICAgICAgICAgICAgICAgIGdlc3R1cmVUaW1lICsgR0VTVFVSRV9DT01QTEVUSU9OX1RJTUVPVVQsIE1JTExJU0VDT05EUyk7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBHZXN0dXJlRGlzcGF0Y2hBY3Rpdml0eSBleHRlbmRzIEFjY2Vzc2liaWxpdHlUZXN0QWN0aXZpdHkgewpAQCAtNTE3LDUyICs1MTIsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUdlc3R1cmVDYWxsYmFjayBleHRlbmRzIEFjY2Vzc2liaWxpdHlTZXJ2aWNlLkdlc3R1cmVSZXN1bHRDYWxsYmFjayB7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtQ29tcGxldGVkOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUNhbmNlbGxlZDsKLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG9uQ29tcGxldGVkKEdlc3R1cmVEZXNjcmlwdGlvbiBnZXN0dXJlRGVzY3JpcHRpb24pIHsKLSAgICAgICAgICAgIG1Db21wbGV0ZWQgPSB0cnVlOwotICAgICAgICAgICAgbm90aWZ5QWxsKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG9uQ2FuY2VsbGVkKEdlc3R1cmVEZXNjcmlwdGlvbiBnZXN0dXJlRGVzY3JpcHRpb24pIHsKLSAgICAgICAgICAgIG1DYW5jZWxsZWQgPSB0cnVlOwotICAgICAgICAgICAgbm90aWZ5QWxsKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYXNzZXJ0R2VzdHVyZUNvbXBsZXRlcyhsb25nIHRpbWVvdXQpIHsKLSAgICAgICAgICAgIGlmIChtQ29tcGxldGVkKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB3YWl0KHRpbWVvdXQpOwotICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiR2VzdHVyZSBkaWQgbm90IGNvbXBsZXRlLiBDYW5jZWxlZCA9ICIgKyBtQ2FuY2VsbGVkLCBtQ29tcGxldGVkKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhc3NlcnRHZXN0dXJlQ2FuY2Vscyhsb25nIHRpbWVvdXQpIHsKLSAgICAgICAgICAgIGlmIChtQ2FuY2VsbGVkKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB3YWl0KHRpbWVvdXQpOwotICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiR2VzdHVyZSBkaWQgbm90IGNhbmNlbC4gQ29tcGxldGVkID0gIiArIG1Db21wbGV0ZWQsIG1DYW5jZWxsZWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlc2V0KCkgewotICAgICAgICAgICAgbUNhbmNlbGxlZCA9IGZhbHNlOwotICAgICAgICAgICAgbUNvbXBsZXRlZCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgcHJpdmF0ZSB2b2lkIHdhaXRGb3JNb3Rpb25FdmVudHMoTWF0Y2hlcjxNb3Rpb25FdmVudD4gbWF0Y2hlciwgaW50IG51bUV2ZW50c0V4cGVjdGVkKQogICAgICAgICAgICAgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKICAgICAgICAgc3luY2hyb25pemVkIChtTW90aW9uRXZlbnRzKSB7CkBAIC02MDcsNTMgKzU1NiwzOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBHZXN0dXJlRGVzY3JpcHRpb24gY3JlYXRlQ2xpY2tJblZpZXdCb3VuZHMoUG9pbnQgY2xpY2tQb2ludCkgewotICAgICAgICBQb2ludCBvZmZzZXRDbGljayA9IG5ldyBQb2ludChjbGlja1BvaW50KTsKLSAgICAgICAgb2Zmc2V0Q2xpY2sub2Zmc2V0KG1WaWV3TG9jYXRpb25bMF0sIG1WaWV3TG9jYXRpb25bMV0pOwotICAgICAgICByZXR1cm4gY3JlYXRlQ2xpY2sob2Zmc2V0Q2xpY2spOwotICAgIH0KLQotICAgIHByaXZhdGUgR2VzdHVyZURlc2NyaXB0aW9uIGNyZWF0ZUNsaWNrKFBvaW50IGNsaWNrUG9pbnQpIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUNsaWNrKG5ldyBQb2ludEYoY2xpY2tQb2ludC54LCBjbGlja1BvaW50LnkpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEdlc3R1cmVEZXNjcmlwdGlvbiBjcmVhdGVDbGljayhQb2ludEYgY2xpY2tQb2ludCkgewotICAgICAgICBQYXRoIGNsaWNrUGF0aCA9IG5ldyBQYXRoKCk7Ci0gICAgICAgIGNsaWNrUGF0aC5tb3ZlVG8oY2xpY2tQb2ludC54LCBjbGlja1BvaW50LnkpOwotICAgICAgICBTdHJva2VEZXNjcmlwdGlvbiBjbGlja1N0cm9rZSA9Ci0gICAgICAgICAgICAgICAgbmV3IFN0cm9rZURlc2NyaXB0aW9uKGNsaWNrUGF0aCwgMCwgVmlld0NvbmZpZ3VyYXRpb24uZ2V0VGFwVGltZW91dCgpKTsKLSAgICAgICAgR2VzdHVyZURlc2NyaXB0aW9uLkJ1aWxkZXIgY2xpY2tCdWlsZGVyID0gbmV3IEdlc3R1cmVEZXNjcmlwdGlvbi5CdWlsZGVyKCk7Ci0gICAgICAgIGNsaWNrQnVpbGRlci5hZGRTdHJva2UoY2xpY2tTdHJva2UpOwotICAgICAgICByZXR1cm4gY2xpY2tCdWlsZGVyLmJ1aWxkKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBHZXN0dXJlRGVzY3JpcHRpb24gY3JlYXRlTG9uZ0NsaWNrSW5WaWV3Qm91bmRzKFBvaW50IGNsaWNrUG9pbnQpIHsKLSAgICAgICAgUG9pbnQgb2Zmc2V0UG9pbnQgPSBuZXcgUG9pbnQoY2xpY2tQb2ludCk7Ci0gICAgICAgIG9mZnNldFBvaW50Lm9mZnNldChtVmlld0xvY2F0aW9uWzBdLCBtVmlld0xvY2F0aW9uWzFdKTsKLSAgICAgICAgUGF0aCBjbGlja1BhdGggPSBuZXcgUGF0aCgpOwotICAgICAgICBjbGlja1BhdGgubW92ZVRvKG9mZnNldFBvaW50LngsIG9mZnNldFBvaW50LnkpOwotICAgICAgICBpbnQgbG9uZ1ByZXNzVGltZSA9IFZpZXdDb25maWd1cmF0aW9uLmdldExvbmdQcmVzc1RpbWVvdXQoKTsKLQotICAgICAgICBTdHJva2VEZXNjcmlwdGlvbiBsb25nQ2xpY2tTdHJva2UgPQotICAgICAgICAgICAgICAgIG5ldyBTdHJva2VEZXNjcmlwdGlvbihjbGlja1BhdGgsIDAsIGxvbmdQcmVzc1RpbWUgKyAobG9uZ1ByZXNzVGltZSAvIDIpKTsKLSAgICAgICAgR2VzdHVyZURlc2NyaXB0aW9uLkJ1aWxkZXIgbG9uZ0NsaWNrQnVpbGRlciA9IG5ldyBHZXN0dXJlRGVzY3JpcHRpb24uQnVpbGRlcigpOwotICAgICAgICBsb25nQ2xpY2tCdWlsZGVyLmFkZFN0cm9rZShsb25nQ2xpY2tTdHJva2UpOwotICAgICAgICByZXR1cm4gbG9uZ0NsaWNrQnVpbGRlci5idWlsZCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgR2VzdHVyZURlc2NyaXB0aW9uIGNyZWF0ZVN3aXBlSW5WaWV3Qm91bmRzKFBvaW50IHN0YXJ0LCBQb2ludCBlbmQsIGxvbmcgZHVyYXRpb24pIHsKLSAgICAgICAgcmV0dXJuIG5ldyBHZXN0dXJlRGVzY3JpcHRpb24uQnVpbGRlcigpLmFkZFN0cm9rZSgKLSAgICAgICAgICAgICAgICBuZXcgU3Ryb2tlRGVzY3JpcHRpb24obGluZVBhdGhJblZpZXdCb3VuZHMoc3RhcnQsIGVuZCksIDAsIGR1cmF0aW9uLCBmYWxzZSkpCisgICAgcHJpdmF0ZSBHZXN0dXJlRGVzY3JpcHRpb24gY2xpY2tXaXRoaW5WaWV3KFBvaW50RiBjbGlja1BvaW50KSB7CisgICAgICAgIHJldHVybiBuZXcgR2VzdHVyZURlc2NyaXB0aW9uLkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5hZGRTdHJva2UoY2xpY2sod2l0aGluVmlldyhjbGlja1BvaW50KSkpCiAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBHZXN0dXJlRGVzY3JpcHRpb24gY3JlYXRlUGluY2hJblZpZXdCb3VuZHMoUG9pbnQgY2VudGVyUG9pbnQsIGludCBzdGFydFNwYWNpbmcsCisgICAgcHJpdmF0ZSBHZXN0dXJlRGVzY3JpcHRpb24gbG9uZ0NsaWNrV2l0aGluVmlldyhQb2ludEYgY2xpY2tQb2ludCkgeworICAgICAgICByZXR1cm4gbmV3IEdlc3R1cmVEZXNjcmlwdGlvbi5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuYWRkU3Ryb2tlKGxvbmdDbGljayh3aXRoaW5WaWV3KGNsaWNrUG9pbnQpKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFBvaW50RiB3aXRoaW5WaWV3KFBvaW50RiBjbGlja1BvaW50KSB7CisgICAgICAgIHJldHVybiBhZGQoY2xpY2tQb2ludCwgbVZpZXdMb2NhdGlvblswXSwgbVZpZXdMb2NhdGlvblsxXSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBHZXN0dXJlRGVzY3JpcHRpb24gc3dpcGVXaXRoaW5WaWV3KFBvaW50RiBzdGFydCwgUG9pbnRGIGVuZCwgbG9uZyBkdXJhdGlvbikgeworICAgICAgICByZXR1cm4gbmV3IEdlc3R1cmVEZXNjcmlwdGlvbi5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuYWRkU3Ryb2tlKG5ldyBTdHJva2VEZXNjcmlwdGlvbihsaW5lV2l0aGluVmlldyhzdGFydCwgZW5kKSwgMCwgZHVyYXRpb24pKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgIH0KKworICAgIHByaXZhdGUgUGF0aCBsaW5lV2l0aGluVmlldyhQb2ludEYgc3RhcnRQb2ludCwgUG9pbnRGIGVuZFBvaW50KSB7CisgICAgICAgIHJldHVybiBwYXRoKHdpdGhpblZpZXcoc3RhcnRQb2ludCksIHdpdGhpblZpZXcoZW5kUG9pbnQpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEdlc3R1cmVEZXNjcmlwdGlvbiBwaW5jaFdpdGhpblZpZXcoUG9pbnRGIGNlbnRlclBvaW50LCBpbnQgc3RhcnRTcGFjaW5nLAogICAgICAgICAgICAgaW50IGVuZFNwYWNpbmcsIGZsb2F0IG9yaWVudGF0aW9uLCBsb25nIGR1cmF0aW9uKSB7CiAgICAgICAgIGlmICgoc3RhcnRTcGFjaW5nIDwgMCkgfHwgKGVuZFNwYWNpbmcgPCAwKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUGluY2ggc3BhY2luZyBjYW5ub3QgYmUgbmVnYXRpdmUiKTsKICAgICAgICAgfQotICAgICAgICBQb2ludCBvZmZzZXRDZW50ZXIgPSBuZXcgUG9pbnQoY2VudGVyUG9pbnQpOwotICAgICAgICBvZmZzZXRDZW50ZXIub2Zmc2V0KG1WaWV3TG9jYXRpb25bMF0sIG1WaWV3TG9jYXRpb25bMV0pOworICAgICAgICBQb2ludEYgb2Zmc2V0Q2VudGVyID0gd2l0aGluVmlldyhjZW50ZXJQb2ludCk7CiAgICAgICAgIGZsb2F0W10gc3RhcnRQb2ludDEgPSBuZXcgZmxvYXRbMl07CiAgICAgICAgIGZsb2F0W10gZW5kUG9pbnQxID0gbmV3IGZsb2F0WzJdOwogICAgICAgICBmbG9hdFtdIHN0YXJ0UG9pbnQyID0gbmV3IGZsb2F0WzJdOwpAQCAtNjg1LDE5ICs2MTksMTAgQEAKICAgICAgICAgcGF0aDIubW92ZVRvKHN0YXJ0UG9pbnQyWzBdLCBzdGFydFBvaW50MlsxXSk7CiAgICAgICAgIHBhdGgyLmxpbmVUbyhlbmRQb2ludDJbMF0sIGVuZFBvaW50MlsxXSk7CiAKLSAgICAgICAgU3Ryb2tlRGVzY3JpcHRpb24gcGF0aDFTdHJva2UgPSBuZXcgU3Ryb2tlRGVzY3JpcHRpb24ocGF0aDEsIDAsIGR1cmF0aW9uKTsKLSAgICAgICAgU3Ryb2tlRGVzY3JpcHRpb24gcGF0aDJTdHJva2UgPSBuZXcgU3Ryb2tlRGVzY3JpcHRpb24ocGF0aDIsIDAsIGR1cmF0aW9uKTsKLSAgICAgICAgR2VzdHVyZURlc2NyaXB0aW9uLkJ1aWxkZXIgc3dpcGVCdWlsZGVyID0gbmV3IEdlc3R1cmVEZXNjcmlwdGlvbi5CdWlsZGVyKCk7Ci0gICAgICAgIHN3aXBlQnVpbGRlci5hZGRTdHJva2UocGF0aDFTdHJva2UpOwotICAgICAgICBzd2lwZUJ1aWxkZXIuYWRkU3Ryb2tlKHBhdGgyU3Ryb2tlKTsKLSAgICAgICAgcmV0dXJuIHN3aXBlQnVpbGRlci5idWlsZCgpOwotICAgIH0KLQotICAgIFBhdGggbGluZVBhdGhJblZpZXdCb3VuZHMoUG9pbnQgc3RhcnRQb2ludCwgUG9pbnQgZW5kUG9pbnQpIHsKLSAgICAgICAgUGF0aCBwYXRoID0gbmV3IFBhdGgoKTsKLSAgICAgICAgcGF0aC5tb3ZlVG8oc3RhcnRQb2ludC54ICsgbVZpZXdMb2NhdGlvblswXSwgc3RhcnRQb2ludC55ICsgbVZpZXdMb2NhdGlvblsxXSk7Ci0gICAgICAgIHBhdGgubGluZVRvKGVuZFBvaW50LnggKyBtVmlld0xvY2F0aW9uWzBdLCBlbmRQb2ludC55ICsgbVZpZXdMb2NhdGlvblsxXSk7Ci0gICAgICAgIHJldHVybiBwYXRoOworICAgICAgICByZXR1cm4gbmV3IEdlc3R1cmVEZXNjcmlwdGlvbi5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuYWRkU3Ryb2tlKG5ldyBTdHJva2VEZXNjcmlwdGlvbihwYXRoMSwgMCwgZHVyYXRpb24pKQorICAgICAgICAgICAgICAgIC5hZGRTdHJva2UobmV3IFN0cm9rZURlc2NyaXB0aW9uKHBhdGgyLCAwLCBkdXJhdGlvbikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTW90aW9uRXZlbnRBY3Rpb25NYXRjaGVyIGV4dGVuZHMgVHlwZVNhZmVNYXRjaGVyPE1vdGlvbkV2ZW50PiB7CkBAIC03MTUsMTMgKzY0MCwxMyBAQAogCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBkZXNjcmliZVRvKERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7Ci0gICAgICAgICAgICBkZXNjcmlwdGlvbi5hcHBlbmRUZXh0KCJNYXRjaGluZyB0byBhY3Rpb24gIiArIG1BY3Rpb24pOworICAgICAgICAgICAgZGVzY3JpcHRpb24uYXBwZW5kVGV4dCgiTWF0Y2hpbmcgdG8gYWN0aW9uICIgKyBNb3Rpb25FdmVudC5hY3Rpb25Ub1N0cmluZyhtQWN0aW9uKSk7CiAgICAgICAgIH0KICAgICB9CiAKIAotICAgIE1hdGNoZXI8TW90aW9uRXZlbnQ+IGlzQXRQb2ludChmaW5hbCBQb2ludCBwb2ludCkgewotICAgICAgICByZXR1cm4gaXNBdFBvaW50KG5ldyBQb2ludEYocG9pbnQueCwgcG9pbnQueSksIDAuMDFmKTsKKyAgICBNYXRjaGVyPE1vdGlvbkV2ZW50PiBpc0F0UG9pbnQoZmluYWwgUG9pbnRGIHBvaW50KSB7CisgICAgICAgIHJldHVybiBpc0F0UG9pbnQocG9pbnQsIDAuMDFmKTsKICAgICB9CiAKICAgICBNYXRjaGVyPE1vdGlvbkV2ZW50PiBpc0F0UG9pbnQoZmluYWwgUG9pbnRGIHBvaW50LCBmaW5hbCBmbG9hdCB0b2wpIHsKZGlmZiAtLWdpdCBhL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy9BY2Nlc3NpYmlsaXR5R2xvYmFsQWN0aW9uc1Rlc3QuamF2YSBiL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy9BY2Nlc3NpYmlsaXR5R2xvYmFsQWN0aW9uc1Rlc3QuamF2YQppbmRleCA0ODZlNGZhLi41YzQ1MDgwIDEwMDY0NAotLS0gYS90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9jdHMvQWNjZXNzaWJpbGl0eUdsb2JhbEFjdGlvbnNUZXN0LmphdmEKKysrIGIvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2Uvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvY3RzL0FjY2Vzc2liaWxpdHlHbG9iYWxBY3Rpb25zVGVzdC5qYXZhCkBAIC0xOCw2ICsxOCw4IEBACiAKIGltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5QcmVzdWJtaXQ7CiBpbXBvcnQgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RDYXNlOwogaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5NZWRpdW1UZXN0OwogCkBAIC0yNiw2ICsyOCw4IEBACiAvKioKICAqIFRlc3QgZ2xvYmFsIGFjdGlvbnMKICAqLworQFByZXN1Ym1pdAorQEFwcE1vZGVGdWxsCiBwdWJsaWMgY2xhc3MgQWNjZXNzaWJpbGl0eUdsb2JhbEFjdGlvbnNUZXN0IGV4dGVuZHMgSW5zdHJ1bWVudGF0aW9uVGVzdENhc2UgewogICAgIC8qKgogICAgICAqIFRpbWVvdXQgcmVxdWlyZWQgZm9yIHBlbmRpbmcgQmluZGVyIGNhbGxzIG9yIGV2ZW50IHByb2Nlc3NpbmcgdG8KQEAgLTEzNCwxMCArMTM4LDE5IEBACiAgICAgICAgIHdhaXRGb3JJZGxlKCk7CiAgICAgfQogCisgICAgQE1lZGl1bVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGVyZm9ybUFjdGlvblNjcmVlbnNob3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gQWN0aW9uIHNob3VsZCBzdWNjZWVkCisgICAgICAgIGFzc2VydFRydWUoZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VWlBdXRvbWF0aW9uKCkucGVyZm9ybUdsb2JhbEFjdGlvbigKKyAgICAgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5U2VydmljZS5HTE9CQUxfQUNUSU9OX1RBS0VfU0NSRUVOU0hPVCkpOworICAgICAgICAvLyBJZGVhbGx5IHNob3VsZCB2ZXJpZnkgdGhhdCB3ZSBhY3R1YWxseSBoYXZlIGEgc2NyZWVuc2hvdCwgYnV0IGl0J3MgYWxzbyBwb3NzaWJsZQorICAgICAgICAvLyBmb3IgdGhlIHNjcmVlbnNob3QgdG8gZmFpbAorICAgICAgICB3YWl0Rm9ySWRsZSgpOworICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCB3YWl0Rm9ySWRsZSgpIHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIHsKICAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VWlBdXRvbWF0aW9uKCkud2FpdEZvcklkbGUoCiAgICAgICAgICAgICAgICAgVElNRU9VVF9BQ0NFU1NJQklMSVRZX1NUQVRFX0lETEUsCiAgICAgICAgICAgICAgICAgVElNRU9VVF9BU1lOQ19QUk9DRVNTSU5HKTsKICAgICB9Ci0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy9BY2Nlc3NpYmlsaXR5TG9nZ2luZ1Rlc3QuamF2YSBiL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy9BY2Nlc3NpYmlsaXR5TG9nZ2luZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjU0MzUyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2Uvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvY3RzL0FjY2Vzc2liaWxpdHlMb2dnaW5nVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQKKyAqIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUKKyAqIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLmN0czsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5BcHBPcHNNYW5hZ2VyLk9QU1RSX0JJTkRfQUNDRVNTSUJJTElUWV9TRVJWSUNFOworCitpbXBvcnQgc3RhdGljIGp1bml0LmZyYW1ld29yay5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5QcmVzdWJtaXQ7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkFwcE9wc1V0aWxzOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworCitAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQorQFByZXN1Ym1pdAorcHVibGljIGNsYXNzIEFjY2Vzc2liaWxpdHlMb2dnaW5nVGVzdCB7CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB0aGF0IG5ldyBhY2Nlc3NpYmlsaXR5IHNlcnZpY2VzIGFyZSBsb2dnZWQgYnkgdGhlIHN5c3RlbS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2aWNlTG9nZ2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENvbnRleHQgY29udGV4dCA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLmdldENvbnRleHQoKTsKKyAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gY29udGV4dC5nZXRQYWNrYWdlTmFtZSgpOworCisgICAgICAgIC8vIFRoZXJlIGFyZSBhY2Nlc3NpYmlsaXR5IHNlcnZpY2VzIGRlZmluZWQgaW4gdGhpcyB0ZXN0IHBhY2thZ2UsIGFuZCB0aGlzIGZhY3QgbXVzdCBiZQorICAgICAgICAvLyBsb2dnZWQuCisgICAgICAgIGFzc2VydFRydWUoIkFjY2Vzc2liaWxpdHkgc2VydmljZSB3YXMgYm91bmQsIGJ1dCB0aGlzIHdhc24ndCBsb2dnZWQgYnkgYXBwIG9wcyIsCisgICAgICAgICAgICAgICAgQXBwT3BzVXRpbHMuYWxsb3dlZE9wZXJhdGlvbkxvZ2dlZChwYWNrYWdlTmFtZSwgT1BTVFJfQklORF9BQ0NFU1NJQklMSVRZX1NFUlZJQ0UpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9jdHMvQWNjZXNzaWJpbGl0eU1hZ25pZmljYXRpb25UZXN0LmphdmEgYi90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9jdHMvQWNjZXNzaWJpbGl0eU1hZ25pZmljYXRpb25UZXN0LmphdmEKaW5kZXggZGM0YTFjOS4uZWJiNzExYiAxMDA2NDQKLS0tIGEvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2Uvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvY3RzL0FjY2Vzc2liaWxpdHlNYWduaWZpY2F0aW9uVGVzdC5qYXZhCisrKyBiL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy9BY2Nlc3NpYmlsaXR5TWFnbmlmaWNhdGlvblRlc3QuamF2YQpAQCAtMTYsMjYgKzE2LDMxIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHM7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5hbnk7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8uYW55RmxvYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8uZXE7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ubW9jazsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by50aW1lb3V0OworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnZlcmlmeTsKKwogaW1wb3J0IGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2UuTWFnbmlmaWNhdGlvbkNvbnRyb2xsZXI7CiBpbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZS5NYWduaWZpY2F0aW9uQ29udHJvbGxlci5Pbk1hZ25pZmljYXRpb25DaGFuZ2VkTGlzdGVuZXI7CiBpbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZUluZm87CiBpbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIGltcG9ydCBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdENhc2U7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOwogaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOwogCiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CiAKLWltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by4qOwotCiAvKioKICAqIENsYXNzIGZvciB0ZXN0aW5nIHtAbGluayBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm99LgogICovCitAQXBwTW9kZUZ1bGwKIHB1YmxpYyBjbGFzcyBBY2Nlc3NpYmlsaXR5TWFnbmlmaWNhdGlvblRlc3QgZXh0ZW5kcyBJbnN0cnVtZW50YXRpb25UZXN0Q2FzZSB7CiAKICAgICAvKiogTWF4aW11bSB0aW1lb3V0IHdoZW4gd2FpdGluZyBmb3IgYSBtYWduaWZpY2F0aW9uIGNhbGxiYWNrLiAqLwpkaWZmIC0tZ2l0IGEvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2Uvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvY3RzL0FjY2Vzc2liaWxpdHlPdmVybGF5VGVzdC5qYXZhIGIvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2Uvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvY3RzL0FjY2Vzc2liaWxpdHlPdmVybGF5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlZmNiNGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9jdHMvQWNjZXNzaWJpbGl0eU92ZXJsYXlUZXN0LmphdmEKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZUluZm87CitpbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHMudXRpbHMuQXN5bmNVdGlsczsKK2ltcG9ydCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb247CitpbXBvcnQgYW5kcm9pZC5hcHAuVWlBdXRvbWF0aW9uOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eVdpbmRvd0luZm87CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvLyBUZXN0IHRoYXQgYW4gQWNjZXNzaWJpbGl0eVNlcnZpY2UgY2FuIGRpc3BsYXkgYW4gYWNjZXNzaWJpbGl0eSBvdmVybGF5CitAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIEFjY2Vzc2liaWxpdHlPdmVybGF5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBJbnN0cnVtZW50YXRpb24gc0luc3RydW1lbnRhdGlvbjsKKyAgICBwcml2YXRlIHN0YXRpYyBVaUF1dG9tYXRpb24gc1VpQXV0b21hdGlvbjsKKyAgICBJbnN0cnVtZW50ZWRBY2Nlc3NpYmlsaXR5U2VydmljZSBtU2VydmljZTsKKworICAgIEBCZWZvcmVDbGFzcworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBvbmVUaW1lU2V0VXAoKSB7CisgICAgICAgIHNJbnN0cnVtZW50YXRpb24gPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKTsKKyAgICAgICAgc1VpQXV0b21hdGlvbiA9IHNJbnN0cnVtZW50YXRpb24KKyAgICAgICAgICAgICAgICAuZ2V0VWlBdXRvbWF0aW9uKFVpQXV0b21hdGlvbi5GTEFHX0RPTlRfU1VQUFJFU1NfQUNDRVNTSUJJTElUWV9TRVJWSUNFUyk7CisgICAgICAgIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyBpbmZvID0gc1VpQXV0b21hdGlvbi5nZXRTZXJ2aWNlSW5mbygpOworICAgICAgICBpbmZvLmZsYWdzIHw9IEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mby5GTEFHX1JFVFJJRVZFX0lOVEVSQUNUSVZFX1dJTkRPV1M7CisgICAgICAgIHNVaUF1dG9tYXRpb24uc2V0U2VydmljZUluZm8oaW5mbyk7CisgICAgfQorCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBtU2VydmljZSA9IFN0dWJBY2Nlc3NpYmlsaXR5QnV0dG9uU2VydmljZS5lbmFibGVTZWxmKHNJbnN0cnVtZW50YXRpb24pOworICAgIH0KKworICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeworICAgICAgICBtU2VydmljZS5ydW5PblNlcnZpY2VTeW5jKCgpIC0+IG1TZXJ2aWNlLmRpc2FibGVTZWxmKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEExMXlTZXJ2aWNlU2hvd3NPdmVybGF5X3Nob3VsZEFwcGVhcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihtU2VydmljZSk7CisgICAgICAgIGJ1dHRvbi5zZXRUZXh0KCJCdXR0b24iKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIG92ZXJsYXlUaXRsZSA9ICJPdmVybGF5IHRpdGxlIjsKKworICAgICAgICBzVWlBdXRvbWF0aW9uLmV4ZWN1dGVBbmRXYWl0Rm9yRXZlbnQoKCkgLT4gbVNlcnZpY2UucnVuT25TZXJ2aWNlU3luYygoKSAtPiB7CisgICAgICAgICAgICBmaW5hbCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBwYXJhbXMgPSBuZXcgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMoKTsKKyAgICAgICAgICAgIHBhcmFtcy53aWR0aCA9IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVDsKKyAgICAgICAgICAgIHBhcmFtcy5oZWlnaHQgPSBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQ7CisgICAgICAgICAgICBwYXJhbXMuZmxhZ3MgPSBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0xBWU9VVF9JTl9TQ1JFRU4KKyAgICAgICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0xBWU9VVF9JTlNFVF9ERUNPUjsKKyAgICAgICAgICAgIHBhcmFtcy50eXBlID0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9BQ0NFU1NJQklMSVRZX09WRVJMQVk7CisgICAgICAgICAgICBwYXJhbXMuc2V0VGl0bGUob3ZlcmxheVRpdGxlKTsKKyAgICAgICAgICAgIG1TZXJ2aWNlLmdldFN5c3RlbVNlcnZpY2UoV2luZG93TWFuYWdlci5jbGFzcykuYWRkVmlldyhidXR0b24sIHBhcmFtcyk7CisgICAgICAgIH0pLCAoZXZlbnQpIC0+IGZpbmRPdmVybGF5V2luZG93KCkgIT0gbnVsbCwgQXN5bmNVdGlscy5ERUZBVUxUX1RJTUVPVVRfTVMpOworCisgICAgICAgIGFzc2VydFRydWUoVGV4dFV0aWxzLmVxdWFscyhmaW5kT3ZlcmxheVdpbmRvdygpLmdldFRpdGxlKCksIG92ZXJsYXlUaXRsZSkpOworICAgIH0KKworICAgIHByaXZhdGUgQWNjZXNzaWJpbGl0eVdpbmRvd0luZm8gZmluZE92ZXJsYXlXaW5kb3coKSB7CisgICAgICAgIExpc3Q8QWNjZXNzaWJpbGl0eVdpbmRvd0luZm8+IHdpbmRvd3MgPSBzVWlBdXRvbWF0aW9uLmdldFdpbmRvd3MoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3aW5kb3dzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5V2luZG93SW5mbyB3aW5kb3cgPSB3aW5kb3dzLmdldChpKTsKKyAgICAgICAgICAgIGlmICh3aW5kb3cuZ2V0VHlwZSgpID09IEFjY2Vzc2liaWxpdHlXaW5kb3dJbmZvLlRZUEVfQUNDRVNTSUJJTElUWV9PVkVSTEFZKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHdpbmRvdzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9jdHMvQWNjZXNzaWJpbGl0eVBhbmVUZXN0LmphdmEgYi90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9jdHMvQWNjZXNzaWJpbGl0eVBhbmVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQyYjBhOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy9BY2Nlc3NpYmlsaXR5UGFuZVRlc3QuamF2YQpAQCAtMCwwICsxLDEzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHM7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHMuQWNjZXNzaWJpbGl0eUFjdGl2aXR5VGVzdENhc2UuVElNRU9VVF9BU1lOQ19QUk9DRVNTSU5HOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLmN0cy51dGlscy5BY2Nlc3NpYmlsaXR5RXZlbnRGaWx0ZXJVdGlscy5BY2Nlc3NpYmlsaXR5RXZlbnRUeXBlTWF0Y2hlcjsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHMudXRpbHMuQWNjZXNzaWJpbGl0eUV2ZW50RmlsdGVyVXRpbHMuQ29udGVudENoYW5nZXNNYXRjaGVyOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLmN0cy51dGlscy5BY3Rpdml0eUxhdW5jaFV0aWxzLmxhdW5jaEFjdGl2aXR5QW5kV2FpdEZvckl0VG9CZU9uc2NyZWVuOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQuQ09OVEVOVF9DSEFOR0VfVFlQRV9QQU5FX0FQUEVBUkVEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQuQ09OVEVOVF9DSEFOR0VfVFlQRV9QQU5FX0RJU0FQUEVBUkVEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQuQ09OVEVOVF9DSEFOR0VfVFlQRV9QQU5FX1RJVExFOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQuVFlQRV9XSU5ET1dfU1RBVEVfQ0hBTkdFRDsKKworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuYm90aDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK2ltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLmN0cy5hY3Rpdml0aWVzLkFjY2Vzc2liaWxpdHlFbmRUb0VuZEFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5VaUF1dG9tYXRpb247CitpbXBvcnQgYW5kcm9pZC5hcHAuVWlBdXRvbWF0aW9uLkFjY2Vzc2liaWxpdHlFdmVudEZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5Tm9kZUluZm87CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKKy8qKgorICogVGVzdHMgcmVwb3J0aW5nIG9mIHdpbmRvdy1saWtlIHZpZXdzCisgKi8KK0BSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgQWNjZXNzaWJpbGl0eVBhbmVUZXN0IHsKKyAgICBwcml2YXRlIHN0YXRpYyBJbnN0cnVtZW50YXRpb24gc0luc3RydW1lbnRhdGlvbjsKKyAgICBwcml2YXRlIHN0YXRpYyBVaUF1dG9tYXRpb24gc1VpQXV0b21hdGlvbjsKKworICAgIHByaXZhdGUgQWN0aXZpdHkgbUFjdGl2aXR5OworICAgIHByaXZhdGUgVmlldyBtUGFuZVZpZXc7CisKKyAgICBAUnVsZQorICAgIHB1YmxpYyBBY3Rpdml0eVRlc3RSdWxlPEFjY2Vzc2liaWxpdHlFbmRUb0VuZEFjdGl2aXR5PiBtQWN0aXZpdHlSdWxlID0KKyAgICAgICAgICAgIG5ldyBBY3Rpdml0eVRlc3RSdWxlPD4oQWNjZXNzaWJpbGl0eUVuZFRvRW5kQWN0aXZpdHkuY2xhc3MsIGZhbHNlLCBmYWxzZSk7CisKKyAgICBAQmVmb3JlQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgb25lVGltZVNldHVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHNJbnN0cnVtZW50YXRpb24gPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKTsKKyAgICAgICAgc1VpQXV0b21hdGlvbiA9IHNJbnN0cnVtZW50YXRpb24uZ2V0VWlBdXRvbWF0aW9uKCk7CisgICAgfQorCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1BY3Rpdml0eSA9IGxhdW5jaEFjdGl2aXR5QW5kV2FpdEZvckl0VG9CZU9uc2NyZWVuKAorICAgICAgICAgICAgICAgIHNJbnN0cnVtZW50YXRpb24sIHNVaUF1dG9tYXRpb24sIG1BY3Rpdml0eVJ1bGUpOworICAgICAgICBzSW5zdHJ1bWVudGF0aW9uLnJ1bk9uTWFpblN5bmMoKCkgLT4gIHsKKyAgICAgICAgICAgIG1QYW5lVmlldyA9IG1BY3Rpdml0eS5maW5kVmlld0J5SWQoUi5pZC5idXR0b24pOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHBhbmVUaXRsZUZyb21YbWxfcmVwb3J0ZWRUb0FjY2Vzc2liaWxpdHkoKSB7CisgICAgICAgIFN0cmluZyBwYW5lVGl0bGUgPSBzSW5zdHJ1bWVudGF0aW9uLmdldENvbnRleHQoKS5nZXRTdHJpbmcoUi5zdHJpbmcucGFuZVRpdGxlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHBhbmVUaXRsZSwgbVBhbmVWaWV3LmdldEFjY2Vzc2liaWxpdHlQYW5lVGl0bGUoKSk7CisgICAgICAgIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBwYW5lTm9kZSA9IGdldFBhbmVOb2RlKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhwYW5lVGl0bGUsIHBhbmVOb2RlLmdldFBhbmVUaXRsZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHdpbmRvd0xpa2VWaWV3U2V0dGVyc1dvcmtfYW5kTmV3VmFsdWVzUmVwb3J0ZWRUb0FjY2Vzc2liaWxpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIG5ld1RpdGxlID0gIkhlcmUncyBhIG5ldyB0aXRsZSI7CisKKyAgICAgICAgc1VpQXV0b21hdGlvbi5leGVjdXRlQW5kV2FpdEZvckV2ZW50KCgpIC0+IHNJbnN0cnVtZW50YXRpb24ucnVuT25NYWluU3luYygoKSAtPiB7CisgICAgICAgICAgICBtUGFuZVZpZXcuc2V0QWNjZXNzaWJpbGl0eVBhbmVUaXRsZShuZXdUaXRsZSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobmV3VGl0bGUsIG1QYW5lVmlldy5nZXRBY2Nlc3NpYmlsaXR5UGFuZVRpdGxlKCkpOworICAgICAgICB9KSwgKG5ldyBDb250ZW50Q2hhbmdlc01hdGNoZXIoQ09OVEVOVF9DSEFOR0VfVFlQRV9QQU5FX1RJVExFKSk6Om1hdGNoZXMsCisgICAgICAgICAgICAgICAgVElNRU9VVF9BU1lOQ19QUk9DRVNTSU5HKTsKKworICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gd2luZG93TGlrZU5vZGUgPSBnZXRQYW5lTm9kZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3VGl0bGUsIHdpbmRvd0xpa2VOb2RlLmdldFBhbmVUaXRsZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHdpbmRvd0xpa2VWaWV3VmlzaWJpbGl0eV9yZXBvcnRBc1dpbmRvd1N0YXRlQ2hhbmdlcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBBY2Nlc3NpYmlsaXR5RXZlbnRGaWx0ZXIgcGFuZUFwcGVhcnNGaWx0ZXIgPQorICAgICAgICAgICAgICAgIGJvdGgobmV3IEFjY2Vzc2liaWxpdHlFdmVudFR5cGVNYXRjaGVyKFRZUEVfV0lORE9XX1NUQVRFX0NIQU5HRUQpKS5hbmQoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ29udGVudENoYW5nZXNNYXRjaGVyKENPTlRFTlRfQ0hBTkdFX1RZUEVfUEFORV9BUFBFQVJFRCkpOjptYXRjaGVzOworICAgICAgICBmaW5hbCBBY2Nlc3NpYmlsaXR5RXZlbnRGaWx0ZXIgcGFuZURpc2FwcGVhcnNGaWx0ZXIgPQorICAgICAgICAgICAgICAgIGJvdGgobmV3IEFjY2Vzc2liaWxpdHlFdmVudFR5cGVNYXRjaGVyKFRZUEVfV0lORE9XX1NUQVRFX0NIQU5HRUQpKS5hbmQoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ29udGVudENoYW5nZXNNYXRjaGVyKENPTlRFTlRfQ0hBTkdFX1RZUEVfUEFORV9ESVNBUFBFQVJFRCkpOjptYXRjaGVzOworICAgICAgICBzVWlBdXRvbWF0aW9uLmV4ZWN1dGVBbmRXYWl0Rm9yRXZlbnQoc2V0UGFuZVZpZXdWaXNpYmlsaXR5KFZpZXcuR09ORSksCisgICAgICAgICAgICAgICAgcGFuZURpc2FwcGVhcnNGaWx0ZXIsIFRJTUVPVVRfQVNZTkNfUFJPQ0VTU0lORyk7CisKKyAgICAgICAgc1VpQXV0b21hdGlvbi5leGVjdXRlQW5kV2FpdEZvckV2ZW50KHNldFBhbmVWaWV3VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpLAorICAgICAgICAgICAgICAgIHBhbmVBcHBlYXJzRmlsdGVyLCBUSU1FT1VUX0FTWU5DX1BST0NFU1NJTkcpOworCisgICAgICAgIHNVaUF1dG9tYXRpb24uZXhlY3V0ZUFuZFdhaXRGb3JFdmVudChzZXRQYW5lVmlld1BhcmVudFZpc2liaWxpdHkoVmlldy5HT05FKSwKKyAgICAgICAgICAgICAgICBwYW5lRGlzYXBwZWFyc0ZpbHRlciwgVElNRU9VVF9BU1lOQ19QUk9DRVNTSU5HKTsKKworICAgICAgICBzVWlBdXRvbWF0aW9uLmV4ZWN1dGVBbmRXYWl0Rm9yRXZlbnQoc2V0UGFuZVZpZXdQYXJlbnRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSksCisgICAgICAgICAgICAgICAgcGFuZUFwcGVhcnNGaWx0ZXIsIFRJTUVPVVRfQVNZTkNfUFJPQ0VTU0lORyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gZ2V0UGFuZU5vZGUoKSB7CisgICAgICAgIHJldHVybiBzVWlBdXRvbWF0aW9uLmdldFJvb3RJbkFjdGl2ZVdpbmRvdygpLmZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9zQnlUZXh0KAorICAgICAgICAgICAgICAgICgoVGV4dFZpZXcpIG1QYW5lVmlldykuZ2V0VGV4dCgpLnRvU3RyaW5nKCkpLmdldCgwKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFJ1bm5hYmxlIHNldFBhbmVWaWV3VmlzaWJpbGl0eShpbnQgdmlzaWJpbGl0eSkgeworICAgICAgICByZXR1cm4gKCkgLT4gc0luc3RydW1lbnRhdGlvbi5ydW5Pbk1haW5TeW5jKAorICAgICAgICAgICAgICAgICgpIC0+IG1QYW5lVmlldy5zZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFJ1bm5hYmxlIHNldFBhbmVWaWV3UGFyZW50VmlzaWJpbGl0eShpbnQgdmlzaWJpbGl0eSkgeworICAgICAgICByZXR1cm4gKCkgLT4gc0luc3RydW1lbnRhdGlvbi5ydW5Pbk1haW5TeW5jKAorICAgICAgICAgICAgICAgICgpIC0+ICgoVmlldykgbVBhbmVWaWV3LmdldFBhcmVudCgpKS5zZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9jdHMvQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvVGVzdC5qYXZhIGIvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2Uvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvY3RzL0FjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mb1Rlc3QuamF2YQppbmRleCAxNzYxMTE3Li5iMjdjZWFmIDEwMDY0NAotLS0gYS90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9jdHMvQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvVGVzdC5qYXZhCisrKyBiL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy9BY2Nlc3NpYmlsaXR5U2VydmljZUluZm9UZXN0LmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKIAogaW1wb3J0IGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5QcmVzdWJtaXQ7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTWVkaXVtVGVzdDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQ7CkBAIC0yNSw2ICsyNiw3IEBACiAvKioKICAqIENsYXNzIGZvciB0ZXN0aW5nIHtAbGluayBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm99LgogICovCitAUHJlc3VibWl0CiBwdWJsaWMgY2xhc3MgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CiAKICAgICBATWVkaXVtVGVzdApkaWZmIC0tZ2l0IGEvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2Uvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvY3RzL0FjY2Vzc2liaWxpdHlTZXR0aW5nc1Rlc3QuamF2YSBiL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy9BY2Nlc3NpYmlsaXR5U2V0dGluZ3NUZXN0LmphdmEKaW5kZXggY2NiZDFiNS4uYzZlYzAyZSAxMDA2NDQKLS0tIGEvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2Uvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvY3RzL0FjY2Vzc2liaWxpdHlTZXR0aW5nc1Rlc3QuamF2YQorKysgYi90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9jdHMvQWNjZXNzaWJpbGl0eVNldHRpbmdzVGVzdC5qYXZhCkBAIC0xOSwxOSArMTksMjYgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUmVzb2x2ZUluZm87CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5QcmVzdWJtaXQ7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKIGltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwogaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5NZWRpdW1UZXN0OwogCiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNkZFRlc3Q7CisKIC8qKgogICogVGhpcyB0ZXN0IGNhc2UgaXMgcmVzcG9uc2libGUgdG8gdmVyaWZ5IHRoYXQgdGhlIGludGVudCBmb3IgbGF1bmNoaW5nCiAgKiBhY2Nlc3NpYmlsaXR5IHNldHRpbmdzIGhhcyBhbiBhY3Rpdml0eSB0aGF0IGhhbmRsZXMgaXQuCiAgKi8KK0BDZGRUZXN0KHJlcXVpcmVtZW50PSIzLjEwL0MtMS0zIikKK0BQcmVzdWJtaXQKIHB1YmxpYyBjbGFzcyBBY2Nlc3NpYmlsaXR5U2V0dGluZ3NUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKIAogICAgIEBNZWRpdW1UZXN0CisgICAgQEFwcE1vZGVGdWxsCiAgICAgcHVibGljIHZvaWQgdGVzdEFjY2Vzc2liaWxpdHlTZXR0aW5nc0ludGVudEhhbmRsZWQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgUGFja2FnZU1hbmFnZXIgcGFja2FnZU1hbmFnZXIgPSBtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOwogICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChTZXR0aW5ncy5BQ1RJT05fQUNDRVNTSUJJTElUWV9TRVRUSU5HUyk7CmRpZmYgLS1naXQgYS90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9jdHMvQWNjZXNzaWJpbGl0eVNvZnRLZXlib2FyZE1vZGVzVGVzdC5qYXZhIGIvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2Uvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvY3RzL0FjY2Vzc2liaWxpdHlTb2Z0S2V5Ym9hcmRNb2Rlc1Rlc3QuamF2YQppbmRleCBlYjhlMGU4Li5jYWFlMDMyIDEwMDY0NAotLS0gYS90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9jdHMvQWNjZXNzaWJpbGl0eVNvZnRLZXlib2FyZE1vZGVzVGVzdC5qYXZhCisrKyBiL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy9BY2Nlc3NpYmlsaXR5U29mdEtleWJvYXJkTW9kZXNUZXN0LmphdmEKQEAgLTE0LDIwICsxNCwyMiBAQAogCiBwYWNrYWdlIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuY3RzOwogCi1pbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZUluZm87CiBpbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZS5Tb2Z0S2V5Ym9hcmRDb250cm9sbGVyOworaW1wb3J0IGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvOworaW1wb3J0IGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuY3RzLlI7CitpbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHMuYWN0aXZpdGllcy5BY2Nlc3NpYmlsaXR5VGVzdEFjdGl2aXR5OwogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmFwcC5VaUF1dG9tYXRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLlJlc3VsdFJlY2VpdmVyOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOwogaW1wb3J0IGFuZHJvaWQudGVzdC5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQ7Ci0KLWltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLmN0cy5SOwogaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlXaW5kb3dJbmZvOwogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dE1ldGhvZE1hbmFnZXI7CiAKQEAgLTM2LDEwICszOCwxMiBAQAogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkJsb2NraW5nUXVldWU7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZW91dEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKIAogLyoqCiAgKiBUZXN0IGNhc2VzIGZvciB0ZXN0aW5nIHRoZSBhY2Nlc3NpYmlsaXR5IEFQSXMgZm9yIGludGVyYWN0aW5nIHdpdGggdGhlIHNvZnQga2V5Ym9hcmQgc2hvdyBtb2RlLgogICovCitAQXBwTW9kZUZ1bGwKIHB1YmxpYyBjbGFzcyBBY2Nlc3NpYmlsaXR5U29mdEtleWJvYXJkTW9kZXNUZXN0IGV4dGVuZHMgQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTIKICAgICAgICAgPEFjY2Vzc2liaWxpdHlTb2Z0S2V5Ym9hcmRNb2Rlc1Rlc3QuU29mdEtleWJvYXJkTW9kZXNBY3Rpdml0eT4gewogCkBAIC03MCw2ICs3NCw4IEBACiAgICAgcHJpdmF0ZSBJbnN0cnVtZW50ZWRBY2Nlc3NpYmlsaXR5U2VydmljZSBtU2VydmljZTsKICAgICBwcml2YXRlIFNvZnRLZXlib2FyZENvbnRyb2xsZXIgbUtleWJvYXJkQ29udHJvbGxlcjsKICAgICBwcml2YXRlIFVpQXV0b21hdGlvbiBtVWlBdXRvbWF0aW9uOworICAgIHByaXZhdGUgQWN0aXZpdHkgbUFjdGl2aXR5OworICAgIHByaXZhdGUgVmlldyBtS2V5Ym9hcmRUYXJnZXRWaWV3OwogCiAgICAgcHJpdmF0ZSBPYmplY3QgbUxvY2sgPSBuZXcgT2JqZWN0KCk7CiAKQEAgLTgzLDcgKzg5LDcgQEAKIAogICAgICAgICAvLyBJZiB3ZSBkb24ndCBjYWxsIGdldEFjdGl2aXR5KCksIHdlIGdldCBhbiBlbXB0eSBsaXN0IHdoZW4gcmVxdWVzdGluZyB0aGUgbnVtYmVyIG9mCiAgICAgICAgIC8vIHdpbmRvd3Mgb24gc2NyZWVuLgotICAgICAgICBnZXRBY3Rpdml0eSgpOworICAgICAgICBtQWN0aXZpdHkgPSBnZXRBY3Rpdml0eSgpOwogCiAgICAgICAgIG1TZXJ2aWNlID0gSW5zdHJ1bWVudGVkQWNjZXNzaWJpbGl0eVNlcnZpY2UuZW5hYmxlU2VydmljZSgKICAgICAgICAgICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKSwgSW5zdHJ1bWVudGVkQWNjZXNzaWJpbGl0eVNlcnZpY2UuY2xhc3MpOwpAQCAtOTMsNiArOTksOCBAQAogICAgICAgICBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8gaW5mbyA9IG1VaUF1dG9tYXRpb24uZ2V0U2VydmljZUluZm8oKTsKICAgICAgICAgaW5mby5mbGFncyB8PSBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8uRkxBR19SRVRSSUVWRV9JTlRFUkFDVElWRV9XSU5ET1dTOwogICAgICAgICBtVWlBdXRvbWF0aW9uLnNldFNlcnZpY2VJbmZvKGluZm8pOworICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS5ydW5Pbk1haW5TeW5jKAorICAgICAgICAgICAgICAgICgpIC0+IG1LZXlib2FyZFRhcmdldFZpZXcgPSBtQWN0aXZpdHkuZmluZFZpZXdCeUlkKFIuaWQuZWRpdF90ZXh0KSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xMDAsOCArMTA4LDExIEBACiAgICAgICAgIG1LZXlib2FyZENvbnRyb2xsZXIuc2V0U2hvd01vZGUoU0hPV19NT0RFX0FVVE8pOwogICAgICAgICBtU2VydmljZS5ydW5PblNlcnZpY2VTeW5jKCgpIC0+IG1TZXJ2aWNlLmRpc2FibGVTZWxmKCkpOwogICAgICAgICBBY3Rpdml0eSBhY3Rpdml0eSA9IGdldEFjdGl2aXR5KCk7Ci0gICAgICAgIGFjdGl2aXR5LmdldFN5c3RlbVNlcnZpY2UoSW5wdXRNZXRob2RNYW5hZ2VyLmNsYXNzKQotICAgICAgICAgICAgICAgIC5oaWRlU29mdElucHV0RnJvbVdpbmRvdyhhY3Rpdml0eS5nZXRDdXJyZW50Rm9jdXMoKS5nZXRXaW5kb3dUb2tlbigpLCAwKTsKKyAgICAgICAgVmlldyBjdXJyZW50Rm9jdXMgPSBhY3Rpdml0eS5nZXRDdXJyZW50Rm9jdXMoKTsKKyAgICAgICAgaWYgKGN1cnJlbnRGb2N1cyAhPSBudWxsKSB7CisgICAgICAgICAgICBhY3Rpdml0eS5nZXRTeXN0ZW1TZXJ2aWNlKElucHV0TWV0aG9kTWFuYWdlci5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgLmhpZGVTb2Z0SW5wdXRGcm9tV2luZG93KGN1cnJlbnRGb2N1cy5nZXRXaW5kb3dUb2tlbigpLCAwKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RBcGlSZXR1cm5WYWx1ZXNfc2hvdWxkQ2hhbmdlVmFsdWVPblJlcXVlc3RBbmRTZW5kQ2FsbGJhY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy9BY2Nlc3NpYmlsaXR5VGVzdEFjdGl2aXR5LmphdmEgYi90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9jdHMvQWNjZXNzaWJpbGl0eVRlc3RBY3Rpdml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmE0Mzc1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy9BY2Nlc3NpYmlsaXR5VGVzdEFjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0Ci0gKiBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlCi0gKiBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKLSAqIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLmN0czsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWNjZXNzaWJpbGl0eVRlc3RBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLQotICAgICAgICBnZXRXaW5kb3coKS5hZGRGbGFncyhXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0tFRVBfU0NSRUVOX09OCi0gICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX1RVUk5fU0NSRUVOX09OCi0gICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0RJU01JU1NfS0VZR1VBUkQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy9BY2Nlc3NpYmlsaXR5VGV4dEFjdGlvblRlc3QuamF2YSBiL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy9BY2Nlc3NpYmlsaXR5VGV4dEFjdGlvblRlc3QuamF2YQppbmRleCA3MjUyZmUwLi5jZDg0ZmI5IDEwMDY0NAotLS0gYS90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9jdHMvQWNjZXNzaWJpbGl0eVRleHRBY3Rpb25UZXN0LmphdmEKKysrIGIvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2Uvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvY3RzL0FjY2Vzc2liaWxpdHlUZXh0QWN0aW9uVGVzdC5qYXZhCkBAIC0xNCwxMCArMTQsMjMgQEAKIAogcGFja2FnZSBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLmN0czsKIAoraW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5Tm9kZUluZm8KKyAgICAgICAgLkVYVFJBX0RBVEFfVEVYVF9DSEFSQUNURVJfTE9DQVRJT05fQVJHX0xFTkdUSDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU5vZGVJbmZvCisgICAgICAgIC5FWFRSQV9EQVRBX1RFWFRfQ0hBUkFDVEVSX0xPQ0FUSU9OX0FSR19TVEFSVF9JTkRFWDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU5vZGVJbmZvCisgICAgICAgIC5FWFRSQV9EQVRBX1RFWFRfQ0hBUkFDVEVSX0xPQ0FUSU9OX0tFWTsKKworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLm1vY2s7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8udGltZW91dDsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by50aW1lczsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by52ZXJpZnk7CisKK2ltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLmN0cy5SOworaW1wb3J0IGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuY3RzLmFjdGl2aXRpZXMuQWNjZXNzaWJpbGl0eVRleHRUcmF2ZXJzYWxBY3Rpdml0eTsKIGltcG9ydCBhbmRyb2lkLmFwcC5VaUF1dG9tYXRpb247CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0RjsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLkRlYnVnOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZVN0cmluZzsKQEAgLTMzLDI3ICs0NiwxMSBAQAogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkVkaXRUZXh0OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwogCi1pbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHMuUjsKLQogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY1JlZmVyZW5jZTsKIAotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5Tm9kZUluZm8uRVhUUkFfREFUQV9URVhUX0NIQVJBQ1RFUl9MT0NBVElPTl9BUkdfTEVOR1RIOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5Tm9kZUluZm8uRVhUUkFfREFUQV9URVhUX0NIQVJBQ1RFUl9MT0NBVElPTl9BUkdfU1RBUlRfSU5ERVg7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlOb2RlSW5mby5FWFRSQV9EQVRBX1RFWFRfQ0hBUkFDVEVSX0xPQ0FUSU9OX0tFWTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ubW9jazsKLWltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by50aW1lb3V0OwotaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnRpbWVzOwotaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnZlcmlmeTsKLWltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by52ZXJpZnlOb01vcmVJbnRlcmFjdGlvbnM7Ci0KIC8qKgogICogVGVzdCBjYXNlcyBmb3IgYWN0aW9ucyB0YWtlbiBvbiB0ZXh0IHZpZXdzLgogICovCkBAIC0xOTksMTAgKzE5NiwxNCBAQAogCiAgICAgcHVibGljIHZvaWQgdGVzdFRleHRMb2NhdGlvbnNfdGV4dFZpZXdTaG91bGRQcm92aWRlV2hlblJlcXVlc3RlZCgpIHsKICAgICAgICAgZmluYWwgVGV4dFZpZXcgdGV4dFZpZXcgPSAoVGV4dFZpZXcpIGdldEFjdGl2aXR5KCkuZmluZFZpZXdCeUlkKFIuaWQudGV4dCk7Ci0gICAgICAgIG1ha2VUZXh0Vmlld1Zpc2libGVBbmRTZXRUZXh0KHRleHRWaWV3LCBnZXRTdHJpbmcoUi5zdHJpbmcuYV9iKSk7CisgICAgICAgIC8vIFVzZSB0ZXh0IHdpdGggYSBzdHJvbmcgcywgc2luY2UgdGhhdCBnZXRzIHJlcGxhY2VkIHdpdGggYSBkb3VibGUgcyBmb3IgYWxsIGNhcHMuCisgICAgICAgIC8vIFRoYXQgcmVwbGFjZW1lbnQgcmVxdWlyZXMgdXMgdG8gcHJvcGVybHkgaGFuZGxlIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBjaGFuZ2luZy4KKyAgICAgICAgU3RyaW5nIHN0cmluZ1RvU2V0ID0gZ2V0U3RyaW5nKFIuc3RyaW5nLmdlcm1hbl90ZXh0X3dpdGhfc3Ryb25nX3MpOworICAgICAgICBtYWtlVGV4dFZpZXdWaXNpYmxlQW5kU2V0VGV4dCh0ZXh0Vmlldywgc3RyaW5nVG9TZXQpOworICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS5ydW5Pbk1haW5TeW5jKCgpIC0+IHRleHRWaWV3LnNldEFsbENhcHModHJ1ZSkpOwogCiAgICAgICAgIGZpbmFsIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyB0ZXh0ID0gbVVpQXV0b21hdGlvbi5nZXRSb290SW5BY3RpdmVXaW5kb3coKQotICAgICAgICAgICAgICAgIC5maW5kQWNjZXNzaWJpbGl0eU5vZGVJbmZvc0J5VGV4dChnZXRTdHJpbmcoUi5zdHJpbmcuYV9iKSkuZ2V0KDApOworICAgICAgICAgICAgICAgIC5maW5kQWNjZXNzaWJpbGl0eU5vZGVJbmZvc0J5VGV4dChzdHJpbmdUb1NldCkuZ2V0KDApOwogICAgICAgICBMaXN0PFN0cmluZz4gdGV4dEF2YWlsYWJsZUV4dHJhRGF0YSA9IHRleHQuZ2V0QXZhaWxhYmxlRXh0cmFEYXRhKCk7CiAgICAgICAgIGFzc2VydFRydWUoIlRleHQgdmlldyBzaG91bGQgb2ZmZXIgdGV4dCBsb2NhdGlvbiB0byBhY2Nlc3NpYmlsaXR5IiwKICAgICAgICAgICAgICAgICB0ZXh0QXZhaWxhYmxlRXh0cmFEYXRhLmNvbnRhaW5zKEVYVFJBX0RBVEFfVEVYVF9DSEFSQUNURVJfTE9DQVRJT05fS0VZKSk7CmRpZmYgLS1naXQgYS90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9jdHMvQWNjZXNzaWJpbGl0eVRleHRUcmF2ZXJzYWxBY3Rpdml0eS5qYXZhIGIvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2Uvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvY3RzL0FjY2Vzc2liaWxpdHlUZXh0VHJhdmVyc2FsQWN0aXZpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI5M2EwOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9jdHMvQWNjZXNzaWJpbGl0eVRleHRUcmF2ZXJzYWxBY3Rpdml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdAotICogaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZQotICogTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCi0gKiBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHM7Ci0KLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLQotaW1wb3J0IGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuY3RzLlI7Ci0KLS8qKgotICogQWN0aXZpdHkgZm9yIHRlc3RpbmcgdGhlIGFjY2Vzc2liaWxpdHkgQVBJcyBmb3IgdHJhdmVyc2luZyB0aGUKLSAqIHRleHQgY29udGVudCBvZiBhIFZpZXcgYXQgc2V2ZXJhbCBncmFudWxhcml0aWVzLgotICovCi1wdWJsaWMgY2xhc3MgQWNjZXNzaWJpbGl0eVRleHRUcmF2ZXJzYWxBY3Rpdml0eSBleHRlbmRzIEFjY2Vzc2liaWxpdHlUZXN0QWN0aXZpdHkgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwotICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5hY2Nlc3NpYmlsaXR5X3RleHRfdHJhdmVyc2FsX3Rlc3QpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy9BY2Nlc3NpYmlsaXR5VGV4dFRyYXZlcnNhbFRlc3QuamF2YSBiL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy9BY2Nlc3NpYmlsaXR5VGV4dFRyYXZlcnNhbFRlc3QuamF2YQppbmRleCA2YmMyOTY5Li41ODg4MjczIDEwMDY0NAotLS0gYS90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9jdHMvQWNjZXNzaWJpbGl0eVRleHRUcmF2ZXJzYWxUZXN0LmphdmEKKysrIGIvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2Uvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvY3RzL0FjY2Vzc2liaWxpdHlUZXh0VHJhdmVyc2FsVGVzdC5qYXZhCkBAIC0xNCw2ICsxNCw4IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHM7CiAKK2ltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLmN0cy5SOworaW1wb3J0IGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuY3RzLmFjdGl2aXRpZXMuQWNjZXNzaWJpbGl0eVRleHRUcmF2ZXJzYWxBY3Rpdml0eTsKIGltcG9ydCBhbmRyb2lkLmFwcC5VaUF1dG9tYXRpb247CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwpAQCAtMjYsOCArMjgsNiBAQAogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkVkaXRUZXh0OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwogCi1pbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHMuUjsKLQogLyoqCiAgKiBUZXN0IGNhc2VzIGZvciB0ZXN0aW5nIHRoZSBhY2Nlc3NpYmlsaXR5IEFQSXMgZm9yIHRyYXZlcnNpbmcgdGhlIHRleHQgY29udGVudCBvZgogICogYSBWaWV3IGF0IHNldmVyYWwgZ3JhbnVsYXJpdGllcy4KQEAgLTI5NzAsMTYyICsyOTcwLDYgQEAKICAgICB9CiAKICAgICBATWVkaXVtVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RBY3Rpb25OZXh0QW5kUHJldmlvdXNBdEdyYW51bGFyaXR5UGFnZU92ZXJUZXh0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIEVkaXRUZXh0IGVkaXRUZXh0ID0gKEVkaXRUZXh0KSBnZXRBY3Rpdml0eSgpLmZpbmRWaWV3QnlJZChSLmlkLmVkaXQpOwotCi0gICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpLnJ1bk9uTWFpblN5bmMobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgZWRpdFRleHQuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIGVkaXRUZXh0LnNldFRleHQoZ2V0U3RyaW5nKFIuc3RyaW5nLmFuZHJvaWRfd2lraSkpOwotICAgICAgICAgICAgICAgIFNlbGVjdGlvbi5yZW1vdmVTZWxlY3Rpb24oZWRpdFRleHQuZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgZmluYWwgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIHRleHQgPSBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRVaUF1dG9tYXRpb24oKQotICAgICAgICAgICAgICAgLmdldFJvb3RJbkFjdGl2ZVdpbmRvdygpLmZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9zQnlUZXh0KGdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuYW5kcm9pZF93aWtpKSkuZ2V0KDApOwotCi0gICAgICAgIGZpbmFsIGludCBncmFudWxhcml0aWVzID0gdGV4dC5nZXRNb3ZlbWVudEdyYW51bGFyaXRpZXMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGdyYW51bGFyaXRpZXMsIEFjY2Vzc2liaWxpdHlOb2RlSW5mby5NT1ZFTUVOVF9HUkFOVUxBUklUWV9DSEFSQUNURVIKLSAgICAgICAgICAgICAgICB8IEFjY2Vzc2liaWxpdHlOb2RlSW5mby5NT1ZFTUVOVF9HUkFOVUxBUklUWV9XT1JECi0gICAgICAgICAgICAgICAgfCBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8uTU9WRU1FTlRfR1JBTlVMQVJJVFlfTElORQotICAgICAgICAgICAgICAgIHwgQWNjZXNzaWJpbGl0eU5vZGVJbmZvLk1PVkVNRU5UX0dSQU5VTEFSSVRZX1BBUkFHUkFQSAotICAgICAgICAgICAgICAgIHwgQWNjZXNzaWJpbGl0eU5vZGVJbmZvLk1PVkVNRU5UX0dSQU5VTEFSSVRZX1BBR0UpOwotCi0gICAgICAgIGZpbmFsIEJ1bmRsZSBhcmd1bWVudHMgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgIGFyZ3VtZW50cy5wdXRJbnQoQWNjZXNzaWJpbGl0eU5vZGVJbmZvLkFDVElPTl9BUkdVTUVOVF9NT1ZFTUVOVF9HUkFOVUxBUklUWV9JTlQsCi0gICAgICAgICAgICAgICAgQWNjZXNzaWJpbGl0eU5vZGVJbmZvLk1PVkVNRU5UX0dSQU5VTEFSSVRZX1BBR0UpOwotCi0gICAgICAgIC8vIE1vdmUgZm9yd2FyZCBhIGZldyBwYWdlcwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IENIQVJBQ1RFUl9JTkRJQ0VTX09GX1BBR0VfU1RBUlQubGVuZ3RoIC0gMTsgaSsrKSB7Ci0gICAgICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgZXZlbnQgPSBwZXJmb3JtTW92ZW1lbnRBY3Rpb25BbmRHZXRFdmVudCgKLSAgICAgICAgICAgICAgICAgICAgdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgQWNjZXNzaWJpbGl0eU5vZGVJbmZvLkFDVElPTl9ORVhUX0FUX01PVkVNRU5UX0dSQU5VTEFSSVRZLAotICAgICAgICAgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8uTU9WRU1FTlRfR1JBTlVMQVJJVFlfUEFHRSwKLSAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV2ZW50LmdldENsYXNzTmFtZSgpLCBFZGl0VGV4dC5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRXZlbnQgc2hvdWxkIGNvbnRhaW4gdGV4dCIsIGV2ZW50LmdldFRleHQoKS5zaXplKCkgPiAwKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIkV2ZW50IHRleHQgZG9lc24ndCBtYXRjaC4gRXhwZWN0ZWQ6ICIgKyBnZXRTdHJpbmcoUi5zdHJpbmcuYW5kcm9pZF93aWtpKQotICAgICAgICAgICAgICAgICAgICArICIuIFJlY2VpdmVkOiIgKyBldmVudC5nZXRUZXh0KCkuZ2V0KDApLAotICAgICAgICAgICAgICAgICAgICBUZXh0VXRpbHMuZXF1YWxzKGV2ZW50LmdldFRleHQoKS5nZXQoMCksIGdldFN0cmluZyhSLnN0cmluZy5hbmRyb2lkX3dpa2kpKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkV2ZW50IGZyb20gc2hvdWxkIGJlIHN0YXJ0IG9mIHRleHQgc2tpcHBlZC4iLAotICAgICAgICAgICAgICAgICAgICBDSEFSQUNURVJfSU5ESUNFU19PRl9QQUdFX1NUQVJUW2ldLCBldmVudC5nZXRGcm9tSW5kZXgoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkV2ZW50IHRvIHNob3VsZCBiZSBlbmQgb2YgdGV4dCBza2lwcGVkLiIsCi0gICAgICAgICAgICAgICAgICAgIENIQVJBQ1RFUl9JTkRJQ0VTX09GX1BBR0VfU1RBUlRbaSArIDFdLCBldmVudC5nZXRUb0luZGV4KCkpOwotICAgICAgICAgICAgLy8gVmVyaWZ5IHRoZSBzZWxlY3Rpb24gcG9zaXRpb24gaGFzIGNoYW5nZWQuCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkV2ZW50IHNlbGVjdGlvbiBzdGFydCBzaG91bGQgbWF0Y2ggcG9zaXRpb24gaXQgbW92ZWQgdG8uIiwKLSAgICAgICAgICAgICAgICAgICAgQ0hBUkFDVEVSX0lORElDRVNfT0ZfUEFHRV9TVEFSVFtpICsgMV0sCi0gICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25TdGFydChlZGl0VGV4dC5nZXRUZXh0KCkpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiRXZlbnQgc2VsZWN0aW9uIGVuZCBzaG91bGQgbWF0Y2ggcG9zaXRpb24gaXQgbW92ZWQgdG8uIiwKLSAgICAgICAgICAgICAgICAgICAgQ0hBUkFDVEVSX0lORElDRVNfT0ZfUEFHRV9TVEFSVFtpICsgMV0sCi0gICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQoZWRpdFRleHQuZ2V0VGV4dCgpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBNb3ZlIGJhY2sgdG8gdGhlIGJlZ2lubmluZwotICAgICAgICBmb3IgKGludCBpID0gQ0hBUkFDVEVSX0lORElDRVNfT0ZfUEFHRV9TVEFSVC5sZW5ndGggLSAyOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IGV2ZW50ID0gcGVyZm9ybU1vdmVtZW50QWN0aW9uQW5kR2V0RXZlbnQoCi0gICAgICAgICAgICAgICAgICAgIHRleHQsCi0gICAgICAgICAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlOb2RlSW5mby5BQ1RJT05fUFJFVklPVVNfQVRfTU9WRU1FTlRfR1JBTlVMQVJJVFksCi0gICAgICAgICAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlOb2RlSW5mby5NT1ZFTUVOVF9HUkFOVUxBUklUWV9QQUdFLAotICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXZlbnQuZ2V0Q2xhc3NOYW1lKCksIEVkaXRUZXh0LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJFdmVudCBzaG91bGQgY29udGFpbiB0ZXh0IiwgZXZlbnQuZ2V0VGV4dCgpLnNpemUoKSA+IDApOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRXZlbnQgdGV4dCBkb2Vzbid0IG1hdGNoLiBFeHBlY3RlZDogIiArIGdldFN0cmluZyhSLnN0cmluZy5hbmRyb2lkX3dpa2kpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLiBSZWNlaXZlZDoiICsgZXZlbnQuZ2V0VGV4dCgpLmdldCgwKSwKLSAgICAgICAgICAgICAgICAgICAgVGV4dFV0aWxzLmVxdWFscyhldmVudC5nZXRUZXh0KCkuZ2V0KDApLCBnZXRTdHJpbmcoUi5zdHJpbmcuYW5kcm9pZF93aWtpKSkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJFdmVudCBmcm9tIHNob3VsZCBiZSBzdGFydCBvZiB0ZXh0IHNraXBwZWQuIiwKLSAgICAgICAgICAgICAgICAgICAgQ0hBUkFDVEVSX0lORElDRVNfT0ZfUEFHRV9TVEFSVFtpXSwgZXZlbnQuZ2V0RnJvbUluZGV4KCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJFdmVudCB0byBzaG91bGQgYmUgZW5kIG9mIHRleHQgc2tpcHBlZC4iLAotICAgICAgICAgICAgICAgICAgICBDSEFSQUNURVJfSU5ESUNFU19PRl9QQUdFX1NUQVJUW2kgKyAxXSwgZXZlbnQuZ2V0VG9JbmRleCgpKTsKLSAgICAgICAgICAgIC8vIFZlcmlmeSB0aGUgc2VsZWN0aW9uIHBvc2l0aW9uIGhhcyBjaGFuZ2VkLgotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJFdmVudCBzZWxlY3Rpb24gc3RhcnQgc2hvdWxkIG1hdGNoIHBvc2l0aW9uIGl0IG1vdmVkIHRvLiIsCi0gICAgICAgICAgICAgICAgICAgIENIQVJBQ1RFUl9JTkRJQ0VTX09GX1BBR0VfU1RBUlRbaV0sCi0gICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25TdGFydChlZGl0VGV4dC5nZXRUZXh0KCkpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiRXZlbnQgc2VsZWN0aW9uIGVuZCBzaG91bGQgbWF0Y2ggcG9zaXRpb24gaXQgbW92ZWQgdG8uIiwKLSAgICAgICAgICAgICAgICAgICAgQ0hBUkFDVEVSX0lORElDRVNfT0ZfUEFHRV9TVEFSVFtpXSwKLSAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChlZGl0VGV4dC5nZXRUZXh0KCkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBNZWRpdW1UZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEFjdGlvbk5leHRBbmRQcmV2aW91c0F0R3JhbnVsYXJpdHlQYWdlT3ZlclRleHRFeHRlbmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgRWRpdFRleHQgZWRpdFRleHQgPSAoRWRpdFRleHQpIGdldEFjdGl2aXR5KCkuZmluZFZpZXdCeUlkKFIuaWQuZWRpdCk7Ci0KLSAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkucnVuT25NYWluU3luYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBlZGl0VGV4dC5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgZWRpdFRleHQuc2V0VGV4dChnZXRTdHJpbmcoUi5zdHJpbmcuYW5kcm9pZF93aWtpKSk7Ci0gICAgICAgICAgICAgICAgU2VsZWN0aW9uLnJlbW92ZVNlbGVjdGlvbihlZGl0VGV4dC5nZXRUZXh0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBmaW5hbCBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gdGV4dCA9IGdldEluc3RydW1lbnRhdGlvbigpLmdldFVpQXV0b21hdGlvbigpCi0gICAgICAgICAgICAgICAuZ2V0Um9vdEluQWN0aXZlV2luZG93KCkuZmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb3NCeVRleHQoZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5hbmRyb2lkX3dpa2kpKS5nZXQoMCk7Ci0KLSAgICAgICAgZmluYWwgaW50IGdyYW51bGFyaXRpZXMgPSB0ZXh0LmdldE1vdmVtZW50R3JhbnVsYXJpdGllcygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZ3JhbnVsYXJpdGllcywgQWNjZXNzaWJpbGl0eU5vZGVJbmZvLk1PVkVNRU5UX0dSQU5VTEFSSVRZX0NIQVJBQ1RFUgotICAgICAgICAgICAgICAgIHwgQWNjZXNzaWJpbGl0eU5vZGVJbmZvLk1PVkVNRU5UX0dSQU5VTEFSSVRZX1dPUkQKLSAgICAgICAgICAgICAgICB8IEFjY2Vzc2liaWxpdHlOb2RlSW5mby5NT1ZFTUVOVF9HUkFOVUxBUklUWV9MSU5FCi0gICAgICAgICAgICAgICAgfCBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8uTU9WRU1FTlRfR1JBTlVMQVJJVFlfUEFSQUdSQVBICi0gICAgICAgICAgICAgICAgfCBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8uTU9WRU1FTlRfR1JBTlVMQVJJVFlfUEFHRSk7Ci0KLSAgICAgICAgZmluYWwgQnVuZGxlIGFyZ3VtZW50cyA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgYXJndW1lbnRzLnB1dEludChBY2Nlc3NpYmlsaXR5Tm9kZUluZm8uQUNUSU9OX0FSR1VNRU5UX01PVkVNRU5UX0dSQU5VTEFSSVRZX0lOVCwKLSAgICAgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8uTU9WRU1FTlRfR1JBTlVMQVJJVFlfUEFHRSk7Ci0KLSAgICAgICAgLy8gTW92ZSBmb3J3YXJkIGEgZmV3IHBhZ2VzCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQ0hBUkFDVEVSX0lORElDRVNfT0ZfUEFHRV9TVEFSVC5sZW5ndGggLSAxOyBpKyspIHsKLSAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBldmVudCA9IHBlcmZvcm1Nb3ZlbWVudEFjdGlvbkFuZEdldEV2ZW50KAotICAgICAgICAgICAgICAgICAgICB0ZXh0LAotICAgICAgICAgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8uQUNUSU9OX05FWFRfQVRfTU9WRU1FTlRfR1JBTlVMQVJJVFksCi0gICAgICAgICAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlOb2RlSW5mby5NT1ZFTUVOVF9HUkFOVUxBUklUWV9QQUdFLAotICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhldmVudC5nZXRDbGFzc05hbWUoKSwgRWRpdFRleHQuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIkV2ZW50IHNob3VsZCBjb250YWluIHRleHQiLCBldmVudC5nZXRUZXh0KCkuc2l6ZSgpID4gMCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJFdmVudCB0ZXh0IGRvZXNuJ3QgbWF0Y2guIEV4cGVjdGVkOiAiICsgZ2V0U3RyaW5nKFIuc3RyaW5nLmFuZHJvaWRfd2lraSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIuIFJlY2VpdmVkOiIgKyBldmVudC5nZXRUZXh0KCkuZ2V0KDApLAotICAgICAgICAgICAgICAgICAgICBUZXh0VXRpbHMuZXF1YWxzKGV2ZW50LmdldFRleHQoKS5nZXQoMCksIGdldFN0cmluZyhSLnN0cmluZy5hbmRyb2lkX3dpa2kpKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkV2ZW50IGZyb20gc2hvdWxkIGJlIHN0YXJ0IG9mIHRleHQgc2tpcHBlZCIsCi0gICAgICAgICAgICAgICAgICAgIENIQVJBQ1RFUl9JTkRJQ0VTX09GX1BBR0VfU1RBUlRbaV0sIGV2ZW50LmdldEZyb21JbmRleCgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiRXZlbnQgdG8gc2hvdWxkIGJlIGVuZCBvZiB0ZXh0IHNraXBwZWQiLAotICAgICAgICAgICAgICAgICAgICBDSEFSQUNURVJfSU5ESUNFU19PRl9QQUdFX1NUQVJUW2kgKyAxXSwgZXZlbnQuZ2V0VG9JbmRleCgpKTsKLSAgICAgICAgICAgIC8vIFZlcmlmeSB0aGUgc2VsZWN0aW9uIHBvc2l0aW9uIGhhcyBjaGFuZ2VkLgotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJFdmVudCBzZWxlY3Rpb24gc3RhcnQgc2hvdWxkIHN0YXkgYXQgYmVnaW5uaW5nIiwKLSAgICAgICAgICAgICAgICAgICAgMCwgU2VsZWN0aW9uLmdldFNlbGVjdGlvblN0YXJ0KGVkaXRUZXh0LmdldFRleHQoKSkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJFdmVudCBzZWxlY3Rpb24gZW5kIHNob3VsZCBtYXRjaCBjdXJyZW50IHBvc2l0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgQ0hBUkFDVEVSX0lORElDRVNfT0ZfUEFHRV9TVEFSVFtpICsgMV0sCi0gICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQoZWRpdFRleHQuZ2V0VGV4dCgpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBNb3ZlIGJhY2sgdG8gdGhlIGJlZ2lubmluZwotICAgICAgICBmb3IgKGludCBpID0gQ0hBUkFDVEVSX0lORElDRVNfT0ZfUEFHRV9TVEFSVC5sZW5ndGggLSAyOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IGV2ZW50ID0gcGVyZm9ybU1vdmVtZW50QWN0aW9uQW5kR2V0RXZlbnQoCi0gICAgICAgICAgICAgICAgICAgIHRleHQsCi0gICAgICAgICAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlOb2RlSW5mby5BQ1RJT05fUFJFVklPVVNfQVRfTU9WRU1FTlRfR1JBTlVMQVJJVFksCi0gICAgICAgICAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlOb2RlSW5mby5NT1ZFTUVOVF9HUkFOVUxBUklUWV9QQUdFLAotICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhldmVudC5nZXRDbGFzc05hbWUoKSwgRWRpdFRleHQuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIkV2ZW50IHNob3VsZCBjb250YWluIHRleHQiLCBldmVudC5nZXRUZXh0KCkuc2l6ZSgpID4gMCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJFdmVudCB0ZXh0IGRvZXNuJ3QgbWF0Y2guIEV4cGVjdGVkOiAiICsgZ2V0U3RyaW5nKFIuc3RyaW5nLmFuZHJvaWRfd2lraSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIuIFJlY2VpdmVkOiIgKyBldmVudC5nZXRUZXh0KCkuZ2V0KDApLAotICAgICAgICAgICAgICAgICAgICBUZXh0VXRpbHMuZXF1YWxzKGV2ZW50LmdldFRleHQoKS5nZXQoMCksIGdldFN0cmluZyhSLnN0cmluZy5hbmRyb2lkX3dpa2kpKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkV2ZW50IGZyb20gc2hvdWxkIGJlIHN0YXJ0IG9mIHRleHQgc2tpcHBlZCIsCi0gICAgICAgICAgICAgICAgICAgIENIQVJBQ1RFUl9JTkRJQ0VTX09GX1BBR0VfU1RBUlRbaV0sIGV2ZW50LmdldEZyb21JbmRleCgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiRXZlbnQgdG8gc2hvdWxkIGJlIGVuZCBvZiB0ZXh0IHNraXBwZWQiLAotICAgICAgICAgICAgICAgICAgICBDSEFSQUNURVJfSU5ESUNFU19PRl9QQUdFX1NUQVJUW2kgKyAxXSwgZXZlbnQuZ2V0VG9JbmRleCgpKTsKLSAgICAgICAgICAgIC8vIFZlcmlmeSB0aGUgc2VsZWN0aW9uIHBvc2l0aW9uIGhhcyBjaGFuZ2VkLgotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJFdmVudCBzZWxlY3Rpb24gc3RhcnQgc2hvdWxkIHN0YXkgYXQgYmVnaW5uaW5nIiwKLSAgICAgICAgICAgICAgICAgICAgMCwgU2VsZWN0aW9uLmdldFNlbGVjdGlvblN0YXJ0KGVkaXRUZXh0LmdldFRleHQoKSkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJFdmVudCBzZWxlY3Rpb24gZW5kIHNob3VsZCBtYXRjaCBjdXJyZW50IHBvc2l0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgQ0hBUkFDVEVSX0lORElDRVNfT0ZfUEFHRV9TVEFSVFtpXSwKLSAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChlZGl0VGV4dC5nZXRUZXh0KCkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBNZWRpdW1UZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEFjdGlvbk5leHRBbmRQcmV2aW91c0F0R3JhbnVsYXJpdHlQYXJhZ3JhcGhPdmVyVGV4dCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBmaW5hbCBUZXh0VmlldyB0ZXh0VmlldyA9IChUZXh0VmlldykgZ2V0QWN0aXZpdHkoKS5maW5kVmlld0J5SWQoUi5pZC5lZGl0KTsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2Uvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvY3RzL0FjY2Vzc2liaWxpdHlWaWV3VHJlZVJlcG9ydGluZ0FjdGl2aXR5LmphdmEgYi90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9jdHMvQWNjZXNzaWJpbGl0eVZpZXdUcmVlUmVwb3J0aW5nQWN0aXZpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI4ZTdlOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9jdHMvQWNjZXNzaWJpbGl0eVZpZXdUcmVlUmVwb3J0aW5nQWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQKLSAqIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUKLSAqIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotICogZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuY3RzOwotCi1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci0KLWltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLmN0cy5SOwotCi0vKioKLSAqIEFjdGl2aXR5IGZvciB0ZXN0aW5nIHRoZSBhY2Nlc3NpYmlsaXR5IGZvY3VzIEFQSXMgZXhwb3NlZCB0bwotICogYWNjZXNzaWJpbGl0eSBzZXJ2aWNlcy4gVGhlc2UgQVBJcyBhbGxvdyBtb3ZpbmcgYWNjZXNzaWJpbGl0eQotICogZm9jdXMgaW4gdGhlIHZpZXcgdHJlZSBmcm9tIGFuIEFjY2Vzc2lpYmxpdHlTZXJ2aWNlLiBTcGVjaWZpY2FsbHksCi0gKiB0aGlzIGFjdGl2aXR5IGlzIGZvciB2ZXJpZnlpbmcgdGhlIGhpZXJhcmNoaWNhbCBtb3ZlbWVudCBvZiB0aGUKLSAqIGFjY2Vzc2liaWxpdHkgZm9jdXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBBY2Nlc3NpYmlsaXR5Vmlld1RyZWVSZXBvcnRpbmdBY3Rpdml0eSBleHRlbmRzIEFjY2Vzc2liaWxpdHlUZXN0QWN0aXZpdHkgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwotICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5hY2Nlc3NpYmlsaXR5X3ZpZXdfdHJlZV9yZXBvcnRpbmdfdGVzdCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2Uvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvY3RzL0FjY2Vzc2liaWxpdHlWaWV3VHJlZVJlcG9ydGluZ1Rlc3QuamF2YSBiL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy9BY2Nlc3NpYmlsaXR5Vmlld1RyZWVSZXBvcnRpbmdUZXN0LmphdmEKaW5kZXggMzA1MDUwYi4uMjhhM2FjZCAxMDA2NDQKLS0tIGEvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2Uvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvY3RzL0FjY2Vzc2liaWxpdHlWaWV3VHJlZVJlcG9ydGluZ1Rlc3QuamF2YQorKysgYi90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9jdHMvQWNjZXNzaWJpbGl0eVZpZXdUcmVlUmVwb3J0aW5nVGVzdC5qYXZhCkBAIC0xNCwxMTQgKzE0LDE0NyBAQAogCiBwYWNrYWdlIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuY3RzOwogCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuY3RzLnV0aWxzLkFjdGl2aXR5TGF1bmNoVXRpbHMKKyAgICAgICAgLmxhdW5jaEFjdGl2aXR5QW5kV2FpdEZvckl0VG9CZU9uc2NyZWVuOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCiBpbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZUluZm87CitpbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHMuUjsKK2ltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLmN0cy5hY3Rpdml0aWVzLkFjY2Vzc2liaWxpdHlWaWV3VHJlZVJlcG9ydGluZ0FjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmFwcC5VaUF1dG9tYXRpb247CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU5vZGVJbmZvOwotCi1pbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHMuUjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OwogCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworCiAvKioKICAqIFRlc3QgY2FzZXMgZm9yIHRlc3RpbmcgdGhlIGFjY2Vzc2liaWxpdHkgZm9jdXMgQVBJcyBleHBvc2VkIHRvIGFjY2Vzc2liaWxpdHkKICAqIHNlcnZpY2VzLiBUaGlzIHRlc3QgY2hlY2tzIGhvdyB0aGUgdmlldyBoaWVyYXJjaHkgaXMgcmVwb3J0ZWQgdG8gYWNjZXNzaWJpbGl0eQogICogc2VydmljZXMuCiAgKi8KLXB1YmxpYyBjbGFzcyBBY2Nlc3NpYmlsaXR5Vmlld1RyZWVSZXBvcnRpbmdUZXN0Ci0gICAgICAgIGV4dGVuZHMgQWNjZXNzaWJpbGl0eUFjdGl2aXR5VGVzdENhc2U8QWNjZXNzaWJpbGl0eVZpZXdUcmVlUmVwb3J0aW5nQWN0aXZpdHk+eworQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBBY2Nlc3NpYmlsaXR5Vmlld1RyZWVSZXBvcnRpbmdUZXN0IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVElNRU9VVF9BU1lOQ19QUk9DRVNTSU5HID0gNTAwMDsKIAotICAgIHB1YmxpYyBBY2Nlc3NpYmlsaXR5Vmlld1RyZWVSZXBvcnRpbmdUZXN0KCkgewotICAgICAgICBzdXBlcihBY2Nlc3NpYmlsaXR5Vmlld1RyZWVSZXBvcnRpbmdBY3Rpdml0eS5jbGFzcyk7CisgICAgcHJpdmF0ZSBzdGF0aWMgSW5zdHJ1bWVudGF0aW9uIHNJbnN0cnVtZW50YXRpb247CisgICAgcHJpdmF0ZSBzdGF0aWMgVWlBdXRvbWF0aW9uIHNVaUF1dG9tYXRpb247CisKKyAgICBwcml2YXRlIEFjY2Vzc2liaWxpdHlWaWV3VHJlZVJlcG9ydGluZ0FjdGl2aXR5IG1BY3Rpdml0eTsKKworICAgIEBSdWxlCisgICAgcHVibGljIEFjdGl2aXR5VGVzdFJ1bGU8QWNjZXNzaWJpbGl0eVZpZXdUcmVlUmVwb3J0aW5nQWN0aXZpdHk+IG1BY3Rpdml0eVJ1bGUgPQorICAgICAgICAgICAgbmV3IEFjdGl2aXR5VGVzdFJ1bGU8PihBY2Nlc3NpYmlsaXR5Vmlld1RyZWVSZXBvcnRpbmdBY3Rpdml0eS5jbGFzcywgZmFsc2UsIGZhbHNlKTsKKworICAgIEBCZWZvcmVDbGFzcworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBvbmVUaW1lU2V0dXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc0luc3RydW1lbnRhdGlvbiA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpOworICAgICAgICBzVWlBdXRvbWF0aW9uID0gc0luc3RydW1lbnRhdGlvbi5nZXRVaUF1dG9tYXRpb24oKTsKICAgICB9CiAKLSAgICBATWVkaXVtVGVzdAorICAgIEBBZnRlckNsYXNzCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGZpbmFsVGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc1VpQXV0b21hdGlvbi5kZXN0cm95KCk7CisgICAgfQorCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1BY3Rpdml0eSA9IChBY2Nlc3NpYmlsaXR5Vmlld1RyZWVSZXBvcnRpbmdBY3Rpdml0eSkgbGF1bmNoQWN0aXZpdHlBbmRXYWl0Rm9ySXRUb0JlT25zY3JlZW4oCisgICAgICAgICAgICAgICAgc0luc3RydW1lbnRhdGlvbiwgc1VpQXV0b21hdGlvbiwgbUFjdGl2aXR5UnVsZSk7CisgICAgICAgIHNldEdldE5vbkltcG9ydGFudFZpZXdzKGZhbHNlKTsKKyAgICB9CisKKworICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdERlc2NlbmRhbnRzT2ZOb3RJbXBvcnRhbnRWaWV3UmVwb3J0ZWRJbk9yZGVyMSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBVaUF1dG9tYXRpb24gdWlBdXRvbWF0aW9uID0gZ2V0VWlBdXRvbWF0aW9uKGZhbHNlKTsKLSAgICAgICAgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIGZpcnN0RnJhbWVMYXlvdXQgPQotICAgICAgICAgICAgICAgIGdldE5vZGVCeVRleHQodWlBdXRvbWF0aW9uLCBSLnN0cmluZy5maXJzdEZyYW1lTGF5b3V0KTsKKyAgICAgICAgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIGZpcnN0RnJhbWVMYXlvdXQgPSBnZXROb2RlQnlUZXh0KFIuc3RyaW5nLmZpcnN0RnJhbWVMYXlvdXQpOwogICAgICAgICBhc3NlcnROb3ROdWxsKGZpcnN0RnJhbWVMYXlvdXQpOwogICAgICAgICBhc3NlcnRTYW1lKDMsIGZpcnN0RnJhbWVMYXlvdXQuZ2V0Q2hpbGRDb3VudCgpKTsKIAogICAgICAgICAvLyBDaGVjayBpZiB0aGUgZmlyc3QgY2hpbGQgaXMgdGhlIHJpZ2h0IG9uZS4KLSAgICAgICAgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIGZpcnN0VGV4dFZpZXcgPSBnZXROb2RlQnlUZXh0KHVpQXV0b21hdGlvbiwgUi5zdHJpbmcuZmlyc3RUZXh0Vmlldyk7CisgICAgICAgIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBmaXJzdFRleHRWaWV3ID0gZ2V0Tm9kZUJ5VGV4dChSLnN0cmluZy5maXJzdFRleHRWaWV3KTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKGZpcnN0VGV4dFZpZXcsIGZpcnN0RnJhbWVMYXlvdXQuZ2V0Q2hpbGQoMCkpOwogCiAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBzZWNvbmQgY2hpbGQgaXMgdGhlIHJpZ2h0IG9uZS4KLSAgICAgICAgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIGZpcnN0RWRpdFRleHQgPSBnZXROb2RlQnlUZXh0KHVpQXV0b21hdGlvbiwgUi5zdHJpbmcuZmlyc3RFZGl0VGV4dCk7CisgICAgICAgIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBmaXJzdEVkaXRUZXh0ID0gZ2V0Tm9kZUJ5VGV4dChSLnN0cmluZy5maXJzdEVkaXRUZXh0KTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKGZpcnN0RWRpdFRleHQsIGZpcnN0RnJhbWVMYXlvdXQuZ2V0Q2hpbGQoMSkpOwogCiAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB0aGlyZCBjaGlsZCBpcyB0aGUgcmlnaHQgb25lLgotICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gZmlyc3RCdXR0b24gPSBnZXROb2RlQnlUZXh0KHVpQXV0b21hdGlvbiwgUi5zdHJpbmcuZmlyc3RCdXR0b24pOworICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gZmlyc3RCdXR0b24gPSBnZXROb2RlQnlUZXh0KFIuc3RyaW5nLmZpcnN0QnV0dG9uKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKGZpcnN0QnV0dG9uLCBmaXJzdEZyYW1lTGF5b3V0LmdldENoaWxkKDIpKTsKICAgICB9CiAKLSAgICBATWVkaXVtVGVzdAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdERlc2NlbmRhbnRzT2ZOb3RJbXBvcnRhbnRWaWV3UmVwb3J0ZWRJbk9yZGVyMigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBVaUF1dG9tYXRpb24gdWlBdXRvbWF0aW9uID0gZ2V0VWlBdXRvbWF0aW9uKGZhbHNlKTsKLSAgICAgICAgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIHNlY29uZEZyYW1lTGF5b3V0ID0KLSAgICAgICAgICAgICAgICBnZXROb2RlQnlUZXh0KHVpQXV0b21hdGlvbiwgUi5zdHJpbmcuc2Vjb25kRnJhbWVMYXlvdXQpOworICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gc2Vjb25kRnJhbWVMYXlvdXQgPSBnZXROb2RlQnlUZXh0KFIuc3RyaW5nLnNlY29uZEZyYW1lTGF5b3V0KTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChzZWNvbmRGcmFtZUxheW91dCk7CiAgICAgICAgIGFzc2VydFNhbWUoMywgc2Vjb25kRnJhbWVMYXlvdXQuZ2V0Q2hpbGRDb3VudCgpKTsKIAogICAgICAgICAvLyBDaGVjayBpZiB0aGUgZmlyc3QgY2hpbGQgaXMgdGhlIHJpZ2h0IG9uZS4KLSAgICAgICAgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIHNlY29uZFRleHRWaWV3ID0gZ2V0Tm9kZUJ5VGV4dCh1aUF1dG9tYXRpb24sIFIuc3RyaW5nLnNlY29uZFRleHRWaWV3KTsKKyAgICAgICAgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIHNlY29uZFRleHRWaWV3ID0gZ2V0Tm9kZUJ5VGV4dChSLnN0cmluZy5zZWNvbmRUZXh0Vmlldyk7CiAgICAgICAgIGFzc2VydEVxdWFscyhzZWNvbmRUZXh0Vmlldywgc2Vjb25kRnJhbWVMYXlvdXQuZ2V0Q2hpbGQoMCkpOwogCiAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBzZWNvbmQgY2hpbGQgaXMgdGhlIHJpZ2h0IG9uZS4KLSAgICAgICAgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIHNlY29uZEVkaXRUZXh0ID0gZ2V0Tm9kZUJ5VGV4dCh1aUF1dG9tYXRpb24sIFIuc3RyaW5nLnNlY29uZEVkaXRUZXh0KTsKKyAgICAgICAgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIHNlY29uZEVkaXRUZXh0ID0gZ2V0Tm9kZUJ5VGV4dChSLnN0cmluZy5zZWNvbmRFZGl0VGV4dCk7CiAgICAgICAgIGFzc2VydEVxdWFscyhzZWNvbmRFZGl0VGV4dCwgc2Vjb25kRnJhbWVMYXlvdXQuZ2V0Q2hpbGQoMSkpOwogCiAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB0aGlyZCBjaGlsZCBpcyB0aGUgcmlnaHQgb25lLgotICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gc2Vjb25kQnV0dG9uID0gZ2V0Tm9kZUJ5VGV4dCh1aUF1dG9tYXRpb24sIFIuc3RyaW5nLnNlY29uZEJ1dHRvbik7CisgICAgICAgIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBzZWNvbmRCdXR0b24gPSBnZXROb2RlQnlUZXh0KFIuc3RyaW5nLnNlY29uZEJ1dHRvbik7CiAgICAgICAgIGFzc2VydEVxdWFscyhzZWNvbmRCdXR0b24sIHNlY29uZEZyYW1lTGF5b3V0LmdldENoaWxkKDIpKTsKICAgICB9CiAKLSAgICBATWVkaXVtVGVzdAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdERlc2NlbmRhbnRzT2ZOb3RJbXBvcnRhbnRWaWV3UmVwb3J0ZWRJbk9yZGVyMygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBVaUF1dG9tYXRpb24gdWlBdXRvbWF0aW9uID0gZ2V0VWlBdXRvbWF0aW9uKGZhbHNlKTsKICAgICAgICAgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIHJvb3RMaW5lYXJMYXlvdXQgPQotICAgICAgICAgICAgICAgIGdldE5vZGVCeVRleHQodWlBdXRvbWF0aW9uLCBSLnN0cmluZy5yb290TGluZWFyTGF5b3V0KTsKKyAgICAgICAgICAgICAgICBnZXROb2RlQnlUZXh0KFIuc3RyaW5nLnJvb3RMaW5lYXJMYXlvdXQpOwogICAgICAgICBhc3NlcnROb3ROdWxsKHJvb3RMaW5lYXJMYXlvdXQpOwogICAgICAgICBhc3NlcnRTYW1lKDQsIHJvb3RMaW5lYXJMYXlvdXQuZ2V0Q2hpbGRDb3VudCgpKTsKIAogICAgICAgICAvLyBDaGVjayBpZiB0aGUgZmlyc3QgY2hpbGQgaXMgdGhlIHJpZ2h0IG9uZS4KICAgICAgICAgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIGZpcnN0RnJhbWVMYXlvdXQgPQotICAgICAgICAgICAgICAgIGdldE5vZGVCeVRleHQodWlBdXRvbWF0aW9uLCBSLnN0cmluZy5maXJzdEZyYW1lTGF5b3V0KTsKKyAgICAgICAgICAgICAgICBnZXROb2RlQnlUZXh0KFIuc3RyaW5nLmZpcnN0RnJhbWVMYXlvdXQpOwogICAgICAgICBhc3NlcnRFcXVhbHMoZmlyc3RGcmFtZUxheW91dCwgcm9vdExpbmVhckxheW91dC5nZXRDaGlsZCgwKSk7CiAKICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHNlY29uZCBjaGlsZCBpcyB0aGUgcmlnaHQgb25lLgotICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gc2Vjb25kVGV4dFZpZXcgPSBnZXROb2RlQnlUZXh0KHVpQXV0b21hdGlvbiwgUi5zdHJpbmcuc2Vjb25kVGV4dFZpZXcpOworICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gc2Vjb25kVGV4dFZpZXcgPSBnZXROb2RlQnlUZXh0KFIuc3RyaW5nLnNlY29uZFRleHRWaWV3KTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKHNlY29uZFRleHRWaWV3LCByb290TGluZWFyTGF5b3V0LmdldENoaWxkKDEpKTsKIAogICAgICAgICAvLyBDaGVjayBpZiB0aGUgdGhpcmQgY2hpbGQgaXMgdGhlIHJpZ2h0IG9uZS4KLSAgICAgICAgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIHNlY29uZEVkaXRUZXh0ID0gZ2V0Tm9kZUJ5VGV4dCh1aUF1dG9tYXRpb24sIFIuc3RyaW5nLnNlY29uZEVkaXRUZXh0KTsKKyAgICAgICAgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIHNlY29uZEVkaXRUZXh0ID0gZ2V0Tm9kZUJ5VGV4dChSLnN0cmluZy5zZWNvbmRFZGl0VGV4dCk7CiAgICAgICAgIGFzc2VydEVxdWFscyhzZWNvbmRFZGl0VGV4dCwgcm9vdExpbmVhckxheW91dC5nZXRDaGlsZCgyKSk7CiAKICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGZvdXJ0aCBjaGlsZCBpcyB0aGUgcmlnaHQgb25lLgotICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gc2Vjb25kQnV0dG9uID0gZ2V0Tm9kZUJ5VGV4dCh1aUF1dG9tYXRpb24sIFIuc3RyaW5nLnNlY29uZEJ1dHRvbik7CisgICAgICAgIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBzZWNvbmRCdXR0b24gPSBnZXROb2RlQnlUZXh0KFIuc3RyaW5nLnNlY29uZEJ1dHRvbik7CiAgICAgICAgIGFzc2VydEVxdWFscyhzZWNvbmRCdXR0b24sIHJvb3RMaW5lYXJMYXlvdXQuZ2V0Q2hpbGQoMykpOwogICAgIH0KIAotICAgIEBNZWRpdW1UZXN0CisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RHJhd2luZ09yZGVySW5JbXBvcnRhbnRQYXJlbnRGb2xsb3dzWG1sT3JkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkucnVuT25NYWluU3luYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBnZXRBY3Rpdml0eSgpLmZpbmRWaWV3QnlJZChSLmlkLmZpcnN0TGluZWFyTGF5b3V0KQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEltcG9ydGFudEZvckFjY2Vzc2liaWxpdHkoVmlldy5JTVBPUlRBTlRfRk9SX0FDQ0VTU0lCSUxJVFlfWUVTKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7CisgICAgICAgIHNJbnN0cnVtZW50YXRpb24ucnVuT25NYWluU3luYygoKSAtPiBtQWN0aXZpdHkuZmluZFZpZXdCeUlkKFIuaWQuZmlyc3RMaW5lYXJMYXlvdXQpCisgICAgICAgICAgICAgICAgLnNldEltcG9ydGFudEZvckFjY2Vzc2liaWxpdHkoVmlldy5JTVBPUlRBTlRfRk9SX0FDQ0VTU0lCSUxJVFlfWUVTKSk7CiAKLSAgICAgICAgVWlBdXRvbWF0aW9uIHVpQXV0b21hdGlvbiA9IGdldFVpQXV0b21hdGlvbihmYWxzZSk7Ci0gICAgICAgIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBmaXJzdFRleHRWaWV3ID0gZ2V0Tm9kZUJ5VGV4dCh1aUF1dG9tYXRpb24sIFIuc3RyaW5nLmZpcnN0VGV4dFZpZXcpOwotICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gZmlyc3RFZGl0VGV4dCA9IGdldE5vZGVCeVRleHQodWlBdXRvbWF0aW9uLCBSLnN0cmluZy5maXJzdEVkaXRUZXh0KTsKLSAgICAgICAgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIGZpcnN0QnV0dG9uID0gZ2V0Tm9kZUJ5VGV4dCh1aUF1dG9tYXRpb24sIFIuc3RyaW5nLmZpcnN0QnV0dG9uKTsKKyAgICAgICAgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIGZpcnN0VGV4dFZpZXcgPSBnZXROb2RlQnlUZXh0KFIuc3RyaW5nLmZpcnN0VGV4dFZpZXcpOworICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gZmlyc3RFZGl0VGV4dCA9IGdldE5vZGVCeVRleHQoUi5zdHJpbmcuZmlyc3RFZGl0VGV4dCk7CisgICAgICAgIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBmaXJzdEJ1dHRvbiA9IGdldE5vZGVCeVRleHQoUi5zdHJpbmcuZmlyc3RCdXR0b24pOwogCiAgICAgICAgIC8vIERyYXdpbmcgb3JkZXIgaXM6IGZpcnN0VGV4dFZpZXcsIGZpcnN0RWRpdFRleHQsIGZpcnN0QnV0dG9uCiAgICAgICAgIGFzc2VydFRydWUoZmlyc3RUZXh0Vmlldy5nZXREcmF3aW5nT3JkZXIoKSA8IGZpcnN0RWRpdFRleHQuZ2V0RHJhd2luZ09yZGVyKCkpOwpAQCAtMTMzLDIwMiArMTY2LDE2MCBAQAogICAgICAgICBhc3NlcnRUcnVlKGNvcHlPZkZpcnN0RWRpdFRleHQuZ2V0RHJhd2luZ09yZGVyKCkgPCBmaXJzdEJ1dHRvbi5nZXREcmF3aW5nT3JkZXIoKSk7CiAgICAgfQogCi0gICAgQE1lZGl1bVRlc3QKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3REcmF3aW5nT3JkZXJHZXR0aW5nQWxsVmlld3NGb2xsb3dzWG1sT3JkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVWlBdXRvbWF0aW9uIHVpQXV0b21hdGlvbiA9IGdldFVpQXV0b21hdGlvbih0cnVlKTsKLSAgICAgICAgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIGZpcnN0VGV4dFZpZXcgPSBnZXROb2RlQnlUZXh0KHVpQXV0b21hdGlvbiwgUi5zdHJpbmcuZmlyc3RUZXh0Vmlldyk7Ci0gICAgICAgIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBmaXJzdEVkaXRUZXh0ID0gZ2V0Tm9kZUJ5VGV4dCh1aUF1dG9tYXRpb24sIFIuc3RyaW5nLmZpcnN0RWRpdFRleHQpOwotICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gZmlyc3RCdXR0b24gPSBnZXROb2RlQnlUZXh0KHVpQXV0b21hdGlvbiwgUi5zdHJpbmcuZmlyc3RCdXR0b24pOworICAgICAgICBzZXRHZXROb25JbXBvcnRhbnRWaWV3cyh0cnVlKTsKKyAgICAgICAgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIGZpcnN0VGV4dFZpZXcgPSBnZXROb2RlQnlUZXh0KFIuc3RyaW5nLmZpcnN0VGV4dFZpZXcpOworICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gZmlyc3RFZGl0VGV4dCA9IGdldE5vZGVCeVRleHQoUi5zdHJpbmcuZmlyc3RFZGl0VGV4dCk7CisgICAgICAgIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBmaXJzdEJ1dHRvbiA9IGdldE5vZGVCeVRleHQoUi5zdHJpbmcuZmlyc3RCdXR0b24pOwogCiAgICAgICAgIC8vIERyYXdpbmcgb3JkZXIgaXM6IGZpcnN0VGV4dFZpZXcsIGZpcnN0RWRpdFRleHQsIGZpcnN0QnV0dG9uCiAgICAgICAgIGFzc2VydFRydWUoZmlyc3RUZXh0Vmlldy5nZXREcmF3aW5nT3JkZXIoKSA8IGZpcnN0RWRpdFRleHQuZ2V0RHJhd2luZ09yZGVyKCkpOwogICAgICAgICBhc3NlcnRUcnVlKGZpcnN0RWRpdFRleHQuZ2V0RHJhd2luZ09yZGVyKCkgPCBmaXJzdEJ1dHRvbi5nZXREcmF3aW5nT3JkZXIoKSk7CiAgICAgfQogCi0gICAgQE1lZGl1bVRlc3QKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3REcmF3aW5nT3JkZXJXaXRoWkNvb3Jkc0RyYXdzSGlnaGVzdFpMYXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpLnJ1bk9uTWFpblN5bmMobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgQWNjZXNzaWJpbGl0eVZpZXdUcmVlUmVwb3J0aW5nQWN0aXZpdHkgYWN0aXZpdHkgPSBnZXRBY3Rpdml0eSgpOwotICAgICAgICAgICAgICAgYWN0aXZpdHkuZmluZFZpZXdCeUlkKFIuaWQuZmlyc3RUZXh0Vmlldykuc2V0Wig1MCk7Ci0gICAgICAgICAgICAgICBhY3Rpdml0eS5maW5kVmlld0J5SWQoUi5pZC5maXJzdEVkaXRUZXh0KS5zZXRaKDEwMCk7Ci0gICAgICAgICAgIH0KKyAgICAgICAgc2V0R2V0Tm9uSW1wb3J0YW50Vmlld3ModHJ1ZSk7CisgICAgICAgIHNJbnN0cnVtZW50YXRpb24ucnVuT25NYWluU3luYygoKSAtPiB7CisgICAgICAgICAgICBtQWN0aXZpdHkuZmluZFZpZXdCeUlkKFIuaWQuZmlyc3RUZXh0Vmlldykuc2V0Wig1MCk7CisgICAgICAgICAgICBtQWN0aXZpdHkuZmluZFZpZXdCeUlkKFIuaWQuZmlyc3RFZGl0VGV4dCkuc2V0WigxMDApOwogICAgICAgICB9KTsKIAotICAgICAgICBVaUF1dG9tYXRpb24gdWlBdXRvbWF0aW9uID0gZ2V0VWlBdXRvbWF0aW9uKHRydWUpOwotICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gZmlyc3RUZXh0VmlldyA9IGdldE5vZGVCeVRleHQodWlBdXRvbWF0aW9uLCBSLnN0cmluZy5maXJzdFRleHRWaWV3KTsKLSAgICAgICAgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIGZpcnN0RWRpdFRleHQgPSBnZXROb2RlQnlUZXh0KHVpQXV0b21hdGlvbiwgUi5zdHJpbmcuZmlyc3RFZGl0VGV4dCk7Ci0gICAgICAgIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBmaXJzdEJ1dHRvbiA9IGdldE5vZGVCeVRleHQodWlBdXRvbWF0aW9uLCBSLnN0cmluZy5maXJzdEJ1dHRvbik7CisgICAgICAgIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBmaXJzdFRleHRWaWV3ID0gZ2V0Tm9kZUJ5VGV4dChSLnN0cmluZy5maXJzdFRleHRWaWV3KTsKKyAgICAgICAgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIGZpcnN0RWRpdFRleHQgPSBnZXROb2RlQnlUZXh0KFIuc3RyaW5nLmZpcnN0RWRpdFRleHQpOworICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gZmlyc3RCdXR0b24gPSBnZXROb2RlQnlUZXh0KFIuc3RyaW5nLmZpcnN0QnV0dG9uKTsKIAogICAgICAgICAvLyBEcmF3aW5nIG9yZGVyIGlzIGZpcnN0QnV0dG9uIChubyB6KSwgZmlyc3RUZXh0VmlldyAoej01MCksIGZpcnN0RWRpdFRleHQgKHo9MTAwKQogICAgICAgICBhc3NlcnRUcnVlKGZpcnN0QnV0dG9uLmdldERyYXdpbmdPcmRlcigpIDwgZmlyc3RUZXh0Vmlldy5nZXREcmF3aW5nT3JkZXIoKSk7CiAgICAgICAgIGFzc2VydFRydWUoZmlyc3RUZXh0Vmlldy5nZXREcmF3aW5nT3JkZXIoKSA8IGZpcnN0RWRpdFRleHQuZ2V0RHJhd2luZ09yZGVyKCkpOwogICAgIH0KIAotICAgIEBNZWRpdW1UZXN0CisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RHJhd2luZ09yZGVyV2l0aEN1c3RvbURyYXdpbmdPcmRlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS5ydW5Pbk1haW5TeW5jKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIC8vIFJlb3JnYW5pemUgdGhlIGhpZWFyY2h5IHRvIHJlcGxhY2UgZmlyc3RMaW5lYXJMYXlvdXQgd2l0aCBvbmUgdGhhdCBhbGxvd3MgdXMgdG8KLSAgICAgICAgICAgICAgICAvLyBjb250cm9sIHRoZSBkcmF3IG9yZGVyCi0gICAgICAgICAgICAgICAgQWNjZXNzaWJpbGl0eVZpZXdUcmVlUmVwb3J0aW5nQWN0aXZpdHkgYWN0aXZpdHkgPSBnZXRBY3Rpdml0eSgpOwotICAgICAgICAgICAgICAgIExpbmVhckxheW91dCByb290TGluZWFyTGF5b3V0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChMaW5lYXJMYXlvdXQpIGFjdGl2aXR5LmZpbmRWaWV3QnlJZChSLmlkLnJvb3RMaW5lYXJMYXlvdXQpOwotICAgICAgICAgICAgICAgIExpbmVhckxheW91dCBmaXJzdExpbmVhckxheW91dCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTGluZWFyTGF5b3V0KSBhY3Rpdml0eS5maW5kVmlld0J5SWQoUi5pZC5maXJzdExpbmVhckxheW91dCk7Ci0gICAgICAgICAgICAgICAgVmlldyBmaXJzdFRleHRWaWV3ID0gYWN0aXZpdHkuZmluZFZpZXdCeUlkKFIuaWQuZmlyc3RUZXh0Vmlldyk7Ci0gICAgICAgICAgICAgICAgVmlldyBmaXJzdEVkaXRUZXh0ID0gYWN0aXZpdHkuZmluZFZpZXdCeUlkKFIuaWQuZmlyc3RFZGl0VGV4dCk7Ci0gICAgICAgICAgICAgICAgVmlldyBmaXJzdEJ1dHRvbiA9IGFjdGl2aXR5LmZpbmRWaWV3QnlJZChSLmlkLmZpcnN0QnV0dG9uKTsKLSAgICAgICAgICAgICAgICBmaXJzdExpbmVhckxheW91dC5yZW1vdmVBbGxWaWV3cygpOwotICAgICAgICAgICAgICAgIExpbmVhckxheW91dFdpdGhEcmF3aW5nT3JkZXIgbGF5b3V0V2l0aERyYXdpbmdPcmRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgTGluZWFyTGF5b3V0V2l0aERyYXdpbmdPcmRlcihhY3Rpdml0eSk7Ci0gICAgICAgICAgICAgICAgcm9vdExpbmVhckxheW91dC5hZGRWaWV3KGxheW91dFdpdGhEcmF3aW5nT3JkZXIpOwotICAgICAgICAgICAgICAgIGxheW91dFdpdGhEcmF3aW5nT3JkZXIuYWRkVmlldyhmaXJzdFRleHRWaWV3KTsKLSAgICAgICAgICAgICAgICBsYXlvdXRXaXRoRHJhd2luZ09yZGVyLmFkZFZpZXcoZmlyc3RFZGl0VGV4dCk7Ci0gICAgICAgICAgICAgICAgbGF5b3V0V2l0aERyYXdpbmdPcmRlci5hZGRWaWV3KGZpcnN0QnV0dG9uKTsKLSAgICAgICAgICAgICAgICBsYXlvdXRXaXRoRHJhd2luZ09yZGVyLmNoaWxkRHJhd2luZ09yZGVyID0gbmV3IGludFtdIHsyLCAwLCAxfTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgc2V0R2V0Tm9uSW1wb3J0YW50Vmlld3ModHJ1ZSk7CisgICAgICAgIHNJbnN0cnVtZW50YXRpb24ucnVuT25NYWluU3luYygoKSAtPiB7CisgICAgICAgICAgICAvLyBSZW9yZ2FuaXplIHRoZSBoaWVhcmNoeSB0byByZXBsYWNlIGZpcnN0TGluZWFyTGF5b3V0IHdpdGggb25lIHRoYXQgYWxsb3dzIHVzIHRvCisgICAgICAgICAgICAvLyBjb250cm9sIHRoZSBkcmF3IG9yZGVyCisgICAgICAgICAgICBMaW5lYXJMYXlvdXQgcm9vdExpbmVhckxheW91dCA9CisgICAgICAgICAgICAgICAgICAgIChMaW5lYXJMYXlvdXQpIG1BY3Rpdml0eS5maW5kVmlld0J5SWQoUi5pZC5yb290TGluZWFyTGF5b3V0KTsKKyAgICAgICAgICAgIExpbmVhckxheW91dCBmaXJzdExpbmVhckxheW91dCA9CisgICAgICAgICAgICAgICAgICAgIChMaW5lYXJMYXlvdXQpIG1BY3Rpdml0eS5maW5kVmlld0J5SWQoUi5pZC5maXJzdExpbmVhckxheW91dCk7CisgICAgICAgICAgICBWaWV3IGZpcnN0VGV4dFZpZXcgPSBtQWN0aXZpdHkuZmluZFZpZXdCeUlkKFIuaWQuZmlyc3RUZXh0Vmlldyk7CisgICAgICAgICAgICBWaWV3IGZpcnN0RWRpdFRleHQgPSBtQWN0aXZpdHkuZmluZFZpZXdCeUlkKFIuaWQuZmlyc3RFZGl0VGV4dCk7CisgICAgICAgICAgICBWaWV3IGZpcnN0QnV0dG9uID0gbUFjdGl2aXR5LmZpbmRWaWV3QnlJZChSLmlkLmZpcnN0QnV0dG9uKTsKKyAgICAgICAgICAgIGZpcnN0TGluZWFyTGF5b3V0LnJlbW92ZUFsbFZpZXdzKCk7CisgICAgICAgICAgICBMaW5lYXJMYXlvdXRXaXRoRHJhd2luZ09yZGVyIGxheW91dFdpdGhEcmF3aW5nT3JkZXIgPQorICAgICAgICAgICAgICAgICAgICBuZXcgTGluZWFyTGF5b3V0V2l0aERyYXdpbmdPcmRlcihtQWN0aXZpdHkpOworICAgICAgICAgICAgcm9vdExpbmVhckxheW91dC5hZGRWaWV3KGxheW91dFdpdGhEcmF3aW5nT3JkZXIpOworICAgICAgICAgICAgbGF5b3V0V2l0aERyYXdpbmdPcmRlci5hZGRWaWV3KGZpcnN0VGV4dFZpZXcpOworICAgICAgICAgICAgbGF5b3V0V2l0aERyYXdpbmdPcmRlci5hZGRWaWV3KGZpcnN0RWRpdFRleHQpOworICAgICAgICAgICAgbGF5b3V0V2l0aERyYXdpbmdPcmRlci5hZGRWaWV3KGZpcnN0QnV0dG9uKTsKKyAgICAgICAgICAgIGxheW91dFdpdGhEcmF3aW5nT3JkZXIuY2hpbGREcmF3aW5nT3JkZXIgPSBuZXcgaW50W10gezIsIDAsIDF9OwogICAgICAgICB9KTsKIAotICAgICAgICBVaUF1dG9tYXRpb24gdWlBdXRvbWF0aW9uID0gZ2V0VWlBdXRvbWF0aW9uKHRydWUpOwotICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gZmlyc3RUZXh0VmlldyA9IGdldE5vZGVCeVRleHQodWlBdXRvbWF0aW9uLCBSLnN0cmluZy5maXJzdFRleHRWaWV3KTsKLSAgICAgICAgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIGZpcnN0RWRpdFRleHQgPSBnZXROb2RlQnlUZXh0KHVpQXV0b21hdGlvbiwgUi5zdHJpbmcuZmlyc3RFZGl0VGV4dCk7Ci0gICAgICAgIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBmaXJzdEJ1dHRvbiA9IGdldE5vZGVCeVRleHQodWlBdXRvbWF0aW9uLCBSLnN0cmluZy5maXJzdEJ1dHRvbik7CisgICAgICAgIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBmaXJzdFRleHRWaWV3ID0gZ2V0Tm9kZUJ5VGV4dChSLnN0cmluZy5maXJzdFRleHRWaWV3KTsKKyAgICAgICAgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIGZpcnN0RWRpdFRleHQgPSBnZXROb2RlQnlUZXh0KFIuc3RyaW5nLmZpcnN0RWRpdFRleHQpOworICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gZmlyc3RCdXR0b24gPSBnZXROb2RlQnlUZXh0KFIuc3RyaW5nLmZpcnN0QnV0dG9uKTsKIAogICAgICAgICAvLyBEcmF3aW5nIG9yZGVyIGlzIGZpcnN0RWRpdFRleHQsIGZpcnN0QnV0dG9uLCBmaXJzdFRleHRWaWV3CiAgICAgICAgIGFzc2VydFRydWUoZmlyc3RFZGl0VGV4dC5nZXREcmF3aW5nT3JkZXIoKSA8IGZpcnN0QnV0dG9uLmdldERyYXdpbmdPcmRlcigpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShmaXJzdEJ1dHRvbi5nZXREcmF3aW5nT3JkZXIoKSA8IGZpcnN0VGV4dFZpZXcuZ2V0RHJhd2luZ09yZGVyKCkpOwogICAgIH0KIAotICAgIEBNZWRpdW1UZXN0CisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RHJhd2luZ09yZGVyV2l0aE5vdEltcG9ydGFudFNpYmxpbmdDb25zaWRlcnNJdHNDaGlsZHJlbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS5ydW5Pbk1haW5TeW5jKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIC8vIE1ha2UgdGhlIGZpcnN0IGZyYW1lIGxheW91dCBhIGhpZ2hlciBaIHNvIGl0J3MgZHJhd24gbGFzdAotICAgICAgICAgICAgICAgIGdldEFjdGl2aXR5KCkuZmluZFZpZXdCeUlkKFIuaWQuZmlyc3RGcmFtZUxheW91dCkuc2V0WigxMDApOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgVWlBdXRvbWF0aW9uIHVpQXV0b21hdGlvbiA9IGdldFVpQXV0b21hdGlvbihmYWxzZSk7Ci0gICAgICAgIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBzZWNvbmRUZXh0VmlldyA9IGdldE5vZGVCeVRleHQodWlBdXRvbWF0aW9uLCBSLnN0cmluZy5zZWNvbmRUZXh0Vmlldyk7Ci0gICAgICAgIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBzZWNvbmRFZGl0VGV4dCA9IGdldE5vZGVCeVRleHQodWlBdXRvbWF0aW9uLCBSLnN0cmluZy5zZWNvbmRFZGl0VGV4dCk7Ci0gICAgICAgIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBzZWNvbmRCdXR0b24gPSBnZXROb2RlQnlUZXh0KHVpQXV0b21hdGlvbiwgUi5zdHJpbmcuc2Vjb25kQnV0dG9uKTsKLSAgICAgICAgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIGZpcnN0RnJhbWVMYXlvdXQgPQotICAgICAgICAgICAgICAgIGdldE5vZGVCeVRleHQodWlBdXRvbWF0aW9uLCBSLnN0cmluZy5maXJzdEZyYW1lTGF5b3V0KTsKKyAgICAgICAgLy8gTWFrZSB0aGUgZmlyc3QgZnJhbWUgbGF5b3V0IGEgaGlnaGVyIFogc28gaXQncyBkcmF3biBsYXN0CisgICAgICAgIHNJbnN0cnVtZW50YXRpb24ucnVuT25NYWluU3luYygKKyAgICAgICAgICAgICAgICAoKSAtPiBtQWN0aXZpdHkuZmluZFZpZXdCeUlkKFIuaWQuZmlyc3RGcmFtZUxheW91dCkuc2V0WigxMDApKTsKKyAgICAgICAgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIHNlY29uZFRleHRWaWV3ID0gZ2V0Tm9kZUJ5VGV4dChSLnN0cmluZy5zZWNvbmRUZXh0Vmlldyk7CisgICAgICAgIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBzZWNvbmRFZGl0VGV4dCA9IGdldE5vZGVCeVRleHQoUi5zdHJpbmcuc2Vjb25kRWRpdFRleHQpOworICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gc2Vjb25kQnV0dG9uID0gZ2V0Tm9kZUJ5VGV4dChSLnN0cmluZy5zZWNvbmRCdXR0b24pOworICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gZmlyc3RGcmFtZUxheW91dCA9IGdldE5vZGVCeVRleHQoIFIuc3RyaW5nLmZpcnN0RnJhbWVMYXlvdXQpOwogICAgICAgICBhc3NlcnRUcnVlKHNlY29uZFRleHRWaWV3LmdldERyYXdpbmdPcmRlcigpIDwgZmlyc3RGcmFtZUxheW91dC5nZXREcmF3aW5nT3JkZXIoKSk7CiAgICAgICAgIGFzc2VydFRydWUoc2Vjb25kRWRpdFRleHQuZ2V0RHJhd2luZ09yZGVyKCkgPCBmaXJzdEZyYW1lTGF5b3V0LmdldERyYXdpbmdPcmRlcigpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShzZWNvbmRCdXR0b24uZ2V0RHJhd2luZ09yZGVyKCkgPCBmaXJzdEZyYW1lTGF5b3V0LmdldERyYXdpbmdPcmRlcigpKTsKICAgICB9CiAKLSAgICBATWVkaXVtVGVzdAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdERyYXdpbmdPcmRlcldpdGhOb3RJbXBvcnRhbnRQYXJlbnRDb25zaWRlcnNQYXJlbnRTaWJsaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFVpQXV0b21hdGlvbiB1aUF1dG9tYXRpb24gPSBnZXRVaUF1dG9tYXRpb24oZmFsc2UpOwotICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gZmlyc3RGcmFtZUxheW91dCA9Ci0gICAgICAgICAgICAgICAgZ2V0Tm9kZUJ5VGV4dCh1aUF1dG9tYXRpb24sIFIuc3RyaW5nLmZpcnN0RnJhbWVMYXlvdXQpOwotICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gc2Vjb25kVGV4dFZpZXcgPSBnZXROb2RlQnlUZXh0KHVpQXV0b21hdGlvbiwgUi5zdHJpbmcuc2Vjb25kVGV4dFZpZXcpOwotICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gc2Vjb25kRWRpdFRleHQgPSBnZXROb2RlQnlUZXh0KHVpQXV0b21hdGlvbiwgUi5zdHJpbmcuc2Vjb25kRWRpdFRleHQpOwotICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gc2Vjb25kQnV0dG9uID0gZ2V0Tm9kZUJ5VGV4dCh1aUF1dG9tYXRpb24sIFIuc3RyaW5nLnNlY29uZEJ1dHRvbik7CisgICAgICAgIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBmaXJzdEZyYW1lTGF5b3V0ID0gZ2V0Tm9kZUJ5VGV4dChSLnN0cmluZy5maXJzdEZyYW1lTGF5b3V0KTsKKyAgICAgICAgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIHNlY29uZFRleHRWaWV3ID0gZ2V0Tm9kZUJ5VGV4dChSLnN0cmluZy5zZWNvbmRUZXh0Vmlldyk7CisgICAgICAgIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBzZWNvbmRFZGl0VGV4dCA9IGdldE5vZGVCeVRleHQoUi5zdHJpbmcuc2Vjb25kRWRpdFRleHQpOworICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gc2Vjb25kQnV0dG9uID0gZ2V0Tm9kZUJ5VGV4dChSLnN0cmluZy5zZWNvbmRCdXR0b24pOwogCiAgICAgICAgIGFzc2VydFRydWUoc2Vjb25kVGV4dFZpZXcuZ2V0RHJhd2luZ09yZGVyKCkgPiBmaXJzdEZyYW1lTGF5b3V0LmdldERyYXdpbmdPcmRlcigpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShzZWNvbmRFZGl0VGV4dC5nZXREcmF3aW5nT3JkZXIoKSA+IGZpcnN0RnJhbWVMYXlvdXQuZ2V0RHJhd2luZ09yZGVyKCkpOwogICAgICAgICBhc3NlcnRUcnVlKHNlY29uZEJ1dHRvbi5nZXREcmF3aW5nT3JkZXIoKSA+IGZpcnN0RnJhbWVMYXlvdXQuZ2V0RHJhd2luZ09yZGVyKCkpOwogICAgIH0KIAotICAgIEBNZWRpdW1UZXN0CisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RHJhd2luZ09yZGVyUm9vdE5vZGVIYXNJbmRleDAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGdldFVpQXV0b21hdGlvbihmYWxzZSkuZ2V0Um9vdEluQWN0aXZlV2luZG93KCkuZ2V0RHJhd2luZ09yZGVyKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc1VpQXV0b21hdGlvbi5nZXRSb290SW5BY3RpdmVXaW5kb3coKS5nZXREcmF3aW5nT3JkZXIoKSk7CiAgICAgfQogCi0gICAgQE1lZGl1bVRlc3QKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NpYmlsaXR5SW1wb3J0YW5jZVJlcG9ydGluZ0ZvckltcG9ydGFudFZpZXcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkucnVuT25NYWluU3luYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAvLyBNYW51YWxseSBjb250cm9sIGltcG9ydGFuY2UgZm9yIGZpcnN0QnV0dG9uCi0gICAgICAgICAgICAgICAgQWNjZXNzaWJpbGl0eVZpZXdUcmVlUmVwb3J0aW5nQWN0aXZpdHkgYWN0aXZpdHkgPSBnZXRBY3Rpdml0eSgpOwotICAgICAgICAgICAgICAgIFZpZXcgZmlyc3RCdXR0b24gPSBhY3Rpdml0eS5maW5kVmlld0J5SWQoUi5pZC5maXJzdEJ1dHRvbik7Ci0gICAgICAgICAgICAgICAgZmlyc3RCdXR0b24uc2V0SW1wb3J0YW50Rm9yQWNjZXNzaWJpbGl0eShWaWV3LklNUE9SVEFOVF9GT1JfQUNDRVNTSUJJTElUWV9ZRVMpOwotICAgICAgICAgICAgfQorICAgICAgICBzZXRHZXROb25JbXBvcnRhbnRWaWV3cyh0cnVlKTsKKyAgICAgICAgc0luc3RydW1lbnRhdGlvbi5ydW5Pbk1haW5TeW5jKCgpIC0+IHsKKyAgICAgICAgICAgIC8vIE1hbnVhbGx5IGNvbnRyb2wgaW1wb3J0YW5jZSBmb3IgZmlyc3RCdXR0b24KKyAgICAgICAgICAgIFZpZXcgZmlyc3RCdXR0b24gPSBtQWN0aXZpdHkuZmluZFZpZXdCeUlkKFIuaWQuZmlyc3RCdXR0b24pOworICAgICAgICAgICAgZmlyc3RCdXR0b24uc2V0SW1wb3J0YW50Rm9yQWNjZXNzaWJpbGl0eShWaWV3LklNUE9SVEFOVF9GT1JfQUNDRVNTSUJJTElUWV9ZRVMpOwogICAgICAgICB9KTsKIAotICAgICAgICBVaUF1dG9tYXRpb24gdWlBdXRvbWF0aW9uID0gZ2V0VWlBdXRvbWF0aW9uKHRydWUpOwotICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gZmlyc3RCdXR0b25Ob2RlID0gZ2V0Tm9kZUJ5VGV4dCh1aUF1dG9tYXRpb24sIFIuc3RyaW5nLmZpcnN0QnV0dG9uKTsKKyAgICAgICAgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIGZpcnN0QnV0dG9uTm9kZSA9IGdldE5vZGVCeVRleHQoUi5zdHJpbmcuZmlyc3RCdXR0b24pOwogICAgICAgICBhc3NlcnRUcnVlKGZpcnN0QnV0dG9uTm9kZS5pc0ltcG9ydGFudEZvckFjY2Vzc2liaWxpdHkoKSk7CiAgICAgfQogCi0gICAgQE1lZGl1bVRlc3QKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NpYmlsaXR5SW1wb3J0YW5jZVJlcG9ydGluZ0ZvclVuaW1wb3J0YW50VmlldygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS5ydW5Pbk1haW5TeW5jKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIC8vIE1hbnVhbGx5IGNvbnRyb2wgaW1wb3J0YW5jZSBmb3IgZmlyc3RCdXR0b24KLSAgICAgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5Vmlld1RyZWVSZXBvcnRpbmdBY3Rpdml0eSBhY3Rpdml0eSA9IGdldEFjdGl2aXR5KCk7Ci0gICAgICAgICAgICAgICAgVmlldyBmaXJzdEJ1dHRvbiA9IGFjdGl2aXR5LmZpbmRWaWV3QnlJZChSLmlkLmZpcnN0QnV0dG9uKTsKLSAgICAgICAgICAgICAgICBmaXJzdEJ1dHRvbi5zZXRJbXBvcnRhbnRGb3JBY2Nlc3NpYmlsaXR5KFZpZXcuSU1QT1JUQU5UX0ZPUl9BQ0NFU1NJQklMSVRZX05PKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgc2V0R2V0Tm9uSW1wb3J0YW50Vmlld3ModHJ1ZSk7CisgICAgICAgIHNJbnN0cnVtZW50YXRpb24ucnVuT25NYWluU3luYygoKSAtPiB7CisgICAgICAgICAgICBWaWV3IGZpcnN0QnV0dG9uID0gbUFjdGl2aXR5LmZpbmRWaWV3QnlJZChSLmlkLmZpcnN0QnV0dG9uKTsKKyAgICAgICAgICAgIGZpcnN0QnV0dG9uLnNldEltcG9ydGFudEZvckFjY2Vzc2liaWxpdHkoVmlldy5JTVBPUlRBTlRfRk9SX0FDQ0VTU0lCSUxJVFlfTk8pOwogICAgICAgICB9KTsKIAotICAgICAgICBVaUF1dG9tYXRpb24gdWlBdXRvbWF0aW9uID0gZ2V0VWlBdXRvbWF0aW9uKHRydWUpOwotICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gZmlyc3RCdXR0b25Ob2RlID0gZ2V0Tm9kZUJ5VGV4dCh1aUF1dG9tYXRpb24sIFIuc3RyaW5nLmZpcnN0QnV0dG9uKTsKKyAgICAgICAgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIGZpcnN0QnV0dG9uTm9kZSA9IGdldE5vZGVCeVRleHQoUi5zdHJpbmcuZmlyc3RCdXR0b24pOwogICAgICAgICBhc3NlcnRGYWxzZShmaXJzdEJ1dHRvbk5vZGUuaXNJbXBvcnRhbnRGb3JBY2Nlc3NpYmlsaXR5KCkpOwogICAgIH0KIAotICAgIEBNZWRpdW1UZXN0CisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkVmlld1RvTGF5b3V0X3JlY2VpdmVTdWJ0cmVlRXZlbnQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgZmluYWwgTGluZWFyTGF5b3V0IGxheW91dCA9Ci0gICAgICAgICAgICAgICAgKExpbmVhckxheW91dCkgZ2V0QWN0aXZpdHkoKS5maW5kVmlld0J5SWQoUi5pZC5zZWNvbmRMaW5lYXJMYXlvdXQpOwotICAgICAgICBmaW5hbCBCdXR0b24gbmV3QnV0dG9uID0gbmV3IEJ1dHRvbihnZXRBY3Rpdml0eSgpKTsKKyAgICAgICAgICAgICAgICAoTGluZWFyTGF5b3V0KSBtQWN0aXZpdHkuZmluZFZpZXdCeUlkKFIuaWQuc2Vjb25kTGluZWFyTGF5b3V0KTsKKyAgICAgICAgZmluYWwgQnV0dG9uIG5ld0J1dHRvbiA9IG5ldyBCdXR0b24obUFjdGl2aXR5KTsKICAgICAgICAgbmV3QnV0dG9uLnNldFRleHQoIk5ldyBCdXR0b24iKTsKICAgICAgICAgbmV3QnV0dG9uLnNldFdpZHRoKFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKTsKICAgICAgICAgbmV3QnV0dG9uLnNldEhlaWdodChWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCk7CiAgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBhd2FpdGVkRXZlbnQgPQotICAgICAgICAgICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpLmdldFVpQXV0b21hdGlvbigpLmV4ZWN1dGVBbmRXYWl0Rm9yRXZlbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIHRoZSBldmVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRBY3Rpdml0eSgpLnJ1bk9uVWlUaHJlYWQobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0LmFkZFZpZXcobmV3QnV0dG9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfX0sCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVWlBdXRvbWF0aW9uLkFjY2Vzc2liaWxpdHlFdmVudEZpbHRlcigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGUgcmVjZWl2ZWQgZXZlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoQWNjZXNzaWJpbGl0eUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNDb250ZW50Q2hhbmdlZCA9IGV2ZW50LmdldEV2ZW50VHlwZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gQWNjZXNzaWJpbGl0eUV2ZW50LlRZUEVfV0lORE9XX0NPTlRFTlRfQ0hBTkdFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzU3ViVHJlZSA9IChldmVudC5nZXRDb250ZW50Q2hhbmdlVHlwZXMoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgQWNjZXNzaWJpbGl0eUV2ZW50LkNPTlRFTlRfQ0hBTkdFX1RZUEVfU1VCVFJFRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNGcm9tVGhpc1BhY2thZ2UgPSBUZXh0VXRpbHMuZXF1YWxzKGV2ZW50LmdldFBhY2thZ2VOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QWN0aXZpdHkoKS5nZXRQYWNrYWdlTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzQ29udGVudENoYW5nZWQgJiYgKGlzU3ViVHJlZSAhPSAwKSAmJiBpc0Zyb21UaGlzUGFja2FnZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICAgICAgVElNRU9VVF9BU1lOQ19QUk9DRVNTSU5HKTsKKyAgICAgICAgICAgICAgICBzVWlBdXRvbWF0aW9uLmV4ZWN1dGVBbmRXYWl0Rm9yRXZlbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAoKSAtPiBtQWN0aXZpdHkucnVuT25VaVRocmVhZCgoKSAtPiBsYXlvdXQuYWRkVmlldyhuZXdCdXR0b24pKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChldmVudCkgLT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNDb250ZW50Q2hhbmdlZCA9IGV2ZW50LmdldEV2ZW50VHlwZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBBY2Nlc3NpYmlsaXR5RXZlbnQuVFlQRV9XSU5ET1dfQ09OVEVOVF9DSEFOR0VEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpc1N1YlRyZWUgPSAoZXZlbnQuZ2V0Q29udGVudENoYW5nZVR5cGVzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgQWNjZXNzaWJpbGl0eUV2ZW50LkNPTlRFTlRfQ0hBTkdFX1RZUEVfU1VCVFJFRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0Zyb21UaGlzUGFja2FnZSA9IFRleHRVdGlscy5lcXVhbHMoZXZlbnQuZ2V0UGFja2FnZU5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BY3Rpdml0eS5nZXRQYWNrYWdlTmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNDb250ZW50Q2hhbmdlZCAmJiAoaXNTdWJUcmVlICE9IDApICYmIGlzRnJvbVRoaXNQYWNrYWdlOworICAgICAgICAgICAgICAgICAgICAgICAgfSwgVElNRU9VVF9BU1lOQ19QUk9DRVNTSU5HKTsKICAgICAgICAgLy8gVGhlIGV2ZW50IHNob3VsZCBjb21lIGZyb20gYSB2aWV3IHRoYXQncyBpbXBvcnRhbnQgZm9yIGFjY2Vzc2liaWxpdHksIGV2ZW4gdGhvdWdoIHRoZQogICAgICAgICAvLyBsYXlvdXQgd2UgYWRkZWQgaXQgdG8gaXNuJ3QgaW1wb3J0YW50LiBPdGhlcndpc2Ugc2VydmljZXMgbWF5IG5vdCBmaW5kIG91dCBhYm91dCB0aGUKICAgICAgICAgLy8gbmV3IGJ1dHRvbi4KICAgICAgICAgYXNzZXJ0VHJ1ZShhd2FpdGVkRXZlbnQuZ2V0U291cmNlKCkuaXNJbXBvcnRhbnRGb3JBY2Nlc3NpYmlsaXR5KCkpOwogICAgIH0KIAotICAgIHByaXZhdGUgVWlBdXRvbWF0aW9uIGdldFVpQXV0b21hdGlvbihib29sZWFuIGdldE5vbkltcG9ydGFudFZpZXdzKSB7Ci0gICAgICAgIFVpQXV0b21hdGlvbiB1aUF1dG9tYXRpb24gPSBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRVaUF1dG9tYXRpb24oKTsKLSAgICAgICAgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvIHNlcnZpY2VJbmZvID0gdWlBdXRvbWF0aW9uLmdldFNlcnZpY2VJbmZvKCk7CisgICAgcHJpdmF0ZSB2b2lkIHNldEdldE5vbkltcG9ydGFudFZpZXdzKGJvb2xlYW4gZ2V0Tm9uSW1wb3J0YW50Vmlld3MpIHsKKyAgICAgICAgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvIHNlcnZpY2VJbmZvID0gc1VpQXV0b21hdGlvbi5nZXRTZXJ2aWNlSW5mbygpOwogICAgICAgICBzZXJ2aWNlSW5mby5mbGFncyAmPSB+QWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvLkZMQUdfSU5DTFVERV9OT1RfSU1QT1JUQU5UX1ZJRVdTOwogICAgICAgICBzZXJ2aWNlSW5mby5mbGFncyB8PSBnZXROb25JbXBvcnRhbnRWaWV3cyA/CiAgICAgICAgICAgICAgICAgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvLkZMQUdfSU5DTFVERV9OT1RfSU1QT1JUQU5UX1ZJRVdTIDogMDsKLSAgICAgICAgdWlBdXRvbWF0aW9uLnNldFNlcnZpY2VJbmZvKHNlcnZpY2VJbmZvKTsKLSAgICAgICAgcmV0dXJuIHVpQXV0b21hdGlvbjsKKyAgICAgICAgc1VpQXV0b21hdGlvbi5zZXRTZXJ2aWNlSW5mbyhzZXJ2aWNlSW5mbyk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gZ2V0Tm9kZUJ5VGV4dChVaUF1dG9tYXRpb24gdWlBdXRvbWF0aW9uLCBpbnQgc3RyaW5nSWQpIHsKLSAgICAgICAgcmV0dXJuIHVpQXV0b21hdGlvbi5nZXRSb290SW5BY3RpdmVXaW5kb3coKQotICAgICAgICAgICAgICAgIC5maW5kQWNjZXNzaWJpbGl0eU5vZGVJbmZvc0J5VGV4dChnZXRTdHJpbmcoc3RyaW5nSWQpKS5nZXQoMCk7CisgICAgcHJpdmF0ZSBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gZ2V0Tm9kZUJ5VGV4dChpbnQgc3RyaW5nSWQpIHsKKyAgICAgICAgcmV0dXJuIHNVaUF1dG9tYXRpb24uZ2V0Um9vdEluQWN0aXZlV2luZG93KCkuZmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb3NCeVRleHQoCisgICAgICAgICAgICAgICAgc0luc3RydW1lbnRhdGlvbi5nZXRDb250ZXh0KCkuZ2V0U3RyaW5nKHN0cmluZ0lkKSkuZ2V0KDApOwogICAgIH0KIAogICAgIGNsYXNzIExpbmVhckxheW91dFdpdGhEcmF3aW5nT3JkZXIgZXh0ZW5kcyBMaW5lYXJMYXlvdXQgewpkaWZmIC0tZ2l0IGEvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2Uvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvY3RzL0FjY2Vzc2liaWxpdHlWb2x1bWVUZXN0LmphdmEgYi90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9jdHMvQWNjZXNzaWJpbGl0eVZvbHVtZVRlc3QuamF2YQppbmRleCAzYjAzNzRmLi4zYjJlOTc4IDEwMDY0NAotLS0gYS90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9jdHMvQWNjZXNzaWJpbGl0eVZvbHVtZVRlc3QuamF2YQorKysgYi90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9jdHMvQWNjZXNzaWJpbGl0eVZvbHVtZVRlc3QuamF2YQpAQCAtMTMsMTggKzEzLDIzIEBACiAgKi8KIHBhY2thZ2UgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHM7CiAKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LkNvbnRleHQuQVVESU9fU0VSVklDRTsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKwogaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5QcmVzdWJtaXQ7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIAotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dC5BVURJT19TRVJWSUNFOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLQogLyoqCiAgKiBWZXJpZnkgdGhhdCBhY2Nlc3NpYmlsaXR5IHNlcnZpY2VzIGNhbiBjb250cm9sIHRoZSBhY2Nlc3NpYmlsaXR5IHZvbHVtZS4KICAqLwpAQCAtNDgsNiArNTMsNyBAQAogICAgIH0KIAogICAgIEBUZXN0CisgICAgQFByZXN1Ym1pdAogICAgIHB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VBY2Nlc3NpYmlsaXR5Vm9sdW1lX291dHNpZGVWYWxpZEFjY2Vzc2liaWxpdHlTZXJ2aWNlX3Nob3VsZEZhaWwoKSB7CiAgICAgICAgIGlmIChtU2luZ2xlVm9sdW1lKSB7CiAgICAgICAgICAgICByZXR1cm47CkBAIC02MCwyMCArNjYsMjggQEAKICAgICB9CiAKICAgICBAVGVzdAorICAgIEBBcHBNb2RlRnVsbAogICAgIHB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VBY2Nlc3NpYmlsaXR5Vm9sdW1lX2luQWNjZXNzaWJpbGl0eVNlcnZpY2Vfc2hvdWxkV29yaygpIHsKICAgICAgICAgaWYgKG1TaW5nbGVWb2x1bWUpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBpbnQgc3RhcnRpbmdWb2x1bWUgPSBtQXVkaW9NYW5hZ2VyLmdldFN0cmVhbVZvbHVtZShBdWRpb01hbmFnZXIuU1RSRUFNX0FDQ0VTU0lCSUxJVFkpOwotICAgICAgICBpbnQgb3RoZXJWb2x1bWUgPSAoc3RhcnRpbmdWb2x1bWUgPT0gMCkgPyAxIDogc3RhcnRpbmdWb2x1bWUgLSAxOwotICAgICAgICBJbnN0cnVtZW50ZWRBY2Nlc3NpYmlsaXR5U2VydmljZSBzZXJ2aWNlID0gSW5zdHJ1bWVudGVkQWNjZXNzaWJpbGl0eVNlcnZpY2UuZW5hYmxlU2VydmljZSgKLSAgICAgICAgICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLCBJbnN0cnVtZW50ZWRBY2Nlc3NpYmlsaXR5U2VydmljZS5jbGFzcyk7Ci0KLSAgICAgICAgc2VydmljZS5ydW5PblNlcnZpY2VTeW5jKCgpIC0+Ci0gICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRTdHJlYW1Wb2x1bWUoQXVkaW9NYW5hZ2VyLlNUUkVBTV9BQ0NFU1NJQklMSVRZLCBvdGhlclZvbHVtZSwgMCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkFjY2Vzc2liaWxpdHkgc2VydmljZSBzaG91bGQgYmUgYWJsZSB0byBjaGFuZ2UgYWNjZXNzaWJpbGl0eSB2b2x1bWUiLAotICAgICAgICAgICAgICAgIG90aGVyVm9sdW1lLCBtQXVkaW9NYW5hZ2VyLmdldFN0cmVhbVZvbHVtZShBdWRpb01hbmFnZXIuU1RSRUFNX0FDQ0VTU0lCSUxJVFkpKTsKLSAgICAgICAgc2VydmljZS5ydW5PblNlcnZpY2VTeW5jKCgpIC0+IG1BdWRpb01hbmFnZXIuc2V0U3RyZWFtVm9sdW1lKAotICAgICAgICAgICAgICAgIEF1ZGlvTWFuYWdlci5TVFJFQU1fQUNDRVNTSUJJTElUWSwgc3RhcnRpbmdWb2x1bWUsIDApKTsKKyAgICAgICAgZmluYWwgaW50IHN0YXJ0aW5nVm9sdW1lID0gbUF1ZGlvTWFuYWdlci5nZXRTdHJlYW1Wb2x1bWUoQXVkaW9NYW5hZ2VyLlNUUkVBTV9BQ0NFU1NJQklMSVRZKTsKKyAgICAgICAgZmluYWwgaW50IG1pblZvbHVtZSA9IG1BdWRpb01hbmFnZXIuZ2V0U3RyZWFtTWluVm9sdW1lKEF1ZGlvTWFuYWdlci5TVFJFQU1fQUNDRVNTSUJJTElUWSk7CisgICAgICAgIGZpbmFsIGludCBvdGhlclZvbHVtZSA9IChzdGFydGluZ1ZvbHVtZSA9PSBtaW5Wb2x1bWUpID8gKG1pblZvbHVtZSArIDEpIDogc3RhcnRpbmdWb2x1bWUgLSAxOworICAgICAgICBmaW5hbCBJbnN0cnVtZW50ZWRBY2Nlc3NpYmlsaXR5U2VydmljZSBzZXJ2aWNlID0gSW5zdHJ1bWVudGVkQWNjZXNzaWJpbGl0eVNlcnZpY2UKKyAgICAgICAgICAgICAgICAuZW5hYmxlU2VydmljZShtSW5zdHJ1bWVudGF0aW9uLCBJbnN0cnVtZW50ZWRBY2Nlc3NpYmlsaXR5U2VydmljZS5jbGFzcyk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZXJ2aWNlLnJ1bk9uU2VydmljZVN5bmMoKCkgLT4KKyAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRTdHJlYW1Wb2x1bWUoQXVkaW9NYW5hZ2VyLlNUUkVBTV9BQ0NFU1NJQklMSVRZLCBvdGhlclZvbHVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkFjY2Vzc2liaWxpdHkgc2VydmljZSBzaG91bGQgYmUgYWJsZSB0byBjaGFuZ2UgYWNjZXNzaWJpbGl0eSB2b2x1bWUiLAorICAgICAgICAgICAgICAgICAgICBvdGhlclZvbHVtZSwgbUF1ZGlvTWFuYWdlci5nZXRTdHJlYW1Wb2x1bWUoQXVkaW9NYW5hZ2VyLlNUUkVBTV9BQ0NFU1NJQklMSVRZKSk7CisgICAgICAgICAgICBzZXJ2aWNlLnJ1bk9uU2VydmljZVN5bmMoKCkgLT4gbUF1ZGlvTWFuYWdlci5zZXRTdHJlYW1Wb2x1bWUoCisgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWFuYWdlci5TVFJFQU1fQUNDRVNTSUJJTElUWSwgc3RhcnRpbmdWb2x1bWUsIDApKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXJ2aWNlLnJ1bk9uU2VydmljZVN5bmMoKCkgLT4gc2VydmljZS5kaXNhYmxlU2VsZigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy9BY2Nlc3NpYmlsaXR5V2luZG93UXVlcnlBY3Rpdml0eS5qYXZhIGIvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2Uvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvY3RzL0FjY2Vzc2liaWxpdHlXaW5kb3dRdWVyeUFjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNzBhODEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2Uvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvY3RzL0FjY2Vzc2liaWxpdHlXaW5kb3dRdWVyeUFjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0Ci0gKiBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlCi0gKiBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKLSAqIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLmN0czsKLQotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotCi1pbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU5vZGVJbmZvOwotaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlOb2RlSW5mby5BY2Nlc3NpYmlsaXR5QWN0aW9uOwotaW1wb3J0IGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuY3RzLlI7Ci0KLS8qKgotICogQWN0aXZpdHkgZm9yIHRlc3RpbmcgdGhlIGFjY2Vzc2liaWxpdHkgQVBJcyBmb3IgcXVlcnlpbmcgb2YKLSAqIHRoZSBzY3JlZW4gY29udGVudC4gVGhlc2UgQVBJcyBhbGxvdyBleHBsb3JpbmcgdGhlIHNjcmVlbiBhbmQKLSAqIHJlcXVlc3RpbmcgYW4gYWN0aW9uIHRvIGJlIHBlcmZvcm1lZCBvbiBhIGdpdmVuIHZpZXcgZnJvbSBhbgotICogQWNjZXNzaWJpbGl0eVNlcnZpY2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBBY2Nlc3NpYmlsaXR5V2luZG93UXVlcnlBY3Rpdml0eSBleHRlbmRzIEFjY2Vzc2liaWxpdHlUZXN0QWN0aXZpdHkgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwotICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5xdWVyeV93aW5kb3dfdGVzdCk7Ci0KLSAgICAgICAgZmluZFZpZXdCeUlkKFIuaWQuYnV0dG9uNSkuc2V0T25DbGlja0xpc3RlbmVyKG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICAgICAgLyogZG8gbm90aGluZyAqLwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgZmluZFZpZXdCeUlkKFIuaWQuYnV0dG9uNSkuc2V0T25Mb25nQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkxvbmdDbGlja0xpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gb25Mb25nQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGZpbmRWaWV3QnlJZChSLmlkLmJ1dHRvbjUpLnNldEFjY2Vzc2liaWxpdHlEZWxlZ2F0ZShuZXcgVmlldy5BY2Nlc3NpYmlsaXR5RGVsZWdhdGUoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uSW5pdGlhbGl6ZUFjY2Vzc2liaWxpdHlOb2RlSW5mbyhWaWV3IGhvc3QsIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBpbmZvKSB7Ci0gICAgICAgICAgICAgICAgc3VwZXIub25Jbml0aWFsaXplQWNjZXNzaWJpbGl0eU5vZGVJbmZvKGhvc3QsIGluZm8pOwotICAgICAgICAgICAgICAgIGluZm8uYWRkQWN0aW9uKG5ldyBBY2Nlc3NpYmlsaXR5QWN0aW9uKFIuaWQuZm9vX2N1c3RvbV9hY3Rpb24sICJGb28iKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUFjY2Vzc2liaWxpdHlBY3Rpb24oVmlldyBob3N0LCBpbnQgYWN0aW9uLCBCdW5kbGUgYXJncykgewotICAgICAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gUi5pZC5mb29fY3VzdG9tX2FjdGlvbikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnBlcmZvcm1BY2Nlc3NpYmlsaXR5QWN0aW9uKGhvc3QsIGFjdGlvbiwgYXJncyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy9BY2Nlc3NpYmlsaXR5V2luZG93UXVlcnlUZXN0LmphdmEgYi90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9jdHMvQWNjZXNzaWJpbGl0eVdpbmRvd1F1ZXJ5VGVzdC5qYXZhCmluZGV4IDE4YzAyZTUuLmVhOTgwNzggMTAwNzU1Ci0tLSBhL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy9BY2Nlc3NpYmlsaXR5V2luZG93UXVlcnlUZXN0LmphdmEKKysrIGIvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2Uvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvY3RzL0FjY2Vzc2liaWxpdHlXaW5kb3dRdWVyeVRlc3QuamF2YQpAQCAtMTYsNyArMTYsMTcgQEAKIAogcGFja2FnZSBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLmN0czsKIAoraW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLmN0cy51dGlscy5BY2Nlc3NpYmlsaXR5RXZlbnRGaWx0ZXJVdGlscy5maWx0ZXJGb3JFdmVudFR5cGU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuY3RzLnV0aWxzLkFjY2Vzc2liaWxpdHlFdmVudEZpbHRlclV0aWxzLmZpbHRlcldpbmRvd3NDaGFuZ2VkV2l0aENoYW5nZVR5cGVzOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLmN0cy51dGlscy5EaXNwbGF5VXRpbHMuZ2V0U3RhdHVzQmFySGVpZ2h0OwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9QSUNUVVJFX0lOX1BJQ1RVUkU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudC5UWVBFX1ZJRVdfQUNDRVNTSUJJTElUWV9GT0NVU19DTEVBUkVEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQuVFlQRV9WSUVXX0NMSUNLRUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudC5UWVBFX1ZJRVdfRk9DVVNFRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50LlRZUEVfVklFV19MT05HX0NMSUNLRUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudC5UWVBFX1dJTkRPV1NfQ0hBTkdFRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50LldJTkRPV1NfQ0hBTkdFX0FDQ0VTU0lCSUxJVFlfRk9DVVNFRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50LldJTkRPV1NfQ0hBTkdFX0FEREVEOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5Tm9kZUluZm8uQUNUSU9OX0NMRUFSX0ZPQ1VTOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5Tm9kZUluZm8uQUNUSU9OX0NMRUFSX1NFTEVDVElPTjsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU5vZGVJbmZvLkFDVElPTl9DTElDSzsKQEAgLTI0LDI2ICszNCwzMiBAQAogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5Tm9kZUluZm8uQUNUSU9OX0xPTkdfQ0xJQ0s7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlOb2RlSW5mby5BQ1RJT05fU0VMRUNUOwogCitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5sZXNzVGhhbjsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCiBpbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZTsKIGltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbzsKK2ltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLmN0cy5hY3Rpdml0aWVzLkFjY2Vzc2liaWxpdHlXaW5kb3dRdWVyeUFjdGl2aXR5OwogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmFwcC5VaUF1dG9tYXRpb247CitpbXBvcnQgYW5kcm9pZC5hcHAuVWlBdXRvbWF0aW9uLkFjY2Vzc2liaWxpdHlFdmVudEZpbHRlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIGltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTWVkaXVtVGVzdDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OwogaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5Tm9kZUluZm87CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU5vZGVJbmZvLkFjY2Vzc2liaWxpdHlBY3Rpb247CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eVdpbmRvd0luZm87Ci0KIGltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247Ci1pbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHMuUjsKKworaW1wb3J0IG9yZy5oYW1jcmVzdC5EZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcuaGFtY3Jlc3QuVHlwZVNhZmVNYXRjaGVyOwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CkBAIC01MiwzNCArNjgsMzEgQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuUXVldWU7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZW91dEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljUmVmZXJlbmNlOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CiAKIC8qKgogICogVGVzdCBjYXNlcyBmb3IgdGVzdGluZyB0aGUgYWNjZXNzaWJpbGl0eSBBUElzIGZvciBxdWVyeWluZyBvZiB0aGUgc2NyZWVuIGNvbnRlbnQuCiAgKiBUaGVzZSBBUElzIGFsbG93IGV4cGxvcmluZyB0aGUgc2NyZWVuIGFuZCByZXF1ZXN0aW5nIGFuIGFjdGlvbiB0byBiZSBwZXJmb3JtZWQKICAqIG9uIGEgZ2l2ZW4gdmlldyBmcm9tIGFuIEFjY2Vzc2liaWxpdHlTZXJ2aWNlLgogICovCitAQXBwTW9kZUZ1bGwKIHB1YmxpYyBjbGFzcyBBY2Nlc3NpYmlsaXR5V2luZG93UXVlcnlUZXN0CiAgICAgICAgIGV4dGVuZHMgQWNjZXNzaWJpbGl0eUFjdGl2aXR5VGVzdENhc2U8QWNjZXNzaWJpbGl0eVdpbmRvd1F1ZXJ5QWN0aXZpdHk+IHsKICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgQ09OVEVOVF9WSUVXX1JFU19OQU1FID0KICAgICAgICAgICAgICJhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLmN0czppZC9hZGRlZF9jb250ZW50IjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFRJTUVPVVRfV0lORE9XX1NUQVRFX0lETEUgPSA1MDA7Ci0gICAgcHJpdmF0ZSBmaW5hbCBVaUF1dG9tYXRpb24uQWNjZXNzaWJpbGl0eUV2ZW50RmlsdGVyIG1XaW5kb3dzQ2hhbmdlZEZpbHRlciA9Ci0gICAgICAgICAgICBuZXcgVWlBdXRvbWF0aW9uLkFjY2Vzc2liaWxpdHlFdmVudEZpbHRlcigpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoQWNjZXNzaWJpbGl0eUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoZXZlbnQuZ2V0RXZlbnRUeXBlKCkgPT0gQWNjZXNzaWJpbGl0eUV2ZW50LlRZUEVfV0lORE9XU19DSEFOR0VEKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgIHByaXZhdGUgZmluYWwgVWlBdXRvbWF0aW9uLkFjY2Vzc2liaWxpdHlFdmVudEZpbHRlciBtRGl2aWRlclByZXNlbnRGaWx0ZXIgPQotICAgICAgICAgICAgbmV3IFVpQXV0b21hdGlvbi5BY2Nlc3NpYmlsaXR5RXZlbnRGaWx0ZXIoKSB7CisgICAgcHJpdmF0ZSBmaW5hbCBBY2Nlc3NpYmlsaXR5RXZlbnRGaWx0ZXIgbURpdmlkZXJQcmVzZW50RmlsdGVyID0KKyAgICAgICAgICAgIG5ldyBBY2Nlc3NpYmlsaXR5RXZlbnRGaWx0ZXIoKSB7CiAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEFjY2Vzc2liaWxpdHlFdmVudCBldmVudCkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGV2ZW50LmdldEV2ZW50VHlwZSgpID09IEFjY2Vzc2liaWxpdHlFdmVudC5UWVBFX1dJTkRPV1NfQ0hBTkdFRCAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRGl2aWRlcldpbmRvd1ByZXNlbnQoZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VWlBdXRvbWF0aW9uKCkpICAgICk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfTsKLSAgICBwcml2YXRlIGZpbmFsIFVpQXV0b21hdGlvbi5BY2Nlc3NpYmlsaXR5RXZlbnRGaWx0ZXIgbURpdmlkZXJBYnNlbnRGaWx0ZXIgPQotICAgICAgICAgICAgbmV3IFVpQXV0b21hdGlvbi5BY2Nlc3NpYmlsaXR5RXZlbnRGaWx0ZXIoKSB7CisgICAgcHJpdmF0ZSBmaW5hbCBBY2Nlc3NpYmlsaXR5RXZlbnRGaWx0ZXIgbURpdmlkZXJBYnNlbnRGaWx0ZXIgPQorICAgICAgICAgICAgbmV3IEFjY2Vzc2liaWxpdHlFdmVudEZpbHRlcigpIHsKICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoQWNjZXNzaWJpbGl0eUV2ZW50IGV2ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZXZlbnQuZ2V0RXZlbnRUeXBlKCkgPT0gQWNjZXNzaWJpbGl0eUV2ZW50LlRZUEVfV0lORE9XU19DSEFOR0VEICYmCkBAIC05NSwxMyArMTA4LDggQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0RmluZEJ5VGV4dCgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICAvLyBGaXJzdCwgbWFrZSB0aGUgcm9vdCB2aWV3IG9mIHRoZSBhY3Rpdml0eSBhbiBhY2Nlc3NpYmlsaXR5IG5vZGUuIFRoaXMgYWxsb3dzIHVzIHRvCiAgICAgICAgIC8vIGxhdGVyIGV4Y2x1ZGUgdmlld3MgdGhhdCBhcmUgcGFydCBvZiB0aGUgYWN0aXZpdHkncyBEZWNvclZpZXcuCi0gICAgICAgIHJ1blRlc3RPblVpVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIGdldEFjdGl2aXR5KCkuZmluZFZpZXdCeUlkKFIuaWQuYWRkZWRfY29udGVudCkKLSAgICAgICAgICAgICAgICAgICAgLnNldEltcG9ydGFudEZvckFjY2Vzc2liaWxpdHkoVmlldy5JTVBPUlRBTlRfRk9SX0FDQ0VTU0lCSUxJVFlfWUVTKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7CisgICAgICAgIHJ1blRlc3RPblVpVGhyZWFkKCgpIC0+IGdldEFjdGl2aXR5KCkuZmluZFZpZXdCeUlkKFIuaWQuYWRkZWRfY29udGVudCkKKyAgICAgICAgICAgICAgICAgICAgLnNldEltcG9ydGFudEZvckFjY2Vzc2liaWxpdHkoVmlldy5JTVBPUlRBTlRfRk9SX0FDQ0VTU0lCSUxJVFlfWUVTKSk7CiAKICAgICAgICAgLy8gU3RhcnQgbG9va2luZyBmcm9tIHRoZSBhZGRlZCBjb250ZW50IGluc3RlYWQgb2YgZnJvbSB0aGUgcm9vdCBhY2Nlc3NpYmlsaXR5IG5vZGUgc28KICAgICAgICAgLy8gdGhhdCBub2RlcyB0aGF0IHdlIGRvbid0IGV4cGVjdCAoaS5lLiB3aW5kb3cgY29udHJvbCBidXR0b25zKSBhcmUgbm90IGluY2x1ZGVkIGluIHRoZQpAQCAtMTQ2LDMwICsxNTQsMTIgQEAKICAgICAgICAgICAgICAgICAuZmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb3NCeVZpZXdJZCgKICAgICAgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLmN0czppZC9idXR0b24xIikuZ2V0KDApOwogCi0gICAgICAgIC8vIEFyZ2guLi4KLSAgICAgICAgZmluYWwgTGlzdDxBY2Nlc3NpYmlsaXR5RXZlbnQ+IGV2ZW50cyA9IG5ldyBBcnJheUxpc3Q8QWNjZXNzaWJpbGl0eUV2ZW50PigpOwotCi0gICAgICAgIC8vIENsaWNrIHRoZSBidXR0b24uCi0gICAgICAgIHVpQXV0b21hdGlvbi5leGVjdXRlQW5kV2FpdEZvckV2ZW50KG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIGJ1dHRvbjEucGVyZm9ybUFjdGlvbihBY2Nlc3NpYmlsaXR5Tm9kZUluZm8uQUNUSU9OX0NMSUNLKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSwKLSAgICAgICAgbmV3IFVpQXV0b21hdGlvbi5BY2Nlc3NpYmlsaXR5RXZlbnRGaWx0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChBY2Nlc3NpYmlsaXR5RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0RXZlbnRUeXBlKCkgPT0gQWNjZXNzaWJpbGl0eUV2ZW50LlRZUEVfVklFV19DTElDS0VEKSB7Ci0gICAgICAgICAgICAgICAgICAgIGV2ZW50cy5hZGQoZXZlbnQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9LAotICAgICAgICBUSU1FT1VUX0FTWU5DX1BST0NFU1NJTkcpOworICAgICAgICAvLyBDbGljayB0aGUgYnV0dG9uIHRvIGdlbmVyYXRlIGFuIGV2ZW50CisgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBldmVudCA9IHVpQXV0b21hdGlvbi5leGVjdXRlQW5kV2FpdEZvckV2ZW50KAorICAgICAgICAgICAgICAgICgpIC0+IGJ1dHRvbjEucGVyZm9ybUFjdGlvbihBQ1RJT05fQ0xJQ0spLAorICAgICAgICAgICAgICAgIGZpbHRlckZvckV2ZW50VHlwZShUWVBFX1ZJRVdfQ0xJQ0tFRCksIFRJTUVPVVRfQVNZTkNfUFJPQ0VTU0lORyk7CiAKICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBzb3VyY2Ugd2luZG93IGNhbm5vdCBiZSBhY2Nlc3NlZC4KLSAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IGV2ZW50ID0gZXZlbnRzLmdldCgwKTsKICAgICAgICAgYXNzZXJ0TnVsbChldmVudC5nZXRTb3VyY2UoKS5nZXRXaW5kb3coKSk7CiAgICAgfQogCkBAIC0yMTgsMzAgKzIwOCwxMiBAQAogICAgICAgICAgICAgICAgICAgICAuZmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb3NCeVZpZXdJZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHM6aWQvYnV0dG9uMSIpLmdldCgwKTsKIAotICAgICAgICAgICAgLy8gQXJnaC4uLgotICAgICAgICAgICAgZmluYWwgTGlzdDxBY2Nlc3NpYmlsaXR5RXZlbnQ+IGV2ZW50cyA9IG5ldyBBcnJheUxpc3Q8QWNjZXNzaWJpbGl0eUV2ZW50PigpOwotCiAgICAgICAgICAgICAvLyBDbGljayB0aGUgYnV0dG9uLgotICAgICAgICAgICAgdWlBdXRvbWF0aW9uLmV4ZWN1dGVBbmRXYWl0Rm9yRXZlbnQobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgYnV0dG9uMS5wZXJmb3JtQWN0aW9uKEFjY2Vzc2liaWxpdHlOb2RlSW5mby5BQ1RJT05fQ0xJQ0spOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICBuZXcgVWlBdXRvbWF0aW9uLkFjY2Vzc2liaWxpdHlFdmVudEZpbHRlcigpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoQWNjZXNzaWJpbGl0eUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5nZXRFdmVudFR5cGUoKSA9PSBBY2Nlc3NpYmlsaXR5RXZlbnQuVFlQRV9WSUVXX0NMSUNLRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cy5hZGQoZXZlbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICBUSU1FT1VUX0FTWU5DX1BST0NFU1NJTkcpOworICAgICAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IGV2ZW50ID0gdWlBdXRvbWF0aW9uLmV4ZWN1dGVBbmRXYWl0Rm9yRXZlbnQoCisgICAgICAgICAgICAgICAgICAgICgpIC0+IGJ1dHRvbjEucGVyZm9ybUFjdGlvbihBQ1RJT05fQ0xJQ0spLAorICAgICAgICAgICAgICAgICAgICBmaWx0ZXJGb3JFdmVudFR5cGUoVFlQRV9WSUVXX0NMSUNLRUQpLCBUSU1FT1VUX0FTWU5DX1BST0NFU1NJTkcpOwogCiAgICAgICAgICAgICAvLyBHZXQgdGhlIHNvdXJjZSB3aW5kb3cuCi0gICAgICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgZXZlbnQgPSBldmVudHMuZ2V0KDApOwogICAgICAgICAgICAgQWNjZXNzaWJpbGl0eVdpbmRvd0luZm8gd2luZG93ID0gZXZlbnQuZ2V0U291cmNlKCkuZ2V0V2luZG93KCk7CiAKICAgICAgICAgICAgIC8vIFZlcmlmeSB0aGUgYXBwbGljYXRpb24gd2luZG93LgpAQCAtMjczLDMwICsyNDUsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgLmZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9zQnlWaWV3SWQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuY3RzOmlkL2J1dHRvbjEiKS5nZXQoMCk7CiAKLSAgICAgICAgICAgIC8vIEFyZ2guLi4KLSAgICAgICAgICAgIGZpbmFsIExpc3Q8QWNjZXNzaWJpbGl0eUV2ZW50PiBldmVudHMgPSBuZXcgQXJyYXlMaXN0PEFjY2Vzc2liaWxpdHlFdmVudD4oKTsKLQogICAgICAgICAgICAgLy8gQ2xpY2sgdGhlIGJ1dHRvbi4KLSAgICAgICAgICAgIHVpQXV0b21hdGlvbi5leGVjdXRlQW5kV2FpdEZvckV2ZW50KG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1dHRvbjEucGVyZm9ybUFjdGlvbihBY2Nlc3NpYmlsaXR5Tm9kZUluZm8uQUNUSU9OX0NMSUNLKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9LAotICAgICAgICAgICAgbmV3IFVpQXV0b21hdGlvbi5BY2Nlc3NpYmlsaXR5RXZlbnRGaWx0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEFjY2Vzc2liaWxpdHlFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0RXZlbnRUeXBlKCkgPT0gQWNjZXNzaWJpbGl0eUV2ZW50LlRZUEVfVklFV19DTElDS0VEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBldmVudHMuYWRkKGV2ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9LAotICAgICAgICAgICAgVElNRU9VVF9BU1lOQ19QUk9DRVNTSU5HKTsKKyAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBldmVudCA9IHVpQXV0b21hdGlvbi5leGVjdXRlQW5kV2FpdEZvckV2ZW50KAorICAgICAgICAgICAgICAgICAgICAoKSAtPiBidXR0b24xLnBlcmZvcm1BY3Rpb24oQUNUSU9OX0NMSUNLKSwKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyRm9yRXZlbnRUeXBlKFRZUEVfVklFV19DTElDS0VEKSwgVElNRU9VVF9BU1lOQ19QUk9DRVNTSU5HKTsKIAogICAgICAgICAgICAgLy8gR2V0IHRoZSBzb3VyY2Ugd2luZG93LgotICAgICAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IGV2ZW50ID0gZXZlbnRzLmdldCgwKTsKICAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlXaW5kb3dJbmZvIHdpbmRvdyA9IGV2ZW50LmdldFNvdXJjZSgpLmdldFdpbmRvdygpOwogCiAgICAgICAgICAgICAvLyBGaW5kIGEgYW5vdGhlciBidXR0b24gZnJvbSB0aGUgZXZlbnQncyB3aW5kb3cuCkBAIC0zMDUsMTkgKzI1OSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuY3RzOmlkL2J1dHRvbjIiKS5nZXQoMCk7CiAKICAgICAgICAgICAgIC8vIENsaWNrIHRoZSBzZWNvbmQgYnV0dG9uLgotICAgICAgICAgICAgdWlBdXRvbWF0aW9uLmV4ZWN1dGVBbmRXYWl0Rm9yRXZlbnQobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgYnV0dG9uMi5wZXJmb3JtQWN0aW9uKEFjY2Vzc2liaWxpdHlOb2RlSW5mby5BQ1RJT05fQ0xJQ0spOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICBuZXcgVWlBdXRvbWF0aW9uLkFjY2Vzc2liaWxpdHlFdmVudEZpbHRlcigpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoQWNjZXNzaWJpbGl0eUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBldmVudC5nZXRFdmVudFR5cGUoKSA9PSBBY2Nlc3NpYmlsaXR5RXZlbnQuVFlQRV9WSUVXX0NMSUNLRUQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIFRJTUVPVVRfQVNZTkNfUFJPQ0VTU0lORyk7CisgICAgICAgICAgICB1aUF1dG9tYXRpb24uZXhlY3V0ZUFuZFdhaXRGb3JFdmVudCgoKSAtPiBidXR0b24yLnBlcmZvcm1BY3Rpb24oQUNUSU9OX0NMSUNLKSwKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyRm9yRXZlbnRUeXBlKFRZUEVfVklFV19DTElDS0VEKSwgVElNRU9VVF9BU1lOQ19QUk9DRVNTSU5HKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIGNsZWFyQWNjZXNzSW50ZXJhY3RpdmVXaW5kb3dzRmxhZygpOwogICAgICAgICB9CkBAIC0zMjUsMjUgKzI2OCwzNiBAQAogCiAgICAgQE1lZGl1bVRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlQWNjZXNzaWJpbGl0eUZvY3VzQWNyb3NzV2luZG93cygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzZXRBY2Nlc3NJbnRlcmFjdGl2ZVdpbmRvd3NGbGFnKCk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAvLyBBZGQgdHdvIG1vcmUgd2luZG93cy4KLSAgICAgICAgICAgIGFkZFR3b0FwcFBhbmVsV2luZG93cygpOworICAgICAgICAgICAgZmluYWwgVmlldyB2aWV3c1tdOworICAgICAgICAgICAgdmlld3MgPSBhZGRUd29BcHBQYW5lbFdpbmRvd3MoKTsKIAotICAgICAgICAgICAgLy8gUHV0IGFjY2Vzc2liaWxpdHkgZm9jdXMgaW4gdGhlIGZpcnN0IGFwcCB3aW5kb3cuCi0gICAgICAgICAgICBlbnN1cmVBcHBXaW5kb3dGb2N1c2VkT3JGYWlsKDApOwotICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZXJlIG9ubHkgb25lIGFjY2Vzc2liaWxpdHkgZm9jdXMuCi0gICAgICAgICAgICBhc3NlcnRTaW5nbGVBY2Nlc3NpYmlsaXR5Rm9jdXMoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gUHV0IGFjY2Vzc2liaWxpdHkgZm9jdXMgaW4gdGhlIGZpcnN0IGFwcCB3aW5kb3cuCisgICAgICAgICAgICAgICAgZW5zdXJlQXBwV2luZG93Rm9jdXNlZE9yRmFpbCgwKTsKKyAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlcmUgb25seSBvbmUgYWNjZXNzaWJpbGl0eSBmb2N1cy4KKyAgICAgICAgICAgICAgICBhc3NlcnRTaW5nbGVBY2Nlc3NpYmlsaXR5Rm9jdXMoKTsKIAotICAgICAgICAgICAgLy8gUHV0IGFjY2Vzc2liaWxpdHkgZm9jdXMgaW4gdGhlIHNlY29uZCBhcHAgd2luZG93LgotICAgICAgICAgICAgZW5zdXJlQXBwV2luZG93Rm9jdXNlZE9yRmFpbCgxKTsKLSAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGVyZSBvbmx5IG9uZSBhY2Nlc3NpYmlsaXR5IGZvY3VzLgotICAgICAgICAgICAgYXNzZXJ0U2luZ2xlQWNjZXNzaWJpbGl0eUZvY3VzKCk7CisgICAgICAgICAgICAgICAgLy8gUHV0IGFjY2Vzc2liaWxpdHkgZm9jdXMgaW4gdGhlIHNlY29uZCBhcHAgd2luZG93LgorICAgICAgICAgICAgICAgIGVuc3VyZUFwcFdpbmRvd0ZvY3VzZWRPckZhaWwoMSk7CisgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZXJlIG9ubHkgb25lIGFjY2Vzc2liaWxpdHkgZm9jdXMuCisgICAgICAgICAgICAgICAgYXNzZXJ0U2luZ2xlQWNjZXNzaWJpbGl0eUZvY3VzKCk7CiAKLSAgICAgICAgICAgIC8vIFB1dCBhY2Nlc3NpYmlsaXR5IGZvY3VzIGluIHRoZSB0aGlyZCBhcHAgd2luZG93LgotICAgICAgICAgICAgZW5zdXJlQXBwV2luZG93Rm9jdXNlZE9yRmFpbCgyKTsKLSAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGVyZSBvbmx5IG9uZSBhY2Nlc3NpYmlsaXR5IGZvY3VzLgotICAgICAgICAgICAgYXNzZXJ0U2luZ2xlQWNjZXNzaWJpbGl0eUZvY3VzKCk7CisgICAgICAgICAgICAgICAgLy8gUHV0IGFjY2Vzc2liaWxpdHkgZm9jdXMgaW4gdGhlIHRoaXJkIGFwcCB3aW5kb3cuCisgICAgICAgICAgICAgICAgZW5zdXJlQXBwV2luZG93Rm9jdXNlZE9yRmFpbCgyKTsKKyAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlcmUgb25seSBvbmUgYWNjZXNzaWJpbGl0eSBmb2N1cy4KKyAgICAgICAgICAgICAgICBhc3NlcnRTaW5nbGVBY2Nlc3NpYmlsaXR5Rm9jdXMoKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgLy8gQ2xlYW4gdXAgcGFuZWwgd2luZG93cworICAgICAgICAgICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpLnJ1bk9uTWFpblN5bmMoKCkgLT4geworICAgICAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyIHdtID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShXaW5kb3dNYW5hZ2VyLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChWaWV3IHZpZXcgOiB2aWV3cykgeworICAgICAgICAgICAgICAgICAgICAgICAgd20ucmVtb3ZlVmlldyh2aWV3KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgZW5zdXJlQWNjZXNzaWJpbGl0eUZvY3VzQ2xlYXJlZCgpOwogICAgICAgICAgICAgY2xlYXJBY2Nlc3NJbnRlcmFjdGl2ZVdpbmRvd3NGbGFnKCk7CkBAIC0zNTEsMjQgKzMwNSw3IEBACiAgICAgfQogCiAgICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGVyZm9ybUFjdGlvbkZvY3VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIGZpbmQgYSB2aWV3IGFuZCBtYWtlIHN1cmUgaXQgaXMgbm90IGZvY3VzZWQKLSAgICAgICAgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIGJ1dHRvbiA9IGdldEluc3RydW1lbnRhdGlvbigpLmdldFVpQXV0b21hdGlvbigpCi0gICAgICAgICAgICAgICAgLmdldFJvb3RJbkFjdGl2ZVdpbmRvdygpLmZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9zQnlUZXh0KAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U3RyaW5nKFIuc3RyaW5nLmJ1dHRvbjUpKS5nZXQoMCk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGJ1dHRvbi5pc0ZvY3VzZWQoKSk7Ci0KLSAgICAgICAgLy8gZm9jdXMgdGhlIHZpZXcKLSAgICAgICAgYXNzZXJ0VHJ1ZShidXR0b24ucGVyZm9ybUFjdGlvbihBQ1RJT05fRk9DVVMpKTsKLQotICAgICAgICAvLyBmaW5kIHRoZSB2aWV3IGFnYWluIGFuZCBtYWtlIHN1cmUgaXQgaXMgZm9jdXNlZAotICAgICAgICBidXR0b24gPSBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRVaUF1dG9tYXRpb24oKS5nZXRSb290SW5BY3RpdmVXaW5kb3coKQotICAgICAgICAgICAgICAgIC5maW5kQWNjZXNzaWJpbGl0eU5vZGVJbmZvc0J5VGV4dChnZXRTdHJpbmcoUi5zdHJpbmcuYnV0dG9uNSkpLmdldCgwKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShidXR0b24uaXNGb2N1c2VkKCkpOwotICAgIH0KLQotICAgIEBNZWRpdW1UZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFBlcmZvcm1BY3Rpb25DbGVhckZvY3VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdFBlcmZvcm1BY3Rpb25TZXRBbmRDbGVhckZvY3VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIGZpbmQgYSB2aWV3IGFuZCBtYWtlIHN1cmUgaXQgaXMgbm90IGZvY3VzZWQKICAgICAgICAgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIGJ1dHRvbiA9IGdldEluc3RydW1lbnRhdGlvbigpLmdldFVpQXV0b21hdGlvbigpCiAgICAgICAgICAgICAgICAgLmdldFJvb3RJbkFjdGl2ZVdpbmRvdygpLmZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9zQnlUZXh0KApAQCAtNDQzLDIwICszODAsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGdldFN0cmluZyhSLnN0cmluZy5idXR0b241KSkuZ2V0KDApOwogICAgICAgICBhc3NlcnRGYWxzZShidXR0b24uaXNTZWxlY3RlZCgpKTsKIAotICAgICAgICAvLyBNYWtlIGFuIGFjdGlvbiBhbmQgd2FpdCBmb3IgYW4gZXZlbnQuCi0gICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBleHBlY3RlZCA9IGdldEluc3RydW1lbnRhdGlvbigpLmdldFVpQXV0b21hdGlvbigpCi0gICAgICAgICAgICAgICAgLmV4ZWN1dGVBbmRXYWl0Rm9yRXZlbnQobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgYnV0dG9uLnBlcmZvcm1BY3Rpb24oQUNUSU9OX0NMSUNLKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSwgbmV3IFVpQXV0b21hdGlvbi5BY2Nlc3NpYmlsaXR5RXZlbnRGaWx0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChBY2Nlc3NpYmlsaXR5RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKGV2ZW50LmdldEV2ZW50VHlwZSgpID09IEFjY2Vzc2liaWxpdHlFdmVudC5UWVBFX1ZJRVdfQ0xJQ0tFRCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0sCi0gICAgICAgIFRJTUVPVVRfQVNZTkNfUFJPQ0VTU0lORyk7CisgICAgICAgIC8vIFBlcmZvcm0gYW4gYWN0aW9uIGFuZCB3YWl0IGZvciBhbiBldmVudAorICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgZXhwZWN0ZWQgPSBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRVaUF1dG9tYXRpb24oKS5leGVjdXRlQW5kV2FpdEZvckV2ZW50KAorICAgICAgICAgICAgICAgICgpIC0+IGJ1dHRvbi5wZXJmb3JtQWN0aW9uKEFDVElPTl9DTElDSyksCisgICAgICAgICAgICAgICAgZmlsdGVyRm9yRXZlbnRUeXBlKFRZUEVfVklFV19DTElDS0VEKSwgVElNRU9VVF9BU1lOQ19QUk9DRVNTSU5HKTsKIAogICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGV4cGVjdGVkIGV2ZW50IHdhcyByZWNlaXZlZC4KICAgICAgICAgYXNzZXJ0Tm90TnVsbChleHBlY3RlZCk7CkBAIC00NzAsMjAgKzM5NywxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U3RyaW5nKFIuc3RyaW5nLmJ1dHRvbjUpKS5nZXQoMCk7CiAgICAgICAgIGFzc2VydEZhbHNlKGJ1dHRvbi5pc1NlbGVjdGVkKCkpOwogCi0gICAgICAgIC8vIE1ha2UgYW4gYWN0aW9uIGFuZCB3YWl0IGZvciBhbiBldmVudC4KLSAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IGV4cGVjdGVkID0gZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VWlBdXRvbWF0aW9uKCkKLSAgICAgICAgICAgICAgICAuZXhlY3V0ZUFuZFdhaXRGb3JFdmVudChuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBidXR0b24ucGVyZm9ybUFjdGlvbihBQ1RJT05fTE9OR19DTElDSyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0sIG5ldyBVaUF1dG9tYXRpb24uQWNjZXNzaWJpbGl0eUV2ZW50RmlsdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoQWNjZXNzaWJpbGl0eUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChldmVudC5nZXRFdmVudFR5cGUoKSA9PSBBY2Nlc3NpYmlsaXR5RXZlbnQuVFlQRV9WSUVXX0xPTkdfQ0xJQ0tFRCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0sCi0gICAgICAgIFRJTUVPVVRfQVNZTkNfUFJPQ0VTU0lORyk7CisgICAgICAgIC8vIFBlcmZvcm0gYW4gYWN0aW9uIGFuZCB3YWl0IGZvciBhbiBldmVudC4KKyAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IGV4cGVjdGVkID0gZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VWlBdXRvbWF0aW9uKCkuZXhlY3V0ZUFuZFdhaXRGb3JFdmVudCgKKyAgICAgICAgICAgICAgICAoKSAtPiBidXR0b24ucGVyZm9ybUFjdGlvbihBQ1RJT05fTE9OR19DTElDSyksCisgICAgICAgICAgICAgICAgZmlsdGVyRm9yRXZlbnRUeXBlKFRZUEVfVklFV19MT05HX0NMSUNLRUQpLCBUSU1FT1VUX0FTWU5DX1BST0NFU1NJTkcpOwogCiAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgZXhwZWN0ZWQgZXZlbnQgd2FzIHJlY2VpdmVkLgogICAgICAgICBhc3NlcnROb3ROdWxsKGV4cGVjdGVkKTsKQEAgLTUyMSwyMCArNDM4LDggQEAKIAogICAgICAgICAvLyBmb2N1cyBhbmQgd2FpdCBmb3IgdGhlIGV2ZW50CiAgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBhd2FpdGVkRXZlbnQgPSBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRVaUF1dG9tYXRpb24oKQotICAgICAgICAgICAgLmV4ZWN1dGVBbmRXYWl0Rm9yRXZlbnQoCi0gICAgICAgICAgICAgICAgbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShidXR0b24ucGVyZm9ybUFjdGlvbihBQ1RJT05fRk9DVVMpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSwKLSAgICAgICAgICAgICAgICBuZXcgVWlBdXRvbWF0aW9uLkFjY2Vzc2liaWxpdHlFdmVudEZpbHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEFjY2Vzc2liaWxpdHlFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIHJldHVybiAoZXZlbnQuZ2V0RXZlbnRUeXBlKCkgPT0gQWNjZXNzaWJpbGl0eUV2ZW50LlRZUEVfVklFV19GT0NVU0VEKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSwKLSAgICAgICAgVElNRU9VVF9BU1lOQ19QUk9DRVNTSU5HKTsKKyAgICAgICAgICAgICAgICAuZXhlY3V0ZUFuZFdhaXRGb3JFdmVudCgoKSAtPiBidXR0b24ucGVyZm9ybUFjdGlvbihBQ1RJT05fRk9DVVMpLAorICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyRm9yRXZlbnRUeXBlKFRZUEVfVklFV19GT0NVU0VEKSwgVElNRU9VVF9BU1lOQ19QUk9DRVNTSU5HKTsKIAogICAgICAgICBhc3NlcnROb3ROdWxsKGF3YWl0ZWRFdmVudCk7CiAKQEAgLTY0MCwxMyArNTQ1LDggQEAKICAgICAgICAgc2V0QWNjZXNzSW50ZXJhY3RpdmVXaW5kb3dzRmxhZygpOwogICAgICAgICBmaW5hbCBVaUF1dG9tYXRpb24gdWlBdXRvbWF0aW9uID0gZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VWlBdXRvbWF0aW9uKCk7CiAgICAgICAgIGFzc2VydEZhbHNlKGlzRGl2aWRlcldpbmRvd1ByZXNlbnQodWlBdXRvbWF0aW9uKSk7Ci0gICAgICAgIFJ1bm5hYmxlIHRvZ2dsZVNwbGl0U2NyZWVuUnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHVpQXV0b21hdGlvbi5wZXJmb3JtR2xvYmFsQWN0aW9uKAorICAgICAgICBSdW5uYWJsZSB0b2dnbGVTcGxpdFNjcmVlblJ1bm5hYmxlID0gKCkgLT4gYXNzZXJ0VHJ1ZSh1aUF1dG9tYXRpb24ucGVyZm9ybUdsb2JhbEFjdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlTZXJ2aWNlLkdMT0JBTF9BQ1RJT05fVE9HR0xFX1NQTElUX1NDUkVFTikpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwogCiAgICAgICAgIHVpQXV0b21hdGlvbi5leGVjdXRlQW5kV2FpdEZvckV2ZW50KHRvZ2dsZVNwbGl0U2NyZWVuUnVubmFibGUsIG1EaXZpZGVyUHJlc2VudEZpbHRlciwKICAgICAgICAgICAgICAgICBUSU1FT1VUX0FTWU5DX1BST0NFU1NJTkcpOwpAQCAtNjY1LDcgKzU2NSw3IEBACiAgICAgICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS5ydW5Pbk1haW5TeW5jKCgpIC0+IHsKICAgICAgICAgICAgICAgICBnZXRBY3Rpdml0eSgpLmVudGVyUGljdHVyZUluUGljdHVyZU1vZGUoKTsKICAgICAgICAgICAgIH0pOwotICAgICAgICB9LCBtV2luZG93c0NoYW5nZWRGaWx0ZXIsIFRJTUVPVVRfQVNZTkNfUFJPQ0VTU0lORyk7CisgICAgICAgIH0sIGZpbHRlckZvckV2ZW50VHlwZShUWVBFX1dJTkRPV1NfQ0hBTkdFRCksIFRJTUVPVVRfQVNZTkNfUFJPQ0VTU0lORyk7CiAgICAgICAgIHdhaXRGb3JJZGxlKCk7CiAKICAgICAgICAgLy8gV2Ugc2hvdWxkIGJlIGFibGUgdG8gZmluZCBhIHBpY3R1cmUtaW4tcGljdHVyZSB3aW5kb3cgbm93CkBAIC02ODEsMTMgKzU4MSwzMiBAQAogICAgICAgICBhc3NlcnRUcnVlKG51bVBpY3R1cmVJblBpY3R1cmVXaW5kb3dzID49IDEpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRXaW5kb3dzX3Jlc3VsdElzU29ydGVkQnlMYXllckRlc2NlbmRpbmcoKSB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiB7CisgICAgICAgIGFkZFR3b0FwcFBhbmVsV2luZG93cygpOworICAgICAgICBMaXN0PEFjY2Vzc2liaWxpdHlXaW5kb3dJbmZvPiB3aW5kb3dzID0gZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VWlBdXRvbWF0aW9uKCkuZ2V0V2luZG93cygpOworCisgICAgICAgIEFjY2Vzc2liaWxpdHlXaW5kb3dJbmZvIHdpbmRvd0FkZGVkRmlyc3QgPSBmaW5kV2luZG93KHdpbmRvd3MsIFIuc3RyaW5nLmJ1dHRvbjEpOworICAgICAgICBBY2Nlc3NpYmlsaXR5V2luZG93SW5mbyB3aW5kb3dBZGRlZFNlY29uZCA9IGZpbmRXaW5kb3cod2luZG93cywgUi5zdHJpbmcuYnV0dG9uMik7CisgICAgICAgIGFzc2VydFRoYXQod2luZG93QWRkZWRGaXJzdC5nZXRMYXllcigpLCBsZXNzVGhhbih3aW5kb3dBZGRlZFNlY29uZC5nZXRMYXllcigpKSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdCh3aW5kb3dzLCBuZXcgSXNTb3J0ZWRCeTw+KHcgLT4gdy5nZXRMYXllcigpLCAvKiBhc2NlbmRpbmcgKi8gZmFsc2UpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEFjY2Vzc2liaWxpdHlXaW5kb3dJbmZvIGZpbmRXaW5kb3coTGlzdDxBY2Nlc3NpYmlsaXR5V2luZG93SW5mbz4gd2luZG93cywKKyAgICAgICAgICAgIGludCBidG5UZXh0UmVzKSB7CisgICAgICAgIHJldHVybiB3aW5kb3dzLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgLmZpbHRlcih3IC0+IHcuZ2V0Um9vdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAuZmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb3NCeVRleHQoZ2V0U3RyaW5nKGJ0blRleHRSZXMpKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNpemUoKSA9PSAxKQorICAgICAgICAgICAgICAgIC5maW5kRmlyc3QoKQorICAgICAgICAgICAgICAgIC5nZXQoKTsKKyAgICB9CisKICAgICBwcml2YXRlIGJvb2xlYW4gaXNEaXZpZGVyV2luZG93UHJlc2VudChVaUF1dG9tYXRpb24gdWlBdXRvbWF0aW9uKSB7CiAgICAgICAgIExpc3Q8QWNjZXNzaWJpbGl0eVdpbmRvd0luZm8+IHdpbmRvd3MgPSB1aUF1dG9tYXRpb24uZ2V0V2luZG93cygpOwogICAgICAgICBmaW5hbCBpbnQgd2luZG93Q291bnQgPSB3aW5kb3dzLnNpemUoKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3aW5kb3dDb3VudDsgaSsrKSB7CiAgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5V2luZG93SW5mbyB3aW5kb3cgPSB3aW5kb3dzLmdldChpKTsKLSAgICAgICAgICAgIFJlY3QgYm91bmRzID0gbmV3IFJlY3QoKTsKLSAgICAgICAgICAgIHdpbmRvdy5nZXRCb3VuZHNJblNjcmVlbihib3VuZHMpOwogICAgICAgICAgICAgaWYgKHdpbmRvdy5nZXRUeXBlKCkgPT0gQWNjZXNzaWJpbGl0eVdpbmRvd0luZm8uVFlQRV9TUExJVF9TQ1JFRU5fRElWSURFUikgewogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQpAQCAtNzE3LDggKzYzNiwxMSBAQAogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIkR1cGxpY2F0ZSBhY2Nlc3NpYmlsaXR5IGZvY3VzIik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhc3NlcnROdWxsKHdpbmRvdy5nZXRSb290KCkuZmluZEZvY3VzKAotICAgICAgICAgICAgICAgICAgICAgICAgQWNjZXNzaWJpbGl0eU5vZGVJbmZvLkZPQ1VTX0FDQ0VTU0lCSUxJVFkpKTsKKyAgICAgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gcm9vdCA9IHdpbmRvdy5nZXRSb290KCk7CisgICAgICAgICAgICAgICAgaWYgKHJvb3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnROdWxsKHJvb3QuZmluZEZvY3VzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlOb2RlSW5mby5GT0NVU19BQ0NFU1NJQklMSVRZKSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtNzI2LDcgKzY0OCw3IEBACiAgICAgcHJpdmF0ZSB2b2lkIGVuc3VyZUFwcFdpbmRvd0ZvY3VzZWRPckZhaWwoaW50IGFwcFdpbmRvd0luZGV4KSB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiB7CiAgICAgICAgIFVpQXV0b21hdGlvbiB1aUF1dG9tYXRpb24gPSBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRVaUF1dG9tYXRpb24oKTsKICAgICAgICAgTGlzdDxBY2Nlc3NpYmlsaXR5V2luZG93SW5mbz4gd2luZG93cyA9IHVpQXV0b21hdGlvbi5nZXRXaW5kb3dzKCk7Ci0gICAgICAgIEFjY2Vzc2liaWxpdHlXaW5kb3dJbmZvIGZvY3VzVGFyZWdldCA9IG51bGw7CisgICAgICAgIEFjY2Vzc2liaWxpdHlXaW5kb3dJbmZvIGZvY3VzVGFyZ2V0ID0gbnVsbDsKIAogICAgICAgICBpbnQgdmlzaXRlZEFwcFdpbmRvd3MgPSAtMTsKICAgICAgICAgZmluYWwgaW50IHdpbmRvd0NvdW50ID0gd2luZG93cy5zaXplKCk7CkBAIC03MzUsMTE4ICs2NTcsNzUgQEAKICAgICAgICAgICAgIGlmICh3aW5kb3cuZ2V0VHlwZSgpID09IEFjY2Vzc2liaWxpdHlXaW5kb3dJbmZvLlRZUEVfQVBQTElDQVRJT04pIHsKICAgICAgICAgICAgICAgICB2aXNpdGVkQXBwV2luZG93cysrOwogICAgICAgICAgICAgICAgIGlmIChhcHBXaW5kb3dJbmRleCA8PSB2aXNpdGVkQXBwV2luZG93cykgewotICAgICAgICAgICAgICAgICAgICBmb2N1c1RhcmVnZXQgPSB3aW5kb3c7CisgICAgICAgICAgICAgICAgICAgIGZvY3VzVGFyZ2V0ID0gd2luZG93OwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoZm9jdXNUYXJlZ2V0ID09IG51bGwpIHsKKyAgICAgICAgaWYgKGZvY3VzVGFyZ2V0ID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNvdWxkbid0IGZpbmQgYXBwIHdpbmRvdzogIiArIGFwcFdpbmRvd0luZGV4KTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChmb2N1c1RhcmVnZXQuaXNBY2Nlc3NpYmlsaXR5Rm9jdXNlZCgpKSB7CisgICAgICAgIGlmIChmb2N1c1RhcmdldC5pc0FjY2Vzc2liaWxpdHlGb2N1c2VkKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIGZpbmFsIEFjY2Vzc2liaWxpdHlXaW5kb3dJbmZvIGZpbmFsRm9jdXNUYXJnZXQgPSBmb2N1c1RhcmVnZXQ7Ci0gICAgICAgIHVpQXV0b21hdGlvbi5leGVjdXRlQW5kV2FpdEZvckV2ZW50KG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZmluYWxGb2N1c1RhcmdldC5nZXRSb290KCkucGVyZm9ybUFjdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlOb2RlSW5mby5BQ1RJT05fQUNDRVNTSUJJTElUWV9GT0NVUykpOwotICAgICAgICAgICAgfQotICAgICAgICB9LCBuZXcgVWlBdXRvbWF0aW9uLkFjY2Vzc2liaWxpdHlFdmVudEZpbHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEFjY2Vzc2liaWxpdHlFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIHJldHVybiBldmVudC5nZXRFdmVudFR5cGUoKSA9PSBBY2Nlc3NpYmlsaXR5RXZlbnQuVFlQRV9XSU5ET1dTX0NIQU5HRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0sIFRJTUVPVVRfQVNZTkNfUFJPQ0VTU0lORyk7CisgICAgICAgIGZpbmFsIEFjY2Vzc2liaWxpdHlXaW5kb3dJbmZvIGZpbmFsRm9jdXNUYXJnZXQgPSBmb2N1c1RhcmdldDsKKyAgICAgICAgdWlBdXRvbWF0aW9uLmV4ZWN1dGVBbmRXYWl0Rm9yRXZlbnQoKCkgLT4gYXNzZXJ0VHJ1ZShmaW5hbEZvY3VzVGFyZ2V0LmdldFJvb3QoKQorICAgICAgICAgICAgICAgIC5wZXJmb3JtQWN0aW9uKEFjY2Vzc2liaWxpdHlOb2RlSW5mby5BQ1RJT05fQUNDRVNTSUJJTElUWV9GT0NVUykpLAorICAgICAgICAgICAgICAgIGZpbHRlcldpbmRvd3NDaGFuZ2VkV2l0aENoYW5nZVR5cGVzKFdJTkRPV1NfQ0hBTkdFX0FDQ0VTU0lCSUxJVFlfRk9DVVNFRCksCisgICAgICAgICAgICAgICAgVElNRU9VVF9BU1lOQ19QUk9DRVNTSU5HKTsKIAogICAgICAgICB3aW5kb3dzID0gdWlBdXRvbWF0aW9uLmdldFdpbmRvd3MoKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3aW5kb3dDb3VudDsgaSsrKSB7CiAgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5V2luZG93SW5mbyB3aW5kb3cgPSB3aW5kb3dzLmdldChpKTsKLSAgICAgICAgICAgIGlmICh3aW5kb3cuZ2V0SWQoKSA9PSBmb2N1c1RhcmVnZXQuZ2V0SWQoKSkgeworICAgICAgICAgICAgaWYgKHdpbmRvdy5nZXRJZCgpID09IGZvY3VzVGFyZ2V0LmdldElkKCkpIHsKICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHdpbmRvdy5pc0FjY2Vzc2liaWxpdHlGb2N1c2VkKCkpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFR3b0FwcFBhbmVsV2luZG93cygpIHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgVWlBdXRvbWF0aW9uIHVpQXV0b21hdGlvbiA9IGdldEluc3RydW1lbnRhdGlvbigpLmdldFVpQXV0b21hdGlvbigpOworICAgIHByaXZhdGUgVmlld1tdIGFkZFR3b0FwcFBhbmVsV2luZG93cygpIHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIHsKKyAgICAgICAgc2V0QWNjZXNzSW50ZXJhY3RpdmVXaW5kb3dzRmxhZygpOworICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRVaUF1dG9tYXRpb24oKQorICAgICAgICAgICAgICAgIC53YWl0Rm9ySWRsZShUSU1FT1VUX1dJTkRPV19TVEFURV9JRExFLCBUSU1FT1VUX0FTWU5DX1BST0NFU1NJTkcpOwogCi0gICAgICAgIHVpQXV0b21hdGlvbi53YWl0Rm9ySWRsZShUSU1FT1VUX1dJTkRPV19TVEFURV9JRExFLCBUSU1FT1VUX0FTWU5DX1BST0NFU1NJTkcpOwotCi0gICAgICAgIC8vIEFkZCB0aGUgZmlyc3Qgd2luZG93LgotICAgICAgICB1aUF1dG9tYXRpb24uZXhlY3V0ZUFuZFdhaXRGb3JFdmVudChuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS5ydW5Pbk1haW5TeW5jKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIHBhcmFtcyA9IG5ldyBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmdyYXZpdHkgPSBHcmF2aXR5LlRPUDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy55ID0gZ2V0U3RhdHVzQmFySGVpZ2h0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMud2lkdGggPSBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuaGVpZ2h0ID0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UOwotICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmZsYWdzID0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19MQVlPVVRfSU5fU0NSRUVOCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19MQVlPVVRfSU5TRVRfREVDT1IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX05PVF9GT0NVU0FCTEUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX05PVF9UT1VDSF9NT0RBTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy50eXBlID0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9BUFBMSUNBVElPTl9QQU5FTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy50b2tlbiA9IGdldEFjdGl2aXR5KCkuZ2V0V2luZG93KCkuZ2V0RGVjb3JWaWV3KCkuZ2V0V2luZG93VG9rZW4oKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oZ2V0QWN0aXZpdHkoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidXR0b24uc2V0VGV4dChSLnN0cmluZy5idXR0b24xKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldEFjdGl2aXR5KCkuZ2V0V2luZG93TWFuYWdlcigpLmFkZFZpZXcoYnV0dG9uLCBwYXJhbXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0sIG5ldyBVaUF1dG9tYXRpb24uQWNjZXNzaWJpbGl0eUV2ZW50RmlsdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoQWNjZXNzaWJpbGl0eUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGV2ZW50LmdldEV2ZW50VHlwZSgpID09IEFjY2Vzc2liaWxpdHlFdmVudC5UWVBFX1dJTkRPV1NfQ0hBTkdFRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSwgVElNRU9VVF9BU1lOQ19QUk9DRVNTSU5HKTsKLQotICAgICAgICAvLyBBZGQgdGhlIHNlY29uZCB3aW5kb3cuCi0gICAgICAgIHVpQXV0b21hdGlvbi5leGVjdXRlQW5kV2FpdEZvckV2ZW50KG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpLnJ1bk9uTWFpblN5bmMobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgcGFyYW1zID0gbmV3IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuZ3Jhdml0eSA9IEdyYXZpdHkuQk9UVE9NOwotICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLndpZHRoID0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UOwotICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmhlaWdodCA9IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5mbGFncyA9IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTEFZT1VUX0lOX1NDUkVFTgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTEFZT1VUX0lOU0VUX0RFQ09SCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfRk9DVVNBQkxFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfVE9VQ0hfTU9EQUw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMudHlwZSA9IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlRZUEVfQVBQTElDQVRJT05fUEFORUw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMudG9rZW4gPSBnZXRBY3Rpdml0eSgpLmdldFdpbmRvdygpLmdldERlY29yVmlldygpLmdldFdpbmRvd1Rva2VuKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGdldEFjdGl2aXR5KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uLnNldFRleHQoUi5zdHJpbmcuYnV0dG9uMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZXRBY3Rpdml0eSgpLmdldFdpbmRvd01hbmFnZXIoKS5hZGRWaWV3KGJ1dHRvbiwgcGFyYW1zKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgfQotICAgICAgICB9LCBuZXcgVWlBdXRvbWF0aW9uLkFjY2Vzc2liaWxpdHlFdmVudEZpbHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEFjY2Vzc2liaWxpdHlFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIHJldHVybiBldmVudC5nZXRFdmVudFR5cGUoKSA9PSBBY2Nlc3NpYmlsaXR5RXZlbnQuVFlQRV9XSU5ET1dTX0NIQU5HRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0sIFRJTUVPVVRfQVNZTkNfUFJPQ0VTU0lORyk7CisgICAgICAgIHJldHVybiBuZXcgVmlld1tdIHsKKyAgICAgICAgICAgICAgICBhZGRXaW5kb3coUi5zdHJpbmcuYnV0dG9uMSwgcGFyYW1zIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmdyYXZpdHkgPSBHcmF2aXR5LlRPUDsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zLnkgPSBnZXRTdGF0dXNCYXJIZWlnaHQoZ2V0QWN0aXZpdHkoKSk7CisgICAgICAgICAgICAgICAgfSksCisgICAgICAgICAgICAgICAgYWRkV2luZG93KFIuc3RyaW5nLmJ1dHRvbjIsIHBhcmFtcyAtPiB7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5ncmF2aXR5ID0gR3Jhdml0eS5CT1RUT007CisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgfTsKICAgICB9CiAKLSAgICBwcml2YXRlIGludCBnZXRTdGF0dXNCYXJIZWlnaHQoKSB7Ci0gICAgICAgIGZpbmFsIFJlY3QgcmVjdCA9IG5ldyBSZWN0KCk7Ci0gICAgICAgIFdpbmRvdyB3aW5kb3cgPSBnZXRBY3Rpdml0eSgpLmdldFdpbmRvdygpOwotICAgICAgICB3aW5kb3cuZ2V0RGVjb3JWaWV3KCkuZ2V0V2luZG93VmlzaWJsZURpc3BsYXlGcmFtZShyZWN0KTsKLSAgICAgICAgcmV0dXJuIHJlY3QudG9wOworICAgIHByaXZhdGUgQnV0dG9uIGFkZFdpbmRvdyhpbnQgYnRuVGV4dFJlcywgQ29uc3VtZXI8V2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXM+IGNvbmZpZ3VyZSkKKyAgICAgICAgICAgIHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIHsKKyAgICAgICAgQXRvbWljUmVmZXJlbmNlPEJ1dHRvbj4gcmVzdWx0ID0gbmV3IEF0b21pY1JlZmVyZW5jZTw+KCk7CisgICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpLmdldFVpQXV0b21hdGlvbigpLmV4ZWN1dGVBbmRXYWl0Rm9yRXZlbnQoKCkgLT4geworICAgICAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkucnVuT25NYWluU3luYygoKSAtPiB7CisgICAgICAgICAgICAgICAgZmluYWwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgcGFyYW1zID0gbmV3IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zKCk7CisgICAgICAgICAgICAgICAgcGFyYW1zLndpZHRoID0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UOworICAgICAgICAgICAgICAgIHBhcmFtcy5oZWlnaHQgPSBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQ7CisgICAgICAgICAgICAgICAgcGFyYW1zLmZsYWdzID0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19MQVlPVVRfSU5fU0NSRUVOCisgICAgICAgICAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTEFZT1VUX0lOU0VUX0RFQ09SCisgICAgICAgICAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX0ZPQ1VTQUJMRQorICAgICAgICAgICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX05PVF9UT1VDSF9NT0RBTDsKKyAgICAgICAgICAgICAgICBwYXJhbXMudHlwZSA9IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlRZUEVfQVBQTElDQVRJT05fUEFORUw7CisgICAgICAgICAgICAgICAgcGFyYW1zLnRva2VuID0gZ2V0QWN0aXZpdHkoKS5nZXRXaW5kb3coKS5nZXREZWNvclZpZXcoKS5nZXRXaW5kb3dUb2tlbigpOworICAgICAgICAgICAgICAgIGNvbmZpZ3VyZS5hY2NlcHQocGFyYW1zKTsKKworICAgICAgICAgICAgICAgIGZpbmFsIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGdldEFjdGl2aXR5KCkpOworICAgICAgICAgICAgICAgIGJ1dHRvbi5zZXRUZXh0KGJ0blRleHRSZXMpOworICAgICAgICAgICAgICAgIHJlc3VsdC5zZXQoYnV0dG9uKTsKKyAgICAgICAgICAgICAgICBnZXRBY3Rpdml0eSgpLmdldFdpbmRvd01hbmFnZXIoKS5hZGRWaWV3KGJ1dHRvbiwgcGFyYW1zKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9LCBmaWx0ZXJXaW5kb3dzQ2hhbmdlZFdpdGhDaGFuZ2VUeXBlcyhXSU5ET1dTX0NIQU5HRV9BRERFRCksIFRJTUVPVVRfQVNZTkNfUFJPQ0VTU0lORyk7CisgICAgICAgIHJldHVybiByZXN1bHQuZ2V0KCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHNldEFjY2Vzc0ludGVyYWN0aXZlV2luZG93c0ZsYWcgKCkgewpAQCAtODY2LDI2ICs3NDUsMjAgQEAKICAgICBwcml2YXRlIHZvaWQgZW5zdXJlQWNjZXNzaWJpbGl0eUZvY3VzQ2xlYXJlZCgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGZpbmFsIFVpQXV0b21hdGlvbiB1aUF1dG9tYXRpb24gPSBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRVaUF1dG9tYXRpb24oKTsKLSAgICAgICAgICAgIHVpQXV0b21hdGlvbi5leGVjdXRlQW5kV2FpdEZvckV2ZW50KG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIExpc3Q8QWNjZXNzaWJpbGl0eVdpbmRvd0luZm8+IHdpbmRvd3MgPSB1aUF1dG9tYXRpb24uZ2V0V2luZG93cygpOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgd2luZG93Q291bnQgPSB3aW5kb3dzLnNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3aW5kb3dDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5V2luZG93SW5mbyB3aW5kb3cgPSB3aW5kb3dzLmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuaXNBY2Nlc3NpYmlsaXR5Rm9jdXNlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmdldFJvb3QoKS5wZXJmb3JtQWN0aW9uKAorICAgICAgICAgICAgdWlBdXRvbWF0aW9uLmV4ZWN1dGVBbmRXYWl0Rm9yRXZlbnQoKCkgLT4geworICAgICAgICAgICAgICAgIExpc3Q8QWNjZXNzaWJpbGl0eVdpbmRvd0luZm8+IHdpbmRvd3MgPSB1aUF1dG9tYXRpb24uZ2V0V2luZG93cygpOworICAgICAgICAgICAgICAgIGZpbmFsIGludCB3aW5kb3dDb3VudCA9IHdpbmRvd3Muc2l6ZSgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd2luZG93Q291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5V2luZG93SW5mbyB3aW5kb3cgPSB3aW5kb3dzLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5pc0FjY2Vzc2liaWxpdHlGb2N1c2VkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyByb290ID0gd2luZG93LmdldFJvb3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb290ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290LnBlcmZvcm1BY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8uQUNUSU9OX0NMRUFSX0FDQ0VTU0lCSUxJVFlfRk9DVVMpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSwgbmV3IFVpQXV0b21hdGlvbi5BY2Nlc3NpYmlsaXR5RXZlbnRGaWx0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEFjY2Vzc2liaWxpdHlFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXZlbnQuZ2V0RXZlbnRUeXBlKCkgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQuVFlQRV9WSUVXX0FDQ0VTU0lCSUxJVFlfRk9DVVNfQ0xFQVJFRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9LCBUSU1FT1VUX0FTWU5DX1BST0NFU1NJTkcpOworICAgICAgICAgICAgfSwgZmlsdGVyRm9yRXZlbnRUeXBlKFRZUEVfVklFV19BQ0NFU1NJQklMSVRZX0ZPQ1VTX0NMRUFSRUQpLCBUSU1FT1VUX0FTWU5DX1BST0NFU1NJTkcpOwogICAgICAgICB9IGNhdGNoIChUaW1lb3V0RXhjZXB0aW9uIHRlKSB7CiAgICAgICAgICAgICAvKiBpZ25vcmUgKi8KICAgICAgICAgfQpAQCAtOTU2LDQgKzgyOSwzMyBAQAogICAgIHByb3RlY3RlZCB2b2lkIHNjcnViQ2xhc3MoQ2xhc3M8Pz4gdGVzdENhc2VDbGFzcykgewogICAgICAgICAvKiBpbnRlbnRpb25hbGx5IGRvIG5vdCBzY3J1YiAqLwogICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIElzU29ydGVkQnk8VD4gZXh0ZW5kcyBUeXBlU2FmZU1hdGNoZXI8TGlzdDxUPj4geworCisgICAgICAgIHByaXZhdGUgZmluYWwgRnVuY3Rpb248VCwgPyBleHRlbmRzIENvbXBhcmFibGU+IG1Qcm9wZXJ0eTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Bc2NlbmRpbmc7CisKKyAgICAgICAgcHJpdmF0ZSBJc1NvcnRlZEJ5KEZ1bmN0aW9uPFQsID8gZXh0ZW5kcyBDb21wYXJhYmxlPiBjb21wYXJhdG9yLCBib29sZWFuIGFzY2VuZGluZykgeworICAgICAgICAgICAgbVByb3BlcnR5ID0gY29tcGFyYXRvcjsKKyAgICAgICAgICAgIG1Bc2NlbmRpbmcgPSBhc2NlbmRpbmc7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZGVzY3JpYmVUbyhEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgeworICAgICAgICAgICAgZGVzY3JpcHRpb24uYXBwZW5kVGV4dCgiaXMgc29ydGVkIik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gbWF0Y2hlc1NhZmVseShMaXN0PFQ+IGl0ZW0pIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbS5zaXplKCkgLSAxOyBpKyspIHsKKyAgICAgICAgICAgICAgICBDb21wYXJhYmxlIGEgPSBtUHJvcGVydHkuYXBwbHkoaXRlbS5nZXQoaSkpOworICAgICAgICAgICAgICAgIENvbXBhcmFibGUgYiA9IG1Qcm9wZXJ0eS5hcHBseShpdGVtLmdldChpKSk7CisgICAgICAgICAgICAgICAgaW50IGFNaW51c0IgPSBhLmNvbXBhcmVUbyhiKTsKKyAgICAgICAgICAgICAgICBpZiAoYU1pbnVzQiAhPSAwICYmIChhTWludXNCIDwgMCkgIT0gbUFzY2VuZGluZykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9jdHMvQWNjZXNzaWJpbGl0eVdpbmRvd1JlcG9ydGluZ0FjdGl2aXR5LmphdmEgYi90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9jdHMvQWNjZXNzaWJpbGl0eVdpbmRvd1JlcG9ydGluZ0FjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2Mzg5NTEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2Uvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvY3RzL0FjY2Vzc2liaWxpdHlXaW5kb3dSZXBvcnRpbmdBY3Rpdml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdAotICogaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZQotICogTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCi0gKiBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHM7Ci0KLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLQotLyoqCi0gKiBBY3Rpdml0eSB1c2VkIGJ5IEFjdGl2aXR5V2luZG93UmVwb3J0aW5nVGVzdAotICovCi1wdWJsaWMgY2xhc3MgQWNjZXNzaWJpbGl0eVdpbmRvd1JlcG9ydGluZ0FjdGl2aXR5IGV4dGVuZHMgQWNjZXNzaWJpbGl0eVRlc3RBY3Rpdml0eSB7Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwotICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5hY2Nlc3NpYmlsaXR5X3dpbmRvd19yZXBvcnRpbmdfdGVzdCk7Ci0gICAgICAgIHNldFRpdGxlKCJBY2Nlc3NpYmlsaXR5V2luZG93UmVwb3J0aW5nQWN0aXZpdHkiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9jdHMvQWNjZXNzaWJpbGl0eVdpbmRvd1JlcG9ydGluZ1Rlc3QuamF2YSBiL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy9BY2Nlc3NpYmlsaXR5V2luZG93UmVwb3J0aW5nVGVzdC5qYXZhCmluZGV4IGM5ZWVmOTMuLjM4OGZkMGEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy9BY2Nlc3NpYmlsaXR5V2luZG93UmVwb3J0aW5nVGVzdC5qYXZhCisrKyBiL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy9BY2Nlc3NpYmlsaXR5V2luZG93UmVwb3J0aW5nVGVzdC5qYXZhCkBAIC0xNiw4MCArMTYsMjUwIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHM7CiAKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHMudXRpbHMuQWNjZXNzaWJpbGl0eUV2ZW50RmlsdGVyVXRpbHMuZmlsdGVyV2luZG93c0NoYW5nZWRXaXRoQ2hhbmdlVHlwZXM7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuY3RzLnV0aWxzLkFjdGl2aXR5TGF1bmNoVXRpbHMuZmluZFdpbmRvd0J5VGl0bGU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuY3RzLnV0aWxzLkFjdGl2aXR5TGF1bmNoVXRpbHMuZ2V0QWN0aXZpdHlUaXRsZTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHMudXRpbHMuQWN0aXZpdHlMYXVuY2hVdGlscy5sYXVuY2hBY3Rpdml0eUFuZFdhaXRGb3JJdFRvQmVPbnNjcmVlbjsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHMudXRpbHMuRGlzcGxheVV0aWxzLmdldFN0YXR1c0JhckhlaWdodDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfUElDVFVSRV9JTl9QSUNUVVJFOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQuVFlQRV9XSU5ET1dTX0NIQU5HRUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudC5XSU5ET1dTX0NIQU5HRV9BQ0NFU1NJQklMSVRZX0ZPQ1VTRUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudC5XSU5ET1dTX0NIQU5HRV9BQ1RJVkU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudC5XSU5ET1dTX0NIQU5HRV9BRERFRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50LldJTkRPV1NfQ0hBTkdFX0JPVU5EUzsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50LldJTkRPV1NfQ0hBTkdFX0NISUxEUkVOOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQuV0lORE9XU19DSEFOR0VfRk9DVVNFRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50LldJTkRPV1NfQ0hBTkdFX1JFTU9WRUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudC5XSU5ET1dTX0NIQU5HRV9USVRMRTsKKworaW1wb3J0IHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworCiBpbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZUluZm87CitpbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHMuYWN0aXZpdGllcy5BY2Nlc3NpYmlsaXR5V2luZG93UmVwb3J0aW5nQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOwogaW1wb3J0IGFuZHJvaWQuYXBwLlVpQXV0b21hdGlvbjsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5Tm9kZUluZm87CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eVdpbmRvd0luZm87CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkF1dG9Db21wbGV0ZVRleHRWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IG9yZy5qdW5pdC5BZnRlckNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVvdXRFeGNlcHRpb247CiAKIC8qKgotICogVGVzdHMgdGhhdCBBY2Nlc3NpYmlsaXR5V2luZG93SW5mb3MgYXJlIHByb3Blcmx5IHBvcHVsYXRlZAorICogVGVzdHMgdGhhdCB3aW5kb3cgY2hhbmdlcyBwcm9kdWNlIHRoZSBjb3JyZWN0IGV2ZW50cyBhbmQgdGhhdCBBY2Nlc3NpYmlsaXR5V2luZG93SW5mb3MgYXJlCisgKiBwcm9wZXJseSBwb3B1bGF0ZWQKICAqLwotcHVibGljIGNsYXNzIEFjY2Vzc2liaWxpdHlXaW5kb3dSZXBvcnRpbmdUZXN0Ci0gICAgICAgIGV4dGVuZHMgQWNjZXNzaWJpbGl0eUFjdGl2aXR5VGVzdENhc2U8QWNjZXNzaWJpbGl0eVdpbmRvd1JlcG9ydGluZ0FjdGl2aXR5PiB7Ci0gICAgVWlBdXRvbWF0aW9uIG1VaUF1dG9tYXRpb247CitAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIEFjY2Vzc2liaWxpdHlXaW5kb3dSZXBvcnRpbmdUZXN0IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVElNRU9VVF9BU1lOQ19QUk9DRVNTSU5HID0gNTAwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDaGFyU2VxdWVuY2UgVE9QX1dJTkRPV19USVRMRSA9CisgICAgICAgICAgICAiYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHMuQWNjZXNzaWJpbGl0eVdpbmRvd1JlcG9ydGluZ1Rlc3QuVE9QX1dJTkRPV19USVRMRSI7CiAKLSAgICBwdWJsaWMgQWNjZXNzaWJpbGl0eVdpbmRvd1JlcG9ydGluZ1Rlc3QoKSB7Ci0gICAgICAgIHN1cGVyKEFjY2Vzc2liaWxpdHlXaW5kb3dSZXBvcnRpbmdBY3Rpdml0eS5jbGFzcyk7Ci0gICAgfQorICAgIHByaXZhdGUgc3RhdGljIEluc3RydW1lbnRhdGlvbiBzSW5zdHJ1bWVudGF0aW9uOworICAgIHByaXZhdGUgc3RhdGljIFVpQXV0b21hdGlvbiBzVWlBdXRvbWF0aW9uOworICAgIHByaXZhdGUgQWN0aXZpdHkgbUFjdGl2aXR5OworICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1BY3Rpdml0eVRpdGxlOwogCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgbVVpQXV0b21hdGlvbiA9IGdldEluc3RydW1lbnRhdGlvbigpLmdldFVpQXV0b21hdGlvbigpOwotICAgICAgICBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8gaW5mbyA9IG1VaUF1dG9tYXRpb24uZ2V0U2VydmljZUluZm8oKTsKKyAgICBAUnVsZQorICAgIHB1YmxpYyBBY3Rpdml0eVRlc3RSdWxlPEFjY2Vzc2liaWxpdHlXaW5kb3dSZXBvcnRpbmdBY3Rpdml0eT4gbUFjdGl2aXR5UnVsZSA9CisgICAgICAgICAgICBuZXcgQWN0aXZpdHlUZXN0UnVsZTw+KEFjY2Vzc2liaWxpdHlXaW5kb3dSZXBvcnRpbmdBY3Rpdml0eS5jbGFzcywgZmFsc2UsIGZhbHNlKTsKKworICAgIEBCZWZvcmVDbGFzcworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBvbmVUaW1lU2V0dXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc0luc3RydW1lbnRhdGlvbiA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpOworICAgICAgICBzVWlBdXRvbWF0aW9uID0gc0luc3RydW1lbnRhdGlvbi5nZXRVaUF1dG9tYXRpb24oKTsKKyAgICAgICAgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvIGluZm8gPSBzVWlBdXRvbWF0aW9uLmdldFNlcnZpY2VJbmZvKCk7CiAgICAgICAgIGluZm8uZmxhZ3MgfD0gQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvLkZMQUdfUkVUUklFVkVfSU5URVJBQ1RJVkVfV0lORE9XUzsKLSAgICAgICAgbVVpQXV0b21hdGlvbi5zZXRTZXJ2aWNlSW5mbyhpbmZvKTsKKyAgICAgICAgc1VpQXV0b21hdGlvbi5zZXRTZXJ2aWNlSW5mbyhpbmZvKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtVWlBdXRvbWF0aW9uLmRlc3Ryb3koKTsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICBAQWZ0ZXJDbGFzcworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBmaW5hbFRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHNVaUF1dG9tYXRpb24uZGVzdHJveSgpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHRlc3RXaW5kb3dUaXRsZV9nZXRUaXRsZVJldHVybnNUaXRsZSgpIHsKLSAgICAgICAgQWNjZXNzaWJpbGl0eVdpbmRvd0luZm8gd2luZG93ID0gZmluZFdpbmRvd0J5VGl0bGUoZ2V0QWN0aXZpdHkoKS5nZXRUaXRsZSgpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiV2luZG93IHRpdGxlIG5vdCByZXBvcnRlZCB0byBhY2Nlc3NpYmlsaXR5Iiwgd2luZG93KTsKLSAgICAgICAgd2luZG93LnJlY3ljbGUoKTsKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbUFjdGl2aXR5ID0gbGF1bmNoQWN0aXZpdHlBbmRXYWl0Rm9ySXRUb0JlT25zY3JlZW4oCisgICAgICAgICAgICAgICAgc0luc3RydW1lbnRhdGlvbiwgc1VpQXV0b21hdGlvbiwgbUFjdGl2aXR5UnVsZSk7CisgICAgICAgIG1BY3Rpdml0eVRpdGxlID0gZ2V0QWN0aXZpdHlUaXRsZShzSW5zdHJ1bWVudGF0aW9uLCBtQWN0aXZpdHkpOwogICAgIH0KIAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFVwZGF0ZWRXaW5kb3dUaXRsZV9nZW5lcmF0ZXNFdmVudEFuZElzUmV0dXJuZWRCeUdldFRpdGxlKCkgewogICAgICAgICBmaW5hbCBTdHJpbmcgdXBkYXRlZFRpdGxlID0gIlVwZGF0ZWQgVGl0bGUiOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgbVVpQXV0b21hdGlvbi5leGVjdXRlQW5kV2FpdEZvckV2ZW50KG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpLnJ1bk9uTWFpblN5bmMobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QWN0aXZpdHkoKS5zZXRUaXRsZSh1cGRhdGVkVGl0bGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9LCBuZXcgVWlBdXRvbWF0aW9uLkFjY2Vzc2liaWxpdHlFdmVudEZpbHRlcigpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoQWNjZXNzaWJpbGl0eUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoZXZlbnQuZ2V0RXZlbnRUeXBlKCkgPT0gQWNjZXNzaWJpbGl0eUV2ZW50LlRZUEVfV0lORE9XU19DSEFOR0VEKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9LCBUSU1FT1VUX0FTWU5DX1BST0NFU1NJTkcpOworICAgICAgICAgICAgc1VpQXV0b21hdGlvbi5leGVjdXRlQW5kV2FpdEZvckV2ZW50KCgpIC0+IHNJbnN0cnVtZW50YXRpb24ucnVuT25NYWluU3luYygKKyAgICAgICAgICAgICAgICAgICAgKCkgLT4gbUFjdGl2aXR5LnNldFRpdGxlKHVwZGF0ZWRUaXRsZSkpLAorICAgICAgICAgICAgICAgICAgICBmaWx0ZXJXaW5kb3dzQ2hhbmdlZFdpdGhDaGFuZ2VUeXBlcyhXSU5ET1dTX0NIQU5HRV9USVRMRSksCisgICAgICAgICAgICAgICAgICAgIFRJTUVPVVRfQVNZTkNfUFJPQ0VTU0lORyk7CiAgICAgICAgIH0gY2F0Y2ggKFRpbWVvdXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgd2luZG93cyBjaGFuZ2VkIGV2ZW50IGZvciB0aXRsZSB1cGRhdGUiLCBleGNlcHRpb24pOwogICAgICAgICB9Ci0gICAgICAgIEFjY2Vzc2liaWxpdHlXaW5kb3dJbmZvIHdpbmRvdyA9IGZpbmRXaW5kb3dCeVRpdGxlKHVwZGF0ZWRUaXRsZSk7CisgICAgICAgIGZpbmFsIEFjY2Vzc2liaWxpdHlXaW5kb3dJbmZvIHdpbmRvdyA9IGZpbmRXaW5kb3dCeVRpdGxlKHNVaUF1dG9tYXRpb24sIHVwZGF0ZWRUaXRsZSk7CiAgICAgICAgIGFzc2VydE5vdE51bGwoIlVwZGF0ZWQgd2luZG93IHRpdGxlIG5vdCByZXBvcnRlZCB0byBhY2Nlc3NpYmlsaXR5Iiwgd2luZG93KTsKICAgICAgICAgd2luZG93LnJlY3ljbGUoKTsKICAgICB9CiAKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXaW5kb3dBZGRlZE1vdmVkQW5kUmVtb3ZlZF9nZW5lcmF0ZXNFdmVudHNGb3JBbGxUaHJlZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBwYXJhbXNGb3JUb3AgPSBsYXlvdXRQYXJtc0ZvcldpbmRvd09uVG9wKCk7CisgICAgICAgIGZpbmFsIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIHBhcmFtc0ZvckJvdHRvbSA9IGxheW91dFBhcm1zRm9yV2luZG93T25Cb3R0b20oKTsKKyAgICAgICAgZmluYWwgQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24obUFjdGl2aXR5KTsKKyAgICAgICAgYnV0dG9uLnNldFRleHQoUi5zdHJpbmcuYnV0dG9uMSk7CisgICAgICAgIHNVaUF1dG9tYXRpb24uZXhlY3V0ZUFuZFdhaXRGb3JFdmVudCgoKSAtPiBzSW5zdHJ1bWVudGF0aW9uLnJ1bk9uTWFpblN5bmMoCisgICAgICAgICAgICAgICAgKCkgLT4gbUFjdGl2aXR5LmdldFdpbmRvd01hbmFnZXIoKS5hZGRWaWV3KGJ1dHRvbiwgcGFyYW1zRm9yVG9wKSksCisgICAgICAgICAgICAgICAgZmlsdGVyV2luZG93c0NoYW5nZWRXaXRoQ2hhbmdlVHlwZXMoV0lORE9XU19DSEFOR0VfQURERUQpLAorICAgICAgICAgICAgICAgIFRJTUVPVVRfQVNZTkNfUFJPQ0VTU0lORyk7CisKKyAgICAgICAgLy8gTW92ZSB3aW5kb3cgZnJvbSB0b3AgdG8gYm90dG9tCisgICAgICAgIHNVaUF1dG9tYXRpb24uZXhlY3V0ZUFuZFdhaXRGb3JFdmVudCgoKSAtPiBzSW5zdHJ1bWVudGF0aW9uLnJ1bk9uTWFpblN5bmMoCisgICAgICAgICAgICAgICAgKCkgLT4gbUFjdGl2aXR5LmdldFdpbmRvd01hbmFnZXIoKS51cGRhdGVWaWV3TGF5b3V0KGJ1dHRvbiwgcGFyYW1zRm9yQm90dG9tKSksCisgICAgICAgICAgICAgICAgZmlsdGVyV2luZG93c0NoYW5nZWRXaXRoQ2hhbmdlVHlwZXMoV0lORE9XU19DSEFOR0VfQk9VTkRTKSwKKyAgICAgICAgICAgICAgICBUSU1FT1VUX0FTWU5DX1BST0NFU1NJTkcpOworICAgICAgICAvLyBSZW1vdmUgdGhlIHZpZXcKKyAgICAgICAgc1VpQXV0b21hdGlvbi5leGVjdXRlQW5kV2FpdEZvckV2ZW50KCgpIC0+IHNJbnN0cnVtZW50YXRpb24ucnVuT25NYWluU3luYygKKyAgICAgICAgICAgICAgICAoKSAtPiBtQWN0aXZpdHkuZ2V0V2luZG93TWFuYWdlcigpLnJlbW92ZVZpZXcoYnV0dG9uKSksCisgICAgICAgICAgICAgICAgZmlsdGVyV2luZG93c0NoYW5nZWRXaXRoQ2hhbmdlVHlwZXMoV0lORE9XU19DSEFOR0VfUkVNT1ZFRCksCisgICAgICAgICAgICAgICAgVElNRU9VVF9BU1lOQ19QUk9DRVNTSU5HKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHB1dFdpbmRvd0luUGljdHVyZUluUGljdHVyZV9nZW5lcmF0ZXNFdmVudEFuZFJlcG9ydHNQcm9wZXJ0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIXNJbnN0cnVtZW50YXRpb24uZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VNYW5hZ2VyKCkKKyAgICAgICAgICAgICAgICAuaGFzU3lzdGVtRmVhdHVyZShGRUFUVVJFX1BJQ1RVUkVfSU5fUElDVFVSRSkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzVWlBdXRvbWF0aW9uLmV4ZWN1dGVBbmRXYWl0Rm9yRXZlbnQoCisgICAgICAgICAgICAgICAgKCkgLT4gc0luc3RydW1lbnRhdGlvbi5ydW5Pbk1haW5TeW5jKCgpIC0+IG1BY3Rpdml0eS5lbnRlclBpY3R1cmVJblBpY3R1cmVNb2RlKCkpLAorICAgICAgICAgICAgICAgIChldmVudCkgLT4geworICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0RXZlbnRUeXBlKCkgIT0gVFlQRV9XSU5ET1dTX0NIQU5HRUQpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgLy8gTG9vayBmb3IgYSBwaWN0dXJlLWluLXBpY3R1cmUgd2luZG93CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8QWNjZXNzaWJpbGl0eVdpbmRvd0luZm8+IHdpbmRvd3MgPSBzVWlBdXRvbWF0aW9uLmdldFdpbmRvd3MoKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHdpbmRvd0NvdW50ID0gd2luZG93cy5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd2luZG93Q291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvd3MuZ2V0KGkpLmlzSW5QaWN0dXJlSW5QaWN0dXJlTW9kZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0sIFRJTUVPVVRfQVNZTkNfUFJPQ0VTU0lORyk7CisKKyAgICAgICAgLy8gVGhlcmUgc2hvdWxkIGJlIGV4YWN0bHkgb25lIHBpY3R1cmUtaW4tcGljdHVyZSB3aW5kb3cgbm93CisgICAgICAgIGludCBudW1QaWN0dXJlSW5QaWN0dXJlV2luZG93cyA9IDA7CisgICAgICAgIGZpbmFsIExpc3Q8QWNjZXNzaWJpbGl0eVdpbmRvd0luZm8+IHdpbmRvd3MgPSBzVWlBdXRvbWF0aW9uLmdldFdpbmRvd3MoKTsKKyAgICAgICAgZmluYWwgaW50IHdpbmRvd0NvdW50ID0gd2luZG93cy5zaXplKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd2luZG93Q291bnQ7IGkrKykgeworICAgICAgICAgICAgZmluYWwgQWNjZXNzaWJpbGl0eVdpbmRvd0luZm8gd2luZG93ID0gd2luZG93cy5nZXQoaSk7CisgICAgICAgICAgICBpZiAod2luZG93LmlzSW5QaWN0dXJlSW5QaWN0dXJlTW9kZSgpKSB7CisgICAgICAgICAgICAgICAgbnVtUGljdHVyZUluUGljdHVyZVdpbmRvd3MrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKG51bVBpY3R1cmVJblBpY3R1cmVXaW5kb3dzID49IDEpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgbW92ZUZvY3VzVG9Bbm90aGVyV2luZG93X2dlbmVyYXRlc0V2ZW50c0FuZE1vdmVzQWN0aXZlQW5kRm9jdXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgVmlldyB0b3BXaW5kb3dWaWV3ID0gc2hvd1RvcFdpbmRvd0FuZFdhaXRGb3JJdFRvU2hvd1VwKCk7CisgICAgICAgIGZpbmFsIEFjY2Vzc2liaWxpdHlXaW5kb3dJbmZvIHRvcFdpbmRvdyA9CisgICAgICAgICAgICAgICAgZmluZFdpbmRvd0J5VGl0bGUoc1VpQXV0b21hdGlvbiwgVE9QX1dJTkRPV19USVRMRSk7CisKKyAgICAgICAgQWNjZXNzaWJpbGl0eVdpbmRvd0luZm8gYWN0aXZpdHlXaW5kb3cgPSBmaW5kV2luZG93QnlUaXRsZShzVWlBdXRvbWF0aW9uLCBtQWN0aXZpdHlUaXRsZSk7CisgICAgICAgIGZpbmFsIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBidXR0b25Ob2RlID0KKyAgICAgICAgICAgICAgICB0b3BXaW5kb3cuZ2V0Um9vdCgpLmZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9zQnlUZXh0KAorICAgICAgICAgICAgICAgICAgICAgICAgc0luc3RydW1lbnRhdGlvbi5nZXRDb250ZXh0KCkuZ2V0U3RyaW5nKFIuc3RyaW5nLmJ1dHRvbjEpKS5nZXQoMCk7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIGFjdGl2aXR5V2luZG93IGlzIG5vdCBmb2N1c2VkCisgICAgICAgIGlmIChhY3Rpdml0eVdpbmRvdy5pc0ZvY3VzZWQoKSkgeworICAgICAgICAgICAgc1VpQXV0b21hdGlvbi5leGVjdXRlQW5kV2FpdEZvckV2ZW50KAorICAgICAgICAgICAgICAgICAgICAoKSAtPiBidXR0b25Ob2RlLnBlcmZvcm1BY3Rpb24oQWNjZXNzaWJpbGl0eU5vZGVJbmZvLkFDVElPTl9GT0NVUyksCisgICAgICAgICAgICAgICAgICAgIGZpbHRlcldpbmRvd3NDaGFuZ2VkV2l0aENoYW5nZVR5cGVzKFdJTkRPV1NfQ0hBTkdFX0ZPQ1VTRUQpLAorICAgICAgICAgICAgICAgICAgICBUSU1FT1VUX0FTWU5DX1BST0NFU1NJTkcpOworICAgICAgICB9CisKKyAgICAgICAgLy8gV2luZG93cyBtYXkgaGF2ZSBjaGFuZ2VkIC0gcmVmcmVzaAorICAgICAgICBhY3Rpdml0eVdpbmRvdyA9IGZpbmRXaW5kb3dCeVRpdGxlKHNVaUF1dG9tYXRpb24sIG1BY3Rpdml0eVRpdGxlKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoYWN0aXZpdHlXaW5kb3cuaXNBY3RpdmUoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGFjdGl2aXR5V2luZG93LmlzRm9jdXNlZCgpKTsKKworICAgICAgICAvLyBGaW5kIGEgZm9jdXNhYmxlIHZpZXcgaW4gdGhlIG1haW4gYWN0aXZpdHkgbWVudQorICAgICAgICBmaW5hbCBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gYXV0b0NvbXBsZXRlVGV4dEluZm8gPSBhY3Rpdml0eVdpbmRvdy5nZXRSb290KCkKKyAgICAgICAgICAgICAgICAuZmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb3NCeVZpZXdJZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLmN0czppZC9hdXRvQ29tcGxldGVMYXlvdXQiKQorICAgICAgICAgICAgICAgIC5nZXQoMCk7CisKKyAgICAgICAgLy8gUmVtb3ZlIHRoZSB0b3Agd2luZG93IGFuZCBmb2N1cyBvbiB0aGUgbWFpbiBhY3Rpdml0eQorICAgICAgICBzVWlBdXRvbWF0aW9uLmV4ZWN1dGVBbmRXYWl0Rm9yRXZlbnQoCisgICAgICAgICAgICAgICAgKCkgLT4geworICAgICAgICAgICAgICAgICAgICBzSW5zdHJ1bWVudGF0aW9uLnJ1bk9uTWFpblN5bmMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4gbUFjdGl2aXR5LmdldFdpbmRvd01hbmFnZXIoKS5yZW1vdmVWaWV3KHRvcFdpbmRvd1ZpZXcpKTsKKyAgICAgICAgICAgICAgICAgICAgYnV0dG9uTm9kZS5wZXJmb3JtQWN0aW9uKEFjY2Vzc2liaWxpdHlOb2RlSW5mby5BQ1RJT05fRk9DVVMpOworICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgZmlsdGVyV2luZG93c0NoYW5nZWRXaXRoQ2hhbmdlVHlwZXMoV0lORE9XU19DSEFOR0VfRk9DVVNFRCB8IFdJTkRPV1NfQ0hBTkdFX0FDVElWRSksCisgICAgICAgICAgICAgICAgVElNRU9VVF9BU1lOQ19QUk9DRVNTSU5HKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VBY2Nlc3NpYmlsaXR5Rm9jdXNXaW5kb3dfZ2V0RXZlbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvIGluZm8gPSBzVWlBdXRvbWF0aW9uLmdldFNlcnZpY2VJbmZvKCk7CisgICAgICAgIGluZm8uZmxhZ3MgfD0gQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvLkZMQUdfUkVRVUVTVF9UT1VDSF9FWFBMT1JBVElPTl9NT0RFOworICAgICAgICBzVWlBdXRvbWF0aW9uLnNldFNlcnZpY2VJbmZvKGluZm8pOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzaG93VG9wV2luZG93QW5kV2FpdEZvckl0VG9TaG93VXAoKTsKKworICAgICAgICAgICAgZmluYWwgQWNjZXNzaWJpbGl0eVdpbmRvd0luZm8gYWN0aXZpdHlXaW5kb3cgPQorICAgICAgICAgICAgICAgICAgICBmaW5kV2luZG93QnlUaXRsZShzVWlBdXRvbWF0aW9uLCBtQWN0aXZpdHlUaXRsZSk7CisgICAgICAgICAgICBmaW5hbCBBY2Nlc3NpYmlsaXR5V2luZG93SW5mbyB0b3BXaW5kb3cgPQorICAgICAgICAgICAgICAgICAgICBmaW5kV2luZG93QnlUaXRsZShzVWlBdXRvbWF0aW9uLCBUT1BfV0lORE9XX1RJVExFKTsKKyAgICAgICAgICAgIGZpbmFsIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyB3aW4yTm9kZSA9CisgICAgICAgICAgICAgICAgICAgIHRvcFdpbmRvdy5nZXRSb290KCkuZmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb3NCeVRleHQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0luc3RydW1lbnRhdGlvbi5nZXRDb250ZXh0KCkuZ2V0U3RyaW5nKFIuc3RyaW5nLmJ1dHRvbjEpKS5nZXQoMCk7CisgICAgICAgICAgICBmaW5hbCBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gd2luMU5vZGUgPSBhY3Rpdml0eVdpbmRvdy5nZXRSb290KCkKKyAgICAgICAgICAgICAgICAgICAgLmZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9zQnlWaWV3SWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuY3RzOmlkL2F1dG9Db21wbGV0ZUxheW91dCIpCisgICAgICAgICAgICAgICAgICAgIC5nZXQoMCk7CisKKyAgICAgICAgICAgIHNVaUF1dG9tYXRpb24uZXhlY3V0ZUFuZFdhaXRGb3JFdmVudCgKKyAgICAgICAgICAgICAgICAgICAgKCkgLT4geworICAgICAgICAgICAgICAgICAgICAgICAgd2luMk5vZGUucGVyZm9ybUFjdGlvbihBY2Nlc3NpYmlsaXR5Tm9kZUluZm8uQUNUSU9OX0FDQ0VTU0lCSUxJVFlfRk9DVVMpOworICAgICAgICAgICAgICAgICAgICAgICAgd2luMU5vZGUucGVyZm9ybUFjdGlvbihBY2Nlc3NpYmlsaXR5Tm9kZUluZm8uQUNUSU9OX0FDQ0VTU0lCSUxJVFlfRk9DVVMpOworICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICBmaWx0ZXJXaW5kb3dzQ2hhbmdlZFdpdGhDaGFuZ2VUeXBlcyhXSU5ET1dTX0NIQU5HRV9BQ0NFU1NJQklMSVRZX0ZPQ1VTRUQpLAorICAgICAgICAgICAgICAgICAgICBUSU1FT1VUX0FTWU5DX1BST0NFU1NJTkcpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaW5mby5mbGFncyAmPSB+QWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvLkZMQUdfUkVRVUVTVF9UT1VDSF9FWFBMT1JBVElPTl9NT0RFOworICAgICAgICAgICAgc1VpQXV0b21hdGlvbi5zZXRTZXJ2aWNlSW5mbyhpbmZvKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEdldEFuY2hvckZvckRyb3BEb3duRm9yQXV0b0NvbXBsZXRlVGV4dFZpZXdfcmV0dXJuc1RleHRWaWV3Tm9kZSgpIHsKICAgICAgICAgZmluYWwgQXV0b0NvbXBsZXRlVGV4dFZpZXcgYXV0b0NvbXBsZXRlVGV4dFZpZXcgPQotICAgICAgICAgICAgICAgIChBdXRvQ29tcGxldGVUZXh0VmlldykgZ2V0QWN0aXZpdHkoKS5maW5kVmlld0J5SWQoUi5pZC5hdXRvQ29tcGxldGVMYXlvdXQpOwotICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gYXV0b0NvbXBsZXRlVGV4dEluZm8gPSBtVWlBdXRvbWF0aW9uLmdldFJvb3RJbkFjdGl2ZVdpbmRvdygpCisgICAgICAgICAgICAgICAgKEF1dG9Db21wbGV0ZVRleHRWaWV3KSBtQWN0aXZpdHkuZmluZFZpZXdCeUlkKFIuaWQuYXV0b0NvbXBsZXRlTGF5b3V0KTsKKyAgICAgICAgZmluYWwgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIGF1dG9Db21wbGV0ZVRleHRJbmZvID0gc1VpQXV0b21hdGlvbi5nZXRSb290SW5BY3RpdmVXaW5kb3coKQogICAgICAgICAgICAgICAgIC5maW5kQWNjZXNzaWJpbGl0eU5vZGVJbmZvc0J5Vmlld0lkKAogICAgICAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuY3RzOmlkL2F1dG9Db21wbGV0ZUxheW91dCIpCiAgICAgICAgICAgICAgICAgLmdldCgwKTsKQEAgLTk4LDI1ICsyNjgsMTUgQEAKICAgICAgICAgZmluYWwgU3RyaW5nW10gQ09VTlRSSUVTID0gbmV3IFN0cmluZ1tdIHsiQmVsZ2l1bSIsICJGcmFuY2UiLCAiSXRhbHkiLCAiR2VybWFueSIsICJTcGFpbiJ9OwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtVWlBdXRvbWF0aW9uLmV4ZWN1dGVBbmRXYWl0Rm9yRXZlbnQobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkucnVuT25NYWluU3luYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheUFkYXB0ZXI8U3RyaW5nPiBhZGFwdGVyID0gbmV3IEFycmF5QWRhcHRlcjxTdHJpbmc+KGdldEFjdGl2aXR5KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLlIubGF5b3V0LnNpbXBsZV9kcm9wZG93bl9pdGVtXzFsaW5lLCBDT1VOVFJJRVMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9Db21wbGV0ZVRleHRWaWV3LnNldEFkYXB0ZXIoYWRhcHRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0NvbXBsZXRlVGV4dFZpZXcuc2hvd0Ryb3BEb3duKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0sIG5ldyBVaUF1dG9tYXRpb24uQWNjZXNzaWJpbGl0eUV2ZW50RmlsdGVyKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChBY2Nlc3NpYmlsaXR5RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV2ZW50LmdldEV2ZW50VHlwZSgpID09IEFjY2Vzc2liaWxpdHlFdmVudC5UWVBFX1dJTkRPV1NfQ0hBTkdFRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9LCBUSU1FT1VUX0FTWU5DX1BST0NFU1NJTkcpOworICAgICAgICAgICAgc1VpQXV0b21hdGlvbi5leGVjdXRlQW5kV2FpdEZvckV2ZW50KCgpIC0+IHNJbnN0cnVtZW50YXRpb24ucnVuT25NYWluU3luYygKKyAgICAgICAgICAgICAgICAgICAgKCkgLT4geworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQXJyYXlBZGFwdGVyPFN0cmluZz4gYWRhcHRlciA9IG5ldyBBcnJheUFkYXB0ZXI8PigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2aXR5LCBhbmRyb2lkLlIubGF5b3V0LnNpbXBsZV9kcm9wZG93bl9pdGVtXzFsaW5lLCBDT1VOVFJJRVMpOworICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0NvbXBsZXRlVGV4dFZpZXcuc2V0QWRhcHRlcihhZGFwdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9Db21wbGV0ZVRleHRWaWV3LnNob3dEcm9wRG93bigpOworICAgICAgICAgICAgICAgICAgICB9KSwKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyV2luZG93c0NoYW5nZWRXaXRoQ2hhbmdlVHlwZXMoV0lORE9XU19DSEFOR0VfQ0hJTERSRU4pLAorICAgICAgICAgICAgICAgICAgICBUSU1FT1VUX0FTWU5DX1BST0NFU1NJTkcpOwogICAgICAgICB9IGNhdGNoIChUaW1lb3V0RXhjZXB0aW9uIGV4Y2VwdGlvbikgewogICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IHdpbmRvdyBjaGFuZ2VkIGV2ZW50IHdoZW4gc2hvd2luZyBkcm9wZG93biIsIGV4Y2VwdGlvbik7CkBAIC0xMjQsOSArMjg0LDkgQEAKIAogICAgICAgICAvLyBGaW5kIHRoZSBwb3AtdXAgd2luZG93CiAgICAgICAgIGJvb2xlYW4gZm91bmRQb3B1cCA9IGZhbHNlOwotICAgICAgICBMaXN0PEFjY2Vzc2liaWxpdHlXaW5kb3dJbmZvPiB3aW5kb3dzID0gbVVpQXV0b21hdGlvbi5nZXRXaW5kb3dzKCk7CisgICAgICAgIGZpbmFsIExpc3Q8QWNjZXNzaWJpbGl0eVdpbmRvd0luZm8+IHdpbmRvd3MgPSBzVWlBdXRvbWF0aW9uLmdldFdpbmRvd3MoKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3aW5kb3dzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBBY2Nlc3NpYmlsaXR5V2luZG93SW5mbyB3aW5kb3cgPSB3aW5kb3dzLmdldChpKTsKKyAgICAgICAgICAgIGZpbmFsIEFjY2Vzc2liaWxpdHlXaW5kb3dJbmZvIHdpbmRvdyA9IHdpbmRvd3MuZ2V0KGkpOwogICAgICAgICAgICAgaWYgKHdpbmRvdy5nZXRBbmNob3IoKSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CkBAIC0xMzcsMTcgKzI5Nyw0OCBAQAogICAgICAgICBhc3NlcnRUcnVlKCJGYWlsZWQgdG8gZmluZCBhY2Nlc3NpYmlsaXR5IHdpbmRvdyBmb3IgYXV0by1jb21wbGV0ZSBwb3AtdXAiLCBmb3VuZFBvcHVwKTsKICAgICB9CiAKLSAgICBwcml2YXRlIEFjY2Vzc2liaWxpdHlXaW5kb3dJbmZvIGZpbmRXaW5kb3dCeVRpdGxlKENoYXJTZXF1ZW5jZSB0aXRsZSkgewotICAgICAgICBMaXN0PEFjY2Vzc2liaWxpdHlXaW5kb3dJbmZvPiB3aW5kb3dzID0gbVVpQXV0b21hdGlvbi5nZXRXaW5kb3dzKCk7Ci0gICAgICAgIEFjY2Vzc2liaWxpdHlXaW5kb3dJbmZvIHJldHVyblZhbHVlID0gbnVsbDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3aW5kb3dzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBBY2Nlc3NpYmlsaXR5V2luZG93SW5mbyB3aW5kb3cgPSB3aW5kb3dzLmdldChpKTsKLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuZXF1YWxzKHRpdGxlLCB3aW5kb3cuZ2V0VGl0bGUoKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IHdpbmRvdzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgd2luZG93LnJlY3ljbGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7CisgICAgcHJpdmF0ZSBWaWV3IHNob3dUb3BXaW5kb3dBbmRXYWl0Rm9ySXRUb1Nob3dVcCgpIHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgcGFyYW1zRm9yVG9wID0gbGF5b3V0UGFybXNGb3JXaW5kb3dPblRvcCgpOworICAgICAgICBmaW5hbCBCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihtQWN0aXZpdHkpOworICAgICAgICBidXR0b24uc2V0VGV4dChSLnN0cmluZy5idXR0b24xKTsKKyAgICAgICAgc1VpQXV0b21hdGlvbi5leGVjdXRlQW5kV2FpdEZvckV2ZW50KCgpIC0+IHNJbnN0cnVtZW50YXRpb24ucnVuT25NYWluU3luYygKKyAgICAgICAgICAgICAgICAoKSAtPiBtQWN0aXZpdHkuZ2V0V2luZG93TWFuYWdlcigpLmFkZFZpZXcoYnV0dG9uLCBwYXJhbXNGb3JUb3ApKSwKKyAgICAgICAgICAgICAgICAoZXZlbnQpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChldmVudC5nZXRFdmVudFR5cGUoKSA9PSBUWVBFX1dJTkRPV1NfQ0hBTkdFRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoZmluZFdpbmRvd0J5VGl0bGUoc1VpQXV0b21hdGlvbiwgbUFjdGl2aXR5VGl0bGUpICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGZpbmRXaW5kb3dCeVRpdGxlKHNVaUF1dG9tYXRpb24sIFRPUF9XSU5ET1dfVElUTEUpICE9IG51bGwpOworICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgVElNRU9VVF9BU1lOQ19QUk9DRVNTSU5HKTsKKyAgICAgICAgcmV0dXJuIGJ1dHRvbjsKICAgICB9Ci19CisKKyAgICBwcml2YXRlIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIGxheW91dFBhcm1zRm9yV2luZG93T25Ub3AoKSB7CisgICAgICAgIGZpbmFsIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIHBhcmFtcyA9IGxheW91dFBhcm1zRm9yVGVzdFdpbmRvdygpOworICAgICAgICBwYXJhbXMuZ3Jhdml0eSA9IEdyYXZpdHkuVE9QOworICAgICAgICBwYXJhbXMuc2V0VGl0bGUoVE9QX1dJTkRPV19USVRMRSk7CisgICAgICAgIHNJbnN0cnVtZW50YXRpb24ucnVuT25NYWluU3luYygoKSAtPiB7CisgICAgICAgICAgICBwYXJhbXMueSA9IGdldFN0YXR1c0JhckhlaWdodChtQWN0aXZpdHkpOworICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIHBhcmFtczsKKyAgICB9CisKKyAgICBwcml2YXRlIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIGxheW91dFBhcm1zRm9yV2luZG93T25Cb3R0b20oKSB7CisgICAgICAgIGZpbmFsIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIHBhcmFtcyA9IGxheW91dFBhcm1zRm9yVGVzdFdpbmRvdygpOworICAgICAgICBwYXJhbXMuZ3Jhdml0eSA9IEdyYXZpdHkuQk9UVE9NOworICAgICAgICByZXR1cm4gcGFyYW1zOworICAgIH0KKworICAgIHByaXZhdGUgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgbGF5b3V0UGFybXNGb3JUZXN0V2luZG93KCkgeworICAgICAgICBmaW5hbCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBwYXJhbXMgPSBuZXcgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMoKTsKKyAgICAgICAgcGFyYW1zLndpZHRoID0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UOworICAgICAgICBwYXJhbXMuaGVpZ2h0ID0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UOworICAgICAgICBwYXJhbXMuZmxhZ3MgPSBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0xBWU9VVF9JTl9TQ1JFRU4KKyAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX1RPVUNIX01PREFMCisgICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0xBWU9VVF9JTlNFVF9ERUNPUjsKKyAgICAgICAgcGFyYW1zLnR5cGUgPSBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5UWVBFX0FQUExJQ0FUSU9OX1BBTkVMOworICAgICAgICBzSW5zdHJ1bWVudGF0aW9uLnJ1bk9uTWFpblN5bmMoKCkgLT4geworICAgICAgICAgICAgcGFyYW1zLnRva2VuID0gbUFjdGl2aXR5LmdldFdpbmRvdygpLmdldERlY29yVmlldygpLmdldFdpbmRvd1Rva2VuKCk7CisgICAgICAgIH0pOworICAgICAgICByZXR1cm4gcGFyYW1zOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9jdHMvR2VzdHVyZURlc2NyaXB0aW9uVGVzdC5qYXZhIGIvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2Uvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvY3RzL0dlc3R1cmVEZXNjcmlwdGlvblRlc3QuamF2YQppbmRleCAzZGY4ZDBjLi45MjgyMWI4IDEwMDY0NAotLS0gYS90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9jdHMvR2VzdHVyZURlc2NyaXB0aW9uVGVzdC5qYXZhCisrKyBiL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy9HZXN0dXJlRGVzY3JpcHRpb25UZXN0LmphdmEKQEAgLTE4LDExICsxOCwxNSBAQAogaW1wb3J0IGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuR2VzdHVyZURlc2NyaXB0aW9uLlN0cm9rZURlc2NyaXB0aW9uOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGF0aDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhdGhNZWFzdXJlOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUHJlc3VibWl0OwogaW1wb3J0IGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0Q2FzZTsKIAogLyoqCiAgKiBUZXN0cyBmb3IgY3JlYXRpbmcgZ2VzdHVyZSBkZXNjcmlwdGlvbnMuCiAgKi8KK0BQcmVzdWJtaXQKK0BBcHBNb2RlRnVsbAogcHVibGljIGNsYXNzIEdlc3R1cmVEZXNjcmlwdGlvblRlc3QgZXh0ZW5kcyBJbnN0cnVtZW50YXRpb25UZXN0Q2FzZSB7CiAgICAgc3RhdGljIGZpbmFsIGludCBOT01JTkFMX1BBVEhfRFVSQVRJT04gPSAxMDA7CiAgICAgcHJpdmF0ZSBQYXRoIG1Ob21pbmFsUGF0aDsKZGlmZiAtLWdpdCBhL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy9JbnN0cnVtZW50ZWRBY2Nlc3NpYmlsaXR5U2VydmljZS5qYXZhIGIvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2Uvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvY3RzL0luc3RydW1lbnRlZEFjY2Vzc2liaWxpdHlTZXJ2aWNlLmphdmEKaW5kZXggMmI2ZDJkZC4uZmU1OTVhNCAxMDA2NDQKLS0tIGEvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2Uvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvY3RzL0luc3RydW1lbnRlZEFjY2Vzc2liaWxpdHlTZXJ2aWNlLmphdmEKKysrIGIvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2Uvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvY3RzL0luc3RydW1lbnRlZEFjY2Vzc2liaWxpdHlTZXJ2aWNlLmphdmEKQEAgLTEsMyArMSwxOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKIHBhY2thZ2UgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHM7CiAKIGltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlOwpAQCAtNyw3ICsyMyw3IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5DYWxsU3VwZXI7CitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5DYWxsU3VwZXI7CiBpbXBvcnQgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RDYXNlOwogaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5TWFuYWdlcjsKQEAgLTIyLDExICszOCwxNSBAQAogaW1wb3J0IHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0LmFzc2VydFRydWU7CiAKIHB1YmxpYyBjbGFzcyBJbnN0cnVtZW50ZWRBY2Nlc3NpYmlsaXR5U2VydmljZSBleHRlbmRzIEFjY2Vzc2liaWxpdHlTZXJ2aWNlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKKwogICAgIC8vIE1hdGNoIGNvbS5hbmRyb2lkLnNlcnZlci5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZSNDT01QT05FTlRfTkFNRV9TRVBBUkFUT1IKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUE9ORU5UX05BTUVfU0VQQVJBVE9SID0gIjoiOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRJTUVPVVRfU0VSVklDRV9FTkFCTEUgPSAxMDAwMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVElNRU9VVF9TRVJWSUNFX1BFUkZPUk1fU1lOQyA9IDUwMDA7CisgICAgLy8gVGltZW91dCBkaXNhYmxlZCBpbiAjREVCVUcgbW9kZSB0byBwcmV2ZW50IGJyZWFrcG9pbnQtcmVsYXRlZCBmYWlsdXJlcworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUSU1FT1VUX1NFUlZJQ0VfRU5BQkxFID0gREVCVUcgPyBJbnRlZ2VyLk1BWF9WQUxVRSA6IDEwMDAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUSU1FT1VUX1NFUlZJQ0VfUEVSRk9STV9TWU5DID0gREVCVUcgPyBJbnRlZ2VyLk1BWF9WQUxVRSA6IDUwMDA7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoTWFwPENsYXNzLCBXZWFrUmVmZXJlbmNlPEluc3RydW1lbnRlZEFjY2Vzc2liaWxpdHlTZXJ2aWNlPj4KICAgICAgICAgICAgIHNJbnN0YW5jZXMgPSBuZXcgSGFzaE1hcDw+KCk7CkBAIC0xMjMsNyArMTQzLDYgQEAKICAgICAgICAgaWYgKGVuYWJsZWRTZXJ2aWNlcyAhPSBudWxsKSB7CiAgICAgICAgICAgICBhc3NlcnRGYWxzZSgiU2VydmljZSBpcyBhbHJlYWR5IGVuYWJsZWQiLCBlbmFibGVkU2VydmljZXMuY29udGFpbnMoc2VydmljZU5hbWUpKTsKICAgICAgICAgfQotCiAgICAgICAgIGZpbmFsIEFjY2Vzc2liaWxpdHlNYW5hZ2VyIG1hbmFnZXIgPSAoQWNjZXNzaWJpbGl0eU1hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZSgKICAgICAgICAgICAgICAgICBDb250ZXh0LkFDQ0VTU0lCSUxJVFlfU0VSVklDRSk7CiAgICAgICAgIGZpbmFsIExpc3Q8QWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvPiBzZXJ2aWNlSW5mb3MgPQpkaWZmIC0tZ2l0IGEvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2Uvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvY3RzL01hZ25pZmljYXRpb25HZXN0dXJlSGFuZGxlclRlc3QuamF2YSBiL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy9NYWduaWZpY2F0aW9uR2VzdHVyZUhhbmRsZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ1NmIyMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy9NYWduaWZpY2F0aW9uR2VzdHVyZUhhbmRsZXJUZXN0LmphdmEKQEAgLTAsMCArMSwzMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuY3RzOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuY3RzLnV0aWxzLkFzeW5jVXRpbHMuYXdhaXQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuY3RzLnV0aWxzLkFzeW5jVXRpbHMud2FpdE9uOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLmN0cy51dGlscy5HZXN0dXJlVXRpbHMuYWRkOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLmN0cy51dGlscy5HZXN0dXJlVXRpbHMuY2xpY2s7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuY3RzLnV0aWxzLkdlc3R1cmVVdGlscy5kaXNwYXRjaEdlc3R1cmU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuY3RzLnV0aWxzLkdlc3R1cmVVdGlscy5kaXN0YW5jZTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHMudXRpbHMuR2VzdHVyZVV0aWxzLmRyYWc7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuY3RzLnV0aWxzLkdlc3R1cmVVdGlscy5lbmRUaW1lT2Y7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuY3RzLnV0aWxzLkdlc3R1cmVVdGlscy5sYXN0UG9pbnRPZjsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHMudXRpbHMuR2VzdHVyZVV0aWxzLmxvbmdDbGljazsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHMudXRpbHMuR2VzdHVyZVV0aWxzLnBvaW50ZXJEb3duOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLmN0cy51dGlscy5HZXN0dXJlVXRpbHMucG9pbnRlclVwOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLmN0cy51dGlscy5HZXN0dXJlVXRpbHMuc3RhcnRpbmdBdDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHMudXRpbHMuR2VzdHVyZVV0aWxzLnN3aXBlOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQuQUNUSU9OX0RPV047CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudC5BQ1RJT05fTU9WRTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50LkFDVElPTl9VUDsKKworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuZW1wdHk7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCitpbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5HZXN0dXJlRGVzY3JpcHRpb247CitpbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5HZXN0dXJlRGVzY3JpcHRpb24uU3Ryb2tlRGVzY3JpcHRpb247CitpbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHMuQWNjZXNzaWJpbGl0eUdlc3R1cmVEaXNwYXRjaFRlc3QuR2VzdHVyZURpc3BhdGNoQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHMudXRpbHMuRXZlbnRDYXB0dXJpbmdUb3VjaExpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb2ludEY7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQuU0VDT05EUzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworLyoqCisgKiBDbGFzcyBmb3IgdGVzdGluZyBtYWduaWZpY2F0aW9uLgorICovCitAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQorQEFwcE1vZGVGdWxsCitwdWJsaWMgY2xhc3MgTWFnbmlmaWNhdGlvbkdlc3R1cmVIYW5kbGVyVGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUgTUlOX1NDQUxFID0gMS4yOworCisgICAgcHJpdmF0ZSBJbnN0cnVtZW50ZWRBY2Nlc3NpYmlsaXR5U2VydmljZSBtU2VydmljZTsKKyAgICBwcml2YXRlIEluc3RydW1lbnRhdGlvbiBtSW5zdHJ1bWVudGF0aW9uOworICAgIHByaXZhdGUgRXZlbnRDYXB0dXJpbmdUb3VjaExpc3RlbmVyIG1Ub3VjaExpc3RlbmVyID0gbmV3IEV2ZW50Q2FwdHVyaW5nVG91Y2hMaXN0ZW5lcigpOworICAgIGZsb2F0IG1DdXJyZW50U2NhbGUgPSAxZjsKKyAgICBQb2ludEYgbUN1cnJlbnRab29tQ2VudGVyID0gbnVsbDsKKyAgICBQb2ludEYgbVRhcExvY2F0aW9uOworICAgIFBvaW50RiBtVGFwTG9jYXRpb24yOworICAgIGZsb2F0IG1QYW47CisgICAgcHJpdmF0ZSBib29sZWFuIG1IYXNUb3VjaHNjcmVlbjsKKyAgICBwcml2YXRlIGJvb2xlYW4gbU9yaWdpbmFsSXNNYWduaWZpY2F0aW9uRW5hYmxlZDsKKworICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1ab29tTG9jayA9IG5ldyBPYmplY3QoKTsKKworICAgIEBSdWxlCisgICAgcHVibGljIEFjdGl2aXR5VGVzdFJ1bGU8R2VzdHVyZURpc3BhdGNoQWN0aXZpdHk+IG1BY3Rpdml0eVJ1bGUgPQorICAgICAgICAgICAgbmV3IEFjdGl2aXR5VGVzdFJ1bGU8PihHZXN0dXJlRGlzcGF0Y2hBY3Rpdml0eS5jbGFzcyk7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbUluc3RydW1lbnRhdGlvbiA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpOworCisgICAgICAgIFBhY2thZ2VNYW5hZ2VyIHBtID0gbUluc3RydW1lbnRhdGlvbi5nZXRDb250ZXh0KCkuZ2V0UGFja2FnZU1hbmFnZXIoKTsKKyAgICAgICAgbUhhc1RvdWNoc2NyZWVuID0gcG0uaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX1RPVUNIU0NSRUVOKQorICAgICAgICAgICAgICAgIHx8IHBtLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9GQUtFVE9VQ0gpOworICAgICAgICBpZiAoIW1IYXNUb3VjaHNjcmVlbikgcmV0dXJuOworCisgICAgICAgIG1PcmlnaW5hbElzTWFnbmlmaWNhdGlvbkVuYWJsZWQgPQorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5nZXRJbnQobUluc3RydW1lbnRhdGlvbi5nZXRDb250ZXh0KCkuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuQUNDRVNTSUJJTElUWV9ESVNQTEFZX01BR05JRklDQVRJT05fRU5BQkxFRCwgMCkgPT0gMTsKKyAgICAgICAgc2V0TWFnbmlmaWNhdGlvbkVuYWJsZWQodHJ1ZSk7CisKKyAgICAgICAgbVNlcnZpY2UgPSBTdHViTWFnbmlmaWNhdGlvbkFjY2Vzc2liaWxpdHlTZXJ2aWNlLmVuYWJsZVNlbGYobUluc3RydW1lbnRhdGlvbik7CisgICAgICAgIG1TZXJ2aWNlLmdldE1hZ25pZmljYXRpb25Db250cm9sbGVyKCkuYWRkTGlzdGVuZXIoCisgICAgICAgICAgICAgICAgKGNvbnRyb2xsZXIsIHJlZ2lvbiwgc2NhbGUsIGNlbnRlclgsIGNlbnRlclkpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTY2FsZSA9IHNjYWxlOworICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFpvb21DZW50ZXIgPSBpc1pvb21lZCgpID8gbmV3IFBvaW50RihjZW50ZXJYLCBjZW50ZXJZKSA6IG51bGw7CisKKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtWm9vbUxvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ab29tTG9jay5ub3RpZnlBbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgIFRleHRWaWV3IHZpZXcgPSBtQWN0aXZpdHlSdWxlLmdldEFjdGl2aXR5KCkuZmluZFZpZXdCeUlkKFIuaWQuZnVsbF9zY3JlZW5fdGV4dF92aWV3KTsKKyAgICAgICAgbUluc3RydW1lbnRhdGlvbi5ydW5Pbk1haW5TeW5jKCgpIC0+IHsKKyAgICAgICAgICAgIHZpZXcuc2V0T25Ub3VjaExpc3RlbmVyKG1Ub3VjaExpc3RlbmVyKTsKKyAgICAgICAgICAgIGludFtdIHh5ID0gbmV3IGludFsyXTsKKyAgICAgICAgICAgIHZpZXcuZ2V0TG9jYXRpb25PblNjcmVlbih4eSk7CisgICAgICAgICAgICBtVGFwTG9jYXRpb24gPSBuZXcgUG9pbnRGKHh5WzBdICsgdmlldy5nZXRXaWR0aCgpIC8gMiwgeHlbMV0gKyB2aWV3LmdldEhlaWdodCgpIC8gMik7CisgICAgICAgICAgICBtVGFwTG9jYXRpb24yID0gYWRkKG1UYXBMb2NhdGlvbiwgMzEsIDI5KTsKKyAgICAgICAgICAgIG1QYW4gPSB2aWV3LmdldFdpZHRoKCkgLyA0OworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIW1IYXNUb3VjaHNjcmVlbikgcmV0dXJuOworCisgICAgICAgIHNldE1hZ25pZmljYXRpb25FbmFibGVkKG1PcmlnaW5hbElzTWFnbmlmaWNhdGlvbkVuYWJsZWQpOworCisgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtU2VydmljZS5ydW5PblNlcnZpY2VTeW5jKCgpIC0+IG1TZXJ2aWNlLmRpc2FibGVTZWxmQW5kUmVtb3ZlKCkpOworICAgICAgICAgICAgbVNlcnZpY2UgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Wm9vbU9uT2ZmKCkgeworICAgICAgICBpZiAoIW1IYXNUb3VjaHNjcmVlbikgcmV0dXJuOworCisgICAgICAgIGFzc2VydEZhbHNlKGlzWm9vbWVkKCkpOworCisgICAgICAgIGFzc2VydEdlc3R1cmVzUHJvcGFnYXRlVG9WaWV3KCk7CisgICAgICAgIGFzc2VydEZhbHNlKGlzWm9vbWVkKCkpOworCisgICAgICAgIHNldFpvb21CeVRyaXBsZVRhcHBpbmcodHJ1ZSk7CisKKyAgICAgICAgYXNzZXJ0R2VzdHVyZXNQcm9wYWdhdGVUb1ZpZXcoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShpc1pvb21lZCgpKTsKKworICAgICAgICBzZXRab29tQnlUcmlwbGVUYXBwaW5nKGZhbHNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWaWV3cG9ydERyYWdnaW5nKCkgeworICAgICAgICBpZiAoIW1IYXNUb3VjaHNjcmVlbikgcmV0dXJuOworCisgICAgICAgIGFzc2VydEZhbHNlKGlzWm9vbWVkKCkpOworICAgICAgICB0cmlwbGVUYXBBbmREcmFnVmlld3BvcnQoKTsKKyAgICAgICAgd2FpdE9uKG1ab29tTG9jaywgKCkgLT4gIWlzWm9vbWVkKCkpOworCisgICAgICAgIHNldFpvb21CeVRyaXBsZVRhcHBpbmcodHJ1ZSk7CisgICAgICAgIHRyaXBsZVRhcEFuZERyYWdWaWV3cG9ydCgpOworICAgICAgICBhc3NlcnRUcnVlKGlzWm9vbWVkKCkpOworCisgICAgICAgIHNldFpvb21CeVRyaXBsZVRhcHBpbmcoZmFsc2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBhbm5pbmcoKSB7CisgICAgICAgIGlmICghbUhhc1RvdWNoc2NyZWVuKSByZXR1cm47CisgICAgICAgIGFzc2VydEZhbHNlKGlzWm9vbWVkKCkpOworCisgICAgICAgIHNldFpvb21CeVRyaXBsZVRhcHBpbmcodHJ1ZSk7CisgICAgICAgIFBvaW50RiBvbGRDZW50ZXIgPSBtQ3VycmVudFpvb21DZW50ZXI7CisKKyAgICAgICAgZGlzcGF0Y2goCisgICAgICAgICAgICAgICAgc3dpcGUobVRhcExvY2F0aW9uLCBhZGQobVRhcExvY2F0aW9uLCAtbVBhbiwgMCkpLAorICAgICAgICAgICAgICAgIHN3aXBlKG1UYXBMb2NhdGlvbjIsIGFkZChtVGFwTG9jYXRpb24yLCAtbVBhbiwgMCkpKTsKKworICAgICAgICB3YWl0T24obVpvb21Mb2NrLAorICAgICAgICAgICAgICAgICgpIC0+IChtQ3VycmVudFpvb21DZW50ZXIueCAtIG9sZENlbnRlci54ID49IG1QYW4gLyBtQ3VycmVudFNjYWxlICogMC45KSk7CisKKyAgICAgICAgc2V0Wm9vbUJ5VHJpcGxlVGFwcGluZyhmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldFpvb21CeVRyaXBsZVRhcHBpbmcoYm9vbGVhbiBkZXNpcmVkWm9vbVN0YXRlKSB7CisgICAgICAgIGlmIChpc1pvb21lZCgpID09IGRlc2lyZWRab29tU3RhdGUpIHJldHVybjsKKyAgICAgICAgZGlzcGF0Y2godHJpcGxlVGFwKCkpOworICAgICAgICB3YWl0T24obVpvb21Mb2NrLCAoKSAtPiBpc1pvb21lZCgpID09IGRlc2lyZWRab29tU3RhdGUpOworICAgICAgICBhc3NlcnROb1RvdWNoSW5wdXRQcm9wYWdhdGVkKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRyaXBsZVRhcEFuZERyYWdWaWV3cG9ydCgpIHsKKyAgICAgICAgU3Ryb2tlRGVzY3JpcHRpb24gZG93biA9IHRyaXBsZVRhcEFuZEhvbGQoKTsKKworICAgICAgICBQb2ludEYgb2xkQ2VudGVyID0gbUN1cnJlbnRab29tQ2VudGVyOworCisgICAgICAgIFN0cm9rZURlc2NyaXB0aW9uIGRyYWcgPSBkcmFnKGRvd24sIGFkZChsYXN0UG9pbnRPZihkb3duKSwgbVBhbiwgMGYpKTsKKyAgICAgICAgZGlzcGF0Y2goZHJhZyk7CisgICAgICAgIHdhaXRPbihtWm9vbUxvY2ssICgpIC0+IGRpc3RhbmNlKG1DdXJyZW50Wm9vbUNlbnRlciwgb2xkQ2VudGVyKSA+PSBtUGFuIC8gNSk7CisgICAgICAgIGFzc2VydFRydWUoaXNab29tZWQoKSk7CisgICAgICAgIGFzc2VydE5vVG91Y2hJbnB1dFByb3BhZ2F0ZWQoKTsKKworICAgICAgICBkaXNwYXRjaChwb2ludGVyVXAoZHJhZykpOworICAgICAgICBhc3NlcnROb1RvdWNoSW5wdXRQcm9wYWdhdGVkKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJva2VEZXNjcmlwdGlvbiB0cmlwbGVUYXBBbmRIb2xkKCkgeworICAgICAgICBTdHJva2VEZXNjcmlwdGlvbiB0YXAxID0gY2xpY2sobVRhcExvY2F0aW9uKTsKKyAgICAgICAgU3Ryb2tlRGVzY3JpcHRpb24gdGFwMiA9IHN0YXJ0aW5nQXQoZW5kVGltZU9mKHRhcDEpICsgMjAsIGNsaWNrKG1UYXBMb2NhdGlvbjIpKTsKKyAgICAgICAgU3Ryb2tlRGVzY3JpcHRpb24gZG93biA9IHN0YXJ0aW5nQXQoZW5kVGltZU9mKHRhcDIpICsgMjAsIHBvaW50ZXJEb3duKG1UYXBMb2NhdGlvbikpOworICAgICAgICBkaXNwYXRjaCh0YXAxLCB0YXAyLCBkb3duKTsKKyAgICAgICAgd2FpdE9uKG1ab29tTG9jaywgKCkgLT4gaXNab29tZWQoKSk7CisgICAgICAgIHJldHVybiBkb3duOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRHZXN0dXJlc1Byb3BhZ2F0ZVRvVmlldygpIHsKKyAgICAgICAgZGlzcGF0Y2goY2xpY2sobVRhcExvY2F0aW9uKSk7CisgICAgICAgIGFzc2VydFByb3BhZ2F0ZWQoQUNUSU9OX0RPV04sIEFDVElPTl9VUCk7CisKKyAgICAgICAgZGlzcGF0Y2gobG9uZ0NsaWNrKG1UYXBMb2NhdGlvbikpOworICAgICAgICBhc3NlcnRQcm9wYWdhdGVkKEFDVElPTl9ET1dOLCBBQ1RJT05fVVApOworCisgICAgICAgIGRpc3BhdGNoKGRvdWJsZVRhcCgpKTsKKyAgICAgICAgYXNzZXJ0UHJvcGFnYXRlZChBQ1RJT05fRE9XTiwgQUNUSU9OX1VQLCBBQ1RJT05fRE9XTiwgQUNUSU9OX1VQKTsKKworICAgICAgICBkaXNwYXRjaChzd2lwZSgKKyAgICAgICAgICAgICAgICBtVGFwTG9jYXRpb24sCisgICAgICAgICAgICAgICAgYWRkKG1UYXBMb2NhdGlvbiwgMCwgMjkpKSk7CisgICAgICAgIGFzc2VydFByb3BhZ2F0ZWQoQUNUSU9OX0RPV04sIEFDVElPTl9NT1ZFLCBBQ1RJT05fVVApOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnROb1RvdWNoSW5wdXRQcm9wYWdhdGVkKCkgeworICAgICAgICBhc3NlcnRUaGF0KHByZXR0eVByaW50YWJsZShtVG91Y2hMaXN0ZW5lci5ldmVudHMpLCBpcyhlbXB0eSgpKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldE1hZ25pZmljYXRpb25FbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0SW50KG1JbnN0cnVtZW50YXRpb24uZ2V0Q29udGV4dCgpLmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5BQ0NFU1NJQklMSVRZX0RJU1BMQVlfTUFHTklGSUNBVElPTl9FTkFCTEVELCBlbmFibGVkID8gMSA6IDApOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc1pvb21lZCgpIHsKKyAgICAgICAgcmV0dXJuIG1DdXJyZW50U2NhbGUgPj0gTUlOX1NDQUxFOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRQcm9wYWdhdGVkKGludC4uLiBldmVudFR5cGVzKSB7CisgICAgICAgIE1vdGlvbkV2ZW50IGV2OworICAgICAgICB0cnkgeworICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICBpZiAoZXZlbnRUeXBlcy5sZW5ndGggPT0gMCkgcmV0dXJuOworICAgICAgICAgICAgICAgIGludCBleHBlY3RlZEV2ZW50VHlwZSA9IGV2ZW50VHlwZXNbMF07CisgICAgICAgICAgICAgICAgbG9uZyBzdGFydGVkUG9sbGluZ0F0ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CisgICAgICAgICAgICAgICAgZXYgPSBtVG91Y2hMaXN0ZW5lci5ldmVudHMucG9sbCg1LCBTRUNPTkRTKTsKKyAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJFeHBlY3RlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICArIE1vdGlvbkV2ZW50LmFjdGlvblRvU3RyaW5nKGV4cGVjdGVkRXZlbnRUeXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGJ1dCBub25lIHByZXNlbnQgYWZ0ZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAoU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkgLSBzdGFydGVkUG9sbGluZ0F0KSArICJtcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBldik7CisgICAgICAgICAgICAgICAgaW50IGFjdGlvbiA9IGV2LmdldEFjdGlvbk1hc2tlZCgpOworICAgICAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gZXhwZWN0ZWRFdmVudFR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlcyA9IEFycmF5cy5jb3B5T2ZSYW5nZShldmVudFR5cGVzLCAxLCBldmVudFR5cGVzLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbiAhPSBBQ1RJT05fTU9WRSkgZmFpbCgiVW5leHBlY3RlZCBldmVudDogIiArIGV2KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBHZXN0dXJlRGVzY3JpcHRpb24gZG91YmxlVGFwKCkgeworICAgICAgICByZXR1cm4gbXVsdGlUYXAoMik7CisgICAgfQorCisgICAgcHJpdmF0ZSBHZXN0dXJlRGVzY3JpcHRpb24gdHJpcGxlVGFwKCkgeworICAgICAgICByZXR1cm4gbXVsdGlUYXAoMyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBHZXN0dXJlRGVzY3JpcHRpb24gbXVsdGlUYXAoaW50IHRhcHMpIHsKKyAgICAgICAgR2VzdHVyZURlc2NyaXB0aW9uLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBHZXN0dXJlRGVzY3JpcHRpb24uQnVpbGRlcigpOworICAgICAgICBsb25nIHRpbWUgPSAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhcHM7IGkrKykgeworICAgICAgICAgICAgU3Ryb2tlRGVzY3JpcHRpb24gc3Ryb2tlID0gY2xpY2sobVRhcExvY2F0aW9uKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuYWRkU3Ryb2tlKHN0YXJ0aW5nQXQodGltZSwgc3Ryb2tlKSk7CisgICAgICAgICAgICB0aW1lICs9IHN0cm9rZS5nZXREdXJhdGlvbigpICsgMjA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaChTdHJva2VEZXNjcmlwdGlvbiBmaXJzdFN0cm9rZSwgU3Ryb2tlRGVzY3JpcHRpb24uLi4gcmVzdCkgeworICAgICAgICBHZXN0dXJlRGVzY3JpcHRpb24uQnVpbGRlciBidWlsZGVyID0KKyAgICAgICAgICAgICAgICBuZXcgR2VzdHVyZURlc2NyaXB0aW9uLkJ1aWxkZXIoKS5hZGRTdHJva2UoZmlyc3RTdHJva2UpOworICAgICAgICBmb3IgKFN0cm9rZURlc2NyaXB0aW9uIHN0cm9rZSA6IHJlc3QpIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuYWRkU3Ryb2tlKHN0cm9rZSk7CisgICAgICAgIH0KKyAgICAgICAgZGlzcGF0Y2goYnVpbGRlci5idWlsZCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaChHZXN0dXJlRGVzY3JpcHRpb24gZ2VzdHVyZSkgeworICAgICAgICBhd2FpdChkaXNwYXRjaEdlc3R1cmUobVNlcnZpY2UsIGdlc3R1cmUpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyA8VD4gQ29sbGVjdGlvbjxUPiBwcmV0dHlQcmludGFibGUoQ29sbGVjdGlvbjxUPiBjKSB7CisgICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PFQ+KGMpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBzdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCh0IC0+ICJcbiIgKyB0KQorICAgICAgICAgICAgICAgICAgICAgICAgLnJlZHVjZShTdHJpbmc6OmNvbmNhdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5vckVsc2UoIiIpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy9TaGVsbENvbW1hbmRCdWlsZGVyLmphdmEgYi90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9jdHMvU2hlbGxDb21tYW5kQnVpbGRlci5qYXZhCmluZGV4IDgyM2I4ZDYuLjEwOWMzZjggMTAwNjQ0Ci0tLSBhL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy9TaGVsbENvbW1hbmRCdWlsZGVyLmphdmEKKysrIGIvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2Uvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvY3RzL1NoZWxsQ29tbWFuZEJ1aWxkZXIuamF2YQpAQCAtMjksOSArMjksMTAgQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKIAogcHVibGljIGNsYXNzIFNoZWxsQ29tbWFuZEJ1aWxkZXIgewotICAgIHByaXZhdGUgZmluYWwgTGlua2VkTGlzdDxTdHJpbmc+IG1Db21tYW5kcyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIExpbmtlZExpc3Q8UnVubmFibGU+IG1Db21tYW5kcyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKIAogICAgIHByaXZhdGUgZmluYWwgSW5zdHJ1bWVudGF0aW9uIG1JbnN0cnVtZW50YXRpb247CisgICAgcHJpdmF0ZSBmaW5hbCBVaUF1dG9tYXRpb24gbVVpQXV0b21hdGlvbjsKIAogICAgIHB1YmxpYyBzdGF0aWMgU2hlbGxDb21tYW5kQnVpbGRlciBjcmVhdGUoSW5zdHJ1bWVudGF0aW9uIGluc3RydW1lbnRhdGlvbikgewogICAgICAgICByZXR1cm4gbmV3IFNoZWxsQ29tbWFuZEJ1aWxkZXIoaW5zdHJ1bWVudGF0aW9uKTsKQEAgLTM5LDM3ICs0MCw0MSBAQAogCiAgICAgcHJpdmF0ZSBTaGVsbENvbW1hbmRCdWlsZGVyKEluc3RydW1lbnRhdGlvbiBpbnN0cnVtZW50YXRpb24pIHsKICAgICAgICAgbUluc3RydW1lbnRhdGlvbiA9IGluc3RydW1lbnRhdGlvbjsKKyAgICAgICAgbVVpQXV0b21hdGlvbiA9IG1JbnN0cnVtZW50YXRpb24uZ2V0VWlBdXRvbWF0aW9uKAorICAgICAgICAgICAgICAgIFVpQXV0b21hdGlvbi5GTEFHX0RPTlRfU1VQUFJFU1NfQUNDRVNTSUJJTElUWV9TRVJWSUNFUyk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICBmaW5hbCBVaUF1dG9tYXRpb24gYXV0b21hdGlvbiA9IG1JbnN0cnVtZW50YXRpb24uZ2V0VWlBdXRvbWF0aW9uKAotICAgICAgICAgICAgICAgIFVpQXV0b21hdGlvbi5GTEFHX0RPTlRfU1VQUFJFU1NfQUNDRVNTSUJJTElUWV9TRVJWSUNFUyk7Ci0gICAgICAgIGZvciAoU3RyaW5nIGNvbW1hbmQgOiBtQ29tbWFuZHMpIHsKLSAgICAgICAgICAgIGV4ZWNTaGVsbENvbW1hbmQoYXV0b21hdGlvbiwgY29tbWFuZCk7CisgICAgICAgIGZvciAoUnVubmFibGUgY29tbWFuZCA6IG1Db21tYW5kcykgeworICAgICAgICAgICAgY29tbWFuZC5ydW4oKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIHB1YmxpYyBTaGVsbENvbW1hbmRCdWlsZGVyIGRlbGV0ZVNlY3VyZVNldHRpbmcoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgbUNvbW1hbmRzLmFkZCgic2V0dGluZ3MgZGVsZXRlIHNlY3VyZSAiICsgbmFtZSk7CisgICAgICAgIGFkZENvbW1hbmQoInNldHRpbmdzIGRlbGV0ZSBzZWN1cmUgIiArIG5hbWUpOwogICAgICAgICByZXR1cm4gdGhpczsKICAgICB9CiAKICAgICBwdWJsaWMgU2hlbGxDb21tYW5kQnVpbGRlciBwdXRTZWN1cmVTZXR0aW5nKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgbUNvbW1hbmRzLmFkZCgic2V0dGluZ3MgcHV0IHNlY3VyZSAiICsgbmFtZSArICIgIiArIHZhbHVlKTsKKyAgICAgICAgYWRkQ29tbWFuZCgic2V0dGluZ3MgcHV0IHNlY3VyZSAiICsgbmFtZSArICIgIiArIHZhbHVlKTsKICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgfQogCiAgICAgcHVibGljIFNoZWxsQ29tbWFuZEJ1aWxkZXIgZ3JhbnRQZXJtaXNzaW9uKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHBlcm1pc3Npb24pIHsKLSAgICAgICAgbUNvbW1hbmRzLmFkZCgicG0gZ3JhbnQgIiArIHBhY2thZ2VOYW1lICsgIiAiICsgcGVybWlzc2lvbik7CisgICAgICAgIG1Db21tYW5kcy5hZGQoKCkgLT4geworICAgICAgICAgICAgbVVpQXV0b21hdGlvbi5ncmFudFJ1bnRpbWVQZXJtaXNzaW9uKHBhY2thZ2VOYW1lLCBwZXJtaXNzaW9uKTsKKyAgICAgICAgfSk7CiAgICAgICAgIHJldHVybiB0aGlzOwogICAgIH0KIAogICAgIHB1YmxpYyBTaGVsbENvbW1hbmRCdWlsZGVyIGFkZENvbW1hbmQoU3RyaW5nIGNvbW1hbmQpIHsKLSAgICAgICAgbUNvbW1hbmRzLmFkZChjb21tYW5kKTsKKyAgICAgICAgbUNvbW1hbmRzLmFkZCgoKSAtPiB7CisgICAgICAgICAgICBleGVjU2hlbGxDb21tYW5kKG1VaUF1dG9tYXRpb24sIGNvbW1hbmQpOworICAgICAgICB9KTsKICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBleGVjU2hlbGxDb21tYW5kKFVpQXV0b21hdGlvbiBhdXRvbWF0aW9uLCBTdHJpbmcgY29tbWFuZCkgeworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBleGVjU2hlbGxDb21tYW5kKFVpQXV0b21hdGlvbiBhdXRvbWF0aW9uLCBTdHJpbmcgY29tbWFuZCkgewogICAgICAgICB0cnkgKFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkID0gYXV0b21hdGlvbi5leGVjdXRlU2hlbGxDb21tYW5kKGNvbW1hbmQpKSB7CiAgICAgICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmZC5nZXRGaWxlRGVzY3JpcHRvcigpKSkgewogICAgICAgICAgICAgICAgIHRyeSAoQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKApkaWZmIC0tZ2l0IGEvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2Uvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvY3RzL2FjdGl2aXRpZXMvQWNjZXNzaWJpbGl0eUVuZFRvRW5kQWN0aXZpdHkuamF2YSBiL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy9hY3Rpdml0aWVzL0FjY2Vzc2liaWxpdHlFbmRUb0VuZEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q5MDU1ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy9hY3Rpdml0aWVzL0FjY2Vzc2liaWxpdHlFbmRUb0VuZEFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuY3RzLmFjdGl2aXRpZXM7CisKK2ltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLmN0cy5SOworCitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU5vZGVJbmZvOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJhc2VBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYW4ge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5fSB1c2VkIHRvIHBlcmZvcm0gZW5kLXRvLWVuZAorICogdGVzdGluZyBvZiB0aGUgYWNjZXNzaWJpbGl0eSBmZWF0dXJlIGJ5IGludGVyYWN0aW9uIHdpdGggdGhlCisgKiBVSSB3aWRnZXRzLgorICovCitwdWJsaWMgY2xhc3MgQWNjZXNzaWJpbGl0eUVuZFRvRW5kQWN0aXZpdHkgZXh0ZW5kcyBBY2Nlc3NpYmlsaXR5VGVzdEFjdGl2aXR5IHsKKyAgICBwcml2YXRlIFBhY2thZ2VOYW1lSW5qZWN0b3IgbVBhY2thZ2VOYW1lSW5qZWN0b3I7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmVuZF90b19lbmRfdGVzdCk7CisKKyAgICAgICAgTGlzdEFkYXB0ZXIgbGlzdEFkYXB0ZXIgPSBuZXcgQmFzZUFkYXB0ZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgVmlldyBnZXRWaWV3KGludCBwb3NpdGlvbiwgVmlldyBjb252ZXJ0VmlldywgVmlld0dyb3VwIHBhcmVudCkgeworICAgICAgICAgICAgICAgIFRleHRWaWV3IHRleHRWaWV3ID0gKFRleHRWaWV3KSBWaWV3CisgICAgICAgICAgICAgICAgICAgICAgICAuaW5mbGF0ZShBY2Nlc3NpYmlsaXR5RW5kVG9FbmRBY3Rpdml0eS50aGlzLCBSLmxheW91dC5saXN0X3ZpZXdfcm93LCBudWxsKTsKKyAgICAgICAgICAgICAgICB0ZXh0Vmlldy5zZXRUZXh0KChTdHJpbmcpIGdldEl0ZW0ocG9zaXRpb24pKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGV4dFZpZXc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBsb25nIGdldEl0ZW1JZChpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcG9zaXRpb247CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0SXRlbShpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWNjZXNzaWJpbGl0eUVuZFRvRW5kQWN0aXZpdHkudGhpcy5nZXRTdHJpbmcoUi5zdHJpbmcuZmlyc3RfbGlzdF9pdGVtKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWNjZXNzaWJpbGl0eUVuZFRvRW5kQWN0aXZpdHkudGhpcy5nZXRTdHJpbmcoUi5zdHJpbmcuc2Vjb25kX2xpc3RfaXRlbSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgaW50IGdldENvdW50KCkgeworICAgICAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIExpc3RWaWV3IGxpc3RWaWV3ID0gKExpc3RWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5saXN0dmlldyk7CisgICAgICAgIGxpc3RWaWV3LnNldEFkYXB0ZXIobGlzdEFkYXB0ZXIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJlcG9ydGVkUGFja2FnZU5hbWUoU3RyaW5nIHBhY2thZ2VOYW1lKSB7CisgICAgICAgIGlmIChwYWNrYWdlTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtUGFja2FnZU5hbWVJbmplY3RvciA9IG5ldyBQYWNrYWdlTmFtZUluamVjdG9yKHBhY2thZ2VOYW1lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1QYWNrYWdlTmFtZUluamVjdG9yID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBzZXRQYWNrYWdlTmFtZUluamVjdG9yKGdldFdpbmRvdygpLmdldERlY29yVmlldygpLCBtUGFja2FnZU5hbWVJbmplY3Rvcik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRQYWNrYWdlTmFtZUluamVjdG9yKFZpZXcgbm9kZSwgUGFja2FnZU5hbWVJbmplY3RvciBpbmplY3RvcikgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbm9kZS5zZXRBY2Nlc3NpYmlsaXR5RGVsZWdhdGUoaW5qZWN0b3IpOworICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIFZpZXdHcm91cCkgeworICAgICAgICAgICAgZmluYWwgVmlld0dyb3VwIHZpZXdHcm91cCA9IChWaWV3R3JvdXApIG5vZGU7CisgICAgICAgICAgICBmaW5hbCBpbnQgY2hpbGRDb3VudCA9IHZpZXdHcm91cC5nZXRDaGlsZENvdW50KCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIHNldFBhY2thZ2VOYW1lSW5qZWN0b3Iodmlld0dyb3VwLmdldENoaWxkQXQoaSksIGluamVjdG9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFBhY2thZ2VOYW1lSW5qZWN0b3IgZXh0ZW5kcyBWaWV3LkFjY2Vzc2liaWxpdHlEZWxlZ2F0ZSB7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1QYWNrYWdlTmFtZTsKKworICAgICAgICBQYWNrYWdlTmFtZUluamVjdG9yKFN0cmluZyBwYWNrYWdlTmFtZSkgeworICAgICAgICAgICAgbVBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25Jbml0aWFsaXplQWNjZXNzaWJpbGl0eUV2ZW50KFZpZXcgaG9zdCwgQWNjZXNzaWJpbGl0eUV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICBzdXBlci5vbkluaXRpYWxpemVBY2Nlc3NpYmlsaXR5RXZlbnQoaG9zdCwgZXZlbnQpOworICAgICAgICAgICAgZXZlbnQuc2V0UGFja2FnZU5hbWUobVBhY2thZ2VOYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkluaXRpYWxpemVBY2Nlc3NpYmlsaXR5Tm9kZUluZm8oVmlldyBob3N0LCBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gaW5mbykgeworICAgICAgICAgICAgc3VwZXIub25Jbml0aWFsaXplQWNjZXNzaWJpbGl0eU5vZGVJbmZvKGhvc3QsIGluZm8pOworICAgICAgICAgICAgaW5mby5zZXRQYWNrYWdlTmFtZShtUGFja2FnZU5hbWUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2Uvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvY3RzL2FjdGl2aXRpZXMvQWNjZXNzaWJpbGl0eUZvY3VzQW5kSW5wdXRGb2N1c1N5bmNBY3Rpdml0eS5qYXZhIGIvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2Uvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvY3RzL2FjdGl2aXRpZXMvQWNjZXNzaWJpbGl0eUZvY3VzQW5kSW5wdXRGb2N1c1N5bmNBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMWYwMWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9jdHMvYWN0aXZpdGllcy9BY2Nlc3NpYmlsaXR5Rm9jdXNBbmRJbnB1dEZvY3VzU3luY0FjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdAorICogaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZQorICogTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHMuYWN0aXZpdGllczsKKworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworCitpbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHMuUjsKKworLyoqCisgKiBBY3Rpdml0eSBmb3IgdGVzdGluZyB0aGUgYWNjZXNzaWJpbGl0eSBmb2N1cyBBUElzIGV4cG9zZWQgdG8KKyAqIGFjY2Vzc2liaWxpdHkgc2VydmljZXMuIFRoZXNlIEFQSXMgYWxsb3cgbW92aW5nIGFjY2Vzc2liaWxpdHkKKyAqIGZvY3VzIGluIHRoZSB2aWV3IHRyZWUgZnJvbSBhbiBBY2Nlc3NpaWJsaXR5U2VydmljZS4gU3BlY2lmaWNhbGx5LAorICogdGhpcyBhY3Rpdml0eSBpcyBmb3IgdmVyaWZ5aW5nIHRoZSB0aGUgc3luYyBiZXR3ZWVuIGFjY2Vzc2liaWxpdHkKKyAqIGFuZCBpbnB1dCBmb2N1cy4KKyAqLworcHVibGljIGNsYXNzIEFjY2Vzc2liaWxpdHlGb2N1c0FuZElucHV0Rm9jdXNTeW5jQWN0aXZpdHkgZXh0ZW5kcyBBY2Nlc3NpYmlsaXR5VGVzdEFjdGl2aXR5IHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQuYWNjZXNzaWJpbGl0eV9mb2N1c19hbmRfaW5wdXRfZm9jdXNfc3luY190ZXN0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9jdHMvYWN0aXZpdGllcy9BY2Nlc3NpYmlsaXR5VGVzdEFjdGl2aXR5LmphdmEgYi90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9jdHMvYWN0aXZpdGllcy9BY2Nlc3NpYmlsaXR5VGVzdEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDliZTMzNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy9hY3Rpdml0aWVzL0FjY2Vzc2liaWxpdHlUZXN0QWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDMxIEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0CisgKiBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlCisgKiBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLmN0cy5hY3Rpdml0aWVzOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBY2Nlc3NpYmlsaXR5VGVzdEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIGdldFdpbmRvdygpLmFkZEZsYWdzKFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfS0VFUF9TQ1JFRU5fT04KKyAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfVFVSTl9TQ1JFRU5fT04KKyAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfRElTTUlTU19LRVlHVUFSRCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2Uvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvY3RzL2FjdGl2aXRpZXMvQWNjZXNzaWJpbGl0eVRleHRUcmF2ZXJzYWxBY3Rpdml0eS5qYXZhIGIvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2Uvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvY3RzL2FjdGl2aXRpZXMvQWNjZXNzaWJpbGl0eVRleHRUcmF2ZXJzYWxBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZDI4YzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9jdHMvYWN0aXZpdGllcy9BY2Nlc3NpYmlsaXR5VGV4dFRyYXZlcnNhbEFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdAorICogaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZQorICogTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHMuYWN0aXZpdGllczsKKworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworCitpbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHMuUjsKKworLyoqCisgKiBBY3Rpdml0eSBmb3IgdGVzdGluZyB0aGUgYWNjZXNzaWJpbGl0eSBBUElzIGZvciB0cmF2ZXJzaW5nIHRoZQorICogdGV4dCBjb250ZW50IG9mIGEgVmlldyBhdCBzZXZlcmFsIGdyYW51bGFyaXRpZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBBY2Nlc3NpYmlsaXR5VGV4dFRyYXZlcnNhbEFjdGl2aXR5IGV4dGVuZHMgQWNjZXNzaWJpbGl0eVRlc3RBY3Rpdml0eSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmFjY2Vzc2liaWxpdHlfdGV4dF90cmF2ZXJzYWxfdGVzdCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2Uvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvY3RzL2FjdGl2aXRpZXMvQWNjZXNzaWJpbGl0eVZpZXdUcmVlUmVwb3J0aW5nQWN0aXZpdHkuamF2YSBiL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy9hY3Rpdml0aWVzL0FjY2Vzc2liaWxpdHlWaWV3VHJlZVJlcG9ydGluZ0FjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhmYWRhMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy9hY3Rpdml0aWVzL0FjY2Vzc2liaWxpdHlWaWV3VHJlZVJlcG9ydGluZ0FjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdAorICogaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZQorICogTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHMuYWN0aXZpdGllczsKKworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworCitpbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHMuUjsKKworLyoqCisgKiBBY3Rpdml0eSBmb3IgdGVzdGluZyB0aGUgYWNjZXNzaWJpbGl0eSBmb2N1cyBBUElzIGV4cG9zZWQgdG8KKyAqIGFjY2Vzc2liaWxpdHkgc2VydmljZXMuIFRoZXNlIEFQSXMgYWxsb3cgbW92aW5nIGFjY2Vzc2liaWxpdHkKKyAqIGZvY3VzIGluIHRoZSB2aWV3IHRyZWUgZnJvbSBhbiBBY2Nlc3NpaWJsaXR5U2VydmljZS4gU3BlY2lmaWNhbGx5LAorICogdGhpcyBhY3Rpdml0eSBpcyBmb3IgdmVyaWZ5aW5nIHRoZSBoaWVyYXJjaGljYWwgbW92ZW1lbnQgb2YgdGhlCisgKiBhY2Nlc3NpYmlsaXR5IGZvY3VzLgorICovCitwdWJsaWMgY2xhc3MgQWNjZXNzaWJpbGl0eVZpZXdUcmVlUmVwb3J0aW5nQWN0aXZpdHkgZXh0ZW5kcyBBY2Nlc3NpYmlsaXR5VGVzdEFjdGl2aXR5IHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQuYWNjZXNzaWJpbGl0eV92aWV3X3RyZWVfcmVwb3J0aW5nX3Rlc3QpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy9hY3Rpdml0aWVzL0FjY2Vzc2liaWxpdHlXaW5kb3dRdWVyeUFjdGl2aXR5LmphdmEgYi90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9jdHMvYWN0aXZpdGllcy9BY2Nlc3NpYmlsaXR5V2luZG93UXVlcnlBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MjRmNTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9jdHMvYWN0aXZpdGllcy9BY2Nlc3NpYmlsaXR5V2luZG93UXVlcnlBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQKKyAqIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUKKyAqIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuY3RzLmFjdGl2aXRpZXM7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlOb2RlSW5mbzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5Tm9kZUluZm8uQWNjZXNzaWJpbGl0eUFjdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLmN0cy5SOworCisvKioKKyAqIEFjdGl2aXR5IGZvciB0ZXN0aW5nIHRoZSBhY2Nlc3NpYmlsaXR5IEFQSXMgZm9yIHF1ZXJ5aW5nIG9mCisgKiB0aGUgc2NyZWVuIGNvbnRlbnQuIFRoZXNlIEFQSXMgYWxsb3cgZXhwbG9yaW5nIHRoZSBzY3JlZW4gYW5kCisgKiByZXF1ZXN0aW5nIGFuIGFjdGlvbiB0byBiZSBwZXJmb3JtZWQgb24gYSBnaXZlbiB2aWV3IGZyb20gYW4KKyAqIEFjY2Vzc2liaWxpdHlTZXJ2aWNlLgorICovCitwdWJsaWMgY2xhc3MgQWNjZXNzaWJpbGl0eVdpbmRvd1F1ZXJ5QWN0aXZpdHkgZXh0ZW5kcyBBY2Nlc3NpYmlsaXR5VGVzdEFjdGl2aXR5IHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQucXVlcnlfd2luZG93X3Rlc3QpOworCisgICAgICAgIGZpbmRWaWV3QnlJZChSLmlkLmJ1dHRvbjUpLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIC8qIGRvIG5vdGhpbmcgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIGZpbmRWaWV3QnlJZChSLmlkLmJ1dHRvbjUpLnNldE9uTG9uZ0NsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25Mb25nQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIG9uTG9uZ0NsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBmaW5kVmlld0J5SWQoUi5pZC5idXR0b241KS5zZXRBY2Nlc3NpYmlsaXR5RGVsZWdhdGUobmV3IFZpZXcuQWNjZXNzaWJpbGl0eURlbGVnYXRlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkluaXRpYWxpemVBY2Nlc3NpYmlsaXR5Tm9kZUluZm8oVmlldyBob3N0LCBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gaW5mbykgeworICAgICAgICAgICAgICAgIHN1cGVyLm9uSW5pdGlhbGl6ZUFjY2Vzc2liaWxpdHlOb2RlSW5mbyhob3N0LCBpbmZvKTsKKyAgICAgICAgICAgICAgICBpbmZvLmFkZEFjdGlvbihuZXcgQWNjZXNzaWJpbGl0eUFjdGlvbihSLmlkLmZvb19jdXN0b21fYWN0aW9uLCAiRm9vIikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1BY2Nlc3NpYmlsaXR5QWN0aW9uKFZpZXcgaG9zdCwgaW50IGFjdGlvbiwgQnVuZGxlIGFyZ3MpIHsKKyAgICAgICAgICAgICAgICBpZiAoYWN0aW9uID09IFIuaWQuZm9vX2N1c3RvbV9hY3Rpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5wZXJmb3JtQWNjZXNzaWJpbGl0eUFjdGlvbihob3N0LCBhY3Rpb24sIGFyZ3MpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9jdHMvYWN0aXZpdGllcy9BY2Nlc3NpYmlsaXR5V2luZG93UmVwb3J0aW5nQWN0aXZpdHkuamF2YSBiL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy9hY3Rpdml0aWVzL0FjY2Vzc2liaWxpdHlXaW5kb3dSZXBvcnRpbmdBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmYmJmYTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9jdHMvYWN0aXZpdGllcy9BY2Nlc3NpYmlsaXR5V2luZG93UmVwb3J0aW5nQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDMwIEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0CisgKiBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlCisgKiBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLmN0cy5hY3Rpdml0aWVzOworCitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CisKKy8qKgorICogQWN0aXZpdHkgdXNlZCBieSBBY3Rpdml0eVdpbmRvd1JlcG9ydGluZ1Rlc3QKKyAqLworcHVibGljIGNsYXNzIEFjY2Vzc2liaWxpdHlXaW5kb3dSZXBvcnRpbmdBY3Rpdml0eSBleHRlbmRzIEFjY2Vzc2liaWxpdHlUZXN0QWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcoCisgICAgICAgICAgICAgICAgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHMuUi5sYXlvdXQuYWNjZXNzaWJpbGl0eV93aW5kb3dfcmVwb3J0aW5nX3Rlc3QpOworICAgICAgICBzZXRUaXRsZSgiQWNjZXNzaWJpbGl0eVdpbmRvd1JlcG9ydGluZ0FjdGl2aXR5Iik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2Uvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvY3RzL3V0aWxzL0FjY2Vzc2liaWxpdHlFdmVudEZpbHRlclV0aWxzLmphdmEgYi90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9jdHMvdXRpbHMvQWNjZXNzaWJpbGl0eUV2ZW50RmlsdGVyVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDZhY2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2Uvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvY3RzL3V0aWxzL0FjY2Vzc2liaWxpdHlFdmVudEZpbHRlclV0aWxzLmphdmEKQEAgLTAsMCArMSw5NSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdAorICogaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZQorICogTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHMudXRpbHM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5ib3RoOworCitpbXBvcnQgYW5kcm9pZC5hcHAuVWlBdXRvbWF0aW9uLkFjY2Vzc2liaWxpdHlFdmVudEZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQ7CisKK2ltcG9ydCBvcmcuaGFtY3Jlc3QuRGVzY3JpcHRpb247CitpbXBvcnQgb3JnLmhhbWNyZXN0Lk1hdGNoZXI7CitpbXBvcnQgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzOworaW1wb3J0IG9yZy5oYW1jcmVzdC5UeXBlU2FmZU1hdGNoZXI7CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyBmb3IgY3JlYXRpbmcgQWNjZXNzaWJpbGl0eUV2ZW50RmlsdGVycworICovCitwdWJsaWMgY2xhc3MgQWNjZXNzaWJpbGl0eUV2ZW50RmlsdGVyVXRpbHMgeworICAgIHB1YmxpYyBzdGF0aWMgQWNjZXNzaWJpbGl0eUV2ZW50RmlsdGVyIGZpbHRlckZvckV2ZW50VHlwZShpbnQgZXZlbnRUeXBlKSB7CisgICAgICAgIHJldHVybiAobmV3IEFjY2Vzc2liaWxpdHlFdmVudFR5cGVNYXRjaGVyKGV2ZW50VHlwZSkpOjptYXRjaGVzOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQWNjZXNzaWJpbGl0eUV2ZW50RmlsdGVyIGZpbHRlcldpbmRvd3NDaGFuZ2VkV2l0aENoYW5nZVR5cGVzKGludCBjaGFuZ2VzKSB7CisgICAgICAgIHJldHVybiAoYm90aChuZXcgQWNjZXNzaWJpbGl0eUV2ZW50VHlwZU1hdGNoZXIoQWNjZXNzaWJpbGl0eUV2ZW50LlRZUEVfV0lORE9XU19DSEFOR0VEKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hbmQobmV3IFdpbmRvd0NoYW5nZXNNYXRjaGVyKGNoYW5nZXMpKSk6Om1hdGNoZXM7CisgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQWNjZXNzaWJpbGl0eUV2ZW50VHlwZU1hdGNoZXIgZXh0ZW5kcyBUeXBlU2FmZU1hdGNoZXI8QWNjZXNzaWJpbGl0eUV2ZW50PiB7CisgICAgICAgIHByaXZhdGUgaW50IG1UeXBlOworCisgICAgICAgIHB1YmxpYyBBY2Nlc3NpYmlsaXR5RXZlbnRUeXBlTWF0Y2hlcihpbnQgdHlwZSkgeworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgICAgIG1UeXBlID0gdHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaGVzU2FmZWx5KEFjY2Vzc2liaWxpdHlFdmVudCBldmVudCkgeworICAgICAgICAgICAgcmV0dXJuIGV2ZW50LmdldEV2ZW50VHlwZSgpID09IG1UeXBlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGRlc2NyaWJlVG8oRGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHsKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uLmFwcGVuZFRleHQoIk1hdGNoaW5nIHRvIHR5cGUgIiArIG1UeXBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgV2luZG93Q2hhbmdlc01hdGNoZXIgZXh0ZW5kcyBUeXBlU2FmZU1hdGNoZXI8QWNjZXNzaWJpbGl0eUV2ZW50PiB7CisgICAgICAgIHByaXZhdGUgaW50IG1XaW5kb3dDaGFuZ2VzOworCisgICAgICAgIHB1YmxpYyBXaW5kb3dDaGFuZ2VzTWF0Y2hlcihpbnQgd2luZG93Q2hhbmdlcykgeworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgICAgIG1XaW5kb3dDaGFuZ2VzID0gd2luZG93Q2hhbmdlczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaGVzU2FmZWx5KEFjY2Vzc2liaWxpdHlFdmVudCBldmVudCkgeworICAgICAgICAgICAgcmV0dXJuIChldmVudC5nZXRXaW5kb3dDaGFuZ2VzKCkgJiBtV2luZG93Q2hhbmdlcykgPT0gbVdpbmRvd0NoYW5nZXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZGVzY3JpYmVUbyhEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgeworICAgICAgICAgICAgZGVzY3JpcHRpb24uYXBwZW5kVGV4dCgiV2l0aCB3aW5kb3cgY2hhbmdlIHR5cGUgIiArIG1XaW5kb3dDaGFuZ2VzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ29udGVudENoYW5nZXNNYXRjaGVyIGV4dGVuZHMgVHlwZVNhZmVNYXRjaGVyPEFjY2Vzc2liaWxpdHlFdmVudD4geworICAgICAgICBwcml2YXRlIGludCBtQ29udGVudENoYW5nZXM7CisKKyAgICAgICAgcHVibGljIENvbnRlbnRDaGFuZ2VzTWF0Y2hlcihpbnQgY29udGVudENoYW5nZXMpIHsKKyAgICAgICAgICAgIHN1cGVyKCk7CisgICAgICAgICAgICBtQ29udGVudENoYW5nZXMgPSBjb250ZW50Q2hhbmdlczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaGVzU2FmZWx5KEFjY2Vzc2liaWxpdHlFdmVudCBldmVudCkgeworICAgICAgICAgICAgcmV0dXJuIChldmVudC5nZXRDb250ZW50Q2hhbmdlVHlwZXMoKSAmIG1Db250ZW50Q2hhbmdlcykgPT0gbUNvbnRlbnRDaGFuZ2VzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGRlc2NyaWJlVG8oRGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHsKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uLmFwcGVuZFRleHQoIldpdGggd2luZG93IGNoYW5nZSB0eXBlICIgKyBtQ29udGVudENoYW5nZXMpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2Uvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvY3RzL3V0aWxzL0FjdGl2aXR5TGF1bmNoVXRpbHMuamF2YSBiL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy91dGlscy9BY3Rpdml0eUxhdW5jaFV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYwN2ZlNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy91dGlscy9BY3Rpdml0eUxhdW5jaFV0aWxzLmphdmEKQEAgLTAsMCArMSwxMDAgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQKKyAqIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUKKyAqIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuY3RzLnV0aWxzOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuY3RzLkFjY2Vzc2liaWxpdHlBY3Rpdml0eVRlc3RDYXNlCisgICAgICAgIC5USU1FT1VUX0FTWU5DX1BST0NFU1NJTkc7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworCitpbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZUluZm87CitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOworaW1wb3J0IGFuZHJvaWQuYXBwLlVpQXV0b21hdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eVdpbmRvd0luZm87CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBVdGlsaXRpZXMgdXNlZnVsIHdoZW4gbGF1bmNoaW5nIGFuIGFjdGl2aXR5IHRvIG1ha2Ugc3VyZSBpdCdzIGFsbCB0aGUgd2F5IG9uIHRoZSBzY3JlZW4KKyAqIGJlZm9yZSB3ZSBzdGFydCB0ZXN0aW5nIGl0LgorICovCitwdWJsaWMgY2xhc3MgQWN0aXZpdHlMYXVuY2hVdGlscyB7CisgICAgLy8gVXNpbmcgYSBzdGF0aWMgdmFyaWFibGUgc28gaXQgY2FuIGJlIHVzZWQgaW4gbGFtYmRhcy4gTm90IHByZXNlcnZpbmcgc3RhdGUgaW4gaXQuCisgICAgcHJpdmF0ZSBzdGF0aWMgQWN0aXZpdHkgbVRlbXBBY3Rpdml0eTsKKworICAgIHB1YmxpYyBzdGF0aWMgQWN0aXZpdHkgbGF1bmNoQWN0aXZpdHlBbmRXYWl0Rm9ySXRUb0JlT25zY3JlZW4oSW5zdHJ1bWVudGF0aW9uIGluc3RydW1lbnRhdGlvbiwKKyAgICAgICAgICAgIFVpQXV0b21hdGlvbiB1aUF1dG9tYXRpb24sIEFjdGl2aXR5VGVzdFJ1bGU8PyBleHRlbmRzIEFjdGl2aXR5PiBydWxlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgaW50W10gbG9jYXRpb24gPSBuZXcgaW50WzJdOworICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGFjdGl2aXR5UGFja2FnZSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGZpbmFsIFJlY3QgYm91bmRzID0gbmV3IFJlY3QoKTsKKyAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBhY3Rpdml0eVRpdGxlID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGdldCB3aW5kb3cgZXZlbnRzLCBzbyB3ZSdsbCBrbm93IHdoZW4gdGhlIHdpbmRvdyBhcHBlYXJzCisgICAgICAgIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyBpbmZvID0gdWlBdXRvbWF0aW9uLmdldFNlcnZpY2VJbmZvKCk7CisgICAgICAgIGluZm8uZmxhZ3MgfD0gQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvLkZMQUdfUkVUUklFVkVfSU5URVJBQ1RJVkVfV0lORE9XUzsKKyAgICAgICAgdWlBdXRvbWF0aW9uLnNldFNlcnZpY2VJbmZvKGluZm8pOworICAgICAgICBmaW5hbCBBY2Nlc3NpYmlsaXR5RXZlbnQgYXdhaXRlZEV2ZW50ID0gdWlBdXRvbWF0aW9uLmV4ZWN1dGVBbmRXYWl0Rm9yRXZlbnQoCisgICAgICAgICAgICAgICAgKCkgLT4geworICAgICAgICAgICAgICAgICAgICBtVGVtcEFjdGl2aXR5ID0gcnVsZS5sYXVuY2hBY3Rpdml0eShudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgaW5zdHJ1bWVudGF0aW9uLnJ1bk9uTWFpblN5bmMoKCkgLT4geworICAgICAgICAgICAgICAgICAgICAgICAgbVRlbXBBY3Rpdml0eS5nZXRXaW5kb3coKS5nZXREZWNvclZpZXcoKS5nZXRMb2NhdGlvbk9uU2NyZWVuKGxvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5UGFja2FnZS5hcHBlbmQobVRlbXBBY3Rpdml0eS5nZXRQYWNrYWdlTmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgIGluc3RydW1lbnRhdGlvbi53YWl0Rm9ySWRsZVN5bmMoKTsKKyAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHlUaXRsZS5hcHBlbmQoZ2V0QWN0aXZpdHlUaXRsZShpbnN0cnVtZW50YXRpb24sIG1UZW1wQWN0aXZpdHkpKTsKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIChldmVudCkgLT4geworICAgICAgICAgICAgICAgICAgICBmaW5hbCBBY2Nlc3NpYmlsaXR5V2luZG93SW5mbyB3aW5kb3cgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRXaW5kb3dCeVRpdGxlKHVpQXV0b21hdGlvbiwgYWN0aXZpdHlUaXRsZSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB3aW5kb3cuZ2V0Qm91bmRzSW5TY3JlZW4oYm91bmRzKTsKKyAgICAgICAgICAgICAgICAgICAgbVRlbXBBY3Rpdml0eS5nZXRXaW5kb3coKS5nZXREZWNvclZpZXcoKS5nZXRMb2NhdGlvbk9uU2NyZWVuKGxvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJvdW5kcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCFib3VuZHMuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChib3VuZHMubGVmdCA9PSBsb2NhdGlvblswXSkgJiYgKGJvdW5kcy50b3AgPT0gbG9jYXRpb25bMV0pOworICAgICAgICAgICAgICAgIH0sIFRJTUVPVVRfQVNZTkNfUFJPQ0VTU0lORyk7CisgICAgICAgIGFzc2VydE5vdE51bGwoYXdhaXRlZEV2ZW50KTsKKyAgICAgICAgcmV0dXJuIG1UZW1wQWN0aXZpdHk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBDaGFyU2VxdWVuY2UgZ2V0QWN0aXZpdHlUaXRsZSgKKyAgICAgICAgICAgIEluc3RydW1lbnRhdGlvbiBpbnN0cnVtZW50YXRpb24sIEFjdGl2aXR5IGFjdGl2aXR5KSB7CisgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgdGl0bGVCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgaW5zdHJ1bWVudGF0aW9uLnJ1bk9uTWFpblN5bmMoKCkgLT4gdGl0bGVCdWlsZGVyLmFwcGVuZChhY3Rpdml0eS5nZXRUaXRsZSgpKSk7CisgICAgICAgIHJldHVybiB0aXRsZUJ1aWxkZXI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBBY2Nlc3NpYmlsaXR5V2luZG93SW5mbyBmaW5kV2luZG93QnlUaXRsZSgKKyAgICAgICAgICAgIFVpQXV0b21hdGlvbiB1aUF1dG9tYXRpb24sIENoYXJTZXF1ZW5jZSB0aXRsZSkgeworICAgICAgICBmaW5hbCBMaXN0PEFjY2Vzc2liaWxpdHlXaW5kb3dJbmZvPiB3aW5kb3dzID0gdWlBdXRvbWF0aW9uLmdldFdpbmRvd3MoKTsKKyAgICAgICAgQWNjZXNzaWJpbGl0eVdpbmRvd0luZm8gcmV0dXJuVmFsdWUgPSBudWxsOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdpbmRvd3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIEFjY2Vzc2liaWxpdHlXaW5kb3dJbmZvIHdpbmRvdyA9IHdpbmRvd3MuZ2V0KGkpOworICAgICAgICAgICAgaWYgKFRleHRVdGlscy5lcXVhbHModGl0bGUsIHdpbmRvdy5nZXRUaXRsZSgpKSkgeworICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gd2luZG93OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB3aW5kb3cucmVjeWNsZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9jdHMvdXRpbHMvQXN5bmNVdGlscy5qYXZhIGIvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2Uvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvY3RzL3V0aWxzL0FzeW5jVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmJiNzM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2Uvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvY3RzL3V0aWxzL0FzeW5jVXRpbHMuamF2YQpAQCAtMCwwICsxLDk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLmN0cy51dGlsczsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLmN0cy51dGlscy5DdHNUZXN0VXRpbHMuYXNzZXJ0VGhyb3dzOworCitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0Lk1JTExJU0VDT05EUzsKKworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYW5jZWxsYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Cb29sZWFuU3VwcGxpZXI7CisKK3B1YmxpYyBjbGFzcyBBc3luY1V0aWxzIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgREVGQVVMVF9USU1FT1VUX01TID0gNTAwMDsKKworICAgIHByaXZhdGUgQXN5bmNVdGlscygpIHt9CisKKyAgICBwdWJsaWMgc3RhdGljIDxUPiBUIGF3YWl0KEZ1dHVyZTxUPiBmKSB7CisgICAgICAgIHJldHVybiBhd2FpdChmLCBERUZBVUxUX1RJTUVPVVRfTVMsIE1JTExJU0VDT05EUyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyA8VD4gVCBhd2FpdChGdXR1cmU8VD4gZiwgbG9uZyB0aW1lLCBUaW1lVW5pdCB0aW1lVW5pdCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGYuZ2V0KHRpbWUsIHRpbWVVbml0KTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBUaHJvd2FibGUgYXdhaXRGYWlsdXJlKEZ1dHVyZTw/PiBmKSB7CisgICAgICAgIHJldHVybiBhd2FpdEZhaWx1cmUoZiwgREVGQVVMVF9USU1FT1VUX01TLCBNSUxMSVNFQ09ORFMpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgVGhyb3dhYmxlIGF3YWl0RmFpbHVyZShGdXR1cmU8Pz4gZiwgbG9uZyB0aW1lLCBUaW1lVW5pdCB0aW1lVW5pdCkgeworICAgICAgICByZXR1cm4gYXNzZXJ0VGhyb3dzKCgpIC0+IGF3YWl0KGYsIHRpbWUsIHRpbWVVbml0KSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyA8VD4gQ2FuY2VsbGF0aW9uRXhjZXB0aW9uIGF3YWl0Q2FuY2VsbGF0aW9uKEZ1dHVyZTxUPiBmKSB7CisgICAgICAgcmV0dXJuIGF3YWl0Q2FuY2VsbGF0aW9uKGYsIERFRkFVTFRfVElNRU9VVF9NUywgTUlMTElTRUNPTkRTKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIDxUPiBDYW5jZWxsYXRpb25FeGNlcHRpb24gYXdhaXRDYW5jZWxsYXRpb24oCisgICAgICAgICAgICBGdXR1cmU8VD4gZiwgbG9uZyB0aW1lLCBUaW1lVW5pdCB0aW1lVW5pdCkgeworICAgICAgICBUaHJvd2FibGUgZXggPSBhd2FpdEZhaWx1cmUoZiwgdGltZSwgdGltZVVuaXQpOworICAgICAgICBUaHJvd2FibGUgY3VycmVudCA9IGV4OworICAgICAgICB3aGlsZSAoY3VycmVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoY3VycmVudCBpbnN0YW5jZW9mIENhbmNlbGxhdGlvbkV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgIHJldHVybiAoQ2FuY2VsbGF0aW9uRXhjZXB0aW9uKSBjdXJyZW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuZ2V0Q2F1c2UoKTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIkV4cGVjdGVkIGNhbmNlbGxhdGlvbiIsIGV4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd2FpdE9uKE9iamVjdCBub3RpZnlMb2NrLCBCb29sZWFuU3VwcGxpZXIgY29uZGl0aW9uKSB7CisgICAgICAgIHdhaXRPbihub3RpZnlMb2NrLCBjb25kaXRpb24sIERFRkFVTFRfVElNRU9VVF9NUyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHdhaXRPbihPYmplY3Qgbm90aWZ5TG9jaywgQm9vbGVhblN1cHBsaWVyIGNvbmRpdGlvbiwgbG9uZyB0aW1lb3V0TXMpIHsKKyAgICAgICAgaWYgKGNvbmRpdGlvbi5nZXRBc0Jvb2xlYW4oKSkgcmV0dXJuOworCisgICAgICAgIHN5bmNocm9uaXplZCAobm90aWZ5TG9jaykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBsb25nIHRpbWVTbGVwdCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKCFjb25kaXRpb24uZ2V0QXNCb29sZWFuKCkgJiYgdGltZVNsZXB0IDwgdGltZW91dE1zKSB7CisgICAgICAgICAgICAgICAgICAgIGxvbmcgc2xlZXBTdGFydCA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworICAgICAgICAgICAgICAgICAgICBub3RpZnlMb2NrLndhaXQodGltZW91dE1zIC0gdGltZVNsZXB0KTsKKyAgICAgICAgICAgICAgICAgICAgdGltZVNsZXB0ICs9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpIC0gc2xlZXBTdGFydDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFjb25kaXRpb24uZ2V0QXNCb29sZWFuKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJUaW1lZCBvdXQgYWZ0ZXIgIiArIHRpbWVTbGVwdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm1zIHdhaXRpbmcgZm9yIGNvbmRpdGlvbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy91dGlscy9DdHNUZXN0VXRpbHMuamF2YSBiL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy91dGlscy9DdHNUZXN0VXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDU0ODNiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2Uvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvY3RzL3V0aWxzL0N0c1Rlc3RVdGlscy5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuY3RzLnV0aWxzOworCisKK3B1YmxpYyBjbGFzcyBDdHNUZXN0VXRpbHMgeworICAgIHByaXZhdGUgQ3RzVGVzdFV0aWxzKCkge30KKworICAgIHB1YmxpYyBzdGF0aWMgVGhyb3dhYmxlIGFzc2VydFRocm93cyhSdW5uYWJsZSBhY3Rpb24pIHsKKyAgICAgICAgcmV0dXJuIGFzc2VydFRocm93cyhUaHJvd2FibGUuY2xhc3MsIGFjdGlvbik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyA8RSBleHRlbmRzIFRocm93YWJsZT4gRSBhc3NlcnRUaHJvd3MoQ2xhc3M8RT4gZXhjZXB0aW9uQ2xhc3MsIFJ1bm5hYmxlIGFjdGlvbikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgYWN0aW9uLnJ1bigpOworICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJFeHBlY3RlZCBhbiBleGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgICAgIGlmIChleGNlcHRpb25DbGFzcy5pc0luc3RhbmNlKGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChFKSBlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9jdHMvdXRpbHMvRGlzcGxheVV0aWxzLmphdmEgYi90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9jdHMvdXRpbHMvRGlzcGxheVV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY1ZDg1OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy91dGlscy9EaXNwbGF5VXRpbHMuamF2YQpAQCAtMCwwICsxLDMxIEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0CisgKiBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlCisgKiBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLmN0cy51dGlsczsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OworCisvKioKKyAqIFV0aWxpdGllcyBuZWVkZWQgd2hlbiBpbnRlcmFjdGluZyB3aXRoIHRoZSBkaXNwbGF5CisgKi8KK3B1YmxpYyBjbGFzcyBEaXNwbGF5VXRpbHMgeworICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFN0YXR1c0JhckhlaWdodChBY3Rpdml0eSBhY3Rpdml0eSkgeworICAgICAgICBmaW5hbCBSZWN0IHJlY3QgPSBuZXcgUmVjdCgpOworICAgICAgICBXaW5kb3cgd2luZG93ID0gYWN0aXZpdHkuZ2V0V2luZG93KCk7CisgICAgICAgIHdpbmRvdy5nZXREZWNvclZpZXcoKS5nZXRXaW5kb3dWaXNpYmxlRGlzcGxheUZyYW1lKHJlY3QpOworICAgICAgICByZXR1cm4gcmVjdC50b3A7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2Uvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvY3RzL3V0aWxzL0V2ZW50Q2FwdHVyaW5nVG91Y2hMaXN0ZW5lci5qYXZhIGIvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2Uvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvY3RzL3V0aWxzL0V2ZW50Q2FwdHVyaW5nVG91Y2hMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3YWU0NTkyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2Uvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvY3RzL3V0aWxzL0V2ZW50Q2FwdHVyaW5nVG91Y2hMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuY3RzLnV0aWxzOworCisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQmxvY2tpbmdRdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5MaW5rZWRCbG9ja2luZ1F1ZXVlOworCitwdWJsaWMgY2xhc3MgRXZlbnRDYXB0dXJpbmdUb3VjaExpc3RlbmVyIGltcGxlbWVudHMgVmlldy5PblRvdWNoTGlzdGVuZXIgeworCisgICAgcHVibGljIGZpbmFsIEJsb2NraW5nUXVldWU8TW90aW9uRXZlbnQ+IGV2ZW50cyA9IG5ldyBMaW5rZWRCbG9ja2luZ1F1ZXVlPD4oKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2goVmlldyB2aWV3LCBNb3Rpb25FdmVudCBtb3Rpb25FdmVudCkgeworICAgICAgICBhc3NlcnRUcnVlKGV2ZW50cy5vZmZlcihNb3Rpb25FdmVudC5vYnRhaW4obW90aW9uRXZlbnQpKSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy91dGlscy9HZXN0dXJlVXRpbHMuamF2YSBiL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy91dGlscy9HZXN0dXJlVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzZhNmRhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2Uvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvY3RzL3V0aWxzL0dlc3R1cmVVdGlscy5qYXZhCkBAIC0wLDAgKzEsMTQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLmN0cy51dGlsczsKKworaW1wb3J0IGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2UuR2VzdHVyZVJlc3VsdENhbGxiYWNrOworaW1wb3J0IGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuR2VzdHVyZURlc2NyaXB0aW9uOworaW1wb3J0IGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuR2VzdHVyZURlc2NyaXB0aW9uLlN0cm9rZURlc2NyaXB0aW9uOworaW1wb3J0IGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuY3RzLkluc3RydW1lbnRlZEFjY2Vzc2liaWxpdHlTZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGF0aDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvaW50RjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0NvbmZpZ3VyYXRpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db21wbGV0YWJsZUZ1dHVyZTsKKworcHVibGljIGNsYXNzIEdlc3R1cmVVdGlscyB7CisKKyAgICBwcml2YXRlIEdlc3R1cmVVdGlscygpIHt9CisKKyAgICBwdWJsaWMgc3RhdGljIENvbXBsZXRhYmxlRnV0dXJlPFZvaWQ+IGRpc3BhdGNoR2VzdHVyZSgKKyAgICAgICAgICAgIEluc3RydW1lbnRlZEFjY2Vzc2liaWxpdHlTZXJ2aWNlIHNlcnZpY2UsCisgICAgICAgICAgICBHZXN0dXJlRGVzY3JpcHRpb24gZ2VzdHVyZSkgeworICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxWb2lkPiByZXN1bHQgPSBuZXcgQ29tcGxldGFibGVGdXR1cmU8PigpOworICAgICAgICBHZXN0dXJlUmVzdWx0Q2FsbGJhY2sgY2FsbGJhY2sgPSBuZXcgR2VzdHVyZVJlc3VsdENhbGxiYWNrKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbXBsZXRlZChHZXN0dXJlRGVzY3JpcHRpb24gZ2VzdHVyZURlc2NyaXB0aW9uKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0LmNvbXBsZXRlKG51bGwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2FuY2VsbGVkKEdlc3R1cmVEZXNjcmlwdGlvbiBnZXN0dXJlRGVzY3JpcHRpb24pIHsKKyAgICAgICAgICAgICAgICByZXN1bHQuY2FuY2VsKGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgc2VydmljZS5ydW5PblNlcnZpY2VTeW5jKCgpIC0+IHsKKyAgICAgICAgICAgIGlmICghc2VydmljZS5kaXNwYXRjaEdlc3R1cmUoZ2VzdHVyZSwgY2FsbGJhY2ssIG51bGwpKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0LmNvbXBsZXRlRXhjZXB0aW9uYWxseShuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cm9rZURlc2NyaXB0aW9uIHBvaW50ZXJEb3duKFBvaW50RiBwb2ludCkgeworICAgICAgICByZXR1cm4gbmV3IFN0cm9rZURlc2NyaXB0aW9uKHBhdGgocG9pbnQpLCAwLCBWaWV3Q29uZmlndXJhdGlvbi5nZXRUYXBUaW1lb3V0KCksIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3Ryb2tlRGVzY3JpcHRpb24gcG9pbnRlclVwKFN0cm9rZURlc2NyaXB0aW9uIGxhc3RTdHJva2UpIHsKKyAgICAgICAgcmV0dXJuIGxhc3RTdHJva2UuY29udGludWVTdHJva2UocGF0aChsYXN0UG9pbnRPZihsYXN0U3Ryb2tlKSksCisgICAgICAgICAgICAgICAgZW5kVGltZU9mKGxhc3RTdHJva2UpLCBWaWV3Q29uZmlndXJhdGlvbi5nZXRUYXBUaW1lb3V0KCksIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFBvaW50RiBsYXN0UG9pbnRPZihTdHJva2VEZXNjcmlwdGlvbiBzdHJva2UpIHsKKyAgICAgICAgZmxvYXRbXSBwID0gc3Ryb2tlLmdldFBhdGgoKS5hcHByb3hpbWF0ZSgwLjNmKTsKKyAgICAgICAgcmV0dXJuIG5ldyBQb2ludEYocFtwLmxlbmd0aCAtIDJdLCBwW3AubGVuZ3RoIC0gMV0pOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3Ryb2tlRGVzY3JpcHRpb24gY2xpY2soUG9pbnRGIHBvaW50KSB7CisgICAgICAgIHJldHVybiBuZXcgU3Ryb2tlRGVzY3JpcHRpb24ocGF0aChwb2ludCksIDAsIFZpZXdDb25maWd1cmF0aW9uLmdldFRhcFRpbWVvdXQoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJva2VEZXNjcmlwdGlvbiBsb25nQ2xpY2soUG9pbnRGIHBvaW50KSB7CisgICAgICAgIHJldHVybiBuZXcgU3Ryb2tlRGVzY3JpcHRpb24ocGF0aChwb2ludCksIDAsCisgICAgICAgICAgICAgICAgVmlld0NvbmZpZ3VyYXRpb24uZ2V0TG9uZ1ByZXNzVGltZW91dCgpICogMyAvIDIpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3Ryb2tlRGVzY3JpcHRpb24gc3dpcGUoUG9pbnRGIGZyb20sIFBvaW50RiB0bykgeworICAgICAgICByZXR1cm4gc3dpcGUoZnJvbSwgdG8sIFZpZXdDb25maWd1cmF0aW9uLmdldFRhcFRpbWVvdXQoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJva2VEZXNjcmlwdGlvbiBzd2lwZShQb2ludEYgZnJvbSwgUG9pbnRGIHRvLCBsb25nIGR1cmF0aW9uKSB7CisgICAgICAgIHJldHVybiBuZXcgU3Ryb2tlRGVzY3JpcHRpb24ocGF0aChmcm9tLCB0byksIDAsIGR1cmF0aW9uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cm9rZURlc2NyaXB0aW9uIGRyYWcoU3Ryb2tlRGVzY3JpcHRpb24gZnJvbSwgUG9pbnRGIHRvKSB7CisgICAgICAgIHJldHVybiBmcm9tLmNvbnRpbnVlU3Ryb2tlKAorICAgICAgICAgICAgICAgIHBhdGgobGFzdFBvaW50T2YoZnJvbSksIHRvKSwKKyAgICAgICAgICAgICAgICBlbmRUaW1lT2YoZnJvbSksIFZpZXdDb25maWd1cmF0aW9uLmdldFRhcFRpbWVvdXQoKSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBQYXRoIHBhdGgoUG9pbnRGIGZpcnN0LCBQb2ludEYuLi4gcmVzdCkgeworICAgICAgICBQYXRoIHBhdGggPSBuZXcgUGF0aCgpOworICAgICAgICBwYXRoLm1vdmVUbyhmaXJzdC54LCBmaXJzdC55KTsKKyAgICAgICAgZm9yIChQb2ludEYgcG9pbnQgOiByZXN0KSB7CisgICAgICAgICAgICBwYXRoLmxpbmVUbyhwb2ludC54LCBwb2ludC55KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGF0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cm9rZURlc2NyaXB0aW9uIHN0YXJ0aW5nQXQobG9uZyB0aW1lTXMsIFN0cm9rZURlc2NyaXB0aW9uIHByb3RvdHlwZSkgeworICAgICAgICByZXR1cm4gbmV3IFN0cm9rZURlc2NyaXB0aW9uKAorICAgICAgICAgICAgICAgIHByb3RvdHlwZS5nZXRQYXRoKCksIHRpbWVNcywgcHJvdG90eXBlLmdldER1cmF0aW9uKCksIHByb3RvdHlwZS53aWxsQ29udGludWUoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBsb25nIGVuZFRpbWVPZihTdHJva2VEZXNjcmlwdGlvbiBzdHJva2UpIHsKKyAgICAgICAgcmV0dXJuIHN0cm9rZS5nZXRTdGFydFRpbWUoKSArIHN0cm9rZS5nZXREdXJhdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmxvYXQgZGlzdGFuY2UoUG9pbnRGIGEsIFBvaW50RiBiKSB7CisgICAgICAgIGlmIChhID09IG51bGwpIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgICAgICBpZiAoYiA9PSBudWxsKSB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICAgICAgcmV0dXJuIChmbG9hdCkgTWF0aC5oeXBvdChhLnggLSBiLngsIGEueSAtIGIueSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBQb2ludEYgYWRkKFBvaW50RiBhLCBmbG9hdCB4LCBmbG9hdCB5KSB7CisgICAgICAgIHJldHVybiBuZXcgUG9pbnRGKGEueCArIHgsIGEueSArIHkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUG9pbnRGIGFkZChQb2ludEYgYSwgUG9pbnRGIGIpIHsKKyAgICAgICAgcmV0dXJuIGFkZChhLCBiLngsIGIueSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBQb2ludEYgZGlmZihQb2ludEYgYSwgUG9pbnRGIGIpIHsKKyAgICAgICAgcmV0dXJuIGFkZChhLCAtYi54LCAtYi55KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFBvaW50RiBuZWdhdGUoUG9pbnRGIHApIHsKKyAgICAgICAgcmV0dXJuIHRpbWVzKC0xLCBwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFBvaW50RiB0aW1lcyhmbG9hdCBtdWx0LCBQb2ludEYgcCkgeworICAgICAgICByZXR1cm4gbmV3IFBvaW50RihwLnggKiBtdWx0LCBwLnkgKiBtdWx0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZsb2F0IGxlbmd0aChQb2ludEYgcCkgeworICAgICAgICByZXR1cm4gKGZsb2F0KSBNYXRoLmh5cG90KHAueCwgcC55KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFBvaW50RiBjZWlsKFBvaW50RiBwKSB7CisgICAgICAgIHJldHVybiBuZXcgUG9pbnRGKChmbG9hdCkgTWF0aC5jZWlsKHAueCksIChmbG9hdCkgTWF0aC5jZWlsKHAueSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy91dGlscy9SdW5Pbk1haW5VdGlscy5qYXZhIGIvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2Uvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvY3RzL3V0aWxzL1J1bk9uTWFpblV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBjNDg2MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL2N0cy91dGlscy9SdW5Pbk1haW5VdGlscy5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHMudXRpbHM7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljUmVmZXJlbmNlOworCisvKioKKyAqIFV0aWxpdGllcyB0byByZXR1cm4gdmFsdWVzIGZyb20ge0BsaW5rIEluc3RydW1lbnRhdGlvbiNydW5Pbk1haW5TeW5jKCl9CisgKi8KK3B1YmxpYyBjbGFzcyBSdW5Pbk1haW5VdGlscyB7CisgICAgLyoqCisgICAgICogRXhlY3V0ZSBhIGNhbGxhYmxlIG9uIG1haW4gYW5kIHJldHVybiBpdHMgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxUIGV4dGVuZHMgT2JqZWN0PiBUIGdldE9uTWFpbigKKyAgICAgICAgICAgIEluc3RydW1lbnRhdGlvbiBpbnN0cnVtZW50YXRpb24sIENhbGxhYmxlPFQ+IGNhbGxhYmxlKSB7CisgICAgICAgIEF0b21pY1JlZmVyZW5jZTxUPiByZXR1cm5WYWx1ZSA9IG5ldyBBdG9taWNSZWZlcmVuY2U8PihudWxsKTsKKyAgICAgICAgQXRvbWljUmVmZXJlbmNlPFRocm93YWJsZT4gdGhyb3dhYmxlID0gbmV3IEF0b21pY1JlZmVyZW5jZTw+KG51bGwpOworICAgICAgICBpbnN0cnVtZW50YXRpb24ucnVuT25NYWluU3luYygoKSAtPiB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldChjYWxsYWJsZS5jYWxsKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvd2FibGUuc2V0KGUpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgaWYgKHRocm93YWJsZS5nZXQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbih0aHJvd2FibGUuZ2V0KCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZS5nZXQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS90ZXN0LWFwcHMvQW5kcm9pZC5tayBiL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3Rlc3QtYXBwcy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YWZjZjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS90ZXN0LWFwcHMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDIzIEBACisjIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCisjIHRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0CitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworCisjIEJ1aWxkIHRoZSB0ZXN0IEFQS3MgdXNpbmcgdGhlaXIgb3duIG1ha2VmaWxlcworaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQpkaWZmIC0tZ2l0IGEvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2UvdGVzdC1hcHBzL1dpZGdldFByb3ZpZGVyL0FuZHJvaWQubWsgYi90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS90ZXN0LWFwcHMvV2lkZ2V0UHJvdmlkZXIvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzVmODNjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2UvdGVzdC1hcHBzL1dpZGdldFByb3ZpZGVyL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCisKKyMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzIGN0c19pbnN0YW50CisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNBY2Nlc3NpYmlsaXR5V2lkZ2V0UHJvdmlkZXIKKworTE9DQUxfU0RLX1ZFUlNJT04gOj0gdGVzdF9jdXJyZW50CisKK2luY2x1ZGUgJChCVUlMRF9DVFNfU1VQUE9SVF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2UvdGVzdC1hcHBzL1dpZGdldFByb3ZpZGVyL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS90ZXN0LWFwcHMvV2lkZ2V0UHJvdmlkZXIvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTYyOGJmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2UvdGVzdC1hcHBzL1dpZGdldFByb3ZpZGVyL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwzMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICAgIHBhY2thZ2U9ImZvby5iYXIuYmF6IgorICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0U2FuZGJveFZlcnNpb249IjIiPgorCisgICAgPGFwcGxpY2F0aW9uPgorICAgICAgICA8cmVjZWl2ZXIgYW5kcm9pZDpuYW1lPSJmb28uYmFyLmJhei5NeUFwcFdpZGdldFByb3ZpZGVyIiA+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hcHB3aWRnZXQuYWN0aW9uLkFQUFdJREdFVF9VUERBVEUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hcHB3aWRnZXQucHJvdmlkZXIiCisgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cmVzb3VyY2U9IkB4bWwvYXBwd2lkZ2V0X2luZm8iIC8+CisgICAgICAgIDwvcmVjZWl2ZXI+CisgICAgPC9hcHBsaWNhdGlvbj4KKworPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3Rlc3QtYXBwcy9XaWRnZXRQcm92aWRlci9yZXMvZHJhd2FibGUvYW5kcm9pZF9pY29uLnBuZyBiL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3Rlc3QtYXBwcy9XaWRnZXRQcm92aWRlci9yZXMvZHJhd2FibGUvYW5kcm9pZF9pY29uLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmE5N2E1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2UvdGVzdC1hcHBzL1dpZGdldFByb3ZpZGVyL3Jlcy9kcmF3YWJsZS9hbmRyb2lkX2ljb24ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3Rlc3QtYXBwcy9XaWRnZXRQcm92aWRlci9yZXMvbGF5b3V0L2luaXRpYWxfbGF5b3V0LnhtbCBiL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3Rlc3QtYXBwcy9XaWRnZXRQcm92aWRlci9yZXMvbGF5b3V0L2luaXRpYWxfbGF5b3V0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWJlYzlmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2UvdGVzdC1hcHBzL1dpZGdldFByb3ZpZGVyL3Jlcy9sYXlvdXQvaW5pdGlhbF9sYXlvdXQueG1sCkBAIC0wLDAgKzEsMjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+CisKKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPEJ1dHRvbiB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+Cis8L0J1dHRvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3Rlc3QtYXBwcy9XaWRnZXRQcm92aWRlci9yZXMvdmFsdWVzL2NvbnN0YW50cy54bWwgYi90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS90ZXN0LWFwcHMvV2lkZ2V0UHJvdmlkZXIvcmVzL3ZhbHVlcy9jb25zdGFudHMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyOWU4ZGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9hY2Nlc3NpYmlsaXR5c2VydmljZS90ZXN0LWFwcHMvV2lkZ2V0UHJvdmlkZXIvcmVzL3ZhbHVlcy9jb25zdGFudHMueG1sCkBAIC0wLDAgKzEsMjcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+CisKKzwhLS0KKyAgICAgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHJlc291cmNlcz4KKyAgICA8IS0tIEFwcCB3aWRnZXQgcHJvdmlkZXIgLS0+CisgICAgPGRpbWVuIG5hbWU9Im1pbl9hcHB3aWRnZXRfc2l6ZSI+NDBkcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9Im1pbl9yZXNpemVfYXBwd2lkZ2V0X3NpemUiPjYwZHA8L2RpbWVuPgorICAgIDxpbnRlZ2VyIG5hbWU9InVwZGF0ZV9wZXJpb2RfbWlsbGlzIj44NjQwMDAwMDwvaW50ZWdlcj4KKyAgICA8aW50ZWdlciBuYW1lPSJyZXNpemVfbW9kZSI+MzwvaW50ZWdlcj4KKyAgICA8aW50ZWdlciBuYW1lPSJ3aWRnZXRfY2F0ZWdvcnkiPjM8L2ludGVnZXI+CisgICAgPGl0ZW0gdHlwZT0iaWQiIG5hbWU9ImF1dG9fYWR2YW5jZV92aWV3X2lkIi8+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3Rlc3QtYXBwcy9XaWRnZXRQcm92aWRlci9yZXMveG1sL2FwcHdpZGdldF9pbmZvLnhtbCBiL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3Rlc3QtYXBwcy9XaWRnZXRQcm92aWRlci9yZXMveG1sL2FwcHdpZGdldF9pbmZvLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODNmNTQzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2UvdGVzdC1hcHBzL1dpZGdldFByb3ZpZGVyL3Jlcy94bWwvYXBwd2lkZ2V0X2luZm8ueG1sCkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+CisKKzwhLS0KKyAgICAgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxhcHB3aWRnZXQtcHJvdmlkZXIgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bWluV2lkdGg9IkBkaW1lbi9taW5fYXBwd2lkZ2V0X3NpemUiCisgICAgYW5kcm9pZDptaW5IZWlnaHQ9IkBkaW1lbi9taW5fYXBwd2lkZ2V0X3NpemUiCisgICAgYW5kcm9pZDptaW5SZXNpemVXaWR0aD0iQGRpbWVuL21pbl9yZXNpemVfYXBwd2lkZ2V0X3NpemUiCisgICAgYW5kcm9pZDptaW5SZXNpemVIZWlnaHQ9IkBkaW1lbi9taW5fcmVzaXplX2FwcHdpZGdldF9zaXplIgorICAgIGFuZHJvaWQ6dXBkYXRlUGVyaW9kTWlsbGlzPSJAaW50ZWdlci91cGRhdGVfcGVyaW9kX21pbGxpcyIKKyAgICBhbmRyb2lkOnJlc2l6ZU1vZGU9Imhvcml6b250YWx8dmVydGljYWwiCisgICAgYW5kcm9pZDp3aWRnZXRDYXRlZ29yeT0iaG9tZV9zY3JlZW4iCisgICAgYW5kcm9pZDppbml0aWFsTGF5b3V0PSJAbGF5b3V0L2luaXRpYWxfbGF5b3V0IgorICAgIGFuZHJvaWQ6cHJldmlld0ltYWdlPSJAZHJhd2FibGUvYW5kcm9pZF9pY29uIgorICAgIGFuZHJvaWQ6YXV0b0FkdmFuY2VWaWV3SWQ9IkBpZC9hdXRvX2FkdmFuY2Vfdmlld19pZCI+Cis8L2FwcHdpZGdldC1wcm92aWRlcj4KZGlmZiAtLWdpdCBhL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3Rlc3QtYXBwcy9XaWRnZXRQcm92aWRlci9zcmMvZm9vL2Jhci9iYXovTXlBcHBXaWRnZXRQcm92aWRlci5qYXZhIGIvdGVzdHMvYWNjZXNzaWJpbGl0eXNlcnZpY2UvdGVzdC1hcHBzL1dpZGdldFByb3ZpZGVyL3NyYy9mb28vYmFyL2Jhei9NeUFwcFdpZGdldFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMwYjU1NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL3Rlc3QtYXBwcy9XaWRnZXRQcm92aWRlci9zcmMvZm9vL2Jhci9iYXovTXlBcHBXaWRnZXRQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2UgZm9vLmJhci5iYXo7CisKK2ltcG9ydCBhbmRyb2lkLmFwcHdpZGdldC5BcHBXaWRnZXRQcm92aWRlcjsKKworcHVibGljIGNsYXNzIE15QXBwV2lkZ2V0UHJvdmlkZXIgZXh0ZW5kcyBBcHBXaWRnZXRQcm92aWRlciB7fQpkaWZmIC0tZ2l0IGEvdGVzdHMvYWRtaW4vQW5kcm9pZC5tayBiL3Rlc3RzL2FkbWluL0FuZHJvaWQubWsKaW5kZXggZWVmYzQ0ZS4uMzc3NWJhZiAxMDA2NDQKLS0tIGEvdGVzdHMvYWRtaW4vQW5kcm9pZC5taworKysgYi90ZXN0cy9hZG1pbi9BbmRyb2lkLm1rCkBAIC0yMSw3ICsyMSw5IEBACiBMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQogCiBMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAotICAgIGN0c3Rlc3RydW5uZXIgbW9ja2l0by10YXJnZXQtbWludXMtanVuaXQ0IGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwKKyAgICBjdHN0ZXN0cnVubmVyLWF4dCBtb2NraXRvLXRhcmdldC1taW51cy1qdW5pdDQKKworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lci5zdHVicyBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicwogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKZGlmZiAtLWdpdCBhL3Rlc3RzL2FkbWluL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9hZG1pbi9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGQzNDY3YWYuLjU0YWRmZjMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2FkbWluL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvYWRtaW4vQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjQsNyArMjQsNyBAQAogICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiLz4KICAgPC9hcHBsaWNhdGlvbj4KIAotICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuYWRtaW4uYXBwIgogICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IlRlc3RzIGZvciB0aGUgYWRtaW4gQVBJcy4iPgogICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0ibGlzdGVuZXIiCmRpZmYgLS1naXQgYS90ZXN0cy9hZG1pbi9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy9hZG1pbi9BbmRyb2lkVGVzdC54bWwKaW5kZXggYTAyMzNkNy4uOTQxMTViZCAxMDA2NDQKLS0tIGEvdGVzdHMvYWRtaW4vQW5kcm9pZFRlc3QueG1sCisrKyBiL3Rlc3RzL2FkbWluL0FuZHJvaWRUZXN0LnhtbApAQCAtMTQsNyArMTQsMTIgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIHRoZSBDVFMgZGV2aWNlIGFkbWluIHRlc3RzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iZnJhbWV3b3JrIiAvPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuU3dpdGNoVXNlclRhcmdldFByZXBhcmVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ1c2VyLXR5cGUiIHZhbHVlPSJzeXN0ZW0iIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisKICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgogICAgICAgICA8b3B0aW9uIG5hbWU9Imluc3RhbGwtYXJnIiB2YWx1ZT0iLXQiIC8+CkBAIC0yNSwxMCArMzAsMTIgQEAKICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlJ1bkNvbW1hbmRUYXJnZXRQcmVwYXJlciI+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icnVuLWNvbW1hbmQiIHZhbHVlPSJkcG0gc2V0LWFjdGl2ZS1hZG1pbiAtLXVzZXIgY3VyIGFuZHJvaWQuYWRtaW4uYXBwLy5DdHNEZXZpY2VBZG1pblJlY2VpdmVyIiAvPgogICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bi1jb21tYW5kIiB2YWx1ZT0iZHBtIHNldC1hY3RpdmUtYWRtaW4gLS11c2VyIGN1ciBhbmRyb2lkLmFkbWluLmFwcC8uQ3RzRGV2aWNlQWRtaW5SZWNlaXZlcjIiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVuLWNvbW1hbmQiIHZhbHVlPSJkcG0gc2V0LWFjdGl2ZS1hZG1pbiAtLXVzZXIgY3VyIGFuZHJvaWQuYWRtaW4uYXBwLy5DdHNEZXZpY2VBZG1pblJlY2VpdmVyMyIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJydW4tY29tbWFuZCIgdmFsdWU9ImRwbSBzZXQtcHJvZmlsZS1vd25lciAtLXVzZXIgY3VyIGFuZHJvaWQuYWRtaW4uYXBwLy5DdHNEZXZpY2VBZG1pblByb2ZpbGVPd25lciIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZWFyZG93bi1jb21tYW5kIiB2YWx1ZT0iZHBtIHJlbW92ZS1hY3RpdmUtYWRtaW4gLS11c2VyIGN1ciBhbmRyb2lkLmFkbWluLmFwcC8uQ3RzRGV2aWNlQWRtaW5Qcm9maWxlT3duZXIiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0idGVhcmRvd24tY29tbWFuZCIgdmFsdWU9ImRwbSByZW1vdmUtYWN0aXZlLWFkbWluIC0tdXNlciBjdXIgYW5kcm9pZC5hZG1pbi5hcHAvLkN0c0RldmljZUFkbWluUmVjZWl2ZXIiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0idGVhcmRvd24tY29tbWFuZCIgdmFsdWU9ImRwbSByZW1vdmUtYWN0aXZlLWFkbWluIC0tdXNlciBjdXIgYW5kcm9pZC5hZG1pbi5hcHAvLkN0c0RldmljZUFkbWluUmVjZWl2ZXIyIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlYXJkb3duLWNvbW1hbmQiIHZhbHVlPSJkcG0gcmVtb3ZlLWFjdGl2ZS1hZG1pbiAtLXVzZXIgY3VyIGFuZHJvaWQuYWRtaW4uYXBwLy5DdHNEZXZpY2VBZG1pblJlY2VpdmVyMyIgLz4KICAgICA8L3RhcmdldF9wcmVwYXJlcj4KIAogICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5BbmRyb2lkSlVuaXRUZXN0IiA+CmRpZmYgLS1naXQgYS90ZXN0cy9hZG1pbi9hcHAvQW5kcm9pZC5tayBiL3Rlc3RzL2FkbWluL2FwcC9BbmRyb2lkLm1rCmluZGV4IDIyYjVjODMuLmVlNGExNTggMTAwNjQ0Ci0tLSBhL3Rlc3RzL2FkbWluL2FwcC9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL2FkbWluL2FwcC9BbmRyb2lkLm1rCkBAIC0yMiw3ICsyMiw3IEBACiAKIExPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGd1YXZhCiAKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLXN1cHBvcnQtdGVzdCBsZWdhY3ktYW5kcm9pZC10ZXN0CitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZHgudGVzdC5ydWxlcwogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKZGlmZiAtLWdpdCBhL3Rlc3RzL2FkbWluL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvYWRtaW4vYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggNjNjNjUzYS4uMDMwNzQ4NyAxMDA2NDQKLS0tIGEvdGVzdHMvYWRtaW4vYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvYWRtaW4vYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTU4LDYgKzU4LDE1IEBACiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgIDwvcmVjZWl2ZXI+CiAKKyAgICAgICAgPHJlY2VpdmVyIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hZG1pbi5hcHAuQ3RzRGV2aWNlQWRtaW5SZWNlaXZlcjMiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnBlcm1pc3Npb249ImFuZHJvaWQucGVybWlzc2lvbi5CSU5EX0RFVklDRV9BRE1JTiI+CisgICAgICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hcHAuZGV2aWNlX2FkbWluIgorICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnJlc291cmNlPSJAeG1sL2RldmljZV9hZG1pbl8zIiAvPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYXBwLmFjdGlvbi5ERVZJQ0VfQURNSU5fRU5BQkxFRCIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9yZWNlaXZlcj4KKwogICAgICAgICA8IS0tIERldmljZSBBZG1pbiB0aGF0IG5lZWRzIHRvIGJlIGluIHRoZSBkZWFjdGl2YXRlZCBzdGF0ZSBpbiBvcmRlcgogICAgICAgICAgICAgIGZvciB0ZXN0cyB0byBwYXNzLiAtLT4KICAgICAgICAgPHJlY2VpdmVyIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hZG1pbi5hcHAuQ3RzRGV2aWNlQWRtaW5EZWFjdGl2YXRlZFJlY2VpdmVyIgpkaWZmIC0tZ2l0IGEvdGVzdHMvYWRtaW4vYXBwL3Jlcy94bWwvZGV2aWNlX2FkbWluXzMueG1sIGIvdGVzdHMvYWRtaW4vYXBwL3Jlcy94bWwvZGV2aWNlX2FkbWluXzMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZDczYTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9hZG1pbi9hcHAvcmVzL3htbC9kZXZpY2VfYWRtaW5fMy54bWwKQEAgLTAsMCArMSwyNSBAQAorPCEtLQorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxkZXZpY2UtYWRtaW4geG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8c3VwcG9ydC10cmFuc2Zlci1vd25lcnNoaXAgLz4KKyAgICA8dXNlcy1wb2xpY2llcz4KKyAgICAgICAgPGxpbWl0LXBhc3N3b3JkIC8+CisgICAgICAgIDxyZXNldC1wYXNzd29yZCAvPgorICAgICAgICA8d2lwZS1kYXRhIC8+CisgICAgPC91c2VzLXBvbGljaWVzPgorPC9kZXZpY2UtYWRtaW4+CisKZGlmZiAtLWdpdCBhL3Rlc3RzL2FkbWluL2FwcC9zcmMvYW5kcm9pZC9hZG1pbi9hcHAvQ3RzRGV2aWNlQWRtaW5SZWNlaXZlcjMuamF2YSBiL3Rlc3RzL2FkbWluL2FwcC9zcmMvYW5kcm9pZC9hZG1pbi9hcHAvQ3RzRGV2aWNlQWRtaW5SZWNlaXZlcjMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODA0YmVlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYWRtaW4vYXBwL3NyYy9hbmRyb2lkL2FkbWluL2FwcC9DdHNEZXZpY2VBZG1pblJlY2VpdmVyMy5qYXZhCkBAIC0wLDAgKzEsMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYWRtaW4uYXBwOworCitpbXBvcnQgYW5kcm9pZC5hcHAuYWRtaW4uRGV2aWNlQWRtaW5SZWNlaXZlcjsKKworcHVibGljIGNsYXNzIEN0c0RldmljZUFkbWluUmVjZWl2ZXIzIGV4dGVuZHMgRGV2aWNlQWRtaW5SZWNlaXZlciB7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9hZG1pbi9zcmMvYW5kcm9pZC9hZG1pbi9jdHMvRGV2aWNlQWRtaW5JbmZvVGVzdC5qYXZhIGIvdGVzdHMvYWRtaW4vc3JjL2FuZHJvaWQvYWRtaW4vY3RzL0RldmljZUFkbWluSW5mb1Rlc3QuamF2YQppbmRleCA0ZTRhZmY0Li4xNzkwNTAzIDEwMDY0NAotLS0gYS90ZXN0cy9hZG1pbi9zcmMvYW5kcm9pZC9hZG1pbi9jdHMvRGV2aWNlQWRtaW5JbmZvVGVzdC5qYXZhCisrKyBiL3Rlc3RzL2FkbWluL3NyYy9hbmRyb2lkL2FkbWluL2N0cy9EZXZpY2VBZG1pbkluZm9UZXN0LmphdmEKQEAgLTMwLDYgKzMwLDcgQEAKICAgICBwcml2YXRlIFBhY2thZ2VNYW5hZ2VyIG1QYWNrYWdlTWFuYWdlcjsKICAgICBwcml2YXRlIENvbXBvbmVudE5hbWUgbUNvbXBvbmVudDsKICAgICBwcml2YXRlIENvbXBvbmVudE5hbWUgbVNlY29uZENvbXBvbmVudDsKKyAgICBwcml2YXRlIENvbXBvbmVudE5hbWUgbVRoaXJkQ29tcG9uZW50OwogICAgIHByaXZhdGUgYm9vbGVhbiBtRGV2aWNlQWRtaW47CiAKICAgICBAT3ZlcnJpZGUKQEAgLTM4LDYgKzM5LDcgQEAKICAgICAgICAgbVBhY2thZ2VNYW5hZ2VyID0gbUNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKTsKICAgICAgICAgbUNvbXBvbmVudCA9IGdldFJlY2VpdmVyQ29tcG9uZW50KCk7CiAgICAgICAgIG1TZWNvbmRDb21wb25lbnQgPSBnZXRTZWNvbmRSZWNlaXZlckNvbXBvbmVudCgpOworICAgICAgICBtVGhpcmRDb21wb25lbnQgPSBnZXRUaGlyZFJlY2VpdmVyQ29tcG9uZW50KCk7CiAgICAgICAgIG1EZXZpY2VBZG1pbiA9CiAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKS5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfREVWSUNFX0FETUlOKTsKICAgICB9CkBAIC01MCw2ICs1MiwxMCBAQAogICAgICAgICByZXR1cm4gbmV3IENvbXBvbmVudE5hbWUoImFuZHJvaWQuYWRtaW4uYXBwIiwgImFuZHJvaWQuYWRtaW4uYXBwLkN0c0RldmljZUFkbWluUmVjZWl2ZXIyIik7CiAgICAgfQogCisgICAgc3RhdGljIENvbXBvbmVudE5hbWUgZ2V0VGhpcmRSZWNlaXZlckNvbXBvbmVudCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnROYW1lKCJhbmRyb2lkLmFkbWluLmFwcCIsICJhbmRyb2lkLmFkbWluLmFwcC5DdHNEZXZpY2VBZG1pblJlY2VpdmVyMyIpOworICAgIH0KKwogICAgIHN0YXRpYyBDb21wb25lbnROYW1lIGdldFByb2ZpbGVPd25lckNvbXBvbmVudCgpIHsKICAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnROYW1lKCJhbmRyb2lkLmFkbWluLmFwcCIsICJhbmRyb2lkLmFkbWluLmFwcC5DdHNEZXZpY2VBZG1pblByb2ZpbGVPd25lciIpOwogICAgIH0KQEAgLTY4LDYgKzc0LDcgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKG1Db21wb25lbnQuZ2V0UGFja2FnZU5hbWUoKSwgaW5mby5nZXRQYWNrYWdlTmFtZSgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKG1Db21wb25lbnQuZ2V0Q2xhc3NOYW1lKCksIGluZm8uZ2V0UmVjZWl2ZXJOYW1lKCkpOwogCisgICAgICAgIGFzc2VydEZhbHNlKGluZm8uc3VwcG9ydHNUcmFuc2Zlck93bmVyc2hpcCgpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShpbmZvLnVzZXNQb2xpY3koRGV2aWNlQWRtaW5JbmZvLlVTRVNfUE9MSUNZX0ZPUkNFX0xPQ0spKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShpbmZvLnVzZXNQb2xpY3koRGV2aWNlQWRtaW5JbmZvLlVTRVNfUE9MSUNZX0xJTUlUX1BBU1NXT1JEKSk7CiAgICAgICAgIGFzc2VydFRydWUoaW5mby51c2VzUG9saWN5KERldmljZUFkbWluSW5mby5VU0VTX1BPTElDWV9SRVNFVF9QQVNTV09SRCkpOwpAQCAtMTAwLDYgKzEwNyw3IEBACiAgICAgICAgIGFzc2VydEVxdWFscyhtU2Vjb25kQ29tcG9uZW50LmdldFBhY2thZ2VOYW1lKCksIGluZm8uZ2V0UGFja2FnZU5hbWUoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhtU2Vjb25kQ29tcG9uZW50LmdldENsYXNzTmFtZSgpLCBpbmZvLmdldFJlY2VpdmVyTmFtZSgpKTsKIAorICAgICAgICBhc3NlcnRGYWxzZShpbmZvLnN1cHBvcnRzVHJhbnNmZXJPd25lcnNoaXAoKSk7CiAgICAgICAgIGFzc2VydEZhbHNlKGluZm8udXNlc1BvbGljeShEZXZpY2VBZG1pbkluZm8uVVNFU19QT0xJQ1lfRk9SQ0VfTE9DSykpOwogICAgICAgICBhc3NlcnRUcnVlKGluZm8udXNlc1BvbGljeShEZXZpY2VBZG1pbkluZm8uVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkQpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShpbmZvLnVzZXNQb2xpY3koRGV2aWNlQWRtaW5JbmZvLlVTRVNfUE9MSUNZX1JFU0VUX1BBU1NXT1JEKSk7CkBAIC0xMTcsNCArMTI1LDE3IEBACiAgICAgICAgIGFzc2VydEVxdWFscygid2lwZS1kYXRhIiwKICAgICAgICAgICAgICAgICBpbmZvLmdldFRhZ0ZvclBvbGljeShEZXZpY2VBZG1pbkluZm8uVVNFU19QT0xJQ1lfV0lQRV9EQVRBKSk7CiAgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERldmljZUFkbWluSW5mbzMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFtRGV2aWNlQWRtaW4pIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIlNraXBwaW5nIHRlc3REZXZpY2VBZG1pbkluZm8zIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgUmVzb2x2ZUluZm8gcmVzb2x2ZUluZm8gPSBuZXcgUmVzb2x2ZUluZm8oKTsKKyAgICAgICAgcmVzb2x2ZUluZm8uYWN0aXZpdHlJbmZvID0gbVBhY2thZ2VNYW5hZ2VyLmdldFJlY2VpdmVySW5mbyhtVGhpcmRDb21wb25lbnQsCisgICAgICAgICAgICAgICAgUGFja2FnZU1hbmFnZXIuR0VUX01FVEFfREFUQSk7CisKKyAgICAgICAgRGV2aWNlQWRtaW5JbmZvIGluZm8gPSBuZXcgRGV2aWNlQWRtaW5JbmZvKG1Db250ZXh0LCByZXNvbHZlSW5mbyk7CisgICAgICAgIGFzc2VydFRydWUoaW5mby5zdXBwb3J0c1RyYW5zZmVyT3duZXJzaGlwKCkpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2FkbWluL3NyYy9hbmRyb2lkL2FkbWluL2N0cy9EZXZpY2VBZG1pblJlY2VpdmVyVGVzdC5qYXZhIGIvdGVzdHMvYWRtaW4vc3JjL2FuZHJvaWQvYWRtaW4vY3RzL0RldmljZUFkbWluUmVjZWl2ZXJUZXN0LmphdmEKaW5kZXggY2JjODgxMS4uNDg4ODQ3NiAxMDA2NDQKLS0tIGEvdGVzdHMvYWRtaW4vc3JjL2FuZHJvaWQvYWRtaW4vY3RzL0RldmljZUFkbWluUmVjZWl2ZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvYWRtaW4vc3JjL2FuZHJvaWQvYWRtaW4vY3RzL0RldmljZUFkbWluUmVjZWl2ZXJUZXN0LmphdmEKQEAgLTM2LDkgKzM2LDkgQEAKIGltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKK2ltcG9ydCBvcmcubW9ja2l0by5Bcmd1bWVudE1hdGNoZXI7CiBpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0b0Fubm90YXRpb25zOwogaW1wb3J0IG9yZy5tb2NraXRvLlNweTsKLWltcG9ydCBvcmcubW9ja2l0by5jb21wYXQuQXJndW1lbnRNYXRjaGVyOwogCiBwdWJsaWMgY2xhc3MgRGV2aWNlQWRtaW5SZWNlaXZlclRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgewogCkBAIC0yMDksMTMgKzIwOSw3IEBACiAgICAgICAgICAgICAgICAgZXEoTkVUV09SS19MT0dTX1RPS0VOKSwgZXEoTkVUV09SS19MT0dTX0NPVU5UKSk7CiAgICAgfQogCi0gICAgLy8gVE9ETzogcmVwbGFjZSB3aXRoIGlubGluZSBhcmdUaGF0KHgg4oaSIGUuZXF1YWxzKHguZ2V0QWN0aW9uKCkpKSB3aGVuIG1vY2tpdG8gaXMgdXBkYXRlZC4KICAgICBwcml2YXRlIEludGVudCBhY3Rpb25FcShmaW5hbCBTdHJpbmcgZXhwZWN0ZWQpIHsKLSAgICAgICAgcmV0dXJuIGFyZ1RoYXQobmV3IEFyZ3VtZW50TWF0Y2hlcjxJbnRlbnQ+KCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzT2JqZWN0KE9iamVjdCBhcmd1bWVudCkgewotICAgICAgICAgICAgICAgIHJldHVybiBleHBlY3RlZC5lcXVhbHMoKChJbnRlbnQpIGFyZ3VtZW50KS5nZXRBY3Rpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOworICAgICAgICByZXR1cm4gYXJnVGhhdCh4IC0+IGV4cGVjdGVkLmVxdWFscyh4LmdldEFjdGlvbigpKSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYWRtaW4vc3JjL2FuZHJvaWQvYWRtaW4vY3RzL0RldmljZVBvbGljeU1hbmFnZXJUZXN0LmphdmEgYi90ZXN0cy9hZG1pbi9zcmMvYW5kcm9pZC9hZG1pbi9jdHMvRGV2aWNlUG9saWN5TWFuYWdlclRlc3QuamF2YQppbmRleCAzYzJkZDU5Li5jNjI0MGQ3YyAxMDA2NDQKLS0tIGEvdGVzdHMvYWRtaW4vc3JjL2FuZHJvaWQvYWRtaW4vY3RzL0RldmljZVBvbGljeU1hbmFnZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvYWRtaW4vc3JjL2FuZHJvaWQvYWRtaW4vY3RzL0RldmljZVBvbGljeU1hbmFnZXJUZXN0LmphdmEKQEAgLTE2LDcgKzE2LDEyIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5hZG1pbi5jdHM7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3RFcXVhbHM7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb25NYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbk1hbmFnZXIuUG9saWN5OwogaW1wb3J0IGFuZHJvaWQuYXBwLmFkbWluLkRldmljZVBvbGljeU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CkBAIC0yNiwxNSArMzEsMjMgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuTmFtZU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5SZXNvbHZlSW5mbzsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOworaW1wb3J0IGFuZHJvaWQub3MuUHJvY2VzczsKIGltcG9ydCBhbmRyb2lkLm9zLlVzZXJNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7CitpbXBvcnQgYW5kcm9pZC5zZWN1cml0eS5rZXlzdG9yZS5LZXlHZW5QYXJhbWV0ZXJTcGVjOworaW1wb3J0IGFuZHJvaWQuc2VjdXJpdHkua2V5c3RvcmUuS2V5UHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwogaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TdXBwcmVzczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DZGRUZXN0OwotCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGU7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUZhY3Rvcnk7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKIAogLyoqCiAgKiBUT0RPOiBNYWtlIHN1cmUgRE8gQVBJcyBhcmUgbm90IGNhbGxlZCBieSBQTy4KQEAgLTUxLDYgKzY0LDcgQEAKICAgICBwcml2YXRlIGJvb2xlYW4gbURldmljZUFkbWluOwogICAgIHByaXZhdGUgYm9vbGVhbiBtTWFuYWdlZFByb2ZpbGVzOwogICAgIHByaXZhdGUgUGFja2FnZU1hbmFnZXIgbVBhY2thZ2VNYW5hZ2VyOworICAgIHByaXZhdGUgTm90aWZpY2F0aW9uTWFuYWdlciBtTm90aWZpY2F0aW9uTWFuYWdlcjsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0NBX1NUUklORzEgPQogICAgICAgICAgICAgIi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVxuIiArCkBAIC03Nyw2ICs5MSw4IEBACiAgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyID0gKERldmljZVBvbGljeU1hbmFnZXIpCiAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkRFVklDRV9QT0xJQ1lfU0VSVklDRSk7CiAgICAgICAgIG1Db21wb25lbnQgPSBEZXZpY2VBZG1pbkluZm9UZXN0LmdldFJlY2VpdmVyQ29tcG9uZW50KCk7CisgICAgICAgIG1Ob3RpZmljYXRpb25NYW5hZ2VyID0KKyAgICAgICAgICAgICAgICAgICAgKE5vdGlmaWNhdGlvbk1hbmFnZXIpIG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5OT1RJRklDQVRJT05fU0VSVklDRSk7CiAgICAgICAgIG1QYWNrYWdlTWFuYWdlciA9IG1Db250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7CiAgICAgICAgIG1EZXZpY2VBZG1pbiA9IG1QYWNrYWdlTWFuYWdlci5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfREVWSUNFX0FETUlOKTsKICAgICAgICAgbU1hbmFnZWRQcm9maWxlcyA9IG1EZXZpY2VBZG1pbgpAQCAtOTQsNyArMTEwLDYgQEAKICAgICAgICAgYXNzZXJ0VHJ1ZShtRGV2aWNlUG9saWN5TWFuYWdlci5pc0FkbWluQWN0aXZlKG1Db21wb25lbnQpKTsKICAgICB9CiAKLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iNy4zLjEwL0MtMS0xMCw5LjExLjEvQy01LTIiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RLZXlndWFyZERpc2FibGVkRmVhdHVyZXMoKSB7CiAgICAgICAgIGlmICghbURldmljZUFkbWluKSB7CiAgICAgICAgICAgICBMb2cudyhUQUcsICJTa2lwcGluZyB0ZXN0S2V5Z3VhcmREaXNhYmxlZEZlYXR1cmVzIik7CkBAIC0yMjEsNyArMjM2LDcgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICB0cnkgewotICAgICAgICAgICAgbURldmljZVBvbGljeU1hbmFnZXIucmVtb3ZlVXNlcihtQ29tcG9uZW50LCBudWxsKTsKKyAgICAgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnJlbW92ZVVzZXIobUNvbXBvbmVudCwgUHJvY2Vzcy5teVVzZXJIYW5kbGUoKSk7CiAgICAgICAgICAgICBmYWlsKCJkaWQgbm90IHRocm93IGV4cGVjdGVkIFNlY3VyaXR5RXhjZXB0aW9uIik7CiAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIGFzc2VydERldmljZU93bmVyTWVzc2FnZShlLmdldE1lc3NhZ2UoKSk7CkBAIC03NDksOCArNzY0LDcgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgYXNzZXJ0UHJvZmlsZU93bmVyTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBhc3NlcnRUcnVlKCJtZXNzYWdlIGlzOiAiKyBtZXNzYWdlLAotICAgICAgICAgICAgICAgIG1lc3NhZ2UuY29udGFpbnMoImRvZXMgbm90IG93biB0aGUgcHJvZmlsZSIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgibWVzc2FnZSBpczogIisgbWVzc2FnZSwgbWVzc2FnZS5jb250YWlucygiZG9lcyBub3Qgb3duIHRoZSBwcm9maWxlIikpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXREZWxlZ2F0ZWRDZXJ0SW5zdGFsbGVyX2ZhaWxJZk5vdFByb2ZpbGVPd25lcigpIHsKQEAgLTkwNCw0ICs5MTgsMTIyIEBACiAgICAgICAgICAgICBhc3NlcnRQcm9maWxlT3duZXJNZXNzYWdlKGUuZ2V0TWVzc2FnZSgpKTsKICAgICAgICAgfQogICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJc1VzaW5nVW5pZmllZFBhc3N3b3JkX2ZhaWxJZk5vdFByb2ZpbGVPd25lcigpIHsKKyAgICAgICAgaWYgKCFtRGV2aWNlQWRtaW4pIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIlNraXBwaW5nIHRlc3RJc1VzaW5nVW5pZmllZFBhc3N3b3JkX2ZhaWxJZk5vdFByb2ZpbGVPd25lciIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5pc1VzaW5nVW5pZmllZFBhc3N3b3JkKG1Db21wb25lbnQpOworICAgICAgICAgICAgZmFpbCgiZGlkIG5vdCB0aHJvdyBleHBlY3RlZCBTZWN1cml0eUV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRQcm9maWxlT3duZXJNZXNzYWdlKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmF0ZUtleVBhaXJfZmFpbElmTm90UHJvZmlsZU93bmVyKCkgeworICAgICAgICBpZiAoIW1EZXZpY2VBZG1pbikgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiU2tpcHBpbmcgdGVzdEdlbmVyYXRlS2V5UGFpcl9mYWlsSWZOb3RQcm9maWxlT3duZXIiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgS2V5R2VuUGFyYW1ldGVyU3BlYyBzcGVjID0gbmV3IEtleUdlblBhcmFtZXRlclNwZWMuQnVpbGRlcigKKyAgICAgICAgICAgICAgICAgICAgImdlbi1zaG91bGQtZmFpbCIsCisgICAgICAgICAgICAgICAgICAgIEtleVByb3BlcnRpZXMuUFVSUE9TRV9TSUdOIHwgS2V5UHJvcGVydGllcy5QVVJQT1NFX1ZFUklGWSkKKyAgICAgICAgICAgICAgICAgICAgLnNldEtleVNpemUoMjA0OCkKKyAgICAgICAgICAgICAgICAgICAgLnNldERpZ2VzdHMoS2V5UHJvcGVydGllcy5ESUdFU1RfU0hBMjU2KQorICAgICAgICAgICAgICAgICAgICAuc2V0U2lnbmF0dXJlUGFkZGluZ3MoS2V5UHJvcGVydGllcy5TSUdOQVRVUkVfUEFERElOR19SU0FfUFNTLAorICAgICAgICAgICAgICAgICAgICAgICAgS2V5UHJvcGVydGllcy5TSUdOQVRVUkVfUEFERElOR19SU0FfUEtDUzEpCisgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworCisgICAgICAgICAgICBtRGV2aWNlUG9saWN5TWFuYWdlci5nZW5lcmF0ZUtleVBhaXIobUNvbXBvbmVudCwgIlJTQSIsIHNwZWMsIDApOworICAgICAgICAgICAgZmFpbCgiZGlkIG5vdCB0aHJvdyBleHBlY3RlZCBTZWN1cml0eUV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRQcm9maWxlT3duZXJNZXNzYWdlKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRLZXlQYWlyQ2VydGlmaWNhdGVfZmFpbElmTm90UHJvZmlsZU93bmVyKCkgdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFtRGV2aWNlQWRtaW4pIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIlNraXBwaW5nIHRlc3RTZXRLZXlQYWlyQ2VydGlmaWNhdGVfZmFpbElmTm90UHJvZmlsZU93bmVyIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENlcnRpZmljYXRlRmFjdG9yeSBjZiA9IENlcnRpZmljYXRlRmFjdG9yeS5nZXRJbnN0YW5jZSgiWC41MDkiKTsKKyAgICAgICAgICAgIENlcnRpZmljYXRlIGNlcnQgID0gY2YuZ2VuZXJhdGVDZXJ0aWZpY2F0ZSgKKyAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKFRFU1RfQ0FfU1RSSU5HMS5nZXRCeXRlcygpKSk7CisgICAgICAgICAgICBMaXN0PENlcnRpZmljYXRlPiBjZXJ0cyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgIGNlcnRzLmFkZChjZXJ0KTsKKyAgICAgICAgICAgIG1EZXZpY2VQb2xpY3lNYW5hZ2VyLnNldEtleVBhaXJDZXJ0aWZpY2F0ZShtQ29tcG9uZW50LCAic2V0LXNob3VsZC1mYWlsIiwgY2VydHMsIHRydWUpOworICAgICAgICAgICAgZmFpbCgiZGlkIG5vdCB0aHJvdyBleHBlY3RlZCBTZWN1cml0eUV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRQcm9maWxlT3duZXJNZXNzYWdlKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROb3RpZmljYXRpb25Qb2xpY3lBY2Nlc3MoKSB7CisgICAgICAgIGlmICghbURldmljZUFkbWluKSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJTa2lwcGluZyB0ZXN0Tm90aWZpY2F0aW9uUG9saWN5QWNjZXNzX2ZhaWxJZk5vdFByb2ZpbGVPd25lciIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBOb3RpZmljYXRpb25NYW5hZ2VyIG5vdGlmaWNhdGlvbk1hbmFnZXIgPQorICAgICAgICAgICAgICAgICAgICAoTm90aWZpY2F0aW9uTWFuYWdlcikgbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0Lk5PVElGSUNBVElPTl9TRVJWSUNFKTsKKworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiTm90aWZpY2F0aW9uIHBvbGljeSBhY2Nlc3Mgd2FzIG5vdCBncmFudGVkICIsCisgICAgICAgICAgICBtTm90aWZpY2F0aW9uTWFuYWdlci5pc05vdGlmaWNhdGlvblBvbGljeUFjY2Vzc0dyYW50ZWQoKSk7CisKKyAgICAgICAgICAgIC8vIENsZWFyIG91dCB0aGUgb2xkIHBvbGljeQorICAgICAgICAgICAgbU5vdGlmaWNhdGlvbk1hbmFnZXIuc2V0Tm90aWZpY2F0aW9uUG9saWN5KG5ldyBQb2xpY3koMCwgMCwgMCwgLTEpKTsKKworICAgICAgICAgICAgUG9saWN5IGV4cGVjdGVkID0gbmV3IFBvbGljeShQb2xpY3kuUFJJT1JJVFlfQ0FURUdPUllfQ0FMTFMsCisgICAgICAgICAgICAgICAgICAgIFBvbGljeS5QUklPUklUWV9TRU5ERVJTX1NUQVJSRUQsCisgICAgICAgICAgICAgICAgICAgIFBvbGljeS5QUklPUklUWV9TRU5ERVJTX1NUQVJSRUQsCisgICAgICAgICAgICAgICAgICAgIFBvbGljeS5TVVBQUkVTU0VEX0VGRkVDVF9TVEFUVVNfQkFSKTsKKworICAgICAgICAgICAgYXNzZXJ0Tm90RXF1YWxzKG1Ob3RpZmljYXRpb25NYW5hZ2VyLmdldE5vdGlmaWNhdGlvblBvbGljeSgpLCBleHBlY3RlZCk7CisKKyAgICAgICAgICAgIG1Ob3RpZmljYXRpb25NYW5hZ2VyLnNldE5vdGlmaWNhdGlvblBvbGljeShleHBlY3RlZCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobU5vdGlmaWNhdGlvbk1hbmFnZXIuZ2V0Tm90aWZpY2F0aW9uUG9saWN5KCksIGV4cGVjdGVkKTsKKyAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0UHJvZmlsZU93bmVyTWVzc2FnZShlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0SW50ZXJydXB0aW9uRmlsdGVyKGludCBpbnRlcnJ1cHRpb25GaWx0ZXIpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICAgICAgZmluYWwgQnJvYWRjYXN0UmVjZWl2ZXIgcmVjZWl2ZXIgPSBuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBJbnRlbnRGaWx0ZXIgaW50ZW50RmlsdGVyID0gbmV3IEludGVudEZpbHRlcigpOworICAgICAgICBpbnRlbnRGaWx0ZXIuYWRkQWN0aW9uKE5vdGlmaWNhdGlvbk1hbmFnZXIuQUNUSU9OX0lOVEVSUlVQVElPTl9GSUxURVJfQ0hBTkdFRCk7CisgICAgICAgIG1Db250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIocmVjZWl2ZXIsIGludGVudEZpbHRlcik7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1Ob3RpZmljYXRpb25NYW5hZ2VyLnNldEludGVycnVwdGlvbkZpbHRlcihpbnRlcnJ1cHRpb25GaWx0ZXIpOworICAgICAgICAgICAgbGF0Y2guYXdhaXQoNSwgVGltZVVuaXQuU0VDT05EUyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobU5vdGlmaWNhdGlvbk1hbmFnZXIuZ2V0Q3VycmVudEludGVycnVwdGlvbkZpbHRlcigpLCBpbnRlcnJ1cHRpb25GaWx0ZXIpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgbUNvbnRleHQudW5yZWdpc3RlclJlY2VpdmVyKHJlY2VpdmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRJbnRlcnJ1cHRpb25GaWx0ZXIoKSB7CisgICAgICAgIGlmICghbURldmljZUFkbWluKSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJTa2lwcGluZyB0ZXN0Tm90aWZpY2F0aW9uUG9saWN5QWNjZXNzX2ZhaWxJZk5vdFByb2ZpbGVPd25lciIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNldEludGVycnVwdGlvbkZpbHRlcihOb3RpZmljYXRpb25NYW5hZ2VyLklOVEVSUlVQVElPTl9GSUxURVJfTk9ORSk7CisgICAgICAgICAgICBzZXRJbnRlcnJ1cHRpb25GaWx0ZXIoTm90aWZpY2F0aW9uTWFuYWdlci5JTlRFUlJVUFRJT05fRklMVEVSX0FMTCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB0b2xlcmF0ZWQpIHsKKyAgICAgICAgICAgIGFzc2VydFByb2ZpbGVPd25lck1lc3NhZ2UodG9sZXJhdGVkLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9hcHAvQW5kcm9pZC5tayBiL3Rlc3RzL2FwcC9BbmRyb2lkLm1rCmluZGV4IDZiZDQyZWYuLjI1NTIxZWQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2FwcC9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL2FwcC9BbmRyb2lkLm1rCkBAIC0yMSwyMCArMjEsMjMgQEAKICMgYW5kIHdoZW4gYnVpbHQgZXhwbGljaXRseSBwdXQgaXQgaW4gdGhlIGRhdGEgcGFydGl0aW9uCiBMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQogCi1MT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyIHRlbGVwaG9ueS1jb21tb24gdm9pcC1jb21tb24gb3JnLmFwYWNoZS5odHRwLmxlZ2FjeQorTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gXAorICAgIGFuZHJvaWQudGVzdC5ydW5uZXIuc3R1YnMgXAorICAgIG9yZy5hcGFjaGUuaHR0cC5sZWdhY3kgXAorICAgIGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCiAKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCi0gICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbCBcCi0gICAgY3RzdGVzdHJ1bm5lciBcCisgICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgXAorICAgIGN0c3Rlc3RydW5uZXItYXh0IFwKICAgICBjdHN0ZXN0c2VydmVyIFwKICAgICBtb2NraXRvLXRhcmdldC1taW51cy1qdW5pdDQgXAotICAgIGFuZHJvaWQtc3VwcG9ydC10ZXN0IFwKLSAgICBwbGF0Zm9ybS10ZXN0LWFubm90YXRpb25zCisgICAgYW5kcm9pZHgudGVzdC5ydWxlcyBcCisgICAgcGxhdGZvcm0tdGVzdC1hbm5vdGF0aW9ucyBcCisgICAgY3RzLWFtd20tdXRpbCBcCisgICAgYW5kcm9pZHgudGVzdC5ydWxlcwogCiBMT0NBTF9TUkNfRklMRVMgOj0gXAotICAgICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKSBcCi0gICAgJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBhcHAyL3NyYykgXAotICAgICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgYXBwU2RrMjUvc3JjKSBcCisgICAgJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKICMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKIExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCmRpZmYgLS1naXQgYS90ZXN0cy9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDc5ODY4NDIuLjRlNjlhMGMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yMSwxMiArMjEsMTMgQEAKICAgICA8dXNlcy1zZGsgYW5kcm9pZDptaW5TZGtWZXJzaW9uPSIxMSIgLz4KICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkRJU0FCTEVfS0VZR1VBUkQiIC8+CiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5CT0RZX1NFTlNPUlMiIC8+Ci0gICAgPGFwcGxpY2F0aW9uPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uRk9SRUdST1VORF9TRVJWSUNFIi8+CisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6dXNlc0NsZWFydGV4dFRyYWZmaWM9InRydWUiPgogICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KICAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9Im9yZy5hcGFjaGUuaHR0cC5sZWdhY3kiIGFuZHJvaWQ6cmVxdWlyZWQ9ImZhbHNlIiAvPgogICAgIDwvYXBwbGljYXRpb24+CiAKLSAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmFwcC5zdHVicyIKICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBvZiBhbmRyb2lkLmFwcCI+CiAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJsaXN0ZW5lciIKZGlmZiAtLWdpdCBhL3Rlc3RzL2FwcC9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy9hcHAvQW5kcm9pZFRlc3QueG1sCmluZGV4IGViNTE1YjIuLjMyMTY1N2MgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2FwcC9BbmRyb2lkVGVzdC54bWwKKysrIGIvdGVzdHMvYXBwL0FuZHJvaWRUZXN0LnhtbApAQCAtMTQsNiArMTQsNyBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIEFwcCB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iZnJhbWV3b3JrIiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRhcmdldHByZXAuTG9jYXRpb25DaGVjayIgLz4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KQEAgLTIyLDExICsyMywxNCBAQAogICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzQXBwVGVzdFN0dWJzLmFwayIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0FwcFRlc3RTdHVic0RpZmZlcmVudFVpZC5hcGsiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJDdHNBcHBUZXN0Q2FzZXMuYXBrIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzQXBwVGVzdFNkazI1LmFwayIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0NhbnRTYXZlU3RhdGUxLmFwayIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0NhbnRTYXZlU3RhdGUyLmFwayIgLz4KICAgICA8L3RhcmdldF9wcmVwYXJlcj4KICAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuQW5kcm9pZEpVbml0VGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bm5lciIgdmFsdWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJwYWNrYWdlIiB2YWx1ZT0iYW5kcm9pZC5hcHAuY3RzIiAvPgogICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjZtMzhzIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImhpZGRlbi1hcGktY2hlY2tzIiB2YWx1ZT0iZmFsc2UiLz4KICAgICA8L3Rlc3Q+CiAKIDwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL2FwcC9DYW50U2F2ZVN0YXRlMS9BbmRyb2lkLm1rIGIvdGVzdHMvYXBwL0NhbnRTYXZlU3RhdGUxL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJjNzYyZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2FwcC9DYW50U2F2ZVN0YXRlMS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzMgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKKyMgZG9uJ3QgaW5jbHVkZSB0aGlzIHBhY2thZ2UgaW4gYW55IHRhcmdldAorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKyMgYW5kIHdoZW4gYnVpbHQgZXhwbGljaXRseSBwdXQgaXQgaW4gdGhlIGRhdGEgcGFydGl0aW9uCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQorCitMT0NBTF9QUk9HVUFSRF9FTkFCTEVEIDo9IGRpc2FibGVkCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLXN1YmRpci1qYXZhLWZpbGVzKQorCisjIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0CitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzQ2FudFNhdmVTdGF0ZTEKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKKworaW5jbHVkZSAkKEJVSUxEX0NUU19TVVBQT1JUX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS90ZXN0cy9hcHAvQ2FudFNhdmVTdGF0ZTEvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL2FwcC9DYW50U2F2ZVN0YXRlMS9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZGNhZWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9hcHAvQ2FudFNhdmVTdGF0ZTEvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDI3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC50ZXN0LmNhbnRzYXZlc3RhdGUxIj4KKyAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpsYWJlbD0iQ2FuJ3QgU2F2ZSAxIiBhbmRyb2lkOmNhbnRTYXZlU3RhdGU9InRydWUiPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJDYW50U2F2ZTFBY3Rpdml0eSI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuREVGQVVMVCIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2FwcC9DYW50U2F2ZVN0YXRlMS9yZXMvbGF5b3V0L2NhbnRfc2F2ZV8xX2FjdGl2aXR5LnhtbCBiL3Rlc3RzL2FwcC9DYW50U2F2ZVN0YXRlMS9yZXMvbGF5b3V0L2NhbnRfc2F2ZV8xX2FjdGl2aXR5LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWJmNjU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYXBwL0NhbnRTYXZlU3RhdGUxL3Jlcy9sYXlvdXQvY2FudF9zYXZlXzFfYWN0aXZpdHkueG1sCkBAIC0wLDAgKzEsMzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCis+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iMjVkcCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZUxhcmdlIgorICAgICAgICBhbmRyb2lkOnRleHQ9IlRoaXMgYXBwICMxIGNhbid0IHNhdmUgaXRzIHN0YXRlIgorICAgIC8+CisKKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvYXBwL0NhbnRTYXZlU3RhdGUxL3NyYy9jb20vYW5kcm9pZC90ZXN0L2NhbnRzYXZlc3RhdGUyL0NhbnRTYXZlMUFjdGl2aXR5LmphdmEgYi90ZXN0cy9hcHAvQ2FudFNhdmVTdGF0ZTEvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvY2FudHNhdmVzdGF0ZTIvQ2FudFNhdmUxQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjY3OGNiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYXBwL0NhbnRTYXZlU3RhdGUxL3NyYy9jb20vYW5kcm9pZC90ZXN0L2NhbnRzYXZlc3RhdGUyL0NhbnRTYXZlMUFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudGVzdC5jYW50c2F2ZXN0YXRlMTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworCitwdWJsaWMgY2xhc3MgQ2FudFNhdmUxQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5jYW50X3NhdmVfMV9hY3Rpdml0eSk7CisgICAgICAgIGdldFdpbmRvdygpLmdldERlY29yVmlldygpLnJlcXVlc3RGb2N1cygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2FwcC9DYW50U2F2ZVN0YXRlMi9BbmRyb2lkLm1rIGIvdGVzdHMvYXBwL0NhbnRTYXZlU3RhdGUyL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAyMzA2MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2FwcC9DYW50U2F2ZVN0YXRlMi9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzMgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKKyMgZG9uJ3QgaW5jbHVkZSB0aGlzIHBhY2thZ2UgaW4gYW55IHRhcmdldAorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKyMgYW5kIHdoZW4gYnVpbHQgZXhwbGljaXRseSBwdXQgaXQgaW4gdGhlIGRhdGEgcGFydGl0aW9uCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQorCitMT0NBTF9QUk9HVUFSRF9FTkFCTEVEIDo9IGRpc2FibGVkCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLXN1YmRpci1qYXZhLWZpbGVzKQorCisjIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0CitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzQ2FudFNhdmVTdGF0ZTIKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKKworaW5jbHVkZSAkKEJVSUxEX0NUU19TVVBQT1JUX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS90ZXN0cy9hcHAvQ2FudFNhdmVTdGF0ZTIvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL2FwcC9DYW50U2F2ZVN0YXRlMi9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNGYwMWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9hcHAvQ2FudFNhdmVTdGF0ZTIvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDI3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC50ZXN0LmNhbnRzYXZlc3RhdGUyIj4KKyAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpsYWJlbD0iQ2FuJ3QgU2F2ZSAyIiBhbmRyb2lkOmNhbnRTYXZlU3RhdGU9InRydWUiPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJDYW50U2F2ZTJBY3Rpdml0eSI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuREVGQVVMVCIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2FwcC9DYW50U2F2ZVN0YXRlMi9yZXMvbGF5b3V0L2NhbnRfc2F2ZV8yX2FjdGl2aXR5LnhtbCBiL3Rlc3RzL2FwcC9DYW50U2F2ZVN0YXRlMi9yZXMvbGF5b3V0L2NhbnRfc2F2ZV8yX2FjdGl2aXR5LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWI4ZTNkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYXBwL0NhbnRTYXZlU3RhdGUyL3Jlcy9sYXlvdXQvY2FudF9zYXZlXzJfYWN0aXZpdHkueG1sCkBAIC0wLDAgKzEsMzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCis+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iMjVkcCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZUxhcmdlIgorICAgICAgICBhbmRyb2lkOnRleHQ9IlRoaXMgYXBwICMyIGNhbid0IHNhdmUgaXRzIHN0YXRlIgorICAgIC8+CisKKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvYXBwL0NhbnRTYXZlU3RhdGUyL3NyYy9jb20vYW5kcm9pZC90ZXN0L2NhbnRzYXZlc3RhdGUyL0NhbnRTYXZlMkFjdGl2aXR5LmphdmEgYi90ZXN0cy9hcHAvQ2FudFNhdmVTdGF0ZTIvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvY2FudHNhdmVzdGF0ZTIvQ2FudFNhdmUyQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjBhYzkzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYXBwL0NhbnRTYXZlU3RhdGUyL3NyYy9jb20vYW5kcm9pZC90ZXN0L2NhbnRzYXZlc3RhdGUyL0NhbnRTYXZlMkFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudGVzdC5jYW50c2F2ZXN0YXRlMjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworCitwdWJsaWMgY2xhc3MgQ2FudFNhdmUyQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5jYW50X3NhdmVfMl9hY3Rpdml0eSk7CisgICAgICAgIGdldFdpbmRvdygpLmdldERlY29yVmlldygpLnJlcXVlc3RGb2N1cygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2FwcC9hcHAvQW5kcm9pZC5tayBiL3Rlc3RzL2FwcC9hcHAvQW5kcm9pZC5tawppbmRleCAxOTFmNGNjLi5kOTg1ODYxIDEwMDY0NAotLS0gYS90ZXN0cy9hcHAvYXBwL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvYXBwL2FwcC9BbmRyb2lkLm1rCkBAIC0yMywxNSArMjMsMjAgQEAKIAogTE9DQUxfUFJPR1VBUkRfRU5BQkxFRCA6PSBkaXNhYmxlZAogCi1MT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyIHRlbGVwaG9ueS1jb21tb24gdm9pcC1jb21tb24gb3JnLmFwYWNoZS5odHRwLmxlZ2FjeQorTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gXAorICAgIGFuZHJvaWQudGVzdC5ydW5uZXIuc3R1YnMgXAorICAgIHRlbGVwaG9ueS1jb21tb24gXAorICAgIHZvaXAtY29tbW9uIFwKKyAgICBvcmcuYXBhY2hlLmh0dHAubGVnYWN5IFwKKyAgICBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicyBcCisKIAogTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKLSAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsIFwKLSAgICBjdHN0ZXN0cnVubmVyIFwKKyAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBcCisgICAgY3RzdGVzdHJ1bm5lci1heHQgXAogICAgIGN0c3Rlc3RzZXJ2ZXIgXAogICAgIG1vY2tpdG8tdGFyZ2V0LW1pbnVzLWp1bml0NCBcCi0gICAgYW5kcm9pZC1zdXBwb3J0LXY0IFwKLSAgICBsZWdhY3ktYW5kcm9pZC10ZXN0CisgICAgYW5kcm9pZHgubGVnYWN5X2xlZ2FjeS1zdXBwb3J0LXY0CiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykgXAogICAgICAgICAgICAgICBzcmMvYW5kcm9pZC9hcHAvc3R1YnMvSVNlY29uZGFyeS5haWRsCkBAIC00MCw1ICs0NSw2IEBACiBMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cwogCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzQXBwVGVzdFN0dWJzCitMT0NBTF9QUklWQVRFX1BMQVRGT1JNX0FQSVMgOj0gdHJ1ZQogCiBpbmNsdWRlICQoQlVJTERfQ1RTX1NVUFBPUlRfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2FwcC9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL2FwcC9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA3ZGIwNzE3Li5mZTM0MGM5IDEwMDY0NAotLS0gYS90ZXN0cy9hcHAvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvYXBwL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC00MywxMyArNDMsMTUgQEAKICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkJPRFlfU0VOU09SUyIgLz4KICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlBBQ0tBR0VfVVNBR0VfU1RBVFMiIC8+CiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5TRVRfV0FMTFBBUEVSIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uRk9SRUdST1VORF9TRVJWSUNFIi8+CiAKICAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpsYWJlbD0iQW5kcm9pZCBUZXN0Q2FzZSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmljb249IkBkcmF3YWJsZS9zaXplXzQ4eDQ4IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6bWF4UmVjZW50cz0iMSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOm11bHRpQXJjaD0idHJ1ZSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYXBwLnN0dWJzLk1vY2tBcHBsaWNhdGlvbiIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnN1cHBvcnRzUnRsPSJ0cnVlIj4KKyAgICAgICAgICAgICAgICBhbmRyb2lkOnN1cHBvcnRzUnRsPSJ0cnVlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmV0d29ya1NlY3VyaXR5Q29uZmlnPSJAeG1sL25ldHdvcmtfc2VjdXJpdHlfY29uZmlnIj4KICAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CiAgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJvcmcuYXBhY2hlLmh0dHAubGVnYWN5IiBhbmRyb2lkOnJlcXVpcmVkPSJmYWxzZSIgLz4KIApAQCAtMTA0LDYgKzEwNiw4IEBACiAKICAgICAgICAgPHNlcnZpY2UgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFwcC5zdHVicy5Nb2NrU2VydmljZSIgLz4KIAorICAgICAgICA8c2VydmljZSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYXBwLnN0dWJzLk51bGxTZXJ2aWNlIiAvPgorCiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYXBwLnN0dWJzLlNlYXJjaE1hbmFnZXJTdHViQWN0aXZpdHkiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iU2VhcmNoTWFuYWdlclN0dWJBY3Rpdml0eSI+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KQEAgLTMyNiw0NSArMzMwLDYgQEAKICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hcHAuc3R1YnMuVG9vbGJhckFjdGl2aXR5IgogICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuTWF0ZXJpYWwuTGlnaHQuTm9BY3Rpb25CYXIiIC8+CiAKLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hcHAuc3R1YnMuTWF4QXNwZWN0UmF0aW9BY3Rpdml0eSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Ik1heEFzcGVjdFJhdGlvQWN0aXZpdHkiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnJlc2l6ZWFibGVBY3Rpdml0eT0iZmFsc2UiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOm1heEFzcGVjdFJhdGlvPSIxLjAiPgotICAgICAgICAgICAgPGludGVudC1maWx0ZXI+Ci0gICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgotICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkZSQU1FV09SS19JTlNUUlVNRU5UQVRJT05fVEVTVCIgLz4KLSAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KLSAgICAgICAgPC9hY3Rpdml0eT4KLQotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFwcC5zdHVicy5NZXRhRGF0YU1heEFzcGVjdFJhdGlvQWN0aXZpdHkiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJNZXRhRGF0YU1heEFzcGVjdFJhdGlvQWN0aXZpdHkiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnJlc2l6ZWFibGVBY3Rpdml0eT0iZmFsc2UiPgotICAgICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQubWF4X2FzcGVjdCIgYW5kcm9pZDp2YWx1ZT0iMS4wIiAvPgotICAgICAgICAgICAgPGludGVudC1maWx0ZXI+Ci0gICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgotICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkZSQU1FV09SS19JTlNUUlVNRU5UQVRJT05fVEVTVCIgLz4KLSAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KLSAgICAgICAgPC9hY3Rpdml0eT4KLQotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFwcC5zdHVicy5NYXhBc3BlY3RSYXRpb1Jlc2l6ZWFibGVBY3Rpdml0eSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Ik1heEFzcGVjdFJhdGlvUmVzaXplYWJsZUFjdGl2aXR5IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpyZXNpemVhYmxlQWN0aXZpdHk9InRydWUiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOm1heEFzcGVjdFJhdGlvPSIxLjAiPgotICAgICAgICAgICAgPGludGVudC1maWx0ZXI+Ci0gICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgotICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkZSQU1FV09SS19JTlNUUlVNRU5UQVRJT05fVEVTVCIgLz4KLSAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KLSAgICAgICAgPC9hY3Rpdml0eT4KLQotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFwcC5zdHVicy5NYXhBc3BlY3RSYXRpb1Vuc2V0QWN0aXZpdHkiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJNYXhBc3BlY3RSYXRpb1Vuc2V0QWN0aXZpdHkiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnJlc2l6ZWFibGVBY3Rpdml0eT0iZmFsc2UiPgotICAgICAgICAgICAgPGludGVudC1maWx0ZXI+Ci0gICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgotICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkZSQU1FV09SS19JTlNUUlVNRU5UQVRJT05fVEVTVCIgLz4KLSAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KLSAgICAgICAgPC9hY3Rpdml0eT4KLQogICAgICAgICA8c2VydmljZQogICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFwcC5zdHVicy5MaXZlV2FsbHBhcGVyIgogICAgICAgICAgICAgYW5kcm9pZDppY29uPSJAZHJhd2FibGUvcm9ib3QiCkBAIC0zODAsNiArMzQ1LDE0IEBACiAgICAgICAgICAgICA8L21ldGEtZGF0YT4KICAgICAgICAgPC9zZXJ2aWNlPgogCisgICAgICAgIDxzZXJ2aWNlIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hcHAuc3R1YnMuTW9ja05vdGlmaWNhdGlvbkxpc3RlbmVyIgorICAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIgorICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJNb2NrTm90aWZpY2F0aW9uTGlzdGVuZXIiCisgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGVybWlzc2lvbj0iYW5kcm9pZC5wZXJtaXNzaW9uLkJJTkRfTk9USUZJQ0FUSU9OX0xJU1RFTkVSX1NFUlZJQ0UiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc2VydmljZS5ub3RpZmljYXRpb24uTm90aWZpY2F0aW9uTGlzdGVuZXJTZXJ2aWNlIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L3NlcnZpY2U+CiAgICAgPC9hcHBsaWNhdGlvbj4KIAogPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2FwcC9hcHAvcmVzL3htbC9uZXR3b3JrX3NlY3VyaXR5X2NvbmZpZy54bWwgYi90ZXN0cy9hcHAvYXBwL3Jlcy94bWwvbmV0d29ya19zZWN1cml0eV9jb25maWcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNGIzNGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9hcHAvYXBwL3Jlcy94bWwvbmV0d29ya19zZWN1cml0eV9jb25maWcueG1sCkBAIC0wLDAgKzEsMTIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8bmV0d29yay1zZWN1cml0eS1jb25maWc+CisgIDxiYXNlLWNvbmZpZyBjbGVhcnRleHRUcmFmZmljUGVybWl0dGVkPSJ0cnVlIj4KKyAgPC9iYXNlLWNvbmZpZz4KKyAgPCEtLSBDbGVhcnRleHQgdHJhZmZpYyBpcyBleHBsaWNpdGx5IHBlcm1pdHRlZCB0byBleGFtcGxlLmNvbSBhbmQgYWxsIHN1YmRvbWFpbnMgLS0+CisgIDxkb21haW4tY29uZmlnIGNsZWFydGV4dFRyYWZmaWNQZXJtaXR0ZWQ9InRydWUiPgorICAgICAgPGRvbWFpbiBpbmNsdWRlU3ViZG9tYWlucz0idHJ1ZSI+ZXhhbXBsZS5jb208L2RvbWFpbj4KKyAgPC9kb21haW4tY29uZmlnPgorICA8ZG9tYWluLWNvbmZpZyBjbGVhcnRleHRUcmFmZmljUGVybWl0dGVkPSJ0cnVlIj4KKyAgICAgIDxkb21haW4gaW5jbHVkZVN1YmRvbWFpbnM9InRydWUiPmxvY2FsaG9zdDwvZG9tYWluPgorICA8L2RvbWFpbi1jb25maWc+Cis8L25ldHdvcmstc2VjdXJpdHktY29uZmlnPgpkaWZmIC0tZ2l0IGEvdGVzdHMvYXBwL2FwcC9zcmMvYW5kcm9pZC9hcHAvc3R1YnMvRGlhbG9nU3R1YkFjdGl2aXR5LmphdmEgYi90ZXN0cy9hcHAvYXBwL3NyYy9hbmRyb2lkL2FwcC9zdHVicy9EaWFsb2dTdHViQWN0aXZpdHkuamF2YQppbmRleCAwM2U2MDEwLi4xZGI1YTg0IDEwMDY0NAotLS0gYS90ZXN0cy9hcHAvYXBwL3NyYy9hbmRyb2lkL2FwcC9zdHVicy9EaWFsb2dTdHViQWN0aXZpdHkuamF2YQorKysgYi90ZXN0cy9hcHAvYXBwL3NyYy9hbmRyb2lkL2FwcC9zdHVicy9EaWFsb2dTdHViQWN0aXZpdHkuamF2YQpAQCAtMTksMTggKzE5LDE3IEBACiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CiBpbXBvcnQgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2c7CiBpbXBvcnQgYW5kcm9pZC5hcHAuRGF0ZVBpY2tlckRpYWxvZzsKK2ltcG9ydCBhbmRyb2lkLmFwcC5EYXRlUGlja2VyRGlhbG9nLk9uRGF0ZVNldExpc3RlbmVyOwogaW1wb3J0IGFuZHJvaWQuYXBwLkRpYWxvZzsKIGltcG9ydCBhbmRyb2lkLmFwcC5UaW1lUGlja2VyRGlhbG9nOwotaW1wb3J0IGFuZHJvaWQuYXBwLkRhdGVQaWNrZXJEaWFsb2cuT25EYXRlU2V0TGlzdGVuZXI7CiBpbXBvcnQgYW5kcm9pZC5hcHAuVGltZVBpY2tlckRpYWxvZy5PblRpbWVTZXRMaXN0ZW5lcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZS5PbkNhbmNlbExpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwpAQCAtMzgsNiArMzcsOCBAQAogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkRhdGVQaWNrZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGltZVBpY2tlcjsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworCiAvKgogICogU3R1YiBjbGFzcyBmb3IgIERpYWxvZywgQWxlcnREaWFsb2csIERhdGVQaWNrZXJEaWFsb2csIFRpbWVQaWNrZXJEaWFsb2cgZXRjLgogICovCkBAIC0zMTcsMTEgKzMxOCwxMCBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0RJQUxPR19OVU1CRVJfRVhUUkEgPSAidGVzdERpYWxvZ051bWJlciI7CiAKICAgICBwdWJsaWMgc3RhdGljIDxUIGV4dGVuZHMgQWN0aXZpdHk+IFQgc3RhcnREaWFsb2dBY3Rpdml0eSgKLSAgICAgICAgICAgIEFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyPFQ+IHRlc3RDYXNlLCBpbnQgZGlhbG9nTnVtYmVyKSB7CisgICAgICAgICAgICBBY3Rpdml0eVRlc3RSdWxlPFQ+IHJ1bGUsIGludCBkaWFsb2dOdW1iZXIpIHsKICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9NQUlOKTsKICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFRFU1RfRElBTE9HX05VTUJFUl9FWFRSQSwgZGlhbG9nTnVtYmVyKTsKLSAgICAgICAgdGVzdENhc2Uuc2V0QWN0aXZpdHlJbnRlbnQoaW50ZW50KTsKLSAgICAgICAgcmV0dXJuIHRlc3RDYXNlLmdldEFjdGl2aXR5KCk7CisgICAgICAgIHJldHVybiBydWxlLmxhdW5jaEFjdGl2aXR5KGludGVudCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS90ZXN0cy9hcHAvYXBwL3NyYy9hbmRyb2lkL2FwcC9zdHVicy9FeHBhbmRhYmxlTGlzdFRlc3RBY3Rpdml0eS5qYXZhIGIvdGVzdHMvYXBwL2FwcC9zcmMvYW5kcm9pZC9hcHAvc3R1YnMvRXhwYW5kYWJsZUxpc3RUZXN0QWN0aXZpdHkuamF2YQppbmRleCBhYjM3N2Q5Li5lNGUzZmVlIDEwMDY0NAotLS0gYS90ZXN0cy9hcHAvYXBwL3NyYy9hbmRyb2lkL2FwcC9zdHVicy9FeHBhbmRhYmxlTGlzdFRlc3RBY3Rpdml0eS5qYXZhCisrKyBiL3Rlc3RzL2FwcC9hcHAvc3JjL2FuZHJvaWQvYXBwL3N0dWJzL0V4cGFuZGFibGVMaXN0VGVzdEFjdGl2aXR5LmphdmEKQEAgLTE1LDI1ICsxNSwyOCBAQAogICovCiBwYWNrYWdlIGFuZHJvaWQuYXBwLnN0dWJzOwogCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQogaW1wb3J0IGFuZHJvaWQuYXBwLkV4cGFuZGFibGVMaXN0QWN0aXZpdHk7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlUXVldWU7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudS5Db250ZXh0TWVudUluZm87CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RBZGFwdGVyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0VmlldzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5TaW1wbGVFeHBhbmRhYmxlTGlzdEFkYXB0ZXI7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuQ29udGV4dE1lbnVCdWlsZGVyOworCiBpbXBvcnQgY29tLmdvb2dsZS5hbmRyb2lkLmNvbGxlY3QuTGlzdHM7CiAKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCiBwdWJsaWMgY2xhc3MgRXhwYW5kYWJsZUxpc3RUZXN0QWN0aXZpdHkgZXh0ZW5kcyBFeHBhbmRhYmxlTGlzdEFjdGl2aXR5IHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJOQU1FIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVNfRVZFTiA9ICJJU19FVkVOIjsKQEAgLTExNCwyMyArMTE3LDI5IEBACiAgICAgICAgIHJldHVybiBSRVNVTFRfT0s7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBpbnQgdGVzdFNlbGVjdGUoKSB7CisgICAgcHJpdmF0ZSBpbnQgdGVzdFNlbGVjdCgpIHsKICAgICAgICAgZmluYWwgRXhwYW5kYWJsZUxpc3RWaWV3IHYgPSBnZXRFeHBhbmRhYmxlTGlzdFZpZXcoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKSB7Ci0gICAgICAgICAgICB2LmV4cGFuZEdyb3VwKGkpOwotICAgICAgICAgICAgc2V0U2VsZWN0ZWRHcm91cChpKTsKLSAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgMTU7IGsrKykgewotICAgICAgICAgICAgICAgIHNldFNlbGVjdGVkQ2hpbGQoaSwgaywgZmFsc2UpOwotICAgICAgICAgICAgICAgIGlmIChFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25Gb3JDaGlsZChpLCBrKSAhPSBnZXRTZWxlY3RlZFBvc2l0aW9uKCkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBSRVNVTFRfQ0FOQ0VMRUQ7Ci0gICAgICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHRvdWNoIG1vZGUgaXMgZGlzYWJsZWQgc2luY2Ugc2VsZWN0aW9uIGRvZXNuJ3Qgd29yayBpbiB0b3VjaCBtb2RlLgorICAgICAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkuc2V0SW5Ub3VjaE1vZGUoZmFsc2UpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKSB7CisgICAgICAgICAgICAgICAgdi5leHBhbmRHcm91cChpKTsKKyAgICAgICAgICAgICAgICBzZXRTZWxlY3RlZEdyb3VwKGkpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgMTU7IGsrKykgeworICAgICAgICAgICAgICAgICAgICBzZXRTZWxlY3RlZENoaWxkKGksIGssIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvbkZvckNoaWxkKGksIGspICE9IGdldFNlbGVjdGVkUG9zaXRpb24oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSRVNVTFRfQ0FOQ0VMRUQ7CisgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDE1OyBrKyspIHsKLSAgICAgICAgICAgICAgICBzZXRTZWxlY3RlZENoaWxkKGksIGssIHRydWUpOwotICAgICAgICAgICAgICAgIGlmIChFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25Gb3JDaGlsZChpLCBrKSAhPSBnZXRTZWxlY3RlZFBvc2l0aW9uKCkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBSRVNVTFRfQ0FOQ0VMRUQ7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCAxNTsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgIHNldFNlbGVjdGVkQ2hpbGQoaSwgaywgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25Gb3JDaGlsZChpLCBrKSAhPSBnZXRTZWxlY3RlZFBvc2l0aW9uKCkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUkVTVUxUX0NBTkNFTEVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2LmNvbGxhcHNlR3JvdXAoaSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB2LmNvbGxhcHNlR3JvdXAoaSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKS5zZXRJblRvdWNoTW9kZSh0cnVlKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gUkVTVUxUX09LOwogICAgIH0KQEAgLTE0MCw3ICsxNDksNyBAQAogICAgICAgICBzdXBlci5vblJlc3VtZSgpOwogICAgICAgICBmaW5hbCBTdHJpbmcgYWN0aW9uID0gZ2V0SW50ZW50KCkuZ2V0QWN0aW9uKCk7CiAgICAgICAgIGlmIChMYXVuY2hwYWRBY3Rpdml0eS5FWFBBTkRMSVNUX1NFTEVDVC5lcXVhbHMoYWN0aW9uKSkgewotICAgICAgICAgICAgc2V0UmVzdWx0KHRlc3RTZWxlY3RlKCkpOworICAgICAgICAgICAgc2V0UmVzdWx0KHRlc3RTZWxlY3QoKSk7CiAgICAgICAgIH0gZWxzZSBpZiAoTGF1bmNocGFkQWN0aXZpdHkuRVhQQU5ETElTVF9WSUVXLmVxdWFscyhhY3Rpb24pKSB7CiAgICAgICAgICAgICBzZXRSZXN1bHQodGVzdFZpZXcoKSk7CiAgICAgICAgIH0gZWxzZSBpZiAoTGF1bmNocGFkQWN0aXZpdHkuRVhQQU5ETElTVF9DQUxMQkFDSy5lcXVhbHMoYWN0aW9uKSkgewpkaWZmIC0tZ2l0IGEvdGVzdHMvYXBwL2FwcC9zcmMvYW5kcm9pZC9hcHAvc3R1YnMvTWF4QXNwZWN0UmF0aW9BY3Rpdml0eS5qYXZhIGIvdGVzdHMvYXBwL2FwcC9zcmMvYW5kcm9pZC9hcHAvc3R1YnMvTWF4QXNwZWN0UmF0aW9BY3Rpdml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTA0ODYxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL2FwcC9hcHAvc3JjL2FuZHJvaWQvYXBwL3N0dWJzL01heEFzcGVjdFJhdGlvQWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5hcHAuc3R1YnM7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKLQotcHVibGljIGNsYXNzIE1heEFzcGVjdFJhdGlvQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL2FwcC9hcHAvc3JjL2FuZHJvaWQvYXBwL3N0dWJzL01heEFzcGVjdFJhdGlvUmVzaXplYWJsZUFjdGl2aXR5LmphdmEgYi90ZXN0cy9hcHAvYXBwL3NyYy9hbmRyb2lkL2FwcC9zdHVicy9NYXhBc3BlY3RSYXRpb1Jlc2l6ZWFibGVBY3Rpdml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTFjNjA1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL2FwcC9hcHAvc3JjL2FuZHJvaWQvYXBwL3N0dWJzL01heEFzcGVjdFJhdGlvUmVzaXplYWJsZUFjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuYXBwLnN0dWJzOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7Ci0KLXB1YmxpYyBjbGFzcyBNYXhBc3BlY3RSYXRpb1Jlc2l6ZWFibGVBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYXBwL2FwcC9zcmMvYW5kcm9pZC9hcHAvc3R1YnMvTWF4QXNwZWN0UmF0aW9VbnNldEFjdGl2aXR5LmphdmEgYi90ZXN0cy9hcHAvYXBwL3NyYy9hbmRyb2lkL2FwcC9zdHVicy9NYXhBc3BlY3RSYXRpb1Vuc2V0QWN0aXZpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZlNDk5NC4uMDAwMDAwMAotLS0gYS90ZXN0cy9hcHAvYXBwL3NyYy9hbmRyb2lkL2FwcC9zdHVicy9NYXhBc3BlY3RSYXRpb1Vuc2V0QWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5hcHAuc3R1YnM7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKLQotcHVibGljIGNsYXNzIE1heEFzcGVjdFJhdGlvVW5zZXRBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYXBwL2FwcC9zcmMvYW5kcm9pZC9hcHAvc3R1YnMvTWV0YURhdGFNYXhBc3BlY3RSYXRpb0FjdGl2aXR5LmphdmEgYi90ZXN0cy9hcHAvYXBwL3NyYy9hbmRyb2lkL2FwcC9zdHVicy9NZXRhRGF0YU1heEFzcGVjdFJhdGlvQWN0aXZpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU5ODlkZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9hcHAvYXBwL3NyYy9hbmRyb2lkL2FwcC9zdHVicy9NZXRhRGF0YU1heEFzcGVjdFJhdGlvQWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5hcHAuc3R1YnM7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKLQotcHVibGljIGNsYXNzIE1ldGFEYXRhTWF4QXNwZWN0UmF0aW9BY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYXBwL2FwcC9zcmMvYW5kcm9pZC9hcHAvc3R1YnMvTW9ja05vdGlmaWNhdGlvbkxpc3RlbmVyLmphdmEgYi90ZXN0cy9hcHAvYXBwL3NyYy9hbmRyb2lkL2FwcC9zdHVicy9Nb2NrTm90aWZpY2F0aW9uTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDdiMmIxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYXBwL2FwcC9zcmMvYW5kcm9pZC9hcHAvc3R1YnMvTW9ja05vdGlmaWNhdGlvbkxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQuYXBwLnN0dWJzOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLm5vdGlmaWNhdGlvbi5Ob3RpZmljYXRpb25MaXN0ZW5lclNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLm5vdGlmaWNhdGlvbi5TdGF0dXNCYXJOb3RpZmljYXRpb247CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK3B1YmxpYyBjbGFzcyBNb2NrTm90aWZpY2F0aW9uTGlzdGVuZXIgZXh0ZW5kcyBOb3RpZmljYXRpb25MaXN0ZW5lclNlcnZpY2UgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJUZXN0Tm90aWZpY2F0aW9uTGlzdGVuZXIiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBLRyA9ICJhbmRyb2lkLmFwcC5zdHVicyI7CisKKyAgICBwcml2YXRlIEFycmF5TGlzdDxTdHJpbmc+IG1UZXN0UGFja2FnZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgIHB1YmxpYyBBcnJheUxpc3Q8U3RhdHVzQmFyTm90aWZpY2F0aW9uPiBtUG9zdGVkID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgcHVibGljIEFycmF5TGlzdDxTdGF0dXNCYXJOb3RpZmljYXRpb24+IG1SZW1vdmVkID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgcHVibGljIFJhbmtpbmdNYXAgbVJhbmtpbmdNYXA7CisKKyAgICBwcml2YXRlIHN0YXRpYyBNb2NrTm90aWZpY2F0aW9uTGlzdGVuZXIgc05vdGlmaWNhdGlvbkxpc3RlbmVySW5zdGFuY2UgPSBudWxsOworICAgIGJvb2xlYW4gaXNDb25uZWN0ZWQ7CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRJZCgpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIiVzLyVzIiwgTW9ja05vdGlmaWNhdGlvbkxpc3RlbmVyLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgTW9ja05vdGlmaWNhdGlvbkxpc3RlbmVyLmNsYXNzLmdldE5hbWUoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBDb21wb25lbnROYW1lIGdldENvbXBvbmVudE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuZXcgQ29tcG9uZW50TmFtZShNb2NrTm90aWZpY2F0aW9uTGlzdGVuZXIuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICBNb2NrTm90aWZpY2F0aW9uTGlzdGVuZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZSgpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoKTsKKyAgICAgICAgbVRlc3RQYWNrYWdlcy5hZGQoUEtHKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkxpc3RlbmVyQ29ubmVjdGVkKCkgeworICAgICAgICBzdXBlci5vbkxpc3RlbmVyQ29ubmVjdGVkKCk7CisgICAgICAgIHNOb3RpZmljYXRpb25MaXN0ZW5lckluc3RhbmNlID0gdGhpczsKKyAgICAgICAgaXNDb25uZWN0ZWQgPSB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uTGlzdGVuZXJEaXNjb25uZWN0ZWQoKSB7CisgICAgICAgIGlzQ29ubmVjdGVkID0gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBNb2NrTm90aWZpY2F0aW9uTGlzdGVuZXIgZ2V0SW5zdGFuY2UoKSB7CisgICAgICAgIHJldHVybiBzTm90aWZpY2F0aW9uTGlzdGVuZXJJbnN0YW5jZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZXNldERhdGEoKSB7CisgICAgICAgIG1Qb3N0ZWQuY2xlYXIoKTsKKyAgICAgICAgbVJlbW92ZWQuY2xlYXIoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbk5vdGlmaWNhdGlvblBvc3RlZChTdGF0dXNCYXJOb3RpZmljYXRpb24gc2JuLCBSYW5raW5nTWFwIHJhbmtpbmdNYXApIHsKKyAgICAgICAgaWYgKCFtVGVzdFBhY2thZ2VzLmNvbnRhaW5zKHNibi5nZXRQYWNrYWdlTmFtZSgpKSkgeyByZXR1cm47IH0KKyAgICAgICAgbVBvc3RlZC5hZGQoc2JuKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbk5vdGlmaWNhdGlvblJlbW92ZWQoU3RhdHVzQmFyTm90aWZpY2F0aW9uIHNibiwgUmFua2luZ01hcCByYW5raW5nTWFwKSB7CisgICAgICAgIGlmICghbVRlc3RQYWNrYWdlcy5jb250YWlucyhzYm4uZ2V0UGFja2FnZU5hbWUoKSkpIHsgcmV0dXJuOyB9CisgICAgICAgIG1SZW1vdmVkLmFkZChzYm4pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uTm90aWZpY2F0aW9uUmFua2luZ1VwZGF0ZShSYW5raW5nTWFwIHJhbmtpbmdNYXApIHsKKyAgICAgICAgbVJhbmtpbmdNYXAgPSByYW5raW5nTWFwOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2FwcC9hcHAvc3JjL2FuZHJvaWQvYXBwL3N0dWJzL051bGxTZXJ2aWNlLmphdmEgYi90ZXN0cy9hcHAvYXBwL3NyYy9hbmRyb2lkL2FwcC9zdHVicy9OdWxsU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMWM2MTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9hcHAvYXBwL3NyYy9hbmRyb2lkL2FwcC9zdHVicy9OdWxsU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYXBwLnN0dWJzOworCitpbXBvcnQgYW5kcm9pZC5hcHAuU2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisvKioKKyAqIEEgU2VydmljZSB0aGF0IGFsd2F5cyByZXR1cm5zIG51bGwgZnJvbSBvbkJpbmQoSW50ZW50KS4KKyAqLworcHVibGljIGNsYXNzIE51bGxTZXJ2aWNlIGV4dGVuZHMgU2VydmljZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJOdWxsU2VydmljZSI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSUJpbmRlciBvbkJpbmQoSW50ZW50IGludGVudCkgeworICAgICAgICBMb2cuaShUQUcsICJvbkJpbmQoKSByZXR1cm5pbmcgbnVsbCIpOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2FwcC9hcHAyL0FuZHJvaWQubWsgYi90ZXN0cy9hcHAvYXBwMi9BbmRyb2lkLm1rCmluZGV4IDI2ODljMzAuLjQ4OWRlYTAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2FwcC9hcHAyL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvYXBwL2FwcDIvQW5kcm9pZC5tawpAQCAtMTksMTEgKzE5LDEwIEBACiBMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwogCiBMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAotICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwgXAorICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0IFwKIAogTE9DQUxfU1JDX0ZJTEVTIDo9IFwKLSAgICAuLi9hcHAvc3JjL2FuZHJvaWQvYXBwL3N0dWJzL0xvY2FsU2VydmljZS5qYXZhIFwKLSAgICAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykgXAorICAgIC4uL2FwcC9zcmMvYW5kcm9pZC9hcHAvc3R1YnMvTG9jYWxTZXJ2aWNlLmphdmEKIAogTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAogCmRpZmYgLS1naXQgYS90ZXN0cy9hcHAvYXBwMi9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvYXBwL2FwcDIvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA4YzMwOTk2Li4wOTI2MjUxIDEwMDY0NAotLS0gYS90ZXN0cy9hcHAvYXBwMi9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL2FwcC9hcHAyL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTE5LDYgKzE5LDggQEAKICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlNZU1RFTV9BTEVSVF9XSU5ET1ciIC8+CiAKICAgICA8YXBwbGljYXRpb24+CisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgorCiAgICAgICAgIDxzZXJ2aWNlIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hcHAuc3R1YnMuTG9jYWxTZXJ2aWNlIgogICAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIi8+CiAgICAgICAgIDxzZXJ2aWNlIGFuZHJvaWQ6bmFtZT0iLkFsZXJ0V2luZG93U2VydmljZSIKZGlmZiAtLWdpdCBhL3Rlc3RzL2FwcC9hcHAyL3NyYy9jb20vYW5kcm9pZC9hcHAyL0FsZXJ0V2luZG93U2VydmljZS5qYXZhIGIvdGVzdHMvYXBwL2FwcDIvc3JjL2NvbS9hbmRyb2lkL2FwcDIvQWxlcnRXaW5kb3dTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MTRlOGEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvYXBwL2FwcDIvc3JjL2NvbS9hbmRyb2lkL2FwcDIvQWxlcnRXaW5kb3dTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5hcHAyOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuU2VydmljZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzZW5nZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKLQotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3IuQkxVRTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LkdyYXZpdHkuTEVGVDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LkdyYXZpdHkuVE9QOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfRk9DVVNBQkxFOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfVE9VQ0hBQkxFOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19XQVRDSF9PVVRTSURFX1RPVUNIOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9BUFBMSUNBVElPTl9PVkVSTEFZOwotCi0vKiogU2VydmljZSBmb3IgY3JlYXRpbmcgYW5kIG1hbmFnaW5nIGFsZXJ0IHdpbmRvd3MuICovCi1wdWJsaWMgY2xhc3MgQWxlcnRXaW5kb3dTZXJ2aWNlIGV4dGVuZHMgU2VydmljZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkFsZXJ0V2luZG93U2VydmljZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0FERF9BTEVSVF9XSU5ET1cgPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19SRU1PVkVfQUxFUlRfV0lORE9XID0gMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfUkVNT1ZFX0FMTF9BTEVSVF9XSU5ET1dTID0gMzsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5PVElGSUNBVElPTl9NRVNTRU5HRVJfRVhUUkEgPQotICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFwcDIuQWxlcnRXaW5kb3dTZXJ2aWNlLk5PVElGSUNBVElPTl9NRVNTRU5HRVJfRVhUUkEiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19PTl9BTEVSVF9XSU5ET1dfQURERUQgPSA0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19PTl9BTEVSVF9XSU5ET1dfUkVNT1ZFRCA9IDU7Ci0KLSAgICBwcml2YXRlIExpbmtlZExpc3Q8Vmlldz4gbUFsZXJ0V2luZG93cyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKLQotICAgIHByaXZhdGUgTWVzc2VuZ2VyIG1PdXRnb2luZ01lc3NlbmdlciA9IG51bGw7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNZXNzZW5nZXIgbUluY29taW5nTWVzc2VuZ2VyID0gbmV3IE1lc3NlbmdlcihuZXcgSW5jb21pbmdIYW5kbGVyKCkpOwotCi0gICAgcHJpdmF0ZSBjbGFzcyBJbmNvbWluZ0hhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIE1TR19BRERfQUxFUlRfV0lORE9XOgotICAgICAgICAgICAgICAgICAgICBhZGRBbGVydFdpbmRvdygpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE1TR19SRU1PVkVfQUxFUlRfV0lORE9XOgotICAgICAgICAgICAgICAgICAgICByZW1vdmVBbGVydFdpbmRvdygpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE1TR19SRU1PVkVfQUxMX0FMRVJUX1dJTkRPV1M6Ci0gICAgICAgICAgICAgICAgICAgIHJlbW92ZUFsbEFsZXJ0V2luZG93cygpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBzdXBlci5oYW5kbGVNZXNzYWdlKG1zZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkQWxlcnRXaW5kb3coKSB7Ci0gICAgICAgIGZpbmFsIFBvaW50IHNpemUgPSBuZXcgUG9pbnQoKTsKLSAgICAgICAgZmluYWwgV2luZG93TWFuYWdlciB3bSA9IGdldFN5c3RlbVNlcnZpY2UoV2luZG93TWFuYWdlci5jbGFzcyk7Ci0gICAgICAgIHdtLmdldERlZmF1bHREaXNwbGF5KCkuZ2V0U2l6ZShzaXplKTsKLQotICAgICAgICBmaW5hbCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBwYXJhbXMgPSBuZXcgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMoCi0gICAgICAgICAgICAgICAgVFlQRV9BUFBMSUNBVElPTl9PVkVSTEFZLAotICAgICAgICAgICAgICAgIEZMQUdfTk9UX0ZPQ1VTQUJMRSB8IEZMQUdfV0FUQ0hfT1VUU0lERV9UT1VDSCB8IEZMQUdfTk9UX1RPVUNIQUJMRSk7Ci0gICAgICAgIHBhcmFtcy53aWR0aCA9IHNpemUueCAvIDM7Ci0gICAgICAgIHBhcmFtcy5oZWlnaHQgPSBzaXplLnkgLyAzOwotICAgICAgICBwYXJhbXMuZ3Jhdml0eSA9IFRPUCB8IExFRlQ7Ci0KLSAgICAgICAgZmluYWwgVGV4dFZpZXcgdmlldyA9IG5ldyBUZXh0Vmlldyh0aGlzKTsKLSAgICAgICAgdmlldy5zZXRUZXh0KCJBbGVydFdpbmRvd1NlcnZpY2UiICsgbUFsZXJ0V2luZG93cy5zaXplKCkpOwotICAgICAgICB2aWV3LnNldEJhY2tncm91bmRDb2xvcihCTFVFKTsKLSAgICAgICAgd20uYWRkVmlldyh2aWV3LCBwYXJhbXMpOwotICAgICAgICBtQWxlcnRXaW5kb3dzLmFkZCh2aWV3KTsKLQotICAgICAgICBpZiAoREVCVUcpIExvZy5lKFRBRywgImFkZEFsZXJ0V2luZG93ICIgKyBtQWxlcnRXaW5kb3dzLnNpemUoKSk7Ci0gICAgICAgIGlmIChtT3V0Z29pbmdNZXNzZW5nZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtT3V0Z29pbmdNZXNzZW5nZXIuc2VuZChNZXNzYWdlLm9idGFpbihudWxsLCBNU0dfT05fQUxFUlRfV0lORE9XX0FEREVEKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVtb3ZlQWxlcnRXaW5kb3coKSB7Ci0gICAgICAgIGlmIChtQWxlcnRXaW5kb3dzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgV2luZG93TWFuYWdlciB3bSA9IGdldFN5c3RlbVNlcnZpY2UoV2luZG93TWFuYWdlci5jbGFzcyk7Ci0gICAgICAgIHdtLnJlbW92ZVZpZXcobUFsZXJ0V2luZG93cy5wb3AoKSk7Ci0KLSAgICAgICAgaWYgKERFQlVHKSBMb2cuZShUQUcsICJyZW1vdmVBbGVydFdpbmRvdyAiICsgbUFsZXJ0V2luZG93cy5zaXplKCkpOwotICAgICAgICBpZiAobU91dGdvaW5nTWVzc2VuZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbU91dGdvaW5nTWVzc2VuZ2VyLnNlbmQoTWVzc2FnZS5vYnRhaW4obnVsbCwgTVNHX09OX0FMRVJUX1dJTkRPV19SRU1PVkVEKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVtb3ZlQWxsQWxlcnRXaW5kb3dzKCkgewotICAgICAgICB3aGlsZSAobUFsZXJ0V2luZG93cy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICByZW1vdmVBbGVydFdpbmRvdygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElCaW5kZXIgb25CaW5kKEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgaWYgKERFQlVHKSBMb2cuZShUQUcsICJvbkJpbmQiKTsKLSAgICAgICAgbU91dGdvaW5nTWVzc2VuZ2VyID0gaW50ZW50LmdldFBhcmNlbGFibGVFeHRyYShOT1RJRklDQVRJT05fTUVTU0VOR0VSX0VYVFJBKTsKLSAgICAgICAgcmV0dXJuIG1JbmNvbWluZ01lc3Nlbmdlci5nZXRCaW5kZXIoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvblVuYmluZChJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgIGlmIChERUJVRykgTG9nLmUoVEFHLCAib25VbmJpbmQiKTsKLSAgICAgICAgcmVtb3ZlQWxsQWxlcnRXaW5kb3dzKCk7Ci0gICAgICAgIHJldHVybiBzdXBlci5vblVuYmluZChpbnRlbnQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL2FwcC9hcHBTZGsyNS9BbmRyb2lkLm1rIGIvdGVzdHMvYXBwL2FwcFNkazI1L0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YzZkMDcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvYXBwL2FwcFNkazI1L0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLSMgRG9uJ3QgaW5jbHVkZSB0aGlzIHBhY2thZ2UgaW4gYW55IHRhcmdldC4KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi0KLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCi0gICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbCBcCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSBcCi0gICAgJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpIFwKLQotTE9DQUxfU0RLX1ZFUlNJT04gOj0gMjUKLQotIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKLQotTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0FwcFRlc3RTZGsyNQotCi1pbmNsdWRlICQoQlVJTERfQ1RTX1NVUFBPUlRfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2FwcC9hcHBTZGsyNS9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvYXBwL2FwcFNkazI1L0FuZHJvaWRNYW5pZmVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY1NjRmNTEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvYXBwL2FwcFNkazI1L0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLQotICB+IENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gIH4KLSAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCi0gIC0tPgotCi08bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLmFwcFNkazI1Ij4KLQotICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJDdHNBcHBUZXN0U2RrMjUiPgotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuU2RrMjVNYXhBc3BlY3RSYXRpb0FjdGl2aXR5IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iU2RrMjVNYXhBc3BlY3RSYXRpb0FjdGl2aXR5IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpyZXNpemVhYmxlQWN0aXZpdHk9ImZhbHNlIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSI+Ci0gICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KLSAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+Ci0gICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuRlJBTUVXT1JLX0lOU1RSVU1FTlRBVElPTl9URVNUIiAvPgotICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgotICAgICAgICA8L2FjdGl2aXR5PgotICAgIDwvYXBwbGljYXRpb24+Ci08L21hbmlmZXN0PgotCmRpZmYgLS1naXQgYS90ZXN0cy9hcHAvYXBwU2RrMjUvc3JjL2NvbS9hbmRyb2lkL2FwcFNkazI1L1NkazI1TWF4QXNwZWN0UmF0aW9BY3Rpdml0eS5qYXZhIGIvdGVzdHMvYXBwL2FwcFNkazI1L3NyYy9jb20vYW5kcm9pZC9hcHBTZGsyNS9TZGsyNU1heEFzcGVjdFJhdGlvQWN0aXZpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZhMjVlMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9hcHAvYXBwU2RrMjUvc3JjL2NvbS9hbmRyb2lkL2FwcFNkazI1L1NkazI1TWF4QXNwZWN0UmF0aW9BY3Rpdml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5hcHBTZGsyNTsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotCi1wdWJsaWMgY2xhc3MgU2RrMjVNYXhBc3BlY3RSYXRpb0FjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgewotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9hcHAvc3JjL2FuZHJvaWQvYXBwL2JhY2t1cC9jdHMvQmFja3VwTWFuYWdlclRlc3QuamF2YSBiL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvYmFja3VwL2N0cy9CYWNrdXBNYW5hZ2VyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTBlOGQxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvYmFja3VwL2N0cy9CYWNrdXBNYW5hZ2VyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5hcHAuYmFja3VwLmN0czsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLmJhY2t1cC5CYWNrdXBNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuYXBwLmJhY2t1cC5SZXN0b3JlT2JzZXJ2ZXI7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIEJhY2t1cE1hbmFnZXJUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RCYWNrdXBNYW5hZ2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIENoZWNrIHRoYXQgdGhlc2UgZG9uJ3QgY3Jhc2ggYXMgaWYgdGhleSB3ZXJlIGNhbGxlZCBpbiBhbiBhcHAuLi4KLSAgICAgICAgQmFja3VwTWFuYWdlciBiYWNrdXBNYW5hZ2VyID0gbmV3IEJhY2t1cE1hbmFnZXIobUNvbnRleHQpOwotICAgICAgICBiYWNrdXBNYW5hZ2VyLmRhdGFDaGFuZ2VkKCk7Ci0gICAgICAgIEJhY2t1cE1hbmFnZXIuZGF0YUNoYW5nZWQoImFuZHJvaWQuYXBwLnN0dWJzIik7Ci0KLSAgICAgICAgLy8gQmFja3VwIGlzbid0IGV4cGVjdGVkIHRvIHdvcmsgaW4gdGhpcyB0ZXN0IGJ1dCBjaGVjayBmb3Igb2J2aW91cyBidWdzLi4uCi0gICAgICAgIGludCByZXN1bHQgPSBiYWNrdXBNYW5hZ2VyLnJlcXVlc3RSZXN0b3JlKG5ldyBSZXN0b3JlT2JzZXJ2ZXIoKSB7fSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0ICE9IDApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL0FjdGl2aXR5QWN0aW9uTW9kZVRlc3QuamF2YSBiL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL0FjdGl2aXR5QWN0aW9uTW9kZVRlc3QuamF2YQppbmRleCAxZTFhYjIxLi4yYTBlMTZkIDEwMDY0NAotLS0gYS90ZXN0cy9hcHAvc3JjL2FuZHJvaWQvYXBwL2N0cy9BY3Rpdml0eUFjdGlvbk1vZGVUZXN0LmphdmEKKysrIGIvdGVzdHMvYXBwL3NyYy9hbmRyb2lkL2FwcC9jdHMvQWN0aXZpdHlBY3Rpb25Nb2RlVGVzdC5qYXZhCkBAIC0xNSwyMyArMTUsMjMgQEAKICAqLwogcGFja2FnZSBhbmRyb2lkLmFwcC5jdHM7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOwogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLio7CiAKIGltcG9ydCBhbmRyb2lkLmFwcC5zdHVicy5Nb2NrQWN0aXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TbWFsbFRlc3Q7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkFjdGlvbk1vZGU7CiBpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvdzsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKLQogQFNtYWxsVGVzdAogQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKIHB1YmxpYyBjbGFzcyBBY3Rpdml0eUFjdGlvbk1vZGVUZXN0IHsKZGlmZiAtLWdpdCBhL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL0FjdGl2aXR5TWFuYWdlck1lbW9yeUNsYXNzVGVzdC5qYXZhIGIvdGVzdHMvYXBwL3NyYy9hbmRyb2lkL2FwcC9jdHMvQWN0aXZpdHlNYW5hZ2VyTWVtb3J5Q2xhc3NUZXN0LmphdmEKaW5kZXggZmVmYTU0Ni4uY2RhNjVhOSAxMDA2NDQKLS0tIGEvdGVzdHMvYXBwL3NyYy9hbmRyb2lkL2FwcC9jdHMvQWN0aXZpdHlNYW5hZ2VyTWVtb3J5Q2xhc3NUZXN0LmphdmEKKysrIGIvdGVzdHMvYXBwL3NyYy9hbmRyb2lkL2FwcC9jdHMvQWN0aXZpdHlNYW5hZ2VyTWVtb3J5Q2xhc3NUZXN0LmphdmEKQEAgLTIyLDYgKzIyLDcgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QudWlhdXRvbWF0b3IuVWlEZXZpY2U7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKIGltcG9ydCBhbmRyb2lkLnZpZXcuRGlzcGxheTsKQEAgLTMxLDYgKzMyLDggQEAKIAogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CiAKIC8qKgogICoge0BsaW5rIEFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyfSB0aGF0IHRlc3RzIHtAbGluayBBY3Rpdml0eU1hbmFnZXIjZ2V0TWVtb3J5Q2xhc3MoKX0KQEAgLTY3LDYgKzcwLDcgQEAKICAgICAgICAgICAgIGV4cGVjdGVkTWVtb3J5U2l6ZUZvcldhdGNoLnB1dChEaXNwbGF5TWV0cmljcy5ERU5TSVRZXzM2MCwgNDgpOwogICAgICAgICAgICAgZXhwZWN0ZWRNZW1vcnlTaXplRm9yV2F0Y2gucHV0KERpc3BsYXlNZXRyaWNzLkRFTlNJVFlfNDAwLCA1Nik7CiAgICAgICAgICAgICBleHBlY3RlZE1lbW9yeVNpemVGb3JXYXRjaC5wdXQoRGlzcGxheU1ldHJpY3MuREVOU0lUWV80MjAsIDY0KTsKKyAgICAgICAgICAgIGV4cGVjdGVkTWVtb3J5U2l6ZUZvcldhdGNoLnB1dChEaXNwbGF5TWV0cmljcy5ERU5TSVRZXzQ0MCwgODgpOwogICAgICAgICAgICAgZXhwZWN0ZWRNZW1vcnlTaXplRm9yV2F0Y2gucHV0KERpc3BsYXlNZXRyaWNzLkRFTlNJVFlfWFhISUdILCA4OCk7CiAgICAgICAgICAgICBleHBlY3RlZE1lbW9yeVNpemVGb3JXYXRjaC5wdXQoRGlzcGxheU1ldHJpY3MuREVOU0lUWV81NjAsIDExMik7CiAgICAgICAgICAgICBleHBlY3RlZE1lbW9yeVNpemVGb3JXYXRjaC5wdXQoRGlzcGxheU1ldHJpY3MuREVOU0lUWV9YWFhISUdILCAxNTQpOwpAQCAtODUsNiArODksNyBAQAogICAgICAgICAgICAgZXhwZWN0ZWRNZW1vcnlTaXplRm9yU21hbGxOb3JtYWxTY3JlZW4ucHV0KERpc3BsYXlNZXRyaWNzLkRFTlNJVFlfMzYwLCA4MCk7CiAgICAgICAgICAgICBleHBlY3RlZE1lbW9yeVNpemVGb3JTbWFsbE5vcm1hbFNjcmVlbi5wdXQoRGlzcGxheU1ldHJpY3MuREVOU0lUWV80MDAsIDk2KTsKICAgICAgICAgICAgIGV4cGVjdGVkTWVtb3J5U2l6ZUZvclNtYWxsTm9ybWFsU2NyZWVuLnB1dChEaXNwbGF5TWV0cmljcy5ERU5TSVRZXzQyMCwgMTEyKTsKKyAgICAgICAgICAgIGV4cGVjdGVkTWVtb3J5U2l6ZUZvclNtYWxsTm9ybWFsU2NyZWVuLnB1dChEaXNwbGF5TWV0cmljcy5ERU5TSVRZXzQ0MCwgMTI4KTsKICAgICAgICAgICAgIGV4cGVjdGVkTWVtb3J5U2l6ZUZvclNtYWxsTm9ybWFsU2NyZWVuLnB1dChEaXNwbGF5TWV0cmljcy5ERU5TSVRZX1hYSElHSCwgMTI4KTsKICAgICAgICAgICAgIGV4cGVjdGVkTWVtb3J5U2l6ZUZvclNtYWxsTm9ybWFsU2NyZWVuLnB1dChEaXNwbGF5TWV0cmljcy5ERU5TSVRZXzU2MCwgMTkyKTsKICAgICAgICAgICAgIGV4cGVjdGVkTWVtb3J5U2l6ZUZvclNtYWxsTm9ybWFsU2NyZWVuLnB1dChEaXNwbGF5TWV0cmljcy5ERU5TSVRZX1hYWEhJR0gsIDI1Nik7CkBAIC0xMDMsNiArMTA4LDcgQEAKICAgICAgICAgICAgIGV4cGVjdGVkTWVtb3J5U2l6ZUZvckxhcmdlU2NyZWVuLnB1dChEaXNwbGF5TWV0cmljcy5ERU5TSVRZXzM2MCwgMTYwKTsKICAgICAgICAgICAgIGV4cGVjdGVkTWVtb3J5U2l6ZUZvckxhcmdlU2NyZWVuLnB1dChEaXNwbGF5TWV0cmljcy5ERU5TSVRZXzQwMCwgMTkyKTsKICAgICAgICAgICAgIGV4cGVjdGVkTWVtb3J5U2l6ZUZvckxhcmdlU2NyZWVuLnB1dChEaXNwbGF5TWV0cmljcy5ERU5TSVRZXzQyMCwgMjI4KTsKKyAgICAgICAgICAgIGV4cGVjdGVkTWVtb3J5U2l6ZUZvckxhcmdlU2NyZWVuLnB1dChEaXNwbGF5TWV0cmljcy5ERU5TSVRZXzQ0MCwgMjU2KTsKICAgICAgICAgICAgIGV4cGVjdGVkTWVtb3J5U2l6ZUZvckxhcmdlU2NyZWVuLnB1dChEaXNwbGF5TWV0cmljcy5ERU5TSVRZX1hYSElHSCwgMjU2KTsKICAgICAgICAgICAgIGV4cGVjdGVkTWVtb3J5U2l6ZUZvckxhcmdlU2NyZWVuLnB1dChEaXNwbGF5TWV0cmljcy5ERU5TSVRZXzU2MCwgMzg0KTsKICAgICAgICAgICAgIGV4cGVjdGVkTWVtb3J5U2l6ZUZvckxhcmdlU2NyZWVuLnB1dChEaXNwbGF5TWV0cmljcy5ERU5TSVRZX1hYWEhJR0gsIDUxMik7CkBAIC0xMjEsNiArMTI3LDcgQEAKICAgICAgICAgICAgIGV4cGVjdGVkTWVtb3J5U2l6ZUZvclhMYXJnZVNjcmVlbi5wdXQoRGlzcGxheU1ldHJpY3MuREVOU0lUWV8zNjAsIDI0MCk7CiAgICAgICAgICAgICBleHBlY3RlZE1lbW9yeVNpemVGb3JYTGFyZ2VTY3JlZW4ucHV0KERpc3BsYXlNZXRyaWNzLkRFTlNJVFlfNDAwLCAyODgpOwogICAgICAgICAgICAgZXhwZWN0ZWRNZW1vcnlTaXplRm9yWExhcmdlU2NyZWVuLnB1dChEaXNwbGF5TWV0cmljcy5ERU5TSVRZXzQyMCwgMzM2KTsKKyAgICAgICAgICAgIGV4cGVjdGVkTWVtb3J5U2l6ZUZvclhMYXJnZVNjcmVlbi5wdXQoRGlzcGxheU1ldHJpY3MuREVOU0lUWV80NDAsIDM4NCk7CiAgICAgICAgICAgICBleHBlY3RlZE1lbW9yeVNpemVGb3JYTGFyZ2VTY3JlZW4ucHV0KERpc3BsYXlNZXRyaWNzLkRFTlNJVFlfWFhISUdILCAzODQpOwogICAgICAgICAgICAgZXhwZWN0ZWRNZW1vcnlTaXplRm9yWExhcmdlU2NyZWVuLnB1dChEaXNwbGF5TWV0cmljcy5ERU5TSVRZXzU2MCwgNTc2KTsKICAgICAgICAgICAgIGV4cGVjdGVkTWVtb3J5U2l6ZUZvclhMYXJnZVNjcmVlbi5wdXQoRGlzcGxheU1ldHJpY3MuREVOU0lUWV9YWFhISUdILCA3NjgpOwpAQCAtMTUyLDEyICsxNTksMzUgQEAKIAogICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSIzLjciKQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRNZW1vcnlDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBVaURldmljZSB1aURldmljZSA9IFVpRGV2aWNlLmdldEluc3RhbmNlKGdldEluc3RydW1lbnRhdGlvbigpKTsKKyAgICAgICAgaW50IGRlbnNpdHkgPSByZXNldERlbnNpdHlJZk5lZWRlZCh1aURldmljZSk7CisKICAgICAgICAgaW50IG1lbW9yeUNsYXNzID0gZ2V0TWVtb3J5Q2xhc3MoKTsKICAgICAgICAgaW50IHNjcmVlbkRlbnNpdHkgPSBnZXRTY3JlZW5EZW5zaXR5KCk7CiAgICAgICAgIGludCBzY3JlZW5TaXplID0gZ2V0U2NyZWVuU2l6ZSgpOwogICAgICAgICBhc3NlcnRNZW1vcnlGb3JTY3JlZW5EZW5zaXR5KG1lbW9yeUNsYXNzLCBzY3JlZW5EZW5zaXR5LCBzY3JlZW5TaXplKTsKIAogICAgICAgICBydW5IZWFwVGVzdEFwcChtZW1vcnlDbGFzcyk7CisKKyAgICAgICAgcmVzdG9yZURlbnNpdHlJZk5lZWRlZCh1aURldmljZSwgZGVuc2l0eSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgcmVzZXREZW5zaXR5SWZOZWVkZWQoVWlEZXZpY2UgZGV2aWNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIG91dHB1dCA9IGRldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKCJ3bSBkZW5zaXR5Iik7CisgICAgICAgICBmaW5hbCBQYXR0ZXJuIHAgPSBQYXR0ZXJuLmNvbXBpbGUoIk92ZXJyaWRlIGRlbnNpdHk6IChcXGQrKSIpOworICAgICAgICAgZmluYWwgTWF0Y2hlciBtID0gcC5tYXRjaGVyKG91dHB1dCk7CisgICAgICAgICBpZiAobS5maW5kKCkpIHsKKyAgICAgICAgICAgICBkZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZCgid20gZGVuc2l0eSByZXNldCIpOworICAgICAgICAgICAgIGludCByZXN0b3JlRGVuc2l0eSA9IEludGVnZXIucGFyc2VJbnQobS5ncm91cCgxKSk7CisgICAgICAgICAgICAgcmV0dXJuIHJlc3RvcmVEZW5zaXR5OworICAgICAgICAgfQorICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZXN0b3JlRGVuc2l0eUlmTmVlZGVkKFVpRGV2aWNlIGRldmljZSwgaW50IHJlc3RvcmVEZW5zaXR5KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHJlc3RvcmVEZW5zaXR5ID4gMCkgeworICAgICAgICAgICAgZGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoIndtIGRlbnNpdHkgIiArIHJlc3RvcmVEZW5zaXR5KTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgaW50IGdldE1lbW9yeUNsYXNzKCkgewpkaWZmIC0tZ2l0IGEvdGVzdHMvYXBwL3NyYy9hbmRyb2lkL2FwcC9jdHMvQWN0aXZpdHlNYW5hZ2VyUHJvY2Vzc1N0YXRlVGVzdC5qYXZhIGIvdGVzdHMvYXBwL3NyYy9hbmRyb2lkL2FwcC9jdHMvQWN0aXZpdHlNYW5hZ2VyUHJvY2Vzc1N0YXRlVGVzdC5qYXZhCmluZGV4IDY4Y2NmYzUuLjRjZTMxYTMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL0FjdGl2aXR5TWFuYWdlclByb2Nlc3NTdGF0ZVRlc3QuamF2YQorKysgYi90ZXN0cy9hcHAvc3JjL2FuZHJvaWQvYXBwL2N0cy9BY3Rpdml0eU1hbmFnZXJQcm9jZXNzU3RhdGVUZXN0LmphdmEKQEAgLTE2LDkgKzE2LDEwIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5hcHAuY3RzOwogCi1pbXBvcnQgYW5kcm9pZC5NYW5pZmVzdDsKK2ltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlOwogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BcHBPcHNNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmFwcC5LZXlndWFyZE1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5hcHAuY3RzLmFuZHJvaWQuYXBwLmN0cy50b29scy5TZXJ2aWNlQ29ubmVjdGlvbkhhbmRsZXI7CkBAIC0yNywxOSArMjgsMzMgQEAKIGltcG9ydCBhbmRyb2lkLmFwcC5jdHMuYW5kcm9pZC5hcHAuY3RzLnRvb2xzLlVpZEltcG9ydGFuY2VMaXN0ZW5lcjsKIGltcG9ydCBhbmRyb2lkLmFwcC5jdHMuYW5kcm9pZC5hcHAuY3RzLnRvb2xzLldhaXRGb3JCcm9hZGNhc3Q7CiBpbXBvcnQgYW5kcm9pZC5hcHAuY3RzLmFuZHJvaWQuYXBwLmN0cy50b29scy5XYXRjaFVpZFJ1bm5lcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm87CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CiBpbXBvcnQgYW5kcm9pZC5vcy5Qb3dlck1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnNlcnZlci5hbS5XaW5kb3dNYW5hZ2VyU3RhdGU7CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QudWlhdXRvbWF0b3IuQnlTZWxlY3RvcjsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC51aWF1dG9tYXRvci5VaURldmljZTsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC51aWF1dG9tYXRvci5VaVNlbGVjdG9yOwogaW1wb3J0IGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0Q2FzZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNkZFRlc3Q7CiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5TeXN0ZW1VdGlsOwogCiBwdWJsaWMgY2xhc3MgQWN0aXZpdHlNYW5hZ2VyUHJvY2Vzc1N0YXRlVGVzdCBleHRlbmRzIEluc3RydW1lbnRhdGlvblRlc3RDYXNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gQWN0aXZpdHlNYW5hZ2VyUHJvY2Vzc1N0YXRlVGVzdC5jbGFzcy5nZXROYW1lKCk7CisKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RVQl9QQUNLQUdFX05BTUUgPSAiYW5kcm9pZC5hcHAuc3R1YnMiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXQUlUX1RJTUUgPSAyMDAwOwogICAgIC8vIEEgc2Vjb25kYXJ5IHRlc3QgYWN0aXZpdHkgZnJvbSBhbm90aGVyIEFQSy4KQEAgLTUxLDEwICs2NiwyMyBAQAogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFDVElPTl9TSU1QTEVfQUNUSVZJVFlfU1RBUlRfU0VSVklDRV9SRVNVTFQgPQogICAgICAgICAgICAgImNvbS5hbmRyb2lkLmN0cy5sYXVuY2hlcmFwcHMuc2ltcGxlYXBwLlNpbXBsZUFjdGl2aXR5U3RhcnRTZXJ2aWNlLlJFU1VMVCI7CiAKKyAgICAvLyBBUEtzIGZvciB0ZXN0aW5nIGhlYXZ5IHdlaWdodCBhcHAgaW50ZXJhY3Rpb25zLgorICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FOVF9TQVZFX1NUQVRFXzFfUEFDS0FHRV9OQU1FID0gImNvbS5hbmRyb2lkLnRlc3QuY2FudHNhdmVzdGF0ZTEiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FOVF9TQVZFX1NUQVRFXzJfUEFDS0FHRV9OQU1FID0gImNvbS5hbmRyb2lkLnRlc3QuY2FudHNhdmVzdGF0ZTIiOworCisgICAgLy8gQWN0aW9ucworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1NUQVJUX0ZPUkVHUk9VTkQgPSAiY29tLmFuZHJvaWQudGVzdC5hY3Rpb24uU1RBUlRfRk9SRUdST1VORCI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fU1RPUF9GT1JFR1JPVU5EID0gImNvbS5hbmRyb2lkLnRlc3QuYWN0aW9uLlNUT1BfRk9SRUdST1VORCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEVNUF9XSElURUxJU1RfRFVSQVRJT05fTVMgPSAyMDAwOworCiAgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OwogICAgIHByaXZhdGUgSW5zdHJ1bWVudGF0aW9uIG1JbnN0cnVtZW50YXRpb247CiAgICAgcHJpdmF0ZSBJbnRlbnQgbVNlcnZpY2VJbnRlbnQ7CisgICAgcHJpdmF0ZSBJbnRlbnQgbVNlcnZpY2VTdGFydEZvcmVncm91bmRJbnRlbnQ7CisgICAgcHJpdmF0ZSBJbnRlbnQgbVNlcnZpY2VTdG9wRm9yZWdyb3VuZEludGVudDsKICAgICBwcml2YXRlIEludGVudCBtU2VydmljZTJJbnRlbnQ7CisgICAgcHJpdmF0ZSBJbnRlbnQgbU1haW5Qcm9jZXNzW107CiAgICAgcHJpdmF0ZSBJbnRlbnQgbUFsbFByb2Nlc3Nlc1tdOwogCiAgICAgQE92ZXJyaWRlCkBAIC02NCwxOCArOTIsODggQEAKICAgICAgICAgbUNvbnRleHQgPSBtSW5zdHJ1bWVudGF0aW9uLmdldENvbnRleHQoKTsKICAgICAgICAgbVNlcnZpY2VJbnRlbnQgPSBuZXcgSW50ZW50KCk7CiAgICAgICAgIG1TZXJ2aWNlSW50ZW50LnNldENsYXNzTmFtZShTSU1QTEVfUEFDS0FHRV9OQU1FLCBTSU1QTEVfUEFDS0FHRV9OQU1FICsgU0lNUExFX1NFUlZJQ0UpOworICAgICAgICBtU2VydmljZVN0YXJ0Rm9yZWdyb3VuZEludGVudCA9IG5ldyBJbnRlbnQobVNlcnZpY2VJbnRlbnQpOworICAgICAgICBtU2VydmljZVN0YXJ0Rm9yZWdyb3VuZEludGVudC5zZXRBY3Rpb24oQUNUSU9OX1NUQVJUX0ZPUkVHUk9VTkQpOworICAgICAgICBtU2VydmljZVN0b3BGb3JlZ3JvdW5kSW50ZW50ID0gbmV3IEludGVudChtU2VydmljZUludGVudCk7CisgICAgICAgIG1TZXJ2aWNlU3RvcEZvcmVncm91bmRJbnRlbnQuc2V0QWN0aW9uKEFDVElPTl9TVE9QX0ZPUkVHUk9VTkQpOwogICAgICAgICBtU2VydmljZTJJbnRlbnQgPSBuZXcgSW50ZW50KCk7CiAgICAgICAgIG1TZXJ2aWNlMkludGVudC5zZXRDbGFzc05hbWUoU0lNUExFX1BBQ0tBR0VfTkFNRSwgU0lNUExFX1BBQ0tBR0VfTkFNRSArIFNJTVBMRV9TRVJWSUNFMik7CisgICAgICAgIG1NYWluUHJvY2VzcyA9IG5ldyBJbnRlbnRbMV07CisgICAgICAgIG1NYWluUHJvY2Vzc1swXSA9IG1TZXJ2aWNlSW50ZW50OwogICAgICAgICBtQWxsUHJvY2Vzc2VzID0gbmV3IEludGVudFsyXTsKICAgICAgICAgbUFsbFByb2Nlc3Nlc1swXSA9IG1TZXJ2aWNlSW50ZW50OwogICAgICAgICBtQWxsUHJvY2Vzc2VzWzFdID0gbVNlcnZpY2UySW50ZW50OwogICAgICAgICBtQ29udGV4dC5zdG9wU2VydmljZShtU2VydmljZUludGVudCk7CiAgICAgICAgIG1Db250ZXh0LnN0b3BTZXJ2aWNlKG1TZXJ2aWNlMkludGVudCk7CisgICAgICAgIHJlbW92ZVRlc3RBcHBGcm9tV2hpdGVsaXN0cygpOwogICAgIH0KIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgcHJpdmF0ZSB2b2lkIHJlbW92ZVRlc3RBcHBGcm9tV2hpdGVsaXN0cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleGVjdXRlU2hlbGxDbWQoImNtZCBkZXZpY2VpZGxlIHdoaXRlbGlzdCAtIiArIFNJTVBMRV9QQUNLQUdFX05BTUUpOworICAgICAgICBleGVjdXRlU2hlbGxDbWQoImNtZCBkZXZpY2VpZGxlIHRlbXB3aGl0ZWxpc3QgLXIgIiArIFNJTVBMRV9QQUNLQUdFX05BTUUpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGV4ZWN1dGVTaGVsbENtZChTdHJpbmcgY21kKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdCA9IFN5c3RlbVV0aWwucnVuU2hlbGxDb21tYW5kKGdldEluc3RydW1lbnRhdGlvbigpLCBjbWQpOworICAgICAgICBMb2cuZChUQUcsIFN0cmluZy5mb3JtYXQoIk91dHB1dCBmb3IgJyVzJzogJXMiLCBjbWQsIHJlc3VsdCkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc1NjcmVlbkludGVyYWN0aXZlKCkgeworICAgICAgICBmaW5hbCBQb3dlck1hbmFnZXIgcG93ZXJNYW5hZ2VyID0KKyAgICAgICAgICAgICAgICAoUG93ZXJNYW5hZ2VyKSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuUE9XRVJfU0VSVklDRSk7CisgICAgICAgIHJldHVybiBwb3dlck1hbmFnZXIuaXNJbnRlcmFjdGl2ZSgpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc0tleWd1YXJkTG9ja2VkKCkgeworICAgICAgICBmaW5hbCBLZXlndWFyZE1hbmFnZXIga2V5Z3VhcmRNYW5hZ2VyID0KKyAgICAgICAgICAgICAgICAoS2V5Z3VhcmRNYW5hZ2VyKSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuS0VZR1VBUkRfU0VSVklDRSk7CisgICAgICAgIHJldHVybiBrZXlndWFyZE1hbmFnZXIuaXNLZXlndWFyZExvY2tlZCgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB3YWl0Rm9yQXBwRm9jdXMoU3RyaW5nIHdhaXRGb3JBcHAsIGxvbmcgd2FpdFRpbWUpIHsKKyAgICAgICAgbG9uZyB3YWl0VW50aWwgPSBTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKSArIHdhaXRUaW1lOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgV2luZG93TWFuYWdlclN0YXRlIHdtcyA9IG5ldyBXaW5kb3dNYW5hZ2VyU3RhdGUoKTsKKyAgICAgICAgICAgIHdtcy5jb21wdXRlU3RhdGUoKTsKKyAgICAgICAgICAgIFN0cmluZyBhcHBOYW1lID0gd21zLmdldEZvY3VzZWRBcHAoKTsKKyAgICAgICAgICAgIGlmIChhcHBOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBDb21wb25lbnROYW1lIGNvbXAgPSBDb21wb25lbnROYW1lLnVuZmxhdHRlbkZyb21TdHJpbmcoYXBwTmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKHdhaXRGb3JBcHAuZXF1YWxzKGNvbXAuZ2V0UGFja2FnZU5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpID4gd2FpdFVudGlsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGltZWQgb3V0IHdhaXRpbmcgZm9yIGZvY3VzIG9uIGFwcCAiCisgICAgICAgICAgICAgICAgICAgICAgICArIHdhaXRGb3JBcHAgKyAiLCBsYXN0IHdhcyAiICsgYXBwTmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBMb2cuaShUQUcsICJXYWl0aW5nIGZvciBhcHAgZm9jdXMsIGN1cnJlbnQ6ICIgKyBhcHBOYW1lKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0QWN0aXZpdHlBbmRXYWl0Rm9yU2hvdyhmaW5hbCBJbnRlbnQgaW50ZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VWlBdXRvbWF0aW9uKCkuZXhlY3V0ZUFuZFdhaXRGb3JFdmVudCgKKyAgICAgICAgICAgICAgICAoKSAtPiB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5zdGFydEFjdGl2aXR5KGludGVudCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsKCJDYW5ub3Qgc3RhcnQgYWN0aXZpdHk6ICIgKyBpbnRlbnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSwgKEFjY2Vzc2liaWxpdHlFdmVudCBldmVudCkgLT4gZXZlbnQuZ2V0RXZlbnRUeXBlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgID09IEFjY2Vzc2liaWxpdHlFdmVudC5UWVBFX1dJTkRPV19TVEFURV9DSEFOR0VECisgICAgICAgICAgICAgICAgLCBXQUlUX1RJTUUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBtYXliZUNsaWNrKFVpRGV2aWNlIGRldmljZSwgVWlTZWxlY3RvciBzZWwpIHsKKyAgICAgICAgdHJ5IHsgZGV2aWNlLmZpbmRPYmplY3Qoc2VsKS5jbGljaygpOyB9IGNhdGNoIChUaHJvd2FibGUgaWdub3JlZCkgeyB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG1heWJlQ2xpY2soVWlEZXZpY2UgZGV2aWNlLCBCeVNlbGVjdG9yIHNlbCkgeworICAgICAgICB0cnkgeyBkZXZpY2UuZmluZE9iamVjdChzZWwpLmNsaWNrKCk7IH0gY2F0Y2ggKFRocm93YWJsZSBpZ25vcmVkKSB7IH0KICAgICB9CiAKICAgICAvKioKQEAgLTgzLDU3ICsxODEsNTMgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB0ZXN0VWlkSW1wb3J0YW5jZUxpc3RlbmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIFBhcmNlbCBkYXRhID0gUGFyY2VsLm9idGFpbigpOwotICAgICAgICBTZXJ2aWNlQ29ubmVjdGlvbkhhbmRsZXIgY29ubiA9IG5ldyBTZXJ2aWNlQ29ubmVjdGlvbkhhbmRsZXIobUNvbnRleHQsIG1TZXJ2aWNlSW50ZW50KTsKLSAgICAgICAgU2VydmljZUNvbm5lY3Rpb25IYW5kbGVyIGNvbm4yID0gbmV3IFNlcnZpY2VDb25uZWN0aW9uSGFuZGxlcihtQ29udGV4dCwgbVNlcnZpY2UySW50ZW50KTsKKyAgICAgICAgU2VydmljZUNvbm5lY3Rpb25IYW5kbGVyIGNvbm4gPSBuZXcgU2VydmljZUNvbm5lY3Rpb25IYW5kbGVyKG1Db250ZXh0LCBtU2VydmljZUludGVudCwKKyAgICAgICAgICAgICAgICBXQUlUX1RJTUUpOworICAgICAgICBTZXJ2aWNlQ29ubmVjdGlvbkhhbmRsZXIgY29ubjIgPSBuZXcgU2VydmljZUNvbm5lY3Rpb25IYW5kbGVyKG1Db250ZXh0LCBtU2VydmljZTJJbnRlbnQsCisgICAgICAgICAgICAgICAgV0FJVF9USU1FKTsKIAogICAgICAgICBBY3Rpdml0eU1hbmFnZXIgYW0gPSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKEFjdGl2aXR5TWFuYWdlci5jbGFzcyk7CiAKICAgICAgICAgQXBwbGljYXRpb25JbmZvIGFwcEluZm8gPSBtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpLmdldEFwcGxpY2F0aW9uSW5mbygKICAgICAgICAgICAgICAgICBTSU1QTEVfUEFDS0FHRV9OQU1FLCAwKTsKLSAgICAgICAgVWlkSW1wb3J0YW5jZUxpc3RlbmVyIHVpZEZvcmVncm91bmRMaXN0ZW5lciA9IG5ldyBVaWRJbXBvcnRhbmNlTGlzdGVuZXIoYXBwSW5mby51aWQpOworICAgICAgICBVaWRJbXBvcnRhbmNlTGlzdGVuZXIgdWlkRm9yZWdyb3VuZExpc3RlbmVyID0gbmV3IFVpZEltcG9ydGFuY2VMaXN0ZW5lcihtQ29udGV4dCwKKyAgICAgICAgICAgICAgICBhcHBJbmZvLnVpZCwgQWN0aXZpdHlNYW5hZ2VyLlJ1bm5pbmdBcHBQcm9jZXNzSW5mby5JTVBPUlRBTkNFX1NFUlZJQ0UsIFdBSVRfVElNRSk7CiAKLSAgICAgICAgU3RyaW5nIGNtZCA9ICJwbSByZXZva2UgIiArIFNUVUJfUEFDS0FHRV9OQU1FICsgIiAiCi0gICAgICAgICAgICAgICAgKyBNYW5pZmVzdC5wZXJtaXNzaW9uLlBBQ0tBR0VfVVNBR0VfU1RBVFM7Ci0gICAgICAgIFN0cmluZyByZXN1bHQgPSBTeXN0ZW1VdGlsLnJ1blNoZWxsQ29tbWFuZChnZXRJbnN0cnVtZW50YXRpb24oKSwgY21kKTsKLSAgICAgICAgLyoKLSAgICAgICAgTG9nLmQoIlhYWFgiLCAiSW52b2tlOiAiICsgY21kKTsKLSAgICAgICAgTG9nLmQoIlhYWFgiLCAiUmVzdWx0OiAiICsgcmVzdWx0KTsKLSAgICAgICAgKi8KKyAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VWlBdXRvbWF0aW9uKCkucmV2b2tlUnVudGltZVBlcm1pc3Npb24oCisgICAgICAgICAgICAgICAgU1RVQl9QQUNLQUdFX05BTUUsIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5QQUNLQUdFX1VTQUdFX1NUQVRTKTsKICAgICAgICAgYm9vbGVhbiBnb3RFeGNlcHRpb24gPSBmYWxzZTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFtLmFkZE9uVWlkSW1wb3J0YW5jZUxpc3RlbmVyKHVpZEZvcmVncm91bmRMaXN0ZW5lciwKLSAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyLlJ1bm5pbmdBcHBQcm9jZXNzSW5mby5JTVBPUlRBTkNFX1NFUlZJQ0UpOworICAgICAgICAgICAgdWlkRm9yZWdyb3VuZExpc3RlbmVyLnJlZ2lzdGVyKCk7CiAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIGdvdEV4Y2VwdGlvbiA9IHRydWU7CiAgICAgICAgIH0KICAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgU2VjdXJpdHlFeGNlcHRpb24gdGhyb3duIiwgZ290RXhjZXB0aW9uKTsKIAotICAgICAgICBjbWQgPSAicG0gZ3JhbnQgIiArIFNUVUJfUEFDS0FHRV9OQU1FICsgIiAiCi0gICAgICAgICAgICAgICAgKyBNYW5pZmVzdC5wZXJtaXNzaW9uLlBBQ0tBR0VfVVNBR0VfU1RBVFM7Ci0gICAgICAgIHJlc3VsdCA9IFN5c3RlbVV0aWwucnVuU2hlbGxDb21tYW5kKGdldEluc3RydW1lbnRhdGlvbigpLCBjbWQpOworICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKS5nZXRVaUF1dG9tYXRpb24oKS5ncmFudFJ1bnRpbWVQZXJtaXNzaW9uKAorICAgICAgICAgICAgICAgIFNUVUJfUEFDS0FHRV9OQU1FLCBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uUEFDS0FHRV9VU0FHRV9TVEFUUyk7CiAgICAgICAgIC8qCiAgICAgICAgIExvZy5kKCJYWFhYIiwgIkludm9rZTogIiArIGNtZCk7CiAgICAgICAgIExvZy5kKCJYWFhYIiwgIlJlc3VsdDogIiArIHJlc3VsdCk7CiAgICAgICAgIExvZy5kKCJYWFhYIiwgU3lzdGVtVXRpbC5ydW5TaGVsbENvbW1hbmQoZ2V0SW5zdHJ1bWVudGF0aW9uKCksICJkdW1wc3lzIHBhY2thZ2UgIgogICAgICAgICAgICAgICAgICsgU1RVQl9QQUNLQUdFX05BTUUpKTsKICAgICAgICAgKi8KLSAgICAgICAgYW0uYWRkT25VaWRJbXBvcnRhbmNlTGlzdGVuZXIodWlkRm9yZWdyb3VuZExpc3RlbmVyLAotICAgICAgICAgICAgICAgIEFjdGl2aXR5TWFuYWdlci5SdW5uaW5nQXBwUHJvY2Vzc0luZm8uSU1QT1JUQU5DRV9TRVJWSUNFKTsKKyAgICAgICAgdWlkRm9yZWdyb3VuZExpc3RlbmVyLnJlZ2lzdGVyKCk7CiAKLSAgICAgICAgVWlkSW1wb3J0YW5jZUxpc3RlbmVyIHVpZEdvbmVMaXN0ZW5lciA9IG5ldyBVaWRJbXBvcnRhbmNlTGlzdGVuZXIoYXBwSW5mby51aWQpOwotICAgICAgICBhbS5hZGRPblVpZEltcG9ydGFuY2VMaXN0ZW5lcih1aWRHb25lTGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyLlJ1bm5pbmdBcHBQcm9jZXNzSW5mby5JTVBPUlRBTkNFX0NBQ0hFRCk7CisgICAgICAgIFVpZEltcG9ydGFuY2VMaXN0ZW5lciB1aWRHb25lTGlzdGVuZXIgPSBuZXcgVWlkSW1wb3J0YW5jZUxpc3RlbmVyKG1Db250ZXh0LAorICAgICAgICAgICAgICAgIGFwcEluZm8udWlkLCBBY3Rpdml0eU1hbmFnZXIuUnVubmluZ0FwcFByb2Nlc3NJbmZvLklNUE9SVEFOQ0VfQ0FDSEVELCBXQUlUX1RJTUUpOworICAgICAgICB1aWRHb25lTGlzdGVuZXIucmVnaXN0ZXIoKTsKIAotICAgICAgICBXYXRjaFVpZFJ1bm5lciB1aWRXYXRjaGVyID0gbmV3IFdhdGNoVWlkUnVubmVyKGdldEluc3RydW1lbnRhdGlvbigpLCBhcHBJbmZvLnVpZCk7CisgICAgICAgIFdhdGNoVWlkUnVubmVyIHVpZFdhdGNoZXIgPSBuZXcgV2F0Y2hVaWRSdW5uZXIoZ2V0SW5zdHJ1bWVudGF0aW9uKCksIGFwcEluZm8udWlkLAorICAgICAgICAgICAgICAgIFdBSVRfVElNRSk7CiAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIC8vIEZpcnN0IGtpbGwgdGhlIHByb2Nlc3NlcyB0byBzdGFydCBvdXQgaW4gYSBzdGFibGUgc3RhdGUuCi0gICAgICAgICAgICBjb25uLmJpbmQoV0FJVF9USU1FKTsKLSAgICAgICAgICAgIGNvbm4yLmJpbmQoV0FJVF9USU1FKTsKKyAgICAgICAgICAgIGNvbm4uYmluZCgpOworICAgICAgICAgICAgY29ubjIuYmluZCgpOwogICAgICAgICAgICAgSUJpbmRlciBzZXJ2aWNlMSA9IGNvbm4uZ2V0U2VydmljZUlCaW5kZXIoKTsKICAgICAgICAgICAgIElCaW5kZXIgc2VydmljZTIgPSBjb25uMi5nZXRTZXJ2aWNlSUJpbmRlcigpOwotICAgICAgICAgICAgY29ubi51bmJpbmQoV0FJVF9USU1FKTsKLSAgICAgICAgICAgIGNvbm4yLnVuYmluZChXQUlUX1RJTUUpOworICAgICAgICAgICAgY29ubi51bmJpbmQoKTsKKyAgICAgICAgICAgIGNvbm4yLnVuYmluZCgpOwogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBzZXJ2aWNlMS50cmFuc2FjdChJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sIGRhdGEsIG51bGwsIDApOwogICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKQEAgLTE0NiwzOCArMjQwLDM4IEBACiAKICAgICAgICAgICAgIC8vIFdhaXQgZm9yIHVpZCdzIHByb2Nlc3NlcyB0byBnbyBhd2F5LgogICAgICAgICAgICAgdWlkR29uZUxpc3RlbmVyLndhaXRGb3JWYWx1ZShBY3Rpdml0eU1hbmFnZXIuUnVubmluZ0FwcFByb2Nlc3NJbmZvLklNUE9SVEFOQ0VfR09ORSwKLSAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyLlJ1bm5pbmdBcHBQcm9jZXNzSW5mby5JTVBPUlRBTkNFX0dPTkUsIFdBSVRfVElNRSk7CisgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5TWFuYWdlci5SdW5uaW5nQXBwUHJvY2Vzc0luZm8uSU1QT1JUQU5DRV9HT05FKTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscyhBY3Rpdml0eU1hbmFnZXIuUnVubmluZ0FwcFByb2Nlc3NJbmZvLklNUE9SVEFOQ0VfR09ORSwKICAgICAgICAgICAgICAgICAgICAgYW0uZ2V0UGFja2FnZUltcG9ydGFuY2UoU0lNUExFX1BBQ0tBR0VfTkFNRSkpOwogCiAgICAgICAgICAgICAvLyBBbmQgd2FpdCBmb3IgdGhlIHVpZCByZXBvcnQgdG8gYmUgZ29uZS4KLSAgICAgICAgICAgIHVpZFdhdGNoZXIud2FpdEZvcihXYXRjaFVpZFJ1bm5lci5DTURfR09ORSwgbnVsbCwgV0FJVF9USU1FKTsKKyAgICAgICAgICAgIHVpZFdhdGNoZXIud2FpdEZvcihXYXRjaFVpZFJ1bm5lci5DTURfR09ORSwgbnVsbCk7CiAKICAgICAgICAgICAgIC8vIE5vdyBiaW5kIGFuZCBzZWUgaWYgd2UgZ2V0IHRvbGQgYWJvdXQgdGhlIHVpZCBjb21pbmcgaW4gdG8gdGhlIGZvcmVncm91bmQuCi0gICAgICAgICAgICBjb25uLmJpbmQoV0FJVF9USU1FKTsKKyAgICAgICAgICAgIGNvbm4uYmluZCgpOwogICAgICAgICAgICAgdWlkRm9yZWdyb3VuZExpc3RlbmVyLndhaXRGb3JWYWx1ZShBY3Rpdml0eU1hbmFnZXIuUnVubmluZ0FwcFByb2Nlc3NJbmZvLklNUE9SVEFOQ0VfRk9SRUdST1VORCwKLSAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyLlJ1bm5pbmdBcHBQcm9jZXNzSW5mby5JTVBPUlRBTkNFX1ZJU0lCTEUsIFdBSVRfVElNRSk7CisgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5TWFuYWdlci5SdW5uaW5nQXBwUHJvY2Vzc0luZm8uSU1QT1JUQU5DRV9WSVNJQkxFKTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscyhBY3Rpdml0eU1hbmFnZXIuUnVubmluZ0FwcFByb2Nlc3NJbmZvLklNUE9SVEFOQ0VfRk9SRUdST1VORF9TRVJWSUNFLAogICAgICAgICAgICAgICAgICAgICBhbS5nZXRQYWNrYWdlSW1wb3J0YW5jZShTSU1QTEVfUEFDS0FHRV9OQU1FKSk7CiAKICAgICAgICAgICAgIC8vIEFsc28gbWFrZSBzdXJlIHRoZSB1aWQgc3RhdGUgcmVwb3J0cyBhcmUgYXMgZXhwZWN0ZWQuICBXYWl0IGZvciBhY3RpdmUgYmVjYXVzZQogICAgICAgICAgICAgLy8gdGhlcmUgbWF5IGJlIHNvbWUgaW50ZXJtZWRpYXRlIHN0YXRlcyBhcyB0aGUgcHJvY2VzcyBjb21lcyB1cC4KLSAgICAgICAgICAgIHVpZFdhdGNoZXIud2FpdEZvcihXYXRjaFVpZFJ1bm5lci5DTURfQUNUSVZFLCBudWxsLCBXQUlUX1RJTUUpOwotICAgICAgICAgICAgdWlkV2F0Y2hlci5leHBlY3QoV2F0Y2hVaWRSdW5uZXIuQ01EX1VOQ0FDSEVELCBudWxsLCBXQUlUX1RJTUUpOwotICAgICAgICAgICAgdWlkV2F0Y2hlci5leHBlY3QoV2F0Y2hVaWRSdW5uZXIuQ01EX1BST0NTVEFURSwgIkZHUyIsIFdBSVRfVElNRSk7CisgICAgICAgICAgICB1aWRXYXRjaGVyLndhaXRGb3IoV2F0Y2hVaWRSdW5uZXIuQ01EX0FDVElWRSwgbnVsbCk7CisgICAgICAgICAgICB1aWRXYXRjaGVyLndhaXRGb3IoV2F0Y2hVaWRSdW5uZXIuQ01EX1VOQ0FDSEVELCBudWxsKTsKKyAgICAgICAgICAgIHVpZFdhdGNoZXIuZXhwZWN0KFdhdGNoVWlkUnVubmVyLkNNRF9QUk9DU1RBVEUsIFdhdGNoVWlkUnVubmVyLlNUQVRFX0ZHX1NFUlZJQ0UpOwogCiAgICAgICAgICAgICAvLyBQdWxsIG91dCB0aGUgc2VydmljZSBJQmluZGVyIGZvciBhIGtsdWR5IGhhY2suLi4KICAgICAgICAgICAgIElCaW5kZXIgc2VydmljZSA9IGNvbm4uZ2V0U2VydmljZUlCaW5kZXIoKTsKIAogICAgICAgICAgICAgLy8gTm93IHVuYmluZCBhbmQgc2VlIGlmIHdlIGdldCB0b2xkIGFib3V0IGl0IGdvaW5nIHRvIHRoZSBiYWNrZ3JvdW5kLgotICAgICAgICAgICAgY29ubi51bmJpbmQoV0FJVF9USU1FKTsKKyAgICAgICAgICAgIGNvbm4udW5iaW5kKCk7CiAgICAgICAgICAgICB1aWRGb3JlZ3JvdW5kTGlzdGVuZXIud2FpdEZvclZhbHVlKEFjdGl2aXR5TWFuYWdlci5SdW5uaW5nQXBwUHJvY2Vzc0luZm8uSU1QT1JUQU5DRV9DQUNIRUQsCi0gICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5TWFuYWdlci5SdW5uaW5nQXBwUHJvY2Vzc0luZm8uSU1QT1JUQU5DRV9DQUNIRUQsIFdBSVRfVElNRSk7CisgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5TWFuYWdlci5SdW5uaW5nQXBwUHJvY2Vzc0luZm8uSU1QT1JUQU5DRV9DQUNIRUQpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEFjdGl2aXR5TWFuYWdlci5SdW5uaW5nQXBwUHJvY2Vzc0luZm8uSU1QT1JUQU5DRV9DQUNIRUQsCiAgICAgICAgICAgICAgICAgICAgIGFtLmdldFBhY2thZ2VJbXBvcnRhbmNlKFNJTVBMRV9QQUNLQUdFX05BTUUpKTsKIAotICAgICAgICAgICAgdWlkV2F0Y2hlci53YWl0Rm9yKFdhdGNoVWlkUnVubmVyLkNNRF9DQUNIRUQsIG51bGwsIFdBSVRfVElNRSk7Ci0gICAgICAgICAgICB1aWRXYXRjaGVyLmV4cGVjdChXYXRjaFVpZFJ1bm5lci5DTURfUFJPQ1NUQVRFLCAiQ0VNIiwgV0FJVF9USU1FKTsKKyAgICAgICAgICAgIHVpZFdhdGNoZXIud2FpdEZvcihXYXRjaFVpZFJ1bm5lci5DTURfQ0FDSEVELCBudWxsKTsKKyAgICAgICAgICAgIHVpZFdhdGNoZXIuZXhwZWN0KFdhdGNoVWlkUnVubmVyLkNNRF9QUk9DU1RBVEUsIFdhdGNoVWlkUnVubmVyLlNUQVRFX0NBQ0hFRF9FTVBUWSk7CiAKICAgICAgICAgICAgIC8vIE5vdyBraWxsIHRoZSBwcm9jZXNzIGFuZCBzZWUgaWYgd2UgYXJlIHRvbGQgYWJvdXQgaXQgYmVpbmcgZ29uZS4KICAgICAgICAgICAgIHRyeSB7CkBAIC0xODcsODEgKzI4MSw3OSBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICB1aWRHb25lTGlzdGVuZXIud2FpdEZvclZhbHVlKEFjdGl2aXR5TWFuYWdlci5SdW5uaW5nQXBwUHJvY2Vzc0luZm8uSU1QT1JUQU5DRV9HT05FLAotICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXIuUnVubmluZ0FwcFByb2Nlc3NJbmZvLklNUE9SVEFOQ0VfR09ORSwgV0FJVF9USU1FKTsKKyAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyLlJ1bm5pbmdBcHBQcm9jZXNzSW5mby5JTVBPUlRBTkNFX0dPTkUpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEFjdGl2aXR5TWFuYWdlci5SdW5uaW5nQXBwUHJvY2Vzc0luZm8uSU1QT1JUQU5DRV9HT05FLAogICAgICAgICAgICAgICAgICAgICBhbS5nZXRQYWNrYWdlSW1wb3J0YW5jZShTSU1QTEVfUEFDS0FHRV9OQU1FKSk7CiAKLSAgICAgICAgICAgIHVpZFdhdGNoZXIuZXhwZWN0KFdhdGNoVWlkUnVubmVyLkNNRF9JRExFLCBudWxsLCBXQUlUX1RJTUUpOwotICAgICAgICAgICAgdWlkV2F0Y2hlci5leHBlY3QoV2F0Y2hVaWRSdW5uZXIuQ01EX0dPTkUsIG51bGwsIFdBSVRfVElNRSk7CisgICAgICAgICAgICB1aWRXYXRjaGVyLmV4cGVjdChXYXRjaFVpZFJ1bm5lci5DTURfSURMRSwgbnVsbCk7CisgICAgICAgICAgICB1aWRXYXRjaGVyLmV4cGVjdChXYXRjaFVpZFJ1bm5lci5DTURfR09ORSwgbnVsbCk7CiAKICAgICAgICAgICAgIC8vIE5vdyB3ZSBhcmUgZ29pbmcgdG8gdHJ5IGRpZmZlcmVudCBjb21iaW5hdGlvbnMgb2YgYmluZGluZyB0byB0d28gcHJvY2Vzc2VzIHRvCiAgICAgICAgICAgICAvLyBzZWUgaWYgdGhleSBhcmUgY29ycmVjdGx5IGNvbWJpbmVkIHRvZ2V0aGVyIGZvciB0aGUgYXBwLgogCiAgICAgICAgICAgICAvLyBCcmluZyB1cCBib3RoIHNlcnZpY2VzLgotICAgICAgICAgICAgY29ubi5iaW5kKFdBSVRfVElNRSk7Ci0gICAgICAgICAgICBjb25uMi5iaW5kKFdBSVRfVElNRSk7CisgICAgICAgICAgICBjb25uLmJpbmQoKTsKKyAgICAgICAgICAgIGNvbm4yLmJpbmQoKTsKICAgICAgICAgICAgIHVpZEZvcmVncm91bmRMaXN0ZW5lci53YWl0Rm9yVmFsdWUoQWN0aXZpdHlNYW5hZ2VyLlJ1bm5pbmdBcHBQcm9jZXNzSW5mby5JTVBPUlRBTkNFX0ZPUkVHUk9VTkQsCi0gICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5TWFuYWdlci5SdW5uaW5nQXBwUHJvY2Vzc0luZm8uSU1QT1JUQU5DRV9WSVNJQkxFLCBXQUlUX1RJTUUpOworICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXIuUnVubmluZ0FwcFByb2Nlc3NJbmZvLklNUE9SVEFOQ0VfVklTSUJMRSk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoQWN0aXZpdHlNYW5hZ2VyLlJ1bm5pbmdBcHBQcm9jZXNzSW5mby5JTVBPUlRBTkNFX0ZPUkVHUk9VTkRfU0VSVklDRSwKICAgICAgICAgICAgICAgICAgICAgYW0uZ2V0UGFja2FnZUltcG9ydGFuY2UoU0lNUExFX1BBQ0tBR0VfTkFNRSkpOwogCiAgICAgICAgICAgICAvLyBBbHNvIG1ha2Ugc3VyZSB0aGUgdWlkIHN0YXRlIHJlcG9ydHMgYXJlIGFzIGV4cGVjdGVkLgotICAgICAgICAgICAgdWlkV2F0Y2hlci53YWl0Rm9yKFdhdGNoVWlkUnVubmVyLkNNRF9BQ1RJVkUsIG51bGwsIFdBSVRfVElNRSk7Ci0gICAgICAgICAgICB1aWRXYXRjaGVyLmV4cGVjdChXYXRjaFVpZFJ1bm5lci5DTURfVU5DQUNIRUQsIG51bGwsIFdBSVRfVElNRSk7Ci0gICAgICAgICAgICB1aWRXYXRjaGVyLmV4cGVjdChXYXRjaFVpZFJ1bm5lci5DTURfUFJPQ1NUQVRFLCAiRkdTIiwgV0FJVF9USU1FKTsKKyAgICAgICAgICAgIHVpZFdhdGNoZXIud2FpdEZvcihXYXRjaFVpZFJ1bm5lci5DTURfQUNUSVZFLCBudWxsKTsKKyAgICAgICAgICAgIHVpZFdhdGNoZXIud2FpdEZvcihXYXRjaFVpZFJ1bm5lci5DTURfVU5DQUNIRUQsIG51bGwpOworICAgICAgICAgICAgdWlkV2F0Y2hlci5leHBlY3QoV2F0Y2hVaWRSdW5uZXIuQ01EX1BST0NTVEFURSwgV2F0Y2hVaWRSdW5uZXIuU1RBVEVfRkdfU0VSVklDRSk7CiAKICAgICAgICAgICAgIC8vIEJyaW5nIGRvd24gb25lIHNlcnZpY2UsIGFwcCBzdGF0ZSBzaG91bGQgcmVtYWluIGZvcmVncm91bmQuCi0gICAgICAgICAgICBjb25uMi51bmJpbmQoV0FJVF9USU1FKTsKKyAgICAgICAgICAgIGNvbm4yLnVuYmluZCgpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEFjdGl2aXR5TWFuYWdlci5SdW5uaW5nQXBwUHJvY2Vzc0luZm8uSU1QT1JUQU5DRV9GT1JFR1JPVU5EX1NFUlZJQ0UsCiAgICAgICAgICAgICAgICAgICAgIGFtLmdldFBhY2thZ2VJbXBvcnRhbmNlKFNJTVBMRV9QQUNLQUdFX05BTUUpKTsKIAogICAgICAgICAgICAgLy8gQnJpbmcgZG93biBvdGhlciBzZXJ2aWNlLCBhcHAgc3RhdGUgc2hvdWxkIG5vdyBiZSBjYWNoZWQuICAoSWYgdGhlIHByb2Nlc3NlcyBib3RoCiAgICAgICAgICAgICAvLyBhY3R1YWxseSBnZXQga2lsbGVkIGltbWVkaWF0ZWx5LCB0aGlzIGlzIGFsc28gbm90IGEgY29ycmVjdGx5IGJlaGF2aW5nIHN5c3RlbS4pCi0gICAgICAgICAgICBjb25uLnVuYmluZChXQUlUX1RJTUUpOworICAgICAgICAgICAgY29ubi51bmJpbmQoKTsKICAgICAgICAgICAgIHVpZEdvbmVMaXN0ZW5lci53YWl0Rm9yVmFsdWUoQWN0aXZpdHlNYW5hZ2VyLlJ1bm5pbmdBcHBQcm9jZXNzSW5mby5JTVBPUlRBTkNFX0NBQ0hFRCwKLSAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyLlJ1bm5pbmdBcHBQcm9jZXNzSW5mby5JTVBPUlRBTkNFX0NBQ0hFRCwgV0FJVF9USU1FKTsKKyAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyLlJ1bm5pbmdBcHBQcm9jZXNzSW5mby5JTVBPUlRBTkNFX0NBQ0hFRCk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoQWN0aXZpdHlNYW5hZ2VyLlJ1bm5pbmdBcHBQcm9jZXNzSW5mby5JTVBPUlRBTkNFX0NBQ0hFRCwKICAgICAgICAgICAgICAgICAgICAgYW0uZ2V0UGFja2FnZUltcG9ydGFuY2UoU0lNUExFX1BBQ0tBR0VfTkFNRSkpOwogCi0gICAgICAgICAgICB1aWRXYXRjaGVyLndhaXRGb3IoV2F0Y2hVaWRSdW5uZXIuQ01EX0NBQ0hFRCwgbnVsbCwgV0FJVF9USU1FKTsKLSAgICAgICAgICAgIHVpZFdhdGNoZXIuZXhwZWN0KFdhdGNoVWlkUnVubmVyLkNNRF9QUk9DU1RBVEUsICJDRU0iLCBXQUlUX1RJTUUpOworICAgICAgICAgICAgdWlkV2F0Y2hlci53YWl0Rm9yKFdhdGNoVWlkUnVubmVyLkNNRF9DQUNIRUQsIG51bGwpOworICAgICAgICAgICAgdWlkV2F0Y2hlci5leHBlY3QoV2F0Y2hVaWRSdW5uZXIuQ01EX1BST0NTVEFURSwgV2F0Y2hVaWRSdW5uZXIuU1RBVEVfQ0FDSEVEX0VNUFRZKTsKIAogICAgICAgICAgICAgLy8gQnJpbmcgdXAgb25lIHNlcnZpY2UsIHRoaXMgc2hvdWxkIGJlIHN1ZmZpY2llbnQgdG8gYmVjb21lIGZvcmVncm91bmQuCi0gICAgICAgICAgICBjb25uMi5iaW5kKFdBSVRfVElNRSk7CisgICAgICAgICAgICBjb25uMi5iaW5kKCk7CiAgICAgICAgICAgICB1aWRGb3JlZ3JvdW5kTGlzdGVuZXIud2FpdEZvclZhbHVlKEFjdGl2aXR5TWFuYWdlci5SdW5uaW5nQXBwUHJvY2Vzc0luZm8uSU1QT1JUQU5DRV9GT1JFR1JPVU5ELAotICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXIuUnVubmluZ0FwcFByb2Nlc3NJbmZvLklNUE9SVEFOQ0VfVklTSUJMRSwgV0FJVF9USU1FKTsKKyAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyLlJ1bm5pbmdBcHBQcm9jZXNzSW5mby5JTVBPUlRBTkNFX1ZJU0lCTEUpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEFjdGl2aXR5TWFuYWdlci5SdW5uaW5nQXBwUHJvY2Vzc0luZm8uSU1QT1JUQU5DRV9GT1JFR1JPVU5EX1NFUlZJQ0UsCiAgICAgICAgICAgICAgICAgICAgIGFtLmdldFBhY2thZ2VJbXBvcnRhbmNlKFNJTVBMRV9QQUNLQUdFX05BTUUpKTsKIAotICAgICAgICAgICAgdWlkV2F0Y2hlci5leHBlY3QoV2F0Y2hVaWRSdW5uZXIuQ01EX1VOQ0FDSEVELCBudWxsLCBXQUlUX1RJTUUpOwotICAgICAgICAgICAgdWlkV2F0Y2hlci5leHBlY3QoV2F0Y2hVaWRSdW5uZXIuQ01EX1BST0NTVEFURSwgIkZHUyIsIFdBSVRfVElNRSk7CisgICAgICAgICAgICB1aWRXYXRjaGVyLndhaXRGb3IoV2F0Y2hVaWRSdW5uZXIuQ01EX1VOQ0FDSEVELCBudWxsKTsKKyAgICAgICAgICAgIHVpZFdhdGNoZXIuZXhwZWN0KFdhdGNoVWlkUnVubmVyLkNNRF9QUk9DU1RBVEUsIFdhdGNoVWlkUnVubmVyLlNUQVRFX0ZHX1NFUlZJQ0UpOwogCiAgICAgICAgICAgICAvLyBCcmluZyB1cCBvdGhlciBzZXJ2aWNlLCBzaG91bGQgcmVtYWluIGZvcmVncm91bmQuCi0gICAgICAgICAgICBjb25uLmJpbmQoV0FJVF9USU1FKTsKKyAgICAgICAgICAgIGNvbm4uYmluZCgpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEFjdGl2aXR5TWFuYWdlci5SdW5uaW5nQXBwUHJvY2Vzc0luZm8uSU1QT1JUQU5DRV9GT1JFR1JPVU5EX1NFUlZJQ0UsCiAgICAgICAgICAgICAgICAgICAgIGFtLmdldFBhY2thZ2VJbXBvcnRhbmNlKFNJTVBMRV9QQUNLQUdFX05BTUUpKTsKIAogICAgICAgICAgICAgLy8gQnJpbmcgZG93biBvbmUgc2VydmljZSwgc2hvdWxkIHJlbWFpbiBmb3JlZ3JvdW5kLgotICAgICAgICAgICAgY29ubi51bmJpbmQoV0FJVF9USU1FKTsKKyAgICAgICAgICAgIGNvbm4udW5iaW5kKCk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoQWN0aXZpdHlNYW5hZ2VyLlJ1bm5pbmdBcHBQcm9jZXNzSW5mby5JTVBPUlRBTkNFX0ZPUkVHUk9VTkRfU0VSVklDRSwKICAgICAgICAgICAgICAgICAgICAgYW0uZ2V0UGFja2FnZUltcG9ydGFuY2UoU0lNUExFX1BBQ0tBR0VfTkFNRSkpOwogCiAgICAgICAgICAgICAvLyBBbmQgYnJpbmdpbmcgZG93biBvdGhlciBzZXJ2aWNlIHNob3VsZCBwdXQgdXMgYmFjayB0byBjYWNoZWQuCi0gICAgICAgICAgICBjb25uMi51bmJpbmQoV0FJVF9USU1FKTsKKyAgICAgICAgICAgIGNvbm4yLnVuYmluZCgpOwogICAgICAgICAgICAgdWlkR29uZUxpc3RlbmVyLndhaXRGb3JWYWx1ZShBY3Rpdml0eU1hbmFnZXIuUnVubmluZ0FwcFByb2Nlc3NJbmZvLklNUE9SVEFOQ0VfQ0FDSEVELAotICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXIuUnVubmluZ0FwcFByb2Nlc3NJbmZvLklNUE9SVEFOQ0VfQ0FDSEVELCBXQUlUX1RJTUUpOworICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXIuUnVubmluZ0FwcFByb2Nlc3NJbmZvLklNUE9SVEFOQ0VfQ0FDSEVEKTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscyhBY3Rpdml0eU1hbmFnZXIuUnVubmluZ0FwcFByb2Nlc3NJbmZvLklNUE9SVEFOQ0VfQ0FDSEVELAogICAgICAgICAgICAgICAgICAgICBhbS5nZXRQYWNrYWdlSW1wb3J0YW5jZShTSU1QTEVfUEFDS0FHRV9OQU1FKSk7CiAKLSAgICAgICAgICAgIHVpZFdhdGNoZXIud2FpdEZvcihXYXRjaFVpZFJ1bm5lci5DTURfQ0FDSEVELCBudWxsLCBXQUlUX1RJTUUpOwotICAgICAgICAgICAgdWlkV2F0Y2hlci5leHBlY3QoV2F0Y2hVaWRSdW5uZXIuQ01EX1BST0NTVEFURSwgIkNFTSIsIFdBSVRfVElNRSk7CisgICAgICAgICAgICB1aWRXYXRjaGVyLndhaXRGb3IoV2F0Y2hVaWRSdW5uZXIuQ01EX0NBQ0hFRCwgbnVsbCk7CisgICAgICAgICAgICB1aWRXYXRjaGVyLmV4cGVjdChXYXRjaFVpZFJ1bm5lci5DTURfUFJPQ1NUQVRFLCBXYXRjaFVpZFJ1bm5lci5TVEFURV9DQUNIRURfRU1QVFkpOwogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgZGF0YS5yZWN5Y2xlKCk7Ci0KICAgICAgICAgICAgIHVpZFdhdGNoZXIuZmluaXNoKCk7Ci0KLSAgICAgICAgICAgIGFtLnJlbW92ZU9uVWlkSW1wb3J0YW5jZUxpc3RlbmVyKHVpZEZvcmVncm91bmRMaXN0ZW5lcik7Ci0gICAgICAgICAgICBhbS5yZW1vdmVPblVpZEltcG9ydGFuY2VMaXN0ZW5lcih1aWRHb25lTGlzdGVuZXIpOworICAgICAgICAgICAgdWlkRm9yZWdyb3VuZExpc3RlbmVyLnVucmVnaXN0ZXIoKTsKKyAgICAgICAgICAgIHVpZEdvbmVMaXN0ZW5lci51bnJlZ2lzdGVyKCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI3NCwxMyArMzY2LDEzIEBACiAgICAgICAgIEludGVudCBzZXJ2aWNlSW50ZW50ID0gbmV3IEludGVudCgpOwogICAgICAgICBzZXJ2aWNlSW50ZW50LnNldENsYXNzTmFtZShTSU1QTEVfUEFDS0FHRV9OQU1FLAogICAgICAgICAgICAgICAgIFNJTVBMRV9QQUNLQUdFX05BTUUgKyBTSU1QTEVfU0VSVklDRSk7Ci0gICAgICAgIFNlcnZpY2VDb25uZWN0aW9uSGFuZGxlciBjb25uID0gbmV3IFNlcnZpY2VDb25uZWN0aW9uSGFuZGxlcihtQ29udGV4dCwgc2VydmljZUludGVudCk7CisgICAgICAgIFNlcnZpY2VDb25uZWN0aW9uSGFuZGxlciBjb25uID0gbmV3IFNlcnZpY2VDb25uZWN0aW9uSGFuZGxlcihtQ29udGV4dCwgc2VydmljZUludGVudCwKKyAgICAgICAgICAgICAgICBXQUlUX1RJTUUpOwogCiAgICAgICAgIEFjdGl2aXR5TWFuYWdlciBhbSA9IG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQWN0aXZpdHlNYW5hZ2VyLmNsYXNzKTsKIAotICAgICAgICBTdHJpbmcgY21kID0gInBtIGdyYW50ICIgKyBTVFVCX1BBQ0tBR0VfTkFNRSArICIgIgotICAgICAgICAgICAgICAgICsgTWFuaWZlc3QucGVybWlzc2lvbi5QQUNLQUdFX1VTQUdFX1NUQVRTOwotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gU3lzdGVtVXRpbC5ydW5TaGVsbENvbW1hbmQoZ2V0SW5zdHJ1bWVudGF0aW9uKCksIGNtZCk7CisgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLmdldFVpQXV0b21hdGlvbigpLmdyYW50UnVudGltZVBlcm1pc3Npb24oCisgICAgICAgICAgICAgICAgU1RVQl9QQUNLQUdFX05BTUUsIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5QQUNLQUdFX1VTQUdFX1NUQVRTKTsKICAgICAgICAgLyoKICAgICAgICAgTG9nLmQoIlhYWFgiLCAiSW52b2tlOiAiICsgY21kKTsKICAgICAgICAgTG9nLmQoIlhYWFgiLCAiUmVzdWx0OiAiICsgcmVzdWx0KTsKQEAgLTI5MSwyMCArMzgzLDIxIEBACiAgICAgICAgIEFwcGxpY2F0aW9uSW5mbyBhcHBJbmZvID0gbUNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKS5nZXRBcHBsaWNhdGlvbkluZm8oCiAgICAgICAgICAgICAgICAgU0lNUExFX1BBQ0tBR0VfTkFNRSwgMCk7CiAKLSAgICAgICAgVWlkSW1wb3J0YW5jZUxpc3RlbmVyIHVpZEZvcmVncm91bmRMaXN0ZW5lciA9IG5ldyBVaWRJbXBvcnRhbmNlTGlzdGVuZXIoYXBwSW5mby51aWQpOwotICAgICAgICBhbS5hZGRPblVpZEltcG9ydGFuY2VMaXN0ZW5lcih1aWRGb3JlZ3JvdW5kTGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyLlJ1bm5pbmdBcHBQcm9jZXNzSW5mby5JTVBPUlRBTkNFX1NFUlZJQ0UpOwotICAgICAgICBVaWRJbXBvcnRhbmNlTGlzdGVuZXIgdWlkR29uZUxpc3RlbmVyID0gbmV3IFVpZEltcG9ydGFuY2VMaXN0ZW5lcihhcHBJbmZvLnVpZCk7Ci0gICAgICAgIGFtLmFkZE9uVWlkSW1wb3J0YW5jZUxpc3RlbmVyKHVpZEdvbmVMaXN0ZW5lciwKLSAgICAgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXIuUnVubmluZ0FwcFByb2Nlc3NJbmZvLklNUE9SVEFOQ0VfRU1QVFkpOworICAgICAgICBVaWRJbXBvcnRhbmNlTGlzdGVuZXIgdWlkRm9yZWdyb3VuZExpc3RlbmVyID0gbmV3IFVpZEltcG9ydGFuY2VMaXN0ZW5lcihtQ29udGV4dCwKKyAgICAgICAgICAgICAgICBhcHBJbmZvLnVpZCwgQWN0aXZpdHlNYW5hZ2VyLlJ1bm5pbmdBcHBQcm9jZXNzSW5mby5JTVBPUlRBTkNFX1NFUlZJQ0UsIFdBSVRfVElNRSk7CisgICAgICAgIHVpZEZvcmVncm91bmRMaXN0ZW5lci5yZWdpc3RlcigpOworICAgICAgICBVaWRJbXBvcnRhbmNlTGlzdGVuZXIgdWlkR29uZUxpc3RlbmVyID0gbmV3IFVpZEltcG9ydGFuY2VMaXN0ZW5lcihtQ29udGV4dCwKKyAgICAgICAgICAgICAgICBhcHBJbmZvLnVpZCwgQWN0aXZpdHlNYW5hZ2VyLlJ1bm5pbmdBcHBQcm9jZXNzSW5mby5JTVBPUlRBTkNFX0VNUFRZLCBXQUlUX1RJTUUpOworICAgICAgICB1aWRHb25lTGlzdGVuZXIucmVnaXN0ZXIoKTsKIAotICAgICAgICBXYXRjaFVpZFJ1bm5lciB1aWRXYXRjaGVyID0gbmV3IFdhdGNoVWlkUnVubmVyKGdldEluc3RydW1lbnRhdGlvbigpLCBhcHBJbmZvLnVpZCk7CisgICAgICAgIFdhdGNoVWlkUnVubmVyIHVpZFdhdGNoZXIgPSBuZXcgV2F0Y2hVaWRSdW5uZXIoZ2V0SW5zdHJ1bWVudGF0aW9uKCksIGFwcEluZm8udWlkLAorICAgICAgICAgICAgICAgIFdBSVRfVElNRSk7CiAKICAgICAgICAgLy8gRmlyc3Qga2lsbCB0aGUgcHJvY2VzcyB0byBzdGFydCBvdXQgaW4gYSBzdGFibGUgc3RhdGUuCiAgICAgICAgIG1Db250ZXh0LnN0b3BTZXJ2aWNlKHNlcnZpY2VJbnRlbnQpOwotICAgICAgICBjb25uLmJpbmQoV0FJVF9USU1FKTsKKyAgICAgICAgY29ubi5iaW5kKCk7CiAgICAgICAgIElCaW5kZXIgc2VydmljZSA9IGNvbm4uZ2V0U2VydmljZUlCaW5kZXIoKTsKLSAgICAgICAgY29ubi51bmJpbmQoV0FJVF9USU1FKTsKKyAgICAgICAgY29ubi51bmJpbmQoKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHNlcnZpY2UudHJhbnNhY3QoSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OLCBkYXRhLCBudWxsLCAwKTsKICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKQEAgLTMxMywxOSArNDA2LDE5IEBACiAKICAgICAgICAgLy8gV2FpdCBmb3IgdWlkJ3MgcHJvY2VzcyB0byBnbyBhd2F5LgogICAgICAgICB1aWRHb25lTGlzdGVuZXIud2FpdEZvclZhbHVlKEFjdGl2aXR5TWFuYWdlci5SdW5uaW5nQXBwUHJvY2Vzc0luZm8uSU1QT1JUQU5DRV9HT05FLAotICAgICAgICAgICAgICAgIEFjdGl2aXR5TWFuYWdlci5SdW5uaW5nQXBwUHJvY2Vzc0luZm8uSU1QT1JUQU5DRV9HT05FLCBXQUlUX1RJTUUpOworICAgICAgICAgICAgICAgIEFjdGl2aXR5TWFuYWdlci5SdW5uaW5nQXBwUHJvY2Vzc0luZm8uSU1QT1JUQU5DRV9HT05FKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKEFjdGl2aXR5TWFuYWdlci5SdW5uaW5nQXBwUHJvY2Vzc0luZm8uSU1QT1JUQU5DRV9HT05FLAogICAgICAgICAgICAgICAgIGFtLmdldFBhY2thZ2VJbXBvcnRhbmNlKFNJTVBMRV9QQUNLQUdFX05BTUUpKTsKIAogICAgICAgICAvLyBBbmQgd2FpdCBmb3IgdGhlIHVpZCByZXBvcnQgdG8gYmUgZ29uZS4KLSAgICAgICAgdWlkV2F0Y2hlci53YWl0Rm9yKFdhdGNoVWlkUnVubmVyLkNNRF9HT05FLCBudWxsLCBXQUlUX1RJTUUpOworICAgICAgICB1aWRXYXRjaGVyLndhaXRGb3IoV2F0Y2hVaWRSdW5uZXIuQ01EX0dPTkUsIG51bGwpOwogCi0gICAgICAgIGNtZCA9ICJhcHBvcHMgc2V0ICIgKyBTSU1QTEVfUEFDS0FHRV9OQU1FICsgIiBSVU5fSU5fQkFDS0dST1VORCBkZW55IjsKLSAgICAgICAgcmVzdWx0ID0gU3lzdGVtVXRpbC5ydW5TaGVsbENvbW1hbmQoZ2V0SW5zdHJ1bWVudGF0aW9uKCksIGNtZCk7CisgICAgICAgIFN0cmluZyBjbWQgPSAiYXBwb3BzIHNldCAiICsgU0lNUExFX1BBQ0tBR0VfTkFNRSArICIgUlVOX0lOX0JBQ0tHUk9VTkQgZGVueSI7CisgICAgICAgIFN0cmluZyByZXN1bHQgPSBTeXN0ZW1VdGlsLnJ1blNoZWxsQ29tbWFuZChnZXRJbnN0cnVtZW50YXRpb24oKSwgY21kKTsKIAogICAgICAgICAvLyBUaGlzIGlzIGEgc2lkZS1lZmZlY3Qgb2YgdGhlIGFwcCBvcCBjb21tYW5kLgotICAgICAgICB1aWRXYXRjaGVyLmV4cGVjdChXYXRjaFVpZFJ1bm5lci5DTURfSURMRSwgbnVsbCwgV0FJVF9USU1FKTsKLSAgICAgICAgdWlkV2F0Y2hlci5leHBlY3QoV2F0Y2hVaWRSdW5uZXIuQ01EX1BST0NTVEFURSwgIk5PTkUiLCBXQUlUX1RJTUUpOworICAgICAgICB1aWRXYXRjaGVyLmV4cGVjdChXYXRjaFVpZFJ1bm5lci5DTURfSURMRSwgbnVsbCk7CisgICAgICAgIHVpZFdhdGNoZXIuZXhwZWN0KFdhdGNoVWlkUnVubmVyLkNNRF9QUk9DU1RBVEUsICJOT05FIik7CiAKICAgICAgICAgLy8gV2UgZG9uJ3Qgd2FudCB0byB3YWl0IGZvciB0aGUgdWlkIHRvIGFjdHVhbGx5IGdvIGlkbGUsIHdlIGNhbiBmb3JjZSBpdCBub3cuCiAgICAgICAgIGNtZCA9ICJhbSBtYWtlLXVpZC1pZGxlICIgKyBTSU1QTEVfUEFDS0FHRV9OQU1FOwpAQCAtMzUxLDM3ICs0NDQsMzggQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gUHV0IGFwcCBvbiB0ZW1wb3Jhcnkgd2hpdGVsaXN0IHRvIHNlZSBpZiB0aGlzIGFsbG93cyB0aGUgc2VydmljZSBzdGFydC4KLSAgICAgICAgICAgIGNtZCA9ICJjbWQgZGV2aWNlaWRsZSB0ZW1wd2hpdGVsaXN0IC1kIDIwMDAgIiArIFNJTVBMRV9QQUNLQUdFX05BTUU7CisgICAgICAgICAgICBjbWQgPSBTdHJpbmcuZm9ybWF0KCJjbWQgZGV2aWNlaWRsZSB0ZW1wd2hpdGVsaXN0IC1kICVkICVzIiwKKyAgICAgICAgICAgICAgICAgICAgVEVNUF9XSElURUxJU1RfRFVSQVRJT05fTVMsIFNJTVBMRV9QQUNLQUdFX05BTUUpOwogICAgICAgICAgICAgcmVzdWx0ID0gU3lzdGVtVXRpbC5ydW5TaGVsbENvbW1hbmQoZ2V0SW5zdHJ1bWVudGF0aW9uKCksIGNtZCk7CiAKICAgICAgICAgICAgIC8vIFRyeSBzdGFydGluZyB0aGUgc2VydmljZSBub3cgdGhhdCB0aGUgYXBwIGlzIHdoaXRlbGlzdGVkLi4uICBzaG91bGQgd29yayEKICAgICAgICAgICAgIG1Db250ZXh0LnN0YXJ0U2VydmljZShzZXJ2aWNlSW50ZW50KTsKLSAgICAgICAgICAgIGNvbm4ud2FpdEZvckNvbm5lY3QoV0FJVF9USU1FKTsKKyAgICAgICAgICAgIGNvbm4ud2FpdEZvckNvbm5lY3QoKTsKIAogICAgICAgICAgICAgLy8gQWxzbyBtYWtlIHN1cmUgdGhlIHVpZCBzdGF0ZSByZXBvcnRzIGFyZSBhcyBleHBlY3RlZC4KLSAgICAgICAgICAgIHVpZFdhdGNoZXIud2FpdEZvcihXYXRjaFVpZFJ1bm5lci5DTURfQUNUSVZFLCBudWxsLCBXQUlUX1RJTUUpOwotICAgICAgICAgICAgdWlkV2F0Y2hlci5leHBlY3QoV2F0Y2hVaWRSdW5uZXIuQ01EX1VOQ0FDSEVELCBudWxsLCBXQUlUX1RJTUUpOwotICAgICAgICAgICAgdWlkV2F0Y2hlci5leHBlY3QoV2F0Y2hVaWRSdW5uZXIuQ01EX1BST0NTVEFURSwgIlNWQyIsIFdBSVRfVElNRSk7CisgICAgICAgICAgICB1aWRXYXRjaGVyLndhaXRGb3IoV2F0Y2hVaWRSdW5uZXIuQ01EX0FDVElWRSwgbnVsbCk7CisgICAgICAgICAgICB1aWRXYXRjaGVyLndhaXRGb3IoV2F0Y2hVaWRSdW5uZXIuQ01EX1VOQ0FDSEVELCBudWxsKTsKKyAgICAgICAgICAgIHVpZFdhdGNoZXIuZXhwZWN0KFdhdGNoVWlkUnVubmVyLkNNRF9QUk9DU1RBVEUsIFdhdGNoVWlkUnVubmVyLlNUQVRFX1NFUlZJQ0UpOwogCiAgICAgICAgICAgICAvLyBHb29kLCBub3cgc3RvcCB0aGUgc2VydmljZSBhbmQgZ2l2ZSBlbm91Z2ggdGltZSB0byBnZXQgb2ZmIHRoZSB0ZW1wIHdoaXRlbGlzdC4KICAgICAgICAgICAgIG1Db250ZXh0LnN0b3BTZXJ2aWNlKHNlcnZpY2VJbnRlbnQpOwotICAgICAgICAgICAgY29ubi53YWl0Rm9yRGlzY29ubmVjdChXQUlUX1RJTUUpOworICAgICAgICAgICAgY29ubi53YWl0Rm9yRGlzY29ubmVjdCgpOwogCi0gICAgICAgICAgICB1aWRXYXRjaGVyLmV4cGVjdChXYXRjaFVpZFJ1bm5lci5DTURfQ0FDSEVELCBudWxsLCBXQUlUX1RJTUUpOwotICAgICAgICAgICAgdWlkV2F0Y2hlci5leHBlY3QoV2F0Y2hVaWRSdW5uZXIuQ01EX1BST0NTVEFURSwgIkNFTSIsIFdBSVRfVElNRSk7CisgICAgICAgICAgICB1aWRXYXRjaGVyLmV4cGVjdChXYXRjaFVpZFJ1bm5lci5DTURfQ0FDSEVELCBudWxsKTsKKyAgICAgICAgICAgIHVpZFdhdGNoZXIuZXhwZWN0KFdhdGNoVWlkUnVubmVyLkNNRF9QUk9DU1RBVEUsIFdhdGNoVWlkUnVubmVyLlNUQVRFX0NBQ0hFRF9FTVBUWSk7CiAKLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgzMDAwKTsKKyAgICAgICAgICAgIGV4ZWN1dGVTaGVsbENtZCgiY21kIGRldmljZWlkbGUgdGVtcHdoaXRlbGlzdCAtciAiICsgU0lNUExFX1BBQ0tBR0VfTkFNRSk7CiAKICAgICAgICAgICAgIC8vIEdvaW5nIG9mZiB0aGUgdGVtcCB3aGl0ZWxpc3QgY2F1c2VzIGEgc3B1cmlvdXMgcHJvYyBzdGF0ZSByZXBvcnQuLi4gIHRoYXQncwogICAgICAgICAgICAgLy8gbm90IGlkZWFsLCBidXQgb2theS4KLSAgICAgICAgICAgIHVpZFdhdGNoZXIuZXhwZWN0KFdhdGNoVWlkUnVubmVyLkNNRF9QUk9DU1RBVEUsICJDRU0iLCBXQUlUX1RJTUUpOworICAgICAgICAgICAgdWlkV2F0Y2hlci5leHBlY3QoV2F0Y2hVaWRSdW5uZXIuQ01EX1BST0NTVEFURSwgV2F0Y2hVaWRSdW5uZXIuU1RBVEVfQ0FDSEVEX0VNUFRZKTsKIAogICAgICAgICAgICAgLy8gV2UgZG9uJ3Qgd2FudCB0byB3YWl0IGZvciB0aGUgdWlkIHRvIGFjdHVhbGx5IGdvIGlkbGUsIHdlIGNhbiBmb3JjZSBpdCBub3cuCiAgICAgICAgICAgICBjbWQgPSAiYW0gbWFrZS11aWQtaWRsZSAiICsgU0lNUExFX1BBQ0tBR0VfTkFNRTsKICAgICAgICAgICAgIHJlc3VsdCA9IFN5c3RlbVV0aWwucnVuU2hlbGxDb21tYW5kKGdldEluc3RydW1lbnRhdGlvbigpLCBjbWQpOwogCi0gICAgICAgICAgICB1aWRXYXRjaGVyLmV4cGVjdChXYXRjaFVpZFJ1bm5lci5DTURfSURMRSwgbnVsbCwgV0FJVF9USU1FKTsKLSAgICAgICAgICAgIHVpZFdhdGNoZXIuZXhwZWN0KFdhdGNoVWlkUnVubmVyLkNNRF9QUk9DU1RBVEUsICJDRU0iLCBXQUlUX1RJTUUpOworICAgICAgICAgICAgdWlkV2F0Y2hlci5leHBlY3QoV2F0Y2hVaWRSdW5uZXIuQ01EX0lETEUsIG51bGwpOworICAgICAgICAgICAgdWlkV2F0Y2hlci5leHBlY3QoV2F0Y2hVaWRSdW5uZXIuQ01EX1BST0NTVEFURSwgV2F0Y2hVaWRSdW5uZXIuU1RBVEVfQ0FDSEVEX0VNUFRZKTsKIAogICAgICAgICAgICAgLy8gTm93IHRoYXQgd2Ugc2hvdWxkIGJlIG9mZiB0aGUgdGVtcCB3aGl0ZWxpc3QsIG1ha2Ugc3VyZSB3ZSBhZ2FpbiBjYW4ndCBzdGFydC4KICAgICAgICAgICAgIGZhaWxlZCA9IGZhbHNlOwpAQCAtNDAwLDE3ICs0OTQsMTcgQEAKIAogICAgICAgICAgICAgLy8gVHJ5IHN0YXJ0aW5nIHRoZSBzZXJ2aWNlIG5vdyB0aGF0IHRoZSBhcHAgaXMgd2hpdGVsaXN0ZWQuLi4gIHNob3VsZCB3b3JrIQogICAgICAgICAgICAgbUNvbnRleHQuc3RhcnRTZXJ2aWNlKHNlcnZpY2VJbnRlbnQpOwotICAgICAgICAgICAgY29ubi53YWl0Rm9yQ29ubmVjdChXQUlUX1RJTUUpOworICAgICAgICAgICAgY29ubi53YWl0Rm9yQ29ubmVjdCgpOwogCi0gICAgICAgICAgICB1aWRXYXRjaGVyLmV4cGVjdChXYXRjaFVpZFJ1bm5lci5DTURfVU5DQUNIRUQsIG51bGwsIFdBSVRfVElNRSk7Ci0gICAgICAgICAgICB1aWRXYXRjaGVyLmV4cGVjdChXYXRjaFVpZFJ1bm5lci5DTURfUFJPQ1NUQVRFLCAiU1ZDIiwgV0FJVF9USU1FKTsKKyAgICAgICAgICAgIHVpZFdhdGNoZXIud2FpdEZvcihXYXRjaFVpZFJ1bm5lci5DTURfVU5DQUNIRUQsIG51bGwpOworICAgICAgICAgICAgdWlkV2F0Y2hlci5leHBlY3QoV2F0Y2hVaWRSdW5uZXIuQ01EX1BST0NTVEFURSwgV2F0Y2hVaWRSdW5uZXIuU1RBVEVfU0VSVklDRSk7CiAKICAgICAgICAgICAgIC8vIE9rYXksIGJyaW5nIGRvd24gdGhlIHNlcnZpY2UuCiAgICAgICAgICAgICBtQ29udGV4dC5zdG9wU2VydmljZShzZXJ2aWNlSW50ZW50KTsKLSAgICAgICAgICAgIGNvbm4ud2FpdEZvckRpc2Nvbm5lY3QoV0FJVF9USU1FKTsKKyAgICAgICAgICAgIGNvbm4ud2FpdEZvckRpc2Nvbm5lY3QoKTsKIAotICAgICAgICAgICAgdWlkV2F0Y2hlci5leHBlY3QoV2F0Y2hVaWRSdW5uZXIuQ01EX0NBQ0hFRCwgbnVsbCwgV0FJVF9USU1FKTsKLSAgICAgICAgICAgIHVpZFdhdGNoZXIuZXhwZWN0KFdhdGNoVWlkUnVubmVyLkNNRF9QUk9DU1RBVEUsICJDRU0iLCBXQUlUX1RJTUUpOworICAgICAgICAgICAgdWlkV2F0Y2hlci5leHBlY3QoV2F0Y2hVaWRSdW5uZXIuQ01EX0NBQ0hFRCwgbnVsbCk7CisgICAgICAgICAgICB1aWRXYXRjaGVyLmV4cGVjdChXYXRjaFVpZFJ1bm5lci5DTURfUFJPQ1NUQVRFLCBXYXRjaFVpZFJ1bm5lci5TVEFURV9DQUNIRURfRU1QVFkpOwogCiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBtQ29udGV4dC5zdG9wU2VydmljZShzZXJ2aWNlSW50ZW50KTsKQEAgLTQyMyw4ICs1MTcsOCBAQAogICAgICAgICAgICAgY21kID0gImNtZCBkZXZpY2VpZGxlIHdoaXRlbGlzdCAtIiArIFNJTVBMRV9QQUNLQUdFX05BTUU7CiAgICAgICAgICAgICByZXN1bHQgPSBTeXN0ZW1VdGlsLnJ1blNoZWxsQ29tbWFuZChnZXRJbnN0cnVtZW50YXRpb24oKSwgY21kKTsKIAotICAgICAgICAgICAgYW0ucmVtb3ZlT25VaWRJbXBvcnRhbmNlTGlzdGVuZXIodWlkR29uZUxpc3RlbmVyKTsKLSAgICAgICAgICAgIGFtLnJlbW92ZU9uVWlkSW1wb3J0YW5jZUxpc3RlbmVyKHVpZEZvcmVncm91bmRMaXN0ZW5lcik7CisgICAgICAgICAgICB1aWRHb25lTGlzdGVuZXIudW5yZWdpc3RlcigpOworICAgICAgICAgICAgdWlkRm9yZWdyb3VuZExpc3RlbmVyLnVucmVnaXN0ZXIoKTsKIAogICAgICAgICAgICAgZGF0YS5yZWN5Y2xlKCk7CiAgICAgICAgIH0KQEAgLTQzNywxNCArNTMxLDE1IEBACiAgICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjMuNS9DLTAtNyIpCiAgICAgcHVibGljIHZvaWQgdGVzdEJhY2tncm91bmRDaGVja1N0b3BzU2VydmljZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBmaW5hbCBQYXJjZWwgZGF0YSA9IFBhcmNlbC5vYnRhaW4oKTsKLSAgICAgICAgU2VydmljZUNvbm5lY3Rpb25IYW5kbGVyIGNvbm4gPSBuZXcgU2VydmljZUNvbm5lY3Rpb25IYW5kbGVyKG1Db250ZXh0LCBtU2VydmljZUludGVudCk7Ci0gICAgICAgIFNlcnZpY2VDb25uZWN0aW9uSGFuZGxlciBjb25uMiA9IG5ldyBTZXJ2aWNlQ29ubmVjdGlvbkhhbmRsZXIobUNvbnRleHQsIG1TZXJ2aWNlMkludGVudCk7CisgICAgICAgIFNlcnZpY2VDb25uZWN0aW9uSGFuZGxlciBjb25uID0gbmV3IFNlcnZpY2VDb25uZWN0aW9uSGFuZGxlcihtQ29udGV4dCwgbVNlcnZpY2VJbnRlbnQsCisgICAgICAgICAgICAgICAgV0FJVF9USU1FKTsKKyAgICAgICAgU2VydmljZUNvbm5lY3Rpb25IYW5kbGVyIGNvbm4yID0gbmV3IFNlcnZpY2VDb25uZWN0aW9uSGFuZGxlcihtQ29udGV4dCwgbVNlcnZpY2UySW50ZW50LAorICAgICAgICAgICAgICAgIFdBSVRfVElNRSk7CiAKICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyIGFtID0gbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShBY3Rpdml0eU1hbmFnZXIuY2xhc3MpOwogCi0gICAgICAgIFN0cmluZyBjbWQgPSAicG0gZ3JhbnQgIiArIFNUVUJfUEFDS0FHRV9OQU1FICsgIiAiCi0gICAgICAgICAgICAgICAgKyBNYW5pZmVzdC5wZXJtaXNzaW9uLlBBQ0tBR0VfVVNBR0VfU1RBVFM7Ci0gICAgICAgIFN0cmluZyByZXN1bHQgPSBTeXN0ZW1VdGlsLnJ1blNoZWxsQ29tbWFuZChnZXRJbnN0cnVtZW50YXRpb24oKSwgY21kKTsKKyAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VWlBdXRvbWF0aW9uKCkuZ3JhbnRSdW50aW1lUGVybWlzc2lvbigKKyAgICAgICAgICAgICAgICBTVFVCX1BBQ0tBR0VfTkFNRSwgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLlBBQ0tBR0VfVVNBR0VfU1RBVFMpOwogICAgICAgICAvKgogICAgICAgICBMb2cuZCgiWFhYWCIsICJJbnZva2U6ICIgKyBjbWQpOwogICAgICAgICBMb2cuZCgiWFhYWCIsICJSZXN1bHQ6ICIgKyByZXN1bHQpOwpAQCAtNDU1LDI0ICs1NTAsMjUgQEAKICAgICAgICAgQXBwbGljYXRpb25JbmZvIGFwcEluZm8gPSBtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpLmdldEFwcGxpY2F0aW9uSW5mbygKICAgICAgICAgICAgICAgICBTSU1QTEVfUEFDS0FHRV9OQU1FLCAwKTsKIAotICAgICAgICBVaWRJbXBvcnRhbmNlTGlzdGVuZXIgdWlkU2VydmljZUxpc3RlbmVyID0gbmV3IFVpZEltcG9ydGFuY2VMaXN0ZW5lcihhcHBJbmZvLnVpZCk7Ci0gICAgICAgIGFtLmFkZE9uVWlkSW1wb3J0YW5jZUxpc3RlbmVyKHVpZFNlcnZpY2VMaXN0ZW5lciwKLSAgICAgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXIuUnVubmluZ0FwcFByb2Nlc3NJbmZvLklNUE9SVEFOQ0VfU0VSVklDRSk7Ci0gICAgICAgIFVpZEltcG9ydGFuY2VMaXN0ZW5lciB1aWRHb25lTGlzdGVuZXIgPSBuZXcgVWlkSW1wb3J0YW5jZUxpc3RlbmVyKGFwcEluZm8udWlkKTsKLSAgICAgICAgYW0uYWRkT25VaWRJbXBvcnRhbmNlTGlzdGVuZXIodWlkR29uZUxpc3RlbmVyLAotICAgICAgICAgICAgICAgIEFjdGl2aXR5TWFuYWdlci5SdW5uaW5nQXBwUHJvY2Vzc0luZm8uSU1QT1JUQU5DRV9DQUNIRUQpOworICAgICAgICBVaWRJbXBvcnRhbmNlTGlzdGVuZXIgdWlkU2VydmljZUxpc3RlbmVyID0gbmV3IFVpZEltcG9ydGFuY2VMaXN0ZW5lcihtQ29udGV4dCwKKyAgICAgICAgICAgICAgICBhcHBJbmZvLnVpZCwgQWN0aXZpdHlNYW5hZ2VyLlJ1bm5pbmdBcHBQcm9jZXNzSW5mby5JTVBPUlRBTkNFX1NFUlZJQ0UsIFdBSVRfVElNRSk7CisgICAgICAgIHVpZFNlcnZpY2VMaXN0ZW5lci5yZWdpc3RlcigpOworICAgICAgICBVaWRJbXBvcnRhbmNlTGlzdGVuZXIgdWlkR29uZUxpc3RlbmVyID0gbmV3IFVpZEltcG9ydGFuY2VMaXN0ZW5lcihtQ29udGV4dCwKKyAgICAgICAgICAgICAgICBhcHBJbmZvLnVpZCwgQWN0aXZpdHlNYW5hZ2VyLlJ1bm5pbmdBcHBQcm9jZXNzSW5mby5JTVBPUlRBTkNFX0NBQ0hFRCwgV0FJVF9USU1FKTsKKyAgICAgICAgdWlkR29uZUxpc3RlbmVyLnJlZ2lzdGVyKCk7CiAKLSAgICAgICAgV2F0Y2hVaWRSdW5uZXIgdWlkV2F0Y2hlciA9IG5ldyBXYXRjaFVpZFJ1bm5lcihnZXRJbnN0cnVtZW50YXRpb24oKSwgYXBwSW5mby51aWQpOworICAgICAgICBXYXRjaFVpZFJ1bm5lciB1aWRXYXRjaGVyID0gbmV3IFdhdGNoVWlkUnVubmVyKGdldEluc3RydW1lbnRhdGlvbigpLCBhcHBJbmZvLnVpZCwKKyAgICAgICAgICAgICAgICBXQUlUX1RJTUUpOwogCiAgICAgICAgIC8vIEZpcnN0IGtpbGwgdGhlIHByb2Nlc3MgdG8gc3RhcnQgb3V0IGluIGEgc3RhYmxlIHN0YXRlLgogICAgICAgICBtQ29udGV4dC5zdG9wU2VydmljZShtU2VydmljZUludGVudCk7CiAgICAgICAgIG1Db250ZXh0LnN0b3BTZXJ2aWNlKG1TZXJ2aWNlMkludGVudCk7Ci0gICAgICAgIGNvbm4uYmluZChXQUlUX1RJTUUpOwotICAgICAgICBjb25uMi5iaW5kKFdBSVRfVElNRSk7CisgICAgICAgIGNvbm4uYmluZCgpOworICAgICAgICBjb25uMi5iaW5kKCk7CiAgICAgICAgIElCaW5kZXIgc2VydmljZSA9IGNvbm4uZ2V0U2VydmljZUlCaW5kZXIoKTsKICAgICAgICAgSUJpbmRlciBzZXJ2aWNlMiA9IGNvbm4yLmdldFNlcnZpY2VJQmluZGVyKCk7Ci0gICAgICAgIGNvbm4udW5iaW5kKFdBSVRfVElNRSk7Ci0gICAgICAgIGNvbm4yLnVuYmluZChXQUlUX1RJTUUpOworICAgICAgICBjb25uLnVuYmluZCgpOworICAgICAgICBjb25uMi51bmJpbmQoKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHNlcnZpY2UudHJhbnNhY3QoSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OLCBkYXRhLCBudWxsLCAwKTsKICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKQEAgLTQ4NSwxOSArNTgxLDE5IEBACiAKICAgICAgICAgLy8gV2FpdCBmb3IgdWlkJ3MgcHJvY2VzcyB0byBnbyBhd2F5LgogICAgICAgICB1aWRHb25lTGlzdGVuZXIud2FpdEZvclZhbHVlKEFjdGl2aXR5TWFuYWdlci5SdW5uaW5nQXBwUHJvY2Vzc0luZm8uSU1QT1JUQU5DRV9HT05FLAotICAgICAgICAgICAgICAgIEFjdGl2aXR5TWFuYWdlci5SdW5uaW5nQXBwUHJvY2Vzc0luZm8uSU1QT1JUQU5DRV9HT05FLCBXQUlUX1RJTUUpOworICAgICAgICAgICAgICAgIEFjdGl2aXR5TWFuYWdlci5SdW5uaW5nQXBwUHJvY2Vzc0luZm8uSU1QT1JUQU5DRV9HT05FKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKEFjdGl2aXR5TWFuYWdlci5SdW5uaW5nQXBwUHJvY2Vzc0luZm8uSU1QT1JUQU5DRV9HT05FLAogICAgICAgICAgICAgICAgIGFtLmdldFBhY2thZ2VJbXBvcnRhbmNlKFNJTVBMRV9QQUNLQUdFX05BTUUpKTsKIAogICAgICAgICAvLyBBbmQgd2FpdCBmb3IgdGhlIHVpZCByZXBvcnQgdG8gYmUgZ29uZS4KICAgICAgICAgdWlkV2F0Y2hlci53YWl0Rm9yKFdhdGNoVWlkUnVubmVyLkNNRF9HT05FLCBudWxsLCBXQUlUX1RJTUUpOwogCi0gICAgICAgIGNtZCA9ICJhcHBvcHMgc2V0ICIgKyBTSU1QTEVfUEFDS0FHRV9OQU1FICsgIiBSVU5fSU5fQkFDS0dST1VORCBkZW55IjsKLSAgICAgICAgcmVzdWx0ID0gU3lzdGVtVXRpbC5ydW5TaGVsbENvbW1hbmQoZ2V0SW5zdHJ1bWVudGF0aW9uKCksIGNtZCk7CisgICAgICAgIFN0cmluZyBjbWQgPSAiYXBwb3BzIHNldCAiICsgU0lNUExFX1BBQ0tBR0VfTkFNRSArICIgUlVOX0lOX0JBQ0tHUk9VTkQgZGVueSI7CisgICAgICAgIFN0cmluZyByZXN1bHQgPSBTeXN0ZW1VdGlsLnJ1blNoZWxsQ29tbWFuZChnZXRJbnN0cnVtZW50YXRpb24oKSwgY21kKTsKIAogICAgICAgICAvLyBUaGlzIGlzIGEgc2lkZS1lZmZlY3Qgb2YgdGhlIGFwcCBvcCBjb21tYW5kLgotICAgICAgICB1aWRXYXRjaGVyLmV4cGVjdChXYXRjaFVpZFJ1bm5lci5DTURfSURMRSwgbnVsbCwgV0FJVF9USU1FKTsKLSAgICAgICAgdWlkV2F0Y2hlci5leHBlY3QoV2F0Y2hVaWRSdW5uZXIuQ01EX1BST0NTVEFURSwgIk5PTkUiLCBXQUlUX1RJTUUpOworICAgICAgICB1aWRXYXRjaGVyLmV4cGVjdChXYXRjaFVpZFJ1bm5lci5DTURfSURMRSwgbnVsbCk7CisgICAgICAgIHVpZFdhdGNoZXIuZXhwZWN0KFdhdGNoVWlkUnVubmVyLkNNRF9QUk9DU1RBVEUsIFdhdGNoVWlkUnVubmVyLlNUQVRFX05PTkVYSVNURU5UKTsKIAogICAgICAgICAvLyBXZSBkb24ndCB3YW50IHRvIHdhaXQgZm9yIHRoZSB1aWQgdG8gYWN0dWFsbHkgZ28gaWRsZSwgd2UgY2FuIGZvcmNlIGl0IG5vdy4KICAgICAgICAgY21kID0gImFtIG1ha2UtdWlkLWlkbGUgIiArIFNJTVBMRV9QQUNLQUdFX05BTUU7CkBAIC01MjMsNDMgKzYxOSw0MyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBGaXJzdCBwb2tlIHRoZSBwcm9jZXNzIGludG8gdGhlIGZvcmVncm91bmQsIHNvIHdlIGNhbiBhdm9pZCBiYWNrZ3JvdW5kIGNoZWNrLgotICAgICAgICAgICAgY29ubjIuYmluZChXQUlUX1RJTUUpOwotICAgICAgICAgICAgY29ubjIud2FpdEZvckNvbm5lY3QoV0FJVF9USU1FKTsKKyAgICAgICAgICAgIGNvbm4yLmJpbmQoKTsKKyAgICAgICAgICAgIGNvbm4yLndhaXRGb3JDb25uZWN0KCk7CiAKICAgICAgICAgICAgIC8vIFdhaXQgZm9yIHByb2Nlc3Mgc3RhdGUgdG8gcmVmbGVjdCBydW5uaW5nIHNlcnZpY2UuCiAgICAgICAgICAgICB1aWRTZXJ2aWNlTGlzdGVuZXIud2FpdEZvclZhbHVlKAogICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXIuUnVubmluZ0FwcFByb2Nlc3NJbmZvLklNUE9SVEFOQ0VfRk9SRUdST1VORF9TRVJWSUNFLAotICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXIuUnVubmluZ0FwcFByb2Nlc3NJbmZvLklNUE9SVEFOQ0VfUEVSQ0VQVElCTEUsIFdBSVRfVElNRSk7CisgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5TWFuYWdlci5SdW5uaW5nQXBwUHJvY2Vzc0luZm8uSU1QT1JUQU5DRV9QRVJDRVBUSUJMRSk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoQWN0aXZpdHlNYW5hZ2VyLlJ1bm5pbmdBcHBQcm9jZXNzSW5mby5JTVBPUlRBTkNFX0ZPUkVHUk9VTkRfU0VSVklDRSwKICAgICAgICAgICAgICAgICAgICAgYW0uZ2V0UGFja2FnZUltcG9ydGFuY2UoU0lNUExFX1BBQ0tBR0VfTkFNRSkpOwogCiAgICAgICAgICAgICAvLyBBbHNvIG1ha2Ugc3VyZSB0aGUgdWlkIHN0YXRlIHJlcG9ydHMgYXJlIGFzIGV4cGVjdGVkLgotICAgICAgICAgICAgdWlkV2F0Y2hlci53YWl0Rm9yKFdhdGNoVWlkUnVubmVyLkNNRF9BQ1RJVkUsIG51bGwsIFdBSVRfVElNRSk7Ci0gICAgICAgICAgICB1aWRXYXRjaGVyLmV4cGVjdChXYXRjaFVpZFJ1bm5lci5DTURfVU5DQUNIRUQsIG51bGwsIFdBSVRfVElNRSk7Ci0gICAgICAgICAgICB1aWRXYXRjaGVyLmV4cGVjdChXYXRjaFVpZFJ1bm5lci5DTURfUFJPQ1NUQVRFLCAiRkdTIiwgV0FJVF9USU1FKTsKKyAgICAgICAgICAgIHVpZFdhdGNoZXIud2FpdEZvcihXYXRjaFVpZFJ1bm5lci5DTURfQUNUSVZFLCBudWxsKTsKKyAgICAgICAgICAgIHVpZFdhdGNoZXIud2FpdEZvcihXYXRjaFVpZFJ1bm5lci5DTURfVU5DQUNIRUQsIG51bGwpOworICAgICAgICAgICAgdWlkV2F0Y2hlci5leHBlY3QoV2F0Y2hVaWRSdW5uZXIuQ01EX1BST0NTVEFURSwgV2F0Y2hVaWRSdW5uZXIuU1RBVEVfRkdfU0VSVklDRSk7CiAKLSAgICAgICAgICAgIGNvbm4yLnVuYmluZChXQUlUX1RJTUUpOworICAgICAgICAgICAgY29ubjIudW5iaW5kKCk7CiAKICAgICAgICAgICAgIC8vIFdhaXQgZm9yIHByb2Nlc3MgdG8gcmVjb3ZlciBiYWNrIGRvd24gdG8gYmVpbmcgY2FjaGVkLgogICAgICAgICAgICAgdWlkU2VydmljZUxpc3RlbmVyLndhaXRGb3JWYWx1ZShBY3Rpdml0eU1hbmFnZXIuUnVubmluZ0FwcFByb2Nlc3NJbmZvLklNUE9SVEFOQ0VfQ0FDSEVELAotICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXIuUnVubmluZ0FwcFByb2Nlc3NJbmZvLklNUE9SVEFOQ0VfR09ORSwgV0FJVF9USU1FKTsKKyAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyLlJ1bm5pbmdBcHBQcm9jZXNzSW5mby5JTVBPUlRBTkNFX0dPTkUpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEFjdGl2aXR5TWFuYWdlci5SdW5uaW5nQXBwUHJvY2Vzc0luZm8uSU1QT1JUQU5DRV9DQUNIRUQsCiAgICAgICAgICAgICAgICAgICAgIGFtLmdldFBhY2thZ2VJbXBvcnRhbmNlKFNJTVBMRV9QQUNLQUdFX05BTUUpKTsKIAotICAgICAgICAgICAgdWlkV2F0Y2hlci53YWl0Rm9yKFdhdGNoVWlkUnVubmVyLkNNRF9DQUNIRUQsIG51bGwsIFdBSVRfVElNRSk7Ci0gICAgICAgICAgICB1aWRXYXRjaGVyLmV4cGVjdChXYXRjaFVpZFJ1bm5lci5DTURfUFJPQ1NUQVRFLCAiQ0VNIiwgV0FJVF9USU1FKTsKKyAgICAgICAgICAgIHVpZFdhdGNoZXIud2FpdEZvcihXYXRjaFVpZFJ1bm5lci5DTURfQ0FDSEVELCBudWxsKTsKKyAgICAgICAgICAgIHVpZFdhdGNoZXIuZXhwZWN0KFdhdGNoVWlkUnVubmVyLkNNRF9QUk9DU1RBVEUsIFdhdGNoVWlkUnVubmVyLlNUQVRFX0NBQ0hFRF9FTVBUWSk7CiAKICAgICAgICAgICAgIC8vIFRyeSBzdGFydGluZyB0aGUgc2VydmljZSBub3cgdGhhdCB0aGUgYXBwIGlzIHdhaXRpbmcgdG8gaWRsZS4uLiAgc2hvdWxkIHdvcmshCiAgICAgICAgICAgICBtQ29udGV4dC5zdGFydFNlcnZpY2UobVNlcnZpY2VJbnRlbnQpOwotICAgICAgICAgICAgY29ubi53YWl0Rm9yQ29ubmVjdChXQUlUX1RJTUUpOworICAgICAgICAgICAgY29ubi53YWl0Rm9yQ29ubmVjdCgpOwogCi0gICAgICAgICAgICB1aWRXYXRjaGVyLmV4cGVjdChXYXRjaFVpZFJ1bm5lci5DTURfVU5DQUNIRUQsIG51bGwsIFdBSVRfVElNRSk7Ci0gICAgICAgICAgICB1aWRXYXRjaGVyLmV4cGVjdChXYXRjaFVpZFJ1bm5lci5DTURfUFJPQ1NUQVRFLCAiU1ZDIiwgV0FJVF9USU1FKTsKKyAgICAgICAgICAgIHVpZFdhdGNoZXIud2FpdEZvcihXYXRjaFVpZFJ1bm5lci5DTURfVU5DQUNIRUQsIG51bGwpOworICAgICAgICAgICAgdWlkV2F0Y2hlci5leHBlY3QoV2F0Y2hVaWRSdW5uZXIuQ01EX1BST0NTVEFURSwgV2F0Y2hVaWRSdW5uZXIuU1RBVEVfU0VSVklDRSk7CiAKICAgICAgICAgICAgIC8vIEFuZCBhbHNvIHN0YXJ0IHRoZSBzZWNvbmQgc2VydmljZS4KICAgICAgICAgICAgIGNvbm4yLnN0YXJ0TW9uaXRvcmluZygpOwogICAgICAgICAgICAgbUNvbnRleHQuc3RhcnRTZXJ2aWNlKG1TZXJ2aWNlMkludGVudCk7Ci0gICAgICAgICAgICBjb25uMi53YWl0Rm9yQ29ubmVjdChXQUlUX1RJTUUpOworICAgICAgICAgICAgY29ubjIud2FpdEZvckNvbm5lY3QoKTsKIAogICAgICAgICAgICAgLy8gRm9yY2UgYXBwIHRvIGdvIGlkbGUgbm93CiAgICAgICAgICAgICBjbWQgPSAiYW0gbWFrZS11aWQtaWRsZSAiICsgU0lNUExFX1BBQ0tBR0VfTkFNRTsKQEAgLTU2NywyNCArNjYzLDI0IEBACiAKICAgICAgICAgICAgIC8vIFdhaXQgZm9yIHNlcnZpY2VzIHRvIGJlIHN0b3BwZWQgYnkgc3lzdGVtLgogICAgICAgICAgICAgdWlkU2VydmljZUxpc3RlbmVyLndhaXRGb3JWYWx1ZShBY3Rpdml0eU1hbmFnZXIuUnVubmluZ0FwcFByb2Nlc3NJbmZvLklNUE9SVEFOQ0VfQ0FDSEVELAotICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXIuUnVubmluZ0FwcFByb2Nlc3NJbmZvLklNUE9SVEFOQ0VfR09ORSwgV0FJVF9USU1FKTsKKyAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyLlJ1bm5pbmdBcHBQcm9jZXNzSW5mby5JTVBPUlRBTkNFX0dPTkUpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEFjdGl2aXR5TWFuYWdlci5SdW5uaW5nQXBwUHJvY2Vzc0luZm8uSU1QT1JUQU5DRV9DQUNIRUQsCiAgICAgICAgICAgICAgICAgICAgIGFtLmdldFBhY2thZ2VJbXBvcnRhbmNlKFNJTVBMRV9QQUNLQUdFX05BTUUpKTsKIAogICAgICAgICAgICAgLy8gQW5kIHNlcnZpY2Ugc2hvdWxkIGJlIHN0b3BwZWQgYnkgc3lzdGVtLCBzbyBqdXN0IG1ha2Ugc3VyZSBpdCBpcyBkaXNjb25uZWN0ZWQuCi0gICAgICAgICAgICBjb25uLndhaXRGb3JEaXNjb25uZWN0KFdBSVRfVElNRSk7Ci0gICAgICAgICAgICBjb25uMi53YWl0Rm9yRGlzY29ubmVjdChXQUlUX1RJTUUpOworICAgICAgICAgICAgY29ubi53YWl0Rm9yRGlzY29ubmVjdCgpOworICAgICAgICAgICAgY29ubjIud2FpdEZvckRpc2Nvbm5lY3QoKTsKIAotICAgICAgICAgICAgdWlkV2F0Y2hlci5leHBlY3QoV2F0Y2hVaWRSdW5uZXIuQ01EX0lETEUsIG51bGwsIFdBSVRfVElNRSk7CisgICAgICAgICAgICB1aWRXYXRjaGVyLmV4cGVjdChXYXRjaFVpZFJ1bm5lci5DTURfSURMRSwgbnVsbCk7CiAgICAgICAgICAgICAvLyBUaGVyZSBtYXkgYmUgYSB0cmFuc2llbnQgJ1NWQycgcHJvYyBzdGF0ZSBoZXJlLgotICAgICAgICAgICAgdWlkV2F0Y2hlci53YWl0Rm9yKFdhdGNoVWlkUnVubmVyLkNNRF9DQUNIRUQsIG51bGwsIFdBSVRfVElNRSk7Ci0gICAgICAgICAgICB1aWRXYXRjaGVyLmV4cGVjdChXYXRjaFVpZFJ1bm5lci5DTURfUFJPQ1NUQVRFLCAiQ0VNIiwgV0FJVF9USU1FKTsKKyAgICAgICAgICAgIHVpZFdhdGNoZXIud2FpdEZvcihXYXRjaFVpZFJ1bm5lci5DTURfQ0FDSEVELCBudWxsKTsKKyAgICAgICAgICAgIHVpZFdhdGNoZXIuZXhwZWN0KFdhdGNoVWlkUnVubmVyLkNNRF9QUk9DU1RBVEUsIFdhdGNoVWlkUnVubmVyLlNUQVRFX0NBQ0hFRF9FTVBUWSk7CiAKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIG1Db250ZXh0LnN0b3BTZXJ2aWNlKG1TZXJ2aWNlSW50ZW50KTsKICAgICAgICAgICAgIG1Db250ZXh0LnN0b3BTZXJ2aWNlKG1TZXJ2aWNlMkludGVudCk7Ci0gICAgICAgICAgICBjb25uLmNsZWFudXAoV0FJVF9USU1FKTsKLSAgICAgICAgICAgIGNvbm4yLmNsZWFudXAoV0FJVF9USU1FKTsKKyAgICAgICAgICAgIGNvbm4uY2xlYW51cCgpOworICAgICAgICAgICAgY29ubjIuY2xlYW51cCgpOwogCiAgICAgICAgICAgICB1aWRXYXRjaGVyLmZpbmlzaCgpOwogCkBAIC01OTMsOCArNjg5LDggQEAKICAgICAgICAgICAgIGNtZCA9ICJjbWQgZGV2aWNlaWRsZSB3aGl0ZWxpc3QgLSIgKyBTSU1QTEVfUEFDS0FHRV9OQU1FOwogICAgICAgICAgICAgcmVzdWx0ID0gU3lzdGVtVXRpbC5ydW5TaGVsbENvbW1hbmQoZ2V0SW5zdHJ1bWVudGF0aW9uKCksIGNtZCk7CiAKLSAgICAgICAgICAgIGFtLnJlbW92ZU9uVWlkSW1wb3J0YW5jZUxpc3RlbmVyKHVpZEdvbmVMaXN0ZW5lcik7Ci0gICAgICAgICAgICBhbS5yZW1vdmVPblVpZEltcG9ydGFuY2VMaXN0ZW5lcih1aWRTZXJ2aWNlTGlzdGVuZXIpOworICAgICAgICAgICAgdWlkR29uZUxpc3RlbmVyLnVucmVnaXN0ZXIoKTsKKyAgICAgICAgICAgIHVpZFNlcnZpY2VMaXN0ZW5lci51bnJlZ2lzdGVyKCk7CiAKICAgICAgICAgICAgIGRhdGEucmVjeWNsZSgpOwogICAgICAgICB9CkBAIC02MTEsMTYgKzcwNywxNyBAQAogICAgICAgICAgICAgICAgIFNJTVBMRV9QQUNLQUdFX05BTUUgKyBTSU1QTEVfUkVDRUlWRVJfU1RBUlRfU0VSVklDRSk7CiAKICAgICAgICAgZmluYWwgU2VydmljZVByb2Nlc3NDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBuZXcgU2VydmljZVByb2Nlc3NDb250cm9sbGVyKG1Db250ZXh0LAotICAgICAgICAgICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpLCBTVFVCX1BBQ0tBR0VfTkFNRSwgbUFsbFByb2Nlc3Nlcyk7CisgICAgICAgICAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCksIFNUVUJfUEFDS0FHRV9OQU1FLCBtQWxsUHJvY2Vzc2VzLCBXQUlUX1RJTUUpOwogICAgICAgICBmaW5hbCBTZXJ2aWNlQ29ubmVjdGlvbkhhbmRsZXIgY29ubiA9IG5ldyBTZXJ2aWNlQ29ubmVjdGlvbkhhbmRsZXIobUNvbnRleHQsCi0gICAgICAgICAgICAgICAgbVNlcnZpY2VJbnRlbnQpOworICAgICAgICAgICAgICAgIG1TZXJ2aWNlSW50ZW50LCBXQUlUX1RJTUUpOworICAgICAgICBmaW5hbCBXYXRjaFVpZFJ1bm5lciB1aWRXYXRjaGVyID0gY29udHJvbGxlci5nZXRVaWRXYXRjaGVyKCk7CiAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIC8vIEZpcnN0IGtpbGwgdGhlIHByb2Nlc3MgdG8gc3RhcnQgb3V0IGluIGEgc3RhYmxlIHN0YXRlLgotICAgICAgICAgICAgY29udHJvbGxlci5lbnN1cmVQcm9jZXNzR29uZShXQUlUX1RJTUUpOworICAgICAgICAgICAgY29udHJvbGxlci5lbnN1cmVQcm9jZXNzR29uZSgpOwogCiAgICAgICAgICAgICAvLyBEbyBpbml0aWFsIHNldHVwLgotICAgICAgICAgICAgY29udHJvbGxlci5kZW55QmFja2dyb3VuZE9wKFdBSVRfVElNRSk7CisgICAgICAgICAgICBjb250cm9sbGVyLmRlbnlCYWNrZ3JvdW5kT3AoKTsKICAgICAgICAgICAgIGNvbnRyb2xsZXIubWFrZVVpZElkbGUoKTsKICAgICAgICAgICAgIGNvbnRyb2xsZXIucmVtb3ZlRnJvbVdoaXRlbGlzdCgpOwogCkBAIC02MzcsMTggKzczNCwxOCBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBUcmFjayB0aGUgdWlkIHByb2Mgc3RhdGUgY2hhbmdlcyBmcm9tIHRoZSBicm9hZGNhc3QgKGJ1dCBub3Qgc2VydmljZSBleGVjdXRpb24pCi0gICAgICAgICAgICBjb250cm9sbGVyLmdldFVpZFdhdGNoZXIoKS53YWl0Rm9yKFdhdGNoVWlkUnVubmVyLkNNRF9JRExFLCBudWxsLCBXQUlUX1RJTUUpOwotICAgICAgICAgICAgY29udHJvbGxlci5nZXRVaWRXYXRjaGVyKCkuZXhwZWN0KFdhdGNoVWlkUnVubmVyLkNNRF9VTkNBQ0hFRCwgbnVsbCwgV0FJVF9USU1FKTsKLSAgICAgICAgICAgIGNvbnRyb2xsZXIuZ2V0VWlkV2F0Y2hlcigpLmV4cGVjdChXYXRjaFVpZFJ1bm5lci5DTURfUFJPQ1NUQVRFLCAiUkNWUiIsIFdBSVRfVElNRSk7Ci0gICAgICAgICAgICBjb250cm9sbGVyLmdldFVpZFdhdGNoZXIoKS5leHBlY3QoV2F0Y2hVaWRSdW5uZXIuQ01EX0NBQ0hFRCwgbnVsbCwgV0FJVF9USU1FKTsKLSAgICAgICAgICAgIGNvbnRyb2xsZXIuZ2V0VWlkV2F0Y2hlcigpLmV4cGVjdChXYXRjaFVpZFJ1bm5lci5DTURfUFJPQ1NUQVRFLCAiQ0VNIiwgV0FJVF9USU1FKTsKKyAgICAgICAgICAgIHVpZFdhdGNoZXIud2FpdEZvcihXYXRjaFVpZFJ1bm5lci5DTURfSURMRSwgbnVsbCwgV0FJVF9USU1FKTsKKyAgICAgICAgICAgIHVpZFdhdGNoZXIud2FpdEZvcihXYXRjaFVpZFJ1bm5lci5DTURfVU5DQUNIRUQsIG51bGwsIFdBSVRfVElNRSk7CisgICAgICAgICAgICB1aWRXYXRjaGVyLmV4cGVjdChXYXRjaFVpZFJ1bm5lci5DTURfUFJPQ1NUQVRFLCBXYXRjaFVpZFJ1bm5lci5TVEFURV9SRUNFSVZFUiwgV0FJVF9USU1FKTsKKyAgICAgICAgICAgIHVpZFdhdGNoZXIuZXhwZWN0KFdhdGNoVWlkUnVubmVyLkNNRF9DQUNIRUQsIG51bGwsIFdBSVRfVElNRSk7CisgICAgICAgICAgICB1aWRXYXRjaGVyLmV4cGVjdChXYXRjaFVpZFJ1bm5lci5DTURfUFJPQ1NUQVRFLCBXYXRjaFVpZFJ1bm5lci5TVEFURV9DQUNIRURfRU1QVFksIFdBSVRfVElNRSk7CiAKICAgICAgICAgICAgIC8vIFB1dCBhcHAgb24gdGVtcG9yYXJ5IHdoaXRlbGlzdCB0byBzZWUgaWYgdGhpcyBhbGxvd3MgdGhlIHNlcnZpY2Ugc3RhcnQuCi0gICAgICAgICAgICBjb250cm9sbGVyLnRlbXBXaGl0ZWxpc3QoMjAwMCk7CisgICAgICAgICAgICBjb250cm9sbGVyLnRlbXBXaGl0ZWxpc3QoVEVNUF9XSElURUxJU1RfRFVSQVRJT05fTVMpOwogCiAgICAgICAgICAgICAvLyBCZWluZyBvbiB0aGUgd2hpdGVsaXN0IG1lYW5zIHRoZSB1aWQgaXMgbm93IGFjdGl2ZS4KLSAgICAgICAgICAgIGNvbnRyb2xsZXIuZ2V0VWlkV2F0Y2hlcigpLmV4cGVjdChXYXRjaFVpZFJ1bm5lci5DTURfQUNUSVZFLCBudWxsLCBXQUlUX1RJTUUpOwotICAgICAgICAgICAgY29udHJvbGxlci5nZXRVaWRXYXRjaGVyKCkuZXhwZWN0KFdhdGNoVWlkUnVubmVyLkNNRF9QUk9DU1RBVEUsICJDRU0iLCBXQUlUX1RJTUUpOworICAgICAgICAgICAgdWlkV2F0Y2hlci5leHBlY3QoV2F0Y2hVaWRSdW5uZXIuQ01EX0FDVElWRSwgbnVsbCwgV0FJVF9USU1FKTsKKyAgICAgICAgICAgIHVpZFdhdGNoZXIuZXhwZWN0KFdhdGNoVWlkUnVubmVyLkNNRF9QUk9DU1RBVEUsIFdhdGNoVWlkUnVubmVyLlNUQVRFX0NBQ0hFRF9FTVBUWSwgV0FJVF9USU1FKTsKIAogICAgICAgICAgICAgLy8gVHJ5IHN0YXJ0aW5nIHRoZSBzZXJ2aWNlIG5vdyB0aGF0IHRoZSBhcHAgaXMgd2hpdGVsaXN0ZWQuLi4gIHNob3VsZCB3b3JrIQogICAgICAgICAgICAgYnIuc2VuZEFuZFdhaXQobUNvbnRleHQsIGJyb2FkY2FzdEludGVudCwgQWN0aXZpdHkuUkVTVUxUX09LLCBudWxsLCBudWxsLCBXQUlUX1RJTUUpOwpAQCAtNjU2LDM0ICs3NTMsMzQgQEAKICAgICAgICAgICAgIGlmIChickNvZGUgIT0gQWN0aXZpdHkuUkVTVUxUX0ZJUlNUX1VTRVIpIHsKICAgICAgICAgICAgICAgICBmYWlsKCJGYWlsZWQgc3RhcnRpbmcgc2VydmljZSwgcmVzdWx0PSIgKyBickNvZGUpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgY29ubi53YWl0Rm9yQ29ubmVjdChXQUlUX1RJTUUpOworICAgICAgICAgICAgY29ubi53YWl0Rm9yQ29ubmVjdCgpOwogCiAgICAgICAgICAgICAvLyBBbHNvIG1ha2Ugc3VyZSB0aGUgdWlkIHN0YXRlIHJlcG9ydHMgYXJlIGFzIGV4cGVjdGVkLgotICAgICAgICAgICAgY29udHJvbGxlci5nZXRVaWRXYXRjaGVyKCkuZXhwZWN0KFdhdGNoVWlkUnVubmVyLkNNRF9VTkNBQ0hFRCwgbnVsbCwgV0FJVF9USU1FKTsKKyAgICAgICAgICAgIHVpZFdhdGNoZXIud2FpdEZvcihXYXRjaFVpZFJ1bm5lci5DTURfVU5DQUNIRUQsIG51bGwpOwogICAgICAgICAgICAgLy8gV2UgYXJlIGdvaW5nIHRvIHdhaXQgdW50aWwgJ1NWQycsIGJlY2F1c2Ugd2UgbWF5IHNlZSBhbiBpbnRlcm1lZGlhdGUgJ1JDVlInCiAgICAgICAgICAgICAvLyBwcm9jIHN0YXRlIGRlcGVuZGluZyBvbiB0aW1pbmcuCi0gICAgICAgICAgICBjb250cm9sbGVyLmdldFVpZFdhdGNoZXIoKS53YWl0Rm9yKFdhdGNoVWlkUnVubmVyLkNNRF9QUk9DU1RBVEUsICJTVkMiLCBXQUlUX1RJTUUpOworICAgICAgICAgICAgdWlkV2F0Y2hlci53YWl0Rm9yKFdhdGNoVWlkUnVubmVyLkNNRF9QUk9DU1RBVEUsIFdhdGNoVWlkUnVubmVyLlNUQVRFX1NFUlZJQ0UpOwogCiAgICAgICAgICAgICAvLyBHb29kLCBub3cgc3RvcCB0aGUgc2VydmljZSBhbmQgZ2l2ZSBlbm91Z2ggdGltZSB0byBnZXQgb2ZmIHRoZSB0ZW1wIHdoaXRlbGlzdC4KICAgICAgICAgICAgIG1Db250ZXh0LnN0b3BTZXJ2aWNlKG1TZXJ2aWNlSW50ZW50KTsKLSAgICAgICAgICAgIGNvbm4ud2FpdEZvckRpc2Nvbm5lY3QoV0FJVF9USU1FKTsKKyAgICAgICAgICAgIGNvbm4ud2FpdEZvckRpc2Nvbm5lY3QoKTsKIAotICAgICAgICAgICAgY29udHJvbGxlci5nZXRVaWRXYXRjaGVyKCkuZXhwZWN0KFdhdGNoVWlkUnVubmVyLkNNRF9DQUNIRUQsIG51bGwsIFdBSVRfVElNRSk7Ci0gICAgICAgICAgICBjb250cm9sbGVyLmdldFVpZFdhdGNoZXIoKS5leHBlY3QoV2F0Y2hVaWRSdW5uZXIuQ01EX1BST0NTVEFURSwgIkNFTSIsIFdBSVRfVElNRSk7CisgICAgICAgICAgICB1aWRXYXRjaGVyLmV4cGVjdChXYXRjaFVpZFJ1bm5lci5DTURfQ0FDSEVELCBudWxsKTsKKyAgICAgICAgICAgIHVpZFdhdGNoZXIuZXhwZWN0KFdhdGNoVWlkUnVubmVyLkNNRF9QUk9DU1RBVEUsIFdhdGNoVWlkUnVubmVyLlNUQVRFX0NBQ0hFRF9FTVBUWSk7CiAKLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgzMDAwKTsKKyAgICAgICAgICAgIGNvbnRyb2xsZXIucmVtb3ZlRnJvbVRlbXBXaGl0ZWxpc3QoKTsKIAogICAgICAgICAgICAgLy8gR29pbmcgb2ZmIHRoZSB0ZW1wIHdoaXRlbGlzdCBjYXVzZXMgYSBzcHVyaW91cyBwcm9jIHN0YXRlIHJlcG9ydC4uLiAgdGhhdCdzCiAgICAgICAgICAgICAvLyBub3QgaWRlYWwsIGJ1dCBva2F5LgotICAgICAgICAgICAgY29udHJvbGxlci5nZXRVaWRXYXRjaGVyKCkuZXhwZWN0KFdhdGNoVWlkUnVubmVyLkNNRF9QUk9DU1RBVEUsICJDRU0iLCBXQUlUX1RJTUUpOworICAgICAgICAgICAgdWlkV2F0Y2hlci5leHBlY3QoV2F0Y2hVaWRSdW5uZXIuQ01EX1BST0NTVEFURSwgV2F0Y2hVaWRSdW5uZXIuU1RBVEVfQ0FDSEVEX0VNUFRZKTsKIAogICAgICAgICAgICAgLy8gV2UgZG9uJ3Qgd2FudCB0byB3YWl0IGZvciB0aGUgdWlkIHRvIGFjdHVhbGx5IGdvIGlkbGUsIHdlIGNhbiBmb3JjZSBpdCBub3cuCiAgICAgICAgICAgICBjb250cm9sbGVyLm1ha2VVaWRJZGxlKCk7CiAKLSAgICAgICAgICAgIGNvbnRyb2xsZXIuZ2V0VWlkV2F0Y2hlcigpLmV4cGVjdChXYXRjaFVpZFJ1bm5lci5DTURfSURMRSwgbnVsbCwgV0FJVF9USU1FKTsKKyAgICAgICAgICAgIHVpZFdhdGNoZXIuZXhwZWN0KFdhdGNoVWlkUnVubmVyLkNNRF9JRExFLCBudWxsKTsKIAogICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBwcm9jZXNzIGlzIGdvbmUgc28gd2Ugc3RhcnQgb3ZlciBmcmVzaC4KLSAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5zdXJlUHJvY2Vzc0dvbmUoV0FJVF9USU1FKTsKKyAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5zdXJlUHJvY2Vzc0dvbmUoKTsKIAogICAgICAgICAgICAgLy8gTm93IHRoYXQgd2Ugc2hvdWxkIGJlIG9mZiB0aGUgdGVtcCB3aGl0ZWxpc3QsIG1ha2Ugc3VyZSB3ZSBhZ2FpbiBjYW4ndCBzdGFydC4KICAgICAgICAgICAgIGJyLnNlbmRBbmRXYWl0KG1Db250ZXh0LCBicm9hZGNhc3RJbnRlbnQsIEFjdGl2aXR5LlJFU1VMVF9PSywgbnVsbCwgbnVsbCwgV0FJVF9USU1FKTsKQEAgLTY5MywxMyArNzkwLDEzIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIFRyYWNrIHRoZSB1aWQgcHJvYyBzdGF0ZSBjaGFuZ2VzIGZyb20gdGhlIGJyb2FkY2FzdCAoYnV0IG5vdCBzZXJ2aWNlIGV4ZWN1dGlvbikKLSAgICAgICAgICAgIGNvbnRyb2xsZXIuZ2V0VWlkV2F0Y2hlcigpLndhaXRGb3IoV2F0Y2hVaWRSdW5uZXIuQ01EX0lETEUsIG51bGwsIFdBSVRfVElNRSk7CisgICAgICAgICAgICB1aWRXYXRjaGVyLndhaXRGb3IoV2F0Y2hVaWRSdW5uZXIuQ01EX0lETEUsIG51bGwpOwogICAgICAgICAgICAgLy8gVGhlcmUgY291bGQgYmUgYSB0cmFuc2llbnQgJ2NhY2hlZCcgc3RhdGUgaGVyZSBiZWZvcmUgJ3VuY2FjaGVkJyBpZiB1aWQgc3RhdGUKICAgICAgICAgICAgIC8vIGNoYW5nZXMgYXJlIGRpc3BhdGNoZWQgYmVmb3JlIHJlY2VpdmVyIGlzIHN0YXJ0ZWQuCi0gICAgICAgICAgICBjb250cm9sbGVyLmdldFVpZFdhdGNoZXIoKS53YWl0Rm9yKFdhdGNoVWlkUnVubmVyLkNNRF9VTkNBQ0hFRCwgbnVsbCwgV0FJVF9USU1FKTsKLSAgICAgICAgICAgIGNvbnRyb2xsZXIuZ2V0VWlkV2F0Y2hlcigpLmV4cGVjdChXYXRjaFVpZFJ1bm5lci5DTURfUFJPQ1NUQVRFLCAiUkNWUiIsIFdBSVRfVElNRSk7Ci0gICAgICAgICAgICBjb250cm9sbGVyLmdldFVpZFdhdGNoZXIoKS5leHBlY3QoV2F0Y2hVaWRSdW5uZXIuQ01EX0NBQ0hFRCwgbnVsbCwgV0FJVF9USU1FKTsKLSAgICAgICAgICAgIGNvbnRyb2xsZXIuZ2V0VWlkV2F0Y2hlcigpLmV4cGVjdChXYXRjaFVpZFJ1bm5lci5DTURfUFJPQ1NUQVRFLCAiQ0VNIiwgV0FJVF9USU1FKTsKKyAgICAgICAgICAgIHVpZFdhdGNoZXIud2FpdEZvcihXYXRjaFVpZFJ1bm5lci5DTURfVU5DQUNIRUQsIG51bGwpOworICAgICAgICAgICAgdWlkV2F0Y2hlci5leHBlY3QoV2F0Y2hVaWRSdW5uZXIuQ01EX1BST0NTVEFURSwgV2F0Y2hVaWRSdW5uZXIuU1RBVEVfUkVDRUlWRVIpOworICAgICAgICAgICAgdWlkV2F0Y2hlci5leHBlY3QoV2F0Y2hVaWRSdW5uZXIuQ01EX0NBQ0hFRCwgbnVsbCk7CisgICAgICAgICAgICB1aWRXYXRjaGVyLmV4cGVjdChXYXRjaFVpZFJ1bm5lci5DTURfUFJPQ1NUQVRFLCBXYXRjaFVpZFJ1bm5lci5TVEFURV9DQUNIRURfRU1QVFkpOwogCiAgICAgICAgICAgICAvLyBOb3cgcHV0IGFwcCBvbiB3aGl0ZWxpc3QsIHNob3VsZCBhbGxvdyBzZXJ2aWNlIHRvIHJ1bi4KICAgICAgICAgICAgIGNvbnRyb2xsZXIuYWRkVG9XaGl0ZWxpc3QoKTsKQEAgLTcxMCwxOCArODA3LDE4IEBACiAgICAgICAgICAgICBpZiAoYnJDb2RlICE9IEFjdGl2aXR5LlJFU1VMVF9GSVJTVF9VU0VSKSB7CiAgICAgICAgICAgICAgICAgZmFpbCgiRmFpbGVkIHN0YXJ0aW5nIHNlcnZpY2UsIHJlc3VsdD0iICsgYnJDb2RlKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbm4ud2FpdEZvckNvbm5lY3QoV0FJVF9USU1FKTsKKyAgICAgICAgICAgIGNvbm4ud2FpdEZvckNvbm5lY3QoKTsKIAogICAgICAgICAgICAgLy8gQWxzbyBtYWtlIHN1cmUgdGhlIHVpZCBzdGF0ZSByZXBvcnRzIGFyZSBhcyBleHBlY3RlZC4KLSAgICAgICAgICAgIGNvbnRyb2xsZXIuZ2V0VWlkV2F0Y2hlcigpLmV4cGVjdChXYXRjaFVpZFJ1bm5lci5DTURfVU5DQUNIRUQsIG51bGwsIFdBSVRfVElNRSk7Ci0gICAgICAgICAgICBjb250cm9sbGVyLmdldFVpZFdhdGNoZXIoKS53YWl0Rm9yKFdhdGNoVWlkUnVubmVyLkNNRF9QUk9DU1RBVEUsICJTVkMiLCBXQUlUX1RJTUUpOworICAgICAgICAgICAgdWlkV2F0Y2hlci53YWl0Rm9yKFdhdGNoVWlkUnVubmVyLkNNRF9VTkNBQ0hFRCwgbnVsbCk7CisgICAgICAgICAgICB1aWRXYXRjaGVyLndhaXRGb3IoV2F0Y2hVaWRSdW5uZXIuQ01EX1BST0NTVEFURSwgV2F0Y2hVaWRSdW5uZXIuU1RBVEVfU0VSVklDRSk7CiAKICAgICAgICAgICAgIC8vIE9rYXksIGJyaW5nIGRvd24gdGhlIHNlcnZpY2UuCiAgICAgICAgICAgICBtQ29udGV4dC5zdG9wU2VydmljZShtU2VydmljZUludGVudCk7Ci0gICAgICAgICAgICBjb25uLndhaXRGb3JEaXNjb25uZWN0KFdBSVRfVElNRSk7CisgICAgICAgICAgICBjb25uLndhaXRGb3JEaXNjb25uZWN0KCk7CiAKLSAgICAgICAgICAgIGNvbnRyb2xsZXIuZ2V0VWlkV2F0Y2hlcigpLmV4cGVjdChXYXRjaFVpZFJ1bm5lci5DTURfQ0FDSEVELCBudWxsLCBXQUlUX1RJTUUpOwotICAgICAgICAgICAgY29udHJvbGxlci5nZXRVaWRXYXRjaGVyKCkuZXhwZWN0KFdhdGNoVWlkUnVubmVyLkNNRF9QUk9DU1RBVEUsICJDRU0iLCBXQUlUX1RJTUUpOworICAgICAgICAgICAgdWlkV2F0Y2hlci5leHBlY3QoV2F0Y2hVaWRSdW5uZXIuQ01EX0NBQ0hFRCwgbnVsbCk7CisgICAgICAgICAgICB1aWRXYXRjaGVyLmV4cGVjdChXYXRjaFVpZFJ1bm5lci5DTURfUFJPQ1NUQVRFLCBXYXRjaFVpZFJ1bm5lci5TVEFURV9DQUNIRURfRU1QVFkpOwogCiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBtQ29udGV4dC5zdG9wU2VydmljZShtU2VydmljZUludGVudCk7CkBAIC03MzAsNyArODI3LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogVGVzdCB0aGF0IGJhY2tncm91bmQgY2hlY2sgZG9lcyBhbGxvdyBzZXJ2aWNlcyB0byBiZSBzdGFydGVkIGZyb20gYWN0aXZpdGllcy4KICAgICAgKi8KQEAgLTczOCwxOCArODM0LDIwIEBACiAgICAgICAgIGZpbmFsIEludGVudCBhY3Rpdml0eUludGVudCA9IG5ldyBJbnRlbnQoKTsKICAgICAgICAgYWN0aXZpdHlJbnRlbnQuc2V0Q2xhc3NOYW1lKFNJTVBMRV9QQUNLQUdFX05BTUUsCiAgICAgICAgICAgICAgICAgU0lNUExFX1BBQ0tBR0VfTkFNRSArIFNJTVBMRV9BQ1RJVklUWV9TVEFSVF9TRVJWSUNFKTsKKyAgICAgICAgYWN0aXZpdHlJbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOwogCiAgICAgICAgIGZpbmFsIFNlcnZpY2VQcm9jZXNzQ29udHJvbGxlciBjb250cm9sbGVyID0gbmV3IFNlcnZpY2VQcm9jZXNzQ29udHJvbGxlcihtQ29udGV4dCwKLSAgICAgICAgICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKSwgU1RVQl9QQUNLQUdFX05BTUUsIG1BbGxQcm9jZXNzZXMpOworICAgICAgICAgICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpLCBTVFVCX1BBQ0tBR0VfTkFNRSwgbUFsbFByb2Nlc3NlcywgV0FJVF9USU1FKTsKICAgICAgICAgZmluYWwgU2VydmljZUNvbm5lY3Rpb25IYW5kbGVyIGNvbm4gPSBuZXcgU2VydmljZUNvbm5lY3Rpb25IYW5kbGVyKG1Db250ZXh0LAotICAgICAgICAgICAgICAgIG1TZXJ2aWNlSW50ZW50KTsKKyAgICAgICAgICAgICAgICBtU2VydmljZUludGVudCwgV0FJVF9USU1FKTsKKyAgICAgICAgZmluYWwgV2F0Y2hVaWRSdW5uZXIgdWlkV2F0Y2hlciA9IGNvbnRyb2xsZXIuZ2V0VWlkV2F0Y2hlcigpOwogCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAvLyBGaXJzdCBraWxsIHRoZSBwcm9jZXNzIHRvIHN0YXJ0IG91dCBpbiBhIHN0YWJsZSBzdGF0ZS4KLSAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5zdXJlUHJvY2Vzc0dvbmUoV0FJVF9USU1FKTsKKyAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5zdXJlUHJvY2Vzc0dvbmUoKTsKIAogICAgICAgICAgICAgLy8gRG8gaW5pdGlhbCBzZXR1cC4KLSAgICAgICAgICAgIGNvbnRyb2xsZXIuZGVueUJhY2tncm91bmRPcChXQUlUX1RJTUUpOworICAgICAgICAgICAgY29udHJvbGxlci5kZW55QmFja2dyb3VuZE9wKCk7CiAgICAgICAgICAgICBjb250cm9sbGVyLm1ha2VVaWRJZGxlKCk7CiAgICAgICAgICAgICBjb250cm9sbGVyLnJlbW92ZUZyb21XaGl0ZWxpc3QoKTsKIApAQCAtNzY2LDM3ICs4NjQsMzYgQEAKICAgICAgICAgICAgIGlmIChickNvZGUgIT0gQWN0aXZpdHkuUkVTVUxUX0ZJUlNUX1VTRVIpIHsKICAgICAgICAgICAgICAgICBmYWlsKCJGYWlsZWQgc3RhcnRpbmcgc2VydmljZSwgcmVzdWx0PSIgKyBickNvZGUpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgY29ubi53YWl0Rm9yQ29ubmVjdChXQUlUX1RJTUUpOworICAgICAgICAgICAgY29ubi53YWl0Rm9yQ29ubmVjdCgpOwogCiAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWRBY3Rpdml0eVN0YXRlID0gKGlzU2NyZWVuSW50ZXJhY3RpdmUoKSAmJiAhaXNLZXlndWFyZExvY2tlZCgpKQotICAgICAgICAgICAgICAgICAgICA/ICJUT1AiIDogIlRQU0wiOworICAgICAgICAgICAgICAgICAgICA/IFdhdGNoVWlkUnVubmVyLlNUQVRFX1RPUCA6IFdhdGNoVWlkUnVubmVyLlNUQVRFX1RPUF9TTEVFUElORzsKICAgICAgICAgICAgIC8vIEFsc28gbWFrZSBzdXJlIHRoZSB1aWQgc3RhdGUgcmVwb3J0cyBhcmUgYXMgZXhwZWN0ZWQuCi0gICAgICAgICAgICBjb250cm9sbGVyLmdldFVpZFdhdGNoZXIoKS53YWl0Rm9yKFdhdGNoVWlkUnVubmVyLkNNRF9BQ1RJVkUsIG51bGwsIFdBSVRfVElNRSk7Ci0gICAgICAgICAgICBjb250cm9sbGVyLmdldFVpZFdhdGNoZXIoKS5leHBlY3QoV2F0Y2hVaWRSdW5uZXIuQ01EX1VOQ0FDSEVELCBudWxsLCBXQUlUX1RJTUUpOwotICAgICAgICAgICAgY29udHJvbGxlci5nZXRVaWRXYXRjaGVyKCkuZXhwZWN0KFdhdGNoVWlkUnVubmVyLkNNRF9QUk9DU1RBVEUsCi0gICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkQWN0aXZpdHlTdGF0ZSwgV0FJVF9USU1FKTsKLSAgICAgICAgICAgIGNvbnRyb2xsZXIuZ2V0VWlkV2F0Y2hlcigpLmV4cGVjdChXYXRjaFVpZFJ1bm5lci5DTURfUFJPQ1NUQVRFLCAiU1ZDIiwgV0FJVF9USU1FKTsKKyAgICAgICAgICAgIHVpZFdhdGNoZXIud2FpdEZvcihXYXRjaFVpZFJ1bm5lci5DTURfQUNUSVZFLCBudWxsKTsKKyAgICAgICAgICAgIHVpZFdhdGNoZXIud2FpdEZvcihXYXRjaFVpZFJ1bm5lci5DTURfVU5DQUNIRUQsIG51bGwpOworICAgICAgICAgICAgdWlkV2F0Y2hlci5leHBlY3QoV2F0Y2hVaWRSdW5uZXIuQ01EX1BST0NTVEFURSwgZXhwZWN0ZWRBY3Rpdml0eVN0YXRlKTsKKyAgICAgICAgICAgIHVpZFdhdGNoZXIuZXhwZWN0KFdhdGNoVWlkUnVubmVyLkNNRF9QUk9DU1RBVEUsIFdhdGNoVWlkUnVubmVyLlNUQVRFX1NFUlZJQ0UpOwogCiAgICAgICAgICAgICAvLyBPa2F5LCBicmluZyBkb3duIHRoZSBzZXJ2aWNlLgogICAgICAgICAgICAgbUNvbnRleHQuc3RvcFNlcnZpY2UobVNlcnZpY2VJbnRlbnQpOwotICAgICAgICAgICAgY29ubi53YWl0Rm9yRGlzY29ubmVjdChXQUlUX1RJTUUpOworICAgICAgICAgICAgY29ubi53YWl0Rm9yRGlzY29ubmVjdCgpOwogCi0gICAgICAgICAgICBjb250cm9sbGVyLmdldFVpZFdhdGNoZXIoKS5leHBlY3QoV2F0Y2hVaWRSdW5uZXIuQ01EX0NBQ0hFRCwgbnVsbCwgV0FJVF9USU1FKTsKLSAgICAgICAgICAgIGNvbnRyb2xsZXIuZ2V0VWlkV2F0Y2hlcigpLmV4cGVjdChXYXRjaFVpZFJ1bm5lci5DTURfUFJPQ1NUQVRFLCAiQ0VNIiwgV0FJVF9USU1FKTsKKyAgICAgICAgICAgIHVpZFdhdGNoZXIuZXhwZWN0KFdhdGNoVWlkUnVubmVyLkNNRF9DQUNIRUQsIG51bGwpOworICAgICAgICAgICAgdWlkV2F0Y2hlci5leHBlY3QoV2F0Y2hVaWRSdW5uZXIuQ01EX1BST0NTVEFURSwgV2F0Y2hVaWRSdW5uZXIuU1RBVEVfQ0FDSEVEX0VNUFRZKTsKIAogICAgICAgICAgICAgLy8gQXBwIGlzbid0IHlldCBpZGxlLCBzbyB3ZSBzaG91bGQgYmUgYWJsZSB0byBzdGFydCB0aGUgc2VydmljZSBhZ2Fpbi4KICAgICAgICAgICAgIG1Db250ZXh0LnN0YXJ0U2VydmljZShtU2VydmljZUludGVudCk7Ci0gICAgICAgICAgICBjb25uLndhaXRGb3JDb25uZWN0KFdBSVRfVElNRSk7Ci0gICAgICAgICAgICBjb250cm9sbGVyLmdldFVpZFdhdGNoZXIoKS5leHBlY3QoV2F0Y2hVaWRSdW5uZXIuQ01EX1VOQ0FDSEVELCBudWxsLCBXQUlUX1RJTUUpOwotICAgICAgICAgICAgY29udHJvbGxlci5nZXRVaWRXYXRjaGVyKCkuZXhwZWN0KFdhdGNoVWlkUnVubmVyLkNNRF9QUk9DU1RBVEUsICJTVkMiLCBXQUlUX1RJTUUpOworICAgICAgICAgICAgY29ubi53YWl0Rm9yQ29ubmVjdCgpOworICAgICAgICAgICAgdWlkV2F0Y2hlci53YWl0Rm9yKFdhdGNoVWlkUnVubmVyLkNNRF9VTkNBQ0hFRCwgbnVsbCk7CisgICAgICAgICAgICB1aWRXYXRjaGVyLmV4cGVjdChXYXRjaFVpZFJ1bm5lci5DTURfUFJPQ1NUQVRFLCBXYXRjaFVpZFJ1bm5lci5TVEFURV9TRVJWSUNFKTsKIAogICAgICAgICAgICAgLy8gQW5kIG5vdyBmYXN0LWZvcndhcmQgdG8gdGhlIGFwcCBnb2luZyBpZGxlLCBzZXJ2aWNlIHNob3VsZCBiZSBzdG9wcGVkLgogICAgICAgICAgICAgY29udHJvbGxlci5tYWtlVWlkSWRsZSgpOwotICAgICAgICAgICAgY29udHJvbGxlci5nZXRVaWRXYXRjaGVyKCkud2FpdEZvcihXYXRjaFVpZFJ1bm5lci5DTURfSURMRSwgbnVsbCwgV0FJVF9USU1FKTsKKyAgICAgICAgICAgIHVpZFdhdGNoZXIud2FpdEZvcihXYXRjaFVpZFJ1bm5lci5DTURfSURMRSwgbnVsbCk7CiAKLSAgICAgICAgICAgIGNvbm4ud2FpdEZvckRpc2Nvbm5lY3QoV0FJVF9USU1FKTsKLSAgICAgICAgICAgIGNvbnRyb2xsZXIuZ2V0VWlkV2F0Y2hlcigpLndhaXRGb3IoV2F0Y2hVaWRSdW5uZXIuQ01EX0NBQ0hFRCwgbnVsbCwgV0FJVF9USU1FKTsKLSAgICAgICAgICAgIGNvbnRyb2xsZXIuZ2V0VWlkV2F0Y2hlcigpLmV4cGVjdChXYXRjaFVpZFJ1bm5lci5DTURfUFJPQ1NUQVRFLCAiQ0VNIiwgV0FJVF9USU1FKTsKKyAgICAgICAgICAgIGNvbm4ud2FpdEZvckRpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgIHVpZFdhdGNoZXIud2FpdEZvcihXYXRjaFVpZFJ1bm5lci5DTURfQ0FDSEVELCBudWxsKTsKKyAgICAgICAgICAgIHVpZFdhdGNoZXIuZXhwZWN0KFdhdGNoVWlkUnVubmVyLkNNRF9QUk9DU1RBVEUsIFdhdGNoVWlkUnVubmVyLlNUQVRFX0NBQ0hFRF9FTVBUWSk7CiAKICAgICAgICAgICAgIC8vIE5vIGxvbmdlciBzaG91bGQgYmUgYWJsZSB0byBzdGFydCBzZXJ2aWNlLgogICAgICAgICAgICAgYm9vbGVhbiBmYWlsZWQgPSBmYWxzZTsKQEAgLTgxNiwxNSArOTEzLDQ2MiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzU2NyZWVuSW50ZXJhY3RpdmUoKSB7Ci0gICAgICAgIGZpbmFsIFBvd2VyTWFuYWdlciBwb3dlck1hbmFnZXIgPQotICAgICAgICAgICAgICAgIChQb3dlck1hbmFnZXIpIG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5QT1dFUl9TRVJWSUNFKTsKLSAgICAgICAgcmV0dXJuIHBvd2VyTWFuYWdlci5pc0ludGVyYWN0aXZlKCk7CisgICAgLyoqCisgICAgICogVGVzdCB0aGF0IHRoZSBmb3JlZ3JvdW5kIHNlcnZpY2UgYXBwIG9wIGRvZXMgcHJldmVudCB0aGUgZm9yZWdyb3VuZCBzdGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9yZWdyb3VuZFNlcnZpY2VBcHBPcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBVc2UgZGVmYXVsdCB0aW1lb3V0IHZhbHVlIDUwMDAKKyAgICAgICAgZmluYWwgU2VydmljZVByb2Nlc3NDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBuZXcgU2VydmljZVByb2Nlc3NDb250cm9sbGVyKG1Db250ZXh0LAorICAgICAgICAgICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpLCBTVFVCX1BBQ0tBR0VfTkFNRSwgbUFsbFByb2Nlc3Nlcyk7CisgICAgICAgIC8vIFVzZSBkZWZhdWx0IHRpbWVvdXQgdmFsdWUgNTAwMAorICAgICAgICBmaW5hbCBTZXJ2aWNlQ29ubmVjdGlvbkhhbmRsZXIgY29ubiA9IG5ldyBTZXJ2aWNlQ29ubmVjdGlvbkhhbmRsZXIobUNvbnRleHQsCisgICAgICAgICAgICAgICAgbVNlcnZpY2VJbnRlbnQpOworICAgICAgICBmaW5hbCBXYXRjaFVpZFJ1bm5lciB1aWRXYXRjaGVyID0gY29udHJvbGxlci5nZXRVaWRXYXRjaGVyKCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEZpcnN0IGtpbGwgdGhlIHByb2Nlc3MgdG8gc3RhcnQgb3V0IGluIGEgc3RhYmxlIHN0YXRlLgorICAgICAgICAgICAgY29udHJvbGxlci5lbnN1cmVQcm9jZXNzR29uZSgpOworCisgICAgICAgICAgICAvLyBEbyBpbml0aWFsIHNldHVwLgorICAgICAgICAgICAgY29udHJvbGxlci5tYWtlVWlkSWRsZSgpOworICAgICAgICAgICAgY29udHJvbGxlci5yZW1vdmVGcm9tV2hpdGVsaXN0KCk7CisgICAgICAgICAgICBjb250cm9sbGVyLnNldEFwcE9wTW9kZShBcHBPcHNNYW5hZ2VyLk9QU1RSX1NUQVJUX0ZPUkVHUk9VTkQsICJhbGxvdyIpOworCisgICAgICAgICAgICAvLyBQdXQgYXBwIG9uIHdoaXRlbGlzdCwgdG8gYWxsb3cgc2VydmljZSB0byBydW4uCisgICAgICAgICAgICBjb250cm9sbGVyLmFkZFRvV2hpdGVsaXN0KCk7CisKKyAgICAgICAgICAgIC8vIFdlIHdpbGwgdXNlIHRoaXMgdG8gbW9uaXRvciB3aGVuIHRoZSBzZXJ2aWNlIGlzIHJ1bm5pbmcuCisgICAgICAgICAgICBjb25uLnN0YXJ0TW9uaXRvcmluZygpOworCisgICAgICAgICAgICAvLyAtLS0tLS0tLSBTVEFSVCBTRVJWSUNFIEFORCBUSEVOIFNVQ0NFU1NGVUxMWSBHTyBUTyBGT1JFR1JPVU5ECisKKyAgICAgICAgICAgIC8vIE5vdyBzdGFydCB0aGUgc2VydmljZSBhbmQgd2FpdCBmb3IgaXQgdG8gY29tZSB1cC4KKyAgICAgICAgICAgIG1Db250ZXh0LnN0YXJ0U2VydmljZShtU2VydmljZVN0YXJ0Rm9yZWdyb3VuZEludGVudCk7CisgICAgICAgICAgICBjb25uLndhaXRGb3JDb25uZWN0KCk7CisKKyAgICAgICAgICAgIC8vIEFsc28gbWFrZSBzdXJlIHRoZSB1aWQgc3RhdGUgcmVwb3J0cyBhcmUgYXMgZXhwZWN0ZWQuCisgICAgICAgICAgICB1aWRXYXRjaGVyLndhaXRGb3IoV2F0Y2hVaWRSdW5uZXIuQ01EX1VOQ0FDSEVELCBudWxsKTsKKyAgICAgICAgICAgIHVpZFdhdGNoZXIuZXhwZWN0KFdhdGNoVWlkUnVubmVyLkNNRF9QUk9DU1RBVEUsIFdhdGNoVWlkUnVubmVyLlNUQVRFX1NFUlZJQ0UpOworICAgICAgICAgICAgdWlkV2F0Y2hlci53YWl0Rm9yKFdhdGNoVWlkUnVubmVyLkNNRF9BQ1RJVkUsIG51bGwpOworICAgICAgICAgICAgdWlkV2F0Y2hlci5leHBlY3QoV2F0Y2hVaWRSdW5uZXIuQ01EX1BST0NTVEFURSwgV2F0Y2hVaWRSdW5uZXIuU1RBVEVfRkdfU0VSVklDRSk7CisKKyAgICAgICAgICAgIC8vIE5vdyB0YWtlIGl0IG91dCBvZiBmb3JlZ3JvdW5kIGFuZCBjb25maXJtLgorICAgICAgICAgICAgbUNvbnRleHQuc3RhcnRTZXJ2aWNlKG1TZXJ2aWNlU3RvcEZvcmVncm91bmRJbnRlbnQpOworICAgICAgICAgICAgdWlkV2F0Y2hlci5leHBlY3QoV2F0Y2hVaWRSdW5uZXIuQ01EX1BST0NTVEFURSwgV2F0Y2hVaWRSdW5uZXIuU1RBVEVfU0VSVklDRSk7CisKKyAgICAgICAgICAgIC8vIEdvb2QsIG5vdyBzdG9wIHRoZSBzZXJ2aWNlIGFuZCB3YWl0IGZvciBpdCB0byBnbyBhd2F5LgorICAgICAgICAgICAgbUNvbnRleHQuc3RvcFNlcnZpY2UobVNlcnZpY2VTdGFydEZvcmVncm91bmRJbnRlbnQpOworICAgICAgICAgICAgY29ubi53YWl0Rm9yRGlzY29ubmVjdCgpOworCisgICAgICAgICAgICAvLyBUaGVyZSBtYXkgYmUgYSB0cmFuc2llbnQgU1RBVEVfU0VSVklDRSB3ZSBkb24ndCBjYXJlIGFib3V0LCBzbyB3YWl0Rm9yLgorICAgICAgICAgICAgdWlkV2F0Y2hlci53YWl0Rm9yKFdhdGNoVWlkUnVubmVyLkNNRF9DQUNIRUQsIG51bGwpOworICAgICAgICAgICAgdWlkV2F0Y2hlci5leHBlY3QoV2F0Y2hVaWRSdW5uZXIuQ01EX1BST0NTVEFURSwgV2F0Y2hVaWRSdW5uZXIuU1RBVEVfQ0FDSEVEX0VNUFRZKTsKKworICAgICAgICAgICAgLy8gV2UgZG9uJ3Qgd2FudCB0byB3YWl0IGZvciB0aGUgdWlkIHRvIGFjdHVhbGx5IGdvIGlkbGUsIHdlIGNhbiBmb3JjZSBpdCBub3cuCisgICAgICAgICAgICBjb250cm9sbGVyLm1ha2VVaWRJZGxlKCk7CisgICAgICAgICAgICB1aWRXYXRjaGVyLmV4cGVjdChXYXRjaFVpZFJ1bm5lci5DTURfSURMRSwgbnVsbCk7CisKKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgcHJvY2VzcyBpcyBnb25lIHNvIHdlIHN0YXJ0IG92ZXIgZnJlc2guCisgICAgICAgICAgICBjb250cm9sbGVyLmVuc3VyZVByb2Nlc3NHb25lKCk7CisKKyAgICAgICAgICAgIC8vIC0tLS0tLS0tIFNUQVJUIFNFUlZJQ0UgQU5EIEJMT0NLIEdPSU5HIFRPIEZPUkVHUk9VTkQKKworICAgICAgICAgICAgLy8gTm93IHdlIHdpbGwgZGVueSB0aGUgYXBwIG9wIGFuZCBlbnN1cmUgdGhlIHNlcnZpY2UgY2FuJ3QgYmVjb21lIGZvcmVncm91bmQuCisgICAgICAgICAgICBjb250cm9sbGVyLnNldEFwcE9wTW9kZShBcHBPcHNNYW5hZ2VyLk9QU1RSX1NUQVJUX0ZPUkVHUk9VTkQsICJpZ25vcmUiKTsKKworICAgICAgICAgICAgLy8gTm93IHN0YXJ0IHRoZSBzZXJ2aWNlIGFuZCB3YWl0IGZvciBpdCB0byBjb21lIHVwLgorICAgICAgICAgICAgbUNvbnRleHQuc3RhcnRTZXJ2aWNlKG1TZXJ2aWNlU3RhcnRGb3JlZ3JvdW5kSW50ZW50KTsKKyAgICAgICAgICAgIGNvbm4ud2FpdEZvckNvbm5lY3QoKTsKKworICAgICAgICAgICAgLy8gQWxzbyBtYWtlIHN1cmUgdGhlIHVpZCBzdGF0ZSByZXBvcnRzIGFyZSBhcyBleHBlY3RlZC4KKyAgICAgICAgICAgIHVpZFdhdGNoZXIud2FpdEZvcihXYXRjaFVpZFJ1bm5lci5DTURfVU5DQUNIRUQsIG51bGwpOworICAgICAgICAgICAgdWlkV2F0Y2hlci5leHBlY3QoV2F0Y2hVaWRSdW5uZXIuQ01EX1BST0NTVEFURSwgV2F0Y2hVaWRSdW5uZXIuU1RBVEVfU0VSVklDRSk7CisKKyAgICAgICAgICAgIC8vIEdvb2QsIG5vdyBzdG9wIHRoZSBzZXJ2aWNlIGFuZCB3YWl0IGZvciBpdCB0byBnbyBhd2F5LgorICAgICAgICAgICAgbUNvbnRleHQuc3RvcFNlcnZpY2UobVNlcnZpY2VTdGFydEZvcmVncm91bmRJbnRlbnQpOworICAgICAgICAgICAgY29ubi53YWl0Rm9yRGlzY29ubmVjdCgpOworCisgICAgICAgICAgICAvLyBUSElTIE1VU1QgQkUgQU4gRVhQRUNUOiB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBnZXQgaW4gdG8gU1RBVEVfRkdfU0VSVklDRS4KKyAgICAgICAgICAgIHVpZFdhdGNoZXIuZXhwZWN0KFdhdGNoVWlkUnVubmVyLkNNRF9DQUNIRUQsIG51bGwpOworICAgICAgICAgICAgdWlkV2F0Y2hlci5leHBlY3QoV2F0Y2hVaWRSdW5uZXIuQ01EX1BST0NTVEFURSwgV2F0Y2hVaWRSdW5uZXIuU1RBVEVfQ0FDSEVEX0VNUFRZKTsKKworICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSB1aWQgaXMgaWRsZSAoaXQgc2hvdWxkIGJlIGFueXdheSwgaXQgbmV2ZXIgd2VudCBhY3RpdmUgaGVyZSkuCisgICAgICAgICAgICBjb250cm9sbGVyLm1ha2VVaWRJZGxlKCk7CisKKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgcHJvY2VzcyBpcyBnb25lIHNvIHdlIHN0YXJ0IG92ZXIgZnJlc2guCisgICAgICAgICAgICBjb250cm9sbGVyLmVuc3VyZVByb2Nlc3NHb25lKCk7CisKKyAgICAgICAgICAgIC8vIC0tLS0tLS0tIERJUkVDVCBTVEFSVCBGT1JFR1JPVU5EIFNFUlZJQ0UgU1VDQ0VTU0ZVTExZCisKKyAgICAgICAgICAgIGNvbnRyb2xsZXIuc2V0QXBwT3BNb2RlKEFwcE9wc01hbmFnZXIuT1BTVFJfU1RBUlRfRk9SRUdST1VORCwgImFsbG93Iik7CisKKyAgICAgICAgICAgIC8vIE5vdyBzdGFydCB0aGUgc2VydmljZSBhbmQgd2FpdCBmb3IgaXQgdG8gY29tZSB1cC4KKyAgICAgICAgICAgIG1Db250ZXh0LnN0YXJ0Rm9yZWdyb3VuZFNlcnZpY2UobVNlcnZpY2VTdGFydEZvcmVncm91bmRJbnRlbnQpOworICAgICAgICAgICAgY29ubi53YWl0Rm9yQ29ubmVjdCgpOworCisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgaXQgYmVjb21lcyBhIGZvcmVncm91bmQgc2VydmljZS4gIFRoZSBwcm9jZXNzIHN0YXRlIGNoYW5nZXMgaGVyZQorICAgICAgICAgICAgLy8gYXJlIHdlaXJkIGxvb2tpbmcgYmVjYXVzZSB3ZSBmaXJzdCBuZWVkIHRvIGZvcmNlIHRoZSBhcHAgb3V0IG9mIGlkbGUgdG8gYWxsb3cKKyAgICAgICAgICAgIC8vIGl0IHRvIHN0YXJ0IHRoZSBzZXJ2aWNlLgorICAgICAgICAgICAgdWlkV2F0Y2hlci53YWl0Rm9yKFdhdGNoVWlkUnVubmVyLkNNRF9BQ1RJVkUsIG51bGwpOworICAgICAgICAgICAgdWlkV2F0Y2hlci53YWl0Rm9yKFdhdGNoVWlkUnVubmVyLkNNRF9VTkNBQ0hFRCwgbnVsbCk7CisgICAgICAgICAgICB1aWRXYXRjaGVyLndhaXRGb3IoV2F0Y2hVaWRSdW5uZXIuQ01EX1BST0NTVEFURSwgV2F0Y2hVaWRSdW5uZXIuU1RBVEVfRkdfU0VSVklDRSk7CisgICAgICAgICAgICAvLyBSZW1vdmUgdGVtcHdoaXRlbGlzdCBhdm9pZCB0ZW1wIHdoaXRlIGxpc3QgYmxvY2sgaWRsZSBjb21tYW5kIGFuZCBhcHAgY3Jhc2ggb2NjdXIuCisgICAgICAgICAgICBleGVjdXRlU2hlbGxDbWQoImNtZCBkZXZpY2VpZGxlIHRlbXB3aGl0ZWxpc3QgLXIgIiArIFNJTVBMRV9QQUNLQUdFX05BTUUpOworICAgICAgICAgICAgLy8gR29vZCwgbm93IHN0b3AgdGhlIHNlcnZpY2UgYW5kIHdhaXQgZm9yIGl0IHRvIGdvIGF3YXkuCisgICAgICAgICAgICBtQ29udGV4dC5zdG9wU2VydmljZShtU2VydmljZVN0YXJ0Rm9yZWdyb3VuZEludGVudCk7CisgICAgICAgICAgICBjb25uLndhaXRGb3JEaXNjb25uZWN0KCk7CisKKyAgICAgICAgICAgIC8vIFRoZXJlIG1heSBiZSBhIHRyYW5zaWVudCBTVEFURV9TRVJWSUNFIHdlIGRvbid0IGNhcmUgYWJvdXQsIHNvIHdhaXRGb3IuCisgICAgICAgICAgICB1aWRXYXRjaGVyLndhaXRGb3IoV2F0Y2hVaWRSdW5uZXIuQ01EX0NBQ0hFRCwgbnVsbCk7CisgICAgICAgICAgICB1aWRXYXRjaGVyLmV4cGVjdChXYXRjaFVpZFJ1bm5lci5DTURfUFJPQ1NUQVRFLCBXYXRjaFVpZFJ1bm5lci5TVEFURV9DQUNIRURfRU1QVFkpOworCisgICAgICAgICAgICAvLyBXZSBkb24ndCB3YW50IHRvIHdhaXQgZm9yIHRoZSB1aWQgdG8gYWN0dWFsbHkgZ28gaWRsZSwgd2UgY2FuIGZvcmNlIGl0IG5vdy4KKyAgICAgICAgICAgIGNvbnRyb2xsZXIubWFrZVVpZElkbGUoKTsKKworICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBwcm9jZXNzIGlzIGdvbmUgc28gd2Ugc3RhcnQgb3ZlciBmcmVzaC4KKyAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5zdXJlUHJvY2Vzc0dvbmUoKTsKKworICAgICAgICAgICAgLy8gLS0tLS0tLS0gRElSRUNUIFNUQVJUIEZPUkVHUk9VTkQgU0VSVklDRSBCTE9DS0VECisKKyAgICAgICAgICAgIC8vIE5vdyB3ZSB3aWxsIGRlbnkgdGhlIGFwcCBvcCBhbmQgZW5zdXJlIHRoZSBzZXJ2aWNlIGNhbid0IGJlY29tZSBmb3JlZ3JvdW5kLgorICAgICAgICAgICAgY29udHJvbGxlci5zZXRBcHBPcE1vZGUoQXBwT3BzTWFuYWdlci5PUFNUUl9TVEFSVF9GT1JFR1JPVU5ELCAiaWdub3JlIik7CisKKyAgICAgICAgICAgIC8vIEJ1dCB3ZSB3aWxsIHB1dCBpdCBvbiB0aGUgd2hpdGVsaXN0IHNvIHRoZSBzZXJ2aWNlIGlzIHN0aWxsIGFsbG93ZWQgdG8gc3RhcnQuCisgICAgICAgICAgICBjb250cm9sbGVyLmFkZFRvV2hpdGVsaXN0KCk7CisKKyAgICAgICAgICAgIC8vIE5vdyBzdGFydCB0aGUgc2VydmljZSBhbmQgd2FpdCBmb3IgaXQgdG8gY29tZSB1cC4KKyAgICAgICAgICAgIG1Db250ZXh0LnN0YXJ0Rm9yZWdyb3VuZFNlcnZpY2UobVNlcnZpY2VTdGFydEZvcmVncm91bmRJbnRlbnQpOworICAgICAgICAgICAgY29ubi53YWl0Rm9yQ29ubmVjdCgpOworCisgICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2Ugd2Ugb25seSBnZXQgdG8gcnVuIGl0IGFzIGEgcmVndWxhciBzZXJ2aWNlLgorICAgICAgICAgICAgdWlkV2F0Y2hlci53YWl0Rm9yKFdhdGNoVWlkUnVubmVyLkNNRF9VTkNBQ0hFRCwgbnVsbCk7CisgICAgICAgICAgICB1aWRXYXRjaGVyLndhaXRGb3IoV2F0Y2hVaWRSdW5uZXIuQ01EX1BST0NTVEFURSwgV2F0Y2hVaWRSdW5uZXIuU1RBVEVfU0VSVklDRSk7CisKKyAgICAgICAgICAgIC8vIEdvb2QsIG5vdyBzdG9wIHRoZSBzZXJ2aWNlIGFuZCB3YWl0IGZvciBpdCB0byBnbyBhd2F5LgorICAgICAgICAgICAgbUNvbnRleHQuc3RvcFNlcnZpY2UobVNlcnZpY2VTdGFydEZvcmVncm91bmRJbnRlbnQpOworICAgICAgICAgICAgY29ubi53YWl0Rm9yRGlzY29ubmVjdCgpOworCisgICAgICAgICAgICAvLyBUSElTIE1VU1QgQkUgQU4gRVhQRUNUOiB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBnZXQgaW4gdG8gU1RBVEVfRkdfU0VSVklDRS4KKyAgICAgICAgICAgIHVpZFdhdGNoZXIuZXhwZWN0KFdhdGNoVWlkUnVubmVyLkNNRF9DQUNIRUQsIG51bGwpOworICAgICAgICAgICAgdWlkV2F0Y2hlci5leHBlY3QoV2F0Y2hVaWRSdW5uZXIuQ01EX1BST0NTVEFURSwgV2F0Y2hVaWRSdW5uZXIuU1RBVEVfQ0FDSEVEX0VNUFRZKTsKKworICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSB1aWQgaXMgaWRsZSAoaXQgc2hvdWxkIGJlIGFueXdheSwgaXQgbmV2ZXIgd2VudCBhY3RpdmUgaGVyZSkuCisgICAgICAgICAgICBjb250cm9sbGVyLm1ha2VVaWRJZGxlKCk7CisKKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgcHJvY2VzcyBpcyBnb25lIHNvIHdlIHN0YXJ0IG92ZXIgZnJlc2guCisgICAgICAgICAgICBjb250cm9sbGVyLmVuc3VyZVByb2Nlc3NHb25lKCk7CisKKyAgICAgICAgICAgIC8vIC0tLS0tLS0tIFhYWCBORUVEIFRPIFRFU1QgTk9OLVdISVRFTElTVCBDQVNFIFdIRVJFIE5PVEhJTkcgSEFQUEVOUworCisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBtQ29udGV4dC5zdG9wU2VydmljZShtU2VydmljZVN0YXJ0Rm9yZWdyb3VuZEludGVudCk7CisgICAgICAgICAgICBjb25uLnN0b3BNb25pdG9yaW5nSWZOZWVkZWQoKTsKKyAgICAgICAgICAgIGNvbnRyb2xsZXIuY2xlYW51cCgpOworICAgICAgICAgICAgY29udHJvbGxlci5zZXRBcHBPcE1vZGUoQXBwT3BzTWFuYWdlci5PUFNUUl9TVEFSVF9GT1JFR1JPVU5ELCAiYWxsb3ciKTsKKyAgICAgICAgICAgIGNvbnRyb2xsZXIucmVtb3ZlRnJvbVdoaXRlbGlzdCgpOworICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzS2V5Z3VhcmRMb2NrZWQoKSB7Ci0gICAgICAgIGZpbmFsIEtleWd1YXJkTWFuYWdlciBrZXlndWFyZE1hbmFnZXIgPQotICAgICAgICAgICAgICAgIChLZXlndWFyZE1hbmFnZXIpIG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5LRVlHVUFSRF9TRVJWSUNFKTsKLSAgICAgICAgcmV0dXJuIGtleWd1YXJkTWFuYWdlci5pc0tleWd1YXJkTG9ja2VkKCk7CisgICAgcHJpdmF0ZSBib29sZWFuIHN1cHBvcnRzQ2FudFNhdmVTdGF0ZSgpIHsKKyAgICAgICAgaWYgKG1Db250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCkuaGFzU3lzdGVtRmVhdHVyZSgKKyAgICAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlci5GRUFUVVJFX0NBTlRfU0FWRV9TVEFURSkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gTW9zdCB0eXBlcyBvZiBkZXZpY2VzIG5lZWQgdG8gc3VwcG9ydCB0aGlzLgorICAgICAgICBpbnQgbW9kZSA9IG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldENvbmZpZ3VyYXRpb24oKS51aU1vZGUKKyAgICAgICAgICAgICAgICAmIENvbmZpZ3VyYXRpb24uVUlfTU9ERV9UWVBFX01BU0s7CisgICAgICAgIGlmIChtb2RlICE9IENvbmZpZ3VyYXRpb24uVUlfTU9ERV9UWVBFX1dBVENICisgICAgICAgICAgICAgICAgJiYgbW9kZSAhPSBDb25maWd1cmF0aW9uLlVJX01PREVfVFlQRV9BUFBMSUFOQ0UpIHsKKyAgICAgICAgICAgIC8vIE1vc3QgZGV2aWNlcyBtdXN0IHN1cHBvcnQgdGhlIGNhbid0IHNhdmUgc3RhdGUgZmVhdHVyZS4KKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkRldmljZXMgdGhhdCBhcmUgbm90IHdhdGNoZXMgb3IgYXBwbGlhbmNlcyBtdXN0ICIKKyAgICAgICAgICAgICAgICAgICAgKyAic3VwcG9ydCBGRUFUVVJFX0NBTlRfU0FWRV9TVEFURSIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoYXQgYSBzaW5nbGUgImNhbid0IHNhdmUgc3RhdGUiIGFwcCBoYXMgdGhlIHByb3BlciBwcm9jZXNzIG1hbmFnZW1lbnQKKyAgICAgKiBzZW1hbnRpY3MuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENhbnRTYXZlU3RhdGVMYXVuY2hBbmRCYWNrZ3JvdW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghc3VwcG9ydHNDYW50U2F2ZVN0YXRlKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIEludGVudCBhY3Rpdml0eUludGVudCA9IG5ldyBJbnRlbnQoKTsKKyAgICAgICAgYWN0aXZpdHlJbnRlbnQuc2V0UGFja2FnZShDQU5UX1NBVkVfU1RBVEVfMV9QQUNLQUdFX05BTUUpOworICAgICAgICBhY3Rpdml0eUludGVudC5zZXRBY3Rpb24oSW50ZW50LkFDVElPTl9NQUlOKTsKKyAgICAgICAgYWN0aXZpdHlJbnRlbnQuYWRkQ2F0ZWdvcnkoSW50ZW50LkNBVEVHT1JZX0xBVU5DSEVSKTsKKyAgICAgICAgYWN0aXZpdHlJbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOworCisgICAgICAgIGZpbmFsIEludGVudCBob21lSW50ZW50ID0gbmV3IEludGVudCgpOworICAgICAgICBob21lSW50ZW50LnNldEFjdGlvbihJbnRlbnQuQUNUSU9OX01BSU4pOworICAgICAgICBob21lSW50ZW50LmFkZENhdGVnb3J5KEludGVudC5DQVRFR09SWV9IT01FKTsKKyAgICAgICAgaG9tZUludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7CisKKyAgICAgICAgQWN0aXZpdHlNYW5hZ2VyIGFtID0gbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShBY3Rpdml0eU1hbmFnZXIuY2xhc3MpOworCisgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLmdldFVpQXV0b21hdGlvbigpLmdyYW50UnVudGltZVBlcm1pc3Npb24oCisgICAgICAgICAgICAgICAgU1RVQl9QQUNLQUdFX05BTUUsIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5QQUNLQUdFX1VTQUdFX1NUQVRTKTsKKworICAgICAgICAvLyBXZSBkb24ndCB3YW50IHRvIHdhaXQgZm9yIHRoZSB1aWQgdG8gYWN0dWFsbHkgZ28gaWRsZSwgd2UgY2FuIGZvcmNlIGl0IG5vdy4KKyAgICAgICAgU3RyaW5nIGNtZCA9ICJhbSBtYWtlLXVpZC1pZGxlICIgKyBDQU5UX1NBVkVfU1RBVEVfMV9QQUNLQUdFX05BTUU7CisgICAgICAgIFN0cmluZyByZXN1bHQgPSBTeXN0ZW1VdGlsLnJ1blNoZWxsQ29tbWFuZChnZXRJbnN0cnVtZW50YXRpb24oKSwgY21kKTsKKworICAgICAgICBBcHBsaWNhdGlvbkluZm8gYXBwSW5mbyA9IG1Db250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCkuZ2V0QXBwbGljYXRpb25JbmZvKAorICAgICAgICAgICAgICAgIENBTlRfU0FWRV9TVEFURV8xX1BBQ0tBR0VfTkFNRSwgMCk7CisKKyAgICAgICAgLy8gVGhpcyB0ZXN0IGlzIGFsc28gdXNpbmcgVWlkSW1wb3J0YW5jZUxpc3RlbmVyIHRvIG1ha2Ugc3VyZSB0aGUgY29ycmVjdAorICAgICAgICAvLyBoZWF2eS13ZWlnaHQgc3RhdGUgaXMgcmVwb3J0ZWQgdGhlcmUuCisgICAgICAgIFVpZEltcG9ydGFuY2VMaXN0ZW5lciB1aWRGb3JlZ3JvdW5kTGlzdGVuZXIgPSBuZXcgVWlkSW1wb3J0YW5jZUxpc3RlbmVyKG1Db250ZXh0LAorICAgICAgICAgICAgICAgIGFwcEluZm8udWlkLCBBY3Rpdml0eU1hbmFnZXIuUnVubmluZ0FwcFByb2Nlc3NJbmZvLklNUE9SVEFOQ0VfRk9SRUdST1VORCwKKyAgICAgICAgICAgICAgICBXQUlUX1RJTUUpOworICAgICAgICB1aWRGb3JlZ3JvdW5kTGlzdGVuZXIucmVnaXN0ZXIoKTsKKyAgICAgICAgVWlkSW1wb3J0YW5jZUxpc3RlbmVyIHVpZEJhY2tncm91bmRMaXN0ZW5lciA9IG5ldyBVaWRJbXBvcnRhbmNlTGlzdGVuZXIobUNvbnRleHQsCisgICAgICAgICAgICAgICAgYXBwSW5mby51aWQsIEFjdGl2aXR5TWFuYWdlci5SdW5uaW5nQXBwUHJvY2Vzc0luZm8uSU1QT1JUQU5DRV9DQU5UX1NBVkVfU1RBVEUtMSwKKyAgICAgICAgICAgICAgICBXQUlUX1RJTUUpOworICAgICAgICB1aWRCYWNrZ3JvdW5kTGlzdGVuZXIucmVnaXN0ZXIoKTsKKworICAgICAgICBXYXRjaFVpZFJ1bm5lciB1aWRXYXRjaGVyID0gbmV3IFdhdGNoVWlkUnVubmVyKGdldEluc3RydW1lbnRhdGlvbigpLCBhcHBJbmZvLnVpZCwKKyAgICAgICAgICAgICAgICBXQUlUX1RJTUUpOworCisgICAgICAgIFVpRGV2aWNlIGRldmljZSA9IFVpRGV2aWNlLmdldEluc3RhbmNlKGdldEluc3RydW1lbnRhdGlvbigpKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gU3RhcnQgdGhlIGhlYXZ5LXdlaWdodCBhcHAsIHNob3VsZCBsYXVuY2ggbGlrZSBhIG5vcm1hbCBhcHAuCisgICAgICAgICAgICBtQ29udGV4dC5zdGFydEFjdGl2aXR5KGFjdGl2aXR5SW50ZW50KTsKKyAgICAgICAgICAgIHdhaXRGb3JBcHBGb2N1cyhDQU5UX1NBVkVfU1RBVEVfMV9QQUNLQUdFX05BTUUsIFdBSVRfVElNRSk7CisgICAgICAgICAgICBkZXZpY2Uud2FpdEZvcklkbGUoKTsKKworICAgICAgICAgICAgLy8gV2FpdCBmb3IgcHJvY2VzcyBzdGF0ZSB0byByZWZsZWN0IHJ1bm5pbmcgYWN0aXZpdHkuCisgICAgICAgICAgICB1aWRGb3JlZ3JvdW5kTGlzdGVuZXIud2FpdEZvclZhbHVlKAorICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXIuUnVubmluZ0FwcFByb2Nlc3NJbmZvLklNUE9SVEFOQ0VfRk9SRUdST1VORCwKKyAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyLlJ1bm5pbmdBcHBQcm9jZXNzSW5mby5JTVBPUlRBTkNFX0ZPUkVHUk9VTkQpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEFjdGl2aXR5TWFuYWdlci5SdW5uaW5nQXBwUHJvY2Vzc0luZm8uSU1QT1JUQU5DRV9GT1JFR1JPVU5ELAorICAgICAgICAgICAgICAgICAgICBhbS5nZXRQYWNrYWdlSW1wb3J0YW5jZShDQU5UX1NBVkVfU1RBVEVfMV9QQUNLQUdFX05BTUUpKTsKKworICAgICAgICAgICAgLy8gQWxzbyBtYWtlIHN1cmUgdGhlIHVpZCBzdGF0ZSByZXBvcnRzIGFyZSBhcyBleHBlY3RlZC4KKyAgICAgICAgICAgIHVpZFdhdGNoZXIud2FpdEZvcihXYXRjaFVpZFJ1bm5lci5DTURfQUNUSVZFLCBudWxsKTsKKyAgICAgICAgICAgIHVpZFdhdGNoZXIud2FpdEZvcihXYXRjaFVpZFJ1bm5lci5DTURfVU5DQUNIRUQsIG51bGwpOworICAgICAgICAgICAgdWlkV2F0Y2hlci5leHBlY3QoV2F0Y2hVaWRSdW5uZXIuQ01EX1BST0NTVEFURSwgV2F0Y2hVaWRSdW5uZXIuU1RBVEVfVE9QKTsKKworICAgICAgICAgICAgLy8gTm93IGdvIHRvIGhvbWUsIGxlYXZpbmcgdGhlIGFwcC4gIEl0IHNob3VsZCBiZSBwdXQgaW4gdGhlIGhlYXZ5IHdlaWdodCBzdGF0ZS4KKyAgICAgICAgICAgIG1Db250ZXh0LnN0YXJ0QWN0aXZpdHkoaG9tZUludGVudCk7CisKKyAgICAgICAgICAgIC8vIFdhaXQgZm9yIHByb2Nlc3MgdG8gZ28gZG93biB0byBiYWNrZ3JvdW5kIGhlYXZ5LXdlaWdodC4KKyAgICAgICAgICAgIHVpZEJhY2tncm91bmRMaXN0ZW5lci53YWl0Rm9yVmFsdWUoCisgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5TWFuYWdlci5SdW5uaW5nQXBwUHJvY2Vzc0luZm8uSU1QT1JUQU5DRV9DQU5UX1NBVkVfU1RBVEUsCisgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5TWFuYWdlci5SdW5uaW5nQXBwUHJvY2Vzc0luZm8uSU1QT1JUQU5DRV9DQU5UX1NBVkVfU1RBVEUpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEFjdGl2aXR5TWFuYWdlci5SdW5uaW5nQXBwUHJvY2Vzc0luZm8uSU1QT1JUQU5DRV9DQU5UX1NBVkVfU1RBVEUsCisgICAgICAgICAgICAgICAgICAgIGFtLmdldFBhY2thZ2VJbXBvcnRhbmNlKENBTlRfU0FWRV9TVEFURV8xX1BBQ0tBR0VfTkFNRSkpOworCisgICAgICAgICAgICB1aWRXYXRjaGVyLmV4cGVjdChXYXRjaFVpZFJ1bm5lci5DTURfQ0FDSEVELCBudWxsKTsKKyAgICAgICAgICAgIHVpZFdhdGNoZXIuZXhwZWN0KFdhdGNoVWlkUnVubmVyLkNNRF9QUk9DU1RBVEUsIFdhdGNoVWlkUnVubmVyLlNUQVRFX0hFQVZZX1dFSUdIVCk7CisKKyAgICAgICAgICAgIC8vIFdoaWxlIGluIGJhY2tncm91bmQsIHNob3VsZCBnbyBpbiB0byBub3JtYWwgaWRsZSBzdGF0ZS4KKyAgICAgICAgICAgIC8vIEZvcmNlIGFwcCB0byBnbyBpZGxlIG5vdworICAgICAgICAgICAgY21kID0gImFtIG1ha2UtdWlkLWlkbGUgIiArIENBTlRfU0FWRV9TVEFURV8xX1BBQ0tBR0VfTkFNRTsKKyAgICAgICAgICAgIHJlc3VsdCA9IFN5c3RlbVV0aWwucnVuU2hlbGxDb21tYW5kKGdldEluc3RydW1lbnRhdGlvbigpLCBjbWQpOworICAgICAgICAgICAgdWlkV2F0Y2hlci5leHBlY3QoV2F0Y2hVaWRSdW5uZXIuQ01EX0lETEUsIG51bGwpOworCisgICAgICAgICAgICAvLyBTd2l0Y2ggYmFjayB0byBoZWF2eS13ZWlnaHQgYXBwIHRvIHNlZSBpZiBpdCBjb3JyZWN0bHkgcmV0dXJucyB0byBmb3JlZ3JvdW5kLgorICAgICAgICAgICAgbUNvbnRleHQuc3RhcnRBY3Rpdml0eShhY3Rpdml0eUludGVudCk7CisKKyAgICAgICAgICAgIC8vIFdhaXQgZm9yIHByb2Nlc3Mgc3RhdGUgdG8gcmVmbGVjdCBydW5uaW5nIGFjdGl2aXR5LgorICAgICAgICAgICAgdWlkRm9yZWdyb3VuZExpc3RlbmVyLndhaXRGb3JWYWx1ZSgKKyAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyLlJ1bm5pbmdBcHBQcm9jZXNzSW5mby5JTVBPUlRBTkNFX0ZPUkVHUk9VTkQsCisgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5TWFuYWdlci5SdW5uaW5nQXBwUHJvY2Vzc0luZm8uSU1QT1JUQU5DRV9GT1JFR1JPVU5EKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhBY3Rpdml0eU1hbmFnZXIuUnVubmluZ0FwcFByb2Nlc3NJbmZvLklNUE9SVEFOQ0VfRk9SRUdST1VORCwKKyAgICAgICAgICAgICAgICAgICAgYW0uZ2V0UGFja2FnZUltcG9ydGFuY2UoQ0FOVF9TQVZFX1NUQVRFXzFfUEFDS0FHRV9OQU1FKSk7CisKKyAgICAgICAgICAgIC8vIEFsc28gbWFrZSBzdXJlIHRoZSB1aWQgc3RhdGUgcmVwb3J0cyBhcmUgYXMgZXhwZWN0ZWQuCisgICAgICAgICAgICB1aWRXYXRjaGVyLndhaXRGb3IoV2F0Y2hVaWRSdW5uZXIuQ01EX0FDVElWRSwgbnVsbCk7CisgICAgICAgICAgICB1aWRXYXRjaGVyLndhaXRGb3IoV2F0Y2hVaWRSdW5uZXIuQ01EX1VOQ0FDSEVELCBudWxsKTsKKyAgICAgICAgICAgIHVpZFdhdGNoZXIuZXhwZWN0KFdhdGNoVWlkUnVubmVyLkNNRF9QUk9DU1RBVEUsIFdhdGNoVWlkUnVubmVyLlNUQVRFX1RPUCk7CisKKyAgICAgICAgICAgIHdhaXRGb3JBcHBGb2N1cyhDQU5UX1NBVkVfU1RBVEVfMV9QQUNLQUdFX05BTUUsIFdBSVRfVElNRSk7CisgICAgICAgICAgICBkZXZpY2Uud2FpdEZvcklkbGUoKTsKKworICAgICAgICAgICAgLy8gRXhpdCBhY3Rpdml0eSwgY2hlY2sgdG8gc2VlIGlmIHdlIGFyZSBub3cgY2FjaGVkLgorICAgICAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VWlBdXRvbWF0aW9uKCkucGVyZm9ybUdsb2JhbEFjdGlvbigKKyAgICAgICAgICAgICAgICAgICAgQWNjZXNzaWJpbGl0eVNlcnZpY2UuR0xPQkFMX0FDVElPTl9CQUNLKTsKKworICAgICAgICAgICAgLy8gV2FpdCBmb3IgcHJvY2VzcyB0byBiZWNvbWUgY2FjaGVkCisgICAgICAgICAgICB1aWRCYWNrZ3JvdW5kTGlzdGVuZXIud2FpdEZvclZhbHVlKAorICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXIuUnVubmluZ0FwcFByb2Nlc3NJbmZvLklNUE9SVEFOQ0VfQ0FDSEVELAorICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXIuUnVubmluZ0FwcFByb2Nlc3NJbmZvLklNUE9SVEFOQ0VfQ0FDSEVEKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhBY3Rpdml0eU1hbmFnZXIuUnVubmluZ0FwcFByb2Nlc3NJbmZvLklNUE9SVEFOQ0VfQ0FDSEVELAorICAgICAgICAgICAgICAgICAgICBhbS5nZXRQYWNrYWdlSW1wb3J0YW5jZShDQU5UX1NBVkVfU1RBVEVfMV9QQUNLQUdFX05BTUUpKTsKKworICAgICAgICAgICAgdWlkV2F0Y2hlci5leHBlY3QoV2F0Y2hVaWRSdW5uZXIuQ01EX0NBQ0hFRCwgbnVsbCk7CisgICAgICAgICAgICB1aWRXYXRjaGVyLmV4cGVjdChXYXRjaFVpZFJ1bm5lci5DTURfUFJPQ1NUQVRFLCBXYXRjaFVpZFJ1bm5lci5TVEFURV9DQUNIRURfUkVDRU5UKTsKKworICAgICAgICAgICAgLy8gV2hpbGUgaW4gYmFja2dyb3VuZCwgc2hvdWxkIGdvIGluIHRvIG5vcm1hbCBpZGxlIHN0YXRlLgorICAgICAgICAgICAgLy8gRm9yY2UgYXBwIHRvIGdvIGlkbGUgbm93CisgICAgICAgICAgICBjbWQgPSAiYW0gbWFrZS11aWQtaWRsZSAiICsgQ0FOVF9TQVZFX1NUQVRFXzFfUEFDS0FHRV9OQU1FOworICAgICAgICAgICAgcmVzdWx0ID0gU3lzdGVtVXRpbC5ydW5TaGVsbENvbW1hbmQoZ2V0SW5zdHJ1bWVudGF0aW9uKCksIGNtZCk7CisgICAgICAgICAgICB1aWRXYXRjaGVyLmV4cGVjdChXYXRjaFVpZFJ1bm5lci5DTURfSURMRSwgbnVsbCk7CisKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHVpZFdhdGNoZXIuZmluaXNoKCk7CisgICAgICAgICAgICB1aWRGb3JlZ3JvdW5kTGlzdGVuZXIudW5yZWdpc3RlcigpOworICAgICAgICAgICAgdWlkQmFja2dyb3VuZExpc3RlbmVyLnVucmVnaXN0ZXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhhdCBzd2l0Y2hpbmcgYmV0d2VlbiB0d28gImNhbid0IHNhdmUgc3RhdGUiIGFwcHMgaXMgaGFuZGxlZCBwcm9wZXJseS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FudFNhdmVTdGF0ZUxhdW5jaEFuZFN3aXRjaCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIXN1cHBvcnRzQ2FudFNhdmVTdGF0ZSgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBJbnRlbnQgYWN0aXZpdHkxSW50ZW50ID0gbmV3IEludGVudCgpOworICAgICAgICBhY3Rpdml0eTFJbnRlbnQuc2V0UGFja2FnZShDQU5UX1NBVkVfU1RBVEVfMV9QQUNLQUdFX05BTUUpOworICAgICAgICBhY3Rpdml0eTFJbnRlbnQuc2V0QWN0aW9uKEludGVudC5BQ1RJT05fTUFJTik7CisgICAgICAgIGFjdGl2aXR5MUludGVudC5hZGRDYXRlZ29yeShJbnRlbnQuQ0FURUdPUllfTEFVTkNIRVIpOworICAgICAgICBhY3Rpdml0eTFJbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOworCisgICAgICAgIGZpbmFsIEludGVudCBhY3Rpdml0eTJJbnRlbnQgPSBuZXcgSW50ZW50KCk7CisgICAgICAgIGFjdGl2aXR5MkludGVudC5zZXRQYWNrYWdlKENBTlRfU0FWRV9TVEFURV8yX1BBQ0tBR0VfTkFNRSk7CisgICAgICAgIGFjdGl2aXR5MkludGVudC5zZXRBY3Rpb24oSW50ZW50LkFDVElPTl9NQUlOKTsKKyAgICAgICAgYWN0aXZpdHkySW50ZW50LmFkZENhdGVnb3J5KEludGVudC5DQVRFR09SWV9MQVVOQ0hFUik7CisgICAgICAgIGFjdGl2aXR5MkludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7CisKKyAgICAgICAgZmluYWwgSW50ZW50IGhvbWVJbnRlbnQgPSBuZXcgSW50ZW50KCk7CisgICAgICAgIGhvbWVJbnRlbnQuc2V0QWN0aW9uKEludGVudC5BQ1RJT05fTUFJTik7CisgICAgICAgIGhvbWVJbnRlbnQuYWRkQ2F0ZWdvcnkoSW50ZW50LkNBVEVHT1JZX0hPTUUpOworICAgICAgICBob21lSW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLKTsKKworICAgICAgICBBY3Rpdml0eU1hbmFnZXIgYW0gPSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKEFjdGl2aXR5TWFuYWdlci5jbGFzcyk7CisgICAgICAgIFVpRGV2aWNlIGRldmljZSA9IFVpRGV2aWNlLmdldEluc3RhbmNlKGdldEluc3RydW1lbnRhdGlvbigpKTsKKworICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKS5nZXRVaUF1dG9tYXRpb24oKS5ncmFudFJ1bnRpbWVQZXJtaXNzaW9uKAorICAgICAgICAgICAgICAgIFNUVUJfUEFDS0FHRV9OQU1FLCBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uUEFDS0FHRV9VU0FHRV9TVEFUUyk7CisKKyAgICAgICAgLy8gV2UgZG9uJ3Qgd2FudCB0byB3YWl0IGZvciB0aGUgdWlkIHRvIGFjdHVhbGx5IGdvIGlkbGUsIHdlIGNhbiBmb3JjZSBpdCBub3cuCisgICAgICAgIFN0cmluZyBjbWQgPSAiYW0gbWFrZS11aWQtaWRsZSAiICsgQ0FOVF9TQVZFX1NUQVRFXzFfUEFDS0FHRV9OQU1FOworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gU3lzdGVtVXRpbC5ydW5TaGVsbENvbW1hbmQoZ2V0SW5zdHJ1bWVudGF0aW9uKCksIGNtZCk7CisgICAgICAgIGNtZCA9ICJhbSBtYWtlLXVpZC1pZGxlICIgKyBDQU5UX1NBVkVfU1RBVEVfMl9QQUNLQUdFX05BTUU7CisgICAgICAgIHJlc3VsdCA9IFN5c3RlbVV0aWwucnVuU2hlbGxDb21tYW5kKGdldEluc3RydW1lbnRhdGlvbigpLCBjbWQpOworCisgICAgICAgIEFwcGxpY2F0aW9uSW5mbyBhcHAxSW5mbyA9IG1Db250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCkuZ2V0QXBwbGljYXRpb25JbmZvKAorICAgICAgICAgICAgICAgIENBTlRfU0FWRV9TVEFURV8xX1BBQ0tBR0VfTkFNRSwgMCk7CisgICAgICAgIFdhdGNoVWlkUnVubmVyIHVpZDFXYXRjaGVyID0gbmV3IFdhdGNoVWlkUnVubmVyKGdldEluc3RydW1lbnRhdGlvbigpLCBhcHAxSW5mby51aWQsCisgICAgICAgICAgICAgICAgV0FJVF9USU1FKTsKKworICAgICAgICBBcHBsaWNhdGlvbkluZm8gYXBwMkluZm8gPSBtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpLmdldEFwcGxpY2F0aW9uSW5mbygKKyAgICAgICAgICAgICAgICBDQU5UX1NBVkVfU1RBVEVfMl9QQUNLQUdFX05BTUUsIDApOworICAgICAgICBXYXRjaFVpZFJ1bm5lciB1aWQyV2F0Y2hlciA9IG5ldyBXYXRjaFVpZFJ1bm5lcihnZXRJbnN0cnVtZW50YXRpb24oKSwgYXBwMkluZm8udWlkLAorICAgICAgICAgICAgICAgIFdBSVRfVElNRSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIFN0YXJ0IHRoZSBmaXJzdCBoZWF2eS13ZWlnaHQgYXBwLCBzaG91bGQgbGF1bmNoIGxpa2UgYSBub3JtYWwgYXBwLgorICAgICAgICAgICAgbUNvbnRleHQuc3RhcnRBY3Rpdml0eShhY3Rpdml0eTFJbnRlbnQpOworICAgICAgICAgICAgd2FpdEZvckFwcEZvY3VzKENBTlRfU0FWRV9TVEFURV8xX1BBQ0tBR0VfTkFNRSwgV0FJVF9USU1FKTsKKyAgICAgICAgICAgIGRldmljZS53YWl0Rm9ySWRsZSgpOworCisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHVpZCBzdGF0ZSByZXBvcnRzIGFyZSBhcyBleHBlY3RlZC4KKyAgICAgICAgICAgIHVpZDFXYXRjaGVyLndhaXRGb3IoV2F0Y2hVaWRSdW5uZXIuQ01EX0FDVElWRSwgbnVsbCk7CisgICAgICAgICAgICB1aWQxV2F0Y2hlci53YWl0Rm9yKFdhdGNoVWlkUnVubmVyLkNNRF9VTkNBQ0hFRCwgbnVsbCk7CisgICAgICAgICAgICB1aWQxV2F0Y2hlci5leHBlY3QoV2F0Y2hVaWRSdW5uZXIuQ01EX1BST0NTVEFURSwgV2F0Y2hVaWRSdW5uZXIuU1RBVEVfVE9QKTsKKworICAgICAgICAgICAgLy8gTm93IGdvIHRvIGhvbWUsIGxlYXZpbmcgdGhlIGFwcC4gIEl0IHNob3VsZCBiZSBwdXQgaW4gdGhlIGhlYXZ5IHdlaWdodCBzdGF0ZS4KKyAgICAgICAgICAgIG1Db250ZXh0LnN0YXJ0QWN0aXZpdHkoaG9tZUludGVudCk7CisKKyAgICAgICAgICAgIC8vIFdhaXQgZm9yIHByb2Nlc3MgdG8gZ28gZG93biB0byBiYWNrZ3JvdW5kIGhlYXZ5LXdlaWdodC4KKyAgICAgICAgICAgIHVpZDFXYXRjaGVyLmV4cGVjdChXYXRjaFVpZFJ1bm5lci5DTURfQ0FDSEVELCBudWxsKTsKKyAgICAgICAgICAgIHVpZDFXYXRjaGVyLmV4cGVjdChXYXRjaFVpZFJ1bm5lci5DTURfUFJPQ1NUQVRFLCBXYXRjaFVpZFJ1bm5lci5TVEFURV9IRUFWWV9XRUlHSFQpOworCisgICAgICAgICAgICAvLyBTdGFydCB0aGUgc2Vjb25kIGhlYXZ5LXdlaWdodCBhcHAsIHNob3VsZCBhc2sgdXMgd2hhdCB0byBkbyB3aXRoIHRoZSB0d28gYXBwcworICAgICAgICAgICAgc3RhcnRBY3Rpdml0eUFuZFdhaXRGb3JTaG93KGFjdGl2aXR5MkludGVudCk7CisKKyAgICAgICAgICAgIC8vIEZpcnN0LCBsZXQncyB0cnkgcmV0dXJuaW5nIHRvIHRoZSBvcmlnaW5hbCBhcHAuCisgICAgICAgICAgICBtYXliZUNsaWNrKGRldmljZSwgbmV3IFVpU2VsZWN0b3IoKS5yZXNvdXJjZUlkKCJhbmRyb2lkOmlkL3N3aXRjaF9vbGQiKSk7CisgICAgICAgICAgICB3YWl0Rm9yQXBwRm9jdXMoQ0FOVF9TQVZFX1NUQVRFXzFfUEFDS0FHRV9OQU1FLCBXQUlUX1RJTUUpOworICAgICAgICAgICAgZGV2aWNlLndhaXRGb3JJZGxlKCk7CisKKyAgICAgICAgICAgIC8vIEFwcCBzaG91bGQgbm93IGJlIGJhY2sgaW4gZm9yZWdyb3VuZC4KKyAgICAgICAgICAgIHVpZDFXYXRjaGVyLmV4cGVjdChXYXRjaFVpZFJ1bm5lci5DTURfVU5DQUNIRUQsIG51bGwpOworICAgICAgICAgICAgdWlkMVdhdGNoZXIuZXhwZWN0KFdhdGNoVWlkUnVubmVyLkNNRF9QUk9DU1RBVEUsIFdhdGNoVWlkUnVubmVyLlNUQVRFX1RPUCk7CisKKyAgICAgICAgICAgIC8vIFJldHVybiB0byBob21lLgorICAgICAgICAgICAgbUNvbnRleHQuc3RhcnRBY3Rpdml0eShob21lSW50ZW50KTsKKyAgICAgICAgICAgIHVpZDFXYXRjaGVyLmV4cGVjdChXYXRjaFVpZFJ1bm5lci5DTURfQ0FDSEVELCBudWxsKTsKKyAgICAgICAgICAgIHVpZDFXYXRjaGVyLmV4cGVjdChXYXRjaFVpZFJ1bm5lci5DTURfUFJPQ1NUQVRFLCBXYXRjaFVpZFJ1bm5lci5TVEFURV9IRUFWWV9XRUlHSFQpOworCisgICAgICAgICAgICAvLyBBZ2FpbiB0cnkgc3RhcnRpbmcgc2Vjb25kIGhlYXZ5LXdlaWdodCBhcHAgdG8gZ2V0IHByb21wdC4KKyAgICAgICAgICAgIHN0YXJ0QWN0aXZpdHlBbmRXYWl0Rm9yU2hvdyhhY3Rpdml0eTJJbnRlbnQpOworCisgICAgICAgICAgICAvLyBOb3cgd2UnbGwgc3dpdGNoIHRvIHRoZSBuZXcgYXBwLgorICAgICAgICAgICAgbWF5YmVDbGljayhkZXZpY2UsIG5ldyBVaVNlbGVjdG9yKCkucmVzb3VyY2VJZCgiYW5kcm9pZDppZC9zd2l0Y2hfbmV3IikpOworICAgICAgICAgICAgd2FpdEZvckFwcEZvY3VzKENBTlRfU0FWRV9TVEFURV8yX1BBQ0tBR0VfTkFNRSwgV0FJVF9USU1FKTsKKyAgICAgICAgICAgIGRldmljZS53YWl0Rm9ySWRsZSgpOworCisgICAgICAgICAgICAvLyBUaGUgb3JpZ2luYWwgYXBwIHNob3VsZCBub3cgYmVjb21lIGNhY2hlZC4KKyAgICAgICAgICAgIHVpZDFXYXRjaGVyLmV4cGVjdChXYXRjaFVpZFJ1bm5lci5DTURfUFJPQ1NUQVRFLCBXYXRjaFVpZFJ1bm5lci5TVEFURV9DQUNIRURfUkVDRU5UKTsKKworICAgICAgICAgICAgLy8gQW5kIHRoZSBuZXcgYXBwIHNob3VsZCBzdGFydC4KKyAgICAgICAgICAgIHVpZDJXYXRjaGVyLndhaXRGb3IoV2F0Y2hVaWRSdW5uZXIuQ01EX0FDVElWRSwgbnVsbCk7CisgICAgICAgICAgICB1aWQyV2F0Y2hlci53YWl0Rm9yKFdhdGNoVWlkUnVubmVyLkNNRF9VTkNBQ0hFRCwgbnVsbCk7CisgICAgICAgICAgICB1aWQyV2F0Y2hlci5leHBlY3QoV2F0Y2hVaWRSdW5uZXIuQ01EX1BST0NTVEFURSwgV2F0Y2hVaWRSdW5uZXIuU1RBVEVfVE9QKTsKKworICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBvcmlnaW5hbCBhcHAgaXMgaWRsZSBmb3IgY2xlYW5saW5lc3MKKyAgICAgICAgICAgIGNtZCA9ICJhbSBtYWtlLXVpZC1pZGxlICIgKyBDQU5UX1NBVkVfU1RBVEVfMV9QQUNLQUdFX05BTUU7CisgICAgICAgICAgICByZXN1bHQgPSBTeXN0ZW1VdGlsLnJ1blNoZWxsQ29tbWFuZChnZXRJbnN0cnVtZW50YXRpb24oKSwgY21kKTsKKyAgICAgICAgICAgIHVpZDFXYXRjaGVyLmV4cGVjdChXYXRjaFVpZFJ1bm5lci5DTURfSURMRSwgbnVsbCk7CisKKyAgICAgICAgICAgIC8vIFJldHVybiB0byBob21lLgorICAgICAgICAgICAgbUNvbnRleHQuc3RhcnRBY3Rpdml0eShob21lSW50ZW50KTsKKyAgICAgICAgICAgIHVpZDJXYXRjaGVyLndhaXRGb3IoV2F0Y2hVaWRSdW5uZXIuQ01EX0NBQ0hFRCwgbnVsbCk7CisgICAgICAgICAgICB1aWQyV2F0Y2hlci5leHBlY3QoV2F0Y2hVaWRSdW5uZXIuQ01EX1BST0NTVEFURSwgV2F0Y2hVaWRSdW5uZXIuU1RBVEVfSEVBVllfV0VJR0hUKTsKKworICAgICAgICAgICAgLy8gVHJ5IHN0YXJ0aW5nIHRoZSBmaXJzdCBoZWF2eSB3ZWlnaHQgYXBwLCBidXQgcmV0dXJuIHRvIHRoZSBleGlzdGluZyBzZWNvbmQuCisgICAgICAgICAgICBzdGFydEFjdGl2aXR5QW5kV2FpdEZvclNob3coYWN0aXZpdHkxSW50ZW50KTsKKyAgICAgICAgICAgIG1heWJlQ2xpY2soZGV2aWNlLCBuZXcgVWlTZWxlY3RvcigpLnJlc291cmNlSWQoImFuZHJvaWQ6aWQvc3dpdGNoX29sZCIpKTsKKyAgICAgICAgICAgIHdhaXRGb3JBcHBGb2N1cyhDQU5UX1NBVkVfU1RBVEVfMl9QQUNLQUdFX05BTUUsIFdBSVRfVElNRSk7CisgICAgICAgICAgICBkZXZpY2Uud2FpdEZvcklkbGUoKTsKKyAgICAgICAgICAgIHVpZDJXYXRjaGVyLndhaXRGb3IoV2F0Y2hVaWRSdW5uZXIuQ01EX1VOQ0FDSEVELCBudWxsKTsKKyAgICAgICAgICAgIHVpZDJXYXRjaGVyLmV4cGVjdChXYXRjaFVpZFJ1bm5lci5DTURfUFJPQ1NUQVRFLCBXYXRjaFVpZFJ1bm5lci5TVEFURV9UT1ApOworCisgICAgICAgICAgICAvLyBSZXR1cm4gdG8gaG9tZS4KKyAgICAgICAgICAgIG1Db250ZXh0LnN0YXJ0QWN0aXZpdHkoaG9tZUludGVudCk7CisgICAgICAgICAgICB1aWQyV2F0Y2hlci53YWl0Rm9yKFdhdGNoVWlkUnVubmVyLkNNRF9DQUNIRUQsIG51bGwpOworICAgICAgICAgICAgdWlkMldhdGNoZXIuZXhwZWN0KFdhdGNoVWlkUnVubmVyLkNNRF9QUk9DU1RBVEUsIFdhdGNoVWlkUnVubmVyLlNUQVRFX0hFQVZZX1dFSUdIVCk7CisKKyAgICAgICAgICAgIC8vIEFnYWluIHN0YXJ0IHRoZSBmaXJzdCBoZWF2eSB3ZWlnaHQgYXBwLCB0aGlzIHRpbWUgYWN0dWFsbHkgc3dpdGNoaW5nIHRvIGl0CisgICAgICAgICAgICBzdGFydEFjdGl2aXR5QW5kV2FpdEZvclNob3coYWN0aXZpdHkxSW50ZW50KTsKKyAgICAgICAgICAgIG1heWJlQ2xpY2soZGV2aWNlLCBuZXcgVWlTZWxlY3RvcigpLnJlc291cmNlSWQoImFuZHJvaWQ6aWQvc3dpdGNoX25ldyIpKTsKKyAgICAgICAgICAgIHdhaXRGb3JBcHBGb2N1cyhDQU5UX1NBVkVfU1RBVEVfMV9QQUNLQUdFX05BTUUsIFdBSVRfVElNRSk7CisgICAgICAgICAgICBkZXZpY2Uud2FpdEZvcklkbGUoKTsKKworICAgICAgICAgICAgLy8gVGhlIHNlY29uZCBhcHAgc2hvdWxkIG5vdyBiZWNvbWUgY2FjaGVkLgorICAgICAgICAgICAgdWlkMldhdGNoZXIuZXhwZWN0KFdhdGNoVWlkUnVubmVyLkNNRF9QUk9DU1RBVEUsIFdhdGNoVWlkUnVubmVyLlNUQVRFX0NBQ0hFRF9SRUNFTlQpOworCisgICAgICAgICAgICAvLyBBbmQgdGhlIGZpcnN0IGFwcCBzaG91bGQgc3RhcnQuCisgICAgICAgICAgICB1aWQxV2F0Y2hlci53YWl0Rm9yKFdhdGNoVWlkUnVubmVyLkNNRF9BQ1RJVkUsIG51bGwpOworICAgICAgICAgICAgdWlkMVdhdGNoZXIud2FpdEZvcihXYXRjaFVpZFJ1bm5lci5DTURfVU5DQUNIRUQsIG51bGwpOworICAgICAgICAgICAgdWlkMVdhdGNoZXIuZXhwZWN0KFdhdGNoVWlkUnVubmVyLkNNRF9QUk9DU1RBVEUsIFdhdGNoVWlkUnVubmVyLlNUQVRFX1RPUCk7CisKKyAgICAgICAgICAgIC8vIEV4aXQgYWN0aXZpdHksIGNoZWNrIHRvIHNlZSBpZiB3ZSBhcmUgbm93IGNhY2hlZC4KKyAgICAgICAgICAgIHdhaXRGb3JBcHBGb2N1cyhDQU5UX1NBVkVfU1RBVEVfMV9QQUNLQUdFX05BTUUsIFdBSVRfVElNRSk7CisgICAgICAgICAgICBkZXZpY2Uud2FpdEZvcklkbGUoKTsKKyAgICAgICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpLmdldFVpQXV0b21hdGlvbigpLnBlcmZvcm1HbG9iYWxBY3Rpb24oCisgICAgICAgICAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlTZXJ2aWNlLkdMT0JBTF9BQ1RJT05fQkFDSyk7CisgICAgICAgICAgICB1aWQxV2F0Y2hlci5leHBlY3QoV2F0Y2hVaWRSdW5uZXIuQ01EX0NBQ0hFRCwgbnVsbCk7CisgICAgICAgICAgICB1aWQxV2F0Y2hlci5leHBlY3QoV2F0Y2hVaWRSdW5uZXIuQ01EX1BST0NTVEFURSwgV2F0Y2hVaWRSdW5uZXIuU1RBVEVfQ0FDSEVEX1JFQ0VOVCk7CisKKyAgICAgICAgICAgIC8vIE1ha2UgYm90aCBhcHBzIGlkbGUgZm9yIGNsZWFubGluZXNzLgorICAgICAgICAgICAgY21kID0gImFtIG1ha2UtdWlkLWlkbGUgIiArIENBTlRfU0FWRV9TVEFURV8xX1BBQ0tBR0VfTkFNRTsKKyAgICAgICAgICAgIHJlc3VsdCA9IFN5c3RlbVV0aWwucnVuU2hlbGxDb21tYW5kKGdldEluc3RydW1lbnRhdGlvbigpLCBjbWQpOworICAgICAgICAgICAgY21kID0gImFtIG1ha2UtdWlkLWlkbGUgIiArIENBTlRfU0FWRV9TVEFURV8yX1BBQ0tBR0VfTkFNRTsKKyAgICAgICAgICAgIHJlc3VsdCA9IFN5c3RlbVV0aWwucnVuU2hlbGxDb21tYW5kKGdldEluc3RydW1lbnRhdGlvbigpLCBjbWQpOworCisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB1aWQyV2F0Y2hlci5maW5pc2goKTsKKyAgICAgICAgICAgIHVpZDFXYXRjaGVyLmZpbmlzaCgpOworICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYXBwL3NyYy9hbmRyb2lkL2FwcC9jdHMvQWN0aXZpdHlNYW5hZ2VyVGVzdC5qYXZhIGIvdGVzdHMvYXBwL3NyYy9hbmRyb2lkL2FwcC9jdHMvQWN0aXZpdHlNYW5hZ2VyVGVzdC5qYXZhCmluZGV4IDMxY2I2MzIuLjc0N2M1MmUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL0FjdGl2aXR5TWFuYWdlclRlc3QuamF2YQorKysgYi90ZXN0cy9hcHAvc3JjL2FuZHJvaWQvYXBwL2N0cy9BY3Rpdml0eU1hbmFnZXJUZXN0LmphdmEKQEAgLTM4LDEyICszOCwxNiBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5Db25maWd1cmF0aW9uSW5mbzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKIGltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUmVzdHJpY3RlZEJ1aWxkVGVzdDsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC51aWF1dG9tYXRvci5VaURldmljZTsKIGltcG9ydCBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdENhc2U7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogcHVibGljIGNsYXNzIEFjdGl2aXR5TWFuYWdlclRlc3QgZXh0ZW5kcyBJbnN0cnVtZW50YXRpb25UZXN0Q2FzZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IEFjdGl2aXR5TWFuYWdlclRlc3QuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVFVCX1BBQ0tBR0VfTkFNRSA9ICJhbmRyb2lkLmFwcC5zdHVicyI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdBSVRGT1JfTVNFQyA9IDUwMDA7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfTkFNRSA9ICJhbmRyb2lkLmFwcC5zdHVicy5Nb2NrU2VydmljZSI7CkBAIC0zMTIsNiArMzE2LDMxIEBACiAgICAgICAgIGFzc2VydFRydWUoZGVzdHJveWVkKTsKICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgZXhlY3V0ZUFuZExvZ1NoZWxsQ29tbWFuZChTdHJpbmcgY21kKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBVaURldmljZSB1aURldmljZSA9IFVpRGV2aWNlLmdldEluc3RhbmNlKG1JbnN0cnVtZW50YXRpb24pOworICAgICAgICBmaW5hbCBTdHJpbmcgb3V0cHV0ID0gdWlEZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZChjbWQpOworICAgICAgICBMb2cuZChUQUcsICJleGVjdXRlZFsiICsgY21kICsgIl07IG91dHB1dFsiICsgb3V0cHV0LnRyaW0oKSArICJdIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldEZvcmNlZEFwcFN0YW5kYnkoU3RyaW5nIHBhY2thZ2VOYW1lLCBib29sZWFuIGVuYWJsZWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgY21kQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCJhcHBvcHMgc2V0ICIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChwYWNrYWdlTmFtZSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCIgUlVOX0FOWV9JTl9CQUNLR1JPVU5EICIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChlbmFibGVkID8gImlnbm9yZSIgOiAiYWxsb3ciKTsKKyAgICAgICAgZXhlY3V0ZUFuZExvZ1NoZWxsQ29tbWFuZChjbWRCdWlsZGVyLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJc0JhY2tncm91bmRSZXN0cmljdGVkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gVGhpcyBpbnN0cnVtZW50YXRpb24gcnVucyBpbiB0aGUgdGFyZ2V0IHBhY2thZ2UncyB1aWQuCisgICAgICAgIGZpbmFsIENvbnRleHQgdGFyZ2V0Q29udGV4dCA9IG1JbnN0cnVtZW50YXRpb24uZ2V0VGFyZ2V0Q29udGV4dCgpOworICAgICAgICBmaW5hbCBTdHJpbmcgdGFyZ2V0UGFja2FnZSA9IHRhcmdldENvbnRleHQuZ2V0UGFja2FnZU5hbWUoKTsKKyAgICAgICAgZmluYWwgQWN0aXZpdHlNYW5hZ2VyIGFtID0gdGFyZ2V0Q29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKEFjdGl2aXR5TWFuYWdlci5jbGFzcyk7CisgICAgICAgIHNldEZvcmNlZEFwcFN0YW5kYnkodGFyZ2V0UGFja2FnZSwgdHJ1ZSk7CisgICAgICAgIGFzc2VydFRydWUoYW0uaXNCYWNrZ3JvdW5kUmVzdHJpY3RlZCgpKTsKKyAgICAgICAgc2V0Rm9yY2VkQXBwU3RhbmRieSh0YXJnZXRQYWNrYWdlLCBmYWxzZSk7CisgICAgICAgIGFzc2VydEZhbHNlKGFtLmlzQmFja2dyb3VuZFJlc3RyaWN0ZWQoKSk7CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgdGVzdEdldE1lbW9yeUluZm8oKSB7CiAgICAgICAgIEFjdGl2aXR5TWFuYWdlci5NZW1vcnlJbmZvIG91dEluZm8gPSBuZXcgQWN0aXZpdHlNYW5hZ2VyLk1lbW9yeUluZm8oKTsKICAgICAgICAgbUFjdGl2aXR5TWFuYWdlci5nZXRNZW1vcnlJbmZvKG91dEluZm8pOwpAQCAtMzY5LDcgKzM5OCw2IEBACiAgICAgICAgIGZpbmFsIFJ1bm5pbmdBcHBQcm9jZXNzSW5mbyByYSA9IG5ldyBSdW5uaW5nQXBwUHJvY2Vzc0luZm8oKTsKICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyLmdldE15TWVtb3J5U3RhdGUocmEpOwogCi0gICAgICAgIGFzc2VydEVxdWFscyhtQ29udGV4dC5nZXRBcHBsaWNhdGlvbkluZm8oKS5wcm9jZXNzTmFtZSwgcmEucHJvY2Vzc05hbWUpOwogICAgICAgICBhc3NlcnRFcXVhbHMoYW5kcm9pZC5vcy5Qcm9jZXNzLm15VWlkKCksIHJhLnVpZCk7CiAKICAgICAgICAgLy8gV2hlbiBhbiBpbnN0cnVtZW50YXRpb24gdGVzdCBpcyBydW5uaW5nLCB0aGUgaW1wb3J0YW5jZSBpcyBoaWdoLgpAQCAtNDA5LDExICs0MzcsMTMgQEAKICAgICAgKiBsaWZldGltZSB0ZXN0cy4KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgbGF1bmNoSG9tZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChJbnRlbnQuQUNUSU9OX01BSU4pOwotICAgICAgICBpbnRlbnQuYWRkQ2F0ZWdvcnkoSW50ZW50LkNBVEVHT1JZX0hPTUUpOwotICAgICAgICBpbnRlbnQuc2V0RmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOwotICAgICAgICBtQ29udGV4dC5zdGFydEFjdGl2aXR5KGludGVudCk7Ci0gICAgICAgIFRocmVhZC5zbGVlcChXQUlUX1RJTUUpOworICAgICAgICBpZiAoIW5vSG9tZVNjcmVlbigpKSB7CisgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChJbnRlbnQuQUNUSU9OX01BSU4pOworICAgICAgICAgICAgaW50ZW50LmFkZENhdGVnb3J5KEludGVudC5DQVRFR09SWV9IT01FKTsKKyAgICAgICAgICAgIGludGVudC5zZXRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7CisgICAgICAgICAgICBtQ29udGV4dC5zdGFydEFjdGl2aXR5KGludGVudCk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoV0FJVF9USU1FKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgLyoqCmRpZmYgLS1naXQgYS90ZXN0cy9hcHAvc3JjL2FuZHJvaWQvYXBwL2N0cy9BbGVydERpYWxvZ1Rlc3QuamF2YSBiL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL0FsZXJ0RGlhbG9nVGVzdC5qYXZhCmluZGV4IGI2MzNkNDYuLjVjNmE1MDUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL0FsZXJ0RGlhbG9nVGVzdC5qYXZhCisrKyBiL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL0FsZXJ0RGlhbG9nVGVzdC5qYXZhCkBAIC0xNiw0NSArMTYsNTkgQEAKIAogcGFja2FnZSBhbmRyb2lkLmFwcC5jdHM7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCiBpbXBvcnQgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2c7CiBpbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOwogaW1wb3J0IGFuZHJvaWQuYXBwLnN0dWJzLkRpYWxvZ1N0dWJBY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5zdHVicy5SOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2U7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyOwotaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TbWFsbFRlc3Q7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5Qb2xsaW5nQ2hlY2s7CiAKLWltcG9ydCBhbmRyb2lkLmFwcC5zdHVicy5SOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworCiAvKgogICogVGVzdCBBbGVydERpYWxvZwogICovCiBAU21hbGxUZXN0Ci1wdWJsaWMgY2xhc3MgQWxlcnREaWFsb2dUZXN0IGV4dGVuZHMgQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI8RGlhbG9nU3R1YkFjdGl2aXR5PiB7CitAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIEFsZXJ0RGlhbG9nVGVzdCB7CiAgICAgcHJpdmF0ZSBJbnN0cnVtZW50YXRpb24gbUluc3RydW1lbnRhdGlvbjsKICAgICBwcml2YXRlIERpYWxvZ1N0dWJBY3Rpdml0eSBtQWN0aXZpdHk7CiAgICAgcHJpdmF0ZSBCdXR0b24gbVBvc2l0aXZlQnV0dG9uOwogICAgIHByaXZhdGUgQnV0dG9uIG1OZWdhdGl2ZUJ1dHRvbjsKICAgICBwcml2YXRlIEJ1dHRvbiBtTmV1dHJhbEJ1dHRvbjsKIAotICAgIHB1YmxpYyBBbGVydERpYWxvZ1Rlc3QoKSB7Ci0gICAgICAgIHN1cGVyKCJhbmRyb2lkLmFwcC5zdHVicyIsIERpYWxvZ1N0dWJBY3Rpdml0eS5jbGFzcyk7Ci0gICAgfQorICAgIEBSdWxlCisgICAgcHVibGljIEFjdGl2aXR5VGVzdFJ1bGU8RGlhbG9nU3R1YkFjdGl2aXR5PiBtQWN0aXZpdHlSdWxlID0KKyAgICAgICAgICAgIG5ldyBBY3Rpdml0eVRlc3RSdWxlPD4oRGlhbG9nU3R1YkFjdGl2aXR5LmNsYXNzLCB0cnVlLCBmYWxzZSk7CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBtSW5zdHJ1bWVudGF0aW9uID0gZ2V0SW5zdHJ1bWVudGF0aW9uKCk7CisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1JbnN0cnVtZW50YXRpb24gPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKTsKICAgICB9CiAKICAgICBwcm90ZWN0ZWQgdm9pZCBzdGFydERpYWxvZ0FjdGl2aXR5KGludCBkaWFsb2dOdW1iZXIpIHsKLSAgICAgICAgbUFjdGl2aXR5ID0gRGlhbG9nU3R1YkFjdGl2aXR5LnN0YXJ0RGlhbG9nQWN0aXZpdHkodGhpcywgZGlhbG9nTnVtYmVyKTsKKyAgICAgICAgbUFjdGl2aXR5ID0gRGlhbG9nU3R1YkFjdGl2aXR5LnN0YXJ0RGlhbG9nQWN0aXZpdHkobUFjdGl2aXR5UnVsZSwgZGlhbG9nTnVtYmVyKTsKIAogICAgICAgICBQb2xsaW5nQ2hlY2sud2FpdEZvcigoKSAtPiBtQWN0aXZpdHkuZ2V0RGlhbG9nKCkuaXNTaG93aW5nKCkpOwogICAgIH0KIAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEFsZXJ0RGlhbG9nKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIGRvVGVzdEFsZXJ0RGlhbG9nKERpYWxvZ1N0dWJBY3Rpdml0eS5URVNUX0FMRVJURElBTE9HKTsKICAgICB9CkBAIC05Miw2ICsxMDYsNyBAQAogICAgICAgICBhc3NlcnRUcnVlKG1BY3Rpdml0eS5pc05ldXRyYWxCdXR0b25DbGlja2VkKTsKICAgICB9CiAKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RBbGVydERpYWxvZ0RlcHJlY2F0ZWRBUEkoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgZG9UZXN0QWxlcnREaWFsb2coRGlhbG9nU3R1YkFjdGl2aXR5LlRFU1RfQUxFUlRESUFMT0dfREVQUkVDQVRFRCk7CiAgICAgfQpAQCAtMTMyLDI5ICsxNDcsMzQgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKERpYWxvZ0ludGVyZmFjZS5CVVRUT05fTkVHQVRJVkUsIERpYWxvZ1N0dWJBY3Rpdml0eS5idXR0b25JbmRleCk7CiAgICAgfQogCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWxlcnREaWFsb2dBUElXaXRoTWVzc2FnZURlcHJlY2F0ZWQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgdGVzdEFsZXJ0RGlhbG9nQVBJV2l0aE1lc3NhZ2UodHJ1ZSk7CiAgICAgfQogCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWxlcnREaWFsb2dBUElXaXRoTWVzc2FnZU5vdERlcHJlY2F0ZWQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgdGVzdEFsZXJ0RGlhbG9nQVBJV2l0aE1lc3NhZ2UoZmFsc2UpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBwZXJmb3JtQ2xpY2soZmluYWwgQnV0dG9uIGJ1dHRvbikgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIHJ1blRlc3RPblVpVGhyZWFkKCgpIC0+IGJ1dHRvbi5wZXJmb3JtQ2xpY2soKSk7CisgICAgICAgIG1BY3Rpdml0eVJ1bGUucnVuT25VaVRocmVhZCgoKSAtPiBidXR0b24ucGVyZm9ybUNsaWNrKCkpOwogICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLndhaXRGb3JJZGxlU3luYygpOwogICAgIH0KIAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbUFsZXJ0RGlhbG9nKCkgewogICAgICAgICBzdGFydERpYWxvZ0FjdGl2aXR5KERpYWxvZ1N0dWJBY3Rpdml0eS5URVNUX0NVU1RPTV9BTEVSVERJQUxPRyk7CiAgICAgICAgIGFzc2VydFRydWUobUFjdGl2aXR5LmdldERpYWxvZygpLmlzU2hvd2luZygpKTsKICAgICB9CiAKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21BbGVydERpYWxvZ1ZpZXcoKSB7CiAgICAgICAgIHN0YXJ0RGlhbG9nQWN0aXZpdHkoRGlhbG9nU3R1YkFjdGl2aXR5LlRFU1RfQ1VTVE9NX0FMRVJURElBTE9HX1ZJRVcpOwogICAgICAgICBhc3NlcnRUcnVlKG1BY3Rpdml0eS5nZXREaWFsb2coKS5pc1Nob3dpbmcoKSk7CiAgICAgfQogCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FsbGJhY2soKSB7CiAgICAgICAgIHN0YXJ0RGlhbG9nQWN0aXZpdHkoRGlhbG9nU3R1YkFjdGl2aXR5LlRFU1RfQUxFUlRESUFMT0dfQ0FMTEJBQ0spOwogICAgICAgICBhc3NlcnRUcnVlKG1BY3Rpdml0eS5vbkNyZWF0ZUNhbGxlZCk7CkBAIC0xNjUsMTEgKzE4NSwxMyBAQAogICAgICAgICBhc3NlcnRUcnVlKG1BY3Rpdml0eS5vbktleVVwQ2FsbGVkKTsKICAgICB9CiAKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RBbGVydERpYWxvZ1RoZW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHN0YXJ0RGlhbG9nQWN0aXZpdHkoRGlhbG9nU3R1YkFjdGl2aXR5LlRFU1RfQUxFUlRESUFMT0dfVEhFTUUpOwogICAgICAgICBhc3NlcnRUcnVlKG1BY3Rpdml0eS5nZXREaWFsb2coKS5pc1Nob3dpbmcoKSk7CiAgICAgfQogCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWxlcnREaWFsb2dDYW5jZWxhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHN0YXJ0RGlhbG9nQWN0aXZpdHkoRGlhbG9nU3R1YkFjdGl2aXR5LlRFU1RfQUxFUlRESUFMT0dfQ0FOQ0VMQUJMRSk7CiAgICAgICAgIGFzc2VydFRydWUobUFjdGl2aXR5LmdldERpYWxvZygpLmlzU2hvd2luZygpKTsKQEAgLTE3OSw2ICsyMDEsNyBAQAogICAgICAgICBhc3NlcnRUcnVlKG1BY3Rpdml0eS5vbkNhbmNlbENhbGxlZCk7CiAgICAgfQogCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWxlcnREaWFsb2dOb3RDYW5jZWxhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHN0YXJ0RGlhbG9nQWN0aXZpdHkoRGlhbG9nU3R1YkFjdGl2aXR5LlRFU1RfQUxFUlRESUFMT0dfTk9UX0NBTkNFTEFCTEUpOwogICAgICAgICBhc3NlcnRUcnVlKG1BY3Rpdml0eS5nZXREaWFsb2coKS5pc1Nob3dpbmcoKSk7CkBAIC0xODcsMTEgKzIxMCwxMyBAQAogICAgICAgICBhc3NlcnRGYWxzZShtQWN0aXZpdHkub25DYW5jZWxDYWxsZWQpOwogICAgIH0KIAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEFsZXJ0RGlhbG9nSWNvbkRyYXdhYmxlKCkgewogICAgICAgICBzdGFydERpYWxvZ0FjdGl2aXR5KERpYWxvZ1N0dWJBY3Rpdml0eS5URVNUX0FMRVJUX0RJQUxPR19JQ09OX0RSQVdBQkxFKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShtQWN0aXZpdHkuZ2V0RGlhbG9nKCkuaXNTaG93aW5nKCkpOwogICAgIH0KIAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEFsZXJ0RGlhbG9nSWNvbkF0dHJpYnV0ZSgpIHsKICAgICAgICAgc3RhcnREaWFsb2dBY3Rpdml0eShEaWFsb2dTdHViQWN0aXZpdHkuVEVTVF9BTEVSVF9ESUFMT0dfSUNPTl9BVFRSSUJVVEUpOwogICAgICAgICBhc3NlcnRUcnVlKG1BY3Rpdml0eS5nZXREaWFsb2coKS5pc1Nob3dpbmcoKSk7CmRpZmYgLS1naXQgYS90ZXN0cy9hcHAvc3JjL2FuZHJvaWQvYXBwL2N0cy9BbGVydERpYWxvZ19CdWlsZGVyQ3Vyc29yVGVzdC5qYXZhIGIvdGVzdHMvYXBwL3NyYy9hbmRyb2lkL2FwcC9jdHMvQWxlcnREaWFsb2dfQnVpbGRlckN1cnNvclRlc3QuamF2YQppbmRleCBmMThmZmQ0Li43NTAxN2MxIDEwMDY0NAotLS0gYS90ZXN0cy9hcHAvc3JjL2FuZHJvaWQvYXBwL2N0cy9BbGVydERpYWxvZ19CdWlsZGVyQ3Vyc29yVGVzdC5qYXZhCisrKyBiL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL0FsZXJ0RGlhbG9nX0J1aWxkZXJDdXJzb3JUZXN0LmphdmEKQEAgLTE2LDYgKzE2LDggQEAKIAogcGFja2FnZSBhbmRyb2lkLmFwcC5jdHM7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by4qOworCiBpbXBvcnQgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2c7CiBpbXBvcnQgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2cuQnVpbGRlcjsKIGltcG9ydCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb247CkBAIC0yOCwxNyArMzAsMTYgQEAKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVDdXJzb3I7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2U7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyOwogaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5NZWRpdW1UZXN0OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuUG9sbGluZ0NoZWNrOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogCi1pbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8uKjsKLQogQE1lZGl1bVRlc3QKIHB1YmxpYyBjbGFzcyBBbGVydERpYWxvZ19CdWlsZGVyQ3Vyc29yVGVzdAogICAgICAgICBleHRlbmRzIEFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyPERpYWxvZ1N0dWJBY3Rpdml0eT4gewpkaWZmIC0tZ2l0IGEvdGVzdHMvYXBwL3NyYy9hbmRyb2lkL2FwcC9jdHMvQWxlcnRXaW5kb3dzVGVzdHMuamF2YSBiL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL0FsZXJ0V2luZG93c1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2YjRjZTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvYXBwL3NyYy9hbmRyb2lkL2FwcC9jdHMvQWxlcnRXaW5kb3dzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuYXBwLmN0czsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXIuUnVubmluZ0FwcFByb2Nlc3NJbmZvLklNUE9SVEFOQ0VfUEVSQ0VQVElCTEU7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlci5SdW5uaW5nQXBwUHJvY2Vzc0luZm8uSU1QT1JUQU5DRV9QRVJDRVBUSUJMRV9QUkVfMjY7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlci5SdW5uaW5nQXBwUHJvY2Vzc0luZm8uSU1QT1JUQU5DRV9WSVNJQkxFOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dC5CSU5EX0FMTE9XX09PTV9NQU5BR0VNRU5UOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dC5CSU5EX0FVVE9fQ1JFQVRFOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dC5CSU5EX05PVF9GT1JFR1JPVU5EOwotCi1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmFwcDIuQWxlcnRXaW5kb3dTZXJ2aWNlLk1TR19BRERfQUxFUlRfV0lORE9XOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5hcHAyLkFsZXJ0V2luZG93U2VydmljZS5NU0dfT05fQUxFUlRfV0lORE9XX0FEREVEOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5hcHAyLkFsZXJ0V2luZG93U2VydmljZS5NU0dfT05fQUxFUlRfV0lORE9XX1JFTU9WRUQ7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmFwcDIuQWxlcnRXaW5kb3dTZXJ2aWNlLk1TR19SRU1PVkVfQUxFUlRfV0lORE9XOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5hcHAyLkFsZXJ0V2luZG93U2VydmljZS5NU0dfUkVNT1ZFX0FMTF9BTEVSVF9XSU5ET1dTOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5hcHAyLkFsZXJ0V2luZG93U2VydmljZS5OT1RJRklDQVRJT05fTUVTU0VOR0VSX0VYVFJBOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyLlJ1bm5pbmdBcHBQcm9jZXNzSW5mbzsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2VydmljZUNvbm5lY3Rpb247Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzZW5nZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKLWltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUHJlc3VibWl0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5hcHAyLkFsZXJ0V2luZG93U2VydmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlN5c3RlbVV0aWw7Ci0KLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLWltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7Ci0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKLWltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247Ci0KLS8qKgotICogQnVpbGQ6IG1tbWEgLWozMiBjdHMvdGVzdHMvYXBwCi0gKiBSdW46IGN0cy9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci91dGlsL3J1bi10ZXN0IEN0c0FwcFRlc3RDYXNlcyBhbmRyb2lkLmFwcC5jdHMuQWxlcnRXaW5kb3dzVGVzdHMKLSAqLwotQFByZXN1Ym1pdAotQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKLXB1YmxpYyBjbGFzcyBBbGVydFdpbmRvd3NUZXN0cyB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkFsZXJ0V2luZG93c1Rlc3RzIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFdBSVRfVElNRV9NUyA9IDIgKiAxMDAwOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNESzI1X1BBQ0tBR0VfTkFNRSA9ICJjb20uYW5kcm9pZC5hcHBTZGsyNSI7Ci0KLSAgICBwcml2YXRlIE1lc3NlbmdlciBtU2VydmljZTsKLSAgICBwcml2YXRlIFN0cmluZyBtU2VydmljZVBhY2thZ2VOYW1lOwotICAgIHByaXZhdGUgaW50IG1TZXJ2aWNlVWlkOwotCi0gICAgcHJpdmF0ZSBQYWNrYWdlTWFuYWdlciBtUG07Ci0KLSAgICBwcml2YXRlIEFjdGl2aXR5TWFuYWdlciBtQW07Ci0gICAgcHJpdmF0ZSBBY3Rpdml0eU1hbmFnZXIgbUFtMjU7IC8vIEFjdGl2aXR5TWFuYWdlciBjcmVhdGVkIGZvciBhbiBTREsgMjUgYXBwIGNvbnRleHQuCi0KLSAgICBwcml2YXRlIGZpbmFsIE1lc3NlbmdlciBtTWVzc2VuZ2VyID0gbmV3IE1lc3NlbmdlcihuZXcgSW5jb21pbmdIYW5kbGVyKExvb3Blci5nZXRNYWluTG9vcGVyKCkpKTsKLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtQWRkZWRMb2NrID0gbmV3IE9iamVjdCgpOwotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1SZW1vdmVMb2NrID0gbmV3IE9iamVjdCgpOwotCi0gICAgQEJlZm9yZQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChERUJVRykgTG9nLmUoVEFHLCAic2V0VXAiKTsKLSAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0ID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0VGFyZ2V0Q29udGV4dCgpOwotCi0gICAgICAgIG1QbSA9IGNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKTsKLQotICAgICAgICBtQW0gPSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQWN0aXZpdHlNYW5hZ2VyLmNsYXNzKTsKLSAgICAgICAgbUFtMjUgPSBjb250ZXh0LmNyZWF0ZVBhY2thZ2VDb250ZXh0KFNESzI1X1BBQ0tBR0VfTkFNRSwgMCkKLSAgICAgICAgICAgICAgICAuZ2V0U3lzdGVtU2VydmljZShBY3Rpdml0eU1hbmFnZXIuY2xhc3MpOwotCi0gICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KCk7Ci0gICAgICAgIGludGVudC5zZXRDbGFzc05hbWUoQWxlcnRXaW5kb3dTZXJ2aWNlLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgQWxlcnRXaW5kb3dTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShOT1RJRklDQVRJT05fTUVTU0VOR0VSX0VYVFJBLCBtTWVzc2VuZ2VyKTsKLSAgICAgICAgLy8gTmVlZHMgdG8gYmUgYm90aCBCSU5EX05PVF9GT1JFR1JPVU5EIGFuZCBCSU5EX0FMTE9XX09PTV9NQU5BR0VNRU5UIHRvIGF2b2lkIHRoZSBiaW5kaW5nCi0gICAgICAgIC8vIHRvIHRoaXMgaW5zdHJ1bWVudGF0aW9uIHRlc3QgZnJvbSBpbmNyZWFzaW5nIGl0cyBpbXBvcnRhbmNlLgotICAgICAgICBjb250ZXh0LmJpbmRTZXJ2aWNlKGludGVudCwgbUNvbm5lY3Rpb24sCi0gICAgICAgICAgICAgICAgQklORF9BVVRPX0NSRUFURSB8IEJJTkRfTk9UX0ZPUkVHUk9VTkQgfCBCSU5EX0FMTE9XX09PTV9NQU5BR0VNRU5UKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtQ29ubmVjdGlvbikgewotICAgICAgICAgICAgLy8gV2FpdCBmb3IgYWxlcnQgd2luZG93IHNlcnZpY2UgdG8gYmUgY29ubmVjdGlvbiBiZWZvcmUgcHJvY2Vzc2luZy4KLSAgICAgICAgICAgIG1Db25uZWN0aW9uLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBBZnRlcgotICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChERUJVRykgTG9nLmUoVEFHLCAidGVhckRvd24iKTsKLSAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TZXJ2aWNlLnNlbmQoTWVzc2FnZS5vYnRhaW4obnVsbCwgTVNHX1JFTU9WRV9BTExfQUxFUlRfV0lORE9XUykpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldFRhcmdldENvbnRleHQoKTsKLSAgICAgICAgY29udGV4dC51bmJpbmRTZXJ2aWNlKG1Db25uZWN0aW9uKTsKLSAgICAgICAgbUFtID0gbnVsbDsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RBbGVydFdpbmRvd09vbUFkaigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBBbGVydCB3aW5kb3dzIGFyZSBhbHdheXMgaGlkZGVuIHdoZW4gcnVubmluZyBpbiBWUi4KLSAgICAgICAgaWYgKGlzUnVubmluZ0luVlIoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHNldEFsZXJ0V2luZG93UGVybWlzc2lvbih0cnVlIC8qIGFsbG93ICovKTsKLQotCi0gICAgICAgIGFzc2VydFBhY2thZ2VJbXBvcnRhbmNlKElNUE9SVEFOQ0VfUEVSQ0VQVElCTEUsIElNUE9SVEFOQ0VfUEVSQ0VQVElCTEVfUFJFXzI2KTsKLQotICAgICAgICAvLyBUT0RPIEFNLmdldFVpZEltcG9ydGFuY2UoKSBzb21ldGltZXMgcmV0dXJuIGEgZGlmZmVyZW50IHZhbHVlIGZyb20gd2hhdAotICAgICAgICAvLyBnZXRQYWNrYWdlSW1wb3J0YW5jZSgpIHJldHVybnMuLi4gYi8zNzk1MDQ3MgotICAgICAgICAvLyBhc3NlcnRVaWRJbXBvcnRhbmNlKElNUE9SVEFOQ0VfUEVSQ0VQVElCTEUsIElNUE9SVEFOQ0VfUEVSQ0VQVElCTEVfUFJFXzI2KTsKLQotICAgICAgICBhZGRBbGVydFdpbmRvdygpOwotICAgICAgICAvLyBQcm9jZXNzIGltcG9ydGFuY2Ugc2hvdWxkIGJlIGluY3JlYXNlZCB0byB2aXNpYmxlIHdoZW4gdGhlIHNlcnZpY2UgaGFzIGFuIGFsZXJ0IHdpbmRvdy4KLSAgICAgICAgYXNzZXJ0UGFja2FnZUltcG9ydGFuY2UoSU1QT1JUQU5DRV9WSVNJQkxFLCBJTVBPUlRBTkNFX1ZJU0lCTEUpOwotCi0gICAgICAgIGFkZEFsZXJ0V2luZG93KCk7Ci0gICAgICAgIGFzc2VydFBhY2thZ2VJbXBvcnRhbmNlKElNUE9SVEFOQ0VfVklTSUJMRSwgSU1QT1JUQU5DRV9WSVNJQkxFKTsKLQotICAgICAgICBzZXRBbGVydFdpbmRvd1Blcm1pc3Npb24oZmFsc2UgLyogYWxsb3cgKi8pOwotICAgICAgICAvLyBQcm9jZXNzIGltcG9ydGFuY2Ugc2hvdWxkIG5vIGxvbmdlciBiZSB2aXNpYmxlIHNpbmNlIGl0cyBhbGVydCB3aW5kb3dzIGFyZSBub3QgYWxsb3dlZCB0bwotICAgICAgICAvLyBiZSB2aXNpYmxlLgotICAgICAgICBhc3NlcnRQYWNrYWdlSW1wb3J0YW5jZShJTVBPUlRBTkNFX1BFUkNFUFRJQkxFLCBJTVBPUlRBTkNFX1BFUkNFUFRJQkxFX1BSRV8yNik7Ci0KLSAgICAgICAgc2V0QWxlcnRXaW5kb3dQZXJtaXNzaW9uKHRydWUgLyogYWxsb3cgKi8pOwotICAgICAgICAvLyBUaGV5IGNhbiBzaG93IGFnYWluIHNvIGltcG9ydGFuY2Ugc2hvdWxkIGJlIHZpc2libGUgYWdhaW4uCi0gICAgICAgIGFzc2VydFBhY2thZ2VJbXBvcnRhbmNlKElNUE9SVEFOQ0VfVklTSUJMRSwgSU1QT1JUQU5DRV9WSVNJQkxFKTsKLQotICAgICAgICByZW1vdmVBbGVydFdpbmRvdygpOwotICAgICAgICBhc3NlcnRQYWNrYWdlSW1wb3J0YW5jZShJTVBPUlRBTkNFX1ZJU0lCTEUsIElNUE9SVEFOQ0VfVklTSUJMRSk7Ci0KLSAgICAgICAgcmVtb3ZlQWxlcnRXaW5kb3coKTsKLSAgICAgICAgLy8gUHJvY2VzcyBpbXBvcnRhbmNlIHNob3VsZCBubyBsb25nZXIgYmUgdmlzaWJsZSB3aGVuIHRoZSBzZXJ2aWNlIG5vIGxvbmdlciBhcyBhbGVydAotICAgICAgICAvLyB3aW5kb3dzLgotICAgICAgICBhc3NlcnRQYWNrYWdlSW1wb3J0YW5jZShJTVBPUlRBTkNFX1BFUkNFUFRJQkxFLCBJTVBPUlRBTkNFX1BFUkNFUFRJQkxFX1BSRV8yNik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZEFsZXJ0V2luZG93KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1TZXJ2aWNlLnNlbmQoTWVzc2FnZS5vYnRhaW4obnVsbCwgTVNHX0FERF9BTEVSVF9XSU5ET1cpKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtQWRkZWRMb2NrKSB7Ci0gICAgICAgICAgICAvLyBXYWl0IGZvciB3aW5kb3cgYWRkaXRpb24gY29uZmlybWF0aW9uIGJlZm9yZSBwcm9jZWVkaW5nLgotICAgICAgICAgICAgbUFkZGVkTG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVtb3ZlQWxlcnRXaW5kb3coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbVNlcnZpY2Uuc2VuZChNZXNzYWdlLm9idGFpbihudWxsLCBNU0dfUkVNT1ZFX0FMRVJUX1dJTkRPVykpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1SZW1vdmVMb2NrKSB7Ci0gICAgICAgICAgICAvLyBXYWl0IGZvciB3aW5kb3cgcmVtb3ZhbCBjb25maXJtYXRpb24gYmVmb3JlIHByb2NlZWRpbmcuCi0gICAgICAgICAgICBtUmVtb3ZlTG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0QWxlcnRXaW5kb3dQZXJtaXNzaW9uKGJvb2xlYW4gYWxsb3cpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBTdHJpbmcgY21kID0gImFwcG9wcyBzZXQgIiArIG1TZXJ2aWNlUGFja2FnZU5hbWUKLSAgICAgICAgICAgICAgICArICIgYW5kcm9pZDpzeXN0ZW1fYWxlcnRfd2luZG93ICIgKyAoYWxsb3cgPyAiYWxsb3ciIDogImRlbnkiKTsKLSAgICAgICAgU3lzdGVtVXRpbC5ydW5TaGVsbENvbW1hbmQoSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCksIGNtZCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydEltcG9ydGFuY2UoRnVuY3Rpb248QWN0aXZpdHlNYW5hZ2VyLCBJbnRlZ2VyPiBhcGlDYWxsZXIsCi0gICAgICAgICAgICBpbnQgZXhwZWN0ZWRGb3JPLCBpbnQgZXhwZWN0ZWRGb3JQcmVPKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgbG9uZyBUSU1FT1VUID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkgKyBUaW1lVW5pdC5TRUNPTkRTLnRvTWlsbGlzKDMwKTsKLSAgICAgICAgaW50IGFjdHVhbDsKLQotICAgICAgICBkbyB7Ci0gICAgICAgICAgICAvLyBUT0RPOiBXZSBzaG91bGQgdHJ5IHRvIHVzZSBBY3Rpdml0eU1hbmFnZXJUZXN0LlVpZEltcG9ydGFuY2VMaXN0ZW5lciBoZXJlIHRvIGxpc3RlbgotICAgICAgICAgICAgLy8gZm9yIGNoYW5nZXMgaW4gdGhlIHVpZCBpbXBvcnRhbmNlLiBIb3dldmVyLCB0aGUgd2F5IGl0IGlzIGN1cnJlbnRseSBzdHJ1Y3R1cmVkCi0gICAgICAgICAgICAvLyBkb2Vzbid0IHJlYWxseSB3b3JrIGZvciB0aGlzIHVzZSBjYXNlIHJpZ2h0IG5vdy4uLgotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDUwMCk7Ci0gICAgICAgICAgICBhY3R1YWwgPSBhcGlDYWxsZXIuYXBwbHkobUFtKTsKLSAgICAgICAgfSB3aGlsZSAoYWN0dWFsICE9IGV4cGVjdGVkRm9yTyAmJiAoU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkgPCBUSU1FT1VUKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkRm9yTywgYWN0dWFsKTsKLQotICAgICAgICAvLyBDaGVjayB0aGUgcmVzdWx0IGZvciBwcmUtTyBhcHBzLgotICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRGb3JQcmVPLCAoaW50KSBhcGlDYWxsZXIuYXBwbHkobUFtMjUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYWtlIHN1cmUge0BsaW5rIEFjdGl2aXR5TWFuYWdlciNnZXRQYWNrYWdlSW1wb3J0YW5jZX0gcmV0dXJucyB0aGUgZXhwZWN0ZWQgdmFsdWUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydFBhY2thZ2VJbXBvcnRhbmNlKGludCBleHBlY3RlZEZvck8sIGludCBleHBlY3RlZEZvclByZU8pIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRJbXBvcnRhbmNlKGFtIC0+IGFtLmdldFBhY2thZ2VJbXBvcnRhbmNlKG1TZXJ2aWNlUGFja2FnZU5hbWUpLAotICAgICAgICAgICAgICAgIGV4cGVjdGVkRm9yTywgZXhwZWN0ZWRGb3JQcmVPKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYWtlIHN1cmUge0BsaW5rIEFjdGl2aXR5TWFuYWdlciNnZXRVaWRJbXBvcnRhbmNlKGludCl9IHJldHVybnMgdGhlIGV4cGVjdGVkIHZhbHVlLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRVaWRJbXBvcnRhbmNlKGludCBleHBlY3RlZEZvck8sIGludCBleHBlY3RlZEZvclByZU8pIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRJbXBvcnRhbmNlKGFtIC0+IGFtLmdldFVpZEltcG9ydGFuY2UobVNlcnZpY2VVaWQpLAotICAgICAgICAgICAgICAgIGV4cGVjdGVkRm9yTywgZXhwZWN0ZWRGb3JQcmVPKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIFNlcnZpY2VDb25uZWN0aW9uIG1Db25uZWN0aW9uID0gbmV3IFNlcnZpY2VDb25uZWN0aW9uKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKENvbXBvbmVudE5hbWUgbmFtZSwgSUJpbmRlciBzZXJ2aWNlKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIExvZy5lKFRBRywgIm9uU2VydmljZUNvbm5lY3RlZCIpOwotICAgICAgICAgICAgbVNlcnZpY2UgPSBuZXcgTWVzc2VuZ2VyKHNlcnZpY2UpOwotICAgICAgICAgICAgbVNlcnZpY2VQYWNrYWdlTmFtZSA9IG5hbWUuZ2V0UGFja2FnZU5hbWUoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbVNlcnZpY2VVaWQgPSBtUG0uZ2V0UGFja2FnZVVpZChtU2VydmljZVBhY2thZ2VOYW1lLCAwKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImdldFBhY2thZ2VVaWQoKSBmYWlsZWQuIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Db25uZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgbm90aWZ5QWxsKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlRGlzY29ubmVjdGVkKENvbXBvbmVudE5hbWUgbmFtZSkgewotICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZShUQUcsICJvblNlcnZpY2VEaXNjb25uZWN0ZWQiKTsKLSAgICAgICAgICAgIG1TZXJ2aWNlID0gbnVsbDsKLSAgICAgICAgICAgIG1TZXJ2aWNlUGFja2FnZU5hbWUgPSBudWxsOwotICAgICAgICAgICAgbVNlcnZpY2VVaWQgPSAwOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgY2xhc3MgSW5jb21pbmdIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7Ci0KLSAgICAgICAgSW5jb21pbmdIYW5kbGVyKExvb3BlciBsb29wZXIpIHsKLSAgICAgICAgICAgIHN1cGVyKGxvb3Blcik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgewotICAgICAgICAgICAgc3dpdGNoIChtc2cud2hhdCkgewotICAgICAgICAgICAgICAgIGNhc2UgTVNHX09OX0FMRVJUX1dJTkRPV19BRERFRDoKLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtQWRkZWRMb2NrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy5lKFRBRywgIk1TR19PTl9BTEVSVF9XSU5ET1dfQURERUQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BZGRlZExvY2subm90aWZ5QWxsKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBNU0dfT05fQUxFUlRfV0lORE9XX1JFTU9WRUQ6Ci0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVJlbW92ZUxvY2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmUoVEFHLCAiTVNHX09OX0FMRVJUX1dJTkRPV19SRU1PVkVEIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUmVtb3ZlTG9jay5ub3RpZnlBbGwoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBzdXBlci5oYW5kbGVNZXNzYWdlKG1zZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNSdW5uaW5nSW5WUigpIHsKLSAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0ID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0VGFyZ2V0Q29udGV4dCgpOwotICAgICAgICBpZiAoKGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0Q29uZmlndXJhdGlvbigpLnVpTW9kZSAmIENvbmZpZ3VyYXRpb24uVUlfTU9ERV9UWVBFX01BU0spCi0gICAgICAgICAgICAgPT0gQ29uZmlndXJhdGlvbi5VSV9NT0RFX1RZUEVfVlJfSEVBRFNFVCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL0FzcGVjdFJhdGlvVGVzdHMuamF2YSBiL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL0FzcGVjdFJhdGlvVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA3NzBjOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9hcHAvc3JjL2FuZHJvaWQvYXBwL2N0cy9Bc3BlY3RSYXRpb1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmFwcC5jdHM7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5zdHVicy5NZXRhRGF0YU1heEFzcGVjdFJhdGlvQWN0aXZpdHk7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYXBwU2RrMjUuU2RrMjVNYXhBc3BlY3RSYXRpb0FjdGl2aXR5OwotCi1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKLWltcG9ydCBvcmcuanVuaXQuUnVsZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLWltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKLWltcG9ydCBhbmRyb2lkLmFwcC5zdHVicy5NYXhBc3BlY3RSYXRpb0FjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQuYXBwLnN0dWJzLk1heEFzcGVjdFJhdGlvUmVzaXplYWJsZUFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQuYXBwLnN0dWJzLk1heEFzcGVjdFJhdGlvVW5zZXRBY3Rpdml0eTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUHJlc3VibWl0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkRpc3BsYXk7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNkZFRlc3Q7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5Qb2xsaW5nQ2hlY2s7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LkNvbnRleHQuV0lORE9XX1NFUlZJQ0U7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm8uU0NSRUVOX09SSUVOVEFUSU9OX0xBTkRTQ0FQRTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LnBtLkFjdGl2aXR5SW5mby5TQ1JFRU5fT1JJRU5UQVRJT05fUE9SVFJBSVQ7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5GRUFUVVJFX1dBVENIOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7Ci0KLS8qKgotICogQnVpbGQ6IG1tbWEgLWozMiBjdHMvdGVzdHMvYXBwCi0gKiBSdW46IGN0cy9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci91dGlsL3J1bi10ZXN0IEN0c0FwcFRlc3RDYXNlcyBhbmRyb2lkLmFwcC5jdHMuQXNwZWN0UmF0aW9UZXN0cwotICovCi1AUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQotcHVibGljIGNsYXNzIEFzcGVjdFJhdGlvVGVzdHMgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQXNwZWN0UmF0aW9UZXN0cyI7Ci0KLSAgICAvLyBUaGUgbWF4LiBhc3BlY3QgcmF0aW8gdGhlIHRlc3QgYWN0aXZpdGllcyBhcmUgdXNpbmcuCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgTUFYX0FTUEVDVF9SQVRJTyA9IDEuMGY7Ci0KLSAgICAvLyBNYXggc3VwcG9ydGVkIGFzcGVjdCByYXRpbyBmb3IgcHJlLU8gYXBwcy4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBNQVhfUFJFX09fQVNQRUNUX1JBVElPID0gMS44NmY7Ci0KLSAgICAvLyBUaGUgbWluaW11bSBzdXBwb3J0ZWQgZGV2aWNlIGFzcGVjdCByYXRpby4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBNSU5fREVWSUNFX0FTUEVDVF9SQVRJTyA9IDEuMzMzZjsKLQotICAgIC8vIFRoZSBtaW5pbXVtIHN1cHBvcnRlZCBkZXZpY2UgYXNwZWN0IHJhdGlvIGZvciB3YXRjaGVzLgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IE1JTl9XQVRDSF9ERVZJQ0VfQVNQRUNUX1JBVElPID0gMS4wZjsKLQotICAgIEBSdWxlCi0gICAgcHVibGljIEFjdGl2aXR5VGVzdFJ1bGU8TWF4QXNwZWN0UmF0aW9BY3Rpdml0eT4gbU1heEFzcGVjdFJhdGlvQWN0aXZpdHkgPQotICAgICAgICAgICAgbmV3IEFjdGl2aXR5VGVzdFJ1bGU8PihNYXhBc3BlY3RSYXRpb0FjdGl2aXR5LmNsYXNzLAotICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBpbml0aWFsVG91Y2hNb2RlICovLCBmYWxzZSAvKiBsYXVuY2hBY3Rpdml0eSAqLyk7Ci0KLSAgICBAUnVsZQotICAgIHB1YmxpYyBBY3Rpdml0eVRlc3RSdWxlPE1heEFzcGVjdFJhdGlvUmVzaXplYWJsZUFjdGl2aXR5PiBtTWF4QXNwZWN0UmF0aW9SZXNpemVhYmxlQWN0aXZpdHkgPQotICAgICAgICAgICAgbmV3IEFjdGl2aXR5VGVzdFJ1bGU8PihNYXhBc3BlY3RSYXRpb1Jlc2l6ZWFibGVBY3Rpdml0eS5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogaW5pdGlhbFRvdWNoTW9kZSAqLywgZmFsc2UgLyogbGF1bmNoQWN0aXZpdHkgKi8pOwotCi0gICAgQFJ1bGUKLSAgICBwdWJsaWMgQWN0aXZpdHlUZXN0UnVsZTxNZXRhRGF0YU1heEFzcGVjdFJhdGlvQWN0aXZpdHk+IG1NZXRhRGF0YU1heEFzcGVjdFJhdGlvQWN0aXZpdHkgPQotICAgICAgICBuZXcgQWN0aXZpdHlUZXN0UnVsZTw+KE1ldGFEYXRhTWF4QXNwZWN0UmF0aW9BY3Rpdml0eS5jbGFzcywKLSAgICAgICAgICAgIGZhbHNlIC8qIGluaXRpYWxUb3VjaE1vZGUgKi8sIGZhbHNlIC8qIGxhdW5jaEFjdGl2aXR5ICovKTsKLQotICAgIEBSdWxlCi0gICAgcHVibGljIEFjdGl2aXR5VGVzdFJ1bGU8TWF4QXNwZWN0UmF0aW9VbnNldEFjdGl2aXR5PiBtTWF4QXNwZWN0UmF0aW9VbnNldEFjdGl2aXR5ID0KLSAgICAgICAgICAgIG5ldyBBY3Rpdml0eVRlc3RSdWxlPD4oTWF4QXNwZWN0UmF0aW9VbnNldEFjdGl2aXR5LmNsYXNzLAotICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBpbml0aWFsVG91Y2hNb2RlICovLCBmYWxzZSAvKiBsYXVuY2hBY3Rpdml0eSAqLyk7Ci0KLSAgICAvLyBUT0RPOiBDYW4ndCB1c2UgdGhpcyB0byBzdGFydCBhbiBhY3Rpdml0eSBpbiBhIGRpZmZlcmVudCBwcm9jZXNzLi4uc2lnaC4KLSAgICBAUnVsZQotICAgIHB1YmxpYyBBY3Rpdml0eVRlc3RSdWxlPFNkazI1TWF4QXNwZWN0UmF0aW9BY3Rpdml0eT4gbVNkazI1TWF4QXNwZWN0UmF0aW9BY3Rpdml0eSA9Ci0gICAgICAgICAgICBuZXcgQWN0aXZpdHlUZXN0UnVsZTw+KFNkazI1TWF4QXNwZWN0UmF0aW9BY3Rpdml0eS5jbGFzcywgImNvbS5hbmRyb2lkLmFwcFNkazI1IiwKLSAgICAgICAgICAgICAgICAgICAgMjY4NDM1NDU2LCBmYWxzZSAvKiBpbml0aWFsVG91Y2hNb2RlICovLCBmYWxzZSAvKiBsYXVuY2hBY3Rpdml0eSAqLyk7Ci0KLSAgICBwcml2YXRlIGludGVyZmFjZSBBc3NlcnRBc3BlY3RSYXRpb0NhbGxiYWNrIHsKLSAgICAgICAgdm9pZCBhc3NlcnRBc3BlY3RSYXRpbyhmbG9hdCBhY3R1YWwpOwotICAgIH0KLQotICAgIEBCZWZvcmUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgfQotCi0gICAgQEFmdGVyCi0gICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluaXNoQWN0aXZpdHkobU1heEFzcGVjdFJhdGlvQWN0aXZpdHkpOwotICAgICAgICBmaW5pc2hBY3Rpdml0eShtTWF4QXNwZWN0UmF0aW9SZXNpemVhYmxlQWN0aXZpdHkpOwotICAgICAgICBmaW5pc2hBY3Rpdml0eShtU2RrMjVNYXhBc3BlY3RSYXRpb0FjdGl2aXR5KTsKLSAgICAgICAgZmluaXNoQWN0aXZpdHkobU1heEFzcGVjdFJhdGlvVW5zZXRBY3Rpdml0eSk7Ci0gICAgICAgIGZpbmlzaEFjdGl2aXR5KG1NZXRhRGF0YU1heEFzcGVjdFJhdGlvQWN0aXZpdHkpOwotICAgIH0KLQotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjEuMS4yL0MtMC0xLEMtMC0yIikKLSAgICBAVGVzdAotICAgIEBQcmVzdWJtaXQKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGV2aWNlQXNwZWN0UmF0aW8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0ID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0Q29udGV4dCgpOwotICAgICAgICBmaW5hbCBXaW5kb3dNYW5hZ2VyIHdtID0gKFdpbmRvd01hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShXSU5ET1dfU0VSVklDRSk7Ci0gICAgICAgIGZpbmFsIERpc3BsYXkgZGlzcGxheSA9IHdtLmdldERlZmF1bHREaXNwbGF5KCk7Ci0gICAgICAgIGZpbmFsIERpc3BsYXlNZXRyaWNzIG1ldHJpY3MgPSBuZXcgRGlzcGxheU1ldHJpY3MoKTsKLSAgICAgICAgZGlzcGxheS5nZXRSZWFsTWV0cmljcyhtZXRyaWNzKTsKLQotICAgICAgICBmbG9hdCBsb25nU2lkZSA9IE1hdGgubWF4KG1ldHJpY3Mud2lkdGhQaXhlbHMsIG1ldHJpY3MuaGVpZ2h0UGl4ZWxzKTsKLSAgICAgICAgZmxvYXQgc2hvcnRTaWRlID0gTWF0aC5taW4obWV0cmljcy53aWR0aFBpeGVscywgbWV0cmljcy5oZWlnaHRQaXhlbHMpOwotICAgICAgICBmbG9hdCBkZXZpY2VBc3BlY3RSYXRpbyA9IGxvbmdTaWRlIC8gc2hvcnRTaWRlOwotICAgICAgICBmbG9hdCBleHBlY3RlZE1pbkFzcGVjdFJhdGlvID0gY29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpLmhhc1N5c3RlbUZlYXR1cmUoRkVBVFVSRV9XQVRDSCkKLSAgICAgICAgICAgICAgICA/IE1JTl9XQVRDSF9ERVZJQ0VfQVNQRUNUX1JBVElPIDogTUlOX0RFVklDRV9BU1BFQ1RfUkFUSU87Ci0KLSAgICAgICAgaWYgKGRldmljZUFzcGVjdFJhdGlvIDwgZXhwZWN0ZWRNaW5Bc3BlY3RSYXRpbykgewotICAgICAgICAgICAgZmFpbCgiZGV2aWNlQXNwZWN0UmF0aW89IiArIGRldmljZUFzcGVjdFJhdGlvCi0gICAgICAgICAgICAgICAgICAgICsgIiBpcyBsZXNzIHRoYW4gZXhwZWN0ZWRNaW5Bc3BlY3RSYXRpbz0iICsgZXhwZWN0ZWRNaW5Bc3BlY3RSYXRpbyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIEBQcmVzdWJtaXQKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWF4QXNwZWN0UmF0aW8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcnVuVGVzdChsYXVuY2hBY3Rpdml0eShtTWF4QXNwZWN0UmF0aW9BY3Rpdml0eSksCi0gICAgICAgICAgICAgICAgYWN0dWFsIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE1BWF9BU1BFQ1RfUkFUSU8gPj0gYWN0dWFsKSByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIGZhaWwoImFjdHVhbD0iICsgYWN0dWFsICsgIiBpcyBncmVhdGVyIHRoYW4gZXhwZWN0ZWQ9IiArIE1BWF9BU1BFQ1RfUkFUSU8pOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgQFByZXN1Ym1pdAotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRhRGF0YU1heEFzcGVjdFJhdGlvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJ1blRlc3QobGF1bmNoQWN0aXZpdHkobU1ldGFEYXRhTWF4QXNwZWN0UmF0aW9BY3Rpdml0eSksCi0gICAgICAgICAgICBhY3R1YWwgLT4gewotICAgICAgICAgICAgICAgIGlmIChNQVhfQVNQRUNUX1JBVElPID49IGFjdHVhbCkgcmV0dXJuOwotICAgICAgICAgICAgICAgIGZhaWwoImFjdHVhbD0iICsgYWN0dWFsICsgIiBpcyBncmVhdGVyIHRoYW4gZXhwZWN0ZWQ9IiArIE1BWF9BU1BFQ1RfUkFUSU8pOwotICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICAvLyBUT0RPOiBDdXJyZW50bHkgMTAlIGZsYWt5IHNvIG5vdCBwYXJ0IG9mIHByZS1zdWJtaXQgZm9yIG5vdwotICAgIHB1YmxpYyB2b2lkIHRlc3RNYXhBc3BlY3RSYXRpb1Jlc2l6ZWFibGVBY3Rpdml0eSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBDb250ZXh0IGNvbnRleHQgPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKS5nZXRDb250ZXh0KCk7Ci0gICAgICAgIGZpbmFsIGZsb2F0IGV4cGVjdGVkID0gZ2V0QXNwZWN0UmF0aW8oY29udGV4dCk7Ci0gICAgICAgIGZpbmFsIEFjdGl2aXR5IHRlc3RBY3Rpdml0eSA9IGxhdW5jaEFjdGl2aXR5KG1NYXhBc3BlY3RSYXRpb1Jlc2l6ZWFibGVBY3Rpdml0eSk7Ci0gICAgICAgIFBvbGxpbmdDaGVjay53YWl0Rm9yKHRlc3RBY3Rpdml0eTo6aGFzV2luZG93Rm9jdXMpOwotCi0gICAgICAgIERpc3BsYXkgdGVzdERpc3BsYXkgPSB0ZXN0QWN0aXZpdHkuZmluZFZpZXdCeUlkKGFuZHJvaWQuUi5pZC5jb250ZW50KS5nZXREaXNwbGF5KCk7Ci0KLSAgICAgICAgLy8gVE9ETyhiLzY5OTgyNDM0KTogRml4IERpc3BsYXlNYW5hZ2VyIE5QRSB3aGVuIGdldHRpbmcgZGlzcGxheSBmcm9tIEluc3RydW1lbnRhdGlvbgotICAgICAgICAvLyBjb250ZXh0LCB0aGVuIGNhbiB1c2UgRGlzcGxheU1hbmFnZXIgdG8gZ2V0IHRoZSBhc3BlY3QgcmF0aW8gb2YgdGhlIGNvcnJlY3QgZGlzcGxheS4KLSAgICAgICAgaWYgKHRlc3REaXNwbGF5LmdldERpc3BsYXlJZCgpICE9IERpc3BsYXkuREVGQVVMVF9ESVNQTEFZKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTaW5jZSB0aGlzIGFjdGl2aXR5IGlzIHJlc2l6ZWFibGUsIGl0cyBhc3BlY3QgcmF0aW8gc2hvdWxkbid0IGJlIGxlc3MgdGhhbiB0aGUgZGV2aWNlJ3MKLSAgICAgICAgcnVuVGVzdCh0ZXN0QWN0aXZpdHksCi0gICAgICAgICAgICAgICAgYWN0dWFsIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFzcGVjdFJhdGlvRXF1YWwoZXhwZWN0ZWQsIGFjdHVhbCkgfHwgZXhwZWN0ZWQgPCBhY3R1YWwpIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgZmFpbCgiYWN0dWFsPSIgKyBhY3R1YWwgKyAiIGlzIGxlc3MgdGhhbiBleHBlY3RlZD0iICsgZXhwZWN0ZWQpOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgQFByZXN1Ym1pdAotICAgIHB1YmxpYyB2b2lkIHRlc3RNYXhBc3BlY3RSYXRpb1Vuc2V0QWN0aXZpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0ID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0Q29udGV4dCgpOwotICAgICAgICBmaW5hbCBmbG9hdCBleHBlY3RlZCA9IGdldEFzcGVjdFJhdGlvKGNvbnRleHQpOwotCi0gICAgICAgIC8vIFNpbmNlIHRoaXMgYWN0aXZpdHkgZGlkbid0IHNldCBhbiBhc3BlY3QgcmF0aW8sIGl0cyBhc3BlY3QgcmF0aW8gc2hvdWxkbid0IGJlIGxlc3MgdGhhbgotICAgICAgICAvLyB0aGUgZGV2aWNlJ3MKLSAgICAgICAgcnVuVGVzdChsYXVuY2hBY3Rpdml0eShtTWF4QXNwZWN0UmF0aW9VbnNldEFjdGl2aXR5KSwKLSAgICAgICAgICAgICAgICBhY3R1YWwgLT4gewotICAgICAgICAgICAgICAgICAgICBpZiAoYXNwZWN0UmF0aW9FcXVhbChleHBlY3RlZCwgYWN0dWFsKSB8fCBleHBlY3RlZCA8IGFjdHVhbCkgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICBmYWlsKCJhY3R1YWw9IiArIGFjdHVhbCArICIgaXMgbGVzcyB0aGFuIGV4cGVjdGVkPSIgKyBleHBlY3RlZCk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICAvLyBUT0RPKGIvMzU4MTA1MTMpOiBDYW4ndCB1c2UgcnVsZSB0byBzdGFydCBhbiBhY3Rpdml0eSBpbiBhIGRpZmZlcmVudCBwcm9jZXNzLiBOZWVkIGEKLSAgICAvLyBkaWZmZXJlbnQgd2F5IHRvIG1ha2UgdGhpcyB0ZXN0IGhhcHBlbi4uLmhvc3Qgc2lkZT8gU2lnaC4uLgotICAgIEBJZ25vcmUKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWF4QXNwZWN0UmF0aW9QcmVPQWN0aXZpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcnVuVGVzdChsYXVuY2hBY3Rpdml0eShtU2RrMjVNYXhBc3BlY3RSYXRpb0FjdGl2aXR5KSwKLSAgICAgICAgICAgICAgICBhY3R1YWwgLT4gewotICAgICAgICAgICAgICAgICAgICBpZiAoTUFYX1BSRV9PX0FTUEVDVF9SQVRJTyA+PSBhY3R1YWwpIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgZmFpbCgiYWN0dWFsPSIgKyBhY3R1YWwgKyAiIGlzIGdyZWF0ZXIgdGhhbiBleHBlY3RlZD0iICsgTUFYX1BSRV9PX0FTUEVDVF9SQVRJTyk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJ1blRlc3QoQWN0aXZpdHkgYWN0aXZpdHksIEFzc2VydEFzcGVjdFJhdGlvQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgY2FsbGJhY2suYXNzZXJ0QXNwZWN0UmF0aW8oZ2V0QXNwZWN0UmF0aW8oYWN0aXZpdHkpKTsKLQotICAgICAgICAvLyBUT0RPKGIvMzU4MTA1MTMpOiBBbGwgdGhpcyByb3RhdGlvbiBzdHVmZiBkb2Vzbid0IHJlYWxseSB3b3JrIHlldC4gTmVlZCB0byBtYWtlIHN1cmUKLSAgICAgICAgLy8gY29udGV4dCBpcyB1cGRhdGVkIGNvcnJlY3RseSBoZXJlLiBBbHNvLCB3aGF0IGRvZXMgaXQgbWVhbiB0byBiZSBob2xkaW5nIGEgcmVmZXJlbmNlIHRvCi0gICAgICAgIC8vIHRoaXMgYWN0aXZpdHkgaWYgY2hhbmdpbmcgdGhlIG9yaWVudGF0aW9uIHdpbGwgY2F1c2UgYSByZWxhdW5jaD8KLS8vICAgICAgICBhY3Rpdml0eS5zZXRSZXF1ZXN0ZWRPcmllbnRhdGlvbihTQ1JFRU5fT1JJRU5UQVRJT05fTEFORFNDQVBFKTsKLS8vICAgICAgICB3YWl0Rm9ySWRsZSgpOwotLy8gICAgICAgIGNhbGxiYWNrLmFzc2VydEFzcGVjdFJhdGlvKGdldEFzcGVjdFJhdGlvKGFjdGl2aXR5KSk7Ci0vLwotLy8gICAgICAgIGFjdGl2aXR5LnNldFJlcXVlc3RlZE9yaWVudGF0aW9uKFNDUkVFTl9PUklFTlRBVElPTl9QT1JUUkFJVCk7Ci0vLyAgICAgICAgd2FpdEZvcklkbGUoKTsKLS8vICAgICAgICBjYWxsYmFjay5hc3NlcnRBc3BlY3RSYXRpbyhnZXRBc3BlY3RSYXRpbyhhY3Rpdml0eSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgZmxvYXQgZ2V0QXNwZWN0UmF0aW8oQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGZpbmFsIERpc3BsYXkgZGlzcGxheSA9Ci0gICAgICAgICAgICAgICAgKChXaW5kb3dNYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoV0lORE9XX1NFUlZJQ0UpKS5nZXREZWZhdWx0RGlzcGxheSgpOwotICAgICAgICBmaW5hbCBQb2ludCBzaXplID0gbmV3IFBvaW50KCk7Ci0gICAgICAgIGRpc3BsYXkuZ2V0U2l6ZShzaXplKTsKLSAgICAgICAgZmluYWwgZmxvYXQgbG9uZ1NpZGUgPSBNYXRoLm1heChzaXplLngsIHNpemUueSk7Ci0gICAgICAgIGZpbmFsIGZsb2F0IHNob3J0U2lkZSA9IE1hdGgubWluKHNpemUueCwgc2l6ZS55KTsKLSAgICAgICAgcmV0dXJuIGxvbmdTaWRlIC8gc2hvcnRTaWRlOwotICAgIH0KLQotICAgIHByaXZhdGUgQWN0aXZpdHkgbGF1bmNoQWN0aXZpdHkoQWN0aXZpdHlUZXN0UnVsZSBhY3Rpdml0eVJ1bGUpIHsKLSAgICAgICAgZmluYWwgQWN0aXZpdHkgYWN0aXZpdHkgPSBhY3Rpdml0eVJ1bGUubGF1bmNoQWN0aXZpdHkobnVsbCk7Ci0gICAgICAgIHdhaXRGb3JJZGxlKCk7Ci0gICAgICAgIHJldHVybiBhY3Rpdml0eTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZmluaXNoQWN0aXZpdHkoQWN0aXZpdHlUZXN0UnVsZSBhY3Rpdml0eVJ1bGUpIHsKLSAgICAgICAgZmluYWwgQWN0aXZpdHkgYWN0aXZpdHkgPSBhY3Rpdml0eVJ1bGUuZ2V0QWN0aXZpdHkoKTsKLSAgICAgICAgaWYgKGFjdGl2aXR5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFjdGl2aXR5LmZpbmlzaCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHdhaXRGb3JJZGxlKCkgewotICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKS53YWl0Rm9ySWRsZVN5bmMoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGFzcGVjdFJhdGlvRXF1YWwoZmxvYXQgYSwgZmxvYXQgYikgewotICAgICAgICAvLyBBc3BlY3QgcmF0aW9zIGFyZSBjb25zaWRlcmVkIGVxdWFsIGlmIHRoZXkgd2FyZSB3aXRoaW4gdG8gc2lnbmlmaWNhbnQgZGlnaXRzLgotICAgICAgICBmbG9hdCBkaWZmID0gTWF0aC5hYnMoYSAtIGIpOwotICAgICAgICByZXR1cm4gZGlmZiA8IDAuMDFmOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL0Jhc2VQcm9jZXNzSW5zdHJ1bWVudGF0aW9uLmphdmEgYi90ZXN0cy9hcHAvc3JjL2FuZHJvaWQvYXBwL2N0cy9CYXNlUHJvY2Vzc0luc3RydW1lbnRhdGlvbi5qYXZhCmluZGV4IGU4MTZhYzkuLjM0NDc0N2EgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL0Jhc2VQcm9jZXNzSW5zdHJ1bWVudGF0aW9uLmphdmEKKysrIGIvdGVzdHMvYXBwL3NyYy9hbmRyb2lkL2FwcC9jdHMvQmFzZVByb2Nlc3NJbnN0cnVtZW50YXRpb24uamF2YQpAQCAtMTcsNiArMTcsNyBAQAogcGFja2FnZSBhbmRyb2lkLmFwcC5jdHM7CiAKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BcHBsaWNhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb247CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwpAQCAtMzcsNiArMzgsMTEgQEAKICAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgYXJndW1lbnRzKSB7CiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKGFyZ3VtZW50cyk7CiAgICAgICAgIGZpbmFsIFN0cmluZyBwcm9jID0gZ2V0UHJvY2Vzc05hbWUoKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGFwcFByb2MgPSBBcHBsaWNhdGlvbi5nZXRQcm9jZXNzTmFtZSgpOworICAgICAgICBpZiAoIXByb2MuZXF1YWxzKGFwcFByb2MpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICJnZXRQcm9jZXNzTmFtZSgpcyBtaXNtYXRjaC4gSW5zdHI9JXMgQXBwPSVzIiwgcHJvYywgYXBwUHJvYykpOworICAgICAgICB9CiAgICAgICAgIC8vTG9nLmkoInh4eCIsICJJbnN0cnVtZW50YXRpb24gc3RhcnRpbmcgaW4gIiArIHByb2MpOwogICAgICAgICBmaW5hbCBCdW5kbGUgcmVzdWx0ID0gbmV3IEJ1bmRsZSgpOwogICAgICAgICByZXN1bHQucHV0Qm9vbGVhbihwcm9jLCB0cnVlKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL0RpYWxvZ1Rlc3QuamF2YSBiL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL0RpYWxvZ1Rlc3QuamF2YQppbmRleCBjMTYxMDFmLi5hYmI5OWI5IDEwMDc1NQotLS0gYS90ZXN0cy9hcHAvc3JjL2FuZHJvaWQvYXBwL2N0cy9EaWFsb2dUZXN0LmphdmEKKysrIGIvdGVzdHMvYXBwL3NyYy9hbmRyb2lkL2FwcC9jdHMvRGlhbG9nVGVzdC5qYXZhCkBAIC0xNSwxMCArMTUsMTkgQEAKICAqLwogcGFja2FnZSBhbmRyb2lkLmFwcC5jdHM7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFNhbWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCiBpbXBvcnQgYW5kcm9pZC5hcHAuRGlhbG9nOwogaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmFwcC5zdHVicy5EaWFsb2dTdHViQWN0aXZpdHk7CiBpbXBvcnQgYW5kcm9pZC5hcHAuc3R1YnMuT3JpZW50YXRpb25UZXN0VXRpbHM7CitpbXBvcnQgYW5kcm9pZC5hcHAuc3R1YnMuUjsKIGltcG9ydCBhbmRyb2lkLmFwcC5zdHVicy5UZXN0RGlhbG9nOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2U7CkBAIC0zOCw4ICs0Nyw3IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyOwotaW1wb3J0IGFuZHJvaWQudGVzdC5VaVRocmVhZFRlc3Q7CitpbXBvcnQgYW5kcm9pZC52aWV3LklucHV0RGV2aWNlOwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwpAQCAtNDksMTYgKzU3LDI0IEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OwogCi1pbXBvcnQgYW5kcm9pZC5hcHAuc3R1YnMuUjsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuUG9sbGluZ0NoZWNrOwogCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKIGltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CiAKLXB1YmxpYyBjbGFzcyBEaWFsb2dUZXN0IGV4dGVuZHMgQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI8RGlhbG9nU3R1YkFjdGl2aXR5PiB7CitAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIERpYWxvZ1Rlc3QgewogCiAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBsb25nIFNMRUVQX1RJTUUgPSAyMDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUVUJfQUNUSVZJVFlfUEFDS0FHRSA9ICJhbmRyb2lkLmFwcC5zdHVicyI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBURVNUX1RJTUVPVVQgPSAxMDAwTDsKIAogICAgIC8qKgpAQCAtNzYsMjMgKzkyLDIzIEBACiAgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OwogICAgIHByaXZhdGUgRGlhbG9nU3R1YkFjdGl2aXR5IG1BY3Rpdml0eTsKIAorICAgIEBSdWxlCisgICAgcHVibGljIEFjdGl2aXR5VGVzdFJ1bGU8RGlhbG9nU3R1YkFjdGl2aXR5PiBtQWN0aXZpdHlSdWxlID0KKyAgICAgICAgICAgIG5ldyBBY3Rpdml0eVRlc3RSdWxlPD4oRGlhbG9nU3R1YkFjdGl2aXR5LmNsYXNzLCBmYWxzZSwgZmFsc2UpOwogCi0gICAgcHVibGljIERpYWxvZ1Rlc3QoKSB7Ci0gICAgICAgIHN1cGVyKFNUVUJfQUNUSVZJVFlfUEFDS0FHRSwgRGlhbG9nU3R1YkFjdGl2aXR5LmNsYXNzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBtSW5zdHJ1bWVudGF0aW9uID0gZ2V0SW5zdHJ1bWVudGF0aW9uKCk7CisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldHVwKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIG1JbnN0cnVtZW50YXRpb24gPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKTsKICAgICAgICAgbUNvbnRleHQgPSBtSW5zdHJ1bWVudGF0aW9uLmdldENvbnRleHQoKTsKKyAgICAgICAgbUluc3RydW1lbnRhdGlvbi53YWl0Rm9ySWRsZVN5bmMoKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgc3RhcnREaWFsb2dBY3Rpdml0eShpbnQgZGlhbG9nTnVtYmVyKSB7Ci0gICAgICAgIG1BY3Rpdml0eSA9IERpYWxvZ1N0dWJBY3Rpdml0eS5zdGFydERpYWxvZ0FjdGl2aXR5KHRoaXMsIGRpYWxvZ051bWJlcik7CisgICAgICAgIG1BY3Rpdml0eSA9IERpYWxvZ1N0dWJBY3Rpdml0eS5zdGFydERpYWxvZ0FjdGl2aXR5KG1BY3Rpdml0eVJ1bGUsIGRpYWxvZ051bWJlcik7CiAgICAgfQogCiAgICAgQFVpVGhyZWFkVGVzdAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yKCkgewogICAgICAgICBuZXcgRGlhbG9nKG1Db250ZXh0KTsKICAgICAgICAgRGlhbG9nIGQgPSBuZXcgRGlhbG9nKG1Db250ZXh0LCAwKTsKQEAgLTExMCw2ICsxMjYsNyBAQAogICAgICAgICBhc3NlcnRUZXh0QXBwZWFyYW5jZVN0eWxlKHRhKTsKICAgICB9CiAKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3Rvcl9wcm90ZWN0ZWRDYW5jZWxsYWJsZSgpIHsKICAgICAgICAgc3RhcnREaWFsb2dBY3Rpdml0eShEaWFsb2dTdHViQWN0aXZpdHkuVEVTVF9QUk9URUNURURfQ0FOQ0VMQUJMRSk7CiAgICAgICAgIG1BY3Rpdml0eS5vbkNhbmNlbExpc3RlbmVyQ2FsbGVkID0gZmFsc2U7CkBAIC0xMTcsNiArMTM0LDcgQEAKICAgICAgICAgYXNzZXJ0VHJ1ZShtQWN0aXZpdHkub25DYW5jZWxMaXN0ZW5lckNhbGxlZCk7CiAgICAgfQogCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JfcHJvdGVjdGVkTm90Q2FuY2VsbGFibGUoKSB7CiAgICAgICAgIHN0YXJ0RGlhbG9nQWN0aXZpdHkoRGlhbG9nU3R1YkFjdGl2aXR5LlRFU1RfUFJPVEVDVEVEX05PVF9DQU5DRUxBQkxFKTsKICAgICAgICAgbUFjdGl2aXR5Lm9uQ2FuY2VsTGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKQEAgLTEyNCw2ICsxNDIsMjIgQEAKICAgICAgICAgYXNzZXJ0RmFsc2UobUFjdGl2aXR5Lm9uQ2FuY2VsTGlzdGVuZXJDYWxsZWQpOwogICAgIH0KIAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yX3Byb3RlY3RlZENhbmNlbGxhYmxlRXNjKCkgeworICAgICAgICBzdGFydERpYWxvZ0FjdGl2aXR5KERpYWxvZ1N0dWJBY3Rpdml0eS5URVNUX1BST1RFQ1RFRF9DQU5DRUxBQkxFKTsKKyAgICAgICAgbUFjdGl2aXR5Lm9uQ2FuY2VsTGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgc2VuZEtleXMoS2V5RXZlbnQuS0VZQ09ERV9FU0NBUEUpOworICAgICAgICBhc3NlcnRUcnVlKG1BY3Rpdml0eS5vbkNhbmNlbExpc3RlbmVyQ2FsbGVkKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3Rvcl9wcm90ZWN0ZWROb3RDYW5jZWxsYWJsZUVzYygpIHsKKyAgICAgICAgc3RhcnREaWFsb2dBY3Rpdml0eShEaWFsb2dTdHViQWN0aXZpdHkuVEVTVF9QUk9URUNURURfTk9UX0NBTkNFTEFCTEUpOworICAgICAgICBtQWN0aXZpdHkub25DYW5jZWxMaXN0ZW5lckNhbGxlZCA9IGZhbHNlOworICAgICAgICBzZW5kS2V5cyhLZXlFdmVudC5LRVlDT0RFX0VTQ0FQRSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1BY3Rpdml0eS5vbkNhbmNlbExpc3RlbmVyQ2FsbGVkKTsKKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgYXNzZXJ0VGV4dEFwcGVhcmFuY2VTdHlsZShUeXBlZEFycmF5IHRhKSB7CiAgICAgICAgIGZpbmFsIGludCBkZWZWYWx1ZSA9IC0xOwogICAgICAgICAvLyBnZXQgVGhlbWUgYW5kIGFzc2VydApAQCAtMTQxLDExICsxNzUsMTIgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVGEuZ2V0Q29sb3IoUi5zdHlsZWFibGUuVGV4dEFwcGVhcmFuY2VfdGV4dENvbG9ySGlnaGxpZ2h0LCBkZWZWYWx1ZSksCiAgICAgICAgICAgICAgICAgdGEuZ2V0Q29sb3IoUi5zdHlsZWFibGUuVGV4dEFwcGVhcmFuY2VfdGV4dENvbG9ySGlnaGxpZ2h0LCBkZWZWYWx1ZSkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRUYS5nZXREaW1lbnNpb24oUi5zdHlsZWFibGUuVGV4dEFwcGVhcmFuY2VfdGV4dFNpemUsIGRlZlZhbHVlKSwKLSAgICAgICAgICAgICAgICB0YS5nZXREaW1lbnNpb24oUi5zdHlsZWFibGUuVGV4dEFwcGVhcmFuY2VfdGV4dFNpemUsIGRlZlZhbHVlKSk7CisgICAgICAgICAgICAgICAgdGEuZ2V0RGltZW5zaW9uKFIuc3R5bGVhYmxlLlRleHRBcHBlYXJhbmNlX3RleHRTaXplLCBkZWZWYWx1ZSksIEZsb2F0Lk1JTl9WQUxVRSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFRhLmdldEludChSLnN0eWxlYWJsZS5UZXh0QXBwZWFyYW5jZV90ZXh0U3R5bGUsIGRlZlZhbHVlKSwKICAgICAgICAgICAgICAgICB0YS5nZXRJbnQoUi5zdHlsZWFibGUuVGV4dEFwcGVhcmFuY2VfdGV4dFN0eWxlLCBkZWZWYWx1ZSkpOwogICAgIH0KIAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE9uU3RhcnRDcmVhdGVTdG9wKCl7CiAgICAgICAgIHN0YXJ0RGlhbG9nQWN0aXZpdHkoRGlhbG9nU3R1YkFjdGl2aXR5LlRFU1RfT05TVEFSVF9BTkRfT05TVE9QKTsKICAgICAgICAgZmluYWwgVGVzdERpYWxvZyBkID0gKFRlc3REaWFsb2cpIG1BY3Rpdml0eS5nZXREaWFsb2coKTsKQEAgLTE1OCw2ICsxOTMsMjAgQEAKICAgICAgICAgYXNzZXJ0VHJ1ZShkLmlzT25TdG9wQ2FsbGVkKTsKICAgICB9CiAKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPblN0YXJ0Q3JlYXRlU3RvcEVzYygpeworICAgICAgICBzdGFydERpYWxvZ0FjdGl2aXR5KERpYWxvZ1N0dWJBY3Rpdml0eS5URVNUX09OU1RBUlRfQU5EX09OU1RPUCk7CisgICAgICAgIGZpbmFsIFRlc3REaWFsb2cgZCA9IChUZXN0RGlhbG9nKSBtQWN0aXZpdHkuZ2V0RGlhbG9nKCk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShkLmlzT25TdGFydENhbGxlZCk7CisgICAgICAgIGFzc2VydFRydWUoZC5pc09uQ3JlYXRlQ2FsbGVkKTsKKworICAgICAgICBhc3NlcnRGYWxzZShkLmlzT25TdG9wQ2FsbGVkKTsKKyAgICAgICAgc2VuZEtleXMoS2V5RXZlbnQuS0VZQ09ERV9FU0NBUEUpOworICAgICAgICBhc3NlcnRUcnVlKGQuaXNPblN0b3BDYWxsZWQpOworICAgIH0KKworICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEFjY2Vzc093bmVyQWN0aXZpdHkoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgc3RhcnREaWFsb2dBY3Rpdml0eShEaWFsb2dTdHViQWN0aXZpdHkuVEVTVF9ESUFMT0dfV0lUSE9VVF9USEVNRSk7CiAgICAgICAgIERpYWxvZyBkID0gbUFjdGl2aXR5LmdldERpYWxvZygpOwpAQCAtMTczLDcgKzIyMiw3IEBACiAgICAgICAgICAgICAvLyBleHBlY3RlZAogICAgICAgICB9CiAKLSAgICAgICAgcnVuVGVzdE9uVWlUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICBtQWN0aXZpdHlSdWxlLnJ1bk9uVWlUaHJlYWQobmV3IFJ1bm5hYmxlKCkgewogICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewogICAgICAgICAgICAgICAgIERpYWxvZyBkaWFsb2cgPSBuZXcgRGlhbG9nKG1Db250ZXh0KTsKICAgICAgICAgICAgICAgICBhc3NlcnROdWxsKGRpYWxvZy5nZXRPd25lckFjdGl2aXR5KCkpOwpAQCAtMTgyLDEyICsyMzEsMTMgQEAKICAgICAgICAgbUluc3RydW1lbnRhdGlvbi53YWl0Rm9ySWRsZVN5bmMoKTsKICAgICB9CiAKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTaG93KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIHN0YXJ0RGlhbG9nQWN0aXZpdHkoRGlhbG9nU3R1YkFjdGl2aXR5LlRFU1RfRElBTE9HX1dJVEhPVVRfVEhFTUUpOwogICAgICAgICBmaW5hbCBEaWFsb2cgZCA9IG1BY3Rpdml0eS5nZXREaWFsb2coKTsKICAgICAgICAgZmluYWwgVmlldyBkZWNvciA9IGQuZ2V0V2luZG93KCkuZ2V0RGVjb3JWaWV3KCk7CiAKLSAgICAgICAgcnVuVGVzdE9uVWlUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICBtQWN0aXZpdHlSdWxlLnJ1bk9uVWlUaHJlYWQobmV3IFJ1bm5hYmxlKCkgewogICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewogICAgICAgICAgICAgICAgIGQuaGlkZSgpOwogICAgICAgICAgICAgfQpAQCAtMTk3LDcgKzI0Nyw3IEBACiAgICAgICAgIGFzc2VydEVxdWFscyhWaWV3LkdPTkUsIGRlY29yLmdldFZpc2liaWxpdHkoKSk7CiAgICAgICAgIGFzc2VydFRydWUoZC5pc1Nob3dpbmcoKSk7CiAKLSAgICAgICAgcnVuVGVzdE9uVWlUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICBtQWN0aXZpdHlSdWxlLnJ1bk9uVWlUaHJlYWQobmV3IFJ1bm5hYmxlKCkgewogICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewogICAgICAgICAgICAgICAgIGQuc2hvdygpOwogICAgICAgICAgICAgfQpAQCAtMjEwLDYgKzI2MCw3IEBACiAgICAgICAgIGFzc2VydEZhbHNlKGQuaXNTaG93aW5nKCkpOwogICAgIH0KIAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE9uU2F2ZUluc3RhbmNlU3RhdGUoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewogICAgICAgICBzdGFydERpYWxvZ0FjdGl2aXR5KERpYWxvZ1N0dWJBY3Rpdml0eS5URVNUX09OU1RBUlRfQU5EX09OU1RPUCk7CiAgICAgICAgIGZpbmFsIFRlc3REaWFsb2cgZCA9IChUZXN0RGlhbG9nKSBtQWN0aXZpdHkuZ2V0RGlhbG9nKCk7CkBAIC0yMjgsMTEgKzI3OSwxMyBAQAogICAgICAgICBUZXN0RGlhbG9nLm9uUmVzdG9yZUluc3RhbmNlU3RhdGVPYnNlcnZlci5hd2FpdCgpOwogICAgIH0KIAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEdldEN1cnJlbnRGb2N1cygpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBzdGFydERpYWxvZ0FjdGl2aXR5KERpYWxvZ1N0dWJBY3Rpdml0eS5URVNUX09OU1RBUlRfQU5EX09OU1RPUCk7CiAgICAgICAgIGZpbmFsIFRlc3REaWFsb2cgZCA9IChUZXN0RGlhbG9nKSBtQWN0aXZpdHkuZ2V0RGlhbG9nKCk7CiAgICAgICAgIGFzc2VydE51bGwoZC5nZXRDdXJyZW50Rm9jdXMoKSk7Ci0gICAgICAgIHJ1blRlc3RPblVpVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKworICAgICAgICBtQWN0aXZpdHlSdWxlLnJ1bk9uVWlUaHJlYWQobmV3IFJ1bm5hYmxlKCkgewogICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewogICAgICAgICAgICAgICAgIGQudGFrZUtleUV2ZW50cyh0cnVlKTsKICAgICAgICAgICAgICAgICBkLnNldENvbnRlbnRWaWV3KFIubGF5b3V0LmFsZXJ0X2RpYWxvZ190ZXh0X2VudHJ5KTsKQEAgLTI0MSwxNyArMjk0LDE4IEBACiAgICAgICAgIG1JbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7CiAKICAgICAgICAgc2VuZEtleXMoS2V5RXZlbnQuS0VZQ09ERV8wKTsKLSAgICAgICAgLy8gV2hlbiBtV2luZG93IGlzIG5vdCBudWxsIGdldENVcnJlbnRGb2N1cyBpcyB0aGUgdmlldyBpbiBkaWFsb2cKKyAgICAgICAgLy8gV2hlbiBtV2luZG93IGlzIG5vdCBudWxsIGdldEN1cnJlbnRGb2N1cyBpcyB0aGUgdmlldyBpbiBkaWFsb2cKICAgICAgICAgYXNzZXJ0RXF1YWxzKGQuZ2V0V2luZG93KCkuZ2V0Q3VycmVudEZvY3VzKCksIGQuZ2V0Q3VycmVudEZvY3VzKCkpOwogICAgIH0KIAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFNldENvbnRlbnRWaWV3KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIHN0YXJ0RGlhbG9nQWN0aXZpdHkoRGlhbG9nU3R1YkFjdGl2aXR5LlRFU1RfRElBTE9HX1dJVEhPVVRfVEhFTUUpOwogICAgICAgICBmaW5hbCBEaWFsb2cgZCA9IG1BY3Rpdml0eS5nZXREaWFsb2coKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChkKTsKIAogICAgICAgICAvLyBzZXQgY29udGVudCB2aWV3IHRvIGEgZm91ciBlbGVtZW50cyBsYXlvdXQKLSAgICAgICAgcnVuVGVzdE9uVWlUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICBtQWN0aXZpdHlSdWxlLnJ1bk9uVWlUaHJlYWQobmV3IFJ1bm5hYmxlKCkgewogICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewogICAgICAgICAgICAgICAgIGQuc2V0Q29udGVudFZpZXcoUi5sYXlvdXQuYWxlcnRfZGlhbG9nX3RleHRfZW50cnkpOwogICAgICAgICAgICAgfQpAQCAtMjY3LDcgKzMyMSw3IEBACiAgICAgICAgIGZpbmFsIExheW91dEluZmxhdGVyIGluZmxhdGUxID0gZC5nZXRMYXlvdXRJbmZsYXRlcigpOwogCiAgICAgICAgIC8vIHNldCBjb250ZW50IHZpZXcgdG8gYSB0d28gZWxlbWVudHMgbGF5b3V0Ci0gICAgICAgIHJ1blRlc3RPblVpVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgbUFjdGl2aXR5UnVsZS5ydW5PblVpVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKICAgICAgICAgICAgICAgICBkLnNldENvbnRlbnRWaWV3KGluZmxhdGUxLmluZmxhdGUoUi5sYXlvdXQuYWxlcnRfZGlhbG9nX3RleHRfZW50cnlfMiwgbnVsbCkpOwogICAgICAgICAgICAgfQpAQCAtMjg0LDcgKzMzOCw3IEBACiAgICAgICAgIGZpbmFsIExheW91dEluZmxhdGVyIGluZmxhdGUyID0gbUFjdGl2aXR5LmdldExheW91dEluZmxhdGVyKCk7CiAKICAgICAgICAgLy8gc2V0IGNvbnRlbnQgdmlldyB0byBhIGZvdXIgZWxlbWVudHMgbGF5b3V0Ci0gICAgICAgIHJ1blRlc3RPblVpVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgbUFjdGl2aXR5UnVsZS5ydW5PblVpVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKICAgICAgICAgICAgICAgICBkLnNldENvbnRlbnRWaWV3KGluZmxhdGUyLmluZmxhdGUoUi5sYXlvdXQuYWxlcnRfZGlhbG9nX3RleHRfZW50cnksIG51bGwpLCBscCk7CiAgICAgICAgICAgICB9CkBAIC0zMDMsNyArMzU3LDcgQEAKICAgICAgICAgbHAyLndpZHRoID0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQ7CiAKICAgICAgICAgLy8gYWRkIGEgY2hlY2sgYm94IHZpZXcKLSAgICAgICAgcnVuVGVzdE9uVWlUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICBtQWN0aXZpdHlSdWxlLnJ1bk9uVWlUaHJlYWQobmV3IFJ1bm5hYmxlKCkgewogICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewogICAgICAgICAgICAgICAgIGQuYWRkQ29udGVudFZpZXcoaW5mbGF0ZTMuaW5mbGF0ZShSLmxheW91dC5jaGVja2JveF9sYXlvdXQsIG51bGwpLCBscDIpOwogICAgICAgICAgICAgfQpAQCAtMzE4LDYgKzM3Miw0MSBAQAogICAgICAgICBhc3NlcnROb3ROdWxsKGQuZmluZFZpZXdCeUlkKFIuaWQucGFzc3dvcmRfZWRpdCkpOwogICAgIH0KIAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcXVpcmVWaWV3QnlJZCgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBzdGFydERpYWxvZ0FjdGl2aXR5KERpYWxvZ1N0dWJBY3Rpdml0eS5URVNUX0RJQUxPR19XSVRIT1VUX1RIRU1FKTsKKyAgICAgICAgZmluYWwgRGlhbG9nIGQgPSBtQWN0aXZpdHkuZ2V0RGlhbG9nKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoZCk7CisKKyAgICAgICAgLy8gc2V0IGNvbnRlbnQgdmlldyB0byBhIGZvdXIgZWxlbWVudHMgbGF5b3V0CisgICAgICAgIG1BY3Rpdml0eVJ1bGUucnVuT25VaVRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgZC5zZXRDb250ZW50VmlldyhSLmxheW91dC5hbGVydF9kaWFsb2dfdGV4dF9lbnRyeSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLndhaXRGb3JJZGxlU3luYygpOworCisgICAgICAgIC8vIGNoZWNrIGlmIGZvdXIgZWxlbWVudHMgYXJlIHJpZ2h0IHRoZXJlCisgICAgICAgIGFzc2VydE5vdE51bGwoZC5yZXF1aXJlVmlld0J5SWQoUi5pZC51c2VybmFtZV92aWV3KSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoZC5yZXF1aXJlVmlld0J5SWQoUi5pZC51c2VybmFtZV9lZGl0KSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoZC5yZXF1aXJlVmlld0J5SWQoUi5pZC5wYXNzd29yZF92aWV3KSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoZC5yZXF1aXJlVmlld0J5SWQoUi5pZC5wYXNzd29yZF9lZGl0KSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBkLnJlcXVpcmVWaWV3QnlJZChSLmlkLmNoZWNrX2JveCk7IC8vIG5vdCBwcmVzZW50CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgbm90IGdldCBoZXJlLCBjaGVja19ib3ggc2hvdWxkIG5vdCBiZSBmb3VuZCIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgZC5yZXF1aXJlVmlld0J5SWQoVmlldy5OT19JRCk7IC8vIGludmFsaWQKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCBub3QgZ2V0IGhlcmUsIE5PX0lEIHNob3VsZCBub3QgYmUgZm91bmQiKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKyAgICB9CisKKworICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFNldFRpdGxlKCkgewogICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWRUaXRsZSA9ICJUZXN0IERpYWxvZyBXaXRob3V0IHRoZW1lIjsKICAgICAgICAgc3RhcnREaWFsb2dBY3Rpdml0eShEaWFsb2dTdHViQWN0aXZpdHkuVEVTVF9ESUFMT0dfV0lUSE9VVF9USEVNRSk7CkBAIC0zMzUsNiArNDI0LDcgQEAKICAgICAgICAgICAgICAgICAoU3RyaW5nKSBkLmdldFdpbmRvdygpLmdldEF0dHJpYnV0ZXMoKS5nZXRUaXRsZSgpKTsKICAgICB9CiAKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RPbktleURvd25LZXlVcCgpIHsKICAgICAgICAgc3RhcnREaWFsb2dBY3Rpdml0eShEaWFsb2dTdHViQWN0aXZpdHkuVEVTVF9PTlNUQVJUX0FORF9PTlNUT1ApOwogICAgICAgICBmaW5hbCBUZXN0RGlhbG9nIGQgPSAoVGVzdERpYWxvZykgbUFjdGl2aXR5LmdldERpYWxvZygpOwpAQCAtMzU0LDM2ICs0NDQsNTAgQEAKICAgICAgICAgYXNzZXJ0VHJ1ZShkLm9uS2V5RG93blJldHVybik7CiAgICAgfQogCi0gICAgIHB1YmxpYyB2b2lkIHRlc3RPbktleU11bHRpcGxlKCkgewotICAgICAgICAgc3RhcnREaWFsb2dBY3Rpdml0eShEaWFsb2dTdHViQWN0aXZpdHkuVEVTVF9PTlNUQVJUX0FORF9PTlNUT1ApOwotICAgICAgICAgZmluYWwgVGVzdERpYWxvZyBkID0gKFRlc3REaWFsb2cpIG1BY3Rpdml0eS5nZXREaWFsb2coKTsKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPbktleU11bHRpcGxlKCkgeworICAgICAgICBzdGFydERpYWxvZ0FjdGl2aXR5KERpYWxvZ1N0dWJBY3Rpdml0eS5URVNUX09OU1RBUlRfQU5EX09OU1RPUCk7CisgICAgICAgIGZpbmFsIFRlc3REaWFsb2cgZCA9IChUZXN0RGlhbG9nKSBtQWN0aXZpdHkuZ2V0RGlhbG9nKCk7CiAKLSAgICAgICAgIGFzc2VydE51bGwoZC5rZXlNdWx0aXBsZUV2ZW50KTsKLSAgICAgICAgIGQuZGlzcGF0Y2hLZXlFdmVudChuZXcgS2V5RXZlbnQoS2V5RXZlbnQuQUNUSU9OX01VTFRJUExFLCBLZXlFdmVudC5LRVlDT0RFX1VOS05PV04pKTsKLSAgICAgICAgIGFzc2VydFRydWUoZC5pc09uS2V5TXVsdGlwbGVDYWxsZWQpOwotICAgICAgICAgYXNzZXJ0RmFsc2UoZC5vbktleU11bHRpcGxlUmV0dXJuKTsKLSAgICAgICAgIGFzc2VydEVxdWFscyhLZXlFdmVudC5LRVlDT0RFX1VOS05PV04sIGQua2V5TXVsdGlwbGVFdmVudC5nZXRLZXlDb2RlKCkpOwotICAgICAgICAgYXNzZXJ0RXF1YWxzKEtleUV2ZW50LkFDVElPTl9NVUxUSVBMRSwgZC5rZXlNdWx0aXBsZUV2ZW50LmdldEFjdGlvbigpKTsKLSAgICAgfQorICAgICAgICBhc3NlcnROdWxsKGQua2V5TXVsdGlwbGVFdmVudCk7CisgICAgICAgIGQuZGlzcGF0Y2hLZXlFdmVudChuZXcgS2V5RXZlbnQoS2V5RXZlbnQuQUNUSU9OX01VTFRJUExFLCBLZXlFdmVudC5LRVlDT0RFX1VOS05PV04pKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkLmlzT25LZXlNdWx0aXBsZUNhbGxlZCk7CisgICAgICAgIGFzc2VydEZhbHNlKGQub25LZXlNdWx0aXBsZVJldHVybik7CisgICAgICAgIGFzc2VydEVxdWFscyhLZXlFdmVudC5LRVlDT0RFX1VOS05PV04sIGQua2V5TXVsdGlwbGVFdmVudC5nZXRLZXlDb2RlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoS2V5RXZlbnQuQUNUSU9OX01VTFRJUExFLCBkLmtleU11bHRpcGxlRXZlbnQuZ2V0QWN0aW9uKCkpOworICAgIH0KIAorICAgIHByaXZhdGUgTW90aW9uRXZlbnQgc2VuZFRvdWNoRXZlbnQobG9uZyBkb3duVGltZSwgaW50IGFjdGlvbiwgZmxvYXQgeCwgZmxvYXQgeSkgeworICAgICAgICBsb25nIGV2ZW50VGltZSA9IGRvd25UaW1lOworICAgICAgICBpZiAoYWN0aW9uICE9IE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOKSB7CisgICAgICAgICAgICBldmVudFRpbWUgKz0gMTsKKyAgICAgICAgfQorICAgICAgICBNb3Rpb25FdmVudCBldmVudCA9IE1vdGlvbkV2ZW50Lm9idGFpbihkb3duVGltZSwgZXZlbnRUaW1lLCBhY3Rpb24sIHgsIHksIDApOworICAgICAgICBldmVudC5zZXRTb3VyY2UoSW5wdXREZXZpY2UuU09VUkNFX1RPVUNIU0NSRUVOKTsKKyAgICAgICAgbUluc3RydW1lbnRhdGlvbi5nZXRVaUF1dG9tYXRpb24oKS5pbmplY3RJbnB1dEV2ZW50KGV2ZW50LCB0cnVlKTsKKyAgICAgICAgbUluc3RydW1lbnRhdGlvbi53YWl0Rm9ySWRsZVN5bmMoKTsKKyAgICAgICAgcmV0dXJuIGV2ZW50OworICAgIH0KKworICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFRvdWNoRXZlbnQoKSB7CiAgICAgICAgIHN0YXJ0RGlhbG9nQWN0aXZpdHkoRGlhbG9nU3R1YkFjdGl2aXR5LlRFU1RfT05TVEFSVF9BTkRfT05TVE9QKTsKICAgICAgICAgZmluYWwgVGVzdERpYWxvZyBkID0gKFRlc3REaWFsb2cpIG1BY3Rpdml0eS5nZXREaWFsb2coKTsKICAgICAgICAgZmluYWwgUmVjdCBjb250YWluaW5nUmVjdCA9IG5ldyBSZWN0KCk7CiAgICAgICAgIG1BY3Rpdml0eS5nZXRXaW5kb3coKS5nZXREZWNvclZpZXcoKS5nZXRXaW5kb3dWaXNpYmxlRGlzcGxheUZyYW1lKGNvbnRhaW5pbmdSZWN0KTsKKyAgICAgICAgZmluYWwgaW50IHggPSBjb250YWluaW5nUmVjdC5sZWZ0ICsgMTsKKyAgICAgICAgZmluYWwgaW50IHkgPSBjb250YWluaW5nUmVjdC50b3AgKyAxOwogCiAgICAgICAgIGFzc2VydE51bGwoZC5vblRvdWNoRXZlbnQpOwogICAgICAgICBhc3NlcnROdWxsKGQudG91Y2hFdmVudCk7CiAgICAgICAgIGFzc2VydEZhbHNlKGQuaXNPblRvdWNoRXZlbnRDYWxsZWQpOwogCi0gICAgICAgIC8vIFNlbmQgYSB0b3VjaCBldmVudCBvdXRzaWRlIHRoZSBhY3Rpdml0eS4gIFRoZSBldmVudCB3aWxsIGJlIGlnbm9yZWQKKyAgICAgICAgLy8gU2VuZCBhIHRvdWNoIGV2ZW50IG91dHNpZGUgdGhlIGRpYWxvZyB3aW5kb3cuICBFeHBlY3QgdGhlIGV2ZW50IHRvIGJlIGlnbm9yZWQKICAgICAgICAgLy8gYmVjYXVzZSBjbG9zZU9uVG91Y2hPdXRzaWRlIGlzIGZhbHNlLgogICAgICAgICBkLnNldENhbmNlbGVkT25Ub3VjaE91dHNpZGUoZmFsc2UpOwogCiAgICAgICAgIGxvbmcgbm93ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7Ci0gICAgICAgIE1vdGlvbkV2ZW50IHRvdWNoTW90aW9uRXZlbnQgPSBNb3Rpb25FdmVudC5vYnRhaW4obm93LCBub3csIE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOLAotICAgICAgICAgICAgICAgIGNvbnRhaW5pbmdSZWN0LmxlZnQgKyAxLCBjb250YWluaW5nUmVjdC50b3AgKyAxLCAwKTsKLSAgICAgICAgbUluc3RydW1lbnRhdGlvbi5zZW5kUG9pbnRlclN5bmModG91Y2hNb3Rpb25FdmVudCk7CisgICAgICAgIE1vdGlvbkV2ZW50IHRvdWNoTW90aW9uRXZlbnQgPSBzZW5kVG91Y2hFdmVudChub3csIE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOLCB4LCB5KTsKIAogICAgICAgICBuZXcgUG9sbGluZ0NoZWNrKFRFU1RfVElNRU9VVCkgewogICAgICAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2soKSB7CkBAIC0zOTIsNDMgKzQ5Niw0MSBAQAogICAgICAgICB9LnJ1bigpOwogCiAgICAgICAgIGFzc2VydE1vdGlvbkV2ZW50RXF1YWxzKHRvdWNoTW90aW9uRXZlbnQsIGQudG91Y2hFdmVudCk7Ci0KICAgICAgICAgYXNzZXJ0VHJ1ZShkLmlzT25Ub3VjaEV2ZW50Q2FsbGVkKTsKICAgICAgICAgYXNzZXJ0TW90aW9uRXZlbnRFcXVhbHModG91Y2hNb3Rpb25FdmVudCwgZC5vblRvdWNoRXZlbnQpOwogICAgICAgICBkLmlzT25Ub3VjaEV2ZW50Q2FsbGVkID0gZmFsc2U7CiAgICAgICAgIGFzc2VydFRydWUoZC5pc1Nob3dpbmcoKSk7CisgICAgICAgIHRvdWNoTW90aW9uRXZlbnQucmVjeWNsZSgpOworICAgICAgICAvLyBTZW5kIEFDVElPTl9VUCB0byBrZWVwIHRoZSBldmVudCBzdHJlYW0gY29uc2lzdGVudAorICAgICAgICBzZW5kVG91Y2hFdmVudChub3csIE1vdGlvbkV2ZW50LkFDVElPTl9VUCwgeCwgeSkucmVjeWNsZSgpOwogCi0gICAgICAgIC8vIFdhdGNoIGFjdGl2aXRpZXMgY292ZXIgdGhlIGVudGlyZSBzY3JlZW4sIHNvIHRoZXJlIGlzIG5vIHdheSB0byB0b3VjaCBvdXRzaWRlLgotICAgICAgICBpZiAoIW1Db250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCkuaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX1dBVENIKSkgewotICAgICAgICAgICAgLy8gU2VuZCBhIHRvdWNoIGV2ZW50IG91dHNpZGUgdGhlIGFjdGl2aXR5LiAgVGhpcyB0aW1lIHRoZSBkaWFsb2cgd2lsbCBiZSBkaXNtaXNzZWQKLSAgICAgICAgICAgIC8vIGJlY2F1c2UgY2xvc2VPblRvdWNoT3V0c2lkZSBpcyB0cnVlLgotICAgICAgICAgICAgZC5zZXRDYW5jZWxlZE9uVG91Y2hPdXRzaWRlKHRydWUpOwotCi0gICAgICAgICAgICB0b3VjaE1vdGlvbkV2ZW50ID0gTW90aW9uRXZlbnQub2J0YWluKG5vdywgbm93ICsgMSwgTW90aW9uRXZlbnQuQUNUSU9OX0RPV04sCi0gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5pbmdSZWN0LmxlZnQgKyAxLCBjb250YWluaW5nUmVjdC50b3AgKyAxLCAwKTsKLSAgICAgICAgICAgIG1JbnN0cnVtZW50YXRpb24uc2VuZFBvaW50ZXJTeW5jKHRvdWNoTW90aW9uRXZlbnQpOwotCi0gICAgICAgICAgICBuZXcgUG9sbGluZ0NoZWNrKFRFU1RfVElNRU9VVCkgewotICAgICAgICAgICAgICAgIHByb3RlY3RlZCBib29sZWFuIGNoZWNrKCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZC5kaXNwYXRjaFRvdWNoRXZlbnRSZXN1bHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfS5ydW4oKTsKLQotICAgICAgICAgICAgYXNzZXJ0TW90aW9uRXZlbnRFcXVhbHModG91Y2hNb3Rpb25FdmVudCwgZC50b3VjaEV2ZW50KTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShkLmlzT25Ub3VjaEV2ZW50Q2FsbGVkKTsKLSAgICAgICAgICAgIGFzc2VydE1vdGlvbkV2ZW50RXF1YWxzKHRvdWNoTW90aW9uRXZlbnQsIGQub25Ub3VjaEV2ZW50KTsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKGQuaXNTaG93aW5nKCkpOworICAgICAgICBpZiAobUNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKS5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfV0FUQ0gpKSB7CisgICAgICAgICAgICAvLyBXYXRjaCBhY3Rpdml0aWVzIGNvdmVyIHRoZSBlbnRpcmUgc2NyZWVuLCBzbyB0aGVyZSBpcyBubyB3YXkgdG8gdG91Y2ggb3V0c2lkZS4KKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQorCisgICAgICAgIC8vIFNlbmQgYSB0b3VjaCBldmVudCBvdXRzaWRlIHRoZSBkaWFsb2cgd2luZG93LiBFeHBlY3QgdGhlIGRpYWxvZyB0byBiZSBkaXNtaXNzZWQKKyAgICAgICAgLy8gYmVjYXVzZSBjbG9zZU9uVG91Y2hPdXRzaWRlIGlzIHRydWUuCisKKyAgICAgICAgZC5zZXRDYW5jZWxlZE9uVG91Y2hPdXRzaWRlKHRydWUpOworICAgICAgICBub3cgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgdG91Y2hNb3Rpb25FdmVudCA9IHNlbmRUb3VjaEV2ZW50KG5vdywgTW90aW9uRXZlbnQuQUNUSU9OX0RPV04sIHgsIHkpOworCisgICAgICAgIG5ldyBQb2xsaW5nQ2hlY2soVEVTVF9USU1FT1VUKSB7CisgICAgICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjaGVjaygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZC5kaXNwYXRjaFRvdWNoRXZlbnRSZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0ucnVuKCk7CisKKyAgICAgICAgYXNzZXJ0TW90aW9uRXZlbnRFcXVhbHModG91Y2hNb3Rpb25FdmVudCwgZC50b3VjaEV2ZW50KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkLmlzT25Ub3VjaEV2ZW50Q2FsbGVkKTsKKyAgICAgICAgYXNzZXJ0TW90aW9uRXZlbnRFcXVhbHModG91Y2hNb3Rpb25FdmVudCwgZC5vblRvdWNoRXZlbnQpOworICAgICAgICBhc3NlcnRGYWxzZShkLmlzU2hvd2luZygpKTsKKyAgICAgICAgdG91Y2hNb3Rpb25FdmVudC5yZWN5Y2xlKCk7CisgICAgICAgIHNlbmRUb3VjaEV2ZW50KG5vdywgTW90aW9uRXZlbnQuQUNUSU9OX1VQLCB4LCB5KS5yZWN5Y2xlKCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBpbnQgZ2V0U3RhdHVzQmFySGVpZ2h0KCkgewotICAgICAgICBmaW5hbCBSZWN0IHJlY3QgPSBuZXcgUmVjdCgpOwotICAgICAgICBXaW5kb3cgd2luZG93ID0gbUFjdGl2aXR5LmdldFdpbmRvdygpOwotICAgICAgICB3aW5kb3cuZ2V0RGVjb3JWaWV3KCkuZ2V0V2luZG93VmlzaWJsZURpc3BsYXlGcmFtZShyZWN0KTsKLSAgICAgICAgcmV0dXJuIHJlY3QudG9wOwotICAgIH0KLQorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFRyYWNrYmFsbEV2ZW50KCkgewogICAgICAgICBzdGFydERpYWxvZ0FjdGl2aXR5KERpYWxvZ1N0dWJBY3Rpdml0eS5URVNUX09OU1RBUlRfQU5EX09OU1RPUCk7CiAgICAgICAgIGZpbmFsIFRlc3REaWFsb2cgZCA9IChUZXN0RGlhbG9nKSBtQWN0aXZpdHkuZ2V0RGlhbG9nKCk7CkBAIC00NDgsMTYgKzU1MCwxOCBAQAogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBhc3NlcnRNb3Rpb25FdmVudEVxdWFscyhmaW5hbCBNb3Rpb25FdmVudCBleHBlY3RlZCwgZmluYWwgTW90aW9uRXZlbnQgYWN0dWFsKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwoYWN0dWFsKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmdldERvd25UaW1lKCksIGFjdHVhbC5nZXREb3duVGltZSgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmdldEV2ZW50VGltZSgpLCBhY3R1YWwuZ2V0RXZlbnRUaW1lKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuZ2V0QWN0aW9uKCksIGFjdHVhbC5nZXRBY3Rpb24oKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZC5nZXRNZXRhU3RhdGUoKSwgYWN0dWFsLmdldE1ldGFTdGF0ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmdldFNpemUoKSwgYWN0dWFsLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZC5nZXRTaXplKCksIGFjdHVhbC5nZXRTaXplKCksIEZsb2F0Lk1JTl9WQUxVRSk7CiAgICAgICAgIC8vIEFzIE1vdGlvbkV2ZW50IGRvYyBzYXlzIHRoZSB2YWx1ZSBvZiBYIGFuZCBZIGNvb3JkaW5hdGUgbWF5IGhhdmUKICAgICAgICAgLy8gYSBmcmFjdGlvbiBmb3IgaW5wdXQgZGV2aWNlcyB0aGF0IGFyZSBzdWItcGl4ZWwgcHJlY2lzZSwKICAgICAgICAgLy8gc28gd2Ugd29uJ3QgYXNzZXJ0IHRoZW0gaGVyZS4KICAgICB9CiAKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RPbldpbmRvd0F0dHJpYnV0ZXNDaGFuZ2VkKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIHN0YXJ0RGlhbG9nQWN0aXZpdHkoRGlhbG9nU3R1YkFjdGl2aXR5LlRFU1RfT05TVEFSVF9BTkRfT05TVE9QKTsKICAgICAgICAgZmluYWwgVGVzdERpYWxvZyBkID0gKFRlc3REaWFsb2cpIG1BY3Rpdml0eS5nZXREaWFsb2coKTsKQEAgLTQ2Nyw3ICs1NzEsNyBAQAogCiAgICAgICAgIGZpbmFsIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIGxwID0gZC5nZXRXaW5kb3coKS5nZXRBdHRyaWJ1dGVzKCk7CiAgICAgICAgIGxwLnNldFRpdGxlKCJ0ZXN0IE9uV2luZG93QXR0cmlidXRlc0NoYW5nZWQiKTsKLSAgICAgICAgcnVuVGVzdE9uVWlUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICBtQWN0aXZpdHlSdWxlLnJ1bk9uVWlUaHJlYWQobmV3IFJ1bm5hYmxlKCkgewogICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewogICAgICAgICAgICAgICAgIGQuZ2V0V2luZG93KCkuc2V0QXR0cmlidXRlcyhscCk7CiAgICAgICAgICAgICB9CkBAIC00NzgsNiArNTgyLDcgQEAKICAgICAgICAgYXNzZXJ0U2FtZShscCwgZC5nZXRXaW5kb3coKS5nZXRBdHRyaWJ1dGVzKCkpOwogICAgIH0KIAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE9uQ29udGVudENoYW5nZWQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgc3RhcnREaWFsb2dBY3Rpdml0eShEaWFsb2dTdHViQWN0aXZpdHkuVEVTVF9PTlNUQVJUX0FORF9PTlNUT1ApOwogICAgICAgICBmaW5hbCBUZXN0RGlhbG9nIGQgPSAoVGVzdERpYWxvZykgbUFjdGl2aXR5LmdldERpYWxvZygpOwpAQCAtNDg1LDcgKzU5MCw3IEBACiAKICAgICAgICAgYXNzZXJ0RmFsc2UoZC5pc09uQ29udGVudENoYW5nZWRDYWxsZWQpOwogCi0gICAgICAgIHJ1blRlc3RPblVpVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgbUFjdGl2aXR5UnVsZS5ydW5PblVpVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKICAgICAgICAgICAgICAgICBkLnNldENvbnRlbnRWaWV3KFIubGF5b3V0LmFsZXJ0X2RpYWxvZ190ZXh0X2VudHJ5KTsKICAgICAgICAgICAgIH0KQEAgLTQ5NSw2ICs2MDAsNyBAQAogICAgICAgICBhc3NlcnRUcnVlKGQuaXNPbkNvbnRlbnRDaGFuZ2VkQ2FsbGVkKTsKICAgICB9CiAKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RPbldpbmRvd0ZvY3VzQ2hhbmdlZCgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBzdGFydERpYWxvZ0FjdGl2aXR5KERpYWxvZ1N0dWJBY3Rpdml0eS5URVNUX09OU1RBUlRfQU5EX09OU1RPUCk7CiAgICAgICAgIGZpbmFsIFRlc3REaWFsb2cgZCA9IChUZXN0RGlhbG9nKSBtQWN0aXZpdHkuZ2V0RGlhbG9nKCk7CkBAIC01MDIsNyArNjA4LDcgQEAKICAgICAgICAgZC5pc09uV2luZG93Rm9jdXNDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7CiAKICAgICAgICAgLy8gc2hvdyBhIG5ldyBkaWFsb2csIHRoZSBuZXcgZGlhbG9nIGdldCBmb2N1cwotICAgICAgICBydW5UZXN0T25VaVRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgIG1BY3Rpdml0eVJ1bGUucnVuT25VaVRocmVhZChuZXcgUnVubmFibGUoKSB7CiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgICAgICAgICAgbUFjdGl2aXR5LnNob3dEaWFsb2coRGlhbG9nU3R1YkFjdGl2aXR5LlRFU1RfRElBTE9HX1dJVEhPVVRfVEhFTUUpOwogICAgICAgICAgICAgfQpAQCAtNTE3LDYgKzYyMyw3IEBACiAgICAgICAgIH0ucnVuKCk7CiAgICAgfQogCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzcGF0Y2hLZXlFdmVudCgpIHsKICAgICAgICAgc3RhcnREaWFsb2dBY3Rpdml0eShEaWFsb2dTdHViQWN0aXZpdHkuVEVTVF9PTlNUQVJUX0FORF9PTlNUT1ApOwogICAgICAgICBmaW5hbCBUZXN0RGlhbG9nIGQgPSAoVGVzdERpYWxvZykgbUFjdGl2aXR5LmdldERpYWxvZygpOwpAQCAtNTY1LDYgKzY3Miw3IEBACiAgICAgICogNS4gb25Db250ZXh0TWVudUNsb3NlZCBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIGNvbnRleHQgbWVudSBpcyBiZWluZyBjbG9zZWQgKGVpdGhlciBieQogICAgICAqIHRoZSB1c2VyIGNhbmNlbGluZyB0aGUgbWVudSB3aXRoIHRoZSBiYWNrL21lbnUgYnV0dG9uLCBvciB3aGVuIGFuIGl0ZW0gaXMgc2VsZWN0ZWQpLgogICAgICAqLworICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdENvbnRleHRNZW51KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIHN0YXJ0RGlhbG9nQWN0aXZpdHkoRGlhbG9nU3R1YkFjdGl2aXR5LlRFU1RfT05TVEFSVF9BTkRfT05TVE9QKTsKICAgICAgICAgZmluYWwgVGVzdERpYWxvZyBkID0gKFRlc3REaWFsb2cpIG1BY3Rpdml0eS5nZXREaWFsb2coKTsKQEAgLTU3Myw3ICs2ODEsNyBAQAogICAgICAgICBwYXJlbnQuYWRkVmlldyh2KTsKICAgICAgICAgYXNzZXJ0RmFsc2Uodi5pc1Nob3dDb250ZXh0TWVudUNhbGxlZCk7CiAgICAgICAgIC8vIFJlZ2lzdGVyIGZvciBjb250ZXh0IG1lbnUgYW5kIG9wZW4gaXQKLSAgICAgICAgcnVuVGVzdE9uVWlUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICBtQWN0aXZpdHlSdWxlLnJ1bk9uVWlUaHJlYWQobmV3IFJ1bm5hYmxlKCkgewogICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewogICAgICAgICAgICAgICAgIGQuYWRkQ29udGVudFZpZXcocGFyZW50LCBuZXcgTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcygKICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULApAQCAtNTk4LDE0ICs3MDYsMTQgQEAKICAgICAgICAgdi5pc1Nob3dDb250ZXh0TWVudUNhbGxlZCA9IGZhbHNlOwogICAgICAgICBkLmlzT25DcmVhdGVDb250ZXh0TWVudUNhbGxlZCA9IGZhbHNlOwogICAgICAgICAvLyBVbnJlZ2lzdGVyIGZvciBjb250ZXh0IG1lbnUsIGFuZCB0cnkgdG8gb3BlbiBpdAotICAgICAgICBydW5UZXN0T25VaVRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgIG1BY3Rpdml0eVJ1bGUucnVuT25VaVRocmVhZChuZXcgUnVubmFibGUoKSB7CiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgICAgICAgICAgZC51bnJlZ2lzdGVyRm9yQ29udGV4dE1lbnUodik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0pOwogICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLndhaXRGb3JJZGxlU3luYygpOwogCi0gICAgICAgIHJ1blRlc3RPblVpVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgbUFjdGl2aXR5UnVsZS5ydW5PblVpVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKICAgICAgICAgICAgICAgICBkLm9wZW5Db250ZXh0TWVudSh2KTsKICAgICAgICAgICAgIH0KQEAgLTYxNiw3ICs3MjQsNyBAQAogICAgICAgICBhc3NlcnRGYWxzZShkLmlzT25DcmVhdGVDb250ZXh0TWVudUNhbGxlZCk7CiAKICAgICAgICAgLy8gUmVnaXN0ZXIgZm9yIGNvbnRleHQgbWVudSBhbmQgb3BlbiBpdCBhZ2FpbgotICAgICAgICBydW5UZXN0T25VaVRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgIG1BY3Rpdml0eVJ1bGUucnVuT25VaVRocmVhZChuZXcgUnVubmFibGUoKSB7CiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgICAgICAgICAgZC5yZWdpc3RlckZvckNvbnRleHRNZW51KHYpOwogICAgICAgICAgICAgICAgIGQub3BlbkNvbnRleHRNZW51KHYpOwpAQCAtNjM4LDkgKzc0NiwxMSBAQAogICAgICAgICBhc3NlcnRGYWxzZShkLmlzT25Db250ZXh0TWVudUNsb3NlZENhbGxlZCk7CiAgICAgfQogCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0T25TZWFyY2hSZXF1ZXN0ZWQoKSB7CiAgICAgfQogCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0VGFrZUtleUV2ZW50cygpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBzdGFydERpYWxvZ0FjdGl2aXR5KERpYWxvZ1N0dWJBY3Rpdml0eS5URVNUX09OU1RBUlRfQU5EX09OU1RPUCk7CiAgICAgICAgIGZpbmFsIFRlc3REaWFsb2cgZCA9IChUZXN0RGlhbG9nKSBtQWN0aXZpdHkuZ2V0RGlhbG9nKCk7CkBAIC02NjAsNyArNzcwLDcgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgdGFrZUtleUV2ZW50cyhmaW5hbCBEaWFsb2cgZCwgZmluYWwgYm9vbGVhbiBnZXQpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBydW5UZXN0T25VaVRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgIG1BY3Rpdml0eVJ1bGUucnVuT25VaVRocmVhZChuZXcgUnVubmFibGUoKSB7CiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgICAgICAgICAgZC50YWtlS2V5RXZlbnRzKGdldCk7CiAgICAgICAgICAgICB9CkBAIC02NjgsMTUgKzc3OCwxNyBAQAogICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLndhaXRGb3JJZGxlU3luYygpOwogICAgIH0KIAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFJlcXVlc3RXaW5kb3dGZWF0dXJlKCkgewogICAgICAgICBzdGFydERpYWxvZ0FjdGl2aXR5KERpYWxvZ1N0dWJBY3Rpdml0eS5URVNUX09OU1RBUlRfQU5EX09OU1RPUCk7CiAgICAgICAgIC8vIGNhbGxlZCByZXF1ZXN0V2luZG93RmVhdHVyZSBhdCBUZXN0RGlhbG9nIG9uQ3JlYXRlIG1ldGhvZAogICAgICAgICBhc3NlcnRUcnVlKCgoVGVzdERpYWxvZykgbUFjdGl2aXR5LmdldERpYWxvZygpKS5pc1JlcXVlc3RXaW5kb3dGZWF0dXJlKTsKICAgICB9CiAKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRGZWF0dXJlRHJhd2FibGVSZXNvdXJjZSgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBzdGFydERpYWxvZ0FjdGl2aXR5KERpYWxvZ1N0dWJBY3Rpdml0eS5URVNUX09OU1RBUlRfQU5EX09OU1RPUCk7Ci0gICAgICAgIHJ1blRlc3RPblVpVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgbUFjdGl2aXR5UnVsZS5ydW5PblVpVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKICAgICAgICAgICAgICAgICBtQWN0aXZpdHkuZ2V0RGlhbG9nKCkuc2V0RmVhdHVyZURyYXdhYmxlUmVzb3VyY2UoV2luZG93LkZFQVRVUkVfTEVGVF9JQ09OLAogICAgICAgICAgICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5yb2JvdCk7CkBAIC02ODUsOSArNzk3LDEwIEBACiAgICAgICAgIG1JbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7CiAgICAgfQogCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0RmVhdHVyZURyYXdhYmxlVXJpKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIHN0YXJ0RGlhbG9nQWN0aXZpdHkoRGlhbG9nU3R1YkFjdGl2aXR5LlRFU1RfT05TVEFSVF9BTkRfT05TVE9QKTsKLSAgICAgICAgcnVuVGVzdE9uVWlUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICBtQWN0aXZpdHlSdWxlLnJ1bk9uVWlUaHJlYWQobmV3IFJ1bm5hYmxlKCkgewogICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewogICAgICAgICAgICAgICAgIG1BY3Rpdml0eS5nZXREaWFsb2coKS5zZXRGZWF0dXJlRHJhd2FibGVVcmkoV2luZG93LkZFQVRVUkVfTEVGVF9JQ09OLAogICAgICAgICAgICAgICAgICAgICAgICAgVXJpLnBhcnNlKCJodHRwOi8vd3d3Lmdvb2dsZS5jb20iKSk7CkBAIC02OTYsOSArODA5LDEwIEBACiAgICAgICAgIG1JbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7CiAgICAgfQogCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0RmVhdHVyZURyYXdhYmxlKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIHN0YXJ0RGlhbG9nQWN0aXZpdHkoRGlhbG9nU3R1YkFjdGl2aXR5LlRFU1RfT05TVEFSVF9BTkRfT05TVE9QKTsKLSAgICAgICAgcnVuVGVzdE9uVWlUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICBtQWN0aXZpdHlSdWxlLnJ1bk9uVWlUaHJlYWQobmV3IFJ1bm5hYmxlKCkgewogICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewogICAgICAgICAgICAgICAgIG1BY3Rpdml0eS5nZXREaWFsb2coKS5zZXRGZWF0dXJlRHJhd2FibGUoV2luZG93LkZFQVRVUkVfTEVGVF9JQ09OLCAKICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBNb2NrRHJhd2FibGUoKSk7CkBAIC03MDcsOSArODIxLDEwIEBACiAgICAgICAgIG1JbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7CiAgICAgfQogCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0RmVhdHVyZURyYXdhYmxlQWxwaGEoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgc3RhcnREaWFsb2dBY3Rpdml0eShEaWFsb2dTdHViQWN0aXZpdHkuVEVTVF9PTlNUQVJUX0FORF9PTlNUT1ApOwotICAgICAgICBydW5UZXN0T25VaVRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgIG1BY3Rpdml0eVJ1bGUucnVuT25VaVRocmVhZChuZXcgUnVubmFibGUoKSB7CiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgICAgICAgICAgbUFjdGl2aXR5LmdldERpYWxvZygpLnNldEZlYXR1cmVEcmF3YWJsZUFscGhhKFdpbmRvdy5GRUFUVVJFX0xFRlRfSUNPTiwgMCk7CiAgICAgICAgICAgICB9CkBAIC03MTcsMTMgKzgzMiwxNSBAQAogICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLndhaXRGb3JJZGxlU3luYygpOwogICAgIH0KIAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEdldExheW91dEluZmxhdGVyKCkgewogICAgICAgICBzdGFydERpYWxvZ0FjdGl2aXR5KERpYWxvZ1N0dWJBY3Rpdml0eS5URVNUX0RJQUxPR19XSVRIT1VUX1RIRU1FKTsKICAgICAgICAgZmluYWwgRGlhbG9nIGQgPSBtQWN0aXZpdHkuZ2V0RGlhbG9nKCk7CiAgICAgICAgIGFzc2VydEVxdWFscyhkLmdldFdpbmRvdygpLmdldExheW91dEluZmxhdGVyKCksIGQuZ2V0TGF5b3V0SW5mbGF0ZXIoKSk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgdGVzdFNldENhbmNlbGFibGVfdHJ1ZSgpIHsKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRDYW5jZWxsYWJsZV90cnVlKCkgewogICAgICAgICBzdGFydERpYWxvZ0FjdGl2aXR5KERpYWxvZ1N0dWJBY3Rpdml0eS5URVNUX0RJQUxPR19XSVRIT1VUX1RIRU1FKTsKICAgICAgICAgZmluYWwgRGlhbG9nIGQgPSBtQWN0aXZpdHkuZ2V0RGlhbG9nKCk7CiAKQEAgLTczMyw2ICs4NTAsNyBAQAogICAgICAgICBhc3NlcnRGYWxzZShkLmlzU2hvd2luZygpKTsKICAgICB9CiAKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRDYW5jZWxsYWJsZV9mYWxzZSgpIHsKICAgICAgICAgc3RhcnREaWFsb2dBY3Rpdml0eShEaWFsb2dTdHViQWN0aXZpdHkuVEVTVF9ESUFMT0dfV0lUSE9VVF9USEVNRSk7CiAgICAgICAgIGZpbmFsIERpYWxvZyBkID0gbUFjdGl2aXR5LmdldERpYWxvZygpOwpAQCAtNzQzLDE3ICs4NjEsNDEgQEAKICAgICAgICAgYXNzZXJ0VHJ1ZShkLmlzU2hvd2luZygpKTsKICAgICB9CiAKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRDYW5jZWxsYWJsZUVzY190cnVlKCkgeworICAgICAgICBzdGFydERpYWxvZ0FjdGl2aXR5KERpYWxvZ1N0dWJBY3Rpdml0eS5URVNUX0RJQUxPR19XSVRIT1VUX1RIRU1FKTsKKyAgICAgICAgZmluYWwgRGlhbG9nIGQgPSBtQWN0aXZpdHkuZ2V0RGlhbG9nKCk7CisKKyAgICAgICAgZC5zZXRDYW5jZWxhYmxlKHRydWUpOworICAgICAgICBhc3NlcnRUcnVlKGQuaXNTaG93aW5nKCkpOworICAgICAgICBzZW5kS2V5cyhLZXlFdmVudC5LRVlDT0RFX0VTQ0FQRSk7CisgICAgICAgIGFzc2VydEZhbHNlKGQuaXNTaG93aW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNldENhbmNlbGxhYmxlRXNjX2ZhbHNlKCkgeworICAgICAgICBzdGFydERpYWxvZ0FjdGl2aXR5KERpYWxvZ1N0dWJBY3Rpdml0eS5URVNUX0RJQUxPR19XSVRIT1VUX1RIRU1FKTsKKyAgICAgICAgZmluYWwgRGlhbG9nIGQgPSBtQWN0aXZpdHkuZ2V0RGlhbG9nKCk7CisKKyAgICAgICAgZC5zZXRDYW5jZWxhYmxlKGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkLmlzU2hvd2luZygpKTsKKyAgICAgICAgc2VuZEtleXMoS2V5RXZlbnQuS0VZQ09ERV9FU0NBUEUpOworICAgICAgICBhc3NlcnRUcnVlKGQuaXNTaG93aW5nKCkpOworICAgIH0KKwogICAgIC8qCiAgICAgICogVGVzdCBwb2ludAogICAgICAqIDEuIENhbmNlbCB0aGUgZGlhbG9nLgogICAgICAqIDIuIFNldCBhIGxpc3RlbmVyIHRvIGJlIGludm9rZWQgd2hlbiB0aGUgZGlhbG9nIGlzIGNhbmNlbGVkLgogICAgICAqLworICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdENhbmNlbF9saXN0ZW5lcigpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBzdGFydERpYWxvZ0FjdGl2aXR5KERpYWxvZ1N0dWJBY3Rpdml0eS5URVNUX0RJQUxPR19XSVRIT1VUX1RIRU1FKTsKICAgICAgICAgZmluYWwgRGlhbG9nIGQgPSBtQWN0aXZpdHkuZ2V0RGlhbG9nKCk7CiAKICAgICAgICAgYXNzZXJ0VHJ1ZShkLmlzU2hvd2luZygpKTsKICAgICAgICAgbU9uQ2FuY2VsTGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKKwogICAgICAgICBkLnNldE9uQ2FuY2VsTGlzdGVuZXIobmV3IE9uQ2FuY2VsTGlzdGVuZXIoKSB7CiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNhbmNlbChEaWFsb2dJbnRlcmZhY2UgZGlhbG9nKSB7CiAgICAgICAgICAgICAgICAgbU9uQ2FuY2VsTGlzdGVuZXJDYWxsZWQgPSB0cnVlOwpAQCAtNzY1LDYgKzkwNyw3IEBACiAgICAgICAgIGFzc2VydFRydWUobU9uQ2FuY2VsTGlzdGVuZXJDYWxsZWQpOwogICAgIH0KIAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdENhbmNlbF9ub0xpc3RlbmVyKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIHN0YXJ0RGlhbG9nQWN0aXZpdHkoRGlhbG9nU3R1YkFjdGl2aXR5LlRFU1RfRElBTE9HX1dJVEhPVVRfVEhFTUUpOwogICAgICAgICBmaW5hbCBEaWFsb2cgZCA9IG1BY3Rpdml0eS5nZXREaWFsb2coKTsKQEAgLTc3OCw2ICs5MjEsNyBAQAogICAgICAgICBhc3NlcnRGYWxzZShtT25DYW5jZWxMaXN0ZW5lckNhbGxlZCk7CiAgICAgfQogCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FuY2VsTWVzc2FnZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBtQ2FsbGVkQ2FsbGJhY2sgPSBmYWxzZTsKICAgICAgICAgc3RhcnREaWFsb2dBY3Rpdml0eShEaWFsb2dTdHViQWN0aXZpdHkuVEVTVF9PTlNUQVJUX0FORF9PTlNUT1ApOwpAQCAtODA1LDYgKzk0OSw3IEBACiAgICAgICogMS4gU2V0IGEgbGlzdGVuZXIgdG8gYmUgaW52b2tlZCB3aGVuIHRoZSBkaWFsb2cgaXMgZGlzbWlzc2VkLgogICAgICAqIDIuIHNldCBvbkRpc21pc3NMaXN0ZW5lciB0byBudWxsLCBpdCB3aWxsIG5vdCBjaGFuZ2VkIGZsYWcgYWZ0ZXIgZGlhbG9nIGRpc21pc3NlZC4KICAgICAgKi8KKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRPbkRpc21pc3NMaXN0ZW5lcl9saXN0ZW5lcigpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBtQ2FsbGVkQ2FsbGJhY2sgPSBmYWxzZTsKICAgICAgICAgc3RhcnREaWFsb2dBY3Rpdml0eShEaWFsb2dTdHViQWN0aXZpdHkuVEVTVF9ESUFMT0dfV0lUSE9VVF9USEVNRSk7CkBAIC04MjMsNiArOTY4LDcgQEAKICAgICAgICAgYXNzZXJ0RmFsc2UoZC5pc1Nob3dpbmcoKSk7CiAgICAgfQogCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0T25EaXNtaXNzTGlzdGVuZXJfbm9MaXN0ZW5lcigpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBzdGFydERpYWxvZ0FjdGl2aXR5KERpYWxvZ1N0dWJBY3Rpdml0eS5URVNUX0RJQUxPR19XSVRIT1VUX1RIRU1FKTsKICAgICAgICAgZmluYWwgRGlhbG9nIGQgPSBtQWN0aXZpdHkuZ2V0RGlhbG9nKCk7CkBAIC04MzQsNiArOTgwLDcgQEAKICAgICAgICAgYXNzZXJ0RmFsc2UoZC5pc1Nob3dpbmcoKSk7CiAgICAgfQogCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0RGlzbWlzc01lc3NhZ2UoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgbUNhbGxlZENhbGxiYWNrID0gZmFsc2U7CiAgICAgICAgIHN0YXJ0RGlhbG9nQWN0aXZpdHkoRGlhbG9nU3R1YkFjdGl2aXR5LlRFU1RfRElBTE9HX1dJVEhPVVRfVEhFTUUpOwpAQCAtODU3LDcgKzEwMDQsNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBkaWFsb2dEaXNtaXNzKGZpbmFsIERpYWxvZyBkKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgcnVuVGVzdE9uVWlUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICBtQWN0aXZpdHlSdWxlLnJ1bk9uVWlUaHJlYWQobmV3IFJ1bm5hYmxlKCkgewogICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewogICAgICAgICAgICAgICAgIGQuZGlzbWlzcygpOwogICAgICAgICAgICAgfQpAQCAtODY2LDcgKzEwMTMsNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBkaWFsb2dDYW5jZWwoZmluYWwgRGlhbG9nIGQpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBydW5UZXN0T25VaVRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgIG1BY3Rpdml0eVJ1bGUucnVuT25VaVRocmVhZChuZXcgUnVubmFibGUoKSB7CiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgICAgICAgICAgZC5jYW5jZWwoKTsKICAgICAgICAgICAgIH0KQEAgLTg3NCw2ICsxMDIxLDExIEBACiAgICAgICAgIG1JbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIHNlbmRLZXlzKGludCBrZXlDb2RlKSB7CisgICAgICAgIG1JbnN0cnVtZW50YXRpb24uc2VuZEtleURvd25VcFN5bmMoa2V5Q29kZSk7CisgICAgICAgIG1JbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7CisgICAgfQorCiAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTW9ja0Rpc21pc3NDYW5jZWxIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7CiAgICAgICAgIHByaXZhdGUgV2Vha1JlZmVyZW5jZTxEaWFsb2dJbnRlcmZhY2U+IG1EaWFsb2c7CiAKQEAgLTkyOCwxMCArMTA4MCw2IEBACiAgICAgICAgICAgICBtT25DcmVhdGVDb250ZXh0TWVudUxpc3RlbmVyID0gbDsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBPbkNyZWF0ZUNvbnRleHRNZW51TGlzdGVuZXIgZ2V0T25DcmVhdGVDb250ZXh0TWVudUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcmV0dXJuIG1PbkNyZWF0ZUNvbnRleHRNZW51TGlzdGVuZXI7Ci0gICAgICAgIH0KLQogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIGJvb2xlYW4gc2hvd0NvbnRleHRNZW51KCkgewogICAgICAgICAgICAgaXNTaG93Q29udGV4dE1lbnVDYWxsZWQgPSB0cnVlOwpkaWZmIC0tZ2l0IGEvdGVzdHMvYXBwL3NyYy9hbmRyb2lkL2FwcC9jdHMvRGlzcGxheVRlc3QuamF2YSBiL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL0Rpc3BsYXlUZXN0LmphdmEKaW5kZXggNmQ3ZmRlYi4uNGJiNmM0MCAxMDA2NDQKLS0tIGEvdGVzdHMvYXBwL3NyYy9hbmRyb2lkL2FwcC9jdHMvRGlzcGxheVRlc3QuamF2YQorKysgYi90ZXN0cy9hcHAvc3JjL2FuZHJvaWQvYXBwL2N0cy9EaXNwbGF5VGVzdC5qYXZhCkBAIC0xOSw4ICsxOSwxMCBAQAogaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmFwcC5zdHVicy5EaXNwbGF5VGVzdEFjdGl2aXR5OwogaW1wb3J0IGFuZHJvaWQuYXBwLnN0dWJzLk9yaWVudGF0aW9uVGVzdFV0aWxzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQ7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyOwogaW1wb3J0IGFuZHJvaWQudmlldy5EaXNwbGF5OworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlBhY2thZ2VVdGlsLnN1cHBvcnRzUm90YXRpb247CiAKIC8qKgogICogVGVzdHMgdG8gdmVyaWZ5IGZ1bmN0aW9uYWxpdHkgb2Yge0BsaW5rIERpc3BsYXl9LgpAQCAtNDcsMzYgKzQ5LDUyIEBACiAgICAgICogdXBkYXRlZCBhZGp1c3RtZW50cyBhZnRlciBhIHJvdGF0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHRlc3RSb3RhdGlvbigpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBpZiAoIXN1cHBvcnRzUm90YXRpb24oKSkgeworICAgICAgICAgICAgLy8gU2tpcCByb3RhdGlvbiB0ZXN0IGlmIGRldmljZSBkb2Vzbid0IHN1cHBvcnQgaXQuCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKwogICAgICAgICAvLyBHZXQgYSB7QGxpbmsgRGlzcGxheX0gaW5zdGFuY2UgYmVmb3JlIHJvdGF0aW9uLgogICAgICAgICBmaW5hbCBEaXNwbGF5IG9yaWdEaXNwbGF5ID0gbUFjdGl2aXR5LmdldERpc3BsYXkoKTsKIAogICAgICAgICAvLyBDYXB0dXJlIHRoZSBvcmlnaW5hbGx5IHJlcG9ydGVkIHdpZHRoIGFuZCBoZWlnaHRzCi0gICAgICAgIGZpbmFsIGludCBvcmlnV2lkdGggPSBvcmlnRGlzcGxheS5nZXRXaWR0aCgpOwotICAgICAgICBmaW5hbCBpbnQgb3JpZ0hlaWdodCA9IG9yaWdEaXNwbGF5LmdldEhlaWdodCgpOworICAgICAgICBmaW5hbCBQb2ludCBvcmlnU2l6ZSA9IG5ldyBQb2ludCgpOworICAgICAgICBvcmlnRGlzcGxheS5nZXRTaXplKG9yaWdTaXplKTsKIAogICAgICAgICAvLyBDaGFuZ2Ugb3JpZW50YXRpb24KICAgICAgICAgbUFjdGl2aXR5LmNvbmZpZ3VyYXRpb25DaGFuZ2VPYnNlcnZlci5zdGFydE9ic2VydmluZygpOwogICAgICAgICBPcmllbnRhdGlvblRlc3RVdGlscy5zd2l0Y2hPcmllbnRhdGlvbihtQWN0aXZpdHkpOwotICAgICAgICBtQWN0aXZpdHkuY29uZmlndXJhdGlvbkNoYW5nZU9ic2VydmVyLmF3YWl0KCk7CisKKyAgICAgICAgZmluYWwgYm9vbGVhbiBzcXVhcmVEaXNwbGF5ID0gKG9yaWdTaXplLnggPT0gb3JpZ1NpemUueSk7CisgICAgICAKKyAgICAgICAgLy8gRG9uJ3Qgd2FpdCBmb3IgdGhlIGNvbmZpZ3VyYXRpb24gdG8gY2hhbmdlIGlmIHRoZQorICAgICAgICAvLyB0aGUgZGlzcGxheSBpcyBzcXVhcmUuIEluIG1hbnkgY2FzZXMgaXQgd29uJ3QuCisgICAgICAgIGlmICghc3F1YXJlRGlzcGxheSkgeworICAgICAgICAgICAgbUFjdGl2aXR5LmNvbmZpZ3VyYXRpb25DaGFuZ2VPYnNlcnZlci5hd2FpdCgpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgUG9pbnQgbmV3T3JpZ1NpemUgPSBuZXcgUG9pbnQoKTsKKyAgICAgICAgb3JpZ0Rpc3BsYXkuZ2V0U2l6ZShuZXdPcmlnU2l6ZSk7CiAKICAgICAgICAgLy8gR2V0IGEge0BsaW5rIERpc3BsYXl9IGluc3RhbmNlIGFmdGVyIHJvdGF0aW9uLgogICAgICAgICBmaW5hbCBEaXNwbGF5IHVwZGF0ZWREaXNwbGF5ID0gbUFjdGl2aXR5LmdldERpc3BsYXkoKTsKKyAgICAgICAgZmluYWwgUG9pbnQgdXBkYXRlZFNpemUgPSBuZXcgUG9pbnQoKTsKKyAgICAgICAgdXBkYXRlZERpc3BsYXkuZ2V0U2l6ZSh1cGRhdGVkU2l6ZSk7CiAKLSAgICAgICAgLy8gRm9yIHNxdWFyZSBzcmVlbnMgdGhlIGZvbGxvd2luZyBhc3NlcnRpb25zIGRvIG5vdCBtYWtlIHNlbnNlIGFuZCB3aWxsIGFsd2F5cyBmYWlsLgotICAgICAgICBpZiAob3JpZ1dpZHRoICE9IG9yaWdIZWlnaHQpIHsKKyAgICAgICAgLy8gRm9yIHNxdWFyZSBzY3JlZW5zIHRoZSBmb2xsb3dpbmcgYXNzZXJ0aW9ucyBkbyBub3QgbWFrZSBzZW5zZSBhbmQgd2lsbCBhbHdheXMgZmFpbC4KKyAgICAgICAgaWYgKCFzcXVhcmVEaXNwbGF5KSB7CiAgICAgICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgb3JpZ2luYWwgaW5zdGFuY2Ugbm8gbG9uZ2VyIGFyZSB0aGUgc2FtZS4gTm90ZQogICAgICAgICAgICAgLy8gdGhhdCB0aGlzIHdpbGwgYmUgZmFsc2UgaWYgdGhlIGRldmljZSB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBpZGVudGljYWwuCi0gICAgICAgICAgICBhc3NlcnRGYWxzZSgid2lkdGggZnJvbSBvcmlnaW5hbCBkaXNwbGF5IGluc3RhbmNlIHNob3VsZCBoYXZlIGNoYW5nZWQiLAotICAgICAgICAgICAgICAgICAgICBvcmlnV2lkdGggPT0gb3JpZ0Rpc3BsYXkuZ2V0V2lkdGgoKSk7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZSgiaGVpZ2h0IGZyb20gb3JpZ2luYWwgZGlzcGxheSBpbnN0YW5jZSBzaG91bGQgaGF2ZSBjaGFuZ2VkIiwKLSAgICAgICAgICAgICAgICAgICAgb3JpZ0hlaWdodCA9PSBvcmlnRGlzcGxheS5nZXRIZWlnaHQoKSk7CisgICAgICAgICAgICAvLyBOb3RlIHRoZXJlIGFyZSBjYXNlcyB3aGVyZSB3aWR0aCBhbmQgaGVpZ2h0IG1heSBub3QgYWxsIGJlIHVwZGF0ZWQsIHN1Y2ggYXMgb24gZG9ja2VkCisgICAgICAgICAgICAvLyBkZXZpY2VzIHdoZXJlIHRoZSBhcHAgaXMgbGV0dGVyYm94ZWQuIEhvd2V2ZXIgYXQgbGVhc3Qgb25lIGRpbWVuc2lvbiBuZWVkcyB0byBiZQorICAgICAgICAgICAgLy8gdXBkYXRlZC4KKyAgICAgICAgICAgIGFzc2VydEZhbHNlKCJzaXplIGZyb20gb3JpZ2luYWwgZGlzcGxheSBpbnN0YW5jZSBzaG91bGQgaGF2ZSBjaGFuZ2VkIiwKKyAgICAgICAgICAgICAgICAgICAgb3JpZ1NpemUuZXF1YWxzKG5ld09yaWdTaXplKSk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgb3JpZ2luYWwgaW5zdGFuY2UgaGF2ZSBiZWVuIHVwZGF0ZWQgdG8gbWF0Y2ggdGhlCiAgICAgICAgIC8vIHZhbHVlcyB0aGF0IHdvdWxkIGJlIGZvdW5kIGluIGEgbmV3IGluc3RhbmNlLgotICAgICAgICBhc3NlcnRUcnVlKCJ3aWR0aCBmcm9tIG9yaWdpbmFsIGRpc3BsYXkgaW5zdGFuY2Ugc2hvdWxkIG1hdGNoIGN1cnJlbnQiLAotICAgICAgICAgICAgICAgIG9yaWdEaXNwbGF5LmdldFdpZHRoKCkgPT0gdXBkYXRlZERpc3BsYXkuZ2V0V2lkdGgoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoImhlaWdodCBmcm9tIG9yaWdpbmFsIGRpc3BsYXkgaW5zdGFuY2Ugc2hvdWxkIG1hdGNoIGN1cnJlbnQiLAotICAgICAgICAgICAgICAgIG9yaWdEaXNwbGF5LmdldEhlaWdodCgpID09IHVwZGF0ZWREaXNwbGF5LmdldEhlaWdodCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgic2l6ZSBmcm9tIG9yaWdpbmFsIGRpc3BsYXkgaW5zdGFuY2Ugc2hvdWxkIG1hdGNoIGN1cnJlbnQiLAorICAgICAgICAgICAgICAgIG5ld09yaWdTaXplLmVxdWFscyh1cGRhdGVkU2l6ZSkpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL0Rvd25sb2FkTWFuYWdlclRlc3QuamF2YSBiL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL0Rvd25sb2FkTWFuYWdlclRlc3QuamF2YQppbmRleCA2MWRlNmM1Li44NzM2NDdmIDEwMDY0NAotLS0gYS90ZXN0cy9hcHAvc3JjL2FuZHJvaWQvYXBwL2N0cy9Eb3dubG9hZE1hbmFnZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvYXBwL3NyYy9hbmRyb2lkL2FwcC9jdHMvRG93bmxvYWRNYW5hZ2VyVGVzdC5qYXZhCkBAIC0xODMsNyArMTgzLDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjYuMS9DLTAtMSIpCisgICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuNi4xIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0TWluaW11bURvd25sb2FkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIERvd25sb2FkQ29tcGxldGVSZWNlaXZlciByZWNlaXZlciA9IG5ldyBEb3dubG9hZENvbXBsZXRlUmVjZWl2ZXIoKTsKICAgICAgICAgdHJ5IHsKZGlmZiAtLWdpdCBhL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL0ZyYWdtZW50VHJhbnNhY3Rpb25UZXN0LmphdmEgYi90ZXN0cy9hcHAvc3JjL2FuZHJvaWQvYXBwL2N0cy9GcmFnbWVudFRyYW5zYWN0aW9uVGVzdC5qYXZhCmluZGV4IDAxOWFiYWQuLjExZDNlZDEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL0ZyYWdtZW50VHJhbnNhY3Rpb25UZXN0LmphdmEKKysrIGIvdGVzdHMvYXBwL3NyYy9hbmRyb2lkL2FwcC9jdHMvRnJhZ21lbnRUcmFuc2FjdGlvblRlc3QuamF2YQpAQCAtMjMsOSArMjMsMTAgQEAKIGltcG9ydCBhbmRyb2lkLmFwcC5zdHVicy5GcmFnbWVudFRlc3RBY3Rpdml0eTsKIGltcG9ydCBhbmRyb2lkLmFwcC5zdHVicy5SOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CmRpZmYgLS1naXQgYS90ZXN0cy9hcHAvc3JjL2FuZHJvaWQvYXBwL2N0cy9JbnN0cnVtZW50YXRpb25fQWN0aXZpdHlNb25pdG9yVGVzdC5qYXZhIGIvdGVzdHMvYXBwL3NyYy9hbmRyb2lkL2FwcC9jdHMvSW5zdHJ1bWVudGF0aW9uX0FjdGl2aXR5TW9uaXRvclRlc3QuamF2YQppbmRleCBhOGQxNmI3Li45ZTA3MGZmOSAxMDA2NDQKLS0tIGEvdGVzdHMvYXBwL3NyYy9hbmRyb2lkL2FwcC9jdHMvSW5zdHJ1bWVudGF0aW9uX0FjdGl2aXR5TW9uaXRvclRlc3QuamF2YQorKysgYi90ZXN0cy9hcHAvc3JjL2FuZHJvaWQvYXBwL2N0cy9JbnN0cnVtZW50YXRpb25fQWN0aXZpdHlNb25pdG9yVGVzdC5qYXZhCkBAIC0xMzUsNyArMTM1LDggQEAKICAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0ID0gaW5zdHJ1bWVudGF0aW9uLmdldFRhcmdldENvbnRleHQoKTsKIAogICAgICAgICAvLyBTdGFydCBBY3Rpdml0eU1vbml0b3JUZXN0QWN0aXZpdHkKLSAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoY29udGV4dCwgQWN0aXZpdHlNb25pdG9yVGVzdEFjdGl2aXR5LmNsYXNzKTsKKyAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoY29udGV4dCwgQWN0aXZpdHlNb25pdG9yVGVzdEFjdGl2aXR5LmNsYXNzKQorICAgICAgICAgICAgICAgIC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7CiAgICAgICAgIEFjdGl2aXR5TW9uaXRvclRlc3RBY3Rpdml0eSBhbVRlc3RBY3Rpdml0eSA9CiAgICAgICAgICAgICAgICAgKEFjdGl2aXR5TW9uaXRvclRlc3RBY3Rpdml0eSkgaW5zdHJ1bWVudGF0aW9uLnN0YXJ0QWN0aXZpdHlTeW5jKGludGVudCk7CiAKQEAgLTE4Myw3ICsxODQsOCBAQAogICAgICAgICBmaW5hbCBDb250ZXh0IGNvbnRleHQgPSBpbnN0cnVtZW50YXRpb24uZ2V0VGFyZ2V0Q29udGV4dCgpOwogCiAgICAgICAgIC8vIFN0YXJ0IEFjdGl2aXR5TW9uaXRvclRlc3RBY3Rpdml0eQotICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChjb250ZXh0LCBBY3Rpdml0eU1vbml0b3JUZXN0QWN0aXZpdHkuY2xhc3MpOworICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChjb250ZXh0LCBBY3Rpdml0eU1vbml0b3JUZXN0QWN0aXZpdHkuY2xhc3MpCisgICAgICAgICAgICAgICAgLmFkZEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLKTsKICAgICAgICAgQWN0aXZpdHlNb25pdG9yVGVzdEFjdGl2aXR5IGFtVGVzdEFjdGl2aXR5ID0KICAgICAgICAgICAgICAgICAoQWN0aXZpdHlNb25pdG9yVGVzdEFjdGl2aXR5KSBpbnN0cnVtZW50YXRpb24uc3RhcnRBY3Rpdml0eVN5bmMoaW50ZW50KTsKIApAQCAtMjM0LDcgKzIzNiw4IEBACiAgICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCA9IGluc3RydW1lbnRhdGlvbi5nZXRUYXJnZXRDb250ZXh0KCk7CiAKICAgICAgICAgLy8gU3RhcnQgQWN0aXZpdHlNb25pdG9yVGVzdEFjdGl2aXR5Ci0gICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KGNvbnRleHQsIEFjdGl2aXR5TW9uaXRvclRlc3RBY3Rpdml0eS5jbGFzcyk7CisgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KGNvbnRleHQsIEFjdGl2aXR5TW9uaXRvclRlc3RBY3Rpdml0eS5jbGFzcykKKyAgICAgICAgICAgICAgICAuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOwogICAgICAgICBBY3Rpdml0eU1vbml0b3JUZXN0QWN0aXZpdHkgYW1UZXN0QWN0aXZpdHkgPQogICAgICAgICAgICAgICAgIChBY3Rpdml0eU1vbml0b3JUZXN0QWN0aXZpdHkpIGluc3RydW1lbnRhdGlvbi5zdGFydEFjdGl2aXR5U3luYyhpbnRlbnQpOwogCmRpZmYgLS1naXQgYS90ZXN0cy9hcHAvc3JjL2FuZHJvaWQvYXBwL2N0cy9OZXdEb2N1bWVudFRlc3QuamF2YSBiL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL05ld0RvY3VtZW50VGVzdC5qYXZhCmluZGV4IDUyZDhkZjkuLjljOTY2ZGQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL05ld0RvY3VtZW50VGVzdC5qYXZhCisrKyBiL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL05ld0RvY3VtZW50VGVzdC5qYXZhCkBAIC0zNSw2ICszNSw3IEBACiAgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KCk7CiAgICAgICAgIGludGVudC5zZXRDbGFzcyhnZXRDb250ZXh0KCksIE5ld0RvY3VtZW50VGVzdEFjdGl2aXR5LmNsYXNzKTsKICAgICAgICAgaW50ZW50LnNldERhdGEoVEVTVF9VUkkpOworICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOwogCiAgICAgICAgIHRyeSAoZmluYWwgUmVjZWl2ZXIgcmVjZWl2ZXIgPSBuZXcgUmVjZWl2ZXIoTmV3RG9jdW1lbnRUZXN0QWN0aXZpdHkuTk9USUZZX1JFU1VNRSkpIHsKICAgICAgICAgICAgIGdldENvbnRleHQoKS5zdGFydEFjdGl2aXR5KGludGVudCk7CmRpZmYgLS1naXQgYS90ZXN0cy9hcHAvc3JjL2FuZHJvaWQvYXBwL2N0cy9Ob3RpZmljYXRpb25DaGFubmVsR3JvdXBUZXN0LmphdmEgYi90ZXN0cy9hcHAvc3JjL2FuZHJvaWQvYXBwL2N0cy9Ob3RpZmljYXRpb25DaGFubmVsR3JvdXBUZXN0LmphdmEKaW5kZXggMTYyODE1Zi4uNzkzMWExZiAxMDA2NDQKLS0tIGEvdGVzdHMvYXBwL3NyYy9hbmRyb2lkL2FwcC9jdHMvTm90aWZpY2F0aW9uQ2hhbm5lbEdyb3VwVGVzdC5qYXZhCisrKyBiL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL05vdGlmaWNhdGlvbkNoYW5uZWxHcm91cFRlc3QuamF2YQpAQCAtMzcsMTAgKzM3LDIxIEBACiAgICAgICAgIE5vdGlmaWNhdGlvbkNoYW5uZWxHcm91cCBncm91cCA9ICBuZXcgTm90aWZpY2F0aW9uQ2hhbm5lbEdyb3VwKCIxIiwgIm9uZSIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCBncm91cC5nZXRJZCgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJvbmUiLCBncm91cC5nZXROYW1lKCkpOworICAgICAgICBhc3NlcnRGYWxzZShncm91cC5pc0Jsb2NrZWQoKSk7CisgICAgICAgIGFzc2VydE51bGwoZ3JvdXAuZ2V0RGVzY3JpcHRpb24oKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBncm91cC5nZXRDaGFubmVscygpLnNpemUoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdElzQmxvY2tlZCgpIHsKKyAgICAgICAgTm90aWZpY2F0aW9uQ2hhbm5lbEdyb3VwIGdyb3VwID0gIG5ldyBOb3RpZmljYXRpb25DaGFubmVsR3JvdXAoIjEiLCAib25lIik7CisgICAgICAgIGdyb3VwLnNldEJsb2NrZWQodHJ1ZSk7CisgICAgICAgIGFzc2VydFRydWUoZ3JvdXAuaXNCbG9ja2VkKCkpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RXcml0ZVRvUGFyY2VsKCkgewogICAgICAgICBOb3RpZmljYXRpb25DaGFubmVsR3JvdXAgZ3JvdXAgPSBuZXcgTm90aWZpY2F0aW9uQ2hhbm5lbEdyb3VwKCIxIiwgIm9uZSIpOworICAgICAgICBncm91cC5zZXRCbG9ja2VkKHRydWUpOworICAgICAgICBncm91cC5zZXREZXNjcmlwdGlvbigiYmFuYW5hcyEiKTsKICAgICAgICAgUGFyY2VsIHBhcmNlbCA9IFBhcmNlbC5vYnRhaW4oKTsKICAgICAgICAgZ3JvdXAud3JpdGVUb1BhcmNlbChwYXJjZWwsIDApOwogICAgICAgICBwYXJjZWwuc2V0RGF0YVBvc2l0aW9uKDApOwpAQCAtNTEsOCArNjIsMTIgQEAKIAogICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9uZSgpIHsKICAgICAgICAgTm90aWZpY2F0aW9uQ2hhbm5lbEdyb3VwIGdyb3VwID0gIG5ldyBOb3RpZmljYXRpb25DaGFubmVsR3JvdXAoIjEiLCAib25lIik7CisgICAgICAgIGdyb3VwLnNldEJsb2NrZWQodHJ1ZSk7CisgICAgICAgIGdyb3VwLnNldERlc2NyaXB0aW9uKCJiYW5hbmFzIik7CiAgICAgICAgIE5vdGlmaWNhdGlvbkNoYW5uZWxHcm91cCBjbG9uZWQgPSBncm91cC5jbG9uZSgpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCBjbG9uZWQuZ2V0SWQoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygib25lIiwgY2xvbmVkLmdldE5hbWUoKSk7CisgICAgICAgIGFzc2VydFRydWUoY2xvbmVkLmlzQmxvY2tlZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiYW5hbmFzIiwgY2xvbmVkLmdldERlc2NyaXB0aW9uKCkpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL05vdGlmaWNhdGlvbkNoYW5uZWxUZXN0LmphdmEgYi90ZXN0cy9hcHAvc3JjL2FuZHJvaWQvYXBwL2N0cy9Ob3RpZmljYXRpb25DaGFubmVsVGVzdC5qYXZhCmluZGV4IGM1NGRmODQuLjcwZWM5Y2YgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL05vdGlmaWNhdGlvbkNoYW5uZWxUZXN0LmphdmEKKysrIGIvdGVzdHMvYXBwL3NyYy9hbmRyb2lkL2FwcC9jdHMvTm90aWZpY2F0aW9uQ2hhbm5lbFRlc3QuamF2YQpAQCAtMjgsOSArMjgsNiBAQAogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ2RkVGVzdDsKLQotQENkZFRlc3QocmVxdWlyZW1lbnQ9IjMuOC4zLjEvQy0xLTEsQy0xLTQiKQogcHVibGljIGNsYXNzIE5vdGlmaWNhdGlvbkNoYW5uZWxUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKIAogICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvdGVzdHMvYXBwL3NyYy9hbmRyb2lkL2FwcC9jdHMvTm90aWZpY2F0aW9uTWFuYWdlclRlc3QuamF2YSBiL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL05vdGlmaWNhdGlvbk1hbmFnZXJUZXN0LmphdmEKaW5kZXggNGVlN2VhZi4uNzZlNTc2YSAxMDA2NDQKLS0tIGEvdGVzdHMvYXBwL3NyYy9hbmRyb2lkL2FwcC9jdHMvTm90aWZpY2F0aW9uTWFuYWdlclRlc3QuamF2YQorKysgYi90ZXN0cy9hcHAvc3JjL2FuZHJvaWQvYXBwL2N0cy9Ob3RpZmljYXRpb25NYW5hZ2VyVGVzdC5qYXZhCkBAIC0xNiwyOCArMTYsNTEgQEAKIAogcGFja2FnZSBhbmRyb2lkLmFwcC5jdHM7CiAKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uTWFuYWdlci5Qb2xpY3kuU1VQUFJFU1NFRF9FRkZFQ1RfQU1CSUVOVDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uTWFuYWdlci5Qb2xpY3kuU1VQUFJFU1NFRF9FRkZFQ1RfRlVMTF9TQ1JFRU5fSU5URU5UOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb25NYW5hZ2VyLlBvbGljeS5TVVBQUkVTU0VEX0VGRkVDVF9MSUdIVFM7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbk1hbmFnZXIuUG9saWN5LlNVUFBSRVNTRURfRUZGRUNUX05PVElGSUNBVElPTl9MSVNUOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb25NYW5hZ2VyLlBvbGljeS5TVVBQUkVTU0VEX0VGRkVDVF9QRUVLOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb25NYW5hZ2VyLlBvbGljeS5TVVBQUkVTU0VEX0VGRkVDVF9TQ1JFRU5fT0ZGOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb25NYW5hZ2VyLlBvbGljeS5TVVBQUkVTU0VEX0VGRkVDVF9TQ1JFRU5fT047CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbk1hbmFnZXIuUG9saWN5LlNVUFBSRVNTRURfRUZGRUNUX1NUQVRVU19CQVI7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5GRUFUVVJFX1dBVENIOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb247CiBpbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uQ2hhbm5lbDsKIGltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb25DaGFubmVsR3JvdXA7CiBpbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OworaW1wb3J0IGFuZHJvaWQuYXBwLlVpQXV0b21hdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5zdHVicy5Nb2NrTm90aWZpY2F0aW9uTGlzdGVuZXI7CiBpbXBvcnQgYW5kcm9pZC5hcHAuc3R1YnMuUjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkljb247CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0F0dHJpYnV0ZXM7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLk1lZGlhU2Vzc2lvbjsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5UZWxlcGhvbnkuVGhyZWFkczsKK2ltcG9ydCBhbmRyb2lkLnNlcnZpY2Uubm90aWZpY2F0aW9uLk5vdGlmaWNhdGlvbkxpc3RlbmVyU2VydmljZTsKIGltcG9ydCBhbmRyb2lkLnNlcnZpY2Uubm90aWZpY2F0aW9uLlN0YXR1c0Jhck5vdGlmaWNhdGlvbjsKIGltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNkZFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKIAoraW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwpAQCAtNDUsMTQgKzY4LDE2IEBACiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuVVVJRDsKIAotQENkZFRlc3QocmVxdWlyZW1lbnQ9IjMuOC4zLjEvQy0xLTMsQy0xLTQiKQogcHVibGljIGNsYXNzIE5vdGlmaWNhdGlvbk1hbmFnZXJUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKICAgICBmaW5hbCBTdHJpbmcgVEFHID0gTm90aWZpY2F0aW9uTWFuYWdlclRlc3QuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOwogICAgIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKICAgICBmaW5hbCBTdHJpbmcgTk9USUZJQ0FUSU9OX0NIQU5ORUxfSUQgPSAiTm90aWZpY2F0aW9uTWFuYWdlclRlc3QiOwogCisgICAgcHJpdmF0ZSBQYWNrYWdlTWFuYWdlciBtUGFja2FnZU1hbmFnZXI7CiAgICAgcHJpdmF0ZSBOb3RpZmljYXRpb25NYW5hZ2VyIG1Ob3RpZmljYXRpb25NYW5hZ2VyOworICAgIHByaXZhdGUgQWN0aXZpdHlNYW5hZ2VyIG1BY3Rpdml0eU1hbmFnZXI7CiAgICAgcHJpdmF0ZSBTdHJpbmcgbUlkOworICAgIHByaXZhdGUgTW9ja05vdGlmaWNhdGlvbkxpc3RlbmVyIG1MaXN0ZW5lcjsKIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC02NSw2ICs5MCw4IEBACiAgICAgICAgIG1Ob3RpZmljYXRpb25NYW5hZ2VyLmNhbmNlbEFsbCgpOwogICAgICAgICBtTm90aWZpY2F0aW9uTWFuYWdlci5jcmVhdGVOb3RpZmljYXRpb25DaGFubmVsKG5ldyBOb3RpZmljYXRpb25DaGFubmVsKAogICAgICAgICAgICAgICAgIE5PVElGSUNBVElPTl9DSEFOTkVMX0lELCAibmFtZSIsIE5vdGlmaWNhdGlvbk1hbmFnZXIuSU1QT1JUQU5DRV9ERUZBVUxUKSk7CisgICAgICAgIG1BY3Rpdml0eU1hbmFnZXIgPSAoQWN0aXZpdHlNYW5hZ2VyKSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQUNUSVZJVFlfU0VSVklDRSk7CisgICAgICAgIG1QYWNrYWdlTWFuYWdlciA9IG1Db250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7CiAgICAgICAgIC8vIGRlbGF5IGJldHdlZW4gdGVzdHMgc28gbm90aWZpY2F0aW9ucyBhcmVuJ3QgZHJvcHBlZCBieSB0aGUgcmF0ZSBsaW1pdGVyCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNTAwKTsKQEAgLTgzLDYgKzExMCw1MyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgbU5vdGlmaWNhdGlvbk1hbmFnZXIuZGVsZXRlTm90aWZpY2F0aW9uQ2hhbm5lbChuYy5nZXRJZCgpKTsKICAgICAgICAgfQorCisgICAgICAgIHRvZ2dsZUxpc3RlbmVyQWNjZXNzKE1vY2tOb3RpZmljYXRpb25MaXN0ZW5lci5nZXRJZCgpLAorICAgICAgICAgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLCBmYWxzZSk7CisKKyAgICAgICAgTGlzdDxOb3RpZmljYXRpb25DaGFubmVsR3JvdXA+IGdyb3VwcyA9IG1Ob3RpZmljYXRpb25NYW5hZ2VyLmdldE5vdGlmaWNhdGlvbkNoYW5uZWxHcm91cHMoKTsKKyAgICAgICAgLy8gRGVsZXRlIGFsbCBncm91cHMuCisgICAgICAgIGZvciAoTm90aWZpY2F0aW9uQ2hhbm5lbEdyb3VwIG5jZyA6IGdyb3VwcykgeworICAgICAgICAgICAgbU5vdGlmaWNhdGlvbk1hbmFnZXIuZGVsZXRlTm90aWZpY2F0aW9uQ2hhbm5lbEdyb3VwKG5jZy5nZXRJZCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0UENhblRvZ2dsZUFsYXJtc01lZGlhU3lzdGVtVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAobUFjdGl2aXR5TWFuYWdlci5pc0xvd1JhbURldmljZSgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB0b2dnbGVOb3RpZmljYXRpb25Qb2xpY3lBY2Nlc3MobUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSwKKyAgICAgICAgICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKSwgdHJ1ZSk7CisKKyAgICAgICAgaWYgKG1Db250ZXh0LmdldEFwcGxpY2F0aW9uSW5mbygpLnRhcmdldFNka1ZlcnNpb24gPj0gQnVpbGQuVkVSU0lPTl9DT0RFUy5QKSB7CisgICAgICAgICAgICAvLyBQb3N0LVAgY2FuIHRvZ2dsZSBhbGFybXMsIG1lZGlhLCBzeXN0ZW0KKyAgICAgICAgICAgIC8vIHRvZ2dsZSBvbiBhbGFybXMsIG1lZGlhLCBzeXN0ZW06CisgICAgICAgICAgICBtTm90aWZpY2F0aW9uTWFuYWdlci5zZXROb3RpZmljYXRpb25Qb2xpY3kobmV3IE5vdGlmaWNhdGlvbk1hbmFnZXIuUG9saWN5KAorICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25NYW5hZ2VyLlBvbGljeS5QUklPUklUWV9DQVRFR09SWV9BTEFSTVMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE5vdGlmaWNhdGlvbk1hbmFnZXIuUG9saWN5LlBSSU9SSVRZX0NBVEVHT1JZX01FRElBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOb3RpZmljYXRpb25NYW5hZ2VyLlBvbGljeS5QUklPUklUWV9DQVRFR09SWV9TWVNURU0sIDAsIDApKTsKKyAgICAgICAgICAgIE5vdGlmaWNhdGlvbk1hbmFnZXIuUG9saWN5IHBvbGljeSA9IG1Ob3RpZmljYXRpb25NYW5hZ2VyLmdldE5vdGlmaWNhdGlvblBvbGljeSgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgocG9saWN5LnByaW9yaXR5Q2F0ZWdvcmllcworICAgICAgICAgICAgICAgICAgICAmIE5vdGlmaWNhdGlvbk1hbmFnZXIuUG9saWN5LlBSSU9SSVRZX0NBVEVHT1JZX0FMQVJNUykgIT0gMCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKChwb2xpY3kucHJpb3JpdHlDYXRlZ29yaWVzCisgICAgICAgICAgICAgICAgICAgICYgTm90aWZpY2F0aW9uTWFuYWdlci5Qb2xpY3kuUFJJT1JJVFlfQ0FURUdPUllfTUVESUEpICE9IDApOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgocG9saWN5LnByaW9yaXR5Q2F0ZWdvcmllcworICAgICAgICAgICAgICAgICAgICAmIE5vdGlmaWNhdGlvbk1hbmFnZXIuUG9saWN5LlBSSU9SSVRZX0NBVEVHT1JZX1NZU1RFTSkgIT0gMCk7CisKKyAgICAgICAgICAgIC8vIHRvZ2dsZSBvZmYgYWxhcm1zLCBtZWRpYSwgc3lzdGVtCisgICAgICAgICAgICBtTm90aWZpY2F0aW9uTWFuYWdlci5zZXROb3RpZmljYXRpb25Qb2xpY3kobmV3IE5vdGlmaWNhdGlvbk1hbmFnZXIuUG9saWN5KDAsIDAsIDApKTsKKyAgICAgICAgICAgIHBvbGljeSA9IG1Ob3RpZmljYXRpb25NYW5hZ2VyLmdldE5vdGlmaWNhdGlvblBvbGljeSgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgocG9saWN5LnByaW9yaXR5Q2F0ZWdvcmllcworICAgICAgICAgICAgICAgICAgICAmIE5vdGlmaWNhdGlvbk1hbmFnZXIuUG9saWN5LlBSSU9SSVRZX0NBVEVHT1JZX0FMQVJNUykgPT0gMCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKChwb2xpY3kucHJpb3JpdHlDYXRlZ29yaWVzICYKKyAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uTWFuYWdlci5Qb2xpY3kuUFJJT1JJVFlfQ0FURUdPUllfTUVESUEpID09IDApOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgocG9saWN5LnByaW9yaXR5Q2F0ZWdvcmllcyAmCisgICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbk1hbmFnZXIuUG9saWN5LlBSSU9SSVRZX0NBVEVHT1JZX1NZU1RFTSkgPT0gMCk7CisgICAgICAgIH0KKworICAgICAgICB0b2dnbGVOb3RpZmljYXRpb25Qb2xpY3lBY2Nlc3MobUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSwKKyAgICAgICAgICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKSwgZmFsc2UpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVDaGFubmVsR3JvdXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTkxLDE4ICsxNjUsNDMgQEAKICAgICAgICAgICAgICAgICBuZXcgTm90aWZpY2F0aW9uQ2hhbm5lbChtSWQsICJuYW1lIiwgTm90aWZpY2F0aW9uTWFuYWdlci5JTVBPUlRBTkNFX0RFRkFVTFQpOwogICAgICAgICBjaGFubmVsLnNldEdyb3VwKG5jZy5nZXRJZCgpKTsKICAgICAgICAgbU5vdGlmaWNhdGlvbk1hbmFnZXIuY3JlYXRlTm90aWZpY2F0aW9uQ2hhbm5lbEdyb3VwKG5jZyk7CisgICAgICAgIGZpbmFsIE5vdGlmaWNhdGlvbkNoYW5uZWwgdW5ncm91cGVkID0KKyAgICAgICAgICAgICAgICBuZXcgTm90aWZpY2F0aW9uQ2hhbm5lbChtSWQgKyAiISIsICJuYW1lIiwgTm90aWZpY2F0aW9uTWFuYWdlci5JTVBPUlRBTkNFX0RFRkFVTFQpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgbU5vdGlmaWNhdGlvbk1hbmFnZXIuY3JlYXRlTm90aWZpY2F0aW9uQ2hhbm5lbChjaGFubmVsKTsKKyAgICAgICAgICAgIG1Ob3RpZmljYXRpb25NYW5hZ2VyLmNyZWF0ZU5vdGlmaWNhdGlvbkNoYW5uZWwodW5ncm91cGVkKTsKIAogICAgICAgICAgICAgTGlzdDxOb3RpZmljYXRpb25DaGFubmVsR3JvdXA+IG5jZ3MgPQogICAgICAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uTWFuYWdlci5nZXROb3RpZmljYXRpb25DaGFubmVsR3JvdXBzKCk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbmNncy5zaXplKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG5jZywgbmNncy5nZXQoMCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG5jZy5nZXROYW1lKCksIG5jZ3MuZ2V0KDApLmdldE5hbWUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobmNnLmdldERlc2NyaXB0aW9uKCksIG5jZ3MuZ2V0KDApLmdldERlc2NyaXB0aW9uKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNoYW5uZWwuZ2V0SWQoKSwgbmNncy5nZXQoMCkuZ2V0Q2hhbm5lbHMoKS5nZXQoMCkuZ2V0SWQoKSk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBtTm90aWZpY2F0aW9uTWFuYWdlci5kZWxldGVOb3RpZmljYXRpb25DaGFubmVsR3JvdXAobmNnLmdldElkKCkpOwogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgdGVzdEdldENoYW5uZWxHcm91cCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBOb3RpZmljYXRpb25DaGFubmVsR3JvdXAgbmNnID0gbmV3IE5vdGlmaWNhdGlvbkNoYW5uZWxHcm91cCgiYSBncm91cCIsICJhIGxhYmVsIik7CisgICAgICAgIG5jZy5zZXREZXNjcmlwdGlvbigiYmFuYW5hcyIpOworICAgICAgICBmaW5hbCBOb3RpZmljYXRpb25DaGFubmVsR3JvdXAgbmNnMiA9IG5ldyBOb3RpZmljYXRpb25DaGFubmVsR3JvdXAoImdyb3VwIDIiLCAibGFiZWwgMiIpOworICAgICAgICBmaW5hbCBOb3RpZmljYXRpb25DaGFubmVsIGNoYW5uZWwgPQorICAgICAgICAgICAgICAgIG5ldyBOb3RpZmljYXRpb25DaGFubmVsKG1JZCwgIm5hbWUiLCBOb3RpZmljYXRpb25NYW5hZ2VyLklNUE9SVEFOQ0VfREVGQVVMVCk7CisgICAgICAgIGNoYW5uZWwuc2V0R3JvdXAobmNnLmdldElkKCkpOworCisgICAgICAgIG1Ob3RpZmljYXRpb25NYW5hZ2VyLmNyZWF0ZU5vdGlmaWNhdGlvbkNoYW5uZWxHcm91cChuY2cpOworICAgICAgICBtTm90aWZpY2F0aW9uTWFuYWdlci5jcmVhdGVOb3RpZmljYXRpb25DaGFubmVsR3JvdXAobmNnMik7CisgICAgICAgIG1Ob3RpZmljYXRpb25NYW5hZ2VyLmNyZWF0ZU5vdGlmaWNhdGlvbkNoYW5uZWwoY2hhbm5lbCk7CisKKyAgICAgICAgTm90aWZpY2F0aW9uQ2hhbm5lbEdyb3VwIGFjdHVhbCA9CisgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbk1hbmFnZXIuZ2V0Tm90aWZpY2F0aW9uQ2hhbm5lbEdyb3VwKG5jZy5nZXRJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5jZy5nZXRJZCgpLCBhY3R1YWwuZ2V0SWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuY2cuZ2V0TmFtZSgpLCBhY3R1YWwuZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5jZy5nZXREZXNjcmlwdGlvbigpLCBhY3R1YWwuZ2V0RGVzY3JpcHRpb24oKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhjaGFubmVsLmdldElkKCksIGFjdHVhbC5nZXRDaGFubmVscygpLmdldCgwKS5nZXRJZCgpKTsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlQ2hhbm5lbEdyb3VwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIE5vdGlmaWNhdGlvbkNoYW5uZWxHcm91cCBuY2cgPSBuZXcgTm90aWZpY2F0aW9uQ2hhbm5lbEdyb3VwKCJhIGdyb3VwIiwgImEgbGFiZWwiKTsKICAgICAgICAgZmluYWwgTm90aWZpY2F0aW9uQ2hhbm5lbCBjaGFubmVsID0KQEAgLTE1NCw2ICsyNTMsNDYgQEAKICAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uTWFuYWdlci5nZXROb3RpZmljYXRpb25DaGFubmVsKG1JZCkuZ2V0SW1wb3J0YW5jZSgpKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlQ2hhbm5lbF9hZGRUb0dyb3VwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBvbGRHcm91cCA9IG51bGw7CisgICAgICAgIFN0cmluZyBuZXdHcm91cCA9ICJuZXcgZ3JvdXAiOworICAgICAgICBtTm90aWZpY2F0aW9uTWFuYWdlci5jcmVhdGVOb3RpZmljYXRpb25DaGFubmVsR3JvdXAoCisgICAgICAgICAgICAgICAgbmV3IE5vdGlmaWNhdGlvbkNoYW5uZWxHcm91cChuZXdHcm91cCwgbmV3R3JvdXApKTsKKworICAgICAgICBOb3RpZmljYXRpb25DaGFubmVsIGNoYW5uZWwgPQorICAgICAgICAgICAgICAgIG5ldyBOb3RpZmljYXRpb25DaGFubmVsKG1JZCwgIm5hbWUiLCBOb3RpZmljYXRpb25NYW5hZ2VyLklNUE9SVEFOQ0VfREVGQVVMVCk7CisgICAgICAgIGNoYW5uZWwuc2V0R3JvdXAob2xkR3JvdXApOworICAgICAgICBtTm90aWZpY2F0aW9uTWFuYWdlci5jcmVhdGVOb3RpZmljYXRpb25DaGFubmVsKGNoYW5uZWwpOworCisgICAgICAgIGNoYW5uZWwuc2V0R3JvdXAobmV3R3JvdXApOworICAgICAgICBtTm90aWZpY2F0aW9uTWFuYWdlci5jcmVhdGVOb3RpZmljYXRpb25DaGFubmVsKGNoYW5uZWwpOworCisgICAgICAgIGZpbmFsIE5vdGlmaWNhdGlvbkNoYW5uZWwgdXBkYXRlZENoYW5uZWwgPQorICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25NYW5hZ2VyLmdldE5vdGlmaWNhdGlvbkNoYW5uZWwobUlkKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJGYWlsZWQgdG8gYWRkIG5vbi1ncm91cGVkIGNoYW5uZWwgdG8gYSBncm91cCBvbiB1cGRhdGUgIiwKKyAgICAgICAgICAgICAgICBuZXdHcm91cCwgdXBkYXRlZENoYW5uZWwuZ2V0R3JvdXAoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUNoYW5uZWxfY2Fubm90Q2hhbmdlR3JvdXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIG9sZEdyb3VwID0gIm9sZCBncm91cCI7CisgICAgICAgIFN0cmluZyBuZXdHcm91cCA9ICJuZXcgZ3JvdXAiOworICAgICAgICBtTm90aWZpY2F0aW9uTWFuYWdlci5jcmVhdGVOb3RpZmljYXRpb25DaGFubmVsR3JvdXAoCisgICAgICAgICAgICAgICAgbmV3IE5vdGlmaWNhdGlvbkNoYW5uZWxHcm91cChvbGRHcm91cCwgb2xkR3JvdXApKTsKKyAgICAgICAgbU5vdGlmaWNhdGlvbk1hbmFnZXIuY3JlYXRlTm90aWZpY2F0aW9uQ2hhbm5lbEdyb3VwKAorICAgICAgICAgICAgICAgIG5ldyBOb3RpZmljYXRpb25DaGFubmVsR3JvdXAobmV3R3JvdXAsIG5ld0dyb3VwKSk7CisKKyAgICAgICAgTm90aWZpY2F0aW9uQ2hhbm5lbCBjaGFubmVsID0KKyAgICAgICAgICAgICAgICBuZXcgTm90aWZpY2F0aW9uQ2hhbm5lbChtSWQsICJuYW1lIiwgTm90aWZpY2F0aW9uTWFuYWdlci5JTVBPUlRBTkNFX0RFRkFVTFQpOworICAgICAgICBjaGFubmVsLnNldEdyb3VwKG9sZEdyb3VwKTsKKyAgICAgICAgbU5vdGlmaWNhdGlvbk1hbmFnZXIuY3JlYXRlTm90aWZpY2F0aW9uQ2hhbm5lbChjaGFubmVsKTsKKyAgICAgICAgY2hhbm5lbC5zZXRHcm91cChuZXdHcm91cCk7CisgICAgICAgIG1Ob3RpZmljYXRpb25NYW5hZ2VyLmNyZWF0ZU5vdGlmaWNhdGlvbkNoYW5uZWwoY2hhbm5lbCk7CisgICAgICAgIGZpbmFsIE5vdGlmaWNhdGlvbkNoYW5uZWwgdXBkYXRlZENoYW5uZWwgPQorICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25NYW5hZ2VyLmdldE5vdGlmaWNhdGlvbkNoYW5uZWwobUlkKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJDaGFubmVscyBzaG91bGQgbm90IGJlIGFsbG93ZWQgdG8gY2hhbmdlIGdyb3VwcyIsCisgICAgICAgICAgICAgICAgb2xkR3JvdXAsIHVwZGF0ZWRDaGFubmVsLmdldEdyb3VwKCkpOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVTYW1lQ2hhbm5lbERvZXNOb3RVcGRhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgTm90aWZpY2F0aW9uQ2hhbm5lbCBjaGFubmVsID0KICAgICAgICAgICAgICAgICBuZXcgTm90aWZpY2F0aW9uQ2hhbm5lbChtSWQsICJuYW1lIiwgTm90aWZpY2F0aW9uTWFuYWdlci5JTVBPUlRBTkNFX0RFRkFVTFQpOwpAQCAtMTc2LDcgKzMxNSw2IEBACiAgICAgICAgIGNvbXBhcmVDaGFubmVscyhjaGFubmVsLCBtTm90aWZpY2F0aW9uTWFuYWdlci5nZXROb3RpZmljYXRpb25DaGFubmVsKGNoYW5uZWwuZ2V0SWQoKSkpOwogICAgIH0KIAotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSIzLjguMy4xL0MtMS0zIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlQ2hhbm5lbFdpdGhHcm91cCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBOb3RpZmljYXRpb25DaGFubmVsR3JvdXAgbmNnID0gbmV3IE5vdGlmaWNhdGlvbkNoYW5uZWxHcm91cCgiZyIsICJuIik7CiAgICAgICAgIG1Ob3RpZmljYXRpb25NYW5hZ2VyLmNyZWF0ZU5vdGlmaWNhdGlvbkNoYW5uZWxHcm91cChuY2cpOwpAQCAtMzMyLDYgKzQ3MCwxMDAgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdXNwZW5kUGFja2FnZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAobUFjdGl2aXR5TWFuYWdlci5pc0xvd1JhbURldmljZSgpICYmICFtUGFja2FnZU1hbmFnZXIuaGFzU3lzdGVtRmVhdHVyZShGRUFUVVJFX1dBVENIKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdG9nZ2xlTGlzdGVuZXJBY2Nlc3MoTW9ja05vdGlmaWNhdGlvbkxpc3RlbmVyLmdldElkKCksCisgICAgICAgICAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCksIHRydWUpOworICAgICAgICBUaHJlYWQuc2xlZXAoNTAwKTsgLy8gd2FpdCBmb3IgbGlzdGVuZXIgdG8gYmUgYWxsb3dlZAorCisgICAgICAgIG1MaXN0ZW5lciA9IE1vY2tOb3RpZmljYXRpb25MaXN0ZW5lci5nZXRJbnN0YW5jZSgpOworICAgICAgICBhc3NlcnROb3ROdWxsKG1MaXN0ZW5lcik7CisKKyAgICAgICAgc2VuZE5vdGlmaWNhdGlvbigxLCBSLmRyYXdhYmxlLmJsYWNrKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKDUwMCk7IC8vIHdhaXQgZm9yIG5vdGlmaWNhdGlvbiBsaXN0ZW5lciB0byByZWNlaXZlIG5vdGlmaWNhdGlvbgorICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbUxpc3RlbmVyLm1Qb3N0ZWQuc2l6ZSgpKTsKKworICAgICAgICAvLyBzdXNwZW5kIHBhY2thZ2UsIHJhbmtpbmcgc2hvdWxkIGJlIHVwZGF0ZWQgd2l0aCBzdXNwZW5kZWQgPSB0cnVlCisgICAgICAgIHN1c3BlbmRQYWNrYWdlKG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCksIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLAorICAgICAgICAgICAgICAgIHRydWUpOworICAgICAgICBUaHJlYWQuc2xlZXAoNTAwKTsgLy8gd2FpdCBmb3Igbm90aWZpY2F0aW9uIGxpc3RlbmVyIHRvIGdldCByZXNwb25zZQorICAgICAgICBOb3RpZmljYXRpb25MaXN0ZW5lclNlcnZpY2UuUmFua2luZ01hcCByYW5raW5nTWFwID0gbUxpc3RlbmVyLm1SYW5raW5nTWFwOworICAgICAgICBOb3RpZmljYXRpb25MaXN0ZW5lclNlcnZpY2UuUmFua2luZyBvdXRSYW5raW5nID0gbmV3IE5vdGlmaWNhdGlvbkxpc3RlbmVyU2VydmljZS5SYW5raW5nKCk7CisgICAgICAgIGZvciAoU3RyaW5nIGtleSA6IHJhbmtpbmdNYXAuZ2V0T3JkZXJlZEtleXMoKSkgeworICAgICAgICAgICAgaWYgKGtleS5jb250YWlucyhtTGlzdGVuZXIuZ2V0UGFja2FnZU5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICByYW5raW5nTWFwLmdldFJhbmtpbmcoa2V5LCBvdXRSYW5raW5nKTsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJrZXk9IiArIGtleSArICIgc3VzcGVuZGVkPSIgKyBvdXRSYW5raW5nLmlzU3VzcGVuZGVkKCkpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUob3V0UmFua2luZy5pc1N1c3BlbmRlZCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHVuc3VzcGVuZCBwYWNrYWdlLCByYW5raW5nIHNob3VsZCBiZSB1cGRhdGVkIHdpdGggc3VzcGVuZGVkID0gZmFsc2UKKyAgICAgICAgc3VzcGVuZFBhY2thZ2UobUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSwgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCksCisgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICBUaHJlYWQuc2xlZXAoNTAwKTsgLy8gd2FpdCBmb3Igbm90aWZpY2F0aW9uIGxpc3RlbmVyIHRvIGdldCByZXNwb25zZQorICAgICAgICByYW5raW5nTWFwID0gbUxpc3RlbmVyLm1SYW5raW5nTWFwOworICAgICAgICBmb3IgKFN0cmluZyBrZXkgOiByYW5raW5nTWFwLmdldE9yZGVyZWRLZXlzKCkpIHsKKyAgICAgICAgICAgIGlmIChrZXkuY29udGFpbnMobUxpc3RlbmVyLmdldFBhY2thZ2VOYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgcmFua2luZ01hcC5nZXRSYW5raW5nKGtleSwgb3V0UmFua2luZyk7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAia2V5PSIgKyBrZXkgKyAiIHN1c3BlbmRlZD0iICsgb3V0UmFua2luZy5pc1N1c3BlbmRlZCgpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShvdXRSYW5raW5nLmlzU3VzcGVuZGVkKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbUxpc3RlbmVyLnJlc2V0RGF0YSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROb3RpZnlfYmxvY2tlZENoYW5uZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbU5vdGlmaWNhdGlvbk1hbmFnZXIuY2FuY2VsQWxsKCk7CisKKyAgICAgICAgTm90aWZpY2F0aW9uQ2hhbm5lbCBjaGFubmVsID0KKyAgICAgICAgICAgICAgICBuZXcgTm90aWZpY2F0aW9uQ2hhbm5lbChtSWQsICJuYW1lIiwgTm90aWZpY2F0aW9uTWFuYWdlci5JTVBPUlRBTkNFX05PTkUpOworICAgICAgICBtTm90aWZpY2F0aW9uTWFuYWdlci5jcmVhdGVOb3RpZmljYXRpb25DaGFubmVsKGNoYW5uZWwpOworCisgICAgICAgIGludCBpZCA9IDE7CisgICAgICAgIGZpbmFsIE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24gPQorICAgICAgICAgICAgICAgIG5ldyBOb3RpZmljYXRpb24uQnVpbGRlcihtQ29udGV4dCwgbUlkKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFNtYWxsSWNvbihSLmRyYXdhYmxlLmJsYWNrKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFdoZW4oU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudFRpdGxlKCJub3RpZnkjIiArIGlkKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnRUZXh0KCJUaGlzIGlzICMiICsgaWQgKyAibm90aWZpY2F0aW9uICAiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIG1Ob3RpZmljYXRpb25NYW5hZ2VyLm5vdGlmeShpZCwgbm90aWZpY2F0aW9uKTsKKworICAgICAgICBpZiAoIWNoZWNrTm90aWZpY2F0aW9uRXhpc3RlbmNlKGlkLCAvKnNob3VsZEV4aXN0PSovIGZhbHNlKSkgeworICAgICAgICAgICAgZmFpbCgiZm91bmQgdW5leHBlY3RlZCBub3RpZmljYXRpb24gaWQ9IiArIGlkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROb3RpZnlfYmxvY2tlZENoYW5uZWxHcm91cCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtTm90aWZpY2F0aW9uTWFuYWdlci5jYW5jZWxBbGwoKTsKKworICAgICAgICBOb3RpZmljYXRpb25DaGFubmVsR3JvdXAgZ3JvdXAgPSBuZXcgTm90aWZpY2F0aW9uQ2hhbm5lbEdyb3VwKG1JZCwgImdyb3VwIG5hbWUiKTsKKyAgICAgICAgZ3JvdXAuc2V0QmxvY2tlZCh0cnVlKTsKKyAgICAgICAgbU5vdGlmaWNhdGlvbk1hbmFnZXIuY3JlYXRlTm90aWZpY2F0aW9uQ2hhbm5lbEdyb3VwKGdyb3VwKTsKKyAgICAgICAgTm90aWZpY2F0aW9uQ2hhbm5lbCBjaGFubmVsID0KKyAgICAgICAgICAgICAgICBuZXcgTm90aWZpY2F0aW9uQ2hhbm5lbChtSWQsICJuYW1lIiwgTm90aWZpY2F0aW9uTWFuYWdlci5JTVBPUlRBTkNFX0RFRkFVTFQpOworICAgICAgICBjaGFubmVsLnNldEdyb3VwKG1JZCk7CisgICAgICAgIG1Ob3RpZmljYXRpb25NYW5hZ2VyLmNyZWF0ZU5vdGlmaWNhdGlvbkNoYW5uZWwoY2hhbm5lbCk7CisKKyAgICAgICAgaW50IGlkID0gMTsKKyAgICAgICAgZmluYWwgTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiA9CisgICAgICAgICAgICAgICAgbmV3IE5vdGlmaWNhdGlvbi5CdWlsZGVyKG1Db250ZXh0LCBtSWQpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0U21hbGxJY29uKFIuZHJhd2FibGUuYmxhY2spCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0V2hlbihTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50VGl0bGUoIm5vdGlmeSMiICsgaWQpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudFRleHQoIlRoaXMgaXMgIyIgKyBpZCArICJub3RpZmljYXRpb24gICIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgbU5vdGlmaWNhdGlvbk1hbmFnZXIubm90aWZ5KGlkLCBub3RpZmljYXRpb24pOworCisgICAgICAgIGlmICghY2hlY2tOb3RpZmljYXRpb25FeGlzdGVuY2UoaWQsIC8qc2hvdWxkRXhpc3Q9Ki8gZmFsc2UpKSB7CisgICAgICAgICAgICBmYWlsKCJmb3VuZCB1bmV4cGVjdGVkIG5vdGlmaWNhdGlvbiBpZD0iICsgaWQpOworICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgdGVzdENhbmNlbCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBmaW5hbCBpbnQgaWQgPSA5OwogICAgICAgICBzZW5kTm90aWZpY2F0aW9uKGlkLCBSLmRyYXdhYmxlLmJsYWNrKTsKQEAgLTM5MSw3ICs2MjMsNiBAQAogICAgICAgICBjaGVja05vdGlmaWNhdGlvbkV4aXN0ZW5jZShpZCwgZmFsc2UpOwogICAgIH0KIAotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSIzLjguMy9ILTAtMiwzLjguMy4xL0MtMi0xIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0TWVkaWFTdHlsZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBtTm90aWZpY2F0aW9uTWFuYWdlci5jYW5jZWxBbGwoKTsKICAgICAgICAgZmluYWwgaW50IGlkID0gOTk7CkBAIC00NDMsNyArNjc0LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSIzLjguMy9ILTAtMiwzLjguMy4xL0MtMi0xIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0QmlnVGV4dFN0eWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIGludCBpZCA9IDEwMTsKIApAQCAtNDcwLDcgKzcwMCw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iMy44LjMvSC0wLTIsMy44LjMuMS9DLTItMSIpCiAgICAgcHVibGljIHZvaWQgdGVzdEJpZ1BpY3R1cmVTdHlsZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBmaW5hbCBpbnQgaWQgPSAxMDI7CiAKQEAgLTQ5OCw3ICs3MjcsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjMuOC4zLjEvQy0xLTMiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvZ3JvdXBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgc2VuZE5vdGlmaWNhdGlvbigxLCBSLmRyYXdhYmxlLmJsYWNrKTsKICAgICAgICAgc2VuZE5vdGlmaWNhdGlvbigyLCBSLmRyYXdhYmxlLmJsdWUpOwpAQCAtNTA5LDcgKzczNyw2IEBACiAgICAgICAgIGFzc2VydEFsbFBvc3RlZE5vdGlmaWNhdGlvbnNBdXRvZ3JvdXBlZCgpOwogICAgIH0KIAotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSIzLjguMy4xL0MtMS0zIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0b2dyb3VwaW5nX2F1dG9ncm91cFN0YXlzVW50aWxBbGxOb3RpZmljYXRpb25zQ2FuY2VsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgc2VuZE5vdGlmaWNhdGlvbigxLCBSLmRyYXdhYmxlLmJsYWNrKTsKICAgICAgICAgc2VuZE5vdGlmaWNhdGlvbigyLCBSLmRyYXdhYmxlLmJsdWUpOwpAQCAtNjAxLDYgKzgyOCw4MCBAQAogICAgICAgICBhc3NlcnRPbmx5U29tZU5vdGlmaWNhdGlvbnNBdXRvZ3JvdXBlZChwb3N0ZWRJZHMpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXROb3RpZmljYXRpb25Qb2xpY3lfUF9zZXRPbGRGaWVsZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG1BY3Rpdml0eU1hbmFnZXIuaXNMb3dSYW1EZXZpY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRvZ2dsZU5vdGlmaWNhdGlvblBvbGljeUFjY2VzcyhtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpLAorICAgICAgICAgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLCB0cnVlKTsKKyAgICAgICAgaWYgKG1Db250ZXh0LmdldEFwcGxpY2F0aW9uSW5mbygpLnRhcmdldFNka1ZlcnNpb24gPj0gQnVpbGQuVkVSU0lPTl9DT0RFUy5QKSB7CisgICAgICAgICAgICBOb3RpZmljYXRpb25NYW5hZ2VyLlBvbGljeSBhcHBQb2xpY3kgPSBuZXcgTm90aWZpY2F0aW9uTWFuYWdlci5Qb2xpY3koMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgU1VQUFJFU1NFRF9FRkZFQ1RfU0NSRUVOX09OIHwgU1VQUFJFU1NFRF9FRkZFQ1RfU0NSRUVOX09GRik7CisgICAgICAgICAgICBtTm90aWZpY2F0aW9uTWFuYWdlci5zZXROb3RpZmljYXRpb25Qb2xpY3koYXBwUG9saWN5KTsKKworICAgICAgICAgICAgaW50IGV4cGVjdGVkID0gU1VQUFJFU1NFRF9FRkZFQ1RfU0NSRUVOX09OIHwgU1VQUFJFU1NFRF9FRkZFQ1RfU0NSRUVOX09GRgorICAgICAgICAgICAgICAgICAgICB8IFNVUFBSRVNTRURfRUZGRUNUX1BFRUsgfCBTVVBQUkVTU0VEX0VGRkVDVF9BTUJJRU5UCisgICAgICAgICAgICAgICAgICAgIHwgU1VQUFJFU1NFRF9FRkZFQ1RfTElHSFRTIHwgU1VQUFJFU1NFRF9FRkZFQ1RfRlVMTF9TQ1JFRU5fSU5URU5UOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25NYW5hZ2VyLmdldE5vdGlmaWNhdGlvblBvbGljeSgpLnN1cHByZXNzZWRWaXN1YWxFZmZlY3RzKTsKKyAgICAgICAgfQorICAgICAgICB0b2dnbGVOb3RpZmljYXRpb25Qb2xpY3lBY2Nlc3MobUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSwKKyAgICAgICAgICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKSwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTZXROb3RpZmljYXRpb25Qb2xpY3lfUF9zZXROZXdGaWVsZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG1BY3Rpdml0eU1hbmFnZXIuaXNMb3dSYW1EZXZpY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRvZ2dsZU5vdGlmaWNhdGlvblBvbGljeUFjY2VzcyhtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpLAorICAgICAgICAgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLCB0cnVlKTsKKyAgICAgICAgaWYgKG1Db250ZXh0LmdldEFwcGxpY2F0aW9uSW5mbygpLnRhcmdldFNka1ZlcnNpb24gPj0gQnVpbGQuVkVSU0lPTl9DT0RFUy5QKSB7CisgICAgICAgICAgICBOb3RpZmljYXRpb25NYW5hZ2VyLlBvbGljeSBhcHBQb2xpY3kgPSBuZXcgTm90aWZpY2F0aW9uTWFuYWdlci5Qb2xpY3koMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgU1VQUFJFU1NFRF9FRkZFQ1RfTk9USUZJQ0FUSU9OX0xJU1QgfCBTVVBQUkVTU0VEX0VGRkVDVF9BTUJJRU5UCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTVVBQUkVTU0VEX0VGRkVDVF9MSUdIVFMgfCBTVVBQUkVTU0VEX0VGRkVDVF9GVUxMX1NDUkVFTl9JTlRFTlQpOworICAgICAgICAgICAgbU5vdGlmaWNhdGlvbk1hbmFnZXIuc2V0Tm90aWZpY2F0aW9uUG9saWN5KGFwcFBvbGljeSk7CisKKyAgICAgICAgICAgIGludCBleHBlY3RlZCA9IFNVUFBSRVNTRURfRUZGRUNUX05PVElGSUNBVElPTl9MSVNUIHwgU1VQUFJFU1NFRF9FRkZFQ1RfU0NSRUVOX09GRgorICAgICAgICAgICAgICAgICAgICB8IFNVUFBSRVNTRURfRUZGRUNUX0FNQklFTlQgfCBTVVBQUkVTU0VEX0VGRkVDVF9MSUdIVFMKKyAgICAgICAgICAgICAgICAgICAgfCBTVVBQUkVTU0VEX0VGRkVDVF9GVUxMX1NDUkVFTl9JTlRFTlQ7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25NYW5hZ2VyLmdldE5vdGlmaWNhdGlvblBvbGljeSgpLnN1cHByZXNzZWRWaXN1YWxFZmZlY3RzKTsKKyAgICAgICAgfQorICAgICAgICB0b2dnbGVOb3RpZmljYXRpb25Qb2xpY3lBY2Nlc3MobUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSwKKyAgICAgICAgICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKSwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTZXROb3RpZmljYXRpb25Qb2xpY3lfUF9zZXRPbGROZXdGaWVsZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG1BY3Rpdml0eU1hbmFnZXIuaXNMb3dSYW1EZXZpY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRvZ2dsZU5vdGlmaWNhdGlvblBvbGljeUFjY2VzcyhtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpLAorICAgICAgICAgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLCB0cnVlKTsKKyAgICAgICAgaWYgKG1Db250ZXh0LmdldEFwcGxpY2F0aW9uSW5mbygpLnRhcmdldFNka1ZlcnNpb24gPj0gQnVpbGQuVkVSU0lPTl9DT0RFUy5QKSB7CisKKyAgICAgICAgICAgIE5vdGlmaWNhdGlvbk1hbmFnZXIuUG9saWN5IGFwcFBvbGljeSA9IG5ldyBOb3RpZmljYXRpb25NYW5hZ2VyLlBvbGljeSgwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICBTVVBQUkVTU0VEX0VGRkVDVF9TQ1JFRU5fT04gfCBTVVBQUkVTU0VEX0VGRkVDVF9TVEFUVVNfQkFSKTsKKyAgICAgICAgICAgIG1Ob3RpZmljYXRpb25NYW5hZ2VyLnNldE5vdGlmaWNhdGlvblBvbGljeShhcHBQb2xpY3kpOworCisgICAgICAgICAgICBpbnQgZXhwZWN0ZWQgPSBTVVBQUkVTU0VEX0VGRkVDVF9TVEFUVVNfQkFSOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uTWFuYWdlci5nZXROb3RpZmljYXRpb25Qb2xpY3koKS5zdXBwcmVzc2VkVmlzdWFsRWZmZWN0cyk7CisKKyAgICAgICAgICAgIGFwcFBvbGljeSA9IG5ldyBOb3RpZmljYXRpb25NYW5hZ2VyLlBvbGljeSgwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICBTVVBQUkVTU0VEX0VGRkVDVF9TQ1JFRU5fT04gfCBTVVBQUkVTU0VEX0VGRkVDVF9BTUJJRU5UCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTVVBQUkVTU0VEX0VGRkVDVF9MSUdIVFMgfCBTVVBQUkVTU0VEX0VGRkVDVF9GVUxMX1NDUkVFTl9JTlRFTlQpOworICAgICAgICAgICAgbU5vdGlmaWNhdGlvbk1hbmFnZXIuc2V0Tm90aWZpY2F0aW9uUG9saWN5KGFwcFBvbGljeSk7CisKKyAgICAgICAgICAgIGV4cGVjdGVkID0gU1VQUFJFU1NFRF9FRkZFQ1RfU0NSRUVOX09GRiB8IFNVUFBSRVNTRURfRUZGRUNUX0FNQklFTlQKKyAgICAgICAgICAgICAgICAgICAgfCBTVVBQUkVTU0VEX0VGRkVDVF9MSUdIVFMgfCBTVVBQUkVTU0VEX0VGRkVDVF9GVUxMX1NDUkVFTl9JTlRFTlQ7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25NYW5hZ2VyLmdldE5vdGlmaWNhdGlvblBvbGljeSgpLnN1cHByZXNzZWRWaXN1YWxFZmZlY3RzKTsKKyAgICAgICAgfQorICAgICAgICB0b2dnbGVOb3RpZmljYXRpb25Qb2xpY3lBY2Nlc3MobUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSwKKyAgICAgICAgICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKSwgZmFsc2UpOworICAgIH0KKwogICAgIHByaXZhdGUgUGVuZGluZ0ludGVudCBnZXRQZW5kaW5nSW50ZW50KCkgewogICAgICAgICByZXR1cm4gUGVuZGluZ0ludGVudC5nZXRBY3Rpdml0eSgKICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCksIDAsIG5ldyBJbnRlbnQoZ2V0Q29udGV4dCgpLCB0aGlzLmdldENsYXNzKCkpLCAwKTsKQEAgLTY5Miw2ICs5OTMsNyBAQAogICAgICAgICAgICAgZm91bmQgPSBmYWxzZTsKICAgICAgICAgICAgIGZpbmFsIFN0YXR1c0Jhck5vdGlmaWNhdGlvbltdIHNibnMgPSBtTm90aWZpY2F0aW9uTWFuYWdlci5nZXRBY3RpdmVOb3RpZmljYXRpb25zKCk7CiAgICAgICAgICAgICBmb3IgKFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBzYm4gOiBzYm5zKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRm91bmQgIiArIHNibi5nZXRLZXkoKSk7CiAgICAgICAgICAgICAgICAgaWYgKHNibi5nZXRJZCgpID09IGlkKSB7CiAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC03NTAsNCArMTA1Miw1NiBAQAogICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQuZ2V0VmlicmF0aW9uUGF0dGVybigpLCBhY3R1YWwuZ2V0VmlicmF0aW9uUGF0dGVybigpKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZC5nZXRHcm91cCgpLCBhY3R1YWwuZ2V0R3JvdXAoKSk7CiAgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRvZ2dsZU5vdGlmaWNhdGlvblBvbGljeUFjY2VzcyhTdHJpbmcgcGFja2FnZU5hbWUsCisgICAgICAgICAgICBJbnN0cnVtZW50YXRpb24gaW5zdHJ1bWVudGF0aW9uLCBib29sZWFuIG9uKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIFN0cmluZyBjb21tYW5kID0gIiBjbWQgbm90aWZpY2F0aW9uICIgKyAob24gPyAiYWxsb3dfZG5kICIgOiAiZGlzYWxsb3dfZG5kICIpICsgcGFja2FnZU5hbWU7CisKKyAgICAgICAgcnVuQ29tbWFuZChjb21tYW5kLCBpbnN0cnVtZW50YXRpb24pOworCisgICAgICAgIE5vdGlmaWNhdGlvbk1hbmFnZXIgbm0gPSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKE5vdGlmaWNhdGlvbk1hbmFnZXIuY2xhc3MpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJOb3RpZmljYXRpb24gUG9saWN5IEFjY2VzcyBHcmFudCBpcyAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5tLmlzTm90aWZpY2F0aW9uUG9saWN5QWNjZXNzR3JhbnRlZCgpICsgIiBub3QgIiArIG9uLCBvbiwKKyAgICAgICAgICAgICAgICBubS5pc05vdGlmaWNhdGlvblBvbGljeUFjY2Vzc0dyYW50ZWQoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHN1c3BlbmRQYWNrYWdlKFN0cmluZyBwYWNrYWdlTmFtZSwKKyAgICAgICAgICAgIEluc3RydW1lbnRhdGlvbiBpbnN0cnVtZW50YXRpb24sIGJvb2xlYW4gc3VzcGVuZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGNvbW1hbmQgPSAiIGNtZCBub3RpZmljYXRpb24gIiArIChzdXNwZW5kID8gInN1c3BlbmRfcGFja2FnZSAiCisgICAgICAgICAgICAgICAgOiAidW5zdXNwZW5kX3BhY2thZ2UgIikgKyBwYWNrYWdlTmFtZTsKKworICAgICAgICBydW5Db21tYW5kKGNvbW1hbmQsIGluc3RydW1lbnRhdGlvbik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRvZ2dsZUxpc3RlbmVyQWNjZXNzKFN0cmluZyBjb21wb25lbnROYW1lLCBJbnN0cnVtZW50YXRpb24gaW5zdHJ1bWVudGF0aW9uLAorICAgICAgICAgICAgYm9vbGVhbiBvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgY29tbWFuZCA9ICIgY21kIG5vdGlmaWNhdGlvbiAiICsgKG9uID8gImFsbG93X2xpc3RlbmVyICIgOiAiZGlzYWxsb3dfbGlzdGVuZXIgIikKKyAgICAgICAgICAgICAgICArIGNvbXBvbmVudE5hbWU7CisKKyAgICAgICAgcnVuQ29tbWFuZChjb21tYW5kLCBpbnN0cnVtZW50YXRpb24pOworCisgICAgICAgIGZpbmFsIE5vdGlmaWNhdGlvbk1hbmFnZXIgbm0gPSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKE5vdGlmaWNhdGlvbk1hbmFnZXIuY2xhc3MpOworICAgICAgICBmaW5hbCBDb21wb25lbnROYW1lIGxpc3RlbmVyQ29tcG9uZW50ID0gTW9ja05vdGlmaWNhdGlvbkxpc3RlbmVyLmdldENvbXBvbmVudE5hbWUoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShsaXN0ZW5lckNvbXBvbmVudCArICIgaGFzIG5vdCBiZWVuIGdyYW50ZWQgYWNjZXNzIiwKKyAgICAgICAgICAgICAgICBubS5pc05vdGlmaWNhdGlvbkxpc3RlbmVyQWNjZXNzR3JhbnRlZChsaXN0ZW5lckNvbXBvbmVudCkgPT0gb24pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBydW5Db21tYW5kKFN0cmluZyBjb21tYW5kLCBJbnN0cnVtZW50YXRpb24gaW5zdHJ1bWVudGF0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBVaUF1dG9tYXRpb24gdWlBdXRvbWF0aW9uID0gaW5zdHJ1bWVudGF0aW9uLmdldFVpQXV0b21hdGlvbigpOworICAgICAgICAvLyBFeGVjdXRlIGNvbW1hbmQKKyAgICAgICAgdHJ5IChQYXJjZWxGaWxlRGVzY3JpcHRvciBmZCA9IHVpQXV0b21hdGlvbi5leGVjdXRlU2hlbGxDb21tYW5kKGNvbW1hbmQpKSB7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiRmFpbGVkIHRvIGV4ZWN1dGUgc2hlbGwgY29tbWFuZDogIiArIGNvbW1hbmQsIGZkKTsKKyAgICAgICAgICAgIC8vIFdhaXQgZm9yIHRoZSBjb21tYW5kIHRvIGZpbmlzaCBieSByZWFkaW5nIHVudGlsIEVPRgorICAgICAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmQuZ2V0RmlsZURlc2NyaXB0b3IoKSkpIHsKKyAgICAgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbNDA5Nl07CisgICAgICAgICAgICAgICAgd2hpbGUgKGluLnJlYWQoYnVmZmVyKSA+IDApIHt9CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDb3VsZCBub3QgcmVhZCBzdGRvdXQgb2YgY29tbWFuZDrCoCIgKyBjb21tYW5kLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHVpQXV0b21hdGlvbi5kZXN0cm95KCk7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9hcHAvc3JjL2FuZHJvaWQvYXBwL2N0cy9Ob3RpZmljYXRpb25UZXN0LmphdmEgYi90ZXN0cy9hcHAvc3JjL2FuZHJvaWQvYXBwL2N0cy9Ob3RpZmljYXRpb25UZXN0LmphdmEKaW5kZXggNDdhYjNhMS4uMzU0OTE0NSAxMDA2NDQKLS0tIGEvdGVzdHMvYXBwL3NyYy9hbmRyb2lkL2FwcC9jdHMvTm90aWZpY2F0aW9uVGVzdC5qYXZhCisrKyBiL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL05vdGlmaWNhdGlvblRlc3QuamF2YQpAQCAtMTcsMjMgKzE3LDMxIEBACiBwYWNrYWdlIGFuZHJvaWQuYXBwLmN0czsKIAogaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb24uQWN0aW9uLkJ1aWxkZXI7CitpbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uLk1lc3NhZ2luZ1N0eWxlOwogaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbi5NZXNzYWdpbmdTdHlsZS5NZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbkNoYW5uZWw7CiBpbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OworaW1wb3J0IGFuZHJvaWQuYXBwLlBlcnNvbjsKIGltcG9ydCBhbmRyb2lkLmFwcC5SZW1vdGVJbnB1dDsKK2ltcG9ydCBhbmRyb2lkLmFwcC5zdHVicy5SOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5JY29uOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk51bGxhYmxlOworCitpbXBvcnQgYW5kcm9pZC5vcy5TdHJpY3RNb2RlOwogaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3M7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNkZFRlc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CiAKLWltcG9ydCBvcmcubW9ja2l0by5pbnRlcm5hbC5tYXRjaGVycy5Ob3Q7Ci0KLUBDZGRUZXN0KHJlcXVpcmVtZW50PSIzLjguMy9ILTAtMSwzLjguMy4xL0MtMS00IikKIHB1YmxpYyBjbGFzcyBOb3RpZmljYXRpb25UZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9SRVNVTFRfS0VZID0gInRleHQiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX1JFU1VMVF9LRVkgPSAiZGF0YSI7CkBAIC05Miw2ICsxMDAsMjUgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBtTm90aWZpY2F0aW9uLmRlc2NyaWJlQ29udGVudHMoKSk7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgdGVzdENhdGVnb3JpZXMoKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwoTm90aWZpY2F0aW9uLkNBVEVHT1JZX0FMQVJNKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChOb3RpZmljYXRpb24uQ0FURUdPUllfQ0FMTCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoTm90aWZpY2F0aW9uLkNBVEVHT1JZX0VNQUlMKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChOb3RpZmljYXRpb24uQ0FURUdPUllfRVJST1IpOworICAgICAgICBhc3NlcnROb3ROdWxsKE5vdGlmaWNhdGlvbi5DQVRFR09SWV9FVkVOVCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoTm90aWZpY2F0aW9uLkNBVEVHT1JZX01FU1NBR0UpOworICAgICAgICBhc3NlcnROb3ROdWxsKE5vdGlmaWNhdGlvbi5DQVRFR09SWV9OQVZJR0FUSU9OKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChOb3RpZmljYXRpb24uQ0FURUdPUllfUFJPR1JFU1MpOworICAgICAgICBhc3NlcnROb3ROdWxsKE5vdGlmaWNhdGlvbi5DQVRFR09SWV9QUk9NTyk7CisgICAgICAgIGFzc2VydE5vdE51bGwoTm90aWZpY2F0aW9uLkNBVEVHT1JZX1JFQ09NTUVOREFUSU9OKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChOb3RpZmljYXRpb24uQ0FURUdPUllfUkVNSU5ERVIpOworICAgICAgICBhc3NlcnROb3ROdWxsKE5vdGlmaWNhdGlvbi5DQVRFR09SWV9TRVJWSUNFKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChOb3RpZmljYXRpb24uQ0FURUdPUllfU09DSUFMKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChOb3RpZmljYXRpb24uQ0FURUdPUllfU1RBVFVTKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChOb3RpZmljYXRpb24uQ0FURUdPUllfU1lTVEVNKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChOb3RpZmljYXRpb24uQ0FURUdPUllfVFJBTlNQT1JUKTsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGVUb1BhcmNlbCgpIHsKIAogICAgICAgICBtTm90aWZpY2F0aW9uID0gbmV3IE5vdGlmaWNhdGlvbi5CdWlsZGVyKG1Db250ZXh0LCBDSEFOTkVMLmdldElkKCkpCkBAIC0yMjksNiArMjU2LDE1IEBACiAgICAgICAgIGFzc2VydEVxdWFscyhOb3RpZmljYXRpb24uR1JPVVBfQUxFUlRfU1VNTUFSWSwgbU5vdGlmaWNhdGlvbi5nZXRHcm91cEFsZXJ0QmVoYXZpb3IoKSk7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgdGVzdEJ1aWxkZXJfZ2V0U3R5bGUoKSB7CisgICAgICAgIE1lc3NhZ2luZ1N0eWxlIG1zID0gbmV3IE1lc3NhZ2luZ1N0eWxlKG5ldyBQZXJzb24uQnVpbGRlcigpLnNldE5hbWUoIlRlc3QgbmFtZSIpLmJ1aWxkKCkpOworICAgICAgICBOb3RpZmljYXRpb24uQnVpbGRlciBidWlsZGVyID0gbmV3IE5vdGlmaWNhdGlvbi5CdWlsZGVyKG1Db250ZXh0LCBDSEFOTkVMLmdldElkKCkpOworCisgICAgICAgIGJ1aWxkZXIuc2V0U3R5bGUobXMpOworCisgICAgICAgIGFzc2VydEVxdWFscyhtcywgYnVpbGRlci5nZXRTdHlsZSgpKTsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWN0aW9uQnVpbGRlcigpIHsKICAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoKTsKICAgICAgICAgZmluYWwgUGVuZGluZ0ludGVudCBhY3Rpb25JbnRlbnQgPSBQZW5kaW5nSW50ZW50LmdldEJyb2FkY2FzdChtQ29udGV4dCwgMCwgaW50ZW50LCAwKTsKQEAgLTIzOSw2ICsyNzUsNjMgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIG1BY3Rpb24uZ2V0QWxsb3dHZW5lcmF0ZWRSZXBsaWVzKCkpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb3RpZmljYXRpb25fYWRkUGVyc29uKCkgeworICAgICAgICBTdHJpbmcgbmFtZSA9ICJuYW1lIjsKKyAgICAgICAgU3RyaW5nIGtleSA9ICJrZXkiOworICAgICAgICBTdHJpbmcgdXJpID0gIm5hbWU6bmFtZSI7CisgICAgICAgIFBlcnNvbiBwZXJzb24gPSBuZXcgUGVyc29uLkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXROYW1lKG5hbWUpCisgICAgICAgICAgICAgICAgLnNldEljb24oSWNvbi5jcmVhdGVXaXRoUmVzb3VyY2UobUNvbnRleHQsIDEpKQorICAgICAgICAgICAgICAgIC5zZXRLZXkoa2V5KQorICAgICAgICAgICAgICAgIC5zZXRVcmkodXJpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICBtTm90aWZpY2F0aW9uID0gbmV3IE5vdGlmaWNhdGlvbi5CdWlsZGVyKG1Db250ZXh0LCBDSEFOTkVMLmdldElkKCkpCisgICAgICAgICAgICAgICAgLnNldFNtYWxsSWNvbigxKQorICAgICAgICAgICAgICAgIC5zZXRDb250ZW50VGl0bGUoQ09OVEVOVF9USVRMRSkKKyAgICAgICAgICAgICAgICAuYWRkUGVyc29uKHBlcnNvbikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgICAgICBBcnJheUxpc3Q8UGVyc29uPiByZXN0b3JlZFBlb3BsZSA9IG1Ob3RpZmljYXRpb24uZXh0cmFzLmdldFBhcmNlbGFibGVBcnJheUxpc3QoCisgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uLkVYVFJBX1BFT1BMRV9MSVNUKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXN0b3JlZFBlb3BsZSk7CisgICAgICAgIFBlcnNvbiByZXN0b3JlZFBlcnNvbiA9IHJlc3RvcmVkUGVvcGxlLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXN0b3JlZFBlcnNvbik7CisgICAgICAgIGFzc2VydE5vdE51bGwocmVzdG9yZWRQZXJzb24uZ2V0SWNvbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5hbWUsIHJlc3RvcmVkUGVyc29uLmdldE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhrZXksIHJlc3RvcmVkUGVyc29uLmdldEtleSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHVyaSwgcmVzdG9yZWRQZXJzb24uZ2V0VXJpKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROb3RpZmljYXRpb25fTWVzc2FnaW5nU3R5bGVfcGVvcGxlKCkgeworICAgICAgICBTdHJpbmcgbmFtZSA9ICJuYW1lIjsKKyAgICAgICAgU3RyaW5nIGtleSA9ICJrZXkiOworICAgICAgICBTdHJpbmcgdXJpID0gIm5hbWU6bmFtZSI7CisgICAgICAgIFBlcnNvbiB1c2VyID0gbmV3IFBlcnNvbi5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0TmFtZShuYW1lKQorICAgICAgICAgICAgICAgIC5zZXRJY29uKEljb24uY3JlYXRlV2l0aFJlc291cmNlKG1Db250ZXh0LCAxKSkKKyAgICAgICAgICAgICAgICAuc2V0S2V5KGtleSkKKyAgICAgICAgICAgICAgICAuc2V0VXJpKHVyaSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgUGVyc29uIHBhcnRpY2lwYW50ID0gbmV3IFBlcnNvbi5CdWlsZGVyKCkuc2V0TmFtZSgic2VuZGVyIikuYnVpbGQoKTsKKyAgICAgICAgTm90aWZpY2F0aW9uLk1lc3NhZ2luZ1N0eWxlIG1lc3NhZ2luZ1N0eWxlID0gbmV3IE5vdGlmaWNhdGlvbi5NZXNzYWdpbmdTdHlsZSh1c2VyKQorICAgICAgICAgICAgICAgIC5hZGRNZXNzYWdlKCJ0ZXh0IiwgMCwgcGFydGljaXBhbnQpCisgICAgICAgICAgICAgICAgLmFkZE1lc3NhZ2UobmV3IE1lc3NhZ2UoInRleHQgMiIsIDAsIHBhcnRpY2lwYW50KSk7CisgICAgICAgIG1Ob3RpZmljYXRpb24gPSBuZXcgTm90aWZpY2F0aW9uLkJ1aWxkZXIobUNvbnRleHQsIENIQU5ORUwuZ2V0SWQoKSkKKyAgICAgICAgICAgICAgICAuc2V0U21hbGxJY29uKDEpCisgICAgICAgICAgICAgICAgLnNldFN0eWxlKG1lc3NhZ2luZ1N0eWxlKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworCisgICAgICAgIFBlcnNvbiByZXN0b3JlZFBlcnNvbiA9IG1Ob3RpZmljYXRpb24uZXh0cmFzLmdldFBhcmNlbGFibGUoCisgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uLkVYVFJBX01FU1NBR0lOR19QRVJTT04pOworICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3RvcmVkUGVyc29uKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXN0b3JlZFBlcnNvbi5nZXRJY29uKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobmFtZSwgcmVzdG9yZWRQZXJzb24uZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGtleSwgcmVzdG9yZWRQZXJzb24uZ2V0S2V5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHModXJpLCByZXN0b3JlZFBlcnNvbi5nZXRVcmkoKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwobU5vdGlmaWNhdGlvbi5leHRyYXMuZ2V0UGFyY2VsYWJsZUFycmF5KE5vdGlmaWNhdGlvbi5FWFRSQV9NRVNTQUdFUykpOworICAgIH0KKworCiAgICAgcHVibGljIHZvaWQgdGVzdE1lc3NhZ2luZ1N0eWxlX2hpc3RvcmljTWVzc2FnZXMoKSB7CiAgICAgICAgIG1Ob3RpZmljYXRpb24gPSBuZXcgTm90aWZpY2F0aW9uLkJ1aWxkZXIobUNvbnRleHQsIENIQU5ORUwuZ2V0SWQoKSkKICAgICAgICAgICAgICAgICAuc2V0U21hbGxJY29uKDEpCkBAIC0yNTUsNiArMzQ4LDg4IEBACiAgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbi5leHRyYXMuZ2V0UGFyY2VsYWJsZUFycmF5KE5vdGlmaWNhdGlvbi5FWFRSQV9ISVNUT1JJQ19NRVNTQUdFUykpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHRlc3RNZXNzYWdpbmdTdHlsZV9pc0dyb3VwQ29udmVyc2F0aW9uKCkgeworICAgICAgICBtQ29udGV4dC5nZXRBcHBsaWNhdGlvbkluZm8oKS50YXJnZXRTZGtWZXJzaW9uID0gQnVpbGQuVkVSU0lPTl9DT0RFUy5QOworICAgICAgICBOb3RpZmljYXRpb24uTWVzc2FnaW5nU3R5bGUgbWVzc2FnaW5nU3R5bGUgPSBuZXcgTm90aWZpY2F0aW9uLk1lc3NhZ2luZ1N0eWxlKCJzZWxmIG5hbWUiKQorICAgICAgICAgICAgICAgIC5zZXRHcm91cENvbnZlcnNhdGlvbih0cnVlKQorICAgICAgICAgICAgICAgIC5zZXRDb252ZXJzYXRpb25UaXRsZSgidGVzdCBjb252ZXJzYXRpb24gdGl0bGUiKTsKKyAgICAgICAgTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiA9IG5ldyBOb3RpZmljYXRpb24uQnVpbGRlcihtQ29udGV4dCwgInRlc3QgaWQiKQorICAgICAgICAgICAgICAgIC5zZXRTbWFsbEljb24oMSkKKyAgICAgICAgICAgICAgICAuc2V0Q29udGVudFRpdGxlKCJ0ZXN0IHRpdGxlIikKKyAgICAgICAgICAgICAgICAuc2V0U3R5bGUobWVzc2FnaW5nU3R5bGUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShtZXNzYWdpbmdTdHlsZS5pc0dyb3VwQ29udmVyc2F0aW9uKCkpOworICAgICAgICBhc3NlcnRUcnVlKG5vdGlmaWNhdGlvbi5leHRyYXMuZ2V0Qm9vbGVhbihOb3RpZmljYXRpb24uRVhUUkFfSVNfR1JPVVBfQ09OVkVSU0FUSU9OKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE1lc3NhZ2luZ1N0eWxlX2lzR3JvdXBDb252ZXJzYXRpb25fbm9Db252ZXJzYXRpb25UaXRsZSgpIHsKKyAgICAgICAgbUNvbnRleHQuZ2V0QXBwbGljYXRpb25JbmZvKCkudGFyZ2V0U2RrVmVyc2lvbiA9IEJ1aWxkLlZFUlNJT05fQ09ERVMuUDsKKyAgICAgICAgTm90aWZpY2F0aW9uLk1lc3NhZ2luZ1N0eWxlIG1lc3NhZ2luZ1N0eWxlID0gbmV3IE5vdGlmaWNhdGlvbi5NZXNzYWdpbmdTdHlsZSgic2VsZiBuYW1lIikKKyAgICAgICAgICAgICAgICAuc2V0R3JvdXBDb252ZXJzYXRpb24odHJ1ZSkKKyAgICAgICAgICAgICAgICAuc2V0Q29udmVyc2F0aW9uVGl0bGUobnVsbCk7CisgICAgICAgIE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24gPSBuZXcgTm90aWZpY2F0aW9uLkJ1aWxkZXIobUNvbnRleHQsICJ0ZXN0IGlkIikKKyAgICAgICAgICAgICAgICAuc2V0U21hbGxJY29uKDEpCisgICAgICAgICAgICAgICAgLnNldENvbnRlbnRUaXRsZSgidGVzdCB0aXRsZSIpCisgICAgICAgICAgICAgICAgLnNldFN0eWxlKG1lc3NhZ2luZ1N0eWxlKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworCisgICAgICAgIGFzc2VydFRydWUobWVzc2FnaW5nU3R5bGUuaXNHcm91cENvbnZlcnNhdGlvbigpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShub3RpZmljYXRpb24uZXh0cmFzLmdldEJvb2xlYW4oTm90aWZpY2F0aW9uLkVYVFJBX0lTX0dST1VQX0NPTlZFUlNBVElPTikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RNZXNzYWdpbmdTdHlsZV9pc0dyb3VwQ29udmVyc2F0aW9uX3dpdGhDb252ZXJzYXRpb25UaXRsZV9sZWdhY3koKSB7CisgICAgICAgIC8vIEluIGxlZ2FjeSAodmVyc2lvbiA8IFApLCBpc0dyb3VwQ29udmVyc2F0aW9uIGlzIGNvbnRyb2xsZWQgYnkgY29udmVyc2F0aW9uVGl0bGUuCisgICAgICAgIG1Db250ZXh0LmdldEFwcGxpY2F0aW9uSW5mbygpLnRhcmdldFNka1ZlcnNpb24gPSBCdWlsZC5WRVJTSU9OX0NPREVTLk87CisgICAgICAgIE5vdGlmaWNhdGlvbi5NZXNzYWdpbmdTdHlsZSBtZXNzYWdpbmdTdHlsZSA9IG5ldyBOb3RpZmljYXRpb24uTWVzc2FnaW5nU3R5bGUoInNlbGYgbmFtZSIpCisgICAgICAgICAgICAgICAgLnNldEdyb3VwQ29udmVyc2F0aW9uKGZhbHNlKQorICAgICAgICAgICAgICAgIC5zZXRDb252ZXJzYXRpb25UaXRsZSgidGVzdCBjb252ZXJzYXRpb24gdGl0bGUiKTsKKyAgICAgICAgTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiA9IG5ldyBOb3RpZmljYXRpb24uQnVpbGRlcihtQ29udGV4dCwgInRlc3QgaWQiKQorICAgICAgICAgICAgICAgIC5zZXRTbWFsbEljb24oMSkKKyAgICAgICAgICAgICAgICAuc2V0Q29udGVudFRpdGxlKCJ0ZXN0IHRpdGxlIikKKyAgICAgICAgICAgICAgICAuc2V0U3R5bGUobWVzc2FnaW5nU3R5bGUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShtZXNzYWdpbmdTdHlsZS5pc0dyb3VwQ29udmVyc2F0aW9uKCkpOworICAgICAgICBhc3NlcnRGYWxzZShub3RpZmljYXRpb24uZXh0cmFzLmdldEJvb2xlYW4oTm90aWZpY2F0aW9uLkVYVFJBX0lTX0dST1VQX0NPTlZFUlNBVElPTikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RNZXNzYWdpbmdTdHlsZV9pc0dyb3VwQ29udmVyc2F0aW9uX3dpdGhvdXRDb252ZXJzYXRpb25UaXRsZV9sZWdhY3koKSB7CisgICAgICAgIC8vIEluIGxlZ2FjeSAodmVyc2lvbiA8IFApLCBpc0dyb3VwQ29udmVyc2F0aW9uIGlzIGNvbnRyb2xsZWQgYnkgY29udmVyc2F0aW9uVGl0bGUuCisgICAgICAgIG1Db250ZXh0LmdldEFwcGxpY2F0aW9uSW5mbygpLnRhcmdldFNka1ZlcnNpb24gPSBCdWlsZC5WRVJTSU9OX0NPREVTLk87CisgICAgICAgIE5vdGlmaWNhdGlvbi5NZXNzYWdpbmdTdHlsZSBtZXNzYWdpbmdTdHlsZSA9IG5ldyBOb3RpZmljYXRpb24uTWVzc2FnaW5nU3R5bGUoInNlbGYgbmFtZSIpCisgICAgICAgICAgICAgICAgLnNldEdyb3VwQ29udmVyc2F0aW9uKHRydWUpCisgICAgICAgICAgICAgICAgLnNldENvbnZlcnNhdGlvblRpdGxlKG51bGwpOworICAgICAgICBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uID0gbmV3IE5vdGlmaWNhdGlvbi5CdWlsZGVyKG1Db250ZXh0LCAidGVzdCBpZCIpCisgICAgICAgICAgICAgICAgLnNldFNtYWxsSWNvbigxKQorICAgICAgICAgICAgICAgIC5zZXRDb250ZW50VGl0bGUoInRlc3QgdGl0bGUiKQorICAgICAgICAgICAgICAgIC5zZXRTdHlsZShtZXNzYWdpbmdTdHlsZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgICAgICBhc3NlcnRGYWxzZShtZXNzYWdpbmdTdHlsZS5pc0dyb3VwQ29udmVyc2F0aW9uKCkpOworICAgICAgICBhc3NlcnRUcnVlKG5vdGlmaWNhdGlvbi5leHRyYXMuZ2V0Qm9vbGVhbihOb3RpZmljYXRpb24uRVhUUkFfSVNfR1JPVVBfQ09OVkVSU0FUSU9OKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE1lc3NhZ2luZ1N0eWxlX2dldFVzZXIoKSB7CisgICAgICAgIFBlcnNvbiB1c2VyID0gbmV3IFBlcnNvbi5CdWlsZGVyKCkuc2V0TmFtZSgiVGVzdCBuYW1lIikuYnVpbGQoKTsKKworICAgICAgICBNZXNzYWdpbmdTdHlsZSBtZXNzYWdpbmdTdHlsZSA9IG5ldyBNZXNzYWdpbmdTdHlsZSh1c2VyKTsKKworICAgICAgICBhc3NlcnRFcXVhbHModXNlciwgbWVzc2FnaW5nU3R5bGUuZ2V0VXNlcigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWVzc2FnZSgpIHsKKyAgICAgICAgUGVyc29uIHNlbmRlciA9IG5ldyBQZXJzb24uQnVpbGRlcigpLnNldE5hbWUoIlRlc3QgbmFtZSIpLmJ1aWxkKCk7CisgICAgICAgIFN0cmluZyB0ZXh0ID0gIlRlc3QgbWVzc2FnZSI7CisgICAgICAgIGxvbmcgdGltZXN0YW1wID0gNDAwOworCisgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBNZXNzYWdlKHRleHQsIHRpbWVzdGFtcCwgc2VuZGVyKTsKKworICAgICAgICBhc3NlcnRFcXVhbHModGV4dCwgbWVzc2FnZS5nZXRUZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHModGltZXN0YW1wLCBtZXNzYWdlLmdldFRpbWVzdGFtcCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHNlbmRlciwgbWVzc2FnZS5nZXRTZW5kZXJQZXJzb24oKSk7CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewogICAgICAgICBtTm90aWZpY2F0aW9uID0gbmV3IE5vdGlmaWNhdGlvbigpOwogICAgICAgICBhc3NlcnROb3ROdWxsKG1Ob3RpZmljYXRpb24udG9TdHJpbmcoKSk7CkBAIC0yOTcsNiArNDcyLDU2IEBACiAgICAgICAgIGFzc2VydFRydWUoYS5nZXREYXRhT25seVJlbW90ZUlucHV0cygpWzBdLmlzRGF0YU9ubHkoKSk7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgdGVzdEFjdGlvbl9idWlsZGVyX2hhc0RlZmF1bHQoKSB7CisgICAgICAgIE5vdGlmaWNhdGlvbi5BY3Rpb24gYWN0aW9uID0gbWFrZU5vdGlmaWNhdGlvbkFjdGlvbihudWxsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE5vdGlmaWNhdGlvbi5BY3Rpb24uU0VNQU5USUNfQUNUSU9OX05PTkUsIGFjdGlvbi5nZXRTZW1hbnRpY0FjdGlvbigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWN0aW9uX2J1aWxkZXJfc2V0U2VtYW50aWNBY3Rpb24oKSB7CisgICAgICAgIE5vdGlmaWNhdGlvbi5BY3Rpb24gYWN0aW9uID0gbWFrZU5vdGlmaWNhdGlvbkFjdGlvbigKKyAgICAgICAgICAgICAgICBidWlsZGVyIC0+IGJ1aWxkZXIuc2V0U2VtYW50aWNBY3Rpb24oTm90aWZpY2F0aW9uLkFjdGlvbi5TRU1BTlRJQ19BQ1RJT05fUkVQTFkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE5vdGlmaWNhdGlvbi5BY3Rpb24uU0VNQU5USUNfQUNUSU9OX1JFUExZLCBhY3Rpb24uZ2V0U2VtYW50aWNBY3Rpb24oKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFjdGlvbl9wYXJjZWwoKSB7CisgICAgICAgIE5vdGlmaWNhdGlvbi5BY3Rpb24gYWN0aW9uID0gd3JpdGVBbmRSZWFkUGFyY2VsYWJsZSgKKyAgICAgICAgICAgICAgICBtYWtlTm90aWZpY2F0aW9uQWN0aW9uKGJ1aWxkZXIgLT4geworICAgICAgICAgICAgICAgICAgICBidWlsZGVyLnNldFNlbWFudGljQWN0aW9uKE5vdGlmaWNhdGlvbi5BY3Rpb24uU0VNQU5USUNfQUNUSU9OX0FSQ0hJVkUpOworICAgICAgICAgICAgICAgICAgICBidWlsZGVyLnNldEFsbG93R2VuZXJhdGVkUmVwbGllcyh0cnVlKTsKKyAgICAgICAgICAgICAgICB9KSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE5vdGlmaWNhdGlvbi5BY3Rpb24uU0VNQU5USUNfQUNUSU9OX0FSQ0hJVkUsIGFjdGlvbi5nZXRTZW1hbnRpY0FjdGlvbigpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShhY3Rpb24uZ2V0QWxsb3dHZW5lcmF0ZWRSZXBsaWVzKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBY3Rpb25fY2xvbmUoKSB7CisgICAgICAgIE5vdGlmaWNhdGlvbi5BY3Rpb24gYWN0aW9uID0gbWFrZU5vdGlmaWNhdGlvbkFjdGlvbigKKyAgICAgICAgICAgICAgICBidWlsZGVyIC0+IGJ1aWxkZXIuc2V0U2VtYW50aWNBY3Rpb24oTm90aWZpY2F0aW9uLkFjdGlvbi5TRU1BTlRJQ19BQ1RJT05fREVMRVRFKSk7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24uQWN0aW9uLlNFTUFOVElDX0FDVElPTl9ERUxFVEUsCisgICAgICAgICAgICAgICAgYWN0aW9uLmNsb25lKCkuZ2V0U2VtYW50aWNBY3Rpb24oKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEJ1aWxkU3RyaWN0TW9kZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmljdE1vZGUuc2V0VGhyZWFkUG9saWN5KAorICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaWN0TW9kZS5UaHJlYWRQb2xpY3kuQnVpbGRlcigpLmRldGVjdEFsbCgpLnBlbmFsdHlEZWF0aCgpLmJ1aWxkKCkpOworICAgICAgICAgICAgTm90aWZpY2F0aW9uLkFjdGlvbiBhID0gbmV3QWN0aW9uQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgIC5hZGRSZW1vdGVJbnB1dChuZXdEYXRhT25seVJlbW90ZUlucHV0KCkpCisgICAgICAgICAgICAgICAgICAgIC5hZGRSZW1vdGVJbnB1dChuZXdUZXh0UmVtb3RlSW5wdXQoKSkKKyAgICAgICAgICAgICAgICAgICAgLmFkZFJlbW90ZUlucHV0KG5ld1RleHRBbmREYXRhUmVtb3RlSW5wdXQoKSkKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgICAgICBOb3RpZmljYXRpb24uQnVpbGRlciBiID0gbmV3IE5vdGlmaWNhdGlvbi5CdWlsZGVyKG1Db250ZXh0LCAiaWQiKQorICAgICAgICAgICAgICAgICAgICAuc2V0U3R5bGUobmV3IE5vdGlmaWNhdGlvbi5CaWdUZXh0U3R5bGUoKS5zZXRCaWdDb250ZW50VGl0bGUoIkJpZyBjb250ZW50IikpCisgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50VGl0bGUoInRpdGxlIikKKyAgICAgICAgICAgICAgICAgICAgLnNldEFjdGlvbnMoYSk7CisKKyAgICAgICAgICAgIGIuYnVpbGQoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIFN0cmljdE1vZGUuc2V0VGhyZWFkUG9saWN5KG5ldyBTdHJpY3RNb2RlLlRocmVhZFBvbGljeS5CdWlsZGVyKCkucGVybWl0QWxsKCkuYnVpbGQoKSk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwcml2YXRlIHN0YXRpYyBSZW1vdGVJbnB1dCBuZXdEYXRhT25seVJlbW90ZUlucHV0KCkgewogICAgICAgICByZXR1cm4gbmV3IFJlbW90ZUlucHV0LkJ1aWxkZXIoREFUQV9SRVNVTFRfS0VZKQogICAgICAgICAgICAgLnNldEFsbG93RnJlZUZvcm1JbnB1dChmYWxzZSkKQEAgLTMyMyw0ICs1NDgsMjkgQEAKICAgICBwcml2YXRlIHN0YXRpYyBOb3RpZmljYXRpb24uQWN0aW9uLkJ1aWxkZXIgbmV3QWN0aW9uQnVpbGRlcigpIHsKICAgICAgICAgcmV0dXJuIG5ldyBOb3RpZmljYXRpb24uQWN0aW9uLkJ1aWxkZXIoMCwgInRpdGxlIiwgbnVsbCk7CiAgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIGFuIGFyYml0cmFyeSB7QGxpbmsgUGFyY2VsYWJsZX0gaW50byBhIHtAbGluayBQYXJjZWx9IHVzaW5nIGl0cyB3cml0ZVRvUGFyY2VsCisgICAgICogbWV0aG9kIGJlZm9yZSByZWFkaW5nIGl0IG91dCBhZ2FpbiB0byBjaGVjayB0aGF0IGl0IHdhcyBzZW50IHByb3Blcmx5LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIDxUIGV4dGVuZHMgUGFyY2VsYWJsZT4gVCB3cml0ZUFuZFJlYWRQYXJjZWxhYmxlKFQgb3JpZ2luYWwpIHsKKyAgICAgICAgUGFyY2VsIHAgPSBQYXJjZWwub2J0YWluKCk7CisgICAgICAgIHAud3JpdGVQYXJjZWxhYmxlKG9yaWdpbmFsLCAvKiBmbGFncyAqLyAwKTsKKyAgICAgICAgcC5zZXREYXRhUG9zaXRpb24oMCk7CisgICAgICAgIHJldHVybiBwLnJlYWRQYXJjZWxhYmxlKC8qIGNsYXNzTG9hZGVyICovIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBOb3RpZmljYXRpb24uQWN0aW9uIGJ5IG1vY2tpbmcgaW5pdGlhbCBkZXBlbmRlbmNpZXMgYW5kIHRoZW4gYXBwbHlpbmcKKyAgICAgKiB0cmFuc2Zvcm1hdGlvbnMgaWYgdGhleSdyZSBkZWZpbmVkLgorICAgICAqLworICAgIHByaXZhdGUgTm90aWZpY2F0aW9uLkFjdGlvbiBtYWtlTm90aWZpY2F0aW9uQWN0aW9uKAorICAgICAgICAgICAgQE51bGxhYmxlIENvbnN1bWVyPEJ1aWxkZXI+IHRyYW5zZm9ybWF0aW9uKSB7CisgICAgICAgIE5vdGlmaWNhdGlvbi5BY3Rpb24uQnVpbGRlciBhY3Rpb25CdWlsZGVyID0KKyAgICAgICAgICAgIG5ldyBOb3RpZmljYXRpb24uQWN0aW9uLkJ1aWxkZXIobnVsbCwgIlRlc3QgVGl0bGUiLCBudWxsKTsKKyAgICAgICAgaWYgKHRyYW5zZm9ybWF0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyYW5zZm9ybWF0aW9uLmFjY2VwdChhY3Rpb25CdWlsZGVyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYWN0aW9uQnVpbGRlci5idWlsZCgpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL1BlcnNvblRlc3QuamF2YSBiL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL1BlcnNvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjA3ZTk5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYXBwL3NyYy9hbmRyb2lkL2FwcC9jdHMvUGVyc29uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYXBwLmN0czsKKworaW1wb3J0IGFuZHJvaWQuYXBwLlBlcnNvbjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5zdHVicy5SOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuSWNvbjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIFBlcnNvblRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENoYXJTZXF1ZW5jZSBURVNUX05BTUUgPSAiVGVzdCBOYW1lIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9VUkkgPSBVcmkuZnJvbVBhcnRzKCJhIiwgImIiLCAiYyIpLnRvU3RyaW5nKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfS0VZID0gInRlc3Qga2V5IjsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RQZXJzb25fYnVpbGRlcigpIHsKKyAgICAgICAgSWNvbiB0ZXN0SWNvbiA9IGNyZWF0ZUljb24oKTsKKyAgICAgICAgUGVyc29uIHBlcnNvbiA9CisgICAgICAgICAgICBuZXcgUGVyc29uLkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXROYW1lKFRFU1RfTkFNRSkKKyAgICAgICAgICAgICAgICAuc2V0SWNvbih0ZXN0SWNvbikKKyAgICAgICAgICAgICAgICAuc2V0VXJpKFRFU1RfVVJJKQorICAgICAgICAgICAgICAgIC5zZXRLZXkoVEVTVF9LRVkpCisgICAgICAgICAgICAgICAgLnNldEJvdCh0cnVlKQorICAgICAgICAgICAgICAgIC5zZXRJbXBvcnRhbnQodHJ1ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoVEVTVF9OQU1FLCBwZXJzb24uZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3RJY29uLCBwZXJzb24uZ2V0SWNvbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFRFU1RfVVJJLCBwZXJzb24uZ2V0VXJpKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoVEVTVF9LRVksIHBlcnNvbi5nZXRLZXkoKSk7CisgICAgICAgIGFzc2VydFRydWUocGVyc29uLmlzQm90KCkpOworICAgICAgICBhc3NlcnRUcnVlKHBlcnNvbi5pc0ltcG9ydGFudCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGVyc29uX2J1aWxkZXJfZGVmYXVsdHMoKSB7CisgICAgICAgIFBlcnNvbiBwZXJzb24gPSBuZXcgUGVyc29uLkJ1aWxkZXIoKS5idWlsZCgpOworICAgICAgICBhc3NlcnRGYWxzZShwZXJzb24uaXNCb3QoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHBlcnNvbi5pc0ltcG9ydGFudCgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChwZXJzb24uZ2V0SWNvbigpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChwZXJzb24uZ2V0S2V5KCkpOworICAgICAgICBhc3NlcnROdWxsKHBlcnNvbi5nZXROYW1lKCkpOworICAgICAgICBhc3NlcnROdWxsKHBlcnNvbi5nZXRVcmkoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFRvQnVpbGRlcigpIHsKKyAgICAgICAgSWNvbiB0ZXN0SWNvbiA9IGNyZWF0ZUljb24oKTsKKyAgICAgICAgUGVyc29uIG9yaWdpbmFsID0KKyAgICAgICAgICAgIG5ldyBQZXJzb24uQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldE5hbWUoVEVTVF9OQU1FKQorICAgICAgICAgICAgICAgIC5zZXRJY29uKHRlc3RJY29uKQorICAgICAgICAgICAgICAgIC5zZXRVcmkoVEVTVF9VUkkpCisgICAgICAgICAgICAgICAgLnNldEtleShURVNUX0tFWSkKKyAgICAgICAgICAgICAgICAuc2V0Qm90KHRydWUpCisgICAgICAgICAgICAgICAgLnNldEltcG9ydGFudCh0cnVlKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICBQZXJzb24gcmVzdWx0ID0gb3JpZ2luYWwudG9CdWlsZGVyKCkuYnVpbGQoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoVEVTVF9OQU1FLCByZXN1bHQuZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3RJY29uLCByZXN1bHQuZ2V0SWNvbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFRFU1RfVVJJLCByZXN1bHQuZ2V0VXJpKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoVEVTVF9LRVksIHJlc3VsdC5nZXRLZXkoKSk7CisgICAgICAgIGFzc2VydFRydWUocmVzdWx0LmlzQm90KCkpOworICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5pc0ltcG9ydGFudCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGVyc29uX3BhcmNlbGFibGUoKSB7CisgICAgICAgIFBlcnNvbiBwZXJzb24gPSBuZXcgUGVyc29uLkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRCb3QodHJ1ZSkKKyAgICAgICAgICAgICAgICAuc2V0SW1wb3J0YW50KHRydWUpCisgICAgICAgICAgICAgICAgLnNldEljb24oY3JlYXRlSWNvbigpKQorICAgICAgICAgICAgICAgIC5zZXRLZXkoImtleSIpCisgICAgICAgICAgICAgICAgLnNldE5hbWUoIk5hbWUiKQorICAgICAgICAgICAgICAgIC5zZXRVcmkoVXJpLmZyb21QYXJ0cygiYSIsICJiIiwgImMiKS50b1N0cmluZygpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworCisgICAgICAgIFBhcmNlbCBwYXJjZWwgPSBQYXJjZWwub2J0YWluKCk7CisgICAgICAgIHBlcnNvbi53cml0ZVRvUGFyY2VsKHBhcmNlbCwgMCk7CisgICAgICAgIHBhcmNlbC5zZXREYXRhUG9zaXRpb24oMCk7CisgICAgICAgIFBlcnNvbiByZXN1bHQgPSBQZXJzb24uQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKHBhcmNlbCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHBlcnNvbi5pc0JvdCgpLCByZXN1bHQuaXNCb3QoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhwZXJzb24uaXNJbXBvcnRhbnQoKSwgcmVzdWx0LmlzSW1wb3J0YW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMocGVyc29uLmdldEljb24oKS5nZXRSZXNJZCgpLCByZXN1bHQuZ2V0SWNvbigpLmdldFJlc0lkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMocGVyc29uLmdldEtleSgpLCByZXN1bHQuZ2V0S2V5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMocGVyc29uLmdldE5hbWUoKSwgcmVzdWx0LmdldE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhwZXJzb24uZ2V0VXJpKCksIHJlc3VsdC5nZXRVcmkoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICAgIFBlcnNvbiBwZXJzb24gPSBuZXcgUGVyc29uLkJ1aWxkZXIoKS5idWlsZCgpOworCisgICAgICAgIC8vIFBlcnNvbiBoYXMgbm8gc3BlY2lhbCBvYmplY3RzLCBzbyBhbHdheXMgcmV0dXJuIDAgZm9yIGRlc2NyaWJpbmcgcGFyY2VsYWJsZSBjb250ZW50cworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcGVyc29uLmRlc2NyaWJlQ29udGVudHMoKSk7CisgICAgfQorCisgICAgLyoqIENyZWF0ZXMgYW5kIHJldHVybnMgYW4ge0BsaW5rIEljb259IGZvciB0ZXN0aW5nLiAqLworICAgIHByaXZhdGUgSWNvbiBjcmVhdGVJY29uKCkgeworICAgICAgICByZXR1cm4gSWNvbi5jcmVhdGVXaXRoUmVzb3VyY2UoZ2V0Q29udGV4dCgpLCBSLmRyYXdhYmxlLmljb25fYmx1ZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYXBwL3NyYy9hbmRyb2lkL2FwcC9jdHMvUGlwQWN0aXZpdHlUZXN0LmphdmEgYi90ZXN0cy9hcHAvc3JjL2FuZHJvaWQvYXBwL2N0cy9QaXBBY3Rpdml0eVRlc3QuamF2YQppbmRleCA3ZjBlMjNlLi4yMTRkZTU5IDEwMDY0NAotLS0gYS90ZXN0cy9hcHAvc3JjL2FuZHJvaWQvYXBwL2N0cy9QaXBBY3Rpdml0eVRlc3QuamF2YQorKysgYi90ZXN0cy9hcHAvc3JjL2FuZHJvaWQvYXBwL2N0cy9QaXBBY3Rpdml0eVRlc3QuamF2YQpAQCAtMjEsOCArMjEsNiBAQAogaW1wb3J0IGFuZHJvaWQuYXBwLnN0dWJzLlBpcEFjdGl2aXR5OwogaW1wb3J0IGFuZHJvaWQudGVzdC5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ2RkVGVzdDsKLQogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9QSUNUVVJFX0lOX1BJQ1RVUkU7CiAKIHB1YmxpYyBjbGFzcyBQaXBBY3Rpdml0eVRlc3QgZXh0ZW5kcyBBY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjxQaXBBY3Rpdml0eT4gewpAQCAtNDEsNyArMzksNiBAQAogICAgICAgICBtQWN0aXZpdHkgPSBnZXRBY3Rpdml0eSgpOwogICAgIH0KIAotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSIzLjguMTQvQy0zLTEiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RMYXVuY2hQaXBBY3Rpdml0eSgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBydW5UZXN0T25VaVRocmVhZChuZXcgUnVubmFibGUoKSB7CiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CkBAIC02MCwxNCArNTcsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBib29sZWFuIHBpcFN1cHBvcnREaXNhYmxlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgcGlwU3VwcG9ydERpc2FibGVkID0gIW1BY3Rpdml0eS5lbnRlclBpY3R1cmVJblBpY3R1cmVNb2RlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUGljdHVyZUluUGljdHVyZVBhcmFtcy5CdWlsZGVyKCkuYnVpbGQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwaXBTdXBwb3J0RGlzYWJsZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUocGlwU3VwcG9ydERpc2FibGVkKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSghbUFjdGl2aXR5LmVudGVyUGljdHVyZUluUGljdHVyZU1vZGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFBpY3R1cmVJblBpY3R1cmVQYXJhbXMuQnVpbGRlcigpLmJ1aWxkKCkpKTsKIAogICAgICAgICAgICAgICAgICAgICAvLyBFbnRlcmluZyBQSVAgbW9kZSBpcyBub3Qgc3luY2hyb25vdXMsIHNvIHdhaXRpbmcgZm9yIGNvbXBsZXRpb24gb2YgYWxsIHdvcmsKICAgICAgICAgICAgICAgICAgICAgLy8gb24gVUkgdGhyZWFkLgpkaWZmIC0tZ2l0IGEvdGVzdHMvYXBwL3NyYy9hbmRyb2lkL2FwcC9jdHMvUmVtb3RlSW5wdXRUZXN0LmphdmEgYi90ZXN0cy9hcHAvc3JjL2FuZHJvaWQvYXBwL2N0cy9SZW1vdGVJbnB1dFRlc3QuamF2YQppbmRleCBmNTMyMjZiLi5iOGUwZmNlIDEwMDY0NAotLS0gYS90ZXN0cy9hcHAvc3JjL2FuZHJvaWQvYXBwL2N0cy9SZW1vdGVJbnB1dFRlc3QuamF2YQorKysgYi90ZXN0cy9hcHAvc3JjL2FuZHJvaWQvYXBwL2N0cy9SZW1vdGVJbnB1dFRlc3QuamF2YQpAQCAtMTAyLDIxICsxMDIsMTIgQEAKICAgICAgICAgICAgIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBDaGFyU2VxdWVuY2UgY2hhclNlcXVlbmNlID0gInZhbHVlIGRvZXNuJ3QgbWF0dGVyIjsKICAgICAgICAgVXJpIHVyaSA9IFVyaS5wYXJzZSgiU29tZSBVcmkiKTsKLSAgICAgICAgUmVtb3RlSW5wdXQgaW5wdXQgPQotICAgICAgICAgICAgICAgIG5ldyBSZW1vdGVJbnB1dC5CdWlsZGVyKFJFU1VMVF9LRVkpCi0gICAgICAgICAgICAgICAgLnNldEFsbG93RGF0YVR5cGUoTUlNRV9UWVBFLCB0cnVlKQotICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICBSZW1vdGVJbnB1dCBpbnB1dCA9IG5ld1RleHRBbmREYXRhUmVtb3RlSW5wdXQoKTsKICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoKTsKIAotICAgICAgICBNYXA8U3RyaW5nLCBVcmk+IGRhdGFSZXN1bHRzID0gbmV3IEhhc2hNYXA8PigpOwotICAgICAgICBkYXRhUmVzdWx0cy5wdXQoTUlNRV9UWVBFLCB1cmkpOwotICAgICAgICBSZW1vdGVJbnB1dC5hZGREYXRhUmVzdWx0VG9JbnRlbnQoaW5wdXQsIGludGVudCwgZGF0YVJlc3VsdHMpOwotCi0gICAgICAgIEJ1bmRsZSB0ZXh0UmVzdWx0cyA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgdGV4dFJlc3VsdHMucHV0Q2hhclNlcXVlbmNlKGlucHV0LmdldFJlc3VsdEtleSgpLCBjaGFyU2VxdWVuY2UpOwotICAgICAgICBSZW1vdGVJbnB1dFtdIGFyciA9IG5ldyBSZW1vdGVJbnB1dFsxXTsKLSAgICAgICAgYXJyWzBdID0gaW5wdXQ7Ci0gICAgICAgIFJlbW90ZUlucHV0LmFkZFJlc3VsdHNUb0ludGVudChhcnIsIGludGVudCwgdGV4dFJlc3VsdHMpOworICAgICAgICBhZGREYXRhUmVzdWx0c1RvSW50ZW50KGlucHV0LCBpbnRlbnQsIHVyaSk7CisgICAgICAgIGFkZFRleHRSZXN1bHRzVG9JbnRlbnQoaW5wdXQsIGludGVudCwgY2hhclNlcXVlbmNlKTsKKyAgICAgICAgUmVtb3RlSW5wdXQuc2V0UmVzdWx0c1NvdXJjZShpbnRlbnQsIFJlbW90ZUlucHV0LlNPVVJDRV9GUkVFX0ZPUk1fSU5QVVQpOwogCiAgICAgICAgIHZlcmlmeUludGVudEhhc1RleHRSZXN1bHRzKGludGVudCwgY2hhclNlcXVlbmNlKTsKICAgICAgICAgdmVyaWZ5SW50ZW50SGFzRGF0YVJlc3VsdHMoaW50ZW50LCB1cmkpOwpAQCAtMTI2LDI0ICsxMTcsNjkgQEAKICAgICAgICAgICAgIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBDaGFyU2VxdWVuY2UgY2hhclNlcXVlbmNlID0gInZhbHVlIGRvZXNuJ3QgbWF0dGVyIjsKICAgICAgICAgVXJpIHVyaSA9IFVyaS5wYXJzZSgiU29tZSBVcmkiKTsKLSAgICAgICAgUmVtb3RlSW5wdXQgaW5wdXQgPQotICAgICAgICAgICAgICAgIG5ldyBSZW1vdGVJbnB1dC5CdWlsZGVyKFJFU1VMVF9LRVkpCi0gICAgICAgICAgICAgICAgLnNldEFsbG93RGF0YVR5cGUoTUlNRV9UWVBFLCB0cnVlKQotICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICBSZW1vdGVJbnB1dCBpbnB1dCA9IG5ld1RleHRBbmREYXRhUmVtb3RlSW5wdXQoKTsKICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoKTsKIAorICAgICAgICBhZGRUZXh0UmVzdWx0c1RvSW50ZW50KGlucHV0LCBpbnRlbnQsIGNoYXJTZXF1ZW5jZSk7CisgICAgICAgIGFkZERhdGFSZXN1bHRzVG9JbnRlbnQoaW5wdXQsIGludGVudCwgdXJpKTsKKyAgICAgICAgUmVtb3RlSW5wdXQuc2V0UmVzdWx0c1NvdXJjZShpbnRlbnQsIFJlbW90ZUlucHV0LlNPVVJDRV9DSE9JQ0UpOworCisgICAgICAgIHZlcmlmeUludGVudEhhc1RleHRSZXN1bHRzKGludGVudCwgY2hhclNlcXVlbmNlKTsKKyAgICAgICAgdmVyaWZ5SW50ZW50SGFzRGF0YVJlc3VsdHMoaW50ZW50LCB1cmkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRSZXN1bHRzU291cmNlX2VtcHR5SW50ZW50KCkgeworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOworCisgICAgICAgIGFzc2VydEVxdWFscyhSZW1vdGVJbnB1dC5TT1VSQ0VfRlJFRV9GT1JNX0lOUFVULCBSZW1vdGVJbnB1dC5nZXRSZXN1bHRzU291cmNlKGludGVudCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRSZXN1bHRzU291cmNlX2FkZERhdGFBbmRUZXh0UmVzdWx0cygpIHsKKyAgICAgICAgQ2hhclNlcXVlbmNlIGNoYXJTZXF1ZW5jZSA9ICJ2YWx1ZSBkb2Vzbid0IG1hdHRlciI7CisgICAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2UoIlNvbWUgVXJpIik7CisgICAgICAgIFJlbW90ZUlucHV0IGlucHV0ID0gbmV3VGV4dEFuZERhdGFSZW1vdGVJbnB1dCgpOworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOworCisgICAgICAgIGFkZFRleHRSZXN1bHRzVG9JbnRlbnQoaW5wdXQsIGludGVudCwgY2hhclNlcXVlbmNlKTsKKyAgICAgICAgYWRkRGF0YVJlc3VsdHNUb0ludGVudChpbnB1dCwgaW50ZW50LCB1cmkpOworCisgICAgICAgIGFzc2VydEVxdWFscyhSZW1vdGVJbnB1dC5TT1VSQ0VfRlJFRV9GT1JNX0lOUFVULCBSZW1vdGVJbnB1dC5nZXRSZXN1bHRzU291cmNlKGludGVudCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRSZXN1bHRzU291cmNlX3NldFNvdXJjZSgpIHsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoKTsKKworICAgICAgICBSZW1vdGVJbnB1dC5zZXRSZXN1bHRzU291cmNlKGludGVudCwgUmVtb3RlSW5wdXQuU09VUkNFX0NIT0lDRSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJlbW90ZUlucHV0LlNPVVJDRV9DSE9JQ0UsIFJlbW90ZUlucHV0LmdldFJlc3VsdHNTb3VyY2UoaW50ZW50KSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldFJlc3VsdHNTb3VyY2Vfc2V0U291cmNlQW5kQWRkRGF0YUFuZFRleHRSZXN1bHRzKCkgeworICAgICAgICBDaGFyU2VxdWVuY2UgY2hhclNlcXVlbmNlID0gInZhbHVlIGRvZXNuJ3QgbWF0dGVyIjsKKyAgICAgICAgVXJpIHVyaSA9IFVyaS5wYXJzZSgiU29tZSBVcmkiKTsKKyAgICAgICAgUmVtb3RlSW5wdXQgaW5wdXQgPSBuZXdUZXh0QW5kRGF0YVJlbW90ZUlucHV0KCk7CisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KCk7CisKKyAgICAgICAgUmVtb3RlSW5wdXQuc2V0UmVzdWx0c1NvdXJjZShpbnRlbnQsIFJlbW90ZUlucHV0LlNPVVJDRV9DSE9JQ0UpOworICAgICAgICBhZGRUZXh0UmVzdWx0c1RvSW50ZW50KGlucHV0LCBpbnRlbnQsIGNoYXJTZXF1ZW5jZSk7CisgICAgICAgIGFkZERhdGFSZXN1bHRzVG9JbnRlbnQoaW5wdXQsIGludGVudCwgdXJpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoUmVtb3RlSW5wdXQuU09VUkNFX0NIT0lDRSwgUmVtb3RlSW5wdXQuZ2V0UmVzdWx0c1NvdXJjZShpbnRlbnQpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFRleHRSZXN1bHRzVG9JbnRlbnQoUmVtb3RlSW5wdXQgaW5wdXQsIEludGVudCBpbnRlbnQsCisgICAgICAgICAgICBDaGFyU2VxdWVuY2UgY2hhclNlcXVlbmNlKSB7CiAgICAgICAgIEJ1bmRsZSB0ZXh0UmVzdWx0cyA9IG5ldyBCdW5kbGUoKTsKICAgICAgICAgdGV4dFJlc3VsdHMucHV0Q2hhclNlcXVlbmNlKGlucHV0LmdldFJlc3VsdEtleSgpLCBjaGFyU2VxdWVuY2UpOwogICAgICAgICBSZW1vdGVJbnB1dFtdIGFyciA9IG5ldyBSZW1vdGVJbnB1dFsxXTsKICAgICAgICAgYXJyWzBdID0gaW5wdXQ7CiAgICAgICAgIFJlbW90ZUlucHV0LmFkZFJlc3VsdHNUb0ludGVudChhcnIsIGludGVudCwgdGV4dFJlc3VsdHMpOworICAgIH0KIAorICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkRGF0YVJlc3VsdHNUb0ludGVudChSZW1vdGVJbnB1dCBpbnB1dCwgSW50ZW50IGludGVudCwgVXJpIHVyaSkgewogICAgICAgICBNYXA8U3RyaW5nLCBVcmk+IGRhdGFSZXN1bHRzID0gbmV3IEhhc2hNYXA8PigpOwogICAgICAgICBkYXRhUmVzdWx0cy5wdXQoTUlNRV9UWVBFLCB1cmkpOwogICAgICAgICBSZW1vdGVJbnB1dC5hZGREYXRhUmVzdWx0VG9JbnRlbnQoaW5wdXQsIGludGVudCwgZGF0YVJlc3VsdHMpOwotCi0gICAgICAgIHZlcmlmeUludGVudEhhc1RleHRSZXN1bHRzKGludGVudCwgY2hhclNlcXVlbmNlKTsKLSAgICAgICAgdmVyaWZ5SW50ZW50SGFzRGF0YVJlc3VsdHMoaW50ZW50LCB1cmkpOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdmVyaWZ5SW50ZW50SGFzVGV4dFJlc3VsdHMoSW50ZW50IGludGVudCwgQ2hhclNlcXVlbmNlIGV4cGVjdGVkKSB7CkBAIC0xODEsNSArMjE3LDEyIEBACiAgICAgICAgICAgICAuc2V0QWxsb3dEYXRhVHlwZShNSU1FX1RZUEUsIHRydWUpCiAgICAgICAgICAgICAuYnVpbGQoKTsKICAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBSZW1vdGVJbnB1dCBuZXdUZXh0QW5kRGF0YVJlbW90ZUlucHV0KCkgeworICAgICAgICByZXR1cm4gbmV3IFJlbW90ZUlucHV0LkJ1aWxkZXIoUkVTVUxUX0tFWSkKKyAgICAgICAgICAgIC5zZXRBbGxvd0ZyZWVGb3JtSW5wdXQodHJ1ZSkKKyAgICAgICAgICAgIC5zZXRBbGxvd0RhdGFUeXBlKE1JTUVfVFlQRSwgdHJ1ZSkKKyAgICAgICAgICAgIC5idWlsZCgpOworICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvdGVzdHMvYXBwL3NyYy9hbmRyb2lkL2FwcC9jdHMvU2VydmljZVRlc3QuamF2YSBiL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL1NlcnZpY2VUZXN0LmphdmEKaW5kZXggZmJhYzllOC4uMGI0ZjRmYiAxMDA2NDQKLS0tIGEvdGVzdHMvYXBwL3NyYy9hbmRyb2lkL2FwcC9jdHMvU2VydmljZVRlc3QuamF2YQorKysgYi90ZXN0cy9hcHAvc3JjL2FuZHJvaWQvYXBwL2N0cy9TZXJ2aWNlVGVzdC5qYXZhCkBAIC0yNiwyMCArMjYsMjMgQEAKIGltcG9ydCBhbmRyb2lkLmFwcC5zdHVicy5Mb2NhbEZvcmVncm91bmRTZXJ2aWNlOwogaW1wb3J0IGFuZHJvaWQuYXBwLnN0dWJzLkxvY2FsR3JhbnRlZFNlcnZpY2U7CiBpbXBvcnQgYW5kcm9pZC5hcHAuc3R1YnMuTG9jYWxTZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQuYXBwLnN0dWJzLk51bGxTZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQuYXBwLnN0dWJzLlI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2VydmljZUNvbm5lY3Rpb247Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CiBpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CiBpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLm5vdGlmaWNhdGlvbi5TdGF0dXNCYXJOb3RpZmljYXRpb247CiBpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLk1lZGl1bVRlc3Q7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLmFwcC5zdHVicy5SOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ2RkVGVzdDsKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLklCaW5kZXJQYXJjZWxhYmxlOwpAQCAtODcsNiArOTAsNDEgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE51bGxTZXJ2aWNlQ29ubmVjdGlvbiBpbXBsZW1lbnRzIFNlcnZpY2VDb25uZWN0aW9uIHsKKyAgICAgICAgYm9vbGVhbiBtTnVsbEJpbmRpbmcgPSBmYWxzZTsKKworICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKENvbXBvbmVudE5hbWUgbmFtZSwgSUJpbmRlciBzZXJ2aWNlKSB7fQorICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgb25TZXJ2aWNlRGlzY29ubmVjdGVkKENvbXBvbmVudE5hbWUgbmFtZSkge30KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25OdWxsQmluZGluZyhDb21wb25lbnROYW1lIG5hbWUpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgICAgIG1OdWxsQmluZGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlBbGwoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHdhaXRGb3JOdWxsQmluZGluZyhmaW5hbCBsb25nIHRpbWVvdXQpIHsKKyAgICAgICAgICAgIGxvbmcgbm93ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CisgICAgICAgICAgICBmaW5hbCBsb25nIGVuZCA9IG5vdyArIHRpbWVvdXQ7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoIW1OdWxsQmluZGluZyAmJiAobm93IDwgZW5kKSkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53YWl0KGVuZCAtIG5vdyk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBub3cgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBudWxsQmluZGluZ1JlY2VpdmVkKCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1OdWxsQmluZGluZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIHByaXZhdGUgY2xhc3MgVGVzdENvbm5lY3Rpb24gaW1wbGVtZW50cyBTZXJ2aWNlQ29ubmVjdGlvbiB7CiAgICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtRXhwZWN0RGlzY29ubmVjdDsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1TZXRSZXBvcnRlcjsKQEAgLTgzMyw0ICs4NzEsMjggQEAKICAgICAgICAgICAgIC8vIGV4cGVjdGVkCiAgICAgICAgIH0KICAgICB9CisKKyAgICAvKioKKyAgICAgKiBWZXJpZnkgdGhhdCB3aGVuIHRoZSByZXF1ZXN0ZWQgc2VydmljZSdzIG9uQmluZCgpIHJldHVybnMgbnVsbCwKKyAgICAgKiB0aGUgY29ubmVjdGlvbidzIG9uTnVsbEJpbmRpbmcoKSBtZXRob2QgaXMgaW52b2tlZC4KKyAgICAgKi8KKyAgICBATWVkaXVtVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsU2VydmljZUJpbmRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChtQ29udGV4dCwgTnVsbFNlcnZpY2UuY2xhc3MpOworICAgICAgICBpbnRlbnQuc2V0QWN0aW9uKCJ0ZXN0TnVsbFNlcnZpY2VCaW5kZXIiKTsKKyAgICAgICAgTnVsbFNlcnZpY2VDb25uZWN0aW9uIGNvbm4xID0gbmV3IE51bGxTZXJ2aWNlQ29ubmVjdGlvbigpOworICAgICAgICBOdWxsU2VydmljZUNvbm5lY3Rpb24gY29ubjIgPSBuZXcgTnVsbFNlcnZpY2VDb25uZWN0aW9uKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKG1Db250ZXh0LmJpbmRTZXJ2aWNlKGludGVudCwgY29ubjEsIENvbnRleHQuQklORF9BVVRPX0NSRUFURSkpOworICAgICAgICAgICAgY29ubjEud2FpdEZvck51bGxCaW5kaW5nKERFTEFZKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoY29ubjEubnVsbEJpbmRpbmdSZWNlaXZlZCgpKTsKKworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtQ29udGV4dC5iaW5kU2VydmljZShpbnRlbnQsIGNvbm4yLCBDb250ZXh0LkJJTkRfQVVUT19DUkVBVEUpKTsKKyAgICAgICAgICAgIGNvbm4yLndhaXRGb3JOdWxsQmluZGluZyhERUxBWSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGNvbm4yLm51bGxCaW5kaW5nUmVjZWl2ZWQoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBtQ29udGV4dC51bmJpbmRTZXJ2aWNlKGNvbm4xKTsKKyAgICAgICAgICAgIG1Db250ZXh0LnVuYmluZFNlcnZpY2UoY29ubjIpOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYXBwL3NyYy9hbmRyb2lkL2FwcC9jdHMvU3lzdGVtRmVhdHVyZXNUZXN0LmphdmEgYi90ZXN0cy9hcHAvc3JjL2FuZHJvaWQvYXBwL2N0cy9TeXN0ZW1GZWF0dXJlc1Rlc3QuamF2YQppbmRleCBmNzUzNDJkLi42ZGMxZGY3IDEwMDY0NAotLS0gYS90ZXN0cy9hcHAvc3JjL2FuZHJvaWQvYXBwL2N0cy9TeXN0ZW1GZWF0dXJlc1Rlc3QuamF2YQorKysgYi90ZXN0cy9hcHAvc3JjL2FuZHJvaWQvYXBwL2N0cy9TeXN0ZW1GZWF0dXJlc1Rlc3QuamF2YQpAQCAtMzksMTAgKzM5LDEyIEBACiBpbXBvcnQgYW5kcm9pZC5uZXQuc2lwLlNpcE1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm5mYy5OZmNBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7CiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuVGVsZXBob255TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdENhc2U7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNkZFRlc3Q7CitpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5Qcm9wZXJ0eVV0aWw7CiAKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwpAQCAtNTUsNyArNTcsNiBAQAogLyoqCiAgKiBUZXN0IGZvciBjaGVja2luZyB0aGF0IHRoZSB7QGxpbmsgUGFja2FnZU1hbmFnZXJ9IGlzIHJlcG9ydGluZyB0aGUgY29ycmVjdCBmZWF0dXJlcy4KICAqLwotQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcvQy0wLTciKQogcHVibGljIGNsYXNzIFN5c3RlbUZlYXR1cmVzVGVzdCBleHRlbmRzIEluc3RydW1lbnRhdGlvblRlc3RDYXNlIHsKIAogICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKQEAgLTEwMiw2ICsxMDMsMTEgQEAKIAogICAgICAgICBmb3IgKFN0cmluZyBmZWF0dXJlTmFtZSA6IG5vdE9mZmljaWFsRmVhdHVyZXMpIHsKICAgICAgICAgICAgIGlmIChmZWF0dXJlTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKCFCdWlsZC5WRVJTSU9OLkNPREVOQU1FLmVxdWFscygiUkVMIikgJiYKKyAgICAgICAgICAgICAgICAgICAgZmVhdHVyZU5hbWUuZXF1YWxzKCJhbmRyb2lkLnNvZnR3YXJlLnByZXZpZXdfc2RrIikpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU2tpcHMgcHJldmlld19zZGsgaW4gbm9uLXJlbGVhc2UgYnVpbGQuCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZSgiVXNlIGEgZGlmZmVyZW50IG5hbWVzcGFjZSB0aGFuICdhbmRyb2lkJyBmb3IgIiArIGZlYXR1cmVOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZU5hbWUuc3RhcnRzV2l0aCgiYW5kcm9pZCIpKTsKICAgICAgICAgICAgIH0KQEAgLTEyOCw2ICsxMzQsNyBAQAogICAgICAgICAgICAgYXNzZXJ0Tm90QXZhaWxhYmxlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfQ0FNRVJBX0NBUEFCSUxJVFlfTUFOVUFMX1NFTlNPUik7CiAgICAgICAgICAgICBhc3NlcnROb3RBdmFpbGFibGUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9DQU1FUkFfQ0FQQUJJTElUWV9NQU5VQUxfUE9TVF9QUk9DRVNTSU5HKTsKICAgICAgICAgICAgIGFzc2VydE5vdEF2YWlsYWJsZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX0NBTUVSQV9DQVBBQklMSVRZX1JBVyk7CisgICAgICAgICAgICBhc3NlcnROb3RBdmFpbGFibGUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9DQU1FUkFfQVIpOwogCiAgICAgICAgICAgICBhc3NlcnRGYWxzZSgiRGV2aWNlcyBzdXBwb3J0aW5nIGV4dGVybmFsIGNhbWVyYXMgbXVzdCBoYXZlIGEgcmVwcmVzZW50YXRpdmUgY2FtZXJhICIgKwogICAgICAgICAgICAgICAgICAgICAiY29ubmVjdGVkIGZvciB0ZXN0aW5nIiwKQEAgLTE0NSw2ICsxNTIsNyBAQAogICAgICAgICBib29sZWFuIGZ1bGxDYW1lcmEgPSBmYWxzZTsKICAgICAgICAgYm9vbGVhbiBtYW51YWxTZW5zb3IgPSBmYWxzZTsKICAgICAgICAgYm9vbGVhbiBtYW51YWxQb3N0UHJvY2Vzc2luZyA9IGZhbHNlOworICAgICAgICBib29sZWFuIG1vdGlvblRyYWNraW5nID0gZmFsc2U7CiAgICAgICAgIGJvb2xlYW4gcmF3ID0gZmFsc2U7CiAgICAgICAgIENhbWVyYUNoYXJhY3RlcmlzdGljc1tdIGNhbWVyYUNoYXJzID0gbmV3IENhbWVyYUNoYXJhY3RlcmlzdGljc1tjYW1lcmFJZHMubGVuZ3RoXTsKICAgICAgICAgZm9yIChTdHJpbmcgY2FtZXJhSWQgOiBjYW1lcmFJZHMpIHsKQEAgLTE1Miw3ICsxNjAsNyBAQAogICAgICAgICAgICAgSW50ZWdlciBod0xldmVsID0gY2hhcnMuZ2V0KENhbWVyYUNoYXJhY3RlcmlzdGljcy5JTkZPX1NVUFBPUlRFRF9IQVJEV0FSRV9MRVZFTCk7CiAgICAgICAgICAgICBpbnRbXSBjYXBhYmlsaXRpZXMgPSBjaGFycy5nZXQoQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLlJFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUyk7CiAgICAgICAgICAgICBpZiAoaHdMZXZlbCA9PSBDYW1lcmFNZXRhZGF0YS5JTkZPX1NVUFBPUlRFRF9IQVJEV0FSRV9MRVZFTF9GVUxMIHx8Ci0gICAgICAgICAgICAgICAgICAgIGh3TGV2ZWwgPj0gQ2FtZXJhTWV0YWRhdGEuSU5GT19TVVBQT1JURURfSEFSRFdBUkVfTEVWRUxfMykgeworICAgICAgICAgICAgICAgICAgICBod0xldmVsID09IENhbWVyYU1ldGFkYXRhLklORk9fU1VQUE9SVEVEX0hBUkRXQVJFX0xFVkVMXzMpIHsKICAgICAgICAgICAgICAgICBmdWxsQ2FtZXJhID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZvciAoaW50IGNhcGFiaWxpdHkgOiBjYXBhYmlsaXRpZXMpIHsKQEAgLTE2Niw2ICsxNzQsOSBAQAogICAgICAgICAgICAgICAgICAgICBjYXNlIENhbWVyYUNoYXJhY3RlcmlzdGljcy5SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfUkFXOgogICAgICAgICAgICAgICAgICAgICAgICAgcmF3ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgY2FzZSBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX01PVElPTl9UUkFDS0lORzoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vdGlvblRyYWNraW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2FwYWJpbGl0aWVzIGRvbid0IGhhdmUgYSBtYXRjaGluZyBzeXN0ZW0gZmVhdHVyZQogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xNzcsNiArMTg4LDIwIEBACiAgICAgICAgIGFzc2VydEZlYXR1cmUobWFudWFsUG9zdFByb2Nlc3NpbmcsCiAgICAgICAgICAgICAgICAgUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9DQU1FUkFfQ0FQQUJJTElUWV9NQU5VQUxfUE9TVF9QUk9DRVNTSU5HKTsKICAgICAgICAgYXNzZXJ0RmVhdHVyZShyYXcsIFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfQ0FNRVJBX0NBUEFCSUxJVFlfUkFXKTsKKyAgICAgICAgaWYgKCFtb3Rpb25UcmFja2luZykgeworICAgICAgICAgIC8vIEZFQVRVUkVfQ0FNRVJBX0FSIHJlcXVpcmVzIHRoZSBwcmVzZW5jZSBvZgorICAgICAgICAgIC8vIENhbWVyYUNoYXJhY3RlcmlzdGljcy5SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfTU9USU9OX1RSQUNLSU5HIGJ1dAorICAgICAgICAgIC8vIE1PVElPTl9UUkFDS0lORyBkb2VzIG5vdCByZXF1aXJlIHRoZSBwcmVzZW5jZSBvZiBGRUFUVVJFX0NBTUVSQV9BUgorICAgICAgICAgIC8vCisgICAgICAgICAgLy8gTG9naWMgdGFibGU6CisgICAgICAgICAgLy8gICAgQVI9IEYgICBUCisgICAgICAgICAgLy8gTVQ9RiAgIFkgICBOCisgICAgICAgICAgLy8gICA9VCAgIFkgICBZCisgICAgICAgICAgLy8KKyAgICAgICAgICAvLyBTbyBvbmx5IGNoZWNrIHRoZSBvbmUgZGlzYWxsb3dlZCBjb25kaXRpb246IE5vIG1vdGlvbiB0cmFja2luZyBhbmQgRkVBVFVSRV9DQU1FUkFfQVIgaXMKKyAgICAgICAgICAvLyBhdmFpbGFibGUKKyAgICAgICAgICBhc3NlcnROb3RBdmFpbGFibGUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9DQU1FUkFfQVIpOworICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGNoZWNrRnJvbnRDYW1lcmEoKSB7CkBAIC0yMzQsNyArMjU5LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSIzLjguNy9DLTEtMSIpCiAgICAgcHVibGljIHZvaWQgdGVzdExpdmVXYWxscGFwZXJGZWF0dXJlKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoV2FsbHBhcGVyTWFuYWdlci5BQ1RJT05fTElWRV9XQUxMUEFQRVJfQ0hPT1NFUik7CkBAIC0yODgsNyArMzEyLDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjEuMy9DLTAtMSIpCiAgICAgcHVibGljIHZvaWQgdGVzdFNjcmVlbkZlYXR1cmVzKCkgewogICAgICAgICBhc3NlcnRUcnVlKG1QYWNrYWdlTWFuYWdlci5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfU0NSRUVOX0xBTkRTQ0FQRSkKICAgICAgICAgICAgICAgICB8fCBtUGFja2FnZU1hbmFnZXIuaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX1NDUkVFTl9QT1JUUkFJVCkpOwpAQCAtMjk4LDcgKzMyMSw2IEBACiAgICAgICogQ2hlY2sgdGhhdCB0aGUgc2Vuc29yIGZlYXR1cmVzIHJlcG9ydGVkIGJ5IHRoZSBQYWNrYWdlTWFuYWdlciBjb3JyZXNwb25kIHRvIHRoZSBzZW5zb3JzCiAgICAgICogcmV0dXJuZWQgYnkge0BsaW5rIFNlbnNvck1hbmFnZXIjZ2V0U2Vuc29yTGlzdChpbnQpfS4KICAgICAgKi8KLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iNy4zL0MtMC0xLEMtMC0yLEMtMC0zIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2Vuc29yRmVhdHVyZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgU2V0PFN0cmluZz4gZmVhdHVyZXNMZWZ0ID0gZ2V0RmVhdHVyZUNvbnN0YW50c05hbWVzKCJGRUFUVVJFX1NFTlNPUl8iKTsKIApAQCAtNDQ1LDggKzQ2Nyw2IEBACiAgICAgLyoqCiAgICAgICogQ2hlY2sgdGhhdCB0aGUge0BsaW5rIFRlbGVwaG9ueU1hbmFnZXIjZ2V0UGhvbmVUeXBlKCl9IG1hdGNoZXMgdGhlIHJlcG9ydGVkIGZlYXR1cmVzLgogICAgICAqLwotCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuNC4xL0MtMS0xIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0VGVsZXBob255RmVhdHVyZXMoKSB7CiAgICAgICAgIGlmICghbVBhY2thZ2VNYW5hZ2VyLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9URUxFUEhPTlkpKSB7CiAgICAgICAgICAgICByZXR1cm47CkBAIC00NzEsNyArNDkxLDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjIuNC9DLTEtMixDLTMtMSIpCiAgICAgcHVibGljIHZvaWQgdGVzdFRvdWNoU2NyZWVuRmVhdHVyZXMoKSB7CiAgICAgICAgIENvbmZpZ3VyYXRpb25JbmZvIGNvbmZpZ0luZm8gPSBtQWN0aXZpdHlNYW5hZ2VyLmdldERldmljZUNvbmZpZ3VyYXRpb25JbmZvKCk7CiAgICAgICAgIGlmIChjb25maWdJbmZvLnJlcVRvdWNoU2NyZWVuICE9IENvbmZpZ3VyYXRpb24uVE9VQ0hTQ1JFRU5fTk9UT1VDSCkgewpAQCAtNDg3LDkgKzUwNiwxMSBAQAogICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjcuMi9DLTItMSIpCiAgICAgcHVibGljIHZvaWQgdGVzdFVzYkFjY2Vzc29yeSgpIHsKICAgICAgICAgaWYgKCFtUGFja2FnZU1hbmFnZXIuaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX0FVVE9NT1RJVkUpICYmCi0gICAgICAgICAgICAgICAgIW1QYWNrYWdlTWFuYWdlci5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfVEVMRVZJU0lPTikgJiYKKyAgICAgICAgICAgICAgICAhbVBhY2thZ2VNYW5hZ2VyLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9MRUFOQkFDSykgJiYKICAgICAgICAgICAgICAgICAhbVBhY2thZ2VNYW5hZ2VyLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9XQVRDSCkgJiYKICAgICAgICAgICAgICAgICAhbVBhY2thZ2VNYW5hZ2VyLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9FTUJFRERFRCkgJiYKKyAgICAgICAgICAgICAgICAhaXNBbmRyb2lkRW11bGF0b3IoKSAmJgorICAgICAgICAgICAgICAgICFtUGFja2FnZU1hbmFnZXIuaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX1BDKSAmJgogICAgICAgICAgICAgICAgIG1QYWNrYWdlTWFuYWdlci5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfTUlDUk9QSE9ORSkgJiYKICAgICAgICAgICAgICAgICBtUGFja2FnZU1hbmFnZXIuaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX1RPVUNIU0NSRUVOKSkgewogICAgICAgICAgICAgLy8gVVNCIGFjY2Vzc29yeSBtb2RlIGlzIG9ubHkgYSByZXF1aXJlbWVudCBmb3IgZGV2aWNlcyB3aXRoIFVTQiBwb3J0cyBzdXBwb3J0aW5nCkBAIC01MDAsNyArNTIxLDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICBwdWJsaWMgdm9pZCB0ZXN0V2lmaUZlYXR1cmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2lmaUZlYXR1cmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFtUGFja2FnZU1hbmFnZXIuaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX1dJRkkpKSB7CiAgICAgICAgICAgICAvLyBubyBXaUZpLCBza2lwIHRoZSB0ZXN0CiAgICAgICAgICAgICByZXR1cm47CkBAIC01MTUsNiArNTM2LDEzIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXVkaW9PdXRwdXRGZWF0dXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChtUGFja2FnZU1hbmFnZXIuaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX0FVVE9NT1RJVkUpIHx8CisgICAgICAgICAgICAgICAgbVBhY2thZ2VNYW5hZ2VyLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9MRUFOQkFDSykpIHsKKyAgICAgICAgICAgIGFzc2VydEF2YWlsYWJsZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX0FVRElPX09VVFBVVCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgYXNzZXJ0QXZhaWxhYmxlKFN0cmluZyBmZWF0dXJlKSB7CiAgICAgICAgIGFzc2VydFRydWUoIlBhY2thZ2VNYW5hZ2VyI2hhc1N5c3RlbUZlYXR1cmUgc2hvdWxkIHJldHVybiB0cnVlIGZvciAiICsgZmVhdHVyZSwKICAgICAgICAgICAgICAgICBtUGFja2FnZU1hbmFnZXIuaGFzU3lzdGVtRmVhdHVyZShmZWF0dXJlKSk7CkBAIC01MzksNiArNTY3LDEwIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNBbmRyb2lkRW11bGF0b3IoKSB7CisgICAgICAgIHJldHVybiBQcm9wZXJ0eVV0aWwucHJvcGVydHlFcXVhbHMoInJvLmtlcm5lbC5xZW11IiwgIjEiKTsKKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgYXNzZXJ0RmVhdHVyZShib29sZWFuIGV4aXN0LCBTdHJpbmcgZmVhdHVyZSkgewogICAgICAgICBpZiAoZXhpc3QpIHsKICAgICAgICAgICAgIGFzc2VydEF2YWlsYWJsZShmZWF0dXJlKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL1Rhc2tEZXNjcmlwdGlvblRlc3QuamF2YSBiL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL1Rhc2tEZXNjcmlwdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2MxM2I4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYXBwL3NyYy9hbmRyb2lkL2FwcC9jdHMvVGFza0Rlc2NyaXB0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hcHAuY3RzOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5Db250ZXh0LkFDVElWSVRZX1NFUlZJQ0U7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyLlJlY2VudFRhc2tJbmZvOworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlci5UYXNrRGVzY3JpcHRpb247CitpbXBvcnQgYW5kcm9pZC5hcHAuc3R1YnMuTW9ja0FjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3I7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlByZXN1Ym1pdDsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBCdWlsZDogbW1tYSAtajMyIGN0cy90ZXN0cy9hcHAKKyAqIFJ1bjogY3RzL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci91dGlsL3J1bi10ZXN0IEN0c0FwcFRlc3RDYXNlcyBhbmRyb2lkLmFwcC5jdHMuVGFza0Rlc2NyaXB0aW9uVGVzdAorICovCitAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQorQFByZXN1Ym1pdAorcHVibGljIGNsYXNzIFRhc2tEZXNjcmlwdGlvblRlc3QgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0xBQkVMID0gInRlc3QtbGFiZWwiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBURVNUX05PX0RBVEEgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBURVNUX1JFU19EQVRBID0gNzc3OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBURVNUX0NPTE9SID0gQ29sb3IuQkxBQ0s7CisKKyAgICBAUnVsZQorICAgIHB1YmxpYyBBY3Rpdml0eVRlc3RSdWxlPE1vY2tBY3Rpdml0eT4gbVRhc2tEZXNjcmlwdGlvbkFjdGl2aXR5ID0KKyAgICAgICAgbmV3IEFjdGl2aXR5VGVzdFJ1bGU8PihNb2NrQWN0aXZpdHkuY2xhc3MsCisgICAgICAgICAgICBmYWxzZSAvKiBpbml0aWFsVG91Y2hNb2RlICovLCBmYWxzZSAvKiBsYXVuY2hBY3Rpdml0eSAqLyk7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCaXRtYXBDb25zdHJ1Y3RvcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBBY3Rpdml0eSBhY3Rpdml0eSA9IG1UYXNrRGVzY3JpcHRpb25BY3Rpdml0eS5sYXVuY2hBY3Rpdml0eShudWxsKTsKKyAgICAgICAgZmluYWwgQml0bWFwIGJpdG1hcCA9IEJpdG1hcC5jcmVhdGVCaXRtYXAoMSwgMSwgQml0bWFwLkNvbmZpZy5BUkdCXzg4ODgpOworICAgICAgICBiaXRtYXAuZXJhc2VDb2xvcigwKTsKKyAgICAgICAgYWN0aXZpdHkuc2V0VGFza0Rlc2NyaXB0aW9uKG5ldyBUYXNrRGVzY3JpcHRpb24oVEVTVF9MQUJFTCwgYml0bWFwLCBURVNUX0NPTE9SKSk7CisgICAgICAgIGFzc2VydFRhc2tEZXNjcmlwdGlvbihhY3Rpdml0eSwgVEVTVF9MQUJFTCwgVEVTVF9OT19EQVRBKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUNvbnN0cnVjdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEFjdGl2aXR5IGFjdGl2aXR5ID0gbVRhc2tEZXNjcmlwdGlvbkFjdGl2aXR5LmxhdW5jaEFjdGl2aXR5KG51bGwpOworICAgICAgICBhY3Rpdml0eS5zZXRUYXNrRGVzY3JpcHRpb24obmV3IFRhc2tEZXNjcmlwdGlvbihURVNUX0xBQkVMLCBURVNUX1JFU19EQVRBLCBURVNUX0NPTE9SKSk7CisgICAgICAgIGFzc2VydFRhc2tEZXNjcmlwdGlvbihhY3Rpdml0eSwgVEVTVF9MQUJFTCwgVEVTVF9SRVNfREFUQSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFRhc2tEZXNjcmlwdGlvbihBY3Rpdml0eSBhY3Rpdml0eSwgU3RyaW5nIGxhYmVsLCBpbnQgcmVzSWQpIHsKKyAgICAgICAgZmluYWwgQWN0aXZpdHlNYW5hZ2VyIGFtID0gKEFjdGl2aXR5TWFuYWdlcikgYWN0aXZpdHkuZ2V0U3lzdGVtU2VydmljZShBQ1RJVklUWV9TRVJWSUNFKTsKKyAgICAgICAgTGlzdDxSZWNlbnRUYXNrSW5mbz4gcmVjZW50c1Rhc2tzID0gYW0uZ2V0UmVjZW50VGFza3MoMSAvKiBtYXhOdW0gKi8sIDAgLyogZmxhZ3MgKi8pOworICAgICAgICBpZiAoIXJlY2VudHNUYXNrcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGZpbmFsIFJlY2VudFRhc2tJbmZvIGluZm8gPSByZWNlbnRzVGFza3MuZ2V0KDApOworICAgICAgICAgICAgaWYgKGFjdGl2aXR5LmdldFRhc2tJZCgpID09IGluZm8uaWQpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBUYXNrRGVzY3JpcHRpb24gdGQgPSBpbmZvLnRhc2tEZXNjcmlwdGlvbjsKKyAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHRkKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzSWQgPT0gVEVTVF9OT19EQVRBKSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwodGQuZ2V0SWNvbigpKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCh0ZC5nZXRJY29uRmlsZW5hbWUoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0TnVsbCh0ZC5nZXRJY29uRmlsZW5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydE51bGwodGQuZ2V0SWNvbigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc0lkLCB0ZC5nZXRJY29uUmVzb3VyY2UoKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGxhYmVsLCB0ZC5nZXRMYWJlbCgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZmFpbCgiRGlkIG5vdCBmaW5kIGFjdGl2aXR5IChpZD0iICsgYWN0aXZpdHkuZ2V0VGFza0lkKCkgKyAiKSBpbiByZWNlbnQgdGFza3MgbGlzdCIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL1RpbWVQaWNrZXJEaWFsb2dUZXN0LmphdmEgYi90ZXN0cy9hcHAvc3JjL2FuZHJvaWQvYXBwL2N0cy9UaW1lUGlja2VyRGlhbG9nVGVzdC5qYXZhCmluZGV4IDQ3YTY2NmMuLmY1NDNjNzkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL1RpbWVQaWNrZXJEaWFsb2dUZXN0LmphdmEKKysrIGIvdGVzdHMvYXBwL3NyYy9hbmRyb2lkL2FwcC9jdHMvVGltZVBpY2tlckRpYWxvZ1Rlc3QuamF2YQpAQCAtMjYsMTUgKzI2LDE3IEBACiBpbXBvcnQgYW5kcm9pZC5hcHAuc3R1YnMuUjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnRlc3QuVWlUaHJlYWRUZXN0OwogaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5NZWRpdW1UZXN0OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRpbWVQaWNrZXI7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKKwogLyoqCiAgKiBUZXN0IHtAbGluayBUaW1lUGlja2VyRGlhbG9nfS4KICAqLwpkaWZmIC0tZ2l0IGEvdGVzdHMvYXBwL3NyYy9hbmRyb2lkL2FwcC9jdHMvVWlNb2RlTWFuYWdlclRlc3QuamF2YSBiL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL1VpTW9kZU1hbmFnZXJUZXN0LmphdmEKaW5kZXggNDhkNjMwMi4uNDBmZTBmNSAxMDA2NDQKLS0tIGEvdGVzdHMvYXBwL3NyYy9hbmRyb2lkL2FwcC9jdHMvVWlNb2RlTWFuYWdlclRlc3QuamF2YQorKysgYi90ZXN0cy9hcHAvc3JjL2FuZHJvaWQvYXBwL2N0cy9VaU1vZGVNYW5hZ2VyVGVzdC5qYXZhCkBAIC0yMiw4ICsyMiw2IEBACiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DZGRUZXN0OwotCiBwdWJsaWMgY2xhc3MgVWlNb2RlTWFuYWdlclRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiVWlNb2RlTWFuYWdlclRlc3QiOwogCkBAIC0zNiw3ICszNCw2IEBACiAgICAgICAgIGFzc2VydE5vdE51bGwobVVpTW9kZU1hbmFnZXIpOwogICAgIH0KIAotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSIyLjUuMy9BLTAtMixXLTAtMiIpCiAgICAgcHVibGljIHZvaWQgdGVzdFVpTW9kZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBpZiAoaXNBdXRvbW90aXZlKCkpIHsKICAgICAgICAgICAgIExvZy5pKFRBRywgInRlc3RVaU1vZGUgYXV0b21vdGl2ZSIpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvYXBwL3NyYy9hbmRyb2lkL2FwcC9jdHMvV2FsbHBhcGVyQ29sb3JzVGVzdC5qYXZhIGIvdGVzdHMvYXBwL3NyYy9hbmRyb2lkL2FwcC9jdHMvV2FsbHBhcGVyQ29sb3JzVGVzdC5qYXZhCmluZGV4IDEwNWNhZTAuLmEyZmU0YjMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL1dhbGxwYXBlckNvbG9yc1Rlc3QuamF2YQorKysgYi90ZXN0cy9hcHAvc3JjL2FuZHJvaWQvYXBwL2N0cy9XYWxscGFwZXJDb2xvcnNUZXN0LmphdmEKQEAgLTIwLDEzICsyMCwxMiBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5Db2xvckRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5QYWlyOwotaW1wb3J0IGFuZHJvaWQudXRpbC5TaXplOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogCiBpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKQEAgLTEwMCw0ICs5OSwxMyBAQAogICAgICAgICBBc3NlcnQuYXNzZXJ0TnVsbChjb2xvcnMuZ2V0U2Vjb25kYXJ5Q29sb3IoKSk7CiAgICAgfQogCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBmcm9tRHJhd2FibGVEb2VzbnRNdXRhdGVCb3VuZHMoKSB7CisgICAgICAgIENvbG9yRHJhd2FibGUgZHJhd2FibGUgPSBuZXcgQ29sb3JEcmF3YWJsZShDb2xvci5HUkVFTik7CisgICAgICAgIFJlY3QgaW5pdGlhbEJvdW5kcyA9IGRyYXdhYmxlLmNvcHlCb3VuZHMoKTsKKworICAgICAgICBXYWxscGFwZXJDb2xvcnMuZnJvbURyYXdhYmxlKGRyYXdhYmxlKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGRyYXdhYmxlLmdldEJvdW5kcygpLCBpbml0aWFsQm91bmRzKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9hcHAvc3JjL2FuZHJvaWQvYXBwL2N0cy9XYWxscGFwZXJJbmZvVGVzdC5qYXZhIGIvdGVzdHMvYXBwL3NyYy9hbmRyb2lkL2FwcC9jdHMvV2FsbHBhcGVySW5mb1Rlc3QuamF2YQppbmRleCAxYjMwOTAyLi40MDJiZTQwIDEwMDY0NAotLS0gYS90ZXN0cy9hcHAvc3JjL2FuZHJvaWQvYXBwL2N0cy9XYWxscGFwZXJJbmZvVGVzdC5qYXZhCisrKyBiL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL1dhbGxwYXBlckluZm9UZXN0LmphdmEKQEAgLTI1LDggKzI1LDkgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlJlc29sdmVJbmZvOwogaW1wb3J0IGFuZHJvaWQuc2VydmljZS53YWxscGFwZXIuV2FsbHBhcGVyU2VydmljZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKZGlmZiAtLWdpdCBhL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL1dhbGxwYXBlck1hbmFnZXJUZXN0LmphdmEgYi90ZXN0cy9hcHAvc3JjL2FuZHJvaWQvYXBwL2N0cy9XYWxscGFwZXJNYW5hZ2VyVGVzdC5qYXZhCmluZGV4IDdiMzJjMDMuLmEyYTBlNDQ5IDEwMDY0NAotLS0gYS90ZXN0cy9hcHAvc3JjL2FuZHJvaWQvYXBwL2N0cy9XYWxscGFwZXJNYW5hZ2VyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL1dhbGxwYXBlck1hbmFnZXJUZXN0LmphdmEKQEAgLTE4LDcgKzE4LDYgQEAKIAogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Bcmd1bWVudE1hdGNoZXJzLmFueTsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uQXJndW1lbnRNYXRjaGVycy5hbnlJbnQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLkFyZ3VtZW50TWF0Y2hlcnMuZXE7CiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLkFyZ3VtZW50TWF0Y2hlcnMubnVsbGFibGU7CiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8uYXRMZWFzdDsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5tb2NrOwpAQCAtMjgsNiArMjcsNyBAQAogCiBpbXBvcnQgYW5kcm9pZC5hcHAuV2FsbHBhcGVyQ29sb3JzOwogaW1wb3J0IGFuZHJvaWQuYXBwLldhbGxwYXBlck1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5hcHAuc3R1YnMuUjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKQEAgLTM5LDEyICszOSwxMyBAQAogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXJUaHJlYWQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuRGlzcGxheTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ2RkVGVzdDsKIAogaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CkBAIC01Myw4ICs1NCw2IEBACiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG9Bbm5vdGF0aW9uczsKIAotaW1wb3J0IGFuZHJvaWQuYXBwLnN0dWJzLlI7Ci0KIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CkBAIC0xMDIsNiArMTAxLDUyIEBACiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzZXRCaXRtYXBUZXN0XzF4MVBpeGVsKCkgeworICAgICAgICBlbnN1cmVDbGVhblN0YXRlKCk7CisKKyAgICAgICAgQml0bWFwIHRtcFdhbGxwYXBlciA9IEJpdG1hcC5jcmVhdGVCaXRtYXAoMSwgMSwgQml0bWFwLkNvbmZpZy5BUkdCXzg4ODgpOworICAgICAgICBDYW52YXMgY2FudmFzID0gbmV3IENhbnZhcyh0bXBXYWxscGFwZXIpOworICAgICAgICBjYW52YXMuZHJhd0NvbG9yKENvbG9yLlJFRCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCB3aGljaCA9IFdhbGxwYXBlck1hbmFnZXIuRkxBR19TWVNURU07CisgICAgICAgICAgICBpbnQgb2xkV2FsbHBhcGVySWQgPSBtV2FsbHBhcGVyTWFuYWdlci5nZXRXYWxscGFwZXJJZCh3aGljaCk7CisgICAgICAgICAgICBtV2FsbHBhcGVyTWFuYWdlci5zdWdnZXN0RGVzaXJlZERpbWVuc2lvbnModG1wV2FsbHBhcGVyLmdldFdpZHRoKCksCisgICAgICAgICAgICAgICAgICAgIHRtcFdhbGxwYXBlci5nZXRIZWlnaHQoKSk7CisgICAgICAgICAgICBtV2FsbHBhcGVyTWFuYWdlci5zZXRCaXRtYXAodG1wV2FsbHBhcGVyKTsKKyAgICAgICAgICAgIGludCBuZXdXYWxscGFwZXJJZCA9IG1XYWxscGFwZXJNYW5hZ2VyLmdldFdhbGxwYXBlcklkKHdoaWNoKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnROb3RFcXVhbHMob2xkV2FsbHBhcGVySWQsIG5ld1dhbGxwYXBlcklkKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB0bXBXYWxscGFwZXIucmVjeWNsZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzZXRCaXRtYXBUZXN0XzF4MVBpeGVsX0Z1bGxzY3JlZW5EZXNpcmVkKCkgeworICAgICAgICBlbnN1cmVDbGVhblN0YXRlKCk7CisKKyAgICAgICAgQml0bWFwIHRtcFdhbGxwYXBlciA9IEJpdG1hcC5jcmVhdGVCaXRtYXAoMSwgMSwgQml0bWFwLkNvbmZpZy5BUkdCXzg4ODgpOworICAgICAgICBDYW52YXMgY2FudmFzID0gbmV3IENhbnZhcyh0bXBXYWxscGFwZXIpOworICAgICAgICBjYW52YXMuZHJhd0NvbG9yKENvbG9yLlJFRCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCB3aGljaCA9IFdhbGxwYXBlck1hbmFnZXIuRkxBR19TWVNURU07CisgICAgICAgICAgICBpbnQgb2xkV2FsbHBhcGVySWQgPSBtV2FsbHBhcGVyTWFuYWdlci5nZXRXYWxscGFwZXJJZCh3aGljaCk7CisgICAgICAgICAgICBmaW5hbCBQb2ludCBkaXNwbGF5U2l6ZSA9IGdldFNjcmVlblNpemUoKTsKKyAgICAgICAgICAgIG1XYWxscGFwZXJNYW5hZ2VyLnN1Z2dlc3REZXNpcmVkRGltZW5zaW9ucyhkaXNwbGF5U2l6ZS54LCBkaXNwbGF5U2l6ZS55KTsKKyAgICAgICAgICAgIG1XYWxscGFwZXJNYW5hZ2VyLnNldEJpdG1hcCh0bXBXYWxscGFwZXIpOworICAgICAgICAgICAgaW50IG5ld1dhbGxwYXBlcklkID0gbVdhbGxwYXBlck1hbmFnZXIuZ2V0V2FsbHBhcGVySWQod2hpY2gpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydE5vdEVxdWFscyhvbGRXYWxscGFwZXJJZCwgbmV3V2FsbHBhcGVySWQpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHRtcFdhbGxwYXBlci5yZWN5Y2xlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHNldFJlc291cmNlVGVzdCgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCB3aGljaCA9IFdhbGxwYXBlck1hbmFnZXIuRkxBR19TWVNURU07CkBAIC0yMjksMzMgKzI3NCwzMCBAQAogICAgICAqIFN1Z2dlc3RpbmcgZGVzaXJlZCBkaW1lbnNpb25zIGlzIG9ubHkgYSBoaW50IHRvIHRoZSBzeXN0ZW0gdGhhdCBjYW4gYmUgaWdub3JlZC4KICAgICAgKgogICAgICAqIFRlc3QgaWYgdGhlIGRlc2lyZWQgbWluaW11bSB3aWR0aCBvciBoZWlnaHQgdGhlIFdhbGxwYXBlck1hbmFnZXIgcmV0dXJucwotICAgICAqIGlzIGdyZWF0ZXIgdGhhbiAwLiBJZiBzbywgdGhlbiB3ZSBjaGVjayB3aGV0aGVyIHRoYXQgdGhlIHNpemUgaXMgYXQgbGVhc3QgdGhlCi0gICAgICogYXMgYmlnIGFzIHRoZSBzY3JlZW4uCisgICAgICogaXMgZ3JlYXRlciB0aGFuIDAuCiAgICAgICovCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCBzdWdnZXN0RGVzaXJlZERpbWVuc2lvbnNUZXN0KCkgewogICAgICAgICBmaW5hbCBQb2ludCBtaW4gPSBnZXRTY3JlZW5TaXplKCk7CiAgICAgICAgIGZpbmFsIGludCB3ID0gbWluLnggKiAzOwogICAgICAgICBmaW5hbCBpbnQgaCA9IG1pbi55ICogMjsKLSAgICAgICAgYXNzZXJ0RGVzaXJlZE1pbmltdW0obmV3IFBvaW50KG1pbi54IC8gMiwgbWluLnkgLyAyKSwgbWluKTsKKyAgICAgICAgYXNzZXJ0RGVzaXJlZERpbWVuc2lvbihuZXcgUG9pbnQobWluLnggLyAyLCBtaW4ueSAvIDIpLCBuZXcgUG9pbnQobWluLnggLyAyLCBtaW4ueSAvIDIpKTsKIAotICAgICAgICBhc3NlcnREZXNpcmVkTWluaW11bShuZXcgUG9pbnQodywgaCksIG1pbik7CisgICAgICAgIGFzc2VydERlc2lyZWREaW1lbnNpb24obmV3IFBvaW50KHcsIGgpLCBuZXcgUG9pbnQodywgaCkpOwogCi0gICAgICAgIGFzc2VydERlc2lyZWRNaW5pbXVtKG5ldyBQb2ludChtaW4ueCAvIDIsIGgpLCBtaW4pOworICAgICAgICBhc3NlcnREZXNpcmVkRGltZW5zaW9uKG5ldyBQb2ludChtaW4ueCAvIDIsIGgpLCBuZXcgUG9pbnQobWluLnggLyAyLCBoKSk7CiAKLSAgICAgICAgYXNzZXJ0RGVzaXJlZE1pbmltdW0obmV3IFBvaW50KHcsIG1pbi55IC8gMiksIG1pbik7CisgICAgICAgIGFzc2VydERlc2lyZWREaW1lbnNpb24obmV3IFBvaW50KHcsIG1pbi55IC8gMiksIG5ldyBQb2ludCh3LCBtaW4ueSAvIDIpKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0RGVzaXJlZE1pbmltdW0oUG9pbnQgc3VnZ2VzdGVkU2l6ZSwgUG9pbnQgbWluU2l6ZSkgeworICAgIHByaXZhdGUgdm9pZCBhc3NlcnREZXNpcmVkRGltZW5zaW9uKFBvaW50IHN1Z2dlc3RlZFNpemUsIFBvaW50IGV4cGVjdGVkU2l6ZSkgewogICAgICAgICBtV2FsbHBhcGVyTWFuYWdlci5zdWdnZXN0RGVzaXJlZERpbWVuc2lvbnMoc3VnZ2VzdGVkU2l6ZS54LCBzdWdnZXN0ZWRTaXplLnkpOwogICAgICAgICBQb2ludCBhY3R1YWxTaXplID0gbmV3IFBvaW50KG1XYWxscGFwZXJNYW5hZ2VyLmdldERlc2lyZWRNaW5pbXVtV2lkdGgoKSwKICAgICAgICAgICAgICAgICBtV2FsbHBhcGVyTWFuYWdlci5nZXREZXNpcmVkTWluaW11bUhlaWdodCgpKTsKLSAgICAgICAgaWYgKGFjdHVhbFNpemUueCA+IDAgfHwgYWN0dWFsU2l6ZS55ID4gMCkgewotICAgICAgICAgICAgaWYgKChhY3R1YWxTaXplLnggPCBtaW5TaXplLnggfHwgYWN0dWFsU2l6ZS55IDwgbWluU2l6ZS55KSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiRXhwZWN0ZWQgYXQgbGVhc3QgeDogIiArIG1pblNpemUueCArICIgeTogIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBtaW5TaXplLnkgKyAiLCBnb3QgeDogIiArIGFjdHVhbFNpemUueCArCi0gICAgICAgICAgICAgICAgICAgICAgICAiIHk6ICIgKyBhY3R1YWxTaXplLnkpOwotICAgICAgICAgICAgfQorICAgICAgICBpZiAoYWN0dWFsU2l6ZS54IDw9IDAgfHwgYWN0dWFsU2l6ZS55IDw9IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiRXhwZWN0ZWQgeDogIiArIGV4cGVjdGVkU2l6ZS54ICsgIiB5OiAiCisgICAgICAgICAgICAgICAgICAgICsgZXhwZWN0ZWRTaXplLnkgKyAiLCBnb3QgeDogIiArIGFjdHVhbFNpemUueCArCisgICAgICAgICAgICAgICAgICAgICIgeTogIiArIGFjdHVhbFNpemUueSk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL2FuZHJvaWQvYXBwL2N0cy90b29scy9TZXJ2aWNlQ29ubmVjdGlvbkhhbmRsZXIuamF2YSBiL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL2FuZHJvaWQvYXBwL2N0cy90b29scy9TZXJ2aWNlQ29ubmVjdGlvbkhhbmRsZXIuamF2YQppbmRleCBmNWJiNWEzLi5mYTRmZWQwIDEwMDY0NAotLS0gYS90ZXN0cy9hcHAvc3JjL2FuZHJvaWQvYXBwL2N0cy9hbmRyb2lkL2FwcC9jdHMvdG9vbHMvU2VydmljZUNvbm5lY3Rpb25IYW5kbGVyLmphdmEKKysrIGIvdGVzdHMvYXBwL3NyYy9hbmRyb2lkL2FwcC9jdHMvYW5kcm9pZC9hcHAvY3RzL3Rvb2xzL1NlcnZpY2VDb25uZWN0aW9uSGFuZGxlci5qYXZhCkBAIC0zMiw2ICszMiw3IEBACiAKICAgICBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwogICAgIGZpbmFsIEludGVudCBtSW50ZW50OworICAgIGZpbmFsIGxvbmcgbURlZmF1bHRXYWl0VGltZTsKICAgICBib29sZWFuIG1Nb25pdG9yaW5nOwogICAgIGJvb2xlYW4gbUJvdW5kOwogICAgIElCaW5kZXIgbVNlcnZpY2U7CkBAIC00Nyw4ICs0OCwxMyBAQAogICAgIH07CiAKICAgICBwdWJsaWMgU2VydmljZUNvbm5lY3Rpb25IYW5kbGVyKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICB0aGlzKGNvbnRleHQsIGludGVudCwgNSoxMDAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2VydmljZUNvbm5lY3Rpb25IYW5kbGVyKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCwgbG9uZyBkZWZhdWx0V2FpdFRpbWUpIHsKICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwogICAgICAgICBtSW50ZW50ID0gaW50ZW50OworICAgICAgICBtRGVmYXVsdFdhaXRUaW1lID0gZGVmYXVsdFdhaXRUaW1lOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHN0YXJ0TW9uaXRvcmluZygpIHsKQEAgLTU2LDcgKzYyLDggQEAKICAgICAgICAgICAgIGlmIChtTW9uaXRvcmluZykgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkFscmVhZHkgbW9uaXRvcmluZyIpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFtQ29udGV4dC5iaW5kU2VydmljZShtSW50ZW50LCB0aGlzLCBDb250ZXh0LkJJTkRfV0FJVkVfUFJJT1JJVFkpKSB7CisgICAgICAgICAgICBpZiAoIW1Db250ZXh0LmJpbmRTZXJ2aWNlKG1JbnRlbnQsIHRoaXMsIENvbnRleHQuQklORF9XQUlWRV9QUklPUklUWQorICAgICAgICAgICAgICAgICAgICB8IENvbnRleHQuQklORF9BTExPV19PT01fTUFOQUdFTUVOVCkpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJGYWlsZWQgdG8gYmluZCAiICsgbUludGVudCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtTW9uaXRvcmluZyA9IHRydWU7CkBAIC02NCw2ICs3MSwxMCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgd2FpdEZvckNvbm5lY3QoKSB7CisgICAgICAgIHdhaXRGb3JDb25uZWN0KG1EZWZhdWx0V2FpdFRpbWUpOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHdhaXRGb3JDb25uZWN0KGxvbmcgdGltZW91dCkgewogICAgICAgICBmaW5hbCBsb25nIGVuZFRpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSArIHRpbWVvdXQ7CiAKQEAgLTg1LDYgKzk2LDEwIEBACiAgICAgICAgIHJldHVybiBtU2VydmljZTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCB3YWl0Rm9yRGlzY29ubmVjdCgpIHsKKyAgICAgICAgd2FpdEZvckRpc2Nvbm5lY3QobURlZmF1bHRXYWl0VGltZSk7CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgd2FpdEZvckRpc2Nvbm5lY3QobG9uZyB0aW1lb3V0KSB7CiAgICAgICAgIGZpbmFsIGxvbmcgZW5kVGltZSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpICsgdGltZW91dDsKIApAQCAtMTIwLDYgKzEzNSwxMCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgYmluZCgpIHsKKyAgICAgICAgYmluZChtRGVmYXVsdFdhaXRUaW1lKTsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCBiaW5kKGxvbmcgdGltZW91dCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIGlmIChtQm91bmQpIHsKQEAgLTEzNyw2ICsxNTYsMTAgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHVuYmluZCgpIHsKKyAgICAgICAgdW5iaW5kKG1EZWZhdWx0V2FpdFRpbWUpOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHVuYmluZChsb25nIHRpbWVvdXQpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBpZiAoIW1Cb3VuZCkgewpAQCAtMTU1LDYgKzE3OCwxMCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgY2xlYW51cCgpIHsKKyAgICAgICAgY2xlYW51cChtRGVmYXVsdFdhaXRUaW1lKTsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCBjbGVhbnVwKGxvbmcgdGltZW91dCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIGlmIChtQm91bmQpIHsKZGlmZiAtLWdpdCBhL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL2FuZHJvaWQvYXBwL2N0cy90b29scy9TZXJ2aWNlUHJvY2Vzc0NvbnRyb2xsZXIuamF2YSBiL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL2FuZHJvaWQvYXBwL2N0cy90b29scy9TZXJ2aWNlUHJvY2Vzc0NvbnRyb2xsZXIuamF2YQppbmRleCA5Y2FkN2EzLi5jMzcyYTM4IDEwMDY0NAotLS0gYS90ZXN0cy9hcHAvc3JjL2FuZHJvaWQvYXBwL2N0cy9hbmRyb2lkL2FwcC9jdHMvdG9vbHMvU2VydmljZVByb2Nlc3NDb250cm9sbGVyLmphdmEKKysrIGIvdGVzdHMvYXBwL3NyYy9hbmRyb2lkL2FwcC9jdHMvYW5kcm9pZC9hcHAvY3RzL3Rvb2xzL1NlcnZpY2VQcm9jZXNzQ29udHJvbGxlci5qYXZhCkBAIC0xNiw3ICsxNiw2IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5hcHAuY3RzLmFuZHJvaWQuYXBwLmN0cy50b29sczsKIAotaW1wb3J0IGFuZHJvaWQuTWFuaWZlc3Q7CiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKQEAgLTI3LDYgKzI2LDggQEAKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CisKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlN5c3RlbVV0aWw7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpAQCAtNDIsNiArNDMsNyBAQAogICAgIGZpbmFsIFN0cmluZyBtTXlQYWNrYWdlTmFtZTsKICAgICBmaW5hbCBJbnRlbnRbXSBtU2VydmljZUludGVudHM7CiAgICAgZmluYWwgU3RyaW5nIG1TZXJ2aWNlUGFja2FnZTsKKyAgICBmaW5hbCBsb25nIG1EZWZhdWx0V2FpdFRpbWU7CiAKICAgICBmaW5hbCBBY3Rpdml0eU1hbmFnZXIgbUFtOwogICAgIGZpbmFsIFBhcmNlbCBtRGF0YTsKQEAgLTU0LDEzICs1NiwyMSBAQAogICAgIHB1YmxpYyBTZXJ2aWNlUHJvY2Vzc0NvbnRyb2xsZXIoQ29udGV4dCBjb250ZXh0LCBJbnN0cnVtZW50YXRpb24gaW5zdHJ1bWVudGF0aW9uLAogICAgICAgICAgICAgU3RyaW5nIG15UGFja2FnZU5hbWUsIEludGVudFtdIHNlcnZpY2VJbnRlbnRzKQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBQYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICB0aGlzKGNvbnRleHQsIGluc3RydW1lbnRhdGlvbiwgbXlQYWNrYWdlTmFtZSwgc2VydmljZUludGVudHMsIDUqMTAwMCk7CisgICAgfQorCisgICAgcHVibGljIFNlcnZpY2VQcm9jZXNzQ29udHJvbGxlcihDb250ZXh0IGNvbnRleHQsIEluc3RydW1lbnRhdGlvbiBpbnN0cnVtZW50YXRpb24sCisgICAgICAgICAgICBTdHJpbmcgbXlQYWNrYWdlTmFtZSwgSW50ZW50W10gc2VydmljZUludGVudHMsIGxvbmcgZGVmYXVsdFdhaXRUaW1lKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBQYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb24gewogICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CiAgICAgICAgIG1JbnN0cnVtZW50YXRpb24gPSBpbnN0cnVtZW50YXRpb247CiAgICAgICAgIG1NeVBhY2thZ2VOYW1lID0gbXlQYWNrYWdlTmFtZTsKICAgICAgICAgbVNlcnZpY2VJbnRlbnRzID0gc2VydmljZUludGVudHM7CiAgICAgICAgIG1TZXJ2aWNlUGFja2FnZSA9IG1TZXJ2aWNlSW50ZW50c1swXS5nZXRDb21wb25lbnQoKS5nZXRQYWNrYWdlTmFtZSgpOwotICAgICAgICBTdHJpbmcgY21kID0gInBtIGdyYW50ICIgKyBtTXlQYWNrYWdlTmFtZSArICIgIiArIE1hbmlmZXN0LnBlcm1pc3Npb24uUEFDS0FHRV9VU0FHRV9TVEFUUzsKLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IFN5c3RlbVV0aWwucnVuU2hlbGxDb21tYW5kKG1JbnN0cnVtZW50YXRpb24sIGNtZCk7CisgICAgICAgIG1EZWZhdWx0V2FpdFRpbWUgPSBkZWZhdWx0V2FpdFRpbWU7CisKKyAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VWlBdXRvbWF0aW9uKCkuZ3JhbnRSdW50aW1lUGVybWlzc2lvbigKKyAgICAgICAgICAgICAgICBtTXlQYWNrYWdlTmFtZSwgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLlBBQ0tBR0VfVVNBR0VfU1RBVFMpOwogICAgICAgICAvKgogICAgICAgICBMb2cuZCgiWFhYWCIsICJJbnZva2U6ICIgKyBjbWQpOwogICAgICAgICBMb2cuZCgiWFhYWCIsICJSZXN1bHQ6ICIgKyByZXN1bHQpOwpAQCAtNzIsMjEgKzgyLDI2IEBACiAgICAgICAgIG1EYXRhID0gUGFyY2VsLm9idGFpbigpOwogICAgICAgICBtQ29ubmVjdGlvbnMgPSBuZXcgU2VydmljZUNvbm5lY3Rpb25IYW5kbGVyW3NlcnZpY2VJbnRlbnRzLmxlbmd0aF07CiAgICAgICAgIGZvciAoaW50IGk9MDsgaTxzZXJ2aWNlSW50ZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgbUNvbm5lY3Rpb25zW2ldID0gbmV3IFNlcnZpY2VDb25uZWN0aW9uSGFuZGxlcihtQ29udGV4dCwgc2VydmljZUludGVudHNbaV0pOworICAgICAgICAgICAgbUNvbm5lY3Rpb25zW2ldID0gbmV3IFNlcnZpY2VDb25uZWN0aW9uSGFuZGxlcihtQ29udGV4dCwgc2VydmljZUludGVudHNbaV0sCisgICAgICAgICAgICAgICAgICAgIG1EZWZhdWx0V2FpdFRpbWUpOwogICAgICAgICB9CiAKICAgICAgICAgQXBwbGljYXRpb25JbmZvIGFwcEluZm8gPSBtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpLmdldEFwcGxpY2F0aW9uSW5mbygKICAgICAgICAgICAgICAgICBtU2VydmljZVBhY2thZ2UsIDApOwogICAgICAgICBtVWlkID0gYXBwSW5mby51aWQ7CiAKLSAgICAgICAgbVVpZEZvcmVncm91bmRMaXN0ZW5lciA9IG5ldyBVaWRJbXBvcnRhbmNlTGlzdGVuZXIoYXBwSW5mby51aWQpOwotICAgICAgICBtQW0uYWRkT25VaWRJbXBvcnRhbmNlTGlzdGVuZXIobVVpZEZvcmVncm91bmRMaXN0ZW5lciwKLSAgICAgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXIuUnVubmluZ0FwcFByb2Nlc3NJbmZvLklNUE9SVEFOQ0VfU0VSVklDRSk7Ci0gICAgICAgIG1VaWRHb25lTGlzdGVuZXIgPSBuZXcgVWlkSW1wb3J0YW5jZUxpc3RlbmVyKGFwcEluZm8udWlkKTsKLSAgICAgICAgbUFtLmFkZE9uVWlkSW1wb3J0YW5jZUxpc3RlbmVyKG1VaWRHb25lTGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyLlJ1bm5pbmdBcHBQcm9jZXNzSW5mby5JTVBPUlRBTkNFX0VNUFRZKTsKKyAgICAgICAgbVVpZEZvcmVncm91bmRMaXN0ZW5lciA9IG5ldyBVaWRJbXBvcnRhbmNlTGlzdGVuZXIobUNvbnRleHQsIGFwcEluZm8udWlkLAorICAgICAgICAgICAgICAgIEFjdGl2aXR5TWFuYWdlci5SdW5uaW5nQXBwUHJvY2Vzc0luZm8uSU1QT1JUQU5DRV9TRVJWSUNFLCBtRGVmYXVsdFdhaXRUaW1lKTsKKyAgICAgICAgbVVpZEZvcmVncm91bmRMaXN0ZW5lci5yZWdpc3RlcigpOworICAgICAgICBtVWlkR29uZUxpc3RlbmVyID0gbmV3IFVpZEltcG9ydGFuY2VMaXN0ZW5lcihtQ29udGV4dCwgYXBwSW5mby51aWQsCisgICAgICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyLlJ1bm5pbmdBcHBQcm9jZXNzSW5mby5JTVBPUlRBTkNFX0VNUFRZLCBtRGVmYXVsdFdhaXRUaW1lKTsKKyAgICAgICAgbVVpZEdvbmVMaXN0ZW5lci5yZWdpc3RlcigpOwogCi0gICAgICAgIG1VaWRXYXRjaGVyID0gbmV3IFdhdGNoVWlkUnVubmVyKGluc3RydW1lbnRhdGlvbiwgYXBwSW5mby51aWQpOworICAgICAgICBtVWlkV2F0Y2hlciA9IG5ldyBXYXRjaFVpZFJ1bm5lcihpbnN0cnVtZW50YXRpb24sIGFwcEluZm8udWlkLCBtRGVmYXVsdFdhaXRUaW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkZW55QmFja2dyb3VuZE9wKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZGVueUJhY2tncm91bmRPcChtRGVmYXVsdFdhaXRUaW1lKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBkZW55QmFja2dyb3VuZE9wKGxvbmcgdGltZW91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTEyMywxMiArMTM4LDIyIEBACiAgICAgICAgIFN0cmluZyByZXN1bHQgPSBTeXN0ZW1VdGlsLnJ1blNoZWxsQ29tbWFuZChtSW5zdHJ1bWVudGF0aW9uLCBjbWQpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHJlbW92ZUZyb21UZW1wV2hpdGVsaXN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGNtZCA9ICJjbWQgZGV2aWNlaWRsZSB0ZW1wd2hpdGVsaXN0IC1yICIgKyBtU2VydmljZVBhY2thZ2U7CisgICAgICAgIFN5c3RlbVV0aWwucnVuU2hlbGxDb21tYW5kKG1JbnN0cnVtZW50YXRpb24sIGNtZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QXBwT3BNb2RlKFN0cmluZyBvcFN0ciwgU3RyaW5nIG1vZGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBjbWQgPSAiY21kIGFwcG9wcyBzZXQgIiArIG1TZXJ2aWNlUGFja2FnZSArICIgIiArIG9wU3RyICsgIiAgIiArIG1vZGU7CisgICAgICAgIFN5c3RlbVV0aWwucnVuU2hlbGxDb21tYW5kKG1JbnN0cnVtZW50YXRpb24sIGNtZCk7CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgY2xlYW51cCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHJlbW92ZUZyb21XaGl0ZWxpc3QoKTsKICAgICAgICAgYWxsb3dCYWNrZ3JvdW5kT3AoKTsKICAgICAgICAgbVVpZFdhdGNoZXIuZmluaXNoKCk7Ci0gICAgICAgIG1BbS5yZW1vdmVPblVpZEltcG9ydGFuY2VMaXN0ZW5lcihtVWlkR29uZUxpc3RlbmVyKTsKLSAgICAgICAgbUFtLnJlbW92ZU9uVWlkSW1wb3J0YW5jZUxpc3RlbmVyKG1VaWRGb3JlZ3JvdW5kTGlzdGVuZXIpOworICAgICAgICBtVWlkR29uZUxpc3RlbmVyLnVucmVnaXN0ZXIoKTsKKyAgICAgICAgbVVpZEZvcmVncm91bmRMaXN0ZW5lci51bnJlZ2lzdGVyKCk7CiAgICAgICAgIG1EYXRhLnJlY3ljbGUoKTsKICAgICB9CiAKQEAgLTE1Miw2ICsxNzcsMTAgQEAKICAgICAgICAgcmV0dXJuIG1VaWRXYXRjaGVyOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIGVuc3VyZVByb2Nlc3NHb25lKCkgeworICAgICAgICBlbnN1cmVQcm9jZXNzR29uZShtRGVmYXVsdFdhaXRUaW1lKTsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCBlbnN1cmVQcm9jZXNzR29uZShsb25nIHRpbWVvdXQpIHsKICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1Db25uZWN0aW9ucy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgbUNvbm5lY3Rpb25zW2ldLmJpbmQodGltZW91dCk7CmRpZmYgLS1naXQgYS90ZXN0cy9hcHAvc3JjL2FuZHJvaWQvYXBwL2N0cy9hbmRyb2lkL2FwcC9jdHMvdG9vbHMvVWlkSW1wb3J0YW5jZUxpc3RlbmVyLmphdmEgYi90ZXN0cy9hcHAvc3JjL2FuZHJvaWQvYXBwL2N0cy9hbmRyb2lkL2FwcC9jdHMvdG9vbHMvVWlkSW1wb3J0YW5jZUxpc3RlbmVyLmphdmEKaW5kZXggM2ViNDAyYS4uMTA1ZmIzOSAxMDA2NDQKLS0tIGEvdGVzdHMvYXBwL3NyYy9hbmRyb2lkL2FwcC9jdHMvYW5kcm9pZC9hcHAvY3RzL3Rvb2xzL1VpZEltcG9ydGFuY2VMaXN0ZW5lci5qYXZhCisrKyBiL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL2FuZHJvaWQvYXBwL2N0cy90b29scy9VaWRJbXBvcnRhbmNlTGlzdGVuZXIuamF2YQpAQCAtMTcsNiArMTcsNyBAQAogcGFja2FnZSBhbmRyb2lkLmFwcC5jdHMuYW5kcm9pZC5hcHAuY3RzLnRvb2xzOwogCiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIApAQCAtMjQsMTggKzI1LDI5IEBACiAgKiBIZWxwZXIgZm9yIG1vbml0b3JpbmcgdGhlIGltcG9ydGFuY2Ugc3RhdGUgb2YgYSB1aWQuCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBVaWRJbXBvcnRhbmNlTGlzdGVuZXIgaW1wbGVtZW50cyBBY3Rpdml0eU1hbmFnZXIuT25VaWRJbXBvcnRhbmNlTGlzdGVuZXIgeworICAgIGZpbmFsIEFjdGl2aXR5TWFuYWdlciBtQW07CiAgICAgZmluYWwgaW50IG1VaWQ7CisgICAgZmluYWwgaW50IG1DdXRQb2ludDsKKyAgICBmaW5hbCBsb25nIG1EZWZhdWx0V2FpdFRpbWU7CiAKICAgICBpbnQgbUxhc3RWYWx1ZSA9IC0xOwogCi0gICAgcHVibGljIFVpZEltcG9ydGFuY2VMaXN0ZW5lcihpbnQgdWlkKSB7CisgICAgcHVibGljIFVpZEltcG9ydGFuY2VMaXN0ZW5lcihDb250ZXh0IGNvbnRleHQsIGludCB1aWQsIGludCBjdXRQb2ludCkgeworICAgICAgICB0aGlzKGNvbnRleHQsIHVpZCwgY3V0UG9pbnQsIDUqMTAwMCk7CisgICAgfQorCisgICAgcHVibGljIFVpZEltcG9ydGFuY2VMaXN0ZW5lcihDb250ZXh0IGNvbnRleHQsIGludCB1aWQsIGludCBjdXRQb2ludCwgbG9uZyBkZWZhdWx0V2FpdFRpbWUpIHsKKyAgICAgICAgbUFtID0gY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKEFjdGl2aXR5TWFuYWdlci5jbGFzcyk7CiAgICAgICAgIG1VaWQgPSB1aWQ7CisgICAgICAgIG1DdXRQb2ludCA9IGN1dFBvaW50OworICAgICAgICBtRGVmYXVsdFdhaXRUaW1lID0gZGVmYXVsdFdhaXRUaW1lOwogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG9uVWlkSW1wb3J0YW5jZShpbnQgdWlkLCBpbnQgaW1wb3J0YW5jZSkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgIExvZy5kKCJYWFhYWCIsICJHb3QgaW1wb3J0YW5jZSBmb3IgdWlkICIgKyB1aWQgKyAiOiAiICsgaW1wb3J0YW5jZSk7CisgICAgICAgICAgICBMb2cuZCgiWFhYWFgiLCAiR290IGltcG9ydGFuY2UgZm9yIHVpZCAiICsgdWlkICsgIiAoY3V0ICIgKyBtQ3V0UG9pbnQKKyAgICAgICAgICAgICAgICAgICAgKyAiKTogIiArIGltcG9ydGFuY2UpOwogICAgICAgICAgICAgaWYgKHVpZCA9PSBtVWlkKSB7CiAgICAgICAgICAgICAgICAgbUxhc3RWYWx1ZSA9IGltcG9ydGFuY2U7CiAgICAgICAgICAgICAgICAgbm90aWZ5QWxsKCk7CkBAIC00Myw2ICs1NSwxOCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXIoKSB7CisgICAgICAgIG1BbS5hZGRPblVpZEltcG9ydGFuY2VMaXN0ZW5lcih0aGlzLCBtQ3V0UG9pbnQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXIoKSB7CisgICAgICAgIG1BbS5yZW1vdmVPblVpZEltcG9ydGFuY2VMaXN0ZW5lcih0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHdhaXRGb3JWYWx1ZShpbnQgbWluVmFsdWUsIGludCBtYXhWYWx1ZSkgeworICAgICAgICByZXR1cm4gd2FpdEZvclZhbHVlKG1pblZhbHVlLCBtYXhWYWx1ZSwgbURlZmF1bHRXYWl0VGltZSk7CisgICAgfQorCiAgICAgcHVibGljIGludCB3YWl0Rm9yVmFsdWUoaW50IG1pblZhbHVlLCBpbnQgbWF4VmFsdWUsIGxvbmcgdGltZW91dCkgewogICAgICAgICBmaW5hbCBsb25nIGVuZFRpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSt0aW1lb3V0OwogCkBAIC01MSwxNCArNzUsMTYgQEAKICAgICAgICAgICAgICAgICBmaW5hbCBsb25nIG5vdyA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwogICAgICAgICAgICAgICAgIGlmIChub3cgPj0gZW5kVGltZSkgewogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaW1lZCBvdXQgd2FpdGluZyBmb3IgaW1wb3J0YW5jZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtaW5WYWx1ZSArICItIiArIG1heFZhbHVlICsgIiwgbGFzdCB3YXMgIiArIG1MYXN0VmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbWluVmFsdWUgKyAiLSIgKyBtYXhWYWx1ZSArICIgKGN1dCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtQ3V0UG9pbnQgKyAiKSwgbGFzdCB3YXMgIiArIG1MYXN0VmFsdWUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICB3YWl0KGVuZFRpbWUtbm93KTsKICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgTG9nLmQoIlhYWFgiLCAid2FpdEZvclZhbHVlICIgKyBtaW5WYWx1ZSArICItIiArIG1heFZhbHVlICsgIjogIiArIG1MYXN0VmFsdWUpOworICAgICAgICAgICAgTG9nLmQoIlhYWFgiLCAid2FpdEZvclZhbHVlICIgKyBtaW5WYWx1ZSArICItIiArIG1heFZhbHVlICsgIiAoY3V0ICIKKyAgICAgICAgICAgICAgICAgICAgKyBtQ3V0UG9pbnQgKyAiKTogIiArIG1MYXN0VmFsdWUpOwogICAgICAgICAgICAgcmV0dXJuIG1MYXN0VmFsdWU7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS90ZXN0cy9hcHAvc3JjL2FuZHJvaWQvYXBwL2N0cy9hbmRyb2lkL2FwcC9jdHMvdG9vbHMvV2F0Y2hVaWRSdW5uZXIuamF2YSBiL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL2FuZHJvaWQvYXBwL2N0cy90b29scy9XYXRjaFVpZFJ1bm5lci5qYXZhCmluZGV4IGUyYWJmNjcuLjRkYWY3OGIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL2FuZHJvaWQvYXBwL2N0cy90b29scy9XYXRjaFVpZFJ1bm5lci5qYXZhCisrKyBiL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL2FuZHJvaWQvYXBwL2N0cy90b29scy9XYXRjaFVpZFJ1bm5lci5qYXZhCkBAIC0zOSw2ICszOSw4IEBACiAgKiBiaXQgQ3RzQXBwVGVzdENhc2VzOkFjdGl2aXR5TWFuYWdlclByb2Nlc3NTdGF0ZVRlc3QKICAqLwogcHVibGljIGNsYXNzIFdhdGNoVWlkUnVubmVyIHsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJXYXRjaFVpZFJ1bm5lciI7CisKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTURfUFJPQ1NUQVRFID0gMDsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTURfQUNUSVZFID0gMTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTURfSURMRSA9IDI7CkBAIC00Niw2ICs0OCwyNyBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENNRF9DQUNIRUQgPSA0OwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENNRF9HT05FID0gNTsKIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRFX1BFUlNJU1RFTlQgPSAiUEVSIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFURV9QRVJTSVNURU5UX1VJID0gIlBFUlUiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRFX1RPUCA9ICJUT1AiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRFX0JPVU5EX0ZHX1NFUlZJQ0UgPSAiQkZHUyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVEVfRkdfU0VSVklDRSA9ICJGR1MiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRFX1RPUF9TTEVFUElORyA9ICJUUFNMIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFURV9JTVBPUlRBTlRfRkcgPSAiSU1QRiI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVEVfSU1QT1JUQU5UX0JHID0gIklNUEIiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRFX1RSQU5TSUVOVF9CRyA9ICJUUk5CIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFURV9CQUNLVVAgPSAiQktVUCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVEVfSEVBVllfV0VJR0hUID0gIkhWWSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVEVfU0VSVklDRSA9ICJTVkMiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRFX1JFQ0VJVkVSID0gIlJDVlIiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRFX0hPTUUgPSAiSE9NRSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVEVfTEFTVCA9ICJMQVNUIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFURV9DQUNIRURfQUNUSVZJVFkgPSAiQ0FDIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFURV9DQUNIRURfQUNUSVZJVFlfQ0xJRU5UID0gIkNBQ0MiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRFX0NBQ0hFRF9SRUNFTlQgPSAiQ1JFIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFURV9DQUNIRURfRU1QVFkgPSAiQ0VNIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFURV9OT05FWElTVEVOVCA9ICJOT05FIjsKKwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBDT01NQU5EX1RPX1NUUklORyA9IG5ldyBTdHJpbmdbXSB7CiAgICAgICAgICAgICAicHJvY3N0YXRlIiwgImFjdGl2ZSIsICJpZGxlIiwgInVuY2FjaGVkIiwgImNhY2hlZCIsICJnb25lIgogICAgIH07CkBAIC01Myw2ICs3Niw3IEBACiAgICAgZmluYWwgSW5zdHJ1bWVudGF0aW9uIG1JbnN0cnVtZW50YXRpb247CiAgICAgZmluYWwgaW50IG1VaWQ7CiAgICAgZmluYWwgU3RyaW5nIG1VaWRTdHI7CisgICAgZmluYWwgbG9uZyBtRGVmYXVsdFdhaXRUaW1lOwogICAgIGZpbmFsIFBhdHRlcm4gbVNwYWNlU3BsaXR0ZXI7CiAgICAgZmluYWwgUGFyY2VsRmlsZURlc2NyaXB0b3IgbVJlYWRGZDsKICAgICBmaW5hbCBGaWxlSW5wdXRTdHJlYW0gbVJlYWRTdHJlYW07CkBAIC02OCwxMiArOTIsMTcgQEAKICAgICBib29sZWFuIG1TdG9wcGluZzsKIAogICAgIHB1YmxpYyBXYXRjaFVpZFJ1bm5lcihJbnN0cnVtZW50YXRpb24gaW5zdHJ1bWVudGF0aW9uLCBpbnQgdWlkKSB7CisgICAgICAgIHRoaXMoaW5zdHJ1bWVudGF0aW9uLCB1aWQsIDUqMTAwMCk7CisgICAgfQorCisgICAgcHVibGljIFdhdGNoVWlkUnVubmVyKEluc3RydW1lbnRhdGlvbiBpbnN0cnVtZW50YXRpb24sIGludCB1aWQsIGxvbmcgZGVmYXVsdFdhaXRUaW1lKSB7CiAgICAgICAgIG1JbnN0cnVtZW50YXRpb24gPSBpbnN0cnVtZW50YXRpb247CiAgICAgICAgIG1VaWQgPSB1aWQ7CiAgICAgICAgIG1VaWRTdHIgPSBJbnRlZ2VyLnRvU3RyaW5nKHVpZCk7CisgICAgICAgIG1EZWZhdWx0V2FpdFRpbWUgPSBkZWZhdWx0V2FpdFRpbWU7CiAgICAgICAgIG1TcGFjZVNwbGl0dGVyID0gUGF0dGVybi5jb21waWxlKCJcXHMrIik7CiAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yW10gcGZkcyA9IGluc3RydW1lbnRhdGlvbi5nZXRVaUF1dG9tYXRpb24oKS5leGVjdXRlU2hlbGxDb21tYW5kUncoCi0gICAgICAgICAgICAgICAgImFtIHdhdGNoLXVpZHMiKTsKKyAgICAgICAgICAgICAgICAiYW0gd2F0Y2gtdWlkcyAtLW9vbSAiICsgdWlkKTsKICAgICAgICAgbVJlYWRGZCA9IHBmZHNbMF07CiAgICAgICAgIG1SZWFkU3RyZWFtID0gbmV3IFBhcmNlbEZpbGVEZXNjcmlwdG9yLkF1dG9DbG9zZUlucHV0U3RyZWFtKG1SZWFkRmQpOwogICAgICAgICBtUmVhZFJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIobVJlYWRTdHJlYW0pKTsKQEAgLTk2LDUzICsxMjUsOTMgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIGV4cGVjdChpbnQgY21kLCBTdHJpbmcgcHJvY1N0YXRlKSB7CisgICAgICAgIGV4cGVjdChjbWQsIHByb2NTdGF0ZSwgbURlZmF1bHRXYWl0VGltZSk7CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgZXhwZWN0KGludCBjbWQsIFN0cmluZyBwcm9jU3RhdGUsIGxvbmcgdGltZW91dCkgewogICAgICAgICBsb25nIHdhaXRVbnRpbCA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpICsgdGltZW91dDsKLSAgICAgICAgU3RyaW5nW10gbGluZSA9IHdhaXRGb3JOZXh0TGluZSh3YWl0VW50aWwpOworICAgICAgICBTdHJpbmdbXSBsaW5lID0gd2FpdEZvck5leHRMaW5lKHdhaXRVbnRpbCwgY21kLCBwcm9jU3RhdGUpOwogICAgICAgICBpZiAoIUNPTU1BTkRfVE9fU1RSSU5HW2NtZF0uZXF1YWxzKGxpbmVbMV0pKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJFeHBlY3RlZCBjbWQgIiArIENPTU1BTkRfVE9fU1RSSU5HW2NtZF0KLSAgICAgICAgICAgICAgICAgICAgKyAiIGJ1dCBuZXh0IHJlcG9ydCB3YXMgIiArIEFycmF5cy50b1N0cmluZyhsaW5lKSk7CisgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkV4cGVjdGVkIGNtZCAiICsgQ09NTUFORF9UT19TVFJJTkdbY21kXQorICAgICAgICAgICAgICAgICAgICArICIgdWlkICIgKyBtVWlkICsgIiBidXQgbmV4dCByZXBvcnQgd2FzICIgKyBBcnJheXMudG9TdHJpbmcobGluZSk7CisgICAgICAgICAgICBMb2cuZChUQUcsIG1zZyk7CisgICAgICAgICAgICBsb2dSZW1haW5pbmdMaW5lcygpOworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihtc2cpOwogICAgICAgICB9CiAgICAgICAgIGlmIChwcm9jU3RhdGUgIT0gbnVsbCAmJiAobGluZS5sZW5ndGggPCAzIHx8ICFwcm9jU3RhdGUuZXF1YWxzKGxpbmVbMl0pKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRXhwZWN0ZWQgcHJvY3N0YXRlICIgKyBwcm9jU3RhdGUKLSAgICAgICAgICAgICAgICAgICAgKyAiIGJ1dCBuZXh0IHJlcG9ydCB3YXMgIiArIEFycmF5cy50b1N0cmluZyhsaW5lKSk7CisgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkV4cGVjdGVkIHByb2NzdGF0ZSAiICsgcHJvY1N0YXRlCisgICAgICAgICAgICAgICAgICAgICsgIiB1aWQgIiArIG1VaWQgKyAiIGJ1dCBuZXh0IHJlcG9ydCB3YXMgIiArIEFycmF5cy50b1N0cmluZyhsaW5lKTsKKyAgICAgICAgICAgIExvZy5kKFRBRywgbXNnKTsKKyAgICAgICAgICAgIGxvZ1JlbWFpbmluZ0xpbmVzKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKG1zZyk7CiAgICAgICAgIH0KKyAgICAgICAgTG9nLmQoVEFHLCAiR290IGV4cGVjdGVkOiAiICsgQXJyYXlzLnRvU3RyaW5nKGxpbmUpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3YWl0Rm9yKGludCBjbWQsIFN0cmluZyBwcm9jU3RhdGUpIHsKKyAgICAgICAgd2FpdEZvcihjbWQsIHByb2NTdGF0ZSwgbURlZmF1bHRXYWl0VGltZSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgd2FpdEZvcihpbnQgY21kLCBTdHJpbmcgcHJvY1N0YXRlLCBsb25nIHRpbWVvdXQpIHsKICAgICAgICAgbG9uZyB3YWl0VW50aWwgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSArIHRpbWVvdXQ7CiAgICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBsaW5lID0gd2FpdEZvck5leHRMaW5lKHdhaXRVbnRpbCk7CisgICAgICAgICAgICBTdHJpbmdbXSBsaW5lID0gd2FpdEZvck5leHRMaW5lKHdhaXRVbnRpbCwgY21kLCBwcm9jU3RhdGUpOwogICAgICAgICAgICAgaWYgKENPTU1BTkRfVE9fU1RSSU5HW2NtZF0uZXF1YWxzKGxpbmVbMV0pKSB7CiAgICAgICAgICAgICAgICAgaWYgKHByb2NTdGF0ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIldhaXRlZCBmb3I6ICIgKyBBcnJheXMudG9TdHJpbmcobGluZSkpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChsaW5lLmxlbmd0aCA+PSAzICYmIHByb2NTdGF0ZS5lcXVhbHMobGluZVsyXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiV2FpdGVkIGZvcjogIiArIEFycmF5cy50b1N0cmluZyhsaW5lKSk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBMb2cuZCgiWFhYWCIsICJTa2lwcGluZyBiZWNhdXNlIHByb2NzdGF0ZSBub3QgIiArIHByb2NTdGF0ZSArICI6ICIKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU2tpcHBpbmcgYmVjYXVzZSBwcm9jc3RhdGUgbm90ICIgKyBwcm9jU3RhdGUgKyAiOiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBBcnJheXMudG9TdHJpbmcobGluZSkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoIlhYWFgiLCAiU2tpcHBpbmcgYmVjYXVzZSBub3QgIiArIENPTU1BTkRfVE9fU1RSSU5HW2NtZF0gKyAiOiAiCisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU2tpcHBpbmcgYmVjYXVzZSBub3QgIiArIENPTU1BTkRfVE9fU1RSSU5HW2NtZF0gKyAiOiAiCiAgICAgICAgICAgICAgICAgICAgICAgICArIEFycmF5cy50b1N0cmluZyhsaW5lKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBTdHJpbmdbXSB3YWl0Rm9yTmV4dExpbmUobG9uZyB3YWl0VW50aWwpIHsKKyAgICB2b2lkIGxvZ1JlbWFpbmluZ0xpbmVzKCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1QZW5kaW5nTGluZXMpIHsKLSAgICAgICAgICAgIHdoaWxlIChtUGVuZGluZ0xpbmVzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgbG9uZyBub3cgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICBpZiAobm93ID49IHdhaXRVbnRpbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaW1lZCBvdXQgd2FpdGluZyBmb3IgbmV4dCBsaW5lIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QZW5kaW5nTGluZXMud2FpdCh3YWl0VW50aWwgLSBub3cpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHdoaWxlIChtUGVuZGluZ0xpbmVzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBTdHJpbmdbXSByZXMgPSBtUGVuZGluZ0xpbmVzLnJlbW92ZSgwKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzWzBdLnN0YXJ0c1dpdGgoIiMiKSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSZW1haW5pbmc6ICIgKyByZXNbMF0pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJlbWFpbmluZzogIiArIEFycmF5cy50b1N0cmluZyhyZXMpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbVBlbmRpbmdMaW5lcy5yZW1vdmUoMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBTdHJpbmdbXSB3YWl0Rm9yTmV4dExpbmUobG9uZyB3YWl0VW50aWwsIGludCBjbWQsIFN0cmluZyBwcm9jU3RhdGUpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtUGVuZGluZ0xpbmVzKSB7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIHdoaWxlIChtUGVuZGluZ0xpbmVzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGxvbmcgbm93ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChub3cgPj0gd2FpdFVudGlsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIlRpbWVkIG91dCB3YWl0aW5nIGZvciBuZXh0IGxpbmU6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiY21kPSIgKyBDT01NQU5EX1RPX1NUUklOR1tjbWRdICsgIiBwcm9jU3RhdGU9IiArIHByb2NTdGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgbXNnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24obXNnKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdMaW5lcy53YWl0KHdhaXRVbnRpbCAtIG5vdyk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTdHJpbmdbXSByZXMgPSBtUGVuZGluZ0xpbmVzLnJlbW92ZSgwKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzWzBdLnN0YXJ0c1dpdGgoIiMiKSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJOb3RlOiAiICsgcmVzWzBdKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtMTY5LDE1ICsyMzgsMTggQEAKICAgICAgICAgICAgIFN0cmluZ1tdIGxpbmU7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIHdoaWxlICgobGluZSA9IHJlYWROZXh0TGluZSgpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsaW5lLmxlbmd0aCA8IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKCJYWFhYWCIsICJTa2lwcGluZzogIiArIG1MYXN0UmVhZExpbmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gY29tbWVudCA9IGxpbmUubGVuZ3RoID09IDEgJiYgbGluZVswXS5zdGFydHNXaXRoKCIjIik7CisgICAgICAgICAgICAgICAgICAgIGlmICghY29tbWVudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmUubGVuZ3RoIDwgMikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlNraXBwaW5nIHRvbyBzaG9ydDogIiArIG1MYXN0UmVhZExpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsaW5lWzBdLmVxdWFscyhtVWlkU3RyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlNraXBwaW5nIGlnbm9yZWQgdWlkOiAiICsgbUxhc3RSZWFkTGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFsaW5lWzBdLmVxdWFscyhtVWlkU3RyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoIlhYWFhYIiwgIlNraXBwaW5nOiAiICsgbUxhc3RSZWFkTGluZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBMb2cuZCgiWFhYWFgiLCAiRW5xdWV1ZWluZzogIiArIG1MYXN0UmVhZExpbmUpOworICAgICAgICAgICAgICAgICAgICAvL0xvZy5kKFRBRywgIkVucXVldWVpbmc6ICIgKyBtTGFzdFJlYWRMaW5lKTsKICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtUGVuZGluZ0xpbmVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVN0b3BwaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwpAQCAtMTg3LDcgKzI1OSw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoIldhdGNoVWlkUnVubmVyIiwgIkZhaWxlZCByZWFkaW5nIiwgZSk7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHJlYWRpbmciLCBlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0xOTYsNiArMjY4LDkgQEAKICAgICAgICAgICAgIGlmIChtTGFzdFJlYWRMaW5lID09IG51bGwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtTGFzdFJlYWRMaW5lLnN0YXJ0c1dpdGgoIiMiKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10geyBtTGFzdFJlYWRMaW5lIH07CisgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gbVNwYWNlU3BsaXR0ZXIuc3BsaXQobUxhc3RSZWFkTGluZSk7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS90ZXN0cy9hc2xyL0FuZHJvaWQubWsgYi90ZXN0cy9hc2xyL0FuZHJvaWQubWsKaW5kZXggMmFiZTJhOC4uZjBhNDAwOCAxMDA2NDQKLS0tIGEvdGVzdHMvYXNsci9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL2FzbHIvQW5kcm9pZC5tawpAQCAtMjQsNiArMjQsOCBAQAogTE9DQUxfU1JDX0ZJTEVTIDo9IFwKICAgICBzcmMvQXNsck1hbGxvY1Rlc3QuY3BwCiAKK0xPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yCisKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogICAgIGxpYmJhc2UgXAogICAgIGxpYnV0aWxzIFwKZGlmZiAtLWdpdCBhL3Rlc3RzL2FzbHIvQW5kcm9pZFRlc3QueG1sIGIvdGVzdHMvYXNsci9BbmRyb2lkVGVzdC54bWwKaW5kZXggOGI5Yzg5My4uYjE3YmNmNiAxMDA2NDQKLS0tIGEvdGVzdHMvYXNsci9BbmRyb2lkVGVzdC54bWwKKysrIGIvdGVzdHMvYXNsci9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBBc2xyIE1hbGxvYyB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0ic2VjdXJpdHkiIC8+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGFyZ2V0cHJlcC5GaWxlUHVzaGVyIj4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0idHJ1ZSIgLz4KQEAgLTI0LDcgKzI1LDcgQEAKICAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1kZXZpY2UtcGF0aCIgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcCIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJtb2R1bGUtbmFtZSIgdmFsdWU9IkN0c0FzbHJNYWxsb2NUZXN0Q2FzZXMiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icnVudGltZS1oaW50IiB2YWx1ZT0iMTBtMzBzIiAvPgotICAgICAgICA8IS0tIHRlc3QtdGltZW91dCB1bml0IGlzIG1zLCB2YWx1ZSA9IDEwIG1pbiAtLT4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC10aW1lb3V0IiB2YWx1ZT0iNjAwMDAwIiAvPgorICAgICAgICA8IS0tIHRlc3QtdGltZW91dCB1bml0IGlzIG1zLCB2YWx1ZSA9IDIwIG1pbiAtLT4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC10aW1lb3V0IiB2YWx1ZT0iMTIwMDAwMCIgLz4KICAgICA8L3Rlc3Q+CiA8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2UvQW5kcm9pZC5tayBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9BbmRyb2lkLm1rCmluZGV4IGVhZjJmMTcuLjg1NTk4ZGEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9BbmRyb2lkLm1rCkBAIC0yMyw5ICsyMywxMCBAQAogTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKIAogTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKLSAgICBhbmRyb2lkLXN1cHBvcnQtYW5ub3RhdGlvbnMgXAotICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwgXAotICAgIGN0c3Rlc3RydW5uZXIgXAorICAgIGFuZHJvaWR4LmFubm90YXRpb25fYW5ub3RhdGlvbiBcCisgICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgXAorICAgIGN0c2RldmljZXV0aWxsZWdhY3ktYXh0IFwKKyAgICBjdHN0ZXN0cnVubmVyLWF4dCBcCiAgICAgdHJ1dGgtcHJlYnVpbHQgXAogICAgIHViLXVpYXV0b21hdG9yIFwKICAgICB0ZXN0bmcgIyBUT0RPOiByZW1vdmUgb25jZSBBbmRyb2lkIG1pZ3JhdGVzIHRvIEpVbml0IDQuMTIsIHdoaWNoIHByb3ZpZGUgYXNzZXJ0VGhyb3dzCkBAIC0zMyw3ICszNCw3IEBACiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKICMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cyBjdHNfaW5zdGFudAogCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzQXV0b0ZpbGxTZXJ2aWNlVGVzdENhc2VzCiAKZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggMjhlM2M5YS4uYzJiYjViMCAxMDA2NDQKLS0tIGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTE1LDkgKzE1LDE1IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBwYWNrYWdlPSJhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMiID4KKyAgICBwYWNrYWdlPSJhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMiCisgICAgYW5kcm9pZDp0YXJnZXRTYW5kYm94VmVyc2lvbj0iMiI+CiAKICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlNZU1RFTV9BTEVSVF9XSU5ET1ciLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLk1BTkFHRV9BQ1RJVklUWV9TVEFDS1MiLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkFDVElWSVRZX0VNQkVERElORyIvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uSU5KRUNUX0VWRU5UUyIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0VYVEVSTkFMX1NUT1JBR0UiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5JTlRFUkFDVF9BQ1JPU1NfVVNFUlMiIC8+CiAKICAgICA8YXBwbGljYXRpb24+CiAKQEAgLTMyLDE4ICszOCwyOCBAQAogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICA8L2FjdGl2aXR5PgogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuUHJlRmlsbGVkTG9naW5BY3Rpdml0eSIgLz4KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLldlbGNvbWVBY3Rpdml0eSIvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuTG9naW5XaXRoQ3VzdG9tSGlnaGxpZ2h0QWN0aXZpdHkiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAc3R5bGUvTXlBdXRvZmlsbGVkSGlnaGxpZ2h0Ii8+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5Mb2dpbldpdGhTdHJpbmdzQWN0aXZpdHkiIC8+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5XZWxjb21lQWN0aXZpdHkiIGFuZHJvaWQ6dGFza0FmZmluaXR5PSIuV2VsY29tZUFjdGl2aXR5Ii8+CiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5WaWV3QXR0cmlidXRlc1Rlc3RBY3Rpdml0eSIgLz4KICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLkF1dGhlbnRpY2F0aW9uQWN0aXZpdHkiIC8+CiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5NYW51YWxBdXRoZW50aWNhdGlvbkFjdGl2aXR5IiAvPgotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuQ2hlY2tvdXRBY3Rpdml0eSIvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuQ2hlY2tvdXRBY3Rpdml0eSIgYW5kcm9pZDp0YXNrQWZmaW5pdHk9Ii5DaGVja291dEFjdGl2aXR5Ii8+CiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5Jbml0aWFsaXplZENoZWNrb3V0QWN0aXZpdHkiIC8+CiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5EYXRlUGlja2VyQ2FsZW5kYXJBY3Rpdml0eSIgLz4KICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLkRhdGVQaWNrZXJTcGlubmVyQWN0aXZpdHkiIC8+CiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5UaW1lUGlja2VyQ2xvY2tBY3Rpdml0eSIgLz4KICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLlRpbWVQaWNrZXJTcGlubmVyQWN0aXZpdHkiIC8+CiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5GYXRBY3Rpdml0eSIgLz4KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLlZpcnR1YWxDb250YWluZXJBY3Rpdml0eSIvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuVmlydHVhbENvbnRhaW5lckFjdGl2aXR5Ij4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDwhLS0gVGhpcyBpbnRlbnQgZmlsdGVyIGlzIG5vdCByZWFsbHkgbmVlZGVkIGJ5IENUUywgYnV0IGl0IG1ha3MgZWFzaWVyIHRvIGxhdW5jaAorICAgICAgICAgICAgICAgICAgICAgdGhpcyBhcHAgZHVyaW5nIENUUyBkZXZlbG9wbWVudC4uLiAtLT4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5PcHRpb25hbFNhdmVBY3Rpdml0eSIgLz4KICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLkFsbEF1dG9maWxsYWJsZVZpZXdzQWN0aXZpdHkiIC8+CiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5HcmlkQWN0aXZpdHkiLz4KQEAgLTY2LDYgKzgyLDE5IEBACiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5XZWJWaWV3QWN0aXZpdHkiLz4KICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLlRyYW1wb2xpbmVXZWxjb21lQWN0aXZpdHkiLz4KICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLkF0dGFjaGVkQ29udGV4dEFjdGl2aXR5Ii8+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5EaWFsb2dMYXVuY2hlckFjdGl2aXR5IiA+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8IS0tIFRoaXMgaW50ZW50IGZpbHRlciBpcyBub3QgcmVhbGx5IG5lZWRlZCBieSBDVFMsIGJ1dCBpdCBtYWtzIGVhc2llciB0byBsYXVuY2gKKyAgICAgICAgICAgICAgICAgICAgIHRoaXMgYXBwIGR1cmluZyBDVFMgZGV2ZWxvcG1lbnQuLi4gLS0+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuTXVsdGlXaW5kb3dMb2dpbkFjdGl2aXR5IiAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuTXVsdGlXaW5kb3dFbXB0eUFjdGl2aXR5IgorICAgICAgICAgICAgYW5kcm9pZDp0YXNrQWZmaW5pdHk9Im5vYm9keS5idXQuRW1wdHlBY3Rpdml0eSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiIC8+CisKICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLlRyYW1wb2xpbmVGb3JSZXN1bHRBY3Rpdml0eSIgLz4KIAogICAgICAgICA8cmVjZWl2ZXIgYW5kcm9pZDpuYW1lPSIuU2VsZkRlc3RydWN0UmVjZWl2ZXIiCkBAIC04NCw2ICsxMTMsMTggQEAKICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KICAgICAgICAgPC9zZXJ2aWNlPgogICAgICAgICA8c2VydmljZQorICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSIuSW5zdHJ1bWVudGVkQXV0b0ZpbGxTZXJ2aWNlQ29tcGF0TW9kZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Ikluc3RydW1lbnRlZEF1dG9GaWxsU2VydmljZUNvbXBhdE1vZGUiCisgICAgICAgICAgICBhbmRyb2lkOnBlcm1pc3Npb249ImFuZHJvaWQucGVybWlzc2lvbi5CSU5EX0FVVE9GSUxMX1NFUlZJQ0UiID4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuQXV0b2ZpbGxTZXJ2aWNlIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgPG1ldGEtZGF0YQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hdXRvZmlsbCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnJlc291cmNlPSJAeG1sL2F1dG9maWxsX3NlcnZpY2VfY29tcGF0X21vZGVfY29uZmlnIj4KKyAgICAgICAgICAgIDwvbWV0YS1kYXRhPgorICAgICAgICA8L3NlcnZpY2U+CisgICAgICAgIDxzZXJ2aWNlCiAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9Ii5Ob09wQXV0b2ZpbGxTZXJ2aWNlIgogICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iTm9PcEF1dG9maWxsU2VydmljZSIKICAgICAgICAgICAgIGFuZHJvaWQ6cGVybWlzc2lvbj0iYW5kcm9pZC5wZXJtaXNzaW9uLkJJTkRfQVVUT0ZJTExfU0VSVklDRSIgPgpAQCAtMTIwLDcgKzE2MSw3IEBACiAgICAgPC9hcHBsaWNhdGlvbj4KIAogICAgIDxpbnN0cnVtZW50YXRpb24KLSAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIGZvciB0aGUgQXV0b0ZpbGwgRnJhbWV3b3JrIEFQSXMuIgogICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cyIgPgogICAgIDwvaW5zdHJ1bWVudGF0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9BbmRyb2lkVGVzdC54bWwKaW5kZXggNzNmZmZkMi4uYTk0ZGE2MyAxMDA2NDQKLS0tIGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL0FuZHJvaWRUZXN0LnhtbAorKysgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2UvQW5kcm9pZFRlc3QueG1sCkBAIC0xNSwxMyArMTUsMTkgQEAKIC0tPgogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQXV0b0ZpbGwgRnJhbWV3b3JrIENUUyB0ZXN0cy4iPgogICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgotICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImZyYW1ld29yayIgLz4KKyAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJhdXRvZmlsbCIgLz4KIAogICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0F1dG9GaWxsU2VydmljZVRlc3RDYXNlcy5hcGsiIC8+CiAgIDwvdGFyZ2V0X3ByZXBhcmVyPgogCisgIDwhLS0gIFRPRE86IHByZXBhcmVyIGJlbG93IHNob3VsZCBiZSBlbmFibGVkIG9ubHkgd2hlbiBydW5uaW5nIGFzIGN0cy1pbnN0YW50IC0tPgorICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlJ1bkNvbW1hbmRUYXJnZXRQcmVwYXJlciI+CisgICAgPG9wdGlvbiBuYW1lPSJydW4tY29tbWFuZCIgdmFsdWU9ImNtZCBhdXRvZmlsbCBzZXQgYmluZC1pbnN0YW50LXNlcnZpY2UtYWxsb3dlZCB0cnVlIiAvPgorICAgIDxvcHRpb24gbmFtZT0idGVhcmRvd24tY29tbWFuZCIgdmFsdWU9ImNtZCBhdXRvZmlsbCBzZXQgYmluZC1pbnN0YW50LXNlcnZpY2UtYWxsb3dlZCBmYWxzZSIgLz4KKyAgPC90YXJnZXRfcHJlcGFyZXI+CisKICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkFuZHJvaWRKVW5pdFRlc3QiPgogICAgIDxvcHRpb24gbmFtZT0icGFja2FnZSIgdmFsdWU9ImFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cyIgLz4KICAgICA8IS0tIDIweCBkZWZhdWx0IHRpbWVvdXQgb2YgNjAwc2VjIC0tPgpkaWZmIC0tZ2l0IGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3Jlcy9kcmF3YWJsZS9teV9kcmF3YWJsZS54bWwgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2UvcmVzL2RyYXdhYmxlL215X2RyYXdhYmxlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjFiMTVhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3Jlcy9kcmF3YWJsZS9teV9kcmF3YWJsZS54bWwKQEAgLTAsMCArMSwxOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICAqCisgICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAqCisgICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgKgorICAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAgLS0+CisKKzxhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuTXlEcmF3YWJsZSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiLz4KZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9yZXMvbGF5b3V0L2RpYWxvZ19sYXVuY2hlcl9hY3Rpdml0eS54bWwgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2UvcmVzL2xheW91dC9kaWFsb2dfbGF1bmNoZXJfYWN0aXZpdHkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZDZkOWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2UvcmVzL2xheW91dC9kaWFsb2dfbGF1bmNoZXJfYWN0aXZpdHkueG1sCkBAIC0wLDAgKzEsMzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp0b29scz0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vdG9vbHMiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmZvY3VzYWJsZT0idHJ1ZSIKKyAgICBhbmRyb2lkOmZvY3VzYWJsZUluVG91Y2hNb2RlPSJ0cnVlIgorICAgIGFuZHJvaWQ6aW1wb3J0YW50Rm9yQXV0b2ZpbGw9Im5vRXhjbHVkZURlc2NlbmRhbnRzIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIiA+CisKKyAgICA8QnV0dG9uCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbGF1bmNoX2J1dHRvbiIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iTGF1bmNoIiAvPgorPC9MaW5lYXJMYXlvdXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3Jlcy9sYXlvdXQvZHVwbGljYXRlX2lkX2xheW91dC54bWwgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2UvcmVzL2xheW91dC9kdXBsaWNhdGVfaWRfbGF5b3V0LnhtbAppbmRleCBhNTY0M2VhLi40ZDQwOWEyIDEwMDY0NAotLS0gYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2UvcmVzL2xheW91dC9kdXBsaWNhdGVfaWRfbGF5b3V0LnhtbAorKysgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2UvcmVzL2xheW91dC9kdXBsaWNhdGVfaWRfbGF5b3V0LnhtbApAQCAtMTcsMTcgKzE3LDIxIEBACiAKIDxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgogICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6Zm9jdXNhYmxlPSJ0cnVlIgorICAgIGFuZHJvaWQ6Zm9jdXNhYmxlSW5Ub3VjaE1vZGU9InRydWUiCiAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCI+CiAKICAgICA8Q2hlY2tCb3gKICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9kdXBsaWNhdGVfaWQiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJjYjEiIC8+IDwhLS0gIHRleHQgaXMgc2V0IGp1c3QgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyAtLT4KIAogICAgIDxDaGVja0JveAogICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2R1cGxpY2F0ZV9pZCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiIC8+CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnRleHQ9ImNiMiIvPiA8IS0tICB0ZXh0IGlzIHNldCBqdXN0IGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgLS0+CiAKIDwvTGluZWFyTGF5b3V0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9yZXMvbGF5b3V0L2VtcHR5LnhtbCBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9yZXMvbGF5b3V0L2VtcHR5LnhtbAppbmRleCA3Njg3NDA4Li45MDZlNTYxIDEwMDY0NAotLS0gYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2UvcmVzL2xheW91dC9lbXB0eS54bWwKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3Jlcy9sYXlvdXQvZW1wdHkueG1sCkBAIC0xNiw1ICsxNiw2IEBACiAgIC0tPgogCiA8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmlkPSJAK2lkL2VtcHR5IgogICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCiAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiIC8+CmRpZmYgLS1naXQgYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2UvcmVzL2xheW91dC9mYXRfYWN0aXZpdHkueG1sIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3Jlcy9sYXlvdXQvZmF0X2FjdGl2aXR5LnhtbAppbmRleCA2ZDQzMzIwLi4yZWZkMzNjIDEwMDY0NAotLS0gYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2UvcmVzL2xheW91dC9mYXRfYWN0aXZpdHkueG1sCisrKyBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9yZXMvbGF5b3V0L2ZhdF9hY3Rpdml0eS54bWwKQEAgLTE3LDYgKzE3LDcgQEAKIAogPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCiAgICAgeG1sbnM6dG9vbHM9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL3Rvb2xzIgorICAgIGFuZHJvaWQ6aWQ9IkAraWQvcm9vdCIKICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgogICAgIGFuZHJvaWQ6Zm9jdXNhYmxlPSJ0cnVlIgpAQCAtMTM2LDQgKzEzNywxMCBAQAogCiAgICAgPC9MaW5lYXJMYXlvdXQ+CiAKKyAgICA8dmlldyBjbGFzcz0iYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkZhdEFjdGl2aXR5JE15VmlldyIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6YXV0b2ZpbGxIaW50cz0iaW1wb3J0YW50QW1JIj4KKyAgICA8L3ZpZXc+CisKIDwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3Jlcy9sYXlvdXQvZ3JpZF9hY3Rpdml0eS54bWwgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2UvcmVzL2xheW91dC9ncmlkX2FjdGl2aXR5LnhtbAppbmRleCAyYWQxMjVjLi43ODg4NzIwIDEwMDY0NAotLS0gYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2UvcmVzL2xheW91dC9ncmlkX2FjdGl2aXR5LnhtbAorKysgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2UvcmVzL2xheW91dC9ncmlkX2FjdGl2aXR5LnhtbApAQCAtMjQsNiArMjQsNyBAQAogICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIiA+CiAKICAgICA8R3JpZExheW91dAorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2dyaWQiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgogICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgpkaWZmIC0tZ2l0IGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3Jlcy9sYXlvdXQvbGlzdF9pdGVtLnhtbCBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9yZXMvbGF5b3V0L2xpc3RfaXRlbS54bWwKaW5kZXggZDdmMDg3NS4uNTAzNjRhMiAxMDA2NDQKLS0tIGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3Jlcy9sYXlvdXQvbGlzdF9pdGVtLnhtbAorKysgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2UvcmVzL2xheW91dC9saXN0X2l0ZW0ueG1sCkBAIC0yMiw2ICsyMiw1IEBACiAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCiAgICAgYW5kcm9pZDpwYWRkaW5nU3RhcnQ9Ij9hbmRyb2lkOmF0dHIvbGlzdFByZWZlcnJlZEl0ZW1QYWRkaW5nU3RhcnQiCiAgICAgYW5kcm9pZDpwYWRkaW5nRW5kPSI/YW5kcm9pZDphdHRyL2xpc3RQcmVmZXJyZWRJdGVtUGFkZGluZ0VuZCIKLSAgICBhbmRyb2lkOm1pbkhlaWdodD0iP2FuZHJvaWQ6YXR0ci9saXN0UHJlZmVycmVkSXRlbUhlaWdodFNtYWxsIgotICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI2ZmZmZmZmZmIj4KKyAgICBhbmRyb2lkOm1pbkhlaWdodD0iP2FuZHJvaWQ6YXR0ci9saXN0UHJlZmVycmVkSXRlbUhlaWdodFNtYWxsIj4KIDwvVGV4dFZpZXc+CmRpZmYgLS1naXQgYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2UvcmVzL2xheW91dC9sb2dpbl9hY3Rpdml0eS54bWwgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2UvcmVzL2xheW91dC9sb2dpbl9hY3Rpdml0eS54bWwKaW5kZXggODc2NTg4Mi4uZWUyMWEwMCAxMDA2NDQKLS0tIGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3Jlcy9sYXlvdXQvbG9naW5fYWN0aXZpdHkueG1sCisrKyBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9yZXMvbGF5b3V0L2xvZ2luX2FjdGl2aXR5LnhtbApAQCAtMzcsNiArMzcsOSBAQAogCiAgICAgICAgIDxFZGl0VGV4dAogICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC91c2VybmFtZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bWluRW1zPSIyIgorICAgICAgICAgICAgYW5kcm9pZDptYXhFbXM9IjUiCisgICAgICAgICAgICBhbmRyb2lkOm1heExlbmd0aD0iMjUiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICBhbmRyb2lkOmltZU9wdGlvbnM9ImZsYWdOb0Z1bGxzY3JlZW4iIC8+CmRpZmYgLS1naXQgYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2UvcmVzL2xheW91dC9sb2dpbl93aXRoX2N1c3RvbV9oaWdobGlnaHRfYWN0aXZpdHkueG1sIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3Jlcy9sYXlvdXQvbG9naW5fd2l0aF9jdXN0b21faGlnaGxpZ2h0X2FjdGl2aXR5LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzkyNmE5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3Jlcy9sYXlvdXQvbG9naW5fd2l0aF9jdXN0b21faGlnaGxpZ2h0X2FjdGl2aXR5LnhtbApAQCAtMCwwICsxLDEwNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnRvb2xzPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS90b29scyIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6Zm9jdXNhYmxlPSJ0cnVlIgorICAgIGFuZHJvaWQ6dGhlbWU9IkBzdHlsZS9NeUF1dG9maWxsZWRIaWdobGlnaHQiCisgICAgYW5kcm9pZDpmb2N1c2FibGVJblRvdWNoTW9kZT0idHJ1ZSIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIgPgorCisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3VzZXJuYW1lX2NvbnRhaW5lciIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiID4KKworICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdXNlcm5hbWVfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkArc3RyaW5nL3VzZXJuYW1lX3N0cmluZyIgLz4KKworICAgICAgICA8RWRpdFRleHQKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdXNlcm5hbWUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIiA+CisKKyAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3Bhc3N3b3JkX2xhYmVsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAK3N0cmluZy9wYXNzd29yZF9zdHJpbmciIC8+CisKKyAgICAgICAgPEVkaXRUZXh0CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3Bhc3N3b3JkIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDppbnB1dFR5cGU9InRleHRQYXNzd29yZCIvPgorICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIgPgorCisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIiA+CisKKyAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9jbGVhciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQ2xlYXIiIC8+CisKKyAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zYXZlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJTYXZlIiAvPgorCisgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbG9naW4iCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkxvZ2luIiAvPgorCisgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2FuY2VsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJDYW5jZWwiIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9vdXRwdXQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPgorCis8L0xpbmVhckxheW91dD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2UvcmVzL2xheW91dC9sb2dpbl93aXRoX3N0cmluZ3NfYWN0aXZpdHkueG1sIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3Jlcy9sYXlvdXQvbG9naW5fd2l0aF9zdHJpbmdzX2FjdGl2aXR5LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjkwNzYxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3Jlcy9sYXlvdXQvbG9naW5fd2l0aF9zdHJpbmdzX2FjdGl2aXR5LnhtbApAQCAtMCwwICsxLDEwNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnRvb2xzPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS90b29scyIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6Zm9jdXNhYmxlPSJ0cnVlIgorICAgIGFuZHJvaWQ6Zm9jdXNhYmxlSW5Ub3VjaE1vZGU9InRydWUiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiID4KKworICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC91c2VybmFtZV9jb250YWluZXIiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIiA+CisKKyAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3VzZXJuYW1lX2xhYmVsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAK3N0cmluZy91c2VybmFtZV9zdHJpbmciIC8+CisKKyAgICAgICAgPEVkaXRUZXh0CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3VzZXJuYW1lIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPgorICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIgPgorCisgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9wYXNzd29yZF9sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQCtzdHJpbmcvcGFzc3dvcmRfc3RyaW5nIiAvPgorCisgICAgICAgIDxFZGl0VGV4dAorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9wYXNzd29yZCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6aW5wdXRUeXBlPSJ0ZXh0UGFzc3dvcmQiLz4KKyAgICA8L0xpbmVhckxheW91dD4KKworICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiID4KKworICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIgPgorCisgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2xlYXIiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkNsZWFyIiAvPgorCisgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc2F2ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iU2F2ZSIgLz4KKworICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2xvZ2luIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJMb2dpbiIgLz4KKworICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2NhbmNlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQ2FuY2VsIiAvPgorICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvb3V0cHV0IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgLz4KKworPC9MaW5lYXJMYXlvdXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3Jlcy9sYXlvdXQvdGhpcmRfbGluZV9vbmx5LnhtbCBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9yZXMvbGF5b3V0L3RoaXJkX2xpbmVfb25seS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI2N2M5NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9yZXMvbGF5b3V0L3RoaXJkX2xpbmVfb25seS54bWwKQEAgLTAsMCArMSwyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICAqCisgICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAqCisgICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgKgorICAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAgLS0+CisKKzxUZXh0VmlldyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGhpcmQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ii8+CmRpZmYgLS1naXQgYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2UvcmVzL2xheW91dC90aHJlZV9ob3Jpem9udGFsX3RleHRfZmllbGRzX2xhc3RfdHdvX2ludmlzaWJsZS54bWwgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2UvcmVzL2xheW91dC90aHJlZV9ob3Jpem9udGFsX3RleHRfZmllbGRzX2xhc3RfdHdvX2ludmlzaWJsZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E5NjM4OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9yZXMvbGF5b3V0L3RocmVlX2hvcml6b250YWxfdGV4dF9maWVsZHNfbGFzdF90d29faW52aXNpYmxlLnhtbApAQCAtMCwwICsxLDQ3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgICoKKyAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgICoKKyAgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAqCisgICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICAtLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KKworICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3N0YXRpY190ZXh0IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJZTzoiLz4KKworICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2ZpcnN0IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIvPgorCisgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvc2Vjb25kIgorICAgICAgICBhbmRyb2lkOnRleHQ9IjJORCwgWSBVIE5PIEhJRERFTj8iCisgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iaW52aXNpYmxlIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIvPgorCisgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGhpcmQiCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iM1JELCBZIFUgTk8gSElEREVOPyIKKyAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJpbnZpc2libGUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ii8+CisKKyAgICA8SW1hZ2VWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvaW1nIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIvPgorPC9MaW5lYXJMYXlvdXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3Jlcy9sYXlvdXQvdHdvX2hvcml6b250YWxfdGV4dF9maWVsZHMueG1sIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3Jlcy9sYXlvdXQvdHdvX2hvcml6b250YWxfdGV4dF9maWVsZHMueG1sCmluZGV4IDk0NGY5MjYuLjc3M2FmYWUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9yZXMvbGF5b3V0L3R3b19ob3Jpem9udGFsX3RleHRfZmllbGRzLnhtbAorKysgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2UvcmVzL2xheW91dC90d29faG9yaXpvbnRhbF90ZXh0X2ZpZWxkcy54bWwKQEAgLTE2LDYgKzE2LDcgQEAKICAgLS0+CiAKIDxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6aWQ9IkAraWQvcGFyZW50IgogICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCiAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CmRpZmYgLS1naXQgYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2UvcmVzL2xheW91dC92aWV3X2F0dHJpYnV0ZV90ZXN0X2FjdGl2aXR5LnhtbCBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9yZXMvbGF5b3V0L3ZpZXdfYXR0cmlidXRlX3Rlc3RfYWN0aXZpdHkueG1sCmluZGV4IGQwM2Q2NWMuLmJjYjdmZjEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9yZXMvbGF5b3V0L3ZpZXdfYXR0cmlidXRlX3Rlc3RfYWN0aXZpdHkueG1sCisrKyBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9yZXMvbGF5b3V0L3ZpZXdfYXR0cmlidXRlX3Rlc3RfYWN0aXZpdHkueG1sCkBAIC02OSwyMSArNjksMjEgQEAKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iMjNweCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjMxcHgiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSIxMXB4IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjM3cHgiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjI5cHgiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjMDBGIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6aW1wb3J0YW50Rm9yQXV0b2ZpbGw9InllcyI+CiAgICAgICAgICAgICAgICAgPEVkaXRUZXh0IGFuZHJvaWQ6aWQ9IkAraWQvdHJpcGxlTmVzdGVkVmlldyIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI0MXB4IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjExcHgiCiAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSI0M3B4IgogICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRjAiCiAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aW1wb3J0YW50Rm9yQXV0b2ZpbGw9InllcyIgLz4KICAgICAgICAgICAgIDwvTGluZWFyTGF5b3V0PgogCiAgICAgICAgICAgICA8RWRpdFRleHQgYW5kcm9pZDppZD0iQCtpZC9zZWNvbmREb3VibGVOZXN0ZWRWaWV3IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNDdweCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjE3cHgiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjUzcHgiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjRjBGIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6aW1wb3J0YW50Rm9yQXV0b2ZpbGw9InllcyIgLz4KZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9yZXMvbGF5b3V0L3ZpcnR1YWxfY29udGFpbmVyX2FjdGl2aXR5LnhtbCBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9yZXMvbGF5b3V0L3ZpcnR1YWxfY29udGFpbmVyX2FjdGl2aXR5LnhtbAppbmRleCAyNTk2ZmJiLi5lMTA1ZDIyIDEwMDY0NAotLS0gYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2UvcmVzL2xheW91dC92aXJ0dWFsX2NvbnRhaW5lcl9hY3Rpdml0eS54bWwKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3Jlcy9sYXlvdXQvdmlydHVhbF9jb250YWluZXJfYWN0aXZpdHkueG1sCkBAIC0xNSw4ICsxNSwzOCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIAotPGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5WaXJ0dWFsQ29udGFpbmVyVmlldyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDppZD0iQCtpZC92aXJ0dWFsX2NvbnRhaW5lcl92aWV3IgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50IgotLz4KKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnRvb2xzPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS90b29scyIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6Zm9jdXNhYmxlPSJ0cnVlIgorICAgIGFuZHJvaWQ6Zm9jdXNhYmxlSW5Ub3VjaE1vZGU9InRydWUiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiID4KKworICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC91c2VybmFtZV9jb250YWluZXIiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIiA+CisKKyAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IlVSTCIgLz4KKworICAgICAgICA8RWRpdFRleHQKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXlfdXJsX2JhciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgLz4KKyAgICAgICAgPEVkaXRUZXh0CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL215X3VybF9iYXIyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPgorICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgPGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5WaXJ0dWFsQ29udGFpbmVyVmlldyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdmlydHVhbF9jb250YWluZXJfdmlldyIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50IgorICAgIC8+Cis8L0xpbmVhckxheW91dD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2UvcmVzL2xheW91dC93ZWJ2aWV3X2FjdGl2aXR5LnhtbCBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9yZXMvbGF5b3V0L3dlYnZpZXdfYWN0aXZpdHkueG1sCmluZGV4IDg0ZWFkNGYuLmM1OWQyZGMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9yZXMvbGF5b3V0L3dlYnZpZXdfYWN0aXZpdHkueG1sCisrKyBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9yZXMvbGF5b3V0L3dlYnZpZXdfYWN0aXZpdHkueG1sCkBAIC0xNCw4ICsxNCw1MSBAQAogICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuTXlXZWJWaWV3ICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDppZD0iQCtpZC93ZWJ2aWV3IgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50IgotLz4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6dG9vbHM9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL3Rvb2xzIgorICAgIGFuZHJvaWQ6aWQ9IkAraWQvcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpmb2N1c2FibGU9InRydWUiCisgICAgYW5kcm9pZDpmb2N1c2FibGVJblRvdWNoTW9kZT0idHJ1ZSIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIgPgorCisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL291dHNpZGVDb250YWluZXIxIgorICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIiA+CisKKyAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9Ik91dHNpZGUgMSIgLz4KKworICAgICAgICA8RWRpdFRleHQKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvb3V0c2lkZTEiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvb3V0c2lkZUNvbnRhaW5lcjIiCisgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiID4KKworICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iT3V0c2lkZSAyIiAvPgorCisgICAgICAgIDxFZGl0VGV4dAorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9vdXRzaWRlMiIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKworICAgIDwhLS0gIFdlYlZpZXcgd2lsbCBiZSBkeW5hbWljYWxseSBhZGRlZCBoZXJlIC0tPgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2UvcmVzL2xheW91dC93ZWxjb21lX2FjdGl2aXR5LnhtbCBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9yZXMvbGF5b3V0L3dlbGNvbWVfYWN0aXZpdHkueG1sCmluZGV4IDI5MmFhY2QuLmE3OTc1MmYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9yZXMvbGF5b3V0L3dlbGNvbWVfYWN0aXZpdHkueG1sCisrKyBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9yZXMvbGF5b3V0L3dlbGNvbWVfYWN0aXZpdHkueG1sCkBAIC0yMiw3ICsyMiw3IEBACiAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiID4KIAogICAgIDxUZXh0VmlldwotICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL291dHB1dCIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC93ZWxjb21lIgogICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKICAgICAgICAgYW5kcm9pZDp0ZXh0PSJXZWxjb21lIHRvIHRoZSBqdW5nbGUhIiAvPgpkaWZmIC0tZ2l0IGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2UvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAppbmRleCA4NzIwYTcxLi43ODVjN2E1IDEwMDY0NAotLS0gYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2UvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAorKysgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2UvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApAQCAtMjYsNCArMjYsNyBAQAogICAgICAgICA8aXRlbT5uZXZlcjwvaXRlbT4KICAgICA8L3N0cmluZy1hcnJheT4KIAorICAgIDxzdHJpbmcgbmFtZT0idXNlcm5hbWVfc3RyaW5nIj5Vc2VybmFtZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGFzc3dvcmRfc3RyaW5nIj5QYXNzd29yZDwvc3RyaW5nPgorCiA8L3Jlc291cmNlcz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2UvcmVzL3ZhbHVlcy9zdHlsZXMueG1sIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmM2OGViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjwhLS0KKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cmVzb3VyY2VzPgorICAgIDxzdHlsZSBuYW1lPSJNeUF1dG9maWxsZWRIaWdobGlnaHQiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmF1dG9maWxsZWRIaWdobGlnaHQiPkBkcmF3YWJsZS9teV9kcmF3YWJsZTwvaXRlbT4KKyAgICA8L3N0eWxlPgorPC9yZXNvdXJjZXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3Jlcy94bWwvYXV0b2ZpbGxfc2VydmljZV9jb21wYXRfbW9kZV9jb25maWcueG1sIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3Jlcy94bWwvYXV0b2ZpbGxfc2VydmljZV9jb21wYXRfbW9kZV9jb25maWcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NTdhNTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2UvcmVzL3htbC9hdXRvZmlsbF9zZXJ2aWNlX2NvbXBhdF9tb2RlX2NvbmZpZy54bWwKQEAgLTAsMCArMSwyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8YXV0b2ZpbGwtc2VydmljZSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICA8Y29tcGF0aWJpbGl0eS1wYWNrYWdlCisgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMiCisgICAgYW5kcm9pZDptYXhMb25nVmVyc2lvbkNvZGU9IjEwMDAwMDAwMDAiIC8+Cis8L2F1dG9maWxsLXNlcnZpY2U+CmRpZmYgLS1naXQgYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9BYnN0cmFjdEF1dG9GaWxsQWN0aXZpdHkuamF2YSBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0Fic3RyYWN0QXV0b0ZpbGxBY3Rpdml0eS5qYXZhCmluZGV4IGVmYzBiMmMuLmE4YTgwOTEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0Fic3RyYWN0QXV0b0ZpbGxBY3Rpdml0eS5qYXZhCisrKyBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0Fic3RyYWN0QXV0b0ZpbGxBY3Rpdml0eS5qYXZhCkBAIC0xNiwxMSArMTYsMTggQEAKIAogcGFja2FnZSBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHM7CiAKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24udHJ1dGguVHJ1dGguYXNzZXJ0VGhhdDsKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24udHJ1dGguVHJ1dGguYXNzZXJ0V2l0aE1lc3NhZ2U7CiAKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CitpbXBvcnQgYW5kcm9pZC52aWV3LlBpeGVsQ29weTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYXV0b2ZpbGwuQXV0b2ZpbGxNYW5hZ2VyOwogCitpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5TeW5jaHJvbm91c1BpeGVsQ29weTsKKwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogCkBAIC0zNSwxNCArNDIsMTQgQEAKICAgICAgKiBSdW4gYW4gYWN0aW9uIGluIHRoZSBVSSB0aHJlYWQsIGFuZCBibG9ja3MgY2FsbGVyIHVudGlsIHRoZSBhY3Rpb24gaXMgZmluaXNoZWQuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgc3luY1J1bk9uVWlUaHJlYWQoUnVubmFibGUgYWN0aW9uKSB7Ci0gICAgICAgIHN5bmNSdW5PblVpVGhyZWFkKGFjdGlvbiwgSGVscGVyLlVJX1RJTUVPVVRfTVMpOworICAgICAgICBzeW5jUnVuT25VaVRocmVhZChhY3Rpb24sIFRpbWVvdXRzLlVJX1RJTUVPVVQubXMoKSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogUnVuIGFuIGFjdGlvbiBpbiB0aGUgVUkgdGhyZWFkLCBhbmQgYmxvY2tzIGNhbGxlciB1bnRpbCB0aGUgYWN0aW9uIGlzIGZpbmlzaGVkIG9yIGl0IHRpbWVzCiAgICAgICogb3V0LgogICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bmNSdW5PblVpVGhyZWFkKFJ1bm5hYmxlIGFjdGlvbiwgaW50IHRpbWVvdXRNcykgeworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bmNSdW5PblVpVGhyZWFkKFJ1bm5hYmxlIGFjdGlvbiwgbG9uZyB0aW1lb3V0TXMpIHsKICAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CiAgICAgICAgIHJ1bk9uVWlUaHJlYWQoKCkgLT4gewogICAgICAgICAgICAgYWN0aW9uLnJ1bigpOwpAQCAtNjQsNyArNzEsMzcgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBUYWtlcyBhIHNjcmVlbnNob3QgZnJvbSB0aGUgd2hvbGUgYWN0aXZpdHkuCisgICAgICoKKyAgICAgKiA8cD48Yj5Ob3RlOjwvYj4gdGhpcyBzY3JlZW5zaG90IG9ubHkgY29udGFpbnMgdGhlIGNvbnRlbnRzIG9mIHRoZSBhY3Rpdml0eSwgaXQgZG9lc24ndAorICAgICAqIGluY2x1ZGUgdGhlIGF1dG9maWxsIFVJczsgaWYgeW91IG5lZWQgdG8gY2hlY2sgdGhhdCwgcGxlYXNlIHVzZQorICAgICAqIHtAbGluayBVaUJvdCN0YWtlU2NyZWVuc2hvdCgpfSBpbnN0ZWFkLgorICAgICAqLworICAgIHB1YmxpYyBCaXRtYXAgdGFrZVNjcmVlbnNob3QoKSB7CisgICAgICAgIHJldHVybiB0YWtlU2NyZWVuc2hvdChmaW5kVmlld0J5SWQoYW5kcm9pZC5SLmlkLmNvbnRlbnQpLmdldFJvb3RWaWV3KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRha2VzIGEgc2NyZWVuc2hvdCBmcm9tIHRoZSBhIHZpZXcuCisgICAgICovCisgICAgcHVibGljIEJpdG1hcCB0YWtlU2NyZWVuc2hvdChWaWV3IHZpZXcpIHsKKyAgICAgICAgZmluYWwgUmVjdCBzcmNSZWN0ID0gbmV3IFJlY3QoKTsKKyAgICAgICAgc3luY1J1bk9uVWlUaHJlYWQoKCkgLT4gdmlldy5nZXRHbG9iYWxWaXNpYmxlUmVjdChzcmNSZWN0KSk7CisgICAgICAgIGZpbmFsIEJpdG1hcCBkZXN0ID0gQml0bWFwLmNyZWF0ZUJpdG1hcCgKKyAgICAgICAgICAgICAgICBzcmNSZWN0LndpZHRoKCksIHNyY1JlY3QuaGVpZ2h0KCksIEJpdG1hcC5Db25maWcuQVJHQl84ODg4KTsKKworICAgICAgICBmaW5hbCBTeW5jaHJvbm91c1BpeGVsQ29weSBjb3B5ID0gbmV3IFN5bmNocm9ub3VzUGl4ZWxDb3B5KCk7CisgICAgICAgIGZpbmFsIGludCBjb3B5UmVzdWx0ID0gY29weS5yZXF1ZXN0KGdldFdpbmRvdygpLCBzcmNSZWN0LCBkZXN0KTsKKyAgICAgICAgYXNzZXJ0VGhhdChjb3B5UmVzdWx0KS5pc0VxdWFsVG8oUGl4ZWxDb3B5LlNVQ0NFU1MpOworCisgICAgICAgIHJldHVybiBkZXN0OworICAgIH0KKworICAgIC8qKgogICAgICAqIFJlZ2lzdGVycyBhbmQgcmV0dXJucyBhIGN1c3RvbSBjYWxsYmFjayBmb3IgYXV0b2ZpbGwgZXZlbnRzLgorICAgICAqCisgICAgICogPHA+Tm90ZTogY2FsbGVyIGRvZXNuJ3QgbmVlZCB0byBjYWxsIHtAbGluayAjdW5yZWdpc3RlckNhbGxiYWNrKCl9LCBpdCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkKKyAgICAgKiB1bnJlZ2lzdGVyZWQgb24ge0BsaW5rICNmaW5pc2goKX0uCiAgICAgICovCiAgICAgcHJvdGVjdGVkIE15QXV0b2ZpbGxDYWxsYmFjayByZWdpc3RlckNhbGxiYWNrKCkgewogICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiYWxyZWFkeSByZWdpc3RlcmVkIikudGhhdChtQ2FsbGJhY2spLmlzTnVsbCgpOwpAQCAtNzUsMTAgKzExMiwyNSBAQAogCiAgICAgLyoqCiAgICAgICogVW5yZWdpc3RlciB0aGUgY2FsbGJhY2sgZnJvbSB0aGUge0BsaW5rIEF1dG9maWxsTWFuYWdlcn0uCisgICAgICoKKyAgICAgKiA8cD5UaGlzIG1ldGhvZCBqdXN0IG5lZWVkIHRvIGJlIGNhbGxlZCB3aGVuIGEgdGVzdCBjYXNlIHdhbnRzIHRvIGV4cGxpY2l0bHkgdGVzdCB0aGUgYmVoYXZpb3IKKyAgICAgKiBvZiB0aGUgYWN0aXZpdHkgd2hlbiB0aGUgY2FsbGJhY2sgaXMgdW5yZWdpc3RlcmVkLgogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIHVucmVnaXN0ZXJDYWxsYmFjaygpIHsKICAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoIm5vdCByZWdpc3RlcmVkIikudGhhdChtQ2FsbGJhY2spLmlzTm90TnVsbCgpOworICAgICAgICB1bnJlZ2lzdGVyTm9uTnVsbENhbGxiYWNrKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHVucmVnaXN0ZXJOb25OdWxsQ2FsbGJhY2soKSB7CiAgICAgICAgIGdldEF1dG9maWxsTWFuYWdlcigpLnVucmVnaXN0ZXJDYWxsYmFjayhtQ2FsbGJhY2spOwogICAgICAgICBtQ2FsbGJhY2sgPSBudWxsOwogICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGZpbmlzaCgpIHsKKyAgICAgICAgaWYgKG1DYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgICAgICB1bnJlZ2lzdGVyTm9uTnVsbENhbGxiYWNrKCk7CisgICAgICAgIH0KKyAgICAgICAgc3VwZXIuZmluaXNoKCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvQWJzdHJhY3REYXRlUGlja2VyQWN0aXZpdHkuamF2YSBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0Fic3RyYWN0RGF0ZVBpY2tlckFjdGl2aXR5LmphdmEKaW5kZXggYWQ3ZmZlOS4uMTU0ZGI3OCAxMDA2NDQKLS0tIGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvQWJzdHJhY3REYXRlUGlja2VyQWN0aXZpdHkuamF2YQorKysgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9BYnN0cmFjdERhdGVQaWNrZXJBY3Rpdml0eS5qYXZhCkBAIC02MiwxNSArNjIsMTUgQEAKIAogICAgICAgICBtRGF0ZVBpY2tlciA9IChEYXRlUGlja2VyKSBmaW5kVmlld0J5SWQoUi5pZC5kYXRlX3BpY2tlcik7CiAKLSAgICAgICAgbURhdGVQaWNrZXIuc2V0T25EYXRlQ2hhbmdlZExpc3RlbmVyKCh2LCB5LCBtLCBkKSAtPiB7Ci0gICAgICAgICAgICB1cGRhdGVPdXRwdXRXaXRoRGF0ZSh5LCBtLCBkKTsKLSAgICAgICAgfSk7CisgICAgICAgIG1EYXRlUGlja2VyLnNldE9uRGF0ZUNoYW5nZWRMaXN0ZW5lcigodiwgeSwgbSwgZCkgLT4gdXBkYXRlT3V0cHV0V2l0aERhdGUoeSwgbSwgZCkpOwogCiAgICAgICAgIG1PdXRwdXQgPSAoRWRpdFRleHQpIGZpbmRWaWV3QnlJZChSLmlkLm91dHB1dCk7CiAgICAgICAgIG1PayA9IChCdXR0b24pIGZpbmRWaWV3QnlJZChSLmlkLm9rKTsKLSAgICAgICAgbU9rLnNldE9uQ2xpY2tMaXN0ZW5lcigodikgLT4gewotICAgICAgICAgICAgb2soKTsKLSAgICAgICAgfSk7CisgICAgICAgIG1Pay5zZXRPbkNsaWNrTGlzdGVuZXIoKHYpIC0+IG9rKCkpOworICAgIH0KKworICAgIHB1YmxpYyBEYXRlUGlja2VyIGdldERhdGVQaWNrZXIoKSB7CisgICAgICAgIHJldHVybiBtRGF0ZVBpY2tlcjsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgdXBkYXRlT3V0cHV0V2l0aERhdGUoaW50IHllYXIsIGludCBtb250aCwgaW50IGRheSkgewpAQCAtMTE2LDE4ICsxMTYsMTQgQEAKICAgICAgKiBWaXNpdHMgdGhlIHtAY29kZSBvdXRwdXR9IGluIHRoZSBVaVRocmVhZC4KICAgICAgKi8KICAgICB2b2lkIG9uT3V0cHV0KFZpc2l0b3I8RWRpdFRleHQ+IHYpIHsKLSAgICAgICAgc3luY1J1bk9uVWlUaHJlYWQoKCkgLT4gewotICAgICAgICAgICAgdi52aXNpdChtT3V0cHV0KTsKLSAgICAgICAgfSk7CisgICAgICAgIHN5bmNSdW5PblVpVGhyZWFkKCgpIC0+IHYudmlzaXQobU91dHB1dCkpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIGRhdGUgaW4gdGhlIHtAbGluayBEYXRlUGlja2VyfS4KICAgICAgKi8KICAgICB2b2lkIHNldERhdGUoaW50IHllYXIsIGludCBtb250aCwgaW50IGRheSkgewotICAgICAgICBzeW5jUnVuT25VaVRocmVhZCgoKSAtPiB7Ci0gICAgICAgICAgICBtRGF0ZVBpY2tlci51cGRhdGVEYXRlKHllYXIsIG1vbnRoLCBkYXkpOwotICAgICAgICB9KTsKKyAgICAgICAgc3luY1J1bk9uVWlUaHJlYWQoKCkgLT4gbURhdGVQaWNrZXIudXBkYXRlRGF0ZSh5ZWFyLCBtb250aCwgZGF5KSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMzUsOSArMTMxLDcgQEAKICAgICAgKi8KICAgICB2b2lkIHRhcE9rKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIG1Pa0xhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOwotICAgICAgICBzeW5jUnVuT25VaVRocmVhZCgoKSAtPiB7Ci0gICAgICAgICAgICBtT2sucGVyZm9ybUNsaWNrKCk7Ci0gICAgICAgIH0pOworICAgICAgICBzeW5jUnVuT25VaVRocmVhZCgoKSAtPiBtT2sucGVyZm9ybUNsaWNrKCkpOwogICAgICAgICBib29sZWFuIGNhbGxlZCA9IG1Pa0xhdGNoLmF3YWl0KE9LX1RJTUVPVVRfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CiAgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJUaW1lb3V0ICglcyBtcykgd2FpdGluZyBmb3IgT0sgYWN0aW9uIiwgT0tfVElNRU9VVF9NUykKICAgICAgICAgICAgICAgICAudGhhdChjYWxsZWQpLmlzVHJ1ZSgpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvQWJzdHJhY3RMb2dpbkFjdGl2aXR5VGVzdENhc2UuamF2YSBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0Fic3RyYWN0TG9naW5BY3Rpdml0eVRlc3RDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVjOWEzZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0Fic3RyYWN0TG9naW5BY3Rpdml0eVRlc3RDYXNlLmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzOworCitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZW91dEV4Y2VwdGlvbjsKKworLyoqCisgKiBCYXNlIGNsYXNzIGZvciB0ZXN0IGNhc2VzIHVzaW5nIHtAbGluayBMb2dpbkFjdGl2aXR5fS4KKyAqLworYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RMb2dpbkFjdGl2aXR5VGVzdENhc2UgZXh0ZW5kcyBBdXRvRmlsbFNlcnZpY2VUZXN0Q2FzZSB7CisgICAgQFJ1bGUKKyAgICBwdWJsaWMgZmluYWwgQXV0b2ZpbGxBY3Rpdml0eVRlc3RSdWxlPExvZ2luQWN0aXZpdHk+IG1BY3Rpdml0eVJ1bGUgPQorICAgICAgICAgICAgbmV3IEF1dG9maWxsQWN0aXZpdHlUZXN0UnVsZTxMb2dpbkFjdGl2aXR5PihMb2dpbkFjdGl2aXR5LmNsYXNzKTsKKworICAgIEBSdWxlCisgICAgcHVibGljIGZpbmFsIEF1dG9maWxsQWN0aXZpdHlUZXN0UnVsZTxDaGVja291dEFjdGl2aXR5PiBtQ2hlY2tvdXRBY3Rpdml0eVJ1bGUgPQorICAgICAgICAgICAgbmV3IEF1dG9maWxsQWN0aXZpdHlUZXN0UnVsZTxDaGVja291dEFjdGl2aXR5PihDaGVja291dEFjdGl2aXR5LmNsYXNzLCBmYWxzZSk7CisKKyAgICBwcm90ZWN0ZWQgTG9naW5BY3Rpdml0eSBtQWN0aXZpdHk7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0QWN0aXZpdHkoKSB7CisgICAgICAgIG1BY3Rpdml0eSA9IG1BY3Rpdml0eVJ1bGUuZ2V0QWN0aXZpdHkoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXF1ZXN0cyBmb2N1cyBvbiB1c2VybmFtZSBhbmQgZXhwZWN0IFdpbmRvdyBldmVudCBoYXBwZW5zLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHJlcXVlc3RGb2N1c09uVXNlcm5hbWUoKSB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiB7CisgICAgICAgIG1VaUJvdC53YWl0Rm9yV2luZG93Q2hhbmdlKCgpIC0+IG1BY3Rpdml0eS5vblVzZXJuYW1lKFZpZXc6OnJlcXVlc3RGb2N1cyksCisgICAgICAgICAgICAgICAgVGltZW91dHMuVUlfVElNRU9VVC5nZXRNYXhWYWx1ZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXF1ZXN0cyBmb2N1cyBvbiB1c2VybmFtZSBhbmQgZXhwZWN0IG5vIFdpbmRvdyBldmVudCBoYXBwZW5zLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHJlcXVlc3RGb2N1c09uVXNlcm5hbWVOb1dpbmRvd0NoYW5nZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIFRPRE86IGRlZmluZSBhIHNtYWxsIHZhbHVlIGluIFRpbWVvdXQKKyAgICAgICAgICAgIG1VaUJvdC53YWl0Rm9yV2luZG93Q2hhbmdlKCgpIC0+IG1BY3Rpdml0eS5vblVzZXJuYW1lKFZpZXc6OnJlcXVlc3RGb2N1cyksCisgICAgICAgICAgICAgICAgICAgIFRpbWVvdXRzLlVJX1RJTUVPVVQubXMoKSk7CisgICAgICAgIH0gY2F0Y2ggKFRpbWVvdXRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIG5vIHdpbmRvdyBldmVudHMhIGxvb2tpbmcgZ29vZAorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkV4cGVjdCBubyB3aW5kb3cgZXZlbnQgd2hlbiBmb2N1c2luZyB0byIKKyAgICAgICAgICAgICAgICArICIgdXNlcm5hbWUsIGJ1dCBldmVudCBoYXBwZW5lZCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcXVlc3RzIGZvY3VzIG9uIHBhc3N3b3JkIGFuZCBleHBlY3QgV2luZG93IGV2ZW50IGhhcHBlbnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcmVxdWVzdEZvY3VzT25QYXNzd29yZCgpIHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIHsKKyAgICAgICAgbVVpQm90LndhaXRGb3JXaW5kb3dDaGFuZ2UoKCkgLT4gbUFjdGl2aXR5Lm9uUGFzc3dvcmQoVmlldzo6cmVxdWVzdEZvY3VzKSwKKyAgICAgICAgICAgICAgICBUaW1lb3V0cy5VSV9USU1FT1VULmdldE1heFZhbHVlKCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvQWJzdHJhY3RUaW1lUGlja2VyQWN0aXZpdHkuamF2YSBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0Fic3RyYWN0VGltZVBpY2tlckFjdGl2aXR5LmphdmEKaW5kZXggODQ4YjNjYy4uYTk5NzU5MCAxMDA2NDQKLS0tIGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvQWJzdHJhY3RUaW1lUGlja2VyQWN0aXZpdHkuamF2YQorKysgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9BYnN0cmFjdFRpbWVQaWNrZXJBY3Rpdml0eS5qYXZhCkBAIC02MiwxNSArNjIsMTEgQEAKIAogICAgICAgICBtVGltZVBpY2tlciA9IChUaW1lUGlja2VyKSBmaW5kVmlld0J5SWQoUi5pZC50aW1lX3BpY2tlcik7CiAKLSAgICAgICAgbVRpbWVQaWNrZXIuc2V0T25UaW1lQ2hhbmdlZExpc3RlbmVyKCh2LCBtLCBoKSAtPiB7Ci0gICAgICAgICAgICB1cGRhdGVPdXRwdXRXaXRoVGltZShtLCBoKTsKLSAgICAgICAgfSk7CisgICAgICAgIG1UaW1lUGlja2VyLnNldE9uVGltZUNoYW5nZWRMaXN0ZW5lcigodiwgbSwgaCkgLT4gdXBkYXRlT3V0cHV0V2l0aFRpbWUobSwgaCkpOwogCiAgICAgICAgIG1PdXRwdXQgPSAoRWRpdFRleHQpIGZpbmRWaWV3QnlJZChSLmlkLm91dHB1dCk7CiAgICAgICAgIG1PayA9IChCdXR0b24pIGZpbmRWaWV3QnlJZChSLmlkLm9rKTsKLSAgICAgICAgbU9rLnNldE9uQ2xpY2tMaXN0ZW5lcigodikgLT4gewotICAgICAgICAgICAgb2soKTsKLSAgICAgICAgfSk7CisgICAgICAgIG1Pay5zZXRPbkNsaWNrTGlzdGVuZXIoKHYpIC0+IG9rKCkpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCB1cGRhdGVPdXRwdXRXaXRoVGltZShpbnQgaG91ciwgaW50IG1pbnV0ZSkgewpAQCAtMTE2LDkgKzExMiw3IEBACiAgICAgICogVmlzaXRzIHRoZSB7QGNvZGUgb3V0cHV0fSBpbiB0aGUgVWlUaHJlYWQuCiAgICAgICovCiAgICAgdm9pZCBvbk91dHB1dChWaXNpdG9yPEVkaXRUZXh0PiB2KSB7Ci0gICAgICAgIHN5bmNSdW5PblVpVGhyZWFkKCgpIC0+IHsKLSAgICAgICAgICAgIHYudmlzaXQobU91dHB1dCk7Ci0gICAgICAgIH0pOworICAgICAgICBzeW5jUnVuT25VaVRocmVhZCgoKSAtPiB2LnZpc2l0KG1PdXRwdXQpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEzNiw5ICsxMzAsNyBAQAogICAgICAqLwogICAgIHZvaWQgdGFwT2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgbU9rTGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7Ci0gICAgICAgIHN5bmNSdW5PblVpVGhyZWFkKCgpIC0+IHsKLSAgICAgICAgICAgIG1Pay5wZXJmb3JtQ2xpY2soKTsKLSAgICAgICAgfSk7CisgICAgICAgIHN5bmNSdW5PblVpVGhyZWFkKCgpIC0+IG1Pay5wZXJmb3JtQ2xpY2soKSk7CiAgICAgICAgIGJvb2xlYW4gY2FsbGVkID0gbU9rTGF0Y2guYXdhaXQoT0tfVElNRU9VVF9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKICAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoIlRpbWVvdXQgKCVzIG1zKSB3YWl0aW5nIGZvciBPSyBhY3Rpb24iLCBPS19USU1FT1VUX01TKQogICAgICAgICAgICAgICAgIC50aGF0KGNhbGxlZCkuaXNUcnVlKCk7CmRpZmYgLS1naXQgYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9BbGxBdXRvZmlsbGFibGVWaWV3c0FjdGl2aXR5LmphdmEgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9BbGxBdXRvZmlsbGFibGVWaWV3c0FjdGl2aXR5LmphdmEKaW5kZXggNzU3YTBkMS4uMTBjYzMyMiAxMDA2NDQKLS0tIGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvQWxsQXV0b2ZpbGxhYmxlVmlld3NBY3Rpdml0eS5qYXZhCisrKyBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0FsbEF1dG9maWxsYWJsZVZpZXdzQWN0aXZpdHkuamF2YQpAQCAtMTcsNyArMTcsNyBAQAogcGFja2FnZSBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHM7CiAKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk51bGxhYmxlOwogCiBwdWJsaWMgY2xhc3MgQWxsQXV0b2ZpbGxhYmxlVmlld3NBY3Rpdml0eSBleHRlbmRzIEFic3RyYWN0QXV0b0ZpbGxBY3Rpdml0eSB7CiAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9BbnRpVHJpbW1lclRleHRXYXRjaGVyLmphdmEgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9BbnRpVHJpbW1lclRleHRXYXRjaGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY3MTNkMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0FudGlUcmltbWVyVGV4dFdhdGNoZXIuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzOworCitpbXBvcnQgYW5kcm9pZC50ZXh0LkVkaXRhYmxlOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0V2F0Y2hlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5FZGl0VGV4dDsKKworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCisvKioKKyAqIEEge0BsaW5rIFRleHRXYXRjaGVyfSB0aGF0IGFwcGVuZHMgcG91bmQgc2lnbnMgKHtAY29kZSAjfSBhdCB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgdGhlIHRleHQuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBBbnRpVHJpbW1lclRleHRXYXRjaGVyIGltcGxlbWVudHMgVGV4dFdhdGNoZXIgeworCisgICAgLyoqCisgICAgICogUmVnZXggdXNlZCB0byByZXZlcnQgYSBTdHJpbmcgdGhhdCB3YXMgImFudGktdHJpbW1lZCIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIFRSSU1NRVJfUEFUVEVSTiA9IFBhdHRlcm4uY29tcGlsZSgiIyguKikjIik7CisKKyAgICBwcml2YXRlIGZpbmFsIEVkaXRUZXh0IG1WaWV3OworCisgICAgcHVibGljIEFudGlUcmltbWVyVGV4dFdhdGNoZXIoRWRpdFRleHQgdmlldykgeworICAgICAgICBtVmlldyA9IHZpZXc7CisgICAgICAgIG1WaWV3LmFkZFRleHRDaGFuZ2VkTGlzdGVuZXIodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25UZXh0Q2hhbmdlZChDaGFyU2VxdWVuY2UgcywgaW50IHN0YXJ0LCBpbnQgYmVmb3JlLCBpbnQgY291bnQpIHsKKyAgICAgICAgbVZpZXcucmVtb3ZlVGV4dENoYW5nZWRMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgbVZpZXcuc2V0VGV4dCgiIyIgKyBzICsgIiMiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBiZWZvcmVUZXh0Q2hhbmdlZChDaGFyU2VxdWVuY2UgcywgaW50IHN0YXJ0LCBpbnQgY291bnQsIGludCBhZnRlcikgeworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFmdGVyVGV4dENoYW5nZWQoRWRpdGFibGUgcykgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0F0dGFjaGVkQ29udGV4dEFjdGl2aXR5VGVzdC5qYXZhIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvQXR0YWNoZWRDb250ZXh0QWN0aXZpdHlUZXN0LmphdmEKaW5kZXggNDVmNzI2NC4uNTA1MjZkZCAxMDA2NDQKLS0tIGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvQXR0YWNoZWRDb250ZXh0QWN0aXZpdHlUZXN0LmphdmEKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvQXR0YWNoZWRDb250ZXh0QWN0aXZpdHlUZXN0LmphdmEKQEAgLTU2LDcgKzU2LDcgQEAKICAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CiAKICAgICAgICAgLy8gU2VsZWN0IGRhdGFzZXQKLSAgICAgICAgc1VpQm90LnNlbGVjdERhdGFzZXQoImZpbGwgbWUiKTsKKyAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQoImZpbGwgbWUiKTsKIAogICAgICAgICAvLyBBc3NlcnQgcmVzdWx0cwogICAgICAgICBmaWxsRXhwZWN0YXRpb24uYXNzZXJ0QXV0b0ZpbGxlZCgpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvQXV0aGVudGljYXRpb25BY3Rpdml0eS5qYXZhIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvQXV0aGVudGljYXRpb25BY3Rpdml0eS5qYXZhCmluZGV4IDU3MGRlNGUuLjYyMDcyYzMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0F1dGhlbnRpY2F0aW9uQWN0aXZpdHkuamF2YQorKysgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9BdXRoZW50aWNhdGlvbkFjdGl2aXR5LmphdmEKQEAgLTUwLDYgKzUwLDEzIEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0RBVEFTRVRfSUQgPSAiZGF0YXNldF9pZCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1JFU1BPTlNFX0lEID0gInJlc3BvbnNlX2lkIjsKIAorICAgIC8qKgorICAgICAqIFdoZW4gbGF1bmNoZWQgd2l0aCB0aGlzIGludGVudCwgaXQgd2lsbCBwYXNzIGl0IGJhY2sgdG8gdGhlCisgICAgICoge0BsaW5rIEF1dG9maWxsTWFuYWdlciNFWFRSQV9DTElFTlRfU1RBVEV9IG9mIHRoZSByZXN1bHQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX09VVFBVVF9DTElFTlRfU1RBVEUgPSAib3V0cHV0X2NsaWVudF9zdGF0ZSI7CisKKwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfV0FJVF9GT1JfTEFUQ0ggPSAxOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgQnVuZGxlIHNEYXRhOwpAQCAtODQsMTAgKzkxLDE1IEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBJbnRlbnRTZW5kZXIgY3JlYXRlU2VuZGVyKENvbnRleHQgY29udGV4dCwgaW50IGlkLAogICAgICAgICAgICAgQ2FubmVkRGF0YXNldCBkYXRhc2V0KSB7CisgICAgICAgIHJldHVybiBjcmVhdGVTZW5kZXIoY29udGV4dCwgaWQsIGRhdGFzZXQsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgSW50ZW50U2VuZGVyIGNyZWF0ZVNlbmRlcihDb250ZXh0IGNvbnRleHQsIGludCBpZCwKKyAgICAgICAgICAgIENhbm5lZERhdGFzZXQgZGF0YXNldCwgQnVuZGxlIG91dENsaWVudFN0YXRlKSB7CiAgICAgICAgIFByZWNvbmRpdGlvbnMuY2hlY2tBcmd1bWVudChpZCA+IDAsICJpZCBtdXN0IGJlIHBvc2l0aXZlIik7CiAgICAgICAgIFByZWNvbmRpdGlvbnMuY2hlY2tTdGF0ZShzRGF0YXNldHMuZ2V0KGlkKSA9PSBudWxsLCAiYWxyZWFkeSBoYXZlIGlkIik7CiAgICAgICAgIHNEYXRhc2V0cy5wdXQoaWQsIGRhdGFzZXQpOwotICAgICAgICByZXR1cm4gY3JlYXRlU2VuZGVyKGNvbnRleHQsIEVYVFJBX0RBVEFTRVRfSUQsIGlkKTsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZVNlbmRlcihjb250ZXh0LCBFWFRSQV9EQVRBU0VUX0lELCBpZCwgb3V0Q2xpZW50U3RhdGUpOwogICAgIH0KIAogICAgIC8qKgpAQCAtOTUsMTUgKzEwNywyNSBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgSW50ZW50U2VuZGVyIGNyZWF0ZVNlbmRlcihDb250ZXh0IGNvbnRleHQsIGludCBpZCwKICAgICAgICAgICAgIENhbm5lZEZpbGxSZXNwb25zZSByZXNwb25zZSkgeworICAgICAgICByZXR1cm4gY3JlYXRlU2VuZGVyKGNvbnRleHQsIGlkLCByZXNwb25zZSwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBJbnRlbnRTZW5kZXIgY3JlYXRlU2VuZGVyKENvbnRleHQgY29udGV4dCwgaW50IGlkLAorICAgICAgICAgICAgQ2FubmVkRmlsbFJlc3BvbnNlIHJlc3BvbnNlLCBCdW5kbGUgb3V0RGF0YSkgewogICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrQXJndW1lbnQoaWQgPiAwLCAiaWQgbXVzdCBiZSBwb3NpdGl2ZSIpOwogICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrU3RhdGUoc1Jlc3BvbnNlcy5nZXQoaWQpID09IG51bGwsICJhbHJlYWR5IGhhdmUgaWQiKTsKICAgICAgICAgc1Jlc3BvbnNlcy5wdXQoaWQsIHJlc3BvbnNlKTsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVNlbmRlcihjb250ZXh0LCBFWFRSQV9SRVNQT05TRV9JRCwgaWQpOworICAgICAgICByZXR1cm4gY3JlYXRlU2VuZGVyKGNvbnRleHQsIEVYVFJBX1JFU1BPTlNFX0lELCBpZCwgb3V0RGF0YSk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgSW50ZW50U2VuZGVyIGNyZWF0ZVNlbmRlcihDb250ZXh0IGNvbnRleHQsIFN0cmluZyBleHRyYU5hbWUsIGludCBpZCkgeworICAgIHByaXZhdGUgc3RhdGljIEludGVudFNlbmRlciBjcmVhdGVTZW5kZXIoQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgZXh0cmFOYW1lLCBpbnQgaWQsCisgICAgICAgICAgICBCdW5kbGUgb3V0Q2xpZW50U3RhdGUpIHsKICAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoY29udGV4dCwgQXV0aGVudGljYXRpb25BY3Rpdml0eS5jbGFzcyk7CiAgICAgICAgIGludGVudC5wdXRFeHRyYShleHRyYU5hbWUsIGlkKTsKKyAgICAgICAgaWYgKG91dENsaWVudFN0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIkNyZWF0ZSB3aXRoICIgKyBvdXRDbGllbnRTdGF0ZSArICIgYXMgIiArIEVYVFJBX09VVFBVVF9DTElFTlRfU1RBVEUpOworICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKEVYVFJBX09VVFBVVF9DTElFTlRfU1RBVEUsIG91dENsaWVudFN0YXRlKTsKKyAgICAgICAgfQogICAgICAgICBmaW5hbCBQZW5kaW5nSW50ZW50IHBlbmRpbmdJbnRlbnQgPSBQZW5kaW5nSW50ZW50LmdldEFjdGl2aXR5KGNvbnRleHQsIGlkLCBpbnRlbnQsIDApOwogICAgICAgICBzUGVuZGluZ0ludGVudHMuYWRkKHBlbmRpbmdJbnRlbnQpOwogICAgICAgICByZXR1cm4gcGVuZGluZ0ludGVudC5nZXRJbnRlbnRTZW5kZXIoKTsKQEAgLTIxMyw2ICsyMzUsMTMgQEAKICAgICAgICAgLy8gUGFzcyBvbiB0aGUgYXV0aCByZXN1bHQKICAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoKTsKICAgICAgICAgaW50ZW50LnB1dEV4dHJhKEF1dG9maWxsTWFuYWdlci5FWFRSQV9BVVRIRU5USUNBVElPTl9SRVNVTFQsIHJlc3VsdCk7CisKKyAgICAgICAgZmluYWwgQnVuZGxlIG91dENsaWVudFN0YXRlID0gZ2V0SW50ZW50KCkuZ2V0QnVuZGxlRXh0cmEoRVhUUkFfT1VUUFVUX0NMSUVOVF9TVEFURSk7CisgICAgICAgIGlmIChvdXRDbGllbnRTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJBZGRpbmcgIiArIG91dENsaWVudFN0YXRlICsgIiBhcyAiICsgQXV0b2ZpbGxNYW5hZ2VyLkVYVFJBX0NMSUVOVF9TVEFURSk7CisgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoQXV0b2ZpbGxNYW5hZ2VyLkVYVFJBX0NMSUVOVF9TVEFURSwgb3V0Q2xpZW50U3RhdGUpOworICAgICAgICB9CisKICAgICAgICAgZmluYWwgaW50IHJlc3VsdENvZGU7CiAgICAgICAgIHN5bmNocm9uaXplZCAoc0xvY2spIHsKICAgICAgICAgICAgIHJlc3VsdENvZGUgPSBzUmVzdWx0Q29kZTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0F1dGhlbnRpY2F0aW9uVGVzdC5qYXZhIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvQXV0aGVudGljYXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUzMzA4ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0F1dGhlbnRpY2F0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTIwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLkFjdGl2aXR5LlJFU1VMVF9DQU5DRUxFRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuQWN0aXZpdHkuUkVTVUxUX09LOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSGVscGVyLklEX1BBU1NXT1JEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSGVscGVyLklEX1VTRVJOQU1FOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSGVscGVyLlVOVVNFRF9BVVRPRklMTF9WQUxVRTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5hc3NlcnRUZXh0QW5kVmFsdWU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5IZWxwZXIuZmluZE5vZGVCeVJlc291cmNlSWQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5Mb2dpbkFjdGl2aXR5LmdldFdlbGNvbWVNZXNzYWdlOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuU2F2ZUluZm8uU0FWRV9EQVRBX1RZUEVfUEFTU1dPUkQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5WaWV3LklNUE9SVEFOVF9GT1JfQVVUT0ZJTExfTk87CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24udHJ1dGguVHJ1dGguYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24udHJ1dGguVHJ1dGguYXNzZXJ0V2l0aE1lc3NhZ2U7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5hc3Npc3QuQXNzaXN0U3RydWN0dXJlLlZpZXdOb2RlOworaW1wb3J0IGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5DYW5uZWRGaWxsUmVzcG9uc2UuQ2FubmVkRGF0YXNldDsKK2ltcG9ydCBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSW5zdHJ1bWVudGVkQXV0b0ZpbGxTZXJ2aWNlLlNhdmVSZXF1ZXN0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRTZW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLlVpT2JqZWN0MjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYXV0b2ZpbGwuQXV0b2ZpbGxWYWx1ZTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKK3B1YmxpYyBjbGFzcyBBdXRoZW50aWNhdGlvblRlc3QgZXh0ZW5kcyBBYnN0cmFjdExvZ2luQWN0aXZpdHlUZXN0Q2FzZSB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REYXRhc2V0QXV0aFR3b0ZpZWxkcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkYXRhc2V0QXV0aFR3b0ZpZWxkcyhmYWxzZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gdGVzdERhdGFzZXRBdXRoVHdvRmllbGRzKCkgaXMgZW5vdWdoIHRvIHRlc3QgZXBoZW1lcmFsIGFwcHMgc3VwcG9ydAorICAgIHB1YmxpYyB2b2lkIHRlc3REYXRhc2V0QXV0aFR3b0ZpZWxkc1VzZXJDYW5jZWxzRmlyc3RBdHRlbXB0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGRhdGFzZXRBdXRoVHdvRmllbGRzKHRydWUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkYXRhc2V0QXV0aFR3b0ZpZWxkcyhib29sZWFuIGNhbmNlbEZpcnN0QXR0ZW1wdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFNldCBzZXJ2aWNlLgorICAgICAgICBlbmFibGVTZXJ2aWNlKCk7CisgICAgICAgIGZpbmFsIE15QXV0b2ZpbGxDYWxsYmFjayBjYWxsYmFjayA9IG1BY3Rpdml0eS5yZWdpc3RlckNhbGxiYWNrKCk7CisKKyAgICAgICAgLy8gUHJlcGFyZSB0aGUgYXV0aGVudGljYXRlZCByZXNwb25zZQorICAgICAgICBmaW5hbCBJbnRlbnRTZW5kZXIgYXV0aGVudGljYXRpb24gPSBBdXRoZW50aWNhdGlvbkFjdGl2aXR5LmNyZWF0ZVNlbmRlcihtQ29udGV4dCwgMSwKKyAgICAgICAgICAgICAgICBuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgImR1ZGUiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1BBU1NXT1JELCAic3dlZXQiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIC8vIENvbmZpZ3VyZSB0aGUgc2VydmljZSBiZWhhdmlvcgorICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5hZGREYXRhc2V0KG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1VTRVJOQU1FLCBVTlVTRURfQVVUT0ZJTExfVkFMVUUpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfUEFTU1dPUkQsIFVOVVNFRF9BVVRPRklMTF9WQUxVRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJUYXAgdG8gYXV0aCBkYXRhc2V0IikpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0QXV0aGVudGljYXRpb24oYXV0aGVudGljYXRpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gU2V0IGV4cGVjdGF0aW9uIGZvciB0aGUgYWN0aXZpdHkKKyAgICAgICAgbUFjdGl2aXR5LmV4cGVjdEF1dG9GaWxsKCJkdWRlIiwgInN3ZWV0Iik7CisKKyAgICAgICAgLy8gVHJpZ2dlciBhdXRvLWZpbGwuCisgICAgICAgIHJlcXVlc3RGb2N1c09uVXNlcm5hbWUoKTsKKworICAgICAgICAvLyBXYWl0IGZvciBvbkZpbGwoKSBiZWZvcmUgcHJvY2VlZGluZy4KKyAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CisgICAgICAgIGZpbmFsIFZpZXcgdXNlcm5hbWUgPSBtQWN0aXZpdHkuZ2V0VXNlcm5hbWUoKTsKKyAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlTaG93bkV2ZW50KHVzZXJuYW1lKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJUYXAgdG8gYXV0aCBkYXRhc2V0Iik7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIFVJIGlzIHNob3cgb24gMm5kIGZpZWxkIGFzIHdlbGwKKyAgICAgICAgZmluYWwgVmlldyBwYXNzd29yZCA9IG1BY3Rpdml0eS5nZXRQYXNzd29yZCgpOworICAgICAgICByZXF1ZXN0Rm9jdXNPblBhc3N3b3JkKCk7CisgICAgICAgIGNhbGxiYWNrLmFzc2VydFVpSGlkZGVuRXZlbnQodXNlcm5hbWUpOworICAgICAgICBjYWxsYmFjay5hc3NlcnRVaVNob3duRXZlbnQocGFzc3dvcmQpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlRhcCB0byBhdXRoIGRhdGFzZXQiKTsKKworICAgICAgICAvLyBOb3cgdGFwIG9uIDFzdCBmaWVsZCB0byBzaG93IGl0IGFnYWluLi4uCisgICAgICAgIHJlcXVlc3RGb2N1c09uVXNlcm5hbWUoKTsKKyAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlIaWRkZW5FdmVudChwYXNzd29yZCk7CisgICAgICAgIGNhbGxiYWNrLmFzc2VydFVpU2hvd25FdmVudCh1c2VybmFtZSk7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cygiVGFwIHRvIGF1dGggZGF0YXNldCIpOworCisgICAgICAgIGlmIChjYW5jZWxGaXJzdEF0dGVtcHQpIHsKKyAgICAgICAgICAgIC8vIFRyaWdnZXIgdGhlIGF1dGggZGlhbG9nLCBidXQgZW11bGF0ZSBjYW5jZWwuCisgICAgICAgICAgICBBdXRoZW50aWNhdGlvbkFjdGl2aXR5LnNldFJlc3VsdENvZGUoUkVTVUxUX0NBTkNFTEVEKTsKKyAgICAgICAgICAgIG1VaUJvdC5zZWxlY3REYXRhc2V0KCJUYXAgdG8gYXV0aCBkYXRhc2V0Iik7CisgICAgICAgICAgICBjYWxsYmFjay5hc3NlcnRVaUhpZGRlbkV2ZW50KHVzZXJuYW1lKTsKKyAgICAgICAgICAgIGNhbGxiYWNrLmFzc2VydFVpU2hvd25FdmVudCh1c2VybmFtZSk7CisgICAgICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlRhcCB0byBhdXRoIGRhdGFzZXQiKTsKKworICAgICAgICAgICAgLy8gTWFrZSBzdXJlIGl0J3Mgc3RpbGwgc2hvd24gb24gb3RoZXIgZmllbGRzLi4uCisgICAgICAgICAgICByZXF1ZXN0Rm9jdXNPblBhc3N3b3JkKCk7CisgICAgICAgICAgICBjYWxsYmFjay5hc3NlcnRVaUhpZGRlbkV2ZW50KHVzZXJuYW1lKTsKKyAgICAgICAgICAgIGNhbGxiYWNrLmFzc2VydFVpU2hvd25FdmVudChwYXNzd29yZCk7CisgICAgICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlRhcCB0byBhdXRoIGRhdGFzZXQiKTsKKworICAgICAgICAgICAgLy8gVGFwIG9uIDFzdCBmaWVsZCB0byBzaG93IGl0IGFnYWluLi4uCisgICAgICAgICAgICByZXF1ZXN0Rm9jdXNPblVzZXJuYW1lKCk7CisgICAgICAgICAgICBjYWxsYmFjay5hc3NlcnRVaUhpZGRlbkV2ZW50KHBhc3N3b3JkKTsKKyAgICAgICAgICAgIGNhbGxiYWNrLmFzc2VydFVpU2hvd25FdmVudCh1c2VybmFtZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyAuLi5hbmQgc2VsZWN0IGl0IHRoaXMgdGltZQorICAgICAgICBBdXRoZW50aWNhdGlvbkFjdGl2aXR5LnNldFJlc3VsdENvZGUoUkVTVUxUX09LKTsKKyAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQoIlRhcCB0byBhdXRoIGRhdGFzZXQiKTsKKyAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlIaWRkZW5FdmVudCh1c2VybmFtZSk7CisgICAgICAgIG1VaUJvdC5hc3NlcnROb0RhdGFzZXRzKCk7CisKKyAgICAgICAgLy8gQ2hlY2sgdGhlIHJlc3VsdHMuCisgICAgICAgIG1BY3Rpdml0eS5hc3NlcnRBdXRvRmlsbGVkKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gdGVzdERhdGFzZXRBdXRoVHdvRmllbGRzKCkgaXMgZW5vdWdoIHRvIHRlc3QgZXBoZW1lcmFsIGFwcHMgc3VwcG9ydAorICAgIHB1YmxpYyB2b2lkIHRlc3REYXRhc2V0QXV0aFR3b0ZpZWxkc1JlcGxhY2VSZXNwb25zZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBTZXQgc2VydmljZS4KKyAgICAgICAgZW5hYmxlU2VydmljZSgpOworICAgICAgICBmaW5hbCBNeUF1dG9maWxsQ2FsbGJhY2sgY2FsbGJhY2sgPSBtQWN0aXZpdHkucmVnaXN0ZXJDYWxsYmFjaygpOworCisgICAgICAgIC8vIFByZXBhcmUgdGhlIGF1dGhlbnRpY2F0ZWQgcmVzcG9uc2UKKyAgICAgICAgZmluYWwgSW50ZW50U2VuZGVyIGF1dGhlbnRpY2F0aW9uID0gQXV0aGVudGljYXRpb25BY3Rpdml0eS5jcmVhdGVTZW5kZXIobUNvbnRleHQsIDEsCisgICAgICAgICAgICAgICAgbmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkuYWRkRGF0YXNldCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfVVNFUk5BTUUsICJkdWRlIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1BBU1NXT1JELCAic3dlZXQiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiRGF0YXNldCIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAvLyBTZXQgdXAgdGhlIGF1dGhlbnRpY2F0aW9uIHJlc3BvbnNlIGNsaWVudCBzdGF0ZQorICAgICAgICBmaW5hbCBCdW5kbGUgYXV0aGVudGlvbkNsaWVudFN0YXRlID0gbmV3IEJ1bmRsZSgpOworICAgICAgICBhdXRoZW50aW9uQ2xpZW50U3RhdGUucHV0Q2hhclNlcXVlbmNlKCJjbGllbnRTdGF0ZUtleTEiLCAiY2xpZW50U3RhdGVWYWx1ZTEiKTsKKworICAgICAgICAvLyBDb25maWd1cmUgdGhlIHNlcnZpY2UgYmVoYXZpb3IKKyAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UobmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuYWRkRGF0YXNldChuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgKEF1dG9maWxsVmFsdWUpIG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfUEFTU1dPUkQsIChBdXRvZmlsbFZhbHVlKSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oIlRhcCB0byBhdXRoIGRhdGFzZXQiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRBdXRoZW50aWNhdGlvbihhdXRoZW50aWNhdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQorICAgICAgICAgICAgICAgIC5zZXRFeHRyYXMoYXV0aGVudGlvbkNsaWVudFN0YXRlKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAvLyBTZXQgZXhwZWN0YXRpb24gZm9yIHRoZSBhY3Rpdml0eQorICAgICAgICBtQWN0aXZpdHkuZXhwZWN0QXV0b0ZpbGwoImR1ZGUiLCAic3dlZXQiKTsKKworICAgICAgICAvLyBUcmlnZ2VyIGF1dG8tZmlsbC4KKyAgICAgICAgcmVxdWVzdEZvY3VzT25Vc2VybmFtZSgpOworCisgICAgICAgIC8vIFdhaXQgZm9yIG9uRmlsbCgpIGJlZm9yZSBwcm9jZWVkaW5nLgorICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKKyAgICAgICAgZmluYWwgVmlldyB1c2VybmFtZSA9IG1BY3Rpdml0eS5nZXRVc2VybmFtZSgpOworCisgICAgICAgIC8vIEF1dGhlbnRpY2F0ZQorICAgICAgICBjYWxsYmFjay5hc3NlcnRVaVNob3duRXZlbnQodXNlcm5hbWUpOworICAgICAgICBtVWlCb3Quc2VsZWN0RGF0YXNldCgiVGFwIHRvIGF1dGggZGF0YXNldCIpOworICAgICAgICBjYWxsYmFjay5hc3NlcnRVaUhpZGRlbkV2ZW50KHVzZXJuYW1lKTsKKworICAgICAgICAvLyBTZWxlY3QgYSBkYXRhc2V0IGZyb20gdGhlIG5ldyByZXNwb25zZQorICAgICAgICBjYWxsYmFjay5hc3NlcnRVaVNob3duRXZlbnQodXNlcm5hbWUpOworICAgICAgICBtVWlCb3Quc2VsZWN0RGF0YXNldCgiRGF0YXNldCIpOworICAgICAgICBjYWxsYmFjay5hc3NlcnRVaUhpZGRlbkV2ZW50KHVzZXJuYW1lKTsKKyAgICAgICAgbVVpQm90LmFzc2VydE5vRGF0YXNldHMoKTsKKworICAgICAgICAvLyBDaGVjayB0aGUgcmVzdWx0cy4KKyAgICAgICAgbUFjdGl2aXR5LmFzc2VydEF1dG9GaWxsZWQoKTsKKworICAgICAgICBmaW5hbCBCdW5kbGUgZGF0YSA9IEF1dGhlbnRpY2F0aW9uQWN0aXZpdHkuZ2V0RGF0YSgpOworICAgICAgICBhc3NlcnRUaGF0KGRhdGEpLmlzTm90TnVsbCgpOworICAgICAgICBmaW5hbCBTdHJpbmcgZXh0cmFWYWx1ZSA9IGRhdGEuZ2V0U3RyaW5nKCJjbGllbnRTdGF0ZUtleTEiKTsKKyAgICAgICAgYXNzZXJ0VGhhdChleHRyYVZhbHVlKS5pc0VxdWFsVG8oImNsaWVudFN0YXRlVmFsdWUxIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gdGVzdERhdGFzZXRBdXRoVHdvRmllbGRzKCkgaXMgZW5vdWdoIHRvIHRlc3QgZXBoZW1lcmFsIGFwcHMgc3VwcG9ydAorICAgIHB1YmxpYyB2b2lkIHRlc3REYXRhc2V0QXV0aFR3b0ZpZWxkc05vVmFsdWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFNldCBzZXJ2aWNlLgorICAgICAgICBlbmFibGVTZXJ2aWNlKCk7CisgICAgICAgIGZpbmFsIE15QXV0b2ZpbGxDYWxsYmFjayBjYWxsYmFjayA9IG1BY3Rpdml0eS5yZWdpc3RlckNhbGxiYWNrKCk7CisKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBhdXRoZW50aWNhdGlvbiBpbnRlbnQKKyAgICAgICAgZmluYWwgSW50ZW50U2VuZGVyIGF1dGhlbnRpY2F0aW9uID0gQXV0aGVudGljYXRpb25BY3Rpdml0eS5jcmVhdGVTZW5kZXIobUNvbnRleHQsIDEsCisgICAgICAgICAgICAgICAgbmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfVVNFUk5BTUUsICJkdWRlIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9QQVNTV09SRCwgInN3ZWV0IikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAvLyBDb25maWd1cmUgdGhlIHNlcnZpY2UgYmVoYXZpb3IKKyAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UobmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuYWRkRGF0YXNldChuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgKFN0cmluZykgbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9QQVNTV09SRCwgKFN0cmluZykgbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJUYXAgdG8gYXV0aCBkYXRhc2V0IikpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0QXV0aGVudGljYXRpb24oYXV0aGVudGljYXRpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gU2V0IGV4cGVjdGF0aW9uIGZvciB0aGUgYWN0aXZpdHkKKyAgICAgICAgbUFjdGl2aXR5LmV4cGVjdEF1dG9GaWxsKCJkdWRlIiwgInN3ZWV0Iik7CisKKyAgICAgICAgLy8gVHJpZ2dlciBhdXRvLWZpbGwuCisgICAgICAgIHJlcXVlc3RGb2N1c09uVXNlcm5hbWUoKTsKKworICAgICAgICAvLyBXYWl0IGZvciBvbkZpbGwoKSBiZWZvcmUgcHJvY2VlZGluZy4KKyAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CisgICAgICAgIGZpbmFsIFZpZXcgdXNlcm5hbWUgPSBtQWN0aXZpdHkuZ2V0VXNlcm5hbWUoKTsKKworICAgICAgICAvLyBBdXRoZW50aWNhdGUKKyAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlTaG93bkV2ZW50KHVzZXJuYW1lKTsKKyAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQoIlRhcCB0byBhdXRoIGRhdGFzZXQiKTsKKyAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlIaWRkZW5FdmVudCh1c2VybmFtZSk7CisgICAgICAgIG1VaUJvdC5hc3NlcnROb0RhdGFzZXRzKCk7CisKKyAgICAgICAgLy8gQ2hlY2sgdGhlIHJlc3VsdHMuCisgICAgICAgIG1BY3Rpdml0eS5hc3NlcnRBdXRvRmlsbGVkKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gdGVzdERhdGFzZXRBdXRoVHdvRmllbGRzKCkgaXMgZW5vdWdoIHRvIHRlc3QgZXBoZW1lcmFsIGFwcHMgc3VwcG9ydAorICAgIHB1YmxpYyB2b2lkIHRlc3REYXRhc2V0QXV0aFR3b0RhdGFzZXRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFNldCBzZXJ2aWNlLgorICAgICAgICBlbmFibGVTZXJ2aWNlKCk7CisgICAgICAgIGZpbmFsIE15QXV0b2ZpbGxDYWxsYmFjayBjYWxsYmFjayA9IG1BY3Rpdml0eS5yZWdpc3RlckNhbGxiYWNrKCk7CisKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBhdXRoZW50aWNhdGlvbiBpbnRlbnRzCisgICAgICAgIGZpbmFsIENhbm5lZERhdGFzZXQgdW5sb2NrZWREYXRhc2V0ID0gbmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1VTRVJOQU1FLCAiZHVkZSIpCisgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1BBU1NXT1JELCAic3dlZXQiKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICBmaW5hbCBJbnRlbnRTZW5kZXIgYXV0aGVudGljYXRpb24xID0gQXV0aGVudGljYXRpb25BY3Rpdml0eS5jcmVhdGVTZW5kZXIobUNvbnRleHQsIDEsCisgICAgICAgICAgICAgICAgdW5sb2NrZWREYXRhc2V0KTsKKyAgICAgICAgZmluYWwgSW50ZW50U2VuZGVyIGF1dGhlbnRpY2F0aW9uMiA9IEF1dGhlbnRpY2F0aW9uQWN0aXZpdHkuY3JlYXRlU2VuZGVyKG1Db250ZXh0LCAyLAorICAgICAgICAgICAgICAgIHVubG9ja2VkRGF0YXNldCk7CisKKyAgICAgICAgLy8gQ29uZmlndXJlIHRoZSBzZXJ2aWNlIGJlaGF2aW9yCisgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLmFkZERhdGFzZXQobmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfVVNFUk5BTUUsIFVOVVNFRF9BVVRPRklMTF9WQUxVRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9QQVNTV09SRCwgVU5VU0VEX0FVVE9GSUxMX1ZBTFVFKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oIlRhcCB0byBhdXRoIGRhdGFzZXQgMSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEF1dGhlbnRpY2F0aW9uKGF1dGhlbnRpY2F0aW9uMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQorICAgICAgICAgICAgICAgIC5hZGREYXRhc2V0KG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1VTRVJOQU1FLCBVTlVTRURfQVVUT0ZJTExfVkFMVUUpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfUEFTU1dPUkQsIFVOVVNFRF9BVVRPRklMTF9WQUxVRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJUYXAgdG8gYXV0aCBkYXRhc2V0IDIiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRBdXRoZW50aWNhdGlvbihhdXRoZW50aWNhdGlvbjIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gU2V0IGV4cGVjdGF0aW9uIGZvciB0aGUgYWN0aXZpdHkKKyAgICAgICAgbUFjdGl2aXR5LmV4cGVjdEF1dG9GaWxsKCJkdWRlIiwgInN3ZWV0Iik7CisKKyAgICAgICAgLy8gVHJpZ2dlciBhdXRvLWZpbGwuCisgICAgICAgIHJlcXVlc3RGb2N1c09uVXNlcm5hbWUoKTsKKworICAgICAgICAvLyBXYWl0IGZvciBvbkZpbGwoKSBiZWZvcmUgcHJvY2VlZGluZy4KKyAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CisgICAgICAgIGZpbmFsIFZpZXcgdXNlcm5hbWUgPSBtQWN0aXZpdHkuZ2V0VXNlcm5hbWUoKTsKKworICAgICAgICAvLyBBdXRoZW50aWNhdGUKKyAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlTaG93bkV2ZW50KHVzZXJuYW1lKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJUYXAgdG8gYXV0aCBkYXRhc2V0IDEiLCAiVGFwIHRvIGF1dGggZGF0YXNldCAyIik7CisKKyAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQoIlRhcCB0byBhdXRoIGRhdGFzZXQgMSIpOworICAgICAgICBjYWxsYmFjay5hc3NlcnRVaUhpZGRlbkV2ZW50KHVzZXJuYW1lKTsKKyAgICAgICAgbVVpQm90LmFzc2VydE5vRGF0YXNldHMoKTsKKworICAgICAgICAvLyBDaGVjayB0aGUgcmVzdWx0cy4KKyAgICAgICAgbUFjdGl2aXR5LmFzc2VydEF1dG9GaWxsZWQoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBBcHBNb2RlRnVsbCAvLyB0ZXN0RGF0YXNldEF1dGhUd29GaWVsZHMoKSBpcyBlbm91Z2ggdG8gdGVzdCBlcGhlbWVyYWwgYXBwcyBzdXBwb3J0CisgICAgcHVibGljIHZvaWQgdGVzdERhdGFzZXRBdXRoTWl4ZWRTZWxlY3RBdXRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGRhdGFzZXRBdXRoTWl4ZWRUZXN0KHRydWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgQEFwcE1vZGVGdWxsIC8vIHRlc3REYXRhc2V0QXV0aFR3b0ZpZWxkcygpIGlzIGVub3VnaCB0byB0ZXN0IGVwaGVtZXJhbCBhcHBzIHN1cHBvcnQKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGF0YXNldEF1dGhNaXhlZFNlbGVjdE5vbkF1dGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZGF0YXNldEF1dGhNaXhlZFRlc3QoZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkYXRhc2V0QXV0aE1peGVkVGVzdChib29sZWFuIHNlbGVjdEF1dGgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBTZXQgc2VydmljZS4KKyAgICAgICAgZW5hYmxlU2VydmljZSgpOworICAgICAgICBmaW5hbCBNeUF1dG9maWxsQ2FsbGJhY2sgY2FsbGJhY2sgPSBtQWN0aXZpdHkucmVnaXN0ZXJDYWxsYmFjaygpOworCisgICAgICAgIC8vIFByZXBhcmUgdGhlIGF1dGhlbnRpY2F0ZWQgcmVzcG9uc2UKKyAgICAgICAgZmluYWwgSW50ZW50U2VuZGVyIGF1dGhlbnRpY2F0aW9uID0gQXV0aGVudGljYXRpb25BY3Rpdml0eS5jcmVhdGVTZW5kZXIobUNvbnRleHQsIDEsCisgICAgICAgICAgICAgICAgbmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfVVNFUk5BTUUsICJkdWRlIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9QQVNTV09SRCwgInN3ZWV0IikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAvLyBDb25maWd1cmUgdGhlIHNlcnZpY2UgYmVoYXZpb3IKKyAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UobmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuYWRkRGF0YXNldChuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgImR1ZGUiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1BBU1NXT1JELCAic3dlZXQiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oIlRhcCB0byBhdXRoIGRhdGFzZXQiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRBdXRoZW50aWNhdGlvbihhdXRoZW50aWNhdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQorICAgICAgICAgICAgICAgIC5hZGREYXRhc2V0KG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1VTRVJOQU1FLCAiRFVERSIpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfUEFTU1dPUkQsICJTV0VFVCIpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiV2hhdCwgbWUgYXV0aD8iKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAvLyBTZXQgZXhwZWN0YXRpb24gZm9yIHRoZSBhY3Rpdml0eQorICAgICAgICBpZiAoc2VsZWN0QXV0aCkgeworICAgICAgICAgICAgbUFjdGl2aXR5LmV4cGVjdEF1dG9GaWxsKCJkdWRlIiwgInN3ZWV0Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQWN0aXZpdHkuZXhwZWN0QXV0b0ZpbGwoIkRVREUiLCAiU1dFRVQiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRyaWdnZXIgYXV0by1maWxsLgorICAgICAgICByZXF1ZXN0Rm9jdXNPblVzZXJuYW1lKCk7CisKKyAgICAgICAgLy8gV2FpdCBmb3Igb25GaWxsKCkgYmVmb3JlIHByb2NlZWRpbmcuCisgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOworICAgICAgICBmaW5hbCBWaWV3IHVzZXJuYW1lID0gbUFjdGl2aXR5LmdldFVzZXJuYW1lKCk7CisKKyAgICAgICAgLy8gQXV0aGVudGljYXRlCisgICAgICAgIGNhbGxiYWNrLmFzc2VydFVpU2hvd25FdmVudCh1c2VybmFtZSk7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cygiVGFwIHRvIGF1dGggZGF0YXNldCIsICJXaGF0LCBtZSBhdXRoPyIpOworCisgICAgICAgIGZpbmFsIFN0cmluZyBjaG9zZW5PbmUgPSBzZWxlY3RBdXRoID8gIlRhcCB0byBhdXRoIGRhdGFzZXQiIDogIldoYXQsIG1lIGF1dGg/IjsKKyAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQoY2hvc2VuT25lKTsKKyAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlIaWRkZW5FdmVudCh1c2VybmFtZSk7CisgICAgICAgIG1VaUJvdC5hc3NlcnROb0RhdGFzZXRzKCk7CisKKyAgICAgICAgLy8gQ2hlY2sgdGhlIHJlc3VsdHMuCisgICAgICAgIG1BY3Rpdml0eS5hc3NlcnRBdXRvRmlsbGVkKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gdGVzdERhdGFzZXRBdXRoRmlsdGVyaW5nVXNpbmdSZWdleCgpIGlzIGVub3VnaCB0byB0ZXN0IGVwaGVtZXJhbCBhcHBzIHN1cHBvcnQKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGF0YXNldEF1dGhOb0ZpbHRlcmluZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBTZXQgc2VydmljZS4KKyAgICAgICAgZW5hYmxlU2VydmljZSgpOworICAgICAgICBmaW5hbCBNeUF1dG9maWxsQ2FsbGJhY2sgY2FsbGJhY2sgPSBtQWN0aXZpdHkucmVnaXN0ZXJDYWxsYmFjaygpOworCisgICAgICAgIC8vIENyZWF0ZSB0aGUgYXV0aGVudGljYXRpb24gaW50ZW50cworICAgICAgICBmaW5hbCBDYW5uZWREYXRhc2V0IHVubG9ja2VkRGF0YXNldCA9IG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgImR1ZGUiKQorICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9QQVNTV09SRCwgInN3ZWV0IikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgZmluYWwgSW50ZW50U2VuZGVyIGF1dGhlbnRpY2F0aW9uID0gQXV0aGVudGljYXRpb25BY3Rpdml0eS5jcmVhdGVTZW5kZXIobUNvbnRleHQsIDEsCisgICAgICAgICAgICAgICAgdW5sb2NrZWREYXRhc2V0KTsKKworICAgICAgICAvLyBDb25maWd1cmUgdGhlIHNlcnZpY2UgYmVoYXZpb3IKKyAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UobmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuYWRkRGF0YXNldChuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgVU5VU0VEX0FVVE9GSUxMX1ZBTFVFKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1BBU1NXT1JELCBVTlVTRURfQVVUT0ZJTExfVkFMVUUpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiVGFwIHRvIGF1dGggZGF0YXNldCIpKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEF1dGhlbnRpY2F0aW9uKGF1dGhlbnRpY2F0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIC8vIFNldCBleHBlY3RhdGlvbiBmb3IgdGhlIGFjdGl2aXR5CisgICAgICAgIG1BY3Rpdml0eS5leHBlY3RBdXRvRmlsbCgiZHVkZSIsICJzd2VldCIpOworCisgICAgICAgIC8vIFRyaWdnZXIgYXV0by1maWxsLgorICAgICAgICByZXF1ZXN0Rm9jdXNPblVzZXJuYW1lKCk7CisKKyAgICAgICAgLy8gV2FpdCBmb3Igb25GaWxsKCkgYmVmb3JlIHByb2NlZWRpbmcuCisgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOworICAgICAgICBmaW5hbCBWaWV3IHVzZXJuYW1lID0gbUFjdGl2aXR5LmdldFVzZXJuYW1lKCk7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIGl0J3Mgc2hvd2luZyBpbml0aWFsbHkuLi4KKyAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlTaG93bkV2ZW50KHVzZXJuYW1lKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJUYXAgdG8gYXV0aCBkYXRhc2V0Iik7CisKKyAgICAgICAgLy8gLi50aGVuIHR5cGUgc29tZXRoaW5nIHRvIGhpZGUgaXQuCisgICAgICAgIG1BY3Rpdml0eS5vblVzZXJuYW1lKCh2KSAtPiB2LnNldFRleHQoImEiKSk7CisgICAgICAgIGNhbGxiYWNrLmFzc2VydFVpSGlkZGVuRXZlbnQodXNlcm5hbWUpOworICAgICAgICBtVWlCb3QuYXNzZXJ0Tm9EYXRhc2V0cygpOworCisgICAgICAgIC8vIE5vdyBkZWxldGUgdGhlIGNoYXIgYW5kIGFzc2VydCBpdCdzIHNob3duIGFnYWluLi4uCisgICAgICAgIG1BY3Rpdml0eS5vblVzZXJuYW1lKCh2KSAtPiB2LnNldFRleHQoIiIpKTsKKyAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlTaG93bkV2ZW50KHVzZXJuYW1lKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJUYXAgdG8gYXV0aCBkYXRhc2V0Iik7CisKKyAgICAgICAgLy8gLi4uYW5kIHNlbGVjdCBpdCB0aGlzIHRpbWUKKyAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQoIlRhcCB0byBhdXRoIGRhdGFzZXQiKTsKKyAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlIaWRkZW5FdmVudCh1c2VybmFtZSk7CisgICAgICAgIG1VaUJvdC5hc3NlcnROb0RhdGFzZXRzKCk7CisKKyAgICAgICAgLy8gQ2hlY2sgdGhlIHJlc3VsdHMuCisgICAgICAgIG1BY3Rpdml0eS5hc3NlcnRBdXRvRmlsbGVkKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gdGVzdERhdGFzZXRBdXRoRmlsdGVyaW5nVXNpbmdSZWdleCgpIGlzIGVub3VnaCB0byB0ZXN0IGVwaGVtZXJhbCBhcHBzIHN1cHBvcnQKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGF0YXNldEF1dGhGaWx0ZXJpbmdVc2luZ0F1dG9maWxsVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gU2V0IHNlcnZpY2UuCisgICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKKyAgICAgICAgZmluYWwgTXlBdXRvZmlsbENhbGxiYWNrIGNhbGxiYWNrID0gbUFjdGl2aXR5LnJlZ2lzdGVyQ2FsbGJhY2soKTsKKworICAgICAgICAvLyBDcmVhdGUgdGhlIGF1dGhlbnRpY2F0aW9uIGludGVudHMKKyAgICAgICAgZmluYWwgQ2FubmVkRGF0YXNldCB1bmxvY2tlZERhdGFzZXQgPSBuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfVVNFUk5BTUUsICJkdWRlIikKKyAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfUEFTU1dPUkQsICJzd2VldCIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIGZpbmFsIEludGVudFNlbmRlciBhdXRoZW50aWNhdGlvbiA9IEF1dGhlbnRpY2F0aW9uQWN0aXZpdHkuY3JlYXRlU2VuZGVyKG1Db250ZXh0LCAxLAorICAgICAgICAgICAgICAgIHVubG9ja2VkRGF0YXNldCk7CisKKyAgICAgICAgLy8gQ29uZmlndXJlIHRoZSBzZXJ2aWNlIGJlaGF2aW9yCisgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLmFkZERhdGFzZXQobmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfVVNFUk5BTUUsICJkdWRlIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9QQVNTV09SRCwgInN3ZWV0IikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJEUzEiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRBdXRoZW50aWNhdGlvbihhdXRoZW50aWNhdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQorICAgICAgICAgICAgICAgIC5hZGREYXRhc2V0KG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1VTRVJOQU1FLCAiRFVERSxUSEUiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1BBU1NXT1JELCAiU1dFRVQiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oIkRTMiIpKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEF1dGhlbnRpY2F0aW9uKGF1dGhlbnRpY2F0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLmFkZERhdGFzZXQobmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfVVNFUk5BTUUsICJaekJvdHRvbSIpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfUEFTU1dPUkQsICJ0b3AiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oIkRTMyIpKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEF1dGhlbnRpY2F0aW9uKGF1dGhlbnRpY2F0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIC8vIFNldCBleHBlY3RhdGlvbiBmb3IgdGhlIGFjdGl2aXR5CisgICAgICAgIG1BY3Rpdml0eS5leHBlY3RBdXRvRmlsbCgiZHVkZSIsICJzd2VldCIpOworCisgICAgICAgIC8vIFRyaWdnZXIgYXV0by1maWxsLgorICAgICAgICByZXF1ZXN0Rm9jdXNPblVzZXJuYW1lKCk7CisKKyAgICAgICAgLy8gV2FpdCBmb3Igb25GaWxsKCkgYmVmb3JlIHByb2NlZWRpbmcuCisgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOworICAgICAgICBmaW5hbCBWaWV3IHVzZXJuYW1lID0gbUFjdGl2aXR5LmdldFVzZXJuYW1lKCk7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIGl0J3Mgc2hvd2luZyBpbml0aWFsbHkuLi4KKyAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlTaG93bkV2ZW50KHVzZXJuYW1lKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJEUzEiLCAiRFMyIiwgIkRTMyIpOworCisgICAgICAgIC8vIC4uLnRoZW4gdHlwZSBzb21ldGhpbmcgdG8gaGlkZSB0aGVtLgorICAgICAgICBtQWN0aXZpdHkub25Vc2VybmFtZSgodikgLT4gdi5zZXRUZXh0KCJhIikpOworICAgICAgICBjYWxsYmFjay5hc3NlcnRVaUhpZGRlbkV2ZW50KHVzZXJuYW1lKTsKKyAgICAgICAgbVVpQm90LmFzc2VydE5vRGF0YXNldHMoKTsKKworICAgICAgICAvLyBOb3cgZGVsZXRlIHRoZSBjaGFyIGFuZCBhc3NlcnQgdGhleSdyZSBzaG93biBhZ2Fpbi4uLgorICAgICAgICBtQWN0aXZpdHkub25Vc2VybmFtZSgodikgLT4gdi5zZXRUZXh0KCIiKSk7CisgICAgICAgIGNhbGxiYWNrLmFzc2VydFVpU2hvd25FdmVudCh1c2VybmFtZSk7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cygiRFMxIiwgIkRTMiIsICJEUzMiKTsKKworICAgICAgICAvLyAuLi50aGVuIGZpbHRlciBmb3IgMgorICAgICAgICBtQWN0aXZpdHkub25Vc2VybmFtZSgodikgLT4gdi5zZXRUZXh0KCJkIikpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIkRTMSIsICJEUzIiKTsKKworICAgICAgICAvLyAuLi51cCB0byAxCisgICAgICAgIG1BY3Rpdml0eS5vblVzZXJuYW1lKCh2KSAtPiB2LnNldFRleHQoImR1IikpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIkRTMSIsICJEUzIiKTsKKyAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoKHYpIC0+IHYuc2V0VGV4dCgiZHVkIikpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIkRTMSIsICJEUzIiKTsKKyAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoKHYpIC0+IHYuc2V0VGV4dCgiZHVkZSIpKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJEUzEiLCAiRFMyIik7CisgICAgICAgIG1BY3Rpdml0eS5vblVzZXJuYW1lKCh2KSAtPiB2LnNldFRleHQoImR1ZGUsIikpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIkRTMiIpOworCisgICAgICAgIC8vIE5vdyBkZWxldGUgdGhlIGNoYXIgYW5kIGFzc2VydCAyIGFyZSBzaG93biBhZ2Fpbi4uLgorICAgICAgICBtQWN0aXZpdHkub25Vc2VybmFtZSgodikgLT4gdi5zZXRUZXh0KCJkdWRlIikpOworICAgICAgICBmaW5hbCBVaU9iamVjdDIgcGlja2VyID0gbVVpQm90LmFzc2VydERhdGFzZXRzKCJEUzEiLCAiRFMyIik7CisKKyAgICAgICAgLy8gLi4uYW5kIHNlbGVjdCBpdCB0aGlzIHRpbWUKKyAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQocGlja2VyLCAiRFMxIik7CisgICAgICAgIGNhbGxiYWNrLmFzc2VydFVpSGlkZGVuRXZlbnQodXNlcm5hbWUpOworICAgICAgICBtVWlCb3QuYXNzZXJ0Tm9EYXRhc2V0cygpOworCisgICAgICAgIC8vIENoZWNrIHRoZSByZXN1bHRzLgorICAgICAgICBtQWN0aXZpdHkuYXNzZXJ0QXV0b0ZpbGxlZCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERhdGFzZXRBdXRoRmlsdGVyaW5nVXNpbmdSZWdleCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBTZXQgc2VydmljZS4KKyAgICAgICAgZW5hYmxlU2VydmljZSgpOworICAgICAgICBmaW5hbCBNeUF1dG9maWxsQ2FsbGJhY2sgY2FsbGJhY2sgPSBtQWN0aXZpdHkucmVnaXN0ZXJDYWxsYmFjaygpOworCisgICAgICAgIC8vIENyZWF0ZSB0aGUgYXV0aGVudGljYXRpb24gaW50ZW50cworICAgICAgICBmaW5hbCBDYW5uZWREYXRhc2V0IHVubG9ja2VkRGF0YXNldCA9IG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgImR1ZGUiKQorICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9QQVNTV09SRCwgInN3ZWV0IikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgZmluYWwgSW50ZW50U2VuZGVyIGF1dGhlbnRpY2F0aW9uID0gQXV0aGVudGljYXRpb25BY3Rpdml0eS5jcmVhdGVTZW5kZXIobUNvbnRleHQsIDEsCisgICAgICAgICAgICAgICAgdW5sb2NrZWREYXRhc2V0KTsKKworICAgICAgICAvLyBDb25maWd1cmUgdGhlIHNlcnZpY2UgYmVoYXZpb3IKKworICAgICAgICBmaW5hbCBQYXR0ZXJuIG1pbjJDaGFycyA9IFBhdHRlcm4uY29tcGlsZSgiLnsyLH0iKTsKKyAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UobmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuYWRkRGF0YXNldChuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgVU5VU0VEX0FVVE9GSUxMX1ZBTFVFLCBtaW4yQ2hhcnMpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfUEFTU1dPUkQsIFVOVVNFRF9BVVRPRklMTF9WQUxVRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJUYXAgdG8gYXV0aCBkYXRhc2V0IikpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0QXV0aGVudGljYXRpb24oYXV0aGVudGljYXRpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gU2V0IGV4cGVjdGF0aW9uIGZvciB0aGUgYWN0aXZpdHkKKyAgICAgICAgbUFjdGl2aXR5LmV4cGVjdEF1dG9GaWxsKCJkdWRlIiwgInN3ZWV0Iik7CisKKyAgICAgICAgLy8gVHJpZ2dlciBhdXRvLWZpbGwuCisgICAgICAgIHJlcXVlc3RGb2N1c09uVXNlcm5hbWUoKTsKKworICAgICAgICAvLyBXYWl0IGZvciBvbkZpbGwoKSBiZWZvcmUgcHJvY2VlZGluZy4KKyAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CisgICAgICAgIGZpbmFsIFZpZXcgdXNlcm5hbWUgPSBtQWN0aXZpdHkuZ2V0VXNlcm5hbWUoKTsKKworICAgICAgICAvLyBNYWtlIHN1cmUgaXQncyBzaG93aW5nIGluaXRpYWxseS4uLgorICAgICAgICBjYWxsYmFjay5hc3NlcnRVaVNob3duRXZlbnQodXNlcm5hbWUpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlRhcCB0byBhdXRoIGRhdGFzZXQiKTsKKworICAgICAgICAvLyAuLi50aGVuIHR5cGUgc29tZXRoaW5nIHRvIGhpZGUgaXQuCisgICAgICAgIG1BY3Rpdml0eS5vblVzZXJuYW1lKCh2KSAtPiB2LnNldFRleHQoImEiKSk7CisgICAgICAgIGNhbGxiYWNrLmFzc2VydFVpSGlkZGVuRXZlbnQodXNlcm5hbWUpOworICAgICAgICBtVWlCb3QuYXNzZXJ0Tm9EYXRhc2V0cygpOworCisgICAgICAgIC8vIC4uLm5vdyB0eXBlIHNvbWV0aGluZyBhZ2FpbiB0byBzaG93IGl0LCBhcyB0aGUgaW5wdXQgd2lsbCBoYXZlIDIgY2hhcnMuCisgICAgICAgIG1BY3Rpdml0eS5vblVzZXJuYW1lKCh2KSAtPiB2LnNldFRleHQoImFhIikpOworICAgICAgICBjYWxsYmFjay5hc3NlcnRVaVNob3duRXZlbnQodXNlcm5hbWUpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlRhcCB0byBhdXRoIGRhdGFzZXQiKTsKKworICAgICAgICAvLyBEZWxldGUgdGhlIGNoYXIgYW5kIGFzc2VydCBpdCdzIG5vdCBzaG93biBhZ2Fpbi4uLgorICAgICAgICBtQWN0aXZpdHkub25Vc2VybmFtZSgodikgLT4gdi5zZXRUZXh0KCJhIikpOworICAgICAgICBjYWxsYmFjay5hc3NlcnRVaUhpZGRlbkV2ZW50KHVzZXJuYW1lKTsKKyAgICAgICAgbVVpQm90LmFzc2VydE5vRGF0YXNldHMoKTsKKworICAgICAgICAvLyAuLi50aGVuIHR5cGUgc29tZXRoaW5nIGFnYWluIHRvIHNob3cgaXQsIGFzIHRoZSBpbnB1dCB3aWxsIGhhdmUgMiBjaGFycy4KKyAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoKHYpIC0+IHYuc2V0VGV4dCgiYWEiKSk7CisgICAgICAgIGNhbGxiYWNrLmFzc2VydFVpU2hvd25FdmVudCh1c2VybmFtZSk7CisKKyAgICAgICAgLy8gLi4uYW5kIHNlbGVjdCBpdCB0aGlzIHRpbWUKKyAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQoIlRhcCB0byBhdXRoIGRhdGFzZXQiKTsKKyAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlIaWRkZW5FdmVudCh1c2VybmFtZSk7CisgICAgICAgIG1VaUJvdC5hc3NlcnROb0RhdGFzZXRzKCk7CisKKyAgICAgICAgLy8gQ2hlY2sgdGhlIHJlc3VsdHMuCisgICAgICAgIG1BY3Rpdml0eS5hc3NlcnRBdXRvRmlsbGVkKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gdGVzdERhdGFzZXRBdXRoRmlsdGVyaW5nVXNpbmdSZWdleCgpIGlzIGVub3VnaCB0byB0ZXN0IGVwaGVtZXJhbCBhcHBzIHN1cHBvcnQKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGF0YXNldEF1dGhNaXhlZEZpbHRlcmluZ1NlbGVjdEF1dGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZGF0YXNldEF1dGhNaXhlZEZpbHRlcmluZ1Rlc3QodHJ1ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gdGVzdERhdGFzZXRBdXRoRmlsdGVyaW5nVXNpbmdSZWdleCgpIGlzIGVub3VnaCB0byB0ZXN0IGVwaGVtZXJhbCBhcHBzIHN1cHBvcnQKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGF0YXNldEF1dGhNaXhlZEZpbHRlcmluZ1NlbGVjdE5vbkF1dGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZGF0YXNldEF1dGhNaXhlZEZpbHRlcmluZ1Rlc3QoZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkYXRhc2V0QXV0aE1peGVkRmlsdGVyaW5nVGVzdChib29sZWFuIHNlbGVjdEF1dGgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBTZXQgc2VydmljZS4KKyAgICAgICAgZW5hYmxlU2VydmljZSgpOworICAgICAgICBmaW5hbCBNeUF1dG9maWxsQ2FsbGJhY2sgY2FsbGJhY2sgPSBtQWN0aXZpdHkucmVnaXN0ZXJDYWxsYmFjaygpOworCisgICAgICAgIC8vIENyZWF0ZSB0aGUgYXV0aGVudGljYXRpb24gaW50ZW50cworICAgICAgICBmaW5hbCBDYW5uZWREYXRhc2V0IHVubG9ja2VkRGF0YXNldCA9IG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgIkRVREUiKQorICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9QQVNTV09SRCwgIlNXRUVUIikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgZmluYWwgSW50ZW50U2VuZGVyIGF1dGhlbnRpY2F0aW9uID0gQXV0aGVudGljYXRpb25BY3Rpdml0eS5jcmVhdGVTZW5kZXIobUNvbnRleHQsIDEsCisgICAgICAgICAgICAgICAgdW5sb2NrZWREYXRhc2V0KTsKKworICAgICAgICAvLyBDb25maWd1cmUgdGhlIHNlcnZpY2UgYmVoYXZpb3IKKyAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UobmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuYWRkRGF0YXNldChuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgVU5VU0VEX0FVVE9GSUxMX1ZBTFVFKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1BBU1NXT1JELCBVTlVTRURfQVVUT0ZJTExfVkFMVUUpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiVGFwIHRvIGF1dGggZGF0YXNldCIpKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEF1dGhlbnRpY2F0aW9uKGF1dGhlbnRpY2F0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLmFkZERhdGFzZXQobmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfVVNFUk5BTUUsICJkdWRlIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9QQVNTV09SRCwgInN3ZWV0IikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJXaGF0LCBtZSBhdXRoPyIpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIC8vIFNldCBleHBlY3RhdGlvbiBmb3IgdGhlIGFjdGl2aXR5CisgICAgICAgIGlmIChzZWxlY3RBdXRoKSB7CisgICAgICAgICAgICBtQWN0aXZpdHkuZXhwZWN0QXV0b0ZpbGwoIkRVREUiLCAiU1dFRVQiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1BY3Rpdml0eS5leHBlY3RBdXRvRmlsbCgiZHVkZSIsICJzd2VldCIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVHJpZ2dlciBhdXRvLWZpbGwuCisgICAgICAgIHJlcXVlc3RGb2N1c09uVXNlcm5hbWUoKTsKKworICAgICAgICAvLyBXYWl0IGZvciBvbkZpbGwoKSBiZWZvcmUgcHJvY2VlZGluZy4KKyAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CisgICAgICAgIGZpbmFsIFZpZXcgdXNlcm5hbWUgPSBtQWN0aXZpdHkuZ2V0VXNlcm5hbWUoKTsKKworICAgICAgICAvLyBNYWtlIHN1cmUgaXQncyBzaG93aW5nIGluaXRpYWxseS4uLgorICAgICAgICBjYWxsYmFjay5hc3NlcnRVaVNob3duRXZlbnQodXNlcm5hbWUpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlRhcCB0byBhdXRoIGRhdGFzZXQiLCAiV2hhdCwgbWUgYXV0aD8iKTsKKworICAgICAgICAvLyBGaWx0ZXIgdGhlIGF1dGggZGF0YXNldC4KKyAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoKHYpIC0+IHYuc2V0VGV4dCgiZCIpKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJXaGF0LCBtZSBhdXRoPyIpOworCisgICAgICAgIC8vIEZpbHRlciBhbGwuCisgICAgICAgIG1BY3Rpdml0eS5vblVzZXJuYW1lKCh2KSAtPiB2LnNldFRleHQoImR3IikpOworICAgICAgICBjYWxsYmFjay5hc3NlcnRVaUhpZGRlbkV2ZW50KHVzZXJuYW1lKTsKKyAgICAgICAgbVVpQm90LmFzc2VydE5vRGF0YXNldHMoKTsKKworICAgICAgICAvLyBOb3cgZGVsZXRlIHRoZSBjaGFyIGFuZCBhc3NlcnQgdGhlIG5vbi1hdXRoIGlzIHNob3duIGFnYWluLgorICAgICAgICBtQWN0aXZpdHkub25Vc2VybmFtZSgodikgLT4gdi5zZXRUZXh0KCJkIikpOworICAgICAgICBjYWxsYmFjay5hc3NlcnRVaVNob3duRXZlbnQodXNlcm5hbWUpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIldoYXQsIG1lIGF1dGg/Iik7CisKKyAgICAgICAgLy8gRGVsZXRlIGFnYWluIGFuZCBhc3NlcnQgYWxsIGRhdGFzZXQgYXJlIHNob3duLgorICAgICAgICBtQWN0aXZpdHkub25Vc2VybmFtZSgodikgLT4gdi5zZXRUZXh0KCIiKSk7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cygiVGFwIHRvIGF1dGggZGF0YXNldCIsICJXaGF0LCBtZSBhdXRoPyIpOworCisgICAgICAgIC8vIC4uLmFuZCBzZWxlY3QgaXQgdGhpcyB0aW1lCisgICAgICAgIGZpbmFsIFN0cmluZyBjaG9zZW5PbmUgPSBzZWxlY3RBdXRoID8gIlRhcCB0byBhdXRoIGRhdGFzZXQiIDogIldoYXQsIG1lIGF1dGg/IjsKKyAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQoY2hvc2VuT25lKTsKKyAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlIaWRkZW5FdmVudCh1c2VybmFtZSk7CisgICAgICAgIG1VaUJvdC5hc3NlcnROb0RhdGFzZXRzKCk7CisKKyAgICAgICAgLy8gQ2hlY2sgdGhlIHJlc3VsdHMuCisgICAgICAgIG1BY3Rpdml0eS5hc3NlcnRBdXRvRmlsbGVkKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGF0YXNldEF1dGhDbGllbnRTdGF0ZVNldE9uSW50ZW50T25seSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaWxsRGF0YXNldEF1dGhXaXRoQ2xpZW50U3RhdGUoQ2xpZW50U3RhdGVMb2NhdGlvbi5JTlRFTlRfT05MWSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gdGVzdERhdGFzZXRBdXRoQ2xpZW50U3RhdGVTZXRPbkludGVudE9ubHkoKSBpcyBlbm91Z2ggdG8gdGVzdCBlcGhlbWVyYWwgYXBwcworICAgIHB1YmxpYyB2b2lkIHRlc3REYXRhc2V0QXV0aENsaWVudFN0YXRlU2V0T25GaWxsUmVzcG9uc2VPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbGxEYXRhc2V0QXV0aFdpdGhDbGllbnRTdGF0ZShDbGllbnRTdGF0ZUxvY2F0aW9uLkZJTExfUkVTUE9OU0VfT05MWSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gdGVzdERhdGFzZXRBdXRoQ2xpZW50U3RhdGVTZXRPbkludGVudE9ubHkoKSBpcyBlbm91Z2ggdG8gdGVzdCBlcGhlbWVyYWwgYXBwcworICAgIHB1YmxpYyB2b2lkIHRlc3REYXRhc2V0QXV0aENsaWVudFN0YXRlU2V0T25JbnRlbnRBbmRGaWxsUmVzcG9uc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmlsbERhdGFzZXRBdXRoV2l0aENsaWVudFN0YXRlKENsaWVudFN0YXRlTG9jYXRpb24uQk9USCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGZpbGxEYXRhc2V0QXV0aFdpdGhDbGllbnRTdGF0ZShDbGllbnRTdGF0ZUxvY2F0aW9uIHdoZXJlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gU2V0IHNlcnZpY2UuCisgICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKKworICAgICAgICAvLyBQcmVwYXJlIHRoZSBhdXRoZW50aWNhdGVkIHJlc3BvbnNlCisgICAgICAgIGZpbmFsIENhbm5lZERhdGFzZXQgZGF0YXNldCA9IG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgImR1ZGUiKQorICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9QQVNTV09SRCwgInN3ZWV0IikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgZmluYWwgSW50ZW50U2VuZGVyIGF1dGhlbnRpY2F0aW9uID0gd2hlcmUgPT0gQ2xpZW50U3RhdGVMb2NhdGlvbi5GSUxMX1JFU1BPTlNFX09OTFkKKyAgICAgICAgICAgICAgICA/IEF1dGhlbnRpY2F0aW9uQWN0aXZpdHkuY3JlYXRlU2VuZGVyKG1Db250ZXh0LCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXNldCkKKyAgICAgICAgICAgICAgICA6IEF1dGhlbnRpY2F0aW9uQWN0aXZpdHkuY3JlYXRlU2VuZGVyKG1Db250ZXh0LCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXNldCwgbmV3Q2xpZW50U3RhdGUoIkNTSSIsICJGcm9tSW50ZW50IikpOworCisgICAgICAgIC8vIENvbmZpZ3VyZSB0aGUgc2VydmljZSBiZWhhdmlvcgorICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRSZXF1aXJlZFNhdmFibGVJZHMoU0FWRV9EQVRBX1RZUEVfUEFTU1dPUkQsIElEX1VTRVJOQU1FLCBJRF9QQVNTV09SRCkKKyAgICAgICAgICAgICAgICAuc2V0RXh0cmFzKG5ld0NsaWVudFN0YXRlKCJDU0kiLCAiRnJvbVJlc3BvbnNlIikpCisgICAgICAgICAgICAgICAgLmFkZERhdGFzZXQobmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfVVNFUk5BTUUsIFVOVVNFRF9BVVRPRklMTF9WQUxVRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9QQVNTV09SRCwgVU5VU0VEX0FVVE9GSUxMX1ZBTFVFKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oIlRhcCB0byBhdXRoIGRhdGFzZXQiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRBdXRoZW50aWNhdGlvbihhdXRoZW50aWNhdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAvLyBTZXQgZXhwZWN0YXRpb24gZm9yIHRoZSBhY3Rpdml0eQorICAgICAgICBtQWN0aXZpdHkuZXhwZWN0QXV0b0ZpbGwoImR1ZGUiLCAic3dlZXQiKTsKKworICAgICAgICAvLyBUcmlnZ2VyIGF1dG8tZmlsbC4KKyAgICAgICAgcmVxdWVzdEZvY3VzT25Vc2VybmFtZSgpOworICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKKworICAgICAgICAvLyBUYXAgYXV0aGVudGljYXRpb24gcmVxdWVzdC4KKyAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQoIlRhcCB0byBhdXRoIGRhdGFzZXQiKTsKKworICAgICAgICAvLyBDaGVjayB0aGUgcmVzdWx0cy4KKyAgICAgICAgbUFjdGl2aXR5LmFzc2VydEF1dG9GaWxsZWQoKTsKKworICAgICAgICAvLyBOb3cgdHJpZ2dlciBzYXZlLgorICAgICAgICBtQWN0aXZpdHkub25Vc2VybmFtZSgodikgLT4gdi5zZXRUZXh0KCJtYWxrb3ZpY2giKSk7CisgICAgICAgIG1BY3Rpdml0eS5vblBhc3N3b3JkKCh2KSAtPiB2LnNldFRleHQoIm1hbGtvdmljaCIpKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdGVkTWVzc2FnZSA9IGdldFdlbGNvbWVNZXNzYWdlKCJtYWxrb3ZpY2giKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGFjdHVhbE1lc3NhZ2UgPSBtQWN0aXZpdHkudGFwTG9naW4oKTsKKyAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoIldyb25nIHdlbGNvbWUgbXNnIikudGhhdChhY3R1YWxNZXNzYWdlKS5pc0VxdWFsVG8oZXhwZWN0ZWRNZXNzYWdlKTsKKyAgICAgICAgbVVpQm90LnNhdmVGb3JBdXRvZmlsbCh0cnVlLCBTQVZFX0RBVEFfVFlQRV9QQVNTV09SRCk7CisKKyAgICAgICAgLy8gQXNzZXJ0IGNsaWVudCBzdGF0ZSBvbiBhdXRoZW50aWNhdGlvbiBhY3Rpdml0eS4KKyAgICAgICAgYXNzZXJ0Q2xpZW50U3RhdGUoImF1dGggYWN0aXZpdHkiLCBBdXRoZW50aWNhdGlvbkFjdGl2aXR5LmdldERhdGEoKSwgIkNTSSIsICJGcm9tUmVzcG9uc2UiKTsKKworICAgICAgICAvLyBBc3NlcnQgY2xpZW50IHN0YXRlIG9uIHNhdmUgcmVxdWVzdC4KKyAgICAgICAgZmluYWwgU2F2ZVJlcXVlc3Qgc2F2ZVJlcXVlc3QgPSBzUmVwbGllci5nZXROZXh0U2F2ZVJlcXVlc3QoKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdGVkVmFsdWUgPSB3aGVyZSA9PSBDbGllbnRTdGF0ZUxvY2F0aW9uLkZJTExfUkVTUE9OU0VfT05MWQorICAgICAgICAgICAgICAgID8gIkZyb21SZXNwb25zZSIgOiAiRnJvbUludGVudCI7CisgICAgICAgIGFzc2VydENsaWVudFN0YXRlKCJvbiBzYXZlIiwgc2F2ZVJlcXVlc3QuZGF0YSwgIkNTSSIsIGV4cGVjdGVkVmFsdWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZpbGxSZXNwb25zZUF1dGhCb3RoRmllbGRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbGxSZXNwb25zZUF1dGhCb3RoRmllbGRzKGZhbHNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBBcHBNb2RlRnVsbCAvLyB0ZXN0RmlsbFJlc3BvbnNlQXV0aEJvdGhGaWVsZHMoKSBpcyBlbm91Z2ggdG8gdGVzdCBlcGhlbWVyYWwgYXBwcyBzdXBwb3J0CisgICAgcHVibGljIHZvaWQgdGVzdEZpbGxSZXNwb25zZUF1dGhCb3RoRmllbGRzVXNlckNhbmNlbHNGaXJzdEF0dGVtcHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmlsbFJlc3BvbnNlQXV0aEJvdGhGaWVsZHModHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGZpbGxSZXNwb25zZUF1dGhCb3RoRmllbGRzKGJvb2xlYW4gY2FuY2VsRmlyc3RBdHRlbXB0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gU2V0IHNlcnZpY2UuCisgICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKKyAgICAgICAgZmluYWwgTXlBdXRvZmlsbENhbGxiYWNrIGNhbGxiYWNrID0gbUFjdGl2aXR5LnJlZ2lzdGVyQ2FsbGJhY2soKTsKKworICAgICAgICAvLyBQcmVwYXJlIHRoZSBhdXRoZW50aWNhdGVkIHJlc3BvbnNlCisgICAgICAgIGZpbmFsIEJ1bmRsZSBjbGllbnRTdGF0ZSA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgY2xpZW50U3RhdGUucHV0U3RyaW5nKCJudW1iZXJzIiwgIjQ4MTUxNjIzNDIiKTsKKyAgICAgICAgZmluYWwgSW50ZW50U2VuZGVyIGF1dGhlbnRpY2F0aW9uID0gQXV0aGVudGljYXRpb25BY3Rpdml0eS5jcmVhdGVTZW5kZXIobUNvbnRleHQsIDEsCisgICAgICAgICAgICAgICAgbmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkuYWRkRGF0YXNldCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfVVNFUk5BTUUsICJkdWRlIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1BBU1NXT1JELCAic3dlZXQiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0SWQoIm5hbWUiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiRGF0YXNldCIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRFeHRyYXMoY2xpZW50U3RhdGUpLmJ1aWxkKCkpOworCisgICAgICAgIC8vIENvbmZpZ3VyZSB0aGUgc2VydmljZSBiZWhhdmlvcgorICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRBdXRoZW50aWNhdGlvbihhdXRoZW50aWNhdGlvbiwgSURfVVNFUk5BTUUsIElEX1BBU1NXT1JEKQorICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJUYXAgdG8gYXV0aCByZXNwb25zZSIpKQorICAgICAgICAgICAgICAgIC5zZXRFeHRyYXMoY2xpZW50U3RhdGUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIC8vIFNldCBleHBlY3RhdGlvbiBmb3IgdGhlIGFjdGl2aXR5CisgICAgICAgIG1BY3Rpdml0eS5leHBlY3RBdXRvRmlsbCgiZHVkZSIsICJzd2VldCIpOworCisgICAgICAgIC8vIFRyaWdnZXIgYXV0by1maWxsLgorICAgICAgICByZXF1ZXN0Rm9jdXNPblVzZXJuYW1lKCk7CisKKyAgICAgICAgLy8gV2FpdCBmb3Igb25GaWxsKCkgYmVmb3JlIHByb2NlZWRpbmcuCisgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOworICAgICAgICBmaW5hbCBWaWV3IHVzZXJuYW1lID0gbUFjdGl2aXR5LmdldFVzZXJuYW1lKCk7CisgICAgICAgIGNhbGxiYWNrLmFzc2VydFVpU2hvd25FdmVudCh1c2VybmFtZSk7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cygiVGFwIHRvIGF1dGggcmVzcG9uc2UiKTsKKworICAgICAgICAvLyBNYWtlIHN1cmUgVUkgaXMgc2hvdyBvbiAybmQgZmllbGQgYXMgd2VsbAorICAgICAgICBmaW5hbCBWaWV3IHBhc3N3b3JkID0gbUFjdGl2aXR5LmdldFBhc3N3b3JkKCk7CisgICAgICAgIHJlcXVlc3RGb2N1c09uUGFzc3dvcmQoKTsKKyAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlIaWRkZW5FdmVudCh1c2VybmFtZSk7CisgICAgICAgIGNhbGxiYWNrLmFzc2VydFVpU2hvd25FdmVudChwYXNzd29yZCk7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cygiVGFwIHRvIGF1dGggcmVzcG9uc2UiKTsKKworICAgICAgICAvLyBOb3cgdGFwIG9uIDFzdCBmaWVsZCB0byBzaG93IGl0IGFnYWluLi4uCisgICAgICAgIHJlcXVlc3RGb2N1c09uVXNlcm5hbWUoKTsKKyAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlIaWRkZW5FdmVudChwYXNzd29yZCk7CisgICAgICAgIGNhbGxiYWNrLmFzc2VydFVpU2hvd25FdmVudCh1c2VybmFtZSk7CisKKyAgICAgICAgaWYgKGNhbmNlbEZpcnN0QXR0ZW1wdCkgeworICAgICAgICAgICAgLy8gVHJpZ2dlciB0aGUgYXV0aCBkaWFsb2csIGJ1dCBlbXVsYXRlIGNhbmNlbC4KKyAgICAgICAgICAgIEF1dGhlbnRpY2F0aW9uQWN0aXZpdHkuc2V0UmVzdWx0Q29kZShSRVNVTFRfQ0FOQ0VMRUQpOworICAgICAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQoIlRhcCB0byBhdXRoIHJlc3BvbnNlIik7CisgICAgICAgICAgICBjYWxsYmFjay5hc3NlcnRVaUhpZGRlbkV2ZW50KHVzZXJuYW1lKTsKKyAgICAgICAgICAgIGNhbGxiYWNrLmFzc2VydFVpU2hvd25FdmVudCh1c2VybmFtZSk7CisgICAgICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlRhcCB0byBhdXRoIHJlc3BvbnNlIik7CisKKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBpdCdzIHN0aWxsIHNob3duIG9uIG90aGVyIGZpZWxkcy4uLgorICAgICAgICAgICAgcmVxdWVzdEZvY3VzT25QYXNzd29yZCgpOworICAgICAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlIaWRkZW5FdmVudCh1c2VybmFtZSk7CisgICAgICAgICAgICBjYWxsYmFjay5hc3NlcnRVaVNob3duRXZlbnQocGFzc3dvcmQpOworICAgICAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJUYXAgdG8gYXV0aCByZXNwb25zZSIpOworCisgICAgICAgICAgICAvLyBUYXAgb24gMXN0IGZpZWxkIHRvIHNob3cgaXQgYWdhaW4uLi4KKyAgICAgICAgICAgIHJlcXVlc3RGb2N1c09uVXNlcm5hbWUoKTsKKyAgICAgICAgICAgIGNhbGxiYWNrLmFzc2VydFVpSGlkZGVuRXZlbnQocGFzc3dvcmQpOworICAgICAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlTaG93bkV2ZW50KHVzZXJuYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIC4uLmFuZCBzZWxlY3QgaXQgdGhpcyB0aW1lCisgICAgICAgIEF1dGhlbnRpY2F0aW9uQWN0aXZpdHkuc2V0UmVzdWx0Q29kZShSRVNVTFRfT0spOworICAgICAgICBtVWlCb3Quc2VsZWN0RGF0YXNldCgiVGFwIHRvIGF1dGggcmVzcG9uc2UiKTsKKyAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlIaWRkZW5FdmVudCh1c2VybmFtZSk7CisgICAgICAgIGNhbGxiYWNrLmFzc2VydFVpU2hvd25FdmVudCh1c2VybmFtZSk7CisgICAgICAgIGZpbmFsIFVpT2JqZWN0MiBwaWNrZXIgPSBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIkRhdGFzZXQiKTsKKyAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQocGlja2VyLCAiRGF0YXNldCIpOworICAgICAgICBjYWxsYmFjay5hc3NlcnRVaUhpZGRlbkV2ZW50KHVzZXJuYW1lKTsKKyAgICAgICAgbVVpQm90LmFzc2VydE5vRGF0YXNldHMoKTsKKworICAgICAgICAvLyBDaGVjayB0aGUgcmVzdWx0cy4KKyAgICAgICAgbUFjdGl2aXR5LmFzc2VydEF1dG9GaWxsZWQoKTsKKworICAgICAgICBmaW5hbCBCdW5kbGUgZGF0YSA9IEF1dGhlbnRpY2F0aW9uQWN0aXZpdHkuZ2V0RGF0YSgpOworICAgICAgICBhc3NlcnRUaGF0KGRhdGEpLmlzTm90TnVsbCgpOworICAgICAgICBmaW5hbCBTdHJpbmcgZXh0cmFWYWx1ZSA9IGRhdGEuZ2V0U3RyaW5nKCJudW1iZXJzIik7CisgICAgICAgIGFzc2VydFRoYXQoZXh0cmFWYWx1ZSkuaXNFcXVhbFRvKCI0ODE1MTYyMzQyIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gdGVzdEZpbGxSZXNwb25zZUF1dGhCb3RoRmllbGRzKCkgaXMgZW5vdWdoIHRvIHRlc3QgZXBoZW1lcmFsIGFwcHMgc3VwcG9ydAorICAgIHB1YmxpYyB2b2lkIHRlc3RGaWxsUmVzcG9uc2VBdXRoSnVzdE9uZUZpZWxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFNldCBzZXJ2aWNlLgorICAgICAgICBlbmFibGVTZXJ2aWNlKCk7CisgICAgICAgIGZpbmFsIE15QXV0b2ZpbGxDYWxsYmFjayBjYWxsYmFjayA9IG1BY3Rpdml0eS5yZWdpc3RlckNhbGxiYWNrKCk7CisKKyAgICAgICAgLy8gUHJlcGFyZSB0aGUgYXV0aGVudGljYXRlZCByZXNwb25zZQorICAgICAgICBmaW5hbCBCdW5kbGUgY2xpZW50U3RhdGUgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgIGNsaWVudFN0YXRlLnB1dFN0cmluZygibnVtYmVycyIsICI0ODE1MTYyMzQyIik7CisgICAgICAgIGZpbmFsIEludGVudFNlbmRlciBhdXRoZW50aWNhdGlvbiA9IEF1dGhlbnRpY2F0aW9uQWN0aXZpdHkuY3JlYXRlU2VuZGVyKG1Db250ZXh0LCAxLAorICAgICAgICAgICAgICAgIG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpLmFkZERhdGFzZXQoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1VTRVJOQU1FLCAiZHVkZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9QQVNTV09SRCwgInN3ZWV0IikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oIkRhdGFzZXQiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gQ29uZmlndXJlIHRoZSBzZXJ2aWNlIGJlaGF2aW9yCisgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldEF1dGhlbnRpY2F0aW9uKGF1dGhlbnRpY2F0aW9uLCBJRF9VU0VSTkFNRSkKKyAgICAgICAgICAgICAgICAuc2V0SWdub3JlRmllbGRzKElEX1BBU1NXT1JEKQorICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJUYXAgdG8gYXV0aCByZXNwb25zZSIpKQorICAgICAgICAgICAgICAgIC5zZXRFeHRyYXMoY2xpZW50U3RhdGUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIC8vIFNldCBleHBlY3RhdGlvbiBmb3IgdGhlIGFjdGl2aXR5CisgICAgICAgIG1BY3Rpdml0eS5leHBlY3RBdXRvRmlsbCgiZHVkZSIsICJzd2VldCIpOworCisgICAgICAgIC8vIFRyaWdnZXIgYXV0by1maWxsLgorICAgICAgICByZXF1ZXN0Rm9jdXNPblVzZXJuYW1lKCk7CisKKyAgICAgICAgLy8gV2FpdCBmb3Igb25GaWxsKCkgYmVmb3JlIHByb2NlZWRpbmcuCisgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOworICAgICAgICBmaW5hbCBWaWV3IHVzZXJuYW1lID0gbUFjdGl2aXR5LmdldFVzZXJuYW1lKCk7CisgICAgICAgIGNhbGxiYWNrLmFzc2VydFVpU2hvd25FdmVudCh1c2VybmFtZSk7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cygiVGFwIHRvIGF1dGggcmVzcG9uc2UiKTsKKworICAgICAgICAvLyBNYWtlIHN1cmUgVUkgaXMgbm90IHNob3cgb24gMm5kIGZpZWxkCisgICAgICAgIHJlcXVlc3RGb2N1c09uUGFzc3dvcmQoKTsKKyAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlIaWRkZW5FdmVudCh1c2VybmFtZSk7CisgICAgICAgIG1VaUJvdC5hc3NlcnROb0RhdGFzZXRzKCk7CisgICAgICAgIC8vIE5vdyB0YXAgb24gMXN0IGZpZWxkIHRvIHNob3cgaXQgYWdhaW4uLi4KKyAgICAgICAgcmVxdWVzdEZvY3VzT25Vc2VybmFtZSgpOworICAgICAgICBjYWxsYmFjay5hc3NlcnRVaVNob3duRXZlbnQodXNlcm5hbWUpOworCisgICAgICAgIC8vIC4uLmFuZCBzZWxlY3QgaXQgdGhpcyB0aW1lCisgICAgICAgIG1VaUJvdC5zZWxlY3REYXRhc2V0KCJUYXAgdG8gYXV0aCByZXNwb25zZSIpOworICAgICAgICBjYWxsYmFjay5hc3NlcnRVaUhpZGRlbkV2ZW50KHVzZXJuYW1lKTsKKyAgICAgICAgZmluYWwgVWlPYmplY3QyIHBpY2tlciA9IG1VaUJvdC5hc3NlcnREYXRhc2V0cygiRGF0YXNldCIpOworCisgICAgICAgIGNhbGxiYWNrLmFzc2VydFVpU2hvd25FdmVudCh1c2VybmFtZSk7CisgICAgICAgIG1VaUJvdC5zZWxlY3REYXRhc2V0KHBpY2tlciwgIkRhdGFzZXQiKTsKKyAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlIaWRkZW5FdmVudCh1c2VybmFtZSk7CisgICAgICAgIG1VaUJvdC5hc3NlcnROb0RhdGFzZXRzKCk7CisKKyAgICAgICAgLy8gQ2hlY2sgdGhlIHJlc3VsdHMuCisgICAgICAgIG1BY3Rpdml0eS5hc3NlcnRBdXRvRmlsbGVkKCk7CisgICAgICAgIGZpbmFsIEJ1bmRsZSBkYXRhID0gQXV0aGVudGljYXRpb25BY3Rpdml0eS5nZXREYXRhKCk7CisgICAgICAgIGFzc2VydFRoYXQoZGF0YSkuaXNOb3ROdWxsKCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBleHRyYVZhbHVlID0gZGF0YS5nZXRTdHJpbmcoIm51bWJlcnMiKTsKKyAgICAgICAgYXNzZXJ0VGhhdChleHRyYVZhbHVlKS5pc0VxdWFsVG8oIjQ4MTUxNjIzNDIiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBBcHBNb2RlRnVsbCAvLyB0ZXN0RmlsbFJlc3BvbnNlQXV0aEJvdGhGaWVsZHMoKSBpcyBlbm91Z2ggdG8gdGVzdCBlcGhlbWVyYWwgYXBwcyBzdXBwb3J0CisgICAgcHVibGljIHZvaWQgdGVzdEZpbGxSZXNwb25zZUF1dGhXaGVuQXBwQ2FsbHNDYW5jZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gU2V0IHNlcnZpY2UuCisgICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKKyAgICAgICAgZmluYWwgTXlBdXRvZmlsbENhbGxiYWNrIGNhbGxiYWNrID0gbUFjdGl2aXR5LnJlZ2lzdGVyQ2FsbGJhY2soKTsKKworICAgICAgICAvLyBQcmVwYXJlIHRoZSBhdXRoZW50aWNhdGVkIHJlc3BvbnNlCisgICAgICAgIGZpbmFsIEludGVudFNlbmRlciBhdXRoZW50aWNhdGlvbiA9IEF1dGhlbnRpY2F0aW9uQWN0aXZpdHkuY3JlYXRlU2VuZGVyKG1Db250ZXh0LCAxLAorICAgICAgICAgICAgICAgIG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpLmFkZERhdGFzZXQoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1VTRVJOQU1FLCAiZHVkZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9QQVNTV09SRCwgInN3ZWV0IikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldElkKCJuYW1lIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oIkRhdGFzZXQiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gQ29uZmlndXJlIHRoZSBzZXJ2aWNlIGJlaGF2aW9yCisgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldEF1dGhlbnRpY2F0aW9uKGF1dGhlbnRpY2F0aW9uLCBJRF9VU0VSTkFNRSwgSURfUEFTU1dPUkQpCisgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oIlRhcCB0byBhdXRoIHJlc3BvbnNlIikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIC8vIFRyaWdnZXIgYXV0b2ZpbGwuCisgICAgICAgIHJlcXVlc3RGb2N1c09uVXNlcm5hbWUoKTsKKworICAgICAgICAvLyBXYWl0IGZvciBvbkZpbGwoKSBiZWZvcmUgcHJvY2VlZGluZy4KKyAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CisgICAgICAgIGZpbmFsIFZpZXcgdXNlcm5hbWUgPSBtQWN0aXZpdHkuZ2V0VXNlcm5hbWUoKTsKKyAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlTaG93bkV2ZW50KHVzZXJuYW1lKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJUYXAgdG8gYXV0aCByZXNwb25zZSIpOworCisgICAgICAgIC8vIERpc2FibGVzIGF1dG9maWxsIHNvIGl0J3Mgbm90IHRyaWdnZXJlZCBhZ2FpbiBhZnRlciB0aGUgYXV0aCBhY3Rpdml0eSBpcyBmaW5pc2hlZAorICAgICAgICAvLyAoYW5kIGN1cnJlbnQgc2Vzc2lvbiBpcyBjYW5jZWxlZCkgYW5kIHRoZSBsb2dpbiBhY3Rpdml0eSBpcyByZXN1bWVkLgorICAgICAgICB1c2VybmFtZS5zZXRJbXBvcnRhbnRGb3JBdXRvZmlsbChJTVBPUlRBTlRfRk9SX0FVVE9GSUxMX05PKTsKKworICAgICAgICAvLyBBdXRvZmlsbCBpdC4KKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgICAgIEF1dGhlbnRpY2F0aW9uQWN0aXZpdHkuc2V0UmVzdWx0Q29kZShsYXRjaCwgUkVTVUxUX09LKTsKKworICAgICAgICBtVWlCb3Quc2VsZWN0RGF0YXNldCgiVGFwIHRvIGF1dGggcmVzcG9uc2UiKTsKKyAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlIaWRkZW5FdmVudCh1c2VybmFtZSk7CisKKyAgICAgICAgLy8gQ2FuY2VsIHNlc3Npb24uLi4KKyAgICAgICAgbUFjdGl2aXR5LmdldEF1dG9maWxsTWFuYWdlcigpLmNhbmNlbCgpOworCisgICAgICAgIC8vIC4uLmJlZm9yZSBmaW5pc2hpbmcgdGhlIEF1dGggVUkuCisgICAgICAgIGxhdGNoLmNvdW50RG93bigpOworCisgICAgICAgIG1VaUJvdC5hc3NlcnROb0RhdGFzZXRzKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gdGVzdEZpbGxSZXNwb25zZUF1dGhCb3RoRmllbGRzKCkgaXMgZW5vdWdoIHRvIHRlc3QgZXBoZW1lcmFsIGFwcHMgc3VwcG9ydAorICAgIHB1YmxpYyB2b2lkIHRlc3RGaWxsUmVzcG9uc2VBdXRoU2VydmljZUhhc05vRGF0YUJ1dENhblNhdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmlsbFJlc3BvbnNlQXV0aFNlcnZpY2VIYXNOb0RhdGFUZXN0KHRydWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgQEFwcE1vZGVGdWxsIC8vIHRlc3RGaWxsUmVzcG9uc2VBdXRoQm90aEZpZWxkcygpIGlzIGVub3VnaCB0byB0ZXN0IGVwaGVtZXJhbCBhcHBzIHN1cHBvcnQKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsbFJlc3BvbnNlQXV0aFNlcnZpY2VIYXNOb0RhdGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmlsbFJlc3BvbnNlQXV0aFNlcnZpY2VIYXNOb0RhdGFUZXN0KGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZmlsbFJlc3BvbnNlQXV0aFNlcnZpY2VIYXNOb0RhdGFUZXN0KGJvb2xlYW4gY2FuU2F2ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFNldCBzZXJ2aWNlLgorICAgICAgICBlbmFibGVTZXJ2aWNlKCk7CisgICAgICAgIGZpbmFsIE15QXV0b2ZpbGxDYWxsYmFjayBjYWxsYmFjayA9IG1BY3Rpdml0eS5yZWdpc3RlckNhbGxiYWNrKCk7CisKKyAgICAgICAgLy8gUHJlcGFyZSB0aGUgYXV0aGVudGljYXRlZCByZXNwb25zZQorICAgICAgICBmaW5hbCBDYW5uZWRGaWxsUmVzcG9uc2UgcmVzcG9uc2UgPSBjYW5TYXZlCisgICAgICAgICAgICAgICAgPyBuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFJlcXVpcmVkU2F2YWJsZUlkcyhTQVZFX0RBVEFfVFlQRV9QQVNTV09SRCwgSURfVVNFUk5BTUUsIElEX1BBU1NXT1JEKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkKKyAgICAgICAgICAgICAgICA6IENhbm5lZEZpbGxSZXNwb25zZS5OT19SRVNQT05TRTsKKworICAgICAgICBmaW5hbCBJbnRlbnRTZW5kZXIgYXV0aGVudGljYXRpb24gPQorICAgICAgICAgICAgICAgIEF1dGhlbnRpY2F0aW9uQWN0aXZpdHkuY3JlYXRlU2VuZGVyKG1Db250ZXh0LCAxLCByZXNwb25zZSk7CisKKyAgICAgICAgLy8gQ29uZmlndXJlIHRoZSBzZXJ2aWNlIGJlaGF2aW9yCisgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldEF1dGhlbnRpY2F0aW9uKGF1dGhlbnRpY2F0aW9uLCBJRF9VU0VSTkFNRSwgSURfUEFTU1dPUkQpCisgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oIlRhcCB0byBhdXRoIHJlc3BvbnNlIikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIC8vIFRyaWdnZXIgYXV0by1maWxsLgorICAgICAgICByZXF1ZXN0Rm9jdXNPblVzZXJuYW1lKCk7CisKKyAgICAgICAgLy8gV2FpdCBmb3Igb25GaWxsKCkgYmVmb3JlIHByb2NlZWRpbmcuCisgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOworICAgICAgICBmaW5hbCBWaWV3IHVzZXJuYW1lID0gbUFjdGl2aXR5LmdldFVzZXJuYW1lKCk7CisgICAgICAgIGNhbGxiYWNrLmFzc2VydFVpU2hvd25FdmVudCh1c2VybmFtZSk7CisKKyAgICAgICAgLy8gU2VsZWN0IHRoZSBhdXRoZW50aWNhdGlvbiBkaWFsb2cuCisgICAgICAgIG1VaUJvdC5zZWxlY3REYXRhc2V0KCJUYXAgdG8gYXV0aCByZXNwb25zZSIpOworICAgICAgICBjYWxsYmFjay5hc3NlcnRVaUhpZGRlbkV2ZW50KHVzZXJuYW1lKTsKKyAgICAgICAgbVVpQm90LmFzc2VydE5vRGF0YXNldHMoKTsKKworICAgICAgICBpZiAoIWNhblNhdmUpIHsKKyAgICAgICAgICAgIC8vIE91ciB3b3JrIGlzIGRvbmUhCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBTZXQgY3JlZGVudGlhbHMuLi4KKyAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoKHYpIC0+IHYuc2V0VGV4dCgibWFsa292aWNoIikpOworICAgICAgICBtQWN0aXZpdHkub25QYXNzd29yZCgodikgLT4gdi5zZXRUZXh0KCJtYWxrb3ZpY2giKSk7CisKKyAgICAgICAgLy8gLi4uYW5kIGxvZ2luCisgICAgICAgIGZpbmFsIFN0cmluZyBleHBlY3RlZE1lc3NhZ2UgPSBnZXRXZWxjb21lTWVzc2FnZSgibWFsa292aWNoIik7CisgICAgICAgIGZpbmFsIFN0cmluZyBhY3R1YWxNZXNzYWdlID0gbUFjdGl2aXR5LnRhcExvZ2luKCk7CisgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJXcm9uZyB3ZWxjb21lIG1zZyIpLnRoYXQoYWN0dWFsTWVzc2FnZSkuaXNFcXVhbFRvKGV4cGVjdGVkTWVzc2FnZSk7CisKKyAgICAgICAgLy8gQXNzZXJ0IHRoZSBzbmFjayBiYXIgaXMgc2hvd24gYW5kIHRhcCAiU2F2ZSIuCisgICAgICAgIG1VaUJvdC5zYXZlRm9yQXV0b2ZpbGwodHJ1ZSwgU0FWRV9EQVRBX1RZUEVfUEFTU1dPUkQpOworCisgICAgICAgIGZpbmFsIFNhdmVSZXF1ZXN0IHNhdmVSZXF1ZXN0ID0gc1JlcGxpZXIuZ2V0TmV4dFNhdmVSZXF1ZXN0KCk7CisgICAgICAgIHNSZXBsaWVyLmFzc2VydE5vVW5oYW5kbGVkU2F2ZVJlcXVlc3RzKCk7CisgICAgICAgIGFzc2VydFRoYXQoc2F2ZVJlcXVlc3QuZGF0YXNldElkcykuaXNOdWxsKCk7CisKKyAgICAgICAgLy8gQXNzZXJ0IHZhbHVlIG9mIGV4cGVjdGVkIGZpZWxkcyAtIHNob3VsZCBub3QgYmUgc2FuaXRpemVkLgorICAgICAgICBmaW5hbCBWaWV3Tm9kZSB1c2VybmFtZU5vZGUgPSBmaW5kTm9kZUJ5UmVzb3VyY2VJZChzYXZlUmVxdWVzdC5zdHJ1Y3R1cmUsIElEX1VTRVJOQU1FKTsKKyAgICAgICAgYXNzZXJ0VGV4dEFuZFZhbHVlKHVzZXJuYW1lTm9kZSwgIm1hbGtvdmljaCIpOworICAgICAgICBmaW5hbCBWaWV3Tm9kZSBwYXNzd29yZE5vZGUgPSBmaW5kTm9kZUJ5UmVzb3VyY2VJZChzYXZlUmVxdWVzdC5zdHJ1Y3R1cmUsIElEX1BBU1NXT1JEKTsKKyAgICAgICAgYXNzZXJ0VGV4dEFuZFZhbHVlKHBhc3N3b3JkTm9kZSwgIm1hbGtvdmljaCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZpbGxSZXNwb25zZUF1dGhDbGllbnRTdGF0ZVNldE9uSW50ZW50T25seSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaWxsUmVzcG9uc2VBdXRoV2l0aENsaWVudFN0YXRlKENsaWVudFN0YXRlTG9jYXRpb24uSU5URU5UX09OTFkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgQEFwcE1vZGVGdWxsIC8vIHRlc3RGaWxsUmVzcG9uc2VBdXRoQ2xpZW50U3RhdGVTZXRPbkludGVudE9ubHkoKSBpcyBlbm91Z2ggdG8gdGVzdCBlcGhlbWVyYWwKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsbFJlc3BvbnNlQXV0aENsaWVudFN0YXRlU2V0T25GaWxsUmVzcG9uc2VPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbGxSZXNwb25zZUF1dGhXaXRoQ2xpZW50U3RhdGUoQ2xpZW50U3RhdGVMb2NhdGlvbi5GSUxMX1JFU1BPTlNFX09OTFkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgQEFwcE1vZGVGdWxsIC8vIHRlc3RGaWxsUmVzcG9uc2VBdXRoQ2xpZW50U3RhdGVTZXRPbkludGVudE9ubHkoKSBpcyBlbm91Z2ggdG8gdGVzdCBlcGhlbWVyYWwKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsbFJlc3BvbnNlQXV0aENsaWVudFN0YXRlU2V0T25JbnRlbnRBbmRGaWxsUmVzcG9uc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmlsbFJlc3BvbnNlQXV0aFdpdGhDbGllbnRTdGF0ZShDbGllbnRTdGF0ZUxvY2F0aW9uLkJPVEgpOworICAgIH0KKworICAgIGVudW0gQ2xpZW50U3RhdGVMb2NhdGlvbiB7CisgICAgICAgIElOVEVOVF9PTkxZLAorICAgICAgICBGSUxMX1JFU1BPTlNFX09OTFksCisgICAgICAgIEJPVEgKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZmlsbFJlc3BvbnNlQXV0aFdpdGhDbGllbnRTdGF0ZShDbGllbnRTdGF0ZUxvY2F0aW9uIHdoZXJlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gU2V0IHNlcnZpY2UuCisgICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKKworICAgICAgICAvLyBQcmVwYXJlIHRoZSBhdXRoZW50aWNhdGVkIHJlc3BvbnNlCisgICAgICAgIGZpbmFsIENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyIGF1dGhlbnRpY2F0ZWRSZXNwb25zZUJ1aWxkZXIgPQorICAgICAgICAgICAgICAgIG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldFJlcXVpcmVkU2F2YWJsZUlkcyhTQVZFX0RBVEFfVFlQRV9QQVNTV09SRCwgSURfVVNFUk5BTUUsIElEX1BBU1NXT1JEKQorICAgICAgICAgICAgICAgIC5hZGREYXRhc2V0KG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1VTRVJOQU1FLCAiZHVkZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfUEFTU1dPUkQsICJzd2VldCIpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiRGF0YXNldCIpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGlmICh3aGVyZSA9PSBDbGllbnRTdGF0ZUxvY2F0aW9uLkZJTExfUkVTUE9OU0VfT05MWSB8fCB3aGVyZSA9PSBDbGllbnRTdGF0ZUxvY2F0aW9uLkJPVEgpIHsKKyAgICAgICAgICAgIGF1dGhlbnRpY2F0ZWRSZXNwb25zZUJ1aWxkZXIuc2V0RXh0cmFzKG5ld0NsaWVudFN0YXRlKCJDU0kiLCAiRnJvbUF1dGhSZXNwb25zZSIpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIEludGVudFNlbmRlciBhdXRoZW50aWNhdGlvbiA9IHdoZXJlID09IENsaWVudFN0YXRlTG9jYXRpb24uRklMTF9SRVNQT05TRV9PTkxZCisgICAgICAgICAgICAgICAgPyBBdXRoZW50aWNhdGlvbkFjdGl2aXR5LmNyZWF0ZVNlbmRlcihtQ29udGV4dCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0ZWRSZXNwb25zZUJ1aWxkZXIuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICA6IEF1dGhlbnRpY2F0aW9uQWN0aXZpdHkuY3JlYXRlU2VuZGVyKG1Db250ZXh0LCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgYXV0aGVudGljYXRlZFJlc3BvbnNlQnVpbGRlci5idWlsZCgpLCBuZXdDbGllbnRTdGF0ZSgiQ1NJIiwgIkZyb21JbnRlbnQiKSk7CisKKyAgICAgICAgLy8gQ29uZmlndXJlIHRoZSBzZXJ2aWNlIGJlaGF2aW9yCisgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldEF1dGhlbnRpY2F0aW9uKGF1dGhlbnRpY2F0aW9uLCBJRF9VU0VSTkFNRSkKKyAgICAgICAgICAgICAgICAuc2V0SWdub3JlRmllbGRzKElEX1BBU1NXT1JEKQorICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJUYXAgdG8gYXV0aCByZXNwb25zZSIpKQorICAgICAgICAgICAgICAgIC5zZXRFeHRyYXMobmV3Q2xpZW50U3RhdGUoIkNTSSIsICJGcm9tUmVzcG9uc2UiKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gU2V0IGV4cGVjdGF0aW9uIGZvciB0aGUgYWN0aXZpdHkKKyAgICAgICAgbUFjdGl2aXR5LmV4cGVjdEF1dG9GaWxsKCJkdWRlIiwgInN3ZWV0Iik7CisKKyAgICAgICAgLy8gVHJpZ2dlciBhdXRvZmlsbC4KKyAgICAgICAgcmVxdWVzdEZvY3VzT25Vc2VybmFtZSgpOworICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKKworICAgICAgICAvLyBUYXAgYXV0aGVudGljYXRpb24gcmVxdWVzdC4KKyAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQoIlRhcCB0byBhdXRoIHJlc3BvbnNlIik7CisKKyAgICAgICAgLy8gVGFwIGRhdGFzZXQuCisgICAgICAgIG1VaUJvdC5zZWxlY3REYXRhc2V0KCJEYXRhc2V0Iik7CisKKyAgICAgICAgLy8gQ2hlY2sgdGhlIHJlc3VsdHMuCisgICAgICAgIG1BY3Rpdml0eS5hc3NlcnRBdXRvRmlsbGVkKCk7CisKKyAgICAgICAgLy8gTm93IHRyaWdnZXIgc2F2ZS4KKyAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoKHYpIC0+IHYuc2V0VGV4dCgibWFsa292aWNoIikpOworICAgICAgICBtQWN0aXZpdHkub25QYXNzd29yZCgodikgLT4gdi5zZXRUZXh0KCJtYWxrb3ZpY2giKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBleHBlY3RlZE1lc3NhZ2UgPSBnZXRXZWxjb21lTWVzc2FnZSgibWFsa292aWNoIik7CisgICAgICAgIGZpbmFsIFN0cmluZyBhY3R1YWxNZXNzYWdlID0gbUFjdGl2aXR5LnRhcExvZ2luKCk7CisgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJXcm9uZyB3ZWxjb21lIG1zZyIpLnRoYXQoYWN0dWFsTWVzc2FnZSkuaXNFcXVhbFRvKGV4cGVjdGVkTWVzc2FnZSk7CisgICAgICAgIG1VaUJvdC5zYXZlRm9yQXV0b2ZpbGwodHJ1ZSwgU0FWRV9EQVRBX1RZUEVfUEFTU1dPUkQpOworCisgICAgICAgIC8vIEFzc2VydCBjbGllbnQgc3RhdGUgb24gYXV0aGVudGljYXRpb24gYWN0aXZpdHkuCisgICAgICAgIGFzc2VydENsaWVudFN0YXRlKCJhdXRoIGFjdGl2aXR5IiwgQXV0aGVudGljYXRpb25BY3Rpdml0eS5nZXREYXRhKCksICJDU0kiLCAiRnJvbVJlc3BvbnNlIik7CisKKyAgICAgICAgLy8gQXNzZXJ0IGNsaWVudCBzdGF0ZSBvbiBzYXZlIHJlcXVlc3QuCisgICAgICAgIGZpbmFsIFNhdmVSZXF1ZXN0IHNhdmVSZXF1ZXN0ID0gc1JlcGxpZXIuZ2V0TmV4dFNhdmVSZXF1ZXN0KCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBleHBlY3RlZFZhbHVlID0gd2hlcmUgPT0gQ2xpZW50U3RhdGVMb2NhdGlvbi5GSUxMX1JFU1BPTlNFX09OTFkKKyAgICAgICAgICAgICAgICA/ICJGcm9tQXV0aFJlc3BvbnNlIiA6ICJGcm9tSW50ZW50IjsKKyAgICAgICAgYXNzZXJ0Q2xpZW50U3RhdGUoIm9uIHNhdmUiLCBzYXZlUmVxdWVzdC5kYXRhLCAiQ1NJIiwgZXhwZWN0ZWRWYWx1ZSk7CisgICAgfQorCisgICAgLy8gVE9ETyhvbiBtYXN0ZXIpOiBtb3ZlIHRvIGhlbHBlciAvIHJldXNlIGluIG90aGVyIHBsYWNlcworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRDbGllbnRTdGF0ZShTdHJpbmcgd2hlcmUsIEJ1bmRsZSBkYXRhLCBTdHJpbmcgZXhwZWN0ZWRLZXksCisgICAgICAgICAgICBTdHJpbmcgZXhwZWN0ZWRWYWx1ZSkgeworICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgibm8gY2xpZW50IHN0YXRlIG9uICVzIiwgd2hlcmUpLnRoYXQoZGF0YSkuaXNOb3ROdWxsKCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBleHRyYVZhbHVlID0gZGF0YS5nZXRTdHJpbmcoZXhwZWN0ZWRLZXkpOworICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiaW52YWxpZCB2YWx1ZSBmb3IgJXMgb24gJXMiLCBleHBlY3RlZEtleSwgd2hlcmUpCisgICAgICAgICAgICAudGhhdChleHRyYVZhbHVlKS5pc0VxdWFsVG8oZXhwZWN0ZWRWYWx1ZSk7CisgICAgfQorCisgICAgLy8gVE9ETyhvbiBtYXN0ZXIpOiBtb3ZlIHRvIGhlbHBlciAvIHJldXNlIGluIG90aGVyIHBsYWNlcworICAgIHByaXZhdGUgQnVuZGxlIG5ld0NsaWVudFN0YXRlKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBmaW5hbCBCdW5kbGUgY2xpZW50U3RhdGUgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgIGNsaWVudFN0YXRlLnB1dFN0cmluZyhrZXksIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIGNsaWVudFN0YXRlOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZpbGxSZXNwb25zZUZpbHRlcmluZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBTZXQgc2VydmljZS4KKyAgICAgICAgZW5hYmxlU2VydmljZSgpOworICAgICAgICBmaW5hbCBNeUF1dG9maWxsQ2FsbGJhY2sgY2FsbGJhY2sgPSBtQWN0aXZpdHkucmVnaXN0ZXJDYWxsYmFjaygpOworCisgICAgICAgIC8vIFByZXBhcmUgdGhlIGF1dGhlbnRpY2F0ZWQgcmVzcG9uc2UKKyAgICAgICAgZmluYWwgQnVuZGxlIGNsaWVudFN0YXRlID0gbmV3IEJ1bmRsZSgpOworICAgICAgICBjbGllbnRTdGF0ZS5wdXRTdHJpbmcoIm51bWJlcnMiLCAiNDgxNTE2MjM0MiIpOworICAgICAgICBmaW5hbCBJbnRlbnRTZW5kZXIgYXV0aGVudGljYXRpb24gPSBBdXRoZW50aWNhdGlvbkFjdGl2aXR5LmNyZWF0ZVNlbmRlcihtQ29udGV4dCwgMSwKKyAgICAgICAgICAgICAgICBuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKS5hZGREYXRhc2V0KAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgImR1ZGUiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfUEFTU1dPUkQsICJzd2VldCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJZCgibmFtZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJEYXRhc2V0IikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEV4dHJhcyhjbGllbnRTdGF0ZSkuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gQ29uZmlndXJlIHRoZSBzZXJ2aWNlIGJlaGF2aW9yCisgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldEF1dGhlbnRpY2F0aW9uKGF1dGhlbnRpY2F0aW9uLCBJRF9VU0VSTkFNRSwgSURfUEFTU1dPUkQpCisgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oIlRhcCB0byBhdXRoIHJlc3BvbnNlIikpCisgICAgICAgICAgICAgICAgLnNldEV4dHJhcyhjbGllbnRTdGF0ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gU2V0IGV4cGVjdGF0aW9uIGZvciB0aGUgYWN0aXZpdHkKKyAgICAgICAgbUFjdGl2aXR5LmV4cGVjdEF1dG9GaWxsKCJkdWRlIiwgInN3ZWV0Iik7CisKKyAgICAgICAgLy8gVHJpZ2dlciBhdXRvLWZpbGwuCisgICAgICAgIHJlcXVlc3RGb2N1c09uVXNlcm5hbWUoKTsKKworICAgICAgICAvLyBXYWl0IGZvciBvbkZpbGwoKSBiZWZvcmUgcHJvY2VlZGluZy4KKyAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CisgICAgICAgIGZpbmFsIFZpZXcgdXNlcm5hbWUgPSBtQWN0aXZpdHkuZ2V0VXNlcm5hbWUoKTsKKworICAgICAgICAvLyBNYWtlIHN1cmUgaXQncyBzaG93aW5nIGluaXRpYWxseS4uLgorICAgICAgICBjYWxsYmFjay5hc3NlcnRVaVNob3duRXZlbnQodXNlcm5hbWUpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlRhcCB0byBhdXRoIHJlc3BvbnNlIik7CisKKyAgICAgICAgLy8gLi50aGVuIHR5cGUgc29tZXRoaW5nIHRvIGhpZGUgaXQuCisgICAgICAgIG1BY3Rpdml0eS5vblVzZXJuYW1lKCh2KSAtPiB2LnNldFRleHQoImEiKSk7CisgICAgICAgIGNhbGxiYWNrLmFzc2VydFVpSGlkZGVuRXZlbnQodXNlcm5hbWUpOworICAgICAgICBtVWlCb3QuYXNzZXJ0Tm9EYXRhc2V0cygpOworCisgICAgICAgIC8vIE5vdyBkZWxldGUgdGhlIGNoYXIgYW5kIGFzc2VydCBpdCdzIHNob3duIGFnYWluLi4uCisgICAgICAgIG1BY3Rpdml0eS5vblVzZXJuYW1lKCh2KSAtPiB2LnNldFRleHQoIiIpKTsKKyAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlTaG93bkV2ZW50KHVzZXJuYW1lKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJUYXAgdG8gYXV0aCByZXNwb25zZSIpOworCisgICAgICAgIC8vIC4uLmFuZCBzZWxlY3QgaXQgdGhpcyB0aW1lCisgICAgICAgIEF1dGhlbnRpY2F0aW9uQWN0aXZpdHkuc2V0UmVzdWx0Q29kZShSRVNVTFRfT0spOworICAgICAgICBtVWlCb3Quc2VsZWN0RGF0YXNldCgiVGFwIHRvIGF1dGggcmVzcG9uc2UiKTsKKyAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlIaWRkZW5FdmVudCh1c2VybmFtZSk7CisgICAgICAgIGNhbGxiYWNrLmFzc2VydFVpU2hvd25FdmVudCh1c2VybmFtZSk7CisgICAgICAgIGZpbmFsIFVpT2JqZWN0MiBwaWNrZXIgPSBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIkRhdGFzZXQiKTsKKyAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQocGlja2VyLCAiRGF0YXNldCIpOworICAgICAgICBjYWxsYmFjay5hc3NlcnRVaUhpZGRlbkV2ZW50KHVzZXJuYW1lKTsKKyAgICAgICAgbVVpQm90LmFzc2VydE5vRGF0YXNldHMoKTsKKworICAgICAgICAvLyBDaGVjayB0aGUgcmVzdWx0cy4KKyAgICAgICAgbUFjdGl2aXR5LmFzc2VydEF1dG9GaWxsZWQoKTsKKworICAgICAgICBmaW5hbCBCdW5kbGUgZGF0YSA9IEF1dGhlbnRpY2F0aW9uQWN0aXZpdHkuZ2V0RGF0YSgpOworICAgICAgICBhc3NlcnRUaGF0KGRhdGEpLmlzTm90TnVsbCgpOworICAgICAgICBmaW5hbCBTdHJpbmcgZXh0cmFWYWx1ZSA9IGRhdGEuZ2V0U3RyaW5nKCJudW1iZXJzIik7CisgICAgICAgIGFzc2VydFRoYXQoZXh0cmFWYWx1ZSkuaXNFcXVhbFRvKCI0ODE1MTYyMzQyIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvQXV0b0ZpbGxTZXJ2aWNlVGVzdENhc2UuamF2YSBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0F1dG9GaWxsU2VydmljZVRlc3RDYXNlLmphdmEKaW5kZXggMTNlNDgzZi4uOGVhMmMxNCAxMDA2NDQKLS0tIGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvQXV0b0ZpbGxTZXJ2aWNlVGVzdENhc2UuamF2YQorKysgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9BdXRvRmlsbFNlcnZpY2VUZXN0Q2FzZS5qYXZhCkBAIC0xOSw0MyArMTksNjQgQEAKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5nZXRDb250ZXh0OwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSGVscGVyLmdldExvZ2dpbmdMZXZlbDsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5oYXNBdXRvZmlsbEZlYXR1cmU7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5IZWxwZXIucnVuU2hlbGxDb21tYW5kOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSGVscGVyLnNldExvZ2dpbmdMZXZlbDsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkluc3RydW1lbnRlZEF1dG9GaWxsU2VydmljZS5TRVJWSUNFX05BTUU7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU2VjdXJlLkFVVE9GSUxMX1NFUlZJQ0U7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5jb21tb24uU2hlbGxIZWxwZXIucnVuU2hlbGxDb21tYW5kOwogCiBpbXBvcnQgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkluc3RydW1lbnRlZEF1dG9GaWxsU2VydmljZS5SZXBsaWVyOworaW1wb3J0IGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5jb21tb24uU2V0dGluZ3NTdGF0ZUtlZXBlclJ1bGU7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3czsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuUmVxdWlyZWRGZWF0dXJlUnVsZTsKIGltcG9ydCBjb20uYW5kcm9pZC5jdHMubW9ja2ltZS5Nb2NrSW1lU2Vzc2lvblJ1bGU7CiAKIGltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyQ2xhc3M7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CiBpbXBvcnQgb3JnLmp1bml0LkNsYXNzUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVzdFdhdGNoZXI7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5EZXNjcmlwdGlvbjsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQogLyoqCiAgKiBCYXNlIGNsYXNzIGZvciBhbGwgb3RoZXIgdGVzdHMuCiAgKi8KIEBSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCi0vLyBNdXN0IGJlIHB1YmxpYyBiZWNhdXNlIG9mIE1vY2tJbWVTZXNzaW9uUnVsZQorLy8gTk9URTogQENsYXNzUnVsZSByZXF1aXJlcyBpdCB0byBiZSBwdWJsaWMKIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBdXRvRmlsbFNlcnZpY2VUZXN0Q2FzZSB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJBdXRvRmlsbFNlcnZpY2VUZXN0Q2FzZSI7CiAKLSAgICBwcm90ZWN0ZWQgc3RhdGljIFVpQm90IHNVaUJvdDsKKyAgICBzdGF0aWMgZmluYWwgVWlCb3Qgc0RlZmF1bHRVaUJvdCA9IG5ldyBVaUJvdCgpOwogCiAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBSZXBsaWVyIHNSZXBsaWVyID0gSW5zdHJ1bWVudGVkQXV0b0ZpbGxTZXJ2aWNlLmdldFJlcGxpZXIoKTsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbnRleHQgc0NvbnRleHQgPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRUYXJnZXRDb250ZXh0KCk7CisKKyAgICBAQ2xhc3NSdWxlCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTZXR0aW5nc1N0YXRlS2VlcGVyUnVsZSBtU2VydmljZVNldHRpbmdzS2VlcGVyID0KKyAgICAgICAgICAgIG5ldyBTZXR0aW5nc1N0YXRlS2VlcGVyUnVsZShzQ29udGV4dCwgU2V0dGluZ3MuU2VjdXJlLkFVVE9GSUxMX1NFUlZJQ0UpOworCisgICAgQFJ1bGUKKyAgICBwdWJsaWMgZmluYWwgVGVzdFdhdGNoZXIgd2F0Y2hlciA9IG5ldyBUZXN0V2F0Y2hlcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHN0YXJ0aW5nKERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7CisgICAgICAgICAgICBKVW5pdEhlbHBlci5zZXRDdXJyZW50VGVzdE5hbWUoZGVzY3JpcHRpb24uZ2V0RGlzcGxheU5hbWUoKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgZmluaXNoZWQoRGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHsKKyAgICAgICAgICAgIEpVbml0SGVscGVyLnNldEN1cnJlbnRUZXN0TmFtZShudWxsKTsKKyAgICAgICAgfQorICAgIH07CisKICAgICBAQ2xhc3NSdWxlCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBNb2NrSW1lU2Vzc2lvblJ1bGUgc01vY2tJbWVTZXNzaW9uUnVsZSA9CiAgICAgICAgICAgICBuZXcgTW9ja0ltZVNlc3Npb25SdWxlKC8qIGlnbm9yZUluaXRFeGNlcHRpb249ICovIHRydWUpOwpAQCAtNzAsOCArOTEsMTYgQEAKICAgICBwdWJsaWMgZmluYWwgUmVxdWlyZWRGZWF0dXJlUnVsZSBtUmVxdWlyZWRGZWF0dXJlUnVsZSA9CiAgICAgICAgICAgICBuZXcgUmVxdWlyZWRGZWF0dXJlUnVsZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX0FVVE9GSUxMKTsKIAotICAgIHByb3RlY3RlZCBmaW5hbCBDb250ZXh0IG1Db250ZXh0OworICAgIEBSdWxlCisgICAgcHVibGljIGZpbmFsIFNhZmVDbGVhbmVyUnVsZSBtU2FmZUNsZWFuZXJSdWxlID0gbmV3IFNhZmVDbGVhbmVyUnVsZSgpCisgICAgICAgICAgICAuc2V0RHVtcGVyKG1Mb2dnaW5nUnVsZSkKKyAgICAgICAgICAgIC5ydW4oKCkgLT4gc1JlcGxpZXIuYXNzZXJ0Tm9VbmhhbmRsZWRGaWxsUmVxdWVzdHMoKSkKKyAgICAgICAgICAgIC5ydW4oKCkgLT4gc1JlcGxpZXIuYXNzZXJ0Tm9VbmhhbmRsZWRTYXZlUmVxdWVzdHMoKSkKKyAgICAgICAgICAgIC5hZGQoKCkgLT4geyByZXR1cm4gc1JlcGxpZXIuZ2V0RXhjZXB0aW9ucygpOyB9KTsKKworICAgIHByb3RlY3RlZCBmaW5hbCBDb250ZXh0IG1Db250ZXh0ID0gc0NvbnRleHQ7CiAgICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBtUGFja2FnZU5hbWU7CisgICAgcHJvdGVjdGVkIGZpbmFsIFVpQm90IG1VaUJvdDsKIAogICAgIC8qKgogICAgICAqIFN0b3JlcyB0aGUgcHJldmlvdXMgbG9nZ2luZyBsZXZlbCBzbyBpdCdzIHJlc3RvcmVkIGFmdGVyIHRoZSB0ZXN0LgpAQCAtNzksMTIgKzEwOCwxNyBAQAogICAgIHByaXZhdGUgU3RyaW5nIG1Mb2dnaW5nTGV2ZWw7CiAKICAgICBwcm90ZWN0ZWQgQXV0b0ZpbGxTZXJ2aWNlVGVzdENhc2UoKSB7Ci0gICAgICAgIG1Db250ZXh0ID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0VGFyZ2V0Q29udGV4dCgpOworICAgICAgICB0aGlzKHNEZWZhdWx0VWlCb3QpOworICAgIH0KKworICAgIHByb3RlY3RlZCBBdXRvRmlsbFNlcnZpY2VUZXN0Q2FzZShVaUJvdCB1aUJvdCkgewogICAgICAgICBtUGFja2FnZU5hbWUgPSBtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpOworICAgICAgICBtVWlCb3QgPSB1aUJvdDsKKyAgICAgICAgbVVpQm90LnJlc2V0KCk7CiAgICAgfQogCiAgICAgQEJlZm9yZUNsYXNzCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHByZXBhcmVTY3JlZW4oKSB7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIHByZXBhcmVTY3JlZW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFoYXNBdXRvZmlsbEZlYXR1cmUoKSkgcmV0dXJuOwogCiAgICAgICAgIC8vIFVubG9jayBzY3JlZW4uCkBAIC05MiwyNiArMTI2LDE1IEBACiAKICAgICAgICAgLy8gQ29sbGFwc2Ugbm90aWZpY2F0aW9ucy4KICAgICAgICAgcnVuU2hlbGxDb21tYW5kKCJjbWQgc3RhdHVzYmFyIGNvbGxhcHNlIik7Ci0gICAgfQogCi0gICAgQEJlZm9yZUNsYXNzCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFVpQm90KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghaGFzQXV0b2ZpbGxGZWF0dXJlKCkpIHJldHVybjsKLQotICAgICAgICBzVWlCb3QgPSBuZXcgVWlCb3QoSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkpOwotICAgIH0KLQotICAgIEBBZnRlckNsYXNzCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0U2V0dGluZ3MoKSB7Ci0gICAgICAgIGlmICghaGFzQXV0b2ZpbGxGZWF0dXJlKCkpIHJldHVybjsKLQotICAgICAgICAvLyBDbGVhbiB1cCBvbmx5IC0gbm8gbmVlZCB0byBjYWxsIGRpc2FibGVTZXJ2aWNlKCkgYmVjYXVzZSBpdCBkb2Vzbid0IG5lZWQgdG8gZmFpbCBpZgotICAgICAgICAvLyBpdCdzIG5vdCByZXNldC4KLSAgICAgICAgcnVuU2hlbGxDb21tYW5kKCJzZXR0aW5ncyBkZWxldGUgc2VjdXJlICVzIiwgQVVUT0ZJTExfU0VSVklDRSk7CisgICAgICAgIC8vIFNldCBvcmllbnRhdGlvbiBhcyBwb3J0cmFpdCwgb3RoZXJ3aXNlIHNvbWUgdGVzdHMgbWlnaHQgZmFpbCBkdWUgdG8gZWxlbWVudHMgbm90IGZpdHRpbmcKKyAgICAgICAgLy8gaW4sIElNRSBvcmllbnRhdGlvbiwgZXRjLi4uCisgICAgICAgIHNEZWZhdWx0VWlCb3Quc2V0U2NyZWVuT3JpZW50YXRpb24oVWlCb3QuUE9SVFJBSVQpOwogICAgIH0KIAogICAgIEBCZWZvcmUKLSAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKyAgICBwdWJsaWMgdm9pZCBjbGVhbnVwU3RhdGljU3RhdGUoKSB7CisgICAgICAgIEhlbHBlci5wcmVUZXN0Q2xlYW51cCgpOwogICAgICAgICBzUmVwbGllci5yZXNldCgpOwogICAgIH0KIApAQCAtMTMwLDYgKzE1MywxNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLyoqCisgICAgICogQ2xlYW5zIHVwIGFjdGl2aXRpZXMgdGhhdCBtaWdodCBoYXZlIGJlZW4gbGVmdCBvdmVyLgorICAgICAqLworICAgIEBCZWZvcmUKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCBmaW5pc2hBY3Rpdml0aWVzKCkgeworICAgICAgICBXZWxjb21lQWN0aXZpdHkuZmluaXNoSXQobVVpQm90KTsKKyAgICB9CisKICAgICBAQWZ0ZXIKICAgICBwdWJsaWMgdm9pZCByZXNldFZlcmJvc2VMb2dnaW5nKCkgewogICAgICAgICB0cnkgewpAQCAtMTM5LDI0ICsxNzEsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gVE9ETzogd2Ugc2hvdWxkbid0IHRocm93IGV4Y2VwdGlvbnMgb24gQEFmdGVyIC8gQEFmdGVyQ2xhc3MgYmVjYXVzZSBpZiB0aGUgdGVzdCBmYWlsZWQsIHRoZXNlCi0gICAgLy8gZXhjZXB0aW9ucyB3b3VsZCBtYXNrIHRoZSByZWFsIGNhdXNlLiBBIGJldHRlciBhcHByb2FjaCBtaWdodCBiZSB1c2luZyBhIEBSdWxlIG9yIHNvbWUgb3RoZXIKLSAgICAvLyB2aXNpdG9yIHBhdHRlcm4uCi0gICAgQEFmdGVyCi0gICAgcHVibGljIHZvaWQgYXNzZXJ0Tm90aGluZ0lzUGVuZGluZygpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBmaW5hbCBNdWx0aXBsZUV4Y2VwdGlvbnNDYXRjaGVyIGNhdGNoZXIgPSBuZXcgTXVsdGlwbGVFeGNlcHRpb25zQ2F0Y2hlcigpCi0gICAgICAgICAgICAucnVuKCgpIC0+IHNSZXBsaWVyLmFzc2VydE51bWJlclVuaGFuZGxlZEZpbGxSZXF1ZXN0cygwKSkKLSAgICAgICAgICAgIC5ydW4oKCkgLT4gc1JlcGxpZXIuYXNzZXJ0TnVtYmVyVW5oYW5kbGVkU2F2ZVJlcXVlc3RzKDApKTsKLQotICAgICAgICBmaW5hbCBMaXN0PEV4Y2VwdGlvbj4gcmVwbGllckV4Y2VwdGlvbnMgPSBzUmVwbGllci5nZXRFeGNlcHRpb25zKCk7Ci0gICAgICAgIGlmIChyZXBsaWVyRXhjZXB0aW9ucyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKEV4Y2VwdGlvbiBlIDogcmVwbGllckV4Y2VwdGlvbnMpIHsKLSAgICAgICAgICAgICAgICBjYXRjaGVyLmFkZChlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaGVyLnRocm93SWZBbnkoKTsKLSAgICB9Ci0KICAgICBAQWZ0ZXIKICAgICBwdWJsaWMgdm9pZCBpZ25vcmVGdXJ0aGVyUmVxdWVzdHMoKSB7CiAgICAgICAgIEluc3RydW1lbnRlZEF1dG9GaWxsU2VydmljZS5zZXRJZ25vcmVVbmV4cGVjdGVkUmVxdWVzdHModHJ1ZSk7CmRpZmYgLS1naXQgYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9BdXRvRmluaXNoU2Vzc2lvblRlc3QuamF2YSBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0F1dG9GaW5pc2hTZXNzaW9uVGVzdC5qYXZhCmluZGV4IGI5NjYwNzguLjVmYWU4YmYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0F1dG9GaW5pc2hTZXNzaW9uVGVzdC5qYXZhCisrKyBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0F1dG9GaW5pc2hTZXNzaW9uVGVzdC5qYXZhCkBAIC0yNyw4ICsyNyw4IEBACiBpbXBvcnQgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkluc3RydW1lbnRlZEF1dG9GaWxsU2VydmljZS5TYXZlUmVxdWVzdDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuc2VydmljZS5hdXRvZmlsbC5TYXZlSW5mbzsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTm9uTnVsbDsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk51bGxhYmxlOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuRWRpdFRleHQ7CiAKQEAgLTM2LDEwICszNiwxNSBAQAogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY1JlZmVyZW5jZTsKKwogLyoqCiAgKiBUZXN0cyB0aGF0IHRoZSBzZXNzaW9uIGZpbmlzaGVzIHdoZW4gdGhlIHZpZXdzIGFuZCBmcmFnbWVudHMgZ28gYXdheQogICovCiBwdWJsaWMgY2xhc3MgQXV0b0ZpbmlzaFNlc3Npb25UZXN0IGV4dGVuZHMgQXV0b0ZpbGxTZXJ2aWNlVGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0JVVFRPTiA9ICJidXR0b24iOworCiAgICAgQFJ1bGUKICAgICBwdWJsaWMgZmluYWwgQXV0b2ZpbGxBY3Rpdml0eVRlc3RSdWxlPEZyYWdtZW50Q29udGFpbmVyQWN0aXZpdHk+IG1BY3Rpdml0eVJ1bGUgPQogICAgICAgICAgICAgbmV3IEF1dG9maWxsQWN0aXZpdHlUZXN0UnVsZTw+KEZyYWdtZW50Q29udGFpbmVyQWN0aXZpdHkuY2xhc3MpOwpAQCAtNjIsMTMgKzY3LDEyIEBACiAKICAgICAvLyBmaXJzdFJlbW92ZSBhbmQgc2Vjb25kUmVtb3ZlIHJ1biBpbiB0aGUgVUkgVGhyZWFkOyBmaXJzdENoZWNrIGRvZXNuJ3QKICAgICBwcml2YXRlIHZvaWQgcmVtb3ZlVmlld3NCYXNlVGVzdChATm9uTnVsbCBSdW5uYWJsZSBmaXJzdFJlbW92ZSwgQE51bGxhYmxlIFJ1bm5hYmxlIGZpcnN0Q2hlY2ssCi0gICAgICAgICAgICBATnVsbGFibGUgUnVubmFibGUgc2Vjb25kUmVtb3ZlLCBTdHJpbmcuLi4gdmlld3NUb1NhdmUpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIEBOdWxsYWJsZSBSdW5uYWJsZSBzZWNvbmRSZW1vdmUsIFN0cmluZy4uLiB2aWV3c1RvU2F2ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKIAogICAgICAgICAvLyBTZXQgZXhwZWN0YXRpb25zLgogICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgIC5zZXRGbGFncyhTYXZlSW5mby5GTEFHX1NBVkVfT05fQUxMX1ZJRVdTX0lOVklTSUJMRSkKKyAgICAgICAgICAgICAgICAuc2V0U2F2ZUluZm9GbGFncyhTYXZlSW5mby5GTEFHX1NBVkVfT05fQUxMX1ZJRVdTX0lOVklTSUJMRSkKICAgICAgICAgICAgICAgICAuc2V0UmVxdWlyZWRTYXZhYmxlSWRzKFNBVkVfREFUQV9UWVBFX0dFTkVSSUMsIHZpZXdzVG9TYXZlKS5idWlsZCgpKTsKIAogICAgICAgICAvLyBUcmlnZ2VyIGF1dG9maWxsCkBAIC03OSw3ICs4Myw3IEBACiAKICAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CiAKLSAgICAgICAgc1VpQm90LmFzc2VydE5vRGF0YXNldHMoKTsKKyAgICAgICAgbVVpQm90LmFzc2VydE5vRGF0YXNldHNFdmVyKCk7CiAKICAgICAgICAgLy8gcmVtb3ZlIGZpcnN0IHNldCBvZiB2aWV3cwogICAgICAgICBtQWN0aXZpdHkuc3luY1J1bk9uVWlUaHJlYWQoKCkgLT4gewpAQCAtOTksNyArMTAzLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIFNhdmUgc2hvdWxkIGJlIHNob3dzIGFmdGVyIGFsbCByZW1vdmUgb3BlcmF0aW9ucyB3ZXJlIGV4ZWN1dGVkCi0gICAgICAgIHNVaUJvdC5zYXZlRm9yQXV0b2ZpbGwodHJ1ZSwgU0FWRV9EQVRBX1RZUEVfR0VORVJJQyk7CisgICAgICAgIG1VaUJvdC5zYXZlRm9yQXV0b2ZpbGwodHJ1ZSwgU0FWRV9EQVRBX1RZUEVfR0VORVJJQyk7CiAKICAgICAgICAgU2F2ZVJlcXVlc3Qgc2F2ZVJlcXVlc3QgPSBzUmVwbGllci5nZXROZXh0U2F2ZVJlcXVlc3QoKTsKICAgICAgICAgZm9yIChTdHJpbmcgdmlldyA6IHZpZXdzVG9TYXZlKSB7CkBAIC0xMTAsMTEgKzExNCwyNCBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCByZW1vdmVCb3RoVmlld3NUb0ZpbmlzaFNlc3Npb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQXRvbWljUmVmZXJlbmNlPEV4Y2VwdGlvbj4gcmVmID0gbmV3IEF0b21pY1JlZmVyZW5jZTw+KCk7CiAgICAgICAgIHJlbW92ZVZpZXdzQmFzZVRlc3QoCiAgICAgICAgICAgICAgICAgKCkgLT4gKChWaWV3R3JvdXApIG1FZGl0VGV4dDEuZ2V0UGFyZW50KCkpLnJlbW92ZVZpZXcobUVkaXRUZXh0MSksCi0gICAgICAgICAgICAgICAgKCkgLT4gc1VpQm90LmFzc2VydFNhdmVOb3RTaG93aW5nKFNBVkVfREFUQV9UWVBFX0dFTkVSSUMpLAorICAgICAgICAgICAgICAgICgpIC0+IGFzc2VydFNhdmVOb3RTaG93aW5nKHJlZiksCiAgICAgICAgICAgICAgICAgKCkgLT4gKChWaWV3R3JvdXApIG1FZGl0VGV4dDIuZ2V0UGFyZW50KCkpLnJlbW92ZVZpZXcobUVkaXRUZXh0MiksCiAgICAgICAgICAgICAgICAgImVkaXRUZXh0MSIsICJlZGl0VGV4dDIiKTsKKyAgICAgICAgZmluYWwgRXhjZXB0aW9uIGUgPSByZWYuZ2V0KCk7CisgICAgICAgIGlmIChlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0U2F2ZU5vdFNob3dpbmcoQXRvbWljUmVmZXJlbmNlPEV4Y2VwdGlvbj4gcmVmKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtVWlCb3QuYXNzZXJ0U2F2ZU5vdFNob3dpbmcoU0FWRV9EQVRBX1RZUEVfR0VORVJJQyk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZWYuc2V0KGUpOworICAgICAgICB9CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTE4NSw3ICsyMDIsNyBAQAogCiAgICAgICAgIC8vIFNldCBleHBlY3RhdGlvbnMuCiAgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpCi0gICAgICAgICAgICAgICAgLnNldEZsYWdzKFNhdmVJbmZvLkZMQUdfU0FWRV9PTl9BTExfVklFV1NfSU5WSVNJQkxFKQorICAgICAgICAgICAgICAgIC5zZXRTYXZlSW5mb0ZsYWdzKFNhdmVJbmZvLkZMQUdfU0FWRV9PTl9BTExfVklFV1NfSU5WSVNJQkxFKQogICAgICAgICAgICAgICAgIC5zZXRSZXF1aXJlZFNhdmFibGVJZHMoU0FWRV9EQVRBX1RZUEVfR0VORVJJQywgImVkaXRUZXh0MSIpLmJ1aWxkKCkpOwogCiAgICAgICAgIC8vIFRyaWdnZXIgYXV0b2ZpbGwKQEAgLTE5Niw3ICsyMTMsNyBAQAogCiAgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwogCi0gICAgICAgIHNVaUJvdC5hc3NlcnROb0RhdGFzZXRzKCk7CisgICAgICAgIG1VaUJvdC5hc3NlcnROb0RhdGFzZXRzRXZlcigpOwogCiAgICAgICAgIG1BY3Rpdml0eS5zeW5jUnVuT25VaVRocmVhZCgoKSAtPiB7CiAgICAgICAgICAgICBtRWRpdFRleHQxLnNldFRleHQoImVkaXRUZXh0MS1maWxsZWQiKTsKQEAgLTIxMiwyMCArMjI5LDIwIEBACiAgICAgICAgICAgICBtQWN0aXZpdHkuc3luY1J1bk9uVWlUaHJlYWQocmVtb3ZlSW5CYWNrR3JvdW5kKTsKICAgICAgICAgfQogCi0gICAgICAgIHNVaUJvdC5hc3NlcnRTYXZlTm90U2hvd2luZyhTQVZFX0RBVEFfVFlQRV9HRU5FUklDKTsKKyAgICAgICAgbVVpQm90LmFzc2VydFNhdmVOb3RTaG93aW5nKFNBVkVfREFUQV9UWVBFX0dFTkVSSUMpOwogCiAgICAgICAgIC8vIFJlbW92ZSBwcmV2aW91c2x5IHN0YXJ0ZWQgYWN0aXZpdHkgZnJvbSB0b3AKLSAgICAgICAgc1VpQm90LnNlbGVjdEJ5SWQoImFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0czppZC9idXR0b24iKTsKKyAgICAgICAgbVVpQm90LnNlbGVjdEJ5UmVsYXRpdmVJZChJRF9CVVRUT04pOwogICAgICAgICBtQWN0aXZpdHkud2FpdFVudGlsUmVzdW1lZCgpOwogCiAgICAgICAgIGlmIChyZW1vdmVJbkZvcmVHcm91cCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzVWlCb3QuYXNzZXJ0U2F2ZU5vdFNob3dpbmcoU0FWRV9EQVRBX1RZUEVfR0VORVJJQyk7CisgICAgICAgICAgICBtVWlCb3QuYXNzZXJ0U2F2ZU5vdFNob3dpbmcoU0FWRV9EQVRBX1RZUEVfR0VORVJJQyk7CiAKICAgICAgICAgICAgIG1BY3Rpdml0eS5zeW5jUnVuT25VaVRocmVhZChyZW1vdmVJbkZvcmVHcm91cCk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBTYXZlIHNob3VsZCBiZSBzaG93cyBhZnRlciBhbGwgcmVtb3ZlIG9wZXJhdGlvbnMgd2VyZSBleGVjdXRlZAotICAgICAgICBzVWlCb3Quc2F2ZUZvckF1dG9maWxsKHRydWUsIFNBVkVfREFUQV9UWVBFX0dFTkVSSUMpOworICAgICAgICBtVWlCb3Quc2F2ZUZvckF1dG9maWxsKHRydWUsIFNBVkVfREFUQV9UWVBFX0dFTkVSSUMpOwogCiAgICAgICAgIFNhdmVSZXF1ZXN0IHNhdmVSZXF1ZXN0ID0gc1JlcGxpZXIuZ2V0TmV4dFNhdmVSZXF1ZXN0KCk7CiAgICAgICAgIGFzc2VydFRoYXQoZmluZE5vZGVCeVJlc291cmNlSWQoc2F2ZVJlcXVlc3Quc3RydWN0dXJlLCAiZWRpdFRleHQxIikKZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0F1dG9maWxsQWN0aXZpdHlUZXN0UnVsZS5qYXZhIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvQXV0b2ZpbGxBY3Rpdml0eVRlc3RSdWxlLmphdmEKaW5kZXggODhmZDFlMC4uOWJjMGJjNiAxMDA2NDQKLS0tIGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvQXV0b2ZpbGxBY3Rpdml0eVRlc3RSdWxlLmphdmEKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvQXV0b2ZpbGxBY3Rpdml0eVRlc3RSdWxlLmphdmEKQEAgLTE2LDExICsxNiwxMSBAQAogcGFja2FnZSBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHM7CiAKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKIAogLyoqCi0gKiBDdXN0b20ge0BsaW5rIEFjdGl2aXR5VGVzdFJ1bGV9IHRoYXQgY2xlYW5zIHVwIHRoZSBhdXRvZmlsbCBzdGF0ZSBiZWZvcmUgdGhlIGFjdGl2aXR5IGlzCi0gKiBsYXVuY2hlZC4KKyAqIEN1c3RvbSB7QGxpbmsgQWN0aXZpdHlUZXN0UnVsZX0uCiAgKi8KIHB1YmxpYyBjbGFzcyBBdXRvZmlsbEFjdGl2aXR5VGVzdFJ1bGU8VCBleHRlbmRzIEFjdGl2aXR5PiBleHRlbmRzIEFjdGl2aXR5VGVzdFJ1bGU8VD4gewogCkBAIC0zMSwxMSArMzEsNCBAQAogICAgIHB1YmxpYyBBdXRvZmlsbEFjdGl2aXR5VGVzdFJ1bGUoQ2xhc3M8VD4gYWN0aXZpdHlDbGFzcywgYm9vbGVhbiBsYXVuY2hBY3Rpdml0eSkgewogICAgICAgICBzdXBlcihhY3Rpdml0eUNsYXNzLCBmYWxzZSwgbGF1bmNoQWN0aXZpdHkpOwogICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGJlZm9yZUFjdGl2aXR5TGF1bmNoZWQoKSB7Ci0gICAgICAgIEhlbHBlci5wcmVUZXN0Q2xlYW51cCgpOwotCi0gICAgICAgIHN1cGVyLmJlZm9yZUFjdGl2aXR5TGF1bmNoZWQoKTsKLSAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9BdXRvZmlsbExvZ2dpbmdUZXN0UnVsZS5qYXZhIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvQXV0b2ZpbGxMb2dnaW5nVGVzdFJ1bGUuamF2YQppbmRleCBlMGZmNjgzLi43YzVmMDJlIDEwMDY0NAotLS0gYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9BdXRvZmlsbExvZ2dpbmdUZXN0UnVsZS5qYXZhCisrKyBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0F1dG9maWxsTG9nZ2luZ1Rlc3RSdWxlLmphdmEKQEAgLTE2LDE0ICsxNiwxNiBAQAogCiBwYWNrYWdlIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0czsKIAotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSGVscGVyLnJ1blNoZWxsQ29tbWFuZDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLmNvbW1vbi5TaGVsbEhlbHBlci5ydW5TaGVsbENvbW1hbmQ7CiAKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk5vbk51bGw7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogaW1wb3J0IG9yZy5qdW5pdC5Bc3N1bXB0aW9uVmlvbGF0ZWRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLlRlc3RSdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuRGVzY3JpcHRpb247CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMubW9kZWwuU3RhdGVtZW50OworCiAvKioKICAqIEN1c3RvbSBKVW5pdDQgcnVsZSB0aGF0IGltcHJvdmVzIGF1dG9maWxsLXJlbGF0ZWQgbG9nZ2luZyBieToKICAqCkBAIC0zMiw5ICszNCwxMiBAQAogICogICA8bGk+Q2FsbCB7QGNvZGUgZHVtcHN5cyBhdXRvZmlsbH0gaW4gY2FzZSBvZiBmYWlsdXJlLgogICogPC9vbD4KICAqLwotcHVibGljIGNsYXNzIEF1dG9maWxsTG9nZ2luZ1Rlc3RSdWxlIGltcGxlbWVudHMgVGVzdFJ1bGUgeworcHVibGljIGNsYXNzIEF1dG9maWxsTG9nZ2luZ1Rlc3RSdWxlIGltcGxlbWVudHMgVGVzdFJ1bGUsIFNhZmVDbGVhbmVyUnVsZS5EdW1wZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJBdXRvZmlsbExvZ2dpbmdUZXN0UnVsZSI7CiAKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtVGFnOworICAgIHByaXZhdGUgYm9vbGVhbiBtRHVtcGVkOwogCiAgICAgcHVibGljIEF1dG9maWxsTG9nZ2luZ1Rlc3RSdWxlKFN0cmluZyB0YWcpIHsKICAgICAgICAgbVRhZyA9IHRhZzsKQEAgLTQ2LDYgKzUxLDggQEAKIAogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBldmFsdWF0ZSgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0ZXN0TmFtZSA9IGRlc2NyaXB0aW9uLmdldERpc3BsYXlOYW1lKCk7CisgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiQEJlZm9yZSAiICsgdGVzdE5hbWUpOwogICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsZXZlbEJlZm9yZSA9IHJ1blNoZWxsQ29tbWFuZCgiY21kIGF1dG9maWxsIGdldCBsb2dfbGV2ZWwiKTsKICAgICAgICAgICAgICAgICBpZiAoIWxldmVsQmVmb3JlLmVxdWFscygidmVyYm9zZSIpKSB7CiAgICAgICAgICAgICAgICAgICAgIHJ1blNoZWxsQ29tbWFuZCgiY21kIGF1dG9maWxsIHNldCBsb2dfbGV2ZWwgdmVyYm9zZSIpOwpAQCAtNTMsMjIgKzYwLDM4IEBACiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgYmFzZS5ldmFsdWF0ZSgpOwogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgodCBpbnN0YW5jZW9mIEFzc3VtcHRpb25WaW9sYXRlZEV4Y2VwdGlvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgZXhjZXB0aW9uIGlzIHVzZWQgdG8gaW5kaWNhdGUgYSB0ZXN0IHNob3VsZCBiZSBza2lwcGVkIGFuZCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlZCBieSBKVW5pdCBydW5uZXJzIC0gd2UgZG9uJ3QgbmVlZCB0byBkdW1wIGl0Li4uCi0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhtVGFnLCAiaWdub3JpbmcgZXhjZXB0aW9uOiAiICsgdCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZHVtcCA9IHJ1blNoZWxsQ29tbWFuZCgiZHVtcHN5cyBhdXRvZmlsbCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUobVRhZywgImR1bXAgZm9yICIgKyBkZXNjcmlwdGlvbi5nZXREaXNwbGF5TmFtZSgpICsgIjogXG4iICsgZHVtcCwgdCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZHVtcCh0ZXN0TmFtZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgIHRocm93IHQ7CiAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFsZXZlbEJlZm9yZS5lcXVhbHMoInZlcmJvc2UiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcnVuU2hlbGxDb21tYW5kKCJjbWQgYXV0b2ZpbGwgc2V0IGxvZ19sZXZlbCAlcyIsIGxldmVsQmVmb3JlKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbGV2ZWxCZWZvcmUuZXF1YWxzKCJ2ZXJib3NlIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5TaGVsbENvbW1hbmQoImNtZCBhdXRvZmlsbCBzZXQgbG9nX2xldmVsICVzIiwgbGV2ZWxCZWZvcmUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiQEFmdGVyICIgKyB0ZXN0TmFtZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH07CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHVtcChATm9uTnVsbCBTdHJpbmcgdGVzdE5hbWUsIEBOb25OdWxsIFRocm93YWJsZSB0KSB7CisgICAgICAgIGlmIChtRHVtcGVkKSB7CisgICAgICAgICAgICBMb2cuZShtVGFnLCAiZHVtcCgiICsgdGVzdE5hbWUgKyAiKTogYWxyZWFkeSBkdW1wZWQiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHQgaW5zdGFuY2VvZiBBc3N1bXB0aW9uVmlvbGF0ZWRFeGNlcHRpb24pKSB7CisgICAgICAgICAgICAvLyBUaGlzIGV4Y2VwdGlvbiBpcyB1c2VkIHRvIGluZGljYXRlIGEgdGVzdCBzaG91bGQgYmUgc2tpcHBlZCBhbmQgaXMKKyAgICAgICAgICAgIC8vIGlnbm9yZWQgYnkgSlVuaXQgcnVubmVycyAtIHdlIGRvbid0IG5lZWQgdG8gZHVtcCBpdC4uLgorICAgICAgICAgICAgTG9nLncoVEFHLCAiaWdub3JpbmcgZXhjZXB0aW9uOiAiICsgdCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgTG9nLmUobVRhZywgIkR1bXBpbmcgYWZ0ZXIgZXhjZXB0aW9uIG9uICIgKyB0ZXN0TmFtZSwgdCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBhdXRvZmlsbER1bXAgPSBydW5TaGVsbENvbW1hbmQoImR1bXBzeXMgYXV0b2ZpbGwiKTsKKyAgICAgICAgTG9nLmUobVRhZywgImF1dG9maWxsIGR1bXA6IFxuIiArIGF1dG9maWxsRHVtcCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBhY3Rpdml0eUR1bXAgPSBydW5TaGVsbENvbW1hbmQoImR1bXBzeXMgYWN0aXZpdHkgdG9wIik7CisgICAgICAgIExvZy5lKG1UYWcsICJ0b3AgYWN0aXZpdHkgZHVtcDogXG4iICsgYWN0aXZpdHlEdW1wKTsKKyAgICAgICAgbUR1bXBlZCA9IHRydWU7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvQXV0b2ZpbGxWYWx1ZVRlc3QuamF2YSBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0F1dG9maWxsVmFsdWVUZXN0LmphdmEKaW5kZXggYzMxOTczMC4uYTYzYWZlNCAxMDA2NDQKLS0tIGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvQXV0b2ZpbGxWYWx1ZVRlc3QuamF2YQorKysgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9BdXRvZmlsbFZhbHVlVGVzdC5qYXZhCkBAIC0yMSw4ICsyMSw3IEBACiBpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydFRocm93czsKIAogaW1wb3J0IGFuZHJvaWQuaWN1LnV0aWwuQ2FsZW5kYXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmF1dG9maWxsLkF1dG9maWxsVmFsdWU7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQ29tcG91bmRCdXR0b247CkBAIC0zMyw2ICszMiw5IEBACiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuU3Bpbm5lcjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5UaW1lUGlja2VyOwogCitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5Ob25OdWxsOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTnVsbGFibGU7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpAQCAtNTEsNiArNTMsNyBAQAogICogIHJlZHVuZGFudCB0ZXN0cyBhbmQgYWRkIG1vcmUgdGVzdHMgKGxpa2UgdHJpZ2dlcmluZyBhdXRvZmlsbCB1c2luZyBkaWZmZXJlbnQgdmlld3MpIHRvCiAgKiAgQ2hlY2tvdXRBY3Rpdml0eVRlc3QuCiAgKi8KK0BBcHBNb2RlRnVsbCAvLyBVbml0IHRlc3QKIHB1YmxpYyBjbGFzcyBBdXRvZmlsbFZhbHVlVGVzdCBleHRlbmRzIEF1dG9GaWxsU2VydmljZVRlc3RDYXNlIHsKICAgICBAUnVsZQogICAgIHB1YmxpYyBmaW5hbCBBdXRvZmlsbEFjdGl2aXR5VGVzdFJ1bGU8QWxsQXV0b2ZpbGxhYmxlVmlld3NBY3Rpdml0eT4gbUFjdGl2aXR5UnVsZSA9CkBAIC0xODgsNyArMTkxLDcgQEAKICAgICAgICAgc3RhcnRBdXRvRmlsbChtRWRpdFRleHQpOwogCiAgICAgICAgIC8vIEF1dG9maWxsIGl0LgotICAgICAgICBzVWlCb3Quc2VsZWN0RGF0YXNldCgiZGF0YXNldCIpOworICAgICAgICBtVWlCb3Quc2VsZWN0RGF0YXNldCgiZGF0YXNldCIpOwogCiAgICAgICAgIGlmIChleHBlY3RBdXRvRmlsbCkgewogICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIHJlc3VsdHMuCkBAIC0yNDEsNyArMjQ0LDcgQEAKICAgICAgICAgc3RhcnRBdXRvRmlsbChtQ29tcG91bmRCdXR0b24pOwogCiAgICAgICAgIC8vIEF1dG9maWxsIGl0LgotICAgICAgICBzVWlCb3Quc2VsZWN0RGF0YXNldCgiZGF0YXNldCIpOworICAgICAgICBtVWlCb3Quc2VsZWN0RGF0YXNldCgiZGF0YXNldCIpOwogCiAgICAgICAgIGlmIChleHBlY3RBdXRvRmlsbCkgewogICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIHJlc3VsdHMuCkBAIC0yOTQsNyArMjk3LDcgQEAKICAgICAgICAgc3RhcnRBdXRvRmlsbChtU3Bpbm5lcik7CiAKICAgICAgICAgLy8gQXV0b2ZpbGwgaXQuCi0gICAgICAgIHNVaUJvdC5zZWxlY3REYXRhc2V0KCJkYXRhc2V0Iik7CisgICAgICAgIG1VaUJvdC5zZWxlY3REYXRhc2V0KCJkYXRhc2V0Iik7CiAKICAgICAgICAgaWYgKGV4cGVjdEF1dG9GaWxsKSB7CiAgICAgICAgICAgICAvLyBDaGVjayB0aGUgcmVzdWx0cy4KQEAgLTM2MSw3ICszNjQsNyBAQAogICAgICAgICBzdGFydEF1dG9GaWxsKG1FZGl0VGV4dCk7CiAKICAgICAgICAgLy8gQXV0b2ZpbGwgaXQuCi0gICAgICAgIHNVaUJvdC5zZWxlY3REYXRhc2V0KCJkYXRhc2V0Iik7CisgICAgICAgIG1VaUJvdC5zZWxlY3REYXRhc2V0KCJkYXRhc2V0Iik7CiAKICAgICAgICAgaWYgKGV4cGVjdEF1dG9GaWxsKSB7CiAgICAgICAgICAgICAvLyBDaGVjayB0aGUgcmVzdWx0cy4KQEAgLTQzMCw3ICs0MzMsNyBAQAogICAgICAgICBzdGFydEF1dG9GaWxsKG1FZGl0VGV4dCk7CiAKICAgICAgICAgLy8gQXV0b2ZpbGwgaXQuCi0gICAgICAgIHNVaUJvdC5zZWxlY3REYXRhc2V0KCJkYXRhc2V0Iik7CisgICAgICAgIG1VaUJvdC5zZWxlY3REYXRhc2V0KCJkYXRhc2V0Iik7CiAKICAgICAgICAgaWYgKGV4cGVjdEF1dG9GaWxsKSB7CiAgICAgICAgICAgICAvLyBDaGVjayB0aGUgcmVzdWx0cy4KQEAgLTQ4Niw3ICs0ODksNyBAQAogICAgICAgICBzdGFydEF1dG9GaWxsKG1FZGl0VGV4dCk7CiAKICAgICAgICAgLy8gQXV0b2ZpbGwgaXQuCi0gICAgICAgIHNVaUJvdC5zZWxlY3REYXRhc2V0KCJkYXRhc2V0Iik7CisgICAgICAgIG1VaUJvdC5zZWxlY3REYXRhc2V0KCJkYXRhc2V0Iik7CiAKICAgICAgICAgaWYgKGV4cGVjdEF1dG9GaWxsKSB7CiAgICAgICAgICAgICAvLyBDaGVjayB0aGUgcmVzdWx0cy4KZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0JhdGNoVXBkYXRlc1Rlc3QuamF2YSBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0JhdGNoVXBkYXRlc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGU1NzhhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvQmF0Y2hVcGRhdGVzVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0czsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi50cnV0aC5UcnV0aC5hc3NlcnRUaGF0OworCitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ubW9jazsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0VGhyb3dzOworCitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOworaW1wb3J0IGFuZHJvaWQuc2VydmljZS5hdXRvZmlsbC5CYXRjaFVwZGF0ZXM7CitpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLmF1dG9maWxsLkludGVybmFsVHJhbnNmb3JtYXRpb247CitpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLmF1dG9maWxsLlRyYW5zZm9ybWF0aW9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlJlbW90ZVZpZXdzOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKKworQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKK0BBcHBNb2RlRnVsbCAvLyBVbml0IHRlc3QKK3B1YmxpYyBjbGFzcyBCYXRjaFVwZGF0ZXNUZXN0IHsKKworICAgIHByaXZhdGUgZmluYWwgQmF0Y2hVcGRhdGVzLkJ1aWxkZXIgbUJ1aWxkZXIgPSBuZXcgQmF0Y2hVcGRhdGVzLkJ1aWxkZXIoKTsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFkZFRyYW5zZm9ybWF0aW9uX251bGwoKSB7CisgICAgICAgIGFzc2VydFRocm93cyhJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MsICgpIC0+ICBtQnVpbGRlci50cmFuc2Zvcm1DaGlsZCg0MiwgbnVsbCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFkZFRyYW5zZm9ybWF0aW9uX2ludmFsaWRDbGFzcygpIHsKKyAgICAgICAgYXNzZXJ0VGhyb3dzKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAoKSAtPiAgbUJ1aWxkZXIudHJhbnNmb3JtQ2hpbGQoNDIsIG1vY2soVHJhbnNmb3JtYXRpb24uY2xhc3MpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0VXBkYXRlVGVtcGxhdGVfbnVsbCgpIHsKKyAgICAgICAgYXNzZXJ0VGhyb3dzKE51bGxQb2ludGVyRXhjZXB0aW9uLmNsYXNzLCAoKSAtPiAgbUJ1aWxkZXIudXBkYXRlVGVtcGxhdGUobnVsbCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5T2JqZWN0KCkgeworICAgICAgICBhc3NlcnRUaHJvd3MoSWxsZWdhbFN0YXRlRXhjZXB0aW9uLmNsYXNzLCAoKSAtPiAgbUJ1aWxkZXIuYnVpbGQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9Nb3JlQ2hhbmdlc0FmdGVyQnVpbGQoKSB7CisgICAgICAgIGFzc2VydFRoYXQobUJ1aWxkZXIudXBkYXRlVGVtcGxhdGUobW9jayhSZW1vdGVWaWV3cy5jbGFzcykpLmJ1aWxkKCkpLmlzTm90TnVsbCgpOworICAgICAgICBhc3NlcnRUaHJvd3MoSWxsZWdhbFN0YXRlRXhjZXB0aW9uLmNsYXNzLAorICAgICAgICAgICAgICAgICgpIC0+ICBtQnVpbGRlci51cGRhdGVUZW1wbGF0ZShtb2NrKFJlbW90ZVZpZXdzLmNsYXNzKSkpOworICAgICAgICBhc3NlcnRUaHJvd3MoSWxsZWdhbFN0YXRlRXhjZXB0aW9uLmNsYXNzLAorICAgICAgICAgICAgICAgICgpIC0+ICBtQnVpbGRlci50cmFuc2Zvcm1DaGlsZCg0MiwgbW9jayhJbnRlcm5hbFRyYW5zZm9ybWF0aW9uLmNsYXNzKSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0Nhbm5lZEZpbGxSZXNwb25zZS5qYXZhIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvQ2FubmVkRmlsbFJlc3BvbnNlLmphdmEKaW5kZXggY2YyY2M2ZC4uMzNhYTAyNSAxMDA2NDQKLS0tIGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvQ2FubmVkRmlsbFJlc3BvbnNlLmphdmEKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvQ2FubmVkRmlsbFJlc3BvbnNlLmphdmEKQEAgLTI3LDggKzI3LDExIEBACiBpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLmF1dG9maWxsLkRhdGFzZXQ7CiBpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLmF1dG9maWxsLkZpbGxDYWxsYmFjazsKIGltcG9ydCBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuRmlsbFJlc3BvbnNlOworaW1wb3J0IGFuZHJvaWQuc2VydmljZS5hdXRvZmlsbC5TYW5pdGl6ZXI7CiBpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLmF1dG9maWxsLlNhdmVJbmZvOworaW1wb3J0IGFuZHJvaWQuc2VydmljZS5hdXRvZmlsbC5Vc2VyRGF0YTsKIGltcG9ydCBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuVmFsaWRhdG9yOworaW1wb3J0IGFuZHJvaWQudXRpbC5QYWlyOwogaW1wb3J0IGFuZHJvaWQudmlldy5hdXRvZmlsbC5BdXRvZmlsbElkOwogaW1wb3J0IGFuZHJvaWQudmlldy5hdXRvZmlsbC5BdXRvZmlsbFZhbHVlOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlJlbW90ZVZpZXdzOwpAQCAtMzksNiArNDIsNyBAQAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwogCiAvKioKICAqIEhlbHBlciBjbGFzcyB1c2VkIHRvIHByb2R1Y2UgYSB7QGxpbmsgRmlsbFJlc3BvbnNlfSBiYXNlZCBvbiBleHBlY3RlZCBmaWVsZHMgdGhhdCBzaG91bGQgYmUKQEAgLTU5LDIxICs2MywzMCBAQAogCiAgICAgcHJpdmF0ZSBmaW5hbCBSZXNwb25zZVR5cGUgbVJlc3BvbnNlVHlwZTsKICAgICBwcml2YXRlIGZpbmFsIExpc3Q8Q2FubmVkRGF0YXNldD4gbURhdGFzZXRzOworICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PFBhaXI8U2FuaXRpemVyLCBBdXRvZmlsbElkW10+PiBtU2FuaXRpemVyczsKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtRmFpbHVyZU1lc3NhZ2U7CiAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVNhdmVUeXBlOwogICAgIHByaXZhdGUgZmluYWwgVmFsaWRhdG9yIG1WYWxpZGF0b3I7CiAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBtUmVxdWlyZWRTYXZhYmxlSWRzOwogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nW10gbU9wdGlvbmFsU2F2YWJsZUlkczsKKyAgICBwcml2YXRlIGZpbmFsIEF1dG9maWxsSWRbXSBtUmVxdWlyZWRTYXZhYmxlQXV0b2ZpbGxJZHM7CiAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVNhdmVEZXNjcmlwdGlvbjsKICAgICBwcml2YXRlIGZpbmFsIEN1c3RvbURlc2NyaXB0aW9uIG1DdXN0b21EZXNjcmlwdGlvbjsKICAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtRXh0cmFzOwogICAgIHByaXZhdGUgZmluYWwgUmVtb3RlVmlld3MgbVByZXNlbnRhdGlvbjsKKyAgICBwcml2YXRlIGZpbmFsIFJlbW90ZVZpZXdzIG1IZWFkZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBSZW1vdGVWaWV3cyBtRm9vdGVyOwogICAgIHByaXZhdGUgZmluYWwgSW50ZW50U2VuZGVyIG1BdXRoZW50aWNhdGlvbjsKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZ1tdIG1BdXRoZW50aWNhdGlvbklkczsKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZ1tdIG1JZ25vcmVkSWRzOwogICAgIHByaXZhdGUgZmluYWwgaW50IG1OZWdhdGl2ZUFjdGlvblN0eWxlOwogICAgIHByaXZhdGUgZmluYWwgSW50ZW50U2VuZGVyIG1OZWdhdGl2ZUFjdGlvbkxpc3RlbmVyOwotICAgIHByaXZhdGUgZmluYWwgaW50IG1GbGFnczsKKyAgICBwcml2YXRlIGZpbmFsIGludCBtU2F2ZUluZm9GbGFnczsKKyAgICBwcml2YXRlIGZpbmFsIGludCBtRmlsbFJlc3BvbnNlRmxhZ3M7CisgICAgcHJpdmF0ZSBmaW5hbCBBdXRvZmlsbElkIG1TYXZlVHJpZ2dlcklkOworICAgIHByaXZhdGUgZmluYWwgbG9uZyBtRGlzYWJsZUR1cmF0aW9uOworICAgIHByaXZhdGUgZmluYWwgQXV0b2ZpbGxJZFtdIG1GaWVsZENsYXNzaWZpY2F0aW9uSWRzOworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtRmllbGRDbGFzc2lmaWNhdGlvbklkc092ZXJmbG93OwogCiAgICAgcHJpdmF0ZSBDYW5uZWRGaWxsUmVzcG9uc2UoQnVpbGRlciBidWlsZGVyKSB7CiAgICAgICAgIG1SZXNwb25zZVR5cGUgPSBidWlsZGVyLm1SZXNwb25zZVR5cGU7CkBAIC04MSwxOCArOTQsMjcgQEAKICAgICAgICAgbUZhaWx1cmVNZXNzYWdlID0gYnVpbGRlci5tRmFpbHVyZU1lc3NhZ2U7CiAgICAgICAgIG1WYWxpZGF0b3IgPSBidWlsZGVyLm1WYWxpZGF0b3I7CiAgICAgICAgIG1SZXF1aXJlZFNhdmFibGVJZHMgPSBidWlsZGVyLm1SZXF1aXJlZFNhdmFibGVJZHM7CisgICAgICAgIG1SZXF1aXJlZFNhdmFibGVBdXRvZmlsbElkcyA9IGJ1aWxkZXIubVJlcXVpcmVkU2F2YWJsZUF1dG9maWxsSWRzOwogICAgICAgICBtT3B0aW9uYWxTYXZhYmxlSWRzID0gYnVpbGRlci5tT3B0aW9uYWxTYXZhYmxlSWRzOwogICAgICAgICBtU2F2ZURlc2NyaXB0aW9uID0gYnVpbGRlci5tU2F2ZURlc2NyaXB0aW9uOwogICAgICAgICBtQ3VzdG9tRGVzY3JpcHRpb24gPSBidWlsZGVyLm1DdXN0b21EZXNjcmlwdGlvbjsKICAgICAgICAgbVNhdmVUeXBlID0gYnVpbGRlci5tU2F2ZVR5cGU7CiAgICAgICAgIG1FeHRyYXMgPSBidWlsZGVyLm1FeHRyYXM7CiAgICAgICAgIG1QcmVzZW50YXRpb24gPSBidWlsZGVyLm1QcmVzZW50YXRpb247CisgICAgICAgIG1IZWFkZXIgPSBidWlsZGVyLm1IZWFkZXI7CisgICAgICAgIG1Gb290ZXIgPSBidWlsZGVyLm1Gb290ZXI7CiAgICAgICAgIG1BdXRoZW50aWNhdGlvbiA9IGJ1aWxkZXIubUF1dGhlbnRpY2F0aW9uOwogICAgICAgICBtQXV0aGVudGljYXRpb25JZHMgPSBidWlsZGVyLm1BdXRoZW50aWNhdGlvbklkczsKICAgICAgICAgbUlnbm9yZWRJZHMgPSBidWlsZGVyLm1JZ25vcmVkSWRzOwogICAgICAgICBtTmVnYXRpdmVBY3Rpb25TdHlsZSA9IGJ1aWxkZXIubU5lZ2F0aXZlQWN0aW9uU3R5bGU7CiAgICAgICAgIG1OZWdhdGl2ZUFjdGlvbkxpc3RlbmVyID0gYnVpbGRlci5tTmVnYXRpdmVBY3Rpb25MaXN0ZW5lcjsKLSAgICAgICAgbUZsYWdzID0gYnVpbGRlci5tRmxhZ3M7CisgICAgICAgIG1TYW5pdGl6ZXJzID0gYnVpbGRlci5tU2FuaXRpemVyczsKKyAgICAgICAgbVNhdmVJbmZvRmxhZ3MgPSBidWlsZGVyLm1TYXZlSW5mb0ZsYWdzOworICAgICAgICBtRmlsbFJlc3BvbnNlRmxhZ3MgPSBidWlsZGVyLm1GaWxsUmVzcG9uc2VGbGFnczsKKyAgICAgICAgbVNhdmVUcmlnZ2VySWQgPSBidWlsZGVyLm1TYXZlVHJpZ2dlcklkOworICAgICAgICBtRGlzYWJsZUR1cmF0aW9uID0gYnVpbGRlci5tRGlzYWJsZUR1cmF0aW9uOworICAgICAgICBtRmllbGRDbGFzc2lmaWNhdGlvbklkcyA9IGJ1aWxkZXIubUZpZWxkQ2xhc3NpZmljYXRpb25JZHM7CisgICAgICAgIG1GaWVsZENsYXNzaWZpY2F0aW9uSWRzT3ZlcmZsb3cgPSBidWlsZGVyLm1GaWVsZENsYXNzaWZpY2F0aW9uSWRzT3ZlcmZsb3c7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMjIsNyArMTQ0LDggQEAKICAgICAgKiBzdHJ1Y3R1cmUuCiAgICAgICovCiAgICAgRmlsbFJlc3BvbnNlIGFzRmlsbFJlc3BvbnNlKEZ1bmN0aW9uPFN0cmluZywgVmlld05vZGU+IG5vZGVSZXNvbHZlcikgewotICAgICAgICBmaW5hbCBGaWxsUmVzcG9uc2UuQnVpbGRlciBidWlsZGVyID0gbmV3IEZpbGxSZXNwb25zZS5CdWlsZGVyKCk7CisgICAgICAgIGZpbmFsIEZpbGxSZXNwb25zZS5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRGbGFncyhtRmlsbFJlc3BvbnNlRmxhZ3MpOwogICAgICAgICBpZiAobURhdGFzZXRzICE9IG51bGwpIHsKICAgICAgICAgICAgIGZvciAoQ2FubmVkRGF0YXNldCBjYW5uZWREYXRhc2V0IDogbURhdGFzZXRzKSB7CiAgICAgICAgICAgICAgICAgZmluYWwgRGF0YXNldCBkYXRhc2V0ID0gY2FubmVkRGF0YXNldC5hc0RhdGFzZXQobm9kZVJlc29sdmVyKTsKQEAgLTEzMCwxNCArMTUzLDE4IEBACiAgICAgICAgICAgICAgICAgYnVpbGRlci5hZGREYXRhc2V0KGRhdGFzZXQpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGlmIChtUmVxdWlyZWRTYXZhYmxlSWRzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZpbmFsIFNhdmVJbmZvLkJ1aWxkZXIgc2F2ZUluZm8gPQotICAgICAgICAgICAgICAgICAgICBtUmVxdWlyZWRTYXZhYmxlSWRzID09IG51bGwgfHwgbVJlcXVpcmVkU2F2YWJsZUlkcy5sZW5ndGggPT0gMAorICAgICAgICBpZiAobVJlcXVpcmVkU2F2YWJsZUlkcyAhPSBudWxsIHx8IG1SZXF1aXJlZFNhdmFibGVBdXRvZmlsbElkcyAhPSBudWxsKSB7CisgICAgICAgICAgICBmaW5hbCBTYXZlSW5mby5CdWlsZGVyIHNhdmVJbmZvOworICAgICAgICAgICAgaWYgKG1SZXF1aXJlZFNhdmFibGVBdXRvZmlsbElkcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2F2ZUluZm8gPSBuZXcgU2F2ZUluZm8uQnVpbGRlcihtU2F2ZVR5cGUsIG1SZXF1aXJlZFNhdmFibGVBdXRvZmlsbElkcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNhdmVJbmZvID0gbVJlcXVpcmVkU2F2YWJsZUlkcyA9PSBudWxsIHx8IG1SZXF1aXJlZFNhdmFibGVJZHMubGVuZ3RoID09IDAKICAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IFNhdmVJbmZvLkJ1aWxkZXIobVNhdmVUeXBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3IFNhdmVJbmZvLkJ1aWxkZXIobVNhdmVUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QXV0b2ZpbGxJZHMobm9kZVJlc29sdmVyLCBtUmVxdWlyZWRTYXZhYmxlSWRzKSk7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHNhdmVJbmZvLnNldEZsYWdzKG1GbGFncyk7CisgICAgICAgICAgICBzYXZlSW5mby5zZXRGbGFncyhtU2F2ZUluZm9GbGFncyk7CiAKICAgICAgICAgICAgIGlmIChtVmFsaWRhdG9yICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBzYXZlSW5mby5zZXRWYWxpZGF0b3IobVZhbGlkYXRvcik7CkBAIC0xNTMsNiArMTgwLDE0IEBACiAgICAgICAgICAgICBpZiAobUN1c3RvbURlc2NyaXB0aW9uICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBzYXZlSW5mby5zZXRDdXN0b21EZXNjcmlwdGlvbihtQ3VzdG9tRGVzY3JpcHRpb24pOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKFBhaXI8U2FuaXRpemVyLCBBdXRvZmlsbElkW10+IHNhbml0aXplciA6IG1TYW5pdGl6ZXJzKSB7CisgICAgICAgICAgICAgICAgc2F2ZUluZm8uYWRkU2FuaXRpemVyKHNhbml0aXplci5maXJzdCwgc2FuaXRpemVyLnNlY29uZCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtU2F2ZVRyaWdnZXJJZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2F2ZUluZm8uc2V0VHJpZ2dlcklkKG1TYXZlVHJpZ2dlcklkKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJ1aWxkZXIuc2V0U2F2ZUluZm8oc2F2ZUluZm8uYnVpbGQoKSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1JZ25vcmVkSWRzICE9IG51bGwpIHsKQEAgLTE2Miw5ICsxOTcsMjkgQEAKICAgICAgICAgICAgIGJ1aWxkZXIuc2V0QXV0aGVudGljYXRpb24oZ2V0QXV0b2ZpbGxJZHMobm9kZVJlc29sdmVyLCBtQXV0aGVudGljYXRpb25JZHMpLAogICAgICAgICAgICAgICAgICAgICBtQXV0aGVudGljYXRpb24sIG1QcmVzZW50YXRpb24pOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWlsZGVyCi0gICAgICAgICAgICAgICAgLnNldENsaWVudFN0YXRlKG1FeHRyYXMpCi0gICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIGlmIChtRGlzYWJsZUR1cmF0aW9uID4gMCkgeworICAgICAgICAgICAgYnVpbGRlci5kaXNhYmxlQXV0b2ZpbGwobURpc2FibGVEdXJhdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1GaWVsZENsYXNzaWZpY2F0aW9uSWRzT3ZlcmZsb3cpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBsZW5ndGggPSBVc2VyRGF0YS5nZXRNYXhGaWVsZENsYXNzaWZpY2F0aW9uSWRzU2l6ZSgpICsgMTsKKyAgICAgICAgICAgIGZpbmFsIEF1dG9maWxsSWRbXSBmaWVsZElkcyA9IG5ldyBBdXRvZmlsbElkW2xlbmd0aF07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZmllbGRJZHNbaV0gPSBuZXcgQXV0b2ZpbGxJZChpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RmllbGRDbGFzc2lmaWNhdGlvbklkcyhmaWVsZElkcyk7CisgICAgICAgIH0gZWxzZSBpZiAobUZpZWxkQ2xhc3NpZmljYXRpb25JZHMgIT0gbnVsbCkgeworICAgICAgICAgICAgYnVpbGRlci5zZXRGaWVsZENsYXNzaWZpY2F0aW9uSWRzKG1GaWVsZENsYXNzaWZpY2F0aW9uSWRzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUV4dHJhcyAhPSBudWxsKSB7CisgICAgICAgICAgICBidWlsZGVyLnNldENsaWVudFN0YXRlKG1FeHRyYXMpOworICAgICAgICB9CisgICAgICAgIGlmIChtSGVhZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0SGVhZGVyKG1IZWFkZXIpOworICAgICAgICB9CisgICAgICAgIGlmIChtRm9vdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0Rm9vdGVyKG1Gb290ZXIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWlsZGVyLmJ1aWxkKCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xNzMsMTQgKzIyOCwyMyBAQAogICAgICAgICAgICAgICAgICsgIixkYXRhc2V0cz0iICsgbURhdGFzZXRzCiAgICAgICAgICAgICAgICAgKyAiLCByZXF1aXJlZFNhdmFibGVJZHM9IiArIEFycmF5cy50b1N0cmluZyhtUmVxdWlyZWRTYXZhYmxlSWRzKQogICAgICAgICAgICAgICAgICsgIiwgb3B0aW9uYWxTYXZhYmxlSWRzPSIgKyBBcnJheXMudG9TdHJpbmcobU9wdGlvbmFsU2F2YWJsZUlkcykKLSAgICAgICAgICAgICAgICArICIsIGZsYWdzPSIgKyBtRmxhZ3MKKyAgICAgICAgICAgICAgICArICIsIHJlcXVpcmVkU2F2YWJsZUF1dG9maWxsSWRzPSIgKyBBcnJheXMudG9TdHJpbmcobVJlcXVpcmVkU2F2YWJsZUF1dG9maWxsSWRzKQorICAgICAgICAgICAgICAgICsgIiwgc2F2ZUluZm9GbGFncz0iICsgbVNhdmVJbmZvRmxhZ3MKKyAgICAgICAgICAgICAgICArICIsIGZpbGxSZXNwb25zZUZsYWdzPSIgKyBtRmlsbFJlc3BvbnNlRmxhZ3MKICAgICAgICAgICAgICAgICArICIsIGZhaWx1cmVNZXNzYWdlPSIgKyBtRmFpbHVyZU1lc3NhZ2UKICAgICAgICAgICAgICAgICArICIsIHNhdmVEZXNjcmlwdGlvbj0iICsgbVNhdmVEZXNjcmlwdGlvbgogICAgICAgICAgICAgICAgICsgIiwgbUN1c3RvbURlc2NyaXB0aW9uPSIgKyBtQ3VzdG9tRGVzY3JpcHRpb24KICAgICAgICAgICAgICAgICArICIsIGhhc1ByZXNlbnRhdGlvbj0iICsgKG1QcmVzZW50YXRpb24gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICArICIsIGhhc0hlYWRlcj0iICsgKG1IZWFkZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICArICIsIGhhc0Zvb3Rlcj0iICsgKG1Gb290ZXIgIT0gbnVsbCkKICAgICAgICAgICAgICAgICArICIsIGhhc0F1dGhlbnRpY2F0aW9uPSIgKyAobUF1dGhlbnRpY2F0aW9uICE9IG51bGwpCiAgICAgICAgICAgICAgICAgKyAiLCBhdXRoZW50aWNhdGlvbklkcz0iICsgQXJyYXlzLnRvU3RyaW5nKG1BdXRoZW50aWNhdGlvbklkcykKICAgICAgICAgICAgICAgICArICIsIGlnbm9yZWRJZHM9IiArIEFycmF5cy50b1N0cmluZyhtSWdub3JlZElkcykKKyAgICAgICAgICAgICAgICArICIsIHNhbml0aXplcnMgPSIgKyBtU2FuaXRpemVycworICAgICAgICAgICAgICAgICsgIiwgc2F2ZVRyaWdnZXJJZD0iICsgbVNhdmVUcmlnZ2VySWQKKyAgICAgICAgICAgICAgICArICIsIGRpc2FibGVEdXJhdGlvbj0iICsgbURpc2FibGVEdXJhdGlvbgorICAgICAgICAgICAgICAgICsgIiwgZmllbGRDbGFzc2lmaWNhdGlvbklkcz0iICsgQXJyYXlzLnRvU3RyaW5nKG1GaWVsZENsYXNzaWZpY2F0aW9uSWRzKQorICAgICAgICAgICAgICAgICsgIiwgZmllbGRDbGFzc2lmaWNhdGlvbklkc092ZXJmbG93PSIgKyBtRmllbGRDbGFzc2lmaWNhdGlvbklkc092ZXJmbG93CiAgICAgICAgICAgICAgICAgKyAiXSI7CiAgICAgfQogCkBAIC0xOTIsMjIgKzI1NiwzMSBAQAogCiAgICAgc3RhdGljIGNsYXNzIEJ1aWxkZXIgewogICAgICAgICBwcml2YXRlIGZpbmFsIExpc3Q8Q2FubmVkRGF0YXNldD4gbURhdGFzZXRzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PFBhaXI8U2FuaXRpemVyLCBBdXRvZmlsbElkW10+PiBtU2FuaXRpemVycyA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgICBwcml2YXRlIGZpbmFsIFJlc3BvbnNlVHlwZSBtUmVzcG9uc2VUeXBlOwogICAgICAgICBwcml2YXRlIFN0cmluZyBtRmFpbHVyZU1lc3NhZ2U7CiAgICAgICAgIHByaXZhdGUgVmFsaWRhdG9yIG1WYWxpZGF0b3I7CiAgICAgICAgIHByaXZhdGUgU3RyaW5nW10gbVJlcXVpcmVkU2F2YWJsZUlkczsKICAgICAgICAgcHJpdmF0ZSBTdHJpbmdbXSBtT3B0aW9uYWxTYXZhYmxlSWRzOworICAgICAgICBwcml2YXRlIEF1dG9maWxsSWRbXSBtUmVxdWlyZWRTYXZhYmxlQXV0b2ZpbGxJZHM7CiAgICAgICAgIHByaXZhdGUgU3RyaW5nIG1TYXZlRGVzY3JpcHRpb247CiAgICAgICAgIHB1YmxpYyBDdXN0b21EZXNjcmlwdGlvbiBtQ3VzdG9tRGVzY3JpcHRpb247CiAgICAgICAgIHB1YmxpYyBpbnQgbVNhdmVUeXBlID0gLTE7CiAgICAgICAgIHByaXZhdGUgQnVuZGxlIG1FeHRyYXM7CiAgICAgICAgIHByaXZhdGUgUmVtb3RlVmlld3MgbVByZXNlbnRhdGlvbjsKKyAgICAgICAgcHJpdmF0ZSBSZW1vdGVWaWV3cyBtRm9vdGVyOworICAgICAgICBwcml2YXRlIFJlbW90ZVZpZXdzIG1IZWFkZXI7CiAgICAgICAgIHByaXZhdGUgSW50ZW50U2VuZGVyIG1BdXRoZW50aWNhdGlvbjsKICAgICAgICAgcHJpdmF0ZSBTdHJpbmdbXSBtQXV0aGVudGljYXRpb25JZHM7CiAgICAgICAgIHByaXZhdGUgU3RyaW5nW10gbUlnbm9yZWRJZHM7CiAgICAgICAgIHByaXZhdGUgaW50IG1OZWdhdGl2ZUFjdGlvblN0eWxlOwogICAgICAgICBwcml2YXRlIEludGVudFNlbmRlciBtTmVnYXRpdmVBY3Rpb25MaXN0ZW5lcjsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbUZsYWdzOworICAgICAgICBwcml2YXRlIGludCBtU2F2ZUluZm9GbGFnczsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbUZpbGxSZXNwb25zZUZsYWdzOworICAgICAgICBwcml2YXRlIEF1dG9maWxsSWQgbVNhdmVUcmlnZ2VySWQ7CisgICAgICAgIHByaXZhdGUgbG9uZyBtRGlzYWJsZUR1cmF0aW9uOworICAgICAgICBwcml2YXRlIEF1dG9maWxsSWRbXSBtRmllbGRDbGFzc2lmaWNhdGlvbklkczsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1GaWVsZENsYXNzaWZpY2F0aW9uSWRzT3ZlcmZsb3c7CiAKICAgICAgICAgcHVibGljIEJ1aWxkZXIoUmVzcG9uc2VUeXBlIHR5cGUpIHsKICAgICAgICAgICAgIG1SZXNwb25zZVR5cGUgPSB0eXBlOwpAQCAtMjMyLDE2ICszMDUsMzggQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSByZXF1aXJlZCBzYXZhYmxlIGlkcyBiYXNlZCBvbiB0aGV5IHtAY29kZSByZXNvdXJjZUlkfS4KKyAgICAgICAgICogU2V0cyB0aGUgcmVxdWlyZWQgc2F2YWJsZSBpZHMgYmFzZWQgb24gdGhlaXIge0Bjb2RlIHJlc291cmNlSWR9LgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0UmVxdWlyZWRTYXZhYmxlSWRzKGludCB0eXBlLCBTdHJpbmcuLi4gaWRzKSB7CisgICAgICAgICAgICBpZiAobVJlcXVpcmVkU2F2YWJsZUF1dG9maWxsSWRzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJBbHJlYWR5IHNldCByZXF1aXJlZCBhdXRvZmlsbCBpZHM6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgQXJyYXlzLnRvU3RyaW5nKG1SZXF1aXJlZFNhdmFibGVBdXRvZmlsbElkcykpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgbVNhdmVUeXBlID0gdHlwZTsKICAgICAgICAgICAgIG1SZXF1aXJlZFNhdmFibGVJZHMgPSBpZHM7CiAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldEZsYWdzKGludCBmbGFncykgewotICAgICAgICAgICAgbUZsYWdzID0gZmxhZ3M7CisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSByZXF1aXJlZCBzYXZhYmxlIGlkcyBiYXNlZCBvbiB0aGVpciB7QGNvZGUgYXV0b2ZpbGxJZH0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRSZXF1aXJlZFNhdmFibGVBdXRvZmlsbElkcyhpbnQgdHlwZSwgQXV0b2ZpbGxJZC4uLiBpZHMpIHsKKyAgICAgICAgICAgIGlmIChtUmVxdWlyZWRTYXZhYmxlSWRzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJBbHJlYWR5IHNldCByZXF1aXJlZCByZXNvdXJjZSBpZHM6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgQXJyYXlzLnRvU3RyaW5nKG1SZXF1aXJlZFNhdmFibGVJZHMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TYXZlVHlwZSA9IHR5cGU7CisgICAgICAgICAgICBtUmVxdWlyZWRTYXZhYmxlQXV0b2ZpbGxJZHMgPSBpZHM7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFNhdmVJbmZvRmxhZ3MoaW50IGZsYWdzKSB7CisgICAgICAgICAgICBtU2F2ZUluZm9GbGFncyA9IGZsYWdzOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRGaWxsUmVzcG9uc2VGbGFncyhpbnQgZmxhZ3MpIHsKKyAgICAgICAgICAgIG1GaWxsUmVzcG9uc2VGbGFncyA9IGZsYWdzOwogICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgIH0KIApAQCAtMzEyLDYgKzQwNywxNCBAQAogICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgIH0KIAorICAgICAgICAvKioKKyAgICAgICAgICogQWRkcyBhIHNhdmUgc2FuaXRpemVyLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkU2FuaXRpemVyKFNhbml0aXplciBzYW5pdGl6ZXIsIEF1dG9maWxsSWQuLi4gaWRzKSB7CisgICAgICAgICAgICBtU2FuaXRpemVycy5hZGQobmV3IFBhaXI8PihzYW5pdGl6ZXIsIGlkcykpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKwogICAgICAgICBwdWJsaWMgQ2FubmVkRmlsbFJlc3BvbnNlIGJ1aWxkKCkgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UodGhpcyk7CiAgICAgICAgIH0KQEAgLTMyNCw2ICs0MjcsNTAgQEAKICAgICAgICAgICAgIG1GYWlsdXJlTWVzc2FnZSA9IG1lc3NhZ2U7CiAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSB2aWV3IHRoYXQgZXhwbGljaXRseSB0cmlnZ2VycyBzYXZlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0U2F2ZVRyaWdnZXJJZChBdXRvZmlsbElkIGlkKSB7CisgICAgICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiYWxyZWFkeSBzZXQiKS50aGF0KG1TYXZlVHJpZ2dlcklkKS5pc051bGwoKTsKKyAgICAgICAgICAgIG1TYXZlVHJpZ2dlcklkID0gaWQ7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGRpc2FibGVBdXRvZmlsbChsb25nIGR1cmF0aW9uKSB7CisgICAgICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiYWxyZWFkeSBzZXQiKS50aGF0KG1EaXNhYmxlRHVyYXRpb24pLmlzRXF1YWxUbygwTCk7CisgICAgICAgICAgICBtRGlzYWJsZUR1cmF0aW9uID0gZHVyYXRpb247CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSBpZHMgdXNlZCBmb3IgZmllbGQgY2xhc3NpZmljYXRpb24uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRGaWVsZENsYXNzaWZpY2F0aW9uSWRzKEF1dG9maWxsSWQuLi4gaWRzKSB7CisgICAgICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiYWxyZWFkeSBzZXQiKS50aGF0KG1GaWVsZENsYXNzaWZpY2F0aW9uSWRzKS5pc051bGwoKTsKKyAgICAgICAgICAgIG1GaWVsZENsYXNzaWZpY2F0aW9uSWRzID0gaWRzOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogRm9yY2VzIHRoZSBzZXJ2aWNlIHRvIHRocm93IGFuIGV4Y2VwdGlvbiB3aGVuIHNldHRpbmcgdGhlIGZpZWxkcyBjbGFzc2lmaWNhdGlvbiBpZHMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRGaWVsZENsYXNzaWZpY2F0aW9uSWRzT3ZlcmZsb3coKSB7CisgICAgICAgICAgICBtRmllbGRDbGFzc2lmaWNhdGlvbklkc092ZXJmbG93ID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0SGVhZGVyKFJlbW90ZVZpZXdzIGhlYWRlcikgeworICAgICAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoImFscmVhZHkgc2V0IikudGhhdChtSGVhZGVyKS5pc051bGwoKTsKKyAgICAgICAgICAgIG1IZWFkZXIgPSBoZWFkZXI7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldEZvb3RlcihSZW1vdGVWaWV3cyBmb290ZXIpIHsKKyAgICAgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJhbHJlYWR5IHNldCIpLnRoYXQobUZvb3RlcikuaXNOdWxsKCk7CisgICAgICAgICAgICBtRm9vdGVyID0gZm9vdGVyOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTM0MywxNCArNDkwLDIwIEBACiAgICAgICovCiAgICAgc3RhdGljIGNsYXNzIENhbm5lZERhdGFzZXQgewogICAgICAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIEF1dG9maWxsVmFsdWU+IG1GaWVsZFZhbHVlczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBNYXA8QXV0b2ZpbGxJZCwgQXV0b2ZpbGxWYWx1ZT4gbUZpZWxkVmFsdWVzQnlJZDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBNYXA8QXV0b2ZpbGxJZCwgUmVtb3RlVmlld3M+IG1GaWVsZFByZXNlbnRhdGlvbnNCeUlkOwogICAgICAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFJlbW90ZVZpZXdzPiBtRmllbGRQcmVzZW50YXRpb25zOworICAgICAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFBhaXI8Qm9vbGVhbiwgUGF0dGVybj4+IG1GaWVsZEZpbHRlcnM7CiAgICAgICAgIHByaXZhdGUgZmluYWwgUmVtb3RlVmlld3MgbVByZXNlbnRhdGlvbjsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBJbnRlbnRTZW5kZXIgbUF1dGhlbnRpY2F0aW9uOwogICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtSWQ7CiAKICAgICAgICAgcHJpdmF0ZSBDYW5uZWREYXRhc2V0KEJ1aWxkZXIgYnVpbGRlcikgewogICAgICAgICAgICAgbUZpZWxkVmFsdWVzID0gYnVpbGRlci5tRmllbGRWYWx1ZXM7CisgICAgICAgICAgICBtRmllbGRWYWx1ZXNCeUlkID0gYnVpbGRlci5tRmllbGRWYWx1ZXNCeUlkOworICAgICAgICAgICAgbUZpZWxkUHJlc2VudGF0aW9uc0J5SWQgPSBidWlsZGVyLm1GaWVsZFByZXNlbnRhdGlvbnNCeUlkOwogICAgICAgICAgICAgbUZpZWxkUHJlc2VudGF0aW9ucyA9IGJ1aWxkZXIubUZpZWxkUHJlc2VudGF0aW9uczsKKyAgICAgICAgICAgIG1GaWVsZEZpbHRlcnMgPSBidWlsZGVyLm1GaWVsZEZpbHRlcnM7CiAgICAgICAgICAgICBtUHJlc2VudGF0aW9uID0gYnVpbGRlci5tUHJlc2VudGF0aW9uOwogICAgICAgICAgICAgbUF1dGhlbnRpY2F0aW9uID0gYnVpbGRlci5tQXV0aGVudGljYXRpb247CiAgICAgICAgICAgICBtSWQgPSBidWlsZGVyLm1JZDsKQEAgLTM3MSwxMyArNTI0LDM2IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiTm8gbm9kZSB3aXRoIHJlc291cmNlIGlkICIgKyBpZCk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZmluYWwgQXV0b2ZpbGxJZCBhdXRvZmlsbGlkID0gbm9kZS5nZXRBdXRvZmlsbElkKCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIEF1dG9maWxsSWQgYXV0b2ZpbGxJZCA9IG5vZGUuZ2V0QXV0b2ZpbGxJZCgpOwogICAgICAgICAgICAgICAgICAgICBmaW5hbCBBdXRvZmlsbFZhbHVlIHZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVtb3RlVmlld3MgcHJlc2VudGF0aW9uID0gbUZpZWxkUHJlc2VudGF0aW9ucy5nZXQoaWQpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBQYWlyPEJvb2xlYW4sIFBhdHRlcm4+IGZpbHRlciA9IG1GaWVsZEZpbHRlcnMuZ2V0KGlkKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXNlbnRhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLnNldFZhbHVlKGF1dG9maWxsaWQsIHZhbHVlLCBwcmVzZW50YXRpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5zZXRWYWx1ZShhdXRvZmlsbElkLCB2YWx1ZSwgcHJlc2VudGF0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5zZXRWYWx1ZShhdXRvZmlsbElkLCB2YWx1ZSwgZmlsdGVyLnNlY29uZCwgcHJlc2VudGF0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0VmFsdWUoYXV0b2ZpbGxpZCwgdmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5zZXRWYWx1ZShhdXRvZmlsbElkLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0VmFsdWUoYXV0b2ZpbGxJZCwgdmFsdWUsIGZpbHRlci5zZWNvbmQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1GaWVsZFZhbHVlc0J5SWQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIE5PVEU6IGZpbHRlciBpcyBub3QgeWV0IHN1cHBvcnRlZCB3aGVuIGNhbGxpbmcgbWV0aG9kcyB0aGF0IGV4cGxpY2l0bHkgcGFzcworICAgICAgICAgICAgICAgIC8vIGF1dG9maWxsIGlkCisgICAgICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8QXV0b2ZpbGxJZCwgQXV0b2ZpbGxWYWx1ZT4gZW50cnkgOiBtRmllbGRWYWx1ZXNCeUlkLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgQXV0b2ZpbGxJZCBhdXRvZmlsbElkID0gZW50cnkuZ2V0S2V5KCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIEF1dG9maWxsVmFsdWUgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZW1vdGVWaWV3cyBwcmVzZW50YXRpb24gPSBtRmllbGRQcmVzZW50YXRpb25zQnlJZC5nZXQoYXV0b2ZpbGxJZCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcmVzZW50YXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5zZXRWYWx1ZShhdXRvZmlsbElkLCB2YWx1ZSwgcHJlc2VudGF0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0VmFsdWUoYXV0b2ZpbGxJZCwgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMzg5LDEzICs1NjUsMjAgQEAKICAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgICAgIHJldHVybiAiQ2FubmVkRGF0YXNldCAiICsgbUlkICsgIiA6IFtoYXNQcmVzZW50YXRpb249IiArIChtUHJlc2VudGF0aW9uICE9IG51bGwpCiAgICAgICAgICAgICAgICAgICAgICsgIiwgZmllbGRQcmVzZW50YXRpb25zPSIgKyAobUZpZWxkUHJlc2VudGF0aW9ucykKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBmaWVsZFByZXNlbnRhdGlvbnNCeUlkPSIgKyAobUZpZWxkUHJlc2VudGF0aW9uc0J5SWQpCiAgICAgICAgICAgICAgICAgICAgICsgIiwgaGFzQXV0aGVudGljYXRpb249IiArIChtQXV0aGVudGljYXRpb24gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBmaWVsZFZhbHVlcz0iICsgbUZpZWxkVmFsdWVzICsgIl0iOworICAgICAgICAgICAgICAgICAgICArICIsIGZpZWxkVmFsdWVzPSIgKyBtRmllbGRWYWx1ZXMKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBmaWVsZFZhbHVlc0J5SWQ9IiArIG1GaWVsZFZhbHVlc0J5SWQKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBmaWVsZEZpbHRlcnM9IiArIG1GaWVsZEZpbHRlcnMgKyAiXSI7CiAgICAgICAgIH0KIAogICAgICAgICBzdGF0aWMgY2xhc3MgQnVpbGRlciB7CiAgICAgICAgICAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIEF1dG9maWxsVmFsdWU+IG1GaWVsZFZhbHVlcyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgTWFwPEF1dG9maWxsSWQsIEF1dG9maWxsVmFsdWU+IG1GaWVsZFZhbHVlc0J5SWQgPSBuZXcgSGFzaE1hcDw+KCk7CiAgICAgICAgICAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFJlbW90ZVZpZXdzPiBtRmllbGRQcmVzZW50YXRpb25zID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBNYXA8QXV0b2ZpbGxJZCwgUmVtb3RlVmlld3M+IG1GaWVsZFByZXNlbnRhdGlvbnNCeUlkID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBQYWlyPEJvb2xlYW4sIFBhdHRlcm4+PiBtRmllbGRGaWx0ZXJzID0gbmV3IEhhc2hNYXA8PigpOworCiAgICAgICAgICAgICBwcml2YXRlIFJlbW90ZVZpZXdzIG1QcmVzZW50YXRpb247CiAgICAgICAgICAgICBwcml2YXRlIEludGVudFNlbmRlciBtQXV0aGVudGljYXRpb247CiAgICAgICAgICAgICBwcml2YXRlIFN0cmluZyBtSWQ7CkBAIC00MjAsNiArNjAzLDIxIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogU2V0cyB0aGUgY2FubmVkIHZhbHVlIG9mIGEgdGV4dCBmaWVsZCBiYXNlZCBvbiBpdHMge0Bjb2RlIGlkfS4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiA8cD5UaGUgbWVhbmluZyBvZiB0aGUgaWQgaXMgZGVmaW5lZCBieSB0aGUgb2JqZWN0IHVzaW5nIHRoZSBjYW5uZWQgZGF0YXNldC4KKyAgICAgICAgICAgICAqIEZvciBleGFtcGxlLCB7QGxpbmsgSW5zdHJ1bWVudGVkQXV0b0ZpbGxTZXJ2aWNlLlJlcGxpZXJ9IHJlc29sdmVzIHRoZSBpZCBiYXNlZCBvbgorICAgICAgICAgICAgICoge0BsaW5rIElkTW9kZX0uCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldEZpZWxkKFN0cmluZyBpZCwgU3RyaW5nIHRleHQsIFBhdHRlcm4gZmlsdGVyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNldEZpZWxkKGlkLCBBdXRvZmlsbFZhbHVlLmZvclRleHQodGV4dCksIHRydWUsIGZpbHRlcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFVuZmlsdGVyYWJsZUZpZWxkKFN0cmluZyBpZCwgU3RyaW5nIHRleHQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2V0RmllbGQoaWQsIEF1dG9maWxsVmFsdWUuZm9yVGV4dCh0ZXh0KSwgZmFsc2UsIG51bGwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAqIFNldHMgdGhlIGNhbm5lZCB2YWx1ZSBvZiBhIGxpc3QgZmllbGQgYmFzZWQgb24gaXRzIGl0cyB7QGNvZGUgaWR9LgogICAgICAgICAgICAgICoKICAgICAgICAgICAgICAqIDxwPlRoZSBtZWFuaW5nIG9mIHRoZSBpZCBpcyBkZWZpbmVkIGJ5IHRoZSBvYmplY3QgdXNpbmcgdGhlIGNhbm5lZCBkYXRhc2V0LgpAQCAtNDY1LDYgKzY2MywyOCBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFNldHMgdGhlIGNhbm5lZCB2YWx1ZSBvZiBhIGRhdGUgZmllbGQgYmFzZWQgb24gaXRzIHtAY29kZSBhdXRvZmlsbElkfS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0RmllbGQoQXV0b2ZpbGxJZCBhdXRvZmlsbElkLCBBdXRvZmlsbFZhbHVlIHZhbHVlKSB7CisgICAgICAgICAgICAgICAgbUZpZWxkVmFsdWVzQnlJZC5wdXQoYXV0b2ZpbGxJZCwgdmFsdWUpOworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFNldHMgdGhlIGNhbm5lZCB2YWx1ZSBvZiBhIGRhdGUgZmllbGQgYmFzZWQgb24gaXRzIHtAY29kZSBpZH0uCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogPHA+VGhlIG1lYW5pbmcgb2YgdGhlIGlkIGlzIGRlZmluZWQgYnkgdGhlIG9iamVjdCB1c2luZyB0aGUgY2FubmVkIGRhdGFzZXQuCisgICAgICAgICAgICAgKiBGb3IgZXhhbXBsZSwge0BsaW5rIEluc3RydW1lbnRlZEF1dG9GaWxsU2VydmljZS5SZXBsaWVyfSByZXNvbHZlcyB0aGUgaWQgYmFzZWQgb24KKyAgICAgICAgICAgICAqIHtAbGluayBJZE1vZGV9LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRGaWVsZChTdHJpbmcgaWQsIEF1dG9maWxsVmFsdWUgdmFsdWUsIGJvb2xlYW4gZmlsdGVyYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgUGF0dGVybiBmaWx0ZXIpIHsKKyAgICAgICAgICAgICAgICBzZXRGaWVsZChpZCwgdmFsdWUpOworICAgICAgICAgICAgICAgIG1GaWVsZEZpbHRlcnMucHV0KGlkLCBuZXcgUGFpcjw+KGZpbHRlcmFibGUsIGZpbHRlcikpOworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAqIFNldHMgdGhlIGNhbm5lZCB2YWx1ZSBvZiBhIGZpZWxkIGJhc2VkIG9uIGl0cyB7QGNvZGUgaWR9LgogICAgICAgICAgICAgICoKICAgICAgICAgICAgICAqIDxwPlRoZSBtZWFuaW5nIG9mIHRoZSBpZCBpcyBkZWZpbmVkIGJ5IHRoZSBvYmplY3QgdXNpbmcgdGhlIGNhbm5lZCBkYXRhc2V0LgpAQCAtNDc4LDYgKzY5OCwyOSBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFNldHMgdGhlIGNhbm5lZCB2YWx1ZSBvZiBhIGRhdGUgZmllbGQgYmFzZWQgb24gaXRzIHtAY29kZSBhdXRvZmlsbElkfS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0RmllbGQoQXV0b2ZpbGxJZCBhdXRvZmlsbElkLCBTdHJpbmcgdGV4dCwgUmVtb3RlVmlld3MgcHJlc2VudGF0aW9uKSB7CisgICAgICAgICAgICAgICAgc2V0RmllbGQoYXV0b2ZpbGxJZCwgQXV0b2ZpbGxWYWx1ZS5mb3JUZXh0KHRleHQpKTsKKyAgICAgICAgICAgICAgICBtRmllbGRQcmVzZW50YXRpb25zQnlJZC5wdXQoYXV0b2ZpbGxJZCwgcHJlc2VudGF0aW9uKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBTZXRzIHRoZSBjYW5uZWQgdmFsdWUgb2YgYSBmaWVsZCBiYXNlZCBvbiBpdHMge0Bjb2RlIGlkfS4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiA8cD5UaGUgbWVhbmluZyBvZiB0aGUgaWQgaXMgZGVmaW5lZCBieSB0aGUgb2JqZWN0IHVzaW5nIHRoZSBjYW5uZWQgZGF0YXNldC4KKyAgICAgICAgICAgICAqIEZvciBleGFtcGxlLCB7QGxpbmsgSW5zdHJ1bWVudGVkQXV0b0ZpbGxTZXJ2aWNlLlJlcGxpZXJ9IHJlc29sdmVzIHRoZSBpZCBiYXNlZCBvbgorICAgICAgICAgICAgICoge0BsaW5rIElkTW9kZX0uCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldEZpZWxkKFN0cmluZyBpZCwgU3RyaW5nIHRleHQsIFJlbW90ZVZpZXdzIHByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgUGF0dGVybiBmaWx0ZXIpIHsKKyAgICAgICAgICAgICAgICBzZXRGaWVsZChpZCwgdGV4dCwgcHJlc2VudGF0aW9uKTsKKyAgICAgICAgICAgICAgICBtRmllbGRGaWx0ZXJzLnB1dChpZCwgbmV3IFBhaXI8Pih0cnVlLCBmaWx0ZXIpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgKiBTZXRzIHRoZSB2aWV3IHRvIHByZXNlbnQgdGhlIHJlc3BvbnNlIGluIHRoZSBVSS4KICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0UHJlc2VudGF0aW9uKFJlbW90ZVZpZXdzIHByZXNlbnRhdGlvbikgewpkaWZmIC0tZ2l0IGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvQ2hhclNlcXVlbmNlTWF0Y2hlci5qYXZhIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvQ2hhclNlcXVlbmNlTWF0Y2hlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzYTA0MDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9DaGFyU2VxdWVuY2VNYXRjaGVyLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0czsKKworaW1wb3J0IG9yZy5tb2NraXRvLkFyZ3VtZW50TWF0Y2hlcjsKKworZmluYWwgY2xhc3MgQ2hhclNlcXVlbmNlTWF0Y2hlciBpbXBsZW1lbnRzIEFyZ3VtZW50TWF0Y2hlcjxDaGFyU2VxdWVuY2U+IHsKKyAgICBwcml2YXRlIGZpbmFsIENoYXJTZXF1ZW5jZSBtRXhwZWN0ZWQ7CisKKyAgICBDaGFyU2VxdWVuY2VNYXRjaGVyKENoYXJTZXF1ZW5jZSBleHBlY3RlZCkgeworICAgICAgICBtRXhwZWN0ZWQgPSBleHBlY3RlZDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKENoYXJTZXF1ZW5jZSBhY3R1YWwpIHsKKyAgICAgICAgcmV0dXJuIGFjdHVhbC50b1N0cmluZygpLmVxdWFscyhtRXhwZWN0ZWQudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIG1FeHBlY3RlZC50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0NoYXJTZXF1ZW5jZVRyYW5zZm9ybWF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvQ2hhclNlcXVlbmNlVHJhbnNmb3JtYXRpb25UZXN0LmphdmEKaW5kZXggZTY4NDgzYi4uNmQ4MzliMCAxMDA2NDQKLS0tIGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvQ2hhclNlcXVlbmNlVHJhbnNmb3JtYXRpb25UZXN0LmphdmEKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvQ2hhclNlcXVlbmNlVHJhbnNmb3JtYXRpb25UZXN0LmphdmEKQEAgLTI1LDE5ICsyNSwyMSBAQAogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLndoZW47CiBpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydFRocm93czsKIAoraW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIGltcG9ydCBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuQ2hhclNlcXVlbmNlVHJhbnNmb3JtYXRpb247CiBpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLmF1dG9maWxsLlZhbHVlRmluZGVyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudmlldy5hdXRvZmlsbC5BdXRvZmlsbElkOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlJlbW90ZVZpZXdzOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKLWltcG9ydCBvcmcubW9ja2l0by5Bcmd1bWVudE1hdGNoZXI7CiAKIGltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKIAogQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKK0BBcHBNb2RlRnVsbCAvLyBVbml0IHRlc3QKIHB1YmxpYyBjbGFzcyBDaGFyU2VxdWVuY2VUcmFuc2Zvcm1hdGlvblRlc3QgewogCiAgICAgQFRlc3QKQEAgLTIyMSwxNiArMjIzLDI2IEBACiAgICAgICAgIHZlcmlmeSh0ZW1wbGF0ZSwgbmV2ZXIoKSkuc2V0Q2hhclNlcXVlbmNlKGVxKDApLCBhbnkoKSwgYW55KCkpOwogICAgIH0KIAotICAgIHN0YXRpYyBjbGFzcyBDaGFyU2VxdWVuY2VNYXRjaGVyIGltcGxlbWVudHMgQXJndW1lbnRNYXRjaGVyPENoYXJTZXF1ZW5jZT4gewotICAgICAgICBwcml2YXRlIGZpbmFsIENoYXJTZXF1ZW5jZSBtRXhwZWN0ZWQ7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmllbGRzQXJlQXBwbGllZEluT3JkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQXV0b2ZpbGxJZCBpZDEgPSBuZXcgQXV0b2ZpbGxJZCgxKTsKKyAgICAgICAgQXV0b2ZpbGxJZCBpZDIgPSBuZXcgQXV0b2ZpbGxJZCgyKTsKKyAgICAgICAgQXV0b2ZpbGxJZCBpZDMgPSBuZXcgQXV0b2ZpbGxJZCgzKTsKKyAgICAgICAgQ2hhclNlcXVlbmNlVHJhbnNmb3JtYXRpb24gdHJhbnMgPSBuZXcgQ2hhclNlcXVlbmNlVHJhbnNmb3JtYXRpb24KKyAgICAgICAgICAgICAgICAuQnVpbGRlcihpZDEsIFBhdHRlcm4uY29tcGlsZSgiYSIpLCAiQSIpCisgICAgICAgICAgICAgICAgLmFkZEZpZWxkKGlkMywgUGF0dGVybi5jb21waWxlKCJjIiksICJDIikKKyAgICAgICAgICAgICAgICAuYWRkRmllbGQoaWQyLCBQYXR0ZXJuLmNvbXBpbGUoImIiKSwgIkIiKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOwogCi0gICAgICAgIHB1YmxpYyBDaGFyU2VxdWVuY2VNYXRjaGVyKENoYXJTZXF1ZW5jZSBleHBlY3RlZCkgewotICAgICAgICAgICAgbUV4cGVjdGVkID0gZXhwZWN0ZWQ7Ci0gICAgICAgIH0KKyAgICAgICAgVmFsdWVGaW5kZXIgZmluZGVyID0gbW9jayhWYWx1ZUZpbmRlci5jbGFzcyk7CisgICAgICAgIFJlbW90ZVZpZXdzIHRlbXBsYXRlID0gbW9jayhSZW1vdGVWaWV3cy5jbGFzcyk7CiAKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoQ2hhclNlcXVlbmNlIGFjdHVhbCkgewotICAgICAgICAgICAgcmV0dXJuIGFjdHVhbC50b1N0cmluZygpLmVxdWFscyhtRXhwZWN0ZWQudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgd2hlbihmaW5kZXIuZmluZEJ5QXV0b2ZpbGxJZChpZDEpKS50aGVuUmV0dXJuKCJhIik7CisgICAgICAgIHdoZW4oZmluZGVyLmZpbmRCeUF1dG9maWxsSWQoaWQyKSkudGhlblJldHVybigiYiIpOworICAgICAgICB3aGVuKGZpbmRlci5maW5kQnlBdXRvZmlsbElkKGlkMykpLnRoZW5SZXR1cm4oImMiKTsKKworICAgICAgICB0cmFucy5hcHBseShmaW5kZXIsIHRlbXBsYXRlLCAwKTsKKworICAgICAgICB2ZXJpZnkodGVtcGxhdGUpLnNldENoYXJTZXF1ZW5jZShlcSgwKSwgYW55KCksIGFyZ1RoYXQobmV3IENoYXJTZXF1ZW5jZU1hdGNoZXIoIkFDQiIpKSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvQ2hlY2tvdXRBY3Rpdml0eS5qYXZhIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvQ2hlY2tvdXRBY3Rpdml0eS5qYXZhCmluZGV4IDg0YmUzNTUuLjE0MWI4ZDAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0NoZWNrb3V0QWN0aXZpdHkuamF2YQorKysgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9DaGVja291dEFjdGl2aXR5LmphdmEKQEAgLTIxLDYgKzIxLDcgQEAKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkNoZWNrQm94OwpAQCAtNDUsNiArNDYsNyBAQAogICogPC91bD4KICAqLwogcHVibGljIGNsYXNzIENoZWNrb3V0QWN0aXZpdHkgZXh0ZW5kcyBBYnN0cmFjdEF1dG9GaWxsQWN0aXZpdHkgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQ2hlY2tvdXRBY3Rpdml0eSI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBCVVlfVElNRU9VVF9NUyA9IDEwMDA7CiAKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0NDX05VTUJFUiA9ICJjY19udW1iZXIiOwpAQCAtMTA0LDkgKzEwNiwxOCBAQAogICAgICAgICBtQ2xlYXJCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKCh2KSAtPiByZXNldEZpZWxkcygpKTsKICAgICB9CiAKLSAgICBzdGF0aWMgdm9pZCBmaW5pc2hJdCgpIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmaW5pc2goKSB7CisgICAgICAgIHN1cGVyLmZpbmlzaCgpOworCisgICAgICAgIHNJbnN0YW5jZSA9IG51bGw7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgZmluaXNoSXQoVWlCb3QgdWlCb3QpIHsKICAgICAgICAgaWYgKHNJbnN0YW5jZSAhPSBudWxsKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJTbyBsb25nIGFuZCB0aGFua3MgZm9yIGFsbCB0aGUgZmlzaCEiKTsKICAgICAgICAgICAgIHNJbnN0YW5jZS5maW5pc2goKTsKKyAgICAgICAgICAgIHVpQm90LmFzc2VydEdvbmVCeVJlbGF0aXZlSWQoSURfQ0NfTlVNQkVSLCBUaW1lb3V0cy5BQ1RJVklUWV9SRVNVUlJFQ1RJT04pOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9DaGVja291dEFjdGl2aXR5VGVzdC5qYXZhIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvQ2hlY2tvdXRBY3Rpdml0eVRlc3QuamF2YQppbmRleCA1OWIwYjdjLi42NzM5YTczIDEwMDY0NAotLS0gYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9DaGVja291dEFjdGl2aXR5VGVzdC5qYXZhCisrKyBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0NoZWNrb3V0QWN0aXZpdHlUZXN0LmphdmEKQEAgLTQyLDE1ICs0MiwxNiBAQAogaW1wb3J0IGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5DYW5uZWRGaWxsUmVzcG9uc2UuQ2FubmVkRGF0YXNldDsKIGltcG9ydCBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSW5zdHJ1bWVudGVkQXV0b0ZpbGxTZXJ2aWNlLkZpbGxSZXF1ZXN0OwogaW1wb3J0IGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5JbnN0cnVtZW50ZWRBdXRvRmlsbFNlcnZpY2UuU2F2ZVJlcXVlc3Q7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOwogaW1wb3J0IGFuZHJvaWQuc2VydmljZS5hdXRvZmlsbC5DaGFyU2VxdWVuY2VUcmFuc2Zvcm1hdGlvbjsKIGltcG9ydCBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuQ3VzdG9tRGVzY3JpcHRpb247CitpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLmF1dG9maWxsLkltYWdlVHJhbnNmb3JtYXRpb247CiBpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QudWlhdXRvbWF0b3IuQnk7CiBpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QudWlhdXRvbWF0b3IuVWlPYmplY3QyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFycmF5QWRhcHRlcjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3czsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5TcGlubmVyOwogCi1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CkBAIC03NCwxMSArNzUsNiBAQAogICAgICAgICBtQWN0aXZpdHkgPSBtQWN0aXZpdHlSdWxlLmdldEFjdGl2aXR5KCk7CiAgICAgfQogCi0gICAgQEFmdGVyCi0gICAgcHVibGljIHZvaWQgZmluaXNoV2VsY29tZUFjdGl2aXR5KCkgewotICAgICAgICBXZWxjb21lQWN0aXZpdHkuZmluaXNoSXQoKTsKLSAgICB9Ci0KICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvZmlsbCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBTZXQgc2VydmljZS4KQEAgLTExMiwxMyArMTA4LDE0IEBACiAgICAgICAgICAgICAgICAgLmluT3JkZXIoKTsKIAogICAgICAgICAvLyBBdXRvLWZpbGwgaXQuCi0gICAgICAgIHNVaUJvdC5zZWxlY3REYXRhc2V0KCJBQ01FIENDIik7CisgICAgICAgIG1VaUJvdC5zZWxlY3REYXRhc2V0KCJBQ01FIENDIik7CiAKICAgICAgICAgLy8gQ2hlY2sgdGhlIHJlc3VsdHMuCiAgICAgICAgIG1BY3Rpdml0eS5hc3NlcnRBdXRvRmlsbGVkKCk7CiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gdGVzdEF1dG9maWxsKCkgaXMgZW5vdWdoIHRvIHRlc3QgZXBoZW1lcmFsIGFwcHMgc3VwcG9ydAogICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvZmlsbER5bmFtaWNBZGFwdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFNldCBhY3Rpdml0eS4KICAgICAgICAgbUFjdGl2aXR5Lm9uQ2NFeHBpcmF0aW9uKCh2KSAtPiB2LnNldEFkYXB0ZXIobmV3IEFycmF5QWRhcHRlcjxTdHJpbmc+KGdldENvbnRleHQoKSwKQEAgLTE1Miw3ICsxNDksNyBAQAogICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiY2NFeHBpcmF0aW9uTm9kZS5nZXRBdXRvRmlsbE9wdGlvbnMoKSIpLnRoYXQob3B0aW9ucykuaXNOdWxsKCk7CiAKICAgICAgICAgLy8gQXV0by1maWxsIGl0LgotICAgICAgICBzVWlCb3Quc2VsZWN0RGF0YXNldCgiQUNNRSBDQyIpOworICAgICAgICBtVWlCb3Quc2VsZWN0RGF0YXNldCgiQUNNRSBDQyIpOwogCiAgICAgICAgIC8vIENoZWNrIHRoZSByZXN1bHRzLgogICAgICAgICBtQWN0aXZpdHkuYXNzZXJ0QXV0b0ZpbGxlZCgpOwpAQCAtMTYxLDYgKzE1OCw3IEBACiAgICAgLy8gVE9ETzogdGhpcyBzaG91bGQgYmUgYSBwdXJlIHVuaXQgdGVzdCBleGVyY2lzaW5nIG9uUHJvdmlkZUF1dG9maWxsU3RydWN0dXJlKCksCiAgICAgLy8gYnV0IHRoYXQgd291bGQgcmVxdWlyZSBjcmVhdGluZyBhIGN1c3RvbSBWaWV3U3RydWN0dXJlLgogICAgIEBUZXN0CisgICAgQEFwcE1vZGVGdWxsIC8vIFVuaXQgdGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBdXRvZmlsbE9wdGlvbnNTb3J0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gU2V0IHNlcnZpY2UuCiAgICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKQEAgLTE5NSw3ICsxOTMsNyBAQAogICAgICAgICAgICAgICAgIC5jb250YWluc0V4YWN0bHkoIm5ldmVyIiwgInRvZGF5IiwgInRvbW9ycm93IiwgInllc3RlcmRheSIpLmluT3JkZXIoKTsKIAogICAgICAgICAvLyBBdXRvLWZpbGwgaXQuCi0gICAgICAgIHNVaUJvdC5zZWxlY3REYXRhc2V0KCJBQ01FIENDIik7CisgICAgICAgIG1VaUJvdC5zZWxlY3REYXRhc2V0KCJBQ01FIENDIik7CiAKICAgICAgICAgLy8gQ2hlY2sgdGhlIHJlc3VsdHMuCiAgICAgICAgIG1BY3Rpdml0eS5hc3NlcnRBdXRvRmlsbGVkKCk7CkBAIC0yMzUsNyArMjMzLDcgQEAKICAgICAgICAgbUFjdGl2aXR5Lm9uQWRkcmVzcygodikgLT4gdi5jaGVjayhSLmlkLndvcmtfYWRkcmVzcykpOwogICAgICAgICBtQWN0aXZpdHkub25TYXZlQ2MoKHYpIC0+IHYuc2V0Q2hlY2tlZChmYWxzZSkpOwogICAgICAgICBtQWN0aXZpdHkudGFwQnV5KCk7Ci0gICAgICAgIHNVaUJvdC5zYXZlRm9yQXV0b2ZpbGwodHJ1ZSwgU0FWRV9EQVRBX1RZUEVfQ1JFRElUX0NBUkQpOworICAgICAgICBtVWlCb3Quc2F2ZUZvckF1dG9maWxsKHRydWUsIFNBVkVfREFUQV9UWVBFX0NSRURJVF9DQVJEKTsKICAgICAgICAgZmluYWwgU2F2ZVJlcXVlc3Qgc2F2ZVJlcXVlc3QgPSBzUmVwbGllci5nZXROZXh0U2F2ZVJlcXVlc3QoKTsKIAogICAgICAgICAvLyBBc3NlcnQgc2FuaXRpemF0aW9uIG9uIHNhdmU6IGV2ZXJ5dGhpbmcgc2hvdWxkIGJlIGF2YWlsYWJsZSEKQEAgLTI0OSwxMSArMjQ3LDIyIEBACiAgICAgICAgIGFzc2VydFRvZ2dsZVZhbHVlKGZpbmROb2RlQnlSZXNvdXJjZUlkKHNhdmVSZXF1ZXN0LnN0cnVjdHVyZSwgSURfU0FWRV9DQyksIGZhbHNlKTsKICAgICB9CiAKKyAgICBAVGVzdAorICAgIEBBcHBNb2RlRnVsbCAvLyBTZXJ2aWNlLXNwZWNpZmljIHRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9taXplZFNhdmVVaSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBjdXN0b21pemVkU2F2ZVVpKGZhbHNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBBcHBNb2RlRnVsbCAvLyBTZXJ2aWNlLXNwZWNpZmljIHRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9taXplZFNhdmVVaVdpdGhDb250ZW50RGVzY3JpcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgY3VzdG9taXplZFNhdmVVaSh0cnVlKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBUZXN0cyB0aGF0IGEgc3Bpbm5lciBjYW4gYmUgdXNlZCBvbiBjdXN0b20gc2F2ZSBkZXNjcmlwdGlvbnMuCiAgICAgICovCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9taXplZFNhdmVVaSgpIHRocm93cyBFeGNlcHRpb24geworICAgIHByaXZhdGUgdm9pZCBjdXN0b21pemVkU2F2ZVVpKGJvb2xlYW4gd2l0aENvbnRlbnREZXNjcmlwdGlvbikgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFNldCBzZXJ2aWNlLgogICAgICAgICBlbmFibGVTZXJ2aWNlKCk7CiAKQEAgLTI2OCw5ICsyNzcsMTggQEAKICAgICAgICAgZmluYWwgQ2hhclNlcXVlbmNlVHJhbnNmb3JtYXRpb24gdHJhbnMyID0gbmV3IENoYXJTZXF1ZW5jZVRyYW5zZm9ybWF0aW9uCiAgICAgICAgICAgICAgICAgLkJ1aWxkZXIobUFjdGl2aXR5LmdldENjRXhwaXJhdGlvbigpLmdldEF1dG9maWxsSWQoKSwgUGF0dGVybi5jb21waWxlKCIoLiopIiksICIkMSIpCiAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIGZpbmFsIEltYWdlVHJhbnNmb3JtYXRpb24gdHJhbnMzID0gKHdpdGhDb250ZW50RGVzY3JpcHRpb24KKyAgICAgICAgICAgICAgICA/IG5ldyBJbWFnZVRyYW5zZm9ybWF0aW9uLkJ1aWxkZXIobUFjdGl2aXR5LmdldENjTnVtYmVyKCkuZ2V0QXV0b2ZpbGxJZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgUGF0dGVybi5jb21waWxlKCIoLiopIiksIFIuZHJhd2FibGUuYW5kcm9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJPbmUgaW1hZ2UgaXMgd29ydGggdGhvdXNhbmQgd29yZHMiKQorICAgICAgICAgICAgICAgIDogbmV3IEltYWdlVHJhbnNmb3JtYXRpb24uQnVpbGRlcihtQWN0aXZpdHkuZ2V0Q2NOdW1iZXIoKS5nZXRBdXRvZmlsbElkKCksCisgICAgICAgICAgICAgICAgICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoIiguKikiKSwgUi5kcmF3YWJsZS5hbmRyb2lkKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKwogICAgICAgICBmaW5hbCBDdXN0b21EZXNjcmlwdGlvbiBjdXN0b21EZXNjcmlwdGlvbiA9IG5ldyBDdXN0b21EZXNjcmlwdGlvbi5CdWlsZGVyKHByZXNlbnRhdGlvbikKICAgICAgICAgICAgICAgICAuYWRkQ2hpbGQoUi5pZC5maXJzdCwgdHJhbnMxKQogICAgICAgICAgICAgICAgIC5hZGRDaGlsZChSLmlkLnNlY29uZCwgdHJhbnMyKQorICAgICAgICAgICAgICAgIC5hZGRDaGlsZChSLmlkLmltZywgdHJhbnMzKQogICAgICAgICAgICAgICAgIC5idWlsZCgpOwogCiAgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpCkBAIC0yOTEsMTAgKzMwOSwxMCBAQAogICAgICAgICBtQWN0aXZpdHkudGFwQnV5KCk7CiAKICAgICAgICAgLy8gRmlyc3QgbWFrZSBzdXJlIHRoZSBVSSBpcyBzaG93bi4uLgotICAgICAgICBmaW5hbCBVaU9iamVjdDIgc2F2ZVVpID0gc1VpQm90LmFzc2VydFNhdmVTaG93aW5nKFNBVkVfREFUQV9UWVBFX0NSRURJVF9DQVJEKTsKKyAgICAgICAgZmluYWwgVWlPYmplY3QyIHNhdmVVaSA9IG1VaUJvdC5hc3NlcnRTYXZlU2hvd2luZyhTQVZFX0RBVEFfVFlQRV9DUkVESVRfQ0FSRCk7CiAKICAgICAgICAgLy8gVGhlbiBtYWtlIHN1cmUgaXQgZG9lcyBoYXZlIHRoZSBjdXN0b20gdmlld3Mgb24gaXQuLi4KLSAgICAgICAgZmluYWwgVWlPYmplY3QyIHN0YXRpY1RleHQgPSBzYXZlVWkuZmluZE9iamVjdChCeS5yZXMocGFja2FnZU5hbWUsICJzdGF0aWNfdGV4dCIpKTsKKyAgICAgICAgZmluYWwgVWlPYmplY3QyIHN0YXRpY1RleHQgPSBzYXZlVWkuZmluZE9iamVjdChCeS5yZXMocGFja2FnZU5hbWUsIEhlbHBlci5JRF9TVEFUSUNfVEVYVCkpOwogICAgICAgICBhc3NlcnRUaGF0KHN0YXRpY1RleHQpLmlzTm90TnVsbCgpOwogICAgICAgICBhc3NlcnRUaGF0KHN0YXRpY1RleHQuZ2V0VGV4dCgpKS5pc0VxdWFsVG8oIllPOiIpOwogCkBAIC0zMDUsNiArMzIzLDE1IEBACiAgICAgICAgIGZpbmFsIFVpT2JqZWN0MiBleHBpcmF0aW9uID0gc2F2ZVVpLmZpbmRPYmplY3QoQnkucmVzKHBhY2thZ2VOYW1lLCAic2Vjb25kIikpOwogICAgICAgICBhc3NlcnRUaGF0KGV4cGlyYXRpb24pLmlzTm90TnVsbCgpOwogICAgICAgICBhc3NlcnRUaGF0KGV4cGlyYXRpb24uZ2V0VGV4dCgpKS5pc0VxdWFsVG8oInRvZGF5Iik7CisKKyAgICAgICAgZmluYWwgVWlPYmplY3QyIGltYWdlID0gc2F2ZVVpLmZpbmRPYmplY3QoQnkucmVzKHBhY2thZ2VOYW1lLCAiaW1nIikpOworICAgICAgICBhc3NlcnRUaGF0KGltYWdlKS5pc05vdE51bGwoKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGNvbnRlbnREZXNjcmlwdGlvbiA9IGltYWdlLmdldENvbnRlbnREZXNjcmlwdGlvbigpOworICAgICAgICBpZiAod2l0aENvbnRlbnREZXNjcmlwdGlvbikgeworICAgICAgICAgICAgYXNzZXJ0VGhhdChjb250ZW50RGVzY3JpcHRpb24pLmlzRXF1YWxUbygiT25lIGltYWdlIGlzIHdvcnRoIHRob3VzYW5kIHdvcmRzIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGNvbnRlbnREZXNjcmlwdGlvbikuaXNOdWxsKCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTM1Myw5ICszODAsOSBAQAogICAgICAgICBtQWN0aXZpdHkudGFwQnV5KCk7CiAKICAgICAgICAgLy8gRmlyc3QgbWFrZSBzdXJlIHRoZSBVSSBpcyBzaG93bi4uLgotICAgICAgICBmaW5hbCBVaU9iamVjdDIgc2F2ZVVpID0gc1VpQm90LmFzc2VydFNhdmVTaG93aW5nKFNBVkVfREFUQV9UWVBFX0NSRURJVF9DQVJEKTsKKyAgICAgICAgZmluYWwgVWlPYmplY3QyIHNhdmVVaSA9IG1VaUJvdC5hc3NlcnRTYXZlU2hvd2luZyhTQVZFX0RBVEFfVFlQRV9DUkVESVRfQ0FSRCk7CiAKICAgICAgICAgLy8gVGhlbiBtYWtlIHN1cmUgaXQgZG9lcyBub3QgaGF2ZSB0aGUgY3VzdG9tIHZpZXdzIG9uIGl0Li4uCi0gICAgICAgIGFzc2VydFRoYXQoc2F2ZVVpLmZpbmRPYmplY3QoQnkucmVzKHBhY2thZ2VOYW1lLCAic3RhdGljX3RleHQiKSkpLmlzTnVsbCgpOworICAgICAgICBhc3NlcnRUaGF0KHNhdmVVaS5maW5kT2JqZWN0KEJ5LnJlcyhwYWNrYWdlTmFtZSwgSGVscGVyLklEX1NUQVRJQ19URVhUKSkpLmlzTnVsbCgpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0N1c3RvbURlc2NyaXB0aW9uRGF0ZVRlc3QuamF2YSBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0N1c3RvbURlc2NyaXB0aW9uRGF0ZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODU4Mjc4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvQ3VzdG9tRGVzY3JpcHRpb25EYXRlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5BYnN0cmFjdERhdGVQaWNrZXJBY3Rpdml0eS5JRF9EQVRFX1BJQ0tFUjsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkFic3RyYWN0RGF0ZVBpY2tlckFjdGl2aXR5LklEX09VVFBVVDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5nZXRDb250ZXh0OworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuU2F2ZUluZm8uU0FWRV9EQVRBX1RZUEVfR0VORVJJQzsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi50cnV0aC5UcnV0aC5hc3NlcnRUaGF0OworCitpbXBvcnQgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkNhbm5lZEZpbGxSZXNwb25zZS5DYW5uZWREYXRhc2V0OworaW1wb3J0IGFuZHJvaWQuaWN1LnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CitpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLmF1dG9maWxsLkN1c3RvbURlc2NyaXB0aW9uOworaW1wb3J0IGFuZHJvaWQuc2VydmljZS5hdXRvZmlsbC5EYXRlVHJhbnNmb3JtYXRpb247CitpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLmF1dG9maWxsLkRhdGVWYWx1ZVNhbml0aXplcjsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC51aWF1dG9tYXRvci5CeTsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC51aWF1dG9tYXRvci5VaU9iamVjdDI7CitpbXBvcnQgYW5kcm9pZC52aWV3LmF1dG9maWxsLkF1dG9maWxsSWQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3M7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOworCitAQXBwTW9kZUZ1bGwgLy8gU2VydmljZS1zcGVjaWZpYyB0ZXN0CitwdWJsaWMgY2xhc3MgQ3VzdG9tRGVzY3JpcHRpb25EYXRlVGVzdCBleHRlbmRzIEF1dG9GaWxsU2VydmljZVRlc3RDYXNlIHsKKworICAgIEBSdWxlCisgICAgcHVibGljIGZpbmFsIEF1dG9maWxsQWN0aXZpdHlUZXN0UnVsZTxEYXRlUGlja2VyU3Bpbm5lckFjdGl2aXR5PiBtQWN0aXZpdHlSdWxlID0gbmV3CisgICAgICAgICAgICBBdXRvZmlsbEFjdGl2aXR5VGVzdFJ1bGU8RGF0ZVBpY2tlclNwaW5uZXJBY3Rpdml0eT4oRGF0ZVBpY2tlclNwaW5uZXJBY3Rpdml0eS5jbGFzcyk7CisKKyAgICBwcml2YXRlIERhdGVQaWNrZXJTcGlubmVyQWN0aXZpdHkgbUFjdGl2aXR5OworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldEFjdGl2aXR5KCkgeworICAgICAgICBtQWN0aXZpdHkgPSBtQWN0aXZpdHlSdWxlLmdldEFjdGl2aXR5KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tU2F2ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBTZXQgc2VydmljZS4KKyAgICAgICAgZW5hYmxlU2VydmljZSgpOworCisgICAgICAgIGZpbmFsIEF1dG9maWxsSWQgaWQgPSBtQWN0aXZpdHkuZ2V0RGF0ZVBpY2tlcigpLmdldEF1dG9maWxsSWQoKTsKKworICAgICAgICAvLyBTZXQgZXhwZWN0YXRpb25zLgorICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRDdXN0b21EZXNjcmlwdGlvbihuZXcgQ3VzdG9tRGVzY3JpcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIC5CdWlsZGVyKG5ld1RlbXBsYXRlKFIubGF5b3V0LnR3b19ob3Jpem9udGFsX3RleHRfZmllbGRzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDaGlsZChSLmlkLmZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGF0ZVRyYW5zZm9ybWF0aW9uKGlkLCBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiTU0veXl5eSIpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDaGlsZChSLmlkLnNlY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERhdGVUcmFuc2Zvcm1hdGlvbihpZCwgbmV3IFNpbXBsZURhdGVGb3JtYXQoIk1NLXl5IikpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLnNldFJlcXVpcmVkU2F2YWJsZUlkcyhTQVZFX0RBVEFfVFlQRV9HRU5FUklDLCBJRF9PVVRQVVQsIElEX0RBVEVfUElDS0VSKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAvLyBUcmlnZ2VyIGF1dG8tZmlsbC4KKyAgICAgICAgbUFjdGl2aXR5Lm9uT3V0cHV0KCh2KSAtPiB2LnJlcXVlc3RGb2N1cygpKTsKKyAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CisKKyAgICAgICAgLy8gQXV0b2ZpbGwgaXQuCisgICAgICAgIG1VaUJvdC5hc3NlcnROb0RhdGFzZXRzRXZlcigpOworCisgICAgICAgIC8vIFRyaWdnZXIgc2F2ZS4KKyAgICAgICAgbUFjdGl2aXR5LnNldERhdGUoMjAxMCwgQ2FsZW5kYXIuREVDRU1CRVIsIDEyKTsKKyAgICAgICAgbUFjdGl2aXR5LnRhcE9rKCk7CisKKyAgICAgICAgLy8gRmlyc3QsIG1ha2Ugc3VyZSB0aGUgVUkgaXMgc2hvd24uLi4KKyAgICAgICAgZmluYWwgVWlPYmplY3QyIHNhdmVVaSA9IG1VaUJvdC5hc3NlcnRTYXZlU2hvd2luZyhTQVZFX0RBVEFfVFlQRV9HRU5FUklDKTsKKworICAgICAgICAvLyBUaGVuLCBtYWtlIHN1cmUgaXQgZG9lcyBoYXZlIHRoZSBjdXN0b20gdmlldyBvbiBpdC4uLgorICAgICAgICBmaW5hbCBVaU9iamVjdDIgc3RhdGljVGV4dCA9IHNhdmVVaS5maW5kT2JqZWN0KEJ5LnJlcyhtUGFja2FnZU5hbWUsICJzdGF0aWNfdGV4dCIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzdGF0aWNUZXh0KS5pc05vdE51bGwoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzdGF0aWNUZXh0LmdldFRleHQoKSkuaXNFcXVhbFRvKCJZTzoiKTsKKworICAgICAgICAvLyBGaW5hbGx5LCBhc3NlcnQgdGhlIGN1c3RvbSBsaW5lcyBhcmUgc2hvd24KKyAgICAgICAgbVVpQm90LmFzc2VydENoaWxkKHNhdmVVaSwgImZpcnN0IiwgKG8pIC0+IGFzc2VydFRoYXQoby5nZXRUZXh0KCkpLmlzRXF1YWxUbygiMTIvMjAxMCIpKTsKKyAgICAgICAgbVVpQm90LmFzc2VydENoaWxkKHNhdmVVaSwgInNlY29uZCIsIChvKSAtPiBhc3NlcnRUaGF0KG8uZ2V0VGV4dCgpKS5pc0VxdWFsVG8oIjEyLTEwIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNhdmVTYW1lVmFsdWVfdXNpbmdTYW5pdGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc2FuaXRpemF0aW9uVGVzdCh0cnVlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTYXZlU2FtZVZhbHVlX3dpdGhvdXRTYW5pdGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc2FuaXRpemF0aW9uVGVzdChmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNhbml0aXphdGlvblRlc3QoYm9vbGVhbiB3aXRoU2FuaXRpemF0aW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gU2V0IHNlcnZpY2UuCisgICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKKworICAgICAgICBmaW5hbCBBdXRvZmlsbElkIGlkID0gbUFjdGl2aXR5LmdldERhdGVQaWNrZXIoKS5nZXRBdXRvZmlsbElkKCk7CisKKyAgICAgICAgLy8gU2V0IGV4cGVjdGF0aW9ucy4KKyAgICAgICAgZmluYWwgQ2FsZW5kYXIgY2FsID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgY2FsLmNsZWFyKCk7CisgICAgICAgIGNhbC5zZXQoQ2FsZW5kYXIuWUVBUiwgMjAxMik7CisgICAgICAgIGNhbC5zZXQoQ2FsZW5kYXIuTU9OVEgsIENhbGVuZGFyLkRFQ0VNQkVSKTsKKworICAgICAgICAvLyBTZXQgZXhwZWN0YXRpb25zLgorCisgICAgICAgIC8vIE5PVEU6IElEX09VVFBVVCBpcyB1c2VkIHRvIHRyaWdnZXIgYXV0b2ZpbGwsIGJ1dCBpdCdzIHZhbHVlIHdpbGwgYmUgYXV0b21hdGljYWxseQorICAgICAgICAvLyBjaGFuZ2VkLCBoZW5jZSB3ZSBuZWVkIHRvIHNldCB0aGUgZXhwZWN0ZWQgdmFsdWUgYXMgdGhlIGZvcm1hdGVkIG9uZS4gSWRlYWxseQorICAgICAgICAvLyB3ZSBzaG91bGRuJ3Qgd29ycnkgYWJvdXQgdGhhdCwgYnV0IHRoYXQgd291bGQgcmVxdWlyZSBjcmVhdGluZyBhIG5ldyBhY3Rpdml0aXkgd2l0aAorICAgICAgICAvLyBhIGN1c3RvbSBlZGl0IHRleHQgdGhhdCB1c2VzIGRhdGUgYXV0b2ZpbGwgdmFsdWVzLi4uCisgICAgICAgIGZpbmFsIENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyIHJlc3BvbnNlID0gbmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuYWRkRGF0YXNldChuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJUaGUgZW5kIG9mIHRoZSB3b3JsZCIpKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX09VVFBVVCwgIjIwMTIvMTEvMjUiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0RBVEVfUElDS0VSLCBjYWwuZ2V0VGltZUluTWlsbGlzKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuc2V0UmVxdWlyZWRTYXZhYmxlSWRzKFNBVkVfREFUQV9UWVBFX0dFTkVSSUMsIElEX09VVFBVVCwgSURfREFURV9QSUNLRVIpOworCisgICAgICAgIGlmICh3aXRoU2FuaXRpemF0aW9uKSB7CisgICAgICAgICAgICByZXNwb25zZS5hZGRTYW5pdGl6ZXIobmV3IERhdGVWYWx1ZVNhbml0aXplcihuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiTU0veXl5eSIpKSwgaWQpOworICAgICAgICB9CisgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKHJlc3BvbnNlLmJ1aWxkKCkpOworCisgICAgICAgIC8vIFRyaWdnZXIgYXV0b2ZpbGwuCisgICAgICAgIG1BY3Rpdml0eS5vbk91dHB1dCgodikgLT4gdi5yZXF1ZXN0Rm9jdXMoKSk7CisgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlRoZSBlbmQgb2YgdGhlIHdvcmxkIik7CisKKyAgICAgICAgLy8gTWFudWFsbHkgc2V0IHNhbWUgdmFsdWVzIGFzIGRhdGFzZXQuCisgICAgICAgIG1BY3Rpdml0eS5vbk91dHB1dCgodikgLT4gdi5zZXRUZXh0KCJ3aGF0ZXZlciIpKTsKKyAgICAgICAgbUFjdGl2aXR5LnNldERhdGUoMjAxMiwgQ2FsZW5kYXIuREVDRU1CRVIsIDI1KTsKKyAgICAgICAgbUFjdGl2aXR5LnRhcE9rKCk7CisKKyAgICAgICAgLy8gVmVyaWZ5IHNhdmUgYmVoYXZpb3IuCisgICAgICAgIGlmICh3aXRoU2FuaXRpemF0aW9uKSB7CisgICAgICAgICAgICBtVWlCb3QuYXNzZXJ0U2F2ZU5vdFNob3dpbmcoU0FWRV9EQVRBX1RZUEVfR0VORVJJQyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtVWlCb3QuYXNzZXJ0U2F2ZVNob3dpbmcoU0FWRV9EQVRBX1RZUEVfR0VORVJJQyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFJlbW90ZVZpZXdzIG5ld1RlbXBsYXRlKGludCByZXNvdXJjZUlkKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVtb3RlVmlld3MoZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VOYW1lKCksIHJlc291cmNlSWQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0N1c3RvbURlc2NyaXB0aW9uVGVzdC5qYXZhIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvQ3VzdG9tRGVzY3JpcHRpb25UZXN0LmphdmEKaW5kZXggYjdhY2ZjNi4uMDgwNTBlMCAxMDA2NDQKLS0tIGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvQ3VzdG9tRGVzY3JpcHRpb25UZXN0LmphdmEKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvQ3VzdG9tRGVzY3JpcHRpb25UZXN0LmphdmEKQEAgLTE4LDI1ICsxOCwyOCBAQAogCiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5IZWxwZXIuSURfUEFTU1dPUkQ7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5IZWxwZXIuSURfVVNFUk5BTUU7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5IZWxwZXIuYXNzZXJ0Tm9EYW5nbGluZ1Nlc3Npb25zOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSGVscGVyLmdldENvbnRleHQ7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmljZS5hdXRvZmlsbC5TYXZlSW5mby5TQVZFX0RBVEFfVFlQRV9HRU5FUklDOwogCiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLnRydXRoLlRydXRoLmFzc2VydFRoYXQ7CiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLnRydXRoLlRydXRoLmFzc2VydFdpdGhNZXNzYWdlOwogCitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOworaW1wb3J0IGFuZHJvaWQuc2VydmljZS5hdXRvZmlsbC5CYXRjaFVwZGF0ZXM7CiBpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLmF1dG9maWxsLkNoYXJTZXF1ZW5jZVRyYW5zZm9ybWF0aW9uOwogaW1wb3J0IGFuZHJvaWQuc2VydmljZS5hdXRvZmlsbC5DdXN0b21EZXNjcmlwdGlvbjsKIGltcG9ydCBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuSW1hZ2VUcmFuc2Zvcm1hdGlvbjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGFuZHJvaWQuc2VydmljZS5hdXRvZmlsbC5SZWdleFZhbGlkYXRvcjsKK2ltcG9ydCBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuVmFsaWRhdG9yOwogaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLkJ5OwogaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLlVpT2JqZWN0MjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYXV0b2ZpbGwuQXV0b2ZpbGxJZDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3czsKIAotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk5vbk51bGw7CitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5OdWxsYWJsZTsKKwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CkBAIC00NCwxMCArNDcsMTEgQEAKIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQmlGdW5jdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKIAorQEFwcE1vZGVGdWxsIC8vIFNlcnZpY2Utc3BlY2lmaWMgdGVzdAogcHVibGljIGNsYXNzIEN1c3RvbURlc2NyaXB0aW9uVGVzdCBleHRlbmRzIEF1dG9GaWxsU2VydmljZVRlc3RDYXNlIHsKICAgICBAUnVsZQogICAgIHB1YmxpYyBmaW5hbCBBdXRvZmlsbEFjdGl2aXR5VGVzdFJ1bGU8TG9naW5BY3Rpdml0eT4gbUFjdGl2aXR5UnVsZSA9Ci0gICAgICAgIG5ldyBBdXRvZmlsbEFjdGl2aXR5VGVzdFJ1bGU8PihMb2dpbkFjdGl2aXR5LmNsYXNzKTsKKyAgICAgICAgICAgIG5ldyBBdXRvZmlsbEFjdGl2aXR5VGVzdFJ1bGU8PihMb2dpbkFjdGl2aXR5LmNsYXNzKTsKIAogICAgIHByaXZhdGUgTG9naW5BY3Rpdml0eSBtQWN0aXZpdHk7CiAKQEAgLTU2LDExICs2MCw2IEBACiAgICAgICAgIG1BY3Rpdml0eSA9IG1BY3Rpdml0eVJ1bGUuZ2V0QWN0aXZpdHkoKTsKICAgICB9CiAKLSAgICBAQWZ0ZXIKLSAgICBwdWJsaWMgdm9pZCBmaW5pc2hXZWxjb21lQWN0aXZpdHkoKSB7Ci0gICAgICAgIFdlbGNvbWVBY3Rpdml0eS5maW5pc2hJdCgpOwotICAgIH0KLQogICAgIC8qKgogICAgICAqIEJhc2UgdGVzdAogICAgICAqCkBAIC05NiwyMiArOTUsMjAgQEAKICAgICAgICAgICAgIHVpVmVyaWZpZXIucnVuKCk7CiAgICAgICAgIH0KIAotICAgICAgICBzVWlCb3Quc2F2ZUZvckF1dG9maWxsKHRydWUsIFNBVkVfREFUQV9UWVBFX0dFTkVSSUMpOworICAgICAgICBtVWlCb3Quc2F2ZUZvckF1dG9maWxsKHRydWUsIFNBVkVfREFUQV9UWVBFX0dFTkVSSUMpOwogICAgICAgICBzUmVwbGllci5nZXROZXh0U2F2ZVJlcXVlc3QoKTsKLQotICAgICAgICBhc3NlcnROb0RhbmdsaW5nU2Vzc2lvbnMoKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHZhbGlkVHJhbnNmb3JtYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgdGVzdEN1c3RvbURlc2NyaXB0aW9uKCh1c2VybmFtZUlkLCBwYXNzd29yZElkKSAtPiB7Ci0gICAgICAgICAgICBSZW1vdGVWaWV3cyBwcmVzZW50YXRpb24gPSBuZXcgUmVtb3RlVmlld3MoZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgIFIubGF5b3V0LnR3b19ob3Jpem9udGFsX3RleHRfZmllbGRzKTsKKyAgICAgICAgICAgIFJlbW90ZVZpZXdzIHByZXNlbnRhdGlvbiA9IG5ld1RlbXBsYXRlKFIubGF5b3V0LnR3b19ob3Jpem9udGFsX3RleHRfZmllbGRzKTsKIAogICAgICAgICAgICAgQ2hhclNlcXVlbmNlVHJhbnNmb3JtYXRpb24gdHJhbnMxID0gbmV3IENoYXJTZXF1ZW5jZVRyYW5zZm9ybWF0aW9uCiAgICAgICAgICAgICAgICAgICAgIC5CdWlsZGVyKHVzZXJuYW1lSWQsIFBhdHRlcm4uY29tcGlsZSgiKC4qKSIpLCAiJDEiKQogICAgICAgICAgICAgICAgICAgICAuYWRkRmllbGQocGFzc3dvcmRJZCwgUGF0dGVybi5jb21waWxlKCIuKiguLikiKSwgIi4uJDEiKQogICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCiAgICAgICAgICAgICBJbWFnZVRyYW5zZm9ybWF0aW9uIHRyYW5zMiA9IG5ldyBJbWFnZVRyYW5zZm9ybWF0aW9uCiAgICAgICAgICAgICAgICAgICAgIC5CdWlsZGVyKHVzZXJuYW1lSWQsIFBhdHRlcm4uY29tcGlsZSgiLioiKSwKICAgICAgICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5hbmRyb2lkKS5idWlsZCgpOwpAQCAtMTIwLDMxICsxMTcsMjUyIEBACiAgICAgICAgICAgICAgICAgICAgIC5hZGRDaGlsZChSLmlkLmZpcnN0LCB0cmFuczEpCiAgICAgICAgICAgICAgICAgICAgIC5hZGRDaGlsZChSLmlkLmltZywgdHJhbnMyKQogICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLSAgICAgICAgfSwgKCkgLT4gYXNzZXJ0U2F2ZVVpV2l0aEN1c3RvbURlc2NyaXB0aW9uSXNTaG93bigidXNlcm5tLi53ZCIpKTsKKyAgICAgICAgfSwgKCkgLT4gYXNzZXJ0U2F2ZVVpSXNTaG93bldpdGhUd29MaW5lcygidXNlcm5tLi53ZCIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHZhbGlkVHJhbnNmb3JtYXRpb25XaXRoT25lVGVtcGxhdGVVcGRhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdEN1c3RvbURlc2NyaXB0aW9uKCh1c2VybmFtZUlkLCBwYXNzd29yZElkKSAtPiB7CisgICAgICAgICAgICBSZW1vdGVWaWV3cyBwcmVzZW50YXRpb24gPSBuZXdUZW1wbGF0ZShSLmxheW91dC50d29faG9yaXpvbnRhbF90ZXh0X2ZpZWxkcyk7CisKKyAgICAgICAgICAgIENoYXJTZXF1ZW5jZVRyYW5zZm9ybWF0aW9uIHRyYW5zMSA9IG5ldyBDaGFyU2VxdWVuY2VUcmFuc2Zvcm1hdGlvbgorICAgICAgICAgICAgICAgICAgICAuQnVpbGRlcih1c2VybmFtZUlkLCBQYXR0ZXJuLmNvbXBpbGUoIiguKikiKSwgIiQxIikKKyAgICAgICAgICAgICAgICAgICAgLmFkZEZpZWxkKHBhc3N3b3JkSWQsIFBhdHRlcm4uY29tcGlsZSgiLiooLi4pIiksICIuLiQxIikKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQorICAgICAgICAgICAgSW1hZ2VUcmFuc2Zvcm1hdGlvbiB0cmFuczIgPSBuZXcgSW1hZ2VUcmFuc2Zvcm1hdGlvbgorICAgICAgICAgICAgICAgICAgICAuQnVpbGRlcih1c2VybmFtZUlkLCBQYXR0ZXJuLmNvbXBpbGUoIi4qIiksCisgICAgICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuYW5kcm9pZCkuYnVpbGQoKTsKKyAgICAgICAgICAgIFJlbW90ZVZpZXdzIHVwZGF0ZSA9IG5ld1RlbXBsYXRlKDApOyAvLyBsYXlvdXQgaWQgbm90IHJlYWxseSB1c2VkCisgICAgICAgICAgICB1cGRhdGUuc2V0Vmlld1Zpc2liaWxpdHkoUi5pZC5zZWNvbmQsIFZpZXcuR09ORSk7CisgICAgICAgICAgICBWYWxpZGF0b3IgY29uZGl0aW9uID0gbmV3IFJlZ2V4VmFsaWRhdG9yKHVzZXJuYW1lSWQsIFBhdHRlcm4uY29tcGlsZSgiLioiKSk7CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ3VzdG9tRGVzY3JpcHRpb24uQnVpbGRlcihwcmVzZW50YXRpb24pCisgICAgICAgICAgICAgICAgICAgIC5hZGRDaGlsZChSLmlkLmZpcnN0LCB0cmFuczEpCisgICAgICAgICAgICAgICAgICAgIC5hZGRDaGlsZChSLmlkLmltZywgdHJhbnMyKQorICAgICAgICAgICAgICAgICAgICAuYmF0Y2hVcGRhdGUoY29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCYXRjaFVwZGF0ZXMuQnVpbGRlcigpLnVwZGF0ZVRlbXBsYXRlKHVwZGF0ZSkuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIH0sICgpIC0+IGFzc2VydFNhdmVVaUlzU2hvd25XaXRoSnVzdE9uZUxpbmUoInVzZXJubS4ud2QiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB2YWxpZFRyYW5zZm9ybWF0aW9uV2l0aE11bHRpcGxlVGVtcGxhdGVVcGRhdGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RDdXN0b21EZXNjcmlwdGlvbigodXNlcm5hbWVJZCwgcGFzc3dvcmRJZCkgLT4geworICAgICAgICAgICAgUmVtb3RlVmlld3MgcHJlc2VudGF0aW9uID0gbmV3VGVtcGxhdGUoUi5sYXlvdXQudHdvX2hvcml6b250YWxfdGV4dF9maWVsZHMpOworCisgICAgICAgICAgICBDaGFyU2VxdWVuY2VUcmFuc2Zvcm1hdGlvbiB0cmFuczEgPSBuZXcgQ2hhclNlcXVlbmNlVHJhbnNmb3JtYXRpb24uQnVpbGRlcih1c2VybmFtZUlkLAorICAgICAgICAgICAgICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoIiguKikiKSwgIiQxIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkRmllbGQocGFzc3dvcmRJZCwgUGF0dGVybi5jb21waWxlKCIuKiguLikiKSwgIi4uJDEiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKKyAgICAgICAgICAgIEltYWdlVHJhbnNmb3JtYXRpb24gdHJhbnMyID0gbmV3IEltYWdlVHJhbnNmb3JtYXRpb24uQnVpbGRlcih1c2VybmFtZUlkLAorICAgICAgICAgICAgICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoIi4qIiksIFIuZHJhd2FibGUuYW5kcm9pZCkKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisKKyAgICAgICAgICAgIFZhbGlkYXRvciB2YWxpZENvbmRpdGlvbiA9IG5ldyBSZWdleFZhbGlkYXRvcih1c2VybmFtZUlkLCBQYXR0ZXJuLmNvbXBpbGUoIi4qIikpOworICAgICAgICAgICAgVmFsaWRhdG9yIGludmFsaWRDb25kaXRpb24gPSBuZXcgUmVnZXhWYWxpZGF0b3IodXNlcm5hbWVJZCwgUGF0dGVybi5jb21waWxlKCJEJ09IIikpOworCisgICAgICAgICAgICAvLyBMaW5lIDEgdXBkYXRlcworICAgICAgICAgICAgUmVtb3RlVmlld3MgdXBkYXRlMSA9IG5ld1RlbXBsYXRlKDY2Nik7IC8vIGxheW91dCBpZCBub3QgcmVhbGx5IHVzZWQKKyAgICAgICAgICAgIHVwZGF0ZTEuc2V0Q29udGVudERlc2NyaXB0aW9uKFIuaWQuZmlyc3QsICJGaXJzdCBhbSBJIik7IC8vIHZhbGlkCisgICAgICAgICAgICBSZW1vdGVWaWV3cyB1cGRhdGUyID0gbmV3VGVtcGxhdGUoMCk7IC8vIGxheW91dCBpZCBub3QgcmVhbGx5IHVzZWQKKyAgICAgICAgICAgIHVwZGF0ZTIuc2V0Vmlld1Zpc2liaWxpdHkoUi5pZC5maXJzdCwgVmlldy5HT05FKTsgLy8gaW52YWxpZAorCisgICAgICAgICAgICAvLyBMaW5lIDIgdXBkYXRlcworICAgICAgICAgICAgUmVtb3RlVmlld3MgdXBkYXRlMyA9IG5ld1RlbXBsYXRlKC02NjYpOyAvLyBsYXlvdXQgaWQgbm90IHJlYWxseSB1c2VkCisgICAgICAgICAgICB1cGRhdGUzLnNldFRleHRWaWV3VGV4dChSLmlkLnNlY29uZCwgIkZpcnN0IG9mIGhpcyBzZWNvbmQgbmFtZSIpOyAvLyB2YWxpZAorICAgICAgICAgICAgUmVtb3RlVmlld3MgdXBkYXRlNCA9IG5ld1RlbXBsYXRlKDApOyAvLyBsYXlvdXQgaWQgbm90IHJlYWxseSB1c2VkCisgICAgICAgICAgICB1cGRhdGU0LnNldFRleHRWaWV3VGV4dChSLmlkLnNlY29uZCwgIlNFQ09ORCBvZiBoaXMgc2Vjb25kIG5hbWUiKTsgLy8gaW52YWxpZAorCisgICAgICAgICAgICByZXR1cm4gbmV3IEN1c3RvbURlc2NyaXB0aW9uLkJ1aWxkZXIocHJlc2VudGF0aW9uKQorICAgICAgICAgICAgICAgICAgICAuYWRkQ2hpbGQoUi5pZC5maXJzdCwgdHJhbnMxKQorICAgICAgICAgICAgICAgICAgICAuYWRkQ2hpbGQoUi5pZC5pbWcsIHRyYW5zMikKKyAgICAgICAgICAgICAgICAgICAgLmJhdGNoVXBkYXRlKHZhbGlkQ29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCYXRjaFVwZGF0ZXMuQnVpbGRlcigpLnVwZGF0ZVRlbXBsYXRlKHVwZGF0ZTEpLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgICAgIC5iYXRjaFVwZGF0ZShpbnZhbGlkQ29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCYXRjaFVwZGF0ZXMuQnVpbGRlcigpLnVwZGF0ZVRlbXBsYXRlKHVwZGF0ZTIpLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgICAgIC5iYXRjaFVwZGF0ZSh2YWxpZENvbmRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQmF0Y2hVcGRhdGVzLkJ1aWxkZXIoKS51cGRhdGVUZW1wbGF0ZSh1cGRhdGUzKS5idWlsZCgpKQorICAgICAgICAgICAgICAgICAgICAuYmF0Y2hVcGRhdGUoaW52YWxpZENvbmRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQmF0Y2hVcGRhdGVzLkJ1aWxkZXIoKS51cGRhdGVUZW1wbGF0ZSh1cGRhdGU0KS5idWlsZCgpKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgfSwgKCkgLT4gYXNzZXJ0U2F2ZVVpV2l0aExpbmVzSXNTaG93bigKKyAgICAgICAgICAgICAgICAobGluZTEpIC0+IGFzc2VydFdpdGhNZXNzYWdlKCJXcm9uZyBjb250ZW50IGRlc2NyaXB0aW9uIGZvciBsaW5lMSIpCisgICAgICAgICAgICAgICAgICAgICAgICAudGhhdChsaW5lMS5nZXRDb250ZW50RGVzY3JpcHRpb24oKSkuaXNFcXVhbFRvKCJGaXJzdCBhbSBJIiksCisgICAgICAgICAgICAgICAgKGxpbmUyKSAtPiBhc3NlcnRXaXRoTWVzc2FnZSgiV3JvbmcgdGV4dCBmb3IgbGluZTIiKS50aGF0KGxpbmUyLmdldFRleHQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5pc0VxdWFsVG8oIkZpcnN0IG9mIGhpcyBzZWNvbmQgbmFtZSIpLAorICAgICAgICAgICAgICAgIG51bGwpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZUJhdGNoVXBkYXRlc19ub0NvbmRpdGlvblBhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbXVsdGlwbGVCYXRjaFVwZGF0ZXNUZXN0KEJhdGNoVXBkYXRlc0NvbmRpdGlvblR5cGUuTk9ORV9QQVNTKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZUJhdGNoVXBkYXRlc19zZWNvbmRDb25kaXRpb25QYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG11bHRpcGxlQmF0Y2hVcGRhdGVzVGVzdChCYXRjaFVwZGF0ZXNDb25kaXRpb25UeXBlLlNFQ09ORF9QQVNTKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZUJhdGNoVXBkYXRlc190aGlyZENvbmRpdGlvblBhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbXVsdGlwbGVCYXRjaFVwZGF0ZXNUZXN0KEJhdGNoVXBkYXRlc0NvbmRpdGlvblR5cGUuVEhJUkRfUEFTUyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVCYXRjaFVwZGF0ZXNfYWxsQ29uZGl0aW9uc1Bhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbXVsdGlwbGVCYXRjaFVwZGF0ZXNUZXN0KEJhdGNoVXBkYXRlc0NvbmRpdGlvblR5cGUuQUxMX1BBU1MpOworICAgIH0KKworICAgIHByaXZhdGUgZW51bSBCYXRjaFVwZGF0ZXNDb25kaXRpb25UeXBlIHsKKyAgICAgICAgTk9ORV9QQVNTLAorICAgICAgICBTRUNPTkRfUEFTUywKKyAgICAgICAgVEhJUkRfUEFTUywKKyAgICAgICAgQUxMX1BBU1MKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBhIGN1c3RvbSBkZXNjcmlwdGlvbiB0aGF0IGhhcyAzIHRyYW5zZm9ybWF0aW9ucywgb25lIGFwcGxpZWQgZGlyZWN0bHkgYW5kIHRoZSBvdGhlcgorICAgICAqIDIgaW4gYmF0Y2ggdXBkYXRlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25kaXRpb25zVHlwZSBkZWZpbmVzIHdoaWNoIGJhdGNoIHVwZGF0ZXMgY29uZGl0aW9ucyB3aWxsIHBhc3MuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIG11bHRpcGxlQmF0Y2hVcGRhdGVzVGVzdChCYXRjaFVwZGF0ZXNDb25kaXRpb25UeXBlIGNvbmRpdGlvbnNUeXBlKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgZmluYWwgYm9vbGVhbiBsaW5lMlBhc3MgPSBjb25kaXRpb25zVHlwZSA9PSBCYXRjaFVwZGF0ZXNDb25kaXRpb25UeXBlLlNFQ09ORF9QQVNTCisgICAgICAgICAgICAgICAgfHwgY29uZGl0aW9uc1R5cGUgPT0gQmF0Y2hVcGRhdGVzQ29uZGl0aW9uVHlwZS5BTExfUEFTUzsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBsaW5lM1Bhc3MgPSBjb25kaXRpb25zVHlwZSA9PSBCYXRjaFVwZGF0ZXNDb25kaXRpb25UeXBlLlRISVJEX1BBU1MKKyAgICAgICAgICAgICAgICB8fCBjb25kaXRpb25zVHlwZSA9PSBCYXRjaFVwZGF0ZXNDb25kaXRpb25UeXBlLkFMTF9QQVNTOworCisgICAgICAgIGZpbmFsIFZpc2l0b3I8VWlPYmplY3QyPiBsaW5lMVZpc2l0b3IgPSAobGluZTEpIC0+IGFzc2VydFdpdGhNZXNzYWdlKCJXcm9uZyB0ZXh0IGZvciBsaW5lMSIpCisgICAgICAgICAgICAgICAgLnRoYXQobGluZTEuZ2V0VGV4dCgpKS5pc0VxdWFsVG8oIkwxLXUiKTsKKworICAgICAgICBmaW5hbCBWaXNpdG9yPFVpT2JqZWN0Mj4gbGluZTJWaXNpdG9yOworICAgICAgICBpZiAobGluZTJQYXNzKSB7CisgICAgICAgICAgICBsaW5lMlZpc2l0b3IgPSAobGluZTIpIC0+IGFzc2VydFdpdGhNZXNzYWdlKCJXcm9uZyB0ZXh0IGZvciBsaW5lMiIpCisgICAgICAgICAgICAgICAgICAgIC50aGF0KGxpbmUyLmdldFRleHQoKSkuaXNFcXVhbFRvKCJMMi11Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsaW5lMlZpc2l0b3IgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgVmlzaXRvcjxVaU9iamVjdDI+IGxpbmUzVmlzaXRvcjsKKyAgICAgICAgaWYgKGxpbmUzUGFzcykgeworICAgICAgICAgICAgbGluZTNWaXNpdG9yID0gKGxpbmUzKSAtPiBhc3NlcnRXaXRoTWVzc2FnZSgiV3JvbmcgdGV4dCBmb3IgbGluZTMiKQorICAgICAgICAgICAgICAgICAgICAudGhhdChsaW5lMy5nZXRUZXh0KCkpLmlzRXF1YWxUbygiTDMtcCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGluZTNWaXNpdG9yID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHRlc3RDdXN0b21EZXNjcmlwdGlvbigodXNlcm5hbWVJZCwgcGFzc3dvcmRJZCkgLT4geworICAgICAgICAgICAgVmFsaWRhdG9yIHZhbGlkQ29uZGl0aW9uID0gbmV3IFJlZ2V4VmFsaWRhdG9yKHVzZXJuYW1lSWQsIFBhdHRlcm4uY29tcGlsZSgiLioiKSk7CisgICAgICAgICAgICBWYWxpZGF0b3IgaW52YWxpZENvbmRpdGlvbiA9IG5ldyBSZWdleFZhbGlkYXRvcih1c2VybmFtZUlkLCBQYXR0ZXJuLmNvbXBpbGUoIkQnT0giKSk7CisgICAgICAgICAgICBQYXR0ZXJuIGZpcnN0Q2hhckdyb3VwUmVnZXggPSBQYXR0ZXJuLmNvbXBpbGUoIl4oLikuKiQiKTsKKworICAgICAgICAgICAgZmluYWwgUmVtb3RlVmlld3MgcHJlc2VudGF0aW9uID0KKyAgICAgICAgICAgICAgICAgICAgbmV3VGVtcGxhdGUoUi5sYXlvdXQudGhyZWVfaG9yaXpvbnRhbF90ZXh0X2ZpZWxkc19sYXN0X3R3b19pbnZpc2libGUpOworCisgICAgICAgICAgICBmaW5hbCBDaGFyU2VxdWVuY2VUcmFuc2Zvcm1hdGlvbiBsaW5lMVRyYW5zZm9ybWF0aW9uID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IENoYXJTZXF1ZW5jZVRyYW5zZm9ybWF0aW9uLkJ1aWxkZXIodXNlcm5hbWVJZCwgZmlyc3RDaGFyR3JvdXBSZWdleCwgIkwxLSQxIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworCisgICAgICAgICAgICBmaW5hbCBDaGFyU2VxdWVuY2VUcmFuc2Zvcm1hdGlvbiBsaW5lMlRyYW5zZm9ybWF0aW9uID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IENoYXJTZXF1ZW5jZVRyYW5zZm9ybWF0aW9uLkJ1aWxkZXIodXNlcm5hbWVJZCwgZmlyc3RDaGFyR3JvdXBSZWdleCwgIkwyLSQxIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICAgICAgZmluYWwgUmVtb3RlVmlld3MgbGluZTJVcGRhdGVzID0gbmV3VGVtcGxhdGUoNjY2KTsgLy8gbGF5b3V0IGlkIG5vdCByZWFsbHkgdXNlZAorICAgICAgICAgICAgbGluZTJVcGRhdGVzLnNldFZpZXdWaXNpYmlsaXR5KFIuaWQuc2Vjb25kLCBWaWV3LlZJU0lCTEUpOworCisgICAgICAgICAgICBmaW5hbCBDaGFyU2VxdWVuY2VUcmFuc2Zvcm1hdGlvbiBsaW5lM1RyYW5zZm9ybWF0aW9uID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IENoYXJTZXF1ZW5jZVRyYW5zZm9ybWF0aW9uLkJ1aWxkZXIocGFzc3dvcmRJZCwgZmlyc3RDaGFyR3JvdXBSZWdleCwgIkwzLSQxIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICAgICAgZmluYWwgUmVtb3RlVmlld3MgbGluZTNVcGRhdGVzID0gbmV3VGVtcGxhdGUoNjY2KTsgLy8gbGF5b3V0IGlkIG5vdCByZWFsbHkgdXNlZAorICAgICAgICAgICAgbGluZTNVcGRhdGVzLnNldFZpZXdWaXNpYmlsaXR5KFIuaWQudGhpcmQsIFZpZXcuVklTSUJMRSk7CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ3VzdG9tRGVzY3JpcHRpb24uQnVpbGRlcihwcmVzZW50YXRpb24pCisgICAgICAgICAgICAgICAgICAgIC5hZGRDaGlsZChSLmlkLmZpcnN0LCBsaW5lMVRyYW5zZm9ybWF0aW9uKQorICAgICAgICAgICAgICAgICAgICAuYmF0Y2hVcGRhdGUobGluZTJQYXNzID8gdmFsaWRDb25kaXRpb24gOiBpbnZhbGlkQ29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCYXRjaFVwZGF0ZXMuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRyYW5zZm9ybUNoaWxkKFIuaWQuc2Vjb25kLCBsaW5lMlRyYW5zZm9ybWF0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51cGRhdGVUZW1wbGF0ZShsaW5lMlVwZGF0ZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgICAgIC5iYXRjaFVwZGF0ZShsaW5lM1Bhc3MgPyB2YWxpZENvbmRpdGlvbiA6IGludmFsaWRDb25kaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJhdGNoVXBkYXRlcy5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAudHJhbnNmb3JtQ2hpbGQoUi5pZC50aGlyZCwgbGluZTNUcmFuc2Zvcm1hdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAudXBkYXRlVGVtcGxhdGUobGluZTNVcGRhdGVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgfSwgKCkgLT4gYXNzZXJ0U2F2ZVVpV2l0aExpbmVzSXNTaG93bihsaW5lMVZpc2l0b3IsIGxpbmUyVmlzaXRvciwgbGluZTNWaXNpdG9yKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmF0Y2hVcGRhdGVzQXBwbHlVcGRhdGVGaXJzdFRoZW5UcmFuc2Zvcm1hdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBmaW5hbCBWaXNpdG9yPFVpT2JqZWN0Mj4gbGluZTFWaXNpdG9yID0gKGxpbmUxKSAtPiBhc3NlcnRXaXRoTWVzc2FnZSgiV3JvbmcgdGV4dCBmb3IgbGluZTEiKQorICAgICAgICAgICAgICAgIC50aGF0KGxpbmUxLmdldFRleHQoKSkuaXNFcXVhbFRvKCJMMS11Iik7CisgICAgICAgIGZpbmFsIFZpc2l0b3I8VWlPYmplY3QyPiBsaW5lMlZpc2l0b3IgPSAobGluZTIpIC0+IGFzc2VydFdpdGhNZXNzYWdlKCJXcm9uZyB0ZXh0IGZvciBsaW5lMiIpCisgICAgICAgICAgICAgICAgLnRoYXQobGluZTIuZ2V0VGV4dCgpKS5pc0VxdWFsVG8oIkwyLXUiKTsKKyAgICAgICAgZmluYWwgVmlzaXRvcjxVaU9iamVjdDI+IGxpbmUzVmlzaXRvciA9IChsaW5lMykgLT4gYXNzZXJ0V2l0aE1lc3NhZ2UoIldyb25nIHRleHQgZm9yIGxpbmUzIikKKyAgICAgICAgICAgICAgICAudGhhdChsaW5lMy5nZXRUZXh0KCkpLmlzRXF1YWxUbygiTDMtcCIpOworCisgICAgICAgIHRlc3RDdXN0b21EZXNjcmlwdGlvbigodXNlcm5hbWVJZCwgcGFzc3dvcmRJZCkgLT4geworICAgICAgICAgICAgVmFsaWRhdG9yIHZhbGlkQ29uZGl0aW9uID0gbmV3IFJlZ2V4VmFsaWRhdG9yKHVzZXJuYW1lSWQsIFBhdHRlcm4uY29tcGlsZSgiLioiKSk7CisgICAgICAgICAgICBQYXR0ZXJuIGZpcnN0Q2hhckdyb3VwUmVnZXggPSBQYXR0ZXJuLmNvbXBpbGUoIl4oLikuKiQiKTsKKworICAgICAgICAgICAgZmluYWwgUmVtb3RlVmlld3MgcHJlc2VudGF0aW9uID0KKyAgICAgICAgICAgICAgICAgICAgbmV3VGVtcGxhdGUoUi5sYXlvdXQudHdvX2hvcml6b250YWxfdGV4dF9maWVsZHMpOworCisgICAgICAgICAgICBmaW5hbCBDaGFyU2VxdWVuY2VUcmFuc2Zvcm1hdGlvbiBsaW5lMVRyYW5zZm9ybWF0aW9uID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IENoYXJTZXF1ZW5jZVRyYW5zZm9ybWF0aW9uLkJ1aWxkZXIodXNlcm5hbWVJZCwgZmlyc3RDaGFyR3JvdXBSZWdleCwgIkwxLSQxIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworCisgICAgICAgICAgICBmaW5hbCBDaGFyU2VxdWVuY2VUcmFuc2Zvcm1hdGlvbiBsaW5lMlRyYW5zZm9ybWF0aW9uID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IENoYXJTZXF1ZW5jZVRyYW5zZm9ybWF0aW9uLkJ1aWxkZXIodXNlcm5hbWVJZCwgZmlyc3RDaGFyR3JvdXBSZWdleCwgIkwyLSQxIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworCisgICAgICAgICAgICBmaW5hbCBDaGFyU2VxdWVuY2VUcmFuc2Zvcm1hdGlvbiBsaW5lM1RyYW5zZm9ybWF0aW9uID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IENoYXJTZXF1ZW5jZVRyYW5zZm9ybWF0aW9uLkJ1aWxkZXIocGFzc3dvcmRJZCwgZmlyc3RDaGFyR3JvdXBSZWdleCwgIkwzLSQxIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICAgICAgZmluYWwgUmVtb3RlVmlld3MgbGluZTNQcmVzZW50YXRpb24gPSBuZXdUZW1wbGF0ZShSLmxheW91dC50aGlyZF9saW5lX29ubHkpOworICAgICAgICAgICAgZmluYWwgUmVtb3RlVmlld3MgbGluZTNVcGRhdGVzID0gbmV3VGVtcGxhdGUoNjY2KTsgLy8gbGF5b3V0IGlkIG5vdCByZWFsbHkgdXNlZAorICAgICAgICAgICAgbGluZTNVcGRhdGVzLmFkZFZpZXcoUi5pZC5wYXJlbnQsIGxpbmUzUHJlc2VudGF0aW9uKTsKKworICAgICAgICAgICAgcmV0dXJuIG5ldyBDdXN0b21EZXNjcmlwdGlvbi5CdWlsZGVyKHByZXNlbnRhdGlvbikKKyAgICAgICAgICAgICAgICAgICAgLmFkZENoaWxkKFIuaWQuZmlyc3QsIGxpbmUxVHJhbnNmb3JtYXRpb24pCisgICAgICAgICAgICAgICAgICAgIC5iYXRjaFVwZGF0ZSh2YWxpZENvbmRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQmF0Y2hVcGRhdGVzLkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50cmFuc2Zvcm1DaGlsZChSLmlkLnNlY29uZCwgbGluZTJUcmFuc2Zvcm1hdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAgICAgLmJhdGNoVXBkYXRlKHZhbGlkQ29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCYXRjaFVwZGF0ZXMuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnVwZGF0ZVRlbXBsYXRlKGxpbmUzVXBkYXRlcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAudHJhbnNmb3JtQ2hpbGQoUi5pZC50aGlyZCwgbGluZTNUcmFuc2Zvcm1hdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIH0sICgpIC0+IGFzc2VydFNhdmVVaVdpdGhMaW5lc0lzU2hvd24obGluZTFWaXNpdG9yLCBsaW5lMlZpc2l0b3IsIGxpbmUzVmlzaXRvcikpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgYmFkSW1hZ2VUcmFuc2Zvcm1hdGlvbigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICB0ZXN0Q3VzdG9tRGVzY3JpcHRpb24oKHVzZXJuYW1lSWQsIHBhc3N3b3JkSWQpIC0+IHsKLSAgICAgICAgICAgIFJlbW90ZVZpZXdzIHByZXNlbnRhdGlvbiA9IG5ldyBSZW1vdGVWaWV3cyhnZXRDb250ZXh0KCkuZ2V0UGFja2FnZU5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgUi5sYXlvdXQudHdvX2hvcml6b250YWxfdGV4dF9maWVsZHMpOworICAgICAgICAgICAgUmVtb3RlVmlld3MgcHJlc2VudGF0aW9uID0gbmV3VGVtcGxhdGUoUi5sYXlvdXQudHdvX2hvcml6b250YWxfdGV4dF9maWVsZHMpOwogCi0gICAgICAgICAgICBJbWFnZVRyYW5zZm9ybWF0aW9uIHRyYW5zID0gbmV3IEltYWdlVHJhbnNmb3JtYXRpb24KLSAgICAgICAgICAgICAgICAgICAgLkJ1aWxkZXIodXNlcm5hbWVJZCwgUGF0dGVybi5jb21waWxlKCIuKiIpLCAxKQotICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCisgICAgICAgICAgICBJbWFnZVRyYW5zZm9ybWF0aW9uIHRyYW5zID0gbmV3IEltYWdlVHJhbnNmb3JtYXRpb24uQnVpbGRlcih1c2VybmFtZUlkLAorICAgICAgICAgICAgICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoIi4qIiksIDEpLmJ1aWxkKCk7CiAKICAgICAgICAgICAgIHJldHVybiBuZXcgQ3VzdG9tRGVzY3JpcHRpb24uQnVpbGRlcihwcmVzZW50YXRpb24pCiAgICAgICAgICAgICAgICAgICAgIC5hZGRDaGlsZChSLmlkLmltZywgdHJhbnMpCiAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICAgICAgICB9LCAoKSAtPiBhc3NlcnRTYXZlVWlXaXRoQ3VzdG9tRGVzY3JpcHRpb25Jc1Nob3duKCkgKTsKKyAgICAgICAgfSwgKCkgLT4gYXNzZXJ0U2F2ZVVpV2l0aEN1c3RvbURlc2NyaXB0aW9uSXNTaG93bigpKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHVudXNlZEltYWdlVHJhbnNmb3JtYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgdGVzdEN1c3RvbURlc2NyaXB0aW9uKCh1c2VybmFtZUlkLCBwYXNzd29yZElkKSAtPiB7Ci0gICAgICAgICAgICBSZW1vdGVWaWV3cyBwcmVzZW50YXRpb24gPSBuZXcgUmVtb3RlVmlld3MoZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgIFIubGF5b3V0LnR3b19ob3Jpem9udGFsX3RleHRfZmllbGRzKTsKKyAgICAgICAgICAgIFJlbW90ZVZpZXdzIHByZXNlbnRhdGlvbiA9IG5ld1RlbXBsYXRlKFIubGF5b3V0LnR3b19ob3Jpem9udGFsX3RleHRfZmllbGRzKTsKIAorICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKICAgICAgICAgICAgIEltYWdlVHJhbnNmb3JtYXRpb24gdHJhbnMgPSBuZXcgSW1hZ2VUcmFuc2Zvcm1hdGlvbgogICAgICAgICAgICAgICAgICAgICAuQnVpbGRlcih1c2VybmFtZUlkLCBQYXR0ZXJuLmNvbXBpbGUoImludmFsaWQiKSwgUi5kcmF3YWJsZS5hbmRyb2lkKQogICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKQEAgLTE1OCw5ICszNzYsOSBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgYXBwbHlJbWFnZVRyYW5zZm9ybWF0aW9uVG9UZXh0VmlldygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICB0ZXN0Q3VzdG9tRGVzY3JpcHRpb24oKHVzZXJuYW1lSWQsIHBhc3N3b3JkSWQpIC0+IHsKLSAgICAgICAgICAgIFJlbW90ZVZpZXdzIHByZXNlbnRhdGlvbiA9IG5ldyBSZW1vdGVWaWV3cyhnZXRDb250ZXh0KCkuZ2V0UGFja2FnZU5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgUi5sYXlvdXQudHdvX2hvcml6b250YWxfdGV4dF9maWVsZHMpOworICAgICAgICAgICAgUmVtb3RlVmlld3MgcHJlc2VudGF0aW9uID0gbmV3VGVtcGxhdGUoUi5sYXlvdXQudHdvX2hvcml6b250YWxfdGV4dF9maWVsZHMpOwogCisgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQogICAgICAgICAgICAgSW1hZ2VUcmFuc2Zvcm1hdGlvbiB0cmFucyA9IG5ldyBJbWFnZVRyYW5zZm9ybWF0aW9uCiAgICAgICAgICAgICAgICAgICAgIC5CdWlsZGVyKHVzZXJuYW1lSWQsIFBhdHRlcm4uY29tcGlsZSgiLioiKSwgUi5kcmF3YWJsZS5hbmRyb2lkKQogICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKQEAgLTE3NCw4ICszOTIsNyBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgZmFpbEZpcnN0RmFpbEFsbCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICB0ZXN0Q3VzdG9tRGVzY3JpcHRpb24oKHVzZXJuYW1lSWQsIHBhc3N3b3JkSWQpIC0+IHsKLSAgICAgICAgICAgIFJlbW90ZVZpZXdzIHByZXNlbnRhdGlvbiA9IG5ldyBSZW1vdGVWaWV3cyhnZXRDb250ZXh0KCkuZ2V0UGFja2FnZU5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgUi5sYXlvdXQudHdvX2hvcml6b250YWxfdGV4dF9maWVsZHMpOworICAgICAgICAgICAgUmVtb3RlVmlld3MgcHJlc2VudGF0aW9uID0gbmV3VGVtcGxhdGUoUi5sYXlvdXQudHdvX2hvcml6b250YWxfdGV4dF9maWVsZHMpOwogCiAgICAgICAgICAgICBDaGFyU2VxdWVuY2VUcmFuc2Zvcm1hdGlvbiB0cmFucyA9IG5ldyBDaGFyU2VxdWVuY2VUcmFuc2Zvcm1hdGlvbgogICAgICAgICAgICAgICAgICAgICAuQnVpbGRlcih1c2VybmFtZUlkLCBQYXR0ZXJuLmNvbXBpbGUoIiguKikiKSwgIiQ0MiIpCkBAIC0xOTEsOCArNDA4LDcgQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIGZhaWxTZWNvbmRGYWlsQWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHRlc3RDdXN0b21EZXNjcmlwdGlvbigodXNlcm5hbWVJZCwgcGFzc3dvcmRJZCkgLT4gewotICAgICAgICAgICAgUmVtb3RlVmlld3MgcHJlc2VudGF0aW9uID0gbmV3IFJlbW90ZVZpZXdzKGdldENvbnRleHQoKS5nZXRQYWNrYWdlTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICBSLmxheW91dC50d29faG9yaXpvbnRhbF90ZXh0X2ZpZWxkcyk7CisgICAgICAgICAgICBSZW1vdGVWaWV3cyBwcmVzZW50YXRpb24gPSBuZXdUZW1wbGF0ZShSLmxheW91dC50d29faG9yaXpvbnRhbF90ZXh0X2ZpZWxkcyk7CiAKICAgICAgICAgICAgIENoYXJTZXF1ZW5jZVRyYW5zZm9ybWF0aW9uIHRyYW5zID0gbmV3IENoYXJTZXF1ZW5jZVRyYW5zZm9ybWF0aW9uCiAgICAgICAgICAgICAgICAgICAgIC5CdWlsZGVyKHVzZXJuYW1lSWQsIFBhdHRlcm4uY29tcGlsZSgiKC4qKSIpLCAiJDEiKQpAQCAtMjA4LDggKzQyNCw3IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCBhcHBseUNoYXJTZXF1ZW5jZVRyYW5zZm9ybWF0aW9uVG9JbWFnZVZpZXcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgdGVzdEN1c3RvbURlc2NyaXB0aW9uKCh1c2VybmFtZUlkLCBwYXNzd29yZElkKSAtPiB7Ci0gICAgICAgICAgICBSZW1vdGVWaWV3cyBwcmVzZW50YXRpb24gPSBuZXcgUmVtb3RlVmlld3MoZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgIFIubGF5b3V0LnR3b19ob3Jpem9udGFsX3RleHRfZmllbGRzKTsKKyAgICAgICAgICAgIFJlbW90ZVZpZXdzIHByZXNlbnRhdGlvbiA9IG5ld1RlbXBsYXRlKFIubGF5b3V0LnR3b19ob3Jpem9udGFsX3RleHRfZmllbGRzKTsKIAogICAgICAgICAgICAgQ2hhclNlcXVlbmNlVHJhbnNmb3JtYXRpb24gdHJhbnMgPSBuZXcgQ2hhclNlcXVlbmNlVHJhbnNmb3JtYXRpb24KICAgICAgICAgICAgICAgICAgICAgLkJ1aWxkZXIodXNlcm5hbWVJZCwgUGF0dGVybi5jb21waWxlKCIoLiopIiksICIkMSIpCkBAIC0yMzIsOCArNDQ3LDcgQEAKICAgICAgICAgZmluYWwgQ2hhclNlcXVlbmNlVHJhbnNmb3JtYXRpb24gc2Vjb25kVHJhbnMgPSBuZXcgQ2hhclNlcXVlbmNlVHJhbnNmb3JtYXRpb24KICAgICAgICAgICAgICAgICAuQnVpbGRlcih1c2VybmFtZUlkLCBQYXR0ZXJuLmNvbXBpbGUoIihNQVJDTykiKSwgIlBPTE8iKQogICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICAgICAgICBmaW5hbCBSZW1vdGVWaWV3cyBwcmVzZW50YXRpb24gPSBuZXcgUmVtb3RlVmlld3MoZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VOYW1lKCksCi0gICAgICAgICAgICAgICAgUi5sYXlvdXQudHdvX2hvcml6b250YWxfdGV4dF9maWVsZHMpOworICAgICAgICBSZW1vdGVWaWV3cyBwcmVzZW50YXRpb24gPSBuZXdUZW1wbGF0ZShSLmxheW91dC50d29faG9yaXpvbnRhbF90ZXh0X2ZpZWxkcyk7CiAgICAgICAgIGZpbmFsIEN1c3RvbURlc2NyaXB0aW9uIGN1c3RvbURlc2NyaXB0aW9uID0gbmV3IEN1c3RvbURlc2NyaXB0aW9uLkJ1aWxkZXIocHJlc2VudGF0aW9uKQogICAgICAgICAgICAgICAgIC5hZGRDaGlsZChSLmlkLmZpcnN0LCBmaXJzdFRyYW5zKQogICAgICAgICAgICAgICAgIC5hZGRDaGlsZChSLmlkLmZpcnN0LCBzZWNvbmRUcmFucykKQEAgLTI1Niw3ICs0NzAsNyBAQAogICAgICAgICBtQWN0aXZpdHkudGFwTG9naW4oKTsKIAogICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWRUZXh0ID0gbWF0Y2hGaXJzdCA/ICJwb2xvIiA6ICJQT0xPIjsKLSAgICAgICAgYXNzZXJ0U2F2ZVVpV2l0aEN1c3RvbURlc2NyaXB0aW9uSXNTaG93bihleHBlY3RlZFRleHQpOworICAgICAgICBhc3NlcnRTYXZlVWlJc1Nob3duV2l0aFR3b0xpbmVzKGV4cGVjdGVkVGV4dCk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTI2OSwxOCArNDgzLDMwIEBACiAgICAgICAgIG11bHRpcGxlVHJhbnNmb3JtYXRpb25zRm9yU2FtZUZpZWxkVGVzdChmYWxzZSk7CiAgICAgfQogCisgICAgcHJpdmF0ZSBSZW1vdGVWaWV3cyBuZXdUZW1wbGF0ZShpbnQgcmVzb3VyY2VJZCkgeworICAgICAgICByZXR1cm4gbmV3IFJlbW90ZVZpZXdzKGdldENvbnRleHQoKS5nZXRQYWNrYWdlTmFtZSgpLCByZXNvdXJjZUlkKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFVpT2JqZWN0MiBhc3NlcnRTYXZlVWlTaG93aW5nKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1VaUJvdC5hc3NlcnRTYXZlU2hvd2luZyhTQVZFX0RBVEFfVFlQRV9HRU5FUklDKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFNhdmVVaVdpdGhvdXRDdXN0b21EZXNjcmlwdGlvbklzU2hvd24oKSB7CiAgICAgICAgIC8vIEZpcnN0IG1ha2Ugc3VyZSB0aGUgVUkgaXMgc2hvd24uLi4KLSAgICAgICAgZmluYWwgVWlPYmplY3QyIHNhdmVVaSA9IHNVaUJvdC5hc3NlcnRTYXZlU2hvd2luZyhTQVZFX0RBVEFfVFlQRV9HRU5FUklDKTsKKyAgICAgICAgZmluYWwgVWlPYmplY3QyIHNhdmVVaSA9IGFzc2VydFNhdmVVaVNob3dpbmcoKTsKIAogICAgICAgICAvLyBUaGVuIG1ha2Ugc3VyZSBpdCBkb2VzIG5vdCBoYXZlIHRoZSBjdXN0b20gdmlldyBvbiBpdC4KLSAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoImZvdW5kIHN0YXRpY190ZXh0IG9uIFNhdmVVSSAoJXMpIiwgc1VpQm90LmdldENoaWxkcmVuQXNUZXh0KHNhdmVVaSkpCisgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJmb3VuZCBzdGF0aWNfdGV4dCBvbiBTYXZlVUkgKCVzKSIsIG1VaUJvdC5nZXRDaGlsZHJlbkFzVGV4dChzYXZlVWkpKQogICAgICAgICAgICAgLnRoYXQoc2F2ZVVpLmZpbmRPYmplY3QoQnkucmVzKG1QYWNrYWdlTmFtZSwgInN0YXRpY190ZXh0IikpKS5pc051bGwoKTsKICAgICB9CiAKICAgICBwcml2YXRlIFVpT2JqZWN0MiBhc3NlcnRTYXZlVWlXaXRoQ3VzdG9tRGVzY3JpcHRpb25Jc1Nob3duKCkgewogICAgICAgICAvLyBGaXJzdCBtYWtlIHN1cmUgdGhlIFVJIGlzIHNob3duLi4uCi0gICAgICAgIGZpbmFsIFVpT2JqZWN0MiBzYXZlVWkgPSBzVWlCb3QuYXNzZXJ0U2F2ZVNob3dpbmcoU0FWRV9EQVRBX1RZUEVfR0VORVJJQyk7CisgICAgICAgIGZpbmFsIFVpT2JqZWN0MiBzYXZlVWkgPSBhc3NlcnRTYXZlVWlTaG93aW5nKCk7CiAKICAgICAgICAgLy8gVGhlbiBtYWtlIHN1cmUgaXQgZG9lcyBoYXZlIHRoZSBjdXN0b20gdmlldyBvbiBpdC4uLgogICAgICAgICBmaW5hbCBVaU9iamVjdDIgc3RhdGljVGV4dCA9IHNhdmVVaS5maW5kT2JqZWN0KEJ5LnJlcyhtUGFja2FnZU5hbWUsICJzdGF0aWNfdGV4dCIpKTsKQEAgLTI5MCwxMCArNTE2LDM2IEBACiAgICAgICAgIHJldHVybiBzYXZlVWk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydFNhdmVVaVdpdGhDdXN0b21EZXNjcmlwdGlvbklzU2hvd24oU3RyaW5nIGV4cGVjdGVkVGV4dCkgeworICAgIC8qKgorICAgICAqIEFzc2VydHMgdGhlIHNhdmUgdWkgb25seSBoYXMge0Bjb2RlIGZpcnN0fSBhbmQge0Bjb2RlIHNlY29uZH0gbGluZXMgKGkuZSwge0Bjb2RlIHRoaXJkfSBpcworICAgICAqIGludmlzaWJsZSksIGJ1dCBvbmx5IHtAY29kZSBmaXJzdH0gaGFzIHRleHQuCisgICAgICovCisgICAgcHJpdmF0ZSBVaU9iamVjdDIgYXNzZXJ0U2F2ZVVpSXNTaG93bldpdGhUd29MaW5lcyhTdHJpbmcgZXhwZWN0ZWRUZXh0T25GaXJzdCkgeworICAgICAgICByZXR1cm4gYXNzZXJ0U2F2ZVVpV2l0aExpbmVzSXNTaG93bigKKyAgICAgICAgICAgICAgICAobGluZTEpIC0+IGFzc2VydFdpdGhNZXNzYWdlKCJXcm9uZyB0ZXh0IGZvciBjaGlsZCB3aXRoIGlkICdmaXJzdCciKQorICAgICAgICAgICAgICAgICAgICAgICAgLnRoYXQobGluZTEuZ2V0VGV4dCgpKS5pc0VxdWFsVG8oZXhwZWN0ZWRUZXh0T25GaXJzdCksCisgICAgICAgICAgICAgICAgKGxpbmUyKSAtPiBhc3NlcnRXaXRoTWVzc2FnZSgiV3JvbmcgdGV4dCBmb3IgY2hpbGQgd2l0aCBpZCAnc2Vjb25kJyIpCisgICAgICAgICAgICAgICAgICAgICAgICAudGhhdChsaW5lMi5nZXRUZXh0KCkpLmlzTnVsbCgpLAorICAgICAgICAgICAgICAgIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFzc2VydHMgdGhlIHNhdmUgdWkgb25seSBoYXMge0Bjb2RlIGZpcnN0fSBsaW5lIChpLmUuLCB7QGNvZGUgc2Vjb25kfSBhbmQge0Bjb2RlIHRoaXJkfSBhcmUKKyAgICAgKiBpbnZpc2libGUpLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRTYXZlVWlJc1Nob3duV2l0aEp1c3RPbmVMaW5lKFN0cmluZyBleHBlY3RlZFRleHRPbkZpcnN0KSB7CisgICAgICAgIGFzc2VydFNhdmVVaVdpdGhMaW5lc0lzU2hvd24oCisgICAgICAgICAgICAgICAgKGxpbmUxKSAtPiBhc3NlcnRXaXRoTWVzc2FnZSgiV3JvbmcgdGV4dCBmb3IgY2hpbGQgd2l0aCBpZCAnZmlyc3QnIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC50aGF0KGxpbmUxLmdldFRleHQoKSkuaXNFcXVhbFRvKGV4cGVjdGVkVGV4dE9uRmlyc3QpLAorICAgICAgICAgICAgICAgIG51bGwsIG51bGwpOworICAgIH0KKworICAgIHByaXZhdGUgVWlPYmplY3QyIGFzc2VydFNhdmVVaVdpdGhMaW5lc0lzU2hvd24oQE51bGxhYmxlIFZpc2l0b3I8VWlPYmplY3QyPiBsaW5lMVZpc2l0b3IsCisgICAgICAgICAgICBATnVsbGFibGUgVmlzaXRvcjxVaU9iamVjdDI+IGxpbmUyVmlzaXRvciwgQE51bGxhYmxlIFZpc2l0b3I8VWlPYmplY3QyPiBsaW5lM1Zpc2l0b3IpIHsKICAgICAgICAgZmluYWwgVWlPYmplY3QyIHNhdmVVaSA9IGFzc2VydFNhdmVVaVdpdGhDdXN0b21EZXNjcmlwdGlvbklzU2hvd24oKTsKLSAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoImRpZG4ndCBmaW5kICclcycgb24gU2F2ZVVJICglcykiLCBleHBlY3RlZFRleHQsCi0gICAgICAgICAgICAgICAgc1VpQm90LmdldENoaWxkcmVuQXNUZXh0KHNhdmVVaSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAudGhhdChzYXZlVWkuZmluZE9iamVjdChCeS50ZXh0KGV4cGVjdGVkVGV4dCkpKS5pc05vdE51bGwoKTsKKyAgICAgICAgbVVpQm90LmFzc2VydENoaWxkKHNhdmVVaSwgImZpcnN0IiwgbGluZTFWaXNpdG9yKTsKKyAgICAgICAgbVVpQm90LmFzc2VydENoaWxkKHNhdmVVaSwgInNlY29uZCIsIGxpbmUyVmlzaXRvcik7CisgICAgICAgIG1VaUJvdC5hc3NlcnRDaGlsZChzYXZlVWksICJ0aGlyZCIsIGxpbmUzVmlzaXRvcik7CisgICAgICAgIHJldHVybiBzYXZlVWk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvQ3VzdG9tRGVzY3JpcHRpb25Vbml0VGVzdC5qYXZhIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvQ3VzdG9tRGVzY3JpcHRpb25Vbml0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NjU5MDYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9DdXN0b21EZXNjcmlwdGlvblVuaXRUZXN0LmphdmEKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzOworCitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ubW9jazsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0VGhyb3dzOworCitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOworaW1wb3J0IGFuZHJvaWQuc2VydmljZS5hdXRvZmlsbC5CYXRjaFVwZGF0ZXM7CitpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLmF1dG9maWxsLkN1c3RvbURlc2NyaXB0aW9uOworaW1wb3J0IGFuZHJvaWQuc2VydmljZS5hdXRvZmlsbC5JbnRlcm5hbFZhbGlkYXRvcjsKK2ltcG9ydCBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuVHJhbnNmb3JtYXRpb247CitpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLmF1dG9maWxsLlZhbGlkYXRvcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3czsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKK0BSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCitAQXBwTW9kZUZ1bGwgLy8gVW5pdCB0ZXN0CitwdWJsaWMgY2xhc3MgQ3VzdG9tRGVzY3JpcHRpb25Vbml0VGVzdCB7CisKKyAgICBwcml2YXRlIGZpbmFsIEN1c3RvbURlc2NyaXB0aW9uLkJ1aWxkZXIgbUJ1aWxkZXIgPQorICAgICAgICAgICAgbmV3IEN1c3RvbURlc2NyaXB0aW9uLkJ1aWxkZXIobW9jayhSZW1vdGVWaWV3cy5jbGFzcykpOworICAgIHByaXZhdGUgZmluYWwgQmF0Y2hVcGRhdGVzIG1WYWxpZFVwZGF0ZSA9CisgICAgICAgICAgICBuZXcgQmF0Y2hVcGRhdGVzLkJ1aWxkZXIoKS51cGRhdGVUZW1wbGF0ZShtb2NrKFJlbW90ZVZpZXdzLmNsYXNzKSkuYnVpbGQoKTsKKyAgICBwcml2YXRlIGZpbmFsIFZhbGlkYXRvciBtVmFsaWRDb25kaXRpb24gPSBtb2NrKEludGVybmFsVmFsaWRhdG9yLmNsYXNzKTsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE51bGxDb25zdHJ1Y3RvcigpIHsKKyAgICAgICAgYXNzZXJ0VGhyb3dzKE51bGxQb2ludGVyRXhjZXB0aW9uLmNsYXNzLCAoKSAtPiAgbmV3IEN1c3RvbURlc2NyaXB0aW9uLkJ1aWxkZXIobnVsbCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFkZENoaWxkX251bGwoKSB7CisgICAgICAgIGFzc2VydFRocm93cyhJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MsICgpIC0+ICBtQnVpbGRlci5hZGRDaGlsZCg0MiwgbnVsbCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFkZENoaWxkX2ludmFsaWRUcmFuc2Zvcm1hdGlvbigpIHsKKyAgICAgICAgYXNzZXJ0VGhyb3dzKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAoKSAtPiAgbUJ1aWxkZXIuYWRkQ2hpbGQoNDIsIG1vY2soVHJhbnNmb3JtYXRpb24uY2xhc3MpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmF0Y2hVcGRhdGVfbnVsbENvbmRpdGlvbigpIHsKKyAgICAgICAgYXNzZXJ0VGhyb3dzKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAoKSAtPiAgbUJ1aWxkZXIuYmF0Y2hVcGRhdGUobnVsbCwgbVZhbGlkVXBkYXRlKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmF0Y2hVcGRhdGVfaW52YWxpZENvbmRpdGlvbigpIHsKKyAgICAgICAgYXNzZXJ0VGhyb3dzKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAoKSAtPiAgbUJ1aWxkZXIuYmF0Y2hVcGRhdGUobW9jayhWYWxpZGF0b3IuY2xhc3MpLCBtVmFsaWRVcGRhdGUpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCYXRjaFVwZGF0ZV9udWxsVXBkYXRlcygpIHsKKyAgICAgICAgYXNzZXJ0VGhyb3dzKE51bGxQb2ludGVyRXhjZXB0aW9uLmNsYXNzLAorICAgICAgICAgICAgICAgICgpIC0+ICBtQnVpbGRlci5iYXRjaFVwZGF0ZShtVmFsaWRDb25kaXRpb24sIG51bGwpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9DdXN0b21EZXNjcmlwdGlvbldpdGhMaW5rVGVzdENhc2UuamF2YSBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0N1c3RvbURlc2NyaXB0aW9uV2l0aExpbmtUZXN0Q2FzZS5qYXZhCmluZGV4IDQ0NTNhMGUuLjAyYjJlMTMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0N1c3RvbURlc2NyaXB0aW9uV2l0aExpbmtUZXN0Q2FzZS5qYXZhCisrKyBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0N1c3RvbURlc2NyaXB0aW9uV2l0aExpbmtUZXN0Q2FzZS5qYXZhCkBAIC0xNSw2ICsxNSw4IEBACiAgKi8KIHBhY2thZ2UgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzOwogCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5jb21tb24uU2hlbGxIZWxwZXIucnVuU2hlbGxDb21tYW5kOworCiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLnRydXRoLlRydXRoLmFzc2VydFRoYXQ7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc3VtZS5hc3N1bWVUcnVlOwpAQCAtMjUsOSArMjcsMTEgQEAKIGltcG9ydCBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuQ3VzdG9tRGVzY3JpcHRpb247CiBpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QudWlhdXRvbWF0b3IuQnk7CiBpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QudWlhdXRvbWF0b3IuVWlPYmplY3QyOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3M7CiAKLWltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzdW1lLmFzc3VtZVRydWU7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAogLyoqCkBAIC00Niw2ICs1MCw3IEBACiAgKi8KIGFic3RyYWN0IGNsYXNzIEN1c3RvbURlc2NyaXB0aW9uV2l0aExpbmtUZXN0Q2FzZSBleHRlbmRzIEF1dG9GaWxsU2VydmljZVRlc3RDYXNlIHsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQ3VzdG9tRGVzY3JpcHRpb25XaXRoTGlua1Rlc3RDYXNlIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfTElOSyA9ICJsaW5rIjsKIAogICAgIC8qKgpAQCAtNjQsMjEgKzY5LDE1IEBACiAgICAgICovCiAgICAgQFRlc3QKICAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0VGFwTGlua19jaGFuZ2VPcmllbnRhdGlvblRoZW5UYXBCYWNrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc3VtZVRydWUoIlNjcmVlbiByb3RhdGlvbiBub3Qgc3VwcG9ydGVkIiwgc1VpQm90LmlzU2NyZWVuUm90YXRpb25TdXBwb3J0ZWQoKSk7CisgICAgICAgIGFzc3VtZVRydWUoIlJvdGF0aW9uIGlzIHN1cHBvcnRlZCIsIEhlbHBlci5pc1JvdGF0aW9uU3VwcG9ydGVkKG1Db250ZXh0KSk7CiAKLSAgICAgICAgc1VpQm90LnNldFNjcmVlblJlc29sdXRpb24oKTsKLQotICAgICAgICBzVWlCb3Quc2V0U2NyZWVuT3JpZW50YXRpb24oVWlCb3QuUE9SVFJBSVQpOworICAgICAgICBtVWlCb3Quc2V0U2NyZWVuT3JpZW50YXRpb24oVWlCb3QuUE9SVFJBSVQpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgc2F2ZVVpUmVzdG9yZWRBZnRlclRhcHBpbmdMaW5rVGVzdCgKICAgICAgICAgICAgICAgICAgICAgUG9zdFNhdmVMaW5rVGFwcGVkQWN0aW9uLlJPVEFURV9USEVOX1RBUF9CQUNLX0JVVFRPTik7CiAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBzVWlCb3Quc2V0U2NyZWVuT3JpZW50YXRpb24oVWlCb3QuUE9SVFJBSVQpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjbGVhblVwQWZ0ZXJTY3JlZW5PcmllbnRhdGlvbklzQmFja1RvUG9ydHJhaXQoKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgc1VpQm90LnJlc2V0U2NyZWVuUmVzb2x1dGlvbigpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgbVVpQm90LnNldFNjcmVlbk9yaWVudGF0aW9uKFVpQm90LlBPUlRSQUlUKTsKKyAgICAgICAgICAgIGNsZWFuVXBBZnRlclNjcmVlbk9yaWVudGF0aW9uSXNCYWNrVG9Qb3J0cmFpdCgpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xNzYsMTggKzE3NSw2IEBACiAgICAgICAgICAgICBQb3N0U2F2ZUxpbmtUYXBwZWRBY3Rpb24gYWN0aW9uLCBib29sZWFuIG1hbnVhbFJlcXVlc3QpIHRocm93cyBFeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBUZXN0cyBzY2VuYXJpb3Mgd2hlbiB1c2VyIHRhcHMgYSBsaW5rIGluIHRoZSBjdXN0b20gZGVzY3JpcHRpb24sIHRoZW4gZG91YmxlLXRhcCByZWNlbnRzCi0gICAgICogdG8gZ28gYmFjayB0byB0aGUgb3JpZ2luYWwgYWN0aXZpdHk6Ci0gICAgICogdGhlIFNhdmUgVUkgc2hvdWxkIGhhdmUgYmVlbiBjYW5jZWxlZC4KLSAgICAgKi8KLSAgICBAVGVzdAotICAgIEBJZ25vcmUoIlRlc3QgZmFpbCBvbiBzb21lIGRldmljZXMgYmVjYXVzZSBSZWNlbnRzIFVJIGlzIG5vdCB3ZWxsIGRlZmluZWQ6IGIvNzIwNDQ2ODUiKQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RUYXBMaW5rX2JhY2tUb1ByZXZpb3VzQWN0aXZpdHlCeVRhcHBpbmdSZWNlbnRzKCkKLSAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzYXZlVWlDYW5jZWxsZWRBZnRlclRhcHBpbmdMaW5rVGVzdChQb3N0U2F2ZUxpbmtUYXBwZWRBY3Rpb24uVEFQX1JFQ0VOVFMpOwotICAgIH0KLQotICAgIC8qKgogICAgICAqIFRlc3RzIHNjZW5hcmlvcyB3aGVuIHVzZXIgdGFwcyBhIGxpbmsgaW4gdGhlIGN1c3RvbSBkZXNjcmlwdGlvbiwgdGhlbiByZS1sYXVuY2hlcyB0aGUKICAgICAgKiBvcmlnaW5hbCBhY3Rpdml0eToKICAgICAgKiB0aGUgU2F2ZSBVSSBzaG91bGQgaGF2ZSBiZWVuIGNhbmNlbGVkLgpAQCAtMjA4LDYgKzE5NSw5IEBACiAgICAgICAgIHNhdmVVaUNhbmNlbGxlZEFmdGVyVGFwcGluZ0xpbmtUZXN0KFBvc3RTYXZlTGlua1RhcHBlZEFjdGlvbi5MQVVOQ0hfTkVXX0FDVElWSVRZKTsKICAgICB9CiAKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBzYXZlVWlDYW5jZWxsZWRBZnRlclRhcHBpbmdMaW5rVGVzdChQb3N0U2F2ZUxpbmtUYXBwZWRBY3Rpb24gdHlwZSkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb247CisKICAgICBAVGVzdAogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RUYXBMaW5rX2xhdW5jaFRyYW1wb2xpbmVBY3Rpdml0eVRoZW5UYXBCYWNrQW5kU3RhcnROZXdTZXNzaW9uKCkKICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewpAQCAtMjE3LDEwICsyMDcsMjEgQEAKICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB0YXBMaW5rTGF1bmNoVHJhbXBvbGluZUFjdGl2aXR5VGhlblRhcEJhY2tBbmRTdGFydE5ld1Nlc3Npb25UZXN0KCkKICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb247CiAKKyAgICBAVGVzdAorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RUYXBMaW5rQWZ0ZXJVcGRhdGVBcHBsaWVkVG9MaW5rVmlldygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0YXBMaW5rQWZ0ZXJVcGRhdGVBcHBsaWVkVGVzdCh0cnVlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RUYXBMaW5rQWZ0ZXJVcGRhdGVBcHBsaWVkVG9Bbm90aGVyVmlldygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0YXBMaW5rQWZ0ZXJVcGRhdGVBcHBsaWVkVGVzdChmYWxzZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgdGFwTGlua0FmdGVyVXBkYXRlQXBwbGllZFRlc3QoYm9vbGVhbiB1cGRhdGVMaW5rVmlldykgdGhyb3dzIEV4Y2VwdGlvbjsKKwogICAgIGVudW0gUG9zdFNhdmVMaW5rVGFwcGVkQWN0aW9uIHsKICAgICAgICAgVEFQX0JBQ0tfQlVUVE9OLAogICAgICAgICBST1RBVEVfVEhFTl9UQVBfQkFDS19CVVRUT04sCi0gICAgICAgIFRBUF9SRUNFTlRTLAogICAgICAgICBGSU5JU0hfQUNUSVZJVFksCiAgICAgICAgIExBVU5DSF9ORVdfQUNUSVZJVFksCiAgICAgICAgIExBVU5DSF9QUkVWSU9VU19BQ1RJVklUWSwKQEAgLTIyOSw0MSArMjMwLDU5IEBACiAgICAgICAgIFRBUF9ZRVNfT05fU0FWRV9VSQogICAgIH0KIAotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHNhdmVVaUNhbmNlbGxlZEFmdGVyVGFwcGluZ0xpbmtUZXN0KFBvc3RTYXZlTGlua1RhcHBlZEFjdGlvbiB0eXBlKQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbjsKKyAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBzdGFydEFjdGl2aXR5T25OZXdUYXNrKENsYXNzPD8+IGNsYXp6KSB7CisgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KG1Db250ZXh0LCBjbGF6eik7CisgICAgICAgIGludGVudC5zZXRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7CisgICAgICAgIG1Db250ZXh0LnN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKKyAgICB9CiAKLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBzdGFydEFjdGl2aXR5KENsYXNzPD8+IGNsYXp6KSB7Ci0gICAgICAgIG1Db250ZXh0LnN0YXJ0QWN0aXZpdHkobmV3IEludGVudChtQ29udGV4dCwgY2xhenopKTsKKyAgICBwcm90ZWN0ZWQgUmVtb3RlVmlld3MgbmV3VGVtcGxhdGUoKSB7CisgICAgICAgIGZpbmFsIFJlbW90ZVZpZXdzIHByZXNlbnRhdGlvbiA9IG5ldyBSZW1vdGVWaWV3cyhtUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgUi5sYXlvdXQuY3VzdG9tX2Rlc2NyaXB0aW9uX3dpdGhfbGluayk7CisgICAgICAgIHJldHVybiBwcmVzZW50YXRpb247CisgICAgfQorCisgICAgcHJvdGVjdGVkIGZpbmFsIEN1c3RvbURlc2NyaXB0aW9uLkJ1aWxkZXIgbmV3Q3VzdG9tRGVzY3JpcHRpb25CdWlsZGVyKAorICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIEFjdGl2aXR5PiBhY3Rpdml0eUNsYXNzKSB7CisgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KG1Db250ZXh0LCBhY3Rpdml0eUNsYXNzKTsKKyAgICAgICAgaW50ZW50LnNldEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX1JFVEFJTl9JTl9SRUNFTlRTIHwgSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX0RPQ1VNRU5UKTsKKyAgICAgICAgcmV0dXJuIG5ld0N1c3RvbURlc2NyaXB0aW9uQnVpbGRlcihpbnRlbnQpOwogICAgIH0KIAogICAgIHByb3RlY3RlZCBmaW5hbCBDdXN0b21EZXNjcmlwdGlvbiBuZXdDdXN0b21EZXNjcmlwdGlvbigKICAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBBY3Rpdml0eT4gYWN0aXZpdHlDbGFzcykgewotICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChtQ29udGV4dCwgYWN0aXZpdHlDbGFzcyk7Ci0gICAgICAgIGludGVudC5zZXRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9SRVRBSU5fSU5fUkVDRU5UUyB8IEludGVudC5GTEFHX0FDVElWSVRZX05FV19ET0NVTUVOVCk7Ci0gICAgICAgIHJldHVybiBuZXdDdXN0b21EZXNjcmlwdGlvbihpbnRlbnQpOworICAgICAgICByZXR1cm4gbmV3Q3VzdG9tRGVzY3JpcHRpb25CdWlsZGVyKGFjdGl2aXR5Q2xhc3MpLmJ1aWxkKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGZpbmFsIEN1c3RvbURlc2NyaXB0aW9uLkJ1aWxkZXIgbmV3Q3VzdG9tRGVzY3JpcHRpb25CdWlsZGVyKEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgZmluYWwgUmVtb3RlVmlld3MgcHJlc2VudGF0aW9uID0gbmV3VGVtcGxhdGUoKTsKKyAgICAgICAgZmluYWwgUGVuZGluZ0ludGVudCBwZW5kaW5nSW50ZW50ID0gUGVuZGluZ0ludGVudC5nZXRBY3Rpdml0eShtQ29udGV4dCwgMCwgaW50ZW50LCAwKTsKKyAgICAgICAgcHJlc2VudGF0aW9uLnNldE9uQ2xpY2tQZW5kaW5nSW50ZW50KFIuaWQubGluaywgcGVuZGluZ0ludGVudCk7CisgICAgICAgIHJldHVybiBuZXcgQ3VzdG9tRGVzY3JpcHRpb24uQnVpbGRlcihwcmVzZW50YXRpb24pOwogICAgIH0KIAogICAgIHByb3RlY3RlZCBmaW5hbCBDdXN0b21EZXNjcmlwdGlvbiBuZXdDdXN0b21EZXNjcmlwdGlvbihJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgIGZpbmFsIFJlbW90ZVZpZXdzIHByZXNlbnRhdGlvbiA9IG5ldyBSZW1vdGVWaWV3cyhtUGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgUi5sYXlvdXQuY3VzdG9tX2Rlc2NyaXB0aW9uX3dpdGhfbGluayk7Ci0gICAgICAgIGZpbmFsIFBlbmRpbmdJbnRlbnQgcGVuZGluZ0ludGVudCA9IFBlbmRpbmdJbnRlbnQuZ2V0QWN0aXZpdHkobUNvbnRleHQsIDAsIGludGVudCwgMCk7Ci0gICAgICAgIHByZXNlbnRhdGlvbi5zZXRPbkNsaWNrUGVuZGluZ0ludGVudChSLmlkLmxpbmssIHBlbmRpbmdJbnRlbnQpOwotICAgICAgICByZXR1cm4gbmV3IEN1c3RvbURlc2NyaXB0aW9uLkJ1aWxkZXIocHJlc2VudGF0aW9uKS5idWlsZCgpOworICAgICAgICByZXR1cm4gbmV3Q3VzdG9tRGVzY3JpcHRpb25CdWlsZGVyKGludGVudCkuYnVpbGQoKTsKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgZmluYWwgVWlPYmplY3QyIGFzc2VydFNhdmVVaVdpdGhMaW5rSXNTaG93bihpbnQgc2F2ZVR5cGUpIHsKKyAgICBwcm90ZWN0ZWQgZmluYWwgVWlPYmplY3QyIGFzc2VydFNhdmVVaVdpdGhMaW5rSXNTaG93bihpbnQgc2F2ZVR5cGUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZXR1cm4gYXNzZXJ0U2F2ZVVpV2l0aExpbmtJc1Nob3duKHNhdmVUeXBlLCAiRE9OJ1QgVEFQIE1FISIpOworICAgIH0KKworICAgIHByb3RlY3RlZCBmaW5hbCBVaU9iamVjdDIgYXNzZXJ0U2F2ZVVpV2l0aExpbmtJc1Nob3duKGludCBzYXZlVHlwZSwgU3RyaW5nIGV4cGVjdGVkVGV4dCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBGaXJzdCBtYWtlIHN1cmUgdGhlIFVJIGlzIHNob3duLi4uCi0gICAgICAgIGZpbmFsIFVpT2JqZWN0MiBzYXZlVWkgPSBzVWlCb3QuYXNzZXJ0U2F2ZVNob3dpbmcoc2F2ZVR5cGUpOworICAgICAgICBmaW5hbCBVaU9iamVjdDIgc2F2ZVVpID0gbVVpQm90LmFzc2VydFNhdmVTaG93aW5nKHNhdmVUeXBlKTsKICAgICAgICAgLy8gVGhlbiBtYWtlIHN1cmUgaXQgZG9lcyBoYXZlIHRoZSBjdXN0b20gdmlldyB3aXRoIGxpbmsgb24gaXQuLi4KLSAgICAgICAgZ2V0TGluayhzYXZlVWkpOworICAgICAgICBmaW5hbCBVaU9iamVjdDIgbGluayA9IGdldExpbmsoc2F2ZVVpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChsaW5rLmdldFRleHQoKSkuaXNFcXVhbFRvKGV4cGVjdGVkVGV4dCk7CiAgICAgICAgIHJldHVybiBzYXZlVWk7CiAgICAgfQogCiAgICAgcHJvdGVjdGVkIGZpbmFsIFVpT2JqZWN0MiBnZXRMaW5rKGZpbmFsIFVpT2JqZWN0MiBjb250YWluZXIpIHsKLSAgICAgICAgZmluYWwgVWlPYmplY3QyIGJ1dHRvbiA9IGNvbnRhaW5lci5maW5kT2JqZWN0KEJ5LnJlcyhtUGFja2FnZU5hbWUsIElEX0xJTkspKTsKLSAgICAgICAgYXNzZXJ0VGhhdChidXR0b24pLmlzTm90TnVsbCgpOwotICAgICAgICBhc3NlcnRUaGF0KGJ1dHRvbi5nZXRUZXh0KCkpLmlzRXF1YWxUbygiRE9OJ1QgVEFQIE1FISIpOwotICAgICAgICByZXR1cm4gYnV0dG9uOworICAgICAgICBmaW5hbCBVaU9iamVjdDIgbGluayA9IGNvbnRhaW5lci5maW5kT2JqZWN0KEJ5LnJlcyhtUGFja2FnZU5hbWUsIElEX0xJTkspKTsKKyAgICAgICAgYXNzZXJ0VGhhdChsaW5rKS5pc05vdE51bGwoKTsKKyAgICAgICAgcmV0dXJuIGxpbms7CiAgICAgfQogCiAgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgdGFwU2F2ZVVpTGluayhVaU9iamVjdDIgc2F2ZVVpKSB7CmRpZmYgLS1naXQgYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9EYXRhc2V0RmlsdGVyaW5nVGVzdC5qYXZhIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvRGF0YXNldEZpbHRlcmluZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2IwZmY3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvRGF0YXNldEZpbHRlcmluZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDU2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5IZWxwZXIuSURfVVNFUk5BTUU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5jb21tb24uU2hlbGxIZWxwZXIucnVuU2hlbGxDb21tYW5kOworCitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmN0cy5tb2NraW1lLkltZUV2ZW50U3RyZWFtVGVzdFV0aWxzLmVkaXRvck1hdGNoZXI7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmN0cy5tb2NraW1lLkltZUV2ZW50U3RyZWFtVGVzdFV0aWxzLmV4cGVjdEJpbmRJbnB1dDsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY3RzLm1vY2tpbWUuSW1lRXZlbnRTdHJlYW1UZXN0VXRpbHMuZXhwZWN0Q29tbWFuZDsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY3RzLm1vY2tpbWUuSW1lRXZlbnRTdHJlYW1UZXN0VXRpbHMuZXhwZWN0RXZlbnQ7CisKK2ltcG9ydCBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuQ2FubmVkRmlsbFJlc3BvbnNlLkNhbm5lZERhdGFzZXQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudFNlbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy5tb2NraW1lLkltZUNvbW1hbmQ7CitpbXBvcnQgY29tLmFuZHJvaWQuY3RzLm1vY2tpbWUuSW1lRXZlbnRTdHJlYW07CitpbXBvcnQgY29tLmFuZHJvaWQuY3RzLm1vY2tpbWUuTW9ja0ltZVNlc3Npb247CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXJDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKKworcHVibGljIGNsYXNzIERhdGFzZXRGaWx0ZXJpbmdUZXN0IGV4dGVuZHMgQWJzdHJhY3RMb2dpbkFjdGl2aXR5VGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBNT0NLX0lNRV9USU1FT1VUX01TID0gNV8wMDA7CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc01heERhdGFzZXRzOworCisgICAgQEJlZm9yZUNsYXNzCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldE1heERhdGFzZXRzKCkgeworICAgICAgICBzTWF4RGF0YXNldHMgPSBydW5TaGVsbENvbW1hbmQoImNtZCBhdXRvZmlsbCBnZXQgbWF4X3Zpc2libGVfZGF0YXNldHMiKTsKKyAgICAgICAgcnVuU2hlbGxDb21tYW5kKCJjbWQgYXV0b2ZpbGwgc2V0IG1heF92aXNpYmxlX2RhdGFzZXRzIDQiKTsKKyAgICB9CisKKyAgICBAQWZ0ZXJDbGFzcworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXN0b3JlTWF4RGF0YXNldHMoKSB7CisgICAgICAgIHJ1blNoZWxsQ29tbWFuZCgiY21kIGF1dG9maWxsIHNldCBtYXhfdmlzaWJsZV9kYXRhc2V0cyAlcyIsIHNNYXhEYXRhc2V0cyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZW5kS2V5RXZlbnRzKFN0cmluZyBrZXlDb2RlKSB7CisgICAgICAgIHJ1blNoZWxsQ29tbWFuZCgiaW5wdXQga2V5ZXZlbnQgIiArIGtleUNvZGUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGFuZ2VVc2VybmFtZShDaGFyU2VxdWVuY2UgdXNlcm5hbWUpIHsKKyAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoKHYpIC0+IHYuc2V0VGV4dCh1c2VybmFtZSkpOworICAgIH0KKworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBhYSA9ICJUd28gQSdzIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIGFiID0gIkEgYW5kIEIiOworICAgICAgICBmaW5hbCBTdHJpbmcgYiA9ICJPbmx5IEIiOworCisgICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKKworICAgICAgICAvLyBTZXQgZXhwZWN0YXRpb25zLgorICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5hZGREYXRhc2V0KG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1VTRVJOQU1FLCAiYWEiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oYWEpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLmFkZERhdGFzZXQobmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfVVNFUk5BTUUsICJhYiIpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbihhYikpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuYWRkRGF0YXNldChuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgImIiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oYikpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gVHJpZ2dlciBhdXRvLWZpbGwuCisgICAgICAgIHJlcXVlc3RGb2N1c09uVXNlcm5hbWUoKTsKKyAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CisKKyAgICAgICAgLy8gV2l0aCBubyBmaWx0ZXIgdGV4dCBhbGwgZGF0YXNldHMgc2hvdWxkIGJlIHNob3duCisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cyhhYSwgYWIsIGIpOworCisgICAgICAgIC8vIE9ubHkgdHdvIGRhdGFzZXRzIHN0YXJ0IHdpdGggJ2EnCisgICAgICAgIGNoYW5nZVVzZXJuYW1lKCJhIik7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cyhhYSwgYWIpOworCisgICAgICAgIC8vIE9ubHkgb25lIGRhdGFzZXQgc3RhcnQgd2l0aCAnYWEnCisgICAgICAgIGNoYW5nZVVzZXJuYW1lKCJhYSIpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoYWEpOworCisgICAgICAgIC8vIE9ubHkgdHdvIGRhdGFzZXRzIHN0YXJ0IHdpdGggJ2EnCisgICAgICAgIGNoYW5nZVVzZXJuYW1lKCJhIik7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cyhhYSwgYWIpOworCisgICAgICAgIC8vIFdpdGggbm8gZmlsdGVyIHRleHQgYWxsIGRhdGFzZXRzIHNob3VsZCBiZSBzaG93bgorICAgICAgICBjaGFuZ2VVc2VybmFtZSgiIik7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cyhhYSwgYWIsIGIpOworCisgICAgICAgIC8vIE5vIGRhdGFzZXQgc3RhcnQgd2l0aCAnYWFhJworICAgICAgICBmaW5hbCBNeUF1dG9maWxsQ2FsbGJhY2sgY2FsbGJhY2sgPSBtQWN0aXZpdHkucmVnaXN0ZXJDYWxsYmFjaygpOworICAgICAgICBjaGFuZ2VVc2VybmFtZSgiYWFhIik7CisgICAgICAgIGNhbGxiYWNrLmFzc2VydFVpSGlkZGVuRXZlbnQobUFjdGl2aXR5LmdldFVzZXJuYW1lKCkpOworICAgICAgICBtVWlCb3QuYXNzZXJ0Tm9EYXRhc2V0cygpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZpbHRlcl9lamVjdGluZ0V2ZW50cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgYWEgPSAiVHdvIEEncyI7CisgICAgICAgIGZpbmFsIFN0cmluZyBhYiA9ICJBIGFuZCBCIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIGIgPSAiT25seSBCIjsKKworICAgICAgICBlbmFibGVTZXJ2aWNlKCk7CisKKyAgICAgICAgLy8gU2V0IGV4cGVjdGF0aW9ucy4KKyAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UobmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuYWRkRGF0YXNldChuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgImFhIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKGFhKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQorICAgICAgICAgICAgICAgIC5hZGREYXRhc2V0KG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1VTRVJOQU1FLCAiYWIiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oYWIpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLmFkZERhdGFzZXQobmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfVVNFUk5BTUUsICJiIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKGIpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIC8vIFRyaWdnZXIgYXV0by1maWxsLgorICAgICAgICByZXF1ZXN0Rm9jdXNPblVzZXJuYW1lKCk7CisgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOworCisgICAgICAgIC8vIFdpdGggbm8gZmlsdGVyIHRleHQgYWxsIGRhdGFzZXRzIHNob3VsZCBiZSBzaG93bgorICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoYWEsIGFiLCBiKTsKKworICAgICAgICAvLyBPbmx5IHR3byBkYXRhc2V0cyBzdGFydCB3aXRoICdhJworICAgICAgICBzZW5kS2V5RXZlbnRzKCJLRVlDT0RFX0EiKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKGFhLCBhYik7CisKKyAgICAgICAgLy8gT25seSBvbmUgZGF0YXNldCBzdGFydCB3aXRoICdhYScKKyAgICAgICAgc2VuZEtleUV2ZW50cygiS0VZQ09ERV9BIik7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cyhhYSk7CisKKyAgICAgICAgLy8gT25seSB0d28gZGF0YXNldHMgc3RhcnQgd2l0aCAnYScKKyAgICAgICAgc2VuZEtleUV2ZW50cygiS0VZQ09ERV9ERUwiKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKGFhLCBhYik7CisKKyAgICAgICAgLy8gV2l0aCBubyBmaWx0ZXIgdGV4dCBhbGwgZGF0YXNldHMgc2hvdWxkIGJlIHNob3duCisgICAgICAgIHNlbmRLZXlFdmVudHMoIktFWUNPREVfREVMIik7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cyhhYSwgYWIsIGIpOworCisgICAgICAgIC8vIE5vIGRhdGFzZXQgc3RhcnQgd2l0aCAnYWFhJworICAgICAgICBmaW5hbCBNeUF1dG9maWxsQ2FsbGJhY2sgY2FsbGJhY2sgPSBtQWN0aXZpdHkucmVnaXN0ZXJDYWxsYmFjaygpOworICAgICAgICBzZW5kS2V5RXZlbnRzKCJLRVlDT0RFX0EiKTsKKyAgICAgICAgc2VuZEtleUV2ZW50cygiS0VZQ09ERV9BIik7CisgICAgICAgIHNlbmRLZXlFdmVudHMoIktFWUNPREVfQSIpOworICAgICAgICBjYWxsYmFjay5hc3NlcnRVaUhpZGRlbkV2ZW50KG1BY3Rpdml0eS5nZXRVc2VybmFtZSgpKTsKKyAgICAgICAgbVVpQm90LmFzc2VydE5vRGF0YXNldHMoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBBcHBNb2RlRnVsbCAvLyB0ZXN0RmlsdGVyKCkgaXMgZW5vdWdoIHRvIHRlc3QgZXBoZW1lcmFsIGFwcHMgc3VwcG9ydAorICAgIHB1YmxpYyB2b2lkIHRlc3RGaWx0ZXJfdXNpbmdLZXlib2FyZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgYWEgPSAiVHdvIEEncyI7CisgICAgICAgIGZpbmFsIFN0cmluZyBhYiA9ICJBIGFuZCBCIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIGIgPSAiT25seSBCIjsKKworICAgICAgICBmaW5hbCBNb2NrSW1lU2Vzc2lvbiBtb2NrSW1lU2Vzc2lvbiA9IHNNb2NrSW1lU2Vzc2lvblJ1bGUuZ2V0TW9ja0ltZVNlc3Npb24oKTsKKworICAgICAgICBlbmFibGVTZXJ2aWNlKCk7CisKKyAgICAgICAgLy8gU2V0IGV4cGVjdGF0aW9ucy4KKyAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UobmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuYWRkRGF0YXNldChuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgImFhIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKGFhKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQorICAgICAgICAgICAgICAgIC5hZGREYXRhc2V0KG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1VTRVJOQU1FLCAiYWIiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oYWIpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLmFkZERhdGFzZXQobmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfVVNFUk5BTUUsICJiIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKGIpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGZpbmFsIEltZUV2ZW50U3RyZWFtIHN0cmVhbSA9IG1vY2tJbWVTZXNzaW9uLm9wZW5FdmVudFN0cmVhbSgpOworCisgICAgICAgIC8vIFRyaWdnZXIgYXV0by1maWxsLgorICAgICAgICBtQWN0aXZpdHkub25Vc2VybmFtZShWaWV3OjpyZXF1ZXN0Rm9jdXMpOworCisgICAgICAgIC8vIFdhaXQgdW50aWwgdGhlIE1vY2tJbWUgZ2V0cyBib3VuZCB0byB0aGUgVGVzdEFjdGl2aXR5LgorICAgICAgICBleHBlY3RCaW5kSW5wdXQoc3RyZWFtLCBQcm9jZXNzLm15UGlkKCksIE1PQ0tfSU1FX1RJTUVPVVRfTVMpOworICAgICAgICBleHBlY3RFdmVudChzdHJlYW0sIGVkaXRvck1hdGNoZXIoIm9uU3RhcnRJbnB1dCIsIG1BY3Rpdml0eS5nZXRVc2VybmFtZSgpLmdldElkKCkpLAorICAgICAgICAgICAgICAgIE1PQ0tfSU1FX1RJTUVPVVRfTVMpOworCisgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOworCisgICAgICAgIC8vIFdpdGggbm8gZmlsdGVyIHRleHQgYWxsIGRhdGFzZXRzIHNob3VsZCBiZSBzaG93bgorICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoYWEsIGFiLCBiKTsKKworICAgICAgICAvLyBPbmx5IHR3byBkYXRhc2V0cyBzdGFydCB3aXRoICdhJworICAgICAgICBmaW5hbCBJbWVDb21tYW5kIGNtZDEgPSBtb2NrSW1lU2Vzc2lvbi5jYWxsQ29tbWl0VGV4dCgiYSIsIDEpOworICAgICAgICBleHBlY3RDb21tYW5kKHN0cmVhbSwgY21kMSwgTU9DS19JTUVfVElNRU9VVF9NUyk7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cyhhYSwgYWIpOworCisgICAgICAgIC8vIE9ubHkgb25lIGRhdGFzZXQgc3RhcnQgd2l0aCAnYWEnCisgICAgICAgIGZpbmFsIEltZUNvbW1hbmQgY21kMiA9IG1vY2tJbWVTZXNzaW9uLmNhbGxDb21taXRUZXh0KCJhIiwgMSk7CisgICAgICAgIGV4cGVjdENvbW1hbmQoc3RyZWFtLCBjbWQyLCBNT0NLX0lNRV9USU1FT1VUX01TKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKGFhKTsKKworICAgICAgICAvLyBPbmx5IHR3byBkYXRhc2V0cyBzdGFydCB3aXRoICdhJworICAgICAgICBzZW5kS2V5RXZlbnRzKCJLRVlDT0RFX0RFTCIpOyAvLyBUT0RPOiBhZGQgbmV3IG1ldGhvZCBvbiBNb2NrSW1lIGZvciBpdAorICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoYWEsIGFiKTsKKworICAgICAgICAvLyBXaXRoIG5vIGZpbHRlciB0ZXh0IGFsbCBkYXRhc2V0cyBzaG91bGQgYmUgc2hvd24KKyAgICAgICAgc2VuZEtleUV2ZW50cygiS0VZQ09ERV9ERUwiKTsgLy8gVE9ETzogYWRkIG5ldyBtZXRob2Qgb24gTW9ja0ltZSBmb3IgaXQKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKGFhLCBhYiwgYik7CisKKyAgICAgICAgLy8gTm8gZGF0YXNldCBzdGFydCB3aXRoICdhYWEnCisgICAgICAgIGZpbmFsIE15QXV0b2ZpbGxDYWxsYmFjayBjYWxsYmFjayA9IG1BY3Rpdml0eS5yZWdpc3RlckNhbGxiYWNrKCk7CisgICAgICAgIGZpbmFsIEltZUNvbW1hbmQgY21kNSA9IG1vY2tJbWVTZXNzaW9uLmNhbGxDb21taXRUZXh0KCJhYWEiLCAxKTsKKyAgICAgICAgZXhwZWN0Q29tbWFuZChzdHJlYW0sIGNtZDUsIE1PQ0tfSU1FX1RJTUVPVVRfTVMpOworICAgICAgICBjYWxsYmFjay5hc3NlcnRVaUhpZGRlbkV2ZW50KG1BY3Rpdml0eS5nZXRVc2VybmFtZSgpKTsKKyAgICAgICAgbVVpQm90LmFzc2VydE5vRGF0YXNldHMoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBBcHBNb2RlRnVsbCAvLyB0ZXN0RmlsdGVyKCkgaXMgZW5vdWdoIHRvIHRlc3QgZXBoZW1lcmFsIGFwcHMgc3VwcG9ydAorICAgIHB1YmxpYyB2b2lkIHRlc3RGaWx0ZXJfbnVsbFZhbHVlc0Fsd2F5c01hdGNoZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGFhID0gIlR3byBBJ3MiOworICAgICAgICBmaW5hbCBTdHJpbmcgYWIgPSAiQSBhbmQgQiI7CisgICAgICAgIGZpbmFsIFN0cmluZyBiID0gIk9ubHkgQiI7CisKKyAgICAgICAgZW5hYmxlU2VydmljZSgpOworCisgICAgICAgIC8vIFNldCBleHBlY3RhdGlvbnMuCisgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLmFkZERhdGFzZXQobmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfVVNFUk5BTUUsICJhYSIpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbihhYSkpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuYWRkRGF0YXNldChuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgImFiIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKGFiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQorICAgICAgICAgICAgICAgIC5hZGREYXRhc2V0KG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1VTRVJOQU1FLCAoU3RyaW5nKSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oYikpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gVHJpZ2dlciBhdXRvLWZpbGwuCisgICAgICAgIHJlcXVlc3RGb2N1c09uVXNlcm5hbWUoKTsKKyAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CisKKyAgICAgICAgLy8gV2l0aCBubyBmaWx0ZXIgdGV4dCBhbGwgZGF0YXNldHMgc2hvdWxkIGJlIHNob3duCisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cyhhYSwgYWIsIGIpOworCisgICAgICAgIC8vIFR3byBkYXRhc2V0cyBzdGFydCB3aXRoICdhJyBhbmQgb25lIHdpdGggbnVsbCB2YWx1ZSBhbHdheXMgc2hvd24KKyAgICAgICAgY2hhbmdlVXNlcm5hbWUoImEiKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKGFhLCBhYiwgYik7CisKKyAgICAgICAgLy8gT25lIGRhdGFzZXQgc3RhcnQgd2l0aCAnYWEnIGFuZCBvbmUgd2l0aCBudWxsIHZhbHVlIGFsd2F5cyBzaG93bgorICAgICAgICBjaGFuZ2VVc2VybmFtZSgiYWEiKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKGFhLCBiKTsKKworICAgICAgICAvLyBUd28gZGF0YXNldHMgc3RhcnQgd2l0aCAnYScgYW5kIG9uZSB3aXRoIG51bGwgdmFsdWUgYWx3YXlzIHNob3duCisgICAgICAgIGNoYW5nZVVzZXJuYW1lKCJhIik7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cyhhYSwgYWIsIGIpOworCisgICAgICAgIC8vIFdpdGggbm8gZmlsdGVyIHRleHQgYWxsIGRhdGFzZXRzIHNob3VsZCBiZSBzaG93bgorICAgICAgICBjaGFuZ2VVc2VybmFtZSgiIik7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cyhhYSwgYWIsIGIpOworCisgICAgICAgIC8vIE5vIGRhdGFzZXQgc3RhcnQgd2l0aCAnYWFhJyBhbmQgb25lIHdpdGggbnVsbCB2YWx1ZSBhbHdheXMgc2hvd24KKyAgICAgICAgY2hhbmdlVXNlcm5hbWUoImFhYSIpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoYik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gdGVzdEZpbHRlcigpIGlzIGVub3VnaCB0byB0ZXN0IGVwaGVtZXJhbCBhcHBzIHN1cHBvcnQKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsdGVyX2RpZmZlcmVudFByZWZpeGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBhID0gImFhYSI7CisgICAgICAgIGZpbmFsIFN0cmluZyBiID0gImJyYSI7CisgICAgICAgIGZpbmFsIFN0cmluZyBjID0gImNhZGFicmEiOworCisgICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKKworICAgICAgICAvLyBTZXQgZXhwZWN0YXRpb25zLgorICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5hZGREYXRhc2V0KG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1VTRVJOQU1FLCBhKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oYSkpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuYWRkRGF0YXNldChuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgYikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKGIpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLmFkZERhdGFzZXQobmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfVVNFUk5BTUUsIGMpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbihjKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAvLyBUcmlnZ2VyIGF1dG8tZmlsbC4KKyAgICAgICAgcmVxdWVzdEZvY3VzT25Vc2VybmFtZSgpOworICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKKworICAgICAgICAvLyBXaXRoIG5vIGZpbHRlciB0ZXh0IGFsbCBkYXRhc2V0cyBzaG91bGQgYmUgc2hvd24KKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKGEsIGIsIGMpOworCisgICAgICAgIGNoYW5nZVVzZXJuYW1lKCJhIik7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cyhhKTsKKworICAgICAgICBjaGFuZ2VVc2VybmFtZSgiYiIpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoYik7CisKKyAgICAgICAgY2hhbmdlVXNlcm5hbWUoImMiKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKGMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgQEFwcE1vZGVGdWxsIC8vIHRlc3RGaWx0ZXIoKSBpcyBlbm91Z2ggdG8gdGVzdCBlcGhlbWVyYWwgYXBwcyBzdXBwb3J0CisgICAgcHVibGljIHZvaWQgdGVzdEZpbHRlcl91c2luZ1JlZ2V4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIERhdGFzZXQgcHJlc2VudGF0aW9ucy4KKyAgICAgICAgZmluYWwgU3RyaW5nIGFhID0gIlR3byBBJ3MiOworICAgICAgICBmaW5hbCBTdHJpbmcgYWIgPSAiQSBhbmQgQiI7CisgICAgICAgIGZpbmFsIFN0cmluZyBiID0gIk9ubHkgQiI7CisKKyAgICAgICAgZW5hYmxlU2VydmljZSgpOworCisgICAgICAgIC8vIFNldCBleHBlY3RhdGlvbnMuCisgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLmFkZERhdGFzZXQobmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfVVNFUk5BTUUsICJ3aGF0ZXZlciIsIFBhdHRlcm4uY29tcGlsZSgiYXxhYSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oYWEpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLmFkZERhdGFzZXQobmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfVVNFUk5BTUUsICJ3aGF0c29ldmVyIiwgY3JlYXRlUHJlc2VudGF0aW9uKGFiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF0dGVybi5jb21waWxlKCJhfGFiIikpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuYWRkRGF0YXNldChuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgKFN0cmluZykgbnVsbCwgUGF0dGVybi5jb21waWxlKCJiIikpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbihiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAvLyBUcmlnZ2VyIGF1dG8tZmlsbC4KKyAgICAgICAgcmVxdWVzdEZvY3VzT25Vc2VybmFtZSgpOworICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKKworICAgICAgICAvLyBXaXRoIG5vIGZpbHRlciB0ZXh0IGFsbCBkYXRhc2V0cyBzaG91bGQgYmUgc2hvd24KKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKGFhLCBhYiwgYik7CisKKyAgICAgICAgLy8gT25seSB0d28gZGF0YXNldHMgc3RhcnQgd2l0aCAnYScKKyAgICAgICAgY2hhbmdlVXNlcm5hbWUoImEiKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKGFhLCBhYik7CisKKyAgICAgICAgLy8gT25seSBvbmUgZGF0YXNldCBzdGFydCB3aXRoICdhYScKKyAgICAgICAgY2hhbmdlVXNlcm5hbWUoImFhIik7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cyhhYSk7CisKKyAgICAgICAgLy8gT25seSB0d28gZGF0YXNldHMgc3RhcnQgd2l0aCAnYScKKyAgICAgICAgY2hhbmdlVXNlcm5hbWUoImEiKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKGFhLCBhYik7CisKKyAgICAgICAgLy8gV2l0aCBubyBmaWx0ZXIgdGV4dCBhbGwgZGF0YXNldHMgc2hvdWxkIGJlIHNob3duCisgICAgICAgIGNoYW5nZVVzZXJuYW1lKCIiKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKGFhLCBhYiwgYik7CisKKyAgICAgICAgLy8gTm8gZGF0YXNldCBzdGFydCB3aXRoICdhYWEnCisgICAgICAgIGZpbmFsIE15QXV0b2ZpbGxDYWxsYmFjayBjYWxsYmFjayA9IG1BY3Rpdml0eS5yZWdpc3RlckNhbGxiYWNrKCk7CisgICAgICAgIGNoYW5nZVVzZXJuYW1lKCJhYWEiKTsKKyAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlIaWRkZW5FdmVudChtQWN0aXZpdHkuZ2V0VXNlcm5hbWUoKSk7CisgICAgICAgIG1VaUJvdC5hc3NlcnROb0RhdGFzZXRzKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gdGVzdEZpbHRlcigpIGlzIGVub3VnaCB0byB0ZXN0IGVwaGVtZXJhbCBhcHBzIHN1cHBvcnQKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsdGVyX2Rpc2FibGVkVXNpbmdOdWxsUmVnZXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gRGF0YXNldCBwcmVzZW50YXRpb25zLgorICAgICAgICBmaW5hbCBTdHJpbmcgdW5maWx0ZXJhYmxlID0gIlVuZmlsdGVyYWJsZWQiOworICAgICAgICBmaW5hbCBTdHJpbmcgYU9yVyA9ICJBIG9yIFciOworICAgICAgICBmaW5hbCBTdHJpbmcgdyA9ICJXYXp6dXAiOworCisgICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKKworICAgICAgICAvLyBTZXQgZXhwZWN0YXRpb25zLgorICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC8vIFRoaXMgZGF0YXNldCBoYXMgYSB2YWx1ZSBidXQgZmlsdGVyIGlzIGRpc2FibGVkCisgICAgICAgICAgICAgICAgLmFkZERhdGFzZXQobmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0VW5maWx0ZXJhYmxlRmllbGQoSURfVVNFUk5BTUUsICJhIGFtIEkiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24odW5maWx0ZXJhYmxlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQorICAgICAgICAgICAgICAgIC8vIFRoaXMgZGF0YXNldCB1c2VzIHBhdHRlcm4gdG8gZmlsdGVyCisgICAgICAgICAgICAgICAgLmFkZERhdGFzZXQobmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfVVNFUk5BTUUsICJ3aGF0c29ldmVyIiwgY3JlYXRlUHJlc2VudGF0aW9uKGFPclcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoImF8YXciKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQorICAgICAgICAgICAgICAgIC8vIFRoaXMgZGF0YXNldCB1c2VzIHZhbHVlIHRvIGZpbHRlcgorICAgICAgICAgICAgICAgIC5hZGREYXRhc2V0KG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1VTRVJOQU1FLCAid2F6enVwIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKHcpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIC8vIFRyaWdnZXIgYXV0by1maWxsLgorICAgICAgICByZXF1ZXN0Rm9jdXNPblVzZXJuYW1lKCk7CisgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOworCisgICAgICAgIC8vIFdpdGggbm8gZmlsdGVyIHRleHQgYWxsIGRhdGFzZXRzIHNob3VsZCBiZSBzaG93bgorICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHModW5maWx0ZXJhYmxlLCBhT3JXLCB3KTsKKworICAgICAgICAvLyBPbmx5IG9uZSBkYXRhc2V0IHN0YXJ0IHdpdGggJ2EnCisgICAgICAgIGNoYW5nZVVzZXJuYW1lKCJhIik7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cyhhT3JXKTsKKworICAgICAgICAvLyBObyBkYXRhc2V0IHN0YXJ0cyB3aXRoICdhYScKKyAgICAgICAgY2hhbmdlVXNlcm5hbWUoImFhIik7CisgICAgICAgIG1VaUJvdC5hc3NlcnROb0RhdGFzZXRzKCk7CisKKyAgICAgICAgLy8gT25seSBvbmUgZGF0YXNldHMgc3RhcnQgd2l0aCAnYScKKyAgICAgICAgY2hhbmdlVXNlcm5hbWUoImEiKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKGFPclcpOworCisgICAgICAgIC8vIFdpdGggbm8gZmlsdGVyIHRleHQgYWxsIGRhdGFzZXRzIHNob3VsZCBiZSBzaG93bgorICAgICAgICBjaGFuZ2VVc2VybmFtZSgiIik7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cyh1bmZpbHRlcmFibGUsIGFPclcsIHcpOworCisgICAgICAgIC8vIE9ubHkgb25lIGRhdGFzZXRzIHN0YXJ0IHdpdGggJ3cnCisgICAgICAgIGNoYW5nZVVzZXJuYW1lKCJ3Iik7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cyh3KTsKKworICAgICAgICAvLyBObyBkYXRhc2V0IHN0YXJ0IHdpdGggJ2FhYScKKyAgICAgICAgZmluYWwgTXlBdXRvZmlsbENhbGxiYWNrIGNhbGxiYWNrID0gbUFjdGl2aXR5LnJlZ2lzdGVyQ2FsbGJhY2soKTsKKyAgICAgICAgY2hhbmdlVXNlcm5hbWUoImFhYSIpOworICAgICAgICBjYWxsYmFjay5hc3NlcnRVaUhpZGRlbkV2ZW50KG1BY3Rpdml0eS5nZXRVc2VybmFtZSgpKTsKKyAgICAgICAgbVVpQm90LmFzc2VydE5vRGF0YXNldHMoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBBcHBNb2RlRnVsbCAvLyB0ZXN0RmlsdGVyKCkgaXMgZW5vdWdoIHRvIHRlc3QgZXBoZW1lcmFsIGFwcHMgc3VwcG9ydAorICAgIHB1YmxpYyB2b2lkIHRlc3RGaWx0ZXJfbWl4UGxhaW5BbmRSZWdleCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgcGxhaW4gPSAiUGxhaW4iOworICAgICAgICBmaW5hbCBTdHJpbmcgcmVnZXhQbGFpbiA9ICJSZWdleFBsYWluIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIGF1dGhSZWdleCA9ICJBdXRoUmVnZXgiOworICAgICAgICBmaW5hbCBTdHJpbmcga2l0Y2huU3luYyA9ICJLaXRjaGVuU3luYyI7CisgICAgICAgIGZpbmFsIFBhdHRlcm4gZXZlcnl0aGluZyA9IFBhdHRlcm4uY29tcGlsZSgiLioiKTsKKworICAgICAgICBlbmFibGVTZXJ2aWNlKCk7CisKKyAgICAgICAgLy8gU2V0IGV4cGVjdGF0aW9ucy4KKyAgICAgICAgZmluYWwgSW50ZW50U2VuZGVyIGF1dGhlbnRpY2F0aW9uID0gQXV0aGVudGljYXRpb25BY3Rpdml0eS5jcmVhdGVTZW5kZXIobUNvbnRleHQsIDEsCisgICAgICAgICAgICAgICAgbmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfVVNFUk5BTUUsICJkdWRlIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UobmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuYWRkRGF0YXNldChuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgImF3b3JkIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKHBsYWluKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQorICAgICAgICAgICAgICAgIC5hZGREYXRhc2V0KG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1VTRVJOQU1FLCAiYSBpZ25vcmUiLCBldmVyeXRoaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24ocmVnZXhQbGFpbikpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuYWRkRGF0YXNldChuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgImFiIGlnbm9yZSIsIGV2ZXJ5dGhpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0QXV0aGVudGljYXRpb24oYXV0aGVudGljYXRpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbihhdXRoUmVnZXgpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLmFkZERhdGFzZXQobmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfVVNFUk5BTUUsICJhYiBpZ25vcmUiLCBjcmVhdGVQcmVzZW50YXRpb24oa2l0Y2huU3luYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZXJ5dGhpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gVHJpZ2dlciBhdXRvLWZpbGwuCisgICAgICAgIHJlcXVlc3RGb2N1c09uVXNlcm5hbWUoKTsKKyAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CisKKyAgICAgICAgLy8gV2l0aCBubyBmaWx0ZXIgdGV4dCBhbGwgZGF0YXNldHMgc2hvdWxkIGJlIHNob3duCisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cyhwbGFpbiwgcmVnZXhQbGFpbiwgYXV0aFJlZ2V4LCBraXRjaG5TeW5jKTsKKworICAgICAgICAvLyBBbGwgZGF0YXNldHMgc3RhcnQgd2l0aCAnYScKKyAgICAgICAgY2hhbmdlVXNlcm5hbWUoImEiKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKHBsYWluLCByZWdleFBsYWluLCBhdXRoUmVnZXgsIGtpdGNoblN5bmMpOworCisgICAgICAgIC8vIE9ubHkgdGhlIHJlZ2V4IGRhdGFzZXRzIHNob3VsZCBzdGFydCB3aXRoICdhYicKKyAgICAgICAgY2hhbmdlVXNlcm5hbWUoImFiIik7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cyhyZWdleFBsYWluLCBhdXRoUmVnZXgsIGtpdGNoblN5bmMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgQEFwcE1vZGVGdWxsIC8vIHRlc3RGaWx0ZXJfdXNpbmdLZXlib2FyZCgpIGlzIGVub3VnaCB0byB0ZXN0IGVwaGVtZXJhbCBhcHBzIHN1cHBvcnQKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsdGVyX21peFBsYWluQW5kUmVnZXhfdXNpbmdLZXlib2FyZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgcGxhaW4gPSAiUGxhaW4iOworICAgICAgICBmaW5hbCBTdHJpbmcgcmVnZXhQbGFpbiA9ICJSZWdleFBsYWluIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIGF1dGhSZWdleCA9ICJBdXRoUmVnZXgiOworICAgICAgICBmaW5hbCBTdHJpbmcga2l0Y2huU3luYyA9ICJLaXRjaGVuU3luYyI7CisgICAgICAgIGZpbmFsIFBhdHRlcm4gZXZlcnl0aGluZyA9IFBhdHRlcm4uY29tcGlsZSgiLioiKTsKKworICAgICAgICBlbmFibGVTZXJ2aWNlKCk7CisKKyAgICAgICAgLy8gU2V0IGV4cGVjdGF0aW9ucy4KKyAgICAgICAgZmluYWwgSW50ZW50U2VuZGVyIGF1dGhlbnRpY2F0aW9uID0gQXV0aGVudGljYXRpb25BY3Rpdml0eS5jcmVhdGVTZW5kZXIobUNvbnRleHQsIDEsCisgICAgICAgICAgICAgICAgbmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfVVNFUk5BTUUsICJkdWRlIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UobmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuYWRkRGF0YXNldChuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgImF3b3JkIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKHBsYWluKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQorICAgICAgICAgICAgICAgIC5hZGREYXRhc2V0KG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1VTRVJOQU1FLCAiYSBpZ25vcmUiLCBldmVyeXRoaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24ocmVnZXhQbGFpbikpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuYWRkRGF0YXNldChuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgImFiIGlnbm9yZSIsIGV2ZXJ5dGhpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0QXV0aGVudGljYXRpb24oYXV0aGVudGljYXRpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbihhdXRoUmVnZXgpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLmFkZERhdGFzZXQobmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfVVNFUk5BTUUsICJhYiBpZ25vcmUiLCBjcmVhdGVQcmVzZW50YXRpb24oa2l0Y2huU3luYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZXJ5dGhpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gVHJpZ2dlciBhdXRvLWZpbGwuCisgICAgICAgIHJlcXVlc3RGb2N1c09uVXNlcm5hbWUoKTsKKyAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CisKKyAgICAgICAgLy8gV2l0aCBubyBmaWx0ZXIgdGV4dCBhbGwgZGF0YXNldHMgc2hvdWxkIGJlIHNob3duCisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cyhwbGFpbiwgcmVnZXhQbGFpbiwgYXV0aFJlZ2V4LCBraXRjaG5TeW5jKTsKKworICAgICAgICAvLyBBbGwgZGF0YXNldHMgc3RhcnQgd2l0aCAnYScKKyAgICAgICAgc2VuZEtleUV2ZW50cygiS0VZQ09ERV9BIik7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cyhwbGFpbiwgcmVnZXhQbGFpbiwgYXV0aFJlZ2V4LCBraXRjaG5TeW5jKTsKKworICAgICAgICAvLyBPbmx5IHRoZSByZWdleCBkYXRhc2V0cyBzaG91bGQgc3RhcnQgd2l0aCAnYWInCisgICAgICAgIHNlbmRLZXlFdmVudHMoIktFWUNPREVfQiIpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMocmVnZXhQbGFpbiwgYXV0aFJlZ2V4LCBraXRjaG5TeW5jKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9EYXRhc2V0VGVzdC5qYXZhIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvRGF0YXNldFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzlhODI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvRGF0YXNldFRlc3QuamF2YQpAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLnRydXRoLlRydXRoLmFzc2VydFRoYXQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5tb2NrOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnRUaHJvd3M7CisKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CitpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLmF1dG9maWxsLkRhdGFzZXQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LmF1dG9maWxsLkF1dG9maWxsSWQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LmF1dG9maWxsLkF1dG9maWxsVmFsdWU7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3M7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworCitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKK0BSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCitAQXBwTW9kZUZ1bGwgLy8gVW5pdCB0ZXN0CitwdWJsaWMgY2xhc3MgRGF0YXNldFRlc3QgeworCisgICAgcHJpdmF0ZSBmaW5hbCBBdXRvZmlsbElkIG1JZCA9IG5ldyBBdXRvZmlsbElkKDQyKTsKKyAgICBwcml2YXRlIGZpbmFsIEF1dG9maWxsVmFsdWUgbVZhbHVlID0gQXV0b2ZpbGxWYWx1ZS5mb3JUZXh0KCJWYWx1YWJsZUxpa2VHb2xkIik7CisgICAgcHJpdmF0ZSBmaW5hbCBQYXR0ZXJuIG1GaWx0ZXIgPSBQYXR0ZXJuLmNvbXBpbGUoIndoYXRldmVyIik7CisKKyAgICBwcml2YXRlIGZpbmFsIFJlbW90ZVZpZXdzIG1QcmVzZW50YXRpb24gPSBtb2NrKFJlbW90ZVZpZXdzLmNsYXNzKTsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJ1aWxkZXJfbnVsbFByZXNlbnRhdGlvbigpIHsKKyAgICAgICAgYXNzZXJ0VGhyb3dzKE51bGxQb2ludGVyRXhjZXB0aW9uLmNsYXNzLCAoKSAtPiBuZXcgRGF0YXNldC5CdWlsZGVyKG51bGwpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCdWlsZGVyX3NldFZhbHVlTnVsbElkKCkgeworICAgICAgICBmaW5hbCBEYXRhc2V0LkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBEYXRhc2V0LkJ1aWxkZXIobVByZXNlbnRhdGlvbik7CisgICAgICAgIGFzc2VydFRocm93cyhOdWxsUG9pbnRlckV4Y2VwdGlvbi5jbGFzcywgKCkgLT4gYnVpbGRlci5zZXRWYWx1ZShudWxsLCBtVmFsdWUpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCdWlsZGVyX3NldFZhbHVlV2l0aG91dFByZXNlbnRhdGlvbigpIHsKKyAgICAgICAgLy8gSnVzdCBhc3NlcnQgdGhhdCBpdCBidWlsZHMgd2l0aG91dCB0aHJvd2luZyBhbiBleGNlcHRpb24uCisgICAgICAgIGFzc2VydFRoYXQobmV3IERhdGFzZXQuQnVpbGRlcigpLnNldFZhbHVlKG1JZCwgbVZhbHVlKS5idWlsZCgpKS5pc05vdE51bGwoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCdWlsZGVyX3NldFZhbHVlV2l0aE51bGxQcmVzZW50YXRpb24oKSB7CisgICAgICAgIGZpbmFsIERhdGFzZXQuQnVpbGRlciBidWlsZGVyID0gbmV3IERhdGFzZXQuQnVpbGRlcigpOworICAgICAgICBhc3NlcnRUaHJvd3MoTnVsbFBvaW50ZXJFeGNlcHRpb24uY2xhc3MsICgpIC0+IGJ1aWxkZXIuc2V0VmFsdWUobUlkLCBtVmFsdWUsCisgICAgICAgICAgICAgICAgKFJlbW90ZVZpZXdzKSBudWxsKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QnVpbGRlcl9zZXRGaWx0ZXJlZFZhbHVlV2l0aE51bGxGaWx0ZXIoKSB7CisgICAgICAgIGFzc2VydFRoYXQobmV3IERhdGFzZXQuQnVpbGRlcihtUHJlc2VudGF0aW9uKS5zZXRWYWx1ZShtSWQsIG1WYWx1ZSwgKFBhdHRlcm4pIG51bGwpLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLmlzTm90TnVsbCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJ1aWxkZXJfc2V0RmlsdGVyZWRWYWx1ZVdpdGhQcmVzZW50YXRpb25OdWxsRmlsdGVyKCkgeworICAgICAgICBhc3NlcnRUaGF0KG5ldyBEYXRhc2V0LkJ1aWxkZXIoKS5zZXRWYWx1ZShtSWQsIG1WYWx1ZSwgbnVsbCwgbVByZXNlbnRhdGlvbikuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuaXNOb3ROdWxsKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QnVpbGRlcl9zZXRGaWx0ZXJlZFZhbHVlV2l0aFByZXNlbnRhdGlvbk51bGxQcmVzZW50YXRpb24oKSB7CisgICAgICAgIGZpbmFsIERhdGFzZXQuQnVpbGRlciBidWlsZGVyID0gbmV3IERhdGFzZXQuQnVpbGRlcigpOworICAgICAgICBhc3NlcnRUaHJvd3MoTnVsbFBvaW50ZXJFeGNlcHRpb24uY2xhc3MsICgpIC0+IGJ1aWxkZXIuc2V0VmFsdWUobUlkLCBtVmFsdWUsIG1GaWx0ZXIsCisgICAgICAgICAgICAgICAgbnVsbCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJ1aWxkZXJfc2V0RmlsdGVyZWRWYWx1ZVdpdGhvdXRQcmVzZW50YXRpb24oKSB7CisgICAgICAgIGZpbmFsIERhdGFzZXQuQnVpbGRlciBidWlsZGVyID0gbmV3IERhdGFzZXQuQnVpbGRlcigpOworICAgICAgICBhc3NlcnRUaHJvd3MoSWxsZWdhbFN0YXRlRXhjZXB0aW9uLmNsYXNzLCAoKSAtPiBidWlsZGVyLnNldFZhbHVlKG1JZCwgbVZhbHVlLCBtRmlsdGVyKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QnVpbGRfbm9WYWx1ZXMoKSB7CisgICAgICAgIGZpbmFsIERhdGFzZXQuQnVpbGRlciBidWlsZGVyID0gbmV3IERhdGFzZXQuQnVpbGRlcigpOworICAgICAgICBhc3NlcnRUaHJvd3MoSWxsZWdhbFN0YXRlRXhjZXB0aW9uLmNsYXNzLCAoKSAtPiBidWlsZGVyLmJ1aWxkKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vTW9yZUludGVyYWN0aW9uc0FmdGVyQnVpbGQoKSB7CisgICAgICAgIGZpbmFsIERhdGFzZXQuQnVpbGRlciBidWlsZGVyID0gbmV3IERhdGFzZXQuQnVpbGRlcigpOworICAgICAgICBidWlsZGVyLnNldFZhbHVlKG1JZCwgbVZhbHVlLCBtUHJlc2VudGF0aW9uKTsKKyAgICAgICAgYXNzZXJ0VGhhdChidWlsZGVyLmJ1aWxkKCkpLmlzTm90TnVsbCgpOworICAgICAgICBhc3NlcnRUaHJvd3MoSWxsZWdhbFN0YXRlRXhjZXB0aW9uLmNsYXNzLCAoKSAtPiBidWlsZGVyLmJ1aWxkKCkpOworICAgICAgICBhc3NlcnRUaHJvd3MoSWxsZWdhbFN0YXRlRXhjZXB0aW9uLmNsYXNzLCAoKSAtPiBidWlsZGVyLnNldFZhbHVlKG1JZCwgbVZhbHVlKSk7CisgICAgICAgIGFzc2VydFRocm93cyhJbGxlZ2FsU3RhdGVFeGNlcHRpb24uY2xhc3MsCisgICAgICAgICAgICAgICAgKCkgLT4gYnVpbGRlci5zZXRWYWx1ZShtSWQsIG1WYWx1ZSwgbVByZXNlbnRhdGlvbikpOworICAgICAgICBhc3NlcnRUaHJvd3MoSWxsZWdhbFN0YXRlRXhjZXB0aW9uLmNsYXNzLAorICAgICAgICAgICAgICAgICgpIC0+IGJ1aWxkZXIuc2V0VmFsdWUobUlkLCBtVmFsdWUsIG1GaWx0ZXIpKTsKKyAgICAgICAgYXNzZXJ0VGhyb3dzKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAoKSAtPiBidWlsZGVyLnNldFZhbHVlKG1JZCwgbVZhbHVlLCBtRmlsdGVyLCBtUHJlc2VudGF0aW9uKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvRGF0ZVBpY2tlckNhbGVuZGFyQWN0aXZpdHlUZXN0LmphdmEgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9EYXRlUGlja2VyQ2FsZW5kYXJBY3Rpdml0eVRlc3QuamF2YQppbmRleCA0MGMxMWQzLi5mMGMzZTA0IDEwMDY0NAotLS0gYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9EYXRlUGlja2VyQ2FsZW5kYXJBY3Rpdml0eVRlc3QuamF2YQorKysgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9EYXRlUGlja2VyQ2FsZW5kYXJBY3Rpdml0eVRlc3QuamF2YQpAQCAtMTUsOCArMTUsMTEgQEAKICAqLwogcGFja2FnZSBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHM7CiAKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CisKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIAorQEFwcE1vZGVGdWxsIC8vIFVuaXQgdGVzdAogcHVibGljIGNsYXNzIERhdGVQaWNrZXJDYWxlbmRhckFjdGl2aXR5VGVzdCBleHRlbmRzIERhdGVQaWNrZXJUZXN0Q2FzZTxEYXRlUGlja2VyQ2FsZW5kYXJBY3Rpdml0eT4gewogCiAgICAgQFJ1bGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0RhdGVQaWNrZXJTcGlubmVyQWN0aXZpdHlUZXN0LmphdmEgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9EYXRlUGlja2VyU3Bpbm5lckFjdGl2aXR5VGVzdC5qYXZhCmluZGV4IDA0OTdmODcuLjBmYjAyNmEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0RhdGVQaWNrZXJTcGlubmVyQWN0aXZpdHlUZXN0LmphdmEKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvRGF0ZVBpY2tlclNwaW5uZXJBY3Rpdml0eVRlc3QuamF2YQpAQCAtMTUsOCArMTUsMTEgQEAKICAqLwogcGFja2FnZSBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHM7CiAKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CisKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIAorQEFwcE1vZGVGdWxsIC8vIFVuaXQgdGVzdAogcHVibGljIGNsYXNzIERhdGVQaWNrZXJTcGlubmVyQWN0aXZpdHlUZXN0IGV4dGVuZHMgRGF0ZVBpY2tlclRlc3RDYXNlPERhdGVQaWNrZXJTcGlubmVyQWN0aXZpdHk+IHsKIAogICAgIEBSdWxlCmRpZmYgLS1naXQgYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9EYXRlUGlja2VyVGVzdENhc2UuamF2YSBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0RhdGVQaWNrZXJUZXN0Q2FzZS5qYXZhCmluZGV4IGQ5NzdhYzYuLmM5YWZhY2MgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0RhdGVQaWNrZXJUZXN0Q2FzZS5qYXZhCisrKyBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0RhdGVQaWNrZXJUZXN0Q2FzZS5qYXZhCkBAIC0zMSw3ICszMSw2IEBACiBpbXBvcnQgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkluc3RydW1lbnRlZEF1dG9GaWxsU2VydmljZS5TYXZlUmVxdWVzdDsKIGltcG9ydCBhbmRyb2lkLmljdS51dGlsLkNhbGVuZGFyOwogCi1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCiAvKioKQEAgLTQyLDExICs0MSw2IEBACiAKICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgVCBnZXREYXRlUGlja2VyQWN0aXZpdHkoKTsKIAotICAgIEBBZnRlcgotICAgIHB1YmxpYyB2b2lkIGZpbmlzaFdlbGNvbWVBY3Rpdml0eSgpIHsKLSAgICAgICAgV2VsY29tZUFjdGl2aXR5LmZpbmlzaEl0KCk7Ci0gICAgfQotCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0b0ZpbGxBbmRTYXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIFQgYWN0aXZpdHkgPSBnZXREYXRlUGlja2VyQWN0aXZpdHkoKTsKQEAgLTU3LDcgKzUxLDcgQEAKICAgICAgICAgLy8gU2V0IGV4cGVjdGF0aW9ucy4KICAgICAgICAgZmluYWwgQ2FsZW5kYXIgY2FsID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKICAgICAgICAgY2FsLnNldChDYWxlbmRhci5ZRUFSLCAyMDEyKTsKLSAgICAgICAgY2FsLnNldChDYWxlbmRhci5NT05USCwgMTEpOworICAgICAgICBjYWwuc2V0KENhbGVuZGFyLk1PTlRILCBDYWxlbmRhci5ERUNFTUJFUik7CiAgICAgICAgIGNhbC5zZXQoQ2FsZW5kYXIuREFZX09GX01PTlRILCAyMCk7CiAKICAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UobmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkKQEAgLTY4LDcgKzYyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCiAgICAgICAgICAgICAgICAgLnNldFJlcXVpcmVkU2F2YWJsZUlkcyhTQVZFX0RBVEFfVFlQRV9HRU5FUklDLCBJRF9PVVRQVVQsIElEX0RBVEVfUElDS0VSKQogICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKLSAgICAgICAgYWN0aXZpdHkuZXhwZWN0QXV0b0ZpbGwoIjIwMTIvMTEvMjAiLCAyMDEyLCAxMSwgMjApOworICAgICAgICBhY3Rpdml0eS5leHBlY3RBdXRvRmlsbCgiMjAxMi8xMS8yMCIsIDIwMTIsIENhbGVuZGFyLkRFQ0VNQkVSLCAyMCk7CiAKICAgICAgICAgLy8gVHJpZ2dlciBhdXRvLWZpbGwuCiAgICAgICAgIGFjdGl2aXR5Lm9uT3V0cHV0KCh2KSAtPiB2LnJlcXVlc3RGb2N1cygpKTsKQEAgLTc5LDE2ICs3MywxNiBAQAogICAgICAgICBhc3NlcnROdW1iZXJPZkNoaWxkcmVuKGZpbGxSZXF1ZXN0LnN0cnVjdHVyZSwgSURfREFURV9QSUNLRVIsIDApOwogCiAgICAgICAgIC8vIEF1dG8tZmlsbCBpdC4KLSAgICAgICAgc1VpQm90LnNlbGVjdERhdGFzZXQoIlRoZSBlbmQgb2YgdGhlIHdvcmxkIik7CisgICAgICAgIG1VaUJvdC5zZWxlY3REYXRhc2V0KCJUaGUgZW5kIG9mIHRoZSB3b3JsZCIpOwogCiAgICAgICAgIC8vIENoZWNrIHRoZSByZXN1bHRzLgogICAgICAgICBhY3Rpdml0eS5hc3NlcnRBdXRvRmlsbGVkKCk7CiAKICAgICAgICAgLy8gVHJpZ2dlciBzYXZlLgotICAgICAgICBhY3Rpdml0eS5zZXREYXRlKDIwMTAsIDExLCAxMik7CisgICAgICAgIGFjdGl2aXR5LnNldERhdGUoMjAxMCwgQ2FsZW5kYXIuREVDRU1CRVIsIDEyKTsKICAgICAgICAgYWN0aXZpdHkudGFwT2soKTsKIAotICAgICAgICBzVWlCb3Quc2F2ZUZvckF1dG9maWxsKHRydWUsIFNBVkVfREFUQV9UWVBFX0dFTkVSSUMpOworICAgICAgICBtVWlCb3Quc2F2ZUZvckF1dG9maWxsKHRydWUsIFNBVkVfREFUQV9UWVBFX0dFTkVSSUMpOwogICAgICAgICBmaW5hbCBTYXZlUmVxdWVzdCBzYXZlUmVxdWVzdCA9IHNSZXBsaWVyLmdldE5leHRTYXZlUmVxdWVzdCgpOwogICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgib25TYXZlKCkgbm90IGNhbGxlZCIpLnRoYXQoc2F2ZVJlcXVlc3QpLmlzTm90TnVsbCgpOwogCmRpZmYgLS1naXQgYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9EYXRlVHJhbnNmb3JtYXRpb25UZXN0LmphdmEgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9EYXRlVHJhbnNmb3JtYXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYyZDBlZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0RhdGVUcmFuc2Zvcm1hdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDk5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uQXJndW1lbnRNYXRjaGVycy5hbnk7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLkFyZ3VtZW50TWF0Y2hlcnMuYXJnVGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uQXJndW1lbnRNYXRjaGVycy5lcTsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5uZXZlcjsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by52ZXJpZnk7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ud2hlbjsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0VGhyb3dzOworCitpbXBvcnQgYW5kcm9pZC5pY3UudGV4dC5TaW1wbGVEYXRlRm9ybWF0OworaW1wb3J0IGFuZHJvaWQuaWN1LnV0aWwuQ2FsZW5kYXI7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOworaW1wb3J0IGFuZHJvaWQuc2VydmljZS5hdXRvZmlsbC5EYXRlVHJhbnNmb3JtYXRpb247CitpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLmF1dG9maWxsLlZhbHVlRmluZGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5hdXRvZmlsbC5BdXRvZmlsbElkOworaW1wb3J0IGFuZHJvaWQudmlldy5hdXRvZmlsbC5BdXRvZmlsbFZhbHVlOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlJlbW90ZVZpZXdzOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5tb2NraXRvLk1vY2s7CitpbXBvcnQgb3JnLm1vY2tpdG8uanVuaXQuTW9ja2l0b0pVbml0UnVubmVyOworCitAUnVuV2l0aChNb2NraXRvSlVuaXRSdW5uZXIuY2xhc3MpCitAQXBwTW9kZUZ1bGwgLy8gVW5pdCB0ZXN0CitwdWJsaWMgY2xhc3MgRGF0ZVRyYW5zZm9ybWF0aW9uVGVzdCB7CisKKyAgICBATW9jayBwcml2YXRlIFZhbHVlRmluZGVyIG1WYWx1ZUZpbmRlcjsKKyAgICBATW9jayBwcml2YXRlIFJlbW90ZVZpZXdzIG1UZW1wbGF0ZTsKKworICAgIHByaXZhdGUgZmluYWwgQXV0b2ZpbGxJZCBtRmllbGRJZCA9IG5ldyBBdXRvZmlsbElkKDQyKTsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yX251bGxGaWVsZElkKCkgeworICAgICAgICBhc3NlcnRUaHJvd3MoTnVsbFBvaW50ZXJFeGNlcHRpb24uY2xhc3MsCisgICAgICAgICAgICAgICAgKCkgLT4gbmV3IERhdGVUcmFuc2Zvcm1hdGlvbihudWxsLCBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JfbnVsbERhdGVGb3JtYXQoKSB7CisgICAgICAgIGFzc2VydFRocm93cyhOdWxsUG9pbnRlckV4Y2VwdGlvbi5jbGFzcywgKCkgLT4gbmV3IERhdGVUcmFuc2Zvcm1hdGlvbihtRmllbGRJZCwgbnVsbCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZpZWxkTm90Rm91bmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgRGF0ZVRyYW5zZm9ybWF0aW9uIHRyYW5zID0gbmV3IERhdGVUcmFuc2Zvcm1hdGlvbihtRmllbGRJZCwgbmV3IFNpbXBsZURhdGVGb3JtYXQoKSk7CisKKyAgICAgICAgdHJhbnMuYXBwbHkobVZhbHVlRmluZGVyLCBtVGVtcGxhdGUsIDApOworCisgICAgICAgIHZlcmlmeShtVGVtcGxhdGUsIG5ldmVyKCkpLnNldENoYXJTZXF1ZW5jZShlcSgwKSwgYW55KCksIGFueSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQXV0b2ZpbGxWYWx1ZVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgRGF0ZVRyYW5zZm9ybWF0aW9uIHRyYW5zID0gbmV3IERhdGVUcmFuc2Zvcm1hdGlvbihtRmllbGRJZCwgbmV3IFNpbXBsZURhdGVGb3JtYXQoKSk7CisKKyAgICAgICAgd2hlbihtVmFsdWVGaW5kZXIuZmluZFJhd1ZhbHVlQnlBdXRvZmlsbElkKG1GaWVsZElkKSkKKyAgICAgICAgICAgICAgICAudGhlblJldHVybihBdXRvZmlsbFZhbHVlLmZvclRleHQoIkQnT0giKSk7CisgICAgICAgIHRyYW5zLmFwcGx5KG1WYWx1ZUZpbmRlciwgbVRlbXBsYXRlLCAwKTsKKworICAgICAgICB2ZXJpZnkobVRlbXBsYXRlLCBuZXZlcigpKS5zZXRDaGFyU2VxdWVuY2UoZXEoMCksIGFueSgpLCBhbnkoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRBdXRvZmlsbFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIERhdGVUcmFuc2Zvcm1hdGlvbiB0cmFucyA9IG5ldyBEYXRlVHJhbnNmb3JtYXRpb24obUZpZWxkSWQsCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZURhdGVGb3JtYXQoIk1NL3l5eXkiKSk7CisKKyAgICAgICAgZmluYWwgQ2FsZW5kYXIgY2FsID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgY2FsLnNldChDYWxlbmRhci5ZRUFSLCAyMDEyKTsKKyAgICAgICAgY2FsLnNldChDYWxlbmRhci5NT05USCwgQ2FsZW5kYXIuREVDRU1CRVIpOworICAgICAgICBjYWwuc2V0KENhbGVuZGFyLkRBWV9PRl9NT05USCwgMjApOworCisgICAgICAgIHdoZW4obVZhbHVlRmluZGVyLmZpbmRSYXdWYWx1ZUJ5QXV0b2ZpbGxJZChtRmllbGRJZCkpCisgICAgICAgICAgICAgICAgLnRoZW5SZXR1cm4oQXV0b2ZpbGxWYWx1ZS5mb3JEYXRlKGNhbC5nZXRUaW1lSW5NaWxsaXMoKSkpOworCisgICAgICAgIHRyYW5zLmFwcGx5KG1WYWx1ZUZpbmRlciwgbVRlbXBsYXRlLCAwKTsKKworICAgICAgICB2ZXJpZnkobVRlbXBsYXRlKS5zZXRDaGFyU2VxdWVuY2UoZXEoMCksIGFueSgpLAorICAgICAgICAgICAgICAgIGFyZ1RoYXQobmV3IENoYXJTZXF1ZW5jZU1hdGNoZXIoIjEyLzIwMTIiKSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0RhdGVWYWx1ZVNhbml0aXplclRlc3QuamF2YSBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0RhdGVWYWx1ZVNhbml0aXplclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTJkM2JkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvRGF0ZVZhbHVlU2FuaXRpemVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0czsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi50cnV0aC5UcnV0aC5hc3NlcnRUaGF0OworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydFRocm93czsKKworaW1wb3J0IGFuZHJvaWQuaWN1LnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKK2ltcG9ydCBhbmRyb2lkLmljdS51dGlsLkNhbGVuZGFyOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKK2ltcG9ydCBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuRGF0ZVZhbHVlU2FuaXRpemVyOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LmF1dG9maWxsLkF1dG9maWxsVmFsdWU7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworCitpbXBvcnQgamF2YS51dGlsLkRhdGU7CisKK0BSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCitAQXBwTW9kZUZ1bGwgLy8gVW5pdCB0ZXN0CitwdWJsaWMgY2xhc3MgRGF0ZVZhbHVlU2FuaXRpemVyVGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkRhdGVWYWx1ZVNhbml0aXplclRlc3QiOworCisgICAgcHJpdmF0ZSBmaW5hbCBTaW1wbGVEYXRlRm9ybWF0IG1EYXRlRm9ybWF0ID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoIk1NL3l5eXkiKTsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yX251bGxEYXRlRm9ybWF0KCkgeworICAgICAgICBhc3NlcnRUaHJvd3MoTnVsbFBvaW50ZXJFeGNlcHRpb24uY2xhc3MsICgpIC0+IG5ldyBEYXRlVmFsdWVTYW5pdGl6ZXIobnVsbCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNhbml0aXplX251bGxWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBEYXRlVmFsdWVTYW5pdGl6ZXIgc2FuaXRpemVyID0gbmV3IERhdGVWYWx1ZVNhbml0aXplcihuZXcgU2ltcGxlRGF0ZUZvcm1hdCgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzYW5pdGl6ZXIuc2FuaXRpemUobnVsbCkpLmlzTnVsbCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNhbml0aXplX2ludmFsaWRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBEYXRlVmFsdWVTYW5pdGl6ZXIgc2FuaXRpemVyID0gbmV3IERhdGVWYWx1ZVNhbml0aXplcihuZXcgU2ltcGxlRGF0ZUZvcm1hdCgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzYW5pdGl6ZXIuc2FuaXRpemUoQXV0b2ZpbGxWYWx1ZS5mb3JUZXh0KCJEJ09IISIpKSkuaXNOdWxsKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2FuaXRpemVfb2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ2FsZW5kYXIgaW5wdXRDYWwgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOworICAgICAgICBpbnB1dENhbC5zZXQoQ2FsZW5kYXIuWUVBUiwgMjAxMik7CisgICAgICAgIGlucHV0Q2FsLnNldChDYWxlbmRhci5NT05USCwgQ2FsZW5kYXIuREVDRU1CRVIpOworICAgICAgICBpbnB1dENhbC5zZXQoQ2FsZW5kYXIuREFZX09GX01PTlRILCAyMCk7CisgICAgICAgIGZpbmFsIGxvbmcgaW5wdXREYXRlID0gaW5wdXRDYWwuZ2V0VGltZUluTWlsbGlzKCk7CisgICAgICAgIGZpbmFsIEF1dG9maWxsVmFsdWUgaW5wdXRWYWx1ZSA9IEF1dG9maWxsVmFsdWUuZm9yRGF0ZShpbnB1dERhdGUpOworICAgICAgICBMb2cudihUQUcsICJJbnB1dCBkYXRlOiAiICsgaW5wdXREYXRlICsgIiA+PiAiICsgbmV3IERhdGUoaW5wdXREYXRlKSk7CisKKyAgICAgICAgZmluYWwgQ2FsZW5kYXIgZXhwZWN0ZWRDYWwgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOworICAgICAgICBleHBlY3RlZENhbC5jbGVhcigpOyAvLyBXZSBqdXN0IGNhcmUgZm9yIHllYXIgYW5kIG1vbnRoLi4uCisgICAgICAgIGV4cGVjdGVkQ2FsLnNldChDYWxlbmRhci5ZRUFSLCAyMDEyKTsKKyAgICAgICAgZXhwZWN0ZWRDYWwuc2V0KENhbGVuZGFyLk1PTlRILCBDYWxlbmRhci5ERUNFTUJFUik7CisgICAgICAgIGZpbmFsIGxvbmcgZXhwZWN0ZWREYXRlID0gZXhwZWN0ZWRDYWwuZ2V0VGltZUluTWlsbGlzKCk7CisgICAgICAgIGZpbmFsIEF1dG9maWxsVmFsdWUgZXhwZWN0ZWRWYWx1ZSA9IEF1dG9maWxsVmFsdWUuZm9yRGF0ZShleHBlY3RlZERhdGUpOworICAgICAgICBMb2cudihUQUcsICJFeGVjdGVkIGRhdGU6ICIgKyBleHBlY3RlZERhdGUgKyAiID4+ICIgKyBuZXcgRGF0ZShleHBlY3RlZERhdGUpKTsKKworICAgICAgICBmaW5hbCBEYXRlVmFsdWVTYW5pdGl6ZXIgc2FuaXRpemVyID0gbmV3IERhdGVWYWx1ZVNhbml0aXplcigKKyAgICAgICAgICAgICAgICBtRGF0ZUZvcm1hdCk7CisgICAgICAgIGZpbmFsIEF1dG9maWxsVmFsdWUgc2FuaXRpemVkVmFsdWUgPSBzYW5pdGl6ZXIuc2FuaXRpemUoaW5wdXRWYWx1ZSk7CisgICAgICAgIGZpbmFsIGxvbmcgc2FuaXRpemVkRGF0ZSA9IHNhbml0aXplZFZhbHVlLmdldERhdGVWYWx1ZSgpOworICAgICAgICBMb2cudihUQUcsICJTYW5pdGl6ZWQgZGF0ZTogIiArIHNhbml0aXplZERhdGUgKyAiID4+ICIgKyBuZXcgRGF0ZShzYW5pdGl6ZWREYXRlKSk7CisgICAgICAgIGFzc2VydFRoYXQoc2FuaXRpemVkRGF0ZSkuaXNFcXVhbFRvKGV4cGVjdGVkRGF0ZSk7CisgICAgICAgIGFzc2VydFRoYXQoc2FuaXRpemVkVmFsdWUpLmlzRXF1YWxUbyhleHBlY3RlZFZhbHVlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9EaWFsb2dMYXVuY2hlckFjdGl2aXR5LmphdmEgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9EaWFsb2dMYXVuY2hlckFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQzNmI3MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0RpYWxvZ0xhdW5jaGVyQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLnRydXRoLlRydXRoLmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLnRydXRoLlRydXRoLmFzc2VydFdpdGhNZXNzYWdlOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2c7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuRGlzcGxheTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRWRpdFRleHQ7CisKKy8qKgorICogQWN0aXZpdHkgdGhhdCBoYXMgYnV0dG9ucyB0byBsYXVuY2ggZGlhbG9ncyB0aGF0IHNob3VsZCB0aGVuIGJlIGF1dG9maWxsYWJsZS4KKyAqLworcHVibGljIGNsYXNzIERpYWxvZ0xhdW5jaGVyQWN0aXZpdHkgZXh0ZW5kcyBBYnN0cmFjdEF1dG9GaWxsQWN0aXZpdHkgeworCisgICAgcHJpdmF0ZSBGaWxsRXhwZWN0YXRpb24gbUV4cGVjdGF0aW9uOworICAgIHByaXZhdGUgTG9naW5EaWFsb2cgbURpYWxvZzsKKyAgICBCdXR0b24gbUxhdW5jaEJ1dHRvbjsKKworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmRpYWxvZ19sYXVuY2hlcl9hY3Rpdml0eSk7CisgICAgICAgIG1MYXVuY2hCdXR0b24gPSBmaW5kVmlld0J5SWQoUi5pZC5sYXVuY2hfYnV0dG9uKTsKKyAgICAgICAgbURpYWxvZyA9IG5ldyBMb2dpbkRpYWxvZyh0aGlzKTsKKyAgICAgICAgbUxhdW5jaEJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIoKHYpIC0+IG1EaWFsb2cuc2hvdygpKTsKKyAgICB9CisKKyAgICB2b2lkIG9uVXNlcm5hbWUoVmlzaXRvcjxFZGl0VGV4dD4gdikgeworICAgICAgICBzeW5jUnVuT25VaVRocmVhZCgoKSAtPiB2LnZpc2l0KG1EaWFsb2cubVVzZXJuYW1lRWRpdFRleHQpKTsKKyAgICB9CisKKyAgICB2b2lkIGxhdW5jaERpYWxvZyhVaUJvdCB1aUJvdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN5bmNSdW5PblVpVGhyZWFkKCgpIC0+IG1MYXVuY2hCdXR0b24ucGVyZm9ybUNsaWNrKCkpOworICAgICAgICAvLyBUT0RPOiBzaG91bGQgYXNzZXJ0IGJ5IGlkLCBidXQgaXQncyBub3Qgd29ya2luZworICAgICAgICB1aUJvdC5hc3NlcnRTaG93bkJ5VGV4dCgiVXNlcm5hbWUiKTsKKyAgICB9CisKKyAgICB2b2lkIGFzc2VydEluRGlhbG9nQm91bmRzKFJlY3QgcmVjdCkgeworICAgICAgICBmaW5hbCBpbnRbXSBsb2NhdGlvbiA9IG5ldyBpbnRbMl07CisgICAgICAgIGZpbmFsIFZpZXcgdmlldyA9IG1EaWFsb2cuZ2V0V2luZG93KCkuZ2V0RGVjb3JWaWV3KCk7CisgICAgICAgIHZpZXcuZ2V0TG9jYXRpb25PblNjcmVlbihsb2NhdGlvbik7CisgICAgICAgIGFzc2VydFRoYXQobG9jYXRpb25bMF0pLmlzQXRNb3N0KHJlY3QubGVmdCk7CisgICAgICAgIGFzc2VydFRoYXQocmVjdC5yaWdodCkuaXNBdE1vc3QobG9jYXRpb25bMF0gKyB2aWV3LmdldFdpZHRoKCkpOworICAgICAgICBhc3NlcnRUaGF0KGxvY2F0aW9uWzFdKS5pc0F0TW9zdChyZWN0LnRvcCk7CisgICAgICAgIGFzc2VydFRoYXQocmVjdC5ib3R0b20pLmlzQXRNb3N0KGxvY2F0aW9uWzFdICsgdmlldy5nZXRIZWlnaHQoKSk7CisgICAgfQorCisgICAgdm9pZCBtYXhpbWl6ZURpYWxvZygpIHsKKyAgICAgICAgZmluYWwgV2luZG93TWFuYWdlciB3bSA9IGdldFdpbmRvd01hbmFnZXIoKTsKKyAgICAgICAgZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gd20uZ2V0RGVmYXVsdERpc3BsYXkoKTsKKyAgICAgICAgZmluYWwgRGlzcGxheU1ldHJpY3MgbWV0cmljcyA9IG5ldyBEaXNwbGF5TWV0cmljcygpOworICAgICAgICBkaXNwbGF5LmdldE1ldHJpY3MobWV0cmljcyk7CisgICAgICAgIHN5bmNSdW5PblVpVGhyZWFkKAorICAgICAgICAgICAgICAgICgpIC0+IG1EaWFsb2cuZ2V0V2luZG93KCkuc2V0TGF5b3V0KG1ldHJpY3Mud2lkdGhQaXhlbHMsIG1ldHJpY3MuaGVpZ2h0UGl4ZWxzKSk7CisgICAgfQorCisgICAgdm9pZCBleHBlY3RBdXRvZmlsbChTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBwYXNzd29yZCkgeworICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgibXVzdCBjYWxsIGxhdW5jaERpYWxvZyBmaXJzdCIpLnRoYXQobURpYWxvZy5tVXNlcm5hbWVFZGl0VGV4dCkKKyAgICAgICAgICAgICAgICAuaXNOb3ROdWxsKCk7CisgICAgICAgIG1FeHBlY3RhdGlvbiA9IG5ldyBGaWxsRXhwZWN0YXRpb24odXNlcm5hbWUsIHBhc3N3b3JkKTsKKyAgICAgICAgbURpYWxvZy5tVXNlcm5hbWVFZGl0VGV4dC5hZGRUZXh0Q2hhbmdlZExpc3RlbmVyKG1FeHBlY3RhdGlvbi5tQ2NVc2VybmFtZVdhdGNoZXIpOworICAgICAgICBtRGlhbG9nLm1QYXNzd29yZEVkaXRUZXh0LmFkZFRleHRDaGFuZ2VkTGlzdGVuZXIobUV4cGVjdGF0aW9uLm1DY1Bhc3N3b3JkV2F0Y2hlcik7CisgICAgfQorCisgICAgdm9pZCBhc3NlcnRBdXRvZmlsbGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJleHBlY3RBdXRvRmlsbCgpIG5vdCBjYWxsZWQiKS50aGF0KG1FeHBlY3RhdGlvbikuaXNOb3ROdWxsKCk7CisgICAgICAgIGlmIChtRXhwZWN0YXRpb24ubUNjVXNlcm5hbWVXYXRjaGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1FeHBlY3RhdGlvbi5tQ2NVc2VybmFtZVdhdGNoZXIuYXNzZXJ0QXV0b0ZpbGxlZCgpOworICAgICAgICB9CisgICAgICAgIGlmIChtRXhwZWN0YXRpb24ubUNjUGFzc3dvcmRXYXRjaGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1FeHBlY3RhdGlvbi5tQ2NQYXNzd29yZFdhdGNoZXIuYXNzZXJ0QXV0b0ZpbGxlZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBGaWxsRXhwZWN0YXRpb24geworICAgICAgICBwcml2YXRlIGZpbmFsIE9uZVRpbWVUZXh0V2F0Y2hlciBtQ2NVc2VybmFtZVdhdGNoZXI7CisgICAgICAgIHByaXZhdGUgZmluYWwgT25lVGltZVRleHRXYXRjaGVyIG1DY1Bhc3N3b3JkV2F0Y2hlcjsKKworICAgICAgICBwcml2YXRlIEZpbGxFeHBlY3RhdGlvbihTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBwYXNzd29yZCkgeworICAgICAgICAgICAgbUNjVXNlcm5hbWVXYXRjaGVyID0gdXNlcm5hbWUgPT0gbnVsbCA/IG51bGwKKyAgICAgICAgICAgICAgICAgICAgOiBuZXcgT25lVGltZVRleHRXYXRjaGVyKCJ1c2VybmFtZSIsIG1EaWFsb2cubVVzZXJuYW1lRWRpdFRleHQsIHVzZXJuYW1lKTsKKyAgICAgICAgICAgIG1DY1Bhc3N3b3JkV2F0Y2hlciA9IHBhc3N3b3JkID09IG51bGwgPyBudWxsCisgICAgICAgICAgICAgICAgICAgIDogbmV3IE9uZVRpbWVUZXh0V2F0Y2hlcigicGFzc3dvcmQiLCBtRGlhbG9nLm1QYXNzd29yZEVkaXRUZXh0LCBwYXNzd29yZCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIEZpbGxFeHBlY3RhdGlvbihTdHJpbmcgdXNlcm5hbWUpIHsKKyAgICAgICAgICAgIHRoaXModXNlcm5hbWUsIG51bGwpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGNsYXNzIExvZ2luRGlhbG9nIGV4dGVuZHMgQWxlcnREaWFsb2cgeworCisgICAgICAgIHByaXZhdGUgRWRpdFRleHQgbVVzZXJuYW1lRWRpdFRleHQ7CisgICAgICAgIHByaXZhdGUgRWRpdFRleHQgbVBhc3N3b3JkRWRpdFRleHQ7CisKKyAgICAgICAgcHVibGljIExvZ2luRGlhbG9nKENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQubG9naW5fYWN0aXZpdHkpOworICAgICAgICAgICAgbVVzZXJuYW1lRWRpdFRleHQgPSBmaW5kVmlld0J5SWQoUi5pZC51c2VybmFtZSk7CisgICAgICAgICAgICBtUGFzc3dvcmRFZGl0VGV4dCA9IGZpbmRWaWV3QnlJZChSLmlkLnBhc3N3b3JkKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0RpYWxvZ0xhdW5jaGVyQWN0aXZpdHlUZXN0LmphdmEgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9EaWFsb2dMYXVuY2hlckFjdGl2aXR5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlOWZjZjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9EaWFsb2dMYXVuY2hlckFjdGl2aXR5VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTIwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHM7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5JRF9VU0VSTkFNRTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5hc3NlcnRUZXh0SXNTYW5pdGl6ZWQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5TaW1wbGVTYXZlQWN0aXZpdHkuSURfUEFTU1dPUkQ7CisKK2ltcG9ydCBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuQ2FubmVkRmlsbFJlc3BvbnNlLkNhbm5lZERhdGFzZXQ7CitpbXBvcnQgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkluc3RydW1lbnRlZEF1dG9GaWxsU2VydmljZS5GaWxsUmVxdWVzdDsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC51aWF1dG9tYXRvci5VaU9iamVjdDI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitwdWJsaWMgY2xhc3MgRGlhbG9nTGF1bmNoZXJBY3Rpdml0eVRlc3QgZXh0ZW5kcyBBdXRvRmlsbFNlcnZpY2VUZXN0Q2FzZSB7CisKKyAgICBAUnVsZQorICAgIHB1YmxpYyBmaW5hbCBBdXRvZmlsbEFjdGl2aXR5VGVzdFJ1bGU8RGlhbG9nTGF1bmNoZXJBY3Rpdml0eT4gbUFjdGl2aXR5UnVsZSA9CisgICAgICAgICAgICBuZXcgQXV0b2ZpbGxBY3Rpdml0eVRlc3RSdWxlPERpYWxvZ0xhdW5jaGVyQWN0aXZpdHk+KERpYWxvZ0xhdW5jaGVyQWN0aXZpdHkuY2xhc3MpOworCisgICAgcHJpdmF0ZSBEaWFsb2dMYXVuY2hlckFjdGl2aXR5IG1BY3Rpdml0eTsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRBY3Rpdml0eSgpIHsKKyAgICAgICAgbUFjdGl2aXR5ID0gbUFjdGl2aXR5UnVsZS5nZXRBY3Rpdml0eSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEF1dG9maWxsX25vRGF0YXNldHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXV0b2ZpbGxOb0RhdGFzZXRzVGVzdChmYWxzZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0b2ZpbGxfbm9EYXRhc2V0c19hZnRlclJlc2l6aW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGF1dG9maWxsTm9EYXRhc2V0c1Rlc3QodHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGF1dG9maWxsTm9EYXRhc2V0c1Rlc3QoYm9vbGVhbiByZXNpemUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBlbmFibGVTZXJ2aWNlKCk7CisgICAgICAgIG1BY3Rpdml0eS5sYXVuY2hEaWFsb2cobVVpQm90KTsKKworICAgICAgICBpZiAocmVzaXplKSB7CisgICAgICAgICAgICBtQWN0aXZpdHkubWF4aW1pemVEaWFsb2coKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNldCBleHBlY3RhdGlvbnMuCisgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKENhbm5lZEZpbGxSZXNwb25zZS5OT19SRVNQT05TRSk7CisKKyAgICAgICAgLy8gVHJpZ2dlciBhdXRvZmlsbC4KKyAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoVmlldzo6cmVxdWVzdEZvY3VzKTsKKyAgICAgICAgZmluYWwgRmlsbFJlcXVlc3QgZmlsbFJlcXVlc3QgPSBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKKworICAgICAgICAvLyBBc3NlcnRzIHJlc3VsdHMuCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtVWlCb3QuYXNzZXJ0Tm9EYXRhc2V0c0V2ZXIoKTsKKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBub2RlcyB3ZXJlIHByb3Blcmx5IGdlbmVyYXRlZC4KKyAgICAgICAgICAgIGFzc2VydFRleHRJc1Nhbml0aXplZChmaWxsUmVxdWVzdC5zdHJ1Y3R1cmUsIElEX1VTRVJOQU1FKTsKKyAgICAgICAgICAgIGFzc2VydFRleHRJc1Nhbml0aXplZChmaWxsUmVxdWVzdC5zdHJ1Y3R1cmUsIElEX1BBU1NXT1JEKTsKKyAgICAgICAgfSBjYXRjaCAoQXNzZXJ0aW9uRXJyb3IgZSkgeworICAgICAgICAgICAgSGVscGVyLmR1bXBTdHJ1Y3R1cmUoIkQnT0ghIiwgZmlsbFJlcXVlc3Quc3RydWN0dXJlKTsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvZmlsbF9vbmVEYXRhc2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGF1dG9maWxsT25lRGF0YXNldFRlc3QoZmFsc2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEF1dG9maWxsX29uZURhdGFzZXRfYWZ0ZXJSZXNpemluZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhdXRvZmlsbE9uZURhdGFzZXRUZXN0KHRydWUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhdXRvZmlsbE9uZURhdGFzZXRUZXN0KGJvb2xlYW4gcmVzaXplKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZW5hYmxlU2VydmljZSgpOworICAgICAgICBtQWN0aXZpdHkubGF1bmNoRGlhbG9nKG1VaUJvdCk7CisKKyAgICAgICAgaWYgKHJlc2l6ZSkgeworICAgICAgICAgICAgbUFjdGl2aXR5Lm1heGltaXplRGlhbG9nKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTZXQgZXhwZWN0YXRpb25zLgorICAgICAgICBtQWN0aXZpdHkuZXhwZWN0QXV0b2ZpbGwoImR1ZGUiLCAic3dlZXQiKTsKKyAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UobmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1VTRVJOQU1FLCAiZHVkZSIpCisgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1BBU1NXT1JELCAic3dlZXQiKQorICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJUaGUgRHVkZSIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAvLyBUcmlnZ2VyIGF1dG9maWxsLgorICAgICAgICBtQWN0aXZpdHkub25Vc2VybmFtZShWaWV3OjpyZXF1ZXN0Rm9jdXMpOworICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKKworICAgICAgICBmaW5hbCBVaU9iamVjdDIgcGlja2VyID0gbVVpQm90LmFzc2VydERhdGFzZXRzKCJUaGUgRHVkZSIpOworICAgICAgICBpZiAoIUhlbHBlci5pc0F1dG9maWxsV2luZG93RnVsbFNjcmVlbihtQWN0aXZpdHkpKSB7CisgICAgICAgICAgICBtQWN0aXZpdHkuYXNzZXJ0SW5EaWFsb2dCb3VuZHMocGlja2VyLmdldFZpc2libGVCb3VuZHMoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBBc3NlcnRzIHJlc3VsdHMuCisgICAgICAgIG1VaUJvdC5zZWxlY3REYXRhc2V0KCJUaGUgRHVkZSIpOworICAgICAgICBtQWN0aXZpdHkuYXNzZXJ0QXV0b2ZpbGxlZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0Rpc2FibGVBdXRvZmlsbFRlc3QuamF2YSBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0Rpc2FibGVBdXRvZmlsbFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjRkZTE1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvRGlzYWJsZUF1dG9maWxsVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHM7CisKK2ltcG9ydCBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuQ2FubmVkRmlsbFJlc3BvbnNlLkNhbm5lZERhdGFzZXQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKK2ltcG9ydCBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuRmlsbFJlc3BvbnNlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBUZXN0cyBmb3IgdGhlIHtAbGluayBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuRmlsbFJlc3BvbnNlLkJ1aWxkZXIjZGlzYWJsZUF1dG9maWxsKGxvbmcpfSBBUEkuCisgKi8KK3B1YmxpYyBjbGFzcyBEaXNhYmxlQXV0b2ZpbGxUZXN0IGV4dGVuZHMgQXV0b0ZpbGxTZXJ2aWNlVGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJEaXNhYmxlQXV0b2ZpbGxUZXN0IjsKKworICAgIHByaXZhdGUgU2ltcGxlU2F2ZUFjdGl2aXR5IHN0YXJ0U2ltcGxlU2F2ZUFjdGl2aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KG1Db250ZXh0LCBTaW1wbGVTYXZlQWN0aXZpdHkuY2xhc3MpCisgICAgICAgICAgICAgICAgLnNldEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLKTsKKyAgICAgICAgbUNvbnRleHQuc3RhcnRBY3Rpdml0eShpbnRlbnQpOworICAgICAgICBtVWlCb3QuYXNzZXJ0U2hvd25CeVJlbGF0aXZlSWQoU2ltcGxlU2F2ZUFjdGl2aXR5LklEX0xBQkVMKTsKKyAgICAgICAgcmV0dXJuIFNpbXBsZVNhdmVBY3Rpdml0eS5nZXRJbnN0YW5jZSgpOworICAgIH0KKworICAgIHByaXZhdGUgUHJlU2ltcGxlU2F2ZUFjdGl2aXR5IHN0YXJ0UHJlU2ltcGxlU2F2ZUFjdGl2aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KG1Db250ZXh0LCBQcmVTaW1wbGVTYXZlQWN0aXZpdHkuY2xhc3MpCisgICAgICAgICAgICAgICAgLnNldEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLKTsKKyAgICAgICAgbUNvbnRleHQuc3RhcnRBY3Rpdml0eShpbnRlbnQpOworICAgICAgICBtVWlCb3QuYXNzZXJ0U2hvd25CeVJlbGF0aXZlSWQoUHJlU2ltcGxlU2F2ZUFjdGl2aXR5LklEX1BSRV9MQUJFTCk7CisgICAgICAgIHJldHVybiBQcmVTaW1wbGVTYXZlQWN0aXZpdHkuZ2V0SW5zdGFuY2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZpbmVzIHdoYXQgdG8gZG8gYWZ0ZXIgdGhlIGFjdGl2aXR5IGJlaW5nIHRlc3RlZCBpcyBsYXVuY2hlZC4KKyAgICAgKi8KKyAgICBlbnVtIFBvc3RMYXVuY2hBY3Rpb24geworICAgICAgICAvKioKKyAgICAgICAgICogVXNlZCB3aGVuIHRoZSBzZXJ2aWNlIGRpc2FibGVzIGF1dG9maWxsIGluIHRoZSBmaWxsIHJlc3BvbnNlIGZvciB0aGlzIGFjdGl2dHkuIEFzIHN1Y2g6CisgICAgICAgICAqCisgICAgICAgICAqIDxvbD4KKyAgICAgICAgICogICA8bGk+VGhlcmUgc2hvdWxkIGJlIGEgZmlsbCByZXF1ZXN0IG9uIHtAY29kZSBzUmVwbGllcn0uCisgICAgICAgICAqICAgPGxpPlRoZSBmaXJzdCBVSSBmb2N1cyBzaG91bGQgZ2VuZXJhdGUgYQorICAgICAgICAgKiAgIHtAbGluayBhbmRyb2lkLnZpZXcuYXV0b2ZpbGwuQXV0b2ZpbGxNYW5hZ2VyLkF1dG9maWxsQ2FsbGJhY2sjRVZFTlRfSU5QVVRfVU5BVkFJTEFCTEV9CisgICAgICAgICAqICAgZXZlbnQuCisgICAgICAgICAqICAgPGxpPlN1YnNlcXVlbnQgVUkgZm9jdXMgc2hvdWxkIG5vdCB0cmlnZ2VyIGV2ZW50cy4KKyAgICAgICAgICogPC9vbD4KKyAgICAgICAgICovCisgICAgICAgIEFTU0VSVF9ESVNBQkxJTkcsCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFVzZWQgd2hlbiB0aGUgc2VydmljZSBhbHJlYWR5IGRpc2FibGVkIGF1dG9maWxsIHByaW9yIHRvIGxhdW5jaGluZyBhY3RpdnR5LiBBcyBzdWNoOgorICAgICAgICAgKgorICAgICAgICAgKiA8b2w+CisgICAgICAgICAqICAgPGxpPlRoZXJlIHNob3VsZCBiZSBubyBmaWxsIHJlcXVlc3Qgb24ge0Bjb2RlIHNSZXBsaWVyfS4KKyAgICAgICAgICogICA8bGk+VGhlcmUgc2hvdWxkIGJlIG5vIGNhbGxiYWNrIGNhbGxzIHdoZW4gVUkgaXMgZm9jdXNlZAorICAgICAgICAgKiA8L29sPgorICAgICAgICAgKi8KKyAgICAgICAgQVNTRVJUX0RJU0FCTEVELAorCisgICAgICAgIC8qKgorICAgICAgICAgKiBVc2VkIHdoZW4gYXV0b2ZpbGwgaXMgZW5hYmxlZCwgc28gaXQgdHJpZXMgdG8gYXV0b2ZpbGwgdGhlIGFjdGl2aXR5LgorICAgICAgICAgKi8KKyAgICAgICAgQVNTRVJUX0VOQUJMRURfQU5EX0FVVE9GSUxMCisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGxhdW5jaFNpbXBsZVNhdmVBY3Rpdml0eShQb3N0TGF1bmNoQWN0aW9uIGFjdGlvbikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIExvZy52KFRBRywgImxhdW5jaFByZVNpbXBsZVNhdmVBY3Rpdml0eSgpOiAiICsgYWN0aW9uKTsKKyAgICAgICAgc1JlcGxpZXIuYXNzZXJ0Tm9VbmhhbmRsZWRGaWxsUmVxdWVzdHMoKTsKKworICAgICAgICBpZiAoYWN0aW9uID09IFBvc3RMYXVuY2hBY3Rpb24uQVNTRVJUX0VOQUJMRURfQU5EX0FVVE9GSUxMKSB7CisgICAgICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAuYWRkRGF0YXNldChuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoU2ltcGxlU2F2ZUFjdGl2aXR5LklEX0lOUFVULCAiaWQiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChTaW1wbGVTYXZlQWN0aXZpdHkuSURfUEFTU1dPUkQsICJwYXNzIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiWU8iKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBTaW1wbGVTYXZlQWN0aXZpdHkgYWN0aXZpdHkgPSBzdGFydFNpbXBsZVNhdmVBY3Rpdml0eSgpOworICAgICAgICBmaW5hbCBNeUF1dG9maWxsQ2FsbGJhY2sgY2FsbGJhY2sgPSBhY3Rpdml0eS5yZWdpc3RlckNhbGxiYWNrKCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIFRyaWdnZXIgYXV0b2ZpbGwKKyAgICAgICAgICAgIGFjdGl2aXR5LnN5bmNSdW5PblVpVGhyZWFkKCgpIC0+IGFjdGl2aXR5Lm1JbnB1dC5yZXF1ZXN0Rm9jdXMoKSk7CisKKyAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gUG9zdExhdW5jaEFjdGlvbi5BU1NFUlRfRElTQUJMSU5HKSB7CisgICAgICAgICAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlVbmF2YWlsYWJsZUV2ZW50KGFjdGl2aXR5Lm1JbnB1dCk7CisgICAgICAgICAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CisKKyAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgb3RoZXIgZmllbGRzIGFyZSBub3QgdHJpZ2dlcmVkLgorICAgICAgICAgICAgICAgIGFjdGl2aXR5LnN5bmNSdW5PblVpVGhyZWFkKCgpIC0+IGFjdGl2aXR5Lm1QYXNzd29yZC5yZXF1ZXN0Rm9jdXMoKSk7CisgICAgICAgICAgICAgICAgY2FsbGJhY2suYXNzZXJ0Tm90Q2FsbGVkKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PSBQb3N0TGF1bmNoQWN0aW9uLkFTU0VSVF9ESVNBQkxFRCkgeworICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBmb3JjZWQgcmVxdWVzdHMgYXJlIGlnbm9yZWQgYXMgd2VsbC4KKyAgICAgICAgICAgICAgICBhY3Rpdml0eS5nZXRBdXRvZmlsbE1hbmFnZXIoKS5yZXF1ZXN0QXV0b2ZpbGwoYWN0aXZpdHkubUlucHV0KTsKKyAgICAgICAgICAgICAgICBjYWxsYmFjay5hc3NlcnROb3RDYWxsZWQoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uID09IFBvc3RMYXVuY2hBY3Rpb24uQVNTRVJUX0VOQUJMRURfQU5EX0FVVE9GSUxMKSB7CisgICAgICAgICAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlTaG93bkV2ZW50KGFjdGl2aXR5Lm1JbnB1dCk7CisgICAgICAgICAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CisgICAgICAgICAgICAgICAgZmluYWwgU2ltcGxlU2F2ZUFjdGl2aXR5LkZpbGxFeHBlY3RhdGlvbiBhdXRvZmlsbEV4cGVjdGF0aW9uID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5LmV4cGVjdEF1dG9GaWxsKCJpZCIsICJwYXNzIik7CisgICAgICAgICAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQoIllPIik7CisgICAgICAgICAgICAgICAgYXV0b2ZpbGxFeHBlY3RhdGlvbi5hc3NlcnRBdXRvRmlsbGVkKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEFzc2VydHMgaXNFbmFibGVkKCkgc3RhdHVzLgorICAgICAgICAgICAgYXNzZXJ0QXV0b2ZpbGxFbmFibGVkKGFjdGl2aXR5LCBhY3Rpb24gPT0gUG9zdExhdW5jaEFjdGlvbi5BU1NFUlRfRU5BQkxFRF9BTkRfQVVUT0ZJTEwpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgYWN0aXZpdHkuZmluaXNoKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbGF1bmNoUHJlU2ltcGxlU2F2ZUFjdGl2aXR5KFBvc3RMYXVuY2hBY3Rpb24gYWN0aW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTG9nLnYoVEFHLCAibGF1bmNoUHJlU2ltcGxlU2F2ZUFjdGl2aXR5KCk6ICIgKyBhY3Rpb24pOworICAgICAgICBzUmVwbGllci5hc3NlcnROb1VuaGFuZGxlZEZpbGxSZXF1ZXN0cygpOworCisgICAgICAgIGlmIChhY3Rpb24gPT0gUG9zdExhdW5jaEFjdGlvbi5BU1NFUlRfRU5BQkxFRF9BTkRfQVVUT0ZJTEwpIHsKKyAgICAgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgIC5hZGREYXRhc2V0KG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChQcmVTaW1wbGVTYXZlQWN0aXZpdHkuSURfUFJFX0lOUFVULCAieW8iKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJZTyIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBQcmVTaW1wbGVTYXZlQWN0aXZpdHkgYWN0aXZpdHkgPSBzdGFydFByZVNpbXBsZVNhdmVBY3Rpdml0eSgpOworICAgICAgICBmaW5hbCBNeUF1dG9maWxsQ2FsbGJhY2sgY2FsbGJhY2sgPSBhY3Rpdml0eS5yZWdpc3RlckNhbGxiYWNrKCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIFRyaWdnZXIgYXV0b2ZpbGwKKyAgICAgICAgICAgIGFjdGl2aXR5LnN5bmNSdW5PblVpVGhyZWFkKCgpIC0+IGFjdGl2aXR5Lm1QcmVJbnB1dC5yZXF1ZXN0Rm9jdXMoKSk7CisKKyAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gUG9zdExhdW5jaEFjdGlvbi5BU1NFUlRfRElTQUJMSU5HKSB7CisgICAgICAgICAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlVbmF2YWlsYWJsZUV2ZW50KGFjdGl2aXR5Lm1QcmVJbnB1dCk7CisgICAgICAgICAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PSBQb3N0TGF1bmNoQWN0aW9uLkFTU0VSVF9ESVNBQkxFRCkgeworICAgICAgICAgICAgICAgIGFjdGl2aXR5LmdldEF1dG9maWxsTWFuYWdlcigpLnJlcXVlc3RBdXRvZmlsbChhY3Rpdml0eS5tUHJlSW5wdXQpOworICAgICAgICAgICAgICAgIGNhbGxiYWNrLmFzc2VydE5vdENhbGxlZCgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24gPT0gUG9zdExhdW5jaEFjdGlvbi5BU1NFUlRfRU5BQkxFRF9BTkRfQVVUT0ZJTEwpIHsKKyAgICAgICAgICAgICAgICBjYWxsYmFjay5hc3NlcnRVaVNob3duRXZlbnQoYWN0aXZpdHkubVByZUlucHV0KTsKKyAgICAgICAgICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBQcmVTaW1wbGVTYXZlQWN0aXZpdHkuRmlsbEV4cGVjdGF0aW9uIGF1dG9maWxsRXhwZWN0YXRpb24gPQorICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHkuZXhwZWN0QXV0b0ZpbGwoInlvIik7CisgICAgICAgICAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQoIllPIik7CisgICAgICAgICAgICAgICAgYXV0b2ZpbGxFeHBlY3RhdGlvbi5hc3NlcnRBdXRvRmlsbGVkKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEFzc2VydHMgaXNFbmFibGVkKCkgc3RhdHVzLgorICAgICAgICAgICAgYXNzZXJ0QXV0b2ZpbGxFbmFibGVkKGFjdGl2aXR5LCBhY3Rpb24gPT0gUG9zdExhdW5jaEFjdGlvbi5BU1NFUlRfRU5BQkxFRF9BTkRfQVVUT0ZJTEwpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgYWN0aXZpdHkuZmluaXNoKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REaXNhYmxlQXBwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFNldCBzZXJ2aWNlLgorICAgICAgICBlbmFibGVTZXJ2aWNlKCk7CisKKyAgICAgICAgLy8gU2V0IGV4cGVjdGF0aW9ucy4KKyAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UoCisgICAgICAgICAgICAgICAgbmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkuZGlzYWJsZUF1dG9maWxsKExvbmcuTUFYX1ZBTFVFKS5idWlsZCgpKTsKKworICAgICAgICAvLyBUcmlnZ2VyIGF1dG9maWxsIGZvciB0aGUgZmlyc3QgdGltZS4KKyAgICAgICAgbGF1bmNoU2ltcGxlU2F2ZUFjdGl2aXR5KFBvc3RMYXVuY2hBY3Rpb24uQVNTRVJUX0RJU0FCTElORyk7CisKKyAgICAgICAgLy8gTGF1bmNoIGFjdGl2aXR5IGFnYWluLgorICAgICAgICBsYXVuY2hTaW1wbGVTYXZlQWN0aXZpdHkoUG9zdExhdW5jaEFjdGlvbi5BU1NFUlRfRElTQUJMRUQpOworCisgICAgICAgIC8vIE5vdyB0cnkgaXQgdXNpbmcgYSBkaWZmZXJlbnQgYWN0aXZpdHkgLSBzaG91bGQgYmUgZGlzYWJsZWQgdG9vLgorICAgICAgICBsYXVuY2hQcmVTaW1wbGVTYXZlQWN0aXZpdHkoUG9zdExhdW5jaEFjdGlvbi5BU1NFUlRfRElTQUJMRUQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgQEFwcE1vZGVGdWxsIC8vIHRlc3REaXNhYmxlQXBwKCkgaXMgZW5vdWdoIHRvIHRlc3QgZXBoZW1lcmFsIGFwcHMgc3VwcG9ydAorICAgIHB1YmxpYyB2b2lkIHRlc3REaXNhYmxlQXBwVGhlbldhaXRUb1JlZW5hYmxlSXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gU2V0IHNlcnZpY2UuCisgICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKKworICAgICAgICAvLyBOZWVkIHRvIHdhaXQgdGhlIGVxdWl2YWxlbnQgb2YgbGF1bmNoaW5nIDIgYWN0aXZpdGllcywgcGx1cyBzb21lIGV4dHJhIGxlZ2dpbmcgcm9vbQorICAgICAgICBmaW5hbCBsb25nIGR1cmF0aW9uID0gMiAqIFRpbWVvdXRzLkFDVElWSVRZX1JFU1VSUkVDVElPTi5tcygpICsgNTAwOworCisgICAgICAgIC8vIFNldCBleHBlY3RhdGlvbnMuCisgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpLmRpc2FibGVBdXRvZmlsbChkdXJhdGlvbikuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gVHJpZ2dlciBhdXRvZmlsbCBmb3IgdGhlIGZpcnN0IHRpbWUuCisgICAgICAgIGxhdW5jaFNpbXBsZVNhdmVBY3Rpdml0eShQb3N0TGF1bmNoQWN0aW9uLkFTU0VSVF9ESVNBQkxJTkcpOworCisgICAgICAgIC8vIExhdW5jaCBhY3Rpdml0eSBhZ2Fpbi4KKyAgICAgICAgbGF1bmNoU2ltcGxlU2F2ZUFjdGl2aXR5KFBvc3RMYXVuY2hBY3Rpb24uQVNTRVJUX0RJU0FCTEVEKTsKKworICAgICAgICAvLyBXYWl0IGZvciB0aGUgdGltZW91dCwgdGhlbiB0cnkgYWdhaW4sIGF1dG9maWxsaW5nIGl0IHRoaXMgdGltZS4KKyAgICAgICAgU3lzdGVtQ2xvY2suc2xlZXAoZHVyYXRpb24gKyAxKTsKKyAgICAgICAgbGF1bmNoU2ltcGxlU2F2ZUFjdGl2aXR5KFBvc3RMYXVuY2hBY3Rpb24uQVNTRVJUX0VOQUJMRURfQU5EX0FVVE9GSUxMKTsKKworICAgICAgICAvLyBBbHNvIHRyeSBpdCBvbiBhbm90aGVyIGFjdGl2aXR5LgorICAgICAgICBsYXVuY2hQcmVTaW1wbGVTYXZlQWN0aXZpdHkoUG9zdExhdW5jaEFjdGlvbi5BU1NFUlRfRU5BQkxFRF9BTkRfQVVUT0ZJTEwpOworICAgIH0KKworICAgIEBUZXN0CisgICAgQEFwcE1vZGVGdWxsIC8vIHRlc3REaXNhYmxlQXBwKCkgaXMgZW5vdWdoIHRvIHRlc3QgZXBoZW1lcmFsIGFwcHMgc3VwcG9ydAorICAgIHB1YmxpYyB2b2lkIHRlc3REaXNhYmxlQXBwVGhlblJlc2V0U2VydmljZVRvUmVlbmFibGVJdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBlbmFibGVTZXJ2aWNlKCk7CisgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLmRpc2FibGVBdXRvZmlsbChMb25nLk1BWF9WQUxVRSkuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gVHJpZ2dlciBhdXRvZmlsbCBmb3IgdGhlIGZpcnN0IHRpbWUuCisgICAgICAgIGxhdW5jaFNpbXBsZVNhdmVBY3Rpdml0eShQb3N0TGF1bmNoQWN0aW9uLkFTU0VSVF9ESVNBQkxJTkcpOworICAgICAgICAvLyBMYXVuY2ggYWN0aXZpdHkgYWdhaW4uCisgICAgICAgIGxhdW5jaFNpbXBsZVNhdmVBY3Rpdml0eShQb3N0TGF1bmNoQWN0aW9uLkFTU0VSVF9ESVNBQkxFRCk7CisKKyAgICAgICAgLy8gVGhlbiAicmVzZXQiIHNlcnZpY2UgdG8gcmUtZW5hYmxlIGF1dG9maWxsLgorICAgICAgICBkaXNhYmxlU2VydmljZSgpOworICAgICAgICBlbmFibGVTZXJ2aWNlKCk7CisKKyAgICAgICAgLy8gVHJ5IGFnYWluIG9uIGFjdGl2aXR5IHRoYXQgZGlzYWJsZWQgaXQuCisgICAgICAgIGxhdW5jaFNpbXBsZVNhdmVBY3Rpdml0eShQb3N0TGF1bmNoQWN0aW9uLkFTU0VSVF9FTkFCTEVEX0FORF9BVVRPRklMTCk7CisKKyAgICAgICAgLy8gVHJ5IGFnYWluIG9uIG90aGVyIGFjdGl2aXR5LgorICAgICAgICBsYXVuY2hQcmVTaW1wbGVTYXZlQWN0aXZpdHkoUG9zdExhdW5jaEFjdGlvbi5BU1NFUlRfRU5BQkxFRF9BTkRfQVVUT0ZJTEwpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERpc2FibGVBY3Rpdml0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBTZXQgc2VydmljZS4KKyAgICAgICAgZW5hYmxlU2VydmljZSgpOworCisgICAgICAgIC8vIFNldCBleHBlY3RhdGlvbnMuCisgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLmRpc2FibGVBdXRvZmlsbChMb25nLk1BWF9WQUxVRSkKKyAgICAgICAgICAgICAgICAuc2V0RmlsbFJlc3BvbnNlRmxhZ3MoRmlsbFJlc3BvbnNlLkZMQUdfRElTQUJMRV9BQ1RJVklUWV9PTkxZKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAvLyBUcmlnZ2VyIGF1dG9maWxsIGZvciB0aGUgZmlyc3QgdGltZS4KKyAgICAgICAgbGF1bmNoU2ltcGxlU2F2ZUFjdGl2aXR5KFBvc3RMYXVuY2hBY3Rpb24uQVNTRVJUX0RJU0FCTElORyk7CisKKyAgICAgICAgLy8gTGF1bmNoIGFjdGl2aXR5IGFnYWluLgorICAgICAgICBsYXVuY2hTaW1wbGVTYXZlQWN0aXZpdHkoUG9zdExhdW5jaEFjdGlvbi5BU1NFUlRfRElTQUJMRUQpOworCisgICAgICAgIC8vIE5vdyB0cnkgaXQgdXNpbmcgYSBkaWZmZXJlbnQgYWN0aXZpdHkgLSBzaG91bGQgd29yay4KKyAgICAgICAgbGF1bmNoUHJlU2ltcGxlU2F2ZUFjdGl2aXR5KFBvc3RMYXVuY2hBY3Rpb24uQVNTRVJUX0VOQUJMRURfQU5EX0FVVE9GSUxMKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBBcHBNb2RlRnVsbCAvLyB0ZXN0RGlzYWJsZUFjdGl2aXR5KCkgaXMgZW5vdWdoIHRvIHRlc3QgZXBoZW1lcmFsIGFwcHMgc3VwcG9ydAorICAgIHB1YmxpYyB2b2lkIHRlc3REaXNhYmxlQWN0aXZpdHlUaGVuV2FpdFRvUmVlbmFibGVJdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBTZXQgc2VydmljZS4KKyAgICAgICAgZW5hYmxlU2VydmljZSgpOworCisgICAgICAgIC8vIE5lZWQgdG8gd2FpdCB0aGUgZXF1aXZhbGVudCBvZiBsYXVuY2hpbmcgMiBhY3Rpdml0aWVzLCBwbHVzIHNvbWUgZXh0cmEgbGVnZ2luZyByb29tCisgICAgICAgIGZpbmFsIGxvbmcgZHVyYXRpb24gPSAyICogVGltZW91dHMuQUNUSVZJVFlfUkVTVVJSRUNUSU9OLm1zKCkgKyA1MDA7CisKKyAgICAgICAgLy8gU2V0IGV4cGVjdGF0aW9ucy4KKyAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UobmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuZGlzYWJsZUF1dG9maWxsKGR1cmF0aW9uKQorICAgICAgICAgICAgICAgIC5zZXRGaWxsUmVzcG9uc2VGbGFncyhGaWxsUmVzcG9uc2UuRkxBR19ESVNBQkxFX0FDVElWSVRZX09OTFkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIC8vIFRyaWdnZXIgYXV0b2ZpbGwgZm9yIHRoZSBmaXJzdCB0aW1lLgorICAgICAgICBsYXVuY2hTaW1wbGVTYXZlQWN0aXZpdHkoUG9zdExhdW5jaEFjdGlvbi5BU1NFUlRfRElTQUJMSU5HKTsKKworICAgICAgICAvLyBMYXVuY2ggYWN0aXZpdHkgYWdhaW4uCisgICAgICAgIGxhdW5jaFNpbXBsZVNhdmVBY3Rpdml0eShQb3N0TGF1bmNoQWN0aW9uLkFTU0VSVF9ESVNBQkxFRCk7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIG90aGVyIGFwcCBpcyB3b3JraW5nLgorICAgICAgICBsYXVuY2hQcmVTaW1wbGVTYXZlQWN0aXZpdHkoUG9zdExhdW5jaEFjdGlvbi5BU1NFUlRfRU5BQkxFRF9BTkRfQVVUT0ZJTEwpOworCisgICAgICAgIC8vIFdhaXQgZm9yIHRoZSB0aW1lb3V0LCB0aGVuIHRyeSBhZ2FpbiwgYXV0b2ZpbGxpbmcgaXQgdGhpcyB0aW1lLgorICAgICAgICBTeXN0ZW1DbG9jay5zbGVlcChkdXJhdGlvbiArIDEpOworICAgICAgICBsYXVuY2hTaW1wbGVTYXZlQWN0aXZpdHkoUG9zdExhdW5jaEFjdGlvbi5BU1NFUlRfRU5BQkxFRF9BTkRfQVVUT0ZJTEwpOworICAgIH0KKworICAgIEBUZXN0CisgICAgQEFwcE1vZGVGdWxsIC8vIHRlc3REaXNhYmxlQWN0aXZpdHkoKSBpcyBlbm91Z2ggdG8gdGVzdCBlcGhlbWVyYWwgYXBwcyBzdXBwb3J0CisgICAgcHVibGljIHZvaWQgdGVzdERpc2FibGVBY3Rpdml0eVRoZW5SZXNldFNlcnZpY2VUb1JlZW5hYmxlSXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZW5hYmxlU2VydmljZSgpOworICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5kaXNhYmxlQXV0b2ZpbGwoTG9uZy5NQVhfVkFMVUUpCisgICAgICAgICAgICAgICAgLnNldEZpbGxSZXNwb25zZUZsYWdzKEZpbGxSZXNwb25zZS5GTEFHX0RJU0FCTEVfQUNUSVZJVFlfT05MWSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gVHJpZ2dlciBhdXRvZmlsbCBmb3IgdGhlIGZpcnN0IHRpbWUuCisgICAgICAgIGxhdW5jaFNpbXBsZVNhdmVBY3Rpdml0eShQb3N0TGF1bmNoQWN0aW9uLkFTU0VSVF9ESVNBQkxJTkcpOworICAgICAgICAvLyBMYXVuY2ggYWN0aXZpdHkgYWdhaW4uCisgICAgICAgIGxhdW5jaFNpbXBsZVNhdmVBY3Rpdml0eShQb3N0TGF1bmNoQWN0aW9uLkFTU0VSVF9ESVNBQkxFRCk7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIG90aGVyIGFwcCBpcyB3b3JraW5nLgorICAgICAgICBsYXVuY2hQcmVTaW1wbGVTYXZlQWN0aXZpdHkoUG9zdExhdW5jaEFjdGlvbi5BU1NFUlRfRU5BQkxFRF9BTkRfQVVUT0ZJTEwpOworCisgICAgICAgIC8vIFRoZW4gInJlc2V0IiBzZXJ2aWNlIHRvIHJlLWVuYWJsZSBhdXRvZmlsbC4KKyAgICAgICAgZGlzYWJsZVNlcnZpY2UoKTsKKyAgICAgICAgZW5hYmxlU2VydmljZSgpOworCisgICAgICAgIC8vIFRyeSBhZ2FpbiBvbiBhY3Rpdml0eSB0aGF0IGRpc2FibGVkIGl0LgorICAgICAgICBsYXVuY2hTaW1wbGVTYXZlQWN0aXZpdHkoUG9zdExhdW5jaEFjdGlvbi5BU1NFUlRfRU5BQkxFRF9BTkRfQVVUT0ZJTEwpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRBdXRvZmlsbEVuYWJsZWQoQWJzdHJhY3RBdXRvRmlsbEFjdGl2aXR5IGFjdGl2aXR5LCBib29sZWFuIGV4cGVjdGVkKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFRpbWVvdXRzLkFDVElWSVRZX1JFU1VSUkVDVElPTi5ydW4oCisgICAgICAgICAgICAgICAgImFzc2VydEF1dG9maWxsRW5hYmxlZCgiICsgYWN0aXZpdHkuZ2V0Q29tcG9uZW50TmFtZSgpLmZsYXR0ZW5Ub1Nob3J0U3RyaW5nKCkgKyAiKSIsCisgICAgICAgICAgICAgICAgKCkgLT4geworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWN0aXZpdHkuZ2V0QXV0b2ZpbGxNYW5hZ2VyKCkuaXNFbmFibGVkKCkgPT0gZXhwZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEJvb2xlYW4uVFJVRSA6IG51bGw7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvRGlzbWlzc1R5cGUuamF2YSBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0Rpc21pc3NUeXBlLmphdmEKaW5kZXggYWU5YjljZC4uYjJlOTM2YyAxMDA2NDQKLS0tIGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvRGlzbWlzc1R5cGUuamF2YQorKysgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9EaXNtaXNzVHlwZS5qYXZhCkBAIC0yNCw3ICsyNCw2IEBACiBlbnVtIERpc21pc3NUeXBlIHsKICAgICBCQUNLX0JVVFRPTiwKICAgICBIT01FX0JVVFRPTiwKLSAgICBSRUNFTlRTX0JVVFRPTiwKICAgICBUT1VDSF9PVVRTSURFLAogICAgIEZPQ1VTX09VVFNJREUKIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0R1cGxpY2F0ZUlkQWN0aXZpdHkuamF2YSBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0R1cGxpY2F0ZUlkQWN0aXZpdHkuamF2YQppbmRleCAzMWFjOGY3Li45MDg3MWNhIDEwMDY0NAotLS0gYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9EdXBsaWNhdGVJZEFjdGl2aXR5LmphdmEKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvRHVwbGljYXRlSWRBY3Rpdml0eS5qYXZhCkBAIC0yMCw3ICsyMCw3IEBACiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogcHVibGljIGNsYXNzIER1cGxpY2F0ZUlkQWN0aXZpdHkgZXh0ZW5kcyBBYnN0cmFjdEF1dG9GaWxsQWN0aXZpdHkgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gRHVwbGljYXRlSWRBY3Rpdml0eS5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJEdXBsaWNhdGVJZEFjdGl2aXR5IjsKIAogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFVQTElDQVRFX0lEID0gImR1cGxpY2F0ZV9pZCI7CiAKQEAgLTI4LDkgKzI4LDcgQEAKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CiAKLSAgICAgICAgaWYgKHNhdmVkSW5zdGFuY2VTdGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cuaShMT0dfVEFHLCAib25DcmVhdGUoIiArIHNhdmVkSW5zdGFuY2VTdGF0ZSArICIpIik7Ci0gICAgICAgIH0KKyAgICAgICAgTG9nLnYoVEFHLCAib25DcmVhdGUoIiArIHNhdmVkSW5zdGFuY2VTdGF0ZSArICIpIik7CiAKICAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQuZHVwbGljYXRlX2lkX2xheW91dCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvRHVwbGljYXRlSWRBY3Rpdml0eVRlc3QuamF2YSBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0R1cGxpY2F0ZUlkQWN0aXZpdHlUZXN0LmphdmEKaW5kZXggOGVlYTA5NS4uODQ2ZGNjNCAxMDA2NDQKLS0tIGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvRHVwbGljYXRlSWRBY3Rpdml0eVRlc3QuamF2YQorKysgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9EdXBsaWNhdGVJZEFjdGl2aXR5VGVzdC5qYXZhCkBAIC0xOCw5ICsxOCw3IEBACiAKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkNhbm5lZEZpbGxSZXNwb25zZS5OT19SRVNQT05TRTsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkR1cGxpY2F0ZUlkQWN0aXZpdHkuRFVQTElDQVRFX0lEOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSGVscGVyLnJ1blNoZWxsQ29tbWFuZDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkluc3RydW1lbnRlZEF1dG9GaWxsU2VydmljZS53YWl0VW50aWxDb25uZWN0ZWQ7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5JbnN0cnVtZW50ZWRBdXRvRmlsbFNlcnZpY2Uud2FpdFVudGlsRGlzY29ubmVjdGVkOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuY29tbW9uLlNoZWxsSGVscGVyLnJ1blNoZWxsQ29tbWFuZDsKIAogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi50cnV0aC5UcnV0aC5hc3NlcnRUaGF0OwogCkBAIC0zNSwxMCArMzMsNiBAQAogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCi0vKioKLSAqIFRoaXMgaXMgdGhlIHRlc3QgY2FzZSBjb3ZlcmluZyBtb3N0IHNjZW5hcmlvcyAtIG90aGVyIHRlc3QgY2FzZXMgd2lsbCBjb3ZlciBjaGFyYWN0ZXJpc3RpY3MKLSAqIHNwZWNpZmljIHRvIHRoYXQgdGVzdCdzIGFjdGl2aXR5IChmb3IgZXhhbXBsZSwgY3VzdG9tIHZpZXdzKS4KLSAqLwogcHVibGljIGNsYXNzIER1cGxpY2F0ZUlkQWN0aXZpdHlUZXN0IGV4dGVuZHMgQXV0b0ZpbGxTZXJ2aWNlVGVzdENhc2UgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gRHVwbGljYXRlSWRBY3Rpdml0eVRlc3QuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOwogICAgIEBSdWxlCkBAIC00OCw5ICs0Miw5IEBACiAgICAgcHJpdmF0ZSBEdXBsaWNhdGVJZEFjdGl2aXR5IG1BY3Rpdml0eTsKIAogICAgIEBCZWZvcmUKLSAgICBwdWJsaWMgdm9pZCBzZXR1cCgpIHsKLSAgICAgICAgSGVscGVyLmRpc2FibGVBdXRvUm90YXRpb24oc1VpQm90KTsKLSAgICAgICAgc1VpQm90LnNldFNjcmVlbk9yaWVudGF0aW9uKDApOworICAgIHB1YmxpYyB2b2lkIHNldHVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEhlbHBlci5kaXNhYmxlQXV0b1JvdGF0aW9uKG1VaUJvdCk7CisgICAgICAgIG1VaUJvdC5zZXRTY3JlZW5PcmllbnRhdGlvbigwKTsKIAogICAgICAgICBtQWN0aXZpdHkgPSBtQWN0aXZpdHlSdWxlLmdldEFjdGl2aXR5KCk7CiAgICAgfQpAQCAtODEsNyArNzUsOCBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RG9Ob3RSZXN0b3JlRHVwbGljYXRlQXV0b2ZpbGxJZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzdW1lVHJ1ZSgiU2NyZWVuIHJvdGF0aW9uIG5vdCBzdXBwb3J0ZWQiLCBzVWlCb3QuaXNTY3JlZW5Sb3RhdGlvblN1cHBvcnRlZCgpKTsKKyAgICAgICAgYXNzdW1lVHJ1ZSgiUm90YXRpb24gaXMgc3VwcG9ydGVkIiwgSGVscGVyLmlzUm90YXRpb25TdXBwb3J0ZWQobUNvbnRleHQpKTsKKwogICAgICAgICBlbmFibGVTZXJ2aWNlKCk7CiAKICAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UobmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkKQEAgLTk0LDE0ICs4OSwxNCBAQAogICAgICAgICAvLyBTZWxlY3QgZmllbGQgdG8gc3RhcnQgYXV0b2ZpbGwKICAgICAgICAgcnVuU2hlbGxDb21tYW5kKCJpbnB1dCBrZXlldmVudCBLRVlDT0RFX1RBQiIpOwogCi0gICAgICAgIHdhaXRVbnRpbENvbm5lY3RlZCgpOwotICAgICAgICBJbnN0cnVtZW50ZWRBdXRvRmlsbFNlcnZpY2UuRmlsbFJlcXVlc3QgcmVxdWVzdCA9IHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOworICAgICAgICBmaW5hbCBJbnN0cnVtZW50ZWRBdXRvRmlsbFNlcnZpY2UuRmlsbFJlcXVlc3QgcmVxdWVzdDEgPSBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKKyAgICAgICAgTG9nLnYoTE9HX1RBRywgInJlcXVlc3QxOiAiICsgcmVxdWVzdDEpOwogCi0gICAgICAgIEFzc2lzdFN0cnVjdHVyZS5WaWV3Tm9kZVtdIHZpZXdzID0gZmluZFZpZXdzKHJlcXVlc3QpOwotICAgICAgICBBc3Npc3RTdHJ1Y3R1cmUuVmlld05vZGUgdmlldzEgPSB2aWV3c1swXTsKLSAgICAgICAgQXNzaXN0U3RydWN0dXJlLlZpZXdOb2RlIHZpZXcyID0gdmlld3NbMV07Ci0gICAgICAgIEF1dG9maWxsSWQgaWQxID0gdmlldzEuZ2V0QXV0b2ZpbGxJZCgpOwotICAgICAgICBBdXRvZmlsbElkIGlkMiA9IHZpZXcyLmdldEF1dG9maWxsSWQoKTsKKyAgICAgICAgZmluYWwgQXNzaXN0U3RydWN0dXJlLlZpZXdOb2RlW10gdmlld3MxID0gZmluZFZpZXdzKHJlcXVlc3QxKTsKKyAgICAgICAgZmluYWwgQXNzaXN0U3RydWN0dXJlLlZpZXdOb2RlIHZpZXcxID0gdmlld3MxWzBdOworICAgICAgICBmaW5hbCBBc3Npc3RTdHJ1Y3R1cmUuVmlld05vZGUgdmlldzIgPSB2aWV3czFbMV07CisgICAgICAgIGZpbmFsIEF1dG9maWxsSWQgaWQxID0gdmlldzEuZ2V0QXV0b2ZpbGxJZCgpOworICAgICAgICBmaW5hbCBBdXRvZmlsbElkIGlkMiA9IHZpZXcyLmdldEF1dG9maWxsSWQoKTsKIAogICAgICAgICBMb2cuaShMT0dfVEFHLCAidmlldzE9IiArIGlkMSk7CiAgICAgICAgIExvZy5pKExPR19UQUcsICJ2aWV3Mj0iICsgaWQyKTsKQEAgLTExMiwzNyArMTA3LDQ0IEBACiAgICAgICAgIC8vIFRoZXkgZ290IGRpZmZlcmVudCBhdXRvZmlsbCBpZHMgdGhvdWdoCiAgICAgICAgIGFzc2VydFRoYXQoaWQxKS5pc05vdEVxdWFsVG8oaWQyKTsKIAorICAgICAgICAvLyBCZWNhdXNlIHNlcnZpY2UgcmV0dXJuZWQgYSBudWxsIHJlc3BvbnNlLCByb3RhdGlvbiB3aWxsIHRyaWdnZXIgYW5vdGhlciByZXF1ZXN0LgogICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShOT19SRVNQT05TRSk7Ci0KICAgICAgICAgLy8gRm9yY2Ugcm90YXRpb24gdG8gZm9yY2Ugb25EZXN0cm95LT5vbkNyZWF0ZSBjeWNsZQotICAgICAgICBzVWlCb3Quc2V0U2NyZWVuT3JpZW50YXRpb24oMSk7CisgICAgICAgIG1VaUJvdC5zZXRTY3JlZW5PcmllbnRhdGlvbigxKTsKKyAgICAgICAgLy8gV2FpdCBjb250ZXh0IGFuZCBWaWV3cyBiZWluZyByZWNyZWF0ZWQgaW4gcm90YXRpb24KKyAgICAgICAgbVVpQm90LmFzc2VydFNob3duQnlSZWxhdGl2ZUlkKERVUExJQ0FURV9JRCk7CisgICAgICAgIC8vIElnbm9yZSAybmQgcmVxdWVzdC4KKyAgICAgICAgZmluYWwgSW5zdHJ1bWVudGVkQXV0b0ZpbGxTZXJ2aWNlLkZpbGxSZXF1ZXN0IHJlcXVlc3QyID0gc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CisgICAgICAgIExvZy52KExPR19UQUcsICJyZXF1ZXN0MjogIiArIHJlcXVlc3QyKTsKIAotICAgICAgICAvLyBTZWxlY3Qgb3RoZXIgZmllbGQgdG8gdHJpZ2dlciBuZXcgcGFydGl0aW9uCisgICAgICAgIC8vIFNlbGVjdCBvdGhlciBmaWVsZCB0byB0cmlnZ2VyIG5ldyBwYXJ0aXRpb24gKGJlY2F1c2Ugc2VydmVyIGRpZG4ndCByZXR1cm4gMm5kIGZpZWxkCisgICAgICAgIC8vIG9uIDFzdCByZXNwb25zZSkKKyAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UoTk9fUkVTUE9OU0UpOwogICAgICAgICBydW5TaGVsbENvbW1hbmQoImlucHV0IGtleWV2ZW50IEtFWUNPREVfVEFCIik7CiAKLSAgICAgICAgcmVxdWVzdCA9IHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwotCi0gICAgICAgIHZpZXdzID0gZmluZFZpZXdzKHJlcXVlc3QpOwotICAgICAgICBBdXRvZmlsbElkIHJlY3JlYXRlZElkMSA9IHZpZXdzWzBdLmdldEF1dG9maWxsSWQoKTsKLSAgICAgICAgQXV0b2ZpbGxJZCByZWNyZWF0ZWRJZDIgPSB2aWV3c1sxXS5nZXRBdXRvZmlsbElkKCk7CisgICAgICAgIGZpbmFsIEluc3RydW1lbnRlZEF1dG9GaWxsU2VydmljZS5GaWxsUmVxdWVzdCByZXF1ZXN0MyA9IHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOworICAgICAgICBMb2cudihMT0dfVEFHLCAicmVxdWVzdDM6ICIgKyByZXF1ZXN0Myk7CisgICAgICAgIGZpbmFsIEFzc2lzdFN0cnVjdHVyZS5WaWV3Tm9kZVtdIHZpZXdzMiA9IGZpbmRWaWV3cyhyZXF1ZXN0Myk7CisgICAgICAgIGZpbmFsIEFzc2lzdFN0cnVjdHVyZS5WaWV3Tm9kZSByZWNyZWF0ZWRWaWV3MSA9IHZpZXdzMlswXTsKKyAgICAgICAgZmluYWwgQXNzaXN0U3RydWN0dXJlLlZpZXdOb2RlIHJlY3JlYXRlZFZpZXcyID0gdmlld3MyWzFdOworICAgICAgICBmaW5hbCBBdXRvZmlsbElkIHJlY3JlYXRlZElkMSA9IHJlY3JlYXRlZFZpZXcxLmdldEF1dG9maWxsSWQoKTsKKyAgICAgICAgZmluYWwgQXV0b2ZpbGxJZCByZWNyZWF0ZWRJZDIgPSByZWNyZWF0ZWRWaWV3Mi5nZXRBdXRvZmlsbElkKCk7CiAKICAgICAgICAgTG9nLmkoTE9HX1RBRywgInJlc3RvcmVkIHZpZXcxPSIgKyByZWNyZWF0ZWRJZDEpOwogICAgICAgICBMb2cuaShMT0dfVEFHLCAicmVzdG9yZWQgdmlldzI9IiArIHJlY3JlYXRlZElkMik7CiAKICAgICAgICAgLy8gRm9yIHRoZSByZXN0b3JpbmcgbG9naWMgdGhlIHR3byB2aWV3cyBhcmUgdGhlIHNhbWUuIEhlbmNlIGl0IG1pZ2h0IGhhcHBlbiB0aGF0IHRoZSBmaXJzdAotICAgICAgICAvLyB2aWV3IGlzIHJlc3RvcmVkIHdpdGggdGhlIGlkIG9mIHRoZSBzZWNvbmQgdmlldyBvciB0aGUgb3RoZXIgd2F5IHJvdW5kLgorICAgICAgICAvLyB2aWV3IGlzIHJlc3RvcmVkIHdpdGggdGhlIGF1dG9maWxsIGlkIG9mIHRoZSBzZWNvbmQgdmlldyBvciB0aGUgb3RoZXIgd2F5IHJvdW5kLgogICAgICAgICAvLyBXZSBqdXN0IG5lZWQKICAgICAgICAgLy8gLSB0byByZXN0b3JlIGFzIG1hbnkgdmlld3MgYXMgd2UgY2FuIChpLmUuIG9uZSkKICAgICAgICAgLy8gLSBtYWtlIHN1cmUgdGhlIGF1dG9maWxsIGlkcyBhcmUgc3RpbGwgdW5pcXVlIGFmdGVyCi0gICAgICAgIGJvb2xlYW4gdmlldzFXYXNSZXN0b3JlZCA9IChyZWNyZWF0ZWRJZDEuZXF1YWxzKGlkMSkgfHwgcmVjcmVhdGVkSWQxLmVxdWFscyhpZDIpKTsKLSAgICAgICAgYm9vbGVhbiB2aWV3Mldhc1Jlc3RvcmVkID0gKHJlY3JlYXRlZElkMi5lcXVhbHMoaWQxKSB8fCByZWNyZWF0ZWRJZDIuZXF1YWxzKGlkMikpOworICAgICAgICBmaW5hbCBib29sZWFuIHZpZXcxV2FzUmVzdG9yZWQgPSAocmVjcmVhdGVkSWQxLmVxdWFscyhpZDEpIHx8IHJlY3JlYXRlZElkMS5lcXVhbHMoaWQyKSk7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gdmlldzJXYXNSZXN0b3JlZCA9IChyZWNyZWF0ZWRJZDIuZXF1YWxzKGlkMSkgfHwgcmVjcmVhdGVkSWQyLmVxdWFscyhpZDIpKTsKIAogICAgICAgICAvLyBPbmUgaWQgd2FzIHJlc3RvcmVkCiAgICAgICAgIGFzc2VydFRoYXQodmlldzFXYXNSZXN0b3JlZCB8fCB2aWV3Mldhc1Jlc3RvcmVkKS5pc1RydWUoKTsKIAogICAgICAgICAvLyBUaGUgdmlld3Mgc3RpbGwgaGF2ZSBkaWZmZXJlbnQgYXV0b2ZpbGwgaWRzCiAgICAgICAgIGFzc2VydFRoYXQocmVjcmVhdGVkSWQxKS5pc05vdEVxdWFsVG8ocmVjcmVhdGVkSWQyKTsKLQotICAgICAgICB3YWl0VW50aWxEaXNjb25uZWN0ZWQoKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9FbXB0eUFjdGl2aXR5LmphdmEgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9FbXB0eUFjdGl2aXR5LmphdmEKaW5kZXggNmYyN2ZiZS4uODdlMmIzYSAxMDA2NDQKLS0tIGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvRW1wdHlBY3Rpdml0eS5qYXZhCisrKyBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0VtcHR5QWN0aXZpdHkuamF2YQpAQCAtMTgsMTYgKzE4LDI5IEBACiAKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTnVsbGFibGU7CiAKIC8qKgogICogRW1wdHkgYWN0aXZpdHkKICAqLwogcHVibGljIGNsYXNzIEVtcHR5QWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FTVBUWSA9ICJlbXB0eSI7CisKKyAgICBwcml2YXRlIFZpZXcgbUVtcHR5VmlldzsKKwogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEBOdWxsYWJsZSBCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CiAKICAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQuZW1wdHkpOworICAgICAgICBtRW1wdHlWaWV3ID0gZmluZFZpZXdCeUlkKFIuaWQuZW1wdHkpOwogICAgIH0KKworICAgIHB1YmxpYyBWaWV3IGdldEVtcHR5VmlldygpIHsKKyAgICAgICAgcmV0dXJuIG1FbXB0eVZpZXc7CisgICAgfQorCiB9CmRpZmYgLS1naXQgYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9GYXRBY3Rpdml0eS5qYXZhIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvRmF0QWN0aXZpdHkuamF2YQppbmRleCBjZTk3NDA4Li44YTUzZjRhIDEwMDY0NAotLS0gYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9GYXRBY3Rpdml0eS5qYXZhCisrKyBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0ZhdEFjdGl2aXR5LmphdmEKQEAgLTE2LDYgKzE2LDcgQEAKIAogcGFja2FnZSBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHM7CiAKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5maW5kVmlld0J5QXV0b2ZpbGxIaW50OwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuVmlldy5JTVBPUlRBTlRfRk9SX0FVVE9GSUxMX0FVVE87CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5WaWV3LklNUE9SVEFOVF9GT1JfQVVUT0ZJTExfTk87CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5WaWV3LklNUE9SVEFOVF9GT1JfQVVUT0ZJTExfTk9fRVhDTFVERV9ERVNDRU5EQU5UUzsKQEAgLTI0LDEwICsyNSwxMyBAQAogCiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLnRydXRoLlRydXRoLmFzc2VydFRoYXQ7CiAKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkVkaXRUZXh0OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CiAKIC8qKgogICogQW4gYWN0aXZpdHkgY29udGFpbmluZyBtb3N0bHkgd2lkZ2V0cyB0aGF0IHNob3VsZCBiZSByZW1vdmVkIGZyb20gYW4gYXV0by1maWxsIHN0cnVjdHVyZSB0bwpAQCAtNDAsNiArNDQsNyBAQAogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfSU5QVVRfQ09OVEFJTkVSID0gImlucHV0X2NvbnRhaW5lciI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9JTUFHRSA9ICJpbWFnZSI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9JTVBPUlRBTlRfSU1BR0UgPSAiaW1wb3J0YW50X2ltYWdlIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIElEX1JPT1QgPSAicm9vdCI7CiAKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIElEX05PVF9JTVBPUlRBTlRfQ09OVEFJTkVSX0VYQ0xVRElOR19ERVNDRU5EQU5UUyA9CiAgICAgICAgICAgICAibm90X2ltcG9ydGFudF9jb250YWluZXJfZXhjbHVkaW5nX2Rlc2NlbmRhbnRzIjsKQEAgLTYyLDYgKzY3LDcgQEAKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIElEX05PVF9JTVBPUlRBTlRfQ09OVEFJTkVSX01JWEVEX0RFU0NFTkRBTlRTX0dSQU5EX0NISUxEID0KICAgICAgICAgICAgICJub3RfaW1wb3J0YW50X2NvbnRhaW5lcl9taXhlZF9kZXNjZW5kYW50c19ncmFuZF9jaGlsZCI7CiAKKyAgICBwcml2YXRlIExpbmVhckxheW91dCBtUm9vdDsKICAgICBwcml2YXRlIEVkaXRUZXh0IG1DYXB0Y2hhOwogICAgIHByaXZhdGUgRWRpdFRleHQgbUlucHV0OwogICAgIHByaXZhdGUgSW1hZ2VWaWV3IG1JbWFnZTsKQEAgLTc5LDEyICs4NSwxNSBAQAogICAgIHByaXZhdGUgVmlldyBtTm90SW1wb3J0YW50Q29udGFpbmVyTWl4ZWREZXNjZW5kYW50c0NoaWxkOwogICAgIHByaXZhdGUgVmlldyBtTm90SW1wb3J0YW50Q29udGFpbmVyTWl4ZWREZXNjZW5kYW50c0dyYW5kQ2hpbGQ7CiAKKyAgICBwcml2YXRlIE15VmlldyBtVmlld1dpdGhBdXRvZmlsbEhpbnRzOworCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewogICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwogCiAgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmZhdF9hY3Rpdml0eSk7CiAKKyAgICAgICAgbVJvb3QgPSBmaW5kVmlld0J5SWQoUi5pZC5yb290KTsKICAgICAgICAgbUNhcHRjaGEgPSBmaW5kVmlld0J5SWQoUi5pZC5jYXB0Y2hhKTsKICAgICAgICAgbUlucHV0ID0gZmluZFZpZXdCeUlkKFIuaWQuaW5wdXQpOwogICAgICAgICBtSW1hZ2UgPSBmaW5kVmlld0J5SWQoUi5pZC5pbWFnZSk7CkBAIC0xMTEsNyArMTIwLDExIEBACiAgICAgICAgIG1Ob3RJbXBvcnRhbnRDb250YWluZXJNaXhlZERlc2NlbmRhbnRzR3JhbmRDaGlsZCA9IGZpbmRWaWV3QnlJZCgKICAgICAgICAgICAgICAgICBSLmlkLm5vdF9pbXBvcnRhbnRfY29udGFpbmVyX21peGVkX2Rlc2NlbmRhbnRzX2dyYW5kX2NoaWxkKTsKIAorICAgICAgICBtVmlld1dpdGhBdXRvZmlsbEhpbnRzID0gKE15VmlldykgZmluZFZpZXdCeUF1dG9maWxsSGludCh0aGlzLCAiaW1wb3J0YW50QW1JIik7CisgICAgICAgIGFzc2VydFRoYXQobVZpZXdXaXRoQXV0b2ZpbGxIaW50cykuaXNOb3ROdWxsKCk7CisKICAgICAgICAgLy8gU2FuaXR5IGNoZWNrIGZvciBpbXBvcnRhbnRGb3JBdXRvZmlsbCBtb2RlcworICAgICAgICBhc3NlcnRUaGF0KG1Sb290LmdldEltcG9ydGFudEZvckF1dG9maWxsKCkpLmlzRXF1YWxUbyhJTVBPUlRBTlRfRk9SX0FVVE9GSUxMX0FVVE8pOwogICAgICAgICBhc3NlcnRUaGF0KG1JbnB1dC5nZXRJbXBvcnRhbnRGb3JBdXRvZmlsbCgpKS5pc0VxdWFsVG8oSU1QT1JUQU5UX0ZPUl9BVVRPRklMTF9ZRVMpOwogICAgICAgICBhc3NlcnRUaGF0KG1DYXB0Y2hhLmdldEltcG9ydGFudEZvckF1dG9maWxsKCkpLmlzRXF1YWxUbyhJTVBPUlRBTlRfRk9SX0FVVE9GSUxMX05PKTsKICAgICAgICAgYXNzZXJ0VGhhdChtSW1hZ2UuZ2V0SW1wb3J0YW50Rm9yQXV0b2ZpbGwoKSkuaXNFcXVhbFRvKElNUE9SVEFOVF9GT1JfQVVUT0ZJTExfTk8pOwpAQCAtMTM3LDYgKzE1MCwxMCBAQAogICAgICAgICAgICAgICAgIC5pc0VxdWFsVG8oSU1QT1JUQU5UX0ZPUl9BVVRPRklMTF9ZRVMpOwogICAgICAgICBhc3NlcnRUaGF0KG1Ob3RJbXBvcnRhbnRDb250YWluZXJNaXhlZERlc2NlbmRhbnRzR3JhbmRDaGlsZC5nZXRJbXBvcnRhbnRGb3JBdXRvZmlsbCgpKQogICAgICAgICAgICAgICAgIC5pc0VxdWFsVG8oSU1QT1JUQU5UX0ZPUl9BVVRPRklMTF9OTyk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChtVmlld1dpdGhBdXRvZmlsbEhpbnRzLmdldEltcG9ydGFudEZvckF1dG9maWxsKCkpCisgICAgICAgICAgICAgICAgLmlzRXF1YWxUbyhJTVBPUlRBTlRfRk9SX0FVVE9GSUxMX0FVVE8pOworICAgICAgICBhc3NlcnRUaGF0KG1WaWV3V2l0aEF1dG9maWxsSGludHMuaXNJbXBvcnRhbnRGb3JBdXRvZmlsbCgpKS5pc1RydWUoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE0Nyw0ICsxNjQsMTggQEAKICAgICAgICAgICAgIHYudmlzaXQobUlucHV0KTsKICAgICAgICAgfSk7CiAgICAgfQorCisgICAgLyoqCisgICAgICogQ3VzdG9tIHZpZXcgdGhhdCBkZWZpbmVzIGFuIGF1dG9maWxsIHR5cGUgc28gYXV0b2ZpbGwgaGludHMgYXJlIHNldCBvbiB7QGNvZGUgVmlld05vZGV9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlWaWV3IGV4dGVuZHMgVmlldyB7CisgICAgICAgIHB1YmxpYyBNeVZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGdldEF1dG9maWxsVHlwZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBBVVRPRklMTF9UWVBFX1RFWFQ7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9GYXRBY3Rpdml0eVRlc3QuamF2YSBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0ZhdEFjdGl2aXR5VGVzdC5qYXZhCmluZGV4IGIyZGQxZDQuLjI4ZWNkZjcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0ZhdEFjdGl2aXR5VGVzdC5qYXZhCisrKyBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0ZhdEFjdGl2aXR5VGVzdC5qYXZhCkBAIC0zMCwxMSArMzAsMjAgQEAKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkZhdEFjdGl2aXR5LklEX05PVF9JTVBPUlRBTlRfQ09OVEFJTkVSX01JWEVEX0RFU0NFTkRBTlRTOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuRmF0QWN0aXZpdHkuSURfTk9UX0lNUE9SVEFOVF9DT05UQUlORVJfTUlYRURfREVTQ0VOREFOVFNfQ0hJTEQ7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5GYXRBY3Rpdml0eS5JRF9OT1RfSU1QT1JUQU5UX0NPTlRBSU5FUl9NSVhFRF9ERVNDRU5EQU5UU19HUkFORF9DSElMRDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5hc3NlcnROdW1iZXJPZkNoaWxkcmVuOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuRmF0QWN0aXZpdHkuSURfUk9PVDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5maW5kTm9kZUJ5QXV0b2ZpbGxIaW50OwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSGVscGVyLmZpbmROb2RlQnlSZXNvdXJjZUlkOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSGVscGVyLmZpbmROb2RlQnlUZXh0OworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSGVscGVyLmdldE51bWJlck5vZGVzOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSGVscGVyLmltcG9ydGFudEZvckF1dG9maWxsQXNTdHJpbmc7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5WaWV3LklNUE9SVEFOVF9GT1JfQVVUT0ZJTExfQVVUTzsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LlZpZXcuSU1QT1JUQU5UX0ZPUl9BVVRPRklMTF9OTzsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LlZpZXcuSU1QT1JUQU5UX0ZPUl9BVVRPRklMTF9OT19FWENMVURFX0RFU0NFTkRBTlRTOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuVmlldy5JTVBPUlRBTlRfRk9SX0FVVE9GSUxMX1lFUzsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LlZpZXcuSU1QT1JUQU5UX0ZPUl9BVVRPRklMTF9ZRVNfRVhDTFVERV9ERVNDRU5EQU5UUzsKIAogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi50cnV0aC5UcnV0aC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi50cnV0aC5UcnV0aC5hc3NlcnRXaXRoTWVzc2FnZTsKIAogaW1wb3J0IGFuZHJvaWQuYXBwLmFzc2lzdC5Bc3Npc3RTdHJ1Y3R1cmUuVmlld05vZGU7CiBpbXBvcnQgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkluc3RydW1lbnRlZEF1dG9GaWxsU2VydmljZS5GaWxsUmVxdWVzdDsKQEAgLTUzLDYgKzYyLDcgQEAKICAgICAgICAgbmV3IEF1dG9maWxsQWN0aXZpdHlUZXN0UnVsZTxGYXRBY3Rpdml0eT4oRmF0QWN0aXZpdHkuY2xhc3MpOwogCiAgICAgcHJpdmF0ZSBGYXRBY3Rpdml0eSBtRmF0QWN0aXZpdHk7CisgICAgcHJpdmF0ZSBWaWV3Tm9kZSBtUm9vdDsKIAogICAgIEBCZWZvcmUKICAgICBwdWJsaWMgdm9pZCBzZXRBY3Rpdml0eSgpIHsKQEAgLTYwLDcgKzcwLDcgQEAKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3ROb0NvbnRhaW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0b21hdGljUmVxdWVzdCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBTZXQgc2VydmljZS4KICAgICAgICAgZW5hYmxlU2VydmljZSgpOwogCkBAIC03MCw1NSArODAsMTczIEBACiAgICAgICAgIC8vIFRyaWdnZXIgYXV0by1maWxsLgogICAgICAgICBtRmF0QWN0aXZpdHkub25JbnB1dCgodikgLT4gdi5yZXF1ZXN0Rm9jdXMoKSk7CiAgICAgICAgIGZpbmFsIEZpbGxSZXF1ZXN0IGZpbGxSZXF1ZXN0ID0gc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnROb0RhdGFzZXRzKCk7CisgICAgICAgIG1VaUJvdC5hc3NlcnROb0RhdGFzZXRzRXZlcigpOwogCi0gICAgICAgIC8vIFRPRE86IHNob3VsZCBvbmx5IGhhdmUgNSBjaGlsZHJlbiwgYnV0IHRoZXJlIGlzIGFuIGV4dHJhCi0gICAgICAgIC8vIFRleHRWaWV3IHRoYXQncyBwcm9iYWJseSBjb21pbmcgZnJvbSB0aGUgdGl0bGUuIEZvciBub3cgd2UncmUganVzdCBpZ25vcmluZyBpdCwgYnV0Ci0gICAgICAgIC8vIGlkZWFsbHkgd2Ugc2hvdWxkIGNoYW5nZSB0aGUgLnhtbCB0byBleGNsdWRlIGl0LgotICAgICAgICBhc3NlcnROdW1iZXJPZkNoaWxkcmVuKGZpbGxSZXF1ZXN0LnN0cnVjdHVyZSwgOCk7CisgICAgICAgIG1Sb290ID0gZmluZE5vZGVCeVJlc291cmNlSWQoZmlsbFJlcXVlc3Quc3RydWN0dXJlLCBJRF9ST09UKTsKKyAgICAgICAgLyoKKyAgICAgICAgICogU2hvdWxkIGhhdmUgOCBub2RlczoKKyAgICAgICAgICoKKyAgICAgICAgICogMS4gcm9vdAorICAgICAgICAgKiAyLiBpbXBvcnRhbnRfaW1hZ2UKKyAgICAgICAgICogMy4gbGFiZWwgd2l0aG91dCBpZCBidXQgbWFya2VkIGFzIGltcG9ydGFudAorICAgICAgICAgKiA0LiBpbnB1dF9jb250YWluZXIKKyAgICAgICAgICogNS4gaW5wdXQKKyAgICAgICAgICogNi4gaW1wb3J0YW50X2NvbnRhaW5lcl9leGNsdWRpbmdfZGVzY2VuZGFudHMKKyAgICAgICAgICogNy4gbm90X2ltcG9ydGFudF9jb250YWluZXJfbWl4ZWRfZGVzY2VuZGFudHNfY2hpbGQKKyAgICAgICAgICogOC4gdmlldyAoTXkgVmlldykgd2l0aG91dCBpZCBidXQgd2l0aCBoaW50cworICAgICAgICAgKi8KKyAgICAgICAgYXNzZXJ0VGhhdChnZXROdW1iZXJOb2RlcyhtUm9vdCkpLmlzRXF1YWxUbyg4KTsKIAogICAgICAgICAvLyBTaG91bGQgbm90IGhhdmUgSW1hZ2VWaWV3Li4uCiAgICAgICAgIGFzc2VydFRoYXQoZmluZE5vZGVCeVJlc291cmNlSWQoZmlsbFJlcXVlc3Quc3RydWN0dXJlLCBJRF9JTUFHRSkpLmlzTnVsbCgpOwogCiAgICAgICAgIC8vIC4uLnVubGVzcyBhcHAgZGV2ZWxvcGVyIGFza2VkIHRvOgotICAgICAgICBhc3NlcnRUaGF0KGZpbmROb2RlQnlSZXNvdXJjZUlkKGZpbGxSZXF1ZXN0LnN0cnVjdHVyZSwgSURfSU1QT1JUQU5UX0lNQUdFKSkuaXNOb3ROdWxsKCk7CisgICAgICAgIGFzc2VydE5vZGVFeGlzdHMoSURfSU1QT1JUQU5UX0lNQUdFLCBJTVBPUlRBTlRfRk9SX0FVVE9GSUxMX1lFUyk7CiAKICAgICAgICAgLy8gU2hvdWxkIGhhdmUgVGV4dFZpZXcsIGV2ZW4gaWYgaXQgZG9lcyBub3QgaGF2ZSBpZC4KLSAgICAgICAgYXNzZXJ0VGhhdChmaW5kTm9kZUJ5VGV4dChmaWxsUmVxdWVzdC5zdHJ1Y3R1cmUsICJMYWJlbCB3aXRoIG5vIElEIikpLmlzTm90TnVsbCgpOworICAgICAgICBhc3NlcnROb2RlV2l0aFRleHRFeGlzdHMoIkxhYmVsIHdpdGggbm8gSUQiLCBJTVBPUlRBTlRfRk9SX0FVVE9GSUxMX1lFUyk7CiAKICAgICAgICAgLy8gU2hvdWxkIG5vdCBoYXZlIEVkaXRUZXh0IHRoYXQgd2FzIGV4cGxpY2l0bHkgcmVtb3ZlZC4KICAgICAgICAgYXNzZXJ0VGhhdChmaW5kTm9kZUJ5UmVzb3VyY2VJZChmaWxsUmVxdWVzdC5zdHJ1Y3R1cmUsIElEX0NBUFRDSEEpKS5pc051bGwoKTsKIAogICAgICAgICAvLyBNYWtlIHN1cmUgY29udGFpbmVyIHdpdGggYSByZXNvdXJjZSBpZCB3YXMgaW5jbHVkZWQuCi0gICAgICAgIGZpbmFsIFZpZXdOb2RlIGlucHV0Q29udGFpbmVyID0KLSAgICAgICAgICAgICAgICBmaW5kTm9kZUJ5UmVzb3VyY2VJZChmaWxsUmVxdWVzdC5zdHJ1Y3R1cmUsIElEX0lOUFVUX0NPTlRBSU5FUik7Ci0gICAgICAgIGFzc2VydFRoYXQoaW5wdXRDb250YWluZXIpLmlzTm90TnVsbCgpOworICAgICAgICBmaW5hbCBWaWV3Tm9kZSBpbnB1dENvbnRhaW5lciA9IGFzc2VydE5vZGVFeGlzdHMoSURfSU5QVVRfQ09OVEFJTkVSLAorICAgICAgICAgICAgICAgIElNUE9SVEFOVF9GT1JfQVVUT0ZJTExfQVVUTyk7CiAgICAgICAgIGFzc2VydFRoYXQoaW5wdXRDb250YWluZXIuZ2V0Q2hpbGRDb3VudCgpKS5pc0VxdWFsVG8oMSk7CiAgICAgICAgIGZpbmFsIFZpZXdOb2RlIGlucHV0ID0gaW5wdXRDb250YWluZXIuZ2V0Q2hpbGRBdCgwKTsKKyAgICAgICAgYXNzZXJ0Tm9kZShpbnB1dCwgSU1QT1JUQU5UX0ZPUl9BVVRPRklMTF9ZRVMpOwogICAgICAgICBhc3NlcnRUaGF0KGlucHV0LmdldElkRW50cnkoKSkuaXNFcXVhbFRvKElEX0lOUFVUKTsKIAogICAgICAgICAvLyBNYWtlIHN1cmUgYSBub24taW1wb3J0YW50IGNvbnRhaW5lciBjYW4gZXhjbHVkZSBkZXNjZW5kYW50cwotICAgICAgICBhc3NlcnRUaGF0KGZpbmROb2RlQnlSZXNvdXJjZUlkKGZpbGxSZXF1ZXN0LnN0cnVjdHVyZSwKKyAgICAgICAgYXNzZXJ0VGhhdChmaW5kTm9kZUJ5UmVzb3VyY2VJZChtUm9vdCwKICAgICAgICAgICAgICAgICBJRF9OT1RfSU1QT1JUQU5UX0NPTlRBSU5FUl9FWENMVURJTkdfREVTQ0VOREFOVFMpKS5pc051bGwoKTsKLSAgICAgICAgYXNzZXJ0VGhhdChmaW5kTm9kZUJ5UmVzb3VyY2VJZChmaWxsUmVxdWVzdC5zdHJ1Y3R1cmUsCisgICAgICAgIGFzc2VydFRoYXQoZmluZE5vZGVCeVJlc291cmNlSWQobVJvb3QsCiAgICAgICAgICAgICAgICAgSURfTk9UX0lNUE9SVEFOVF9DT05UQUlORVJfRVhDTFVESU5HX0RFU0NFTkRBTlRTX0NISUxEKSkuaXNOdWxsKCk7Ci0gICAgICAgIGFzc2VydFRoYXQoZmluZE5vZGVCeVJlc291cmNlSWQoZmlsbFJlcXVlc3Quc3RydWN0dXJlLAorICAgICAgICBhc3NlcnRUaGF0KGZpbmROb2RlQnlSZXNvdXJjZUlkKG1Sb290LAogICAgICAgICAgICAgICAgIElEX05PVF9JTVBPUlRBTlRfQ09OVEFJTkVSX0VYQ0xVRElOR19ERVNDRU5EQU5UU19HUkFORF9DSElMRCkpLmlzTnVsbCgpOwogCiAgICAgICAgIC8vIE1ha2Ugc3VyZSBhbiBpbXBvcnRhbnQgY29udGFpbmVyIGNhbiBleGNsdWRlIGRlc2NlbmRhbnRzCi0gICAgICAgIGFzc2VydFRoYXQoZmluZE5vZGVCeVJlc291cmNlSWQoZmlsbFJlcXVlc3Quc3RydWN0dXJlLAotICAgICAgICAgICAgICAgIElEX0lNUE9SVEFOVF9DT05UQUlORVJfRVhDTFVESU5HX0RFU0NFTkRBTlRTKSkuaXNOb3ROdWxsKCk7Ci0gICAgICAgIGFzc2VydFRoYXQoZmluZE5vZGVCeVJlc291cmNlSWQoZmlsbFJlcXVlc3Quc3RydWN0dXJlLAorICAgICAgICBhc3NlcnROb2RlRXhpc3RzKElEX0lNUE9SVEFOVF9DT05UQUlORVJfRVhDTFVESU5HX0RFU0NFTkRBTlRTLAorICAgICAgICAgICAgICAgIElNUE9SVEFOVF9GT1JfQVVUT0ZJTExfWUVTX0VYQ0xVREVfREVTQ0VOREFOVFMpOworICAgICAgICBhc3NlcnRUaGF0KGZpbmROb2RlQnlSZXNvdXJjZUlkKG1Sb290LAogICAgICAgICAgICAgICAgIElEX0lNUE9SVEFOVF9DT05UQUlORVJfRVhDTFVESU5HX0RFU0NFTkRBTlRTX0NISUxEKSkuaXNOdWxsKCk7Ci0gICAgICAgIGFzc2VydFRoYXQoZmluZE5vZGVCeVJlc291cmNlSWQoZmlsbFJlcXVlc3Quc3RydWN0dXJlLAorICAgICAgICBhc3NlcnRUaGF0KGZpbmROb2RlQnlSZXNvdXJjZUlkKG1Sb290LAogICAgICAgICAgICAgICAgIElEX0lNUE9SVEFOVF9DT05UQUlORVJfRVhDTFVESU5HX0RFU0NFTkRBTlRTX0dSQU5EX0NISUxEKSkuaXNOdWxsKCk7CiAKICAgICAgICAgLy8gTWFrZSBzdXJlIGFuIGludGVybWVkaWFyeSBkZXNjZW5kYW50IGNhbiBiZSBleGNsdWRlZAotICAgICAgICBhc3NlcnRUaGF0KGZpbmROb2RlQnlSZXNvdXJjZUlkKGZpbGxSZXF1ZXN0LnN0cnVjdHVyZSwKKyAgICAgICAgYXNzZXJ0VGhhdChmaW5kTm9kZUJ5UmVzb3VyY2VJZChtUm9vdCwKICAgICAgICAgICAgICAgICBJRF9OT1RfSU1QT1JUQU5UX0NPTlRBSU5FUl9NSVhFRF9ERVNDRU5EQU5UUykpLmlzTnVsbCgpOwotICAgICAgICBhc3NlcnRUaGF0KGZpbmROb2RlQnlSZXNvdXJjZUlkKGZpbGxSZXF1ZXN0LnN0cnVjdHVyZSwKLSAgICAgICAgICAgICAgICBJRF9OT1RfSU1QT1JUQU5UX0NPTlRBSU5FUl9NSVhFRF9ERVNDRU5EQU5UU19DSElMRCkpLmlzTm90TnVsbCgpOwotICAgICAgICBhc3NlcnRUaGF0KGZpbmROb2RlQnlSZXNvdXJjZUlkKGZpbGxSZXF1ZXN0LnN0cnVjdHVyZSwKKyAgICAgICAgYXNzZXJ0Tm9kZUV4aXN0cyhJRF9OT1RfSU1QT1JUQU5UX0NPTlRBSU5FUl9NSVhFRF9ERVNDRU5EQU5UU19DSElMRCwKKyAgICAgICAgICAgICAgICBJTVBPUlRBTlRfRk9SX0FVVE9GSUxMX1lFUyk7CisgICAgICAgIGFzc2VydFRoYXQoZmluZE5vZGVCeVJlc291cmNlSWQobVJvb3QsCiAgICAgICAgICAgICAgICAgSURfTk9UX0lNUE9SVEFOVF9DT05UQUlORVJfTUlYRURfREVTQ0VOREFOVFNfR1JBTkRfQ0hJTEQpKS5pc051bGwoKTsKKworICAgICAgICAvLyBNYWtlIHN1cmUgZW50cnkgd2l0aCBoaW50cyBpcyBhbHdheXMgc2hvd24KKyAgICAgICAgYXNzZXJ0VGhhdChmaW5kTm9kZUJ5QXV0b2ZpbGxIaW50KG1Sb290LCAiaW1wb3J0YW50QW1JIikpLmlzTm90TnVsbCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1hbnVhbFJlcXVlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gU2V0IHNlcnZpY2UuCisgICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKKworICAgICAgICAvLyBTZXQgZXhwZWN0YXRpb25zLgorICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShOT19SRVNQT05TRSk7CisKKyAgICAgICAgLy8gVHJpZ2dlciBhdXRvZmlsbC4KKyAgICAgICAgbUZhdEFjdGl2aXR5Lm9uSW5wdXQoKHYpIC0+IG1GYXRBY3Rpdml0eS5nZXRBdXRvZmlsbE1hbmFnZXIoKS5yZXF1ZXN0QXV0b2ZpbGwodikpOworICAgICAgICBmaW5hbCBGaWxsUmVxdWVzdCBmaWxsUmVxdWVzdCA9IHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOworICAgICAgICBtVWlCb3QuYXNzZXJ0Tm9EYXRhc2V0c0V2ZXIoKTsKKworICAgICAgICBtUm9vdCA9IGZpbmROb2RlQnlSZXNvdXJjZUlkKGZpbGxSZXF1ZXN0LnN0cnVjdHVyZSwgSURfUk9PVCk7CisgICAgICAgIC8qCisgICAgICAgICAqIFNob3VsZCBoYXZlIDE4IG5vZGVzOgorICAgICAgICAgKiAxLiByb290CisgICAgICAgICAqIDIuIGxheW91dCB3aXRob3V0IGlkCisgICAgICAgICAqIDMuIGxhYmVsIHdpdGhvdXQgaWQKKyAgICAgICAgICogNC4gaW5wdXRfY29udGFpbmVyCisgICAgICAgICAqIDUuIGlucHV0CisgICAgICAgICAqIDYuIGNhcHRjaGEKKyAgICAgICAgICogNy4gaW1hZ2UKKyAgICAgICAgICogOC4gaW1wb3J0YW50X2ltYWdlCisgICAgICAgICAqIDkuIG5vdF9pbXBvcnRhbnRfY29udGFpbmVyX2V4Y2x1ZGluZ19kZXNjZW5kYW50cworICAgICAgICAgKiAxMC5ub3RfaW1wb3J0YW50X2NvbnRhaW5lcl9leGNsdWRpbmdfZGVzY2VuZGFudHNfY2hpbGQKKyAgICAgICAgICogMTEubm90X2ltcG9ydGFudF9jb250YWluZXJfZXhjbHVkaW5nX2Rlc2NlbmRhbnRzX2dyYW5kX2NoaWxkCisgICAgICAgICAqIDEyLmltcG9ydGFudF9jb250YWluZXJfZXhjbHVkaW5nX2Rlc2NlbmRhbnRzCisgICAgICAgICAqIDEzLmltcG9ydGFudF9jb250YWluZXJfZXhjbHVkaW5nX2Rlc2NlbmRhbnRzX2NoaWxkCisgICAgICAgICAqIDE0LmltcG9ydGFudF9jb250YWluZXJfZXhjbHVkaW5nX2Rlc2NlbmRhbnRzX2dyYW5kX2NoaWxkCisgICAgICAgICAqIDE1Lm5vdF9pbXBvcnRhbnRfY29udGFpbmVyX21peGVkX2Rlc2NlbmRhbnRzCisgICAgICAgICAqIDE2Lm5vdF9pbXBvcnRhbnRfY29udGFpbmVyX21peGVkX2Rlc2NlbmRhbnRzX2NoaWxkCisgICAgICAgICAqIDE3Lm5vdF9pbXBvcnRhbnRfY29udGFpbmVyX21peGVkX2Rlc2NlbmRhbnRzX2dyYW5kX2NoaWxkCisgICAgICAgICAqIDE4LnZpZXcgKE15IFZpZXcpIHdpdGhvdXQgaWQgYnV0IHdpdGggaGludHMKKyAgICAgICAgICovCisgICAgICAgIGFzc2VydFRoYXQoZ2V0TnVtYmVyTm9kZXMobVJvb3QpKS5pc0VxdWFsVG8oMTgpOworCisgICAgICAgIC8vIEFzc2VydCBhbGwgbm9kZXMgYXJlIHByZXNlbnQKKyAgICAgICAgYXNzZXJ0Tm9kZUV4aXN0cyhJRF9JTUFHRSwgSU1QT1JUQU5UX0ZPUl9BVVRPRklMTF9OTyk7CisgICAgICAgIGFzc2VydE5vZGVFeGlzdHMoSURfSU1QT1JUQU5UX0lNQUdFLCBJTVBPUlRBTlRfRk9SX0FVVE9GSUxMX1lFUyk7CisKKyAgICAgICAgYXNzZXJ0Tm9kZVdpdGhUZXh0RXhpc3RzKCJMYWJlbCB3aXRoIG5vIElEIiwgSU1QT1JUQU5UX0ZPUl9BVVRPRklMTF9ZRVMpOworCisgICAgICAgIGFzc2VydE5vZGVFeGlzdHMoSURfQ0FQVENIQSwgSU1QT1JUQU5UX0ZPUl9BVVRPRklMTF9OTyk7CisKKyAgICAgICAgZmluYWwgVmlld05vZGUgaW5wdXRDb250YWluZXIgPSBhc3NlcnROb2RlRXhpc3RzKElEX0lOUFVUX0NPTlRBSU5FUiwKKyAgICAgICAgICAgICAgICBJTVBPUlRBTlRfRk9SX0FVVE9GSUxMX0FVVE8pOworICAgICAgICBhc3NlcnRUaGF0KGlucHV0Q29udGFpbmVyLmdldENoaWxkQ291bnQoKSkuaXNFcXVhbFRvKDEpOworICAgICAgICBmaW5hbCBWaWV3Tm9kZSBpbnB1dCA9IGlucHV0Q29udGFpbmVyLmdldENoaWxkQXQoMCk7CisgICAgICAgIGFzc2VydE5vZGUoaW5wdXQsIElNUE9SVEFOVF9GT1JfQVVUT0ZJTExfWUVTKTsKKyAgICAgICAgYXNzZXJ0VGhhdChpbnB1dC5nZXRJZEVudHJ5KCkpLmlzRXF1YWxUbyhJRF9JTlBVVCk7CisKKyAgICAgICAgYXNzZXJ0Tm9kZUV4aXN0cyhJRF9OT1RfSU1QT1JUQU5UX0NPTlRBSU5FUl9FWENMVURJTkdfREVTQ0VOREFOVFMsCisgICAgICAgICAgICAgICAgSU1QT1JUQU5UX0ZPUl9BVVRPRklMTF9OT19FWENMVURFX0RFU0NFTkRBTlRTKTsKKyAgICAgICAgYXNzZXJ0Tm9kZUV4aXN0cyhJRF9OT1RfSU1QT1JUQU5UX0NPTlRBSU5FUl9FWENMVURJTkdfREVTQ0VOREFOVFNfQ0hJTEQsCisgICAgICAgICAgICAgICAgSU1QT1JUQU5UX0ZPUl9BVVRPRklMTF9ZRVMpOworICAgICAgICBhc3NlcnROb2RlRXhpc3RzKElEX05PVF9JTVBPUlRBTlRfQ09OVEFJTkVSX0VYQ0xVRElOR19ERVNDRU5EQU5UU19HUkFORF9DSElMRCwKKyAgICAgICAgICAgICAgICBJTVBPUlRBTlRfRk9SX0FVVE9GSUxMX0FVVE8pOworCisgICAgICAgIGFzc2VydE5vZGVFeGlzdHMoSURfSU1QT1JUQU5UX0NPTlRBSU5FUl9FWENMVURJTkdfREVTQ0VOREFOVFMsCisgICAgICAgICAgICAgICAgSU1QT1JUQU5UX0ZPUl9BVVRPRklMTF9ZRVNfRVhDTFVERV9ERVNDRU5EQU5UUyk7CisgICAgICAgIGFzc2VydE5vZGVFeGlzdHMoSURfSU1QT1JUQU5UX0NPTlRBSU5FUl9FWENMVURJTkdfREVTQ0VOREFOVFNfQ0hJTEQsCisgICAgICAgICAgICAgICAgSU1QT1JUQU5UX0ZPUl9BVVRPRklMTF9ZRVMpOworICAgICAgICBhc3NlcnROb2RlRXhpc3RzKElEX0lNUE9SVEFOVF9DT05UQUlORVJfRVhDTFVESU5HX0RFU0NFTkRBTlRTX0dSQU5EX0NISUxELAorICAgICAgICAgICAgICAgIElNUE9SVEFOVF9GT1JfQVVUT0ZJTExfQVVUTyk7CisKKyAgICAgICAgYXNzZXJ0Tm9kZUV4aXN0cyhJRF9OT1RfSU1QT1JUQU5UX0NPTlRBSU5FUl9NSVhFRF9ERVNDRU5EQU5UUywKKyAgICAgICAgICAgICAgICBJTVBPUlRBTlRfRk9SX0FVVE9GSUxMX05PKTsKKyAgICAgICAgYXNzZXJ0Tm9kZUV4aXN0cyhJRF9OT1RfSU1QT1JUQU5UX0NPTlRBSU5FUl9NSVhFRF9ERVNDRU5EQU5UU19DSElMRCwKKyAgICAgICAgICAgICAgICBJTVBPUlRBTlRfRk9SX0FVVE9GSUxMX1lFUyk7CisgICAgICAgIGFzc2VydE5vZGVFeGlzdHMoSURfTk9UX0lNUE9SVEFOVF9DT05UQUlORVJfTUlYRURfREVTQ0VOREFOVFNfR1JBTkRfQ0hJTEQsCisgICAgICAgICAgICAgICAgSU1QT1JUQU5UX0ZPUl9BVVRPRklMTF9OTyk7CisgICAgICAgIGFzc2VydE5vZGUoZmluZE5vZGVCeUF1dG9maWxsSGludChtUm9vdCwgImltcG9ydGFudEFtSSIpLCBJTVBPUlRBTlRfRk9SX0FVVE9GSUxMX0FVVE8pOworICAgIH0KKworICAgIHByaXZhdGUgVmlld05vZGUgYXNzZXJ0Tm9kZUV4aXN0cyhTdHJpbmcgcmVzb3VyY2VJZCwgaW50IGV4cGVjdGVkSW1wb3J0YW50Rm9yQXV0b2ZpbGwpIHsKKyAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoInJvb3Qgbm9kZSBub3Qgc2V0IikudGhhdChtUm9vdCkuaXNOb3ROdWxsKCk7CisgICAgICAgIGZpbmFsIFZpZXdOb2RlIG5vZGUgPSBmaW5kTm9kZUJ5UmVzb3VyY2VJZChtUm9vdCwgcmVzb3VyY2VJZCk7CisgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJubyBub2RlIHdpdGggcmVzb3VyY2UgaWQgJyVzJyIsIHJlc291cmNlSWQpLnRoYXQobm9kZSkuaXNOb3ROdWxsKCk7CisgICAgICAgIHJldHVybiBhc3NlcnROb2RlKG5vZGUsIHJlc291cmNlSWQsIGV4cGVjdGVkSW1wb3J0YW50Rm9yQXV0b2ZpbGwpOworICAgIH0KKworICAgIHByaXZhdGUgVmlld05vZGUgYXNzZXJ0Tm9kZVdpdGhUZXh0RXhpc3RzKFN0cmluZyB0ZXh0LCBpbnQgZXhwZWN0ZWRJbXBvcnRhbnRGb3JBdXRvZmlsbCkgeworICAgICAgICBmaW5hbCBWaWV3Tm9kZSBub2RlID0gZmluZE5vZGVCeVRleHQobVJvb3QsIHRleHQpOworICAgICAgICByZXR1cm4gYXNzZXJ0Tm9kZShub2RlLCB0ZXh0LCBleHBlY3RlZEltcG9ydGFudEZvckF1dG9maWxsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFZpZXdOb2RlIGFzc2VydE5vZGUoVmlld05vZGUgbm9kZSwgaW50IGV4cGVjdGVkSW1wb3J0YW50Rm9yQXV0b2ZpbGwpIHsKKyAgICAgICAgcmV0dXJuIGFzc2VydE5vZGUobm9kZSwgbnVsbCwgZXhwZWN0ZWRJbXBvcnRhbnRGb3JBdXRvZmlsbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBWaWV3Tm9kZSBhc3NlcnROb2RlKFZpZXdOb2RlIG5vZGUsIFN0cmluZyBkZXNjLCBpbnQgZXhwZWN0ZWRJbXBvcnRhbnRGb3JBdXRvZmlsbCkgeworICAgICAgICBhc3NlcnRUaGF0KG5vZGUpLmlzTm90TnVsbCgpOworICAgICAgICBmaW5hbCBTdHJpbmcgYWN0dWFsTW9kZSA9IGltcG9ydGFudEZvckF1dG9maWxsQXNTdHJpbmcobm9kZS5nZXRJbXBvcnRhbnRGb3JBdXRvZmlsbCgpKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdGVkTW9kZSA9IGltcG9ydGFudEZvckF1dG9maWxsQXNTdHJpbmcoZXhwZWN0ZWRJbXBvcnRhbnRGb3JBdXRvZmlsbCk7CisgICAgICAgIGlmIChkZXNjICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJXcm9uZyBpbXBvcnRhbnRGb3JBdXRvZmlsbCBtb2RlIG9uICVzIiwgZGVzYykudGhhdChhY3R1YWxNb2RlKQorICAgICAgICAgICAgICAgICAgICAuaXNFcXVhbFRvKGV4cGVjdGVkTW9kZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGFjdHVhbE1vZGUpLmlzRXF1YWxUbyhleHBlY3RlZE1vZGUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5vZGU7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvRmllbGRzQ2xhc3NpZmljYXRpb25UZXN0LmphdmEgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9GaWVsZHNDbGFzc2lmaWNhdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDdhOTE0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvRmllbGRzQ2xhc3NpZmljYXRpb25UZXN0LmphdmEKQEAgLTAsMCArMSw0NzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0czsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSGVscGVyLmFzc2VydEZpbGxFdmVudEZvckNvbnRleHRDb21taXR0ZWQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5IZWxwZXIuYXNzZXJ0RmlsbEV2ZW50Rm9yRmllbGRzQ2xhc3NpZmljYXRpb247CitpbXBvcnQgc3RhdGljIGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU2VjdXJlLkFVVE9GSUxMX0ZFQVRVUkVfRklFTERfQ0xBU1NJRklDQVRJT047CitpbXBvcnQgc3RhdGljIGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU2VjdXJlLkFVVE9GSUxMX1VTRVJfREFUQV9NQVhfQ0FURUdPUllfQ09VTlQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU2VjdXJlLkFVVE9GSUxMX1VTRVJfREFUQV9NQVhfRklFTERfQ0xBU1NJRklDQVRJT05fSURTX1NJWkU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU2VjdXJlLkFVVE9GSUxMX1VTRVJfREFUQV9NQVhfVVNFUl9EQVRBX1NJWkU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU2VjdXJlLkFVVE9GSUxMX1VTRVJfREFUQV9NQVhfVkFMVUVfTEVOR1RIOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlNlY3VyZS5BVVRPRklMTF9VU0VSX0RBVEFfTUlOX1ZBTFVFX0xFTkdUSDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi50cnV0aC5UcnV0aC5hc3NlcnRUaGF0OworCitpbXBvcnQgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5GaWVsZENsYXNzaWZpY2F0aW9uUmVzdWx0OworaW1wb3J0IGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5jb21tb24uU2V0dGluZ3NTdGF0ZUNoYW5nZXJSdWxlOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKK2ltcG9ydCBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuRmlsbEV2ZW50SGlzdG9yeS5FdmVudDsKK2ltcG9ydCBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuVXNlckRhdGE7CitpbXBvcnQgYW5kcm9pZC52aWV3LmF1dG9maWxsLkF1dG9maWxsSWQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LmF1dG9maWxsLkF1dG9maWxsTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5FZGl0VGV4dDsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5DbGFzc1J1bGU7CitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworQEFwcE1vZGVGdWxsIC8vIFNlcnZpY2Utc3BlY2lmaWMgdGVzdAorcHVibGljIGNsYXNzIEZpZWxkc0NsYXNzaWZpY2F0aW9uVGVzdCBleHRlbmRzIEF1dG9GaWxsU2VydmljZVRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbnRleHQgc0NvbnRleHQgPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCk7CisKKyAgICBAQ2xhc3NSdWxlCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTZXR0aW5nc1N0YXRlQ2hhbmdlclJ1bGUgc0ZlYXR1cmVFbmFibGVyID0KKyAgICAgICAgICAgIG5ldyBTZXR0aW5nc1N0YXRlQ2hhbmdlclJ1bGUoc0NvbnRleHQsIEFVVE9GSUxMX0ZFQVRVUkVfRklFTERfQ0xBU1NJRklDQVRJT04sICIxIik7CisKKyAgICBAQ2xhc3NSdWxlCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTZXR0aW5nc1N0YXRlQ2hhbmdlclJ1bGUgc1VzZXJEYXRhTWF4RmNTaXplQ2hhbmdlciA9CisgICAgICAgICAgICBuZXcgU2V0dGluZ3NTdGF0ZUNoYW5nZXJSdWxlKHNDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICBBVVRPRklMTF9VU0VSX0RBVEFfTUFYX0ZJRUxEX0NMQVNTSUZJQ0FUSU9OX0lEU19TSVpFLCAiMTAiKTsKKworICAgIEBDbGFzc1J1bGUKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNldHRpbmdzU3RhdGVDaGFuZ2VyUnVsZSBzVXNlckRhdGFNYXhVc2VyU2l6ZUNoYW5nZXIgPQorICAgICAgICAgICAgbmV3IFNldHRpbmdzU3RhdGVDaGFuZ2VyUnVsZShzQ29udGV4dCwgQVVUT0ZJTExfVVNFUl9EQVRBX01BWF9VU0VSX0RBVEFfU0laRSwgIjkiKTsKKworICAgIEBDbGFzc1J1bGUKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNldHRpbmdzU3RhdGVDaGFuZ2VyUnVsZSBzVXNlckRhdGFNaW5WYWx1ZUNoYW5nZXIgPQorICAgICAgICAgICAgbmV3IFNldHRpbmdzU3RhdGVDaGFuZ2VyUnVsZShzQ29udGV4dCwgQVVUT0ZJTExfVVNFUl9EQVRBX01JTl9WQUxVRV9MRU5HVEgsICI1Iik7CisKKyAgICBAQ2xhc3NSdWxlCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTZXR0aW5nc1N0YXRlQ2hhbmdlclJ1bGUgc1VzZXJEYXRhTWF4VmFsdWVDaGFuZ2VyID0KKyAgICAgICAgICAgIG5ldyBTZXR0aW5nc1N0YXRlQ2hhbmdlclJ1bGUoc0NvbnRleHQsIEFVVE9GSUxMX1VTRVJfREFUQV9NQVhfVkFMVUVfTEVOR1RILCAiNTAiKTsKKworICAgIEBDbGFzc1J1bGUKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNldHRpbmdzU3RhdGVDaGFuZ2VyUnVsZSBzVXNlckRhdGFNYXhDYXRlZ29yeUNoYW5nZXIgPQorICAgICAgICAgICAgbmV3IFNldHRpbmdzU3RhdGVDaGFuZ2VyUnVsZShzQ29udGV4dCwgQVVUT0ZJTExfVVNFUl9EQVRBX01BWF9DQVRFR09SWV9DT1VOVCwgIjQyIik7CisKKyAgICBAUnVsZQorICAgIHB1YmxpYyBmaW5hbCBBdXRvZmlsbEFjdGl2aXR5VGVzdFJ1bGU8R3JpZEFjdGl2aXR5PiBtQWN0aXZpdHlSdWxlID0KKyAgICAgICAgICAgIG5ldyBBdXRvZmlsbEFjdGl2aXR5VGVzdFJ1bGU8R3JpZEFjdGl2aXR5PihHcmlkQWN0aXZpdHkuY2xhc3MpOworCisKKyAgICBwcml2YXRlIEdyaWRBY3Rpdml0eSBtQWN0aXZpdHk7CisgICAgcHJpdmF0ZSBBdXRvZmlsbE1hbmFnZXIgbUFmbTsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRGaXh0dXJlcygpIHsKKyAgICAgICAgbUFjdGl2aXR5ID0gbUFjdGl2aXR5UnVsZS5nZXRBY3Rpdml0eSgpOworICAgICAgICBtQWZtID0gbUFjdGl2aXR5LmdldEF1dG9maWxsTWFuYWdlcigpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZlYXR1cmVJc0VuYWJsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZW5hYmxlU2VydmljZSgpOworICAgICAgICBhc3NlcnRUaGF0KG1BZm0uaXNGaWVsZENsYXNzaWZpY2F0aW9uRW5hYmxlZCgpKS5pc1RydWUoKTsKKworICAgICAgICBkaXNhYmxlU2VydmljZSgpOworICAgICAgICBhc3NlcnRUaGF0KG1BZm0uaXNGaWVsZENsYXNzaWZpY2F0aW9uRW5hYmxlZCgpKS5pc0ZhbHNlKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QWxnb3JpdGhtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKKworICAgICAgICAvLyBDaGVjayBhbGdvcml0aG1zCisgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBuYW1lcyA9IG1BZm0uZ2V0QXZhaWxhYmxlRmllbGRDbGFzc2lmaWNhdGlvbkFsZ29yaXRobXMoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChuYW1lcy5zaXplKCkpLmlzQXRMZWFzdCgxKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlZmF1bHRBbGdvcml0aG0gPSBnZXREZWZhdWx0QWxnb3JpdGhtKCk7CisgICAgICAgIGFzc2VydFRoYXQoZGVmYXVsdEFsZ29yaXRobSkuaXNOb3RFbXB0eSgpOworICAgICAgICBhc3NlcnRUaGF0KG5hbWVzKS5jb250YWlucyhkZWZhdWx0QWxnb3JpdGhtKTsKKworICAgICAgICAvLyBDaGVja3MgaW52YWxpZCBzZXJ2aWNlCisgICAgICAgIGRpc2FibGVTZXJ2aWNlKCk7CisgICAgICAgIGFzc2VydFRoYXQobUFmbS5nZXRBdmFpbGFibGVGaWVsZENsYXNzaWZpY2F0aW9uQWxnb3JpdGhtcygpKS5pc0VtcHR5KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXNlckRhdGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0VGhhdChtQWZtLmdldFVzZXJEYXRhKCkpLmlzTnVsbCgpOworICAgICAgICBhc3NlcnRUaGF0KG1BZm0uZ2V0VXNlckRhdGFJZCgpKS5pc051bGwoKTsKKworICAgICAgICBlbmFibGVTZXJ2aWNlKCk7CisgICAgICAgIG1BZm0uc2V0VXNlckRhdGEobmV3IFVzZXJEYXRhLkJ1aWxkZXIoInVzZXJfZGF0YV9pZCIsICJ2YWx1ZSIsICJyZW1vdGVfaWQiKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtQWZtLmdldFVzZXJEYXRhSWQoKSkuaXNFcXVhbFRvKCJ1c2VyX2RhdGFfaWQiKTsKKyAgICAgICAgZmluYWwgVXNlckRhdGEgdXNlckRhdGEgPSBtQWZtLmdldFVzZXJEYXRhKCk7CisgICAgICAgIGFzc2VydFRoYXQodXNlckRhdGEuZ2V0SWQoKSkuaXNFcXVhbFRvKCJ1c2VyX2RhdGFfaWQiKTsKKyAgICAgICAgYXNzZXJ0VGhhdCh1c2VyRGF0YS5nZXRGaWVsZENsYXNzaWZpY2F0aW9uQWxnb3JpdGhtKCkpLmlzTnVsbCgpOworCisgICAgICAgIGRpc2FibGVTZXJ2aWNlKCk7CisgICAgICAgIGFzc2VydFRoYXQobUFmbS5nZXRVc2VyRGF0YSgpKS5pc051bGwoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtQWZtLmdldFVzZXJEYXRhSWQoKSkuaXNOdWxsKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXNlckRhdGFDb25zdHJhaW50cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBOT1RFOiB2YWx1ZXMgc2V0IGJ5IHRoZSBTZXR0aW5nc1N0YXRlQ2hhbmdlclJ1bGUgQFJ1bGVzIHNob3VsZCBoYXZlIHVuaXF1ZSB2YWx1ZXMgdG8KKyAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBnZXR0ZXJzIGJlbG93IGFyZSByZWFkaW5nIHRoZSByaWdodCBwcm9wZXJ0eS4KKyAgICAgICAgYXNzZXJ0VGhhdChVc2VyRGF0YS5nZXRNYXhGaWVsZENsYXNzaWZpY2F0aW9uSWRzU2l6ZSgpKS5pc0VxdWFsVG8oMTApOworICAgICAgICBhc3NlcnRUaGF0KFVzZXJEYXRhLmdldE1heFVzZXJEYXRhU2l6ZSgpKS5pc0VxdWFsVG8oOSk7CisgICAgICAgIGFzc2VydFRoYXQoVXNlckRhdGEuZ2V0TWluVmFsdWVMZW5ndGgoKSkuaXNFcXVhbFRvKDUpOworICAgICAgICBhc3NlcnRUaGF0KFVzZXJEYXRhLmdldE1heFZhbHVlTGVuZ3RoKCkpLmlzRXF1YWxUbyg1MCk7CisgICAgICAgIGFzc2VydFRoYXQoVXNlckRhdGEuZ2V0TWF4Q2F0ZWdvcnlDb3VudCgpKS5pc0VxdWFsVG8oNDIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEhpdF9vbmVVc2VyRGF0YV9vbmVEZXRlY3RhYmxlRmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc2ltcGxlSGl0VGVzdChmYWxzZSwgbnVsbCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGl0X2ludmFsaWRBbGdvcml0aG1Jc0lnbm9yZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gRm9yIHNpbXBsaWNpdHkncyBzYWtlLCBsZXQncyBhc3N1bWUgdGhhdCBuYW1lIHdpbGwgbmV2ZXIgYmUgdmFsaWQuLgorICAgICAgICBTdHJpbmcgaW52YWxpZE5hbWUgPSAiIEFMR09SSVRITSwgWSBOTyBJTlZBTElEPyAiOworCisgICAgICAgIHNpbXBsZUhpdFRlc3QodHJ1ZSwgaW52YWxpZE5hbWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEhpdF91c2VyRGF0YUFsZ29yaXRobUlzUmVzZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc2ltcGxlSGl0VGVzdCh0cnVlLCBudWxsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2ltcGxlSGl0VGVzdChib29sZWFuIHNldEFsZ29yaXRobSwgU3RyaW5nIGFsZ29yaXRobSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFNldCBzZXJ2aWNlLgorICAgICAgICBlbmFibGVTZXJ2aWNlKCk7CisKKyAgICAgICAgLy8gU2V0IGV4cGVjdGF0aW9ucy4KKyAgICAgICAgZmluYWwgVXNlckRhdGEuQnVpbGRlciB1c2VyRGF0YSA9IG5ldyBVc2VyRGF0YS5CdWlsZGVyKCJpZCIsICJGVUxMWSIsICJteUlkIik7CisgICAgICAgIGlmIChzZXRBbGdvcml0aG0pIHsKKyAgICAgICAgICAgIHVzZXJEYXRhLnNldEZpZWxkQ2xhc3NpZmljYXRpb25BbGdvcml0aG0oYWxnb3JpdGhtLCBudWxsKTsKKyAgICAgICAgfQorICAgICAgICBtQWZtLnNldFVzZXJEYXRhKHVzZXJEYXRhLmJ1aWxkKCkpOworICAgICAgICBmaW5hbCBNeUF1dG9maWxsQ2FsbGJhY2sgY2FsbGJhY2sgPSBtQWN0aXZpdHkucmVnaXN0ZXJDYWxsYmFjaygpOworICAgICAgICBmaW5hbCBFZGl0VGV4dCBmaWVsZCA9IG1BY3Rpdml0eS5nZXRDZWxsKDEsIDEpOworICAgICAgICBmaW5hbCBBdXRvZmlsbElkIGZpZWxkSWQgPSBmaWVsZC5nZXRBdXRvZmlsbElkKCk7CisgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldEZpZWxkQ2xhc3NpZmljYXRpb25JZHMoZmllbGRJZCkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gVHJpZ2dlciBhdXRvZmlsbAorICAgICAgICBtQWN0aXZpdHkuZm9jdXNDZWxsKDEsIDEpOworICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKKworICAgICAgICBtVWlCb3QuYXNzZXJ0Tm9EYXRhc2V0c0V2ZXIoKTsKKyAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlVbmF2YWlsYWJsZUV2ZW50KGZpZWxkKTsKKworICAgICAgICAvLyBTaW11bGF0ZSB1c2VyIGlucHV0CisgICAgICAgIG1BY3Rpdml0eS5zZXRUZXh0KDEsIDEsICJmdWxseSIpOworCisgICAgICAgIC8vIEZpbmlzaCBjb250ZXh0LgorICAgICAgICBtQWZtLmNvbW1pdCgpOworCisgICAgICAgIC8vIEFzc2VydCByZXN1bHRzCisgICAgICAgIGZpbmFsIExpc3Q8RXZlbnQ+IGV2ZW50cyA9IEluc3RydW1lbnRlZEF1dG9GaWxsU2VydmljZS5nZXRGaWxsRXZlbnRzKDEpOworICAgICAgICBhc3NlcnRGaWxsRXZlbnRGb3JGaWVsZHNDbGFzc2lmaWNhdGlvbihldmVudHMuZ2V0KDApLCBmaWVsZElkLCAibXlJZCIsIDEpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEhpdF9tYW55VXNlckRhdGFfb25lRGV0ZWN0YWJsZUZpZWxkX2Jlc3RNYXRjaElzRmlyc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbWFueVVzZXJEYXRhX29uZURldGVjdGFibGVGaWVsZCh0cnVlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIaXRfbWFueVVzZXJEYXRhX29uZURldGVjdGFibGVGaWVsZF9iZXN0TWF0Y2hJc1NlY29uZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtYW55VXNlckRhdGFfb25lRGV0ZWN0YWJsZUZpZWxkKGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbWFueVVzZXJEYXRhX29uZURldGVjdGFibGVGaWVsZChib29sZWFuIGZpcnN0TWF0Y2gpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBTZXQgc2VydmljZS4KKyAgICAgICAgZW5hYmxlU2VydmljZSgpOworCisgICAgICAgIC8vIFNldCBleHBlY3RhdGlvbnMuCisgICAgICAgIG1BZm0uc2V0VXNlckRhdGEobmV3IFVzZXJEYXRhLkJ1aWxkZXIoImlkIiwgIklhbTFTVCIsICIxc3RJZCIpCisgICAgICAgICAgICAgICAgLmFkZCgiSWFtMk5EIiwgIjJuZElkIikuYnVpbGQoKSk7CisgICAgICAgIGZpbmFsIE15QXV0b2ZpbGxDYWxsYmFjayBjYWxsYmFjayA9IG1BY3Rpdml0eS5yZWdpc3RlckNhbGxiYWNrKCk7CisgICAgICAgIGZpbmFsIEVkaXRUZXh0IGZpZWxkID0gbUFjdGl2aXR5LmdldENlbGwoMSwgMSk7CisgICAgICAgIGZpbmFsIEF1dG9maWxsSWQgZmllbGRJZCA9IGZpZWxkLmdldEF1dG9maWxsSWQoKTsKKyAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UobmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0RmllbGRDbGFzc2lmaWNhdGlvbklkcyhmaWVsZElkKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAvLyBUcmlnZ2VyIGF1dG9maWxsCisgICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoMSwgMSk7CisgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOworCisgICAgICAgIG1VaUJvdC5hc3NlcnROb0RhdGFzZXRzRXZlcigpOworICAgICAgICBjYWxsYmFjay5hc3NlcnRVaVVuYXZhaWxhYmxlRXZlbnQoZmllbGQpOworCisgICAgICAgIC8vIFNpbXVsYXRlIHVzZXIgaW5wdXQKKyAgICAgICAgbUFjdGl2aXR5LnNldFRleHQoMSwgMSwgZmlyc3RNYXRjaCA/ICJJQU0xMTEiIDogIklBTTIyMiIpOworCisgICAgICAgIC8vIEZpbmlzaCBjb250ZXh0LgorICAgICAgICBtQWZtLmNvbW1pdCgpOworCisgICAgICAgIC8vIEFzc2VydCByZXN1bHRzCisgICAgICAgIGZpbmFsIExpc3Q8RXZlbnQ+IGV2ZW50cyA9IEluc3RydW1lbnRlZEF1dG9GaWxsU2VydmljZS5nZXRGaWxsRXZlbnRzKDEpOworICAgICAgICAvLyBCZXN0IG1hdGNoIGlzIDAuNjYgKDQgb2YgNiksIHdvcnN0IGlzIDAuNSAoMyBvZiA2KQorICAgICAgICBpZiAoZmlyc3RNYXRjaCkgeworICAgICAgICAgICAgYXNzZXJ0RmlsbEV2ZW50Rm9yRmllbGRzQ2xhc3NpZmljYXRpb24oZXZlbnRzLmdldCgwKSwgbmV3IEZpZWxkQ2xhc3NpZmljYXRpb25SZXN1bHRbXSB7CisgICAgICAgICAgICAgICAgICAgIG5ldyBGaWVsZENsYXNzaWZpY2F0aW9uUmVzdWx0KGZpZWxkSWQsIG5ldyBTdHJpbmdbXSB7ICIxc3RJZCIsICIybmRJZCIgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgZmxvYXRbXSB7IDAuNjZGLCAwLjVGIH0pfSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhc3NlcnRGaWxsRXZlbnRGb3JGaWVsZHNDbGFzc2lmaWNhdGlvbihldmVudHMuZ2V0KDApLCBuZXcgRmllbGRDbGFzc2lmaWNhdGlvblJlc3VsdFtdIHsKKyAgICAgICAgICAgICAgICAgICAgbmV3IEZpZWxkQ2xhc3NpZmljYXRpb25SZXN1bHQoZmllbGRJZCwgbmV3IFN0cmluZ1tdIHsgIjJuZElkIiwgIjFzdElkIiB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBmbG9hdFtdIHsgMC42NkYsIDAuNUYgfSkgfSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIaXRfb25lVXNlckRhdGFfbWFueURldGVjdGFibGVGaWVsZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gU2V0IHNlcnZpY2UuCisgICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKKworICAgICAgICAvLyBTZXQgZXhwZWN0YXRpb25zLgorICAgICAgICBtQWZtLnNldFVzZXJEYXRhKG5ldyBVc2VyRGF0YS5CdWlsZGVyKCJpZCIsICJGVUxMWSIsICJteUlkIikuYnVpbGQoKSk7CisgICAgICAgIGZpbmFsIE15QXV0b2ZpbGxDYWxsYmFjayBjYWxsYmFjayA9IG1BY3Rpdml0eS5yZWdpc3RlckNhbGxiYWNrKCk7CisgICAgICAgIGZpbmFsIEVkaXRUZXh0IGZpZWxkMSA9IG1BY3Rpdml0eS5nZXRDZWxsKDEsIDEpOworICAgICAgICBmaW5hbCBBdXRvZmlsbElkIGZpZWxkSWQxID0gZmllbGQxLmdldEF1dG9maWxsSWQoKTsKKyAgICAgICAgZmluYWwgRWRpdFRleHQgZmllbGQyID0gbUFjdGl2aXR5LmdldENlbGwoMSwgMik7CisgICAgICAgIGZpbmFsIEF1dG9maWxsSWQgZmllbGRJZDIgPSBmaWVsZDIuZ2V0QXV0b2ZpbGxJZCgpOworICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRGaWVsZENsYXNzaWZpY2F0aW9uSWRzKGZpZWxkSWQxLCBmaWVsZElkMikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gVHJpZ2dlciBhdXRvZmlsbAorICAgICAgICBtQWN0aXZpdHkuZm9jdXNDZWxsKDEsIDEpOworICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKKworICAgICAgICBtVWlCb3QuYXNzZXJ0Tm9EYXRhc2V0c0V2ZXIoKTsKKyAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlVbmF2YWlsYWJsZUV2ZW50KGZpZWxkMSk7CisKKyAgICAgICAgLy8gU2ltdWxhdGUgdXNlciBpbnB1dAorICAgICAgICBtQWN0aXZpdHkuc2V0VGV4dCgxLCAxLCAiZnVsbHkiKTsgLy8gMTAwJQorICAgICAgICBtQWN0aXZpdHkuc2V0VGV4dCgxLCAyLCAiZm9vbHkiKTsgLy8gNjAlCisKKyAgICAgICAgLy8gRmluaXNoIGNvbnRleHQuCisgICAgICAgIG1BZm0uY29tbWl0KCk7CisKKyAgICAgICAgLy8gQXNzZXJ0IHJlc3VsdHMKKyAgICAgICAgZmluYWwgTGlzdDxFdmVudD4gZXZlbnRzID0gSW5zdHJ1bWVudGVkQXV0b0ZpbGxTZXJ2aWNlLmdldEZpbGxFdmVudHMoMSk7CisgICAgICAgIGFzc2VydEZpbGxFdmVudEZvckZpZWxkc0NsYXNzaWZpY2F0aW9uKGV2ZW50cy5nZXQoMCksCisgICAgICAgICAgICAgICAgbmV3IEZpZWxkQ2xhc3NpZmljYXRpb25SZXN1bHRbXSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmllbGRDbGFzc2lmaWNhdGlvblJlc3VsdChmaWVsZElkMSwgIm15SWQiLCAxLjBGKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWVsZENsYXNzaWZpY2F0aW9uUmVzdWx0KGZpZWxkSWQyLCAibXlJZCIsIDAuNkYpLAorICAgICAgICAgICAgICAgIH0pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEhpdF9tYW55VXNlckRhdGFfbWFueURldGVjdGFibGVGaWVsZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gU2V0IHNlcnZpY2UuCisgICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKKworICAgICAgICAvLyBTZXQgZXhwZWN0YXRpb25zLgorICAgICAgICBtQWZtLnNldFVzZXJEYXRhKG5ldyBVc2VyRGF0YS5CdWlsZGVyKCJpZCIsICJGVUxMWSIsICJteUlkIikKKyAgICAgICAgICAgICAgICAuYWRkKCJaWlpaWlpaWlpaIiwgInRvdGFsTWlzcyIpIC8vIHNob3VsZCBub3QgaGF2ZSBtYXRjaGVkIGFueQorICAgICAgICAgICAgICAgIC5hZGQoIkVNUFRZIiwgIm90aGVySWQiKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgZmluYWwgTXlBdXRvZmlsbENhbGxiYWNrIGNhbGxiYWNrID0gbUFjdGl2aXR5LnJlZ2lzdGVyQ2FsbGJhY2soKTsKKyAgICAgICAgZmluYWwgRWRpdFRleHQgZmllbGQxID0gbUFjdGl2aXR5LmdldENlbGwoMSwgMSk7CisgICAgICAgIGZpbmFsIEF1dG9maWxsSWQgZmllbGRJZDEgPSBmaWVsZDEuZ2V0QXV0b2ZpbGxJZCgpOworICAgICAgICBmaW5hbCBFZGl0VGV4dCBmaWVsZDIgPSBtQWN0aXZpdHkuZ2V0Q2VsbCgxLCAyKTsKKyAgICAgICAgZmluYWwgQXV0b2ZpbGxJZCBmaWVsZElkMiA9IGZpZWxkMi5nZXRBdXRvZmlsbElkKCk7CisgICAgICAgIGZpbmFsIEVkaXRUZXh0IGZpZWxkMyA9IG1BY3Rpdml0eS5nZXRDZWxsKDIsIDEpOworICAgICAgICBmaW5hbCBBdXRvZmlsbElkIGZpZWxkSWQzID0gZmllbGQzLmdldEF1dG9maWxsSWQoKTsKKyAgICAgICAgZmluYWwgRWRpdFRleHQgZmllbGQ0ID0gbUFjdGl2aXR5LmdldENlbGwoMiwgMik7CisgICAgICAgIGZpbmFsIEF1dG9maWxsSWQgZmllbGRJZDQgPSBmaWVsZDQuZ2V0QXV0b2ZpbGxJZCgpOworICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRGaWVsZENsYXNzaWZpY2F0aW9uSWRzKGZpZWxkSWQxLCBmaWVsZElkMikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gVHJpZ2dlciBhdXRvZmlsbAorICAgICAgICBtQWN0aXZpdHkuZm9jdXNDZWxsKDEsIDEpOworICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKKworICAgICAgICBtVWlCb3QuYXNzZXJ0Tm9EYXRhc2V0c0V2ZXIoKTsKKyAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlVbmF2YWlsYWJsZUV2ZW50KGZpZWxkMSk7CisKKyAgICAgICAgLy8gU2ltdWxhdGUgdXNlciBpbnB1dAorICAgICAgICBtQWN0aXZpdHkuc2V0VGV4dCgxLCAxLCAiZnVsbHkiKTsgLy8gdTE6IDEwMCUgdTI6ICAyMCUKKyAgICAgICAgbUFjdGl2aXR5LnNldFRleHQoMSwgMiwgImVtcHR5Iik7IC8vIHUxOiAgMjAlIHUyOiAxMDAlCisgICAgICAgIG1BY3Rpdml0eS5zZXRUZXh0KDIsIDEsICJmb29seSIpOyAvLyB1MTogIDYwJSB1MjogIDIwJQorICAgICAgICBtQWN0aXZpdHkuc2V0VGV4dCgyLCAyLCAiZW1wcHkiKTsgLy8gdTE6ICAyMCUgdTI6ICA4MCUKKworICAgICAgICAvLyBGaW5pc2ggY29udGV4dC4KKyAgICAgICAgbUFmbS5jb21taXQoKTsKKworICAgICAgICAvLyBBc3NlcnQgcmVzdWx0cworICAgICAgICBmaW5hbCBMaXN0PEV2ZW50PiBldmVudHMgPSBJbnN0cnVtZW50ZWRBdXRvRmlsbFNlcnZpY2UuZ2V0RmlsbEV2ZW50cygxKTsKKyAgICAgICAgYXNzZXJ0RmlsbEV2ZW50Rm9yRmllbGRzQ2xhc3NpZmljYXRpb24oZXZlbnRzLmdldCgwKSwKKyAgICAgICAgICAgICAgICBuZXcgRmllbGRDbGFzc2lmaWNhdGlvblJlc3VsdFtdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWVsZENsYXNzaWZpY2F0aW9uUmVzdWx0KGZpZWxkSWQxLCBuZXcgU3RyaW5nW10geyAibXlJZCIsICJvdGhlcklkIiB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgZmxvYXRbXSB7IDEuMEYsIDAuMkYgfSksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmllbGRDbGFzc2lmaWNhdGlvblJlc3VsdChmaWVsZElkMiwgbmV3IFN0cmluZ1tdIHsgIm90aGVySWQiLCAibXlJZCIgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGZsb2F0W10geyAxLjBGLCAwLjJGIH0pLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpZWxkQ2xhc3NpZmljYXRpb25SZXN1bHQoZmllbGRJZDMsIG5ldyBTdHJpbmdbXSB7ICJteUlkIiwgIm90aGVySWQiIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBmbG9hdFtdIHsgMC42RiwgMC4yRiB9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWVsZENsYXNzaWZpY2F0aW9uUmVzdWx0KGZpZWxkSWQ0LCBuZXcgU3RyaW5nW10geyAib3RoZXJJZCIsICJteUlkIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBmbG9hdFtdIHsgMC44MEYsIDAuMkYgfSl9KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIaXRfbWFueVVzZXJEYXRhUGVyRmllbGRfbWFueURldGVjdGFibGVGaWVsZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gU2V0IHNlcnZpY2UuCisgICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKKworICAgICAgICAvLyBTZXQgZXhwZWN0YXRpb25zLgorICAgICAgICBtQWZtLnNldFVzZXJEYXRhKG5ldyBVc2VyRGF0YS5CdWlsZGVyKCJpZCIsICJ6enp6eiIsICJteUlkIikgLy8gc2hvdWxkIG5vdCBoYXZlIG1hdGNoZWQgYW55CisgICAgICAgICAgICAgICAgLmFkZCgiRlVMTDEiLCAibXlJZCIpIC8vIG1hdGNoIDgwJSwgc2hvdWxkIG5vdCBoYXZlIGJlZW4gcmVwb3J0ZWQKKyAgICAgICAgICAgICAgICAuYWRkKCJGVUxMWSIsICJteUlkIikgLy8gbWF0Y2ggMTAwJQorICAgICAgICAgICAgICAgIC5hZGQoIlpaWlpaWlpaWloiLCAidG90YWxNaXNzIikgLy8gc2hvdWxkIG5vdCBoYXZlIG1hdGNoZWQgYW55CisgICAgICAgICAgICAgICAgLmFkZCgiRU1QVFkiLCAib3RoZXJJZCIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICBmaW5hbCBNeUF1dG9maWxsQ2FsbGJhY2sgY2FsbGJhY2sgPSBtQWN0aXZpdHkucmVnaXN0ZXJDYWxsYmFjaygpOworICAgICAgICBmaW5hbCBFZGl0VGV4dCBmaWVsZDEgPSBtQWN0aXZpdHkuZ2V0Q2VsbCgxLCAxKTsKKyAgICAgICAgZmluYWwgQXV0b2ZpbGxJZCBmaWVsZElkMSA9IGZpZWxkMS5nZXRBdXRvZmlsbElkKCk7CisgICAgICAgIGZpbmFsIEVkaXRUZXh0IGZpZWxkMiA9IG1BY3Rpdml0eS5nZXRDZWxsKDEsIDIpOworICAgICAgICBmaW5hbCBBdXRvZmlsbElkIGZpZWxkSWQyID0gZmllbGQyLmdldEF1dG9maWxsSWQoKTsKKyAgICAgICAgZmluYWwgRWRpdFRleHQgZmllbGQzID0gbUFjdGl2aXR5LmdldENlbGwoMiwgMSk7CisgICAgICAgIGZpbmFsIEF1dG9maWxsSWQgZmllbGRJZDMgPSBmaWVsZDMuZ2V0QXV0b2ZpbGxJZCgpOworICAgICAgICBmaW5hbCBFZGl0VGV4dCBmaWVsZDQgPSBtQWN0aXZpdHkuZ2V0Q2VsbCgyLCAyKTsKKyAgICAgICAgZmluYWwgQXV0b2ZpbGxJZCBmaWVsZElkNCA9IGZpZWxkNC5nZXRBdXRvZmlsbElkKCk7CisgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldEZpZWxkQ2xhc3NpZmljYXRpb25JZHMoZmllbGRJZDEsIGZpZWxkSWQyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAvLyBUcmlnZ2VyIGF1dG9maWxsCisgICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoMSwgMSk7CisgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOworCisgICAgICAgIG1VaUJvdC5hc3NlcnROb0RhdGFzZXRzRXZlcigpOworICAgICAgICBjYWxsYmFjay5hc3NlcnRVaVVuYXZhaWxhYmxlRXZlbnQoZmllbGQxKTsKKworICAgICAgICAvLyBTaW11bGF0ZSB1c2VyIGlucHV0CisgICAgICAgIG1BY3Rpdml0eS5zZXRUZXh0KDEsIDEsICJmdWxseSIpOyAvLyB1MTogMTAwJSB1MjogIDIwJQorICAgICAgICBtQWN0aXZpdHkuc2V0VGV4dCgxLCAyLCAiZW1wdHkiKTsgLy8gdTE6ICAyMCUgdTI6IDEwMCUKKyAgICAgICAgbUFjdGl2aXR5LnNldFRleHQoMiwgMSwgImZvb2x5Iik7IC8vIHUxOiAgNjAlIHUyOiAgMjAlCisgICAgICAgIG1BY3Rpdml0eS5zZXRUZXh0KDIsIDIsICJlbXBweSIpOyAvLyB1MTogIDIwJSB1MjogIDgwJQorCisgICAgICAgIC8vIEZpbmlzaCBjb250ZXh0LgorICAgICAgICBtQWZtLmNvbW1pdCgpOworCisgICAgICAgIC8vIEFzc2VydCByZXN1bHRzCisgICAgICAgIGZpbmFsIExpc3Q8RXZlbnQ+IGV2ZW50cyA9IEluc3RydW1lbnRlZEF1dG9GaWxsU2VydmljZS5nZXRGaWxsRXZlbnRzKDEpOworICAgICAgICBhc3NlcnRGaWxsRXZlbnRGb3JGaWVsZHNDbGFzc2lmaWNhdGlvbihldmVudHMuZ2V0KDApLAorICAgICAgICAgICAgICAgIG5ldyBGaWVsZENsYXNzaWZpY2F0aW9uUmVzdWx0W10geworICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpZWxkQ2xhc3NpZmljYXRpb25SZXN1bHQoZmllbGRJZDEsIG5ldyBTdHJpbmdbXSB7ICJteUlkIiwgIm90aGVySWQiIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBmbG9hdFtdIHsgMS4wRiwgMC4yRiB9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWVsZENsYXNzaWZpY2F0aW9uUmVzdWx0KGZpZWxkSWQyLCBuZXcgU3RyaW5nW10geyAib3RoZXJJZCIsICJteUlkIiB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgZmxvYXRbXSB7IDEuMEYsIDAuMkYgfSksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmllbGRDbGFzc2lmaWNhdGlvblJlc3VsdChmaWVsZElkMywgbmV3IFN0cmluZ1tdIHsgIm15SWQiLCAib3RoZXJJZCIgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGZsb2F0W10geyAwLjZGLCAwLjJGIH0pLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpZWxkQ2xhc3NpZmljYXRpb25SZXN1bHQoZmllbGRJZDQsIG5ldyBTdHJpbmdbXSB7ICJvdGhlcklkIiwgIm15SWQifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGZsb2F0W10geyAwLjgwRiwgMC4yRiB9KX0pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1pc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gU2V0IHNlcnZpY2UuCisgICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKKworICAgICAgICAvLyBTZXQgZXhwZWN0YXRpb25zLgorICAgICAgICBtQWZtLnNldFVzZXJEYXRhKG5ldyBVc2VyRGF0YS5CdWlsZGVyKCJpZCIsICJBQkNERUYiLCAibXlJZCIpLmJ1aWxkKCkpOworICAgICAgICBmaW5hbCBNeUF1dG9maWxsQ2FsbGJhY2sgY2FsbGJhY2sgPSBtQWN0aXZpdHkucmVnaXN0ZXJDYWxsYmFjaygpOworICAgICAgICBmaW5hbCBFZGl0VGV4dCBmaWVsZCA9IG1BY3Rpdml0eS5nZXRDZWxsKDEsIDEpOworICAgICAgICBmaW5hbCBBdXRvZmlsbElkIGZpZWxkSWQgPSBmaWVsZC5nZXRBdXRvZmlsbElkKCk7CisgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldEZpZWxkQ2xhc3NpZmljYXRpb25JZHMoZmllbGRJZCkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gVHJpZ2dlciBhdXRvZmlsbAorICAgICAgICBtQWN0aXZpdHkuZm9jdXNDZWxsKDEsIDEpOworICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKKworICAgICAgICBtVWlCb3QuYXNzZXJ0Tm9EYXRhc2V0c0V2ZXIoKTsKKyAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlVbmF2YWlsYWJsZUV2ZW50KGZpZWxkKTsKKworICAgICAgICAvLyBTaW11bGF0ZSB1c2VyIGlucHV0CisgICAgICAgIG1BY3Rpdml0eS5zZXRUZXh0KDEsIDEsICJ4eXoiKTsKKworICAgICAgICAvLyBGaW5pc2ggY29udGV4dC4KKyAgICAgICAgbUFmbS5jb21taXQoKTsKKworICAgICAgICAvLyBBc3NlcnQgcmVzdWx0cworICAgICAgICBmaW5hbCBMaXN0PEV2ZW50PiBldmVudHMgPSBJbnN0cnVtZW50ZWRBdXRvRmlsbFNlcnZpY2UuZ2V0RmlsbEV2ZW50cygxKTsKKyAgICAgICAgYXNzZXJ0RmlsbEV2ZW50Rm9yQ29udGV4dENvbW1pdHRlZChldmVudHMuZ2V0KDApKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb1VzZXJJbnB1dCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBTZXQgc2VydmljZS4KKyAgICAgICAgZW5hYmxlU2VydmljZSgpOworCisgICAgICAgIC8vIFNldCBleHBlY3RhdGlvbnMuCisgICAgICAgIG1BZm0uc2V0VXNlckRhdGEobmV3IFVzZXJEYXRhLkJ1aWxkZXIoImlkIiwgIkZVTExZIiwgIm15SWQiKS5idWlsZCgpKTsKKyAgICAgICAgZmluYWwgTXlBdXRvZmlsbENhbGxiYWNrIGNhbGxiYWNrID0gbUFjdGl2aXR5LnJlZ2lzdGVyQ2FsbGJhY2soKTsKKyAgICAgICAgZmluYWwgRWRpdFRleHQgZmllbGQgPSBtQWN0aXZpdHkuZ2V0Q2VsbCgxLCAxKTsKKyAgICAgICAgZmluYWwgQXV0b2ZpbGxJZCBmaWVsZElkID0gZmllbGQuZ2V0QXV0b2ZpbGxJZCgpOworICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRGaWVsZENsYXNzaWZpY2F0aW9uSWRzKGZpZWxkSWQpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIC8vIFRyaWdnZXIgYXV0b2ZpbGwKKyAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgxLCAxKTsKKyAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CisKKyAgICAgICAgbVVpQm90LmFzc2VydE5vRGF0YXNldHNFdmVyKCk7CisgICAgICAgIGNhbGxiYWNrLmFzc2VydFVpVW5hdmFpbGFibGVFdmVudChmaWVsZCk7CisKKyAgICAgICAgLy8gRmluaXNoIGNvbnRleHQuCisgICAgICAgIG1BZm0uY29tbWl0KCk7CisKKyAgICAgICAgLy8gQXNzZXJ0IHJlc3VsdHMKKyAgICAgICAgZmluYWwgTGlzdDxFdmVudD4gZXZlbnRzID0gSW5zdHJ1bWVudGVkQXV0b0ZpbGxTZXJ2aWNlLmdldEZpbGxFdmVudHMoMSk7CisgICAgICAgIGFzc2VydEZpbGxFdmVudEZvckNvbnRleHRDb21taXR0ZWQoZXZlbnRzLmdldCgwKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RGVmYXVsdEFsZ29yaXRobSgpIHsKKyAgICAgICAgcmV0dXJuIG1BZm0uZ2V0RGVmYXVsdEZpZWxkQ2xhc3NpZmljYXRpb25BbGdvcml0aG0oKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFRPRE8oYi83MzY0ODYzMSk6IG90aGVyIHNjZW5hcmlvczoKKyAgICAgKgorICAgICAqIC0gTXVsdGlwYXJ0aXRpb24gKGZvciBleGFtcGxlLCBvbmUgcmVzcG9uc2Ugd2l0aCBGaWVsZHNEZXRlY3Rpb24sIG90aGVycyB3aXRoIGRhdGFzZXRzLAorICAgICAqICAgc2F2ZWluZm8sIGFuZC9vciBpZ25vcmVkSWRzKQorICAgICAqIC0gbWFrZSBzdXJlIGRldGVjdGFibGUgZmllbGRzIGRvbid0IHRyaWdnZXIgYSBuZXcgcGFydGl0aW9uCisgICAgICogdiB0ZXN0IHBhcnRpYWwgaGl0IChmb3IgZXhhbXBsZSwgJ2Zvb2wnIGluc3RlYWQgb2YgJ2Z1bGwnCisgICAgICogdiBtdWx0aXBsZSBmaWVsZHMKKyAgICAgKiB2IG11bHRpcGxlIHZhbHVlCisgICAgICogLSBjb21iaW5hdGlvbnMgb2YgYWJvdmUgaXRlbXMKKyAgICAgKi8KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0ZpbGxFdmVudEhpc3RvcnlUZXN0LmphdmEgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9GaWxsRXZlbnRIaXN0b3J5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlYWI5MmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9GaWxsRXZlbnRIaXN0b3J5VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTE5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5DYW5uZWRGaWxsUmVzcG9uc2UuRE9fTk9UX1JFUExZX1JFU1BPTlNFOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuQ2FubmVkRmlsbFJlc3BvbnNlLk5PX1JFU1BPTlNFOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuQ2hlY2tvdXRBY3Rpdml0eS5JRF9DQ19OVU1CRVI7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5IZWxwZXIuSURfUEFTU1dPUkQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5IZWxwZXIuSURfVVNFUk5BTUU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5IZWxwZXIuTlVMTF9EQVRBU0VUX0lEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSGVscGVyLmFzc2VydERlcHJlY2F0ZWRDbGllbnRTdGF0ZTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5hc3NlcnRGaWxsRXZlbnRGb3JBdXRoZW50aWNhdGlvblNlbGVjdGVkOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSGVscGVyLmFzc2VydEZpbGxFdmVudEZvckRhdGFzZXRBdXRoZW50aWNhdGlvblNlbGVjdGVkOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSGVscGVyLmFzc2VydEZpbGxFdmVudEZvckRhdGFzZXRTZWxlY3RlZDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5hc3NlcnRGaWxsRXZlbnRGb3JTYXZlU2hvd247CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5IZWxwZXIuYXNzZXJ0Tm9EZXByZWNhdGVkQ2xpZW50U3RhdGU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5JbnN0cnVtZW50ZWRBdXRvRmlsbFNlcnZpY2Uud2FpdFVudGlsQ29ubmVjdGVkOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSW5zdHJ1bWVudGVkQXV0b0ZpbGxTZXJ2aWNlLndhaXRVbnRpbERpc2Nvbm5lY3RlZDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkxvZ2luQWN0aXZpdHkuQkFDS0RPT1JfVVNFUk5BTUU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5Mb2dpbkFjdGl2aXR5LmdldFdlbGNvbWVNZXNzYWdlOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuRmlsbEV2ZW50SGlzdG9yeS5FdmVudC5UWVBFX0NPTlRFWFRfQ09NTUlUVEVEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuU2F2ZUluZm8uU0FWRV9EQVRBX1RZUEVfR0VORVJJQzsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2aWNlLmF1dG9maWxsLlNhdmVJbmZvLlNBVkVfREFUQV9UWVBFX1BBU1NXT1JEOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLnRydXRoLlRydXRoLmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLnRydXRoLlRydXRoLmFzc2VydFdpdGhNZXNzYWdlOworCitpbXBvcnQgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkNhbm5lZEZpbGxSZXNwb25zZS5DYW5uZWREYXRhc2V0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudFNlbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CitpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLmF1dG9maWxsLkZpbGxFdmVudEhpc3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLmF1dG9maWxsLkZpbGxFdmVudEhpc3RvcnkuRXZlbnQ7CitpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLmF1dG9maWxsLkZpbGxSZXNwb25zZTsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC51aWF1dG9tYXRvci5VaU9iamVjdDI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LmF1dG9maWxsLkF1dG9maWxsSWQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CisKKy8qKgorICogVGVzdCB0aGF0IHVzZXMge0BsaW5rIExvZ2luQWN0aXZpdHl9IHRvIHRlc3Qge0BsaW5rIEZpbGxFdmVudEhpc3Rvcnl9LgorICovCitAQXBwTW9kZUZ1bGwgLy8gU2VydmljZS1zcGVjaWZpYyB0ZXN0CitwdWJsaWMgY2xhc3MgRmlsbEV2ZW50SGlzdG9yeVRlc3QgZXh0ZW5kcyBBdXRvRmlsbFNlcnZpY2VUZXN0Q2FzZSB7CisKKyAgICBAUnVsZQorICAgIHB1YmxpYyBmaW5hbCBBdXRvZmlsbEFjdGl2aXR5VGVzdFJ1bGU8TG9naW5BY3Rpdml0eT4gbUFjdGl2aXR5UnVsZSA9CisgICAgICAgICAgICBuZXcgQXV0b2ZpbGxBY3Rpdml0eVRlc3RSdWxlPExvZ2luQWN0aXZpdHk+KExvZ2luQWN0aXZpdHkuY2xhc3MpOworCisgICAgcHJpdmF0ZSBMb2dpbkFjdGl2aXR5IG1BY3Rpdml0eTsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRBY3Rpdml0eSgpIHsKKyAgICAgICAgbUFjdGl2aXR5ID0gbUFjdGl2aXR5UnVsZS5nZXRBY3Rpdml0eSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERhdGFzZXRBdXRoZW50aWNhdGlvblNlbGVjdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKKworICAgICAgICAvLyBTZXQgdXAgRmlsbFJlc3BvbnNlIHdpdGggZGF0YXNldCBhdXRoZW50aWNhdGlvbgorICAgICAgICBCdW5kbGUgY2xpZW50U3RhdGUgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgIGNsaWVudFN0YXRlLnB1dENoYXJTZXF1ZW5jZSgiY2xpZW50U3RhdGVLZXkiLCAiY2xpZW50U3RhdGVWYWx1ZSIpOworCisgICAgICAgIC8vIFByZXBhcmUgdGhlIGF1dGhlbnRpY2F0ZWQgcmVzcG9uc2UKKyAgICAgICAgZmluYWwgSW50ZW50U2VuZGVyIGF1dGhlbnRpY2F0aW9uID0gQXV0aGVudGljYXRpb25BY3Rpdml0eS5jcmVhdGVTZW5kZXIobUNvbnRleHQsIDEsCisgICAgICAgICAgICAgICAgbmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfVVNFUk5BTUUsICJkdWRlIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9QQVNTV09SRCwgInN3ZWV0IikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJEYXRhc2V0IikpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UobmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkuYWRkRGF0YXNldCgKKyAgICAgICAgICAgICAgICBuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgInVzZXJuYW1lIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJZCgibmFtZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiYXV0aGVudGljYXRpb24iKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRBdXRoZW50aWNhdGlvbihhdXRoZW50aWNhdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQorICAgICAgICAgICAgICAgIC5zZXRFeHRyYXMoY2xpZW50U3RhdGUpLmJ1aWxkKCkpOworICAgICAgICBtQWN0aXZpdHkuZXhwZWN0QXV0b0ZpbGwoImR1ZGUiLCAic3dlZXQiKTsKKworICAgICAgICAvLyBUcmlnZ2VyIGF1dG9maWxsLgorICAgICAgICBtQWN0aXZpdHkub25Vc2VybmFtZShWaWV3OjpyZXF1ZXN0Rm9jdXMpOworCisgICAgICAgIC8vIEF1dGhlbnRpY2F0ZQorICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKKyAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQoImF1dGhlbnRpY2F0aW9uIik7CisgICAgICAgIG1BY3Rpdml0eS5hc3NlcnRBdXRvRmlsbGVkKCk7CisKKyAgICAgICAgLy8gVmVyaWZ5IGZpbGwgc2VsZWN0aW9uCisgICAgICAgIGZpbmFsIExpc3Q8RXZlbnQ+IGV2ZW50cyA9IEluc3RydW1lbnRlZEF1dG9GaWxsU2VydmljZS5nZXRGaWxsRXZlbnRzKDEpOworICAgICAgICBhc3NlcnRGaWxsRXZlbnRGb3JEYXRhc2V0QXV0aGVudGljYXRpb25TZWxlY3RlZChldmVudHMuZ2V0KDApLCAibmFtZSIsCisgICAgICAgICAgICAgICAgImNsaWVudFN0YXRlS2V5IiwgImNsaWVudFN0YXRlVmFsdWUiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRoZW50aWNhdGlvblNlbGVjdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKKworICAgICAgICAvLyBTZXQgdXAgRmlsbFJlc3BvbnNlIHdpdGggcmVzcG9uc2Ugd2lkZSBhdXRoZW50aWNhdGlvbgorICAgICAgICBCdW5kbGUgY2xpZW50U3RhdGUgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgIGNsaWVudFN0YXRlLnB1dENoYXJTZXF1ZW5jZSgiY2xpZW50U3RhdGVLZXkiLCAiY2xpZW50U3RhdGVWYWx1ZSIpOworCisgICAgICAgIC8vIFByZXBhcmUgdGhlIGF1dGhlbnRpY2F0ZWQgcmVzcG9uc2UKKyAgICAgICAgZmluYWwgSW50ZW50U2VuZGVyIGF1dGhlbnRpY2F0aW9uID0gQXV0aGVudGljYXRpb25BY3Rpdml0eS5jcmVhdGVTZW5kZXIobUNvbnRleHQsIDEsCisgICAgICAgICAgICAgICAgbmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkuYWRkRGF0YXNldCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfVVNFUk5BTUUsICJ1c2VybmFtZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJZCgibmFtZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJkYXRhc2V0IikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEV4dHJhcyhjbGllbnRTdGF0ZSkuYnVpbGQoKSk7CisKKyAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UobmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkuc2V0RXh0cmFzKGNsaWVudFN0YXRlKQorICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJhdXRoZW50aWNhdGlvbiIpKQorICAgICAgICAgICAgICAgIC5zZXRBdXRoZW50aWNhdGlvbihhdXRoZW50aWNhdGlvbiwgSURfVVNFUk5BTUUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIC8vIFRyaWdnZXIgYXV0b2ZpbGwuCisgICAgICAgIG1BY3Rpdml0eS5vblVzZXJuYW1lKFZpZXc6OnJlcXVlc3RGb2N1cyk7CisKKyAgICAgICAgLy8gQXV0aGVudGljYXRlCisgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOworICAgICAgICBtVWlCb3Quc2VsZWN0RGF0YXNldCgiYXV0aGVudGljYXRpb24iKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJkYXRhc2V0Iik7CisKKyAgICAgICAgLy8gVmVyaWZ5IGZpbGwgc2VsZWN0aW9uCisgICAgICAgIGZpbmFsIEZpbGxFdmVudEhpc3Rvcnkgc2VsZWN0aW9uID0gSW5zdHJ1bWVudGVkQXV0b0ZpbGxTZXJ2aWNlLmdldEZpbGxFdmVudEhpc3RvcnkoMSk7CisgICAgICAgIGFzc2VydERlcHJlY2F0ZWRDbGllbnRTdGF0ZShzZWxlY3Rpb24sICJjbGllbnRTdGF0ZUtleSIsICJjbGllbnRTdGF0ZVZhbHVlIik7CisgICAgICAgIExpc3Q8RXZlbnQ+IGV2ZW50cyA9IHNlbGVjdGlvbi5nZXRFdmVudHMoKTsKKyAgICAgICAgYXNzZXJ0RmlsbEV2ZW50Rm9yQXV0aGVudGljYXRpb25TZWxlY3RlZChldmVudHMuZ2V0KDApLCBOVUxMX0RBVEFTRVRfSUQsCisgICAgICAgICAgICAgICAgImNsaWVudFN0YXRlS2V5IiwgImNsaWVudFN0YXRlVmFsdWUiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REYXRhc2V0U2VsZWN0ZWRfdHdvUmVzcG9uc2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKKworICAgICAgICAvLyBTZXQgdXAgZmlyc3QgcGFydGl0aW9uIHdpdGggYW4gYW5vbnltb3VzIGRhdGFzZXQKKyAgICAgICAgQnVuZGxlIGNsaWVudFN0YXRlMSA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgY2xpZW50U3RhdGUxLnB1dENoYXJTZXF1ZW5jZSgiY2xpZW50U3RhdGVLZXkiLCAiVmFsdWUxIik7CisKKyAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UobmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkuYWRkRGF0YXNldCgKKyAgICAgICAgICAgICAgICBuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgInVzZXJuYW1lIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJkYXRhc2V0MSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLnNldEV4dHJhcyhjbGllbnRTdGF0ZTEpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICBtQWN0aXZpdHkuZXhwZWN0QXV0b0ZpbGwoInVzZXJuYW1lIik7CisKKyAgICAgICAgLy8gVHJpZ2dlciBhdXRvZmlsbCBvbiB1c2VybmFtZQorICAgICAgICBtQWN0aXZpdHkub25Vc2VybmFtZShWaWV3OjpyZXF1ZXN0Rm9jdXMpOworICAgICAgICB3YWl0VW50aWxDb25uZWN0ZWQoKTsKKyAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CisgICAgICAgIG1VaUJvdC5zZWxlY3REYXRhc2V0KCJkYXRhc2V0MSIpOworICAgICAgICBtQWN0aXZpdHkuYXNzZXJ0QXV0b0ZpbGxlZCgpOworCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFZlcmlmeSBmaWxsIHNlbGVjdGlvbgorICAgICAgICAgICAgZmluYWwgRmlsbEV2ZW50SGlzdG9yeSBzZWxlY3Rpb24gPSBJbnN0cnVtZW50ZWRBdXRvRmlsbFNlcnZpY2UuZ2V0RmlsbEV2ZW50SGlzdG9yeSgxKTsKKyAgICAgICAgICAgIGFzc2VydERlcHJlY2F0ZWRDbGllbnRTdGF0ZShzZWxlY3Rpb24sICJjbGllbnRTdGF0ZUtleSIsICJWYWx1ZTEiKTsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8RXZlbnQ+IGV2ZW50cyA9IHNlbGVjdGlvbi5nZXRFdmVudHMoKTsKKyAgICAgICAgICAgIGFzc2VydEZpbGxFdmVudEZvckRhdGFzZXRTZWxlY3RlZChldmVudHMuZ2V0KDApLCBOVUxMX0RBVEFTRVRfSUQsCisgICAgICAgICAgICAgICAgICAgICJjbGllbnRTdGF0ZUtleSIsICJWYWx1ZTEiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNldCB1cCBzZWNvbmQgcGFydGl0aW9uIHdpdGggYSBuYW1lZCBkYXRhc2V0CisgICAgICAgIEJ1bmRsZSBjbGllbnRTdGF0ZTIgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgIGNsaWVudFN0YXRlMi5wdXRDaGFyU2VxdWVuY2UoImNsaWVudFN0YXRlS2V5IiwgIlZhbHVlMiIpOworCisgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLmFkZERhdGFzZXQoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1BBU1NXT1JELCAicGFzc3dvcmQyIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oImRhdGFzZXQyIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJZCgibmFtZTIiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuYWRkRGF0YXNldCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfUEFTU1dPUkQsICJwYXNzd29yZDMiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiZGF0YXNldDMiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldElkKCJuYW1lMyIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQorICAgICAgICAgICAgICAgIC5zZXRFeHRyYXMoY2xpZW50U3RhdGUyKQorICAgICAgICAgICAgICAgIC5zZXRSZXF1aXJlZFNhdmFibGVJZHMoU0FWRV9EQVRBX1RZUEVfR0VORVJJQywgSURfUEFTU1dPUkQpLmJ1aWxkKCkpOworICAgICAgICBtQWN0aXZpdHkuZXhwZWN0UGFzc3dvcmRBdXRvRmlsbCgicGFzc3dvcmQzIik7CisKKyAgICAgICAgLy8gVHJpZ2dlciBhdXRvZmlsbCBvbiBwYXNzd29yZAorICAgICAgICBtQWN0aXZpdHkub25QYXNzd29yZChWaWV3OjpyZXF1ZXN0Rm9jdXMpOworICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKKyAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQoImRhdGFzZXQzIik7CisgICAgICAgIG1BY3Rpdml0eS5hc3NlcnRBdXRvRmlsbGVkKCk7CisKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVmVyaWZ5IGZpbGwgc2VsZWN0aW9uCisgICAgICAgICAgICBmaW5hbCBGaWxsRXZlbnRIaXN0b3J5IHNlbGVjdGlvbiA9IEluc3RydW1lbnRlZEF1dG9GaWxsU2VydmljZS5nZXRGaWxsRXZlbnRIaXN0b3J5KDEpOworICAgICAgICAgICAgYXNzZXJ0RGVwcmVjYXRlZENsaWVudFN0YXRlKHNlbGVjdGlvbiwgImNsaWVudFN0YXRlS2V5IiwgIlZhbHVlMiIpOworICAgICAgICAgICAgZmluYWwgTGlzdDxFdmVudD4gZXZlbnRzID0gc2VsZWN0aW9uLmdldEV2ZW50cygpOworICAgICAgICAgICAgYXNzZXJ0RmlsbEV2ZW50Rm9yRGF0YXNldFNlbGVjdGVkKGV2ZW50cy5nZXQoMCksICJuYW1lMyIsCisgICAgICAgICAgICAgICAgICAgICJjbGllbnRTdGF0ZUtleSIsICJWYWx1ZTIiKTsKKyAgICAgICAgfQorCisgICAgICAgIG1BY3Rpdml0eS5vblBhc3N3b3JkKCh2KSAtPiB2LnNldFRleHQoIm5ldyBwYXNzd29yZCIpKTsKKyAgICAgICAgbUFjdGl2aXR5LnN5bmNSdW5PblVpVGhyZWFkKCgpIC0+IG1BY3Rpdml0eS5maW5pc2goKSk7CisgICAgICAgIHdhaXRVbnRpbERpc2Nvbm5lY3RlZCgpOworCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFZlcmlmeSBmaWxsIHNlbGVjdGlvbgorICAgICAgICAgICAgZmluYWwgRmlsbEV2ZW50SGlzdG9yeSBzZWxlY3Rpb24gPSBJbnN0cnVtZW50ZWRBdXRvRmlsbFNlcnZpY2UuZ2V0RmlsbEV2ZW50SGlzdG9yeSgyKTsKKyAgICAgICAgICAgIGFzc2VydERlcHJlY2F0ZWRDbGllbnRTdGF0ZShzZWxlY3Rpb24sICJjbGllbnRTdGF0ZUtleSIsICJWYWx1ZTIiKTsKKworICAgICAgICAgICAgZmluYWwgTGlzdDxFdmVudD4gZXZlbnRzID0gc2VsZWN0aW9uLmdldEV2ZW50cygpOworICAgICAgICAgICAgYXNzZXJ0RmlsbEV2ZW50Rm9yRGF0YXNldFNlbGVjdGVkKGV2ZW50cy5nZXQoMCksICJuYW1lMyIsCisgICAgICAgICAgICAgICAgICAgICJjbGllbnRTdGF0ZUtleSIsICJWYWx1ZTIiKTsKKyAgICAgICAgICAgIGFzc2VydEZpbGxFdmVudEZvclNhdmVTaG93bihldmVudHMuZ2V0KDEpLCBOVUxMX0RBVEFTRVRfSUQsCisgICAgICAgICAgICAgICAgICAgICJjbGllbnRTdGF0ZUtleSIsICJWYWx1ZTIiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vRXZlbnRzX3doZW5TZXJ2aWNlUmV0dXJuc051bGxSZXNwb25zZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBlbmFibGVTZXJ2aWNlKCk7CisKKyAgICAgICAgLy8gRmlyc3QgcmVzZXQKKyAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UobmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkuYWRkRGF0YXNldCgKKyAgICAgICAgICAgICAgICBuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgInVzZXJuYW1lIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJkYXRhc2V0MSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICBtQWN0aXZpdHkuZXhwZWN0QXV0b0ZpbGwoInVzZXJuYW1lIik7CisKKyAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoVmlldzo6cmVxdWVzdEZvY3VzKTsKKyAgICAgICAgd2FpdFVudGlsQ29ubmVjdGVkKCk7CisgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOworICAgICAgICBtVWlCb3Quc2VsZWN0RGF0YXNldCgiZGF0YXNldDEiKTsKKyAgICAgICAgbUFjdGl2aXR5LmFzc2VydEF1dG9GaWxsZWQoKTsKKworICAgICAgICB7CisgICAgICAgICAgICAvLyBWZXJpZnkgZmlsbCBzZWxlY3Rpb24KKyAgICAgICAgICAgIGZpbmFsIEZpbGxFdmVudEhpc3Rvcnkgc2VsZWN0aW9uID0gSW5zdHJ1bWVudGVkQXV0b0ZpbGxTZXJ2aWNlLmdldEZpbGxFdmVudEhpc3RvcnkoMSk7CisgICAgICAgICAgICBhc3NlcnROb0RlcHJlY2F0ZWRDbGllbnRTdGF0ZShzZWxlY3Rpb24pOworICAgICAgICAgICAgZmluYWwgTGlzdDxFdmVudD4gZXZlbnRzID0gc2VsZWN0aW9uLmdldEV2ZW50cygpOworICAgICAgICAgICAgYXNzZXJ0RmlsbEV2ZW50Rm9yRGF0YXNldFNlbGVjdGVkKGV2ZW50cy5nZXQoMCksIE5VTExfREFUQVNFVF9JRCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTZWNvbmQgcmVxdWVzdAorICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShOT19SRVNQT05TRSk7CisgICAgICAgIG1BY3Rpdml0eS5vblBhc3N3b3JkKFZpZXc6OnJlcXVlc3RGb2N1cyk7CisgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOworICAgICAgICBtVWlCb3QuYXNzZXJ0Tm9EYXRhc2V0cygpOworICAgICAgICB3YWl0VW50aWxEaXNjb25uZWN0ZWQoKTsKKworICAgICAgICBJbnN0cnVtZW50ZWRBdXRvRmlsbFNlcnZpY2UuYXNzZXJ0Tm9GaWxsRXZlbnRIaXN0b3J5KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9FdmVudHNfd2hlblNlcnZpY2VSZXR1cm5zRmFpbHVyZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBlbmFibGVTZXJ2aWNlKCk7CisKKyAgICAgICAgLy8gRmlyc3QgcmVzZXQKKyAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UobmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkuYWRkRGF0YXNldCgKKyAgICAgICAgICAgICAgICBuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgInVzZXJuYW1lIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJkYXRhc2V0MSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICBtQWN0aXZpdHkuZXhwZWN0QXV0b0ZpbGwoInVzZXJuYW1lIik7CisKKyAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoVmlldzo6cmVxdWVzdEZvY3VzKTsKKyAgICAgICAgd2FpdFVudGlsQ29ubmVjdGVkKCk7CisgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOworICAgICAgICBtVWlCb3Quc2VsZWN0RGF0YXNldCgiZGF0YXNldDEiKTsKKyAgICAgICAgbUFjdGl2aXR5LmFzc2VydEF1dG9GaWxsZWQoKTsKKworICAgICAgICB7CisgICAgICAgICAgICAvLyBWZXJpZnkgZmlsbCBzZWxlY3Rpb24KKyAgICAgICAgICAgIGZpbmFsIEZpbGxFdmVudEhpc3Rvcnkgc2VsZWN0aW9uID0gSW5zdHJ1bWVudGVkQXV0b0ZpbGxTZXJ2aWNlLmdldEZpbGxFdmVudEhpc3RvcnkoMSk7CisgICAgICAgICAgICBhc3NlcnROb0RlcHJlY2F0ZWRDbGllbnRTdGF0ZShzZWxlY3Rpb24pOworICAgICAgICAgICAgZmluYWwgTGlzdDxFdmVudD4gZXZlbnRzID0gc2VsZWN0aW9uLmdldEV2ZW50cygpOworICAgICAgICAgICAgYXNzZXJ0RmlsbEV2ZW50Rm9yRGF0YXNldFNlbGVjdGVkKGV2ZW50cy5nZXQoMCksIE5VTExfREFUQVNFVF9JRCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTZWNvbmQgcmVxdWVzdAorICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKS5yZXR1cm5GYWlsdXJlKCJEJ09IISIpLmJ1aWxkKCkpOworICAgICAgICBtQWN0aXZpdHkub25QYXNzd29yZChWaWV3OjpyZXF1ZXN0Rm9jdXMpOworICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKKyAgICAgICAgbVVpQm90LmFzc2VydE5vRGF0YXNldHMoKTsKKyAgICAgICAgd2FpdFVudGlsRGlzY29ubmVjdGVkKCk7CisKKyAgICAgICAgSW5zdHJ1bWVudGVkQXV0b0ZpbGxTZXJ2aWNlLmFzc2VydE5vRmlsbEV2ZW50SGlzdG9yeSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vRXZlbnRzX3doZW5TZXJ2aWNlVGltZXNvdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZW5hYmxlU2VydmljZSgpOworCisgICAgICAgIC8vIEZpcnN0IHJlc2V0CisgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpLmFkZERhdGFzZXQoCisgICAgICAgICAgICAgICAgbmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfVVNFUk5BTUUsICJ1c2VybmFtZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiZGF0YXNldDEiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgbUFjdGl2aXR5LmV4cGVjdEF1dG9GaWxsKCJ1c2VybmFtZSIpOworCisgICAgICAgIG1BY3Rpdml0eS5vblVzZXJuYW1lKFZpZXc6OnJlcXVlc3RGb2N1cyk7CisgICAgICAgIHdhaXRVbnRpbENvbm5lY3RlZCgpOworICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKKyAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQoImRhdGFzZXQxIik7CisgICAgICAgIG1BY3Rpdml0eS5hc3NlcnRBdXRvRmlsbGVkKCk7CisKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVmVyaWZ5IGZpbGwgc2VsZWN0aW9uCisgICAgICAgICAgICBmaW5hbCBGaWxsRXZlbnRIaXN0b3J5IHNlbGVjdGlvbiA9IEluc3RydW1lbnRlZEF1dG9GaWxsU2VydmljZS5nZXRGaWxsRXZlbnRIaXN0b3J5KDEpOworICAgICAgICAgICAgYXNzZXJ0Tm9EZXByZWNhdGVkQ2xpZW50U3RhdGUoc2VsZWN0aW9uKTsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8RXZlbnQ+IGV2ZW50cyA9IHNlbGVjdGlvbi5nZXRFdmVudHMoKTsKKyAgICAgICAgICAgIGFzc2VydEZpbGxFdmVudEZvckRhdGFzZXRTZWxlY3RlZChldmVudHMuZ2V0KDApLCBOVUxMX0RBVEFTRVRfSUQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2Vjb25kIHJlcXVlc3QKKyAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UoRE9fTk9UX1JFUExZX1JFU1BPTlNFKTsKKyAgICAgICAgbUFjdGl2aXR5Lm9uUGFzc3dvcmQoVmlldzo6cmVxdWVzdEZvY3VzKTsKKyAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CisgICAgICAgIHdhaXRVbnRpbERpc2Nvbm5lY3RlZCgpOworCisgICAgICAgIEluc3RydW1lbnRlZEF1dG9GaWxsU2VydmljZS5hc3NlcnROb0ZpbGxFdmVudEhpc3RvcnkoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEJ1bmRsZSBnZXRCdW5kbGUoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIGZpbmFsIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoa2V5LCB2YWx1ZSk7CisgICAgICAgIHJldHVybiBidW5kbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhlIGZvbGxvd2luZyBzY2VuYXJpbzoKKyAgICAgKgorICAgICAqIDxvbD4KKyAgICAgKiAgICA8bGk+QWN0aXZpdHkgQSBpcyBsYXVuY2hlZC4KKyAgICAgKiAgICA8bGk+QWN0aXZpdHkgQSB0cmlnZ2VycyBhdXRvZmlsbC4KKyAgICAgKiAgICA8bGk+QWN0aXZpdHkgQiBpcyBsYXVuY2hlZC4KKyAgICAgKiAgICA8bGk+QWN0aXZpdHkgQiB0cmlnZ2VycyBhdXRvZmlsbC4KKyAgICAgKiAgICA8bGk+VXNlciBnb2VzIGJhY2sgdG8gQWN0aXZpdHkgQS4KKyAgICAgKiAgICA8bGk+VXNlciB0cmlnZ2VycyBzYXZlIG9uIEFjdGl2aXR5IEEgLSBhdCB0aGlzIHBvaW50LCBzZXJ2aWNlIHNob3VsZCBoYXZlIHN0YXRzIG9mCisgICAgICogICAgICAgIGFjdGl2aXR5IEIsIGFuZCBzdGF0cyBmb3IgYWN0aXZpdHkgQSBzaG91bGQgaGF2ZSBiZWVlbiBkaXNjYXJkZWQuCisgICAgICogPC9vbD4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFdmVudHNGcm9tUHJldmlvdXNTZXNzaW9uSXNEaXNjYXJkZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZW5hYmxlU2VydmljZSgpOworCisgICAgICAgIC8vIExhdW5jaCBhY3Rpdml0eSBBCisgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldEV4dHJhcyhnZXRCdW5kbGUoImFjdGl2aXR5IiwgIkEiKSkKKyAgICAgICAgICAgICAgICAuc2V0UmVxdWlyZWRTYXZhYmxlSWRzKFNBVkVfREFUQV9UWVBFX1BBU1NXT1JELCBJRF9VU0VSTkFNRSwgSURfUEFTU1dPUkQpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIC8vIFRyaWdnZXIgYXV0b2ZpbGwgb24gYWN0aXZpdHkgQQorICAgICAgICBtQWN0aXZpdHkub25Vc2VybmFtZShWaWV3OjpyZXF1ZXN0Rm9jdXMpOworICAgICAgICB3YWl0VW50aWxDb25uZWN0ZWQoKTsKKyAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CisKKyAgICAgICAgLy8gVmVyaWZ5IGZpbGwgc2VsZWN0aW9uIGZvciBBY3Rpdml0eSBBCisgICAgICAgIGZpbmFsIEZpbGxFdmVudEhpc3Rvcnkgc2VsZWN0aW9uQSA9IEluc3RydW1lbnRlZEF1dG9GaWxsU2VydmljZS5nZXRGaWxsRXZlbnRIaXN0b3J5KDApOworICAgICAgICBhc3NlcnREZXByZWNhdGVkQ2xpZW50U3RhdGUoc2VsZWN0aW9uQSwgImFjdGl2aXR5IiwgIkEiKTsKKworICAgICAgICAvLyBMYXVuY2ggYWN0aXZpdHkgQgorICAgICAgICBtQWN0aXZpdHkuc3RhcnRBY3Rpdml0eShuZXcgSW50ZW50KG1BY3Rpdml0eSwgQ2hlY2tvdXRBY3Rpdml0eS5jbGFzcykpOworICAgICAgICBtVWlCb3QuYXNzZXJ0U2hvd25CeVJlbGF0aXZlSWQoSURfQ0NfTlVNQkVSKTsKKworICAgICAgICAvLyBUcmlnZ2VyIGF1dG9maWxsIG9uIGFjdGl2aXR5IEIKKyAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UobmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0RXh0cmFzKGdldEJ1bmRsZSgiYWN0aXZpdHkiLCAiQiIpKQorICAgICAgICAgICAgICAgIC5hZGREYXRhc2V0KG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0NDX05VTUJFUiwgIjQ4MTUxNjIzNDIiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oImRhdGFzZXRCIikpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgICAgIG1VaUJvdC5mb2N1c0J5UmVsYXRpdmVJZChJRF9DQ19OVU1CRVIpOworICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKKworICAgICAgICAvLyBWZXJpZnkgZmlsbCBzZWxlY3Rpb24gZm9yIEFjdGl2aXR5IEIKKyAgICAgICAgZmluYWwgRmlsbEV2ZW50SGlzdG9yeSBzZWxlY3Rpb25CID0gSW5zdHJ1bWVudGVkQXV0b0ZpbGxTZXJ2aWNlLmdldEZpbGxFdmVudEhpc3RvcnkoMCk7CisgICAgICAgIGFzc2VydERlcHJlY2F0ZWRDbGllbnRTdGF0ZShzZWxlY3Rpb25CLCAiYWN0aXZpdHkiLCAiQiIpOworCisgICAgICAgIC8vIE5vdyBzd2l0Y2ggYmFjayB0byBBLi4uCisgICAgICAgIG1VaUJvdC5wcmVzc0JhY2soKTsgLy8gZGlzbWlzcyBhdXRvZmlsbAorICAgICAgICBtVWlCb3QucHJlc3NCYWNrKCk7IC8vIGRpc21pc3Mga2V5Ym9hcmQgKG9yIHRhc2ssIGlmIHRoZXJlIHdhcyBubyBrZXlib2FyZCkKKyAgICAgICAgZmluYWwgQXRvbWljQm9vbGVhbiBmb2N1c09uQSA9IG5ldyBBdG9taWNCb29sZWFuKCk7CisgICAgICAgIG1BY3Rpdml0eS5zeW5jUnVuT25VaVRocmVhZCgoKSAtPiBmb2N1c09uQS5zZXQobUFjdGl2aXR5Lmhhc1dpbmRvd0ZvY3VzKCkpKTsKKyAgICAgICAgaWYgKCFmb2N1c09uQS5nZXQoKSkgeworICAgICAgICAgICAgbVVpQm90LnByZXNzQmFjaygpOyAvLyBkaXNtaXNzIHRhc2ssIGlmIHRoZSBsYXN0IHByZXNzQmFjayBkaXNtaXNzZWQgb25seSB0aGUga2V5Ym9hcmQKKyAgICAgICAgfQorICAgICAgICBtVWlCb3QuYXNzZXJ0U2hvd25CeVJlbGF0aXZlSWQoSURfVVNFUk5BTUUpOworICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgicm9vdCB3aW5kb3cgaGFzIG5vIGZvY3VzIikKKyAgICAgICAgICAgICAgICAudGhhdChtQWN0aXZpdHkuZ2V0V2luZG93KCkuZ2V0RGVjb3JWaWV3KCkuaGFzV2luZG93Rm9jdXMoKSkuaXNUcnVlKCk7CisKKyAgICAgICAgLy8gLi4uYW5kIHRyaWdnZXIgc2F2ZQorICAgICAgICAvLyBTZXQgY3JlZGVudGlhbHMuLi4KKyAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoKHYpIC0+IHYuc2V0VGV4dCgibWFsa292aWNoIikpOworICAgICAgICBtQWN0aXZpdHkub25QYXNzd29yZCgodikgLT4gdi5zZXRUZXh0KCJtYWxrb3ZpY2giKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBleHBlY3RlZE1lc3NhZ2UgPSBnZXRXZWxjb21lTWVzc2FnZSgibWFsa292aWNoIik7CisgICAgICAgIGZpbmFsIFN0cmluZyBhY3R1YWxNZXNzYWdlID0gbUFjdGl2aXR5LnRhcExvZ2luKCk7CisgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJXcm9uZyB3ZWxjb21lIG1zZyIpLnRoYXQoYWN0dWFsTWVzc2FnZSkuaXNFcXVhbFRvKGV4cGVjdGVkTWVzc2FnZSk7CisgICAgICAgIG1VaUJvdC5zYXZlRm9yQXV0b2ZpbGwodHJ1ZSwgU0FWRV9EQVRBX1RZUEVfUEFTU1dPUkQpOworICAgICAgICBzUmVwbGllci5nZXROZXh0U2F2ZVJlcXVlc3QoKTsKKworICAgICAgICAvLyBGaW5hbGx5LCBtYWtlIHN1cmUgaGlzdG9yeSBpcyByaWdodAorICAgICAgICBmaW5hbCBGaWxsRXZlbnRIaXN0b3J5IGZpbmFsU2VsZWN0aW9uID0gSW5zdHJ1bWVudGVkQXV0b0ZpbGxTZXJ2aWNlLmdldEZpbGxFdmVudEhpc3RvcnkoMCk7CisgICAgICAgIGFzc2VydERlcHJlY2F0ZWRDbGllbnRTdGF0ZShmaW5hbFNlbGVjdGlvbiwgImFjdGl2aXR5IiwgIkIiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb250ZXh0Q29tbWl0dGVkX3doZW5TZXJ2aWNlRGlkbnREb0FueXRoaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKKworICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShDYW5uZWRGaWxsUmVzcG9uc2UuTk9fUkVTUE9OU0UpOworCisgICAgICAgIC8vIFRyaWdnZXIgYXV0b2ZpbGwgb24gdXNlcm5hbWUKKyAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoVmlldzo6cmVxdWVzdEZvY3VzKTsKKyAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CisgICAgICAgIG1VaUJvdC5hc3NlcnROb0RhdGFzZXRzRXZlcigpOworCisgICAgICAgIC8vIFRyaWdnZXIgc2F2ZQorICAgICAgICBtQWN0aXZpdHkub25Vc2VybmFtZSgodikgLT4gdi5zZXRUZXh0KCJtYWxrb3ZpY2giKSk7CisgICAgICAgIG1BY3Rpdml0eS5vblBhc3N3b3JkKCh2KSAtPiB2LnNldFRleHQoIm1hbGtvdmljaCIpKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdGVkTWVzc2FnZSA9IGdldFdlbGNvbWVNZXNzYWdlKCJtYWxrb3ZpY2giKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGFjdHVhbE1lc3NhZ2UgPSBtQWN0aXZpdHkudGFwTG9naW4oKTsKKyAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoIldyb25nIHdlbGNvbWUgbXNnIikudGhhdChhY3R1YWxNZXNzYWdlKS5pc0VxdWFsVG8oZXhwZWN0ZWRNZXNzYWdlKTsKKyAgICAgICAgbVVpQm90LmFzc2VydFNhdmVOb3RTaG93aW5nKFNBVkVfREFUQV9UWVBFX1BBU1NXT1JEKTsKKworICAgICAgICAvLyBBc3NlcnQgbm8gZXZlbnRzIHdoZXJlIGdlbmVyYXRlZAorICAgICAgICBJbnN0cnVtZW50ZWRBdXRvRmlsbFNlcnZpY2UuYXNzZXJ0Tm9GaWxsRXZlbnRIaXN0b3J5KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXh0Q29udGV4dENvbW1pdHRlZF93aXRob3V0RGF0YXNldHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZW5hYmxlU2VydmljZSgpOworCisgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldEZpbGxSZXNwb25zZUZsYWdzKEZpbGxSZXNwb25zZS5GTEFHX1RSQUNLX0NPTlRFWFRfQ09NTUlURUQpCisgICAgICAgICAgICAgICAgLnNldFJlcXVpcmVkU2F2YWJsZUlkcyhTQVZFX0RBVEFfVFlQRV9QQVNTV09SRCwgSURfVVNFUk5BTUUsIElEX1BBU1NXT1JEKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAvLyBUcmlnZ2VyIGF1dG9maWxsIG9uIHVzZXJuYW1lCisgICAgICAgIG1BY3Rpdml0eS5vblVzZXJuYW1lKFZpZXc6OnJlcXVlc3RGb2N1cyk7CisgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOworICAgICAgICBtVWlCb3QuYXNzZXJ0Tm9EYXRhc2V0c0V2ZXIoKTsKKworICAgICAgICAvLyBUcmlnZ2VyIHNhdmUKKyAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoKHYpIC0+IHYuc2V0VGV4dCgibWFsa292aWNoIikpOworICAgICAgICBtQWN0aXZpdHkub25QYXNzd29yZCgodikgLT4gdi5zZXRUZXh0KCJtYWxrb3ZpY2giKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBleHBlY3RlZE1lc3NhZ2UgPSBnZXRXZWxjb21lTWVzc2FnZSgibWFsa292aWNoIik7CisgICAgICAgIGZpbmFsIFN0cmluZyBhY3R1YWxNZXNzYWdlID0gbUFjdGl2aXR5LnRhcExvZ2luKCk7CisgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJXcm9uZyB3ZWxjb21lIG1zZyIpLnRoYXQoYWN0dWFsTWVzc2FnZSkuaXNFcXVhbFRvKGV4cGVjdGVkTWVzc2FnZSk7CisgICAgICAgIG1VaUJvdC5zYXZlRm9yQXV0b2ZpbGwodHJ1ZSwgU0FWRV9EQVRBX1RZUEVfUEFTU1dPUkQpOworICAgICAgICBzUmVwbGllci5nZXROZXh0U2F2ZVJlcXVlc3QoKTsKKworICAgICAgICAvLyBBc3NlcnQgaXQKKyAgICAgICAgZmluYWwgTGlzdDxFdmVudD4gZXZlbnRzID0gSW5zdHJ1bWVudGVkQXV0b0ZpbGxTZXJ2aWNlLmdldEZpbGxFdmVudHMoMSk7CisgICAgICAgIGFzc2VydEZpbGxFdmVudEZvclNhdmVTaG93bihldmVudHMuZ2V0KDApLCBOVUxMX0RBVEFTRVRfSUQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbnRleHRDb21taXR0ZWRfd2l0aG91dEZsYWdPbkxhc3RSZXNwb25zZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBlbmFibGVTZXJ2aWNlKCk7CisgICAgICAgIC8vIFRyaWdnZXIgMXN0IGF1dG9maWxsIHJlcXVlc3QKKyAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UobmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkuYWRkRGF0YXNldCgKKyAgICAgICAgICAgICAgICBuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJZCgiaWQxIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgQkFDS0RPT1JfVVNFUk5BTUUpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiZGF0YXNldDEiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQorICAgICAgICAgICAgICAgIC5zZXRGaWxsUmVzcG9uc2VGbGFncyhGaWxsUmVzcG9uc2UuRkxBR19UUkFDS19DT05URVhUX0NPTU1JVEVEKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgbUFjdGl2aXR5LmV4cGVjdEF1dG9GaWxsKEJBQ0tET09SX1VTRVJOQU1FKTsKKyAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoVmlldzo6cmVxdWVzdEZvY3VzKTsKKyAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CisgICAgICAgIG1VaUJvdC5zZWxlY3REYXRhc2V0KCJkYXRhc2V0MSIpOworICAgICAgICBtQWN0aXZpdHkuYXNzZXJ0QXV0b0ZpbGxlZCgpOworICAgICAgICAvLyBWZXJpZnkgZmlsbCBoaXN0b3J5CisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8RXZlbnQ+IGV2ZW50cyA9IEluc3RydW1lbnRlZEF1dG9GaWxsU2VydmljZS5nZXRGaWxsRXZlbnRzKDEpOworICAgICAgICAgICAgYXNzZXJ0RmlsbEV2ZW50Rm9yRGF0YXNldFNlbGVjdGVkKGV2ZW50cy5nZXQoMCksICJpZDEiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRyaWdnZXIgMnN0IGF1dG9maWxsIHJlcXVlc3QgKHdoaWNoIHdpbGwgY2xlYXIgdGhlIGZpbGwgZXZlbnQgaGlzdG9yeSkKKyAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UobmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkuYWRkRGF0YXNldCgKKyAgICAgICAgICAgICAgICBuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJZCgiaWQyIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9QQVNTV09SRCwgIndoYXRldmVyIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJkYXRhc2V0MiIpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLy8gZG9uJ3Qgc2V0IGZsYWdzCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICBtQWN0aXZpdHkuZXhwZWN0UGFzc3dvcmRBdXRvRmlsbCgid2hhdGV2ZXIiKTsKKyAgICAgICAgbUFjdGl2aXR5Lm9uUGFzc3dvcmQoVmlldzo6cmVxdWVzdEZvY3VzKTsKKyAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CisgICAgICAgIG1VaUJvdC5zZWxlY3REYXRhc2V0KCJkYXRhc2V0MiIpOworICAgICAgICBtQWN0aXZpdHkuYXNzZXJ0QXV0b0ZpbGxlZCgpOworICAgICAgICAvLyBWZXJpZnkgZmlsbCBoaXN0b3J5CisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8RXZlbnQ+IGV2ZW50cyA9IEluc3RydW1lbnRlZEF1dG9GaWxsU2VydmljZS5nZXRGaWxsRXZlbnRzKDEpOworICAgICAgICAgICAgYXNzZXJ0RmlsbEV2ZW50Rm9yRGF0YXNldFNlbGVjdGVkKGV2ZW50cy5nZXQoMCksICJpZDIiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZpbmlzaCB0aGUgY29udGV4dCBieSBsb2dpbiBpbgorICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWRNZXNzYWdlID0gZ2V0V2VsY29tZU1lc3NhZ2UoQkFDS0RPT1JfVVNFUk5BTUUpOworICAgICAgICBmaW5hbCBTdHJpbmcgYWN0dWFsTWVzc2FnZSA9IG1BY3Rpdml0eS50YXBMb2dpbigpOworICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiV3Jvbmcgd2VsY29tZSBtc2ciKS50aGF0KGFjdHVhbE1lc3NhZ2UpLmlzRXF1YWxUbyhleHBlY3RlZE1lc3NhZ2UpOworICAgICAgICBtVWlCb3QuYXNzZXJ0U2F2ZU5vdFNob3dpbmcoU0FWRV9EQVRBX1RZUEVfUEFTU1dPUkQpOworCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFZlcmlmeSBmaWxsIGhpc3RvcnkKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8RXZlbnQ+IGV2ZW50cyA9IEluc3RydW1lbnRlZEF1dG9GaWxsU2VydmljZS5nZXRGaWxsRXZlbnRzKDEpOworCisgICAgICAgICAgICBhc3NlcnRGaWxsRXZlbnRGb3JEYXRhc2V0U2VsZWN0ZWQoZXZlbnRzLmdldCgwKSwgImlkMiIpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGV4dENvbW1pdHRlZF9pZGxlc3NEYXRhc2V0cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBlbmFibGVTZXJ2aWNlKCk7CisKKyAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UobmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkuYWRkRGF0YXNldCgKKyAgICAgICAgICAgICAgICBuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgInVzZXJuYW1lMSIpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfUEFTU1dPUkQsICJwYXNzd29yZDEiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oImRhdGFzZXQxIikpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuYWRkRGF0YXNldChuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgInVzZXJuYW1lMiIpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfUEFTU1dPUkQsICJwYXNzd29yZDIiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oImRhdGFzZXQyIikpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuc2V0RmlsbFJlc3BvbnNlRmxhZ3MoRmlsbFJlc3BvbnNlLkZMQUdfVFJBQ0tfQ09OVEVYVF9DT01NSVRFRCkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgICAgIG1BY3Rpdml0eS5leHBlY3RBdXRvRmlsbCgidXNlcm5hbWUxIiwgInBhc3N3b3JkMSIpOworCisgICAgICAgIC8vIFRyaWdnZXIgYXV0b2ZpbGwgb24gdXNlcm5hbWUKKyAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoVmlldzo6cmVxdWVzdEZvY3VzKTsKKyAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CisKKyAgICAgICAgZmluYWwgVWlPYmplY3QyIGRhdGFzZXRQaWNrZXIgPSBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoImRhdGFzZXQxIiwgImRhdGFzZXQyIik7CisgICAgICAgIG1VaUJvdC5zZWxlY3REYXRhc2V0KGRhdGFzZXRQaWNrZXIsICJkYXRhc2V0MSIpOworICAgICAgICBtQWN0aXZpdHkuYXNzZXJ0QXV0b0ZpbGxlZCgpOworCisgICAgICAgIC8vIFZlcmlmeSBkYXRhc2V0IHNlbGVjdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBmaW5hbCBMaXN0PEV2ZW50PiBldmVudHMgPSBJbnN0cnVtZW50ZWRBdXRvRmlsbFNlcnZpY2UuZ2V0RmlsbEV2ZW50cygxKTsKKyAgICAgICAgICAgIGFzc2VydEZpbGxFdmVudEZvckRhdGFzZXRTZWxlY3RlZChldmVudHMuZ2V0KDApLCBOVUxMX0RBVEFTRVRfSUQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRmluaXNoIHRoZSBjb250ZXh0IGJ5IGxvZ2luIGluCisgICAgICAgIG1BY3Rpdml0eS5vblVzZXJuYW1lKCh2KSAtPiB2LnNldFRleHQoIlVTRVJOQU1FIikpOworICAgICAgICBtQWN0aXZpdHkub25QYXNzd29yZCgodikgLT4gdi5zZXRUZXh0KCJVU0VSTkFNRSIpKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWRNZXNzYWdlID0gZ2V0V2VsY29tZU1lc3NhZ2UoIlVTRVJOQU1FIik7CisgICAgICAgIGZpbmFsIFN0cmluZyBhY3R1YWxNZXNzYWdlID0gbUFjdGl2aXR5LnRhcExvZ2luKCk7CisgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJXcm9uZyB3ZWxjb21lIG1zZyIpLnRoYXQoYWN0dWFsTWVzc2FnZSkuaXNFcXVhbFRvKGV4cGVjdGVkTWVzc2FnZSk7CisgICAgICAgIG1VaUJvdC5hc3NlcnRTYXZlTm90U2hvd2luZyhTQVZFX0RBVEFfVFlQRV9QQVNTV09SRCk7CisKKyAgICAgICAgLy8gLi4uYW5kIGNoZWNrIGFnYWluCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8RXZlbnQ+IGV2ZW50cyA9IEluc3RydW1lbnRlZEF1dG9GaWxsU2VydmljZS5nZXRGaWxsRXZlbnRzKDEpOworICAgICAgICAgICAgYXNzZXJ0RmlsbEV2ZW50Rm9yRGF0YXNldFNlbGVjdGVkKGV2ZW50cy5nZXQoMCksIE5VTExfREFUQVNFVF9JRCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb250ZXh0Q29tbWl0dGVkX2lkbGVzc0RhdGFzZXRTZWxlY3RlZF9kYXRhc2V0V2l0aElkSWdub3JlZCgpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZW5hYmxlU2VydmljZSgpOworCisgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpLmFkZERhdGFzZXQoCisgICAgICAgICAgICAgICAgbmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfVVNFUk5BTUUsICJ1c2VybmFtZTEiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1BBU1NXT1JELCAicGFzc3dvcmQxIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJkYXRhc2V0MSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLmFkZERhdGFzZXQobmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0SWQoImlkMiIpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfVVNFUk5BTUUsICJ1c2VybmFtZTIiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1BBU1NXT1JELCAicGFzc3dvcmQyIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJkYXRhc2V0MiIpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLnNldEZpbGxSZXNwb25zZUZsYWdzKEZpbGxSZXNwb25zZS5GTEFHX1RSQUNLX0NPTlRFWFRfQ09NTUlURUQpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICBtQWN0aXZpdHkuZXhwZWN0QXV0b0ZpbGwoInVzZXJuYW1lMSIsICJwYXNzd29yZDEiKTsKKworICAgICAgICAvLyBUcmlnZ2VyIGF1dG9maWxsIG9uIHVzZXJuYW1lCisgICAgICAgIG1BY3Rpdml0eS5vblVzZXJuYW1lKFZpZXc6OnJlcXVlc3RGb2N1cyk7CisgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOworCisgICAgICAgIGZpbmFsIFVpT2JqZWN0MiBkYXRhc2V0UGlja2VyID0gbVVpQm90LmFzc2VydERhdGFzZXRzKCJkYXRhc2V0MSIsICJkYXRhc2V0MiIpOworICAgICAgICBtVWlCb3Quc2VsZWN0RGF0YXNldChkYXRhc2V0UGlja2VyLCAiZGF0YXNldDEiKTsKKyAgICAgICAgbUFjdGl2aXR5LmFzc2VydEF1dG9GaWxsZWQoKTsKKworICAgICAgICAvLyBWZXJpZnkgZGF0YXNldCBzZWxlY3Rpb24KKyAgICAgICAgeworICAgICAgICAgICAgZmluYWwgTGlzdDxFdmVudD4gZXZlbnRzID0gSW5zdHJ1bWVudGVkQXV0b0ZpbGxTZXJ2aWNlLmdldEZpbGxFdmVudHMoMSk7CisgICAgICAgICAgICBhc3NlcnRGaWxsRXZlbnRGb3JEYXRhc2V0U2VsZWN0ZWQoZXZlbnRzLmdldCgwKSwgTlVMTF9EQVRBU0VUX0lEKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZpbmlzaCB0aGUgY29udGV4dCBieSBsb2dpbiBpbgorICAgICAgICBtQWN0aXZpdHkub25QYXNzd29yZCgodikgLT4gdi5zZXRUZXh0KCJ1c2VybmFtZTEiKSk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdGVkTWVzc2FnZSA9IGdldFdlbGNvbWVNZXNzYWdlKCJ1c2VybmFtZTEiKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGFjdHVhbE1lc3NhZ2UgPSBtQWN0aXZpdHkudGFwTG9naW4oKTsKKyAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoIldyb25nIHdlbGNvbWUgbXNnIikudGhhdChhY3R1YWxNZXNzYWdlKS5pc0VxdWFsVG8oZXhwZWN0ZWRNZXNzYWdlKTsKKyAgICAgICAgbVVpQm90LmFzc2VydFNhdmVOb3RTaG93aW5nKFNBVkVfREFUQV9UWVBFX1BBU1NXT1JEKTsKKworICAgICAgICAvLyAuLi5hbmQgY2hlY2sgYWdhaW4KKyAgICAgICAgeworICAgICAgICAgICAgZmluYWwgTGlzdDxFdmVudD4gZXZlbnRzID0gSW5zdHJ1bWVudGVkQXV0b0ZpbGxTZXJ2aWNlLmdldEZpbGxFdmVudHMoMik7CisgICAgICAgICAgICBhc3NlcnRGaWxsRXZlbnRGb3JEYXRhc2V0U2VsZWN0ZWQoZXZlbnRzLmdldCgwKSwgTlVMTF9EQVRBU0VUX0lEKTsKKworICAgICAgICAgICAgRmlsbEV2ZW50SGlzdG9yeS5FdmVudCBldmVudDIgPSBldmVudHMuZ2V0KDEpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChldmVudDIuZ2V0VHlwZSgpKS5pc0VxdWFsVG8oVFlQRV9DT05URVhUX0NPTU1JVFRFRCk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGV2ZW50Mi5nZXREYXRhc2V0SWQoKSkuaXNOdWxsKCk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGV2ZW50Mi5nZXRDbGllbnRTdGF0ZSgpKS5pc051bGwoKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoZXZlbnQyLmdldFNlbGVjdGVkRGF0YXNldElkcygpKS5pc0VtcHR5KCk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGV2ZW50Mi5nZXRJZ25vcmVkRGF0YXNldElkcygpKS5jb250YWluc0V4YWN0bHkoImlkMiIpOworICAgICAgICAgICAgZmluYWwgQXV0b2ZpbGxJZCBwYXNzd29yZElkID0gbUFjdGl2aXR5LmdldFBhc3N3b3JkKCkuZ2V0QXV0b2ZpbGxJZCgpOworICAgICAgICAgICAgZmluYWwgTWFwPEF1dG9maWxsSWQsIFN0cmluZz4gY2hhbmdlZEZpZWxkcyA9IGV2ZW50Mi5nZXRDaGFuZ2VkRmllbGRzKCk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGNoYW5nZWRGaWVsZHMpLmNvbnRhaW5zRXhhY3RseShwYXNzd29yZElkLCAiaWQyIik7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGV2ZW50Mi5nZXRNYW51YWxseUVudGVyZWRGaWVsZCgpKS5pc0VtcHR5KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb250ZXh0Q29tbWl0dGVkX2lkbGVzc0RhdGFzZXRJZ25vcmVkX2RhdGFzZXRXaXRoSWRTZWxlY3RlZCgpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZW5hYmxlU2VydmljZSgpOworCisgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpLmFkZERhdGFzZXQoCisgICAgICAgICAgICAgICAgbmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfVVNFUk5BTUUsICJ1c2VybmFtZTEiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1BBU1NXT1JELCAicGFzc3dvcmQxIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJkYXRhc2V0MSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLmFkZERhdGFzZXQobmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0SWQoImlkMiIpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfVVNFUk5BTUUsICJ1c2VybmFtZTIiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1BBU1NXT1JELCAicGFzc3dvcmQyIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJkYXRhc2V0MiIpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLnNldEZpbGxSZXNwb25zZUZsYWdzKEZpbGxSZXNwb25zZS5GTEFHX1RSQUNLX0NPTlRFWFRfQ09NTUlURUQpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICBtQWN0aXZpdHkuZXhwZWN0QXV0b0ZpbGwoInVzZXJuYW1lMiIsICJwYXNzd29yZDIiKTsKKworICAgICAgICAvLyBUcmlnZ2VyIGF1dG9maWxsIG9uIHVzZXJuYW1lCisgICAgICAgIG1BY3Rpdml0eS5vblVzZXJuYW1lKFZpZXc6OnJlcXVlc3RGb2N1cyk7CisgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOworCisgICAgICAgIGZpbmFsIFVpT2JqZWN0MiBkYXRhc2V0UGlja2VyID0gbVVpQm90LmFzc2VydERhdGFzZXRzKCJkYXRhc2V0MSIsICJkYXRhc2V0MiIpOworICAgICAgICBtVWlCb3Quc2VsZWN0RGF0YXNldChkYXRhc2V0UGlja2VyLCAiZGF0YXNldDIiKTsKKyAgICAgICAgbUFjdGl2aXR5LmFzc2VydEF1dG9GaWxsZWQoKTsKKworICAgICAgICAvLyBWZXJpZnkgZGF0YXNldCBzZWxlY3Rpb24KKyAgICAgICAgeworICAgICAgICAgICAgZmluYWwgTGlzdDxFdmVudD4gZXZlbnRzID0gSW5zdHJ1bWVudGVkQXV0b0ZpbGxTZXJ2aWNlLmdldEZpbGxFdmVudHMoMSk7CisgICAgICAgICAgICBhc3NlcnRGaWxsRXZlbnRGb3JEYXRhc2V0U2VsZWN0ZWQoZXZlbnRzLmdldCgwKSwgImlkMiIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRmluaXNoIHRoZSBjb250ZXh0IGJ5IGxvZ2luIGluCisgICAgICAgIG1BY3Rpdml0eS5vblBhc3N3b3JkKCh2KSAtPiB2LnNldFRleHQoInVzZXJuYW1lMiIpKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWRNZXNzYWdlID0gZ2V0V2VsY29tZU1lc3NhZ2UoInVzZXJuYW1lMiIpOworICAgICAgICBmaW5hbCBTdHJpbmcgYWN0dWFsTWVzc2FnZSA9IG1BY3Rpdml0eS50YXBMb2dpbigpOworICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiV3Jvbmcgd2VsY29tZSBtc2ciKS50aGF0KGFjdHVhbE1lc3NhZ2UpLmlzRXF1YWxUbyhleHBlY3RlZE1lc3NhZ2UpOworICAgICAgICBtVWlCb3QuYXNzZXJ0U2F2ZU5vdFNob3dpbmcoU0FWRV9EQVRBX1RZUEVfUEFTU1dPUkQpOworCisgICAgICAgIC8vIC4uLmFuZCBjaGVjayBhZ2FpbgorICAgICAgICB7CisgICAgICAgICAgICBmaW5hbCBMaXN0PEV2ZW50PiBldmVudHMgPSBJbnN0cnVtZW50ZWRBdXRvRmlsbFNlcnZpY2UuZ2V0RmlsbEV2ZW50cygyKTsKKyAgICAgICAgICAgIGFzc2VydEZpbGxFdmVudEZvckRhdGFzZXRTZWxlY3RlZChldmVudHMuZ2V0KDApLCAiaWQyIik7CisKKyAgICAgICAgICAgIGZpbmFsIEZpbGxFdmVudEhpc3RvcnkuRXZlbnQgZXZlbnQyID0gZXZlbnRzLmdldCgxKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoZXZlbnQyLmdldFR5cGUoKSkuaXNFcXVhbFRvKFRZUEVfQ09OVEVYVF9DT01NSVRURUQpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChldmVudDIuZ2V0RGF0YXNldElkKCkpLmlzTnVsbCgpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChldmVudDIuZ2V0Q2xpZW50U3RhdGUoKSkuaXNOdWxsKCk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGV2ZW50Mi5nZXRTZWxlY3RlZERhdGFzZXRJZHMoKSkuY29udGFpbnNFeGFjdGx5KCJpZDIiKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoZXZlbnQyLmdldElnbm9yZWREYXRhc2V0SWRzKCkpLmlzRW1wdHkoKTsKKyAgICAgICAgICAgIGZpbmFsIEF1dG9maWxsSWQgcGFzc3dvcmRJZCA9IG1BY3Rpdml0eS5nZXRQYXNzd29yZCgpLmdldEF1dG9maWxsSWQoKTsKKyAgICAgICAgICAgIGZpbmFsIE1hcDxBdXRvZmlsbElkLCBTdHJpbmc+IGNoYW5nZWRGaWVsZHMgPSBldmVudDIuZ2V0Q2hhbmdlZEZpZWxkcygpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChjaGFuZ2VkRmllbGRzKS5jb250YWluc0V4YWN0bHkocGFzc3dvcmRJZCwgImlkMiIpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChldmVudDIuZ2V0TWFudWFsbHlFbnRlcmVkRmllbGQoKSkuaXNFbXB0eSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgc2NlbmFyaW8gd2hlcmUgdGhlIGNvbnRleHQgd2FzIGNvbW1pdHRlZCwgbm8gZGF0YXNldCB3YXMgc2VsZWN0ZWQgYnkgdGhlIHVzZXIsCisgICAgICogbmVpdGhlciB0aGUgdXNlciBlbnRlcmVkIHZhbHVlcyB0aGF0IHdlcmUgcHJlc2VudCBpbiB0aGVzZSBkYXRhc2V0cy4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb250ZXh0Q29tbWl0dGVkX25vRGF0YXNldFNlbGVjdGVkX3ZhbHVlc05vdE1hbnVhbGx5RW50ZXJlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBlbmFibGVTZXJ2aWNlKCk7CisKKyAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UobmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkuYWRkRGF0YXNldCgKKyAgICAgICAgICAgICAgICBuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJZCgiaWQxIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgInVzZXJuYW1lMSIpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfUEFTU1dPUkQsICJwYXNzd29yZDEiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oImRhdGFzZXQxIikpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuYWRkRGF0YXNldChuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJZCgiaWQyIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgInVzZXJuYW1lMiIpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfUEFTU1dPUkQsICJwYXNzd29yZDIiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oImRhdGFzZXQyIikpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuc2V0RmlsbFJlc3BvbnNlRmxhZ3MoRmlsbFJlc3BvbnNlLkZMQUdfVFJBQ0tfQ09OVEVYVF9DT01NSVRFRCkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgICAgIC8vIFRyaWdnZXIgYXV0b2ZpbGwgb24gdXNlcm5hbWUKKyAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoVmlldzo6cmVxdWVzdEZvY3VzKTsKKyAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cygiZGF0YXNldDEiLCAiZGF0YXNldDIiKTsKKworICAgICAgICAvLyBWZXJpZnkgaGlzdG9yeQorICAgICAgICBJbnN0cnVtZW50ZWRBdXRvRmlsbFNlcnZpY2UuZ2V0RmlsbEV2ZW50SGlzdG9yeSgwKTsKKworICAgICAgICAvLyBFbnRlciB2YWx1ZXMgbm90IHByZXNlbnQgYXQgdGhlIGRhdGFzZXRzCisgICAgICAgIG1BY3Rpdml0eS5vblVzZXJuYW1lKCh2KSAtPiB2LnNldFRleHQoIlVTRVJOQU1FIikpOworICAgICAgICBtQWN0aXZpdHkub25QYXNzd29yZCgodikgLT4gdi5zZXRUZXh0KCJVU0VSTkFNRSIpKTsKKworICAgICAgICAvLyBGaW5pc2ggdGhlIGNvbnRleHQgYnkgbG9naW4gaW4KKyAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdGVkTWVzc2FnZSA9IGdldFdlbGNvbWVNZXNzYWdlKCJVU0VSTkFNRSIpOworICAgICAgICBmaW5hbCBTdHJpbmcgYWN0dWFsTWVzc2FnZSA9IG1BY3Rpdml0eS50YXBMb2dpbigpOworICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiV3Jvbmcgd2VsY29tZSBtc2ciKS50aGF0KGFjdHVhbE1lc3NhZ2UpLmlzRXF1YWxUbyhleHBlY3RlZE1lc3NhZ2UpOworICAgICAgICBtVWlCb3QuYXNzZXJ0U2F2ZU5vdFNob3dpbmcoU0FWRV9EQVRBX1RZUEVfUEFTU1dPUkQpOworCisgICAgICAgIC8vIFZlcmlmeSBoaXN0b3J5IGFnYWluCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8RXZlbnQ+IGV2ZW50cyA9IEluc3RydW1lbnRlZEF1dG9GaWxsU2VydmljZS5nZXRGaWxsRXZlbnRzKDEpOworICAgICAgICAgICAgZmluYWwgRXZlbnQgZXZlbnQgPSBldmVudHMuZ2V0KDApOworICAgICAgICAgICAgYXNzZXJ0VGhhdChldmVudC5nZXRUeXBlKCkpLmlzRXF1YWxUbyhUWVBFX0NPTlRFWFRfQ09NTUlUVEVEKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoZXZlbnQuZ2V0RGF0YXNldElkKCkpLmlzTnVsbCgpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChldmVudC5nZXRDbGllbnRTdGF0ZSgpKS5pc051bGwoKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoZXZlbnQuZ2V0SWdub3JlZERhdGFzZXRJZHMoKSkuY29udGFpbnNFeGFjdGx5KCJpZDEiLCAiaWQyIik7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGV2ZW50LmdldENoYW5nZWRGaWVsZHMoKSkuaXNFbXB0eSgpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChldmVudC5nZXRNYW51YWxseUVudGVyZWRGaWVsZCgpKS5pc0VtcHR5KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBzY2VuYXJpbyB3aGVyZSB0aGUgY29udGV4dCB3YXMgY29tbWl0dGVkLCBqdXN0IG9uZSBkYXRhc2V0IHdhcyBzZWxlY3RlZCBieSB0aGUgdXNlciwKKyAgICAgKiBhbmQgdGhlIHVzZXIgY2hhbmdlZCB0aGUgdmFsdWVzIHByb3ZpZGVkIGJ5IHRoZSBzZXJ2aWNlLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbnRleHRDb21taXR0ZWRfb25lRGF0YXNldFNlbGVjdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKKworICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKS5hZGREYXRhc2V0KAorICAgICAgICAgICAgICAgIG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldElkKCJpZDEiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1VTRVJOQU1FLCAidXNlcm5hbWUxIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9QQVNTV09SRCwgInBhc3N3b3JkMSIpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiZGF0YXNldDEiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQorICAgICAgICAgICAgICAgIC5hZGREYXRhc2V0KG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldElkKCJpZDIiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1VTRVJOQU1FLCAidXNlcm5hbWUyIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9QQVNTV09SRCwgInBhc3N3b3JkMiIpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiZGF0YXNldDIiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQorICAgICAgICAgICAgICAgIC5zZXRGaWxsUmVzcG9uc2VGbGFncyhGaWxsUmVzcG9uc2UuRkxBR19UUkFDS19DT05URVhUX0NPTU1JVEVEKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgbUFjdGl2aXR5LmV4cGVjdEF1dG9GaWxsKCJ1c2VybmFtZTEiLCAicGFzc3dvcmQxIik7CisKKyAgICAgICAgLy8gVHJpZ2dlciBhdXRvZmlsbCBvbiB1c2VybmFtZQorICAgICAgICBtQWN0aXZpdHkub25Vc2VybmFtZShWaWV3OjpyZXF1ZXN0Rm9jdXMpOworICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKKworICAgICAgICBmaW5hbCBVaU9iamVjdDIgZGF0YXNldFBpY2tlciA9IG1VaUJvdC5hc3NlcnREYXRhc2V0cygiZGF0YXNldDEiLCAiZGF0YXNldDIiKTsKKyAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQoZGF0YXNldFBpY2tlciwgImRhdGFzZXQxIik7CisgICAgICAgIG1BY3Rpdml0eS5hc3NlcnRBdXRvRmlsbGVkKCk7CisKKyAgICAgICAgLy8gVmVyaWZ5IGRhdGFzZXQgc2VsZWN0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8RXZlbnQ+IGV2ZW50cyA9IEluc3RydW1lbnRlZEF1dG9GaWxsU2VydmljZS5nZXRGaWxsRXZlbnRzKDEpOworICAgICAgICAgICAgYXNzZXJ0RmlsbEV2ZW50Rm9yRGF0YXNldFNlbGVjdGVkKGV2ZW50cy5nZXQoMCksICJpZDEiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZpbmlzaCB0aGUgY29udGV4dCBieSBsb2dpbiBpbgorICAgICAgICBtQWN0aXZpdHkub25Vc2VybmFtZSgodikgLT4gdi5zZXRUZXh0KCJVU0VSTkFNRSIpKTsKKyAgICAgICAgbUFjdGl2aXR5Lm9uUGFzc3dvcmQoKHYpIC0+IHYuc2V0VGV4dCgiVVNFUk5BTUUiKSk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdGVkTWVzc2FnZSA9IGdldFdlbGNvbWVNZXNzYWdlKCJVU0VSTkFNRSIpOworICAgICAgICBmaW5hbCBTdHJpbmcgYWN0dWFsTWVzc2FnZSA9IG1BY3Rpdml0eS50YXBMb2dpbigpOworICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiV3Jvbmcgd2VsY29tZSBtc2ciKS50aGF0KGFjdHVhbE1lc3NhZ2UpLmlzRXF1YWxUbyhleHBlY3RlZE1lc3NhZ2UpOworICAgICAgICBtVWlCb3QuYXNzZXJ0U2F2ZU5vdFNob3dpbmcoU0FWRV9EQVRBX1RZUEVfUEFTU1dPUkQpOworCisgICAgICAgIC8vIC4uLmFuZCBjaGVjayBhZ2FpbgorICAgICAgICB7CisgICAgICAgICAgICBmaW5hbCBMaXN0PEV2ZW50PiBldmVudHMgPSBJbnN0cnVtZW50ZWRBdXRvRmlsbFNlcnZpY2UuZ2V0RmlsbEV2ZW50cygyKTsKKyAgICAgICAgICAgIGFzc2VydEZpbGxFdmVudEZvckRhdGFzZXRTZWxlY3RlZChldmVudHMuZ2V0KDApLCAiaWQxIik7CisKKyAgICAgICAgICAgIGZpbmFsIEZpbGxFdmVudEhpc3RvcnkuRXZlbnQgZXZlbnQyID0gZXZlbnRzLmdldCgxKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoZXZlbnQyLmdldFR5cGUoKSkuaXNFcXVhbFRvKFRZUEVfQ09OVEVYVF9DT01NSVRURUQpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChldmVudDIuZ2V0RGF0YXNldElkKCkpLmlzTnVsbCgpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChldmVudDIuZ2V0Q2xpZW50U3RhdGUoKSkuaXNOdWxsKCk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGV2ZW50Mi5nZXRTZWxlY3RlZERhdGFzZXRJZHMoKSkuY29udGFpbnNFeGFjdGx5KCJpZDEiKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoZXZlbnQyLmdldElnbm9yZWREYXRhc2V0SWRzKCkpLmNvbnRhaW5zRXhhY3RseSgiaWQyIik7CisgICAgICAgICAgICBmaW5hbCBNYXA8QXV0b2ZpbGxJZCwgU3RyaW5nPiBjaGFuZ2VkRmllbGRzID0gZXZlbnQyLmdldENoYW5nZWRGaWVsZHMoKTsKKyAgICAgICAgICAgIGZpbmFsIEF1dG9maWxsSWQgdXNlcm5hbWVJZCA9IG1BY3Rpdml0eS5nZXRVc2VybmFtZSgpLmdldEF1dG9maWxsSWQoKTsKKyAgICAgICAgICAgIGZpbmFsIEF1dG9maWxsSWQgcGFzc3dvcmRJZCA9IG1BY3Rpdml0eS5nZXRQYXNzd29yZCgpLmdldEF1dG9maWxsSWQoKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoY2hhbmdlZEZpZWxkcykuY29udGFpbnNFeGFjdGx5RW50cmllc0luKAorICAgICAgICAgICAgICAgICAgICBJbW11dGFibGVNYXAub2YodXNlcm5hbWVJZCwgImlkMSIsIHBhc3N3b3JkSWQsICJpZDEiKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGV2ZW50Mi5nZXRNYW51YWxseUVudGVyZWRGaWVsZCgpKS5pc0VtcHR5KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBzY2VuYXJpbyB3aGVyZSB0aGUgY29udGV4dCB3YXMgY29tbWl0dGVkLCBib3RoIGRhdGFzZXRzIHdlcmUgc2VsZWN0ZWQgYnkgdGhlIHVzZXIsCisgICAgICogYW5kIHRoZSB1c2VyIGNoYW5nZWQgdGhlIHZhbHVlcyBwcm92aWRlZCBieSB0aGUgc2VydmljZS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb250ZXh0Q29tbWl0dGVkX211bHRpcGxlRGF0YXNldHNTZWxlY3RlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBlbmFibGVTZXJ2aWNlKCk7CisKKyAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UobmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkuYWRkRGF0YXNldCgKKyAgICAgICAgICAgICAgICBuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJZCgiaWQxIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgInVzZXJuYW1lIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJkYXRhc2V0MSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLmFkZERhdGFzZXQobmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0SWQoImlkMiIpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfUEFTU1dPUkQsICJwYXNzd29yZCIpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiZGF0YXNldDIiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQorICAgICAgICAgICAgICAgIC5zZXRGaWxsUmVzcG9uc2VGbGFncyhGaWxsUmVzcG9uc2UuRkxBR19UUkFDS19DT05URVhUX0NPTU1JVEVEKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgbUFjdGl2aXR5LmV4cGVjdEF1dG9GaWxsKCJ1c2VybmFtZSIpOworCisgICAgICAgIC8vIFRyaWdnZXIgYXV0b2ZpbGwKKyAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoVmlldzo6cmVxdWVzdEZvY3VzKTsKKyAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CisKKyAgICAgICAgLy8gQXV0b2ZpbGwgdXNlcm5hbWUKKyAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQoImRhdGFzZXQxIik7CisgICAgICAgIG1BY3Rpdml0eS5hc3NlcnRBdXRvRmlsbGVkKCk7CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFZlcmlmeSBmaWxsIGhpc3RvcnkKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8RXZlbnQ+IGV2ZW50cyA9IEluc3RydW1lbnRlZEF1dG9GaWxsU2VydmljZS5nZXRGaWxsRXZlbnRzKDEpOworICAgICAgICAgICAgYXNzZXJ0RmlsbEV2ZW50Rm9yRGF0YXNldFNlbGVjdGVkKGV2ZW50cy5nZXQoMCksICJpZDEiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEF1dG9maWxsIHBhc3N3b3JkCisgICAgICAgIG1BY3Rpdml0eS5leHBlY3RQYXNzd29yZEF1dG9GaWxsKCJwYXNzd29yZCIpOworCisgICAgICAgIG1BY3Rpdml0eS5vblBhc3N3b3JkKFZpZXc6OnJlcXVlc3RGb2N1cyk7CisgICAgICAgIG1VaUJvdC5zZWxlY3REYXRhc2V0KCJkYXRhc2V0MiIpOworICAgICAgICBtQWN0aXZpdHkuYXNzZXJ0QXV0b0ZpbGxlZCgpOworCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFZlcmlmeSBmaWxsIGhpc3RvcnkKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8RXZlbnQ+IGV2ZW50cyA9IEluc3RydW1lbnRlZEF1dG9GaWxsU2VydmljZS5nZXRGaWxsRXZlbnRzKDIpOworCisgICAgICAgICAgICBhc3NlcnRGaWxsRXZlbnRGb3JEYXRhc2V0U2VsZWN0ZWQoZXZlbnRzLmdldCgwKSwgImlkMSIpOworICAgICAgICAgICAgYXNzZXJ0RmlsbEV2ZW50Rm9yRGF0YXNldFNlbGVjdGVkKGV2ZW50cy5nZXQoMSksICJpZDIiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZpbmlzaCB0aGUgY29udGV4dCBieSBsb2dpbiBpbgorICAgICAgICBtQWN0aXZpdHkub25QYXNzd29yZCgodikgLT4gdi5zZXRUZXh0KCJ1c2VybmFtZSIpKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWRNZXNzYWdlID0gZ2V0V2VsY29tZU1lc3NhZ2UoInVzZXJuYW1lIik7CisgICAgICAgIGZpbmFsIFN0cmluZyBhY3R1YWxNZXNzYWdlID0gbUFjdGl2aXR5LnRhcExvZ2luKCk7CisgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJXcm9uZyB3ZWxjb21lIG1zZyIpLnRoYXQoYWN0dWFsTWVzc2FnZSkuaXNFcXVhbFRvKGV4cGVjdGVkTWVzc2FnZSk7CisgICAgICAgIG1VaUJvdC5hc3NlcnRTYXZlTm90U2hvd2luZyhTQVZFX0RBVEFfVFlQRV9QQVNTV09SRCk7CisKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVmVyaWZ5IGZpbGwgaGlzdG9yeQorICAgICAgICAgICAgZmluYWwgTGlzdDxFdmVudD4gZXZlbnRzID0gSW5zdHJ1bWVudGVkQXV0b0ZpbGxTZXJ2aWNlLmdldEZpbGxFdmVudHMoMyk7CisKKyAgICAgICAgICAgIGFzc2VydEZpbGxFdmVudEZvckRhdGFzZXRTZWxlY3RlZChldmVudHMuZ2V0KDApLCAiaWQxIik7CisgICAgICAgICAgICBhc3NlcnRGaWxsRXZlbnRGb3JEYXRhc2V0U2VsZWN0ZWQoZXZlbnRzLmdldCgxKSwgImlkMiIpOworCisgICAgICAgICAgICBmaW5hbCBGaWxsRXZlbnRIaXN0b3J5LkV2ZW50IGV2ZW50MyA9IGV2ZW50cy5nZXQoMik7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGV2ZW50My5nZXRUeXBlKCkpLmlzRXF1YWxUbyhUWVBFX0NPTlRFWFRfQ09NTUlUVEVEKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoZXZlbnQzLmdldERhdGFzZXRJZCgpKS5pc051bGwoKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoZXZlbnQzLmdldENsaWVudFN0YXRlKCkpLmlzTnVsbCgpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChldmVudDMuZ2V0U2VsZWN0ZWREYXRhc2V0SWRzKCkpLmNvbnRhaW5zRXhhY3RseSgiaWQxIiwgImlkMiIpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChldmVudDMuZ2V0SWdub3JlZERhdGFzZXRJZHMoKSkuaXNFbXB0eSgpOworICAgICAgICAgICAgZmluYWwgTWFwPEF1dG9maWxsSWQsIFN0cmluZz4gY2hhbmdlZEZpZWxkcyA9IGV2ZW50My5nZXRDaGFuZ2VkRmllbGRzKCk7CisgICAgICAgICAgICBmaW5hbCBBdXRvZmlsbElkIHBhc3N3b3JkSWQgPSBtQWN0aXZpdHkuZ2V0UGFzc3dvcmQoKS5nZXRBdXRvZmlsbElkKCk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGNoYW5nZWRGaWVsZHMpLmNvbnRhaW5zRXhhY3RseShwYXNzd29yZElkLCAiaWQyIik7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGV2ZW50My5nZXRNYW51YWxseUVudGVyZWRGaWVsZCgpKS5pc0VtcHR5KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBzY2VuYXJpbyB3aGVyZSB0aGUgY29udGV4dCB3YXMgY29tbWl0dGVkLCBib3RoIGRhdGFzZXRzIHdlcmUgc2VsZWN0ZWQgYnkgdGhlIHVzZXIsCisgICAgICogYW5kIHRoZSB1c2VyIGRpZG4ndCBjaGFuZ2UgdGhlIHZhbHVlcyBwcm92aWRlZCBieSB0aGUgc2VydmljZS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb250ZXh0Q29tbWl0dGVkX211bHRpcGxlRGF0YXNldHNTZWxlY3RlZF9idXROb3RDaGFuZ2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKKworICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKS5hZGREYXRhc2V0KAorICAgICAgICAgICAgICAgIG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldElkKCJpZDEiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1VTRVJOQU1FLCBCQUNLRE9PUl9VU0VSTkFNRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJkYXRhc2V0MSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLmFkZERhdGFzZXQobmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0SWQoImlkMiIpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfUEFTU1dPUkQsICJ3aGF0ZXZlciIpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiZGF0YXNldDIiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQorICAgICAgICAgICAgICAgIC5zZXRGaWxsUmVzcG9uc2VGbGFncyhGaWxsUmVzcG9uc2UuRkxBR19UUkFDS19DT05URVhUX0NPTU1JVEVEKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgbUFjdGl2aXR5LmV4cGVjdEF1dG9GaWxsKEJBQ0tET09SX1VTRVJOQU1FKTsKKworICAgICAgICAvLyBUcmlnZ2VyIGF1dG9maWxsCisgICAgICAgIG1BY3Rpdml0eS5vblVzZXJuYW1lKFZpZXc6OnJlcXVlc3RGb2N1cyk7CisgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOworCisgICAgICAgIC8vIEF1dG9maWxsIHVzZXJuYW1lCisgICAgICAgIG1VaUJvdC5zZWxlY3REYXRhc2V0KCJkYXRhc2V0MSIpOworICAgICAgICBtQWN0aXZpdHkuYXNzZXJ0QXV0b0ZpbGxlZCgpOworICAgICAgICB7CisgICAgICAgICAgICAvLyBWZXJpZnkgZmlsbCBoaXN0b3J5CisgICAgICAgICAgICBmaW5hbCBMaXN0PEV2ZW50PiBldmVudHMgPSBJbnN0cnVtZW50ZWRBdXRvRmlsbFNlcnZpY2UuZ2V0RmlsbEV2ZW50cygxKTsKKyAgICAgICAgICAgIGFzc2VydEZpbGxFdmVudEZvckRhdGFzZXRTZWxlY3RlZChldmVudHMuZ2V0KDApLCAiaWQxIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBBdXRvZmlsbCBwYXNzd29yZAorICAgICAgICBtQWN0aXZpdHkuZXhwZWN0UGFzc3dvcmRBdXRvRmlsbCgid2hhdGV2ZXIiKTsKKworICAgICAgICBtQWN0aXZpdHkub25QYXNzd29yZChWaWV3OjpyZXF1ZXN0Rm9jdXMpOworICAgICAgICBtVWlCb3Quc2VsZWN0RGF0YXNldCgiZGF0YXNldDIiKTsKKyAgICAgICAgbUFjdGl2aXR5LmFzc2VydEF1dG9GaWxsZWQoKTsKKworICAgICAgICB7CisgICAgICAgICAgICAvLyBWZXJpZnkgZmlsbCBoaXN0b3J5CisgICAgICAgICAgICBmaW5hbCBMaXN0PEV2ZW50PiBldmVudHMgPSBJbnN0cnVtZW50ZWRBdXRvRmlsbFNlcnZpY2UuZ2V0RmlsbEV2ZW50cygyKTsKKworICAgICAgICAgICAgYXNzZXJ0RmlsbEV2ZW50Rm9yRGF0YXNldFNlbGVjdGVkKGV2ZW50cy5nZXQoMCksICJpZDEiKTsKKyAgICAgICAgICAgIGFzc2VydEZpbGxFdmVudEZvckRhdGFzZXRTZWxlY3RlZChldmVudHMuZ2V0KDEpLCAiaWQyIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBGaW5pc2ggdGhlIGNvbnRleHQgYnkgbG9naW4gaW4KKyAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdGVkTWVzc2FnZSA9IGdldFdlbGNvbWVNZXNzYWdlKEJBQ0tET09SX1VTRVJOQU1FKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGFjdHVhbE1lc3NhZ2UgPSBtQWN0aXZpdHkudGFwTG9naW4oKTsKKyAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoIldyb25nIHdlbGNvbWUgbXNnIikudGhhdChhY3R1YWxNZXNzYWdlKS5pc0VxdWFsVG8oZXhwZWN0ZWRNZXNzYWdlKTsKKyAgICAgICAgbVVpQm90LmFzc2VydFNhdmVOb3RTaG93aW5nKFNBVkVfREFUQV9UWVBFX1BBU1NXT1JEKTsKKworICAgICAgICB7CisgICAgICAgICAgICAvLyBWZXJpZnkgZmlsbCBoaXN0b3J5CisgICAgICAgICAgICBmaW5hbCBMaXN0PEV2ZW50PiBldmVudHMgPSBJbnN0cnVtZW50ZWRBdXRvRmlsbFNlcnZpY2UuZ2V0RmlsbEV2ZW50cygzKTsKKworICAgICAgICAgICAgYXNzZXJ0RmlsbEV2ZW50Rm9yRGF0YXNldFNlbGVjdGVkKGV2ZW50cy5nZXQoMCksICJpZDEiKTsKKyAgICAgICAgICAgIGFzc2VydEZpbGxFdmVudEZvckRhdGFzZXRTZWxlY3RlZChldmVudHMuZ2V0KDEpLCAiaWQyIik7CisKKyAgICAgICAgICAgIGZpbmFsIEZpbGxFdmVudEhpc3RvcnkuRXZlbnQgZXZlbnQzID0gZXZlbnRzLmdldCgyKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoZXZlbnQzLmdldFR5cGUoKSkuaXNFcXVhbFRvKFRZUEVfQ09OVEVYVF9DT01NSVRURUQpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChldmVudDMuZ2V0RGF0YXNldElkKCkpLmlzTnVsbCgpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChldmVudDMuZ2V0Q2xpZW50U3RhdGUoKSkuaXNOdWxsKCk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGV2ZW50My5nZXRTZWxlY3RlZERhdGFzZXRJZHMoKSkuY29udGFpbnNFeGFjdGx5KCJpZDEiLCAiaWQyIik7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGV2ZW50My5nZXRJZ25vcmVkRGF0YXNldElkcygpKS5pc0VtcHR5KCk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGV2ZW50My5nZXRDaGFuZ2VkRmllbGRzKCkpLmlzRW1wdHkoKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoZXZlbnQzLmdldE1hbnVhbGx5RW50ZXJlZEZpZWxkKCkpLmlzRW1wdHkoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHNjZW5hcmlvIHdoZXJlIHRoZSBjb250ZXh0IHdhcyBjb21taXR0ZWQsIHRoZSB1c2VyIHNlbGVjdGVkIHRoZSBkYXRhc2V0LCB0aGFuIGNoYW5nZWQKKyAgICAgKiB0aGUgYXV0b2ZpbGxlZCB2YWx1ZXMsIGJ1dCB0aGVuIGNoYW5nZSB0aGUgdmFsdWVzIGFnYWluIHNvIHRoZXkgbWF0Y2ggd2hhdCB3YXMgcHJvdmlkZWQgYnkKKyAgICAgKiB0aGUgc2VydmljZS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb250ZXh0Q29tbWl0dGVkX29uZURhdGFzZXRTZWxlY3RlZF9DaGFuZ2VkX3RoZW5DaGFuZ2VkQmFjaygpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZW5hYmxlU2VydmljZSgpOworCisgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpLmFkZERhdGFzZXQoCisgICAgICAgICAgICAgICAgbmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0SWQoImlkMSIpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfVVNFUk5BTUUsICJ1c2VybmFtZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfUEFTU1dPUkQsICJ1c2VybmFtZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiZGF0YXNldDEiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQorICAgICAgICAgICAgICAgIC5zZXRGaWxsUmVzcG9uc2VGbGFncyhGaWxsUmVzcG9uc2UuRkxBR19UUkFDS19DT05URVhUX0NPTU1JVEVEKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgbUFjdGl2aXR5LmV4cGVjdEF1dG9GaWxsKCJ1c2VybmFtZSIsICJ1c2VybmFtZSIpOworCisgICAgICAgIC8vIFRyaWdnZXIgYXV0b2ZpbGwgb24gdXNlcm5hbWUKKyAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoVmlldzo6cmVxdWVzdEZvY3VzKTsKKyAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CisKKyAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQoImRhdGFzZXQxIik7CisgICAgICAgIG1BY3Rpdml0eS5hc3NlcnRBdXRvRmlsbGVkKCk7CisKKyAgICAgICAgLy8gVmVyaWZ5IGRhdGFzZXQgc2VsZWN0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8RXZlbnQ+IGV2ZW50cyA9IEluc3RydW1lbnRlZEF1dG9GaWxsU2VydmljZS5nZXRGaWxsRXZlbnRzKDEpOworICAgICAgICAgICAgYXNzZXJ0RmlsbEV2ZW50Rm9yRGF0YXNldFNlbGVjdGVkKGV2ZW50cy5nZXQoMCksICJpZDEiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoYW5nZSB0aGUgZmllbGRzIHRvIGRpZmZlcmVudCB2YWx1ZXMgZnJvbSBkYXRhc2V0cworICAgICAgICBtQWN0aXZpdHkub25Vc2VybmFtZSgodikgLT4gdi5zZXRUZXh0KCJVU0VSTkFNRSIpKTsKKyAgICAgICAgbUFjdGl2aXR5Lm9uUGFzc3dvcmQoKHYpIC0+IHYuc2V0VGV4dCgiVVNFUk5BTUUiKSk7CisKKyAgICAgICAgLy8gVGhlbiBjaGFuZ2UgYmFjayB0byBkYXRhc2V0IHZhbHVlcworICAgICAgICBtQWN0aXZpdHkub25Vc2VybmFtZSgodikgLT4gdi5zZXRUZXh0KCJ1c2VybmFtZSIpKTsKKyAgICAgICAgbUFjdGl2aXR5Lm9uUGFzc3dvcmQoKHYpIC0+IHYuc2V0VGV4dCgidXNlcm5hbWUiKSk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdGVkTWVzc2FnZSA9IGdldFdlbGNvbWVNZXNzYWdlKCJ1c2VybmFtZSIpOworICAgICAgICBmaW5hbCBTdHJpbmcgYWN0dWFsTWVzc2FnZSA9IG1BY3Rpdml0eS50YXBMb2dpbigpOworICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiV3Jvbmcgd2VsY29tZSBtc2ciKS50aGF0KGFjdHVhbE1lc3NhZ2UpLmlzRXF1YWxUbyhleHBlY3RlZE1lc3NhZ2UpOworICAgICAgICBtVWlCb3QuYXNzZXJ0U2F2ZU5vdFNob3dpbmcoU0FWRV9EQVRBX1RZUEVfUEFTU1dPUkQpOworCisgICAgICAgIC8vIC4uLmFuZCBjaGVjayBhZ2FpbgorICAgICAgICB7CisgICAgICAgICAgICBmaW5hbCBMaXN0PEV2ZW50PiBldmVudHMgPSBJbnN0cnVtZW50ZWRBdXRvRmlsbFNlcnZpY2UuZ2V0RmlsbEV2ZW50cygyKTsKKyAgICAgICAgICAgIGFzc2VydEZpbGxFdmVudEZvckRhdGFzZXRTZWxlY3RlZChldmVudHMuZ2V0KDApLCAiaWQxIik7CisKKyAgICAgICAgICAgIEZpbGxFdmVudEhpc3RvcnkuRXZlbnQgZXZlbnQyID0gZXZlbnRzLmdldCgxKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoZXZlbnQyLmdldFR5cGUoKSkuaXNFcXVhbFRvKFRZUEVfQ09OVEVYVF9DT01NSVRURUQpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChldmVudDIuZ2V0RGF0YXNldElkKCkpLmlzTnVsbCgpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChldmVudDIuZ2V0Q2xpZW50U3RhdGUoKSkuaXNOdWxsKCk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGV2ZW50Mi5nZXRTZWxlY3RlZERhdGFzZXRJZHMoKSkuY29udGFpbnNFeGFjdGx5KCJpZDEiKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoZXZlbnQyLmdldElnbm9yZWREYXRhc2V0SWRzKCkpLmlzRW1wdHkoKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoZXZlbnQyLmdldENoYW5nZWRGaWVsZHMoKSkuaXNFbXB0eSgpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChldmVudDIuZ2V0TWFudWFsbHlFbnRlcmVkRmllbGQoKSkuaXNFbXB0eSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgc2NlbmFyaW8gd2hlcmUgdGhlIGNvbnRleHQgd2FzIGNvbW1pdHRlZCwgdGhlIHVzZXIgZGlkIG5vdCBzZWxlY3RlZCBhbnkgZGF0YXNldCwgYnV0CisgICAgICogdGhlIHVzZXIgbWFudWFsbHkgZW50ZXJlZCB2YWx1ZXMgdGhhdCBtYXRjaCB3aGF0IHdhcyBwcm92aWRlZCBieSB0aGUgc2VydmljZS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb250ZXh0Q29tbWl0dGVkX25vRGF0YXNldFNlbGVjdGVkX2J1dE1hbnVhbGx5RW50ZXJlZCgpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZW5hYmxlU2VydmljZSgpOworCisgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpLmFkZERhdGFzZXQoCisgICAgICAgICAgICAgICAgbmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0SWQoImlkMSIpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfVVNFUk5BTUUsIEJBQ0tET09SX1VTRVJOQU1FKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1BBU1NXT1JELCAiTm90VXNlZFBhc3N3b3JkIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJkYXRhc2V0MSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLmFkZERhdGFzZXQobmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0SWQoImlkMiIpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfVVNFUk5BTUUsICJOb3RVc2VyVXNlcm5hbWUiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1BBU1NXT1JELCAid2hhdGV2ZXIiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oImRhdGFzZXQyIikpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuc2V0RmlsbFJlc3BvbnNlRmxhZ3MoRmlsbFJlc3BvbnNlLkZMQUdfVFJBQ0tfQ09OVEVYVF9DT01NSVRFRCkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgICAgIC8vIFRyaWdnZXIgYXV0b2ZpbGwgb24gdXNlcm5hbWUKKyAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoVmlldzo6cmVxdWVzdEZvY3VzKTsKKyAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cygiZGF0YXNldDEiLCAiZGF0YXNldDIiKTsKKworICAgICAgICAvLyBWZXJpZnkgaGlzdG9yeQorICAgICAgICBJbnN0cnVtZW50ZWRBdXRvRmlsbFNlcnZpY2UuZ2V0RmlsbEV2ZW50SGlzdG9yeSgwKTsKKworICAgICAgICAvLyBFbnRlciB2YWx1ZXMgcHJlc2VudCBhdCB0aGUgZGF0YXNldHMKKyAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoKHYpIC0+IHYuc2V0VGV4dChCQUNLRE9PUl9VU0VSTkFNRSkpOworICAgICAgICBtQWN0aXZpdHkub25QYXNzd29yZCgodikgLT4gdi5zZXRUZXh0KCJ3aGF0ZXZlciIpKTsKKworICAgICAgICAvLyBGaW5pc2ggdGhlIGNvbnRleHQgYnkgbG9naW4gaW4KKyAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdGVkTWVzc2FnZSA9IGdldFdlbGNvbWVNZXNzYWdlKEJBQ0tET09SX1VTRVJOQU1FKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGFjdHVhbE1lc3NhZ2UgPSBtQWN0aXZpdHkudGFwTG9naW4oKTsKKyAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoIldyb25nIHdlbGNvbWUgbXNnIikudGhhdChhY3R1YWxNZXNzYWdlKS5pc0VxdWFsVG8oZXhwZWN0ZWRNZXNzYWdlKTsKKyAgICAgICAgbVVpQm90LmFzc2VydFNhdmVOb3RTaG93aW5nKFNBVkVfREFUQV9UWVBFX1BBU1NXT1JEKTsKKworICAgICAgICAvLyBWZXJpZnkgaGlzdG9yeQorICAgICAgICB7CisgICAgICAgICAgICBmaW5hbCBMaXN0PEV2ZW50PiBldmVudHMgPSBJbnN0cnVtZW50ZWRBdXRvRmlsbFNlcnZpY2UuZ2V0RmlsbEV2ZW50cygxKTsKKyAgICAgICAgICAgIEZpbGxFdmVudEhpc3RvcnkuRXZlbnQgZXZlbnQgPSBldmVudHMuZ2V0KDApOworICAgICAgICAgICAgYXNzZXJ0VGhhdChldmVudC5nZXRUeXBlKCkpLmlzRXF1YWxUbyhUWVBFX0NPTlRFWFRfQ09NTUlUVEVEKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoZXZlbnQuZ2V0RGF0YXNldElkKCkpLmlzTnVsbCgpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChldmVudC5nZXRDbGllbnRTdGF0ZSgpKS5pc051bGwoKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoZXZlbnQuZ2V0U2VsZWN0ZWREYXRhc2V0SWRzKCkpLmlzRW1wdHkoKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoZXZlbnQuZ2V0SWdub3JlZERhdGFzZXRJZHMoKSkuY29udGFpbnNFeGFjdGx5KCJpZDEiLCAiaWQyIik7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGV2ZW50LmdldENoYW5nZWRGaWVsZHMoKSkuaXNFbXB0eSgpOworICAgICAgICAgICAgZmluYWwgQXV0b2ZpbGxJZCB1c2VybmFtZUlkID0gbUFjdGl2aXR5LmdldFVzZXJuYW1lKCkuZ2V0QXV0b2ZpbGxJZCgpOworICAgICAgICAgICAgZmluYWwgQXV0b2ZpbGxJZCBwYXNzd29yZElkID0gbUFjdGl2aXR5LmdldFBhc3N3b3JkKCkuZ2V0QXV0b2ZpbGxJZCgpOworCisgICAgICAgICAgICBmaW5hbCBNYXA8QXV0b2ZpbGxJZCwgU2V0PFN0cmluZz4+IG1hbnVhbGx5RW50ZXJlZEZpZWxkcyA9CisgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldE1hbnVhbGx5RW50ZXJlZEZpZWxkKCk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KG1hbnVhbGx5RW50ZXJlZEZpZWxkcykuaXNOb3ROdWxsKCk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KG1hbnVhbGx5RW50ZXJlZEZpZWxkcy5zaXplKCkpLmlzRXF1YWxUbygyKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQobWFudWFsbHlFbnRlcmVkRmllbGRzLmdldCh1c2VybmFtZUlkKSkuY29udGFpbnNFeGFjdGx5KCJpZDEiKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQobWFudWFsbHlFbnRlcmVkRmllbGRzLmdldChwYXNzd29yZElkKSkuY29udGFpbnNFeGFjdGx5KCJpZDIiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHNjZW5hcmlvIHdoZXJlIHRoZSBjb250ZXh0IHdhcyBjb21taXR0ZWQsIHRoZSB1c2VyIGRpZCBub3Qgc2VsZWN0ZWQgYW55IGRhdGFzZXQsIGJ1dAorICAgICAqIHRoZSB1c2VyIG1hbnVhbGx5IGVudGVyZWQgdmFsdWVzIHRoYXQgbWF0Y2ggd2hhdCB3YXMgcHJvdmlkZWQgYnkgdGhlIHNlcnZpY2Ugb24gZGlmZmVyZW50CisgICAgICogZGF0YXNldHMuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGV4dENvbW1pdHRlZF9ub0RhdGFzZXRTZWxlY3RlZF9idXRNYW51YWxseUVudGVyZWRfbWF0Y2hpbmdNdWx0aXBsZURhdGFzZXRzKCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBlbmFibGVTZXJ2aWNlKCk7CisKKyAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UobmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkuYWRkRGF0YXNldCgKKyAgICAgICAgICAgICAgICBuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJZCgiaWQxIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgQkFDS0RPT1JfVVNFUk5BTUUpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfUEFTU1dPUkQsICJOb3RVc2VkUGFzc3dvcmQiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oImRhdGFzZXQxIikpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuYWRkRGF0YXNldChuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJZCgiaWQyIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgIk5vdFVzZXJVc2VybmFtZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfUEFTU1dPUkQsICJ3aGF0ZXZlciIpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiZGF0YXNldDIiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQorICAgICAgICAgICAgICAgIC5hZGREYXRhc2V0KG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldElkKCJpZDMiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1VTRVJOQU1FLCBCQUNLRE9PUl9VU0VSTkFNRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9QQVNTV09SRCwgIndoYXRldmVyIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJkYXRhc2V0MyIpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLnNldEZpbGxSZXNwb25zZUZsYWdzKEZpbGxSZXNwb25zZS5GTEFHX1RSQUNLX0NPTlRFWFRfQ09NTUlURUQpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICAvLyBUcmlnZ2VyIGF1dG9maWxsIG9uIHVzZXJuYW1lCisgICAgICAgIG1BY3Rpdml0eS5vblVzZXJuYW1lKFZpZXc6OnJlcXVlc3RGb2N1cyk7CisgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoImRhdGFzZXQxIiwgImRhdGFzZXQyIiwgImRhdGFzZXQzIik7CisKKyAgICAgICAgLy8gVmVyaWZ5IGhpc3RvcnkKKyAgICAgICAgSW5zdHJ1bWVudGVkQXV0b0ZpbGxTZXJ2aWNlLmdldEZpbGxFdmVudEhpc3RvcnkoMCk7CisKKyAgICAgICAgLy8gRW50ZXIgdmFsdWVzIHByZXNlbnQgYXQgdGhlIGRhdGFzZXRzCisgICAgICAgIG1BY3Rpdml0eS5vblVzZXJuYW1lKCh2KSAtPiB2LnNldFRleHQoQkFDS0RPT1JfVVNFUk5BTUUpKTsKKyAgICAgICAgbUFjdGl2aXR5Lm9uUGFzc3dvcmQoKHYpIC0+IHYuc2V0VGV4dCgid2hhdGV2ZXIiKSk7CisKKyAgICAgICAgLy8gRmluaXNoIHRoZSBjb250ZXh0IGJ5IGxvZ2luIGluCisgICAgICAgIGZpbmFsIFN0cmluZyBleHBlY3RlZE1lc3NhZ2UgPSBnZXRXZWxjb21lTWVzc2FnZShCQUNLRE9PUl9VU0VSTkFNRSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBhY3R1YWxNZXNzYWdlID0gbUFjdGl2aXR5LnRhcExvZ2luKCk7CisgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJXcm9uZyB3ZWxjb21lIG1zZyIpLnRoYXQoYWN0dWFsTWVzc2FnZSkuaXNFcXVhbFRvKGV4cGVjdGVkTWVzc2FnZSk7CisgICAgICAgIG1VaUJvdC5hc3NlcnRTYXZlTm90U2hvd2luZyhTQVZFX0RBVEFfVFlQRV9QQVNTV09SRCk7CisKKyAgICAgICAgLy8gVmVyaWZ5IGhpc3RvcnkKKyAgICAgICAgeworICAgICAgICAgICAgZmluYWwgTGlzdDxFdmVudD4gZXZlbnRzID0gSW5zdHJ1bWVudGVkQXV0b0ZpbGxTZXJ2aWNlLmdldEZpbGxFdmVudHMoMSk7CisKKyAgICAgICAgICAgIGZpbmFsIEZpbGxFdmVudEhpc3RvcnkuRXZlbnQgZXZlbnQgPSBldmVudHMuZ2V0KDApOworICAgICAgICAgICAgYXNzZXJ0VGhhdChldmVudC5nZXRUeXBlKCkpLmlzRXF1YWxUbyhUWVBFX0NPTlRFWFRfQ09NTUlUVEVEKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoZXZlbnQuZ2V0RGF0YXNldElkKCkpLmlzTnVsbCgpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChldmVudC5nZXRDbGllbnRTdGF0ZSgpKS5pc051bGwoKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoZXZlbnQuZ2V0U2VsZWN0ZWREYXRhc2V0SWRzKCkpLmlzRW1wdHkoKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoZXZlbnQuZ2V0SWdub3JlZERhdGFzZXRJZHMoKSkuY29udGFpbnNFeGFjdGx5KCJpZDEiLCAiaWQyIiwgImlkMyIpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChldmVudC5nZXRDaGFuZ2VkRmllbGRzKCkpLmlzRW1wdHkoKTsKKyAgICAgICAgICAgIGZpbmFsIEF1dG9maWxsSWQgdXNlcm5hbWVJZCA9IG1BY3Rpdml0eS5nZXRVc2VybmFtZSgpLmdldEF1dG9maWxsSWQoKTsKKyAgICAgICAgICAgIGZpbmFsIEF1dG9maWxsSWQgcGFzc3dvcmRJZCA9IG1BY3Rpdml0eS5nZXRQYXNzd29yZCgpLmdldEF1dG9maWxsSWQoKTsKKworICAgICAgICAgICAgZmluYWwgTWFwPEF1dG9maWxsSWQsIFNldDxTdHJpbmc+PiBtYW51YWxseUVudGVyZWRGaWVsZHMgPQorICAgICAgICAgICAgICAgICAgICBldmVudC5nZXRNYW51YWxseUVudGVyZWRGaWVsZCgpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChtYW51YWxseUVudGVyZWRGaWVsZHMuc2l6ZSgpKS5pc0VxdWFsVG8oMik7CisgICAgICAgICAgICBhc3NlcnRUaGF0KG1hbnVhbGx5RW50ZXJlZEZpZWxkcy5nZXQodXNlcm5hbWVJZCkpLmNvbnRhaW5zRXhhY3RseSgiaWQxIiwgImlkMyIpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChtYW51YWxseUVudGVyZWRGaWVsZHMuZ2V0KHBhc3N3b3JkSWQpKS5jb250YWluc0V4YWN0bHkoImlkMiIsICJpZDMiKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0ZpbGxSZXNwb25zZVRlc3QuamF2YSBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0ZpbGxSZXNwb25zZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGQ3NDcxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvRmlsbFJlc3BvbnNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHM7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2aWNlLmF1dG9maWxsLkZpbGxSZXNwb25zZS5GTEFHX0RJU0FCTEVfQUNUSVZJVFlfT05MWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2aWNlLmF1dG9maWxsLkZpbGxSZXNwb25zZS5GTEFHX1RSQUNLX0NPTlRFWFRfQ09NTUlURUQ7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24udHJ1dGguVHJ1dGguYXNzZXJ0VGhhdDsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnRUaHJvd3M7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50U2VuZGVyOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKK2ltcG9ydCBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuRGF0YXNldDsKK2ltcG9ydCBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuRmlsbFJlc3BvbnNlOworaW1wb3J0IGFuZHJvaWQuc2VydmljZS5hdXRvZmlsbC5TYXZlSW5mbzsKK2ltcG9ydCBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuVXNlckRhdGE7CitpbXBvcnQgYW5kcm9pZC52aWV3LmF1dG9maWxsLkF1dG9maWxsSWQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LmF1dG9maWxsLkF1dG9maWxsVmFsdWU7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3M7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLm1vY2tpdG8uTW9jazsKK2ltcG9ydCBvcmcubW9ja2l0by5qdW5pdC5Nb2NraXRvSlVuaXRSdW5uZXI7CisKK0BSdW5XaXRoKE1vY2tpdG9KVW5pdFJ1bm5lci5jbGFzcykKK0BBcHBNb2RlRnVsbCAvLyBVbml0IHRlc3QKK3B1YmxpYyBjbGFzcyBGaWxsUmVzcG9uc2VUZXN0IHsKKworICAgIHByaXZhdGUgZmluYWwgQXV0b2ZpbGxJZCBtQXV0b2ZpbGxJZCA9IG5ldyBBdXRvZmlsbElkKDQyKTsKKyAgICBwcml2YXRlIGZpbmFsIEZpbGxSZXNwb25zZS5CdWlsZGVyIG1CdWlsZGVyID0gbmV3IEZpbGxSZXNwb25zZS5CdWlsZGVyKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBBdXRvZmlsbElkW10gbUlkcyA9IG5ldyBBdXRvZmlsbElkW10geyBtQXV0b2ZpbGxJZCB9OworICAgIHByaXZhdGUgZmluYWwgU2F2ZUluZm8gbVNhdmVJbmZvID0gbmV3IFNhdmVJbmZvLkJ1aWxkZXIoMCwgbUlkcykuYnVpbGQoKTsKKyAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtQ2xpZW50U3RhdGUgPSBuZXcgQnVuZGxlKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBEYXRhc2V0IG1EYXRhc2V0ID0gbmV3IERhdGFzZXQuQnVpbGRlcigpCisgICAgICAgICAgICAuc2V0VmFsdWUobUF1dG9maWxsSWQsIEF1dG9maWxsVmFsdWUuZm9yVGV4dCgiZm9ydHktdHdvIikpCisgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICBwcml2YXRlIGZpbmFsIGxvbmcgbURpc2FibGVEdXJhdGlvbiA9IDY2NjsKKyAgICBATW9jayBwcml2YXRlIFJlbW90ZVZpZXdzIG1QcmVzZW50YXRpb247CisgICAgQE1vY2sgcHJpdmF0ZSBSZW1vdGVWaWV3cyBtSGVhZGVyOworICAgIEBNb2NrIHByaXZhdGUgUmVtb3RlVmlld3MgbUZvb3RlcjsKKyAgICBATW9jayBwcml2YXRlIEludGVudFNlbmRlciBtSW50ZW50U2VuZGVyOworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QnVpbGRlcl9zZXRBdXRoZW50aWNhdGlvbl9pbnZhbGlkKCkgeworICAgICAgICAvLyBudWxsIGlkcworICAgICAgICBhc3NlcnRUaHJvd3MoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzLAorICAgICAgICAgICAgICAgICgpIC0+IG1CdWlsZGVyLnNldEF1dGhlbnRpY2F0aW9uKG51bGwsIG1JbnRlbnRTZW5kZXIsIG1QcmVzZW50YXRpb24pKTsKKyAgICAgICAgLy8gZW1wdHkgaWRzCisgICAgICAgIGFzc2VydFRocm93cyhJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MsCisgICAgICAgICAgICAgICAgKCkgLT4gbUJ1aWxkZXIuc2V0QXV0aGVudGljYXRpb24obmV3IEF1dG9maWxsSWRbXSB7fSwgbUludGVudFNlbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QcmVzZW50YXRpb24pKTsKKyAgICAgICAgLy8gaWRzIHdpdGggbnVsbCB2YWx1ZQorICAgICAgICBhc3NlcnRUaHJvd3MoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzLAorICAgICAgICAgICAgICAgICgpIC0+IG1CdWlsZGVyLnNldEF1dGhlbnRpY2F0aW9uKG5ldyBBdXRvZmlsbElkW10ge251bGx9LCBtSW50ZW50U2VuZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgbVByZXNlbnRhdGlvbikpOworICAgICAgICAvLyBudWxsIGludGVudCBzZW5kZXIKKyAgICAgICAgYXNzZXJ0VGhyb3dzKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAoKSAtPiBtQnVpbGRlci5zZXRBdXRoZW50aWNhdGlvbihtSWRzLCBudWxsLCBtUHJlc2VudGF0aW9uKSk7CisgICAgICAgIC8vIG51bGwgcHJlc2VudGF0aW9uCisgICAgICAgIGFzc2VydFRocm93cyhJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MsCisgICAgICAgICAgICAgICAgKCkgLT4gbUJ1aWxkZXIuc2V0QXV0aGVudGljYXRpb24obUlkcywgbUludGVudFNlbmRlciwgbnVsbCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJ1aWxkZXJfc2V0QXV0aGVudGljYXRpb25fdmFsaWQoKSB7CisgICAgICAgIG5ldyBGaWxsUmVzcG9uc2UuQnVpbGRlcigpLnNldEF1dGhlbnRpY2F0aW9uKG1JZHMsIG51bGwsIG51bGwpOworICAgICAgICBuZXcgRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKS5zZXRBdXRoZW50aWNhdGlvbihtSWRzLCBtSW50ZW50U2VuZGVyLCBtUHJlc2VudGF0aW9uKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCdWlsZGVyX3NldEF1dGhlbnRpY2F0aW9uX2lsbGVnYWxTdGF0ZSgpIHsKKyAgICAgICAgYXNzZXJ0VGhyb3dzKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAoKSAtPiBuZXcgRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKS5zZXRIZWFkZXIobUhlYWRlcikuc2V0QXV0aGVudGljYXRpb24obUlkcywKKyAgICAgICAgICAgICAgICAgICAgICAgIG1JbnRlbnRTZW5kZXIsIG1QcmVzZW50YXRpb24pKTsKKyAgICAgICAgYXNzZXJ0VGhyb3dzKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAoKSAtPiBuZXcgRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKS5zZXRGb290ZXIobUZvb3Rlcikuc2V0QXV0aGVudGljYXRpb24obUlkcywKKyAgICAgICAgICAgICAgICAgICAgICAgIG1JbnRlbnRTZW5kZXIsIG1QcmVzZW50YXRpb24pKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCdWlsZGVyX3NldEhlYWRlck9yRm9vdGVySW52YWxpZCgpIHsKKyAgICAgICAgYXNzZXJ0VGhyb3dzKE51bGxQb2ludGVyRXhjZXB0aW9uLmNsYXNzLCAoKSAtPiBuZXcgRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKS5zZXRIZWFkZXIobnVsbCkpOworICAgICAgICBhc3NlcnRUaHJvd3MoTnVsbFBvaW50ZXJFeGNlcHRpb24uY2xhc3MsICgpIC0+IG5ldyBGaWxsUmVzcG9uc2UuQnVpbGRlcigpLnNldEZvb3RlcihudWxsKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QnVpbGRlcl9zZXRIZWFkZXJPckZvb3RlckFmdGVyQXV0aGVudGljYXRpb24oKSB7CisgICAgICAgIEZpbGxSZXNwb25zZS5CdWlsZGVyIGJ1aWxkZXIgPQorICAgICAgICAgICAgICAgIG5ldyBGaWxsUmVzcG9uc2UuQnVpbGRlcigpLnNldEF1dGhlbnRpY2F0aW9uKG1JZHMsIG1JbnRlbnRTZW5kZXIsIG1QcmVzZW50YXRpb24pOworICAgICAgICBhc3NlcnRUaHJvd3MoSWxsZWdhbFN0YXRlRXhjZXB0aW9uLmNsYXNzLCAoKSAtPiBidWlsZGVyLnNldEhlYWRlcihtSGVhZGVyKSk7CisgICAgICAgIGFzc2VydFRocm93cyhJbGxlZ2FsU3RhdGVFeGNlcHRpb24uY2xhc3MsICgpIC0+IGJ1aWxkZXIuc2V0SGVhZGVyKG1Gb290ZXIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCdWlsZGVyX3NldEZsYWdfaW52YWxpZCgpIHsKKyAgICAgICAgYXNzZXJ0VGhyb3dzKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcywgKCkgLT4gbUJ1aWxkZXIuc2V0RmxhZ3MoLTEpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCdWlsZGVyX3NldEZsYWdfdmFsaWQoKSB7CisgICAgICAgIG1CdWlsZGVyLnNldEZsYWdzKDApOworICAgICAgICBtQnVpbGRlci5zZXRGbGFncyhGTEFHX1RSQUNLX0NPTlRFWFRfQ09NTUlURUQpOworICAgICAgICBtQnVpbGRlci5zZXRGbGFncyhGTEFHX0RJU0FCTEVfQUNUSVZJVFlfT05MWSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QnVpbGRlcl9kaXNhYmxlQXV0b2ZpbGxfaW52YWxpZCgpIHsKKyAgICAgICAgYXNzZXJ0VGhyb3dzKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcywgKCkgLT4gbUJ1aWxkZXIuZGlzYWJsZUF1dG9maWxsKDApKTsKKyAgICAgICAgYXNzZXJ0VGhyb3dzKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcywgKCkgLT4gbUJ1aWxkZXIuZGlzYWJsZUF1dG9maWxsKC0xKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QnVpbGRlcl9kaXNhYmxlQXV0b2ZpbGxfdmFsaWQoKSB7CisgICAgICAgIG1CdWlsZGVyLmRpc2FibGVBdXRvZmlsbChtRGlzYWJsZUR1cmF0aW9uKTsKKyAgICAgICAgbUJ1aWxkZXIuZGlzYWJsZUF1dG9maWxsKExvbmcuTUFYX1ZBTFVFKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCdWlsZGVyX2Rpc2FibGVBdXRvZmlsbF9tdXN0QmVUaGVPbmx5TWV0aG9kQ2FsbGVkKCkgeworICAgICAgICAvLyBObyBtZXRob2QgY2FuIGJlIGNhbGxlZCBhZnRlciBkaXNhYmxlQXV0b2ZpbGwoKQorICAgICAgICBtQnVpbGRlci5kaXNhYmxlQXV0b2ZpbGwobURpc2FibGVEdXJhdGlvbik7CisgICAgICAgIGFzc2VydFRocm93cyhJbGxlZ2FsU3RhdGVFeGNlcHRpb24uY2xhc3MsICgpIC0+IG1CdWlsZGVyLnNldFNhdmVJbmZvKG1TYXZlSW5mbykpOworICAgICAgICBhc3NlcnRUaHJvd3MoSWxsZWdhbFN0YXRlRXhjZXB0aW9uLmNsYXNzLCAoKSAtPiBtQnVpbGRlci5hZGREYXRhc2V0KG1EYXRhc2V0KSk7CisgICAgICAgIGFzc2VydFRocm93cyhJbGxlZ2FsU3RhdGVFeGNlcHRpb24uY2xhc3MsCisgICAgICAgICAgICAgICAgKCkgLT4gbUJ1aWxkZXIuc2V0QXV0aGVudGljYXRpb24obUlkcywgbUludGVudFNlbmRlciwgbVByZXNlbnRhdGlvbikpOworICAgICAgICBhc3NlcnRUaHJvd3MoSWxsZWdhbFN0YXRlRXhjZXB0aW9uLmNsYXNzLAorICAgICAgICAgICAgICAgICgpIC0+IG1CdWlsZGVyLnNldEZpZWxkQ2xhc3NpZmljYXRpb25JZHMobUF1dG9maWxsSWQpKTsKKyAgICAgICAgYXNzZXJ0VGhyb3dzKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAoKSAtPiBtQnVpbGRlci5zZXRDbGllbnRTdGF0ZShtQ2xpZW50U3RhdGUpKTsKKworICAgICAgICAvLyBBbmQgdmljZS12ZXJzYS4uLgorICAgICAgICBmaW5hbCBGaWxsUmVzcG9uc2UuQnVpbGRlciBidWlsZGVyMSA9IG5ldyBGaWxsUmVzcG9uc2UuQnVpbGRlcigpLnNldFNhdmVJbmZvKG1TYXZlSW5mbyk7CisgICAgICAgIGFzc2VydFRocm93cyhJbGxlZ2FsU3RhdGVFeGNlcHRpb24uY2xhc3MsICgpIC0+IGJ1aWxkZXIxLmRpc2FibGVBdXRvZmlsbChtRGlzYWJsZUR1cmF0aW9uKSk7CisgICAgICAgIGZpbmFsIEZpbGxSZXNwb25zZS5CdWlsZGVyIGJ1aWxkZXIyID0gbmV3IEZpbGxSZXNwb25zZS5CdWlsZGVyKCkuYWRkRGF0YXNldChtRGF0YXNldCk7CisgICAgICAgIGFzc2VydFRocm93cyhJbGxlZ2FsU3RhdGVFeGNlcHRpb24uY2xhc3MsICgpIC0+IGJ1aWxkZXIyLmRpc2FibGVBdXRvZmlsbChtRGlzYWJsZUR1cmF0aW9uKSk7CisgICAgICAgIGZpbmFsIEZpbGxSZXNwb25zZS5CdWlsZGVyIGJ1aWxkZXIzID0KKyAgICAgICAgICAgICAgICBuZXcgRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKS5zZXRBdXRoZW50aWNhdGlvbihtSWRzLCBtSW50ZW50U2VuZGVyLCBtUHJlc2VudGF0aW9uKTsKKyAgICAgICAgYXNzZXJ0VGhyb3dzKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbi5jbGFzcywgKCkgLT4gYnVpbGRlcjMuZGlzYWJsZUF1dG9maWxsKG1EaXNhYmxlRHVyYXRpb24pKTsKKyAgICAgICAgZmluYWwgRmlsbFJlc3BvbnNlLkJ1aWxkZXIgYnVpbGRlcjQgPQorICAgICAgICAgICAgICAgIG5ldyBGaWxsUmVzcG9uc2UuQnVpbGRlcigpLnNldEZpZWxkQ2xhc3NpZmljYXRpb25JZHMobUF1dG9maWxsSWQpOworICAgICAgICBhc3NlcnRUaHJvd3MoSWxsZWdhbFN0YXRlRXhjZXB0aW9uLmNsYXNzLCAoKSAtPiBidWlsZGVyNC5kaXNhYmxlQXV0b2ZpbGwobURpc2FibGVEdXJhdGlvbikpOworICAgICAgICBmaW5hbCBGaWxsUmVzcG9uc2UuQnVpbGRlciBidWlsZGVyNSA9CisgICAgICAgICAgICAgICAgbmV3IEZpbGxSZXNwb25zZS5CdWlsZGVyKCkuc2V0Q2xpZW50U3RhdGUobUNsaWVudFN0YXRlKTsKKyAgICAgICAgYXNzZXJ0VGhyb3dzKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbi5jbGFzcywgKCkgLT4gYnVpbGRlcjUuZGlzYWJsZUF1dG9maWxsKG1EaXNhYmxlRHVyYXRpb24pKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCdWlsZGVyX3NldEZpZWxkQ2xhc3NpZmljYXRpb25JZHNfaW52YWxpZCgpIHsKKyAgICAgICAgYXNzZXJ0VGhyb3dzKE51bGxQb2ludGVyRXhjZXB0aW9uLmNsYXNzLAorICAgICAgICAgICAgICAgICgpIC0+IG1CdWlsZGVyLnNldEZpZWxkQ2xhc3NpZmljYXRpb25JZHMoKEF1dG9maWxsSWQpIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0VGhyb3dzKE51bGxQb2ludGVyRXhjZXB0aW9uLmNsYXNzLAorICAgICAgICAgICAgICAgICgpIC0+IG1CdWlsZGVyLnNldEZpZWxkQ2xhc3NpZmljYXRpb25JZHMoKEF1dG9maWxsSWRbXSkgbnVsbCkpOworICAgICAgICBmaW5hbCBBdXRvZmlsbElkW10gb25lVG9vTWFueSA9CisgICAgICAgICAgICAgICAgbmV3IEF1dG9maWxsSWRbVXNlckRhdGEuZ2V0TWF4RmllbGRDbGFzc2lmaWNhdGlvbklkc1NpemUoKSArIDFdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9uZVRvb01hbnkubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIG9uZVRvb01hbnlbaV0gPSBuZXcgQXV0b2ZpbGxJZChpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUaHJvd3MoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzLAorICAgICAgICAgICAgICAgICgpIC0+IG1CdWlsZGVyLnNldEZpZWxkQ2xhc3NpZmljYXRpb25JZHMob25lVG9vTWFueSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJ1aWxkZXJfc2V0RmllbGRDbGFzc2lmaWNhdGlvbklkc192YWxpZCgpIHsKKyAgICAgICAgbUJ1aWxkZXIuc2V0RmllbGRDbGFzc2lmaWNhdGlvbklkcyhtQXV0b2ZpbGxJZCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QnVpbGRlcl9zZXRGaWVsZENsYXNzaWZpY2F0aW9uSWRzX3NldHNGbGFnKCkgeworICAgICAgICBtQnVpbGRlci5zZXRGaWVsZENsYXNzaWZpY2F0aW9uSWRzKG1BdXRvZmlsbElkKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtQnVpbGRlci5idWlsZCgpLmdldEZsYWdzKCkpLmlzRXF1YWxUbyhGTEFHX1RSQUNLX0NPTlRFWFRfQ09NTUlURUQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJ1aWxkZXJfc2V0RmllbGRDbGFzc2lmaWNhdGlvbklkc19hZGRzRmxhZygpIHsKKyAgICAgICAgbUJ1aWxkZXIuc2V0RmxhZ3MoRkxBR19ESVNBQkxFX0FDVElWSVRZX09OTFkpLnNldEZpZWxkQ2xhc3NpZmljYXRpb25JZHMobUF1dG9maWxsSWQpOworICAgICAgICBhc3NlcnRUaGF0KG1CdWlsZGVyLmJ1aWxkKCkuZ2V0RmxhZ3MoKSkKKyAgICAgICAgICAgICAgICAuaXNFcXVhbFRvKEZMQUdfVFJBQ0tfQ09OVEVYVF9DT01NSVRFRCB8IEZMQUdfRElTQUJMRV9BQ1RJVklUWV9PTkxZKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCdWlsZF9pbnZhbGlkKCkgeworICAgICAgICBhc3NlcnRUaHJvd3MoSWxsZWdhbFN0YXRlRXhjZXB0aW9uLmNsYXNzLCAoKSAtPiBtQnVpbGRlci5idWlsZCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCdWlsZF92YWxpZCgpIHsKKyAgICAgICAgLy8gYXV0aGVudGljYXRpb24gb25seQorICAgICAgICBhc3NlcnRUaGF0KG5ldyBGaWxsUmVzcG9uc2UuQnVpbGRlcigpLnNldEF1dGhlbnRpY2F0aW9uKG1JZHMsIG1JbnRlbnRTZW5kZXIsIG1QcmVzZW50YXRpb24pCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpLmlzTm90TnVsbCgpOworICAgICAgICAvLyBzYXZlIGluZm8gb25seQorICAgICAgICBhc3NlcnRUaGF0KG5ldyBGaWxsUmVzcG9uc2UuQnVpbGRlcigpLnNldFNhdmVJbmZvKG1TYXZlSW5mbykuYnVpbGQoKSkuaXNOb3ROdWxsKCk7CisgICAgICAgIC8vIGRhdGFzZXQgb25seQorICAgICAgICBhc3NlcnRUaGF0KG5ldyBGaWxsUmVzcG9uc2UuQnVpbGRlcigpLmFkZERhdGFzZXQobURhdGFzZXQpLmJ1aWxkKCkpLmlzTm90TnVsbCgpOworICAgICAgICAvLyBkaXNhYmxlIGF1dG9maWxsIG9ubHkKKyAgICAgICAgYXNzZXJ0VGhhdChuZXcgRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKS5kaXNhYmxlQXV0b2ZpbGwobURpc2FibGVEdXJhdGlvbikuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuaXNOb3ROdWxsKCk7CisgICAgICAgIC8vIGZpbGwgZGV0ZWN0aW9uIG9ubHkKKyAgICAgICAgYXNzZXJ0VGhhdChuZXcgRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKS5zZXRGaWVsZENsYXNzaWZpY2F0aW9uSWRzKG1BdXRvZmlsbElkKS5idWlsZCgpKQorICAgICAgICAgICAgICAgIC5pc05vdE51bGwoKTsKKyAgICAgICAgLy8gY2xpZW50IHN0YXRlIG9ubHkKKyAgICAgICAgYXNzZXJ0VGhhdChuZXcgRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKS5zZXRDbGllbnRTdGF0ZShtQ2xpZW50U3RhdGUpLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLmlzTm90TnVsbCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJ1aWxkZXJfYnVpbGRfaGVhZGVyT3JGb290ZXJXaXRob3V0RGF0YXNldHMoKSB7CisgICAgICAgIGFzc2VydFRocm93cyhJbGxlZ2FsU3RhdGVFeGNlcHRpb24uY2xhc3MsCisgICAgICAgICAgICAgICAgKCkgLT4gbmV3IEZpbGxSZXNwb25zZS5CdWlsZGVyKCkuc2V0SGVhZGVyKG1IZWFkZXIpLmJ1aWxkKCkpOworICAgICAgICBhc3NlcnRUaHJvd3MoSWxsZWdhbFN0YXRlRXhjZXB0aW9uLmNsYXNzLAorICAgICAgICAgICAgICAgICgpIC0+IG5ldyBGaWxsUmVzcG9uc2UuQnVpbGRlcigpLnNldEZvb3RlcihtRm9vdGVyKS5idWlsZCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb01vcmVJbnRlcmFjdGlvbnNBZnRlckJ1aWxkKCkgeworICAgICAgICBhc3NlcnRUaGF0KG1CdWlsZGVyLnNldEF1dGhlbnRpY2F0aW9uKG1JZHMsIG1JbnRlbnRTZW5kZXIsIG1QcmVzZW50YXRpb24pLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLmlzTm90TnVsbCgpOworCisgICAgICAgIGFzc2VydFRocm93cyhJbGxlZ2FsU3RhdGVFeGNlcHRpb24uY2xhc3MsICgpIC0+IG1CdWlsZGVyLmJ1aWxkKCkpOworICAgICAgICBhc3NlcnRUaHJvd3MoSWxsZWdhbFN0YXRlRXhjZXB0aW9uLmNsYXNzLAorICAgICAgICAgICAgICAgICgpIC0+IG1CdWlsZGVyLnNldEF1dGhlbnRpY2F0aW9uKG1JZHMsIG1JbnRlbnRTZW5kZXIsIG1QcmVzZW50YXRpb24pLmJ1aWxkKCkpOworICAgICAgICBhc3NlcnRUaHJvd3MoSWxsZWdhbFN0YXRlRXhjZXB0aW9uLmNsYXNzLCAoKSAtPiBtQnVpbGRlci5zZXRJZ25vcmVkSWRzKG1JZHMpKTsKKyAgICAgICAgYXNzZXJ0VGhyb3dzKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbi5jbGFzcywgKCkgLT4gbUJ1aWxkZXIuYWRkRGF0YXNldChudWxsKSk7CisgICAgICAgIGFzc2VydFRocm93cyhJbGxlZ2FsU3RhdGVFeGNlcHRpb24uY2xhc3MsICgpIC0+IG1CdWlsZGVyLnNldFNhdmVJbmZvKG1TYXZlSW5mbykpOworICAgICAgICBhc3NlcnRUaHJvd3MoSWxsZWdhbFN0YXRlRXhjZXB0aW9uLmNsYXNzLCAoKSAtPiBtQnVpbGRlci5zZXRDbGllbnRTdGF0ZShtQ2xpZW50U3RhdGUpKTsKKyAgICAgICAgYXNzZXJ0VGhyb3dzKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbi5jbGFzcywgKCkgLT4gbUJ1aWxkZXIuc2V0RmxhZ3MoMCkpOworICAgICAgICBhc3NlcnRUaHJvd3MoSWxsZWdhbFN0YXRlRXhjZXB0aW9uLmNsYXNzLAorICAgICAgICAgICAgICAgICgpIC0+IG1CdWlsZGVyLnNldEZpZWxkQ2xhc3NpZmljYXRpb25JZHMobUF1dG9maWxsSWQpKTsKKyAgICAgICAgYXNzZXJ0VGhyb3dzKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbi5jbGFzcywgKCkgLT4gbUJ1aWxkZXIuc2V0SGVhZGVyKG1IZWFkZXIpKTsKKyAgICAgICAgYXNzZXJ0VGhyb3dzKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbi5jbGFzcywgKCkgLT4gbUJ1aWxkZXIuc2V0Rm9vdGVyKG1Gb290ZXIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9GcmFnbWVudENvbnRhaW5lckFjdGl2aXR5LmphdmEgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9GcmFnbWVudENvbnRhaW5lckFjdGl2aXR5LmphdmEKaW5kZXggN2JlNDQ5Ni4uZDMzZjE0MiAxMDA2NDQKLS0tIGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvRnJhZ21lbnRDb250YWluZXJBY3Rpdml0eS5qYXZhCisrKyBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0ZyYWdtZW50Q29udGFpbmVyQWN0aXZpdHkuamF2YQpAQCAtMTcsNyArMTcsNyBAQAogcGFja2FnZSBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHM7CiAKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk51bGxhYmxlOwogCiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CkBAIC03MSwxMCArNzEsMTAgQEAKICAgICB9CiAKICAgICBwdWJsaWMgYm9vbGVhbiB3YWl0VW50aWxSZXN1bWVkKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG1SZXN1bWVkLmF3YWl0KEhlbHBlci5VSV9USU1FT1VUX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICByZXR1cm4gbVJlc3VtZWQuYXdhaXQoVGltZW91dHMuVUlfVElNRU9VVC5tcygpLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOwogICAgIH0KIAogICAgIHB1YmxpYyBib29sZWFuIHdhaXRVbnRpbFN0b3BwZWQoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbVN0b3BwZWQuYXdhaXQoSGVscGVyLlVJX1RJTUVPVVRfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgIHJldHVybiBtU3RvcHBlZC5hd2FpdChUaW1lb3V0cy5VSV9USU1FT1VULm1zKCksIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvRnJhZ21lbnRXaXRoRWRpdFRleHQuamF2YSBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0ZyYWdtZW50V2l0aEVkaXRUZXh0LmphdmEKaW5kZXggNmRkOWVlNC4uNTJmZDM5YSAxMDA2NDQKLS0tIGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvRnJhZ21lbnRXaXRoRWRpdFRleHQuamF2YQorKysgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9GcmFnbWVudFdpdGhFZGl0VGV4dC5qYXZhCkBAIC0xOCw3ICsxOCw3IEBACiAKIGltcG9ydCBhbmRyb2lkLmFwcC5GcmFnbWVudDsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk51bGxhYmxlOwogaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwpkaWZmIC0tZ2l0IGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvRnJhZ21lbnRXaXRoTW9yZUVkaXRUZXh0cy5qYXZhIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvRnJhZ21lbnRXaXRoTW9yZUVkaXRUZXh0cy5qYXZhCmluZGV4IDA4Y2U5NGQuLmUyZTE2YmEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0ZyYWdtZW50V2l0aE1vcmVFZGl0VGV4dHMuamF2YQorKysgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9GcmFnbWVudFdpdGhNb3JlRWRpdFRleHRzLmphdmEKQEAgLTE4LDcgKzE4LDcgQEAKIAogaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50OwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTnVsbGFibGU7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CmRpZmYgLS1naXQgYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9HcmlkQWN0aXZpdHkuamF2YSBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0dyaWRBY3Rpdml0eS5qYXZhCmluZGV4IDMzMzIxYzcuLjY1ZGVmZjUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0dyaWRBY3Rpdml0eS5qYXZhCisrKyBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0dyaWRBY3Rpdml0eS5qYXZhCkBAIC0yMCw2ICsyMCw3IEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LmF1dG9maWxsLkF1dG9maWxsTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuRWRpdFRleHQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuR3JpZExheW91dDsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQmxvY2tpbmdRdWV1ZTsKQEAgLTQ1LDYgKzQ2LDcgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9MNEMxID0gZ2V0UmVzb3VyY2VJZCg0LCAxKTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9MNEMyID0gZ2V0UmVzb3VyY2VJZCg0LCAyKTsKIAorICAgIHByaXZhdGUgR3JpZExheW91dCBtR3JpZDsKICAgICBwcml2YXRlIGZpbmFsIEVkaXRUZXh0W11bXSBtQ2VsbHMgPSBuZXcgRWRpdFRleHRbNF1bMl07CiAgICAgcHJpdmF0ZSBCdXR0b24gbVNhdmVCdXR0b247CiAgICAgcHJpdmF0ZSBCdXR0b24gbUNsZWFyQnV0dG9uOwpAQCAtNTUsMTYgKzU3LDE3IEBACiAKICAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQuZ3JpZF9hY3Rpdml0eSk7CiAKLSAgICAgICAgbUNlbGxzWzBdWzBdID0gKEVkaXRUZXh0KSBmaW5kVmlld0J5SWQoUi5pZC5sMWMxKTsKLSAgICAgICAgbUNlbGxzWzBdWzFdID0gKEVkaXRUZXh0KSBmaW5kVmlld0J5SWQoUi5pZC5sMWMyKTsKLSAgICAgICAgbUNlbGxzWzFdWzBdID0gKEVkaXRUZXh0KSBmaW5kVmlld0J5SWQoUi5pZC5sMmMxKTsKLSAgICAgICAgbUNlbGxzWzFdWzFdID0gKEVkaXRUZXh0KSBmaW5kVmlld0J5SWQoUi5pZC5sMmMyKTsKLSAgICAgICAgbUNlbGxzWzJdWzBdID0gKEVkaXRUZXh0KSBmaW5kVmlld0J5SWQoUi5pZC5sM2MxKTsKLSAgICAgICAgbUNlbGxzWzJdWzFdID0gKEVkaXRUZXh0KSBmaW5kVmlld0J5SWQoUi5pZC5sM2MyKTsKLSAgICAgICAgbUNlbGxzWzNdWzBdID0gKEVkaXRUZXh0KSBmaW5kVmlld0J5SWQoUi5pZC5sNGMxKTsKLSAgICAgICAgbUNlbGxzWzNdWzFdID0gKEVkaXRUZXh0KSBmaW5kVmlld0J5SWQoUi5pZC5sNGMyKTsKLSAgICAgICAgbVNhdmVCdXR0b24gPSAoQnV0dG9uKSBmaW5kVmlld0J5SWQoUi5pZC5zYXZlKTsKLSAgICAgICAgbUNsZWFyQnV0dG9uID0gKEJ1dHRvbikgZmluZFZpZXdCeUlkKFIuaWQuY2xlYXIpOworICAgICAgICBtR3JpZCA9IGZpbmRWaWV3QnlJZChSLmlkLmdyaWQpOworICAgICAgICBtQ2VsbHNbMF1bMF0gPSBmaW5kVmlld0J5SWQoUi5pZC5sMWMxKTsKKyAgICAgICAgbUNlbGxzWzBdWzFdID0gZmluZFZpZXdCeUlkKFIuaWQubDFjMik7CisgICAgICAgIG1DZWxsc1sxXVswXSA9IGZpbmRWaWV3QnlJZChSLmlkLmwyYzEpOworICAgICAgICBtQ2VsbHNbMV1bMV0gPSBmaW5kVmlld0J5SWQoUi5pZC5sMmMyKTsKKyAgICAgICAgbUNlbGxzWzJdWzBdID0gZmluZFZpZXdCeUlkKFIuaWQubDNjMSk7CisgICAgICAgIG1DZWxsc1syXVsxXSA9IGZpbmRWaWV3QnlJZChSLmlkLmwzYzIpOworICAgICAgICBtQ2VsbHNbM11bMF0gPSBmaW5kVmlld0J5SWQoUi5pZC5sNGMxKTsKKyAgICAgICAgbUNlbGxzWzNdWzFdID0gZmluZFZpZXdCeUlkKFIuaWQubDRjMik7CisgICAgICAgIG1TYXZlQnV0dG9uID0gZmluZFZpZXdCeUlkKFIuaWQuc2F2ZSk7CisgICAgICAgIG1DbGVhckJ1dHRvbiA9IGZpbmRWaWV3QnlJZChSLmlkLmNsZWFyKTsKIAogICAgICAgICBtU2F2ZUJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIoKHYpIC0+IHNhdmUoKSk7CiAgICAgICAgIG1DbGVhckJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIoKHYpIC0+IHJlc2V0RmllbGRzKCkpOwpAQCAtODMsNyArODYsNyBAQAogICAgICAgICBnZXRTeXN0ZW1TZXJ2aWNlKEF1dG9maWxsTWFuYWdlci5jbGFzcykuY2FuY2VsKCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBFZGl0VGV4dCBnZXRDZWxsKGludCByb3csIGludCBjb2x1bW4pIHsKKyAgICBFZGl0VGV4dCBnZXRDZWxsKGludCByb3csIGludCBjb2x1bW4pIHsKICAgICAgICAgcmV0dXJuIG1DZWxsc1tyb3cgLSAxXVtjb2x1bW4gLSAxXTsKICAgICB9CiAKQEAgLTExMiw2ICsxMTUsMTYgQEAKICAgICAgICAgb25DZWxsKHJvdywgY29sdW1uLCAoYykgLT4gZ2V0QXV0b2ZpbGxNYW5hZ2VyKCkucmVxdWVzdEF1dG9maWxsKGMpKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVDZWxsKGludCByb3csIGludCBjb2x1bW4pIHsKKyAgICAgICAgb25DZWxsKHJvdywgY29sdW1uLCAoYykgLT4gbUdyaWQucmVtb3ZlVmlldyhjKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkQ2VsbChpbnQgcm93LCBpbnQgY29sdW1uLCBFZGl0VGV4dCBjZWxsKSB7CisgICAgICAgIG1DZWxsc1tyb3cgLSAxXVtjb2x1bW4gLSAxXSA9IGNlbGw7CisgICAgICAgIC8vIFRPRE86IGlkZWFsbHkgaXQgc2hvdWxkIGJlIGFkZGVkIGluIHRoZSByaWdodCBwbGFjZS4uLgorICAgICAgICBzeW5jUnVuT25VaVRocmVhZCgoKSAtPiBtR3JpZC5hZGRWaWV3KGNlbGwpKTsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCB0cmlnZ2VyQXV0b2ZpbGwoYm9vbGVhbiBtYW51YWxseSwgaW50IHJvdywgaW50IGNvbHVtbikgewogICAgICAgICBpZiAobWFudWFsbHkpIHsKICAgICAgICAgICAgIGZvcmNlQXV0b2ZpbGwocm93LCBjb2x1bW4pOwpkaWZmIC0tZ2l0IGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvSGVscGVyLmphdmEgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9IZWxwZXIuamF2YQppbmRleCAxMDAwMzczLi4zMTIwMDcyIDEwMDY0NAotLS0gYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9IZWxwZXIuamF2YQorKysgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9IZWxwZXIuamF2YQpAQCAtMTgsMzUgKzE4LDU4IEBACiAKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkluc3RydW1lbnRlZEF1dG9GaWxsU2VydmljZS5TRVJWSUNFX05BTUU7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5VaUJvdC5QT1JUUkFJVDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLmNvbW1vbi5TaGVsbEhlbHBlci5ydW5TaGVsbENvbW1hbmQ7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU2VjdXJlLkFVVE9GSUxMX1NFUlZJQ0U7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU2VjdXJlLlVTRVJfU0VUVVBfQ09NUExFVEU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmljZS5hdXRvZmlsbC5GaWxsRXZlbnRIaXN0b3J5LkV2ZW50LlRZUEVfQVVUSEVOVElDQVRJT05fU0VMRUNURUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmljZS5hdXRvZmlsbC5GaWxsRXZlbnRIaXN0b3J5LkV2ZW50LlRZUEVfQ09OVEVYVF9DT01NSVRURUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmljZS5hdXRvZmlsbC5GaWxsRXZlbnRIaXN0b3J5LkV2ZW50LlRZUEVfREFUQVNFVF9BVVRIRU5USUNBVElPTl9TRUxFQ1RFRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2aWNlLmF1dG9maWxsLkZpbGxFdmVudEhpc3RvcnkuRXZlbnQuVFlQRV9EQVRBU0VUX1NFTEVDVEVEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuRmlsbEV2ZW50SGlzdG9yeS5FdmVudC5UWVBFX1NBVkVfU0hPV047CiAKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24udHJ1dGguVHJ1dGguYXNzZXJ0VGhhdDsKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24udHJ1dGguVHJ1dGguYXNzZXJ0V2l0aE1lc3NhZ2U7CiAKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKIGltcG9ydCBhbmRyb2lkLmFwcC5hc3Npc3QuQXNzaXN0U3RydWN0dXJlOwogaW1wb3J0IGFuZHJvaWQuYXBwLmFzc2lzdC5Bc3Npc3RTdHJ1Y3R1cmUuVmlld05vZGU7CiBpbXBvcnQgYW5kcm9pZC5hcHAuYXNzaXN0LkFzc2lzdFN0cnVjdHVyZS5XaW5kb3dOb2RlOworaW1wb3J0IGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5jb21tb24uU2V0dGluZ3NIZWxwZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwogaW1wb3J0IGFuZHJvaWQuaWN1LnV0aWwuQ2FsZW5kYXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5FbnZpcm9ubWVudDsKK2ltcG9ydCBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuRmllbGRDbGFzc2lmaWNhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuRmllbGRDbGFzc2lmaWNhdGlvbi5NYXRjaDsKIGltcG9ydCBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuRmlsbENvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuRmlsbEV2ZW50SGlzdG9yeTsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlBhaXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld1N0cnVjdHVyZS5IdG1sSW5mbzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYXV0b2ZpbGwuQXV0b2ZpbGxJZDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYXV0b2ZpbGwuQXV0b2ZpbGxNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudmlldy5hdXRvZmlsbC5BdXRvZmlsbE1hbmFnZXIuQXV0b2ZpbGxDYWxsYmFjazsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYXV0b2ZpbGwuQXV0b2ZpbGxWYWx1ZTsKIGltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJWaWV3OwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5TeXN0ZW1VdGlsOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTm9uTnVsbDsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CiAKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkJpdG1hcFV0aWxzOworaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuUmVxdWlyZWRGZWF0dXJlUnVsZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CiAKIC8qKgpAQCAtNTQsNyArNzcsNyBAQAogICovCiBmaW5hbCBjbGFzcyBIZWxwZXIgewogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJBdXRvRmlsbEN0c0hlbHBlciI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQXV0b0ZpbGxDdHNIZWxwZXIiOwogCiAgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gVkVSQk9TRSA9IGZhbHNlOwogCkBAIC02NiwxNjEgKzg5LDEwNSBAQAogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfUEFTU1dPUkQgPSAicGFzc3dvcmQiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfTE9HSU4gPSAibG9naW4iOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfT1VUUFVUID0gIm91dHB1dCI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9TVEFUSUNfVEVYVCA9ICJzdGF0aWNfdGV4dCI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOVUxMX0RBVEFTRVRfSUQgPSBudWxsOworCisgICAgLyoqCisgICAgICogQ2FuIGJlIHVzZWQgaW4gY2FzZXMgd2hlcmUgdGhlIGF1dG9maWxsIHZhbHVlcyBpcyByZXF1aXJlZCBieSBpcnJlbGV2YW50IChsaWtlIGFkZGluZyBhCisgICAgICogdmFsdWUgdG8gYW4gYXV0aGVudGljYXRlZCBkYXRhc2V0KS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTlVTRURfQVVUT0ZJTExfVkFMVUUgPSBudWxsOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENNRF9MSVNUX1NFU1NJT05TID0gImNtZCBhdXRvZmlsbCBsaXN0IHNlc3Npb25zIjsKIAotICAgIC8qKgotICAgICAqIFRpbWVvdXQgKGluIG1pbGxpc2Vjb25kcykgdW50aWwgZnJhbWV3b3JrIGJpbmRzIC8gdW5iaW5kcyBmcm9tIHNlcnZpY2UuCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIGxvbmcgQ09OTkVDVElPTl9USU1FT1VUX01TID0gMjAwMDsKLQotICAgIC8qKgotICAgICAqIFRpbWVvdXQgKGluIG1pbGxpc2Vjb25kcykgdW50aWwgZnJhbWV3b3JrIHVuYmluZHMgZnJvbSBhIHNlcnZpY2UuCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIGxvbmcgSURMRV9VTkJJTkRfVElNRU9VVF9NUyA9IDUwMDA7Ci0KLSAgICAvKioKLSAgICAgKiBUaW1lb3V0IChpbiBtaWxsaXNlY29uZHMpIGZvciBleHBlY3RlZCBhdXRvLWZpbGwgcmVxdWVzdHMuCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIGxvbmcgRklMTF9USU1FT1VUX01TID0gMjAwMDsKLQotICAgIC8qKgotICAgICAqIFRpbWVvdXQgKGluIG1pbGxpc2Vjb25kcykgZm9yIGV4cGVjdGVkIHNhdmUgcmVxdWVzdHMuCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIGxvbmcgU0FWRV9USU1FT1VUX01TID0gNTAwMDsKLQotICAgIC8qKgotICAgICAqIFRpbWUgdG8gd2FpdCBpZiBhIFVJIGNoYW5nZSBpcyBub3QgZXhwZWN0ZWQKLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgbG9uZyBOT1RfU0hPV0lOR19USU1FT1VUX01TID0gNTAwOwotCi0gICAgLyoqCi0gICAgICogVGltZW91dCAoaW4gbWlsbGlzZWNvbmRzKSBmb3IgVUkgb3BlcmF0aW9ucy4gVHlwaWNhbGx5IHVzZWQgYnkge0BsaW5rIFVpQm90fS4KLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IFVJX1RJTUVPVVRfTVMgPSAyMDAwOwotCi0gICAgLyoqCi0gICAgICogVGltZW91dCAoaW4gbWlsbGlzZWNvbmRzKSBmb3IgYW4gYWN0aXZpdHkgdG8gYmUgYnJvdWdodCBvdXQgdG8gdG9wLgotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQUNUSVZJVFlfUkVTVVJSRUNUSU9OX01TID0gNTAwMDsKLQotICAgIC8qKgotICAgICAqIFRpbWVvdXQgKGluIG1pbGxpc2Vjb25kcykgZm9yIGNoYW5naW5nIHRoZSBzY3JlZW4gb3JpZW50YXRpb24uCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIGludCBVSV9TQ1JFRU5fT1JJRU5UQVRJT05fVElNRU9VVF9NUyA9IDUwMDA7Ci0KLSAgICAvKioKLSAgICAgKiBUaW1lb3V0IChpbiBtaWxsaXNlY29uZHMpIGZvciB1c2luZyBSZWNlbnRzIHRvIHN3dGljaCBhY3Rpdml0aWVzLgotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVUlfUkVDRU5UU19TV0lUQ0hfVElNRU9VVF9NUyA9IDIwMDsKLQotICAgIC8qKgotICAgICAqIFRpbWUgdG8gd2FpdCBpbiBiZXR3ZWVuIHJldHJpZXMKLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IFJFVFJZX01TID0gMTAwOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFDQ0VMTEVST01FVEVSX0NIQU5HRSA9CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ0VMTEVST01FVEVSX0NIQU5HRSA9CiAgICAgICAgICAgICAiY29udGVudCBpbnNlcnQgLS11cmkgY29udGVudDovL3NldHRpbmdzL3N5c3RlbSAtLWJpbmQgbmFtZTpzOmFjY2VsZXJvbWV0ZXJfcm90YXRpb24gIgogICAgICAgICAgICAgICAgICAgICArICItLWJpbmQgdmFsdWU6aTolZCI7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQUxfRElSRUNUT1JZID0gRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlRGlyZWN0b3J5KCkKKyAgICAgICAgICAgICsgIi9DdHNBdXRvRmlsbFNlcnZpY2VUZXN0Q2FzZXMiOworCiAgICAgLyoqCi0gICAgICogSGVscGVyIGludGVyZmFjZSB1c2VkIHRvIGZpbHRlciBBc3Npc3Qgbm9kZXMuCisgICAgICogSGVscGVyIGludGVyZmFjZSB1c2VkIHRvIGZpbHRlciBub2Rlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSA8VD4gbm9kZSB0eXBlCiAgICAgICovCi0gICAgaW50ZXJmYWNlIE5vZGVGaWx0ZXIgeworICAgIGludGVyZmFjZSBOb2RlRmlsdGVyPFQ+IHsKICAgICAgICAgLyoqCiAgICAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgbm9kZSBwYXNzZXMgdGhlIGZpbHRlciBmb3Igc3VjaCBnaXZlbiBpZC4KICAgICAgICAgICovCi0gICAgICAgIGJvb2xlYW4gbWF0Y2hlcyhWaWV3Tm9kZSBub2RlLCBPYmplY3QgaWQpOworICAgICAgICBib29sZWFuIG1hdGNoZXMoVCBub2RlLCBPYmplY3QgaWQpOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE5vZGVGaWx0ZXIgUkVTT1VSQ0VfSURfRklMVEVSID0gKG5vZGUsIGlkKSAtPiB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTm9kZUZpbHRlcjxWaWV3Tm9kZT4gUkVTT1VSQ0VfSURfRklMVEVSID0gKG5vZGUsIGlkKSAtPiB7CiAgICAgICAgIHJldHVybiBpZC5lcXVhbHMobm9kZS5nZXRJZEVudHJ5KCkpOwogICAgIH07CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBOb2RlRmlsdGVyIEhUTUxfTkFNRV9GSUxURVIgPSAobm9kZSwgaWQpIC0+IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBOb2RlRmlsdGVyPFZpZXdOb2RlPiBBVVRPRklMTF9JRF9GSUxURVIgPSAobm9kZSwgaWQpIC0+IHsKKyAgICAgICAgcmV0dXJuIGlkLmVxdWFscyhub2RlLmdldEF1dG9maWxsSWQoKSk7CisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE5vZGVGaWx0ZXI8Vmlld05vZGU+IEhUTUxfTkFNRV9GSUxURVIgPSAobm9kZSwgaWQpIC0+IHsKICAgICAgICAgcmV0dXJuIGlkLmVxdWFscyhnZXRIdG1sTmFtZShub2RlKSk7CiAgICAgfTsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE5vZGVGaWx0ZXIgVEVYVF9GSUxURVIgPSAobm9kZSwgaWQpIC0+IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBOb2RlRmlsdGVyPFZpZXdOb2RlPiBIVE1MX05BTUVfT1JfUkVTT1VSQ0VfSURfRklMVEVSID0gKG5vZGUsIGlkKSAtPiB7CisgICAgICAgIHJldHVybiBpZC5lcXVhbHMoZ2V0SHRtbE5hbWUobm9kZSkpIHx8IGlkLmVxdWFscyhub2RlLmdldElkRW50cnkoKSk7CisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE5vZGVGaWx0ZXI8Vmlld05vZGU+IFRFWFRfRklMVEVSID0gKG5vZGUsIGlkKSAtPiB7CiAgICAgICAgIHJldHVybiBpZC5lcXVhbHMobm9kZS5nZXRUZXh0KCkpOwogICAgIH07CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBOb2RlRmlsdGVyIFdFQlZJRVdfUk9PVF9GSUxURVIgPSAobm9kZSwgaWQpIC0+IHsKLSAgICAgICAgLy8gVE9ETyhiLzY2OTUzODAyKTogY2xhc3MgbmFtZSBzaG91bGQgYmUgYW5kcm9pZC53ZWJraXQuV2ViVmlldywgYW5kIGZvcm0gbmFtZSBzaG91bGQgYmUKLSAgICAgICAgLy8gaW5zaWRlIEh0bWxJbmZvLCBidXQgQ2hyb21pdW0gNjEgZG9lcyBub3QgaW1wbGVtZW50IHRoYXQuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTm9kZUZpbHRlcjxWaWV3Tm9kZT4gQVVUT0ZJTExfSElOVF9GSUxURVIgPSAobm9kZSwgaWQpIC0+IHsKKyAgICAgICAgcmV0dXJuIGhhc0hpbnQobm9kZS5nZXRBdXRvZmlsbEhpbnRzKCksIGlkKTsKKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTm9kZUZpbHRlcjxWaWV3Tm9kZT4gV0VCVklFV19GT1JNX0ZJTFRFUiA9IChub2RlLCBpZCkgLT4gewogICAgICAgICBmaW5hbCBTdHJpbmcgY2xhc3NOYW1lID0gbm9kZS5nZXRDbGFzc05hbWUoKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGZvcm1OYW1lOwotICAgICAgICBpZiAoY2xhc3NOYW1lLmVxdWFscygiYW5kcm9pZC53ZWJraXQuV2ViVmlldyIpKSB7Ci0gICAgICAgICAgICBmaW5hbCBIdG1sSW5mbyBodG1sSW5mbyA9IGFzc2VydEhhc0h0bWxUYWcobm9kZSwgImZvcm0iKTsKLSAgICAgICAgICAgIGZvcm1OYW1lID0gZ2V0QXR0cmlidXRlVmFsdWUoaHRtbEluZm8sICJuYW1lIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3JtTmFtZSA9IGNsYXNzTmFtZTsKLSAgICAgICAgfQorICAgICAgICBpZiAoIWNsYXNzTmFtZS5lcXVhbHMoImFuZHJvaWQud2Via2l0LldlYlZpZXciKSkgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGZpbmFsIEh0bWxJbmZvIGh0bWxJbmZvID0gYXNzZXJ0SGFzSHRtbFRhZyhub2RlLCAiZm9ybSIpOworICAgICAgICBmaW5hbCBTdHJpbmcgZm9ybU5hbWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShodG1sSW5mbywgIm5hbWUiKTsKICAgICAgICAgcmV0dXJuIGlkLmVxdWFscyhmb3JtTmFtZSk7CiAgICAgfTsKIAotICAgIC8qKgotICAgICAqIFJ1bnMgYSB7QGNvZGUgcn0sIGlnbm9yaW5nIGFsbCB7QGxpbmsgUnVudGltZUV4Y2VwdGlvbn0gYW5kIHtAbGluayBFcnJvcn0gdW50aWwgdGhlCi0gICAgICoge0BsaW5rICNVSV9USU1FT1VUX01TfSBpcyByZWFjaGVkLgotICAgICAqLwotICAgIHN0YXRpYyB2b2lkIGV2ZW50dWFsbHkoUnVubmFibGUgcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGV2ZW50dWFsbHkociwgVUlfVElNRU9VVF9NUyk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTm9kZUZpbHRlcjxWaWV3PiBBVVRPRklMTF9ISU5UX1ZJRVdfRklMVEVSID0gKHZpZXcsIGlkKSAtPiB7CisgICAgICAgIHJldHVybiBoYXNIaW50KHZpZXcuZ2V0QXV0b2ZpbGxIaW50cygpLCBpZCk7CisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB0b1N0cmluZyhBc3Npc3RTdHJ1Y3R1cmUgc3RydWN0dXJlLCBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIpIHsKKyAgICAgICAgYnVpbGRlci5hcHBlbmQoIltjb21wb25lbnQ9IikuYXBwZW5kKHN0cnVjdHVyZS5nZXRBY3Rpdml0eUNvbXBvbmVudCgpKTsKKyAgICAgICAgZmluYWwgaW50IG5vZGVzID0gc3RydWN0dXJlLmdldFdpbmRvd05vZGVDb3VudCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzOyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIFdpbmRvd05vZGUgd2luZG93Tm9kZSA9IHN0cnVjdHVyZS5nZXRXaW5kb3dOb2RlQXQoaSk7CisgICAgICAgICAgICBkdW1wKGJ1aWxkZXIsIHdpbmRvd05vZGUuZ2V0Um9vdFZpZXdOb2RlKCksICIgIiwgMCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1aWxkZXIuYXBwZW5kKCddJykudG9TdHJpbmcoKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSdW5zIGEge0Bjb2RlIHJ9LCBpZ25vcmluZyBhbGwge0BsaW5rIFJ1bnRpbWVFeGNlcHRpb259IGFuZCB7QGxpbmsgRXJyb3J9IHVudGlsIHRoZQotICAgICAqIHtAY29kZSB0aW1lb3V0fSBpcyByZWFjaGVkLgotICAgICAqLwotICAgIHN0YXRpYyB2b2lkIGV2ZW50dWFsbHkoUnVubmFibGUgciwgaW50IHRpbWVvdXQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBsb25nIHN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHIucnVuKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHwgRXJyb3IgZSkgewotICAgICAgICAgICAgICAgIGlmIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0VGltZSA8IHRpbWVvdXQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFZFUkJPU0UpIExvZy52KFRBRywgIklnbm9yaW5nIiwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChSRVRSWV9NUyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBSZXRyeWFibGVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmV0cnlhYmxlRXhjZXB0aW9uKGUsICJUaW1lZG91dCBvdXQgYWZ0ZXIgJWQgbXMiLCB0aW1lb3V0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgIEBOb25OdWxsCisgICAgc3RhdGljIFN0cmluZyB0b1N0cmluZyhATm9uTnVsbCBBc3Npc3RTdHJ1Y3R1cmUgc3RydWN0dXJlKSB7CisgICAgICAgIHJldHVybiB0b1N0cmluZyhzdHJ1Y3R1cmUsIG5ldyBTdHJpbmdCdWlsZGVyKCkpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFJ1bnMgYSBTaGVsbCBjb21tYW5kLCByZXR1cm5pbmcgYSB0cmltbWVkIHJlc3BvbnNlLgotICAgICAqLwotICAgIHN0YXRpYyBTdHJpbmcgcnVuU2hlbGxDb21tYW5kKFN0cmluZyB0ZW1wbGF0ZSwgT2JqZWN0Li4uYXJncykgewotICAgICAgICBmaW5hbCBTdHJpbmcgY29tbWFuZCA9IFN0cmluZy5mb3JtYXQodGVtcGxhdGUsIGFyZ3MpOwotICAgICAgICBMb2cuZChUQUcsICJydW5TaGVsbENvbW1hbmQoKTogIiArIGNvbW1hbmQpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdCA9IFN5c3RlbVV0aWwKLSAgICAgICAgICAgICAgICAgICAgLnJ1blNoZWxsQ29tbWFuZChJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKSwgY29tbWFuZCk7Ci0gICAgICAgICAgICByZXR1cm4gVGV4dFV0aWxzLmlzRW1wdHkocmVzdWx0KSA/ICIiIDogcmVzdWx0LnRyaW0oKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDb21tYW5kICciICsgY29tbWFuZCArICInIGZhaWxlZDogIiwgZSk7CisgICAgQE51bGxhYmxlCisgICAgc3RhdGljIFN0cmluZyB0b1N0cmluZyhATnVsbGFibGUgQXV0b2ZpbGxWYWx1ZSB2YWx1ZSkgeworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisgICAgICAgIGlmICh2YWx1ZS5pc1RleHQoKSkgeworICAgICAgICAgICAgLy8gV2UgZG9uJ3QgY2FyZSBhYm91dCBQSUkuLi4KKyAgICAgICAgICAgIGZpbmFsIENoYXJTZXF1ZW5jZSB0ZXh0ID0gdmFsdWUuZ2V0VGV4dFZhbHVlKCk7CisgICAgICAgICAgICByZXR1cm4gdGV4dCA9PSBudWxsID8gbnVsbCA6IHRleHQudG9TdHJpbmcoKTsKICAgICAgICAgfQorICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBEdW1wIHRoZSBhc3Npc3Qgc3RydWN0dXJlIG9uIGxvZ2NhdC4KICAgICAgKi8KICAgICBzdGF0aWMgdm9pZCBkdW1wU3RydWN0dXJlKFN0cmluZyBtZXNzYWdlLCBBc3Npc3RTdHJ1Y3R1cmUgc3RydWN0dXJlKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKG1lc3NhZ2UpCi0gICAgICAgICAgICAgICAgLmFwcGVuZCgiOiBjb21wb25lbnQ9IikKLSAgICAgICAgICAgICAgICAuYXBwZW5kKHN0cnVjdHVyZS5nZXRBY3Rpdml0eUNvbXBvbmVudCgpKTsKLSAgICAgICAgZmluYWwgaW50IG5vZGVzID0gc3RydWN0dXJlLmdldFdpbmRvd05vZGVDb3VudCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzOyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIFdpbmRvd05vZGUgd2luZG93Tm9kZSA9IHN0cnVjdHVyZS5nZXRXaW5kb3dOb2RlQXQoaSk7Ci0gICAgICAgICAgICBkdW1wKGJ1ZmZlciwgd2luZG93Tm9kZS5nZXRSb290Vmlld05vZGUoKSwgIiAiLCAwKTsKLSAgICAgICAgfQotICAgICAgICBMb2cuaShUQUcsIGJ1ZmZlci50b1N0cmluZygpKTsKKyAgICAgICAgTG9nLmkoVEFHLCB0b1N0cmluZyhzdHJ1Y3R1cmUsIG5ldyBTdHJpbmdCdWlsZGVyKG1lc3NhZ2UpKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNDMsNzEgKzIxMCw3NiBAQAogICAgICAqIFNldHMgd2hldGhlciB0aGUgdXNlciBjb21wbGV0ZWQgdGhlIGluaXRpYWwgc2V0dXAuCiAgICAgICovCiAgICAgc3RhdGljIHZvaWQgc2V0VXNlckNvbXBsZXRlKENvbnRleHQgY29udGV4dCwgYm9vbGVhbiBjb21wbGV0ZSkgewotICAgICAgICBpZiAoaXNVc2VyQ29tcGxldGUoKSA9PSBjb21wbGV0ZSkgcmV0dXJuOwotCi0gICAgICAgIGZpbmFsIE9uZVRpbWVTZXR0aW5nc0xpc3RlbmVyIG9ic2VydmVyID0gbmV3IE9uZVRpbWVTZXR0aW5nc0xpc3RlbmVyKGNvbnRleHQsCi0gICAgICAgICAgICAgICAgVVNFUl9TRVRVUF9DT01QTEVURSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBuZXdWYWx1ZSA9IGNvbXBsZXRlID8gIjEiIDogbnVsbDsKLSAgICAgICAgcnVuU2hlbGxDb21tYW5kKCJzZXR0aW5ncyBwdXQgc2VjdXJlICVzICVzIGRlZmF1bHQiLCBVU0VSX1NFVFVQX0NPTVBMRVRFLCBuZXdWYWx1ZSk7Ci0gICAgICAgIG9ic2VydmVyLmFzc2VydENhbGxlZCgpOwotCi0gICAgICAgIGFzc2VydElzVXNlckNvbXBsZXRlKGNvbXBsZXRlKTsKKyAgICAgICAgU2V0dGluZ3NIZWxwZXIuc3luY1NldChjb250ZXh0LCBVU0VSX1NFVFVQX0NPTVBMRVRFLCBjb21wbGV0ZSA/ICIxIiA6IG51bGwpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIEdldHMgd2hldGhlciB0aGUgdXNlciBjb21wbGV0ZWQgdGhlIGluaXRpYWwgc2V0dXAuCi0gICAgICovCi0gICAgc3RhdGljIGJvb2xlYW4gaXNVc2VyQ29tcGxldGUoKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBpc0l0ID0gcnVuU2hlbGxDb21tYW5kKCJzZXR0aW5ncyBnZXQgc2VjdXJlICVzIiwgVVNFUl9TRVRVUF9DT01QTEVURSk7Ci0gICAgICAgIHJldHVybiAiMSIuZXF1YWxzKGlzSXQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFzc2V0cyB0aGF0IHVzZXIgY29tcGxldGVkIChvciBub3QpIHRoZSBpbml0aWFsIHNldHVwLgotICAgICAqLwotICAgIHN0YXRpYyB2b2lkIGFzc2VydElzVXNlckNvbXBsZXRlKGJvb2xlYW4gZXhwZWN0ZWQpIHsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBhY3R1YWwgPSBpc1VzZXJDb21wbGV0ZSgpOwotICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiSW52YWxpZCB2YWx1ZSBmb3Igc2VjdXJlIHNldHRpbmcgJXMiLCBVU0VSX1NFVFVQX0NPTVBMRVRFKQotICAgICAgICAgICAgICAgIC50aGF0KGFjdHVhbCkuaXNFcXVhbFRvKGV4cGVjdGVkKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGR1bXAoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgVmlld05vZGUgbm9kZSwgU3RyaW5nIHByZWZpeCwgaW50IGNoaWxkSWQpIHsKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGR1bXAoQE5vbk51bGwgU3RyaW5nQnVpbGRlciBidWlsZGVyLCBATm9uTnVsbCBWaWV3Tm9kZSBub2RlLAorICAgICAgICAgICAgQE5vbk51bGwgU3RyaW5nIHByZWZpeCwgaW50IGNoaWxkSWQpIHsKICAgICAgICAgZmluYWwgaW50IGNoaWxkcmVuU2l6ZSA9IG5vZGUuZ2V0Q2hpbGRDb3VudCgpOwotICAgICAgICBidWZmZXIuYXBwZW5kKCJcbiIpLmFwcGVuZChwcmVmaXgpCi0gICAgICAgICAgICAuYXBwZW5kKCcjJykuYXBwZW5kKGNoaWxkSWQpLmFwcGVuZCgnOicpCi0gICAgICAgICAgICAuYXBwZW5kKCJyZXNJZD0iKS5hcHBlbmQobm9kZS5nZXRJZEVudHJ5KCkpCi0gICAgICAgICAgICAuYXBwZW5kKCIgY2xhc3M9IikuYXBwZW5kKG5vZGUuZ2V0Q2xhc3NOYW1lKCkpCi0gICAgICAgICAgICAuYXBwZW5kKCIgdGV4dD0iKS5hcHBlbmQobm9kZS5nZXRUZXh0KCkpCi0gICAgICAgICAgICAuYXBwZW5kKCIgY2xhc3M9IikuYXBwZW5kKG5vZGUuZ2V0Q2xhc3NOYW1lKCkpCi0gICAgICAgICAgICAuYXBwZW5kKCIgd2ViRG9tYWluPSIpLmFwcGVuZChub2RlLmdldFdlYkRvbWFpbigpKQotICAgICAgICAgICAgLmFwcGVuZCgiICNjaGlsZHJlbj0iKS5hcHBlbmQoY2hpbGRyZW5TaXplKTsKLQotICAgICAgICBidWZmZXIuYXBwZW5kKCJcbiIpLmFwcGVuZChwcmVmaXgpCi0gICAgICAgICAgICAuYXBwZW5kKCIgICBhZklkPSIpLmFwcGVuZChub2RlLmdldEF1dG9maWxsSWQoKSkKLSAgICAgICAgICAgIC5hcHBlbmQoIiBhZlR5cGU9IikuYXBwZW5kKG5vZGUuZ2V0QXV0b2ZpbGxUeXBlKCkpCi0gICAgICAgICAgICAuYXBwZW5kKCIgYWZWYWx1ZT0iKS5hcHBlbmQobm9kZS5nZXRBdXRvZmlsbFZhbHVlKCkpCi0gICAgICAgICAgICAuYXBwZW5kKCIgY2hlY2tlZD0iKS5hcHBlbmQobm9kZS5pc0NoZWNrZWQoKSkKLSAgICAgICAgICAgIC5hcHBlbmQoIiBmb2N1c2VkPSIpLmFwcGVuZChub2RlLmlzRm9jdXNlZCgpKTsKLQorICAgICAgICBidWlsZGVyLmFwcGVuZCgiXG4iKS5hcHBlbmQocHJlZml4KQorICAgICAgICAgICAgLmFwcGVuZCgiY2hpbGQgIyIpLmFwcGVuZChjaGlsZElkKS5hcHBlbmQoJzonKTsKKyAgICAgICAgYXBwZW5kKGJ1aWxkZXIsICJhZklkIiwgbm9kZS5nZXRBdXRvZmlsbElkKCkpOworICAgICAgICBhcHBlbmQoYnVpbGRlciwgImFmVHlwZSIsIG5vZGUuZ2V0QXV0b2ZpbGxUeXBlKCkpOworICAgICAgICBhcHBlbmQoYnVpbGRlciwgImFmVmFsdWUiLCB0b1N0cmluZyhub2RlLmdldEF1dG9maWxsVmFsdWUoKSkpOworICAgICAgICBhcHBlbmQoYnVpbGRlciwgInJlc0lkIiwgbm9kZS5nZXRJZEVudHJ5KCkpOworICAgICAgICBhcHBlbmQoYnVpbGRlciwgImNsYXNzIiwgbm9kZS5nZXRDbGFzc05hbWUoKSk7CisgICAgICAgIGFwcGVuZChidWlsZGVyLCAidGV4dCIsIG5vZGUuZ2V0VGV4dCgpKTsKKyAgICAgICAgYXBwZW5kKGJ1aWxkZXIsICJ3ZWJEb21haW4iLCBub2RlLmdldFdlYkRvbWFpbigpKTsKKyAgICAgICAgYXBwZW5kKGJ1aWxkZXIsICJjaGVja2VkIiwgbm9kZS5pc0NoZWNrZWQoKSk7CisgICAgICAgIGFwcGVuZChidWlsZGVyLCAiZm9jdXNlZCIsIG5vZGUuaXNGb2N1c2VkKCkpOwogICAgICAgICBmaW5hbCBIdG1sSW5mbyBodG1sSW5mbyA9IG5vZGUuZ2V0SHRtbEluZm8oKTsKICAgICAgICAgaWYgKGh0bWxJbmZvICE9IG51bGwpIHsKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIlxuSHRtbEluZm86IHRhZz0iKS5hcHBlbmQoaHRtbEluZm8uZ2V0VGFnKCkpCi0gICAgICAgICAgICAgICAgLmFwcGVuZCgiLCBhdHRyczogIikuYXBwZW5kKGh0bWxJbmZvLmdldEF0dHJpYnV0ZXMoKSk7CisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiLCBIdG1sSW5mb1t0YWc9IikuYXBwZW5kKGh0bWxJbmZvLmdldFRhZygpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoIiwgYXR0cnM6ICIpLmFwcGVuZChodG1sSW5mby5nZXRBdHRyaWJ1dGVzKCkpLmFwcGVuZCgnXScpOwogICAgICAgICB9Ci0KLSAgICAgICAgcHJlZml4ICs9ICIgIjsKICAgICAgICAgaWYgKGNoaWxkcmVuU2l6ZSA+IDApIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW5TaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBkdW1wKGJ1ZmZlciwgbm9kZS5nZXRDaGlsZEF0KGkpLCBwcmVmaXgsIGkpOworICAgICAgICAgICAgYXBwZW5kKGJ1aWxkZXIsICIjY2hpbGRyZW4iLCBjaGlsZHJlblNpemUpLmFwcGVuZCgiXG4iKS5hcHBlbmQocHJlZml4KTsKKyAgICAgICAgICAgIHByZWZpeCArPSAiICI7CisgICAgICAgICAgICBpZiAoY2hpbGRyZW5TaXplID4gMCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW5TaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZHVtcChidWlsZGVyLCBub2RlLmdldENoaWxkQXQoaSksIHByZWZpeCwgaSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCisgICAgICogQXBwZW5kcyBhIGZpZWxkIHZhbHVlIHRvIGEge0BsaW5rIFN0cmluZ0J1aWxkZXJ9IHdoZW4gaXQncyBub3Qge0Bjb2RlIG51bGx9LgorICAgICAqLworICAgIEBOb25OdWxsCisgICAgc3RhdGljIFN0cmluZ0J1aWxkZXIgYXBwZW5kKEBOb25OdWxsIFN0cmluZ0J1aWxkZXIgYnVpbGRlciwgQE5vbk51bGwgU3RyaW5nIGZpZWxkLAorICAgICAgICAgICAgQE51bGxhYmxlIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIGJ1aWxkZXI7CisKKyAgICAgICAgaWYgKCh2YWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4pICYmICgoQm9vbGVhbikgdmFsdWUpKSB7CisgICAgICAgICAgICByZXR1cm4gYnVpbGRlci5hcHBlbmQoIiwgIikuYXBwZW5kKGZpZWxkKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEludGVnZXIgJiYgKChJbnRlZ2VyKSB2YWx1ZSkgPT0gMAorICAgICAgICAgICAgICAgIHx8IHZhbHVlIGluc3RhbmNlb2YgQ2hhclNlcXVlbmNlICYmIFRleHRVdGlscy5pc0VtcHR5KChDaGFyU2VxdWVuY2UpIHZhbHVlKSkgeworICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXI7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYnVpbGRlci5hcHBlbmQoIiwgIikuYXBwZW5kKGZpZWxkKS5hcHBlbmQoJz0nKS5hcHBlbmQodmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFwcGVuZHMgYSBmaWVsZCB2YWx1ZSB0byBhIHtAbGluayBTdHJpbmdCdWlsZGVyfSB3aGVuIGl0J3Mge0Bjb2RlIHRydWV9LgorICAgICAqLworICAgIEBOb25OdWxsCisgICAgc3RhdGljIFN0cmluZ0J1aWxkZXIgYXBwZW5kKEBOb25OdWxsIFN0cmluZ0J1aWxkZXIgYnVpbGRlciwgQE5vbk51bGwgU3RyaW5nIGZpZWxkLAorICAgICAgICAgICAgYm9vbGVhbiB2YWx1ZSkgeworICAgICAgICBpZiAodmFsdWUpIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIsICIpLmFwcGVuZChmaWVsZCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1aWxkZXI7CisgICAgfQorCisgICAgLyoqCiAgICAgICogR2V0cyBhIG5vZGUgaWYgaXQgbWF0Y2hlcyB0aGUgZmlsdGVyIGNyaXRlcmlhIGZvciB0aGUgZ2l2ZW4gaWQuCiAgICAgICovCiAgICAgc3RhdGljIFZpZXdOb2RlIGZpbmROb2RlQnlGaWx0ZXIoQE5vbk51bGwgQXNzaXN0U3RydWN0dXJlIHN0cnVjdHVyZSwgQE5vbk51bGwgT2JqZWN0IGlkLAotICAgICAgICAgICAgQE5vbk51bGwgTm9kZUZpbHRlciBmaWx0ZXIpIHsKKyAgICAgICAgICAgIEBOb25OdWxsIE5vZGVGaWx0ZXI8Vmlld05vZGU+IGZpbHRlcikgewogICAgICAgICBMb2cudihUQUcsICJQYXJzaW5nIHJlcXVlc3QgZm9yIGFjdGl2aXR5ICIgKyBzdHJ1Y3R1cmUuZ2V0QWN0aXZpdHlDb21wb25lbnQoKSk7CiAgICAgICAgIGZpbmFsIGludCBub2RlcyA9IHN0cnVjdHVyZS5nZXRXaW5kb3dOb2RlQ291bnQoKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlczsgaSsrKSB7CkBAIC0zMjUsNyArMjk3LDcgQEAKICAgICAgKiBHZXRzIGEgbm9kZSBpZiBpdCBtYXRjaGVzIHRoZSBmaWx0ZXIgY3JpdGVyaWEgZm9yIHRoZSBnaXZlbiBpZC4KICAgICAgKi8KICAgICBzdGF0aWMgVmlld05vZGUgZmluZE5vZGVCeUZpbHRlcihATm9uTnVsbCBMaXN0PEZpbGxDb250ZXh0PiBjb250ZXh0cywgQE5vbk51bGwgT2JqZWN0IGlkLAotICAgICAgICAgICAgQE5vbk51bGwgTm9kZUZpbHRlciBmaWx0ZXIpIHsKKyAgICAgICAgICAgIEBOb25OdWxsIE5vZGVGaWx0ZXI8Vmlld05vZGU+IGZpbHRlcikgewogICAgICAgICBmb3IgKEZpbGxDb250ZXh0IGNvbnRleHQgOiBjb250ZXh0cykgewogICAgICAgICAgICAgVmlld05vZGUgbm9kZSA9IGZpbmROb2RlQnlGaWx0ZXIoY29udGV4dC5nZXRTdHJ1Y3R1cmUoKSwgaWQsIGZpbHRlcik7CiAgICAgICAgICAgICBpZiAobm9kZSAhPSBudWxsKSB7CkBAIC0zMzksNyArMzExLDcgQEAKICAgICAgKiBHZXRzIGEgbm9kZSBpZiBpdCBtYXRjaGVzIHRoZSBmaWx0ZXIgY3JpdGVyaWEgZm9yIHRoZSBnaXZlbiBpZC4KICAgICAgKi8KICAgICBzdGF0aWMgVmlld05vZGUgZmluZE5vZGVCeUZpbHRlcihATm9uTnVsbCBWaWV3Tm9kZSBub2RlLCBATm9uTnVsbCBPYmplY3QgaWQsCi0gICAgICAgICAgICBATm9uTnVsbCBOb2RlRmlsdGVyIGZpbHRlcikgeworICAgICAgICAgICAgQE5vbk51bGwgTm9kZUZpbHRlcjxWaWV3Tm9kZT4gZmlsdGVyKSB7CiAgICAgICAgIGlmIChmaWx0ZXIubWF0Y2hlcyhub2RlLCBpZCkpIHsKICAgICAgICAgICAgIHJldHVybiBub2RlOwogICAgICAgICB9CkBAIC0zOTgsNiArMzcwLDIyIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogR2V0cyBhIG5vZGUgZ2l2ZW4gdGhlIHZhbHVlIG9mIGl0cyAoc2luZ2xlKSBhdXRvZmlsbCBoaW50IHByb3BlcnR5LCBvciB7QGNvZGUgbnVsbH0gaWYgbm90CisgICAgICogZm91bmQuCisgICAgICovCisgICAgc3RhdGljIFZpZXdOb2RlIGZpbmROb2RlQnlBdXRvZmlsbEhpbnQoVmlld05vZGUgbm9kZSwgU3RyaW5nIGhpbnQpIHsKKyAgICAgICAgcmV0dXJuIGZpbmROb2RlQnlGaWx0ZXIobm9kZSwgaGludCwgQVVUT0ZJTExfSElOVF9GSUxURVIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgYSBub2RlIGdpdmVuIHRoZSBuYW1lIG9mIGl0cyBIVE1MIElOUFVUIHRhZyBvciBBbmRyb2lkIHJlc29pcmNlIGlkLCBvciB7QGNvZGUgbnVsbH0gaWYKKyAgICAgKiBub3QgZm91bmQuCisgICAgICovCisgICAgc3RhdGljIFZpZXdOb2RlIGZpbmROb2RlQnlIdG1sTmFtZU9yUmVzb3VyY2VJZChMaXN0PEZpbGxDb250ZXh0PiBjb250ZXh0cywgU3RyaW5nIGlkKSB7CisgICAgICAgIHJldHVybiBmaW5kTm9kZUJ5RmlsdGVyKGNvbnRleHRzLCBpZCwgSFRNTF9OQU1FX09SX1JFU09VUkNFX0lEX0ZJTFRFUik7CisgICAgfQorCisgICAgLyoqCiAgICAgICogR2V0cyB0aGUge0Bjb2RlIG5hbWV9IGF0dHJpYnV0ZSBvZiBhIG5vZGUgcmVwcmVzZW50aW5nIGFuIEhUTUwgaW5wdXQgdGFnLgogICAgICAqLwogICAgIEBOdWxsYWJsZQpAQCAtNDM1LDcgKzQyMywzOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFzc2VydHMgYSB0ZXh0LWJhc2Ugbm9kZSBpcyBzYW5pdGl6ZWQuCisgICAgICogR2V0cyBhIHZpZXcgdGhhdCBjb250YWlucyB0aGUgYW4gYXV0b2ZpbGwgaGludCwgb3Ige0Bjb2RlIG51bGx9IGlmIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBzdGF0aWMgVmlldyBmaW5kVmlld0J5QXV0b2ZpbGxIaW50KEFjdGl2aXR5IGFjdGl2aXR5LCBTdHJpbmcgaGludCkgeworICAgICAgICBmaW5hbCBWaWV3IHJvb3RWaWV3ID0gYWN0aXZpdHkuZ2V0V2luZG93KCkuZ2V0RGVjb3JWaWV3KCkuZ2V0Um9vdFZpZXcoKTsKKyAgICAgICAgcmV0dXJuIGZpbmRWaWV3QnlBdXRvZmlsbEhpbnQocm9vdFZpZXcsIGhpbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgYSB2aWV3IChvciBhIGRlc2NlbmRhbnQgb2YgaXQpIHRoYXQgY29udGFpbnMgdGhlIGFuIGF1dG9maWxsIGhpbnQsIG9yIHtAY29kZSBudWxsfSBpZgorICAgICAqIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBzdGF0aWMgVmlldyBmaW5kVmlld0J5QXV0b2ZpbGxIaW50KFZpZXcgdmlldywgU3RyaW5nIGhpbnQpIHsKKyAgICAgICAgaWYgKEFVVE9GSUxMX0hJTlRfVklFV19GSUxURVIubWF0Y2hlcyh2aWV3LCBoaW50KSkgcmV0dXJuIHZpZXc7CisgICAgICAgIGlmICgodmlldyBpbnN0YW5jZW9mIFZpZXdHcm91cCkpIHsKKyAgICAgICAgICAgIGZpbmFsIFZpZXdHcm91cCBncm91cCA9IChWaWV3R3JvdXApIHZpZXc7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGdyb3VwLmdldENoaWxkQ291bnQoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgZmluYWwgVmlldyBjaGlsZCA9IGZpbmRWaWV3QnlBdXRvZmlsbEhpbnQoZ3JvdXAuZ2V0Q2hpbGRBdChpKSwgaGludCk7CisgICAgICAgICAgICAgICAgaWYgKGNoaWxkICE9IG51bGwpIHJldHVybiBjaGlsZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGEgdmlldyAob3IgYSBkZXNjZW5kYW50IG9mIGl0KSB0aGF0IGhhcyB0aGUgZ2l2ZW4ge0Bjb2RlIGlkfSwgb3Ige0Bjb2RlIG51bGx9IGlmCisgICAgICogbm90IGZvdW5kLgorICAgICAqLworICAgIHN0YXRpYyBWaWV3Tm9kZSBmaW5kTm9kZUJ5QXV0b2ZpbGxJZChBc3Npc3RTdHJ1Y3R1cmUgc3RydWN0dXJlLCBBdXRvZmlsbElkIGlkKSB7CisgICAgICAgIHJldHVybiBmaW5kTm9kZUJ5RmlsdGVyKHN0cnVjdHVyZSwgaWQsIEFVVE9GSUxMX0lEX0ZJTFRFUik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNzZXJ0cyBhIHRleHQtYmFzZWQgbm9kZSBpcyBzYW5pdGl6ZWQuCiAgICAgICovCiAgICAgc3RhdGljIHZvaWQgYXNzZXJ0VGV4dElzU2FuaXRpemVkKFZpZXdOb2RlIG5vZGUpIHsKICAgICAgICAgZmluYWwgQ2hhclNlcXVlbmNlIHRleHQgPSBub2RlLmdldFRleHQoKTsKQEAgLTQ0Myw5ICs0NjMsMTUgQEAKICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh0ZXh0KSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJ0ZXh0IG9uIHNhbml0aXplZCBmaWVsZCAiICsgcmVzb3VyY2VJZCArICI6ICIgKyB0ZXh0KTsKICAgICAgICAgfQorCisgICAgICAgIGFzc2VydE5vdEZyb21SZXNvdXJjZXMobm9kZSk7CiAgICAgICAgIGFzc2VydE5vZGVIYXNOb0F1dG9maWxsVmFsdWUobm9kZSk7CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnROb3RGcm9tUmVzb3VyY2VzKFZpZXdOb2RlIG5vZGUpIHsKKyAgICAgICAgYXNzZXJ0VGhhdChub2RlLmdldFRleHRJZEVudHJ5KCkpLmlzTnVsbCgpOworICAgIH0KKwogICAgIHN0YXRpYyB2b2lkIGFzc2VydE5vZGVIYXNOb0F1dG9maWxsVmFsdWUoVmlld05vZGUgbm9kZSkgewogICAgICAgICBmaW5hbCBBdXRvZmlsbFZhbHVlIHZhbHVlID0gbm9kZS5nZXRBdXRvZmlsbFZhbHVlKCk7CiAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CkBAIC00NTYsMjIgKzQ4MiwzMSBAQAogCiAgICAgLyoqCiAgICAgICogQXNzZXJ0cyB0aGUgY29udGVudHMgb2YgYSB0ZXh0LWJhc2VkIG5vZGUgdGhhdCBpcyBhbHNvIGF1dG8tZmlsbGFibGUuCi0gICAgICoKICAgICAgKi8KICAgICBzdGF0aWMgdm9pZCBhc3NlcnRUZXh0T25seShWaWV3Tm9kZSBub2RlLCBTdHJpbmcgZXhwZWN0ZWRWYWx1ZSkgewogICAgICAgICBhc3NlcnRUZXh0KG5vZGUsIGV4cGVjdGVkVmFsdWUsIGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0Tm90RnJvbVJlc291cmNlcyhub2RlKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBBc3NlcnRzIHRoZSBjb250ZW50cyBvZiBhIHRleHQtYmFzZWQgbm9kZSB0aGF0IGlzIGFsc28gYXV0by1maWxsYWJsZS4KLSAgICAgKgogICAgICAqLwotICAgIHN0YXRpYyB2b2lkIGFzc2VydFRleHRBbmRWYWx1ZShWaWV3Tm9kZSBub2RlLCBTdHJpbmcgZXhwZWN0ZWRWYWx1ZSkgewotICAgICAgICBhc3NlcnRUZXh0KG5vZGUsIGV4cGVjdGVkVmFsdWUsIHRydWUpOworICAgIHN0YXRpYyB2b2lkIGFzc2VydFRleHRPbmx5KEFzc2lzdFN0cnVjdHVyZSBzdHJ1Y3R1cmUsIFN0cmluZyByZXNvdXJjZUlkLCBTdHJpbmcgZXhwZWN0ZWRWYWx1ZSkgeworICAgICAgICBmaW5hbCBWaWV3Tm9kZSBub2RlID0gZmluZE5vZGVCeVJlc291cmNlSWQoc3RydWN0dXJlLCByZXNvdXJjZUlkKTsKKyAgICAgICAgYXNzZXJ0VGV4dChub2RlLCBleHBlY3RlZFZhbHVlLCBmYWxzZSk7CisgICAgICAgIGFzc2VydE5vdEZyb21SZXNvdXJjZXMobm9kZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQXNzZXJ0cyBhIHRleHQtYmFzZSBub2RlIGV4aXN0cyBhbmQgdmVyaWZ5IGl0cyB2YWx1ZXMuCisgICAgICogQXNzZXJ0cyB0aGUgY29udGVudHMgb2YgYSB0ZXh0LWJhc2VkIG5vZGUgdGhhdCBpcyBhbHNvIGF1dG8tZmlsbGFibGUuCisgICAgICovCisgICAgc3RhdGljIHZvaWQgYXNzZXJ0VGV4dEFuZFZhbHVlKFZpZXdOb2RlIG5vZGUsIFN0cmluZyBleHBlY3RlZFZhbHVlKSB7CisgICAgICAgIGFzc2VydFRleHQobm9kZSwgZXhwZWN0ZWRWYWx1ZSwgdHJ1ZSk7CisgICAgICAgIGFzc2VydE5vdEZyb21SZXNvdXJjZXMobm9kZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNzZXJ0cyBhIHRleHQtYmFzZWQgbm9kZSBleGlzdHMgYW5kIHZlcmlmeSBpdHMgdmFsdWVzLgogICAgICAqLwogICAgIHN0YXRpYyBWaWV3Tm9kZSBhc3NlcnRUZXh0QW5kVmFsdWUoQXNzaXN0U3RydWN0dXJlIHN0cnVjdHVyZSwgU3RyaW5nIHJlc291cmNlSWQsCiAgICAgICAgICAgICBTdHJpbmcgZXhwZWN0ZWRWYWx1ZSkgewpAQCAtNDgxLDcgKzUxNiw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQXNzZXJ0cyBhIHRleHQtYmFzZSBub2RlIGV4aXN0cyBhbmQgaXMgc2FuaXRpemVkLgorICAgICAqIEFzc2VydHMgYSB0ZXh0LWJhc2VkIG5vZGUgZXhpc3RzIGFuZCBpcyBzYW5pdGl6ZWQuCiAgICAgICovCiAgICAgc3RhdGljIFZpZXdOb2RlIGFzc2VydFZhbHVlKEFzc2lzdFN0cnVjdHVyZSBzdHJ1Y3R1cmUsIFN0cmluZyByZXNvdXJjZUlkLAogICAgICAgICAgICAgU3RyaW5nIGV4cGVjdGVkVmFsdWUpIHsKQEAgLTQ5MCwxNiArNTI1LDI4IEBACiAgICAgICAgIHJldHVybiBub2RlOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEFzc2VydHMgdGhlIHZhbHVlcyBvZiBhIHRleHQtYmFzZWQgbm9kZSB3aG9zZSBzdHJpbmcgY29tZSBmcm9tIHJlc29ydWNlcy4KKyAgICAgKi8KKyAgICBzdGF0aWMgVmlld05vZGUgYXNzZXJ0VGV4dEZyb21SZXNvdWNlcyhBc3Npc3RTdHJ1Y3R1cmUgc3RydWN0dXJlLCBTdHJpbmcgcmVzb3VyY2VJZCwKKyAgICAgICAgICAgIFN0cmluZyBleHBlY3RlZFZhbHVlLCBib29sZWFuIGlzQXV0b2ZpbGxhYmxlLCBTdHJpbmcgZXhwZWN0ZWRUZXh0SWRFbnRyeSkgeworICAgICAgICBmaW5hbCBWaWV3Tm9kZSBub2RlID0gZmluZE5vZGVCeVJlc291cmNlSWQoc3RydWN0dXJlLCByZXNvdXJjZUlkKTsKKyAgICAgICAgYXNzZXJ0VGV4dChub2RlLCBleHBlY3RlZFZhbHVlLCBpc0F1dG9maWxsYWJsZSk7CisgICAgICAgIGFzc2VydFRoYXQobm9kZS5nZXRUZXh0SWRFbnRyeSgpKS5pc0VxdWFsVG8oZXhwZWN0ZWRUZXh0SWRFbnRyeSk7CisgICAgICAgIHJldHVybiBub2RlOworICAgIH0KKwogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0VGV4dChWaWV3Tm9kZSBub2RlLCBTdHJpbmcgZXhwZWN0ZWRWYWx1ZSwgYm9vbGVhbiBpc0F1dG9maWxsYWJsZSkgewotICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgid3JvbmcgdGV4dCBvbiAlcyIsIG5vZGUpLnRoYXQobm9kZS5nZXRUZXh0KCkudG9TdHJpbmcoKSkKKyAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoIndyb25nIHRleHQgb24gJXMiLCBub2RlLmdldEF1dG9maWxsSWQoKSkudGhhdChub2RlLmdldFRleHQoKS50b1N0cmluZygpKQogICAgICAgICAgICAgICAgIC5pc0VxdWFsVG8oZXhwZWN0ZWRWYWx1ZSk7CiAgICAgICAgIGZpbmFsIEF1dG9maWxsVmFsdWUgdmFsdWUgPSBub2RlLmdldEF1dG9maWxsVmFsdWUoKTsKKyAgICAgICAgZmluYWwgQXV0b2ZpbGxJZCBpZCA9IG5vZGUuZ2V0QXV0b2ZpbGxJZCgpOwogICAgICAgICBpZiAoaXNBdXRvZmlsbGFibGUpIHsKLSAgICAgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJudWxsIGF1dG8tZmlsbCB2YWx1ZSBvbiAlcyIsIG5vZGUpLnRoYXQodmFsdWUpLmlzTm90TnVsbCgpOwotICAgICAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoIndyb25nIGF1dG8tZmlsbCB2YWx1ZSBvbiAlcyIsIG5vZGUpCisgICAgICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgibnVsbCBhdXRvLWZpbGwgdmFsdWUgb24gJXMiLCBpZCkudGhhdCh2YWx1ZSkuaXNOb3ROdWxsKCk7CisgICAgICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgid3JvbmcgYXV0by1maWxsIHZhbHVlIG9uICVzIiwgaWQpCiAgICAgICAgICAgICAgICAgICAgIC50aGF0KHZhbHVlLmdldFRleHRWYWx1ZSgpLnRvU3RyaW5nKCkpLmlzRXF1YWxUbyhleHBlY3RlZFZhbHVlKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJub2RlICVzIHNob3VsZCBub3QgaGF2ZSBBdXRvZmlsbFZhbHVlIiwgbm9kZSkudGhhdCh2YWx1ZSkuaXNOdWxsKCk7CisgICAgICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgibm9kZSAlcyBzaG91bGQgbm90IGhhdmUgQXV0b2ZpbGxWYWx1ZSIsIGlkKS50aGF0KHZhbHVlKS5pc051bGwoKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNTA4LDkgKzU1NSwxMCBAQAogICAgICAqLwogICAgIHN0YXRpYyBWaWV3Tm9kZSBhc3NlcnRUZXh0VmFsdWUoVmlld05vZGUgbm9kZSwgU3RyaW5nIGV4cGVjdGVkVGV4dCkgewogICAgICAgICBmaW5hbCBBdXRvZmlsbFZhbHVlIHZhbHVlID0gbm9kZS5nZXRBdXRvZmlsbFZhbHVlKCk7Ci0gICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJudWxsIGF1dG9maWxsIHZhbHVlIG9uICVzIiwgbm9kZSkudGhhdCh2YWx1ZSkuaXNOb3ROdWxsKCk7Ci0gICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJ3cm9uZyBhdXRvZmlsbCB0eXBlIG9uICVzIiwgbm9kZSkudGhhdCh2YWx1ZS5pc1RleHQoKSkuaXNUcnVlKCk7Ci0gICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJ3cm9uZyBhdXRvZmlsbCB2YWx1ZSBvbiAlcyIsIG5vZGUpLnRoYXQodmFsdWUuZ2V0VGV4dFZhbHVlKCkudG9TdHJpbmcoKSkKKyAgICAgICAgZmluYWwgQXV0b2ZpbGxJZCBpZCA9IG5vZGUuZ2V0QXV0b2ZpbGxJZCgpOworICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgibnVsbCBhdXRvZmlsbCB2YWx1ZSBvbiAlcyIsIGlkKS50aGF0KHZhbHVlKS5pc05vdE51bGwoKTsKKyAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoIndyb25nIGF1dG9maWxsIHR5cGUgb24gJXMiLCBpZCkudGhhdCh2YWx1ZS5pc1RleHQoKSkuaXNUcnVlKCk7CisgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJ3cm9uZyBhdXRvZmlsbCB2YWx1ZSBvbiAlcyIsIGlkKS50aGF0KHZhbHVlLmdldFRleHRWYWx1ZSgpLnRvU3RyaW5nKCkpCiAgICAgICAgICAgICAgICAgLmlzRXF1YWxUbyhleHBlY3RlZFRleHQpOwogICAgICAgICByZXR1cm4gbm9kZTsKICAgICB9CkBAIC01MjAsOSArNTY4LDEwIEBACiAgICAgICovCiAgICAgc3RhdGljIFZpZXdOb2RlIGFzc2VydExpc3RWYWx1ZShWaWV3Tm9kZSBub2RlLCBpbnQgZXhwZWN0ZWRJbmRleCkgewogICAgICAgICBmaW5hbCBBdXRvZmlsbFZhbHVlIHZhbHVlID0gbm9kZS5nZXRBdXRvZmlsbFZhbHVlKCk7Ci0gICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJudWxsIGF1dG9maWxsIHZhbHVlIG9uICVzIiwgbm9kZSkudGhhdCh2YWx1ZSkuaXNOb3ROdWxsKCk7Ci0gICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJ3cm9uZyBhdXRvZmlsbCB0eXBlIG9uICVzIiwgbm9kZSkudGhhdCh2YWx1ZS5pc0xpc3QoKSkuaXNUcnVlKCk7Ci0gICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJ3cm9uZyBhdXRvZmlsbCB2YWx1ZSBvbiAlcyIsIG5vZGUpLnRoYXQodmFsdWUuZ2V0TGlzdFZhbHVlKCkpCisgICAgICAgIGZpbmFsIEF1dG9maWxsSWQgaWQgPSBub2RlLmdldEF1dG9maWxsSWQoKTsKKyAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoIm51bGwgYXV0b2ZpbGwgdmFsdWUgb24gJXMiLCBpZCkudGhhdCh2YWx1ZSkuaXNOb3ROdWxsKCk7CisgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJ3cm9uZyBhdXRvZmlsbCB0eXBlIG9uICVzIiwgaWQpLnRoYXQodmFsdWUuaXNMaXN0KCkpLmlzVHJ1ZSgpOworICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgid3JvbmcgYXV0b2ZpbGwgdmFsdWUgb24gJXMiLCBpZCkudGhhdCh2YWx1ZS5nZXRMaXN0VmFsdWUoKSkKICAgICAgICAgICAgICAgICAuaXNFcXVhbFRvKGV4cGVjdGVkSW5kZXgpOwogICAgICAgICByZXR1cm4gbm9kZTsKICAgICB9CkBAIC01MzIsOSArNTgxLDEwIEBACiAgICAgICovCiAgICAgc3RhdGljIHZvaWQgYXNzZXJ0VG9nZ2xlVmFsdWUoVmlld05vZGUgbm9kZSwgYm9vbGVhbiBleHBlY3RlZFRvZ2dsZSkgewogICAgICAgICBmaW5hbCBBdXRvZmlsbFZhbHVlIHZhbHVlID0gbm9kZS5nZXRBdXRvZmlsbFZhbHVlKCk7Ci0gICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJudWxsIGF1dG9maWxsIHZhbHVlIG9uICVzIiwgbm9kZSkudGhhdCh2YWx1ZSkuaXNOb3ROdWxsKCk7Ci0gICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJ3cm9uZyBhdXRvZmlsbCB0eXBlIG9uICVzIiwgbm9kZSkudGhhdCh2YWx1ZS5pc1RvZ2dsZSgpKS5pc1RydWUoKTsKLSAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoIndyb25nIGF1dG9maWxsIHZhbHVlIG9uICVzIiwgbm9kZSkudGhhdCh2YWx1ZS5nZXRUb2dnbGVWYWx1ZSgpKQorICAgICAgICBmaW5hbCBBdXRvZmlsbElkIGlkID0gbm9kZS5nZXRBdXRvZmlsbElkKCk7CisgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJudWxsIGF1dG9maWxsIHZhbHVlIG9uICVzIiwgaWQpLnRoYXQodmFsdWUpLmlzTm90TnVsbCgpOworICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgid3JvbmcgYXV0b2ZpbGwgdHlwZSBvbiAlcyIsIGlkKS50aGF0KHZhbHVlLmlzVG9nZ2xlKCkpLmlzVHJ1ZSgpOworICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgid3JvbmcgYXV0b2ZpbGwgdmFsdWUgb24gJXMiLCBpZCkudGhhdCh2YWx1ZS5nZXRUb2dnbGVWYWx1ZSgpKQogICAgICAgICAgICAgICAgIC5pc0VxdWFsVG8oZXhwZWN0ZWRUb2dnbGUpOwogICAgIH0KIApAQCAtNjAxLDcgKzY1MSw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQXNzZXJ0cyBhIHRleHQtYmFzZSBub2RlIGV4aXN0cyBhbmQgaXMgc2FuaXRpemVkLgorICAgICAqIEFzc2VydHMgYSB0ZXh0LWJhc2VkIG5vZGUgZXhpc3RzIGFuZCBpcyBzYW5pdGl6ZWQuCiAgICAgICovCiAgICAgc3RhdGljIFZpZXdOb2RlIGFzc2VydFRleHRJc1Nhbml0aXplZChBc3Npc3RTdHJ1Y3R1cmUgc3RydWN0dXJlLCBTdHJpbmcgcmVzb3VyY2VJZCkgewogICAgICAgICBmaW5hbCBWaWV3Tm9kZSBub2RlID0gZmluZE5vZGVCeVJlc291cmNlSWQoc3RydWN0dXJlLCByZXNvdXJjZUlkKTsKQEAgLTY1Nyw3ICs3MDcsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHRvdGFsIG51bWJlciBvZiBub2RlcyBpbiBhbiBzdHJ1Y3R1cmUsIGluY2x1ZGluZyBhbGwgZGVzY2VuZGFudHMuCisgICAgICogR2V0cyB0aGUgdG90YWwgbnVtYmVyIG9mIG5vZGVzIGluIGFuIHN0cnVjdHVyZS4KICAgICAgKi8KICAgICBzdGF0aWMgaW50IGdldE51bWJlck5vZGVzKEFzc2lzdFN0cnVjdHVyZSBzdHJ1Y3R1cmUpIHsKICAgICAgICAgaW50IGNvdW50ID0gMDsKQEAgLTY3Myw3ICs3MjMsNyBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHRvdGFsIG51bWJlciBvZiBub2RlcyBpbiBhbiBub2RlLCBpbmNsdWRpbmcgYWxsIGRlc2NlbmRhbnRzIGFuZCB0aGUgbm9kZSBpdHNlbGYuCiAgICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldE51bWJlck5vZGVzKFZpZXdOb2RlIG5vZGUpIHsKKyAgICBzdGF0aWMgaW50IGdldE51bWJlck5vZGVzKFZpZXdOb2RlIG5vZGUpIHsKICAgICAgICAgaW50IGNvdW50ID0gMTsKICAgICAgICAgZmluYWwgaW50IGNoaWxkcmVuU2l6ZSA9IG5vZGUuZ2V0Q2hpbGRDb3VudCgpOwogICAgICAgICBpZiAoY2hpbGRyZW5TaXplID4gMCkgewpAQCAtNzA4LDcgKzc1OCw3IEBACiAgICAgLyoqCiAgICAgICogUHJldmVudHMgdGhlIHNjcmVlbiB0byByb3RhdGUgYnkgaXRzZWxmCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRpc2FibGVBdXRvUm90YXRpb24oVWlCb3QgdWlCb3QpIHsKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGlzYWJsZUF1dG9Sb3RhdGlvbihVaUJvdCB1aUJvdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHJ1blNoZWxsQ29tbWFuZChBQ0NFTExFUk9NRVRFUl9DSEFOR0UsIDApOwogICAgICAgICB1aUJvdC5zZXRTY3JlZW5PcmllbnRhdGlvbihQT1JUUkFJVCk7CiAgICAgfQpAQCAtNzQzLDYgKzc5MywzMyBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIENoZWNrcyBpZiBhdXRvZmlsbCB3aW5kb3cgaXMgZnVsbHNjcmVlbiwgc2VlIGNvbS5hbmRyb2lkLnNlcnZlci5hdXRvZmlsbC51aS5GaWxsVWkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQXV0b2ZpbGxXaW5kb3dGdWxsU2NyZWVuKENvbnRleHQgY29udGV4dCkgeworICAgICAgICByZXR1cm4gY29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9MRUFOQkFDSyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIHNjcmVlbiBvcmllbnRhdGlvbiBjYW4gYmUgY2hhbmdlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSb3RhdGlvblN1cHBvcnRlZChDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgZmluYWwgUGFja2FnZU1hbmFnZXIgcGFja2FnZU1hbmFnZXIgPSBjb250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgIGlmIChwYWNrYWdlTWFuYWdlci5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfQVVUT01PVElWRSkpIHsKKyAgICAgICAgICAgIExvZy52KFRBRywgImlzUm90YXRpb25TdXBwb3J0ZWQoKTogaXMgYXV0byIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChjb250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCkuaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX0xFQU5CQUNLKSkgeworICAgICAgICAgICAgTG9nLnYoVEFHLCAiaXNSb3RhdGlvblN1cHBvcnRlZCgpOiBoYXMgbGVhbmJhY2sgZmVhdHVyZSIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChwYWNrYWdlTWFuYWdlci5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfUEMpKSB7CisgICAgICAgICAgICBMb2cudihUQUcsICJpc1JvdGF0aW9uU3VwcG9ydGVkKCk6IGlzIFBDIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCiAgICAgICogVXNlcyBTaGVsbCBjb21tYW5kIHRvIGdldCB0aGUgQXV0b2ZpbGwgbG9nZ2luZyBsZXZlbC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRMb2dnaW5nTGV2ZWwoKSB7CkBAIC03NjAsNTggKzgzNyw1NCBAQAogICAgICAqIFVzZXMgU2V0dGluZ3MgdG8gZW5hYmxlIHRoZSBnaXZlbiBhdXRvZmlsbCBzZXJ2aWNlIGZvciB0aGUgZGVmYXVsdCB1c2VyLCBhbmQgY2hlY2tzIHRoZQogICAgICAqIHZhbHVlIHdhcyBwcm9wZXJseSBjaGVjaywgdGhyb3dpbmcgYW4gZXhjZXB0aW9uIGlmIGl0IHdhcyBub3QuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGVuYWJsZUF1dG9maWxsU2VydmljZShDb250ZXh0IGNvbnRleHQsIFN0cmluZyBzZXJ2aWNlTmFtZSkgeworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBlbmFibGVBdXRvZmlsbFNlcnZpY2UoQE5vbk51bGwgQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgQE5vbk51bGwgU3RyaW5nIHNlcnZpY2VOYW1lKSB7CiAgICAgICAgIGlmIChpc0F1dG9maWxsU2VydmljZUVuYWJsZWQoc2VydmljZU5hbWUpKSByZXR1cm47CiAKLSAgICAgICAgZmluYWwgT25lVGltZVNldHRpbmdzTGlzdGVuZXIgb2JzZXJ2ZXIgPSBuZXcgT25lVGltZVNldHRpbmdzTGlzdGVuZXIoY29udGV4dCwKLSAgICAgICAgICAgICAgICBBVVRPRklMTF9TRVJWSUNFKTsKLSAgICAgICAgcnVuU2hlbGxDb21tYW5kKCJzZXR0aW5ncyBwdXQgc2VjdXJlICVzICVzIGRlZmF1bHQiLCBBVVRPRklMTF9TRVJWSUNFLCBzZXJ2aWNlTmFtZSk7Ci0gICAgICAgIG9ic2VydmVyLmFzc2VydENhbGxlZCgpOwotICAgICAgICBhc3NlcnRBdXRvZmlsbFNlcnZpY2VTdGF0dXMoc2VydmljZU5hbWUsIHRydWUpOworICAgICAgICAvLyBTZXRzIHRoZSBzZXR0aW5nIHN5bmNocm9ub3VzbHkuIE5vdGUgdGhhdCB0aGUgY29uZmlnIGl0c2VsZiBpcyBzZXRzIHN5bmNocm9ub3VzbHkgYnV0CisgICAgICAgIC8vIGxhdW5jaCBvZiB0aGUgc2VydmljZSBpcyBhc3luY2hyb25vdXMgYWZ0ZXIgdGhlIGNvbmZpZyBpcyB1cGRhdGVkLgorICAgICAgICBTZXR0aW5nc0hlbHBlci5zeW5jU2V0KGNvbnRleHQsIEFVVE9GSUxMX1NFUlZJQ0UsIHNlcnZpY2VOYW1lKTsKKworICAgICAgICAvLyBXYWl0cyB1bnRpbCB0aGUgc2VydmljZSBpcyBhY3R1YWxseSBlbmFibGVkLgorICAgICAgICB0cnkgeworICAgICAgICAgICAgVGltZW91dHMuQ09OTkVDVElPTl9USU1FT1VULnJ1bigiRW5hYmxpbmcgQXV0b2ZpbGwgc2VydmljZSIsICgpIC0+IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaXNBdXRvZmlsbFNlcnZpY2VFbmFibGVkKHNlcnZpY2VOYW1lKSA/IHNlcnZpY2VOYW1lIDogbnVsbDsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJFbmFibGluZyBBdXRvZmlsbCBzZXJ2aWNlIGZhaWxlZC4iKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgogICAgICAqIFVzZXMgU2V0dGluZ3MgdG8gZGlzYWJsZSB0aGUgZ2l2ZW4gYXV0b2ZpbGwgc2VydmljZSBmb3IgdGhlIGRlZmF1bHQgdXNlciwgYW5kIGNoZWNrcyB0aGUKICAgICAgKiB2YWx1ZSB3YXMgcHJvcGVybHkgY2hlY2ssIHRocm93aW5nIGFuIGV4Y2VwdGlvbiBpZiBpdCB3YXMgbm90LgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkaXNhYmxlQXV0b2ZpbGxTZXJ2aWNlKENvbnRleHQgY29udGV4dCwgU3RyaW5nIHNlcnZpY2VOYW1lKSB7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIGRpc2FibGVBdXRvZmlsbFNlcnZpY2UoQE5vbk51bGwgQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgQE5vbk51bGwgU3RyaW5nIHNlcnZpY2VOYW1lKSB7CiAgICAgICAgIGlmICghaXNBdXRvZmlsbFNlcnZpY2VFbmFibGVkKHNlcnZpY2VOYW1lKSkgcmV0dXJuOwogCi0gICAgICAgIGZpbmFsIE9uZVRpbWVTZXR0aW5nc0xpc3RlbmVyIG9ic2VydmVyID0gbmV3IE9uZVRpbWVTZXR0aW5nc0xpc3RlbmVyKGNvbnRleHQsCi0gICAgICAgICAgICAgICAgQVVUT0ZJTExfU0VSVklDRSk7Ci0gICAgICAgIHJ1blNoZWxsQ29tbWFuZCgic2V0dGluZ3MgZGVsZXRlIHNlY3VyZSAlcyIsIEFVVE9GSUxMX1NFUlZJQ0UpOwotICAgICAgICBvYnNlcnZlci5hc3NlcnRDYWxsZWQoKTsKLSAgICAgICAgYXNzZXJ0QXV0b2ZpbGxTZXJ2aWNlU3RhdHVzKHNlcnZpY2VOYW1lLCBmYWxzZSk7CisgICAgICAgIFNldHRpbmdzSGVscGVyLnN5bmNEZWxldGUoY29udGV4dCwgQVVUT0ZJTExfU0VSVklDRSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHNlcnZpY2UgaXMgc2V0IGFzIHRoZSBhdXRvZmlsbCBzZXJ2aWNlIGZvciB0aGUgZGVmYXVsdCB1c2VyLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0F1dG9maWxsU2VydmljZUVuYWJsZWQoU3RyaW5nIHNlcnZpY2VOYW1lKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBhY3R1YWxOYW1lID0gcnVuU2hlbGxDb21tYW5kKCJzZXR0aW5ncyBnZXQgc2VjdXJlICVzIiwgQVVUT0ZJTExfU0VSVklDRSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0F1dG9maWxsU2VydmljZUVuYWJsZWQoQE5vbk51bGwgU3RyaW5nIHNlcnZpY2VOYW1lKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBhY3R1YWxOYW1lID0gU2V0dGluZ3NIZWxwZXIuZ2V0KEFVVE9GSUxMX1NFUlZJQ0UpOwogICAgICAgICByZXR1cm4gc2VydmljZU5hbWUuZXF1YWxzKGFjdHVhbE5hbWUpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIEFzc2VydHMgd2hldGhlciB0aGUgZ2l2ZW4gc2VydmljZSBpcyBlbmFibGVkIGFzIHRoZSBhdXRvZmlsbCBzZXJ2aWNlIGZvciB0aGUgZGVmYXVsdCB1c2VyLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRBdXRvZmlsbFNlcnZpY2VTdGF0dXMoU3RyaW5nIHNlcnZpY2VOYW1lLCBib29sZWFuIGVuYWJsZWQpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIGFjdHVhbCA9IHJ1blNoZWxsQ29tbWFuZCgic2V0dGluZ3MgZ2V0IHNlY3VyZSAlcyIsIEFVVE9GSUxMX1NFUlZJQ0UpOworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRBdXRvZmlsbFNlcnZpY2VTdGF0dXMoQE5vbk51bGwgU3RyaW5nIHNlcnZpY2VOYW1lLCBib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGFjdHVhbCA9IFNldHRpbmdzSGVscGVyLmdldChBVVRPRklMTF9TRVJWSUNFKTsKICAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdGVkID0gZW5hYmxlZCA/IHNlcnZpY2VOYW1lIDogIm51bGwiOwogICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiSW52YWxpZCB2YWx1ZSBmb3Igc2VjdXJlIHNldHRpbmcgJXMiLCBBVVRPRklMTF9TRVJWSUNFKQogICAgICAgICAgICAgICAgIC50aGF0KGFjdHVhbCkuaXNFcXVhbFRvKGV4cGVjdGVkKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBc3NlcnRzIHRoYXQgdGhlcmUgaXMgbm8gc2Vzc2lvbiBsZWZ0IGluIHRoZSBzZXJ2aWNlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnROb0RhbmdsaW5nU2Vzc2lvbnMoKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyByZXN1bHQgPSBydW5TaGVsbENvbW1hbmQoQ01EX0xJU1RfU0VTU0lPTlMpOwotICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiRGFuZ2xpbmcgc2Vzc2lvbnMgKCclcycpOiAlcyciLCBDTURfTElTVF9TRVNTSU9OUywgcmVzdWx0KS50aGF0KHJlc3VsdCkKLSAgICAgICAgICAgICAgICAuaXNFbXB0eSgpOwotICAgIH0KLQotICAgIC8qKgogICAgICAqIEFzc2VydHMgdGhhdCB0aGVyZSBpcyBhIHBlbmRpbmcgc2Vzc2lvbiBmb3IgdGhlIGdpdmVuIHBhY2thZ2UuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydEhhc1Nlc3Npb25zKFN0cmluZyBwYWNrYWdlTmFtZSkgewpAQCAtODIwLDY0ICs4OTMsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBEZXN0cm95cyBhbGwgc2Vzc2lvbnMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlc3Ryb3lBbGxTZXNzaW9ucygpIHsKLSAgICAgICAgcnVuU2hlbGxDb21tYW5kKCJjbWQgYXV0b2ZpbGwgZGVzdHJveSBzZXNzaW9ucyIpOwotICAgICAgICBhc3NlcnROb0RhbmdsaW5nU2Vzc2lvbnMoKTsKLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBHZXRzIHRoZSBpbnN0cnVtZW50YXRpb24gY29udGV4dC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIENvbnRleHQgZ2V0Q29udGV4dCgpIHsKICAgICAgICAgcmV0dXJuIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLmdldENvbnRleHQoKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBGaWVsZCBnZXRGaWVsZChDbGFzczw/PiBjbGF6eiwgU3RyaW5nIGZpZWxkTmFtZSkgewotICAgICAgICBmaW5hbCBGaWVsZFtdIGZpZWxkcyA9IGNsYXp6LmdldERlY2xhcmVkRmllbGRzKCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgZmllbGROYW1lcyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGZvciAoRmllbGQgZmllbGQgOiBmaWVsZHMpIHsKLSAgICAgICAgICAgIGZpZWxkTmFtZXMuYXBwZW5kKGZpZWxkLmdldE5hbWUoKSkuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICBmaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotICAgICAgICAgICAgaWYgKGZpZWxkLmdldE5hbWUoKS5lcXVhbHMoZmllbGROYW1lKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmaWVsZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJubyBmaWVsZCAiICsgZmllbGROYW1lICsgIiBvbiAiICsgY2xhenouZ2V0TmFtZSgpICsgIjogIiArIGZpZWxkTmFtZXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVzZXMgcmVmbGVjdGlvbiB0byBnZXQgYSBmaWVsZCBmcm9tIGFuIG9iamVjdC4KLSAgICAgKi8KLSAgICBzdGF0aWMgPFQ+IFQgZ2V0RmllbGQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGZpZWxkTmFtZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gY2xhenogPSBvYmplY3QuZ2V0Q2xhc3MoKTsKLSAgICAgICAgICAgIGZpbmFsIEZpZWxkIGZpZWxkID0gZ2V0RmllbGQoY2xhenosIGZpZWxkTmFtZSk7Ci0gICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgICAgICAgIGZpbmFsIFQgdmFsdWUgPSAoVCkgZmllbGQuZ2V0KG9iamVjdCk7Ci0gICAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiZXJyb3IgZ2V0dGluZyBmaWVsZCAiICsgZmllbGROYW1lICsgIiBmcm9tIG9iamVjdCIgKyBvYmplY3QsIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXNlcyByZWZsZWN0aW9uIHRvIHNldCBhIGZpZWxkIGluIGFuIG9iamVjdC4KLSAgICAgKi8KLSAgICBzdGF0aWMgdm9pZCBzZXRGaWVsZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgZmllbGROYW1lLCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IGNsYXp6ID0gb2JqZWN0LmdldENsYXNzKCk7Ci0gICAgICAgICAgICBmaW5hbCBGaWVsZCBmaWVsZCA9IGdldEZpZWxkKGNsYXp6LCBmaWVsZE5hbWUpOwotICAgICAgICAgICAgZmllbGQuc2V0KG9iamVjdCwgdmFsdWUpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZXJyb3Igc2V0dGluZyBmaWVsZCAiICsgZmllbGROYW1lICsgIiBvbiBvYmplY3QgIgotICAgICAgICAgICAgICAgICAgICArIG9iamVjdCwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBDbGVhbnMgdXAgdGhlIGF1dG9maWxsIHN0YXRlOyBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBwcmV0dHkgbXVjaCBhbnkgdGVzdC4KICAgICAgKi8KQEAgLTg4OSw3ICs5MTAsNiBAQAogICAgICAgICBkaXNhYmxlQXV0b2ZpbGxTZXJ2aWNlKGdldENvbnRleHQoKSwgU0VSVklDRV9OQU1FKTsKICAgICAgICAgSW5zdHJ1bWVudGVkQXV0b0ZpbGxTZXJ2aWNlLnNldElnbm9yZVVuZXhwZWN0ZWRSZXF1ZXN0cyh0cnVlKTsKIAotICAgICAgICBkZXN0cm95QWxsU2Vzc2lvbnMoKTsKICAgICAgICAgSW5zdHJ1bWVudGVkQXV0b0ZpbGxTZXJ2aWNlLnJlc2V0U3RhdGljU3RhdGUoKTsKICAgICAgICAgQXV0aGVudGljYXRpb25BY3Rpdml0eS5yZXNldFN0YXRpY1N0YXRlKCk7CiAgICAgfQpAQCAtOTMwLDE3ICs5NTAsMzY2IEBACiAgICAgLyoqCiAgICAgICogRmluZHMgYSB7QGxpbmsgV2ViVmlld30gbm9kZSBnaXZlbiBpdHMgZXhwZWN0ZWQgZm9ybSBuYW1lLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVmlld05vZGUgZmluZFdlYlZpZXdOb2RlKEFzc2lzdFN0cnVjdHVyZSBzdHJ1Y3R1cmUsIFN0cmluZyBmb3JtTmFtZSkgewotICAgICAgICByZXR1cm4gZmluZE5vZGVCeUZpbHRlcihzdHJ1Y3R1cmUsIGZvcm1OYW1lLCBXRUJWSUVXX1JPT1RfRklMVEVSKTsKKyAgICBwdWJsaWMgc3RhdGljIFZpZXdOb2RlIGZpbmRXZWJWaWV3Tm9kZUJ5Rm9ybU5hbWUoQXNzaXN0U3RydWN0dXJlIHN0cnVjdHVyZSwgU3RyaW5nIGZvcm1OYW1lKSB7CisgICAgICAgIHJldHVybiBmaW5kTm9kZUJ5RmlsdGVyKHN0cnVjdHVyZSwgZm9ybU5hbWUsIFdFQlZJRVdfRk9STV9GSUxURVIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0Q2xpZW50U3RhdGUoT2JqZWN0IGNvbnRhaW5lciwgQnVuZGxlIGNsaWVudFN0YXRlLAorICAgICAgICAgICAgU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCInJXMnIHNob3VsZCBoYXZlIGNsaWVudCBzdGF0ZSIsIGNvbnRhaW5lcikKKyAgICAgICAgICAgIC50aGF0KGNsaWVudFN0YXRlKS5pc05vdE51bGwoKTsKKyAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoIldyb25nIG51bWJlciBvZiBjbGllbnQgc3RhdGUgZXh0cmFzIG9uICclcyciLCBjb250YWluZXIpCisgICAgICAgICAgICAudGhhdChjbGllbnRTdGF0ZS5rZXlTZXQoKS5zaXplKCkpLmlzRXF1YWxUbygxKTsKKyAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoIldyb25nIHZhbHVlIGZvciBjbGllbnQgc3RhdGUga2V5ICglcykgb24gJyVzJyIsIGtleSwgY29udGFpbmVyKQorICAgICAgICAgICAgLnRoYXQoY2xpZW50U3RhdGUuZ2V0U3RyaW5nKGtleSkpLmlzRXF1YWxUbyh2YWx1ZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRmluZHMgYSB7QGxpbmsgV2ViVmlld30gbm9kZSBnaXZlbiBpdHMgZXhwZWN0ZWQgZm9ybSBuYW1lLgorICAgICAqIEFzc2VydHMgdGhlIGNvbnRlbnQgb2YgYSB7QGxpbmsgRmlsbEV2ZW50SGlzdG9yeSNnZXRDbGllbnRTdGF0ZSgpfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBoaXN0b3J5IGV2ZW50IHRvIGJlIGFzc2VydGVkCisgICAgICogQHBhcmFtIGtleSB0aGUgb25seSBrZXkgZXhwZWN0ZWQgaW4gdGhlIGNsaWVudCBzdGF0ZSBidW5kbGUKKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG9ubHkgdmFsdWUgZXhwZWN0ZWQgaW4gdGhlIGNsaWVudCBzdGF0ZSBidW5kbGUKICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFZpZXdOb2RlIGZpbmRXZWJWaWV3Tm9kZShWaWV3Tm9kZSBub2RlLCBTdHJpbmcgZm9ybU5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGZpbmROb2RlQnlGaWx0ZXIobm9kZSwgZm9ybU5hbWUsIFdFQlZJRVdfUk9PVF9GSUxURVIpOworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJqYXZhZG9jIikKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0RGVwcmVjYXRlZENsaWVudFN0YXRlKEBOb25OdWxsIEZpbGxFdmVudEhpc3RvcnkgaGlzdG9yeSwKKyAgICAgICAgICAgIEBOb25OdWxsIFN0cmluZyBrZXksIEBOb25OdWxsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBhc3NlcnRUaGF0KGhpc3RvcnkpLmlzTm90TnVsbCgpOworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQorICAgICAgICBmaW5hbCBCdW5kbGUgY2xpZW50U3RhdGUgPSBoaXN0b3J5LmdldENsaWVudFN0YXRlKCk7CisgICAgICAgIGFzc2VydENsaWVudFN0YXRlKGhpc3RvcnksIGNsaWVudFN0YXRlLCBrZXksIHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBc3NlcnRzIHRoZSB7QGxpbmsgRmlsbEV2ZW50SGlzdG9yeSNnZXRDbGllbnRTdGF0ZSgpfSBpcyBub3Qgc2V0LgorICAgICAqCisgICAgICogQHBhcmFtIGhpc3RvcnkgZXZlbnQgdG8gYmUgYXNzZXJ0ZWQKKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygiamF2YWRvYyIpCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydE5vRGVwcmVjYXRlZENsaWVudFN0YXRlKEBOb25OdWxsIEZpbGxFdmVudEhpc3RvcnkgaGlzdG9yeSkgeworICAgICAgICBhc3NlcnRUaGF0KGhpc3RvcnkpLmlzTm90TnVsbCgpOworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQorICAgICAgICBmaW5hbCBCdW5kbGUgY2xpZW50U3RhdGUgPSBoaXN0b3J5LmdldENsaWVudFN0YXRlKCk7CisgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJIaXN0b3J5ICclcycgc2hvdWxkIG5vdCBoYXZlIGNsaWVudCBzdGF0ZSIsIGhpc3RvcnkpCisgICAgICAgICAgICAgLnRoYXQoY2xpZW50U3RhdGUpLmlzTnVsbCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFzc2VydHMgdGhlIGNvbnRlbnQgb2YgYSB7QGxpbmsgYW5kcm9pZC5zZXJ2aWNlLmF1dG9maWxsLkZpbGxFdmVudEhpc3RvcnkuRXZlbnR9LgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IGV2ZW50IHRvIGJlIGFzc2VydGVkCisgICAgICogQHBhcmFtIGV2ZW50VHlwZSBleHBlY3RlZCB0eXBlCisgICAgICogQHBhcmFtIGRhdGFzZXRJZCBkYXRhc2V0IHNldCBpZCBleHBlY3RlZCBpbiB0aGUgZXZlbnQKKyAgICAgKiBAcGFyYW0ga2V5IHRoZSBvbmx5IGtleSBleHBlY3RlZCBpbiB0aGUgY2xpZW50IHN0YXRlIGJ1bmRsZSAob3Ige0Bjb2RlIG51bGx9IGlmIGl0IHNob3VsZG4ndAorICAgICAqIGhhdmUgY2xpZW50IHN0YXRlKQorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgb25seSB2YWx1ZSBleHBlY3RlZCBpbiB0aGUgY2xpZW50IHN0YXRlIGJ1bmRsZSAob3Ige0Bjb2RlIG51bGx9IGlmIGl0CisgICAgICogc2hvdWxkbid0IGhhdmUgY2xpZW50IHN0YXRlKQorICAgICAqIEBwYXJhbSBmaWVsZENsYXNzaWZpY2F0aW9uUmVzdWx0cyBleHBlY3RlZCByZXN1bHRzIHdoZW4gYXNzZXJ0aW5nIGZpZWxkIGNsYXNzaWZpY2F0aW9uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRGaWxsRXZlbnQoQE5vbk51bGwgRmlsbEV2ZW50SGlzdG9yeS5FdmVudCBldmVudCwKKyAgICAgICAgICAgIGludCBldmVudFR5cGUsIEBOdWxsYWJsZSBTdHJpbmcgZGF0YXNldElkLAorICAgICAgICAgICAgQE51bGxhYmxlIFN0cmluZyBrZXksIEBOdWxsYWJsZSBTdHJpbmcgdmFsdWUsCisgICAgICAgICAgICBATnVsbGFibGUgRmllbGRDbGFzc2lmaWNhdGlvblJlc3VsdFtdIGZpZWxkQ2xhc3NpZmljYXRpb25SZXN1bHRzKSB7CisgICAgICAgIGFzc2VydFRoYXQoZXZlbnQpLmlzTm90TnVsbCgpOworICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiV3JvbmcgdHlwZSBmb3IgJXMiLCBldmVudCkudGhhdChldmVudC5nZXRUeXBlKCkpLmlzRXF1YWxUbyhldmVudFR5cGUpOworICAgICAgICBpZiAoZGF0YXNldElkID09IG51bGwpIHsKKyAgICAgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJFdmVudCAlcyBzaG91bGQgbm90IGhhdmUgZGF0YXNldCBpZCIsIGV2ZW50KQorICAgICAgICAgICAgICAgIC50aGF0KGV2ZW50LmdldERhdGFzZXRJZCgpKS5pc051bGwoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJXcm9uZyBkYXRhc2V0IGlkIGZvciAlcyIsIGV2ZW50KQorICAgICAgICAgICAgICAgIC50aGF0KGV2ZW50LmdldERhdGFzZXRJZCgpKS5pc0VxdWFsVG8oZGF0YXNldElkKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBCdW5kbGUgY2xpZW50U3RhdGUgPSBldmVudC5nZXRDbGllbnRTdGF0ZSgpOworICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKKyAgICAgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJFdmVudCAnJXMnIHNob3VsZCBub3QgaGF2ZSBjbGllbnQgc3RhdGUiLCBldmVudCkKKyAgICAgICAgICAgICAgICAudGhhdChjbGllbnRTdGF0ZSkuaXNOdWxsKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhc3NlcnRDbGllbnRTdGF0ZShldmVudCwgY2xpZW50U3RhdGUsIGtleSwgdmFsdWUpOworICAgICAgICB9CisgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJFdmVudCAnJXMnIHNob3VsZCBub3QgaGF2ZSBzZWxlY3RlZCBkYXRhc2V0cyIsIGV2ZW50KQorICAgICAgICAgICAgICAgIC50aGF0KGV2ZW50LmdldFNlbGVjdGVkRGF0YXNldElkcygpKS5pc0VtcHR5KCk7CisgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJFdmVudCAnJXMnIHNob3VsZCBub3QgaGF2ZSBpZ25vcmVkIGRhdGFzZXRzIiwgZXZlbnQpCisgICAgICAgICAgICAgICAgLnRoYXQoZXZlbnQuZ2V0SWdub3JlZERhdGFzZXRJZHMoKSkuaXNFbXB0eSgpOworICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiRXZlbnQgJyVzJyBzaG91bGQgbm90IGhhdmUgY2hhbmdlZCBmaWVsZHMiLCBldmVudCkKKyAgICAgICAgICAgICAgICAudGhhdChldmVudC5nZXRDaGFuZ2VkRmllbGRzKCkpLmlzRW1wdHkoKTsKKyAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoIkV2ZW50ICclcycgc2hvdWxkIG5vdCBoYXZlIG1hbnVhbGx5LWVudGVyZWQgZmllbGRzIiwgZXZlbnQpCisgICAgICAgICAgICAgICAgLnRoYXQoZXZlbnQuZ2V0TWFudWFsbHlFbnRlcmVkRmllbGQoKSkuaXNFbXB0eSgpOworICAgICAgICBmaW5hbCBNYXA8QXV0b2ZpbGxJZCwgRmllbGRDbGFzc2lmaWNhdGlvbj4gZGV0ZWN0ZWRGaWVsZHMgPSBldmVudC5nZXRGaWVsZHNDbGFzc2lmaWNhdGlvbigpOworICAgICAgICBpZiAoZmllbGRDbGFzc2lmaWNhdGlvblJlc3VsdHMgPT0gbnVsbCkgeworICAgICAgICAgICAgYXNzZXJ0VGhhdChkZXRlY3RlZEZpZWxkcykuaXNFbXB0eSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0VGhhdChkZXRlY3RlZEZpZWxkcykuaGFzU2l6ZShmaWVsZENsYXNzaWZpY2F0aW9uUmVzdWx0cy5sZW5ndGgpOworICAgICAgICAgICAgaW50IGkgPSAwOworICAgICAgICAgICAgZm9yIChFbnRyeTxBdXRvZmlsbElkLCBGaWVsZENsYXNzaWZpY2F0aW9uPiBlbnRyeSA6IGRldGVjdGVkRmllbGRzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRNYXRjaGVzKGksIGVudHJ5LCBmaWVsZENsYXNzaWZpY2F0aW9uUmVzdWx0c1tpXSk7CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRNYXRjaGVzKGludCBpLCBFbnRyeTxBdXRvZmlsbElkLCBGaWVsZENsYXNzaWZpY2F0aW9uPiBhY3R1YWxSZXN1bHQsCisgICAgICAgICAgICBGaWVsZENsYXNzaWZpY2F0aW9uUmVzdWx0IGV4cGVjdGVkUmVzdWx0KSB7CisgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJXcm9uZyBmaWVsZCBpZCBhdCBpbmRleCAlcyIsIGkpLnRoYXQoYWN0dWFsUmVzdWx0LmdldEtleSgpKQorICAgICAgICAgICAgICAgIC5pc0VxdWFsVG8oZXhwZWN0ZWRSZXN1bHQuaWQpOworICAgICAgICBmaW5hbCBMaXN0PE1hdGNoPiBtYXRjaGVzID0gYWN0dWFsUmVzdWx0LmdldFZhbHVlKCkuZ2V0TWF0Y2hlcygpOworICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiV3JvbmcgbnVtYmVyIG9mIG1hdGNoZXM6ICIgKyBtYXRjaGVzKS50aGF0KG1hdGNoZXMuc2l6ZSgpKQorICAgICAgICAgICAgICAgIC5pc0VxdWFsVG8oZXhwZWN0ZWRSZXN1bHQucmVtb3RlSWRzLmxlbmd0aCk7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbWF0Y2hlcy5zaXplKCk7IGorKykgeworICAgICAgICAgICAgZmluYWwgTWF0Y2ggbWF0Y2ggPSBtYXRjaGVzLmdldChqKTsKKyAgICAgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJXcm9uZyBjYXRlZ29yeUlkIGF0ICglcywgJXMpOiAlcyIsIGksIGosIG1hdGNoKQorICAgICAgICAgICAgICAgIC50aGF0KG1hdGNoLmdldENhdGVnb3J5SWQoKSkuaXNFcXVhbFRvKGV4cGVjdGVkUmVzdWx0LnJlbW90ZUlkc1tqXSk7CisgICAgICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiV3Jvbmcgc2NvcmUgYXQgKCVzLCAlcyk6ICVzIiwgaSwgaiwgbWF0Y2gpCisgICAgICAgICAgICAgICAgLnRoYXQobWF0Y2guZ2V0U2NvcmUoKSkuaXNXaXRoaW4oMC4wMWYpLm9mKGV4cGVjdGVkUmVzdWx0LnNjb3Jlc1tqXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBc3NlcnRzIHRoZSBjb250ZW50IG9mIGEKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5zZXJ2aWNlLmF1dG9maWxsLkZpbGxFdmVudEhpc3RvcnkuRXZlbnQjVFlQRV9EQVRBU0VUX1NFTEVDVEVEfSBldmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBldmVudCB0byBiZSBhc3NlcnRlZAorICAgICAqIEBwYXJhbSBkYXRhc2V0SWQgZGF0YXNldCBzZXQgaWQgZXhwZWN0ZWQgaW4gdGhlIGV2ZW50CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydEZpbGxFdmVudEZvckRhdGFzZXRTZWxlY3RlZChATm9uTnVsbCBGaWxsRXZlbnRIaXN0b3J5LkV2ZW50IGV2ZW50LAorICAgICAgICAgICAgQE51bGxhYmxlIFN0cmluZyBkYXRhc2V0SWQpIHsKKyAgICAgICAgYXNzZXJ0RmlsbEV2ZW50KGV2ZW50LCBUWVBFX0RBVEFTRVRfU0VMRUNURUQsIGRhdGFzZXRJZCwgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNzZXJ0cyB0aGUgY29udGVudCBvZiBhCisgICAgICoge0BsaW5rIGFuZHJvaWQuc2VydmljZS5hdXRvZmlsbC5GaWxsRXZlbnRIaXN0b3J5LkV2ZW50I1RZUEVfREFUQVNFVF9TRUxFQ1RFRH0gZXZlbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgZXZlbnQgdG8gYmUgYXNzZXJ0ZWQKKyAgICAgKiBAcGFyYW0gZGF0YXNldElkIGRhdGFzZXQgc2V0IGlkIGV4cGVjdGVkIGluIHRoZSBldmVudAorICAgICAqIEBwYXJhbSBrZXkgdGhlIG9ubHkga2V5IGV4cGVjdGVkIGluIHRoZSBjbGllbnQgc3RhdGUgYnVuZGxlCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSBvbmx5IHZhbHVlIGV4cGVjdGVkIGluIHRoZSBjbGllbnQgc3RhdGUgYnVuZGxlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydEZpbGxFdmVudEZvckRhdGFzZXRTZWxlY3RlZChATm9uTnVsbCBGaWxsRXZlbnRIaXN0b3J5LkV2ZW50IGV2ZW50LAorICAgICAgICAgICAgQE51bGxhYmxlIFN0cmluZyBkYXRhc2V0SWQsIEBOdWxsYWJsZSBTdHJpbmcga2V5LCBATnVsbGFibGUgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIGFzc2VydEZpbGxFdmVudChldmVudCwgVFlQRV9EQVRBU0VUX1NFTEVDVEVELCBkYXRhc2V0SWQsIGtleSwgdmFsdWUsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFzc2VydHMgdGhlIGNvbnRlbnQgb2YgYQorICAgICAqIHtAbGluayBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuRmlsbEV2ZW50SGlzdG9yeS5FdmVudCNUWVBFX1NBVkVfU0hPV059IGV2ZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IGV2ZW50IHRvIGJlIGFzc2VydGVkCisgICAgICogQHBhcmFtIGRhdGFzZXRJZCBkYXRhc2V0IHNldCBpZCBleHBlY3RlZCBpbiB0aGUgZXZlbnQKKyAgICAgKiBAcGFyYW0ga2V5IHRoZSBvbmx5IGtleSBleHBlY3RlZCBpbiB0aGUgY2xpZW50IHN0YXRlIGJ1bmRsZQorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgb25seSB2YWx1ZSBleHBlY3RlZCBpbiB0aGUgY2xpZW50IHN0YXRlIGJ1bmRsZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRGaWxsRXZlbnRGb3JTYXZlU2hvd24oQE5vbk51bGwgRmlsbEV2ZW50SGlzdG9yeS5FdmVudCBldmVudCwKKyAgICAgICAgICAgIEBOb25OdWxsIFN0cmluZyBkYXRhc2V0SWQsIEBOb25OdWxsIFN0cmluZyBrZXksIEBOb25OdWxsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBhc3NlcnRGaWxsRXZlbnQoZXZlbnQsIFRZUEVfU0FWRV9TSE9XTiwgZGF0YXNldElkLCBrZXksIHZhbHVlLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBc3NlcnRzIHRoZSBjb250ZW50IG9mIGEKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5zZXJ2aWNlLmF1dG9maWxsLkZpbGxFdmVudEhpc3RvcnkuRXZlbnQjVFlQRV9TQVZFX1NIT1dOfSBldmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBldmVudCB0byBiZSBhc3NlcnRlZAorICAgICAqIEBwYXJhbSBkYXRhc2V0SWQgZGF0YXNldCBzZXQgaWQgZXhwZWN0ZWQgaW4gdGhlIGV2ZW50CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydEZpbGxFdmVudEZvclNhdmVTaG93bihATm9uTnVsbCBGaWxsRXZlbnRIaXN0b3J5LkV2ZW50IGV2ZW50LAorICAgICAgICAgICAgQE5vbk51bGwgU3RyaW5nIGRhdGFzZXRJZCkgeworICAgICAgICBhc3NlcnRGaWxsRXZlbnQoZXZlbnQsIFRZUEVfU0FWRV9TSE9XTiwgZGF0YXNldElkLCBudWxsLCBudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBc3NlcnRzIHRoZSBjb250ZW50IG9mIGEKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5zZXJ2aWNlLmF1dG9maWxsLkZpbGxFdmVudEhpc3RvcnkuRXZlbnQjVFlQRV9EQVRBU0VUX0FVVEhFTlRJQ0FUSU9OX1NFTEVDVEVEfQorICAgICAqIGV2ZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IGV2ZW50IHRvIGJlIGFzc2VydGVkCisgICAgICogQHBhcmFtIGRhdGFzZXRJZCBkYXRhc2V0IHNldCBpZCBleHBlY3RlZCBpbiB0aGUgZXZlbnQKKyAgICAgKiBAcGFyYW0ga2V5IHRoZSBvbmx5IGtleSBleHBlY3RlZCBpbiB0aGUgY2xpZW50IHN0YXRlIGJ1bmRsZQorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgb25seSB2YWx1ZSBleHBlY3RlZCBpbiB0aGUgY2xpZW50IHN0YXRlIGJ1bmRsZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRGaWxsRXZlbnRGb3JEYXRhc2V0QXV0aGVudGljYXRpb25TZWxlY3RlZCgKKyAgICAgICAgICAgIEBOb25OdWxsIEZpbGxFdmVudEhpc3RvcnkuRXZlbnQgZXZlbnQsCisgICAgICAgICAgICBATnVsbGFibGUgU3RyaW5nIGRhdGFzZXRJZCwgQE5vbk51bGwgU3RyaW5nIGtleSwgQE5vbk51bGwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIGFzc2VydEZpbGxFdmVudChldmVudCwgVFlQRV9EQVRBU0VUX0FVVEhFTlRJQ0FUSU9OX1NFTEVDVEVELCBkYXRhc2V0SWQsIGtleSwgdmFsdWUsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFzc2VydHMgdGhlIGNvbnRlbnQgb2YgYQorICAgICAqIHtAbGluayBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuRmlsbEV2ZW50SGlzdG9yeS5FdmVudCNUWVBFX0FVVEhFTlRJQ0FUSU9OX1NFTEVDVEVEfSBldmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBldmVudCB0byBiZSBhc3NlcnRlZAorICAgICAqIEBwYXJhbSBkYXRhc2V0SWQgZGF0YXNldCBzZXQgaWQgZXhwZWN0ZWQgaW4gdGhlIGV2ZW50CisgICAgICogQHBhcmFtIGtleSB0aGUgb25seSBrZXkgZXhwZWN0ZWQgaW4gdGhlIGNsaWVudCBzdGF0ZSBidW5kbGUKKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG9ubHkgdmFsdWUgZXhwZWN0ZWQgaW4gdGhlIGNsaWVudCBzdGF0ZSBidW5kbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0RmlsbEV2ZW50Rm9yQXV0aGVudGljYXRpb25TZWxlY3RlZCgKKyAgICAgICAgICAgIEBOb25OdWxsIEZpbGxFdmVudEhpc3RvcnkuRXZlbnQgZXZlbnQsCisgICAgICAgICAgICBATnVsbGFibGUgU3RyaW5nIGRhdGFzZXRJZCwgQE5vbk51bGwgU3RyaW5nIGtleSwgQE5vbk51bGwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIGFzc2VydEZpbGxFdmVudChldmVudCwgVFlQRV9BVVRIRU5USUNBVElPTl9TRUxFQ1RFRCwgZGF0YXNldElkLCBrZXksIHZhbHVlLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0RmlsbEV2ZW50Rm9yRmllbGRzQ2xhc3NpZmljYXRpb24oQE5vbk51bGwgRmlsbEV2ZW50SGlzdG9yeS5FdmVudCBldmVudCwKKyAgICAgICAgICAgIEBOb25OdWxsIEF1dG9maWxsSWQgZmllbGRJZCwgQE5vbk51bGwgU3RyaW5nIHJlbW90ZUlkLCBmbG9hdCBzY29yZSkgeworICAgICAgICBhc3NlcnRGaWxsRXZlbnQoZXZlbnQsIFRZUEVfQ09OVEVYVF9DT01NSVRURUQsIG51bGwsIG51bGwsIG51bGwsCisgICAgICAgICAgICAgICAgbmV3IEZpZWxkQ2xhc3NpZmljYXRpb25SZXN1bHRbXSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmllbGRDbGFzc2lmaWNhdGlvblJlc3VsdChmaWVsZElkLCByZW1vdGVJZCwgc2NvcmUpCisgICAgICAgICAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydEZpbGxFdmVudEZvckZpZWxkc0NsYXNzaWZpY2F0aW9uKEBOb25OdWxsIEZpbGxFdmVudEhpc3RvcnkuRXZlbnQgZXZlbnQsCisgICAgICAgICAgICBATm9uTnVsbCBGaWVsZENsYXNzaWZpY2F0aW9uUmVzdWx0W10gcmVzdWx0cykgeworICAgICAgICBhc3NlcnRGaWxsRXZlbnQoZXZlbnQsIFRZUEVfQ09OVEVYVF9DT01NSVRURUQsIG51bGwsIG51bGwsIG51bGwsIHJlc3VsdHMpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRGaWxsRXZlbnRGb3JDb250ZXh0Q29tbWl0dGVkKEBOb25OdWxsIEZpbGxFdmVudEhpc3RvcnkuRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgYXNzZXJ0RmlsbEV2ZW50KGV2ZW50LCBUWVBFX0NPTlRFWFRfQ09NTUlUVEVELCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICBATm9uTnVsbAorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFjdGl2aXR5TmFtZShMaXN0PEZpbGxDb250ZXh0PiBjb250ZXh0cykgeworICAgICAgICBpZiAoY29udGV4dHMgPT0gbnVsbCkgcmV0dXJuICJOL0EgKG51bGwgY29udGV4dHMpIjsKKworICAgICAgICBpZiAoY29udGV4dHMuaXNFbXB0eSgpKSByZXR1cm4gIk4vQSAoZW1wdHkgY29udGV4dHMpIjsKKworICAgICAgICBmaW5hbCBBc3Npc3RTdHJ1Y3R1cmUgc3RydWN0dXJlID0gY29udGV4dHMuZ2V0KGNvbnRleHRzLnNpemUoKSAtIDEpLmdldFN0cnVjdHVyZSgpOworICAgICAgICBpZiAoc3RydWN0dXJlID09IG51bGwpIHJldHVybiAiTi9BIChubyBBc3Npc3RTdHJ1Y3R1cmUpIjsKKworICAgICAgICBmaW5hbCBDb21wb25lbnROYW1lIGNvbXBvbmVudE5hbWUgPSBzdHJ1Y3R1cmUuZ2V0QWN0aXZpdHlDb21wb25lbnQoKTsKKyAgICAgICAgaWYgKGNvbXBvbmVudE5hbWUgPT0gbnVsbCkgcmV0dXJuICJOL0EgKG5vIGNvbXBvbmVudCBuYW1lKSI7CisKKyAgICAgICAgcmV0dXJuIGNvbXBvbmVudE5hbWUuZmxhdHRlblRvU2hvcnRTdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0RmxvYXQoZmxvYXQgYWN0dWFsVmFsdWUsIGZsb2F0IGV4cGVjdGVkVmFsdWUpIHsKKyAgICAgICAgYXNzZXJ0VGhhdChhY3R1YWxWYWx1ZSkuaXNXaXRoaW4oMS4wZS0xMGYpLm9mKGV4cGVjdGVkVmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRIYXNGbGFncyhpbnQgYWN0dWFsRmxhZ3MsIGludCBleHBlY3RlZEZsYWdzKSB7CisgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJGbGFncyAlcyBub3QgaW4gJXMiLCBleHBlY3RlZEZsYWdzLCBhY3R1YWxGbGFncykKKyAgICAgICAgICAgICAgICAudGhhdChhY3R1YWxGbGFncyAmIGV4cGVjdGVkRmxhZ3MpLmlzRXF1YWxUbyhleHBlY3RlZEZsYWdzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjYWxsYmFja0V2ZW50QXNTdHJpbmcoaW50IGV2ZW50KSB7CisgICAgICAgIHN3aXRjaCAoZXZlbnQpIHsKKyAgICAgICAgICAgIGNhc2UgQXV0b2ZpbGxDYWxsYmFjay5FVkVOVF9JTlBVVF9ISURERU46CisgICAgICAgICAgICAgICAgcmV0dXJuICJISURERU4iOworICAgICAgICAgICAgY2FzZSBBdXRvZmlsbENhbGxiYWNrLkVWRU5UX0lOUFVUX1NIT1dOOgorICAgICAgICAgICAgICAgIHJldHVybiAiU0hPV04iOworICAgICAgICAgICAgY2FzZSBBdXRvZmlsbENhbGxiYWNrLkVWRU5UX0lOUFVUX1VOQVZBSUxBQkxFOgorICAgICAgICAgICAgICAgIHJldHVybiAiVU5BVkFJTEFCTEUiOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIlVOS05PV046IiArIGV2ZW50OworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgaW1wb3J0YW50Rm9yQXV0b2ZpbGxBc1N0cmluZyhpbnQgbW9kZSkgeworICAgICAgICBzd2l0Y2ggKG1vZGUpIHsKKyAgICAgICAgICAgIGNhc2UgVmlldy5JTVBPUlRBTlRfRk9SX0FVVE9GSUxMX0FVVE86CisgICAgICAgICAgICAgICAgcmV0dXJuICJJTVBPUlRBTlRfRk9SX0FVVE9GSUxMX0FVVE8iOworICAgICAgICAgICAgY2FzZSBWaWV3LklNUE9SVEFOVF9GT1JfQVVUT0ZJTExfWUVTOgorICAgICAgICAgICAgICAgIHJldHVybiAiSU1QT1JUQU5UX0ZPUl9BVVRPRklMTF9ZRVMiOworICAgICAgICAgICAgY2FzZSBWaWV3LklNUE9SVEFOVF9GT1JfQVVUT0ZJTExfWUVTX0VYQ0xVREVfREVTQ0VOREFOVFM6CisgICAgICAgICAgICAgICAgcmV0dXJuICJJTVBPUlRBTlRfRk9SX0FVVE9GSUxMX1lFU19FWENMVURFX0RFU0NFTkRBTlRTIjsKKyAgICAgICAgICAgIGNhc2UgVmlldy5JTVBPUlRBTlRfRk9SX0FVVE9GSUxMX05POgorICAgICAgICAgICAgICAgIHJldHVybiAiSU1QT1JUQU5UX0ZPUl9BVVRPRklMTF9OTyI7CisgICAgICAgICAgICBjYXNlIFZpZXcuSU1QT1JUQU5UX0ZPUl9BVVRPRklMTF9OT19FWENMVURFX0RFU0NFTkRBTlRTOgorICAgICAgICAgICAgICAgIHJldHVybiAiSU1QT1JUQU5UX0ZPUl9BVVRPRklMTF9OT19FWENMVURFX0RFU0NFTkRBTlRTIjsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJVTktOT1dOOiIgKyBtb2RlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGhhc0hpbnQoQE51bGxhYmxlIFN0cmluZ1tdIGhpbnRzLCBATnVsbGFibGUgT2JqZWN0IGV4cGVjdGVkSGludCkgeworICAgICAgICBpZiAoaGludHMgPT0gbnVsbCB8fCBleHBlY3RlZEhpbnQgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOworICAgICAgICBmb3IgKFN0cmluZyBhY3R1YWxIaW50IDogaGludHMpIHsKKyAgICAgICAgICAgIGlmIChleHBlY3RlZEhpbnQuZXF1YWxzKGFjdHVhbEhpbnQpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNzZXJ0cyB0aGF0IDIgYml0bWFwcyBoYXZlIGFyZSB0aGUgc2FtZS4gSWYgdGhleSBhcmVuJ3QgdGhyb3dzIGFuIGV4Y2VwdGlvbiBhbmQgZHVtcCB0aGVtCisgICAgICogbG9jYWxseSBzbyB0aGVpciBjYW4gYmUgdmlzdWFsbHkgaW5zcGVjdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGVuYW1lIGJhc2UgbmFtZSBvZiB0aGUgZmlsZXMgZ2VuZXJhdGVkIGluIGNhc2Ugb2YgZXJyb3IKKyAgICAgKiBAcGFyYW0gYml0bWFwMSBmaXJzdCBiaXRtYXAgdG8gYmUgY29tcGFyZWQKKyAgICAgKiBAcGFyYW0gYml0bWFwMiBzZWNvbmQgYml0bWFwIHRvIGJlIGNvbXBhcmVkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydEJpdG1hcHNBcmVTYW1lKEBOb25OdWxsIFN0cmluZyBmaWxlbmFtZSwgQE51bGxhYmxlIEJpdG1hcCBiaXRtYXAxLAorICAgICAgICAgICAgQE51bGxhYmxlIEJpdG1hcCBiaXRtYXAyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiMXN0IGJpdG1hcCBpcyBudWxsIikudGhhdChiaXRtYXAxKS5pc05vdE51bGwoKTsKKyAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoIjJuZCBiaXRtYXAgaXMgbnVsbCIpLnRoYXQoYml0bWFwMikuaXNOb3ROdWxsKCk7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gc2FtZSA9IGJpdG1hcDEuc2FtZUFzKGJpdG1hcDIpOworICAgICAgICBpZiAoc2FtZSkgeworICAgICAgICAgICAgTG9nLnYoVEFHLCAiYml0bWFwIGNvbXBhcmlzb24gcGFzc2VkIGZvciAiICsgZmlsZW5hbWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgRmlsZSBkaXIgPSBuZXcgRmlsZShMT0NBTF9ESVJFQ1RPUlkpOworICAgICAgICBkaXIubWtkaXJzKCk7CisgICAgICAgIGlmICghZGlyLmV4aXN0cygpKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJDb3VsZCBub3QgY3JlYXRlIGRpcmVjdG9yeSAiICsgZGlyKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiYml0bWFwIGNvbXBhcmlzb24gZmFpbGVkIGZvciAiICsgZmlsZW5hbWUKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBhbmQgYml0bWFwcyBjb3VsZCBub3QgYmUgZHVtcGVkIG9uICIgKyBkaXIpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIEZpbGUgZHVtcDEgPSBkdW1wQml0bWFwKGJpdG1hcDEsIGRpciwgZmlsZW5hbWUgKyAiLTEucG5nIik7CisgICAgICAgIGZpbmFsIEZpbGUgZHVtcDIgPSBkdW1wQml0bWFwKGJpdG1hcDIsIGRpciwgZmlsZW5hbWUgKyAiLTIucG5nIik7CisgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigKKyAgICAgICAgICAgICAgICAiYml0bWFwIGNvbXBhcmlzb24gZmFpbGVkOyBjaGVjayBjb250ZW50cyBvZiAiICsgZHVtcDEgKyAiIGFuZCAiICsgZHVtcDIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFzc2VydHMgdGhhdCBhdXRvZmlsbCBpcyBlbmFibGVkIGluIHRoZSBjb250ZXh0LCByZXRyeWluZyBpZiBuZWNlc3Nhcml5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRBdXRvZmlsbEVuYWJsZWQoQE5vbk51bGwgQ29udGV4dCBjb250ZXh0LCBib29sZWFuIGV4cGVjdGVkKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIGFzc2VydEF1dG9maWxsRW5hYmxlZChjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQXV0b2ZpbGxNYW5hZ2VyLmNsYXNzKSwgZXhwZWN0ZWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFzc2VydHMgdGhhdCBhdXRvZmlsbCBpcyBlbmFibGVkIGluIHRoZSBtYW5hZ2VyLCByZXRyeWluZyBpZiBuZWNlc3Nhcml5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRBdXRvZmlsbEVuYWJsZWQoQE5vbk51bGwgQXV0b2ZpbGxNYW5hZ2VyIGFmbSwgYm9vbGVhbiBleHBlY3RlZCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBUaW1lb3V0cy5JRExFX1VOQklORF9USU1FT1VULnJ1bigiYXNzZXJ0RW5hYmxlZCgiICsgZXhwZWN0ZWQgKyAiKSIsICgpIC0+IHsKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYWN0dWFsID0gYWZtLmlzRW5hYmxlZCgpOworICAgICAgICAgICAgTG9nLnYoVEFHLCAiYXNzZXJ0RW5hYmxlZCgpOiBleHBlY3RlZD0iICsgZXhwZWN0ZWQgKyAiLCBhY3R1YWw9IiArIGFjdHVhbCk7CisgICAgICAgICAgICByZXR1cm4gYWN0dWFsID09IGV4cGVjdGVkID8gIm5vdF91c2VkIiA6IG51bGw7CisgICAgICAgICAgfSk7CisgICAgfQorCisgIEBOdWxsYWJsZQorICAgIHByaXZhdGUgc3RhdGljIEZpbGUgZHVtcEJpdG1hcChATm9uTnVsbCBCaXRtYXAgYml0bWFwLCBATm9uTnVsbCBGaWxlIGRpciwKKyAgICAgICAgICAgIEBOb25OdWxsIFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgRmlsZSBmaWxlID0gbmV3IEZpbGUoZGlyLCBmaWxlbmFtZSk7CisgICAgICAgIGlmIChmaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICBmaWxlLmRlbGV0ZSgpOworICAgICAgICB9CisgICAgICAgIGlmICghZmlsZS5jcmVhdGVOZXdGaWxlKCkpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkNvdWxkIG5vdCBjcmVhdGUgZmlsZSAiICsgZmlsZSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBMb2cuZChUQUcsICJEdW1waW5nIGJpdG1hcCBhdCAiICsgZmlsZSk7CisgICAgICAgIEJpdG1hcFV0aWxzLnNhdmVCaXRtYXAoYml0bWFwLCBmaWxlLmdldFBhcmVudCgpLCBmaWxlLmdldE5hbWUoKSk7CisgICAgICAgIHJldHVybiBmaWxlOwogICAgIH0KIAogICAgIHByaXZhdGUgSGVscGVyKCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNvbnRhaW4gc3RhdGljIG1ldGhvZHMgb25seSIpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBGaWVsZENsYXNzaWZpY2F0aW9uUmVzdWx0IHsKKyAgICAgICAgcHVibGljIGZpbmFsIEF1dG9maWxsSWQgaWQ7CisgICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmdbXSByZW1vdGVJZHM7CisgICAgICAgIHB1YmxpYyBmaW5hbCBmbG9hdFtdIHNjb3JlczsKKworICAgICAgICBGaWVsZENsYXNzaWZpY2F0aW9uUmVzdWx0KEBOb25OdWxsIEF1dG9maWxsSWQgaWQsIEBOb25OdWxsIFN0cmluZyByZW1vdGVJZCwgZmxvYXQgc2NvcmUpIHsKKyAgICAgICAgICAgIHRoaXMoaWQsIG5ldyBTdHJpbmdbXSB7IHJlbW90ZUlkIH0sIG5ldyBmbG9hdFtdIHsgc2NvcmUgfSk7CisgICAgICAgIH0KKworICAgICAgICBGaWVsZENsYXNzaWZpY2F0aW9uUmVzdWx0KEBOb25OdWxsIEF1dG9maWxsSWQgaWQsIEBOb25OdWxsIFN0cmluZ1tdIHJlbW90ZUlkcywKKyAgICAgICAgICAgICAgICBmbG9hdFtdIHNjb3JlcykgeworICAgICAgICAgICAgdGhpcy5pZCA9IGlkOworICAgICAgICAgICAgdGhpcy5yZW1vdGVJZHMgPSByZW1vdGVJZHM7CisgICAgICAgICAgICB0aGlzLnNjb3JlcyA9IHNjb3JlczsKKyAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0lkTW9kZS5qYXZhIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvSWRNb2RlLmphdmEKaW5kZXggMDE4NzhhYi4uNjZlODU3YiAxMDA2NDQKLS0tIGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvSWRNb2RlLmphdmEKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvSWRNb2RlLmphdmEKQEAgLTIxLDUgKzIxLDYgQEAKICAqLwogZW51bSBJZE1vZGUgewogICAgIFJFU09VUkNFX0lELAotICAgIEhUTUxfTkFNRQorICAgIEhUTUxfTkFNRSwKKyAgICBIVE1MX05BTUVfT1JfUkVTT1VSQ0VfSUQKIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0ltYWdlVHJhbnNmb3JtYXRpb25UZXN0LmphdmEgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9JbWFnZVRyYW5zZm9ybWF0aW9uVGVzdC5qYXZhCmluZGV4IGU5NmRmMDUuLmZjODJmZmQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0ltYWdlVHJhbnNmb3JtYXRpb25UZXN0LmphdmEKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvSW1hZ2VUcmFuc2Zvcm1hdGlvblRlc3QuamF2YQpAQCAtMjQsNDUgKzI0LDUzIEBACiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ud2hlbjsKIGltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0VGhyb3dzOwogCitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOwogaW1wb3J0IGFuZHJvaWQuc2VydmljZS5hdXRvZmlsbC5JbWFnZVRyYW5zZm9ybWF0aW9uOwogaW1wb3J0IGFuZHJvaWQuc2VydmljZS5hdXRvZmlsbC5WYWx1ZUZpbmRlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYXV0b2ZpbGwuQXV0b2ZpbGxJZDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3czsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKIGltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKIAogQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKK0BBcHBNb2RlRnVsbCAvLyBVbml0IHRlc3QKIHB1YmxpYyBjbGFzcyBJbWFnZVRyYW5zZm9ybWF0aW9uVGVzdCB7CiAKICAgICBAVGVzdAorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCiAgICAgcHVibGljIHZvaWQgdGVzdEFsbE51bGxCdWlsZGVyKCkgewogICAgICAgICBhc3NlcnRUaHJvd3MoTnVsbFBvaW50ZXJFeGNlcHRpb24uY2xhc3MsCiAgICAgICAgICAgICAgICAgKCkgLT4gIG5ldyBJbWFnZVRyYW5zZm9ybWF0aW9uLkJ1aWxkZXIobnVsbCwgbnVsbCwgMCkpOwogICAgIH0KIAogICAgIEBUZXN0CisgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0TnVsbEF1dG9maWxsSWRCdWlsZGVyKCkgewogICAgICAgICBhc3NlcnRUaHJvd3MoTnVsbFBvaW50ZXJFeGNlcHRpb24uY2xhc3MsCiAgICAgICAgICAgICAgICAgKCkgLT4gIG5ldyBJbWFnZVRyYW5zZm9ybWF0aW9uLkJ1aWxkZXIobnVsbCwgUGF0dGVybi5jb21waWxlKCIiKSwgMSkpOwogICAgIH0KIAogICAgIEBUZXN0CisgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0TnVsbFJlZ2V4QnVpbGRlcigpIHsKICAgICAgICAgYXNzZXJ0VGhyb3dzKE51bGxQb2ludGVyRXhjZXB0aW9uLmNsYXNzLAogICAgICAgICAgICAgICAgICgpIC0+ICBuZXcgSW1hZ2VUcmFuc2Zvcm1hdGlvbi5CdWlsZGVyKG5ldyBBdXRvZmlsbElkKDEpLCBudWxsLCAxKSk7CiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQogICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsU3Vic3RCdWlsZGVyKCkgewogICAgICAgICBhc3NlcnRUaHJvd3MoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzLAogICAgICAgICAgICAgICAgICgpIC0+ICBuZXcgSW1hZ2VUcmFuc2Zvcm1hdGlvbi5CdWlsZGVyKG5ldyBBdXRvZmlsbElkKDEpLCBQYXR0ZXJuLmNvbXBpbGUoIiIpLCAwKSk7CiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQogICAgIHB1YmxpYyB2b2lkIGZpZWxkQ2Fubm90QmVGb3VuZCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBBdXRvZmlsbElkIHVua25vd25JZCA9IG5ldyBBdXRvZmlsbElkKDQyKTsKIApAQCAtODIsNiArOTAsNyBAQAogICAgIH0KIAogICAgIEBUZXN0CisgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKICAgICBwdWJsaWMgdm9pZCB0aGVPbmVPcHRpb25zTWF0Y2hlcygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBBdXRvZmlsbElkIGlkID0gbmV3IEF1dG9maWxsSWQoMSk7CiAgICAgICAgIEltYWdlVHJhbnNmb3JtYXRpb24gdHJhbnMgPSBuZXcgSW1hZ2VUcmFuc2Zvcm1hdGlvbgpAQCAtOTksNiArMTA4LDI1IEBACiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0aGVPbmVPcHRpb25zTWF0Y2hlc1dpdGhDb250ZW50RGVzY3JpcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQXV0b2ZpbGxJZCBpZCA9IG5ldyBBdXRvZmlsbElkKDEpOworICAgICAgICBJbWFnZVRyYW5zZm9ybWF0aW9uIHRyYW5zID0gbmV3IEltYWdlVHJhbnNmb3JtYXRpb24KKyAgICAgICAgICAgICAgICAuQnVpbGRlcihpZCwgUGF0dGVybi5jb21waWxlKCIuKiIpLCA0MiwgIkFyZSB5b3UgY29udGVudD8iKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworCisgICAgICAgIFZhbHVlRmluZGVyIGZpbmRlciA9IG1vY2soVmFsdWVGaW5kZXIuY2xhc3MpOworICAgICAgICBSZW1vdGVWaWV3cyB0ZW1wbGF0ZSA9IG1vY2soUmVtb3RlVmlld3MuY2xhc3MpOworCisgICAgICAgIHdoZW4oZmluZGVyLmZpbmRCeUF1dG9maWxsSWQoaWQpKS50aGVuUmV0dXJuKCJ2YWwiKTsKKworICAgICAgICB0cmFucy5hcHBseShmaW5kZXIsIHRlbXBsYXRlLCAwKTsKKworICAgICAgICB2ZXJpZnkodGVtcGxhdGUpLnNldEltYWdlVmlld1Jlc291cmNlKDAsIDQyKTsKKyAgICAgICAgdmVyaWZ5KHRlbXBsYXRlKS5zZXRDb250ZW50RGVzY3JpcHRpb24oMCwgIkFyZSB5b3UgY29udGVudD8iKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCiAgICAgcHVibGljIHZvaWQgbm9PcHRpb25zTWF0Y2hlcygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBBdXRvZmlsbElkIGlkID0gbmV3IEF1dG9maWxsSWQoMSk7CiAgICAgICAgIEltYWdlVHJhbnNmb3JtYXRpb24gdHJhbnMgPSBuZXcgSW1hZ2VUcmFuc2Zvcm1hdGlvbgpAQCAtMTE2LDYgKzE0NCw3IEBACiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQogICAgIHB1YmxpYyB2b2lkIG11bHRpcGxlT3B0aW9uc09uZU1hdGNoZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgQXV0b2ZpbGxJZCBpZCA9IG5ldyBBdXRvZmlsbElkKDEpOwogICAgICAgICBJbWFnZVRyYW5zZm9ybWF0aW9uIHRyYW5zID0gbmV3IEltYWdlVHJhbnNmb3JtYXRpb24KQEAgLTEzNCw2ICsxNjMsMjYgQEAKICAgICB9CiAKICAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIG11bHRpcGxlT3B0aW9uc09uZU1hdGNoZXNXaXRoQ29udGVudERlc2NyaXB0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEF1dG9maWxsSWQgaWQgPSBuZXcgQXV0b2ZpbGxJZCgxKTsKKyAgICAgICAgSW1hZ2VUcmFuc2Zvcm1hdGlvbiB0cmFucyA9IG5ldyBJbWFnZVRyYW5zZm9ybWF0aW9uCisgICAgICAgICAgICAgICAgLkJ1aWxkZXIoaWQsIFBhdHRlcm4uY29tcGlsZSgiLioxIiksIDEsICJBcmUgeW91IGNvbnRlbnQ/IikKKyAgICAgICAgICAgICAgICAuYWRkT3B0aW9uKFBhdHRlcm4uY29tcGlsZSgiLioyIiksIDIsICJJIGFtIGNvbnRlbnQiKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworCisgICAgICAgIFZhbHVlRmluZGVyIGZpbmRlciA9IG1vY2soVmFsdWVGaW5kZXIuY2xhc3MpOworICAgICAgICBSZW1vdGVWaWV3cyB0ZW1wbGF0ZSA9IG1vY2soUmVtb3RlVmlld3MuY2xhc3MpOworCisgICAgICAgIHdoZW4oZmluZGVyLmZpbmRCeUF1dG9maWxsSWQoaWQpKS50aGVuUmV0dXJuKCJ2YWwtMiIpOworCisgICAgICAgIHRyYW5zLmFwcGx5KGZpbmRlciwgdGVtcGxhdGUsIDApOworCisgICAgICAgIHZlcmlmeSh0ZW1wbGF0ZSkuc2V0SW1hZ2VWaWV3UmVzb3VyY2UoMCwgMik7CisgICAgICAgIHZlcmlmeSh0ZW1wbGF0ZSkuc2V0Q29udGVudERlc2NyaXB0aW9uKDAsICJJIGFtIGNvbnRlbnQiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCiAgICAgcHVibGljIHZvaWQgdHdvT3B0aW9uc01hdGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEF1dG9maWxsSWQgaWQgPSBuZXcgQXV0b2ZpbGxJZCgxKTsKICAgICAgICAgSW1hZ2VUcmFuc2Zvcm1hdGlvbiB0cmFucyA9IG5ldyBJbWFnZVRyYW5zZm9ybWF0aW9uCkBAIC0xNTEsNCArMjAwLDI0IEBACiAgICAgICAgIC8vIElmIHR3byBvcHRpb25zIG1hdGNoLCB0aGUgZmlyc3Qgb25lIGlzIHBpY2tlZAogICAgICAgICB2ZXJpZnkodGVtcGxhdGUsIG9ubHkoKSkuc2V0SW1hZ2VWaWV3UmVzb3VyY2UoMCwgMSk7CiAgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0d29PcHRpb25zTWF0Y2hXaXRoQ29udGVudERlc2NyaXB0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEF1dG9maWxsSWQgaWQgPSBuZXcgQXV0b2ZpbGxJZCgxKTsKKyAgICAgICAgSW1hZ2VUcmFuc2Zvcm1hdGlvbiB0cmFucyA9IG5ldyBJbWFnZVRyYW5zZm9ybWF0aW9uCisgICAgICAgICAgICAgICAgLkJ1aWxkZXIoaWQsIFBhdHRlcm4uY29tcGlsZSgiLiphLioiKSwgMSwgIkFyZSB5b3UgY29udGVudD8iKQorICAgICAgICAgICAgICAgIC5hZGRPcHRpb24oUGF0dGVybi5jb21waWxlKCIuKmIuKiIpLCAyLCAiTm8sIEknbSBub3QiKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworCisgICAgICAgIFZhbHVlRmluZGVyIGZpbmRlciA9IG1vY2soVmFsdWVGaW5kZXIuY2xhc3MpOworICAgICAgICBSZW1vdGVWaWV3cyB0ZW1wbGF0ZSA9IG1vY2soUmVtb3RlVmlld3MuY2xhc3MpOworCisgICAgICAgIHdoZW4oZmluZGVyLmZpbmRCeUF1dG9maWxsSWQoaWQpKS50aGVuUmV0dXJuKCJhYiIpOworCisgICAgICAgIHRyYW5zLmFwcGx5KGZpbmRlciwgdGVtcGxhdGUsIDApOworCisgICAgICAgIC8vIElmIHR3byBvcHRpb25zIG1hdGNoLCB0aGUgZmlyc3Qgb25lIGlzIHBpY2tlZAorICAgICAgICB2ZXJpZnkodGVtcGxhdGUpLnNldEltYWdlVmlld1Jlc291cmNlKDAsIDEpOworICAgICAgICB2ZXJpZnkodGVtcGxhdGUpLnNldENvbnRlbnREZXNjcmlwdGlvbigwLCAiQXJlIHlvdSBjb250ZW50PyIpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0luaXRpYWxpemVkQ2hlY2tvdXRBY3Rpdml0eVRlc3QuamF2YSBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0luaXRpYWxpemVkQ2hlY2tvdXRBY3Rpdml0eVRlc3QuamF2YQppbmRleCAwN2M2N2ViOS4uYzk2YmJiYyAxMDA2NDQKLS0tIGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvSW5pdGlhbGl6ZWRDaGVja291dEFjdGl2aXR5VGVzdC5qYXZhCisrKyBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0luaXRpYWxpemVkQ2hlY2tvdXRBY3Rpdml0eVRlc3QuamF2YQpAQCAtMjgsNiArMjgsNyBAQAogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSGVscGVyLmZpbmROb2RlQnlSZXNvdXJjZUlkOwogCiBpbXBvcnQgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkluc3RydW1lbnRlZEF1dG9GaWxsU2VydmljZS5GaWxsUmVxdWVzdDsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CiAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwpAQCAtMzYsNiArMzcsNyBAQAogLyoqCiAgKiBUZXN0IGNhc2UgZm9yIGFuIGFjdGl2aXR5IGNvbnRhaW5pbmcgbm9uLVRleHRGaWVsZCB2aWV3cyB3aXRoIGluaXRpYWwgdmFsdWVzIHNldCBvbiBYTUwuCiAgKi8KK0BBcHBNb2RlRnVsbCAvLyBDaGVja291dEFjdGl2aXR5VGVzdCgpIGlzIGVub3VnaCB0byB0ZXN0IGVwaGVtZXJhbCBhcHBzIHN1cHBvcnQKIHB1YmxpYyBjbGFzcyBJbml0aWFsaXplZENoZWNrb3V0QWN0aXZpdHlUZXN0IGV4dGVuZHMgQXV0b0ZpbGxTZXJ2aWNlVGVzdENhc2UgewogCiAgICAgQFJ1bGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0luc3RydW1lbnRlZEF1dG9GaWxsU2VydmljZS5qYXZhIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvSW5zdHJ1bWVudGVkQXV0b0ZpbGxTZXJ2aWNlLmphdmEKaW5kZXggMzg1OTEzOC4uNmI0N2M5ZiAxMDA2NDQKLS0tIGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvSW5zdHJ1bWVudGVkQXV0b0ZpbGxTZXJ2aWNlLmphdmEKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvSW5zdHJ1bWVudGVkQXV0b0ZpbGxTZXJ2aWNlLmphdmEKQEAgLTE4LDI5ICsxOCwzNSBAQAogCiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5DYW5uZWRGaWxsUmVzcG9uc2UuUmVzcG9uc2VUeXBlLk5VTEw7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5DYW5uZWRGaWxsUmVzcG9uc2UuUmVzcG9uc2VUeXBlLlRJTUVPVVQ7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5IZWxwZXIuQ09OTkVDVElPTl9USU1FT1VUX01TOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSGVscGVyLkZJTExfVElNRU9VVF9NUzsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5JRExFX1VOQklORF9USU1FT1VUX01TOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSGVscGVyLlNBVkVfVElNRU9VVF9NUzsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5kdW1wQXV0b2ZpbGxTZXJ2aWNlOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSGVscGVyLmR1bXBTdHJ1Y3R1cmU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5IZWxwZXIuZ2V0QWN0aXZpdHlOYW1lOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuVGltZW91dHMuQ09OTkVDVElPTl9USU1FT1VUOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuVGltZW91dHMuRklMTF9FVkVOVFNfVElNRU9VVDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLlRpbWVvdXRzLkZJTExfVElNRU9VVDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLlRpbWVvdXRzLklETEVfVU5CSU5EX1RJTUVPVVQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5UaW1lb3V0cy5TQVZFX1RJTUVPVVQ7CiAKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24udHJ1dGguVHJ1dGguYXNzZXJ0V2l0aE1lc3NhZ2U7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLnRydXRoLlRydXRoLmFzc2VydFRoYXQ7CiAKIGltcG9ydCBhbmRyb2lkLmFwcC5hc3Npc3QuQXNzaXN0U3RydWN0dXJlOwogaW1wb3J0IGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5DYW5uZWRGaWxsUmVzcG9uc2UuQ2FubmVkRGF0YXNldDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50U2VuZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuQ2FuY2VsbGF0aW9uU2lnbmFsOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CiBpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLmF1dG9maWxsLkF1dG9maWxsU2VydmljZTsKIGltcG9ydCBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuRGF0YXNldDsKIGltcG9ydCBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuRmlsbENhbGxiYWNrOwogaW1wb3J0IGFuZHJvaWQuc2VydmljZS5hdXRvZmlsbC5GaWxsQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuRmlsbEV2ZW50SGlzdG9yeTsKK2ltcG9ydCBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuRmlsbEV2ZW50SGlzdG9yeS5FdmVudDsKIGltcG9ydCBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuRmlsbFJlc3BvbnNlOwogaW1wb3J0IGFuZHJvaWQuc2VydmljZS5hdXRvZmlsbC5TYXZlQ2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uTnVsbGFibGU7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAoraW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTnVsbGFibGU7CisKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkJsb2NraW5nUXVldWU7CkBAIC01Nyw0NCArNjMsMTE1IEBACiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX0NMQVNTID0gIkluc3RydW1lbnRlZEF1dG9GaWxsU2VydmljZSI7CiAKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfTkFNRSA9IFNFUlZJQ0VfUEFDS0FHRSArICIvLiIgKyBTRVJWSUNFX0NMQVNTOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIHNTZXJ2aWNlTGFiZWwgPSBTRVJWSUNFX0NMQVNTOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJJbnN0cnVtZW50ZWRBdXRvRmlsbFNlcnZpY2UiOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEVU1QX0ZJTExfUkVRVUVTVFMgPSBmYWxzZTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERVTVBfU0FWRV9SRVFVRVNUUyA9IGZhbHNlOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRFX0NPTk5FQ1RFRCA9ICJDT05ORUNURUQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFURV9ESVNDT05ORUNURUQgPSAiRElTQ09OTkVDVEVEIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEF0b21pY1JlZmVyZW5jZTxJbnN0cnVtZW50ZWRBdXRvRmlsbFNlcnZpY2U+IHNJbnN0YW5jZSA9CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBBdG9taWNSZWZlcmVuY2U8SW5zdHJ1bWVudGVkQXV0b0ZpbGxTZXJ2aWNlPiBzSW5zdGFuY2UgPQogICAgICAgICAgICAgbmV3IEF0b21pY1JlZmVyZW5jZTw+KCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVwbGllciBzUmVwbGllciA9IG5ldyBSZXBsaWVyKCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQmxvY2tpbmdRdWV1ZTxTdHJpbmc+IHNDb25uZWN0aW9uU3RhdGVzID0gbmV3IExpbmtlZEJsb2NraW5nUXVldWU8PigpOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IHNMb2NrID0gbmV3IE9iamVjdCgpOwogCi0gICAgLy8gQEd1YXJkZWRCeSgic0xvY2siKQorICAgIC8vIEBHdWFyZGVkQnkoInNMb2NrIikgLy8gTk9URTogbm90IHVzaW5nIGFubm90YXRpb24gYmVjYXVzZSBvZiBkZXBlbmRlbmNpZXMKICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHNJZ25vcmVVbmV4cGVjdGVkUmVxdWVzdHMgPSBmYWxzZTsKIAorICAgIC8vIEBHdWFyZGVkQnkoInNMb2NrIikgLy8gTk9URTogbm90IHVzaW5nIGFubm90YXRpb24gYmVjYXVzZSBvZiBkZXBlbmRlbmNpZXMKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHNDb25uZWN0ZWQ7CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBzU2VydmljZUxhYmVsID0gU0VSVklDRV9DTEFTUzsKKwogICAgIHB1YmxpYyBJbnN0cnVtZW50ZWRBdXRvRmlsbFNlcnZpY2UoKSB7CiAgICAgICAgIHNJbnN0YW5jZS5zZXQodGhpcyk7CisgICAgICAgIHNTZXJ2aWNlTGFiZWwgPSBTRVJWSUNFX0NMQVNTOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgQXV0b2ZpbGxTZXJ2aWNlIHBlZWtJbnN0YW5jZSgpIHsKKyAgICBwcml2YXRlIHN0YXRpYyBJbnN0cnVtZW50ZWRBdXRvRmlsbFNlcnZpY2UgcGVla0luc3RhbmNlKCkgewogICAgICAgICByZXR1cm4gc0luc3RhbmNlLmdldCgpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEdldHMgdGhlIGxpc3Qgb2YgZmlsbCBldmVudHMgaW4gdGhlIHtAbGluayBGaWxsRXZlbnRIaXN0b3J5fSwgd2FpdGluZyB1bnRpbCBpdCBoYXMgdGhlCisgICAgICogZXhwZWN0ZWQgc2l6ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8RXZlbnQ+IGdldEZpbGxFdmVudHMoaW50IGV4cGVjdGVkU2l6ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIExpc3Q8RXZlbnQ+IGV2ZW50cyA9IGdldEZpbGxFdmVudEhpc3RvcnkoZXhwZWN0ZWRTaXplKS5nZXRFdmVudHMoKTsKKyAgICAgICAgLy8gU2FuaXR5IGNoZWNrCisgICAgICAgIGlmIChleHBlY3RlZFNpemUgPiAwICYmIGV2ZW50cyA9PSBudWxsIHx8IGV2ZW50cy5zaXplKCkgIT0gZXhwZWN0ZWRTaXplKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJTlRFUk5BTCBFUlJPUjogZXZlbnRzIHNob3VsZCBoYXZlICIgKyBleHBlY3RlZFNpemUKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBidXQgaXQgaXM6ICIgKyBldmVudHMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBldmVudHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUge0BsaW5rIEZpbGxFdmVudEhpc3Rvcnl9LCB3YWl0aW5nIHVudGlsIGl0IGhhcyB0aGUgZXhwZWN0ZWQgc2l6ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEZpbGxFdmVudEhpc3RvcnkgZ2V0RmlsbEV2ZW50SGlzdG9yeShpbnQgZXhwZWN0ZWRTaXplKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgSW5zdHJ1bWVudGVkQXV0b0ZpbGxTZXJ2aWNlIHNlcnZpY2UgPSBwZWVrSW5zdGFuY2UoKTsKKworICAgICAgICBpZiAoZXhwZWN0ZWRTaXplID09IDApIHsKKyAgICAgICAgICAgIC8vIE5lZWQgdG8gYWx3YXlzIHNsZWVwIGFzIHRoZXJlIGlzIG5vIGNvbmRpdGlvbiAvIGNhbGxiYWNrIHRvIGJlIHVzZWQgdG8gd2FpdCB1bnRpbAorICAgICAgICAgICAgLy8gZXhwZWN0ZWQgbnVtYmVyIG9mIGV2ZW50cyBpcyBzZXQuCisgICAgICAgICAgICBTeXN0ZW1DbG9jay5zbGVlcChGSUxMX0VWRU5UU19USU1FT1VULm1zKCkpOworICAgICAgICAgICAgZmluYWwgRmlsbEV2ZW50SGlzdG9yeSBoaXN0b3J5ID0gc2VydmljZS5nZXRGaWxsRXZlbnRIaXN0b3J5KCk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGhpc3RvcnkuZ2V0RXZlbnRzKCkpLmlzTnVsbCgpOworICAgICAgICAgICAgcmV0dXJuIGhpc3Rvcnk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gRklMTF9FVkVOVFNfVElNRU9VVC5ydW4oImdldEZpbGxFdmVudHMoIiArIGV4cGVjdGVkU2l6ZSArICIpIiwgKCkgLT4geworICAgICAgICAgICAgZmluYWwgRmlsbEV2ZW50SGlzdG9yeSBoaXN0b3J5ID0gc2VydmljZS5nZXRGaWxsRXZlbnRIaXN0b3J5KCk7CisgICAgICAgICAgICBpZiAoaGlzdG9yeSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBMaXN0PEV2ZW50PiBldmVudHMgPSBoaXN0b3J5LmdldEV2ZW50cygpOworICAgICAgICAgICAgaWYgKGV2ZW50cyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGV2ZW50cy5zaXplKCkgIT0gZXhwZWN0ZWRTaXplKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgIkRpZG4ndCBnZXQgIiArIGV4cGVjdGVkU2l6ZSArICIgZXZlbnRzIHlldDogIiArIGV2ZW50cyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiRXZlbnRzIGlzIHN0aWxsIG51bGwgKGV4cGVjdGluZyAiICsgZXhwZWN0ZWRTaXplICsgIikiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBoaXN0b3J5OworICAgICAgICB9KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBc3NlcnRzIHRoZXJlIGlzIG5vIHtAbGluayBGaWxsRXZlbnRIaXN0b3J5fS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0Tm9GaWxsRXZlbnRIaXN0b3J5KCkgeworICAgICAgICAvLyBOZWVkIHRvIGFsd2F5cyBzbGVlcCBhcyB0aGVyZSBpcyBubyBjb25kaXRpb24gLyBjYWxsYmFjayB0byBiZSB1c2VkIHRvIHdhaXQgdW50aWwKKyAgICAgICAgLy8gZXhwZWN0ZWQgbnVtYmVyIG9mIGV2ZW50cyBpcyBzZXQuCisgICAgICAgIFN5c3RlbUNsb2NrLnNsZWVwKEZJTExfRVZFTlRTX1RJTUVPVVQubXMoKSk7CisgICAgICAgIGFzc2VydFRoYXQocGVla0luc3RhbmNlKCkuZ2V0RmlsbEV2ZW50SGlzdG9yeSgpKS5pc051bGwoKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHNlcnZpY2UgbGFiZWwgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNlcnZpY2VMYWJlbCgpIHsKKyAgICAgICAgcmV0dXJuIHNTZXJ2aWNlTGFiZWw7CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25Db25uZWN0ZWQoKSB7Ci0gICAgICAgIExvZy52KFRBRywgIm9uQ29ubmVjdGVkKCk6ICIgKyBzQ29ubmVjdGlvblN0YXRlcyk7Ci0gICAgICAgIHNDb25uZWN0aW9uU3RhdGVzLm9mZmVyKFNUQVRFX0NPTk5FQ1RFRCk7CisgICAgICAgIHN5bmNocm9uaXplZCAoc0xvY2spIHsKKyAgICAgICAgICAgIExvZy52KFRBRywgIm9uQ29ubmVjdGVkKCk6IGNvbm5lY3RlZD0iICsgc0Nvbm5lY3RlZCk7CisgICAgICAgICAgICBzQ29ubmVjdGVkID0gdHJ1ZTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG9uRGlzY29ubmVjdGVkKCkgewotICAgICAgICBMb2cudihUQUcsICJvbkRpc2Nvbm5lY3RlZCgpOiAiICsgc0Nvbm5lY3Rpb25TdGF0ZXMpOwotICAgICAgICBzQ29ubmVjdGlvblN0YXRlcy5vZmZlcihTVEFURV9ESVNDT05ORUNURUQpOworICAgICAgICBzeW5jaHJvbml6ZWQgKHNMb2NrKSB7CisgICAgICAgICAgICBMb2cudihUQUcsICJvbkRpc2Nvbm5lY3RlZCgpOiBjb25uZWN0ZWQ9IiArIHNDb25uZWN0ZWQpOworICAgICAgICAgICAgc0Nvbm5lY3RlZCA9IGZhbHNlOworICAgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xMjEsNyArMTk4LDE0IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHNSZXBsaWVyLm9uU2F2ZVJlcXVlc3QocmVxdWVzdC5nZXRGaWxsQ29udGV4dHMoKSwgcmVxdWVzdC5nZXRDbGllbnRTdGF0ZSgpLCBjYWxsYmFjayk7CisgICAgICAgIHNSZXBsaWVyLm9uU2F2ZVJlcXVlc3QocmVxdWVzdC5nZXRGaWxsQ29udGV4dHMoKSwgcmVxdWVzdC5nZXRDbGllbnRTdGF0ZSgpLCBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICByZXF1ZXN0LmdldERhdGFzZXRJZHMoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0Nvbm5lY3RlZCgpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChzTG9jaykgeworICAgICAgICAgICAgcmV0dXJuIHNDb25uZWN0ZWQ7CisgICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIGJvb2xlYW4gZnJvbVNhbWVQYWNrYWdlKExpc3Q8RmlsbENvbnRleHQ+IGNvbnRleHRzKSB7CkBAIC0xNTEsMTcgKzIzNSwxMyBAQAogICAgICAqIFdhaXRzIHVudGlsIHtAbGluayAjb25Db25uZWN0ZWQoKX0gaXMgY2FsbGVkLCBvciBmYWlscyBpZiBpdCB0aW1lcyBvdXQuCiAgICAgICoKICAgICAgKiA8cD5UaGlzIG1ldGhvZCBpcyB1c2VmdWwgb24gdGVzdHMgdGhhdCBleHBsaWNpdGx5IHZlcmlmaWVzIHRoZSBjb25uZWN0aW9uLCBidXQgc2hvdWxkIGJlCi0gICAgICogYXZvaWRlZCBpbiBvdGhlciB0ZXN0cywgYXMgaXQgYWRkcyBleHRyYSB0aW1lIHRvIHRoZSB0ZXN0IGV4ZWN1dGlvbiAtIGlmIGEgdGV4dCBuZWVkcyB0bwotICAgICAqIGJsb2NrIHVudGlsIHRoZSBzZXJ2aWNlIHJlY2VpdmVzIGEgY2FsbGJhY2ssIGl0IHNob3VsZCB1c2UKLSAgICAgKiB7QGxpbmsgUmVwbGllciNnZXROZXh0RmlsbFJlcXVlc3QoKX0gaW5zdGVhZC4KKyAgICAgKiBhdm9pZGVkIGluIG90aGVyIHRlc3RzLCBhcyBpdCBhZGRzIGV4dHJhIHRpbWUgdG8gdGhlIHRlc3QgZXhlY3V0aW9uIChhbmQgZmxha2luZXNzIGluIGNhc2VzCisgICAgICogd2hlcmUgdGhlIHNlcnZpY2UgbWlnaHQgaGF2ZSBiZWluZyBkaXNjb25uZWN0ZWQgYWxyZWFkeTsgZm9yIGV4YW1wbGUsIGlmIHRoZSBmaWxsIHJlcXVlc3QKKyAgICAgKiB3YXMgcmVwbGllZCB3aXRoIGEge0Bjb2RlIG51bGx9IHJlc3BvbnNlKSAtIGlmIGEgdGV4dCBuZWVkcyB0byBibG9jayB1bnRpbCB0aGUgc2VydmljZQorICAgICAqIHJlY2VpdmVzIGEgY2FsbGJhY2ssIGl0IHNob3VsZCB1c2Uge0BsaW5rIFJlcGxpZXIjZ2V0TmV4dEZpbGxSZXF1ZXN0KCl9IGluc3RlYWQuCiAgICAgICovCi0gICAgc3RhdGljIHZvaWQgd2FpdFVudGlsQ29ubmVjdGVkKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHN0YXRlID0gc0Nvbm5lY3Rpb25TdGF0ZXMucG9sbChDT05ORUNUSU9OX1RJTUVPVVRfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7Ci0gICAgICAgIGlmIChzdGF0ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBkdW1wQXV0b2ZpbGxTZXJ2aWNlKCk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUmV0cnlhYmxlRXhjZXB0aW9uKCJub3QgY29ubmVjdGVkIGluICVkIG1zIiwgQ09OTkVDVElPTl9USU1FT1VUX01TKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiSW52YWxpZCBjb25uZWN0aW9uIHN0YXRlIikudGhhdChzdGF0ZSkuaXNFcXVhbFRvKFNUQVRFX0NPTk5FQ1RFRCk7CisgICAgc3RhdGljIHZvaWQgd2FpdFVudGlsQ29ubmVjdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHdhaXRDb25uZWN0aW9uU3RhdGUoQ09OTkVDVElPTl9USU1FT1VULCB0cnVlKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE3MCwxMyArMjUwLDE0IEBACiAgICAgICogPHA+VGhpcyBtZXRob2QgaXMgdXNlZnVsIG9uIHRlc3RzIHRoYXQgZXhwbGljaXRseSB2ZXJpZmllcyB0aGUgY29ubmVjdGlvbiwgYnV0IHNob3VsZCBiZQogICAgICAqIGF2b2lkZWQgaW4gb3RoZXIgdGVzdHMsIGFzIGl0IGFkZHMgZXh0cmEgdGltZSB0byB0aGUgdGVzdCBleGVjdXRpb24uCiAgICAgICovCi0gICAgc3RhdGljIHZvaWQgd2FpdFVudGlsRGlzY29ubmVjdGVkKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHN0YXRlID0gc0Nvbm5lY3Rpb25TdGF0ZXMucG9sbCgyICogSURMRV9VTkJJTkRfVElNRU9VVF9NUywKLSAgICAgICAgICAgICAgICBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOwotICAgICAgICBpZiAoc3RhdGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJldHJ5YWJsZUV4Y2VwdGlvbigibm90IGRpc2Nvbm5lY3RlZCBpbiAlZCBtcyIsIElETEVfVU5CSU5EX1RJTUVPVVRfTVMpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJJbnZhbGlkIGNvbm5lY3Rpb24gc3RhdGUiKS50aGF0KHN0YXRlKS5pc0VxdWFsVG8oU1RBVEVfRElTQ09OTkVDVEVEKTsKKyAgICBzdGF0aWMgdm9pZCB3YWl0VW50aWxEaXNjb25uZWN0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgd2FpdENvbm5lY3Rpb25TdGF0ZShJRExFX1VOQklORF9USU1FT1VULCBmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB3YWl0Q29ubmVjdGlvblN0YXRlKFRpbWVvdXQgdGltZW91dCwgYm9vbGVhbiBleHBlY3RlZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRpbWVvdXQucnVuKCJ3YWl0IGZvciBjb25uZWN0ZWQ9IiArIGV4cGVjdGVkLCAgKCkgLT4geworICAgICAgICAgICAgcmV0dXJuIGlzQ29ubmVjdGVkKCkgPT0gZXhwZWN0ZWQgPyBCb29sZWFuLlRSVUUgOiBudWxsOworICAgICAgICB9KTsKICAgICB9CiAKICAgICAvKioKQEAgLTE4Nyw3ICsyNjgsOSBAQAogICAgIH0KIAogICAgIHN0YXRpYyB2b2lkIHJlc2V0U3RhdGljU3RhdGUoKSB7Ci0gICAgICAgIHNDb25uZWN0aW9uU3RhdGVzLmNsZWFyKCk7CisgICAgICAgIHNJbnN0YW5jZS5zZXQobnVsbCk7CisgICAgICAgIHNDb25uZWN0ZWQgPSBmYWxzZTsKKyAgICAgICAgc1NlcnZpY2VMYWJlbCA9IFNFUlZJQ0VfQ0xBU1M7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMTAsNyArMjkzLDEzIEBACiAgICAgICAgICAgICB0aGlzLmNhbmNlbGxhdGlvblNpZ25hbCA9IGNhbmNlbGxhdGlvblNpZ25hbDsKICAgICAgICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjazsKICAgICAgICAgICAgIHRoaXMuZmxhZ3MgPSBmbGFnczsKLSAgICAgICAgICAgIHN0cnVjdHVyZSA9IGNvbnRleHRzLmdldChjb250ZXh0cy5zaXplKCkgLSAxKS5nZXRTdHJ1Y3R1cmUoKTsKKyAgICAgICAgICAgIHRoaXMuc3RydWN0dXJlID0gY29udGV4dHMuZ2V0KGNvbnRleHRzLnNpemUoKSAtIDEpLmdldFN0cnVjdHVyZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIkZpbGxSZXF1ZXN0W2FjdGl2aXR5PSIgKyBnZXRBY3Rpdml0eU5hbWUoY29udGV4dHMpICsgIiwgZmxhZ3M9IiArIGZsYWdzCisgICAgICAgICAgICAgICAgICAgICsgIiwgYnVuZGxlPSIgKyBkYXRhICsgIiwgc3RydWN0dXJlPSIgKyBIZWxwZXIudG9TdHJpbmcoc3RydWN0dXJlKSArICJdIjsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjIwLDEyICszMDksMTQgQEAKICAgICAgKiB0aGF0IGNhbiBiZSBhc3NlcnRlZCBhdCB0aGUgZW5kIG9mIGEgdGVzdCBjYXNlLgogICAgICAqLwogICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBTYXZlUmVxdWVzdCB7Ci0gICAgICAgIGZpbmFsIExpc3Q8RmlsbENvbnRleHQ+IGNvbnRleHRzOwotICAgICAgICBmaW5hbCBBc3Npc3RTdHJ1Y3R1cmUgc3RydWN0dXJlOwotICAgICAgICBmaW5hbCBCdW5kbGUgZGF0YTsKLSAgICAgICAgZmluYWwgU2F2ZUNhbGxiYWNrIGNhbGxiYWNrOworICAgICAgICBwdWJsaWMgZmluYWwgTGlzdDxGaWxsQ29udGV4dD4gY29udGV4dHM7CisgICAgICAgIHB1YmxpYyBmaW5hbCBBc3Npc3RTdHJ1Y3R1cmUgc3RydWN0dXJlOworICAgICAgICBwdWJsaWMgZmluYWwgQnVuZGxlIGRhdGE7CisgICAgICAgIHB1YmxpYyBmaW5hbCBTYXZlQ2FsbGJhY2sgY2FsbGJhY2s7CisgICAgICAgIHB1YmxpYyBmaW5hbCBMaXN0PFN0cmluZz4gZGF0YXNldElkczsKIAotICAgICAgICBwcml2YXRlIFNhdmVSZXF1ZXN0KExpc3Q8RmlsbENvbnRleHQ+IGNvbnRleHRzLCBCdW5kbGUgZGF0YSwgU2F2ZUNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIHByaXZhdGUgU2F2ZVJlcXVlc3QoTGlzdDxGaWxsQ29udGV4dD4gY29udGV4dHMsIEJ1bmRsZSBkYXRhLCBTYXZlQ2FsbGJhY2sgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGRhdGFzZXRJZHMpIHsKICAgICAgICAgICAgIGlmIChjb250ZXh0cyAhPSBudWxsICYmIGNvbnRleHRzLnNpemUoKSA+IDApIHsKICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUgPSBjb250ZXh0cy5nZXQoY29udGV4dHMuc2l6ZSgpIC0gMSkuZ2V0U3RydWN0dXJlKCk7CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMjM0LDYgKzMyNSwxMiBAQAogICAgICAgICAgICAgdGhpcy5jb250ZXh0cyA9IGNvbnRleHRzOwogICAgICAgICAgICAgdGhpcy5kYXRhID0gZGF0YTsKICAgICAgICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICAgICAgICAgIHRoaXMuZGF0YXNldElkcyA9IGRhdGFzZXRJZHM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiU2F2ZVJlcXVlc3Q6IiArIGdldEFjdGl2aXR5TmFtZShjb250ZXh0cyk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI0OSwxMyArMzQ2LDE2IEBACiAgICAgICAgIHByaXZhdGUgZmluYWwgQmxvY2tpbmdRdWV1ZTxGaWxsUmVxdWVzdD4gbUZpbGxSZXF1ZXN0cyA9IG5ldyBMaW5rZWRCbG9ja2luZ1F1ZXVlPD4oKTsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBCbG9ja2luZ1F1ZXVlPFNhdmVSZXF1ZXN0PiBtU2F2ZVJlcXVlc3RzID0gbmV3IExpbmtlZEJsb2NraW5nUXVldWU8PigpOwogCi0gICAgICAgIHByaXZhdGUgTGlzdDxFeGNlcHRpb24+IG1FeGNlcHRpb25zOworICAgICAgICBwcml2YXRlIExpc3Q8VGhyb3dhYmxlPiBtRXhjZXB0aW9uczsKKyAgICAgICAgcHJpdmF0ZSBJbnRlbnRTZW5kZXIgbU9uU2F2ZUludGVudFNlbmRlcjsKICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbUFjY2VwdGVkUGFja2FnZU5hbWU7CiAKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1SZXBvcnRVbmhhbmRsZWRGaWxsUmVxdWVzdCA9IHRydWU7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtUmVwb3J0VW5oYW5kbGVkU2F2ZVJlcXVlc3QgPSB0cnVlOworCiAgICAgICAgIHByaXZhdGUgUmVwbGllcigpIHsKICAgICAgICAgfQogCi0KICAgICAgICAgcHJpdmF0ZSBJZE1vZGUgbUlkTW9kZSA9IElkTW9kZS5SRVNPVVJDRV9JRDsKIAogICAgICAgICBwdWJsaWMgdm9pZCBzZXRJZE1vZGUoSWRNb2RlIG1vZGUpIHsKQEAgLTI2OSwxMSArMzY5LDExIEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBHZXRzIHRoZSBleGNlcHRpb25zIHRocm93biBhc3luY2hyb25vdXNseSwgaWYgYW55LgogICAgICAgICAgKi8KLSAgICAgICAgQE51bGxhYmxlIExpc3Q8RXhjZXB0aW9uPiBnZXRFeGNlcHRpb25zKCkgeworICAgICAgICBATnVsbGFibGUgTGlzdDxUaHJvd2FibGU+IGdldEV4Y2VwdGlvbnMoKSB7CiAgICAgICAgICAgICByZXR1cm4gbUV4Y2VwdGlvbnM7CiAgICAgICAgIH0KIAotICAgICAgICBwcml2YXRlIHZvaWQgYWRkRXhjZXB0aW9uKEBOdWxsYWJsZSBFeGNlcHRpb24gZSkgeworICAgICAgICBwcml2YXRlIHZvaWQgYWRkRXhjZXB0aW9uKEBOdWxsYWJsZSBUaHJvd2FibGUgZSkgewogICAgICAgICAgICAgaWYgKGUgPT0gbnVsbCkgcmV0dXJuOwogCiAgICAgICAgICAgICBpZiAobUV4Y2VwdGlvbnMgPT0gbnVsbCkgewpAQCAtMzA0LDI3ICs0MDQsNjMgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSB7QGxpbmsgSW50ZW50U2VuZGVyfSB0aGF0IGlzIHBhc3NlZCB0bworICAgICAgICAgKiB7QGxpbmsgU2F2ZUNhbGxiYWNrI29uU3VjY2VzcyhJbnRlbnRTZW5kZXIpfS4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgc2V0T25TYXZlKEludGVudFNlbmRlciBpbnRlbnRTZW5kZXIpIHsKKyAgICAgICAgICAgIG1PblNhdmVJbnRlbnRTZW5kZXIgPSBpbnRlbnRTZW5kZXI7CisgICAgICAgIH0KKworICAgICAgICAvKioKICAgICAgICAgICogR2V0cyB0aGUgbmV4dCBmaWxsIHJlcXVlc3QsIGluIHRoZSBvcmRlciByZWNlaXZlZC4KICAgICAgICAgICoKICAgICAgICAgICogPHA+VHlwaWNhbGx5IGNhbGxlZCBhdCB0aGUgZW5kIG9mIGEgdGVzdCBjYXNlLCB0byBhc3NlcnQgdGhlIGluaXRpYWwgcmVxdWVzdC4KICAgICAgICAgICovCi0gICAgICAgIEZpbGxSZXF1ZXN0IGdldE5leHRGaWxsUmVxdWVzdCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBmaW5hbCBGaWxsUmVxdWVzdCByZXF1ZXN0ID0gbUZpbGxSZXF1ZXN0cy5wb2xsKEZJTExfVElNRU9VVF9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgRmlsbFJlcXVlc3QgZ2V0TmV4dEZpbGxSZXF1ZXN0KCkgeworICAgICAgICAgICAgRmlsbFJlcXVlc3QgcmVxdWVzdDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmVxdWVzdCA9IG1GaWxsUmVxdWVzdHMucG9sbChGSUxMX1RJTUVPVVQubXMoKSwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkludGVycnVwdGVkIiwgZSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAocmVxdWVzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJldHJ5YWJsZUV4Y2VwdGlvbigib25GaWxsUmVxdWVzdCgpIG5vdCBjYWxsZWQgaW4gJXMgbXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgRklMTF9USU1FT1VUX01TKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmV0cnlhYmxlRXhjZXB0aW9uKEZJTExfVElNRU9VVCwgIm9uRmlsbFJlcXVlc3QoKSBub3QgY2FsbGVkIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gcmVxdWVzdDsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBBc3NlcnRzIHRoZSB0b3RhbCBudW1iZXIgb2Yge0BsaW5rIEF1dG9maWxsU2VydmljZSNvbkZpbGxSZXF1ZXN0KAotICAgICAgICAgKiBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuRmlsbFJlcXVlc3QsICBDYW5jZWxsYXRpb25TaWduYWwsIEZpbGxDYWxsYmFjayl9LCBtaW51cyB0aG9zZQotICAgICAgICAgKiByZXR1cm5lZCBieSB7QGxpbmsgI2dldE5leHRGaWxsUmVxdWVzdCgpfS4KKyAgICAgICAgICogQXNzZXJ0cyB0aGF0IHtAbGluayAjb25GaWxsUmVxdWVzdChMaXN0LCBCdW5kbGUsIENhbmNlbGxhdGlvblNpZ25hbCwgRmlsbENhbGxiYWNrLCBpbnQpfQorICAgICAgICAgKiB3YXMgbm90IGNhbGxlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogPHA+U2hvdWxkIG9ubHkgYmUgY2FsbGVkIGluIGNhc2VzIHdoZXJlIGl0J3Mgbm90IGV4cGVjdGVkIHRvIGJlIGNhbGxlZCwgYXMgaXQgd2lsbAorICAgICAgICAgKiBzbGVlcCBmb3IgYSBmZXcgbXMuCiAgICAgICAgICAqLwotICAgICAgICB2b2lkIGFzc2VydE51bWJlclVuaGFuZGxlZEZpbGxSZXF1ZXN0cyhpbnQgZXhwZWN0ZWQpIHsKLSAgICAgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJJbnZhbGlkIG51bWJlciBvZiBmaWxsIHJlcXVlc3RzIikudGhhdChtRmlsbFJlcXVlc3RzLnNpemUoKSkKLSAgICAgICAgICAgICAgICAgICAgLmlzRXF1YWxUbyhleHBlY3RlZCk7CisgICAgICAgIHZvaWQgYXNzZXJ0T25GaWxsUmVxdWVzdE5vdENhbGxlZCgpIHsKKyAgICAgICAgICAgIFN5c3RlbUNsb2NrLnNsZWVwKEZJTExfVElNRU9VVC5nZXRNYXhWYWx1ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQobUZpbGxSZXF1ZXN0cykuaXNFbXB0eSgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFzc2VydHMgYWxsIHtAbGluayBBdXRvZmlsbFNlcnZpY2Ujb25GaWxsUmVxdWVzdCgKKyAgICAgICAgICogYW5kcm9pZC5zZXJ2aWNlLmF1dG9maWxsLkZpbGxSZXF1ZXN0LCAgQ2FuY2VsbGF0aW9uU2lnbmFsLCBGaWxsQ2FsbGJhY2spIGZpbGwgcmVxdWVzdHN9CisgICAgICAgICAqIHJlY2VpdmVkIGJ5IHRoZSBzZXJ2aWNlIHdlcmUgcHJvcGVybHkge0BsaW5rICNnZXROZXh0RmlsbFJlcXVlc3QoKSBoYW5kbGVkfSBieSB0aGUgdGVzdAorICAgICAgICAgKiBjYXNlLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBhc3NlcnROb1VuaGFuZGxlZEZpbGxSZXF1ZXN0cygpIHsKKyAgICAgICAgICAgIGlmIChtRmlsbFJlcXVlc3RzLmlzRW1wdHkoKSkgcmV0dXJuOyAvLyBHb29kIGpvYiwgdGVzdCBjYXNlIQorCisgICAgICAgICAgICBpZiAoIW1SZXBvcnRVbmhhbmRsZWRGaWxsUmVxdWVzdCkgeworICAgICAgICAgICAgICAgIC8vIEp1c3QgbG9nLCBzbyBpdCdzIG5vdCB0aHJvd24gYWdhaW4gb24gQEFmdGVyIGlmIGFscmVhZHkgdGhyb3duIG9uIG1haW4gYm9keQorICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImFzc2VydE5vVW5oYW5kbGVkRmlsbFJlcXVlc3RzKCk6IGFscmVhZHkgcmVwb3J0ZWQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgImJ1dCBsb2dnaW5nIGp1c3QgaW4gY2FzZTogIiArIG1GaWxsUmVxdWVzdHMpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVJlcG9ydFVuaGFuZGxlZEZpbGxSZXF1ZXN0ID0gZmFsc2U7CisgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IobUZpbGxSZXF1ZXN0cy5zaXplKCkgKyAiIHVuaGFuZGxlZCBmaWxsIHJlcXVlc3RzOiAiCisgICAgICAgICAgICAgICAgICAgICsgbUZpbGxSZXF1ZXN0cyk7CiAgICAgICAgIH0KIAogICAgICAgICAvKioKQEAgLTMzOSwyMyArNDc1LDM5IEBACiAgICAgICAgICAqCiAgICAgICAgICAqIDxwPlR5cGljYWxseSBjYWxsZWQgYXQgdGhlIGVuZCBvZiBhIHRlc3QgY2FzZSwgdG8gYXNzZXJ0IHRoZSBpbml0aWFsIHJlcXVlc3QuCiAgICAgICAgICAqLwotICAgICAgICBTYXZlUmVxdWVzdCBnZXROZXh0U2F2ZVJlcXVlc3QoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotICAgICAgICAgICAgZmluYWwgU2F2ZVJlcXVlc3QgcmVxdWVzdCA9IG1TYXZlUmVxdWVzdHMucG9sbChTQVZFX1RJTUVPVVRfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgIFNhdmVSZXF1ZXN0IGdldE5leHRTYXZlUmVxdWVzdCgpIHsKKyAgICAgICAgICAgIFNhdmVSZXF1ZXN0IHJlcXVlc3Q7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJlcXVlc3QgPSBtU2F2ZVJlcXVlc3RzLnBvbGwoU0FWRV9USU1FT1VULm1zKCksIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJbnRlcnJ1cHRlZCIsIGUpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHJlcXVlc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZXRyeWFibGVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAib25TYXZlUmVxdWVzdCgpIG5vdCBjYWxsZWQgaW4gJWQgbXMiLCBTQVZFX1RJTUVPVVRfTVMpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZXRyeWFibGVFeGNlcHRpb24oU0FWRV9USU1FT1VULCAib25TYXZlUmVxdWVzdCgpIG5vdCBjYWxsZWQiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiByZXF1ZXN0OwogICAgICAgICB9CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIEFzc2VydHMgdGhlIHRvdGFsIG51bWJlciBvZgotICAgICAgICAgKiB7QGxpbmsgQXV0b2ZpbGxTZXJ2aWNlI29uU2F2ZVJlcXVlc3QoYW5kcm9pZC5zZXJ2aWNlLmF1dG9maWxsLlNhdmVSZXF1ZXN0LCBTYXZlQ2FsbGJhY2spfQotICAgICAgICAgKiBtaW51cyB0aG9zZSByZXR1cm5lZCBieSB7QGxpbmsgI2dldE5leHRTYXZlUmVxdWVzdCgpfS4KKyAgICAgICAgICogQXNzZXJ0cyBhbGwKKyAgICAgICAgICoge0BsaW5rIEF1dG9maWxsU2VydmljZSNvblNhdmVSZXF1ZXN0KGFuZHJvaWQuc2VydmljZS5hdXRvZmlsbC5TYXZlUmVxdWVzdCwgU2F2ZUNhbGxiYWNrKQorICAgICAgICAgKiBzYXZlIHJlcXVlc3RzfSByZWNlaXZlZCBieSB0aGUgc2VydmljZSB3ZXJlIHByb3Blcmx5CisgICAgICAgICAqIHtAbGluayAjZ2V0TmV4dEZpbGxSZXF1ZXN0KCkgaGFuZGxlZH0gYnkgdGhlIHRlc3QgY2FzZS4KICAgICAgICAgICovCi0gICAgICAgIHZvaWQgYXNzZXJ0TnVtYmVyVW5oYW5kbGVkU2F2ZVJlcXVlc3RzKGludCBleHBlY3RlZCkgewotICAgICAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoIkludmFsaWQgbnVtYmVyIG9mIHNhdmUgcmVxdWVzdHMiKS50aGF0KG1TYXZlUmVxdWVzdHMuc2l6ZSgpKQotICAgICAgICAgICAgICAgICAgICAuaXNFcXVhbFRvKGV4cGVjdGVkKTsKKyAgICAgICAgdm9pZCBhc3NlcnROb1VuaGFuZGxlZFNhdmVSZXF1ZXN0cygpIHsKKyAgICAgICAgICAgIGlmIChtU2F2ZVJlcXVlc3RzLmlzRW1wdHkoKSkgcmV0dXJuOyAvLyBHb29kIGpvYiwgdGVzdCBjYXNlIQorCisgICAgICAgICAgICBpZiAoIW1SZXBvcnRVbmhhbmRsZWRTYXZlUmVxdWVzdCkgeworICAgICAgICAgICAgICAgIC8vIEp1c3QgbG9nLCBzbyBpdCdzIG5vdCB0aHJvd24gYWdhaW4gb24gQEFmdGVyIGlmIGFscmVhZHkgdGhyb3duIG9uIG1haW4gYm9keQorICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImFzc2VydE5vVW5oYW5kbGVkU2F2ZVJlcXVlc3RzKCk6IGFscmVhZHkgcmVwb3J0ZWQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgImJ1dCBsb2dnaW5nIGp1c3QgaW4gY2FzZTogIiArIG1TYXZlUmVxdWVzdHMpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVJlcG9ydFVuaGFuZGxlZFNhdmVSZXF1ZXN0ID0gZmFsc2U7CisgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IobVNhdmVSZXF1ZXN0cy5zaXplKCkgKyAiIHVuaGFuZGxlZCBzYXZlIHJlcXVlc3RzOiAiCisgICAgICAgICAgICAgICAgICAgICsgbVNhdmVSZXF1ZXN0cyk7CiAgICAgICAgIH0KIAogICAgICAgICAvKioKQEAgLTM2Niw3ICs1MTgsMTAgQEAKICAgICAgICAgICAgIG1GaWxsUmVxdWVzdHMuY2xlYXIoKTsKICAgICAgICAgICAgIG1TYXZlUmVxdWVzdHMuY2xlYXIoKTsKICAgICAgICAgICAgIG1FeGNlcHRpb25zID0gbnVsbDsKKyAgICAgICAgICAgIG1PblNhdmVJbnRlbnRTZW5kZXIgPSBudWxsOwogICAgICAgICAgICAgbUFjY2VwdGVkUGFja2FnZU5hbWUgPSBudWxsOworICAgICAgICAgICAgbVJlcG9ydFVuaGFuZGxlZEZpbGxSZXF1ZXN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIG1SZXBvcnRVbmhhbmRsZWRTYXZlUmVxdWVzdCA9IHRydWU7CiAgICAgICAgIH0KIAogICAgICAgICBwcml2YXRlIHZvaWQgb25GaWxsUmVxdWVzdChMaXN0PEZpbGxDb250ZXh0PiBjb250ZXh0cywgQnVuZGxlIGRhdGEsCkBAIC0zNzQsNyArNTI5LDcgQEAKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgQ2FubmVkRmlsbFJlc3BvbnNlIHJlc3BvbnNlID0gbnVsbDsKICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IG1SZXNwb25zZXMucG9sbChDT05ORUNUSU9OX1RJTUVPVVRfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gbVJlc3BvbnNlcy5wb2xsKENPTk5FQ1RJT05fVElNRU9VVC5tcygpLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOwogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiSW50ZXJydXB0ZWQgZ2V0dGluZyBDYW5uZWRSZXNwb25zZTogIiArIGUpOwogICAgICAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOwpAQCAtMzgyLDkgKzUzNywxMCBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cgPSAib25GaWxsUmVxdWVzdCgpIHJlY2VpdmVkIHdoZW4gbm8gQ2FubmVkUmVzcG9uc2Ugd2FzIHNldCI7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBhY3Rpdml0eU5hbWUgPSBnZXRBY3Rpdml0eU5hbWUoY29udGV4dHMpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnID0gIm9uRmlsbFJlcXVlc3QoKSBmb3IgYWN0aXZpdHkgIiArIGFjdGl2aXR5TmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiByZWNlaXZlZCB3aGVuIG5vIGNhbm5lZCByZXNwb25zZSB3YXMgc2V0LiI7CiAgICAgICAgICAgICAgICAgICAgIGR1bXBTdHJ1Y3R1cmUobXNnLCBjb250ZXh0cyk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZEV4Y2VwdGlvbihuZXcgUmV0cnlhYmxlRXhjZXB0aW9uKG1zZykpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5nZXRSZXNwb25zZVR5cGUoKSA9PSBOVUxMKSB7CkBAIC00MTYsMjQgKzU3MiwzMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZmlsbFJlc3BvbnNlID0gcmVzcG9uc2UuYXNGaWxsUmVzcG9uc2UoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuYW1lKSAtPiBIZWxwZXIuZmluZE5vZGVCeUh0bWxOYW1lKGNvbnRleHRzLCBuYW1lKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBIVE1MX05BTUVfT1JfUkVTT1VSQ0VfSUQ6CisgICAgICAgICAgICAgICAgICAgICAgICBmaWxsUmVzcG9uc2UgPSByZXNwb25zZS5hc0ZpbGxSZXNwb25zZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlkKSAtPiBIZWxwZXIuZmluZE5vZGVCeUh0bWxOYW1lT3JSZXNvdXJjZUlkKGNvbnRleHRzLCBpZCkpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVbmtub3duIGlkIG1vZGU6ICIgKyBtSWRNb2RlKTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJvbkZpbGxSZXF1ZXN0KCk6IGZpbGxSZXNwb25zZSA9ICIgKyBmaWxsUmVzcG9uc2UpOwogICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uU3VjY2VzcyhmaWxsUmVzcG9uc2UpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBhZGRFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIGFkZEV4Y2VwdGlvbih0KTsKICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgbUZpbGxSZXF1ZXN0cy5vZmZlcihuZXcgRmlsbFJlcXVlc3QoY29udGV4dHMsIGRhdGEsIGNhbmNlbGxhdGlvblNpZ25hbCwgY2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncykpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIG9uU2F2ZVJlcXVlc3QoTGlzdDxGaWxsQ29udGV4dD4gY29udGV4dHMsIEJ1bmRsZSBkYXRhLCBTYXZlQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIm9uU2F2ZVJlcXVlc3QoKSIpOwotICAgICAgICAgICAgbVNhdmVSZXF1ZXN0cy5vZmZlcihuZXcgU2F2ZVJlcXVlc3QoY29udGV4dHMsIGRhdGEsIGNhbGxiYWNrKSk7Ci0gICAgICAgICAgICBjYWxsYmFjay5vblN1Y2Nlc3MoKTsKKyAgICAgICAgcHJpdmF0ZSB2b2lkIG9uU2F2ZVJlcXVlc3QoTGlzdDxGaWxsQ29udGV4dD4gY29udGV4dHMsIEJ1bmRsZSBkYXRhLCBTYXZlQ2FsbGJhY2sgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGRhdGFzZXRJZHMpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIm9uU2F2ZVJlcXVlc3QoKTogc2VuZGVyPSIgKyBtT25TYXZlSW50ZW50U2VuZGVyKTsKKyAgICAgICAgICAgIG1TYXZlUmVxdWVzdHMub2ZmZXIobmV3IFNhdmVSZXF1ZXN0KGNvbnRleHRzLCBkYXRhLCBjYWxsYmFjaywgZGF0YXNldElkcykpOworICAgICAgICAgICAgaWYgKG1PblNhdmVJbnRlbnRTZW5kZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uU3VjY2VzcyhtT25TYXZlSW50ZW50U2VuZGVyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY2FsbGJhY2sub25TdWNjZXNzKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9JbnN0cnVtZW50ZWRBdXRvRmlsbFNlcnZpY2VDb21wYXRNb2RlLmphdmEgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9JbnN0cnVtZW50ZWRBdXRvRmlsbFNlcnZpY2VDb21wYXRNb2RlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFjMmE0NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0luc3RydW1lbnRlZEF1dG9GaWxsU2VydmljZUNvbXBhdE1vZGUuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHM7CitpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLmF1dG9maWxsLkF1dG9maWxsU2VydmljZTsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgQXV0b2ZpbGxTZXJ2aWNlfSB1c2luZyBBMTFZIGNvbXBhdCBtb2RlIHVzZWQgaW4gdGhlIHRlc3RzLgorICovCitwdWJsaWMgY2xhc3MgSW5zdHJ1bWVudGVkQXV0b0ZpbGxTZXJ2aWNlQ29tcGF0TW9kZSBleHRlbmRzIEluc3RydW1lbnRlZEF1dG9GaWxsU2VydmljZSB7CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygiaGlkaW5nIikKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfUEFDS0FHRSA9ICJhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMiOworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJoaWRpbmciKQorICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9DTEFTUyA9ICJJbnN0cnVtZW50ZWRBdXRvRmlsbFNlcnZpY2VDb21wYXRNb2RlIjsKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygiaGlkaW5nIikKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfTkFNRSA9IFNFUlZJQ0VfUEFDS0FHRSArICIvLiIgKyBTRVJWSUNFX0NMQVNTOworCisgICAgcHVibGljIEluc3RydW1lbnRlZEF1dG9GaWxsU2VydmljZUNvbXBhdE1vZGUoKSB7CisgICAgICAgIHNJbnN0YW5jZS5zZXQodGhpcyk7CisgICAgICAgIHNTZXJ2aWNlTGFiZWwgPSBTRVJWSUNFX0NMQVNTOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0pVbml0SGVscGVyLmphdmEgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9KVW5pdEhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4ZTFmZGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9KVW5pdEhlbHBlci5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0czsKKworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTm9uTnVsbDsKKworLyoqCisgKiBHZW5lcmljIGhlbHBlciBmb3IgSlVuaXQgbmVlZHMuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBKVW5pdEhlbHBlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc0N1cnJlbnRUZXN0TmFtZXI7CisKKyAgICBATm9uTnVsbAorICAgIHN0YXRpYyBTdHJpbmcgZ2V0Q3VycmVudFRlc3ROYW1lKCkgeworICAgICAgICByZXR1cm4gc0N1cnJlbnRUZXN0TmFtZXIgIT0gbnVsbCA/IHNDdXJyZW50VGVzdE5hbWVyIDogIk4vQSI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEN1cnJlbnRUZXN0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICBzQ3VycmVudFRlc3ROYW1lciA9IG5hbWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBKVW5pdEhlbHBlcigpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjb250YWluIHN0YXRpYyBtZXRob2RzIG9ubHkiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9Mb2dpbkFjdGl2aXR5LmphdmEgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9Mb2dpbkFjdGl2aXR5LmphdmEKaW5kZXggYjQxY2VmOC4uN2VhNTJkMiAxMDA2NDQKLS0tIGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvTG9naW5BY3Rpdml0eS5qYXZhCisrKyBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0xvZ2luQWN0aXZpdHkuamF2YQpAQCAtMjIsNiArMjIsOSBAQAogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuT25DbGlja0xpc3RlbmVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dE1ldGhvZE1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOwpAQCAtOTksNiArMTAyLDQyIEBACiAgICAgICAgICAgICBnZXRBdXRvZmlsbE1hbmFnZXIoKS5jYW5jZWwoKTsKICAgICAgICAgfSk7CiAgICAgICAgIG1DYW5jZWxCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKChPbkNsaWNrTGlzdGVuZXIpIHYgLT4gZmluaXNoKCkpOworCisgICAgICAgIC8vIENyZWF0ZSBhIGN1c3RvbSBpbnNlcnRpb24gY2FsbGJhY2sgc28gaXQganVzdCBzaG93IHRoZSBBVVRPRklMTCBpdGVtLCBvdGhlcndpc2UgQ1RTCisgICAgICAgIC8vIHRlc3RBdXRvZmlsbE1hbnVhbGx5T25lRGF0YXNldCgpIHdpbGwgZmFpbCBpZiBhIHByZXZpb3VzIHRlc3Qgc2V0IHRoZSBjbGlwYm9hcmQKKyAgICAgICAgLy8gVE9ETyhiLzcxNzExMTIyKTogcmVtb3ZlIG9uY2UgdGhlcmUncyBhIHByb3BlciB3YXkgdG8gcmVzZXQgdGhlIGNsaXBib2FyZAorICAgICAgICBtVXNlcm5hbWVFZGl0VGV4dC5zZXRDdXN0b21JbnNlcnRpb25BY3Rpb25Nb2RlQ2FsbGJhY2sobmV3IEFjdGlvbk1vZGUuQ2FsbGJhY2soKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gb25QcmVwYXJlQWN0aW9uTW9kZShBY3Rpb25Nb2RlIG1vZGUsIE1lbnUgbWVudSkgeworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBhdXRvZmlsbFRpdGxlID0gQXV0b0ZpbGxTZXJ2aWNlVGVzdENhc2Uuc0RlZmF1bHRVaUJvdAorICAgICAgICAgICAgICAgICAgICAgICAgLmdldEF1dG9maWxsQ29udGV4dHVhbE1lbnVUaXRsZSgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVudS5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZW51SXRlbSBpdGVtID0gbWVudS5nZXRJdGVtKGkpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdGl0bGUgPSBpdGVtLmdldFRpdGxlKCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCF0aXRsZS5lcXVhbHMoYXV0b2ZpbGxUaXRsZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgIm9uUHJlcGFyZUFjdGlvbk1vZGUoKTogaWdub3JpbmcgIiArIHRpdGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbnUucmVtb3ZlSXRlbShpdGVtLmdldEl0ZW1JZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3lBY3Rpb25Nb2RlKEFjdGlvbk1vZGUgbW9kZSkgeworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gb25DcmVhdGVBY3Rpb25Nb2RlKEFjdGlvbk1vZGUgbW9kZSwgTWVudSBtZW51KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gb25BY3Rpb25JdGVtQ2xpY2tlZChBY3Rpb25Nb2RlIG1vZGUsIE1lbnVJdGVtIGl0ZW0pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOwogICAgIH0KIAogICAgIHByb3RlY3RlZCBpbnQgZ2V0Q29udGVudFZpZXcoKSB7CkBAIC0xOTUsNiArMjM0LDEwIEBACiAgICAgICAgIHN5bmNSdW5PblVpVGhyZWFkKCgpIC0+IGdldEF1dG9maWxsTWFuYWdlcigpLnJlcXVlc3RBdXRvZmlsbChtVXNlcm5hbWVFZGl0VGV4dCkpOwogICAgIH0KIAorICAgIHZvaWQgZm9yY2VBdXRvZmlsbE9uUGFzc3dvcmQoKSB7CisgICAgICAgIHN5bmNSdW5PblVpVGhyZWFkKCgpIC0+IGdldEF1dG9maWxsTWFuYWdlcigpLnJlcXVlc3RBdXRvZmlsbChtUGFzc3dvcmRFZGl0VGV4dCkpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIFZpc2l0cyB0aGUge0Bjb2RlIHVzZXJuYW1lX2xhYmVsfSBpbiB0aGUgVWlUaHJlYWQuCiAgICAgICovCkBAIC0yMTAsNiArMjUzLDEzIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogR2V0cyB0aGUge0Bjb2RlIHVzZXJuYW1lX2xhYmVsfSB2aWV3LgorICAgICAqLworICAgIFRleHRWaWV3IGdldFVzZXJuYW1lTGFiZWwoKSB7CisgICAgICAgIHJldHVybiBtVXNlcm5hbWVMYWJlbDsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBHZXRzIHRoZSB7QGNvZGUgdXNlcm5hbWV9IHZpZXcuCiAgICAgICovCiAgICAgRWRpdFRleHQgZ2V0VXNlcm5hbWUoKSB7CmRpZmYgLS1naXQgYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9Mb2dpbkFjdGl2aXR5VGVzdC5qYXZhIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvTG9naW5BY3Rpdml0eVRlc3QuamF2YQppbmRleCA0MmEyZmE5Li5jMjA4OTE3IDEwMDY0NAotLS0gYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9Mb2dpbkFjdGl2aXR5VGVzdC5qYXZhCisrKyBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0xvZ2luQWN0aXZpdHlUZXN0LmphdmEKQEAgLTE2LDMzICsxNiwzMiBAQAogCiBwYWNrYWdlIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0czsKIAotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5BY3Rpdml0eS5SRVNVTFRfQ0FOQ0VMRUQ7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLkFjdGl2aXR5LlJFU1VMVF9PSzsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkNhbm5lZEZpbGxSZXNwb25zZS5ET19OT1RfUkVQTFlfUkVTUE9OU0U7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5DYW5uZWRGaWxsUmVzcG9uc2UuTk9fUkVTUE9OU0U7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5DaGVja291dEFjdGl2aXR5LklEX0NDX05VTUJFUjsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5JRF9QQVNTV09SRDsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5JRF9QQVNTV09SRF9MQUJFTDsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5JRF9VU0VSTkFNRTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5hc3NlcnROb0RhbmdsaW5nU2Vzc2lvbnM7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5IZWxwZXIuSURfVVNFUk5BTUVfTEFCRUw7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5IZWxwZXIuYXNzZXJ0SGFzRmxhZ3M7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5IZWxwZXIuYXNzZXJ0TnVtYmVyT2ZDaGlsZHJlbjsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5hc3NlcnRUZXh0QW5kVmFsdWU7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5IZWxwZXIuYXNzZXJ0VGV4dElzU2FuaXRpemVkOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSGVscGVyLmFzc2VydFRleHRPbmx5OwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSGVscGVyLmFzc2VydFZhbHVlOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSGVscGVyLmR1bXBTdHJ1Y3R1cmU7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5IZWxwZXIuZmluZE5vZGVCeVJlc291cmNlSWQ7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5IZWxwZXIucnVuU2hlbGxDb21tYW5kOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSGVscGVyLmlzQXV0b2ZpbGxXaW5kb3dGdWxsU2NyZWVuOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSGVscGVyLnNldFVzZXJDb21wbGV0ZTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkluc3RydW1lbnRlZEF1dG9GaWxsU2VydmljZS5TRVJWSUNFX0NMQVNTOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSW5zdHJ1bWVudGVkQXV0b0ZpbGxTZXJ2aWNlLlNFUlZJQ0VfUEFDS0FHRTsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkluc3RydW1lbnRlZEF1dG9GaWxsU2VydmljZS53YWl0VW50aWxDb25uZWN0ZWQ7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5JbnN0cnVtZW50ZWRBdXRvRmlsbFNlcnZpY2Uud2FpdFVudGlsRGlzY29ubmVjdGVkOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuTG9naW5BY3Rpdml0eS5BVVRIRU5USUNBVElPTl9NRVNTQUdFOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuTG9naW5BY3Rpdml0eS5CQUNLRE9PUl9VU0VSTkFNRTsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkxvZ2luQWN0aXZpdHkuSURfVVNFUk5BTUVfQ09OVEFJTkVSOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuTG9naW5BY3Rpdml0eS5nZXRXZWxjb21lTWVzc2FnZTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2aWNlLmF1dG9maWxsLkZpbGxFdmVudEhpc3RvcnkuRXZlbnQuVFlQRV9BVVRIRU5USUNBVElPTl9TRUxFQ1RFRDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2aWNlLmF1dG9maWxsLkZpbGxFdmVudEhpc3RvcnkuRXZlbnQuVFlQRV9EQVRBU0VUX0FVVEhFTlRJQ0FUSU9OX1NFTEVDVEVEOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuRmlsbEV2ZW50SGlzdG9yeS5FdmVudC5UWVBFX0RBVEFTRVRfU0VMRUNURUQ7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmljZS5hdXRvZmlsbC5GaWxsRXZlbnRIaXN0b3J5LkV2ZW50LlRZUEVfU0FWRV9TSE9XTjsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLmNvbW1vbi5TaGVsbEhlbHBlci5ydW5TaGVsbENvbW1hbmQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5jb21tb24uU2hlbGxIZWxwZXIudGFwOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuRmlsbFJlcXVlc3QuRkxBR19NQU5VQUxfUkVRVUVTVDsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2aWNlLmF1dG9maWxsLlNhdmVJbmZvLlNBVkVfREFUQV9UWVBFX0FERFJFU1M7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmljZS5hdXRvZmlsbC5TYXZlSW5mby5TQVZFX0RBVEFfVFlQRV9DUkVESVRfQ0FSRDsKQEAgLTU1LDExICs1NCw2IEBACiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5WaWV3LklNUE9SVEFOVF9GT1JfQVVUT0ZJTExfTk87CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX1NFQ1VSRTsKIAotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jdHMubW9ja2ltZS5JbWVFdmVudFN0cmVhbVRlc3RVdGlscy5lZGl0b3JNYXRjaGVyOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jdHMubW9ja2ltZS5JbWVFdmVudFN0cmVhbVRlc3RVdGlscy5leHBlY3RCaW5kSW5wdXQ7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmN0cy5tb2NraW1lLkltZUV2ZW50U3RyZWFtVGVzdFV0aWxzLmV4cGVjdENvbW1hbmQ7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmN0cy5tb2NraW1lLkltZUV2ZW50U3RyZWFtVGVzdFV0aWxzLmV4cGVjdEV2ZW50OwotCiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLnRydXRoLlRydXRoLmFzc2VydFRoYXQ7CiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLnRydXRoLlRydXRoLmFzc2VydFdpdGhNZXNzYWdlOwogCkBAIC02OSwxNCArNjMsMTcgQEAKIGltcG9ydCBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSW5zdHJ1bWVudGVkQXV0b0ZpbGxTZXJ2aWNlLkZpbGxSZXF1ZXN0OwogaW1wb3J0IGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5JbnN0cnVtZW50ZWRBdXRvRmlsbFNlcnZpY2UuU2F2ZVJlcXVlc3Q7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50U2VuZGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3I7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuUHJvY2VzczsKLWltcG9ydCBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuRmlsbEV2ZW50SGlzdG9yeTsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIGltcG9ydCBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuU2F2ZUluZm87CiBpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QudWlhdXRvbWF0b3IuVWlPYmplY3QyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CkBAIC04NywxNyArODQsMTIgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5Tm9kZUluZm87CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU5vZGVQcm92aWRlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYXV0b2ZpbGwuQXV0b2ZpbGxNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQudmlldy5hdXRvZmlsbC5BdXRvZmlsbFZhbHVlOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlJlbW90ZVZpZXdzOwogCiBpbXBvcnQgY29tLmFuZHJvaWQuY3RzLm1vY2tpbWUuSW1lQ29tbWFuZDsKIGltcG9ydCBjb20uYW5kcm9pZC5jdHMubW9ja2ltZS5JbWVFdmVudFN0cmVhbTsKIGltcG9ydCBjb20uYW5kcm9pZC5jdHMubW9ja2ltZS5Nb2NrSW1lU2Vzc2lvbjsKIAotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKQEAgLTEwOCwyNiArMTAwLDkgQEAKICAqIFRoaXMgaXMgdGhlIHRlc3QgY2FzZSBjb3ZlcmluZyBtb3N0IHNjZW5hcmlvcyAtIG90aGVyIHRlc3QgY2FzZXMgd2lsbCBjb3ZlciBjaGFyYWN0ZXJpc3RpY3MKICAqIHNwZWNpZmljIHRvIHRoYXQgdGVzdCdzIGFjdGl2aXR5IChmb3IgZXhhbXBsZSwgY3VzdG9tIHZpZXdzKS4KICAqLwotcHVibGljIGNsYXNzIExvZ2luQWN0aXZpdHlUZXN0IGV4dGVuZHMgQXV0b0ZpbGxTZXJ2aWNlVGVzdENhc2UgeworcHVibGljIGNsYXNzIExvZ2luQWN0aXZpdHlUZXN0IGV4dGVuZHMgQWJzdHJhY3RMb2dpbkFjdGl2aXR5VGVzdENhc2UgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJMb2dpbkFjdGl2aXR5VGVzdCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBNT0NLX0lNRV9USU1FT1VUX01TID0gNV8wMDA7Ci0KLSAgICBAUnVsZQotICAgIHB1YmxpYyBmaW5hbCBBdXRvZmlsbEFjdGl2aXR5VGVzdFJ1bGU8TG9naW5BY3Rpdml0eT4gbUFjdGl2aXR5UnVsZSA9Ci0gICAgICAgIG5ldyBBdXRvZmlsbEFjdGl2aXR5VGVzdFJ1bGU8TG9naW5BY3Rpdml0eT4oTG9naW5BY3Rpdml0eS5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIExvZ2luQWN0aXZpdHkgbUFjdGl2aXR5OwotCi0gICAgQEJlZm9yZQotICAgIHB1YmxpYyB2b2lkIHNldEFjdGl2aXR5KCkgewotICAgICAgICBtQWN0aXZpdHkgPSBtQWN0aXZpdHlSdWxlLmdldEFjdGl2aXR5KCk7Ci0gICAgfQotCi0gICAgQEFmdGVyCi0gICAgcHVibGljIHZvaWQgZmluaXNoV2VsY29tZUFjdGl2aXR5KCkgewotICAgICAgICBXZWxjb21lQWN0aXZpdHkuZmluaXNoSXQoKTsKLSAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvRmlsbE5vRGF0YXNldHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTE0MCwzOCArMTE1LDQ0IEBACiAgICAgICAgIC8vIFRyaWdnZXIgYXV0b2ZpbGwuCiAgICAgICAgIG1BY3Rpdml0eS5vblVzZXJuYW1lKFZpZXc6OnJlcXVlc3RGb2N1cyk7CiAKLSAgICAgICAgLy8gVGVzdCBjb25uZWN0aW9uIGxpZmVjeWNsZS4KLSAgICAgICAgd2FpdFVudGlsQ29ubmVjdGVkKCk7CisgICAgICAgIC8vIE1ha2Ugc3VyZSBhIGZpbGwgcmVxdWVzdCBpcyBjYWxsZWQgYnV0IGRvbid0IGNoZWNrIGZvciBjb25uZWN0ZWQoKSAtIGFzIHdlJ3JlIHJldHVybmluZworICAgICAgICAvLyBhIG51bGwgcmVzcG9uc2UsIHRoZSBzZXJ2aWNlIG1pZ2h0IGhhdmUgYmVlbiBkaXNjb25uZWN0ZWQgYWxyZWFkeSBieSB0aGUgdGltZSB3ZSBhc3NlcnQKKyAgICAgICAgLy8gaXQuCiAgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwogCiAgICAgICAgIC8vIE1ha2Ugc3VyZSBVSSBpcyBub3Qgc2hvd24uCi0gICAgICAgIHNVaUJvdC5hc3NlcnROb0RhdGFzZXRzKCk7Ci0KLSAgICAgICAgLy8gVHJ5IHRvIHRyaWdnZXIgaXQgYWdhaW4uLi4KLQotICAgICAgICBtQWN0aXZpdHkub25QYXNzd29yZChWaWV3OjpyZXF1ZXN0Rm9jdXMpOwotICAgICAgICAvLyAuLi5hbmQgbWFrZSBzdXJlIGl0IGRpZG4ndAotICAgICAgICBzVWlCb3QuYXNzZXJ0Tm9EYXRhc2V0cygpOwotICAgICAgICBzUmVwbGllci5hc3NlcnROdW1iZXJVbmhhbmRsZWRGaWxsUmVxdWVzdHMoMCk7CisgICAgICAgIG1VaUJvdC5hc3NlcnROb0RhdGFzZXRzRXZlcigpOwogCiAgICAgICAgIC8vIFRlc3QgY29ubmVjdGlvbiBsaWZlY3ljbGUuCiAgICAgICAgIHdhaXRVbnRpbERpc2Nvbm5lY3RlZCgpOwogICAgIH0KIAogICAgIEBUZXN0CisgICAgQEFwcE1vZGVGdWxsIC8vIHRlc3RBdXRvRmlsbE9uZURhdGFzZXQoKSBpcyBlbm91Z2ggdG8gdGVzdCBlcGhlbWVyYWwgYXBwcyBzdXBwb3J0CiAgICAgcHVibGljIHZvaWQgdGVzdEF1dG9maWxsTWFudWFsbHlBZnRlclNlcnZpY2VSZXR1cm5lZE5vRGF0YXNldHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXV0b2ZpbGxBZnRlclNlcnZpY2VSZXR1cm5lZE5vRGF0YXNldHModHJ1ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gdGVzdEF1dG9GaWxsT25lRGF0YXNldCgpIGlzIGVub3VnaCB0byB0ZXN0IGVwaGVtZXJhbCBhcHBzIHN1cHBvcnQKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0b2ZpbGxBdXRvbWF0aWNhbGx5QWZ0ZXJTZXJ2aWNlUmV0dXJuZWROb0RhdGFzZXRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGF1dG9maWxsQWZ0ZXJTZXJ2aWNlUmV0dXJuZWROb0RhdGFzZXRzKGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXV0b2ZpbGxBZnRlclNlcnZpY2VSZXR1cm5lZE5vRGF0YXNldHMoYm9vbGVhbiBtYW51YWxseSkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFNldCBzZXJ2aWNlLgogICAgICAgICBlbmFibGVTZXJ2aWNlKCk7CiAKICAgICAgICAgLy8gU2V0IGV4cGVjdGF0aW9ucy4KICAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UoTk9fUkVTUE9OU0UpOworICAgICAgICBtQWN0aXZpdHkuZXhwZWN0QXV0b0ZpbGwoImR1ZGUiLCAic3dlZXQiKTsKIAogICAgICAgICAvLyBUcmlnZ2VyIGF1dG9maWxsLgogICAgICAgICBtQWN0aXZpdHkub25Vc2VybmFtZShWaWV3OjpyZXF1ZXN0Rm9jdXMpOwogICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKIAogICAgICAgICAvLyBNYWtlIHN1cmUgVUkgaXMgbm90IHNob3duLgotICAgICAgICBzVWlCb3QuYXNzZXJ0Tm9EYXRhc2V0cygpOworICAgICAgICBtVWlCb3QuYXNzZXJ0Tm9EYXRhc2V0c0V2ZXIoKTsKIAogICAgICAgICAvLyBUcnkgYWdhaW4sIGZvcmNpbmcgaXQKICAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UobmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCkBAIC0xNzksMjIgKzE2MCwzOSBAQAogICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9QQVNTV09SRCwgInN3ZWV0IikKICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiVGhlIER1ZGUiKSkKICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7Ci0gICAgICAgIG1BY3Rpdml0eS5leHBlY3RBdXRvRmlsbCgiZHVkZSIsICJzd2VldCIpOwogCi0gICAgICAgIG1BY3Rpdml0eS5mb3JjZUF1dG9maWxsT25Vc2VybmFtZSgpOworICAgICAgICBmaW5hbCBpbnQgZXhwZWN0ZWRGbGFnczsKKyAgICAgICAgaWYgKG1hbnVhbGx5KSB7CisgICAgICAgICAgICBleHBlY3RlZEZsYWdzID0gRkxBR19NQU5VQUxfUkVRVUVTVDsKKyAgICAgICAgICAgIG1BY3Rpdml0eS5mb3JjZUF1dG9maWxsT25Vc2VybmFtZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZXhwZWN0ZWRGbGFncyA9IDA7CisgICAgICAgICAgICByZXF1ZXN0Rm9jdXNPblBhc3N3b3JkKCk7CisgICAgICAgIH0KIAogICAgICAgICBmaW5hbCBGaWxsUmVxdWVzdCBmaWxsUmVxdWVzdCA9IHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwotICAgICAgICBhc3NlcnRUaGF0KGZpbGxSZXF1ZXN0LmZsYWdzKS5pc0VxdWFsVG8oRkxBR19NQU5VQUxfUkVRVUVTVCk7CisgICAgICAgIGFzc2VydEhhc0ZsYWdzKGZpbGxSZXF1ZXN0LmZsYWdzLCBleHBlY3RlZEZsYWdzKTsKIAotICAgICAgICAvLyBTZWxlY3RzIHRoZSBkYXRhc2V0LgotICAgICAgICBzVWlCb3Quc2VsZWN0RGF0YXNldCgiVGhlIER1ZGUiKTsKKyAgICAgICAgLy8gU2VsZWN0IHRoZSBkYXRhc2V0LgorICAgICAgICBtVWlCb3Quc2VsZWN0RGF0YXNldCgiVGhlIER1ZGUiKTsKIAogICAgICAgICAvLyBDaGVjayB0aGUgcmVzdWx0cy4KICAgICAgICAgbUFjdGl2aXR5LmFzc2VydEF1dG9GaWxsZWQoKTsKICAgICB9CiAKICAgICBAVGVzdAorICAgIEBBcHBNb2RlRnVsbCAvLyB0ZXN0QXV0b0ZpbGxPbmVEYXRhc2V0KCkgaXMgZW5vdWdoIHRvIHRlc3QgZXBoZW1lcmFsIGFwcHMgc3VwcG9ydAogICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvZmlsbE1hbnVhbGx5QW5kU2F2ZUFmdGVyU2VydmljZVJldHVybmVkTm9EYXRhc2V0cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhdXRvZmlsbEFuZFNhdmVBZnRlclNlcnZpY2VSZXR1cm5lZE5vRGF0YXNldHModHJ1ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gdGVzdEF1dG9GaWxsT25lRGF0YXNldCgpIGlzIGVub3VnaCB0byB0ZXN0IGVwaGVtZXJhbCBhcHBzIHN1cHBvcnQKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0b2ZpbGxBdXRvbWF0aWNhbGx5QW5kU2F2ZUFmdGVyU2VydmljZVJldHVybmVkTm9EYXRhc2V0cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhdXRvZmlsbEFuZFNhdmVBZnRlclNlcnZpY2VSZXR1cm5lZE5vRGF0YXNldHMoZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhdXRvZmlsbEFuZFNhdmVBZnRlclNlcnZpY2VSZXR1cm5lZE5vRGF0YXNldHMoYm9vbGVhbiBtYW51YWxseSkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFNldCBzZXJ2aWNlLgogICAgICAgICBlbmFibGVTZXJ2aWNlKCk7CiAKQEAgLTIwMiw0MSArMjAwLDE2MiBAQAogICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShOT19SRVNQT05TRSk7CiAKICAgICAgICAgLy8gVHJpZ2dlciBhdXRvZmlsbC4KLSAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoVmlldzo6cmVxdWVzdEZvY3VzKTsKKyAgICAgICAgLy8gTk9URTogbXVzdCBiZSBvbiBwYXNzd29yZCwgYXMgc2F2ZU9ubHlUZXN0KCkgd2lsbCB0cmlnZ2VyIG9uIHVzZXJuYW1lCisgICAgICAgIG1BY3Rpdml0eS5vblBhc3N3b3JkKFZpZXc6OnJlcXVlc3RGb2N1cyk7CiAgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwogCiAgICAgICAgIC8vIE1ha2Ugc3VyZSBVSSBpcyBub3Qgc2hvd24uCi0gICAgICAgIHNVaUJvdC5hc3NlcnROb0RhdGFzZXRzKCk7Ci0gICAgICAgIHNSZXBsaWVyLmFzc2VydE51bWJlclVuaGFuZGxlZEZpbGxSZXF1ZXN0cygwKTsKKyAgICAgICAgbVVpQm90LmFzc2VydE5vRGF0YXNldHNFdmVyKCk7CisgICAgICAgIHNSZXBsaWVyLmFzc2VydE5vVW5oYW5kbGVkRmlsbFJlcXVlc3RzKCk7CiAgICAgICAgIG1BY3Rpdml0eS5vblBhc3N3b3JkKFZpZXc6OnJlcXVlc3RGb2N1cyk7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnROb0RhdGFzZXRzKCk7Ci0gICAgICAgIHNSZXBsaWVyLmFzc2VydE51bWJlclVuaGFuZGxlZEZpbGxSZXF1ZXN0cygwKTsKKyAgICAgICAgbVVpQm90LmFzc2VydE5vRGF0YXNldHNFdmVyKCk7CisgICAgICAgIHNSZXBsaWVyLmFzc2VydE5vVW5oYW5kbGVkRmlsbFJlcXVlc3RzKCk7CiAKICAgICAgICAgLy8gVHJ5IGFnYWluLCBmb3JjaW5nIGl0Ci0gICAgICAgIHNhdmVPbmx5VGVzdCh0cnVlKTsKKyAgICAgICAgc2F2ZU9ubHlUZXN0KG1hbnVhbGx5KTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBNb3JlIGRldGFpbGVkIHRlc3Qgb2Ygd2hhdCBzaG91bGQgaGFwcGVuIGFmdGVyIGEgc2VydmljZSByZXR1cm5zIGEge0Bjb2RlIG51bGx9IEZpbGxSZXNwb25zZToKKyAgICAgKiB2aWV3cyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIHZpc2l0IHNob3VsZCBub3QgdHJpZ2dlciBhIG5ldyBzZXNzaW9uLCB1bmxlc3MgYSBtYW51YWwgYXV0b2ZpbGwKKyAgICAgKiB3b3JrZmxvdyB3YXMgcmVxdWVzdGVkLgorICAgICAqLwogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEF1dG9GaWxsT25lRGF0YXNldCgpIHRocm93cyBFeGNlcHRpb24geworICAgIEBBcHBNb2RlRnVsbCAvLyB0ZXN0QXV0b0ZpbGxOb0RhdGFzZXRzKCkgaXMgZW5vdWdoIHRvIHRlc3QgZXBoZW1lcmFsIGFwcHMgc3VwcG9ydAorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZUl0ZXJhdGlvbnNBZnRlclNlcnZpY2VSZXR1cm5lZE5vRGF0YXNldHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gU2V0IHNlcnZpY2UuCiAgICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKIAotICAgICAgICAvLyBTZXQgZXhwZWN0YXRpb25zLgorICAgICAgICAvLyBUcmlnZ2VyIGF1dG9maWxsIG9uIHVzZXJuYW1lIC0gc2hvdWxkIGNhbGwgc2VydmljZQorICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShOT19SRVNQT05TRSk7CisgICAgICAgIG1BY3Rpdml0eS5vblVzZXJuYW1lKFZpZXc6OnJlcXVlc3RGb2N1cyk7CisgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOworICAgICAgICB3YWl0VW50aWxEaXNjb25uZWN0ZWQoKTsKKworICAgICAgICAvLyBUcmlnZ2VyIGF1dG9maWxsIG9uIHBhc3N3b3JkIC0gc2hvdWxkIGNhbGwgc2VydmljZQorICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShOT19SRVNQT05TRSk7CisgICAgICAgIG1BY3Rpdml0eS5vblBhc3N3b3JkKFZpZXc6OnJlcXVlc3RGb2N1cyk7CisgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOworICAgICAgICB3YWl0VW50aWxEaXNjb25uZWN0ZWQoKTsKKworICAgICAgICAvLyBUYXAgdXNlcm5hbWUgYWdhaW4gLSBzaG91bGQgYmUgaWdub3JlZAorICAgICAgICBtQWN0aXZpdHkub25Vc2VybmFtZShWaWV3OjpyZXF1ZXN0Rm9jdXMpOworICAgICAgICBzUmVwbGllci5hc3NlcnRPbkZpbGxSZXF1ZXN0Tm90Q2FsbGVkKCk7CisgICAgICAgIHdhaXRVbnRpbERpc2Nvbm5lY3RlZCgpOworCisgICAgICAgIC8vIFRhcCBwYXNzd29yZCBhZ2FpbiAtIHNob3VsZCBiZSBpZ25vcmVkCisgICAgICAgIG1BY3Rpdml0eS5vblBhc3N3b3JkKFZpZXc6OnJlcXVlc3RGb2N1cyk7CisgICAgICAgIHNSZXBsaWVyLmFzc2VydE9uRmlsbFJlcXVlc3ROb3RDYWxsZWQoKTsKKyAgICAgICAgd2FpdFVudGlsRGlzY29ubmVjdGVkKCk7CisKKyAgICAgICAgLy8gVHJpZ2dlciBhdXRvZmlsbCBieSBtYW51YWxseSByZXF1ZXN0aW5nIHVzZXJuYW1lIC0gc2hvdWxkIGNhbGwgc2VydmljZQorICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShOT19SRVNQT05TRSk7CisgICAgICAgIG1BY3Rpdml0eS5mb3JjZUF1dG9maWxsT25Vc2VybmFtZSgpOworICAgICAgICBmaW5hbCBGaWxsUmVxdWVzdCBtYW51YWxSZXF1ZXN0MSA9IHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOworICAgICAgICBhc3NlcnRIYXNGbGFncyhtYW51YWxSZXF1ZXN0MS5mbGFncywgRkxBR19NQU5VQUxfUkVRVUVTVCk7CisgICAgICAgIHdhaXRVbnRpbERpc2Nvbm5lY3RlZCgpOworCisgICAgICAgIC8vIFRyaWdnZXIgYXV0b2ZpbGwgYnkgbWFudWFsbHkgcmVxdWVzdGluZyBwYXNzd29yZCAtIHNob3VsZCBjYWxsIHNlcnZpY2UKKyAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UoTk9fUkVTUE9OU0UpOworICAgICAgICBtQWN0aXZpdHkuZm9yY2VBdXRvZmlsbE9uUGFzc3dvcmQoKTsKKyAgICAgICAgZmluYWwgRmlsbFJlcXVlc3QgbWFudWFsUmVxdWVzdDIgPSBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKKyAgICAgICAgYXNzZXJ0SGFzRmxhZ3MobWFudWFsUmVxdWVzdDIuZmxhZ3MsIEZMQUdfTUFOVUFMX1JFUVVFU1QpOworICAgICAgICB3YWl0VW50aWxEaXNjb25uZWN0ZWQoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBBcHBNb2RlRnVsbCAvLyB0ZXN0QXV0b2ZpbGxNYW51YWxseU9uZURhdGFzZXQoKSBpcyBlbm91Z2ggdG8gdGVzdCBlcGhlbWVyYWwgYXBwcyBzdXBwb3J0CisgICAgcHVibGljIHZvaWQgdGVzdEF1dG9maWxsTWFudWFsbHlBbHdheXNDYWxsU2VydmljZUFnYWluKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFNldCBzZXJ2aWNlLgorICAgICAgICBlbmFibGVTZXJ2aWNlKCk7CisKKyAgICAgICAgLy8gRmlyc3QgcmVxdWVzdAogICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfVVNFUk5BTUUsICJkdWRlIikKICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfUEFTU1dPUkQsICJzd2VldCIpCiAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oIlRoZSBEdWRlIikpCiAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICBtQWN0aXZpdHkub25Vc2VybmFtZShWaWV3OjpyZXF1ZXN0Rm9jdXMpOworICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJUaGUgRHVkZSIpOworCisgICAgICAgIC8vIFNlY29uZCByZXF1ZXN0CisgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgIkRVREUiKQorICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9QQVNTV09SRCwgIlNXRUVUIikKKyAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiVEhFIERVREUiKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgbUFjdGl2aXR5LmZvcmNlQXV0b2ZpbGxPblVzZXJuYW1lKCk7CisgICAgICAgIGZpbmFsIEZpbGxSZXF1ZXN0IHNlY29uZFJlcXVlc3QgPSBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKKyAgICAgICAgYXNzZXJ0SGFzRmxhZ3Moc2Vjb25kUmVxdWVzdC5mbGFncywgRkxBR19NQU5VQUxfUkVRVUVTVCk7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cygiVEhFIERVREUiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvRmlsbE9uZURhdGFzZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXV0b2ZpbGxPbmVEYXRhc2V0VGVzdChCb3JkZXJUeXBlLk5PTkUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgQEFwcE1vZGVGdWxsIC8vIHRlc3RBdXRvRmlsbE9uZURhdGFzZXRfd2l0aEhlYWRlckFuZEZvb3RlcigpIGlzIGVub3VnaCB0byB0ZXN0IGVwaGVtZXJhbCBhcHBzCisgICAgcHVibGljIHZvaWQgdGVzdEF1dG9GaWxsT25lRGF0YXNldF93aXRoSGVhZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGF1dG9maWxsT25lRGF0YXNldFRlc3QoQm9yZGVyVHlwZS5IRUFERVJfT05MWSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gdGVzdEF1dG9GaWxsT25lRGF0YXNldF93aXRoSGVhZGVyQW5kRm9vdGVyKCkgaXMgZW5vdWdoIHRvIHRlc3QgZXBoZW1lcmFsIGFwcHMKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0b0ZpbGxPbmVEYXRhc2V0X3dpdGhGb290ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXV0b2ZpbGxPbmVEYXRhc2V0VGVzdChCb3JkZXJUeXBlLkZPT1RFUl9PTkxZKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvRmlsbE9uZURhdGFzZXRfd2l0aEhlYWRlckFuZEZvb3RlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhdXRvZmlsbE9uZURhdGFzZXRUZXN0KEJvcmRlclR5cGUuQk9USCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBlbnVtIEJvcmRlclR5cGUgeworICAgICAgICBOT05FLAorICAgICAgICBIRUFERVJfT05MWSwKKyAgICAgICAgRk9PVEVSX09OTFksCisgICAgICAgIEJPVEgKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXV0b2ZpbGxPbmVEYXRhc2V0VGVzdChCb3JkZXJUeXBlIGJvcmRlclR5cGUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBTZXQgc2VydmljZS4KKyAgICAgICAgZW5hYmxlU2VydmljZSgpOworCisgICAgICAgIC8vIFNldCBleHBlY3RhdGlvbnMuCisgICAgICAgIFN0cmluZyBleHBlY3RlZEhlYWRlciA9IG51bGwsIGV4cGVjdGVkRm9vdGVyID0gbnVsbDsKKworICAgICAgICBmaW5hbCBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlciBidWlsZGVyID0gbmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuYWRkRGF0YXNldChuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgImR1ZGUiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1BBU1NXT1JELCAic3dlZXQiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oIlRoZSBEdWRlIikpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgICAgIGlmIChib3JkZXJUeXBlID09IEJvcmRlclR5cGUuQk9USCB8fCBib3JkZXJUeXBlID09IEJvcmRlclR5cGUuSEVBREVSX09OTFkpIHsKKyAgICAgICAgICAgIGV4cGVjdGVkSGVhZGVyID0gIkhlYWQiOworICAgICAgICAgICAgYnVpbGRlci5zZXRIZWFkZXIoY3JlYXRlUHJlc2VudGF0aW9uKGV4cGVjdGVkSGVhZGVyKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJvcmRlclR5cGUgPT0gQm9yZGVyVHlwZS5CT1RIIHx8IGJvcmRlclR5cGUgPT0gQm9yZGVyVHlwZS5GT09URVJfT05MWSkgeworICAgICAgICAgICAgZXhwZWN0ZWRGb290ZXIgPSAiVGFpbHMiOworICAgICAgICAgICAgYnVpbGRlci5zZXRGb290ZXIoY3JlYXRlUHJlc2VudGF0aW9uKGV4cGVjdGVkRm9vdGVyKSk7CisgICAgICAgIH0KKyAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UoYnVpbGRlci5idWlsZCgpKTsKICAgICAgICAgbUFjdGl2aXR5LmV4cGVjdEF1dG9GaWxsKCJkdWRlIiwgInN3ZWV0Iik7CiAKICAgICAgICAgLy8gRHluYW1pY2FsbHkgc2V0IHBhc3N3b3JkIHRvIG1ha2Ugc3VyZSBpdCdzIHNhbml0aXplZC4KICAgICAgICAgbUFjdGl2aXR5Lm9uUGFzc3dvcmQoKHYpIC0+IHYuc2V0VGV4dCgiSSBBTSBHUk9PVCIpKTsKIAogICAgICAgICAvLyBUcmlnZ2VyIGF1dG8tZmlsbC4KLSAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoVmlldzo6cmVxdWVzdEZvY3VzKTsKKyAgICAgICAgcmVxdWVzdEZvY3VzT25Vc2VybmFtZSgpOwogCiAgICAgICAgIC8vIEF1dG8tZmlsbCBpdC4KLSAgICAgICAgc1VpQm90LnNlbGVjdERhdGFzZXQoIlRoZSBEdWRlIik7CisgICAgICAgIGZpbmFsIFVpT2JqZWN0MiBwaWNrZXIgPSBtVWlCb3QuYXNzZXJ0RGF0YXNldHNXaXRoQm9yZGVycyhleHBlY3RlZEhlYWRlciwgZXhwZWN0ZWRGb290ZXIsCisgICAgICAgICAgICAgICAgIlRoZSBEdWRlIik7CisKKyAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQocGlja2VyLCAiVGhlIER1ZGUiKTsKIAogICAgICAgICAvLyBDaGVjayB0aGUgcmVzdWx0cy4KICAgICAgICAgbUFjdGl2aXR5LmFzc2VydEF1dG9GaWxsZWQoKTsKQEAgLTI1Niw2ICszNzUsOTIgQEAKICAgICB9CiAKICAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REYXRhc2V0UGlja2VyUG9zaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gVE9ETzogY3VycmVudGx5IGRpc2FibGVkIGJlY2F1c2UgdGhlIHNjcmVlbnNob3QgY29udGFpbnMgZWxlbWVudHMgZXh0ZXJuYWwgdG8gdGhlCisgICAgICAgIC8vIGFjdGl2aXR5IHRoYXQgY2FuIGNoYW5nZSAoZm9yIGV4bWFwbGUsIGNsb2NrKSwgd2hpY2ggY2F1c2VzIGZsYWtpbmVzcyB0byB0aGUgdGVzdC4KKyAgICAgICAgZmluYWwgYm9vbGVhbiBjb21wYXJlQml0bWFwcyA9IGZhbHNlOworICAgICAgICBmaW5hbCBib29sZWFuIHBpY2tlckFuZFZpZXdCb3VuZHNNYXRjaGVzID0gIWlzQXV0b2ZpbGxXaW5kb3dGdWxsU2NyZWVuKG1Db250ZXh0KTsKKworICAgICAgICAvLyBTZXQgc2VydmljZS4KKyAgICAgICAgZW5hYmxlU2VydmljZSgpOworICAgICAgICBmaW5hbCBNeUF1dG9maWxsQ2FsbGJhY2sgY2FsbGJhY2sgPSBtQWN0aXZpdHkucmVnaXN0ZXJDYWxsYmFjaygpOworICAgICAgICBmaW5hbCBWaWV3IHVzZXJuYW1lID0gbUFjdGl2aXR5LmdldFVzZXJuYW1lKCk7CisgICAgICAgIGZpbmFsIFZpZXcgcGFzc3dvcmQgPSBtQWN0aXZpdHkuZ2V0UGFzc3dvcmQoKTsKKworICAgICAgICAvLyBTZXQgZXhwZWN0YXRpb25zLgorICAgICAgICBmaW5hbCBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlciBidWlsZGVyID0gbmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuYWRkRGF0YXNldChuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgImR1ZGUiLCBjcmVhdGVQcmVzZW50YXRpb24oIkRVREUiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9QQVNTV09SRCwgInN3ZWV0IiwgY3JlYXRlUHJlc2VudGF0aW9uKCJTV0VFVCIpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShidWlsZGVyLmJ1aWxkKCkpOworCisgICAgICAgIC8vIFRyaWdnZXIgYXV0b2ZpbGwgb24gdXNlcm5hbWUKKyAgICAgICAgZmluYWwgUmVjdCB1c2VybmFtZUJvdW5kYXJpZXMxID0gbVVpQm90LnNlbGVjdEJ5UmVsYXRpdmVJZChJRF9VU0VSTkFNRSkuZ2V0VmlzaWJsZUJvdW5kcygpOworICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKKyAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlTaG93bkV2ZW50KHVzZXJuYW1lKTsKKyAgICAgICAgZmluYWwgUmVjdCB1c2VybmFtZVBpY2tlckJvdW5kYXJpZXMxID0gbVVpQm90LmFzc2VydERhdGFzZXRzKCJEVURFIikuZ2V0VmlzaWJsZUJvdW5kcygpOworICAgICAgICBmaW5hbCBCaXRtYXAgdXNlcm5hbWVTY3JlZW5zaG90MSA9IGNvbXBhcmVCaXRtYXBzID8gbVVpQm90LnRha2VTY3JlZW5zaG90KCkgOiBudWxsOworICAgICAgICBMb2cudihUQUcsCisgICAgICAgICAgICAgICAgIlVzZXJuYW1lMSBhdCAiICsgdXNlcm5hbWVCb3VuZGFyaWVzMSArICI7IHBpY2tlciBhdCAiICsgdXNlcm5hbWVQaWNrZXJCb3VuZGFyaWVzMSk7CisgICAgICAgIC8vIFRPRE8oYi8zNzU2NjYyNyk6IGFzc2VydGlvbnMgYmVsb3cgbWlnaHQgYmUgdG9vIGFnZ3Jlc3NpdmUgLSB1c2UgcmFuZ2UgaW5zdGVhZD8KKyAgICAgICAgaWYgKHBpY2tlckFuZFZpZXdCb3VuZHNNYXRjaGVzKSB7CisgICAgICAgICAgICBhc3NlcnRUaGF0KHVzZXJuYW1lUGlja2VyQm91bmRhcmllczEudG9wKS5pc0VxdWFsVG8odXNlcm5hbWVCb3VuZGFyaWVzMS5ib3R0b20pOworICAgICAgICAgICAgYXNzZXJ0VGhhdCh1c2VybmFtZVBpY2tlckJvdW5kYXJpZXMxLmxlZnQpLmlzRXF1YWxUbyh1c2VybmFtZUJvdW5kYXJpZXMxLmxlZnQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gTW92ZSB0byBwYXNzd29yZAorICAgICAgICBmaW5hbCBSZWN0IHBhc3N3b3JkQm91bmRhcmllczEgPSBtVWlCb3Quc2VsZWN0QnlSZWxhdGl2ZUlkKElEX1BBU1NXT1JEKS5nZXRWaXNpYmxlQm91bmRzKCk7CisgICAgICAgIGNhbGxiYWNrLmFzc2VydFVpSGlkZGVuRXZlbnQodXNlcm5hbWUpOworICAgICAgICBjYWxsYmFjay5hc3NlcnRVaVNob3duRXZlbnQocGFzc3dvcmQpOworICAgICAgICBmaW5hbCBSZWN0IHBhc3N3b3JkUGlja2VyQm91bmRhcmllczEgPSBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlNXRUVUIikuZ2V0VmlzaWJsZUJvdW5kcygpOworICAgICAgICBmaW5hbCBCaXRtYXAgcGFzc3dvcmRTY3JlZW5zaG90MSA9IGNvbXBhcmVCaXRtYXBzID8gbVVpQm90LnRha2VTY3JlZW5zaG90KCkgOiBudWxsOworICAgICAgICBMb2cudihUQUcsCisgICAgICAgICAgICAgICAgIlBhc3N3b3JkMSBhdCAiICsgcGFzc3dvcmRCb3VuZGFyaWVzMSArICI7IHBpY2tlciBhdCAiICsgcGFzc3dvcmRQaWNrZXJCb3VuZGFyaWVzMSk7CisgICAgICAgIC8vIFRPRE8oYi8zNzU2NjYyNyk6IGFzc2VydGlvbnMgYmVsb3cgbWlnaHQgYmUgdG9vIGFnZ3Jlc3NpdmUgLSB1c2UgcmFuZ2UgaW5zdGVhZD8KKyAgICAgICAgaWYgKHBpY2tlckFuZFZpZXdCb3VuZHNNYXRjaGVzKSB7CisgICAgICAgICAgICBhc3NlcnRUaGF0KHBhc3N3b3JkUGlja2VyQm91bmRhcmllczEudG9wKS5pc0VxdWFsVG8ocGFzc3dvcmRCb3VuZGFyaWVzMS5ib3R0b20pOworICAgICAgICAgICAgYXNzZXJ0VGhhdChwYXNzd29yZFBpY2tlckJvdW5kYXJpZXMxLmxlZnQpLmlzRXF1YWxUbyhwYXNzd29yZEJvdW5kYXJpZXMxLmxlZnQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGhlbiBiYWNrIHRvIHVzZXJuYW1lCisgICAgICAgIGZpbmFsIFJlY3QgdXNlcm5hbWVCb3VuZGFyaWVzMiA9IG1VaUJvdC5zZWxlY3RCeVJlbGF0aXZlSWQoSURfVVNFUk5BTUUpLmdldFZpc2libGVCb3VuZHMoKTsKKyAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlIaWRkZW5FdmVudChwYXNzd29yZCk7CisgICAgICAgIGNhbGxiYWNrLmFzc2VydFVpU2hvd25FdmVudCh1c2VybmFtZSk7CisgICAgICAgIGZpbmFsIFJlY3QgdXNlcm5hbWVQaWNrZXJCb3VuZGFyaWVzMiA9IG1VaUJvdC5hc3NlcnREYXRhc2V0cygiRFVERSIpLmdldFZpc2libGVCb3VuZHMoKTsKKyAgICAgICAgZmluYWwgQml0bWFwIHVzZXJuYW1lU2NyZWVuc2hvdDIgPSBjb21wYXJlQml0bWFwcyA/IG1VaUJvdC50YWtlU2NyZWVuc2hvdCgpIDogbnVsbDsKKyAgICAgICAgTG9nLnYoVEFHLAorICAgICAgICAgICAgICAgICJVc2VybmFtZTIgYXQgIiArIHVzZXJuYW1lQm91bmRhcmllczIgKyAiOyBwaWNrZXIgYXQgIiArIHVzZXJuYW1lUGlja2VyQm91bmRhcmllczIpOworCisgICAgICAgIC8vIEFuZCBiYWNrIHRvIHRoZSBwYXNzd29yZCBhZ2Fpbi4uCisgICAgICAgIGZpbmFsIFJlY3QgcGFzc3dvcmRCb3VuZGFyaWVzMiA9IG1VaUJvdC5zZWxlY3RCeVJlbGF0aXZlSWQoSURfUEFTU1dPUkQpLmdldFZpc2libGVCb3VuZHMoKTsKKyAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlIaWRkZW5FdmVudCh1c2VybmFtZSk7CisgICAgICAgIGNhbGxiYWNrLmFzc2VydFVpU2hvd25FdmVudChwYXNzd29yZCk7CisgICAgICAgIGZpbmFsIFJlY3QgcGFzc3dvcmRQaWNrZXJCb3VuZGFyaWVzMiA9IG1VaUJvdC5hc3NlcnREYXRhc2V0cygiU1dFRVQiKS5nZXRWaXNpYmxlQm91bmRzKCk7CisgICAgICAgIGZpbmFsIEJpdG1hcCBwYXNzd29yZFNjcmVlbnNob3QyID0gY29tcGFyZUJpdG1hcHMgPyBtVWlCb3QudGFrZVNjcmVlbnNob3QoKSA6IG51bGw7CisgICAgICAgIExvZy52KFRBRywKKyAgICAgICAgICAgICAgICAiUGFzc3dvcmQyIGF0ICIgKyBwYXNzd29yZEJvdW5kYXJpZXMyICsgIjsgcGlja2VyIGF0ICIgKyBwYXNzd29yZFBpY2tlckJvdW5kYXJpZXMyKTsKKworICAgICAgICAvLyBBc3NlcnQgZmluYWwgc3RhdGUgbWF0Y2hlcyBpbml0aWFsLi4uCisgICAgICAgIC8vIC4uLiBmb3IgdXNlcm5hbWUKKyAgICAgICAgYXNzZXJ0VGhhdCh1c2VybmFtZUJvdW5kYXJpZXMyKS5pc0VxdWFsVG8odXNlcm5hbWVCb3VuZGFyaWVzMSk7CisgICAgICAgIGFzc2VydFRoYXQodXNlcm5hbWVQaWNrZXJCb3VuZGFyaWVzMikuaXNFcXVhbFRvKHVzZXJuYW1lUGlja2VyQm91bmRhcmllczEpOworICAgICAgICBpZiAoY29tcGFyZUJpdG1hcHMpIHsKKyAgICAgICAgICAgIEhlbHBlci5hc3NlcnRCaXRtYXBzQXJlU2FtZSgidXNlcm5hbWUiLCB1c2VybmFtZVNjcmVlbnNob3QxLCB1c2VybmFtZVNjcmVlbnNob3QyKTsKKyAgICAgICAgfQorICAgICAgICAvLyAuLi4gZm9yIHBhc3N3b3JkCisgICAgICAgIGFzc2VydFRoYXQocGFzc3dvcmRCb3VuZGFyaWVzMikuaXNFcXVhbFRvKHBhc3N3b3JkQm91bmRhcmllczEpOworICAgICAgICBhc3NlcnRUaGF0KHBhc3N3b3JkUGlja2VyQm91bmRhcmllczIpLmlzRXF1YWxUbyhwYXNzd29yZFBpY2tlckJvdW5kYXJpZXMxKTsKKyAgICAgICAgaWYgKGNvbXBhcmVCaXRtYXBzKSB7CisgICAgICAgICAgICBIZWxwZXIuYXNzZXJ0Qml0bWFwc0FyZVNhbWUoInBhc3N3b3JkIiwgcGFzc3dvcmRTY3JlZW5zaG90MSwgcGFzc3dvcmRTY3JlZW5zaG90Mik7CisgICAgICAgIH0KKworICAgICAgICAvLyBGaW5hbCBzYW5pdHkgY2hlY2sKKyAgICAgICAgY2FsbGJhY2suYXNzZXJ0TnVtYmVyVW5oYW5kbGVkRXZlbnRzKDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgQEFwcE1vZGVGdWxsIC8vIHRlc3RBdXRvRmlsbE9uZURhdGFzZXQoKSBpcyBlbm91Z2ggdG8gdGVzdCBlcGhlbWVyYWwgYXBwcwogICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvRmlsbFR3b0RhdGFzZXRzU2FtZU51bWJlck9mRmllbGRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFNldCBzZXJ2aWNlLgogICAgICAgICBlbmFibGVTZXJ2aWNlKCk7CkBAIC0yNzYsMjkgKzQ4MSwzMSBAQAogICAgICAgICBtQWN0aXZpdHkuZXhwZWN0QXV0b0ZpbGwoImR1ZGUiLCAic3dlZXQiKTsKIAogICAgICAgICAvLyBUcmlnZ2VyIGF1dG8tZmlsbC4KLSAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoVmlldzo6cmVxdWVzdEZvY3VzKTsKKyAgICAgICAgcmVxdWVzdEZvY3VzT25Vc2VybmFtZSgpOwogICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKIAogICAgICAgICAvLyBNYWtlIHN1cmUgYWxsIGRhdGFzZXRzIGFyZSBhdmFpbGFibGUuLi4KLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJUaGUgRHVkZSIsICJUSEUgRFVERSIpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlRoZSBEdWRlIiwgIlRIRSBEVURFIik7CiAKICAgICAgICAgLy8gLi4uIG9uIGFsbCBmaWVsZHMuCi0gICAgICAgIG1BY3Rpdml0eS5vblBhc3N3b3JkKFZpZXc6OnJlcXVlc3RGb2N1cyk7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnREYXRhc2V0cygiVGhlIER1ZGUiLCAiVEhFIERVREUiKTsKKyAgICAgICAgcmVxdWVzdEZvY3VzT25QYXNzd29yZCgpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlRoZSBEdWRlIiwgIlRIRSBEVURFIik7CiAKICAgICAgICAgLy8gQXV0by1maWxsIGl0LgotICAgICAgICBzVWlCb3Quc2VsZWN0RGF0YXNldCgiVGhlIER1ZGUiKTsKKyAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQoIlRoZSBEdWRlIik7CiAKICAgICAgICAgLy8gQ2hlY2sgdGhlIHJlc3VsdHMuCiAgICAgICAgIG1BY3Rpdml0eS5hc3NlcnRBdXRvRmlsbGVkKCk7CiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gdGVzdEF1dG9GaWxsT25lRGF0YXNldCgpIGlzIGVub3VnaCB0byB0ZXN0IGVwaGVtZXJhbCBhcHBzCiAgICAgcHVibGljIHZvaWQgdGVzdEF1dG9GaWxsVHdvRGF0YXNldHNVbmV2ZW5OdW1iZXJPZkZpZWxkc0ZpbGxzQWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGF1dG9GaWxsVHdvRGF0YXNldHNVbmV2ZW5OdW1iZXJPZkZpZWxkc1Rlc3QodHJ1ZSk7CiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gdGVzdEF1dG9GaWxsT25lRGF0YXNldCgpIGlzIGVub3VnaCB0byB0ZXN0IGVwaGVtZXJhbCBhcHBzCiAgICAgcHVibGljIHZvaWQgdGVzdEF1dG9GaWxsVHdvRGF0YXNldHNVbmV2ZW5OdW1iZXJPZkZpZWxkc0ZpbGxzT25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGF1dG9GaWxsVHdvRGF0YXNldHNVbmV2ZW5OdW1iZXJPZkZpZWxkc1Rlc3QoZmFsc2UpOwogICAgIH0KQEAgLTMyNiwyMyArNTMzLDIzIEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBUcmlnZ2VyIGF1dG8tZmlsbC4KLSAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoVmlldzo6cmVxdWVzdEZvY3VzKTsKKyAgICAgICAgcmVxdWVzdEZvY3VzT25Vc2VybmFtZSgpOwogICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKIAogICAgICAgICAvLyBNYWtlIHN1cmUgYWxsIGRhdGFzZXRzIGFyZSBhdmFpbGFibGUgb24gdXNlcm5hbWUuLi4KLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJUaGUgRHVkZSIsICJUSEUgRFVERSIpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlRoZSBEdWRlIiwgIlRIRSBEVURFIik7CiAKICAgICAgICAgLy8gLi4uIGJ1dCBqdXN0IG9uZSBmb3IgcGFzc3dvcmQKLSAgICAgICAgbUFjdGl2aXR5Lm9uUGFzc3dvcmQoVmlldzo6cmVxdWVzdEZvY3VzKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJUaGUgRHVkZSIpOworICAgICAgICByZXF1ZXN0Rm9jdXNPblBhc3N3b3JkKCk7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cygiVGhlIER1ZGUiKTsKIAogICAgICAgICAvLyBBdXRvLWZpbGwgaXQuCi0gICAgICAgIG1BY3Rpdml0eS5vblVzZXJuYW1lKFZpZXc6OnJlcXVlc3RGb2N1cyk7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnREYXRhc2V0cygiVGhlIER1ZGUiLCAiVEhFIERVREUiKTsKKyAgICAgICAgcmVxdWVzdEZvY3VzT25Vc2VybmFtZSgpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlRoZSBEdWRlIiwgIlRIRSBEVURFIik7CiAgICAgICAgIGlmIChmaWxsc0FsbCkgewotICAgICAgICAgICAgc1VpQm90LnNlbGVjdERhdGFzZXQoIlRoZSBEdWRlIik7CisgICAgICAgICAgICBtVWlCb3Quc2VsZWN0RGF0YXNldCgiVGhlIER1ZGUiKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNVaUJvdC5zZWxlY3REYXRhc2V0KCJUSEUgRFVERSIpOworICAgICAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQoIlRIRSBEVURFIik7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBDaGVjayB0aGUgcmVzdWx0cy4KQEAgLTM1MCw2ICs1NTcsNDQgQEAKICAgICB9CiAKICAgICBAVGVzdAorICAgIEBBcHBNb2RlRnVsbCAvLyB0ZXN0QXV0b0ZpbGxPbmVEYXRhc2V0KCkgaXMgZW5vdWdoIHRvIHRlc3QgZXBoZW1lcmFsIGFwcHMKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0b0ZpbGxEYXRhc2V0V2l0aG91dEZpZWxkSXNJZ25vcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFNldCBzZXJ2aWNlLgorICAgICAgICBlbmFibGVTZXJ2aWNlKCk7CisKKyAgICAgICAgLy8gU2V0IGV4cGVjdGF0aW9ucy4KKyAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UobmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuYWRkRGF0YXNldChuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgImR1ZGUiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1BBU1NXT1JELCAic3dlZXQiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oIlRoZSBEdWRlIikpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuYWRkRGF0YXNldChuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgIkRVREUiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1BBU1NXT1JELCAiU1dFRVQiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICBtQWN0aXZpdHkuZXhwZWN0QXV0b0ZpbGwoImR1ZGUiLCAic3dlZXQiKTsKKworICAgICAgICAvLyBUcmlnZ2VyIGF1dG8tZmlsbC4KKyAgICAgICAgcmVxdWVzdEZvY3VzT25Vc2VybmFtZSgpOworICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKKworICAgICAgICAvLyBNYWtlIHN1cmUgYWxsIGRhdGFzZXRzIGFyZSBhdmFpbGFibGUuLi4KKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJUaGUgRHVkZSIpOworCisgICAgICAgIC8vIC4uLiBvbiBhbGwgZmllbGRzLgorICAgICAgICByZXF1ZXN0Rm9jdXNPblBhc3N3b3JkKCk7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cygiVGhlIER1ZGUiKTsKKworICAgICAgICAvLyBBdXRvLWZpbGwgaXQuCisgICAgICAgIG1VaUJvdC5zZWxlY3REYXRhc2V0KCJUaGUgRHVkZSIpOworCisgICAgICAgIC8vIENoZWNrIHRoZSByZXN1bHRzLgorICAgICAgICBtQWN0aXZpdHkuYXNzZXJ0QXV0b0ZpbGxlZCgpOworICAgIH0KKworICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEF1dG9GaWxsV2hlblZpZXdIYXNDaGlsZEFjY2Vzc2liaWxpdHlOb2RlcygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBtQWN0aXZpdHkub25Vc2VybmFtZSgodikgLT4gdi5zZXRBY2Nlc3NpYmlsaXR5RGVsZWdhdGUobmV3IEFjY2Vzc2liaWxpdHlEZWxlZ2F0ZSgpIHsKICAgICAgICAgICAgIEBPdmVycmlkZQpAQCAtMzg0LDI1ICs2MjksMjcgQEAKICAgICAgICAgbUFjdGl2aXR5LmV4cGVjdEF1dG9GaWxsKCJkdWRlIiwgInN3ZWV0Iik7CiAKICAgICAgICAgLy8gVHJpZ2dlciBhdXRvLWZpbGwuCi0gICAgICAgIG1BY3Rpdml0eS5vblVzZXJuYW1lKFZpZXc6OnJlcXVlc3RGb2N1cyk7CisgICAgICAgIHJlcXVlc3RGb2N1c09uVXNlcm5hbWUoKTsKICAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CiAKICAgICAgICAgLy8gTWFrZSBzdXJlIHRhcHBpbmcgb24gb3RoZXIgZmllbGRzIGZyb20gdGhlIGRhdGFzZXQgZG9lcyBub3QgdHJpZ2dlciBpdCBhZ2FpbgotICAgICAgICBtQWN0aXZpdHkub25QYXNzd29yZChWaWV3OjpyZXF1ZXN0Rm9jdXMpOwotICAgICAgICBzUmVwbGllci5hc3NlcnROdW1iZXJVbmhhbmRsZWRGaWxsUmVxdWVzdHMoMCk7CisgICAgICAgIHJlcXVlc3RGb2N1c09uUGFzc3dvcmQoKTsKKyAgICAgICAgc1JlcGxpZXIuYXNzZXJ0Tm9VbmhhbmRsZWRGaWxsUmVxdWVzdHMoKTsKIAotICAgICAgICBtQWN0aXZpdHkub25Vc2VybmFtZShWaWV3OjpyZXF1ZXN0Rm9jdXMpOwotICAgICAgICBzUmVwbGllci5hc3NlcnROdW1iZXJVbmhhbmRsZWRGaWxsUmVxdWVzdHMoMCk7CisgICAgICAgIHJlcXVlc3RGb2N1c09uVXNlcm5hbWUoKTsKKyAgICAgICAgc1JlcGxpZXIuYXNzZXJ0Tm9VbmhhbmRsZWRGaWxsUmVxdWVzdHMoKTsKIAogICAgICAgICAvLyBBdXRvLWZpbGwgaXQuCi0gICAgICAgIHNVaUJvdC5zZWxlY3REYXRhc2V0KCJUaGUgRHVkZSIpOworICAgICAgICBtVWlCb3Quc2VsZWN0RGF0YXNldCgiVGhlIER1ZGUiKTsKIAogICAgICAgICAvLyBDaGVjayB0aGUgcmVzdWx0cy4KICAgICAgICAgbUFjdGl2aXR5LmFzc2VydEF1dG9GaWxsZWQoKTsKIAogICAgICAgICAvLyBNYWtlIHN1cmUgdGFwcGluZyBvbiBvdGhlciBmaWVsZHMgZnJvbSB0aGUgZGF0YXNldCBkb2VzIG5vdCB0cmlnZ2VyIGl0IGFnYWluCi0gICAgICAgIG1BY3Rpdml0eS5vblBhc3N3b3JkKFZpZXc6OnJlcXVlc3RGb2N1cyk7Ci0gICAgICAgIG1BY3Rpdml0eS5vblVzZXJuYW1lKFZpZXc6OnJlcXVlc3RGb2N1cyk7CisgICAgICAgIHJlcXVlc3RGb2N1c09uUGFzc3dvcmQoKTsKKyAgICAgICAgbVVpQm90LmFzc2VydE5vRGF0YXNldHMoKTsKKyAgICAgICAgcmVxdWVzdEZvY3VzT25Vc2VybmFtZU5vV2luZG93Q2hhbmdlKCk7CisgICAgICAgIG1VaUJvdC5hc3NlcnROb0RhdGFzZXRzRXZlcigpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC00MTksMTkgKzY2Niw0OSBAQAogICAgICAgICBtQWN0aXZpdHkuZXhwZWN0QXV0b0ZpbGwoImR1ZGUiLCAic3dlZXQiKTsKIAogICAgICAgICAvLyBUcmlnZ2VyIGF1dG8tZmlsbC4KLSAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoVmlldzo6cmVxdWVzdEZvY3VzKTsKKyAgICAgICAgcmVxdWVzdEZvY3VzT25Vc2VybmFtZSgpOwogICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKLSAgICAgICAgc1VpQm90LnNlbGVjdERhdGFzZXQoIlRoZSBEdWRlIik7CisgICAgICAgIG1VaUJvdC5zZWxlY3REYXRhc2V0KCJUaGUgRHVkZSIpOwogCiAgICAgICAgIC8vIENoZWNrIHRoZSByZXN1bHRzLgogICAgICAgICBtQWN0aXZpdHkuYXNzZXJ0QXV0b0ZpbGxlZCgpOwogCiAgICAgICAgIC8vIE1ha2Ugc3VyZSB0YXBwaW5nIG9uIGF1dG9maWxsZWQgZmllbGQgZG9lcyBub3QgdHJpZ2dlciBpdCBhZ2FpbgotICAgICAgICBtQWN0aXZpdHkub25QYXNzd29yZChWaWV3OjpyZXF1ZXN0Rm9jdXMpOwotICAgICAgICBzVWlCb3QuYXNzZXJ0Tm9EYXRhc2V0cygpOworICAgICAgICByZXF1ZXN0Rm9jdXNPblBhc3N3b3JkKCk7CisgICAgICAgIG1VaUJvdC5hc3NlcnROb0RhdGFzZXRzKCk7CiAKLSAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoVmlldzo6cmVxdWVzdEZvY3VzKTsKLSAgICAgICAgc1VpQm90LmFzc2VydE5vRGF0YXNldHMoKTsKKyAgICAgICAgcmVxdWVzdEZvY3VzT25Vc2VybmFtZU5vV2luZG93Q2hhbmdlKCk7CisgICAgICAgIG1VaUJvdC5hc3NlcnROb0RhdGFzZXRzRXZlcigpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEF1dG9maWxsVGFwT3V0c2lkZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBTZXQgc2VydmljZS4KKyAgICAgICAgZW5hYmxlU2VydmljZSgpOworICAgICAgICBmaW5hbCBNeUF1dG9maWxsQ2FsbGJhY2sgY2FsbGJhY2sgPSBtQWN0aXZpdHkucmVnaXN0ZXJDYWxsYmFjaygpOworCisgICAgICAgIC8vIFNldCBleHBlY3RhdGlvbnMuCisgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgImR1ZGUiKQorICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9QQVNTV09SRCwgInN3ZWV0IikKKyAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiVGhlIER1ZGUiKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgICAgIG1BY3Rpdml0eS5leHBlY3RBdXRvRmlsbCgiZHVkZSIsICJzd2VldCIpOworCisgICAgICAgIC8vIFRyaWdnZXIgYXV0b2ZpbGwuCisgICAgICAgIHJlcXVlc3RGb2N1c09uVXNlcm5hbWUoKTsKKyAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CisgICAgICAgIGZpbmFsIFZpZXcgdXNlcm5hbWUgPSBtQWN0aXZpdHkuZ2V0VXNlcm5hbWUoKTsKKworICAgICAgICBjYWxsYmFjay5hc3NlcnRVaVNob3duRXZlbnQodXNlcm5hbWUpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlRoZSBEdWRlIik7CisKKyAgICAgICAgLy8gdGFwcGluZyBvdXRzaWRlIGF1dG9maWxsIHdpbmRvdyBzaG91bGQgY2xvc2UgaXQgYW5kIHJhaXNlIHVpIGhpZGRlbiBldmVudAorICAgICAgICBtVWlCb3Qud2FpdEZvcldpbmRvd0NoYW5nZSgoKSAtPiB0YXAobUFjdGl2aXR5LmdldFVzZXJuYW1lTGFiZWwoKSksCisgICAgICAgICAgICAgICAgVGltZW91dHMuVUlfVElNRU9VVC5nZXRNYXhWYWx1ZSgpKTsKKyAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlIaWRkZW5FdmVudCh1c2VybmFtZSk7CisKKyAgICAgICAgbVVpQm90LmFzc2VydE5vRGF0YXNldHMoKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtNDQ4LDMwICs3MjUsMzQgQEAKICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CiAgICAgICAgIG1BY3Rpdml0eS5leHBlY3RBdXRvRmlsbCgiZHVkZSIsICJzd2VldCIpOwogCi0gICAgICAgIC8vIFRyaWdnZXIgYXV0by1maWxsLgotICAgICAgICBtQWN0aXZpdHkub25Vc2VybmFtZShWaWV3OjpyZXF1ZXN0Rm9jdXMpOworICAgICAgICAvLyBUcmlnZ2VyIGF1dG9maWxsLgorICAgICAgICByZXF1ZXN0Rm9jdXNPblVzZXJuYW1lKCk7CiAgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwogICAgICAgICBmaW5hbCBWaWV3IHVzZXJuYW1lID0gbUFjdGl2aXR5LmdldFVzZXJuYW1lKCk7CiAgICAgICAgIGZpbmFsIFZpZXcgcGFzc3dvcmQgPSBtQWN0aXZpdHkuZ2V0UGFzc3dvcmQoKTsKIAogICAgICAgICBjYWxsYmFjay5hc3NlcnRVaVNob3duRXZlbnQodXNlcm5hbWUpOwogCi0gICAgICAgIG1BY3Rpdml0eS5vblBhc3N3b3JkKFZpZXc6OnJlcXVlc3RGb2N1cyk7CisgICAgICAgIHJlcXVlc3RGb2N1c09uUGFzc3dvcmQoKTsKICAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlIaWRkZW5FdmVudCh1c2VybmFtZSk7CiAgICAgICAgIGNhbGxiYWNrLmFzc2VydFVpU2hvd25FdmVudChwYXNzd29yZCk7CiAKLSAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoVmlldzo6cmVxdWVzdEZvY3VzKTsKKyAgICAgICAgLy8gVW5yZWdpc3RlciBjYWxsYmFjayB0byBtYWtlIHN1cmUgbm8gbW9yZSBldmVudHMgYXJlIHJlY2VpdmVkCiAgICAgICAgIG1BY3Rpdml0eS51bnJlZ2lzdGVyQ2FsbGJhY2soKTsKKyAgICAgICAgcmVxdWVzdEZvY3VzT25Vc2VybmFtZSgpOworICAgICAgICAvLyBCbGluZGx5IHNsZWVwIC0gd2UgY2Fubm90IHdhaXQgb24gYW55IGV2ZW50IGFzIG5vbmUgc2hvdWxkIGhhdmUgYmVlbiBzZW50CisgICAgICAgIFN5c3RlbUNsb2NrLnNsZWVwKE15QXV0b2ZpbGxDYWxsYmFjay5NWV9USU1FT1VULm1zKCkpOwogICAgICAgICBjYWxsYmFjay5hc3NlcnROdW1iZXJVbmhhbmRsZWRFdmVudHMoMCk7CiAKLSAgICAgICAgLy8gQXV0by1maWxsIGl0LgotICAgICAgICBzVWlCb3Quc2VsZWN0RGF0YXNldCgiVGhlIER1ZGUiKTsKKyAgICAgICAgLy8gQXV0b2ZpbGwgaXQuCisgICAgICAgIG1VaUJvdC5zZWxlY3REYXRhc2V0KCJUaGUgRHVkZSIpOwogCiAgICAgICAgIC8vIENoZWNrIHRoZSByZXN1bHRzLgogICAgICAgICBtQWN0aXZpdHkuYXNzZXJ0QXV0b0ZpbGxlZCgpOwogICAgIH0KIAogICAgIEBUZXN0CisgICAgQEFwcE1vZGVGdWxsIC8vIHRlc3RBdXRvZmlsbENhbGxiYWNrcygpIGlzIGVub3VnaCB0byB0ZXN0IGVwaGVtZXJhbCBhcHBzCiAgICAgcHVibGljIHZvaWQgdGVzdEF1dG9maWxsQ2FsbGJhY2tEaXNhYmxlZCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBTZXQgc2VydmljZS4KICAgICAgICAgZGlzYWJsZVNlcnZpY2UoKTsKQEAgLTQ4NywxMSArNzY4LDEzIEBACiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gdGVzdEF1dG9maWxsQ2FsbGJhY2tzKCkgaXMgZW5vdWdoIHRvIHRlc3QgZXBoZW1lcmFsIGFwcHMKICAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0b2ZpbGxDYWxsYmFja05vRGF0YXNldHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgY2FsbGJhY2tVbmF2YWlsYWJsZVRlc3QoTk9fUkVTUE9OU0UpOwogICAgIH0KIAogICAgIEBUZXN0CisgICAgQEFwcE1vZGVGdWxsIC8vIHRlc3RBdXRvZmlsbENhbGxiYWNrcygpIGlzIGVub3VnaCB0byB0ZXN0IGVwaGVtZXJhbCBhcHBzCiAgICAgcHVibGljIHZvaWQgdGVzdEF1dG9maWxsQ2FsbGJhY2tOb0RhdGFzZXRzQnV0U2F2ZUluZm8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgY2FsbGJhY2tVbmF2YWlsYWJsZVRlc3QobmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkKICAgICAgICAgICAgICAgICAuc2V0UmVxdWlyZWRTYXZhYmxlSWRzKFNBVkVfREFUQV9UWVBFX1BBU1NXT1JELCBJRF9VU0VSTkFNRSwgSURfUEFTU1dPUkQpCkBAIC01MTEsNyArNzk0LDcgQEAKICAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CiAKICAgICAgICAgLy8gQXV0by1maWxsIGl0LgotICAgICAgICBzVWlCb3QuYXNzZXJ0Tm9EYXRhc2V0cygpOworICAgICAgICBtVWlCb3QuYXNzZXJ0Tm9EYXRhc2V0c0V2ZXIoKTsKIAogICAgICAgICAvLyBBc3NlcnQgY2FsbGJhY2sgd2FzIGNhbGxlZAogICAgICAgICBmaW5hbCBWaWV3IHVzZXJuYW1lID0gbUFjdGl2aXR5LmdldFVzZXJuYW1lKCk7CkBAIC01MjksNiArODEyLDcgQEAKIAogICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKQogICAgICAgICAgICAgICAgIC5hZGREYXRhc2V0KG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldElkKCJJJ20gdGhlIGFscGhhIGFuZCB0aGUgb21lZ2EiKQogICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1VTRVJOQU1FLCAiZHVkZSIpCiAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfUEFTU1dPUkQsICJzd2VldCIpCiAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiVGhlIER1ZGUiKSkKQEAgLTUzOSwxNSArODIzLDIzIEBACiAgICAgICAgIG1BY3Rpdml0eS5leHBlY3RBdXRvRmlsbCgiZHVkZSIsICJzd2VldCIpOwogCiAgICAgICAgIC8vIFRyaWdnZXIgYXV0by1maWxsLgotICAgICAgICBtQWN0aXZpdHkub25Vc2VybmFtZShWaWV3OjpyZXF1ZXN0Rm9jdXMpOworICAgICAgICByZXF1ZXN0Rm9jdXNPblVzZXJuYW1lKCk7CiAKICAgICAgICAgLy8gU2luY2UgdGhpcyBpcyBhIFByZXN1Ym1pdCB0ZXN0LCB3YWl0IGZvciBjb25uZWN0aW9uIHRvIGF2b2lkIGZsYWtpbmVzcy4KICAgICAgICAgd2FpdFVudGlsQ29ubmVjdGVkKCk7CiAKLSAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CisgICAgICAgIGZpbmFsIEZpbGxSZXF1ZXN0IGZpbGxSZXF1ZXN0ID0gc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIGlucHV0IHdhcyBzYW5pdGl6ZWQuLi4KKyAgICAgICAgYXNzZXJ0VGV4dElzU2FuaXRpemVkKGZpbGxSZXF1ZXN0LnN0cnVjdHVyZSwgSURfVVNFUk5BTUUpOworICAgICAgICBhc3NlcnRUZXh0SXNTYW5pdGl6ZWQoZmlsbFJlcXVlc3Quc3RydWN0dXJlLCBJRF9QQVNTV09SRCk7CisKKyAgICAgICAgLy8gLi4uYnV0IGxhYmVscyB3ZXJlbid0CisgICAgICAgIGFzc2VydFRleHRPbmx5KGZpbGxSZXF1ZXN0LnN0cnVjdHVyZSwgSURfVVNFUk5BTUVfTEFCRUwsICJVc2VybmFtZSIpOworICAgICAgICBhc3NlcnRUZXh0T25seShmaWxsUmVxdWVzdC5zdHJ1Y3R1cmUsIElEX1BBU1NXT1JEX0xBQkVMLCAiUGFzc3dvcmQiKTsKIAogICAgICAgICAvLyBBdXRvLWZpbGwgaXQuCi0gICAgICAgIHNVaUJvdC5zZWxlY3REYXRhc2V0KCJUaGUgRHVkZSIpOworICAgICAgICBtVWlCb3Quc2VsZWN0RGF0YXNldCgiVGhlIER1ZGUiKTsKIAogICAgICAgICAvLyBDaGVjayB0aGUgcmVzdWx0cy4KICAgICAgICAgbUFjdGl2aXR5LmFzc2VydEF1dG9GaWxsZWQoKTsKQEAgLTU2NiwyMyArODU4LDIyIEBACiAgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJXcm9uZyB3ZWxjb21lIG1zZyIpLnRoYXQoYWN0dWFsTWVzc2FnZSkuaXNFcXVhbFRvKGV4cGVjdGVkTWVzc2FnZSk7CiAKICAgICAgICAgLy8gQXNzZXJ0IHRoZSBzbmFjayBiYXIgaXMgc2hvd24gYW5kIHRhcCAiU2F2ZSIuCi0gICAgICAgIHNVaUJvdC5zYXZlRm9yQXV0b2ZpbGwodHJ1ZSwgU0FWRV9EQVRBX1RZUEVfUEFTU1dPUkQpOworICAgICAgICBtVWlCb3Quc2F2ZUZvckF1dG9maWxsKHRydWUsIFNBVkVfREFUQV9UWVBFX1BBU1NXT1JEKTsKIAogICAgICAgICBmaW5hbCBTYXZlUmVxdWVzdCBzYXZlUmVxdWVzdCA9IHNSZXBsaWVyLmdldE5leHRTYXZlUmVxdWVzdCgpOwogCisgICAgICAgIGFzc2VydFRoYXQoc2F2ZVJlcXVlc3QuZGF0YXNldElkcykuY29udGFpbnNFeGFjdGx5KCJJJ20gdGhlIGFscGhhIGFuZCB0aGUgb21lZ2EiKTsKKwogICAgICAgICAvLyBBc3NlcnQgdmFsdWUgb2YgZXhwZWN0ZWQgZmllbGRzIC0gc2hvdWxkIG5vdCBiZSBzYW5pdGl6ZWQuCi0gICAgICAgIGZpbmFsIFZpZXdOb2RlIHVzZXJuYW1lID0gZmluZE5vZGVCeVJlc291cmNlSWQoc2F2ZVJlcXVlc3Quc3RydWN0dXJlLCBJRF9VU0VSTkFNRSk7Ci0gICAgICAgIGFzc2VydFRleHRBbmRWYWx1ZSh1c2VybmFtZSwgImR1ZGUiKTsKLSAgICAgICAgZmluYWwgVmlld05vZGUgcGFzc3dvcmQgPSBmaW5kTm9kZUJ5UmVzb3VyY2VJZChzYXZlUmVxdWVzdC5zdHJ1Y3R1cmUsIElEX1VTRVJOQU1FKTsKLSAgICAgICAgYXNzZXJ0VGV4dEFuZFZhbHVlKHBhc3N3b3JkLCAiZHVkZSIpOworICAgICAgICBhc3NlcnRUZXh0QW5kVmFsdWUoc2F2ZVJlcXVlc3Quc3RydWN0dXJlLCBJRF9VU0VSTkFNRSwgImR1ZGUiKTsKKyAgICAgICAgYXNzZXJ0VGV4dEFuZFZhbHVlKHNhdmVSZXF1ZXN0LnN0cnVjdHVyZSwgSURfUEFTU1dPUkQsICJkdWRlIik7CisgICAgICAgIGFzc2VydFRleHRPbmx5KHNhdmVSZXF1ZXN0LnN0cnVjdHVyZSwgSURfVVNFUk5BTUVfTEFCRUwsICJVc2VybmFtZSIpOworICAgICAgICBhc3NlcnRUZXh0T25seShzYXZlUmVxdWVzdC5zdHJ1Y3R1cmUsIElEX1BBU1NXT1JEX0xBQkVMLCAiUGFzc3dvcmQiKTsKIAogICAgICAgICAvLyBNYWtlIHN1cmUgZXh0cmFzIHdlcmUgcGFzc2VkIGJhY2sgb24gb25TYXZlKCkKICAgICAgICAgYXNzZXJ0VGhhdChzYXZlUmVxdWVzdC5kYXRhKS5pc05vdE51bGwoKTsKICAgICAgICAgZmluYWwgU3RyaW5nIGV4dHJhVmFsdWUgPSBzYXZlUmVxdWVzdC5kYXRhLmdldFN0cmluZygibnVtYmVycyIpOwogICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiZXh0cmFzIG5vdCBwYXNzZWQgb24gc2F2ZSIpLnRoYXQoZXh0cmFWYWx1ZSkuaXNFcXVhbFRvKCI0ODE1MTYyMzQyIik7Ci0KLSAgICAgICAgLy8gU2FuaXR5IGNoZWNrOiBvbmNlIHNhdmVkLCB0aGUgc2Vzc2lvbiBzaG91bGQgYmUgZmluaXNoZWQuCi0gICAgICAgIGFzc2VydE5vRGFuZ2xpbmdTZXNzaW9ucygpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC02MDYsNyArODk3LDcgQEAKICAgICAgICAgbUFjdGl2aXR5LmV4cGVjdEF1dG9GaWxsKCJkdWRlIiwgInN3ZWV0Iik7CiAKICAgICAgICAgLy8gVHJpZ2dlciBhdXRvLWZpbGwuCi0gICAgICAgIG1BY3Rpdml0eS5vblVzZXJuYW1lKFZpZXc6OnJlcXVlc3RGb2N1cyk7CisgICAgICAgIHJlcXVlc3RGb2N1c09uVXNlcm5hbWUoKTsKIAogICAgICAgICAvLyBTaW5jZSB0aGlzIGlzIGEgUHJlc3VibWl0IHRlc3QsIHdhaXQgZm9yIGNvbm5lY3Rpb24gdG8gYXZvaWQgZmxha2luZXNzLgogICAgICAgICB3YWl0VW50aWxDb25uZWN0ZWQoKTsKQEAgLTYyMCw3ICs5MTEsNyBAQAogICAgICAgICAgICAgcnVuU2hlbGxDb21tYW5kKCJhcHBvcHMgc2V0ICVzIFNZU1RFTV9BTEVSVF9XSU5ET1cgYWxsb3ciLCBtUGFja2FnZU5hbWUpOwogCiAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGZpbGwgVUkgaXMgc2hvd24uCi0gICAgICAgICAgICBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlRoZSBEdWRlIik7CisgICAgICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlRoZSBEdWRlIik7CiAKICAgICAgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOwogCkBAIC02NTAsNyArOTQxLDcgQEAKICAgICAgICAgICAgIGFzc2VydFRoYXQobGF0Y2guYXdhaXQoNSwgVGltZVVuaXQuU0VDT05EUykpLmlzVHJ1ZSgpOwogCiAgICAgICAgICAgICAvLyBBdXRvLWZpbGwgaXQuCi0gICAgICAgICAgICBzVWlCb3Quc2VsZWN0RGF0YXNldCgiVGhlIER1ZGUiKTsKKyAgICAgICAgICAgIG1VaUJvdC5zZWxlY3REYXRhc2V0KCJUaGUgRHVkZSIpOwogCiAgICAgICAgICAgICAvLyBDaGVjayB0aGUgcmVzdWx0cy4KICAgICAgICAgICAgIG1BY3Rpdml0eS5hc3NlcnRBdXRvRmlsbGVkKCk7CkBAIC02NzAsMjMgKzk2MSwyMCBAQAogICAgICAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoIldyb25nIHdlbGNvbWUgbXNnIikudGhhdChhY3R1YWxNZXNzYWdlKS5pc0VxdWFsVG8oZXhwZWN0ZWRNZXNzYWdlKTsKIAogICAgICAgICAgICAgLy8gQXNzZXJ0IHRoZSBzbmFjayBiYXIgaXMgc2hvd24gYW5kIHRhcCAiU2F2ZSIuCi0gICAgICAgICAgICBzVWlCb3Quc2F2ZUZvckF1dG9maWxsKHRydWUsIFNBVkVfREFUQV9UWVBFX1BBU1NXT1JEKTsKKyAgICAgICAgICAgIG1VaUJvdC5zYXZlRm9yQXV0b2ZpbGwodHJ1ZSwgU0FWRV9EQVRBX1RZUEVfUEFTU1dPUkQpOwogCiAgICAgICAgICAgICBmaW5hbCBTYXZlUmVxdWVzdCBzYXZlUmVxdWVzdCA9IHNSZXBsaWVyLmdldE5leHRTYXZlUmVxdWVzdCgpOwogCiAgICAgICAgICAgICAvLyBBc3NlcnQgdmFsdWUgb2YgZXhwZWN0ZWQgZmllbGRzIC0gc2hvdWxkIG5vdCBiZSBzYW5pdGl6ZWQuCiAgICAgICAgICAgICBmaW5hbCBWaWV3Tm9kZSB1c2VybmFtZSA9IGZpbmROb2RlQnlSZXNvdXJjZUlkKHNhdmVSZXF1ZXN0LnN0cnVjdHVyZSwgSURfVVNFUk5BTUUpOwogICAgICAgICAgICAgYXNzZXJ0VGV4dEFuZFZhbHVlKHVzZXJuYW1lLCAiZHVkZSIpOwotICAgICAgICAgICAgZmluYWwgVmlld05vZGUgcGFzc3dvcmQgPSBmaW5kTm9kZUJ5UmVzb3VyY2VJZChzYXZlUmVxdWVzdC5zdHJ1Y3R1cmUsIElEX1VTRVJOQU1FKTsKKyAgICAgICAgICAgIGZpbmFsIFZpZXdOb2RlIHBhc3N3b3JkID0gZmluZE5vZGVCeVJlc291cmNlSWQoc2F2ZVJlcXVlc3Quc3RydWN0dXJlLCBJRF9QQVNTV09SRCk7CiAgICAgICAgICAgICBhc3NlcnRUZXh0QW5kVmFsdWUocGFzc3dvcmQsICJkdWRlIik7CiAKICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBleHRyYXMgd2VyZSBwYXNzZWQgYmFjayBvbiBvblNhdmUoKQogICAgICAgICAgICAgYXNzZXJ0VGhhdChzYXZlUmVxdWVzdC5kYXRhKS5pc05vdE51bGwoKTsKICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBleHRyYVZhbHVlID0gc2F2ZVJlcXVlc3QuZGF0YS5nZXRTdHJpbmcoIm51bWJlcnMiKTsKICAgICAgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJleHRyYXMgbm90IHBhc3NlZCBvbiBzYXZlIikudGhhdChleHRyYVZhbHVlKS5pc0VxdWFsVG8oIjQ4MTUxNjIzNDIiKTsKLQotICAgICAgICAgICAgLy8gU2FuaXR5IGNoZWNrOiBvbmNlIHNhdmVkLCB0aGUgc2Vzc2lvbiBzaG91bGQgYmUgZmluaXNoZWQuCi0gICAgICAgICAgICBhc3NlcnROb0RhbmdsaW5nU2Vzc2lvbnMoKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBjYW4gbm8gbG9uZ2VyIGFkZCBvdmVybGF5cwogICAgICAgICAgICAgcnVuU2hlbGxDb21tYW5kKCJhcHBvcHMgc2V0ICVzIFNZU1RFTV9BTEVSVF9XSU5ET1cgaWdub3JlIiwgbVBhY2thZ2VOYW1lKTsKQEAgLTY5OSwxNiArOTg3LDE5IEBACiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gdGVzdEF1dG9GaWxsT25lRGF0YXNldCgpIGlzIGVub3VnaCB0byB0ZXN0IGVwaGVtZXJhbCBhcHBzCiAgICAgcHVibGljIHZvaWQgdGVzdEF1dG9GaWxsTXVsdGlwbGVEYXRhc2V0c1BpY2tGaXJzdCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBtdWx0aXBsZURhdGFzZXRzVGVzdCgxKTsKICAgICB9CiAKICAgICBAVGVzdAorICAgIEBBcHBNb2RlRnVsbCAvLyB0ZXN0QXV0b0ZpbGxPbmVEYXRhc2V0KCkgaXMgZW5vdWdoIHRvIHRlc3QgZXBoZW1lcmFsIGFwcHMKICAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0b0ZpbGxNdWx0aXBsZURhdGFzZXRzUGlja1NlY29uZCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBtdWx0aXBsZURhdGFzZXRzVGVzdCgyKTsKICAgICB9CiAKICAgICBAVGVzdAorICAgIEBBcHBNb2RlRnVsbCAvLyB0ZXN0QXV0b0ZpbGxPbmVEYXRhc2V0KCkgaXMgZW5vdWdoIHRvIHRlc3QgZXBoZW1lcmFsIGFwcHMKICAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0b0ZpbGxNdWx0aXBsZURhdGFzZXRzUGlja1RoaXJkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIG11bHRpcGxlRGF0YXNldHNUZXN0KDMpOwogICAgIH0KQEAgLTc1NSwxNCArMTA0NiwxNCBAQAogICAgICAgICB9CiAKICAgICAgICAgLy8gVHJpZ2dlciBhdXRvLWZpbGwuCi0gICAgICAgIG1BY3Rpdml0eS5vblVzZXJuYW1lKFZpZXc6OnJlcXVlc3RGb2N1cyk7CisgICAgICAgIHJlcXVlc3RGb2N1c09uVXNlcm5hbWUoKTsKICAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CiAKICAgICAgICAgLy8gTWFrZSBzdXJlIGFsbCBkYXRhc2V0cyBhcmUgc2hvd24uCi0gICAgICAgIGZpbmFsIFVpT2JqZWN0MiBwaWNrZXIgPSBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoIk1yIFBsb3ciLCAiRWwgQmFydG8iLCAiTXIgU3BhcmtsZSIpOworICAgICAgICBmaW5hbCBVaU9iamVjdDIgcGlja2VyID0gbVVpQm90LmFzc2VydERhdGFzZXRzKCJNciBQbG93IiwgIkVsIEJhcnRvIiwgIk1yIFNwYXJrbGUiKTsKIAogICAgICAgICAvLyBBdXRvLWZpbGwgaXQuCi0gICAgICAgIHNVaUJvdC5zZWxlY3REYXRhc2V0KHBpY2tlciwgbmFtZSk7CisgICAgICAgIG1VaUJvdC5zZWxlY3REYXRhc2V0KHBpY2tlciwgbmFtZSk7CiAKICAgICAgICAgLy8gQ2hlY2sgdGhlIHJlc3VsdHMuCiAgICAgICAgIG1BY3Rpdml0eS5hc3NlcnRBdXRvRmlsbGVkKCk7CkBAIC03ODcsMjEgKzEwNzgsMjEgQEAKICAgICAgICAgbUFjdGl2aXR5LmV4cGVjdEF1dG9GaWxsKCJkdWRlIiwgInN3ZWV0Iik7CiAKICAgICAgICAgLy8gVHJpZ2dlciBhdXRvLWZpbGwuCi0gICAgICAgIG1BY3Rpdml0eS5vblVzZXJuYW1lKFZpZXc6OnJlcXVlc3RGb2N1cyk7CisgICAgICAgIHJlcXVlc3RGb2N1c09uVXNlcm5hbWUoKTsKICAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CiAKICAgICAgICAgLy8gQ2hlY2sgaW5pdGlhbCBmaWVsZC4KLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJUaGUgRHVkZSIpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlRoZSBEdWRlIik7CiAKICAgICAgICAgLy8gVGhlbiBtb3ZlIGFyb3VuZC4uLgotICAgICAgICBtQWN0aXZpdHkub25QYXNzd29yZChWaWV3OjpyZXF1ZXN0Rm9jdXMpOwotICAgICAgICBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoIkR1ZGUncyBwYXNzd29yZCIpOwotICAgICAgICBtQWN0aXZpdHkub25Vc2VybmFtZShWaWV3OjpyZXF1ZXN0Rm9jdXMpOwotICAgICAgICBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlRoZSBEdWRlIik7CisgICAgICAgIHJlcXVlc3RGb2N1c09uUGFzc3dvcmQoKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJEdWRlJ3MgcGFzc3dvcmQiKTsKKyAgICAgICAgcmVxdWVzdEZvY3VzT25Vc2VybmFtZSgpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlRoZSBEdWRlIik7CiAKICAgICAgICAgLy8gQXV0by1maWxsIGl0LgotICAgICAgICBtQWN0aXZpdHkub25QYXNzd29yZChWaWV3OjpyZXF1ZXN0Rm9jdXMpOwotICAgICAgICBzVWlCb3Quc2VsZWN0RGF0YXNldCgiRHVkZSdzIHBhc3N3b3JkIik7CisgICAgICAgIHJlcXVlc3RGb2N1c09uUGFzc3dvcmQoKTsKKyAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQoIkR1ZGUncyBwYXNzd29yZCIpOwogCiAgICAgICAgIC8vIENoZWNrIHRoZSByZXN1bHRzLgogICAgICAgICBtQWN0aXZpdHkuYXNzZXJ0QXV0b0ZpbGxlZCgpOwpAQCAtODEyLDYgKzExMDMsNyBAQAogICAgICAqIGFuZCBwYXNzd29yZCkgYW5kIHRoZSBkYXRhc2V0IGl0c2VsZiwgYW5kIGVhY2ggZGF0YXNldCBoYXMgdGhlIHNhbWUgbnVtYmVyIG9mIGZpZWxkcy4KICAgICAgKi8KICAgICBAVGVzdAorICAgIEBBcHBNb2RlRnVsbCAvLyB0ZXN0QXV0b2ZpbGxPbmVEYXRhc2V0Q3VzdG9tUHJlc2VudGF0aW9uKCkgaXMgZW5vdWdoIHRvIHRlc3QgZXBoZW1lcmFsIGFwcHMKICAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0b2ZpbGxNdWx0aXBsZURhdGFzZXRzQ3VzdG9tUHJlc2VudGF0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBTZXQgc2VydmljZS4KICAgICAgICAgZW5hYmxlU2VydmljZSgpOwpAQCAtODMxLDIxICsxMTIzLDIxIEBACiAgICAgICAgIG1BY3Rpdml0eS5leHBlY3RBdXRvRmlsbCgidXNlcjEiLCAicGFzczEiKTsKIAogICAgICAgICAvLyBUcmlnZ2VyIGF1dG8tZmlsbC4KLSAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoVmlldzo6cmVxdWVzdEZvY3VzKTsKKyAgICAgICAgcmVxdWVzdEZvY3VzT25Vc2VybmFtZSgpOwogICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKIAogICAgICAgICAvLyBDaGVjayBpbml0aWFsIGZpZWxkLgotICAgICAgICBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoIkRhdGFzZXQxIiwgIlVzZXIyIik7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cygiRGF0YXNldDEiLCAiVXNlcjIiKTsKIAogICAgICAgICAvLyBUaGVuIG1vdmUgYXJvdW5kLi4uCi0gICAgICAgIG1BY3Rpdml0eS5vblBhc3N3b3JkKFZpZXc6OnJlcXVlc3RGb2N1cyk7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnREYXRhc2V0cygiUGFzczEiLCAiRGF0YXNldDIiKTsKLSAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoVmlldzo6cmVxdWVzdEZvY3VzKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJEYXRhc2V0MSIsICJVc2VyMiIpOworICAgICAgICByZXF1ZXN0Rm9jdXNPblBhc3N3b3JkKCk7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cygiUGFzczEiLCAiRGF0YXNldDIiKTsKKyAgICAgICAgcmVxdWVzdEZvY3VzT25Vc2VybmFtZSgpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIkRhdGFzZXQxIiwgIlVzZXIyIik7CiAKICAgICAgICAgLy8gQXV0by1maWxsIGl0LgotICAgICAgICBtQWN0aXZpdHkub25QYXNzd29yZChWaWV3OjpyZXF1ZXN0Rm9jdXMpOwotICAgICAgICBzVWlCb3Quc2VsZWN0RGF0YXNldCgiUGFzczEiKTsKKyAgICAgICAgcmVxdWVzdEZvY3VzT25QYXNzd29yZCgpOworICAgICAgICBtVWlCb3Quc2VsZWN0RGF0YXNldCgiUGFzczEiKTsKIAogICAgICAgICAvLyBDaGVjayB0aGUgcmVzdWx0cy4KICAgICAgICAgbUFjdGl2aXR5LmFzc2VydEF1dG9GaWxsZWQoKTsKQEAgLTg1Niw2ICsxMTQ4LDcgQEAKICAgICAgKiBhbmQgcGFzc3dvcmQpLCBhbmQgZWFjaCBkYXRhc2V0IGhhcyB0aGUgc2FtZSBudW1iZXIgb2YgZmllbGRzLgogICAgICAqLwogICAgIEBUZXN0CisgICAgQEFwcE1vZGVGdWxsIC8vIHRlc3RBdXRvZmlsbE9uZURhdGFzZXRDdXN0b21QcmVzZW50YXRpb24oKSBpcyBlbm91Z2ggdG8gdGVzdCBlcGhlbWVyYWwgYXBwcwogICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvZmlsbE11bHRpcGxlRGF0YXNldHNDdXN0b21QcmVzZW50YXRpb25TYW1lRmllbGRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFNldCBzZXJ2aWNlLgogICAgICAgICBlbmFibGVTZXJ2aWNlKCk7CkBAIC04NzQsMjEgKzExNjcsMjEgQEAKICAgICAgICAgbUFjdGl2aXR5LmV4cGVjdEF1dG9GaWxsKCJ1c2VyMSIsICJwYXNzMSIpOwogCiAgICAgICAgIC8vIFRyaWdnZXIgYXV0by1maWxsLgotICAgICAgICBtQWN0aXZpdHkub25Vc2VybmFtZShWaWV3OjpyZXF1ZXN0Rm9jdXMpOworICAgICAgICByZXF1ZXN0Rm9jdXNPblVzZXJuYW1lKCk7CiAgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwogCiAgICAgICAgIC8vIENoZWNrIGluaXRpYWwgZmllbGQuCi0gICAgICAgIHNVaUJvdC5hc3NlcnREYXRhc2V0cygiVXNlcjEiLCAiVXNlcjIiKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJVc2VyMSIsICJVc2VyMiIpOwogCiAgICAgICAgIC8vIFRoZW4gbW92ZSBhcm91bmQuLi4KLSAgICAgICAgbUFjdGl2aXR5Lm9uUGFzc3dvcmQoVmlldzo6cmVxdWVzdEZvY3VzKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJQYXNzMSIsICJQYXNzMiIpOwotICAgICAgICBtQWN0aXZpdHkub25Vc2VybmFtZShWaWV3OjpyZXF1ZXN0Rm9jdXMpOwotICAgICAgICBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlVzZXIxIiwgIlVzZXIyIik7CisgICAgICAgIHJlcXVlc3RGb2N1c09uUGFzc3dvcmQoKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJQYXNzMSIsICJQYXNzMiIpOworICAgICAgICByZXF1ZXN0Rm9jdXNPblVzZXJuYW1lKCk7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cygiVXNlcjEiLCAiVXNlcjIiKTsKIAogICAgICAgICAvLyBBdXRvLWZpbGwgaXQuCi0gICAgICAgIG1BY3Rpdml0eS5vblBhc3N3b3JkKFZpZXc6OnJlcXVlc3RGb2N1cyk7Ci0gICAgICAgIHNVaUJvdC5zZWxlY3REYXRhc2V0KCJQYXNzMSIpOworICAgICAgICByZXF1ZXN0Rm9jdXNPblBhc3N3b3JkKCk7CisgICAgICAgIG1VaUJvdC5zZWxlY3REYXRhc2V0KCJQYXNzMSIpOwogCiAgICAgICAgIC8vIENoZWNrIHRoZSByZXN1bHRzLgogICAgICAgICBtQWN0aXZpdHkuYXNzZXJ0QXV0b0ZpbGxlZCgpOwpAQCAtODk5LDYgKzExOTIsNyBAQAogICAgICAqIGFuZCBwYXNzd29yZCksIGJ1dCBlYWNoIGRhdGFzZXQgaGFzIGEgZGlmZmVyZW50IG51bWJlciBvZiBmaWVsZHMuCiAgICAgICovCiAgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gdGVzdEF1dG9maWxsT25lRGF0YXNldEN1c3RvbVByZXNlbnRhdGlvbigpIGlzIGVub3VnaCB0byB0ZXN0IGVwaGVtZXJhbCBhcHBzCiAgICAgcHVibGljIHZvaWQgdGVzdEF1dG9maWxsTXVsdGlwbGVEYXRhc2V0c0N1c3RvbVByZXNlbnRhdGlvbkZpcnN0RGF0YXNldE1pc3NpbmdTZWNvbmRGaWVsZCgpCiAgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gU2V0IHNlcnZpY2UuCkBAIC05MTcsMjAgKzEyMTEsMjAgQEAKICAgICAgICAgbUFjdGl2aXR5LmV4cGVjdEF1dG9GaWxsKCJ1c2VyMiIsICJwYXNzMiIpOwogCiAgICAgICAgIC8vIFRyaWdnZXIgYXV0by1maWxsLgotICAgICAgICBtQWN0aXZpdHkub25Vc2VybmFtZShWaWV3OjpyZXF1ZXN0Rm9jdXMpOworICAgICAgICByZXF1ZXN0Rm9jdXNPblVzZXJuYW1lKCk7CiAgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwogCiAgICAgICAgIC8vIENoZWNrIGluaXRpYWwgZmllbGQuCi0gICAgICAgIHNVaUJvdC5hc3NlcnREYXRhc2V0cygiVXNlcjEiLCAiVXNlcjIiKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJVc2VyMSIsICJVc2VyMiIpOwogCiAgICAgICAgIC8vIFRoZW4gbW92ZSBhcm91bmQuLi4KLSAgICAgICAgbUFjdGl2aXR5Lm9uUGFzc3dvcmQoVmlldzo6cmVxdWVzdEZvY3VzKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJQYXNzMiIpOwotICAgICAgICBtQWN0aXZpdHkub25Vc2VybmFtZShWaWV3OjpyZXF1ZXN0Rm9jdXMpOwotICAgICAgICBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlVzZXIxIiwgIlVzZXIyIik7CisgICAgICAgIHJlcXVlc3RGb2N1c09uUGFzc3dvcmQoKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJQYXNzMiIpOworICAgICAgICByZXF1ZXN0Rm9jdXNPblVzZXJuYW1lKCk7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cygiVXNlcjEiLCAiVXNlcjIiKTsKIAogICAgICAgICAvLyBBdXRvLWZpbGwgaXQuCi0gICAgICAgIHNVaUJvdC5zZWxlY3REYXRhc2V0KCJVc2VyMiIpOworICAgICAgICBtVWlCb3Quc2VsZWN0RGF0YXNldCgiVXNlcjIiKTsKIAogICAgICAgICAvLyBDaGVjayB0aGUgcmVzdWx0cy4KICAgICAgICAgbUFjdGl2aXR5LmFzc2VydEF1dG9GaWxsZWQoKTsKQEAgLTk0MSw2ICsxMjM1LDcgQEAKICAgICAgKiBhbmQgcGFzc3dvcmQpLCBidXQgZWFjaCBkYXRhc2V0IGhhcyBhIGRpZmZlcmVudCBudW1iZXIgb2YgZmllbGRzLgogICAgICAqLwogICAgIEBUZXN0CisgICAgQEFwcE1vZGVGdWxsIC8vIHRlc3RBdXRvZmlsbE9uZURhdGFzZXRDdXN0b21QcmVzZW50YXRpb24oKSBpcyBlbm91Z2ggdG8gdGVzdCBlcGhlbWVyYWwgYXBwcwogICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvZmlsbE11bHRpcGxlRGF0YXNldHNDdXN0b21QcmVzZW50YXRpb25TZWNvbmREYXRhc2V0TWlzc2luZ0ZpcnN0RmllbGQoKQogICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFNldCBzZXJ2aWNlLgpAQCAtOTU5LDI0NyArMTI1NCwzMyBAQAogICAgICAgICBtQWN0aXZpdHkuZXhwZWN0QXV0b0ZpbGwoInVzZXIxIiwgInBhc3MxIik7CiAKICAgICAgICAgLy8gVHJpZ2dlciBhdXRvLWZpbGwuCi0gICAgICAgIG1BY3Rpdml0eS5vblVzZXJuYW1lKFZpZXc6OnJlcXVlc3RGb2N1cyk7CisgICAgICAgIHJlcXVlc3RGb2N1c09uVXNlcm5hbWUoKTsKICAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CiAKICAgICAgICAgLy8gQ2hlY2sgaW5pdGlhbCBmaWVsZC4KLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJVc2VyMSIpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlVzZXIxIik7CiAKICAgICAgICAgLy8gVGhlbiBtb3ZlIGFyb3VuZC4uLgotICAgICAgICBtQWN0aXZpdHkub25QYXNzd29yZChWaWV3OjpyZXF1ZXN0Rm9jdXMpOwotICAgICAgICBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlBhc3MxIiwgIlBhc3MyIik7Ci0gICAgICAgIG1BY3Rpdml0eS5vblVzZXJuYW1lKFZpZXc6OnJlcXVlc3RGb2N1cyk7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnREYXRhc2V0cygiVXNlcjEiKTsKKyAgICAgICAgcmVxdWVzdEZvY3VzT25QYXNzd29yZCgpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlBhc3MxIiwgIlBhc3MyIik7CisgICAgICAgIHJlcXVlc3RGb2N1c09uVXNlcm5hbWUoKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJVc2VyMSIpOwogCiAgICAgICAgIC8vIEF1dG8tZmlsbCBpdC4KLSAgICAgICAgc1VpQm90LnNlbGVjdERhdGFzZXQoIlVzZXIxIik7CisgICAgICAgIG1VaUJvdC5zZWxlY3REYXRhc2V0KCJVc2VyMSIpOwogCiAgICAgICAgIC8vIENoZWNrIHRoZSByZXN1bHRzLgogICAgICAgICBtQWN0aXZpdHkuYXNzZXJ0QXV0b0ZpbGxlZCgpOwogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgZmlsdGVyVGV4dCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBTdHJpbmcgQUEgPSAiVHdvIEEncyI7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBBQiA9ICJBIGFuZCBCIjsKLSAgICAgICAgZmluYWwgU3RyaW5nIEIgPSAiT25seSBCIjsKLQotICAgICAgICBlbmFibGVTZXJ2aWNlKCk7Ci0KLSAgICAgICAgLy8gU2V0IGV4cGVjdGF0aW9ucy4KLSAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UobmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAuYWRkRGF0YXNldChuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgImFhIikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKEFBKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQotICAgICAgICAgICAgICAgIC5hZGREYXRhc2V0KG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1VTRVJOQU1FLCAiYWIiKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oQUIpKQotICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCi0gICAgICAgICAgICAgICAgLmFkZERhdGFzZXQobmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfVVNFUk5BTUUsICJiIikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKEIpKQotICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCi0gICAgICAgICAgICAgICAgLmJ1aWxkKCkpOwotCi0gICAgICAgIC8vIFRyaWdnZXIgYXV0by1maWxsLgotICAgICAgICBtQWN0aXZpdHkub25Vc2VybmFtZShWaWV3OjpyZXF1ZXN0Rm9jdXMpOwotICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKLQotICAgICAgICAvLyBXaXRoIG5vIGZpbHRlciB0ZXh0IGFsbCBkYXRhc2V0cyBzaG91bGQgYmUgc2hvd24KLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKEFBLCBBQiwgQik7Ci0KLSAgICAgICAgLy8gT25seSB0d28gZGF0YXNldHMgc3RhcnQgd2l0aCAnYScKLSAgICAgICAgcnVuU2hlbGxDb21tYW5kKCJpbnB1dCBrZXlldmVudCBLRVlDT0RFX0EiKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKEFBLCBBQik7Ci0KLSAgICAgICAgLy8gT25seSBvbmUgZGF0YXNldCBzdGFydCB3aXRoICdhYScKLSAgICAgICAgcnVuU2hlbGxDb21tYW5kKCJpbnB1dCBrZXlldmVudCBLRVlDT0RFX0EiKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKEFBKTsKLQotICAgICAgICAvLyBPbmx5IHR3byBkYXRhc2V0cyBzdGFydCB3aXRoICdhJwotICAgICAgICBydW5TaGVsbENvbW1hbmQoImlucHV0IGtleWV2ZW50IEtFWUNPREVfREVMIik7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnREYXRhc2V0cyhBQSwgQUIpOwotCi0gICAgICAgIC8vIFdpdGggbm8gZmlsdGVyIHRleHQgYWxsIGRhdGFzZXRzIHNob3VsZCBiZSBzaG93bgotICAgICAgICBydW5TaGVsbENvbW1hbmQoImlucHV0IGtleWV2ZW50IEtFWUNPREVfREVMIik7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnREYXRhc2V0cyhBQSwgQUIsIEIpOwotCi0gICAgICAgIC8vIE5vIGRhdGFzZXQgc3RhcnQgd2l0aCAnYWFhJwotICAgICAgICBydW5TaGVsbENvbW1hbmQoImlucHV0IGtleWV2ZW50IEtFWUNPREVfQSIpOwotICAgICAgICBydW5TaGVsbENvbW1hbmQoImlucHV0IGtleWV2ZW50IEtFWUNPREVfQSIpOwotICAgICAgICBydW5TaGVsbENvbW1hbmQoImlucHV0IGtleWV2ZW50IEtFWUNPREVfQSIpOwotICAgICAgICBzVWlCb3QuYXNzZXJ0Tm9EYXRhc2V0cygpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgZmlsdGVyVGV4dF91c2luZ0tleWJvYXJkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNNb2NrSW1lU2Vzc2lvblJ1bGUuYXNzdW1lQXZhaWxhYmxlKCk7Ci0gICAgICAgIExvZy52KFRBRywgImZpbHRlclRleHRfdXNpbmdLZXlib2FyZCgpOiBHb29kIE5ld3MsIEV2ZXJ5b25lISBNb2NrSW1lIGlzIGF2YWlsYWJsZSEiKTsKLQotICAgICAgICBmaW5hbCBTdHJpbmcgQUEgPSAiVHdvIEEncyI7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBBQiA9ICJBIGFuZCBCIjsKLSAgICAgICAgZmluYWwgU3RyaW5nIEIgPSAiT25seSBCIjsKLQotICAgICAgICBmaW5hbCBNb2NrSW1lU2Vzc2lvbiBtb2NrSW1lU2Vzc2lvbiA9IHNNb2NrSW1lU2Vzc2lvblJ1bGUuZ2V0TW9ja0ltZVNlc3Npb24oKTsKLQotICAgICAgICBlbmFibGVTZXJ2aWNlKCk7Ci0KLSAgICAgICAgLy8gU2V0IGV4cGVjdGF0aW9ucy4KLSAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UobmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAuYWRkRGF0YXNldChuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgImFhIikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKEFBKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQotICAgICAgICAgICAgICAgIC5hZGREYXRhc2V0KG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1VTRVJOQU1FLCAiYWIiKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oQUIpKQotICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCi0gICAgICAgICAgICAgICAgLmFkZERhdGFzZXQobmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfVVNFUk5BTUUsICJiIikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKEIpKQotICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCi0gICAgICAgICAgICAgICAgLmJ1aWxkKCkpOwotCi0gICAgICAgIGZpbmFsIEltZUV2ZW50U3RyZWFtIHN0cmVhbSA9IG1vY2tJbWVTZXNzaW9uLm9wZW5FdmVudFN0cmVhbSgpOwotCi0gICAgICAgIC8vIFRyaWdnZXIgYXV0by1maWxsLgotICAgICAgICBtQWN0aXZpdHkub25Vc2VybmFtZShWaWV3OjpyZXF1ZXN0Rm9jdXMpOwotICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKLQotICAgICAgICAvLyBXYWl0IHVudGlsIHRoZSBNb2NrSW1lIGdldHMgYm91bmQgdG8gdGhlIFRlc3RBY3Rpdml0eS4KLSAgICAgICAgZXhwZWN0QmluZElucHV0KHN0cmVhbSwgUHJvY2Vzcy5teVBpZCgpLCBNT0NLX0lNRV9USU1FT1VUX01TKTsKLSAgICAgICAgZXhwZWN0RXZlbnQoc3RyZWFtLCBlZGl0b3JNYXRjaGVyKCJvblN0YXJ0SW5wdXQiLCBtQWN0aXZpdHkuZ2V0VXNlcm5hbWUoKS5nZXRJZCgpKSwKLSAgICAgICAgICAgICAgICBNT0NLX0lNRV9USU1FT1VUX01TKTsKLQotICAgICAgICAvLyBXaXRoIG5vIGZpbHRlciB0ZXh0IGFsbCBkYXRhc2V0cyBzaG91bGQgYmUgc2hvd24KLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKEFBLCBBQiwgQik7Ci0KLSAgICAgICAgLy8gT25seSB0d28gZGF0YXNldHMgc3RhcnQgd2l0aCAnYScKLSAgICAgICAgZmluYWwgSW1lQ29tbWFuZCBjbWQxID0gbW9ja0ltZVNlc3Npb24uY2FsbENvbW1pdFRleHQoImEiLCAxKTsKLSAgICAgICAgZXhwZWN0Q29tbWFuZChzdHJlYW0sIGNtZDEsIE1PQ0tfSU1FX1RJTUVPVVRfTVMpOwotICAgICAgICBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoQUEsIEFCKTsKLQotICAgICAgICAvLyBPbmx5IG9uZSBkYXRhc2V0IHN0YXJ0IHdpdGggJ2FhJwotICAgICAgICBmaW5hbCBJbWVDb21tYW5kIGNtZDIgPSBtb2NrSW1lU2Vzc2lvbi5jYWxsQ29tbWl0VGV4dCgiYSIsIDEpOwotICAgICAgICBleHBlY3RDb21tYW5kKHN0cmVhbSwgY21kMiwgTU9DS19JTUVfVElNRU9VVF9NUyk7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnREYXRhc2V0cyhBQSk7Ci0KLSAgICAgICAgLy8gT25seSB0d28gZGF0YXNldHMgc3RhcnQgd2l0aCAnYScKLSAgICAgICAgcnVuU2hlbGxDb21tYW5kKCJpbnB1dCBrZXlldmVudCBLRVlDT0RFX0RFTCIpOyAvLyBOT1RFOiBNb2NrSW1lIG9uIE8gZG9lc24ndCBzdXBwb3J0IGl0Ci0gICAgICAgIHNVaUJvdC5hc3NlcnREYXRhc2V0cyhBQSwgQUIpOwotCi0gICAgICAgIC8vIFdpdGggbm8gZmlsdGVyIHRleHQgYWxsIGRhdGFzZXRzIHNob3VsZCBiZSBzaG93bgotICAgICAgICBydW5TaGVsbENvbW1hbmQoImlucHV0IGtleWV2ZW50IEtFWUNPREVfREVMIik7IC8vIE5PVEU6IE1vY2tJbWUgb24gTyBkb2Vzbid0IHN1cHBvcnQgaXQKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKEFBLCBBQiwgQik7Ci0KLSAgICAgICAgLy8gTm8gZGF0YXNldCBzdGFydCB3aXRoICdhYWEnCi0gICAgICAgIGZpbmFsIEltZUNvbW1hbmQgY21kNSA9IG1vY2tJbWVTZXNzaW9uLmNhbGxDb21taXRUZXh0KCJhYWEiLCAxKTsKLSAgICAgICAgZXhwZWN0Q29tbWFuZChzdHJlYW0sIGNtZDUsIE1PQ0tfSU1FX1RJTUVPVVRfTVMpOwotICAgICAgICBzVWlCb3QuYXNzZXJ0Tm9EYXRhc2V0cygpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgZmlsdGVyVGV4dE51bGxWYWx1ZXNBbHdheXNNYXRjaGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBBQSA9ICJUd28gQSdzIjsKLSAgICAgICAgZmluYWwgU3RyaW5nIEFCID0gIkEgYW5kIEIiOwotICAgICAgICBmaW5hbCBTdHJpbmcgQiA9ICJPbmx5IEIiOwotCi0gICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKLQotICAgICAgICAvLyBTZXQgZXhwZWN0YXRpb25zLgotICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgIC5hZGREYXRhc2V0KG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1VTRVJOQU1FLCAiYWEiKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oQUEpKQotICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCi0gICAgICAgICAgICAgICAgLmFkZERhdGFzZXQobmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfVVNFUk5BTUUsICJhYiIpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbihBQikpCi0gICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKLSAgICAgICAgICAgICAgICAuYWRkRGF0YXNldChuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgKFN0cmluZykgbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKEIpKQotICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCi0gICAgICAgICAgICAgICAgLmJ1aWxkKCkpOwotCi0gICAgICAgIC8vIFRyaWdnZXIgYXV0by1maWxsLgotICAgICAgICBtQWN0aXZpdHkub25Vc2VybmFtZShWaWV3OjpyZXF1ZXN0Rm9jdXMpOwotICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKLQotICAgICAgICAvLyBXaXRoIG5vIGZpbHRlciB0ZXh0IGFsbCBkYXRhc2V0cyBzaG91bGQgYmUgc2hvd24KLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKEFBLCBBQiwgQik7Ci0KLSAgICAgICAgLy8gVHdvIGRhdGFzZXRzIHN0YXJ0IHdpdGggJ2EnIGFuZCBvbmUgd2l0aCBudWxsIHZhbHVlIGFsd2F5cyBzaG93bgotICAgICAgICBydW5TaGVsbENvbW1hbmQoImlucHV0IGtleWV2ZW50IEtFWUNPREVfQSIpOwotICAgICAgICBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoQUEsIEFCLCBCKTsKLQotICAgICAgICAvLyBPbmUgZGF0YXNldCBzdGFydCB3aXRoICdhYScgYW5kIG9uZSB3aXRoIG51bGwgdmFsdWUgYWx3YXlzIHNob3duCi0gICAgICAgIHJ1blNoZWxsQ29tbWFuZCgiaW5wdXQga2V5ZXZlbnQgS0VZQ09ERV9BIik7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnREYXRhc2V0cyhBQSwgQik7Ci0KLSAgICAgICAgLy8gVHdvIGRhdGFzZXRzIHN0YXJ0IHdpdGggJ2EnIGFuZCBvbmUgd2l0aCBudWxsIHZhbHVlIGFsd2F5cyBzaG93bgotICAgICAgICBydW5TaGVsbENvbW1hbmQoImlucHV0IGtleWV2ZW50IEtFWUNPREVfREVMIik7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnREYXRhc2V0cyhBQSwgQUIsIEIpOwotCi0gICAgICAgIC8vIFdpdGggbm8gZmlsdGVyIHRleHQgYWxsIGRhdGFzZXRzIHNob3VsZCBiZSBzaG93bgotICAgICAgICBydW5TaGVsbENvbW1hbmQoImlucHV0IGtleWV2ZW50IEtFWUNPREVfREVMIik7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnREYXRhc2V0cyhBQSwgQUIsIEIpOwotCi0gICAgICAgIC8vIE5vIGRhdGFzZXQgc3RhcnQgd2l0aCAnYWFhJyBhbmQgb25lIHdpdGggbnVsbCB2YWx1ZSBhbHdheXMgc2hvd24KLSAgICAgICAgcnVuU2hlbGxDb21tYW5kKCJpbnB1dCBrZXlldmVudCBLRVlDT0RFX0EiKTsKLSAgICAgICAgcnVuU2hlbGxDb21tYW5kKCJpbnB1dCBrZXlldmVudCBLRVlDT0RFX0EiKTsKLSAgICAgICAgcnVuU2hlbGxDb21tYW5kKCJpbnB1dCBrZXlldmVudCBLRVlDT0RFX0EiKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKEIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgZmlsdGVyVGV4dERpZmZlcmVudFByZWZpeGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBBID0gImFhYSI7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBCID0gImJyYSI7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBDID0gImNhZGFicmEiOwotCi0gICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKLQotICAgICAgICAvLyBTZXQgZXhwZWN0YXRpb25zLgotICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgIC5hZGREYXRhc2V0KG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1VTRVJOQU1FLCBBKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oQSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKLSAgICAgICAgICAgICAgICAuYWRkRGF0YXNldChuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgQikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKEIpKQotICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCi0gICAgICAgICAgICAgICAgLmFkZERhdGFzZXQobmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfVVNFUk5BTUUsIEMpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbihDKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQotICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKLQotICAgICAgICAvLyBUcmlnZ2VyIGF1dG8tZmlsbC4KLSAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoVmlldzo6cmVxdWVzdEZvY3VzKTsKLSAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7Ci0KLSAgICAgICAgLy8gV2l0aCBubyBmaWx0ZXIgdGV4dCBhbGwgZGF0YXNldHMgc2hvdWxkIGJlIHNob3duCi0gICAgICAgIHNVaUJvdC5hc3NlcnREYXRhc2V0cyhBLCBCLCBDKTsKLQotICAgICAgICBtQWN0aXZpdHkub25Vc2VybmFtZSgodikgLT4gdi5zZXRUZXh0KCJhIikpOwotICAgICAgICBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoQSk7Ci0KLSAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoKHYpIC0+IHYuc2V0VGV4dCgiYiIpKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKEIpOwotCi0gICAgICAgIG1BY3Rpdml0eS5vblVzZXJuYW1lKCh2KSAtPiB2LnNldFRleHQoImMiKSk7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnREYXRhc2V0cyhDKTsKLSAgICB9Ci0KLSAgICBAVGVzdAorICAgIEBBcHBNb2RlRnVsbCAvLyB0ZXN0QXV0b0ZpbGxPbmVEYXRhc2V0QW5kU2F2ZSgpIGlzIGVub3VnaCB0byB0ZXN0IGVwaGVtZXJhbCBhcHBzCiAgICAgcHVibGljIHZvaWQgdGVzdFNhdmVPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHNhdmVPbmx5VGVzdChmYWxzZSk7CiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gdGVzdEF1dG9GaWxsT25lRGF0YXNldEFuZFNhdmUoKSBpcyBlbm91Z2ggdG8gdGVzdCBlcGhlbWVyYWwgYXBwcwogICAgIHB1YmxpYyB2b2lkIHRlc3RTYXZlT25seVRyaWdnZXJlZE1hbnVhbGx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHNhdmVPbmx5VGVzdChmYWxzZSk7CiAgICAgfQpAQCAtMTIyMCw3ICsxMzAxLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIFNhbml0eSBjaGVjay4KLSAgICAgICAgc1VpQm90LmFzc2VydE5vRGF0YXNldHMoKTsKKyAgICAgICAgbVVpQm90LmFzc2VydE5vRGF0YXNldHNFdmVyKCk7CiAKICAgICAgICAgLy8gV2FpdCBmb3Igb25GaWxsKCkgYmVmb3JlIHByb2NlZWRpbmcsIG90aGVyd2lzZSB0aGUgZmllbGRzIG1pZ2h0IGJlIGNoYW5nZWQgYmVmb3JlCiAgICAgICAgIC8vIHRoZSBzZXNzaW9uIHN0YXJ0ZWQKQEAgLTEyMzYsMTAgKzEzMTcsMTEgQEAKICAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoIldyb25nIHdlbGNvbWUgbXNnIikudGhhdChhY3R1YWxNZXNzYWdlKS5pc0VxdWFsVG8oZXhwZWN0ZWRNZXNzYWdlKTsKIAogICAgICAgICAvLyBBc3NlcnQgdGhlIHNuYWNrIGJhciBpcyBzaG93biBhbmQgdGFwICJTYXZlIi4KLSAgICAgICAgc1VpQm90LnNhdmVGb3JBdXRvZmlsbCh0cnVlLCBTQVZFX0RBVEFfVFlQRV9QQVNTV09SRCk7CisgICAgICAgIG1VaUJvdC5zYXZlRm9yQXV0b2ZpbGwodHJ1ZSwgU0FWRV9EQVRBX1RZUEVfUEFTU1dPUkQpOwogCiAgICAgICAgIGZpbmFsIFNhdmVSZXF1ZXN0IHNhdmVSZXF1ZXN0ID0gc1JlcGxpZXIuZ2V0TmV4dFNhdmVSZXF1ZXN0KCk7Ci0gICAgICAgIHNSZXBsaWVyLmFzc2VydE51bWJlclVuaGFuZGxlZFNhdmVSZXF1ZXN0cygwKTsKKyAgICAgICAgc1JlcGxpZXIuYXNzZXJ0Tm9VbmhhbmRsZWRTYXZlUmVxdWVzdHMoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzYXZlUmVxdWVzdC5kYXRhc2V0SWRzKS5pc051bGwoKTsKIAogICAgICAgICAvLyBBc3NlcnQgdmFsdWUgb2YgZXhwZWN0ZWQgZmllbGRzIC0gc2hvdWxkIG5vdCBiZSBzYW5pdGl6ZWQuCiAgICAgICAgIHRyeSB7CkBAIC0xMjUxLDkgKzEzMzMsNiBAQAogICAgICAgICAgICAgZHVtcFN0cnVjdHVyZSgic2F2ZU9ubHlUZXN0KCkgZmFpbGVkIiwgc2F2ZVJlcXVlc3Quc3RydWN0dXJlKTsKICAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgIH0KLQotICAgICAgICAvLyBTYW5pdHkgY2hlY2s6IG9uY2Ugc2F2ZWQsIHRoZSBzZXNzaW9uIHNob3VsZCBiZSBmaW5pc2hlZC4KLSAgICAgICAgYXNzZXJ0Tm9EYW5nbGluZ1Nlc3Npb25zKCk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTEyNjcsMzQgKzEzNDYsMTAgQEAKICAgICB9CiAKICAgICBAVGVzdAotICAgIEBJZ25vcmUoIlRlc3QgZmFpbCBvbiBzb21lIGRldmljZXMgYmVjYXVzZSBSZWNlbnRzIFVJIGlzIG5vdCB3ZWxsIGRlZmluZWQ6IGIvNzIwNDQ2ODUiKQotICAgIHB1YmxpYyB2b2lkIHRlc3RTYXZlR29lc0F3YXlXaGVuVGFwcGluZ1JlY2VudHNCdXR0b24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gTGF1bmNoZXMgbmV3IGFjdGl2aXR5IGZpcnN0Li4uCi0gICAgICAgIHN0YXJ0Q2hlY2tvdXRBY3Rpdml0eUFzTmV3VGFzaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gLi4gdGhlbiB0aGUgcmVhbCBhY3Rpdml0eSBiZWluZyB0ZXN0ZWQuCi0gICAgICAgICAgICBzVWlCb3Quc3dpdGNoQXBwc1VzaW5nUmVjZW50cygpOwotICAgICAgICAgICAgc1VpQm90LmFzc2VydFNob3duQnlSZWxhdGl2ZUlkKElEX1VTRVJOQU1FX0NPTlRBSU5FUik7Ci0KLSAgICAgICAgICAgIHNhdmVHb2VzQXdheShEaXNtaXNzVHlwZS5SRUNFTlRTX0JVVFRPTik7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBDaGVja291dEFjdGl2aXR5LmZpbmlzaEl0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTYXZlR29lc0F3YXlXaGVuVG91Y2hpbmdPdXRzaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHNhdmVHb2VzQXdheShEaXNtaXNzVHlwZS5UT1VDSF9PVVRTSURFKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgc3RhcnRDaGVja291dEFjdGl2aXR5QXNOZXdUYXNrKCkgewotICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChtQ29udGV4dCwgQ2hlY2tvdXRBY3Rpdml0eS5jbGFzcyk7Ci0gICAgICAgIGludGVudC5zZXRGbGFncygKLSAgICAgICAgICAgICAgICBJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfRE9DVU1FTlQgfCBJbnRlbnQuRkxBR19BQ1RJVklUWV9SRVRBSU5fSU5fUkVDRU5UUyk7Ci0gICAgICAgIG1Db250ZXh0LnN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKLSAgICAgICAgc1VpQm90LmFzc2VydFNob3duQnlSZWxhdGl2ZUlkKENoZWNrb3V0QWN0aXZpdHkuSURfQUREUkVTUyk7Ci0gICAgfQotCiAgICAgcHJpdmF0ZSB2b2lkIHNhdmVHb2VzQXdheShEaXNtaXNzVHlwZSBkaXNtaXNzVHlwZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKIApAQCAtMTMwNyw3ICsxMzYyLDcgQEAKICAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoVmlldzo6cmVxdWVzdEZvY3VzKTsKIAogICAgICAgICAvLyBTYW5pdHkgY2hlY2suCi0gICAgICAgIHNVaUJvdC5hc3NlcnROb0RhdGFzZXRzKCk7CisgICAgICAgIG1VaUJvdC5hc3NlcnROb0RhdGFzZXRzRXZlcigpOwogCiAgICAgICAgIC8vIFdhaXQgZm9yIG9uRmlsbCgpIGJlZm9yZSBwcm9jZWVkaW5nLCBvdGhlcndpc2UgdGhlIGZpZWxkcyBtaWdodCBiZSBjaGFuZ2VkIGJlZm9yZQogICAgICAgICAvLyB0aGUgc2Vzc2lvbiBzdGFydGVkCkBAIC0xMzIzLDM1ICsxMzc4LDMzIEBACiAgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJXcm9uZyB3ZWxjb21lIG1zZyIpLnRoYXQoYWN0dWFsTWVzc2FnZSkuaXNFcXVhbFRvKGV4cGVjdGVkTWVzc2FnZSk7CiAKICAgICAgICAgLy8gQXNzZXJ0IHRoZSBzbmFjayBiYXIgaXMgc2hvd24gYW5kIHRhcCAiU2F2ZSIuCi0gICAgICAgIHNVaUJvdC5hc3NlcnRTYXZlU2hvd2luZyhTQVZFX0RBVEFfVFlQRV9QQVNTV09SRCk7CisgICAgICAgIG1VaUJvdC5hc3NlcnRTYXZlU2hvd2luZyhTQVZFX0RBVEFfVFlQRV9QQVNTV09SRCk7CiAKICAgICAgICAgLy8gVGhlbiBtYWtlIHN1cmUgaXQgZ29lcyBhd2F5IHdoZW4gdXNlciBkb2Vzbid0IHdhbnQgaXQuLgogICAgICAgICBzd2l0Y2ggKGRpc21pc3NUeXBlKSB7CiAgICAgICAgICAgICBjYXNlIEJBQ0tfQlVUVE9OOgotICAgICAgICAgICAgICAgIHNVaUJvdC5wcmVzc0JhY2soKTsKKyAgICAgICAgICAgICAgICBtVWlCb3QucHJlc3NCYWNrKCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIEhPTUVfQlVUVE9OOgotICAgICAgICAgICAgICAgIHNVaUJvdC5wcmVzc0hvbWUoKTsKKyAgICAgICAgICAgICAgICBtVWlCb3QucHJlc3NIb21lKCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFRPVUNIX09VVFNJREU6Ci0gICAgICAgICAgICAgICAgc1VpQm90LmFzc2VydFNob3duQnlUZXh0KGV4cGVjdGVkTWVzc2FnZSkuY2xpY2soKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUkVDRU5UU19CVVRUT046Ci0gICAgICAgICAgICAgICAgc1VpQm90LnN3aXRjaEFwcHNVc2luZ1JlY2VudHMoKTsKLSAgICAgICAgICAgICAgICBzVWlCb3QuYXNzZXJ0U2hvd25CeVJlbGF0aXZlSWQoQ2hlY2tvdXRBY3Rpdml0eS5JRF9BRERSRVNTKTsKKyAgICAgICAgICAgICAgICBtVWlCb3QuYXNzZXJ0U2hvd25CeVRleHQoZXhwZWN0ZWRNZXNzYWdlKS5jbGljaygpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIGRpc21pc3MgdHlwZTogIiArIGRpc21pc3NUeXBlKTsKICAgICAgICAgfQotICAgICAgICBzVWlCb3QuYXNzZXJ0U2F2ZU5vdFNob3dpbmcoU0FWRV9EQVRBX1RZUEVfUEFTU1dPUkQpOworICAgICAgICBtVWlCb3QuYXNzZXJ0U2F2ZU5vdFNob3dpbmcoU0FWRV9EQVRBX1RZUEVfUEFTU1dPUkQpOwogICAgIH0KIAogICAgIEBUZXN0CisgICAgQEFwcE1vZGVGdWxsIC8vIHRlc3RBdXRvRmlsbE9uZURhdGFzZXRBbmRTYXZlKCkgaXMgZW5vdWdoIHRvIHRlc3QgZXBoZW1lcmFsIGFwcHMKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2F2ZU9ubHlQcmVGaWxsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgc2F2ZU9ubHlUZXN0UHJlRmlsbGVkKGZhbHNlKTsKICAgICB9CiAKICAgICBAVGVzdAorICAgIEBBcHBNb2RlRnVsbCAvLyB0ZXN0QXV0b0ZpbGxPbmVEYXRhc2V0QW5kU2F2ZSgpIGlzIGVub3VnaCB0byB0ZXN0IGVwaGVtZXJhbCBhcHBzCiAgICAgcHVibGljIHZvaWQgdGVzdFNhdmVPbmx5VHJpZ2dlcmVkTWFudWFsbHlQcmVGaWxsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgc2F2ZU9ubHlUZXN0UHJlRmlsbGVkKHRydWUpOwogICAgIH0KQEAgLTEzNzYsNyArMTQyOSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBTYW5pdHkgY2hlY2suCi0gICAgICAgIHNVaUJvdC5hc3NlcnROb0RhdGFzZXRzKCk7CisgICAgICAgIG1VaUJvdC5hc3NlcnROb0RhdGFzZXRzRXZlcigpOwogCiAgICAgICAgIC8vIFdhaXQgZm9yIG9uRmlsbCgpIGJlZm9yZSBwcm9jZWVkaW5nLCBvdGhlcndpc2UgdGhlIGZpZWxkcyBtaWdodCBiZSBjaGFuZ2VkIGJlZm9yZQogICAgICAgICAvLyB0aGUgc2Vzc2lvbiBzdGFydGVkCkBAIC0xMzkyLDEwICsxNDQ1LDEwIEBACiAgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJXcm9uZyB3ZWxjb21lIG1zZyIpLnRoYXQoYWN0dWFsTWVzc2FnZSkuaXNFcXVhbFRvKGV4cGVjdGVkTWVzc2FnZSk7CiAKICAgICAgICAgLy8gQXNzZXJ0IHRoZSBzbmFjayBiYXIgaXMgc2hvd24gYW5kIHRhcCAiU2F2ZSIuCi0gICAgICAgIHNVaUJvdC5zYXZlRm9yQXV0b2ZpbGwodHJ1ZSwgU0FWRV9EQVRBX1RZUEVfUEFTU1dPUkQpOworICAgICAgICBtVWlCb3Quc2F2ZUZvckF1dG9maWxsKHRydWUsIFNBVkVfREFUQV9UWVBFX1BBU1NXT1JEKTsKIAogICAgICAgICBmaW5hbCBTYXZlUmVxdWVzdCBzYXZlUmVxdWVzdCA9IHNSZXBsaWVyLmdldE5leHRTYXZlUmVxdWVzdCgpOwotICAgICAgICBzUmVwbGllci5hc3NlcnROdW1iZXJVbmhhbmRsZWRTYXZlUmVxdWVzdHMoMCk7CisgICAgICAgIHNSZXBsaWVyLmFzc2VydE5vVW5oYW5kbGVkU2F2ZVJlcXVlc3RzKCk7CiAKICAgICAgICAgLy8gQXNzZXJ0IHZhbHVlIG9mIGV4cGVjdGVkIGZpZWxkcyAtIHNob3VsZCBub3QgYmUgc2FuaXRpemVkLgogICAgICAgICB0cnkgewpAQCAtMTQwNywxMiArMTQ2MCwxMCBAQAogICAgICAgICAgICAgZHVtcFN0cnVjdHVyZSgic2F2ZU9ubHlUZXN0KCkgZmFpbGVkIiwgc2F2ZVJlcXVlc3Quc3RydWN0dXJlKTsKICAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgIH0KLQotICAgICAgICAvLyBTYW5pdHkgY2hlY2s6IG9uY2Ugc2F2ZWQsIHRoZSBzZXNzaW9uIHNob3VsZCBiZSBmaW5zaWhlZC4KLSAgICAgICAgYXNzZXJ0Tm9EYW5nbGluZ1Nlc3Npb25zKCk7CiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gdGVzdEF1dG9GaWxsT25lRGF0YXNldEFuZFNhdmUoKSBpcyBlbm91Z2ggdG8gdGVzdCBlcGhlbWVyYWwgYXBwcwogICAgIHB1YmxpYyB2b2lkIHRlc3RTYXZlT25seVR3b1JlcXVpcmVkRmllbGRzT25lUHJlZmlsbGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKIApAQCAtMTQzMCw3ICsxNDgxLDcgQEAKICAgICAgICAgLy8gV2FpdCBmb3Igb25GaWxsKCkgYmVmb3JlIGNoYW5naW5nIHZhbHVlLCBvdGhlcndpc2UgdGhlIGZpZWxkcyBtaWdodCBiZSBjaGFuZ2VkIGJlZm9yZQogICAgICAgICAvLyB0aGUgc2Vzc2lvbiBzdGFydGVkCiAgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwotICAgICAgICBzVWlCb3QuYXNzZXJ0Tm9EYXRhc2V0cygpOworICAgICAgICBtVWlCb3QuYXNzZXJ0Tm9EYXRhc2V0c0V2ZXIoKTsKIAogICAgICAgICAvLyBTZXQgY3JlZGVudGlhbHMuLi4KICAgICAgICAgbUFjdGl2aXR5Lm9uUGFzc3dvcmQoKHYpIC0+IHYuc2V0VGV4dCgidGhvdSBzaG91bGQgcGFzcyIpKTsgLy8gY29udGFpbnMgcGFzcwpAQCAtMTQ0MSwxMCArMTQ5MiwxMCBAQAogICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiV3Jvbmcgd2VsY29tZSBtc2ciKS50aGF0KGFjdHVhbE1lc3NhZ2UpLmlzRXF1YWxUbyhleHBlY3RlZE1lc3NhZ2UpOwogCiAgICAgICAgIC8vIEFzc2VydCB0aGUgc25hY2sgYmFyIGlzIHNob3duIGFuZCB0YXAgIlNhdmUiLgotICAgICAgICBzVWlCb3Quc2F2ZUZvckF1dG9maWxsKHRydWUsIFNBVkVfREFUQV9UWVBFX1BBU1NXT1JEKTsKKyAgICAgICAgbVVpQm90LnNhdmVGb3JBdXRvZmlsbCh0cnVlLCBTQVZFX0RBVEFfVFlQRV9QQVNTV09SRCk7CiAKICAgICAgICAgZmluYWwgU2F2ZVJlcXVlc3Qgc2F2ZVJlcXVlc3QgPSBzUmVwbGllci5nZXROZXh0U2F2ZVJlcXVlc3QoKTsKLSAgICAgICAgc1JlcGxpZXIuYXNzZXJ0TnVtYmVyVW5oYW5kbGVkU2F2ZVJlcXVlc3RzKDApOworICAgICAgICBzUmVwbGllci5hc3NlcnROb1VuaGFuZGxlZFNhdmVSZXF1ZXN0cygpOwogCiAgICAgICAgIC8vIEFzc2VydCB2YWx1ZSBvZiBleHBlY3RlZCBmaWVsZHMgLSBzaG91bGQgbm90IGJlIHNhbml0aXplZC4KICAgICAgICAgdHJ5IHsKQEAgLTE0NTYsMTIgKzE1MDcsMTAgQEAKICAgICAgICAgICAgIGR1bXBTdHJ1Y3R1cmUoInNhdmVPbmx5VGVzdCgpIGZhaWxlZCIsIHNhdmVSZXF1ZXN0LnN0cnVjdHVyZSk7CiAgICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICB9Ci0KLSAgICAgICAgLy8gU2FuaXR5IGNoZWNrOiBvbmNlIHNhdmVkLCB0aGUgc2Vzc2lvbiBzaG91bGQgYmUgZmluc2loZWQuCi0gICAgICAgIGFzc2VydE5vRGFuZ2xpbmdTZXNzaW9ucygpOwogICAgIH0KIAogICAgIEBUZXN0CisgICAgQEFwcE1vZGVGdWxsIC8vIHRlc3RBdXRvRmlsbE9uZURhdGFzZXRBbmRTYXZlKCkgaXMgZW5vdWdoIHRvIHRlc3QgZXBoZW1lcmFsIGFwcHMKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2F2ZU9ubHlPcHRpb25hbEZpZWxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKIApAQCAtMTQ3NSw3ICsxNTI0LDcgQEAKICAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoVmlldzo6cmVxdWVzdEZvY3VzKTsKIAogICAgICAgICAvLyBTYW5pdHkgY2hlY2suCi0gICAgICAgIHNVaUJvdC5hc3NlcnROb0RhdGFzZXRzKCk7CisgICAgICAgIG1VaUJvdC5hc3NlcnROb0RhdGFzZXRzRXZlcigpOwogCiAgICAgICAgIC8vIFdhaXQgZm9yIG9uRmlsbCgpIGJlZm9yZSBwcm9jZWVkaW5nLCBvdGhlcndpc2UgdGhlIGZpZWxkcyBtaWdodCBiZSBjaGFuZ2VkIGJlZm9yZQogICAgICAgICAvLyB0aGUgc2Vzc2lvbiBzdGFydGVkCkBAIC0xNDkyLDcgKzE1NDEsNyBAQAogICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiV3Jvbmcgd2VsY29tZSBtc2ciKS50aGF0KGFjdHVhbE1lc3NhZ2UpLmlzRXF1YWxUbyhleHBlY3RlZE1lc3NhZ2UpOwogCiAgICAgICAgIC8vIEFzc2VydCB0aGUgc25hY2sgYmFyIGlzIHNob3duIGFuZCB0YXAgIlNhdmUiLgotICAgICAgICBzVWlCb3Quc2F2ZUZvckF1dG9maWxsKHRydWUsIFNBVkVfREFUQV9UWVBFX1BBU1NXT1JEKTsKKyAgICAgICAgbVVpQm90LnNhdmVGb3JBdXRvZmlsbCh0cnVlLCBTQVZFX0RBVEFfVFlQRV9QQVNTV09SRCk7CiAKICAgICAgICAgZmluYWwgU2F2ZVJlcXVlc3Qgc2F2ZVJlcXVlc3QgPSBzUmVwbGllci5nZXROZXh0U2F2ZVJlcXVlc3QoKTsKIApAQCAtMTUwMSwyMiArMTU1MCwyMiBAQAogICAgICAgICBhc3NlcnRUZXh0QW5kVmFsdWUodXNlcm5hbWUsICJtYWxrb3ZpY2giKTsKICAgICAgICAgZmluYWwgVmlld05vZGUgcGFzc3dvcmQgPSBmaW5kTm9kZUJ5UmVzb3VyY2VJZChzYXZlUmVxdWVzdC5zdHJ1Y3R1cmUsIElEX1BBU1NXT1JEKTsKICAgICAgICAgYXNzZXJ0VGV4dEFuZFZhbHVlKHBhc3N3b3JkLCAibWFsa292aWNoIik7Ci0KLSAgICAgICAgLy8gU2FuaXR5IGNoZWNrOiBvbmNlIHNhdmVkLCB0aGUgc2Vzc2lvbiBzaG91bGQgYmUgZmluc2loZWQuCi0gICAgICAgIGFzc2VydE5vRGFuZ2xpbmdTZXNzaW9ucygpOwogICAgIH0KIAogICAgIEBUZXN0CisgICAgQEFwcE1vZGVGdWxsIC8vIHRlc3RBdXRvRmlsbE9uZURhdGFzZXRBbmRTYXZlKCkgaXMgZW5vdWdoIHRvIHRlc3QgZXBoZW1lcmFsIGFwcHMKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2F2ZU5vUmVxdWlyZWRGaWVsZF9Ob25lRmlsbGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIG9wdGlvbmFsT25seVRlc3QoRmlsbGVkRmllbGRzLk5PTkUpOwogICAgIH0KIAogICAgIEBUZXN0CisgICAgQEFwcE1vZGVGdWxsIC8vIHRlc3RBdXRvRmlsbE9uZURhdGFzZXRBbmRTYXZlKCkgaXMgZW5vdWdoIHRvIHRlc3QgZXBoZW1lcmFsIGFwcHMKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2F2ZU5vUmVxdWlyZWRGaWVsZF9PbmVGaWxsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgb3B0aW9uYWxPbmx5VGVzdChGaWxsZWRGaWVsZHMuVVNFUk5BTUVfT05MWSk7CiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gdGVzdEF1dG9GaWxsT25lRGF0YXNldEFuZFNhdmUoKSBpcyBlbm91Z2ggdG8gdGVzdCBlcGhlbWVyYWwgYXBwcwogICAgIHB1YmxpYyB2b2lkIHRlc3RTYXZlTm9SZXF1aXJlZEZpZWxkX0JvdGhGaWxsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgb3B0aW9uYWxPbmx5VGVzdChGaWxsZWRGaWVsZHMuQk9USCk7CiAgICAgfQpAQCAtMTU0MCw3ICsxNTg5LDcgQEAKICAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoVmlldzo6cmVxdWVzdEZvY3VzKTsKIAogICAgICAgICAvLyBTYW5pdHkgY2hlY2suCi0gICAgICAgIHNVaUJvdC5hc3NlcnROb0RhdGFzZXRzKCk7CisgICAgICAgIG1VaUJvdC5hc3NlcnROb0RhdGFzZXRzRXZlcigpOwogCiAgICAgICAgIC8vIFdhaXQgZm9yIG9uRmlsbCgpIGJlZm9yZSBwcm9jZWVkaW5nLCBvdGhlcndpc2UgdGhlIGZpZWxkcyBtaWdodCBiZSBjaGFuZ2VkIGJlZm9yZQogICAgICAgICAvLyB0aGUgc2Vzc2lvbiBzdGFydGVkCkBAIC0xNTY1LDEzICsxNjE0LDEyIEBACiAgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJXcm9uZyB3ZWxjb21lIG1zZyIpLnRoYXQoYWN0dWFsTWVzc2FnZSkuaXNFcXVhbFRvKGV4cGVjdGVkTWVzc2FnZSk7CiAKICAgICAgICAgaWYgKGZpbGxlZEZpZWxkcyA9PSBGaWxsZWRGaWVsZHMuTk9ORSkgewotICAgICAgICAgICAgc1VpQm90LmFzc2VydFNhdmVOb3RTaG93aW5nKFNBVkVfREFUQV9UWVBFX1BBU1NXT1JEKTsKLSAgICAgICAgICAgIGFzc2VydE5vRGFuZ2xpbmdTZXNzaW9ucygpOworICAgICAgICAgICAgbVVpQm90LmFzc2VydFNhdmVOb3RTaG93aW5nKFNBVkVfREFUQV9UWVBFX1BBU1NXT1JEKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCiAgICAgICAgIC8vIEFzc2VydCB0aGUgc25hY2sgYmFyIGlzIHNob3duIGFuZCB0YXAgIlNhdmUiLgotICAgICAgICBzVWlCb3Quc2F2ZUZvckF1dG9maWxsKHRydWUsIFNBVkVfREFUQV9UWVBFX1BBU1NXT1JEKTsKKyAgICAgICAgbVVpQm90LnNhdmVGb3JBdXRvZmlsbCh0cnVlLCBTQVZFX0RBVEFfVFlQRV9QQVNTV09SRCk7CiAKICAgICAgICAgZmluYWwgU2F2ZVJlcXVlc3Qgc2F2ZVJlcXVlc3QgPSBzUmVwbGllci5nZXROZXh0U2F2ZVJlcXVlc3QoKTsKIApAQCAtMTU4MywzNyArMTYzMSw0MCBAQAogICAgICAgICAgICAgZmluYWwgVmlld05vZGUgcGFzc3dvcmQgPSBmaW5kTm9kZUJ5UmVzb3VyY2VJZChzYXZlUmVxdWVzdC5zdHJ1Y3R1cmUsIElEX1BBU1NXT1JEKTsKICAgICAgICAgICAgIGFzc2VydFRleHRBbmRWYWx1ZShwYXNzd29yZCwgIndoYXRldmVyIik7CiAgICAgICAgIH0KLQotICAgICAgICAvLyBTYW5pdHkgY2hlY2s6IG9uY2Ugc2F2ZWQsIHRoZSBzZXNzaW9uIHNob3VsZCBiZSBmaW5pc2hlZC4KLSAgICAgICAgYXNzZXJ0Tm9EYW5nbGluZ1Nlc3Npb25zKCk7CiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gdGVzdEF1dG9GaWxsT25lRGF0YXNldEFuZFNhdmUoKSBpcyBlbm91Z2ggdG8gdGVzdCBlcGhlbWVyYWwgYXBwcwogICAgIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmljU2F2ZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBjdXN0b21pemVkU2F2ZVRlc3QoU0FWRV9EQVRBX1RZUEVfR0VORVJJQyk7CiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gdGVzdEF1dG9GaWxsT25lRGF0YXNldEFuZFNhdmUoKSBpcyBlbm91Z2ggdG8gdGVzdCBlcGhlbWVyYWwgYXBwcwogICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21pemVkU2F2ZVBhc3N3b3JkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGN1c3RvbWl6ZWRTYXZlVGVzdChTQVZFX0RBVEFfVFlQRV9QQVNTV09SRCk7CiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gdGVzdEF1dG9GaWxsT25lRGF0YXNldEFuZFNhdmUoKSBpcyBlbm91Z2ggdG8gdGVzdCBlcGhlbWVyYWwgYXBwcwogICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21pemVkU2F2ZUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgY3VzdG9taXplZFNhdmVUZXN0KFNBVkVfREFUQV9UWVBFX0FERFJFU1MpOwogICAgIH0KIAogICAgIEBUZXN0CisgICAgQEFwcE1vZGVGdWxsIC8vIHRlc3RBdXRvRmlsbE9uZURhdGFzZXRBbmRTYXZlKCkgaXMgZW5vdWdoIHRvIHRlc3QgZXBoZW1lcmFsIGFwcHMKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9taXplZFNhdmVDcmVkaXRDYXJkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGN1c3RvbWl6ZWRTYXZlVGVzdChTQVZFX0RBVEFfVFlQRV9DUkVESVRfQ0FSRCk7CiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gdGVzdEF1dG9GaWxsT25lRGF0YXNldEFuZFNhdmUoKSBpcyBlbm91Z2ggdG8gdGVzdCBlcGhlbWVyYWwgYXBwcwogICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21pemVkU2F2ZVVzZXJuYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGN1c3RvbWl6ZWRTYXZlVGVzdChTQVZFX0RBVEFfVFlQRV9VU0VSTkFNRSk7CiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gdGVzdEF1dG9GaWxsT25lRGF0YXNldEFuZFNhdmUoKSBpcyBlbm91Z2ggdG8gdGVzdCBlcGhlbWVyYWwgYXBwcwogICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21pemVkU2F2ZUVtYWlsQWRkcmVzcygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBjdXN0b21pemVkU2F2ZVRlc3QoU0FWRV9EQVRBX1RZUEVfRU1BSUxfQUREUkVTUyk7CiAgICAgfQpAQCAtMTYzMyw3ICsxNjg0LDcgQEAKICAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoVmlldzo6cmVxdWVzdEZvY3VzKTsKIAogICAgICAgICAvLyBTYW5pdHkgY2hlY2suCi0gICAgICAgIHNVaUJvdC5hc3NlcnROb0RhdGFzZXRzKCk7CisgICAgICAgIG1VaUJvdC5hc3NlcnROb0RhdGFzZXRzRXZlcigpOwogCiAgICAgICAgIC8vIFdhaXQgZm9yIG9uRmlsbCgpIGJlZm9yZSBwcm9jZWVkaW5nLCBvdGhlcndpc2UgdGhlIGZpZWxkcyBtaWdodCBiZSBjaGFuZ2VkIGJlZm9yZQogICAgICAgICAvLyB0aGUgc2Vzc2lvbiBzdGFydGVkLgpAQCAtMTY0OSwxNCArMTcwMCw0NyBAQAogICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiV3Jvbmcgd2VsY29tZSBtc2ciKS50aGF0KGFjdHVhbE1lc3NhZ2UpLmlzRXF1YWxUbyhleHBlY3RlZE1lc3NhZ2UpOwogCiAgICAgICAgIC8vIEFzc2VydCB0aGUgc25hY2sgYmFyIGlzIHNob3duIGFuZCB0YXAgIlNhdmUiLgotICAgICAgICBmaW5hbCBVaU9iamVjdDIgc2F2ZVNuYWNrQmFyID0gc1VpQm90LmFzc2VydFNhdmVTaG93aW5nKHNhdmVEZXNjcmlwdGlvbiwgdHlwZSk7Ci0gICAgICAgIHNVaUJvdC5zYXZlRm9yQXV0b2ZpbGwoc2F2ZVNuYWNrQmFyLCB0cnVlKTsKKyAgICAgICAgZmluYWwgVWlPYmplY3QyIHNhdmVTbmFja0JhciA9IG1VaUJvdC5hc3NlcnRTYXZlU2hvd2luZyhzYXZlRGVzY3JpcHRpb24sIHR5cGUpOworICAgICAgICBtVWlCb3Quc2F2ZUZvckF1dG9maWxsKHNhdmVTbmFja0JhciwgdHJ1ZSk7CiAKICAgICAgICAgLy8gQXNzZXJ0IHNhdmUgd2FzIGNhbGxlZC4KICAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dFNhdmVSZXF1ZXN0KCk7CiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG9udFRyaWdnZXJTYXZlT25GaW5pc2hXaGVuUmVxdWVzdGVkQnlGbGFnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKKworICAgICAgICAvLyBTZXQgZXhwZWN0YXRpb25zLgorICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRSZXF1aXJlZFNhdmFibGVJZHMoU0FWRV9EQVRBX1RZUEVfUEFTU1dPUkQsIElEX1VTRVJOQU1FLCBJRF9QQVNTV09SRCkKKyAgICAgICAgICAgICAgICAuc2V0U2F2ZUluZm9GbGFncyhTYXZlSW5mby5GTEFHX0RPTlRfU0FWRV9PTl9GSU5JU0gpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIC8vIFRyaWdnZXIgYXV0by1maWxsLgorICAgICAgICBtQWN0aXZpdHkub25Vc2VybmFtZShWaWV3OjpyZXF1ZXN0Rm9jdXMpOworCisgICAgICAgIC8vIFNhbml0eSBjaGVjay4KKyAgICAgICAgbVVpQm90LmFzc2VydE5vRGF0YXNldHNFdmVyKCk7CisKKyAgICAgICAgLy8gV2FpdCBmb3Igb25GaWxsKCkgYmVmb3JlIHByb2NlZWRpbmcsIG90aGVyd2lzZSB0aGUgZmllbGRzIG1pZ2h0IGJlIGNoYW5nZWQgYmVmb3JlCisgICAgICAgIC8vIHRoZSBzZXNzaW9uIHN0YXJ0ZWQKKyAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CisKKyAgICAgICAgLy8gU2V0IGNyZWRlbnRpYWxzLi4uCisgICAgICAgIG1BY3Rpdml0eS5vblVzZXJuYW1lKCh2KSAtPiB2LnNldFRleHQoIm1hbGtvdmljaCIpKTsKKyAgICAgICAgbUFjdGl2aXR5Lm9uUGFzc3dvcmQoKHYpIC0+IHYuc2V0VGV4dCgibWFsa292aWNoIikpOworCisgICAgICAgIC8vIC4uLmFuZCBsb2dpbgorICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWRNZXNzYWdlID0gZ2V0V2VsY29tZU1lc3NhZ2UoIm1hbGtvdmljaCIpOworICAgICAgICBmaW5hbCBTdHJpbmcgYWN0dWFsTWVzc2FnZSA9IG1BY3Rpdml0eS50YXBMb2dpbigpOworICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiV3Jvbmcgd2VsY29tZSBtc2ciKS50aGF0KGFjdHVhbE1lc3NhZ2UpLmlzRXF1YWxUbyhleHBlY3RlZE1lc3NhZ2UpOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSBpdCBkaWRuJ3QgdHJpZ2dlciBzYXZlLgorICAgICAgICBtVWlCb3QuYXNzZXJ0U2F2ZU5vdFNob3dpbmcoU0FWRV9EQVRBX1RZUEVfUEFTU1dPUkQpOworICAgIH0KKworICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEF1dG9GaWxsT25lRGF0YXNldEFuZFNhdmVXaGVuRmxhZ1NlY3VyZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBtQWN0aXZpdHkuc2V0RmxhZ3MoRkxBR19TRUNVUkUpOwogICAgICAgICB0ZXN0QXV0b0ZpbGxPbmVEYXRhc2V0QW5kU2F2ZSgpOwpAQCAtMTY2OSw4MDYgKzE3NTMsNyBAQAogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEZpbGxSZXNwb25zZUF1dGhCb3RoRmllbGRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbGxSZXNwb25zZUF1dGhCb3RoRmllbGRzKGZhbHNlKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RGaWxsUmVzcG9uc2VBdXRoQm90aEZpZWxkc1VzZXJDYW5jZWxzRmlyc3RBdHRlbXB0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbGxSZXNwb25zZUF1dGhCb3RoRmllbGRzKHRydWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBmaWxsUmVzcG9uc2VBdXRoQm90aEZpZWxkcyhib29sZWFuIGNhbmNlbEZpcnN0QXR0ZW1wdCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFNldCBzZXJ2aWNlLgotICAgICAgICBlbmFibGVTZXJ2aWNlKCk7Ci0gICAgICAgIGZpbmFsIE15QXV0b2ZpbGxDYWxsYmFjayBjYWxsYmFjayA9IG1BY3Rpdml0eS5yZWdpc3RlckNhbGxiYWNrKCk7Ci0KLSAgICAgICAgLy8gUHJlcGFyZSB0aGUgYXV0aGVudGljYXRlZCByZXNwb25zZQotICAgICAgICBmaW5hbCBCdW5kbGUgY2xpZW50U3RhdGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgIGNsaWVudFN0YXRlLnB1dFN0cmluZygibnVtYmVycyIsICI0ODE1MTYyMzQyIik7Ci0gICAgICAgIGZpbmFsIEludGVudFNlbmRlciBhdXRoZW50aWNhdGlvbiA9IEF1dGhlbnRpY2F0aW9uQWN0aXZpdHkuY3JlYXRlU2VuZGVyKG1Db250ZXh0LCAxLAotICAgICAgICAgICAgICAgIG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpLmFkZERhdGFzZXQoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1VTRVJOQU1FLCAiZHVkZSIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9QQVNTV09SRCwgInN3ZWV0IikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldElkKCJuYW1lIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oIkRhdGFzZXQiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0RXh0cmFzKGNsaWVudFN0YXRlKS5idWlsZCgpKTsKLQotICAgICAgICAvLyBDb25maWd1cmUgdGhlIHNlcnZpY2UgYmVoYXZpb3IKLSAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UobmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAuc2V0QXV0aGVudGljYXRpb24oYXV0aGVudGljYXRpb24sIElEX1VTRVJOQU1FLCBJRF9QQVNTV09SRCkKLSAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiVGFwIHRvIGF1dGggcmVzcG9uc2UiKSkKLSAgICAgICAgICAgICAgICAuc2V0RXh0cmFzKGNsaWVudFN0YXRlKQotICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKLQotICAgICAgICAvLyBTZXQgZXhwZWN0YXRpb24gZm9yIHRoZSBhY3Rpdml0eQotICAgICAgICBtQWN0aXZpdHkuZXhwZWN0QXV0b0ZpbGwoImR1ZGUiLCAic3dlZXQiKTsKLQotICAgICAgICAvLyBUcmlnZ2VyIGF1dG8tZmlsbC4KLSAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoVmlldzo6cmVxdWVzdEZvY3VzKTsKLQotICAgICAgICAvLyBXYWl0IGZvciBvbkZpbGwoKSBiZWZvcmUgcHJvY2VlZGluZy4KLSAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7Ci0gICAgICAgIGZpbmFsIFZpZXcgdXNlcm5hbWUgPSBtQWN0aXZpdHkuZ2V0VXNlcm5hbWUoKTsKLSAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlTaG93bkV2ZW50KHVzZXJuYW1lKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJUYXAgdG8gYXV0aCByZXNwb25zZSIpOwotCi0gICAgICAgIC8vIE1ha2Ugc3VyZSBVSSBpcyBzaG93IG9uIDJuZCBmaWVsZCBhcyB3ZWxsCi0gICAgICAgIGZpbmFsIFZpZXcgcGFzc3dvcmQgPSBtQWN0aXZpdHkuZ2V0UGFzc3dvcmQoKTsKLSAgICAgICAgbUFjdGl2aXR5Lm9uUGFzc3dvcmQoVmlldzo6cmVxdWVzdEZvY3VzKTsKLSAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlIaWRkZW5FdmVudCh1c2VybmFtZSk7Ci0gICAgICAgIGNhbGxiYWNrLmFzc2VydFVpU2hvd25FdmVudChwYXNzd29yZCk7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnREYXRhc2V0cygiVGFwIHRvIGF1dGggcmVzcG9uc2UiKTsKLQotICAgICAgICAvLyBOb3cgdGFwIG9uIDFzdCBmaWVsZCB0byBzaG93IGl0IGFnYWluLi4uCi0gICAgICAgIG1BY3Rpdml0eS5vblVzZXJuYW1lKFZpZXc6OnJlcXVlc3RGb2N1cyk7Ci0gICAgICAgIGNhbGxiYWNrLmFzc2VydFVpSGlkZGVuRXZlbnQocGFzc3dvcmQpOwotICAgICAgICBjYWxsYmFjay5hc3NlcnRVaVNob3duRXZlbnQodXNlcm5hbWUpOwotCi0gICAgICAgIGlmIChjYW5jZWxGaXJzdEF0dGVtcHQpIHsKLSAgICAgICAgICAgIC8vIFRyaWdnZXIgdGhlIGF1dGggZGlhbG9nLCBidXQgZW11bGF0ZSBjYW5jZWwuCi0gICAgICAgICAgICBBdXRoZW50aWNhdGlvbkFjdGl2aXR5LnNldFJlc3VsdENvZGUoUkVTVUxUX0NBTkNFTEVEKTsKLSAgICAgICAgICAgIHNVaUJvdC5zZWxlY3REYXRhc2V0KCJUYXAgdG8gYXV0aCByZXNwb25zZSIpOwotICAgICAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlIaWRkZW5FdmVudCh1c2VybmFtZSk7Ci0gICAgICAgICAgICBjYWxsYmFjay5hc3NlcnRVaVNob3duRXZlbnQodXNlcm5hbWUpOwotICAgICAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJUYXAgdG8gYXV0aCByZXNwb25zZSIpOwotCi0gICAgICAgICAgICAvLyBNYWtlIHN1cmUgaXQncyBzdGlsbCBzaG93biBvbiBvdGhlciBmaWVsZHMuLi4KLSAgICAgICAgICAgIG1BY3Rpdml0eS5vblBhc3N3b3JkKFZpZXc6OnJlcXVlc3RGb2N1cyk7Ci0gICAgICAgICAgICBjYWxsYmFjay5hc3NlcnRVaUhpZGRlbkV2ZW50KHVzZXJuYW1lKTsKLSAgICAgICAgICAgIGNhbGxiYWNrLmFzc2VydFVpU2hvd25FdmVudChwYXNzd29yZCk7Ci0gICAgICAgICAgICBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlRhcCB0byBhdXRoIHJlc3BvbnNlIik7Ci0KLSAgICAgICAgICAgIC8vIFRhcCBvbiAxc3QgZmllbGQgdG8gc2hvdyBpdCBhZ2Fpbi4uLgotICAgICAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoVmlldzo6cmVxdWVzdEZvY3VzKTsKLSAgICAgICAgICAgIGNhbGxiYWNrLmFzc2VydFVpSGlkZGVuRXZlbnQocGFzc3dvcmQpOwotICAgICAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlTaG93bkV2ZW50KHVzZXJuYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIC4uLmFuZCBzZWxlY3QgaXQgdGhpcyB0aW1lCi0gICAgICAgIEF1dGhlbnRpY2F0aW9uQWN0aXZpdHkuc2V0UmVzdWx0Q29kZShSRVNVTFRfT0spOwotICAgICAgICBzVWlCb3Quc2VsZWN0RGF0YXNldCgiVGFwIHRvIGF1dGggcmVzcG9uc2UiKTsKLSAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlIaWRkZW5FdmVudCh1c2VybmFtZSk7Ci0gICAgICAgIGNhbGxiYWNrLmFzc2VydFVpU2hvd25FdmVudCh1c2VybmFtZSk7Ci0gICAgICAgIGZpbmFsIFVpT2JqZWN0MiBwaWNrZXIgPSBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoIkRhdGFzZXQiKTsKLSAgICAgICAgc1VpQm90LnNlbGVjdERhdGFzZXQocGlja2VyLCAiRGF0YXNldCIpOwotICAgICAgICBjYWxsYmFjay5hc3NlcnRVaUhpZGRlbkV2ZW50KHVzZXJuYW1lKTsKLSAgICAgICAgc1VpQm90LmFzc2VydE5vRGF0YXNldHMoKTsKLQotICAgICAgICAvLyBDaGVjayB0aGUgcmVzdWx0cy4KLSAgICAgICAgbUFjdGl2aXR5LmFzc2VydEF1dG9GaWxsZWQoKTsKLQotICAgICAgICBmaW5hbCBCdW5kbGUgZGF0YSA9IEF1dGhlbnRpY2F0aW9uQWN0aXZpdHkuZ2V0RGF0YSgpOwotICAgICAgICBhc3NlcnRUaGF0KGRhdGEpLmlzTm90TnVsbCgpOwotICAgICAgICBmaW5hbCBTdHJpbmcgZXh0cmFWYWx1ZSA9IGRhdGEuZ2V0U3RyaW5nKCJudW1iZXJzIik7Ci0gICAgICAgIGFzc2VydFRoYXQoZXh0cmFWYWx1ZSkuaXNFcXVhbFRvKCI0ODE1MTYyMzQyIik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsbFJlc3BvbnNlQXV0aEp1c3RPbmVGaWVsZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBTZXQgc2VydmljZS4KLSAgICAgICAgZW5hYmxlU2VydmljZSgpOwotICAgICAgICBmaW5hbCBNeUF1dG9maWxsQ2FsbGJhY2sgY2FsbGJhY2sgPSBtQWN0aXZpdHkucmVnaXN0ZXJDYWxsYmFjaygpOwotCi0gICAgICAgIC8vIFByZXBhcmUgdGhlIGF1dGhlbnRpY2F0ZWQgcmVzcG9uc2UKLSAgICAgICAgZmluYWwgQnVuZGxlIGNsaWVudFN0YXRlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICBjbGllbnRTdGF0ZS5wdXRTdHJpbmcoIm51bWJlcnMiLCAiNDgxNTE2MjM0MiIpOwotICAgICAgICBmaW5hbCBJbnRlbnRTZW5kZXIgYXV0aGVudGljYXRpb24gPSBBdXRoZW50aWNhdGlvbkFjdGl2aXR5LmNyZWF0ZVNlbmRlcihtQ29udGV4dCwgMSwKLSAgICAgICAgICAgICAgICBuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKS5hZGREYXRhc2V0KAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgImR1ZGUiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfUEFTU1dPUkQsICJzd2VldCIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJEYXRhc2V0IikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOwotCi0gICAgICAgIC8vIENvbmZpZ3VyZSB0aGUgc2VydmljZSBiZWhhdmlvcgotICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgIC5zZXRBdXRoZW50aWNhdGlvbihhdXRoZW50aWNhdGlvbiwgSURfVVNFUk5BTUUpCi0gICAgICAgICAgICAgICAgLnNldElnbm9yZUZpZWxkcyhJRF9QQVNTV09SRCkKLSAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiVGFwIHRvIGF1dGggcmVzcG9uc2UiKSkKLSAgICAgICAgICAgICAgICAuc2V0RXh0cmFzKGNsaWVudFN0YXRlKQotICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKLQotICAgICAgICAvLyBTZXQgZXhwZWN0YXRpb24gZm9yIHRoZSBhY3Rpdml0eQotICAgICAgICBtQWN0aXZpdHkuZXhwZWN0QXV0b0ZpbGwoImR1ZGUiLCAic3dlZXQiKTsKLQotICAgICAgICAvLyBUcmlnZ2VyIGF1dG8tZmlsbC4KLSAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoVmlldzo6cmVxdWVzdEZvY3VzKTsKLQotICAgICAgICAvLyBXYWl0IGZvciBvbkZpbGwoKSBiZWZvcmUgcHJvY2VlZGluZy4KLSAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7Ci0gICAgICAgIGZpbmFsIFZpZXcgdXNlcm5hbWUgPSBtQWN0aXZpdHkuZ2V0VXNlcm5hbWUoKTsKLSAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlTaG93bkV2ZW50KHVzZXJuYW1lKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJUYXAgdG8gYXV0aCByZXNwb25zZSIpOwotCi0gICAgICAgIC8vIE1ha2Ugc3VyZSBVSSBpcyBub3Qgc2hvdyBvbiAybmQgZmllbGQKLSAgICAgICAgbUFjdGl2aXR5Lm9uUGFzc3dvcmQoVmlldzo6cmVxdWVzdEZvY3VzKTsKLSAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlIaWRkZW5FdmVudCh1c2VybmFtZSk7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnROb0RhdGFzZXRzKCk7Ci0gICAgICAgIC8vIE5vdyB0YXAgb24gMXN0IGZpZWxkIHRvIHNob3cgaXQgYWdhaW4uLi4KLSAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoVmlldzo6cmVxdWVzdEZvY3VzKTsKLSAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlTaG93bkV2ZW50KHVzZXJuYW1lKTsKLQotICAgICAgICAvLyAuLi5hbmQgc2VsZWN0IGl0IHRoaXMgdGltZQotICAgICAgICBzVWlCb3Quc2VsZWN0RGF0YXNldCgiVGFwIHRvIGF1dGggcmVzcG9uc2UiKTsKLSAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlIaWRkZW5FdmVudCh1c2VybmFtZSk7Ci0gICAgICAgIGZpbmFsIFVpT2JqZWN0MiBwaWNrZXIgPSBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoIkRhdGFzZXQiKTsKLQotICAgICAgICBjYWxsYmFjay5hc3NlcnRVaVNob3duRXZlbnQodXNlcm5hbWUpOwotICAgICAgICBzVWlCb3Quc2VsZWN0RGF0YXNldChwaWNrZXIsICJEYXRhc2V0Iik7Ci0gICAgICAgIGNhbGxiYWNrLmFzc2VydFVpSGlkZGVuRXZlbnQodXNlcm5hbWUpOwotICAgICAgICBzVWlCb3QuYXNzZXJ0Tm9EYXRhc2V0cygpOwotCi0gICAgICAgIC8vIENoZWNrIHRoZSByZXN1bHRzLgotICAgICAgICBtQWN0aXZpdHkuYXNzZXJ0QXV0b0ZpbGxlZCgpOwotICAgICAgICBmaW5hbCBCdW5kbGUgZGF0YSA9IEF1dGhlbnRpY2F0aW9uQWN0aXZpdHkuZ2V0RGF0YSgpOwotICAgICAgICBhc3NlcnRUaGF0KGRhdGEpLmlzTm90TnVsbCgpOwotICAgICAgICBmaW5hbCBTdHJpbmcgZXh0cmFWYWx1ZSA9IGRhdGEuZ2V0U3RyaW5nKCJudW1iZXJzIik7Ci0gICAgICAgIGFzc2VydFRoYXQoZXh0cmFWYWx1ZSkuaXNFcXVhbFRvKCI0ODE1MTYyMzQyIik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsbFJlc3BvbnNlQXV0aFdoZW5BcHBDYWxsc0NhbmNlbCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBTZXQgc2VydmljZS4KLSAgICAgICAgZW5hYmxlU2VydmljZSgpOwotICAgICAgICBmaW5hbCBNeUF1dG9maWxsQ2FsbGJhY2sgY2FsbGJhY2sgPSBtQWN0aXZpdHkucmVnaXN0ZXJDYWxsYmFjaygpOwotCi0gICAgICAgIC8vIFByZXBhcmUgdGhlIGF1dGhlbnRpY2F0ZWQgcmVzcG9uc2UKLSAgICAgICAgZmluYWwgSW50ZW50U2VuZGVyIGF1dGhlbnRpY2F0aW9uID0gQXV0aGVudGljYXRpb25BY3Rpdml0eS5jcmVhdGVTZW5kZXIobUNvbnRleHQsIDEsCi0gICAgICAgICAgICAgICAgbmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkuYWRkRGF0YXNldCgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfVVNFUk5BTUUsICJkdWRlIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1BBU1NXT1JELCAic3dlZXQiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0SWQoIm5hbWUiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiRGF0YXNldCIpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKLQotICAgICAgICAvLyBDb25maWd1cmUgdGhlIHNlcnZpY2UgYmVoYXZpb3IKLSAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UobmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAuc2V0QXV0aGVudGljYXRpb24oYXV0aGVudGljYXRpb24sIElEX1VTRVJOQU1FLCBJRF9QQVNTV09SRCkKLSAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiVGFwIHRvIGF1dGggcmVzcG9uc2UiKSkKLSAgICAgICAgICAgICAgICAuYnVpbGQoKSk7Ci0KLSAgICAgICAgLy8gVHJpZ2dlciBhdXRvZmlsbC4KLSAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoVmlldzo6cmVxdWVzdEZvY3VzKTsKLQotICAgICAgICAvLyBXYWl0IGZvciBvbkZpbGwoKSBiZWZvcmUgcHJvY2VlZGluZy4KLSAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7Ci0gICAgICAgIGZpbmFsIFZpZXcgdXNlcm5hbWUgPSBtQWN0aXZpdHkuZ2V0VXNlcm5hbWUoKTsKLSAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlTaG93bkV2ZW50KHVzZXJuYW1lKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJUYXAgdG8gYXV0aCByZXNwb25zZSIpOwotCi0gICAgICAgIC8vIERpc2FibGVzIGF1dG9maWxsIHNvIGl0J3Mgbm90IHRyaWdnZXJlZCBhZ2FpbiBhZnRlciB0aGUgYXV0aCBhY3Rpdml0eSBpcyBmaW5pc2hlZAotICAgICAgICAvLyAoYW5kIGN1cnJlbnQgc2Vzc2lvbiBpcyBjYW5jZWxlZCkgYW5kIHRoZSBsb2dpbiBhY3Rpdml0eSBpcyByZXN1bWVkLgotICAgICAgICB1c2VybmFtZS5zZXRJbXBvcnRhbnRGb3JBdXRvZmlsbChJTVBPUlRBTlRfRk9SX0FVVE9GSUxMX05PKTsKLQotICAgICAgICAvLyBBdXRvZmlsbCBpdC4KLSAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7Ci0gICAgICAgIEF1dGhlbnRpY2F0aW9uQWN0aXZpdHkuc2V0UmVzdWx0Q29kZShsYXRjaCwgUkVTVUxUX09LKTsKLQotICAgICAgICBzVWlCb3Quc2VsZWN0RGF0YXNldCgiVGFwIHRvIGF1dGggcmVzcG9uc2UiKTsKLSAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlIaWRkZW5FdmVudCh1c2VybmFtZSk7Ci0KLSAgICAgICAgLy8gQ2FuY2VsIHNlc3Npb24uLi4KLSAgICAgICAgbUFjdGl2aXR5LmdldEF1dG9maWxsTWFuYWdlcigpLmNhbmNlbCgpOwotCi0gICAgICAgIC8vIC4uLmJlZm9yZSBmaW5pc2hpbmcgdGhlIEF1dGggVUkuCi0gICAgICAgIGxhdGNoLmNvdW50RG93bigpOwotCi0gICAgICAgIHNVaUJvdC5hc3NlcnROb0RhdGFzZXRzKCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsbFJlc3BvbnNlQXV0aFNlcnZpY2VIYXNOb0RhdGFCdXRDYW5TYXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbGxSZXNwb25zZUF1dGhTZXJ2aWNlSGFzTm9EYXRhVGVzdCh0cnVlKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RGaWxsUmVzcG9uc2VBdXRoU2VydmljZUhhc05vRGF0YSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaWxsUmVzcG9uc2VBdXRoU2VydmljZUhhc05vRGF0YVRlc3QoZmFsc2UpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBmaWxsUmVzcG9uc2VBdXRoU2VydmljZUhhc05vRGF0YVRlc3QoYm9vbGVhbiBjYW5TYXZlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gU2V0IHNlcnZpY2UuCi0gICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKLSAgICAgICAgZmluYWwgTXlBdXRvZmlsbENhbGxiYWNrIGNhbGxiYWNrID0gbUFjdGl2aXR5LnJlZ2lzdGVyQ2FsbGJhY2soKTsKLQotICAgICAgICAvLyBQcmVwYXJlIHRoZSBhdXRoZW50aWNhdGVkIHJlc3BvbnNlCi0gICAgICAgIGZpbmFsIENhbm5lZEZpbGxSZXNwb25zZSByZXNwb25zZSA9IGNhblNhdmUKLSAgICAgICAgICAgICAgICA/IG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0UmVxdWlyZWRTYXZhYmxlSWRzKFNBVkVfREFUQV9UWVBFX1BBU1NXT1JELCBJRF9VU0VSTkFNRSwgSURfUEFTU1dPUkQpCi0gICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKQotICAgICAgICAgICAgICAgIDogQ2FubmVkRmlsbFJlc3BvbnNlLk5PX1JFU1BPTlNFOwotCi0gICAgICAgIGZpbmFsIEludGVudFNlbmRlciBhdXRoZW50aWNhdGlvbiA9Ci0gICAgICAgICAgICAgICAgQXV0aGVudGljYXRpb25BY3Rpdml0eS5jcmVhdGVTZW5kZXIobUNvbnRleHQsIDEsIHJlc3BvbnNlKTsKLQotICAgICAgICAvLyBDb25maWd1cmUgdGhlIHNlcnZpY2UgYmVoYXZpb3IKLSAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UobmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAuc2V0QXV0aGVudGljYXRpb24oYXV0aGVudGljYXRpb24sIElEX1VTRVJOQU1FLCBJRF9QQVNTV09SRCkKLSAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiVGFwIHRvIGF1dGggcmVzcG9uc2UiKSkKLSAgICAgICAgICAgICAgICAuYnVpbGQoKSk7Ci0KLSAgICAgICAgLy8gVHJpZ2dlciBhdXRvLWZpbGwuCi0gICAgICAgIG1BY3Rpdml0eS5vblVzZXJuYW1lKFZpZXc6OnJlcXVlc3RGb2N1cyk7Ci0KLSAgICAgICAgLy8gV2FpdCBmb3Igb25GaWxsKCkgYmVmb3JlIHByb2NlZWRpbmcuCi0gICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwotICAgICAgICBmaW5hbCBWaWV3IHVzZXJuYW1lID0gbUFjdGl2aXR5LmdldFVzZXJuYW1lKCk7Ci0gICAgICAgIGNhbGxiYWNrLmFzc2VydFVpU2hvd25FdmVudCh1c2VybmFtZSk7Ci0KLSAgICAgICAgLy8gU2VsZWN0IHRoZSBhdXRoZW50aWNhdGlvbiBkaWFsb2cuCi0gICAgICAgIHNVaUJvdC5zZWxlY3REYXRhc2V0KCJUYXAgdG8gYXV0aCByZXNwb25zZSIpOwotICAgICAgICBjYWxsYmFjay5hc3NlcnRVaUhpZGRlbkV2ZW50KHVzZXJuYW1lKTsKLSAgICAgICAgc1VpQm90LmFzc2VydE5vRGF0YXNldHMoKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RGaWxsUmVzcG9uc2VGaWx0ZXJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gU2V0IHNlcnZpY2UuCi0gICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKLSAgICAgICAgZmluYWwgTXlBdXRvZmlsbENhbGxiYWNrIGNhbGxiYWNrID0gbUFjdGl2aXR5LnJlZ2lzdGVyQ2FsbGJhY2soKTsKLQotICAgICAgICAvLyBQcmVwYXJlIHRoZSBhdXRoZW50aWNhdGVkIHJlc3BvbnNlCi0gICAgICAgIGZpbmFsIEJ1bmRsZSBjbGllbnRTdGF0ZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgY2xpZW50U3RhdGUucHV0U3RyaW5nKCJudW1iZXJzIiwgIjQ4MTUxNjIzNDIiKTsKLSAgICAgICAgZmluYWwgSW50ZW50U2VuZGVyIGF1dGhlbnRpY2F0aW9uID0gQXV0aGVudGljYXRpb25BY3Rpdml0eS5jcmVhdGVTZW5kZXIobUNvbnRleHQsIDEsCi0gICAgICAgICAgICAgICAgbmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkuYWRkRGF0YXNldCgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfVVNFUk5BTUUsICJkdWRlIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1BBU1NXT1JELCAic3dlZXQiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0SWQoIm5hbWUiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiRGF0YXNldCIpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRFeHRyYXMoY2xpZW50U3RhdGUpLmJ1aWxkKCkpOwotCi0gICAgICAgIC8vIENvbmZpZ3VyZSB0aGUgc2VydmljZSBiZWhhdmlvcgotICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgIC5zZXRBdXRoZW50aWNhdGlvbihhdXRoZW50aWNhdGlvbiwgSURfVVNFUk5BTUUsIElEX1BBU1NXT1JEKQotICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJUYXAgdG8gYXV0aCByZXNwb25zZSIpKQotICAgICAgICAgICAgICAgIC5zZXRFeHRyYXMoY2xpZW50U3RhdGUpCi0gICAgICAgICAgICAgICAgLmJ1aWxkKCkpOwotCi0gICAgICAgIC8vIFNldCBleHBlY3RhdGlvbiBmb3IgdGhlIGFjdGl2aXR5Ci0gICAgICAgIG1BY3Rpdml0eS5leHBlY3RBdXRvRmlsbCgiZHVkZSIsICJzd2VldCIpOwotCi0gICAgICAgIC8vIFRyaWdnZXIgYXV0by1maWxsLgotICAgICAgICBtQWN0aXZpdHkub25Vc2VybmFtZShWaWV3OjpyZXF1ZXN0Rm9jdXMpOwotCi0gICAgICAgIC8vIFdhaXQgZm9yIG9uRmlsbCgpIGJlZm9yZSBwcm9jZWVkaW5nLgotICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKLSAgICAgICAgZmluYWwgVmlldyB1c2VybmFtZSA9IG1BY3Rpdml0eS5nZXRVc2VybmFtZSgpOwotCi0gICAgICAgIC8vIE1ha2Ugc3VyZSBpdCdzIHNob3dpbmcgaW5pdGlhbGx5Li4uCi0gICAgICAgIGNhbGxiYWNrLmFzc2VydFVpU2hvd25FdmVudCh1c2VybmFtZSk7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnREYXRhc2V0cygiVGFwIHRvIGF1dGggcmVzcG9uc2UiKTsKLQotICAgICAgICAvLyAuLnRoZW4gdHlwZSBzb21ldGhpbmcgdG8gaGlkZSBpdC4KLSAgICAgICAgcnVuU2hlbGxDb21tYW5kKCJpbnB1dCBrZXlldmVudCBLRVlDT0RFX0EiKTsKLSAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlIaWRkZW5FdmVudCh1c2VybmFtZSk7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnROb0RhdGFzZXRzKCk7Ci0KLSAgICAgICAgLy8gTm93IGRlbGV0ZSB0aGUgY2hhciBhbmQgYXNzZXJ0IGl0J3Mgc2hvd24gYWdhaW4uLi4KLSAgICAgICAgcnVuU2hlbGxDb21tYW5kKCJpbnB1dCBrZXlldmVudCBLRVlDT0RFX0RFTCIpOwotICAgICAgICBjYWxsYmFjay5hc3NlcnRVaVNob3duRXZlbnQodXNlcm5hbWUpOwotICAgICAgICBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlRhcCB0byBhdXRoIHJlc3BvbnNlIik7Ci0KLSAgICAgICAgLy8gLi4uYW5kIHNlbGVjdCBpdCB0aGlzIHRpbWUKLSAgICAgICAgQXV0aGVudGljYXRpb25BY3Rpdml0eS5zZXRSZXN1bHRDb2RlKFJFU1VMVF9PSyk7Ci0gICAgICAgIHNVaUJvdC5zZWxlY3REYXRhc2V0KCJUYXAgdG8gYXV0aCByZXNwb25zZSIpOwotICAgICAgICBjYWxsYmFjay5hc3NlcnRVaUhpZGRlbkV2ZW50KHVzZXJuYW1lKTsKLSAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlTaG93bkV2ZW50KHVzZXJuYW1lKTsKLSAgICAgICAgZmluYWwgVWlPYmplY3QyIHBpY2tlciA9IHNVaUJvdC5hc3NlcnREYXRhc2V0cygiRGF0YXNldCIpOwotICAgICAgICBzVWlCb3Quc2VsZWN0RGF0YXNldChwaWNrZXIsICJEYXRhc2V0Iik7Ci0gICAgICAgIGNhbGxiYWNrLmFzc2VydFVpSGlkZGVuRXZlbnQodXNlcm5hbWUpOwotICAgICAgICBzVWlCb3QuYXNzZXJ0Tm9EYXRhc2V0cygpOwotCi0gICAgICAgIC8vIENoZWNrIHRoZSByZXN1bHRzLgotICAgICAgICBtQWN0aXZpdHkuYXNzZXJ0QXV0b0ZpbGxlZCgpOwotCi0gICAgICAgIGZpbmFsIEJ1bmRsZSBkYXRhID0gQXV0aGVudGljYXRpb25BY3Rpdml0eS5nZXREYXRhKCk7Ci0gICAgICAgIGFzc2VydFRoYXQoZGF0YSkuaXNOb3ROdWxsKCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBleHRyYVZhbHVlID0gZGF0YS5nZXRTdHJpbmcoIm51bWJlcnMiKTsKLSAgICAgICAgYXNzZXJ0VGhhdChleHRyYVZhbHVlKS5pc0VxdWFsVG8oIjQ4MTUxNjIzNDIiKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3REYXRhc2V0QXV0aFR3b0ZpZWxkcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBkYXRhc2V0QXV0aFR3b0ZpZWxkcyhmYWxzZSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGF0YXNldEF1dGhUd29GaWVsZHNVc2VyQ2FuY2Vsc0ZpcnN0QXR0ZW1wdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBkYXRhc2V0QXV0aFR3b0ZpZWxkcyh0cnVlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZGF0YXNldEF1dGhUd29GaWVsZHMoYm9vbGVhbiBjYW5jZWxGaXJzdEF0dGVtcHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBUT0RPOiBjdXJyZW50IEFQSSByZXF1aXJlcyB0aGVzZSBmaWVsZHMuLi4KLSAgICAgICAgZmluYWwgUmVtb3RlVmlld3MgYm9ndXNQcmVzZW50YXRpb24gPSBjcmVhdGVQcmVzZW50YXRpb24oIldoYXRldmVyIG1hbiwgSSdtIG5vdCB1c2VkLi4uIik7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBib2d1c1ZhbHVlID0gIlkgVSBSRVFVSVJFIElUPyI7Ci0KLSAgICAgICAgLy8gU2V0IHNlcnZpY2UuCi0gICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKLSAgICAgICAgZmluYWwgTXlBdXRvZmlsbENhbGxiYWNrIGNhbGxiYWNrID0gbUFjdGl2aXR5LnJlZ2lzdGVyQ2FsbGJhY2soKTsKLQotICAgICAgICAvLyBQcmVwYXJlIHRoZSBhdXRoZW50aWNhdGVkIHJlc3BvbnNlCi0gICAgICAgIGZpbmFsIEludGVudFNlbmRlciBhdXRoZW50aWNhdGlvbiA9IEF1dGhlbnRpY2F0aW9uQWN0aXZpdHkuY3JlYXRlU2VuZGVyKG1Db250ZXh0LCAxLAotICAgICAgICAgICAgICAgIG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1VTRVJOQU1FLCAiZHVkZSIpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfUEFTU1dPUkQsICJzd2VldCIpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGJvZ3VzUHJlc2VudGF0aW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOwotCi0gICAgICAgIC8vIENvbmZpZ3VyZSB0aGUgc2VydmljZSBiZWhhdmlvcgotICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgIC5hZGREYXRhc2V0KG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1VTRVJOQU1FLCBib2d1c1ZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1BBU1NXT1JELCBib2d1c1ZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oIlRhcCB0byBhdXRoIGRhdGFzZXQiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRBdXRoZW50aWNhdGlvbihhdXRoZW50aWNhdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQotICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKLQotICAgICAgICAvLyBTZXQgZXhwZWN0YXRpb24gZm9yIHRoZSBhY3Rpdml0eQotICAgICAgICBtQWN0aXZpdHkuZXhwZWN0QXV0b0ZpbGwoImR1ZGUiLCAic3dlZXQiKTsKLQotICAgICAgICAvLyBUcmlnZ2VyIGF1dG8tZmlsbC4KLSAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoVmlldzo6cmVxdWVzdEZvY3VzKTsKLQotICAgICAgICAvLyBXYWl0IGZvciBvbkZpbGwoKSBiZWZvcmUgcHJvY2VlZGluZy4KLSAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7Ci0gICAgICAgIGZpbmFsIFZpZXcgdXNlcm5hbWUgPSBtQWN0aXZpdHkuZ2V0VXNlcm5hbWUoKTsKLSAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlTaG93bkV2ZW50KHVzZXJuYW1lKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJUYXAgdG8gYXV0aCBkYXRhc2V0Iik7Ci0KLSAgICAgICAgLy8gTWFrZSBzdXJlIFVJIGlzIHNob3cgb24gMm5kIGZpZWxkIGFzIHdlbGwKLSAgICAgICAgZmluYWwgVmlldyBwYXNzd29yZCA9IG1BY3Rpdml0eS5nZXRQYXNzd29yZCgpOwotICAgICAgICBtQWN0aXZpdHkub25QYXNzd29yZChWaWV3OjpyZXF1ZXN0Rm9jdXMpOwotICAgICAgICBjYWxsYmFjay5hc3NlcnRVaUhpZGRlbkV2ZW50KHVzZXJuYW1lKTsKLSAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlTaG93bkV2ZW50KHBhc3N3b3JkKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJUYXAgdG8gYXV0aCBkYXRhc2V0Iik7Ci0KLSAgICAgICAgLy8gTm93IHRhcCBvbiAxc3QgZmllbGQgdG8gc2hvdyBpdCBhZ2Fpbi4uLgotICAgICAgICBtQWN0aXZpdHkub25Vc2VybmFtZShWaWV3OjpyZXF1ZXN0Rm9jdXMpOwotICAgICAgICBjYWxsYmFjay5hc3NlcnRVaUhpZGRlbkV2ZW50KHBhc3N3b3JkKTsKLSAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlTaG93bkV2ZW50KHVzZXJuYW1lKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJUYXAgdG8gYXV0aCBkYXRhc2V0Iik7Ci0KLSAgICAgICAgaWYgKGNhbmNlbEZpcnN0QXR0ZW1wdCkgewotICAgICAgICAgICAgLy8gVHJpZ2dlciB0aGUgYXV0aCBkaWFsb2csIGJ1dCBlbXVsYXRlIGNhbmNlbC4KLSAgICAgICAgICAgIEF1dGhlbnRpY2F0aW9uQWN0aXZpdHkuc2V0UmVzdWx0Q29kZShSRVNVTFRfQ0FOQ0VMRUQpOwotICAgICAgICAgICAgc1VpQm90LnNlbGVjdERhdGFzZXQoIlRhcCB0byBhdXRoIGRhdGFzZXQiKTsKLSAgICAgICAgICAgIGNhbGxiYWNrLmFzc2VydFVpSGlkZGVuRXZlbnQodXNlcm5hbWUpOwotICAgICAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlTaG93bkV2ZW50KHVzZXJuYW1lKTsKLSAgICAgICAgICAgIHNVaUJvdC5hc3NlcnREYXRhc2V0cygiVGFwIHRvIGF1dGggZGF0YXNldCIpOwotCi0gICAgICAgICAgICAvLyBNYWtlIHN1cmUgaXQncyBzdGlsbCBzaG93biBvbiBvdGhlciBmaWVsZHMuLi4KLSAgICAgICAgICAgIG1BY3Rpdml0eS5vblBhc3N3b3JkKFZpZXc6OnJlcXVlc3RGb2N1cyk7Ci0gICAgICAgICAgICBjYWxsYmFjay5hc3NlcnRVaUhpZGRlbkV2ZW50KHVzZXJuYW1lKTsKLSAgICAgICAgICAgIGNhbGxiYWNrLmFzc2VydFVpU2hvd25FdmVudChwYXNzd29yZCk7Ci0gICAgICAgICAgICBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlRhcCB0byBhdXRoIGRhdGFzZXQiKTsKLQotICAgICAgICAgICAgLy8gVGFwIG9uIDFzdCBmaWVsZCB0byBzaG93IGl0IGFnYWluLi4uCi0gICAgICAgICAgICBtQWN0aXZpdHkub25Vc2VybmFtZShWaWV3OjpyZXF1ZXN0Rm9jdXMpOwotICAgICAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlIaWRkZW5FdmVudChwYXNzd29yZCk7Ci0gICAgICAgICAgICBjYWxsYmFjay5hc3NlcnRVaVNob3duRXZlbnQodXNlcm5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gLi4uYW5kIHNlbGVjdCBpdCB0aGlzIHRpbWUKLSAgICAgICAgQXV0aGVudGljYXRpb25BY3Rpdml0eS5zZXRSZXN1bHRDb2RlKFJFU1VMVF9PSyk7Ci0gICAgICAgIHNVaUJvdC5zZWxlY3REYXRhc2V0KCJUYXAgdG8gYXV0aCBkYXRhc2V0Iik7Ci0gICAgICAgIGNhbGxiYWNrLmFzc2VydFVpSGlkZGVuRXZlbnQodXNlcm5hbWUpOwotICAgICAgICBzVWlCb3QuYXNzZXJ0Tm9EYXRhc2V0cygpOwotCi0gICAgICAgIC8vIENoZWNrIHRoZSByZXN1bHRzLgotICAgICAgICBtQWN0aXZpdHkuYXNzZXJ0QXV0b0ZpbGxlZCgpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdERhdGFzZXRBdXRoVHdvRmllbGRzUmVwbGFjZVJlc3BvbnNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFNldCBzZXJ2aWNlLgotICAgICAgICBlbmFibGVTZXJ2aWNlKCk7Ci0gICAgICAgIGZpbmFsIE15QXV0b2ZpbGxDYWxsYmFjayBjYWxsYmFjayA9IG1BY3Rpdml0eS5yZWdpc3RlckNhbGxiYWNrKCk7Ci0KLSAgICAgICAgLy8gUHJlcGFyZSB0aGUgYXV0aGVudGljYXRlZCByZXNwb25zZQotICAgICAgICBmaW5hbCBJbnRlbnRTZW5kZXIgYXV0aGVudGljYXRpb24gPSBBdXRoZW50aWNhdGlvbkFjdGl2aXR5LmNyZWF0ZVNlbmRlcihtQ29udGV4dCwgMSwKLSAgICAgICAgICAgICAgICBuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKS5hZGREYXRhc2V0KAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgImR1ZGUiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfUEFTU1dPUkQsICJzd2VldCIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJEYXRhc2V0IikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOwotCi0gICAgICAgIC8vIFNldCB1cCB0aGUgYXV0aGVudGljYXRpb24gcmVzcG9uc2UgY2xpZW50IHN0YXRlCi0gICAgICAgIGZpbmFsIEJ1bmRsZSBhdXRoZW50aW9uQ2xpZW50U3RhdGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgIGF1dGhlbnRpb25DbGllbnRTdGF0ZS5wdXRDaGFyU2VxdWVuY2UoImNsaWVudFN0YXRlS2V5MSIsICJjbGllbnRTdGF0ZVZhbHVlMSIpOwotCi0gICAgICAgIC8vIENvbmZpZ3VyZSB0aGUgc2VydmljZSBiZWhhdmlvcgotICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgIC5hZGREYXRhc2V0KG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1VTRVJOQU1FLCAoQXV0b2ZpbGxWYWx1ZSkgbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9QQVNTV09SRCwgKEF1dG9maWxsVmFsdWUpIG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiVGFwIHRvIGF1dGggZGF0YXNldCIpKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEF1dGhlbnRpY2F0aW9uKGF1dGhlbnRpY2F0aW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCi0gICAgICAgICAgICAgICAgLnNldEV4dHJhcyhhdXRoZW50aW9uQ2xpZW50U3RhdGUpCi0gICAgICAgICAgICAgICAgLmJ1aWxkKCkpOwotCi0gICAgICAgIC8vIFNldCBleHBlY3RhdGlvbiBmb3IgdGhlIGFjdGl2aXR5Ci0gICAgICAgIG1BY3Rpdml0eS5leHBlY3RBdXRvRmlsbCgiZHVkZSIsICJzd2VldCIpOwotCi0gICAgICAgIC8vIFRyaWdnZXIgYXV0by1maWxsLgotICAgICAgICBtQWN0aXZpdHkub25Vc2VybmFtZShWaWV3OjpyZXF1ZXN0Rm9jdXMpOwotCi0gICAgICAgIC8vIFdhaXQgZm9yIG9uRmlsbCgpIGJlZm9yZSBwcm9jZWVkaW5nLgotICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKLSAgICAgICAgZmluYWwgVmlldyB1c2VybmFtZSA9IG1BY3Rpdml0eS5nZXRVc2VybmFtZSgpOwotCi0gICAgICAgIC8vIEF1dGhlbnRpY2F0ZQotICAgICAgICBjYWxsYmFjay5hc3NlcnRVaVNob3duRXZlbnQodXNlcm5hbWUpOwotICAgICAgICBzVWlCb3Quc2VsZWN0RGF0YXNldCgiVGFwIHRvIGF1dGggZGF0YXNldCIpOwotICAgICAgICBjYWxsYmFjay5hc3NlcnRVaUhpZGRlbkV2ZW50KHVzZXJuYW1lKTsKLQotICAgICAgICAvLyBTZWxlY3QgYSBkYXRhc2V0IGZyb20gdGhlIG5ldyByZXNwb25zZQotICAgICAgICBjYWxsYmFjay5hc3NlcnRVaVNob3duRXZlbnQodXNlcm5hbWUpOwotICAgICAgICBzVWlCb3Quc2VsZWN0RGF0YXNldCgiRGF0YXNldCIpOwotICAgICAgICBjYWxsYmFjay5hc3NlcnRVaUhpZGRlbkV2ZW50KHVzZXJuYW1lKTsKLSAgICAgICAgc1VpQm90LmFzc2VydE5vRGF0YXNldHMoKTsKLQotICAgICAgICAvLyBDaGVjayB0aGUgcmVzdWx0cy4KLSAgICAgICAgbUFjdGl2aXR5LmFzc2VydEF1dG9GaWxsZWQoKTsKLQotICAgICAgICBmaW5hbCBCdW5kbGUgZGF0YSA9IEF1dGhlbnRpY2F0aW9uQWN0aXZpdHkuZ2V0RGF0YSgpOwotICAgICAgICBhc3NlcnRUaGF0KGRhdGEpLmlzTm90TnVsbCgpOwotICAgICAgICBmaW5hbCBTdHJpbmcgZXh0cmFWYWx1ZSA9IGRhdGEuZ2V0U3RyaW5nKCJjbGllbnRTdGF0ZUtleTEiKTsKLSAgICAgICAgYXNzZXJ0VGhhdChleHRyYVZhbHVlKS5pc0VxdWFsVG8oImNsaWVudFN0YXRlVmFsdWUxIik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGF0YXNldEF1dGhUd29GaWVsZHNOb1ZhbHVlcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBTZXQgc2VydmljZS4KLSAgICAgICAgZW5hYmxlU2VydmljZSgpOwotICAgICAgICBmaW5hbCBNeUF1dG9maWxsQ2FsbGJhY2sgY2FsbGJhY2sgPSBtQWN0aXZpdHkucmVnaXN0ZXJDYWxsYmFjaygpOwotCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgYXV0aGVudGljYXRpb24gaW50ZW50Ci0gICAgICAgIGZpbmFsIEludGVudFNlbmRlciBhdXRoZW50aWNhdGlvbiA9IEF1dGhlbnRpY2F0aW9uQWN0aXZpdHkuY3JlYXRlU2VuZGVyKG1Db250ZXh0LCAxLAotICAgICAgICAgICAgICAgIG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1VTRVJOQU1FLCAiZHVkZSIpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfUEFTU1dPUkQsICJzd2VldCIpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiRGF0YXNldCIpKQotICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOwotCi0gICAgICAgIC8vIENvbmZpZ3VyZSB0aGUgc2VydmljZSBiZWhhdmlvcgotICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgIC5hZGREYXRhc2V0KG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1VTRVJOQU1FLCAoU3RyaW5nKSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1BBU1NXT1JELCAoU3RyaW5nKSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oIlRhcCB0byBhdXRoIGRhdGFzZXQiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRBdXRoZW50aWNhdGlvbihhdXRoZW50aWNhdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQotICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKLQotICAgICAgICAvLyBTZXQgZXhwZWN0YXRpb24gZm9yIHRoZSBhY3Rpdml0eQotICAgICAgICBtQWN0aXZpdHkuZXhwZWN0QXV0b0ZpbGwoImR1ZGUiLCAic3dlZXQiKTsKLQotICAgICAgICAvLyBUcmlnZ2VyIGF1dG8tZmlsbC4KLSAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoVmlldzo6cmVxdWVzdEZvY3VzKTsKLQotICAgICAgICAvLyBXYWl0IGZvciBvbkZpbGwoKSBiZWZvcmUgcHJvY2VlZGluZy4KLSAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7Ci0gICAgICAgIGZpbmFsIFZpZXcgdXNlcm5hbWUgPSBtQWN0aXZpdHkuZ2V0VXNlcm5hbWUoKTsKLQotICAgICAgICAvLyBBdXRoZW50aWNhdGUKLSAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlTaG93bkV2ZW50KHVzZXJuYW1lKTsKLSAgICAgICAgc1VpQm90LnNlbGVjdERhdGFzZXQoIlRhcCB0byBhdXRoIGRhdGFzZXQiKTsKLSAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlIaWRkZW5FdmVudCh1c2VybmFtZSk7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnROb0RhdGFzZXRzKCk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgdGhlIHJlc3VsdHMuCi0gICAgICAgIG1BY3Rpdml0eS5hc3NlcnRBdXRvRmlsbGVkKCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGF0YXNldEF1dGhUd29EYXRhc2V0cygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBUT0RPOiBjdXJyZW50IEFQSSByZXF1aXJlcyB0aGVzZSBmaWVsZHMuLi4KLSAgICAgICAgZmluYWwgUmVtb3RlVmlld3MgYm9ndXNQcmVzZW50YXRpb24gPSBjcmVhdGVQcmVzZW50YXRpb24oIldoYXRldmVyIG1hbiwgSSdtIG5vdCB1c2VkLi4uIik7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBib2d1c1ZhbHVlID0gIlkgVSBSRVFVSVJFIElUPyI7Ci0KLSAgICAgICAgLy8gU2V0IHNlcnZpY2UuCi0gICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKLSAgICAgICAgZmluYWwgTXlBdXRvZmlsbENhbGxiYWNrIGNhbGxiYWNrID0gbUFjdGl2aXR5LnJlZ2lzdGVyQ2FsbGJhY2soKTsKLQotICAgICAgICAvLyBDcmVhdGUgdGhlIGF1dGhlbnRpY2F0aW9uIGludGVudHMKLSAgICAgICAgZmluYWwgQ2FubmVkRGF0YXNldCB1bmxvY2tlZERhdGFzZXQgPSBuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfVVNFUk5BTUUsICJkdWRlIikKLSAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfUEFTU1dPUkQsICJzd2VldCIpCi0gICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihib2d1c1ByZXNlbnRhdGlvbikKLSAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLSAgICAgICAgZmluYWwgSW50ZW50U2VuZGVyIGF1dGhlbnRpY2F0aW9uMSA9IEF1dGhlbnRpY2F0aW9uQWN0aXZpdHkuY3JlYXRlU2VuZGVyKG1Db250ZXh0LCAxLAotICAgICAgICAgICAgICAgIHVubG9ja2VkRGF0YXNldCk7Ci0gICAgICAgIGZpbmFsIEludGVudFNlbmRlciBhdXRoZW50aWNhdGlvbjIgPSBBdXRoZW50aWNhdGlvbkFjdGl2aXR5LmNyZWF0ZVNlbmRlcihtQ29udGV4dCwgMiwKLSAgICAgICAgICAgICAgICB1bmxvY2tlZERhdGFzZXQpOwotCi0gICAgICAgIC8vIENvbmZpZ3VyZSB0aGUgc2VydmljZSBiZWhhdmlvcgotICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgIC5hZGREYXRhc2V0KG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1VTRVJOQU1FLCBib2d1c1ZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1BBU1NXT1JELCBib2d1c1ZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oIlRhcCB0byBhdXRoIGRhdGFzZXQgMSIpKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEF1dGhlbnRpY2F0aW9uKGF1dGhlbnRpY2F0aW9uMSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQotICAgICAgICAgICAgICAgIC5hZGREYXRhc2V0KG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1VTRVJOQU1FLCBib2d1c1ZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1BBU1NXT1JELCBib2d1c1ZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oIlRhcCB0byBhdXRoIGRhdGFzZXQgMiIpKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEF1dGhlbnRpY2F0aW9uKGF1dGhlbnRpY2F0aW9uMikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQotICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKLQotICAgICAgICAvLyBTZXQgZXhwZWN0YXRpb24gZm9yIHRoZSBhY3Rpdml0eQotICAgICAgICBtQWN0aXZpdHkuZXhwZWN0QXV0b0ZpbGwoImR1ZGUiLCAic3dlZXQiKTsKLQotICAgICAgICAvLyBUcmlnZ2VyIGF1dG8tZmlsbC4KLSAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoVmlldzo6cmVxdWVzdEZvY3VzKTsKLQotICAgICAgICAvLyBXYWl0IGZvciBvbkZpbGwoKSBiZWZvcmUgcHJvY2VlZGluZy4KLSAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7Ci0gICAgICAgIGZpbmFsIFZpZXcgdXNlcm5hbWUgPSBtQWN0aXZpdHkuZ2V0VXNlcm5hbWUoKTsKLQotICAgICAgICAvLyBBdXRoZW50aWNhdGUKLSAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlTaG93bkV2ZW50KHVzZXJuYW1lKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJUYXAgdG8gYXV0aCBkYXRhc2V0IDEiLCAiVGFwIHRvIGF1dGggZGF0YXNldCAyIik7Ci0KLSAgICAgICAgc1VpQm90LnNlbGVjdERhdGFzZXQoIlRhcCB0byBhdXRoIGRhdGFzZXQgMSIpOwotICAgICAgICBjYWxsYmFjay5hc3NlcnRVaUhpZGRlbkV2ZW50KHVzZXJuYW1lKTsKLSAgICAgICAgc1VpQm90LmFzc2VydE5vRGF0YXNldHMoKTsKLQotICAgICAgICAvLyBDaGVjayB0aGUgcmVzdWx0cy4KLSAgICAgICAgbUFjdGl2aXR5LmFzc2VydEF1dG9GaWxsZWQoKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3REYXRhc2V0QXV0aE1peGVkU2VsZWN0QXV0aCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBkYXRhc2V0QXV0aE1peGVkVGVzdCh0cnVlKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3REYXRhc2V0QXV0aE1peGVkU2VsZWN0Tm9uQXV0aCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBkYXRhc2V0QXV0aE1peGVkVGVzdChmYWxzZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRhdGFzZXRBdXRoTWl4ZWRUZXN0KGJvb2xlYW4gc2VsZWN0QXV0aCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFNldCBzZXJ2aWNlLgotICAgICAgICBlbmFibGVTZXJ2aWNlKCk7Ci0gICAgICAgIGZpbmFsIE15QXV0b2ZpbGxDYWxsYmFjayBjYWxsYmFjayA9IG1BY3Rpdml0eS5yZWdpc3RlckNhbGxiYWNrKCk7Ci0KLSAgICAgICAgLy8gUHJlcGFyZSB0aGUgYXV0aGVudGljYXRlZCByZXNwb25zZQotICAgICAgICBmaW5hbCBJbnRlbnRTZW5kZXIgYXV0aGVudGljYXRpb24gPSBBdXRoZW50aWNhdGlvbkFjdGl2aXR5LmNyZWF0ZVNlbmRlcihtQ29udGV4dCwgMSwKLSAgICAgICAgICAgICAgICBuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgImR1ZGUiKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1BBU1NXT1JELCAic3dlZXQiKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oIkRhdGFzZXQiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKLQotICAgICAgICAvLyBDb25maWd1cmUgdGhlIHNlcnZpY2UgYmVoYXZpb3IKLSAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UobmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAuYWRkRGF0YXNldChuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgImR1ZGUiKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1BBU1NXT1JELCAic3dlZXQiKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oIlRhcCB0byBhdXRoIGRhdGFzZXQiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRBdXRoZW50aWNhdGlvbihhdXRoZW50aWNhdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQotICAgICAgICAgICAgICAgIC5hZGREYXRhc2V0KG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1VTRVJOQU1FLCAiRFVERSIpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfUEFTU1dPUkQsICJTV0VFVCIpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiV2hhdCwgbWUgYXV0aD8iKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQotICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKLQotICAgICAgICAvLyBTZXQgZXhwZWN0YXRpb24gZm9yIHRoZSBhY3Rpdml0eQotICAgICAgICBpZiAoc2VsZWN0QXV0aCkgewotICAgICAgICAgICAgbUFjdGl2aXR5LmV4cGVjdEF1dG9GaWxsKCJkdWRlIiwgInN3ZWV0Iik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQWN0aXZpdHkuZXhwZWN0QXV0b0ZpbGwoIkRVREUiLCAiU1dFRVQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRyaWdnZXIgYXV0by1maWxsLgotICAgICAgICBtQWN0aXZpdHkub25Vc2VybmFtZShWaWV3OjpyZXF1ZXN0Rm9jdXMpOwotCi0gICAgICAgIC8vIFdhaXQgZm9yIG9uRmlsbCgpIGJlZm9yZSBwcm9jZWVkaW5nLgotICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKLSAgICAgICAgZmluYWwgVmlldyB1c2VybmFtZSA9IG1BY3Rpdml0eS5nZXRVc2VybmFtZSgpOwotCi0gICAgICAgIC8vIEF1dGhlbnRpY2F0ZQotICAgICAgICBjYWxsYmFjay5hc3NlcnRVaVNob3duRXZlbnQodXNlcm5hbWUpOwotICAgICAgICBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlRhcCB0byBhdXRoIGRhdGFzZXQiLCAiV2hhdCwgbWUgYXV0aD8iKTsKLQotICAgICAgICBmaW5hbCBTdHJpbmcgY2hvc2VuT25lID0gc2VsZWN0QXV0aCA/ICJUYXAgdG8gYXV0aCBkYXRhc2V0IiA6ICJXaGF0LCBtZSBhdXRoPyI7Ci0gICAgICAgIHNVaUJvdC5zZWxlY3REYXRhc2V0KGNob3Nlbk9uZSk7Ci0gICAgICAgIGNhbGxiYWNrLmFzc2VydFVpSGlkZGVuRXZlbnQodXNlcm5hbWUpOwotICAgICAgICBzVWlCb3QuYXNzZXJ0Tm9EYXRhc2V0cygpOwotCi0gICAgICAgIC8vIENoZWNrIHRoZSByZXN1bHRzLgotICAgICAgICBtQWN0aXZpdHkuYXNzZXJ0QXV0b0ZpbGxlZCgpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdERhdGFzZXRBdXRoRmlsdGVyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFRPRE86IGN1cnJlbnQgQVBJIHJlcXVpcmVzIHRoZXNlIGZpZWxkcy4uLgotICAgICAgICBmaW5hbCBSZW1vdGVWaWV3cyBib2d1c1ByZXNlbnRhdGlvbiA9IGNyZWF0ZVByZXNlbnRhdGlvbigiV2hhdGV2ZXIgbWFuLCBJJ20gbm90IHVzZWQuLi4iKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGJvZ3VzVmFsdWUgPSAiWSBVIFJFUVVJUkUgSVQ/IjsKLQotICAgICAgICAvLyBTZXQgc2VydmljZS4KLSAgICAgICAgZW5hYmxlU2VydmljZSgpOwotICAgICAgICBmaW5hbCBNeUF1dG9maWxsQ2FsbGJhY2sgY2FsbGJhY2sgPSBtQWN0aXZpdHkucmVnaXN0ZXJDYWxsYmFjaygpOwotCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgYXV0aGVudGljYXRpb24gaW50ZW50cwotICAgICAgICBmaW5hbCBDYW5uZWREYXRhc2V0IHVubG9ja2VkRGF0YXNldCA9IG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgImR1ZGUiKQotICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9QQVNTV09SRCwgInN3ZWV0IikKLSAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGJvZ3VzUHJlc2VudGF0aW9uKQotICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICAgICAgICBmaW5hbCBJbnRlbnRTZW5kZXIgYXV0aGVudGljYXRpb24gPSBBdXRoZW50aWNhdGlvbkFjdGl2aXR5LmNyZWF0ZVNlbmRlcihtQ29udGV4dCwgMSwKLSAgICAgICAgICAgICAgICB1bmxvY2tlZERhdGFzZXQpOwotCi0gICAgICAgIC8vIENvbmZpZ3VyZSB0aGUgc2VydmljZSBiZWhhdmlvcgotICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgIC5hZGREYXRhc2V0KG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1VTRVJOQU1FLCBib2d1c1ZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1BBU1NXT1JELCBib2d1c1ZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oIlRhcCB0byBhdXRoIGRhdGFzZXQiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRBdXRoZW50aWNhdGlvbihhdXRoZW50aWNhdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQotICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKLQotICAgICAgICAvLyBTZXQgZXhwZWN0YXRpb24gZm9yIHRoZSBhY3Rpdml0eQotICAgICAgICBtQWN0aXZpdHkuZXhwZWN0QXV0b0ZpbGwoImR1ZGUiLCAic3dlZXQiKTsKLQotICAgICAgICAvLyBUcmlnZ2VyIGF1dG8tZmlsbC4KLSAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoVmlldzo6cmVxdWVzdEZvY3VzKTsKLQotICAgICAgICAvLyBXYWl0IGZvciBvbkZpbGwoKSBiZWZvcmUgcHJvY2VlZGluZy4KLSAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7Ci0gICAgICAgIGZpbmFsIFZpZXcgdXNlcm5hbWUgPSBtQWN0aXZpdHkuZ2V0VXNlcm5hbWUoKTsKLQotICAgICAgICAvLyBNYWtlIHN1cmUgaXQncyBzaG93aW5nIGluaXRpYWxseS4uLgotICAgICAgICBjYWxsYmFjay5hc3NlcnRVaVNob3duRXZlbnQodXNlcm5hbWUpOwotICAgICAgICBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlRhcCB0byBhdXRoIGRhdGFzZXQiKTsKLQotICAgICAgICAvLyAuLnRoZW4gdHlwZSBzb21ldGhpbmcgdG8gaGlkZSBpdC4KLSAgICAgICAgcnVuU2hlbGxDb21tYW5kKCJpbnB1dCBrZXlldmVudCBLRVlDT0RFX0EiKTsKLSAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlIaWRkZW5FdmVudCh1c2VybmFtZSk7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnROb0RhdGFzZXRzKCk7Ci0KLSAgICAgICAgLy8gTm93IGRlbGV0ZSB0aGUgY2hhciBhbmQgYXNzZXJ0IGl0J3Mgc2hvd24gYWdhaW4uLi4KLSAgICAgICAgcnVuU2hlbGxDb21tYW5kKCJpbnB1dCBrZXlldmVudCBLRVlDT0RFX0RFTCIpOwotICAgICAgICBjYWxsYmFjay5hc3NlcnRVaVNob3duRXZlbnQodXNlcm5hbWUpOwotICAgICAgICBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlRhcCB0byBhdXRoIGRhdGFzZXQiKTsKLQotICAgICAgICAvLyAuLi5hbmQgc2VsZWN0IGl0IHRoaXMgdGltZQotICAgICAgICBzVWlCb3Quc2VsZWN0RGF0YXNldCgiVGFwIHRvIGF1dGggZGF0YXNldCIpOwotICAgICAgICBjYWxsYmFjay5hc3NlcnRVaUhpZGRlbkV2ZW50KHVzZXJuYW1lKTsKLSAgICAgICAgc1VpQm90LmFzc2VydE5vRGF0YXNldHMoKTsKLQotICAgICAgICAvLyBDaGVjayB0aGUgcmVzdWx0cy4KLSAgICAgICAgbUFjdGl2aXR5LmFzc2VydEF1dG9GaWxsZWQoKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3REYXRhc2V0QXV0aE1peGVkRmlsdGVyaW5nU2VsZWN0QXV0aCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBkYXRhc2V0QXV0aE1peGVkRmlsdGVyaW5nVGVzdCh0cnVlKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3REYXRhc2V0QXV0aE1peGVkRmlsdGVyaW5nU2VsZWN0Tm9uQXV0aCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBkYXRhc2V0QXV0aE1peGVkRmlsdGVyaW5nVGVzdChmYWxzZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRhdGFzZXRBdXRoTWl4ZWRGaWx0ZXJpbmdUZXN0KGJvb2xlYW4gc2VsZWN0QXV0aCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFRPRE86IGN1cnJlbnQgQVBJIHJlcXVpcmVzIHRoZXNlIGZpZWxkcy4uLgotICAgICAgICBmaW5hbCBSZW1vdGVWaWV3cyBib2d1c1ByZXNlbnRhdGlvbiA9IGNyZWF0ZVByZXNlbnRhdGlvbigiV2hhdGV2ZXIgbWFuLCBJJ20gbm90IHVzZWQuLi4iKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGJvZ3VzVmFsdWUgPSAiWSBVIFJFUVVJUkUgSVQ/IjsKLQotICAgICAgICAvLyBTZXQgc2VydmljZS4KLSAgICAgICAgZW5hYmxlU2VydmljZSgpOwotICAgICAgICBmaW5hbCBNeUF1dG9maWxsQ2FsbGJhY2sgY2FsbGJhY2sgPSBtQWN0aXZpdHkucmVnaXN0ZXJDYWxsYmFjaygpOwotCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgYXV0aGVudGljYXRpb24gaW50ZW50cwotICAgICAgICBmaW5hbCBDYW5uZWREYXRhc2V0IHVubG9ja2VkRGF0YXNldCA9IG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgIkRVREUiKQotICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9QQVNTV09SRCwgIlNXRUVUIikKLSAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGJvZ3VzUHJlc2VudGF0aW9uKQotICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICAgICAgICBmaW5hbCBJbnRlbnRTZW5kZXIgYXV0aGVudGljYXRpb24gPSBBdXRoZW50aWNhdGlvbkFjdGl2aXR5LmNyZWF0ZVNlbmRlcihtQ29udGV4dCwgMSwKLSAgICAgICAgICAgICAgICB1bmxvY2tlZERhdGFzZXQpOwotCi0gICAgICAgIC8vIENvbmZpZ3VyZSB0aGUgc2VydmljZSBiZWhhdmlvcgotICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgIC5hZGREYXRhc2V0KG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1VTRVJOQU1FLCBib2d1c1ZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1BBU1NXT1JELCBib2d1c1ZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oIlRhcCB0byBhdXRoIGRhdGFzZXQiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRBdXRoZW50aWNhdGlvbihhdXRoZW50aWNhdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQotICAgICAgICAgICAgICAgIC5hZGREYXRhc2V0KG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1VTRVJOQU1FLCAiZHVkZSIpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfUEFTU1dPUkQsICJzd2VldCIpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiV2hhdCwgbWUgYXV0aD8iKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQotICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKLQotICAgICAgICAvLyBTZXQgZXhwZWN0YXRpb24gZm9yIHRoZSBhY3Rpdml0eQotICAgICAgICBpZiAoc2VsZWN0QXV0aCkgewotICAgICAgICAgICAgbUFjdGl2aXR5LmV4cGVjdEF1dG9GaWxsKCJEVURFIiwgIlNXRUVUIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQWN0aXZpdHkuZXhwZWN0QXV0b0ZpbGwoImR1ZGUiLCAic3dlZXQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRyaWdnZXIgYXV0by1maWxsLgotICAgICAgICBtQWN0aXZpdHkub25Vc2VybmFtZShWaWV3OjpyZXF1ZXN0Rm9jdXMpOwotCi0gICAgICAgIC8vIFdhaXQgZm9yIG9uRmlsbCgpIGJlZm9yZSBwcm9jZWVkaW5nLgotICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKLSAgICAgICAgZmluYWwgVmlldyB1c2VybmFtZSA9IG1BY3Rpdml0eS5nZXRVc2VybmFtZSgpOwotCi0gICAgICAgIC8vIE1ha2Ugc3VyZSBpdCdzIHNob3dpbmcgaW5pdGlhbGx5Li4uCi0gICAgICAgIGNhbGxiYWNrLmFzc2VydFVpU2hvd25FdmVudCh1c2VybmFtZSk7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnREYXRhc2V0cygiVGFwIHRvIGF1dGggZGF0YXNldCIsICJXaGF0LCBtZSBhdXRoPyIpOwotCi0gICAgICAgIC8vIEZpbHRlciB0aGUgYXV0aCBkYXRhc2V0LgotICAgICAgICBydW5TaGVsbENvbW1hbmQoImlucHV0IGtleWV2ZW50IEtFWUNPREVfRCIpOwotICAgICAgICBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoIldoYXQsIG1lIGF1dGg/Iik7Ci0KLSAgICAgICAgLy8gRmlsdGVyIGFsbC4KLSAgICAgICAgcnVuU2hlbGxDb21tYW5kKCJpbnB1dCBrZXlldmVudCBLRVlDT0RFX1ciKTsKLSAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlIaWRkZW5FdmVudCh1c2VybmFtZSk7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnROb0RhdGFzZXRzKCk7Ci0KLSAgICAgICAgLy8gTm93IGRlbGV0ZSB0aGUgY2hhciBhbmQgYXNzZXJ0IHRoZSBub24tYXV0aCBpcyBzaG93biBhZ2Fpbi4KLSAgICAgICAgcnVuU2hlbGxDb21tYW5kKCJpbnB1dCBrZXlldmVudCBLRVlDT0RFX0RFTCIpOwotICAgICAgICBjYWxsYmFjay5hc3NlcnRVaVNob3duRXZlbnQodXNlcm5hbWUpOwotICAgICAgICBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoIldoYXQsIG1lIGF1dGg/Iik7Ci0KLSAgICAgICAgLy8gRGVsZXRlIGFnYWluIGFuZCBhc3NlcnQgYWxsIGRhdGFzZXQgYXJlIHNob3duLgotICAgICAgICBydW5TaGVsbENvbW1hbmQoImlucHV0IGtleWV2ZW50IEtFWUNPREVfREVMIik7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnREYXRhc2V0cygiVGFwIHRvIGF1dGggZGF0YXNldCIsICJXaGF0LCBtZSBhdXRoPyIpOwotCi0gICAgICAgIC8vIC4uLmFuZCBzZWxlY3QgaXQgdGhpcyB0aW1lCi0gICAgICAgIGZpbmFsIFN0cmluZyBjaG9zZW5PbmUgPSBzZWxlY3RBdXRoID8gIlRhcCB0byBhdXRoIGRhdGFzZXQiIDogIldoYXQsIG1lIGF1dGg/IjsKLSAgICAgICAgc1VpQm90LnNlbGVjdERhdGFzZXQoY2hvc2VuT25lKTsKLSAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlIaWRkZW5FdmVudCh1c2VybmFtZSk7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnROb0RhdGFzZXRzKCk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgdGhlIHJlc3VsdHMuCi0gICAgICAgIG1BY3Rpdml0eS5hc3NlcnRBdXRvRmlsbGVkKCk7Ci0gICAgfQotCi0gICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gU2VydmljZS1zcGVjaWZpYyB0ZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdERpc2FibGVTZWxmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKIApAQCAtMjUyMCwxMyArMTgwNSwxMSBAQAogICAgICAgICB9LCBpbnRlbnRGaWx0ZXIpOwogCiAgICAgICAgIC8vIFRyaWdnZXIgdGhlIG5lZ2F0aXZlIGJ1dHRvbi4KLSAgICAgICAgc1VpQm90LnNhdmVGb3JBdXRvZmlsbChTYXZlSW5mby5ORUdBVElWRV9CVVRUT05fU1RZTEVfUkVKRUNULAorICAgICAgICBtVWlCb3Quc2F2ZUZvckF1dG9maWxsKFNhdmVJbmZvLk5FR0FUSVZFX0JVVFRPTl9TVFlMRV9SRUpFQ1QsCiAgICAgICAgICAgICAgICAgZmFsc2UsIFNBVkVfREFUQV9UWVBFX1BBU1NXT1JEKTsKIAogICAgICAgICAvLyBXYWl0IGZvciB0aGUgY3VzdG9tIGFjdGlvbi4KICAgICAgICAgYXNzZXJ0VGhhdChsYXRjaC5hd2FpdCg1LCBUaW1lVW5pdC5TRUNPTkRTKSkuaXNUcnVlKCk7Ci0KLSAgICAgICAgYXNzZXJ0Tm9EYW5nbGluZ1Nlc3Npb25zKCk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTI1NjksMTYgKzE4NTIsMTUgQEAKICAgICAgICAgfSwgaW50ZW50RmlsdGVyKTsKIAogICAgICAgICAvLyBUcmlnZ2VyIHRoZSBuZWdhdGl2ZSBidXR0b24uCi0gICAgICAgIHNVaUJvdC5zYXZlRm9yQXV0b2ZpbGwoU2F2ZUluZm8uTkVHQVRJVkVfQlVUVE9OX1NUWUxFX0NBTkNFTCwKKyAgICAgICAgbVVpQm90LnNhdmVGb3JBdXRvZmlsbChTYXZlSW5mby5ORUdBVElWRV9CVVRUT05fU1RZTEVfQ0FOQ0VMLAogICAgICAgICAgICAgICAgIGZhbHNlLCBTQVZFX0RBVEFfVFlQRV9QQVNTV09SRCk7CiAKICAgICAgICAgLy8gV2FpdCBmb3IgdGhlIGN1c3RvbSBhY3Rpb24uCiAgICAgICAgIGFzc2VydFRoYXQobGF0Y2guYXdhaXQoNTAwLCBUaW1lVW5pdC5TRUNPTkRTKSkuaXNUcnVlKCk7Ci0KLSAgICAgICAgYXNzZXJ0Tm9EYW5nbGluZ1Nlc3Npb25zKCk7CiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gVW5pdCB0ZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEdldFRleHRJbnB1dFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gU2V0IHNlcnZpY2UuCiAgICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKQEAgLTI2MDEsNiArMTg4Myw3IEBACiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gVW5pdCB0ZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE5vQ29udGFpbmVycygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBTZXQgc2VydmljZS4KICAgICAgICAgZW5hYmxlU2VydmljZSgpOwpAQCAtMjYxMSw3ICsxODk0LDcgQEAKICAgICAgICAgLy8gVHJpZ2dlciBhdXRvLWZpbGwuCiAgICAgICAgIG1BY3Rpdml0eS5vblVzZXJuYW1lKFZpZXc6OnJlcXVlc3RGb2N1cyk7CiAKLSAgICAgICAgc1VpQm90LmFzc2VydE5vRGF0YXNldHMoKTsKKyAgICAgICAgbVVpQm90LmFzc2VydE5vRGF0YXNldHNFdmVyKCk7CiAKICAgICAgICAgZmluYWwgRmlsbFJlcXVlc3QgZmlsbFJlcXVlc3QgPSBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKIApAQCAtMjY1NiwyNCArMTkzOSwyNiBAQAogICAgICAgICBtQWN0aXZpdHkuZXhwZWN0QXV0b0ZpbGwoImR1ZGUiLCAic3dlZXQiKTsKIAogICAgICAgICAvLyBFeHBsaWNpdGx5IHVzZXMgdGhlIGNvbnRleHR1YWwgbWVudSB0byB0ZXN0IHRoYXQgZnVuY3Rpb25hbGl0eS4KLSAgICAgICAgc1VpQm90LmdldEF1dG9maWxsTWVudU9wdGlvbihJRF9VU0VSTkFNRSkuY2xpY2soKTsKKyAgICAgICAgbVVpQm90LmdldEF1dG9maWxsTWVudU9wdGlvbihJRF9VU0VSTkFNRSkuY2xpY2soKTsKIAogICAgICAgICBmaW5hbCBGaWxsUmVxdWVzdCBmaWxsUmVxdWVzdCA9IHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwotICAgICAgICBhc3NlcnRUaGF0KGZpbGxSZXF1ZXN0LmZsYWdzKS5pc0VxdWFsVG8oRkxBR19NQU5VQUxfUkVRVUVTVCk7CisgICAgICAgIGFzc2VydEhhc0ZsYWdzKGZpbGxSZXF1ZXN0LmZsYWdzLCBGTEFHX01BTlVBTF9SRVFVRVNUKTsKIAogICAgICAgICAvLyBTaG91bGQgaGF2ZSBiZWVuIGF1dG9tYXRpY2FsbHkgZmlsbGVkLgotICAgICAgICBzVWlCb3Quc2VsZWN0RGF0YXNldCgiVGhlIER1ZGUiKTsKKyAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQoIlRoZSBEdWRlIik7CiAKICAgICAgICAgLy8gQ2hlY2sgdGhlIHJlc3VsdHMuCiAgICAgICAgIG1BY3Rpdml0eS5hc3NlcnRBdXRvRmlsbGVkKCk7CiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gdGVzdEF1dG9maWxsTWFudWFsbHlPbmVEYXRhc2V0KCkgaXMgZW5vdWdoIHRvIHRlc3QgZXBoZW1lcmFsIGFwcHMgc3VwcG9ydAogICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvZmlsbE1hbnVhbGx5VHdvRGF0YXNldHNQaWNrRmlyc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgYXV0b2ZpbGxNYW51YWxseVR3b0RhdGFzZXRzKHRydWUpOwogICAgIH0KIAogICAgIEBUZXN0CisgICAgQEFwcE1vZGVGdWxsIC8vIHRlc3RBdXRvZmlsbE1hbnVhbGx5T25lRGF0YXNldCgpIGlzIGVub3VnaCB0byB0ZXN0IGVwaGVtZXJhbCBhcHBzIHN1cHBvcnQKICAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0b2ZpbGxNYW51YWxseVR3b0RhdGFzZXRzUGlja1NlY29uZCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBhdXRvZmlsbE1hbnVhbGx5VHdvRGF0YXNldHMoZmFsc2UpOwogICAgIH0KQEAgLTI3MDYsMTcgKzE5OTEsMTggQEAKICAgICAgICAgbUFjdGl2aXR5LmZvcmNlQXV0b2ZpbGxPblVzZXJuYW1lKCk7CiAKICAgICAgICAgZmluYWwgRmlsbFJlcXVlc3QgZmlsbFJlcXVlc3QgPSBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKLSAgICAgICAgYXNzZXJ0VGhhdChmaWxsUmVxdWVzdC5mbGFncykuaXNFcXVhbFRvKEZMQUdfTUFOVUFMX1JFUVVFU1QpOworICAgICAgICBhc3NlcnRIYXNGbGFncyhmaWxsUmVxdWVzdC5mbGFncywgRkxBR19NQU5VQUxfUkVRVUVTVCk7CiAKICAgICAgICAgLy8gQXV0by1maWxsIGl0LgotICAgICAgICBmaW5hbCBVaU9iamVjdDIgcGlja2VyID0gc1VpQm90LmFzc2VydERhdGFzZXRzKCJUaGUgRHVkZSIsICJKZW5ueSIpOwotICAgICAgICBzVWlCb3Quc2VsZWN0RGF0YXNldChwaWNrZXIsIHBpY2tGaXJzdCA/ICJUaGUgRHVkZSIgOiAiSmVubnkiKTsKKyAgICAgICAgZmluYWwgVWlPYmplY3QyIHBpY2tlciA9IG1VaUJvdC5hc3NlcnREYXRhc2V0cygiVGhlIER1ZGUiLCAiSmVubnkiKTsKKyAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQocGlja2VyLCBwaWNrRmlyc3QgPyAiVGhlIER1ZGUiIDogIkplbm55Iik7CiAKICAgICAgICAgLy8gQ2hlY2sgdGhlIHJlc3VsdHMuCiAgICAgICAgIG1BY3Rpdml0eS5hc3NlcnRBdXRvRmlsbGVkKCk7CiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gdGVzdEF1dG9maWxsTWFudWFsbHlPbmVEYXRhc2V0KCkgaXMgZW5vdWdoIHRvIHRlc3QgZXBoZW1lcmFsIGFwcHMgc3VwcG9ydAogICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvZmlsbE1hbnVhbGx5UGFydGlhbEZpZWxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFNldCBzZXJ2aWNlLgogICAgICAgICBlbmFibGVTZXJ2aWNlKCk7CkBAIC0yNzM3LDIwICsyMDIzLDIxIEBACiAgICAgICAgIG1BY3Rpdml0eS5mb3JjZUF1dG9maWxsT25Vc2VybmFtZSgpOwogCiAgICAgICAgIGZpbmFsIEZpbGxSZXF1ZXN0IGZpbGxSZXF1ZXN0ID0gc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7Ci0gICAgICAgIGFzc2VydFRoYXQoZmlsbFJlcXVlc3QuZmxhZ3MpLmlzRXF1YWxUbyhGTEFHX01BTlVBTF9SRVFVRVNUKTsKKyAgICAgICAgYXNzZXJ0SGFzRmxhZ3MoZmlsbFJlcXVlc3QuZmxhZ3MsIEZMQUdfTUFOVUFMX1JFUVVFU1QpOwogICAgICAgICAvLyBVc2VybmFtZSB2YWx1ZSBzaG91bGQgYmUgYXZhaWxhYmxlIGJlY2F1c2UgaXQgdHJpZ2dlcmVkIHRoZSBtYW51YWwgcmVxdWVzdC4uLgogICAgICAgICBhc3NlcnRWYWx1ZShmaWxsUmVxdWVzdC5zdHJ1Y3R1cmUsIElEX1VTRVJOQU1FLCAiZHVkIik7CiAgICAgICAgIC8vIC4uLiBidXQgcGFzc3dvcmQgZGlkbid0CiAgICAgICAgIGFzc2VydFRleHRJc1Nhbml0aXplZChmaWxsUmVxdWVzdC5zdHJ1Y3R1cmUsIElEX1BBU1NXT1JEKTsKIAogICAgICAgICAvLyBTZWxlY3RzIHRoZSBkYXRhc2V0LgotICAgICAgICBzVWlCb3Quc2VsZWN0RGF0YXNldCgiVGhlIER1ZGUiKTsKKyAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQoIlRoZSBEdWRlIik7CiAKICAgICAgICAgLy8gQ2hlY2sgdGhlIHJlc3VsdHMuCiAgICAgICAgIG1BY3Rpdml0eS5hc3NlcnRBdXRvRmlsbGVkKCk7CiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gdGVzdEF1dG9maWxsTWFudWFsbHlPbmVEYXRhc2V0KCkgaXMgZW5vdWdoIHRvIHRlc3QgZXBoZW1lcmFsIGFwcHMgc3VwcG9ydAogICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvZmlsbE1hbnVhbGx5QWdhaW5BZnRlckF1dG9tYXRpY2FsbHlBdXRvZmlsbGVkQmVmb3JlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFNldCBzZXJ2aWNlLgogICAgICAgICBlbmFibGVTZXJ2aWNlKCk7CkBAIC0yNzY3LDcgKzIwNTQsNyBAQAogICAgICAgICBtQWN0aXZpdHkuZXhwZWN0QXV0b0ZpbGwoImR1ZGUiLCAic3dlZXQiKTsKIAogICAgICAgICAvLyBUcmlnZ2VyIGF1dG8tZmlsbC4KLSAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoVmlldzo6cmVxdWVzdEZvY3VzKTsKKyAgICAgICAgcmVxdWVzdEZvY3VzT25Vc2VybmFtZSgpOwogCiAgICAgICAgIC8vIEFzc2VydCByZXF1ZXN0LgogICAgICAgICBmaW5hbCBGaWxsUmVxdWVzdCBmaWxsUmVxdWVzdDEgPSBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKQEAgLTI3NzYsNyArMjA2Myw3IEBACiAgICAgICAgIGFzc2VydFRleHRJc1Nhbml0aXplZChmaWxsUmVxdWVzdDEuc3RydWN0dXJlLCBJRF9QQVNTV09SRCk7CiAKICAgICAgICAgLy8gU2VsZWN0IGl0LgotICAgICAgICBzVWlCb3Quc2VsZWN0RGF0YXNldCgiVGhlIER1ZGUiKTsKKyAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQoIlRoZSBEdWRlIik7CiAKICAgICAgICAgLy8gQ2hlY2sgdGhlIHJlc3VsdHMuCiAgICAgICAgIG1BY3Rpdml0eS5hc3NlcnRBdXRvRmlsbGVkKCk7CkBAIC0yNzk5LDE4ICsyMDg2LDE5IEBACiAKICAgICAgICAgLy8gQXNzZXJ0IHJlcXVlc3QuCiAgICAgICAgIGZpbmFsIEZpbGxSZXF1ZXN0IGZpbGxSZXF1ZXN0MiA9IHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwotICAgICAgICBhc3NlcnRUaGF0KGZpbGxSZXF1ZXN0Mi5mbGFncykuaXNFcXVhbFRvKEZMQUdfTUFOVUFMX1JFUVVFU1QpOworICAgICAgICBhc3NlcnRIYXNGbGFncyhmaWxsUmVxdWVzdDIuZmxhZ3MsIEZMQUdfTUFOVUFMX1JFUVVFU1QpOwogICAgICAgICBhc3NlcnRWYWx1ZShmaWxsUmVxdWVzdDIuc3RydWN0dXJlLCBJRF9VU0VSTkFNRSwgImR1ZGUiKTsKICAgICAgICAgYXNzZXJ0VGV4dElzU2FuaXRpemVkKGZpbGxSZXF1ZXN0Mi5zdHJ1Y3R1cmUsIElEX1BBU1NXT1JEKTsKIAogICAgICAgICAvLyBTZWxlY3QgaXQuCi0gICAgICAgIHNVaUJvdC5zZWxlY3REYXRhc2V0KCJUSEUgRFVERSIpOworICAgICAgICBtVWlCb3Quc2VsZWN0RGF0YXNldCgiVEhFIERVREUiKTsKIAogICAgICAgICAvLyBDaGVjayB0aGUgcmVzdWx0cy4KICAgICAgICAgbUFjdGl2aXR5LmFzc2VydEF1dG9GaWxsZWQoKTsKICAgICB9CiAKICAgICBAVGVzdAorICAgIEBBcHBNb2RlRnVsbCAvLyB0ZXN0QXV0b2ZpbGxNYW51YWxseU9uZURhdGFzZXQoKSBpcyBlbm91Z2ggdG8gdGVzdCBlcGhlbWVyYWwgYXBwcyBzdXBwb3J0CiAgICAgcHVibGljIHZvaWQgdGVzdEF1dG9maWxsTWFudWFsbHlBZ2FpbkFmdGVyTWFudWFsbHlBdXRvZmlsbGVkQmVmb3JlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFNldCBzZXJ2aWNlLgogICAgICAgICBlbmFibGVTZXJ2aWNlKCk7CkBAIC0yODMxLDEyICsyMTE5LDEyIEBACiAKICAgICAgICAgLy8gQXNzZXJ0IHJlcXVlc3QuCiAgICAgICAgIGZpbmFsIEZpbGxSZXF1ZXN0IGZpbGxSZXF1ZXN0MSA9IHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwotICAgICAgICBhc3NlcnRUaGF0KGZpbGxSZXF1ZXN0MS5mbGFncykuaXNFcXVhbFRvKEZMQUdfTUFOVUFMX1JFUVVFU1QpOworICAgICAgICBhc3NlcnRIYXNGbGFncyhmaWxsUmVxdWVzdDEuZmxhZ3MsIEZMQUdfTUFOVUFMX1JFUVVFU1QpOwogICAgICAgICBhc3NlcnRWYWx1ZShmaWxsUmVxdWVzdDEuc3RydWN0dXJlLCBJRF9VU0VSTkFNRSwgIiIpOwogICAgICAgICBhc3NlcnRUZXh0SXNTYW5pdGl6ZWQoZmlsbFJlcXVlc3QxLnN0cnVjdHVyZSwgSURfUEFTU1dPUkQpOwogCiAgICAgICAgIC8vIFNlbGVjdCBpdC4KLSAgICAgICAgc1VpQm90LnNlbGVjdERhdGFzZXQoIlRoZSBEdWRlIik7CisgICAgICAgIG1VaUJvdC5zZWxlY3REYXRhc2V0KCJUaGUgRHVkZSIpOwogCiAgICAgICAgIC8vIENoZWNrIHRoZSByZXN1bHRzLgogICAgICAgICBtQWN0aXZpdHkuYXNzZXJ0QXV0b0ZpbGxlZCgpOwpAQCAtMjg1OSwxMiArMjE0NywxMiBAQAogCiAgICAgICAgIC8vIEFzc2VydCByZXF1ZXN0LgogICAgICAgICBmaW5hbCBGaWxsUmVxdWVzdCBmaWxsUmVxdWVzdDIgPSBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKLSAgICAgICAgYXNzZXJ0VGhhdChmaWxsUmVxdWVzdDIuZmxhZ3MpLmlzRXF1YWxUbyhGTEFHX01BTlVBTF9SRVFVRVNUKTsKKyAgICAgICAgYXNzZXJ0SGFzRmxhZ3MoZmlsbFJlcXVlc3QyLmZsYWdzLCBGTEFHX01BTlVBTF9SRVFVRVNUKTsKICAgICAgICAgYXNzZXJ0VmFsdWUoZmlsbFJlcXVlc3QyLnN0cnVjdHVyZSwgSURfVVNFUk5BTUUsICJkdWRlIik7CiAgICAgICAgIGFzc2VydFRleHRJc1Nhbml0aXplZChmaWxsUmVxdWVzdDIuc3RydWN0dXJlLCBJRF9QQVNTV09SRCk7CiAKICAgICAgICAgLy8gU2VsZWN0IGl0LgotICAgICAgICBzVWlCb3Quc2VsZWN0RGF0YXNldCgiVEhFIERVREUiKTsKKyAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQoIlRIRSBEVURFIik7CiAKICAgICAgICAgLy8gQ2hlY2sgdGhlIHJlc3VsdHMuCiAgICAgICAgIG1BY3Rpdml0eS5hc3NlcnRBdXRvRmlsbGVkKCk7CkBAIC0yODkwLDE0ICsyMTc4LDE0IEBACiAgICAgICAgICAgICAgICAgLy8gVHJpZ2dlciBhdXRvLWZpbGwuCiAgICAgICAgICAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoVmlldzo6cmVxdWVzdEZvY3VzKTsKIAotICAgICAgICAgICAgICAgIC8vIFNhbml0eSBjaGVjay4KLSAgICAgICAgICAgICAgICBzVWlCb3QuYXNzZXJ0Tm9EYXRhc2V0cygpOwotCiAgICAgICAgICAgICAgICAgLy8gV2FpdCBmb3Igb25GaWxsKCkgYmVmb3JlIHByb2NlZWRpbmcsIG90aGVyd2lzZSB0aGUgZmllbGRzIG1pZ2h0IGJlIGNoYW5nZWQgYmVmb3JlCiAgICAgICAgICAgICAgICAgLy8gdGhlIHNlc3Npb24gc3RhcnRlZAogICAgICAgICAgICAgICAgIHdhaXRVbnRpbENvbm5lY3RlZCgpOwogICAgICAgICAgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwogCisgICAgICAgICAgICAgICAgLy8gU2FuaXR5IGNoZWNrLgorICAgICAgICAgICAgICAgIG1VaUJvdC5hc3NlcnROb0RhdGFzZXRzRXZlcigpOworCiAgICAgICAgICAgICAgICAgLy8gU2V0IGNyZWRlbnRpYWxzLi4uCiAgICAgICAgICAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoKHYpIC0+IHYuc2V0VGV4dCh1c2VybmFtZSkpOwogICAgICAgICAgICAgICAgIG1BY3Rpdml0eS5vblBhc3N3b3JkKCh2KSAtPiB2LnNldFRleHQocGFzc3dvcmQpKTsKQEAgLTI5MDksNyArMjE5Nyw3IEBACiAgICAgICAgICAgICAgICAgbUFjdGl2aXR5LnRhcFNhdmUoKTsKIAogICAgICAgICAgICAgICAgIC8vIEFzc2VydCB0aGUgc25hY2sgYmFyIGlzIHNob3duIGFuZCB0YXAgIlNhdmUiLgotICAgICAgICAgICAgICAgIHNVaUJvdC5zYXZlRm9yQXV0b2ZpbGwodHJ1ZSwgU0FWRV9EQVRBX1RZUEVfUEFTU1dPUkQpOworICAgICAgICAgICAgICAgIG1VaUJvdC5zYXZlRm9yQXV0b2ZpbGwodHJ1ZSwgU0FWRV9EQVRBX1RZUEVfUEFTU1dPUkQpOwogCiAgICAgICAgICAgICAgICAgZmluYWwgU2F2ZVJlcXVlc3Qgc2F2ZVJlcXVlc3QgPSBzUmVwbGllci5nZXROZXh0U2F2ZVJlcXVlc3QoKTsKIApAQCAtMjkyMiw3ICsyMjEwLDYgQEAKICAgICAgICAgICAgICAgICBhc3NlcnRUZXh0QW5kVmFsdWUocGFzc3dvcmROb2RlLCBwYXNzd29yZCk7CiAKICAgICAgICAgICAgICAgICB3YWl0VW50aWxEaXNjb25uZWN0ZWQoKTsKLSAgICAgICAgICAgICAgICBhc3NlcnROb0RhbmdsaW5nU2Vzc2lvbnMoKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKFJldHJ5YWJsZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJldHJ5YWJsZUV4Y2VwdGlvbihlLCAib24gc3RlcCAlZCIsIGkpOwogICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKQEAgLTI5NDgsMjUgKzIyMzUsMjQgQEAKICAgICAgICAgICAgIG1BY3Rpdml0eS5leHBlY3RBdXRvRmlsbCh1c2VybmFtZSwgcGFzc3dvcmQpOwogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAvLyBUcmlnZ2VyIGF1dG8tZmlsbC4KLSAgICAgICAgICAgICAgICBtQWN0aXZpdHkub25Vc2VybmFtZShWaWV3OjpyZXF1ZXN0Rm9jdXMpOworICAgICAgICAgICAgICAgIHJlcXVlc3RGb2N1c09uVXNlcm5hbWUoKTsKIAogICAgICAgICAgICAgICAgIHdhaXRVbnRpbENvbm5lY3RlZCgpOwogICAgICAgICAgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwogCiAgICAgICAgICAgICAgICAgLy8gQXV0by1maWxsIGl0LgotICAgICAgICAgICAgICAgIHNVaUJvdC5zZWxlY3REYXRhc2V0KCJUaGUgRHVkZSIpOworICAgICAgICAgICAgICAgIG1VaUJvdC5zZWxlY3REYXRhc2V0KCJUaGUgRHVkZSIpOwogCiAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIHJlc3VsdHMuCiAgICAgICAgICAgICAgICAgbUFjdGl2aXR5LmFzc2VydEF1dG9GaWxsZWQoKTsKIAogICAgICAgICAgICAgICAgIC8vIENoYW5nZSBmb2N1cyB0byBwcmVwYXJlIGZvciBuZXh0IHN0ZXAgLSBtdXN0IGRvIGl0IGJlZm9yZSBzZXNzaW9uIGlzIGdvbmUKLSAgICAgICAgICAgICAgICBtQWN0aXZpdHkub25QYXNzd29yZChWaWV3OjpyZXF1ZXN0Rm9jdXMpOworICAgICAgICAgICAgICAgIHJlcXVlc3RGb2N1c09uUGFzc3dvcmQoKTsKIAogICAgICAgICAgICAgICAgIC8vIFJpbnNlIGFuZCByZXBlYXQuLi4KICAgICAgICAgICAgICAgICBtQWN0aXZpdHkudGFwQ2xlYXIoKTsKIAogICAgICAgICAgICAgICAgIHdhaXRVbnRpbERpc2Nvbm5lY3RlZCgpOwotICAgICAgICAgICAgICAgIGFzc2VydE5vRGFuZ2xpbmdTZXNzaW9ucygpOwogICAgICAgICAgICAgfSBjYXRjaCAoUmV0cnlhYmxlRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKQEAgLTI5OTksNDI0ICsyMjg1LDE5IEBACiAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOwogCiAgICAgICAgIC8vIFRyaWdnZXIgYXV0by1maWxsLgotICAgICAgICBtQWN0aXZpdHkub25Vc2VybmFtZShWaWV3OjpyZXF1ZXN0Rm9jdXMpOworICAgICAgICByZXF1ZXN0Rm9jdXNPblVzZXJuYW1lKCk7CiAKICAgICAgICAgLy8gV2FpdCBmb3Igb25GaWxsKCkgYmVmb3JlIHByb2NlZWRpbmcuCiAgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwogCiAgICAgICAgIC8vIENsaWNrIG9uIHRoZSBjdXN0b20gYnV0dG9uCi0gICAgICAgIHNVaUJvdC5zZWxlY3RCeVRleHQoIlBva2UiKTsKKyAgICAgICAgbVVpQm90LnNlbGVjdEJ5VGV4dCgiUG9rZSIpOwogCiAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgY2xpY2sgd29ya2VkCi0gICAgICAgIHNVaUJvdC5zZWxlY3RCeVRleHQoImZvbyIpOworICAgICAgICBtVWlCb3Quc2VsZWN0QnlUZXh0KCJmb28iKTsKIAogICAgICAgICAvLyBHbyBiYWNrIHRvIHRoZSBmaWxsZWQgYXBwLgotICAgICAgICBzVWlCb3QucHJlc3NCYWNrKCk7Ci0KLSAgICAgICAgLy8gVGhlIHNlc3Npb24gc2hvdWxkIGJlIGdvbmUKLSAgICAgICAgYXNzZXJ0Tm9EYW5nbGluZ1Nlc3Npb25zKCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBjaGVja0ZpbGxTZWxlY3Rpb25BZnRlclNlbGVjdGluZ0RhdGFzZXRBdXRoZW50aWNhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBlbmFibGVTZXJ2aWNlKCk7Ci0KLSAgICAgICAgLy8gU2V0IHVwIEZpbGxSZXNwb25zZSB3aXRoIGRhdGFzZXQgYXV0aGVudGljYXRpb24KLSAgICAgICAgQnVuZGxlIGNsaWVudFN0YXRlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICBjbGllbnRTdGF0ZS5wdXRDaGFyU2VxdWVuY2UoImNsaWVudFN0YXRlS2V5IiwgImNsaWVudFN0YXRlVmFsdWUiKTsKLQotICAgICAgICAvLyBQcmVwYXJlIHRoZSBhdXRoZW50aWNhdGVkIHJlc3BvbnNlCi0gICAgICAgIGZpbmFsIEludGVudFNlbmRlciBhdXRoZW50aWNhdGlvbiA9IEF1dGhlbnRpY2F0aW9uQWN0aXZpdHkuY3JlYXRlU2VuZGVyKG1Db250ZXh0LCAxLAotICAgICAgICAgICAgICAgIG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1VTRVJOQU1FLCAiZHVkZSIpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfUEFTU1dPUkQsICJzd2VldCIpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiRGF0YXNldCIpKQotICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOwotCi0gICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpLmFkZERhdGFzZXQoCi0gICAgICAgICAgICAgICAgbmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfVVNFUk5BTUUsICJ1c2VybmFtZSIpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0SWQoIm5hbWUiKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oImF1dGhlbnRpY2F0aW9uIikpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0QXV0aGVudGljYXRpb24oYXV0aGVudGljYXRpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKLSAgICAgICAgICAgICAgICAuc2V0RXh0cmFzKGNsaWVudFN0YXRlKS5idWlsZCgpKTsKLSAgICAgICAgbUFjdGl2aXR5LmV4cGVjdEF1dG9GaWxsKCJkdWRlIiwgInN3ZWV0Iik7Ci0KLSAgICAgICAgLy8gVHJpZ2dlciBhdXRvZmlsbC4KLSAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoVmlldzo6cmVxdWVzdEZvY3VzKTsKLQotICAgICAgICAvLyBBdXRoZW50aWNhdGUKLSAgICAgICAgc1VpQm90LnNlbGVjdERhdGFzZXQoImF1dGhlbnRpY2F0aW9uIik7Ci0gICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwotICAgICAgICBtQWN0aXZpdHkuYXNzZXJ0QXV0b0ZpbGxlZCgpOwotCi0gICAgICAgIC8vIFZlcmlmeSBmaWxsIHNlbGVjdGlvbgotICAgICAgICBGaWxsRXZlbnRIaXN0b3J5IHNlbGVjdGlvbiA9IEluc3RydW1lbnRlZEF1dG9GaWxsU2VydmljZS5wZWVrSW5zdGFuY2UoKQotICAgICAgICAgICAgICAgIC5nZXRGaWxsRXZlbnRIaXN0b3J5KCk7Ci0gICAgICAgIGFzc2VydFRoYXQoc2VsZWN0aW9uLmdldENsaWVudFN0YXRlKCkuZ2V0Q2hhclNlcXVlbmNlKCJjbGllbnRTdGF0ZUtleSIpKS5pc0VxdWFsVG8oCi0gICAgICAgICAgICAgICAgImNsaWVudFN0YXRlVmFsdWUiKTsKLQotICAgICAgICBhc3NlcnRUaGF0KHNlbGVjdGlvbi5nZXRFdmVudHMoKS5zaXplKCkpLmlzRXF1YWxUbygxKTsKLSAgICAgICAgRmlsbEV2ZW50SGlzdG9yeS5FdmVudCBldmVudCA9IHNlbGVjdGlvbi5nZXRFdmVudHMoKS5nZXQoMCk7Ci0gICAgICAgIGFzc2VydFRoYXQoZXZlbnQuZ2V0VHlwZSgpKS5pc0VxdWFsVG8oVFlQRV9EQVRBU0VUX0FVVEhFTlRJQ0FUSU9OX1NFTEVDVEVEKTsKLSAgICAgICAgYXNzZXJ0VGhhdChldmVudC5nZXREYXRhc2V0SWQoKSkuaXNFcXVhbFRvKCJuYW1lIik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBjaGVja0ZpbGxTZWxlY3Rpb25BZnRlclNlbGVjdGluZ0F1dGhlbnRpY2F0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKLQotICAgICAgICAvLyBTZXQgdXAgRmlsbFJlc3BvbnNlIHdpdGggcmVzcG9uc2Ugd2lkZSBhdXRoZW50aWNhdGlvbgotICAgICAgICBCdW5kbGUgY2xpZW50U3RhdGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgIGNsaWVudFN0YXRlLnB1dENoYXJTZXF1ZW5jZSgiY2xpZW50U3RhdGVLZXkiLCAiY2xpZW50U3RhdGVWYWx1ZSIpOwotCi0gICAgICAgIC8vIFByZXBhcmUgdGhlIGF1dGhlbnRpY2F0ZWQgcmVzcG9uc2UKLSAgICAgICAgZmluYWwgSW50ZW50U2VuZGVyIGF1dGhlbnRpY2F0aW9uID0gQXV0aGVudGljYXRpb25BY3Rpdml0eS5jcmVhdGVTZW5kZXIobUNvbnRleHQsIDEsCi0gICAgICAgICAgICAgICAgbmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkuYWRkRGF0YXNldCgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfVVNFUk5BTUUsICJ1c2VybmFtZSIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJZCgibmFtZSIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJkYXRhc2V0IikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEV4dHJhcyhjbGllbnRTdGF0ZSkuYnVpbGQoKSk7Ci0KLSAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UobmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkuc2V0RXh0cmFzKGNsaWVudFN0YXRlKQotICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJhdXRoZW50aWNhdGlvbiIpKQotICAgICAgICAgICAgICAgIC5zZXRBdXRoZW50aWNhdGlvbihhdXRoZW50aWNhdGlvbiwgSURfVVNFUk5BTUUpCi0gICAgICAgICAgICAgICAgLmJ1aWxkKCkpOwotCi0gICAgICAgIC8vIFRyaWdnZXIgYXV0b2ZpbGwuCi0gICAgICAgIG1BY3Rpdml0eS5vblVzZXJuYW1lKFZpZXc6OnJlcXVlc3RGb2N1cyk7Ci0KLSAgICAgICAgLy8gQXV0aGVudGljYXRlCi0gICAgICAgIHNVaUJvdC5zZWxlY3REYXRhc2V0KCJhdXRoZW50aWNhdGlvbiIpOwotICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJkYXRhc2V0Iik7Ci0KLSAgICAgICAgLy8gVmVyaWZ5IGZpbGwgc2VsZWN0aW9uCi0gICAgICAgIEZpbGxFdmVudEhpc3Rvcnkgc2VsZWN0aW9uID0gSW5zdHJ1bWVudGVkQXV0b0ZpbGxTZXJ2aWNlLnBlZWtJbnN0YW5jZSgpCi0gICAgICAgICAgICAgICAgLmdldEZpbGxFdmVudEhpc3RvcnkoKTsKLSAgICAgICAgYXNzZXJ0VGhhdChzZWxlY3Rpb24uZ2V0Q2xpZW50U3RhdGUoKS5nZXRDaGFyU2VxdWVuY2UoImNsaWVudFN0YXRlS2V5IikpLmlzRXF1YWxUbygKLSAgICAgICAgICAgICAgICAiY2xpZW50U3RhdGVWYWx1ZSIpOwotCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZWN0aW9uLmdldEV2ZW50cygpLnNpemUoKSkuaXNFcXVhbFRvKDEpOwotICAgICAgICBGaWxsRXZlbnRIaXN0b3J5LkV2ZW50IGV2ZW50ID0gc2VsZWN0aW9uLmdldEV2ZW50cygpLmdldCgwKTsKLSAgICAgICAgYXNzZXJ0VGhhdChldmVudC5nZXRUeXBlKCkpLmlzRXF1YWxUbyhUWVBFX0FVVEhFTlRJQ0FUSU9OX1NFTEVDVEVEKTsKLSAgICAgICAgYXNzZXJ0VGhhdChldmVudC5nZXREYXRhc2V0SWQoKSkuaXNOdWxsKCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBjaGVja0ZpbGxTZWxlY3Rpb25BZnRlclNlbGVjdGluZ1R3b0RhdGFzZXRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKLQotICAgICAgICAvLyBTZXQgdXAgZmlyc3QgcGFydGl0aW9uIHdpdGggYW4gYW5vbnltb3VzIGRhdGFzZXQKLSAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UobmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkuYWRkRGF0YXNldCgKLSAgICAgICAgICAgICAgICBuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgInVzZXJuYW1lIikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJkYXRhc2V0MSIpKQotICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCi0gICAgICAgICAgICAgICAgLmJ1aWxkKCkpOwotICAgICAgICBtQWN0aXZpdHkuZXhwZWN0QXV0b0ZpbGwoInVzZXJuYW1lIik7Ci0KLSAgICAgICAgLy8gVHJpZ2dlciBhdXRvZmlsbCBvbiB1c2VybmFtZQotICAgICAgICBtQWN0aXZpdHkub25Vc2VybmFtZShWaWV3OjpyZXF1ZXN0Rm9jdXMpOwotICAgICAgICB3YWl0VW50aWxDb25uZWN0ZWQoKTsKLSAgICAgICAgc1VpQm90LnNlbGVjdERhdGFzZXQoImRhdGFzZXQxIik7Ci0gICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwotICAgICAgICBtQWN0aXZpdHkuYXNzZXJ0QXV0b0ZpbGxlZCgpOwotCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFZlcmlmeSBmaWxsIHNlbGVjdGlvbgotICAgICAgICAgICAgRmlsbEV2ZW50SGlzdG9yeSBzZWxlY3Rpb24gPSBJbnN0cnVtZW50ZWRBdXRvRmlsbFNlcnZpY2UucGVla0luc3RhbmNlKCkKLSAgICAgICAgICAgICAgICAgICAgLmdldEZpbGxFdmVudEhpc3RvcnkoKTsKLSAgICAgICAgICAgIGFzc2VydFRoYXQoc2VsZWN0aW9uLmdldENsaWVudFN0YXRlKCkpLmlzTnVsbCgpOwotCi0gICAgICAgICAgICBhc3NlcnRUaGF0KHNlbGVjdGlvbi5nZXRFdmVudHMoKS5zaXplKCkpLmlzRXF1YWxUbygxKTsKLSAgICAgICAgICAgIEZpbGxFdmVudEhpc3RvcnkuRXZlbnQgZXZlbnQgPSBzZWxlY3Rpb24uZ2V0RXZlbnRzKCkuZ2V0KDApOwotICAgICAgICAgICAgYXNzZXJ0VGhhdChldmVudC5nZXRUeXBlKCkpLmlzRXF1YWxUbyhUWVBFX0RBVEFTRVRfU0VMRUNURUQpOwotICAgICAgICAgICAgYXNzZXJ0VGhhdChldmVudC5nZXREYXRhc2V0SWQoKSkuaXNOdWxsKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZXQgdXAgc2Vjb25kIHBhcnRpdGlvbiB3aXRoIGEgbmFtZWQgZGF0YXNldAotICAgICAgICBCdW5kbGUgY2xpZW50U3RhdGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgIGNsaWVudFN0YXRlLnB1dENoYXJTZXF1ZW5jZSgiY2xpZW50U3RhdGVLZXkiLCAiY2xpZW50U3RhdGVWYWx1ZSIpOwotCi0gICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpCi0gICAgICAgICAgICAgICAgLmFkZERhdGFzZXQoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1BBU1NXT1JELCAicGFzc3dvcmQyIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oImRhdGFzZXQyIikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJZCgibmFtZTIiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKLSAgICAgICAgICAgICAgICAuYWRkRGF0YXNldCgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfUEFTU1dPUkQsICJwYXNzd29yZDMiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiZGF0YXNldDMiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldElkKCJuYW1lMyIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQotICAgICAgICAgICAgICAgIC5zZXRFeHRyYXMoY2xpZW50U3RhdGUpCi0gICAgICAgICAgICAgICAgLnNldFJlcXVpcmVkU2F2YWJsZUlkcyhTQVZFX0RBVEFfVFlQRV9HRU5FUklDLCBJRF9QQVNTV09SRCkuYnVpbGQoKSk7Ci0gICAgICAgIG1BY3Rpdml0eS5leHBlY3RQYXNzd29yZEF1dG9GaWxsKCJwYXNzd29yZDMiKTsKLQotICAgICAgICAvLyBUcmlnZ2VyIGF1dG9maWxsIG9uIHBhc3N3b3JkCi0gICAgICAgIG1BY3Rpdml0eS5vblBhc3N3b3JkKFZpZXc6OnJlcXVlc3RGb2N1cyk7Ci0gICAgICAgIHNVaUJvdC5zZWxlY3REYXRhc2V0KCJkYXRhc2V0MyIpOwotICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKLSAgICAgICAgbUFjdGl2aXR5LmFzc2VydEF1dG9GaWxsZWQoKTsKLQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBWZXJpZnkgZmlsbCBzZWxlY3Rpb24KLSAgICAgICAgICAgIEZpbGxFdmVudEhpc3Rvcnkgc2VsZWN0aW9uID0gSW5zdHJ1bWVudGVkQXV0b0ZpbGxTZXJ2aWNlLnBlZWtJbnN0YW5jZSgpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRGaWxsRXZlbnRIaXN0b3J5KCk7Ci0gICAgICAgICAgICBhc3NlcnRUaGF0KHNlbGVjdGlvbi5nZXRDbGllbnRTdGF0ZSgpLmdldENoYXJTZXF1ZW5jZSgiY2xpZW50U3RhdGVLZXkiKSkuaXNFcXVhbFRvKAotICAgICAgICAgICAgICAgICAgICAiY2xpZW50U3RhdGVWYWx1ZSIpOwotCi0gICAgICAgICAgICBhc3NlcnRUaGF0KHNlbGVjdGlvbi5nZXRFdmVudHMoKS5zaXplKCkpLmlzRXF1YWxUbygxKTsKLSAgICAgICAgICAgIEZpbGxFdmVudEhpc3RvcnkuRXZlbnQgZXZlbnQgPSBzZWxlY3Rpb24uZ2V0RXZlbnRzKCkuZ2V0KDApOwotICAgICAgICAgICAgYXNzZXJ0VGhhdChldmVudC5nZXRUeXBlKCkpLmlzRXF1YWxUbyhUWVBFX0RBVEFTRVRfU0VMRUNURUQpOwotICAgICAgICAgICAgYXNzZXJ0VGhhdChldmVudC5nZXREYXRhc2V0SWQoKSkuaXNFcXVhbFRvKCJuYW1lMyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUFjdGl2aXR5Lm9uUGFzc3dvcmQoKHYpIC0+IHYuc2V0VGV4dCgibmV3IHBhc3N3b3JkIikpOwotICAgICAgICBtQWN0aXZpdHkuc3luY1J1bk9uVWlUaHJlYWQoKCkgLT4gbUFjdGl2aXR5LmZpbmlzaCgpKTsKLSAgICAgICAgd2FpdFVudGlsRGlzY29ubmVjdGVkKCk7Ci0KLSAgICAgICAgewotICAgICAgICAgICAgLy8gVmVyaWZ5IGZpbGwgc2VsZWN0aW9uCi0gICAgICAgICAgICBGaWxsRXZlbnRIaXN0b3J5IHNlbGVjdGlvbiA9IEluc3RydW1lbnRlZEF1dG9GaWxsU2VydmljZS5wZWVrSW5zdGFuY2UoKQotICAgICAgICAgICAgICAgICAgICAuZ2V0RmlsbEV2ZW50SGlzdG9yeSgpOwotICAgICAgICAgICAgYXNzZXJ0VGhhdChzZWxlY3Rpb24uZ2V0Q2xpZW50U3RhdGUoKS5nZXRDaGFyU2VxdWVuY2UoImNsaWVudFN0YXRlS2V5IikpLmlzRXF1YWxUbygKLSAgICAgICAgICAgICAgICAgICAgImNsaWVudFN0YXRlVmFsdWUiKTsKLQotICAgICAgICAgICAgYXNzZXJ0VGhhdChzZWxlY3Rpb24uZ2V0RXZlbnRzKCkuc2l6ZSgpKS5pc0VxdWFsVG8oMik7Ci0gICAgICAgICAgICBGaWxsRXZlbnRIaXN0b3J5LkV2ZW50IGV2ZW50MSA9IHNlbGVjdGlvbi5nZXRFdmVudHMoKS5nZXQoMCk7Ci0gICAgICAgICAgICBhc3NlcnRUaGF0KGV2ZW50MS5nZXRUeXBlKCkpLmlzRXF1YWxUbyhUWVBFX0RBVEFTRVRfU0VMRUNURUQpOwotICAgICAgICAgICAgYXNzZXJ0VGhhdChldmVudDEuZ2V0RGF0YXNldElkKCkpLmlzRXF1YWxUbygibmFtZTMiKTsKLQotICAgICAgICAgICAgRmlsbEV2ZW50SGlzdG9yeS5FdmVudCBldmVudDIgPSBzZWxlY3Rpb24uZ2V0RXZlbnRzKCkuZ2V0KDEpOwotICAgICAgICAgICAgYXNzZXJ0VGhhdChldmVudDIuZ2V0VHlwZSgpKS5pc0VxdWFsVG8oVFlQRV9TQVZFX1NIT1dOKTsKLSAgICAgICAgICAgIGFzc2VydFRoYXQoZXZlbnQyLmdldERhdGFzZXRJZCgpKS5pc051bGwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgY2hlY2tGaWxsU2VsZWN0aW9uSXNSZXNldEFmdGVyUmV0dXJuaW5nTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBlbmFibGVTZXJ2aWNlKCk7Ci0KLSAgICAgICAgLy8gRmlyc3QgcmVzZXQKLSAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UobmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkuYWRkRGF0YXNldCgKLSAgICAgICAgICAgICAgICBuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgInVzZXJuYW1lIikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJkYXRhc2V0MSIpKQotICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCi0gICAgICAgICAgICAgICAgLmJ1aWxkKCkpOwotICAgICAgICBtQWN0aXZpdHkuZXhwZWN0QXV0b0ZpbGwoInVzZXJuYW1lIik7Ci0KLSAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoVmlldzo6cmVxdWVzdEZvY3VzKTsKLSAgICAgICAgd2FpdFVudGlsQ29ubmVjdGVkKCk7Ci0gICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwotICAgICAgICBzVWlCb3Quc2VsZWN0RGF0YXNldCgiZGF0YXNldDEiKTsKLSAgICAgICAgbUFjdGl2aXR5LmFzc2VydEF1dG9GaWxsZWQoKTsKLQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBWZXJpZnkgZmlsbCBzZWxlY3Rpb24KLSAgICAgICAgICAgIEZpbGxFdmVudEhpc3Rvcnkgc2VsZWN0aW9uID0gSW5zdHJ1bWVudGVkQXV0b0ZpbGxTZXJ2aWNlLnBlZWtJbnN0YW5jZSgpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRGaWxsRXZlbnRIaXN0b3J5KCk7Ci0gICAgICAgICAgICBhc3NlcnRUaGF0KHNlbGVjdGlvbi5nZXRDbGllbnRTdGF0ZSgpKS5pc051bGwoKTsKLQotICAgICAgICAgICAgYXNzZXJ0VGhhdChzZWxlY3Rpb24uZ2V0RXZlbnRzKCkuc2l6ZSgpKS5pc0VxdWFsVG8oMSk7Ci0gICAgICAgICAgICBGaWxsRXZlbnRIaXN0b3J5LkV2ZW50IGV2ZW50ID0gc2VsZWN0aW9uLmdldEV2ZW50cygpLmdldCgwKTsKLSAgICAgICAgICAgIGFzc2VydFRoYXQoZXZlbnQuZ2V0VHlwZSgpKS5pc0VxdWFsVG8oVFlQRV9EQVRBU0VUX1NFTEVDVEVEKTsKLSAgICAgICAgICAgIGFzc2VydFRoYXQoZXZlbnQuZ2V0RGF0YXNldElkKCkpLmlzTnVsbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU2Vjb25kIHJlcXVlc3QKLSAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UoTk9fUkVTUE9OU0UpOwotICAgICAgICBtQWN0aXZpdHkub25QYXNzd29yZChWaWV3OjpyZXF1ZXN0Rm9jdXMpOwotICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKLSAgICAgICAgc1VpQm90LmFzc2VydE5vRGF0YXNldHMoKTsKLSAgICAgICAgd2FpdFVudGlsRGlzY29ubmVjdGVkKCk7Ci0KLSAgICAgICAgewotICAgICAgICAgICAgLy8gVmVyaWZ5IGZpbGwgc2VsZWN0aW9uCi0gICAgICAgICAgICBGaWxsRXZlbnRIaXN0b3J5IHNlbGVjdGlvbiA9IEluc3RydW1lbnRlZEF1dG9GaWxsU2VydmljZS5wZWVrSW5zdGFuY2UoKQotICAgICAgICAgICAgICAgICAgICAuZ2V0RmlsbEV2ZW50SGlzdG9yeSgpOwotICAgICAgICAgICAgYXNzZXJ0VGhhdChzZWxlY3Rpb24pLmlzTnVsbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBjaGVja0ZpbGxTZWxlY3Rpb25Jc1Jlc2V0QWZ0ZXJSZXR1cm5pbmdFcnJvcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBlbmFibGVTZXJ2aWNlKCk7Ci0KLSAgICAgICAgLy8gRmlyc3QgcmVzZXQKLSAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UobmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkuYWRkRGF0YXNldCgKLSAgICAgICAgICAgICAgICBuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgInVzZXJuYW1lIikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJkYXRhc2V0MSIpKQotICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCi0gICAgICAgICAgICAgICAgLmJ1aWxkKCkpOwotICAgICAgICBtQWN0aXZpdHkuZXhwZWN0QXV0b0ZpbGwoInVzZXJuYW1lIik7Ci0KLSAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoVmlldzo6cmVxdWVzdEZvY3VzKTsKLSAgICAgICAgd2FpdFVudGlsQ29ubmVjdGVkKCk7Ci0gICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwotICAgICAgICBzVWlCb3Quc2VsZWN0RGF0YXNldCgiZGF0YXNldDEiKTsKLSAgICAgICAgbUFjdGl2aXR5LmFzc2VydEF1dG9GaWxsZWQoKTsKLQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBWZXJpZnkgZmlsbCBzZWxlY3Rpb24KLSAgICAgICAgICAgIEZpbGxFdmVudEhpc3Rvcnkgc2VsZWN0aW9uID0gSW5zdHJ1bWVudGVkQXV0b0ZpbGxTZXJ2aWNlLnBlZWtJbnN0YW5jZSgpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRGaWxsRXZlbnRIaXN0b3J5KCk7Ci0gICAgICAgICAgICBhc3NlcnRUaGF0KHNlbGVjdGlvbi5nZXRDbGllbnRTdGF0ZSgpKS5pc051bGwoKTsKLQotICAgICAgICAgICAgYXNzZXJ0VGhhdChzZWxlY3Rpb24uZ2V0RXZlbnRzKCkuc2l6ZSgpKS5pc0VxdWFsVG8oMSk7Ci0gICAgICAgICAgICBGaWxsRXZlbnRIaXN0b3J5LkV2ZW50IGV2ZW50ID0gc2VsZWN0aW9uLmdldEV2ZW50cygpLmdldCgwKTsKLSAgICAgICAgICAgIGFzc2VydFRoYXQoZXZlbnQuZ2V0VHlwZSgpKS5pc0VxdWFsVG8oVFlQRV9EQVRBU0VUX1NFTEVDVEVEKTsKLSAgICAgICAgICAgIGFzc2VydFRoYXQoZXZlbnQuZ2V0RGF0YXNldElkKCkpLmlzTnVsbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU2Vjb25kIHJlcXVlc3QKLSAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UobmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkucmV0dXJuRmFpbHVyZSgiRCdPSCEiKS5idWlsZCgpKTsKLSAgICAgICAgbUFjdGl2aXR5Lm9uUGFzc3dvcmQoVmlldzo6cmVxdWVzdEZvY3VzKTsKLSAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnROb0RhdGFzZXRzKCk7Ci0gICAgICAgIHdhaXRVbnRpbERpc2Nvbm5lY3RlZCgpOwotCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFZlcmlmeSBmaWxsIHNlbGVjdGlvbgotICAgICAgICAgICAgRmlsbEV2ZW50SGlzdG9yeSBzZWxlY3Rpb24gPSBJbnN0cnVtZW50ZWRBdXRvRmlsbFNlcnZpY2UucGVla0luc3RhbmNlKCkKLSAgICAgICAgICAgICAgICAgICAgLmdldEZpbGxFdmVudEhpc3RvcnkoKTsKLSAgICAgICAgICAgIGFzc2VydFRoYXQoc2VsZWN0aW9uKS5pc051bGwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgY2hlY2tGaWxsU2VsZWN0aW9uSXNSZXNldEFmdGVyVGltZW91dCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBlbmFibGVTZXJ2aWNlKCk7Ci0KLSAgICAgICAgLy8gRmlyc3QgcmVzZXQKLSAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UobmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkuYWRkRGF0YXNldCgKLSAgICAgICAgICAgICAgICBuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgInVzZXJuYW1lIikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJkYXRhc2V0MSIpKQotICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCi0gICAgICAgICAgICAgICAgLmJ1aWxkKCkpOwotICAgICAgICBtQWN0aXZpdHkuZXhwZWN0QXV0b0ZpbGwoInVzZXJuYW1lIik7Ci0KLSAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoVmlldzo6cmVxdWVzdEZvY3VzKTsKLSAgICAgICAgd2FpdFVudGlsQ29ubmVjdGVkKCk7Ci0gICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwotICAgICAgICBzVWlCb3Quc2VsZWN0RGF0YXNldCgiZGF0YXNldDEiKTsKLSAgICAgICAgbUFjdGl2aXR5LmFzc2VydEF1dG9GaWxsZWQoKTsKLQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBWZXJpZnkgZmlsbCBzZWxlY3Rpb24KLSAgICAgICAgICAgIEZpbGxFdmVudEhpc3Rvcnkgc2VsZWN0aW9uID0gSW5zdHJ1bWVudGVkQXV0b0ZpbGxTZXJ2aWNlLnBlZWtJbnN0YW5jZSgpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRGaWxsRXZlbnRIaXN0b3J5KCk7Ci0gICAgICAgICAgICBhc3NlcnRUaGF0KHNlbGVjdGlvbi5nZXRDbGllbnRTdGF0ZSgpKS5pc051bGwoKTsKLQotICAgICAgICAgICAgYXNzZXJ0VGhhdChzZWxlY3Rpb24uZ2V0RXZlbnRzKCkuc2l6ZSgpKS5pc0VxdWFsVG8oMSk7Ci0gICAgICAgICAgICBGaWxsRXZlbnRIaXN0b3J5LkV2ZW50IGV2ZW50ID0gc2VsZWN0aW9uLmdldEV2ZW50cygpLmdldCgwKTsKLSAgICAgICAgICAgIGFzc2VydFRoYXQoZXZlbnQuZ2V0VHlwZSgpKS5pc0VxdWFsVG8oVFlQRV9EQVRBU0VUX1NFTEVDVEVEKTsKLSAgICAgICAgICAgIGFzc2VydFRoYXQoZXZlbnQuZ2V0RGF0YXNldElkKCkpLmlzTnVsbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU2Vjb25kIHJlcXVlc3QKLSAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UoRE9fTk9UX1JFUExZX1JFU1BPTlNFKTsKLSAgICAgICAgbUFjdGl2aXR5Lm9uUGFzc3dvcmQoVmlldzo6cmVxdWVzdEZvY3VzKTsKLSAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7Ci0gICAgICAgIHdhaXRVbnRpbERpc2Nvbm5lY3RlZCgpOwotCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFZlcmlmeSBmaWxsIHNlbGVjdGlvbgotICAgICAgICAgICAgRmlsbEV2ZW50SGlzdG9yeSBzZWxlY3Rpb24gPSBJbnN0cnVtZW50ZWRBdXRvRmlsbFNlcnZpY2UucGVla0luc3RhbmNlKCkKLSAgICAgICAgICAgICAgICAgICAgLmdldEZpbGxFdmVudEhpc3RvcnkoKTsKLSAgICAgICAgICAgIGFzc2VydFRoYXQoc2VsZWN0aW9uKS5pc051bGwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgQnVuZGxlIGdldEJ1bmRsZShTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgZmluYWwgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgYnVuZGxlLnB1dFN0cmluZyhrZXksIHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIGJ1bmRsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGUgZm9sbG93aW5nIHNjZW5hcmlvOgotICAgICAqCi0gICAgICogPG9sPgotICAgICAqICAgIDxsaT5BY3Rpdml0eSBBIGlzIGxhdW5jaGVkLgotICAgICAqICAgIDxsaT5BY3Rpdml0eSBBIHRyaWdnZXJzIGF1dG9maWxsLgotICAgICAqICAgIDxsaT5BY3Rpdml0eSBCIGlzIGxhdW5jaGVkLgotICAgICAqICAgIDxsaT5BY3Rpdml0eSBCIHRyaWdnZXJzIGF1dG9maWxsLgotICAgICAqICAgIDxsaT5Vc2VyIGdvZXMgYmFjayB0byBBY3Rpdml0eSBBLgotICAgICAqICAgIDxsaT5Vc2VyIHRyaWdnZXJzIHNhdmUgb24gQWN0aXZpdHkgQSAtIGF0IHRoaXMgcG9pbnQsIHNlcnZpY2Ugc2hvdWxkIGhhdmUgc3RhdHMgb2YKLSAgICAgKiAgICAgICAgYWN0aXZpdHkgQiwgYW5kIHN0YXRzIGZvciBhY3Rpdml0eSBBIHNob3VsZCBoYXZlIGJlZWVuIGRpc2NhcmRlZC4KLSAgICAgKiA8L29sPgotICAgICAqLwotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgY2hlY2tGaWxsU2VsZWN0aW9uRnJvbVByZXZpb3VzU2Vzc2lvbklzRGlzY2FyZGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKLQotICAgICAgICAvLyBMYXVuY2ggYWN0aXZpdHkgQQotICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgIC5zZXRFeHRyYXMoZ2V0QnVuZGxlKCJhY3Rpdml0eSIsICJBIikpCi0gICAgICAgICAgICAgICAgLnNldFJlcXVpcmVkU2F2YWJsZUlkcyhTQVZFX0RBVEFfVFlQRV9QQVNTV09SRCwgSURfVVNFUk5BTUUsIElEX1BBU1NXT1JEKQotICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKLQotICAgICAgICAvLyBUcmlnZ2VyIGF1dG9maWxsIG9uIGFjdGl2aXR5IEEKLSAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoVmlldzo6cmVxdWVzdEZvY3VzKTsKLSAgICAgICAgd2FpdFVudGlsQ29ubmVjdGVkKCk7Ci0gICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwotCi0gICAgICAgIC8vIFZlcmlmeSBmaWxsIHNlbGVjdGlvbiBmb3IgQWN0aXZpdHkgQQotICAgICAgICBGaWxsRXZlbnRIaXN0b3J5IHNlbGVjdGlvbkEgPSBJbnN0cnVtZW50ZWRBdXRvRmlsbFNlcnZpY2UucGVla0luc3RhbmNlKCkKLSAgICAgICAgICAgICAgICAuZ2V0RmlsbEV2ZW50SGlzdG9yeSgpOwotICAgICAgICBhc3NlcnRUaGF0KHNlbGVjdGlvbkEuZ2V0Q2xpZW50U3RhdGUoKS5nZXRTdHJpbmcoImFjdGl2aXR5IikpLmlzRXF1YWxUbygiQSIpOwotICAgICAgICBhc3NlcnRUaGF0KHNlbGVjdGlvbkEuZ2V0RXZlbnRzKCkpLmlzTnVsbCgpOwotCi0gICAgICAgIC8vIExhdW5jaCBhY3Rpdml0eSBCCi0gICAgICAgIG1Db250ZXh0LnN0YXJ0QWN0aXZpdHkobmV3IEludGVudChtQ29udGV4dCwgQ2hlY2tvdXRBY3Rpdml0eS5jbGFzcykpOwotCi0gICAgICAgIC8vIFRyaWdnZXIgYXV0b2ZpbGwgb24gYWN0aXZpdHkgQgotICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgIC5zZXRFeHRyYXMoZ2V0QnVuZGxlKCJhY3Rpdml0eSIsICJCIikpCi0gICAgICAgICAgICAgICAgLmFkZERhdGFzZXQobmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfQ0NfTlVNQkVSLCAiNDgxNTE2MjM0MiIpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiZGF0YXNldEIiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQotICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKLSAgICAgICAgc1VpQm90LmZvY3VzQnlSZWxhdGl2ZUlkKElEX0NDX05VTUJFUik7Ci0gICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwotCi0gICAgICAgIC8vIFZlcmlmeSBmaWxsIHNlbGVjdGlvbiBmb3IgQWN0aXZpdHkgQgotICAgICAgICBmaW5hbCBGaWxsRXZlbnRIaXN0b3J5IHNlbGVjdGlvbkIgPSBJbnN0cnVtZW50ZWRBdXRvRmlsbFNlcnZpY2UucGVla0luc3RhbmNlKCkKLSAgICAgICAgICAgICAgICAuZ2V0RmlsbEV2ZW50SGlzdG9yeSgpOwotICAgICAgICBhc3NlcnRUaGF0KHNlbGVjdGlvbkIuZ2V0Q2xpZW50U3RhdGUoKS5nZXRTdHJpbmcoImFjdGl2aXR5IikpLmlzRXF1YWxUbygiQiIpOwotICAgICAgICBhc3NlcnRUaGF0KHNlbGVjdGlvbkIuZ2V0RXZlbnRzKCkpLmlzTnVsbCgpOwotCi0gICAgICAgIC8vIE5vdyBzd2l0Y2ggYmFjayB0byBBLi4uCi0gICAgICAgIHNVaUJvdC5wcmVzc0JhY2soKTsgLy8gZGlzbWlzcyBrZXlib2FyZAotICAgICAgICBzVWlCb3QucHJlc3NCYWNrKCk7IC8vIGRpc21pc3MgdGFzawotICAgICAgICBzVWlCb3QuYXNzZXJ0U2hvd25CeVJlbGF0aXZlSWQoSURfVVNFUk5BTUUpOwotICAgICAgICAvLyAuLi5hbmQgdHJpZ2dlciBzYXZlCi0gICAgICAgIC8vIFNldCBjcmVkZW50aWFscy4uLgotICAgICAgICBtQWN0aXZpdHkub25Vc2VybmFtZSgodikgLT4gdi5zZXRUZXh0KCJtYWxrb3ZpY2giKSk7Ci0gICAgICAgIG1BY3Rpdml0eS5vblBhc3N3b3JkKCh2KSAtPiB2LnNldFRleHQoIm1hbGtvdmljaCIpKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdGVkTWVzc2FnZSA9IGdldFdlbGNvbWVNZXNzYWdlKCJtYWxrb3ZpY2giKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGFjdHVhbE1lc3NhZ2UgPSBtQWN0aXZpdHkudGFwTG9naW4oKTsKLSAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoIldyb25nIHdlbGNvbWUgbXNnIikudGhhdChhY3R1YWxNZXNzYWdlKS5pc0VxdWFsVG8oZXhwZWN0ZWRNZXNzYWdlKTsKLSAgICAgICAgc1VpQm90LnNhdmVGb3JBdXRvZmlsbCh0cnVlLCBTQVZFX0RBVEFfVFlQRV9QQVNTV09SRCk7Ci0gICAgICAgIHNSZXBsaWVyLmdldE5leHRTYXZlUmVxdWVzdCgpOwotCi0gICAgICAgIC8vIEZpbmFsbHksIG1ha2Ugc3VyZSBoaXN0b3J5IGlzIHJpZ2h0Ci0gICAgICAgIGZpbmFsIEZpbGxFdmVudEhpc3RvcnkgZmluYWxTZWxlY3Rpb24gPSBJbnN0cnVtZW50ZWRBdXRvRmlsbFNlcnZpY2UucGVla0luc3RhbmNlKCkKLSAgICAgICAgICAgICAgICAuZ2V0RmlsbEV2ZW50SGlzdG9yeSgpOwotICAgICAgICBhc3NlcnRUaGF0KGZpbmFsU2VsZWN0aW9uLmdldENsaWVudFN0YXRlKCkuZ2V0U3RyaW5nKCJhY3Rpdml0eSIpKS5pc0VxdWFsVG8oIkIiKTsKLSAgICAgICAgYXNzZXJ0VGhhdChmaW5hbFNlbGVjdGlvbi5nZXRFdmVudHMoKSkuaXNOdWxsKCk7Ci0KKyAgICAgICAgbVVpQm90LnByZXNzQmFjaygpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0zNDMzLDE3ICsyMzE0LDMwIEBACiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QXV0b2ZpbGxTZXJ2aWNlQ29tcG9uZW50TmFtZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBBdXRvZmlsbE1hbmFnZXIgYWZtID0gbUFjdGl2aXR5LmdldEF1dG9maWxsTWFuYWdlcigpOworCisgICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKKyAgICAgICAgZmluYWwgQ29tcG9uZW50TmFtZSBjb21wb25lbnROYW1lID0gYWZtLmdldEF1dG9maWxsU2VydmljZUNvbXBvbmVudE5hbWUoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjb21wb25lbnROYW1lLmdldFBhY2thZ2VOYW1lKCkpLmlzRXF1YWxUbyhTRVJWSUNFX1BBQ0tBR0UpOworICAgICAgICBhc3NlcnRUaGF0KGNvbXBvbmVudE5hbWUuZ2V0Q2xhc3NOYW1lKCkpLmVuZHNXaXRoKFNFUlZJQ0VfQ0xBU1MpOworCisgICAgICAgIGRpc2FibGVTZXJ2aWNlKCk7CisgICAgICAgIGFzc2VydFRoYXQoYWZtLmdldEF1dG9maWxsU2VydmljZUNvbXBvbmVudE5hbWUoKSkuaXNOdWxsKCk7CisgICAgfQorCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0dXBDb21wbGV0ZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBlbmFibGVTZXJ2aWNlKCk7CiAKICAgICAgICAgLy8gU2FuaXR5IGNoZWNrLgogICAgICAgICBmaW5hbCBBdXRvZmlsbE1hbmFnZXIgYWZtID0gbUFjdGl2aXR5LmdldEF1dG9maWxsTWFuYWdlcigpOwotICAgICAgICBhc3NlcnRUaGF0KGFmbS5pc0VuYWJsZWQoKSkuaXNUcnVlKCk7CisgICAgICAgIEhlbHBlci5hc3NlcnRBdXRvZmlsbEVuYWJsZWQoYWZtLCB0cnVlKTsKIAogICAgICAgICAvLyBOb3cgZGlzYWJsZSB1c2VyX2NvbXBsZXRlIGFuZCB0cnkgYWdhaW4uCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBzZXRVc2VyQ29tcGxldGUobUNvbnRleHQsIGZhbHNlKTsKLSAgICAgICAgICAgIGFzc2VydFRoYXQoYWZtLmlzRW5hYmxlZCgpKS5pc0ZhbHNlKCk7CisgICAgICAgICAgICBIZWxwZXIuYXNzZXJ0QXV0b2ZpbGxFbmFibGVkKGFmbSwgZmFsc2UpOwogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgc2V0VXNlckNvbXBsZXRlKG1Db250ZXh0LCB0cnVlKTsKICAgICAgICAgfQpAQCAtMzQ2MywxNSArMjM1Nyw1NyBAQAogICAgICAgICBtQWN0aXZpdHkuZXhwZWN0QXV0b0ZpbGwoImR1ZGUiLCAic3dlZXQiKTsKIAogICAgICAgICAvLyBUcmlnZ2VyIGF1dG8tZmlsbC4KLSAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoVmlldzo6cmVxdWVzdEZvY3VzKTsKKyAgICAgICAgcmVxdWVzdEZvY3VzT25Vc2VybmFtZSgpOwogICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJUaGUgRHVkZSIpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlRoZSBEdWRlIik7CiAKICAgICAgICAgLy8gTm93IGRpc2FibGUgc2VydmljZSBieSBzZXR0aW5nIGFub3RoZXIgc2VydmljZQogICAgICAgICBIZWxwZXIuZW5hYmxlQXV0b2ZpbGxTZXJ2aWNlKG1Db250ZXh0LCBOb09wQXV0b2ZpbGxTZXJ2aWNlLlNFUlZJQ0VfTkFNRSk7CiAKICAgICAgICAgLy8gLi4uYW5kIG1ha2Ugc3VyZSBwb3B1cCdzIGdvbmUKLSAgICAgICAgc1VpQm90LmFzc2VydE5vRGF0YXNldHMoKTsKKyAgICAgICAgbVVpQm90LmFzc2VydE5vRGF0YXNldHMoKTsKKyAgICB9CisKKyAgICAvLyBUT0RPKGIvNzA2ODIyMjMpOiBhZGQgYSBuZXcgdGVzdCB0byBtYWtlIHN1cmUgc2VydmljZSB3aXRoIEJJTkRfQVVUT0ZJTEwgcGVybWlzc2lvbiB3b3JrcworICAgIEBUZXN0CisgICAgQEFwcE1vZGVGdWxsIC8vIFNlcnZpY2Utc3BlY2lmaWMgdGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2aWNlSXNEaXNhYmxlZFdoZW5OZXdTZXJ2aWNlSW5mb0lzSW52YWxpZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzZXJ2aWNlSXNEaXNhYmxlZFdoZW5OZXdTZXJ2aWNlSXNJbnZhbGlkKEJhZEF1dG9maWxsU2VydmljZS5TRVJWSUNFX05BTUUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgQEFwcE1vZGVGdWxsIC8vIFNlcnZpY2Utc3BlY2lmaWMgdGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2aWNlSXNEaXNhYmxlZFdoZW5OZXdTZXJ2aWNlTmFtZUlzSW52YWxpZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzZXJ2aWNlSXNEaXNhYmxlZFdoZW5OZXdTZXJ2aWNlSXNJbnZhbGlkKCJZX1VfTk9fVkFMSUQiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2VydmljZUlzRGlzYWJsZWRXaGVuTmV3U2VydmljZUlzSW52YWxpZChTdHJpbmcgc2VydmljZU5hbWUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBTZXQgc2VydmljZS4KKyAgICAgICAgZW5hYmxlU2VydmljZSgpOworCisgICAgICAgIC8vIFNldCBleHBlY3RhdGlvbnMuCisgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgImR1ZGUiKQorICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9QQVNTV09SRCwgInN3ZWV0IikKKyAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiVGhlIER1ZGUiKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgICAgIG1BY3Rpdml0eS5leHBlY3RBdXRvRmlsbCgiZHVkZSIsICJzd2VldCIpOworCisgICAgICAgIC8vIFRyaWdnZXIgYXV0b2ZpbGwuCisgICAgICAgIHJlcXVlc3RGb2N1c09uVXNlcm5hbWUoKTsKKyAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cygiVGhlIER1ZGUiKTsKKworICAgICAgICAvLyBOb3cgZGlzYWJsZSBzZXJ2aWNlIGJ5IHNldHRpbmcgYW5vdGhlciBzZXJ2aWNlLi4uCisgICAgICAgIEhlbHBlci5lbmFibGVBdXRvZmlsbFNlcnZpY2UobUNvbnRleHQsIHNlcnZpY2VOYW1lKTsKKworICAgICAgICAvLyAuLi5hbmQgbWFrZSBzdXJlIHBvcHVwJ3MgZ29uZQorICAgICAgICBtVWlCb3QuYXNzZXJ0Tm9EYXRhc2V0cygpOworCisgICAgICAgIC8vIFRoZW4gdHJ5IHRvIHRyaWdnZXIgYXV0b2ZpbGwgYWdhaW4uLi4KKyAgICAgICAgbUFjdGl2aXR5Lm9uUGFzc3dvcmQoVmlldzo6cmVxdWVzdEZvY3VzKTsKKyAgICAgICAgLy8uLi5pdCBzaG91bGQgbm90IHdvcmshCisgICAgICAgIG1VaUJvdC5hc3NlcnROb0RhdGFzZXRzRXZlcigpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0zNDg4LDExICsyNDI0LDExIEBACiAgICAgICAgIG1BY3Rpdml0eS5leHBlY3RBdXRvRmlsbCgiZHVkZSIsICJzd2VldCIpOwogCiAgICAgICAgIC8vIFRyaWdnZXIgYXV0by1maWxsLgotICAgICAgICBtQWN0aXZpdHkub25Vc2VybmFtZShWaWV3OjpyZXF1ZXN0Rm9jdXMpOworICAgICAgICByZXF1ZXN0Rm9jdXNPblVzZXJuYW1lKCk7CiAgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwogCiAgICAgICAgIC8vIEF1dG8tZmlsbCBpdC4KLSAgICAgICAgc1VpQm90LnNlbGVjdERhdGFzZXQoIlRoZSBEdWRlIik7CisgICAgICAgIG1VaUJvdC5zZWxlY3REYXRhc2V0KCJUaGUgRHVkZSIpOwogCiAgICAgICAgIC8vIENoZWNrIHRoZSByZXN1bHRzLgogICAgICAgICBtQWN0aXZpdHkuYXNzZXJ0QXV0b0ZpbGxlZCgpOwpAQCAtMzUzOSwxMyArMjQ3NSwxMyBAQAogICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShyZXNwb25zZS5idWlsZCgpKTsKIAogICAgICAgICAvLyBUcmlnZ2VyIGF1dG8tZmlsbC4KLSAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoVmlldzo6cmVxdWVzdEZvY3VzKTsKKyAgICAgICAgcmVxdWVzdEZvY3VzT25Vc2VybmFtZSgpOwogICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKIAogICAgICAgICAvLyBNYWtlIHN1cmUgYWxsIGRhdGFzZXRzIGFyZSBzaG93bi4KICAgICAgICAgLy8gVE9ETzogaW1wcm92ZSBhc3NlcnREYXRhc2V0cygpIHNvIGl0IHN1cHBvcnRzIHNjcm9sbGluZywgYW5kIGFzc2VydCBhbGwgb2YgdGhlbSBhcmUKLSAgICAgICAgLy8gc2hvd24KLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJEUy0xIiwgIkRTLTIiLCAiRFMtMyIpOworICAgICAgICAvLyBzaG93bi4gSW4gZnVsbHNjcmVlbiB0aGVyZSBhcmUgNCBpdGVtcywgb3RoZXJ3aXNlIHRoZXJlIGFyZSAzIGl0ZW1zLgorICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHNDb250YWlucygiRFMtMSIsICJEUy0yIiwgIkRTLTMiKTsKIAogICAgICAgICAvLyBUT0RPOiBvbmNlIGl0IHN1cHBvcnRzIHNjcm9sbGluZywgc2VsZWN0cyB0aGUgbGFzdCBkYXRhc2V0IGFuZCBhc3NlcnRzIGl0J3MgZmlsbGVkLgogICAgIH0KQEAgLTM1NTcsNyArMjQ5Myw3IEBACiAKICAgICAgICAgLy8gU2V0IGV4cGVjdGF0aW9ucy4KICAgICAgICAgZmluYWwgT25lVGltZUNhbmNlbGxhdGlvblNpZ25hbExpc3RlbmVyIGxpc3RlbmVyID0KLSAgICAgICAgICAgICAgICBuZXcgT25lVGltZUNhbmNlbGxhdGlvblNpZ25hbExpc3RlbmVyKEhlbHBlci5GSUxMX1RJTUVPVVRfTVMgKyAyMDAwKTsKKyAgICAgICAgICAgICAgICBuZXcgT25lVGltZUNhbmNlbGxhdGlvblNpZ25hbExpc3RlbmVyKFRpbWVvdXRzLkZJTExfVElNRU9VVC5tcygpICsgMjAwMCk7CiAgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKERPX05PVF9SRVBMWV9SRVNQT05TRSk7CiAKICAgICAgICAgLy8gVHJpZ2dlciBhdXRvLWZpbGwuCkBAIC0zNTY3LDggKzI1MDMsMzEgQEAKICAgICAgICAgd2FpdFVudGlsQ29ubmVjdGVkKCk7CiAgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpLmNhbmNlbGxhdGlvblNpZ25hbC5zZXRPbkNhbmNlbExpc3RlbmVyKGxpc3RlbmVyKTsKIAotICAgICAgICAvLyBBc3NlcnRSZXN1bHRzCi0gICAgICAgIHdhaXRVbnRpbERpc2Nvbm5lY3RlZCgpOworICAgICAgICAvLyBBc3NlcnQgcmVzdWx0cwogICAgICAgICBsaXN0ZW5lci5hc3NlcnRPbkNhbmNlbENhbGxlZCgpOwogICAgIH0KKworICAgIEBUZXN0CisgICAgQEFwcE1vZGVGdWxsIC8vIFVuaXQgdGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROZXdUZXh0QXR0cmlidXRlcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBlbmFibGVTZXJ2aWNlKCk7CisgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKE5PX1JFU1BPTlNFKTsKKyAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoVmlldzo6cmVxdWVzdEZvY3VzKTsKKworICAgICAgICBmaW5hbCBGaWxsUmVxdWVzdCByZXF1ZXN0ID0gc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CisgICAgICAgIGZpbmFsIFZpZXdOb2RlIHVzZXJuYW1lID0gZmluZE5vZGVCeVJlc291cmNlSWQocmVxdWVzdC5zdHJ1Y3R1cmUsIElEX1VTRVJOQU1FKTsKKyAgICAgICAgYXNzZXJ0VGhhdCh1c2VybmFtZS5nZXRNaW5UZXh0RW1zKCkpLmlzRXF1YWxUbygyKTsKKyAgICAgICAgYXNzZXJ0VGhhdCh1c2VybmFtZS5nZXRNYXhUZXh0RW1zKCkpLmlzRXF1YWxUbyg1KTsKKyAgICAgICAgYXNzZXJ0VGhhdCh1c2VybmFtZS5nZXRNYXhUZXh0TGVuZ3RoKCkpLmlzRXF1YWxUbygyNSk7CisKKyAgICAgICAgZmluYWwgVmlld05vZGUgY29udGFpbmVyID0gZmluZE5vZGVCeVJlc291cmNlSWQocmVxdWVzdC5zdHJ1Y3R1cmUsIElEX1VTRVJOQU1FX0NPTlRBSU5FUik7CisgICAgICAgIGFzc2VydFRoYXQoY29udGFpbmVyLmdldE1pblRleHRFbXMoKSkuaXNFcXVhbFRvKC0xKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjb250YWluZXIuZ2V0TWF4VGV4dEVtcygpKS5pc0VxdWFsVG8oLTEpOworICAgICAgICBhc3NlcnRUaGF0KGNvbnRhaW5lci5nZXRNYXhUZXh0TGVuZ3RoKCkpLmlzRXF1YWxUbygtMSk7CisKKyAgICAgICAgZmluYWwgVmlld05vZGUgcGFzc3dvcmQgPSBmaW5kTm9kZUJ5UmVzb3VyY2VJZChyZXF1ZXN0LnN0cnVjdHVyZSwgSURfUEFTU1dPUkQpOworICAgICAgICBhc3NlcnRUaGF0KHBhc3N3b3JkLmdldE1pblRleHRFbXMoKSkuaXNFcXVhbFRvKC0xKTsKKyAgICAgICAgYXNzZXJ0VGhhdChwYXNzd29yZC5nZXRNYXhUZXh0RW1zKCkpLmlzRXF1YWxUbygtMSk7CisgICAgICAgIGFzc2VydFRoYXQocGFzc3dvcmQuZ2V0TWF4VGV4dExlbmd0aCgpKS5pc0VxdWFsVG8oLTEpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0xvZ2luV2l0aEN1c3RvbUhpZ2hsaWdodEFjdGl2aXR5LmphdmEgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9Mb2dpbldpdGhDdXN0b21IaWdobGlnaHRBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNzlmNzEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9Mb2dpbldpdGhDdXN0b21IaWdobGlnaHRBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHM7CisKKy8qKgorICogU2FtZSBhcyB7QGxpbmsgTG9naW5BY3Rpdml0eX0sIGJ1dCB3aXRoIGEgY3VzdG9tIGF1dG9maWxsIGhpZ2hsaWdodCBkcmF3YWJsZS4KKyAqLworcHVibGljIGNsYXNzIExvZ2luV2l0aEN1c3RvbUhpZ2hsaWdodEFjdGl2aXR5IGV4dGVuZHMgTG9naW5BY3Rpdml0eSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgaW50IGdldENvbnRlbnRWaWV3KCkgeworICAgICAgICByZXR1cm4gUi5sYXlvdXQubG9naW5fYWN0aXZpdHk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvTG9naW5XaXRoQ3VzdG9tSGlnaGxpZ2h0QWN0aXZpdHlUZXN0LmphdmEgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9Mb2dpbldpdGhDdXN0b21IaWdobGlnaHRBY3Rpdml0eVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTkzY2MzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvTG9naW5XaXRoQ3VzdG9tSGlnaGxpZ2h0QWN0aXZpdHlUZXN0LmphdmEKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5IZWxwZXIuSURfVVNFUk5BTUU7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24udHJ1dGguVHJ1dGguYXNzZXJ0VGhhdDsKKworaW1wb3J0IGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5DYW5uZWRGaWxsUmVzcG9uc2UuQ2FubmVkRGF0YXNldDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QudWlhdXRvbWF0b3IuVWlPYmplY3QyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVvdXRFeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBMb2dpbldpdGhDdXN0b21IaWdobGlnaHRBY3Rpdml0eVRlc3QgZXh0ZW5kcyBBdXRvRmlsbFNlcnZpY2VUZXN0Q2FzZSB7CisKKyAgICBAUnVsZQorICAgIHB1YmxpYyBmaW5hbCBBdXRvZmlsbEFjdGl2aXR5VGVzdFJ1bGU8TG9naW5XaXRoQ3VzdG9tSGlnaGxpZ2h0QWN0aXZpdHk+IG1BY3Rpdml0eVJ1bGUgPQorICAgICAgICAgICAgbmV3IEF1dG9maWxsQWN0aXZpdHlUZXN0UnVsZTxMb2dpbldpdGhDdXN0b21IaWdobGlnaHRBY3Rpdml0eT4oCisgICAgICAgICAgICBMb2dpbldpdGhDdXN0b21IaWdobGlnaHRBY3Rpdml0eS5jbGFzcyk7CisKKyAgICBwcml2YXRlIExvZ2luV2l0aEN1c3RvbUhpZ2hsaWdodEFjdGl2aXR5IG1BY3Rpdml0eTsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRBY3Rpdml0eSgpIHsKKyAgICAgICAgbUFjdGl2aXR5ID0gbUFjdGl2aXR5UnVsZS5nZXRBY3Rpdml0eSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEF1dG9maWxsQ3VzdG9tSGlnaGxpZ3RoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFNldCBzZXJ2aWNlLgorICAgICAgICBlbmFibGVTZXJ2aWNlKCk7CisKKyAgICAgICAgLy8gU2V0IGV4cGVjdGF0aW9ucy4KKyAgICAgICAgZmluYWwgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLmFkZERhdGFzZXQobmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfVVNFUk5BTUUsICJkdWRlIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJUaGUgRHVkZSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShidWlsZGVyLmJ1aWxkKCkpOworICAgICAgICBtQWN0aXZpdHkuZXhwZWN0QXV0b0ZpbGwoImR1ZGUiKTsKKworICAgICAgICAvLyBEeW5hbWljYWxseSBzZXQgcGFzc3dvcmQgdG8gbWFrZSBzdXJlIGl0J3Mgc2FuaXRpemVkLgorICAgICAgICBtQWN0aXZpdHkub25QYXNzd29yZCgodikgLT4gdi5zZXRUZXh0KCJJIEFNIEdST09UIikpOworCisgICAgICAgIC8vIFRyaWdnZXIgYXV0by1maWxsLgorICAgICAgICByZXF1ZXN0Rm9jdXNPblVzZXJuYW1lKCk7CisKKyAgICAgICAgLy8gQXV0by1maWxsIGl0LgorICAgICAgICBmaW5hbCBVaU9iamVjdDIgcGlja2VyID0gbVVpQm90LmFzc2VydERhdGFzZXRzKCJUaGUgRHVkZSIpOworICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKKworICAgICAgICBtVWlCb3Quc2VsZWN0RGF0YXNldChwaWNrZXIsICJUaGUgRHVkZSIpOworCisgICAgICAgIC8vIENoZWNrIHRoZSByZXN1bHRzLgorICAgICAgICBtQWN0aXZpdHkuYXNzZXJ0QXV0b0ZpbGxlZCgpOworCisgICAgICAgIGZpbmFsIFJlY3QgYm91bmRzID0gTXlEcmF3YWJsZS5nZXRBdXRvZmlsbGVkQm91bmRzKCk7CisgICAgICAgIGFzc2VydFRoYXQoYm91bmRzKS5pc05vdE51bGwoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChib3VuZHMucmlnaHQpLmlzRXF1YWxUbyhtQWN0aXZpdHkuZ2V0VXNlcm5hbWUoKS5nZXRXaWR0aCgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChib3VuZHMuYm90dG9tKS5pc0VxdWFsVG8obUFjdGl2aXR5LmdldFVzZXJuYW1lKCkuZ2V0SGVpZ2h0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcXVlc3RzIGZvY3VzIG9uIHVzZXJuYW1lIGFuZCBleHBlY3QgV2luZG93IGV2ZW50IGhhcHBlbnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcmVxdWVzdEZvY3VzT25Vc2VybmFtZSgpIHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIHsKKyAgICAgICAgbVVpQm90LndhaXRGb3JXaW5kb3dDaGFuZ2UoKCkgLT4gbUFjdGl2aXR5Lm9uVXNlcm5hbWUoVmlldzo6cmVxdWVzdEZvY3VzKSwKKyAgICAgICAgICAgICAgICBUaW1lb3V0cy5VSV9USU1FT1VULmdldE1heFZhbHVlKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0xvZ2luV2l0aFN0cmluZ3NBY3Rpdml0eS5qYXZhIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvTG9naW5XaXRoU3RyaW5nc0FjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBjM2U5MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0xvZ2luV2l0aFN0cmluZ3NBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHM7CisKKy8qKgorICogU2FtZSBhcyB7QGxpbmsgTG9naW5BY3Rpdml0eX0sIGJ1dCB3aXRoIHRoZSB0ZXh0cyBmb3Igc29tZSBmaWVsZHMgc2V0IGZyb20gcmVzb3VyY2VzLgorICovCitwdWJsaWMgY2xhc3MgTG9naW5XaXRoU3RyaW5nc0FjdGl2aXR5IGV4dGVuZHMgTG9naW5BY3Rpdml0eSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgaW50IGdldENvbnRlbnRWaWV3KCkgeworICAgICAgICByZXR1cm4gUi5sYXlvdXQubG9naW5fd2l0aF9zdHJpbmdzX2FjdGl2aXR5OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0xvZ2luV2l0aFN0cmluZ3NBY3Rpdml0eVRlc3QuamF2YSBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0xvZ2luV2l0aFN0cmluZ3NBY3Rpdml0eVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDc0ZDI4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvTG9naW5XaXRoU3RyaW5nc0FjdGl2aXR5VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHM7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5JRF9QQVNTV09SRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5JRF9QQVNTV09SRF9MQUJFTDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5JRF9VU0VSTkFNRTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5JRF9VU0VSTkFNRV9MQUJFTDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5hc3NlcnRUZXh0QW5kVmFsdWU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5IZWxwZXIuYXNzZXJ0VGV4dEZyb21SZXNvdWNlczsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5hc3NlcnRUZXh0SXNTYW5pdGl6ZWQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5IZWxwZXIuZmluZE5vZGVCeVJlc291cmNlSWQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5JbnN0cnVtZW50ZWRBdXRvRmlsbFNlcnZpY2Uud2FpdFVudGlsQ29ubmVjdGVkOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuTG9naW5BY3Rpdml0eS5BVVRIRU5USUNBVElPTl9NRVNTQUdFOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuTG9naW5BY3Rpdml0eS5nZXRXZWxjb21lTWVzc2FnZTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2aWNlLmF1dG9maWxsLlNhdmVJbmZvLlNBVkVfREFUQV9UWVBFX1BBU1NXT1JEOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLnRydXRoLlRydXRoLmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLnRydXRoLlRydXRoLmFzc2VydFdpdGhNZXNzYWdlOworCitpbXBvcnQgYW5kcm9pZC5hcHAuYXNzaXN0LkFzc2lzdFN0cnVjdHVyZS5WaWV3Tm9kZTsKK2ltcG9ydCBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuQ2FubmVkRmlsbFJlc3BvbnNlLkNhbm5lZERhdGFzZXQ7CitpbXBvcnQgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkluc3RydW1lbnRlZEF1dG9GaWxsU2VydmljZS5GaWxsUmVxdWVzdDsKK2ltcG9ydCBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSW5zdHJ1bWVudGVkQXV0b0ZpbGxTZXJ2aWNlLlNhdmVSZXF1ZXN0OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK0BBcHBNb2RlRnVsbCAvLyBMb2dpbkFjdGl2aXR5VGVzdCBpcyBlbm91Z2ggdG8gdGVzdCBlcGhlbWVyYWwgYXBwcyBzdXBwb3J0CitwdWJsaWMgY2xhc3MgTG9naW5XaXRoU3RyaW5nc0FjdGl2aXR5VGVzdCBleHRlbmRzIEF1dG9GaWxsU2VydmljZVRlc3RDYXNlIHsKKworICAgIEBSdWxlCisgICAgcHVibGljIGZpbmFsIEF1dG9maWxsQWN0aXZpdHlUZXN0UnVsZTxMb2dpbldpdGhTdHJpbmdzQWN0aXZpdHk+IG1BY3Rpdml0eVJ1bGUgPQorICAgICAgICAgICAgbmV3IEF1dG9maWxsQWN0aXZpdHlUZXN0UnVsZTxMb2dpbldpdGhTdHJpbmdzQWN0aXZpdHk+KExvZ2luV2l0aFN0cmluZ3NBY3Rpdml0eS5jbGFzcyk7CisKKyAgICBwcml2YXRlIExvZ2luV2l0aFN0cmluZ3NBY3Rpdml0eSBtQWN0aXZpdHk7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0QWN0aXZpdHkoKSB7CisgICAgICAgIG1BY3Rpdml0eSA9IG1BY3Rpdml0eVJ1bGUuZ2V0QWN0aXZpdHkoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvRmlsbE9uZURhdGFzZXRBbmRTYXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFNldCBzZXJ2aWNlLgorICAgICAgICBlbmFibGVTZXJ2aWNlKCk7CisKKyAgICAgICAgLy8gU2V0IGV4cGVjdGF0aW9ucy4KKyAgICAgICAgZmluYWwgQnVuZGxlIGV4dHJhcyA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgZXh0cmFzLnB1dFN0cmluZygibnVtYmVycyIsICI0ODE1MTYyMzQyIik7CisKKyAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UobmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuYWRkRGF0YXNldChuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJZCgiSSdtIHRoZSBhbHBoYSBhbmQgdGhlIG9tZWdhIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgImR1ZGUiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1BBU1NXT1JELCAic3dlZXQiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oIlRoZSBEdWRlIikpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuc2V0UmVxdWlyZWRTYXZhYmxlSWRzKFNBVkVfREFUQV9UWVBFX1BBU1NXT1JELCBJRF9VU0VSTkFNRSwgSURfUEFTU1dPUkQpCisgICAgICAgICAgICAgICAgLnNldEV4dHJhcyhleHRyYXMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICBtQWN0aXZpdHkuZXhwZWN0QXV0b0ZpbGwoImR1ZGUiLCAic3dlZXQiKTsKKworICAgICAgICAvLyBUcmlnZ2VyIGF1dG8tZmlsbC4KKyAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoVmlldzo6cmVxdWVzdEZvY3VzKTsKKyAgICAgICAgd2FpdFVudGlsQ29ubmVjdGVkKCk7CisKKyAgICAgICAgZmluYWwgRmlsbFJlcXVlc3QgZmlsbFJlcXVlc3QgPSBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKKworICAgICAgICAvLyBNYWtlIHN1cmUgaW5wdXQgd2FzIHNhbml0aXplZC4KKyAgICAgICAgYXNzZXJ0VGV4dElzU2FuaXRpemVkKGZpbGxSZXF1ZXN0LnN0cnVjdHVyZSwgSURfVVNFUk5BTUUpOworICAgICAgICBhc3NlcnRUZXh0SXNTYW5pdGl6ZWQoZmlsbFJlcXVlc3Quc3RydWN0dXJlLCBJRF9QQVNTV09SRCk7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIGxhYmVscyB3ZXJlIG5vdCBzYW5pdGl6ZWQKKyAgICAgICAgYXNzZXJ0VGV4dEZyb21SZXNvdWNlcyhmaWxsUmVxdWVzdC5zdHJ1Y3R1cmUsIElEX1VTRVJOQU1FX0xBQkVMLCAiVXNlcm5hbWUiLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAidXNlcm5hbWVfc3RyaW5nIik7CisgICAgICAgIGFzc2VydFRleHRGcm9tUmVzb3VjZXMoZmlsbFJlcXVlc3Quc3RydWN0dXJlLCBJRF9QQVNTV09SRF9MQUJFTCwgIlBhc3N3b3JkIiwgZmFsc2UsCisgICAgICAgICAgICAgICAgInBhc3N3b3JkX3N0cmluZyIpOworCisgICAgICAgIC8vIEF1dG8tZmlsbCBpdC4KKyAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQoIlRoZSBEdWRlIik7CisKKyAgICAgICAgLy8gQ2hlY2sgdGhlIHJlc3VsdHMuCisgICAgICAgIG1BY3Rpdml0eS5hc3NlcnRBdXRvRmlsbGVkKCk7CisKKyAgICAgICAgLy8gVHJ5IHRvIGxvZ2luLCBpdCB3aWxsIGZhaWwuCisgICAgICAgIGZpbmFsIFN0cmluZyBsb2dpbk1lc3NhZ2UgPSBtQWN0aXZpdHkudGFwTG9naW4oKTsKKworICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiV3JvbmcgbG9naW4gbXNnIikudGhhdChsb2dpbk1lc3NhZ2UpLmlzRXF1YWxUbyhBVVRIRU5USUNBVElPTl9NRVNTQUdFKTsKKworICAgICAgICAvLyBTZXQgcmlnaHQgcGFzc3dvcmQuLi4KKyAgICAgICAgbUFjdGl2aXR5Lm9uUGFzc3dvcmQoKHYpIC0+IHYuc2V0VGV4dCgiZHVkZSIpKTsKKworICAgICAgICAvLyAuLi4gYW5kIHRyeSBhZ2FpbgorICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWRNZXNzYWdlID0gZ2V0V2VsY29tZU1lc3NhZ2UoImR1ZGUiKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGFjdHVhbE1lc3NhZ2UgPSBtQWN0aXZpdHkudGFwTG9naW4oKTsKKyAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoIldyb25nIHdlbGNvbWUgbXNnIikudGhhdChhY3R1YWxNZXNzYWdlKS5pc0VxdWFsVG8oZXhwZWN0ZWRNZXNzYWdlKTsKKworICAgICAgICAvLyBBc3NlcnQgdGhlIHNuYWNrIGJhciBpcyBzaG93biBhbmQgdGFwICJTYXZlIi4KKyAgICAgICAgbVVpQm90LnNhdmVGb3JBdXRvZmlsbCh0cnVlLCBTQVZFX0RBVEFfVFlQRV9QQVNTV09SRCk7CisKKyAgICAgICAgZmluYWwgU2F2ZVJlcXVlc3Qgc2F2ZVJlcXVlc3QgPSBzUmVwbGllci5nZXROZXh0U2F2ZVJlcXVlc3QoKTsKKworICAgICAgICBhc3NlcnRUaGF0KHNhdmVSZXF1ZXN0LmRhdGFzZXRJZHMpLmNvbnRhaW5zRXhhY3RseSgiSSdtIHRoZSBhbHBoYSBhbmQgdGhlIG9tZWdhIik7CisKKyAgICAgICAgLy8gQXNzZXJ0IHZhbHVlIG9mIGV4cGVjdGVkIGZpZWxkcyAtIHNob3VsZCBub3QgYmUgc2FuaXRpemVkLgorICAgICAgICBmaW5hbCBWaWV3Tm9kZSB1c2VybmFtZSA9IGZpbmROb2RlQnlSZXNvdXJjZUlkKHNhdmVSZXF1ZXN0LnN0cnVjdHVyZSwgSURfVVNFUk5BTUUpOworICAgICAgICBhc3NlcnRUZXh0QW5kVmFsdWUodXNlcm5hbWUsICJkdWRlIik7CisgICAgICAgIGZpbmFsIFZpZXdOb2RlIHBhc3N3b3JkID0gZmluZE5vZGVCeVJlc291cmNlSWQoc2F2ZVJlcXVlc3Quc3RydWN0dXJlLCBJRF9VU0VSTkFNRSk7CisgICAgICAgIGFzc2VydFRleHRBbmRWYWx1ZShwYXNzd29yZCwgImR1ZGUiKTsKKworICAgICAgICAvLyBNYWtlIHN1cmUgbGFiZWxzIHdlcmUgbm90IHNhbml0aXplZAorICAgICAgICBhc3NlcnRUZXh0RnJvbVJlc291Y2VzKHNhdmVSZXF1ZXN0LnN0cnVjdHVyZSwgSURfVVNFUk5BTUVfTEFCRUwsICJVc2VybmFtZSIsIGZhbHNlLAorICAgICAgICAgICAgICAgICJ1c2VybmFtZV9zdHJpbmciKTsKKyAgICAgICAgYXNzZXJ0VGV4dEZyb21SZXNvdWNlcyhzYXZlUmVxdWVzdC5zdHJ1Y3R1cmUsIElEX1BBU1NXT1JEX0xBQkVMLCAiUGFzc3dvcmQiLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAicGFzc3dvcmRfc3RyaW5nIik7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIGV4dHJhcyB3ZXJlIHBhc3NlZCBiYWNrIG9uIG9uU2F2ZSgpCisgICAgICAgIGFzc2VydFRoYXQoc2F2ZVJlcXVlc3QuZGF0YSkuaXNOb3ROdWxsKCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBleHRyYVZhbHVlID0gc2F2ZVJlcXVlc3QuZGF0YS5nZXRTdHJpbmcoIm51bWJlcnMiKTsKKyAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoImV4dHJhcyBub3QgcGFzc2VkIG9uIHNhdmUiKS50aGF0KGV4dHJhVmFsdWUpLmlzRXF1YWxUbygiNDgxNTE2MjM0MiIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0x1aG5DaGVja3N1bVZhbGlkYXRvclRlc3QuamF2YSBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL0x1aG5DaGVja3N1bVZhbGlkYXRvclRlc3QuamF2YQppbmRleCAwOTYwMGE4Li45NzU5NjhmIDEwMDY0NAotLS0gYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9MdWhuQ2hlY2tzdW1WYWxpZGF0b3JUZXN0LmphdmEKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvTHVobkNoZWNrc3VtVmFsaWRhdG9yVGVzdC5qYXZhCkBAIC0yMiwxNSArMjIsMTggQEAKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by53aGVuOwogaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnRUaHJvd3M7CiAKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CiBpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLmF1dG9maWxsLkx1aG5DaGVja3N1bVZhbGlkYXRvcjsKIGltcG9ydCBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuVmFsdWVGaW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmF1dG9maWxsLkF1dG9maWxsSWQ7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCiBAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQorQEFwcE1vZGVGdWxsIC8vIFVuaXQgdGVzdAogcHVibGljIGNsYXNzIEx1aG5DaGVja3N1bVZhbGlkYXRvclRlc3QgewogCiAgICAgQFRlc3QKZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL011bHRpV2luZG93RW1wdHlBY3Rpdml0eS5qYXZhIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvTXVsdGlXaW5kb3dFbXB0eUFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZjZDA2YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL011bHRpV2luZG93RW1wdHlBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworLyoqCisgKiBFbXB0eSBhY3Rpdml0eSB0aGF0IGFsbG93cyB0byBiZSBwdXQgaW4gZGlmZmVyZW50IHNwbGl0IHdpbmRvdy4KKyAqLworcHVibGljIGNsYXNzIE11bHRpV2luZG93RW1wdHlBY3Rpdml0eSBleHRlbmRzIEVtcHR5QWN0aXZpdHkgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgTXVsdGlXaW5kb3dFbXB0eUFjdGl2aXR5IHNMYXN0SW5zdGFuY2U7CisgICAgcHJpdmF0ZSBzdGF0aWMgQ291bnREb3duTGF0Y2ggc0xhc3RJbnN0YW5jZUxhdGNoOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25TdGFydCgpIHsKKyAgICAgICAgc3VwZXIub25TdGFydCgpOworICAgICAgICBzTGFzdEluc3RhbmNlID0gdGhpczsKKyAgICAgICAgaWYgKHNMYXN0SW5zdGFuY2VMYXRjaCAhPSBudWxsKSB7CisgICAgICAgICAgICBzTGFzdEluc3RhbmNlTGF0Y2guY291bnREb3duKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbldpbmRvd0ZvY3VzQ2hhbmdlZChib29sZWFuIGhhc0ZvY3VzKSB7CisgICAgICAgIGlmIChoYXNGb2N1cykgeworICAgICAgICAgICAgaWYgKHNMYXN0SW5zdGFuY2VMYXRjaCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc0xhc3RJbnN0YW5jZUxhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGV4cGVjdE5ld0luc3RhbmNlKGJvb2xlYW4gd2FpdFdpbmRvd0ZvY3VzKSB7CisgICAgICAgIHNMYXN0SW5zdGFuY2VMYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCh3YWl0V2luZG93Rm9jdXMgPyAyIDogMSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBNdWx0aVdpbmRvd0VtcHR5QWN0aXZpdHkgd2FpdE5ld0luc3RhbmNlKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgc0xhc3RJbnN0YW5jZUxhdGNoLmF3YWl0KFRpbWVvdXRzLkFDVElWSVRZX1JFU1VSUkVDVElPTi5nZXRNYXhWYWx1ZSgpLAorICAgICAgICAgICAgICAgIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgIHNMYXN0SW5zdGFuY2VMYXRjaCA9IG51bGw7CisgICAgICAgIHJldHVybiBzTGFzdEluc3RhbmNlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL011bHRpV2luZG93TG9naW5BY3Rpdml0eS5qYXZhIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvTXVsdGlXaW5kb3dMb2dpbkFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBiMzEwOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL011bHRpV2luZG93TG9naW5BY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworLyoqCisgKiBBY3Rpdml0eSB0aGF0IGFsbG93cyBjYXB0dXJlIHJlY3JlYXRlZCBpbnN0YW5jZSBmb3IgdGVzdGluZyBtdWx0aSB3aW5kb3cgc2NlbmFyaW9zLgorICovCitwdWJsaWMgY2xhc3MgTXVsdGlXaW5kb3dMb2dpbkFjdGl2aXR5IGV4dGVuZHMgTG9naW5BY3Rpdml0eSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBNdWx0aVdpbmRvd0xvZ2luQWN0aXZpdHkgc0xhc3RJbnN0YW5jZTsKKyAgICBwcml2YXRlIHN0YXRpYyBDb3VudERvd25MYXRjaCBzTGFzdEluc3RhbmNlTGF0Y2g7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblN0YXJ0KCkgeworICAgICAgICBzdXBlci5vblN0YXJ0KCk7CisgICAgICAgIHNMYXN0SW5zdGFuY2UgPSB0aGlzOworICAgICAgICBpZiAoc0xhc3RJbnN0YW5jZUxhdGNoICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNMYXN0SW5zdGFuY2VMYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uV2luZG93Rm9jdXNDaGFuZ2VkKGJvb2xlYW4gaGFzRm9jdXMpIHsKKyAgICAgICAgaWYgKGhhc0ZvY3VzKSB7CisgICAgICAgICAgICBpZiAoc0xhc3RJbnN0YW5jZUxhdGNoICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzTGFzdEluc3RhbmNlTGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZXhwZWN0TmV3SW5zdGFuY2UoYm9vbGVhbiB3YWl0V2luZG93Rm9jdXMpIHsKKyAgICAgICAgc0xhc3RJbnN0YW5jZUxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKHdhaXRXaW5kb3dGb2N1cyA/IDIgOiAxKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE11bHRpV2luZG93TG9naW5BY3Rpdml0eSB3YWl0TmV3SW5zdGFuY2UoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBzTGFzdEluc3RhbmNlTGF0Y2guYXdhaXQoVGltZW91dHMuQUNUSVZJVFlfUkVTVVJSRUNUSU9OLmdldE1heFZhbHVlKCksCisgICAgICAgICAgICAgICAgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgc0xhc3RJbnN0YW5jZUxhdGNoID0gbnVsbDsKKyAgICAgICAgcmV0dXJuIHNMYXN0SW5zdGFuY2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvTXVsdGlXaW5kb3dMb2dpbkFjdGl2aXR5VGVzdC5qYXZhIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvTXVsdGlXaW5kb3dMb2dpbkFjdGl2aXR5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYTk0ZWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9NdWx0aVdpbmRvd0xvZ2luQWN0aXZpdHlUZXN0LmphdmEKQEAgLTAsMCArMSwxNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHM7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyLlNQTElUX1NDUkVFTl9DUkVBVEVfTU9ERV9UT1BfT1JfTEVGVDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5JRF9QQVNTV09SRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5JRF9VU0VSTkFNRTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLmNvbW1vbi5TaGVsbEhlbHBlci5ydW5TaGVsbENvbW1hbmQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5jb21tb24uU2hlbGxIZWxwZXIudGFwOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLnRydXRoLlRydXRoLmFzc2VydFRoYXQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc3VtZS5hc3N1bWVUcnVlOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVvdXRFeGNlcHRpb247CisKK0BBcHBNb2RlRnVsbCAvLyBUaGlzIHRlc3QgcmVxdWlyZXMgYW5kcm9pZC5wZXJtaXNzaW9uLk1BTkFHRV9BQ1RJVklUWV9TVEFDS1MKK3B1YmxpYyBjbGFzcyBNdWx0aVdpbmRvd0xvZ2luQWN0aXZpdHlUZXN0IGV4dGVuZHMgQXV0b0ZpbGxTZXJ2aWNlVGVzdENhc2UgeworCisgICAgQFJ1bGUKKyAgICBwdWJsaWMgZmluYWwgQXV0b2ZpbGxBY3Rpdml0eVRlc3RSdWxlPE11bHRpV2luZG93TG9naW5BY3Rpdml0eT4gbUFjdGl2aXR5UnVsZSA9CisgICAgICAgICAgICBuZXcgQXV0b2ZpbGxBY3Rpdml0eVRlc3RSdWxlPE11bHRpV2luZG93TG9naW5BY3Rpdml0eT4oTXVsdGlXaW5kb3dMb2dpbkFjdGl2aXR5LmNsYXNzKTsKKworICAgIHByaXZhdGUgTG9naW5BY3Rpdml0eSBtQWN0aXZpdHk7CisgICAgcHJvdGVjdGVkIEFjdGl2aXR5TWFuYWdlciBtQW07CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0QWN0aXZpdHkoKSB7CisgICAgICAgIG1BY3Rpdml0eSA9IG1BY3Rpdml0eVJ1bGUuZ2V0QWN0aXZpdHkoKTsKKyAgICB9CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0dXAoKSB7CisgICAgICAgIGFzc3VtZVRydWUoIlNraXBwaW5nIHRlc3Q6IG5vIHNwbGl0IG11bHRpLXdpbmRvdyBzdXBwb3J0IiwKKyAgICAgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXIuc3VwcG9ydHNTcGxpdFNjcmVlbk11bHRpV2luZG93KG1Db250ZXh0KSk7CisgICAgICAgIG1BbSA9IG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQWN0aXZpdHlNYW5hZ2VyLmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUb3VjaCBhIHZpZXcgYW5kIGV4ZXBjdCBhdXRvZmlsbCB3aW5kb3cgY2hhbmdlCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgdGFwVmlld0FuZEV4cGVjdFdpbmRvd0V2ZW50KFZpZXcgdmlldykgdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24geworICAgICAgICBtVWlCb3Qud2FpdEZvcldpbmRvd0NoYW5nZSgoKSAtPiB0YXAodmlldyksIFRpbWVvdXRzLlVJX1RJTUVPVVQuZ2V0TWF4VmFsdWUoKSk7CisgICAgfQorCisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHJ1bkFtU3RhcnRBY3Rpdml0eShDbGFzczw/IGV4dGVuZHMgQWN0aXZpdHk+IGFjdGl2aXR5Q2xhc3MsIGludCBmbGFncykgeworICAgICAgICByZXR1cm4gcnVuQW1TdGFydEFjdGl2aXR5KGFjdGl2aXR5Q2xhc3MuZ2V0TmFtZSgpLCBmbGFncyk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFN0cmluZyBydW5BbVN0YXJ0QWN0aXZpdHkoU3RyaW5nIGFjdGl2aXR5LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgcmV0dXJuIHJ1blNoZWxsQ29tbWFuZCgiYW0gc3RhcnQgJXMvJXMgLWYgMHglcyIsIG1QYWNrYWdlTmFtZSwgYWN0aXZpdHksCisgICAgICAgICAgICAgICAgSW50ZWdlci50b0hleFN0cmluZyhmbGFncykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFB1dCBhY3Rpdml0eTEgaW4gVE9QLCB3aWxsIGJlIGZvbGxvd2VkIGJ5IGFtU3RhcnRBY3Rpdml0eSgpCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc3BsaXRXaW5kb3coQWN0aXZpdHkgYWN0aXZpdHkpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtQW0uc2V0VGFza1dpbmRvd2luZ01vZGVTcGxpdFNjcmVlblByaW1hcnkoYWN0aXZpdHkuZ2V0VGFza0lkKCksCisgICAgICAgICAgICAgICAgU1BMSVRfU0NSRUVOX0NSRUFURV9NT0RFX1RPUF9PUl9MRUZULCB0cnVlLCBmYWxzZSwgbnVsbCwgdHJ1ZSk7CisgICAgICAgIG1VaUJvdC53YWl0Rm9yV2luZG93U3BsaXQoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhbVN0YXJ0QWN0aXZpdHkoQ2xhc3M8PyBleHRlbmRzIEFjdGl2aXR5PiBhY3Rpdml0eTIpIHsKKyAgICAgICAgLy8gaXQgZG9lc24ndCB3b3JrIHVzaW5nIHN0YXJ0QWN0aXZpdHkoaW50ZW50KSwgaGF2ZSB0byBnbyB0aHJvdWdoIHNoZWxsIGNvbW1hbmQuCisgICAgICAgIHJ1bkFtU3RhcnRBY3Rpdml0eShhY3Rpdml0eTIsCisgICAgICAgICAgICAgICAgSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0sgfCBJbnRlbnQuRkxBR19BQ1RJVklUWV9MQVVOQ0hfQURKQUNFTlQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNwbGl0V2luZG93KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKKworICAgICAgICAvLyBTZXQgZXhwZWN0YXRpb25zLgorICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkNhbm5lZERhdGFzZXQuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1VTRVJOQU1FLCAiZHVkZSIpCisgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1BBU1NXT1JELCAic3dlZXQiKQorICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJUaGUgRHVkZSIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgLy8gVHJpZ2dlciBhdXRvLWZpbGwuCisgICAgICAgIG1BY3Rpdml0eS5vblVzZXJuYW1lKFZpZXc6OnJlcXVlc3RGb2N1cyk7CisgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlRoZSBEdWRlIik7CisKKyAgICAgICAgLy8gc3BsaXQgd2luZG93IGFuZCBsYXVuY2ggRW1wdHlBY3Rpdml0eSwgbm90ZSB0aGF0IExvZ2luQWN0aXZpdHkgd2lsbCBiZSByZWNyZWF0ZWQuCisgICAgICAgIE11bHRpV2luZG93TG9naW5BY3Rpdml0eS5leHBlY3ROZXdJbnN0YW5jZShmYWxzZSk7CisgICAgICAgIE11bHRpV2luZG93RW1wdHlBY3Rpdml0eS5leHBlY3ROZXdJbnN0YW5jZSh0cnVlKTsKKworICAgICAgICBzcGxpdFdpbmRvdyhtQWN0aXZpdHkpOworICAgICAgICBNdWx0aVdpbmRvd0xvZ2luQWN0aXZpdHkgbG9naW5BY3Rpdml0eSA9IE11bHRpV2luZG93TG9naW5BY3Rpdml0eS53YWl0TmV3SW5zdGFuY2UoKTsKKworICAgICAgICBhbVN0YXJ0QWN0aXZpdHkoTXVsdGlXaW5kb3dFbXB0eUFjdGl2aXR5LmNsYXNzKTsKKyAgICAgICAgTXVsdGlXaW5kb3dFbXB0eUFjdGl2aXR5IGVtcHR5QWN0aXZpdHkgPSBNdWx0aVdpbmRvd0VtcHR5QWN0aXZpdHkud2FpdE5ld0luc3RhbmNlKCk7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIGJvdGggYWN0aXZpdGllcyBhcmUgc2hvd2luZworICAgICAgICBtVWlCb3QuYXNzZXJ0U2hvd25CeVJlbGF0aXZlSWQoSGVscGVyLklEX1VTRVJOQU1FKTsgIC8vIE11bHRpV2luZG93TG9naW5BY3Rpdml0eQorICAgICAgICBtVWlCb3QuYXNzZXJ0U2hvd25CeVJlbGF0aXZlSWQoTXVsdGlXaW5kb3dFbXB0eUFjdGl2aXR5LklEX0VNUFRZKTsKKworICAgICAgICAvLyBObyBkYXRhc2V0IGFzIExvZ2luQWN0aXZpdHkgbG9zZXMgd2luZG93IGZvY3VzCisgICAgICAgIG1VaUJvdC5hc3NlcnROb0RhdGFzZXRzKCk7CisgICAgICAgIC8vIEVtcHR5QWN0aXZpdHkgd2lsbCBoYXZlIHdpbmRvdyBmb2N1cworICAgICAgICBhc3NlcnRUaGF0KGVtcHR5QWN0aXZpdHkuaGFzV2luZG93Rm9jdXMoKSkuaXNUcnVlKCk7CisgICAgICAgIC8vIExvZ2luQWN0aXZpdHkgdXNlcm5hbWUgZmllbGQgaXMgc3RpbGwgZm9jdXNlZCBidXQgd2luZG93IGhhcyBubyBmb2N1cworICAgICAgICBhc3NlcnRUaGF0KGxvZ2luQWN0aXZpdHkuZ2V0VXNlcm5hbWUoKS5oYXNGb2N1cygpKS5pc1RydWUoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChsb2dpbkFjdGl2aXR5Lmhhc1dpbmRvd0ZvY3VzKCkpLmlzRmFsc2UoKTsKKworICAgICAgICAvLyBNYWtlIExvZ2luQWN0aXZpdHkgdG8gcmVnYWluIHdpbmRvdyBmb2N1cyBhbmQgZmlsbCB1aSBpcyBleHBlY3RlZCB0byBzaG93CisgICAgICAgIHRhcFZpZXdBbmRFeHBlY3RXaW5kb3dFdmVudChsb2dpbkFjdGl2aXR5LmdldFVzZXJuYW1lTGFiZWwoKSk7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cygiVGhlIER1ZGUiKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbXB0eUFjdGl2aXR5Lmhhc1dpbmRvd0ZvY3VzKCkpLmlzRmFsc2UoKTsKKworICAgICAgICAvLyBUYXAgb24gRW1wdHlBY3Rpdml0eSBhbmQgZmlsbCB1aSBpcyBnb25lLgorICAgICAgICB0YXBWaWV3QW5kRXhwZWN0V2luZG93RXZlbnQoZW1wdHlBY3Rpdml0eS5nZXRFbXB0eVZpZXcoKSk7CisgICAgICAgIG1VaUJvdC5hc3NlcnROb0RhdGFzZXRzKCk7CisgICAgICAgIGFzc2VydFRoYXQoZW1wdHlBY3Rpdml0eS5oYXNXaW5kb3dGb2N1cygpKS5pc1RydWUoKTsKKyAgICAgICAgLy8gTG9naW5BY3Rpdml0eSB1c2VybmFtZSBmaWVsZCBpcyBzdGlsbCBmb2N1c2VkIGJ1dCB3aW5kb3cgaGFzIG5vIGZvY3VzCisgICAgICAgIGFzc2VydFRoYXQobG9naW5BY3Rpdml0eS5nZXRVc2VybmFtZSgpLmhhc0ZvY3VzKCkpLmlzVHJ1ZSgpOworICAgICAgICBhc3NlcnRUaGF0KGxvZ2luQWN0aXZpdHkuaGFzV2luZG93Rm9jdXMoKSkuaXNGYWxzZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL011bHRpcGxlRXhjZXB0aW9uc0NhdGNoZXIuamF2YSBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL011bHRpcGxlRXhjZXB0aW9uc0NhdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJjM2JjYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9NdWx0aXBsZUV4Y2VwdGlvbnNDYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHM7Ci0KLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk51bGxhYmxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBIZWxwZXIgdXNlZCB0byBjYXRjaCBtdWx0aXBsZSBleGNlcHRpb25zIHRoYXQgbWlnaHQgaGF2ZSBoYXBwZW5lZCBpbiBhIHRlc3QgY2FzZS4KLSAqLwotLy8gVE9ETzogbW92ZSB0byBjb21tb24gQ1RTIGNvZGUgKGFuZCBhZGQgdGVzdCBjYXNlcyB0byBpdCkKLXB1YmxpYyBmaW5hbCBjbGFzcyBNdWx0aXBsZUV4Y2VwdGlvbnNDYXRjaGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTXVsdGlwbGVFeGNlcHRpb25zQ2F0Y2hlciI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8VGhyb3dhYmxlPiBtVGhyb3dhYmxlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotCi0gICAgLyoqCi0gICAgICogUnVucyB7QGNvZGUgcn0gcG9zdHBvbmluZyBhbnkgdGhyb3duIGV4Y2VwdGlvbiB0byB7QGxpbmsgI3Rocm93SWZBbnkoKX0uCi0gICAgICovCi0gICAgcHVibGljIE11bHRpcGxlRXhjZXB0aW9uc0NhdGNoZXIgcnVuKEBOb25OdWxsIFJ1bm5hYmxlIHIpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHIucnVuKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICBtVGhyb3dhYmxlcy5hZGQodCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhbiBleGNlcHRpb24gLSBpZiBpdCdzIG5vdCB7QGNvZGUgbnVsbH0gdG8gdGhlIGV4Y2VwdGlvbnMgdGhyb3duIGJ5Ci0gICAgICoge0BsaW5rICN0aHJvd0lmQW55KCl9LgotICAgICAqLwotICAgIHB1YmxpYyBNdWx0aXBsZUV4Y2VwdGlvbnNDYXRjaGVyIGFkZChATnVsbGFibGUgVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgaWYgKHQgIT0gbnVsbCkgewotICAgICAgICAgICAgbVRocm93YWJsZXMuYWRkKHQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRocm93cyBvbmUgZXhjZXB0aW9uIG1lcmdpbmcgYWxsIGV4Y2VwdGlvbnMgdGhyb3duIG9yIGFkZGVkIHNvIGZhciwgaWYgYW55LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRocm93SWZBbnkoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgaWYgKG1UaHJvd2FibGVzLmlzRW1wdHkoKSkgcmV0dXJuOwotCi0gICAgICAgIGZpbmFsIGludCBudW1iZXJFeGNlcHRpb25zID0gbVRocm93YWJsZXMuc2l6ZSgpOwotICAgICAgICBpZiAobnVtYmVyRXhjZXB0aW9ucyA9PSAxKSB7Ci0gICAgICAgICAgICB0aHJvdyBtVGhyb3dhYmxlcy5nZXQoMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgbXNnID0gIkQnT0ghIjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRyeSAoU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOyBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihzdykpIHsKLSAgICAgICAgICAgICAgICBzdy53cml0ZSgiQ2F1Z2h0ICIgKyBudW1iZXJFeGNlcHRpb25zICsgIiBleGNlcHRpb25zXG4iKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bWJlckV4Y2VwdGlvbnM7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBzdy53cml0ZSgiXG4tLS0tIEJlZ2luIG9mIGV4Y2VwdGlvbiAjIiArIChpICsgMSkgKyAiIC0tLS1cbiIpOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBUaHJvd2FibGUgZXhjZXB0aW9uID0gbVRocm93YWJsZXMuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICBleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKHB3KTsKLSAgICAgICAgICAgICAgICAgICAgc3cud3JpdGUoIi0tLS0gRW5kIG9mIGV4Y2VwdGlvbiAjIiArIChpICsgMSkgKyAiIC0tLS1cblxuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1zZyA9IHN3LnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGlnbm9yZSBjbG9zZSgpIGVycm9ycyAtIHNob3VsZCBub3QgaGFwcGVuLi4uCi0gICAgICAgICAgICBMb2cuZShUQUcsICJFeGNlcHRpb24gY2xvc2luZyBTdHJpbmdXcml0ZXI6ICIgKyBlKTsKLSAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IobXNnKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9NdWx0aXBsZUZyYWdtZW50TG9naW5UZXN0LmphdmEgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9NdWx0aXBsZUZyYWdtZW50TG9naW5UZXN0LmphdmEKaW5kZXggM2UzMGI5Yi4uOGRhNGFkZCAxMDA2NDQKLS0tIGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvTXVsdGlwbGVGcmFnbWVudExvZ2luVGVzdC5qYXZhCisrKyBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL011bHRpcGxlRnJhZ21lbnRMb2dpblRlc3QuamF2YQpAQCAtMTgsOCArMTgsNiBAQAogCiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5DYW5uZWRGaWxsUmVzcG9uc2UuTk9fUkVTUE9OU0U7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5GcmFnbWVudENvbnRhaW5lckFjdGl2aXR5LkZSQUdNRU5UX1RBRzsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5GSUxMX1RJTUVPVVRfTVM7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5IZWxwZXIuZXZlbnR1YWxseTsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5maW5kTm9kZUJ5UmVzb3VyY2VJZDsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2aWNlLmF1dG9maWxsLlNhdmVJbmZvLlNBVkVfREFUQV9UWVBFX0dFTkVSSUM7CiAKQEAgLTcwLDE4ICs2OCwxMiBAQAogICAgICAgICAgICAgICAgIG5ldyBJbnN0cnVtZW50ZWRBdXRvRmlsbFNlcnZpY2UuRmlsbFJlcXVlc3RbMV07CiAKICAgICAgICAgLy8gVHJpZ2dlciBhdXRvZmlsbAotICAgICAgICBldmVudHVhbGx5KCgpIC0+IHsKLSAgICAgICAgICAgIG1BY3Rpdml0eS5zeW5jUnVuT25VaVRocmVhZCgoKSAtPiB7Ci0gICAgICAgICAgICAgICAgbUVkaXRUZXh0Mi5yZXF1ZXN0Rm9jdXMoKTsKLSAgICAgICAgICAgICAgICBtRWRpdFRleHQxLnJlcXVlc3RGb2N1cygpOwotICAgICAgICAgICAgfSk7CisgICAgICAgIG1BY3Rpdml0eS5zeW5jUnVuT25VaVRocmVhZCgoKSAtPiB7CisgICAgICAgICAgICBtRWRpdFRleHQyLnJlcXVlc3RGb2N1cygpOworICAgICAgICAgICAgbUVkaXRUZXh0MS5yZXF1ZXN0Rm9jdXMoKTsKKyAgICAgICAgfSk7CiAKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZmlsbFJlcXVlc3RbMF0gPSBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSwgKGludCkgKEZJTExfVElNRU9VVF9NUyAqIDIpKTsKKyAgICAgICAgZmlsbFJlcXVlc3RbMF0gPSBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKIAogICAgICAgICBhc3NlcnRUaGF0KGZpbGxSZXF1ZXN0WzBdLmRhdGEpLmlzTnVsbCgpOwogCkBAIC05NCw4ICs4Niw4IEBACiAgICAgICAgIGFzc2VydFRoYXQoZmluZE5vZGVCeVJlc291cmNlSWQoc3RydWN0dXJlLCAiZWRpdFRleHQ1IikpLmlzTnVsbCgpOwogCiAgICAgICAgIC8vIFdhaXQgdW50aWwgYXV0b2ZpbGwgaGFzIGJlZW4gYXBwbGllZAotICAgICAgICBzVWlCb3Quc2VsZWN0RGF0YXNldCgiZGF0YXNldDEiKTsKLSAgICAgICAgc1VpQm90LmFzc2VydFNob3duQnlUZXh0KCJlZGl0VGV4dDEtYXV0b2ZpbGxlZCIpOworICAgICAgICBtVWlCb3Quc2VsZWN0RGF0YXNldCgiZGF0YXNldDEiKTsKKyAgICAgICAgbVVpQm90LmFzc2VydFNob3duQnlUZXh0KCJlZGl0VGV4dDEtYXV0b2ZpbGxlZCIpOwogCiAgICAgICAgIC8vIE1hbnVhbGx5IGZpbGwgdmlldwogICAgICAgICBtQWN0aXZpdHkuc3luY1J1bk9uVWlUaHJlYWQoKCkgLT4gbUVkaXRUZXh0Mi5zZXRUZXh0KCJlZGl0VGV4dDItbWFudWFsbHktZmlsbGVkIikpOwpAQCAtMTUzLDE2ICsxNDUsMTYgQEAKICAgICAgICAgYXNzZXJ0VGhhdChmaW5kTm9kZUJ5UmVzb3VyY2VJZChzdHJ1Y3R1cmUyLCAiZWRpdFRleHQ1IikpLmlzTm90TnVsbCgpOwogCiAgICAgICAgIC8vIFdhaXQgdW50aWwgYXV0b2ZpbGwgaGFzIGJlZW4gYXBwbGllZAotICAgICAgICBzVWlCb3Quc2VsZWN0RGF0YXNldCgiZGF0YXNldDIiKTsKLSAgICAgICAgc1VpQm90LmFzc2VydFNob3duQnlUZXh0KCJlZGl0VGV4dDMtYXV0b2ZpbGxlZCIpOwotICAgICAgICBzVWlCb3QuYXNzZXJ0U2hvd25CeVRleHQoImVkaXRUZXh0NC1hdXRvZmlsbGVkIik7CisgICAgICAgIG1VaUJvdC5zZWxlY3REYXRhc2V0KCJkYXRhc2V0MiIpOworICAgICAgICBtVWlCb3QuYXNzZXJ0U2hvd25CeVRleHQoImVkaXRUZXh0My1hdXRvZmlsbGVkIik7CisgICAgICAgIG1VaUJvdC5hc3NlcnRTaG93bkJ5VGV4dCgiZWRpdFRleHQ0LWF1dG9maWxsZWQiKTsKIAogICAgICAgICAvLyBNYW51YWxseSBmaWxsIHZpZXcKICAgICAgICAgbUFjdGl2aXR5LnN5bmNSdW5PblVpVGhyZWFkKCgpIC0+IGVkaXRUZXh0NS5zZXRUZXh0KCJlZGl0VGV4dDUtbWFudWFsbHktZmlsbGVkIikpOwogCiAgICAgICAgIC8vIEZpbmlzaCBhY3Rpdml0eSBhbmQgc2F2ZSBkYXRhCiAgICAgICAgIG1BY3Rpdml0eS5maW5pc2goKTsKLSAgICAgICAgc1VpQm90LnNhdmVGb3JBdXRvZmlsbCh0cnVlLCBTQVZFX0RBVEFfVFlQRV9HRU5FUklDKTsKKyAgICAgICAgbVVpQm90LnNhdmVGb3JBdXRvZmlsbCh0cnVlLCBTQVZFX0RBVEFfVFlQRV9HRU5FUklDKTsKIAogICAgICAgICAvLyBUaGUgc2F2ZVJlcXVlc3Qgc2hvdWxkIGhhdmUgYSBmaWxsQ29udGV4dCBmb3IgZWFjaCBwYXJ0aXRpb24gd2l0aCBhbGwgdGhlIGRhdGEKICAgICAgICAgSW5zdHJ1bWVudGVkQXV0b0ZpbGxTZXJ2aWNlLlNhdmVSZXF1ZXN0IHNhdmVSZXF1ZXN0ID0gc1JlcGxpZXIuZ2V0TmV4dFNhdmVSZXF1ZXN0KCk7CkBAIC0yMjksNyArMjIxLDcgQEAKIAogICAgICAgICAvLyBDaGVjayBVSSBpcyBzaG93biwgYnV0IGRvbid0IHNlbGVjdCBpdC4KICAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnREYXRhc2V0cygiZGF0YXNldDEiKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJkYXRhc2V0MSIpOwogCiAgICAgICAgIC8vIFN3aXRjaCBmcmFnbWVudHMKICAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UoTk9fUkVTUE9OU0UpOwpAQCAtMjM5LDcgKzIzMSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBGUkFHTUVOVF9UQUcpLmNvbW1pdE5vdygpKTsKICAgICAgICAgLy8gTWFrZSBzdXJlIFVJIGlzIGdvbmUuCiAgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwotICAgICAgICBzVWlCb3QuYXNzZXJ0Tm9EYXRhc2V0cygpOworICAgICAgICBtVWlCb3QuYXNzZXJ0Tm9EYXRhc2V0cygpOwogICAgIH0KIAogICAgIC8vIFRPRE86IGFkZCBzaW1pbGFyIHRlc3RzIGZvciBmcmFnbWVudCB3aXRoIHZpcnR1YWwgdmlldwpkaWZmIC0tZ2l0IGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvTXVsdGlwbGVUaW1lc1JhZGlvR3JvdXBMaXN0ZW5lci5qYXZhIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvTXVsdGlwbGVUaW1lc1JhZGlvR3JvdXBMaXN0ZW5lci5qYXZhCmluZGV4IGIyNjRhNDYuLjVhZjI3NjIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL011bHRpcGxlVGltZXNSYWRpb0dyb3VwTGlzdGVuZXIuamF2YQorKysgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9NdWx0aXBsZVRpbWVzUmFkaW9Hcm91cExpc3RlbmVyLmphdmEKQEAgLTE2LDcgKzE2LDcgQEAKIAogcGFja2FnZSBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHM7CiAKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5GSUxMX1RJTUVPVVRfTVM7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5UaW1lb3V0cy5GSUxMX1RJTUVPVVQ7CiAKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24udHJ1dGguVHJ1dGguYXNzZXJ0V2l0aE1lc3NhZ2U7CiAKQEAgLTI2LDcgKzI2LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKIAogLyoqCi0gKiBDdXN0b20ge0BsaW5rIFJhZGlvR3JvdXAuT25DaGVja2VkQ2hhbmdlTGlzdGVuZXJ9IHVzZWQgdG8gYXNzZXJ0IGFuCisgKiBDdXN0b20ge0BsaW5rIGFuZHJvaWQud2lkZ2V0LlJhZGlvR3JvdXAuT25DaGVja2VkQ2hhbmdlTGlzdGVuZXJ9IHVzZWQgdG8gYXNzZXJ0IGFuCiAgKiB7QGxpbmsgUmFkaW9Hcm91cH0gd2FzIGF1dG8tZmlsbGVkIHByb3Blcmx5LgogICovCiBmaW5hbCBjbGFzcyBNdWx0aXBsZVRpbWVzUmFkaW9Hcm91cExpc3RlbmVyIGltcGxlbWVudHMgUmFkaW9Hcm91cC5PbkNoZWNrZWRDaGFuZ2VMaXN0ZW5lciB7CkBAIC00OSw4ICs0OSw4IEBACiAgICAgfQogCiAgICAgdm9pZCBhc3NlcnRBdXRvRmlsbGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gc2V0ID0gbUxhdGNoLmF3YWl0KEZJTExfVElNRU9VVF9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKLSAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoIlRpbWVvdXQgKCVzIG1zKSBvbiBSYWRpb0dyb3VwICVzIiwgRklMTF9USU1FT1VUX01TLCBtTmFtZSkKKyAgICAgICAgZmluYWwgYm9vbGVhbiBzZXQgPSBtTGF0Y2guYXdhaXQoRklMTF9USU1FT1VULm1zKCksIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJUaW1lb3V0ICglcyBtcykgb24gUmFkaW9Hcm91cCAlcyIsIEZJTExfVElNRU9VVC5tcygpLCBtTmFtZSkKICAgICAgICAgICAgIC50aGF0KHNldCkuaXNUcnVlKCk7CiAgICAgICAgIGZpbmFsIGludCBhY3R1YWwgPSBtUmFkaW9Hcm91cC5nZXRBdXRvZmlsbFZhbHVlKCkuZ2V0TGlzdFZhbHVlKCk7CiAgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJXcm9uZyBhdXRvLWZpbGwgdmFsdWUgb24gUmFkaW9Hcm91cCAlcyIsIG1OYW1lKQpkaWZmIC0tZ2l0IGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvTXVsdGlwbGVUaW1lc1RleHRXYXRjaGVyLmphdmEgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9NdWx0aXBsZVRpbWVzVGV4dFdhdGNoZXIuamF2YQppbmRleCBjOTI4ZjMxLi4xYjkzZjAwIDEwMDY0NAotLS0gYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9NdWx0aXBsZVRpbWVzVGV4dFdhdGNoZXIuamF2YQorKysgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9NdWx0aXBsZVRpbWVzVGV4dFdhdGNoZXIuamF2YQpAQCAtMTYsNyArMTYsNyBAQAogCiBwYWNrYWdlIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0czsKIAotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSGVscGVyLkZJTExfVElNRU9VVF9NUzsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLlRpbWVvdXRzLkZJTExfVElNRU9VVDsKIAogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi50cnV0aC5UcnV0aC5hc3NlcnRXaXRoTWVzc2FnZTsKIApAQCAtNjIsOSArNjIsMTEgQEAKICAgICB9CiAKICAgICB2b2lkIGFzc2VydEF1dG9GaWxsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBzZXQgPSBtTGF0Y2guYXdhaXQoRklMTF9USU1FT1VUX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOwotICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiVGltZW91dCAoJXMgbXMpIG9uIEVkaXRUZXh0ICVzIiwgRklMTF9USU1FT1VUX01TLCBtTmFtZSkKLSAgICAgICAgICAgICAgICAudGhhdChzZXQpLmlzVHJ1ZSgpOworICAgICAgICBmaW5hbCBib29sZWFuIHNldCA9IG1MYXRjaC5hd2FpdChGSUxMX1RJTUVPVVQubXMoKSwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgaWYgKCFzZXQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSZXRyeWFibGVFeGNlcHRpb24oRklMTF9USU1FT1VULCAiVGltZW91dCAoJXMgbXMpIG9uIEVkaXRUZXh0ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgRklMTF9USU1FT1VULm1zKCksIG1OYW1lKTsKKyAgICAgICAgfQogICAgICAgICBmaW5hbCBTdHJpbmcgYWN0dWFsID0gbUVkaXRUZXh0LmdldFRleHQoKS50b1N0cmluZygpOwogICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiV3JvbmcgYXV0by1maWxsIHZhbHVlIG9uIEVkaXRUZXh0ICVzIiwgbU5hbWUpCiAgICAgICAgICAgICAgICAgLnRoYXQoYWN0dWFsKS5pc0VxdWFsVG8obUV4cGVjdGVkLnRvU3RyaW5nKCkpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvTXVsdGlwbGVUaW1lc1RpbWVMaXN0ZW5lci5qYXZhIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvTXVsdGlwbGVUaW1lc1RpbWVMaXN0ZW5lci5qYXZhCmluZGV4IDFhZWQxMTkuLjI1MTlhZWMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL011bHRpcGxlVGltZXNUaW1lTGlzdGVuZXIuamF2YQorKysgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9NdWx0aXBsZVRpbWVzVGltZUxpc3RlbmVyLmphdmEKQEAgLTE2LDcgKzE2LDcgQEAKIAogcGFja2FnZSBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHM7CiAKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5GSUxMX1RJTUVPVVRfTVM7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5UaW1lb3V0cy5GSUxMX1RJTUVPVVQ7CiAKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24udHJ1dGguVHJ1dGguYXNzZXJ0V2l0aE1lc3NhZ2U7CiAKQEAgLTUwLDggKzUwLDggQEAKICAgICB9CiAKICAgICB2b2lkIGFzc2VydEF1dG9GaWxsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBzZXQgPSBsYXRjaC5hd2FpdChGSUxMX1RJTUVPVVRfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7Ci0gICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJUaW1lb3V0ICglcyBtcykgb24gVGltZVBpY2tlciAlcyIsIEZJTExfVElNRU9VVF9NUywgbmFtZSkKKyAgICAgICAgZmluYWwgYm9vbGVhbiBzZXQgPSBsYXRjaC5hd2FpdChGSUxMX1RJTUVPVVQubXMoKSwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoIlRpbWVvdXQgKCVzIG1zKSBvbiBUaW1lUGlja2VyICVzIiwgRklMTF9USU1FT1VULm1zKCksIG5hbWUpCiAgICAgICAgICAgICAgICAgLnRoYXQoc2V0KS5pc1RydWUoKTsKICAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoIldyb25nIGhvdXIgb24gVGltZVBpY2tlciAlcyIsIG5hbWUpCiAgICAgICAgICAgICAgICAgLnRoYXQodGltZVBpY2tlci5nZXRIb3VyKCkpLmlzRXF1YWxUbyhleHBlY3RlZEhvdXIpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvTXV0YWJsZUF1dG9maWxsSWRUZXN0LmphdmEgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9NdXRhYmxlQXV0b2ZpbGxJZFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDQ2ODVkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvTXV0YWJsZUF1dG9maWxsSWRUZXN0LmphdmEKQEAgLTAsMCArMSwzMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0czsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuR3JpZEFjdGl2aXR5LklEX0wxQzE7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5HcmlkQWN0aXZpdHkuSURfTDFDMjsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5hc3NlcnRUZXh0SXNTYW5pdGl6ZWQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5IZWxwZXIuZmluZE5vZGVCeUF1dG9maWxsSWQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmljZS5hdXRvZmlsbC5TYXZlSW5mby5TQVZFX0RBVEFfVFlQRV9HRU5FUklDOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLnRydXRoLlRydXRoLmFzc2VydFRoYXQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0VGhyb3dzOworCitpbXBvcnQgYW5kcm9pZC5hcHAuYXNzaXN0LkFzc2lzdFN0cnVjdHVyZTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5hc3Npc3QuQXNzaXN0U3RydWN0dXJlLlZpZXdOb2RlOworaW1wb3J0IGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5DYW5uZWRGaWxsUmVzcG9uc2UuQ2FubmVkRGF0YXNldDsKK2ltcG9ydCBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuR3JpZEFjdGl2aXR5LkZpbGxFeHBlY3RhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSW5zdHJ1bWVudGVkQXV0b0ZpbGxTZXJ2aWNlLkZpbGxSZXF1ZXN0OworaW1wb3J0IGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5JbnN0cnVtZW50ZWRBdXRvRmlsbFNlcnZpY2UuU2F2ZVJlcXVlc3Q7CitpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLmF1dG9maWxsLkZpbGxDb250ZXh0OworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLlVpT2JqZWN0MjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5hdXRvZmlsbC5BdXRvZmlsbElkOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkVkaXRUZXh0OworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVvdXRFeGNlcHRpb247CisKKy8qKgorICogVGVzdCBjYXNlcyBmb3IgdGhlIGNhc2VzIHdoZXJlIHRoZSBhdXRvZmlsbCBpZCBvZiBhIHZpZXcgaXMgY2hhbmdlZCBieSB0aGUgYXBwLgorICovCitwdWJsaWMgY2xhc3MgTXV0YWJsZUF1dG9maWxsSWRUZXN0IGV4dGVuZHMgQXV0b0ZpbGxTZXJ2aWNlVGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNdXRhYmxlQXV0b2ZpbGxJZFRlc3QiOworCisgICAgQFJ1bGUKKyAgICBwdWJsaWMgZmluYWwgQXV0b2ZpbGxBY3Rpdml0eVRlc3RSdWxlPEdyaWRBY3Rpdml0eT4gbUFjdGl2aXR5UnVsZSA9CisgICAgICAgICAgICBuZXcgQXV0b2ZpbGxBY3Rpdml0eVRlc3RSdWxlPEdyaWRBY3Rpdml0eT4oR3JpZEFjdGl2aXR5LmNsYXNzKTsKKworICAgIHByaXZhdGUgR3JpZEFjdGl2aXR5IG1BY3Rpdml0eTsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRBY3Rpdml0eSgpIHsKKyAgICAgICAgbUFjdGl2aXR5ID0gbUFjdGl2aXR5UnVsZS5nZXRBY3Rpdml0eSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERhdGFzZXRQaWNrZXJJc05vdFNob3duQWZ0ZXJWaWV3SXNTd2FwcGVkT3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKKworICAgICAgICBmaW5hbCBFZGl0VGV4dCBmaWVsZDEgPSBtQWN0aXZpdHkuZ2V0Q2VsbCgxLCAxKTsKKyAgICAgICAgZmluYWwgQXV0b2ZpbGxJZCBvbGRJZEZpZWxkMSA9IGZpZWxkMS5nZXRBdXRvZmlsbElkKCk7CisgICAgICAgIGZpbmFsIEVkaXRUZXh0IGZpZWxkMiA9IG1BY3Rpdml0eS5nZXRDZWxsKDEsIDIpOworICAgICAgICBmaW5hbCBBdXRvZmlsbElkIGlkRmllbGQyID0gZmllbGQyLmdldEF1dG9maWxsSWQoKTsKKworICAgICAgICAvLyBQcmVwYXJlIHJlc3BvbnNlCisgICAgICAgIGZpbmFsIENhbm5lZEZpbGxSZXNwb25zZSByZXNwb25zZTEgPSBuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5hZGREYXRhc2V0KG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKG9sZElkRmllbGQxLCAibDFjMSIsIGNyZWF0ZVByZXNlbnRhdGlvbigibDFjMSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKGlkRmllbGQyLCAibDFjMiIsIGNyZWF0ZVByZXNlbnRhdGlvbigibDFjMiIpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKHJlc3BvbnNlMSk7CisKKyAgICAgICAgLy8gVHJpZ2dlciBhdXRvZmlsbCBvbiAxc3Qgdmlldy4KKyAgICAgICAgZm9jdXNDZWxsKDEsIDEpOworICAgICAgICBmaW5hbCBGaWxsUmVxdWVzdCBmaWxsUmVxdWVzdDEgPSBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKKyAgICAgICAgZmluYWwgVmlld05vZGUgbm9kZTFSZXF1ZXN0MSA9IGFzc2VydFRleHRJc1Nhbml0aXplZChmaWxsUmVxdWVzdDEuc3RydWN0dXJlLCBJRF9MMUMxKTsKKyAgICAgICAgYXNzZXJ0VGhhdChub2RlMVJlcXVlc3QxLmdldEF1dG9maWxsSWQoKSkuaXNFcXVhbFRvKG9sZElkRmllbGQxKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJsMWMxIik7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIDJuZCBmaWVsZCBzaG93cyBwaWNrZXIKKyAgICAgICAgZm9jdXNDZWxsKDEsIDIpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoImwxYzIiKTsKKworICAgICAgICAvLyBOb3cgY2hhbmdlIGlkIG9mIDFzdCB2aWV3CisgICAgICAgIGZpbmFsIEF1dG9maWxsSWQgbmV3SWRGaWVsZDEgPSBtQWN0aXZpdHkuZ2V0QXV0b2ZpbGxNYW5hZ2VyKCkuZ2V0TmV4dEF1dG9maWxsSWQoKTsKKworICAgICAgICAvLyBUT0RPOiBtb3ZlIHRvIGFuIGF1dG9maWxsIHVuaXQgdGVzdCBjbGFzcyBmb3IgVmlldworICAgICAgICAvLyBNYWtlIHN1cmUgdmlldyBoYXMgdG8gYmUgZGV0YWNoZWQgZmlyc3QKKyAgICAgICAgYXNzZXJ0VGhyb3dzKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbi5jbGFzcywgKCkgLT4gZmllbGQxLnNldEF1dG9maWxsSWQobmV3SWRGaWVsZDEpKTsKKworICAgICAgICAvLyBDaGFuZ2UgaWQKKyAgICAgICAgbUFjdGl2aXR5LnJlbW92ZUNlbGwoMSwgMSk7CisKKyAgICAgICAgLy8gVE9ETzogbW92ZSB0byBhbiBhdXRvZmlsbCB1bml0IHRlc3QgY2xhc3MgZm9yIFZpZXcKKyAgICAgICAgLy8gQWxzbyBhc3NlcnQgaXQgZG9lcyBub3QgYWNjZXB0IHZpcnR1YWwgaWRzCisgICAgICAgIGFzc2VydFRocm93cyhJbGxlZ2FsU3RhdGVFeGNlcHRpb24uY2xhc3MsCisgICAgICAgICAgICAgICAgKCkgLT4gZmllbGQxLnNldEF1dG9maWxsSWQobmV3IEF1dG9maWxsSWQobmV3SWRGaWVsZDEsIDQyKSkpOworCisgICAgICAgIGZpZWxkMS5zZXRBdXRvZmlsbElkKG5ld0lkRmllbGQxKTsKKyAgICAgICAgYXNzZXJ0VGhhdChmaWVsZDEuZ2V0QXV0b2ZpbGxJZCgpKS5pc0VxdWFsVG8obmV3SWRGaWVsZDEpOworCisgICAgICAgIExvZy5kKFRBRywgIkNoYW5nZWQgaWQgb2YgIiArIElEX0wxQzEgKyAiIGZyb20gIiArIG9sZElkRmllbGQxICsgIiB0byAiICsgbmV3SWRGaWVsZDEpOworCisgICAgICAgIC8vIFRyaWdnZXIgYW5vdGhlciByZXF1ZXN0IGJlY2F1c2UgMXN0IHZpZXcgaGFzIGEgZGlmZmVyZW50IGlkLiBTZXJ2aWNlIHdpbGwgaWdub3JlIGl0IG5vdy4KKyAgICAgICAgZmluYWwgQ2FubmVkRmlsbFJlc3BvbnNlIHJlc3BvbnNlMiA9IG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLmFkZERhdGFzZXQobmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoaWRGaWVsZDIsICJsMWMyIiwgY3JlYXRlUHJlc2VudGF0aW9uKCJsMWMyIikpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UocmVzcG9uc2UyKTsKKworICAgICAgICAvLyBSZS1hZGQgdGhlIGNlbGwgYmVmb3JlIHRyaWdnZXJpbmcgYXV0b2ZpbGwgb24gaXQKKyAgICAgICAgbUFjdGl2aXR5LmFkZENlbGwoMSwgMSwgZmllbGQxKTsKKyAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgxLCAxKTsKKworICAgICAgICBmaW5hbCBGaWxsUmVxdWVzdCBmaWxsUmVxdWVzdDIgPSBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKKyAgICAgICAgZmluYWwgVmlld05vZGUgbm9kZTFSZXF1ZXN0MiA9IGFzc2VydFRleHRJc1Nhbml0aXplZChmaWxsUmVxdWVzdDIuc3RydWN0dXJlLCBJRF9MMUMxKTsKKyAgICAgICAgLy8gTWFrZSBzdXJlIG5vZGUgaGFzIG5ldyBpZC4KKyAgICAgICAgYXNzZXJ0VGhhdChub2RlMVJlcXVlc3QyLmdldEF1dG9maWxsSWQoKSkuaXNFcXVhbFRvKG5ld0lkRmllbGQxKTsKKyAgICAgICAgbVVpQm90LmFzc2VydE5vRGF0YXNldHMoKTsKKworICAgICAgICAvLyBNYWtlIHN1cmUgMm5kIGZpZWxkIHNob3dzIHBpY2tlcgorICAgICAgICBmb2N1c0NlbGwoMSwgMik7CisgICAgICAgIGZpbmFsIFVpT2JqZWN0MiBkYXRhc2V0UGlja2VyID0gbVVpQm90LmFzc2VydERhdGFzZXRzKCJsMWMyIik7CisKKyAgICAgICAgLy8gTm93IGF1dG9maWxsCisgICAgICAgIGZpbmFsIEZpbGxFeHBlY3RhdGlvbiBleHBlY3RhdGlvbiA9IG1BY3Rpdml0eS5leHBlY3RBdXRvZmlsbCgpCisgICAgICAgICAgICAgICAgLm9uQ2VsbCgxLCAyLCAibDFjMiIpOworICAgICAgICBtVWlCb3Quc2VsZWN0RGF0YXNldChkYXRhc2V0UGlja2VyLCAibDFjMiIpOworICAgICAgICBleHBlY3RhdGlvbi5hc3NlcnRBdXRvRmlsbGVkKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Vmlld0dvbmVEdXJpbmdBdXRvZmlsbENhblN0aWxsQmVGaWxsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZW5hYmxlU2VydmljZSgpOworCisgICAgICAgIGZpbmFsIEVkaXRUZXh0IGZpZWxkMSA9IG1BY3Rpdml0eS5nZXRDZWxsKDEsIDEpOworICAgICAgICBmaW5hbCBBdXRvZmlsbElkIG9sZElkRmllbGQxID0gZmllbGQxLmdldEF1dG9maWxsSWQoKTsKKyAgICAgICAgZmluYWwgRWRpdFRleHQgZmllbGQyID0gbUFjdGl2aXR5LmdldENlbGwoMSwgMik7CisgICAgICAgIGZpbmFsIEF1dG9maWxsSWQgaWRGaWVsZDIgPSBmaWVsZDIuZ2V0QXV0b2ZpbGxJZCgpOworCisgICAgICAgIC8vIFByZXBhcmUgcmVzcG9uc2UKKyAgICAgICAgZmluYWwgQ2FubmVkRmlsbFJlc3BvbnNlIHJlc3BvbnNlMSA9IG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLmFkZERhdGFzZXQobmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQob2xkSWRGaWVsZDEsICJsMWMxIiwgY3JlYXRlUHJlc2VudGF0aW9uKCJsMWMxIikpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoaWRGaWVsZDIsICJsMWMyIiwgY3JlYXRlUHJlc2VudGF0aW9uKCJsMWMyIikpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UocmVzcG9uc2UxKTsKKworICAgICAgICAvLyBUcmlnZ2VyIGF1dG9maWxsIG9uIDFzdCB2aWV3LgorICAgICAgICBmb2N1c0NlbGwoMSwgMSk7CisgICAgICAgIGZpbmFsIEZpbGxSZXF1ZXN0IGZpbGxSZXF1ZXN0MSA9IHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOworICAgICAgICBmaW5hbCBWaWV3Tm9kZSBub2RlMVJlcXVlc3QxID0gYXNzZXJ0VGV4dElzU2FuaXRpemVkKGZpbGxSZXF1ZXN0MS5zdHJ1Y3R1cmUsIElEX0wxQzEpOworICAgICAgICBhc3NlcnRUaGF0KG5vZGUxUmVxdWVzdDEuZ2V0QXV0b2ZpbGxJZCgpKS5pc0VxdWFsVG8ob2xkSWRGaWVsZDEpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoImwxYzEiKTsKKworICAgICAgICAvLyBNYWtlIHN1cmUgMm5kIGZpZWxkIHNob3dzIHBpY2tlcgorICAgICAgICBmb2N1c0NlbGwoMSwgMik7CisgICAgICAgIGZpbmFsIFVpT2JqZWN0MiBwaWNrZXIxID0gbVVpQm90LmFzc2VydERhdGFzZXRzKCJsMWMyIik7CisKKyAgICAgICAgLy8gTm93IGNoYW5nZSBpZCBvZiAxc3QgdmlldworICAgICAgICBmaW5hbCBBdXRvZmlsbElkIG5ld0lkRmllbGQxID0gbUFjdGl2aXR5LmdldEF1dG9maWxsTWFuYWdlcigpLmdldE5leHRBdXRvZmlsbElkKCk7CisKKyAgICAgICAgLy8gQ2hhbmdlIGlkCisgICAgICAgIG1BY3Rpdml0eS5yZW1vdmVDZWxsKDEsIDEpOworICAgICAgICBmaWVsZDEuc2V0QXV0b2ZpbGxJZChuZXdJZEZpZWxkMSk7CisgICAgICAgIGFzc2VydFRoYXQoZmllbGQxLmdldEF1dG9maWxsSWQoKSkuaXNFcXVhbFRvKG5ld0lkRmllbGQxKTsKKyAgICAgICAgTG9nLmQoVEFHLCAiQ2hhbmdlZCBpZCBvZiAiICsgSURfTDFDMSArICIgZnJvbSAiICsgb2xkSWRGaWVsZDEgKyAiIHRvICIgKyBuZXdJZEZpZWxkMSk7CisKKyAgICAgICAgLy8gQXV0b2ZpbGwgaXQgLSBqdXN0IDJuZCBmaWVsZCBzaG91bGQgYmUgYXV0b2ZpbGxlZAorICAgICAgICBmaW5hbCBGaWxsRXhwZWN0YXRpb24gZXhwZWN0YXRpb24xID0gbUFjdGl2aXR5LmV4cGVjdEF1dG9maWxsKCkub25DZWxsKDEsIDIsICJsMWMyIik7CisgICAgICAgIG1VaUJvdC5zZWxlY3REYXRhc2V0KHBpY2tlcjEsICJsMWMyIik7CisgICAgICAgIGV4cGVjdGF0aW9uMS5hc3NlcnRBdXRvRmlsbGVkKCk7CisKKyAgICAgICAgLy8gUmUtYWRkIHRoZSBjZWxsIGJlZm9yZSB0cmlnZ2VyaW5nIGF1dG9maWxsIG9uIGl0CisgICAgICAgIGZpZWxkMS5zZXRBdXRvZmlsbElkKG9sZElkRmllbGQxKTsKKyAgICAgICAgbUFjdGl2aXR5LmFkZENlbGwoMSwgMSwgZmllbGQxKTsKKworICAgICAgICAvLyBUYXAgMXN0IGZpZWxkIGFnYWluIC0gaXQgc2hvdWxkIGJlIGF1dG9maWxsYWJsZQorICAgICAgICBtQWN0aXZpdHkuZm9jdXNDZWxsKDEsIDEpOworICAgICAgICBmaW5hbCBVaU9iamVjdDIgcGlja2VyMiA9IG1VaUJvdC5hc3NlcnREYXRhc2V0cygibDFjMSIpOworCisgICAgICAgIC8vIE5vdyBhdXRvZmlsbCBhZ2FpbgorICAgICAgICBmaW5hbCBGaWxsRXhwZWN0YXRpb24gZXhwZWN0YXRpb24yID0gbUFjdGl2aXR5LmV4cGVjdEF1dG9maWxsKCkub25DZWxsKDEsIDEsICJsMWMxIik7CisgICAgICAgIG1VaUJvdC5zZWxlY3REYXRhc2V0KHBpY2tlcjIsICJsMWMxIik7CisgICAgICAgIGV4cGVjdGF0aW9uMi5hc3NlcnRBdXRvRmlsbGVkKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2F2ZV9zZXJ2aWNlSWdub3Jlc05ld0lkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHNhdmVXaGVuSWRDaGFuZ2VkKHRydWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNhdmVfc2VydmljZUV4cGVjdGluZ09sZElkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHNhdmVXaGVuSWRDaGFuZ2VkKGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2F2ZVdoZW5JZENoYW5nZWQoYm9vbGVhbiBzZXJ2aWNlSWdub3Jlc05ld0lkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZW5hYmxlU2VydmljZSgpOworCisgICAgICAgIGZpbmFsIEVkaXRUZXh0IGZpZWxkMSA9IG1BY3Rpdml0eS5nZXRDZWxsKDEsIDEpOworICAgICAgICBmaW5hbCBBdXRvZmlsbElkIG9sZElkRmllbGQxID0gZmllbGQxLmdldEF1dG9maWxsSWQoKTsKKyAgICAgICAgZmluYWwgRWRpdFRleHQgZmllbGQyID0gbUFjdGl2aXR5LmdldENlbGwoMSwgMik7CisgICAgICAgIGZpbmFsIEF1dG9maWxsSWQgaWRGaWVsZDIgPSBmaWVsZDIuZ2V0QXV0b2ZpbGxJZCgpOworCisgICAgICAgIC8vIFByZXBhcmUgcmVzcG9uc2UKKyAgICAgICAgZmluYWwgQ2FubmVkRmlsbFJlc3BvbnNlIHJlc3BvbnNlMSA9IG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldFJlcXVpcmVkU2F2YWJsZUF1dG9maWxsSWRzKFNBVkVfREFUQV9UWVBFX0dFTkVSSUMsIG9sZElkRmllbGQxLCBpZEZpZWxkMikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UocmVzcG9uc2UxKTsKKworICAgICAgICAvLyBUcmlnZ2VyIGF1dG9maWxsIG9uIDFzdCB2aWV3LgorICAgICAgICBtQWN0aXZpdHkuZm9jdXNDZWxsKDEsIDEpOyAvLyBObyB3aW5kb3cgY2hhbmdlIGJlY2F1c2UgaXQncyBub3Qgc2hvd2luZyBkYXRhc2V0IHBpY2tlci4KKyAgICAgICAgZmluYWwgRmlsbFJlcXVlc3QgZmlsbFJlcXVlc3QxID0gc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CisgICAgICAgIGZpbmFsIFZpZXdOb2RlIG5vZGUxUmVxdWVzdDEgPSBhc3NlcnRUZXh0SXNTYW5pdGl6ZWQoZmlsbFJlcXVlc3QxLnN0cnVjdHVyZSwgSURfTDFDMSk7CisgICAgICAgIGFzc2VydFRoYXQobm9kZTFSZXF1ZXN0MS5nZXRBdXRvZmlsbElkKCkpLmlzRXF1YWxUbyhvbGRJZEZpZWxkMSk7CisgICAgICAgIG1VaUJvdC5hc3NlcnROb0RhdGFzZXRzRXZlcigpOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSAybmQgZmllbGQgZG9lc24ndCB0cmlnZ2VyIGEgbmV3IHJlcXVlc3QKKyAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgxLCAyKTsgLy8gTm8gd2luZG93IGNoYW5nZSBiZWNhdXNlIGl0J3Mgbm90IHNob3dpbmcgZGF0YXNldCBwaWNrZXIuCisgICAgICAgIG1VaUJvdC5hc3NlcnROb0RhdGFzZXRzRXZlcigpOworCisgICAgICAgIC8vIE5vdyBjaGFuZ2UgMXN0IHZpZXcgdmFsdWUuLi4KKyAgICAgICAgbUFjdGl2aXR5LnNldFRleHQoMSwgMSwgIk9MRCIpOworICAgICAgICAvLyAuLi5hbmQgaXRzIGlkCisgICAgICAgIGZpbmFsIEF1dG9maWxsSWQgbmV3SWRGaWVsZDEgPSBtQWN0aXZpdHkuZ2V0QXV0b2ZpbGxNYW5hZ2VyKCkuZ2V0TmV4dEF1dG9maWxsSWQoKTsKKyAgICAgICAgbUFjdGl2aXR5LnJlbW92ZUNlbGwoMSwgMSk7CisgICAgICAgIGZpZWxkMS5zZXRBdXRvZmlsbElkKG5ld0lkRmllbGQxKTsKKyAgICAgICAgYXNzZXJ0VGhhdChmaWVsZDEuZ2V0QXV0b2ZpbGxJZCgpKS5pc0VxdWFsVG8obmV3SWRGaWVsZDEpOworICAgICAgICBMb2cuZChUQUcsICJDaGFuZ2VkIGlkIG9mICIgKyBJRF9MMUMxICsgIiBmcm9tICIgKyBvbGRJZEZpZWxkMSArICIgdG8gIiArIG5ld0lkRmllbGQxKTsKKworICAgICAgICAvLyBUcmlnZ2VyIGFub3RoZXIgcmVxdWVzdCBiZWNhdXNlIDFzdCB2aWV3IGhhcyBhIGRpZmZlcmVudCBpZC4uLgorICAgICAgICBmaW5hbCBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlciByZXNwb25zZTIgPSBuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKTsKKyAgICAgICAgaWYgKHNlcnZpY2VJZ25vcmVzTmV3SWQpIHsKKyAgICAgICAgICAgIC8vIC4uLiBhbmQgc2VydmljZSB3aWxsIGlnbm9yZSBpdCBub3cuCisgICAgICAgICAgICByZXNwb25zZTIuc2V0UmVxdWlyZWRTYXZhYmxlQXV0b2ZpbGxJZHMoU0FWRV9EQVRBX1RZUEVfR0VORVJJQywgaWRGaWVsZDIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gLi5idXQgc2VydmljZSBpcyBzdGlsbCBleHBlY3RpbmcgdGhlIG9sZCBpZC4KKyAgICAgICAgICAgIHJlc3BvbnNlMi5zZXRSZXF1aXJlZFNhdmFibGVBdXRvZmlsbElkcyhTQVZFX0RBVEFfVFlQRV9HRU5FUklDLCBvbGRJZEZpZWxkMSwgaWRGaWVsZDIpOworICAgICAgICB9CisgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKHJlc3BvbnNlMi5idWlsZCgpKTsKKworICAgICAgICBtQWN0aXZpdHkuYWRkQ2VsbCgxLCAxLCBmaWVsZDEpOworICAgICAgICBtQWN0aXZpdHkuZm9jdXNDZWxsKDEsIDEpOyAvLyBObyB3aW5kb3cgY2hhbmdlIGJlY2F1c2UgaXQncyBub3Qgc2hvd2luZyBkYXRhc2V0IHBpY2tlci4KKyAgICAgICAgZmluYWwgRmlsbFJlcXVlc3QgZmlsbFJlcXVlc3QyID0gc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CisgICAgICAgIGZpbmFsIFZpZXdOb2RlIG5vZGUxUmVxdWVzdDIgPSBhc3NlcnRUZXh0SXNTYW5pdGl6ZWQoZmlsbFJlcXVlc3QyLnN0cnVjdHVyZSwgSURfTDFDMSk7CisgICAgICAgIC8vIE1ha2Ugc3VyZSBub2RlIGhhcyBuZXcgaWQuCisgICAgICAgIGFzc2VydFRoYXQobm9kZTFSZXF1ZXN0Mi5nZXRBdXRvZmlsbElkKCkpLmlzRXF1YWxUbyhuZXdJZEZpZWxkMSk7CisgICAgICAgIG1VaUJvdC5hc3NlcnROb0RhdGFzZXRzRXZlcigpOworCisgICAgICAgIC8vIE5vdyB0cmlnZ2VycyBzYXZlCisgICAgICAgIG1BY3Rpdml0eS5zZXRUZXh0KDEsIDEsICJORVciKTsKKyAgICAgICAgbUFjdGl2aXR5LnNldFRleHQoMSwgMiwgIk5PRDIiKTsKKyAgICAgICAgbUFjdGl2aXR5LnNhdmUoKTsKKworICAgICAgICBtVWlCb3Quc2F2ZUZvckF1dG9maWxsKHRydWUsIFNBVkVfREFUQV9UWVBFX0dFTkVSSUMpOworICAgICAgICBmaW5hbCBTYXZlUmVxdWVzdCBzYXZlUmVxdWVzdCA9IHNSZXBsaWVyLmdldE5leHRTYXZlUmVxdWVzdCgpOworICAgICAgICBmaW5hbCBMaXN0PEZpbGxDb250ZXh0PiBjb250ZXh0cyA9IHNhdmVSZXF1ZXN0LmNvbnRleHRzOworICAgICAgICBhc3NlcnRUaGF0KGNvbnRleHRzKS5oYXNTaXplKDIpOworCisgICAgICAgIC8vIEFzc2VydCAxc3QgY29udGV4dAorICAgICAgICBmaW5hbCBBc3Npc3RTdHJ1Y3R1cmUgc3RydWN0dXJlMSA9IGNvbnRleHRzLmdldCgwKS5nZXRTdHJ1Y3R1cmUoKTsKKworICAgICAgICBmaW5hbCBWaWV3Tm9kZSBvbGROb2RlMUNvbnRleHQxID0gZmluZE5vZGVCeUF1dG9maWxsSWQoc3RydWN0dXJlMSwgb2xkSWRGaWVsZDEpOworICAgICAgICBhc3NlcnRUaGF0KG9sZE5vZGUxQ29udGV4dDEpLmlzTm90TnVsbCgpOworICAgICAgICBhc3NlcnRUaGF0KG9sZE5vZGUxQ29udGV4dDEuZ2V0SWRFbnRyeSgpKS5pc0VxdWFsVG8oSURfTDFDMSk7CisgICAgICAgIGFzc2VydFRoYXQob2xkTm9kZTFDb250ZXh0MS5nZXRUZXh0KCkudG9TdHJpbmcoKSkuaXNFcXVhbFRvKCJPTEQiKTsKKworICAgICAgICBmaW5hbCBWaWV3Tm9kZSBuZXdOb2RlMUNvbnRleHQxID0gZmluZE5vZGVCeUF1dG9maWxsSWQoc3RydWN0dXJlMSwgbmV3SWRGaWVsZDEpOworICAgICAgICBhc3NlcnRUaGF0KG5ld05vZGUxQ29udGV4dDEpLmlzTnVsbCgpOworCisgICAgICAgIGZpbmFsIFZpZXdOb2RlIG5vZGUyQ29udGV4dDEgPSBmaW5kTm9kZUJ5QXV0b2ZpbGxJZChzdHJ1Y3R1cmUxLCBpZEZpZWxkMik7CisgICAgICAgIGFzc2VydFRoYXQobm9kZTJDb250ZXh0MSkuaXNOb3ROdWxsKCk7CisgICAgICAgIGFzc2VydFRoYXQobm9kZTJDb250ZXh0MS5nZXRJZEVudHJ5KCkpLmlzRXF1YWxUbyhJRF9MMUMyKTsKKyAgICAgICAgYXNzZXJ0VGhhdChub2RlMkNvbnRleHQxLmdldFRleHQoKS50b1N0cmluZygpKS5pc0VxdWFsVG8oIk5PRDIiKTsKKworICAgICAgICAvLyBBc3NlcnQgMm5kIGNvbnRleHQKKyAgICAgICAgZmluYWwgQXNzaXN0U3RydWN0dXJlIHN0cnVjdHVyZTIgPSBjb250ZXh0cy5nZXQoMSkuZ2V0U3RydWN0dXJlKCk7CisKKyAgICAgICAgZmluYWwgVmlld05vZGUgb2xkTm9kZTFDb250ZXh0MiA9IGZpbmROb2RlQnlBdXRvZmlsbElkKHN0cnVjdHVyZTIsIG9sZElkRmllbGQxKTsKKyAgICAgICAgYXNzZXJ0VGhhdChvbGROb2RlMUNvbnRleHQyKS5pc051bGwoKTsKKworICAgICAgICBmaW5hbCBWaWV3Tm9kZSBuZXdOb2RlMUNvbnRleHQyID0gZmluZE5vZGVCeUF1dG9maWxsSWQoc3RydWN0dXJlMiwgbmV3SWRGaWVsZDEpOworICAgICAgICBhc3NlcnRUaGF0KG5ld05vZGUxQ29udGV4dDIpLmlzTm90TnVsbCgpOworICAgICAgICBhc3NlcnRUaGF0KG5ld05vZGUxQ29udGV4dDIuZ2V0SWRFbnRyeSgpKS5pc0VxdWFsVG8oSURfTDFDMSk7CisgICAgICAgIGFzc2VydFRoYXQobmV3Tm9kZTFDb250ZXh0Mi5nZXRUZXh0KCkudG9TdHJpbmcoKSkuaXNFcXVhbFRvKCJORVciKTsKKworICAgICAgICBmaW5hbCBWaWV3Tm9kZSBub2RlMkNvbnRleHQyID0gZmluZE5vZGVCeUF1dG9maWxsSWQoc3RydWN0dXJlMiwgaWRGaWVsZDIpOworICAgICAgICBhc3NlcnRUaGF0KG5vZGUyQ29udGV4dDIpLmlzTm90TnVsbCgpOworICAgICAgICBhc3NlcnRUaGF0KG5vZGUyQ29udGV4dDIuZ2V0SWRFbnRyeSgpKS5pc0VxdWFsVG8oSURfTDFDMik7CisgICAgICAgIGFzc2VydFRoYXQobm9kZTJDb250ZXh0Mi5nZXRUZXh0KCkudG9TdHJpbmcoKSkuaXNFcXVhbFRvKCJOT0QyIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRm9jdXMgdG8gYSBjZWxsIGFuZCBleHBlY3Qgd2luZG93IGV2ZW50CisgICAgICovCisgICAgdm9pZCBmb2N1c0NlbGwoaW50IHJvdywgaW50IGNvbHVtbikgdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24geworICAgICAgICBtVWlCb3Qud2FpdEZvcldpbmRvd0NoYW5nZSgoKSAtPiBtQWN0aXZpdHkuZm9jdXNDZWxsKHJvdywgY29sdW1uKSwKKyAgICAgICAgICAgICAgICBUaW1lb3V0cy5VSV9USU1FT1VULmdldE1heFZhbHVlKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL015QXV0b2ZpbGxDYWxsYmFjay5qYXZhIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvTXlBdXRvZmlsbENhbGxiYWNrLmphdmEKaW5kZXggMWJhODc1NS4uMjEwOGE0YiAxMDA2NDQKLS0tIGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvTXlBdXRvZmlsbENhbGxiYWNrLmphdmEKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvTXlBdXRvZmlsbENhbGxiYWNrLmphdmEKQEAgLTE2LDEwICsxNiwxMiBAQAogCiBwYWNrYWdlIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0czsKIAotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSGVscGVyLkNPTk5FQ1RJT05fVElNRU9VVF9NUzsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5jYWxsYmFja0V2ZW50QXNTdHJpbmc7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5UaW1lb3V0cy5DT05ORUNUSU9OX1RJTUVPVVQ7CiAKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24udHJ1dGguVHJ1dGguYXNzZXJ0V2l0aE1lc3NhZ2U7CiAKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5hdXRvZmlsbC5BdXRvZmlsbE1hbmFnZXIuQXV0b2ZpbGxDYWxsYmFjazsKIApAQCAtMzIsMTUgKzM0LDIxIEBACiAgKi8KIGZpbmFsIGNsYXNzIE15QXV0b2ZpbGxDYWxsYmFjayBleHRlbmRzIEF1dG9maWxsQ2FsbGJhY2sgewogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNeUF1dG9maWxsQ2FsbGJhY2siOwogICAgIHByaXZhdGUgZmluYWwgQmxvY2tpbmdRdWV1ZTxNeUV2ZW50PiBtRXZlbnRzID0gbmV3IExpbmtlZEJsb2NraW5nUXVldWU8PigpOwogCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUaW1lb3V0IE1ZX1RJTUVPVVQgPSBDT05ORUNUSU9OX1RJTUVPVVQ7CisKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBvbkF1dG9maWxsRXZlbnQoVmlldyB2aWV3LCBpbnQgZXZlbnQpIHsKKyAgICAgICAgTG9nLnYoVEFHLCAib25BdXRvZmlsbEV2ZW50OiB2aWV3PSIgKyB2aWV3ICsgIiwgZXZlbnQ9IiArIGNhbGxiYWNrRXZlbnRBc1N0cmluZyhldmVudCkpOwogICAgICAgICBtRXZlbnRzLm9mZmVyKG5ldyBNeUV2ZW50KHZpZXcsIGV2ZW50KSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25BdXRvZmlsbEV2ZW50KFZpZXcgdmlldywgaW50IGNoaWxkSWQsIGludCBldmVudCkgeworICAgICAgICBMb2cudihUQUcsICJvbkF1dG9maWxsRXZlbnQ6IHZpZXc9IiArIHZpZXcgKyAiLCBjaGlsZD0iICsgY2hpbGRJZAorICAgICAgICAgICAgICAgICsgIiwgZXZlbnQ9IiArIGNhbGxiYWNrRXZlbnRBc1N0cmluZyhldmVudCkpOwogICAgICAgICBtRXZlbnRzLm9mZmVyKG5ldyBNeUV2ZW50KHZpZXcsIGNoaWxkSWQsIGV2ZW50KSk7CiAgICAgfQogCkBAIC00OCwxOCArNTYsMzAgQEAKICAgICAgKiBHZXRzIHRoZSBuZXh0IGF2YWlsYWJsZSBldmVudCBvciBmYWlsIGlmIGl0IHRpbWVzIG91dC4KICAgICAgKi8KICAgICBNeUV2ZW50IGdldEV2ZW50KCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgTXlFdmVudCBldmVudCA9IG1FdmVudHMucG9sbChDT05ORUNUSU9OX1RJTUVPVVRfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgIGZpbmFsIE15RXZlbnQgZXZlbnQgPSBtRXZlbnRzLnBvbGwoQ09OTkVDVElPTl9USU1FT1VULm1zKCksIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CiAgICAgICAgIGlmIChldmVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUmV0cnlhYmxlRXhjZXB0aW9uKCJubyBldmVudCBpbiAlZCBtcyIsIENPTk5FQ1RJT05fVElNRU9VVF9NUyk7CisgICAgICAgICAgICB0aHJvdyBuZXcgUmV0cnlhYmxlRXhjZXB0aW9uKENPTk5FQ1RJT05fVElNRU9VVCwgIm5vIGV2ZW50Iik7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGV2ZW50OwogICAgIH0KIAogICAgIC8qKgorICAgICAqIEFzc2VydCBubyBtb3JlIGV2ZW50cyB3ZXJlIHJlY2VpdmVkLgorICAgICAqLworICAgIHZvaWQgYXNzZXJ0Tm90Q2FsbGVkKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgTXlFdmVudCBldmVudCA9IG1FdmVudHMucG9sbChDT05ORUNUSU9OX1RJTUVPVVQubXMoKSwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgaWYgKGV2ZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIE5vdCByZXRyeWFibGUuCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJzaG91bGQgbm90IGhhdmUgcmVjZWl2ZWQgIiArIGV2ZW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgogICAgICAqIFVzZWQgdG8gYXNzZXJ0IHRoZXJlIGlzIG5vIGV2ZW50IGxlZnQgYmVoaW5kLgogICAgICAqLwogICAgIHZvaWQgYXNzZXJ0TnVtYmVyVW5oYW5kbGVkRXZlbnRzKGludCBleHBlY3RlZCkgewotICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiSW52YWxpZCBudW1iZXIgb2YgZXZlbnRzIGxlZnQiKS50aGF0KG1FdmVudHMuc2l6ZSgpKS5pc0VxdWFsVG8oZXhwZWN0ZWQpOworICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiSW52YWxpZCBudW1iZXIgb2YgZXZlbnRzIGxlZnQ6ICVzIiwgbUV2ZW50cykudGhhdChtRXZlbnRzLnNpemUoKSkKKyAgICAgICAgICAgICAgICAuaXNFcXVhbFRvKGV4cGVjdGVkKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE1Myw3ICsxNzMsNyBAQAogCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuIGV2ZW50ICsgIjogIiArIHZpZXcgKyAiIChjaGlsZElkOiAiICsgY2hpbGRJZCArICIpIjsKKyAgICAgICAgICAgIHJldHVybiBjYWxsYmFja0V2ZW50QXNTdHJpbmcoZXZlbnQpICsgIjogIiArIHZpZXcgKyAiIChjaGlsZElkOiAiICsgY2hpbGRJZCArICIpIjsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL015QXV0b2ZpbGxJZC5qYXZhIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvTXlBdXRvZmlsbElkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMwZjMyMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL015QXV0b2ZpbGxJZC5qYXZhCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0czsKKworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYXV0b2ZpbGwuQXV0b2ZpbGxJZDsKKworcHVibGljIGZpbmFsIGNsYXNzIE15QXV0b2ZpbGxJZCBpbXBsZW1lbnRzIFBhcmNlbGFibGUgeworCisgICAgcHJpdmF0ZSBmaW5hbCBBdXRvZmlsbElkIG1JZDsKKworICAgIHB1YmxpYyBNeUF1dG9maWxsSWQoQXV0b2ZpbGxJZCBpZCkgeworICAgICAgICBtSWQgPSBpZDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBmaW5hbCBpbnQgcHJpbWUgPSAzMTsKKyAgICAgICAgaW50IHJlc3VsdCA9IDE7CisgICAgICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChtSWQgPT0gbnVsbCkgPyAwIDogbUlkLmhhc2hDb2RlKCkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmICh0aGlzID09IG9iaikgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkgcmV0dXJuIGZhbHNlOworICAgICAgICBNeUF1dG9maWxsSWQgb3RoZXIgPSAoTXlBdXRvZmlsbElkKSBvYmo7CisgICAgICAgIGlmIChtSWQgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG90aGVyLm1JZCAhPSBudWxsKSByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSBpZiAoIW1JZC5lcXVhbHMob3RoZXIubUlkKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBtSWQudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIGRlc3QsIGludCBmbGFncykgeworICAgICAgICBkZXN0LndyaXRlUGFyY2VsYWJsZShtSWQsIGZsYWdzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENyZWF0b3I8TXlBdXRvZmlsbElkPiBDUkVBVE9SID0gbmV3IENyZWF0b3I8TXlBdXRvZmlsbElkPigpIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE15QXV0b2ZpbGxJZCBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBzb3VyY2UpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTXlBdXRvZmlsbElkKHNvdXJjZS5yZWFkUGFyY2VsYWJsZShudWxsKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE15QXV0b2ZpbGxJZFtdIG5ld0FycmF5KGludCBzaXplKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE15QXV0b2ZpbGxJZFtzaXplXTsKKyAgICAgICAgfQorICAgIH07Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9NeURyYXdhYmxlLmphdmEgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9NeURyYXdhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQwZTU5MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL015RHJhd2FibGUuamF2YQpAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzOworCitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvckZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK3B1YmxpYyBjbGFzcyBNeURyYXdhYmxlIGV4dGVuZHMgRHJhd2FibGUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNeURyYXdhYmxlIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvdW50RG93bkxhdGNoIHNMYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICBwcml2YXRlIHN0YXRpYyBNeURyYXdhYmxlIHNJbnN0YW5jZTsKKworICAgIHByaXZhdGUgc3RhdGljIFJlY3Qgc0F1dG9maWxsZWRCb3VuZHM7CisKKyAgICBwdWJsaWMgTXlEcmF3YWJsZSgpIHsKKyAgICAgICAgaWYgKHNJbnN0YW5jZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGVyZSBjYW4gYmUgb25seSBvbmUhIik7CisgICAgICAgIH0KKyAgICAgICAgc0luc3RhbmNlID0gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgaWYgKHNBdXRvZmlsbGVkQm91bmRzID09IG51bGwpIHsKKyAgICAgICAgICAgIHNBdXRvZmlsbGVkQm91bmRzID0gZ2V0Qm91bmRzKCk7CisgICAgICAgICAgICBMb2cuZChUQUcsICJBdXRvZmlsbGVkIGF0ICIgKyBzQXV0b2ZpbGxlZEJvdW5kcyk7CisgICAgICAgICAgICBzTGF0Y2guY291bnREb3duKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFJlY3QgZ2V0QXV0b2ZpbGxlZEJvdW5kcygpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghc0xhdGNoLmF3YWl0KFRpbWVvdXRzLkZJTExfVElNRU9VVC5tcygpLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUmV0cnlhYmxlRXhjZXB0aW9uKFRpbWVvdXRzLkZJTExfVElNRU9VVCwgImN1c3RvbSBkcmF3YWJsZSBub3QgZHJhd24iKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc0F1dG9maWxsZWRCb3VuZHM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0QWxwaGEoaW50IGFscGhhKSB7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0Q29sb3JGaWx0ZXIoQ29sb3JGaWx0ZXIgY29sb3JGaWx0ZXIpIHsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldE9wYWNpdHkoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL015V2ViVmlldy5qYXZhIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvTXlXZWJWaWV3LmphdmEKaW5kZXggNTMxN2Q4OS4uYzQ2YTUxNiAxMDA2NDQKLS0tIGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvTXlXZWJWaWV3LmphdmEKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvTXlXZWJWaWV3LmphdmEKQEAgLTE1LDcgKzE1LDcgQEAKICAqLwogcGFja2FnZSBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHM7CiAKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5GSUxMX1RJTUVPVVRfTVM7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5UaW1lb3V0cy5GSUxMX1RJTUVPVVQ7CiAKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24udHJ1dGguVHJ1dGguYXNzZXJ0V2l0aE1lc3NhZ2U7CiAKQEAgLTM4LDYgKzM4LDEwIEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNeVdlYlZpZXciOwogICAgIHByaXZhdGUgRmlsbEV4cGVjdGF0aW9uIG1FeHBlY3RhdGlvbjsKIAorICAgIHB1YmxpYyBNeVdlYlZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgIH0KKwogICAgIHB1YmxpYyBNeVdlYlZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKICAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOwogICAgICAgICBMb2cuZChUQUcsICJpc0F1dG9maWxsRW5hYmxlZCgpIG9uIGNvbnN0cnVjdG9yPyAiICsgaXNBdXRvZmlsbEVuYWJsZWQoKSk7CkBAIC00OSwxMSArNTMsMTEgQEAKIAogICAgIHB1YmxpYyB2b2lkIGFzc2VydEF1dG9maWxsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoImV4cGVjdEF1dG9maWxsKCkgbm90IGNhbGxlZCIpLnRoYXQobUV4cGVjdGF0aW9uKS5pc05vdE51bGwoKTsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBzZXQgPSBtRXhwZWN0YXRpb24ubUxhdGNoLmF3YWl0KEZJTExfVElNRU9VVF9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBzZXQgPSBtRXhwZWN0YXRpb24ubUxhdGNoLmF3YWl0KEZJTExfVElNRU9VVC5tcygpLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOwogICAgICAgICBpZiAobUV4cGVjdGF0aW9uLm1FeGNlcHRpb24gIT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbUV4cGVjdGF0aW9uLm1FeGNlcHRpb247CiAgICAgICAgIH0KLSAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoIlRpbWVvdXQgKCVzIG1zKSBleHBlY3RpbmcgYXV0b2ZpbGwoKSIsIEZJTExfVElNRU9VVF9NUykKKyAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoIlRpbWVvdXQgKCVzIG1zKSBleHBlY3RpbmcgYXV0b2ZpbGwoKSIsIEZJTExfVElNRU9VVC5tcygpKQogICAgICAgICAgICAgICAgIC50aGF0KHNldCkuaXNUcnVlKCk7CiAgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJXcm9uZyB2YWx1ZSBmb3IgdXNlcm5hbWUiKS50aGF0KG1FeHBlY3RhdGlvbi5tQWN0dWFsVXNlcm5hbWUpCiAgICAgICAgICAgICAgICAgLmlzRXF1YWxUbyhtRXhwZWN0YXRpb24ubUV4cGVjdGVkVXNlcm5hbWUpOwpAQCAtNzMsOCArNzcsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgdmFsdWVzIG9uIGF1dG9maWxsKCk6ICIgKyB2YWx1ZXMpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBtRXhwZWN0YXRpb24ubUFjdHVhbFVzZXJuYW1lID0gdmFsdWVzLnZhbHVlQXQoMCkuZ2V0VGV4dFZhbHVlKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgbUV4cGVjdGF0aW9uLm1BY3R1YWxQYXNzd29yZCA9IHZhbHVlcy52YWx1ZUF0KDEpLmdldFRleHRWYWx1ZSgpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IGtub3cgdGhlIG9yZGVyIG9mIHRoZSB2YWx1ZXMgaW4gdGhlIGFycmF5LiBBcyB3ZSdyZSBqdXN0IGV4cGVjdGluZworICAgICAgICAgICAgICAgICAgICAvLyAyLCBpdCdzIGVhc3kgdG8ganVzdCBjaGVjayB0aGVtIGluZGl2aWR1YWxseTsgaWYgd2UgaGFkIG1vcmUsIHRoYW4gd2Ugd291bGQKKyAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBvdmVycmlkZSBvblByb3ZpZGVBdXRvZmlsbFZpcnR1YWxTdHJ1Y3R1cmUoKSB0byBrZWVwIHRyYWNrIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBub2RlcyBhZGRlZCBieSBXZWJWaWV3IHNvIHdlIGNvdWxkIHNhdmUgdGhlaXIgQXV0b2ZpbGxJZHMgYW5kIHJldXNlIGhlcmUuCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZTEgPSB2YWx1ZXMudmFsdWVBdCgwKS5nZXRUZXh0VmFsdWUoKS50b1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWUyID0gdmFsdWVzLnZhbHVlQXQoMSkuZ2V0VGV4dFZhbHVlKCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1FeHBlY3RhdGlvbi5tRXhwZWN0ZWRVc2VybmFtZS5lcXVhbHModmFsdWUxKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUV4cGVjdGF0aW9uLm1BY3R1YWxVc2VybmFtZSA9IHZhbHVlMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1FeHBlY3RhdGlvbi5tQWN0dWFsUGFzc3dvcmQgPSB2YWx1ZTI7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtRXhwZWN0YXRpb24ubUFjdHVhbFVzZXJuYW1lID0gdmFsdWUyOworICAgICAgICAgICAgICAgICAgICAgICAgbUV4cGVjdGF0aW9uLm1BY3R1YWxQYXNzd29yZCA9IHZhbHVlMTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgIG1FeHBlY3RhdGlvbi5tRXhjZXB0aW9uID0gZTsKICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9Ob09wQXV0b2ZpbGxTZXJ2aWNlLmphdmEgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9Ob09wQXV0b2ZpbGxTZXJ2aWNlLmphdmEKaW5kZXggYTRjMmExMC4uNDNiYjVmMSAxMDA2NDQKLS0tIGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvTm9PcEF1dG9maWxsU2VydmljZS5qYXZhCisrKyBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL05vT3BBdXRvZmlsbFNlcnZpY2UuamF2YQpAQCAtMjEsMTIgKzIxLDE1IEBACiBpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLmF1dG9maWxsLkZpbGxSZXF1ZXN0OwogaW1wb3J0IGFuZHJvaWQuc2VydmljZS5hdXRvZmlsbC5TYXZlQ2FsbGJhY2s7CiBpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLmF1dG9maWxsLlNhdmVSZXF1ZXN0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIC8qKgogICoge0BsaW5rIEF1dG9maWxsU2VydmljZX0gaW1wbGVtZW50YXRpb24gdGhhdCBkb2VzIG5vdCBkbyBhbnl0aGluZy4uLgogICovCiBwdWJsaWMgY2xhc3MgTm9PcEF1dG9maWxsU2VydmljZSBleHRlbmRzIEF1dG9maWxsU2VydmljZSB7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk5vT3BBdXRvZmlsbFNlcnZpY2UiOworCiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX05BTUUgPSBOb09wQXV0b2ZpbGxTZXJ2aWNlLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkKICAgICAgICAgICAgICsgIi8uIiArIE5vT3BBdXRvZmlsbFNlcnZpY2UuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9MQUJFTCA9ICJOb09wQXV0b2ZpbGxTZXJ2aWNlIjsKQEAgLTM0LDkgKzM3LDExIEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25GaWxsUmVxdWVzdChGaWxsUmVxdWVzdCByZXF1ZXN0LCBDYW5jZWxsYXRpb25TaWduYWwgY2FuY2VsbGF0aW9uU2lnbmFsLAogICAgICAgICAgICAgRmlsbENhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIExvZy5kKFRBRywgIm9uRmlsbFJlcXVlc3QoKSIpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG9uU2F2ZVJlcXVlc3QoU2F2ZVJlcXVlc3QgcmVxdWVzdCwgU2F2ZUNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIExvZy5kKFRBRywgIm9uRmlsbFJlc3BvbnNlKCkiKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9PbmVUaW1lQ29tcG91bmRCdXR0b25MaXN0ZW5lci5qYXZhIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvT25lVGltZUNvbXBvdW5kQnV0dG9uTGlzdGVuZXIuamF2YQppbmRleCAwNzFkZWM2Li40ZDdhZjk0IDEwMDY0NAotLS0gYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9PbmVUaW1lQ29tcG91bmRCdXR0b25MaXN0ZW5lci5qYXZhCisrKyBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL09uZVRpbWVDb21wb3VuZEJ1dHRvbkxpc3RlbmVyLmphdmEKQEAgLTE2LDcgKzE2LDcgQEAKIAogcGFja2FnZSBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHM7CiAKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5GSUxMX1RJTUVPVVRfTVM7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5UaW1lb3V0cy5GSUxMX1RJTUVPVVQ7CiAKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24udHJ1dGguVHJ1dGguYXNzZXJ0V2l0aE1lc3NhZ2U7CiAKQEAgLTQ4LDggKzQ4LDggQEAKICAgICB9CiAKICAgICB2b2lkIGFzc2VydEF1dG9GaWxsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBzZXQgPSBsYXRjaC5hd2FpdChGSUxMX1RJTUVPVVRfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7Ci0gICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJUaW1lb3V0ICglcyBtcykgb24gQ29tcG91bmRCdXR0b24gJXMiLCBGSUxMX1RJTUVPVVRfTVMsIG5hbWUpCisgICAgICAgIGZpbmFsIGJvb2xlYW4gc2V0ID0gbGF0Y2guYXdhaXQoRklMTF9USU1FT1VULm1zKCksIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJUaW1lb3V0ICglcyBtcykgb24gQ29tcG91bmRCdXR0b24gJXMiLCBGSUxMX1RJTUVPVVQubXMoKSwgbmFtZSkKICAgICAgICAgICAgIC50aGF0KHNldCkuaXNUcnVlKCk7CiAgICAgICAgIGZpbmFsIGJvb2xlYW4gYWN0dWFsID0gYnV0dG9uLmlzQ2hlY2tlZCgpOwogICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiV3JvbmcgYXV0by1maWxsIHZhbHVlIG9uIENvbXBvdW5kQnV0dG9uICVzIiwgbmFtZSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL09uZVRpbWVEYXRlTGlzdGVuZXIuamF2YSBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL09uZVRpbWVEYXRlTGlzdGVuZXIuamF2YQppbmRleCBlZjI4YTIzLi40MDc4NjFkIDEwMDY0NAotLS0gYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9PbmVUaW1lRGF0ZUxpc3RlbmVyLmphdmEKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvT25lVGltZURhdGVMaXN0ZW5lci5qYXZhCkBAIC0xNiw3ICsxNiw3IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzOwogCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5IZWxwZXIuRklMTF9USU1FT1VUX01TOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuVGltZW91dHMuRklMTF9USU1FT1VUOwogCiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLnRydXRoLlRydXRoLmFzc2VydFdpdGhNZXNzYWdlOwogCkBAIC01MSw4ICs1MSw4IEBACiAgICAgfQogCiAgICAgdm9pZCBhc3NlcnRBdXRvRmlsbGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gc2V0ID0gbGF0Y2guYXdhaXQoRklMTF9USU1FT1VUX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOwotICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiVGltZW91dCAoJXMgbXMpIG9uIERhdGVQaWNrZXIgJXMiLCBGSUxMX1RJTUVPVVRfTVMsIG5hbWUpCisgICAgICAgIGZpbmFsIGJvb2xlYW4gc2V0ID0gbGF0Y2guYXdhaXQoRklMTF9USU1FT1VULm1zKCksIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJUaW1lb3V0ICglcyBtcykgb24gRGF0ZVBpY2tlciAlcyIsIEZJTExfVElNRU9VVC5tcygpLCBuYW1lKQogICAgICAgICAgICAgLnRoYXQoc2V0KS5pc1RydWUoKTsKICAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoIldyb25nIHllYXIgb24gRGF0ZVBpY2tlciAlcyIsIG5hbWUpCiAgICAgICAgICAgICAudGhhdChkYXRlUGlja2VyLmdldFllYXIoKSkuaXNFcXVhbFRvKGV4cGVjdGVkWWVhcik7CmRpZmYgLS1naXQgYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9PbmVUaW1lUmFkaW9Hcm91cExpc3RlbmVyLmphdmEgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9PbmVUaW1lUmFkaW9Hcm91cExpc3RlbmVyLmphdmEKaW5kZXggMTkwM2NiOS4uNzNlZDY0OCAxMDA2NDQKLS0tIGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvT25lVGltZVJhZGlvR3JvdXBMaXN0ZW5lci5qYXZhCisrKyBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL09uZVRpbWVSYWRpb0dyb3VwTGlzdGVuZXIuamF2YQpAQCAtMTYsNyArMTYsNyBAQAogCiBwYWNrYWdlIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0czsKIAotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSGVscGVyLkZJTExfVElNRU9VVF9NUzsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLlRpbWVvdXRzLkZJTExfVElNRU9VVDsKIAogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi50cnV0aC5UcnV0aC5hc3NlcnRXaXRoTWVzc2FnZTsKIApAQCAtNDcsOCArNDcsOCBAQAogICAgIH0KIAogICAgIHZvaWQgYXNzZXJ0QXV0b0ZpbGxlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBib29sZWFuIHNldCA9IGxhdGNoLmF3YWl0KEZJTExfVElNRU9VVF9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKLSAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoIlRpbWVvdXQgKCVzIG1zKSBvbiBSYWRpb0dyb3VwICVzIiwgRklMTF9USU1FT1VUX01TLCBuYW1lKQorICAgICAgICBmaW5hbCBib29sZWFuIHNldCA9IGxhdGNoLmF3YWl0KEZJTExfVElNRU9VVC5tcygpLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiVGltZW91dCAoJXMgbXMpIG9uIFJhZGlvR3JvdXAgJXMiLCBGSUxMX1RJTUVPVVQubXMoKSwgbmFtZSkKICAgICAgICAgICAgIC50aGF0KHNldCkuaXNUcnVlKCk7CiAgICAgICAgIGZpbmFsIGludCBhY3R1YWwgPSByYWRpb0dyb3VwLmdldENoZWNrZWRSYWRpb0J1dHRvbklkKCk7CiAgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJXcm9uZyBhdXRvLWZpbGwgdmFsdWUgb24gUmFkaW9Hcm91cCAlcyIsIG5hbWUpCmRpZmYgLS1naXQgYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9PbmVUaW1lU2V0dGluZ3NMaXN0ZW5lci5qYXZhIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvT25lVGltZVNldHRpbmdzTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcyMzM1Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9PbmVUaW1lU2V0dGluZ3NMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotcGFja2FnZSBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHM7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKLQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwotCi0vKioKLSAqIEhlbHBlciB1c2VkIHRvIGJsb2NrIHRlc3RzIHVudGlsIGEgc2VjdXJlIHNldHRpbmdzIHZhbHVlIGhhcyBiZWVuIHVwZGF0ZWQuCi0gKi8KLWZpbmFsIGNsYXNzIE9uZVRpbWVTZXR0aW5nc0xpc3RlbmVyIGV4dGVuZHMgQ29udGVudE9ic2VydmVyIHsKLSAgICBwcml2YXRlIGZpbmFsIENvdW50RG93bkxhdGNoIG1MYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKLSAgICBwcml2YXRlIGZpbmFsIENvbnRlbnRSZXNvbHZlciBtUmVzb2x2ZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUtleTsKLQotICAgIHB1YmxpYyBPbmVUaW1lU2V0dGluZ3NMaXN0ZW5lcihDb250ZXh0IGNvbnRleHQsIFN0cmluZyBrZXkpIHsKLSAgICAgICAgc3VwZXIobmV3IEhhbmRsZXIoTG9vcGVyLmdldE1haW5Mb29wZXIoKSkpOwotICAgICAgICBtS2V5ID0ga2V5OwotICAgICAgICBtUmVzb2x2ZXIgPSBjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOwotICAgICAgICBtUmVzb2x2ZXIucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoU2V0dGluZ3MuU2VjdXJlLmdldFVyaUZvcihrZXkpLCBmYWxzZSwgdGhpcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25DaGFuZ2UoYm9vbGVhbiBzZWxmQ2hhbmdlLCBVcmkgdXJpKSB7Ci0gICAgICAgIG1SZXNvbHZlci51bnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKHRoaXMpOwotICAgICAgICBtTGF0Y2guY291bnREb3duKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQmxvY2tzIGZvciBhIGZldyBzZWNvbmRzIHVudGlsIGl0J3MgY2FsbGVkLgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgaXQncyBub3QgY2FsbGVkLgotICAgICAqLwotICAgIHZvaWQgYXNzZXJ0Q2FsbGVkKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiB1cGRhdGVkID0gbUxhdGNoLmF3YWl0KDUsIFRpbWVVbml0LlNFQ09ORFMpOwotICAgICAgICAgICAgaWYgKCF1cGRhdGVkKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiU2V0dGluZ3MgIiArIG1LZXkgKyAiIG5vdCBjYWxsZWQgaW4gNXMiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pbnRlcnJ1cHQoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkludGVycnVwdGVkIiwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvT25lVGltZVNwaW5uZXJMaXN0ZW5lci5qYXZhIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvT25lVGltZVNwaW5uZXJMaXN0ZW5lci5qYXZhCmluZGV4IDZiYzgyNzkuLjVmYjU5NzMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL09uZVRpbWVTcGlubmVyTGlzdGVuZXIuamF2YQorKysgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9PbmVUaW1lU3Bpbm5lckxpc3RlbmVyLmphdmEKQEAgLTE2LDcgKzE2LDcgQEAKIAogcGFja2FnZSBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHM7CiAKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5GSUxMX1RJTUVPVVRfTVM7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5UaW1lb3V0cy5GSUxMX1RJTUVPVVQ7CiAKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24udHJ1dGguVHJ1dGguYXNzZXJ0V2l0aE1lc3NhZ2U7CiAKQEAgLTQ0LDggKzQ0LDggQEAKICAgICB9CiAKICAgICB2b2lkIGFzc2VydEF1dG9GaWxsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBzZXQgPSBsYXRjaC5hd2FpdChGSUxMX1RJTUVPVVRfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7Ci0gICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJUaW1lb3V0ICglcyBtcykgb24gU3Bpbm5lciAlcyIsIEZJTExfVElNRU9VVF9NUywgbmFtZSkKKyAgICAgICAgZmluYWwgYm9vbGVhbiBzZXQgPSBsYXRjaC5hd2FpdChGSUxMX1RJTUVPVVQubXMoKSwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoIlRpbWVvdXQgKCVzIG1zKSBvbiBTcGlubmVyICVzIiwgRklMTF9USU1FT1VULm1zKCksIG5hbWUpCiAgICAgICAgICAgICAudGhhdChzZXQpLmlzVHJ1ZSgpOwogICAgICAgICBmaW5hbCBpbnQgYWN0dWFsID0gc3Bpbm5lci5nZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpOwogICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiV3JvbmcgYXV0by1maWxsIHZhbHVlIG9uIFNwaW5uZXIgJXMiLCBuYW1lKQpkaWZmIC0tZ2l0IGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvT3B0aW9uYWxTYXZlQWN0aXZpdHlUZXN0LmphdmEgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9PcHRpb25hbFNhdmVBY3Rpdml0eVRlc3QuamF2YQppbmRleCBjODJmYTQyLi41YWFlZGRlIDEwMDY0NAotLS0gYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9PcHRpb25hbFNhdmVBY3Rpdml0eVRlc3QuamF2YQorKysgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9PcHRpb25hbFNhdmVBY3Rpdml0eVRlc3QuamF2YQpAQCAtMTUsNyArMTUsNiBAQAogICovCiBwYWNrYWdlIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0czsKIAotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSGVscGVyLmFzc2VydE5vRGFuZ2xpbmdTZXNzaW9uczsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5hc3NlcnRUZXh0QW5kVmFsdWU7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5IZWxwZXIuZmluZE5vZGVCeVJlc291cmNlSWQ7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5PcHRpb25hbFNhdmVBY3Rpdml0eS5JRF9BRERSRVNTMTsKQEAgLTI5LDEwICsyOCwxMSBAQAogaW1wb3J0IGFuZHJvaWQuYXBwLmFzc2lzdC5Bc3Npc3RTdHJ1Y3R1cmU7CiBpbXBvcnQgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkNhbm5lZEZpbGxSZXNwb25zZS5DYW5uZWREYXRhc2V0OwogaW1wb3J0IGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5JbnN0cnVtZW50ZWRBdXRvRmlsbFNlcnZpY2UuU2F2ZVJlcXVlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CiAKLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5Ob25OdWxsOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTnVsbGFibGU7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpAQCAtNDgsNiArNDgsNyBAQAogICogICA8bGk+RmF2b3JpdGUgQ29sb3I6IGRvbid0IGNhcmUgLSBMT0wKICAqIDwvdWw+CiAgKi8KK0BBcHBNb2RlRnVsbCAvLyBTZXJ2aWNlLXNwZWNpZmljIHRlc3QKIHB1YmxpYyBjbGFzcyBPcHRpb25hbFNhdmVBY3Rpdml0eVRlc3QgZXh0ZW5kcyBBdXRvRmlsbFNlcnZpY2VUZXN0Q2FzZSB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIEVYUEVDVF9OT19TQVZFX1VJID0gZmFsc2U7CkBAIC02NCwxMSArNjUsNiBAQAogICAgICAgICBtQWN0aXZpdHkgPSBtQWN0aXZpdHlSdWxlLmdldEFjdGl2aXR5KCk7CiAgICAgfQogCi0gICAgQEFmdGVyCi0gICAgcHVibGljIHZvaWQgZmluaXNoV2VsY29tZUFjdGl2aXR5KCkgewotICAgICAgICBXZWxjb21lQWN0aXZpdHkuZmluaXNoSXQoKTsKLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBDcmVhdGVzIGEgc3RhbmRhcmQgYnVpbGRlciBjb21tb24gdG8gYWxsIHRlc3RzLgogICAgICAqLwpAQCAtMTIyLDcgKzExOCw3IEBACiAgICAgICAgIG1BY3Rpdml0eS5zeW5jUnVuT25VaVRocmVhZCgoKSAtPiBtQWN0aXZpdHkubUFkZHJlc3MxLnJlcXVlc3RGb2N1cygpKTsKIAogICAgICAgICAvLyBTYW5pdHkgY2hlY2suCi0gICAgICAgIHNVaUJvdC5hc3NlcnROb0RhdGFzZXRzKCk7CisgICAgICAgIG1VaUJvdC5hc3NlcnROb0RhdGFzZXRzRXZlcigpOwogCiAgICAgICAgIC8vIFdhaXQgZm9yIG9uRmlsbCgpIGJlZm9yZSBwcm9jZWVkaW5nLCBvdGhlcndpc2UgdGhlIGZpZWxkcyBtaWdodCBiZSBjaGFuZ2VkIGJlZm9yZQogICAgICAgICAvLyB0aGUgc2Vzc2lvbiBzdGFydGVkLgpAQCAtMTM1LDE2ICsxMzEsMTMgQEAKICAgICAgICAgbUFjdGl2aXR5LnNhdmUoKTsKIAogICAgICAgICAvLyBBc3NlcnQgdGhlIHNuYWNrIGJhciBpcyBzaG93biBhbmQgdGFwICJTYXZlIi4KLSAgICAgICAgc1VpQm90LnNhdmVGb3JBdXRvZmlsbCh0cnVlLCBTQVZFX0RBVEFfVFlQRV9BRERSRVNTKTsKKyAgICAgICAgbVVpQm90LnNhdmVGb3JBdXRvZmlsbCh0cnVlLCBTQVZFX0RBVEFfVFlQRV9BRERSRVNTKTsKIAogICAgICAgICBmaW5hbCBTYXZlUmVxdWVzdCBzYXZlUmVxdWVzdCA9IHNSZXBsaWVyLmdldE5leHRTYXZlUmVxdWVzdCgpOwogICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgib25TYXZlKCkgbm90IGNhbGxlZCIpLnRoYXQoc2F2ZVJlcXVlc3QpLmlzTm90TnVsbCgpOwogCiAgICAgICAgIC8vIEFzc2VydCB2YWx1ZSBvZiBmaWVsZHMKICAgICAgICAgYXNzZXJ0aW9ucy52aXNpdChzYXZlUmVxdWVzdC5zdHJ1Y3R1cmUpOwotCi0gICAgICAgIC8vIE9uY2Ugc2F2ZWQsIHRoZSBzZXNzaW9uIHNob3VsZCBiZSBmaW5zaWhlZC4KLSAgICAgICAgYXNzZXJ0Tm9EYW5nbGluZ1Nlc3Npb25zKCk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTE4Miw3ICsxNzUsNyBAQAogICAgICAgICBtQWN0aXZpdHkuc3luY1J1bk9uVWlUaHJlYWQoKCkgLT4gbUFjdGl2aXR5Lm1BZGRyZXNzMS5yZXF1ZXN0Rm9jdXMoKSk7CiAKICAgICAgICAgLy8gU2FuaXR5IGNoZWNrLgotICAgICAgICBzVWlCb3QuYXNzZXJ0Tm9EYXRhc2V0cygpOworICAgICAgICBtVWlCb3QuYXNzZXJ0Tm9EYXRhc2V0c0V2ZXIoKTsKIAogICAgICAgICAvLyBXYWl0IGZvciBvbkZpbGwoKSBiZWZvcmUgcHJvY2VlZGluZywgb3RoZXJ3aXNlIHRoZSBmaWVsZHMgbWlnaHQgYmUgY2hhbmdlZCBiZWZvcmUKICAgICAgICAgLy8gdGhlIHNlc3Npb24gc3RhcnRlZC4KQEAgLTE5NSwxMCArMTg4LDcgQEAKICAgICAgICAgbUFjdGl2aXR5LnNhdmUoKTsKIAogICAgICAgICAvLyBBc3NlcnQgdGhlIHNuYWNrIGJhciBpcyBzaG93biBhbmQgdGFwICJTYXZlIi4KLSAgICAgICAgc1VpQm90LmFzc2VydFNhdmVOb3RTaG93aW5nKFNBVkVfREFUQV9UWVBFX0FERFJFU1MpOwotCi0gICAgICAgIC8vIE9uY2Ugc2F2ZWQsIHRoZSBzZXNzaW9uIHNob3VsZCBiZSBmaW5zaWhlZC4KLSAgICAgICAgYXNzZXJ0Tm9EYW5nbGluZ1Nlc3Npb25zKCk7CisgICAgICAgIG1VaUJvdC5hc3NlcnRTYXZlTm90U2hvd2luZyhTQVZFX0RBVEFfVFlQRV9BRERSRVNTKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMzIwLDcgKzMxMCw3IEBACiAgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwogCiAgICAgICAgIC8vIEF1dG8tZmlsbCBpdC4KLSAgICAgICAgc1VpQm90LnNlbGVjdERhdGFzZXQoIkRhIERhdGFzZXQiKTsKKyAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQoIkRhIERhdGFzZXQiKTsKIAogICAgICAgICAvLyBDaGVjayB0aGUgcmVzdWx0cy4KICAgICAgICAgbUFjdGl2aXR5LmFzc2VydEF1dG9GaWxsZWQoKTsKQEAgLTMzMiwxNiArMzIyLDEzIEBACiAgICAgICAgIG1BY3Rpdml0eS5zYXZlKCk7CiAKICAgICAgICAgLy8gQXNzZXJ0IHRoZSBzbmFjayBiYXIgaXMgc2hvd24gYW5kIHRhcCAiU2F2ZSIuCi0gICAgICAgIHNVaUJvdC5zYXZlRm9yQXV0b2ZpbGwodHJ1ZSwgU0FWRV9EQVRBX1RZUEVfQUREUkVTUyk7CisgICAgICAgIG1VaUJvdC5zYXZlRm9yQXV0b2ZpbGwodHJ1ZSwgU0FWRV9EQVRBX1RZUEVfQUREUkVTUyk7CiAKICAgICAgICAgZmluYWwgU2F2ZVJlcXVlc3Qgc2F2ZVJlcXVlc3QgPSBzUmVwbGllci5nZXROZXh0U2F2ZVJlcXVlc3QoKTsKICAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoIm9uU2F2ZSgpIG5vdCBjYWxsZWQiKS50aGF0KHNhdmVSZXF1ZXN0KS5pc05vdE51bGwoKTsKIAogICAgICAgICAvLyBBc3NlcnQgdmFsdWUgb2YgZmllbGRzCiAgICAgICAgIGFzc2VydGlvbnMudmlzaXQoc2F2ZVJlcXVlc3Quc3RydWN0dXJlKTsKLQotICAgICAgICAvLyBPbmNlIHNhdmVkLCB0aGUgc2Vzc2lvbiBzaG91bGQgYmUgZmluc2loZWQuCi0gICAgICAgIGFzc2VydE5vRGFuZ2xpbmdTZXNzaW9ucygpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC00MTksNyArNDA2LDcgQEAKICAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CiAKICAgICAgICAgLy8gQXV0by1maWxsIGl0LgotICAgICAgICBzVWlCb3Quc2VsZWN0RGF0YXNldCgiRGEgRGF0YXNldCIpOworICAgICAgICBtVWlCb3Quc2VsZWN0RGF0YXNldCgiRGEgRGF0YXNldCIpOwogCiAgICAgICAgIC8vIENoZWNrIHRoZSByZXN1bHRzLgogICAgICAgICBtQWN0aXZpdHkuYXNzZXJ0QXV0b0ZpbGxlZCgpOwpAQCAtNDMxLDEwICs0MTgsNyBAQAogICAgICAgICBtQWN0aXZpdHkuc2F2ZSgpOwogCiAgICAgICAgIC8vIEFzc2VydCB0aGUgc25hY2sgYmFyIGlzIG5vdCBzaG93bi4KLSAgICAgICAgc1VpQm90LmFzc2VydFNhdmVOb3RTaG93aW5nKFNBVkVfREFUQV9UWVBFX0FERFJFU1MpOwotCi0gICAgICAgIC8vIE9uY2Ugc2F2ZWQsIHRoZSBzZXNzaW9uIHNob3VsZCBiZSBmaW5zaWhlZC4KLSAgICAgICAgYXNzZXJ0Tm9EYW5nbGluZ1Nlc3Npb25zKCk7CisgICAgICAgIG1VaUJvdC5hc3NlcnRTYXZlTm90U2hvd2luZyhTQVZFX0RBVEFfVFlQRV9BRERSRVNTKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtNTg1LDE2ICs1NjksMTYgQEAKIAogICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHNuYWNrIGJhciBpcyBub3Qgc2hvd24uCiAgICAgICAgIGlmIChleHBlY3RTYXZlVWkpIHsKLSAgICAgICAgICAgIHNVaUJvdC5hc3NlcnRTYXZlU2hvd2luZyhTQVZFX0RBVEFfVFlQRV9BRERSRVNTKTsKKyAgICAgICAgICAgIG1VaUJvdC5hc3NlcnRTYXZlU2hvd2luZyhTQVZFX0RBVEFfVFlQRV9BRERSRVNTKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNVaUJvdC5hc3NlcnRTYXZlTm90U2hvd2luZyhTQVZFX0RBVEFfVFlQRV9BRERSRVNTKTsKKyAgICAgICAgICAgIG1VaUJvdC5hc3NlcnRTYXZlTm90U2hvd2luZyhTQVZFX0RBVEFfVFlQRV9BRERSRVNTKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIC4uLnRoZW4gdGFwIHNhdmUuCiAgICAgICAgIG1BY3Rpdml0eS5zYXZlKCk7CiAKICAgICAgICAgLy8gQXNzZXJ0IHRoZSBzbmFjayBiYXIgaXMgbm90IHNob3duLgotICAgICAgICBzVWlCb3QuYXNzZXJ0U2F2ZU5vdFNob3dpbmcoU0FWRV9EQVRBX1RZUEVfQUREUkVTUyk7CisgICAgICAgIG1VaUJvdC5hc3NlcnRTYXZlTm90U2hvd2luZyhTQVZFX0RBVEFfVFlQRV9BRERSRVNTKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtNjIxLDcgKzYwNSw3IEBACiAgICAgICAgIG1BY3Rpdml0eS5zeW5jUnVuT25VaVRocmVhZCgoKSAtPiBtQWN0aXZpdHkubUFkZHJlc3MxLnJlcXVlc3RGb2N1cygpKTsKICAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CiAKLSAgICAgICAgc1VpQm90LnNlbGVjdERhdGFzZXQoIlNGIik7CisgICAgICAgIG1VaUJvdC5zZWxlY3REYXRhc2V0KCJTRiIpOwogICAgICAgICBtQWN0aXZpdHkuYXNzZXJ0QXV0b0ZpbGxlZCgpOwogCiAgICAgICAgIC8vIENsZWFyIHRoZSBmaWVsZC4KQEAgLTYzMSw3ICs2MTUsNyBAQAogICAgICAgICBtQWN0aXZpdHkuc2F2ZSgpOwogCiAgICAgICAgIC8vIC4uLmFuZCBtYWtlIHN1cmUgdGhlIHNuYWNrIGJhciBpcyBub3Qgc2hvd24uCi0gICAgICAgIHNVaUJvdC5hc3NlcnRTYXZlTm90U2hvd2luZyhTQVZFX0RBVEFfVFlQRV9BRERSRVNTKTsKKyAgICAgICAgbVVpQm90LmFzc2VydFNhdmVOb3RTaG93aW5nKFNBVkVfREFUQV9UWVBFX0FERFJFU1MpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC02NTgsNyArNjQyLDcgQEAKICAgICAgICAgbUFjdGl2aXR5LnN5bmNSdW5PblVpVGhyZWFkKCgpIC0+IG1BY3Rpdml0eS5tQWRkcmVzczEucmVxdWVzdEZvY3VzKCkpOwogICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKIAotICAgICAgICBzVWlCb3Quc2VsZWN0RGF0YXNldCgiU0YiKTsKKyAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQoIlNGIik7CiAgICAgICAgIG1BY3Rpdml0eS5hc3NlcnRBdXRvRmlsbGVkKCk7CiAKICAgICAgICAgLy8gQ2xlYXIgdGhlIGZpZWxkLgpAQCAtNjY4LDcgKzY1Miw3IEBACiAgICAgICAgIG1BY3Rpdml0eS5zYXZlKCk7CiAKICAgICAgICAgLy8gLi4uYW5kIG1ha2Ugc3VyZSB0aGUgc25hY2sgYmFyIGlzIHNob3duLgotICAgICAgICBzVWlCb3Quc2F2ZUZvckF1dG9maWxsKHRydWUsIFNBVkVfREFUQV9UWVBFX0FERFJFU1MpOworICAgICAgICBtVWlCb3Quc2F2ZUZvckF1dG9maWxsKHRydWUsIFNBVkVfREFUQV9UWVBFX0FERFJFU1MpOwogCiAgICAgICAgIC8vIEZpbmFsbHksIGFzc2VydCB2YWx1ZXMuCiAgICAgICAgIGZpbmFsIFNhdmVSZXF1ZXN0IHNhdmVSZXF1ZXN0ID0gc1JlcGxpZXIuZ2V0TmV4dFNhdmVSZXF1ZXN0KCk7CmRpZmYgLS1naXQgYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9PdXRPZlByb2Nlc3NMb2dpbkFjdGl2aXR5LmphdmEgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9PdXRPZlByb2Nlc3NMb2dpbkFjdGl2aXR5LmphdmEKaW5kZXggZmRjMTA1Yi4uZmY5NTVkZCAxMDA2NDQKLS0tIGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvT3V0T2ZQcm9jZXNzTG9naW5BY3Rpdml0eS5qYXZhCisrKyBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL091dE9mUHJvY2Vzc0xvZ2luQWN0aXZpdHkuamF2YQpAQCAtMTksMTAgKzE5LDExIEBACiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5Ob25OdWxsOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTnVsbGFibGU7CisKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvUGFydGl0aW9uZWRBY3Rpdml0eVRlc3QuamF2YSBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL1BhcnRpdGlvbmVkQWN0aXZpdHlUZXN0LmphdmEKaW5kZXggZDQ1ODk0MC4uZDM3YmQxNiAxMDA2NDQKLS0tIGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvUGFydGl0aW9uZWRBY3Rpdml0eVRlc3QuamF2YQorKysgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9QYXJ0aXRpb25lZEFjdGl2aXR5VGVzdC5qYXZhCkBAIC0yMyw2ICsyMyw4IEBACiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5HcmlkQWN0aXZpdHkuSURfTDNDMjsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkdyaWRBY3Rpdml0eS5JRF9MNEMxOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuR3JpZEFjdGl2aXR5LklEX0w0QzI7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5IZWxwZXIuVU5VU0VEX0FVVE9GSUxMX1ZBTFVFOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSGVscGVyLmFzc2VydEhhc0ZsYWdzOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSGVscGVyLmFzc2VydFRleHRJc1Nhbml0aXplZDsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5hc3NlcnRWYWx1ZTsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5nZXRDb250ZXh0OwpAQCAtNDUsMTYgKzQ3LDE5IEBACiBpbXBvcnQgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkluc3RydW1lbnRlZEF1dG9GaWxsU2VydmljZS5TYXZlUmVxdWVzdDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50U2VuZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIGltcG9ydCBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuRmlsbFJlc3BvbnNlOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlJlbW90ZVZpZXdzOwogCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAoraW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVvdXRFeGNlcHRpb247CisKIC8qKgogICogVGVzdCBjYXNlIGZvciBhbiBhY3Rpdml0eSBjb250YWluaW5nIG11bHRpcGxlIHBhcnRpdGlvbnMuCiAgKi8KK0BBcHBNb2RlRnVsbCAvLyBTZXJ2aWNlLXNwZWNpZmljIHRlc3QKIHB1YmxpYyBjbGFzcyBQYXJ0aXRpb25lZEFjdGl2aXR5VGVzdCBleHRlbmRzIEF1dG9GaWxsU2VydmljZVRlc3RDYXNlIHsKIAogICAgIEBSdWxlCkBAIC02OCw2ICs3MywzMCBAQAogICAgICAgICBtQWN0aXZpdHkgPSBtQWN0aXZpdHlSdWxlLmdldEFjdGl2aXR5KCk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogRm9jdXMgdG8gYSBjZWxsIGFuZCBleHBlY3Qgd2luZG93IGV2ZW50CisgICAgICovCisgICAgdm9pZCBmb2N1c0NlbGwoaW50IHJvdywgaW50IGNvbHVtbikgdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24geworICAgICAgICBtVWlCb3Qud2FpdEZvcldpbmRvd0NoYW5nZSgoKSAtPiBtQWN0aXZpdHkuZm9jdXNDZWxsKHJvdywgY29sdW1uKSwKKyAgICAgICAgICAgICAgICBUaW1lb3V0cy5VSV9USU1FT1VULmdldE1heFZhbHVlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZvY3VzIHRvIGEgY2VsbCBhbmQgZXhwZWN0IG5vIHdpbmRvdyBldmVudC4KKyAgICAgKi8KKyAgICB2b2lkIGZvY3VzQ2VsbE5vV2luZG93Q2hhbmdlKGludCByb3csIGludCBjb2x1bW4pIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIFRPRE86IGRlZmluZSBhIHNtYWxsIHZhbHVlIGluIFRpbWVvdXQKKyAgICAgICAgICAgIG1VaUJvdC53YWl0Rm9yV2luZG93Q2hhbmdlKCgpIC0+IG1BY3Rpdml0eS5mb2N1c0NlbGwocm93LCBjb2x1bW4pLAorICAgICAgICAgICAgICAgICAgICBUaW1lb3V0cy5VSV9USU1FT1VULm1zKCkpOworICAgICAgICB9IGNhdGNoIChUaW1lb3V0RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyBubyB3aW5kb3cgZXZlbnRzISBsb29raW5nIGdvb2QKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkV4cGVjdCBubyB3aW5kb3cgZXZlbnQgd2hlbiBmb2N1c2luZyB0byIKKyAgICAgICAgICAgICAgICArICIgY29sdW1uICVkIHJvdyAlZCwgYnV0IGV2ZW50IGhhcHBlbmVkIiwgcm93LCBjb2x1bW4pKTsKKyAgICB9CisKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvZmlsbFR3b1BhcnRpdGlvbnNTa2lwRmlyc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gU2V0IHNlcnZpY2UuCkBAIC04Myw3ICsxMTIsNyBAQAogICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShyZXNwb25zZTEpOwogCiAgICAgICAgIC8vIFRyaWdnZXIgYXV0by1maWxsIG9uIDFzdCBwYXJ0aXRpb24uCi0gICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoMSwgMSk7CisgICAgICAgIGZvY3VzQ2VsbCgxLCAxKTsKICAgICAgICAgZmluYWwgRmlsbFJlcXVlc3QgZmlsbFJlcXVlc3QxID0gc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CiAgICAgICAgIGFzc2VydFRoYXQoZmlsbFJlcXVlc3QxLmZsYWdzKS5pc0VxdWFsVG8oMCk7CiAgICAgICAgIGZpbmFsIFZpZXdOb2RlIHAxbDFjMSA9IGFzc2VydFRleHRJc1Nhbml0aXplZChmaWxsUmVxdWVzdDEuc3RydWN0dXJlLCBJRF9MMUMxKTsKQEAgLTkyLDkgKzEyMSw5IEBACiAgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJGb2N1cyBvbiBwMWwxYzIiKS50aGF0KHAxbDFjMi5pc0ZvY3VzZWQoKSkuaXNGYWxzZSgpOwogCiAgICAgICAgIC8vIE1ha2Ugc3VyZSBVSSBpcyBzaG93biwgYnV0IGRvbid0IHRhcCBpdC4KLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJsMWMxIik7Ci0gICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoMSwgMik7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnREYXRhc2V0cygibDFjMiIpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoImwxYzEiKTsKKyAgICAgICAgZm9jdXNDZWxsKDEsIDIpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoImwxYzIiKTsKIAogICAgICAgICAvLyBOb3cgdGFwIGEgZmllbGQgaW4gYSBkaWZmZXJlbnQgcGFydGl0aW9uCiAgICAgICAgIGZpbmFsIENhbm5lZEZpbGxSZXNwb25zZSByZXNwb25zZTIgPSBuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKQpAQCAtMTA2LDcgKzEzNSw3IEBACiAgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKHJlc3BvbnNlMik7CiAKICAgICAgICAgLy8gVHJpZ2dlciBhdXRvLWZpbGwgb24gMm5kIHBhcnRpdGlvbi4KLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgyLCAxKTsKKyAgICAgICAgZm9jdXNDZWxsKDIsIDEpOwogICAgICAgICBmaW5hbCBGaWxsUmVxdWVzdCBmaWxsUmVxdWVzdDIgPSBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKICAgICAgICAgYXNzZXJ0VGhhdChmaWxsUmVxdWVzdDIuZmxhZ3MpLmlzRXF1YWxUbygwKTsKICAgICAgICAgZmluYWwgVmlld05vZGUgcDJsMWMxID0gYXNzZXJ0VGV4dElzU2FuaXRpemVkKGZpbGxSZXF1ZXN0Mi5zdHJ1Y3R1cmUsIElEX0wxQzEpOwpAQCAtMTE4LDE2ICsxNDcsMTYgQEAKICAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoIkZvY3VzIG9uIHAybDJjMSIpLnRoYXQocDJsMmMxLmlzRm9jdXNlZCgpKS5pc1RydWUoKTsKICAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoIkZvY3VzIG9uIHAybDJjMiIpLnRoYXQocDJsMmMyLmlzRm9jdXNlZCgpKS5pc0ZhbHNlKCk7CiAgICAgICAgIC8vIE1ha2Ugc3VyZSBVSSBpcyBzaG93biwgYnV0IGRvbid0IHRhcCBpdC4KLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJsMmMxIik7Ci0gICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoMiwgMik7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnREYXRhc2V0cygibDJjMiIpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoImwyYzEiKTsKKyAgICAgICAgZm9jdXNDZWxsKDIsIDIpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoImwyYzIiKTsKIAogICAgICAgICAvLyBOb3cgZmlsbCB0aGVtCiAgICAgICAgIGZpbmFsIEZpbGxFeHBlY3RhdGlvbiBleHBlY3RhdGlvbjEgPSBtQWN0aXZpdHkuZXhwZWN0QXV0b2ZpbGwoKQogICAgICAgICAgICAgICAub25DZWxsKDEsIDEsICJsMWMxIikKICAgICAgICAgICAgICAgLm9uQ2VsbCgxLCAyLCAibDFjMiIpOwotICAgICAgICBtQWN0aXZpdHkuZm9jdXNDZWxsKDEsIDEpOwotICAgICAgICBzVWlCb3Quc2VsZWN0RGF0YXNldCgibDFjMSIpOworICAgICAgICBmb2N1c0NlbGwoMSwgMSk7CisgICAgICAgIG1VaUJvdC5zZWxlY3REYXRhc2V0KCJsMWMxIik7CiAgICAgICAgIGV4cGVjdGF0aW9uMS5hc3NlcnRBdXRvRmlsbGVkKCk7CiAKICAgICAgICAgLy8gQ2hhbmdlIHByZXZpb3VzIHZhbHVlcyB0byBtYWtlIHN1cmUgdGhleSBhcmUgbm90IGZpbGxlZCBhZ2FpbgpAQCAtMTM3LDggKzE2Niw4IEBACiAgICAgICAgIGZpbmFsIEZpbGxFeHBlY3RhdGlvbiBleHBlY3RhdGlvbjIgPSBtQWN0aXZpdHkuZXhwZWN0QXV0b2ZpbGwoKQogICAgICAgICAgICAgICAgIC5vbkNlbGwoMiwgMSwgImwyYzEiKQogICAgICAgICAgICAgICAgIC5vbkNlbGwoMiwgMiwgImwyYzIiKTsKLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgyLCAyKTsKLSAgICAgICAgc1VpQm90LnNlbGVjdERhdGFzZXQoImwyYzIiKTsKKyAgICAgICAgZm9jdXNDZWxsKDIsIDIpOworICAgICAgICBtVWlCb3Quc2VsZWN0RGF0YXNldCgibDJjMiIpOwogICAgICAgICBleHBlY3RhdGlvbjIuYXNzZXJ0QXV0b0ZpbGxlZCgpOwogCiAgICAgICAgIC8vIE1ha2Ugc3VyZSBwcmV2aW91cyBwYXJ0aXRpb24gZGlkbid0IGNoYW5nZQpAQCAtMTY2LDcgKzE5NSw3IEBACiAgICAgICAgICAgICAgICAgLm9uQ2VsbCgxLCAyLCAibDFjMiIpOwogCiAgICAgICAgIC8vIFRyaWdnZXIgYXV0by1maWxsLgotICAgICAgICBtQWN0aXZpdHkuZm9jdXNDZWxsKDEsIDEpOworICAgICAgICBmb2N1c0NlbGwoMSwgMSk7CiAgICAgICAgIGZpbmFsIEZpbGxSZXF1ZXN0IGZpbGxSZXF1ZXN0MSA9IHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwogICAgICAgICBhc3NlcnRUaGF0KGZpbGxSZXF1ZXN0MS5mbGFncykuaXNFcXVhbFRvKDApOwogCkBAIC0xNzQsNyArMjAzLDcgQEAKICAgICAgICAgYXNzZXJ0VGV4dElzU2FuaXRpemVkKGZpbGxSZXF1ZXN0MS5zdHJ1Y3R1cmUsIElEX0wxQzIpOwogCiAgICAgICAgIC8vIEF1dG8tZmlsbCBpdC4KLSAgICAgICAgc1VpQm90LnNlbGVjdERhdGFzZXQoIlBhcnRpdGlvbiAxIik7CisgICAgICAgIG1VaUJvdC5zZWxlY3REYXRhc2V0KCJQYXJ0aXRpb24gMSIpOwogCiAgICAgICAgIC8vIENoZWNrIHRoZSByZXN1bHRzLgogICAgICAgICBleHBlY3RhdGlvbjEuYXNzZXJ0QXV0b0ZpbGxlZCgpOwpAQCAtMTk0LDcgKzIyMyw3IEBACiAgICAgICAgICAgICAgICAgLm9uQ2VsbCgyLCAyLCAibDJjMiIpOwogCiAgICAgICAgIC8vIFRyaWdnZXIgYXV0by1maWxsLgotICAgICAgICBtQWN0aXZpdHkuZm9jdXNDZWxsKDIsIDEpOworICAgICAgICBmb2N1c0NlbGwoMiwgMSk7CiAgICAgICAgIGZpbmFsIEZpbGxSZXF1ZXN0IGZpbGxSZXF1ZXN0MiA9IHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwogICAgICAgICBhc3NlcnRUaGF0KGZpbGxSZXF1ZXN0Mi5mbGFncykuaXNFcXVhbFRvKDApOwogCkBAIC0yMDQsNyArMjMzLDcgQEAKICAgICAgICAgYXNzZXJ0VGV4dElzU2FuaXRpemVkKGZpbGxSZXF1ZXN0Mi5zdHJ1Y3R1cmUsIElEX0wyQzIpOwogCiAgICAgICAgIC8vIEF1dG8tZmlsbCBpdC4KLSAgICAgICAgc1VpQm90LnNlbGVjdERhdGFzZXQoIlBhcnRpdGlvbiAyIik7CisgICAgICAgIG1VaUJvdC5zZWxlY3REYXRhc2V0KCJQYXJ0aXRpb24gMiIpOwogCiAgICAgICAgIC8vIENoZWNrIHRoZSByZXN1bHRzLgogICAgICAgICBleHBlY3RhdGlvbjIuYXNzZXJ0QXV0b0ZpbGxlZCgpOwpAQCAtMjUzLDcgKzI4Miw3IEBACiAgICAgICAgIGFzc2VydFRleHRJc1Nhbml0aXplZChmaWxsUmVxdWVzdDEuc3RydWN0dXJlLCBJRF9MMUMyKTsKIAogICAgICAgICAvLyBBdXRvLWZpbGwgaXQuCi0gICAgICAgIHNVaUJvdC5zZWxlY3REYXRhc2V0KCJQYXJ0aXRpb24gMSIpOworICAgICAgICBtVWlCb3Quc2VsZWN0RGF0YXNldCgiUGFydGl0aW9uIDEiKTsKIAogICAgICAgICAvLyBDaGVjayB0aGUgcmVzdWx0cy4KICAgICAgICAgZXhwZWN0YXRpb24xLmFzc2VydEF1dG9GaWxsZWQoKTsKQEAgLTI4Nyw3ICszMTYsNyBAQAogICAgICAgICBhc3NlcnRUZXh0SXNTYW5pdGl6ZWQoZmlsbFJlcXVlc3QyLnN0cnVjdHVyZSwgSURfTDJDMik7CiAKICAgICAgICAgLy8gQXV0by1maWxsIGl0LgotICAgICAgICBzVWlCb3Quc2VsZWN0RGF0YXNldCgiUGFydGl0aW9uIDIiKTsKKyAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQoIlBhcnRpdGlvbiAyIik7CiAKICAgICAgICAgLy8gQ2hlY2sgdGhlIHJlc3VsdHMuCiAgICAgICAgIGV4cGVjdGF0aW9uMi5hc3NlcnRBdXRvRmlsbGVkKCk7CkBAIC0zMjMsNyArMzUyLDcgQEAKICAgICAgICAgYXNzZXJ0VGV4dElzU2FuaXRpemVkKGZpbGxSZXF1ZXN0My5zdHJ1Y3R1cmUsIElEX0wzQzIpOwogCiAgICAgICAgIC8vIEF1dG8tZmlsbCBpdC4KLSAgICAgICAgc1VpQm90LnNlbGVjdERhdGFzZXQoIlBhcnRpdGlvbiAzIik7CisgICAgICAgIG1VaUJvdC5zZWxlY3REYXRhc2V0KCJQYXJ0aXRpb24gMyIpOwogCiAgICAgICAgIC8vIENoZWNrIHRoZSByZXN1bHRzLgogICAgICAgICBleHBlY3RhdGlvbjMuYXNzZXJ0QXV0b0ZpbGxlZCgpOwpAQCAtMzYxLDcgKzM5MCw3IEBACiAgICAgICAgIGFzc2VydFRleHRJc1Nhbml0aXplZChmaWxsUmVxdWVzdDQuc3RydWN0dXJlLCBJRF9MNEMyKTsKIAogICAgICAgICAvLyBBdXRvLWZpbGwgaXQuCi0gICAgICAgIHNVaUJvdC5zZWxlY3REYXRhc2V0KCJQYXJ0aXRpb24gNCIpOworICAgICAgICBtVWlCb3Quc2VsZWN0RGF0YXNldCgiUGFydGl0aW9uIDQiKTsKIAogICAgICAgICAvLyBDaGVjayB0aGUgcmVzdWx0cy4KICAgICAgICAgZXhwZWN0YXRpb240LmFzc2VydEF1dG9GaWxsZWQoKTsKQEAgLTM4Nyw3ICs0MTYsNyBAQAogICAgICAgICAgICAgICAgIC5vbkNlbGwoMSwgMiwgImwxYzIiKTsKIAogICAgICAgICAvLyBUcmlnZ2VyIGF1dG8tZmlsbC4KLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgxLCAxKTsKKyAgICAgICAgZm9jdXNDZWxsKDEsIDEpOwogICAgICAgICBmaW5hbCBGaWxsUmVxdWVzdCBmaWxsUmVxdWVzdDEgPSBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKICAgICAgICAgYXNzZXJ0VGhhdChmaWxsUmVxdWVzdDEuZmxhZ3MpLmlzRXF1YWxUbygwKTsKIApAQCAtMzk1LDcgKzQyNCw3IEBACiAgICAgICAgIGFzc2VydFRleHRJc1Nhbml0aXplZChmaWxsUmVxdWVzdDEuc3RydWN0dXJlLCBJRF9MMUMyKTsKIAogICAgICAgICAvLyBBdXRvLWZpbGwgaXQuCi0gICAgICAgIHNVaUJvdC5zZWxlY3REYXRhc2V0KCJQYXJ0aXRpb24gMSIpOworICAgICAgICBtVWlCb3Quc2VsZWN0RGF0YXNldCgiUGFydGl0aW9uIDEiKTsKIAogICAgICAgICAvLyBDaGVjayB0aGUgcmVzdWx0cy4KICAgICAgICAgZXhwZWN0YXRpb24xLmFzc2VydEF1dG9GaWxsZWQoKTsKQEAgLTQyMCw3ICs0NDksNyBAQAogICAgICAgICAvLyBUcmlnZ2VyIGF1dG8tZmlsbC4KICAgICAgICAgbUFjdGl2aXR5LmZvcmNlQXV0b2ZpbGwoMiwgMSk7CiAgICAgICAgIGZpbmFsIEZpbGxSZXF1ZXN0IGZpbGxSZXF1ZXN0MiA9IHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwotICAgICAgICBhc3NlcnRUaGF0KGZpbGxSZXF1ZXN0Mi5mbGFncykuaXNFcXVhbFRvKEZMQUdfTUFOVUFMX1JFUVVFU1QpOworICAgICAgICBhc3NlcnRIYXNGbGFncyhmaWxsUmVxdWVzdDIuZmxhZ3MsIEZMQUdfTUFOVUFMX1JFUVVFU1QpOwogCiAgICAgICAgIGFzc2VydFZhbHVlKGZpbGxSZXF1ZXN0Mi5zdHJ1Y3R1cmUsIElEX0wxQzEsICJsMWMxIik7CiAgICAgICAgIGFzc2VydFZhbHVlKGZpbGxSZXF1ZXN0Mi5zdHJ1Y3R1cmUsIElEX0wxQzIsICJsMWMyIik7CkBAIC00MjgsNyArNDU3LDcgQEAKICAgICAgICAgYXNzZXJ0VGV4dElzU2FuaXRpemVkKGZpbGxSZXF1ZXN0Mi5zdHJ1Y3R1cmUsIElEX0wyQzIpOwogCiAgICAgICAgIC8vIEF1dG8tZmlsbCBpdC4KLSAgICAgICAgc1VpQm90LnNlbGVjdERhdGFzZXQoIlBhcnRpdGlvbiAyIik7CisgICAgICAgIG1VaUJvdC5zZWxlY3REYXRhc2V0KCJQYXJ0aXRpb24gMiIpOwogCiAgICAgICAgIC8vIENoZWNrIHRoZSByZXN1bHRzLgogICAgICAgICBleHBlY3RhdGlvbjIuYXNzZXJ0QXV0b0ZpbGxlZCgpOwpAQCAtNDQ4LDcgKzQ3Nyw3IEBACiAgICAgICAgICAgICAgICAgLm9uQ2VsbCgzLCAyLCAibDNjMiIpOwogCiAgICAgICAgIC8vIFRyaWdnZXIgYXV0by1maWxsLgotICAgICAgICBtQWN0aXZpdHkuZm9jdXNDZWxsKDMsIDEpOworICAgICAgICBmb2N1c0NlbGwoMywgMSk7CiAgICAgICAgIGZpbmFsIEZpbGxSZXF1ZXN0IGZpbGxSZXF1ZXN0MyA9IHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwogICAgICAgICBhc3NlcnRUaGF0KGZpbGxSZXF1ZXN0My5mbGFncykuaXNFcXVhbFRvKDApOwogCkBAIC00NjAsNyArNDg5LDcgQEAKICAgICAgICAgYXNzZXJ0VGV4dElzU2FuaXRpemVkKGZpbGxSZXF1ZXN0My5zdHJ1Y3R1cmUsIElEX0wzQzIpOwogCiAgICAgICAgIC8vIEF1dG8tZmlsbCBpdC4KLSAgICAgICAgc1VpQm90LnNlbGVjdERhdGFzZXQoIlBhcnRpdGlvbiAzIik7CisgICAgICAgIG1VaUJvdC5zZWxlY3REYXRhc2V0KCJQYXJ0aXRpb24gMyIpOwogCiAgICAgICAgIC8vIENoZWNrIHRoZSByZXN1bHRzLgogICAgICAgICBleHBlY3RhdGlvbjMuYXNzZXJ0QXV0b0ZpbGxlZCgpOwpAQCAtNDg0LDcgKzUxMyw3IEBACiAgICAgICAgIC8vIFRyaWdnZXIgYXV0by1maWxsLgogICAgICAgICBtQWN0aXZpdHkuZm9yY2VBdXRvZmlsbCg0LCAxKTsKICAgICAgICAgZmluYWwgRmlsbFJlcXVlc3QgZmlsbFJlcXVlc3Q0ID0gc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7Ci0gICAgICAgIGFzc2VydFRoYXQoZmlsbFJlcXVlc3Q0LmZsYWdzKS5pc0VxdWFsVG8oRkxBR19NQU5VQUxfUkVRVUVTVCk7CisgICAgICAgIGFzc2VydEhhc0ZsYWdzKGZpbGxSZXF1ZXN0NC5mbGFncywgRkxBR19NQU5VQUxfUkVRVUVTVCk7CiAKICAgICAgICAgYXNzZXJ0VmFsdWUoZmlsbFJlcXVlc3Q0LnN0cnVjdHVyZSwgSURfTDFDMSwgImwxYzEiKTsKICAgICAgICAgYXNzZXJ0VmFsdWUoZmlsbFJlcXVlc3Q0LnN0cnVjdHVyZSwgSURfTDFDMiwgImwxYzIiKTsKQEAgLTQ5Niw3ICs1MjUsNyBAQAogICAgICAgICBhc3NlcnRUZXh0SXNTYW5pdGl6ZWQoZmlsbFJlcXVlc3Q0LnN0cnVjdHVyZSwgSURfTDRDMik7CiAKICAgICAgICAgLy8gQXV0by1maWxsIGl0LgotICAgICAgICBzVWlCb3Quc2VsZWN0RGF0YXNldCgiUGFydGl0aW9uIDQiKTsKKyAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQoIlBhcnRpdGlvbiA0Iik7CiAKICAgICAgICAgLy8gQ2hlY2sgdGhlIHJlc3VsdHMuCiAgICAgICAgIGV4cGVjdGF0aW9uNC5hc3NlcnRBdXRvRmlsbGVkKCk7CkBAIC01MjEsMTEgKzU1MCwxMSBAQAogICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShyZXNwb25zZTEpOwogCiAgICAgICAgIC8vIFRyaWdnZXIgYXV0by1maWxsIG9uIDFzdCBwYXJ0aXRpb24uCi0gICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoMSwgMSk7CisgICAgICAgIGZvY3VzQ2VsbCgxLCAxKTsKICAgICAgICAgZmluYWwgRmlsbFJlcXVlc3QgZmlsbFJlcXVlc3QxID0gc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CiAgICAgICAgIGFzc2VydFRoYXQoZmlsbFJlcXVlc3QxLmZsYWdzKS5pc0VxdWFsVG8oMCk7CiAgICAgICAgIGFzc2VydFRoYXQoZmlsbFJlcXVlc3QxLmRhdGEpLmlzTnVsbCgpOwotICAgICAgICBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoImwxYzEiKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJsMWMxIik7CiAKICAgICAgICAgLy8gUHJlcGFyZSAybmQgcGFydGl0aW9uOyBpdCByZXBsYWNlcyAnbnVtYmVyJyBhbmQgYWRkcyAnbnVtYmVyczInCiAgICAgICAgIGV4dHJhcy5jbGVhcigpOwpAQCAtNTQyLDcgKzU3MSw3IEBACiAgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKHJlc3BvbnNlMik7CiAKICAgICAgICAgLy8gVHJpZ2dlciBhdXRvLWZpbGwgb24gMm5kIHBhcnRpdGlvbgotICAgICAgICBtQWN0aXZpdHkuZm9jdXNDZWxsKDIsIDEpOworICAgICAgICBmb2N1c0NlbGwoMiwgMSk7CiAgICAgICAgIGZpbmFsIEZpbGxSZXF1ZXN0IGZpbGxSZXF1ZXN0MiA9IHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwogICAgICAgICBhc3NlcnRUaGF0KGZpbGxSZXF1ZXN0Mi5mbGFncykuaXNFcXVhbFRvKDApOwogICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgibnVsbCBidW5kbGUgb24gcmVxdWVzdCAyIikudGhhdChmaWxsUmVxdWVzdDIuZGF0YSkuaXNOb3ROdWxsKCk7CkBAIC01NjEsNyArNTkwLDcgQEAKICAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UocmVzcG9uc2UzKTsKIAogICAgICAgICAvLyBUcmlnZ2VyIGF1dG8tZmlsbCBvbiAzcmQgcGFydGl0aW9uCi0gICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoMywgMSk7CisgICAgICAgIGZvY3VzQ2VsbCgzLCAxKTsKICAgICAgICAgZmluYWwgRmlsbFJlcXVlc3QgZmlsbFJlcXVlc3QzID0gc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CiAgICAgICAgIGFzc2VydFRoYXQoZmlsbFJlcXVlc3QzLmZsYWdzKS5pc0VxdWFsVG8oMCk7CiAgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJudWxsIGJ1bmRsZSBvbiByZXF1ZXN0IDMiKS50aGF0KGZpbGxSZXF1ZXN0Mi5kYXRhKS5pc05vdE51bGwoKTsKQEAgLTU4Niw3ICs2MTUsNyBAQAogICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShyZXNwb25zZTQpOwogCiAgICAgICAgIC8vIFRyaWdnZXIgYXV0by1maWxsIG9uIDR0aCBwYXJ0aXRpb24KLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCg0LCAxKTsKKyAgICAgICAgZm9jdXNDZWxsKDQsIDEpOwogICAgICAgICBmaW5hbCBGaWxsUmVxdWVzdCBmaWxsUmVxdWVzdDQgPSBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKICAgICAgICAgYXNzZXJ0VGhhdChmaWxsUmVxdWVzdDQuZmxhZ3MpLmlzRXF1YWxUbygwKTsKICAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoIm5vbi1udWxsIGJ1bmRsZSBvbiByZXF1ZXN0IDQiKS50aGF0KGZpbGxSZXF1ZXN0NC5kYXRhKS5pc051bGwoKTsKQEAgLTU5NSw3ICs2MjQsNyBAQAogICAgICAgICBtQWN0aXZpdHkuc2V0VGV4dCgxLCAxLCAiTDFDMSIpOwogICAgICAgICBtQWN0aXZpdHkuc2F2ZSgpOwogCi0gICAgICAgIHNVaUJvdC5zYXZlRm9yQXV0b2ZpbGwodHJ1ZSwgU0FWRV9EQVRBX1RZUEVfUEFTU1dPUkQpOworICAgICAgICBtVWlCb3Quc2F2ZUZvckF1dG9maWxsKHRydWUsIFNBVkVfREFUQV9UWVBFX1BBU1NXT1JEKTsKICAgICAgICAgZmluYWwgU2F2ZVJlcXVlc3Qgc2F2ZVJlcXVlc3QgPSBzUmVwbGllci5nZXROZXh0U2F2ZVJlcXVlc3QoKTsKIAogICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgid3JvbmcgbnVtYmVyIG9mIGV4dHJhcyBvbiBzYXZlIHJlcXVlc3QgYnVuZGxlIikKQEAgLTYxNiw3ICs2NDUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCiAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CiAgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKHJlc3BvbnNlMSk7Ci0gICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoMSwgMSk7CisgICAgICAgIGZvY3VzQ2VsbCgxLCAxKTsKICAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CiAKICAgICAgICAgLy8gVHJpZ2dlciAybmQgcGFydGl0aW9uLgpAQCAtNjI4LDE0ICs2NTcsMTQgQEAKICAgICAgICAgICAgICAgICAuc2V0UmVxdWlyZWRTYXZhYmxlSWRzKFNBVkVfREFUQV9UWVBFX1BBU1NXT1JELCBJRF9MMkMxKQogICAgICAgICAgICAgICAgIC5idWlsZCgpOwogICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShyZXNwb25zZTIpOwotICAgICAgICBtQWN0aXZpdHkuZm9jdXNDZWxsKDIsIDEpOworICAgICAgICBmb2N1c0NlbGwoMiwgMSk7CiAgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwogCiAgICAgICAgIC8vIFRyaWdnZXIgc2F2ZQogICAgICAgICBtQWN0aXZpdHkuc2V0VGV4dCgyLCAxLCAiTDJDMSIpOwogICAgICAgICBtQWN0aXZpdHkuc2F2ZSgpOwogCi0gICAgICAgIHNVaUJvdC5zYXZlRm9yQXV0b2ZpbGwodHJ1ZSwgU0FWRV9EQVRBX1RZUEVfUEFTU1dPUkQpOworICAgICAgICBtVWlCb3Quc2F2ZUZvckF1dG9maWxsKHRydWUsIFNBVkVfREFUQV9UWVBFX1BBU1NXT1JEKTsKICAgICAgICAgZmluYWwgU2F2ZVJlcXVlc3Qgc2F2ZVJlcXVlc3QgPSBzUmVwbGllci5nZXROZXh0U2F2ZVJlcXVlc3QoKTsKICAgICAgICAgYXNzZXJ0VmFsdWUoc2F2ZVJlcXVlc3Quc3RydWN0dXJlLCBJRF9MMkMxLCAiTDJDMSIpOwogICAgIH0KQEAgLTY1Myw3ICs2ODIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCiAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CiAgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKHJlc3BvbnNlMSk7Ci0gICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoMSwgMSk7CisgICAgICAgIGZvY3VzQ2VsbCgxLCAxKTsKICAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CiAKICAgICAgICAgLy8gVHJpZ2dlciAybmQgcGFydGl0aW9uLgpAQCAtNjY1LDE0ICs2OTQsMTQgQEAKICAgICAgICAgICAgICAgICAuc2V0UmVxdWlyZWRTYXZhYmxlSWRzKFNBVkVfREFUQV9UWVBFX1BBU1NXT1JELCBJRF9MMUMxKQogICAgICAgICAgICAgICAgIC5idWlsZCgpOwogICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShyZXNwb25zZTIpOwotICAgICAgICBtQWN0aXZpdHkuZm9jdXNDZWxsKDIsIDEpOworICAgICAgICBmb2N1c0NlbGwoMiwgMSk7CiAgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwogCiAgICAgICAgIC8vIFRyaWdnZXIgc2F2ZQogICAgICAgICBtQWN0aXZpdHkuc2V0VGV4dCgxLCAxLCAiTDFDMSIpOwogICAgICAgICBtQWN0aXZpdHkuc2F2ZSgpOwogCi0gICAgICAgIHNVaUJvdC5zYXZlRm9yQXV0b2ZpbGwodHJ1ZSwgU0FWRV9EQVRBX1RZUEVfUEFTU1dPUkQpOworICAgICAgICBtVWlCb3Quc2F2ZUZvckF1dG9maWxsKHRydWUsIFNBVkVfREFUQV9UWVBFX1BBU1NXT1JEKTsKICAgICAgICAgZmluYWwgU2F2ZVJlcXVlc3Qgc2F2ZVJlcXVlc3QgPSBzUmVwbGllci5nZXROZXh0U2F2ZVJlcXVlc3QoKTsKICAgICAgICAgYXNzZXJ0VmFsdWUoc2F2ZVJlcXVlc3Quc3RydWN0dXJlLCBJRF9MMUMxLCAiTDFDMSIpOwogICAgIH0KQEAgLTY5MSw3ICs3MjAsNyBAQAogICAgICAgICAgICAgICAgIC5zZXRSZXF1aXJlZFNhdmFibGVJZHMoU0FWRV9EQVRBX1RZUEVfUEFTU1dPUkQsIElEX0wxQzEpCiAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CiAgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKHJlc3BvbnNlMSk7Ci0gICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoMSwgMSk7CisgICAgICAgIGZvY3VzQ2VsbCgxLCAxKTsKICAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CiAKICAgICAgICAgLy8gVHJpZ2dlciAybmQgcGFydGl0aW9uLgpAQCAtNzA0LDcgKzczMyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBJRF9MMkMxKQogICAgICAgICAgICAgICAgIC5idWlsZCgpOwogICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShyZXNwb25zZTIpOwotICAgICAgICBtQWN0aXZpdHkuZm9jdXNDZWxsKDIsIDEpOworICAgICAgICBmb2N1c0NlbGwoMiwgMSk7CiAgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwogCiAgICAgICAgIC8vIFRyaWdnZXIgc2F2ZQpAQCAtNzEyLDcgKzc0MSw3IEBACiAgICAgICAgIG1BY3Rpdml0eS5zZXRUZXh0KDIsIDEsICJMMkMxIik7CiAgICAgICAgIG1BY3Rpdml0eS5zYXZlKCk7CiAKLSAgICAgICAgc1VpQm90LnNhdmVGb3JBdXRvZmlsbCh0cnVlLCBTQVZFX0RBVEFfVFlQRV9QQVNTV09SRCwgU0FWRV9EQVRBX1RZUEVfQ1JFRElUX0NBUkQpOworICAgICAgICBtVWlCb3Quc2F2ZUZvckF1dG9maWxsKHRydWUsIFNBVkVfREFUQV9UWVBFX1BBU1NXT1JELCBTQVZFX0RBVEFfVFlQRV9DUkVESVRfQ0FSRCk7CiAgICAgICAgIGZpbmFsIFNhdmVSZXF1ZXN0IHNhdmVSZXF1ZXN0ID0gc1JlcGxpZXIuZ2V0TmV4dFNhdmVSZXF1ZXN0KCk7CiAgICAgICAgIGFzc2VydFZhbHVlKHNhdmVSZXF1ZXN0LnN0cnVjdHVyZSwgSURfTDFDMSwgIkwxQzEiKTsKICAgICAgICAgYXNzZXJ0VmFsdWUoc2F2ZVJlcXVlc3Quc3RydWN0dXJlLCBJRF9MMkMxLCAiTDJDMSIpOwpAQCAtNzMyLDcgKzc2MSw3IEBACiAgICAgICAgICAgICAgICAgLnNldFJlcXVpcmVkU2F2YWJsZUlkcyhTQVZFX0RBVEFfVFlQRV9QQVNTV09SRCwgSURfTDFDMSkKICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKICAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UocmVzcG9uc2UxKTsKLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgxLCAxKTsKKyAgICAgICAgZm9jdXNDZWxsKDEsIDEpOwogICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKIAogICAgICAgICAvLyBUcmlnZ2VyIDJuZCBwYXJ0aXRpb24uCkBAIC03NDUsNyArNzc0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIElEX0wyQzEpCiAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CiAgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKHJlc3BvbnNlMik7Ci0gICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoMiwgMSk7CisgICAgICAgIGZvY3VzQ2VsbCgyLCAxKTsKICAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CiAKICAgICAgICAgLy8gVHJpZ2dlciAzcmQgcGFydGl0aW9uLgpAQCAtNzU4LDcgKzc4Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB8IFNBVkVfREFUQV9UWVBFX1VTRVJOQU1FLCBJRF9MM0MxKQogICAgICAgICAgICAgICAgIC5idWlsZCgpOwogICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShyZXNwb25zZTMpOwotICAgICAgICBtQWN0aXZpdHkuZm9jdXNDZWxsKDMsIDEpOworICAgICAgICBmb2N1c0NlbGwoMywgMSk7CiAgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwogCiAgICAgICAgIC8vIFRyaWdnZXIgc2F2ZQpAQCAtNzY3LDcgKzc5Niw3IEBACiAgICAgICAgIG1BY3Rpdml0eS5zZXRUZXh0KDMsIDEsICJMM0MxIik7CiAgICAgICAgIG1BY3Rpdml0eS5zYXZlKCk7CiAKLSAgICAgICAgc1VpQm90LnNhdmVGb3JBdXRvZmlsbCh0cnVlLCBTQVZFX0RBVEFfVFlQRV9QQVNTV09SRCwgU0FWRV9EQVRBX1RZUEVfQ1JFRElUX0NBUkQsCisgICAgICAgIG1VaUJvdC5zYXZlRm9yQXV0b2ZpbGwodHJ1ZSwgU0FWRV9EQVRBX1RZUEVfUEFTU1dPUkQsIFNBVkVfREFUQV9UWVBFX0NSRURJVF9DQVJELAogICAgICAgICAgICAgICAgIFNBVkVfREFUQV9UWVBFX1VTRVJOQU1FKTsKICAgICAgICAgZmluYWwgU2F2ZVJlcXVlc3Qgc2F2ZVJlcXVlc3QgPSBzUmVwbGllci5nZXROZXh0U2F2ZVJlcXVlc3QoKTsKICAgICAgICAgYXNzZXJ0VmFsdWUoc2F2ZVJlcXVlc3Quc3RydWN0dXJlLCBJRF9MMUMxLCAiTDFDMSIpOwpAQCAtNzg5LDcgKzgxOCw3IEBACiAgICAgICAgICAgICAgICAgLnNldFJlcXVpcmVkU2F2YWJsZUlkcyhTQVZFX0RBVEFfVFlQRV9QQVNTV09SRCwgSURfTDFDMSkKICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKICAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UocmVzcG9uc2UxKTsKLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgxLCAxKTsKKyAgICAgICAgZm9jdXNDZWxsKDEsIDEpOwogICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKIAogICAgICAgICAvLyBUcmlnZ2VyIDJuZCBwYXJ0aXRpb24uCkBAIC04MDEsNyArODMwLDcgQEAKICAgICAgICAgICAgICAgICAuc2V0UmVxdWlyZWRTYXZhYmxlSWRzKFNBVkVfREFUQV9UWVBFX1BBU1NXT1JEIHwgU0FWRV9EQVRBX1RZUEVfR0VORVJJQywgSURfTDJDMSkKICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKICAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UocmVzcG9uc2UyKTsKLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgyLCAxKTsKKyAgICAgICAgZm9jdXNDZWxsKDIsIDEpOwogICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKIAogICAgICAgICAvLyBUcmlnZ2VyIDNyZCBwYXJ0aXRpb24uCkBAIC04MTUsNyArODQ0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIElEX0wzQzEpCiAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CiAgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKHJlc3BvbnNlMyk7Ci0gICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoMywgMSk7CisgICAgICAgIGZvY3VzQ2VsbCgzLCAxKTsKICAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CiAKIApAQCAtODI2LDcgKzg1NSw3IEBACiAgICAgICAgIG1BY3Rpdml0eS5zYXZlKCk7CiAKICAgICAgICAgLy8gTWFrZSBzdXJlIEdFTkVSSUMgdHlwZSBpcyBub3Qgc2hvd24gb24gc25hY2tiYXIKLSAgICAgICAgc1VpQm90LnNhdmVGb3JBdXRvZmlsbCh0cnVlLCBTQVZFX0RBVEFfVFlQRV9QQVNTV09SRCwgU0FWRV9EQVRBX1RZUEVfVVNFUk5BTUUpOworICAgICAgICBtVWlCb3Quc2F2ZUZvckF1dG9maWxsKHRydWUsIFNBVkVfREFUQV9UWVBFX1BBU1NXT1JELCBTQVZFX0RBVEFfVFlQRV9VU0VSTkFNRSk7CiAgICAgICAgIGZpbmFsIFNhdmVSZXF1ZXN0IHNhdmVSZXF1ZXN0ID0gc1JlcGxpZXIuZ2V0TmV4dFNhdmVSZXF1ZXN0KCk7CiAgICAgICAgIGFzc2VydFZhbHVlKHNhdmVSZXF1ZXN0LnN0cnVjdHVyZSwgSURfTDFDMSwgIkwxQzEiKTsKICAgICAgICAgYXNzZXJ0VmFsdWUoc2F2ZVJlcXVlc3Quc3RydWN0dXJlLCBJRF9MMkMxLCAiTDJDMSIpOwpAQCAtODQ3LDcgKzg3Niw3IEBACiAgICAgICAgICAgICAgICAgLnNldFJlcXVpcmVkU2F2YWJsZUlkcyhTQVZFX0RBVEFfVFlQRV9QQVNTV09SRCwgSURfTDFDMSkKICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKICAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UocmVzcG9uc2UxKTsKLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgxLCAxKTsKKyAgICAgICAgZm9jdXNDZWxsKDEsIDEpOwogICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKIAogICAgICAgICAvLyBUcmlnZ2VyIDJuZCBwYXJ0aXRpb24uCkBAIC04NjAsNyArODg5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIElEX0wyQzEpCiAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CiAgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKHJlc3BvbnNlMik7Ci0gICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoMiwgMSk7CisgICAgICAgIGZvY3VzQ2VsbCgyLCAxKTsKICAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CiAKICAgICAgICAgLy8gVHJpZ2dlciAzcmQgcGFydGl0aW9uLgpAQCAtODczLDcgKzkwMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB8IFNBVkVfREFUQV9UWVBFX1VTRVJOQU1FLCBJRF9MM0MxKQogICAgICAgICAgICAgICAgIC5idWlsZCgpOwogICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShyZXNwb25zZTMpOwotICAgICAgICBtQWN0aXZpdHkuZm9jdXNDZWxsKDMsIDEpOworICAgICAgICBmb2N1c0NlbGwoMywgMSk7CiAgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwogCiAgICAgICAgIC8vIFRyaWdnZXIgNHRoIHBhcnRpdGlvbi4KQEAgLTg4Niw3ICs5MTUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfCBTQVZFX0RBVEFfVFlQRV9VU0VSTkFNRSB8IFNBVkVfREFUQV9UWVBFX0FERFJFU1MsIElEX0w0QzEpCiAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CiAgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKHJlc3BvbnNlNCk7Ci0gICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoNCwgMSk7CisgICAgICAgIGZvY3VzQ2VsbCg0LCAxKTsKICAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CiAKIApAQCAtODk3LDcgKzkyNiw3IEBACiAgICAgICAgIG1BY3Rpdml0eS5zZXRUZXh0KDQsIDEsICJMNEMxIik7CiAgICAgICAgIG1BY3Rpdml0eS5zYXZlKCk7CiAKLSAgICAgICAgc1VpQm90LnNhdmVGb3JBdXRvZmlsbCh0cnVlLCBTQVZFX0RBVEFfVFlQRV9HRU5FUklDKTsKKyAgICAgICAgbVVpQm90LnNhdmVGb3JBdXRvZmlsbCh0cnVlLCBTQVZFX0RBVEFfVFlQRV9HRU5FUklDKTsKICAgICAgICAgZmluYWwgU2F2ZVJlcXVlc3Qgc2F2ZVJlcXVlc3QgPSBzUmVwbGllci5nZXROZXh0U2F2ZVJlcXVlc3QoKTsKICAgICAgICAgYXNzZXJ0VmFsdWUoc2F2ZVJlcXVlc3Quc3RydWN0dXJlLCBJRF9MMUMxLCAiTDFDMSIpOwogICAgICAgICBhc3NlcnRWYWx1ZShzYXZlUmVxdWVzdC5zdHJ1Y3R1cmUsIElEX0wyQzEsICJMMkMxIik7CkBAIC05MjEsNyArOTUwLDcgQEAKICAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UocmVzcG9uc2UxKTsKIAogICAgICAgICAvLyBUcmlnZ2VyIGF1dG8tZmlsbCBvbiAxc3QgcGFydGl0aW9uLgotICAgICAgICBtQWN0aXZpdHkuZm9jdXNDZWxsKDEsIDEpOworICAgICAgICBmb2N1c0NlbGwoMSwgMSk7CiAgICAgICAgIGZpbmFsIEZpbGxSZXF1ZXN0IGZpbGxSZXF1ZXN0MSA9IHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwogICAgICAgICBhc3NlcnRUaGF0KGZpbGxSZXF1ZXN0MS5mbGFncykuaXNFcXVhbFRvKDApOwogICAgICAgICBmaW5hbCBWaWV3Tm9kZSBwMWwxYzEgPSBhc3NlcnRUZXh0SXNTYW5pdGl6ZWQoZmlsbFJlcXVlc3QxLnN0cnVjdHVyZSwgSURfTDFDMSk7CkBAIC05MzAsMTUgKzk1OSwxNSBAQAogICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiRm9jdXMgb24gcDFsMWMyIikudGhhdChwMWwxYzIuaXNGb2N1c2VkKCkpLmlzRmFsc2UoKTsKIAogICAgICAgICAvLyBNYWtlIHN1cmUgVUkgaXMgc2hvd24gb24gMXN0IHBhcnRpdGlvbgotICAgICAgICBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoImwxYzEiKTsKLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgxLCAyKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJsMWMyIik7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cygibDFjMSIpOworICAgICAgICBmb2N1c0NlbGwoMSwgMik7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cygibDFjMiIpOwogCiAgICAgICAgIC8vIE1ha2Ugc3VyZSBVSSBpcyBub3Qgc2hvd24gb24gaWdub3JlZCBwYXJ0aXRpb24KLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgyLCAxKTsKLSAgICAgICAgc1VpQm90LmFzc2VydE5vRGF0YXNldHMoKTsKLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgyLCAyKTsKLSAgICAgICAgc1VpQm90LmFzc2VydE5vRGF0YXNldHMoKTsKKyAgICAgICAgZm9jdXNDZWxsKDIsIDEpOworICAgICAgICBtVWlCb3QuYXNzZXJ0Tm9EYXRhc2V0cygpOworICAgICAgICBmb2N1c0NlbGxOb1dpbmRvd0NoYW5nZSgyLCAyKTsKKyAgICAgICAgbVVpQm90LmFzc2VydE5vRGF0YXNldHNFdmVyKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC05NzEsNyArMTAwMCw3IEBACiAgICAgICAgICAgICAgICAgLm9uQ2VsbCgxLCAyLCAibDFjMiIpOwogCiAgICAgICAgIC8vIFRyaWdnZXIgcGFydGl0aW9uLgotICAgICAgICBtQWN0aXZpdHkuZm9jdXNDZWxsKDEsIDEpOworICAgICAgICBmb2N1c0NlbGwoMSwgMSk7CiAgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwogCiAKQEAgLTk5NSw3ICsxMDI0LDcgQEAKICAgICAgICAgICAgICAgICAub25DZWxsKDIsIDIsICJMMkMyIik7CiAKICAgICAgICAgLy8gVHJpZ2dlciBwYXJ0aXRpb24uCi0gICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoMiwgMSk7CisgICAgICAgIGZvY3VzQ2VsbCgyLCAxKTsKICAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CiAKICAgICAgICAgLyoqCkBAIC0xMDIwLDcgKzEwNDksNyBAQAogICAgICAgICAgICAgICAgIC5vbkNlbGwoMywgMiwgIkwzQzIiKTsKIAogICAgICAgICAvLyBUcmlnZ2VyIHBhcnRpdGlvbi4KLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgzLCAxKTsKKyAgICAgICAgZm9jdXNDZWxsKDMsIDEpOwogICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKIAogICAgICAgICAvKioKQEAgLTEwNDMsNDkgKzEwNzIsNDkgQEAKICAgICAgICAgICAgICAgICAub25DZWxsKDQsIDEsICJsNGMxIik7CiAKICAgICAgICAgLy8gVHJpZ2dlciBwYXJ0aXRpb24uCi0gICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoNCwgMSk7CisgICAgICAgIGZvY3VzQ2VsbCg0LCAxKTsKICAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CiAKICAgICAgICAgLyoKICAgICAgICAgICogIE5vdyBtb3ZlIGZvY3VzIGFyb3VuZCB0byBtYWtlIHN1cmUgdGhlIHByb3BlciB2YWx1ZXMgYXJlIGRpc3BsYXllZCBlYWNoIHRpbWUuCiAgICAgICAgICAqLwotICAgICAgICBtQWN0aXZpdHkuZm9jdXNDZWxsKDEsIDEpOwotICAgICAgICBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlAxRDEiLCAiUDFEMiIpOwotICAgICAgICBtQWN0aXZpdHkuZm9jdXNDZWxsKDEsIDIpOwotICAgICAgICBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlAxRDEiKTsKKyAgICAgICAgZm9jdXNDZWxsKDEsIDEpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlAxRDEiLCAiUDFEMiIpOworICAgICAgICBmb2N1c0NlbGwoMSwgMik7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cygiUDFEMSIpOwogCi0gICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoMiwgMSk7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnREYXRhc2V0cygiUDJEMSIpOwotICAgICAgICBtQWN0aXZpdHkuZm9jdXNDZWxsKDIsIDIpOwotICAgICAgICBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlAyRDEiLCAiUDJEMiIpOworICAgICAgICBmb2N1c0NlbGwoMiwgMSk7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cygiUDJEMSIpOworICAgICAgICBmb2N1c0NlbGwoMiwgMik7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cygiUDJEMSIsICJQMkQyIik7CiAKLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCg0LCAxKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJQNEQxIiwgIlA0RDIiKTsKLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCg0LCAyKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJQNEQyIik7CisgICAgICAgIGZvY3VzQ2VsbCg0LCAxKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJQNEQxIiwgIlA0RDIiKTsKKyAgICAgICAgZm9jdXNDZWxsKDQsIDIpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlA0RDIiKTsKIAotICAgICAgICBtQWN0aXZpdHkuZm9jdXNDZWxsKDMsIDIpOwotICAgICAgICBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlAzRDEiLCAiUDNEMiIpOwotICAgICAgICBtQWN0aXZpdHkuZm9jdXNDZWxsKDMsIDEpOwotICAgICAgICBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlAzRDEiLCAiUDNEMiIpOworICAgICAgICBmb2N1c0NlbGwoMywgMik7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cygiUDNEMSIsICJQM0QyIik7CisgICAgICAgIGZvY3VzQ2VsbCgzLCAxKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJQM0QxIiwgIlAzRDIiKTsKIAogICAgICAgICAvKgogICAgICAgICAgKiAgRmluYWxseSwgYXV0b2ZpbGwgYW5kIGNoZWNrIHJlc3VsdHMuCiAgICAgICAgICAqLwotICAgICAgICBtQWN0aXZpdHkuZm9jdXNDZWxsKDQsIDEpOwotICAgICAgICBzVWlCb3Quc2VsZWN0RGF0YXNldCgiUDREMSIpOworICAgICAgICBmb2N1c0NlbGwoNCwgMSk7CisgICAgICAgIG1VaUJvdC5zZWxlY3REYXRhc2V0KCJQNEQxIik7CiAgICAgICAgIGV4cGVjdGF0aW9uNC5hc3NlcnRBdXRvRmlsbGVkKCk7CiAKLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgxLCAxKTsKLSAgICAgICAgc1VpQm90LnNlbGVjdERhdGFzZXQoIlAxRDEiKTsKKyAgICAgICAgZm9jdXNDZWxsKDEsIDEpOworICAgICAgICBtVWlCb3Quc2VsZWN0RGF0YXNldCgiUDFEMSIpOwogICAgICAgICBleHBlY3RhdGlvbjEuYXNzZXJ0QXV0b0ZpbGxlZCgpOwogCi0gICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoMywgMSk7Ci0gICAgICAgIHNVaUJvdC5zZWxlY3REYXRhc2V0KCJQM0QyIik7CisgICAgICAgIGZvY3VzQ2VsbCgzLCAxKTsKKyAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQoIlAzRDIiKTsKICAgICAgICAgZXhwZWN0YXRpb24zLmFzc2VydEF1dG9GaWxsZWQoKTsKIAotICAgICAgICBtQWN0aXZpdHkuZm9jdXNDZWxsKDIsIDIpOwotICAgICAgICBzVWlCb3Quc2VsZWN0RGF0YXNldCgiUDJEMiIpOworICAgICAgICBmb2N1c0NlbGwoMiwgMik7CisgICAgICAgIG1VaUJvdC5zZWxlY3REYXRhc2V0KCJQMkQyIik7CiAgICAgICAgIGV4cGVjdGF0aW9uMi5hc3NlcnRBdXRvRmlsbGVkKCk7CiAgICAgfQogCkBAIC0xMTQxLDE0ICsxMTcwLDEzIEBACiAgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKHJlc3BvbnNlMSk7CiAKICAgICAgICAgLy8gVHJpZ2dlciBwYXJ0aXRpb24uCi0gICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoMSwgMSk7CisgICAgICAgIGZvY3VzQ2VsbCgxLCAxKTsKICAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CiAKICAgICAgICAgLy8gQXNzZXJ0cyBwcm9wZXIgZGF0YXNldHMgYXJlIHNob3duIG9uIGVhY2ggZmllbGQgZGVmaW5lZCBzbyBmYXIuCi0gICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoMSwgMSk7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnREYXRhc2V0cygiUDFEMSIsICJQMUQyIik7Ci0gICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoMSwgMik7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnREYXRhc2V0cygiUDFEMSIpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlAxRDEiLCAiUDFEMiIpOworICAgICAgICBmb2N1c0NlbGwoMSwgMik7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cygiUDFEMSIpOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiAybmQgcGFydGl0aW9uLgpAQCAtMTE2OSwxOCArMTE5NywxOCBAQAogICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShyZXNwb25zZTIpOwogCiAgICAgICAgIC8vIFRyaWdnZXIgcGFydGl0aW9uLgotICAgICAgICBtQWN0aXZpdHkuZm9jdXNDZWxsKDIsIDEpOworICAgICAgICBmb2N1c0NlbGwoMiwgMSk7CiAgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwogCiAgICAgICAgIC8vIEFzc2VydHMgcHJvcGVyIGRhdGFzZXRzIGFyZSBzaG93biBvbiBlYWNoIGZpZWxkIGRlZmluZWQgc28gZmFyLgotICAgICAgICBtQWN0aXZpdHkuZm9jdXNDZWxsKDEsIDEpOwotICAgICAgICBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlAyRDEiKTsgLy8gY2hhbmdlZAotICAgICAgICBtQWN0aXZpdHkuZm9jdXNDZWxsKDEsIDIpOwotICAgICAgICBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlAxRDEiKTsKLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgyLCAxKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJQMkQxIik7Ci0gICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoMiwgMik7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnREYXRhc2V0cygiUDJEMSIsICJQMkQyIik7CisgICAgICAgIGZvY3VzQ2VsbCgxLCAxKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJQMkQxIik7IC8vIGNoYW5nZWQKKyAgICAgICAgZm9jdXNDZWxsKDEsIDIpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlAxRDEiKTsKKyAgICAgICAgZm9jdXNDZWxsKDIsIDEpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlAyRDEiKTsKKyAgICAgICAgZm9jdXNDZWxsKDIsIDIpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlAyRDEiLCAiUDJEMiIpOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiAzcmQgcGFydGl0aW9uLgpAQCAtMTIwMywyMiArMTIzMSwyMiBAQAogICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShyZXNwb25zZTMpOwogCiAgICAgICAgIC8vIFRyaWdnZXIgcGFydGl0aW9uLgotICAgICAgICBtQWN0aXZpdHkuZm9jdXNDZWxsKDMsIDEpOworICAgICAgICBmb2N1c0NlbGwoMywgMSk7CiAgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwogCiAgICAgICAgIC8vIEFzc2VydHMgcHJvcGVyIGRhdGFzZXRzIGFyZSBzaG93biBvbiBlYWNoIGZpZWxkIGRlZmluZWQgc28gZmFyLgotICAgICAgICBtQWN0aXZpdHkuZm9jdXNDZWxsKDEsIDEpOwotICAgICAgICBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlAyRDEiKTsKLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgxLCAyKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJQM0QxIik7IC8vIGNoYW5nZWQKLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgyLCAxKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJQMkQxIik7Ci0gICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoMiwgMik7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnREYXRhc2V0cygiUDNEMiIpOyAvLyBjaGFuZ2VkCi0gICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoMywgMik7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnREYXRhc2V0cygiUDNEMSIsICJQM0QyIik7Ci0gICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoMywgMSk7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnREYXRhc2V0cygiUDNEMSIsICJQM0QyIik7CisgICAgICAgIGZvY3VzQ2VsbCgxLCAxKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJQMkQxIik7CisgICAgICAgIGZvY3VzQ2VsbCgxLCAyKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJQM0QxIik7IC8vIGNoYW5nZWQKKyAgICAgICAgZm9jdXNDZWxsKDIsIDEpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlAyRDEiKTsKKyAgICAgICAgZm9jdXNDZWxsKDIsIDIpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlAzRDIiKTsgLy8gY2hhbmdlZAorICAgICAgICBmb2N1c0NlbGwoMywgMik7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cygiUDNEMSIsICJQM0QyIik7CisgICAgICAgIGZvY3VzQ2VsbCgzLCAxKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJQM0QxIiwgIlAzRDIiKTsKIAogICAgICAgICAvKioKICAgICAgICAgICogNHRoIHBhcnRpdGlvbi4KQEAgLTEyNTEsMjYgKzEyNzksMjYgQEAKICAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UocmVzcG9uc2U0KTsKIAogICAgICAgICAvLyBUcmlnZ2VyIHBhcnRpdGlvbi4KLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCg0LCAxKTsKKyAgICAgICAgZm9jdXNDZWxsKDQsIDEpOwogICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKIAogICAgICAgICAvLyBBc3NlcnRzIHByb3BlciBkYXRhc2V0cyBhcmUgc2hvd24gb24gZWFjaCBmaWVsZCBkZWZpbmVkIHNvIGZhci4KLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgxLCAxKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJQNEQxIiwgIlA0RDIiKTsKLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgxLCAyKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJQNEQxIiwgIlA0RDIiKTsKLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgyLCAxKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJQNEQxIiwgIlA0RDIiKTsKLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgyLCAyKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJQNEQxIiwgIlA0RDIiKTsKLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgzLCAyKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJQNEQxIiwgIlA0RDIiKTsKLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgzLCAxKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJQNEQxIiwgIlA0RDIiKTsKLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCg0LCAxKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJQNEQxIiwgIlA0RDIiKTsKLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCg0LCAyKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJQNEQyIik7CisgICAgICAgIGZvY3VzQ2VsbCgxLCAxKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJQNEQxIiwgIlA0RDIiKTsKKyAgICAgICAgZm9jdXNDZWxsKDEsIDIpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlA0RDEiLCAiUDREMiIpOworICAgICAgICBmb2N1c0NlbGwoMiwgMSk7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cygiUDREMSIsICJQNEQyIik7CisgICAgICAgIGZvY3VzQ2VsbCgyLCAyKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJQNEQxIiwgIlA0RDIiKTsKKyAgICAgICAgZm9jdXNDZWxsKDMsIDIpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlA0RDEiLCAiUDREMiIpOworICAgICAgICBmb2N1c0NlbGwoMywgMSk7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cygiUDREMSIsICJQNEQyIik7CisgICAgICAgIGZvY3VzQ2VsbCg0LCAxKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJQNEQxIiwgIlA0RDIiKTsKKyAgICAgICAgZm9jdXNDZWxsKDQsIDIpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlA0RDIiKTsKIAogICAgICAgICAvKgogICAgICAgICAgKiBGaW5hbGx5LCBhdXRvZmlsbCBhbmQgY2hlY2sgcmVzdWx0cy4KQEAgLTEzMDAsOCArMTMyOCw4IEBACiAgICAgICAgICAgICBjaG9zZW5PbmUgPSAiUDREMiI7CiAgICAgICAgIH0KIAotICAgICAgICBtQWN0aXZpdHkuZm9jdXNDZWxsKDQsIDEpOwotICAgICAgICBzVWlCb3Quc2VsZWN0RGF0YXNldChjaG9zZW5PbmUpOworICAgICAgICBmb2N1c0NlbGwoNCwgMSk7CisgICAgICAgIG1VaUJvdC5zZWxlY3REYXRhc2V0KGNob3Nlbk9uZSk7CiAgICAgICAgIGV4cGVjdGF0aW9uLmFzc2VydEF1dG9GaWxsZWQoKTsKICAgICB9CiAKQEAgLTEzMTAsMTAgKzEzMzgsNiBAQAogICAgICAgICAvLyBTZXQgc2VydmljZS4KICAgICAgICAgZW5hYmxlU2VydmljZSgpOwogCi0gICAgICAgIC8vIFRPRE86IGN1cnJlbnQgQVBJIHJlcXVpcmVzIHRoZXNlIGZpZWxkcy4uLgotICAgICAgICBmaW5hbCBSZW1vdGVWaWV3cyBib2d1c1ByZXNlbnRhdGlvbiA9IGNyZWF0ZVByZXNlbnRhdGlvbigiV2hhdGV2ZXIgbWFuLCBJJ20gbm90IHVzZWQuLi4iKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGJvZ3VzVmFsdWUgPSAiWSBVIFJFUVVJUkUgSVQ/IjsKLQogICAgICAgICAvKioKICAgICAgICAgICogMXN0IHBhcnRpdGlvbi4KICAgICAgICAgICovCkBAIC0xMzIyLDE5ICsxMzQ2LDE4IEBACiAgICAgICAgICAgICAgICAgbmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCiAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfTDFDMSwgImwxYzEiKQogICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0wxQzIsICJsMWMyIikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oYm9ndXNQcmVzZW50YXRpb24pCiAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CiAgICAgICAgIGZpbmFsIEludGVudFNlbmRlciBhdXRoMTIgPSBBdXRoZW50aWNhdGlvbkFjdGl2aXR5LmNyZWF0ZVNlbmRlcihnZXRDb250ZXh0KCksIDEyKTsKICAgICAgICAgZmluYWwgQ2FubmVkRmlsbFJlc3BvbnNlIHJlc3BvbnNlMSA9IG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpCiAgICAgICAgICAgICAgICAgLmFkZERhdGFzZXQobmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCiAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0QXV0aGVudGljYXRpb24oYXV0aDExKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0wxQzEsIGJvZ3VzVmFsdWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfTDFDMiwgYm9ndXNWYWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9MMUMxLCBVTlVTRURfQVVUT0ZJTExfVkFMVUUpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfTDFDMiwgVU5VU0VEX0FVVE9GSUxMX1ZBTFVFKQogICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oIlAxRDEiKSkKICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQogICAgICAgICAgICAgICAgIC5hZGREYXRhc2V0KG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQogICAgICAgICAgICAgICAgICAgICAgICAgLnNldEF1dGhlbnRpY2F0aW9uKGF1dGgxMikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9MMUMxLCBib2d1c1ZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0wxQzEsIFVOVVNFRF9BVVRPRklMTF9WQUxVRSkKICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJQMUQyIikpCiAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKQEAgLTEzNDQsMTYgKzEzNjcsMTYgQEAKICAgICAgICAgICAgICAgICAub25DZWxsKDEsIDIsICJsMWMyIik7CiAKICAgICAgICAgLy8gVHJpZ2dlciBwYXJ0aXRpb24uCi0gICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoMSwgMSk7CisgICAgICAgIGZvY3VzQ2VsbCgxLCAxKTsKICAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CiAKICAgICAgICAgLy8gRm9jdXMgYXJvdW5kIGRpZmZlcmVudCBmaWVsZHMgaW4gdGhlIHBhcnRpdGlvbi4KLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJQMUQxIiwgIlAxRDIiKTsKLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgxLCAyKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJQMUQxIik7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cygiUDFEMSIsICJQMUQyIik7CisgICAgICAgIGZvY3VzQ2VsbCgxLCAyKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJQMUQxIik7CiAKICAgICAgICAgLy8gQXV0b2ZpbGwgaXQuLi4KLSAgICAgICAgc1VpQm90LnNlbGVjdERhdGFzZXQoIlAxRDEiKTsKKyAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQoIlAxRDEiKTsKICAgICAgICAgLy8gLi4uIGFuZCBhc3NlcnQgcmVzdWx0CiAgICAgICAgIGV4cGVjdGF0aW9uMS5hc3NlcnRBdXRvRmlsbGVkKCk7CiAKQEAgLTEzNjUsMTkgKzEzODgsMTggQEAKICAgICAgICAgZmluYWwgSW50ZW50U2VuZGVyIGF1dGgyMiA9IEF1dGhlbnRpY2F0aW9uQWN0aXZpdHkuY3JlYXRlU2VuZGVyKGdldENvbnRleHQoKSwgMjIsCiAgICAgICAgICAgICAgICAgbmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCiAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9MMkMyLCAiTDJDMiIpCi0gICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oYm9ndXNQcmVzZW50YXRpb24pCiAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKICAgICAgICAgZmluYWwgQ2FubmVkRmlsbFJlc3BvbnNlIHJlc3BvbnNlMiA9IG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpCiAgICAgICAgICAgICAgICAgLmFkZERhdGFzZXQobmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCiAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0QXV0aGVudGljYXRpb24oYXV0aDIxKQogICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oIlAyRDEiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9MMkMxLCBib2d1c1ZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0wyQzIsIGJvZ3VzVmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfTDJDMSwgVU5VU0VEX0FVVE9GSUxMX1ZBTFVFKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0wyQzIsIFVOVVNFRF9BVVRPRklMTF9WQUxVRSkKICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQogICAgICAgICAgICAgICAgIC5hZGREYXRhc2V0KG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQogICAgICAgICAgICAgICAgICAgICAgICAgLnNldEF1dGhlbnRpY2F0aW9uKGF1dGgyMikKICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJQMkQyIikpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfTDJDMiwgYm9ndXNWYWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9MMkMyLCBVTlVTRURfQVVUT0ZJTExfVkFMVUUpCiAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKICAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UocmVzcG9uc2UyKTsKQEAgLTEzODUsMTYgKzE0MDcsMTYgQEAKICAgICAgICAgICAgICAgICAub25DZWxsKDIsIDIsICJMMkMyIik7CiAKICAgICAgICAgLy8gVHJpZ2dlciBwYXJ0aXRpb24uCi0gICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoMiwgMSk7CisgICAgICAgIGZvY3VzQ2VsbCgyLCAxKTsKICAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CiAKICAgICAgICAgLy8gRm9jdXMgYXJvdW5kIGRpZmZlcmVudCBmaWVsZHMgaW4gdGhlIHBhcnRpdGlvbi4KLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJQMkQxIik7Ci0gICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoMiwgMik7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnREYXRhc2V0cygiUDJEMSIsICJQMkQyIik7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cygiUDJEMSIpOworICAgICAgICBmb2N1c0NlbGwoMiwgMik7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cygiUDJEMSIsICJQMkQyIik7CiAKICAgICAgICAgLy8gQXV0b2ZpbGwgaXQuLi4KLSAgICAgICAgc1VpQm90LnNlbGVjdERhdGFzZXQoIlAyRDIiKTsKKyAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQoIlAyRDIiKTsKICAgICAgICAgLy8gLi4uIGFuZCBhc3NlcnQgcmVzdWx0CiAgICAgICAgIGV4cGVjdGF0aW9uMi5hc3NlcnRBdXRvRmlsbGVkKCk7CiAKQEAgLTE0MDYsMjEgKzE0MjgsMjAgQEAKICAgICAgICAgICAgICAgICBuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9MM0MxLCAibDNjMSIpCiAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfTDNDMiwgImwzYzIiKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihib2d1c1ByZXNlbnRhdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKICAgICAgICAgZmluYWwgSW50ZW50U2VuZGVyIGF1dGgzMiA9IEF1dGhlbnRpY2F0aW9uQWN0aXZpdHkuY3JlYXRlU2VuZGVyKGdldENvbnRleHQoKSwgMzIpOwogICAgICAgICBmaW5hbCBDYW5uZWRGaWxsUmVzcG9uc2UgcmVzcG9uc2UzID0gbmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkKICAgICAgICAgICAgICAgICAuYWRkRGF0YXNldChuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRBdXRoZW50aWNhdGlvbihhdXRoMzEpCiAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiUDNEMSIpKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0wzQzEsIGJvZ3VzVmFsdWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfTDNDMiwgYm9ndXNWYWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9MM0MxLCBVTlVTRURfQVVUT0ZJTExfVkFMVUUpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfTDNDMiwgVU5VU0VEX0FVVE9GSUxMX1ZBTFVFKQogICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCiAgICAgICAgICAgICAgICAgLmFkZERhdGFzZXQobmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCiAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0QXV0aGVudGljYXRpb24oYXV0aDMyKQogICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oIlAzRDIiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9MM0MxLCBib2d1c1ZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0wzQzIsIGJvZ3VzVmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfTDNDMSwgVU5VU0VEX0FVVE9GSUxMX1ZBTFVFKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0wzQzIsIFVOVVNFRF9BVVRPRklMTF9WQUxVRSkKICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQogICAgICAgICAgICAgICAgIC5idWlsZCgpOwogICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShyZXNwb25zZTMpOwpAQCAtMTQyOSwxNiArMTQ1MCwxNiBAQAogICAgICAgICAgICAgICAgIC5vbkNlbGwoMywgMiwgImwzYzIiKTsKIAogICAgICAgICAvLyBUcmlnZ2VyIHBhcnRpdGlvbi4KLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgzLCAyKTsKKyAgICAgICAgZm9jdXNDZWxsKDMsIDIpOwogICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKIAogICAgICAgICAvLyBGb2N1cyBhcm91bmQgZGlmZmVyZW50IGZpZWxkcyBpbiB0aGUgcGFydGl0aW9uLgotICAgICAgICBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlAzRDEiLCAiUDNEMiIpOwotICAgICAgICBtQWN0aXZpdHkuZm9jdXNDZWxsKDMsIDEpOwotICAgICAgICBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlAzRDEiLCAiUDNEMiIpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlAzRDEiLCAiUDNEMiIpOworICAgICAgICBmb2N1c0NlbGwoMywgMSk7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cygiUDNEMSIsICJQM0QyIik7CiAKICAgICAgICAgLy8gQXV0b2ZpbGwgaXQuLi4KLSAgICAgICAgc1VpQm90LnNlbGVjdERhdGFzZXQoIlAzRDEiKTsKKyAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQoIlAzRDEiKTsKICAgICAgICAgLy8gLi4uIGFuZCBhc3NlcnQgcmVzdWx0CiAgICAgICAgIGV4cGVjdGF0aW9uMy5hc3NlcnRBdXRvRmlsbGVkKCk7CiAKQEAgLTE0NTEsMTkgKzE0NzIsMTggQEAKICAgICAgICAgICAgICAgICBuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0w0QzEsICJMNEMxIikKICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0w0QzIsICJMNEMyIikKLSAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihib2d1c1ByZXNlbnRhdGlvbikKICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOwogICAgICAgICBmaW5hbCBDYW5uZWRGaWxsUmVzcG9uc2UgcmVzcG9uc2U0ID0gbmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkKICAgICAgICAgICAgICAgICAuYWRkRGF0YXNldChuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRBdXRoZW50aWNhdGlvbihhdXRoNDEpCiAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiUDREMSIpKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0w0QzEsIGJvZ3VzVmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfTDRDMSwgVU5VU0VEX0FVVE9GSUxMX1ZBTFVFKQogICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCiAgICAgICAgICAgICAgICAgLmFkZERhdGFzZXQobmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCiAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0QXV0aGVudGljYXRpb24oYXV0aDQyKQogICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oIlA0RDIiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9MNEMxLCBib2d1c1ZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0w0QzIsIGJvZ3VzVmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfTDRDMSwgVU5VU0VEX0FVVE9GSUxMX1ZBTFVFKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0w0QzIsIFVOVVNFRF9BVVRPRklMTF9WQUxVRSkKICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQogICAgICAgICAgICAgICAgIC5idWlsZCgpOwogICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShyZXNwb25zZTQpOwpAQCAtMTQ3MiwxNiArMTQ5MiwxNiBAQAogICAgICAgICAgICAgICAgIC5vbkNlbGwoNCwgMiwgIkw0QzIiKTsKIAogICAgICAgICAvLyBUcmlnZ2VyIHBhcnRpdGlvbi4KLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCg0LCAxKTsKKyAgICAgICAgZm9jdXNDZWxsKDQsIDEpOwogICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKIAogICAgICAgICAvLyBGb2N1cyBhcm91bmQgZGlmZmVyZW50IGZpZWxkcyBpbiB0aGUgcGFydGl0aW9uLgotICAgICAgICBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlA0RDEiLCAiUDREMiIpOwotICAgICAgICBtQWN0aXZpdHkuZm9jdXNDZWxsKDQsIDIpOwotICAgICAgICBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlA0RDIiKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJQNEQxIiwgIlA0RDIiKTsKKyAgICAgICAgZm9jdXNDZWxsKDQsIDIpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlA0RDIiKTsKIAogICAgICAgICAvLyBBdXRvZmlsbCBpdC4uLgotICAgICAgICBzVWlCb3Quc2VsZWN0RGF0YXNldCgiUDREMiIpOworICAgICAgICBtVWlCb3Quc2VsZWN0RGF0YXNldCgiUDREMiIpOwogICAgICAgICAvLyAuLi4gYW5kIGFzc2VydCByZXN1bHQKICAgICAgICAgZXhwZWN0YXRpb240LmFzc2VydEF1dG9GaWxsZWQoKTsKICAgICB9CkBAIC0xNDk2LDEwICsxNTE2LDYgQEAKICAgICAgICAgLy8gU2V0IHNlcnZpY2UuCiAgICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKIAotICAgICAgICAvLyBUT0RPOiBjdXJyZW50IEFQSSByZXF1aXJlcyB0aGVzZSBmaWVsZHMuLi4KLSAgICAgICAgZmluYWwgUmVtb3RlVmlld3MgYm9ndXNQcmVzZW50YXRpb24gPSBjcmVhdGVQcmVzZW50YXRpb24oIldoYXRldmVyIG1hbiwgSSdtIG5vdCB1c2VkLi4uIik7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBib2d1c1ZhbHVlID0gIlkgVSBSRVFVSVJFIElUPyI7Ci0KICAgICAgICAgLyoqCiAgICAgICAgICAqIDFzdCBwYXJ0aXRpb24uCiAgICAgICAgICAqLwpAQCAtMTUwOCwxOSArMTUyNCwxOCBAQAogICAgICAgICAgICAgICAgIG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQogICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0wxQzEsICJsMWMxIikKICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9MMUMyLCAibDFjMiIpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGJvZ3VzUHJlc2VudGF0aW9uKQogICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOwogICAgICAgICBmaW5hbCBJbnRlbnRTZW5kZXIgYXV0aDEyID0gQXV0aGVudGljYXRpb25BY3Rpdml0eS5jcmVhdGVTZW5kZXIoZ2V0Q29udGV4dCgpLCAxMik7CiAgICAgICAgIGZpbmFsIENhbm5lZEZpbGxSZXNwb25zZSByZXNwb25zZTEgPSBuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKQogICAgICAgICAgICAgICAgIC5hZGREYXRhc2V0KG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQogICAgICAgICAgICAgICAgICAgICAgICAgLnNldEF1dGhlbnRpY2F0aW9uKGF1dGgxMSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9MMUMxLCBib2d1c1ZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0wxQzIsIGJvZ3VzVmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfTDFDMSwgVU5VU0VEX0FVVE9GSUxMX1ZBTFVFKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0wxQzIsIFVOVVNFRF9BVVRPRklMTF9WQUxVRSkKICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJQMUQxIikpCiAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKICAgICAgICAgICAgICAgICAuYWRkRGF0YXNldChuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRBdXRoZW50aWNhdGlvbihhdXRoMTIpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfTDFDMSwgYm9ndXNWYWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9MMUMxLCBVTlVTRURfQVVUT0ZJTExfVkFMVUUpCiAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiUDFEMiIpKQogICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCiAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CkBAIC0xNTMwLDcgKzE1NDUsNyBAQAogICAgICAgICAgICAgICAgIC5vbkNlbGwoMSwgMiwgImwxYzIiKTsKIAogICAgICAgICAvLyBUcmlnZ2VyIHBhcnRpdGlvbi4KLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgxLCAxKTsKKyAgICAgICAgZm9jdXNDZWxsKDEsIDEpOwogICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKIAogICAgICAgICAvKioKQEAgLTE1NDEsMTkgKzE1NTYsMTggQEAKICAgICAgICAgZmluYWwgSW50ZW50U2VuZGVyIGF1dGgyMiA9IEF1dGhlbnRpY2F0aW9uQWN0aXZpdHkuY3JlYXRlU2VuZGVyKGdldENvbnRleHQoKSwgMjIsCiAgICAgICAgICAgICAgICAgbmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCiAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9MMkMyLCAiTDJDMiIpCi0gICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oYm9ndXNQcmVzZW50YXRpb24pCiAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKICAgICAgICAgZmluYWwgQ2FubmVkRmlsbFJlc3BvbnNlIHJlc3BvbnNlMiA9IG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpCiAgICAgICAgICAgICAgICAgLmFkZERhdGFzZXQobmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCiAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0QXV0aGVudGljYXRpb24oYXV0aDIxKQogICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oIlAyRDEiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9MMkMxLCBib2d1c1ZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0wyQzIsIGJvZ3VzVmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfTDJDMSwgVU5VU0VEX0FVVE9GSUxMX1ZBTFVFKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0wyQzIsIFVOVVNFRF9BVVRPRklMTF9WQUxVRSkKICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQogICAgICAgICAgICAgICAgIC5hZGREYXRhc2V0KG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQogICAgICAgICAgICAgICAgICAgICAgICAgLnNldEF1dGhlbnRpY2F0aW9uKGF1dGgyMikKICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJQMkQyIikpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfTDJDMiwgYm9ndXNWYWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9MMkMyLCBVTlVTRURfQVVUT0ZJTExfVkFMVUUpCiAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKICAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UocmVzcG9uc2UyKTsKQEAgLTE1NjEsNyArMTU3NSw3IEBACiAgICAgICAgICAgICAgICAgLm9uQ2VsbCgyLCAyLCAiTDJDMiIpOwogCiAgICAgICAgIC8vIFRyaWdnZXIgcGFydGl0aW9uLgotICAgICAgICBtQWN0aXZpdHkuZm9jdXNDZWxsKDIsIDEpOworICAgICAgICBmb2N1c0NlbGwoMiwgMSk7CiAgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwogCiAgICAgICAgIC8qKgpAQCAtMTU3MiwyMSArMTU4NiwyMCBAQAogICAgICAgICAgICAgICAgIG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQogICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0wzQzEsICJsM2MxIikKICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9MM0MyLCAibDNjMiIpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGJvZ3VzUHJlc2VudGF0aW9uKQogICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOwogICAgICAgICBmaW5hbCBJbnRlbnRTZW5kZXIgYXV0aDMyID0gQXV0aGVudGljYXRpb25BY3Rpdml0eS5jcmVhdGVTZW5kZXIoZ2V0Q29udGV4dCgpLCAzMik7CiAgICAgICAgIGZpbmFsIENhbm5lZEZpbGxSZXNwb25zZSByZXNwb25zZTMgPSBuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKQogICAgICAgICAgICAgICAgIC5hZGREYXRhc2V0KG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQogICAgICAgICAgICAgICAgICAgICAgICAgLnNldEF1dGhlbnRpY2F0aW9uKGF1dGgzMSkKICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJQM0QxIikpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfTDNDMSwgYm9ndXNWYWx1ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9MM0MyLCBib2d1c1ZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0wzQzEsIFVOVVNFRF9BVVRPRklMTF9WQUxVRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9MM0MyLCBVTlVTRURfQVVUT0ZJTExfVkFMVUUpCiAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKICAgICAgICAgICAgICAgICAuYWRkRGF0YXNldChuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRBdXRoZW50aWNhdGlvbihhdXRoMzIpCiAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiUDNEMiIpKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0wzQzEsIGJvZ3VzVmFsdWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfTDNDMiwgYm9ndXNWYWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9MM0MxLCBVTlVTRURfQVVUT0ZJTExfVkFMVUUpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfTDNDMiwgVU5VU0VEX0FVVE9GSUxMX1ZBTFVFKQogICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCiAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CiAgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKHJlc3BvbnNlMyk7CkBAIC0xNTk1LDcgKzE2MDgsNyBAQAogICAgICAgICAgICAgICAgIC5vbkNlbGwoMywgMiwgImwzYzIiKTsKIAogICAgICAgICAvLyBUcmlnZ2VyIHBhcnRpdGlvbi4KLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgzLCAyKTsKKyAgICAgICAgZm9jdXNDZWxsKDMsIDIpOwogICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKIAogICAgICAgICAvKioKQEAgLTE2MDcsMTkgKzE2MjAsMTggQEAKICAgICAgICAgICAgICAgICBuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0w0QzEsICJMNEMxIikKICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0w0QzIsICJMNEMyIikKLSAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihib2d1c1ByZXNlbnRhdGlvbikKICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOwogICAgICAgICBmaW5hbCBDYW5uZWRGaWxsUmVzcG9uc2UgcmVzcG9uc2U0ID0gbmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkKICAgICAgICAgICAgICAgICAuYWRkRGF0YXNldChuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRBdXRoZW50aWNhdGlvbihhdXRoNDEpCiAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiUDREMSIpKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0w0QzEsIGJvZ3VzVmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfTDRDMSwgVU5VU0VEX0FVVE9GSUxMX1ZBTFVFKQogICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCiAgICAgICAgICAgICAgICAgLmFkZERhdGFzZXQobmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCiAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0QXV0aGVudGljYXRpb24oYXV0aDQyKQogICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oIlA0RDIiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9MNEMxLCBib2d1c1ZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0w0QzIsIGJvZ3VzVmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfTDRDMSwgVU5VU0VEX0FVVE9GSUxMX1ZBTFVFKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0w0QzIsIFVOVVNFRF9BVVRPRklMTF9WQUxVRSkKICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQogICAgICAgICAgICAgICAgIC5idWlsZCgpOwogICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShyZXNwb25zZTQpOwpAQCAtMTYyNyw0OSArMTYzOSw0OSBAQAogICAgICAgICAgICAgICAgIC5vbkNlbGwoNCwgMSwgIkw0QzEiKQogICAgICAgICAgICAgICAgIC5vbkNlbGwoNCwgMiwgIkw0QzIiKTsKIAotICAgICAgICBtQWN0aXZpdHkuZm9jdXNDZWxsKDQsIDEpOworICAgICAgICBmb2N1c0NlbGwoNCwgMSk7CiAgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwogCiAgICAgICAgIC8qCiAgICAgICAgICAqICBOb3cgbW92ZSBmb2N1cyBhcm91bmQgdG8gbWFrZSBzdXJlIHRoZSBwcm9wZXIgdmFsdWVzIGFyZSBkaXNwbGF5ZWQgZWFjaCB0aW1lLgogICAgICAgICAgKi8KLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgxLCAxKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJQMUQxIiwgIlAxRDIiKTsKLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgxLCAyKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJQMUQxIik7CisgICAgICAgIGZvY3VzQ2VsbCgxLCAxKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJQMUQxIiwgIlAxRDIiKTsKKyAgICAgICAgZm9jdXNDZWxsKDEsIDIpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlAxRDEiKTsKIAotICAgICAgICBtQWN0aXZpdHkuZm9jdXNDZWxsKDIsIDEpOwotICAgICAgICBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlAyRDEiKTsKLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgyLCAyKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJQMkQxIiwgIlAyRDIiKTsKKyAgICAgICAgZm9jdXNDZWxsKDIsIDEpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlAyRDEiKTsKKyAgICAgICAgZm9jdXNDZWxsKDIsIDIpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlAyRDEiLCAiUDJEMiIpOwogCi0gICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoNCwgMSk7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnREYXRhc2V0cygiUDREMSIsICJQNEQyIik7Ci0gICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoNCwgMik7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnREYXRhc2V0cygiUDREMiIpOworICAgICAgICBmb2N1c0NlbGwoNCwgMSk7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cygiUDREMSIsICJQNEQyIik7CisgICAgICAgIGZvY3VzQ2VsbCg0LCAyKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJQNEQyIik7CiAKLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgzLCAyKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJQM0QxIiwgIlAzRDIiKTsKLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgzLCAxKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJQM0QxIiwgIlAzRDIiKTsKKyAgICAgICAgZm9jdXNDZWxsKDMsIDIpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlAzRDEiLCAiUDNEMiIpOworICAgICAgICBmb2N1c0NlbGwoMywgMSk7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cygiUDNEMSIsICJQM0QyIik7CiAKICAgICAgICAgLyoKICAgICAgICAgICogIEZpbmFsbHksIGF1dG9maWxsIGFuZCBjaGVjayByZXN1bHRzLgogICAgICAgICAgKi8KLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCg0LCAxKTsKLSAgICAgICAgc1VpQm90LnNlbGVjdERhdGFzZXQoIlA0RDIiKTsKKyAgICAgICAgZm9jdXNDZWxsKDQsIDEpOworICAgICAgICBtVWlCb3Quc2VsZWN0RGF0YXNldCgiUDREMiIpOwogICAgICAgICBleHBlY3RhdGlvbjQuYXNzZXJ0QXV0b0ZpbGxlZCgpOwogCi0gICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoMSwgMSk7Ci0gICAgICAgIHNVaUJvdC5zZWxlY3REYXRhc2V0KCJQMUQxIik7CisgICAgICAgIGZvY3VzQ2VsbCgxLCAxKTsKKyAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQoIlAxRDEiKTsKICAgICAgICAgZXhwZWN0YXRpb24xLmFzc2VydEF1dG9GaWxsZWQoKTsKIAotICAgICAgICBtQWN0aXZpdHkuZm9jdXNDZWxsKDMsIDEpOwotICAgICAgICBzVWlCb3Quc2VsZWN0RGF0YXNldCgiUDNEMSIpOworICAgICAgICBmb2N1c0NlbGwoMywgMSk7CisgICAgICAgIG1VaUJvdC5zZWxlY3REYXRhc2V0KCJQM0QxIik7CiAgICAgICAgIGV4cGVjdGF0aW9uMy5hc3NlcnRBdXRvRmlsbGVkKCk7CiAKLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgyLCAyKTsKLSAgICAgICAgc1VpQm90LnNlbGVjdERhdGFzZXQoIlAyRDIiKTsKKyAgICAgICAgZm9jdXNDZWxsKDIsIDIpOworICAgICAgICBtVWlCb3Quc2VsZWN0RGF0YXNldCgiUDJEMiIpOwogICAgICAgICBleHBlY3RhdGlvbjIuYXNzZXJ0QXV0b0ZpbGxlZCgpOwogICAgIH0KIApAQCAtMTY4MywxMCArMTY5NSw2IEBACiAgICAgICAgIC8vIFNldCBzZXJ2aWNlLgogICAgICAgICBlbmFibGVTZXJ2aWNlKCk7CiAKLSAgICAgICAgLy8gVE9ETzogY3VycmVudCBBUEkgcmVxdWlyZXMgdGhlc2UgZmllbGRzLi4uCi0gICAgICAgIGZpbmFsIFJlbW90ZVZpZXdzIGJvZ3VzUHJlc2VudGF0aW9uID0gY3JlYXRlUHJlc2VudGF0aW9uKCJXaGF0ZXZlciBtYW4sIEknbSBub3QgdXNlZC4uLiIpOwotICAgICAgICBmaW5hbCBTdHJpbmcgYm9ndXNWYWx1ZSA9ICJZIFUgUkVRVUlSRSBJVD8iOwotCiAgICAgICAgIC8qKgogICAgICAgICAgKiAxc3QgcGFydGl0aW9uLgogICAgICAgICAgKi8KQEAgLTE3MDAsNyArMTcwOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKICAgICAgICAgICAgICAgICAuYWRkRGF0YXNldChuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRBdXRoZW50aWNhdGlvbihhdXRoMTIpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfTDFDMSwgYm9ndXNWYWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9MMUMxLCBVTlVTRURfQVVUT0ZJTExfVkFMVUUpCiAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiUDFEMiIpKQogICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCiAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CkBAIC0xNzEwLDcgKzE3MTgsNyBAQAogICAgICAgICAgICAgICAgIC5vbkNlbGwoMSwgMiwgImwxYzIiKTsKIAogICAgICAgICAvLyBUcmlnZ2VyIHBhcnRpdGlvbi4KLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgxLCAxKTsKKyAgICAgICAgZm9jdXNDZWxsKDEsIDEpOwogICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKIAogICAgICAgICAvKioKQEAgLTE3MjAsNyArMTcyOCw2IEBACiAgICAgICAgIGZpbmFsIEludGVudFNlbmRlciBhdXRoMjIgPSBBdXRoZW50aWNhdGlvbkFjdGl2aXR5LmNyZWF0ZVNlbmRlcihnZXRDb250ZXh0KCksIDIyLAogICAgICAgICAgICAgICAgIG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQogICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfTDJDMiwgIkwyQzIiKQotICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGJvZ3VzUHJlc2VudGF0aW9uKQogICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CiAgICAgICAgIGZpbmFsIENhbm5lZEZpbGxSZXNwb25zZSByZXNwb25zZTIgPSBuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKQogICAgICAgICAgICAgICAgIC5hZGREYXRhc2V0KG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQpAQCAtMTczMSw3ICsxNzM4LDcgQEAKICAgICAgICAgICAgICAgICAuYWRkRGF0YXNldChuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRBdXRoZW50aWNhdGlvbihhdXRoMjIpCiAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiUDJEMiIpKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0wyQzIsIGJvZ3VzVmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfTDJDMiwgVU5VU0VEX0FVVE9GSUxMX1ZBTFVFKQogICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCiAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CiAgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKHJlc3BvbnNlMik7CkBAIC0xNzM5LDcgKzE3NDYsNyBAQAogICAgICAgICAgICAgICAgIC5vbkNlbGwoMiwgMiwgIkwyQzIiKTsKIAogICAgICAgICAvLyBUcmlnZ2VyIHBhcnRpdGlvbi4KLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgyLCAxKTsKKyAgICAgICAgZm9jdXNDZWxsKDIsIDEpOwogICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKIAogICAgICAgICAvKioKQEAgLTE3NTAsMTQgKzE3NTcsMTMgQEAKICAgICAgICAgICAgICAgICBuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9MM0MxLCAibDNjMSIpCiAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfTDNDMiwgImwzYzIiKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihib2d1c1ByZXNlbnRhdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKICAgICAgICAgZmluYWwgQ2FubmVkRmlsbFJlc3BvbnNlIHJlc3BvbnNlMyA9IG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpCiAgICAgICAgICAgICAgICAgLmFkZERhdGFzZXQobmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCiAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0QXV0aGVudGljYXRpb24oYXV0aDMxKQogICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oIlAzRDEiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9MM0MxLCBib2d1c1ZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0wzQzIsIGJvZ3VzVmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfTDNDMSwgVU5VU0VEX0FVVE9GSUxMX1ZBTFVFKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0wzQzIsIFVOVVNFRF9BVVRPRklMTF9WQUxVRSkKICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQogICAgICAgICAgICAgICAgIC5hZGREYXRhc2V0KG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQogICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oIlAzRDIiKSkKQEAgLTE3NzEsNyArMTc3Nyw3IEBACiAgICAgICAgICAgICAgICAgLm9uQ2VsbCgzLCAyLCAibDNjMiIpOwogCiAgICAgICAgIC8vIFRyaWdnZXIgcGFydGl0aW9uLgotICAgICAgICBtQWN0aXZpdHkuZm9jdXNDZWxsKDMsIDIpOworICAgICAgICBmb2N1c0NlbGwoMywgMik7CiAgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwogCiAgICAgICAgIC8qKgpAQCAtMTc4Myw3ICsxNzg5LDcgQEAKICAgICAgICAgICAgICAgICAuYWRkRGF0YXNldChuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRBdXRoZW50aWNhdGlvbihhdXRoNDEpCiAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiUDREMSIpKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0w0QzEsIGJvZ3VzVmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfTDRDMSwgVU5VU0VEX0FVVE9GSUxMX1ZBTFVFKQogICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCiAgICAgICAgICAgICAgICAgLmFkZERhdGFzZXQobmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCiAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiUDREMiIpKQpAQCAtMTc5Niw0OSArMTgwMiw0OSBAQAogICAgICAgICAgICAgICAgIC5vbkNlbGwoNCwgMSwgIkw0QzEiKQogICAgICAgICAgICAgICAgIC5vbkNlbGwoNCwgMiwgIkw0QzIiKTsKIAotICAgICAgICBtQWN0aXZpdHkuZm9jdXNDZWxsKDQsIDEpOworICAgICAgICBmb2N1c0NlbGwoNCwgMSk7CiAgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwogCiAgICAgICAgIC8qCiAgICAgICAgICAqICBOb3cgbW92ZSBmb2N1cyBhcm91bmQgdG8gbWFrZSBzdXJlIHRoZSBwcm9wZXIgdmFsdWVzIGFyZSBkaXNwbGF5ZWQgZWFjaCB0aW1lLgogICAgICAgICAgKi8KLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgxLCAxKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJQMUQxIiwgIlAxRDIiKTsKLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgxLCAyKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJQMUQxIik7CisgICAgICAgIGZvY3VzQ2VsbCgxLCAxKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJQMUQxIiwgIlAxRDIiKTsKKyAgICAgICAgZm9jdXNDZWxsKDEsIDIpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlAxRDEiKTsKIAotICAgICAgICBtQWN0aXZpdHkuZm9jdXNDZWxsKDIsIDEpOwotICAgICAgICBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlAyRDEiKTsKLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgyLCAyKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJQMkQxIiwgIlAyRDIiKTsKKyAgICAgICAgZm9jdXNDZWxsKDIsIDEpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlAyRDEiKTsKKyAgICAgICAgZm9jdXNDZWxsKDIsIDIpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlAyRDEiLCAiUDJEMiIpOwogCi0gICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoNCwgMSk7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnREYXRhc2V0cygiUDREMSIsICJQNEQyIik7Ci0gICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoNCwgMik7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnREYXRhc2V0cygiUDREMiIpOworICAgICAgICBmb2N1c0NlbGwoNCwgMSk7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cygiUDREMSIsICJQNEQyIik7CisgICAgICAgIGZvY3VzQ2VsbCg0LCAyKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJQNEQyIik7CiAKLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgzLCAyKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJQM0QxIiwgIlAzRDIiKTsKLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgzLCAxKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJQM0QxIiwgIlAzRDIiKTsKKyAgICAgICAgZm9jdXNDZWxsKDMsIDIpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlAzRDEiLCAiUDNEMiIpOworICAgICAgICBmb2N1c0NlbGwoMywgMSk7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cygiUDNEMSIsICJQM0QyIik7CiAKICAgICAgICAgLyoKICAgICAgICAgICogIEZpbmFsbHksIGF1dG9maWxsIGFuZCBjaGVjayByZXN1bHRzLgogICAgICAgICAgKi8KLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCg0LCAxKTsKLSAgICAgICAgc1VpQm90LnNlbGVjdERhdGFzZXQoIlA0RDIiKTsKKyAgICAgICAgZm9jdXNDZWxsKDQsIDEpOworICAgICAgICBtVWlCb3Quc2VsZWN0RGF0YXNldCgiUDREMiIpOwogICAgICAgICBleHBlY3RhdGlvbjQuYXNzZXJ0QXV0b0ZpbGxlZCgpOwogCi0gICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoMSwgMSk7Ci0gICAgICAgIHNVaUJvdC5zZWxlY3REYXRhc2V0KCJQMUQxIik7CisgICAgICAgIGZvY3VzQ2VsbCgxLCAxKTsKKyAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQoIlAxRDEiKTsKICAgICAgICAgZXhwZWN0YXRpb24xLmFzc2VydEF1dG9GaWxsZWQoKTsKIAotICAgICAgICBtQWN0aXZpdHkuZm9jdXNDZWxsKDMsIDEpOwotICAgICAgICBzVWlCb3Quc2VsZWN0RGF0YXNldCgiUDNEMSIpOworICAgICAgICBmb2N1c0NlbGwoMywgMSk7CisgICAgICAgIG1VaUJvdC5zZWxlY3REYXRhc2V0KCJQM0QxIik7CiAgICAgICAgIGV4cGVjdGF0aW9uMy5hc3NlcnRBdXRvRmlsbGVkKCk7CiAKLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgyLCAyKTsKLSAgICAgICAgc1VpQm90LnNlbGVjdERhdGFzZXQoIlAyRDIiKTsKKyAgICAgICAgZm9jdXNDZWxsKDIsIDIpOworICAgICAgICBtVWlCb3Quc2VsZWN0RGF0YXNldCgiUDJEMiIpOwogICAgICAgICBleHBlY3RhdGlvbjIuYXNzZXJ0QXV0b0ZpbGxlZCgpOwogICAgIH0KIApAQCAtMTg3NiwxMCArMTg4Miw2IEBACiAgICAgICAgIC8vIFNldCBzZXJ2aWNlLgogICAgICAgICBlbmFibGVTZXJ2aWNlKCk7CiAKLSAgICAgICAgLy8gVE9ETzogY3VycmVudCBBUEkgcmVxdWlyZXMgdGhlc2UgZmllbGRzLi4uCi0gICAgICAgIGZpbmFsIFJlbW90ZVZpZXdzIGJvZ3VzUHJlc2VudGF0aW9uID0gY3JlYXRlUHJlc2VudGF0aW9uKCJXaGF0ZXZlciBtYW4sIEknbSBub3QgdXNlZC4uLiIpOwotICAgICAgICBmaW5hbCBTdHJpbmcgYm9ndXNWYWx1ZSA9ICJZIFUgUkVRVUlSRSBJVD8iOwotCiAgICAgICAgIC8qKgogICAgICAgICAgKiAxc3QgcGFydGl0aW9uLgogICAgICAgICAgKi8KQEAgLTE4OTMsMjAgKzE4OTUsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQogICAgICAgICAgICAgICAgIC5hZGREYXRhc2V0KG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQogICAgICAgICAgICAgICAgICAgICAgICAgLnNldEF1dGhlbnRpY2F0aW9uKGF1dGgxMikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9MMUMxLCBib2d1c1ZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0wxQzEsIFVOVVNFRF9BVVRPRklMTF9WQUxVRSkKICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJQMUQyIikpCiAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKICAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UocmVzcG9uc2UxKTsKICAgICAgICAgLy8gVHJpZ2dlciBwYXJ0aXRpb24uCi0gICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoMSwgMSk7CisgICAgICAgIGZvY3VzQ2VsbCgxLCAxKTsKICAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CiAKICAgICAgICAgLy8gQXNzZXJ0cyBwcm9wZXIgZGF0YXNldHMgYXJlIHNob3duIG9uIGVhY2ggZmllbGQgZGVmaW5lZCBzbyBmYXIuCi0gICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoMSwgMSk7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnREYXRhc2V0cygiUDFEMSIsICJQMUQyIik7Ci0gICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoMSwgMik7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnREYXRhc2V0cygiUDFEMSIpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlAxRDEiLCAiUDFEMiIpOworICAgICAgICBmb2N1c0NlbGwoMSwgMik7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cygiUDFEMSIpOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiAybmQgcGFydGl0aW9uLgpAQCAtMTkxNywxNSArMTkxOCwxNCBAQAogICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfTDFDMSwgIjJsMWMxIikgLy8gZnJvbSBwcmV2aW91cyBwYXJ0aXRpb24KICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0wyQzEsICIybDJjMSIpCiAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9MMkMyLCAiMmwyYzIiKQotICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGJvZ3VzUHJlc2VudGF0aW9uKQogICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CiAgICAgICAgIGZpbmFsIENhbm5lZEZpbGxSZXNwb25zZSByZXNwb25zZTIgPSBuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKQogICAgICAgICAgICAgICAgIC5hZGREYXRhc2V0KG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQogICAgICAgICAgICAgICAgICAgICAgICAgLnNldEF1dGhlbnRpY2F0aW9uKGF1dGgyMSkKICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJQMkQxIikpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfTDFDMSwgYm9ndXNWYWx1ZSkgLy8gZnJvbSBwcmV2aW91cyBwYXJ0aXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9MMkMxLCBib2d1c1ZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0wyQzIsIGJvZ3VzVmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfTDFDMSwgVU5VU0VEX0FVVE9GSUxMX1ZBTFVFKSAvLyBmcm9tIHByZXZpb3VzIHBhcnRpdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0wyQzEsIFVOVVNFRF9BVVRPRklMTF9WQUxVRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9MMkMyLCBVTlVTRURfQVVUT0ZJTExfVkFMVUUpCiAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKICAgICAgICAgICAgICAgICAuYWRkRGF0YXNldChuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJQMkQyIikpCkBAIC0xOTM1LDE4ICsxOTM1LDE4IEBACiAgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKHJlc3BvbnNlMik7CiAKICAgICAgICAgLy8gVHJpZ2dlciBwYXJ0aXRpb24uCi0gICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoMiwgMSk7CisgICAgICAgIGZvY3VzQ2VsbCgyLCAxKTsKICAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CiAKICAgICAgICAgLy8gQXNzZXJ0cyBwcm9wZXIgZGF0YXNldHMgYXJlIHNob3duIG9uIGVhY2ggZmllbGQgZGVmaW5lZCBzbyBmYXIuCi0gICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoMSwgMSk7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnREYXRhc2V0cygiUDJEMSIpOyAvLyBjaGFuZ2VkCi0gICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoMSwgMik7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnREYXRhc2V0cygiUDFEMSIpOwotICAgICAgICBtQWN0aXZpdHkuZm9jdXNDZWxsKDIsIDEpOwotICAgICAgICBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlAyRDEiKTsKLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgyLCAyKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJQMkQxIiwgIlAyRDIiKTsKKyAgICAgICAgZm9jdXNDZWxsKDEsIDEpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlAyRDEiKTsgLy8gY2hhbmdlZAorICAgICAgICBmb2N1c0NlbGwoMSwgMik7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cygiUDFEMSIpOworICAgICAgICBmb2N1c0NlbGwoMiwgMSk7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cygiUDJEMSIpOworICAgICAgICBmb2N1c0NlbGwoMiwgMik7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cygiUDJEMSIsICJQMkQyIik7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIDNyZCBwYXJ0aXRpb24uCkBAIC0xOTU3LDQ0ICsxOTU3LDQzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfTDFDMiwgIjNsMWMyIikgLy8gZnJvbSBwcmV2aW91cyBwYXJ0aXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9MM0MxLCAiM2wzYzEiKQogICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0wzQzIsICIzbDNjMiIpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGJvZ3VzUHJlc2VudGF0aW9uKQogICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOwogICAgICAgICBmaW5hbCBJbnRlbnRTZW5kZXIgYXV0aDMyID0gQXV0aGVudGljYXRpb25BY3Rpdml0eS5jcmVhdGVTZW5kZXIoZ2V0Q29udGV4dCgpLCAzMik7CiAgICAgICAgIGZpbmFsIENhbm5lZEZpbGxSZXNwb25zZSByZXNwb25zZTMgPSBuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKQogICAgICAgICAgICAgICAgIC5hZGREYXRhc2V0KG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQogICAgICAgICAgICAgICAgICAgICAgICAgLnNldEF1dGhlbnRpY2F0aW9uKGF1dGgzMSkKICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJQM0QxIikpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfTDFDMiwgYm9ndXNWYWx1ZSkgLy8gZnJvbSBwcmV2aW91cyBwYXJ0aXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9MM0MxLCBib2d1c1ZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0wzQzIsIGJvZ3VzVmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfTDFDMiwgVU5VU0VEX0FVVE9GSUxMX1ZBTFVFKSAvLyBmcm9tIHByZXZpb3VzIHBhcnRpdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0wzQzEsIFVOVVNFRF9BVVRPRklMTF9WQUxVRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9MM0MyLCBVTlVTRURfQVVUT0ZJTExfVkFMVUUpCiAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKICAgICAgICAgICAgICAgICAuYWRkRGF0YXNldChuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRBdXRoZW50aWNhdGlvbihhdXRoMzIpCiAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiUDNEMiIpKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0wyQzIsIGJvZ3VzVmFsdWUpIC8vIGZyb20gcHJldmlvdXMgcGFydGl0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfTDNDMSwgYm9ndXNWYWx1ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9MM0MyLCBib2d1c1ZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0wyQzIsIFVOVVNFRF9BVVRPRklMTF9WQUxVRSkgLy8gZnJvbSBwcmV2aW91cyBwYXJ0aXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9MM0MxLCBVTlVTRURfQVVUT0ZJTExfVkFMVUUpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfTDNDMiwgVU5VU0VEX0FVVE9GSUxMX1ZBTFVFKQogICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCiAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CiAgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKHJlc3BvbnNlMyk7CiAKICAgICAgICAgLy8gVHJpZ2dlciBwYXJ0aXRpb24uCi0gICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoMywgMSk7CisgICAgICAgIGZvY3VzQ2VsbCgzLCAxKTsKICAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CiAKICAgICAgICAgLy8gQXNzZXJ0cyBwcm9wZXIgZGF0YXNldHMgYXJlIHNob3duIG9uIGVhY2ggZmllbGQgZGVmaW5lZCBzbyBmYXIuCi0gICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoMSwgMSk7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnREYXRhc2V0cygiUDJEMSIpOwotICAgICAgICBtQWN0aXZpdHkuZm9jdXNDZWxsKDEsIDIpOwotICAgICAgICBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlAzRDEiKTsgLy8gY2hhbmdlZAotICAgICAgICBtQWN0aXZpdHkuZm9jdXNDZWxsKDIsIDEpOwotICAgICAgICBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlAyRDEiKTsKLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgyLCAyKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJQM0QyIik7IC8vIGNoYW5nZWQKLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgzLCAyKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJQM0QxIiwgIlAzRDIiKTsKLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgzLCAxKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJQM0QxIiwgIlAzRDIiKTsKKyAgICAgICAgZm9jdXNDZWxsKDEsIDEpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlAyRDEiKTsKKyAgICAgICAgZm9jdXNDZWxsKDEsIDIpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlAzRDEiKTsgLy8gY2hhbmdlZAorICAgICAgICBmb2N1c0NlbGwoMiwgMSk7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cygiUDJEMSIpOworICAgICAgICBmb2N1c0NlbGwoMiwgMik7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cygiUDNEMiIpOyAvLyBjaGFuZ2VkCisgICAgICAgIGZvY3VzQ2VsbCgzLCAyKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJQM0QxIiwgIlAzRDIiKTsKKyAgICAgICAgZm9jdXNDZWxsKDMsIDEpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlAzRDEiLCAiUDNEMiIpOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiA0dGggcGFydGl0aW9uLgpAQCAtMjAwOSw3ICsyMDA4LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9MM0MxLCAiNGwzYzEiKSAvLyBmcm9tIHByZXZpb3VzIHBhcnRpdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0wzQzIsICI0bDNjMiIpIC8vIGZyb20gcHJldmlvdXMgcGFydGl0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfTDRDMSwgIjRsNGMxIikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oYm9ndXNQcmVzZW50YXRpb24pCiAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CiAgICAgICAgIGZpbmFsIEludGVudFNlbmRlciBhdXRoNDIgPSBBdXRoZW50aWNhdGlvbkFjdGl2aXR5LmNyZWF0ZVNlbmRlcihnZXRDb250ZXh0KCksIDQyLAogICAgICAgICAgICAgICAgIG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQpAQCAtMjAyMiw1NyArMjAyMCw1NiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0wxQzEsICI0TDFDMSIpIC8vIGZyb20gcHJldmlvdXMgcGFydGl0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfTDRDMSwgIjRMNEMxIikKICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9MNEMyLCAiNEw0QzIiKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihib2d1c1ByZXNlbnRhdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKICAgICAgICAgZmluYWwgQ2FubmVkRmlsbFJlc3BvbnNlIHJlc3BvbnNlNCA9IG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpCiAgICAgICAgICAgICAgICAgLmFkZERhdGFzZXQobmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCiAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0QXV0aGVudGljYXRpb24oYXV0aDQxKQogICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oIlA0RDEiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9MMUMxLCBib2d1c1ZhbHVlKSAvLyBmcm9tIHByZXZpb3VzIHBhcnRpdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0wxQzIsIGJvZ3VzVmFsdWUpIC8vIGZyb20gcHJldmlvdXMgcGFydGl0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfTDJDMSwgYm9ndXNWYWx1ZSkgLy8gZnJvbSBwcmV2aW91cyBwYXJ0aXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9MMkMyLCBib2d1c1ZhbHVlKSAvLyBmcm9tIHByZXZpb3VzIHBhcnRpdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0wzQzEsIGJvZ3VzVmFsdWUpIC8vIGZyb20gcHJldmlvdXMgcGFydGl0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfTDNDMiwgYm9ndXNWYWx1ZSkgLy8gZnJvbSBwcmV2aW91cyBwYXJ0aXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9MNEMxLCBib2d1c1ZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0wxQzEsIFVOVVNFRF9BVVRPRklMTF9WQUxVRSkgLy8gZnJvbSBwcmV2aW91cyBwYXJ0aXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9MMUMyLCBVTlVTRURfQVVUT0ZJTExfVkFMVUUpIC8vIGZyb20gcHJldmlvdXMgcGFydGl0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfTDJDMSwgVU5VU0VEX0FVVE9GSUxMX1ZBTFVFKSAvLyBmcm9tIHByZXZpb3VzIHBhcnRpdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0wyQzIsIFVOVVNFRF9BVVRPRklMTF9WQUxVRSkgLy8gZnJvbSBwcmV2aW91cyBwYXJ0aXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9MM0MxLCBVTlVTRURfQVVUT0ZJTExfVkFMVUUpIC8vIGZyb20gcHJldmlvdXMgcGFydGl0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfTDNDMiwgVU5VU0VEX0FVVE9GSUxMX1ZBTFVFKSAvLyBmcm9tIHByZXZpb3VzIHBhcnRpdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0w0QzEsIFVOVVNFRF9BVVRPRklMTF9WQUxVRSkKICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQogICAgICAgICAgICAgICAgIC5hZGREYXRhc2V0KG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQogICAgICAgICAgICAgICAgICAgICAgICAgLnNldEF1dGhlbnRpY2F0aW9uKGF1dGg0MikKICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJQNEQyIikpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfTDFDMSwgYm9ndXNWYWx1ZSkgLy8gZnJvbSBwcmV2aW91cyBwYXJ0aXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9MMUMyLCBib2d1c1ZhbHVlKSAvLyBmcm9tIHByZXZpb3VzIHBhcnRpdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0wyQzEsIGJvZ3VzVmFsdWUpIC8vIGZyb20gcHJldmlvdXMgcGFydGl0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfTDJDMiwgYm9ndXNWYWx1ZSkgLy8gZnJvbSBwcmV2aW91cyBwYXJ0aXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9MM0MxLCBib2d1c1ZhbHVlKSAvLyBmcm9tIHByZXZpb3VzIHBhcnRpdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0wzQzIsIGJvZ3VzVmFsdWUpIC8vIGZyb20gcHJldmlvdXMgcGFydGl0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfTDFDMSwgYm9ndXNWYWx1ZSkgLy8gZnJvbSBwcmV2aW91cyBwYXJ0aXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9MNEMxLCBib2d1c1ZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0w0QzIsIGJvZ3VzVmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfTDFDMSwgVU5VU0VEX0FVVE9GSUxMX1ZBTFVFKSAvLyBmcm9tIHByZXZpb3VzIHBhcnRpdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0wxQzIsIFVOVVNFRF9BVVRPRklMTF9WQUxVRSkgLy8gZnJvbSBwcmV2aW91cyBwYXJ0aXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9MMkMxLCBVTlVTRURfQVVUT0ZJTExfVkFMVUUpIC8vIGZyb20gcHJldmlvdXMgcGFydGl0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfTDJDMiwgVU5VU0VEX0FVVE9GSUxMX1ZBTFVFKSAvLyBmcm9tIHByZXZpb3VzIHBhcnRpdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0wzQzEsIFVOVVNFRF9BVVRPRklMTF9WQUxVRSkgLy8gZnJvbSBwcmV2aW91cyBwYXJ0aXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9MM0MyLCBVTlVTRURfQVVUT0ZJTExfVkFMVUUpIC8vIGZyb20gcHJldmlvdXMgcGFydGl0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfTDFDMSwgVU5VU0VEX0FVVE9GSUxMX1ZBTFVFKSAvLyBmcm9tIHByZXZpb3VzIHBhcnRpdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0w0QzEsIFVOVVNFRF9BVVRPRklMTF9WQUxVRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9MNEMyLCBVTlVTRURfQVVUT0ZJTExfVkFMVUUpCiAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKICAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UocmVzcG9uc2U0KTsKIAogICAgICAgICAvLyBUcmlnZ2VyIHBhcnRpdGlvbi4KLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCg0LCAxKTsKKyAgICAgICAgZm9jdXNDZWxsKDQsIDEpOwogICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKIAogICAgICAgICAvLyBBc3NlcnRzIHByb3BlciBkYXRhc2V0cyBhcmUgc2hvd24gb24gZWFjaCBmaWVsZCBkZWZpbmVkIHNvIGZhci4KLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgxLCAxKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJQNEQxIiwgIlA0RDIiKTsKLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgxLCAyKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJQNEQxIiwgIlA0RDIiKTsKLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgyLCAxKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJQNEQxIiwgIlA0RDIiKTsKLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgyLCAyKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJQNEQxIiwgIlA0RDIiKTsKLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgzLCAyKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJQNEQxIiwgIlA0RDIiKTsKLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgzLCAxKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJQNEQxIiwgIlA0RDIiKTsKLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCg0LCAxKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJQNEQxIiwgIlA0RDIiKTsKLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCg0LCAyKTsKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJQNEQyIik7CisgICAgICAgIGZvY3VzQ2VsbCgxLCAxKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJQNEQxIiwgIlA0RDIiKTsKKyAgICAgICAgZm9jdXNDZWxsKDEsIDIpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlA0RDEiLCAiUDREMiIpOworICAgICAgICBmb2N1c0NlbGwoMiwgMSk7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cygiUDREMSIsICJQNEQyIik7CisgICAgICAgIGZvY3VzQ2VsbCgyLCAyKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJQNEQxIiwgIlA0RDIiKTsKKyAgICAgICAgZm9jdXNDZWxsKDMsIDIpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlA0RDEiLCAiUDREMiIpOworICAgICAgICBmb2N1c0NlbGwoMywgMSk7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cygiUDREMSIsICJQNEQyIik7CisgICAgICAgIGZvY3VzQ2VsbCg0LCAxKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJQNEQxIiwgIlA0RDIiKTsKKyAgICAgICAgZm9jdXNDZWxsKDQsIDIpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlA0RDIiKTsKIAogICAgICAgICAvKgogICAgICAgICAgKiBGaW5hbGx5LCBhdXRvZmlsbCBhbmQgY2hlY2sgcmVzdWx0cy4KQEAgLTIxMDIsOSArMjA5OSw5IEBACiAgICAgICAgICAgICBjaG9zZW5PbmUgPSAiUDREMiI7CiAgICAgICAgIH0KIAotICAgICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoNCwgMSk7Ci0gICAgICAgICAgc1VpQm90LnNlbGVjdERhdGFzZXQoY2hvc2VuT25lKTsKLSAgICAgICAgICBleHBlY3RhdGlvbi5hc3NlcnRBdXRvRmlsbGVkKCk7CisgICAgICAgIGZvY3VzQ2VsbCg0LCAxKTsKKyAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQoY2hvc2VuT25lKTsKKyAgICAgICAgZXhwZWN0YXRpb24uYXNzZXJ0QXV0b0ZpbGxlZCgpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0yMTI5LDEwICsyMTI2LDEwIEBACiAgICAgICAgIGZpbmFsIEZpbGxFeHBlY3RhdGlvbiBleHBlY3RhdGlvbjEgPSBtQWN0aXZpdHkuZXhwZWN0QXV0b2ZpbGwoKQogICAgICAgICAgICAgICAgIC5vbkNlbGwoMSwgMSwgImwxYzEiKQogICAgICAgICAgICAgICAgIC5vbkNlbGwoMSwgMiwgImwxYzIiKTsKLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgxLCAxKTsKKyAgICAgICAgZm9jdXNDZWxsKDEsIDEpOwogICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKIAotICAgICAgICBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoIkF1dGggMSIpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIkF1dGggMSIpOwogCiAgICAgICAgIC8vIFByZXBhcmUgMm5kIHBhcnRpdGlvbi4KICAgICAgICAgZmluYWwgSW50ZW50U2VuZGVyIGF1dGgyID0gQXV0aGVudGljYXRpb25BY3Rpdml0eS5jcmVhdGVTZW5kZXIoZ2V0Q29udGV4dCgpLCAyLApAQCAtMjE1MSwxMCArMjE0OCwxMCBAQAogICAgICAgICBmaW5hbCBGaWxsRXhwZWN0YXRpb24gZXhwZWN0YXRpb24yID0gbUFjdGl2aXR5LmV4cGVjdEF1dG9maWxsKCkKICAgICAgICAgICAgICAgICAub25DZWxsKDIsIDEsICJsMmMxIikKICAgICAgICAgICAgICAgICAub25DZWxsKDIsIDIsICJsMmMyIik7Ci0gICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoMiwgMSk7CisgICAgICAgIGZvY3VzQ2VsbCgyLCAxKTsKICAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CiAKLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJBdXRoIDIiKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJBdXRoIDIiKTsKIAogICAgICAgICAvLyBQcmVwYXJlIDNyZCBwYXJ0aXRpb24uCiAgICAgICAgIGZpbmFsIEludGVudFNlbmRlciBhdXRoMyA9IEF1dGhlbnRpY2F0aW9uQWN0aXZpdHkuY3JlYXRlU2VuZGVyKGdldENvbnRleHQoKSwgMywKQEAgLTIxNzMsMTAgKzIxNzAsMTAgQEAKICAgICAgICAgZmluYWwgRmlsbEV4cGVjdGF0aW9uIGV4cGVjdGF0aW9uMyA9IG1BY3Rpdml0eS5leHBlY3RBdXRvZmlsbCgpCiAgICAgICAgICAgICAgICAgLm9uQ2VsbCgzLCAxLCAibDNjMSIpCiAgICAgICAgICAgICAgICAgLm9uQ2VsbCgzLCAyLCAibDNjMiIpOwotICAgICAgICBtQWN0aXZpdHkuZm9jdXNDZWxsKDMsIDEpOworICAgICAgICBmb2N1c0NlbGwoMywgMSk7CiAgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwogCi0gICAgICAgIHNVaUJvdC5hc3NlcnREYXRhc2V0cygiQXV0aCAzIik7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cygiQXV0aCAzIik7CiAKICAgICAgICAgLy8gUHJlcGFyZSA0dGggcGFydGl0aW9uLgogICAgICAgICBmaW5hbCBJbnRlbnRTZW5kZXIgYXV0aDQgPSBBdXRoZW50aWNhdGlvbkFjdGl2aXR5LmNyZWF0ZVNlbmRlcihnZXRDb250ZXh0KCksIDQsCkBAIC0yMTk1LDUyICsyMTkyLDUyIEBACiAgICAgICAgIGZpbmFsIEZpbGxFeHBlY3RhdGlvbiBleHBlY3RhdGlvbjQgPSBtQWN0aXZpdHkuZXhwZWN0QXV0b2ZpbGwoKQogICAgICAgICAgICAgICAgIC5vbkNlbGwoNCwgMSwgImw0YzEiKQogICAgICAgICAgICAgICAgIC5vbkNlbGwoNCwgMiwgImw0YzIiKTsKLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCg0LCAxKTsKKyAgICAgICAgZm9jdXNDZWxsKDQsIDEpOwogICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKIAotICAgICAgICBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoIkF1dGggNCIpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIkF1dGggNCIpOwogCiAgICAgICAgIC8vIE5vdyBwbGF5IGFyb3VuZCB0aGUgZm9jdXMgdG8gbWFrZSBzdXJlIHRoZXkgc3RpbGwgZGlzcGxheSB0aGUgcmlnaHQgdmFsdWVzLgogCi0gICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoMSwgMik7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnREYXRhc2V0cygiQXV0aCAxIik7Ci0gICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoMSwgMSk7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnREYXRhc2V0cygiQXV0aCAxIik7CisgICAgICAgIGZvY3VzQ2VsbCgxLCAyKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJBdXRoIDEiKTsKKyAgICAgICAgZm9jdXNDZWxsKDEsIDEpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIkF1dGggMSIpOwogCi0gICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoMywgMSk7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnREYXRhc2V0cygiQXV0aCAzIik7Ci0gICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoMywgMik7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnREYXRhc2V0cygiQXV0aCAzIik7CisgICAgICAgIGZvY3VzQ2VsbCgzLCAxKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJBdXRoIDMiKTsKKyAgICAgICAgZm9jdXNDZWxsKDMsIDIpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIkF1dGggMyIpOwogCi0gICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoMiwgMSk7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnREYXRhc2V0cygiQXV0aCAyIik7Ci0gICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoNCwgMik7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnREYXRhc2V0cygiQXV0aCA0Iik7CisgICAgICAgIGZvY3VzQ2VsbCgyLCAxKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJBdXRoIDIiKTsKKyAgICAgICAgZm9jdXNDZWxsKDQsIDIpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIkF1dGggNCIpOwogCi0gICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoMiwgMik7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnREYXRhc2V0cygiQXV0aCAyIik7Ci0gICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoNCwgMSk7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnREYXRhc2V0cygiQXV0aCA0Iik7CisgICAgICAgIGZvY3VzQ2VsbCgyLCAyKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJBdXRoIDIiKTsKKyAgICAgICAgZm9jdXNDZWxsKDQsIDEpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIkF1dGggNCIpOwogCiAgICAgICAgIC8vIEZpbmFsbHksIGF1dG9maWxsIGFuZCBjaGVjayB0aGVtLgotICAgICAgICBtQWN0aXZpdHkuZm9jdXNDZWxsKDIsIDEpOwotICAgICAgICBzVWlCb3Quc2VsZWN0RGF0YXNldCgiQXV0aCAyIik7Ci0gICAgICAgIHNVaUJvdC5zZWxlY3REYXRhc2V0KCJQYXJ0aXRpb24gMiIpOworICAgICAgICBmb2N1c0NlbGwoMiwgMSk7CisgICAgICAgIG1VaUJvdC5zZWxlY3REYXRhc2V0KCJBdXRoIDIiKTsKKyAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQoIlBhcnRpdGlvbiAyIik7CiAgICAgICAgIGV4cGVjdGF0aW9uMi5hc3NlcnRBdXRvRmlsbGVkKCk7CiAKLSAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCg0LCAxKTsKLSAgICAgICAgc1VpQm90LnNlbGVjdERhdGFzZXQoIkF1dGggNCIpOwotICAgICAgICBzVWlCb3Quc2VsZWN0RGF0YXNldCgiUGFydGl0aW9uIDQiKTsKKyAgICAgICAgZm9jdXNDZWxsKDQsIDEpOworICAgICAgICBtVWlCb3Quc2VsZWN0RGF0YXNldCgiQXV0aCA0Iik7CisgICAgICAgIG1VaUJvdC5zZWxlY3REYXRhc2V0KCJQYXJ0aXRpb24gNCIpOwogICAgICAgICBleHBlY3RhdGlvbjQuYXNzZXJ0QXV0b0ZpbGxlZCgpOwogCi0gICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoMywgMSk7Ci0gICAgICAgIHNVaUJvdC5zZWxlY3REYXRhc2V0KCJBdXRoIDMiKTsKLSAgICAgICAgc1VpQm90LnNlbGVjdERhdGFzZXQoIlBhcnRpdGlvbiAzIik7CisgICAgICAgIGZvY3VzQ2VsbCgzLCAxKTsKKyAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQoIkF1dGggMyIpOworICAgICAgICBtVWlCb3Quc2VsZWN0RGF0YXNldCgiUGFydGl0aW9uIDMiKTsKICAgICAgICAgZXhwZWN0YXRpb24zLmFzc2VydEF1dG9GaWxsZWQoKTsKIAotICAgICAgICBtQWN0aXZpdHkuZm9jdXNDZWxsKDEsIDEpOwotICAgICAgICBzVWlCb3Quc2VsZWN0RGF0YXNldCgiQXV0aCAxIik7Ci0gICAgICAgIHNVaUJvdC5zZWxlY3REYXRhc2V0KCJQYXJ0aXRpb24gMSIpOworICAgICAgICBmb2N1c0NlbGwoMSwgMSk7CisgICAgICAgIG1VaUJvdC5zZWxlY3REYXRhc2V0KCJBdXRoIDEiKTsKKyAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQoIlBhcnRpdGlvbiAxIik7CiAgICAgICAgIGV4cGVjdGF0aW9uMS5hc3NlcnRBdXRvRmlsbGVkKCk7CiAgICAgfQogCkBAIC0yMjYyLDEzICsyMjU5LDEzIEBACiAgICAgICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShyZXNwb25zZTEpOwogCiAgICAgICAgICAgICAvLyBUcmlnZ2VyIGF1dG9maWxsLgotICAgICAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgxLCAxKTsKKyAgICAgICAgICAgIGZvY3VzQ2VsbCgxLCAxKTsKICAgICAgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwogCiAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgVUkgaXMgc2hvd24sIGJ1dCBkb24ndCB0YXAgaXQuCi0gICAgICAgICAgICBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoImwxYzEiKTsKLSAgICAgICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoMSwgMik7Ci0gICAgICAgICAgICBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoImwxYzIiKTsKKyAgICAgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cygibDFjMSIpOworICAgICAgICAgICAgZm9jdXNDZWxsKDEsIDIpOworICAgICAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJsMWMyIik7CiAKICAgICAgICAgICAgIC8vIFByZXBhcmUgMm5kIHBhcnRpdGlvbi4KICAgICAgICAgICAgIGZpbmFsIENhbm5lZEZpbGxSZXNwb25zZSByZXNwb25zZTIgPSBuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKQpAQCAtMjI3OSwxNiArMjI3NiwxNiBAQAogICAgICAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UocmVzcG9uc2UyKTsKIAogICAgICAgICAgICAgLy8gVHJpZ2dlciBhdXRvZmlsbCBvbiAybmQgcGFydGl0aW9uLgotICAgICAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgyLCAxKTsKKyAgICAgICAgICAgIGZvY3VzQ2VsbCgyLCAxKTsKIAogICAgICAgICAgICAgLy8gTWFrZSBzdXJlIGl0IHdhcyBpZ25vcmVkLgotICAgICAgICAgICAgc1VpQm90LmFzc2VydE5vRGF0YXNldHMoKTsKKyAgICAgICAgICAgIG1VaUJvdC5hc3NlcnROb0RhdGFzZXRzKCk7CiAKICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSAxc3QgcGFydGl0aW9uIGlzIHN0aWxsIHdvcmtpbmcuCi0gICAgICAgICAgICBtQWN0aXZpdHkuZm9jdXNDZWxsKDEsIDIpOwotICAgICAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJsMWMyIik7Ci0gICAgICAgICAgICBtQWN0aXZpdHkuZm9jdXNDZWxsKDEsIDEpOwotICAgICAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJsMWMxIik7CisgICAgICAgICAgICBmb2N1c0NlbGwoMSwgMik7CisgICAgICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoImwxYzIiKTsKKyAgICAgICAgICAgIGZvY3VzQ2VsbCgxLCAxKTsKKyAgICAgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cygibDFjMSIpOwogCiAgICAgICAgICAgICAvLyBQcmVwYXJlIDNyZCBwYXJ0aXRpb24uCiAgICAgICAgICAgICBmaW5hbCBDYW5uZWRGaWxsUmVzcG9uc2UgcmVzcG9uc2UzID0gbmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkKQEAgLTIyOTgsMjEgKzIyOTUsMjEgQEAKICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CiAgICAgICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShyZXNwb25zZTMpOwogICAgICAgICAgICAgLy8gVHJpZ2dlciBhdXRvZmlsbCBvbiAzcmQgcGFydGl0aW9uLgotICAgICAgICAgICAgbUFjdGl2aXR5LmZvY3VzQ2VsbCgzLCAyKTsKKyAgICAgICAgICAgIGZvY3VzQ2VsbCgzLCAyKTsKIAogICAgICAgICAgICAgLy8gTWFrZSBzdXJlIGl0IHdhcyBpZ25vcmVkLgotICAgICAgICAgICAgc1VpQm90LmFzc2VydE5vRGF0YXNldHMoKTsKKyAgICAgICAgICAgIG1VaUJvdC5hc3NlcnROb0RhdGFzZXRzKCk7CiAKICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSAxc3QgcGFydGl0aW9uIGlzIHN0aWxsIHdvcmtpbmcuLi4KLSAgICAgICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoMSwgMik7Ci0gICAgICAgICAgICBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoImwxYzIiKTsKLSAgICAgICAgICAgIG1BY3Rpdml0eS5mb2N1c0NlbGwoMSwgMSk7Ci0gICAgICAgICAgICBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoImwxYzEiKTsKKyAgICAgICAgICAgIGZvY3VzQ2VsbCgxLCAyKTsKKyAgICAgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cygibDFjMiIpOworICAgICAgICAgICAgZm9jdXNDZWxsKDEsIDEpOworICAgICAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJsMWMxIik7CiAKICAgICAgICAgICAgIC8vLi4uYW5kIGNhbiBiZSBhdXRvZmlsbGVkLgogICAgICAgICAgICAgZmluYWwgRmlsbEV4cGVjdGF0aW9uIGV4cGVjdGF0aW9uID0gbUFjdGl2aXR5LmV4cGVjdEF1dG9maWxsKCkKICAgICAgICAgICAgICAgICAgICAgLm9uQ2VsbCgxLCAxLCAibDFjMSIpOwotICAgICAgICAgICAgc1VpQm90LnNlbGVjdERhdGFzZXQoImwxYzEiKTsKKyAgICAgICAgICAgIG1VaUJvdC5zZWxlY3REYXRhc2V0KCJsMWMxIik7CiAgICAgICAgICAgICBleHBlY3RhdGlvbi5hc3NlcnRBdXRvRmlsbGVkKCk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBzZXRNYXhQYXJ0aXRpb25zKG1heEJlZm9yZSk7CmRpZmYgLS1naXQgYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9QcmVGaWxsZWRMb2dpbkFjdGl2aXR5VGVzdC5qYXZhIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvUHJlRmlsbGVkTG9naW5BY3Rpdml0eVRlc3QuamF2YQppbmRleCA3NWM3NDJmLi43Y2E0OTZiIDEwMDY0NAotLS0gYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9QcmVGaWxsZWRMb2dpbkFjdGl2aXR5VGVzdC5qYXZhCisrKyBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL1ByZUZpbGxlZExvZ2luQWN0aXZpdHlUZXN0LmphdmEKQEAgLTIwLDYgKzIwLDcgQEAKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5JRF9VU0VSTkFNRTsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5JRF9VU0VSTkFNRV9MQUJFTDsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5hc3NlcnRUZXh0QW5kVmFsdWU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5IZWxwZXIuYXNzZXJ0VGV4dEZyb21SZXNvdWNlczsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5hc3NlcnRUZXh0SXNTYW5pdGl6ZWQ7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5IZWxwZXIuYXNzZXJ0VGV4dE9ubHk7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5IZWxwZXIuZmluZE5vZGVCeVJlc291cmNlSWQ7CkBAIC0yNyw4ICsyOCw4IEBACiAKIGltcG9ydCBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSW5zdHJ1bWVudGVkQXV0b0ZpbGxTZXJ2aWNlLkZpbGxSZXF1ZXN0OwogaW1wb3J0IGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5JbnN0cnVtZW50ZWRBdXRvRmlsbFNlcnZpY2UuU2F2ZVJlcXVlc3Q7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOwogCi1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CkBAIC0zNiw2ICszNyw3IEBACiAvKioKICAqIENvdmVycyBzY2VuYXJpb3Mgd2hlcmUgdGhlIGJlaGF2aW9yIGlzIGRpZmZlcmVudCBiZWNhdXNlIHNvbWUgZmllbGRzIHdlcmUgcHJlLWZpbGxlZC4KICAqLworQEFwcE1vZGVGdWxsIC8vIExvZ2luQWN0aXZpdHlUZXN0IGlzIGVub3VnaCB0byB0ZXN0IGVwaGVtZXJhbCBhcHBzIHN1cHBvcnQKIHB1YmxpYyBjbGFzcyBQcmVGaWxsZWRMb2dpbkFjdGl2aXR5VGVzdCBleHRlbmRzIEF1dG9GaWxsU2VydmljZVRlc3RDYXNlIHsKIAogICAgIEBSdWxlCkBAIC00OSwxMSArNTEsNiBAQAogICAgICAgICBtQWN0aXZpdHkgPSBtQWN0aXZpdHlSdWxlLmdldEFjdGl2aXR5KCk7CiAgICAgfQogCi0gICAgQEFmdGVyCi0gICAgcHVibGljIHZvaWQgZmluaXNoV2VsY29tZUFjdGl2aXR5KCkgewotICAgICAgICBXZWxjb21lQWN0aXZpdHkuZmluaXNoSXQoKTsKLSAgICB9Ci0KICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTYW5pdGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gU2V0IHNlcnZpY2UuCkBAIC03OCw4ICs3NSw4IEBACiAgICAgICAgIGFzc2VydFRleHRJc1Nhbml0aXplZChmaWxsUmVxdWVzdC5zdHJ1Y3R1cmUsIElEX1VTRVJOQU1FX0xBQkVMKTsKIAogICAgICAgICAvLyAuLi5wYXNzd29yZCBsYWJlbCBzaG91bGQgYmUgb2sgYmVjYXVzZSBpdCB3YXMgc2V0IGZyb20gb3RoZXIgcmVzb3VyY2UgaWQKLSAgICAgICAgYXNzZXJ0VGV4dE9ubHkoZmluZE5vZGVCeVJlc291cmNlSWQoZmlsbFJlcXVlc3Quc3RydWN0dXJlLCBJRF9QQVNTV09SRF9MQUJFTCksCi0gICAgICAgICAgICAgICAgIkRBIFBBU1NXT1JEIik7CisgICAgICAgIGFzc2VydFRleHRGcm9tUmVzb3VjZXMoZmlsbFJlcXVlc3Quc3RydWN0dXJlLCBJRF9QQVNTV09SRF9MQUJFTCwgIkRBIFBBU1NXT1JEIiwgZmFsc2UsCisgICAgICAgICAgICAgICAgIm5ld19wYXNzd29yZF9sYWJlbCIpOwogCiAgICAgICAgIC8vIC4uLnVzZXJuYW1lIGFuZCBwYXNzd29yZCBzaG91bGQgYmUgb2sgYmVjYXVzZSB0aGV5IHdlcmUgc2V0IGluIHRoZSBTTUwKICAgICAgICAgYXNzZXJ0VGV4dEFuZFZhbHVlKGZpbmROb2RlQnlSZXNvdXJjZUlkKGZpbGxSZXF1ZXN0LnN0cnVjdHVyZSwgSURfVVNFUk5BTUUpLApAQCAtOTIsMTMgKzg5LDEzIEBACiAgICAgICAgIG1BY3Rpdml0eS50YXBMb2dpbigpOwogCiAgICAgICAgIC8vIEFzc2VydCB0aGUgc25hY2sgYmFyIGlzIHNob3duIGFuZCB0YXAgIlNhdmUiLgotICAgICAgICBzVWlCb3Quc2F2ZUZvckF1dG9maWxsKHRydWUsIFNBVkVfREFUQV9UWVBFX1BBU1NXT1JEKTsKKyAgICAgICAgbVVpQm90LnNhdmVGb3JBdXRvZmlsbCh0cnVlLCBTQVZFX0RBVEFfVFlQRV9QQVNTV09SRCk7CiAgICAgICAgIGZpbmFsIFNhdmVSZXF1ZXN0IHNhdmVSZXF1ZXN0ID0gc1JlcGxpZXIuZ2V0TmV4dFNhdmVSZXF1ZXN0KCk7CiAKICAgICAgICAgLy8gQXNzZXJ0IHNhbml0aXphdGlvbiBvbiBzYXZlOiBldmVyeXRoaW5nIHNob3VsZCBiZSBhdmFpbGFibGUhCiAgICAgICAgIGFzc2VydFRleHRPbmx5KGZpbmROb2RlQnlSZXNvdXJjZUlkKHNhdmVSZXF1ZXN0LnN0cnVjdHVyZSwgSURfVVNFUk5BTUVfTEFCRUwpLCAiREEgVVNFUiIpOwotICAgICAgICBhc3NlcnRUZXh0T25seShmaW5kTm9kZUJ5UmVzb3VyY2VJZChzYXZlUmVxdWVzdC5zdHJ1Y3R1cmUsIElEX1BBU1NXT1JEX0xBQkVMKSwKLSAgICAgICAgICAgICAgICAiREEgUEFTU1dPUkQiKTsKKyAgICAgICAgYXNzZXJ0VGV4dEZyb21SZXNvdWNlcyhzYXZlUmVxdWVzdC5zdHJ1Y3R1cmUsIElEX1BBU1NXT1JEX0xBQkVMLCAiREEgUEFTU1dPUkQiLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAibmV3X3Bhc3N3b3JkX2xhYmVsIik7CiAgICAgICAgIGFzc2VydFRleHRBbmRWYWx1ZShmaW5kTm9kZUJ5UmVzb3VyY2VJZChzYXZlUmVxdWVzdC5zdHJ1Y3R1cmUsIElEX1VTRVJOQU1FKSwgIm1hbGtvdmljaCIpOwogICAgICAgICBhc3NlcnRUZXh0QW5kVmFsdWUoZmluZE5vZGVCeVJlc291cmNlSWQoc2F2ZVJlcXVlc3Quc3RydWN0dXJlLCBJRF9QQVNTV09SRCksICJtYWxrb3ZpY2giKTsKICAgICB9CmRpZmYgLS1naXQgYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9QcmVTaW1wbGVTYXZlQWN0aXZpdHkuamF2YSBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL1ByZVNpbXBsZVNhdmVBY3Rpdml0eS5qYXZhCmluZGV4IDVjZGNmOWIuLjFjYjU5NDIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL1ByZVNpbXBsZVNhdmVBY3Rpdml0eS5qYXZhCisrKyBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL1ByZVNpbXBsZVNhdmVBY3Rpdml0eS5qYXZhCkBAIC0yOSwxMCArMjksMjAgQEAKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIElEX1BSRV9MQUJFTCA9ICJwcmVMYWJlbCI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9QUkVfSU5QVVQgPSAicHJlSW5wdXQiOwogCisgICAgcHJpdmF0ZSBzdGF0aWMgUHJlU2ltcGxlU2F2ZUFjdGl2aXR5IHNJbnN0YW5jZTsKKwogICAgIFRleHRWaWV3IG1QcmVMYWJlbDsKICAgICBFZGl0VGV4dCBtUHJlSW5wdXQ7CiAgICAgQnV0dG9uIG1TdWJtaXQ7CiAKKyAgICBwdWJsaWMgc3RhdGljIFByZVNpbXBsZVNhdmVBY3Rpdml0eSBnZXRJbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIHNJbnN0YW5jZTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJlU2ltcGxlU2F2ZUFjdGl2aXR5KCkgeworICAgICAgICBzSW5zdGFuY2UgPSB0aGlzOworICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKQEAgLTQ4LDQgKzU4LDIyIEBACiAgICAgICAgICAgICBzdGFydEFjdGl2aXR5KG5ldyBJbnRlbnQodGhpcywgU2ltcGxlU2F2ZUFjdGl2aXR5LmNsYXNzKSk7CiAgICAgICAgIH0pOwogICAgIH0KKworICAgIEZpbGxFeHBlY3RhdGlvbiBleHBlY3RBdXRvRmlsbChTdHJpbmcgaW5wdXQpIHsKKyAgICAgICAgZmluYWwgRmlsbEV4cGVjdGF0aW9uIGV4cGVjdGF0aW9uID0gbmV3IEZpbGxFeHBlY3RhdGlvbihpbnB1dCk7CisgICAgICAgIG1QcmVJbnB1dC5hZGRUZXh0Q2hhbmdlZExpc3RlbmVyKGV4cGVjdGF0aW9uLm1JbnB1dFdhdGNoZXIpOworICAgICAgICByZXR1cm4gZXhwZWN0YXRpb247CisgICAgfQorCisgICAgZmluYWwgY2xhc3MgRmlsbEV4cGVjdGF0aW9uIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBPbmVUaW1lVGV4dFdhdGNoZXIgbUlucHV0V2F0Y2hlcjsKKworICAgICAgICBwcml2YXRlIEZpbGxFeHBlY3RhdGlvbihTdHJpbmcgaW5wdXQpIHsKKyAgICAgICAgICAgIG1JbnB1dFdhdGNoZXIgPSBuZXcgT25lVGltZVRleHRXYXRjaGVyKCJpbnB1dCIsIG1QcmVJbnB1dCwgaW5wdXQpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBhc3NlcnRBdXRvRmlsbGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBtSW5wdXRXYXRjaGVyLmFzc2VydEF1dG9GaWxsZWQoKTsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL1ByZVNpbXBsZVNhdmVBY3Rpdml0eVRlc3QuamF2YSBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL1ByZVNpbXBsZVNhdmVBY3Rpdml0eVRlc3QuamF2YQppbmRleCBiMTkzZGRmLi5iMzI1N2YwIDEwMDY0NAotLS0gYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9QcmVTaW1wbGVTYXZlQWN0aXZpdHlUZXN0LmphdmEKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvUHJlU2ltcGxlU2F2ZUFjdGl2aXR5VGVzdC5qYXZhCkBAIC0xNSw2ICsxNSw3IEBACiAgKi8KIHBhY2thZ2UgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzOwogCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5IZWxwZXIuSURfU1RBVElDX1RFWFQ7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5IZWxwZXIuYXNzZXJ0VGV4dEFuZFZhbHVlOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSGVscGVyLmZpbmROb2RlQnlSZXNvdXJjZUlkOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuTG9naW5BY3Rpdml0eS5JRF9VU0VSTkFNRV9DT05UQUlORVI7CkBAIC0yNCwxMyArMjUsMjQgQEAKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2aWNlLmF1dG9maWxsLlNhdmVJbmZvLlNBVkVfREFUQV9UWVBFX0VNQUlMX0FERFJFU1M7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmljZS5hdXRvZmlsbC5TYXZlSW5mby5TQVZFX0RBVEFfVFlQRV9QQVNTV09SRDsKIAoraW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi50cnV0aC5UcnV0aC5hc3NlcnRUaGF0OworCiBpbXBvcnQgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkluc3RydW1lbnRlZEF1dG9GaWxsU2VydmljZS5TYXZlUmVxdWVzdDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuc2VydmljZS5hdXRvZmlsbC5CYXRjaFVwZGF0ZXM7CitpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLmF1dG9maWxsLkN1c3RvbURlc2NyaXB0aW9uOworaW1wb3J0IGFuZHJvaWQuc2VydmljZS5hdXRvZmlsbC5SZWdleFZhbGlkYXRvcjsKK2ltcG9ydCBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuVmFsaWRhdG9yOworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLkJ5OwogaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLlVpT2JqZWN0MjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3czsKIAoraW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIAoraW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCiBwdWJsaWMgY2xhc3MgUHJlU2ltcGxlU2F2ZUFjdGl2aXR5VGVzdCBleHRlbmRzIEN1c3RvbURlc2NyaXB0aW9uV2l0aExpbmtUZXN0Q2FzZSB7CiAKICAgICBAUnVsZQpAQCAtNDMsMTEgKzU1LDE2IEBACiAgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KG1Db250ZXh0LCBQcmVTaW1wbGVTYXZlQWN0aXZpdHkuY2xhc3MpOwogICAgICAgICBpZiAocmVtYWluT25SZWNlbnRzKSB7CiAgICAgICAgICAgICBpbnRlbnQuc2V0RmxhZ3MoCi0gICAgICAgICAgICAgICAgICAgIEludGVudC5GTEFHX0FDVElWSVRZX1JFVEFJTl9JTl9SRUNFTlRTIHwgSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX0RPQ1VNRU5UKTsKKyAgICAgICAgICAgICAgICAgICAgSW50ZW50LkZMQUdfQUNUSVZJVFlfUkVUQUlOX0lOX1JFQ0VOVFMgfCBJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7CiAgICAgICAgIH0KICAgICAgICAgbUFjdGl2aXR5ID0gbUFjdGl2aXR5UnVsZS5sYXVuY2hBY3Rpdml0eShpbnRlbnQpOwogICAgIH0KIAorICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIGZpbmlzaFNpbXBsZVNhdmVBY3Rpdml0eSgpIHsKKyAgICAgICAgU2ltcGxlU2F2ZUFjdGl2aXR5LmZpbmlzaEl0KG1VaUJvdCk7CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgc2F2ZVVpUmVzdG9yZWRBZnRlclRhcHBpbmdMaW5rVGVzdChQb3N0U2F2ZUxpbmtUYXBwZWRBY3Rpb24gdHlwZSkKICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewpAQCAtNzIsMjcgKzg5LDI4IEBACiAgICAgICAgICAgICBtQWN0aXZpdHkubVN1Ym1pdC5wZXJmb3JtQ2xpY2soKTsKICAgICAgICAgfSk7CiAgICAgICAgIC8vIE1ha2Ugc3VyZSBwb3N0LXNhdmUgYWN0aXZpdHkgaXMgc2hvd24uLi4KLSAgICAgICAgc1VpQm90LmFzc2VydFNob3duQnlSZWxhdGl2ZUlkKElEX0lOUFVUKTsKKyAgICAgICAgbVVpQm90LmFzc2VydFNob3duQnlSZWxhdGl2ZUlkKElEX0lOUFVUKTsKIAogICAgICAgICAvLyBUYXAgdGhlIGxpbmsuCiAgICAgICAgIGZpbmFsIFVpT2JqZWN0MiBzYXZlVWkgPSBhc3NlcnRTYXZlVWlXaXRoTGlua0lzU2hvd24oU0FWRV9EQVRBX1RZUEVfUEFTU1dPUkQpOwogICAgICAgICB0YXBTYXZlVWlMaW5rKHNhdmVVaSk7CiAKICAgICAgICAgLy8gTWFrZSBzdXJlIG5ldyBhY3Rpdml0eSBpcyBzaG93bi4uLgotICAgICAgICBXZWxjb21lQWN0aXZpdHkuYXNzZXJ0U2hvd2luZ0RlZmF1bHRNZXNzYWdlKHNVaUJvdCk7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnRTYXZlTm90U2hvd2luZyhTQVZFX0RBVEFfVFlQRV9QQVNTV09SRCk7CisgICAgICAgIFdlbGNvbWVBY3Rpdml0eS5hc3NlcnRTaG93aW5nRGVmYXVsdE1lc3NhZ2UobVVpQm90KTsKKyAgICAgICAgbVVpQm90LmFzc2VydFNhdmVOb3RTaG93aW5nKFNBVkVfREFUQV9UWVBFX1BBU1NXT1JEKTsKIAogICAgICAgICAvLyAuLiB0aGVuIGRvIHNvbWV0aGluZyB0byByZXR1cm4gdG8gcHJldmlvdXMgYWN0aXZpdHkuLi4KICAgICAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgICAgICBjYXNlIFJPVEFURV9USEVOX1RBUF9CQUNLX0JVVFRPTjoKLSAgICAgICAgICAgICAgICBzVWlCb3Quc2V0U2NyZWVuT3JpZW50YXRpb24oVWlCb3QuTEFORFNDQVBFKTsKKyAgICAgICAgICAgICAgICBtVWlCb3Quc2V0U2NyZWVuT3JpZW50YXRpb24oVWlCb3QuTEFORFNDQVBFKTsKKyAgICAgICAgICAgICAgICBXZWxjb21lQWN0aXZpdHkuYXNzZXJ0U2hvd2luZ0RlZmF1bHRNZXNzYWdlKG1VaUJvdCk7CiAgICAgICAgICAgICAgICAgLy8gbm90IGJyZWFraW5nIG9uIHB1cnBvc2UKICAgICAgICAgICAgIGNhc2UgVEFQX0JBQ0tfQlVUVE9OOgotICAgICAgICAgICAgICAgIHNVaUJvdC5wcmVzc0JhY2soKTsKKyAgICAgICAgICAgICAgICBtVWlCb3QucHJlc3NCYWNrKCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIEZJTklTSF9BQ1RJVklUWToKICAgICAgICAgICAgICAgICAvLyAuLnRoZW4gZmluaXNoZXMgaXQuCi0gICAgICAgICAgICAgICAgV2VsY29tZUFjdGl2aXR5LmZpbmlzaEl0KCk7CisgICAgICAgICAgICAgICAgV2VsY29tZUFjdGl2aXR5LmZpbmlzaEl0KG1VaUJvdCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgdHlwZTogIiArIHR5cGUpOwpAQCAtMTAwLDcgKzExOCw3IEBACiAKICAgICAgICAgLy8gLi4uIGFuZCB0YXAgc2F2ZS4KICAgICAgICAgZmluYWwgVWlPYmplY3QyIG5ld1NhdmVVaSA9IGFzc2VydFNhdmVVaVdpdGhMaW5rSXNTaG93bihTQVZFX0RBVEFfVFlQRV9QQVNTV09SRCk7Ci0gICAgICAgIHNVaUJvdC5zYXZlRm9yQXV0b2ZpbGwobmV3U2F2ZVVpLCB0cnVlKTsKKyAgICAgICAgbVVpQm90LnNhdmVGb3JBdXRvZmlsbChuZXdTYXZlVWksIHRydWUpOwogCiAgICAgICAgIGZpbmFsIFNhdmVSZXF1ZXN0IHNhdmVSZXF1ZXN0ID0gc1JlcGxpZXIuZ2V0TmV4dFNhdmVSZXF1ZXN0KCk7CiAgICAgICAgIGFzc2VydFRleHRBbmRWYWx1ZShmaW5kTm9kZUJ5UmVzb3VyY2VJZChzYXZlUmVxdWVzdC5zdHJ1Y3R1cmUsIElEX1BSRV9JTlBVVCksICIxMDgiKTsKQEAgLTEzMCw0NSArMTQ4LDQzIEBACiAgICAgICAgICAgICBtQWN0aXZpdHkubVN1Ym1pdC5wZXJmb3JtQ2xpY2soKTsKICAgICAgICAgfSk7CiAgICAgICAgIC8vIE1ha2Ugc3VyZSBwb3N0LXNhdmUgYWN0aXZpdHkgaXMgc2hvd24uLi4KLSAgICAgICAgc1VpQm90LmFzc2VydFNob3duQnlSZWxhdGl2ZUlkKElEX0lOUFVUKTsKKyAgICAgICAgbVVpQm90LmFzc2VydFNob3duQnlSZWxhdGl2ZUlkKElEX0lOUFVUKTsKIAogICAgICAgICAvLyBUYXAgdGhlIGxpbmsuCiAgICAgICAgIGZpbmFsIFVpT2JqZWN0MiBzYXZlVWkgPSBhc3NlcnRTYXZlVWlXaXRoTGlua0lzU2hvd24oU0FWRV9EQVRBX1RZUEVfUEFTU1dPUkQpOwogICAgICAgICB0YXBTYXZlVWlMaW5rKHNhdmVVaSk7CiAKICAgICAgICAgLy8gTWFrZSBzdXJlIG5ldyBhY3Rpdml0eSBpcyBzaG93bi4uLgotICAgICAgICBXZWxjb21lQWN0aXZpdHkuYXNzZXJ0U2hvd2luZ0RlZmF1bHRNZXNzYWdlKHNVaUJvdCk7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnRTYXZlTm90U2hvd2luZyhTQVZFX0RBVEFfVFlQRV9QQVNTV09SRCk7CisgICAgICAgIFdlbGNvbWVBY3Rpdml0eS5hc3NlcnRTaG93aW5nRGVmYXVsdE1lc3NhZ2UobVVpQm90KTsKKyAgICAgICAgbVVpQm90LmFzc2VydFNhdmVOb3RTaG93aW5nKFNBVkVfREFUQV9UWVBFX1BBU1NXT1JEKTsKIAogICAgICAgICAvLyBUYXAgYmFjayB0byByZXN0b3JlIHRoZSBTYXZlIFVJLi4uCi0gICAgICAgIHNVaUJvdC5wcmVzc0JhY2soKTsKKyAgICAgICAgbVVpQm90LnByZXNzQmFjaygpOwogCiAgICAgICAgIC8vIC4uLmJ1dCBkb24ndCB0YXAgaXQuLi4KLSAgICAgICAgZmluYWwgVWlPYmplY3QyIHNhdmVVaTIgPSBzVWlCb3QuYXNzZXJ0U2F2ZVNob3dpbmcoU0FWRV9EQVRBX1RZUEVfUEFTU1dPUkQpOworICAgICAgICBmaW5hbCBVaU9iamVjdDIgc2F2ZVVpMiA9IG1VaUJvdC5hc3NlcnRTYXZlU2hvd2luZyhTQVZFX0RBVEFfVFlQRV9QQVNTV09SRCk7CiAKICAgICAgICAgLy8gLi4uaW5zdGVhZCwgZG8gc29tZXRoaW5nIHRvIGRpc21pc3MgaXQ6CiAgICAgICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICAgICAgICAgICBjYXNlIFRPVUNIX09VVFNJREU6Ci0gICAgICAgICAgICAgICAgc1VpQm90LmFzc2VydFNob3duQnlSZWxhdGl2ZUlkKElEX0xBQkVMKS5sb25nQ2xpY2soKTsKKyAgICAgICAgICAgICAgICBtVWlCb3QuYXNzZXJ0U2hvd25CeVJlbGF0aXZlSWQoSURfTEFCRUwpLmxvbmdDbGljaygpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBUQVBfTk9fT05fU0FWRV9VSToKLSAgICAgICAgICAgICAgICBzVWlCb3Quc2F2ZUZvckF1dG9maWxsKHNhdmVVaTIsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBtVWlCb3Quc2F2ZUZvckF1dG9maWxsKHNhdmVVaTIsIGZhbHNlKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgVEFQX1lFU19PTl9TQVZFX1VJOgotICAgICAgICAgICAgICAgIHNVaUJvdC5zYXZlRm9yQXV0b2ZpbGwodHJ1ZSwgU0FWRV9EQVRBX1RZUEVfUEFTU1dPUkQpOworICAgICAgICAgICAgICAgIG1VaUJvdC5zYXZlRm9yQXV0b2ZpbGwodHJ1ZSwgU0FWRV9EQVRBX1RZUEVfUEFTU1dPUkQpOwogCiAgICAgICAgICAgICAgICAgZmluYWwgU2F2ZVJlcXVlc3Qgc2F2ZVJlcXVlc3QgPSBzUmVwbGllci5nZXROZXh0U2F2ZVJlcXVlc3QoKTsKICAgICAgICAgICAgICAgICBhc3NlcnRUZXh0QW5kVmFsdWUoZmluZE5vZGVCeVJlc291cmNlSWQoc2F2ZVJlcXVlc3Quc3RydWN0dXJlLCBJRF9QUkVfSU5QVVQpLAogICAgICAgICAgICAgICAgICAgICAgICAgIjEwOCIpOwotICAgICAgICAgICAgICAgIEhlbHBlci5hc3NlcnROb0RhbmdsaW5nU2Vzc2lvbnMoKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBhY3Rpb246ICIgKyBhY3Rpb24pOwogICAgICAgICB9Ci0gICAgICAgIHNVaUJvdC5hc3NlcnRTYXZlTm90U2hvd2luZyhTQVZFX0RBVEFfVFlQRV9QQVNTV09SRCk7CisgICAgICAgIG1VaUJvdC5hc3NlcnRTYXZlTm90U2hvd2luZyhTQVZFX0RBVEFfVFlQRV9QQVNTV09SRCk7CiAKICAgICAgICAgLy8gTWFrZSBzdXJlIHByZXZpb3VzIHNlc3Npb24gd2FzIGZpbmlzaGVkLgotICAgICAgICBIZWxwZXIuYXNzZXJ0Tm9EYW5nbGluZ1Nlc3Npb25zKCk7CiAKICAgICAgICAgLy8gTm93IHRyaWdnZXJzIGEgbmV3IHNlc3Npb24gaW4gdGhlIG5ldyBhY3Rpdml0eSAoU2F2ZUFjdGl2aXR5KSBhbmQgZG8gYnVzaW5lc3MgYXMgdXN1YWwuLi4KICAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UobmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkKQEAgLTE5MiwxMCArMjA4LDEwIEBACiAgICAgICAgICAgICBuZXdBY3RpdnR5Lm1Db21taXQucGVyZm9ybUNsaWNrKCk7CiAgICAgICAgIH0pOwogICAgICAgICAvLyBNYWtlIHN1cmUgcG9zdC1zYXZlIGFjdGl2aXR5IGlzIHNob3duLi4uCi0gICAgICAgIHNVaUJvdC5hc3NlcnRTaG93bkJ5UmVsYXRpdmVJZChJRF9JTlBVVCk7CisgICAgICAgIG1VaUJvdC5hc3NlcnRTaG93bkJ5UmVsYXRpdmVJZChJRF9JTlBVVCk7CiAKICAgICAgICAgLy8gU2F2ZSBpdC4uLgotICAgICAgICBzVWlCb3Quc2F2ZUZvckF1dG9maWxsKHRydWUsIFNBVkVfREFUQV9UWVBFX0VNQUlMX0FERFJFU1MpOworICAgICAgICBtVWlCb3Quc2F2ZUZvckF1dG9maWxsKHRydWUsIFNBVkVfREFUQV9UWVBFX0VNQUlMX0FERFJFU1MpOwogCiAgICAgICAgIC8vIC4uLiBhbmQgYXNzZXJ0IHJlc3VsdHMKICAgICAgICAgZmluYWwgU2F2ZVJlcXVlc3Qgc2F2ZVJlcXVlc3QgPSBzUmVwbGllci5nZXROZXh0U2F2ZVJlcXVlc3QoKTsKQEAgLTIwNSw3ICsyMjEsNyBAQAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNhdmVVaUNhbmNlbGxlZEFmdGVyVGFwcGluZ0xpbmtUZXN0KFBvc3RTYXZlTGlua1RhcHBlZEFjdGlvbiB0eXBlKQogICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN0YXJ0QWN0aXZpdHkodHlwZSA9PSBQb3N0U2F2ZUxpbmtUYXBwZWRBY3Rpb24uVEFQX1JFQ0VOVFMpOworICAgICAgICBzdGFydEFjdGl2aXR5KGZhbHNlKTsKICAgICAgICAgLy8gU2V0IHNlcnZpY2UuCiAgICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKIApAQCAtMjI2LDM5ICsyNDIsMzQgQEAKICAgICAgICAgICAgIG1BY3Rpdml0eS5tU3VibWl0LnBlcmZvcm1DbGljaygpOwogICAgICAgICB9KTsKICAgICAgICAgLy8gTWFrZSBzdXJlIHBvc3Qtc2F2ZSBhY3Rpdml0eSBpcyBzaG93bi4uLgotICAgICAgICBzVWlCb3QuYXNzZXJ0U2hvd25CeVJlbGF0aXZlSWQoSURfSU5QVVQpOworICAgICAgICBtVWlCb3QuYXNzZXJ0U2hvd25CeVJlbGF0aXZlSWQoSURfSU5QVVQpOwogCiAgICAgICAgIC8vIFRhcCB0aGUgbGluay4KICAgICAgICAgZmluYWwgVWlPYmplY3QyIHNhdmVVaSA9IGFzc2VydFNhdmVVaVdpdGhMaW5rSXNTaG93bihTQVZFX0RBVEFfVFlQRV9QQVNTV09SRCk7CiAgICAgICAgIHRhcFNhdmVVaUxpbmsoc2F2ZVVpKTsKIAogICAgICAgICAvLyBNYWtlIHN1cmUgbGlua2VkIGFjdGl2aXR5IGlzIHNob3duLi4uCi0gICAgICAgIFdlbGNvbWVBY3Rpdml0eS5hc3NlcnRTaG93aW5nRGVmYXVsdE1lc3NhZ2Uoc1VpQm90KTsKLSAgICAgICAgc1VpQm90LmFzc2VydFNhdmVOb3RTaG93aW5nKFNBVkVfREFUQV9UWVBFX1BBU1NXT1JEKTsKKyAgICAgICAgV2VsY29tZUFjdGl2aXR5LmFzc2VydFNob3dpbmdEZWZhdWx0TWVzc2FnZShtVWlCb3QpOworICAgICAgICBtVWlCb3QuYXNzZXJ0U2F2ZU5vdFNob3dpbmcoU0FWRV9EQVRBX1RZUEVfUEFTU1dPUkQpOwogCiAgICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICAgICAgY2FzZSBUQVBfUkVDRU5UUzoKLSAgICAgICAgICAgICAgICBzVWlCb3Quc3dpdGNoQXBwc1VzaW5nUmVjZW50cygpOwotICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSByaWdodCBhY3Rpdml0eSBpcyBzaG93aW5nLgotICAgICAgICAgICAgICAgIHNVaUJvdC5hc3NlcnRTaG93bkJ5UmVsYXRpdmVJZChJRF9JTlBVVCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIExBVU5DSF9QUkVWSU9VU19BQ1RJVklUWToKLSAgICAgICAgICAgICAgICBzdGFydEFjdGl2aXR5KFByZVNpbXBsZVNhdmVBY3Rpdml0eS5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgc1VpQm90LmFzc2VydFNob3duQnlSZWxhdGl2ZUlkKElEX0lOUFVUKTsKKyAgICAgICAgICAgICAgICBzdGFydEFjdGl2aXR5T25OZXdUYXNrKFByZVNpbXBsZVNhdmVBY3Rpdml0eS5jbGFzcyk7CisgICAgICAgICAgICAgICAgbVVpQm90LmFzc2VydFNob3duQnlSZWxhdGl2ZUlkKElEX0lOUFVUKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgTEFVTkNIX05FV19BQ1RJVklUWToKICAgICAgICAgICAgICAgICAvLyBMYXVuY2ggYSAzcmQgYWN0aXZpdHkuLi4KLSAgICAgICAgICAgICAgICBzdGFydEFjdGl2aXR5KExvZ2luQWN0aXZpdHkuY2xhc3MpOwotICAgICAgICAgICAgICAgIHNVaUJvdC5hc3NlcnRTaG93bkJ5UmVsYXRpdmVJZChJRF9VU0VSTkFNRV9DT05UQUlORVIpOworICAgICAgICAgICAgICAgIHN0YXJ0QWN0aXZpdHlPbk5ld1Rhc2soTG9naW5BY3Rpdml0eS5jbGFzcyk7CisgICAgICAgICAgICAgICAgbVVpQm90LmFzc2VydFNob3duQnlSZWxhdGl2ZUlkKElEX1VTRVJOQU1FX0NPTlRBSU5FUik7CiAgICAgICAgICAgICAgICAgLy8gLi4udGhlbiBnbyBiYWNrCi0gICAgICAgICAgICAgICAgc1VpQm90LnByZXNzQmFjaygpOwotICAgICAgICAgICAgICAgIHNVaUJvdC5hc3NlcnRTaG93bkJ5UmVsYXRpdmVJZChJRF9JTlBVVCk7CisgICAgICAgICAgICAgICAgbVVpQm90LnByZXNzQmFjaygpOworICAgICAgICAgICAgICAgIG1VaUJvdC5hc3NlcnRTaG93bkJ5UmVsYXRpdmVJZChJRF9JTlBVVCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgdHlwZTogIiArIHR5cGUpOwogICAgICAgICB9CiAKLSAgICAgICAgc1VpQm90LmFzc2VydFNhdmVOb3RTaG93aW5nKFNBVkVfREFUQV9UWVBFX1BBU1NXT1JEKTsKKyAgICAgICAgbVVpQm90LmFzc2VydFNhdmVOb3RTaG93aW5nKFNBVkVfREFUQV9UWVBFX1BBU1NXT1JEKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTI5NCwxNCArMzA1LDE3IEBACiAgICAgICAgIHRhcFNhdmVVaUxpbmsoc2F2ZVVpKTsKIAogICAgICAgICAvLyBNYWtlIHN1cmUgbmV3IGFjdGl2aXR5IGlzIHNob3duLi4uCi0gICAgICAgIFdlbGNvbWVBY3Rpdml0eS5hc3NlcnRTaG93aW5nRGVmYXVsdE1lc3NhZ2Uoc1VpQm90KTsKKyAgICAgICAgV2VsY29tZUFjdGl2aXR5LmFzc2VydFNob3dpbmdEZWZhdWx0TWVzc2FnZShtVWlCb3QpOwogCiAgICAgICAgIC8vIFNhdmUgVUkgc2hvdWxkIGJlIHNob3dpbmcgYXMgd2VsbCwgc2luY2UgVHJhbXBvbGluZSBmaW5pc2hlZC4KLSAgICAgICAgc1VpQm90LmFzc2VydFNhdmVTaG93aW5nKFNBVkVfREFUQV9UWVBFX1BBU1NXT1JEKTsKKyAgICAgICAgbVVpQm90LmFzc2VydFNhdmVTaG93aW5nKFNBVkVfREFUQV9UWVBFX1BBU1NXT1JEKTsKIAogICAgICAgICAvLyBHbyBiYWNrIGFuZCBtYWtlIHN1cmUgaXQncyBzaG93aW5nIHRoZSByaWdodCBhY3Rpdml0eS4KLSAgICAgICAgc1VpQm90LnByZXNzQmFjaygpOwotICAgICAgICBzVWlCb3QuYXNzZXJ0U2hvd25CeVJlbGF0aXZlSWQoSURfSU5QVVQpOworICAgICAgICAvLyBmaXJzdCBCQUNLIGNhbmNlbHMgc2F2ZSBkaWFsb2cKKyAgICAgICAgbVVpQm90LnByZXNzQmFjaygpOworICAgICAgICAvLyBzZWNvbmQgQkFDSyBjYW5jZWwgV2VsY29tZUFjdGl2aXR5CisgICAgICAgIG1VaUJvdC5wcmVzc0JhY2soKTsKKyAgICAgICAgbVVpQm90LmFzc2VydFNob3duQnlSZWxhdGl2ZUlkKElEX0lOUFVUKTsKIAogICAgICAgICAvLyBOb3cgdHJpZ2dlcnMgYSBuZXcgc2Vzc2lvbiBpbiB0aGUgbmV3IGFjdGl2aXR5IChTYXZlQWN0aXZpdHkpIGFuZCBkbyBidXNpbmVzcyBhcyB1c3VhbC4uLgogICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKQpAQCAtMzIxLDEzICszMzUsNjcgQEAKICAgICAgICAgICAgIG5ld0FjdGl2dHkubUNvbW1pdC5wZXJmb3JtQ2xpY2soKTsKICAgICAgICAgfSk7CiAgICAgICAgIC8vIE1ha2Ugc3VyZSBwb3N0LXNhdmUgYWN0aXZpdHkgaXMgc2hvd24uLi4KLSAgICAgICAgc1VpQm90LmFzc2VydFNob3duQnlSZWxhdGl2ZUlkKElEX0lOUFVUKTsKKyAgICAgICAgbVVpQm90LmFzc2VydFNob3duQnlSZWxhdGl2ZUlkKElEX0lOUFVUKTsKIAogICAgICAgICAvLyBTYXZlIGl0Li4uCi0gICAgICAgIHNVaUJvdC5zYXZlRm9yQXV0b2ZpbGwodHJ1ZSwgU0FWRV9EQVRBX1RZUEVfRU1BSUxfQUREUkVTUyk7CisgICAgICAgIG1VaUJvdC5zYXZlRm9yQXV0b2ZpbGwodHJ1ZSwgU0FWRV9EQVRBX1RZUEVfRU1BSUxfQUREUkVTUyk7CiAKICAgICAgICAgLy8gLi4uIGFuZCBhc3NlcnQgcmVzdWx0cwogICAgICAgICBmaW5hbCBTYXZlUmVxdWVzdCBzYXZlUmVxdWVzdDEgPSBzUmVwbGllci5nZXROZXh0U2F2ZVJlcXVlc3QoKTsKICAgICAgICAgYXNzZXJ0VGV4dEFuZFZhbHVlKGZpbmROb2RlQnlSZXNvdXJjZUlkKHNhdmVSZXF1ZXN0MS5zdHJ1Y3R1cmUsIElEX0lOUFVUKSwgIjQyIik7CiAgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGFwTGlua0FmdGVyVXBkYXRlQXBwbGllZFRlc3QoYm9vbGVhbiB1cGRhdGVMaW5rVmlldykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN0YXJ0QWN0aXZpdHkoZmFsc2UpOworICAgICAgICAvLyBTZXQgc2VydmljZS4KKyAgICAgICAgZW5hYmxlU2VydmljZSgpOworCisgICAgICAgIGZpbmFsIEN1c3RvbURlc2NyaXB0aW9uLkJ1aWxkZXIgY3VzdG9tRGVzY3JpcHRpb24gPQorICAgICAgICAgICAgICAgIG5ld0N1c3RvbURlc2NyaXB0aW9uQnVpbGRlcihXZWxjb21lQWN0aXZpdHkuY2xhc3MpOworICAgICAgICBmaW5hbCBSZW1vdGVWaWV3cyB1cGRhdGUgPSBuZXdUZW1wbGF0ZSgpOworICAgICAgICBpZiAodXBkYXRlTGlua1ZpZXcpIHsKKyAgICAgICAgICAgIHVwZGF0ZS5zZXRDaGFyU2VxdWVuY2UoUi5pZC5saW5rLCAic2V0VGV4dCIsICJUQVAgTUUgSUYgWU9VIENBTiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdXBkYXRlLnNldENoYXJTZXF1ZW5jZShSLmlkLnN0YXRpY190ZXh0LCAic2V0VGV4dCIsICJNRSEiKTsKKyAgICAgICAgfQorICAgICAgICBWYWxpZGF0b3IgdmFsaWRDb25kaXRpb24gPSBuZXcgUmVnZXhWYWxpZGF0b3IobUFjdGl2aXR5Lm1QcmVJbnB1dC5nZXRBdXRvZmlsbElkKCksCisgICAgICAgICAgICAgICAgUGF0dGVybi5jb21waWxlKCIuKiIpKTsKKyAgICAgICAgY3VzdG9tRGVzY3JpcHRpb24uYmF0Y2hVcGRhdGUodmFsaWRDb25kaXRpb24sCisgICAgICAgICAgICAgICAgbmV3IEJhdGNoVXBkYXRlcy5CdWlsZGVyKCkudXBkYXRlVGVtcGxhdGUodXBkYXRlKS5idWlsZCgpKTsKKworICAgICAgICAvLyBTZXQgZXhwZWN0YXRpb25zLgorICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRDdXN0b21EZXNjcmlwdGlvbihjdXN0b21EZXNjcmlwdGlvbi5idWlsZCgpKQorICAgICAgICAgICAgICAgIC5zZXRSZXF1aXJlZFNhdmFibGVJZHMoU0FWRV9EQVRBX1RZUEVfUEFTU1dPUkQsIElEX1BSRV9JTlBVVCkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gVHJpZ2dlciBhdXRvZmlsbC4KKyAgICAgICAgbUFjdGl2aXR5LnN5bmNSdW5PblVpVGhyZWFkKCgpIC0+IG1BY3Rpdml0eS5tUHJlSW5wdXQucmVxdWVzdEZvY3VzKCkpOworICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKKyAgICAgICAgSGVscGVyLmFzc2VydEhhc1Nlc3Npb25zKG1QYWNrYWdlTmFtZSk7CisKKyAgICAgICAgLy8gVHJpZ2dlciBzYXZlLgorICAgICAgICBtQWN0aXZpdHkuc3luY1J1bk9uVWlUaHJlYWQoKCkgLT4geworICAgICAgICAgICAgbUFjdGl2aXR5Lm1QcmVJbnB1dC5zZXRUZXh0KCIxMDgiKTsKKyAgICAgICAgICAgIG1BY3Rpdml0eS5tU3VibWl0LnBlcmZvcm1DbGljaygpOworICAgICAgICB9KTsKKyAgICAgICAgLy8gTWFrZSBzdXJlIHBvc3Qtc2F2ZSBhY3Rpdml0eSBpcyBzaG93bi4uLgorICAgICAgICBtVWlCb3QuYXNzZXJ0U2hvd25CeVJlbGF0aXZlSWQoSURfSU5QVVQpOworCisgICAgICAgIC8vIFRhcCB0aGUgbGluay4KKyAgICAgICAgZmluYWwgVWlPYmplY3QyIHNhdmVVaTsKKyAgICAgICAgaWYgKHVwZGF0ZUxpbmtWaWV3KSB7CisgICAgICAgICAgICBzYXZlVWkgPSBhc3NlcnRTYXZlVWlXaXRoTGlua0lzU2hvd24oU0FWRV9EQVRBX1RZUEVfUEFTU1dPUkQsICJUQVAgTUUgSUYgWU9VIENBTiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2F2ZVVpID0gYXNzZXJ0U2F2ZVVpV2l0aExpbmtJc1Nob3duKFNBVkVfREFUQV9UWVBFX1BBU1NXT1JEKTsKKyAgICAgICAgICAgIGZpbmFsIFVpT2JqZWN0MiBjaGFuZ2VkID0gc2F2ZVVpLmZpbmRPYmplY3QoQnkucmVzKG1QYWNrYWdlTmFtZSwgSURfU1RBVElDX1RFWFQpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoY2hhbmdlZC5nZXRUZXh0KCkpLmlzRXF1YWxUbygiTUUhIik7CisgICAgICAgIH0KKyAgICAgICAgdGFwU2F2ZVVpTGluayhzYXZlVWkpOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSBuZXcgYWN0aXZpdHkgaXMgc2hvd24uLi4KKyAgICAgICAgV2VsY29tZUFjdGl2aXR5LmFzc2VydFNob3dpbmdEZWZhdWx0TWVzc2FnZShtVWlCb3QpOworICAgICAgICBtVWlCb3QuYXNzZXJ0U2F2ZU5vdFNob3dpbmcoU0FWRV9EQVRBX1RZUEVfUEFTU1dPUkQpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL1JlZ2V4VmFsaWRhdG9yVGVzdC5qYXZhIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvUmVnZXhWYWxpZGF0b3JUZXN0LmphdmEKaW5kZXggZjdhYzI2OC4uN2NjZGRiZCAxMDA2NDQKLS0tIGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvUmVnZXhWYWxpZGF0b3JUZXN0LmphdmEKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvUmVnZXhWYWxpZGF0b3JUZXN0LmphdmEKQEAgLTIyLDE3ICsyMiwyMCBAQAogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLndoZW47CiBpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydFRocm93czsKIAoraW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIGltcG9ydCBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuUmVnZXhWYWxpZGF0b3I7CiBpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLmF1dG9maWxsLlZhbHVlRmluZGVyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudmlldy5hdXRvZmlsbC5BdXRvZmlsbElkOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIAogaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwogCiBAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQorQEFwcE1vZGVGdWxsIC8vIFVuaXQgdGVzdAogcHVibGljIGNsYXNzIFJlZ2V4VmFsaWRhdG9yVGVzdCB7CiAKICAgICBAVGVzdApkaWZmIC0tZ2l0IGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvUmVxdWlyZWRGZWF0dXJlUnVsZS5qYXZhIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvUmVxdWlyZWRGZWF0dXJlUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2IyNTA0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL1JlcXVpcmVkRmVhdHVyZVJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0czsKLQotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVzdFJ1bGU7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuanVuaXQucnVubmVycy5tb2RlbC5TdGF0ZW1lbnQ7Ci0KLS8qKgotICogQ3VzdG9tIEpVbml0NCBydWxlIHRoYXQgZG9lcyBub3QgcnVuIGEgdGVzdCBjYXNlIGlmIHRoZSBkZXZpY2UgZG9lcyBub3QgaGF2ZSBhIGdpdmVuIGZlYXR1cmUuCi0gKi8KLS8vIFRPRE86IG1vdmUgdG8gY29tbW9uIENUUyBjb2RlYmFzZQotcHVibGljIGNsYXNzIFJlcXVpcmVkRmVhdHVyZVJ1bGUgaW1wbGVtZW50cyBUZXN0UnVsZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJSZXF1aXJlZEZlYXR1cmVSdWxlIjsKLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1GZWF0dXJlOwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtSGFzRmVhdHVyZTsKLQotICAgIHB1YmxpYyBSZXF1aXJlZEZlYXR1cmVSdWxlKFN0cmluZyBmZWF0dXJlKSB7Ci0gICAgICAgIG1GZWF0dXJlID0gZmVhdHVyZTsKLSAgICAgICAgbUhhc0ZlYXR1cmUgPSBoYXNGZWF0dXJlKGZlYXR1cmUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdGF0ZW1lbnQgYXBwbHkoU3RhdGVtZW50IGJhc2UsIERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RhdGVtZW50KCkgewotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGV2YWx1YXRlKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFtSGFzRmVhdHVyZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJza2lwcGluZyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBkZXNjcmlwdGlvbi5nZXRDbGFzc05hbWUoKSArICIjIiArIGRlc2NyaXB0aW9uLmdldE1ldGhvZE5hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBiZWNhdXNlIGRldmljZSBkb2VzIG5vdCBoYXZlIGZlYXR1cmUgJyIgKyBtRmVhdHVyZSArICInIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYmFzZS5ldmFsdWF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNGZWF0dXJlKFN0cmluZyBmZWF0dXJlKSB7Ci0gICAgICAgIHJldHVybiBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCkuZ2V0UGFja2FnZU1hbmFnZXIoKS5oYXNTeXN0ZW1GZWF0dXJlKGZlYXR1cmUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL1JldHJ5UnVsZS5qYXZhIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvUmV0cnlSdWxlLmphdmEKaW5kZXggYmU3NDBiMS4uMWRiYWZlYiAxMDA2NDQKLS0tIGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvUmV0cnlSdWxlLmphdmEKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvUmV0cnlSdWxlLmphdmEKQEAgLTE2LDcgKzE2LDYgQEAKIAogcGFja2FnZSBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHM7CiAKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC51aWF1dG9tYXRvci5TdGFsZU9iamVjdEV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCiBpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLlRlc3RSdWxlOwpAQCAtNDUsMTcgKzQ0LDMyIEBACiAKICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIHZvaWQgZXZhbHVhdGUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IGRlc2NyaXB0aW9uLmdldERpc3BsYXlOYW1lKCk7CiAgICAgICAgICAgICAgICAgVGhyb3dhYmxlIGNhdWdodCA9IG51bGw7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbU1heEF0dGVtcHRzOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UuZXZhbHVhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJHb29kIE5ld3MsIEV2ZXJ5b25lISAiICsgbmFtZSArICIgcGFzc2VkIHJpZ2h0IGF3YXkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJldHRlciBsYXRlIHRoYW4gbmV2ZXI6ICIgKyBuYW1lICsgInBhc3NlZCBhdCBhdHRlbXB0ICMiICsgaSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJldHJ5YWJsZUV4Y2VwdGlvbiB8IFN0YWxlT2JqZWN0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmV0cnlhYmxlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFRpbWVvdXQgdGltZW91dCA9IGUuZ2V0VGltZW91dCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWVvdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgYmVmb3JlID0gdGltZW91dC5tcygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQuaW5jcmVhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJJbmNyZWFzZWQgIiArIHRpbWVvdXQuZ2V0TmFtZSgpICsgIiBmcm9tICIgKyBiZWZvcmUgKyAibXMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgdG8gIiArIHRpbWVvdXQubXMoKSArICJtcyIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgY2F1Z2h0ID0gZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24uZ2V0RGlzcGxheU5hbWUoKSArICI6IGF0dGVtcHQgIiArIGkgKyAiIGZhaWxlZDogIiArIGUpOwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkFycnJyISAiICsgbmFtZSArICIgZmFpbGVkIGF0IGF0dGVtcHQgIiArIGkgKyAiLyIgKyBtTWF4QXR0ZW1wdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI6ICIgKyBjYXVnaHQpOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJEJ09IISAiICsgbmFtZSArICI6IGdpdmluZyB1cCBhZnRlciAiICsgbU1heEF0dGVtcHRzICsgIiBhdHRlbXB0cyIpOwogICAgICAgICAgICAgICAgIHRocm93IGNhdWdodDsKICAgICAgICAgICAgIH0KICAgICAgICAgfTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL1JldHJ5UnVsZVRlc3QuamF2YSBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL1JldHJ5UnVsZVRlc3QuamF2YQppbmRleCAzYjczM2Y2Li5lZjMxNjlmOCAxMDA2NDQKLS0tIGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvUmV0cnlSdWxlVGVzdC5qYXZhCisrKyBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL1JldHJ5UnVsZVRlc3QuamF2YQpAQCAtMTgsOCArMTgsOSBAQAogCiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLnRydXRoLlRydXRoLmFzc2VydFRoYXQ7CiAKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC51aWF1dG9tYXRvci5TdGFsZU9iamVjdEV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5EZXNjcmlwdGlvbjsKQEAgLTI3LDYgKzI4LDcgQEAKIGltcG9ydCBvcmcuanVuaXQucnVubmVycy5tb2RlbC5TdGF0ZW1lbnQ7CiAKIEBSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCitAQXBwTW9kZUZ1bGwgLy8gVW5pdCB0ZXN0CiBwdWJsaWMgY2xhc3MgUmV0cnlSdWxlVGVzdCB7CiAKICAgICBwcml2YXRlIGZpbmFsIERlc2NyaXB0aW9uIG1EZXNjcmlwdGlvbiA9IERlc2NyaXB0aW9uLmNyZWF0ZVN1aXRlRGVzY3JpcHRpb24oIldoYXRldmVyIik7CkBAIC0zNCw4ICszNiw2IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmV0cnlhYmxlRXhjZXB0aW9uIHNSZXRyeWFibGVFeGNlcHRpb24gPQogICAgICAgICAgICAgbmV3IFJldHJ5YWJsZUV4Y2VwdGlvbigiWSBVIE5PIFJFVFJZPyIpOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RhbGVPYmplY3RFeGNlcHRpb24gc1N0YWxlT2JqZWN0RXhjZXB0aW9uID0gbmV3IFN0YWxlT2JqZWN0RXhjZXB0aW9uKCk7Ci0KICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBSZXRyeWFibGVTdGF0ZW1lbnQ8VCBleHRlbmRzIEV4Y2VwdGlvbj4gZXh0ZW5kcyBTdGF0ZW1lbnQgewogICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtTnVtYmVyRmFpbHVyZXM7CiAgICAgICAgIHByaXZhdGUgaW50IG1OdW1iZXJDYWxsczsKQEAgLTY4LDYgKzY4LDE3IEBACiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFzc09uUmV0cnlhYmxlRXhjZXB0aW9uV2l0aFRpbWVvdXQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgZmluYWwgVGltZW91dCB0aW1lb3V0ID0gbmV3IFRpbWVvdXQoIllPVVIgVElNRSBJUyBHT05FIiwgMSwgMiwgMTApOworICAgICAgICBmaW5hbCBSZXRyeWFibGVFeGNlcHRpb24gZXhjZXB0aW9uID0gbmV3IFJldHJ5YWJsZUV4Y2VwdGlvbih0aW1lb3V0LCAiWSBVIE5PPyIpOworICAgICAgICBmaW5hbCBSZXRyeVJ1bGUgcnVsZSA9IG5ldyBSZXRyeVJ1bGUoMik7CisgICAgICAgIHJ1bGUuYXBwbHkobmV3IFJldHJ5YWJsZVN0YXRlbWVudDxSZXRyeWFibGVFeGNlcHRpb24+KDEsIGV4Y2VwdGlvbiksIG1EZXNjcmlwdGlvbikKKyAgICAgICAgICAgICAgICAuZXZhbHVhdGUoKTsKKyAgICAgICAgLy8gQXNzZXJ0IHRpbWVvdXQgd2FzIGluY3JlYXNlZAorICAgICAgICBhc3NlcnRUaGF0KHRpbWVvdXQubXMoKSkuaXNFcXVhbFRvKDIpOworICAgIH0KKworICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEZhaWxPblJldHJ5YWJsZUV4Y2VwdGlvbigpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBmaW5hbCBSZXRyeVJ1bGUgcnVsZSA9IG5ldyBSZXRyeVJ1bGUoMik7CiAgICAgICAgIHRyeSB7CkBAIC03OCwyNCArODksNCBAQAogICAgICAgICAgICAgYXNzZXJ0VGhhdChlKS5pc1NhbWVBcyhzUmV0cnlhYmxlRXhjZXB0aW9uKTsKICAgICAgICAgfQogICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFBhc3NPblN0YWxlT2JqZWN0RXhjZXB0aW9uKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIGZpbmFsIFJldHJ5UnVsZSBydWxlID0gbmV3IFJldHJ5UnVsZSgyKTsKLSAgICAgICAgcnVsZS5hcHBseShuZXcgUmV0cnlhYmxlU3RhdGVtZW50PFN0YWxlT2JqZWN0RXhjZXB0aW9uPigxLCBzU3RhbGVPYmplY3RFeGNlcHRpb24pLAotICAgICAgICAgICAgICAgIG1EZXNjcmlwdGlvbikKLSAgICAgICAgICAgICAgICAuZXZhbHVhdGUoKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RGYWlsT25TdGFsZU9iamVjdEV4Y2VwdGlvbigpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBmaW5hbCBSZXRyeVJ1bGUgcnVsZSA9IG5ldyBSZXRyeVJ1bGUoMik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBydWxlLmFwcGx5KG5ldyBSZXRyeWFibGVTdGF0ZW1lbnQ8U3RhbGVPYmplY3RFeGNlcHRpb24+KDIsIHNTdGFsZU9iamVjdEV4Y2VwdGlvbiksCi0gICAgICAgICAgICAgICAgICAgIG1EZXNjcmlwdGlvbikuZXZhbHVhdGUoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiMk5EIENBTEwsIFkgVSBOTyBGQUlMPyIpOwotICAgICAgICB9IGNhdGNoIChTdGFsZU9iamVjdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUaGF0KGUpLmlzU2FtZUFzKHNTdGFsZU9iamVjdEV4Y2VwdGlvbik7Ci0gICAgICAgIH0KLSAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9SZXRyeWFibGVFeGNlcHRpb24uamF2YSBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL1JldHJ5YWJsZUV4Y2VwdGlvbi5qYXZhCmluZGV4IDdjYTdkNjIuLjQ4MTQwOWMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL1JldHJ5YWJsZUV4Y2VwdGlvbi5qYXZhCisrKyBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL1JldHJ5YWJsZUV4Y2VwdGlvbi5qYXZhCkBAIC0xNiwyMCArMTYsNTIgQEAKIAogcGFja2FnZSBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHM7CiAKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk51bGxhYmxlOworCiAvKioKICAqIEV4Y2VwdGlvbiB0aGF0IGNhdXNlIHRoZSB7QGxpbmsgUmV0cnlSdWxlfSB0byByZS10cnkgYSB0ZXN0LgogICovCiBwdWJsaWMgY2xhc3MgUmV0cnlhYmxlRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CiAKKyAgICBATnVsbGFibGUKKyAgICBwcml2YXRlIGZpbmFsIFRpbWVvdXQgbVRpbWVvdXQ7CisKICAgICBwdWJsaWMgUmV0cnlhYmxlRXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKLSAgICAgICAgc3VwZXIobXNnKTsKKyAgICAgICAgdGhpcygoVGltZW91dCkgbnVsbCwgbXNnKTsKICAgICB9CiAKICAgICBwdWJsaWMgUmV0cnlhYmxlRXhjZXB0aW9uKFN0cmluZyBmb3JtYXQsIE9iamVjdC4uLmFyZ3MpIHsKLSAgICAgICAgc3VwZXIoU3RyaW5nLmZvcm1hdChmb3JtYXQsIGFyZ3MpKTsKKyAgICAgICAgdGhpcygoVGltZW91dCkgbnVsbCwgU3RyaW5nLmZvcm1hdChmb3JtYXQsIGFyZ3MpKTsKICAgICB9CiAKICAgICBwdWJsaWMgUmV0cnlhYmxlRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSwgU3RyaW5nIGZvcm1hdCwgT2JqZWN0Li4uYXJncykgeworICAgICAgICB0aGlzKChUaW1lb3V0KSBudWxsLCBjYXVzZSwgU3RyaW5nLmZvcm1hdChmb3JtYXQsIGFyZ3MpLCBjYXVzZSk7CisgICAgfQorCisgICAgcHVibGljIFJldHJ5YWJsZUV4Y2VwdGlvbihATnVsbGFibGUgVGltZW91dCB0aW1lb3V0LCBTdHJpbmcgbXNnKSB7CisgICAgICAgIHN1cGVyKG1zZyk7CisgICAgICAgIHRoaXMubVRpbWVvdXQgPSB0aW1lb3V0OworICAgIH0KKworICAgIHB1YmxpYyBSZXRyeWFibGVFeGNlcHRpb24oQE51bGxhYmxlIFRpbWVvdXQgdGltZW91dCwgU3RyaW5nIGZvcm1hdCwgT2JqZWN0Li4uYXJncykgeworICAgICAgICBzdXBlcihTdHJpbmcuZm9ybWF0KGZvcm1hdCwgYXJncykpOworICAgICAgICB0aGlzLm1UaW1lb3V0ID0gdGltZW91dDsKKyAgICB9CisKKyAgICBwdWJsaWMgUmV0cnlhYmxlRXhjZXB0aW9uKEBOdWxsYWJsZSBUaW1lb3V0IHRpbWVvdXQsIFRocm93YWJsZSBjYXVzZSwgU3RyaW5nIGZvcm1hdCwKKyAgICAgICAgICAgIE9iamVjdC4uLmFyZ3MpIHsKICAgICAgICAgc3VwZXIoU3RyaW5nLmZvcm1hdChmb3JtYXQsIGFyZ3MpLCBjYXVzZSk7CisgICAgICAgIHRoaXMubVRpbWVvdXQgPSB0aW1lb3V0OworICAgIH0KKworICAgIEBOdWxsYWJsZQorICAgIHB1YmxpYyBUaW1lb3V0IGdldFRpbWVvdXQoKSB7CisgICAgICAgIHJldHVybiBtVGltZW91dDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBzdXBlck1lc3NhZ2UgPSBzdXBlci5nZXRNZXNzYWdlKCk7CisgICAgICAgIHJldHVybiBtVGltZW91dCA9PSBudWxsID8gc3VwZXJNZXNzYWdlIDogc3VwZXJNZXNzYWdlICsgIiAodGltZW91dD0iICsgbVRpbWVvdXQgKyAiKSI7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvU2FmZUNsZWFuZXJSdWxlLmphdmEgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9TYWZlQ2xlYW5lclJ1bGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjM2MTM4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvU2FmZUNsZWFuZXJSdWxlLmphdmEKQEAgLTAsMCArMSwxNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0czsKKworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTm9uTnVsbDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLlRlc3RSdWxlOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuRGVzY3JpcHRpb247CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMubW9kZWwuU3RhdGVtZW50OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7CisKKy8qKgorICogUnVsZSB1c2VkIHRvIHNhZmVseSBydW4gY2xlYW4gdXAgY29kZSBhZnRlciBhIHRlc3QgaXMgZmluaXNoZWQsIHNvIHRoYXQgZXhjZXB0aW9ucyB0aHJvd24gYnkKKyAqIHRoZSBjbGVhbnVwIGNvZGUgZG9uJ3QgaGlkZSBleGNlcHRpb24gdGhyb3duIGJ5IHRoZSB0ZXN0IGJvZHkKKyAqLworLy8gVE9ETzogbW92ZSB0byBjb21tb24gQ1RTIGNvZGUKK3B1YmxpYyBmaW5hbCBjbGFzcyBTYWZlQ2xlYW5lclJ1bGUgaW1wbGVtZW50cyBUZXN0UnVsZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlNhZmVDbGVhbmVyUnVsZSI7CisKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8UnVubmFibGU+IG1DbGVhbmVycyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxDYWxsYWJsZTxMaXN0PFRocm93YWJsZT4+PiBtRXh0cmFUaHJvd2FibGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFRocm93YWJsZT4gbVRocm93YWJsZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICBwcml2YXRlIER1bXBlciBtRHVtcGVyOworCisgICAgLyoqCisgICAgICogUnVucyB7QGNvZGUgY2xlYW5lcn0gYWZ0ZXIgdGhlIHRlc3QgaXMgZmluaXNoZWQsIGNhdGNoaW5nIGFueSB7QGxpbmsgVGhyb3dhYmxlfSB0aHJvd24gYnkgaXQuCisgICAgICovCisgICAgcHVibGljIFNhZmVDbGVhbmVyUnVsZSBydW4oQE5vbk51bGwgUnVubmFibGUgY2xlYW5lcikgeworICAgICAgICBtQ2xlYW5lcnMuYWRkKGNsZWFuZXIpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGV4Y2VwdGlvbnMgZGlyZWN0bHkuCisgICAgICoKKyAgICAgKiA8cD5UeXBpY2FsbHkgdXNlZCB3aGVuIGV4Y2VwdGlvbnMgd2VyZSBjYXVnaHQgYXN5Y2hyb25vdXNseSBkdXJpbmcgdGhlIHRlc3QgZXhlY3V0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTYWZlQ2xlYW5lclJ1bGUgYWRkKEBOb25OdWxsIENhbGxhYmxlPExpc3Q8VGhyb3dhYmxlPj4gZXhjZXB0aW9ucykgeworICAgICAgICBtRXh0cmFUaHJvd2FibGVzLmFkZChleGNlcHRpb25zKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhIHtAbGluayBEdW1wZXJ9IHVzZWQgdG8gbG9nIGVycm9ycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2FmZUNsZWFuZXJSdWxlIHNldER1bXBlcihATm9uTnVsbCBEdW1wZXIgZHVtcGVyKSB7CisgICAgICAgIG1EdW1wZXIgPSBkdW1wZXI7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdGF0ZW1lbnQgYXBwbHkoU3RhdGVtZW50IGJhc2UsIERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7CisgICAgICAgIHJldHVybiBuZXcgU3RhdGVtZW50KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBldmFsdWF0ZSgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICAgICAgICAgIC8vIEZpcnN0IHJ1biB0aGUgdGVzdAorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGJhc2UuZXZhbHVhdGUoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJBZGRpbmcgZXhjZXB0aW9uIGZyb20gbWFpbiB0ZXN0Iik7CisgICAgICAgICAgICAgICAgICAgIG1UaHJvd2FibGVzLmFkZCh0KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBUaGVuIHRoZSBjbGVhbnVwIHJ1bm5lcnMKKyAgICAgICAgICAgICAgICBmb3IgKFJ1bm5hYmxlIHJ1bm5lciA6IG1DbGVhbmVycykgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgcnVubmVyLnJ1bigpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQWRkaW5nIGV4Y2VwdGlvbiBmcm9tIGNsZWFuZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UaHJvd2FibGVzLmFkZCh0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEFuZCBmaW5hbGx5IGFkZCB0aGUgZXh0cmEgZXhjZXB0aW9ucworICAgICAgICAgICAgICAgIGZvciAoQ2FsbGFibGU8TGlzdDxUaHJvd2FibGU+PiBleHRyYVRocm93YWJsZXNDYWxsYWJsZSA6IG1FeHRyYVRocm93YWJsZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxUaHJvd2FibGU+IGV4dHJhVGhyb3dhYmxlcyA9IGV4dHJhVGhyb3dhYmxlc0NhbGxhYmxlLmNhbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhVGhyb3dhYmxlcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJBZGRpbmcgIiArIGV4dHJhVGhyb3dhYmxlcy5zaXplKCkgKyAiIGV4dHJhIGV4Y2VwdGlvbnMiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UaHJvd2FibGVzLmFkZEFsbChleHRyYVRocm93YWJsZXMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gRmluYWxseSwgdGhyb3cgdXAhCisgICAgICAgICAgICAgICAgaWYgKG1UaHJvd2FibGVzLmlzRW1wdHkoKSkgcmV0dXJuOworCisgICAgICAgICAgICAgICAgZmluYWwgaW50IG51bWJlckV4Y2VwdGlvbnMgPSBtVGhyb3dhYmxlcy5zaXplKCk7CisgICAgICAgICAgICAgICAgaWYgKG51bWJlckV4Y2VwdGlvbnMgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBmYWlsKGRlc2NyaXB0aW9uLCBtVGhyb3dhYmxlcy5nZXQoMCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmYWlsKGRlc2NyaXB0aW9uLCBuZXcgTXVsdGlwbGVFeGNlcHRpb25zKG1UaHJvd2FibGVzKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZmFpbChEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiwgVGhyb3dhYmxlIHQpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBpZiAobUR1bXBlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtRHVtcGVyLmR1bXAoZGVzY3JpcHRpb24uZ2V0RGlzcGxheU5hbWUoKSwgdCk7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgdDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdG9NZXNzc2FnZShMaXN0PFRocm93YWJsZT4gdGhyb3dhYmxlcykgeworICAgICAgICBTdHJpbmcgbXNnID0gIkQnT0ghIjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRyeSAoU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOyBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihzdykpIHsKKyAgICAgICAgICAgICAgICBzdy53cml0ZSgiQ2F1Z2h0ICIgKyB0aHJvd2FibGVzLnNpemUoKSArICIgZXhjZXB0aW9uc1xuIik7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aHJvd2FibGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHN3LndyaXRlKCJcbi0tLS0gQmVnaW4gb2YgZXhjZXB0aW9uICMiICsgKGkgKyAxKSArICIgLS0tLVxuIik7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFRocm93YWJsZSBleGNlcHRpb24gPSB0aHJvd2FibGVzLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZShwdyk7CisgICAgICAgICAgICAgICAgICAgIHN3LndyaXRlKCItLS0tIEVuZCBvZiBleGNlcHRpb24gIyIgKyAoaSArIDEpICsgIiAtLS0tXG5cbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtc2cgPSBzdy50b1N0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBpZ25vcmUgY2xvc2UoKSBlcnJvcnMgLSBzaG91bGQgbm90IGhhcHBlbi4uLgorICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXhjZXB0aW9uIGNsb3NpbmcgU3RyaW5nV3JpdGVyOiAiICsgZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1zZzsKKyAgICB9CisKKyAgICAvLyBWaXNpYmxlRm9yVGVzdGluZworICAgIHN0YXRpYyBjbGFzcyBNdWx0aXBsZUV4Y2VwdGlvbnMgZXh0ZW5kcyBBc3NlcnRpb25FcnJvciB7CisgICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxUaHJvd2FibGU+IG1UaHJvd2FibGVzOworCisgICAgICAgIHByaXZhdGUgTXVsdGlwbGVFeGNlcHRpb25zKExpc3Q8VGhyb3dhYmxlPiB0aHJvd2FibGVzKSB7CisgICAgICAgICAgICBzdXBlcih0b01lc3NzYWdlKHRocm93YWJsZXMpKTsKKworICAgICAgICAgICAgdGhpcy5tVGhyb3dhYmxlcyA9IHRocm93YWJsZXM7CisgICAgICAgIH0KKworICAgICAgICBMaXN0PFRocm93YWJsZT4gZ2V0VGhyb3dhYmxlcygpIHsKKyAgICAgICAgICAgIHJldHVybiBtVGhyb3dhYmxlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE9wdGlvbmFsIGludGVyZmFjZSB1c2VkIHRvIGR1bXAgYW4gZXJyb3IuCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBEdW1wZXIgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBEdW1wcyBhbiBlcnJvci4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgZHVtcChATm9uTnVsbCBTdHJpbmcgdGVzdE5hbWUsIEBOb25OdWxsIFRocm93YWJsZSB0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9TYWZlQ2xlYW5lclJ1bGVUZXN0LmphdmEgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9TYWZlQ2xlYW5lclJ1bGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQxYjAwMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL1NhZmVDbGVhbmVyUnVsZVRlc3QuamF2YQpAQCAtMCwwICsxLDI1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLnRydXRoLlRydXRoLmFzc2VydFRoYXQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by52ZXJpZnk7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0LmV4cGVjdFRocm93czsKKworaW1wb3J0IGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5TYWZlQ2xlYW5lclJ1bGUuRHVtcGVyOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuRGVzY3JpcHRpb247CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLm1vZGVsLlN0YXRlbWVudDsKK2ltcG9ydCBvcmcubW9ja2l0by5Nb2NrOworaW1wb3J0IG9yZy5tb2NraXRvLmp1bml0Lk1vY2tpdG9KVW5pdFJ1bm5lcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOworCitAUnVuV2l0aChNb2NraXRvSlVuaXRSdW5uZXIuY2xhc3MpCitAQXBwTW9kZUZ1bGwgLy8gVW5pdCB0ZXN0CitwdWJsaWMgY2xhc3MgU2FmZUNsZWFuZXJSdWxlVGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBGYWlsdXJlU3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBUaHJvd2FibGUgbVRocm93YWJsZTsKKworICAgICAgICBGYWlsdXJlU3RhdGVtZW50KFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBtVGhyb3dhYmxlID0gdDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBldmFsdWF0ZSgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICAgICAgdGhyb3cgbVRocm93YWJsZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgRGVzY3JpcHRpb24gbURlc2NyaXB0aW9uID0gRGVzY3JpcHRpb24uY3JlYXRlU3VpdGVEZXNjcmlwdGlvbigiV2hhdGV2ZXIiKTsKKyAgICBwcml2YXRlIGZpbmFsIFJ1bnRpbWVFeGNlcHRpb24gbVJ1bnRpbWVFeGNlcHRpb24gPSBuZXcgUnVudGltZUV4Y2VwdGlvbigiRCdPSCEiKTsKKworICAgIEBNb2NrIHByaXZhdGUgRHVtcGVyIG1EdW1wZXI7CisKKyAgICAvLyBVc2UgbW9ja3MgZm9yIG9iamVjdHMgdGhhdCBkb24ndCB0aHJvdyBhbnkgZXhjZXB0aW9uLgorICAgIEBNb2NrIHByaXZhdGUgUnVubmFibGUgbUdvb2RHdXlSdW5uZXIxOworICAgIEBNb2NrIHByaXZhdGUgUnVubmFibGUgbUdvb2RHdXlSdW5uZXIyOworICAgIEBNb2NrIHByaXZhdGUgQ2FsbGFibGU8TGlzdDxUaHJvd2FibGU+PiBtR29vZEd1eUV4dHJhRXhjZXB0aW9uczE7CisgICAgQE1vY2sgcHJpdmF0ZSBDYWxsYWJsZTxMaXN0PFRocm93YWJsZT4+IG1Hb29kR3V5RXh0cmFFeGNlcHRpb25zMjsKKyAgICBATW9jayBwcml2YXRlIFN0YXRlbWVudCBtR29vZEd1eVN0YXRlbWVudDsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5UnVsZV90ZXN0UGFzcygpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBmaW5hbCBTYWZlQ2xlYW5lclJ1bGUgcnVsZSA9IG5ldyBTYWZlQ2xlYW5lclJ1bGUoKTsKKyAgICAgICAgcnVsZS5hcHBseShtR29vZEd1eVN0YXRlbWVudCwgbURlc2NyaXB0aW9uKS5ldmFsdWF0ZSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5UnVsZV90ZXN0RmFpbHMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgZmluYWwgU2FmZUNsZWFuZXJSdWxlIHJ1bGUgPSBuZXcgU2FmZUNsZWFuZXJSdWxlKCk7CisgICAgICAgIGZpbmFsIFRocm93YWJsZSBhY3R1YWxFeGNlcHRpb24gPSBleHBlY3RUaHJvd3MoUnVudGltZUV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAoKSAtPiBydWxlLmFwcGx5KG5ldyBGYWlsdXJlU3RhdGVtZW50KG1SdW50aW1lRXhjZXB0aW9uKSwgbURlc2NyaXB0aW9uKS5ldmFsdWF0ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChhY3R1YWxFeGNlcHRpb24pLmlzU2FtZUFzKG1SdW50aW1lRXhjZXB0aW9uKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eVJ1bGVfdGVzdEZhaWxzX3dpdGhEdW1wZXIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgZmluYWwgU2FmZUNsZWFuZXJSdWxlIHJ1bGUgPSBuZXcgU2FmZUNsZWFuZXJSdWxlKCkuc2V0RHVtcGVyKG1EdW1wZXIpOworICAgICAgICBmaW5hbCBUaHJvd2FibGUgYWN0dWFsRXhjZXB0aW9uID0gZXhwZWN0VGhyb3dzKFJ1bnRpbWVFeGNlcHRpb24uY2xhc3MsCisgICAgICAgICAgICAgICAgKCkgLT4gcnVsZS5hcHBseShuZXcgRmFpbHVyZVN0YXRlbWVudChtUnVudGltZUV4Y2VwdGlvbiksIG1EZXNjcmlwdGlvbikuZXZhbHVhdGUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoYWN0dWFsRXhjZXB0aW9uKS5pc1NhbWVBcyhtUnVudGltZUV4Y2VwdGlvbik7CisgICAgICAgIHZlcmlmeShtRHVtcGVyKS5kdW1wKCJXaGF0ZXZlciIsIGFjdHVhbEV4Y2VwdGlvbik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25seVRlc3RGYWlscygpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBmaW5hbCBTYWZlQ2xlYW5lclJ1bGUgcnVsZSA9IG5ldyBTYWZlQ2xlYW5lclJ1bGUoKQorICAgICAgICAgICAgICAgIC5ydW4obUdvb2RHdXlSdW5uZXIxKQorICAgICAgICAgICAgICAgIC5hZGQobUdvb2RHdXlFeHRyYUV4Y2VwdGlvbnMxKTsKKyAgICAgICAgZmluYWwgVGhyb3dhYmxlIGFjdHVhbEV4Y2VwdGlvbiA9IGV4cGVjdFRocm93cyhSdW50aW1lRXhjZXB0aW9uLmNsYXNzLAorICAgICAgICAgICAgICAgICgpIC0+IHJ1bGUuYXBwbHkobmV3IEZhaWx1cmVTdGF0ZW1lbnQobVJ1bnRpbWVFeGNlcHRpb24pLCBtRGVzY3JpcHRpb24pLmV2YWx1YXRlKCkpOworICAgICAgICBhc3NlcnRUaGF0KGFjdHVhbEV4Y2VwdGlvbikuaXNTYW1lQXMobVJ1bnRpbWVFeGNlcHRpb24pOworICAgICAgICB2ZXJpZnkobUdvb2RHdXlSdW5uZXIxKS5ydW4oKTsKKyAgICAgICAgdmVyaWZ5KG1Hb29kR3V5RXh0cmFFeGNlcHRpb25zMSkuY2FsbCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9ubHlUZXN0RmFpbHNfd2l0aER1bXBlcigpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBmaW5hbCBTYWZlQ2xlYW5lclJ1bGUgcnVsZSA9IG5ldyBTYWZlQ2xlYW5lclJ1bGUoKQorICAgICAgICAgICAgICAgIC5zZXREdW1wZXIobUR1bXBlcikKKyAgICAgICAgICAgICAgICAucnVuKG1Hb29kR3V5UnVubmVyMSkKKyAgICAgICAgICAgICAgICAuYWRkKG1Hb29kR3V5RXh0cmFFeGNlcHRpb25zMSk7CisgICAgICAgIGZpbmFsIFRocm93YWJsZSBhY3R1YWxFeGNlcHRpb24gPSBleHBlY3RUaHJvd3MoUnVudGltZUV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAoKSAtPiBydWxlLmFwcGx5KG5ldyBGYWlsdXJlU3RhdGVtZW50KG1SdW50aW1lRXhjZXB0aW9uKSwgbURlc2NyaXB0aW9uKS5ldmFsdWF0ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChhY3R1YWxFeGNlcHRpb24pLmlzU2FtZUFzKG1SdW50aW1lRXhjZXB0aW9uKTsKKyAgICAgICAgdmVyaWZ5KG1Hb29kR3V5UnVubmVyMSkucnVuKCk7CisgICAgICAgIHZlcmlmeShtR29vZEd1eUV4dHJhRXhjZXB0aW9uczEpLmNhbGwoKTsKKyAgICAgICAgdmVyaWZ5KG1EdW1wZXIpLmR1bXAoIldoYXRldmVyIiwgYWN0dWFsRXhjZXB0aW9uKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUZXN0UGFzc19vbmVSdW5uZXJGYWlscygpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBmaW5hbCBTYWZlQ2xlYW5lclJ1bGUgcnVsZSA9IG5ldyBTYWZlQ2xlYW5lclJ1bGUoKQorICAgICAgICAgICAgICAgIC5ydW4obUdvb2RHdXlSdW5uZXIxKQorICAgICAgICAgICAgICAgIC5ydW4oKCkgLT4geyB0aHJvdyBtUnVudGltZUV4Y2VwdGlvbjsgfSkKKyAgICAgICAgICAgICAgICAucnVuKG1Hb29kR3V5UnVubmVyMikKKyAgICAgICAgICAgICAgICAuYWRkKG1Hb29kR3V5RXh0cmFFeGNlcHRpb25zMSk7CisgICAgICAgIGZpbmFsIFRocm93YWJsZSBhY3R1YWxFeGNlcHRpb24gPSBleHBlY3RUaHJvd3MoUnVudGltZUV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAoKSAtPiBydWxlLmFwcGx5KG1Hb29kR3V5U3RhdGVtZW50LCBtRGVzY3JpcHRpb24pLmV2YWx1YXRlKCkpOworICAgICAgICBhc3NlcnRUaGF0KGFjdHVhbEV4Y2VwdGlvbikuaXNTYW1lQXMobVJ1bnRpbWVFeGNlcHRpb24pOworICAgICAgICB2ZXJpZnkobUdvb2RHdXlSdW5uZXIxKS5ydW4oKTsKKyAgICAgICAgdmVyaWZ5KG1Hb29kR3V5UnVubmVyMikucnVuKCk7CisgICAgICAgIHZlcmlmeShtR29vZEd1eUV4dHJhRXhjZXB0aW9uczEpLmNhbGwoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUZXN0UGFzc19vbmVSdW5uZXJGYWlsc193aXRoRHVtcGVyKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGZpbmFsIFNhZmVDbGVhbmVyUnVsZSBydWxlID0gbmV3IFNhZmVDbGVhbmVyUnVsZSgpCisgICAgICAgICAgICAgICAgLnNldER1bXBlcihtRHVtcGVyKQorICAgICAgICAgICAgICAgIC5ydW4obUdvb2RHdXlSdW5uZXIxKQorICAgICAgICAgICAgICAgIC5ydW4oKCkgLT4geworICAgICAgICAgICAgICAgICAgICB0aHJvdyBtUnVudGltZUV4Y2VwdGlvbjsKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC5ydW4obUdvb2RHdXlSdW5uZXIyKQorICAgICAgICAgICAgICAgIC5hZGQobUdvb2RHdXlFeHRyYUV4Y2VwdGlvbnMxKTsKKyAgICAgICAgZmluYWwgVGhyb3dhYmxlIGFjdHVhbEV4Y2VwdGlvbiA9IGV4cGVjdFRocm93cyhSdW50aW1lRXhjZXB0aW9uLmNsYXNzLAorICAgICAgICAgICAgICAgICgpIC0+IHJ1bGUuYXBwbHkobUdvb2RHdXlTdGF0ZW1lbnQsIG1EZXNjcmlwdGlvbikuZXZhbHVhdGUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoYWN0dWFsRXhjZXB0aW9uKS5pc1NhbWVBcyhtUnVudGltZUV4Y2VwdGlvbik7CisgICAgICAgIHZlcmlmeShtR29vZEd1eVJ1bm5lcjEpLnJ1bigpOworICAgICAgICB2ZXJpZnkobUdvb2RHdXlSdW5uZXIyKS5ydW4oKTsKKyAgICAgICAgdmVyaWZ5KG1Hb29kR3V5RXh0cmFFeGNlcHRpb25zMSkuY2FsbCgpOworICAgICAgICB2ZXJpZnkobUR1bXBlcikuZHVtcCgiV2hhdGV2ZXIiLCBhY3R1YWxFeGNlcHRpb24pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRlc3RQYXNzX29uZUV4dHJhRXhjZXB0aW9uVGhyb3duKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGZpbmFsIFNhZmVDbGVhbmVyUnVsZSBydWxlID0gbmV3IFNhZmVDbGVhbmVyUnVsZSgpCisgICAgICAgICAgICAgICAgLnJ1bihtR29vZEd1eVJ1bm5lcjEpCisgICAgICAgICAgICAgICAgLmFkZCgoKSAtPiB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBJbW11dGFibGVMaXN0Lm9mKG1SdW50aW1lRXhjZXB0aW9uKTsKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC5hZGQobUdvb2RHdXlFeHRyYUV4Y2VwdGlvbnMxKQorICAgICAgICAgICAgICAgIC5ydW4obUdvb2RHdXlSdW5uZXIyKTsKKyAgICAgICAgZmluYWwgVGhyb3dhYmxlIGFjdHVhbEV4Y2VwdGlvbiA9IGV4cGVjdFRocm93cyhSdW50aW1lRXhjZXB0aW9uLmNsYXNzLAorICAgICAgICAgICAgICAgICgpIC0+IHJ1bGUuYXBwbHkobUdvb2RHdXlTdGF0ZW1lbnQsIG1EZXNjcmlwdGlvbikuZXZhbHVhdGUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoYWN0dWFsRXhjZXB0aW9uKS5pc1NhbWVBcyhtUnVudGltZUV4Y2VwdGlvbik7CisgICAgICAgIHZlcmlmeShtR29vZEd1eVJ1bm5lcjEpLnJ1bigpOworICAgICAgICB2ZXJpZnkobUdvb2RHdXlSdW5uZXIyKS5ydW4oKTsKKyAgICAgICAgdmVyaWZ5KG1Hb29kR3V5RXh0cmFFeGNlcHRpb25zMSkuY2FsbCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRlc3RQYXNzX29uZUV4dHJhRXhjZXB0aW9uVGhyb3duX3dpdGhEdW1wZXIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgZmluYWwgU2FmZUNsZWFuZXJSdWxlIHJ1bGUgPSBuZXcgU2FmZUNsZWFuZXJSdWxlKCkKKyAgICAgICAgICAgICAgICAuc2V0RHVtcGVyKG1EdW1wZXIpCisgICAgICAgICAgICAgICAgLnJ1bihtR29vZEd1eVJ1bm5lcjEpCisgICAgICAgICAgICAgICAgLmFkZCgoKSAtPiB7IHJldHVybiBJbW11dGFibGVMaXN0Lm9mKG1SdW50aW1lRXhjZXB0aW9uKTsgfSkKKyAgICAgICAgICAgICAgICAuYWRkKG1Hb29kR3V5RXh0cmFFeGNlcHRpb25zMSkKKyAgICAgICAgICAgICAgICAucnVuKG1Hb29kR3V5UnVubmVyMik7CisgICAgICAgIGZpbmFsIFRocm93YWJsZSBhY3R1YWxFeGNlcHRpb24gPSBleHBlY3RUaHJvd3MoUnVudGltZUV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAoKSAtPiBydWxlLmFwcGx5KG1Hb29kR3V5U3RhdGVtZW50LCBtRGVzY3JpcHRpb24pLmV2YWx1YXRlKCkpOworICAgICAgICBhc3NlcnRUaGF0KGFjdHVhbEV4Y2VwdGlvbikuaXNTYW1lQXMobVJ1bnRpbWVFeGNlcHRpb24pOworICAgICAgICB2ZXJpZnkobUdvb2RHdXlSdW5uZXIxKS5ydW4oKTsKKyAgICAgICAgdmVyaWZ5KG1Hb29kR3V5UnVubmVyMikucnVuKCk7CisgICAgICAgIHZlcmlmeShtR29vZEd1eUV4dHJhRXhjZXB0aW9uczEpLmNhbGwoKTsKKyAgICAgICAgdmVyaWZ5KG1EdW1wZXIpLmR1bXAoIldoYXRldmVyIiwgYWN0dWFsRXhjZXB0aW9uKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUaHJvd1RoZUtpdGNoZW5TaW5rQUtBRXZlcnlib2R5VGhyb3dzKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGZpbmFsIEV4Y2VwdGlvbiBleHRyYTEgPSBuZXcgRXhjZXB0aW9uKCIxIik7CisgICAgICAgIGZpbmFsIEV4Y2VwdGlvbiBleHRyYTIgPSBuZXcgRXhjZXB0aW9uKCIyIik7CisgICAgICAgIGZpbmFsIEV4Y2VwdGlvbiBleHRyYTMgPSBuZXcgRXhjZXB0aW9uKCIzIik7CisgICAgICAgIGZpbmFsIEVycm9yIGVycm9yMSA9IG5ldyBFcnJvcigib25lIik7CisgICAgICAgIGZpbmFsIEVycm9yIGVycm9yMiA9IG5ldyBFcnJvcigidHdvIik7CisgICAgICAgIGZpbmFsIFJ1bnRpbWVFeGNlcHRpb24gdGVzdEV4Y2VwdGlvbiAgPSBuZXcgUnVudGltZUV4Y2VwdGlvbigiVEVTVCwgWSBVIE5PIFBBU1M/Iik7CisgICAgICAgIGZpbmFsIFNhZmVDbGVhbmVyUnVsZSBydWxlID0gbmV3IFNhZmVDbGVhbmVyUnVsZSgpCisgICAgICAgICAgICAgICAgLnJ1bihtR29vZEd1eVJ1bm5lcjEpCisgICAgICAgICAgICAgICAgLmFkZChtR29vZEd1eUV4dHJhRXhjZXB0aW9uczEpCisgICAgICAgICAgICAgICAgLmFkZCgoKSAtPiB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBJbW11dGFibGVMaXN0Lm9mKGV4dHJhMSwgZXh0cmEyKTsKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC5ydW4oKCkgLT4geworICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjE7CisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAucnVuKG1Hb29kR3V5UnVubmVyMikKKyAgICAgICAgICAgICAgICAuYWRkKCgpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEltbXV0YWJsZUxpc3Qub2YoZXh0cmEzKTsKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC5hZGQobUdvb2RHdXlFeHRyYUV4Y2VwdGlvbnMyKQorICAgICAgICAgICAgICAgIC5ydW4oKCkgLT4geworICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjI7CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgZmluYWwgU2FmZUNsZWFuZXJSdWxlLk11bHRpcGxlRXhjZXB0aW9ucyBhY3R1YWxFeGNlcHRpb24gPSBleHBlY3RUaHJvd3MoCisgICAgICAgICAgICAgICAgU2FmZUNsZWFuZXJSdWxlLk11bHRpcGxlRXhjZXB0aW9ucy5jbGFzcywKKyAgICAgICAgICAgICAgICAoKSAtPiBydWxlLmFwcGx5KG5ldyBGYWlsdXJlU3RhdGVtZW50KHRlc3RFeGNlcHRpb24pLCBtRGVzY3JpcHRpb24pLmV2YWx1YXRlKCkpOworICAgICAgICBhc3NlcnRUaGF0KGFjdHVhbEV4Y2VwdGlvbi5nZXRUaHJvd2FibGVzKCkpCisgICAgICAgICAgICAgICAgLmNvbnRhaW5zRXhhY3RseSh0ZXN0RXhjZXB0aW9uLCBlcnJvcjEsIGVycm9yMiwgZXh0cmExLCBleHRyYTIsIGV4dHJhMykKKyAgICAgICAgICAgICAgICAuaW5PcmRlcigpOworICAgICAgICB2ZXJpZnkobUdvb2RHdXlSdW5uZXIxKS5ydW4oKTsKKyAgICAgICAgdmVyaWZ5KG1Hb29kR3V5UnVubmVyMikucnVuKCk7CisgICAgICAgIHZlcmlmeShtR29vZEd1eUV4dHJhRXhjZXB0aW9uczEpLmNhbGwoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUaHJvd1RoZUtpdGNoZW5TaW5rQUtBRXZlcnlib2R5VGhyb3dzX3dpdGhEdW1wZXIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgZmluYWwgRXhjZXB0aW9uIGV4dHJhMSA9IG5ldyBFeGNlcHRpb24oIjEiKTsKKyAgICAgICAgZmluYWwgRXhjZXB0aW9uIGV4dHJhMiA9IG5ldyBFeGNlcHRpb24oIjIiKTsKKyAgICAgICAgZmluYWwgRXhjZXB0aW9uIGV4dHJhMyA9IG5ldyBFeGNlcHRpb24oIjMiKTsKKyAgICAgICAgZmluYWwgRXJyb3IgZXJyb3IxID0gbmV3IEVycm9yKCJvbmUiKTsKKyAgICAgICAgZmluYWwgRXJyb3IgZXJyb3IyID0gbmV3IEVycm9yKCJ0d28iKTsKKyAgICAgICAgZmluYWwgUnVudGltZUV4Y2VwdGlvbiB0ZXN0RXhjZXB0aW9uICA9IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJURVNULCBZIFUgTk8gUEFTUz8iKTsKKyAgICAgICAgZmluYWwgU2FmZUNsZWFuZXJSdWxlIHJ1bGUgPSBuZXcgU2FmZUNsZWFuZXJSdWxlKCkKKyAgICAgICAgICAgICAgICAuc2V0RHVtcGVyKG1EdW1wZXIpCisgICAgICAgICAgICAgICAgLnJ1bihtR29vZEd1eVJ1bm5lcjEpCisgICAgICAgICAgICAgICAgLmFkZChtR29vZEd1eUV4dHJhRXhjZXB0aW9uczEpCisgICAgICAgICAgICAgICAgLmFkZCgoKSAtPiB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBJbW11dGFibGVMaXN0Lm9mKGV4dHJhMSwgZXh0cmEyKTsKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC5ydW4oKCkgLT4geworICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjE7CisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAucnVuKG1Hb29kR3V5UnVubmVyMikKKyAgICAgICAgICAgICAgICAuYWRkKCgpIC0+IHsgcmV0dXJuIEltbXV0YWJsZUxpc3Qub2YoZXh0cmEzKTsgfSkKKyAgICAgICAgICAgICAgICAuYWRkKG1Hb29kR3V5RXh0cmFFeGNlcHRpb25zMikKKyAgICAgICAgICAgICAgICAucnVuKCgpIC0+IHsgdGhyb3cgZXJyb3IyOyB9KTsKKworICAgICAgICBmaW5hbCBTYWZlQ2xlYW5lclJ1bGUuTXVsdGlwbGVFeGNlcHRpb25zIGFjdHVhbEV4Y2VwdGlvbiA9IGV4cGVjdFRocm93cygKKyAgICAgICAgICAgICAgICBTYWZlQ2xlYW5lclJ1bGUuTXVsdGlwbGVFeGNlcHRpb25zLmNsYXNzLAorICAgICAgICAgICAgICAgICgpIC0+IHJ1bGUuYXBwbHkobmV3IEZhaWx1cmVTdGF0ZW1lbnQodGVzdEV4Y2VwdGlvbiksIG1EZXNjcmlwdGlvbikuZXZhbHVhdGUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoYWN0dWFsRXhjZXB0aW9uLmdldFRocm93YWJsZXMoKSkKKyAgICAgICAgICAgICAgICAuY29udGFpbnNFeGFjdGx5KHRlc3RFeGNlcHRpb24sIGVycm9yMSwgZXJyb3IyLCBleHRyYTEsIGV4dHJhMiwgZXh0cmEzKQorICAgICAgICAgICAgICAgIC5pbk9yZGVyKCk7CisgICAgICAgIHZlcmlmeShtR29vZEd1eVJ1bm5lcjEpLnJ1bigpOworICAgICAgICB2ZXJpZnkobUdvb2RHdXlSdW5uZXIyKS5ydW4oKTsKKyAgICAgICAgdmVyaWZ5KG1Hb29kR3V5RXh0cmFFeGNlcHRpb25zMSkuY2FsbCgpOworICAgICAgICB2ZXJpZnkobUR1bXBlcikuZHVtcCgiV2hhdGV2ZXIiLCBhY3R1YWxFeGNlcHRpb24pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL1NhdmVJbmZvVGVzdC5qYXZhIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvU2F2ZUluZm9UZXN0LmphdmEKaW5kZXggNzAyZTFiMS4uYjUwN2ZhNSAxMDA2NDQKLS0tIGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvU2F2ZUluZm9UZXN0LmphdmEKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvU2F2ZUluZm9UZXN0LmphdmEKQEAgLTE2LDE4ICsxNiwyNyBAQAogCiBwYWNrYWdlIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0czsKIAoraW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLm1vY2s7CiBpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydFRocm93czsKIAoraW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKK2ltcG9ydCBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuSW50ZXJuYWxTYW5pdGl6ZXI7CitpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLmF1dG9maWxsLlNhbml0aXplcjsKIGltcG9ydCBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuU2F2ZUluZm87Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmF1dG9maWxsLkF1dG9maWxsSWQ7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCiBAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQorQEFwcE1vZGVGdWxsIC8vIFVuaXQgdGVzdAogcHVibGljIGNsYXNzIFNhdmVJbmZvVGVzdCB7CiAKKyAgICBwcml2YXRlICBmaW5hbCBBdXRvZmlsbElkIG1JZCA9IG5ldyBBdXRvZmlsbElkKDQyKTsKKyAgICBwcml2YXRlIGZpbmFsIEludGVybmFsU2FuaXRpemVyIG1TYW5pdGl6ZXIgPSBtb2NrKEludGVybmFsU2FuaXRpemVyLmNsYXNzKTsKKwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFJlcXVpcmVkSWRzQnVpbGRlcl9udWxsKCkgewogICAgICAgICBhc3NlcnRUaHJvd3MoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzLApAQCAtNTYsMTQgKzY1LDE0IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0T3B0aW9uYWxJZHNfbnVsbCgpIHsKICAgICAgICAgZmluYWwgU2F2ZUluZm8uQnVpbGRlciBidWlsZGVyID0gbmV3IFNhdmVJbmZvLkJ1aWxkZXIoU2F2ZUluZm8uU0FWRV9EQVRBX1RZUEVfR0VORVJJQywKLSAgICAgICAgICAgICAgICBuZXcgQXV0b2ZpbGxJZFtdIHsgbmV3IEF1dG9maWxsSWQoNDIpIH0pOworICAgICAgICAgICAgICAgIG5ldyBBdXRvZmlsbElkW10geyBtSWQgfSk7CiAgICAgICAgIGFzc2VydFRocm93cyhJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MsICgpLT4gYnVpbGRlci5zZXRPcHRpb25hbElkcyhudWxsKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0T3B0aW9uYWxfZW1wdHkoKSB7CiAgICAgICAgIGZpbmFsIFNhdmVJbmZvLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTYXZlSW5mby5CdWlsZGVyKFNhdmVJbmZvLlNBVkVfREFUQV9UWVBFX0dFTkVSSUMsCi0gICAgICAgICAgICAgICAgbmV3IEF1dG9maWxsSWRbXSB7IG5ldyBBdXRvZmlsbElkKDQyKSB9KTsKKyAgICAgICAgICAgICAgICBuZXcgQXV0b2ZpbGxJZFtdIHsgbUlkIH0pOwogICAgICAgICBhc3NlcnRUaHJvd3MoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzLAogICAgICAgICAgICAgICAgICgpIC0+IGJ1aWxkZXIuc2V0T3B0aW9uYWxJZHMobmV3IEF1dG9maWxsSWRbXSB7fSkpOwogICAgIH0KQEAgLTcxLDggKzgwLDM4IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0T3B0aW9uYWxfbnVsbEVudHJ5KCkgewogICAgICAgICBmaW5hbCBTYXZlSW5mby5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU2F2ZUluZm8uQnVpbGRlcihTYXZlSW5mby5TQVZFX0RBVEFfVFlQRV9HRU5FUklDLAotICAgICAgICAgICAgICAgIG5ldyBBdXRvZmlsbElkW10geyBuZXcgQXV0b2ZpbGxJZCg0MikgfSk7CisgICAgICAgICAgICAgICAgbmV3IEF1dG9maWxsSWRbXSB7IG1JZCB9KTsKICAgICAgICAgYXNzZXJ0VGhyb3dzKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcywKICAgICAgICAgICAgICAgICAoKSAtPiBidWlsZGVyLnNldE9wdGlvbmFsSWRzKG5ldyBBdXRvZmlsbElkW10geyBudWxsIH0pKTsKICAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRTYW5pdGl6ZXJfaWxsZWdhbEFyZ3MoKSB7CisgICAgICAgIGZpbmFsIFNhdmVJbmZvLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTYXZlSW5mby5CdWlsZGVyKFNhdmVJbmZvLlNBVkVfREFUQV9UWVBFX0dFTkVSSUMsCisgICAgICAgICAgICAgICAgbmV3IEF1dG9maWxsSWRbXSB7IG1JZCB9KTsKKyAgICAgICAgLy8gTnVsbCBzYW5pdGl6ZXIKKyAgICAgICAgYXNzZXJ0VGhyb3dzKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAoKSAtPiBidWlsZGVyLmFkZFNhbml0aXplcihudWxsLCBtSWQpKTsKKyAgICAgICAgLy8gSW52YWxpZCBzYW5pdGl6ZXIgY2xhc3MKKyAgICAgICAgYXNzZXJ0VGhyb3dzKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAoKSAtPiBidWlsZGVyLmFkZFNhbml0aXplcihtb2NrKFNhbml0aXplci5jbGFzcyksIG1JZCkpOworICAgICAgICAvLyBOdWxsIGlkcworICAgICAgICBhc3NlcnRUaHJvd3MoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzLAorICAgICAgICAgICAgICAgICgpIC0+IGJ1aWxkZXIuYWRkU2FuaXRpemVyKG1TYW5pdGl6ZXIsIChBdXRvZmlsbElkW10pIG51bGwpKTsKKyAgICAgICAgLy8gRW1wdHkgaWRzCisgICAgICAgIGFzc2VydFRocm93cyhJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MsCisgICAgICAgICAgICAgICAgKCkgLT4gYnVpbGRlci5hZGRTYW5pdGl6ZXIobVNhbml0aXplciwgbmV3IEF1dG9maWxsSWRbXSB7fSkpOworICAgICAgICAvLyBSZXBlYXRlZCBpZHMKKyAgICAgICAgYXNzZXJ0VGhyb3dzKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAoKSAtPiBidWlsZGVyLmFkZFNhbml0aXplcihtU2FuaXRpemVyLCBuZXcgQXV0b2ZpbGxJZFtdIHttSWQsIG1JZH0pKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRTYW5pdGl6ZXJfc2FtZUlkT25EaWZmZXJlbnRDYWxscygpIHsKKyAgICAgICAgZmluYWwgU2F2ZUluZm8uQnVpbGRlciBidWlsZGVyID0gbmV3IFNhdmVJbmZvLkJ1aWxkZXIoU2F2ZUluZm8uU0FWRV9EQVRBX1RZUEVfR0VORVJJQywKKyAgICAgICAgICAgICAgICBuZXcgQXV0b2ZpbGxJZFtdIHsgbUlkIH0pOworICAgICAgICBidWlsZGVyLmFkZFNhbml0aXplcihtU2FuaXRpemVyLCBtSWQpOworICAgICAgICBhc3NlcnRUaHJvd3MoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzLCAoKSAtPiBidWlsZGVyLmFkZFNhbml0aXplcihtU2FuaXRpemVyLCBtSWQpKTsKKyAgICB9CisKIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL1Nlc3Npb25MaWZlY3ljbGVUZXN0LmphdmEgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9TZXNzaW9uTGlmZWN5Y2xlVGVzdC5qYXZhCmluZGV4IGYwOTJhZDkuLjE4ZWY1YWEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL1Nlc3Npb25MaWZlY3ljbGVUZXN0LmphdmEKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvU2Vzc2lvbkxpZmVjeWNsZVRlc3QuamF2YQpAQCAtMTksMjkgKzE5LDM0IEBACiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5IZWxwZXIuSURfTE9HSU47CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5IZWxwZXIuSURfUEFTU1dPUkQ7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5IZWxwZXIuSURfVVNFUk5BTUU7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5IZWxwZXIuYXNzZXJ0Tm9EYW5nbGluZ1Nlc3Npb25zOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSGVscGVyLmFzc2VydFRleHRBbmRWYWx1ZTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5ldmVudHVhbGx5OwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSGVscGVyLmZpbmROb2RlQnlSZXNvdXJjZUlkOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSGVscGVyLmdldENvbnRleHQ7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5IZWxwZXIucnVuU2hlbGxDb21tYW5kOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuT3V0T2ZQcm9jZXNzTG9naW5BY3Rpdml0eS5nZXREZXN0cm95ZWRNYXJrZXI7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5PdXRPZlByb2Nlc3NMb2dpbkFjdGl2aXR5LmdldFN0YXJ0ZWRNYXJrZXI7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5PdXRPZlByb2Nlc3NMb2dpbkFjdGl2aXR5LmdldFN0b3BwZWRNYXJrZXI7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5VaUJvdC5MQU5EU0NBUEU7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5VaUJvdC5QT1JUUkFJVDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLmNvbW1vbi5TaGVsbEhlbHBlci5ydW5TaGVsbENvbW1hbmQ7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmljZS5hdXRvZmlsbC5TYXZlSW5mby5TQVZFX0RBVEFfVFlQRV9QQVNTV09SRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2aWNlLmF1dG9maWxsLlNhdmVJbmZvLlNBVkVfREFUQV9UWVBFX1VTRVJOQU1FOwogCiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLnRydXRoLlRydXRoLmFzc2VydFRoYXQ7CiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLnRydXRoLlRydXRoLmFzc2VydFdpdGhNZXNzYWdlOwogCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3N1bWUuYXNzdW1lRmFsc2U7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3N1bWUuYXNzdW1lVHJ1ZTsKIAoraW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuYXBwLmFzc2lzdC5Bc3Npc3RTdHJ1Y3R1cmU7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50U2VuZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLlVpT2JqZWN0MjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudmlldy5hdXRvZmlsbC5BdXRvZmlsbFZhbHVlOwogCkBAIC00OSwyOSArNTQsNDUgQEAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7CisKIC8qKgogICogVGVzdCB0aGUgbGlmZWN5Y2xlIG9mIGEgYXV0b2ZpbGwgc2Vzc2lvbgogICovCitAQXBwTW9kZUZ1bGwgLy8gVGhpcyB0ZXN0IHJlcXVpcmVzIGFuZHJvaWQucGVybWlzc2lvbi5XUklURV9FWFRFUk5BTF9TVE9SQUdFCiBwdWJsaWMgY2xhc3MgU2Vzc2lvbkxpZmVjeWNsZVRlc3QgZXh0ZW5kcyBBdXRvRmlsbFNlcnZpY2VUZXN0Q2FzZSB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTZXNzaW9uTGlmZWN5Y2xlVGVzdCI7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUk5BTUVfRlVMTF9JRCA9ICJhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHM6aWQvIiArIElEX1VTRVJOQU1FOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVNTV09SRF9GVUxMX0lEID0gImFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0czppZC8iICsgSURfUEFTU1dPUkQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR0lOX0ZVTExfSUQgPSAiYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzOmlkLyIgKyBJRF9MT0dJTjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVUVE9OX0ZVTExfSUQgPSAiYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzOmlkL2J1dHRvbiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBTkNFTF9GVUxMX0lEID0gImFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0czppZC9jYW5jZWwiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9CVVRUT04gPSAiYnV0dG9uIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfQ0FOQ0VMID0gImNhbmNlbCI7CiAKLSAgICBAQmVmb3JlCi0gICAgcHVibGljIHZvaWQgY2xlYW5VcFN0YXRlKCkgewotICAgICAgICBIZWxwZXIucHJlVGVzdENsZWFudXAoKTsKKyAgICAvKioKKyAgICAgKiBEZWxheSBmb3IgYWN0aXZpdHkgc3RhcnQvc3RvcC4KKyAgICAgKi8KKyAgICAvLyBUT0RPOiBmaWd1cmUgb3V0IGEgYmV0dGVyIHdheSB0byB3YWl0IHdpdGhvdXQgdXNpbmcgc2xlZXAoKS4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFdBSVRfQUNUSVZJVFlfTVMgPSAxMDAwOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGltZW91dCBTRVNTSU9OX0xJRkVDWUNMRV9USU1FT1VUID0gbmV3IFRpbWVvdXQoCisgICAgICAgICAgICAiU0VTU0lPTl9MSUZFQ1lDTEVfVElNRU9VVCIsIDIwMDAsIDJGLCA1MDAwKTsKKworICAgIC8qKgorICAgICAqIFJ1bnMgYW4ge0Bjb2RlIGFzc2VydGlvbn0sIHJldHJ5aW5nIHVudGlsIHtAY29kZSB0aW1lb3V0fSBpcyByZWFjaGVkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZXZlbnR1YWxseShTdHJpbmcgZGVzY3JpcHRpb24sIENhbGxhYmxlPEJvb2xlYW4+IGFzc2VydGlvbikKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTRVNTSU9OX0xJRkVDWUNMRV9USU1FT1VULnJ1bihkZXNjcmlwdGlvbiwgYXNzZXJ0aW9uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2Vzc2lvbkxpZmVjeWNsZVRlc3QoKSB7CisgICAgICAgIHN1cGVyKG5ldyBVaUJvdChTRVNTSU9OX0xJRkVDWUNMRV9USU1FT1VUKSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogUHJldmVudHMgdGhlIHNjcmVlbiB0byByb3RhdGUgYnkgaXRzZWxmCiAgICAgICovCiAgICAgQEJlZm9yZQotICAgIHB1YmxpYyB2b2lkIGRpc2FibGVBdXRvUm90YXRpb24oKSB7Ci0gICAgICAgIEhlbHBlci5kaXNhYmxlQXV0b1JvdGF0aW9uKHNVaUJvdCk7CisgICAgcHVibGljIHZvaWQgZGlzYWJsZUF1dG9Sb3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBIZWxwZXIuZGlzYWJsZUF1dG9Sb3RhdGlvbihtVWlCb3QpOwogICAgIH0KIAogICAgIC8qKgpAQCAtODYsMTQ0ICsxMDcsMTYyIEBACiAgICAgcHVibGljIHZvaWQgZmluaXNoTG9naW5BY3Rpdml0eU9uQW5vdGhlclByb2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgcnVuU2hlbGxDb21tYW5kKCJhbSBicm9hZGNhc3QgLS1yZWNlaXZlci1mb3JlZ3JvdW5kICIKICAgICAgICAgICAgICAgICArICItbiBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMvLk91dE9mUHJvY2Vzc0xvZ2luQWN0aXZpdHlGaW5pc2hlclJlY2VpdmVyIik7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnRHb25lQnlSZWxhdGl2ZUlkKElEX1VTRVJOQU1FLCBIZWxwZXIuQUNUSVZJVFlfUkVTVVJSRUNUSU9OX01TKTsKKyAgICAgICAgbVVpQm90LmFzc2VydEdvbmVCeVJlbGF0aXZlSWQoSURfVVNFUk5BTUUsIFRpbWVvdXRzLkFDVElWSVRZX1JFU1VSUkVDVElPTik7CiAKICAgICAgICAgaWYgKCFPdXRPZlByb2Nlc3NMb2dpbkFjdGl2aXR5Lmhhc0luc3RhbmNlKCkpIHsKICAgICAgICAgICAgIExvZy52KFRBRywgIkBBZnRlcjogTm90IHdhaXRpbmcgZm9yIG9vcCBhY3Rpdml0eSB0byBiZSBkZXN0cm95ZWQiKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICAvLyBXYWl0aW5nIGZvciBhY3Rpdml0eSB0byBiZSBkZXN0cm95ZWQgKGRlc3Ryb3kgbWFya2VyIGFwcGVhcnMpCi0gICAgICAgIGV2ZW50dWFsbHkoKCkgLT4gYXNzZXJ0VGhhdChnZXREZXN0cm95ZWRNYXJrZXIoZ2V0Q29udGV4dCgpKS5leGlzdHMoKSkuaXNUcnVlKCkpOworICAgICAgICBldmVudHVhbGx5KCJnZXREZXN0cm95ZWRNYXJrZXIoKSIsICgpIC0+IHsKKyAgICAgICAgICAgIHJldHVybiBnZXREZXN0cm95ZWRNYXJrZXIoZ2V0Q29udGV4dCgpKS5leGlzdHMoKTsKKyAgICAgICAgfSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGtpbGxPZlByb2Nlc3NMb2dpbkFjdGl2aXR5UHJvY2VzcygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBXYWl0aW5nIGZvciBhY3Rpdml0eSB0byBzdG9wIChzdG9wIG1hcmtlciBhcHBlYXJzKQotICAgICAgICBldmVudHVhbGx5KCgpIC0+IGFzc2VydFRoYXQoZ2V0U3RvcHBlZE1hcmtlcihnZXRDb250ZXh0KCkpLmV4aXN0cygpKS5pc1RydWUoKSk7CisgICAgICAgIGV2ZW50dWFsbHkoImdldFN0b3BwZWRNYXJrZXIoKSIsICgpIC0+IHsKKyAgICAgICAgICAgIHJldHVybiBnZXRTdG9wcGVkTWFya2VyKGdldENvbnRleHQoKSkuZXhpc3RzKCk7CisgICAgICAgIH0pOwogCiAgICAgICAgIC8vIG9uU3RvcCBtaWdodCBub3QgYmUgZmluaXNoZWQsIGhlbmNlIHdhaXQgbW9yZQotICAgICAgICBTeXN0ZW1DbG9jay5zbGVlcCgxMDAwKTsKKyAgICAgICAgU3lzdGVtQ2xvY2suc2xlZXAoV0FJVF9BQ1RJVklUWV9NUyk7CiAKICAgICAgICAgLy8gS2lsbCBhY3Rpdml0eSB0aGF0IGlzIGluIHRoZSBiYWNrZ3JvdW5kCiAgICAgICAgIHJ1blNoZWxsQ29tbWFuZCgiYW0gYnJvYWRjYXN0IC0tcmVjZWl2ZXItZm9yZWdyb3VuZCAiCiAgICAgICAgICAgICAgICAgKyAiLW4gYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLy5TZWxmRGVzdHJ1Y3RSZWNlaXZlciIpOwogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBzdGFydEFuZFdhaXRFeHRlcm5hbEFjdGl2aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEludGVudCBvdXRPZlByb2Nlc3NBY3ZpdGl0eVN0YXJ0SW50ZW50ID0gbmV3IEludGVudChnZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgT3V0T2ZQcm9jZXNzTG9naW5BY3Rpdml0eS5jbGFzcykuc2V0RmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOworICAgICAgICBnZXRTdGFydGVkTWFya2VyKGdldENvbnRleHQoKSkuZGVsZXRlKCk7CisgICAgICAgIGdldENvbnRleHQoKS5zdGFydEFjdGl2aXR5KG91dE9mUHJvY2Vzc0Fjdml0aXR5U3RhcnRJbnRlbnQpOworICAgICAgICBldmVudHVhbGx5KCJnZXRTdGFydGVkTWFya2VyKCkiLCAoKSAtPiB7CisgICAgICAgICAgICByZXR1cm4gZ2V0U3RhcnRlZE1hcmtlcihnZXRDb250ZXh0KCkpLmV4aXN0cygpOworICAgICAgICB9KTsKKyAgICAgICAgZ2V0U3RhcnRlZE1hcmtlcihnZXRDb250ZXh0KCkpLmRlbGV0ZSgpOworICAgICAgICAvLyBFdmVuIGlmIHdlIHdhaXQgdGhlIGFjdGl2aXR5IHN0YXJ0ZWQsIFVpT2JqZWN0IHN0aWxsIGZhaWxzLiBIYXZlIHRvIHdhaXQgYSBsaXR0bGUgYml0LgorICAgICAgICBTeXN0ZW1DbG9jay5zbGVlcChXQUlUX0FDVElWSVRZX01TKTsKKworICAgICAgICBtVWlCb3QuYXNzZXJ0U2hvd25CeVJlbGF0aXZlSWQoSURfVVNFUk5BTUUpOworICAgIH0KKwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdERhdGFzZXRBdXRoUmVzcG9uc2VXaGlsZUF1dG9maWxsZWRBcHBJc0xpZmVjeWNsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzdW1lVHJ1ZSgiU2NyZWVuIHJvdGF0aW9uIG5vdCBzdXBwb3J0ZWQiLCBzVWlCb3QuaXNTY3JlZW5Sb3RhdGlvblN1cHBvcnRlZCgpKTsKKyAgICAgICAgYXNzdW1lVHJ1ZSgiUm90YXRpb24gaXMgc3VwcG9ydGVkIiwgSGVscGVyLmlzUm90YXRpb25TdXBwb3J0ZWQobUNvbnRleHQpKTsKKyAgICAgICAgZmluYWwgQWN0aXZpdHlNYW5hZ2VyIGFjdGl2aXR5TWFuYWdlciA9IChBY3Rpdml0eU1hbmFnZXIpIGdldENvbnRleHQoKQorICAgICAgICAgICAgICAgIC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQUNUSVZJVFlfU0VSVklDRSk7CisgICAgICAgIGFzc3VtZUZhbHNlKGFjdGl2aXR5TWFuYWdlci5pc0xvd1JhbURldmljZSgpKTsKKwogICAgICAgICAvLyBTZXQgc2VydmljZS4KICAgICAgICAgZW5hYmxlU2VydmljZSgpOwogCi0gICAgICAgIHNVaUJvdC5zZXRTY3JlZW5SZXNvbHV0aW9uKCk7CisgICAgICAgIC8vIFN0YXJ0IGFjdGl2aXR5IHRoYXQgaXMgYXV0b2ZpbGxlZCBpbiBhIHNlcGFyYXRlIHByb2Nlc3Mgc28gaXQgY2FuIGJlIGtpbGxlZAorICAgICAgICBzdGFydEFuZFdhaXRFeHRlcm5hbEFjdGl2aXR5KCk7CiAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIFN0YXJ0IGFjdGl2aXR5IHRoYXQgaXMgYXV0b2ZpbGxlZCBpbiBhIHNlcGFyYXRlIHByb2Nlc3Mgc28gaXQgY2FuIGJlIGtpbGxlZAotICAgICAgICAgICAgSW50ZW50IG91dE9mUHJvY2Vzc0Fjdml0aXR5U3RhcnRJbnRlbnQgPSBuZXcgSW50ZW50KGdldENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgT3V0T2ZQcm9jZXNzTG9naW5BY3Rpdml0eS5jbGFzcyk7Ci0gICAgICAgICAgICBnZXRDb250ZXh0KCkuc3RhcnRBY3Rpdml0eShvdXRPZlByb2Nlc3NBY3ZpdGl0eVN0YXJ0SW50ZW50KTsKKyAgICAgICAgLy8gU2V0IGV4cGVjdGF0aW9ucy4KKyAgICAgICAgZmluYWwgQnVuZGxlIGV4dHJhcyA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgZXh0cmFzLnB1dFN0cmluZygibnVtYmVycyIsICI0ODE1MTYyMzQyIik7CiAKLSAgICAgICAgICAgIC8vIFNldCBleHBlY3RhdGlvbnMuCi0gICAgICAgICAgICBmaW5hbCBCdW5kbGUgZXh0cmFzID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgZXh0cmFzLnB1dFN0cmluZygibnVtYmVycyIsICI0ODE1MTYyMzQyIik7CisgICAgICAgIC8vIENyZWF0ZSB0aGUgYXV0aGVudGljYXRpb24gaW50ZW50IChsYXVuY2hpbmcgYSBmdWxsIHNjcmVlbiBhY3Rpdml0eSkKKyAgICAgICAgSW50ZW50U2VuZGVyIGF1dGhlbnRpY2F0aW9uID0gUGVuZGluZ0ludGVudC5nZXRBY3Rpdml0eShnZXRDb250ZXh0KCksIDAsCisgICAgICAgICAgICAgICAgbmV3IEludGVudChnZXRDb250ZXh0KCksIE1hbnVhbEF1dGhlbnRpY2F0aW9uQWN0aXZpdHkuY2xhc3MpLAorICAgICAgICAgICAgICAgIDApLmdldEludGVudFNlbmRlcigpOwogCi0gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIGF1dGhlbnRpY2F0aW9uIGludGVudCAobGF1bmNoaW5nIGEgZnVsbCBzY3JlZW4gYWN0aXZpdHkpCi0gICAgICAgICAgICBJbnRlbnRTZW5kZXIgYXV0aGVudGljYXRpb24gPSBQZW5kaW5nSW50ZW50LmdldEFjdGl2aXR5KGdldENvbnRleHQoKSwgMCwKLSAgICAgICAgICAgICAgICAgICAgbmV3IEludGVudChnZXRDb250ZXh0KCksIE1hbnVhbEF1dGhlbnRpY2F0aW9uQWN0aXZpdHkuY2xhc3MpLAotICAgICAgICAgICAgICAgICAgICAwKS5nZXRJbnRlbnRTZW5kZXIoKTsKKyAgICAgICAgLy8gUHJlcGFyZSB0aGUgYXV0aGVudGljYXRlZCByZXNwb25zZQorICAgICAgICBNYW51YWxBdXRoZW50aWNhdGlvbkFjdGl2aXR5LnNldFJlc3BvbnNlKG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLmFkZERhdGFzZXQobmV3IENhbm5lZEZpbGxSZXNwb25zZS5DYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1VTRVJOQU1FLCBBdXRvZmlsbFZhbHVlLmZvclRleHQoImF1dG9maWxsZWQgdXNlcm5hbWUiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJkYXRhc2V0IikpLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLnNldFJlcXVpcmVkU2F2YWJsZUlkcyhTQVZFX0RBVEFfVFlQRV9QQVNTV09SRCwgSURfVVNFUk5BTUUsIElEX1BBU1NXT1JEKQorICAgICAgICAgICAgICAgIC5zZXRFeHRyYXMoZXh0cmFzKS5idWlsZCgpKTsKIAotICAgICAgICAgICAgLy8gUHJlcGFyZSB0aGUgYXV0aGVudGljYXRlZCByZXNwb25zZQotICAgICAgICAgICAgTWFudWFsQXV0aGVudGljYXRpb25BY3Rpdml0eS5zZXRSZXNwb25zZShuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgICAgICAuYWRkRGF0YXNldChuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkNhbm5lZERhdGFzZXQuQnVpbGRlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1VTRVJOQU1FLCBBdXRvZmlsbFZhbHVlLmZvclRleHQoImF1dG9maWxsZWQgdXNlcm5hbWUiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiZGF0YXNldCIpKS5idWlsZCgpKQotICAgICAgICAgICAgICAgICAgICAuc2V0UmVxdWlyZWRTYXZhYmxlSWRzKFNBVkVfREFUQV9UWVBFX1BBU1NXT1JELCBJRF9VU0VSTkFNRSwgSURfUEFTU1dPUkQpCi0gICAgICAgICAgICAgICAgICAgIC5zZXRFeHRyYXMoZXh0cmFzKS5idWlsZCgpKTsKKyAgICAgICAgQ2FubmVkRmlsbFJlc3BvbnNlIHJlc3BvbnNlID0gbmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0QXV0aGVudGljYXRpb24oYXV0aGVudGljYXRpb24sIElEX1VTRVJOQU1FLCBJRF9QQVNTV09SRCkKKyAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiYXV0aGVudGljYXRlIikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKHJlc3BvbnNlKTsKIAotICAgICAgICAgICAgQ2FubmVkRmlsbFJlc3BvbnNlIHJlc3BvbnNlID0gbmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAgICAgLnNldEF1dGhlbnRpY2F0aW9uKGF1dGhlbnRpY2F0aW9uLCBJRF9VU0VSTkFNRSwgSURfUEFTU1dPUkQpCi0gICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJhdXRoZW50aWNhdGUiKSkKLSAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7Ci0gICAgICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShyZXNwb25zZSk7CisgICAgICAgIC8vIFRyaWdnZXIgYXV0b2ZpbGwgb24gdXNlcm5hbWUKKyAgICAgICAgbVVpQm90LnNlbGVjdEJ5UmVsYXRpdmVJZChJRF9VU0VSTkFNRSk7CiAKLSAgICAgICAgICAgIC8vIFRyaWdnZXIgYXV0b2ZpbGwgb24gdXNlcm5hbWUKLSAgICAgICAgICAgIHNVaUJvdC5zZWxlY3RCeUlkKFVTRVJOQU1FX0ZVTExfSUQpOworICAgICAgICAvLyBXYWl0IGZvciBmaWxsIHJlcXVlc3QgdG8gYmUgcHJvY2Vzc2VkCisgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwogCi0gICAgICAgICAgICAvLyBXYWl0IGZvciBmaWxsIHJlcXVlc3QgdG8gYmUgcHJvY2Vzc2VkCi0gICAgICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKKyAgICAgICAgLy8gV2FpdCB1bnRpbCBhdXRoZW50aWNhdGlvbiBpcyBzaG93bgorICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoImF1dGhlbnRpY2F0ZSIpOwogCi0gICAgICAgICAgICAvLyBXYWl0IHVudGlsIGF1dGhlbnRpY2F0aW9uIGlzIHNob3duCi0gICAgICAgICAgICBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoImF1dGhlbnRpY2F0ZSIpOworICAgICAgICAvLyBDaGFuZ2Ugb3JpZW50YXRpb24gd2hpY2ggdHJpZ2dlcnMgYSBkZXN0cm95IC0+IGNyZWF0ZSBpbiB0aGUgYXBwIGFzIHRoZSBhY3Rpdml0eQorICAgICAgICAvLyBjYW5ub3QgZGVhbCB3aXRoIHN1Y2ggc2l0dWF0aW9ucworICAgICAgICBtVWlCb3Quc2V0U2NyZWVuT3JpZW50YXRpb24oTEFORFNDQVBFKTsKKyAgICAgICAgbVVpQm90LnNldFNjcmVlbk9yaWVudGF0aW9uKFBPUlRSQUlUKTsKIAotICAgICAgICAgICAgLy8gQ2hhbmdlIG9yaWVudGF0aW9uIHdoaWNoIHRyaWdnZXJzIGEgZGVzdHJveSAtPiBjcmVhdGUgaW4gdGhlIGFwcCBhcyB0aGUgYWN0aXZpdHkKLSAgICAgICAgICAgIC8vIGNhbm5vdCBkZWFsIHdpdGggc3VjaCBzaXR1YXRpb25zCi0gICAgICAgICAgICBzVWlCb3Quc2V0U2NyZWVuT3JpZW50YXRpb24oTEFORFNDQVBFKTsKKyAgICAgICAgLy8gV2FpdCBjb250ZXh0IGFuZCBWaWV3cyBiZWluZyByZWNyZWF0ZWQgaW4gcm90YXRpb24KKyAgICAgICAgbVVpQm90LmFzc2VydFNob3duQnlSZWxhdGl2ZUlkKElEX1VTRVJOQU1FKTsKIAotICAgICAgICAgICAgLy8gRGVsZXRlIHN0b3BwZWQgbWFya2VyCi0gICAgICAgICAgICBnZXRTdG9wcGVkTWFya2VyKGdldENvbnRleHQoKSkuZGVsZXRlKCk7CisgICAgICAgIC8vIERlbGV0ZSBzdG9wcGVkIG1hcmtlcgorICAgICAgICBnZXRTdG9wcGVkTWFya2VyKGdldENvbnRleHQoKSkuZGVsZXRlKCk7CiAKLSAgICAgICAgICAgIC8vIEF1dGhlbnRpY2F0ZQotICAgICAgICAgICAgc1VpQm90LnNlbGVjdERhdGFzZXQoImF1dGhlbnRpY2F0ZSIpOworICAgICAgICAvLyBBdXRoZW50aWNhdGUKKyAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQoImF1dGhlbnRpY2F0ZSIpOwogCi0gICAgICAgICAgICAvLyBLaWxsIGFjdGl2aXR5IHRoYXQgaXMgaW4gdGhlIGJhY2tncm91bmQKLSAgICAgICAgICAgIGtpbGxPZlByb2Nlc3NMb2dpbkFjdGl2aXR5UHJvY2VzcygpOworICAgICAgICAvLyBLaWxsIGFjdGl2aXR5IHRoYXQgaXMgaW4gdGhlIGJhY2tncm91bmQKKyAgICAgICAga2lsbE9mUHJvY2Vzc0xvZ2luQWN0aXZpdHlQcm9jZXNzKCk7CiAKLSAgICAgICAgICAgIC8vIENoYW5nZSBvcmllbnRhdGlvbiB3aGljaCB0cmlnZ2VycyBhIGRlc3Ryb3kgLT4gY3JlYXRlIGluIHRoZSBhcHAgYXMgdGhlIGFjdGl2aXR5Ci0gICAgICAgICAgICAvLyBjYW5ub3QgZGVhbCB3aXRoIHN1Y2ggc2l0dWF0aW9ucwotICAgICAgICAgICAgc1VpQm90LnNldFNjcmVlbk9yaWVudGF0aW9uKFBPUlRSQUlUKTsKKyAgICAgICAgLy8gQ2hhbmdlIG9yaWVudGF0aW9uIHdoaWNoIHRyaWdnZXJzIGEgZGVzdHJveSAtPiBjcmVhdGUgaW4gdGhlIGFwcCBhcyB0aGUgYWN0aXZpdHkKKyAgICAgICAgLy8gY2Fubm90IGRlYWwgd2l0aCBzdWNoIHNpdHVhdGlvbnMKKyAgICAgICAgbVVpQm90LnNldFNjcmVlbk9yaWVudGF0aW9uKFBPUlRSQUlUKTsKIAotICAgICAgICAgICAgLy8gQXBwcm92ZSBhdXRoZW50aWNhdGlvbgotICAgICAgICAgICAgc1VpQm90LnNlbGVjdEJ5SWQoQlVUVE9OX0ZVTExfSUQpOworICAgICAgICAvLyBBcHByb3ZlIGF1dGhlbnRpY2F0aW9uCisgICAgICAgIG1VaUJvdC5zZWxlY3RCeVJlbGF0aXZlSWQoSURfQlVUVE9OKTsKIAotICAgICAgICAgICAgLy8gV2FpdCBmb3IgZGF0YXNldCB0byBiZSBzaG93bgotICAgICAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJkYXRhc2V0Iik7CisgICAgICAgIC8vIFdhaXQgZm9yIGRhdGFzZXQgdG8gYmUgc2hvd24KKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJkYXRhc2V0Iik7CiAKLSAgICAgICAgICAgIC8vIENoYW5nZSBvcmllbnRhdGlvbiB3aGljaCB0cmlnZ2VycyBhIGRlc3Ryb3kgLT4gY3JlYXRlIGluIHRoZSBhcHAgYXMgdGhlIGFjdGl2aXR5Ci0gICAgICAgICAgICAvLyBjYW5ub3QgZGVhbCB3aXRoIHN1Y2ggc2l0dWF0aW9ucwotICAgICAgICAgICAgc1VpQm90LnNldFNjcmVlbk9yaWVudGF0aW9uKExBTkRTQ0FQRSk7CisgICAgICAgIC8vIENoYW5nZSBvcmllbnRhdGlvbiB3aGljaCB0cmlnZ2VycyBhIGRlc3Ryb3kgLT4gY3JlYXRlIGluIHRoZSBhcHAgYXMgdGhlIGFjdGl2aXR5CisgICAgICAgIC8vIGNhbm5vdCBkZWFsIHdpdGggc3VjaCBzaXR1YXRpb25zCisgICAgICAgIG1VaUJvdC5zZXRTY3JlZW5PcmllbnRhdGlvbihMQU5EU0NBUEUpOwogCi0gICAgICAgICAgICAvLyBTZWxlY3QgZGF0YXNldAotICAgICAgICAgICAgc1VpQm90LnNlbGVjdERhdGFzZXQoImRhdGFzZXQiKTsKKyAgICAgICAgLy8gU2VsZWN0IGRhdGFzZXQKKyAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQoImRhdGFzZXQiKTsKIAotICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIHJlc3VsdHMuCi0gICAgICAgICAgICBldmVudHVhbGx5KCgpIC0+IGFzc2VydFRoYXQoc1VpQm90LmdldFRleHRCeUlkKFVTRVJOQU1FX0ZVTExfSUQpKS5pc0VxdWFsVG8oCi0gICAgICAgICAgICAgICAgICAgICJhdXRvZmlsbGVkIHVzZXJuYW1lIikpOworICAgICAgICAvLyBDaGVjayB0aGUgcmVzdWx0cy4KKyAgICAgICAgZXZlbnR1YWxseSgiZ2V0VGV4dEJ5SWQoIiArIElEX1VTRVJOQU1FICsgIikiLCAoKSAtPiB7CisgICAgICAgICAgICByZXR1cm4gbVVpQm90LmdldFRleHRCeVJlbGF0aXZlSWQoSURfVVNFUk5BTUUpLmVxdWFscygiYXV0b2ZpbGxlZCB1c2VybmFtZSIpOworICAgICAgICB9KTsKIAotICAgICAgICAgICAgLy8gU2V0IHBhc3N3b3JkCi0gICAgICAgICAgICBzVWlCb3Quc2V0VGV4dEJ5SWQoUEFTU1dPUkRfRlVMTF9JRCwgIm5ldyBwYXNzd29yZCIpOworICAgICAgICAvLyBTZXQgcGFzc3dvcmQKKyAgICAgICAgbVVpQm90LnNldFRleHRCeVJlbGF0aXZlSWQoSURfUEFTU1dPUkQsICJuZXcgcGFzc3dvcmQiKTsKIAotICAgICAgICAgICAgLy8gTG9naW4KLSAgICAgICAgICAgIHNVaUJvdC5zZWxlY3RCeUlkKExPR0lOX0ZVTExfSUQpOworICAgICAgICAvLyBMb2dpbgorICAgICAgICBtVWlCb3Quc2VsZWN0QnlSZWxhdGl2ZUlkKElEX0xPR0lOKTsKIAotICAgICAgICAgICAgLy8gV2FpdCBmb3Igc2F2ZSBVSSB0byBiZSBzaG93bgotICAgICAgICAgICAgc1VpQm90LmFzc2VydFNob3duQnlJZCgiYW5kcm9pZDppZC9hdXRvZmlsbF9zYXZlX3llcyIpOworICAgICAgICAvLyBXYWl0IGZvciBzYXZlIFVJIHRvIGJlIHNob3duCisgICAgICAgIG1VaUJvdC5hc3NlcnRTYXZlU2hvd2luZyhTQVZFX0RBVEFfVFlQRV9QQVNTV09SRCk7CiAKLSAgICAgICAgICAgIC8vIENoYW5nZSBvcmllbnRhdGlvbiB0byBtYWtlIHN1cmUgc2F2ZSBVSSBjYW4gaGFuZGxlIHRoaXMKLSAgICAgICAgICAgIHNVaUJvdC5zZXRTY3JlZW5PcmllbnRhdGlvbihQT1JUUkFJVCk7CisgICAgICAgIC8vIENoYW5nZSBvcmllbnRhdGlvbiB0byBtYWtlIHN1cmUgc2F2ZSBVSSBjYW4gaGFuZGxlIHRoaXMKKyAgICAgICAgbVVpQm90LnNldFNjcmVlbk9yaWVudGF0aW9uKFBPUlRSQUlUKTsKIAotICAgICAgICAgICAgLy8gVGFwICJTYXZlIi4KLSAgICAgICAgICAgIHNVaUJvdC5zZWxlY3RCeUlkKCJhbmRyb2lkOmlkL2F1dG9maWxsX3NhdmVfeWVzIik7CisgICAgICAgIC8vIFRhcCAiU2F2ZSIuCisgICAgICAgIG1VaUJvdC5zYXZlRm9yQXV0b2ZpbGwodHJ1ZSwgU0FWRV9EQVRBX1RZUEVfUEFTU1dPUkQpOwogCi0gICAgICAgICAgICAvLyBHZXQgc2F2ZSByZXF1ZXN0Ci0gICAgICAgICAgICBJbnN0cnVtZW50ZWRBdXRvRmlsbFNlcnZpY2UuU2F2ZVJlcXVlc3Qgc2F2ZVJlcXVlc3QgPSBzUmVwbGllci5nZXROZXh0U2F2ZVJlcXVlc3QoKTsKLSAgICAgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJvblNhdmUoKSBub3QgY2FsbGVkIikudGhhdChzYXZlUmVxdWVzdCkuaXNOb3ROdWxsKCk7CisgICAgICAgIC8vIEdldCBzYXZlIHJlcXVlc3QKKyAgICAgICAgSW5zdHJ1bWVudGVkQXV0b0ZpbGxTZXJ2aWNlLlNhdmVSZXF1ZXN0IHNhdmVSZXF1ZXN0ID0gc1JlcGxpZXIuZ2V0TmV4dFNhdmVSZXF1ZXN0KCk7CisgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJvblNhdmUoKSBub3QgY2FsbGVkIikudGhhdChzYXZlUmVxdWVzdCkuaXNOb3ROdWxsKCk7CiAKLSAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBkYXRhIGlzIGNvcnJlY3RseSBzYXZlZAotICAgICAgICAgICAgZmluYWwgQXNzaXN0U3RydWN0dXJlLlZpZXdOb2RlIHVzZXJuYW1lID0gZmluZE5vZGVCeVJlc291cmNlSWQoc2F2ZVJlcXVlc3Quc3RydWN0dXJlLAotICAgICAgICAgICAgICAgICAgICBJRF9VU0VSTkFNRSk7Ci0gICAgICAgICAgICBhc3NlcnRUZXh0QW5kVmFsdWUodXNlcm5hbWUsICJhdXRvZmlsbGVkIHVzZXJuYW1lIik7Ci0gICAgICAgICAgICBmaW5hbCBBc3Npc3RTdHJ1Y3R1cmUuVmlld05vZGUgcGFzc3dvcmQgPSBmaW5kTm9kZUJ5UmVzb3VyY2VJZChzYXZlUmVxdWVzdC5zdHJ1Y3R1cmUsCi0gICAgICAgICAgICAgICAgICAgIElEX1BBU1NXT1JEKTsKLSAgICAgICAgICAgIGFzc2VydFRleHRBbmRWYWx1ZShwYXNzd29yZCwgIm5ldyBwYXNzd29yZCIpOworICAgICAgICAvLyBNYWtlIHN1cmUgZGF0YSBpcyBjb3JyZWN0bHkgc2F2ZWQKKyAgICAgICAgZmluYWwgQXNzaXN0U3RydWN0dXJlLlZpZXdOb2RlIHVzZXJuYW1lID0gZmluZE5vZGVCeVJlc291cmNlSWQoc2F2ZVJlcXVlc3Quc3RydWN0dXJlLAorICAgICAgICAgICAgICAgIElEX1VTRVJOQU1FKTsKKyAgICAgICAgYXNzZXJ0VGV4dEFuZFZhbHVlKHVzZXJuYW1lLCAiYXV0b2ZpbGxlZCB1c2VybmFtZSIpOworICAgICAgICBmaW5hbCBBc3Npc3RTdHJ1Y3R1cmUuVmlld05vZGUgcGFzc3dvcmQgPSBmaW5kTm9kZUJ5UmVzb3VyY2VJZChzYXZlUmVxdWVzdC5zdHJ1Y3R1cmUsCisgICAgICAgICAgICAgICAgSURfUEFTU1dPUkQpOworICAgICAgICBhc3NlcnRUZXh0QW5kVmFsdWUocGFzc3dvcmQsICJuZXcgcGFzc3dvcmQiKTsKIAotICAgICAgICAgICAgLy8gTWFrZSBzdXJlIGV4dHJhcyB3ZXJlIHBhc3NlZCBiYWNrIG9uIG9uU2F2ZSgpCi0gICAgICAgICAgICBhc3NlcnRUaGF0KHNhdmVSZXF1ZXN0LmRhdGEpLmlzTm90TnVsbCgpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGV4dHJhVmFsdWUgPSBzYXZlUmVxdWVzdC5kYXRhLmdldFN0cmluZygibnVtYmVycyIpOwotICAgICAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoImV4dHJhcyBub3QgcGFzc2VkIG9uIHNhdmUiKS50aGF0KGV4dHJhVmFsdWUpLmlzRXF1YWxUbygiNDgxNTE2MjM0MiIpOwotCi0gICAgICAgICAgICBldmVudHVhbGx5KCgpIC0+IGFzc2VydE5vRGFuZ2xpbmdTZXNzaW9ucygpKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHNVaUJvdC5yZXNldFNjcmVlblJlc29sdXRpb24oKTsKLSAgICAgICAgfQorICAgICAgICAvLyBNYWtlIHN1cmUgZXh0cmFzIHdlcmUgcGFzc2VkIGJhY2sgb24gb25TYXZlKCkKKyAgICAgICAgYXNzZXJ0VGhhdChzYXZlUmVxdWVzdC5kYXRhKS5pc05vdE51bGwoKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGV4dHJhVmFsdWUgPSBzYXZlUmVxdWVzdC5kYXRhLmdldFN0cmluZygibnVtYmVycyIpOworICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiZXh0cmFzIG5vdCBwYXNzZWQgb24gc2F2ZSIpLnRoYXQoZXh0cmFWYWx1ZSkuaXNFcXVhbFRvKCI0ODE1MTYyMzQyIik7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTIzMiw5ICsyNzEsNyBAQAogICAgICAgICBlbmFibGVTZXJ2aWNlKCk7CiAKICAgICAgICAgLy8gU3RhcnQgYWN0aXZpdHkgdGhhdCBpcyBhdXRvZmlsbGVkIGluIGEgc2VwYXJhdGUgcHJvY2VzcyBzbyBpdCBjYW4gYmUga2lsbGVkCi0gICAgICAgIEludGVudCBvdXRPZlByb2Nlc3NBY3ZpdGl0eVN0YXJ0SW50ZW50ID0gbmV3IEludGVudChnZXRDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgT3V0T2ZQcm9jZXNzTG9naW5BY3Rpdml0eS5jbGFzcyk7Ci0gICAgICAgIGdldENvbnRleHQoKS5zdGFydEFjdGl2aXR5KG91dE9mUHJvY2Vzc0Fjdml0aXR5U3RhcnRJbnRlbnQpOworICAgICAgICBzdGFydEFuZFdhaXRFeHRlcm5hbEFjdGl2aXR5KCk7CiAKICAgICAgICAgLy8gQ3JlYXRlIHRoZSBhdXRoZW50aWNhdGlvbiBpbnRlbnQgKGxhdW5jaGluZyBhIGZ1bGwgc2NyZWVuIGFjdGl2aXR5KQogICAgICAgICBJbnRlbnRTZW5kZXIgYXV0aGVudGljYXRpb24gPSBQZW5kaW5nSW50ZW50LmdldEFjdGl2aXR5KGdldENvbnRleHQoKSwgMCwKQEAgLTI0OCwyOCArMjg1LDI4IEBACiAgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKHJlc3BvbnNlKTsKIAogICAgICAgICAvLyBUcmlnZ2VyIGF1dG9maWxsIG9uIHVzZXJuYW1lCi0gICAgICAgIHNVaUJvdC5zZWxlY3RCeUlkKFVTRVJOQU1FX0ZVTExfSUQpOworICAgICAgICBtVWlCb3Quc2VsZWN0QnlSZWxhdGl2ZUlkKElEX1VTRVJOQU1FKTsKIAogICAgICAgICAvLyBXYWl0IGZvciBmaWxsIHJlcXVlc3QgdG8gYmUgcHJvY2Vzc2VkCiAgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwogCiAgICAgICAgIC8vIFdhaXQgdW50aWwgYXV0aGVudGljYXRpb24gaXMgc2hvd24KLSAgICAgICAgc1VpQm90LmFzc2VydERhdGFzZXRzKCJhdXRoZW50aWNhdGUiKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJhdXRoZW50aWNhdGUiKTsKIAogICAgICAgICAvLyBEZWxldGUgc3RvcHBlZCBtYXJrZXIKICAgICAgICAgZ2V0U3RvcHBlZE1hcmtlcihnZXRDb250ZXh0KCkpLmRlbGV0ZSgpOwogCiAgICAgICAgIC8vIEF1dGhlbnRpY2F0ZQotICAgICAgICBzVWlCb3Quc2VsZWN0RGF0YXNldCgiYXV0aGVudGljYXRlIik7CisgICAgICAgIG1VaUJvdC5zZWxlY3REYXRhc2V0KCJhdXRoZW50aWNhdGUiKTsKIAogICAgICAgICAvLyBLaWxsIGFjdGl2aXR5IHRoYXQgaXMgaW4gdGhlIGJhY2tncm91bmQKICAgICAgICAga2lsbE9mUHJvY2Vzc0xvZ2luQWN0aXZpdHlQcm9jZXNzKCk7CiAKICAgICAgICAgLy8gQ2FuY2VsIGF1dGhlbnRpY2F0aW9uIGFjdGl2aXR5Ci0gICAgICAgIHNVaUJvdC5wcmVzc0JhY2soKTsKKyAgICAgICAgbVVpQm90LnByZXNzQmFjaygpOwogCiAgICAgICAgIC8vIEF1dGhlbnRpY2F0aW9uIHNob3VsZCBzdGlsbCBiZSBzaG93bgotICAgICAgICBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoImF1dGhlbnRpY2F0ZSIpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoImF1dGhlbnRpY2F0ZSIpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0yNzgsMjUgKzMxNSwyMyBAQAogICAgICAgICBlbmFibGVTZXJ2aWNlKCk7CiAKICAgICAgICAgLy8gU3RhcnQgYWN0aXZpdHkgdGhhdCBpcyBhdXRvZmlsbGVkIGluIGEgc2VwYXJhdGUgcHJvY2VzcyBzbyBpdCBjYW4gYmUga2lsbGVkCi0gICAgICAgIEludGVudCBvdXRPZlByb2Nlc3NBY3ZpdGl0eVN0YXJ0SW50ZW50ID0gbmV3IEludGVudChnZXRDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgT3V0T2ZQcm9jZXNzTG9naW5BY3Rpdml0eS5jbGFzcyk7Ci0gICAgICAgIGdldENvbnRleHQoKS5zdGFydEFjdGl2aXR5KG91dE9mUHJvY2Vzc0Fjdml0aXR5U3RhcnRJbnRlbnQpOworICAgICAgICBzdGFydEFuZFdhaXRFeHRlcm5hbEFjdGl2aXR5KCk7CiAKICAgICAgICAgQ2FubmVkRmlsbFJlc3BvbnNlIHJlc3BvbnNlID0gbmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkKICAgICAgICAgICAgICAgICAuYWRkRGF0YXNldChuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkNhbm5lZERhdGFzZXQuQnVpbGRlcigKICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVByZXNlbnRhdGlvbigiZGF0YXNldCIpKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1VTRVJOQU1FLCAiZmlsbGVkIikuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1VTRVJOQU1FLCAiZmlsbGVkIikuYnVpbGQoKSkKICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKICAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UocmVzcG9uc2UpOwogCiAgICAgICAgIC8vIFRyaWdnZXIgYXV0b2ZpbGwgb24gdXNlcm5hbWUKLSAgICAgICAgc1VpQm90LnNlbGVjdEJ5SWQoVVNFUk5BTUVfRlVMTF9JRCk7CisgICAgICAgIG1VaUJvdC5zZWxlY3RCeVJlbGF0aXZlSWQoSURfVVNFUk5BTUUpOwogCiAgICAgICAgIC8vIFdhaXQgZm9yIGZpbGwgcmVxdWVzdCB0byBiZSBwcm9jZXNzZWQKICAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CiAKICAgICAgICAgLy8gV2FpdCB1bnRpbCBkYXRhc2V0IGlzIHNob3duCi0gICAgICAgIHNVaUJvdC5hc3NlcnREYXRhc2V0cygiZGF0YXNldCIpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoImRhdGFzZXQiKTsKIAogICAgICAgICAvLyBEZWxldGUgc3RvcHBlZCBtYXJrZXIKICAgICAgICAgZ2V0U3RvcHBlZE1hcmtlcihnZXRDb250ZXh0KCkpLmRlbGV0ZSgpOwpAQCAtMzExLDEwICszNDYsMTAgQEAKICAgICAgICAga2lsbE9mUHJvY2Vzc0xvZ2luQWN0aXZpdHlQcm9jZXNzKCk7CiAKICAgICAgICAgLy8gQ2FuY2VsIGFjdGl2aXR5IG9uIHRvcAotICAgICAgICBzVWlCb3QucHJlc3NCYWNrKCk7CisgICAgICAgIG1VaUJvdC5wcmVzc0JhY2soKTsKIAogICAgICAgICAvLyBEYXRhc2V0IHNob3VsZCBzdGlsbCBiZSBzaG93bgotICAgICAgICBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoImRhdGFzZXQiKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJkYXRhc2V0Iik7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTMyMywyNiArMzU4LDI0IEBACiAgICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKIAogICAgICAgICAvLyBTdGFydCBhY3Rpdml0eSB0aGF0IGlzIGF1dG9maWxsZWQgaW4gYSBzZXBhcmF0ZSBwcm9jZXNzIHNvIGl0IGNhbiBiZSBraWxsZWQKLSAgICAgICAgSW50ZW50IG91dE9mUHJvY2Vzc0Fjdml0aXR5U3RhcnRJbnRlbnQgPSBuZXcgSW50ZW50KGdldENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICBPdXRPZlByb2Nlc3NMb2dpbkFjdGl2aXR5LmNsYXNzKTsKLSAgICAgICAgZ2V0Q29udGV4dCgpLnN0YXJ0QWN0aXZpdHkob3V0T2ZQcm9jZXNzQWN2aXRpdHlTdGFydEludGVudCk7CisgICAgICAgIHN0YXJ0QW5kV2FpdEV4dGVybmFsQWN0aXZpdHkoKTsKIAogICAgICAgICAvLyBQcmVwYXJlIHJlc3BvbnNlIGZvciBmaXJzdCBhY3Rpdml0eQogICAgICAgICBDYW5uZWRGaWxsUmVzcG9uc2UgcmVzcG9uc2UgPSBuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKQogICAgICAgICAgICAgICAgIC5hZGREYXRhc2V0KG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQ2FubmVkRGF0YXNldC5CdWlsZGVyKAogICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlUHJlc2VudGF0aW9uKCJkYXRhc2V0MSIpKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1VTRVJOQU1FLCAiZmlsbGVkIikuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1VTRVJOQU1FLCAiZmlsbGVkIikuYnVpbGQoKSkKICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKICAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UocmVzcG9uc2UpOwogCiAgICAgICAgIC8vIFRyaWdnZXIgYXV0b2ZpbGwgb24gdXNlcm5hbWUKLSAgICAgICAgc1VpQm90LnNlbGVjdEJ5SWQoVVNFUk5BTUVfRlVMTF9JRCk7CisgICAgICAgIG1VaUJvdC5zZWxlY3RCeVJlbGF0aXZlSWQoSURfVVNFUk5BTUUpOwogCiAgICAgICAgIC8vIFdhaXQgZm9yIGZpbGwgcmVxdWVzdCB0byBiZSBwcm9jZXNzZWQKICAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CiAKICAgICAgICAgLy8gV2FpdCB1bnRpbCBkYXRhc2V0MSBpcyBzaG93bgotICAgICAgICBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoImRhdGFzZXQxIik7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cygiZGF0YXNldDEiKTsKIAogICAgICAgICAvLyBEZWxldGUgc3RvcHBlZCBtYXJrZXIKICAgICAgICAgZ2V0U3RvcHBlZE1hcmtlcihnZXRDb250ZXh0KCkpLmRlbGV0ZSgpOwpAQCAtMzUxLDcgKzM4NCw3IEBACiAgICAgICAgIHJlc3BvbnNlID0gbmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkKICAgICAgICAgICAgICAgICAuYWRkRGF0YXNldChuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkNhbm5lZERhdGFzZXQuQnVpbGRlcigKICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVByZXNlbnRhdGlvbigiZGF0YXNldDIiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgImZpbGxlZCIpLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgImZpbGxlZCIpLmJ1aWxkKCkpCiAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CiAgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKHJlc3BvbnNlKTsKIApAQCAtMzY0LDE4ICszOTcsOTYgQEAKICAgICAgICAga2lsbE9mUHJvY2Vzc0xvZ2luQWN0aXZpdHlQcm9jZXNzKCk7CiAKICAgICAgICAgLy8gVHJpZ2dlciBhdXRvZmlsbCBvbiB1c2VybmFtZSBpbiBuZXN0ZWQgYWN0aXZpdHkKLSAgICAgICAgc1VpQm90LnNlbGVjdEJ5SWQoVVNFUk5BTUVfRlVMTF9JRCk7CisgICAgICAgIG1VaUJvdC5zZWxlY3RCeVJlbGF0aXZlSWQoSURfVVNFUk5BTUUpOwogCiAgICAgICAgIC8vIFdhaXQgZm9yIGZpbGwgcmVxdWVzdCB0byBiZSBwcm9jZXNzZWQKICAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CiAKICAgICAgICAgLy8gV2FpdCB1bnRpbCBkYXRhc2V0IGluIG5lc3RlZCBhY3Rpdml0eSBpcyBzaG93bgotICAgICAgICBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoImRhdGFzZXQyIik7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cygiZGF0YXNldDIiKTsKIAogICAgICAgICAvLyBUYXAgIkNhbmNlbCIuCi0gICAgICAgIHNVaUJvdC5zZWxlY3RCeUlkKENBTkNFTF9GVUxMX0lEKTsKKyAgICAgICAgbVVpQm90LnNlbGVjdEJ5UmVsYXRpdmVJZChJRF9DQU5DRUwpOwogCiAgICAgICAgIC8vIERhdGFzZXQgc2hvdWxkIHN0aWxsIGJlIHNob3duCi0gICAgICAgIHNVaUJvdC5hc3NlcnREYXRhc2V0cygiZGF0YXNldDEiKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJkYXRhc2V0MSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERhdGFzZXRHb2VzQXdheVdoZW5BdXRvZmlsbGVkQXBwSXNLaWxsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gU2V0IHNlcnZpY2UuCisgICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKKworICAgICAgICAvLyBTdGFydCBhY3Rpdml0eSB0aGF0IGlzIGF1dG9maWxsZWQgaW4gYSBzZXBhcmF0ZSBwcm9jZXNzIHNvIGl0IGNhbiBiZSBraWxsZWQKKyAgICAgICAgc3RhcnRBbmRXYWl0RXh0ZXJuYWxBY3Rpdml0eSgpOworCisgICAgICAgIGZpbmFsIENhbm5lZEZpbGxSZXNwb25zZSByZXNwb25zZSA9IG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLmFkZERhdGFzZXQobmV3IENhbm5lZEZpbGxSZXNwb25zZS5DYW5uZWREYXRhc2V0LkJ1aWxkZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVQcmVzZW50YXRpb24oImRhdGFzZXQiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1VTRVJOQU1FLCAiZmlsbGVkIikuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UocmVzcG9uc2UpOworCisgICAgICAgIC8vIFRyaWdnZXIgYXV0b2ZpbGwgb24gdXNlcm5hbWUKKyAgICAgICAgbVVpQm90LnNlbGVjdEJ5UmVsYXRpdmVJZChJRF9VU0VSTkFNRSk7CisKKyAgICAgICAgLy8gV2FpdCBmb3IgZmlsbCByZXF1ZXN0IHRvIGJlIHByb2Nlc3NlZAorICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKKworICAgICAgICAvLyBXYWl0IHVudGlsIGRhdGFzZXQgaXMgc2hvd24KKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJkYXRhc2V0Iik7CisKKyAgICAgICAgLy8gS2lsbCBhY3Rpdml0eQorICAgICAgICBraWxsT2ZQcm9jZXNzTG9naW5BY3Rpdml0eVByb2Nlc3MoKTsKKworICAgICAgICAvLyBNYWtlIHN1cmUgZGF0YXNldCBpcyBub3Qgc2hvd24gYW55bW9yZQorICAgICAgICBtVWlCb3QuYXNzZXJ0Tm9EYXRhc2V0c0V2ZXIoKTsKKworICAgICAgICAvLyBSZXN0YXJ0IGFjdGl2aXR5IGFuIG1ha2Ugc3VyZSB0aGUgZGF0YXNldCBpcyBzdGlsbCBub3Qgc2hvd24KKyAgICAgICAgc3RhcnRBbmRXYWl0RXh0ZXJuYWxBY3Rpdml0eSgpOworICAgICAgICBtVWlCb3QuYXNzZXJ0Tm9EYXRhc2V0cygpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNhdmVSZW1haW5zV2hlbkF1dG9maWxsZWRBcHBJc0tpbGxlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBTZXQgc2VydmljZS4KKyAgICAgICAgZW5hYmxlU2VydmljZSgpOworCisgICAgICAgIC8vIFN0YXJ0IGFjdGl2aXR5IHRoYXQgaXMgYXV0b2ZpbGxlZCBpbiBhIHNlcGFyYXRlIHByb2Nlc3Mgc28gaXQgY2FuIGJlIGtpbGxlZAorICAgICAgICBzdGFydEFuZFdhaXRFeHRlcm5hbEFjdGl2aXR5KCk7CisKKyAgICAgICAgZmluYWwgQ2FubmVkRmlsbFJlc3BvbnNlIHJlc3BvbnNlID0gbmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0UmVxdWlyZWRTYXZhYmxlSWRzKFNBVkVfREFUQV9UWVBFX1VTRVJOQU1FLCBJRF9VU0VSTkFNRSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UocmVzcG9uc2UpOworCisgICAgICAgIC8vIFRyaWdnZXIgYXV0b2ZpbGwgb24gdXNlcm5hbWUKKyAgICAgICAgbVVpQm90LnNlbGVjdEJ5UmVsYXRpdmVJZChJRF9VU0VSTkFNRSk7CisKKyAgICAgICAgLy8gV2FpdCBmb3IgZmlsbCByZXF1ZXN0IHRvIGJlIHByb2Nlc3NlZAorICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKKworICAgICAgICAvLyBXYWl0IHVudGlsIGRhdGFzZXQgaXMgc2hvd24KKyAgICAgICAgbVVpQm90LmFzc2VydE5vRGF0YXNldHNFdmVyKCk7CisKKyAgICAgICAgLy8gVHJpZ2dlciBzYXZlCisgICAgICAgIG1VaUJvdC5zZXRUZXh0QnlSZWxhdGl2ZUlkKElEX1VTRVJOQU1FLCAiZHVkZSIpOworICAgICAgICBtVWlCb3Quc2VsZWN0QnlSZWxhdGl2ZUlkKElEX0xPR0lOKTsKKyAgICAgICAgbVVpQm90LmFzc2VydFNhdmVTaG93aW5nKFNBVkVfREFUQV9UWVBFX1VTRVJOQU1FKTsKKworICAgICAgICAvLyBLaWxsIGFjdGl2aXR5CisgICAgICAgIGtpbGxPZlByb2Nlc3NMb2dpbkFjdGl2aXR5UHJvY2VzcygpOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSBzYXZlIGlzIHN0aWxsIHNob3dpbmcKKyAgICAgICAgZmluYWwgVWlPYmplY3QyIHNhdmVTbmFja0JhciA9IG1VaUJvdC5hc3NlcnRTYXZlU2hvd2luZyhTQVZFX0RBVEFfVFlQRV9VU0VSTkFNRSk7CisKKyAgICAgICAgbVVpQm90LnNhdmVGb3JBdXRvZmlsbChzYXZlU25hY2tCYXIsIHRydWUpOworCisgICAgICAgIGZpbmFsIEluc3RydW1lbnRlZEF1dG9GaWxsU2VydmljZS5TYXZlUmVxdWVzdCBzYXZlUmVxdWVzdCA9IHNSZXBsaWVyLmdldE5leHRTYXZlUmVxdWVzdCgpOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSBkYXRhIGlzIGNvcnJlY3RseSBzYXZlZAorICAgICAgICBmaW5hbCBBc3Npc3RTdHJ1Y3R1cmUuVmlld05vZGUgdXNlcm5hbWUgPSBmaW5kTm9kZUJ5UmVzb3VyY2VJZChzYXZlUmVxdWVzdC5zdHJ1Y3R1cmUsCisgICAgICAgICAgICAgICAgSURfVVNFUk5BTUUpOworICAgICAgICBhc3NlcnRUZXh0QW5kVmFsdWUodXNlcm5hbWUsICJkdWRlIik7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvU2V0dGluZ3NJbnRlbnRUZXN0LmphdmEgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9TZXR0aW5nc0ludGVudFRlc3QuamF2YQppbmRleCBjOTFmZDEzLi5hZjU4MmY2IDEwMDY0NAotLS0gYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9TZXR0aW5nc0ludGVudFRlc3QuamF2YQorKysgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9TZXR0aW5nc0ludGVudFRlc3QuamF2YQpAQCAtMTUsMTMgKzE1LDE0IEBACiAgKi8KIHBhY2thZ2UgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzOwogCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5IZWxwZXIucnVuU2hlbGxDb21tYW5kOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuY29tbW9uLlNoZWxsSGVscGVyLnJ1blNoZWxsQ29tbWFuZDsKIAogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi50cnV0aC5UcnV0aC5hc3NlcnRXaXRoTWVzc2FnZTsKIAogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOwogaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLlVpT2JqZWN0MjsKIApAQCAtMzAsNiArMzEsNyBAQAogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCitAQXBwTW9kZUZ1bGwgLy8gU2VydmljZS1zcGVjaWZpYyB0ZXN0CiBwdWJsaWMgY2xhc3MgU2V0dGluZ3NJbnRlbnRUZXN0IGV4dGVuZHMgQXV0b0ZpbGxTZXJ2aWNlVGVzdENhc2UgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1ZX1JFUVVFU1RfQ09ERSA9IDQyOwpAQCAtNjAsMTIgKzYyLDEzIEBACiAgICAgICAgIG1BY3Rpdml0eS5zdGFydEZvclJlc3VsdChuZXdTZXR0aW5nc0ludGVudCgpLCBNWV9SRVFVRVNUX0NPREUpOwogCiAgICAgICAgIC8vIEFzc2VydHMgc2VydmljZXMgYXJlIHNob3duLgotICAgICAgICBzVWlCb3QuYXNzZXJ0U2hvd25CeVRleHQoSW5zdHJ1bWVudGVkQXV0b0ZpbGxTZXJ2aWNlLnNTZXJ2aWNlTGFiZWwpOwotICAgICAgICBzVWlCb3QuYXNzZXJ0U2hvd25CeVRleHQoTm9PcEF1dG9maWxsU2VydmljZS5TRVJWSUNFX0xBQkVMKTsKLSAgICAgICAgc1VpQm90LmFzc2VydE5vdFNob3dpbmdGb3JTdXJlKEJhZEF1dG9maWxsU2VydmljZS5TRVJWSUNFX0xBQkVMKTsKKyAgICAgICAgbVVpQm90LmFzc2VydFNob3duQnlUZXh0KEluc3RydW1lbnRlZEF1dG9GaWxsU2VydmljZS5zU2VydmljZUxhYmVsKTsKKyAgICAgICAgbVVpQm90LmFzc2VydFNob3duQnlUZXh0KEluc3RydW1lbnRlZEF1dG9GaWxsU2VydmljZUNvbXBhdE1vZGUuc1NlcnZpY2VMYWJlbCk7CisgICAgICAgIG1VaUJvdC5hc3NlcnRTaG93bkJ5VGV4dChOb09wQXV0b2ZpbGxTZXJ2aWNlLlNFUlZJQ0VfTEFCRUwpOworICAgICAgICBtVWlCb3QuYXNzZXJ0Tm90U2hvd2luZ0ZvclN1cmUoQmFkQXV0b2ZpbGxTZXJ2aWNlLlNFUlZJQ0VfTEFCRUwpOwogCiAgICAgICAgIC8vIEZpbmlzaGVzIGFuZCBhc3NlcnRzIHJlc3VsdC4KLSAgICAgICAgc1VpQm90LnByZXNzQmFjaygpOworICAgICAgICBtVWlCb3QucHJlc3NCYWNrKCk7CiAgICAgICAgIG1BY3Rpdml0eS5hc3NlcnRSZXN1bHQoQWN0aXZpdHkuUkVTVUxUX0NBTkNFTEVEKTsKICAgICB9CiAKQEAgLTc3LDcgKzgwLDcgQEAKICAgICAgICAgbUFjdGl2aXR5LnN0YXJ0Rm9yUmVzdWx0KG5ld1NldHRpbmdzSW50ZW50KCksIE1ZX1JFUVVFU1RfQ09ERSk7CiAKICAgICAgICAgLy8gQXNzZXJ0cyBzZXJ2aWNlcyBhcmUgc2hvd24uCi0gICAgICAgIGZpbmFsIFVpT2JqZWN0MiBvYmplY3QgPSBzVWlCb3QKKyAgICAgICAgZmluYWwgVWlPYmplY3QyIG9iamVjdCA9IG1VaUJvdAogICAgICAgICAgICAgICAgIC5hc3NlcnRTaG93bkJ5VGV4dChJbnN0cnVtZW50ZWRBdXRvRmlsbFNlcnZpY2Uuc1NlcnZpY2VMYWJlbCk7CiAgICAgICAgIG9iamVjdC5jbGljaygpOwogCkBAIC04NywxOCArOTAsMTkgQEAKICAgICAgICAgLy8gU28sIGZvciBub3csIGp1c3QgYXNzZXJ0cyB0aGUgc2VydmljZSBuYW1lIGlzIHNob3dpbmcgYWdhaW4gKGluIHRoZSBwb3B1cCksIGFuZCB0aGUgb3RoZXIKICAgICAgICAgLy8gc2VydmljZXMgYXJlIG5vdCBzaG93aW5nIChiZWNhdXNlIHRoZSBwb3B1cCBoaWRlcyB0aGVuKS4KIAotICAgICAgICBmaW5hbCBVaU9iamVjdDIgbXNnT2JqID0gc1VpQm90LmFzc2VydFNob3duQnlJZCgiYW5kcm9pZDppZC9tZXNzYWdlIik7CisgICAgICAgIGZpbmFsIFVpT2JqZWN0MiBtc2dPYmogPSBtVWlCb3QuYXNzZXJ0U2hvd25CeUlkKCJhbmRyb2lkOmlkL21lc3NhZ2UiKTsKICAgICAgICAgZmluYWwgU3RyaW5nIG1zZyA9IG1zZ09iai5nZXRUZXh0KCk7CiAgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJXcm9uZyB3YXJuaW5nIG1lc3NhZ2UiKS50aGF0KG1zZykKICAgICAgICAgICAgICAgICAuY29udGFpbnMoSW5zdHJ1bWVudGVkQXV0b0ZpbGxTZXJ2aWNlLnNTZXJ2aWNlTGFiZWwpOwogCiAgICAgICAgIC8vIE5PVEU6IGFzc2VydGlvbiBiZWxvdyBpcyBmaW5lIGJlY2F1c2UgaXQgbG9va3MgZm9yIHRoZSBmdWxsIHRleHQsIG5vdCBhIHN1YnN0cmluZwotICAgICAgICBzVWlCb3QuYXNzZXJ0Tm90U2hvd2luZ0ZvclN1cmUoSW5zdHJ1bWVudGVkQXV0b0ZpbGxTZXJ2aWNlLnNTZXJ2aWNlTGFiZWwpOwotICAgICAgICBzVWlCb3QuYXNzZXJ0Tm90U2hvd2luZ0ZvclN1cmUoTm9PcEF1dG9maWxsU2VydmljZS5TRVJWSUNFX0xBQkVMKTsKLSAgICAgICAgc1VpQm90LmFzc2VydE5vdFNob3dpbmdGb3JTdXJlKEJhZEF1dG9maWxsU2VydmljZS5TRVJWSUNFX0xBQkVMKTsKKyAgICAgICAgbVVpQm90LmFzc2VydE5vdFNob3dpbmdGb3JTdXJlKEluc3RydW1lbnRlZEF1dG9GaWxsU2VydmljZS5zU2VydmljZUxhYmVsKTsKKyAgICAgICAgbVVpQm90LmFzc2VydE5vdFNob3dpbmdGb3JTdXJlKEluc3RydW1lbnRlZEF1dG9GaWxsU2VydmljZUNvbXBhdE1vZGUuc1NlcnZpY2VMYWJlbCk7CisgICAgICAgIG1VaUJvdC5hc3NlcnROb3RTaG93aW5nRm9yU3VyZShOb09wQXV0b2ZpbGxTZXJ2aWNlLlNFUlZJQ0VfTEFCRUwpOworICAgICAgICBtVWlCb3QuYXNzZXJ0Tm90U2hvd2luZ0ZvclN1cmUoQmFkQXV0b2ZpbGxTZXJ2aWNlLlNFUlZJQ0VfTEFCRUwpOwogCiAgICAgICAgIC8vIEZpbmlzaGVzIGFuZCBhc3NlcnRzIHJlc3VsdC4KLSAgICAgICAgc1VpQm90LnByZXNzQmFjaygpOworICAgICAgICBtVWlCb3QucHJlc3NCYWNrKCk7CiAgICAgICAgIG1BY3Rpdml0eS5hc3NlcnRSZXN1bHQoQWN0aXZpdHkuUkVTVUxUX0NBTkNFTEVEKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL1NpbXBsZVNhdmVBY3Rpdml0eS5qYXZhIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvU2ltcGxlU2F2ZUFjdGl2aXR5LmphdmEKaW5kZXggMDg2NmIyZC4uYTk5MjRmNCAxMDA2NDQKLS0tIGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvU2ltcGxlU2F2ZUFjdGl2aXR5LmphdmEKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvU2ltcGxlU2F2ZUFjdGl2aXR5LmphdmEKQEAgLTE2LDYgKzE2LDggQEAKIHBhY2thZ2UgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzOwogCiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYXV0b2ZpbGwuQXV0b2ZpbGxNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5FZGl0VGV4dDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKQEAgLTI1LDI0ICsyNywzNyBAQAogICovCiBwdWJsaWMgY2xhc3MgU2ltcGxlU2F2ZUFjdGl2aXR5IGV4dGVuZHMgQWJzdHJhY3RBdXRvRmlsbEFjdGl2aXR5IHsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU2ltcGxlU2F2ZUFjdGl2aXR5IjsKKwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfTEFCRUwgPSAibGFiZWwiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfSU5QVVQgPSAiaW5wdXQiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfUEFTU1dPUkQgPSAicGFzc3dvcmQiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfQ09NTUlUID0gImNvbW1pdCI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0xBQkVMID0gIkxhYmVsOiI7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBTaW1wbGVTYXZlQWN0aXZpdHkgc0luc3RhbmNlOworCiAgICAgVGV4dFZpZXcgbUxhYmVsOwogICAgIEVkaXRUZXh0IG1JbnB1dDsKICAgICBFZGl0VGV4dCBtUGFzc3dvcmQ7CiAgICAgQnV0dG9uIG1DYW5jZWw7CiAgICAgQnV0dG9uIG1Db21taXQ7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBTaW1wbGVTYXZlQWN0aXZpdHkgc0luc3RhbmNlOworICAgIHByaXZhdGUgYm9vbGVhbiBtQXV0b0NvbW1pdCA9IHRydWU7CisgICAgcHJpdmF0ZSBib29sZWFuIG1DbGVhckZpZWxkc09uU3VibWl0ID0gZmFsc2U7CiAKLSAgICBwdWJsaWMgc3RhdGljIFNpbXBsZVNhdmVBY3Rpdml0eSBnZXRJbnN0YW5jZSgpIHsKKyAgICBzdGF0aWMgU2ltcGxlU2F2ZUFjdGl2aXR5IGdldEluc3RhbmNlKCkgewogICAgICAgICByZXR1cm4gc0luc3RhbmNlOwogICAgIH0KIAorICAgIHN0YXRpYyB2b2lkIGZpbmlzaEl0KFVpQm90IHVpQm90KSB7CisgICAgICAgIGlmIChzSW5zdGFuY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiU28gbG9uZyBhbmQgdGhhbmtzIGZvciBhbGwgdGhlIGZpc2ghIik7CisgICAgICAgICAgICBzSW5zdGFuY2UuZmluaXNoKCk7CisgICAgICAgICAgICB1aUJvdC5hc3NlcnRHb25lQnlSZWxhdGl2ZUlkKElEX0xBQkVMLCBUaW1lb3V0cy5BQ1RJVklUWV9SRVNVUlJFQ1RJT04pOworICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIFNpbXBsZVNhdmVBY3Rpdml0eSgpIHsKICAgICAgICAgc0luc3RhbmNlID0gdGhpczsKICAgICB9CkBAIC02MCw3ICs3NSw0NiBAQAogICAgICAgICBtQ29tbWl0ID0gZmluZFZpZXdCeUlkKFIuaWQuY29tbWl0KTsKIAogICAgICAgICBtQ2FuY2VsLnNldE9uQ2xpY2tMaXN0ZW5lcigodikgLT4gZ2V0QXV0b2ZpbGxNYW5hZ2VyKCkuY2FuY2VsKCkpOwotICAgICAgICBtQ29tbWl0LnNldE9uQ2xpY2tMaXN0ZW5lcigodikgLT4gZ2V0QXV0b2ZpbGxNYW5hZ2VyKCkuY29tbWl0KCkpOworICAgICAgICBtQ29tbWl0LnNldE9uQ2xpY2tMaXN0ZW5lcigodikgLT4gb25Db21taXQoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9uQ29tbWl0KCkgeworICAgICAgICBpZiAobUNsZWFyRmllbGRzT25TdWJtaXQpIHsKKyAgICAgICAgICAgIHJlc2V0RmllbGRzKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1BdXRvQ29tbWl0KSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJvbkNvbW1pdCgpOiBjYWxsaW5nIEFGTS5jb21taXQoKSIpOworICAgICAgICAgICAgZ2V0QXV0b2ZpbGxNYW5hZ2VyKCkuY29tbWl0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJvbkNvbW1pdCgpOiBOT1QgY2FsbGluZyBBRk0uY29tbWl0KCkiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZXNldEZpZWxkcygpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAicmVzZXRGaWVsZHMoKSIpOworICAgICAgICBtSW5wdXQuc2V0VGV4dCgiIik7CisgICAgICAgIG1QYXNzd29yZC5zZXRUZXh0KCIiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZpbmVzIHdoZXRoZXIgdGhlIGFjdGl2aXR5IHNob3VsZCBhdXRvbWF0aWNhbGx5IGNhbGwge0BsaW5rIEF1dG9maWxsTWFuYWdlciNjb21taXQoKX0gd2hlbgorICAgICAqIHRoZSBjb21taXQgYnV0dG9uIGlzIHRhcHBlZC4KKyAgICAgKi8KKyAgICB2b2lkIHNldEF1dG9Db21taXQoYm9vbGVhbiBmbGFnKSB7CisgICAgICAgIG1BdXRvQ29tbWl0ID0gZmxhZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZpbmVzIHdoZXRoZXIgdGhlIGFjdGl2aXR5IHNob3VsZCBhdXRvbWF0aWNhbGx5IGNsZWFyIGl0cyBmaWVsZHMgd2hlbiBzdWJtaXQgaXMgY2xpY2tlZC4KKyAgICAgKi8KKyAgICB2b2lkIHNldENsZWFyRmllbGRzT25TdWJtaXQoYm9vbGVhbiBmbGFnKSB7CisgICAgICAgIG1DbGVhckZpZWxkc09uU3VibWl0ID0gZmxhZzsKKyAgICB9CisKKyAgICBGaWxsRXhwZWN0YXRpb24gZXhwZWN0QXV0b0ZpbGwoU3RyaW5nIGlucHV0KSB7CisgICAgICAgIGZpbmFsIEZpbGxFeHBlY3RhdGlvbiBleHBlY3RhdGlvbiA9IG5ldyBGaWxsRXhwZWN0YXRpb24oaW5wdXQsIG51bGwpOworICAgICAgICBtSW5wdXQuYWRkVGV4dENoYW5nZWRMaXN0ZW5lcihleHBlY3RhdGlvbi5tSW5wdXRXYXRjaGVyKTsKKyAgICAgICAgcmV0dXJuIGV4cGVjdGF0aW9uOwogICAgIH0KIAogICAgIEZpbGxFeHBlY3RhdGlvbiBleHBlY3RBdXRvRmlsbChTdHJpbmcgaW5wdXQsIFN0cmluZyBwYXNzd29yZCkgewpAQCAtNzYsMTIgKzEzMCwxNiBAQAogCiAgICAgICAgIHByaXZhdGUgRmlsbEV4cGVjdGF0aW9uKFN0cmluZyBpbnB1dCwgU3RyaW5nIHBhc3N3b3JkKSB7CiAgICAgICAgICAgICBtSW5wdXRXYXRjaGVyID0gbmV3IE9uZVRpbWVUZXh0V2F0Y2hlcigiaW5wdXQiLCBtSW5wdXQsIGlucHV0KTsKLSAgICAgICAgICAgIG1QYXNzd29yZFdhdGNoZXIgPSBuZXcgT25lVGltZVRleHRXYXRjaGVyKCJwYXNzd29yZCIsIG1QYXNzd29yZCwgcGFzc3dvcmQpOworICAgICAgICAgICAgbVBhc3N3b3JkV2F0Y2hlciA9IHBhc3N3b3JkID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgPyBudWxsCisgICAgICAgICAgICAgICAgICAgIDogbmV3IE9uZVRpbWVUZXh0V2F0Y2hlcigicGFzc3dvcmQiLCBtUGFzc3dvcmQsIHBhc3N3b3JkKTsKICAgICAgICAgfQogCiAgICAgICAgIHZvaWQgYXNzZXJ0QXV0b0ZpbGxlZCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAgICAgbUlucHV0V2F0Y2hlci5hc3NlcnRBdXRvRmlsbGVkKCk7Ci0gICAgICAgICAgICBtUGFzc3dvcmRXYXRjaGVyLmFzc2VydEF1dG9GaWxsZWQoKTsKKyAgICAgICAgICAgIGlmIChtUGFzc3dvcmRXYXRjaGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtUGFzc3dvcmRXYXRjaGVyLmFzc2VydEF1dG9GaWxsZWQoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL1NpbXBsZVNhdmVBY3Rpdml0eVRlc3QuamF2YSBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL1NpbXBsZVNhdmVBY3Rpdml0eVRlc3QuamF2YQppbmRleCA0YWJjY2M5Li5lYjU5ZGE0IDEwMDY0NAotLS0gYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9TaW1wbGVTYXZlQWN0aXZpdHlUZXN0LmphdmEKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvU2ltcGxlU2F2ZUFjdGl2aXR5VGVzdC5qYXZhCkBAIC0xNSw3ICsxNSwxMCBAQAogICovCiBwYWNrYWdlIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0czsKIAoraW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuQW50aVRyaW1tZXJUZXh0V2F0Y2hlci5UUklNTUVSX1BBVFRFUk47CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5IZWxwZXIuSURfU1RBVElDX1RFWFQ7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5IZWxwZXIuYXNzZXJ0VGV4dEFuZFZhbHVlOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSGVscGVyLmFzc2VydFRleHRWYWx1ZTsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5maW5kTm9kZUJ5UmVzb3VyY2VJZDsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkxvZ2luQWN0aXZpdHkuSURfVVNFUk5BTUVfQ09OVEFJTkVSOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuU2ltcGxlU2F2ZUFjdGl2aXR5LklEX0NPTU1JVDsKQEAgLTI2LDYgKzI5LDcgQEAKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2aWNlLmF1dG9maWxsLlNhdmVJbmZvLlNBVkVfREFUQV9UWVBFX0dFTkVSSUM7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmljZS5hdXRvZmlsbC5TYXZlSW5mby5TQVZFX0RBVEFfVFlQRV9QQVNTV09SRDsKIAoraW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi50cnV0aC5UcnV0aC5hc3NlcnRUaGF0OwogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi50cnV0aC5UcnV0aC5hc3NlcnRXaXRoTWVzc2FnZTsKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzdW1lLmFzc3VtZVRydWU7CkBAIC0zNCwxOSArMzgsMzcgQEAKIGltcG9ydCBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSW5zdHJ1bWVudGVkQXV0b0ZpbGxTZXJ2aWNlLlNhdmVSZXF1ZXN0OwogaW1wb3J0IGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5TaW1wbGVTYXZlQWN0aXZpdHkuRmlsbEV4cGVjdGF0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOworaW1wb3J0IGFuZHJvaWQuc2VydmljZS5hdXRvZmlsbC5CYXRjaFVwZGF0ZXM7CitpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLmF1dG9maWxsLkN1c3RvbURlc2NyaXB0aW9uOworaW1wb3J0IGFuZHJvaWQuc2VydmljZS5hdXRvZmlsbC5GaWxsRXZlbnRIaXN0b3J5OworaW1wb3J0IGFuZHJvaWQuc2VydmljZS5hdXRvZmlsbC5SZWdleFZhbGlkYXRvcjsKK2ltcG9ydCBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuU2F2ZUluZm87CitpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLmF1dG9maWxsLlRleHRWYWx1ZVNhbml0aXplcjsKK2ltcG9ydCBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuVmFsaWRhdG9yOworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLkJ5OwogaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLlVpT2JqZWN0MjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYXV0b2ZpbGwuQXV0b2ZpbGxJZDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3czsKIAotaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKKwogcHVibGljIGNsYXNzIFNpbXBsZVNhdmVBY3Rpdml0eVRlc3QgZXh0ZW5kcyBDdXN0b21EZXNjcmlwdGlvbldpdGhMaW5rVGVzdENhc2UgewogCiAgICAgQFJ1bGUKICAgICBwdWJsaWMgZmluYWwgQXV0b2ZpbGxBY3Rpdml0eVRlc3RSdWxlPFNpbXBsZVNhdmVBY3Rpdml0eT4gbUFjdGl2aXR5UnVsZSA9CiAgICAgICAgICAgICBuZXcgQXV0b2ZpbGxBY3Rpdml0eVRlc3RSdWxlPFNpbXBsZVNhdmVBY3Rpdml0eT4oU2ltcGxlU2F2ZUFjdGl2aXR5LmNsYXNzLCBmYWxzZSk7CiAKKyAgICBAUnVsZQorICAgIHB1YmxpYyBmaW5hbCBBdXRvZmlsbEFjdGl2aXR5VGVzdFJ1bGU8V2VsY29tZUFjdGl2aXR5PiBtV2VsY29tZUFjdGl2aXR5UnVsZSA9CisgICAgICAgICAgICBuZXcgQXV0b2ZpbGxBY3Rpdml0eVRlc3RSdWxlPFdlbGNvbWVBY3Rpdml0eT4oV2VsY29tZUFjdGl2aXR5LmNsYXNzLCBmYWxzZSk7CisKICAgICBwcml2YXRlIFNpbXBsZVNhdmVBY3Rpdml0eSBtQWN0aXZpdHk7CiAKICAgICBwcml2YXRlIHZvaWQgc3RhcnRBY3Rpdml0eSgpIHsKQEAgLTU3LDcgKzc5LDcgQEAKICAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQobUNvbnRleHQsIFNpbXBsZVNhdmVBY3Rpdml0eS5jbGFzcyk7CiAgICAgICAgIGlmIChyZW1haW5PblJlY2VudHMpIHsKICAgICAgICAgICAgIGludGVudC5zZXRGbGFncygKLSAgICAgICAgICAgICAgICAgICAgSW50ZW50LkZMQUdfQUNUSVZJVFlfUkVUQUlOX0lOX1JFQ0VOVFMgfCBJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfRE9DVU1FTlQpOworICAgICAgICAgICAgICAgICAgICBJbnRlbnQuRkxBR19BQ1RJVklUWV9SRVRBSU5fSU5fUkVDRU5UUyB8IEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLKTsKICAgICAgICAgfQogICAgICAgICBtQWN0aXZpdHkgPSBtQWN0aXZpdHlSdWxlLmxhdW5jaEFjdGl2aXR5KGludGVudCk7CiAgICAgfQpAQCAtNjYsNyArODgsNyBAQAogICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChtQ29udGV4dC5nZXRBcHBsaWNhdGlvbkNvbnRleHQoKSwKICAgICAgICAgICAgICAgICBTaW1wbGVTYXZlQWN0aXZpdHkuY2xhc3MpOwogICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfUkVPUkRFUl9UT19GUk9OVCk7Ci0gICAgICAgIG1Db250ZXh0LnN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKKyAgICAgICAgbUFjdGl2aXR5LnN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtOTIsNyArMTE0LDcgQEAKIAogICAgICAgICAvLyBTZWxlY3QgZGF0YXNldC4KICAgICAgICAgZmluYWwgRmlsbEV4cGVjdGF0aW9uIGF1dG9maWxsRXhwZWNhdGlvbiA9IG1BY3Rpdml0eS5leHBlY3RBdXRvRmlsbCgiaWQiLCAicGFzcyIpOwotICAgICAgICBzVWlCb3Quc2VsZWN0RGF0YXNldCgiWU8iKTsKKyAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQoIllPIik7CiAgICAgICAgIGF1dG9maWxsRXhwZWNhdGlvbi5hc3NlcnRBdXRvRmlsbGVkKCk7CiAKICAgICAgICAgbUFjdGl2aXR5LnN5bmNSdW5PblVpVGhyZWFkKCgpIC0+IHsKQEAgLTEwMCwxMCArMTIyLDEwIEBACiAgICAgICAgICAgICBtQWN0aXZpdHkubVBhc3N3b3JkLnNldFRleHQoIlBBU1MiKTsKICAgICAgICAgICAgIG1BY3Rpdml0eS5tQ29tbWl0LnBlcmZvcm1DbGljaygpOwogICAgICAgICB9KTsKLSAgICAgICAgZmluYWwgVWlPYmplY3QyIHNhdmVVaSA9IHNVaUJvdC5hc3NlcnRTYXZlU2hvd2luZyhTQVZFX0RBVEFfVFlQRV9HRU5FUklDKTsKKyAgICAgICAgZmluYWwgVWlPYmplY3QyIHNhdmVVaSA9IG1VaUJvdC5hc3NlcnRTYXZlU2hvd2luZyhTQVZFX0RBVEFfVFlQRV9HRU5FUklDKTsKIAogICAgICAgICAvLyBTYXZlIGl0Li4uCi0gICAgICAgIHNVaUJvdC5zYXZlRm9yQXV0b2ZpbGwoc2F2ZVVpLCB0cnVlKTsKKyAgICAgICAgbVVpQm90LnNhdmVGb3JBdXRvZmlsbChzYXZlVWksIHRydWUpOwogCiAgICAgICAgIC8vIC4uLiBhbmQgYXNzZXJ0IHJlc3VsdHMKICAgICAgICAgZmluYWwgU2F2ZVJlcXVlc3Qgc2F2ZVJlcXVlc3QgPSBzUmVwbGllci5nZXROZXh0U2F2ZVJlcXVlc3QoKTsKQEAgLTEzMywxNSArMTU1LDE1IEBACiAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOwogCiAgICAgICAgIC8vIFRyaWdnZXIgYXV0b2ZpbGwuCi0gICAgICAgIHNVaUJvdC5hc3NlcnRTaG93bkJ5UmVsYXRpdmVJZChJRF9JTlBVVCkuY2xpY2soKTsKKyAgICAgICAgbVVpQm90LmFzc2VydFNob3duQnlSZWxhdGl2ZUlkKElEX0lOUFVUKS5jbGljaygpOwogICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKIAogICAgICAgICAvLyBTZWxlY3QgZGF0YXNldC4uLgotICAgICAgICBzVWlCb3Quc2VsZWN0RGF0YXNldCgiWU8iKTsKKyAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQoIllPIik7CiAKICAgICAgICAgLy8gLi4uYW5kIGFzc2VydCBhdXRvZmlsbGVkIHZhbHVlcy4KLSAgICAgICAgZmluYWwgVWlPYmplY3QyIGlucHV0ID0gc1VpQm90LmFzc2VydFNob3duQnlSZWxhdGl2ZUlkKElEX0lOUFVUKTsKLSAgICAgICAgZmluYWwgVWlPYmplY3QyIHBhc3N3b3JkID0gc1VpQm90LmFzc2VydFNob3duQnlSZWxhdGl2ZUlkKElEX1BBU1NXT1JEKTsKKyAgICAgICAgZmluYWwgVWlPYmplY3QyIGlucHV0ID0gbVVpQm90LmFzc2VydFNob3duQnlSZWxhdGl2ZUlkKElEX0lOUFVUKTsKKyAgICAgICAgZmluYWwgVWlPYmplY3QyIHBhc3N3b3JkID0gbVVpQm90LmFzc2VydFNob3duQnlSZWxhdGl2ZUlkKElEX1BBU1NXT1JEKTsKIAogICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgid3JvbmcgdmFsdWUgZm9yICdpbnB1dCciKS50aGF0KGlucHV0LmdldFRleHQoKSkuaXNFcXVhbFRvKCJpZCIpOwogICAgICAgICAvLyBUT0RPOiBwYXNzd29yZCBmaWVsZCBpcyBzaG93biBhcyAqKioqIDsgaWRlYWxseSB3ZSBzaG91bGQgYXNzZXJ0IGl0J3MgYSBwYXNzd29yZApAQCAtMTU0LDggKzE3Niw4IEBACiAgICAgICAgIC8vIFRyaWdnZXIgc2F2ZS4uLgogICAgICAgICBpbnB1dC5zZXRUZXh0KCJJRCIpOwogICAgICAgICBwYXNzd29yZC5zZXRUZXh0KCJQQVNTIik7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnRTaG93bkJ5UmVsYXRpdmVJZChJRF9DT01NSVQpLmNsaWNrKCk7Ci0gICAgICAgIHNVaUJvdC5zYXZlRm9yQXV0b2ZpbGwodHJ1ZSwgU0FWRV9EQVRBX1RZUEVfR0VORVJJQyk7CisgICAgICAgIG1VaUJvdC5hc3NlcnRTaG93bkJ5UmVsYXRpdmVJZChJRF9DT01NSVQpLmNsaWNrKCk7CisgICAgICAgIG1VaUJvdC5zYXZlRm9yQXV0b2ZpbGwodHJ1ZSwgU0FWRV9EQVRBX1RZUEVfR0VORVJJQyk7CiAKICAgICAgICAgLy8gLi4uIGFuZCBhc3NlcnQgcmVzdWx0cwogICAgICAgICBmaW5hbCBTYXZlUmVxdWVzdCBzYXZlUmVxdWVzdCA9IHNSZXBsaWVyLmdldE5leHRTYXZlUmVxdWVzdCgpOwpAQCAtMTY0LDE4ICsxODYsMTkgQEAKICAgICB9CiAKICAgICBAVGVzdAorICAgIEBBcHBNb2RlRnVsbCAvLyB0ZXN0QXV0b0ZpbGxPbmVEYXRhc2V0QW5kU2F2ZSgpIGlzIGVub3VnaCB0byB0ZXN0IGVwaGVtZXJhbCBhcHBzIHN1cHBvcnQKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2F2ZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBzYXZlVGVzdChmYWxzZSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2F2ZV9hZnRlclJvdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc3VtZVRydWUoIlNjcmVlbiByb3RhdGlvbiBub3Qgc3VwcG9ydGVkIiwgc1VpQm90LmlzU2NyZWVuUm90YXRpb25TdXBwb3J0ZWQoKSk7Ci0gICAgICAgIHNVaUJvdC5zZXRTY3JlZW5PcmllbnRhdGlvbihVaUJvdC5QT1JUUkFJVCk7CisgICAgICAgIGFzc3VtZVRydWUoIlJvdGF0aW9uIGlzIHN1cHBvcnRlZCIsIEhlbHBlci5pc1JvdGF0aW9uU3VwcG9ydGVkKG1Db250ZXh0KSk7CisgICAgICAgIG1VaUJvdC5zZXRTY3JlZW5PcmllbnRhdGlvbihVaUJvdC5QT1JUUkFJVCk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBzYXZlVGVzdCh0cnVlKTsKICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHNVaUJvdC5zZXRTY3JlZW5PcmllbnRhdGlvbihVaUJvdC5QT1JUUkFJVCk7CisgICAgICAgICAgICBtVWlCb3Quc2V0U2NyZWVuT3JpZW50YXRpb24oVWlCb3QuUE9SVFJBSVQpOwogICAgICAgICAgICAgY2xlYW5VcEFmdGVyU2NyZWVuT3JpZW50YXRpb25Jc0JhY2tUb1BvcnRyYWl0KCk7CiAgICAgICAgIH0KICAgICB9CkBAIC0yMDEsMTggKzIyNCwxOCBAQAogICAgICAgICAgICAgbUFjdGl2aXR5Lm1JbnB1dC5zZXRUZXh0KCIxMDgiKTsKICAgICAgICAgICAgIG1BY3Rpdml0eS5tQ29tbWl0LnBlcmZvcm1DbGljaygpOwogICAgICAgICB9KTsKLSAgICAgICAgVWlPYmplY3QyIHNhdmVVaSA9IHNVaUJvdC5hc3NlcnRTYXZlU2hvd2luZyhTQVZFX0RBVEFfVFlQRV9HRU5FUklDKTsKKyAgICAgICAgVWlPYmplY3QyIHNhdmVVaSA9IG1VaUJvdC5hc3NlcnRTYXZlU2hvd2luZyhTQVZFX0RBVEFfVFlQRV9HRU5FUklDKTsKIAogICAgICAgICBpZiAocm90YXRlKSB7CiAgICAgICAgICAgICAvLyBBZnRlciB0aGUgZGV2aWNlIHJvdGF0ZXMsIHRoZSBpbnB1dCBmaWVsZCBnZXQgZm9jdXMgYW5kIGdlbmVyYXRlIGEgbmV3IHNlc3Npb24uCiAgICAgICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShDYW5uZWRGaWxsUmVzcG9uc2UuTk9fUkVTUE9OU0UpOwogCi0gICAgICAgICAgICBzVWlCb3Quc2V0U2NyZWVuT3JpZW50YXRpb24oVWlCb3QuTEFORFNDQVBFKTsKLSAgICAgICAgICAgIHNhdmVVaSA9IHNVaUJvdC5hc3NlcnRTYXZlU2hvd2luZyhTQVZFX0RBVEFfVFlQRV9HRU5FUklDKTsKKyAgICAgICAgICAgIG1VaUJvdC5zZXRTY3JlZW5PcmllbnRhdGlvbihVaUJvdC5MQU5EU0NBUEUpOworICAgICAgICAgICAgc2F2ZVVpID0gbVVpQm90LmFzc2VydFNhdmVTaG93aW5nKFNBVkVfREFUQV9UWVBFX0dFTkVSSUMpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gU2F2ZSBpdC4uLgotICAgICAgICBzVWlCb3Quc2F2ZUZvckF1dG9maWxsKHNhdmVVaSwgdHJ1ZSk7CisgICAgICAgIG1VaUJvdC5zYXZlRm9yQXV0b2ZpbGwoc2F2ZVVpLCB0cnVlKTsKIAogICAgICAgICAvLyAuLi4gYW5kIGFzc2VydCByZXN1bHRzCiAgICAgICAgIGZpbmFsIFNhdmVSZXF1ZXN0IHNhdmVSZXF1ZXN0ID0gc1JlcGxpZXIuZ2V0TmV4dFNhdmVSZXF1ZXN0KCk7CkBAIC0yMjAsNiArMjQzLDM3IEBACiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2F2ZV9sYXVuY2hJbnRlbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3RhcnRBY3Rpdml0eSgpOworCisgICAgICAgIC8vIFNldCBzZXJ2aWNlLgorICAgICAgICBlbmFibGVTZXJ2aWNlKCk7CisKKyAgICAgICAgLy8gU2V0IGV4cGVjdGF0aW9ucy4KKyAgICAgICAgc1JlcGxpZXIuc2V0T25TYXZlKFdlbGNvbWVBY3Rpdml0eS5jcmVhdGVTZW5kZXIobUNvbnRleHQsICJTYXZlZCBieSB0aGUgYmVsbCIpKTsKKyAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UobmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0UmVxdWlyZWRTYXZhYmxlSWRzKFNBVkVfREFUQV9UWVBFX0dFTkVSSUMsIElEX0lOUFVUKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAvLyBUcmlnZ2VyIGF1dG9maWxsLgorICAgICAgICBtQWN0aXZpdHkuc3luY1J1bk9uVWlUaHJlYWQoKCkgLT4gbUFjdGl2aXR5Lm1JbnB1dC5yZXF1ZXN0Rm9jdXMoKSk7CisgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOworICAgICAgICBIZWxwZXIuYXNzZXJ0SGFzU2Vzc2lvbnMobVBhY2thZ2VOYW1lKTsKKworICAgICAgICAvLyBUcmlnZ2VyIHNhdmUuCisgICAgICAgIG1BY3Rpdml0eS5zeW5jUnVuT25VaVRocmVhZCgoKSAtPiB7CisgICAgICAgICAgICBtQWN0aXZpdHkubUlucHV0LnNldFRleHQoIjEwOCIpOworICAgICAgICAgICAgbUFjdGl2aXR5Lm1Db21taXQucGVyZm9ybUNsaWNrKCk7CisgICAgICAgIH0pOworCisgICAgICAgIC8vIFNhdmUgaXQuLi4KKyAgICAgICAgbVVpQm90LnNhdmVGb3JBdXRvZmlsbCh0cnVlLCBTQVZFX0RBVEFfVFlQRV9HRU5FUklDKTsKKyAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dFNhdmVSZXF1ZXN0KCk7CisgICAgICAgIC8vIC4uLiBhbmQgYXNzZXJ0IGFjdGl2aXR5IHdhcyBsYXVuY2hlZAorICAgICAgICBXZWxjb21lQWN0aXZpdHkuYXNzZXJ0U2hvd2luZyhtVWlCb3QsICJTYXZlZCBieSB0aGUgYmVsbCIpOworICAgIH0KKworICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFNhdmVUaGVuU3RhcnROZXdTZXNzaW9uUmlnaHRBd2F5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHN0YXJ0QWN0aXZpdHkoKTsKIApAQCAtMjQ0LDEwICsyOTgsNjIgQEAKICAgICAgICAgfSk7CiAKICAgICAgICAgLy8gTWFrZSBzdXJlIFNhdmUgVUkgZm9yIDFzdCBzZXNzaW9uIHdhcyBjYW5jZWxlZC4uLi4KLSAgICAgICAgc1VpQm90LmFzc2VydFNhdmVOb3RTaG93aW5nKFNBVkVfREFUQV9UWVBFX0dFTkVSSUMpOworICAgICAgICBtVWlCb3QuYXNzZXJ0U2F2ZU5vdFNob3dpbmcoU0FWRV9EQVRBX1RZUEVfR0VORVJJQyk7CisgICAgfQogCi0gICAgICAgIC8vLi4uIGFuZCAybmQgc2Vzc2lvbiBjYW5jZWxlZCBhcyB3ZWxsLgotICAgICAgICBIZWxwZXIuYXNzZXJ0Tm9EYW5nbGluZ1Nlc3Npb25zKCk7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2F2ZVdpdGhQYXJjZWxhYmxlT25DbGllbnRTdGF0ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdGFydEFjdGl2aXR5KCk7CisKKyAgICAgICAgLy8gU2V0IHNlcnZpY2UuCisgICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKKworICAgICAgICAvLyBTZXQgZXhwZWN0YXRpb25zLgorICAgICAgICBmaW5hbCBBdXRvZmlsbElkIGlkID0gbmV3IEF1dG9maWxsSWQoNDIpOworICAgICAgICBmaW5hbCBCdW5kbGUgY2xpZW50U3RhdGUgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgIGNsaWVudFN0YXRlLnB1dFBhcmNlbGFibGUoImlkIiwgaWQpOworICAgICAgICBjbGllbnRTdGF0ZS5wdXRQYXJjZWxhYmxlKCJteV9pZCIsIG5ldyBNeUF1dG9maWxsSWQoaWQpKTsKKyAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UobmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0UmVxdWlyZWRTYXZhYmxlSWRzKFNBVkVfREFUQV9UWVBFX0dFTkVSSUMsIElEX0lOUFVUKQorICAgICAgICAgICAgICAgIC5zZXRFeHRyYXMoY2xpZW50U3RhdGUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIC8vIFRyaWdnZXIgYXV0b2ZpbGwuCisgICAgICAgIG1BY3Rpdml0eS5zeW5jUnVuT25VaVRocmVhZCgoKSAtPiBtQWN0aXZpdHkubUlucHV0LnJlcXVlc3RGb2N1cygpKTsKKyAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CisKKyAgICAgICAgLy8gVHJpZ2dlciBzYXZlLgorICAgICAgICBtQWN0aXZpdHkuc3luY1J1bk9uVWlUaHJlYWQoKCkgLT4geworICAgICAgICAgICAgbUFjdGl2aXR5Lm1JbnB1dC5zZXRUZXh0KCIxMDgiKTsKKyAgICAgICAgICAgIG1BY3Rpdml0eS5tQ29tbWl0LnBlcmZvcm1DbGljaygpOworICAgICAgICB9KTsKKyAgICAgICAgVWlPYmplY3QyIHNhdmVVaSA9IG1VaUJvdC5hc3NlcnRTYXZlU2hvd2luZyhTQVZFX0RBVEFfVFlQRV9HRU5FUklDKTsKKworICAgICAgICAvLyBTYXZlIGl0Li4uCisgICAgICAgIG1VaUJvdC5zYXZlRm9yQXV0b2ZpbGwoc2F2ZVVpLCB0cnVlKTsKKworICAgICAgICAvLyAuLi4gYW5kIGFzc2VydCByZXN1bHRzCisgICAgICAgIGZpbmFsIFNhdmVSZXF1ZXN0IHNhdmVSZXF1ZXN0ID0gc1JlcGxpZXIuZ2V0TmV4dFNhdmVSZXF1ZXN0KCk7CisgICAgICAgIGFzc2VydE15Q2xpZW50U3RhdGUoc2F2ZVJlcXVlc3QuZGF0YSk7CisKKyAgICAgICAgLy8gQWxzbyBjaGVjayBmaWxsZXZlbnQgaGlzdG9yeQorICAgICAgICBmaW5hbCBGaWxsRXZlbnRIaXN0b3J5IGhpc3RvcnkgPSBJbnN0cnVtZW50ZWRBdXRvRmlsbFNlcnZpY2UuZ2V0RmlsbEV2ZW50SGlzdG9yeSgxKTsKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKKyAgICAgICAgZmluYWwgQnVuZGxlIGRlcHJlY2F0ZWRTdGF0ZSA9IGhpc3RvcnkuZ2V0Q2xpZW50U3RhdGUoKTsKKyAgICAgICAgYXNzZXJ0TXlDbGllbnRTdGF0ZShkZXByZWNhdGVkU3RhdGUpOworICAgICAgICBhc3NlcnRNeUNsaWVudFN0YXRlKGhpc3RvcnkuZ2V0RXZlbnRzKCkuZ2V0KDApLmdldENsaWVudFN0YXRlKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRNeUNsaWVudFN0YXRlKEJ1bmRsZSBkYXRhKSB7CisgICAgICAgIC8vIE11c3Qgc2V0IHByb3BlciBjbGFzc3BhdGggYmVmb3JlIHJlYWRpbmcgdGhlIGRhdGEsIG90aGVyd2lzZSBCdW5kbGUgd2lsbCB1c2UgaXQncworICAgICAgICAvLyBvbiBjbGFzcyBjbGFzc2xvYWRlciwgd2hpY2ggaXMgdGhlIGZyYW1ld29yaydzLgorICAgICAgICBkYXRhLnNldENsYXNzTG9hZGVyKGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7CisKKyAgICAgICAgZmluYWwgQXV0b2ZpbGxJZCBleHBlY3RlZElkID0gbmV3IEF1dG9maWxsSWQoNDIpOworICAgICAgICBmaW5hbCBBdXRvZmlsbElkIGFjdHVhbElkID0gZGF0YS5nZXRQYXJjZWxhYmxlKCJpZCIpOworICAgICAgICBhc3NlcnRUaGF0KGFjdHVhbElkKS5pc0VxdWFsVG8oZXhwZWN0ZWRJZCk7CisgICAgICAgIGZpbmFsIE15QXV0b2ZpbGxJZCBhY3R1YWxNeUlkID0gZGF0YS5nZXRQYXJjZWxhYmxlKCJteV9pZCIpOworICAgICAgICBhc3NlcnRUaGF0KGFjdHVhbE15SWQpLmlzRXF1YWxUbyhuZXcgTXlBdXRvZmlsbElkKGV4cGVjdGVkSWQpKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMjY5LDcgKzM3NSw2IEBACiAKICAgICAgICAgLy8gQ2FuY2VsIHNlc3Npb24uCiAgICAgICAgIG1BY3Rpdml0eS5nZXRBdXRvZmlsbE1hbmFnZXIoKS5jYW5jZWwoKTsKLSAgICAgICAgSGVscGVyLmFzc2VydE5vRGFuZ2xpbmdTZXNzaW9ucygpOwogCiAgICAgICAgIC8vIFRyaWdnZXIgc2F2ZS4KICAgICAgICAgbUFjdGl2aXR5LnN5bmNSdW5PblVpVGhyZWFkKCgpIC0+IHsKQEAgLTI3OCw3ICszODMsNyBAQAogICAgICAgICB9KTsKIAogICAgICAgICAvLyBBc3NlcnQgaXQncyBub3Qgc2hvd2luZy4KLSAgICAgICAgc1VpQm90LmFzc2VydFNhdmVOb3RTaG93aW5nKFNBVkVfREFUQV9UWVBFX0dFTkVSSUMpOworICAgICAgICBtVWlCb3QuYXNzZXJ0U2F2ZU5vdFNob3dpbmcoU0FWRV9EQVRBX1RZUEVfR0VORVJJQyk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTMwNSwyMCArNDEwLDYgQEAKICAgICAgICAgZGlzbWlzc1NhdmVUZXN0KERpc21pc3NUeXBlLkZPQ1VTX09VVFNJREUpOwogICAgIH0KIAotICAgIEBUZXN0Ci0gICAgQElnbm9yZSgiVGVzdCBmYWlsIG9uIHNvbWUgZGV2aWNlcyBiZWNhdXNlIFJlY2VudHMgVUkgaXMgbm90IHdlbGwgZGVmaW5lZDogYi83MjA0NDY4NSIpCi0gICAgcHVibGljIHZvaWQgdGVzdERpc21pc3NTYXZlX2J5VGFwcGluZ1JlY2VudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gTGF1bmNoZXMgYSBkaWZmZXJlbnQgYWN0aXZpdHkgZmlyc3QuCi0gICAgICAgIHN0YXJ0V2VsY29tZUFjdGl2aXR5T25OZXdUYXNrKCk7Ci0KLSAgICAgICAgLy8gVGhlbiBsYXVuY2hlcyB0aGUgbWFpbiBhY3Rpdml0eS4KLSAgICAgICAgc3RhcnRBY3Rpdml0eSh0cnVlKTsKLSAgICAgICAgc1VpQm90LmFzc2VydFNob3duQnlSZWxhdGl2ZUlkKElEX0lOUFVUKTsKLQotICAgICAgICAvLyBBbmQgZmluYWxseSB0ZXN0IGl0Li4KLSAgICAgICAgZGlzbWlzc1NhdmVUZXN0KERpc21pc3NUeXBlLlJFQ0VOVFNfQlVUVE9OKTsKLSAgICB9Ci0KICAgICBwcml2YXRlIHZvaWQgZGlzbWlzc1NhdmVUZXN0KERpc21pc3NUeXBlIGRpc21pc3NUeXBlKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gU2V0IHNlcnZpY2UuCiAgICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKQEAgLTMzOCwzMSArNDI5LDI3IEBACiAgICAgICAgICAgICBtQWN0aXZpdHkubUlucHV0LnNldFRleHQoIjEwOCIpOwogICAgICAgICAgICAgbUFjdGl2aXR5Lm1Db21taXQucGVyZm9ybUNsaWNrKCk7CiAgICAgICAgIH0pOwotICAgICAgICBzVWlCb3QuYXNzZXJ0U2F2ZVNob3dpbmcoU0FWRV9EQVRBX1RZUEVfR0VORVJJQyk7CisgICAgICAgIG1VaUJvdC5hc3NlcnRTYXZlU2hvd2luZyhTQVZFX0RBVEFfVFlQRV9HRU5FUklDKTsKIAogICAgICAgICAvLyBUaGVuIG1ha2Ugc3VyZSBpdCBnb2VzIGF3YXkgd2hlbiB1c2VyIGRvZXNuJ3Qgd2FudCBpdC4uCiAgICAgICAgIHN3aXRjaCAoZGlzbWlzc1R5cGUpIHsKICAgICAgICAgICAgIGNhc2UgQkFDS19CVVRUT046Ci0gICAgICAgICAgICAgICAgc1VpQm90LnByZXNzQmFjaygpOworICAgICAgICAgICAgICAgIG1VaUJvdC5wcmVzc0JhY2soKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgSE9NRV9CVVRUT046Ci0gICAgICAgICAgICAgICAgc1VpQm90LnByZXNzSG9tZSgpOworICAgICAgICAgICAgICAgIG1VaUJvdC5wcmVzc0hvbWUoKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgVE9VQ0hfT1VUU0lERToKLSAgICAgICAgICAgICAgICBzVWlCb3QuYXNzZXJ0U2hvd25CeVRleHQoVEVYVF9MQUJFTCkuY2xpY2soKTsKKyAgICAgICAgICAgICAgICBtVWlCb3QuYXNzZXJ0U2hvd25CeVRleHQoVEVYVF9MQUJFTCkuY2xpY2soKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgRk9DVVNfT1VUU0lERToKICAgICAgICAgICAgICAgICBtQWN0aXZpdHkuc3luY1J1bk9uVWlUaHJlYWQoKCkgLT4gbUFjdGl2aXR5Lm1MYWJlbC5yZXF1ZXN0Rm9jdXMoKSk7Ci0gICAgICAgICAgICAgICAgc1VpQm90LmFzc2VydFNob3duQnlUZXh0KFRFWFRfTEFCRUwpLmNsaWNrKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFJFQ0VOVFNfQlVUVE9OOgotICAgICAgICAgICAgICAgIHNVaUJvdC5zd2l0Y2hBcHBzVXNpbmdSZWNlbnRzKCk7Ci0gICAgICAgICAgICAgICAgV2VsY29tZUFjdGl2aXR5LmFzc2VydFNob3dpbmdEZWZhdWx0TWVzc2FnZShzVWlCb3QpOworICAgICAgICAgICAgICAgIG1VaUJvdC5hc3NlcnRTaG93bkJ5VGV4dChURVhUX0xBQkVMKS5jbGljaygpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIGRpc21pc3MgdHlwZTogIiArIGRpc21pc3NUeXBlKTsKICAgICAgICAgfQotICAgICAgICBzVWlCb3QuYXNzZXJ0U2F2ZU5vdFNob3dpbmcoU0FWRV9EQVRBX1RZUEVfR0VORVJJQyk7CisgICAgICAgIG1VaUJvdC5hc3NlcnRTYXZlTm90U2hvd2luZyhTQVZFX0RBVEFfVFlQRV9HRU5FUklDKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMzgxLDI1ICs0NjgsMjUgQEAKICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CiAKICAgICAgICAgLy8gVHJpZ2dlciBhdXRvZmlsbC4KLSAgICAgICAgc1VpQm90LmFzc2VydFNob3duQnlSZWxhdGl2ZUlkKElEX0lOUFVUKS5jbGljaygpOworICAgICAgICBtVWlCb3QuYXNzZXJ0U2hvd25CeVJlbGF0aXZlSWQoSURfSU5QVVQpLmNsaWNrKCk7CiAgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwotICAgICAgICBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoIllPIik7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cygiWU8iKTsKICAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlTaG93bkV2ZW50KG1BY3Rpdml0eS5tSW5wdXQpOwogCiAgICAgICAgIC8vIEdvIGhvbWUsIHlvdSBhcmUgZHJ1bmshCi0gICAgICAgIHNVaUJvdC5wcmVzc0hvbWUoKTsKLSAgICAgICAgc1VpQm90LmFzc2VydE5vRGF0YXNldHMoKTsKKyAgICAgICAgbVVpQm90LnByZXNzSG9tZSgpOworICAgICAgICBtVWlCb3QuYXNzZXJ0Tm9EYXRhc2V0cygpOwogICAgICAgICBjYWxsYmFjay5hc3NlcnRVaUhpZGRlbkV2ZW50KG1BY3Rpdml0eS5tSW5wdXQpOwogCiAgICAgICAgIC8vIFN3aXRjaCBiYWNrIHRvIHRoZSBhY3Rpdml0eS4KICAgICAgICAgcmVzdGFydEFjdGl2aXR5KCk7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnRTaG93bkJ5VGV4dChURVhUX0xBQkVMLCBIZWxwZXIuQUNUSVZJVFlfUkVTVVJSRUNUSU9OX01TKTsKLSAgICAgICAgZmluYWwgVWlPYmplY3QyIGRhdGFzZXRQaWNrZXIgPSBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoIllPIik7CisgICAgICAgIG1VaUJvdC5hc3NlcnRTaG93bkJ5VGV4dChURVhUX0xBQkVMLCBUaW1lb3V0cy5BQ1RJVklUWV9SRVNVUlJFQ1RJT04pOworICAgICAgICBmaW5hbCBVaU9iamVjdDIgZGF0YXNldFBpY2tlciA9IG1VaUJvdC5hc3NlcnREYXRhc2V0cygiWU8iKTsKICAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlTaG93bkV2ZW50KG1BY3Rpdml0eS5tSW5wdXQpOwogCiAgICAgICAgIC8vIE5vdyBhdXRvZmlsbCBpdC4KICAgICAgICAgZmluYWwgRmlsbEV4cGVjdGF0aW9uIGF1dG9maWxsRXhwZWNhdGlvbiA9IG1BY3Rpdml0eS5leHBlY3RBdXRvRmlsbCgiaWQiLCAicGFzcyIpOwotICAgICAgICBzVWlCb3Quc2VsZWN0RGF0YXNldChkYXRhc2V0UGlja2VyLCAiWU8iKTsKKyAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQoZGF0YXNldFBpY2tlciwgIllPIik7CiAgICAgICAgIGF1dG9maWxsRXhwZWNhdGlvbi5hc3NlcnRBdXRvRmlsbGVkKCk7CiAgICAgfQogCkBAIC00MTYsMTkgKzUwMywxOCBAQAogICAgICAgICAvLyBUcmlnZ2VyIGF1dG9maWxsLgogICAgICAgICBtQWN0aXZpdHkuc3luY1J1bk9uVWlUaHJlYWQoKCkgLT4gbUFjdGl2aXR5Lm1JbnB1dC5yZXF1ZXN0Rm9jdXMoKSk7CiAgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwotICAgICAgICBzVWlCb3QuYXNzZXJ0Tm9EYXRhc2V0cygpOworICAgICAgICBtVWlCb3QuYXNzZXJ0Tm9EYXRhc2V0c0V2ZXIoKTsKIAogICAgICAgICAvLyBUcmlnZ2VyIHNhdmUsIGJ1dCBkb24ndCB0YXAgaXQuCiAgICAgICAgIG1BY3Rpdml0eS5zeW5jUnVuT25VaVRocmVhZCgoKSAtPiB7CiAgICAgICAgICAgICBtQWN0aXZpdHkubUlucHV0LnNldFRleHQoIjEwOCIpOwogICAgICAgICAgICAgbUFjdGl2aXR5Lm1Db21taXQucGVyZm9ybUNsaWNrKCk7CiAgICAgICAgIH0pOwotICAgICAgICBzVWlCb3QuYXNzZXJ0U2F2ZVNob3dpbmcoU0FWRV9EQVRBX1RZUEVfR0VORVJJQyk7CisgICAgICAgIG1VaUJvdC5hc3NlcnRTYXZlU2hvd2luZyhTQVZFX0RBVEFfVFlQRV9HRU5FUklDKTsKIAogICAgICAgICAvLyBHbyBob21lLCB5b3UgYXJlIGRydW5rIQotICAgICAgICBzVWlCb3QucHJlc3NIb21lKCk7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnRTYXZlTm90U2hvd2luZyhTQVZFX0RBVEFfVFlQRV9HRU5FUklDKTsKLSAgICAgICAgSGVscGVyLmFzc2VydE5vRGFuZ2xpbmdTZXNzaW9ucygpOworICAgICAgICBtVWlCb3QucHJlc3NIb21lKCk7CisgICAgICAgIG1VaUJvdC5hc3NlcnRTYXZlTm90U2hvd2luZyhTQVZFX0RBVEFfVFlQRV9HRU5FUklDKTsKIAogICAgICAgICAvLyBQcmVwYXJlIHRoZSByZXNwb25zZSBmb3IgdGhlIG5leHQgc2Vzc2lvbiwgd2hpY2ggd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHRyaWdnZXJlZAogICAgICAgICAvLyB3aGVuIHRoZSBhY3Rpdml0eSBpcyBicm91Z2h0IGJhY2suCkBAIC00NDMsMjggKzUyOSwyMCBAQAogCiAgICAgICAgIC8vIFN3aXRjaCBiYWNrIHRvIHRoZSBhY3Rpdml0eS4KICAgICAgICAgcmVzdGFydEFjdGl2aXR5KCk7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnRTaG93bkJ5VGV4dChURVhUX0xBQkVMLCBIZWxwZXIuQUNUSVZJVFlfUkVTVVJSRUNUSU9OX01TKTsKLSAgICAgICAgc1VpQm90LmFzc2VydFNhdmVOb3RTaG93aW5nKFNBVkVfREFUQV9UWVBFX0dFTkVSSUMpOworICAgICAgICBtVWlCb3QuYXNzZXJ0U2hvd25CeVRleHQoVEVYVF9MQUJFTCwgVGltZW91dHMuQUNUSVZJVFlfUkVTVVJSRUNUSU9OKTsKKyAgICAgICAgbVVpQm90LmFzc2VydFNhdmVOb3RTaG93aW5nKFNBVkVfREFUQV9UWVBFX0dFTkVSSUMpOwogICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKLSAgICAgICAgc1VpQm90LmFzc2VydE5vRGF0YXNldHMoKTsKKyAgICAgICAgbVVpQm90LmFzc2VydE5vRGF0YXNldHNFdmVyKCk7CiAKICAgICAgICAgLy8gVHJpZ2dlciBhbmQgc2VsZWN0IFVJLgogICAgICAgICBtQWN0aXZpdHkuc3luY1J1bk9uVWlUaHJlYWQoKCkgLT4gbUFjdGl2aXR5Lm1QYXNzd29yZC5yZXF1ZXN0Rm9jdXMoKSk7CiAgICAgICAgIGZpbmFsIEZpbGxFeHBlY3RhdGlvbiBhdXRvZmlsbEV4cGVjYXRpb24gPSBtQWN0aXZpdHkuZXhwZWN0QXV0b0ZpbGwoImlkIiwgInBhc3MiKTsKLSAgICAgICAgc1VpQm90LnNlbGVjdERhdGFzZXQoIllPIik7CisgICAgICAgIG1VaUJvdC5zZWxlY3REYXRhc2V0KCJZTyIpOwogCiAgICAgICAgIC8vIEFzc2VydCBpdC4KICAgICAgICAgYXV0b2ZpbGxFeHBlY2F0aW9uLmFzc2VydEF1dG9GaWxsZWQoKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgc3RhcnRXZWxjb21lQWN0aXZpdHlPbk5ld1Rhc2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQobUNvbnRleHQsIFdlbGNvbWVBY3Rpdml0eS5jbGFzcyk7Ci0gICAgICAgIGludGVudC5zZXRGbGFncygKLSAgICAgICAgICAgICAgICBJbnRlbnQuRkxBR19BQ1RJVklUWV9SRVRBSU5fSU5fUkVDRU5UUyB8IEludGVudC5GTEFHX0FDVElWSVRZX05FV19ET0NVTUVOVCk7Ci0gICAgICAgIG1Db250ZXh0LnN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKLSAgICAgICAgV2VsY29tZUFjdGl2aXR5LmFzc2VydFNob3dpbmdEZWZhdWx0TWVzc2FnZShzVWlCb3QpOwotICAgIH0KLQogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNhdmVVaVJlc3RvcmVkQWZ0ZXJUYXBwaW5nTGlua1Rlc3QoUG9zdFNhdmVMaW5rVGFwcGVkQWN0aW9uIHR5cGUpCiAgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTQ5NCw4ICs1NzIsOCBAQAogICAgICAgICB0YXBTYXZlVWlMaW5rKHNhdmVVaSk7CiAKICAgICAgICAgLy8gTWFrZSBzdXJlIG5ldyBhY3Rpdml0eSBpcyBzaG93bi4uLgotICAgICAgICBXZWxjb21lQWN0aXZpdHkuYXNzZXJ0U2hvd2luZ0RlZmF1bHRNZXNzYWdlKHNVaUJvdCk7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnRTYXZlTm90U2hvd2luZyhTQVZFX0RBVEFfVFlQRV9HRU5FUklDKTsKKyAgICAgICAgV2VsY29tZUFjdGl2aXR5LmFzc2VydFNob3dpbmdEZWZhdWx0TWVzc2FnZShtVWlCb3QpOworICAgICAgICBtVWlCb3QuYXNzZXJ0U2F2ZU5vdFNob3dpbmcoU0FWRV9EQVRBX1RZUEVfR0VORVJJQyk7CiAKICAgICAgICAgLy8gLi4gdGhlbiBkbyBzb21ldGhpbmcgdG8gcmV0dXJuIHRvIHByZXZpb3VzIGFjdGl2aXR5Li4uCiAgICAgICAgIHN3aXRjaCAodHlwZSkgewpAQCAtNTAzLDI1ICs1ODEsMjYgQEAKICAgICAgICAgICAgICAgICAvLyBBZnRlciB0aGUgZGV2aWNlIHJvdGF0ZXMsIHRoZSBpbnB1dCBmaWVsZCBnZXQgZm9jdXMgYW5kIGdlbmVyYXRlIGEgbmV3IHNlc3Npb24uCiAgICAgICAgICAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UoQ2FubmVkRmlsbFJlc3BvbnNlLk5PX1JFU1BPTlNFKTsKIAotICAgICAgICAgICAgICAgIHNVaUJvdC5zZXRTY3JlZW5PcmllbnRhdGlvbihVaUJvdC5MQU5EU0NBUEUpOworICAgICAgICAgICAgICAgIG1VaUJvdC5zZXRTY3JlZW5PcmllbnRhdGlvbihVaUJvdC5MQU5EU0NBUEUpOworICAgICAgICAgICAgICAgIFdlbGNvbWVBY3Rpdml0eS5hc3NlcnRTaG93aW5nRGVmYXVsdE1lc3NhZ2UobVVpQm90KTsKICAgICAgICAgICAgICAgICAvLyBub3QgYnJlYWtpbmcgb24gcHVycG9zZQogICAgICAgICAgICAgY2FzZSBUQVBfQkFDS19CVVRUT046CiAgICAgICAgICAgICAgICAgLy8gLi50aGVuIGdvIGJhY2sgYW5kIHNhdmUgaXQuCi0gICAgICAgICAgICAgICAgc1VpQm90LnByZXNzQmFjaygpOworICAgICAgICAgICAgICAgIG1VaUJvdC5wcmVzc0JhY2soKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgRklOSVNIX0FDVElWSVRZOgogICAgICAgICAgICAgICAgIC8vIC4udGhlbiBmaW5pc2hlcyBpdC4KLSAgICAgICAgICAgICAgICBXZWxjb21lQWN0aXZpdHkuZmluaXNoSXQoKTsKKyAgICAgICAgICAgICAgICBXZWxjb21lQWN0aXZpdHkuZmluaXNoSXQobVVpQm90KTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCB0eXBlOiAiICsgdHlwZSk7CiAgICAgICAgIH0KICAgICAgICAgLy8gTWFrZSBzdXJlIHByZXZpb3VzIGFjdGl2aXR5IGlzIGJhY2suLi4KLSAgICAgICAgc1VpQm90LmFzc2VydFNob3duQnlSZWxhdGl2ZUlkKElEX0lOUFVUKTsKKyAgICAgICAgbVVpQm90LmFzc2VydFNob3duQnlSZWxhdGl2ZUlkKElEX0lOUFVUKTsKIAogICAgICAgICAvLyAuLi4gYW5kIHRhcCBzYXZlLgogICAgICAgICBmaW5hbCBVaU9iamVjdDIgbmV3U2F2ZVVpID0gYXNzZXJ0U2F2ZVVpV2l0aExpbmtJc1Nob3duKFNBVkVfREFUQV9UWVBFX0dFTkVSSUMpOwotICAgICAgICBzVWlCb3Quc2F2ZUZvckF1dG9maWxsKG5ld1NhdmVVaSwgdHJ1ZSk7CisgICAgICAgIG1VaUJvdC5zYXZlRm9yQXV0b2ZpbGwobmV3U2F2ZVVpLCB0cnVlKTsKIAogICAgICAgICBmaW5hbCBTYXZlUmVxdWVzdCBzYXZlUmVxdWVzdCA9IHNSZXBsaWVyLmdldE5leHRTYXZlUmVxdWVzdCgpOwogICAgICAgICBhc3NlcnRUZXh0QW5kVmFsdWUoZmluZE5vZGVCeVJlc291cmNlSWQoc2F2ZVJlcXVlc3Quc3RydWN0dXJlLCBJRF9JTlBVVCksICIxMDgiKTsKQEAgLTU2MiwzOCArNjQxLDM0IEBACiAgICAgICAgIHRhcFNhdmVVaUxpbmsoc2F2ZVVpKTsKIAogICAgICAgICAvLyBNYWtlIHN1cmUgbmV3IGFjdGl2aXR5IGlzIHNob3duLgotICAgICAgICBXZWxjb21lQWN0aXZpdHkuYXNzZXJ0U2hvd2luZ0RlZmF1bHRNZXNzYWdlKHNVaUJvdCk7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnRTYXZlTm90U2hvd2luZyhTQVZFX0RBVEFfVFlQRV9HRU5FUklDKTsKKyAgICAgICAgV2VsY29tZUFjdGl2aXR5LmFzc2VydFNob3dpbmdEZWZhdWx0TWVzc2FnZShtVWlCb3QpOworICAgICAgICBtVWlCb3QuYXNzZXJ0U2F2ZU5vdFNob3dpbmcoU0FWRV9EQVRBX1RZUEVfR0VORVJJQyk7CiAKICAgICAgICAgLy8gVGFwIGJhY2sgdG8gcmVzdG9yZSB0aGUgU2F2ZSBVSS4uLgotICAgICAgICBzVWlCb3QucHJlc3NCYWNrKCk7CisgICAgICAgIG1VaUJvdC5wcmVzc0JhY2soKTsKICAgICAgICAgLy8gTWFrZSBzdXJlIHByZXZpb3VzIGFjdGl2aXR5IGlzIGJhY2suLi4KLSAgICAgICAgc1VpQm90LmFzc2VydFNob3duQnlSZWxhdGl2ZUlkKElEX0xBQkVMKTsKKyAgICAgICAgbVVpQm90LmFzc2VydFNob3duQnlSZWxhdGl2ZUlkKElEX0xBQkVMKTsKIAogICAgICAgICAvLyAuLi5idXQgZG9uJ3QgdGFwIGl0Li4uCi0gICAgICAgIGZpbmFsIFVpT2JqZWN0MiBzYXZlVWkyID0gc1VpQm90LmFzc2VydFNhdmVTaG93aW5nKFNBVkVfREFUQV9UWVBFX0dFTkVSSUMpOworICAgICAgICBmaW5hbCBVaU9iamVjdDIgc2F2ZVVpMiA9IG1VaUJvdC5hc3NlcnRTYXZlU2hvd2luZyhTQVZFX0RBVEFfVFlQRV9HRU5FUklDKTsKIAogICAgICAgICAvLyAuLi5pbnN0ZWFkLCBkbyBzb21ldGhpbmcgdG8gZGlzbWlzcyBpdDoKICAgICAgICAgc3dpdGNoIChhY3Rpb24pIHsKICAgICAgICAgICAgIGNhc2UgVE9VQ0hfT1VUU0lERToKLSAgICAgICAgICAgICAgICBzVWlCb3QuYXNzZXJ0U2hvd25CeVJlbGF0aXZlSWQoSURfTEFCRUwpLmxvbmdDbGljaygpOworICAgICAgICAgICAgICAgIG1VaUJvdC5hc3NlcnRTaG93bkJ5UmVsYXRpdmVJZChJRF9MQUJFTCkubG9uZ0NsaWNrKCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFRBUF9OT19PTl9TQVZFX1VJOgotICAgICAgICAgICAgICAgIHNVaUJvdC5zYXZlRm9yQXV0b2ZpbGwoc2F2ZVVpMiwgZmFsc2UpOworICAgICAgICAgICAgICAgIG1VaUJvdC5zYXZlRm9yQXV0b2ZpbGwoc2F2ZVVpMiwgZmFsc2UpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBUQVBfWUVTX09OX1NBVkVfVUk6Ci0gICAgICAgICAgICAgICAgc1VpQm90LnNhdmVGb3JBdXRvZmlsbCh0cnVlLCBTQVZFX0RBVEFfVFlQRV9HRU5FUklDKTsKKyAgICAgICAgICAgICAgICBtVWlCb3Quc2F2ZUZvckF1dG9maWxsKHRydWUsIFNBVkVfREFUQV9UWVBFX0dFTkVSSUMpOwogICAgICAgICAgICAgICAgIGZpbmFsIFNhdmVSZXF1ZXN0IHNhdmVSZXF1ZXN0ID0gc1JlcGxpZXIuZ2V0TmV4dFNhdmVSZXF1ZXN0KCk7CiAgICAgICAgICAgICAgICAgYXNzZXJ0VGV4dEFuZFZhbHVlKGZpbmROb2RlQnlSZXNvdXJjZUlkKHNhdmVSZXF1ZXN0LnN0cnVjdHVyZSwgSURfSU5QVVQpLCAiMTA4Iik7Ci0gICAgICAgICAgICAgICAgSGVscGVyLmFzc2VydE5vRGFuZ2xpbmdTZXNzaW9ucygpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIGFjdGlvbjogIiArIGFjdGlvbik7CiAgICAgICAgIH0KLSAgICAgICAgc1VpQm90LmFzc2VydFNhdmVOb3RTaG93aW5nKFNBVkVfREFUQV9UWVBFX0dFTkVSSUMpOwotCi0gICAgICAgIC8vIE1ha2Ugc3VyZSBwcmV2aW91cyBzZXNzaW9uIHdhcyBmaW5pc2hlZC4KLSAgICAgICAgSGVscGVyLmFzc2VydE5vRGFuZ2xpbmdTZXNzaW9ucygpOworICAgICAgICBtVWlCb3QuYXNzZXJ0U2F2ZU5vdFNob3dpbmcoU0FWRV9EQVRBX1RZUEVfR0VORVJJQyk7CiAKICAgICAgICAgLy8gTm93IHRyaWdnZXJzIGEgbmV3IHNlc3Npb24gYW5kIGRvIGJ1c2luZXNzIGFzIHVzdWFsLi4uCiAgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpCkBAIC02MTcsNyArNjkyLDcgQEAKICAgICAgICAgfSk7CiAKICAgICAgICAgLy8gU2F2ZSBpdC4uLgotICAgICAgICBzVWlCb3Quc2F2ZUZvckF1dG9maWxsKHRydWUsIFNBVkVfREFUQV9UWVBFX0dFTkVSSUMpOworICAgICAgICBtVWlCb3Quc2F2ZUZvckF1dG9maWxsKHRydWUsIFNBVkVfREFUQV9UWVBFX0dFTkVSSUMpOwogCiAgICAgICAgIC8vIC4uLiBhbmQgYXNzZXJ0IHJlc3VsdHMKICAgICAgICAgZmluYWwgU2F2ZVJlcXVlc3Qgc2F2ZVJlcXVlc3QgPSBzUmVwbGllci5nZXROZXh0U2F2ZVJlcXVlc3QoKTsKQEAgLTYyNyw3ICs3MDIsNyBAQAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNhdmVVaUNhbmNlbGxlZEFmdGVyVGFwcGluZ0xpbmtUZXN0KFBvc3RTYXZlTGlua1RhcHBlZEFjdGlvbiB0eXBlKQogICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN0YXJ0QWN0aXZpdHkodHlwZSA9PSBQb3N0U2F2ZUxpbmtUYXBwZWRBY3Rpb24uVEFQX1JFQ0VOVFMpOworICAgICAgICBzdGFydEFjdGl2aXR5KGZhbHNlKTsKICAgICAgICAgLy8gU2V0IHNlcnZpY2UuCiAgICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKIApAQCAtNjUyLDMwICs3MjcsODYgQEAKICAgICAgICAgLy8gVGFwIHRoZSBsaW5rLgogICAgICAgICB0YXBTYXZlVWlMaW5rKHNhdmVVaSk7CiAgICAgICAgIC8vIE1ha2Ugc3VyZSBuZXcgYWN0aXZpdHkgaXMgc2hvd24uLi4KLSAgICAgICAgV2VsY29tZUFjdGl2aXR5LmFzc2VydFNob3dpbmdEZWZhdWx0TWVzc2FnZShzVWlCb3QpOwotICAgICAgICBzVWlCb3QuYXNzZXJ0U2F2ZU5vdFNob3dpbmcoU0FWRV9EQVRBX1RZUEVfR0VORVJJQyk7CisgICAgICAgIFdlbGNvbWVBY3Rpdml0eS5hc3NlcnRTaG93aW5nRGVmYXVsdE1lc3NhZ2UobVVpQm90KTsKKyAgICAgICAgbVVpQm90LmFzc2VydFNhdmVOb3RTaG93aW5nKFNBVkVfREFUQV9UWVBFX0dFTkVSSUMpOwogCiAgICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICAgICAgY2FzZSBUQVBfUkVDRU5UUzoKLSAgICAgICAgICAgICAgICBzVWlCb3Quc3dpdGNoQXBwc1VzaW5nUmVjZW50cygpOwotICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBMQVVOQ0hfUFJFVklPVVNfQUNUSVZJVFk6Ci0gICAgICAgICAgICAgICAgc3RhcnRBY3Rpdml0eShTaW1wbGVTYXZlQWN0aXZpdHkuY2xhc3MpOworICAgICAgICAgICAgICAgIHN0YXJ0QWN0aXZpdHlPbk5ld1Rhc2soU2ltcGxlU2F2ZUFjdGl2aXR5LmNsYXNzKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgTEFVTkNIX05FV19BQ1RJVklUWToKICAgICAgICAgICAgICAgICAvLyBMYXVuY2ggYSAzcmQgYWN0aXZpdHkuLi4KLSAgICAgICAgICAgICAgICBzdGFydEFjdGl2aXR5KExvZ2luQWN0aXZpdHkuY2xhc3MpOwotICAgICAgICAgICAgICAgIHNVaUJvdC5hc3NlcnRTaG93bkJ5UmVsYXRpdmVJZChJRF9VU0VSTkFNRV9DT05UQUlORVIpOworICAgICAgICAgICAgICAgIHN0YXJ0QWN0aXZpdHlPbk5ld1Rhc2soTG9naW5BY3Rpdml0eS5jbGFzcyk7CisgICAgICAgICAgICAgICAgbVVpQm90LmFzc2VydFNob3duQnlSZWxhdGl2ZUlkKElEX1VTRVJOQU1FX0NPTlRBSU5FUik7CiAgICAgICAgICAgICAgICAgLy8gLi4udGhlbiBnbyBiYWNrCi0gICAgICAgICAgICAgICAgc1VpQm90LnByZXNzQmFjaygpOworICAgICAgICAgICAgICAgIG1VaUJvdC5wcmVzc0JhY2soKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCB0eXBlOiAiICsgdHlwZSk7CiAgICAgICAgIH0KICAgICAgICAgLy8gTWFrZSBzdXJlIHJpZ2h0IGFjdGl2aXR5IGlzIHNob3dpbmcKLSAgICAgICAgc1VpQm90LmFzc2VydFNob3duQnlSZWxhdGl2ZUlkKElEX0lOUFVUKTsKKyAgICAgICAgbVVpQm90LmFzc2VydFNob3duQnlSZWxhdGl2ZUlkKElEX0lOUFVULCBUaW1lb3V0cy5BQ1RJVklUWV9SRVNVUlJFQ1RJT04pOwogCi0gICAgICAgIHNVaUJvdC5hc3NlcnRTYXZlTm90U2hvd2luZyhTQVZFX0RBVEFfVFlQRV9HRU5FUklDKTsKKyAgICAgICAgbVVpQm90LmFzc2VydFNhdmVOb3RTaG93aW5nKFNBVkVfREFUQV9UWVBFX0dFTkVSSUMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgQEFwcE1vZGVGdWxsIC8vIFNlcnZpY2Utc3BlY2lmaWMgdGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZWxlY3RlZERhdGFzZXRzQXJlU2VudE9uU2F2ZVJlcXVlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3RhcnRBY3Rpdml0eSgpOworCisgICAgICAgIC8vIFNldCBzZXJ2aWNlLgorICAgICAgICBlbmFibGVTZXJ2aWNlKCk7CisKKyAgICAgICAgLy8gU2V0IGV4cGVjdGF0aW9ucy4KKyAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UobmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0UmVxdWlyZWRTYXZhYmxlSWRzKFNBVkVfREFUQV9UWVBFX0dFTkVSSUMsIElEX0lOUFVULCBJRF9QQVNTV09SRCkKKyAgICAgICAgICAgICAgICAvLyBBZGRlZCBvbiByZXZlcnNlZCBvcmRlciBvbiBwdXJwb3NlCisgICAgICAgICAgICAgICAgLmFkZERhdGFzZXQobmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0SWQoIkQyIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9JTlBVVCwgImlkIGFnYWluIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9QQVNTV09SRCwgInBhc3MiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oIkQyIikpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuYWRkRGF0YXNldChuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJZCgiRDEiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0lOUFVULCAiaWQiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oIkQxIikpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gVHJpZ2dlciBhdXRvZmlsbC4KKyAgICAgICAgbUFjdGl2aXR5LnN5bmNSdW5PblVpVGhyZWFkKCgpIC0+IG1BY3Rpdml0eS5tSW5wdXQucmVxdWVzdEZvY3VzKCkpOworICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKKworICAgICAgICAvLyBTZWxlY3QgMXN0IGRhdGFzZXQuCisgICAgICAgIGZpbmFsIEZpbGxFeHBlY3RhdGlvbiBhdXRvZmlsbEV4cGVjYXRpb24xID0gbUFjdGl2aXR5LmV4cGVjdEF1dG9GaWxsKCJpZCIpOworICAgICAgICBmaW5hbCBVaU9iamVjdDIgcGlja2VyMSA9IG1VaUJvdC5hc3NlcnREYXRhc2V0cygiRDIiLCAiRDEiKTsKKyAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQocGlja2VyMSwgIkQxIik7CisgICAgICAgIGF1dG9maWxsRXhwZWNhdGlvbjEuYXNzZXJ0QXV0b0ZpbGxlZCgpOworCisgICAgICAgIC8vIFNlbGVjdCAybmQgZGF0YXNldC4KKyAgICAgICAgbUFjdGl2aXR5LnN5bmNSdW5PblVpVGhyZWFkKCgpIC0+IG1BY3Rpdml0eS5tUGFzc3dvcmQucmVxdWVzdEZvY3VzKCkpOworICAgICAgICBmaW5hbCBGaWxsRXhwZWN0YXRpb24gYXV0b2ZpbGxFeHBlY2F0aW9uMiA9IG1BY3Rpdml0eS5leHBlY3RBdXRvRmlsbCgiaWQgYWdhaW4iLCAicGFzcyIpOworICAgICAgICBmaW5hbCBVaU9iamVjdDIgcGlja2VyMiA9IG1VaUJvdC5hc3NlcnREYXRhc2V0cygiRDIiKTsKKyAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQocGlja2VyMiwgIkQyIik7CisgICAgICAgIGF1dG9maWxsRXhwZWNhdGlvbjIuYXNzZXJ0QXV0b0ZpbGxlZCgpOworCisgICAgICAgIG1BY3Rpdml0eS5zeW5jUnVuT25VaVRocmVhZCgoKSAtPiB7CisgICAgICAgICAgICBtQWN0aXZpdHkubUlucHV0LnNldFRleHQoIklEIik7CisgICAgICAgICAgICBtQWN0aXZpdHkubVBhc3N3b3JkLnNldFRleHQoIlBBU1MiKTsKKyAgICAgICAgICAgIG1BY3Rpdml0eS5tQ29tbWl0LnBlcmZvcm1DbGljaygpOworICAgICAgICB9KTsKKyAgICAgICAgZmluYWwgVWlPYmplY3QyIHNhdmVVaSA9IG1VaUJvdC5hc3NlcnRTYXZlU2hvd2luZyhTQVZFX0RBVEFfVFlQRV9HRU5FUklDKTsKKworICAgICAgICAvLyBTYXZlIGl0Li4uCisgICAgICAgIG1VaUJvdC5zYXZlRm9yQXV0b2ZpbGwoc2F2ZVVpLCB0cnVlKTsKKworICAgICAgICAvLyAuLi4gYW5kIGFzc2VydCByZXN1bHRzCisgICAgICAgIGZpbmFsIFNhdmVSZXF1ZXN0IHNhdmVSZXF1ZXN0ID0gc1JlcGxpZXIuZ2V0TmV4dFNhdmVSZXF1ZXN0KCk7CisgICAgICAgIGFzc2VydFRleHRBbmRWYWx1ZShmaW5kTm9kZUJ5UmVzb3VyY2VJZChzYXZlUmVxdWVzdC5zdHJ1Y3R1cmUsIElEX0lOUFVUKSwgIklEIik7CisgICAgICAgIGFzc2VydFRleHRBbmRWYWx1ZShmaW5kTm9kZUJ5UmVzb3VyY2VJZChzYXZlUmVxdWVzdC5zdHJ1Y3R1cmUsIElEX1BBU1NXT1JEKSwgIlBBU1MiKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzYXZlUmVxdWVzdC5kYXRhc2V0SWRzKS5jb250YWluc0V4YWN0bHkoIkQxIiwgIkQyIikuaW5PcmRlcigpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtNzExLDE0ICs4NDIsMTYgQEAKICAgICAgICAgdGFwU2F2ZVVpTGluayhzYXZlVWkpOwogCiAgICAgICAgIC8vIE1ha2Ugc3VyZSBuZXcgYWN0aXZpdHkgaXMgc2hvd24uLi4KLSAgICAgICAgV2VsY29tZUFjdGl2aXR5LmFzc2VydFNob3dpbmdEZWZhdWx0TWVzc2FnZShzVWlCb3QpOworICAgICAgICBXZWxjb21lQWN0aXZpdHkuYXNzZXJ0U2hvd2luZ0RlZmF1bHRNZXNzYWdlKG1VaUJvdCk7CiAKICAgICAgICAgLy8gU2F2ZSBVSSBzaG91bGQgYmUgc2hvd2luZyBhcyB3ZWxsLCBzaW5jZSBUcmFtcG9saW5lIGZpbmlzaGVkLgotICAgICAgICBzVWlCb3QuYXNzZXJ0U2F2ZVNob3dpbmcoU0FWRV9EQVRBX1RZUEVfR0VORVJJQyk7CisgICAgICAgIG1VaUJvdC5hc3NlcnRTYXZlU2hvd2luZyhTQVZFX0RBVEFfVFlQRV9HRU5FUklDKTsKIAorICAgICAgICAvLyBEaXNtaXNzIFNhdmUgRGlhbG9nCisgICAgICAgIG1VaUJvdC5wcmVzc0JhY2soKTsKICAgICAgICAgLy8gR28gYmFjayBhbmQgbWFrZSBzdXJlIGl0J3Mgc2hvd2luZyB0aGUgcmlnaHQgYWN0aXZpdHkuCi0gICAgICAgIHNVaUJvdC5wcmVzc0JhY2soKTsKLSAgICAgICAgc1VpQm90LmFzc2VydFNob3duQnlSZWxhdGl2ZUlkKElEX0xBQkVMKTsKKyAgICAgICAgbVVpQm90LnByZXNzQmFjaygpOworICAgICAgICBtVWlCb3QuYXNzZXJ0U2hvd25CeVJlbGF0aXZlSWQoSURfTEFCRUwpOwogCiAgICAgICAgIC8vIE5vdyBzdGFydCBhIG5ldyBzZXNzaW9uLgogICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKQpAQCAtNzMwLDkgKzg2MywzODYgQEAKICAgICAgICAgICAgIG1BY3Rpdml0eS5tUGFzc3dvcmQuc2V0VGV4dCgiNDIiKTsKICAgICAgICAgICAgIG1BY3Rpdml0eS5tQ29tbWl0LnBlcmZvcm1DbGljaygpOwogICAgICAgICB9KTsKLSAgICAgICAgc1VpQm90LnNhdmVGb3JBdXRvZmlsbCh0cnVlLCBTQVZFX0RBVEFfVFlQRV9QQVNTV09SRCk7CisgICAgICAgIG1VaUJvdC5zYXZlRm9yQXV0b2ZpbGwodHJ1ZSwgU0FWRV9EQVRBX1RZUEVfUEFTU1dPUkQpOwogICAgICAgICBmaW5hbCBTYXZlUmVxdWVzdCBzYXZlUmVxdWVzdCA9IHNSZXBsaWVyLmdldE5leHRTYXZlUmVxdWVzdCgpOwogICAgICAgICBhc3NlcnRUZXh0QW5kVmFsdWUoZmluZE5vZGVCeVJlc291cmNlSWQoc2F2ZVJlcXVlc3Quc3RydWN0dXJlLCBJRF9JTlBVVCksICIxMDgiKTsKICAgICAgICAgYXNzZXJ0VGV4dEFuZFZhbHVlKGZpbmROb2RlQnlSZXNvdXJjZUlkKHNhdmVSZXF1ZXN0LnN0cnVjdHVyZSwgSURfUEFTU1dPUkQpLCAiNDIiKTsKICAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTYW5pdGl6ZU9uU2F2ZVdoZW5BcHBDaGFuZ2VWYWx1ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3RhcnRBY3Rpdml0eSgpOworCisgICAgICAgIC8vIFNldCBsaXN0ZW5lcnMgdGhhdCB3aWxsIGNoYW5nZSB0aGUgc2F2ZWQgdmFsdWUKKyAgICAgICAgbmV3IEFudGlUcmltbWVyVGV4dFdhdGNoZXIobUFjdGl2aXR5Lm1JbnB1dCk7CisgICAgICAgIG5ldyBBbnRpVHJpbW1lclRleHRXYXRjaGVyKG1BY3Rpdml0eS5tUGFzc3dvcmQpOworCisgICAgICAgIC8vIFNldCBzZXJ2aWNlLgorICAgICAgICBlbmFibGVTZXJ2aWNlKCk7CisKKyAgICAgICAgLy8gU2V0IGV4cGVjdGF0aW9ucy4KKyAgICAgICAgZmluYWwgQXV0b2ZpbGxJZCBpbnB1dElkID0gbUFjdGl2aXR5Lm1JbnB1dC5nZXRBdXRvZmlsbElkKCk7CisgICAgICAgIGZpbmFsIEF1dG9maWxsSWQgcGFzc3dvcmRJZCA9IG1BY3Rpdml0eS5tUGFzc3dvcmQuZ2V0QXV0b2ZpbGxJZCgpOworICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRSZXF1aXJlZFNhdmFibGVJZHMoU0FWRV9EQVRBX1RZUEVfR0VORVJJQywgSURfSU5QVVQpCisgICAgICAgICAgICAgICAgLmFkZFNhbml0aXplcihuZXcgVGV4dFZhbHVlU2FuaXRpemVyKFRSSU1NRVJfUEFUVEVSTiwgIiQxIiksIGlucHV0SWQsIHBhc3N3b3JkSWQpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIC8vIFRyaWdnZXIgYXV0b2ZpbGwuCisgICAgICAgIG1BY3Rpdml0eS5zeW5jUnVuT25VaVRocmVhZCgoKSAtPiBtQWN0aXZpdHkubUlucHV0LnJlcXVlc3RGb2N1cygpKTsKKyAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CisgICAgICAgIEhlbHBlci5hc3NlcnRIYXNTZXNzaW9ucyhtUGFja2FnZU5hbWUpOworCisgICAgICAgIC8vIFRyaWdnZXIgc2F2ZS4KKyAgICAgICAgbUFjdGl2aXR5LnN5bmNSdW5PblVpVGhyZWFkKCgpIC0+IHsKKyAgICAgICAgICAgIG1BY3Rpdml0eS5tSW5wdXQuc2V0VGV4dCgiaWQiKTsKKyAgICAgICAgICAgIG1BY3Rpdml0eS5tUGFzc3dvcmQuc2V0VGV4dCgicGFzcyIpOworICAgICAgICAgICAgbUFjdGl2aXR5Lm1Db21taXQucGVyZm9ybUNsaWNrKCk7CisgICAgICAgIH0pOworCisgICAgICAgIC8vIFNhdmUgaXQuLi4KKyAgICAgICAgbVVpQm90LnNhdmVGb3JBdXRvZmlsbCh0cnVlLCBTQVZFX0RBVEFfVFlQRV9HRU5FUklDKTsKKworICAgICAgICAvLyAuLi4gYW5kIGFzc2VydCByZXN1bHRzCisgICAgICAgIGZpbmFsIFNhdmVSZXF1ZXN0IHNhdmVSZXF1ZXN0ID0gc1JlcGxpZXIuZ2V0TmV4dFNhdmVSZXF1ZXN0KCk7CisgICAgICAgIGFzc2VydFRleHRWYWx1ZShmaW5kTm9kZUJ5UmVzb3VyY2VJZChzYXZlUmVxdWVzdC5zdHJ1Y3R1cmUsIElEX0lOUFVUKSwgImlkIik7CisgICAgICAgIGFzc2VydFRleHRWYWx1ZShmaW5kTm9kZUJ5UmVzb3VyY2VJZChzYXZlUmVxdWVzdC5zdHJ1Y3R1cmUsIElEX1BBU1NXT1JEKSwgInBhc3MiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBBcHBNb2RlRnVsbCAvLyB0ZXN0U2FuaXRpemVPblNhdmVXaGVuQXBwQ2hhbmdlVmFsdWVzKCkgaXMgZW5vdWdoIHRvIHRlc3QgZXBoZW1lcmFsIGFwcHMgc3VwcG9ydAorICAgIHB1YmxpYyB2b2lkIHRlc3RTYW5pdGl6ZU9uU2F2ZU5vQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN0YXJ0QWN0aXZpdHkoKTsKKworICAgICAgICAvLyBTZXQgc2VydmljZS4KKyAgICAgICAgZW5hYmxlU2VydmljZSgpOworCisgICAgICAgIC8vIFNldCBleHBlY3RhdGlvbnMuCisgICAgICAgIGZpbmFsIEF1dG9maWxsSWQgaW5wdXRJZCA9IG1BY3Rpdml0eS5tSW5wdXQuZ2V0QXV0b2ZpbGxJZCgpOworICAgICAgICBmaW5hbCBBdXRvZmlsbElkIHBhc3N3b3JkSWQgPSBtQWN0aXZpdHkubVBhc3N3b3JkLmdldEF1dG9maWxsSWQoKTsKKyAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UobmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0UmVxdWlyZWRTYXZhYmxlSWRzKFNBVkVfREFUQV9UWVBFX0dFTkVSSUMsIElEX0lOUFVUKQorICAgICAgICAgICAgICAgIC5zZXRPcHRpb25hbFNhdmFibGVJZHMoSURfUEFTU1dPUkQpCisgICAgICAgICAgICAgICAgLmFkZFNhbml0aXplcihuZXcgVGV4dFZhbHVlU2FuaXRpemVyKFRSSU1NRVJfUEFUVEVSTiwgIiQxIiksIGlucHV0SWQsIHBhc3N3b3JkSWQpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIC8vIFRyaWdnZXIgYXV0b2ZpbGwuCisgICAgICAgIG1BY3Rpdml0eS5zeW5jUnVuT25VaVRocmVhZCgoKSAtPiBtQWN0aXZpdHkubUlucHV0LnJlcXVlc3RGb2N1cygpKTsKKyAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CisgICAgICAgIG1VaUJvdC5hc3NlcnROb0RhdGFzZXRzRXZlcigpOworCisgICAgICAgIC8vIFRyaWdnZXIgc2F2ZS4KKyAgICAgICAgbUFjdGl2aXR5LnN5bmNSdW5PblVpVGhyZWFkKCgpIC0+IHsKKyAgICAgICAgICAgIG1BY3Rpdml0eS5tSW5wdXQuc2V0VGV4dCgiI2lkIyIpOworICAgICAgICAgICAgbUFjdGl2aXR5Lm1QYXNzd29yZC5zZXRUZXh0KCIjcGFzcyMiKTsKKyAgICAgICAgICAgIG1BY3Rpdml0eS5tQ29tbWl0LnBlcmZvcm1DbGljaygpOworICAgICAgICB9KTsKKworICAgICAgICAvLyBTYXZlIGl0Li4uCisgICAgICAgIG1VaUJvdC5zYXZlRm9yQXV0b2ZpbGwodHJ1ZSwgU0FWRV9EQVRBX1RZUEVfR0VORVJJQyk7CisKKyAgICAgICAgLy8gLi4uIGFuZCBhc3NlcnQgcmVzdWx0cworICAgICAgICBmaW5hbCBTYXZlUmVxdWVzdCBzYXZlUmVxdWVzdCA9IHNSZXBsaWVyLmdldE5leHRTYXZlUmVxdWVzdCgpOworICAgICAgICBhc3NlcnRUZXh0VmFsdWUoZmluZE5vZGVCeVJlc291cmNlSWQoc2F2ZVJlcXVlc3Quc3RydWN0dXJlLCBJRF9JTlBVVCksICJpZCIpOworICAgICAgICBhc3NlcnRUZXh0VmFsdWUoZmluZE5vZGVCeVJlc291cmNlSWQoc2F2ZVJlcXVlc3Quc3RydWN0dXJlLCBJRF9QQVNTV09SRCksICJwYXNzIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gdGVzdFNhbml0aXplT25TYXZlV2hlbkFwcENoYW5nZVZhbHVlcygpIGlzIGVub3VnaCB0byB0ZXN0IGVwaGVtZXJhbCBhcHBzIHN1cHBvcnQKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG9udFNhdmVXaGVuU2FuaXRpemVkVmFsdWVGb3JSZXF1aXJlZEZpZWxkRGlkbnRDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3RhcnRBY3Rpdml0eSgpOworCisgICAgICAgIC8vIFNldCBsaXN0ZW5lcnMgdGhhdCB3aWxsIGNoYW5nZSB0aGUgc2F2ZWQgdmFsdWUKKyAgICAgICAgbmV3IEFudGlUcmltbWVyVGV4dFdhdGNoZXIobUFjdGl2aXR5Lm1JbnB1dCk7CisgICAgICAgIG5ldyBBbnRpVHJpbW1lclRleHRXYXRjaGVyKG1BY3Rpdml0eS5tUGFzc3dvcmQpOworCisgICAgICAgIC8vIFNldCBzZXJ2aWNlLgorICAgICAgICBlbmFibGVTZXJ2aWNlKCk7CisKKyAgICAgICAgLy8gU2V0IGV4cGVjdGF0aW9ucy4KKyAgICAgICAgZmluYWwgQXV0b2ZpbGxJZCBpbnB1dElkID0gbUFjdGl2aXR5Lm1JbnB1dC5nZXRBdXRvZmlsbElkKCk7CisgICAgICAgIGZpbmFsIEF1dG9maWxsSWQgcGFzc3dvcmRJZCA9IG1BY3Rpdml0eS5tUGFzc3dvcmQuZ2V0QXV0b2ZpbGxJZCgpOworICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRSZXF1aXJlZFNhdmFibGVJZHMoU0FWRV9EQVRBX1RZUEVfR0VORVJJQywgSURfSU5QVVQsIElEX1BBU1NXT1JEKQorICAgICAgICAgICAgICAgIC5hZGRTYW5pdGl6ZXIobmV3IFRleHRWYWx1ZVNhbml0aXplcihUUklNTUVSX1BBVFRFUk4sICIkMSIpLCBpbnB1dElkLCBwYXNzd29yZElkKQorICAgICAgICAgICAgICAgIC5hZGREYXRhc2V0KG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0lOUFVULCAiaWQiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1BBU1NXT1JELCAicGFzcyIpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiWU8iKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAvLyBUcmlnZ2VyIGF1dG9maWxsLgorICAgICAgICBtQWN0aXZpdHkuc3luY1J1bk9uVWlUaHJlYWQoKCkgLT4gbUFjdGl2aXR5Lm1JbnB1dC5yZXF1ZXN0Rm9jdXMoKSk7CisgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOworCisgICAgICAgIG1BY3Rpdml0eS5zeW5jUnVuT25VaVRocmVhZCgoKSAtPiB7CisgICAgICAgICAgICBtQWN0aXZpdHkubUlucHV0LnNldFRleHQoImlkIik7CisgICAgICAgICAgICBtQWN0aXZpdHkubVBhc3N3b3JkLnNldFRleHQoInBhc3MiKTsKKyAgICAgICAgICAgIG1BY3Rpdml0eS5tQ29tbWl0LnBlcmZvcm1DbGljaygpOworICAgICAgICB9KTsKKworICAgICAgICBtVWlCb3QuYXNzZXJ0U2F2ZU5vdFNob3dpbmcoU0FWRV9EQVRBX1RZUEVfR0VORVJJQyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gdGVzdFNhbml0aXplT25TYXZlV2hlbkFwcENoYW5nZVZhbHVlcygpIGlzIGVub3VnaCB0byB0ZXN0IGVwaGVtZXJhbCBhcHBzIHN1cHBvcnQKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG9udFNhdmVXaGVuU2FuaXRpemVkVmFsdWVGb3JPcHRpb25hbEZpZWxkRGlkbnRDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3RhcnRBY3Rpdml0eSgpOworCisgICAgICAgIC8vIFNldCBzZXJ2aWNlLgorICAgICAgICBlbmFibGVTZXJ2aWNlKCk7CisKKyAgICAgICAgLy8gU2V0IGV4cGVjdGF0aW9ucy4KKyAgICAgICAgZmluYWwgQXV0b2ZpbGxJZCBwYXNzd29yZElkID0gbUFjdGl2aXR5Lm1QYXNzd29yZC5nZXRBdXRvZmlsbElkKCk7CisgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldFJlcXVpcmVkU2F2YWJsZUlkcyhTQVZFX0RBVEFfVFlQRV9HRU5FUklDLCBJRF9JTlBVVCkKKyAgICAgICAgICAgICAgICAuc2V0T3B0aW9uYWxTYXZhYmxlSWRzKElEX1BBU1NXT1JEKQorICAgICAgICAgICAgICAgIC5hZGRTYW5pdGl6ZXIobmV3IFRleHRWYWx1ZVNhbml0aXplcihQYXR0ZXJuLmNvbXBpbGUoIihwYXNzKSAiKSwgIiQxIiksIHBhc3N3b3JkSWQpCisgICAgICAgICAgICAgICAgLmFkZERhdGFzZXQobmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfSU5QVVQsICJpZCIpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfUEFTU1dPUkQsICJwYXNzIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJZTyIpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIC8vIFRyaWdnZXIgYXV0b2ZpbGwuCisgICAgICAgIG1BY3Rpdml0eS5zeW5jUnVuT25VaVRocmVhZCgoKSAtPiBtQWN0aXZpdHkubUlucHV0LnJlcXVlc3RGb2N1cygpKTsKKworICAgICAgICBtQWN0aXZpdHkuc3luY1J1bk9uVWlUaHJlYWQoKCkgLT4geworICAgICAgICAgICAgbUFjdGl2aXR5Lm1JbnB1dC5zZXRUZXh0KCJpZCIpOworICAgICAgICAgICAgbUFjdGl2aXR5Lm1QYXNzd29yZC5zZXRUZXh0KCIjcGFzcyMiKTsKKyAgICAgICAgICAgIG1BY3Rpdml0eS5tQ29tbWl0LnBlcmZvcm1DbGljaygpOworICAgICAgICB9KTsKKworICAgICAgICBtVWlCb3QuYXNzZXJ0U2F2ZU5vdFNob3dpbmcoU0FWRV9EQVRBX1RZUEVfR0VORVJJQyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gdGVzdFNhbml0aXplT25TYXZlV2hlbkFwcENoYW5nZVZhbHVlcygpIGlzIGVub3VnaCB0byB0ZXN0IGVwaGVtZXJhbCBhcHBzIHN1cHBvcnQKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG9udFNhdmVXaGVuUmVxdWlyZWRGaWVsZEZhaWxlZFNhbml0aXphdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdGFydEFjdGl2aXR5KCk7CisKKyAgICAgICAgLy8gU2V0IHNlcnZpY2UuCisgICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKKworICAgICAgICAvLyBTZXQgZXhwZWN0YXRpb25zLgorICAgICAgICBmaW5hbCBBdXRvZmlsbElkIGlucHV0SWQgPSBtQWN0aXZpdHkubUlucHV0LmdldEF1dG9maWxsSWQoKTsKKyAgICAgICAgZmluYWwgQXV0b2ZpbGxJZCBwYXNzd29yZElkID0gbUFjdGl2aXR5Lm1QYXNzd29yZC5nZXRBdXRvZmlsbElkKCk7CisgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldFJlcXVpcmVkU2F2YWJsZUlkcyhTQVZFX0RBVEFfVFlQRV9HRU5FUklDLCBJRF9JTlBVVCwgSURfUEFTU1dPUkQpCisgICAgICAgICAgICAgICAgLmFkZFNhbml0aXplcihuZXcgVGV4dFZhbHVlU2FuaXRpemVyKFBhdHRlcm4uY29tcGlsZSgiZHVkZSIpLCAiJDEiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0SWQsIHBhc3N3b3JkSWQpCisgICAgICAgICAgICAgICAgLmFkZERhdGFzZXQobmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfSU5QVVQsICIjaWQjIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9QQVNTV09SRCwgIiNwYXNzIyIpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiWU8iKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAvLyBUcmlnZ2VyIGF1dG9maWxsLgorICAgICAgICBtQWN0aXZpdHkuc3luY1J1bk9uVWlUaHJlYWQoKCkgLT4gbUFjdGl2aXR5Lm1JbnB1dC5yZXF1ZXN0Rm9jdXMoKSk7CisgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOworCisgICAgICAgIG1BY3Rpdml0eS5zeW5jUnVuT25VaVRocmVhZCgoKSAtPiB7CisgICAgICAgICAgICBtQWN0aXZpdHkubUlucHV0LnNldFRleHQoImlkIik7CisgICAgICAgICAgICBtQWN0aXZpdHkubVBhc3N3b3JkLnNldFRleHQoInBhc3MiKTsKKyAgICAgICAgICAgIG1BY3Rpdml0eS5tQ29tbWl0LnBlcmZvcm1DbGljaygpOworICAgICAgICB9KTsKKworICAgICAgICBtVWlCb3QuYXNzZXJ0U2F2ZU5vdFNob3dpbmcoU0FWRV9EQVRBX1RZUEVfR0VORVJJQyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gdGVzdFNhbml0aXplT25TYXZlV2hlbkFwcENoYW5nZVZhbHVlcygpIGlzIGVub3VnaCB0byB0ZXN0IGVwaGVtZXJhbCBhcHBzIHN1cHBvcnQKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG9udFNhdmVXaGVuT3B0aW9uYWxGaWVsZEZhaWxlZFNhbml0aXphdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdGFydEFjdGl2aXR5KCk7CisKKyAgICAgICAgLy8gU2V0IHNlcnZpY2UuCisgICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKKworICAgICAgICAvLyBTZXQgZXhwZWN0YXRpb25zLgorICAgICAgICBmaW5hbCBBdXRvZmlsbElkIGlucHV0SWQgPSBtQWN0aXZpdHkubUlucHV0LmdldEF1dG9maWxsSWQoKTsKKyAgICAgICAgZmluYWwgQXV0b2ZpbGxJZCBwYXNzd29yZElkID0gbUFjdGl2aXR5Lm1QYXNzd29yZC5nZXRBdXRvZmlsbElkKCk7CisgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldFJlcXVpcmVkU2F2YWJsZUlkcyhTQVZFX0RBVEFfVFlQRV9HRU5FUklDLCBJRF9JTlBVVCkKKyAgICAgICAgICAgICAgICAuc2V0T3B0aW9uYWxTYXZhYmxlSWRzKElEX1BBU1NXT1JEKQorICAgICAgICAgICAgICAgIC5hZGRTYW5pdGl6ZXIobmV3IFRleHRWYWx1ZVNhbml0aXplcihQYXR0ZXJuLmNvbXBpbGUoImR1ZGUiKSwgIiQxIiksCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dElkLCBwYXNzd29yZElkKQorICAgICAgICAgICAgICAgIC5hZGREYXRhc2V0KG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX0lOUFVULCAiaWQiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1BBU1NXT1JELCAiI3Bhc3MjIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJZTyIpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIC8vIFRyaWdnZXIgYXV0b2ZpbGwuCisgICAgICAgIG1BY3Rpdml0eS5zeW5jUnVuT25VaVRocmVhZCgoKSAtPiBtQWN0aXZpdHkubUlucHV0LnJlcXVlc3RGb2N1cygpKTsKKyAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CisKKyAgICAgICAgbUFjdGl2aXR5LnN5bmNSdW5PblVpVGhyZWFkKCgpIC0+IHsKKyAgICAgICAgICAgIG1BY3Rpdml0eS5tSW5wdXQuc2V0VGV4dCgiaWQiKTsKKyAgICAgICAgICAgIG1BY3Rpdml0eS5tUGFzc3dvcmQuc2V0VGV4dCgicGFzcyIpOworICAgICAgICAgICAgbUFjdGl2aXR5Lm1Db21taXQucGVyZm9ybUNsaWNrKCk7CisgICAgICAgIH0pOworCisgICAgICAgIG1VaUJvdC5hc3NlcnRTYXZlTm90U2hvd2luZyhTQVZFX0RBVEFfVFlQRV9HRU5FUklDKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBBcHBNb2RlRnVsbCAvLyB0ZXN0U2FuaXRpemVPblNhdmVXaGVuQXBwQ2hhbmdlVmFsdWVzKCkgaXMgZW5vdWdoIHRvIHRlc3QgZXBoZW1lcmFsIGFwcHMgc3VwcG9ydAorICAgIHB1YmxpYyB2b2lkIHRlc3REb250U2F2ZVdoZW5Jbml0aWFsVmFsdWVBbmROb1VzZXJJbnB1dEFuZFNlcnZpY2VEYXRhc2V0cygpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICAvLyBQcmVwYXJlIGFjdGl2aXRpeS4KKyAgICAgICAgc3RhcnRBY3Rpdml0eSgpOworICAgICAgICBtQWN0aXZpdHkuc3luY1J1bk9uVWlUaHJlYWQoKCkgLT4geworICAgICAgICAgICAgLy8gTk9URTogaW5wdXQncyB2YWx1ZSBtdXN0IGJlIGEgc3Vic2V0IG9mIHRoZSBkYXRhc2V0IHZhbHVlLCBvdGhlcndpc2UgdGhlIGRhdGFzZXQKKyAgICAgICAgICAgIC8vIHBpY2tlciBpcyBmaWx0ZXJlZCBvdXQKKyAgICAgICAgICAgIG1BY3Rpdml0eS5tSW5wdXQuc2V0VGV4dCgiZiIpOworICAgICAgICAgICAgbUFjdGl2aXR5Lm1QYXNzd29yZC5zZXRUZXh0KCJiIik7CisgICAgICAgIH0pOworCisgICAgICAgIC8vIFNldCBzZXJ2aWNlLgorICAgICAgICBlbmFibGVTZXJ2aWNlKCk7CisKKyAgICAgICAgLy8gU2V0IGV4cGVjdGF0aW9ucy4KKyAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UobmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuYWRkRGF0YXNldChuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9JTlBVVCwgImZvbyIpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfUEFTU1dPUkQsICJiYXIiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oIlRoZSBEdWRlIikpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuc2V0UmVxdWlyZWRTYXZhYmxlSWRzKFNBVkVfREFUQV9UWVBFX1BBU1NXT1JELCBJRF9JTlBVVCwgSURfUEFTU1dPUkQpLmJ1aWxkKCkpOworCisgICAgICAgIC8vIFRyaWdnZXIgYXV0by1maWxsLgorICAgICAgICBtQWN0aXZpdHkuc3luY1J1bk9uVWlUaHJlYWQoKCkgLT4gbUFjdGl2aXR5Lm1JbnB1dC5yZXF1ZXN0Rm9jdXMoKSk7CisgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlRoZSBEdWRlIik7CisKKyAgICAgICAgLy8gVHJpZ2dlciBzYXZlLgorICAgICAgICBtQWN0aXZpdHkuZ2V0QXV0b2ZpbGxNYW5hZ2VyKCkuY29tbWl0KCk7CisKKyAgICAgICAgLy8gQXNzZXJ0IGl0J3Mgbm90IHNob3dpbmcuCisgICAgICAgIG1VaUJvdC5hc3NlcnRTYXZlTm90U2hvd2luZyhTQVZFX0RBVEFfVFlQRV9QQVNTV09SRCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhwbGljaXR5U2F2ZUJ1dHRvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleHBsaWNpdHlTYXZlQnV0dG9uVGVzdChmYWxzZSwgMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhwbGljaXR5U2F2ZUJ1dHRvbldoZW5BcHBDbGVhckZpZWxkcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleHBsaWNpdHlTYXZlQnV0dG9uVGVzdCh0cnVlLCAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFeHBsaWNpdHlTYXZlQnV0dG9uT25seSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleHBsaWNpdHlTYXZlQnV0dG9uVGVzdChmYWxzZSwgU2F2ZUluZm8uRkxBR19ET05UX1NBVkVfT05fRklOSVNIKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBzY2VuYXJpbyB3aGVyZSBzZXJ2aWNlIGV4cGxpY2l0bHkgaW5kaWNhdGVzIHdoaWNoIGJ1dHRvbiBpcyB1c2VkIHRvIHNhdmUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGV4cGxpY2l0eVNhdmVCdXR0b25UZXN0KGJvb2xlYW4gY2xlYXJGaWVsZHNPblN1Ym1pdCwgaW50IGZsYWdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgYm9vbGVhbiB0ZXN0Qml0bWFwID0gZmFsc2U7CisgICAgICAgIHN0YXJ0QWN0aXZpdHkoKTsKKyAgICAgICAgbUFjdGl2aXR5LnNldEF1dG9Db21taXQoZmFsc2UpOworICAgICAgICBtQWN0aXZpdHkuc2V0Q2xlYXJGaWVsZHNPblN1Ym1pdChjbGVhckZpZWxkc09uU3VibWl0KTsKKworICAgICAgICAvLyBTZXQgc2VydmljZS4KKyAgICAgICAgZW5hYmxlU2VydmljZSgpOworCisgICAgICAgIC8vIFNldCBleHBlY3RhdGlvbnMuCisgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldFJlcXVpcmVkU2F2YWJsZUlkcyhTQVZFX0RBVEFfVFlQRV9HRU5FUklDLCBJRF9JTlBVVCkKKyAgICAgICAgICAgICAgICAuc2V0U2F2ZVRyaWdnZXJJZChtQWN0aXZpdHkubUNvbW1pdC5nZXRBdXRvZmlsbElkKCkpCisgICAgICAgICAgICAgICAgLnNldFNhdmVJbmZvRmxhZ3MoZmxhZ3MpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIC8vIFRyaWdnZXIgYXV0b2ZpbGwuCisgICAgICAgIG1BY3Rpdml0eS5zeW5jUnVuT25VaVRocmVhZCgoKSAtPiBtQWN0aXZpdHkubUlucHV0LnJlcXVlc3RGb2N1cygpKTsKKyAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CisgICAgICAgIEhlbHBlci5hc3NlcnRIYXNTZXNzaW9ucyhtUGFja2FnZU5hbWUpOworCisgICAgICAgIC8vIFRyaWdnZXIgc2F2ZS4KKyAgICAgICAgbUFjdGl2aXR5LnN5bmNSdW5PblVpVGhyZWFkKCgpIC0+IG1BY3Rpdml0eS5tSW5wdXQuc2V0VGV4dCgiMTA4IikpOworCisgICAgICAgIC8vIFRha2UgYSBzY3JlZW5zaG90IHRvIG1ha2Ugc3VyZSBidXR0b24gZG9lc24ndCBkaXNhcHBlYXIuCisgICAgICAgIGZpbmFsIFN0cmluZyBjb21taXRCZWZvcmUgPSBtVWlCb3QuYXNzZXJ0U2hvd25CeVJlbGF0aXZlSWQoSURfQ09NTUlUKS5nZXRUZXh0KCk7CisgICAgICAgIGFzc2VydFRoYXQoY29tbWl0QmVmb3JlLnRvVXBwZXJDYXNlKCkpLmlzRXF1YWxUbygiQ09NTUlUIik7CisgICAgICAgIC8vIERpc2FibGUgdW5uZWNlc3Nhcnkgc2NyZWVuc2hvdCB0ZXN0cyBhcyB0YWtlU2NyZWVuc2hvdCgpIGZhaWxzIG9uIHNvbWUgZGV2aWNlLgorCisgICAgICAgIGZpbmFsIEJpdG1hcCBzY3JlZW5zaG90QmVmb3JlID0gdGVzdEJpdG1hcCA/IG1BY3Rpdml0eS50YWtlU2NyZWVuc2hvdChtQWN0aXZpdHkubUNvbW1pdCkKKyAgICAgICAgICAgICAgICA6IG51bGw7CisKKyAgICAgICAgLy8gU2F2ZSBpdC4uLgorICAgICAgICBtQWN0aXZpdHkuc3luY1J1bk9uVWlUaHJlYWQoKCkgLT4gbUFjdGl2aXR5Lm1Db21taXQucGVyZm9ybUNsaWNrKCkpOworICAgICAgICBmaW5hbCBVaU9iamVjdDIgc2F2ZVVpID0gbVVpQm90LmFzc2VydFNhdmVTaG93aW5nKFNBVkVfREFUQV9UWVBFX0dFTkVSSUMpOworICAgICAgICBtVWlCb3Quc2F2ZUZvckF1dG9maWxsKHNhdmVVaSwgdHJ1ZSk7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHNhdmUgYnV0dG9uIGlzIHNob3duaW5nIChpdCB3YXMgcmVtb3ZlZCBvbiBlYXJsaWVyIHZlcnNpb25zIG9mIHRoZSBmZWF0dXJlKQorICAgICAgICBmaW5hbCBTdHJpbmcgY29tbWl0QWZ0ZXIgPSBtVWlCb3QuYXNzZXJ0U2hvd25CeVJlbGF0aXZlSWQoSURfQ09NTUlUKS5nZXRUZXh0KCk7CisgICAgICAgIGFzc2VydFRoYXQoY29tbWl0QWZ0ZXIudG9VcHBlckNhc2UoKSkuaXNFcXVhbFRvKCJDT01NSVQiKTsKKyAgICAgICAgZmluYWwgQml0bWFwIHNjcmVlbnNob3RBZnRlciA9IHRlc3RCaXRtYXAgPyBtQWN0aXZpdHkudGFrZVNjcmVlbnNob3QobUFjdGl2aXR5Lm1Db21taXQpCisgICAgICAgICAgICAgICAgOiBudWxsOworCisgICAgICAgIC8vIC4uLiBhbmQgYXNzZXJ0IHJlc3VsdHMKKyAgICAgICAgZmluYWwgU2F2ZVJlcXVlc3Qgc2F2ZVJlcXVlc3QgPSBzUmVwbGllci5nZXROZXh0U2F2ZVJlcXVlc3QoKTsKKyAgICAgICAgYXNzZXJ0VGV4dEFuZFZhbHVlKGZpbmROb2RlQnlSZXNvdXJjZUlkKHNhdmVSZXF1ZXN0LnN0cnVjdHVyZSwgSURfSU5QVVQpLCAiMTA4Iik7CisKKyAgICAgICAgaWYgKHRlc3RCaXRtYXApIHsKKyAgICAgICAgICAgIEhlbHBlci5hc3NlcnRCaXRtYXBzQXJlU2FtZSgiY29tbWl0LWJ1dHRvbiIsIHNjcmVlbnNob3RCZWZvcmUsIHNjcmVlbnNob3RBZnRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB0YXBMaW5rQWZ0ZXJVcGRhdGVBcHBsaWVkVGVzdChib29sZWFuIHVwZGF0ZUxpbmtWaWV3KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3RhcnRBY3Rpdml0eSgpOworICAgICAgICAvLyBTZXQgc2VydmljZS4KKyAgICAgICAgZW5hYmxlU2VydmljZSgpOworCisgICAgICAgIC8vIFNldCBleHBlY3RhdGlvbnMuCisgICAgICAgIGZpbmFsIEN1c3RvbURlc2NyaXB0aW9uLkJ1aWxkZXIgY3VzdG9tRGVzY3JpcHRpb24gPQorICAgICAgICAgICAgICAgIG5ld0N1c3RvbURlc2NyaXB0aW9uQnVpbGRlcihXZWxjb21lQWN0aXZpdHkuY2xhc3MpOworICAgICAgICBmaW5hbCBSZW1vdGVWaWV3cyB1cGRhdGUgPSBuZXdUZW1wbGF0ZSgpOworICAgICAgICBpZiAodXBkYXRlTGlua1ZpZXcpIHsKKyAgICAgICAgICAgIHVwZGF0ZS5zZXRDaGFyU2VxdWVuY2UoUi5pZC5saW5rLCAic2V0VGV4dCIsICJUQVAgTUUgSUYgWU9VIENBTiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdXBkYXRlLnNldENoYXJTZXF1ZW5jZShSLmlkLnN0YXRpY190ZXh0LCAic2V0VGV4dCIsICJNRSEiKTsKKyAgICAgICAgfQorICAgICAgICBWYWxpZGF0b3IgdmFsaWRDb25kaXRpb24gPSBuZXcgUmVnZXhWYWxpZGF0b3IobUFjdGl2aXR5Lm1JbnB1dC5nZXRBdXRvZmlsbElkKCksCisgICAgICAgICAgICAgICAgUGF0dGVybi5jb21waWxlKCIuKiIpKTsKKyAgICAgICAgY3VzdG9tRGVzY3JpcHRpb24uYmF0Y2hVcGRhdGUodmFsaWRDb25kaXRpb24sCisgICAgICAgICAgICAgICAgbmV3IEJhdGNoVXBkYXRlcy5CdWlsZGVyKCkudXBkYXRlVGVtcGxhdGUodXBkYXRlKS5idWlsZCgpKTsKKworICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRDdXN0b21EZXNjcmlwdGlvbihjdXN0b21EZXNjcmlwdGlvbi5idWlsZCgpKQorICAgICAgICAgICAgICAgIC5zZXRSZXF1aXJlZFNhdmFibGVJZHMoU0FWRV9EQVRBX1RZUEVfR0VORVJJQywgSURfSU5QVVQpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIC8vIFRyaWdnZXIgYXV0b2ZpbGwuCisgICAgICAgIG1BY3Rpdml0eS5zeW5jUnVuT25VaVRocmVhZCgoKSAtPiBtQWN0aXZpdHkubUlucHV0LnJlcXVlc3RGb2N1cygpKTsKKyAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CisgICAgICAgIEhlbHBlci5hc3NlcnRIYXNTZXNzaW9ucyhtUGFja2FnZU5hbWUpOworICAgICAgICAvLyBUcmlnZ2VyIHNhdmUuCisgICAgICAgIG1BY3Rpdml0eS5zeW5jUnVuT25VaVRocmVhZCgoKSAtPiB7CisgICAgICAgICAgICBtQWN0aXZpdHkubUlucHV0LnNldFRleHQoIjEwOCIpOworICAgICAgICAgICAgbUFjdGl2aXR5Lm1Db21taXQucGVyZm9ybUNsaWNrKCk7CisgICAgICAgIH0pOworICAgICAgICBmaW5hbCBVaU9iamVjdDIgc2F2ZVVpOworICAgICAgICBpZiAodXBkYXRlTGlua1ZpZXcpIHsKKyAgICAgICAgICAgIHNhdmVVaSA9IGFzc2VydFNhdmVVaVdpdGhMaW5rSXNTaG93bihTQVZFX0RBVEFfVFlQRV9HRU5FUklDLCAiVEFQIE1FIElGIFlPVSBDQU4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNhdmVVaSA9IGFzc2VydFNhdmVVaVdpdGhMaW5rSXNTaG93bihTQVZFX0RBVEFfVFlQRV9HRU5FUklDKTsKKyAgICAgICAgICAgIGZpbmFsIFVpT2JqZWN0MiBjaGFuZ2VkID0gc2F2ZVVpLmZpbmRPYmplY3QoQnkucmVzKG1QYWNrYWdlTmFtZSwgSURfU1RBVElDX1RFWFQpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoY2hhbmdlZC5nZXRUZXh0KCkpLmlzRXF1YWxUbygiTUUhIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBUYXAgdGhlIGxpbmsuCisgICAgICAgIHRhcFNhdmVVaUxpbmsoc2F2ZVVpKTsKKworICAgICAgICAvLyBNYWtlIHN1cmUgbmV3IGFjdGl2aXR5IGlzIHNob3duLi4uCisgICAgICAgIFdlbGNvbWVBY3Rpdml0eS5hc3NlcnRTaG93aW5nRGVmYXVsdE1lc3NhZ2UobVVpQm90KTsKKyAgICAgICAgbVVpQm90LmFzc2VydFNhdmVOb3RTaG93aW5nKFNBVkVfREFUQV9UWVBFX0dFTkVSSUMpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL1RleHRWYWx1ZVNhbml0aXplclRlc3QuamF2YSBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL1RleHRWYWx1ZVNhbml0aXplclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2QyNzkzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvVGV4dFZhbHVlU2FuaXRpemVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0czsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi50cnV0aC5UcnV0aC5hc3NlcnRUaGF0OworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydFRocm93czsKKworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKK2ltcG9ydCBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuVGV4dFZhbHVlU2FuaXRpemVyOworaW1wb3J0IGFuZHJvaWQudmlldy5hdXRvZmlsbC5BdXRvZmlsbFZhbHVlOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKKworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCitAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQorQEFwcE1vZGVGdWxsIC8vIFVuaXQgdGVzdAorcHVibGljIGNsYXNzIFRleHRWYWx1ZVNhbml0aXplclRlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JfbnVsbFZhbHVlcygpIHsKKyAgICAgICAgYXNzZXJ0VGhyb3dzKE51bGxQb2ludGVyRXhjZXB0aW9uLmNsYXNzLAorICAgICAgICAgICAgICAgICgpIC0+IG5ldyBUZXh0VmFsdWVTYW5pdGl6ZXIoUGF0dGVybi5jb21waWxlKCI0MiIpLCBudWxsKSk7CisgICAgICAgIGFzc2VydFRocm93cyhOdWxsUG9pbnRlckV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAoKSAtPiBuZXcgVGV4dFZhbHVlU2FuaXRpemVyKG51bGwsICI0MiIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTYW5pdGl6ZV9udWxsVmFsdWUoKSB7CisgICAgICAgIGZpbmFsIFRleHRWYWx1ZVNhbml0aXplciBzYW5pdGl6ZXIgPSBuZXcgVGV4dFZhbHVlU2FuaXRpemVyKFBhdHRlcm4uY29tcGlsZSgiNDIiKSwgIjQyIik7CisgICAgICAgIGFzc2VydFRoYXQoc2FuaXRpemVyLnNhbml0aXplKG51bGwpKS5pc051bGwoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTYW5pdGl6ZV9ub25UZXh0VmFsdWUoKSB7CisgICAgICAgIGZpbmFsIFRleHRWYWx1ZVNhbml0aXplciBzYW5pdGl6ZXIgPSBuZXcgVGV4dFZhbHVlU2FuaXRpemVyKFBhdHRlcm4uY29tcGlsZSgiNDIiKSwgIjQyIik7CisgICAgICAgIGZpbmFsIEF1dG9maWxsVmFsdWUgdmFsdWUgPSBBdXRvZmlsbFZhbHVlLmZvclRvZ2dsZSh0cnVlKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzYW5pdGl6ZXIuc2FuaXRpemUodmFsdWUpKS5pc051bGwoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTYW5pdGl6ZV9iYWRSZWdleCgpIHsKKyAgICAgICAgZmluYWwgVGV4dFZhbHVlU2FuaXRpemVyIHNhbml0aXplciA9IG5ldyBUZXh0VmFsdWVTYW5pdGl6ZXIoUGF0dGVybi5jb21waWxlKCIuKihcXGQqKS4qIiksCisgICAgICAgICAgICAgICAgIiQyIik7IC8vIGludmFsaWQgZ3JvdXAKKyAgICAgICAgZmluYWwgQXV0b2ZpbGxWYWx1ZSB2YWx1ZSA9IEF1dG9maWxsVmFsdWUuZm9yVGV4dCgiYmxhaCA0MiAgYmxhSCIpOworICAgICAgICBhc3NlcnRUaGF0KHNhbml0aXplci5zYW5pdGl6ZSh2YWx1ZSkpLmlzTnVsbCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNhbml0aXplX3ZhbHVlTWlzbWF0Y2goKSB7CisgICAgICAgIGZpbmFsIFRleHRWYWx1ZVNhbml0aXplciBzYW5pdGl6ZXIgPSBuZXcgVGV4dFZhbHVlU2FuaXRpemVyKFBhdHRlcm4uY29tcGlsZSgiNDIiKSwgInh4eCIpOworICAgICAgICBmaW5hbCBBdXRvZmlsbFZhbHVlIHZhbHVlID0gQXV0b2ZpbGxWYWx1ZS5mb3JUZXh0KCI0MyIpOworICAgICAgICBhc3NlcnRUaGF0KHNhbml0aXplci5zYW5pdGl6ZSh2YWx1ZSkpLmlzTnVsbCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNhbml0aXplX3NpbXBsZU1hdGNoKCkgeworICAgICAgICBmaW5hbCBUZXh0VmFsdWVTYW5pdGl6ZXIgc2FuaXRpemVyID0gbmV3IFRleHRWYWx1ZVNhbml0aXplcihQYXR0ZXJuLmNvbXBpbGUoIjQyIiksCisgICAgICAgICAgICAgICAgImZvcnR5LXR3byIpOworICAgICAgICBhc3NlcnRUaGF0KHNhbml0aXplci5zYW5pdGl6ZShBdXRvZmlsbFZhbHVlLmZvclRleHQoIjQyIikpLmdldFRleHRWYWx1ZSgpKQorICAgICAgICAgICAgLmlzRXF1YWxUbygiZm9ydHktdHdvIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2FuaXRpemVfbXVsdGlwbGVNYXRjaGVzKCkgeworICAgICAgICBmaW5hbCBUZXh0VmFsdWVTYW5pdGl6ZXIgc2FuaXRpemVyID0gbmV3IFRleHRWYWx1ZVNhbml0aXplcihQYXR0ZXJuLmNvbXBpbGUoIi4qKFxcZCopLioiKSwKKyAgICAgICAgICAgICAgICAiTnVtYmVyIik7CisgICAgICAgIGFzc2VydFRoYXQoc2FuaXRpemVyLnNhbml0aXplKEF1dG9maWxsVmFsdWUuZm9yVGV4dCgiYmxhaCA0MiAgYmxhSCIpKS5nZXRUZXh0VmFsdWUoKSkKKyAgICAgICAgICAgIC5pc0VxdWFsVG8oIk51bWJlck51bWJlciIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNhbml0aXplX2dyb3VwU3Vic3RpdHV0aW9uTWF0Y2goKSB7CisgICAgICAgIGZpbmFsIFRleHRWYWx1ZVNhbml0aXplciBzYW5pdGl6ZXIgPQorICAgICAgICAgICAgICAgIG5ldyBUZXh0VmFsdWVTYW5pdGl6ZXIoUGF0dGVybi5jb21waWxlKCJcXHMqKFxcZCopXFxzKiIpLCAiJDEiKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzYW5pdGl6ZXIuc2FuaXRpemUoQXV0b2ZpbGxWYWx1ZS5mb3JUZXh0KCIgIDQyICIpKS5nZXRUZXh0VmFsdWUoKSkKKyAgICAgICAgICAgICAgICAuaXNFcXVhbFRvKCI0MiIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL1RpbWVQaWNrZXJDbG9ja0FjdGl2aXR5VGVzdC5qYXZhIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvVGltZVBpY2tlckNsb2NrQWN0aXZpdHlUZXN0LmphdmEKaW5kZXggODEzNWViYS4uOTAzMDExZiAxMDA2NDQKLS0tIGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvVGltZVBpY2tlckNsb2NrQWN0aXZpdHlUZXN0LmphdmEKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvVGltZVBpY2tlckNsb2NrQWN0aXZpdHlUZXN0LmphdmEKQEAgLTE1LDggKzE1LDExIEBACiAgKi8KIHBhY2thZ2UgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzOwogCitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOworCiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiAKK0BBcHBNb2RlRnVsbCAvLyBVbml0IHRlc3QKIHB1YmxpYyBjbGFzcyBUaW1lUGlja2VyQ2xvY2tBY3Rpdml0eVRlc3QgZXh0ZW5kcyBUaW1lUGlja2VyVGVzdENhc2U8VGltZVBpY2tlckNsb2NrQWN0aXZpdHk+IHsKIAogICAgIEBSdWxlCmRpZmYgLS1naXQgYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9UaW1lUGlja2VyU3Bpbm5lckFjdGl2aXR5VGVzdC5qYXZhIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvVGltZVBpY2tlclNwaW5uZXJBY3Rpdml0eVRlc3QuamF2YQppbmRleCAyZDk3ZjAzLi4wN2U0NTkyIDEwMDY0NAotLS0gYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9UaW1lUGlja2VyU3Bpbm5lckFjdGl2aXR5VGVzdC5qYXZhCisrKyBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL1RpbWVQaWNrZXJTcGlubmVyQWN0aXZpdHlUZXN0LmphdmEKQEAgLTE1LDggKzE1LDExIEBACiAgKi8KIHBhY2thZ2UgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzOwogCitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOworCiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiAKK0BBcHBNb2RlRnVsbCAvLyBVbml0IHRlc3QKIHB1YmxpYyBjbGFzcyBUaW1lUGlja2VyU3Bpbm5lckFjdGl2aXR5VGVzdCBleHRlbmRzIFRpbWVQaWNrZXJUZXN0Q2FzZTxUaW1lUGlja2VyU3Bpbm5lckFjdGl2aXR5PiB7CiAKICAgICBAUnVsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvVGltZVBpY2tlclRlc3RDYXNlLmphdmEgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9UaW1lUGlja2VyVGVzdENhc2UuamF2YQppbmRleCBkNGJlMmU2Li40YmQ4Y2YwIDEwMDY0NAotLS0gYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9UaW1lUGlja2VyVGVzdENhc2UuamF2YQorKysgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9UaW1lUGlja2VyVGVzdENhc2UuamF2YQpAQCAtMzEsNyArMzEsNiBAQAogaW1wb3J0IGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5JbnN0cnVtZW50ZWRBdXRvRmlsbFNlcnZpY2UuU2F2ZVJlcXVlc3Q7CiBpbXBvcnQgYW5kcm9pZC5pY3UudXRpbC5DYWxlbmRhcjsKIAotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAogLyoqCkBAIC00MiwxMSArNDEsNiBAQAogCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IFQgZ2V0VGltZVBpY2tlckFjdGl2aXR5KCk7CiAKLSAgICBAQWZ0ZXIKLSAgICBwdWJsaWMgdm9pZCBmaW5pc2hXZWxjb21lQWN0aXZpdHkoKSB7Ci0gICAgICAgIFdlbGNvbWVBY3Rpdml0eS5maW5pc2hJdCgpOwotICAgIH0KLQogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEF1dG9GaWxsQW5kU2F2ZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBmaW5hbCBUIGFjdGl2aXR5ID0gZ2V0VGltZVBpY2tlckFjdGl2aXR5KCk7CkBAIC03OCw3ICs3Miw3IEBACiAgICAgICAgIGFzc2VydFRleHRJc1Nhbml0aXplZChmaWxsUmVxdWVzdC5zdHJ1Y3R1cmUsIElEX1RJTUVfUElDS0VSKTsKICAgICAgICAgYXNzZXJ0TnVtYmVyT2ZDaGlsZHJlbihmaWxsUmVxdWVzdC5zdHJ1Y3R1cmUsIElEX1RJTUVfUElDS0VSLCAwKTsKICAgICAgICAgLy8gQXV0by1maWxsIGl0LgotICAgICAgICBzVWlCb3Quc2VsZWN0RGF0YXNldCgiQWR2ZW50dXJlIFRpbWUiKTsKKyAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQoIkFkdmVudHVyZSBUaW1lIik7CiAKICAgICAgICAgLy8gQ2hlY2sgdGhlIHJlc3VsdHMuCiAgICAgICAgIGFjdGl2aXR5LmFzc2VydEF1dG9GaWxsZWQoKTsKQEAgLTg3LDcgKzgxLDcgQEAKICAgICAgICAgYWN0aXZpdHkuc2V0VGltZSgxMCwgNDApOwogICAgICAgICBhY3Rpdml0eS50YXBPaygpOwogCi0gICAgICAgIHNVaUJvdC5zYXZlRm9yQXV0b2ZpbGwodHJ1ZSwgU0FWRV9EQVRBX1RZUEVfR0VORVJJQyk7CisgICAgICAgIG1VaUJvdC5zYXZlRm9yQXV0b2ZpbGwodHJ1ZSwgU0FWRV9EQVRBX1RZUEVfR0VORVJJQyk7CiAgICAgICAgIGZpbmFsIFNhdmVSZXF1ZXN0IHNhdmVSZXF1ZXN0ID0gc1JlcGxpZXIuZ2V0TmV4dFNhdmVSZXF1ZXN0KCk7CiAgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJvblNhdmUoKSBub3QgY2FsbGVkIikudGhhdChzYXZlUmVxdWVzdCkuaXNOb3ROdWxsKCk7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL1RpbWVvdXQuamF2YSBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL1RpbWVvdXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDNhNGQyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvVGltZW91dC5qYXZhCkBAIC0wLDAgKzEsMTgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzOworCitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk5vbk51bGw7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7CisKKy8qKgorICogQSAic21hcnQiIHRpbWVvdXQgdGhhdCBzdXBwb3J0cyBleHBvbmVudGlhbCBiYWNrb2ZmLgorICovCisvL1RPRE86IG1vdmUgdG8gY29tbW9uIENUUyBDb2RlCitwdWJsaWMgZmluYWwgY2xhc3MgVGltZW91dCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlRpbWVvdXQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gVkVSQk9TRSA9IHRydWU7CisKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtTmFtZTsKKyAgICBwcml2YXRlIGxvbmcgbUN1cnJlbnRWYWx1ZTsKKyAgICBwcml2YXRlIGZpbmFsIGZsb2F0IG1NdWx0aXBsaWVyOworICAgIHByaXZhdGUgZmluYWwgbG9uZyBtTWF4VmFsdWU7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgbmFtZSB0byBiZSB1c2VkIGZvciBsb2dnaW5nIHB1cnBvc2VzLgorICAgICAqIEBwYXJhbSBpbml0aWFsVmFsdWUgaW5pdGlhbCB0aW1lb3V0IHZhbHVlLCBpbiBtcy4KKyAgICAgKiBAcGFyYW0gbXVsdGlwbGllciBtdWx0aXBsaWVyIGZvciB7QGxpbmsgI2luY3JlYXNlKCl9LgorICAgICAqIEBwYXJhbSBtYXhWYWx1ZSBtYXggdGltZW91dCB2YWx1ZSAoaW4gbXMpIHNldCBieSB7QGxpbmsgI2luY3JlYXNlKCl9LgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYge0Bjb2RlIG5hbWV9IGlzIHtAY29kZSBudWxsfSBvciBlbXB0eSwKKyAgICAgKiB7QGNvZGUgaW5pdGlhbFZhbHVlfSwge0Bjb2RlIG11bHRpcGxpcn0gb3Ige0Bjb2RlIG1heFZhbHVlfSBhcmUgbGVzcyB0aGFuIHtAY29kZSAxfSwKKyAgICAgKiBvciBpZiB7QGNvZGUgaW5pdGlhbFZhbHVlfSBpcyBoaWdoZXIgdGhhbiB7QGNvZGUgbWF4VmFsdWV9CisgICAgICovCisgICAgcHVibGljIFRpbWVvdXQoU3RyaW5nIG5hbWUsIGxvbmcgaW5pdGlhbFZhbHVlLCBmbG9hdCBtdWx0aXBsaWVyLCBsb25nIG1heFZhbHVlKSB7CisgICAgICAgIGlmIChpbml0aWFsVmFsdWUgPCAxIHx8IG1heFZhbHVlIDwgMSB8fCBpbml0aWFsVmFsdWUgPiBtYXhWYWx1ZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgImludmFsaWQgaW5pdGlhbCBhbmQvb3IgbWF4IHZhbHVlczogIiArIGluaXRpYWxWYWx1ZSArICIgYW5kICIgKyBtYXhWYWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG11bHRpcGxpZXIgPD0gMSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibXVsdGlwbGllciBtdXN0IGJlIGhpZ2hlciB0aGFuIDE6ICIgKyBtdWx0aXBsaWVyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkobmFtZSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm5vIG5hbWUiKTsKKyAgICAgICAgfQorICAgICAgICBtTmFtZSA9IG5hbWU7CisgICAgICAgIG1DdXJyZW50VmFsdWUgPSBpbml0aWFsVmFsdWU7CisgICAgICAgIG1NdWx0aXBsaWVyID0gbXVsdGlwbGllcjsKKyAgICAgICAgbU1heFZhbHVlID0gbWF4VmFsdWU7CisgICAgICAgIExvZy5kKFRBRywgIkNvbnN0cnVjdG9yOiAiICsgdGhpcyArICIgYXQgIiArIEpVbml0SGVscGVyLmdldEN1cnJlbnRUZXN0TmFtZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBjdXJyZW50IHRpbWVvdXQsIGluIG1zLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIG1zKCkgeworICAgICAgICByZXR1cm4gbUN1cnJlbnRWYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBtYXggdGltZW91dCwgaW4gbXMuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0TWF4VmFsdWUoKSB7CisgICAgICAgIHJldHVybiBtTWF4VmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgbU11bHRpcGxpZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgZ2V0TXVsdGlwbGllcigpIHsKKyAgICAgICAgcmV0dXJuIG1NdWx0aXBsaWVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHVzZXItZnJpZW5kbHkgbmFtZSBvZiB0aGlzIHRpbWVvdXQuCisgICAgICovCisgICAgQE5vbk51bGwKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBtTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmNyZWFzZXMgdGhlIGN1cnJlbnQgdmFsdWUgYnkgdGhlIHtAbGluayAjZ2V0TXVsdGlwbGllcigpfSwgdXAgdG8ge0BsaW5rICNnZXRNYXhWYWx1ZSgpfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gcHJldmlvdXMgY3VycmVudCB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBpbmNyZWFzZSgpIHsKKyAgICAgICAgZmluYWwgbG9uZyBvbGRWYWx1ZSA9IG1DdXJyZW50VmFsdWU7CisgICAgICAgIG1DdXJyZW50VmFsdWUgPSBNYXRoLm1pbihtTWF4VmFsdWUsIChsb25nKSAobUN1cnJlbnRWYWx1ZSAqIG1NdWx0aXBsaWVyKSk7CisgICAgICAgIGlmIChvbGRWYWx1ZSAhPSBtQ3VycmVudFZhbHVlKSB7CisgICAgICAgICAgICBMb2cudyhUQUcsIG1OYW1lICsgIiBpbmNyZWFzZWQgZnJvbSAiICsgb2xkVmFsdWUgKyAibXMgdG8gIiArIG1DdXJyZW50VmFsdWUgKyAibXMgYXQgIgorICAgICAgICAgICAgICAgICAgICArIEpVbml0SGVscGVyLmdldEN1cnJlbnRUZXN0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gb2xkVmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUnVucyBhIHtAY29kZSBqb2J9IG1hbnkgdGltZXMgYmVmb3JlIGdpdmluZyB1cCwgc2xlZXBpbmcgYmV0d2VlbiBmYWlsZWQgYXR0ZW1wdHMgdXAgdG8KKyAgICAgKiB7QGxpbmsgI21zKCl9LgorICAgICAqCisgICAgICogQHBhcmFtIGRlc2NyaXB0aW9uIGRlc2NyaXB0aW9uIG9mIHRoZSBqb2IgZm9yIGxvZ2dpbmcgcHVycG9zZXMuCisgICAgICogQHBhcmFtIGpvYiBqb2IgdG8gYmUgcnVuLCBtdXN0IHJldHVybiB7QGNvZGUgbnVsbH0gaWYgaXQgZmFpbGVkIGFuZCBzaG91bGQgYmUgcmV0cmllZC4KKyAgICAgKiBAdGhyb3dzIFJldHJ5YWJsZUV4Y2VwdGlvbiBpZiBhbGwgYXR0ZW1wdHMgZmFpbGVkLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHtAY29kZSBkZXNjcmlwdGlvbn0gaXMge0Bjb2RlIG51bGx9IG9yIGVtcHR5LCBpZgorICAgICAqIHtAY29kZSBqb2J9IGlzIHtAY29kZSAgbnVsbH0sIG9yIGlmIHtAY29kZSBtYXhBdHRlbXB0c30gaXMgbGVzcyB0aGFuIDEuCisgICAgICogQHRocm93cyBFeGNlcHRpb24gYW55IG90aGVyIGV4Y2VwdGlvbiB0aHJvd24gYnkgaGVscGVyIG1ldGhvZHMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGpvYidzIHJlc3VsdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgPFQ+IFQgcnVuKFN0cmluZyBkZXNjcmlwdGlvbiwgQ2FsbGFibGU8VD4gam9iKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHJ1bihkZXNjcmlwdGlvbiwgMTAwLCBqb2IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJ1bnMgYSB7QGNvZGUgam9ifSBtYW55IHRpbWVzIGJlZm9yZSBnaXZpbmcgdXAsIHNsZWVwaW5nIGJldHdlZW4gZmFpbGVkIGF0dGVtcHRzIHVwIHRvCisgICAgICoge0BsaW5rICNtcygpfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiBvZiB0aGUgam9iIGZvciBsb2dnaW5nIHB1cnBvc2VzLgorICAgICAqIEBwYXJhbSBqb2Igam9iIHRvIGJlIHJ1biwgbXVzdCByZXR1cm4ge0Bjb2RlIG51bGx9IGlmIGl0IGZhaWxlZCBhbmQgc2hvdWxkIGJlIHJldHJpZWQuCisgICAgICogQHBhcmFtIHJldHJ5TXMgaG93IGxvbmcgdG8gc2xlZXAgYmV0d2VlbiBmYWlsdXJlcy4KKyAgICAgKiBAdGhyb3dzIFJldHJ5YWJsZUV4Y2VwdGlvbiBpZiBhbGwgYXR0ZW1wdHMgZmFpbGVkLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHtAY29kZSBkZXNjcmlwdGlvbn0gaXMge0Bjb2RlIG51bGx9IG9yIGVtcHR5LCBpZgorICAgICAqIHtAY29kZSBqb2J9IGlzIHtAY29kZSAgbnVsbH0sIG9yIGlmIHtAY29kZSBtYXhBdHRlbXB0c30gaXMgbGVzcyB0aGFuIDEuCisgICAgICogQHRocm93cyBFeGNlcHRpb24gYW55IG90aGVyIGV4Y2VwdGlvbiB0aHJvd24gYnkgaGVscGVyIG1ldGhvZHMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGpvYidzIHJlc3VsdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgPFQ+IFQgcnVuKFN0cmluZyBkZXNjcmlwdGlvbiwgbG9uZyByZXRyeU1zLCBDYWxsYWJsZTxUPiBqb2IpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoZGVzY3JpcHRpb24pKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJubyBkZXNjcmlwdGlvbiIpOworICAgICAgICB9CisgICAgICAgIGlmIChqb2IgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibm8gam9iIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJldHJ5TXMgPCAxKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJuZWVkIHRvIHNsZWVwIGF0IGxlYXN0IDFtcywgcmlnaHQ/Iik7CisgICAgICAgIH0KKyAgICAgICAgbG9uZyBzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgaW50IGF0dGVtcHQgPSAwOworICAgICAgICB3aGlsZSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydFRpbWUgPD0gbUN1cnJlbnRWYWx1ZSkgeworICAgICAgICAgICAgZmluYWwgVCByZXN1bHQgPSBqb2IuY2FsbCgpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gR29vZCBuZXdzLCBldmVyeW9uZTogam9iIHN1Y2NlZWRlZCBvbiBmaXJzdCBhdHRlbXB0IQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdHRlbXB0Kys7CisgICAgICAgICAgICBpZiAoVkVSQk9TRSkgeworICAgICAgICAgICAgICAgIExvZy52KFRBRywgZGVzY3JpcHRpb24gKyAiIGZhaWxlZCBhdCBhdHRlbXB0ICMiICsgYXR0ZW1wdCArICI7IHNsZWVwaW5nIGZvciAiCisgICAgICAgICAgICAgICAgICAgICAgICArIHJldHJ5TXMgKyAibXMgYmVmb3JlIHRyeWluZyBhZ2FpbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3lzdGVtQ2xvY2suc2xlZXAocmV0cnlNcyk7CisgICAgICAgICAgICByZXRyeU1zICo9IG1NdWx0aXBsaWVyOworICAgICAgICB9CisgICAgICAgIExvZy53KFRBRywgZGVzY3JpcHRpb24gKyAiIGZhaWxlZCBhZnRlciAiICsgYXR0ZW1wdCArICIgYXR0ZW1wdHMgYW5kICIKKyAgICAgICAgICAgICAgICArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0VGltZSkgKyAibXM6ICIgKyB0aGlzKTsKKyAgICAgICAgdGhyb3cgbmV3IFJldHJ5YWJsZUV4Y2VwdGlvbih0aGlzLCBkZXNjcmlwdGlvbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIG1OYW1lICsgIjogW2N1cnJlbnQ9IiArIG1DdXJyZW50VmFsdWUgKyAibXM7IG11bHRpcGxpZXI9IiArIG1NdWx0aXBsaWVyICsgIng7IG1heD0iCisgICAgICAgICAgICAgICAgKyBtTWF4VmFsdWUgKyAibXNdIjsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL1RpbWVvdXRUZXN0LmphdmEgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9UaW1lb3V0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YzY5ZTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9UaW1lb3V0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHM7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5hc3NlcnRGbG9hdDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi50cnV0aC5UcnV0aC5hc3NlcnRUaGF0OworCitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ud2hlbjsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0VGhyb3dzOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydC5leHBlY3RUaHJvd3M7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLm1vY2tpdG8uTW9jazsKK2ltcG9ydCBvcmcubW9ja2l0by5qdW5pdC5Nb2NraXRvSlVuaXRSdW5uZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsKKworQFJ1bldpdGgoTW9ja2l0b0pVbml0UnVubmVyLmNsYXNzKQorcHVibGljIGNsYXNzIFRpbWVvdXRUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIlRJTUUsIFkgVSBOTyBPVVQ/IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQyA9ICJzb21ldGhpbmciOworCisgICAgQE1vY2sKKyAgICBwcml2YXRlIENhbGxhYmxlPE9iamVjdD4gbUpvYjsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRDb25zdHJ1Y3RvcigpIHsKKyAgICAgICAgLy8gSW52YWxpZCBuYW1lCisgICAgICAgIGFzc2VydFRocm93cyhJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MsICgpLT4gbmV3IFRpbWVvdXQobnVsbCwgMSwgMiwgMikpOworICAgICAgICBhc3NlcnRUaHJvd3MoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzLCAoKS0+IG5ldyBUaW1lb3V0KCIiLCAxLCAyLCAyKSk7CisgICAgICAgIC8vIEludmFsaWQgaW5pdGlhbCB2YWx1ZQorICAgICAgICBhc3NlcnRUaHJvd3MoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzLCAoKS0+IG5ldyBUaW1lb3V0KE5BTUUsIC0xLCAyLCAyKSk7CisgICAgICAgIGFzc2VydFRocm93cyhJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MsICgpLT4gbmV3IFRpbWVvdXQoTkFNRSwgMCwgMiwgMikpOworICAgICAgICAvLyBJbnZhbGlkIG11bHRpcGxpZXIKKyAgICAgICAgYXNzZXJ0VGhyb3dzKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcywgKCktPiBuZXcgVGltZW91dChOQU1FLCAxLCAtMSwgMikpOworICAgICAgICBhc3NlcnRUaHJvd3MoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzLCAoKS0+IG5ldyBUaW1lb3V0KE5BTUUsIDEsIDAsIDIpKTsKKyAgICAgICAgYXNzZXJ0VGhyb3dzKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcywgKCktPiBuZXcgVGltZW91dChOQU1FLCAxLCAxLCAyKSk7CisgICAgICAgIC8vIEludmFsaWQgbWF4IHZhbHVlCisgICAgICAgIGFzc2VydFRocm93cyhJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MsICgpLT4gbmV3IFRpbWVvdXQoTkFNRSwgMSwgMiwgLTEpKTsKKyAgICAgICAgYXNzZXJ0VGhyb3dzKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcywgKCktPiBuZXcgVGltZW91dChOQU1FLCAxLCAyLCAwKSk7CisgICAgICAgIC8vIE1heCB2YWx1ZSBjYW5ub3QgYmUgbGVzcyB0aGFuIGluaXRpYWwKKyAgICAgICAgYXNzZXJ0VGhyb3dzKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcywgKCktPiBuZXcgVGltZW91dChOQU1FLCAyLCAyLCAxKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0dGVycygpIHsKKyAgICAgICAgZmluYWwgVGltZW91dCB0aW1lb3V0ID0gbmV3IFRpbWVvdXQoTkFNRSwgMSwgMiwgNSk7CisgICAgICAgIGFzc2VydFRoYXQodGltZW91dC5tcygpKS5pc0VxdWFsVG8oMSk7CisgICAgICAgIGFzc2VydEZsb2F0KHRpbWVvdXQuZ2V0TXVsdGlwbGllcigpLCAyKTsKKyAgICAgICAgYXNzZXJ0VGhhdCh0aW1lb3V0LmdldE1heFZhbHVlKCkpLmlzRXF1YWxUbyg1KTsKKyAgICAgICAgYXNzZXJ0VGhhdCh0aW1lb3V0LmdldE5hbWUoKSkuaXNFcXVhbFRvKE5BTUUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEluY3JlYXNlKCkgeworICAgICAgICBmaW5hbCBUaW1lb3V0IHRpbWVvdXQgPSBuZXcgVGltZW91dChOQU1FLCAxLCAyLCA1KTsKKyAgICAgICAgLy8gUHJlLW1heGltdW0KKyAgICAgICAgYXNzZXJ0VGhhdCh0aW1lb3V0LmluY3JlYXNlKCkpLmlzRXF1YWxUbygxKTsKKyAgICAgICAgYXNzZXJ0VGhhdCh0aW1lb3V0Lm1zKCkpLmlzRXF1YWxUbygyKTsKKyAgICAgICAgYXNzZXJ0VGhhdCh0aW1lb3V0LmluY3JlYXNlKCkpLmlzRXF1YWxUbygyKTsKKyAgICAgICAgYXNzZXJ0VGhhdCh0aW1lb3V0Lm1zKCkpLmlzRXF1YWxUbyg0KTsKKyAgICAgICAgLy8gUG9zdC1tYXhpbXVtCisgICAgICAgIGFzc2VydFRoYXQodGltZW91dC5pbmNyZWFzZSgpKS5pc0VxdWFsVG8oNCk7CisgICAgICAgIGFzc2VydFRoYXQodGltZW91dC5tcygpKS5pc0VxdWFsVG8oNSk7CisgICAgICAgIGFzc2VydFRoYXQodGltZW91dC5pbmNyZWFzZSgpKS5pc0VxdWFsVG8oNSk7CisgICAgICAgIGFzc2VydFRoYXQodGltZW91dC5tcygpKS5pc0VxdWFsVG8oNSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UnVuX2ludmFsaWRBcmdzKCkgeworICAgICAgICBmaW5hbCBUaW1lb3V0IHRpbWVvdXQgPSBuZXcgVGltZW91dChOQU1FLCAxLCAyLCA1KTsKKyAgICAgICAgLy8gSW52YWxpZCBkZXNjcmlwdGlvbgorICAgICAgICBhc3NlcnRUaHJvd3MoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzLCAoKS0+IHRpbWVvdXQucnVuKG51bGwsIG1Kb2IpKTsKKyAgICAgICAgYXNzZXJ0VGhyb3dzKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcywgKCktPiB0aW1lb3V0LnJ1bigiIiwgbUpvYikpOworICAgICAgICAvLyBJbnZhbGlkIG1heCBhdHRlbXB0cworICAgICAgICBhc3NlcnRUaHJvd3MoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzLCAoKS0+IHRpbWVvdXQucnVuKERFU0MsIC0xLCBtSm9iKSk7CisgICAgICAgIGFzc2VydFRocm93cyhJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MsICgpLT4gdGltZW91dC5ydW4oREVTQywgMCwgbUpvYikpOworICAgICAgICAvLyBJbnZhbGlkIGpvYgorICAgICAgICBhc3NlcnRUaHJvd3MoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzLCAoKS0+IHRpbWVvdXQucnVuKERFU0MsIG51bGwpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSdW5fc3VjY2Vzc09uRmlyc3RBdHRlbXB0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFRpbWVvdXQgdGltZW91dCA9IG5ldyBUaW1lb3V0KE5BTUUsIDEwMCwgMiwgNTAwKTsKKyAgICAgICAgZmluYWwgT2JqZWN0IHJlc3VsdCA9IG5ldyBPYmplY3QoKTsKKyAgICAgICAgd2hlbihtSm9iLmNhbGwoKSkudGhlblJldHVybihyZXN1bHQpOworICAgICAgICBhc3NlcnRUaGF0KHRpbWVvdXQucnVuKERFU0MsIDEsIG1Kb2IpKS5pc1NhbWVBcyhyZXN1bHQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJ1bl9zdWNjZXNzT25TZWNvbmRBdHRlbXB0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFRpbWVvdXQgdGltZW91dCA9IG5ldyBUaW1lb3V0KE5BTUUsIDEwMCwgMiwgNTAwKTsKKyAgICAgICAgZmluYWwgT2JqZWN0IHJlc3VsdCA9IG5ldyBPYmplY3QoKTsKKyAgICAgICAgd2hlbihtSm9iLmNhbGwoKSkudGhlblJldHVybigoT2JqZWN0KSBudWxsLCByZXN1bHQpOworICAgICAgICBhc3NlcnRUaGF0KHRpbWVvdXQucnVuKERFU0MsIDEwLCBtSm9iKSkuaXNTYW1lQXMocmVzdWx0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSdW5fYWxsQXR0ZW1wdHNGYWlsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgVGltZW91dCB0aW1lb3V0ID0gbmV3IFRpbWVvdXQoTkFNRSwgMTAwLCAyLCA1MDApOworICAgICAgICBmaW5hbCBSZXRyeWFibGVFeGNlcHRpb24gZSA9IGV4cGVjdFRocm93cyhSZXRyeWFibGVFeGNlcHRpb24uY2xhc3MsCisgICAgICAgICAgICAgICAgKCkgLT4gdGltZW91dC5ydW4oREVTQywgMTAsIG1Kb2IpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlLmdldE1lc3NhZ2UoKSkuY29udGFpbnMoREVTQyk7CisgICAgICAgIGFzc2VydFRoYXQoZS5nZXRUaW1lb3V0KCkpLmlzU2FtZUFzKHRpbWVvdXQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL1RpbWVvdXRzLmphdmEgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9UaW1lb3V0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1OWQxYTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9UaW1lb3V0cy5qYXZhCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0czsKKworLyoqCisgKiBUaW1lb3V0cyBmb3IgY29tbW9uIHRhc2tzLgorICovCitmaW5hbCBjbGFzcyBUaW1lb3V0cyB7CisKKyAgICAvKioKKyAgICAgKiBUaW1lb3V0IHVudGlsIGZyYW1ld29yayBiaW5kcyAvIHVuYmluZHMgZnJvbSBzZXJ2aWNlLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBUaW1lb3V0IENPTk5FQ1RJT05fVElNRU9VVCA9IG5ldyBUaW1lb3V0KCJDT05ORUNUSU9OX1RJTUVPVVQiLCA1MDAwLCAyRiwgMTAwMDApOworCisgICAgLyoqCisgICAgICogVGltZW91dCB1bnRpbCBmcmFtZXdvcmsgdW5iaW5kcyBmcm9tIGEgc2VydmljZS4KKyAgICAgKi8KKyAgICAvLyBUT0RPOiBtdXN0IGJlIGhpZ2hlciB0aGFuIFJlbW90ZUZpbGxTZXJ2aWNlLlRJTUVPVVRfSURMRV9CSU5EX01JTExJUywgc28gd2Ugc2hvdWxkIHVzZSBhCisgICAgLy8gQGhpZGRlbiBAVGVzdGluZyBjb25zdGFudHMgaW5zdGVhZC4uLgorICAgIHN0YXRpYyBmaW5hbCBUaW1lb3V0IElETEVfVU5CSU5EX1RJTUVPVVQgPSBuZXcgVGltZW91dCgiSURMRV9VTkJJTkRfVElNRU9VVCIsIDEwMDAwLCAyRiwgMTAwMDApOworCisgICAgLyoqCisgICAgICogVGltZW91dCB0byBnZXQgdGhlIGV4cGVjdGVkIG51bWJlciBvZiBmaWxsIGV2ZW50cy4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgVGltZW91dCBGSUxMX0VWRU5UU19USU1FT1VUID0gbmV3IFRpbWVvdXQoIkZJTExfRVZFTlRTX1RJTUVPVVQiLCA1MDAwLCAyRiwgMTAwMDApOworCisgICAgLyoqCisgICAgICogVGltZW91dCBmb3IgZXhwZWN0ZWQgYXV0b2ZpbGwgcmVxdWVzdHMuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIFRpbWVvdXQgRklMTF9USU1FT1VUID0gbmV3IFRpbWVvdXQoIkZJTExfVElNRU9VVCIsIDUwMDAsIDJGLCAxMDAwMCk7CisKKyAgICAvKioKKyAgICAgKiBUaW1lb3V0IGZvciBleHBlY3RlZCBzYXZlIHJlcXVlc3RzLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBUaW1lb3V0IFNBVkVfVElNRU9VVCA9IG5ldyBUaW1lb3V0KCJTQVZFX1RJTUVPVVQiLCA1MDAwLCAyRiwgMTAwMDApOworCisgICAgLyoqCisgICAgICogVGltZW91dCB1c2VkIHdoZW4gc2F2ZSBpcyBub3QgZXhwZWN0ZWQgdG8gYmUgc2hvd24gLSB0ZXN0IHdpbGwgc2xlZXAgZm9yIHRoYXQgYW1vdW50IG9mIHRpbWUKKyAgICAgKiBhcyB0aGVyZSBpcyBubyBjYWxsYmFjayB0aGF0IGJlIHJlY2VpdmVkIHRvIGFzc2VydCBpdCdzIG5vdCBzaG93bi4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgbG9uZyBTQVZFX05PVF9TSE9XTl9OQVBUSU1FX01TID0gNTAwMDsKKworICAgIC8qKgorICAgICAqIFRpbWVvdXQgZm9yIFVJIG9wZXJhdGlvbnMuIFR5cGljYWxseSB1c2VkIGJ5IHtAbGluayBVaUJvdH0uCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIFRpbWVvdXQgVUlfVElNRU9VVCA9IG5ldyBUaW1lb3V0KCJVSV9USU1FT1VUIiwgNTAwMCwgMkYsIDEwMDAwKTsKKworICAgIC8qKgorICAgICAqIFRpbWVvdXQgZm9yIHdlYnZpZXcgb3BlcmF0aW9ucy4gVHlwaWNhbGx5IHVzZWQgYnkge0BsaW5rIFVpQm90fS4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgVGltZW91dCBXRUJWSUVXX1RJTUVPVVQgPSBuZXcgVGltZW91dCgiV0VCVklFV19USU1FT1VUIiwgODAwMCwgMkYsIDE2MDAwKTsKKworICAgIC8qKgorICAgICAqIFRpbWVvdXQgZm9yIHNob3dpbmcgdGhlIGF1dG9maWxsIGRhdGFzZXQgcGlja2VyIFVJLgorICAgICAqCisgICAgICogPHA+VGhlIHZhbHVlIGlzIHVzdWFsbHkgaGlnaGVyIHRoYW4ge0BsaW5rICNVSV9USU1FT1VUfSBiZWNhdXNlIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUKKyAgICAgKiBkYXRhc2V0IHBpY2tlciBVSSBjYW4gYmUgYWZmZWN0IGJ5IGV4dGVybmFsIGZhY3RvcnMgaW4gc29tZSBsb3ctbGV2ZWwgZGV2aWNlcy4KKyAgICAgKgorICAgICAqIDxwPlR5cGljYWxseSB1c2VkIGJ5IHtAbGluayBVaUJvdH0uCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIFRpbWVvdXQgVUlfREFUQVNFVF9QSUNLRVJfVElNRU9VVCA9CisgICAgICAgICAgICBuZXcgVGltZW91dCgiVUlfREFUQVNFVF9QSUNLRVJfVElNRU9VVCIsIDUwMDAsIDJGLCAxMDAwMCk7CisKKyAgICAvKioKKyAgICAgKiBUaW1lb3V0IHVzZWQgd2hlbiB0aGUgZGF0YXNldCBwaWNrZXIgaXMgbm90IGV4cGVjdGVkIHRvIGJlIHNob3duIC0gdGVzdCB3aWxsIHNsZWVwIGZvciB0aGF0CisgICAgICogYW1vdW50IG9mIHRpbWUgYXMgdGhlcmUgaXMgbm8gY2FsbGJhY2sgdGhhdCBiZSByZWNlaXZlZCB0byBhc3NlcnQgaXQncyBub3Qgc2hvd24uCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGxvbmcgREFUQVNFVF9QSUNLRVJfTk9UX1NIT1dOX05BUFRJTUVfTVMgPSA1MDAwOworCisgICAgLyoqCisgICAgICogVGltZW91dCAoaW4gbWlsbGlzZWNvbmRzKSBmb3IgYW4gYWN0aXZpdHkgdG8gYmUgYnJvdWdodCBvdXQgdG8gdG9wLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBUaW1lb3V0IEFDVElWSVRZX1JFU1VSUkVDVElPTiA9CisgICAgICAgICAgICBuZXcgVGltZW91dCgiQUNUSVZJVFlfUkVTVVJSRUNUSU9OIiwgNjAwMCwgM0YsIDIwMDAwKTsKKworICAgIC8qKgorICAgICAqIFRpbWVvdXQgZm9yIGNoYW5naW5nIHRoZSBzY3JlZW4gb3JpZW50YXRpb24uCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIFRpbWVvdXQgVUlfU0NSRUVOX09SSUVOVEFUSU9OX1RJTUVPVVQgPQorICAgICAgICAgICAgbmV3IFRpbWVvdXQoIlVJX1NDUkVFTl9PUklFTlRBVElPTl9USU1FT1VUIiwgNTAwMCwgMkYsIDEwMDAwKTsKKworICAgIHByaXZhdGUgVGltZW91dHMoKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY29udGFpbiBzdGF0aWMgbWV0aG9kcyBvbmx5Iik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvVWlCb3QuamF2YSBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL1VpQm90LmphdmEKaW5kZXggYzg0NDExYi4uMWZlOTk4ZSAxMDA2NDQKLS0tIGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvVWlCb3QuamF2YQorKysgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9VaUJvdC5qYXZhCkBAIC0xNiwxMSArMTYsMTIgQEAKIAogcGFja2FnZSBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHM7CiAKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5OT1RfU0hPV0lOR19USU1FT1VUX01TOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSGVscGVyLlNBVkVfVElNRU9VVF9NUzsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5VSV9SRUNFTlRTX1NXSVRDSF9USU1FT1VUX01TOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSGVscGVyLlVJX1RJTUVPVVRfTVM7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5IZWxwZXIucnVuU2hlbGxDb21tYW5kOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuVGltZW91dHMuREFUQVNFVF9QSUNLRVJfTk9UX1NIT1dOX05BUFRJTUVfTVM7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5UaW1lb3V0cy5TQVZFX05PVF9TSE9XTl9OQVBUSU1FX01TOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuVGltZW91dHMuU0FWRV9USU1FT1VUOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuVGltZW91dHMuVUlfREFUQVNFVF9QSUNLRVJfVElNRU9VVDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLlRpbWVvdXRzLlVJX1NDUkVFTl9PUklFTlRBVElPTl9USU1FT1VUOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuVGltZW91dHMuVUlfVElNRU9VVDsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2aWNlLmF1dG9maWxsLlNhdmVJbmZvLlNBVkVfREFUQV9UWVBFX0FERFJFU1M7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmljZS5hdXRvZmlsbC5TYXZlSW5mby5TQVZFX0RBVEFfVFlQRV9DUkVESVRfQ0FSRDsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2aWNlLmF1dG9maWxsLlNhdmVJbmZvLlNBVkVfREFUQV9UWVBFX0VNQUlMX0FERFJFU1M7CkBAIC0zMSwxMiArMzIsMTEgQEAKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24udHJ1dGguVHJ1dGguYXNzZXJ0VGhhdDsKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24udHJ1dGguVHJ1dGguYXNzZXJ0V2l0aE1lc3NhZ2U7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc3VtZS5hc3N1bWVUcnVlOwotCiBpbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOwogaW1wb3J0IGFuZHJvaWQuYXBwLlVpQXV0b21hdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwogaW1wb3J0IGFuZHJvaWQuc2VydmljZS5hdXRvZmlsbC5TYXZlSW5mbzsKIGltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC51aWF1dG9tYXRvci5CeTsKQEAgLTQ2LDIzICs0NiwzNCBAQAogaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLlVudGlsOwogaW1wb3J0IGFuZHJvaWQudGV4dC5IdG1sOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlXaW5kb3dJbmZvOwogCitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5Ob25OdWxsOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTnVsbGFibGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVvdXRFeGNlcHRpb247CiAKIC8qKgogICogSGVscGVyIGZvciBVSS1yZWxhdGVkIG5lZWRzLgogICovCiBmaW5hbCBjbGFzcyBVaUJvdCB7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkF1dG9GaWxsQ3RzVWlCb3QiOworCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX0lEX0RBVEFTRVRfUElDS0VSID0gImF1dG9maWxsX2RhdGFzZXRfcGlja2VyIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfSURfREFUQVNFVF9IRUFERVIgPSAiYXV0b2ZpbGxfZGF0YXNldF9oZWFkZXIiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9JRF9TQVZFX1NOQUNLQkFSID0gImF1dG9maWxsX3NhdmUiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9JRF9TQVZFX0lDT04gPSAiYXV0b2ZpbGxfc2F2ZV9pY29uIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfSURfU0FWRV9USVRMRSA9ICJhdXRvZmlsbF9zYXZlX3RpdGxlIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfSURfQ09OVEVYVF9NRU5VSVRFTSA9ICJmbG9hdGluZ190b29sYmFyX21lbnVfaXRlbV90ZXh0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfSURfU0FWRV9CVVRUT05fTk8gPSAiYXV0b2ZpbGxfc2F2ZV9ubyI7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfU1RSSU5HX1NBVkVfVElUTEUgPSAiYXV0b2ZpbGxfc2F2ZV90aXRsZSI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX1NUUklOR19TQVZFX1RJVExFX1dJVEhfVFlQRSA9CkBAIC03NCwxNiArODUsMjYgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfU1RSSU5HX1NBVkVfVFlQRV9VU0VSTkFNRSA9ICJhdXRvZmlsbF9zYXZlX3R5cGVfdXNlcm5hbWUiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9TVFJJTkdfU0FWRV9UWVBFX0VNQUlMX0FERFJFU1MgPQogICAgICAgICAgICAgImF1dG9maWxsX3NhdmVfdHlwZV9lbWFpbF9hZGRyZXNzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfU1RSSU5HX1NBVkVfQlVUVE9OX05PVF9OT1cgPSAic2F2ZV9wYXNzd29yZF9ub3Rub3ciOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9TVFJJTkdfU0FWRV9CVVRUT05fTk9fVEhBTktTID0gImF1dG9maWxsX3NhdmVfbm8iOworCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX1NUUklOR19BVVRPRklMTCA9ICJhdXRvZmlsbCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX1NUUklOR19EQVRBU0VUX1BJQ0tFUl9BQ0NFU1NJQklMSVRZX1RJVExFID0KICAgICAgICAgICAgICJhdXRvZmlsbF9waWNrZXJfYWNjZXNzaWJpbGl0eV90aXRsZSI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX1NUUklOR19TQVZFX1NOQUNLQkFSX0FDQ0VTU0lCSUxJVFlfVElUTEUgPQogICAgICAgICAgICAgImF1dG9maWxsX3NhdmVfYWNjZXNzaWJpbGl0eV90aXRsZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX0JPT0xFQU5fQ09ORklHX0ZPUkNFX0RFRkFVTFRfT1JJRU5UQVRJT04gPQotICAgICAgICAgICAgImNvbmZpZ19mb3JjZURlZmF1bHRPcmllbnRhdGlvbiI7CiAKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQXV0b0ZpbGxDdHNVaUJvdCI7CisgICAgc3RhdGljIGZpbmFsIEJ5U2VsZWN0b3IgREFUQVNFVF9QSUNLRVJfU0VMRUNUT1IgPSBCeS5yZXMoImFuZHJvaWQiLCBSRVNPVVJDRV9JRF9EQVRBU0VUX1BJQ0tFUik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQnlTZWxlY3RvciBTQVZFX1VJX1NFTEVDVE9SID0gQnkucmVzKCJhbmRyb2lkIiwgUkVTT1VSQ0VfSURfU0FWRV9TTkFDS0JBUik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQnlTZWxlY3RvciBEQVRBU0VUX0hFQURFUl9TRUxFQ1RPUiA9CisgICAgICAgICAgICBCeS5yZXMoImFuZHJvaWQiLCBSRVNPVVJDRV9JRF9EQVRBU0VUX0hFQURFUik7CisKKyAgICAvLyBUT0RPOiBmaWd1cmUgb3V0IGEgbW9yZSByZWxpYWJsZSBzb2x1dGlvbiB0aGF0IGRvZXMgbm90IGRlcGVuZCBvbiBTeXN0ZW1VSSByZXNvdXJjZXMuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNQTElUX1dJTkRPV19ESVZJREVSX0lEID0KKyAgICAgICAgICAgICJjb20uYW5kcm9pZC5zeXN0ZW11aTppZC9kb2NrZWRfZGl2aWRlcl9iYWNrZ3JvdW5kIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gRFVNUF9PTl9FUlJPUiA9IHRydWU7CiAKICAgICAvKiogUGFzcyB0byB7QGxpbmsgI3NldFNjcmVlbk9yaWVudGF0aW9uKGludCl9IHRvIGNoYW5nZSB0aGUgZGlzcGxheSB0byBwb3J0cmFpdCBtb2RlICovCiAgICAgcHVibGljIHN0YXRpYyBpbnQgUE9SVFJBSVQgPSAwOwpAQCAtOTEsMzkgKzExMiw4MiBAQAogICAgIC8qKiBQYXNzIHRvIHtAbGluayAjc2V0U2NyZWVuT3JpZW50YXRpb24oaW50KX0gdG8gY2hhbmdlIHRoZSBkaXNwbGF5IHRvIGxhbmRzY2FwZSBtb2RlICovCiAgICAgcHVibGljIHN0YXRpYyBpbnQgTEFORFNDQVBFID0gMTsKIAotCiAgICAgcHJpdmF0ZSBmaW5hbCBVaURldmljZSBtRGV2aWNlOwogICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtUGFja2FnZU5hbWU7CiAgICAgcHJpdmF0ZSBmaW5hbCBVaUF1dG9tYXRpb24gbUF1dG9tYW47CisgICAgcHJpdmF0ZSBmaW5hbCBUaW1lb3V0IG1EZWZhdWx0VGltZW91dDsKIAotICAgIFVpQm90KEluc3RydW1lbnRhdGlvbiBpbnN0cnVtZW50YXRpb24pIHRocm93cyBFeGNlcHRpb24geworICAgIHByaXZhdGUgYm9vbGVhbiBtT2tUb0NhbGxBc3NlcnROb0RhdGFzZXRzOworCisgICAgVWlCb3QoKSB7CisgICAgICAgIHRoaXMoVUlfVElNRU9VVCk7CisgICAgfQorCisgICAgVWlCb3QoVGltZW91dCBkZWZhdWx0VGltZW91dCkgeworICAgICAgICBtRGVmYXVsdFRpbWVvdXQgPSBkZWZhdWx0VGltZW91dDsKKyAgICAgICAgZmluYWwgSW5zdHJ1bWVudGF0aW9uIGluc3RydW1lbnRhdGlvbiA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpOwogICAgICAgICBtRGV2aWNlID0gVWlEZXZpY2UuZ2V0SW5zdGFuY2UoaW5zdHJ1bWVudGF0aW9uKTsKICAgICAgICAgbUNvbnRleHQgPSBpbnN0cnVtZW50YXRpb24uZ2V0Q29udGV4dCgpOwogICAgICAgICBtUGFja2FnZU5hbWUgPSBtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpOwogICAgICAgICBtQXV0b21hbiA9IGluc3RydW1lbnRhdGlvbi5nZXRVaUF1dG9tYXRpb24oKTsKICAgICB9CiAKLSAgICB2b2lkIGFzc3VtZU1pbmltdW1SZXNvbHV0aW9uKGludCBtaW5TaXplKSB7Ci0gICAgICAgIGZpbmFsIGludCB3aWR0aCA9IG1EZXZpY2UuZ2V0RGlzcGxheVdpZHRoKCk7Ci0gICAgICAgIGZpbmFsIGludCBoZWlndGggPSBtRGV2aWNlLmdldERpc3BsYXlIZWlnaHQoKTsKLSAgICAgICAgZmluYWwgaW50IG1pbiA9IE1hdGgubWluKHdpZHRoLCBoZWlndGgpOwotICAgICAgICBhc3N1bWVUcnVlKCJTY3JlZW4gc2l6ZSBpcyB0b28gc21hbGwgKCIgKyB3aWR0aCArICJ4IiArIGhlaWd0aCArICIpIiwgbWluID49IG1pblNpemUpOworICAgIHZvaWQgcmVzZXQoKSB7CisgICAgICAgIG1Pa1RvQ2FsbEFzc2VydE5vRGF0YXNldHMgPSBmYWxzZTsKKyAgICB9CisKKyAgICBVaURldmljZSBnZXREZXZpY2UoKSB7CisgICAgICAgIHJldHVybiBtRGV2aWNlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFzc2VydHMgdGhlIGRhdGFzZXQgY2hvb3NlciBpcyBub3Qgc2hvd24uCisgICAgICogQXNzZXJ0cyB0aGUgZGF0YXNldCBwaWNrZXIgaXMgbm90IHNob3duIGFueW1vcmUuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBjYWxsZWQgKmJlZm9yZSogYW4gYXNzZXJ0aW9uIHdhcyBtYWRlIHRvIG1ha2Ugc3VyZSB0aGUKKyAgICAgKiBkYXRhc2V0IHBpY2tlciBpcyBzaG93biAtIGlmIHRoYXQncyBub3QgdGhlIGNhc2UsIGNhbGwKKyAgICAgKiB7QGxpbmsgI2Fzc2VydE5vRGF0YXNldHNFdmVyKCl9IGluc3RlYWQuCiAgICAgICovCi0gICAgdm9pZCBhc3NlcnROb0RhdGFzZXRzKCkgewotICAgICAgICBmaW5hbCBVaU9iamVjdDIgcGlja2VyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcGlja2VyID0gZmluZERhdGFzZXRQaWNrZXIoTk9UX1NIT1dJTkdfVElNRU9VVF9NUyk7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICAvLyBVc2UgYSBtb3JlIGVsZWdhbnQgY2hlY2sgdGhhbiBjYXRjaGluZyB0aGUgZXhwZWN0aW9uIGJlY2F1c2UgaXQncyBub3Qgc2hvd2luZy4uLgotICAgICAgICAgICAgcmV0dXJuOworICAgIHZvaWQgYXNzZXJ0Tm9EYXRhc2V0cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIW1Pa1RvQ2FsbEFzc2VydE5vRGF0YXNldHMpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgY2FsbCBhc3NlcnROb0RhdGFzZXRzKCkgd2l0aG91dCBjYWxsaW5nIGFzc2VydERhdGFzZXRzIGZpcnN0Iik7CiAgICAgICAgIH0KLSAgICAgICAgdGhyb3cgbmV3IFJldHJ5YWJsZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiU2hvdWxkIG5vdCBiZSBzaG93aW5nIGRhdGFzZXRzLCBidXQgZ290ICIgKyBnZXRDaGlsZHJlbkFzVGV4dChwaWNrZXIpKTsKKyAgICAgICAgbURldmljZS53YWl0KFVudGlsLmdvbmUoREFUQVNFVF9QSUNLRVJfU0VMRUNUT1IpLCBVSV9EQVRBU0VUX1BJQ0tFUl9USU1FT1VULm1zKCkpOworICAgICAgICBtT2tUb0NhbGxBc3NlcnROb0RhdGFzZXRzID0gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNzZXJ0cyB0aGUgZGF0YXNldCBwaWNrZXIgd2FzIG5ldmVyIHNob3duLgorICAgICAqCisgICAgICogPHA+VGhpcyBtZXRob2QgaXMgc2xvd2VyIHRoYW4ge0BsaW5rICNhc3NlcnROb0RhdGFzZXRzKCl9IGFuZCBzaG91bGQgb25seSBiZSBjYWxsZWQgaW4gdGhlCisgICAgICogY2FzZXMgd2hlcmUgdGhlIGRhdGFzZXQgcGlja2VyIHdhcyBub3QgcHJldmlvdXMgc2hvd24uCisgICAgICovCisgICAgdm9pZCBhc3NlcnROb0RhdGFzZXRzRXZlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnROZXZlclNob3duKCJkYXRhc2V0IHBpY2tlciIsIERBVEFTRVRfUElDS0VSX1NFTEVDVE9SLAorICAgICAgICAgICAgICAgIERBVEFTRVRfUElDS0VSX05PVF9TSE9XTl9OQVBUSU1FX01TKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBc3NlcnRzIHRoZSBkYXRhc2V0IGNob29zZXIgaXMgc2hvd24gYW5kIGNvbnRhaW5zIGV4YWN0bHkgdGhlIGdpdmVuIGRhdGFzZXRzLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgZGF0YXNldCBwaWNrZXIgb2JqZWN0LgorICAgICAqLworICAgIFVpT2JqZWN0MiBhc3NlcnREYXRhc2V0cyhTdHJpbmcuLi5uYW1lcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFRPRE86IGNoYW5nZSBydW4oKSBzbyBpdCBjYW4gcmV0aHJvdyB0aGUgb3JpZ2luYWwgbWVzc2FnZQorICAgICAgICByZXR1cm4gVUlfREFUQVNFVF9QSUNLRVJfVElNRU9VVC5ydW4oImFzc2VydERhdGFzZXRzOiAiICsgQXJyYXlzLnRvU3RyaW5nKG5hbWVzKSwgKCkgLT4geworICAgICAgICAgICAgZmluYWwgVWlPYmplY3QyIHBpY2tlciA9IGZpbmREYXRhc2V0UGlja2VyKFVJX0RBVEFTRVRfUElDS0VSX1RJTUVPVVQpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiB1c2UgYSBsaWJyYXJ5IHRvIGNoZWNrIGl0IGNvbnRhaW5zLCBpbnN0ZWFkIG9mIGFzc2VyVGhhdCArIGNhdGNoIGV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJ3cm9uZyBkYXRhc2V0IG5hbWVzIikudGhhdChnZXRDaGlsZHJlbkFzVGV4dChwaWNrZXIpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmNvbnRhaW5zRXhhY3RseUVsZW1lbnRzSW4oQXJyYXlzLmFzTGlzdChuYW1lcykpLmluT3JkZXIoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcGlja2VyOworICAgICAgICAgICAgfSBjYXRjaCAoQXNzZXJ0aW9uRXJyb3IgZSkgeworICAgICAgICAgICAgICAgIC8vIFZhbHVlIG1pc21hdGNoIC0gbW9zdCBsaWtlbHkgVUkgZGlkbid0IGNoYW5nZSB5ZXQsIHRyeSBhZ2FpbgorICAgICAgICAgICAgICAgIExvZy53KFRBRywgImRhdGFzZXRzIGRvbid0IG1hdGNoIHlldDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMzEsMTAgKzE5NSw1MCBAQAogICAgICAqCiAgICAgICogQHJldHVybiB0aGUgZGF0YXNldCBwaWNrZXIgb2JqZWN0LgogICAgICAqLwotICAgIFVpT2JqZWN0MiBhc3NlcnREYXRhc2V0cyhTdHJpbmcuLi5uYW1lcykgewotICAgICAgICBmaW5hbCBVaU9iamVjdDIgcGlja2VyID0gZmluZERhdGFzZXRQaWNrZXIoKTsKLSAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoIndyb25nIGRhdGFzZXQgbmFtZXMiKS50aGF0KGdldENoaWxkcmVuQXNUZXh0KHBpY2tlcikpCi0gICAgICAgICAgICAgICAgLmNvbnRhaW5zRXhhY3RseUVsZW1lbnRzSW4oQXJyYXlzLmFzTGlzdChuYW1lcykpOworICAgIFVpT2JqZWN0MiBhc3NlcnREYXRhc2V0c0NvbnRhaW5zKFN0cmluZy4uLm5hbWVzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gVE9ETzogY2hhbmdlIHJ1bigpIHNvIGl0IGNhbiByZXRocm93IHRoZSBvcmlnaW5hbCBtZXNzYWdlCisgICAgICAgIHJldHVybiBVSV9EQVRBU0VUX1BJQ0tFUl9USU1FT1VULnJ1bigiYXNzZXJ0RGF0YXNldHM6ICIgKyBBcnJheXMudG9TdHJpbmcobmFtZXMpLCAoKSAtPiB7CisgICAgICAgICAgICBmaW5hbCBVaU9iamVjdDIgcGlja2VyID0gZmluZERhdGFzZXRQaWNrZXIoVUlfREFUQVNFVF9QSUNLRVJfVElNRU9VVCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IHVzZSBhIGxpYnJhcnkgdG8gY2hlY2sgaXQgY29udGFpbnMsIGluc3RlYWQgb2YgYXNzZXJUaGF0ICsgY2F0Y2ggZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoIndyb25nIGRhdGFzZXQgbmFtZXMiKS50aGF0KGdldENoaWxkcmVuQXNUZXh0KHBpY2tlcikpCisgICAgICAgICAgICAgICAgLmNvbnRhaW5zQWxsSW4oQXJyYXlzLmFzTGlzdChuYW1lcykpLmluT3JkZXIoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcGlja2VyOworICAgICAgICAgICAgfSBjYXRjaCAoQXNzZXJ0aW9uRXJyb3IgZSkgeworICAgICAgICAgICAgICAgIC8vIFZhbHVlIG1pc21hdGNoIC0gbW9zdCBsaWtlbHkgVUkgZGlkbid0IGNoYW5nZSB5ZXQsIHRyeSBhZ2FpbgorICAgICAgICAgICAgICAgIExvZy53KFRBRywgImRhdGFzZXRzIGRvbid0IG1hdGNoIHlldDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNzZXJ0cyB0aGUgZGF0YXNldCBjaG9vc2VyIGlzIHNob3duIGFuZCBjb250YWlucyB0aGUgZ2l2ZW4gZGF0YXNldHMsIGhlYWRlciwgYW5kIGZvb3Rlci4KKyAgICAgKiA8cD5JbiBmdWxsc2NyZWVuLCBoZWFkZXIgdmlldyBpcyBub3QgdW5kZXIgUi5pZC5hdXRvZmlsbF9kYXRhc2V0X3BpY2tlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGRhdGFzZXQgcGlja2VyIG9iamVjdC4KKyAgICAgKi8KKyAgICBVaU9iamVjdDIgYXNzZXJ0RGF0YXNldHNXaXRoQm9yZGVycyhTdHJpbmcgaGVhZGVyLCBTdHJpbmcgZm9vdGVyLCBTdHJpbmcuLi5uYW1lcykKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBVaU9iamVjdDIgcGlja2VyID0gZmluZERhdGFzZXRQaWNrZXIoVUlfREFUQVNFVF9QSUNLRVJfVElNRU9VVCk7CisgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBleHBlY3RlZENoaWxkID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGlmIChoZWFkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKEhlbHBlci5pc0F1dG9maWxsV2luZG93RnVsbFNjcmVlbihtQ29udGV4dCkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBVaU9iamVjdDIgaGVhZGVyVmlldyA9IHdhaXRGb3JPYmplY3QoREFUQVNFVF9IRUFERVJfU0VMRUNUT1IsCisgICAgICAgICAgICAgICAgICAgICAgICBVSV9EQVRBU0VUX1BJQ0tFUl9USU1FT1VUKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiZnVsbHNjcmVlbiB3cm9uZyBkYXRhc2V0IGhlYWRlciIpCisgICAgICAgICAgICAgICAgICAgICAgICAudGhhdChnZXRDaGlsZHJlbkFzVGV4dChoZWFkZXJWaWV3KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5jb250YWluc0V4YWN0bHlFbGVtZW50c0luKEFycmF5cy5hc0xpc3QoaGVhZGVyKSkuaW5PcmRlcigpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBleHBlY3RlZENoaWxkLmFkZChoZWFkZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGV4cGVjdGVkQ2hpbGQuYWRkQWxsKEFycmF5cy5hc0xpc3QobmFtZXMpKTsKKyAgICAgICAgaWYgKGZvb3RlciAhPSBudWxsKSB7CisgICAgICAgICAgICBleHBlY3RlZENoaWxkLmFkZChmb290ZXIpOworICAgICAgICB9CisgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJ3cm9uZyBlbGVtZW50cyBvbiBkYXRhc2V0IHBpY2tlciIpLnRoYXQoZ2V0Q2hpbGRyZW5Bc1RleHQocGlja2VyKSkKKyAgICAgICAgICAgICAgICAuY29udGFpbnNFeGFjdGx5RWxlbWVudHNJbihleHBlY3RlZENoaWxkKS5pbk9yZGVyKCk7CiAgICAgICAgIHJldHVybiBwaWNrZXI7CiAgICAgfQogCkBAIC0xNjAsOCArMjY0LDggQEAKICAgICAvKioKICAgICAgKiBTZWxlY3RzIGEgZGF0YXNldCB0aGF0IHNob3VsZCBiZSB2aXNpYmxlIGluIHRoZSBmbG9hdGluZyBVSS4KICAgICAgKi8KLSAgICB2b2lkIHNlbGVjdERhdGFzZXQoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgZmluYWwgVWlPYmplY3QyIHBpY2tlciA9IGZpbmREYXRhc2V0UGlja2VyKCk7CisgICAgdm9pZCBzZWxlY3REYXRhc2V0KFN0cmluZyBuYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgVWlPYmplY3QyIHBpY2tlciA9IGZpbmREYXRhc2V0UGlja2VyKFVJX0RBVEFTRVRfUElDS0VSX1RJTUVPVVQpOwogICAgICAgICBzZWxlY3REYXRhc2V0KHBpY2tlciwgbmFtZSk7CiAgICAgfQogCkBAIC0xODIsNyArMjg2LDcgQEAKICAgICAgKiA8cD48Yj5OT1RFOjwvYj4gd2hlbiBzZWxlY3RpbmcgYW4gb3B0aW9uIGluIGRhdGFzZXQgcGlja2VyIGlzIHNob3duLCBwcmVmZXIKICAgICAgKiB7QGxpbmsgI3NlbGVjdERhdGFzZXQoU3RyaW5nKX0uCiAgICAgICovCi0gICAgdm9pZCBzZWxlY3RCeVRleHQoU3RyaW5nIG5hbWUpIHsKKyAgICB2b2lkIHNlbGVjdEJ5VGV4dChTdHJpbmcgbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIExvZy52KFRBRywgInNlbGVjdEJ5VGV4dCgpOiAiICsgbmFtZSk7CiAKICAgICAgICAgZmluYWwgVWlPYmplY3QyIG9iamVjdCA9IHdhaXRGb3JPYmplY3QoQnkudGV4dChuYW1lKSk7CkBAIC0xOTUsMTIgKzI5OSwxMiBAQAogICAgICAqIDxwPjxiPk5PVEU6PC9iPiB3aGVuIGFzc2VydGluZyB0aGUgZGF0YXNldCBwaWNrZXIgaXMgc2hvd24sIHByZWZlcgogICAgICAqIHtAbGluayAjYXNzZXJ0RGF0YXNldHMoU3RyaW5nLi4uKX0uCiAgICAgICovCi0gICAgcHVibGljIFVpT2JqZWN0MiBhc3NlcnRTaG93bkJ5VGV4dChTdHJpbmcgdGV4dCkgewotICAgICAgICByZXR1cm4gYXNzZXJ0U2hvd25CeVRleHQodGV4dCwgVUlfVElNRU9VVF9NUyk7CisgICAgcHVibGljIFVpT2JqZWN0MiBhc3NlcnRTaG93bkJ5VGV4dChTdHJpbmcgdGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBhc3NlcnRTaG93bkJ5VGV4dCh0ZXh0LCBtRGVmYXVsdFRpbWVvdXQpOwogICAgIH0KIAotICAgIHB1YmxpYyBVaU9iamVjdDIgYXNzZXJ0U2hvd25CeVRleHQoU3RyaW5nIHRleHQsIGludCB0aW1lb3V0TXMpIHsKLSAgICAgICAgZmluYWwgVWlPYmplY3QyIG9iamVjdCA9IHdhaXRGb3JPYmplY3QoQnkudGV4dCh0ZXh0KSwgdGltZW91dE1zKTsKKyAgICBwdWJsaWMgVWlPYmplY3QyIGFzc2VydFNob3duQnlUZXh0KFN0cmluZyB0ZXh0LCBUaW1lb3V0IHRpbWVvdXQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBVaU9iamVjdDIgb2JqZWN0ID0gd2FpdEZvck9iamVjdChCeS50ZXh0KHRleHQpLCB0aW1lb3V0KTsKICAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoIk5vIG5vZGUgd2l0aCB0ZXh0ICclcyciLCB0ZXh0KS50aGF0KG9iamVjdCkuaXNOb3ROdWxsKCk7CiAgICAgICAgIHJldHVybiBvYmplY3Q7CiAgICAgfQpAQCAtMjIwLDcgKzMyNCw3IEBACiAgICAgICogQXNzZXJ0cyBhIG5vZGUgd2l0aCB0aGUgZ2l2ZW4gY29udGVudCBkZXNjcmlwdGlvbiBpcyBzaG93bi4KICAgICAgKgogICAgICAqLwotICAgIHB1YmxpYyBVaU9iamVjdDIgYXNzZXJ0U2hvd25CeUNvbnRlbnREZXNjcmlwdGlvbihTdHJpbmcgY29udGVudERlc2NyaXB0aW9uKSB7CisgICAgcHVibGljIFVpT2JqZWN0MiBhc3NlcnRTaG93bkJ5Q29udGVudERlc2NyaXB0aW9uKFN0cmluZyBjb250ZW50RGVzY3JpcHRpb24pIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBmaW5hbCBVaU9iamVjdDIgb2JqZWN0ID0gd2FpdEZvck9iamVjdChCeS5kZXNjKGNvbnRlbnREZXNjcmlwdGlvbikpOwogICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiTm8gbm9kZSB3aXRoIGNvbnRlbnQgZGVzY3JpcHRpb24gJyVzJyIsIGNvbnRlbnREZXNjcmlwdGlvbikudGhhdChvYmplY3QpCiAgICAgICAgICAgICAgICAgLmlzTm90TnVsbCgpOwpAQCAtMjM5LDExICszNDMsMTEgQEAKICAgICAvKioKICAgICAgKiBTZWxlY3RzIGEgdmlldyBieSBpZC4KICAgICAgKi8KLSAgICB2b2lkIHNlbGVjdEJ5SWQoU3RyaW5nIGlkKSB7Ci0gICAgICAgIExvZy52KFRBRywgInNlbGVjdEJ5SWQoKTogIiArIGlkKTsKLQotICAgICAgICBmaW5hbCBVaU9iamVjdDIgdmlldyA9IHdhaXRGb3JPYmplY3QoQnkucmVzKGlkKSk7Ci0gICAgICAgIHZpZXcuY2xpY2soKTsKKyAgICBVaU9iamVjdDIgc2VsZWN0QnlSZWxhdGl2ZUlkKFN0cmluZyBpZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIExvZy52KFRBRywgInNlbGVjdEJ5UmVsYXRpdmVJZCgpOiAiICsgaWQpOworICAgICAgICBVaU9iamVjdDIgb2JqZWN0ID0gd2FpdEZvck9iamVjdChCeS5yZXMobVBhY2thZ2VOYW1lLCBpZCkpOworICAgICAgICBvYmplY3QuY2xpY2soKTsKKyAgICAgICAgcmV0dXJuIG9iamVjdDsKICAgICB9CiAKICAgICAvKioKQEAgLTI1OCw4ICszNjIsMTIgQEAKICAgICAvKioKICAgICAgKiBBc3NlcnRzIHRoZSBpZCBpcyBzaG93biBvbiB0aGUgc2NyZWVuLCB1c2luZyBhIHJlc291cmNlIGlkIGZyb20gdGhlIHRlc3QgcGFja2FnZS4KICAgICAgKi8KLSAgICBVaU9iamVjdDIgYXNzZXJ0U2hvd25CeVJlbGF0aXZlSWQoU3RyaW5nIGlkKSB7Ci0gICAgICAgIGZpbmFsIFVpT2JqZWN0MiBvYmogPSB3YWl0Rm9yT2JqZWN0KEJ5LnJlcyhtUGFja2FnZU5hbWUsIGlkKSk7CisgICAgVWlPYmplY3QyIGFzc2VydFNob3duQnlSZWxhdGl2ZUlkKFN0cmluZyBpZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBhc3NlcnRTaG93bkJ5UmVsYXRpdmVJZChpZCwgbURlZmF1bHRUaW1lb3V0KTsKKyAgICB9CisKKyAgICBVaU9iamVjdDIgYXNzZXJ0U2hvd25CeVJlbGF0aXZlSWQoU3RyaW5nIGlkLCBUaW1lb3V0IHRpbWVvdXQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBVaU9iamVjdDIgb2JqID0gd2FpdEZvck9iamVjdChCeS5yZXMobVBhY2thZ2VOYW1lLCBpZCksIHRpbWVvdXQpOwogICAgICAgICBhc3NlcnRUaGF0KG9iaikuaXNOb3ROdWxsKCk7CiAgICAgICAgIHJldHVybiBvYmo7CiAgICAgfQpAQCAtMjcwLDUwICszNzgsNjIgQEAKICAgICAgKiA8cD48Yj5Ob3RlOjwvYj4gdGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgY2FsbGVkIEFGVEVSIHRoZSBpZCB3YXMgcHJldmlvdXNseSBzaG93biwgb3RoZXJ3aXNlCiAgICAgICogaXQgbWlnaHQgcGFzcyB3aXRob3V0IHJlYWxseSBhc3NlcnRpbmcgYW55dGhpbmcuCiAgICAgICovCi0gICAgdm9pZCBhc3NlcnRHb25lQnlSZWxhdGl2ZUlkKFN0cmluZyBpZCwgbG9uZyB0aW1lb3V0TXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGJvb2xlYW4gZ29uZSA9IG1EZXZpY2Uud2FpdChVbnRpbC5nb25lKEJ5LnJlcyhtUGFja2FnZU5hbWUsIGlkKSksIHRpbWVvdXRNcyk7CisgICAgdm9pZCBhc3NlcnRHb25lQnlSZWxhdGl2ZUlkKFN0cmluZyBpZCwgVGltZW91dCB0aW1lb3V0KSB7CisgICAgICAgIGJvb2xlYW4gZ29uZSA9IG1EZXZpY2Uud2FpdChVbnRpbC5nb25lKEJ5LnJlcyhtUGFja2FnZU5hbWUsIGlkKSksIHRpbWVvdXQubXMoKSk7CiAgICAgICAgIGlmICghZ29uZSkgewogICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSAiT2JqZWN0IHdpdGggaWQgJyIgKyBpZCArICInIHNob3VsZCBiZSBnb25lIGFmdGVyICIKLSAgICAgICAgICAgICAgICAgICAgKyB0aW1lb3V0TXMgKyAiIG1zIjsKLSAgICAgICAgICAgIGR1bXBTY3JlZW4oKTsKKyAgICAgICAgICAgICAgICAgICAgKyB0aW1lb3V0ICsgIiBtcyI7CisgICAgICAgICAgICBkdW1wU2NyZWVuKG1lc3NhZ2UpOwogICAgICAgICAgICAgdGhyb3cgbmV3IFJldHJ5YWJsZUV4Y2VwdGlvbihtZXNzYWdlKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgorICAgICAqIEFzc2VydHMgdGhhdCBhIHtAY29kZSBzZWxlY3Rvcn0gaXMgbm90IHNob3dpbmcgYWZ0ZXIge0Bjb2RlIHRpbWVvdXR9IG1pbGxpc2Vjb25kcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0TmV2ZXJTaG93bihTdHJpbmcgZGVzY3JpcHRpb24sIEJ5U2VsZWN0b3Igc2VsZWN0b3IsIGxvbmcgdGltZW91dCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTeXN0ZW1DbG9jay5zbGVlcCh0aW1lb3V0KTsKKyAgICAgICAgZmluYWwgVWlPYmplY3QyIG9iamVjdCA9IG1EZXZpY2UuZmluZE9iamVjdChzZWxlY3Rvcik7CisgICAgICAgIGlmIChvYmplY3QgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKAorICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJTaG91bGQgbm90IGJlIHNob3dpbmcgJXMgYWZ0ZXIgJWRtcywgYnV0IGdvdCAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24sIHRpbWVvdXQsIGdldENoaWxkcmVuQXNUZXh0KG9iamVjdCkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgogICAgICAqIEdldHMgdGhlIHRleHQgc2V0IG9uIGEgdmlldy4KICAgICAgKi8KLSAgICBTdHJpbmcgZ2V0VGV4dEJ5SWQoU3RyaW5nIGlkKSB7Ci0gICAgICAgIGZpbmFsIFVpT2JqZWN0MiBvYmogPSB3YWl0Rm9yT2JqZWN0KEJ5LnJlcyhpZCkpOwotICAgICAgICByZXR1cm4gb2JqLmdldFRleHQoKTsKKyAgICBTdHJpbmcgZ2V0VGV4dEJ5UmVsYXRpdmVJZChTdHJpbmcgaWQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZXR1cm4gd2FpdEZvck9iamVjdChCeS5yZXMobVBhY2thZ2VOYW1lLCBpZCkpLmdldFRleHQoKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBGb2N1cyBpbiB0aGUgdmlldyB3aXRoIHRoZSBnaXZlbiByZXNvdXJjZSBpZC4KICAgICAgKi8KLSAgICB2b2lkIGZvY3VzQnlSZWxhdGl2ZUlkKFN0cmluZyBpZCkgeworICAgIHZvaWQgZm9jdXNCeVJlbGF0aXZlSWQoU3RyaW5nIGlkKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgd2FpdEZvck9iamVjdChCeS5yZXMobVBhY2thZ2VOYW1lLCBpZCkpLmNsaWNrKCk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogU2V0cyBhIG5ldyB0ZXh0IG9uIGEgdmlldy4KICAgICAgKi8KLSAgICB2b2lkIHNldFRleHRCeUlkKFN0cmluZyBpZCwgU3RyaW5nIG5ld1RleHQpIHsKLSAgICAgICAgVWlPYmplY3QyIHZpZXcgPSB3YWl0Rm9yT2JqZWN0KEJ5LnJlcyhpZCkpOwotICAgICAgICB2aWV3LnNldFRleHQobmV3VGV4dCk7CisgICAgdm9pZCBzZXRUZXh0QnlSZWxhdGl2ZUlkKFN0cmluZyBpZCwgU3RyaW5nIG5ld1RleHQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB3YWl0Rm9yT2JqZWN0KEJ5LnJlcyhtUGFja2FnZU5hbWUsIGlkKSkuc2V0VGV4dChuZXdUZXh0KTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBBc3NlcnRzIHRoZSBzYXZlIHNuYWNrYmFyIGlzIHNob3dpbmcgYW5kIHJldHVybnMgaXQuCiAgICAgICovCi0gICAgVWlPYmplY3QyIGFzc2VydFNhdmVTaG93aW5nKGludCB0eXBlKSB7Ci0gICAgICAgIHJldHVybiBhc3NlcnRTYXZlU2hvd2luZyhTQVZFX1RJTUVPVVRfTVMsIHR5cGUpOworICAgIFVpT2JqZWN0MiBhc3NlcnRTYXZlU2hvd2luZyhpbnQgdHlwZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBhc3NlcnRTYXZlU2hvd2luZyhTQVZFX1RJTUVPVVQsIHR5cGUpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIEFzc2VydHMgdGhlIHNhdmUgc25hY2tiYXIgaXMgc2hvd2luZyBhbmQgcmV0dXJucyBpdC4KICAgICAgKi8KLSAgICBVaU9iamVjdDIgYXNzZXJ0U2F2ZVNob3dpbmcobG9uZyB0aW1lb3V0LCBpbnQgdHlwZSkgeworICAgIFVpT2JqZWN0MiBhc3NlcnRTYXZlU2hvd2luZyhUaW1lb3V0IHRpbWVvdXQsIGludCB0eXBlKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIGFzc2VydFNhdmVTaG93aW5nKG51bGwsIHRpbWVvdXQsIHR5cGUpOwogICAgIH0KIApAQCAtMzM0LDM0ICs0NTQsMTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBVc2VzIHRoZSBSZWNlbnRzIGJ1dHRvbiB0byBzd2l0Y2ggYmFjayB0byBwcmV2aW91cyBhY3Rpdml0eQorICAgICAqIEFzc2VydHMgdGhlIHNhdmUgc25hY2tiYXIgaXMgbm90IHNob3dpbmcuCiAgICAgICovCi0gICAgdm9pZCBzd2l0Y2hBcHBzVXNpbmdSZWNlbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIExvZy5kKFRBRywgInN3aXRjaEFwcHNVc2luZ1JlY2VudHMoKSIpOwotCi0gICAgICAgIC8vIFByZXNzIG9uY2UgdG8gc2hvdyBsaXN0IG9mIGFwcHMuLi4KLSAgICAgICAgbURldmljZS5wcmVzc1JlY2VudEFwcHMoKTsKLQotICAgICAgICAvLyAuLi53YWl0IHVudGlsIGFwcHMgYXJlIHNob3duLi4uCi0gICAgICAgIC8vIFRPRE8oYi8zNzU2NjYyNyk6IGZpZ3VyZSBvdXQgYSB3YXkgdG8gd2FpdCBmb3IgYSBzcGVjaWZpYyBVSSBpbnN0ZWFkLgotICAgICAgICBTeXN0ZW1DbG9jay5zbGVlcChVSV9SRUNFTlRTX1NXSVRDSF9USU1FT1VUX01TKTsKLQotICAgICAgICAvLyAuLi5wcmVzcyBhZ2FpbiB0byBnbyBiYWNrIHRvIHRoZSBhY3Rpdml0eS4KLSAgICAgICAgbURldmljZS5wcmVzc1JlY2VudEFwcHMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBc3NlcnRzIHRoZSBzYXZlIHNuYWNrYmFyIGlzIG5vdCBzaG93aW5nIGFuZCByZXR1cm5zIGl0LgotICAgICAqLwotICAgIHZvaWQgYXNzZXJ0U2F2ZU5vdFNob3dpbmcoaW50IHR5cGUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydFNhdmVTaG93aW5nKE5PVF9TSE9XSU5HX1RJTUVPVVRfTVMsIHR5cGUpOwotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgLy8gVE9ETzogdXNlIGEgbW9yZSBlbGVnYW50IGNoZWNrIHRoYW4gY2F0Y2hpbmcgdGhlIGV4cGVjdGlvbiBiZWNhdXNlIGl0J3Mgbm90IHNob3dpbmcKLSAgICAgICAgICAgIC8vIChpbiB3aGljaCBjYXNlIGl0IHdvdWxkbid0IG5lZWQgYSB0eXBlIGFzIHBhcmFtZXRlcikuCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3cgbmV3IFJldHJ5YWJsZUV4Y2VwdGlvbigic25hY2sgYmFyIGlzIHNob3dpbmciKTsKKyAgICB2b2lkIGFzc2VydFNhdmVOb3RTaG93aW5nKGludCB0eXBlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0TmV2ZXJTaG93bigic2F2ZSBVSSBmb3IgdHlwZSAiICsgdHlwZSwgU0FWRV9VSV9TRUxFQ1RPUiwgU0FWRV9OT1RfU0hPV05fTkFQVElNRV9NUyk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0U2F2ZVR5cGVTdHJpbmcoaW50IHR5cGUpIHsKQEAgLTM4OCw0MCArNDg0LDQwIEBACiAgICAgICAgIHJldHVybiBnZXRTdHJpbmcodHlwZVJlc291cmNlTmFtZSk7CiAgICAgfQogCi0gICAgVWlPYmplY3QyIGFzc2VydFNhdmVTaG93aW5nKFN0cmluZyBkZXNjcmlwdGlvbiwgaW50Li4uIHR5cGVzKSB7CisgICAgVWlPYmplY3QyIGFzc2VydFNhdmVTaG93aW5nKFN0cmluZyBkZXNjcmlwdGlvbiwgaW50Li4uIHR5cGVzKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIGFzc2VydFNhdmVTaG93aW5nKFNhdmVJbmZvLk5FR0FUSVZFX0JVVFRPTl9TVFlMRV9DQU5DRUwsIGRlc2NyaXB0aW9uLAotICAgICAgICAgICAgICAgIFNBVkVfVElNRU9VVF9NUywgdHlwZXMpOworICAgICAgICAgICAgICAgIFNBVkVfVElNRU9VVCwgdHlwZXMpOwogICAgIH0KIAotICAgIFVpT2JqZWN0MiBhc3NlcnRTYXZlU2hvd2luZyhTdHJpbmcgZGVzY3JpcHRpb24sIGxvbmcgdGltZW91dCwgaW50Li4uIHR5cGVzKSB7CisgICAgVWlPYmplY3QyIGFzc2VydFNhdmVTaG93aW5nKFN0cmluZyBkZXNjcmlwdGlvbiwgVGltZW91dCB0aW1lb3V0LCBpbnQuLi4gdHlwZXMpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIGFzc2VydFNhdmVTaG93aW5nKFNhdmVJbmZvLk5FR0FUSVZFX0JVVFRPTl9TVFlMRV9DQU5DRUwsIGRlc2NyaXB0aW9uLCB0aW1lb3V0LAogICAgICAgICAgICAgICAgIHR5cGVzKTsKICAgICB9CiAKICAgICBVaU9iamVjdDIgYXNzZXJ0U2F2ZVNob3dpbmcoaW50IG5lZ2F0aXZlQnV0dG9uU3R5bGUsIFN0cmluZyBkZXNjcmlwdGlvbiwKLSAgICAgICAgICAgIGludC4uLiB0eXBlcykgewotICAgICAgICByZXR1cm4gYXNzZXJ0U2F2ZVNob3dpbmcobmVnYXRpdmVCdXR0b25TdHlsZSwgZGVzY3JpcHRpb24sIFNBVkVfVElNRU9VVF9NUywgdHlwZXMpOworICAgICAgICAgICAgaW50Li4uIHR5cGVzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGFzc2VydFNhdmVTaG93aW5nKG5lZ2F0aXZlQnV0dG9uU3R5bGUsIGRlc2NyaXB0aW9uLCBTQVZFX1RJTUVPVVQsIHR5cGVzKTsKICAgICB9CiAKLSAgICBVaU9iamVjdDIgYXNzZXJ0U2F2ZVNob3dpbmcoaW50IG5lZ2F0aXZlQnV0dG9uU3R5bGUsIFN0cmluZyBkZXNjcmlwdGlvbiwgbG9uZyB0aW1lb3V0LAotICAgICAgICAgICAgaW50Li4uIHR5cGVzKSB7Ci0gICAgICAgIGZpbmFsIFVpT2JqZWN0MiBzbmFja2JhciA9IHdhaXRGb3JPYmplY3QoQnkucmVzKCJhbmRyb2lkIiwgUkVTT1VSQ0VfSURfU0FWRV9TTkFDS0JBUiksCi0gICAgICAgICAgICAgICAgdGltZW91dCk7CisgICAgVWlPYmplY3QyIGFzc2VydFNhdmVTaG93aW5nKGludCBuZWdhdGl2ZUJ1dHRvblN0eWxlLCBTdHJpbmcgZGVzY3JpcHRpb24sIFRpbWVvdXQgdGltZW91dCwKKyAgICAgICAgICAgIGludC4uLiB0eXBlcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFVpT2JqZWN0MiBzbmFja2JhciA9IHdhaXRGb3JPYmplY3QoU0FWRV9VSV9TRUxFQ1RPUiwgdGltZW91dCk7CiAKICAgICAgICAgZmluYWwgVWlPYmplY3QyIHRpdGxlVmlldyA9Ci0gICAgICAgICAgICAgICAgd2FpdEZvck9iamVjdChzbmFja2JhciwgQnkucmVzKCJhbmRyb2lkIiwgUkVTT1VSQ0VfSURfU0FWRV9USVRMRSksIFVJX1RJTUVPVVRfTVMpOworICAgICAgICAgICAgICAgIHdhaXRGb3JPYmplY3Qoc25hY2tiYXIsIEJ5LnJlcygiYW5kcm9pZCIsIFJFU09VUkNFX0lEX1NBVkVfVElUTEUpLCB0aW1lb3V0KTsKICAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoInNhdmUgdGl0bGUgKCVzKSBpcyBub3Qgc2hvd24iLCBSRVNPVVJDRV9JRF9TQVZFX1RJVExFKS50aGF0KHRpdGxlVmlldykKICAgICAgICAgICAgICAgICAuaXNOb3ROdWxsKCk7CiAKICAgICAgICAgZmluYWwgVWlPYmplY3QyIGljb25WaWV3ID0KLSAgICAgICAgICAgICAgICB3YWl0Rm9yT2JqZWN0KHNuYWNrYmFyLCBCeS5yZXMoImFuZHJvaWQiLCBSRVNPVVJDRV9JRF9TQVZFX0lDT04pLCBVSV9USU1FT1VUX01TKTsKKyAgICAgICAgICAgICAgICB3YWl0Rm9yT2JqZWN0KHNuYWNrYmFyLCBCeS5yZXMoImFuZHJvaWQiLCBSRVNPVVJDRV9JRF9TQVZFX0lDT04pLCB0aW1lb3V0KTsKICAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoInNhdmUgaWNvbiAoJXMpIGlzIG5vdCBzaG93biIsIFJFU09VUkNFX0lEX1NBVkVfSUNPTikudGhhdChpY29uVmlldykKICAgICAgICAgICAgICAgICAuaXNOb3ROdWxsKCk7CiAKICAgICAgICAgZmluYWwgU3RyaW5nIGFjdHVhbFRpdGxlID0gdGl0bGVWaWV3LmdldFRleHQoKTsKICAgICAgICAgTG9nLmQoVEFHLCAic2F2ZSB0aXRsZTogIiArIGFjdHVhbFRpdGxlKTsKIAotICAgICAgICBmaW5hbCBTdHJpbmcgc2VydmljZUxhYmVsID0gSW5zdHJ1bWVudGVkQXV0b0ZpbGxTZXJ2aWNlLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHNlcnZpY2VMYWJlbCA9IEluc3RydW1lbnRlZEF1dG9GaWxsU2VydmljZS5nZXRTZXJ2aWNlTGFiZWwoKTsKICAgICAgICAgc3dpdGNoICh0eXBlcy5sZW5ndGgpIHsKICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWRUaXRsZSA9ICh0eXBlc1swXSA9PSBTQVZFX0RBVEFfVFlQRV9HRU5FUklDKQpAQCAtNDUxLDExICs1NDcsMTUgQEAKICAgICAgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJzYXZlIHN1YnRpdGxlKCVzKSIsIGRlc2NyaXB0aW9uKS50aGF0KHNhdmVTdWJUaXRsZSkuaXNOb3ROdWxsKCk7CiAgICAgICAgIH0KIAotICAgICAgICBmaW5hbCBTdHJpbmcgbmVnYXRpdmVCdXR0b25UZXh0ID0gKG5lZ2F0aXZlQnV0dG9uU3R5bGUKLSAgICAgICAgICAgICAgICA9PSBTYXZlSW5mby5ORUdBVElWRV9CVVRUT05fU1RZTEVfUkVKRUNUKSA/ICJOT1QgTk9XIiA6ICJOTyBUSEFOS1MiOwotICAgICAgICBVaU9iamVjdDIgbmVnYXRpdmVCdXR0b24gPSBzbmFja2Jhci5maW5kT2JqZWN0KEJ5LnRleHQobmVnYXRpdmVCdXR0b25UZXh0KSk7Ci0gICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJuZWdhdGl2ZSBidXR0b24gKCVzKSIsIG5lZ2F0aXZlQnV0dG9uVGV4dCkKLSAgICAgICAgICAgICAgICAudGhhdChuZWdhdGl2ZUJ1dHRvbikuaXNOb3ROdWxsKCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBuZWdhdGl2ZUJ1dHRvblN0cmluZ0lkID0KKyAgICAgICAgICAgICAgICAobmVnYXRpdmVCdXR0b25TdHlsZSA9PSBTYXZlSW5mby5ORUdBVElWRV9CVVRUT05fU1RZTEVfUkVKRUNUKQorICAgICAgICAgICAgICAgID8gUkVTT1VSQ0VfU1RSSU5HX1NBVkVfQlVUVE9OX05PVF9OT1cKKyAgICAgICAgICAgICAgICA6IFJFU09VUkNFX1NUUklOR19TQVZFX0JVVFRPTl9OT19USEFOS1M7CisgICAgICAgIGZpbmFsIFN0cmluZyBleHBlY3RlZE5lZ2F0aXZlQnV0dG9uVGV4dCA9IGdldFN0cmluZyhuZWdhdGl2ZUJ1dHRvblN0cmluZ0lkKS50b1VwcGVyQ2FzZSgpOworICAgICAgICBmaW5hbCBVaU9iamVjdDIgbmVnYXRpdmVCdXR0b24gPSB3YWl0Rm9yT2JqZWN0KHNuYWNrYmFyLAorICAgICAgICAgICAgICAgIEJ5LnJlcygiYW5kcm9pZCIsIFJFU09VUkNFX0lEX1NBVkVfQlVUVE9OX05PKSwgdGltZW91dCk7CisgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJ3cm9uZyB0ZXh0IG9uIG5lZ2F0aXZlIGJ1dHRvbiIpCisgICAgICAgICAgICAgICAgLnRoYXQobmVnYXRpdmVCdXR0b24uZ2V0VGV4dCgpLnRvVXBwZXJDYXNlKCkpLmlzRXF1YWxUbyhleHBlY3RlZE5lZ2F0aXZlQnV0dG9uVGV4dCk7CiAKICAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdGVkQWNjZXNzaWJpbGl0eVRpdGxlID0KICAgICAgICAgICAgICAgICBnZXRTdHJpbmcoUkVTT1VSQ0VfU1RSSU5HX1NBVkVfU05BQ0tCQVJfQUNDRVNTSUJJTElUWV9USVRMRSk7CkBAIC00NzAsNyArNTcwLDcgQEAKICAgICAgKiBAcGFyYW0geWVzRG9JdCB7QGNvZGUgdHJ1ZX0gZm9yICdZRVMnLCB7QGNvZGUgZmFsc2V9IGZvciAnTk8gVEhBTktTJy4KICAgICAgKiBAcGFyYW0gdHlwZXMgZXhwZWN0ZWQgdHlwZXMgb2Ygc2F2ZSBpbmZvLgogICAgICAqLwotICAgIHZvaWQgc2F2ZUZvckF1dG9maWxsKGJvb2xlYW4geWVzRG9JdCwgaW50Li4uIHR5cGVzKSB7CisgICAgdm9pZCBzYXZlRm9yQXV0b2ZpbGwoYm9vbGVhbiB5ZXNEb0l0LCBpbnQuLi4gdHlwZXMpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBmaW5hbCBVaU9iamVjdDIgc2F2ZVNuYWNrQmFyID0gYXNzZXJ0U2F2ZVNob3dpbmcoCiAgICAgICAgICAgICAgICAgU2F2ZUluZm8uTkVHQVRJVkVfQlVUVE9OX1NUWUxFX0NBTkNFTCwgbnVsbCwgdHlwZXMpOwogICAgICAgICBzYXZlRm9yQXV0b2ZpbGwoc2F2ZVNuYWNrQmFyLCB5ZXNEb0l0KTsKQEAgLTQ4Miw3ICs1ODIsNyBAQAogICAgICAqIEBwYXJhbSB5ZXNEb0l0IHtAY29kZSB0cnVlfSBmb3IgJ1lFUycsIHtAY29kZSBmYWxzZX0gZm9yICdOTyBUSEFOS1MnLgogICAgICAqIEBwYXJhbSB0eXBlcyBleHBlY3RlZCB0eXBlcyBvZiBzYXZlIGluZm8uCiAgICAgICovCi0gICAgdm9pZCBzYXZlRm9yQXV0b2ZpbGwoaW50IG5lZ2F0aXZlQnV0dG9uU3R5bGUsIGJvb2xlYW4geWVzRG9JdCwgaW50Li4uIHR5cGVzKSB7CisgICAgdm9pZCBzYXZlRm9yQXV0b2ZpbGwoaW50IG5lZ2F0aXZlQnV0dG9uU3R5bGUsIGJvb2xlYW4geWVzRG9JdCwgaW50Li4uIHR5cGVzKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgVWlPYmplY3QyIHNhdmVTbmFja0JhciA9IGFzc2VydFNhdmVTaG93aW5nKG5lZ2F0aXZlQnV0dG9uU3R5bGUsbnVsbCwgdHlwZXMpOwogICAgICAgICBzYXZlRm9yQXV0b2ZpbGwoc2F2ZVNuYWNrQmFyLCB5ZXNEb0l0KTsKICAgICB9CkBAIC01MTIsMTQgKzYxMiwxNCBAQAogICAgICAqCiAgICAgICogQHBhcmFtIGlkIHJlc291cmNlIGlkIG9mIHRoZSBmaWVsZC4KICAgICAgKi8KLSAgICBVaU9iamVjdDIgZ2V0QXV0b2ZpbGxNZW51T3B0aW9uKFN0cmluZyBpZCkgeworICAgIFVpT2JqZWN0MiBnZXRBdXRvZmlsbE1lbnVPcHRpb24oU3RyaW5nIGlkKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgVWlPYmplY3QyIGZpZWxkID0gd2FpdEZvck9iamVjdChCeS5yZXMobVBhY2thZ2VOYW1lLCBpZCkpOwogICAgICAgICAvLyBUT0RPOiBmaWd1cmUgb3V0IHdoeSBvYmoubG9uZ0NsaWNrKCkgZG9lc24ndCBhbHdheXMgd29yawogICAgICAgICBmaWVsZC5jbGljaygzMDAwKTsKIAogICAgICAgICBmaW5hbCBMaXN0PFVpT2JqZWN0Mj4gbWVudUl0ZW1zID0gd2FpdEZvck9iamVjdHMoCi0gICAgICAgICAgICAgICAgQnkucmVzKCJhbmRyb2lkIiwgUkVTT1VSQ0VfSURfQ09OVEVYVF9NRU5VSVRFTSkpOwotICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWRUZXh0ID0gZ2V0U3RyaW5nKFJFU09VUkNFX1NUUklOR19BVVRPRklMTCk7CisgICAgICAgICAgICAgICAgQnkucmVzKCJhbmRyb2lkIiwgUkVTT1VSQ0VfSURfQ09OVEVYVF9NRU5VSVRFTSksIG1EZWZhdWx0VGltZW91dCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBleHBlY3RlZFRleHQgPSBnZXRBdXRvZmlsbENvbnRleHR1YWxNZW51VGl0bGUoKTsKICAgICAgICAgZmluYWwgU3RyaW5nQnVmZmVyIG1lbnVOYW1lcyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgICAgICAgZm9yIChVaU9iamVjdDIgbWVudUl0ZW0gOiBtZW51SXRlbXMpIHsKICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZW51TmFtZSA9IG1lbnVJdGVtLmdldFRleHQoKTsKQEAgLTUzMSw2ICs2MzEsMTAgQEAKICAgICAgICAgdGhyb3cgbmV3IFJldHJ5YWJsZUV4Y2VwdGlvbigibm8gJyVzJyBvbiAnJXMnIiwgZXhwZWN0ZWRUZXh0LCBtZW51TmFtZXMpOwogICAgIH0KIAorICAgIFN0cmluZyBnZXRBdXRvZmlsbENvbnRleHR1YWxNZW51VGl0bGUoKSB7CisgICAgICAgIHJldHVybiBnZXRTdHJpbmcoUkVTT1VSQ0VfU1RSSU5HX0FVVE9GSUxMKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBHZXRzIGEgc3RyaW5nIGZyb20gdGhlIEFuZHJvaWQgcmVzb3VyY2VzLgogICAgICAqLwpAQCAtNTU0LDggKzY1OCw4IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gc2VsZWN0b3Ige0BsaW5rIEJ5U2VsZWN0b3J9IHRoYXQgaWRlbnRpZmllcyB0aGUgb2JqZWN0LgogICAgICAqLwotICAgIHByaXZhdGUgVWlPYmplY3QyIHdhaXRGb3JPYmplY3QoQnlTZWxlY3RvciBzZWxlY3RvcikgewotICAgICAgICByZXR1cm4gd2FpdEZvck9iamVjdChzZWxlY3RvciwgVUlfVElNRU9VVF9NUyk7CisgICAgcHJpdmF0ZSBVaU9iamVjdDIgd2FpdEZvck9iamVjdChCeVNlbGVjdG9yIHNlbGVjdG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHdhaXRGb3JPYmplY3Qoc2VsZWN0b3IsIG1EZWZhdWx0VGltZW91dCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC01NjMsMjQgKzY2NywzMCBAQAogICAgICAqCiAgICAgICogQHBhcmFtIHBhcmVudCB3aGVyZSB0byBmaW5kIHRoZSBvYmplY3QgKG9yIHtAY29kZSBudWxsfSB0byB1c2UgZGV2aWNlJ3Mgcm9vdCkuCiAgICAgICogQHBhcmFtIHNlbGVjdG9yIHtAbGluayBCeVNlbGVjdG9yfSB0aGF0IGlkZW50aWZpZXMgdGhlIG9iamVjdC4KLSAgICAgKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0IGluIG1zCisgICAgICogQHBhcmFtIHRpbWVvdXQgdGltZW91dCBpbiBtcy4KKyAgICAgKiBAcGFyYW0gZHVtcE9uRXJyb3Igd2hldGhlciB0aGUgd2luZG93IGhpZXJhcmNoeSBzaG91bGQgYmUgZHVtcGVkIGlmIHRoZSBvYmplY3QgaXMgbm90IGZvdW5kLgogICAgICAqLwotICAgIHByaXZhdGUgVWlPYmplY3QyIHdhaXRGb3JPYmplY3QoVWlPYmplY3QyIHBhcmVudCwgQnlTZWxlY3RvciBzZWxlY3RvciwgbG9uZyB0aW1lb3V0KSB7CisgICAgcHJpdmF0ZSBVaU9iamVjdDIgd2FpdEZvck9iamVjdChVaU9iamVjdDIgcGFyZW50LCBCeVNlbGVjdG9yIHNlbGVjdG9yLCBUaW1lb3V0IHRpbWVvdXQsCisgICAgICAgICAgICBib29sZWFuIGR1bXBPbkVycm9yKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gTk9URTogbURldmljZS53YWl0IGRvZXMgbm90IHdvcmsgZm9yIHRoZSBzYXZlIHNuYWNrYmFyLCBzbyB3ZSBuZWVkIGEgcG9sbGluZyBhcHByb2FjaC4KLSAgICAgICAgZmluYWwgaW50IG1heFRyaWVzID0gNTsKLSAgICAgICAgZmluYWwgbG9uZyBuYXBUaW1lID0gdGltZW91dCAvIG1heFRyaWVzOwotICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBtYXhUcmllczsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBVaU9iamVjdDIgdWlPYmplY3QgPSBwYXJlbnQgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICA/IHBhcmVudC5maW5kT2JqZWN0KHNlbGVjdG9yKQotICAgICAgICAgICAgICAgICAgICA6IG1EZXZpY2UuZmluZE9iamVjdChzZWxlY3Rvcik7Ci0gICAgICAgICAgICBpZiAodWlPYmplY3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiB1aU9iamVjdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN5c3RlbUNsb2NrLnNsZWVwKG5hcFRpbWUpOwotICAgICAgICB9Ci0gICAgICAgIHRocm93IG5ldyBSZXRyeWFibGVFeGNlcHRpb24oIk9iamVjdCB3aXRoIHNlbGVjdG9yICclcycgbm90IGZvdW5kIGluICVkIG1zIiwKLSAgICAgICAgICAgICAgICBzZWxlY3RvciwgVUlfVElNRU9VVF9NUyk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gdGltZW91dC5ydW4oIndhaXRGb3JPYmplY3QoIiArIHNlbGVjdG9yICsgIikiLCAoKSAtPiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudCAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICA/IHBhcmVudC5maW5kT2JqZWN0KHNlbGVjdG9yKQorICAgICAgICAgICAgICAgICAgICAgICAgOiBtRGV2aWNlLmZpbmRPYmplY3Qoc2VsZWN0b3IpOwogCisgICAgICAgICAgICB9KTsKKyAgICAgICAgfSBjYXRjaCAoUmV0cnlhYmxlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGlmIChkdW1wT25FcnJvcikgeworICAgICAgICAgICAgICAgIGR1bXBTY3JlZW4oIndhaXRGb3JPYmplY3QoKSBmb3IgIiArIHNlbGVjdG9yICsgImZhaWxlZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgVWlPYmplY3QyIHdhaXRGb3JPYmplY3QoVWlPYmplY3QyIHBhcmVudCwgQnlTZWxlY3RvciBzZWxlY3RvciwgVGltZW91dCB0aW1lb3V0KQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiB3YWl0Rm9yT2JqZWN0KHBhcmVudCwgc2VsZWN0b3IsIHRpbWVvdXQsIERVTVBfT05fRVJST1IpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNTg5LDE3ICs2OTksMjUgQEAKICAgICAgKiBAcGFyYW0gc2VsZWN0b3Ige0BsaW5rIEJ5U2VsZWN0b3J9IHRoYXQgaWRlbnRpZmllcyB0aGUgb2JqZWN0LgogICAgICAqIEBwYXJhbSB0aW1lb3V0IHRpbWVvdXQgaW4gbXMKICAgICAgKi8KLSAgICBwcml2YXRlIFVpT2JqZWN0MiB3YWl0Rm9yT2JqZWN0KEJ5U2VsZWN0b3Igc2VsZWN0b3IsIGxvbmcgdGltZW91dCkgeworICAgIHByaXZhdGUgVWlPYmplY3QyIHdhaXRGb3JPYmplY3QoQnlTZWxlY3RvciBzZWxlY3RvciwgVGltZW91dCB0aW1lb3V0KSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIHdhaXRGb3JPYmplY3QobnVsbCwgc2VsZWN0b3IsIHRpbWVvdXQpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdhaXRzIGZvciBhbmQgcmV0dXJucyBhIGxpc3Qgb2Ygb2JqZWN0cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciB7QGxpbmsgQnlTZWxlY3Rvcn0gdGhhdCBpZGVudGlmaWVzIHRoZSBvYmplY3QuCisgICAgICogRXhlY3V0ZSBhIFJ1bm5hYmxlIGFuZCB3YWl0IGZvciBUWVBFX1dJTkRPV1NfQ0hBTkdFRCBvciBUWVBFX1dJTkRPV19TVEFURV9DSEFOR0VELgorICAgICAqIFRPRE86IE5vIGxvbmdlciBuZWVkIFJldHJ5LCBSZWZhY3RvcmluZyB0aGUgVGltZW91dCAoZS5nLiB3ZSBwcm9iYWJseSBuZWVkIHR3byB2YWx1ZXM6CisgICAgICogb25lIGxhcmdlIHRpbWVvdXQgdmFsdWUgdGhhdCBleHBlY3RzIHdpbmRvdyBldmVudCwgb25lIHNtYWxsIHZhbHVlIHRoYXQgZXhwZWN0IG5vIHdpbmRvdworICAgICAqIGV2ZW50KQogICAgICAqLwotICAgIHByaXZhdGUgTGlzdDxVaU9iamVjdDI+IHdhaXRGb3JPYmplY3RzKEJ5U2VsZWN0b3Igc2VsZWN0b3IpIHsKLSAgICAgICAgcmV0dXJuIHdhaXRGb3JPYmplY3RzKHNlbGVjdG9yLCBVSV9USU1FT1VUX01TKTsKKyAgICBwdWJsaWMgdm9pZCB3YWl0Rm9yV2luZG93Q2hhbmdlKFJ1bm5hYmxlIHJ1bm5hYmxlLCBsb25nIHRpbWVvdXRNaWxsaXMpIHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIHsKKyAgICAgICAgbUF1dG9tYW4uZXhlY3V0ZUFuZFdhaXRGb3JFdmVudChydW5uYWJsZSwgKEFjY2Vzc2liaWxpdHlFdmVudCBldmVudCkgLT4geworICAgICAgICAgICAgc3dpdGNoIChldmVudC5nZXRFdmVudFR5cGUoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgQWNjZXNzaWJpbGl0eUV2ZW50LlRZUEVfV0lORE9XU19DSEFOR0VEOgorICAgICAgICAgICAgICAgIGNhc2UgQWNjZXNzaWJpbGl0eUV2ZW50LlRZUEVfV0lORE9XX1NUQVRFX0NIQU5HRUQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9LCB0aW1lb3V0TWlsbGlzKTsKICAgICB9CiAKICAgICAvKioKQEAgLTYwOCwzMiArNzI2LDM0IEBACiAgICAgICogQHBhcmFtIHNlbGVjdG9yIHtAbGluayBCeVNlbGVjdG9yfSB0aGF0IGlkZW50aWZpZXMgdGhlIG9iamVjdC4KICAgICAgKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0IGluIG1zCiAgICAgICovCi0gICAgcHJpdmF0ZSBMaXN0PFVpT2JqZWN0Mj4gd2FpdEZvck9iamVjdHMoQnlTZWxlY3RvciBzZWxlY3RvciwgbG9uZyB0aW1lb3V0KSB7CisgICAgcHJpdmF0ZSBMaXN0PFVpT2JqZWN0Mj4gd2FpdEZvck9iamVjdHMoQnlTZWxlY3RvciBzZWxlY3RvciwgVGltZW91dCB0aW1lb3V0KSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gTk9URTogbURldmljZS53YWl0IGRvZXMgbm90IHdvcmsgZm9yIHRoZSBzYXZlIHNuYWNrYmFyLCBzbyB3ZSBuZWVkIGEgcG9sbGluZyBhcHByb2FjaC4KLSAgICAgICAgZmluYWwgaW50IG1heFRyaWVzID0gNTsKLSAgICAgICAgZmluYWwgbG9uZyBuYXBUaW1lID0gdGltZW91dCAvIG1heFRyaWVzOwotICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBtYXhUcmllczsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBMaXN0PFVpT2JqZWN0Mj4gdWlPYmplY3RzID0gbURldmljZS5maW5kT2JqZWN0cyhzZWxlY3Rvcik7Ci0gICAgICAgICAgICBpZiAodWlPYmplY3RzICE9IG51bGwgJiYgIXVpT2JqZWN0cy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdWlPYmplY3RzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3lzdGVtQ2xvY2suc2xlZXAobmFwVGltZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gdGltZW91dC5ydW4oIndhaXRGb3JPYmplY3QoIiArIHNlbGVjdG9yICsgIikiLCAoKSAtPiB7CisgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxVaU9iamVjdDI+IHVpT2JqZWN0cyA9IG1EZXZpY2UuZmluZE9iamVjdHMoc2VsZWN0b3IpOworICAgICAgICAgICAgICAgIGlmICh1aU9iamVjdHMgIT0gbnVsbCAmJiAhdWlPYmplY3RzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdWlPYmplY3RzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgfSk7CisKKyAgICAgICAgfSBjYXRjaCAoUmV0cnlhYmxlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGR1bXBTY3JlZW4oIndhaXRGb3JPYmplY3RzKCkgZm9yICIgKyBzZWxlY3RvciArICJmYWlsZWQiKTsKKyAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgIH0KLSAgICAgICAgdGhyb3cgbmV3IFJldHJ5YWJsZUV4Y2VwdGlvbigiT2JqZWN0cyB3aXRoIHNlbGVjdG9yICclcycgbm90IGZvdW5kIGluICVkIG1zIiwKLSAgICAgICAgICAgICAgICBzZWxlY3RvciwgVUlfVElNRU9VVF9NUyk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBVaU9iamVjdDIgZmluZERhdGFzZXRQaWNrZXIoKSB7Ci0gICAgICAgIHJldHVybiBmaW5kRGF0YXNldFBpY2tlcihVSV9USU1FT1VUX01TKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFVpT2JqZWN0MiBmaW5kRGF0YXNldFBpY2tlcihsb25nIHRpbWVvdXQpIHsKLSAgICAgICAgZmluYWwgVWlPYmplY3QyIHBpY2tlciA9IHdhaXRGb3JPYmplY3QoQnkucmVzKCJhbmRyb2lkIiwgUkVTT1VSQ0VfSURfREFUQVNFVF9QSUNLRVIpLAotICAgICAgICAgICAgICAgIHRpbWVvdXQpOworICAgIHByaXZhdGUgVWlPYmplY3QyIGZpbmREYXRhc2V0UGlja2VyKFRpbWVvdXQgdGltZW91dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFVpT2JqZWN0MiBwaWNrZXIgPSB3YWl0Rm9yT2JqZWN0KERBVEFTRVRfUElDS0VSX1NFTEVDVE9SLCB0aW1lb3V0KTsKIAogICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWRUaXRsZSA9IGdldFN0cmluZyhSRVNPVVJDRV9TVFJJTkdfREFUQVNFVF9QSUNLRVJfQUNDRVNTSUJJTElUWV9USVRMRSk7CiAgICAgICAgIGFzc2VydEFjY2Vzc2liaWxpdHlUaXRsZShwaWNrZXIsIGV4cGVjdGVkVGl0bGUpOwogCisgICAgICAgIGlmIChwaWNrZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbU9rVG9DYWxsQXNzZXJ0Tm9EYXRhc2V0cyA9IHRydWU7CisgICAgICAgIH0KKwogICAgICAgICByZXR1cm4gcGlja2VyOwogICAgIH0KIApAQCAtNjU5LDI3ICs3NzksMTIgQEAKICAgICAgKgogICAgICAqIEB0aHJvd3MgUmV0cnlhYmxlRXhjZXB0aW9uIGlmIHZhbHVlIGRpZG4ndCBjaGFuZ2UuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2NyZWVuT3JpZW50YXRpb24oaW50IG9yaWVudGF0aW9uKSB7CisgICAgcHVibGljIHZvaWQgc2V0U2NyZWVuT3JpZW50YXRpb24oaW50IG9yaWVudGF0aW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgbUF1dG9tYW4uc2V0Um90YXRpb24ob3JpZW50YXRpb24pOwogCi0gICAgICAgIGxvbmcgc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLSAgICAgICAgd2hpbGUgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnRUaW1lIDw9IEhlbHBlci5VSV9TQ1JFRU5fT1JJRU5UQVRJT05fVElNRU9VVF9NUykgewotICAgICAgICAgICAgZmluYWwgaW50IGFjdHVhbFZhbHVlID0gZ2V0U2NyZWVuT3JpZW50YXRpb24oKTsKLSAgICAgICAgICAgIGlmIChhY3R1YWxWYWx1ZSA9PSBvcmllbnRhdGlvbikgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExvZy53KFRBRywgInNldFNjcmVlbk9yaWVudGF0aW9uKCk6IHNsZWVwaW5nICIgKyBIZWxwZXIuUkVUUllfTVMKLSAgICAgICAgICAgICAgICAgICAgKyAibXMgdW50aWwgb3JpZW50YXRpb24gaXMgIiArIG9yaWVudGF0aW9uCi0gICAgICAgICAgICAgICAgICAgICsgIiAoaW5zdGVhZCBvZiAiICsgYWN0dWFsVmFsdWUgKyAiKSIpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoSGVscGVyLlJFVFJZX01TKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHRocm93IG5ldyBSZXRyeWFibGVFeGNlcHRpb24oIlNjcmVlbiBvcmllbnRhdGlvbiBkaWRuJ3QgY2hhbmdlIHRvICVkIGluICVkIG1zIiwgb3JpZW50YXRpb24sCi0gICAgICAgICAgICAgICAgSGVscGVyLlVJX1NDUkVFTl9PUklFTlRBVElPTl9USU1FT1VUX01TKTsKKyAgICAgICAgVUlfU0NSRUVOX09SSUVOVEFUSU9OX1RJTUVPVVQucnVuKCJzZXRTY3JlZW5PcmllbnRhdGlvbigiICsgb3JpZW50YXRpb24gKyAiKSIsICgpIC0+IHsKKyAgICAgICAgICAgIHJldHVybiBnZXRTY3JlZW5PcmllbnRhdGlvbigpID09IG9yaWVudGF0aW9uID8gQm9vbGVhbi5UUlVFIDogbnVsbDsKKyAgICAgICAgfSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC02OTQsNDUgKzc5OSw3MiBAQAogICAgIC8qKgogICAgICAqIER1bXBzIHRoZSBjdXJyZW50IHZpZXcgaGllcmFyY2h5IGludCB0aGUgb3V0cHV0IHN0cmVhbS4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkdW1wU2NyZWVuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgbURldmljZS5kdW1wV2luZG93SGllcmFyY2h5KFN5c3RlbS5vdXQpOworICAgIHB1YmxpYyB2b2lkIGR1bXBTY3JlZW4oU3RyaW5nIGNhdXNlKSB7CisgICAgICAgIG5ldyBFeGNlcHRpb24oImR1bXBTY3JlZW4oY2F1c2U9IiArIGNhdXNlICsgIikgc3RhY2t0cmFjZSIpLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRyeSAoQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpKSB7CisgICAgICAgICAgICAgICAgbURldmljZS5kdW1wV2luZG93SGllcmFyY2h5KG9zKTsKKyAgICAgICAgICAgICAgICBvcy5mbHVzaCgpOworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkR1bXBpbmcgd2luZG93IGhpZXJhcmNoeSBiZWNhdXNlICIgKyBjYXVzZSk7CisgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgbGluZSA6IG9zLnRvU3RyaW5nKCJVVEYtOCIpLnNwbGl0KCJcbiIpKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgbGluZSk7CisgICAgICAgICAgICAgICAgICAgIC8vIFNsZWVwIGEgbGl0dGxlIGJpdCB0byBhdm9pZCBsb2dzIGJlaW5nIGlnbm9yZWQgZHVlIHRvIHNwYW0KKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtQ2xvY2suc2xlZXAoMTAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIEp1c3QgaWdub3JlIGl0Li4uCisgICAgICAgICAgICBMb2cuZShUQUcsICJleGNlcHRpb24gZHVtcGluZyB3aW5kb3cgaGllcmFyY2h5IiwgZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUT0RPKGIvNzQzNTgxNDMpOiBpZGVhbGx5IHdlIHNob3VsZCB0YWtlIGEgc2NyZWVuc2hvdCBsaW1pdGVkIGJ5IHRoZSBib3VuZGFyaWVzIG9mIHRoZQorICAgIC8vIGFjdGl2aXR5IHdpbmRvdywgc28gZXh0ZXJuYWwgZWxlbWVudHMgKHN1Y2ggYXMgdGhlIGNsb2NrKSBhcmUgZmlsdGVyZWQgb3V0IGFuZCBkb24ndCBjYXVzZQorICAgIC8vIHRlc3QgZmxha2luZXNzIHdoZW4gdGhlIGNvbnRlbnRzIGFyZSBjb21wYXJlZC4KKyAgICBwdWJsaWMgQml0bWFwIHRha2VTY3JlZW5zaG90KCkgeworICAgICAgICBmaW5hbCBsb25nIGJlZm9yZSA9IFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpOworICAgICAgICBmaW5hbCBCaXRtYXAgYml0bWFwID0gbUF1dG9tYW4udGFrZVNjcmVlbnNob3QoKTsKKyAgICAgICAgZmluYWwgbG9uZyBkZWx0YSA9IFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpIC0gYmVmb3JlOworICAgICAgICBMb2cudihUQUcsICJTY3JlZW5zaG90IHRha2VuIGluICIgKyBkZWx0YSArICJtcyIpOworICAgICAgICByZXR1cm4gYml0bWFwOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgc2NyZWVuIHJlc29sdXRpb24uCisgICAgICogQXNzZXJ0cyB0aGUgY29udGVudHMgb2YgYSBjaGlsZCBlbGVtZW50LgogICAgICAqCi0gICAgICogPHA+SWYgdGhlIHNjcmVlbiBpcyB0b28gc21hbGwgYW5kIHRoZSBkZXZpY2VzIHNob3dzIGFuIElNRSwgaXQgbWlnaHQgbm90IGhhdmUgc3BhY2UgZm9yIGFsbAotICAgICAqIFVJIGVsZW1lbnRzIGFmdGVyIHRoZSBkZXZpY2UgaXMgcm90YXRlZCB0byBsYW5kc2NhcGUuCi0gICAgICoKLSAgICAgKiA8cD57QGxpbmsgI3Jlc2V0U2NyZWVuUmVzb2x1dGlvbigpfSBzaG91bGQgYWx3YXlzIGJlIGNhbGxlZCB0b28uCi0gICAgICoKLSAgICAgKiBAZGVwcmVjYXRlZCB0aGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIG5lY2Vzc2FyaWx5IGFueW1vcmUgYXMgd2UncmUgdXNpbmcgYSBNb2NrSW1lLgorICAgICAqIEBwYXJhbSBwYXJlbnQgcGFyZW50IG9iamVjdAorICAgICAqIEBwYXJhbSBjaGlsZElkIChyZWxhdGl2ZSkgcmVzb3VyY2UgaWQgb2YgdGhlIGNoaWxkCisgICAgICogQHBhcmFtIGFzc2VydGlvbiBpZiB7QGNvZGUgbnVsbH0sIGFzc2VydHMgdGhlIGNoaWxkIGRvZXMgbm90IGV4aXN0OyBvdGhlcndpc2UsIGFzc2VydHMgdGhlCisgICAgICogY2hpbGQgd2l0aCBpdC4KICAgICAgKi8KLSAgICBARGVwcmVjYXRlZCAvLyBUT0RPOiByZW1vdmUgb25jZSB3ZSdyZSBzdXJlIG5vIG1vcmUgT0VNIGlzIGdldHRpbmcgZmFpbHVyZSBkdWUgdG8gc2NyZWVuIHNpemUKLSAgICB2b2lkIHNldFNjcmVlblJlc29sdXRpb24oKSB7Ci0gICAgICAgIGlmICh0cnVlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJzZXRTY3JlZW5SZXNvbHV0aW9uKCk6IGlnbm9yZWQiKTsKLSAgICAgICAgICAgIHJldHVybjsKKyAgICBwdWJsaWMgdm9pZCBhc3NlcnRDaGlsZChATm9uTnVsbCBVaU9iamVjdDIgcGFyZW50LCBATm9uTnVsbCBTdHJpbmcgY2hpbGRJZCwKKyAgICAgICAgICAgIEBOdWxsYWJsZSBWaXNpdG9yPFVpT2JqZWN0Mj4gYXNzZXJ0aW9uKSB7CisgICAgICAgIGZpbmFsIFVpT2JqZWN0MiBjaGlsZCA9IHBhcmVudC5maW5kT2JqZWN0KEJ5LnJlcyhtUGFja2FnZU5hbWUsIGNoaWxkSWQpKTsKKyAgICAgICAgaWYgKGFzc2VydGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiRGlkbid0IGZpbmQgY2hpbGQgd2l0aCBpZCAnJXMnIiwgY2hpbGRJZCkudGhhdChjaGlsZCkuaXNOb3ROdWxsKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGFzc2VydGlvbi52aXNpdChjaGlsZCk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiRXJyb3Igb24gY2hpbGQgJyIgKyBjaGlsZElkICsgIiciLCB0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJTaG91bGRuJ3QgZmluZCBjaGlsZCB3aXRoIGlkICclcyciLCBjaGlsZElkKS50aGF0KGNoaWxkKS5pc051bGwoKTsKICAgICAgICAgfQotICAgICAgICBhc3N1bWVNaW5pbXVtUmVzb2x1dGlvbig1MDApOwotCi0gICAgICAgIHJ1blNoZWxsQ29tbWFuZCgid20gc2l6ZSAxMDgweDE5MjAiKTsKLSAgICAgICAgcnVuU2hlbGxDb21tYW5kKCJ3bSBkZW5zaXR5IDMyMCIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlc2V0cyBzY3JlZW4gcmVzb2x1dGlvbi4KLSAgICAgKgotICAgICAqIEBkZXByZWNhdGVkIHRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgbmVjZXNzYXJpbHkgYW55bW9yZSBhcyB3ZSdyZSB1c2luZyBhIE1vY2tJbWUuCisgICAgICogV2FpdHMgdW50aWwgdGhlIHdpbmRvdyB3YXMgc3BsaXQgdG8gc2hvdyBtdWx0aXBsZSBhY3Rpdml0aWVzLgogICAgICAqLwotICAgIEBEZXByZWNhdGVkIC8vIFRPRE86IHJlbW92ZSBvbmNlIHdlJ3JlIHN1cmUgbm8gbW9yZSBPRU0gaXMgZ2V0dGluZyBmYWlsdXJlIGR1ZSB0byBzY3JlZW4gc2l6ZQotICAgIHZvaWQgcmVzZXRTY3JlZW5SZXNvbHV0aW9uKCkgewotICAgICAgICBpZiAodHJ1ZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAicmVzZXRTY3JlZW5SZXNvbHV0aW9uKCk6IGlnbm9yZWQiKTsKLSAgICAgICAgICAgIHJldHVybjsKKyAgICBwdWJsaWMgdm9pZCB3YWl0Rm9yV2luZG93U3BsaXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydFNob3duQnlJZChTUExJVF9XSU5ET1dfRElWSURFUl9JRCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmaW5hbCBsb25nIHRpbWVvdXQgPSBUaW1lb3V0cy5BQ1RJVklUWV9SRVNVUlJFQ1RJT04ubXMoKTsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkRpZCBub3QgZmluZCB3aW5kb3cgZGl2aWRlciAiICsgU1BMSVRfV0lORE9XX0RJVklERVJfSUQgKyAiOyB3YWl0aW5nICIKKyAgICAgICAgICAgICAgICAgICAgKyB0aW1lb3V0ICsgIm1zIGluc3RlYWQiKTsKKyAgICAgICAgICAgIFN5c3RlbUNsb2NrLnNsZWVwKHRpbWVvdXQpOwogICAgICAgICB9Ci0gICAgICAgIHJ1blNoZWxsQ29tbWFuZCgid20gZGVuc2l0eSByZXNldCIpOwotICAgICAgICBydW5TaGVsbENvbW1hbmQoIndtIHNpemUgcmVzZXQiKTsKICAgICB9CiAKICAgICBwcml2YXRlIGJvb2xlYW4gZ2V0Qm9vbGVhbihTdHJpbmcgaWQpIHsKQEAgLTc0MCwxOCArODcyLDQgQEAKICAgICAgICAgZmluYWwgaW50IGJvb2xlYW5JZCA9IHJlc291cmNlcy5nZXRJZGVudGlmaWVyKGlkLCAiYm9vbCIsICJhbmRyb2lkIik7CiAgICAgICAgIHJldHVybiByZXNvdXJjZXMuZ2V0Qm9vbGVhbihib29sZWFuSWQpOwogICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIGRpc3BsYXkgcm90YXRpb24gaXMgc3VwcG9ydGVkLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NjcmVlblJvdGF0aW9uU3VwcG9ydGVkKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuICFnZXRCb29sZWFuKFJFU09VUkNFX0JPT0xFQU5fQ09ORklHX0ZPUkNFX0RFRkFVTFRfT1JJRU5UQVRJT04pOwotICAgICAgICB9IGNhdGNoIChSZXNvdXJjZXMuTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiUmVzb3VyY2Ugbm90IGZvdW5kOiAiCi0gICAgICAgICAgICAgICAgICAgICsgUkVTT1VSQ0VfQk9PTEVBTl9DT05GSUdfRk9SQ0VfREVGQVVMVF9PUklFTlRBVElPTgotICAgICAgICAgICAgICAgICAgICArICIuIEFzc3VtZSByb3RhdGlvbiBzdXBwb3J0ZWQiKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL1VzZXJEYXRhVGVzdC5qYXZhIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvVXNlckRhdGFUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVjNzc1NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL1VzZXJEYXRhVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHM7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5TZWN1cmUuQVVUT0ZJTExfVVNFUl9EQVRBX01BWF9DQVRFR09SWV9DT1VOVDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5TZWN1cmUuQVVUT0ZJTExfVVNFUl9EQVRBX01BWF9GSUVMRF9DTEFTU0lGSUNBVElPTl9JRFNfU0laRTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5TZWN1cmUuQVVUT0ZJTExfVVNFUl9EQVRBX01BWF9VU0VSX0RBVEFfU0laRTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5TZWN1cmUuQVVUT0ZJTExfVVNFUl9EQVRBX01BWF9WQUxVRV9MRU5HVEg7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU2VjdXJlLkFVVE9GSUxMX1VTRVJfREFUQV9NSU5fVkFMVUVfTEVOR1RIOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLnRydXRoLlRydXRoLmFzc2VydFRoYXQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0VGhyb3dzOworCitpbXBvcnQgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLmNvbW1vbi5TZXR0aW5nc1N0YXRlQ2hhbmdlclJ1bGU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOworaW1wb3J0IGFuZHJvaWQuc2VydmljZS5hdXRvZmlsbC5Vc2VyRGF0YTsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0cmluZ3M7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5DbGFzc1J1bGU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5tb2NraXRvLmp1bml0Lk1vY2tpdG9KVW5pdFJ1bm5lcjsKKworQFJ1bldpdGgoTW9ja2l0b0pVbml0UnVubmVyLmNsYXNzKQorQEFwcE1vZGVGdWxsIC8vIFVuaXQgdGVzdAorcHVibGljIGNsYXNzIFVzZXJEYXRhVGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb250ZXh0IHNDb250ZXh0ID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpOworCisgICAgQENsYXNzUnVsZQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2V0dGluZ3NTdGF0ZUNoYW5nZXJSdWxlIHNVc2VyRGF0YU1heEZjU2l6ZUNoYW5nZXIgPQorICAgICAgICAgICAgbmV3IFNldHRpbmdzU3RhdGVDaGFuZ2VyUnVsZShzQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgQVVUT0ZJTExfVVNFUl9EQVRBX01BWF9GSUVMRF9DTEFTU0lGSUNBVElPTl9JRFNfU0laRSwgIjEwIik7CisKKyAgICBAQ2xhc3NSdWxlCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTZXR0aW5nc1N0YXRlQ2hhbmdlclJ1bGUgc1VzZXJEYXRhTWF4Q2F0ZWdvcmllc1NpemVDaGFuZ2VyID0KKyAgICAgICAgICAgIG5ldyBTZXR0aW5nc1N0YXRlQ2hhbmdlclJ1bGUoc0NvbnRleHQsIEFVVE9GSUxMX1VTRVJfREFUQV9NQVhfQ0FURUdPUllfQ09VTlQsICIyIik7CisKKyAgICBAQ2xhc3NSdWxlCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTZXR0aW5nc1N0YXRlQ2hhbmdlclJ1bGUgc1VzZXJEYXRhTWF4VXNlclNpemVDaGFuZ2VyID0KKyAgICAgICAgICAgIG5ldyBTZXR0aW5nc1N0YXRlQ2hhbmdlclJ1bGUoc0NvbnRleHQsIEFVVE9GSUxMX1VTRVJfREFUQV9NQVhfVVNFUl9EQVRBX1NJWkUsICI0Iik7CisKKyAgICBAQ2xhc3NSdWxlCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTZXR0aW5nc1N0YXRlQ2hhbmdlclJ1bGUgc1VzZXJEYXRhTWluVmFsdWVDaGFuZ2VyID0KKyAgICAgICAgICAgIG5ldyBTZXR0aW5nc1N0YXRlQ2hhbmdlclJ1bGUoc0NvbnRleHQsIEFVVE9GSUxMX1VTRVJfREFUQV9NSU5fVkFMVUVfTEVOR1RILCAiNCIpOworCisgICAgQENsYXNzUnVsZQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2V0dGluZ3NTdGF0ZUNoYW5nZXJSdWxlIHNVc2VyRGF0YU1heFZhbHVlQ2hhbmdlciA9CisgICAgICAgICAgICBuZXcgU2V0dGluZ3NTdGF0ZUNoYW5nZXJSdWxlKHNDb250ZXh0LCBBVVRPRklMTF9VU0VSX0RBVEFfTUFYX1ZBTFVFX0xFTkdUSCwgIjUwIik7CisKKworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1TaG9ydFZhbHVlID0gU3RyaW5ncy5yZXBlYXQoImsiLCBVc2VyRGF0YS5nZXRNaW5WYWx1ZUxlbmd0aCgpIC0gMSk7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUxvbmdWYWx1ZSA9ICJMT05HIFZBTFVFLCBZIFUgTk8gU0hPUlRFUiIKKyAgICAgICAgICAgICsgU3RyaW5ncy5yZXBlYXQoIj8iLCBVc2VyRGF0YS5nZXRNYXhWYWx1ZUxlbmd0aCgpKTsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtSWQgPSAiNDgxNTE2MjM0MiI7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUNhdGVnb3J5SWQgPSAiaWQxIjsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQ2F0ZWdvcnlJZDIgPSAiaWQyIjsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQ2F0ZWdvcnlJZDMgPSAiaWQzIjsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtVmFsdWUgPSBtU2hvcnRWYWx1ZSArICItMSI7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVZhbHVlMiA9IG1TaG9ydFZhbHVlICsgIi0yIjsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtVmFsdWUzID0gbVNob3J0VmFsdWUgKyAiLTMiOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1WYWx1ZTQgPSBtU2hvcnRWYWx1ZSArICItNCI7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVZhbHVlNSA9IG1TaG9ydFZhbHVlICsgIi01IjsKKworICAgIHByaXZhdGUgVXNlckRhdGEuQnVpbGRlciBtQnVpbGRlcjsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRGaXh0dXJlcygpIHsKKyAgICAgICAgbUJ1aWxkZXIgPSBuZXcgVXNlckRhdGEuQnVpbGRlcihtSWQsIG1WYWx1ZSwgbUNhdGVnb3J5SWQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJ1aWxkZXJfaW52YWxpZCgpIHsKKyAgICAgICAgYXNzZXJ0VGhyb3dzKE51bGxQb2ludGVyRXhjZXB0aW9uLmNsYXNzLAorICAgICAgICAgICAgICAgICgpIC0+IG5ldyBVc2VyRGF0YS5CdWlsZGVyKG51bGwsIG1WYWx1ZSwgbUNhdGVnb3J5SWQpKTsKKyAgICAgICAgYXNzZXJ0VGhyb3dzKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAoKSAtPiBuZXcgVXNlckRhdGEuQnVpbGRlcigiIiwgbVZhbHVlLCBtQ2F0ZWdvcnlJZCkpOworICAgICAgICBhc3NlcnRUaHJvd3MoTnVsbFBvaW50ZXJFeGNlcHRpb24uY2xhc3MsCisgICAgICAgICAgICAgICAgKCkgLT4gbmV3IFVzZXJEYXRhLkJ1aWxkZXIobUlkLCBudWxsLCBtQ2F0ZWdvcnlJZCkpOworICAgICAgICBhc3NlcnRUaHJvd3MoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzLAorICAgICAgICAgICAgICAgICgpIC0+IG5ldyBVc2VyRGF0YS5CdWlsZGVyKG1JZCwgIiIsIG1DYXRlZ29yeUlkKSk7CisgICAgICAgIGFzc2VydFRocm93cyhJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MsCisgICAgICAgICAgICAgICAgKCkgLT4gbmV3IFVzZXJEYXRhLkJ1aWxkZXIobUlkLCBtU2hvcnRWYWx1ZSwgbUNhdGVnb3J5SWQpKTsKKyAgICAgICAgYXNzZXJ0VGhyb3dzKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAoKSAtPiBuZXcgVXNlckRhdGEuQnVpbGRlcihtSWQsIG1Mb25nVmFsdWUsIG1DYXRlZ29yeUlkKSk7CisgICAgICAgIGFzc2VydFRocm93cyhOdWxsUG9pbnRlckV4Y2VwdGlvbi5jbGFzcywgKCkgLT4gbmV3IFVzZXJEYXRhLkJ1aWxkZXIobUlkLCBtVmFsdWUsIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0VGhyb3dzKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcywgKCkgLT4gbmV3IFVzZXJEYXRhLkJ1aWxkZXIobUlkLCBtVmFsdWUsICIiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkX2ludmFsaWQoKSB7CisgICAgICAgIGFzc2VydFRocm93cyhOdWxsUG9pbnRlckV4Y2VwdGlvbi5jbGFzcywgKCkgLT4gbUJ1aWxkZXIuYWRkKG51bGwsIG1DYXRlZ29yeUlkKSk7CisgICAgICAgIGFzc2VydFRocm93cyhJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MsICgpIC0+IG1CdWlsZGVyLmFkZCgiIiwgbUNhdGVnb3J5SWQpKTsKKyAgICAgICAgYXNzZXJ0VGhyb3dzKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcywgKCkgLT4gbUJ1aWxkZXIuYWRkKG1TaG9ydFZhbHVlLCBtQ2F0ZWdvcnlJZCkpOworICAgICAgICBhc3NlcnRUaHJvd3MoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzLCAoKSAtPiBtQnVpbGRlci5hZGQobUxvbmdWYWx1ZSwgbUNhdGVnb3J5SWQpKTsKKyAgICAgICAgYXNzZXJ0VGhyb3dzKE51bGxQb2ludGVyRXhjZXB0aW9uLmNsYXNzLCAoKSAtPiBtQnVpbGRlci5hZGQobVZhbHVlLCBudWxsKSk7CisgICAgICAgIGFzc2VydFRocm93cyhJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MsICgpIC0+IG1CdWlsZGVyLmFkZChtVmFsdWUsICIiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkX2R1cGxpY2F0ZWRWYWx1ZSgpIHsKKyAgICAgICAgYXNzZXJ0VGhyb3dzKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbi5jbGFzcywgKCkgLT4gbUJ1aWxkZXIuYWRkKG1WYWx1ZSwgbUNhdGVnb3J5SWQpKTsKKyAgICAgICAgYXNzZXJ0VGhyb3dzKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbi5jbGFzcywgKCkgLT4gbUJ1aWxkZXIuYWRkKG1WYWx1ZSwgbUNhdGVnb3J5SWQyKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkX21heGltdW1DYXRlZ29yaWVzUmVhY2hlZCgpIHsKKyAgICAgICAgLy8gTWF4IGlzIDI7IG9uZSB3YXMgYWRkZWQgaW4gdGhlIGNvbnN0cnVjdG9yCisgICAgICAgIG1CdWlsZGVyLmFkZChtVmFsdWUyLCBtQ2F0ZWdvcnlJZDIpOworICAgICAgICBhc3NlcnRUaHJvd3MoSWxsZWdhbFN0YXRlRXhjZXB0aW9uLmNsYXNzLCAoKSAtPiBtQnVpbGRlci5hZGQobVZhbHVlMywgbUNhdGVnb3J5SWQzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkX21heGltdW1Vc2VyRGF0YVJlYWNoZWQoKSB7CisgICAgICAgIC8vIE1heCBpcyA0OyBvbmUgd2FzIGFkZGVkIGluIHRoZSBjb25zdHJ1Y3RvcgorICAgICAgICBtQnVpbGRlci5hZGQobVZhbHVlMiwgbUNhdGVnb3J5SWQpOworICAgICAgICBtQnVpbGRlci5hZGQobVZhbHVlMywgbUNhdGVnb3J5SWQpOworICAgICAgICBtQnVpbGRlci5hZGQobVZhbHVlNCwgbUNhdGVnb3J5SWQyKTsKKyAgICAgICAgYXNzZXJ0VGhyb3dzKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbi5jbGFzcywgKCkgLT4gbUJ1aWxkZXIuYWRkKG1WYWx1ZTUsIG1DYXRlZ29yeUlkMikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNldEZjQWxnb3JpdGhtKCkgeworICAgICAgICBmaW5hbCBVc2VyRGF0YSB1c2VyRGF0YSA9IG1CdWlsZGVyLnNldEZpZWxkQ2xhc3NpZmljYXRpb25BbGdvcml0aG0oImFsZ29fbWFzIiwgbnVsbCkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdCh1c2VyRGF0YS5nZXRGaWVsZENsYXNzaWZpY2F0aW9uQWxnb3JpdGhtKCkpLmlzRXF1YWxUbygiYWxnb19tYXMiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCdWlsZF92YWxpZCgpIHsKKyAgICAgICAgZmluYWwgVXNlckRhdGEgdXNlckRhdGEgPSBtQnVpbGRlci5idWlsZCgpOworICAgICAgICBhc3NlcnRUaGF0KHVzZXJEYXRhKS5pc05vdE51bGwoKTsKKyAgICAgICAgYXNzZXJ0VGhhdCh1c2VyRGF0YS5nZXRJZCgpKS5pc0VxdWFsVG8obUlkKTsKKyAgICAgICAgYXNzZXJ0VGhhdCh1c2VyRGF0YS5nZXRGaWVsZENsYXNzaWZpY2F0aW9uQWxnb3JpdGhtKCkpLmlzTnVsbCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vTW9yZUludGVyYWN0aW9uc0FmdGVyQnVpbGQoKSB7CisgICAgICAgIHRlc3RCdWlsZF92YWxpZCgpOworCisgICAgICAgIGFzc2VydFRocm93cyhJbGxlZ2FsU3RhdGVFeGNlcHRpb24uY2xhc3MsICgpIC0+IG1CdWlsZGVyLmFkZChtVmFsdWUsIG1DYXRlZ29yeUlkMikpOworICAgICAgICBhc3NlcnRUaHJvd3MoSWxsZWdhbFN0YXRlRXhjZXB0aW9uLmNsYXNzLAorICAgICAgICAgICAgICAgICgpIC0+IG1CdWlsZGVyLnNldEZpZWxkQ2xhc3NpZmljYXRpb25BbGdvcml0aG0oImFsZ29fbWFzIiwgbnVsbCkpOworICAgICAgICBhc3NlcnRUaHJvd3MoSWxsZWdhbFN0YXRlRXhjZXB0aW9uLmNsYXNzLCAoKSAtPiBtQnVpbGRlci5idWlsZCgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9WYWxpZGF0b3JUZXN0LmphdmEgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9WYWxpZGF0b3JUZXN0LmphdmEKaW5kZXggMjFlYmFjMi4uNjIyZTEyNyAxMDA2NDQKLS0tIGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvVmFsaWRhdG9yVGVzdC5qYXZhCisrKyBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL1ZhbGlkYXRvclRlc3QuamF2YQpAQCAtMTgsMjUgKzE4LDI4IEBACiAKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5JRF9QQVNTV09SRDsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5JRF9VU0VSTkFNRTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5hc3NlcnROb0RhbmdsaW5nU2Vzc2lvbnM7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmljZS5hdXRvZmlsbC5TYXZlSW5mby5TQVZFX0RBVEFfVFlQRV9HRU5FUklDOwogCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLnRydXRoLlRydXRoLmFzc2VydFRoYXQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5kb1JldHVybjsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5tb2NrOworCitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOworaW1wb3J0IGFuZHJvaWQuc2VydmljZS5hdXRvZmlsbC5JbnRlcm5hbFZhbGlkYXRvcjsKIGltcG9ydCBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuTHVobkNoZWNrc3VtVmFsaWRhdG9yOwotaW1wb3J0IGFuZHJvaWQuc2VydmljZS5hdXRvZmlsbC5SZWdleFZhbGlkYXRvcjsKLWltcG9ydCBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuVmFsaWRhdG9yOwotaW1wb3J0IGFuZHJvaWQuc2VydmljZS5hdXRvZmlsbC5WYWxpZGF0b3JzOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk5vbk51bGw7CitpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLmF1dG9maWxsLlZhbHVlRmluZGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5hdXRvZmlsbC5BdXRvZmlsbElkOwogCi1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKLWltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQmlGdW5jdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQorLyoqCisgKiBTaW1wbGUgaW50ZWdyYXRpb24gdGVzdCB0byB2ZXJpZnkgdGhhdCB0aGUgVUkgaXMgb25seSBzaG93biBpZiB0aGUgdmFsaWRhdG9yIHBhc3Nlcy4KKyAqLworQEFwcE1vZGVGdWxsIC8vIFNlcnZpY2Utc3BlY2lmaWMgdGVzdAogcHVibGljIGNsYXNzIFZhbGlkYXRvclRlc3QgZXh0ZW5kcyBBdXRvRmlsbFNlcnZpY2VUZXN0Q2FzZSB7CiAgICAgQFJ1bGUKICAgICBwdWJsaWMgZmluYWwgQXV0b2ZpbGxBY3Rpdml0eVRlc3RSdWxlPExvZ2luQWN0aXZpdHk+IG1BY3Rpdml0eVJ1bGUgPQpAQCAtNDksMjkgKzUyLDMwIEBACiAgICAgICAgIG1BY3Rpdml0eSA9IG1BY3Rpdml0eVJ1bGUuZ2V0QWN0aXZpdHkoKTsKICAgICB9CiAKLSAgICBAQWZ0ZXIKLSAgICBwdWJsaWMgdm9pZCBmaW5pc2hXZWxjb21lQWN0aXZpdHkoKSB7Ci0gICAgICAgIFdlbGNvbWVBY3Rpdml0eS5maW5pc2hJdCgpOworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNob3dVaVdoZW5WYWxpZGF0b3JQYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGludGVncmF0aW9uVGVzdCh0cnVlKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBCYXNlIHRlc3QKLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWxpZGF0b3JCdWlsZGVyIG1ldGhvZCB0byBidWlsZCBhIHZhbGlkYXRvcgotICAgICAqIEBwYXJhbSB3aWxsU2F2ZUJlU2hvd24gIFdoZXRoZXIgdGhlIHNhdmUgcG9wLXVwIHdpbGwgYmUgc2hvd24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdGVzdFZhbGlkYXRvcigKLSAgICAgICAgICAgIEBOb25OdWxsIEJpRnVuY3Rpb248QXV0b2ZpbGxJZCwgQXV0b2ZpbGxJZCwgVmFsaWRhdG9yPiB2YWxpZGF0b3JCdWlsZGVyLAotICAgICAgICAgICAgYm9vbGVhbiB3aWxsU2F2ZUJlU2hvd24pIHRocm93cyBFeGNlcHRpb24geworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERvbnRTaG93VWlXaGVuVmFsaWRhdG9yRmFpbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW50ZWdyYXRpb25UZXN0KGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW50ZWdyYXRpb25UZXN0KGJvb2xlYW4gd2lsbFNhdmVCZVNob3duKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZW5hYmxlU2VydmljZSgpOwogCi0gICAgICAgIEF1dG9maWxsSWQgdXNlcm5hbWVJZCA9IG1BY3Rpdml0eS5nZXRVc2VybmFtZSgpLmdldEF1dG9maWxsSWQoKTsKLSAgICAgICAgQXV0b2ZpbGxJZCBwYXNzd29yZElkID0gbUFjdGl2aXR5LmdldFBhc3N3b3JkKCkuZ2V0QXV0b2ZpbGxJZCgpOworICAgICAgICBmaW5hbCBBdXRvZmlsbElkIHVzZXJuYW1lSWQgPSBtQWN0aXZpdHkuZ2V0VXNlcm5hbWUoKS5nZXRBdXRvZmlsbElkKCk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHVzZXJuYW1lID0gd2lsbFNhdmVCZVNob3duID8gIjc5OTI3Mzk4NzEtMyIgOiAiNDgxNTE2MjM0Mi0xMDgiOworICAgICAgICBmaW5hbCBMdWhuQ2hlY2tzdW1WYWxpZGF0b3IgdmFsaWRhdG9yID0gbmV3IEx1aG5DaGVja3N1bVZhbGlkYXRvcih1c2VybmFtZUlkKTsKKyAgICAgICAgLy8gU2FuaXR5IGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgdmFsaWRhdG9yIGlzIHByb3Blcmx5IGNvbmZpZ3VyZWQKKyAgICAgICAgYXNzZXJ0VmFsaWRhdG9yKHZhbGlkYXRvciwgdXNlcm5hbWVJZCwgdXNlcm5hbWUsIHdpbGxTYXZlQmVTaG93bik7CiAKICAgICAgICAgLy8gU2V0IHJlc3BvbnNlCiAgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpCiAgICAgICAgICAgICAgICAgLnNldFJlcXVpcmVkU2F2YWJsZUlkcyhTQVZFX0RBVEFfVFlQRV9HRU5FUklDLCBJRF9VU0VSTkFNRSwgSURfUEFTU1dPUkQpCi0gICAgICAgICAgICAgICAgLnNldFZhbGlkYXRvcih2YWxpZGF0b3JCdWlsZGVyLmFwcGx5KHVzZXJuYW1lSWQsIHBhc3N3b3JkSWQpKQorICAgICAgICAgICAgICAgIC5zZXRWYWxpZGF0b3IodmFsaWRhdG9yKQogICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKIAogICAgICAgICAvLyBUcmlnZ2VyIGF1dG8tZmlsbApAQCAtODEsNTkgKzg1LDIyIEBACiAgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwogCiAgICAgICAgIC8vIFRyaWdnZXIgc2F2ZS4KLSAgICAgICAgbUFjdGl2aXR5Lm9uVXNlcm5hbWUoKHYpIC0+IHYuc2V0VGV4dCgiNzk5MjczOTg3MS0zIikpOwotICAgICAgICBtQWN0aXZpdHkub25QYXNzd29yZCgodikgLT4gdi5zZXRUZXh0KCJwYXNzd2QiKSk7CisgICAgICAgIG1BY3Rpdml0eS5vblVzZXJuYW1lKCh2KSAtPiB2LnNldFRleHQodXNlcm5hbWUpKTsKKyAgICAgICAgbUFjdGl2aXR5Lm9uUGFzc3dvcmQoKHYpIC0+IHYuc2V0VGV4dCgicGFzcyIpKTsKICAgICAgICAgbUFjdGl2aXR5LnRhcExvZ2luKCk7CiAKICAgICAgICAgaWYgKHdpbGxTYXZlQmVTaG93bikgewotICAgICAgICAgICAgc1VpQm90LnNhdmVGb3JBdXRvZmlsbCh0cnVlLCBTQVZFX0RBVEFfVFlQRV9HRU5FUklDKTsKKyAgICAgICAgICAgIG1VaUJvdC5zYXZlRm9yQXV0b2ZpbGwodHJ1ZSwgU0FWRV9EQVRBX1RZUEVfR0VORVJJQyk7CiAgICAgICAgICAgICBzUmVwbGllci5nZXROZXh0U2F2ZVJlcXVlc3QoKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNVaUJvdC5hc3NlcnRTYXZlTm90U2hvd2luZyhTQVZFX0RBVEFfVFlQRV9HRU5FUklDKTsKKyAgICAgICAgICAgIG1VaUJvdC5hc3NlcnRTYXZlTm90U2hvd2luZyhTQVZFX0RBVEFfVFlQRV9HRU5FUklDKTsKICAgICAgICAgfQotCi0gICAgICAgIGFzc2VydE5vRGFuZ2xpbmdTZXNzaW9ucygpOwogICAgIH0KIAotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgY2hlY2tGb3JJbnZhbGlkRmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdFZhbGlkYXRvcigodXNlcm5hbWVJZCwgcGFzc3dvcmRJZCkgLT4gVmFsaWRhdG9ycy5vcigKLSAgICAgICAgICAgICAgICBuZXcgTHVobkNoZWNrc3VtVmFsaWRhdG9yKG5ldyBBdXRvZmlsbElkKC0xKSksCi0gICAgICAgICAgICAgICAgbmV3IFJlZ2V4VmFsaWRhdG9yKHBhc3N3b3JkSWQsIFBhdHRlcm4uY29tcGlsZSgicGFzcy4qIikpKSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBjaGVja0JvdGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdFZhbGlkYXRvcigodXNlcm5hbWVJZCwgcGFzc3dvcmRJZCkgLT4gVmFsaWRhdG9ycy5hbmQoCi0gICAgICAgICAgICAgICAgbmV3IEx1aG5DaGVja3N1bVZhbGlkYXRvcih1c2VybmFtZUlkKSwKLSAgICAgICAgICAgICAgICBuZXcgUmVnZXhWYWxpZGF0b3IocGFzc3dvcmRJZCwgUGF0dGVybi5jb21waWxlKCJwYXNzLioiKSkpLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIGNoZWNrRWl0aGVyMSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0VmFsaWRhdG9yKCh1c2VybmFtZUlkLCBwYXNzd29yZElkKSAtPiBWYWxpZGF0b3JzLm9yKAotICAgICAgICAgICAgICAgIG5ldyBSZWdleFZhbGlkYXRvcih1c2VybmFtZUlkLCBQYXR0ZXJuLmNvbXBpbGUoIjcuKiIpKSwKLSAgICAgICAgICAgICAgICBuZXcgUmVnZXhWYWxpZGF0b3IocGFzc3dvcmRJZCwgUGF0dGVybi5jb21waWxlKCJwYXNzLioiKSkpLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIGNoZWNrRWl0aGVyMigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0VmFsaWRhdG9yKCh1c2VybmFtZUlkLCBwYXNzd29yZElkKSAtPiBWYWxpZGF0b3JzLm9yKAotICAgICAgICAgICAgICAgIG5ldyBSZWdleFZhbGlkYXRvcih1c2VybmFtZUlkLCBQYXR0ZXJuLmNvbXBpbGUoImludmFsaWQiKSksCi0gICAgICAgICAgICAgICAgbmV3IFJlZ2V4VmFsaWRhdG9yKHBhc3N3b3JkSWQsIFBhdHRlcm4uY29tcGlsZSgicGFzcy4qIikpKSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBjaGVja0JvdGhCdXRGYWlsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RWYWxpZGF0b3IoKHVzZXJuYW1lSWQsIHBhc3N3b3JkSWQpIC0+IFZhbGlkYXRvcnMuYW5kKAotICAgICAgICAgICAgICAgIG5ldyBSZWdleFZhbGlkYXRvcih1c2VybmFtZUlkLCBQYXR0ZXJuLmNvbXBpbGUoIjcuKiIpKSwKLSAgICAgICAgICAgICAgICBuZXcgUmVnZXhWYWxpZGF0b3IocGFzc3dvcmRJZCwgUGF0dGVybi5jb21waWxlKCJpbnZhbGlkIikpKSwgZmFsc2UpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgY2hlY2tFaXRoZXJCdXRGYWlsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RWYWxpZGF0b3IoKHVzZXJuYW1lSWQsIHBhc3N3b3JkSWQpIC0+IFZhbGlkYXRvcnMub3IoCi0gICAgICAgICAgICAgICAgbmV3IFJlZ2V4VmFsaWRhdG9yKHVzZXJuYW1lSWQsIFBhdHRlcm4uY29tcGlsZSgiaW52YWxpZCIpKSwKLSAgICAgICAgICAgICAgICBuZXcgUmVnZXhWYWxpZGF0b3IocGFzc3dvcmRJZCwgUGF0dGVybi5jb21waWxlKCJpbnZhbGlkIikpKSwgZmFsc2UpOworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRWYWxpZGF0b3IoSW50ZXJuYWxWYWxpZGF0b3IgdmFsaWRhdG9yLCBBdXRvZmlsbElkIGlkLCBTdHJpbmcgdGV4dCwKKyAgICAgICAgICAgIGJvb2xlYW4gdmFsaWQpIHsKKyAgICAgICAgZmluYWwgVmFsdWVGaW5kZXIgdmFsdWVGaW5kZXIgPSBtb2NrKFZhbHVlRmluZGVyLmNsYXNzKTsKKyAgICAgICAgZG9SZXR1cm4odGV4dCkud2hlbih2YWx1ZUZpbmRlcikuZmluZEJ5QXV0b2ZpbGxJZChpZCk7CisgICAgICAgIGFzc2VydFRoYXQodmFsaWRhdG9yLmlzVmFsaWQodmFsdWVGaW5kZXIpKS5pc0VxdWFsVG8odmFsaWQpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL1ZhbGlkYXRvcnNUZXN0LmphdmEgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9WYWxpZGF0b3JzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNWI2OWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9WYWxpZGF0b3JzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHM7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2aWNlLmF1dG9maWxsLlZhbGlkYXRvcnMuYW5kOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuVmFsaWRhdG9ycy5ub3Q7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmljZS5hdXRvZmlsbC5WYWxpZGF0b3JzLm9yOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLnRydXRoLlRydXRoLmFzc2VydFRoYXQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5kb1JldHVybjsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5uZXZlcjsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by52ZXJpZnk7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydFRocm93czsKKworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKK2ltcG9ydCBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuSW50ZXJuYWxWYWxpZGF0b3I7CitpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLmF1dG9maWxsLlZhbGlkYXRvcjsKK2ltcG9ydCBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuVmFsdWVGaW5kZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLm1vY2tpdG8uTW9jazsKK2ltcG9ydCBvcmcubW9ja2l0by5qdW5pdC5Nb2NraXRvSlVuaXRSdW5uZXI7CisKK0BSdW5XaXRoKE1vY2tpdG9KVW5pdFJ1bm5lci5jbGFzcykKK0BBcHBNb2RlRnVsbCAvLyBVbml0IHRlc3QKK3B1YmxpYyBjbGFzcyBWYWxpZGF0b3JzVGVzdCBleHRlbmRzIEF1dG9GaWxsU2VydmljZVRlc3RDYXNlIHsKKworICAgIEBNb2NrIHByaXZhdGUgVmFsaWRhdG9yIG1JbnZhbGlkVmFsaWRhdG9yOworICAgIEBNb2NrIHByaXZhdGUgVmFsdWVGaW5kZXIgbVZhbHVlRmluZGVyOworICAgIEBNb2NrIHByaXZhdGUgSW50ZXJuYWxWYWxpZGF0b3IgbVZhbGlkVmFsaWRhdG9yOworICAgIEBNb2NrIHByaXZhdGUgSW50ZXJuYWxWYWxpZGF0b3IgbVZhbGlkVmFsaWRhdG9yMjsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFuZF9udWxsKCkgeworICAgICAgICBhc3NlcnRUaHJvd3MoTnVsbFBvaW50ZXJFeGNlcHRpb24uY2xhc3MsICgpIC0+IGFuZCgoVmFsaWRhdG9yKSBudWxsKSk7CisgICAgICAgIGFzc2VydFRocm93cyhOdWxsUG9pbnRlckV4Y2VwdGlvbi5jbGFzcywgKCkgLT4gYW5kKG1WYWxpZFZhbGlkYXRvciwgbnVsbCkpOworICAgICAgICBhc3NlcnRUaHJvd3MoTnVsbFBvaW50ZXJFeGNlcHRpb24uY2xhc3MsICgpIC0+IGFuZChudWxsLCBtVmFsaWRWYWxpZGF0b3IpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBbmRfaW52YWxpZCgpIHsKKyAgICAgICAgYXNzZXJ0VGhyb3dzKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcywgKCkgLT4gYW5kKG1JbnZhbGlkVmFsaWRhdG9yKSk7CisgICAgICAgIGFzc2VydFRocm93cyhJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MsICgpIC0+IGFuZChtVmFsaWRWYWxpZGF0b3IsIG1JbnZhbGlkVmFsaWRhdG9yKSk7CisgICAgICAgIGFzc2VydFRocm93cyhJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MsICgpIC0+IGFuZChtSW52YWxpZFZhbGlkYXRvciwgbVZhbGlkVmFsaWRhdG9yKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QW5kX2ZpcnN0RmFpbGVkKCkgeworICAgICAgICBkb1JldHVybihmYWxzZSkud2hlbihtVmFsaWRWYWxpZGF0b3IpLmlzVmFsaWQobVZhbHVlRmluZGVyKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgoKEludGVybmFsVmFsaWRhdG9yKSBhbmQobVZhbGlkVmFsaWRhdG9yLCBtVmFsaWRWYWxpZGF0b3IyKSkKKyAgICAgICAgICAgICAgICAuaXNWYWxpZChtVmFsdWVGaW5kZXIpKS5pc0ZhbHNlKCk7CisgICAgICAgIHZlcmlmeShtVmFsaWRWYWxpZGF0b3IyLCBuZXZlcigpKS5pc1ZhbGlkKG1WYWx1ZUZpbmRlcik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QW5kX2ZpcnN0UGFzc2VkU2Vjb25kRmFpbGVkKCkgeworICAgICAgICBkb1JldHVybih0cnVlKS53aGVuKG1WYWxpZFZhbGlkYXRvcikuaXNWYWxpZChtVmFsdWVGaW5kZXIpOworICAgICAgICBkb1JldHVybihmYWxzZSkud2hlbihtVmFsaWRWYWxpZGF0b3IyKS5pc1ZhbGlkKG1WYWx1ZUZpbmRlcik7CisgICAgICAgIGFzc2VydFRoYXQoKChJbnRlcm5hbFZhbGlkYXRvcikgYW5kKG1WYWxpZFZhbGlkYXRvciwgbVZhbGlkVmFsaWRhdG9yMikpCisgICAgICAgICAgICAgICAgLmlzVmFsaWQobVZhbHVlRmluZGVyKSkuaXNGYWxzZSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFuZF9BbGxQYXNzZWQoKSB7CisgICAgICAgIGRvUmV0dXJuKHRydWUpLndoZW4obVZhbGlkVmFsaWRhdG9yKS5pc1ZhbGlkKG1WYWx1ZUZpbmRlcik7CisgICAgICAgIGRvUmV0dXJuKHRydWUpLndoZW4obVZhbGlkVmFsaWRhdG9yMikuaXNWYWxpZChtVmFsdWVGaW5kZXIpOworICAgICAgICBhc3NlcnRUaGF0KCgoSW50ZXJuYWxWYWxpZGF0b3IpIGFuZChtVmFsaWRWYWxpZGF0b3IsIG1WYWxpZFZhbGlkYXRvcjIpKQorICAgICAgICAgICAgICAgIC5pc1ZhbGlkKG1WYWx1ZUZpbmRlcikpLmlzVHJ1ZSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9yX251bGwoKSB7CisgICAgICAgIGFzc2VydFRocm93cyhOdWxsUG9pbnRlckV4Y2VwdGlvbi5jbGFzcywgKCkgLT4gb3IoKFZhbGlkYXRvcikgbnVsbCkpOworICAgICAgICBhc3NlcnRUaHJvd3MoTnVsbFBvaW50ZXJFeGNlcHRpb24uY2xhc3MsICgpIC0+IG9yKG1WYWxpZFZhbGlkYXRvciwgbnVsbCkpOworICAgICAgICBhc3NlcnRUaHJvd3MoTnVsbFBvaW50ZXJFeGNlcHRpb24uY2xhc3MsICgpIC0+IG9yKG51bGwsIG1WYWxpZFZhbGlkYXRvcikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9yX2ludmFsaWQoKSB7CisgICAgICAgIGFzc2VydFRocm93cyhJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MsICgpIC0+IG9yKG1JbnZhbGlkVmFsaWRhdG9yKSk7CisgICAgICAgIGFzc2VydFRocm93cyhJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MsICgpIC0+IG9yKG1WYWxpZFZhbGlkYXRvciwgbUludmFsaWRWYWxpZGF0b3IpKTsKKyAgICAgICAgYXNzZXJ0VGhyb3dzKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcywgKCkgLT4gb3IobUludmFsaWRWYWxpZGF0b3IsIG1WYWxpZFZhbGlkYXRvcikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9yX0FsbEZhaWxlZCgpIHsKKyAgICAgICAgZG9SZXR1cm4oZmFsc2UpLndoZW4obVZhbGlkVmFsaWRhdG9yKS5pc1ZhbGlkKG1WYWx1ZUZpbmRlcik7CisgICAgICAgIGRvUmV0dXJuKGZhbHNlKS53aGVuKG1WYWxpZFZhbGlkYXRvcjIpLmlzVmFsaWQobVZhbHVlRmluZGVyKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgoKEludGVybmFsVmFsaWRhdG9yKSBvcihtVmFsaWRWYWxpZGF0b3IsIG1WYWxpZFZhbGlkYXRvcjIpKQorICAgICAgICAgICAgICAgIC5pc1ZhbGlkKG1WYWx1ZUZpbmRlcikpLmlzRmFsc2UoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPcl9maXJzdFBhc3NlZCgpIHsKKyAgICAgICAgZG9SZXR1cm4odHJ1ZSkud2hlbihtVmFsaWRWYWxpZGF0b3IpLmlzVmFsaWQobVZhbHVlRmluZGVyKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgoKEludGVybmFsVmFsaWRhdG9yKSBvcihtVmFsaWRWYWxpZGF0b3IsIG1WYWxpZFZhbGlkYXRvcjIpKQorICAgICAgICAgICAgICAgIC5pc1ZhbGlkKG1WYWx1ZUZpbmRlcikpLmlzVHJ1ZSgpOworICAgICAgICB2ZXJpZnkobVZhbGlkVmFsaWRhdG9yMiwgbmV2ZXIoKSkuaXNWYWxpZChtVmFsdWVGaW5kZXIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9yX3NlY29uZFBhc3NlZCgpIHsKKyAgICAgICAgZG9SZXR1cm4oZmFsc2UpLndoZW4obVZhbGlkVmFsaWRhdG9yKS5pc1ZhbGlkKG1WYWx1ZUZpbmRlcik7CisgICAgICAgIGRvUmV0dXJuKHRydWUpLndoZW4obVZhbGlkVmFsaWRhdG9yMikuaXNWYWxpZChtVmFsdWVGaW5kZXIpOworICAgICAgICBhc3NlcnRUaGF0KCgoSW50ZXJuYWxWYWxpZGF0b3IpIG9yKG1WYWxpZFZhbGlkYXRvciwgbVZhbGlkVmFsaWRhdG9yMikpCisgICAgICAgICAgICAgICAgLmlzVmFsaWQobVZhbHVlRmluZGVyKSkuaXNUcnVlKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90X251bGwoKSB7CisgICAgICAgIGFzc2VydFRocm93cyhJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MsICgpIC0+IG5vdChudWxsKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90X2ludmFsaWRDbGFzcygpIHsKKyAgICAgICAgYXNzZXJ0VGhyb3dzKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcywgKCkgLT4gbm90KG1JbnZhbGlkVmFsaWRhdG9yKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90X2ZhbHNlVG9UcnVlKCkgeworICAgICAgICBkb1JldHVybihmYWxzZSkud2hlbihtVmFsaWRWYWxpZGF0b3IpLmlzVmFsaWQobVZhbHVlRmluZGVyKTsKKyAgICAgICAgZmluYWwgSW50ZXJuYWxWYWxpZGF0b3Igbm90VmFsaWRhdG9yID0gKEludGVybmFsVmFsaWRhdG9yKSBub3QobVZhbGlkVmFsaWRhdG9yKTsKKyAgICAgICAgYXNzZXJ0VGhhdChub3RWYWxpZGF0b3IuaXNWYWxpZChtVmFsdWVGaW5kZXIpKS5pc1RydWUoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb3RfdHJ1ZVRvRmFsc2UoKSB7CisgICAgICAgIGRvUmV0dXJuKHRydWUpLndoZW4obVZhbGlkVmFsaWRhdG9yKS5pc1ZhbGlkKG1WYWx1ZUZpbmRlcik7CisgICAgICAgIGZpbmFsIEludGVybmFsVmFsaWRhdG9yIG5vdFZhbGlkYXRvciA9IChJbnRlcm5hbFZhbGlkYXRvcikgbm90KG1WYWxpZFZhbGlkYXRvcik7CisgICAgICAgIGFzc2VydFRoYXQobm90VmFsaWRhdG9yLmlzVmFsaWQobVZhbHVlRmluZGVyKSkuaXNGYWxzZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL1ZpZXdBdHRyaWJ1dGVzVGVzdC5qYXZhIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvVmlld0F0dHJpYnV0ZXNUZXN0LmphdmEKaW5kZXggMTVhZTkxYi4uNzc1MDYxYyAxMDA2NDQKLS0tIGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvVmlld0F0dHJpYnV0ZXNUZXN0LmphdmEKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvVmlld0F0dHJpYnV0ZXNUZXN0LmphdmEKQEAgLTIxLDE0ICsyMSwxNyBAQAogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi50cnV0aC5UcnV0aC5hc3NlcnRUaGF0OwogCiBpbXBvcnQgYW5kcm9pZC5hcHAuYXNzaXN0LkFzc2lzdFN0cnVjdHVyZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5JZFJlczsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk51bGxhYmxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYXV0b2ZpbGwuQXV0b2ZpbGxWYWx1ZTsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5FZGl0VGV4dDsKIAorCitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5JZFJlczsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk5vbk51bGw7CitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5OdWxsYWJsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKQEAgLTM3LDYgKzQwLDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CiAKIEBSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCitAQXBwTW9kZUZ1bGwgLy8gVW5pdCB0ZXN0CiBwdWJsaWMgY2xhc3MgVmlld0F0dHJpYnV0ZXNUZXN0IGV4dGVuZHMgQXV0b0ZpbGxTZXJ2aWNlVGVzdENhc2UgewogICAgIEBSdWxlCiAgICAgcHVibGljIGZpbmFsIEF1dG9maWxsQWN0aXZpdHlUZXN0UnVsZTxWaWV3QXR0cmlidXRlc1Rlc3RBY3Rpdml0eT4gbUFjdGl2aXR5UnVsZSA9CkBAIC0xNzUsMjMgKzE3OSwxOCBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCBjaGVja1ZpZXdMb2NhdGlvbkluQXNzaXN0U3RydWN0dXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIElmIHNjcmVlbiBpcyBub3QgbGFyZ2UgZW5vdWdoIHRvIGNvbnRhaW4gY2hpbGQsIHRoZQotICAgICAgICAvLyBoZWlnaHQvd2VpZ2h0IHdpbGwgYmUgdGhlIHJlc2lkdWFsIHNwYWNlIGluc3RlYWQgb2YgdGhlCi0gICAgICAgIC8vIHNwZWNpZmljIHNpemUuCi0gICAgICAgIHNVaUJvdC5hc3N1bWVNaW5pbXVtUmVzb2x1dGlvbig1MDApOwogICAgICAgICBvbkFzc2lzdFN0cnVjdHVyZShmYWxzZSwgKHN0cnVjdHVyZSkgLT4gewogICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBzaXplIG9mIG91dGVyVmlldwogICAgICAgICAgICAgICAgICAgICBBc3Npc3RTdHJ1Y3R1cmUuVmlld05vZGUgb3V0ZXJWaWV3ID0gZmluZE5vZGVCeVJlc291cmNlSWQoc3RydWN0dXJlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdXRlclZpZXciKTsKLQogICAgICAgICAgICAgICAgICAgICAvLyBUaGUgc2l6ZSBvZiB0aGUgdmlldyBzaG91bGQgaW5jbHVkZSBhbGwgcGFkZGluZ3MgYW5kIHNpemUgb2YgYWxsIGNoaWxkcmVuCiAgICAgICAgICAgICAgICAgICAgIGFzc2VydFRoYXQob3V0ZXJWaWV3LmdldEhlaWdodCgpKS5pc0VxdWFsVG8oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAvLyBvdXRlclZpZXcudG9wCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDExICAvLyBuZXN0ZWRWaWV3LnRvcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAyMyAgLy8gZG91YmxlTmVzdGVkVmlldy50b3AKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgNDEgIC8vIHRyaXBsZU5lc3RlZFZpZXcuaGVpZ2h0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDQ3ICAvLyBzZWNvbmREb3VibGVOZXN0ZWRWaWV3LmhlaWdodAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAzMSAgLy8gZG91YmxlTmVzdGVkVmlldy5ib3R0b20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgMTEgIC8vIHRyaXBsZU5lc3RlZFZpZXcuaGVpZ2h0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDE3ICAvLyBzZWNvbmREb3VibGVOZXN0ZWRWaWV3LmhlaWdodAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAxMSAgLy8gZG91YmxlTmVzdGVkVmlldy5ib3R0b20KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgMTcgIC8vIG5lc3RlZFZpZXcuYm90dG9tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDUpOyAvLyBvdXRlclZpZXcuYm90dG9tCiAgICAgICAgICAgICAgICAgICAgIGFzc2VydFRoYXQob3V0ZXJWaWV3LmdldFdpZHRoKCkpLmlzRXF1YWxUbygKZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL1ZpZXdBdHRyaWJ1dGVzVGVzdEFjdGl2aXR5LmphdmEgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9WaWV3QXR0cmlidXRlc1Rlc3RBY3Rpdml0eS5qYXZhCmluZGV4IGQ5YThjZjMuLjQwMDNmNzggMTAwNjQ0Ci0tLSBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL1ZpZXdBdHRyaWJ1dGVzVGVzdEFjdGl2aXR5LmphdmEKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvVmlld0F0dHJpYnV0ZXNUZXN0QWN0aXZpdHkuamF2YQpAQCAtMTcsNyArMTcsNyBAQAogcGFja2FnZSBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHM7CiAKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk51bGxhYmxlOwogCiBwdWJsaWMgY2xhc3MgVmlld0F0dHJpYnV0ZXNUZXN0QWN0aXZpdHkgZXh0ZW5kcyBBYnN0cmFjdEF1dG9GaWxsQWN0aXZpdHkgewogICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvVmlydHVhbENvbnRhaW5lckFjdGl2aXR5LmphdmEgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9WaXJ0dWFsQ29udGFpbmVyQWN0aXZpdHkuamF2YQppbmRleCA2NWYzMzc4Li5hOTBiODQwIDEwMDY0NAotLS0gYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9WaXJ0dWFsQ29udGFpbmVyQWN0aXZpdHkuamF2YQorKysgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9WaXJ0dWFsQ29udGFpbmVyQWN0aXZpdHkuamF2YQpAQCAtMjYsNiArMjYsOCBAQAogaW1wb3J0IGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5WaXJ0dWFsQ29udGFpbmVyVmlldy5MaW5lLk9uZVRpbWVMaW5lV2F0Y2hlcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuSW5wdXRUeXBlOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkVkaXRUZXh0OwogCiAvKioKICAqIEEgY3VzdG9tIGFjdGl2aXR5IHRoYXQgdXNlcyB7QGxpbmsgQ2FudmFzfSB0byBkcmF3IHRoZSBmb2xsb3dpbmcgZmllbGRzOgpAQCAtMzgsNyArNDAsMTAgQEAKIHB1YmxpYyBjbGFzcyBWaXJ0dWFsQ29udGFpbmVyQWN0aXZpdHkgZXh0ZW5kcyBBYnN0cmFjdEF1dG9GaWxsQWN0aXZpdHkgewogCiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBCTEFOS19WQUxVRSA9ICIgICAgICAgICI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBJTklUSUFMX1VSTF9CQVJfVkFMVUUgPSAiZnRwOi8vZGV2Lm51bGwvNC84LzE1LzE2LzIzLzQyIjsKIAorICAgIEVkaXRUZXh0IG1VcmxCYXI7CisgICAgRWRpdFRleHQgbVVybEJhcjI7CiAgICAgVmlydHVhbENvbnRhaW5lclZpZXcgbUN1c3RvbVZpZXc7CiAKICAgICBMaW5lIG1Vc2VybmFtZTsKQEAgLTUyLDEwICs1NywxNSBAQAogCiAgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LnZpcnR1YWxfY29udGFpbmVyX2FjdGl2aXR5KTsKIAorICAgICAgICBtVXJsQmFyID0gZmluZFZpZXdCeUlkKFIuaWQubXlfdXJsX2Jhcik7CisgICAgICAgIG1VcmxCYXIyID0gZmluZFZpZXdCeUlkKFIuaWQubXlfdXJsX2JhcjIpOwogICAgICAgICBtQ3VzdG9tVmlldyA9IGZpbmRWaWV3QnlJZChSLmlkLnZpcnR1YWxfY29udGFpbmVyX3ZpZXcpOwogCi0gICAgICAgIG1Vc2VybmFtZSA9IG1DdXN0b21WaWV3LmFkZExpbmUoSURfVVNFUk5BTUVfTEFCRUwsICJVc2VybmFtZSIsIElEX1VTRVJOQU1FLCBCTEFOS19WQUxVRSk7Ci0gICAgICAgIG1QYXNzd29yZCA9IG1DdXN0b21WaWV3LmFkZExpbmUoSURfUEFTU1dPUkRfTEFCRUwsICJQYXNzd29yZCIsIElEX1BBU1NXT1JELCBCTEFOS19WQUxVRSk7CisgICAgICAgIG1VcmxCYXIuc2V0VGV4dChJTklUSUFMX1VSTF9CQVJfVkFMVUUpOworICAgICAgICBtVXNlcm5hbWUgPSBtQ3VzdG9tVmlldy5hZGRMaW5lKElEX1VTRVJOQU1FX0xBQkVMLCAiVXNlcm5hbWUiLCBJRF9VU0VSTkFNRSwgQkxBTktfVkFMVUUsCisgICAgICAgICAgICAgICAgSW5wdXRUeXBlLlRZUEVfQ0xBU1NfVEVYVCB8IElucHV0VHlwZS5UWVBFX1RFWFRfVkFSSUFUSU9OX05PUk1BTCk7CisgICAgICAgIG1QYXNzd29yZCA9IG1DdXN0b21WaWV3LmFkZExpbmUoSURfUEFTU1dPUkRfTEFCRUwsICJQYXNzd29yZCIsIElEX1BBU1NXT1JELCBCTEFOS19WQUxVRSwKKyAgICAgICAgICAgICAgICBJbnB1dFR5cGUuVFlQRV9DTEFTU19URVhUIHwgSW5wdXRUeXBlLlRZUEVfVEVYVF9WQVJJQVRJT05fUEFTU1dPUkQpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvVmlydHVhbENvbnRhaW5lckFjdGl2aXR5Q29tcGF0TW9kZVRlc3QuamF2YSBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL1ZpcnR1YWxDb250YWluZXJBY3Rpdml0eUNvbXBhdE1vZGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNkZTA0ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL1ZpcnR1YWxDb250YWluZXJBY3Rpdml0eUNvbXBhdE1vZGVUZXN0LmphdmEKQEAgLTAsMCArMSwzMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHM7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5JRF9QQVNTV09SRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5JRF9VU0VSTkFNRTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5hc3NlcnRUZXh0QW5kVmFsdWU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5IZWxwZXIuYXNzZXJ0VGV4dElzU2FuaXRpemVkOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSGVscGVyLmZpbmROb2RlQnlSZXNvdXJjZUlkOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSGVscGVyLmdldENvbnRleHQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5IZWxwZXIuaGFzQXV0b2ZpbGxGZWF0dXJlOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSW5zdHJ1bWVudGVkQXV0b0ZpbGxTZXJ2aWNlQ29tcGF0TW9kZS5TRVJWSUNFX05BTUU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5JbnN0cnVtZW50ZWRBdXRvRmlsbFNlcnZpY2VDb21wYXRNb2RlLlNFUlZJQ0VfUEFDS0FHRTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLlZpcnR1YWxDb250YWluZXJBY3Rpdml0eS5JTklUSUFMX1VSTF9CQVJfVkFMVUU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5WaXJ0dWFsQ29udGFpbmVyVmlldy5JRF9VUkxfQkFSOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuVmlydHVhbENvbnRhaW5lclZpZXcuSURfVVJMX0JBUjI7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5jb21tb24uU2V0dGluZ3NIZWxwZXIuTkFNRVNQQUNFX0dMT0JBTDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5HbG9iYWwuQVVUT0ZJTExfQ09NUEFUX01PREVfQUxMT1dFRF9QQUNLQUdFUzsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2aWNlLmF1dG9maWxsLlNhdmVJbmZvLlNBVkVfREFUQV9UWVBFX1BBU1NXT1JEOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLnRydXRoLlRydXRoLmFzc2VydFRoYXQ7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5hc3Npc3QuQXNzaXN0U3RydWN0dXJlLlZpZXdOb2RlOworaW1wb3J0IGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5DYW5uZWRGaWxsUmVzcG9uc2UuQ2FubmVkRGF0YXNldDsKK2ltcG9ydCBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSW5zdHJ1bWVudGVkQXV0b0ZpbGxTZXJ2aWNlLkZpbGxSZXF1ZXN0OworaW1wb3J0IGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5JbnN0cnVtZW50ZWRBdXRvRmlsbFNlcnZpY2UuU2F2ZVJlcXVlc3Q7CitpbXBvcnQgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLmNvbW1vbi5TZXR0aW5nc0hlbHBlcjsKK2ltcG9ydCBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuY29tbW9uLlNldHRpbmdzU3RhdGVDaGFuZ2VyUnVsZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKK2ltcG9ydCBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuU2F2ZUluZm87CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5DbGFzc1J1bGU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogVGVzdCBjYXNlIGZvciBhbiBhY3Rpdml0eSBjb250YWluaW5nIHZpcnR1YWwgY2hpbGRyZW4gYnV0IHVzaW5nIHRoZSBBMTFZIGNvbXBhdCBtb2RlIHRvIGltcGxlbWVudAorICogdGhlIEF1dG9maWxsIEFQSXMuCisgKi8KK3B1YmxpYyBjbGFzcyBWaXJ0dWFsQ29udGFpbmVyQWN0aXZpdHlDb21wYXRNb2RlVGVzdCBleHRlbmRzIFZpcnR1YWxDb250YWluZXJBY3Rpdml0eVRlc3QgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbnRleHQgc0NvbnRleHQgPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCk7CisKKyAgICBAQ2xhc3NSdWxlCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTZXR0aW5nc1N0YXRlQ2hhbmdlclJ1bGUgc0NvbXBhdE1vZGVDaGFuZ2VyID0gbmV3IFNldHRpbmdzU3RhdGVDaGFuZ2VyUnVsZSgKKyAgICAgICAgICAgIHNDb250ZXh0LCBOQU1FU1BBQ0VfR0xPQkFMLCBBVVRPRklMTF9DT01QQVRfTU9ERV9BTExPV0VEX1BBQ0tBR0VTLAorICAgICAgICAgICAgU0VSVklDRV9QQUNLQUdFICsgIltteV91cmxfYmFyXSIpOworCisgICAgcHVibGljIFZpcnR1YWxDb250YWluZXJBY3Rpdml0eUNvbXBhdE1vZGVUZXN0KCkgeworICAgICAgICBzdXBlcih0cnVlKTsKKyAgICB9CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCByZXNldENvbXBhdE1vZGUoKSB7CisgICAgICAgIHNDb250ZXh0LmdldEFwcGxpY2F0aW9uQ29udGV4dCgpLnNldEF1dG9maWxsQ29tcGF0aWJpbGl0eUVuYWJsZWQoZmFsc2UpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHByZUFjdGl2aXR5Q3JlYXRlZCgpIHsKKyAgICAgICAgc0NvbnRleHQuZ2V0QXBwbGljYXRpb25Db250ZXh0KCkuc2V0QXV0b2ZpbGxDb21wYXRpYmlsaXR5RW5hYmxlZCh0cnVlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBwb3N0QWN0aXZpdHlMYXVuY2hlZChWaXJ0dWFsQ29udGFpbmVyQWN0aXZpdHkgYWN0aXZpdHkpIHsKKyAgICAgICAgLy8gU2V0IG91ciBvd24gY29tcGF0IG1vZGUgYXMgd2VsbC4uCisgICAgICAgIGFjdGl2aXR5Lm1DdXN0b21WaWV3LnNldENvbXBhdE1vZGUodHJ1ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZW5hYmxlU2VydmljZSgpIHsKKyAgICAgICAgSGVscGVyLmVuYWJsZUF1dG9maWxsU2VydmljZShnZXRDb250ZXh0KCksIFNFUlZJQ0VfTkFNRSk7CisgICAgICAgIEluc3RydW1lbnRlZEF1dG9GaWxsU2VydmljZUNvbXBhdE1vZGUuc2V0SWdub3JlVW5leHBlY3RlZFJlcXVlc3RzKGZhbHNlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBkaXNhYmxlU2VydmljZSgpIHsKKyAgICAgICAgaWYgKCFoYXNBdXRvZmlsbEZlYXR1cmUoKSkgcmV0dXJuOworCisgICAgICAgIEhlbHBlci5kaXNhYmxlQXV0b2ZpbGxTZXJ2aWNlKGdldENvbnRleHQoKSwgU0VSVklDRV9OQU1FKTsKKyAgICAgICAgSW5zdHJ1bWVudGVkQXV0b0ZpbGxTZXJ2aWNlQ29tcGF0TW9kZS5zZXRJZ25vcmVVbmV4cGVjdGVkUmVxdWVzdHModHJ1ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0VXJsQmFySXNTYW5pdGl6ZWQoVmlld05vZGUgdXJsQmFyKSB7CisgICAgICAgIGFzc2VydFRleHRJc1Nhbml0aXplZCh1cmxCYXIpOworICAgICAgICBhc3NlcnRUaGF0KHVybEJhci5nZXRXZWJEb21haW4oKSkuaXNFcXVhbFRvKCJkZXYubnVsbCIpOworICAgICAgICBhc3NlcnRUaGF0KHVybEJhci5nZXRXZWJTY2hlbWUoKSkuaXNFcXVhbFRvKCJmdHAiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZVVybEJhcnNfZmlyc3REb2VzTm90RXhpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU2V0dGluZ3NIZWxwZXIuc3luY1NldChzQ29udGV4dCwgTkFNRVNQQUNFX0dMT0JBTCwgQVVUT0ZJTExfQ09NUEFUX01PREVfQUxMT1dFRF9QQUNLQUdFUywKKyAgICAgICAgICAgICAgICBTRVJWSUNFX1BBQ0tBR0UgKyAiW2ZpcnN0X2FtX2ksbXlfdXJsX2Jhcl0iKTsKKworICAgICAgICAvLyBTZXQgc2VydmljZS4KKyAgICAgICAgZW5hYmxlU2VydmljZSgpOworCisgICAgICAgIC8vIFNldCBleHBlY3RhdGlvbnMuCisgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgImR1ZGUiLCBjcmVhdGVQcmVzZW50YXRpb24oIkRVREUiKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gVHJpZ2dlciBhdXRvZmlsbC4KKyAgICAgICAgZm9jdXNUb1VzZXJuYW1lKCk7CisgICAgICAgIGFzc2VydERhdGFzZXRTaG93bihtQWN0aXZpdHkubVVzZXJuYW1lLCAiRFVERSIpOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSBpbnB1dCB3YXMgc2FuaXRpemVkLgorICAgICAgICBmaW5hbCBGaWxsUmVxdWVzdCByZXF1ZXN0ID0gc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CisgICAgICAgIGZpbmFsIFZpZXdOb2RlIHVybEJhciA9IGZpbmROb2RlQnlSZXNvdXJjZUlkKHJlcXVlc3Quc3RydWN0dXJlLCBJRF9VUkxfQkFSKTsKKworICAgICAgICBhc3NlcnRVcmxCYXJJc1Nhbml0aXplZCh1cmxCYXIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgQEFwcE1vZGVGdWxsIC8vIHRlc3RNdWx0aXBsZVVybEJhcnNfZmlyc3REb2VzTm90RXhpc3QoKSBpcyBlbm91Z2ggdG8gdGVzdCBlcGhlbWVyYWwgYXBwcyBzdXBwb3J0CisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlVXJsQmFyc19ib3RoRXhpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU2V0dGluZ3NIZWxwZXIuc3luY1NldChzQ29udGV4dCwgTkFNRVNQQUNFX0dMT0JBTCwgQVVUT0ZJTExfQ09NUEFUX01PREVfQUxMT1dFRF9QQUNLQUdFUywKKyAgICAgICAgICAgICAgICBTRVJWSUNFX1BBQ0tBR0UgKyAiW215X3VybF9iYXIsbXlfdXJsX2JhcjJdIik7CisKKyAgICAgICAgLy8gU2V0IHNlcnZpY2UuCisgICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKKworICAgICAgICAvLyBTZXQgZXhwZWN0YXRpb25zLgorICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfVVNFUk5BTUUsICJkdWRlIiwgY3JlYXRlUHJlc2VudGF0aW9uKCJEVURFIikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIC8vIFRyaWdnZXIgYXV0b2ZpbGwuCisgICAgICAgIGZvY3VzVG9Vc2VybmFtZSgpOworICAgICAgICBhc3NlcnREYXRhc2V0U2hvd24obUFjdGl2aXR5Lm1Vc2VybmFtZSwgIkRVREUiKTsKKworICAgICAgICAvLyBNYWtlIHN1cmUgaW5wdXQgd2FzIHNhbml0aXplZC4KKyAgICAgICAgZmluYWwgRmlsbFJlcXVlc3QgcmVxdWVzdCA9IHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOworICAgICAgICBmaW5hbCBWaWV3Tm9kZSB1cmxCYXIgPSBmaW5kTm9kZUJ5UmVzb3VyY2VJZChyZXF1ZXN0LnN0cnVjdHVyZSwgSURfVVJMX0JBUik7CisgICAgICAgIGZpbmFsIFZpZXdOb2RlIHVybEJhcjIgPSBmaW5kTm9kZUJ5UmVzb3VyY2VJZChyZXF1ZXN0LnN0cnVjdHVyZSwgSURfVVJMX0JBUjIpOworCisgICAgICAgIGFzc2VydFVybEJhcklzU2FuaXRpemVkKHVybEJhcik7CisgICAgICAgIGFzc2VydFRleHRJc1Nhbml0aXplZCh1cmxCYXIyKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBBcHBNb2RlRnVsbCAvLyB0ZXN0TXVsdGlwbGVVcmxCYXJzX2ZpcnN0RG9lc05vdEV4aXN0KCkgaXMgZW5vdWdoIHRvIHRlc3QgZXBoZW1lcmFsIGFwcHMgc3VwcG9ydAorICAgIHB1YmxpYyB2b2lkIHRlc3RGb2N1c09uVXJsQmFySXNJZ25vcmVkKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIC8vIFNldCBzZXJ2aWNlLgorICAgICAgICBlbmFibGVTZXJ2aWNlKCk7CisKKyAgICAgICAgLy8gU2V0IGV4cGVjdGF0aW9ucy4KKyAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UobmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0UmVxdWlyZWRTYXZhYmxlSWRzKFNBVkVfREFUQV9UWVBFX1BBU1NXT1JELCBJRF9VU0VSTkFNRSwgSURfUEFTU1dPUkQpLmJ1aWxkKCkpOworCisgICAgICAgIC8vIFRyaWdnZXIgYXV0by1maWxsLgorICAgICAgICBmb2N1c1RvVXNlcm5hbWVFeHBlY3ROb1dpbmRvd0V2ZW50KCk7CisgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOworCisgICAgICAgIG1BY3Rpdml0eS5zeW5jUnVuT25VaVRocmVhZCgoKSAtPiBtQWN0aXZpdHkubVVybEJhci5yZXF1ZXN0Rm9jdXMoKSk7CisKKyAgICAgICAgLy8gTXVzdCBmb3JjZSBzbGVlcCwgYXMgdGhlcmUgaXMgbm8gY2FsbGJhY2sgdGhhdCB3ZSBjYW4gd2FpdCB1cG9uLgorICAgICAgICBTeXN0ZW1DbG9jay5zbGVlcChUaW1lb3V0cy5GSUxMX1RJTUVPVVQubXMoKSk7CisKKyAgICAgICAgc1JlcGxpZXIuYXNzZXJ0Tm9VbmhhbmRsZWRGaWxsUmVxdWVzdHMoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBBcHBNb2RlRnVsbCAvLyB0ZXN0TXVsdGlwbGVVcmxCYXJzX2ZpcnN0RG9lc05vdEV4aXN0KCkgaXMgZW5vdWdoIHRvIHRlc3QgZXBoZW1lcmFsIGFwcHMgc3VwcG9ydAorICAgIHB1YmxpYyB2b2lkIHRlc3RVcmxCYXJDaGFuZ2VJZ25vcmVkV2hlblNlcnZpY2VDYW5TYXZlKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIC8vIFNldCBzZXJ2aWNlLgorICAgICAgICBlbmFibGVTZXJ2aWNlKCk7CisKKyAgICAgICAgLy8gU2V0IGV4cGVjdGF0aW9ucy4KKyAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UobmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0U2F2ZUluZm9GbGFncyhTYXZlSW5mby5GTEFHX1NBVkVfT05fQUxMX1ZJRVdTX0lOVklTSUJMRSkKKyAgICAgICAgICAgICAgICAuc2V0UmVxdWlyZWRTYXZhYmxlSWRzKFNBVkVfREFUQV9UWVBFX1BBU1NXT1JELCBJRF9VU0VSTkFNRSwgSURfUEFTU1dPUkQpLmJ1aWxkKCkpOworCisgICAgICAgIC8vIFRyaWdnZXIgYXV0by1maWxsLgorICAgICAgICBmb2N1c1RvVXNlcm5hbWVFeHBlY3ROb1dpbmRvd0V2ZW50KCk7CisgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOworCisgICAgICAgIC8vIEZpbGwgaW4gc29tZSBzdHVmZgorICAgICAgICBtQWN0aXZpdHkubVVzZXJuYW1lLnNldFRleHQoImZvbyIpOworICAgICAgICBmb2N1c1RvUGFzc3dvcmRFeHBlY3ROb1dpbmRvd0V2ZW50KCk7CisgICAgICAgIG1BY3Rpdml0eS5tUGFzc3dvcmQuc2V0VGV4dCgiYmFyIik7CisKKyAgICAgICAgLy8gQ2hhbmdlIFVSTCBiYXIgYmVmb3JlIHZpZXdzIGJlY29tZSBpbnZpc2libGUKKyAgICAgICAgZmluYWwgT25lVGltZVRleHRXYXRjaGVyIHVybFdhdGNoZXIgPSBuZXcgT25lVGltZVRleHRXYXRjaGVyKCJ1cmxXYXRjaGVyIiwKKyAgICAgICAgICAgICAgICBtQWN0aXZpdHkubVVybEJhciwgImh0dHA6Ly9udWxsL2RldiIpOworICAgICAgICBtQWN0aXZpdHkubVVybEJhci5hZGRUZXh0Q2hhbmdlZExpc3RlbmVyKHVybFdhdGNoZXIpOworICAgICAgICBtQWN0aXZpdHkuc3luY1J1bk9uVWlUaHJlYWQoKCkgLT4gbUFjdGl2aXR5Lm1VcmxCYXIuc2V0VGV4dCgiaHR0cDovL251bGwvZGV2IikpOworICAgICAgICB1cmxXYXRjaGVyLmFzc2VydEF1dG9GaWxsZWQoKTsKKworICAgICAgICAvLyBUcmlnZ2VyIHNhdmUuCisgICAgICAgIC8vIFRPRE8oYi83NjIyMDU2OSk6IGlkZWFsbHksIHNhdmUgc2hvdWxkIGJlIHRyaWdnZXJlZCBieSBjYWxsaW5nOgorICAgICAgICAvLworICAgICAgICAvLyBzZXRWaWV3c0ludmlzaWJsZShWaXNpYmlsaXR5SW50ZWdyYXRpb25Nb2RlLk9WRVJSSURFX0lTX1ZJU0lCTEVfVE9fVVNFUik7CisgICAgICAgIC8vCisgICAgICAgIC8vIEJ1dCB1bmZvcnR1bmF0ZWx5IHRoYXQncyBub3QgYWx3YXlzIHdvcmtpbmcgZHVlIHRvIGZsYWtpbmVzcyBvbiBzaG93aW5nIHRoZSBVSSwgaGVuY2UKKyAgICAgICAgLy8gd2UncmUgZm9yY2luZyBjb21taXQgLSBhZnRlciBhbGwsIHRoZSBwb2ludCBoZXJlIGlzIHRoZSB0aGUgVVJMIHVwZGF0ZSBhYm92ZSBkaWRuJ3QKKyAgICAgICAgLy8gY2FuY2VsIHRoZSBzZXNzaW9uICh3aGljaCBpcyB0aGUgY2FzZSBvbgorICAgICAgICAvLyB0ZXN0VXJsQmFyQ2hhbmdlQ2FuY2VsU2Vzc2lvbldoZW5TZXJ2aWNlQ2Fubm90U2F2ZSgpCisgICAgICAgIG1BY3Rpdml0eS5nZXRBdXRvZmlsbE1hbmFnZXIoKS5jb21taXQoKTsKKworICAgICAgICAvLyBBc3NlcnQgVUkgaXMgc2hvd2luZy4KKyAgICAgICAgbVVpQm90LnNhdmVGb3JBdXRvZmlsbCh0cnVlLCBTQVZFX0RBVEFfVFlQRV9QQVNTV09SRCk7CisKKyAgICAgICAgLy8gQXNzZXJ0IHJlc3VsdHMKKyAgICAgICAgZmluYWwgU2F2ZVJlcXVlc3Qgc2F2ZVJlcXVlc3QgPSBzUmVwbGllci5nZXROZXh0U2F2ZVJlcXVlc3QoKTsKKyAgICAgICAgZmluYWwgVmlld05vZGUgdXNlcm5hbWUgPSBmaW5kTm9kZUJ5UmVzb3VyY2VJZChzYXZlUmVxdWVzdC5zdHJ1Y3R1cmUsIElEX1VTRVJOQU1FKTsKKyAgICAgICAgZmluYWwgVmlld05vZGUgcGFzc3dvcmQgPSBmaW5kTm9kZUJ5UmVzb3VyY2VJZChzYXZlUmVxdWVzdC5zdHJ1Y3R1cmUsIElEX1BBU1NXT1JEKTsKKyAgICAgICAgZmluYWwgVmlld05vZGUgdXJsQmFyID0gZmluZE5vZGVCeVJlc291cmNlSWQoc2F2ZVJlcXVlc3Quc3RydWN0dXJlLCBJRF9VUkxfQkFSKTsKKworICAgICAgICBhc3NlcnRUZXh0QW5kVmFsdWUodXNlcm5hbWUsICJmb28iKTsKKyAgICAgICAgYXNzZXJ0VGV4dEFuZFZhbHVlKHBhc3N3b3JkLCAiYmFyIik7CisgICAgICAgIC8vIE1ha2Ugc3VyZSBpdCdzIHRoZSBVUkwgYmFyIGZyb20gaW5pdGlhbCBzZXNzaW9uLgorICAgICAgICBhc3NlcnRUZXh0QW5kVmFsdWUodXJsQmFyLCBJTklUSUFMX1VSTF9CQVJfVkFMVUUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgQEFwcE1vZGVGdWxsIC8vIHRlc3RNdWx0aXBsZVVybEJhcnNfZmlyc3REb2VzTm90RXhpc3QoKSBpcyBlbm91Z2ggdG8gdGVzdCBlcGhlbWVyYWwgYXBwcyBzdXBwb3J0CisgICAgcHVibGljIHZvaWQgdGVzdFVybEJhckNoYW5nZUNhbmNlbFNlc3Npb25XaGVuU2VydmljZUNhbm5vdFNhdmUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgLy8gU2V0IHNlcnZpY2UuCisgICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKKworICAgICAgICAvLyBTZXQgZXhwZWN0YXRpb25zLgorICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5hZGREYXRhc2V0KG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfVVNFUk5BTUUsICJkdWRlIikKKyAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1BBU1NXT1JELCAic3dlZXQiKQorICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiVGhlIER1ZGUiKSkKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLy8gdGhlcmUncyBubyBTYXZlSW5mbyBoZXJlCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIC8vIFRyaWdnZXIgYXV0by1maWxsLgorICAgICAgICBmb2N1c1RvVXNlcm5hbWVFeHBlY3ROb1dpbmRvd0V2ZW50KCk7CisgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOworICAgICAgICBhc3NlcnREYXRhc2V0U2hvd24obUFjdGl2aXR5Lm1Vc2VybmFtZSwgIlRoZSBEdWRlIik7CisKKyAgICAgICAgLy8gRmlsbCBpbiBzb21lIHN0dWZmCisgICAgICAgIG1BY3Rpdml0eS5tVXNlcm5hbWUuc2V0VGV4dCgiZm9vIik7CisgICAgICAgIGZvY3VzVG9QYXNzd29yZEV4cGVjdE5vV2luZG93RXZlbnQoKTsKKyAgICAgICAgbUFjdGl2aXR5Lm1QYXNzd29yZC5zZXRUZXh0KCJiYXIiKTsKKworICAgICAgICAvLyBDaGFuZ2UgVVJMIGJhciBiZWZvcmUgdmlld3MgYmVjb21lIGludmlzaWJsZQorICAgICAgICBmaW5hbCBPbmVUaW1lVGV4dFdhdGNoZXIgdXJsV2F0Y2hlciA9IG5ldyBPbmVUaW1lVGV4dFdhdGNoZXIoInVybFdhdGNoZXIiLAorICAgICAgICAgICAgICAgIG1BY3Rpdml0eS5tVXJsQmFyLCAiaHR0cDovL251bGwvZGV2Iik7CisgICAgICAgIG1BY3Rpdml0eS5tVXJsQmFyLmFkZFRleHRDaGFuZ2VkTGlzdGVuZXIodXJsV2F0Y2hlcik7CisgICAgICAgIG1BY3Rpdml0eS5zeW5jUnVuT25VaVRocmVhZCgoKSAtPiBtQWN0aXZpdHkubVVybEJhci5zZXRUZXh0KCJodHRwOi8vbnVsbC9kZXYiKSk7CisgICAgICAgIHVybFdhdGNoZXIuYXNzZXJ0QXV0b0ZpbGxlZCgpOworCisgICAgICAgIC8vIFRyaWdnZXIgc2F2ZS4uLgorICAgICAgICBtQWN0aXZpdHkuZ2V0QXV0b2ZpbGxNYW5hZ2VyKCkuY29tbWl0KCk7CisKKyAgICAgICAgLy8gLi4uIHNob3VsZCBub3QgYmUgdHJpZ2dlcmVkIGJlY2F1c2UgdGhlIHNlc3Npb24gd2FzIGFscmVhZHkgY2FuY2VsZWQuLi4KKyAgICAgICAgbVVpQm90LmFzc2VydFNhdmVOb3RTaG93aW5nKFNBVkVfREFUQV9UWVBFX1BBU1NXT1JEKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBBcHBNb2RlRnVsbCAvLyB0ZXN0TXVsdGlwbGVVcmxCYXJzX2ZpcnN0RG9lc05vdEV4aXN0KCkgaXMgZW5vdWdoIHRvIHRlc3QgZXBoZW1lcmFsIGFwcHMgc3VwcG9ydAorICAgIHB1YmxpYyB2b2lkIHRlc3RVcmxCYXJDaGFuZ2VDYW5jZWxTZXNzaW9uV2hlblNlcnZpY2VSZXR1cm5zTnVsbFJlc3BvbnNlKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIC8vIFNldCBzZXJ2aWNlLgorICAgICAgICBlbmFibGVTZXJ2aWNlKCk7CisKKyAgICAgICAgLy8gU2V0IGV4cGVjdGF0aW9ucy4KKyAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UoQ2FubmVkRmlsbFJlc3BvbnNlLk5PX1JFU1BPTlNFKTsKKworICAgICAgICAvLyBUcmlnZ2VyIGF1dG8tZmlsbC4KKyAgICAgICAgZm9jdXNUb1VzZXJuYW1lRXhwZWN0Tm9XaW5kb3dFdmVudCgpOworICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKKworICAgICAgICAvLyBGaWxsIGluIHNvbWUgc3R1ZmYKKyAgICAgICAgbUFjdGl2aXR5Lm1Vc2VybmFtZS5zZXRUZXh0KCJmb28iKTsKKyAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UoQ2FubmVkRmlsbFJlc3BvbnNlLk5PX1JFU1BPTlNFKTsKKyAgICAgICAgZm9jdXNUb1Bhc3N3b3JkRXhwZWN0Tm9XaW5kb3dFdmVudCgpOworICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKKyAgICAgICAgbUFjdGl2aXR5Lm1QYXNzd29yZC5zZXRUZXh0KCJiYXIiKTsKKworICAgICAgICAvLyBDaGFuZ2UgVVJMIGJhciBiZWZvcmUgdmlld3MgYmVjb21lIGludmlzaWJsZQorICAgICAgICBmaW5hbCBPbmVUaW1lVGV4dFdhdGNoZXIgdXJsV2F0Y2hlciA9IG5ldyBPbmVUaW1lVGV4dFdhdGNoZXIoInVybFdhdGNoZXIiLAorICAgICAgICAgICAgICAgIG1BY3Rpdml0eS5tVXJsQmFyLCAiaHR0cDovL251bGwvZGV2Iik7CisgICAgICAgIG1BY3Rpdml0eS5tVXJsQmFyLmFkZFRleHRDaGFuZ2VkTGlzdGVuZXIodXJsV2F0Y2hlcik7CisgICAgICAgIG1BY3Rpdml0eS5zeW5jUnVuT25VaVRocmVhZCgoKSAtPiBtQWN0aXZpdHkubVVybEJhci5zZXRUZXh0KCJodHRwOi8vbnVsbC9kZXYiKSk7CisgICAgICAgIHVybFdhdGNoZXIuYXNzZXJ0QXV0b0ZpbGxlZCgpOworCisgICAgICAgIC8vIFRyaWdnZXIgc2F2ZS4uLgorICAgICAgICBtQWN0aXZpdHkuZ2V0QXV0b2ZpbGxNYW5hZ2VyKCkuY29tbWl0KCk7CisKKyAgICAgICAgLy8gLi4uIHNob3VsZCBub3QgYmUgdHJpZ2dlcmVkIGJlY2F1c2UgdGhlIHNlc3Npb24gd2FzIGFscmVhZHkgY2FuY2VsZWQuLi4KKyAgICAgICAgbVVpQm90LmFzc2VydFNhdmVOb3RTaG93aW5nKFNBVkVfREFUQV9UWVBFX1BBU1NXT1JEKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9WaXJ0dWFsQ29udGFpbmVyQWN0aXZpdHlUZXN0LmphdmEgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9WaXJ0dWFsQ29udGFpbmVyQWN0aXZpdHlUZXN0LmphdmEKaW5kZXggMzFlYWUyNC4uODRjYjFmNiAxMDA2NDQKLS0tIGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvVmlydHVhbENvbnRhaW5lckFjdGl2aXR5VGVzdC5qYXZhCisrKyBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL1ZpcnR1YWxDb250YWluZXJBY3Rpdml0eVRlc3QuamF2YQpAQCAtMjIsOCArMjIsMTAgQEAKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5JRF9VU0VSTkFNRV9MQUJFTDsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5hc3NlcnRUZXh0QW5kVmFsdWU7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5IZWxwZXIuYXNzZXJ0VGV4dElzU2FuaXRpemVkOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSGVscGVyLmFzc2VydFRleHRPbmx5OwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSGVscGVyLmR1bXBTdHJ1Y3R1cmU7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5IZWxwZXIuZmluZE5vZGVCeVJlc291cmNlSWQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5WaXJ0dWFsQ29udGFpbmVyVmlldy5JRF9VUkxfQkFSOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuVmlydHVhbENvbnRhaW5lclZpZXcuTEFCRUxfQ0xBU1M7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5WaXJ0dWFsQ29udGFpbmVyVmlldy5URVhUX0NMQVNTOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuU2F2ZUluZm8uU0FWRV9EQVRBX1RZUEVfUEFTU1dPUkQ7CkBAIC0zMSw0NCArMzMsNzQgQEAKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24udHJ1dGguVHJ1dGguYXNzZXJ0VGhhdDsKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24udHJ1dGguVHJ1dGguYXNzZXJ0V2l0aE1lc3NhZ2U7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc3VtZS5hc3N1bWVUcnVlOworCiBpbXBvcnQgYW5kcm9pZC5hcHAuYXNzaXN0LkFzc2lzdFN0cnVjdHVyZS5WaWV3Tm9kZTsKIGltcG9ydCBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuQ2FubmVkRmlsbFJlc3BvbnNlLkNhbm5lZERhdGFzZXQ7CiBpbXBvcnQgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkluc3RydW1lbnRlZEF1dG9GaWxsU2VydmljZS5GaWxsUmVxdWVzdDsKK2ltcG9ydCBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuSW5zdHJ1bWVudGVkQXV0b0ZpbGxTZXJ2aWNlLlNhdmVSZXF1ZXN0OwogaW1wb3J0IGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5WaXJ0dWFsQ29udGFpbmVyVmlldy5MaW5lOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5WaXJ0dWFsQ29udGFpbmVyVmlldy5WaXNpYmlsaXR5SW50ZWdyYXRpb25Nb2RlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKLWltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIGltcG9ydCBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuU2F2ZUluZm87CiBpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QudWlhdXRvbWF0b3IuVWlPYmplY3QyOworaW1wb3J0IGFuZHJvaWQudGV4dC5JbnB1dFR5cGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYXV0b2ZpbGwuQXV0b2ZpbGxNYW5hZ2VyOwogCi1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVvdXRFeGNlcHRpb247CiAKIC8qKgotICogVGVzdCBjYXNlIGZvciBhbiBhY3Rpdml0eSBjb250YWluaW5nIHZpcnR1YWwgY2hpbGRyZW4uCisgKiBUZXN0IGNhc2UgZm9yIGFuIGFjdGl2aXR5IGNvbnRhaW5pbmcgdmlydHVhbCBjaGlsZHJlbiwgZWl0aGVyIHVzaW5nIHRoZSBleHBsaWNpdCBBdXRvZmlsbCBBUElzCisgKiBvciBDb21wYXQgbW9kZS4KICAqLwogcHVibGljIGNsYXNzIFZpcnR1YWxDb250YWluZXJBY3Rpdml0eVRlc3QgZXh0ZW5kcyBBdXRvRmlsbFNlcnZpY2VUZXN0Q2FzZSB7CiAKKyAgICAvLyBUT0RPKGIvNzQyNTYzMDApOiByZW1vdmUgd2hlbiBmaXhlZCBpdCA6LSkKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIEJVR183NDI1NjMwMF9GSVhFRCA9IGZhbHNlOworCiAgICAgQFJ1bGUKICAgICBwdWJsaWMgZmluYWwgQXV0b2ZpbGxBY3Rpdml0eVRlc3RSdWxlPFZpcnR1YWxDb250YWluZXJBY3Rpdml0eT4gbUFjdGl2aXR5UnVsZSA9Ci0gICAgICAgICAgICBuZXcgQXV0b2ZpbGxBY3Rpdml0eVRlc3RSdWxlPFZpcnR1YWxDb250YWluZXJBY3Rpdml0eT4oVmlydHVhbENvbnRhaW5lckFjdGl2aXR5LmNsYXNzKTsKKyAgICAgICAgICAgIG5ldyBBdXRvZmlsbEFjdGl2aXR5VGVzdFJ1bGU8VmlydHVhbENvbnRhaW5lckFjdGl2aXR5PihWaXJ0dWFsQ29udGFpbmVyQWN0aXZpdHkuY2xhc3MpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGJlZm9yZUFjdGl2aXR5TGF1bmNoZWQoKSB7CisgICAgICAgICAgICBwcmVBY3Rpdml0eUNyZWF0ZWQoKTsKKyAgICAgICAgfQorICAgIH07CiAKLSAgICBwcml2YXRlIFZpcnR1YWxDb250YWluZXJBY3Rpdml0eSBtQWN0aXZpdHk7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Db21wYXRNb2RlOworICAgIHByb3RlY3RlZCBWaXJ0dWFsQ29udGFpbmVyQWN0aXZpdHkgbUFjdGl2aXR5OworCisgICAgcHVibGljIFZpcnR1YWxDb250YWluZXJBY3Rpdml0eVRlc3QoKSB7CisgICAgICAgIHRoaXMoZmFsc2UpOworICAgIH0KKworICAgIHByb3RlY3RlZCBWaXJ0dWFsQ29udGFpbmVyQWN0aXZpdHlUZXN0KGJvb2xlYW4gY29tcGF0TW9kZSkgeworICAgICAgICBtQ29tcGF0TW9kZSA9IGNvbXBhdE1vZGU7CisgICAgfQogCiAgICAgQEJlZm9yZQogICAgIHB1YmxpYyB2b2lkIHNldEFjdGl2aXR5KCkgewogICAgICAgICBtQWN0aXZpdHkgPSBtQWN0aXZpdHlSdWxlLmdldEFjdGl2aXR5KCk7CisgICAgICAgIHBvc3RBY3Rpdml0eUxhdW5jaGVkKG1BY3Rpdml0eSk7CiAgICAgfQogCi0gICAgQEFmdGVyCi0gICAgcHVibGljIHZvaWQgZmluaXNoV2VsY29tZUFjdGl2aXR5KCkgewotICAgICAgICBXZWxjb21lQWN0aXZpdHkuZmluaXNoSXQoKTsKKyAgICAvKioKKyAgICAgKiBIb29rIGZvciBzdWJjbGFzcyB0byBjdXN0b21pemUgdGVzdCBiZWZvcmUgYWN0aXZpdHkgaXMgY3JlYXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBwcmVBY3Rpdml0eUNyZWF0ZWQoKSB7fQorCisgICAgLyoqCisgICAgICogSG9vayBmb3Igc3ViY2xhc3MgdG8gY3VzdG9taXplIGFjdGl2aXR5IGFmdGVyIGl0J3MgbGF1bmNoZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcG9zdEFjdGl2aXR5TGF1bmNoZWQoCisgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgVmlydHVhbENvbnRhaW5lckFjdGl2aXR5IGFjdGl2aXR5KSB7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTc3LDEwICsxMDksNTQgQEAKICAgICB9CiAKICAgICBAVGVzdAorICAgIEBBcHBNb2RlRnVsbCAvLyB0ZXN0QXV0b2ZpbGxTeW5jKCkgaXMgZW5vdWdoIHRvIHRlc3QgZXBoZW1lcmFsIGFwcHMgc3VwcG9ydAogICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvZmlsbEFzeW5jKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHNraXBUZXN0T25Db21wYXRNb2RlKCk7CisKICAgICAgICAgYXV0b2ZpbGxUZXN0KGZhbHNlKTsKICAgICB9CiAKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvZmlsbF9hcHBDb250ZXh0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1BY3Rpdml0eS5tQ3VzdG9tVmlldy5zZXRBdXRvZmlsbE1hbmFnZXIobUFjdGl2aXR5LmdldEFwcGxpY2F0aW9uQ29udGV4dCgpKTsKKyAgICAgICAgYXV0b2ZpbGxUZXN0KHRydWUpOworICAgICAgICAvLyBTYW5pdHkgY2hlY2sgdG8gbWFrZSBzdXJlIGF1dG9maWxsIGlzIGVuYWJsZWQgaW4gdGhlIGFwcGxpY2F0aW9uIGNvbnRleHQKKyAgICAgICAgYXNzZXJ0VGhhdChtQWN0aXZpdHkuZ2V0QXBwbGljYXRpb25Db250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShBdXRvZmlsbE1hbmFnZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgLmlzRW5hYmxlZCgpKS5pc1RydWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGb2N1cyB0byB1c2VybmFtZSBhbmQgZXhwZWN0IHdpbmRvdyBldmVudAorICAgICAqLworICAgIHZvaWQgZm9jdXNUb1VzZXJuYW1lKCkgdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24geworICAgICAgICBtVWlCb3Qud2FpdEZvcldpbmRvd0NoYW5nZSgoKSAtPiBtQWN0aXZpdHkubVVzZXJuYW1lLmNoYW5nZUZvY3VzKHRydWUpLAorICAgICAgICAgICAgICAgIFRpbWVvdXRzLlVJX1RJTUVPVVQuZ2V0TWF4VmFsdWUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRm9jdXMgdG8gdXNlcm5hbWUgYW5kIGV4cGVjdCBubyBhdXRvZmlsbCB3aW5kb3cgZXZlbnQKKyAgICAgKi8KKyAgICB2b2lkIGZvY3VzVG9Vc2VybmFtZUV4cGVjdE5vV2luZG93RXZlbnQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgLy8gVE9ETyBzaG91bGQgdXNlIHdhaXRGb3JXaW5kb3dDaGFuZ2UoKSBpZiB3ZSBjYW4gZmlsdGVyIG91dCBldmVudCBvZiBhcHAgQWN0aXZpdHkgaXRzZWxmLgorICAgICAgICBtQWN0aXZpdHlSdWxlLnJ1bk9uVWlUaHJlYWQoKCkgLT4gbUFjdGl2aXR5Lm1Vc2VybmFtZS5jaGFuZ2VGb2N1cyh0cnVlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRm9jdXMgdG8gcGFzc3dvcmQgYW5kIGV4cGVjdCB3aW5kb3cgZXZlbnQKKyAgICAgKi8KKyAgICB2b2lkIGZvY3VzVG9QYXNzd29yZCgpIHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIHsKKyAgICAgICAgbVVpQm90LndhaXRGb3JXaW5kb3dDaGFuZ2UoKCkgLT4gbUFjdGl2aXR5Lm1QYXNzd29yZC5jaGFuZ2VGb2N1cyh0cnVlKSwKKyAgICAgICAgICAgICAgICBUaW1lb3V0cy5VSV9USU1FT1VULmdldE1heFZhbHVlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZvY3VzIHRvIHBhc3N3b3JkIGFuZCBleHBlY3Qgbm8gYXV0b2ZpbGwgd2luZG93IGV2ZW50CisgICAgICovCisgICAgdm9pZCBmb2N1c1RvUGFzc3dvcmRFeHBlY3ROb1dpbmRvd0V2ZW50KCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIC8vIFRPRE8gc2hvdWxkIHVzZSB3YWl0Rm9yV2luZG93Q2hhbmdlKCkgaWYgd2UgY2FuIGZpbHRlciBvdXQgZXZlbnQgb2YgYXBwIEFjdGl2aXR5IGl0c2VsZi4KKyAgICAgICAgbUFjdGl2aXR5UnVsZS5ydW5PblVpVGhyZWFkKCgpIC0+IG1BY3Rpdml0eS5tUGFzc3dvcmQuY2hhbmdlRm9jdXModHJ1ZSkpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIFRlc3RzIGF1dG9maWxsaW5nIHRoZSB2aXJ0dWFsIHZpZXdzLCB1c2luZyB0aGUgc3luYyAvIGFzeW5jIHZlcnNpb24gb2YgVmlld1N0cnVjdHVyZS5hZGRDaGlsZAogICAgICAqLwpAQCAtOTAsMzQgKzE2NiwzOCBAQAogCiAgICAgICAgIC8vIFNldCBleHBlY3RhdGlvbnMuCiAgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgImR1ZGUiKQotICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9QQVNTV09SRCwgInN3ZWV0IikKLSAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiVGhlIER1ZGUiKSkKKyAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfVVNFUk5BTUUsICJkdWRlIiwgY3JlYXRlUHJlc2VudGF0aW9uKCJEVURFIikpCisgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1BBU1NXT1JELCAic3dlZXQiLCBjcmVhdGVQcmVzZW50YXRpb24oIlNXRUVUIikpCiAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOwogICAgICAgICBtQWN0aXZpdHkuZXhwZWN0QXV0b0ZpbGwoImR1ZGUiLCAic3dlZXQiKTsKICAgICAgICAgbUFjdGl2aXR5Lm1DdXN0b21WaWV3LnNldFN5bmMoc3luYyk7CiAKICAgICAgICAgLy8gVHJpZ2dlciBhdXRvLWZpbGwuCi0gICAgICAgIG1BY3Rpdml0eS5tVXNlcm5hbWUuY2hhbmdlRm9jdXModHJ1ZSk7Ci0gICAgICAgIGFzc2VydERhdGFzZXRTaG93bihtQWN0aXZpdHkubVVzZXJuYW1lLCAiVGhlIER1ZGUiKTsKKyAgICAgICAgZm9jdXNUb1VzZXJuYW1lKCk7CisgICAgICAgIGFzc2VydERhdGFzZXRTaG93bihtQWN0aXZpdHkubVVzZXJuYW1lLCAiRFVERSIpOwogCiAgICAgICAgIC8vIFBsYXkgYXJvdW5kIHdpdGggZm9jdXMgdG8gbWFrZSBzdXJlIHBpY2tlciBpcyBwcm9wZXJseSBkcmF3bi4KLSAgICAgICAgbUFjdGl2aXR5Lm1QYXNzd29yZC5jaGFuZ2VGb2N1cyh0cnVlKTsKLSAgICAgICAgYXNzZXJ0RGF0YXNldFNob3duKG1BY3Rpdml0eS5tUGFzc3dvcmQsICJUaGUgRHVkZSIpOwotICAgICAgICBtQWN0aXZpdHkubVVzZXJuYW1lLmNoYW5nZUZvY3VzKHRydWUpOwotICAgICAgICBhc3NlcnREYXRhc2V0U2hvd24obUFjdGl2aXR5Lm1Vc2VybmFtZSwgIlRoZSBEdWRlIik7CisgICAgICAgIGlmIChCVUdfNzQyNTYzMDBfRklYRUQgfHwgIW1Db21wYXRNb2RlKSB7CisgICAgICAgICAgICBmb2N1c1RvUGFzc3dvcmQoKTsKKyAgICAgICAgICAgIGFzc2VydERhdGFzZXRTaG93bihtQWN0aXZpdHkubVBhc3N3b3JkLCAiU1dFRVQiKTsKKworICAgICAgICAgICAgZm9jdXNUb1VzZXJuYW1lKCk7CisgICAgICAgICAgICBhc3NlcnREYXRhc2V0U2hvd24obUFjdGl2aXR5Lm1Vc2VybmFtZSwgIkRVREUiKTsKKyAgICAgICAgfQogCiAgICAgICAgIC8vIE1ha2Ugc3VyZSBpbnB1dCB3YXMgc2FuaXRpemVkLgogICAgICAgICBmaW5hbCBGaWxsUmVxdWVzdCByZXF1ZXN0ID0gc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CisgICAgICAgIGZpbmFsIFZpZXdOb2RlIHVybEJhciA9IGZpbmROb2RlQnlSZXNvdXJjZUlkKHJlcXVlc3Quc3RydWN0dXJlLCBJRF9VUkxfQkFSKTsKICAgICAgICAgZmluYWwgVmlld05vZGUgdXNlcm5hbWVMYWJlbCA9IGZpbmROb2RlQnlSZXNvdXJjZUlkKHJlcXVlc3Quc3RydWN0dXJlLCBJRF9VU0VSTkFNRV9MQUJFTCk7CiAgICAgICAgIGZpbmFsIFZpZXdOb2RlIHVzZXJuYW1lID0gZmluZE5vZGVCeVJlc291cmNlSWQocmVxdWVzdC5zdHJ1Y3R1cmUsIElEX1VTRVJOQU1FKTsKICAgICAgICAgZmluYWwgVmlld05vZGUgcGFzc3dvcmRMYWJlbCA9IGZpbmROb2RlQnlSZXNvdXJjZUlkKHJlcXVlc3Quc3RydWN0dXJlLCBJRF9QQVNTV09SRF9MQUJFTCk7CiAgICAgICAgIGZpbmFsIFZpZXdOb2RlIHBhc3N3b3JkID0gZmluZE5vZGVCeVJlc291cmNlSWQocmVxdWVzdC5zdHJ1Y3R1cmUsIElEX1BBU1NXT1JEKTsKIAorICAgICAgICBhc3NlcnRVcmxCYXJJc1Nhbml0aXplZCh1cmxCYXIpOwogICAgICAgICBhc3NlcnRUZXh0SXNTYW5pdGl6ZWQodXNlcm5hbWUpOwogICAgICAgICBhc3NlcnRUZXh0SXNTYW5pdGl6ZWQocGFzc3dvcmQpOwotICAgICAgICBhc3NlcnRUZXh0QW5kVmFsdWUodXNlcm5hbWVMYWJlbCwgIlVzZXJuYW1lIik7Ci0gICAgICAgIGFzc2VydFRleHRBbmRWYWx1ZShwYXNzd29yZExhYmVsLCAiUGFzc3dvcmQiKTsKKyAgICAgICAgYXNzZXJ0TGFiZWwodXNlcm5hbWVMYWJlbCwgIlVzZXJuYW1lIik7CisgICAgICAgIGFzc2VydExhYmVsKHBhc3N3b3JkTGFiZWwsICJQYXNzd29yZCIpOwogCiAgICAgICAgIGFzc2VydFRoYXQodXNlcm5hbWVMYWJlbC5nZXRDbGFzc05hbWUoKSkuaXNFcXVhbFRvKExBQkVMX0NMQVNTKTsKICAgICAgICAgYXNzZXJ0VGhhdCh1c2VybmFtZS5nZXRDbGFzc05hbWUoKSkuaXNFcXVhbFRvKFRFWFRfQ0xBU1MpOwpAQCAtMTI3LDE3ICsyMDcsMzAgQEAKICAgICAgICAgYXNzZXJ0VGhhdCh1c2VybmFtZS5nZXRJZEVudHJ5KCkpLmlzRXF1YWxUbyhJRF9VU0VSTkFNRSk7CiAgICAgICAgIGFzc2VydFRoYXQocGFzc3dvcmQuZ2V0SWRFbnRyeSgpKS5pc0VxdWFsVG8oSURfUEFTU1dPUkQpOwogCi0gICAgICAgIC8vIE1ha2Ugc3VyZSBvcmRlciBpcyBwcmVzZXJ2ZWQgYW5kIGR1cGVzIG5vdCByZW1vdmVkLgotICAgICAgICBhc3NlcnRUaGF0KHVzZXJuYW1lLmdldEF1dG9maWxsSGludHMoKSkuYXNMaXN0KCkKLSAgICAgICAgICAgICAgICAuY29udGFpbnNFeGFjdGx5KCJjIiwgImEiLCAiYSIsICJiIiwgImEiLCAiYSIpCi0gICAgICAgICAgICAgICAgLmluT3JkZXIoKTsKKyAgICAgICAgYXNzZXJ0VGhhdCh1c2VybmFtZS5nZXRJbnB1dFR5cGUoKSkKKyAgICAgICAgICAgICAgICAuaXNFcXVhbFRvKElucHV0VHlwZS5UWVBFX0NMQVNTX1RFWFQgfCBJbnB1dFR5cGUuVFlQRV9URVhUX1ZBUklBVElPTl9OT1JNQUwpOworICAgICAgICBhc3NlcnRUaGF0KHVzZXJuYW1lTGFiZWwuZ2V0SW5wdXRUeXBlKCkpLmlzRXF1YWxUbygwKTsKKyAgICAgICAgYXNzZXJ0VGhhdChwYXNzd29yZC5nZXRJbnB1dFR5cGUoKSkKKyAgICAgICAgICAgICAgICAuaXNFcXVhbFRvKElucHV0VHlwZS5UWVBFX0NMQVNTX1RFWFQgfCBJbnB1dFR5cGUuVFlQRV9URVhUX1ZBUklBVElPTl9QQVNTV09SRCk7CisgICAgICAgIGFzc2VydFRoYXQocGFzc3dvcmRMYWJlbC5nZXRJbnB1dFR5cGUoKSkuaXNFcXVhbFRvKDApOwogCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBWaXJ0dWFsQ29udGFpbmVyVmlldy5hc3NlcnRIdG1sSW5mbyh1c2VybmFtZSk7Ci0gICAgICAgICAgICBWaXJ0dWFsQ29udGFpbmVyVmlldy5hc3NlcnRIdG1sSW5mbyhwYXNzd29yZCk7Ci0gICAgICAgIH0gY2F0Y2ggKEFzc2VydGlvbkVycm9yIHwgUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBkdW1wU3RydWN0dXJlKCJIdG1sSW5mbyBmYWlsZWQiLCByZXF1ZXN0LnN0cnVjdHVyZSk7Ci0gICAgICAgICAgICB0aHJvdyBlOworICAgICAgICBmaW5hbCBTdHJpbmdbXSBhdXRvZmlsbEhpbnRzID0gdXNlcm5hbWUuZ2V0QXV0b2ZpbGxIaW50cygpOworICAgICAgICBpZiAobUNvbXBhdE1vZGUpIHsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoYXV0b2ZpbGxIaW50cykuaXNOdWxsKCk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KHVzZXJuYW1lLmdldEh0bWxJbmZvKCkpLmlzTnVsbCgpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChwYXNzd29yZC5nZXRIdG1sSW5mbygpKS5pc051bGwoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBvcmRlciBpcyBwcmVzZXJ2ZWQgYW5kIGR1cGVzIG5vdCByZW1vdmVkLgorICAgICAgICAgICAgYXNzZXJ0VGhhdChhdXRvZmlsbEhpbnRzKS5hc0xpc3QoKQorICAgICAgICAgICAgICAgICAgICAuY29udGFpbnNFeGFjdGx5KCJjIiwgImEiLCAiYSIsICJiIiwgImEiLCAiYSIpCisgICAgICAgICAgICAgICAgICAgIC5pbk9yZGVyKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFZpcnR1YWxDb250YWluZXJWaWV3LmFzc2VydEh0bWxJbmZvKHVzZXJuYW1lKTsKKyAgICAgICAgICAgICAgICBWaXJ0dWFsQ29udGFpbmVyVmlldy5hc3NlcnRIdG1sSW5mbyhwYXNzd29yZCk7CisgICAgICAgICAgICB9IGNhdGNoIChBc3NlcnRpb25FcnJvciB8IFJ1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGR1bXBTdHJ1Y3R1cmUoIkh0bWxJbmZvIGZhaWxlZCIsIHJlcXVlc3Quc3RydWN0dXJlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgLy8gTWFrZSBzdXJlIGluaXRpYWwgZm9jdXMgd2FzIHByb3Blcmx5IHNldC4KQEAgLTE0NSwxNyArMjM4LDE0IEBACiAgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJQYXNzd29yZCBub2RlIGlzIGZvY3VzZWQiKS50aGF0KHBhc3N3b3JkLmlzRm9jdXNlZCgpKS5pc0ZhbHNlKCk7CiAKICAgICAgICAgLy8gQXV0by1maWxsIGl0LgotICAgICAgICBzVWlCb3Quc2VsZWN0RGF0YXNldCgiVGhlIER1ZGUiKTsKKyAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQoIkRVREUiKTsKIAogICAgICAgICAvLyBDaGVjayB0aGUgcmVzdWx0cy4KICAgICAgICAgbUFjdGl2aXR5LmFzc2VydEF1dG9GaWxsZWQoKTsKLQotICAgICAgICAvLyBTYW5pdHkgY2hlY2tzLgotICAgICAgICBzUmVwbGllci5hc3NlcnROdW1iZXJVbmhhbmRsZWRGaWxsUmVxdWVzdHMoMCk7Ci0gICAgICAgIHNSZXBsaWVyLmFzc2VydE51bWJlclVuaGFuZGxlZFNhdmVSZXF1ZXN0cygwKTsKICAgICB9CiAKICAgICBAVGVzdAorICAgIEBBcHBNb2RlRnVsbCAvLyB0ZXN0QXV0b2ZpbGxTeW5jKCkgaXMgZW5vdWdoIHRvIHRlc3QgZXBoZW1lcmFsIGFwcHMgc3VwcG9ydAogICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvZmlsbFR3b0RhdGFzZXRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFNldCBzZXJ2aWNlLgogICAgICAgICBlbmFibGVTZXJ2aWNlKCk7CkBAIC0xNzYsMTggKzI2NiwyMCBAQAogICAgICAgICBtQWN0aXZpdHkuZXhwZWN0QXV0b0ZpbGwoIkRVREUiLCAiU1dFRVQiKTsKIAogICAgICAgICAvLyBUcmlnZ2VyIGF1dG8tZmlsbC4KLSAgICAgICAgbUFjdGl2aXR5Lm1Vc2VybmFtZS5jaGFuZ2VGb2N1cyh0cnVlKTsKKyAgICAgICAgZm9jdXNUb1VzZXJuYW1lKCk7CiAgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwogICAgICAgICBhc3NlcnREYXRhc2V0U2hvd24obUFjdGl2aXR5Lm1Vc2VybmFtZSwgIlRoZSBEdWRlIiwgIlRIRSBEVURFIik7CiAKICAgICAgICAgLy8gUGxheSBhcm91bmQgd2l0aCBmb2N1cyB0byBtYWtlIHN1cmUgcGlja2VyIGlzIHByb3Blcmx5IGRyYXduLgotICAgICAgICBtQWN0aXZpdHkubVBhc3N3b3JkLmNoYW5nZUZvY3VzKHRydWUpOwotICAgICAgICBhc3NlcnREYXRhc2V0U2hvd24obUFjdGl2aXR5Lm1QYXNzd29yZCwgIlRoZSBEdWRlIiwgIlRIRSBEVURFIik7Ci0gICAgICAgIG1BY3Rpdml0eS5tVXNlcm5hbWUuY2hhbmdlRm9jdXModHJ1ZSk7Ci0gICAgICAgIGFzc2VydERhdGFzZXRTaG93bihtQWN0aXZpdHkubVVzZXJuYW1lLCAiVGhlIER1ZGUiLCAiVEhFIERVREUiKTsKKyAgICAgICAgaWYgKEJVR183NDI1NjMwMF9GSVhFRCB8fCAhbUNvbXBhdE1vZGUpIHsKKyAgICAgICAgICAgIGZvY3VzVG9QYXNzd29yZCgpOworICAgICAgICAgICAgYXNzZXJ0RGF0YXNldFNob3duKG1BY3Rpdml0eS5tUGFzc3dvcmQsICJUaGUgRHVkZSIsICJUSEUgRFVERSIpOworICAgICAgICAgICAgZm9jdXNUb1VzZXJuYW1lKCk7CisgICAgICAgICAgICBhc3NlcnREYXRhc2V0U2hvd24obUFjdGl2aXR5Lm1Vc2VybmFtZSwgIlRoZSBEdWRlIiwgIlRIRSBEVURFIik7CisgICAgICAgIH0KIAogICAgICAgICAvLyBBdXRvLWZpbGwgaXQuCi0gICAgICAgIHNVaUJvdC5zZWxlY3REYXRhc2V0KCJUSEUgRFVERSIpOworICAgICAgICBtVWlCb3Quc2VsZWN0RGF0YXNldCgiVEhFIERVREUiKTsKIAogICAgICAgICAvLyBDaGVjayB0aGUgcmVzdWx0cy4KICAgICAgICAgbUFjdGl2aXR5LmFzc2VydEF1dG9GaWxsZWQoKTsKQEAgLTIwMSw2ICsyOTMsOCBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0b2ZpbGxNYW51YWxseU9uZURhdGFzZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc2tpcFRlc3RPbkNvbXBhdE1vZGUoKTsgLy8gVE9ETyhiLzczNTU3MDcyKTogbm90IHN1cHBvcnRlZCB5ZXQKKwogICAgICAgICAvLyBTZXQgc2VydmljZS4KICAgICAgICAgZW5hYmxlU2VydmljZSgpOwogCkBAIC0yMTcsMjcgKzMxMSwyNyBAQAogICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKIAogICAgICAgICAvLyBTZWxlY3QgZGF0YXRlc3QuCi0gICAgICAgIHNVaUJvdC5zZWxlY3REYXRhc2V0KCJUaGUgRHVkZSIpOworICAgICAgICBtVWlCb3Quc2VsZWN0RGF0YXNldCgiVGhlIER1ZGUiKTsKIAogICAgICAgICAvLyBDaGVjayB0aGUgcmVzdWx0cy4KICAgICAgICAgbUFjdGl2aXR5LmFzc2VydEF1dG9GaWxsZWQoKTsKLQotICAgICAgICAvLyBTYW5pdHkgY2hlY2tzLgotICAgICAgICBzUmVwbGllci5hc3NlcnROdW1iZXJVbmhhbmRsZWRGaWxsUmVxdWVzdHMoMCk7Ci0gICAgICAgIHNSZXBsaWVyLmFzc2VydE51bWJlclVuaGFuZGxlZFNhdmVSZXF1ZXN0cygwKTsKICAgICB9CiAKICAgICBAVGVzdAorICAgIEBBcHBNb2RlRnVsbCAvLyB0ZXN0QXV0b2ZpbGxNYW51YWxseU9uZURhdGFzZXQoKSBpcyBlbm91Z2ggdG8gdGVzdCBlcGhlbWVyYWwgYXBwcyBzdXBwb3J0CiAgICAgcHVibGljIHZvaWQgdGVzdEF1dG9maWxsTWFudWFsbHlUd29EYXRhc2V0c1BpY2tGaXJzdCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBhdXRvZmlsbE1hbnVhbGx5VHdvRGF0YXNldHModHJ1ZSk7CiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBAQXBwTW9kZUZ1bGwgLy8gdGVzdEF1dG9maWxsTWFudWFsbHlPbmVEYXRhc2V0KCkgaXMgZW5vdWdoIHRvIHRlc3QgZXBoZW1lcmFsIGFwcHMgc3VwcG9ydAogICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvZmlsbE1hbnVhbGx5VHdvRGF0YXNldHNQaWNrU2Vjb25kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGF1dG9maWxsTWFudWFsbHlUd29EYXRhc2V0cyhmYWxzZSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGF1dG9maWxsTWFudWFsbHlUd29EYXRhc2V0cyhib29sZWFuIHBpY2tGaXJzdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHNraXBUZXN0T25Db21wYXRNb2RlKCk7IC8vIFRPRE8oYi83MzU1NzA3Mik6IG5vdCBzdXBwb3J0ZWQgeWV0CisKICAgICAgICAgLy8gU2V0IHNlcnZpY2UuCiAgICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKIApAQCAtMjYzLDE5ICszNTcsMTYgQEAKIAogICAgICAgICAvLyBUcmlnZ2VyIGF1dG8tZmlsbC4KICAgICAgICAgbUFjdGl2aXR5LmdldFN5c3RlbVNlcnZpY2UoQXV0b2ZpbGxNYW5hZ2VyLmNsYXNzKS5yZXF1ZXN0QXV0b2ZpbGwoCi0gICAgICAgICAgICAgICAgbUFjdGl2aXR5Lm1DdXN0b21WaWV3LCBtQWN0aXZpdHkubVVzZXJuYW1lLnRleHQuaWQsIG1BY3Rpdml0eS5tVXNlcm5hbWUuYm91bmRzKTsKKyAgICAgICAgICAgICAgICBtQWN0aXZpdHkubUN1c3RvbVZpZXcsIG1BY3Rpdml0eS5tVXNlcm5hbWUudGV4dC5pZCwKKyAgICAgICAgICAgICAgICBtQWN0aXZpdHkubVVzZXJuYW1lLmdldEFic0Nvb3JkaW5hdGVzKCkpOwogICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKIAogICAgICAgICAvLyBBdXRvLWZpbGwgaXQuCi0gICAgICAgIGZpbmFsIFVpT2JqZWN0MiBwaWNrZXIgPSBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlRoZSBEdWRlIiwgIkplbm55Iik7Ci0gICAgICAgIHNVaUJvdC5zZWxlY3REYXRhc2V0KHBpY2tlciwgcGlja0ZpcnN0PyAiVGhlIER1ZGUiIDogIkplbm55Iik7CisgICAgICAgIGZpbmFsIFVpT2JqZWN0MiBwaWNrZXIgPSBhc3NlcnREYXRhc2V0U2hvd24obUFjdGl2aXR5Lm1Vc2VybmFtZSwgIlRoZSBEdWRlIiwgIkplbm55Iik7CisgICAgICAgIG1VaUJvdC5zZWxlY3REYXRhc2V0KHBpY2tlciwgcGlja0ZpcnN0ID8gIlRoZSBEdWRlIiA6ICJKZW5ueSIpOwogCiAgICAgICAgIC8vIENoZWNrIHRoZSByZXN1bHRzLgogICAgICAgICBtQWN0aXZpdHkuYXNzZXJ0QXV0b0ZpbGxlZCgpOwotCi0gICAgICAgIC8vIFNhbml0eSBjaGVja3MuCi0gICAgICAgIHNSZXBsaWVyLmFzc2VydE51bWJlclVuaGFuZGxlZEZpbGxSZXF1ZXN0cygwKTsKLSAgICAgICAgc1JlcGxpZXIuYXNzZXJ0TnVtYmVyVW5oYW5kbGVkU2F2ZVJlcXVlc3RzKDApOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0yOTMsNjIgKzM4NCw4MCBAQAogICAgICAgICBtQWN0aXZpdHkuZXhwZWN0QXV0b0ZpbGwoImR1ZGUiLCAic3dlZXQiKTsKIAogICAgICAgICAvLyBUcmlnZ2VyIGF1dG8tZmlsbC4KLSAgICAgICAgbUFjdGl2aXR5Lm1Vc2VybmFtZS5jaGFuZ2VGb2N1cyh0cnVlKTsKKyAgICAgICAgZm9jdXNUb1VzZXJuYW1lKCk7CiAgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwogCiAgICAgICAgIGNhbGxiYWNrLmFzc2VydFVpU2hvd25FdmVudChtQWN0aXZpdHkubUN1c3RvbVZpZXcsIG1BY3Rpdml0eS5tVXNlcm5hbWUudGV4dC5pZCk7CiAKICAgICAgICAgLy8gQ2hhbmdlIGZvY3VzCi0gICAgICAgIG1BY3Rpdml0eS5tUGFzc3dvcmQuY2hhbmdlRm9jdXModHJ1ZSk7CisgICAgICAgIGZvY3VzVG9QYXNzd29yZCgpOwogICAgICAgICBjYWxsYmFjay5hc3NlcnRVaUhpZGRlbkV2ZW50KG1BY3Rpdml0eS5tQ3VzdG9tVmlldywgbUFjdGl2aXR5Lm1Vc2VybmFtZS50ZXh0LmlkKTsKICAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlTaG93bkV2ZW50KG1BY3Rpdml0eS5tQ3VzdG9tVmlldywgbUFjdGl2aXR5Lm1QYXNzd29yZC50ZXh0LmlkKTsKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvZmlsbENhbGxiYWNrRGlzYWJsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBAQXBwTW9kZUZ1bGwgLy8gdGVzdEF1dG9maWxsQ2FsbGJhY2tzKCkgaXMgZW5vdWdoIHRvIHRlc3QgZXBoZW1lcmFsIGFwcHMgc3VwcG9ydAorICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvZmlsbENhbGxiYWNrRGlzYWJsZWQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgLy8gU2V0IHNlcnZpY2UuCiAgICAgICAgIGRpc2FibGVTZXJ2aWNlKCk7CiAgICAgICAgIGZpbmFsIE15QXV0b2ZpbGxDYWxsYmFjayBjYWxsYmFjayA9IG1BY3Rpdml0eS5yZWdpc3RlckNhbGxiYWNrKCk7CiAKICAgICAgICAgLy8gVHJpZ2dlciBhdXRvLWZpbGwuCi0gICAgICAgIG1BY3Rpdml0eS5tVXNlcm5hbWUuY2hhbmdlRm9jdXModHJ1ZSk7CisgICAgICAgIGZvY3VzVG9Vc2VybmFtZUV4cGVjdE5vV2luZG93RXZlbnQoKTsKIAogICAgICAgICAvLyBBc3NlcnQgY2FsbGJhY2sgd2FzIGNhbGxlZAogICAgICAgICBjYWxsYmFjay5hc3NlcnRVaVVuYXZhaWxhYmxlRXZlbnQobUFjdGl2aXR5Lm1DdXN0b21WaWV3LCBtQWN0aXZpdHkubVVzZXJuYW1lLnRleHQuaWQpOwogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEF1dG9maWxsQ2FsbGJhY2tOb0RhdGFzZXRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNhbGxiYWNrVW5hdmFpbGFibGVUZXN0KE5PX1JFU1BPTlNFKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvZmlsbENhbGxiYWNrTm9EYXRhc2V0c0J1dFNhdmVJbmZvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNhbGxiYWNrVW5hdmFpbGFibGVUZXN0KG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpCi0gICAgICAgICAgICAgICAgLnNldFJlcXVpcmVkU2F2YWJsZUlkcyhTQVZFX0RBVEFfVFlQRV9QQVNTV09SRCwgSURfVVNFUk5BTUUsIElEX1BBU1NXT1JEKQotICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2FsbGJhY2tVbmF2YWlsYWJsZVRlc3QoQ2FubmVkRmlsbFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBAQXBwTW9kZUZ1bGwgLy8gdGVzdEF1dG9maWxsQ2FsbGJhY2tzKCkgaXMgZW5vdWdoIHRvIHRlc3QgZXBoZW1lcmFsIGFwcHMgc3VwcG9ydAorICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvZmlsbENhbGxiYWNrTm9EYXRhc2V0cygpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICAvLyBTZXQgc2VydmljZS4KICAgICAgICAgZW5hYmxlU2VydmljZSgpOwogICAgICAgICBmaW5hbCBNeUF1dG9maWxsQ2FsbGJhY2sgY2FsbGJhY2sgPSBtQWN0aXZpdHkucmVnaXN0ZXJDYWxsYmFjaygpOwogCiAgICAgICAgIC8vIFNldCBleHBlY3RhdGlvbnMuCi0gICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKHJlc3BvbnNlKTsKKyAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UoTk9fUkVTUE9OU0UpOwogCi0gICAgICAgIC8vIFRyaWdnZXIgYXV0by1maWxsLgotICAgICAgICBtQWN0aXZpdHkubVVzZXJuYW1lLmNoYW5nZUZvY3VzKHRydWUpOworICAgICAgICAvLyBUcmlnZ2VyIGF1dG9maWxsLgorICAgICAgICBmb2N1c1RvVXNlcm5hbWVFeHBlY3ROb1dpbmRvd0V2ZW50KCk7CiAgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwogCiAgICAgICAgIC8vIEF1dG8tZmlsbCBpdC4KLSAgICAgICAgc1VpQm90LmFzc2VydE5vRGF0YXNldHMoKTsKKyAgICAgICAgbVVpQm90LmFzc2VydE5vRGF0YXNldHNFdmVyKCk7CiAKICAgICAgICAgLy8gQXNzZXJ0IGNhbGxiYWNrIHdhcyBjYWxsZWQKICAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlVbmF2YWlsYWJsZUV2ZW50KG1BY3Rpdml0eS5tQ3VzdG9tVmlldywgbUFjdGl2aXR5Lm1Vc2VybmFtZS50ZXh0LmlkKTsKICAgICB9CiAKICAgICBAVGVzdAorICAgIEBBcHBNb2RlRnVsbCAvLyB0ZXN0QXV0b2ZpbGxDYWxsYmFja3MoKSBpcyBlbm91Z2ggdG8gdGVzdCBlcGhlbWVyYWwgYXBwcyBzdXBwb3J0CisgICAgcHVibGljIHZvaWQgdGVzdEF1dG9maWxsQ2FsbGJhY2tOb0RhdGFzZXRzQnV0U2F2ZUluZm8oKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgLy8gU2V0IHNlcnZpY2UuCisgICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKKyAgICAgICAgZmluYWwgTXlBdXRvZmlsbENhbGxiYWNrIGNhbGxiYWNrID0gbUFjdGl2aXR5LnJlZ2lzdGVyQ2FsbGJhY2soKTsKKworICAgICAgICAvLyBTZXQgZXhwZWN0YXRpb25zLgorICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRSZXF1aXJlZFNhdmFibGVJZHMoU0FWRV9EQVRBX1RZUEVfUEFTU1dPUkQsIElEX1VTRVJOQU1FLCBJRF9QQVNTV09SRCkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gVHJpZ2dlciBhdXRvZmlsbC4KKyAgICAgICAgZm9jdXNUb1VzZXJuYW1lRXhwZWN0Tm9XaW5kb3dFdmVudCgpOworICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKKworICAgICAgICAvLyBBdXRvZmlsbCBpdC4KKyAgICAgICAgbVVpQm90LmFzc2VydE5vRGF0YXNldHNFdmVyKCk7CisKKyAgICAgICAgLy8gQXNzZXJ0IGNhbGxiYWNrIHdhcyBjYWxsZWQKKyAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlVbmF2YWlsYWJsZUV2ZW50KG1BY3Rpdml0eS5tQ3VzdG9tVmlldywgbUFjdGl2aXR5Lm1Vc2VybmFtZS50ZXh0LmlkKTsKKworICAgICAgICAvLyBNYWtlIHN1cmUgc2F2ZSBpcyBub3QgdHJpZ2dlcmVkCisgICAgICAgIG1BY3Rpdml0eS5nZXRBdXRvZmlsbE1hbmFnZXIoKS5jb21taXQoKTsKKyAgICAgICAgbVVpQm90LmFzc2VydFNhdmVOb3RTaG93aW5nKFNBVkVfREFUQV9UWVBFX1BBU1NXT1JEKTsKKyAgICB9CisKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTYXZlRGlhbG9nTm90U2hvd25XaGVuQmFja0lzUHJlc3NlZCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBTZXQgc2VydmljZS4KICAgICAgICAgZW5hYmxlU2VydmljZSgpOwpAQCAtMzY1LDg2ICs0NzQsMzI5IEBACiAgICAgICAgIG1BY3Rpdml0eS5leHBlY3RBdXRvRmlsbCgiZHVkZSIsICJzd2VldCIpOwogCiAgICAgICAgIC8vIFRyaWdnZXIgYXV0by1maWxsLgotICAgICAgICBtQWN0aXZpdHkubVVzZXJuYW1lLmNoYW5nZUZvY3VzKHRydWUpOworICAgICAgICBmb2N1c1RvVXNlcm5hbWUoKTsKICAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CiAgICAgICAgIGFzc2VydERhdGFzZXRTaG93bihtQWN0aXZpdHkubVVzZXJuYW1lLCAiVGhlIER1ZGUiKTsKIAotICAgICAgICBzVWlCb3QucHJlc3NCYWNrKCk7CisgICAgICAgIG1VaUJvdC5wcmVzc0JhY2soKTsKIAotICAgICAgICBzVWlCb3QuYXNzZXJ0U2F2ZU5vdFNob3dpbmcoU0FWRV9EQVRBX1RZUEVfUEFTU1dPUkQpOworICAgICAgICBtVWlCb3QuYXNzZXJ0U2F2ZU5vdFNob3dpbmcoU0FWRV9EQVRBX1RZUEVfUEFTU1dPUkQpOwogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNhdmVEaWFsb2dTaG93bldoZW5BbGxWaXJ0dWFsVmlld3NOb3RWaXNpYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdFNhdmVfY2hpbGRWaWV3c0dvbmVfbm90aWZ5QWZtKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIHNhdmVUZXN0KENvbW1pdFR5cGUuQ0hJTERSRU5fVklFV1NfR09ORV9OT1RJRllfQ0FMTEJBQ0tfQVBJKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTYXZlX2NoaWxkVmlld3NHb25lX3VwZGF0ZVZpZXcoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgc2F2ZVRlc3QoQ29tbWl0VHlwZS5DSElMRFJFTl9WSUVXU19HT05FX05PVElGWV9DQUxMQkFDS19BUEkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgQElnbm9yZSgiRGlzYWJsZWQgdW50aWwgYi83MzQ5MzM0MiBpcyBmaXhlZCIpCisgICAgcHVibGljIHZvaWQgdGVzdFNhdmVfcGFyZW50Vmlld0dvbmUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgc2F2ZVRlc3QoQ29tbWl0VHlwZS5QQVJFTlRfVklFV19HT05FKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTYXZlX2FwcENhbGxzQ29tbWl0KCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIHNhdmVUZXN0KENvbW1pdFR5cGUuRVhQTElDSVRfQ09NTUlUKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTYXZlX3N1Ym1pdEJ1dHRvbkNsaWNrZWQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgc2F2ZVRlc3QoQ29tbWl0VHlwZS5TVUJNSVRfQlVUVE9OX0NMSUNLRUQpOworICAgIH0KKworICAgIGVudW0gQ29tbWl0VHlwZSB7CisgICAgICAgIENISUxEUkVOX1ZJRVdTX0dPTkVfTk9USUZZX0NBTExCQUNLX0FQSSwKKyAgICAgICAgQ0hJTERSRU5fVklFV1NfR09ORV9JU19WSVNJQkxFX0FQSSwKKyAgICAgICAgUEFSRU5UX1ZJRVdfR09ORSwKKyAgICAgICAgRVhQTElDSVRfQ09NTUlULAorICAgICAgICBTVUJNSVRfQlVUVE9OX0NMSUNLRUQKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2F2ZVRlc3QoQ29tbWl0VHlwZSBjb21taXRUeXBlKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgLy8gU2V0IHNlcnZpY2UuCisgICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKKworICAgICAgICAvLyBTZXQgZXhwZWN0YXRpb25zLgorICAgICAgICBmaW5hbCBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlciByZXNwb25zZSA9IG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldFJlcXVpcmVkU2F2YWJsZUlkcyhTQVZFX0RBVEFfVFlQRV9QQVNTV09SRCwgSURfVVNFUk5BTUUsIElEX1BBU1NXT1JEKTsKKworICAgICAgICBzd2l0Y2ggKGNvbW1pdFR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgQ0hJTERSRU5fVklFV1NfR09ORV9OT1RJRllfQ0FMTEJBQ0tfQVBJOgorICAgICAgICAgICAgY2FzZSBDSElMRFJFTl9WSUVXU19HT05FX0lTX1ZJU0lCTEVfQVBJOgorICAgICAgICAgICAgY2FzZSBQQVJFTlRfVklFV19HT05FOgorICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldFNhdmVJbmZvRmxhZ3MoU2F2ZUluZm8uRkxBR19TQVZFX09OX0FMTF9WSUVXU19JTlZJU0lCTEUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFWFBMSUNJVF9DT01NSVQ6CisgICAgICAgICAgICAgICAgLy8gZG9lcyBub3RoaW5nCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNVQk1JVF9CVVRUT05fQ0xJQ0tFRDoKKyAgICAgICAgICAgICAgICByZXNwb25zZQorICAgICAgICAgICAgICAgICAgICAuc2V0U2F2ZUluZm9GbGFncyhTYXZlSW5mby5GTEFHX0RPTlRfU0FWRV9PTl9GSU5JU0gpCisgICAgICAgICAgICAgICAgICAgIC5zZXRTYXZlVHJpZ2dlcklkKG1BY3Rpdml0eS5tQ3VzdG9tVmlldy5tTG9naW5CdXR0b25JZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgdHlwZTogIiArIGNvbW1pdFR5cGUpOworICAgICAgICB9CisgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKHJlc3BvbnNlLmJ1aWxkKCkpOworCisgICAgICAgIC8vIFRyaWdnZXIgYXV0by1maWxsLgorICAgICAgICBmb2N1c1RvVXNlcm5hbWVFeHBlY3ROb1dpbmRvd0V2ZW50KCk7CisgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOworCisgICAgICAgIC8vIEZpbGwgaW4gc29tZSBzdHVmZgorICAgICAgICBtQWN0aXZpdHkubVVzZXJuYW1lLnNldFRleHQoImZvbyIpOworICAgICAgICBmb2N1c1RvUGFzc3dvcmRFeHBlY3ROb1dpbmRvd0V2ZW50KCk7CisgICAgICAgIG1BY3Rpdml0eS5tUGFzc3dvcmQuc2V0VGV4dCgiYmFyIik7CisKKyAgICAgICAgLy8gVHJpZ2dlciBzYXZlLgorICAgICAgICBzd2l0Y2ggKGNvbW1pdFR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgQ0hJTERSRU5fVklFV1NfR09ORV9OT1RJRllfQ0FMTEJBQ0tfQVBJOgorICAgICAgICAgICAgICAgIHNldFZpZXdzSW52aXNpYmxlKFZpc2liaWxpdHlJbnRlZ3JhdGlvbk1vZGUuTk9USUZZX0FGTSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENISUxEUkVOX1ZJRVdTX0dPTkVfSVNfVklTSUJMRV9BUEk6CisgICAgICAgICAgICAgICAgc2V0Vmlld3NJbnZpc2libGUoVmlzaWJpbGl0eUludGVncmF0aW9uTW9kZS5PVkVSUklERV9JU19WSVNJQkxFX1RPX1VTRVIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBQQVJFTlRfVklFV19HT05FOgorICAgICAgICAgICAgICAgIG1BY3Rpdml0eS5ydW5PblVpVGhyZWFkKCgpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgVmlld0dyb3VwIHBhcmVudCA9IChWaWV3R3JvdXApIG1BY3Rpdml0eS5tQ3VzdG9tVmlldy5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50LnJlbW92ZVZpZXcobUFjdGl2aXR5Lm1DdXN0b21WaWV3KTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRVhQTElDSVRfQ09NTUlUOgorICAgICAgICAgICAgICAgIG1BY3Rpdml0eS5nZXRBdXRvZmlsbE1hbmFnZXIoKS5jb21taXQoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU1VCTUlUX0JVVFRPTl9DTElDS0VEOgorICAgICAgICAgICAgICAgIG1BY3Rpdml0eS5tQ3VzdG9tVmlldy5jbGlja0xvZ2luKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gdHlwZTogIiArIGNvbW1pdFR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQXNzZXJ0IFVJIGlzIHNob3dpbmcuCisgICAgICAgIG1VaUJvdC5zYXZlRm9yQXV0b2ZpbGwodHJ1ZSwgU0FWRV9EQVRBX1RZUEVfUEFTU1dPUkQpOworCisgICAgICAgIC8vIEFzc2VydCByZXN1bHRzCisgICAgICAgIGZpbmFsIFNhdmVSZXF1ZXN0IHNhdmVSZXF1ZXN0ID0gc1JlcGxpZXIuZ2V0TmV4dFNhdmVSZXF1ZXN0KCk7CisgICAgICAgIGZpbmFsIFZpZXdOb2RlIHVzZXJuYW1lID0gZmluZE5vZGVCeVJlc291cmNlSWQoc2F2ZVJlcXVlc3Quc3RydWN0dXJlLCBJRF9VU0VSTkFNRSk7CisgICAgICAgIGZpbmFsIFZpZXdOb2RlIHBhc3N3b3JkID0gZmluZE5vZGVCeVJlc291cmNlSWQoc2F2ZVJlcXVlc3Quc3RydWN0dXJlLCBJRF9QQVNTV09SRCk7CisKKyAgICAgICAgYXNzZXJ0VGV4dEFuZFZhbHVlKHVzZXJuYW1lLCAiZm9vIik7CisgICAgICAgIGFzc2VydFRleHRBbmRWYWx1ZShwYXNzd29yZCwgImJhciIpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHNldFZpZXdzSW52aXNpYmxlKFZpc2liaWxpdHlJbnRlZ3JhdGlvbk1vZGUgbW9kZSkgeworICAgICAgICBtQWN0aXZpdHkubVVzZXJuYW1lLnNldFZpc2liaWxpdHlJbnRlZ3JhdGlvbk1vZGUobW9kZSk7CisgICAgICAgIG1BY3Rpdml0eS5tUGFzc3dvcmQuc2V0VmlzaWJpbGl0eUludGVncmF0aW9uTW9kZShtb2RlKTsKKyAgICAgICAgbUFjdGl2aXR5Lm1Vc2VybmFtZS5jaGFuZ2VWaXNpYmlsaXR5KGZhbHNlKTsKKyAgICAgICAgbUFjdGl2aXR5Lm1QYXNzd29yZC5jaGFuZ2VWaXNpYmlsaXR5KGZhbHNlKTsKKyAgICB9CisKKyAgICAvLyBOT1RFOiB0ZXN0cyB3aGVyZSBzYXZlIGlzIG5vdCBzaG93biBvbmx5IG1ha2VzIHNlbnNlIHdoZW4gY2FsbGluZyBjb21taXQoKSBleHBsaWNpdGx5LAorICAgIC8vIG90aGVyd2lzZSB0aGUgdGVzdCBjb3VsZCBwYXNzIGJ1dCB0aGUgVUkgaXMgc3RpbGwgc2hvd24gKmFmdGVyKiB0aGUgYXBwIGlzIGNvbW1pdHRlZC4KKyAgICAvLyBXZSBjb3VsZCBzdGlsbCB0ZXN0IHRoZW0gYnkgZXhwbGljaXRseSBjb21taXR0aW5nIGFuZCB0aGVuIGNoZWNraW5nIHRoYXQgdGhlIFNhdmUgVUkgaXMgbm90CisgICAgLy8gc2hvd24gYWdhaW4sIGJ1dCB0aGVuIHdlIHdvdWxkbid0IGJlIGVmZmVjdGl2ZWx5IHRlc3RpbmcgdGhhdCB0aGUgY29udGV4dCB3YXMgY29tbWl0dGVkCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTYXZlTm90U2hvd25fbm9Vc2VySW5wdXQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgLy8gU2V0IHNlcnZpY2UuCiAgICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKIAogICAgICAgICAvLyBTZXQgZXhwZWN0YXRpb25zLgogICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgIC5zZXRSZXF1aXJlZFNhdmFibGVJZHMoU0FWRV9EQVRBX1RZUEVfUEFTU1dPUkQsIElEX1VTRVJOQU1FLCBJRF9QQVNTV09SRCkKLSAgICAgICAgICAgICAgICAuc2V0RmxhZ3MoU2F2ZUluZm8uRkxBR19TQVZFX09OX0FMTF9WSUVXU19JTlZJU0lCTEUpCi0gICAgICAgICAgICAgICAgLmJ1aWxkKCkpOwotCi0gICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworICAgICAgICAgICAgICAgIC5zZXRSZXF1aXJlZFNhdmFibGVJZHMoU0FWRV9EQVRBX1RZUEVfUEFTU1dPUkQsIElEX1VTRVJOQU1FLCBJRF9QQVNTV09SRCkuYnVpbGQoKSk7CiAKICAgICAgICAgLy8gVHJpZ2dlciBhdXRvLWZpbGwuCi0gICAgICAgIG1BY3Rpdml0eS5ydW5PblVpVGhyZWFkKCgpIC0+IHsKLSAgICAgICAgICAgIG1BY3Rpdml0eS5tVXNlcm5hbWUuY2hhbmdlRm9jdXModHJ1ZSk7Ci0gICAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKLSAgICAgICAgfSk7Ci0gICAgICAgIGxhdGNoLmF3YWl0KEhlbHBlci5VSV9USU1FT1VUX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICBmb2N1c1RvVXNlcm5hbWVFeHBlY3ROb1dpbmRvd0V2ZW50KCk7CiAgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwogCi0gICAgICAgIC8vIFRPRE86IDYzNjAyNTczIFNob3VsZCBiZSByZW1vdmVkIG9uY2UgdGhpcyBidWcgaXMgZml4ZWQKLSAgICAgICAgU3lzdGVtQ2xvY2suc2xlZXAoMTAwMCk7CisgICAgICAgIC8vIFRyaWdnZXIgc2F2ZS4KKyAgICAgICAgbUFjdGl2aXR5LmdldEF1dG9maWxsTWFuYWdlcigpLmNvbW1pdCgpOwogCi0gICAgICAgIG1BY3Rpdml0eS5ydW5PblVpVGhyZWFkKCgpIC0+IHsKLSAgICAgICAgICAgIC8vIEZpbGwgaW4gc29tZSBzdHVmZgotICAgICAgICAgICAgbUFjdGl2aXR5Lm1Vc2VybmFtZS5zZXRUZXh0KCJmb28iKTsKLSAgICAgICAgICAgIG1BY3Rpdml0eS5tUGFzc3dvcmQuc2V0VGV4dCgiYmFyIik7Ci0KLSAgICAgICAgICAgIC8vIEhpZGUgYWxsIHZpcnR1YWwgdmlld3MKLSAgICAgICAgICAgIG1BY3Rpdml0eS5tVXNlcm5hbWUuY2hhbmdlVmlzaWJpbGl0eShmYWxzZSk7Ci0gICAgICAgICAgICBtQWN0aXZpdHkubVBhc3N3b3JkLmNoYW5nZVZpc2liaWxpdHkoZmFsc2UpOwotICAgICAgICB9KTsKLQotICAgICAgICAvLyBNYWtlIHN1cmUgc2F2ZSBpcyBzaG93bgotICAgICAgICBzVWlCb3QuYXNzZXJ0U2F2ZVNob3dpbmcoU0FWRV9EQVRBX1RZUEVfUEFTU1dPUkQpOworICAgICAgICAvLyBBc3NlcnQgaXQncyBub3Qgc2hvd2luZy4KKyAgICAgICAgbVVpQm90LmFzc2VydFNhdmVOb3RTaG93aW5nKFNBVkVfREFUQV9UWVBFX1BBU1NXT1JEKTsKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBDYW5ub3RGYWtlUGFja2FnZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBAQXBwTW9kZUZ1bGwgLy8gdGVzdFNhdmVOb3RTaG93bl9ub1VzZXJJbnB1dCgpIGlzIGVub3VnaCB0byB0ZXN0IGVwaGVtZXJhbCBhcHBzIHN1cHBvcnQKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2F2ZU5vdFNob3duX2luaXRpYWxWYWx1ZXNfbm9Vc2VySW5wdXQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgLy8gUHJlcGFyZSBhY3Rpdml0aXkuCisgICAgICAgIG1BY3Rpdml0eS5tVXNlcm5hbWUuc2V0VGV4dCgiZm9vIik7CisgICAgICAgIG1BY3Rpdml0eS5tUGFzc3dvcmQuc2V0VGV4dCgiYmFyIik7CisKICAgICAgICAgLy8gU2V0IHNlcnZpY2UuCiAgICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKIAogICAgICAgICAvLyBTZXQgZXhwZWN0YXRpb25zLgotICAgICAgICBzUmVwbGllci5hY2NlcHRSZXF1ZXN0c0Zyb21QYWNrYWdlKCJNQUxJQ0lPVVMiKTsKLSAgICAgICAgbUFjdGl2aXR5Lm1DdXN0b21WaWV3LmZha2VQYWNrYWdlTmFtZShuZXcgQ29tcG9uZW50TmFtZSgiTUFMSUNJT1VTIiwgIkFNLkkiKSk7Ci0gICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgImR1ZGUiKQotICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9QQVNTV09SRCwgInN3ZWV0IikKLSAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiVGhlIER1ZGUiKSkKKyAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UobmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0UmVxdWlyZWRTYXZhYmxlSWRzKFNBVkVfREFUQV9UWVBFX1BBU1NXT1JELCBJRF9VU0VSTkFNRSwgSURfUEFTU1dPUkQpLmJ1aWxkKCkpOworCisgICAgICAgIC8vIFRyaWdnZXIgYXV0by1maWxsLgorICAgICAgICBmb2N1c1RvVXNlcm5hbWVFeHBlY3ROb1dpbmRvd0V2ZW50KCk7CisgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOworCisgICAgICAgIC8vIFRyaWdnZXIgc2F2ZS4KKyAgICAgICAgbUFjdGl2aXR5LmdldEF1dG9maWxsTWFuYWdlcigpLmNvbW1pdCgpOworCisgICAgICAgIC8vIEFzc2VydCBpdCdzIG5vdCBzaG93aW5nLgorICAgICAgICBtVWlCb3QuYXNzZXJ0U2F2ZU5vdFNob3dpbmcoU0FWRV9EQVRBX1RZUEVfUEFTU1dPUkQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgQEFwcE1vZGVGdWxsIC8vIHRlc3RTYXZlTm90U2hvd25fbm9Vc2VySW5wdXQoKSBpcyBlbm91Z2ggdG8gdGVzdCBlcGhlbWVyYWwgYXBwcyBzdXBwb3J0CisgICAgcHVibGljIHZvaWQgdGVzdFNhdmVOb3RTaG93bl9pbml0aWFsVmFsdWVzX25vVXNlcklucHV0X3NlcnZpY2VEYXRhc2V0cygpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICAvLyBQcmVwYXJlIGFjdGl2aXRpeS4KKyAgICAgICAgbUFjdGl2aXR5Lm1Vc2VybmFtZS5zZXRUZXh0KCJmb28iKTsKKyAgICAgICAgbUFjdGl2aXR5Lm1QYXNzd29yZC5zZXRUZXh0KCJiYXIiKTsKKworICAgICAgICAvLyBTZXQgc2VydmljZS4KKyAgICAgICAgZW5hYmxlU2VydmljZSgpOworCisgICAgICAgIC8vIFNldCBleHBlY3RhdGlvbnMuCisgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLmFkZERhdGFzZXQobmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfVVNFUk5BTUUsICJkdWRlIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9QQVNTV09SRCwgInN3ZWV0IikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJUaGUgRHVkZSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLnNldFJlcXVpcmVkU2F2YWJsZUlkcyhTQVZFX0RBVEFfVFlQRV9QQVNTV09SRCwgSURfVVNFUk5BTUUsIElEX1BBU1NXT1JEKS5idWlsZCgpKTsKKworICAgICAgICAvLyBUcmlnZ2VyIGF1dG8tZmlsbC4KKyAgICAgICAgZm9jdXNUb1VzZXJuYW1lRXhwZWN0Tm9XaW5kb3dFdmVudCgpOworICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKKyAgICAgICAgYXNzZXJ0RGF0YXNldFNob3duKG1BY3Rpdml0eS5tVXNlcm5hbWUsICJUaGUgRHVkZSIpOworCisgICAgICAgIC8vIFRyaWdnZXIgc2F2ZS4KKyAgICAgICAgbUFjdGl2aXR5LmdldEF1dG9maWxsTWFuYWdlcigpLmNvbW1pdCgpOworCisgICAgICAgIC8vIEFzc2VydCBpdCdzIG5vdCBzaG93aW5nLgorICAgICAgICBtVWlCb3QuYXNzZXJ0U2F2ZU5vdFNob3dpbmcoU0FWRV9EQVRBX1RZUEVfUEFTU1dPUkQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgQEFwcE1vZGVGdWxsIC8vIHRlc3RTYXZlTm90U2hvd25fbm9Vc2VySW5wdXQoKSBpcyBlbm91Z2ggdG8gdGVzdCBlcGhlbWVyYWwgYXBwcyBzdXBwb3J0CisgICAgcHVibGljIHZvaWQgdGVzdFNhdmVOb3RTaG93bl91c2VySW5wdXRNYXRjaGVzRGF0YXNldHMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgLy8gUHJlcGFyZSBhY3Rpdml0aXkuCisgICAgICAgIG1BY3Rpdml0eS5tVXNlcm5hbWUuc2V0VGV4dCgiZm9vIik7CisgICAgICAgIG1BY3Rpdml0eS5tUGFzc3dvcmQuc2V0VGV4dCgiYmFyIik7CisKKyAgICAgICAgLy8gU2V0IHNlcnZpY2UuCisgICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKKworICAgICAgICAvLyBTZXQgZXhwZWN0YXRpb25zLgorICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5hZGREYXRhc2V0KG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1VTRVJOQU1FLCAiZm9vIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9QQVNTV09SRCwgImJhciIpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiVGhlIER1ZGUiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQorICAgICAgICAgICAgICAgIC5zZXRSZXF1aXJlZFNhdmFibGVJZHMoU0FWRV9EQVRBX1RZUEVfUEFTU1dPUkQsIElEX1VTRVJOQU1FLCBJRF9QQVNTV09SRCkuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gVHJpZ2dlciBhdXRvLWZpbGwuCisgICAgICAgIGZvY3VzVG9Vc2VybmFtZUV4cGVjdE5vV2luZG93RXZlbnQoKTsKKyAgICAgICAgc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CisgICAgICAgIGFzc2VydERhdGFzZXRTaG93bihtQWN0aXZpdHkubVVzZXJuYW1lLCAiVGhlIER1ZGUiKTsKKworICAgICAgICAvLyBUcmlnZ2VyIHNhdmUuCisgICAgICAgIG1BY3Rpdml0eS5nZXRBdXRvZmlsbE1hbmFnZXIoKS5jb21taXQoKTsKKworICAgICAgICAvLyBBc3NlcnQgaXQncyBub3Qgc2hvd2luZy4KKyAgICAgICAgbVVpQm90LmFzc2VydFNhdmVOb3RTaG93aW5nKFNBVkVfREFUQV9UWVBFX1BBU1NXT1JEKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REYXRhc2V0RmlsdGVyaW5nKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBhYSA9ICJUd28gQSdzIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIGFiID0gIkEgYW5kIEIiOworICAgICAgICBmaW5hbCBTdHJpbmcgYiA9ICJPbmx5IEIiOworCisgICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKKworICAgICAgICAvLyBTZXQgZXhwZWN0YXRpb25zLgorICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5hZGREYXRhc2V0KG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX1VTRVJOQU1FLCAiYWEiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oYWEpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLmFkZERhdGFzZXQobmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfVVNFUk5BTUUsICJhYiIpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbihhYikpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuYWRkRGF0YXNldChuZXcgQ2FubmVkRGF0YXNldC5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9VU0VSTkFNRSwgImIiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbihjcmVhdGVQcmVzZW50YXRpb24oYikpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CiAKICAgICAgICAgLy8gVHJpZ2dlciBhdXRvLWZpbGwuCi0gICAgICAgIG1BY3Rpdml0eS5tVXNlcm5hbWUuY2hhbmdlRm9jdXModHJ1ZSk7Ci0gICAgICAgIGFzc2VydERhdGFzZXRTaG93bihtQWN0aXZpdHkubVVzZXJuYW1lLCAiVGhlIER1ZGUiKTsKKyAgICAgICAgZm9jdXNUb1VzZXJuYW1lRXhwZWN0Tm9XaW5kb3dFdmVudCgpOworICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKIAotICAgICAgICAvLyBNYWtlIHN1cmUgcGFja2FnZSBuYW1lIHdhcyBzYW5pdGl6ZWQuCi0gICAgICAgIGZpbmFsIEZpbGxSZXF1ZXN0IHJlcXVlc3QgPSBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKLSAgICAgICAgYXNzZXJ0VGhhdChyZXF1ZXN0LnN0cnVjdHVyZS5nZXRBY3Rpdml0eUNvbXBvbmVudCgpLmdldFBhY2thZ2VOYW1lKCkpCi0gICAgICAgICAgICAgICAgLmlzRXF1YWxUbyhtUGFja2FnZU5hbWUpOworICAgICAgICAvLyBXaXRoIG5vIGZpbHRlciB0ZXh0IGFsbCBkYXRhc2V0cyBzaG91bGQgYmUgc2hvd24KKyAgICAgICAgYXNzZXJ0RGF0YXNldFNob3duKG1BY3Rpdml0eS5tVXNlcm5hbWUsIGFhLCBhYiwgYik7CisKKyAgICAgICAgLy8gT25seSB0d28gZGF0YXNldHMgc3RhcnQgd2l0aCAnYScKKyAgICAgICAgbUFjdGl2aXR5Lm1Vc2VybmFtZS5zZXRUZXh0KCJhIik7CisgICAgICAgIGFzc2VydERhdGFzZXRTaG93bihtQWN0aXZpdHkubVVzZXJuYW1lLCBhYSwgYWIpOworCisgICAgICAgIC8vIE9ubHkgb25lIGRhdGFzZXQgc3RhcnQgd2l0aCAnYWEnCisgICAgICAgIG1BY3Rpdml0eS5tVXNlcm5hbWUuc2V0VGV4dCgiYWEiKTsKKyAgICAgICAgYXNzZXJ0RGF0YXNldFNob3duKG1BY3Rpdml0eS5tVXNlcm5hbWUsIGFhKTsKKworICAgICAgICAvLyBPbmx5IHR3byBkYXRhc2V0cyBzdGFydCB3aXRoICdhJworICAgICAgICBtQWN0aXZpdHkubVVzZXJuYW1lLnNldFRleHQoImEiKTsKKyAgICAgICAgYXNzZXJ0RGF0YXNldFNob3duKG1BY3Rpdml0eS5tVXNlcm5hbWUsIGFhLCBhYik7CisKKyAgICAgICAgLy8gV2l0aCBubyBmaWx0ZXIgdGV4dCBhbGwgZGF0YXNldHMgc2hvdWxkIGJlIHNob3duCisgICAgICAgIG1BY3Rpdml0eS5tVXNlcm5hbWUuc2V0VGV4dCgiIik7CisgICAgICAgIGFzc2VydERhdGFzZXRTaG93bihtQWN0aXZpdHkubVVzZXJuYW1lLCBhYSwgYWIsIGIpOworCisgICAgICAgIC8vIE5vIGRhdGFzZXQgc3RhcnQgd2l0aCAnYWFhJworICAgICAgICBmaW5hbCBNeUF1dG9maWxsQ2FsbGJhY2sgY2FsbGJhY2sgPSBtQWN0aXZpdHkucmVnaXN0ZXJDYWxsYmFjaygpOworICAgICAgICBtQWN0aXZpdHkubVVzZXJuYW1lLnNldFRleHQoImFhYSIpOworICAgICAgICBjYWxsYmFjay5hc3NlcnRVaUhpZGRlbkV2ZW50KG1BY3Rpdml0eS5tQ3VzdG9tVmlldywgbUFjdGl2aXR5Lm1Vc2VybmFtZS50ZXh0LmlkKTsKKyAgICAgICAgbVVpQm90LmFzc2VydE5vRGF0YXNldHMoKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBBc3NlcnRzIHRoZSBkYXRhc2V0IHBpY2tlciBpcyBwcm9wZXJseSBkaXNwbGF5ZWQgaW4gYSBnaXZlIGxpbmUuCiAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydERhdGFzZXRTaG93bihMaW5lIGxpbmUsIFN0cmluZy4uLiBleHBlY3RlZERhdGFzZXRzKSB7Ci0gICAgICAgIGZpbmFsIFJlY3QgcGlja2VyQm91bmRzID0gc1VpQm90LmFzc2VydERhdGFzZXRzKGV4cGVjdGVkRGF0YXNldHMpLmdldFZpc2libGVCb3VuZHMoKTsKKyAgICBwcm90ZWN0ZWQgVWlPYmplY3QyIGFzc2VydERhdGFzZXRTaG93bihMaW5lIGxpbmUsIFN0cmluZy4uLiBleHBlY3RlZERhdGFzZXRzKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGJvb2xlYW4gYXV0b2ZpbGxWaWV3Qm91bmRzTWF0Y2hlcyA9ICFIZWxwZXIuaXNBdXRvZmlsbFdpbmRvd0Z1bGxTY3JlZW4obUNvbnRleHQpOworICAgICAgICBmaW5hbCBVaU9iamVjdDIgZGF0YXNldFBpY2tlciA9IG1VaUJvdC5hc3NlcnREYXRhc2V0cyhleHBlY3RlZERhdGFzZXRzKTsKKyAgICAgICAgZmluYWwgUmVjdCBwaWNrZXJCb3VuZHMgPSBkYXRhc2V0UGlja2VyLmdldFZpc2libGVCb3VuZHMoKTsKICAgICAgICAgZmluYWwgUmVjdCBmaWVsZEJvdW5kcyA9IGxpbmUuZ2V0QWJzQ29vcmRpbmF0ZXMoKTsKLSAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoInZlcnRpY2FsIGNvb3JkaW5hdGVzIGRvbid0IG1hdGNoOyBwaWNrZXI9JXMsIGZpZWxkPSVzIiwgcGlja2VyQm91bmRzLAotICAgICAgICAgICAgICAgIGZpZWxkQm91bmRzKS50aGF0KHBpY2tlckJvdW5kcy50b3ApLmlzRXF1YWxUbyhmaWVsZEJvdW5kcy5ib3R0b20pOwotICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiaG9yaXpvbnRhbCBjb29yZGluYXRlcyBkb24ndCBtYXRjaDsgcGlja2VyPSVzLCBmaWVsZD0lcyIsIHBpY2tlckJvdW5kcywKLSAgICAgICAgICAgICAgICBmaWVsZEJvdW5kcykudGhhdChwaWNrZXJCb3VuZHMubGVmdCkuaXNFcXVhbFRvKGZpZWxkQm91bmRzLmxlZnQpOworICAgICAgICBpZiAoYXV0b2ZpbGxWaWV3Qm91bmRzTWF0Y2hlcykgeworICAgICAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoInZlcnRpY2FsIGNvb3JkaW5hdGVzIGRvbid0IG1hdGNoOyBwaWNrZXI9JXMsIGZpZWxkPSVzIiwgcGlja2VyQm91bmRzLAorICAgICAgICAgICAgICAgICAgICBmaWVsZEJvdW5kcykudGhhdChwaWNrZXJCb3VuZHMudG9wKS5pc0VxdWFsVG8oZmllbGRCb3VuZHMuYm90dG9tKTsKKyAgICAgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJob3Jpem9udGFsIGNvb3JkaW5hdGVzIGRvbid0IG1hdGNoOyBwaWNrZXI9JXMsIGZpZWxkPSVzIiwKKyAgICAgICAgICAgICAgICAgICAgcGlja2VyQm91bmRzLCBmaWVsZEJvdW5kcykudGhhdChwaWNrZXJCb3VuZHMubGVmdCkuaXNFcXVhbFRvKGZpZWxkQm91bmRzLmxlZnQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBkYXRhc2V0UGlja2VyOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydExhYmVsKFZpZXdOb2RlIG5vZGUsIFN0cmluZyBleHBlY3RlZFZhbHVlKSB7CisgICAgICAgIGlmIChtQ29tcGF0TW9kZSkgeworICAgICAgICAgICAgLy8gQ29tcGF0IG1vZGUgZG9lc24ndCBzZXQgQXV0b2ZpbGxWYWx1ZSBvZiBub24tZWRpdGFibGUgZmllbGRzCisgICAgICAgICAgICBhc3NlcnRUZXh0T25seShub2RlLCBleHBlY3RlZFZhbHVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydFRleHRBbmRWYWx1ZShub2RlLCBleHBlY3RlZFZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydFVybEJhcklzU2FuaXRpemVkKFZpZXdOb2RlIHVybEJhcikgeworICAgICAgICBhc3NlcnRUZXh0SXNTYW5pdGl6ZWQodXJsQmFyKTsKKyAgICAgICAgYXNzZXJ0VGhhdCh1cmxCYXIuZ2V0V2ViRG9tYWluKCkpLmlzTnVsbCgpOworICAgICAgICBhc3NlcnRUaGF0KHVybEJhci5nZXRXZWJTY2hlbWUoKSkuaXNOdWxsKCk7CisgICAgfQorCisKKyAgICBwcml2YXRlIHZvaWQgc2tpcFRlc3RPbkNvbXBhdE1vZGUoKSB7CisgICAgICAgIGFzc3VtZVRydWUoInRlc3Qgbm90IGFwcGxpY2FibGUgd2hlbiBvbiBjb21wYXQgbW9kZSIsICFtQ29tcGF0TW9kZSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvVmlydHVhbENvbnRhaW5lclZpZXcuamF2YSBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL1ZpcnR1YWxDb250YWluZXJWaWV3LmphdmEKaW5kZXggOGVlY2MyOS4uYzlmNjc2ZiAxMDA2NDQKLS0tIGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvVmlydHVhbENvbnRhaW5lclZpZXcuamF2YQorKysgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9WaXJ0dWFsQ29udGFpbmVyVmlldy5qYXZhCkBAIC0xNiwxOSArMTYsMTggQEAKIAogcGFja2FnZSBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHM7CiAKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkhlbHBlci5GSUxMX1RJTUVPVVRfTVM7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5UaW1lb3V0cy5GSUxMX1RJTUVPVVQ7CiAKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24udHJ1dGguVHJ1dGguYXNzZXJ0V2l0aE1lc3NhZ2U7CiAKLWltcG9ydCBhbmRyb2lkLmFwcC5hc3Npc3QuQXNzaXN0U3RydWN0dXJlOwogaW1wb3J0IGFuZHJvaWQuYXBwLmFzc2lzdC5Bc3Npc3RTdHJ1Y3R1cmUuVmlld05vZGU7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQuU3R5bGU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQudGV4dC5FZGl0YWJsZTsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0V2F0Y2hlcjsKQEAgLTQyLDYgKzQxLDExIEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdTdHJ1Y3R1cmU7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdTdHJ1Y3R1cmUuSHRtbEluZm87CiBpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlOb2RlSW5mbzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5Tm9kZVByb3ZpZGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5hdXRvZmlsbC5BdXRvZmlsbElkOwogaW1wb3J0IGFuZHJvaWQudmlldy5hdXRvZmlsbC5BdXRvZmlsbE1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmF1dG9maWxsLkF1dG9maWxsVmFsdWU7CiAKQEAgLTUzLDE2ICs1NywyMCBAQAogY2xhc3MgVmlydHVhbENvbnRhaW5lclZpZXcgZXh0ZW5kcyBWaWV3IHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiVmlydHVhbENvbnRhaW5lclZpZXciOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMT0dJTl9CVVRUT05fVklSVFVBTF9JRCA9IDY2NjsKIAogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUxfQ0xBU1MgPSAibXkucmVhZG9ubHkudmlldyI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0NMQVNTID0gIm15LmVkaXRhYmxlLnZpZXciOwotCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9VUkxfQkFSID0gIm15X3VybF9iYXIiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfVVJMX0JBUjIgPSAibXlfdXJsX2JhcjIiOwogCiAgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8TGluZT4gbUxpbmVzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgcHJpdmF0ZSBmaW5hbCBTcGFyc2VBcnJheTxJdGVtPiBtSXRlbXMgPSBuZXcgU3BhcnNlQXJyYXk8PigpOwotICAgIHByaXZhdGUgZmluYWwgQXV0b2ZpbGxNYW5hZ2VyIG1BZm07CisgICAgcHJpdmF0ZSBBdXRvZmlsbE1hbmFnZXIgbUFmbTsKKyAgICBmaW5hbCBBdXRvZmlsbElkIG1Mb2dpbkJ1dHRvbklkOwogCiAgICAgcHJpdmF0ZSBMaW5lIG1Gb2N1c2VkTGluZTsKKyAgICBwcml2YXRlIGludCBtTmV4dENoaWxkSWQ7CiAKICAgICBwcml2YXRlIFBhaW50IG1UZXh0UGFpbnQ7CiAgICAgcHJpdmF0ZSBpbnQgbVRleHRIZWlnaHQ7CkBAIC03NCwxMiArODIsMjUgQEAKICAgICBwcml2YXRlIGludCBtVW5mb2N1c2VkQ29sb3I7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1TeW5jID0gdHJ1ZTsKICAgICBwcml2YXRlIGJvb2xlYW4gbU92ZXJyaWRlRGlzcGF0Y2hQcm92aWRlQXV0b2ZpbGxTdHJ1Y3R1cmUgPSBmYWxzZTsKLSAgICBwcml2YXRlIENvbXBvbmVudE5hbWUgbUZha2VkQ29tcG9uZW50TmFtZTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBtQ29tcGF0TW9kZSA9IGZhbHNlOworICAgIHByaXZhdGUgQWNjZXNzaWJpbGl0eURlbGVnYXRlIG1BY2Nlc3NpYmlsaXR5RGVsZWdhdGU7CisgICAgcHJpdmF0ZSBBY2Nlc3NpYmlsaXR5Tm9kZVByb3ZpZGVyIG1BY2Nlc3NpYmlsaXR5Tm9kZVByb3ZpZGVyOworCisgICAgLyoqCisgICAgICogRW51bSBkZWZpbmluZyBob3cgdGhlIHZpZXcgY29tbXVuaWNhdGUgdmlzaWJpbGl0eSBjaGFuZ2VzIHRvIHRoZSBmcmFtZXdvcmsKKyAgICAgKi8KKyAgICBlbnVtIFZpc2liaWxpdHlJbnRlZ3JhdGlvbk1vZGUgeworICAgICAgICBOT1RJRllfQUZNLAorICAgICAgICBPVkVSUklERV9JU19WSVNJQkxFX1RPX1VTRVIKKyAgICB9CisKKyAgICBwcml2YXRlIFZpc2liaWxpdHlJbnRlZ3JhdGlvbk1vZGUgbVZpc2liaWxpdHlJbnRlZ3JhdGlvbk1vZGU7CiAKICAgICBwdWJsaWMgVmlydHVhbENvbnRhaW5lclZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKICAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOwogCi0gICAgICAgIG1BZm0gPSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQXV0b2ZpbGxNYW5hZ2VyLmNsYXNzKTsKKyAgICAgICAgc2V0QXV0b2ZpbGxNYW5hZ2VyKGNvbnRleHQpOwogCiAgICAgICAgIG1UZXh0UGFpbnQgPSBuZXcgUGFpbnQoKTsKIApAQCAtOTcsMjggKzExOCwyNyBAQAogICAgICAgICBtTGluZUxlbmd0aCA9IG1UZXh0SGVpZ2h0ICsgbVZlcnRpY2FsR2FwOwogICAgICAgICBtVGV4dFBhaW50LnNldFRleHRTaXplKG1UZXh0SGVpZ2h0KTsKICAgICAgICAgTG9nLmQoVEFHLCAiVGV4dCBoZWlnaHQ6ICIgKyBtVGV4dEhlaWdodCk7CisgICAgICAgIG1Mb2dpbkJ1dHRvbklkID0gbmV3IEF1dG9maWxsSWQoZ2V0QXV0b2ZpbGxJZCgpLCBMT0dJTl9CVVRUT05fVklSVFVBTF9JRCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QXV0b2ZpbGxNYW5hZ2VyKENvbnRleHQgY29udGV4dCkgeworICAgICAgICBtQWZtID0gY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKEF1dG9maWxsTWFuYWdlci5jbGFzcyk7CisgICAgICAgIExvZy5kKFRBRywgIlNldCBBRk0gZnJvbSAiICsgY29udGV4dCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYXV0b2ZpbGwoU3BhcnNlQXJyYXk8QXV0b2ZpbGxWYWx1ZT4gdmFsdWVzKSB7CiAgICAgICAgIExvZy5kKFRBRywgImF1dG9maWxsOiAiICsgdmFsdWVzKTsKKyAgICAgICAgaWYgKG1Db21wYXRNb2RlKSB7CisgICAgICAgICAgICBMb2cudihUQUcsICJ1c2luZyBzdXBlci5hdXRvZmlsbCgpIG9uIGNvbXBhdCBtb2RlIik7CisgICAgICAgICAgICBzdXBlci5hdXRvZmlsbCh2YWx1ZXMpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICBmaW5hbCBpbnQgaWQgPSB2YWx1ZXMua2V5QXQoaSk7CiAgICAgICAgICAgICBmaW5hbCBBdXRvZmlsbFZhbHVlIHZhbHVlID0gdmFsdWVzLnZhbHVlQXQoaSk7Ci0gICAgICAgICAgICBmaW5hbCBJdGVtIGl0ZW0gPSBtSXRlbXMuZ2V0KGlkKTsKLSAgICAgICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJObyBpdGVtIGZvciBpZCAiICsgaWQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghaXRlbS5lZGl0YWJsZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkl0ZW0gZm9yIGlkICIgKyBpZCArICIgaXMgbm90IGVkaXRhYmxlOiAiICsgaXRlbSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaXRlbS50ZXh0ID0gdmFsdWUuZ2V0VGV4dFZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAoaXRlbS5saXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiTm90aWZ5IGxpc3RlbmVyOiAiICsgaXRlbS50ZXh0KTsKLSAgICAgICAgICAgICAgICBpdGVtLmxpc3RlbmVyLm9uVGV4dENoYW5nZWQoaXRlbS50ZXh0LCAwLCAwLCAwKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIEl0ZW0gaXRlbSA9IGdldEl0ZW0oaWQpOworICAgICAgICAgICAgaXRlbS5hdXRvZmlsbCh2YWx1ZS5nZXRUZXh0VmFsdWUoKSk7CiAgICAgICAgIH0KICAgICAgICAgcG9zdEludmFsaWRhdGUoKTsKICAgICB9CkBAIC0xOTUsMTYgKzIxNSw5IEBACiAgICAgICAgIExvZy5kKFRBRywgIm9uUHJvdmlkZUF1dG9maWxsVmlydHVhbFN0cnVjdHVyZSgpOiBmbGFncyA9ICIgKyBmbGFncyk7CiAgICAgICAgIHN1cGVyLm9uUHJvdmlkZUF1dG9maWxsVmlydHVhbFN0cnVjdHVyZShzdHJ1Y3R1cmUsIGZsYWdzKTsKIAotICAgICAgICBpZiAobUZha2VkQ29tcG9uZW50TmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJGYWtpbmcgcGFja2FnZSBuYW1lIHRvICIgKyBtRmFrZWRDb21wb25lbnROYW1lKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgQXNzaXN0U3RydWN0dXJlIGFzc2lzdFN0cnVjdHVyZSA9IEhlbHBlci5nZXRGaWVsZChzdHJ1Y3R1cmUsICJtQXNzaXN0Iik7Ci0gICAgICAgICAgICAgICAgaWYgKGFzc2lzdFN0cnVjdHVyZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIEhlbHBlci5zZXRGaWVsZChhc3Npc3RTdHJ1Y3R1cmUsICJtQWN0aXZpdHlDb21wb25lbnQiLCBtRmFrZWRDb21wb25lbnROYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkNvdWxkIG5vdCBmYWtlIHBhY2thZ2UgbmFtZSB0byAiICsgbUZha2VkQ29tcG9uZW50TmFtZSwgZSk7Ci0gICAgICAgICAgICB9CisgICAgICAgIGlmIChtQ29tcGF0TW9kZSkgeworICAgICAgICAgICAgTG9nLnYoVEFHLCAidXNpbmcgc3VwZXIub25Qcm92aWRlQXV0b2ZpbGxWaXJ0dWFsU3RydWN0dXJlKCkgb24gY29tcGF0IG1vZGUiKTsKKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCiAgICAgICAgIGZpbmFsIFN0cmluZyBwYWNrYWdlTmFtZSA9IGdldENvbnRleHQoKS5nZXRQYWNrYWdlTmFtZSgpOwpAQCAtMjIwLDEzICsyMzMsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgOiBzdHJ1Y3R1cmUuYXN5bmNOZXdDaGlsZChpbmRleCk7CiAgICAgICAgICAgICBjaGlsZC5zZXRBdXRvZmlsbElkKHN0cnVjdHVyZS5nZXRBdXRvZmlsbElkKCksIGl0ZW0uaWQpOwogICAgICAgICAgICAgY2hpbGQuc2V0RGF0YUlzU2Vuc2l0aXZlKGl0ZW0uc2Vuc2l0aXZlKTsKKyAgICAgICAgICAgIGlmIChpdGVtLmVkaXRhYmxlKSB7CisgICAgICAgICAgICAgICAgY2hpbGQuc2V0SW5wdXRUeXBlKGl0ZW0ubGluZS5pbnB1dFR5cGUpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjbGFzc05hbWUgPSBpdGVtLmVkaXRhYmxlID8gVEVYVF9DTEFTUyA6IExBQkVMX0NMQVNTOwotICAgICAgICAgICAgY2hpbGQuc2V0Q2xhc3NOYW1lKGNsYXNzTmFtZSk7CisgICAgICAgICAgICBjaGlsZC5zZXRDbGFzc05hbWUoaXRlbS5jbGFzc05hbWUpOwogICAgICAgICAgICAgLy8gTXVzdCBzZXQgImZha2UiIGlkRW50cnkgYmVjYXVzZSB0aGF0J3Mgd2hhdCB0aGUgdGVzdCBjYXNlcyB1c2UgdG8gZmluZCBub2Rlcy4KICAgICAgICAgICAgIGNoaWxkLnNldElkKDEwMDAgKyBpbmRleCwgcGFja2FnZU5hbWUsICJpZCIsIGl0ZW0ucmVzb3VyY2VJZCk7CiAgICAgICAgICAgICBjaGlsZC5zZXRUZXh0KGl0ZW0udGV4dCk7CiAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmdldFRyaW1tZWRMZW5ndGgoaXRlbS50ZXh0KSA+IDApIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBNdXN0IGNoZWNrZWQgdHJpbW1lZCBsZW5ndGggYmVjYXVzZSBpbnB1dCBmaWVsZHMgdXNlIDggZW1wdHkgc3BhY2VzIHRvCisgICAgICAgICAgICAgICAgLy8gc2V0IHdpZHRoCiAgICAgICAgICAgICAgICAgY2hpbGQuc2V0QXV0b2ZpbGxWYWx1ZShBdXRvZmlsbFZhbHVlLmZvclRleHQoaXRlbS50ZXh0KSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjaGlsZC5zZXRGb2N1c2VkKGl0ZW0ubGluZS5mb2N1c2VkKTsKQEAgLTI0NCw2ICsyNjEsNzIgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzVmlzaWJsZVRvVXNlckZvckF1dG9maWxsKGludCB2aXJ0dWFsSWQpIHsKKyAgICAgICAgYm9vbGVhbiBjYWxsU3VwZXIgPSB0cnVlOworICAgICAgICBpZiAobVZpc2liaWxpdHlJbnRlZ3JhdGlvbk1vZGUgPT0gbnVsbCkgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiaXNWaXNpYmxlVG9Vc2VyRm9yQXV0b2ZpbGwoKTogbVZpc2liaWxpdHlJbnRlZ3JhdGlvbk1vZGUgbm90IHNldCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2FsbFN1cGVyID0gbVZpc2liaWxpdHlJbnRlZ3JhdGlvbk1vZGUgPT0gVmlzaWJpbGl0eUludGVncmF0aW9uTW9kZS5OT1RJRllfQUZNOworICAgICAgICB9CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNWaXNpYmxlOworICAgICAgICBpZiAoY2FsbFN1cGVyKSB7CisgICAgICAgICAgICBpc1Zpc2libGUgPSBzdXBlci5pc1Zpc2libGVUb1VzZXJGb3JBdXRvZmlsbCh2aXJ0dWFsSWQpOworICAgICAgICAgICAgTG9nLmQoVEFHLCAiaXNWaXNpYmxlVG9Vc2VyRm9yQXV0b2ZpbGwoIiArIHZpcnR1YWxJZCArICIpIHVzaW5nIHN1cGVyOiAiICsgaXNWaXNpYmxlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpbmFsIEl0ZW0gaXRlbSA9IGdldEl0ZW0odmlydHVhbElkKTsKKyAgICAgICAgICAgIGlzVmlzaWJsZSA9IGl0ZW0ubGluZS52aXNpYmxlOworICAgICAgICAgICAgTG9nLmQoVEFHLCAiaXNWaXNpYmxlVG9Vc2VyRm9yQXV0b2ZpbGwoIiArIHZpcnR1YWxJZCArICIpIHNldCBieSB0ZXN0OiAiICsgaXNWaXNpYmxlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaXNWaXNpYmxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVtdWxhdGVzIGNsaWNraW5nIHRoZSBsb2dpbiBidXR0b24uCisgICAgICovCisgICAgdm9pZCBjbGlja0xvZ2luKCkgeworICAgICAgICBMb2cuZChUQUcsICJjbGlja0xvZ2luKCkiKTsKKyAgICAgICAgaWYgKG1Db21wYXRNb2RlKSB7CisgICAgICAgICAgICBzZW5kQWNjZXNzaWJpbGl0eUV2ZW50KEFjY2Vzc2liaWxpdHlFdmVudC5UWVBFX1ZJRVdfQ0xJQ0tFRCwgTE9HSU5fQlVUVE9OX1ZJUlRVQUxfSUQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUFmbS5ub3RpZnlWaWV3Q2xpY2tlZCh0aGlzLCBMT0dJTl9CVVRUT05fVklSVFVBTF9JRCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIEl0ZW0gZ2V0SXRlbShpbnQgaWQpIHsKKyAgICAgICAgZmluYWwgSXRlbSBpdGVtID0gbUl0ZW1zLmdldChpZCk7CisgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJObyBpdGVtIGZvciBpZCAlcyIsIGlkKS50aGF0KGl0ZW0pLmlzTm90TnVsbCgpOworICAgICAgICByZXR1cm4gaXRlbTsKKyAgICB9CisKKyAgICBwcml2YXRlIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBvblByb3ZpZGVBdXRvZmlsbENvbXBhdE1vZGVBY2Nlc3NpYmlsaXR5Tm9kZUluZm8oKSB7CisgICAgICAgIGZpbmFsIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBub2RlID0gQWNjZXNzaWJpbGl0eU5vZGVJbmZvLm9idGFpbigpOworCisgICAgICAgIGZpbmFsIFN0cmluZyBwYWNrYWdlTmFtZSA9IGdldENvbnRleHQoKS5nZXRQYWNrYWdlTmFtZSgpOworICAgICAgICBub2RlLnNldFBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lKTsKKyAgICAgICAgbm9kZS5zZXRDbGFzc05hbWUoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworCisgICAgICAgIGZpbmFsIGludCBjaGlsZHJlblNpemUgPSBtSXRlbXMuc2l6ZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuU2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBJdGVtIGl0ZW0gPSBtSXRlbXMudmFsdWVBdChpKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBpZCA9IGkgKyAxOworICAgICAgICAgICAgTG9nLmQoVEFHLCAiQWRkaW5nIG5ldyBBMTFZIGNoaWxkIHdpdGggaWQgIiArIGlkICsgIjogIiArIGl0ZW0pOworCisgICAgICAgICAgICBub2RlLmFkZENoaWxkKHRoaXMsIGlkKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBub2RlOworICAgIH0KKworICAgIHByaXZhdGUgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIG9uUHJvdmlkZUF1dG9maWxsQ29tcGF0TW9kZUFjY2Vzc2liaWxpdHlOb2RlSW5mb0ZvckxvZ2luQnV0dG9uKCkgeworICAgICAgICBmaW5hbCBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gbm9kZSA9IEFjY2Vzc2liaWxpdHlOb2RlSW5mby5vYnRhaW4oKTsKKyAgICAgICAgbm9kZS5zZXRTb3VyY2UodGhpcywgTE9HSU5fQlVUVE9OX1ZJUlRVQUxfSUQpOworICAgICAgICBub2RlLnNldFBhY2thZ2VOYW1lKGdldENvbnRleHQoKS5nZXRQYWNrYWdlTmFtZSgpKTsKKyAgICAgICAgLy8gVE9ETyhiLzM3NTY2NjI3KTogaWRlYWxseSB0aGlzIGJ1dHRvbiBzaG91bGQgYmUgdmlzaWJsZSAvIGRyYXduIGluIHRoZSBjYW52YXMgYW5kIGNvbnRhaW4KKyAgICAgICAgLy8gbW9yZSBwcm9wZXJ0aWVzIGxpa2UgYm91bmRhcmllcywgY2xhc3MgbmFtZSwgdGV4dCBldGMuLi4KKyAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgfQorCiAgICAgc3RhdGljIHZvaWQgYXNzZXJ0SHRtbEluZm8oVmlld05vZGUgbm9kZSkgewogICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IG5vZGUuZ2V0VGV4dCgpLnRvU3RyaW5nKCk7CiAgICAgICAgIGZpbmFsIEh0bWxJbmZvIGluZm8gPSBub2RlLmdldEh0bWxJbmZvKCk7CkBAIC0yNTYsOCArMzM5LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQYWlyPD4oImExIiwgInYyIikpOwogICAgIH0KIAotICAgIExpbmUgYWRkTGluZShTdHJpbmcgbGFiZWxJZCwgU3RyaW5nIGxhYmVsLCBTdHJpbmcgdGV4dElkLCBTdHJpbmcgdGV4dCkgewotICAgICAgICBmaW5hbCBMaW5lIGxpbmUgPSBuZXcgTGluZShsYWJlbElkLCBsYWJlbCwgdGV4dElkLCB0ZXh0KTsKKyAgICBMaW5lIGFkZExpbmUoU3RyaW5nIGxhYmVsSWQsIFN0cmluZyBsYWJlbCwgU3RyaW5nIHRleHRJZCwgU3RyaW5nIHRleHQsIGludCBpbnB1dFR5cGUpIHsKKyAgICAgICAgZmluYWwgTGluZSBsaW5lID0gbmV3IExpbmUobGFiZWxJZCwgbGFiZWwsIHRleHRJZCwgdGV4dCwgaW5wdXRUeXBlKTsKICAgICAgICAgTG9nLmQoVEFHLCAiYWRkTGluZTogIiArIGxpbmUpOwogICAgICAgICBtTGluZXMuYWRkKGxpbmUpOwogICAgICAgICBtSXRlbXMucHV0KGxpbmUubGFiZWwuaWQsIGxpbmUubGFiZWwpOwpAQCAtMjY5LDE1ICszNTIsNjQgQEAKICAgICAgICAgbVN5bmMgPSBzeW5jOwogICAgIH0KIAotICAgIHZvaWQgZmFrZVBhY2thZ2VOYW1lKENvbXBvbmVudE5hbWUgbmFtZSkgewotICAgICAgICBtRmFrZWRDb21wb25lbnROYW1lID0gbmFtZTsKKyAgICB2b2lkIHNldENvbXBhdE1vZGUoYm9vbGVhbiBjb21wYXRNb2RlKSB7CisgICAgICAgIG1Db21wYXRNb2RlID0gY29tcGF0TW9kZTsKKworICAgICAgICBpZiAobUNvbXBhdE1vZGUpIHsKKyAgICAgICAgICAgIHNldEltcG9ydGFudEZvckFjY2Vzc2liaWxpdHkoVmlldy5JTVBPUlRBTlRfRk9SX0FDQ0VTU0lCSUxJVFlfWUVTKTsKKyAgICAgICAgICAgIG1BY2Nlc3NpYmlsaXR5Tm9kZVByb3ZpZGVyID0gbmV3IEFjY2Vzc2liaWxpdHlOb2RlUHJvdmlkZXIoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBjcmVhdGVBY2Nlc3NpYmlsaXR5Tm9kZUluZm8oaW50IHZpcnR1YWxWaWV3SWQpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiY3JlYXRlQWNjZXNzaWJpbGl0eU5vZGVJbmZvKCk6IGlkPSIgKyB2aXJ0dWFsVmlld0lkKTsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh2aXJ0dWFsVmlld0lkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFjY2Vzc2liaWxpdHlOb2RlUHJvdmlkZXIuSE9TVF9WSUVXX0lEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvblByb3ZpZGVBdXRvZmlsbENvbXBhdE1vZGVBY2Nlc3NpYmlsaXR5Tm9kZUluZm8oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTE9HSU5fQlVUVE9OX1ZJUlRVQUxfSUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9uUHJvdmlkZUF1dG9maWxsQ29tcGF0TW9kZUFjY2Vzc2liaWxpdHlOb2RlSW5mb0ZvckxvZ2luQnV0dG9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEl0ZW0gaXRlbSA9IGdldEl0ZW0odmlydHVhbFZpZXdJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0ucHJvdmlkZUFjY2Vzc2liaWxpdHlOb2RlSW5mbyhWaXJ0dWFsQ29udGFpbmVyVmlldy50aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1BY3Rpb24oaW50IHZpcnR1YWxWaWV3SWQsIGludCBhY3Rpb24sIEJ1bmRsZSBhcmd1bWVudHMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8uQUNUSU9OX1NFVF9URVhUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDaGFyU2VxdWVuY2UgdGV4dCA9IGFyZ3VtZW50cy5nZXRDaGFyU2VxdWVuY2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlOb2RlSW5mby5BQ1RJT05fQVJHVU1FTlRfU0VUX1RFWFRfQ0hBUlNFUVVFTkNFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEl0ZW0gaXRlbSA9IGdldEl0ZW0odmlydHVhbFZpZXdJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmF1dG9maWxsKHRleHQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIG1BY2Nlc3NpYmlsaXR5RGVsZWdhdGUgPSBuZXcgQWNjZXNzaWJpbGl0eURlbGVnYXRlKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBBY2Nlc3NpYmlsaXR5Tm9kZVByb3ZpZGVyIGdldEFjY2Vzc2liaWxpdHlOb2RlUHJvdmlkZXIoVmlldyBob3N0KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtQWNjZXNzaWJpbGl0eU5vZGVQcm92aWRlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBzZXRBY2Nlc3NpYmlsaXR5RGVsZWdhdGUobUFjY2Vzc2liaWxpdHlEZWxlZ2F0ZSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICB2b2lkIHNldE92ZXJyaWRlRGlzcGF0Y2hQcm92aWRlQXV0b2ZpbGxTdHJ1Y3R1cmUoYm9vbGVhbiBmbGFnKSB7CiAgICAgICAgIG1PdmVycmlkZURpc3BhdGNoUHJvdmlkZUF1dG9maWxsU3RydWN0dXJlID0gZmxhZzsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgbmV4dElkOworICAgIHByaXZhdGUgdm9pZCBzZW5kQWNjZXNzaWJpbGl0eUV2ZW50KGludCBldmVudFR5cGUsIGludCB2aXJ0dWFsSWQpIHsKKyAgICAgICAgZmluYWwgQWNjZXNzaWJpbGl0eUV2ZW50IGV2ZW50ID0gQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbigpOworICAgICAgICBldmVudC5zZXRFdmVudFR5cGUoZXZlbnRUeXBlKTsKKyAgICAgICAgZXZlbnQuc2V0U291cmNlKFZpcnR1YWxDb250YWluZXJWaWV3LnRoaXMsIHZpcnR1YWxJZCk7CisgICAgICAgIGV2ZW50LnNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgIGV2ZW50LnNldFBhY2thZ2VOYW1lKGdldENvbnRleHQoKS5nZXRQYWNrYWdlTmFtZSgpKTsKKyAgICAgICAgTG9nLnYoVEFHLCAic2VuZEFjY2Vzc2liaWxpdHlFdmVudCgiICsgZXZlbnRUeXBlICsgIiwgIiArIHZpcnR1YWxJZCArICIpOiAiICsgZXZlbnQpOworICAgICAgICBnZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShBY2Nlc3NpYmlsaXR5TWFuYWdlci5jbGFzcykuc2VuZEFjY2Vzc2liaWxpdHlFdmVudChldmVudCk7CisgICAgfQogCiAgICAgZmluYWwgY2xhc3MgTGluZSB7CiAKQEAgLTI4NSwxOSArNDE3LDMzIEBACiAgICAgICAgIGZpbmFsIEl0ZW0gdGV4dDsKICAgICAgICAgLy8gQm91bmRhcmllcyBvZiB0aGUgdGV4dCBmaWVsZCwgcmVsYXRpdmUgdG8gdGhlIEN1c3RvbVZpZXcKICAgICAgICAgZmluYWwgUmVjdCBib3VuZHMgPSBuZXcgUmVjdCgpOworICAgICAgICAvLyBCb3VuZGFyaWVzIG9mIHRoZSB0ZXh0IGZpZWxkLCByZWxhdGl2ZSB0byB0aGUgc2NyZWVuCisgICAgICAgIFJlY3QgYWJzQm91bmRzOwogCiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBmb2N1c2VkOwogICAgICAgICBwcml2YXRlIGJvb2xlYW4gdmlzaWJsZSA9IHRydWU7CisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IGlucHV0VHlwZTsKIAotICAgICAgICBwcml2YXRlIExpbmUoU3RyaW5nIGxhYmVsSWQsIFN0cmluZyBsYWJlbCwgU3RyaW5nIHRleHRJZCwgU3RyaW5nIHRleHQpIHsKLSAgICAgICAgICAgIHRoaXMubGFiZWwgPSBuZXcgSXRlbSh0aGlzLCArK25leHRJZCwgbGFiZWxJZCwgbGFiZWwsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgICAgICB0aGlzLnRleHQgPSBuZXcgSXRlbSh0aGlzLCArK25leHRJZCwgdGV4dElkLCB0ZXh0LCB0cnVlLCB0cnVlKTsKKyAgICAgICAgcHJpdmF0ZSBMaW5lKFN0cmluZyBsYWJlbElkLCBTdHJpbmcgbGFiZWwsIFN0cmluZyB0ZXh0SWQsIFN0cmluZyB0ZXh0LCBpbnQgaW5wdXRUeXBlKSB7CisgICAgICAgICAgICB0aGlzLmxhYmVsID0gbmV3IEl0ZW0odGhpcywgKyttTmV4dENoaWxkSWQsIGxhYmVsSWQsIGxhYmVsLCBmYWxzZSwgZmFsc2UpOworICAgICAgICAgICAgdGhpcy50ZXh0ID0gbmV3IEl0ZW0odGhpcywgKyttTmV4dENoaWxkSWQsIHRleHRJZCwgdGV4dCwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgICAgICB0aGlzLmlucHV0VHlwZSA9IGlucHV0VHlwZTsKICAgICAgICAgfQogCiAgICAgICAgIHZvaWQgY2hhbmdlRm9jdXMoYm9vbGVhbiBmb2N1c2VkKSB7CiAgICAgICAgICAgICB0aGlzLmZvY3VzZWQgPSBmb2N1c2VkOworCiAgICAgICAgICAgICBpZiAoZm9jdXNlZCkgewotICAgICAgICAgICAgICAgIGZpbmFsIFJlY3QgYWJzQm91bmRzID0gZ2V0QWJzQ29vcmRpbmF0ZXMoKTsKKyAgICAgICAgICAgICAgICBhYnNCb3VuZHMgPSBnZXRBYnNDb29yZGluYXRlcygpOworICAgICAgICAgICAgICAgIExvZy52KFRBRywgIlNldHRpbmcgYWJzQm91bmRzIGZvciAiICsgdGV4dC5pZCArICIgb24gZm9jdXMgY2hhbmdlOiAiICsgYWJzQm91bmRzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1Db21wYXRNb2RlKSB7CisgICAgICAgICAgICAgICAgc2VuZEFjY2Vzc2liaWxpdHlFdmVudChBY2Nlc3NpYmlsaXR5RXZlbnQuVFlQRV9WSUVXX0ZPQ1VTRUQsIHRleHQuaWQpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvY3VzZWQpIHsKICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJmb2N1cyBnYWluZWQgb24gIiArIHRleHQuaWQgKyAiOyBhYnNCb3VuZHM9IiArIGFic0JvdW5kcyk7CiAgICAgICAgICAgICAgICAgbUFmbS5ub3RpZnlWaWV3RW50ZXJlZChWaXJ0dWFsQ29udGFpbmVyVmlldy50aGlzLCB0ZXh0LmlkLCBhYnNCb3VuZHMpOwogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTMwNiwxMyArNDUyLDIzIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICB2b2lkIHNldFZpc2liaWxpdHlJbnRlZ3JhdGlvbk1vZGUoVmlzaWJpbGl0eUludGVncmF0aW9uTW9kZSBtb2RlKSB7CisgICAgICAgICAgICBtVmlzaWJpbGl0eUludGVncmF0aW9uTW9kZSA9IG1vZGU7CisgICAgICAgIH0KKwogICAgICAgICB2b2lkIGNoYW5nZVZpc2liaWxpdHkoYm9vbGVhbiB2aXNpYmxlKSB7CisgICAgICAgICAgICBpZiAobVZpc2liaWxpdHlJbnRlZ3JhdGlvbk1vZGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm11c3QgY2FsbCBzZXRWaXNpYmlsaXR5SW50ZWdyYXRpb25Nb2RlKCkgZmlyc3QiKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICh0aGlzLnZpc2libGUgPT0gdmlzaWJsZSkgewogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRoaXMudmlzaWJsZSA9IHZpc2libGU7Ci0gICAgICAgICAgICBtQWZtLm5vdGlmeVZpZXdWaXNpYmlsaXR5Q2hhbmdlZChWaXJ0dWFsQ29udGFpbmVyVmlldy50aGlzLCB0ZXh0LmlkLCB2aXNpYmxlKTsKLSAgICAgICAgICAgIExvZy5kKFRBRywgInZpc2liaWxpdHkgY2hhbmdlZCB2aWV3OiAiICsgdGV4dC5pZCArICI7IHZpc2libGU6IiArIHZpc2libGUpOworICAgICAgICAgICAgTG9nLmQoVEFHLCAidmlzaWJpbGl0eSBjaGFuZ2VkIHZpZXc6ICIgKyB0ZXh0LmlkICsgIjsgdmlzaWJsZToiICsgdmlzaWJsZQorICAgICAgICAgICAgICAgICAgICArICI7IGludGVncmF0aW9uTW9kZTogIiArIG1WaXNpYmlsaXR5SW50ZWdyYXRpb25Nb2RlKTsKKyAgICAgICAgICAgIGlmIChtVmlzaWJpbGl0eUludGVncmF0aW9uTW9kZSA9PSBWaXNpYmlsaXR5SW50ZWdyYXRpb25Nb2RlLk5PVElGWV9BRk0pIHsKKyAgICAgICAgICAgICAgICBtQWZtLm5vdGlmeVZpZXdWaXNpYmlsaXR5Q2hhbmdlZChWaXJ0dWFsQ29udGFpbmVyVmlldy50aGlzLCB0ZXh0LmlkLCB2aXNpYmxlKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKICAgICAgICAgfQogCkBAIC0zMzIsOSArNDg4LDEzIEBACiAgICAgICAgICAgICB0ZXh0LnRleHQgPSB2YWx1ZTsKICAgICAgICAgICAgIGZpbmFsIEF1dG9maWxsTWFuYWdlciBhdXRvZmlsbE1hbmFnZXIgPQogICAgICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShBdXRvZmlsbE1hbmFnZXIuY2xhc3MpOwotICAgICAgICAgICAgaWYgKGF1dG9maWxsTWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYXV0b2ZpbGxNYW5hZ2VyLm5vdGlmeVZhbHVlQ2hhbmdlZChWaXJ0dWFsQ29udGFpbmVyVmlldy50aGlzLCB0ZXh0LmlkLAotICAgICAgICAgICAgICAgICAgICAgICAgQXV0b2ZpbGxWYWx1ZS5mb3JUZXh0KHRleHQudGV4dCkpOworICAgICAgICAgICAgaWYgKG1Db21wYXRNb2RlKSB7CisgICAgICAgICAgICAgICAgc2VuZEFjY2Vzc2liaWxpdHlFdmVudChBY2Nlc3NpYmlsaXR5RXZlbnQuVFlQRV9WSUVXX1RFWFRfQ0hBTkdFRCwgdGV4dC5pZCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChhdXRvZmlsbE1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBhdXRvZmlsbE1hbmFnZXIubm90aWZ5VmFsdWVDaGFuZ2VkKFZpcnR1YWxDb250YWluZXJWaWV3LnRoaXMsIHRleHQuaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0b2ZpbGxWYWx1ZS5mb3JUZXh0KHRleHQudGV4dCkpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKICAgICAgICAgfQpAQCAtMzcyLDggKzUzMiw4IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHZvaWQgYXNzZXJ0QXV0b0ZpbGxlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gc2V0ID0gbGF0Y2guYXdhaXQoRklMTF9USU1FT1VUX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOwotICAgICAgICAgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJUaW1lb3V0ICglcyBtcykgb24gTGluZSAlcyIsIEZJTExfVElNRU9VVF9NUywgbGFiZWwpCisgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBzZXQgPSBsYXRjaC5hd2FpdChGSUxMX1RJTUVPVVQubXMoKSwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiVGltZW91dCAoJXMgbXMpIG9uIExpbmUgJXMiLCBGSUxMX1RJTUVPVVQubXMoKSwgbGFiZWwpCiAgICAgICAgICAgICAgICAgICAgICAgICAudGhhdChzZXQpLmlzVHJ1ZSgpOwogICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBhY3R1YWwgPSB0ZXh0LnRleHQudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiV3JvbmcgYXV0by1maWxsIHZhbHVlIG9uIExpbmUgJXMiLCBsYWJlbCkKQEAgLTM4OSw2ICs1NDksNyBAQAogICAgICAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSB0ZXh0OwogICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gZWRpdGFibGU7CiAgICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBzZW5zaXRpdmU7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGNsYXNzTmFtZTsKICAgICAgICAgcHJpdmF0ZSBUZXh0V2F0Y2hlciBsaXN0ZW5lcjsKIAogICAgICAgICBJdGVtKExpbmUgbGluZSwgaW50IGlkLCBTdHJpbmcgcmVzb3VyY2VJZCwgQ2hhclNlcXVlbmNlIHRleHQsIGJvb2xlYW4gZWRpdGFibGUsCkBAIC0zOTksNiArNTYwLDM5IEBACiAgICAgICAgICAgICB0aGlzLnRleHQgPSB0ZXh0OwogICAgICAgICAgICAgdGhpcy5lZGl0YWJsZSA9IGVkaXRhYmxlOwogICAgICAgICAgICAgdGhpcy5zZW5zaXRpdmUgPSBzZW5zaXRpdmU7CisgICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IGVkaXRhYmxlID8gVEVYVF9DTEFTUyA6IExBQkVMX0NMQVNTOworICAgICAgICB9CisKKyAgICAgICAgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIHByb3ZpZGVBY2Nlc3NpYmlsaXR5Tm9kZUluZm8oVmlldyBwYXJlbnQsIENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgZmluYWwgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIG5vZGUgPSBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8ub2J0YWluKCk7CisgICAgICAgICAgICBub2RlLnNldFNvdXJjZShwYXJlbnQsIGlkKTsKKyAgICAgICAgICAgIG5vZGUuc2V0UGFja2FnZU5hbWUoY29udGV4dC5nZXRQYWNrYWdlTmFtZSgpKTsKKyAgICAgICAgICAgIG5vZGUuc2V0Q2xhc3NOYW1lKGNsYXNzTmFtZSk7CisgICAgICAgICAgICBub2RlLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKKyAgICAgICAgICAgIG5vZGUuc2V0Vmlld0lkUmVzb3VyY2VOYW1lKHJlc291cmNlSWQpOworICAgICAgICAgICAgbm9kZS5zZXRWaXNpYmxlVG9Vc2VyKHRydWUpOworICAgICAgICAgICAgbm9kZS5zZXRJbnB1dFR5cGUobGluZS5pbnB1dFR5cGUpOworICAgICAgICAgICAgaWYgKGxpbmUuYWJzQm91bmRzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBub2RlLnNldEJvdW5kc0luU2NyZWVuKGxpbmUuYWJzQm91bmRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuZ2V0VHJpbW1lZExlbmd0aCh0ZXh0KSA+IDApIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBNdXN0IGNoZWNrZWQgdHJpbW1lZCBsZW5ndGggYmVjYXVzZSBpbnB1dCBmaWVsZHMgdXNlIDggZW1wdHkgc3BhY2VzIHRvCisgICAgICAgICAgICAgICAgLy8gc2V0IHdpZHRoCisgICAgICAgICAgICAgICAgbm9kZS5zZXRUZXh0KHRleHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgYXV0b2ZpbGwoQ2hhclNlcXVlbmNlIHZhbHVlKSB7CisgICAgICAgICAgICBpZiAoIWVkaXRhYmxlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiSXRlbSBmb3IgaWQgIiArIGlkICsgIiBpcyBub3QgZWRpdGFibGU6ICIgKyB0aGlzKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0ZXh0ID0gdmFsdWU7CisgICAgICAgICAgICBpZiAobGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIk5vdGlmeSBsaXN0ZW5lcjogIiArIHRleHQpOworICAgICAgICAgICAgICAgIGxpc3RlbmVyLm9uVGV4dENoYW5nZWQodGV4dCwgMCwgMCwgMCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL1Zpc2l0b3IuamF2YSBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL1Zpc2l0b3IuamF2YQppbmRleCA5NmVlMzcwLi5hOGUwMzE0IDEwMDY0NAotLS0gYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9WaXNpdG9yLmphdmEKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvVmlzaXRvci5qYXZhCkBAIC0yOCw3ICsyOCw3IEBACiAgKiB9CiAgKiA8L2NvZGU+PC9wcmU+CiAgKi8KLWludGVyZmFjZSBWaXNpdG9yPFQ+eworaW50ZXJmYWNlIFZpc2l0b3I8VD4gewogCiAgICAgdm9pZCB2aXNpdChUIHZpZXcpOwogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL1dlYlZpZXdBY3Rpdml0eS5qYXZhIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvV2ViVmlld0FjdGl2aXR5LmphdmEKaW5kZXggMmVmNTE0MS4uZTUxYmJmYyAxMDA2NDQKLS0tIGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvV2ViVmlld0FjdGl2aXR5LmphdmEKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvV2ViVmlld0FjdGl2aXR5LmphdmEKQEAgLTE1LDE2ICsxNSwyNyBAQAogICovCiBwYWNrYWdlIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0czsKIAoraW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuVGltZW91dHMuV0VCVklFV19USU1FT1VUOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLnRydXRoLlRydXRoLmFzc2VydFRoYXQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwogaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLlVpT2JqZWN0MjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJSZXNvdXJjZVJlcXVlc3Q7CiBpbXBvcnQgYW5kcm9pZC53ZWJraXQuV2ViUmVzb3VyY2VSZXNwb25zZTsKIGltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJWaWV3OwogaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXdDbGllbnQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuRWRpdFRleHQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKIAogcHVibGljIGNsYXNzIFdlYlZpZXdBY3Rpdml0eSBleHRlbmRzIEFic3RyYWN0QXV0b0ZpbGxBY3Rpdml0eSB7CiAKQEAgLTMzLDY5ICs0NCwxMjQgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFLRV9VUkwgPSAiaHR0cHM6Ly8iICsgRkFLRV9ET01BSU4gKyAiOjY2Ni9sb2dpbi5odG1sIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIElEX1dFQlZJRVcgPSAid2VidmlldyI7CiAKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUxfTkFNRV9VU0VSTkFNRSA9ICJ1c2VybmFtZSI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX05BTUVfUEFTU1dPUkQgPSAicGFzc3dvcmQiOworCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9PVVRTSURFMSA9ICJvdXRzaWRlMSI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9PVVRTSURFMiA9ICJvdXRzaWRlMiI7CisKICAgICBNeVdlYlZpZXcgbVdlYlZpZXc7CiAKKyAgICBwcml2YXRlIExpbmVhckxheW91dCBtUGFyZW50OworICAgIHByaXZhdGUgTGluZWFyTGF5b3V0IG1PdXRzaWRlQ29udGFpbmVyMTsKKyAgICBwcml2YXRlIExpbmVhckxheW91dCBtT3V0c2lkZUNvbnRhaW5lcjI7CisgICAgRWRpdFRleHQgbU91dHNpZGUxOworICAgIEVkaXRUZXh0IG1PdXRzaWRlMjsKKwogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKIAogICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC53ZWJ2aWV3X2FjdGl2aXR5KTsKIAotICAgICAgICBtV2ViVmlldyA9IGZpbmRWaWV3QnlJZChSLmlkLndlYnZpZXcpOwotICAgICAgICBtV2ViVmlldy5zZXRXZWJWaWV3Q2xpZW50KG5ldyBXZWJWaWV3Q2xpZW50KCkgewotICAgICAgICAgICAgLy8gV2ViVmlldyBkb2VzIG5vdCBzZXQgdGhlIFdlYkRvbWFpbiBvbiBmaWxlOi8vIHJlcXVlc3RzLCBzbyB3ZSBuZWVkIHRvIHVzZSBhbiBodHRwczovLwotICAgICAgICAgICAgLy8gcmVxdWVzdCBhbmQgaW50ZXJjZXB0IGl0IHRvIHByb3ZpZGUgdGhlIHJlYWwgZGF0YS4KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIFdlYlJlc291cmNlUmVzcG9uc2Ugc2hvdWxkSW50ZXJjZXB0UmVxdWVzdChXZWJWaWV3IHZpZXcsCi0gICAgICAgICAgICAgICAgICAgIFdlYlJlc291cmNlUmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHVybCA9IHJlcXVlc3QuZ2V0VXJsKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBpZiAoIXVybC5lcXVhbHMoRkFLRV9VUkwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIklnbm9yaW5nICIgKyB1cmwpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuc2hvdWxkSW50ZXJjZXB0UmVxdWVzdCh2aWV3LCByZXF1ZXN0KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmF3UGF0aCA9IHJlcXVlc3QuZ2V0VXJsKCkuZ2V0UGF0aCgpLnN1YnN0cmluZygxKTsgLy8gUmVtb3ZlIGxlYWRpbmcgLwotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkNvbnZlcnRpbmcgIiArIHVybCArICIgdG8gIiArIHJhd1BhdGgpOwotICAgICAgICAgICAgICAgIC8vIE5PVEU6IGNhbm5vdCB1c2UgdHJ5KCkgYmVjYXVzZSBpdCB3b3VsZCBjbG9zZSB0aGUgc3RyZWFtIGJlZm9yZSBXZWJWaWV3IHVzZXMgaXQuCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBXZWJSZXNvdXJjZVJlc3BvbnNlKCJ0ZXh0L2h0bWwiLCAidXRmLTgiLCBnZXRBc3NldHMoKS5vcGVuKHJhd1BhdGgpKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkVycm9yIG9wZW5pbmcgIiArIHJhd1BhdGgsIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIG1XZWJWaWV3LmxvYWRVcmwoRkFLRV9VUkwpOworICAgICAgICBtUGFyZW50ID0gZmluZFZpZXdCeUlkKFIuaWQucGFyZW50KTsKKyAgICAgICAgbU91dHNpZGVDb250YWluZXIxID0gZmluZFZpZXdCeUlkKFIuaWQub3V0c2lkZUNvbnRhaW5lcjEpOworICAgICAgICBtT3V0c2lkZUNvbnRhaW5lcjIgPSBmaW5kVmlld0J5SWQoUi5pZC5vdXRzaWRlQ29udGFpbmVyMik7CisgICAgICAgIG1PdXRzaWRlMSA9IGZpbmRWaWV3QnlJZChSLmlkLm91dHNpZGUxKTsKKyAgICAgICAgbU91dHNpZGUyID0gZmluZFZpZXdCeUlkKFIuaWQub3V0c2lkZTIpOwogICAgIH0KIAotICAgIHB1YmxpYyBVaU9iamVjdDIgZ2V0VXNlcm5hbWVMYWJlbChVaUJvdCB1aUJvdCkgeworICAgIHB1YmxpYyBNeVdlYlZpZXcgbG9hZFdlYlZpZXcoVWlCb3QgdWlCb3QpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbG9hZFdlYlZpZXcodWlCb3QsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTXlXZWJWaWV3IGxvYWRXZWJWaWV3KFVpQm90IHVpQm90LCBib29sZWFuIHVzaW5nQXBwQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworICAgICAgICBzeW5jUnVuT25VaVRocmVhZCgoKSAtPiB7CisgICAgICAgICAgICBmaW5hbCBDb250ZXh0IGNvbnRleHQgPSB1c2luZ0FwcENvbnRleHQgPyBnZXRBcHBsaWNhdGlvbkNvbnRleHQoKSA6IHRoaXM7CisgICAgICAgICAgICBtV2ViVmlldyA9IG5ldyBNeVdlYlZpZXcoY29udGV4dCk7CisgICAgICAgICAgICBtUGFyZW50LmFkZFZpZXcobVdlYlZpZXcpOworICAgICAgICAgICAgbVdlYlZpZXcuc2V0V2ViVmlld0NsaWVudChuZXcgV2ViVmlld0NsaWVudCgpIHsKKyAgICAgICAgICAgICAgICAvLyBXZWJWaWV3IGRvZXMgbm90IHNldCB0aGUgV2ViRG9tYWluIG9uIGZpbGU6Ly8gcmVxdWVzdHMsIHNvIHdlIG5lZWQgdG8gdXNlIGFuCisgICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly8gcmVxdWVzdCBhbmQgaW50ZXJjZXB0IGl0IHRvIHByb3ZpZGUgdGhlIHJlYWwgZGF0YS4KKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgV2ViUmVzb3VyY2VSZXNwb25zZSBzaG91bGRJbnRlcmNlcHRSZXF1ZXN0KFdlYlZpZXcgdmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgIFdlYlJlc291cmNlUmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB1cmwgPSByZXF1ZXN0LmdldFVybCgpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghdXJsLmVxdWFscyhGQUtFX1VSTCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIklnbm9yaW5nICIgKyB1cmwpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnNob3VsZEludGVyY2VwdFJlcXVlc3QodmlldywgcmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmF3UGF0aCA9IHJlcXVlc3QuZ2V0VXJsKCkuZ2V0UGF0aCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN1YnN0cmluZygxKTsgLy8gUmVtb3ZlIGxlYWRpbmcgLworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJDb252ZXJ0aW5nICIgKyB1cmwgKyAiIHRvICIgKyByYXdQYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gTk9URTogY2Fubm90IHVzZSB0cnktd2l0aC1yZXNvdXJjZXMgYmVjYXVzZSBpdCB3b3VsZCBjbG9zZSB0aGUgc3RyZWFtIGJlZm9yZQorICAgICAgICAgICAgICAgICAgICAvLyBXZWJWaWV3IHVzZXMgaXQuCisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFdlYlJlc291cmNlUmVzcG9uc2UoInRleHQvaHRtbCIsICJ1dGYtOCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEFzc2V0cygpLm9wZW4ocmF3UGF0aCkpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJFcnJvciBvcGVuaW5nICIgKyByYXdQYXRoLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUGFnZUZpbmlzaGVkKFdlYlZpZXcgdmlldywgU3RyaW5nIHVybCkgeworICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJvblBhZ2VGaW5pc2hlZCgpOiAiICsgdXJsKTsKKyAgICAgICAgICAgICAgICAgICAgbGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIG1XZWJWaWV3LmxvYWRVcmwoRkFLRV9VUkwpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChtV2ViVmlldy5pc0F1dG9maWxsRW5hYmxlZCgpKS5pc1RydWUoKTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgLy8gV2FpdCB1bnRpbCBpdCdzIGxvYWRlZC4KKworICAgICAgICBpZiAoIWxhdGNoLmF3YWl0KFdFQlZJRVdfVElNRU9VVC5tcygpLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUmV0cnlhYmxlRXhjZXB0aW9uKFdFQlZJRVdfVElNRU9VVCwgIldlYlZpZXcgbm90IGxvYWRlZCIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETyhiLzgwMzE3NjI4KTogcmUtYWRkIGNoZWNrIGJlbG93CisgICAgICAgIC8vIE5PVEU6IHdlIGNhbm5vdCBzZWFyY2ggYnkgcmVzb3VyY2VJZCBiZWNhdXNlIFdlYlZpZXcgZG9lcyBub3Qgc2V0IHRoZW0uLi4KKyAgICAgICAgLy8gdWlCb3QuYXNzZXJ0U2hvd25CeVRleHQoIkxvZ2luIik7IC8vIExvZ2luIGJ1dHRvbgorCisgICAgICAgIHJldHVybiBtV2ViVmlldzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsb2FkT3V0c2lkZVZpZXdzKCkgeworICAgICAgICBzeW5jUnVuT25VaVRocmVhZCgoKSAtPiB7CisgICAgICAgICAgICBtT3V0c2lkZUNvbnRhaW5lcjEuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgbU91dHNpZGVDb250YWluZXIyLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIFVpT2JqZWN0MiBnZXRVc2VybmFtZUxhYmVsKFVpQm90IHVpQm90KSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIGdldExhYmVsKHVpQm90LCAiVXNlcm5hbWU6ICIpOwogICAgIH0KIAotICAgIHB1YmxpYyBVaU9iamVjdDIgZ2V0UGFzc3dvcmRMYWJlbChVaUJvdCB1aUJvdCkgeworICAgIHB1YmxpYyBVaU9iamVjdDIgZ2V0UGFzc3dvcmRMYWJlbChVaUJvdCB1aUJvdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBnZXRMYWJlbCh1aUJvdCwgIlBhc3N3b3JkOiAiKTsKICAgICB9CiAKLSAgICBwdWJsaWMgVWlPYmplY3QyIGdldFVzZXJuYW1lSW5wdXQoVWlCb3QgdWlCb3QpIHsKKyAgICBwdWJsaWMgVWlPYmplY3QyIGdldFVzZXJuYW1lSW5wdXQoVWlCb3QgdWlCb3QpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICByZXR1cm4gZ2V0SW5wdXQodWlCb3QsICJVc2VybmFtZTogIik7CiAgICAgfQogCi0gICAgcHVibGljIFVpT2JqZWN0MiBnZXRQYXNzd29yZElucHV0KFVpQm90IHVpQm90KSB7CisgICAgcHVibGljIFVpT2JqZWN0MiBnZXRQYXNzd29yZElucHV0KFVpQm90IHVpQm90KSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIGdldElucHV0KHVpQm90LCAiUGFzc3dvcmQ6ICIpOwogICAgIH0KIAotICAgIHB1YmxpYyBVaU9iamVjdDIgZ2V0TG9naW5CdXR0b24oVWlCb3QgdWlCb3QpIHsKKyAgICBwdWJsaWMgVWlPYmplY3QyIGdldExvZ2luQnV0dG9uKFVpQm90IHVpQm90KSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIGdldExhYmVsKHVpQm90LCAiTG9naW4iKTsKICAgICB9CiAKLSAgICBwcml2YXRlIFVpT2JqZWN0MiBnZXRMYWJlbChVaUJvdCB1aUJvdCwgU3RyaW5nIGxhYmVsKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gdWlCb3QuYXNzZXJ0U2hvd25CeUNvbnRlbnREZXNjcmlwdGlvbihsYWJlbCk7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICByZXR1cm4gdWlCb3QuYXNzZXJ0U2hvd25CeVRleHQobGFiZWwpOwotICAgICAgICB9CisgICAgcHJpdmF0ZSBVaU9iamVjdDIgZ2V0TGFiZWwoVWlCb3QgdWlCb3QsIFN0cmluZyBsYWJlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiB1aUJvdC5hc3NlcnRTaG93bkJ5VGV4dChsYWJlbCwgVGltZW91dHMuV0VCVklFV19USU1FT1VUKTsKICAgICB9CiAKLSAgICBwcml2YXRlIFVpT2JqZWN0MiBnZXRJbnB1dChVaUJvdCB1aUJvdCwgU3RyaW5nIGNvbnRlbnREZXNjcmlwdGlvbikgeworICAgIHByaXZhdGUgVWlPYmplY3QyIGdldElucHV0KFVpQm90IHVpQm90LCBTdHJpbmcgY29udGVudERlc2NyaXB0aW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gRmlyc3QgZ2V0IHRoZSBsYWJlbC4uCiAgICAgICAgIGZpbmFsIFVpT2JqZWN0MiBsYWJlbCA9IGdldExhYmVsKHVpQm90LCBjb250ZW50RGVzY3JpcHRpb24pOwogCkBAIC0xMDcsMTAgKzE3MywyMyBAQAogICAgICAgICAgICAgICAgIGlmIChjaGlsZC5nZXRDbGFzc05hbWUoKS5lcXVhbHMoRWRpdFRleHQuY2xhc3MuZ2V0TmFtZSgpKSkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGQ7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHVpQm90LmR1bXBTY3JlZW4oImdldElucHV0KCkgZm9yICIgKyBjaGlsZCArICJmYWlsZWQiKTsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJbnZhbGlkIGNsYXNzIGZvciAiICsgY2hpbGQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcHJldmlvdXMgPSBjaGlsZDsKICAgICAgICAgfQorICAgICAgICB1aUJvdC5kdW1wU2NyZWVuKCJnZXRJbnB1dCgpIGZvciBsYWJlbCAiICsgbGFiZWwgKyAiZmFpbGVkIik7CiAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImNvdWxkIG5vdCBmaW5kIHVzZXJuYW1lIChsYWJlbD0iICsgbGFiZWwgKyAiKSIpOwogICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoS2V5UHJlc3MoaW50IGtleUNvZGUpIHsKKyAgICAgICAgcnVuT25VaVRocmVhZCgoKSAtPiB7CisgICAgICAgICAgICBLZXlFdmVudCBrZXlFdmVudCA9IG5ldyBLZXlFdmVudChLZXlFdmVudC5BQ1RJT05fRE9XTiwga2V5Q29kZSk7CisgICAgICAgICAgICBtV2ViVmlldy5kaXNwYXRjaEtleUV2ZW50KGtleUV2ZW50KTsKKyAgICAgICAgICAgIGtleUV2ZW50ID0gbmV3IEtleUV2ZW50KEtleUV2ZW50LkFDVElPTl9VUCwga2V5Q29kZSk7CisgICAgICAgICAgICBtV2ViVmlldy5kaXNwYXRjaEtleUV2ZW50KGtleUV2ZW50KTsKKyAgICAgICAgfSk7CisgICAgICAgIC8vIHdhaXQgd2VidmlldyB0byBwcm9jZXNzIHRoZSBrZXkgZXZlbnQuCisgICAgICAgIFN5c3RlbUNsb2NrLnNsZWVwKDMwMCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvV2ViVmlld0FjdGl2aXR5VGVzdC5qYXZhIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvV2ViVmlld0FjdGl2aXR5VGVzdC5qYXZhCmluZGV4IGNmMmVjZmMuLjFhOWNhNDMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL1dlYlZpZXdBY3Rpdml0eVRlc3QuamF2YQorKysgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9XZWJWaWV3QWN0aXZpdHlUZXN0LmphdmEKQEAgLTE1LDcgKzE1LDEwIEBACiAgKi8KIHBhY2thZ2UgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzOwogCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5IZWxwZXIucnVuU2hlbGxDb21tYW5kOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuV2ViVmlld0FjdGl2aXR5LkhUTUxfTkFNRV9QQVNTV09SRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLldlYlZpZXdBY3Rpdml0eS5IVE1MX05BTUVfVVNFUk5BTUU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5XZWJWaWV3QWN0aXZpdHkuSURfT1VUU0lERTE7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5XZWJWaWV3QWN0aXZpdHkuSURfT1VUU0lERTI7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmljZS5hdXRvZmlsbC5TYXZlSW5mby5TQVZFX0RBVEFfVFlQRV9QQVNTV09SRDsKIAogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi50cnV0aC5UcnV0aC5hc3NlcnRUaGF0OwpAQCAtMjQsMTYgKzI3LDIwIEBACiBpbXBvcnQgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkNhbm5lZEZpbGxSZXNwb25zZS5DYW5uZWREYXRhc2V0OwogaW1wb3J0IGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5JbnN0cnVtZW50ZWRBdXRvRmlsbFNlcnZpY2UuRmlsbFJlcXVlc3Q7CiBpbXBvcnQgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLkluc3RydW1lbnRlZEF1dG9GaWxsU2VydmljZS5TYXZlUmVxdWVzdDsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CiBpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QudWlhdXRvbWF0b3IuVWlPYmplY3QyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3U3RydWN0dXJlLkh0bWxJbmZvOwogCiBpbXBvcnQgb3JnLmp1bml0LkFmdGVyQ2xhc3M7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAorQEFwcE1vZGVGdWxsKHJlYXNvbiA9ICJGbGFreSBpbiBpbnN0YW50IG1vZGUiKQogcHVibGljIGNsYXNzIFdlYlZpZXdBY3Rpdml0eVRlc3QgZXh0ZW5kcyBBdXRvRmlsbFNlcnZpY2VUZXN0Q2FzZSB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIldlYlZpZXdBY3Rpdml0eVRlc3QiOwpAQCAtNjMsNyArNzAsNiBAQAogICAgIEBCZWZvcmUKICAgICBwdWJsaWMgdm9pZCBzZXRBY3Rpdml0eSgpIHsKICAgICAgICAgbUFjdGl2aXR5ID0gbUFjdGl2aXR5UnVsZS5nZXRBY3Rpdml0eSgpOwotICAgICAgICBhc3NlcnRBdXRvZmlsbEVuYWJsZWRPbldlYlZpZXcoKTsKICAgICB9CiAKICAgICBAQmVmb3JlQ2xhc3MKQEAgLTc3LDc5ICs4Myw5MyBAQAogICAgIH0KIAogICAgIEBUZXN0CisgICAgQEFwcE1vZGVGdWxsIC8vIHRlc3RBdXRvZmlsbE9uZURhdGFzZXQoKSBpcyBlbm91Z2ggdG8gdGVzdCBlcGhlbWVyYWwgYXBwcyBzdXBwb3J0CiAgICAgcHVibGljIHZvaWQgdGVzdEF1dG9maWxsTm9EYXRhc2V0cygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBTZXQgc2VydmljZS4KICAgICAgICAgZW5hYmxlU2VydmljZSgpOwogCisgICAgICAgIC8vIExvYWQgV2ViVmlldworICAgICAgICBtQWN0aXZpdHkubG9hZFdlYlZpZXcobVVpQm90KTsKKwogICAgICAgICAvLyBTZXQgZXhwZWN0YXRpb25zLgogICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShDYW5uZWRGaWxsUmVzcG9uc2UuTk9fUkVTUE9OU0UpOwogCiAgICAgICAgIC8vIFRyaWdnZXIgYXV0b2ZpbGwuCi0gICAgICAgIG1BY3Rpdml0eS5nZXRVc2VybmFtZUlucHV0KHNVaUJvdCkuY2xpY2soKTsKKyAgICAgICAgbUFjdGl2aXR5LmdldFVzZXJuYW1lSW5wdXQobVVpQm90KS5jbGljaygpOwogICAgICAgICBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKIAogICAgICAgICAvLyBBc3NlcnQgbm90IHNob3duLgotICAgICAgICBzVWlCb3QuYXNzZXJ0Tm9EYXRhc2V0cygpOworICAgICAgICBtVWlCb3QuYXNzZXJ0Tm9EYXRhc2V0c0V2ZXIoKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvZmlsbE9uZURhdGFzZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXV0b2ZpbGxPbmVEYXRhc2V0VGVzdChmYWxzZSk7CisgICAgfQorCisgICAgQElnbm9yZSgiYmxvY2tlZCBvbiBiLzc0NzkzNDg1IikKKyAgICBAVGVzdAorICAgIEBBcHBNb2RlRnVsbCAvLyB0ZXN0QXV0b2ZpbGxPbmVEYXRhc2V0KCkgaXMgZW5vdWdoIHRvIHRlc3QgZXBoZW1lcmFsIGFwcHMgc3VwcG9ydAorICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvZmlsbE9uZURhdGFzZXRfdXNpbmdBcHBDb250ZXh0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGF1dG9maWxsT25lRGF0YXNldFRlc3QodHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGF1dG9maWxsT25lRGF0YXNldFRlc3QoYm9vbGVhbiB1c2VzQXBwQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFNldCBzZXJ2aWNlLgogICAgICAgICBlbmFibGVTZXJ2aWNlKCk7CiAKKyAgICAgICAgLy8gTG9hZCBXZWJWaWV3CisgICAgICAgIGZpbmFsIE15V2ViVmlldyBteVdlYlZpZXcgPSBtQWN0aXZpdHkubG9hZFdlYlZpZXcobVVpQm90LCB1c2VzQXBwQ29udGV4dCk7CisgICAgICAgIC8vIFNhbml0eSBjaGVjayB0byBtYWtlIHN1cmUgYXV0b2ZpbGwgaXMgZW5hYmxlZCBpbiB0aGUgYXBwbGljYXRpb24gY29udGV4dAorICAgICAgICBIZWxwZXIuYXNzZXJ0QXV0b2ZpbGxFbmFibGVkKG15V2ViVmlldy5nZXRDb250ZXh0KCksIHRydWUpOworCiAgICAgICAgIC8vIFNldCBleHBlY3RhdGlvbnMuCi0gICAgICAgIG1BY3Rpdml0eS5tV2ViVmlldy5leHBlY3RBdXRvZmlsbCgiZHVkZSIsICJzd2VldCIpOworICAgICAgICBteVdlYlZpZXcuZXhwZWN0QXV0b2ZpbGwoImR1ZGUiLCAic3dlZXQiKTsKICAgICAgICAgZmluYWwgTXlBdXRvZmlsbENhbGxiYWNrIGNhbGxiYWNrID0gbUFjdGl2aXR5LnJlZ2lzdGVyQ2FsbGJhY2soKTsKICAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UobmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCi0gICAgICAgICAgICAgICAgLnNldEZpZWxkKCJ1c2VybmFtZSIsICJkdWRlIikKLSAgICAgICAgICAgICAgICAuc2V0RmllbGQoInBhc3N3b3JkIiwgInN3ZWV0IikKKyAgICAgICAgICAgICAgICAuc2V0RmllbGQoSFRNTF9OQU1FX1VTRVJOQU1FLCAiZHVkZSIpCisgICAgICAgICAgICAgICAgLnNldEZpZWxkKEhUTUxfTkFNRV9QQVNTV09SRCwgInN3ZWV0IikKICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uKGNyZWF0ZVByZXNlbnRhdGlvbigiVGhlIER1ZGUiKSkKICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CiAKICAgICAgICAgLy8gVHJpZ2dlciBhdXRvZmlsbC4KLSAgICAgICAgbUFjdGl2aXR5LmdldFVzZXJuYW1lSW5wdXQoc1VpQm90KS5jbGljaygpOworICAgICAgICBtQWN0aXZpdHkuZ2V0VXNlcm5hbWVJbnB1dChtVWlCb3QpLmNsaWNrKCk7CiAgICAgICAgIGZpbmFsIEZpbGxSZXF1ZXN0IGZpbGxSZXF1ZXN0ID0gc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7Ci0gICAgICAgIHNVaUJvdC5hc3NlcnREYXRhc2V0cygiVGhlIER1ZGUiKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJUaGUgRHVkZSIpOwogCiAgICAgICAgIC8vIENoYW5nZSBmb2N1cyBhcm91bmQuCi0gICAgICAgIGZpbmFsIGludCB1c2VybmFtZUNoaWxkSWQgPSBjYWxsYmFjay5hc3NlcnRVaVNob3duRXZlbnRGb3JWaXJ0dWFsQ2hpbGQobUFjdGl2aXR5Lm1XZWJWaWV3KTsKLSAgICAgICAgbUFjdGl2aXR5LmdldFVzZXJuYW1lTGFiZWwoc1VpQm90KS5jbGljaygpOwotICAgICAgICBjYWxsYmFjay5hc3NlcnRVaUhpZGRlbkV2ZW50KG1BY3Rpdml0eS5tV2ViVmlldywgdXNlcm5hbWVDaGlsZElkKTsKLSAgICAgICAgc1VpQm90LmFzc2VydE5vRGF0YXNldHMoKTsKLSAgICAgICAgbUFjdGl2aXR5LmdldFBhc3N3b3JkSW5wdXQoc1VpQm90KS5jbGljaygpOwotICAgICAgICBmaW5hbCBpbnQgcGFzc3dvcmRDaGlsZElkID0gY2FsbGJhY2suYXNzZXJ0VWlTaG93bkV2ZW50Rm9yVmlydHVhbENoaWxkKG1BY3Rpdml0eS5tV2ViVmlldyk7Ci0gICAgICAgIGZpbmFsIFVpT2JqZWN0MiBkYXRhc2V0UGlja2VyID0gc1VpQm90LmFzc2VydERhdGFzZXRzKCJUaGUgRHVkZSIpOworICAgICAgICBmaW5hbCBpbnQgdXNlcm5hbWVDaGlsZElkID0gY2FsbGJhY2suYXNzZXJ0VWlTaG93bkV2ZW50Rm9yVmlydHVhbENoaWxkKG15V2ViVmlldyk7CisgICAgICAgIG1BY3Rpdml0eS5nZXRVc2VybmFtZUxhYmVsKG1VaUJvdCkuY2xpY2soKTsKKyAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlIaWRkZW5FdmVudChteVdlYlZpZXcsIHVzZXJuYW1lQ2hpbGRJZCk7CisgICAgICAgIG1VaUJvdC5hc3NlcnROb0RhdGFzZXRzKCk7CisgICAgICAgIG1BY3Rpdml0eS5nZXRQYXNzd29yZElucHV0KG1VaUJvdCkuY2xpY2soKTsKKyAgICAgICAgZmluYWwgaW50IHBhc3N3b3JkQ2hpbGRJZCA9IGNhbGxiYWNrLmFzc2VydFVpU2hvd25FdmVudEZvclZpcnR1YWxDaGlsZChteVdlYlZpZXcpOworICAgICAgICBmaW5hbCBVaU9iamVjdDIgZGF0YXNldFBpY2tlciA9IG1VaUJvdC5hc3NlcnREYXRhc2V0cygiVGhlIER1ZGUiKTsKIAogICAgICAgICAvLyBOb3cgQXV0b2ZpbGwgaXQuCi0gICAgICAgIHNVaUJvdC5zZWxlY3REYXRhc2V0KGRhdGFzZXRQaWNrZXIsICJUaGUgRHVkZSIpOwotICAgICAgICBtQWN0aXZpdHkubVdlYlZpZXcuYXNzZXJ0QXV0b2ZpbGxlZCgpOwotICAgICAgICBzVWlCb3QuYXNzZXJ0Tm9EYXRhc2V0cygpOwotICAgICAgICBjYWxsYmFjay5hc3NlcnRVaUhpZGRlbkV2ZW50KG1BY3Rpdml0eS5tV2ViVmlldywgcGFzc3dvcmRDaGlsZElkKTsKKyAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQoZGF0YXNldFBpY2tlciwgIlRoZSBEdWRlIik7CisgICAgICAgIG15V2ViVmlldy5hc3NlcnRBdXRvZmlsbGVkKCk7CisgICAgICAgIG1VaUJvdC5hc3NlcnROb0RhdGFzZXRzKCk7CisgICAgICAgIGNhbGxiYWNrLmFzc2VydFVpSGlkZGVuRXZlbnQobXlXZWJWaWV3LCBwYXNzd29yZENoaWxkSWQpOwogCiAgICAgICAgIC8vIE1ha2Ugc3VyZSBzY3JlZW4gd2FzIGF1dG9maWxsZWQuCi0gICAgICAgIGFzc2VydFRoYXQobUFjdGl2aXR5LmdldFVzZXJuYW1lSW5wdXQoc1VpQm90KS5nZXRUZXh0KCkpLmlzRXF1YWxUbygiZHVkZSIpOworICAgICAgICBhc3NlcnRUaGF0KG1BY3Rpdml0eS5nZXRVc2VybmFtZUlucHV0KG1VaUJvdCkuZ2V0VGV4dCgpKS5pc0VxdWFsVG8oImR1ZGUiKTsKICAgICAgICAgLy8gVE9ETzogcHJvcGVyIHdheSB0byB2ZXJpZnkgdGV4dCAod2hpY2ggaXMgLi4uLi4gYmVjYXVzZSBpdCdzIGEgcGFzc3dvcmQpIC0gaWRlYWxseSBpdAogICAgICAgICAvLyBzaG91bGQgY2FsbCBwYXNzd29yZElucHV0LmlzUGFzc3dvcmQoKSwgYnV0IHRoYXQncyBub3QgZXhwb3NlZAotICAgICAgICBmaW5hbCBTdHJpbmcgcGFzc3dvcmQgPSBtQWN0aXZpdHkuZ2V0UGFzc3dvcmRJbnB1dChzVWlCb3QpLmdldFRleHQoKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHBhc3N3b3JkID0gbUFjdGl2aXR5LmdldFBhc3N3b3JkSW5wdXQobVVpQm90KS5nZXRUZXh0KCk7CiAgICAgICAgIGFzc2VydFRoYXQocGFzc3dvcmQpLmlzTm90RXF1YWxUbygic3dlZXQiKTsKICAgICAgICAgYXNzZXJ0VGhhdChwYXNzd29yZCkuaGFzTGVuZ3RoKDUpOwogCiAgICAgICAgIC8vIEFzc2VydCBzdHJ1Y3R1cmUgcGFzc2VkIHRvIHNlcnZpY2UuCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaW5hbCBWaWV3Tm9kZSB3ZWJWaWV3Tm9kZSA9IEhlbHBlci5maW5kV2ViVmlld05vZGUoZmlsbFJlcXVlc3Quc3RydWN0dXJlLCAiRk9STSBBTSBJIik7Ci0gICAgICAgICAgICAvLyBUT0RPKGIvNjY5NTM4MDIpOiBjbGFzcyBuYW1lIHNob3VsZCBiZSBhbmRyb2lkLndlYmtpdC5XZWJWaWV3LCBhbmQgZm9ybSBuYW1lIHNob3VsZAotICAgICAgICAgICAgLy8gYmUgaW5zaWRlIEh0bWxJbmZvLCBidXQgQ2hyb21pdW0gNjEgZG9lcyBub3QgaW1wbGVtZW50IHRoYXQuCi0gICAgICAgICAgICBpZiAod2ViVmlld05vZGUuZ2V0Q2xhc3NOYW1lKCkuZXF1YWxzKCJhbmRyb2lkLndlYmtpdC5XZWJWaWV3IikpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBIdG1sSW5mbyBodG1sSW5mbyA9IEhlbHBlci5hc3NlcnRIYXNIdG1sVGFnKHdlYlZpZXdOb2RlLCAiZm9ybSIpOwotICAgICAgICAgICAgICAgIEhlbHBlci5hc3NlcnRIYXNBdHRyaWJ1dGUoaHRtbEluZm8sICJuYW1lIiwgIkZPUk0gQU0gSSIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRUaGF0KHdlYlZpZXdOb2RlLmdldENsYXNzTmFtZSgpKS5pc0VxdWFsVG8oIkZPUk0gQU0gSSIpOwotICAgICAgICAgICAgICAgIGFzc2VydFRoYXQod2ViVmlld05vZGUuZ2V0SHRtbEluZm8oKSkuaXNOdWxsKCk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBWaWV3Tm9kZSB3ZWJWaWV3Tm9kZSA9CisgICAgICAgICAgICAgICAgICAgIEhlbHBlci5maW5kV2ViVmlld05vZGVCeUZvcm1OYW1lKGZpbGxSZXF1ZXN0LnN0cnVjdHVyZSwgIkZPUk0gQU0gSSIpOworICAgICAgICAgICAgYXNzZXJ0VGhhdCh3ZWJWaWV3Tm9kZS5nZXRDbGFzc05hbWUoKSkuaXNFcXVhbFRvKCJhbmRyb2lkLndlYmtpdC5XZWJWaWV3Iik7CiAgICAgICAgICAgICBhc3NlcnRUaGF0KHdlYlZpZXdOb2RlLmdldFdlYkRvbWFpbigpKS5pc0VxdWFsVG8oV2ViVmlld0FjdGl2aXR5LkZBS0VfRE9NQUlOKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQod2ViVmlld05vZGUuZ2V0V2ViU2NoZW1lKCkpLmlzRXF1YWxUbygiaHR0cHMiKTsKIAogICAgICAgICAgICAgZmluYWwgVmlld05vZGUgdXNlcm5hbWVOb2RlID0KLSAgICAgICAgICAgICAgICAgICAgSGVscGVyLmZpbmROb2RlQnlIdG1sTmFtZShmaWxsUmVxdWVzdC5zdHJ1Y3R1cmUsICJ1c2VybmFtZSIpOworICAgICAgICAgICAgICAgICAgICBIZWxwZXIuZmluZE5vZGVCeUh0bWxOYW1lKGZpbGxSZXF1ZXN0LnN0cnVjdHVyZSwgSFRNTF9OQU1FX1VTRVJOQU1FKTsKICAgICAgICAgICAgIEhlbHBlci5hc3NlcnRUZXh0SXNTYW5pdGl6ZWQodXNlcm5hbWVOb2RlKTsKICAgICAgICAgICAgIGZpbmFsIEh0bWxJbmZvIHVzZXJuYW1lSHRtbEluZm8gPSBIZWxwZXIuYXNzZXJ0SGFzSHRtbFRhZyh1c2VybmFtZU5vZGUsICJpbnB1dCIpOwogICAgICAgICAgICAgSGVscGVyLmFzc2VydEhhc0F0dHJpYnV0ZSh1c2VybmFtZUh0bWxJbmZvLCAidHlwZSIsICJ0ZXh0Iik7CkBAIC0xNTksNyArMTc5LDcgQEAKICAgICAgICAgICAgIGFzc2VydFRoYXQodXNlcm5hbWVOb2RlLmdldEhpbnQoKSkuaXNFcXVhbFRvKCJUaGVyZSdzIG5vIHBsYWNlIGxpa2UgYSBob2xkZXIiKTsKIAogICAgICAgICAgICAgZmluYWwgVmlld05vZGUgcGFzc3dvcmROb2RlID0KLSAgICAgICAgICAgICAgICAgICAgSGVscGVyLmZpbmROb2RlQnlIdG1sTmFtZShmaWxsUmVxdWVzdC5zdHJ1Y3R1cmUsICJwYXNzd29yZCIpOworICAgICAgICAgICAgICAgICAgICBIZWxwZXIuZmluZE5vZGVCeUh0bWxOYW1lKGZpbGxSZXF1ZXN0LnN0cnVjdHVyZSwgSFRNTF9OQU1FX1BBU1NXT1JEKTsKICAgICAgICAgICAgIEhlbHBlci5hc3NlcnRUZXh0SXNTYW5pdGl6ZWQocGFzc3dvcmROb2RlKTsKICAgICAgICAgICAgIGZpbmFsIEh0bWxJbmZvIHBhc3N3b3JkSHRtbEluZm8gPSBIZWxwZXIuYXNzZXJ0SGFzSHRtbFRhZyhwYXNzd29yZE5vZGUsICJpbnB1dCIpOwogICAgICAgICAgICAgSGVscGVyLmFzc2VydEhhc0F0dHJpYnV0ZShwYXNzd29yZEh0bWxJbmZvLCAidHlwZSIsICJwYXNzd29yZCIpOwpAQCAtMTc5LDM3ICsxOTksNDMgQEAKICAgICAgICAgLy8gU2V0IHNlcnZpY2UuCiAgICAgICAgIGVuYWJsZVNlcnZpY2UoKTsKIAorICAgICAgICAvLyBMb2FkIFdlYlZpZXcKKyAgICAgICAgbUFjdGl2aXR5LmxvYWRXZWJWaWV3KG1VaUJvdCk7CisKICAgICAgICAgLy8gU2V0IGV4cGVjdGF0aW9ucy4KICAgICAgICAgc1JlcGxpZXIuYWRkUmVzcG9uc2UobmV3IENhbm5lZEZpbGxSZXNwb25zZS5CdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAuc2V0UmVxdWlyZWRTYXZhYmxlSWRzKFNBVkVfREFUQV9UWVBFX1BBU1NXT1JELCAidXNlcm5hbWUiLCAicGFzc3dvcmQiKQorICAgICAgICAgICAgICAgIC5zZXRSZXF1aXJlZFNhdmFibGVJZHMoU0FWRV9EQVRBX1RZUEVfUEFTU1dPUkQsCisgICAgICAgICAgICAgICAgICAgICAgICBIVE1MX05BTUVfVVNFUk5BTUUsIEhUTUxfTkFNRV9QQVNTV09SRCkKICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CiAKICAgICAgICAgLy8gVHJpZ2dlciBhdXRvZmlsbC4KLSAgICAgICAgbUFjdGl2aXR5LmdldFVzZXJuYW1lSW5wdXQoc1VpQm90KS5jbGljaygpOworICAgICAgICBtQWN0aXZpdHkuZ2V0VXNlcm5hbWVJbnB1dChtVWlCb3QpLmNsaWNrKCk7CiAgICAgICAgIHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwogCiAgICAgICAgIC8vIEFzc2VydCBub3Qgc2hvd24uCi0gICAgICAgIHNVaUJvdC5hc3NlcnROb0RhdGFzZXRzKCk7CisgICAgICAgIG1VaUJvdC5hc3NlcnROb0RhdGFzZXRzRXZlcigpOwogCiAgICAgICAgIC8vIFRyaWdnZXIgc2F2ZS4KICAgICAgICAgaWYgKElOSkVDVF9FVkVOVFMpIHsKLSAgICAgICAgICAgIG1BY3Rpdml0eS5nZXRVc2VybmFtZUlucHV0KHNVaUJvdCkuY2xpY2soKTsKLSAgICAgICAgICAgIHJ1blNoZWxsQ29tbWFuZCgiaW5wdXQga2V5ZXZlbnQgS0VZQ09ERV9VIik7Ci0gICAgICAgICAgICBtQWN0aXZpdHkuZ2V0UGFzc3dvcmRJbnB1dChzVWlCb3QpLmNsaWNrKCk7Ci0gICAgICAgICAgICBydW5TaGVsbENvbW1hbmQoImlucHV0IGtleWV2ZW50IEtFWUNPREVfUCIpOworICAgICAgICAgICAgbUFjdGl2aXR5LmdldFVzZXJuYW1lSW5wdXQobVVpQm90KS5jbGljaygpOworICAgICAgICAgICAgbUFjdGl2aXR5LmRpc3BhdGNoS2V5UHJlc3MoS2V5RXZlbnQuS0VZQ09ERV9VKTsKKyAgICAgICAgICAgIG1BY3Rpdml0eS5nZXRQYXNzd29yZElucHV0KG1VaUJvdCkuY2xpY2soKTsKKyAgICAgICAgICAgIG1BY3Rpdml0eS5kaXNwYXRjaEtleVByZXNzKEtleUV2ZW50LktFWUNPREVfUCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQWN0aXZpdHkuZ2V0VXNlcm5hbWVJbnB1dChzVWlCb3QpLnNldFRleHQoIkRVREUiKTsKLSAgICAgICAgICAgIG1BY3Rpdml0eS5nZXRQYXNzd29yZElucHV0KHNVaUJvdCkuc2V0VGV4dCgiU1dFRVQiKTsKKyAgICAgICAgICAgIG1BY3Rpdml0eS5nZXRVc2VybmFtZUlucHV0KG1VaUJvdCkuc2V0VGV4dCgiRFVERSIpOworICAgICAgICAgICAgbUFjdGl2aXR5LmdldFBhc3N3b3JkSW5wdXQobVVpQm90KS5zZXRUZXh0KCJTV0VFVCIpOwogICAgICAgICB9Ci0gICAgICAgIG1BY3Rpdml0eS5nZXRMb2dpbkJ1dHRvbihzVWlCb3QpLmNsaWNrKCk7CisgICAgICAgIG1BY3Rpdml0eS5nZXRMb2dpbkJ1dHRvbihtVWlCb3QpLmNsaWNrKCk7CiAKICAgICAgICAgLy8gQXNzZXJ0IHNhdmUgVUkgc2hvd24uCi0gICAgICAgIHNVaUJvdC5zYXZlRm9yQXV0b2ZpbGwodHJ1ZSwgU0FWRV9EQVRBX1RZUEVfUEFTU1dPUkQpOworICAgICAgICBtVWlCb3Quc2F2ZUZvckF1dG9maWxsKHRydWUsIFNBVkVfREFUQV9UWVBFX1BBU1NXT1JEKTsKIAogICAgICAgICAvLyBBc3NlcnQgcmVzdWx0cwogICAgICAgICBmaW5hbCBTYXZlUmVxdWVzdCBzYXZlUmVxdWVzdCA9IHNSZXBsaWVyLmdldE5leHRTYXZlUmVxdWVzdCgpOwotICAgICAgICBmaW5hbCBWaWV3Tm9kZSB1c2VybmFtZU5vZGUgPSBIZWxwZXIuZmluZE5vZGVCeUh0bWxOYW1lKHNhdmVSZXF1ZXN0LnN0cnVjdHVyZSwgInVzZXJuYW1lIik7Ci0gICAgICAgIGZpbmFsIFZpZXdOb2RlIHBhc3N3b3JkTm9kZSA9IEhlbHBlci5maW5kTm9kZUJ5SHRtbE5hbWUoc2F2ZVJlcXVlc3Quc3RydWN0dXJlLCAicGFzc3dvcmQiKTsKKyAgICAgICAgZmluYWwgVmlld05vZGUgdXNlcm5hbWVOb2RlID0gSGVscGVyLmZpbmROb2RlQnlIdG1sTmFtZShzYXZlUmVxdWVzdC5zdHJ1Y3R1cmUsCisgICAgICAgICAgICAgICAgSFRNTF9OQU1FX1VTRVJOQU1FKTsKKyAgICAgICAgZmluYWwgVmlld05vZGUgcGFzc3dvcmROb2RlID0gSGVscGVyLmZpbmROb2RlQnlIdG1sTmFtZShzYXZlUmVxdWVzdC5zdHJ1Y3R1cmUsCisgICAgICAgICAgICAgICAgSFRNTF9OQU1FX1BBU1NXT1JEKTsKICAgICAgICAgaWYgKElOSkVDVF9FVkVOVFMpIHsKICAgICAgICAgICAgIEhlbHBlci5hc3NlcnRUZXh0QW5kVmFsdWUodXNlcm5hbWVOb2RlLCAidSIpOwogICAgICAgICAgICAgSGVscGVyLmFzc2VydFRleHRBbmRWYWx1ZShwYXNzd29yZE5vZGUsICJwIik7CkBAIC0yMjQsNjYgKzI1MCw3NCBAQAogICAgICAgICAvLyBTZXQgc2VydmljZS4KICAgICAgICAgZW5hYmxlU2VydmljZSgpOwogCisgICAgICAgIC8vIExvYWQgV2ViVmlldworICAgICAgICBmaW5hbCBNeVdlYlZpZXcgbXlXZWJWaWV3ID0gbUFjdGl2aXR5LmxvYWRXZWJWaWV3KG1VaUJvdCk7CisKICAgICAgICAgLy8gU2V0IGV4cGVjdGF0aW9ucy4KICAgICAgICAgZmluYWwgTXlBdXRvZmlsbENhbGxiYWNrIGNhbGxiYWNrID0gbUFjdGl2aXR5LnJlZ2lzdGVyQ2FsbGJhY2soKTsKLSAgICAgICAgbUFjdGl2aXR5Lm1XZWJWaWV3LmV4cGVjdEF1dG9maWxsKCJkdWRlIiwgInN3ZWV0Iik7CisgICAgICAgIG15V2ViVmlldy5leHBlY3RBdXRvZmlsbCgiZHVkZSIsICJzd2VldCIpOwogICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgIC5zZXRSZXF1aXJlZFNhdmFibGVJZHMoU0FWRV9EQVRBX1RZUEVfUEFTU1dPUkQsICJ1c2VybmFtZSIsICJwYXNzd29yZCIpCisgICAgICAgICAgICAgICAgLnNldFJlcXVpcmVkU2F2YWJsZUlkcyhTQVZFX0RBVEFfVFlQRV9QQVNTV09SRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhUTUxfTkFNRV9VU0VSTkFNRSwgSFRNTF9OQU1FX1BBU1NXT1JEKQogICAgICAgICAgICAgICAgIC5hZGREYXRhc2V0KG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKCJ1c2VybmFtZSIsICJkdWRlIikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZCgicGFzc3dvcmQiLCAic3dlZXQiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKEhUTUxfTkFNRV9VU0VSTkFNRSwgImR1ZGUiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKEhUTUxfTkFNRV9QQVNTV09SRCwgInN3ZWV0IikKICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb24oY3JlYXRlUHJlc2VudGF0aW9uKCJUaGUgRHVkZSIpKQogICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCiAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOwogCiAgICAgICAgIC8vIFRyaWdnZXIgYXV0b2ZpbGwuCi0gICAgICAgIG1BY3Rpdml0eS5nZXRVc2VybmFtZUlucHV0KHNVaUJvdCkuY2xpY2soKTsKKyAgICAgICAgbUFjdGl2aXR5LmdldFVzZXJuYW1lSW5wdXQobVVpQm90KS5jbGljaygpOwogICAgICAgICBmaW5hbCBGaWxsUmVxdWVzdCBmaWxsUmVxdWVzdCA9IHNSZXBsaWVyLmdldE5leHRGaWxsUmVxdWVzdCgpOwotICAgICAgICBzVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlRoZSBEdWRlIik7Ci0gICAgICAgIGZpbmFsIGludCB1c2VybmFtZUNoaWxkSWQgPSBjYWxsYmFjay5hc3NlcnRVaVNob3duRXZlbnRGb3JWaXJ0dWFsQ2hpbGQobUFjdGl2aXR5Lm1XZWJWaWV3KTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJUaGUgRHVkZSIpOworICAgICAgICBmaW5hbCBpbnQgdXNlcm5hbWVDaGlsZElkID0gY2FsbGJhY2suYXNzZXJ0VWlTaG93bkV2ZW50Rm9yVmlydHVhbENoaWxkKG15V2ViVmlldyk7CiAKICAgICAgICAgLy8gQXNzZXJ0IHN0cnVjdHVyZSBwYXNzZWQgdG8gc2VydmljZS4KLSAgICAgICAgZmluYWwgVmlld05vZGUgdXNlcm5hbWVOb2RlID0gSGVscGVyLmZpbmROb2RlQnlIdG1sTmFtZShmaWxsUmVxdWVzdC5zdHJ1Y3R1cmUsICJ1c2VybmFtZSIpOworICAgICAgICBmaW5hbCBWaWV3Tm9kZSB1c2VybmFtZU5vZGUgPSBIZWxwZXIuZmluZE5vZGVCeUh0bWxOYW1lKGZpbGxSZXF1ZXN0LnN0cnVjdHVyZSwKKyAgICAgICAgICAgICAgICBIVE1MX05BTUVfVVNFUk5BTUUpOwogICAgICAgICBIZWxwZXIuYXNzZXJ0VGV4dElzU2FuaXRpemVkKHVzZXJuYW1lTm9kZSk7CiAgICAgICAgIGFzc2VydFRoYXQodXNlcm5hbWVOb2RlLmlzRm9jdXNlZCgpKS5pc1RydWUoKTsKICAgICAgICAgYXNzZXJ0VGhhdCh1c2VybmFtZU5vZGUuZ2V0QXV0b2ZpbGxIaW50cygpKS5hc0xpc3QoKS5jb250YWluc0V4YWN0bHkoInVzZXJuYW1lIik7Ci0gICAgICAgIGZpbmFsIFZpZXdOb2RlIHBhc3N3b3JkTm9kZSA9IEhlbHBlci5maW5kTm9kZUJ5SHRtbE5hbWUoZmlsbFJlcXVlc3Quc3RydWN0dXJlLCAicGFzc3dvcmQiKTsKKyAgICAgICAgZmluYWwgVmlld05vZGUgcGFzc3dvcmROb2RlID0gSGVscGVyLmZpbmROb2RlQnlIdG1sTmFtZShmaWxsUmVxdWVzdC5zdHJ1Y3R1cmUsCisgICAgICAgICAgICAgICAgSFRNTF9OQU1FX1BBU1NXT1JEKTsKICAgICAgICAgSGVscGVyLmFzc2VydFRleHRJc1Nhbml0aXplZChwYXNzd29yZE5vZGUpOwogICAgICAgICBhc3NlcnRUaGF0KHBhc3N3b3JkTm9kZS5nZXRBdXRvZmlsbEhpbnRzKCkpLmFzTGlzdCgpLmNvbnRhaW5zRXhhY3RseSgiY3VycmVudC1wYXNzd29yZCIpOwogICAgICAgICBhc3NlcnRUaGF0KHBhc3N3b3JkTm9kZS5pc0ZvY3VzZWQoKSkuaXNGYWxzZSgpOwogCiAgICAgICAgIC8vIEF1dG9maWxsIGl0LgotICAgICAgICBzVWlCb3Quc2VsZWN0RGF0YXNldCgiVGhlIER1ZGUiKTsKLSAgICAgICAgbUFjdGl2aXR5Lm1XZWJWaWV3LmFzc2VydEF1dG9maWxsZWQoKTsKLSAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlIaWRkZW5FdmVudChtQWN0aXZpdHkubVdlYlZpZXcsIHVzZXJuYW1lQ2hpbGRJZCk7CisgICAgICAgIG1VaUJvdC5zZWxlY3REYXRhc2V0KCJUaGUgRHVkZSIpOworICAgICAgICBteVdlYlZpZXcuYXNzZXJ0QXV0b2ZpbGxlZCgpOworICAgICAgICBjYWxsYmFjay5hc3NlcnRVaUhpZGRlbkV2ZW50KG15V2ViVmlldywgdXNlcm5hbWVDaGlsZElkKTsKIAogICAgICAgICAvLyBNYWtlIHN1cmUgc2NyZWVuIHdhcyBhdXRvZmlsbGVkLgotICAgICAgICBhc3NlcnRUaGF0KG1BY3Rpdml0eS5nZXRVc2VybmFtZUlucHV0KHNVaUJvdCkuZ2V0VGV4dCgpKS5pc0VxdWFsVG8oImR1ZGUiKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtQWN0aXZpdHkuZ2V0VXNlcm5hbWVJbnB1dChtVWlCb3QpLmdldFRleHQoKSkuaXNFcXVhbFRvKCJkdWRlIik7CiAgICAgICAgIC8vIFRPRE86IHByb3BlciB3YXkgdG8gdmVyaWZ5IHRleHQgKHdoaWNoIGlzIC4uLi4uIGJlY2F1c2UgaXQncyBhIHBhc3N3b3JkKSAtIGlkZWFsbHkgaXQKICAgICAgICAgLy8gc2hvdWxkIGNhbGwgcGFzc3dvcmRJbnB1dC5pc1Bhc3N3b3JkKCksIGJ1dCB0aGF0J3Mgbm90IGV4cG9zZWQKLSAgICAgICAgZmluYWwgU3RyaW5nIHBhc3N3b3JkID0gbUFjdGl2aXR5LmdldFBhc3N3b3JkSW5wdXQoc1VpQm90KS5nZXRUZXh0KCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBwYXNzd29yZCA9IG1BY3Rpdml0eS5nZXRQYXNzd29yZElucHV0KG1VaUJvdCkuZ2V0VGV4dCgpOwogICAgICAgICBhc3NlcnRUaGF0KHBhc3N3b3JkKS5pc05vdEVxdWFsVG8oInN3ZWV0Iik7CiAgICAgICAgIGFzc2VydFRoYXQocGFzc3dvcmQpLmhhc0xlbmd0aCg1KTsKIAogICAgICAgICAvLyBOb3cgdHJpZ2dlciBzYXZlLgogICAgICAgICBpZiAoSU5KRUNUX0VWRU5UUykgewotICAgICAgICAgICAgbUFjdGl2aXR5LmdldFVzZXJuYW1lSW5wdXQoc1VpQm90KS5jbGljaygpOwotICAgICAgICAgICAgcnVuU2hlbGxDb21tYW5kKCJpbnB1dCBrZXlldmVudCBLRVlDT0RFX1UiKTsKLSAgICAgICAgICAgIG1BY3Rpdml0eS5nZXRQYXNzd29yZElucHV0KHNVaUJvdCkuY2xpY2soKTsKLSAgICAgICAgICAgIHJ1blNoZWxsQ29tbWFuZCgiaW5wdXQga2V5ZXZlbnQgS0VZQ09ERV9QIik7CisgICAgICAgICAgICBtQWN0aXZpdHkuZ2V0VXNlcm5hbWVJbnB1dChtVWlCb3QpLmNsaWNrKCk7CisgICAgICAgICAgICBtQWN0aXZpdHkuZGlzcGF0Y2hLZXlQcmVzcyhLZXlFdmVudC5LRVlDT0RFX1UpOworICAgICAgICAgICAgbUFjdGl2aXR5LmdldFBhc3N3b3JkSW5wdXQobVVpQm90KS5jbGljaygpOworICAgICAgICAgICAgbUFjdGl2aXR5LmRpc3BhdGNoS2V5UHJlc3MoS2V5RXZlbnQuS0VZQ09ERV9QKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1BY3Rpdml0eS5nZXRVc2VybmFtZUlucHV0KHNVaUJvdCkuc2V0VGV4dCgiRFVERSIpOwotICAgICAgICAgICAgbUFjdGl2aXR5LmdldFBhc3N3b3JkSW5wdXQoc1VpQm90KS5zZXRUZXh0KCJTV0VFVCIpOworICAgICAgICAgICAgbUFjdGl2aXR5LmdldFVzZXJuYW1lSW5wdXQobVVpQm90KS5zZXRUZXh0KCJEVURFIik7CisgICAgICAgICAgICBtQWN0aXZpdHkuZ2V0UGFzc3dvcmRJbnB1dChtVWlCb3QpLnNldFRleHQoIlNXRUVUIik7CiAgICAgICAgIH0KLSAgICAgICAgbUFjdGl2aXR5LmdldExvZ2luQnV0dG9uKHNVaUJvdCkuY2xpY2soKTsKKyAgICAgICAgbUFjdGl2aXR5LmdldExvZ2luQnV0dG9uKG1VaUJvdCkuY2xpY2soKTsKIAogICAgICAgICAvLyBBc3NlcnQgc2F2ZSBVSSBzaG93bi4KLSAgICAgICAgc1VpQm90LnNhdmVGb3JBdXRvZmlsbCh0cnVlLCBTQVZFX0RBVEFfVFlQRV9QQVNTV09SRCk7CisgICAgICAgIG1VaUJvdC5zYXZlRm9yQXV0b2ZpbGwodHJ1ZSwgU0FWRV9EQVRBX1RZUEVfUEFTU1dPUkQpOwogCiAgICAgICAgIC8vIEFzc2VydCByZXN1bHRzCiAgICAgICAgIGZpbmFsIFNhdmVSZXF1ZXN0IHNhdmVSZXF1ZXN0ID0gc1JlcGxpZXIuZ2V0TmV4dFNhdmVSZXF1ZXN0KCk7Ci0gICAgICAgIGZpbmFsIFZpZXdOb2RlIHVzZXJuYW1lTm9kZTIgPSBIZWxwZXIuZmluZE5vZGVCeUh0bWxOYW1lKHNhdmVSZXF1ZXN0LnN0cnVjdHVyZSwgInVzZXJuYW1lIik7Ci0gICAgICAgIGZpbmFsIFZpZXdOb2RlIHBhc3N3b3JkTm9kZTIgPSBIZWxwZXIuZmluZE5vZGVCeUh0bWxOYW1lKHNhdmVSZXF1ZXN0LnN0cnVjdHVyZSwgInBhc3N3b3JkIik7CisgICAgICAgIGZpbmFsIFZpZXdOb2RlIHVzZXJuYW1lTm9kZTIgPSBIZWxwZXIuZmluZE5vZGVCeUh0bWxOYW1lKHNhdmVSZXF1ZXN0LnN0cnVjdHVyZSwKKyAgICAgICAgICAgICAgICBIVE1MX05BTUVfVVNFUk5BTUUpOworICAgICAgICBmaW5hbCBWaWV3Tm9kZSBwYXNzd29yZE5vZGUyID0gSGVscGVyLmZpbmROb2RlQnlIdG1sTmFtZShzYXZlUmVxdWVzdC5zdHJ1Y3R1cmUsCisgICAgICAgICAgICAgICAgSFRNTF9OQU1FX1BBU1NXT1JEKTsKICAgICAgICAgaWYgKElOSkVDVF9FVkVOVFMpIHsKICAgICAgICAgICAgIEhlbHBlci5hc3NlcnRUZXh0QW5kVmFsdWUodXNlcm5hbWVOb2RlMiwgImR1ZGV1Iik7CiAgICAgICAgICAgICBIZWxwZXIuYXNzZXJ0VGV4dEFuZFZhbHVlKHBhc3N3b3JkTm9kZTIsICJzd2VldHAiKTsKQEAgLTI5Myw3ICszMjcsMjg1IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0QXV0b2ZpbGxFbmFibGVkT25XZWJWaWV3KCkgewotICAgICAgICBhc3NlcnRUaGF0KG1BY3Rpdml0eS5tV2ViVmlldy5pc0F1dG9maWxsRW5hYmxlZCgpKS5pc1RydWUoKTsKKyAgICBAVGVzdAorICAgIEBBcHBNb2RlRnVsbCAvLyB0ZXN0QXV0b2ZpbGxBbmRTYXZlKCkgaXMgZW5vdWdoIHRvIHRlc3QgZXBoZW1lcmFsIGFwcHMgc3VwcG9ydAorICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvZmlsbEFuZFNhdmVfd2l0aEV4dGVybmFsVmlld3NfbG9hZFdlYlZpZXdGaXJzdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBTZXQgc2VydmljZS4KKyAgICAgICAgZW5hYmxlU2VydmljZSgpOworCisgICAgICAgIC8vIExvYWQgdmlld3MKKyAgICAgICAgZmluYWwgTXlXZWJWaWV3IG15V2ViVmlldyA9IG1BY3Rpdml0eS5sb2FkV2ViVmlldyhtVWlCb3QpOworICAgICAgICBtQWN0aXZpdHkubG9hZE91dHNpZGVWaWV3cygpOworCisgICAgICAgIC8vIFNldCBleHBlY3RhdGlvbnMuCisgICAgICAgIG15V2ViVmlldy5leHBlY3RBdXRvZmlsbCgiZHVkZSIsICJzd2VldCIpOworICAgICAgICBmaW5hbCBPbmVUaW1lVGV4dFdhdGNoZXIgb3V0c2lkZTFXYXRjaGVyID0gbmV3IE9uZVRpbWVUZXh0V2F0Y2hlcigib3V0c2lkZTEiLAorICAgICAgICAgICAgICAgIG1BY3Rpdml0eS5tT3V0c2lkZTEsICJkdWRlciIpOworICAgICAgICBmaW5hbCBPbmVUaW1lVGV4dFdhdGNoZXIgb3V0c2lkZTJXYXRjaGVyID0gbmV3IE9uZVRpbWVUZXh0V2F0Y2hlcigib3V0c2lkZTIiLAorICAgICAgICAgICAgICAgIG1BY3Rpdml0eS5tT3V0c2lkZTIsICJzd2VldGVyIik7CisgICAgICAgIG1BY3Rpdml0eS5tT3V0c2lkZTEuYWRkVGV4dENoYW5nZWRMaXN0ZW5lcihvdXRzaWRlMVdhdGNoZXIpOworICAgICAgICBtQWN0aXZpdHkubU91dHNpZGUyLmFkZFRleHRDaGFuZ2VkTGlzdGVuZXIob3V0c2lkZTJXYXRjaGVyKTsKKworICAgICAgICBmaW5hbCBNeUF1dG9maWxsQ2FsbGJhY2sgY2FsbGJhY2sgPSBtQWN0aXZpdHkucmVnaXN0ZXJDYWxsYmFjaygpOworICAgICAgICBzUmVwbGllci5zZXRJZE1vZGUoSWRNb2RlLkhUTUxfTkFNRV9PUl9SRVNPVVJDRV9JRCk7CisgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldFJlcXVpcmVkU2F2YWJsZUlkcyhTQVZFX0RBVEFfVFlQRV9QQVNTV09SRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhUTUxfTkFNRV9VU0VSTkFNRSwgSFRNTF9OQU1FX1BBU1NXT1JELCBJRF9PVVRTSURFMSwgSURfT1VUU0lERTIpCisgICAgICAgICAgICAgICAgLmFkZERhdGFzZXQobmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSFRNTF9OQU1FX1VTRVJOQU1FLCAiZHVkZSIsIGNyZWF0ZVByZXNlbnRhdGlvbigiVVNFUiIpKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKEhUTUxfTkFNRV9QQVNTV09SRCwgInN3ZWV0IiwgY3JlYXRlUHJlc2VudGF0aW9uKCJQQVNTIikpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSURfT1VUU0lERTEsICJkdWRlciIsIGNyZWF0ZVByZXNlbnRhdGlvbigiT1VUMSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX09VVFNJREUyLCAic3dlZXRlciIsIGNyZWF0ZVByZXNlbnRhdGlvbigiT1VUMiIpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIC8vIFRyaWdnZXIgYXV0b2ZpbGwuCisgICAgICAgIG1BY3Rpdml0eS5nZXRVc2VybmFtZUlucHV0KG1VaUJvdCkuY2xpY2soKTsKKyAgICAgICAgZmluYWwgRmlsbFJlcXVlc3QgZmlsbFJlcXVlc3QgPSBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJVU0VSIik7CisgICAgICAgIGZpbmFsIGludCB1c2VybmFtZUNoaWxkSWQgPSBjYWxsYmFjay5hc3NlcnRVaVNob3duRXZlbnRGb3JWaXJ0dWFsQ2hpbGQobXlXZWJWaWV3KTsKKworICAgICAgICAvLyBBc3NlcnQgc3RydWN0dXJlIHBhc3NlZCB0byBzZXJ2aWNlLgorICAgICAgICBmaW5hbCBWaWV3Tm9kZSB1c2VybmFtZUZpbGxOb2RlID0gSGVscGVyLmZpbmROb2RlQnlIdG1sTmFtZShmaWxsUmVxdWVzdC5zdHJ1Y3R1cmUsCisgICAgICAgICAgICAgICAgSFRNTF9OQU1FX1VTRVJOQU1FKTsKKyAgICAgICAgSGVscGVyLmFzc2VydFRleHRJc1Nhbml0aXplZCh1c2VybmFtZUZpbGxOb2RlKTsKKyAgICAgICAgYXNzZXJ0VGhhdCh1c2VybmFtZUZpbGxOb2RlLmlzRm9jdXNlZCgpKS5pc1RydWUoKTsKKyAgICAgICAgYXNzZXJ0VGhhdCh1c2VybmFtZUZpbGxOb2RlLmdldEF1dG9maWxsSGludHMoKSkuYXNMaXN0KCkuY29udGFpbnNFeGFjdGx5KCJ1c2VybmFtZSIpOworICAgICAgICBmaW5hbCBWaWV3Tm9kZSBwYXNzd29yZEZpbGxOb2RlID0gSGVscGVyLmZpbmROb2RlQnlIdG1sTmFtZShmaWxsUmVxdWVzdC5zdHJ1Y3R1cmUsCisgICAgICAgICAgICAgICAgSFRNTF9OQU1FX1BBU1NXT1JEKTsKKyAgICAgICAgSGVscGVyLmFzc2VydFRleHRJc1Nhbml0aXplZChwYXNzd29yZEZpbGxOb2RlKTsKKyAgICAgICAgYXNzZXJ0VGhhdChwYXNzd29yZEZpbGxOb2RlLmdldEF1dG9maWxsSGludHMoKSkuYXNMaXN0KCkKKyAgICAgICAgICAgICAgICAuY29udGFpbnNFeGFjdGx5KCJjdXJyZW50LXBhc3N3b3JkIik7CisgICAgICAgIGFzc2VydFRoYXQocGFzc3dvcmRGaWxsTm9kZS5pc0ZvY3VzZWQoKSkuaXNGYWxzZSgpOworCisgICAgICAgIGZpbmFsIFZpZXdOb2RlIG91dHNpZGUxRmlsbE5vZGUgPSBIZWxwZXIuZmluZE5vZGVCeVJlc291cmNlSWQoZmlsbFJlcXVlc3Quc3RydWN0dXJlLAorICAgICAgICAgICAgICAgIElEX09VVFNJREUxKTsKKyAgICAgICAgSGVscGVyLmFzc2VydFRleHRJc1Nhbml0aXplZChvdXRzaWRlMUZpbGxOb2RlKTsKKyAgICAgICAgZmluYWwgVmlld05vZGUgb3V0c2lkZTJGaWxsTm9kZSA9IEhlbHBlci5maW5kTm9kZUJ5UmVzb3VyY2VJZChmaWxsUmVxdWVzdC5zdHJ1Y3R1cmUsCisgICAgICAgICAgICAgICAgSURfT1VUU0lERTIpOworICAgICAgICBIZWxwZXIuYXNzZXJ0VGV4dElzU2FuaXRpemVkKG91dHNpZGUyRmlsbE5vZGUpOworCisgICAgICAgIC8vIE1vdmUgZm9jdXMgYXJvdW5kIHRvIG1ha2Ugc3VyZSBVSSBpcyBzaG93biBhY2NvcmRpbmdseQorICAgICAgICBtQWN0aXZpdHkucnVuT25VaVRocmVhZCgoKSAtPiBtQWN0aXZpdHkubU91dHNpZGUxLnJlcXVlc3RGb2N1cygpKTsKKyAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlIaWRkZW5FdmVudChteVdlYlZpZXcsIHVzZXJuYW1lQ2hpbGRJZCk7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cygiT1VUMSIpOworICAgICAgICBjYWxsYmFjay5hc3NlcnRVaVNob3duRXZlbnQobUFjdGl2aXR5Lm1PdXRzaWRlMSk7CisKKyAgICAgICAgbUFjdGl2aXR5LmdldFBhc3N3b3JkSW5wdXQobVVpQm90KS5jbGljaygpOworICAgICAgICBjYWxsYmFjay5hc3NlcnRVaUhpZGRlbkV2ZW50KG1BY3Rpdml0eS5tT3V0c2lkZTEpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIlBBU1MiKTsKKyAgICAgICAgZmluYWwgaW50IHBhc3N3b3JkQ2hpbGRJZCA9IGNhbGxiYWNrLmFzc2VydFVpU2hvd25FdmVudEZvclZpcnR1YWxDaGlsZChteVdlYlZpZXcpOworCisgICAgICAgIG1BY3Rpdml0eS5ydW5PblVpVGhyZWFkKCgpIC0+IG1BY3Rpdml0eS5tT3V0c2lkZTIucmVxdWVzdEZvY3VzKCkpOworICAgICAgICBjYWxsYmFjay5hc3NlcnRVaUhpZGRlbkV2ZW50KG15V2ViVmlldywgcGFzc3dvcmRDaGlsZElkKTsKKyAgICAgICAgZmluYWwgVWlPYmplY3QyIGRhdGFzZXRQaWNrZXIgPSBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIk9VVDIiKTsKKyAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlTaG93bkV2ZW50KG1BY3Rpdml0eS5tT3V0c2lkZTIpOworCisgICAgICAgIC8vIEF1dG9maWxsIGl0LgorICAgICAgICBtVWlCb3Quc2VsZWN0RGF0YXNldChkYXRhc2V0UGlja2VyLCAiT1VUMiIpOworICAgICAgICBjYWxsYmFjay5hc3NlcnRVaUhpZGRlbkV2ZW50KG1BY3Rpdml0eS5tT3V0c2lkZTIpOworCisgICAgICAgIG15V2ViVmlldy5hc3NlcnRBdXRvZmlsbGVkKCk7CisgICAgICAgIG91dHNpZGUxV2F0Y2hlci5hc3NlcnRBdXRvRmlsbGVkKCk7CisgICAgICAgIG91dHNpZGUyV2F0Y2hlci5hc3NlcnRBdXRvRmlsbGVkKCk7CisKKyAgICAgICAgLy8gTm93IHRyaWdnZXIgc2F2ZS4KKyAgICAgICAgaWYgKElOSkVDVF9FVkVOVFMpIHsKKyAgICAgICAgICAgIG1BY3Rpdml0eS5nZXRVc2VybmFtZUlucHV0KG1VaUJvdCkuY2xpY2soKTsKKyAgICAgICAgICAgIG1BY3Rpdml0eS5kaXNwYXRjaEtleVByZXNzKEtleUV2ZW50LktFWUNPREVfVSk7CisgICAgICAgICAgICBtQWN0aXZpdHkuZ2V0UGFzc3dvcmRJbnB1dChtVWlCb3QpLmNsaWNrKCk7CisgICAgICAgICAgICBtQWN0aXZpdHkuZGlzcGF0Y2hLZXlQcmVzcyhLZXlFdmVudC5LRVlDT0RFX1ApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUFjdGl2aXR5LmdldFVzZXJuYW1lSW5wdXQobVVpQm90KS5zZXRUZXh0KCJEVURFIik7CisgICAgICAgICAgICBtQWN0aXZpdHkuZ2V0UGFzc3dvcmRJbnB1dChtVWlCb3QpLnNldFRleHQoIlNXRUVUIik7CisgICAgICAgIH0KKyAgICAgICAgbUFjdGl2aXR5LnJ1bk9uVWlUaHJlYWQoKCkgLT4geworICAgICAgICAgICAgbUFjdGl2aXR5Lm1PdXRzaWRlMS5zZXRUZXh0KCJEVURFUiIpOworICAgICAgICAgICAgbUFjdGl2aXR5Lm1PdXRzaWRlMi5zZXRUZXh0KCJTV0VFVEVSIik7CisgICAgICAgIH0pOworCisgICAgICAgIG1BY3Rpdml0eS5nZXRMb2dpbkJ1dHRvbihtVWlCb3QpLmNsaWNrKCk7CisKKyAgICAgICAgLy8gQXNzZXJ0IHNhdmUgVUkgc2hvd24uCisgICAgICAgIG1VaUJvdC5zYXZlRm9yQXV0b2ZpbGwodHJ1ZSwgU0FWRV9EQVRBX1RZUEVfUEFTU1dPUkQpOworCisgICAgICAgIC8vIEFzc2VydCByZXN1bHRzCisgICAgICAgIGZpbmFsIFNhdmVSZXF1ZXN0IHNhdmVSZXF1ZXN0ID0gc1JlcGxpZXIuZ2V0TmV4dFNhdmVSZXF1ZXN0KCk7CisgICAgICAgIGZpbmFsIFZpZXdOb2RlIHVzZXJuYW1lU2F2ZU5vZGUgPSBIZWxwZXIuZmluZE5vZGVCeUh0bWxOYW1lKHNhdmVSZXF1ZXN0LnN0cnVjdHVyZSwKKyAgICAgICAgICAgICAgICBIVE1MX05BTUVfVVNFUk5BTUUpOworICAgICAgICBmaW5hbCBWaWV3Tm9kZSBwYXNzd29yZFNhdmVOb2RlID0gSGVscGVyLmZpbmROb2RlQnlIdG1sTmFtZShzYXZlUmVxdWVzdC5zdHJ1Y3R1cmUsCisgICAgICAgICAgICAgICAgSFRNTF9OQU1FX1BBU1NXT1JEKTsKKyAgICAgICAgaWYgKElOSkVDVF9FVkVOVFMpIHsKKyAgICAgICAgICAgIEhlbHBlci5hc3NlcnRUZXh0QW5kVmFsdWUodXNlcm5hbWVTYXZlTm9kZSwgImR1ZGV1Iik7CisgICAgICAgICAgICBIZWxwZXIuYXNzZXJ0VGV4dEFuZFZhbHVlKHBhc3N3b3JkU2F2ZU5vZGUsICJzd2VldHAiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEhlbHBlci5hc3NlcnRUZXh0QW5kVmFsdWUodXNlcm5hbWVTYXZlTm9kZSwgIkRVREUiKTsKKyAgICAgICAgICAgIEhlbHBlci5hc3NlcnRUZXh0QW5kVmFsdWUocGFzc3dvcmRTYXZlTm9kZSwgIlNXRUVUIik7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBWaWV3Tm9kZSBvdXRzaWRlMVNhdmVOb2RlID0gSGVscGVyLmZpbmROb2RlQnlSZXNvdXJjZUlkKHNhdmVSZXF1ZXN0LnN0cnVjdHVyZSwKKyAgICAgICAgICAgICAgICBJRF9PVVRTSURFMSk7CisgICAgICAgIEhlbHBlci5hc3NlcnRUZXh0QW5kVmFsdWUob3V0c2lkZTFTYXZlTm9kZSwgIkRVREVSIik7CisgICAgICAgIGZpbmFsIFZpZXdOb2RlIG91dHNpZGUyU2F2ZU5vZGUgPSBIZWxwZXIuZmluZE5vZGVCeVJlc291cmNlSWQoc2F2ZVJlcXVlc3Quc3RydWN0dXJlLAorICAgICAgICAgICAgICAgIElEX09VVFNJREUyKTsKKyAgICAgICAgSGVscGVyLmFzc2VydFRleHRBbmRWYWx1ZShvdXRzaWRlMlNhdmVOb2RlLCAiU1dFRVRFUiIpOworICAgIH0KKworCisgICAgQFRlc3QKKyAgICBASWdub3JlKCJibG9ja2VkIG9uIGIvNjk0NjE4NTMiKQorICAgIEBBcHBNb2RlRnVsbCAvLyB0ZXN0QXV0b2ZpbGxBbmRTYXZlKCkgaXMgZW5vdWdoIHRvIHRlc3QgZXBoZW1lcmFsIGFwcHMgc3VwcG9ydAorICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvZmlsbEFuZFNhdmVfd2l0aEV4dGVybmFsVmlld3NfbG9hZEV4dGVybmFsVmlld3NGaXJzdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBTZXQgc2VydmljZS4KKyAgICAgICAgZW5hYmxlU2VydmljZSgpOworCisgICAgICAgIC8vIExvYWQgb3V0c2lkZSB2aWV3cworICAgICAgICBtQWN0aXZpdHkubG9hZE91dHNpZGVWaWV3cygpOworCisgICAgICAgIC8vIFNldCBleHBlY3RhdGlvbnMuCisgICAgICAgIGZpbmFsIE9uZVRpbWVUZXh0V2F0Y2hlciBvdXRzaWRlMVdhdGNoZXIgPSBuZXcgT25lVGltZVRleHRXYXRjaGVyKCJvdXRzaWRlMSIsCisgICAgICAgICAgICAgICAgbUFjdGl2aXR5Lm1PdXRzaWRlMSwgImR1ZGVyIik7CisgICAgICAgIGZpbmFsIE9uZVRpbWVUZXh0V2F0Y2hlciBvdXRzaWRlMldhdGNoZXIgPSBuZXcgT25lVGltZVRleHRXYXRjaGVyKCJvdXRzaWRlMiIsCisgICAgICAgICAgICAgICAgbUFjdGl2aXR5Lm1PdXRzaWRlMiwgInN3ZWV0ZXIiKTsKKyAgICAgICAgbUFjdGl2aXR5Lm1PdXRzaWRlMS5hZGRUZXh0Q2hhbmdlZExpc3RlbmVyKG91dHNpZGUxV2F0Y2hlcik7CisgICAgICAgIG1BY3Rpdml0eS5tT3V0c2lkZTIuYWRkVGV4dENoYW5nZWRMaXN0ZW5lcihvdXRzaWRlMldhdGNoZXIpOworCisgICAgICAgIGZpbmFsIE15QXV0b2ZpbGxDYWxsYmFjayBjYWxsYmFjayA9IG1BY3Rpdml0eS5yZWdpc3RlckNhbGxiYWNrKCk7CisgICAgICAgIHNSZXBsaWVyLnNldElkTW9kZShJZE1vZGUuUkVTT1VSQ0VfSUQpOworICAgICAgICBzUmVwbGllci5hZGRSZXNwb25zZShuZXcgQ2FubmVkRmlsbFJlc3BvbnNlLkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5hZGREYXRhc2V0KG5ldyBDYW5uZWREYXRhc2V0LkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKElEX09VVFNJREUxLCAiZHVkZXIiLCBjcmVhdGVQcmVzZW50YXRpb24oIk9VVDEiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWVsZChJRF9PVVRTSURFMiwgInN3ZWV0ZXIiLCBjcmVhdGVQcmVzZW50YXRpb24oIk9VVDIiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAvLyBUcmlnZ2VyIGF1dG9maWxsLgorICAgICAgICBtQWN0aXZpdHkucnVuT25VaVRocmVhZCgoKSAtPiBtQWN0aXZpdHkubU91dHNpZGUxLnJlcXVlc3RGb2N1cygpKTsKKyAgICAgICAgZmluYWwgRmlsbFJlcXVlc3QgZmlsbFJlcXVlc3QxID0gc1JlcGxpZXIuZ2V0TmV4dEZpbGxSZXF1ZXN0KCk7CisgICAgICAgIG1VaUJvdC5hc3NlcnREYXRhc2V0cygiT1VUMSIpOworICAgICAgICBjYWxsYmFjay5hc3NlcnRVaVNob3duRXZlbnQobUFjdGl2aXR5Lm1PdXRzaWRlMSk7CisKKyAgICAgICAgLy8gTW92ZSBmb2N1cyBhcm91bmQgdG8gbWFrZSBzdXJlIFVJIGlzIHNob3duIGFjY29yZGluZ2x5CisgICAgICAgIG1BY3Rpdml0eS5ydW5PblVpVGhyZWFkKCgpIC0+IG1BY3Rpdml0eS5tT3V0c2lkZTIucmVxdWVzdEZvY3VzKCkpOworICAgICAgICBjYWxsYmFjay5hc3NlcnRVaUhpZGRlbkV2ZW50KG1BY3Rpdml0eS5tT3V0c2lkZTEpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIk9VVDIiKTsKKyAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlTaG93bkV2ZW50KG1BY3Rpdml0eS5tT3V0c2lkZTIpOworCisgICAgICAgIC8vIEFzc2VydCBzdHJ1Y3R1cmUgcGFzc2VkIHRvIHNlcnZpY2UuCisgICAgICAgIGZpbmFsIFZpZXdOb2RlIG91dHNpZGUxRmlsbE5vZGUgPSBIZWxwZXIuZmluZE5vZGVCeVJlc291cmNlSWQoZmlsbFJlcXVlc3QxLnN0cnVjdHVyZSwKKyAgICAgICAgICAgICAgICBJRF9PVVRTSURFMSk7CisgICAgICAgIEhlbHBlci5hc3NlcnRUZXh0SXNTYW5pdGl6ZWQob3V0c2lkZTFGaWxsTm9kZSk7CisgICAgICAgIGZpbmFsIFZpZXdOb2RlIG91dHNpZGUyRmlsbE5vZGUgPSBIZWxwZXIuZmluZE5vZGVCeVJlc291cmNlSWQoZmlsbFJlcXVlc3QxLnN0cnVjdHVyZSwKKyAgICAgICAgICAgICAgICBJRF9PVVRTSURFMik7CisgICAgICAgIEhlbHBlci5hc3NlcnRUZXh0SXNTYW5pdGl6ZWQob3V0c2lkZTJGaWxsTm9kZSk7CisKKyAgICAgICAgLy8gTm93IGxvYWQgV2ViaWV3CisgICAgICAgIGZpbmFsIE15V2ViVmlldyBteVdlYlZpZXcgPSBtQWN0aXZpdHkubG9hZFdlYlZpZXcobVVpQm90KTsKKworICAgICAgICAvLyBTZXQgZXhwZWN0YXRpb25zCisgICAgICAgIG15V2ViVmlldy5leHBlY3RBdXRvZmlsbCgiZHVkZSIsICJzd2VldCIpOworICAgICAgICBzUmVwbGllci5zZXRJZE1vZGUoSWRNb2RlLkhUTUxfTkFNRV9PUl9SRVNPVVJDRV9JRCk7CisgICAgICAgIHNSZXBsaWVyLmFkZFJlc3BvbnNlKG5ldyBDYW5uZWRGaWxsUmVzcG9uc2UuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldFJlcXVpcmVkU2F2YWJsZUlkcyhTQVZFX0RBVEFfVFlQRV9QQVNTV09SRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhUTUxfTkFNRV9VU0VSTkFNRSwgSFRNTF9OQU1FX1BBU1NXT1JELCBJRF9PVVRTSURFMSwgSURfT1VUU0lERTIpCisgICAgICAgICAgICAgICAgLmFkZERhdGFzZXQobmV3IENhbm5lZERhdGFzZXQuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmllbGQoSFRNTF9OQU1FX1VTRVJOQU1FLCAiZHVkZSIsIGNyZWF0ZVByZXNlbnRhdGlvbigiVVNFUiIpKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpZWxkKEhUTUxfTkFNRV9QQVNTV09SRCwgInN3ZWV0IiwgY3JlYXRlUHJlc2VudGF0aW9uKCJQQVNTIikpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gVHJpZ2dlciBhdXRvZmlsbC4KKyAgICAgICAgbUFjdGl2aXR5LmdldFVzZXJuYW1lSW5wdXQobVVpQm90KS5jbGljaygpOworICAgICAgICBmaW5hbCBGaWxsUmVxdWVzdCBmaWxsUmVxdWVzdDIgPSBzUmVwbGllci5nZXROZXh0RmlsbFJlcXVlc3QoKTsKKyAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlIaWRkZW5FdmVudChtQWN0aXZpdHkubU91dHNpZGUyKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJVU0VSIik7CisgICAgICAgIGZpbmFsIGludCB1c2VybmFtZUNoaWxkSWQgPSBjYWxsYmFjay5hc3NlcnRVaVNob3duRXZlbnRGb3JWaXJ0dWFsQ2hpbGQobXlXZWJWaWV3KTsKKworICAgICAgICAvLyBNb3ZlIGZvY3VzIGFyb3VuZCB0byBtYWtlIHN1cmUgVUkgaXMgc2hvd24gYWNjb3JkaW5nbHkKKyAgICAgICAgbUFjdGl2aXR5LnJ1bk9uVWlUaHJlYWQoKCkgLT4gbUFjdGl2aXR5Lm1PdXRzaWRlMS5yZXF1ZXN0Rm9jdXMoKSk7CisgICAgICAgIGNhbGxiYWNrLmFzc2VydFVpSGlkZGVuRXZlbnQobXlXZWJWaWV3LCB1c2VybmFtZUNoaWxkSWQpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIk9VVDEiKTsKKyAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlTaG93bkV2ZW50KG1BY3Rpdml0eS5tT3V0c2lkZTEpOworCisgICAgICAgIG1BY3Rpdml0eS5ydW5PblVpVGhyZWFkKCgpIC0+IG1BY3Rpdml0eS5tT3V0c2lkZTIucmVxdWVzdEZvY3VzKCkpOworICAgICAgICBjYWxsYmFjay5hc3NlcnRVaUhpZGRlbkV2ZW50KG1BY3Rpdml0eS5tT3V0c2lkZTEpOworICAgICAgICBtVWlCb3QuYXNzZXJ0RGF0YXNldHMoIk9VVDIiKTsKKyAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlTaG93bkV2ZW50KG1BY3Rpdml0eS5tT3V0c2lkZTIpOworCisgICAgICAgIG1BY3Rpdml0eS5nZXRQYXNzd29yZElucHV0KG1VaUJvdCkuY2xpY2soKTsKKyAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlIaWRkZW5FdmVudChtQWN0aXZpdHkubU91dHNpZGUyKTsKKyAgICAgICAgbVVpQm90LmFzc2VydERhdGFzZXRzKCJQQVNTIik7CisgICAgICAgIGZpbmFsIGludCBwYXNzd29yZENoaWxkSWQgPSBjYWxsYmFjay5hc3NlcnRVaVNob3duRXZlbnRGb3JWaXJ0dWFsQ2hpbGQobXlXZWJWaWV3KTsKKworICAgICAgICBtQWN0aXZpdHkucnVuT25VaVRocmVhZCgoKSAtPiBtQWN0aXZpdHkubU91dHNpZGUyLnJlcXVlc3RGb2N1cygpKTsKKyAgICAgICAgY2FsbGJhY2suYXNzZXJ0VWlIaWRkZW5FdmVudChteVdlYlZpZXcsIHBhc3N3b3JkQ2hpbGRJZCk7CisgICAgICAgIGZpbmFsIFVpT2JqZWN0MiBkYXRhc2V0UGlja2VyID0gbVVpQm90LmFzc2VydERhdGFzZXRzKCJPVVQyIik7CisgICAgICAgIGNhbGxiYWNrLmFzc2VydFVpU2hvd25FdmVudChtQWN0aXZpdHkubU91dHNpZGUyKTsKKworICAgICAgICAvLyBBc3NlcnQgc3RydWN0dXJlIHBhc3NlZCB0byBzZXJ2aWNlLgorICAgICAgICBmaW5hbCBWaWV3Tm9kZSB1c2VybmFtZUZpbGxOb2RlID0gSGVscGVyLmZpbmROb2RlQnlIdG1sTmFtZShmaWxsUmVxdWVzdDIuc3RydWN0dXJlLAorICAgICAgICAgICAgICAgIEhUTUxfTkFNRV9VU0VSTkFNRSk7CisgICAgICAgIEhlbHBlci5hc3NlcnRUZXh0SXNTYW5pdGl6ZWQodXNlcm5hbWVGaWxsTm9kZSk7CisgICAgICAgIGFzc2VydFRoYXQodXNlcm5hbWVGaWxsTm9kZS5pc0ZvY3VzZWQoKSkuaXNUcnVlKCk7CisgICAgICAgIGFzc2VydFRoYXQodXNlcm5hbWVGaWxsTm9kZS5nZXRBdXRvZmlsbEhpbnRzKCkpLmFzTGlzdCgpLmNvbnRhaW5zRXhhY3RseSgidXNlcm5hbWUiKTsKKyAgICAgICAgZmluYWwgVmlld05vZGUgcGFzc3dvcmRGaWxsTm9kZSA9IEhlbHBlci5maW5kTm9kZUJ5SHRtbE5hbWUoZmlsbFJlcXVlc3QyLnN0cnVjdHVyZSwKKyAgICAgICAgICAgICAgICBIVE1MX05BTUVfUEFTU1dPUkQpOworICAgICAgICBIZWxwZXIuYXNzZXJ0VGV4dElzU2FuaXRpemVkKHBhc3N3b3JkRmlsbE5vZGUpOworICAgICAgICBhc3NlcnRUaGF0KHBhc3N3b3JkRmlsbE5vZGUuZ2V0QXV0b2ZpbGxIaW50cygpKS5hc0xpc3QoKQorICAgICAgICAgICAgICAgIC5jb250YWluc0V4YWN0bHkoImN1cnJlbnQtcGFzc3dvcmQiKTsKKyAgICAgICAgYXNzZXJ0VGhhdChwYXNzd29yZEZpbGxOb2RlLmlzRm9jdXNlZCgpKS5pc0ZhbHNlKCk7CisKKyAgICAgICAgLy8gQXV0b2ZpbGwgZXh0ZXJuYWwgdmlld3MgKDJuZCBwYXJ0aXRpb24pCisgICAgICAgIG1VaUJvdC5zZWxlY3REYXRhc2V0KGRhdGFzZXRQaWNrZXIsICJPVVQyIik7CisgICAgICAgIGNhbGxiYWNrLmFzc2VydFVpSGlkZGVuRXZlbnQobUFjdGl2aXR5Lm1PdXRzaWRlMik7CisgICAgICAgIG91dHNpZGUxV2F0Y2hlci5hc3NlcnRBdXRvRmlsbGVkKCk7CisgICAgICAgIG91dHNpZGUyV2F0Y2hlci5hc3NlcnRBdXRvRmlsbGVkKCk7CisKKyAgICAgICAgLy8gQXV0b2ZpbGwgV2VidmlldyAoMXN0IHBhcnRpdGlvbikKKyAgICAgICAgbUFjdGl2aXR5LmdldFVzZXJuYW1lSW5wdXQobVVpQm90KS5jbGljaygpOworICAgICAgICBjYWxsYmFjay5hc3NlcnRVaVNob3duRXZlbnRGb3JWaXJ0dWFsQ2hpbGQobXlXZWJWaWV3KTsKKyAgICAgICAgbVVpQm90LnNlbGVjdERhdGFzZXQoIlVTRVIiKTsKKyAgICAgICAgbXlXZWJWaWV3LmFzc2VydEF1dG9maWxsZWQoKTsKKworICAgICAgICAvLyBOb3cgdHJpZ2dlciBzYXZlLgorICAgICAgICBpZiAoSU5KRUNUX0VWRU5UUykgeworICAgICAgICAgICAgbUFjdGl2aXR5LmdldFVzZXJuYW1lSW5wdXQobVVpQm90KS5jbGljaygpOworICAgICAgICAgICAgbUFjdGl2aXR5LmRpc3BhdGNoS2V5UHJlc3MoS2V5RXZlbnQuS0VZQ09ERV9VKTsKKyAgICAgICAgICAgIG1BY3Rpdml0eS5nZXRQYXNzd29yZElucHV0KG1VaUJvdCkuY2xpY2soKTsKKyAgICAgICAgICAgIG1BY3Rpdml0eS5kaXNwYXRjaEtleVByZXNzKEtleUV2ZW50LktFWUNPREVfUCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQWN0aXZpdHkuZ2V0VXNlcm5hbWVJbnB1dChtVWlCb3QpLnNldFRleHQoIkRVREUiKTsKKyAgICAgICAgICAgIG1BY3Rpdml0eS5nZXRQYXNzd29yZElucHV0KG1VaUJvdCkuc2V0VGV4dCgiU1dFRVQiKTsKKyAgICAgICAgfQorICAgICAgICBtQWN0aXZpdHkucnVuT25VaVRocmVhZCgoKSAtPiB7CisgICAgICAgICAgICBtQWN0aXZpdHkubU91dHNpZGUxLnNldFRleHQoIkRVREVSIik7CisgICAgICAgICAgICBtQWN0aXZpdHkubU91dHNpZGUyLnNldFRleHQoIlNXRUVURVIiKTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgbUFjdGl2aXR5LmdldExvZ2luQnV0dG9uKG1VaUJvdCkuY2xpY2soKTsKKworICAgICAgICAvLyBBc3NlcnQgc2F2ZSBVSSBzaG93bi4KKyAgICAgICAgbVVpQm90LnNhdmVGb3JBdXRvZmlsbCh0cnVlLCBTQVZFX0RBVEFfVFlQRV9QQVNTV09SRCk7CisKKyAgICAgICAgLy8gQXNzZXJ0IHJlc3VsdHMKKyAgICAgICAgZmluYWwgU2F2ZVJlcXVlc3Qgc2F2ZVJlcXVlc3QgPSBzUmVwbGllci5nZXROZXh0U2F2ZVJlcXVlc3QoKTsKKyAgICAgICAgZmluYWwgVmlld05vZGUgdXNlcm5hbWVTYXZlTm9kZSA9IEhlbHBlci5maW5kTm9kZUJ5SHRtbE5hbWUoc2F2ZVJlcXVlc3Quc3RydWN0dXJlLAorICAgICAgICAgICAgICAgIEhUTUxfTkFNRV9VU0VSTkFNRSk7CisgICAgICAgIGZpbmFsIFZpZXdOb2RlIHBhc3N3b3JkU2F2ZU5vZGUgPSBIZWxwZXIuZmluZE5vZGVCeUh0bWxOYW1lKHNhdmVSZXF1ZXN0LnN0cnVjdHVyZSwKKyAgICAgICAgICAgICAgICBIVE1MX05BTUVfUEFTU1dPUkQpOworICAgICAgICBpZiAoSU5KRUNUX0VWRU5UUykgeworICAgICAgICAgICAgSGVscGVyLmFzc2VydFRleHRBbmRWYWx1ZSh1c2VybmFtZVNhdmVOb2RlLCAiZHVkZXUiKTsKKyAgICAgICAgICAgIEhlbHBlci5hc3NlcnRUZXh0QW5kVmFsdWUocGFzc3dvcmRTYXZlTm9kZSwgInN3ZWV0cCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgSGVscGVyLmFzc2VydFRleHRBbmRWYWx1ZSh1c2VybmFtZVNhdmVOb2RlLCAiRFVERSIpOworICAgICAgICAgICAgSGVscGVyLmFzc2VydFRleHRBbmRWYWx1ZShwYXNzd29yZFNhdmVOb2RlLCAiU1dFRVQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFZpZXdOb2RlIG91dHNpZGUxU2F2ZU5vZGUgPSBIZWxwZXIuZmluZE5vZGVCeVJlc291cmNlSWQoc2F2ZVJlcXVlc3Quc3RydWN0dXJlLAorICAgICAgICAgICAgICAgIElEX09VVFNJREUxKTsKKyAgICAgICAgSGVscGVyLmFzc2VydFRleHRBbmRWYWx1ZShvdXRzaWRlMVNhdmVOb2RlLCAiRFVERVIiKTsKKyAgICAgICAgZmluYWwgVmlld05vZGUgb3V0c2lkZTJTYXZlTm9kZSA9IEhlbHBlci5maW5kTm9kZUJ5UmVzb3VyY2VJZChzYXZlUmVxdWVzdC5zdHJ1Y3R1cmUsCisgICAgICAgICAgICAgICAgSURfT1VUU0lERTIpOworICAgICAgICBIZWxwZXIuYXNzZXJ0VGV4dEFuZFZhbHVlKG91dHNpZGUyU2F2ZU5vZGUsICJTV0VFVEVSIik7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvV2VsY29tZUFjdGl2aXR5LmphdmEgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9XZWxjb21lQWN0aXZpdHkuamF2YQppbmRleCA1ZDNiYWNhLi5lMWM3MjZhIDEwMDY0NAotLS0gYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9XZWxjb21lQWN0aXZpdHkuamF2YQorKysgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9XZWxjb21lQWN0aXZpdHkuamF2YQpAQCAtMTcsOSArMTcsMTIgQEAKIAogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi50cnV0aC5UcnV0aC5hc3NlcnRXaXRoTWVzc2FnZTsKIAoraW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50U2VuZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTnVsbGFibGU7CiBpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QudWlhdXRvbWF0b3IuVWlPYmplY3QyOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKQEAgLTM1LDkgKzM4LDEyIEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJXZWxjb21lQWN0aXZpdHkiOwogCiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9NRVNTQUdFID0gIm1lc3NhZ2UiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfT1VUUFVUID0gIm91dHB1dCI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9XRUxDT01FID0gIndlbGNvbWUiOwogCi0gICAgcHJpdmF0ZSBUZXh0VmlldyBtT3V0cHV0OworICAgIHByaXZhdGUgc3RhdGljIGludCBzUGVuZGluZ0ludGVudElkOworICAgIHByaXZhdGUgc3RhdGljIFBlbmRpbmdJbnRlbnQgc1BlbmRpbmdJbnRlbnQ7CisKKyAgICBwcml2YXRlIFRleHRWaWV3IG1XZWxjb21lOwogCiAgICAgcHVibGljIFdlbGNvbWVBY3Rpdml0eSgpIHsKICAgICAgICAgc0luc3RhbmNlID0gdGhpczsKQEAgLTQ5LDIyICs1NSwzNCBAQAogCiAgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LndlbGNvbWVfYWN0aXZpdHkpOwogCi0gICAgICAgIG1PdXRwdXQgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLm91dHB1dCk7CisgICAgICAgIG1XZWxjb21lID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC53ZWxjb21lKTsKIAogICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gZ2V0SW50ZW50KCk7CiAgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKEVYVFJBX01FU1NBR0UpOwogCiAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkobWVzc2FnZSkpIHsKLSAgICAgICAgICAgIG1PdXRwdXQuc2V0VGV4dChtZXNzYWdlKTsKKyAgICAgICAgICAgIG1XZWxjb21lLnNldFRleHQobWVzc2FnZSk7CiAgICAgICAgIH0KIAotICAgICAgICBMb2cuZChUQUcsICJPdXRwdXQ6ICIgKyBtT3V0cHV0LmdldFRleHQoKSk7CisgICAgICAgIExvZy5kKFRBRywgIk1lc3NhZ2U6ICIgKyBtZXNzYWdlKTsKICAgICB9CiAKLSAgICBzdGF0aWMgdm9pZCBmaW5pc2hJdCgpIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkRlc3Ryb3koKSB7CisgICAgICAgIHN1cGVyLm9uRGVzdHJveSgpOworCisgICAgICAgIExvZy52KFRBRywgIlNldHRpbmcgc0luc3RhbmNlIHRvIG51bGwgb25EZXN0cm95KCkiKTsKKyAgICAgICAgc0luc3RhbmNlID0gbnVsbDsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBmaW5pc2hJdChVaUJvdCB1aUJvdCkgewogICAgICAgICBpZiAoc0luc3RhbmNlICE9IG51bGwpIHsKICAgICAgICAgICAgIExvZy5kKFRBRywgIlNvIGxvbmcgYW5kIHRoYW5rcyBmb3IgYWxsIHRoZSBmaXNoISIpOwogICAgICAgICAgICAgc0luc3RhbmNlLmZpbmlzaCgpOworICAgICAgICAgICAgdWlCb3QuYXNzZXJ0R29uZUJ5UmVsYXRpdmVJZChJRF9XRUxDT01FLCBUaW1lb3V0cy5BQ1RJVklUWV9SRVNVUlJFQ1RJT04pOworICAgICAgICB9CisgICAgICAgIGlmIChzUGVuZGluZ0ludGVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBzUGVuZGluZ0ludGVudC5jYW5jZWwoKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNzUsMTEgKzkzLDI1IEBACiAKICAgICAvLyBUT0RPOiByZXVzZSBpbiBvdGhlciBwbGFjZXMKICAgICBzdGF0aWMgdm9pZCBhc3NlcnRTaG93aW5nKFVpQm90IHVpQm90LCBATnVsbGFibGUgU3RyaW5nIGV4cGVjdGVkTWVzc2FnZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFVpT2JqZWN0MiBhY3Rpdml0eSA9IHVpQm90LmFzc2VydFNob3duQnlSZWxhdGl2ZUlkKElEX09VVFBVVCk7CisgICAgICAgIGZpbmFsIFVpT2JqZWN0MiBhY3Rpdml0eSA9IHVpQm90LmFzc2VydFNob3duQnlSZWxhdGl2ZUlkKElEX1dFTENPTUUpOwogICAgICAgICBpZiAoZXhwZWN0ZWRNZXNzYWdlID09IG51bGwpIHsKICAgICAgICAgICAgIGV4cGVjdGVkTWVzc2FnZSA9ICJXZWxjb21lIHRvIHRoZSBqdW5nbGUhIjsKICAgICAgICAgfQogICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgid3JvbmcgdGV4dCBvbiAnJXMnIiwgYWN0aXZpdHkpLnRoYXQoYWN0aXZpdHkuZ2V0VGV4dCgpKQogICAgICAgICAgICAgICAgIC5pc0VxdWFsVG8oZXhwZWN0ZWRNZXNzYWdlKTsKICAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEludGVudFNlbmRlciBjcmVhdGVTZW5kZXIoQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICBpZiAoc1BlbmRpbmdJbnRlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQWxyZWFkeSBoYXZlIHBlbmRpbmcgaW50ZW50IChpZD0iCisgICAgICAgICAgICAgICAgICAgICsgc1BlbmRpbmdJbnRlbnRJZCArICIpOiAiICsgc1BlbmRpbmdJbnRlbnQpOworICAgICAgICB9CisgICAgICAgICsrc1BlbmRpbmdJbnRlbnRJZDsKKyAgICAgICAgTG9nLnYoVEFHLCAiY3JlYXRlU2VuZGVyOiBpZD0iICsgc1BlbmRpbmdJbnRlbnRJZCArICIgbWVzc2FnZT0iICsgbWVzc2FnZSk7CisgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KGNvbnRleHQsIFdlbGNvbWVBY3Rpdml0eS5jbGFzcykKKyAgICAgICAgICAgICAgICAucHV0RXh0cmEoRVhUUkFfTUVTU0FHRSwgbWVzc2FnZSkKKyAgICAgICAgICAgICAgICAuc2V0RmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTk9fSElTVE9SWSk7CisgICAgICAgIHNQZW5kaW5nSW50ZW50ID0gUGVuZGluZ0ludGVudC5nZXRBY3Rpdml0eShjb250ZXh0LCBzUGVuZGluZ0ludGVudElkLCBpbnRlbnQsIDApOworICAgICAgICByZXR1cm4gc1BlbmRpbmdJbnRlbnQuZ2V0SW50ZW50U2VuZGVyKCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvY29tbW9uL09uZVRpbWVTZXR0aW5nc0xpc3RlbmVyLmphdmEgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9jb21tb24vT25lVGltZVNldHRpbmdzTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2E3OTU1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvY29tbW9uL09uZVRpbWVTZXR0aW5nc0xpc3RlbmVyLmphdmEKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLmNvbW1vbjsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuY29tbW9uLlNldHRpbmdzSGVscGVyLk5BTUVTUEFDRV9HTE9CQUw7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5jb21tb24uU2V0dGluZ3NIZWxwZXIuTkFNRVNQQUNFX1NFQ1VSRTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKKy8qKgorICogSGVscGVyIHVzZWQgdG8gYmxvY2sgdGVzdHMgdW50aWwgYSBzZWN1cmUgc2V0dGluZ3MgdmFsdWUgaGFzIGJlZW4gdXBkYXRlZC4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE9uZVRpbWVTZXR0aW5nc0xpc3RlbmVyIGV4dGVuZHMgQ29udGVudE9ic2VydmVyIHsKKyAgICBwcml2YXRlIGZpbmFsIENvdW50RG93bkxhdGNoIG1MYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICBwcml2YXRlIGZpbmFsIENvbnRlbnRSZXNvbHZlciBtUmVzb2x2ZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUtleTsKKworICAgIHB1YmxpYyBPbmVUaW1lU2V0dGluZ3NMaXN0ZW5lcihDb250ZXh0IGNvbnRleHQsIFN0cmluZyBrZXkpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBOQU1FU1BBQ0VfU0VDVVJFLCBrZXkpOworICAgIH0KKworICAgIHB1YmxpYyBPbmVUaW1lU2V0dGluZ3NMaXN0ZW5lcihDb250ZXh0IGNvbnRleHQsIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBrZXkpIHsKKyAgICAgICAgc3VwZXIobmV3IEhhbmRsZXIoTG9vcGVyLmdldE1haW5Mb29wZXIoKSkpOworICAgICAgICBtS2V5ID0ga2V5OworICAgICAgICBtUmVzb2x2ZXIgPSBjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOworICAgICAgICBmaW5hbCBVcmkgdXJpOworICAgICAgICBzd2l0Y2ggKG5hbWVzcGFjZSkgeworICAgICAgICAgICAgY2FzZSBOQU1FU1BBQ0VfU0VDVVJFOgorICAgICAgICAgICAgICAgIHVyaSA9IFNldHRpbmdzLlNlY3VyZS5nZXRVcmlGb3Ioa2V5KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTkFNRVNQQUNFX0dMT0JBTDoKKyAgICAgICAgICAgICAgICB1cmkgPSBTZXR0aW5ncy5HbG9iYWwuZ2V0VXJpRm9yKGtleSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgbmFtZXNwYWNlOiAiICsgbmFtZXNwYWNlKTsKKyAgICAgICAgfQorICAgICAgICBtUmVzb2x2ZXIucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIodXJpLCBmYWxzZSwgdGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DaGFuZ2UoYm9vbGVhbiBzZWxmQ2hhbmdlLCBVcmkgdXJpKSB7CisgICAgICAgIG1SZXNvbHZlci51bnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKHRoaXMpOworICAgICAgICBtTGF0Y2guY291bnREb3duKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQmxvY2tzIGZvciBhIGZldyBzZWNvbmRzIHVudGlsIGl0J3MgY2FsbGVkLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgaXQncyBub3QgY2FsbGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFzc2VydENhbGxlZCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gdXBkYXRlZCA9IG1MYXRjaC5hd2FpdCg1LCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICAgICAgICAgIGlmICghdXBkYXRlZCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlNldHRpbmdzICIgKyBtS2V5ICsgIiBub3QgY2FsbGVkIGluIDVzIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJbnRlcnJ1cHRlZCIsIGUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvY29tbW9uL1JFQURNRS50eHQgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9jb21tb24vUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2QzYjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvY29tbW9uL1JFQURNRS50eHQKQEAgLTAsMCArMSwyIEBACitUaGlzIHBhY2thZ2UgY29udGFpbnMgdXRpbGl0aWVzIHRoYXQgYXJlIG5vdCB0aWVkIHRvIEF1dG9maWxsIGFuZCBtaWdodCBldmVudHVhbGx5IG1vdmUgdG8KK2EgY29tbW9uIENUUyBwYWNrYWdlLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL2NvbW1vbi9TZXR0aW5nc0hlbHBlci5qYXZhIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvY29tbW9uL1NldHRpbmdzSGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE5YzU1YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL2NvbW1vbi9TZXR0aW5nc0hlbHBlci5qYXZhCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuY29tbW9uOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5jb21tb24uU2hlbGxIZWxwZXIucnVuU2hlbGxDb21tYW5kOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLnRydXRoLlRydXRoLmFzc2VydFdpdGhNZXNzYWdlOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKKworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTm9uTnVsbDsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk51bGxhYmxlOworCisvKioKKyAqIFByb3ZpZGVzIHV0aWxpdGllcyB0byBpbnRlcmFjdCB3aXRoIHRoZSBkZXZpY2UncyB7QGxpbmsgU2V0dGluZ3N9LgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgU2V0dGluZ3NIZWxwZXIgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFX1NFQ1VSRSA9ICJzZWN1cmUiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRV9HTE9CQUwgPSAiZ2xvYmFsIjsKKworICAgIC8qKgorICAgICAqIFVzZXMgYSBTaGVsbCBjb21tYW5kIHRvIHNldCB0aGUgZ2l2ZW4gcHJlZmVyZW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0KEBOb25OdWxsIFN0cmluZyBuYW1lc3BhY2UsIEBOb25OdWxsIFN0cmluZyBrZXksIEBOdWxsYWJsZSBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIGRlbGV0ZShuYW1lc3BhY2UsIGtleSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgcnVuU2hlbGxDb21tYW5kKCJzZXR0aW5ncyBwdXQgJXMgJXMgJXMgZGVmYXVsdCIsIG5hbWVzcGFjZSwga2V5LCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldChATm9uTnVsbCBTdHJpbmcga2V5LCBATnVsbGFibGUgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHNldChOQU1FU1BBQ0VfU0VDVVJFLCBrZXksIHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2VzIGEgU2hlbGwgY29tbWFuZCB0byBzZXQgdGhlIGdpdmVuIHByZWZlcmVuY2UsIGFuZCB2ZXJpZmllcyBpdCB3YXMgY29ycmVjdGx5IHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc3luY1NldChATm9uTnVsbCBDb250ZXh0IGNvbnRleHQsIEBOb25OdWxsIFN0cmluZyBuYW1lc3BhY2UsCisgICAgICAgICAgICBATm9uTnVsbCBTdHJpbmcga2V5LCBATnVsbGFibGUgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICBzeW5jRGVsZXRlKGNvbnRleHQsIG5hbWVzcGFjZSwga2V5KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFN0cmluZyBjdXJyZW50VmFsdWUgPSBnZXQobmFtZXNwYWNlLCBrZXkpOworICAgICAgICBpZiAodmFsdWUuZXF1YWxzKGN1cnJlbnRWYWx1ZSkpIHsKKyAgICAgICAgICAgIC8vIEFscmVhZHkgc2V0LCBpZ25vcmUKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIE9uZVRpbWVTZXR0aW5nc0xpc3RlbmVyIG9ic2VydmVyID0KKyAgICAgICAgICAgICAgICBuZXcgT25lVGltZVNldHRpbmdzTGlzdGVuZXIoY29udGV4dCwgbmFtZXNwYWNlLCBrZXkpOworICAgICAgICBzZXQobmFtZXNwYWNlLCBrZXksIHZhbHVlKTsKKyAgICAgICAgb2JzZXJ2ZXIuYXNzZXJ0Q2FsbGVkKCk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIG5ld1ZhbHVlID0gZ2V0KG5hbWVzcGFjZSwga2V5KTsKKyAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoImludmFsaWQgdmFsdWUgZm9yICclcycgc2V0dGluZ3MiLCBrZXkpLnRoYXQobmV3VmFsdWUpLmlzRXF1YWxUbyh2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHN5bmNTZXQoQE5vbk51bGwgQ29udGV4dCBjb250ZXh0LCBATm9uTnVsbCBTdHJpbmcga2V5LAorICAgICAgICAgICAgQE51bGxhYmxlIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBzeW5jU2V0KGNvbnRleHQsIE5BTUVTUEFDRV9TRUNVUkUsIGtleSwgdmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZXMgYSBTaGVsbCBjb21tYW5kIHRvIGRlbGV0ZSB0aGUgZ2l2ZW4gcHJlZmVyZW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlKEBOb25OdWxsIFN0cmluZyBuYW1lc3BhY2UsIEBOb25OdWxsIFN0cmluZyBrZXkpIHsKKyAgICAgICAgcnVuU2hlbGxDb21tYW5kKCJzZXR0aW5ncyBkZWxldGUgJXMgJXMiLCBuYW1lc3BhY2UsIGtleSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZShATm9uTnVsbCBTdHJpbmcga2V5KSB7CisgICAgICAgIGRlbGV0ZShOQU1FU1BBQ0VfU0VDVVJFLCBrZXkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZXMgYSBTaGVsbCBjb21tYW5kIHRvIGRlbGV0ZSB0aGUgZ2l2ZW4gcHJlZmVyZW5jZSwgYW5kIHZlcmlmaWVzIGl0IHdhcyBjb3JyZWN0bHkgZGVsZXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc3luY0RlbGV0ZShATm9uTnVsbCBDb250ZXh0IGNvbnRleHQsIEBOb25OdWxsIFN0cmluZyBuYW1lc3BhY2UsCisgICAgICAgICAgICBATm9uTnVsbCBTdHJpbmcga2V5KSB7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGN1cnJlbnRWYWx1ZSA9IGdldChuYW1lc3BhY2UsIGtleSk7CisgICAgICAgIGlmIChjdXJyZW50VmFsdWUgPT0gbnVsbCB8fCBjdXJyZW50VmFsdWUuZXF1YWxzKCJudWxsIikpIHsKKyAgICAgICAgICAgIC8vIEFscmVhZHkgc2V0LCBpZ25vcmUKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIE9uZVRpbWVTZXR0aW5nc0xpc3RlbmVyIG9ic2VydmVyID0gbmV3IE9uZVRpbWVTZXR0aW5nc0xpc3RlbmVyKGNvbnRleHQsIG5hbWVzcGFjZSwKKyAgICAgICAgICAgICAgICBrZXkpOworICAgICAgICBkZWxldGUobmFtZXNwYWNlLCBrZXkpOworICAgICAgICBvYnNlcnZlci5hc3NlcnRDYWxsZWQoKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgbmV3VmFsdWUgPSBnZXQobmFtZXNwYWNlLCBrZXkpOworICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiaW52YWxpZCB2YWx1ZSBmb3IgJyVzJyBzZXR0aW5ncyIsIGtleSkudGhhdChuZXdWYWx1ZSkuaXNFcXVhbFRvKCJudWxsIik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHN5bmNEZWxldGUoQE5vbk51bGwgQ29udGV4dCBjb250ZXh0LCBATm9uTnVsbCBTdHJpbmcga2V5KSB7CisgICAgICAgIHN5bmNEZWxldGUoY29udGV4dCwgTkFNRVNQQUNFX1NFQ1VSRSwga2V5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIGdpdmVuIHByZWZlcmVuY2UgdXNpbmcgU2hlbGwgY29tbWFuZC4KKyAgICAgKi8KKyAgICBATm9uTnVsbAorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldChATm9uTnVsbCBTdHJpbmcgbmFtZXNwYWNlLCBATm9uTnVsbCBTdHJpbmcga2V5KSB7CisgICAgICAgIHJldHVybiBydW5TaGVsbENvbW1hbmQoInNldHRpbmdzIGdldCAlcyAlcyIsIG5hbWVzcGFjZSwga2V5KTsKKyAgICB9CisKKyAgICBATm9uTnVsbAorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldChATm9uTnVsbCBTdHJpbmcga2V5KSB7CisgICAgICAgIHJldHVybiBnZXQoTkFNRVNQQUNFX1NFQ1VSRSwga2V5KTsKKyAgICB9CisKKyAgICBwcml2YXRlIFNldHRpbmdzSGVscGVyKCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNvbnRhaW4gc3RhdGljIG1ldGhvZHMgb25seSIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL2NvbW1vbi9TZXR0aW5nc1N0YXRlQ2hhbmdlclJ1bGUuamF2YSBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL2NvbW1vbi9TZXR0aW5nc1N0YXRlQ2hhbmdlclJ1bGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODQ2ZGNmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvY29tbW9uL1NldHRpbmdzU3RhdGVDaGFuZ2VyUnVsZS5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuY29tbW9uOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk5vbk51bGw7CitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5OdWxsYWJsZTsKKworLyoqCisgKiBKVW5pdCBydWxlIHVzZWQgdG8gc2V0IGEge0BsaW5rIFNldHRpbmdzfSBwcmVmZXJlbmNlIGJlZm9yZSB0aGUgdGVzdCBpcyBydW4uCisgKgorICogPHA+SXQgc3RvcmVzIHRoZSBjdXJyZW50IHZhbHVlIGJlZm9yZSB0aGUgdGVzdCwgY2hhbmdlcyBpdCAoaWYgbmVjZXNzYXJ5KSwgdGhlbiByZXN0b3JlcyBpdCBhZnRlcgorICogdGhlIHRlc3QgKGlmIG5lY2Vzc2FyeSkuCisgKi8KK3B1YmxpYyBjbGFzcyBTZXR0aW5nc1N0YXRlQ2hhbmdlclJ1bGUgZXh0ZW5kcyBTdGF0ZUNoYW5nZXJSdWxlPFN0cmluZz4geworCisgICAgLyoqCisgICAgICogRGVmYXVsdCBjb25zdHJ1Y3RvciBmb3IgdGhlICdzZWN1cmUnIGNvbnRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBjb250ZXh0IHVzZWQgdG8gcmV0cmlldmUgdGhlIHtAbGluayBTZXR0aW5nc30gcHJvdmlkZXIuCisgICAgICogQHBhcmFtIGtleSBwcmVmZW5jZSBrZXkuCisgICAgICogQHBhcmFtIHZhbHVlIHZhbHVlIHRvIGJlIHNldCBiZWZvcmUgdGhlIHRlc3QgaXMgcnVuLgorICAgICAqLworICAgIHB1YmxpYyBTZXR0aW5nc1N0YXRlQ2hhbmdlclJ1bGUoQE5vbk51bGwgQ29udGV4dCBjb250ZXh0LCBATm9uTnVsbCBTdHJpbmcga2V5LAorICAgICAgICAgICAgQE51bGxhYmxlIFN0cmluZyB2YWx1ZSkgeworICAgICAgICB0aGlzKGNvbnRleHQsIFNldHRpbmdzSGVscGVyLk5BTUVTUEFDRV9TRUNVUkUsIGtleSwgdmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBjb250ZXh0IHVzZWQgdG8gcmV0cmlldmUgdGhlIHtAbGluayBTZXR0aW5nc30gcHJvdmlkZXIuCisgICAgICogQHBhcmFtIG5hbWVzcGFjZSBzZXR0aW5ncyBuYW1lc3BhY2UuCisgICAgICogQHBhcmFtIGtleSBwcmVmZW5jZSBrZXkuCisgICAgICogQHBhcmFtIHZhbHVlIHZhbHVlIHRvIGJlIHNldCBiZWZvcmUgdGhlIHRlc3QgaXMgcnVuLgorICAgICAqLworICAgIHB1YmxpYyBTZXR0aW5nc1N0YXRlQ2hhbmdlclJ1bGUoQE5vbk51bGwgQ29udGV4dCBjb250ZXh0LCBATm9uTnVsbCBTdHJpbmcgbmFtZXNwYWNlLAorICAgICAgICAgICAgQE5vbk51bGwgU3RyaW5nIGtleSwgQE51bGxhYmxlIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBzdXBlcihuZXcgU2V0dGluZ3NTdGF0ZU1hbmFnZXIoY29udGV4dCwgbmFtZXNwYWNlLCBrZXkpLCB2YWx1ZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvY29tbW9uL1NldHRpbmdzU3RhdGVLZWVwZXJSdWxlLmphdmEgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9jb21tb24vU2V0dGluZ3NTdGF0ZUtlZXBlclJ1bGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjUyN2JiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvY29tbW9uL1NldHRpbmdzU3RhdGVLZWVwZXJSdWxlLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5jb21tb247CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTm9uTnVsbDsKKworLyoqCisgKiBKVW5pdCBydWxlIHVzZWQgdG8gcmVzdG9yZSBhIHtAbGluayBTZXR0aW5nc30gcHJlZmVyZW5jZSBhZnRlciB0aGUgdGVzdCBpcyBydW4uCisgKgorICogPHA+SXQgc3RvcmVzIHRoZSBjdXJyZW50IHZhbHVlIGJlZm9yZSB0aGUgdGVzdCwgYW5kIHJlc3RvcmVzIGl0IGFmdGVyIHRoZSB0ZXN0IChpZiBuZWNlc3NhcnkpLgorICovCitwdWJsaWMgY2xhc3MgU2V0dGluZ3NTdGF0ZUtlZXBlclJ1bGUgZXh0ZW5kcyBTdGF0ZUtlZXBlclJ1bGU8U3RyaW5nPiB7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgY29udGV4dCB1c2VkIHRvIHJldHJpZXZlIHRoZSB7QGxpbmsgU2V0dGluZ3N9IHByb3ZpZGVyLgorICAgICAqIEBwYXJhbSBrZXkgcHJlZmVuY2Uga2V5LgorICAgICAqLworICAgIHB1YmxpYyBTZXR0aW5nc1N0YXRlS2VlcGVyUnVsZShATm9uTnVsbCBDb250ZXh0IGNvbnRleHQsIEBOb25OdWxsIFN0cmluZyBrZXkpIHsKKyAgICAgICAgc3VwZXIobmV3IFNldHRpbmdzU3RhdGVNYW5hZ2VyKGNvbnRleHQsIFNldHRpbmdzSGVscGVyLk5BTUVTUEFDRV9TRUNVUkUsIGtleSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL2NvbW1vbi9TZXR0aW5nc1N0YXRlTWFuYWdlci5qYXZhIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvY29tbW9uL1NldHRpbmdzU3RhdGVNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdmNTU3YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL2NvbW1vbi9TZXR0aW5nc1N0YXRlTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5jb21tb247CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTm9uTnVsbDsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk51bGxhYmxlOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zOworCisvKioKKyAqIE1hbmFnZXMgdGhlIHN0YXRlIG9mIGEgcHJlZmVyZW5jZSBiYWNrZWQgYnkge0BsaW5rIFNldHRpbmdzfS4KKyAqLworcHVibGljIGNsYXNzIFNldHRpbmdzU3RhdGVNYW5hZ2VyIGltcGxlbWVudHMgU3RhdGVNYW5hZ2VyPFN0cmluZz4geworCisgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1OYW1lc3BhY2U7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUtleTsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBjb250ZXh0IHVzZWQgdG8gcmV0cmlldmUgdGhlIHtAbGluayBTZXR0aW5nc30gcHJvdmlkZXIuCisgICAgICogQHBhcmFtIG5hbWVzcGFjZSBzZXR0aW5ncyBuYW1lc3BhY2UuCisgICAgICogQHBhcmFtIGtleSBwcmVmZW5jZSBrZXkuCisgICAgICovCisgICAgcHVibGljIFNldHRpbmdzU3RhdGVNYW5hZ2VyKEBOb25OdWxsIENvbnRleHQgY29udGV4dCwgQE5vbk51bGwgU3RyaW5nIG5hbWVzcGFjZSwKKyAgICAgICAgICAgIEBOb25OdWxsIFN0cmluZyBrZXkpIHsKKyAgICAgICAgbUNvbnRleHQgPSBQcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbChjb250ZXh0KTsKKyAgICAgICAgbU5hbWVzcGFjZSA9IFByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsKG5hbWVzcGFjZSk7CisgICAgICAgIG1LZXkgPSBQcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbChrZXkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldChATnVsbGFibGUgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIFNldHRpbmdzSGVscGVyLnN5bmNTZXQobUNvbnRleHQsIG1OYW1lc3BhY2UsIG1LZXksIHZhbHVlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBATnVsbGFibGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgcmV0dXJuIFNldHRpbmdzSGVscGVyLmdldChtTmFtZXNwYWNlLCBtS2V5KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIlNldHRpbmdzU3RhdGVNYW5hZ2VyW25hbWVzcGFjZT0iICsgbU5hbWVzcGFjZSArICIsIGtleT0iICsgbUtleSArICJdIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9jb21tb24vU2hlbGxIZWxwZXIuamF2YSBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL2NvbW1vbi9TaGVsbEhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNDJiNTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9jb21tb24vU2hlbGxIZWxwZXIuamF2YQpAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuY29tbW9uOworCitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5Ob25OdWxsOworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlN5c3RlbVV0aWw7CisKKy8qKgorICogUHJvdmlkZXMgU2hlbGwtYmFzZWQgdXRpbGl0aWVzIHN1Y2ggYXMgcnVubmluZyBhIGNvbW1hbmQuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTaGVsbEhlbHBlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlNoZWxsSGVscGVyIjsKKworICAgIC8qKgorICAgICAqIFJ1bnMgYSBTaGVsbCBjb21tYW5kLCByZXR1cm5pbmcgYSB0cmltbWVkIHJlc3BvbnNlLgorICAgICAqLworICAgIEBOb25OdWxsCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcnVuU2hlbGxDb21tYW5kKEBOb25OdWxsIFN0cmluZyB0ZW1wbGF0ZSwgT2JqZWN0Li4uYXJncykgeworICAgICAgICBmaW5hbCBTdHJpbmcgY29tbWFuZCA9IFN0cmluZy5mb3JtYXQodGVtcGxhdGUsIGFyZ3MpOworICAgICAgICBMb2cuZChUQUcsICJydW5TaGVsbENvbW1hbmQoKTogIiArIGNvbW1hbmQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdCA9IFN5c3RlbVV0aWwKKyAgICAgICAgICAgICAgICAgICAgLnJ1blNoZWxsQ29tbWFuZChJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKSwgY29tbWFuZCk7CisgICAgICAgICAgICByZXR1cm4gVGV4dFV0aWxzLmlzRW1wdHkocmVzdWx0KSA/ICIiIDogcmVzdWx0LnRyaW0oKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDb21tYW5kICciICsgY29tbWFuZCArICInIGZhaWxlZDogIiwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUYXAgb24gdGhlIHZpZXcgY2VudGVyLCBpdCBtYXkgY2hhbmdlIHdpbmRvdyBmb2N1cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGFwKFZpZXcgdmlldykgeworICAgICAgICBmaW5hbCBpbnRbXSB4eSA9IG5ldyBpbnRbMl07CisgICAgICAgIHZpZXcuZ2V0TG9jYXRpb25PblNjcmVlbih4eSk7CisgICAgICAgIGZpbmFsIGludCB2aWV3V2lkdGggPSB2aWV3LmdldFdpZHRoKCk7CisgICAgICAgIGZpbmFsIGludCB2aWV3SGVpZ2h0ID0gdmlldy5nZXRIZWlnaHQoKTsKKyAgICAgICAgZmluYWwgaW50IHggPSAoaW50KSAoeHlbMF0gKyAodmlld1dpZHRoIC8gMi4wZikpOworICAgICAgICBmaW5hbCBpbnQgeSA9IChpbnQpICh4eVsxXSArICh2aWV3SGVpZ2h0IC8gMi4wZikpOworCisgICAgICAgIHJ1blNoZWxsQ29tbWFuZCgiaW5wdXQgdG91Y2hzY3JlZW4gdGFwICVkICVkIiwgeCwgeSk7CisgICAgfQorCisKKyAgICBwcml2YXRlIFNoZWxsSGVscGVyKCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNvbnRhaW4gc3RhdGljIG1ldGhvZHMgb25seSIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL2NvbW1vbi9TdGF0ZUNoYW5nZXJSdWxlLmphdmEgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9jb21tb24vU3RhdGVDaGFuZ2VyUnVsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NDVmZjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9jb21tb24vU3RhdGVDaGFuZ2VyUnVsZS5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5jb21tb247CisKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk5vbk51bGw7CitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5OdWxsYWJsZTsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9uczsKKworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5UZXN0UnVsZTsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLkRlc2NyaXB0aW9uOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLm1vZGVsLlN0YXRlbWVudDsKKworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworCisvKioKKyAqIEpVbml0IHJ1bGUgdXNlZCB0byBwcmVwYXJlIGEgc3RhdGUgYmVmb3JlIHRoZSB0ZXN0IGlzIHJ1bi4KKyAqCisgKiA8cD5JdCBzdG9yZXMgdGhlIGN1cnJlbnQgc3RhdGUgYmVmb3JlIHRoZSB0ZXN0LCBjaGFuZ2VzIGl0IChpZiBuZWNlc3NhcnkpLCB0aGVuIHJlc3RvcmVzIGl0IGFmdGVyCisgKiB0aGUgdGVzdCAoaWYgbmVjZXNzYXJ5KS4KKyAqLworcHVibGljIGNsYXNzIFN0YXRlQ2hhbmdlclJ1bGU8VD4gaW1wbGVtZW50cyBUZXN0UnVsZSB7CisKKyAgICBwcml2YXRlIGZpbmFsIFN0YXRlTWFuYWdlcjxUPiBtU3RhdGVNYW5hZ2VyOworICAgIHByaXZhdGUgZmluYWwgVCBtVmFsdWU7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIHN0YXRlTWFuYWdlciBhYnN0cmFjdGlvbiB1c2VkIHRvIG1hbmdlIHRoZSBzdGF0ZS4KKyAgICAgKiBAcGFyYW0gdmFsdWUgdmFsdWUgdG8gYmUgc2V0IGJlZm9yZSB0aGUgdGVzdCBpcyBydW4uCisgICAgICovCisgICAgcHVibGljIFN0YXRlQ2hhbmdlclJ1bGUoQE5vbk51bGwgU3RhdGVNYW5hZ2VyPFQ+IHN0YXRlTWFuYWdlciwgQE51bGxhYmxlIFQgdmFsdWUpIHsKKyAgICAgICAgbVN0YXRlTWFuYWdlciA9IFByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsKHN0YXRlTWFuYWdlcik7CisgICAgICAgIG1WYWx1ZSA9IHZhbHVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdGF0ZW1lbnQgYXBwbHkoU3RhdGVtZW50IGJhc2UsIERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7CisgICAgICAgIHJldHVybiBuZXcgU3RhdGVtZW50KCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGV2YWx1YXRlKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgICAgICAgICAgZmluYWwgVCBwcmV2aW91c1ZhbHVlID0gbVN0YXRlTWFuYWdlci5nZXQoKTsKKyAgICAgICAgICAgICAgICBpZiAoIU9iamVjdHMuZXF1YWxzKHByZXZpb3VzVmFsdWUsIG1WYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRlTWFuYWdlci5zZXQobVZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgYmFzZS5ldmFsdWF0ZSgpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFQgY3VycmVudFZhbHVlID0gbVN0YXRlTWFuYWdlci5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFPYmplY3RzLmVxdWFscyhjdXJyZW50VmFsdWUsIHByZXZpb3VzVmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdGVNYW5hZ2VyLnNldChwcmV2aW91c1ZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGlmIHNldCgpIHRob3ducyBhIFJ1bnRpbWVFeGNlcHRpb24sIEpVbml0IHdpbGwgc2lsZW50bHkgY2F0Y2ggaXQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCByZS1ydW4gdGhlIHRlc3QgY2FzZTsgaXQgc2hvdWxkIGZhaWwgaW5zdGVhZC4KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9jb21tb24vU3RhdGVDaGFuZ2VyUnVsZVRlc3QuamF2YSBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL2NvbW1vbi9TdGF0ZUNoYW5nZXJSdWxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MDRjZjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9jb21tb24vU3RhdGVDaGFuZ2VyUnVsZVRlc3QuamF2YQpAQCAtMCwwICsxLDE3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hdXRvZmlsbHNlcnZpY2UuY3RzLmNvbW1vbjsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi50cnV0aC5UcnV0aC5hc3NlcnRUaGF0OworCitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLkFyZ3VtZW50TWF0Y2hlcnMuYW55U3RyaW5nOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLmRvVGhyb3c7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ubmV2ZXI7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8udGltZXM7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8udmVyaWZ5OworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnZlcmlmeU5vTW9yZUludGVyYWN0aW9uczsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by53aGVuOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnRUaHJvd3M7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0LmV4cGVjdFRocm93czsKKworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuRGVzY3JpcHRpb247CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLm1vZGVsLlN0YXRlbWVudDsKK2ltcG9ydCBvcmcubW9ja2l0by5Nb2NrOworaW1wb3J0IG9yZy5tb2NraXRvLmp1bml0Lk1vY2tpdG9KVW5pdFJ1bm5lcjsKKworQFJ1bldpdGgoTW9ja2l0b0pVbml0UnVubmVyLmNsYXNzKQorQEFwcE1vZGVGdWxsIC8vIFVuaXQgdGVzdAorcHVibGljIGNsYXNzIFN0YXRlQ2hhbmdlclJ1bGVUZXN0IHsKKworICAgIHByaXZhdGUgZmluYWwgUnVudGltZUV4Y2VwdGlvbiBtUnVudGltZUV4Y2VwdGlvbiA9IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJEJ09IIik7CisgICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdGlvbiBtRGVzY3JpcHRpb24gPSBEZXNjcmlwdGlvbi5jcmVhdGVTdWl0ZURlc2NyaXB0aW9uKCJXaGF0ZXZlciIpOworCisgICAgQE1vY2sKKyAgICBwcml2YXRlIFN0YXRlTWFuYWdlcjxTdHJpbmc+IG1TdGF0ZU1hbmFnZXI7CisKKyAgICBATW9jaworICAgIHByaXZhdGUgU3RhdGVtZW50IG1TdGF0ZW1lbnQ7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQ29uc3RydWN0b3IoKSB7CisgICAgICAgIGFzc2VydFRocm93cyhOdWxsUG9pbnRlckV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAoKSAtPiBuZXcgU3RhdGVDaGFuZ2VyUnVsZTxPYmplY3Q+KG51bGwsICJ2YWx1ZSIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRBbmRSZXN0b3JlT25TdWNjZXNzKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGZpbmFsIFN0YXRlQ2hhbmdlclJ1bGU8U3RyaW5nPiBydWxlID0gbmV3IFN0YXRlQ2hhbmdlclJ1bGU8PihtU3RhdGVNYW5hZ2VyLAorICAgICAgICAgICAgICAgICJuZXdWYWx1ZSIpOworICAgICAgICB3aGVuKG1TdGF0ZU1hbmFnZXIuZ2V0KCkpLnRoZW5SZXR1cm4oImJlZm9yZSIsICJjaGFuZ2VkIik7CisKKyAgICAgICAgcnVsZS5hcHBseShtU3RhdGVtZW50LCBtRGVzY3JpcHRpb24pLmV2YWx1YXRlKCk7CisKKyAgICAgICAgdmVyaWZ5KG1TdGF0ZW1lbnQsIHRpbWVzKDEpKS5ldmFsdWF0ZSgpOworICAgICAgICB2ZXJpZnkobVN0YXRlTWFuYWdlciwgdGltZXMoMikpLmdldCgpOyAvLyBOZWVkZWQgYmVjYXVzZSBvZiB2ZXJpZnlOb01vcmVJbnRlcmFjdGlvbnMoKQorICAgICAgICB2ZXJpZnkobVN0YXRlTWFuYWdlciwgdGltZXMoMSkpLnNldCgibmV3VmFsdWUiKTsKKyAgICAgICAgdmVyaWZ5KG1TdGF0ZU1hbmFnZXIsIHRpbWVzKDEpKS5zZXQoImJlZm9yZSIpOworICAgICAgICB2ZXJpZnlOb01vcmVJbnRlcmFjdGlvbnMobVN0YXRlTWFuYWdlcik7IC8vIE1ha2Ugc3VyZSBzZXQoKSB3YXMgbm90IGNhbGxlZCBhZ2FpbgorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERvbnRTZXRJZlNhbWVWYWx1ZU9uU3VjY2VzcygpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBmaW5hbCBTdGF0ZUNoYW5nZXJSdWxlPFN0cmluZz4gcnVsZSA9IG5ldyBTdGF0ZUNoYW5nZXJSdWxlPD4obVN0YXRlTWFuYWdlciwKKyAgICAgICAgICAgICAgICAic2FtZVZhbHVlIik7CisgICAgICAgIHdoZW4obVN0YXRlTWFuYWdlci5nZXQoKSkudGhlblJldHVybigic2FtZVZhbHVlIik7CisKKyAgICAgICAgcnVsZS5hcHBseShtU3RhdGVtZW50LCBtRGVzY3JpcHRpb24pLmV2YWx1YXRlKCk7CisKKyAgICAgICAgdmVyaWZ5KG1TdGF0ZW1lbnQsIHRpbWVzKDEpKS5ldmFsdWF0ZSgpOworICAgICAgICB2ZXJpZnkobVN0YXRlTWFuYWdlciwgbmV2ZXIoKSkuc2V0KGFueVN0cmluZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRCdXREb250UmVzdG9yZUlmU2FtZVZhbHVlT25TdWNjZXNzKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGZpbmFsIFN0YXRlQ2hhbmdlclJ1bGU8U3RyaW5nPiBydWxlID0gbmV3IFN0YXRlQ2hhbmdlclJ1bGU8PihtU3RhdGVNYW5hZ2VyLAorICAgICAgICAgICAgICAgICJuZXdWYWx1ZSIpOworICAgICAgICB3aGVuKG1TdGF0ZU1hbmFnZXIuZ2V0KCkpLnRoZW5SZXR1cm4oImJlZm9yZSIsICJiZWZvcmUiKTsKKworICAgICAgICBydWxlLmFwcGx5KG1TdGF0ZW1lbnQsIG1EZXNjcmlwdGlvbikuZXZhbHVhdGUoKTsKKworICAgICAgICB2ZXJpZnkobVN0YXRlbWVudCwgdGltZXMoMSkpLmV2YWx1YXRlKCk7CisgICAgICAgIHZlcmlmeShtU3RhdGVNYW5hZ2VyLCB0aW1lcygyKSkuZ2V0KCk7IC8vIE5lZWRlZCBiZWNhdXNlIG9mIHZlcmlmeU5vTW9yZUludGVyYWN0aW9ucygpCisgICAgICAgIHZlcmlmeShtU3RhdGVNYW5hZ2VyLCB0aW1lcygxKSkuc2V0KCJuZXdWYWx1ZSIpOworICAgICAgICB2ZXJpZnlOb01vcmVJbnRlcmFjdGlvbnMobVN0YXRlTWFuYWdlcik7IC8vIE1ha2Ugc3VyZSBzZXQoKSB3YXMgbm90IGNhbGxlZCBhZ2FpbgorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERvbnRTZXRCdXRSZXN0b3JlSWZWYWx1ZUNoYW5nZWRPblN1Y2Nlc3MoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgZmluYWwgU3RhdGVDaGFuZ2VyUnVsZTxTdHJpbmc+IHJ1bGUgPSBuZXcgU3RhdGVDaGFuZ2VyUnVsZTw+KG1TdGF0ZU1hbmFnZXIsCisgICAgICAgICAgICAgICAgInNhbWVWYWx1ZSIpOworICAgICAgICB3aGVuKG1TdGF0ZU1hbmFnZXIuZ2V0KCkpLnRoZW5SZXR1cm4oInNhbWVWYWx1ZSIsICJjaGFuZ2VkIik7CisKKyAgICAgICAgcnVsZS5hcHBseShtU3RhdGVtZW50LCBtRGVzY3JpcHRpb24pLmV2YWx1YXRlKCk7CisKKyAgICAgICAgdmVyaWZ5KG1TdGF0ZU1hbmFnZXIsIHRpbWVzKDIpKS5nZXQoKTsgLy8gTmVlZGVkIGJlY2F1c2Ugb2YgdmVyaWZ5Tm9Nb3JlSW50ZXJhY3Rpb25zKCkKKyAgICAgICAgdmVyaWZ5KG1TdGF0ZW1lbnQsIHRpbWVzKDEpKS5ldmFsdWF0ZSgpOworICAgICAgICB2ZXJpZnkobVN0YXRlTWFuYWdlciwgdGltZXMoMSkpLnNldCgic2FtZVZhbHVlIik7CisgICAgICAgIHZlcmlmeU5vTW9yZUludGVyYWN0aW9ucyhtU3RhdGVNYW5hZ2VyKTsgLy8gTWFrZSBzdXJlIHNldCgpIHdhcyBub3QgY2FsbGVkIGFnYWluCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0QW5kUmVzdG9yZU9uRmFpbHVyZSgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBmaW5hbCBTdGF0ZUNoYW5nZXJSdWxlPFN0cmluZz4gcnVsZSA9IG5ldyBTdGF0ZUNoYW5nZXJSdWxlPD4obVN0YXRlTWFuYWdlciwKKyAgICAgICAgICAgICAgICAibmV3VmFsdWUiKTsKKyAgICAgICAgd2hlbihtU3RhdGVNYW5hZ2VyLmdldCgpKS50aGVuUmV0dXJuKCJiZWZvcmUiLCAiY2hhbmdlZCIpOworICAgICAgICBkb1Rocm93KG1SdW50aW1lRXhjZXB0aW9uKS53aGVuKG1TdGF0ZW1lbnQpLmV2YWx1YXRlKCk7CisKKyAgICAgICAgZmluYWwgUnVudGltZUV4Y2VwdGlvbiBhY3R1YWxFeGNlcHRpb24gPSBleHBlY3RUaHJvd3MoUnVudGltZUV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAoKSAtPiBydWxlLmFwcGx5KG1TdGF0ZW1lbnQsIG1EZXNjcmlwdGlvbikuZXZhbHVhdGUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoYWN0dWFsRXhjZXB0aW9uKS5pc1NhbWVBcyhtUnVudGltZUV4Y2VwdGlvbik7CisKKyAgICAgICAgdmVyaWZ5KG1TdGF0ZU1hbmFnZXIsIHRpbWVzKDIpKS5nZXQoKTsgLy8gTmVlZGVkIGJlY2F1c2Ugb2YgdmVyaWZ5Tm9Nb3JlSW50ZXJhY3Rpb25zKCkKKyAgICAgICAgdmVyaWZ5KG1TdGF0ZU1hbmFnZXIsIHRpbWVzKDEpKS5zZXQoIm5ld1ZhbHVlIik7CisgICAgICAgIHZlcmlmeShtU3RhdGVNYW5hZ2VyLCB0aW1lcygxKSkuc2V0KCJiZWZvcmUiKTsKKyAgICAgICAgdmVyaWZ5Tm9Nb3JlSW50ZXJhY3Rpb25zKG1TdGF0ZU1hbmFnZXIpOyAvLyBNYWtlIHN1cmUgc2V0KCkgd2FzIG5vdCBjYWxsZWQgYWdhaW4KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REb250U2V0SWZTYW1lVmFsdWVPbkZhaWx1cmUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgZmluYWwgU3RhdGVDaGFuZ2VyUnVsZTxTdHJpbmc+IHJ1bGUgPSBuZXcgU3RhdGVDaGFuZ2VyUnVsZTw+KG1TdGF0ZU1hbmFnZXIsCisgICAgICAgICAgICAgICAgInNhbWVWYWx1ZSIpOworICAgICAgICB3aGVuKG1TdGF0ZU1hbmFnZXIuZ2V0KCkpLnRoZW5SZXR1cm4oInNhbWVWYWx1ZSIpOworICAgICAgICBkb1Rocm93KG1SdW50aW1lRXhjZXB0aW9uKS53aGVuKG1TdGF0ZW1lbnQpLmV2YWx1YXRlKCk7CisKKyAgICAgICAgZmluYWwgUnVudGltZUV4Y2VwdGlvbiBhY3R1YWxFeGNlcHRpb24gPSBleHBlY3RUaHJvd3MoUnVudGltZUV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAoKSAtPiBydWxlLmFwcGx5KG1TdGF0ZW1lbnQsIG1EZXNjcmlwdGlvbikuZXZhbHVhdGUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoYWN0dWFsRXhjZXB0aW9uKS5pc1NhbWVBcyhtUnVudGltZUV4Y2VwdGlvbik7CisKKyAgICAgICAgdmVyaWZ5KG1TdGF0ZU1hbmFnZXIsIG5ldmVyKCkpLnNldChhbnlTdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0QnV0RG9udFJlc3RvcmVJZlNhbWVWYWx1ZU9uRmFpbHVyZSgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBmaW5hbCBTdGF0ZUNoYW5nZXJSdWxlPFN0cmluZz4gcnVsZSA9IG5ldyBTdGF0ZUNoYW5nZXJSdWxlPD4obVN0YXRlTWFuYWdlciwKKyAgICAgICAgICAgICAgICAibmV3VmFsdWUiKTsKKyAgICAgICAgd2hlbihtU3RhdGVNYW5hZ2VyLmdldCgpKS50aGVuUmV0dXJuKCJiZWZvcmUiLCAiYmVmb3JlIik7CisgICAgICAgIGRvVGhyb3cobVJ1bnRpbWVFeGNlcHRpb24pLndoZW4obVN0YXRlbWVudCkuZXZhbHVhdGUoKTsKKworICAgICAgICBmaW5hbCBSdW50aW1lRXhjZXB0aW9uIGFjdHVhbEV4Y2VwdGlvbiA9IGV4cGVjdFRocm93cyhSdW50aW1lRXhjZXB0aW9uLmNsYXNzLAorICAgICAgICAgICAgICAgICgpIC0+IHJ1bGUuYXBwbHkobVN0YXRlbWVudCwgbURlc2NyaXB0aW9uKS5ldmFsdWF0ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChhY3R1YWxFeGNlcHRpb24pLmlzU2FtZUFzKG1SdW50aW1lRXhjZXB0aW9uKTsKKworICAgICAgICB2ZXJpZnkobVN0YXRlTWFuYWdlciwgdGltZXMoMikpLmdldCgpOyAvLyBOZWVkZWQgYmVjYXVzZSBvZiB2ZXJpZnlOb01vcmVJbnRlcmFjdGlvbnMoKQorICAgICAgICB2ZXJpZnkobVN0YXRlTWFuYWdlciwgdGltZXMoMSkpLnNldCgibmV3VmFsdWUiKTsKKyAgICAgICAgdmVyaWZ5Tm9Nb3JlSW50ZXJhY3Rpb25zKG1TdGF0ZU1hbmFnZXIpOyAvLyBNYWtlIHN1cmUgc2V0KCkgd2FzIG5vdCBjYWxsZWQgYWdhaW4KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REb250U2V0QnV0UmVzdG9yZUlmVmFsdWVDaGFuZ2VkT25GYWlsdXJlKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGZpbmFsIFN0YXRlQ2hhbmdlclJ1bGU8U3RyaW5nPiBydWxlID0gbmV3IFN0YXRlQ2hhbmdlclJ1bGU8PihtU3RhdGVNYW5hZ2VyLAorICAgICAgICAgICAgICAgICJzYW1lVmFsdWUiKTsKKyAgICAgICAgd2hlbihtU3RhdGVNYW5hZ2VyLmdldCgpKS50aGVuUmV0dXJuKCJzYW1lVmFsdWUiLCAiY2hhbmdlZCIpOworICAgICAgICBkb1Rocm93KG1SdW50aW1lRXhjZXB0aW9uKS53aGVuKG1TdGF0ZW1lbnQpLmV2YWx1YXRlKCk7CisKKyAgICAgICAgZmluYWwgUnVudGltZUV4Y2VwdGlvbiBhY3R1YWxFeGNlcHRpb24gPSBleHBlY3RUaHJvd3MoUnVudGltZUV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAoKSAtPiBydWxlLmFwcGx5KG1TdGF0ZW1lbnQsIG1EZXNjcmlwdGlvbikuZXZhbHVhdGUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoYWN0dWFsRXhjZXB0aW9uKS5pc1NhbWVBcyhtUnVudGltZUV4Y2VwdGlvbik7CisKKyAgICAgICAgdmVyaWZ5KG1TdGF0ZU1hbmFnZXIsIHRpbWVzKDIpKS5nZXQoKTsgLy8gTmVlZGVkIGJlY2F1c2Ugb2YgdmVyaWZ5Tm9Nb3JlSW50ZXJhY3Rpb25zKCkKKyAgICAgICAgdmVyaWZ5KG1TdGF0ZU1hbmFnZXIsIHRpbWVzKDEpKS5zZXQoInNhbWVWYWx1ZSIpOworICAgICAgICB2ZXJpZnlOb01vcmVJbnRlcmFjdGlvbnMobVN0YXRlTWFuYWdlcik7IC8vIE1ha2Ugc3VyZSBzZXQoKSB3YXMgbm90IGNhbGxlZCBhZ2FpbgorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL2NvbW1vbi9TdGF0ZUtlZXBlclJ1bGUuamF2YSBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL2NvbW1vbi9TdGF0ZUtlZXBlclJ1bGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Nzk2M2QxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvY29tbW9uL1N0YXRlS2VlcGVyUnVsZS5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5jb21tb247CisKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk5vbk51bGw7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnM7CisKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVzdFJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5EZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5tb2RlbC5TdGF0ZW1lbnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKKworLyoqCisgKiBKVW5pdCBydWxlIHVzZWQgdG8gcmVzdG9yZSBhIHN0YXRlIGFmdGVyIHRoZSB0ZXN0IGlzIHJ1bi4KKyAqCisgKiA8cD5JdCBzdG9yZXMgdGhlIGN1cnJlbnQgc3RhdGUgYmVmb3JlIHRoZSB0ZXN0LCBhbmQgcmVzdG9yZXMgaXQgYWZ0ZXIgdGhlIHRlc3QgKGlmIG5lY2Vzc2FyeSkuCisgKi8KK3B1YmxpYyBjbGFzcyBTdGF0ZUtlZXBlclJ1bGU8VD4gaW1wbGVtZW50cyBUZXN0UnVsZSB7CisKKyAgICBwcml2YXRlIGZpbmFsIFN0YXRlTWFuYWdlcjxUPiBtU3RhdGVNYW5hZ2VyOworCisgICAgLyoqCisgICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdGF0ZU1hbmFnZXIgYWJzdHJhY3Rpb24gdXNlZCB0byBtYW5nZSB0aGUgc3RhdGUuCisgICAgICovCisgICAgcHVibGljIFN0YXRlS2VlcGVyUnVsZShATm9uTnVsbCBTdGF0ZU1hbmFnZXI8VD4gc3RhdGVNYW5hZ2VyKSB7CisgICAgICAgIG1TdGF0ZU1hbmFnZXIgPSBQcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbChzdGF0ZU1hbmFnZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdGF0ZW1lbnQgYXBwbHkoU3RhdGVtZW50IGJhc2UsIERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7CisgICAgICAgIHJldHVybiBuZXcgU3RhdGVtZW50KCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGV2YWx1YXRlKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgICAgICAgICAgZmluYWwgVCBwcmV2aW91c1ZhbHVlID0gbVN0YXRlTWFuYWdlci5nZXQoKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBiYXNlLmV2YWx1YXRlKCk7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgVCBjdXJyZW50VmFsdWUgPSBtU3RhdGVNYW5hZ2VyLmdldCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoIU9iamVjdHMuZXF1YWxzKHByZXZpb3VzVmFsdWUsIGN1cnJlbnRWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0ZU1hbmFnZXIuc2V0KHByZXZpb3VzVmFsdWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvYW5kcm9pZC9hdXRvZmlsbHNlcnZpY2UvY3RzL2NvbW1vbi9TdGF0ZUtlZXBlclJ1bGVUZXN0LmphdmEgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9jb21tb24vU3RhdGVLZWVwZXJSdWxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZGIwYTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9jb21tb24vU3RhdGVLZWVwZXJSdWxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmF1dG9maWxsc2VydmljZS5jdHMuY29tbW9uOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLnRydXRoLlRydXRoLmFzc2VydFRoYXQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uQXJndW1lbnRNYXRjaGVycy5hbnlTdHJpbmc7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8uZG9UaHJvdzsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5uZXZlcjsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by50aW1lczsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by52ZXJpZnk7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8udmVyaWZ5Tm9Nb3JlSW50ZXJhY3Rpb25zOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLndoZW47CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydFRocm93czsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuZXhwZWN0VGhyb3dzOworCitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5EZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMubW9kZWwuU3RhdGVtZW50OworaW1wb3J0IG9yZy5tb2NraXRvLk1vY2s7CitpbXBvcnQgb3JnLm1vY2tpdG8uanVuaXQuTW9ja2l0b0pVbml0UnVubmVyOworCitAUnVuV2l0aChNb2NraXRvSlVuaXRSdW5uZXIuY2xhc3MpCitAQXBwTW9kZUZ1bGwgLy8gVW5pdCB0ZXN0CitwdWJsaWMgY2xhc3MgU3RhdGVLZWVwZXJSdWxlVGVzdCB7CisKKyAgICBwcml2YXRlIGZpbmFsIFJ1bnRpbWVFeGNlcHRpb24gbVJ1bnRpbWVFeGNlcHRpb24gPSBuZXcgUnVudGltZUV4Y2VwdGlvbigiRCdPSCIpOworICAgIHByaXZhdGUgZmluYWwgRGVzY3JpcHRpb24gbURlc2NyaXB0aW9uID0gRGVzY3JpcHRpb24uY3JlYXRlU3VpdGVEZXNjcmlwdGlvbigiV2hhdGV2ZXIiKTsKKworICAgIEBNb2NrCisgICAgcHJpdmF0ZSBTdGF0ZU1hbmFnZXI8U3RyaW5nPiBtU3RhdGVNYW5hZ2VyOworCisgICAgQE1vY2sKKyAgICBwcml2YXRlIFN0YXRlbWVudCBtU3RhdGVtZW50OworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZENvbnN0cnVjdG9yKCkgeworICAgICAgICBhc3NlcnRUaHJvd3MoTnVsbFBvaW50ZXJFeGNlcHRpb24uY2xhc3MsICgpIC0+IG5ldyBTdGF0ZUtlZXBlclJ1bGU8T2JqZWN0PihudWxsKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzdG9yZU9uU3VjY2VzcygpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBmaW5hbCBTdGF0ZUtlZXBlclJ1bGU8U3RyaW5nPiBydWxlID0gbmV3IFN0YXRlS2VlcGVyUnVsZTw+KG1TdGF0ZU1hbmFnZXIpOworICAgICAgICB3aGVuKG1TdGF0ZU1hbmFnZXIuZ2V0KCkpLnRoZW5SZXR1cm4oImJlZm9yZSIsICJjaGFuZ2VkIik7CisKKyAgICAgICAgcnVsZS5hcHBseShtU3RhdGVtZW50LCBtRGVzY3JpcHRpb24pLmV2YWx1YXRlKCk7CisKKyAgICAgICAgdmVyaWZ5KG1TdGF0ZW1lbnQsIHRpbWVzKDEpKS5ldmFsdWF0ZSgpOworICAgICAgICB2ZXJpZnkobVN0YXRlTWFuYWdlciwgdGltZXMoMikpLmdldCgpOyAvLyBOZWVkZWQgYmVjYXVzZSBvZiB2ZXJpZnlOb01vcmVJbnRlcmFjdGlvbnMoKQorICAgICAgICB2ZXJpZnkobVN0YXRlTWFuYWdlciwgdGltZXMoMSkpLnNldCgiYmVmb3JlIik7CisgICAgICAgIHZlcmlmeU5vTW9yZUludGVyYWN0aW9ucyhtU3RhdGVNYW5hZ2VyKTsgLy8gTWFrZSBzdXJlIHNldCgpIHdhcyBub3QgY2FsbGVkIGFnYWluCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzdG9yZU9uRmFpbHVyZSgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBmaW5hbCBTdGF0ZUtlZXBlclJ1bGU8U3RyaW5nPiBydWxlID0gbmV3IFN0YXRlS2VlcGVyUnVsZTw+KG1TdGF0ZU1hbmFnZXIpOworICAgICAgICB3aGVuKG1TdGF0ZU1hbmFnZXIuZ2V0KCkpLnRoZW5SZXR1cm4oImJlZm9yZSIsICJjaGFuZ2VkIik7CisgICAgICAgIGRvVGhyb3cobVJ1bnRpbWVFeGNlcHRpb24pLndoZW4obVN0YXRlbWVudCkuZXZhbHVhdGUoKTsKKworICAgICAgICBmaW5hbCBSdW50aW1lRXhjZXB0aW9uIGFjdHVhbEV4Y2VwdGlvbiA9IGV4cGVjdFRocm93cyhSdW50aW1lRXhjZXB0aW9uLmNsYXNzLAorICAgICAgICAgICAgICAgICgpIC0+IHJ1bGUuYXBwbHkobVN0YXRlbWVudCwgbURlc2NyaXB0aW9uKS5ldmFsdWF0ZSgpKTsKKworICAgICAgICBhc3NlcnRUaGF0KGFjdHVhbEV4Y2VwdGlvbikuaXNTYW1lQXMobVJ1bnRpbWVFeGNlcHRpb24pOworICAgICAgICB2ZXJpZnkobVN0YXRlTWFuYWdlciwgdGltZXMoMikpLmdldCgpOyAvLyBOZWVkZWQgYmVjYXVzZSBvZiB2ZXJpZnlOb01vcmVJbnRlcmFjdGlvbnMoKQorICAgICAgICB2ZXJpZnkobVN0YXRlTWFuYWdlciwgdGltZXMoMSkpLnNldCgiYmVmb3JlIik7CisgICAgICAgIHZlcmlmeU5vTW9yZUludGVyYWN0aW9ucyhtU3RhdGVNYW5hZ2VyKTsgLy8gTWFrZSBzdXJlIHNldCgpIHdhcyBub3QgY2FsbGVkIGFnYWluCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG9Ob3RSZXN0b3JlV2hlbk5vdENoYW5nZWQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgZmluYWwgU3RhdGVLZWVwZXJSdWxlPFN0cmluZz4gcnVsZSA9IG5ldyBTdGF0ZUtlZXBlclJ1bGU8PihtU3RhdGVNYW5hZ2VyKTsKKyAgICAgICAgd2hlbihtU3RhdGVNYW5hZ2VyLmdldCgpKS50aGVuUmV0dXJuKCJub3RfY2hhbmdlZCIpOworCisgICAgICAgIHJ1bGUuYXBwbHkobVN0YXRlbWVudCwgbURlc2NyaXB0aW9uKS5ldmFsdWF0ZSgpOworCisgICAgICAgIHZlcmlmeShtU3RhdGVtZW50LCB0aW1lcygxKSkuZXZhbHVhdGUoKTsKKyAgICAgICAgdmVyaWZ5KG1TdGF0ZU1hbmFnZXIsIG5ldmVyKCkpLnNldChhbnlTdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG9Ob3RSZXN0b3JlT25GYWlsdXJlKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGZpbmFsIFN0YXRlS2VlcGVyUnVsZTxTdHJpbmc+IHJ1bGUgPSBuZXcgU3RhdGVLZWVwZXJSdWxlPD4obVN0YXRlTWFuYWdlcik7CisgICAgICAgIHdoZW4obVN0YXRlTWFuYWdlci5nZXQoKSkudGhlblJldHVybigibm90X2NoYW5nZWQiKTsKKyAgICAgICAgZG9UaHJvdyhtUnVudGltZUV4Y2VwdGlvbikud2hlbihtU3RhdGVtZW50KS5ldmFsdWF0ZSgpOworCisgICAgICAgIGZpbmFsIFJ1bnRpbWVFeGNlcHRpb24gYWN0dWFsRXhjZXB0aW9uID0gZXhwZWN0VGhyb3dzKFJ1bnRpbWVFeGNlcHRpb24uY2xhc3MsCisgICAgICAgICAgICAgICAgKCkgLT4gcnVsZS5hcHBseShtU3RhdGVtZW50LCBtRGVzY3JpcHRpb24pLmV2YWx1YXRlKCkpOworCisgICAgICAgIGFzc2VydFRoYXQoYWN0dWFsRXhjZXB0aW9uKS5pc1NhbWVBcyhtUnVudGltZUV4Y2VwdGlvbik7CisKKyAgICAgICAgdmVyaWZ5KG1TdGF0ZU1hbmFnZXIsIG5ldmVyKCkpLnNldChhbnlTdHJpbmcoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvY29tbW9uL1N0YXRlTWFuYWdlci5qYXZhIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9hbmRyb2lkL2F1dG9maWxsc2VydmljZS9jdHMvY29tbW9uL1N0YXRlTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNjcxNmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2FuZHJvaWQvYXV0b2ZpbGxzZXJ2aWNlL2N0cy9jb21tb24vU3RhdGVNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQuYXV0b2ZpbGxzZXJ2aWNlLmN0cy5jb21tb247CisKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk51bGxhYmxlOworCisvKioKKyAqIEFic3RyYWN0aW9uIGZvciBhIHN0YXRlIHRoYXQgaXMgbWFuYWdlZCBzb21ld2hlcmUsIGxpa2UgQW5kcm9pZCBTZXR0aW5ncy4KKyAqLworcHVibGljIGludGVyZmFjZSBTdGF0ZU1hbmFnZXI8VD4geworCisgICAgLyoqCisgICAgICogU2V0cyBhIG5ldyBzdGF0ZS4KKyAgICAgKi8KKyAgICB2b2lkIHNldChATnVsbGFibGUgVCB2YWx1ZSk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBjdXJyZW50IHN0YXRlLgorICAgICAqLworICAgIEBOdWxsYWJsZSBUIGdldCgpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9jb20vYW5kcm9pZC9jdHMvbW9ja2ltZS9JbWVDb21tYW5kLmphdmEgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2NvbS9hbmRyb2lkL2N0cy9tb2NraW1lL0ltZUNvbW1hbmQuamF2YQppbmRleCBiNTg2M2QxLi5hZDgxZWI1IDEwMDY0NAotLS0gYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2NvbS9hbmRyb2lkL2N0cy9tb2NraW1lL0ltZUNvbW1hbmQuamF2YQorKysgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2NvbS9hbmRyb2lkL2N0cy9tb2NraW1lL0ltZUNvbW1hbmQuamF2YQpAQCAtMTcsNyArMTcsNyBAQAogcGFja2FnZSBjb20uYW5kcm9pZC5jdHMubW9ja2ltZTsKIAogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk5vbk51bGw7CitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5Ob25OdWxsOwogCiBwdWJsaWMgZmluYWwgY2xhc3MgSW1lQ29tbWFuZCB7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvY29tL2FuZHJvaWQvY3RzL21vY2tpbWUvSW1lRXZlbnQuamF2YSBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvY29tL2FuZHJvaWQvY3RzL21vY2tpbWUvSW1lRXZlbnQuamF2YQppbmRleCBlZDZlNmU4Li5kNDA5MGZiIDEwMDY0NAotLS0gYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2NvbS9hbmRyb2lkL2N0cy9tb2NraW1lL0ltZUV2ZW50LmphdmEKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9jb20vYW5kcm9pZC9jdHMvbW9ja2ltZS9JbWVFdmVudC5qYXZhCkBAIC0xOCw4ICsxOCw4IEBACiAKIGltcG9ydCBhbmRyb2lkLmlucHV0bWV0aG9kc2VydmljZS5BYnN0cmFjdElucHV0TWV0aG9kU2VydmljZTsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTm9uTnVsbDsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk51bGxhYmxlOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogCiAvKioKZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvY29tL2FuZHJvaWQvY3RzL21vY2tpbWUvSW1lRXZlbnRTdHJlYW0uamF2YSBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvY29tL2FuZHJvaWQvY3RzL21vY2tpbWUvSW1lRXZlbnRTdHJlYW0uamF2YQppbmRleCAyM2ViNDc3Li5kODY2ZGEwIDEwMDY0NAotLS0gYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2NvbS9hbmRyb2lkL2N0cy9tb2NraW1lL0ltZUV2ZW50U3RyZWFtLmphdmEKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9jb20vYW5kcm9pZC9jdHMvbW9ja2ltZS9JbWVFdmVudFN0cmVhbS5qYXZhCkBAIC0xNyw4ICsxNyw4IEBACiBwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5tb2NraW1lOwogCiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uSW50UmFuZ2U7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uTm9uTnVsbDsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLkludFJhbmdlOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTm9uTnVsbDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuRWRpdG9ySW5mbzsKIAogaW1wb3J0IGphdmEudGltZS5JbnN0YW50OwpkaWZmIC0tZ2l0IGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9jb20vYW5kcm9pZC9jdHMvbW9ja2ltZS9JbWVFdmVudFN0cmVhbVRlc3RVdGlscy5qYXZhIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9jb20vYW5kcm9pZC9jdHMvbW9ja2ltZS9JbWVFdmVudFN0cmVhbVRlc3RVdGlscy5qYXZhCmluZGV4IDA3NWFlNzguLjg0OTcyNjggMTAwNjQ0Ci0tLSBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvY29tL2FuZHJvaWQvY3RzL21vY2tpbWUvSW1lRXZlbnRTdHJlYW1UZXN0VXRpbHMuamF2YQorKysgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2NvbS9hbmRyb2lkL2N0cy9tb2NraW1lL0ltZUV2ZW50U3RyZWFtVGVzdFV0aWxzLmphdmEKQEAgLTE3LDcgKzE3LDcgQEAKIHBhY2thZ2UgY29tLmFuZHJvaWQuY3RzLm1vY2tpbWU7CiAKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk5vbk51bGw7CitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5Ob25OdWxsOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLkVkaXRvckluZm87CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0QmluZGluZzsKZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvY29tL2FuZHJvaWQvY3RzL21vY2tpbWUvSW1lTGF5b3V0SW5mby5qYXZhIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9jb20vYW5kcm9pZC9jdHMvbW9ja2ltZS9JbWVMYXlvdXRJbmZvLmphdmEKaW5kZXggNjE1NmQxNi4uNzc3MThlYSAxMDA2NDQKLS0tIGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9jb20vYW5kcm9pZC9jdHMvbW9ja2ltZS9JbWVMYXlvdXRJbmZvLmphdmEKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9jb20vYW5kcm9pZC9jdHMvbW9ja2ltZS9JbWVMYXlvdXRJbmZvLmphdmEKQEAgLTE5LDggKzE5LDggQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvaW50OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTm9uTnVsbDsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk51bGxhYmxlOwogaW1wb3J0IGFuZHJvaWQudmlldy5EaXNwbGF5OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dJbnNldHM7CmRpZmYgLS1naXQgYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2NvbS9hbmRyb2lkL2N0cy9tb2NraW1lL0ltZVNldHRpbmdzLmphdmEgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2NvbS9hbmRyb2lkL2N0cy9tb2NraW1lL0ltZVNldHRpbmdzLmphdmEKaW5kZXggNDQ2NDgzZS4uMjFjMjViZSAxMDA2NDQKLS0tIGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9jb20vYW5kcm9pZC9jdHMvbW9ja2ltZS9JbWVTZXR0aW5ncy5qYXZhCisrKyBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvY29tL2FuZHJvaWQvY3RzL21vY2tpbWUvSW1lU2V0dGluZ3MuamF2YQpAQCAtMTgsOSArMTgsOSBAQAogCiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5QZXJzaXN0YWJsZUJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Db2xvckludDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uQ29sb3JJbnQ7CitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5Ob25OdWxsOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTnVsbGFibGU7CiAKIC8qKgogICogQW4gaW1tdXRhYmxlIGRhdGEgc3RvcmUgdG8gY29udHJvbCB0aGUgYmVoYXZpb3Igb2Yge0BsaW5rIE1vY2tJbWV9LgpkaWZmIC0tZ2l0IGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9jb20vYW5kcm9pZC9jdHMvbW9ja2ltZS9JbWVTdGF0ZS5qYXZhIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9jb20vYW5kcm9pZC9jdHMvbW9ja2ltZS9JbWVTdGF0ZS5qYXZhCmluZGV4IDYxNDdlYTIuLjAxMzViMzAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvY29tL2FuZHJvaWQvY3RzL21vY2tpbWUvSW1lU3RhdGUuamF2YQorKysgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2NvbS9hbmRyb2lkL2N0cy9tb2NraW1lL0ltZVN0YXRlLmphdmEKQEAgLTE3LDggKzE3LDggQEAKIHBhY2thZ2UgY29tLmFuZHJvaWQuY3RzLm1vY2tpbWU7CiAKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTm9uTnVsbDsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk51bGxhYmxlOwogCiAvKioKICAqIEFuIGltbXV0YWJsZSBvYmplY3QgdGhhdCBzdG9yZXMgc2V2ZXJhbCBydW50aW1lIHN0YXRlIG9mIHtAbGluayBNb2NrSW1lfS4KZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvY29tL2FuZHJvaWQvY3RzL21vY2tpbWUvTW9ja0ltZS5qYXZhIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9jb20vYW5kcm9pZC9jdHMvbW9ja2ltZS9Nb2NrSW1lLmphdmEKaW5kZXggYzExMDFhMS4uNTJhMTE4MiAxMDA2NDQKLS0tIGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9jb20vYW5kcm9pZC9jdHMvbW9ja2ltZS9Nb2NrSW1lLmphdmEKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9jb20vYW5kcm9pZC9jdHMvbW9ja2ltZS9Nb2NrSW1lLmphdmEKQEAgLTM0LDExICszNCwxMSBAQAogaW1wb3J0IGFuZHJvaWQub3MuUHJvY2VzczsKIGltcG9ydCBhbmRyb2lkLm9zLlJlc3VsdFJlY2VpdmVyOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uQW55VGhyZWFkOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLkNhbGxTdXBlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk51bGxhYmxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLldvcmtlclRocmVhZDsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLkFueVRocmVhZDsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLkNhbGxTdXBlcjsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk5vbk51bGw7CitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5OdWxsYWJsZTsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLldvcmtlclRocmVhZDsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlR5cGVkVmFsdWU7CkBAIC0xNDcsOSArMTQ3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBjYXNlICJyZXF1ZXN0U2hvd1NlbGYiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZmxhZ3MgPSBjb21tYW5kLmdldEV4dHJhcygpLmdldEludCgiZmxhZ3MiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgbWV0aG9kIHdhcyBhZGRlZCBvbiBQCi0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJJZ25vcmluZyByZXF1ZXN0U2hvd0ZlbGYoIiArIGZsYWdzICsiKSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWVzdFNob3dTZWxmKGZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RTaG93U2VsZihmbGFncyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvY29tL2FuZHJvaWQvY3RzL21vY2tpbWUvTW9ja0ltZVNlc3Npb24uamF2YSBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvY29tL2FuZHJvaWQvY3RzL21vY2tpbWUvTW9ja0ltZVNlc3Npb24uamF2YQppbmRleCA0MWUyZjlhLi43MjdkYTJjIDEwMDY0NAotLS0gYS90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2NvbS9hbmRyb2lkL2N0cy9tb2NraW1lL01vY2tJbWVTZXNzaW9uLmphdmEKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9jb20vYW5kcm9pZC9jdHMvbW9ja2ltZS9Nb2NrSW1lU2Vzc2lvbi5qYXZhCkBAIC0yOCw5ICsyOCw5IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uR3VhcmRlZEJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uTnVsbGFibGU7CitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5HdWFyZGVkQnk7CitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5Ob25OdWxsOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTnVsbGFibGU7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RNYW5hZ2VyOwogCkBAIC0xNzUsOSArMTc1LDE5IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoQE51bGxhYmxlIEltZVNldHRpbmdzLkJ1aWxkZXIgaW1lU2V0dGluZ3MpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBOT1RFOiBvbiBQIHdlIGNhbGwgJ2ltZSByZXNldCcsIGJ1dCBpdCdzIG5vdCBhdmFpbGFibGUgb24gTywgc28gd2UncmUganVzdCBpZ25vcmluZyBpdCAtCi0gICAgICAgIC8vIHdlIGRvbid0IHJlYWxseSBuZWVkIHRoZSBJTUUgYW5kIGl0IHdpbGwgYmUgZWZmZWN0aXZlbHkgZGlzYWJsZWQgYWZ0ZXIgdGhpcyBBUEsgaXMKLSAgICAgICAgLy8gdW5pbnN0YWxsZWQuCisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IE1vY2tJTUUgaXMgbm90IHNlbGVjdGVkLgorICAgICAgICBpZiAobUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShJbnB1dE1ldGhvZE1hbmFnZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgLmdldElucHV0TWV0aG9kTGlzdCgpCisgICAgICAgICAgICAgICAgLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgLmFueU1hdGNoKGluZm8gLT4gZ2V0TW9ja0ltZUNvbXBvbmVudE5hbWUoKS5lcXVhbHMoaW5mby5nZXRDb21wb25lbnQoKSkpKSB7CisgICAgICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKG1VaUF1dG9tYXRpb24sICJpbWUgcmVzZXQiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShJbnB1dE1ldGhvZE1hbmFnZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgLmdldEVuYWJsZWRJbnB1dE1ldGhvZExpc3QoKQorICAgICAgICAgICAgICAgIC5zdHJlYW0oKQorICAgICAgICAgICAgICAgIC5hbnlNYXRjaChpbmZvIC0+IGdldE1vY2tJbWVDb21wb25lbnROYW1lKCkuZXF1YWxzKGluZm8uZ2V0Q29tcG9uZW50KCkpKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgICAgICB9CiAKICAgICAgICAgd3JpdGVNb2NrSW1lU2V0dGluZ3MobUNvbnRleHQsIG1JbWVFdmVudEFjdGlvbk5hbWUsIGltZVNldHRpbmdzKTsKIApAQCAtMjI4LDkgKzIzOCwxMyBAQAogICAgICAqIHNlbGVjdGVkIG5leHQgaXMgdXAgdG8gdGhlIHN5c3RlbS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBOT1RFOiBvbiBQIHdlIGNhbGwgJ2ltZSByZXNldCcsIGJ1dCBpdCdzIG5vdCBhdmFpbGFibGUgb24gTywgc28gd2UncmUganVzdCBpZ25vcmluZyBpdCAtCi0gICAgICAgIC8vIHdlIGRvbid0IHJlYWxseSBuZWVkIHRoZSBJTUUgYW5kIGl0IHdpbGwgYmUgZWZmZWN0aXZlbHkgZGlzYWJsZWQgYWZ0ZXIgdGhpcyBBUEsgaXMKLSAgICAgICAgLy8gdW5pbnN0YWxsZWQuCisgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQobVVpQXV0b21hdGlvbiwgImltZSByZXNldCIpOworCisgICAgICAgIFBvbGxpbmdDaGVjay5jaGVjaygiTWFrZSBzdXJlIHRoYXQgTW9ja0lNRSBiZWNvbWVzIHVuYXZhaWxhYmxlIiwgVElNRU9VVCwgKCkgLT4KKyAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKElucHV0TWV0aG9kTWFuYWdlci5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRFbmFibGVkSW5wdXRNZXRob2RMaXN0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgICAgLm5vbmVNYXRjaChpbmZvIC0+IGdldE1vY2tJbWVDb21wb25lbnROYW1lKCkuZXF1YWxzKGluZm8uZ2V0Q29tcG9uZW50KCkpKSk7CiAKICAgICAgICAgbUNvbnRleHQudW5yZWdpc3RlclJlY2VpdmVyKG1FdmVudFJlY2VpdmVyKTsKICAgICAgICAgbUhhbmRsZXJUaHJlYWQucXVpdFNhZmVseSgpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9jb20vYW5kcm9pZC9jdHMvbW9ja2ltZS9Nb2NrSW1lU2Vzc2lvblJ1bGUuamF2YSBiL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvY29tL2FuZHJvaWQvY3RzL21vY2tpbWUvTW9ja0ltZVNlc3Npb25SdWxlLmphdmEKaW5kZXggMDA0OWM4ZS4uODYzMmMzYiAxMDA2NDQKLS0tIGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9jb20vYW5kcm9pZC9jdHMvbW9ja2ltZS9Nb2NrSW1lU2Vzc2lvblJ1bGUuamF2YQorKysgYi90ZXN0cy9hdXRvZmlsbHNlcnZpY2Uvc3JjL2NvbS9hbmRyb2lkL2N0cy9tb2NraW1lL01vY2tJbWVTZXNzaW9uUnVsZS5qYXZhCkBAIC0xOSw5ICsxOSw5IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uTnVsbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5Ob25OdWxsOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTnVsbGFibGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy5tb2NraW1lLkltZVNldHRpbmdzLkJ1aWxkZXI7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL2F1dG9maWxsc2VydmljZS9zcmMvY29tL2FuZHJvaWQvY3RzL21vY2tpbWUvU2V0dGluZ3NQcm92aWRlci5qYXZhIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9jb20vYW5kcm9pZC9jdHMvbW9ja2ltZS9TZXR0aW5nc1Byb3ZpZGVyLmphdmEKaW5kZXggOWRhYzMyOS4uZDlhNTY1YiAxMDA2NDQKLS0tIGEvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9jb20vYW5kcm9pZC9jdHMvbW9ja2ltZS9TZXR0aW5nc1Byb3ZpZGVyLmphdmEKKysrIGIvdGVzdHMvYXV0b2ZpbGxzZXJ2aWNlL3NyYy9jb20vYW5kcm9pZC9jdHMvbW9ja2ltZS9TZXR0aW5nc1Byb3ZpZGVyLmphdmEKQEAgLTIyLDcgKzIyLDcgQEAKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiAKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk51bGxhYmxlOwogCiAvKioKICAqIHtAbGluayBDb250ZW50UHJvdmlkZXJ9IHRvIHJlY2VpdmUge0BsaW5rIEltZVNldHRpbmdzfSB2aWEKZGlmZiAtLWdpdCBhL3Rlc3RzL2JhY2t1cC9BbmRyb2lkLm1rIGIvdGVzdHMvYmFja3VwL0FuZHJvaWQubWsKaW5kZXggYmIxZjhmYy4uNmJmZWQ1YyAxMDA2NDQKLS0tIGEvdGVzdHMvYmFja3VwL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvYmFja3VwL0FuZHJvaWQubWsKQEAgLTIxLDkgKzIxLDEzIEBACiAjIGFuZCB3aGVuIGJ1aWx0IGV4cGxpY2l0bHkgcHV0IGl0IGluIHRoZSBkYXRhIHBhcnRpdGlvbgogTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKIAotTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lciB0ZWxlcGhvbnktY29tbW9uIHZvaXAtY29tbW9uIG9yZy5hcGFjaGUuaHR0cC5sZWdhY3kKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IFwKKyAgICBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzIFwKKyAgICBvcmcuYXBhY2hlLmh0dHAubGVnYWN5IFwKKyAgICBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicyBcCiAKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsIGN0c3Rlc3RydW5uZXIgY3RzdGVzdHNlcnZlciBtb2NraXRvLXRhcmdldC1taW51cy1qdW5pdDQKKworTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0IGN0c3Rlc3RydW5uZXItYXh0IGN0c3Rlc3RzZXJ2ZXIgbW9ja2l0by10YXJnZXQtbWludXMtanVuaXQ0CiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIApkaWZmIC0tZ2l0IGEvdGVzdHMvYmFja3VwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9iYWNrdXAvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCAzMzMwNDVhLi41NDJjNDFmIDEwMDY0NAotLS0gYS90ZXN0cy9iYWNrdXAvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy9iYWNrdXAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjAsOSArMjAsMTAgQEAKIAogICAgIDxhcHBsaWNhdGlvbj4KICAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJvcmcuYXBhY2hlLmh0dHAubGVnYWN5IiAvPgogICAgIDwvYXBwbGljYXRpb24+CiAKLSAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmJhY2t1cC5jdHMiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgdGVzdHMgb2YgQW5kcm9pZCBCYWNrdXAvUmVzdG9yZSI+CiAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJsaXN0ZW5lciIKZGlmZiAtLWdpdCBhL3Rlc3RzL2JhY2t1cC9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy9iYWNrdXAvQW5kcm9pZFRlc3QueG1sCmluZGV4IDAxNWY1OTUuLjliNmFiNjUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2JhY2t1cC9BbmRyb2lkVGVzdC54bWwKKysrIGIvdGVzdHMvYmFja3VwL0FuZHJvaWRUZXN0LnhtbApAQCAtMTUsNyArMTUsMTMgQEAKICAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQogICAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBCYWNrdXAgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImJhY2t1cCIgLz4KKyAgICAKKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlN3aXRjaFVzZXJUYXJnZXRQcmVwYXJlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0idXNlci10eXBlIiB2YWx1ZT0ic3lzdGVtIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorCiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CiAgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0Z1bGxCYWNrdXBBcHAuYXBrIiAvPgpkaWZmIC0tZ2l0IGEvdGVzdHMvYmFja3VwL2FwcC9mdWxsYmFja3VwL0FuZHJvaWQubWsgYi90ZXN0cy9iYWNrdXAvYXBwL2Z1bGxiYWNrdXAvQW5kcm9pZC5tawppbmRleCBhYzUzMjUyLi5iNTNlMzhhIDEwMDY0NAotLS0gYS90ZXN0cy9iYWNrdXAvYXBwL2Z1bGxiYWNrdXAvQW5kcm9pZC5taworKysgYi90ZXN0cy9iYWNrdXAvYXBwL2Z1bGxiYWNrdXAvQW5kcm9pZC5tawpAQCAtMjMsMTIgKzIzLDEzIEBACiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCAuLi9zcmMpCiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNGdWxsQmFja3VwQXBwCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CiAKICMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKIExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiAKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCi0gICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbCBcCi0gICAgY3RzdGVzdHJ1bm5lcgorICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0IFwKKyAgICBjdHN0ZXN0cnVubmVyLWF4dAogCiBpbmNsdWRlICQoQlVJTERfQ1RTX1NVUFBPUlRfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2JhY2t1cC9hcHAvZnVsbGJhY2t1cC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvYmFja3VwL2FwcC9mdWxsYmFja3VwL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggODE2MWE5NS4uMTM4Yzc3NCAxMDA2NDQKLS0tIGEvdGVzdHMvYmFja3VwL2FwcC9mdWxsYmFja3VwL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvYmFja3VwL2FwcC9mdWxsYmFja3VwL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTIzLDYgKzIzLDggQEAKICAgICAgICAgYW5kcm9pZDpiYWNrdXBBZ2VudD0iRnVsbEJhY2t1cEJhY2t1cEFnZW50IgogICAgICAgICBhbmRyb2lkOmxhYmVsPSJBbmRyb2lkIEJhY2t1cCBDVFMgQXBwIgogICAgICAgICBhbmRyb2lkOmZ1bGxCYWNrdXBPbmx5PSJ0cnVlIj4KKyAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CisKIAogICAgICAgICA8YWN0aXZpdHkKICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iLk1haW5BY3Rpdml0eSIKZGlmZiAtLWdpdCBhL3Rlc3RzL2JhY2t1cC9hcHAva2V5dmFsdWUvQW5kcm9pZC5tayBiL3Rlc3RzL2JhY2t1cC9hcHAva2V5dmFsdWUvQW5kcm9pZC5tawppbmRleCAzYzM2ZjUwLi5kYzVmMmU4IDEwMDY0NAotLS0gYS90ZXN0cy9iYWNrdXAvYXBwL2tleXZhbHVlL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvYmFja3VwL2FwcC9rZXl2YWx1ZS9BbmRyb2lkLm1rCkBAIC0yMywxMiArMjMsMTMgQEAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIC4uL3NyYykKIAogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0tleVZhbHVlQmFja3VwQXBwCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CiAKICMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKIExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiAKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCi0gICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbCBcCi0gICAgY3RzdGVzdHJ1bm5lcgorICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0IFwKKyAgICBjdHN0ZXN0cnVubmVyLWF4dAogCiBpbmNsdWRlICQoQlVJTERfQ1RTX1NVUFBPUlRfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2JhY2t1cC9hcHAva2V5dmFsdWUvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL2JhY2t1cC9hcHAva2V5dmFsdWUvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBjOTliNGI0Li4zZWQzMDJkIDEwMDY0NAotLS0gYS90ZXN0cy9iYWNrdXAvYXBwL2tleXZhbHVlL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvYmFja3VwL2FwcC9rZXl2YWx1ZS9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yMiw2ICsyMiw4IEBACiAgICAgICAgIGFuZHJvaWQ6YWxsb3dCYWNrdXA9InRydWUiCiAgICAgICAgIGFuZHJvaWQ6YmFja3VwQWdlbnQ9ImFuZHJvaWQuYmFja3VwLmFwcC5LZXlWYWx1ZUJhY2t1cEFnZW50IgogICAgICAgICBhbmRyb2lkOmxhYmVsPSJBbmRyb2lkIEtleSBWYWx1ZSBCYWNrdXAgQ1RTIEFwcCI+CisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgorCiAgICAgICAgIDxhY3Rpdml0eQogICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmJhY2t1cC5hcHAuTWFpbkFjdGl2aXR5IgogICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQW5kcm9pZCBLZXkgVmFsdWUgQmFja3VwIENUUyBBcHAiID4KZGlmZiAtLWdpdCBhL3Rlc3RzL2JhY2t1cC9zcmMvYW5kcm9pZC9iYWNrdXAvY3RzL0Jhc2VCYWNrdXBDdHNUZXN0LmphdmEgYi90ZXN0cy9iYWNrdXAvc3JjL2FuZHJvaWQvYmFja3VwL2N0cy9CYXNlQmFja3VwQ3RzVGVzdC5qYXZhCmluZGV4IGJiZDBkMjYuLjM0M2YyZDkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2JhY2t1cC9zcmMvYW5kcm9pZC9iYWNrdXAvY3RzL0Jhc2VCYWNrdXBDdHNUZXN0LmphdmEKKysrIGIvdGVzdHMvYmFja3VwL3NyYy9hbmRyb2lkL2JhY2t1cC9jdHMvQmFzZUJhY2t1cEN0c1Rlc3QuamF2YQpAQCAtMjEsMTQgKzIxLDE0IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdENhc2U7CiAKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkxvZ2NhdEluc3BlY3RvcjsKKwogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CiBpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOwotaW1wb3J0IGphdmEudXRpbC5VVUlEOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogCiAvKioKICAqIEJhc2UgY2xhc3MgZm9yIGJhY2t1cCBpbnN0cnVtZW50YXRpb24gdGVzdHMuCkBAIC00MSw5ICs0MSwxNCBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTF9UUkFOU1BPUlQgPQogICAgICAgICAgICAgImFuZHJvaWQvY29tLmFuZHJvaWQuaW50ZXJuYWwuYmFja3VwLkxvY2FsVHJhbnNwb3J0IjsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTTUFMTF9MT0dDQVRfREVMQVkgPSAxMDAwOwotCiAgICAgcHJpdmF0ZSBib29sZWFuIGlzQmFja3VwU3VwcG9ydGVkOworICAgIHByaXZhdGUgTG9nY2F0SW5zcGVjdG9yIG1Mb2djYXRJbnNwZWN0b3IgPQorICAgICAgICAgICAgbmV3IExvZ2NhdEluc3BlY3RvcigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gZXhlY3V0ZVNoZWxsQ29tbWFuZChTdHJpbmcgY29tbWFuZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4ZWN1dGVTdHJlYW1lZFNoZWxsQ29tbWFuZChnZXRJbnN0cnVtZW50YXRpb24oKSwgY29tbWFuZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC03Myw1NSArNzgsMTYgQEAKICAgICAgICAgcmV0dXJuIG91dHB1dC5jb250YWlucygiKiAiICsgTE9DQUxfVFJBTlNQT1JUKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBBdHRlbXB0cyB0byBjbGVhciBsb2djYXQuCi0gICAgICoKLSAgICAgKiBDbGVhcmluZyBsb2djYXQgaXMga25vd24gdG8gYmUgdW5yZWxpYWJsZSwgc28gdGhpcyBtZXRob2RzIGFsc28gb3V0cHV0IGEgdW5pcXVlIHNlcGFyYXRvcgotICAgICAqIHRoYXQgY2FuIGJlIHVzZWQgdG8gZmluZCB0aGlzIHBvaW50IGluIHRoZSBsb2cgZXZlbiBpZiBjbGVhcmluZyBmYWlsZWQuCi0gICAgICogQHJldHVybiBhIHVuaXF1ZSBzZXBhcmF0b3Igc3RyaW5nCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNsZWFyTG9nY2F0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGV4ZWMoImxvZ2NhdCAtYyIpOwotICAgICAgICBTdHJpbmcgdW5pcXVlU3RyaW5nID0gIjo6OiIgKyBVVUlELnJhbmRvbVVVSUQoKS50b1N0cmluZygpOwotICAgICAgICBleGVjKCJsb2cgLXQgIiArIEFQUF9MT0dfVEFHICsgIiAiICsgdW5pcXVlU3RyaW5nKTsKLSAgICAgICAgcmV0dXJuIHVuaXF1ZVN0cmluZzsKKyAgICAvKiogU2VlIHtAbGluayBMb2djYXRJbnNwZWN0b3IjbWFyayhTdHJpbmcpfS4gKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIG1hcmtMb2djYXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG1Mb2djYXRJbnNwZWN0b3IubWFyayhBUFBfTE9HX1RBRyk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogV2FpdCBmb3IgdXAgdG8gbWF4VGltZW91dEluU2Vjb25kcyBmb3IgdGhlIGdpdmVuIHN0cmluZ3MgdG8gYXBwZWFyIGluIHRoZSBsb2djYXQgaW4gdGhlIGdpdmVuIG9yZGVyLgotICAgICAqIEJ5IHBhc3NpbmcgdGhlIHNlcGFyYXRvciByZXR1cm5lZCBieSB7QGxpbmsgI2NsZWFyTG9nY2F0fSBhcyB0aGUgZmlyc3Qgc3RyaW5nIHlvdSBjYW4gZW5zdXJlIHRoYXQgb25seQotICAgICAqIGxvZ3MgZW1pdHRlZCBhZnRlciB0aGF0IGNhbGwgdG8gY2xlYXJMb2djYXQgYXJlIGZvdW5kLgotICAgICAqCi0gICAgICogQHRocm93cyBBc3NlcnRpb25FcnJvciBpZiB0aGUgc3RyaW5ncyBhcmUgbm90IGZvdW5kIGluIHRoZSBnaXZlbiB0aW1lLgotICAgICAqLworICAgIC8qKiBTZWUge0BsaW5rIExvZ2NhdEluc3BlY3RvciNhc3NlcnRMb2djYXRDb250YWluc0luT3JkZXIoU3RyaW5nLCBpbnQsIFN0cmluZy4uLil9LiAqLwogICAgIHByb3RlY3RlZCB2b2lkIHdhaXRGb3JMb2djYXQoaW50IG1heFRpbWVvdXRJblNlY29uZHMsIFN0cmluZy4uLiBsb2djYXRTdHJpbmdzKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbG9uZyB0aW1lb3V0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyBUaW1lVW5pdC5TRUNPTkRTLnRvTWlsbGlzKG1heFRpbWVvdXRJblNlY29uZHMpOwotICAgICAgICBpbnQgc3RyaW5nSW5kZXggPSAwOwotICAgICAgICB3aGlsZSAodGltZW91dCA+PSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkgewotICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IGV4ZWN1dGVTdHJlYW1lZFNoZWxsQ29tbWFuZChnZXRJbnN0cnVtZW50YXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgImxvZ2NhdCAtdiBicmllZiAtZCAiICsgQVBQX0xPR19UQUcgKyAiOiogKjpTIik7Ci0gICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBsb2cgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGZpcykpOwotICAgICAgICAgICAgU3RyaW5nIGxpbmU7Ci0gICAgICAgICAgICBzdHJpbmdJbmRleCA9IDA7Ci0gICAgICAgICAgICB3aGlsZSAoKGxpbmUgPSBsb2cucmVhZExpbmUoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChsaW5lLmNvbnRhaW5zKGxvZ2NhdFN0cmluZ3Nbc3RyaW5nSW5kZXhdKSkgewotICAgICAgICAgICAgICAgICAgICBzdHJpbmdJbmRleCsrOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3RyaW5nSW5kZXggPj0gbG9nY2F0U3RyaW5ncy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRyYWluQW5kQ2xvc2UobG9nKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNsb3NlUXVpZXRseShsb2cpOwotICAgICAgICAgICAgLy8gSW4gY2FzZSB0aGUga2V5IGhhcyBub3QgYmVlbiBmb3VuZCwgd2FpdCBmb3IgdGhlIGxvZyB0byB1cGRhdGUgYmVmb3JlCi0gICAgICAgICAgICAvLyBwZXJmb3JtaW5nIHRoZSBuZXh0IHNlYXJjaC4KLSAgICAgICAgICAgIFRocmVhZC5zbGVlcChTTUFMTF9MT0dDQVRfREVMQVkpOwotICAgICAgICB9Ci0gICAgICAgIGZhaWwoIkNvdWxkbid0IGZpbmQgIiArIGxvZ2NhdFN0cmluZ3Nbc3RyaW5nSW5kZXhdICsKLSAgICAgICAgICAgIChzdHJpbmdJbmRleCA+IDAgPyAiIGFmdGVyICIgKyBsb2djYXRTdHJpbmdzW3N0cmluZ0luZGV4IC0gMV0gOiAiIikgKwotICAgICAgICAgICAgIiB3aXRoaW4gIiArIG1heFRpbWVvdXRJblNlY29uZHMgKyAiIHNlY29uZHMgIik7CisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbUxvZ2NhdEluc3BlY3Rvci5hc3NlcnRMb2djYXRDb250YWluc0luT3JkZXIoCisgICAgICAgICAgICAgICAgQVBQX0xPR19UQUcgKyAiOiogKjpTIiwgbWF4VGltZW91dEluU2Vjb25kcywgbG9nY2F0U3RyaW5ncyk7CiAgICAgfQogCiAgICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlVGVzdEZpbGVPZlNpemUoU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgc2l6ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0xNDUsOCArMTExLDggQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIEZpbGVJbnB1dFN0cmVhbSBleGVjdXRlU3RyZWFtZWRTaGVsbENvbW1hbmQoSW5zdHJ1bWVudGF0aW9uIGluc3RydW1lbnRhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb21tYW5kKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwcml2YXRlIHN0YXRpYyBGaWxlSW5wdXRTdHJlYW0gZXhlY3V0ZVN0cmVhbWVkU2hlbGxDb21tYW5kKAorICAgICAgICAgICAgSW5zdHJ1bWVudGF0aW9uIGluc3RydW1lbnRhdGlvbiwgU3RyaW5nIGNvbW1hbmQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHBmZCA9CiAgICAgICAgICAgICAgICAgaW5zdHJ1bWVudGF0aW9uLmdldFVpQXV0b21hdGlvbigpLmV4ZWN1dGVTaGVsbENvbW1hbmQoY29tbWFuZCk7CiAgICAgICAgIHJldHVybiBuZXcgUGFyY2VsRmlsZURlc2NyaXB0b3IuQXV0b0Nsb3NlSW5wdXRTdHJlYW0ocGZkKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2JhY2t1cC9zcmMvYW5kcm9pZC9iYWNrdXAvY3RzL0Z1bGxCYWNrdXBMaWZlY3ljbGVUZXN0LmphdmEgYi90ZXN0cy9iYWNrdXAvc3JjL2FuZHJvaWQvYmFja3VwL2N0cy9GdWxsQmFja3VwTGlmZWN5Y2xlVGVzdC5qYXZhCmluZGV4IGJlZWZhMDEuLjlmODFlY2QgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2JhY2t1cC9zcmMvYW5kcm9pZC9iYWNrdXAvY3RzL0Z1bGxCYWNrdXBMaWZlY3ljbGVUZXN0LmphdmEKKysrIGIvdGVzdHMvYmFja3VwL3NyYy9hbmRyb2lkL2JhY2t1cC9jdHMvRnVsbEJhY2t1cExpZmVjeWNsZVRlc3QuamF2YQpAQCAtMzEsNyArMzEsNyBAQAogICAgICAgICBpZiAoIWlzQmFja3VwU3VwcG9ydGVkKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBTdHJpbmcgYmFja3VwU2VwYXJhdG9yID0gY2xlYXJMb2djYXQoKTsKKyAgICAgICAgU3RyaW5nIGJhY2t1cFNlcGFyYXRvciA9IG1hcmtMb2djYXQoKTsKIAogICAgICAgICAvLyBNYWtlIHN1cmUgdGhlcmUncyBzb21ldGhpbmcgdG8gYmFja3VwCiAgICAgICAgIGNyZWF0ZVRlc3RGaWxlT2ZTaXplKEJBQ0tVUF9BUFBfTkFNRSwgTE9DQUxfVFJBTlNQT1JUX0NPTkZPUk1JTkdfRklMRV9TSVpFKTsKQEAgLTQ1LDcgKzQ1LDcgQEAKICAgICAgICAgICAgICJGdWxsIGJhY2t1cCByZXF1ZXN0ZWQiLAogICAgICAgICAgICAgIm9uRGVzdHJveSIpOwogCi0gICAgICAgIFN0cmluZyByZXN0b3JlU2VwYXJhdG9yID0gY2xlYXJMb2djYXQoKTsKKyAgICAgICAgU3RyaW5nIHJlc3RvcmVTZXBhcmF0b3IgPSBtYXJrTG9nY2F0KCk7CiAKICAgICAgICAgLy8gTm93IHJlcXVlc3QgcmVzdG9yZSBhbmQgd2FpdCBmb3IgaXQgdG8gY29tcGxldGUKICAgICAgICAgZXhlYygiYm1nciByZXN0b3JlICIgKyBCQUNLVVBfQVBQX05BTUUpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvYmFja3VwL3NyYy9hbmRyb2lkL2JhY2t1cC9jdHMvRnVsbEJhY2t1cFF1b3RhVGVzdC5qYXZhIGIvdGVzdHMvYmFja3VwL3NyYy9hbmRyb2lkL2JhY2t1cC9jdHMvRnVsbEJhY2t1cFF1b3RhVGVzdC5qYXZhCmluZGV4IDM5MjRlODcuLjU2ZDQ4OWQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2JhY2t1cC9zcmMvYW5kcm9pZC9iYWNrdXAvY3RzL0Z1bGxCYWNrdXBRdW90YVRlc3QuamF2YQorKysgYi90ZXN0cy9iYWNrdXAvc3JjL2FuZHJvaWQvYmFja3VwL2N0cy9GdWxsQmFja3VwUXVvdGFUZXN0LmphdmEKQEAgLTM2LDcgKzM2LDcgQEAKICAgICAgICAgaWYgKCFpc0JhY2t1cFN1cHBvcnRlZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgU3RyaW5nIHNlcGFyYXRvciA9IGNsZWFyTG9nY2F0KCk7CisgICAgICAgIFN0cmluZyBzZXBhcmF0b3IgPSBtYXJrTG9nY2F0KCk7CiAgICAgICAgIC8vIExhdW5jaCB0ZXN0IGFwcCBhbmQgY3JlYXRlIGZpbGUgZXhjZWVkaW5nIGxpbWl0IGZvciBsb2NhbCB0cmFuc3BvcnQKICAgICAgICAgY3JlYXRlVGVzdEZpbGVPZlNpemUoQkFDS1VQX0FQUF9OQU1FLCBMT0NBTF9UUkFOU1BPUlRfRVhDRUVESU5HX0ZJTEVfU0laRSk7CiAKQEAgLTU5LDcgKzU5LDcgQEAKICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgzMDAwKTsKICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkge30KIAotICAgICAgICBTdHJpbmcgc2VwYXJhdG9yID0gY2xlYXJMb2djYXQoKTsKKyAgICAgICAgU3RyaW5nIHNlcGFyYXRvciA9IG1hcmtMb2djYXQoKTsKICAgICAgICAgZXhlYygiYm1nciBiYWNrdXBub3cgIiArIEJBQ0tVUF9BUFBfTkFNRSk7CiAgICAgICAgIHdhaXRGb3JMb2djYXQoVElNRU9VVF9TRUNPTkRTLHNlcGFyYXRvciwKICAgICAgICAgICAgICJxdW90YSBpcyAiICsgTE9DQUxfVFJBTlNQT1JUX0JBQ0tVUF9RVU9UQSk7CmRpZmYgLS1naXQgYS90ZXN0cy9iYWNrdXAvc3JjL2FuZHJvaWQvYmFja3VwL2N0cy9LZXlWYWx1ZUxpZmVjeWNsZVRlc3QuamF2YSBiL3Rlc3RzL2JhY2t1cC9zcmMvYW5kcm9pZC9iYWNrdXAvY3RzL0tleVZhbHVlTGlmZWN5Y2xlVGVzdC5qYXZhCmluZGV4IGQ5NTdiYmMuLjBiYjUyNDMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2JhY2t1cC9zcmMvYW5kcm9pZC9iYWNrdXAvY3RzL0tleVZhbHVlTGlmZWN5Y2xlVGVzdC5qYXZhCisrKyBiL3Rlc3RzL2JhY2t1cC9zcmMvYW5kcm9pZC9iYWNrdXAvY3RzL0tleVZhbHVlTGlmZWN5Y2xlVGVzdC5qYXZhCkBAIC0zMSw3ICszMSw3IEBACiAgICAgICAgIGlmICghaXNCYWNrdXBTdXBwb3J0ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBiYWNrdXBTZXBhcmF0b3IgPSBjbGVhckxvZ2NhdCgpOworICAgICAgICBTdHJpbmcgYmFja3VwU2VwYXJhdG9yID0gbWFya0xvZ2NhdCgpOwogCiAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGVyZSdzIHNvbWV0aGluZyB0byBiYWNrdXAKICAgICAgICAgY3JlYXRlVGVzdEZpbGVPZlNpemUoQkFDS1VQX0FQUF9OQU1FLCBMT0NBTF9UUkFOU1BPUlRfQ09ORk9STUlOR19GSUxFX1NJWkUpOwpAQCAtNDQsNyArNDQsNyBAQAogICAgICAgICAgICAgIkJhY2t1cCByZXF1ZXN0ZWQiLAogICAgICAgICAgICAgIm9uRGVzdHJveSIpOwogCi0gICAgICAgIFN0cmluZyByZXN0b3JlU2VwYXJhdG9yID0gY2xlYXJMb2djYXQoKTsKKyAgICAgICAgU3RyaW5nIHJlc3RvcmVTZXBhcmF0b3IgPSBtYXJrTG9nY2F0KCk7CiAKICAgICAgICAgLy8gTm93IHJlcXVlc3QgcmVzdG9yZSBhbmQgd2FpdCBmb3IgaXQgdG8gY29tcGxldGUKICAgICAgICAgZXhlYygiYm1nciByZXN0b3JlICIgKyBCQUNLVVBfQVBQX05BTUUpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvYmFja3VwL3NyYy9hbmRyb2lkL2JhY2t1cC9jdHMvS2V5VmFsdWVRdW90YVRlc3QuamF2YSBiL3Rlc3RzL2JhY2t1cC9zcmMvYW5kcm9pZC9iYWNrdXAvY3RzL0tleVZhbHVlUXVvdGFUZXN0LmphdmEKaW5kZXggY2VhYTE4ZS4uMmU0MmUyMSAxMDA2NDQKLS0tIGEvdGVzdHMvYmFja3VwL3NyYy9hbmRyb2lkL2JhY2t1cC9jdHMvS2V5VmFsdWVRdW90YVRlc3QuamF2YQorKysgYi90ZXN0cy9iYWNrdXAvc3JjL2FuZHJvaWQvYmFja3VwL2N0cy9LZXlWYWx1ZVF1b3RhVGVzdC5qYXZhCkBAIC0zNiw3ICszNiw3IEBACiAgICAgICAgIGlmICghaXNCYWNrdXBTdXBwb3J0ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBzZXBhcmF0b3IgPSBjbGVhckxvZ2NhdCgpOworICAgICAgICBTdHJpbmcgc2VwYXJhdG9yID0gbWFya0xvZ2NhdCgpOwogICAgICAgICAvLyBMYXVuY2ggdGVzdCBhcHAgYW5kIGNyZWF0ZSBmaWxlIGV4Y2VlZGluZyBsaW1pdCBmb3IgbG9jYWwgdHJhbnNwb3J0CiAgICAgICAgIGNyZWF0ZVRlc3RGaWxlT2ZTaXplKEJBQ0tVUF9BUFBfTkFNRSwgTE9DQUxfVFJBTlNQT1JUX0VYQ0VFRElOR19GSUxFX1NJWkUpOwogCkBAIC01Myw3ICs1Myw3IEBACiAgICAgICAgIC8vIExhdW5jaCB0aGUgbWFpbiBhY3Rpdml0eSBzbyB0aGUgYXBwIHF1YWxpZmllcyBmb3IgYmFja3VwLgogICAgICAgICBjcmVhdGVUZXN0RmlsZU9mU2l6ZShCQUNLVVBfQVBQX05BTUUsIDEpOwogCi0gICAgICAgIFN0cmluZyBzZXBhcmF0b3IgPSBjbGVhckxvZ2NhdCgpOworICAgICAgICBTdHJpbmcgc2VwYXJhdG9yID0gbWFya0xvZ2NhdCgpOwogICAgICAgICBleGVjKCJibWdyIGJhY2t1cG5vdyAiICsgQkFDS1VQX0FQUF9OQU1FKTsKICAgICAgICAgd2FpdEZvckxvZ2NhdChUSU1FT1VUX1NFQ09ORFMsIHNlcGFyYXRvciwKICAgICAgICAgICAgICJxdW90YSBpcyAiICsgTE9DQUxfVFJBTlNQT1JUX0JBQ0tVUF9RVU9UQSk7CmRpZmYgLS1naXQgYS90ZXN0cy9jYW1lcmEvQW5kcm9pZC5tayBiL3Rlc3RzL2NhbWVyYS9BbmRyb2lkLm1rCmluZGV4IGM4YmE5Y2QuLjcyYTM5MWMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2NhbWVyYS9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL2NhbWVyYS9BbmRyb2lkLm1rCkBAIC0xOCw3ICsxOCw3IEBACiAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbCBcCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgXAogCW1vY2tpdG8tdGFyZ2V0LW1pbnVzLWp1bml0NCBcCiAJYW5kcm9pZC1leC1jYW1lcmEyCiAKQEAgLTQxLDExICs0MSwxMiBAQAogIyBJbmNsdWRlIGJvdGggdGhlIDMyIGFuZCA2NCBiaXQgdmVyc2lvbnMKIExPQ0FMX01VTFRJTElCIDo9IGJvdGgKIAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwgXAotCWN0c3Rlc3RydW5uZXIgXAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0IFwKKwljdHN0ZXN0cnVubmVyLWF4dCBcCiAJbW9ja2l0by10YXJnZXQtbWludXMtanVuaXQ0IFwKIAlhbmRyb2lkLWV4LWNhbWVyYTIgXAotCUN0c0NhbWVyYVV0aWxzCisJQ3RzQ2FtZXJhVXRpbHMgXAorCXRydXRoLXByZWJ1aWx0CiAKIExPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTIDo9IFwKIAlsaWJjdHNjYW1lcmEyX2puaSBcCkBAIC01OCwxMyArNTksMTMgQEAKIAkkKGNhbGwgYWxsLXJlbmRlcnNjcmlwdC1maWxlcy11bmRlciwgc3JjKQogCiAjIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0Ci1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMgY3RzX2luc3RhbnQKIAogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0NhbWVyYVRlc3RDYXNlcwogCiBMT0NBTF9TREtfVkVSU0lPTiA6PSB0ZXN0X2N1cnJlbnQKIAotTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lcgorTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lci5zdHVicyBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicwogCiBjdHNfcnVudGltZV9oaW50IDo9IDEyMAogCmRpZmYgLS1naXQgYS90ZXN0cy9jYW1lcmEvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL2NhbWVyYS9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGNkZGVhZWIuLmYzMTFiOTkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2NhbWVyYS9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL2NhbWVyYS9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0xNiw3ICsxNiw4IEBACiAgLS0+CiAKIDxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgcGFja2FnZT0iYW5kcm9pZC5jYW1lcmEuY3RzIj4KKyAgICBwYWNrYWdlPSJhbmRyb2lkLmNhbWVyYS5jdHMiCisgICAgYW5kcm9pZDp0YXJnZXRTYW5kYm94VmVyc2lvbj0iMiI+CiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5ESVNBQkxFX0tFWUdVQVJEIiAvPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQ0FNRVJBIiAvPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVDT1JEX0FVRElPIiAvPgpAQCAtNzcsNyArNzgsNyBAQAogCiAgICAgPC9hcHBsaWNhdGlvbj4KIAotICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuY2FtZXJhLmN0cyIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBvZiBhbmRyb2lkIGNhbWVyYSI+CiAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJsaXN0ZW5lciIKZGlmZiAtLWdpdCBhL3Rlc3RzL2NhbWVyYS9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy9jYW1lcmEvQW5kcm9pZFRlc3QueG1sCmluZGV4IGMwNDZhNTkuLmIyYjY2OTUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2NhbWVyYS9BbmRyb2lkVGVzdC54bWwKKysrIGIvdGVzdHMvY2FtZXJhL0FuZHJvaWRUZXN0LnhtbApAQCAtMTQsNiArMTQsNyBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIENhbWVyYSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iY2FtZXJhIiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CkBAIC0yMiw3ICsyMyw3IEBACiAgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkFuZHJvaWRKVW5pdFRlc3QiID4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJwYWNrYWdlIiB2YWx1ZT0iYW5kcm9pZC5jYW1lcmEuY3RzIiAvPgogICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjEybTdzIiAvPgotICAgICAgICA8IS0tIHRlc3QtdGltZW91dCB1bml0IGlzIG1zLCB2YWx1ZSA9IDIwMCBtaW4gLS0+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC10aW1lb3V0IiB2YWx1ZT0iMTIwMDAwMDAiIC8+CisgICAgICAgIDwhLS0gdGVzdC10aW1lb3V0IHVuaXQgaXMgbXMsIHZhbHVlID0gMzAwIG1pbiAtLT4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXRpbWVvdXQiIHZhbHVlPSIxODAwMDAwMCIgLz4KICAgICA8L3Rlc3Q+CiA8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9jYW1lcmEvYXBpMjV0ZXN0L0FuZHJvaWQubWsgYi90ZXN0cy9jYW1lcmEvYXBpMjV0ZXN0L0FuZHJvaWQubWsKaW5kZXggYTg0ODAzMS4uNTA2ZTQ0NCAxMDA2NDQKLS0tIGEvdGVzdHMvY2FtZXJhL2FwaTI1dGVzdC9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL2NhbWVyYS9hcGkyNXRlc3QvQW5kcm9pZC5tawpAQCAtMjYsOCArMjYsOCBAQAogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsIFwKLSAgICBjdHN0ZXN0cnVubmVyIFwKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBcCisgICAgY3RzdGVzdHJ1bm5lci1heHQgXAogICAgIGFuZHJvaWQtZXgtY2FtZXJhMiBcCiAgICAgQ3RzQ2FtZXJhVXRpbHMKIApAQCAtMzUsNyArMzUsNyBAQAogCiBMT0NBTF9TREtfVkVSU0lPTiA6PSAyNQogCi1MT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzCiAKICMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKIExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2FtZXJhL2FwaTI1dGVzdC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvY2FtZXJhL2FwaTI1dGVzdC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGRkNzdjMmQuLmM0ZDQ3N2UgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2NhbWVyYS9hcGkyNXRlc3QvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy9jYW1lcmEvYXBpMjV0ZXN0L0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTMwLDcgKzMwLDcgQEAKIAogICAgIDwhLS0gIHNlbGYtaW5zdHJ1bWVudGluZyB0ZXN0IHBhY2thZ2UuIC0tPgogICAgIDxpbnN0cnVtZW50YXRpb24KLSAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ2FtZXJhIEFQSTI1IFRlc3QiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5jYW1lcmEuY3RzLmFwaTI1dGVzdCIgPgogICAgIDwvaW5zdHJ1bWVudGF0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvY2FtZXJhL2FwaTI1dGVzdC9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy9jYW1lcmEvYXBpMjV0ZXN0L0FuZHJvaWRUZXN0LnhtbAppbmRleCBhN2IyYWU3Li40NWY1ZDI4IDEwMDY0NAotLS0gYS90ZXN0cy9jYW1lcmEvYXBpMjV0ZXN0L0FuZHJvaWRUZXN0LnhtbAorKysgYi90ZXN0cy9jYW1lcmEvYXBpMjV0ZXN0L0FuZHJvaWRUZXN0LnhtbApAQCAtMTQsNiArMTQsNyBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIENhbWVyYSBBUEkgMjUgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImNhbWVyYSIgLz4KICAgICA8b3B0aW9uIG5hbWU9Im5vdC1zaGFyZGFibGUiIHZhbHVlPSJ0cnVlIiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgpkaWZmIC0tZ2l0IGEvdGVzdHMvY2FtZXJhL2xpYmN0c2NhbWVyYTJqbmkvQW5kcm9pZC5tayBiL3Rlc3RzL2NhbWVyYS9saWJjdHNjYW1lcmEyam5pL0FuZHJvaWQubWsKaW5kZXggZTZhMDc4Zi4uMmNkNGY2NCAxMDA2NDQKLS0tIGEvdGVzdHMvY2FtZXJhL2xpYmN0c2NhbWVyYTJqbmkvQW5kcm9pZC5taworKysgYi90ZXN0cy9jYW1lcmEvbGliY3RzY2FtZXJhMmpuaS9BbmRyb2lkLm1rCkBAIC0zMiw3ICszMiw4IEBACiBMT0NBTF9DRkxBR1MgOj0gLURVTklYX0VOVj0xIC1EcUROR0JpZ0VuZGlhbj0wIC1EcUROR1RocmVhZFNhZmU9MSAtRHFETkdVc2VMaWJKUEVHPTEgLURxRE5HVXNlWE1QPTAgLURxRE5HVmFsaWRhdGU9MSAtRHFETkdWYWxpZGF0ZVRhcmdldD0xIC1EcUFuZHJvaWQ9MSAtZmV4Y2VwdGlvbnMgLVdzaWduLWNvbXBhcmUgLVduby1yZW9yZGVyIC1XZnJhbWUtbGFyZ2VyLXRoYW49MjAwMDAKIAogIyBGbGFncyB0byBhdm9pZCB3YXJuaW5ncyBmcm9tIERORyBTREsKLUxPQ0FMX0NGTEFHUyArPSAtV25vLXVudXNlZC1wYXJhbWV0ZXIKK0xPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2Vycm9yIC1Xbm8tdW51c2VkLXBhcmFtZXRlcgorTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tdW51c2VkLXZhbHVlIC1Xbm8tdW51c2VkLXZhcmlhYmxlCiAKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGliZG5nX3Nka192YWxpZGF0ZSBsaWJqcGVnX3N0YXRpY19uZGsKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYW5kcm9pZCBcCkBAIC00Myw3ICs0NCw3IEBACiAgICAgbGlieiBcCiAKICMgTkRLIGJ1aWxkLCBzaGFyZWQgQysrIHJ1bnRpbWUKLUxPQ0FMX1NES19WRVJTSU9OIDo9IDI0CitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CiBMT0NBTF9OREtfU1RMX1ZBUklBTlQgOj0gYysrX3NoYXJlZAogCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS90ZXN0cy9jYW1lcmEvbGliY3RzY2FtZXJhMmpuaS9uYXRpdmUtY2FtZXJhLWpuaS5jcHAgYi90ZXN0cy9jYW1lcmEvbGliY3RzY2FtZXJhMmpuaS9uYXRpdmUtY2FtZXJhLWpuaS5jcHAKaW5kZXggYjIxMjRjZS4uODhjYjhlZiAxMDA2NDQKLS0tIGEvdGVzdHMvY2FtZXJhL2xpYmN0c2NhbWVyYTJqbmkvbmF0aXZlLWNhbWVyYS1qbmkuY3BwCisrKyBiL3Rlc3RzL2NhbWVyYS9saWJjdHNjYW1lcmEyam5pL25hdGl2ZS1jYW1lcmEtam5pLmNwcApAQCAtMTgsOSArMTgsMTIgQEAKICNkZWZpbmUgTE9HX1RBRyAiTmF0aXZlQ2FtZXJhIgogI2luY2x1ZGUgPGxvZy9sb2cuaD4KIAorI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDxjb25kaXRpb25fdmFyaWFibGU+CiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPG1hcD4KICNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8am5pLmg+CkBAIC0yMzgsNiArMjQxLDE3MyBAQAogICAgIGludCBtT25BY3RpdmUgPSAwOwogfTsKIAorY2xhc3MgQ2FwdHVyZVJlc3VsdExpc3RlbmVyIHsKKyAgcHVibGljOgorICAgIH5DYXB0dXJlUmVzdWx0TGlzdGVuZXIoKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbChtTXV0ZXgpOworICAgICAgICBjbGVhclNhdmVkUmVxdWVzdHNMb2NrZWQoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBvbkNhcHR1cmVTdGFydCh2b2lkKiAvKm9iaiovLCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIC8qc2Vzc2lvbiovLAorICAgICAgICAgICAgY29uc3QgQUNhcHR1cmVSZXF1ZXN0KiAvKnJlcXVlc3QqLywgaW50NjRfdCAvKnRpbWVzdGFtcCovKSB7CisgICAgICAgIC8vTm90IHVzZWQgZm9yIG5vdworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIG9uQ2FwdHVyZVByb2dyZXNzZWQodm9pZCogLypvYmoqLywgQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiAvKnNlc3Npb24qLywKKyAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogLypyZXF1ZXN0Ki8sIGNvbnN0IEFDYW1lcmFNZXRhZGF0YSogLypyZXN1bHQqLykgeworICAgICAgICAvL05vdCB1c2VkIGZvciBub3cKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBvbkNhcHR1cmVDb21wbGV0ZWQodm9pZCogb2JqLCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIC8qc2Vzc2lvbiovLAorICAgICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0LCBjb25zdCBBQ2FtZXJhTWV0YWRhdGEqIHJlc3VsdCkgeworICAgICAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBpZiAoKG9iaiA9PSBudWxscHRyKSB8fCAocmVzdWx0ID09IG51bGxwdHIpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgQ2FwdHVyZVJlc3VsdExpc3RlbmVyKiB0aGl6ID0gcmVpbnRlcnByZXRfY2FzdDxDYXB0dXJlUmVzdWx0TGlzdGVuZXIqPihvYmopOworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayh0aGl6LT5tTXV0ZXgpOworICAgICAgICBBQ2FtZXJhTWV0YWRhdGFfY29uc3RfZW50cnkgZW50cnk7CisgICAgICAgIGF1dG8gcmV0ID0gQUNhbWVyYU1ldGFkYXRhX2dldENvbnN0RW50cnkocmVzdWx0LCBBQ0FNRVJBX1NZTkNfRlJBTUVfTlVNQkVSLCAmZW50cnkpOworICAgICAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJFcnJvcjogU3luYyBmcmFtZSBudW1iZXIgbWlzc2luZyBmcm9tIHJlc3VsdCEiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0aGl6LT5tU2F2ZUNvbXBsZXRlZFJlcXVlc3RzKSB7CisgICAgICAgICAgICB0aGl6LT5tQ29tcGxldGVkUmVxdWVzdHMucHVzaF9iYWNrKEFDYXB0dXJlUmVxdWVzdF9jb3B5KHJlcXVlc3QpKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXotPm1MYXN0Q29tcGxldGVkRnJhbWVOdW1iZXIgPSBlbnRyeS5kYXRhLmk2NFswXTsKKyAgICAgICAgdGhpei0+bVJlc3VsdENvbmRpdGlvbi5ub3RpZnlfb25lKCk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgb25DYXB0dXJlRmFpbGVkKHZvaWQqIG9iaiwgQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiAvKnNlc3Npb24qLywKKyAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogLypyZXF1ZXN0Ki8sIEFDYW1lcmFDYXB0dXJlRmFpbHVyZSogZmFpbHVyZSkgeworICAgICAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBpZiAoKG9iaiA9PSBudWxscHRyKSB8fCAoZmFpbHVyZSA9PSBudWxscHRyKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIENhcHR1cmVSZXN1bHRMaXN0ZW5lciogdGhpeiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q2FwdHVyZVJlc3VsdExpc3RlbmVyKj4ob2JqKTsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sodGhpei0+bU11dGV4KTsKKyAgICAgICAgdGhpei0+bUxhc3RGYWlsZWRGcmFtZU51bWJlciA9IGZhaWx1cmUtPmZyYW1lTnVtYmVyOworICAgICAgICB0aGl6LT5tUmVzdWx0Q29uZGl0aW9uLm5vdGlmeV9vbmUoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBvbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZCh2b2lkKiBvYmosIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogLypzZXNzaW9uKi8sCisgICAgICAgICAgICBpbnQgc2VxdWVuY2VJZCwgaW50NjRfdCBmcmFtZU51bWJlcikgeworICAgICAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBpZiAob2JqID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBDYXB0dXJlUmVzdWx0TGlzdGVuZXIqIHRoaXogPSByZWludGVycHJldF9jYXN0PENhcHR1cmVSZXN1bHRMaXN0ZW5lcio+KG9iaik7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKHRoaXotPm1NdXRleCk7CisgICAgICAgIHRoaXotPm1MYXN0U2VxdWVuY2VJZENvbXBsZXRlZCA9IHNlcXVlbmNlSWQ7CisgICAgICAgIHRoaXotPm1MYXN0U2VxdWVuY2VGcmFtZU51bWJlciA9IGZyYW1lTnVtYmVyOworICAgICAgICB0aGl6LT5tUmVzdWx0Q29uZGl0aW9uLm5vdGlmeV9vbmUoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBvbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQodm9pZCogLypvYmoqLywgQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiAvKnNlc3Npb24qLywKKyAgICAgICAgICAgIGludCAvKnNlcXVlbmNlSWQqLykgeworICAgICAgICAvL05vdCB1c2VkIGZvciBub3cKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBvbkNhcHR1cmVCdWZmZXJMb3N0KHZvaWQqIG9iaiwgQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiAvKnNlc3Npb24qLywKKyAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogLypyZXF1ZXN0Ki8sIEFOYXRpdmVXaW5kb3cqIC8qd2luZG93Ki8sIGludDY0X3QgZnJhbWVOdW1iZXIpIHsKKyAgICAgICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgaWYgKG9iaiA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgQ2FwdHVyZVJlc3VsdExpc3RlbmVyKiB0aGl6ID0gcmVpbnRlcnByZXRfY2FzdDxDYXB0dXJlUmVzdWx0TGlzdGVuZXIqPihvYmopOworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayh0aGl6LT5tTXV0ZXgpOworICAgICAgICB0aGl6LT5tTGFzdExvc3RGcmFtZU51bWJlciA9IGZyYW1lTnVtYmVyOworICAgICAgICB0aGl6LT5tUmVzdWx0Q29uZGl0aW9uLm5vdGlmeV9vbmUoKTsKKyAgICB9CisKKyAgICBpbnQ2NF90IGdldENhcHR1cmVTZXF1ZW5jZUxhc3RGcmFtZU51bWJlcihpbnQ2NF90IHNlcXVlbmNlSWQsIHVpbnQzMl90IHRpbWVvdXRTZWMpIHsKKyAgICAgICAgaW50NjRfdCByZXQgPSAtMTsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsKG1NdXRleCk7CisKKyAgICAgICAgd2hpbGUgKG1MYXN0U2VxdWVuY2VJZENvbXBsZXRlZCAhPSBzZXF1ZW5jZUlkKSB7CisgICAgICAgICAgICBhdXRvIHRpbWVvdXQgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjpub3coKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6c2Vjb25kcyh0aW1lb3V0U2VjKTsKKyAgICAgICAgICAgIGlmIChzdGQ6OmN2X3N0YXR1czo6dGltZW91dCA9PSBtUmVzdWx0Q29uZGl0aW9uLndhaXRfdW50aWwobCwgdGltZW91dCkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChtTGFzdFNlcXVlbmNlSWRDb21wbGV0ZWQgPT0gc2VxdWVuY2VJZCkgeworICAgICAgICAgICAgcmV0ID0gbUxhc3RTZXF1ZW5jZUZyYW1lTnVtYmVyOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBib29sIHdhaXRGb3JGcmFtZU51bWJlcihpbnQ2NF90IGZyYW1lTnVtYmVyLCB1aW50MzJfdCB0aW1lb3V0U2VjKSB7CisgICAgICAgIGJvb2wgcmV0ID0gZmFsc2U7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbChtTXV0ZXgpOworCisgICAgICAgIHdoaWxlICgobUxhc3RDb21wbGV0ZWRGcmFtZU51bWJlciAhPSBmcmFtZU51bWJlcikgJiYKKyAgICAgICAgICAgICAgICAobUxhc3RMb3N0RnJhbWVOdW1iZXIgIT0gZnJhbWVOdW1iZXIpICYmCisgICAgICAgICAgICAgICAgKG1MYXN0RmFpbGVkRnJhbWVOdW1iZXIgIT0gZnJhbWVOdW1iZXIpKSB7CisgICAgICAgICAgICBhdXRvIHRpbWVvdXQgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjpub3coKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6c2Vjb25kcyh0aW1lb3V0U2VjKTsKKyAgICAgICAgICAgIGlmIChzdGQ6OmN2X3N0YXR1czo6dGltZW91dCA9PSBtUmVzdWx0Q29uZGl0aW9uLndhaXRfdW50aWwobCwgdGltZW91dCkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICgobUxhc3RDb21wbGV0ZWRGcmFtZU51bWJlciA9PSBmcmFtZU51bWJlcikgfHwKKyAgICAgICAgICAgICAgICAobUxhc3RMb3N0RnJhbWVOdW1iZXIgPT0gZnJhbWVOdW1iZXIpIHx8CisgICAgICAgICAgICAgICAgKG1MYXN0RmFpbGVkRnJhbWVOdW1iZXIgPT0gZnJhbWVOdW1iZXIpKSB7CisgICAgICAgICAgICByZXQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICB2b2lkIHNldFJlcXVlc3RTYXZlKGJvb2wgZW5hYmxlKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbChtTXV0ZXgpOworICAgICAgICBpZiAoIWVuYWJsZSkgeworICAgICAgICAgICAgY2xlYXJTYXZlZFJlcXVlc3RzTG9ja2VkKCk7CisgICAgICAgIH0KKyAgICAgICAgbVNhdmVDb21wbGV0ZWRSZXF1ZXN0cyA9IGVuYWJsZTsKKyAgICB9CisKKyAgICAvLyBUaGUgbGlmZWN5Y2xlIG9mIHJldHVybmVkIEFDYXB0dXJlUmVxdWVzdCogaXMgc3RpbGwgbWFuYWdlZCBieSBDYXB0dXJlUmVzdWx0TGlzdGVuZXIKKyAgICB2b2lkIGdldENvbXBsZXRlZFJlcXVlc3RzKHN0ZDo6dmVjdG9yPEFDYXB0dXJlUmVxdWVzdCo+KiBvdXQpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsKG1NdXRleCk7CisgICAgICAgICpvdXQgPSBtQ29tcGxldGVkUmVxdWVzdHM7CisgICAgfQorCisgICAgdm9pZCByZXNldCgpIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgbUxhc3RTZXF1ZW5jZUlkQ29tcGxldGVkID0gLTE7CisgICAgICAgIG1MYXN0U2VxdWVuY2VGcmFtZU51bWJlciA9IC0xOworICAgICAgICBtTGFzdENvbXBsZXRlZEZyYW1lTnVtYmVyID0gLTE7CisgICAgICAgIG1MYXN0TG9zdEZyYW1lTnVtYmVyID0gLTE7CisgICAgICAgIG1MYXN0RmFpbGVkRnJhbWVOdW1iZXIgPSAtMTsKKyAgICAgICAgbVNhdmVDb21wbGV0ZWRSZXF1ZXN0cyA9IGZhbHNlOworICAgICAgICBjbGVhclNhdmVkUmVxdWVzdHNMb2NrZWQoKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtUmVzdWx0Q29uZGl0aW9uOworICAgIGludCBtTGFzdFNlcXVlbmNlSWRDb21wbGV0ZWQgPSAtMTsKKyAgICBpbnQ2NF90IG1MYXN0U2VxdWVuY2VGcmFtZU51bWJlciA9IC0xOworICAgIGludDY0X3QgbUxhc3RDb21wbGV0ZWRGcmFtZU51bWJlciA9IC0xOworICAgIGludDY0X3QgbUxhc3RMb3N0RnJhbWVOdW1iZXIgPSAtMTsKKyAgICBpbnQ2NF90IG1MYXN0RmFpbGVkRnJhbWVOdW1iZXIgPSAtMTsKKyAgICBib29sICAgIG1TYXZlQ29tcGxldGVkUmVxdWVzdHMgPSBmYWxzZTsKKyAgICBzdGQ6OnZlY3RvcjxBQ2FwdHVyZVJlcXVlc3QqPiBtQ29tcGxldGVkUmVxdWVzdHM7CisKKyAgICB2b2lkIGNsZWFyU2F2ZWRSZXF1ZXN0c0xvY2tlZCgpIHsKKyAgICAgICAgZm9yIChBQ2FwdHVyZVJlcXVlc3QqIHJlcSA6IG1Db21wbGV0ZWRSZXF1ZXN0cykgeworICAgICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0X2ZyZWUocmVxKTsKKyAgICAgICAgfQorICAgICAgICBtQ29tcGxldGVkUmVxdWVzdHMuY2xlYXIoKTsKKyAgICB9Cit9OwogCiBjbGFzcyBJbWFnZVJlYWRlckxpc3RlbmVyIHsKICAgcHVibGljOgpAQCAtNDAxLDYgKzU3MSw3IEBACiAgICAgLy8gRnJlZSBhbGwgcmVzb3VyY2VzIGV4Y2VwdCBjYW1lcmEgbWFuYWdlcgogICAgIHZvaWQgcmVzZXRDYW1lcmEoKSB7CiAgICAgICAgIG1TZXNzaW9uTGlzdGVuZXIucmVzZXQoKTsKKyAgICAgICAgbVJlc3VsdExpc3RlbmVyLnJlc2V0KCk7CiAgICAgICAgIGlmIChtU2Vzc2lvbikgewogICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2Nsb3NlKG1TZXNzaW9uKTsKICAgICAgICAgICAgIG1TZXNzaW9uID0gbnVsbHB0cjsKQEAgLTUwMiw2ICs2NzMsNDcgQEAKICAgICAgICAgcmV0dXJuIG1DYW1lcmFJZExpc3QtPmNhbWVyYUlkc1tpZHhdOwogICAgIH0KIAorICAgIC8vIENhbGxlciBpcyByZXNwb25zaWJsZSB0byBmcmVlIHJldHVybmVkIGNoYXJhY3RlcmlzdGljcyBtZXRhZGF0YQorICAgIEFDYW1lcmFNZXRhZGF0YSogZ2V0Q2FtZXJhQ2hhcnMoaW50IGlkeCkgeworICAgICAgICBpZiAoIW1NZ3JJbml0ZWQgfHwgIW1DYW1lcmFJZExpc3QgfHwgaWR4IDwgMCB8fCBpZHggPj0gbUNhbWVyYUlkTGlzdC0+bnVtQ2FtZXJhcykgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKworICAgICAgICBBQ2FtZXJhTWV0YWRhdGEqIGNoYXJzOworICAgICAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKAorICAgICAgICAgICAgICAgIG1DYW1lcmFNYW5hZ2VyLCBtQ2FtZXJhSWRMaXN0LT5jYW1lcmFJZHNbaWR4XSwgJmNoYXJzKTsKKyAgICAgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgICAgICBMT0dfRVJST1IoZXJyb3JTdHJpbmcsICJHZXQgY2FtZXJhIGNoYXJhY3RlcmlzdGljcyBmYWlsZWQ6IHJldCAlZCIsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2hhcnM7CisgICAgfQorCisgICAgLy8gQ2FsbGVyIGlzIHJlc3BvbnNpYmxlIHRvIGZyZWUgcmV0dXJuZWQgY2hhcmFjdGVyaXN0aWNzIG1ldGFkYXRhLgorICAgIEFDYW1lcmFNZXRhZGF0YSogZ2V0Q2FtZXJhQ2hhcnMoY29uc3QgY2hhciogaWQpIHsKKyAgICAgICAgaWYgKCFtTWdySW5pdGVkIHx8IGlkID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisKKyAgICAgICAgQUNhbWVyYU1ldGFkYXRhKiBjaGFyczsKKyAgICAgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljcyhtQ2FtZXJhTWFuYWdlciwgaWQsICZjaGFycyk7CisgICAgICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICAgICAgTE9HX0VSUk9SKGVycm9yU3RyaW5nLCAiR2V0IGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MgZmFpbGVkOiByZXQgJWQiLCByZXQpOworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNoYXJzOworICAgIH0KKworICAgIGNhbWVyYV9zdGF0dXNfdCB1cGRhdGVPdXRwdXQoSk5JRW52KiBlbnYsIEFDYXB0dXJlU2Vzc2lvbk91dHB1dCAqb3V0cHV0KSB7CisgICAgICAgIGlmIChtU2Vzc2lvbiA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiVGVzdGNhc2UgY2Fubm90IHVwZGF0ZSBvdXRwdXQgY29uZmlndXJhdGlvbiBzZXNzaW9uICVwIiwKKyAgICAgICAgICAgICAgICAgICAgbVNlc3Npb24pOworICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfVU5LTk9XTjsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fdXBkYXRlU2hhcmVkT3V0cHV0KG1TZXNzaW9uLCBvdXRwdXQpOworICAgIH0KKwogICAgIGNhbWVyYV9zdGF0dXNfdCBvcGVuQ2FtZXJhKGNvbnN0IGNoYXIqIGNhbWVyYUlkKSB7CiAgICAgICAgIGlmIChtRGV2aWNlKSB7CiAgICAgICAgICAgICBBTE9HRSgiQ2Fubm90IG9wZW4gY2FtZXJhIGJlZm9yZSBjbG9zaW5nIHByZXZpb3VzbHkgb3BlbiBvbmUiKTsKQEAgLTU3Myw3ICs3ODUsOCBAQAogICAgICAgICByZXR1cm4gbVByZXZpZXdBbnc7CiAgICAgfQogCi0gICAgY2FtZXJhX3N0YXR1c190IGNyZWF0ZUNhcHR1cmVTZXNzaW9uV2l0aExvZygpIHsKKyAgICBjYW1lcmFfc3RhdHVzX3QgY3JlYXRlQ2FwdHVyZVNlc3Npb25XaXRoTG9nKGJvb2wgaXNQcmV2aWV3U2hhcmVkID0gZmFsc2UsCisgICAgICAgICAgICBBQ2FwdHVyZVJlcXVlc3QgKnNlc3Npb25QYXJhbWV0ZXJzID0gbnVsbHB0cikgewogICAgICAgICBpZiAobVNlc3Npb24pIHsKICAgICAgICAgICAgIExPR19FUlJPUihlcnJvclN0cmluZywgIkNhbm5vdCBjcmVhdGUgc2Vzc2lvbiBiZWZvcmUgY2xvc2luZyBleGlzdGluZyBvbmUiKTsKICAgICAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1VOS05PV047CkBAIC02MTEsNyArODI0LDExIEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAobVByZXZpZXdJbml0ZWQpIHsKLSAgICAgICAgICAgIHJldCA9IEFDYXB0dXJlU2Vzc2lvbk91dHB1dF9jcmVhdGUobVByZXZpZXdBbncsICZtUHJldmlld091dHB1dCk7CisgICAgICAgICAgICBpZiAoaXNQcmV2aWV3U2hhcmVkKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gQUNhcHR1cmVTZXNzaW9uU2hhcmVkT3V0cHV0X2NyZWF0ZShtUHJldmlld0FudywgJm1QcmV2aWV3T3V0cHV0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0ID0gQUNhcHR1cmVTZXNzaW9uT3V0cHV0X2NyZWF0ZShtUHJldmlld0FudywgJm1QcmV2aWV3T3V0cHV0KTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSyB8fCBtUHJldmlld091dHB1dCA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgTE9HX0VSUk9SKGVycm9yU3RyaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgIlNlc3NzaW9uIHByZXZpZXcgb3V0cHV0IGNyZWF0ZSBmYWlsISByZXQgJWQgb3V0cHV0ICVwIiwKQEAgLTYyOSw4ICs4NDYsOCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgcmV0ID0gQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlU2Vzc2lvbigKLSAgICAgICAgICAgICAgICBtRGV2aWNlLCBtT3V0cHV0cywgJm1TZXNzaW9uQ2IsICZtU2Vzc2lvbik7CisgICAgICAgIHJldCA9IEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVNlc3Npb25XaXRoU2Vzc2lvblBhcmFtZXRlcnMoCisgICAgICAgICAgICAgICAgbURldmljZSwgbU91dHB1dHMsIHNlc3Npb25QYXJhbWV0ZXJzLCAmbVNlc3Npb25DYiwgJm1TZXNzaW9uKTsKICAgICAgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LIHx8IG1TZXNzaW9uID09IG51bGxwdHIpIHsKICAgICAgICAgICAgIExPR19FUlJPUihlcnJvclN0cmluZywgIkNyZWF0ZSBzZXNzaW9uIGZvciBjYW1lcmEgJXMgZmFpbGVkLiByZXQgJWQgc2Vzc2lvbiAlcCIsCiAgICAgICAgICAgICAgICAgICAgIG1DYW1lcmFJZCwgcmV0LCBtU2Vzc2lvbik7CkBAIC03NDMsMTUgKzk2MCw2OSBAQAogICAgICAgICByZXR1cm4gQUNBTUVSQV9PSzsKICAgICB9CiAKLSAgICBjYW1lcmFfc3RhdHVzX3Qgc3RhcnRQcmV2aWV3KCkgeworICAgIC8vIFRoZSBvdXRwdXQgQUNhcHR1cmVSZXF1ZXN0KiBpcyBzdGlsbCBtYW5hZ2VkIGJ5IHRlc3RjYXNlIGNsYXNzCisgICAgY2FtZXJhX3N0YXR1c190IGdldFN0aWxsUmVxdWVzdChBQ2FwdHVyZVJlcXVlc3QqKiBvdXQpIHsKKyAgICAgICAgaWYgKG1TdGlsbFJlcXVlc3QgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkNhbWVyYSAlcyBTdGlsbCBjYXB0dXJlIHJlcXVlc3QgaGFzbid0IGJlZW4gY3JlYXRlZCIsIG1DYW1lcmFJZCk7CisgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgICAgfQorICAgICAgICAqb3V0ID0gbVN0aWxsUmVxdWVzdDsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfT0s7CisgICAgfQorCisgICAgY2FtZXJhX3N0YXR1c190IGdldFByZXZpZXdSZXF1ZXN0KEFDYXB0dXJlUmVxdWVzdCoqIG91dCkgeworICAgICAgICBpZiAobVByZXZpZXdSZXF1ZXN0ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDYW1lcmEgJXMgUHJldmlldyBjYXB0dXJlIHJlcXVlc3QgaGFzbid0IGJlZW4gY3JlYXRlZCIsIG1DYW1lcmFJZCk7CisgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgICAgfQorICAgICAgICAqb3V0ID0gbVByZXZpZXdSZXF1ZXN0OworICAgICAgICByZXR1cm4gQUNBTUVSQV9PSzsKKyAgICB9CisKKyAgICBjYW1lcmFfc3RhdHVzX3Qgc3RhcnRQcmV2aWV3KGludCAqc2VxdWVuY2VJZCA9IG51bGxwdHIpIHsKICAgICAgICAgaWYgKG1TZXNzaW9uID09IG51bGxwdHIgfHwgbVByZXZpZXdSZXF1ZXN0ID09IG51bGxwdHIpIHsKICAgICAgICAgICAgIEFMT0dFKCJUZXN0Y2FzZSBjYW5ub3Qgc3RhcnQgcHJldmlldzogc2Vzc2lvbiAlcCwgcHJldmlldyByZXF1ZXN0ICVwIiwKICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb24sIG1QcmV2aWV3UmVxdWVzdCk7CiAgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9VTktOT1dOOwogICAgICAgICB9CiAgICAgICAgIGludCBwcmV2aWV3U2VxSWQ7Ci0gICAgICAgIHJldHVybiBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fc2V0UmVwZWF0aW5nUmVxdWVzdCgKLSAgICAgICAgICAgICAgICBtU2Vzc2lvbiwgbnVsbHB0ciwgMSwgJm1QcmV2aWV3UmVxdWVzdCwgJnByZXZpZXdTZXFJZCk7CisgICAgICAgIGNhbWVyYV9zdGF0dXNfdCByZXQ7CisgICAgICAgIGlmIChzZXF1ZW5jZUlkID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldCA9IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zZXRSZXBlYXRpbmdSZXF1ZXN0KAorICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uLCBudWxscHRyLCAxLCAmbVByZXZpZXdSZXF1ZXN0LCAmcHJldmlld1NlcUlkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldCA9IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zZXRSZXBlYXRpbmdSZXF1ZXN0KAorICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uLCAmbVJlc3VsdENiLCAxLCAmbVByZXZpZXdSZXF1ZXN0LCBzZXF1ZW5jZUlkKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGNhbWVyYV9zdGF0dXNfdCB1cGRhdGVSZXBlYXRpbmdSZXF1ZXN0KEFDYXB0dXJlUmVxdWVzdCAqdXBkYXRlZFJlcXVlc3QsCisgICAgICAgICAgICBpbnQgKnNlcXVlbmNlSWQgPSBudWxscHRyKSB7CisgICAgICAgIGlmIChtU2Vzc2lvbiA9PSBudWxscHRyIHx8IHVwZGF0ZWRSZXF1ZXN0ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJUZXN0Y2FzZSBjYW5ub3QgdXBkYXRlIHJlcGVhdGluZyByZXF1ZXN0OiBzZXNzaW9uICVwLCB1cGRhdGVkIHJlcXVlc3QgJXAiLAorICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbiwgdXBkYXRlZFJlcXVlc3QpOworICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfVU5LTk9XTjsKKyAgICAgICAgfQorCisgICAgICAgIGludCBwcmV2aWV3U2VxSWQ7CisgICAgICAgIGNhbWVyYV9zdGF0dXNfdCByZXQ7CisgICAgICAgIGlmIChzZXF1ZW5jZUlkID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldCA9IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zZXRSZXBlYXRpbmdSZXF1ZXN0KAorICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbiwgbnVsbHB0ciwgMSwgJnVwZGF0ZWRSZXF1ZXN0LCAmcHJldmlld1NlcUlkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldCA9IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zZXRSZXBlYXRpbmdSZXF1ZXN0KAorICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbiwgJm1SZXN1bHRDYiwgMSwgJnVwZGF0ZWRSZXF1ZXN0LCBzZXF1ZW5jZUlkKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGludDY0X3QgZ2V0Q2FwdHVyZVNlcXVlbmNlTGFzdEZyYW1lTnVtYmVyKGludDY0X3Qgc2VxdWVuY2VJZCwgdWludDMyX3QgdGltZW91dFNlYykgeworICAgICAgICByZXR1cm4gbVJlc3VsdExpc3RlbmVyLmdldENhcHR1cmVTZXF1ZW5jZUxhc3RGcmFtZU51bWJlcihzZXF1ZW5jZUlkLCB0aW1lb3V0U2VjKTsKKyAgICB9CisKKyAgICBib29sIHdhaXRGb3JGcmFtZU51bWJlcihpbnQ2NF90IGZyYW1lTnVtYmVyLCB1aW50MzJfdCB0aW1lb3V0U2VjKSB7CisgICAgICAgIHJldHVybiBtUmVzdWx0TGlzdGVuZXIud2FpdEZvckZyYW1lTnVtYmVyKGZyYW1lTnVtYmVyLCB0aW1lb3V0U2VjKTsKICAgICB9CiAKICAgICBjYW1lcmFfc3RhdHVzX3QgdGFrZVBpY3R1cmUoKSB7CkBAIC03NjUsNiArMTAzNiwxOCBAQAogICAgICAgICAgICAgICAgIG1TZXNzaW9uLCBudWxscHRyLCAxLCAmbVN0aWxsUmVxdWVzdCwgJnNlcUlkKTsKICAgICB9CiAKKyAgICBjYW1lcmFfc3RhdHVzX3QgY2FwdHVyZShBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QsCisgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyogbGlzdGVuZXIsCisgICAgICAgICAgICAvKm91dCovaW50KiBzZXFJZCkgeworICAgICAgICBpZiAobVNlc3Npb24gPT0gbnVsbHB0ciB8fCByZXF1ZXN0ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJUZXN0Y2FzZSBjYW5ub3QgY2FwdHVyZSBzZXNzaW9uOiBzZXNzaW9uICVwLCByZXF1ZXN0ICVwIiwKKyAgICAgICAgICAgICAgICAgICAgbVNlc3Npb24sIHJlcXVlc3QpOworICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfVU5LTk9XTjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmUoCisgICAgICAgICAgICAgICAgbVNlc3Npb24sIGxpc3RlbmVyLCAxLCAmcmVxdWVzdCwgc2VxSWQpOworICAgIH0KKwogICAgIGNhbWVyYV9zdGF0dXNfdCByZXNldFdpdGhFcnJvckxvZygpIHsKICAgICAgICAgY2FtZXJhX3N0YXR1c190IHJldDsKIApAQCAtNzg1LDYgKzEwNjgsNyBAQAogICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfVU5LTk9XTjsKICAgICAgICAgfQogICAgICAgICBtU2Vzc2lvbkxpc3RlbmVyLnJlc2V0KCk7CisgICAgICAgIG1SZXN1bHRMaXN0ZW5lci5yZXNldCgpOwogCiAgICAgICAgIHJldCA9IGNsb3NlQ2FtZXJhKCk7CiAgICAgICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgewpAQCAtODAwLDYgKzEwODQsMTQgQEAKICAgICAgICAgcmV0dXJuICZtU2Vzc2lvbkxpc3RlbmVyOwogICAgIH0KIAorICAgIEFDYW1lcmFEZXZpY2UqIGdldENhbWVyYURldmljZSgpIHsKKyAgICAgICAgcmV0dXJuIG1EZXZpY2U7CisgICAgfQorCisgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0ICpnZXRQcmV2aWV3T3V0cHV0KCkgeworICAgICAgICByZXR1cm4gbVByZXZpZXdPdXRwdXQ7CisgICAgfQorCiAgIHByaXZhdGU6CiAgICAgQUNhbWVyYU1hbmFnZXIqIGNyZWF0ZU1hbmFnZXIoKSB7CiAgICAgICAgIGlmICghbUNhbWVyYU1hbmFnZXIpIHsKQEAgLTgyOCw2ICsxMTIwLDE4IEBACiAgICAgICAgIENhcHR1cmVTZXNzaW9uTGlzdGVuZXI6Om9uQWN0aXZlCiAgICAgfTsKIAorICAgIENhcHR1cmVSZXN1bHRMaXN0ZW5lciBtUmVzdWx0TGlzdGVuZXI7CisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MgbVJlc3VsdENiIHsKKyAgICAgICAgJm1SZXN1bHRMaXN0ZW5lciwKKyAgICAgICAgQ2FwdHVyZVJlc3VsdExpc3RlbmVyOjpvbkNhcHR1cmVTdGFydCwKKyAgICAgICAgQ2FwdHVyZVJlc3VsdExpc3RlbmVyOjpvbkNhcHR1cmVQcm9ncmVzc2VkLAorICAgICAgICBDYXB0dXJlUmVzdWx0TGlzdGVuZXI6Om9uQ2FwdHVyZUNvbXBsZXRlZCwKKyAgICAgICAgQ2FwdHVyZVJlc3VsdExpc3RlbmVyOjpvbkNhcHR1cmVGYWlsZWQsCisgICAgICAgIENhcHR1cmVSZXN1bHRMaXN0ZW5lcjo6b25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQsCisgICAgICAgIENhcHR1cmVSZXN1bHRMaXN0ZW5lcjo6b25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkLAorICAgICAgICBDYXB0dXJlUmVzdWx0TGlzdGVuZXI6Om9uQ2FwdHVyZUJ1ZmZlckxvc3QKKyAgICB9OworCiAgICAgQUNhbWVyYUlkTGlzdCogbUNhbWVyYUlkTGlzdCA9IG51bGxwdHI7CiAgICAgQUNhbWVyYURldmljZSogbURldmljZSA9IG51bGxwdHI7CiAgICAgQUltYWdlUmVhZGVyKiBtSW1nUmVhZGVyID0gbnVsbHB0cjsKQEAgLTEyNDEsNiArMTU0NSwzNCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgdm9pZCogY29udGV4dCA9IG51bGxwdHI7CisgICAgICAgICAgICByZXQgPSBBQ2FwdHVyZVJlcXVlc3RfZ2V0VXNlckNvbnRleHQocmVxdWVzdCwgJmNvbnRleHQpOworICAgICAgICAgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgTE9HX0VSUk9SKGVycm9yU3RyaW5nLCAiR2V0IGNhcHR1cmUgcmVxdWVzdCBjb250ZXh0IGZhaWxlZDogcmV0ICVkIiwgcmV0KTsKKyAgICAgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY29udGV4dCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgTE9HX0VSUk9SKGVycm9yU3RyaW5nLCAiQ2FwdHVyZSByZXF1ZXN0IGNvbnRleHQgaXMgbm90IG51bGw6ICVwIiwgY29udGV4dCk7CisgICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnRwdHJfdCBtYWdpY19udW0gPSAweEJFRUY7CisgICAgICAgICAgICByZXQgPSBBQ2FwdHVyZVJlcXVlc3Rfc2V0VXNlckNvbnRleHQocmVxdWVzdCwgKHZvaWQqKSBtYWdpY19udW0pOworICAgICAgICAgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgTE9HX0VSUk9SKGVycm9yU3RyaW5nLCAiU2V0IGNhcHR1cmUgcmVxdWVzdCBjb250ZXh0IGZhaWxlZDogcmV0ICVkIiwgcmV0KTsKKyAgICAgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldCA9IEFDYXB0dXJlUmVxdWVzdF9nZXRVc2VyQ29udGV4dChyZXF1ZXN0LCAmY29udGV4dCk7CisgICAgICAgICAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgICAgICAgICBMT0dfRVJST1IoZXJyb3JTdHJpbmcsICJHZXQgY2FwdHVyZSByZXF1ZXN0IGNvbnRleHQgZmFpbGVkOiByZXQgJWQiLCByZXQpOworICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjb250ZXh0ICE9ICh2b2lkKikgbWFnaWNfbnVtKSB7CisgICAgICAgICAgICAgICAgTE9HX0VSUk9SKGVycm9yU3RyaW5nLCAiQ2FwdHVyZSByZXF1ZXN0IGNvbnRleHQgaXMgd3Jvbmc6ICVwIiwgY29udGV4dCk7CisgICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAvLyB0cnkgZ2V0L3NldCBjYXB0dXJlIHJlcXVlc3QgZmllbGRzCiAgICAgICAgICAgICBBQ2FtZXJhTWV0YWRhdGFfY29uc3RfZW50cnkgZW50cnk7CiAgICAgICAgICAgICByZXQgPSBBQ2FwdHVyZVJlcXVlc3RfZ2V0Q29uc3RFbnRyeShyZXF1ZXN0LCBBQ0FNRVJBX0NPTlRST0xfQUVfTU9ERSwgJmVudHJ5KTsKQEAgLTEzODMsNiArMTcxNSwxOCBAQAogICAgICAgICAgICAgZ290byBjbGVhbnVwOwogICAgICAgICB9CiAKKyAgICAgICAgeworICAgICAgICAgICAgQUNhbWVyYU1ldGFkYXRhKiBjaGFycyA9IHRlc3RDYXNlLmdldENhbWVyYUNoYXJzKGNhbWVyYUlkKTsKKyAgICAgICAgICAgIFN0YXRpY0luZm8gc3RhdGljSW5mbyhjaGFycyk7CisgICAgICAgICAgICBpZiAoIXN0YXRpY0luZm8uaXNDb2xvck91dHB1dFN1cHBvcnRlZCgpKSB7CisgICAgICAgICAgICAgICAgQUxPR0koIiVzOiBjYW1lcmEgJXMgZG9lcyBub3Qgc3VwcG9ydCBjb2xvciBvdXRwdXQuIHNraXBwaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQpOworICAgICAgICAgICAgICAgIEFDYW1lcmFNZXRhZGF0YV9mcmVlKGNoYXJzKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFDYW1lcmFNZXRhZGF0YV9mcmVlKGNoYXJzKTsKKyAgICAgICAgfQorCiAgICAgICAgIHJldCA9IHRlc3RDYXNlLm9wZW5DYW1lcmEoY2FtZXJhSWQpOwogICAgICAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKICAgICAgICAgICAgIExPR19FUlJPUihlcnJvclN0cmluZywgIk9wZW4gY2FtZXJhIGRldmljZSAlcyBmYWlsdXJlLiByZXQgJWQiLCBjYW1lcmFJZCwgcmV0KTsKQEAgLTE0ODMsNiArMTgyNywyNzUgQEAKIAogZXh0ZXJuICJDIiBqYm9vbGVhbgogSmF2YV9hbmRyb2lkX2hhcmR3YXJlX2NhbWVyYTJfY3RzX05hdGl2ZUNhbWVyYURldmljZVRlc3RfXAordGVzdENhbWVyYURldmljZVNoYXJlZE91dHB1dFVwZGF0ZSgKKyAgICAgICAgSk5JRW52KiBlbnYsIGpjbGFzcyAvKmNsYXp6Ki8sIGpvYmplY3QgalByZXZpZXdTdXJmYWNlLCBqb2JqZWN0IGpTaGFyZWRTdXJmYWNlKSB7CisgICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKKyAgICBpbnQgbnVtQ2FtZXJhcyA9IDA7CisgICAgYm9vbCBwYXNzID0gZmFsc2U7CisgICAgUHJldmlld1Rlc3RDYXNlIHRlc3RDYXNlOworICAgIGludCBzZXF1ZW5jZUlkID0gLTE7CisgICAgaW50NjRfdCBsYXN0RnJhbWVOdW1iZXIgPSAwOworICAgIGJvb2wgZnJhbWVBcnJpdmVkID0gZmFsc2U7CisgICAgQU5hdGl2ZVdpbmRvdyogcHJldmlld0FudyA9IG51bGxwdHI7CisgICAgQU5hdGl2ZVdpbmRvdyogc2hhcmVkQW53ID0gQU5hdGl2ZVdpbmRvd19mcm9tU3VyZmFjZShlbnYsIGpTaGFyZWRTdXJmYWNlKTsKKyAgICBBQ2FwdHVyZVJlcXVlc3QqIHVwZGF0ZWRSZXF1ZXN0ID0gbnVsbHB0cjsKKyAgICBBQ2FtZXJhT3V0cHV0VGFyZ2V0KiByZXFQcmV2aWV3T3V0cHV0ID0gbnVsbHB0cjsKKyAgICBBQ2FtZXJhT3V0cHV0VGFyZ2V0KiByZXFTaGFyZWRPdXRwdXQgPSBudWxscHRyOworICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dCAqcHJldmlld091dHB1dCA9IG51bGxwdHI7CisgICAgdWludDMyX3QgdGltZW91dFNlYyA9IDE7CisgICAgdWludDMyX3QgcnVuUHJldmlld1NlYyA9IDI7CisKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gdGVzdENhc2UuaW5pdFdpdGhFcnJvckxvZygpOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICAvLyBEb24ndCBsb2cgZXJyb3IgaGVyZS4gdGVzdGNhc2UgZGlkIGl0CisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CisKKyAgICBudW1DYW1lcmFzID0gdGVzdENhc2UuZ2V0TnVtQ2FtZXJhcygpOworICAgIGlmIChudW1DYW1lcmFzIDwgMCkgeworICAgICAgICBMT0dfRVJST1IoZXJyb3JTdHJpbmcsICJUZXN0Y2FzZSByZXR1cm5lZCBuZWdhdnRpdmUgbnVtYmVyIG9mIGNhbWVyYXM6ICVkIiwgbnVtQ2FtZXJhcyk7CisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUNhbWVyYXM7IGkrKykgeworICAgICAgICBjb25zdCBjaGFyKiBjYW1lcmFJZCA9IHRlc3RDYXNlLmdldENhbWVyYUlkKGkpOworICAgICAgICBpZiAoY2FtZXJhSWQgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgTE9HX0VSUk9SKGVycm9yU3RyaW5nLCAiVGVzdGNhc2UgcmV0dXJuZWQgbnVsbCBjYW1lcmEgaWQgZm9yIGNhbWVyYSAlZCIsIGkpOworICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICB9CisKKyAgICAgICAgeworICAgICAgICAgICAgQUNhbWVyYU1ldGFkYXRhKiBjaGFycyA9IHRlc3RDYXNlLmdldENhbWVyYUNoYXJzKGNhbWVyYUlkKTsKKyAgICAgICAgICAgIFN0YXRpY0luZm8gc3RhdGljSW5mbyhjaGFycyk7CisgICAgICAgICAgICBpZiAoIXN0YXRpY0luZm8uaXNDb2xvck91dHB1dFN1cHBvcnRlZCgpKSB7CisgICAgICAgICAgICAgICAgQUxPR0koIiVzOiBjYW1lcmEgJXMgZG9lcyBub3Qgc3VwcG9ydCBjb2xvciBvdXRwdXQuIHNraXBwaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQpOworICAgICAgICAgICAgICAgIEFDYW1lcmFNZXRhZGF0YV9mcmVlKGNoYXJzKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFDYW1lcmFNZXRhZGF0YV9mcmVlKGNoYXJzKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IHRlc3RDYXNlLm9wZW5DYW1lcmEoY2FtZXJhSWQpOworICAgICAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgICAgIExPR19FUlJPUihlcnJvclN0cmluZywgIk9wZW4gY2FtZXJhIGRldmljZSAlcyBmYWlsdXJlLiByZXQgJWQiLCBjYW1lcmFJZCwgcmV0KTsKKyAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgICAgfQorCisgICAgICAgIHVzbGVlcCgxMDAwMDApOyAvLyBzbGVlcCB0byBnaXZlIHNvbWUgdGltZSBmb3IgY2FsbGJhY2tzIHRvIGhhcHBlbgorCisgICAgICAgIGlmICh0ZXN0Q2FzZS5pc0NhbWVyYUF2YWlsYWJsZShjYW1lcmFJZCkpIHsKKyAgICAgICAgICAgIExPR19FUlJPUihlcnJvclN0cmluZywgIkNhbWVyYSAlcyBzaG91bGQgYmUgdW5hdmFpbGFibGUgbm93IiwgY2FtZXJhSWQpOworICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICB9CisKKyAgICAgICAgcHJldmlld0FudyA9IHRlc3RDYXNlLmluaXRQcmV2aWV3QW53KGVudiwgalByZXZpZXdTdXJmYWNlKTsKKyAgICAgICAgaWYgKHByZXZpZXdBbncgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgTE9HX0VSUk9SKGVycm9yU3RyaW5nLCAiTnVsbCBBTlcgZnJvbSBwcmV2aWV3IHN1cmZhY2UhIik7CisgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSB0ZXN0Q2FzZS5jcmVhdGVDYXB0dXJlU2Vzc2lvbldpdGhMb2codHJ1ZSk7CisgICAgICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICAgICAgLy8gRG9uJ3QgbG9nIGVycm9yIGhlcmUuIHRlc3RjYXNlIGRpZCBpdAorICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gdGVzdENhc2UuY3JlYXRlUmVxdWVzdHNXaXRoRXJyb3JMb2coKTsKKyAgICAgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAvLyBEb24ndCBsb2cgZXJyb3IgaGVyZS4gdGVzdGNhc2UgZGlkIGl0CisgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSB0ZXN0Q2FzZS5zdGFydFByZXZpZXcoKTsKKyAgICAgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgICAgICBMT0dfRVJST1IoZXJyb3JTdHJpbmcsICJTdGFydCBwcmV2aWV3IGZhaWxlZCEiKTsKKyAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgICAgfQorCisgICAgICAgIHNsZWVwKHJ1blByZXZpZXdTZWMpOworCisgICAgICAgIHByZXZpZXdPdXRwdXQgPSB0ZXN0Q2FzZS5nZXRQcmV2aWV3T3V0cHV0KCk7CisgICAgICAgIC8vVHJ5IHNvbWUgYmFkIGlucHV0CisgICAgICAgIHJldCA9IEFDYXB0dXJlU2Vzc2lvblNoYXJlZE91dHB1dF9hZGQocHJldmlld091dHB1dCwgcHJldmlld0Fudyk7CisgICAgICAgIGlmIChyZXQgIT0gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUikgeworICAgICAgICAgICAgTE9HX0VSUk9SKGVycm9yU3RyaW5nLCAiQUNhcHR1cmVTZXNzaW9uU2hhcmVkT3V0cHV0X2FkZCBzaG91bGQgcmV0dXJuIGludmFsaWQgIgorICAgICAgICAgICAgICAgICAgICAicGFyYW1ldGVyISAlZCIsIHJldCk7CisgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSBBQ2FwdHVyZVNlc3Npb25TaGFyZWRPdXRwdXRfcmVtb3ZlKHByZXZpZXdPdXRwdXQsIHByZXZpZXdBbncpOworICAgICAgICBpZiAocmV0ICE9IEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpIHsKKyAgICAgICAgICAgIExPR19FUlJPUihlcnJvclN0cmluZywgIkFDYXB0dXJlU2Vzc2lvblNoYXJlZE91dHB1dF9yZW1vdmUgc2hvdWxkIHJldHVybiBpbnZhbGlkICIKKyAgICAgICAgICAgICAgICAgICAgInBhcmFtZXRlciEgJWQiLCByZXQpOworICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICB9CisKKyAgICAgICAgLy9Ob3cgdHJ5IHdpdGggdmFsaWQgaW5wdXQKKyAgICAgICAgcmV0ID0gQUNhcHR1cmVTZXNzaW9uU2hhcmVkT3V0cHV0X2FkZChwcmV2aWV3T3V0cHV0LCBzaGFyZWRBbncpOworICAgICAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgICAgIExPR19FUlJPUihlcnJvclN0cmluZywgIkFDYXB0dXJlU2Vzc2lvblNoYXJlZE91dHB1dF9hZGQgZmFpbGVkISIpCisgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSB0ZXN0Q2FzZS51cGRhdGVPdXRwdXQoZW52LCBwcmV2aWV3T3V0cHV0KTsKKyAgICAgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgICAgICBMT0dfRVJST1IoZXJyb3JTdHJpbmcsICJGYWlsZWQgdG8gdXBkYXRlIG91dHB1dCBjb25maWd1cmF0aW9uISIpCisgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVSZXF1ZXN0KAorICAgICAgICAgICAgICAgIHRlc3RDYXNlLmdldENhbWVyYURldmljZSgpLCBURU1QTEFURV9QUkVWSUVXLCAmdXBkYXRlZFJlcXVlc3QpOworICAgICAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgICAgIExPR19FUlJPUihlcnJvclN0cmluZywgIkNhbWVyYSAlcyBjcmVhdGUgcHJldmlldyByZXF1ZXN0IGZhaWxlZC4gcmV0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQsIHJldCk7CisgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSBBQ2FtZXJhT3V0cHV0VGFyZ2V0X2NyZWF0ZShwcmV2aWV3QW53LCAmcmVxUHJldmlld091dHB1dCk7CisgICAgICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICAgICAgTE9HX0VSUk9SKGVycm9yU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAiQ2FtZXJhICVzIGNyZWF0ZSByZXF1ZXN0IHByZXZpZXcgb3V0cHV0IHRhcmdldCBmYWlsZWQuIHJldCAlZCIsCisgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkLCByZXQpOworICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gQUNhcHR1cmVSZXF1ZXN0X2FkZFRhcmdldCh1cGRhdGVkUmVxdWVzdCwgcmVxUHJldmlld091dHB1dCk7CisgICAgICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICAgICAgTE9HX0VSUk9SKGVycm9yU3RyaW5nLCAiQ2FtZXJhICVzIGFkZCBwcmV2aWV3IHJlcXVlc3Qgb3V0cHV0IGZhaWxlZC4gcmV0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQsIHJldCk7CisgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSBBQ2FtZXJhT3V0cHV0VGFyZ2V0X2NyZWF0ZShzaGFyZWRBbncsICZyZXFTaGFyZWRPdXRwdXQpOworICAgICAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgICAgIExPR19FUlJPUihlcnJvclN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgIkNhbWVyYSAlcyBjcmVhdGUgcmVxdWVzdCBwcmV2aWV3IG91dHB1dCB0YXJnZXQgZmFpbGVkLiByZXQgJWQiLAorICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZCwgcmV0KTsKKyAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IEFDYXB0dXJlUmVxdWVzdF9hZGRUYXJnZXQodXBkYXRlZFJlcXVlc3QsIHJlcVNoYXJlZE91dHB1dCk7CisgICAgICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICAgICAgTE9HX0VSUk9SKGVycm9yU3RyaW5nLCAiQ2FtZXJhICVzIGFkZCBwcmV2aWV3IHJlcXVlc3Qgb3V0cHV0IGZhaWxlZC4gcmV0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQsIHJldCk7CisgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSB0ZXN0Q2FzZS51cGRhdGVSZXBlYXRpbmdSZXF1ZXN0KHVwZGF0ZWRSZXF1ZXN0LCAmc2VxdWVuY2VJZCk7CisgICAgICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICAgICAgTE9HX0VSUk9SKGVycm9yU3RyaW5nLCAiQ2FtZXJhICVzIGZhaWxlZCB0byB1cGRhdGUgcmVwZWF0ZWQgcmVxdWVzdC4gcmV0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQsIHJldCk7CisgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgIH0KKworICAgICAgICBzbGVlcChydW5QcmV2aWV3U2VjKTsKKworICAgICAgICByZXQgPSBBQ2FwdHVyZVNlc3Npb25TaGFyZWRPdXRwdXRfcmVtb3ZlKHByZXZpZXdPdXRwdXQsIHNoYXJlZEFudyk7CisgICAgICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICAgICAgTE9HX0VSUk9SKGVycm9yU3RyaW5nLCAiQUNhcHR1cmVTZXNzaW9uU2hhcmVkT3V0cHV0X3JlbW92ZSBmYWlsZWQhIik7CisgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgIH0KKworICAgICAgICAvL1RyeSByZW1vdmluZyBzaGFyZWQgb3V0cHV0IHdoaWNoIHN0aWxsIGhhcyBwZW5kaW5nIGNhbWVyYSByZXF1ZXN0cworICAgICAgICByZXQgPSB0ZXN0Q2FzZS51cGRhdGVPdXRwdXQoZW52LCBwcmV2aWV3T3V0cHV0KTsKKyAgICAgICAgaWYgKHJldCAhPSBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSKSB7CisgICAgICAgICAgICBMT0dfRVJST1IoZXJyb3JTdHJpbmcsICJ1cGRhdGVPdXRwdXQgc2hvdWxkIGZhaWwhIik7CisgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgIH0KKworICAgICAgICAvL1JlbW92ZSB0aGUgc2hhcmVkIG91dHB1dCBjb3JyZWN0bHkgYnkgdXBkYXRpbmcgdGhlIHJlcGVhdGluZyByZXF1ZXN0CisgICAgICAgIC8vZmlyc3QKKyAgICAgICAgcmV0ID0gQUNhcHR1cmVSZXF1ZXN0X3JlbW92ZVRhcmdldCh1cGRhdGVkUmVxdWVzdCwgcmVxU2hhcmVkT3V0cHV0KTsKKyAgICAgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgICAgICBMT0dfRVJST1IoZXJyb3JTdHJpbmcsICJDYW1lcmEgJXMgcmVtb3ZlIHRhcmdldCBvdXRwdXQgZmFpbGVkLiByZXQgJWQiLAorICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZCwgcmV0KTsKKyAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IHRlc3RDYXNlLnVwZGF0ZVJlcGVhdGluZ1JlcXVlc3QodXBkYXRlZFJlcXVlc3QpOworICAgICAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgICAgIExPR19FUlJPUihlcnJvclN0cmluZywgIkNhbWVyYSAlcyBmYWlsZWQgdG8gdXBkYXRlIHJlcGVhdGVkIHJlcXVlc3QuIHJldCAlZCIsCisgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkLCByZXQpOworICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICB9CisKKyAgICAgICAgLy9UaGVuIHdhaXQgZm9yIGFsbCBvbGQgcmVxdWVzdHMgdG8gZmx1c2gKKyAgICAgICAgbGFzdEZyYW1lTnVtYmVyID0gdGVzdENhc2UuZ2V0Q2FwdHVyZVNlcXVlbmNlTGFzdEZyYW1lTnVtYmVyKHNlcXVlbmNlSWQsIHRpbWVvdXRTZWMpOworICAgICAgICBpZiAobGFzdEZyYW1lTnVtYmVyIDwgMCkgeworICAgICAgICAgICAgTE9HX0VSUk9SKGVycm9yU3RyaW5nLCAiQ2FtZXJhICVzIGZhaWxlZCB0byBhY3F1aXJlIGxhc3QgZnJhbWUgbnVtYmVyISIsCisgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkKTsKKyAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgICAgfQorCisgICAgICAgIGZyYW1lQXJyaXZlZCA9IHRlc3RDYXNlLndhaXRGb3JGcmFtZU51bWJlcihsYXN0RnJhbWVOdW1iZXIsIHRpbWVvdXRTZWMpOworICAgICAgICBpZiAoIWZyYW1lQXJyaXZlZCkgeworICAgICAgICAgICAgTE9HX0VSUk9SKGVycm9yU3RyaW5nLCAiQ2FtZXJhICVzIHRpbWVkIG91dCB3YWl0aW5nIG9uIGxhc3QgZnJhbWUgbnVtYmVyISIsCisgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkKTsKKyAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IHRlc3RDYXNlLnVwZGF0ZU91dHB1dChlbnYsIHByZXZpZXdPdXRwdXQpOworICAgICAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgICAgIExPR19FUlJPUihlcnJvclN0cmluZywgInVwZGF0ZU91dHB1dCBmYWlsZWQhIik7CisgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgIH0KKworICAgICAgICBzbGVlcChydW5QcmV2aWV3U2VjKTsKKworICAgICAgICByZXQgPSB0ZXN0Q2FzZS5yZXNldFdpdGhFcnJvckxvZygpOworICAgICAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgICAgIC8vIERvbid0IGxvZyBlcnJvciBoZXJlLiB0ZXN0Y2FzZSBkaWQgaXQKKyAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgICAgfQorCisgICAgICAgIHVzbGVlcCgxMDAwMDApOyAvLyBzbGVlcCB0byBnaXZlIHNvbWUgdGltZSBmb3IgY2FsbGJhY2tzIHRvIGhhcHBlbgorCisgICAgICAgIGlmICghdGVzdENhc2UuaXNDYW1lcmFBdmFpbGFibGUoY2FtZXJhSWQpKSB7CisgICAgICAgICAgICBMT0dfRVJST1IoZXJyb3JTdHJpbmcsICJDYW1lcmEgJXMgc2hvdWxkIGJlIGF2YWlsYWJsZSBub3ciLCBjYW1lcmFJZCk7CisgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXQgPSB0ZXN0Q2FzZS5kZUluaXQoKTsKKyAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgTE9HX0VSUk9SKGVycm9yU3RyaW5nLCAiVGVzdGNhc2UgZGVJbml0IGZhaWxlZDogcmV0ICVkIiwgcmV0KTsKKyAgICAgICAgZ290byBjbGVhbnVwOworICAgIH0KKworICAgIHBhc3MgPSB0cnVlOworCitjbGVhbnVwOgorCisgICAgaWYgKHVwZGF0ZWRSZXF1ZXN0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgQUNhcHR1cmVSZXF1ZXN0X2ZyZWUodXBkYXRlZFJlcXVlc3QpOworICAgICAgICB1cGRhdGVkUmVxdWVzdCA9IG51bGxwdHI7CisgICAgfQorCisgICAgaWYgKHJlcVByZXZpZXdPdXRwdXQgIT0gbnVsbHB0cikgeworICAgICAgICBBQ2FtZXJhT3V0cHV0VGFyZ2V0X2ZyZWUocmVxUHJldmlld091dHB1dCk7CisgICAgICAgIHJlcVByZXZpZXdPdXRwdXQgPSBudWxscHRyOworICAgIH0KKworICAgIGlmIChyZXFTaGFyZWRPdXRwdXQgIT0gbnVsbHB0cikgeworICAgICAgICBBQ2FtZXJhT3V0cHV0VGFyZ2V0X2ZyZWUocmVxU2hhcmVkT3V0cHV0KTsKKyAgICAgICAgcmVxU2hhcmVkT3V0cHV0ID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICBpZiAoc2hhcmVkQW53KSB7CisgICAgICAgIEFOYXRpdmVXaW5kb3dfcmVsZWFzZShzaGFyZWRBbncpOworICAgICAgICBzaGFyZWRBbncgPSBudWxscHRyOworICAgIH0KKworICAgIEFMT0dJKCIlcyAlcyIsIF9fRlVOQ1RJT05fXywgcGFzcyA/ICJwYXNzIiA6ICJmYWlsZWQiKTsKKyAgICBpZiAoIXBhc3MpIHsKKyAgICAgICAgdGhyb3dBc3NlcnRpb25FcnJvcihlbnYsIGVycm9yU3RyaW5nKTsKKyAgICB9CisgICAgcmV0dXJuIHBhc3M7Cit9CisKK2V4dGVybiAiQyIgamJvb2xlYW4KK0phdmFfYW5kcm9pZF9oYXJkd2FyZV9jYW1lcmEyX2N0c19OYXRpdmVDYW1lcmFEZXZpY2VUZXN0X1wKIHRlc3RDYW1lcmFEZXZpY2VTaW1wbGVQcmV2aWV3TmF0aXZlKAogICAgICAgICBKTklFbnYqIGVudiwgamNsYXNzIC8qY2xhenoqLywgam9iamVjdCBqUHJldmlld1N1cmZhY2UpIHsKICAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOwpAQCAtMTUwOSw2ICsyMTIyLDE4IEBACiAgICAgICAgICAgICBnb3RvIGNsZWFudXA7CiAgICAgICAgIH0KIAorICAgICAgICB7CisgICAgICAgICAgICBBQ2FtZXJhTWV0YWRhdGEqIGNoYXJzID0gdGVzdENhc2UuZ2V0Q2FtZXJhQ2hhcnMoY2FtZXJhSWQpOworICAgICAgICAgICAgU3RhdGljSW5mbyBzdGF0aWNJbmZvKGNoYXJzKTsKKyAgICAgICAgICAgIGlmICghc3RhdGljSW5mby5pc0NvbG9yT3V0cHV0U3VwcG9ydGVkKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HSSgiJXM6IGNhbWVyYSAlcyBkb2VzIG5vdCBzdXBwb3J0IGNvbG9yIG91dHB1dC4gc2tpcHBpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFJZCk7CisgICAgICAgICAgICAgICAgQUNhbWVyYU1ldGFkYXRhX2ZyZWUoY2hhcnMpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUNhbWVyYU1ldGFkYXRhX2ZyZWUoY2hhcnMpOworICAgICAgICB9CisKICAgICAgICAgcmV0ID0gdGVzdENhc2Uub3BlbkNhbWVyYShjYW1lcmFJZCk7CiAgICAgICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgewogICAgICAgICAgICAgTE9HX0VSUk9SKGVycm9yU3RyaW5nLCAiT3BlbiBjYW1lcmEgZGV2aWNlICVzIGZhaWx1cmUuIHJldCAlZCIsIGNhbWVyYUlkLCByZXQpOwpAQCAtMTU3Nyw2ICsyMjAyLDEzNCBAQAogICAgIHJldHVybiBwYXNzOwogfQogCitleHRlcm4gIkMiIGpib29sZWFuCitKYXZhX2FuZHJvaWRfaGFyZHdhcmVfY2FtZXJhMl9jdHNfTmF0aXZlQ2FtZXJhRGV2aWNlVGVzdF9cCit0ZXN0Q2FtZXJhRGV2aWNlUHJldmlld1dpdGhTZXNzaW9uUGFyYW1ldGVyc05hdGl2ZSgKKyAgICAgICAgSk5JRW52KiBlbnYsIGpjbGFzcyAvKmNsYXp6Ki8sIGpvYmplY3QgalByZXZpZXdTdXJmYWNlKSB7CisgICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKKyAgICBpbnQgbnVtQ2FtZXJhcyA9IDA7CisgICAgYm9vbCBwYXNzID0gZmFsc2U7CisgICAgQUNhbWVyYU1hbmFnZXIqIG1nciA9IEFDYW1lcmFNYW5hZ2VyX2NyZWF0ZSgpOworICAgIEFDYW1lcmFNZXRhZGF0YSogY2hhcnMgPSBudWxscHRyOworICAgIFByZXZpZXdUZXN0Q2FzZSB0ZXN0Q2FzZTsKKworICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSB0ZXN0Q2FzZS5pbml0V2l0aEVycm9yTG9nKCk7CisgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIC8vIERvbid0IGxvZyBlcnJvciBoZXJlLiB0ZXN0Y2FzZSBkaWQgaXQKKyAgICAgICAgZ290byBjbGVhbnVwOworICAgIH0KKworICAgIG51bUNhbWVyYXMgPSB0ZXN0Q2FzZS5nZXROdW1DYW1lcmFzKCk7CisgICAgaWYgKG51bUNhbWVyYXMgPCAwKSB7CisgICAgICAgIExPR19FUlJPUihlcnJvclN0cmluZywgIlRlc3RjYXNlIHJldHVybmVkIG5lZ2F2dGl2ZSBudW1iZXIgb2YgY2FtZXJhczogJWQiLCBudW1DYW1lcmFzKTsKKyAgICAgICAgZ290byBjbGVhbnVwOworICAgIH0KKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ2FtZXJhczsgaSsrKSB7CisgICAgICAgIGNvbnN0IGNoYXIqIGNhbWVyYUlkID0gdGVzdENhc2UuZ2V0Q2FtZXJhSWQoaSk7CisgICAgICAgIGlmIChjYW1lcmFJZCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBMT0dfRVJST1IoZXJyb3JTdHJpbmcsICJUZXN0Y2FzZSByZXR1cm5lZCBudWxsIGNhbWVyYSBpZCBmb3IgY2FtZXJhICVkIiwgaSk7CisgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoCisgICAgICAgICAgICAgICAgbWdyLCBjYW1lcmFJZCwgJmNoYXJzKTsKKyAgICAgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgICAgICBMT0dfRVJST1IoZXJyb3JTdHJpbmcsICJHZXQgY2FtZXJhIGNoYXJhY3RlcmlzdGljcyBmYWlsZWQ6IHJldCAlZCIsIHJldCk7CisgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgIH0KKworICAgICAgICBBQ2FtZXJhTWV0YWRhdGFfY29uc3RfZW50cnkgc2Vzc2lvblBhcmFtS2V5c3t9OworICAgICAgICByZXQgPSBBQ2FtZXJhTWV0YWRhdGFfZ2V0Q29uc3RFbnRyeShjaGFycywgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9TRVNTSU9OX0tFWVMsCisgICAgICAgICAgICAgICAgJnNlc3Npb25QYXJhbUtleXMpOworICAgICAgICBpZiAoKHJldCAhPSBBQ0FNRVJBX09LKSB8fCAoc2Vzc2lvblBhcmFtS2V5cy5jb3VudCA9PSAwKSkgeworICAgICAgICAgICAgQUNhbWVyYU1ldGFkYXRhX2ZyZWUoY2hhcnMpOworICAgICAgICAgICAgY2hhcnMgPSBudWxscHRyOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSB0ZXN0Q2FzZS5vcGVuQ2FtZXJhKGNhbWVyYUlkKTsKKyAgICAgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgICAgICBMT0dfRVJST1IoZXJyb3JTdHJpbmcsICJPcGVuIGNhbWVyYSBkZXZpY2UgJXMgZmFpbHVyZS4gcmV0ICVkIiwgY2FtZXJhSWQsIHJldCk7CisgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgIH0KKworICAgICAgICB1c2xlZXAoMTAwMDAwKTsgLy8gc2xlZXAgdG8gZ2l2ZSBzb21lIHRpbWUgZm9yIGNhbGxiYWNrcyB0byBoYXBwZW4KKworICAgICAgICBpZiAodGVzdENhc2UuaXNDYW1lcmFBdmFpbGFibGUoY2FtZXJhSWQpKSB7CisgICAgICAgICAgICBMT0dfRVJST1IoZXJyb3JTdHJpbmcsICJDYW1lcmEgJXMgc2hvdWxkIGJlIHVuYXZhaWxhYmxlIG5vdyIsIGNhbWVyYUlkKTsKKyAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgICAgfQorCisgICAgICAgIEFOYXRpdmVXaW5kb3cqIHByZXZpZXdBbncgPSB0ZXN0Q2FzZS5pbml0UHJldmlld0FudyhlbnYsIGpQcmV2aWV3U3VyZmFjZSk7CisgICAgICAgIGlmIChwcmV2aWV3QW53ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIExPR19FUlJPUihlcnJvclN0cmluZywgIk51bGwgQU5XIGZyb20gcHJldmlldyBzdXJmYWNlISIpOworICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gdGVzdENhc2UuY3JlYXRlUmVxdWVzdHNXaXRoRXJyb3JMb2coKTsKKyAgICAgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAvLyBEb24ndCBsb2cgZXJyb3IgaGVyZS4gdGVzdGNhc2UgZGlkIGl0CisgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgIH0KKworICAgICAgICBBQ2FwdHVyZVJlcXVlc3QgKnByZXZpZXdSZXF1ZXN0ID0gbnVsbHB0cjsKKyAgICAgICAgcmV0ID0gdGVzdENhc2UuZ2V0UHJldmlld1JlcXVlc3QoJnByZXZpZXdSZXF1ZXN0KTsKKyAgICAgICAgaWYgKChyZXQgIT0gQUNBTUVSQV9PSykgfHwgKHByZXZpZXdSZXF1ZXN0ID09IG51bGxwdHIpKSB7CisgICAgICAgICAgICBMT0dfRVJST1IoZXJyb3JTdHJpbmcsICJQcmV2aWV3IHJlcXVlc3QgcXVlcnkgZmFpbGVkISIpOworICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gdGVzdENhc2UuY3JlYXRlQ2FwdHVyZVNlc3Npb25XaXRoTG9nKC8qaXNQcmV2aWV3U2hhcmVkKi8gZmFsc2UsIHByZXZpZXdSZXF1ZXN0KTsKKyAgICAgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAvLyBEb24ndCBsb2cgZXJyb3IgaGVyZS4gdGVzdGNhc2UgZGlkIGl0CisgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSB0ZXN0Q2FzZS5zdGFydFByZXZpZXcoKTsKKyAgICAgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgICAgICBMT0dfRVJST1IoZXJyb3JTdHJpbmcsICJTdGFydCBwcmV2aWV3IGZhaWxlZCEiKTsKKyAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgICAgfQorCisgICAgICAgIHNsZWVwKDMpOworCisgICAgICAgIHJldCA9IHRlc3RDYXNlLnJlc2V0V2l0aEVycm9yTG9nKCk7CisgICAgICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICAgICAgLy8gRG9uJ3QgbG9nIGVycm9yIGhlcmUuIHRlc3RjYXNlIGRpZCBpdAorICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICB9CisKKyAgICAgICAgdXNsZWVwKDEwMDAwMCk7IC8vIHNsZWVwIHRvIGdpdmUgc29tZSB0aW1lIGZvciBjYWxsYmFja3MgdG8gaGFwcGVuCisKKyAgICAgICAgaWYgKCF0ZXN0Q2FzZS5pc0NhbWVyYUF2YWlsYWJsZShjYW1lcmFJZCkpIHsKKyAgICAgICAgICAgIExPR19FUlJPUihlcnJvclN0cmluZywgIkNhbWVyYSAlcyBzaG91bGQgYmUgYXZhaWxhYmxlIG5vdyIsIGNhbWVyYUlkKTsKKyAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgICAgfQorCisgICAgICAgIEFDYW1lcmFNZXRhZGF0YV9mcmVlKGNoYXJzKTsKKyAgICAgICAgY2hhcnMgPSBudWxscHRyOworICAgIH0KKworICAgIHJldCA9IHRlc3RDYXNlLmRlSW5pdCgpOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICBMT0dfRVJST1IoZXJyb3JTdHJpbmcsICJUZXN0Y2FzZSBkZUluaXQgZmFpbGVkOiByZXQgJWQiLCByZXQpOworICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgfQorCisgICAgcGFzcyA9IHRydWU7CitjbGVhbnVwOgorICAgIGlmIChjaGFycykgeworICAgICAgICBBQ2FtZXJhTWV0YWRhdGFfZnJlZShjaGFycyk7CisgICAgfQorICAgIEFDYW1lcmFNYW5hZ2VyX2RlbGV0ZShtZ3IpOworICAgIEFMT0dJKCIlcyAlcyIsIF9fRlVOQ1RJT05fXywgcGFzcyA/ICJwYXNzIiA6ICJmYWlsZWQiKTsKKyAgICBpZiAoIXBhc3MpIHsKKyAgICAgICAgdGhyb3dBc3NlcnRpb25FcnJvcihlbnYsIGVycm9yU3RyaW5nKTsKKyAgICB9CisgICAgcmV0dXJuIHBhc3M7Cit9CisKIGJvb2wgbmF0aXZlSW1hZ2VSZWFkZXJUZXN0QmFzZSgKICAgICAgICAgSk5JRW52KiBlbnYsIGpzdHJpbmcgak91dFBhdGgsIEFJbWFnZVJlYWRlcl9JbWFnZUNhbGxiYWNrIGNiKSB7CiAgICAgY29uc3QgaW50IE5VTV9URVNUX0lNQUdFUyA9IDEwOwpAQCAtMTYxMiw2ICsyMzY1LDE4IEBACiAgICAgICAgICAgICBnb3RvIGNsZWFudXA7CiAgICAgICAgIH0KIAorICAgICAgICB7CisgICAgICAgICAgICBBQ2FtZXJhTWV0YWRhdGEqIGNoYXJzID0gdGVzdENhc2UuZ2V0Q2FtZXJhQ2hhcnMoY2FtZXJhSWQpOworICAgICAgICAgICAgU3RhdGljSW5mbyBzdGF0aWNJbmZvKGNoYXJzKTsKKyAgICAgICAgICAgIGlmICghc3RhdGljSW5mby5pc0NvbG9yT3V0cHV0U3VwcG9ydGVkKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HSSgiJXM6IGNhbWVyYSAlcyBkb2VzIG5vdCBzdXBwb3J0IGNvbG9yIG91dHB1dC4gc2tpcHBpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFJZCk7CisgICAgICAgICAgICAgICAgQUNhbWVyYU1ldGFkYXRhX2ZyZWUoY2hhcnMpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUNhbWVyYU1ldGFkYXRhX2ZyZWUoY2hhcnMpOworICAgICAgICB9CisKICAgICAgICAgcmV0ID0gdGVzdENhc2Uub3BlbkNhbWVyYShjYW1lcmFJZCk7CiAgICAgICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgewogICAgICAgICAgICAgTE9HX0VSUk9SKGVycm9yU3RyaW5nLCAiT3BlbiBjYW1lcmEgZGV2aWNlICVzIGZhaWx1cmUuIHJldCAlZCIsIGNhbWVyYUlkLCByZXQpOwpAQCAtMTY0OSwxNCArMjQxNCw2OCBAQAogICAgICAgICAgICAgZ290byBjbGVhbnVwOwogICAgICAgICB9CiAKKyAgICAgICAgQ2FwdHVyZVJlc3VsdExpc3RlbmVyIHJlc3VsdExpc3RlbmVyOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyByZXN1bHRDYiB7CisgICAgICAgICAgICAmcmVzdWx0TGlzdGVuZXIsCisgICAgICAgICAgICBDYXB0dXJlUmVzdWx0TGlzdGVuZXI6Om9uQ2FwdHVyZVN0YXJ0LAorICAgICAgICAgICAgQ2FwdHVyZVJlc3VsdExpc3RlbmVyOjpvbkNhcHR1cmVQcm9ncmVzc2VkLAorICAgICAgICAgICAgQ2FwdHVyZVJlc3VsdExpc3RlbmVyOjpvbkNhcHR1cmVDb21wbGV0ZWQsCisgICAgICAgICAgICBDYXB0dXJlUmVzdWx0TGlzdGVuZXI6Om9uQ2FwdHVyZUZhaWxlZCwKKyAgICAgICAgICAgIENhcHR1cmVSZXN1bHRMaXN0ZW5lcjo6b25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQsCisgICAgICAgICAgICBDYXB0dXJlUmVzdWx0TGlzdGVuZXI6Om9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZCwKKyAgICAgICAgICAgIENhcHR1cmVSZXN1bHRMaXN0ZW5lcjo6b25DYXB0dXJlQnVmZmVyTG9zdAorICAgICAgICB9OworICAgICAgICByZXN1bHRMaXN0ZW5lci5zZXRSZXF1ZXN0U2F2ZSh0cnVlKTsKKyAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0VGVtcGxhdGUgPSBudWxscHRyOworICAgICAgICByZXQgPSB0ZXN0Q2FzZS5nZXRTdGlsbFJlcXVlc3QoJnJlcXVlc3RUZW1wbGF0ZSk7CisgICAgICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSyB8fCByZXF1ZXN0VGVtcGxhdGUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgLy8gRG9uJ3QgbG9nIGVycm9yIGhlcmUuIHRlc3RjYXNlIGRpZCBpdAorICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICB9CisKICAgICAgICAgLy8gRG8gc29tZSBzdGlsbCBjYXB0dXJlCi0gICAgICAgIGZvciAoaW50IGNhcHR1cmUgPSAwOyBjYXB0dXJlIDwgTlVNX1RFU1RfSU1BR0VTOyBjYXB0dXJlKyspIHsKLSAgICAgICAgICAgIHJldCA9IHRlc3RDYXNlLnRha2VQaWN0dXJlKCk7CisgICAgICAgIGludCBsYXN0U2VxSWQgPSAtMTsKKyAgICAgICAgZm9yIChpbnRwdHJfdCBjYXB0dXJlID0gMDsgY2FwdHVyZSA8IE5VTV9URVNUX0lNQUdFUzsgY2FwdHVyZSsrKSB7CisgICAgICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcSA9IEFDYXB0dXJlUmVxdWVzdF9jb3B5KHJlcXVlc3RUZW1wbGF0ZSk7CisgICAgICAgICAgICBBQ2FwdHVyZVJlcXVlc3Rfc2V0VXNlckNvbnRleHQocmVxLCAodm9pZCopIGNhcHR1cmUpOworICAgICAgICAgICAgaW50IHNlcUlkOworICAgICAgICAgICAgcmV0ID0gdGVzdENhc2UuY2FwdHVyZShyZXEsICZyZXN1bHRDYiwgJnNlcUlkKTsKICAgICAgICAgICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgewotICAgICAgICAgICAgICAgIExPR19FUlJPUihlcnJvclN0cmluZywgIkNhbWVyYSAlcyBjYXB0dXJlKCVkKSBmYWlsZWQuIHJldCAlZCIsCisgICAgICAgICAgICAgICAgTE9HX0VSUk9SKGVycm9yU3RyaW5nLCAiQ2FtZXJhICVzIGNhcHR1cmUoJSIgUFJJZFBUUiAiKSBmYWlsZWQuIHJldCAlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZCwgY2FwdHVyZSwgcmV0KTsKICAgICAgICAgICAgICAgICBnb3RvIGNsZWFudXA7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2FwdHVyZSA9PSBOVU1fVEVTVF9JTUFHRVMgLSAxKSB7CisgICAgICAgICAgICAgICAgbGFzdFNlcUlkID0gc2VxSWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBQ2FwdHVyZVJlcXVlc3RfZnJlZShyZXEpOworICAgICAgICB9CisKKyAgICAgICAgLy8gd2FpdCB1bnRpbCBsYXN0IHNlcXVlbmNlIGNvbXBsZXRlCisgICAgICAgIHJlc3VsdExpc3RlbmVyLmdldENhcHR1cmVTZXF1ZW5jZUxhc3RGcmFtZU51bWJlcihsYXN0U2VxSWQsIC8qdGltZW91dFNlYyovIDMpOworCisgICAgICAgIHN0ZDo6dmVjdG9yPEFDYXB0dXJlUmVxdWVzdCo+IGNvbXBsZXRlZFJlcXVlc3RzOworICAgICAgICByZXN1bHRMaXN0ZW5lci5nZXRDb21wbGV0ZWRSZXF1ZXN0cygmY29tcGxldGVkUmVxdWVzdHMpOworCisgICAgICAgIGlmIChjb21wbGV0ZWRSZXF1ZXN0cy5zaXplKCkgIT0gTlVNX1RFU1RfSU1BR0VTKSB7CisgICAgICAgICAgICBMT0dfRVJST1IoZXJyb3JTdHJpbmcsICJDYW1lcmEgJXMgZmFpbHMgdG8gY2FwdHVyZSAlZCBjYXB0dXJlIHJlc3VsdHMuIEdvdCAlenUiLAorICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZCwgTlVNX1RFU1RfSU1BR0VTLCBjb21wbGV0ZWRSZXF1ZXN0cy5zaXplKCkpOworICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnRwdHJfdCBpID0gMDsgaSA8IE5VTV9URVNUX0lNQUdFUzsgaSsrKSB7CisgICAgICAgICAgICBpbnRwdHJfdCB1c2VyQ29udGV4dCA9IC0xOworICAgICAgICAgICAgcmV0ID0gQUNhcHR1cmVSZXF1ZXN0X2dldFVzZXJDb250ZXh0KGNvbXBsZXRlZFJlcXVlc3RzW2ldLCAodm9pZCoqKSAmdXNlckNvbnRleHQpOworICAgICAgICAgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgTE9HX0VSUk9SKGVycm9yU3RyaW5nLCAiQ2FtZXJhICVzIGZhaWxzIHRvIGdldCByZXF1ZXN0IHVzZXIgY29udGV4dCIsIGNhbWVyYUlkKTsKKyAgICAgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh1c2VyQ29udGV4dCAhPSBpKSB7CisgICAgICAgICAgICAgICAgTE9HX0VSUk9SKGVycm9yU3RyaW5nLCAiQ2FtZXJhICVzIGZhaWxzIHRvIHJldHVybiBtYXRjaGluZyB1c2VyIGNvbnRleHQuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3QgJSIgUFJJZFBUUiAiLCBnb3QgJSIgUFJJZFBUUiwgY2FtZXJhSWQsIGksIHVzZXJDb250ZXh0KTsKKyAgICAgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICAvLyB3YWl0IHVudGlsIGFsbCBjYXB0dXJlIGZpbmlzaGVkCkBAIC0xNzYxLDYgKzI1ODAsMTggQEAKICAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKICAgICAgICAgfQogCisgICAgICAgIHsKKyAgICAgICAgICAgIEFDYW1lcmFNZXRhZGF0YSogY2hhcnMgPSB0ZXN0Q2FzZS5nZXRDYW1lcmFDaGFycyhjYW1lcmFJZCk7CisgICAgICAgICAgICBTdGF0aWNJbmZvIHN0YXRpY0luZm8oY2hhcnMpOworICAgICAgICAgICAgaWYgKCFzdGF0aWNJbmZvLmlzQ29sb3JPdXRwdXRTdXBwb3J0ZWQoKSkgeworICAgICAgICAgICAgICAgIEFMT0dJKCIlczogY2FtZXJhICVzIGRvZXMgbm90IHN1cHBvcnQgY29sb3Igb3V0cHV0LiBza2lwcGluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkKTsKKyAgICAgICAgICAgICAgICBBQ2FtZXJhTWV0YWRhdGFfZnJlZShjaGFycyk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBQ2FtZXJhTWV0YWRhdGFfZnJlZShjaGFycyk7CisgICAgICAgIH0KKwogICAgICAgICByZXQgPSB0ZXN0Q2FzZS5vcGVuQ2FtZXJhKGNhbWVyYUlkKTsKICAgICAgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CiAgICAgICAgICAgICBMT0dfRVJST1IoZXJyb3JTdHJpbmcsICJPcGVuIGNhbWVyYSBkZXZpY2UgJXMgZmFpbHVyZS4gcmV0ICVkIiwgY2FtZXJhSWQsIHJldCk7CmRpZmYgLS1naXQgYS90ZXN0cy9jYW1lcmEvcmVzL2xheW91dC9tdWx0aV92aWV3LnhtbCBiL3Rlc3RzL2NhbWVyYS9yZXMvbGF5b3V0L211bHRpX3ZpZXcueG1sCmluZGV4IDRmMzM1ZDMuLjRiMTU2YWYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2NhbWVyYS9yZXMvbGF5b3V0L211bHRpX3ZpZXcueG1sCisrKyBiL3Rlc3RzL2NhbWVyYS9yZXMvbGF5b3V0L211bHRpX3ZpZXcueG1sCkBAIC0xNSwyOCArMTUsNjYgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIAotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKzxHcmlkTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ij4KKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmNvbHVtbkNvdW50PSIzIj4KIAorICAgIDwhLS0gVXNpbmcgcmVsYXRpdmUgd2lkdGgvaGVpZ2h0IGJlbG93LgorICAgICAgICAgSW1hZ2UgbWlnaHQgbm90IGhhdmUgY29ycmVjdCBhc3BlY3QgcmF0aW8gLS0+CisgICAgPCEtLSBSb3cgMCAtLT4KICAgICA8VGV4dHVyZVZpZXcKICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90ZXh0dXJlX3ZpZXdfMSIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjE2MGRwIgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjEyMGRwIi8+Ci0KKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfY29sdW1uV2VpZ2h0PSIxIgorICAgICAgICBhbmRyb2lkOmxheW91dF9yb3dXZWlnaHQ9IjEiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZHAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMGRwIi8+CiAgICAgPFRleHR1cmVWaWV3CiAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGV4dHVyZV92aWV3XzIiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxNjBkcCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxMjBkcCIvPgorICAgICAgICBhbmRyb2lkOmxheW91dF9jb2x1bW5XZWlnaHQ9IjEiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3Jvd1dlaWdodD0iMSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZHAiLz4KKyAgICA8VGV4dHVyZVZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90ZXh0dXJlX3ZpZXdfMyIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfY29sdW1uV2VpZ2h0PSIxIgorICAgICAgICBhbmRyb2lkOmxheW91dF9yb3dXZWlnaHQ9IjEiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZHAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMGRwIi8+CisKKyAgICA8IS0tIFJvdyAxIC0tPgorICAgIDxUZXh0dXJlVmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RleHR1cmVfdmlld180IgorICAgICAgICBhbmRyb2lkOmxheW91dF9jb2x1bW5XZWlnaHQ9IjEiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3Jvd1dlaWdodD0iMSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZHAiLz4KKyAgICA8VGV4dHVyZVZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90ZXh0dXJlX3ZpZXdfNSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfY29sdW1uV2VpZ2h0PSIxIgorICAgICAgICBhbmRyb2lkOmxheW91dF9yb3dXZWlnaHQ9IjEiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZHAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMGRwIi8+CisgICAgPCEtLSBzcGFjZSBmaWxsZXIgLS0+CisgICAgPFNwYWNlCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NvbHVtblNwYW49IjEiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NvbHVtbldlaWdodD0iMSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfcm93V2VpZ2h0PSIxIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkcCIvPgorCisgICAgPCEtLSBSb3cgMiAtLT4KICAgICA8U3VyZmFjZVZpZXcKICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zdXJmYWNlX3ZpZXdfMSIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjE2MGRwIgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjEyMGRwIi8+CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NvbHVtbldlaWdodD0iMSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfcm93V2VpZ2h0PSIxIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkcCIvPgogCiAgICAgPFN1cmZhY2VWaWV3CiAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3VyZmFjZV92aWV3XzIiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxNjBkcCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxMjBkcCIvPgotCi08L0xpbmVhckxheW91dD4KKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfY29sdW1uV2VpZ2h0PSIxIgorICAgICAgICBhbmRyb2lkOmxheW91dF9yb3dXZWlnaHQ9IjEiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZHAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMGRwIi8+Cis8L0dyaWRMYXlvdXQ+CmRpZmYgLS1naXQgYS90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9jdHMvQWxsb2NhdGlvblRlc3QuamF2YSBiL3Rlc3RzL2NhbWVyYS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL2N0cy9BbGxvY2F0aW9uVGVzdC5qYXZhCmluZGV4IDkyYjE3MWEuLmJkOWJlYzggMTAwNjQ0Ci0tLSBhL3Rlc3RzL2NhbWVyYS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL2N0cy9BbGxvY2F0aW9uVGVzdC5qYXZhCisrKyBiL3Rlc3RzL2NhbWVyYS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL2N0cy9BbGxvY2F0aW9uVGVzdC5qYXZhCkBAIC00OCw2ICs0OCw3IEBACiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLmN0cy5ycy5TY3JpcHRZdXZUb1JnYjsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIGltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5BbGxvY2F0aW9uOwogaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlNjcmlwdC5MYXVuY2hPcHRpb25zOwogaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CkBAIC03MSw2ICs3Miw3IEBACiAgKgogICogPHA+WVVWXzQyMF84ODg6IGZsZXhpYmxlIFlVVjQyMCwgaXQgaXMgYSBtYW5kYXRvcnkgZm9ybWF0IGZvciBjYW1lcmEuPC9wPgogICovCitAQXBwTW9kZUZ1bGwKIHB1YmxpYyBjbGFzcyBBbGxvY2F0aW9uVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJBbGxvY2F0aW9uVGVzdCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBWRVJCT1NFID0gTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSk7CmRpZmYgLS1naXQgYS90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9jdHMvQnVyc3RDYXB0dXJlUmF3VGVzdC5qYXZhIGIvdGVzdHMvY2FtZXJhL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvY3RzL0J1cnN0Q2FwdHVyZVJhd1Rlc3QuamF2YQppbmRleCA3MmE1Zjk5Li42ZTA5NDlkIDEwMDY0NAotLS0gYS90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9jdHMvQnVyc3RDYXB0dXJlUmF3VGVzdC5qYXZhCisrKyBiL3Rlc3RzL2NhbWVyYS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL2N0cy9CdXJzdENhcHR1cmVSYXdUZXN0LmphdmEKQEAgLTMwLDYgKzMwLDcgQEAKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuY3RzLnRlc3RjYXNlcy5DYW1lcmEyU3VyZmFjZVZpZXdUZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIucGFyYW1zLlN0cmVhbUNvbmZpZ3VyYXRpb25NYXA7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5JbWFnZTsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuUmFuZ2U7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNpemU7CkBAIC0zOSw2ICs0MCw3IEBACiAvKioKICAqIEJhc2ljIHRlc3RzIGZvciBidXJzdCBjYXB0dXJlIGluIFJBVyBmb3JtYXRzLgogICovCitAQXBwTW9kZUZ1bGwKIHB1YmxpYyBjbGFzcyBCdXJzdENhcHR1cmVSYXdUZXN0IGV4dGVuZHMgQ2FtZXJhMlN1cmZhY2VWaWV3VGVzdENhc2UgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQnVyc3RDYXB0dXJlUmF3VGVzdCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJBV19GT1JNQVRTW10gPSB7CmRpZmYgLS1naXQgYS90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9jdHMvQnVyc3RDYXB0dXJlVGVzdC5qYXZhIGIvdGVzdHMvY2FtZXJhL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvY3RzL0J1cnN0Q2FwdHVyZVRlc3QuamF2YQppbmRleCBkZTQ4ZGQ2Li5kYjJiNjE2IDEwMDY0NAotLS0gYS90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9jdHMvQnVyc3RDYXB0dXJlVGVzdC5qYXZhCisrKyBiL3Rlc3RzL2NhbWVyYS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL2N0cy9CdXJzdENhcHR1cmVUZXN0LmphdmEKQEAgLTI2LDYgKzI2LDcgQEAKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuY3RzLnRlc3RjYXNlcy5DYW1lcmEyU3VyZmFjZVZpZXdUZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIucGFyYW1zLlN0cmVhbUNvbmZpZ3VyYXRpb25NYXA7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5JbWFnZTsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuUmFuZ2U7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNpemU7CkBAIC0zMyw2ICszNCw3IEBACiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIAorQEFwcE1vZGVGdWxsCiBwdWJsaWMgY2xhc3MgQnVyc3RDYXB0dXJlVGVzdCBleHRlbmRzIENhbWVyYTJTdXJmYWNlVmlld1Rlc3RDYXNlIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkJ1cnN0Q2FwdHVyZVRlc3QiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gVkVSQk9TRSA9IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpOwpAQCAtNzUsNyArNzcsNyBAQAogICAgIHByaXZhdGUgdm9pZCB5dXZCdXJzdFRlc3RCeUNhbWVyYShTdHJpbmcgY2FtZXJhSWQpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBQYXJhbWV0ZXJzCiAgICAgICAgIGZpbmFsIGludCBNQVhfQ09OVkVSR0VOQ0VfRlJBTUVTID0gMTUwOyAvLyA1IHNlYyBhdCAzMGZwcwotICAgICAgICBmaW5hbCBsb25nIE1BWF9QUkVWSUVXX1JFU1VMVF9USU1FT1VUX01TID0gMTAwMDsKKyAgICAgICAgZmluYWwgbG9uZyBNQVhfUFJFVklFV19SRVNVTFRfVElNRU9VVF9NUyA9IDIwMDA7CiAgICAgICAgIGZpbmFsIGludCBCVVJTVF9TSVpFID0gMTAwOwogICAgICAgICBmaW5hbCBmbG9hdCBGUkFNRV9EVVJBVElPTl9NQVJHSU5fRlJBQ1RJT04gPSAwLjFmOwogCkBAIC0xMjUsNiArMTI3LDcgQEAKICAgICAgICAgLy8gQ3JlYXRlIHNlc3Npb24gYW5kIHN0YXJ0IHVwIHByZXZpZXcKIAogICAgICAgICBTaW1wbGVDYXB0dXJlQ2FsbGJhY2sgcmVzdWx0TGlzdGVuZXIgPSBuZXcgU2ltcGxlQ2FwdHVyZUNhbGxiYWNrKCk7CisgICAgICAgIFNpbXBsZUNhcHR1cmVDYWxsYmFjayBidXJzdFJlc3VsdExpc3RlbmVyID0gbmV3IFNpbXBsZUNhcHR1cmVDYWxsYmFjaygpOwogICAgICAgICBJbWFnZURyb3BwZXJMaXN0ZW5lciBpbWFnZURyb3BwZXIgPSBuZXcgSW1hZ2VEcm9wcGVyTGlzdGVuZXIoKTsKIAogICAgICAgICBwcmVwYXJlQ2FwdHVyZUFuZFN0YXJ0UHJldmlldygKQEAgLTIxMiw3ICsyMTUsNyBAQAogCiAgICAgICAgIGlmIChtYXhTeW5jTGF0ZW5jeSA9PSBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuU1lOQ19NQVhfTEFURU5DWV9QRVJfRlJBTUVfQ09OVFJPTCkgewogICAgICAgICAgICAgLy8gVGhlIGxvY2tlZCByZXN1bHQgd2UgaGF2ZSBpcyBhbHJlYWR5IHN5bmNocm9uaXplZCBzbyBzdGFydCB0aGUgYnVyc3QKLSAgICAgICAgICAgIG1TZXNzaW9uLmNhcHR1cmVCdXJzdChidXJzdCwgcmVzdWx0TGlzdGVuZXIsIG1IYW5kbGVyKTsKKyAgICAgICAgICAgIG1TZXNzaW9uLmNhcHR1cmVCdXJzdChidXJzdCwgYnVyc3RSZXN1bHRMaXN0ZW5lciwgbUhhbmRsZXIpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gTmVlZCB0byBnZXQgYSBzeW5jaHJvbml6ZWQgcmVzdWx0LCBhbmQgbWF5IG5lZWQgdG8gc3RhcnQgYnVyc3QgbGF0ZXIgdG8KICAgICAgICAgICAgIC8vIGJlIHN5bmNocm9uaXplZCBjb3JyZWN0bHkKQEAgLTIzMCw3ICsyMzMsNyBAQAogICAgICAgICAgICAgaW50IHJlcXVlc3RzTmVlZGVkVG9TeW5jID0gbnVtRnJhbWVzV2FpdGVkIC0gcGlwZWxpbmVEZXB0aDsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRnJhbWVzV2FpdGVkOyBpKyspIHsKICAgICAgICAgICAgICAgICBpZiAoIWJ1cnN0U2VudCAmJiByZXF1ZXN0c05lZWRlZFRvU3luYyA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uLmNhcHR1cmVCdXJzdChidXJzdCwgcmVzdWx0TGlzdGVuZXIsIG1IYW5kbGVyKTsKKyAgICAgICAgICAgICAgICAgICAgbVNlc3Npb24uY2FwdHVyZUJ1cnN0KGJ1cnN0LCBidXJzdFJlc3VsdExpc3RlbmVyLCBtSGFuZGxlcik7CiAgICAgICAgICAgICAgICAgICAgIGJ1cnN0U2VudCA9IHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGxvY2tlZFJlc3VsdCA9IHJlc3VsdExpc3RlbmVyLmdldENhcHR1cmVSZXN1bHQoTUFYX1BSRVZJRVdfUkVTVUxUX1RJTUVPVVRfTVMpOwpAQCAtMjY4LDEyICsyNzEsMTQgQEAKICAgICAgICAgLy8gUHJvY2VzcyBidXJzdCByZXN1bHRzCiAgICAgICAgIGludCBidXJzdEluZGV4ID0gMDsKICAgICAgICAgQ2FwdHVyZVJlc3VsdCBidXJzdFJlc3VsdCA9Ci0gICAgICAgICAgICAgICAgcmVzdWx0TGlzdGVuZXIuZ2V0Q2FwdHVyZVJlc3VsdEZvclJlcXVlc3QoYnVyc3QuZ2V0KGJ1cnN0SW5kZXgpLAotICAgICAgICAgICAgICAgICAgICBtYXhQaXBlbGluZURlcHRoICsgMSk7CisgICAgICAgICAgICAgICAgYnVyc3RSZXN1bHRMaXN0ZW5lci5nZXRDYXB0dXJlUmVzdWx0KE1BWF9QUkVWSUVXX1JFU1VMVF9USU1FT1VUX01TKTsKICAgICAgICAgbG9uZyBwcmV2VGltZXN0YW1wID0gLTE7CiAgICAgICAgIGZpbmFsIGxvbmcgZnJhbWVEdXJhdGlvbkJvdW5kID0gKGxvbmcpCiAgICAgICAgICAgICAgICAgKG1pblN0aWxsRnJhbWVEdXJhdGlvbiAqICgxICsgRlJBTUVfRFVSQVRJT05fTUFSR0lOX0ZSQUNUSU9OKSApOwogCisgICAgICAgIGxvbmcgYnVyc3RTdGFydFRpbWVzdGFtcCA9IGJ1cnN0UmVzdWx0LmdldChDYXB0dXJlUmVzdWx0LlNFTlNPUl9USU1FU1RBTVApOworICAgICAgICBsb25nIGJ1cnN0RW5kVGltZVN0YW1wID0gMDsKKwogICAgICAgICBMaXN0PExvbmc+IGZyYW1lRHVyYXRpb25zID0gbmV3IEFycmF5TGlzdDw+KCk7CiAKICAgICAgICAgd2hpbGUodHJ1ZSkgewpAQCAtMzA1LDggKzMxMCwyNSBAQAogCiAgICAgICAgICAgICAvLyBHZXQgbmV4dCByZXN1bHQKICAgICAgICAgICAgIGJ1cnN0SW5kZXgrKzsKLSAgICAgICAgICAgIGlmIChidXJzdEluZGV4ID09IEJVUlNUX1NJWkUpIGJyZWFrOwotICAgICAgICAgICAgYnVyc3RSZXN1bHQgPSByZXN1bHRMaXN0ZW5lci5nZXRDYXB0dXJlUmVzdWx0KE1BWF9QUkVWSUVXX1JFU1VMVF9USU1FT1VUX01TKTsKKyAgICAgICAgICAgIGlmIChidXJzdEluZGV4ID09IEJVUlNUX1NJWkUpIHsKKyAgICAgICAgICAgICAgICBidXJzdEVuZFRpbWVTdGFtcCA9IGJ1cnN0UmVzdWx0LmdldChDYXB0dXJlUmVzdWx0LlNFTlNPUl9USU1FU1RBTVApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVyc3RSZXN1bHQgPSBidXJzdFJlc3VsdExpc3RlbmVyLmdldENhcHR1cmVSZXN1bHQoTUFYX1BSRVZJRVdfUkVTVUxUX1RJTUVPVVRfTVMpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVmVyaWZ5IG5vIHByZXZpZXcgZnJhbWVzIGludGVybGVhdmVkIGluIGJ1cnN0IHJlc3VsdHMKKyAgICAgICAgd2hpbGUgKHRydWUpICAgICAgICAgeworICAgICAgICAgICAgQ2FwdHVyZVJlc3VsdCBwcmV2aWV3UmVzdWx0ID0KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0TGlzdGVuZXIuZ2V0Q2FwdHVyZVJlc3VsdChNQVhfUFJFVklFV19SRVNVTFRfVElNRU9VVF9NUyk7CisgICAgICAgICAgICBsb25nIHByZXZpZXdUaW1lc3RhbXAgPSBwcmV2aWV3UmVzdWx0LmdldChDYXB0dXJlUmVzdWx0LlNFTlNPUl9USU1FU1RBTVApOworICAgICAgICAgICAgaWYgKHByZXZpZXdUaW1lc3RhbXAgPj0gYnVyc3RTdGFydFRpbWVzdGFtcCAmJiBwcmV2aWV3VGltZXN0YW1wIDw9IGJ1cnN0RW5kVGltZVN0YW1wKSB7CisgICAgICAgICAgICAgICAgZmFpbCgiUHJldmlldyBmcmFtZSBpcyBpbnRlcmxlYXZlZCB3aXRoIGJ1cnN0IGZyYW1lcyEgUHJldmlldyB0aW1lc3RhbXA6IiArCisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aWV3VGltZXN0YW1wICsgIiwgYnVyc3QgWyIgKyBidXJzdFN0YXJ0VGltZXN0YW1wICsgIiwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICBidXJzdEVuZFRpbWVTdGFtcCArICJdIik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHByZXZpZXdUaW1lc3RhbXAgPiBidXJzdEVuZFRpbWVTdGFtcCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgLy8gVmVyaWZ5IGludGVyLWZyYW1lIGR1cmF0aW9ucwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2FtZXJhL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvY3RzL0NhbWVyYTJNdWx0aVZpZXdDdHNBY3Rpdml0eS5qYXZhIGIvdGVzdHMvY2FtZXJhL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvY3RzL0NhbWVyYTJNdWx0aVZpZXdDdHNBY3Rpdml0eS5qYXZhCmluZGV4IGQ2MzUwZmMuLjFmNDI2NWQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2NhbWVyYS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL2N0cy9DYW1lcmEyTXVsdGlWaWV3Q3RzQWN0aXZpdHkuamF2YQorKysgYi90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9jdHMvQ2FtZXJhMk11bHRpVmlld0N0c0FjdGl2aXR5LmphdmEKQEAgLTI3LDcgKzI3LDggQEAKIAogcHVibGljIGNsYXNzIENhbWVyYTJNdWx0aVZpZXdDdHNBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFHID0gIkNhbWVyYTJNdWx0aVZpZXdDdHNBY3Rpdml0eSI7Ci0gICAgcHJpdmF0ZSBUZXh0dXJlVmlld1tdIG1UZXh0dXJlVmlldyA9IG5ldyBUZXh0dXJlVmlld1syXTsKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBNQVhfVEVYVFVSRV9WSUVXUyA9IDU7CisgICAgcHJpdmF0ZSBUZXh0dXJlVmlld1tdIG1UZXh0dXJlVmlldyA9IG5ldyBUZXh0dXJlVmlld1tNQVhfVEVYVFVSRV9WSUVXU107CiAgICAgcHJpdmF0ZSBTdXJmYWNlVmlld1tdIG1TdXJmYWNlVmlldyA9IG5ldyBTdXJmYWNlVmlld1syXTsKIAogICAgIEBPdmVycmlkZQpAQCAtMzYsNiArMzcsOSBAQAogICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5tdWx0aV92aWV3KTsKICAgICAgICAgbVRleHR1cmVWaWV3WzBdID0gKFRleHR1cmVWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC50ZXh0dXJlX3ZpZXdfMSk7CiAgICAgICAgIG1UZXh0dXJlVmlld1sxXSA9IChUZXh0dXJlVmlldykgZmluZFZpZXdCeUlkKFIuaWQudGV4dHVyZV92aWV3XzIpOworICAgICAgICBtVGV4dHVyZVZpZXdbMl0gPSAoVGV4dHVyZVZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLnRleHR1cmVfdmlld18zKTsKKyAgICAgICAgbVRleHR1cmVWaWV3WzNdID0gKFRleHR1cmVWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC50ZXh0dXJlX3ZpZXdfNCk7CisgICAgICAgIG1UZXh0dXJlVmlld1s0XSA9IChUZXh0dXJlVmlldykgZmluZFZpZXdCeUlkKFIuaWQudGV4dHVyZV92aWV3XzUpOwogICAgICAgICBtU3VyZmFjZVZpZXdbMF0gPSAoU3VyZmFjZVZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLnN1cmZhY2Vfdmlld18xKTsKICAgICAgICAgbVN1cmZhY2VWaWV3WzFdID0gKFN1cmZhY2VWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5zdXJmYWNlX3ZpZXdfMik7CiAKQEAgLTQ0LDggKzQ4LDkgQEAKICAgICB9CiAKICAgICBwdWJsaWMgVGV4dHVyZVZpZXcgZ2V0VGV4dHVyZVZpZXcoaW50IGluZGV4KSB7Ci0gICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiAxKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUZXh0dXJlIHZpZXcgaW5kZXggbXVzdCBiZSAwIG9yIDEiKTsKKyAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IChNQVhfVEVYVFVSRV9WSUVXUyAtIDEpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUZXh0dXJlIHZpZXcgaW5kZXggbXVzdCBiZSBiZXR3ZWVuIDAgYW5kICIgKworICAgICAgICAgICAgICAgICAgICBNQVhfVEVYVFVSRV9WSUVXUyk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG1UZXh0dXJlVmlld1tpbmRleF07CiAgICAgfQpkaWZmIC0tZ2l0IGEvdGVzdHMvY2FtZXJhL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvY3RzL0NhbWVyYTJTdXJmYWNlVmlld0N0c0FjdGl2aXR5LmphdmEgYi90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9jdHMvQ2FtZXJhMlN1cmZhY2VWaWV3Q3RzQWN0aXZpdHkuamF2YQppbmRleCBlMWRmYmMxLi40YmQ2MTg2IDEwMDY0NAotLS0gYS90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9jdHMvQ2FtZXJhMlN1cmZhY2VWaWV3Q3RzQWN0aXZpdHkuamF2YQorKysgYi90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9jdHMvQ2FtZXJhMlN1cmZhY2VWaWV3Q3RzQWN0aXZpdHkuamF2YQpAQCAtNzMsMTIgKzczLDE4IEBACiAgICAgICAgICAgICBjaGFuZ2VTdWNjZWVkZWQgPSBzdXJmYWNlQ2hhbmdlZERvbmUuYmxvY2sod2FpdFRpbWVNcyk7CiAgICAgICAgICAgICBpZiAoIWNoYW5nZVN1Y2NlZWRlZCkgewogICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIldhaXQgZm9yIHN1cmZhY2UgY2hhbmdlIHRpbWVkIG91dCBhZnRlciAiICsgdGltZU91dE1zICsgIiBtcyIpOwotICAgICAgICAgICAgICAgIHJldHVybiBjaGFuZ2VTdWNjZWVkZWQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyBHZXQgYSBzdXJmYWNlIGNoYW5nZSBjYWxsYmFjaywgbmVlZCB0byBjaGVjayBpZiB0aGUgc2l6ZSBpcyBleHBlY3RlZC4KICAgICAgICAgICAgICAgICBzdXJmYWNlQ2hhbmdlZERvbmUuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICBpZiAoY3VycmVudFdpZHRoID09IGV4cGVjdFdpZHRoICYmIGN1cnJlbnRIZWlnaHQgPT0gZXhwZWN0SGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGFuZ2VTdWNjZWVkZWQ7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkKHN1cmZhY2VMb2NrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHBlY3RXaWR0aCA9PSBjdXJyZW50V2lkdGggJiYgZXhwZWN0SGVpZ2h0ID09IGN1cnJlbnRIZWlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiV2FpdCBmb3Igc3VyZmFjZSBjaGFuZ2VkIHRvICIgKyBleHBlY3RXaWR0aCArICJ4IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RIZWlnaHQuIEdvdCAiICsgY3VycmVudFdpZHRoICsgIngiICsgY3VycmVudEhlaWdodCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuIEtlZXAgd2FpdGluZyIpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8vIERvIGEgZnVydGhlciBpdGVyYXRpb24gc3VyZmFjZSBjaGFuZ2UgY2hlY2sgYXMgc3VyZmFjZUNoYW5nZWQgY291bGQgYmUgY2FsbGVkCiAgICAgICAgICAgICAgICAgLy8gYWdhaW4uCkBAIC04OCw2ICs5NCw3IEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBDb3VsZG4ndCBnZXQgZXhwZWN0ZWQgc3VyZmFjZSBzaXplIGNoYW5nZS4KKyAgICAgICAgTG9nLmUoVEFHLCAiV2FpdCBmb3Igc3VyZmFjZSBjaGFuZ2UgdGltZWQgb3V0IGFmdGVyICIgKyB0aW1lT3V0TXMgKyAiIG1zIik7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL2NhbWVyYS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL2N0cy9DYW1lcmFEZXZpY2VUZXN0LmphdmEgYi90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9jdHMvQ2FtZXJhRGV2aWNlVGVzdC5qYXZhCmluZGV4IGI1MWUzMzguLjgzNjIxMGYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2NhbWVyYS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL2N0cy9DYW1lcmFEZXZpY2VUZXN0LmphdmEKKysrIGIvdGVzdHMvY2FtZXJhL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvY3RzL0NhbWVyYURldmljZVRlc3QuamF2YQpAQCAtMzUsMjIgKzM1LDI3IEBACiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhcHR1cmVSZXN1bHQ7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLlRvdGFsQ2FwdHVyZVJlc3VsdDsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuY3RzLmhlbHBlcnMuU3RhdGljTWV0YWRhdGE7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLmN0cy5oZWxwZXJzLlN0YXRpY01ldGFkYXRhLkNoZWNrTGV2ZWw7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLmN0cy50ZXN0Y2FzZXMuQ2FtZXJhMkFuZHJvaWRUZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIucGFyYW1zLk1ldGVyaW5nUmVjdGFuZ2xlOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5wYXJhbXMuSW5wdXRDb25maWd1cmF0aW9uOwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5wYXJhbXMuT3V0cHV0Q29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIucGFyYW1zLlNlc3Npb25Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5wYXJhbXMuU3RyZWFtQ29uZmlndXJhdGlvbk1hcDsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkltYWdlUmVhZGVyOworaW1wb3J0IGFuZHJvaWQub3MuQ29uZGl0aW9uVmFyaWFibGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlJhbmdlOwogaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlOwogCiBpbXBvcnQgY29tLmFuZHJvaWQuZXguY2FtZXJhMi5ibG9ja2luZy5CbG9ja2luZ1Nlc3Npb25DYWxsYmFjazsKIGltcG9ydCBjb20uYW5kcm9pZC5leC5jYW1lcmEyLmJsb2NraW5nLkJsb2NraW5nU3RhdGVDYWxsYmFjazsKK2ltcG9ydCBjb20uYW5kcm9pZC5leC5jYW1lcmEyLmV4Y2VwdGlvbnMuVGltZW91dFJ1bnRpbWVFeGNlcHRpb247CiBpbXBvcnQgY29tLmFuZHJvaWQuZXguY2FtZXJhMi51dGlscy5TdGF0ZVdhaXRlcjsKIAotaW1wb3J0IG9yZy5tb2NraXRvLmNvbXBhdC5Bcmd1bWVudE1hdGNoZXI7Ci0KIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuQ29uZGl0aW9uOwpAQCAtNjIsMTIgKzY3LDE3IEBACiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU2l6ZTsKKworaW1wb3J0IG9yZy5tb2NraXRvLkFyZ3VtZW50TWF0Y2hlcjsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkxpbmtlZEJsb2NraW5nUXVldWU7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiAKIC8qKgogICogPHA+QmFzaWMgdGVzdCBmb3IgQ2FtZXJhRGV2aWNlIEFQSXMuPC9wPgogICovCitAQXBwTW9kZUZ1bGwKIHB1YmxpYyBjbGFzcyBDYW1lcmFEZXZpY2VUZXN0IGV4dGVuZHMgQ2FtZXJhMkFuZHJvaWRUZXN0Q2FzZSB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJDYW1lcmFEZXZpY2VUZXN0IjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFZFUkJPU0UgPSBMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5WRVJCT1NFKTsKQEAgLTg5LDcgKzk5LDcgQEAKICAgICAgICAgICAgIENhbWVyYURldmljZS5URU1QTEFURV9QUkVWSUVXLAogICAgICAgICAgICAgQ2FtZXJhRGV2aWNlLlRFTVBMQVRFX1JFQ09SRCwKICAgICAgICAgICAgIENhbWVyYURldmljZS5URU1QTEFURV9TVElMTF9DQVBUVVJFLAotICAgICAgICAgICAgQ2FtZXJhRGV2aWNlLlRFTVBMQVRFX1ZJREVPX1NOQVBTSE9UCisgICAgICAgICAgICBDYW1lcmFEZXZpY2UuVEVNUExBVEVfVklERU9fU05BUFNIT1QsCiAgICAgfTsKIAogICAgIHByaXZhdGUgc3RhdGljIGludFtdIHNJbnZhbGlkVGVtcGxhdGVzID0gbmV3IGludFtdIHsKQEAgLTE0Myw4ICsxNTMsNiBAQAogICAgICAgICAgICAgICAgICAgICBhbnkoQ2FtZXJhRGV2aWNlLmNsYXNzKSk7CiAKICAgICAgICAgbUNhbWVyYUxpc3RlbmVyID0gbUNhbWVyYU1vY2tMaXN0ZW5lcjsKLSAgICAgICAgY3JlYXRlRGVmYXVsdEltYWdlUmVhZGVyKERFRkFVTFRfQ0FQVFVSRV9TSVpFLCBJbWFnZUZvcm1hdC5ZVVZfNDIwXzg4OCwgTUFYX05VTV9JTUFHRVMsCi0gICAgICAgICAgICAgICAgbmV3IEltYWdlRHJvcHBlckxpc3RlbmVyKCkpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMzU2LDE5ICszNjQsMjMgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FtZXJhRGV2aWNlQ2FwdHVyZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBydW5DYXB0dXJlVGVzdCgvKmJ1cnN0Ki9mYWxzZSwgLypyZXBlYXRpbmcqL2ZhbHNlLCAvKmFib3J0Ki9mYWxzZSk7CisgICAgICAgIHJ1bkNhcHR1cmVUZXN0KC8qYnVyc3QqL2ZhbHNlLCAvKnJlcGVhdGluZyovZmFsc2UsIC8qYWJvcnQqL2ZhbHNlLCAvKnVzZUV4ZWN1dG9yKi9mYWxzZSk7CisgICAgICAgIHJ1bkNhcHR1cmVUZXN0KC8qYnVyc3QqL2ZhbHNlLCAvKnJlcGVhdGluZyovZmFsc2UsIC8qYWJvcnQqL2ZhbHNlLCAvKnVzZUV4ZWN1dG9yKi90cnVlKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FtZXJhRGV2aWNlQ2FwdHVyZUJ1cnN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJ1bkNhcHR1cmVUZXN0KC8qYnVyc3QqL3RydWUsIC8qcmVwZWF0aW5nKi9mYWxzZSwgLyphYm9ydCovZmFsc2UpOworICAgICAgICBydW5DYXB0dXJlVGVzdCgvKmJ1cnN0Ki90cnVlLCAvKnJlcGVhdGluZyovZmFsc2UsIC8qYWJvcnQqL2ZhbHNlLCAvKnVzZUV4ZWN1dG9yKi9mYWxzZSk7CisgICAgICAgIHJ1bkNhcHR1cmVUZXN0KC8qYnVyc3QqL3RydWUsIC8qcmVwZWF0aW5nKi9mYWxzZSwgLyphYm9ydCovZmFsc2UsIC8qdXNlRXhlY3V0b3IqL3RydWUpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RDYW1lcmFEZXZpY2VSZXBlYXRpbmdSZXF1ZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJ1bkNhcHR1cmVUZXN0KC8qYnVyc3QqL2ZhbHNlLCAvKnJlcGVhdGluZyovdHJ1ZSwgLyphYm9ydCovZmFsc2UpOworICAgICAgICBydW5DYXB0dXJlVGVzdCgvKmJ1cnN0Ki9mYWxzZSwgLypyZXBlYXRpbmcqL3RydWUsIC8qYWJvcnQqL2ZhbHNlLCAvKnVzZUV4ZWN1dG9yKi9mYWxzZSk7CisgICAgICAgIHJ1bkNhcHR1cmVUZXN0KC8qYnVyc3QqL2ZhbHNlLCAvKnJlcGVhdGluZyovdHJ1ZSwgLyphYm9ydCovZmFsc2UsIC8qdXNlRXhlY3V0b3IqL3RydWUpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RDYW1lcmFEZXZpY2VSZXBlYXRpbmdCdXJzdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBydW5DYXB0dXJlVGVzdCgvKmJ1cnN0Ki90cnVlLCAvKnJlcGVhdGluZyovdHJ1ZSwgLyphYm9ydCovZmFsc2UpOworICAgICAgICBydW5DYXB0dXJlVGVzdCgvKmJ1cnN0Ki90cnVlLCAvKnJlcGVhdGluZyovdHJ1ZSwgLyphYm9ydCovZmFsc2UsIC8qdXNlRXhlY3V0b3IqLyBmYWxzZSk7CisgICAgICAgIHJ1bkNhcHR1cmVUZXN0KC8qYnVyc3QqL3RydWUsIC8qcmVwZWF0aW5nKi90cnVlLCAvKmFib3J0Ki9mYWxzZSwgLyp1c2VFeGVjdXRvciovIHRydWUpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzgwLDggKzM5MiwxMCBAQAogICAgICAqIDwvcD4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FtZXJhRGV2aWNlQWJvcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcnVuQ2FwdHVyZVRlc3QoLypidXJzdCovZmFsc2UsIC8qcmVwZWF0aW5nKi90cnVlLCAvKmFib3J0Ki90cnVlKTsKLSAgICAgICAgcnVuQ2FwdHVyZVRlc3QoLypidXJzdCovdHJ1ZSwgLypyZXBlYXRpbmcqL3RydWUsIC8qYWJvcnQqL3RydWUpOworICAgICAgICBydW5DYXB0dXJlVGVzdCgvKmJ1cnN0Ki9mYWxzZSwgLypyZXBlYXRpbmcqL3RydWUsIC8qYWJvcnQqL3RydWUsIC8qdXNlRXhlY3V0b3IqL2ZhbHNlKTsKKyAgICAgICAgcnVuQ2FwdHVyZVRlc3QoLypidXJzdCovZmFsc2UsIC8qcmVwZWF0aW5nKi90cnVlLCAvKmFib3J0Ki90cnVlLCAvKnVzZUV4ZWN1dG9yKi90cnVlKTsKKyAgICAgICAgcnVuQ2FwdHVyZVRlc3QoLypidXJzdCovdHJ1ZSwgLypyZXBlYXRpbmcqL3RydWUsIC8qYWJvcnQqL3RydWUsIC8qdXNlRXhlY3V0b3IqL2ZhbHNlKTsKKyAgICAgICAgcnVuQ2FwdHVyZVRlc3QoLypidXJzdCovdHJ1ZSwgLypyZXBlYXRpbmcqL3RydWUsIC8qYWJvcnQqL3RydWUsIC8qdXNlRXhlY3V0b3IqL3RydWUpOwogICAgICAgICAvKioKICAgICAgICAgICogVE9ETzogdGhpcyBpcyBvbmx5IGJhc2ljIHRlc3Qgb2YgYWJvcnQuIHdlIHByb2JhYmx5IHNob3VsZCBhbHNvIHRlc3QgYmVsb3cgY2FzZXM6CiAgICAgICAgICAqCkBAIC00MzMsNyArNDQ3LDYgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hhaW5lZE9wZXJhdGlvbigpIHRocm93cyBUaHJvd2FibGUgewogCiAgICAgICAgIGZpbmFsIEFycmF5TGlzdDxTdXJmYWNlPiBvdXRwdXRzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIG91dHB1dHMuYWRkKG1SZWFkZXJTdXJmYWNlKTsKIAogICAgICAgICAvLyBBIHF1ZXVlIGZvciB0aGUgY2hhaW5lZCBsaXN0ZW5lcnMgdG8gcHVzaCByZXN1bHRzIHRvCiAgICAgICAgIC8vIEEgc3VjY2VzcyBUaHJvd2FibGUgaW5kaWNhdGVzIG5vIGVycm9yczsgb3RoZXIgVGhyb3dhYmxlcyBkZXRhaWwgYSB0ZXN0IGZhaWx1cmU7CkBAIC01NzUsNDkgKzU4OCw2MCBAQAogICAgICAgICAvLyBBY3R1YWwgdGVzdCBjb2RlCiAKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtQ2FtZXJhSWRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBUaHJvd2FibGUgcmVzdWx0OworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBUaHJvd2FibGUgcmVzdWx0OwogCi0gICAgICAgICAgICBpZiAoIShuZXcgU3RhdGljTWV0YWRhdGEobUNhbWVyYU1hbmFnZXIuZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKG1DYW1lcmFJZHNbaV0pKSkuCi0gICAgICAgICAgICAgICAgICAgIGlzQ29sb3JPdXRwdXRTdXBwb3J0ZWQoKSkgewotICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkNhbWVyYSAiICsgbUNhbWVyYUlkc1tpXSArICIgZG9lcyBub3Qgc3VwcG9ydCBjb2xvciBvdXRwdXRzLCBza2lwcGluZyIpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBTdGFydCBjaGFpbmVkIGNhc2NhZGUKLSAgICAgICAgICAgIENoYWluZWRDYW1lcmFMaXN0ZW5lciBjYW1lcmFMaXN0ZW5lciA9IG5ldyBDaGFpbmVkQ2FtZXJhTGlzdGVuZXIoKTsKLSAgICAgICAgICAgIG1DYW1lcmFNYW5hZ2VyLm9wZW5DYW1lcmEobUNhbWVyYUlkc1tpXSwgY2FtZXJhTGlzdGVuZXIsIG1IYW5kbGVyKTsKLQotICAgICAgICAgICAgLy8gQ2hlY2sgaWYgb3BlbiBzdWNjZWVkZWQKLSAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdHMucG9sbChDQU1FUkFfT1BFTl9USU1FT1VUX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBzdWNjZXNzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNhbWVyYUxpc3RlbmVyLmNhbWVyYURldmljZSAhPSBudWxsKSBjYW1lcmFMaXN0ZW5lci5jYW1lcmFEZXZpY2UuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZmFpbCgiVGltZW91dCB3YWl0aW5nIGZvciBjYW1lcmEgb3BlbiIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IHJlc3VsdDsKKyAgICAgICAgICAgICAgICBpZiAoIShuZXcgU3RhdGljTWV0YWRhdGEobUNhbWVyYU1hbmFnZXIuZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKG1DYW1lcmFJZHNbaV0pKSkuCisgICAgICAgICAgICAgICAgICAgICAgICBpc0NvbG9yT3V0cHV0U3VwcG9ydGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiQ2FtZXJhICIgKyBtQ2FtZXJhSWRzW2ldICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGRvZXMgbm90IHN1cHBvcnQgY29sb3Igb3V0cHV0cywgc2tpcHBpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBDaGVjayBpZiBjb25maWd1cmUgc3VjY2VlZGVkCi0gICAgICAgICAgICByZXN1bHQgPSByZXN1bHRzLnBvbGwoU0VTU0lPTl9DT05GSUdVUkVfVElNRU9VVF9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gc3VjY2VzcykgewotICAgICAgICAgICAgICAgIGlmIChjYW1lcmFMaXN0ZW5lci5jYW1lcmFEZXZpY2UgIT0gbnVsbCkgY2FtZXJhTGlzdGVuZXIuY2FtZXJhRGV2aWNlLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZhaWwoIlRpbWVvdXQgd2FpdGluZyBmb3Igc2Vzc2lvbiBjb25maWd1cmUiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNyZWF0ZURlZmF1bHRJbWFnZVJlYWRlcihERUZBVUxUX0NBUFRVUkVfU0laRSwgSW1hZ2VGb3JtYXQuWVVWXzQyMF84ODgsCisgICAgICAgICAgICAgICAgICAgICAgICBNQVhfTlVNX0lNQUdFUywgbmV3IEltYWdlRHJvcHBlckxpc3RlbmVyKCkpOworICAgICAgICAgICAgICAgIG91dHB1dHMuYWRkKG1SZWFkZXJTdXJmYWNlKTsKIAotICAgICAgICAgICAgLy8gQ2hlY2sgaWYgY2FwdHVyZSBzdWNjZWVkZWQKLSAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdHMucG9sbChDQVBUVVJFX1JFU1VMVF9USU1FT1VUX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBzdWNjZXNzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNhbWVyYUxpc3RlbmVyLmNhbWVyYURldmljZSAhPSBudWxsKSBjYW1lcmFMaXN0ZW5lci5jYW1lcmFEZXZpY2UuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZmFpbCgiVGltZW91dCB3YWl0aW5nIGZvciBjYXB0dXJlIGNvbXBsZXRpb24iKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyByZXN1bHQ7CisgICAgICAgICAgICAgICAgLy8gU3RhcnQgY2hhaW5lZCBjYXNjYWRlCisgICAgICAgICAgICAgICAgQ2hhaW5lZENhbWVyYUxpc3RlbmVyIGNhbWVyYUxpc3RlbmVyID0gbmV3IENoYWluZWRDYW1lcmFMaXN0ZW5lcigpOworICAgICAgICAgICAgICAgIG1DYW1lcmFNYW5hZ2VyLm9wZW5DYW1lcmEobUNhbWVyYUlkc1tpXSwgY2FtZXJhTGlzdGVuZXIsIG1IYW5kbGVyKTsKKworICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIG9wZW4gc3VjY2VlZGVkCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0cy5wb2xsKENBTUVSQV9PUEVOX1RJTUVPVVRfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBzdWNjZXNzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjYW1lcmFMaXN0ZW5lci5jYW1lcmFEZXZpY2UgIT0gbnVsbCkgY2FtZXJhTGlzdGVuZXIuY2FtZXJhRGV2aWNlLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbCgiVGltZW91dCB3YWl0aW5nIGZvciBjYW1lcmEgb3BlbiIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgcmVzdWx0OworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgY29uZmlndXJlIHN1Y2NlZWRlZAorICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdHMucG9sbChTRVNTSU9OX0NPTkZJR1VSRV9USU1FT1VUX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gc3VjY2VzcykgeworICAgICAgICAgICAgICAgICAgICBpZiAoY2FtZXJhTGlzdGVuZXIuY2FtZXJhRGV2aWNlICE9IG51bGwpIGNhbWVyYUxpc3RlbmVyLmNhbWVyYURldmljZS5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwoIlRpbWVvdXQgd2FpdGluZyBmb3Igc2Vzc2lvbiBjb25maWd1cmUiKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHJlc3VsdDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGNhcHR1cmUgc3VjY2VlZGVkCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0cy5wb2xsKENBUFRVUkVfUkVTVUxUX1RJTUVPVVRfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBzdWNjZXNzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjYW1lcmFMaXN0ZW5lci5jYW1lcmFEZXZpY2UgIT0gbnVsbCkgY2FtZXJhTGlzdGVuZXIuY2FtZXJhRGV2aWNlLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbCgiVGltZW91dCB3YWl0aW5nIGZvciBjYXB0dXJlIGNvbXBsZXRpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHJlc3VsdDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBjbG9zZURlZmF1bHRJbWFnZVJlYWRlcigpOworICAgICAgICAgICAgICAgIG91dHB1dHMuY2xlYXIoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTc4Miw2ICs4MDYsMzg0IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBUZXN0IHNlc3Npb24gY29uZmlndXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2Vzc2lvbkNvbmZpZ3VyYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQXJyYXlMaXN0PE91dHB1dENvbmZpZ3VyYXRpb24+IG91dENvbmZpZ3MgPSBuZXcgQXJyYXlMaXN0PE91dHB1dENvbmZpZ3VyYXRpb24+ICgpOworICAgICAgICBvdXRDb25maWdzLmFkZChuZXcgT3V0cHV0Q29uZmlndXJhdGlvbihuZXcgU2l6ZSgxLCAxKSwgU3VyZmFjZVRleHR1cmUuY2xhc3MpKTsKKyAgICAgICAgb3V0Q29uZmlncy5hZGQobmV3IE91dHB1dENvbmZpZ3VyYXRpb24obmV3IFNpemUoMiwgMiksIFN1cmZhY2VUZXh0dXJlLmNsYXNzKSk7CisgICAgICAgIG1TZXNzaW9uTW9ja0xpc3RlbmVyID0gc3B5KG5ldyBCbG9ja2luZ1Nlc3Npb25DYWxsYmFjaygpKTsKKyAgICAgICAgSGFuZGxlckV4ZWN1dG9yIGV4ZWN1dG9yID0gbmV3IEhhbmRsZXJFeGVjdXRvcihtSGFuZGxlcik7CisgICAgICAgIElucHV0Q29uZmlndXJhdGlvbiBpbnB1dENvbmZpZyA9IG5ldyBJbnB1dENvbmZpZ3VyYXRpb24oMSwgMSwgSW1hZ2VGb3JtYXQuUFJJVkFURSk7CisKKyAgICAgICAgU2Vzc2lvbkNvbmZpZ3VyYXRpb24gcmVndWxhclNlc3Npb25Db25maWcgPSBuZXcgU2Vzc2lvbkNvbmZpZ3VyYXRpb24oCisgICAgICAgICAgICAgICAgU2Vzc2lvbkNvbmZpZ3VyYXRpb24uU0VTU0lPTl9SRUdVTEFSLCBvdXRDb25maWdzLCBleGVjdXRvciwgbVNlc3Npb25Nb2NrTGlzdGVuZXIpOworCisgICAgICAgIFNlc3Npb25Db25maWd1cmF0aW9uIGhpZ2hzcGVlZFNlc3Npb25Db25maWcgPSBuZXcgU2Vzc2lvbkNvbmZpZ3VyYXRpb24oCisgICAgICAgICAgICAgICAgU2Vzc2lvbkNvbmZpZ3VyYXRpb24uU0VTU0lPTl9ISUdIX1NQRUVELCBvdXRDb25maWdzLCBleGVjdXRvciwgbVNlc3Npb25Nb2NrTGlzdGVuZXIpOworCisgICAgICAgIGFzc2VydEVxdWFscygiU2Vzc2lvbiBjb25maWd1cmF0aW9uIG91dHB1dCBkb2Vzbid0IG1hdGNoIiwKKyAgICAgICAgICAgICAgICByZWd1bGFyU2Vzc2lvbkNvbmZpZy5nZXRPdXRwdXRDb25maWd1cmF0aW9ucygpLCBvdXRDb25maWdzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIlNlc3Npb24gY29uZmlndXJhdGlvbiBvdXRwdXQgZG9lc24ndCBtYXRjaCIsCisgICAgICAgICAgICAgICAgcmVndWxhclNlc3Npb25Db25maWcuZ2V0T3V0cHV0Q29uZmlndXJhdGlvbnMoKSwKKyAgICAgICAgICAgICAgICBoaWdoc3BlZWRTZXNzaW9uQ29uZmlnLmdldE91dHB1dENvbmZpZ3VyYXRpb25zKCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygiU2Vzc2lvbiBjb25maWd1cmF0aW9uIGNhbGxiYWNrIGRvZXNuJ3QgbWF0Y2giLAorICAgICAgICAgICAgICAgIHJlZ3VsYXJTZXNzaW9uQ29uZmlnLmdldFN0YXRlQ2FsbGJhY2soKSwgbVNlc3Npb25Nb2NrTGlzdGVuZXIpOworCisgICAgICAgIGFzc2VydEVxdWFscygiU2Vzc2lvbiBjb25maWd1cmF0aW9uIGNhbGxiYWNrIGRvZXNuJ3QgbWF0Y2giLAorICAgICAgICAgICAgICAgIHJlZ3VsYXJTZXNzaW9uQ29uZmlnLmdldFN0YXRlQ2FsbGJhY2soKSwKKyAgICAgICAgICAgICAgICBoaWdoc3BlZWRTZXNzaW9uQ29uZmlnLmdldFN0YXRlQ2FsbGJhY2soKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJTZXNzaW9uIGNvbmZpZ3VyYXRpb24gZXhlY3V0b3IgZG9lc24ndCBtYXRjaCIsCisgICAgICAgICAgICAgICAgcmVndWxhclNlc3Npb25Db25maWcuZ2V0RXhlY3V0b3IoKSwgZXhlY3V0b3IpOworCisgICAgICAgIGFzc2VydEVxdWFscygiU2Vzc2lvbiBjb25maWd1cmF0aW9uIGhhbmRsZXIgZG9lc24ndCBtYXRjaCIsCisgICAgICAgICAgICAgICAgcmVndWxhclNlc3Npb25Db25maWcuZ2V0RXhlY3V0b3IoKSwgaGlnaHNwZWVkU2Vzc2lvbkNvbmZpZy5nZXRFeGVjdXRvcigpKTsKKworICAgICAgICByZWd1bGFyU2Vzc2lvbkNvbmZpZy5zZXRJbnB1dENvbmZpZ3VyYXRpb24oaW5wdXRDb25maWcpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlNlc3Npb24gY29uZmlndXJhdGlvbiBpbnB1dCBkb2Vzbid0IG1hdGNoIiwKKyAgICAgICAgICAgICAgICByZWd1bGFyU2Vzc2lvbkNvbmZpZy5nZXRJbnB1dENvbmZpZ3VyYXRpb24oKSwgaW5wdXRDb25maWcpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBoaWdoc3BlZWRTZXNzaW9uQ29uZmlnLnNldElucHV0Q29uZmlndXJhdGlvbihpbnB1dENvbmZpZyk7CisgICAgICAgICAgICBmYWlsKCJObyBleGNlcHRpb24gZm9yIHZhbGlkIGlucHV0IGNvbmZpZ3VyYXRpb24gaW4gaGlnaHQgc3BlZWQgc2Vzc2lvbiBjb25maWd1cmF0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vZXhwZWN0ZWQKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydEVxdWFscygiU2Vzc2lvbiBjb25maWd1cmF0aW9uIGlucHV0IGRvZXNuJ3QgbWF0Y2giLAorICAgICAgICAgICAgICAgIGhpZ2hzcGVlZFNlc3Npb25Db25maWcuZ2V0SW5wdXRDb25maWd1cmF0aW9uKCksIG51bGwpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUNhbWVyYUlkcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBvcGVuRGV2aWNlKG1DYW1lcmFJZHNbaV0sIG1DYW1lcmFNb2NrTGlzdGVuZXIpOworICAgICAgICAgICAgICAgIHdhaXRGb3JEZXZpY2VTdGF0ZShTVEFURV9PUEVORUQsIENBTUVSQV9PUEVOX1RJTUVPVVRfTVMpOworCisgICAgICAgICAgICAgICAgQ2FwdHVyZVJlcXVlc3QuQnVpbGRlciBidWlsZGVyID0KKyAgICAgICAgICAgICAgICAgICAgbUNhbWVyYS5jcmVhdGVDYXB0dXJlUmVxdWVzdChDYW1lcmFEZXZpY2UuVEVNUExBVEVfU1RJTExfQ0FQVFVSRSk7CisgICAgICAgICAgICAgICAgQ2FwdHVyZVJlcXVlc3QgcmVxdWVzdCA9IGJ1aWxkZXIuYnVpbGQoKTsKKworICAgICAgICAgICAgICAgIHJlZ3VsYXJTZXNzaW9uQ29uZmlnLnNldFNlc3Npb25QYXJhbWV0ZXJzKHJlcXVlc3QpOworICAgICAgICAgICAgICAgIGhpZ2hzcGVlZFNlc3Npb25Db25maWcuc2V0U2Vzc2lvblBhcmFtZXRlcnMocmVxdWVzdCk7CisKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlNlc3Npb24gY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGRvZXNuJ3QgbWF0Y2giLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVndWxhclNlc3Npb25Db25maWcuZ2V0U2Vzc2lvblBhcmFtZXRlcnMoKSwgcmVxdWVzdCk7CisKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlNlc3Npb24gY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGRvZXNuJ3QgbWF0Y2giLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVndWxhclNlc3Npb25Db25maWcuZ2V0U2Vzc2lvblBhcmFtZXRlcnMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2hzcGVlZFNlc3Npb25Db25maWcuZ2V0U2Vzc2lvblBhcmFtZXRlcnMoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBjbG9zZURldmljZShtQ2FtZXJhSWRzW2ldLCBtQ2FtZXJhTW9ja0xpc3RlbmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIGZvciBhbnkgc3RhdGUgbGVha2FnZSBpbiBjYXNlIG9mIGludGVybmFsIHJlLWNvbmZpZ3VyZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTZXNzaW9uUGFyYW1ldGVyc1N0YXRlTGVhaygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1DYW1lcmFJZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb3BlbkRldmljZShtQ2FtZXJhSWRzW2ldLCBtQ2FtZXJhTW9ja0xpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICB3YWl0Rm9yRGV2aWNlU3RhdGUoU1RBVEVfT1BFTkVELCBDQU1FUkFfT1BFTl9USU1FT1VUX01TKTsKKyAgICAgICAgICAgICAgICBpZiAoIW1TdGF0aWNJbmZvLmlzQ29sb3JPdXRwdXRTdXBwb3J0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJDYW1lcmEgIiArIG1DYW1lcmFJZHNbaV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZG9lcyBub3Qgc3VwcG9ydCBjb2xvciBvdXRwdXRzLCBza2lwcGluZyIpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGVzdFNlc3Npb25QYXJhbWV0ZXJzU3RhdGVMZWFrQnlDYW1lcmEobUNhbWVyYUlkc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBjbG9zZURldmljZShtQ2FtZXJhSWRzW2ldLCBtQ2FtZXJhTW9ja0xpc3RlbmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIGZvciBhbnkgc3RhdGUgbGVha2FnZSBpbiBjYXNlIG9mIGludGVybmFsIHJlLWNvbmZpZ3VyZQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB0ZXN0U2Vzc2lvblBhcmFtZXRlcnNTdGF0ZUxlYWtCeUNhbWVyYShTdHJpbmcgY2FtZXJhSWQpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IG91dHB1dEZvcm1hdCA9IEltYWdlRm9ybWF0LllVVl80MjBfODg4OworICAgICAgICBTaXplIG91dHB1dFNpemUgPSBtT3JkZXJlZFByZXZpZXdTaXplcy5nZXQoMCk7CisKKyAgICAgICAgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzIGNoYXJhY3RlcmlzdGljcyA9IG1DYW1lcmFNYW5hZ2VyLmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjYW1lcmFJZCk7CisgICAgICAgIFN0cmVhbUNvbmZpZ3VyYXRpb25NYXAgY29uZmlnID0gY2hhcmFjdGVyaXN0aWNzLmdldCgKKyAgICAgICAgICAgICAgICBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuU0NBTEVSX1NUUkVBTV9DT05GSUdVUkFUSU9OX01BUCk7CisgICAgICAgIExpc3QgPENhcHR1cmVSZXF1ZXN0LktleTw/Pj4gc2Vzc2lvbktleXMgPSBjaGFyYWN0ZXJpc3RpY3MuZ2V0QXZhaWxhYmxlU2Vzc2lvbktleXMoKTsKKyAgICAgICAgaWYgKHNlc3Npb25LZXlzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb25maWcuaXNPdXRwdXRTdXBwb3J0ZWRGb3Iob3V0cHV0Rm9ybWF0KSkgeworICAgICAgICAgICAgb3V0cHV0U2l6ZSA9IGNvbmZpZy5nZXRPdXRwdXRTaXplcyhvdXRwdXRGb3JtYXQpWzBdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgSW1hZ2VSZWFkZXIgaW1hZ2VSZWFkZXIgPSBJbWFnZVJlYWRlci5uZXdJbnN0YW5jZShvdXRwdXRTaXplLmdldFdpZHRoKCksCisgICAgICAgICAgICAgICAgb3V0cHV0U2l6ZS5nZXRIZWlnaHQoKSwgb3V0cHV0Rm9ybWF0LCAvKm1heEltYWdlcyovMyk7CisKKyAgICAgICAgY2xhc3MgT25SZWFkeUNhcHR1cmVTdGF0ZUNhbGxiYWNrIGV4dGVuZHMgQ2FtZXJhQ2FwdHVyZVNlc3Npb24uU3RhdGVDYWxsYmFjayB7CisgICAgICAgICAgICBwcml2YXRlIENvbmRpdGlvblZhcmlhYmxlIG9uUmVhZHlUcmlnZ2VyZWRDb25kID0gbmV3IENvbmRpdGlvblZhcmlhYmxlKCk7CisgICAgICAgICAgICBwcml2YXRlIGJvb2xlYW4gb25SZWFkeVRyaWdnZXJlZCA9IGZhbHNlOworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ29uZmlndXJlZChDYW1lcmFDYXB0dXJlU2Vzc2lvbiBzZXNzaW9uKSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25Db25maWd1cmVGYWlsZWQoQ2FtZXJhQ2FwdHVyZVNlc3Npb24gc2Vzc2lvbikgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBvblJlYWR5KENhbWVyYUNhcHR1cmVTZXNzaW9uIHNlc3Npb24pIHsKKyAgICAgICAgICAgICAgICBvblJlYWR5VHJpZ2dlcmVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBvblJlYWR5VHJpZ2dlcmVkQ29uZC5vcGVuKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdhaXRGb3JPblJlYWR5KGxvbmcgdGltZW91dCkgeworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgICAgICAgICBpZiAob25SZWFkeVRyaWdnZXJlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgb25SZWFkeVRyaWdnZXJlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgb25SZWFkeVRyaWdnZXJlZENvbmQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChvblJlYWR5VHJpZ2dlcmVkQ29uZC5ibG9jayh0aW1lb3V0KSkgeworICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9uUmVhZHlUcmlnZ2VyZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9uUmVhZHlUcmlnZ2VyZWRDb25kLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVGltZW91dFJ1bnRpbWVFeGNlcHRpb24oIlVuYWJsZSB0byByZWNlaXZlIG9uUmVhZHkgYWZ0ZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyB0aW1lb3V0ICsgIm1zIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgT25SZWFkeUNhcHR1cmVTdGF0ZUNhbGxiYWNrIHNlc3Npb25MaXN0ZW5lciA9IG5ldyBPblJlYWR5Q2FwdHVyZVN0YXRlQ2FsbGJhY2soKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbVNlc3Npb25Nb2NrTGlzdGVuZXIgPSBzcHkobmV3IEJsb2NraW5nU2Vzc2lvbkNhbGxiYWNrKHNlc3Npb25MaXN0ZW5lcikpOworICAgICAgICAgICAgbVNlc3Npb25XYWl0ZXIgPSBtU2Vzc2lvbk1vY2tMaXN0ZW5lci5nZXRTdGF0ZVdhaXRlcigpOworICAgICAgICAgICAgTGlzdDxPdXRwdXRDb25maWd1cmF0aW9uPiBvdXRwdXRzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICBvdXRwdXRzLmFkZChuZXcgT3V0cHV0Q29uZmlndXJhdGlvbihpbWFnZVJlYWRlci5nZXRTdXJmYWNlKCkpKTsKKyAgICAgICAgICAgIFNlc3Npb25Db25maWd1cmF0aW9uIHNlc3Npb25Db25maWcgPSBuZXcgU2Vzc2lvbkNvbmZpZ3VyYXRpb24oCisgICAgICAgICAgICAgICAgICAgIFNlc3Npb25Db25maWd1cmF0aW9uLlNFU1NJT05fUkVHVUxBUiwgb3V0cHV0cywKKyAgICAgICAgICAgICAgICAgICAgbmV3IEhhbmRsZXJFeGVjdXRvcihtSGFuZGxlciksIG1TZXNzaW9uTW9ja0xpc3RlbmVyKTsKKworICAgICAgICAgICAgQ2FwdHVyZVJlcXVlc3QuQnVpbGRlciBidWlsZGVyID0KKyAgICAgICAgICAgICAgICAgICAgbUNhbWVyYS5jcmVhdGVDYXB0dXJlUmVxdWVzdChDYW1lcmFEZXZpY2UuVEVNUExBVEVfU1RJTExfQ0FQVFVSRSk7CisgICAgICAgICAgICBidWlsZGVyLmFkZFRhcmdldChpbWFnZVJlYWRlci5nZXRTdXJmYWNlKCkpOworICAgICAgICAgICAgQ2FwdHVyZVJlcXVlc3QgcmVxdWVzdCA9IGJ1aWxkZXIuYnVpbGQoKTsKKworICAgICAgICAgICAgc2Vzc2lvbkNvbmZpZy5zZXRTZXNzaW9uUGFyYW1ldGVycyhyZXF1ZXN0KTsKKyAgICAgICAgICAgIG1DYW1lcmEuY3JlYXRlQ2FwdHVyZVNlc3Npb24oc2Vzc2lvbkNvbmZpZyk7CisKKyAgICAgICAgICAgIG1TZXNzaW9uID0gbVNlc3Npb25Nb2NrTGlzdGVuZXIud2FpdEFuZEdldFNlc3Npb24oU0VTU0lPTl9DT05GSUdVUkVfVElNRU9VVF9NUyk7CisgICAgICAgICAgICBzZXNzaW9uTGlzdGVuZXIud2FpdEZvck9uUmVhZHkoU0VTU0lPTl9DT05GSUdVUkVfVElNRU9VVF9NUyk7CisKKyAgICAgICAgICAgIFNpbXBsZUNhcHR1cmVDYWxsYmFjayBjYXB0dXJlTGlzdGVuZXIgPSBuZXcgU2ltcGxlQ2FwdHVyZUNhbGxiYWNrKCk7CisgICAgICAgICAgICBJbWFnZURyb3BwZXJMaXN0ZW5lciBpbWFnZUxpc3RlbmVyID0gbmV3IEltYWdlRHJvcHBlckxpc3RlbmVyKCk7CisgICAgICAgICAgICBpbWFnZVJlYWRlci5zZXRPbkltYWdlQXZhaWxhYmxlTGlzdGVuZXIoaW1hZ2VMaXN0ZW5lciwgbUhhbmRsZXIpOworCisgICAgICAgICAgICAvLyBUbyBjaGVjayB0aGUgc3RhdGUgbGVhayBjb25kaXRpb24sIHdlIG5lZWQgYSBjYXB0dXJlIHJlcXVlc3QgdGhhdCBoYXMKKyAgICAgICAgICAgIC8vIGF0IGxlYXN0IG9uZSBzZXNzaW9uIHBhcmFyYW1ldGVyIHZhbHVlIGRpZmZlcmVuY2UgZnJvbSB0aGUgaW5pdGlhbCBzZXNzaW9uCisgICAgICAgICAgICAvLyBwYXJhbWV0ZXJzIGNvbmZpZ3VyZWQgYWJvdmUuIFNjYW4gYWxsIGF2YWlsYWJsZSB0ZW1wbGF0ZSB0eXBlcyBmb3IgdGhlCisgICAgICAgICAgICAvLyByZXF1aXJlZCBkZWx0YS4KKyAgICAgICAgICAgIENhcHR1cmVSZXF1ZXN0LkJ1aWxkZXIgcmVxdWVzdEJ1aWxkZXIgPSBudWxsOworICAgICAgICAgICAgQXJyYXlMaXN0PENhcHR1cmVSZXF1ZXN0LkJ1aWxkZXI+IGJ1aWxkZXJzID0gbmV3IEFycmF5TGlzdDxDYXB0dXJlUmVxdWVzdC5CdWlsZGVyPiAoKTsKKyAgICAgICAgICAgIGlmIChtU3RhdGljSW5mby5pc0NhcGFiaWxpdHlTdXBwb3J0ZWQoCisgICAgICAgICAgICAgICAgICAgICAgICBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX01BTlVBTF9TRU5TT1IpKSB7CisgICAgICAgICAgICAgICAgYnVpbGRlcnMuYWRkKG1DYW1lcmEuY3JlYXRlQ2FwdHVyZVJlcXVlc3QoQ2FtZXJhRGV2aWNlLlRFTVBMQVRFX01BTlVBTCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1TdGF0aWNJbmZvLmlzQ2FwYWJpbGl0eVN1cHBvcnRlZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIENhbWVyYUNoYXJhY3RlcmlzdGljcy5SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfUFJJVkFURV9SRVBST0NFU1NJTkcpCisgICAgICAgICAgICAgICAgICAgIHx8IG1TdGF0aWNJbmZvLmlzQ2FwYWJpbGl0eVN1cHBvcnRlZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIENhbWVyYUNoYXJhY3RlcmlzdGljcy5SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfWVVWX1JFUFJPQ0VTU0lORykpIHsKKyAgICAgICAgICAgICAgICBidWlsZGVycy5hZGQobUNhbWVyYS5jcmVhdGVDYXB0dXJlUmVxdWVzdChDYW1lcmFEZXZpY2UuVEVNUExBVEVfWkVST19TSFVUVEVSX0xBRykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVpbGRlcnMuYWRkKG1DYW1lcmEuY3JlYXRlQ2FwdHVyZVJlcXVlc3QoQ2FtZXJhRGV2aWNlLlRFTVBMQVRFX1ZJREVPX1NOQVBTSE9UKSk7CisgICAgICAgICAgICBidWlsZGVycy5hZGQobUNhbWVyYS5jcmVhdGVDYXB0dXJlUmVxdWVzdChDYW1lcmFEZXZpY2UuVEVNUExBVEVfUFJFVklFVykpOworICAgICAgICAgICAgYnVpbGRlcnMuYWRkKG1DYW1lcmEuY3JlYXRlQ2FwdHVyZVJlcXVlc3QoQ2FtZXJhRGV2aWNlLlRFTVBMQVRFX1JFQ09SRCkpOworICAgICAgICAgICAgZm9yIChDYXB0dXJlUmVxdWVzdC5LZXk8Pz4ga2V5IDogc2Vzc2lvbktleXMpIHsKKyAgICAgICAgICAgICAgICBPYmplY3Qgc2Vzc2lvblZhbHVlID0gYnVpbGRlci5nZXQoa2V5KTsKKyAgICAgICAgICAgICAgICBmb3IgKENhcHR1cmVSZXF1ZXN0LkJ1aWxkZXIgbmV3QnVpbGRlciA6IGJ1aWxkZXJzKSB7CisgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjdXJyZW50VmFsdWUgPSBuZXdCdWlsZGVyLmdldChrZXkpOworICAgICAgICAgICAgICAgICAgICBpZiAoKHNlc3Npb25WYWx1ZSA9PSBudWxsKSAmJiAoY3VycmVudFZhbHVlID09IG51bGwpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICgoKHNlc3Npb25WYWx1ZSA9PSBudWxsKSAmJiAoY3VycmVudFZhbHVlICE9IG51bGwpKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoc2Vzc2lvblZhbHVlICE9IG51bGwpICYmIChjdXJyZW50VmFsdWUgPT0gbnVsbCkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFzZXNzaW9uVmFsdWUuZXF1YWxzKGN1cnJlbnRWYWx1ZSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QnVpbGRlciA9IG5ld0J1aWxkZXI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0QnVpbGRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHJlcXVlc3RCdWlsZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXF1ZXN0QnVpbGRlci5hZGRUYXJnZXQoaW1hZ2VSZWFkZXIuZ2V0U3VyZmFjZSgpKTsKKyAgICAgICAgICAgICAgICByZXF1ZXN0ID0gcmVxdWVzdEJ1aWxkZXIuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICBtU2Vzc2lvbi5zZXRSZXBlYXRpbmdSZXF1ZXN0KHJlcXVlc3QsIGNhcHR1cmVMaXN0ZW5lciwgbUhhbmRsZXIpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHNlc3Npb25MaXN0ZW5lci53YWl0Rm9yT25SZWFkeShTRVNTSU9OX0NPTkZJR1VSRV9USU1FT1VUX01TKTsKKyAgICAgICAgICAgICAgICAgICAgZmFpbCgiQ2FtZXJhIHNob3VsZG4ndCBzd2l0Y2ggdG8gcmVhZHkgc3RhdGUgd2hlbiBzZXNzaW9uIHBhcmFtZXRlcnMgYXJlICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtb2RpZmllZCIpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRpbWVvdXRSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy9leHBlY3RlZAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGltYWdlUmVhZGVyLmNsb3NlKCk7CisgICAgICAgICAgICBtU2Vzc2lvbi5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVmVyaWZ5IGNyZWF0aW5nIGEgc2Vzc2lvbiB3aXRoIGFkZGl0aW9uYWwgcGFyYW1ldGVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlU2Vzc2lvbldpdGhQYXJhbWV0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUNhbWVyYUlkcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBvcGVuRGV2aWNlKG1DYW1lcmFJZHNbaV0sIG1DYW1lcmFNb2NrTGlzdGVuZXIpOworICAgICAgICAgICAgICAgIHdhaXRGb3JEZXZpY2VTdGF0ZShTVEFURV9PUEVORUQsIENBTUVSQV9PUEVOX1RJTUVPVVRfTVMpOworICAgICAgICAgICAgICAgIGlmICghbVN0YXRpY0luZm8uaXNDb2xvck91dHB1dFN1cHBvcnRlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkNhbWVyYSAiICsgbUNhbWVyYUlkc1tpXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBkb2VzIG5vdCBzdXBwb3J0IGNvbG9yIG91dHB1dHMsIHNraXBwaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRlc3RDcmVhdGVTZXNzaW9uV2l0aFBhcmFtZXRlcnNCeUNhbWVyYShtQ2FtZXJhSWRzW2ldLCAvKnJlcHJvY2Vzc2FibGUqL2ZhbHNlKTsKKyAgICAgICAgICAgICAgICB0ZXN0Q3JlYXRlU2Vzc2lvbldpdGhQYXJhbWV0ZXJzQnlDYW1lcmEobUNhbWVyYUlkc1tpXSwgLypyZXByb2Nlc3NhYmxlKi90cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGNsb3NlRGV2aWNlKG1DYW1lcmFJZHNbaV0sIG1DYW1lcmFNb2NrTGlzdGVuZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVmVyaWZ5IGNyZWF0aW5nIGEgc2Vzc2lvbiB3aXRoIGFkZGl0aW9uYWwgcGFyYW1ldGVycyB3b3JrcworICAgICAqLworICAgIHByaXZhdGUgdm9pZCB0ZXN0Q3JlYXRlU2Vzc2lvbldpdGhQYXJhbWV0ZXJzQnlDYW1lcmEoU3RyaW5nIGNhbWVyYUlkLCBib29sZWFuIHJlcHJvY2Vzc2FibGUpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgaW50IFNFU1NJT05fVElNRU9VVF9NUyA9IDEwMDA7CisgICAgICAgIGZpbmFsIGludCBDQVBUVVJFX1RJTUVPVVRfTVMgPSAzMDAwOworICAgICAgICBpbnQgaW5wdXRGb3JtYXQgPSBJbWFnZUZvcm1hdC5ZVVZfNDIwXzg4ODsKKyAgICAgICAgaW50IG91dHB1dEZvcm1hdCA9IGlucHV0Rm9ybWF0OworICAgICAgICBTaXplIG91dHB1dFNpemUgPSBtT3JkZXJlZFByZXZpZXdTaXplcy5nZXQoMCk7CisgICAgICAgIFNpemUgaW5wdXRTaXplID0gb3V0cHV0U2l6ZTsKKyAgICAgICAgSW5wdXRDb25maWd1cmF0aW9uIGlucHV0Q29uZmlnID0gbnVsbDsKKworICAgICAgICBpZiAoVkVSQk9TRSkgeworICAgICAgICAgICAgTG9nLnYoVEFHLCAiVGVzdGluZyBjcmVhdGluZyBzZXNzaW9uIHdpdGggcGFyYW1ldGVycyBmb3IgY2FtZXJhICIgKyBjYW1lcmFJZCk7CisgICAgICAgIH0KKworICAgICAgICBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MgY2hhcmFjdGVyaXN0aWNzID0gbUNhbWVyYU1hbmFnZXIuZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNhbWVyYUlkKTsKKyAgICAgICAgU3RyZWFtQ29uZmlndXJhdGlvbk1hcCBjb25maWcgPSBjaGFyYWN0ZXJpc3RpY3MuZ2V0KAorICAgICAgICAgICAgICAgIENhbWVyYUNoYXJhY3RlcmlzdGljcy5TQ0FMRVJfU1RSRUFNX0NPTkZJR1VSQVRJT05fTUFQKTsKKworICAgICAgICBpZiAocmVwcm9jZXNzYWJsZSkgeworICAgICAgICAgICAgLy9QaWNrIGEgc3VwcG9ydGVkIGkvbyBmb3JtYXQgYW5kIHNpemUgY29tYmluYXRpb24uCisgICAgICAgICAgICAvL0lkZWFsbHkgdGhlIGlucHV0IGZvcm1hdCBzaG91bGQgbWF0Y2ggdGhlIG91dHB1dC4KKyAgICAgICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgIGludCBpbnB1dEZvcm1hdHMgW10gPSBjb25maWcuZ2V0SW5wdXRGb3JtYXRzKCk7CisgICAgICAgICAgICBpZiAoaW5wdXRGb3JtYXRzLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGludCBpbkZvcm1hdCA6IGlucHV0Rm9ybWF0cykgeworICAgICAgICAgICAgICAgIGludCBvdXRwdXRGb3JtYXRzIFtdID0gY29uZmlnLmdldFZhbGlkT3V0cHV0Rm9ybWF0c0ZvcklucHV0KGluRm9ybWF0KTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBvdXRGb3JtYXQgOiBvdXRwdXRGb3JtYXRzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbkZvcm1hdCA9PSBvdXRGb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0Rm9ybWF0ID0gaW5Gb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRGb3JtYXQgPSBvdXRGb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL0luIGNhc2UgdGhlIGFib3ZlIGNvbWJpbmF0aW9uIGRvZXNuJ3QgZXhpc3QsIHBpY2sgdGhlIGZpcnN0IGZpcnN0IHN1cHBvcnRlZAorICAgICAgICAgICAgLy9wYWlyLgorICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgIGlucHV0Rm9ybWF0ID0gaW5wdXRGb3JtYXRzWzBdOworICAgICAgICAgICAgICAgIGludCBvdXRwdXRGb3JtYXRzIFtdID0gY29uZmlnLmdldFZhbGlkT3V0cHV0Rm9ybWF0c0ZvcklucHV0KGlucHV0Rm9ybWF0KTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJObyBvdXRwdXQgZm9ybWF0cyBzdXBwb3J0ZWQgZm9yIGlucHV0IGZvcm1hdDogIiArIGlucHV0Rm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgKG91dHB1dEZvcm1hdHMubGVuZ3RoID4gMCkpOworICAgICAgICAgICAgICAgIG91dHB1dEZvcm1hdCA9IG91dHB1dEZvcm1hdHNbMF07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNpemUgaW5wdXRTaXplc1tdID0gY29uZmlnLmdldElucHV0U2l6ZXMoaW5wdXRGb3JtYXQpOworICAgICAgICAgICAgU2l6ZSBvdXRwdXRTaXplc1tdID0gY29uZmlnLmdldE91dHB1dFNpemVzKG91dHB1dEZvcm1hdCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJObyB2YWxpZCBzaXplcyBzdXBwb3J0ZWQgZm9yIGlucHV0IGZvcm1hdDogIiArIGlucHV0Rm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAoaW5wdXRTaXplcy5sZW5ndGggPiAwKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJObyB2YWxpZCBzaXplcyBzdXBwb3J0ZWQgZm9yIG91dHB1dCBmb3JtYXQ6ICIgKyBvdXRwdXRGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgIChvdXRwdXRTaXplcy5sZW5ndGggPiAwKSk7CisKKyAgICAgICAgICAgIGlucHV0U2l6ZSA9IGlucHV0U2l6ZXNbMF07CisgICAgICAgICAgICBvdXRwdXRTaXplID0gb3V0cHV0U2l6ZXNbMF07CisgICAgICAgICAgICBpbnB1dENvbmZpZyA9IG5ldyBJbnB1dENvbmZpZ3VyYXRpb24oaW5wdXRTaXplLmdldFdpZHRoKCksCisgICAgICAgICAgICAgICAgICAgIGlucHV0U2l6ZS5nZXRIZWlnaHQoKSwgaW5wdXRGb3JtYXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGNvbmZpZy5pc091dHB1dFN1cHBvcnRlZEZvcihvdXRwdXRGb3JtYXQpKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0U2l6ZSA9IGNvbmZpZy5nZXRPdXRwdXRTaXplcyhvdXRwdXRGb3JtYXQpWzBdOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBJbWFnZVJlYWRlciBpbWFnZVJlYWRlciA9IEltYWdlUmVhZGVyLm5ld0luc3RhbmNlKG91dHB1dFNpemUuZ2V0V2lkdGgoKSwKKyAgICAgICAgICAgICAgICBvdXRwdXRTaXplLmdldEhlaWdodCgpLCBvdXRwdXRGb3JtYXQsIC8qbWF4SW1hZ2VzKi8xKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbVNlc3Npb25Nb2NrTGlzdGVuZXIgPSBzcHkobmV3IEJsb2NraW5nU2Vzc2lvbkNhbGxiYWNrKCkpOworICAgICAgICAgICAgbVNlc3Npb25XYWl0ZXIgPSBtU2Vzc2lvbk1vY2tMaXN0ZW5lci5nZXRTdGF0ZVdhaXRlcigpOworICAgICAgICAgICAgTGlzdDxPdXRwdXRDb25maWd1cmF0aW9uPiBvdXRwdXRzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICBvdXRwdXRzLmFkZChuZXcgT3V0cHV0Q29uZmlndXJhdGlvbihpbWFnZVJlYWRlci5nZXRTdXJmYWNlKCkpKTsKKyAgICAgICAgICAgIFNlc3Npb25Db25maWd1cmF0aW9uIHNlc3Npb25Db25maWcgPSBuZXcgU2Vzc2lvbkNvbmZpZ3VyYXRpb24oCisgICAgICAgICAgICAgICAgICAgIFNlc3Npb25Db25maWd1cmF0aW9uLlNFU1NJT05fUkVHVUxBUiwgb3V0cHV0cywKKyAgICAgICAgICAgICAgICAgICAgbmV3IEhhbmRsZXJFeGVjdXRvcihtSGFuZGxlciksIG1TZXNzaW9uTW9ja0xpc3RlbmVyKTsKKworICAgICAgICAgICAgQ2FwdHVyZVJlcXVlc3QuQnVpbGRlciBidWlsZGVyID0KKyAgICAgICAgICAgICAgICAgICAgbUNhbWVyYS5jcmVhdGVDYXB0dXJlUmVxdWVzdChDYW1lcmFEZXZpY2UuVEVNUExBVEVfU1RJTExfQ0FQVFVSRSk7CisgICAgICAgICAgICBidWlsZGVyLmFkZFRhcmdldChpbWFnZVJlYWRlci5nZXRTdXJmYWNlKCkpOworICAgICAgICAgICAgQ2FwdHVyZVJlcXVlc3QgcmVxdWVzdCA9IGJ1aWxkZXIuYnVpbGQoKTsKKworICAgICAgICAgICAgc2Vzc2lvbkNvbmZpZy5zZXRJbnB1dENvbmZpZ3VyYXRpb24oaW5wdXRDb25maWcpOworICAgICAgICAgICAgc2Vzc2lvbkNvbmZpZy5zZXRTZXNzaW9uUGFyYW1ldGVycyhyZXF1ZXN0KTsKKyAgICAgICAgICAgIG1DYW1lcmEuY3JlYXRlQ2FwdHVyZVNlc3Npb24oc2Vzc2lvbkNvbmZpZyk7CisKKyAgICAgICAgICAgIG1TZXNzaW9uID0gbVNlc3Npb25Nb2NrTGlzdGVuZXIud2FpdEFuZEdldFNlc3Npb24oU0VTU0lPTl9DT05GSUdVUkVfVElNRU9VVF9NUyk7CisKKyAgICAgICAgICAgIC8vIFZlcmlmeSB3ZSBjYW4gY2FwdHVyZSBhIGZyYW1lIHdpdGggdGhlIHNlc3Npb24uCisgICAgICAgICAgICBTaW1wbGVDYXB0dXJlQ2FsbGJhY2sgY2FwdHVyZUxpc3RlbmVyID0gbmV3IFNpbXBsZUNhcHR1cmVDYWxsYmFjaygpOworICAgICAgICAgICAgU2ltcGxlSW1hZ2VSZWFkZXJMaXN0ZW5lciBpbWFnZUxpc3RlbmVyID0gbmV3IFNpbXBsZUltYWdlUmVhZGVyTGlzdGVuZXIoKTsKKyAgICAgICAgICAgIGltYWdlUmVhZGVyLnNldE9uSW1hZ2VBdmFpbGFibGVMaXN0ZW5lcihpbWFnZUxpc3RlbmVyLCBtSGFuZGxlcik7CisKKyAgICAgICAgICAgIG1TZXNzaW9uLmNhcHR1cmUocmVxdWVzdCwgY2FwdHVyZUxpc3RlbmVyLCBtSGFuZGxlcik7CisgICAgICAgICAgICBjYXB0dXJlTGlzdGVuZXIuZ2V0Q2FwdHVyZVJlc3VsdEZvclJlcXVlc3QocmVxdWVzdCwgQ0FQVFVSRV9USU1FT1VUX01TKTsKKyAgICAgICAgICAgIGltYWdlTGlzdGVuZXIuZ2V0SW1hZ2UoQ0FQVFVSRV9USU1FT1VUX01TKS5jbG9zZSgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaW1hZ2VSZWFkZXIuY2xvc2UoKTsKKyAgICAgICAgICAgIG1TZXNzaW9uLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CiAKICAgICAvKioKICAgICAgKiBWZXJpZnkgY3JlYXRpbmcgc2Vzc2lvbnMgYmFjayB0byBiYWNrIGFuZCBvbmx5IHRoZSBsYXN0IG9uZSBpcyB2YWxpZCBmb3IKQEAgLTg2OCw5ICsxMjcwLDE1IEBACiAgICAgICAgIFN1cmZhY2VUZXh0dXJlIG91dHB1dDIgPSBuZXcgU3VyZmFjZVRleHR1cmUoMik7CiAgICAgICAgIFN1cmZhY2Ugb3V0cHV0MlN1cmZhY2UgPSBuZXcgU3VyZmFjZShvdXRwdXQyKTsKIAotICAgICAgICBMaXN0PFN1cmZhY2U+IG91dHB1dFN1cmZhY2VzID0gbmV3IEFycmF5TGlzdDw+KAotICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChvdXRwdXQxU3VyZmFjZSwgb3V0cHV0MlN1cmZhY2UpKTsKLSAgICAgICAgbUNhbWVyYS5jcmVhdGVDYXB0dXJlU2Vzc2lvbihvdXRwdXRTdXJmYWNlcywgbVNlc3Npb25Nb2NrTGlzdGVuZXIsIG1IYW5kbGVyKTsKKyAgICAgICAgQXJyYXlMaXN0PE91dHB1dENvbmZpZ3VyYXRpb24+IG91dENvbmZpZ3MgPSBuZXcgQXJyYXlMaXN0PE91dHB1dENvbmZpZ3VyYXRpb24+ICgpOworICAgICAgICBvdXRDb25maWdzLmFkZChuZXcgT3V0cHV0Q29uZmlndXJhdGlvbihvdXRwdXQxU3VyZmFjZSkpOworICAgICAgICBvdXRDb25maWdzLmFkZChuZXcgT3V0cHV0Q29uZmlndXJhdGlvbihvdXRwdXQyU3VyZmFjZSkpOworICAgICAgICBTZXNzaW9uQ29uZmlndXJhdGlvbiBzZXNzaW9uQ29uZmlnID0gbmV3IFNlc3Npb25Db25maWd1cmF0aW9uKAorICAgICAgICAgICAgICAgIFNlc3Npb25Db25maWd1cmF0aW9uLlNFU1NJT05fUkVHVUxBUiwgb3V0Q29uZmlncywKKyAgICAgICAgICAgICAgICBuZXcgSGFuZGxlckV4ZWN1dG9yKG1IYW5kbGVyKSwgbVNlc3Npb25Nb2NrTGlzdGVuZXIpOworICAgICAgICBDYXB0dXJlUmVxdWVzdC5CdWlsZGVyIHIgPSBtQ2FtZXJhLmNyZWF0ZUNhcHR1cmVSZXF1ZXN0KENhbWVyYURldmljZS5URU1QTEFURV9QUkVWSUVXKTsKKyAgICAgICAgc2Vzc2lvbkNvbmZpZy5zZXRTZXNzaW9uUGFyYW1ldGVycyhyLmJ1aWxkKCkpOworICAgICAgICBtQ2FtZXJhLmNyZWF0ZUNhcHR1cmVTZXNzaW9uKHNlc3Npb25Db25maWcpOwogCiAgICAgICAgIG1TZXNzaW9uID0gbVNlc3Npb25Nb2NrTGlzdGVuZXIud2FpdEFuZEdldFNlc3Npb24oU0VTU0lPTl9DT05GSUdVUkVfVElNRU9VVF9NUyk7CiAKQEAgLTkxMSw3ICsxMzE5LDcgQEAKIAogICAgICAgICAvLyBVc2Ugb3V0cHV0MQogCi0gICAgICAgIENhcHR1cmVSZXF1ZXN0LkJ1aWxkZXIgciA9IG1DYW1lcmEuY3JlYXRlQ2FwdHVyZVJlcXVlc3QoQ2FtZXJhRGV2aWNlLlRFTVBMQVRFX1BSRVZJRVcpOworICAgICAgICByID0gbUNhbWVyYS5jcmVhdGVDYXB0dXJlUmVxdWVzdChDYW1lcmFEZXZpY2UuVEVNUExBVEVfUFJFVklFVyk7CiAgICAgICAgIHIuYWRkVGFyZ2V0KG91dHB1dDFTdXJmYWNlKTsKIAogICAgICAgICBtU2Vzc2lvbi5jYXB0dXJlKHIuYnVpbGQoKSwgbnVsbCwgbnVsbCk7CkBAIC05MzEsNyArMTMzOSw3IEBACiAKICAgICAgICAgbVNlc3Npb25Nb2NrTGlzdGVuZXIgPSBzcHkobmV3IEJsb2NraW5nU2Vzc2lvbkNhbGxiYWNrKCkpOwogCi0gICAgICAgIG91dHB1dFN1cmZhY2VzID0gbmV3IEFycmF5TGlzdDw+KAorICAgICAgICBBcnJheUxpc3Q8U3VyZmFjZT4gb3V0cHV0U3VyZmFjZXMgPSBuZXcgQXJyYXlMaXN0PFN1cmZhY2U+KAogICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChvdXRwdXQxU3VyZmFjZSwgb3V0cHV0M1N1cmZhY2UpKTsKICAgICAgICAgbUNhbWVyYS5jcmVhdGVDYXB0dXJlU2Vzc2lvbihvdXRwdXRTdXJmYWNlcywgbVNlc3Npb25Nb2NrTGlzdGVuZXIsIG1IYW5kbGVyKTsKIApAQCAtOTk0LDYgKzE0MDIsOSBAQAogICAgICAgICAgICAgLy8gZXhwZWN0ZWQKICAgICAgICAgfQogCisgICAgICAgIG91dHB1dDEucmVsZWFzZSgpOworICAgICAgICBvdXRwdXQyLnJlbGVhc2UoKTsKKyAgICAgICAgb3V0cHV0My5yZWxlYXNlKCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHByZXBhcmVUZXN0Rm9yU2hhcmVkU3VyZmFjZXNCeUNhbWVyYSgpIHRocm93cyBFeGNlcHRpb24gewpAQCAtMTE1MSwxNCArMTU2MiwxMyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgY2xhc3MgSXNDYXB0dXJlUmVzdWx0Tm90RW1wdHkKLSAgICAgICAgICAgIGV4dGVuZHMgQXJndW1lbnRNYXRjaGVyPFRvdGFsQ2FwdHVyZVJlc3VsdD4geworICAgICAgICAgICAgaW1wbGVtZW50cyBBcmd1bWVudE1hdGNoZXI8VG90YWxDYXB0dXJlUmVzdWx0PiB7CiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzT2JqZWN0KE9iamVjdCBvYmopIHsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhUb3RhbENhcHR1cmVSZXN1bHQgcmVzdWx0KSB7CiAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAqIERvIHRoZSBzaW1wbGUgdmVyaWZpY2F0aW9uIGhlcmUuIE9ubHkgdmVyaWZ5IHRoZSB0aW1lc3RhbXAgZm9yIG5vdy4KICAgICAgICAgICAgICAqIFRPRE86IHZlcmlmeSBtb3JlIHJlcXVpcmVkIGNhcHR1cmUgcmVzdWx0IG1ldGFkYXRhIGZpZWxkcy4KICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgVG90YWxDYXB0dXJlUmVzdWx0IHJlc3VsdCA9IChUb3RhbENhcHR1cmVSZXN1bHQpIG9iajsKICAgICAgICAgICAgIExvbmcgdGltZVN0YW1wID0gcmVzdWx0LmdldChDYXB0dXJlUmVzdWx0LlNFTlNPUl9USU1FU1RBTVApOwogICAgICAgICAgICAgaWYgKHRpbWVTdGFtcCAhPSBudWxsICYmIHRpbWVTdGFtcC5sb25nVmFsdWUoKSA+IDBMKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC0xMTc2LDggKzE1ODYsMTEgQEAKICAgICAgKiB7QGxpbmsgQ2FtZXJhQ2FwdHVyZVNlc3Npb24jc2V0UmVwZWF0aW5nUmVxdWVzdH0gZm9yIHJlcGVhdGluZyBjYXB0dXJlLgogICAgICAqIEBwYXJhbSBhYm9ydCBJZiB0aGUgdGVzdCB1c2VzIHtAbGluayBDYW1lcmFDYXB0dXJlU2Vzc2lvbiNhYm9ydENhcHR1cmVzfSB0byBzdG9wIHRoZQogICAgICAqIHJlcGVhdGluZyBjYXB0dXJlLiAgSXQgaGFzIG5vIGVmZmVjdCBpZiByZXBlYXRpbmcgaXMgZmFsc2UuCisgICAgICogQHBhcmFtIHVzZUV4ZWN1dG9yIElmIHRoZSB0ZXN0IHVzZXMge0BsaW5rIGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yfSBpbnN0ZWFkIG9mCisgICAgICoge0BsaW5rIGFuZHJvaWQub3MuSGFuZGxlcn0gZm9yIGNhbGxiYWNrIGludm9jYXRpb24uCiAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJ1bkNhcHR1cmVUZXN0KGJvb2xlYW4gYnVyc3QsIGJvb2xlYW4gcmVwZWF0aW5nLCBib29sZWFuIGFib3J0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwcml2YXRlIHZvaWQgcnVuQ2FwdHVyZVRlc3QoYm9vbGVhbiBidXJzdCwgYm9vbGVhbiByZXBlYXRpbmcsIGJvb2xlYW4gYWJvcnQsCisgICAgICAgICAgICBib29sZWFuIHVzZUV4ZWN1dG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtQ2FtZXJhSWRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIG9wZW5EZXZpY2UobUNhbWVyYUlkc1tpXSwgbUNhbWVyYU1vY2tMaXN0ZW5lcik7CkBAIC0xMTk4LDEyICsxNjExLDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNUZW1wbGF0ZXNbal0gIT0gQ2FtZXJhRGV2aWNlLlRFTVBMQVRFX1BSRVZJRVcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVTaW5nbGVTaG90KG1DYW1lcmFJZHNbaV0sIHNUZW1wbGF0ZXNbal0sIHJlcGVhdGluZywgYWJvcnQpOworCisgICAgICAgICAgICAgICAgICAgICAgICBjYXB0dXJlU2luZ2xlU2hvdChtQ2FtZXJhSWRzW2ldLCBzVGVtcGxhdGVzW2pdLCByZXBlYXRpbmcsIGFib3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VFeGVjdXRvcik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIFRlc3Q6IGJ1cnN0IG9mIG9uZSBzaG90Ci0gICAgICAgICAgICAgICAgICAgIGNhcHR1cmVCdXJzdFNob3QobUNhbWVyYUlkc1tpXSwgc1RlbXBsYXRlcywgMSwgcmVwZWF0aW5nLCBhYm9ydCk7CisgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVCdXJzdFNob3QobUNhbWVyYUlkc1tpXSwgc1RlbXBsYXRlcywgMSwgcmVwZWF0aW5nLCBhYm9ydCwgdXNlRXhlY3V0b3IpOwogCiAgICAgICAgICAgICAgICAgICAgIGludCB0ZW1wbGF0ZSA9IG1TdGF0aWNJbmZvLmlzQ29sb3JPdXRwdXRTdXBwb3J0ZWQoKSA/CiAgICAgICAgICAgICAgICAgICAgICAgICBDYW1lcmFEZXZpY2UuVEVNUExBVEVfU1RJTExfQ0FQVFVSRSA6CkBAIC0xMjE3LDExICsxNjMyLDE0IEBACiAgICAgICAgICAgICAgICAgICAgIH07CiAKICAgICAgICAgICAgICAgICAgICAgLy8gVGVzdDogYnVyc3Qgb2YgNSBzaG90cyBvZiB0aGUgc2FtZSB0ZW1wbGF0ZSB0eXBlCi0gICAgICAgICAgICAgICAgICAgIGNhcHR1cmVCdXJzdFNob3QobUNhbWVyYUlkc1tpXSwgdGVtcGxhdGVzLCB0ZW1wbGF0ZXMubGVuZ3RoLCByZXBlYXRpbmcsIGFib3J0KTsKKyAgICAgICAgICAgICAgICAgICAgY2FwdHVyZUJ1cnN0U2hvdChtQ2FtZXJhSWRzW2ldLCB0ZW1wbGF0ZXMsIHRlbXBsYXRlcy5sZW5ndGgsIHJlcGVhdGluZywgYWJvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlRXhlY3V0b3IpOwogCi0gICAgICAgICAgICAgICAgICAgIC8vIFRlc3Q6IGJ1cnN0IG9mIDUgc2hvdHMgb2YgZGlmZmVyZW50IHRlbXBsYXRlIHR5cGVzCi0gICAgICAgICAgICAgICAgICAgIGNhcHR1cmVCdXJzdFNob3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhbWVyYUlkc1tpXSwgc1RlbXBsYXRlcywgc1RlbXBsYXRlcy5sZW5ndGgsIHJlcGVhdGluZywgYWJvcnQpOworICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXRpY0luZm8uaXNDb2xvck91dHB1dFN1cHBvcnRlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUZXN0OiBidXJzdCBvZiA2IHNob3RzIG9mIGRpZmZlcmVudCB0ZW1wbGF0ZSB0eXBlcworICAgICAgICAgICAgICAgICAgICAgICAgY2FwdHVyZUJ1cnN0U2hvdChtQ2FtZXJhSWRzW2ldLCBzVGVtcGxhdGVzLCBzVGVtcGxhdGVzLmxlbmd0aCwgcmVwZWF0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm9ydCwgdXNlRXhlY3V0b3IpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHZlcmlmeShtQ2FtZXJhTW9ja0xpc3RlbmVyLCBuZXZlcigpKQogICAgICAgICAgICAgICAgICAgICAgICAgLm9uRXJyb3IoCkBAIC0xMjQ0LDExICsxNjYyLDEyIEBACiAgICAgcHJpdmF0ZSB2b2lkIGNhcHR1cmVTaW5nbGVTaG90KAogICAgICAgICAgICAgU3RyaW5nIGlkLAogICAgICAgICAgICAgaW50IHRlbXBsYXRlLAotICAgICAgICAgICAgYm9vbGVhbiByZXBlYXRpbmcsIGJvb2xlYW4gYWJvcnQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgYm9vbGVhbiByZXBlYXRpbmcsIGJvb2xlYW4gYWJvcnQsIGJvb2xlYW4gdXNlRXhlY3V0b3IpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIGFzc2VydEVxdWFscygiQmFkIGluaXRpYWwgc3RhdGUgZm9yIHByZXBhcmluZyB0byBjYXB0dXJlIiwKICAgICAgICAgICAgICAgICBtTGF0ZXN0U2Vzc2lvblN0YXRlLCBTRVNTSU9OX1JFQURZKTsKIAorICAgICAgICBmaW5hbCBFeGVjdXRvciBleGVjdXRvciA9IHVzZUV4ZWN1dG9yID8gbmV3IEhhbmRsZXJFeGVjdXRvcihtSGFuZGxlcikgOiBudWxsOwogICAgICAgICBDYXB0dXJlUmVxdWVzdC5CdWlsZGVyIHJlcXVlc3RCdWlsZGVyID0gbUNhbWVyYS5jcmVhdGVDYXB0dXJlUmVxdWVzdCh0ZW1wbGF0ZSk7CiAgICAgICAgIGFzc2VydE5vdE51bGwoIkZhaWxlZCB0byBjcmVhdGUgY2FwdHVyZSByZXF1ZXN0IiwgcmVxdWVzdEJ1aWxkZXIpOwogICAgICAgICByZXF1ZXN0QnVpbGRlci5hZGRUYXJnZXQobVJlYWRlclN1cmZhY2UpOwpAQCAtMTI2MCw3ICsxNjc5LDExIEBACiAgICAgICAgICAgICAgICAgICAgIGlkLCB0ZW1wbGF0ZSkpOwogICAgICAgICB9CiAKLSAgICAgICAgc3RhcnRDYXB0dXJlKHJlcXVlc3RCdWlsZGVyLmJ1aWxkKCksIHJlcGVhdGluZywgbW9ja0NhcHR1cmVDYWxsYmFjaywgbUhhbmRsZXIpOworICAgICAgICBpZiAoZXhlY3V0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgc3RhcnRDYXB0dXJlKHJlcXVlc3RCdWlsZGVyLmJ1aWxkKCksIHJlcGVhdGluZywgbW9ja0NhcHR1cmVDYWxsYmFjaywgZXhlY3V0b3IpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhcnRDYXB0dXJlKHJlcXVlc3RCdWlsZGVyLmJ1aWxkKCksIHJlcGVhdGluZywgbW9ja0NhcHR1cmVDYWxsYmFjaywgbUhhbmRsZXIpOworICAgICAgICB9CiAgICAgICAgIHdhaXRGb3JTZXNzaW9uU3RhdGUoU0VTU0lPTl9BQ1RJVkUsIFNFU1NJT05fQUNUSVZFX1RJTUVPVVRfTVMpOwogCiAgICAgICAgIGludCBleHBlY3RlZENhcHR1cmVSZXN1bHRDb3VudCA9IHJlcGVhdGluZyA/IFJFUEVBVElOR19DQVBUVVJFX0VYUEVDVEVEX1JFU1VMVF9DT1VOVCA6IDE7CkBAIC0xMjc1LDExICsxNjk4LDE5IEBACiAgICAgICAgICAgICAgICAgLy8gQ2FwdHVyZSBhIHNpbmdsZSBjYXB0dXJlLCBhbmQgdmVyaWZ5IHRoZSByZXN1bHQuCiAgICAgICAgICAgICAgICAgU2ltcGxlQ2FwdHVyZUNhbGxiYWNrIHJlc3VsdENhbGxiYWNrID0gbmV3IFNpbXBsZUNhcHR1cmVDYWxsYmFjaygpOwogICAgICAgICAgICAgICAgIENhcHR1cmVSZXF1ZXN0IHNpbmdsZVJlcXVlc3QgPSByZXF1ZXN0QnVpbGRlci5idWlsZCgpOwotICAgICAgICAgICAgICAgIG1TZXNzaW9uLmNhcHR1cmUoc2luZ2xlUmVxdWVzdCwgcmVzdWx0Q2FsbGJhY2ssIG1IYW5kbGVyKTsKKyAgICAgICAgICAgICAgICBpZiAoZXhlY3V0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbi5jYXB0dXJlU2luZ2xlUmVxdWVzdChzaW5nbGVSZXF1ZXN0LCBleGVjdXRvciwgcmVzdWx0Q2FsbGJhY2spOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uLmNhcHR1cmUoc2luZ2xlUmVxdWVzdCwgcmVzdWx0Q2FsbGJhY2ssIG1IYW5kbGVyKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmVzdWx0Q2FsbGJhY2suZ2V0Q2FwdHVyZVJlc3VsdEZvclJlcXVlc3Qoc2luZ2xlUmVxdWVzdCwgQ0FQVFVSRV9SRVNVTFRfVElNRU9VVF9NUyk7CiAKICAgICAgICAgICAgICAgICAvLyBSZXN1bWUgdGhlIHJlcGVhdGluZywgYW5kIHZlcmlmeSB0aGF0IHJlc3VsdHMgYXJlIHJldHVybmVkLgotICAgICAgICAgICAgICAgIG1TZXNzaW9uLnNldFJlcGVhdGluZ1JlcXVlc3Qoc2luZ2xlUmVxdWVzdCwgcmVzdWx0Q2FsbGJhY2ssIG1IYW5kbGVyKTsKKyAgICAgICAgICAgICAgICBpZiAoZXhlY3V0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbi5zZXRTaW5nbGVSZXBlYXRpbmdSZXF1ZXN0KHNpbmdsZVJlcXVlc3QsIGV4ZWN1dG9yLCByZXN1bHRDYWxsYmFjayk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbVNlc3Npb24uc2V0UmVwZWF0aW5nUmVxdWVzdChzaW5nbGVSZXF1ZXN0LCByZXN1bHRDYWxsYmFjaywgbUhhbmRsZXIpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFJFUEVBVElOR19DQVBUVVJFX0VYUEVDVEVEX1JFU1VMVF9DT1VOVDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgIHJlc3VsdENhbGxiYWNrLmdldENhcHR1cmVSZXN1bHQoQ0FQVFVSRV9SRVNVTFRfVElNRU9VVF9NUyk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTI5NCw3ICsxNzI1LDcgQEAKICAgICAgICAgICAgIGludFtdIHRlbXBsYXRlcywKICAgICAgICAgICAgIGludCBsZW4sCiAgICAgICAgICAgICBib29sZWFuIHJlcGVhdGluZywKLSAgICAgICAgICAgIGJvb2xlYW4gYWJvcnQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgYm9vbGVhbiBhYm9ydCwgYm9vbGVhbiB1c2VFeGVjdXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJCYWQgaW5pdGlhbCBzdGF0ZSBmb3IgcHJlcGFyaW5nIHRvIGNhcHR1cmUiLAogICAgICAgICAgICAgICAgIG1MYXRlc3RTZXNzaW9uU3RhdGUsIFNFU1NJT05fUkVBRFkpOwpAQCAtMTMwMiw2ICsxNzMzLDcgQEAKICAgICAgICAgYXNzZXJ0VHJ1ZSgiSW52YWxpZCBhcmdzIHRvIGNhcHR1cmUgZnVuY3Rpb24iLCBsZW4gPD0gdGVtcGxhdGVzLmxlbmd0aCk7CiAgICAgICAgIExpc3Q8Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3RzID0gbmV3IEFycmF5TGlzdDxDYXB0dXJlUmVxdWVzdD4oKTsKICAgICAgICAgTGlzdDxDYXB0dXJlUmVxdWVzdD4gcG9zdEFib3J0UmVxdWVzdHMgPSBuZXcgQXJyYXlMaXN0PENhcHR1cmVSZXF1ZXN0PigpOworICAgICAgICBmaW5hbCBFeGVjdXRvciBleGVjdXRvciA9IHVzZUV4ZWN1dG9yID8gbmV3IEhhbmRsZXJFeGVjdXRvcihtSGFuZGxlcikgOiBudWxsOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgICAvLyBTa2lwIHZpZGVvIHNuYXBzaG90cyBmb3IgTEVHQUNZIG1vZGUKICAgICAgICAgICAgIGlmIChtU3RhdGljSW5mby5pc0hhcmR3YXJlTGV2ZWxMZWdhY3koKSAmJgpAQCAtMTMxMyw2ICsxNzQ1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVzW2ldICE9IENhbWVyYURldmljZS5URU1QTEFURV9QUkVWSUVXKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CisKICAgICAgICAgICAgIENhcHR1cmVSZXF1ZXN0LkJ1aWxkZXIgcmVxdWVzdEJ1aWxkZXIgPSBtQ2FtZXJhLmNyZWF0ZUNhcHR1cmVSZXF1ZXN0KHRlbXBsYXRlc1tpXSk7CiAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJGYWlsZWQgdG8gY3JlYXRlIGNhcHR1cmUgcmVxdWVzdCIsIHJlcXVlc3RCdWlsZGVyKTsKICAgICAgICAgICAgIHJlcXVlc3RCdWlsZGVyLmFkZFRhcmdldChtUmVhZGVyU3VyZmFjZSk7CkBAIC0xMzI5LDEwICsxNzYyLDE4IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoIXJlcGVhdGluZykgewotICAgICAgICAgICAgbVNlc3Npb24uY2FwdHVyZUJ1cnN0KHJlcXVlc3RzLCBtb2NrQ2FwdHVyZUNhbGxiYWNrLCBtSGFuZGxlcik7CisgICAgICAgICAgICBpZiAoZXhlY3V0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1TZXNzaW9uLmNhcHR1cmVCdXJzdFJlcXVlc3RzKHJlcXVlc3RzLCBleGVjdXRvciwgbW9ja0NhcHR1cmVDYWxsYmFjayk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1TZXNzaW9uLmNhcHR1cmVCdXJzdChyZXF1ZXN0cywgbW9ja0NhcHR1cmVDYWxsYmFjaywgbUhhbmRsZXIpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgbVNlc3Npb24uc2V0UmVwZWF0aW5nQnVyc3QocmVxdWVzdHMsIG1vY2tDYXB0dXJlQ2FsbGJhY2ssIG1IYW5kbGVyKTsKKyAgICAgICAgICAgIGlmIChleGVjdXRvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVNlc3Npb24uc2V0UmVwZWF0aW5nQnVyc3RSZXF1ZXN0cyhyZXF1ZXN0cywgZXhlY3V0b3IsIG1vY2tDYXB0dXJlQ2FsbGJhY2spOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtU2Vzc2lvbi5zZXRSZXBlYXRpbmdCdXJzdChyZXF1ZXN0cywgbW9ja0NhcHR1cmVDYWxsYmFjaywgbUhhbmRsZXIpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHdhaXRGb3JTZXNzaW9uU3RhdGUoU0VTU0lPTl9BQ1RJVkUsIFNFU1NJT05fUkVBRFlfVElNRU9VVF9NUyk7CiAKQEAgLTEzNTEsNyArMTc5MiwxMSBAQAogCiAgICAgICAgICAgICAgICAgLy8gQ2FwdHVyZSBhIGJ1cnN0IG9mIGNhcHR1cmVzLCBhbmQgdmVyaWZ5IHRoZSByZXN1bHRzLgogICAgICAgICAgICAgICAgIFNpbXBsZUNhcHR1cmVDYWxsYmFjayByZXN1bHRDYWxsYmFjayA9IG5ldyBTaW1wbGVDYXB0dXJlQ2FsbGJhY2soKTsKLSAgICAgICAgICAgICAgICBtU2Vzc2lvbi5jYXB0dXJlQnVyc3QocG9zdEFib3J0UmVxdWVzdHMsIHJlc3VsdENhbGxiYWNrLCBtSGFuZGxlcik7CisgICAgICAgICAgICAgICAgaWYgKGV4ZWN1dG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbVNlc3Npb24uY2FwdHVyZUJ1cnN0UmVxdWVzdHMocG9zdEFib3J0UmVxdWVzdHMsIGV4ZWN1dG9yLCByZXN1bHRDYWxsYmFjayk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbVNlc3Npb24uY2FwdHVyZUJ1cnN0KHBvc3RBYm9ydFJlcXVlc3RzLCByZXN1bHRDYWxsYmFjaywgbUhhbmRsZXIpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgcmVzdWx0cyBhcmUgcmV0dXJuZWQuCiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwb3N0QWJvcnRSZXF1ZXN0cy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgICAgICAgICByZXN1bHRDYWxsYmFjay5nZXRDYXB0dXJlUmVzdWx0Rm9yUmVxdWVzdCgKQEAgLTEzNTksNyArMTgwNCwxMSBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIC8vIFJlc3VtZSB0aGUgcmVwZWF0aW5nLCBhbmQgdmVyaWZ5IHRoYXQgcmVzdWx0cyBhcmUgcmV0dXJuZWQuCi0gICAgICAgICAgICAgICAgbVNlc3Npb24uc2V0UmVwZWF0aW5nQnVyc3QocmVxdWVzdHMsIHJlc3VsdENhbGxiYWNrLCBtSGFuZGxlcik7CisgICAgICAgICAgICAgICAgaWYgKGV4ZWN1dG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbVNlc3Npb24uc2V0UmVwZWF0aW5nQnVyc3RSZXF1ZXN0cyhyZXF1ZXN0cywgZXhlY3V0b3IsIHJlc3VsdENhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbi5zZXRSZXBlYXRpbmdCdXJzdChyZXF1ZXN0cywgcmVzdWx0Q2FsbGJhY2ssIG1IYW5kbGVyKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBSRVBFQVRJTkdfQ0FQVFVSRV9FWFBFQ1RFRF9SRVNVTFRfQ09VTlQ7IGkrKykgewogICAgICAgICAgICAgICAgICAgICByZXN1bHRDYWxsYmFjay5nZXRDYXB0dXJlUmVzdWx0KENBUFRVUkVfUkVTVUxUX1RJTUVPVVRfTVMpOwogICAgICAgICAgICAgICAgIH0KQEAgLTEzOTUsNiArMTg0NCw5IEBACiAgICAgICAgIGlmICghbVN0YXRpY0luZm8uaXNDb2xvck91dHB1dFN1cHBvcnRlZCgpKSB7CiAgICAgICAgICAgICBjcmVhdGVEZWZhdWx0SW1hZ2VSZWFkZXIoZ2V0TWF4RGVwdGhTaXplKG1DYW1lcmEuZ2V0SWQoKSwgbUNhbWVyYU1hbmFnZXIpLAogICAgICAgICAgICAgICAgICAgICBJbWFnZUZvcm1hdC5ERVBUSDE2LCBNQVhfTlVNX0lNQUdFUywgbmV3IEltYWdlRHJvcHBlckxpc3RlbmVyKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY3JlYXRlRGVmYXVsdEltYWdlUmVhZGVyKERFRkFVTFRfQ0FQVFVSRV9TSVpFLCBJbWFnZUZvcm1hdC5ZVVZfNDIwXzg4OCwgTUFYX05VTV9JTUFHRVMsCisgICAgICAgICAgICAgICAgICAgIG5ldyBJbWFnZURyb3BwZXJMaXN0ZW5lcigpKTsKICAgICAgICAgfQogCiAgICAgICAgIExpc3Q8U3VyZmFjZT4gb3V0cHV0U3VyZmFjZXMgPSBuZXcgQXJyYXlMaXN0PD4oQXJyYXlzLmFzTGlzdChtUmVhZGVyU3VyZmFjZSkpOwpAQCAtMTU4MSwxMSArMjAzMyw5IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIGNoZWNrUmVxdWVzdEZvclRlbXBsYXRlKENhcHR1cmVSZXF1ZXN0LkJ1aWxkZXIgcmVxdWVzdCwgaW50IHRlbXBsYXRlLAogICAgICAgICAgICAgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzIHByb3BzKSB7Ci0gICAgICAgIC8vIDNBIHNldHRpbmdzLS1jb250cm9sLm1vZGUuCi0gICAgICAgIGlmICh0ZW1wbGF0ZSAhPSBDYW1lcmFEZXZpY2UuVEVNUExBVEVfTUFOVUFMKSB7Ci0gICAgICAgICAgICBtQ29sbGVjdG9yLmV4cGVjdEtleVZhbHVlRXF1YWxzKHJlcXVlc3QsIENPTlRST0xfTU9ERSwKLSAgICAgICAgICAgICAgICAgICAgQ2FwdHVyZVJlcXVlc3QuQ09OVFJPTF9NT0RFX0FVVE8pOwotICAgICAgICB9CisgICAgICAgIEludGVnZXIgaHdMZXZlbCA9IHByb3BzLmdldChDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuSU5GT19TVVBQT1JURURfSEFSRFdBUkVfTEVWRUwpOworICAgICAgICBib29sZWFuIGlzRXh0ZXJuYWxDYW1lcmEgPSAoaHdMZXZlbCA9PQorICAgICAgICAgICAgICAgIENhbWVyYUNoYXJhY3RlcmlzdGljcy5JTkZPX1NVUFBPUlRFRF9IQVJEV0FSRV9MRVZFTF9FWFRFUk5BTCk7CiAKICAgICAgICAgLy8gM0Egc2V0dGluZ3MtLUFFL0FXQi9BRi4KICAgICAgICAgSW50ZWdlciBtYXhSZWdpb25zQWVWYWwgPSBwcm9wcy5nZXQoQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLkNPTlRST0xfTUFYX1JFR0lPTlNfQUUpOwpAQCAtMTYwNyw2ICsyMDU3LDggQEAKICAgICAgICAgICAgIG1Db2xsZWN0b3IuZXhwZWN0S2V5VmFsdWVFcXVhbHMocmVxdWVzdCwgQ09OVFJPTF9BV0JfTU9ERSwKICAgICAgICAgICAgICAgICAgICAgQ2FwdHVyZVJlcXVlc3QuQ09OVFJPTF9BV0JfTU9ERV9PRkYpOwogICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUNvbGxlY3Rvci5leHBlY3RLZXlWYWx1ZUVxdWFscyhyZXF1ZXN0LCBDT05UUk9MX01PREUsCisgICAgICAgICAgICAgICAgICAgIENhcHR1cmVSZXF1ZXN0LkNPTlRST0xfTU9ERV9BVVRPKTsKICAgICAgICAgICAgIGlmIChtU3RhdGljSW5mby5pc0NvbG9yT3V0cHV0U3VwcG9ydGVkKCkpIHsKICAgICAgICAgICAgICAgICBtQ29sbGVjdG9yLmV4cGVjdEtleVZhbHVlRXF1YWxzKHJlcXVlc3QsIENPTlRST0xfQUVfTU9ERSwKICAgICAgICAgICAgICAgICAgICAgICAgIENhcHR1cmVSZXF1ZXN0LkNPTlRST0xfQUVfTU9ERV9PTik7CkBAIC0xNjc5LDEyICsyMTMxLDE2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBmbG9hdFtdIGF2YWlsYWJsZUZvY2FsTGVuID0KLSAgICAgICAgICAgICAgICBwcm9wcy5nZXQoQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLkxFTlNfSU5GT19BVkFJTEFCTEVfRk9DQUxfTEVOR1RIUyk7Ci0gICAgICAgIGlmIChhdmFpbGFibGVGb2NhbExlbi5sZW5ndGggPiAxKSB7Ci0gICAgICAgICAgICBtQ29sbGVjdG9yLmV4cGVjdEtleVZhbHVlTm90TnVsbChyZXF1ZXN0LCBMRU5TX0ZPQ0FMX0xFTkdUSCk7CisKKyAgICAgICAgaWYgKCFpc0V4dGVybmFsQ2FtZXJhKSB7CisgICAgICAgICAgICBmbG9hdFtdIGF2YWlsYWJsZUZvY2FsTGVuID0KKyAgICAgICAgICAgICAgICAgICAgcHJvcHMuZ2V0KENhbWVyYUNoYXJhY3RlcmlzdGljcy5MRU5TX0lORk9fQVZBSUxBQkxFX0ZPQ0FMX0xFTkdUSFMpOworICAgICAgICAgICAgaWYgKGF2YWlsYWJsZUZvY2FsTGVuLmxlbmd0aCA+IDEpIHsKKyAgICAgICAgICAgICAgICBtQ29sbGVjdG9yLmV4cGVjdEtleVZhbHVlTm90TnVsbChyZXF1ZXN0LCBMRU5TX0ZPQ0FMX0xFTkdUSCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorCiAgICAgICAgIG1Db2xsZWN0b3IuZXhwZWN0RXF1YWxzKCJMZW5zIG9wdGljYWwgc3RhYmlsaXphdGlvbiBtdXN0IGJlIHByZXNlbnQgaW4gcmVxdWVzdCBpZiAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICJhdmFpbGFibGUgb3B0aWNhbCBzdGFiaWxpemF0aW9ucyBhcmUgcHJlc2VudCBpbiBtZXRhZGF0YSwgYW5kIHZpY2UtdmVyc2EuIiwKICAgICAgICAgICAgICAgICBtU3RhdGljSW5mby5hcmVLZXlzQXZhaWxhYmxlKENhbWVyYUNoYXJhY3RlcmlzdGljcy4KQEAgLTE2OTksNiArMjE1NSwxMSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgaWYgKG1TdGF0aWNJbmZvLmFyZUtleXNBdmFpbGFibGUoU0VOU09SX1RFU1RfUEFUVEVSTl9NT0RFKSkgeworICAgICAgICAgICAgbUNvbGxlY3Rvci5leHBlY3RLZXlWYWx1ZUVxdWFscyhyZXF1ZXN0LCBTRU5TT1JfVEVTVF9QQVRURVJOX01PREUsCisgICAgICAgICAgICAgICAgICAgIENhcHR1cmVSZXF1ZXN0LlNFTlNPUl9URVNUX1BBVFRFUk5fTU9ERV9PRkYpOworICAgICAgICB9CisKICAgICAgICAgaWYgKG1TdGF0aWNJbmZvLmFyZUtleXNBdmFpbGFibGUoQkxBQ0tfTEVWRUxfTE9DSykpIHsKICAgICAgICAgICAgIG1Db2xsZWN0b3IuZXhwZWN0S2V5VmFsdWVFcXVhbHMocmVxdWVzdCwgQkxBQ0tfTEVWRUxfTE9DSywgZmFsc2UpOwogICAgICAgICB9CkBAIC0xNzM3LDkgKzIxOTgsMTAgQEAKICAgICAgICAgICAgICAgICBhdmFpbGFibGVDYXBzLmNvbnRhaW5zKFJFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19ZVVZfUkVQUk9DRVNTSU5HKSB8fAogICAgICAgICAgICAgICAgIGF2YWlsYWJsZUNhcHMuY29udGFpbnMoUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1BSSVZBVEVfUkVQUk9DRVNTSU5HKTsKIAorCiAgICAgICAgIGlmICh0ZW1wbGF0ZSA9PSBDYW1lcmFEZXZpY2UuVEVNUExBVEVfU1RJTExfQ0FQVFVSRSkgewotICAgICAgICAgICAgLy8gTm90IGVuZm9yY2UgaGlnaCBxdWFsaXR5IGhlcmUsIGFzIHNvbWUgZGV2aWNlcyBtYXkgbm90IGVmZmVjdGl2ZWx5IGhhdmUgaGlnaCBxdWFsaXR5Ci0gICAgICAgICAgICAvLyBtb2RlLgorCisgICAgICAgICAgICAvLyBPayB3aXRoIGVpdGhlciBGQVNUIG9yIEhJR0hfUVVBTElUWQogICAgICAgICAgICAgaWYgKG1TdGF0aWNJbmZvLmFyZUtleXNBdmFpbGFibGUoQ09MT1JfQ09SUkVDVElPTl9NT0RFKSkgewogICAgICAgICAgICAgICAgIG1Db2xsZWN0b3IuZXhwZWN0S2V5VmFsdWVOb3RFcXVhbHMoCiAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LCBDT0xPUl9DT1JSRUNUSU9OX01PREUsCkBAIC0xNzY0LDYgKzIyMjYsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXB0dXJlUmVxdWVzdC5FREdFX01PREVfT0ZGKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVN0YXRpY0luZm8uYXJlS2V5c0F2YWlsYWJsZShTSEFESU5HX01PREUpKSB7CisgICAgICAgICAgICAgICAgTGlzdDxJbnRlZ2VyPiBhdmFpbGFibGVTaGFkaW5nTW9kZXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCh0b09iamVjdChtU3RhdGljSW5mby5nZXRBdmFpbGFibGVTaGFkaW5nTW9kZXNDaGVja2VkKCkpKTsKKyAgICAgICAgICAgICAgICBtQ29sbGVjdG9yLmV4cGVjdEtleVZhbHVlRXF1YWxzKHJlcXVlc3QsIFNIQURJTkdfTU9ERSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENhcHR1cmVSZXF1ZXN0LlNIQURJTkdfTU9ERV9ISUdIX1FVQUxJVFkpOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBtQ29sbGVjdG9yLmV4cGVjdEVxdWFscygiTm9pc2UgcmVkdWN0aW9uIG1vZGUgbXVzdCBiZSBwcmVzZW50IGluIHJlcXVlc3QgaWYgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF2YWlsYWJsZSBub2lzZSByZWR1Y3Rpb25zIGFyZSBwcmVzZW50IGluIG1ldGFkYXRhLCBhbmQgdmljZS12ZXJzYS4iLApAQCAtMTc4Niw2ICsyMjU0LDI3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBtQ29sbGVjdG9yLmV4cGVjdEVxdWFscygiSG90IHBpeGVsIG1vZGUgbXVzdCBiZSBwcmVzZW50IGluIHJlcXVlc3QgaWYgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF2YWlsYWJsZSBob3QgcGl4ZWwgbW9kZXMgYXJlIHByZXNlbnQgaW4gbWV0YWRhdGEsIGFuZCB2aWNlLXZlcnNhLiIsCisgICAgICAgICAgICAgICAgICAgIG1TdGF0aWNJbmZvLmFyZUtleXNBdmFpbGFibGUoQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhPVF9QSVhFTF9BVkFJTEFCTEVfSE9UX1BJWEVMX01PREVTKSwKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRpY0luZm8uYXJlS2V5c0F2YWlsYWJsZShDYXB0dXJlUmVxdWVzdC5IT1RfUElYRUxfTU9ERSkpOworCisgICAgICAgICAgICBpZiAobVN0YXRpY0luZm8uYXJlS2V5c0F2YWlsYWJsZShIT1RfUElYRUxfTU9ERSkpIHsKKyAgICAgICAgICAgICAgICBMaXN0PEludGVnZXI+IGF2YWlsYWJsZUhvdFBpeGVsTW9kZXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCh0b09iamVjdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRpY0luZm8uZ2V0QXZhaWxhYmxlSG90UGl4ZWxNb2Rlc0NoZWNrZWQoKSkpOworICAgICAgICAgICAgICAgIGlmIChhdmFpbGFibGVIb3RQaXhlbE1vZGVzCisgICAgICAgICAgICAgICAgICAgICAgICAuY29udGFpbnMoQ2FwdHVyZVJlcXVlc3QuSE9UX1BJWEVMX01PREVfSElHSF9RVUFMSVRZKSkgeworICAgICAgICAgICAgICAgICAgICBtQ29sbGVjdG9yLmV4cGVjdEtleVZhbHVlRXF1YWxzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QsIEhPVF9QSVhFTF9NT0RFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcHR1cmVSZXF1ZXN0LkhPVF9QSVhFTF9NT0RFX0hJR0hfUVVBTElUWSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbUNvbGxlY3Rvci5leHBlY3RLZXlWYWx1ZUVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LCBIT1RfUElYRUxfTU9ERSwgQ2FwdHVyZVJlcXVlc3QuSE9UX1BJWEVMX01PREVfT0ZGKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGJvb2xlYW4gc3VwcG9ydEF2YWlsYWJsZUFiZXJyYXRpb25Nb2RlcyA9IG1TdGF0aWNJbmZvLmFyZUtleXNBdmFpbGFibGUoCiAgICAgICAgICAgICAgICAgICAgIENhbWVyYUNoYXJhY3RlcmlzdGljcy5DT0xPUl9DT1JSRUNUSU9OX0FWQUlMQUJMRV9BQkVSUkFUSU9OX01PREVTKTsKICAgICAgICAgICAgIGJvb2xlYW4gc3VwcG9ydEFiZXJyYXRpb25SZXF1ZXN0S2V5ID0gbVN0YXRpY0luZm8uYXJlS2V5c0F2YWlsYWJsZSgKQEAgLTE4MTQsNyArMjMwMywxNSBAQAogICAgICAgICAgICAgbUNvbGxlY3Rvci5leHBlY3RLZXlWYWx1ZUVxdWFscyhyZXF1ZXN0LCBOT0lTRV9SRURVQ1RJT05fTU9ERSwKICAgICAgICAgICAgICAgICAgICAgQ2FwdHVyZVJlcXVlc3QuTk9JU0VfUkVEVUNUSU9OX01PREVfWkVST19TSFVUVEVSX0xBRyk7CiAgICAgICAgIH0gZWxzZSBpZiAodGVtcGxhdGUgPT0gQ2FtZXJhRGV2aWNlLlRFTVBMQVRFX1BSRVZJRVcgfHwKLSAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9PSBDYW1lcmFEZXZpY2UuVEVNUExBVEVfUkVDT1JEKXsKKyAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9PSBDYW1lcmFEZXZpY2UuVEVNUExBVEVfUkVDT1JEKSB7CisKKyAgICAgICAgICAgIC8vIE9rIHdpdGggZWl0aGVyIEZBU1Qgb3IgSElHSF9RVUFMSVRZCisgICAgICAgICAgICBpZiAobVN0YXRpY0luZm8uYXJlS2V5c0F2YWlsYWJsZShDT0xPUl9DT1JSRUNUSU9OX01PREUpKSB7CisgICAgICAgICAgICAgICAgbUNvbGxlY3Rvci5leHBlY3RLZXlWYWx1ZU5vdEVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QsIENPTE9SX0NPUlJFQ1RJT05fTU9ERSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENhcHR1cmVSZXF1ZXN0LkNPTE9SX0NPUlJFQ1RJT05fTU9ERV9UUkFOU0ZPUk1fTUFUUklYKTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKG1TdGF0aWNJbmZvLmFyZUtleXNBdmFpbGFibGUoRURHRV9NT0RFKSkgewogICAgICAgICAgICAgICAgIExpc3Q8SW50ZWdlcj4gYXZhaWxhYmxlRWRnZU1vZGVzID0KICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QodG9PYmplY3QobVN0YXRpY0luZm8uZ2V0QXZhaWxhYmxlRWRnZU1vZGVzQ2hlY2tlZCgpKSk7CkBAIC0xODI3LDYgKzIzMjQsMTMgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGlmIChtU3RhdGljSW5mby5hcmVLZXlzQXZhaWxhYmxlKFNIQURJTkdfTU9ERSkpIHsKKyAgICAgICAgICAgICAgICBMaXN0PEludGVnZXI+IGF2YWlsYWJsZVNoYWRpbmdNb2RlcyA9CisgICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KHRvT2JqZWN0KG1TdGF0aWNJbmZvLmdldEF2YWlsYWJsZVNoYWRpbmdNb2Rlc0NoZWNrZWQoKSkpOworICAgICAgICAgICAgICAgIG1Db2xsZWN0b3IuZXhwZWN0S2V5VmFsdWVFcXVhbHMocmVxdWVzdCwgU0hBRElOR19NT0RFLAorICAgICAgICAgICAgICAgICAgICAgICAgQ2FwdHVyZVJlcXVlc3QuU0hBRElOR19NT0RFX0ZBU1QpOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAobVN0YXRpY0luZm8uYXJlS2V5c0F2YWlsYWJsZShOT0lTRV9SRURVQ1RJT05fTU9ERSkpIHsKICAgICAgICAgICAgICAgICBMaXN0PEludGVnZXI+IGF2YWlsYWJsZU5vaXNlUmVkdWN0aW9uTW9kZXMgPQogICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCh0b09iamVjdCgKQEAgLTE4NDIsNiArMjM0NiwyMSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgaWYgKG1TdGF0aWNJbmZvLmFyZUtleXNBdmFpbGFibGUoSE9UX1BJWEVMX01PREUpKSB7CisgICAgICAgICAgICAgICAgTGlzdDxJbnRlZ2VyPiBhdmFpbGFibGVIb3RQaXhlbE1vZGVzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QodG9PYmplY3QoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0aWNJbmZvLmdldEF2YWlsYWJsZUhvdFBpeGVsTW9kZXNDaGVja2VkKCkpKTsKKyAgICAgICAgICAgICAgICBpZiAoYXZhaWxhYmxlSG90UGl4ZWxNb2RlcworICAgICAgICAgICAgICAgICAgICAgICAgLmNvbnRhaW5zKENhcHR1cmVSZXF1ZXN0LkhPVF9QSVhFTF9NT0RFX0ZBU1QpKSB7CisgICAgICAgICAgICAgICAgICAgIG1Db2xsZWN0b3IuZXhwZWN0S2V5VmFsdWVFcXVhbHMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCwgSE9UX1BJWEVMX01PREUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FwdHVyZVJlcXVlc3QuSE9UX1BJWEVMX01PREVfRkFTVCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbUNvbGxlY3Rvci5leHBlY3RLZXlWYWx1ZUVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LCBIT1RfUElYRUxfTU9ERSwgQ2FwdHVyZVJlcXVlc3QuSE9UX1BJWEVMX01PREVfT0ZGKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChtU3RhdGljSW5mby5hcmVLZXlzQXZhaWxhYmxlKENPTE9SX0NPUlJFQ1RJT05fQUJFUlJBVElPTl9NT0RFKSkgewogICAgICAgICAgICAgICAgIExpc3Q8SW50ZWdlcj4gYXZhaWxhYmxlQWJlcnJhdGlvbk1vZGVzID0gQXJyYXlzLmFzTGlzdCgKICAgICAgICAgICAgICAgICAgICAgICAgIHRvT2JqZWN0KG1TdGF0aWNJbmZvLmdldEF2YWlsYWJsZUNvbG9yQWJlcnJhdGlvbk1vZGVzQ2hlY2tlZCgpKSk7CkBAIC0xOTA3LDcgKzI0MjYsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIENhcHR1cmVSZXF1ZXN0LlRPTkVNQVBfTU9ERV9QUkVTRVRfQ1VSVkUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG1TdGF0aWNJbmZvLmFyZUtleXNBdmFpbGFibGUoU1RBVElTVElDU19MRU5TX1NIQURJTkdfTUFQX01PREUpKSB7Ci0gICAgICAgICAgICAgICAgbUNvbGxlY3Rvci5leHBlY3RLZXlWYWx1ZU5vdE51bGwocmVxdWVzdCwgU1RBVElTVElDU19MRU5TX1NIQURJTkdfTUFQX01PREUpOworICAgICAgICAgICAgICAgIG1Db2xsZWN0b3IuZXhwZWN0S2V5VmFsdWVFcXVhbHMocmVxdWVzdCwgU1RBVElTVElDU19MRU5TX1NIQURJTkdfTUFQX01PREUsCisgICAgICAgICAgICAgICAgICAgICAgICBDYXB0dXJlUmVxdWVzdC5TVEFUSVNUSUNTX0xFTlNfU0hBRElOR19NQVBfTU9ERV9PRkYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1TdGF0aWNJbmZvLmFyZUtleXNBdmFpbGFibGUoU1RBVElTVElDU19IT1RfUElYRUxfTUFQX01PREUpKSB7CisgICAgICAgICAgICAgICAgbUNvbGxlY3Rvci5leHBlY3RLZXlWYWx1ZUVxdWFscyhyZXF1ZXN0LCBTVEFUSVNUSUNTX0hPVF9QSVhFTF9NQVBfTU9ERSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0xOTM0LDcgKzI0NTgsNDAgQEAKICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9QT1NUX1JBV19TRU5TSVRJVklUWV9CT09TVCk7CiAgICAgICAgIH0KIAotICAgICAgICBtQ29sbGVjdG9yLmV4cGVjdEtleVZhbHVlRXF1YWxzKHJlcXVlc3QsIENPTlRST0xfQ0FQVFVSRV9JTlRFTlQsIHRlbXBsYXRlKTsKKyAgICAgICAgc3dpdGNoKHRlbXBsYXRlKSB7CisgICAgICAgICAgICBjYXNlIENhbWVyYURldmljZS5URU1QTEFURV9QUkVWSUVXOgorICAgICAgICAgICAgICAgIG1Db2xsZWN0b3IuZXhwZWN0S2V5VmFsdWVFcXVhbHMocmVxdWVzdCwgQ09OVFJPTF9DQVBUVVJFX0lOVEVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENhbWVyYUNoYXJhY3RlcmlzdGljcy5DT05UUk9MX0NBUFRVUkVfSU5URU5UX1BSRVZJRVcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDYW1lcmFEZXZpY2UuVEVNUExBVEVfU1RJTExfQ0FQVFVSRToKKyAgICAgICAgICAgICAgICBtQ29sbGVjdG9yLmV4cGVjdEtleVZhbHVlRXF1YWxzKHJlcXVlc3QsIENPTlRST0xfQ0FQVFVSRV9JTlRFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuQ09OVFJPTF9DQVBUVVJFX0lOVEVOVF9TVElMTF9DQVBUVVJFKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ2FtZXJhRGV2aWNlLlRFTVBMQVRFX1JFQ09SRDoKKyAgICAgICAgICAgICAgICBtQ29sbGVjdG9yLmV4cGVjdEtleVZhbHVlRXF1YWxzKHJlcXVlc3QsIENPTlRST0xfQ0FQVFVSRV9JTlRFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuQ09OVFJPTF9DQVBUVVJFX0lOVEVOVF9WSURFT19SRUNPUkQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDYW1lcmFEZXZpY2UuVEVNUExBVEVfVklERU9fU05BUFNIT1Q6CisgICAgICAgICAgICAgICAgbUNvbGxlY3Rvci5leHBlY3RLZXlWYWx1ZUVxdWFscyhyZXF1ZXN0LCBDT05UUk9MX0NBUFRVUkVfSU5URU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLkNPTlRST0xfQ0FQVFVSRV9JTlRFTlRfVklERU9fU05BUFNIT1QpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDYW1lcmFEZXZpY2UuVEVNUExBVEVfWkVST19TSFVUVEVSX0xBRzoKKyAgICAgICAgICAgICAgICBtQ29sbGVjdG9yLmV4cGVjdEtleVZhbHVlRXF1YWxzKHJlcXVlc3QsIENPTlRST0xfQ0FQVFVSRV9JTlRFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuQ09OVFJPTF9DQVBUVVJFX0lOVEVOVF9aRVJPX1NIVVRURVJfTEFHKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ2FtZXJhRGV2aWNlLlRFTVBMQVRFX01BTlVBTDoKKyAgICAgICAgICAgICAgICBtQ29sbGVjdG9yLmV4cGVjdEtleVZhbHVlRXF1YWxzKHJlcXVlc3QsIENPTlRST0xfQ0FQVFVSRV9JTlRFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuQ09OVFJPTF9DQVBUVVJFX0lOVEVOVF9NQU5VQUwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAvLyBTa2lwIHVua25vd24gdGVtcGxhdGVzIGhlcmUKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIGRpc3RvcnRpb24gY29ycmVjdGlvbiBtb2RlCisgICAgICAgIGlmIChtU3RhdGljSW5mby5pc0Rpc3RvcnRpb25Db3JyZWN0aW9uU3VwcG9ydGVkKCkpIHsKKyAgICAgICAgICAgIG1Db2xsZWN0b3IuZXhwZWN0S2V5VmFsdWVOb3RFcXVhbHMocmVxdWVzdCwgRElTVE9SVElPTl9DT1JSRUNUSU9OX01PREUsCisgICAgICAgICAgICAgICAgICAgIENhcHR1cmVSZXF1ZXN0LkRJU1RPUlRJT05fQ09SUkVDVElPTl9NT0RFX09GRik7CisgICAgICAgIH0KIAogICAgICAgICAvLyBUT0RPOiB1c2UgdGhlIGxpc3Qgb2Yga2V5cyBmcm9tIENhbWVyYUNoYXJhY3RlcmlzdGljcyB0byBhdm9pZCBleHBlY3RpbmcKICAgICAgICAgLy8gICAgICAga2V5cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSBieSB0aGlzIENhbWVyYURldmljZS4KQEAgLTIwMDgsNiArMjU2NSwyNiBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFN0YXJ0IGNhcHR1cmUgd2l0aCBnaXZlbiB7QGxpbmsgI0NhcHR1cmVSZXF1ZXN0fS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSB7QGxpbmsgI0NhcHR1cmVSZXF1ZXN0fSB0byBiZSBjYXB0dXJlZC4KKyAgICAgKiBAcGFyYW0gcmVwZWF0aW5nIElmIHRoZSBjYXB0dXJlIGlzIHNpbmdsZSBjYXB0dXJlIG9yIHJlcGVhdGluZy4KKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIHtAbGluayAjQ2FwdHVyZUNhbGxiYWNrfSBjYW1lcmEgZGV2aWNlIHVzZWQgdG8gbm90aWZ5IGNhbGxiYWNrcy4KKyAgICAgKiBAcGFyYW0gZXhlY3V0b3IgVGhlIGV4ZWN1dG9yIHVzZWQgdG8gaW52b2tlIGNhbGxiYWNrcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzdGFydENhcHR1cmUoQ2FwdHVyZVJlcXVlc3QgcmVxdWVzdCwgYm9vbGVhbiByZXBlYXRpbmcsCisgICAgICAgICAgICBDYW1lcmFDYXB0dXJlU2Vzc2lvbi5DYXB0dXJlQ2FsbGJhY2sgbGlzdGVuZXIsIEV4ZWN1dG9yIGV4ZWN1dG9yKQorICAgICAgICAgICAgICAgICAgICB0aHJvd3MgQ2FtZXJhQWNjZXNzRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKFZFUkJPU0UpIExvZy52KFRBRywgIlN0YXJ0aW5nIGNhcHR1cmUgZnJvbSBzZXNzaW9uIik7CisKKyAgICAgICAgaWYgKHJlcGVhdGluZykgeworICAgICAgICAgICAgbVNlc3Npb24uc2V0U2luZ2xlUmVwZWF0aW5nUmVxdWVzdChyZXF1ZXN0LCBleGVjdXRvciwgbGlzdGVuZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVNlc3Npb24uY2FwdHVyZVNpbmdsZVJlcXVlc3QocmVxdWVzdCwgZXhlY3V0b3IsIGxpc3RlbmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgogICAgICAqIENsb3NlIGEge0BsaW5rICNDYW1lcmFDYXB0dXJlU2Vzc2lvbiBjYXB0dXJlIHNlc3Npb259OyBibG9ja2luZyB1bnRpbAogICAgICAqIHRoZSBjbG9zZSBmaW5pc2hlcyB3aXRoIGEgdHJhbnNpdGlvbiB0byB7QGxpbmsgQ2FtZXJhQ2FwdHVyZVNlc3Npb24uU3RhdGVDYWxsYmFjayNvbkNsb3NlZH0uCiAgICAgICovCmRpZmYgLS1naXQgYS90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9jdHMvQ2FtZXJhTWFuYWdlclRlc3QuamF2YSBiL3Rlc3RzL2NhbWVyYS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL2N0cy9DYW1lcmFNYW5hZ2VyVGVzdC5qYXZhCmluZGV4IDExMDcxZmMuLmRkNzE5N2MgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2NhbWVyYS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL2N0cy9DYW1lcmFNYW5hZ2VyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL2NhbWVyYS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL2N0cy9DYW1lcmFNYW5hZ2VyVGVzdC5qYXZhCkBAIC0yNywxMCArMjcsMTIgQEAKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FtZXJhRGV2aWNlOwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYW1lcmFEZXZpY2UuU3RhdGVDYWxsYmFjazsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FtZXJhTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuY3RzLkNhbWVyYVRlc3RVdGlscy5IYW5kbGVyRXhlY3V0b3I7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLmN0cy5DYW1lcmFUZXN0VXRpbHMuTW9ja1N0YXRlQ2FsbGJhY2s7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLmN0cy5oZWxwZXJzLkNhbWVyYUVycm9yQ29sbGVjdG9yOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXJUaHJlYWQ7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOwogaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIApAQCAtNDMsMTEgKzQ1LDEzIEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5MaW5rZWRCbG9ja2luZ1F1ZXVlOwogCiAvKioKICAqIDxwPkJhc2ljIHRlc3QgZm9yIENhbWVyYU1hbmFnZXIgY2xhc3MuPC9wPgogICovCitAQXBwTW9kZUZ1bGwKIHB1YmxpYyBjbGFzcyBDYW1lcmFNYW5hZ2VyVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJDYW1lcmFNYW5hZ2VyVGVzdCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBWRVJCT1NFID0gTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSk7CkBAIC0xNDIsNiArMTQ2LDcgQEAKICAgICAgICAgICogVGVzdDogdGhhdCBpZiB0aGUgZGV2aWNlIGhhcyBmcm9udCBvciByZWFyIGZhY2luZyBjYW1lcmFzLCB0aGVuIHRoZXJlCiAgICAgICAgICAqIG11c3QgYmUgbWF0Y2hlZCBzeXN0ZW0gZmVhdHVyZXMuCiAgICAgICAgICAqLworICAgICAgICBib29sZWFuIGV4dGVybmFsQ2FtZXJhQ29ubmVjdGVkID0gZmFsc2U7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MgcHJvcHMgPSBtQ2FtZXJhTWFuYWdlci5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoaWRzW2ldKTsKICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIkNhbid0IGdldCBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzIGZvciBjYW1lcmEgIiArIGlkc1tpXSwgcHJvcHMpOwpAQCAtMTU0LDYgKzE1OSw3IEBACiAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiU3lzdGVtIGRvZXNuJ3QgaGF2ZSBiYWNrIGNhbWVyYSBmZWF0dXJlIiwKICAgICAgICAgICAgICAgICAgICAgICAgIG1QYWNrYWdlTWFuYWdlci5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfQ0FNRVJBKSk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGxlbnNGYWNpbmcgPT0gQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLkxFTlNfRkFDSU5HX0VYVEVSTkFMKSB7CisgICAgICAgICAgICAgICAgZXh0ZXJuYWxDYW1lcmFDb25uZWN0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIlN5c3RlbSBkb2Vzbid0IGhhdmUgZXh0ZXJuYWwgY2FtZXJhIGZlYXR1cmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgbVBhY2thZ2VNYW5hZ2VyLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9DQU1FUkFfRVhURVJOQUwpKTsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0xNjEsNiArMTY3LDEyIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICAvLyBUZXN0IGFuIGV4dGVybmFsIGNhbWVyYSBpcyBjb25uZWN0ZWQgaWYgRkVBVFVSRV9DQU1FUkFfRVhURVJOQUwgaXMgYWR2ZXJ0aXNlZAorICAgICAgICBpZiAobVBhY2thZ2VNYW5hZ2VyLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9DQU1FUkFfRVhURVJOQUwpKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJFeHRlcm5hbCBjYW1lcmEgaXMgbm90IGNvbm5lY3RlZCBvbiBkZXZpY2Ugd2l0aCBGRUFUVVJFX0NBTUVSQV9FWFRFUk5BTCIsCisgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsQ2FtZXJhQ29ubmVjdGVkKTsKKyAgICAgICAgfQorCiAgICAgICAgIC8qKgogICAgICAgICAgKiBUZXN0OiB0aGF0IGlmIHRoZXJlIGlzIG9uZSBjYW1lcmEgZGV2aWNlLCB0aGVuIHRoZSBzeXN0ZW0gbXVzdCBoYXZlIHNvbWUKICAgICAgICAgICogc3BlY2lmaWMgZmVhdHVyZXMuCkBAIC0yMDYsNiArMjE4LDEyIEBACiAKICAgICAvLyBUZXN0OiB0aGF0IGVhY2ggY2FtZXJhIGRldmljZSBjYW4gYmUgb3BlbmVkIG9uZSBhdCBhIHRpbWUsIHNldmVyYWwgdGltZXMuCiAgICAgcHVibGljIHZvaWQgdGVzdENhbWVyYU1hbmFnZXJPcGVuQ2FtZXJhc1NlcmlhbGx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RDYW1lcmFNYW5hZ2VyT3BlbkNhbWVyYXNTZXJpYWxseSgvKnVzZUV4ZWN1dG9yKi8gZmFsc2UpOworICAgICAgICB0ZXN0Q2FtZXJhTWFuYWdlck9wZW5DYW1lcmFzU2VyaWFsbHkoLyp1c2VFeGVjdXRvciovIHRydWUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0Q2FtZXJhTWFuYWdlck9wZW5DYW1lcmFzU2VyaWFsbHkoYm9vbGVhbiB1c2VFeGVjdXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEV4ZWN1dG9yIGV4ZWN1dG9yID0gdXNlRXhlY3V0b3IgPyBuZXcgSGFuZGxlckV4ZWN1dG9yKG1IYW5kbGVyKSA6IG51bGw7CiAgICAgICAgIFN0cmluZ1tdIGlkcyA9IG1DYW1lcmFNYW5hZ2VyLmdldENhbWVyYUlkTGlzdCgpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBOVU1fQ0FNRVJBX1JFT1BFTlM7IGorKykgewpAQCAtMjE0LDcgKzIzMiwxMSBAQAogICAgICAgICAgICAgICAgICAgICBNb2NrU3RhdGVDYWxsYmFjayBtb2NrTGlzdGVuZXIgPSBNb2NrU3RhdGVDYWxsYmFjay5tb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgIG1DYW1lcmFMaXN0ZW5lciA9IG5ldyBCbG9ja2luZ1N0YXRlQ2FsbGJhY2sobW9ja0xpc3RlbmVyKTsKIAotICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhTWFuYWdlci5vcGVuQ2FtZXJhKGlkc1tpXSwgbUNhbWVyYUxpc3RlbmVyLCBtSGFuZGxlcik7CisgICAgICAgICAgICAgICAgICAgIGlmICh1c2VFeGVjdXRvcikgeworICAgICAgICAgICAgICAgICAgICAgICAgbUNhbWVyYU1hbmFnZXIub3BlbkNhbWVyYShpZHNbaV0sIGV4ZWN1dG9yLCBtQ2FtZXJhTGlzdGVuZXIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbUNhbWVyYU1hbmFnZXIub3BlbkNhbWVyYShpZHNbaV0sIG1DYW1lcmFMaXN0ZW5lciwgbUhhbmRsZXIpOworICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgLy8gQmxvY2sgdW50aWwgdW5Db25maWd1cmVkCiAgICAgICAgICAgICAgICAgICAgIG1DYW1lcmFMaXN0ZW5lci53YWl0Rm9yU3RhdGUoQmxvY2tpbmdTdGF0ZUNhbGxiYWNrLlNUQVRFX09QRU5FRCwKQEAgLTIzOCw2ICsyNjAsMTEgQEAKICAgICAgKiBpcyBzZXQgaWYgdGhpcyBjYW4ndCBiZSBkb25lLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHRlc3RDYW1lcmFNYW5hZ2VyT3BlbkFsbENhbWVyYXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdENhbWVyYU1hbmFnZXJPcGVuQWxsQ2FtZXJhcygvKnVzZUV4ZWN1dG9yKi8gZmFsc2UpOworICAgICAgICB0ZXN0Q2FtZXJhTWFuYWdlck9wZW5BbGxDYW1lcmFzKC8qdXNlRXhlY3V0b3IqLyB0cnVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdENhbWVyYU1hbmFnZXJPcGVuQWxsQ2FtZXJhcyhib29sZWFuIHVzZUV4ZWN1dG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nW10gaWRzID0gbUNhbWVyYU1hbmFnZXIuZ2V0Q2FtZXJhSWRMaXN0KCk7CiAgICAgICAgIGFzc2VydE5vdE51bGwoIkNhbWVyYSBpZHMgc2hvdWxkbid0IGJlIG51bGwiLCBpZHMpOwogCkBAIC0yNDYsNiArMjczLDcgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCisgICAgICAgIGZpbmFsIEV4ZWN1dG9yIGV4ZWN1dG9yID0gdXNlRXhlY3V0b3IgPyBuZXcgSGFuZGxlckV4ZWN1dG9yKG1IYW5kbGVyKSA6IG51bGw7CiAgICAgICAgIExpc3Q8Q2FtZXJhRGV2aWNlPiBjYW1lcmFMaXN0ID0gbmV3IEFycmF5TGlzdDxDYW1lcmFEZXZpY2U+KCk7CiAgICAgICAgIExpc3Q8TW9ja1N0YXRlQ2FsbGJhY2s+IGxpc3RlbmVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8TW9ja1N0YXRlQ2FsbGJhY2s+KCk7CiAgICAgICAgIExpc3Q8QmxvY2tpbmdTdGF0ZUNhbGxiYWNrPiBibG9ja2luZ0xpc3RlbmVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8QmxvY2tpbmdTdGF0ZUNhbGxiYWNrPigpOwpAQCAtMjY1LDggKzI5MywxMSBAQAogCiAgICAgICAgICAgICAgICAgU3RyaW5nIGNhbWVyYUlkID0gaWRzW2ldOwogICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DYW1lcmFNYW5hZ2VyLm9wZW5DYW1lcmEoY2FtZXJhSWQsIG1DYW1lcmFMaXN0ZW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGFuZGxlcik7CisgICAgICAgICAgICAgICAgICAgIGlmICh1c2VFeGVjdXRvcikgeworICAgICAgICAgICAgICAgICAgICAgICAgbUNhbWVyYU1hbmFnZXIub3BlbkNhbWVyYShjYW1lcmFJZCwgZXhlY3V0b3IsIG1DYW1lcmFMaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhTWFuYWdlci5vcGVuQ2FtZXJhKGNhbWVyYUlkLCBtQ2FtZXJhTGlzdGVuZXIsIG1IYW5kbGVyKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENhbWVyYUFjY2Vzc0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChjaGVja0NhbWVyYUFjY2Vzc0V4Y2VwdGlvblJlYXNvbihlKSA9PSBDYW1lcmFBY2Nlc3NFeGNlcHRpb24uQ0FNRVJBX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RpbmdFcnJvciA9IHRydWU7CkBAIC0zMzcsOCArMzY4LDExIEBACiAgICAgICAgICAgICAgICAgYmxvY2tpbmdMaXN0ZW5lckxpc3QuYWRkKG1DYW1lcmFMaXN0ZW5lcik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBmb3IgKENhbWVyYURldmljZSBjYW1lcmEgOiBjYW1lcmFMaXN0KSB7Ci0gICAgICAgICAgICAgICAgY2FtZXJhLmNsb3NlKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhbWVyYUxpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAvLyBXaXRoIGNvbmZsaWN0aW5nIGRldmljZXMsIG9wZW5pbmcgb2Ygb25lIGNhbWVyYSBjb3VsZCByZXN1bHQgaW4gdGhlIG90aGVyIGNhbWVyYQorICAgICAgICAgICAgICAgIC8vIGJlaW5nIGRpc2Nvbm5lY3RlZC4gVG8gaGFuZGxlIHN1Y2ggY2FzZSwgcmVzZXQgdGhlIG1vY2sgYmVmb3JlIGNsb3NlLgorICAgICAgICAgICAgICAgIHJlc2V0KGxpc3RlbmVyTGlzdC5nZXQoaSkpOworICAgICAgICAgICAgICAgIGNhbWVyYUxpc3QuZ2V0KGkpLmNsb3NlKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBmb3IgKEJsb2NraW5nU3RhdGVDYWxsYmFjayBibG9ja2luZ0xpc3RlbmVyIDogYmxvY2tpbmdMaXN0ZW5lckxpc3QpIHsKICAgICAgICAgICAgICAgICBibG9ja2luZ0xpc3RlbmVyLndhaXRGb3JTdGF0ZSgKQEAgLTQwOSw3ICs0NDMsMTMgQEAKICAgICAgKiBlcnJvciBzdGF0ZSBpcyBzZXQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdGVzdENhbWVyYU1hbmFnZXJPcGVuQ2FtZXJhVHdpY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdENhbWVyYU1hbmFnZXJPcGVuQ2FtZXJhVHdpY2UoLyp1c2VFeGVjdXRvciovIGZhbHNlKTsKKyAgICAgICAgdGVzdENhbWVyYU1hbmFnZXJPcGVuQ2FtZXJhVHdpY2UoLyp1c2VFeGVjdXRvciovIHRydWUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0Q2FtZXJhTWFuYWdlck9wZW5DYW1lcmFUd2ljZShib29sZWFuIHVzZUV4ZWN1dG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nW10gaWRzID0gbUNhbWVyYU1hbmFnZXIuZ2V0Q2FtZXJhSWRMaXN0KCk7CisgICAgICAgIGZpbmFsIEV4ZWN1dG9yIGV4ZWN1dG9yID0gdXNlRXhlY3V0b3IgPyBuZXcgSGFuZGxlckV4ZWN1dG9yKG1IYW5kbGVyKSA6IG51bGw7CiAKICAgICAgICAgLy8gVGVzdCBhY3Jvc3MgZXZlcnkgY2FtZXJhIGRldmljZS4KICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyArK2kpIHsKQEAgLTQyNSw5ICs0NjUsMTMgQEAKICAgICAgICAgICAgICAgICBCbG9ja2luZ1N0YXRlQ2FsbGJhY2sgZmFpbExpc3RlbmVyID0KICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCbG9ja2luZ1N0YXRlQ2FsbGJhY2sobW9ja0ZhaWxMaXN0ZW5lcik7CiAKLSAgICAgICAgICAgICAgICBtQ2FtZXJhTWFuYWdlci5vcGVuQ2FtZXJhKGlkc1tpXSwgc3VjY2Vzc0xpc3RlbmVyLCBtSGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgbUNhbWVyYU1hbmFnZXIub3BlbkNhbWVyYShpZHNbaV0sIGZhaWxMaXN0ZW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1IYW5kbGVyKTsKKyAgICAgICAgICAgICAgICBpZiAodXNlRXhlY3V0b3IpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNhbWVyYU1hbmFnZXIub3BlbkNhbWVyYShpZHNbaV0sIGV4ZWN1dG9yLCBzdWNjZXNzTGlzdGVuZXIpOworICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhTWFuYWdlci5vcGVuQ2FtZXJhKGlkc1tpXSwgZXhlY3V0b3IsIGZhaWxMaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbUNhbWVyYU1hbmFnZXIub3BlbkNhbWVyYShpZHNbaV0sIHN1Y2Nlc3NMaXN0ZW5lciwgbUhhbmRsZXIpOworICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhTWFuYWdlci5vcGVuQ2FtZXJhKGlkc1tpXSwgZmFpbExpc3RlbmVyLCBtSGFuZGxlcik7CisgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgc3VjY2Vzc0xpc3RlbmVyLndhaXRGb3JTdGF0ZShCbG9ja2luZ1N0YXRlQ2FsbGJhY2suU1RBVEVfT1BFTkVELAogICAgICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhVGVzdFV0aWxzLkNBTUVSQV9JRExFX1RJTUVPVVRfTVMpOwpAQCAtNDcyLDIwICs1MTYsMzMgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FtZXJhTWFuYWdlckxpc3RlbmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIG1DYW1lcmFNYW5hZ2VyLnVucmVnaXN0ZXJBdmFpbGFiaWxpdHlDYWxsYmFjayhtTGlzdGVuZXIpOworICAgICAgICAvLyBUZXN0IEhhbmRsZXIgQVBJCiAgICAgICAgIG1DYW1lcmFNYW5hZ2VyLnJlZ2lzdGVyQXZhaWxhYmlsaXR5Q2FsbGJhY2sobUxpc3RlbmVyLCBtSGFuZGxlcik7CiAgICAgICAgIG1DYW1lcmFNYW5hZ2VyLnJlZ2lzdGVyQXZhaWxhYmlsaXR5Q2FsbGJhY2sobUxpc3RlbmVyLCBtSGFuZGxlcik7CiAgICAgICAgIG1DYW1lcmFNYW5hZ2VyLnVucmVnaXN0ZXJBdmFpbGFiaWxpdHlDYWxsYmFjayhtTGlzdGVuZXIpOwogICAgICAgICBtQ2FtZXJhTWFuYWdlci51bnJlZ2lzdGVyQXZhaWxhYmlsaXR5Q2FsbGJhY2sobUxpc3RlbmVyKTsKKyAgICAgICAgLy8gVGVzdCBFeGVjdXRvciBBUEkKKyAgICAgICAgRXhlY3V0b3IgZXhlY3V0b3IgPSBuZXcgSGFuZGxlckV4ZWN1dG9yKG1IYW5kbGVyKTsKKyAgICAgICAgbUNhbWVyYU1hbmFnZXIucmVnaXN0ZXJBdmFpbGFiaWxpdHlDYWxsYmFjayhleGVjdXRvciwgbUxpc3RlbmVyKTsKKyAgICAgICAgbUNhbWVyYU1hbmFnZXIucmVnaXN0ZXJBdmFpbGFiaWxpdHlDYWxsYmFjayhleGVjdXRvciwgbUxpc3RlbmVyKTsKKyAgICAgICAgbUNhbWVyYU1hbmFnZXIudW5yZWdpc3RlckF2YWlsYWJpbGl0eUNhbGxiYWNrKG1MaXN0ZW5lcik7CisgICAgICAgIG1DYW1lcmFNYW5hZ2VyLnVucmVnaXN0ZXJBdmFpbGFiaWxpdHlDYWxsYmFjayhtTGlzdGVuZXIpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFRlc3QgdGhhdCB0aGUgYXZhaWxhYmlsaXR5IGNhbGxiYWNrcyBmaXJlIHdoZW4gZXhwZWN0ZWQKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FtZXJhTWFuYWdlckxpc3RlbmVyQ2FsbGJhY2tzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RDYW1lcmFNYW5hZ2VyTGlzdGVuZXJDYWxsYmFja3MoLyp1c2VFeGVjdXRvciovIGZhbHNlKTsKKyAgICAgICAgdGVzdENhbWVyYU1hbmFnZXJMaXN0ZW5lckNhbGxiYWNrcygvKnVzZUV4ZWN1dG9yKi8gdHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RDYW1lcmFNYW5hZ2VyTGlzdGVuZXJDYWxsYmFja3MoYm9vbGVhbiB1c2VFeGVjdXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIGludCBBVkFJTEFCSUxJVFlfVElNRU9VVF9NUyA9IDEwOwogCiAgICAgICAgIGZpbmFsIExpbmtlZEJsb2NraW5nUXVldWU8U3RyaW5nPiBhdmFpbGFibGVFdmVudFF1ZXVlID0gbmV3IExpbmtlZEJsb2NraW5nUXVldWU8PigpOwogICAgICAgICBmaW5hbCBMaW5rZWRCbG9ja2luZ1F1ZXVlPFN0cmluZz4gdW5hdmFpbGFibGVFdmVudFF1ZXVlID0gbmV3IExpbmtlZEJsb2NraW5nUXVldWU8PigpOworICAgICAgICBmaW5hbCBFeGVjdXRvciBleGVjdXRvciA9IHVzZUV4ZWN1dG9yID8gbmV3IEhhbmRsZXJFeGVjdXRvcihtSGFuZGxlcikgOiBudWxsOwogCiAgICAgICAgIENhbWVyYU1hbmFnZXIuQXZhaWxhYmlsaXR5Q2FsbGJhY2sgYWMgPSBuZXcgQ2FtZXJhTWFuYWdlci5BdmFpbGFiaWxpdHlDYWxsYmFjaygpIHsKICAgICAgICAgICAgIEBPdmVycmlkZQpAQCAtNDk5LDcgKzU1NiwxMSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9OwogCi0gICAgICAgIG1DYW1lcmFNYW5hZ2VyLnJlZ2lzdGVyQXZhaWxhYmlsaXR5Q2FsbGJhY2soYWMsIG1IYW5kbGVyKTsKKyAgICAgICAgaWYgKHVzZUV4ZWN1dG9yKSB7CisgICAgICAgICAgICBtQ2FtZXJhTWFuYWdlci5yZWdpc3RlckF2YWlsYWJpbGl0eUNhbGxiYWNrKGV4ZWN1dG9yLCBhYyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQ2FtZXJhTWFuYWdlci5yZWdpc3RlckF2YWlsYWJpbGl0eUNhbGxiYWNrKGFjLCBtSGFuZGxlcik7CisgICAgICAgIH0KICAgICAgICAgU3RyaW5nW10gY2FtZXJhcyA9IG1DYW1lcmFNYW5hZ2VyLmdldENhbWVyYUlkTGlzdCgpOwogCiAgICAgICAgIGlmIChjYW1lcmFzLmxlbmd0aCA9PSAwKSB7CkBAIC01MjUsNyArNTg2LDExIEBACiAgICAgICAgICAgICBNb2NrU3RhdGVDYWxsYmFjayBtb2NrTGlzdGVuZXIgPSBNb2NrU3RhdGVDYWxsYmFjay5tb2NrKCk7CiAgICAgICAgICAgICBtQ2FtZXJhTGlzdGVuZXIgPSBuZXcgQmxvY2tpbmdTdGF0ZUNhbGxiYWNrKG1vY2tMaXN0ZW5lcik7CiAKLSAgICAgICAgICAgIG1DYW1lcmFNYW5hZ2VyLm9wZW5DYW1lcmEoaWQsIG1DYW1lcmFMaXN0ZW5lciwgbUhhbmRsZXIpOworICAgICAgICAgICAgaWYgKHVzZUV4ZWN1dG9yKSB7CisgICAgICAgICAgICAgICAgbUNhbWVyYU1hbmFnZXIub3BlbkNhbWVyYShpZCwgZXhlY3V0b3IsIG1DYW1lcmFMaXN0ZW5lcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1DYW1lcmFNYW5hZ2VyLm9wZW5DYW1lcmEoaWQsIG1DYW1lcmFMaXN0ZW5lciwgbUhhbmRsZXIpOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBCbG9jayB1bnRpbCBvcGVuZWQKICAgICAgICAgICAgIG1DYW1lcmFMaXN0ZW5lci53YWl0Rm9yU3RhdGUoQmxvY2tpbmdTdGF0ZUNhbGxiYWNrLlNUQVRFX09QRU5FRCwKQEAgLTU3Myw3ICs2MzgsMTEgQEAKICAgICAgICAgICAgIE1vY2tTdGF0ZUNhbGxiYWNrIG1vY2tMaXN0ZW5lciA9IE1vY2tTdGF0ZUNhbGxiYWNrLm1vY2soKTsKICAgICAgICAgICAgIG1DYW1lcmFMaXN0ZW5lciA9IG5ldyBCbG9ja2luZ1N0YXRlQ2FsbGJhY2sobW9ja0xpc3RlbmVyKTsKIAotICAgICAgICAgICAgbUNhbWVyYU1hbmFnZXIub3BlbkNhbWVyYShjYW1lcmFzWzBdLCBtQ2FtZXJhTGlzdGVuZXIsIG1IYW5kbGVyKTsKKyAgICAgICAgICAgIGlmICh1c2VFeGVjdXRvcikgeworICAgICAgICAgICAgICAgIG1DYW1lcmFNYW5hZ2VyLm9wZW5DYW1lcmEoY2FtZXJhc1swXSwgZXhlY3V0b3IsIG1DYW1lcmFMaXN0ZW5lcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1DYW1lcmFNYW5hZ2VyLm9wZW5DYW1lcmEoY2FtZXJhc1swXSwgbUNhbWVyYUxpc3RlbmVyLCBtSGFuZGxlcik7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIEJsb2NrIHVudGlsIG9wZW5lZAogICAgICAgICAgICAgbUNhbWVyYUxpc3RlbmVyLndhaXRGb3JTdGF0ZShCbG9ja2luZ1N0YXRlQ2FsbGJhY2suU1RBVEVfT1BFTkVELApkaWZmIC0tZ2l0IGEvdGVzdHMvY2FtZXJhL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvY3RzL0NhcHR1cmVSZXF1ZXN0VGVzdC5qYXZhIGIvdGVzdHMvY2FtZXJhL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvY3RzL0NhcHR1cmVSZXF1ZXN0VGVzdC5qYXZhCmluZGV4IDExYjdiNWYuLjhmOGJmODcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2NhbWVyYS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL2N0cy9DYXB0dXJlUmVxdWVzdFRlc3QuamF2YQorKysgYi90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9jdHMvQ2FwdHVyZVJlcXVlc3RUZXN0LmphdmEKQEAgLTIyLDYgKzIyLDcgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvaW50OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnRGOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlN1cmZhY2VUZXh0dXJlOwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYW1lcmFDaGFyYWN0ZXJpc3RpY3M7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYURldmljZTsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FtZXJhTWV0YWRhdGE7CkBAIC0zNywxMCArMzgsMTQgQEAKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIucGFyYW1zLlJnZ2JDaGFubmVsVmVjdG9yOwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5wYXJhbXMuVG9uZW1hcEN1cnZlOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuSW1hZ2U7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOworaW1wb3J0IGFuZHJvaWQudXRpbC5BcnJheVNldDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5SYW5nZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuUmF0aW9uYWw7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNpemU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2U7CiAKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CkBAIC01Niw2ICs2MSw3IEBACiAgKiBtYW51YWwgSVNQIGNvbnRyb2wgYW5kIG90aGVyIHBlci1mcmFtZSBjb250cm9sIGFuZCBzeW5jaHJvbml6YXRpb24uCiAgKiA8L3A+CiAgKi8KK0BBcHBNb2RlRnVsbAogcHVibGljIGNsYXNzIENhcHR1cmVSZXF1ZXN0VGVzdCBleHRlbmRzIENhbWVyYTJTdXJmYWNlVmlld1Rlc3RDYXNlIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkNhcHR1cmVSZXF1ZXN0VGVzdCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBWRVJCT1NFID0gTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSk7CkBAIC0xMjksNiArMTM1LDg5IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogVGVzdCBDYXB0dXJlUmVxdWVzdCBzZXR0aW5ncyBwYXJjZWxsaW5nLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTZXR0aW5nc0JpbmRlclBhcmNlbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdXJmYWNlVGV4dHVyZSBvdXRwdXRUZXh0dXJlID0gbmV3IFN1cmZhY2VUZXh0dXJlKC8qIHJhbmRvbSB0ZXh0dXJlIElEICovIDUpOworICAgICAgICBTdXJmYWNlIHN1cmZhY2UgPSBuZXcgU3VyZmFjZShvdXRwdXRUZXh0dXJlKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1DYW1lcmFJZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb3BlbkRldmljZShtQ2FtZXJhSWRzW2ldKTsKKyAgICAgICAgICAgICAgICBDYXB0dXJlUmVxdWVzdC5CdWlsZGVyIHJlcXVlc3RCdWlsZGVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1DYW1lcmEuY3JlYXRlQ2FwdHVyZVJlcXVlc3QoQ2FtZXJhRGV2aWNlLlRFTVBMQVRFX1BSRVZJRVcpOworICAgICAgICAgICAgICAgIHJlcXVlc3RCdWlsZGVyLmFkZFRhcmdldChzdXJmYWNlKTsKKworICAgICAgICAgICAgICAgIC8vIENoZWNrIHJlZ3VsYXIvZGVmYXVsdCBjYXNlCisgICAgICAgICAgICAgICAgQ2FwdHVyZVJlcXVlc3QgY2FwdHVyZVJlcXVlc3RPcmlnaW5hbCA9IHJlcXVlc3RCdWlsZGVyLmJ1aWxkKCk7CisgICAgICAgICAgICAgICAgUGFyY2VsIHA7CisgICAgICAgICAgICAgICAgcCA9IFBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdE9yaWdpbmFsLndyaXRlVG9QYXJjZWwocCwgMCk7CisgICAgICAgICAgICAgICAgcC5zZXREYXRhUG9zaXRpb24oMCk7CisgICAgICAgICAgICAgICAgQ2FwdHVyZVJlcXVlc3QgY2FwdHVyZVJlcXVlc3RQYXJjZWxsZWQgPSBDYXB0dXJlUmVxdWVzdC5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwocCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJQYXJjZWxsZWQgY2FtZXJhIHNldHRpbmdzIHNob3VsZCBtYXRjaCIsCisgICAgICAgICAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdFBhcmNlbGxlZC5nZXQoQ2FwdHVyZVJlcXVlc3QuQ09OVFJPTF9DQVBUVVJFX0lOVEVOVCksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZWdlcihDYW1lcmFNZXRhZGF0YS5DT05UUk9MX0NBUFRVUkVfSU5URU5UX1BSRVZJRVcpKTsKKyAgICAgICAgICAgICAgICBwLnJlY3ljbGUoKTsKKworICAgICAgICAgICAgICAgIC8vIENoZWNrIGNhcHR1cmUgcmVxdWVzdCB3aXRoIGFkZGl0aW9uYWwgcGh5c2ljYWwgY2FtZXJhIHNldHRpbmdzCisgICAgICAgICAgICAgICAgU3RyaW5nIHBoeXNpY2FsSWQgPSBuZXcgU3RyaW5nKEludGVnZXIudG9TdHJpbmcoaSArIDEpKTsKKyAgICAgICAgICAgICAgICBBcnJheVNldDxTdHJpbmc+IHBoeXNpY2FsSWRzID0gbmV3IEFycmF5U2V0PFN0cmluZz4gKCk7CisgICAgICAgICAgICAgICAgcGh5c2ljYWxJZHMuYWRkKHBoeXNpY2FsSWQpOworCisgICAgICAgICAgICAgICAgcmVxdWVzdEJ1aWxkZXIgPSBtQ2FtZXJhLmNyZWF0ZUNhcHR1cmVSZXF1ZXN0KENhbWVyYURldmljZS5URU1QTEFURV9QUkVWSUVXLAorICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxJZHMpOworICAgICAgICAgICAgICAgIHJlcXVlc3RCdWlsZGVyLmFkZFRhcmdldChzdXJmYWNlKTsKKyAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdE9yaWdpbmFsID0gcmVxdWVzdEJ1aWxkZXIuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICBwID0gUGFyY2VsLm9idGFpbigpOworICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0T3JpZ2luYWwud3JpdGVUb1BhcmNlbChwLCAwKTsKKyAgICAgICAgICAgICAgICBwLnNldERhdGFQb3NpdGlvbigwKTsKKyAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdFBhcmNlbGxlZCA9IENhcHR1cmVSZXF1ZXN0LkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChwKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlBhcmNlbGxlZCBjYW1lcmEgc2V0dGluZ3Mgc2hvdWxkIG1hdGNoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0UGFyY2VsbGVkLmdldChDYXB0dXJlUmVxdWVzdC5DT05UUk9MX0NBUFRVUkVfSU5URU5UKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlZ2VyKENhbWVyYU1ldGFkYXRhLkNPTlRST0xfQ0FQVFVSRV9JTlRFTlRfUFJFVklFVykpOworICAgICAgICAgICAgICAgIHAucmVjeWNsZSgpOworCisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdmFyaW91cyBpbnZhbGlkIGNhc2VzCisgICAgICAgICAgICAgICAgcCA9IFBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgICAgICAgICBwLndyaXRlSW50KC0xKTsKKyAgICAgICAgICAgICAgICBwLnNldERhdGFQb3NpdGlvbigwKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdFBhcmNlbGxlZCA9IENhcHR1cmVSZXF1ZXN0LkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChwKTsKKyAgICAgICAgICAgICAgICAgICAgZmFpbCgic2hvdWxkIGdldCBSdW50aW1lRXhjZXB0aW9uIGR1ZSB0byBpbnZhbGlkIG51bWJlciBvZiBzZXR0aW5ncyIpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBFeHBlY3RlZAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwLnJlY3ljbGUoKTsKKworICAgICAgICAgICAgICAgIHAgPSBQYXJjZWwub2J0YWluKCk7CisgICAgICAgICAgICAgICAgcC53cml0ZUludCgwKTsKKyAgICAgICAgICAgICAgICBwLnNldERhdGFQb3NpdGlvbigwKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdFBhcmNlbGxlZCA9IENhcHR1cmVSZXF1ZXN0LkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChwKTsKKyAgICAgICAgICAgICAgICAgICAgZmFpbCgic2hvdWxkIGdldCBSdW50aW1lRXhjZXB0aW9uIGR1ZSB0byBpbnZhbGlkIG51bWJlciBvZiBzZXR0aW5ncyIpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBFeHBlY3RlZAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwLnJlY3ljbGUoKTsKKworICAgICAgICAgICAgICAgIHAgPSBQYXJjZWwub2J0YWluKCk7CisgICAgICAgICAgICAgICAgcC53cml0ZUludCgxKTsKKyAgICAgICAgICAgICAgICBwLnNldERhdGFQb3NpdGlvbigwKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdFBhcmNlbGxlZCA9IENhcHR1cmVSZXF1ZXN0LkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChwKTsKKyAgICAgICAgICAgICAgICAgICAgZmFpbCgic2hvdWxkIGdldCBSdW50aW1lRXhjZXB0aW9uIGR1ZSB0byBhYnNlbnQgc2V0dGluZ3MiKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRXhwZWN0ZWQKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcC5yZWN5Y2xlKCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGNsb3NlRGV2aWNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBUZXN0IGJsYWNrIGxldmVsIGxvY2sgd2hlbiBleHBvc3VyZSB2YWx1ZSBjaGFuZ2UuCiAgICAgICogPHA+CiAgICAgICogV2hlbiB7QGxpbmsgQ2FwdHVyZVJlcXVlc3QjQkxBQ0tfTEVWRUxfTE9DS30gaXMgdHJ1ZSBpbiBhIHJlcXVlc3QsIHRoZQpAQCAtMTUwNiw2ICsxNTk1LDcgQEAKICAgICAgICAgICAgIGNhc2UgQ09OVFJPTF9BRV9NT0RFX09OX0FVVE9fRkxBU0g6CiAgICAgICAgICAgICBjYXNlIENPTlRST0xfQUVfTU9ERV9PTl9BVVRPX0ZMQVNIX1JFREVZRToKICAgICAgICAgICAgIGNhc2UgQ09OVFJPTF9BRV9NT0RFX09OX0FMV0FZU19GTEFTSDoKKyAgICAgICAgICAgIGNhc2UgQ09OVFJPTF9BRV9NT0RFX09OX0VYVEVSTkFMX0ZMQVNIOgogICAgICAgICAgICAgICAgIC8vIFRlc3QgQUUgbG9jayBmb3IgYWJvdmUgQVVUTyBtb2Rlcy4KICAgICAgICAgICAgICAgICBhZUF1dG9Nb2RlVGVzdExvY2sobW9kZSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0yNjMwLDYgKzI3MjAsMTAgQEAKICAgICAgICAgICAgIC8vIEFsbG93IGEgbGFyZ2VyIGVycm9yIG1hcmdpbiAoMS41JSkgZm9yIHRpbWVzdGFtcHMKICAgICAgICAgICAgIGZyYW1lRHVyYXRpb25FcnJvck1hcmdpbiA9IDAuMDE1ZjsKICAgICAgICAgfQorICAgICAgICBpZiAobVN0YXRpY0luZm8uaXNFeHRlcm5hbENhbWVyYSgpKSB7CisgICAgICAgICAgICAvLyBBbGxvdyBhIGV2ZW4gbGFyZ2VyIGVycm9yIG1hcmdpbiAoMTUlKSBmb3IgZXh0ZXJuYWwgY2FtZXJhIHRpbWVzdGFtcHMKKyAgICAgICAgICAgIGZyYW1lRHVyYXRpb25FcnJvck1hcmdpbiA9IDAuMTVmOworICAgICAgICB9CiAKICAgICAgICAgYm9vbGVhbiBhbnRpQmFuZGluZ09mZklzU3VwcG9ydGVkID0gbVN0YXRpY0luZm8uaXNBbnRpQmFuZGluZ09mZk1vZGVTdXBwb3J0ZWQoKTsKICAgICAgICAgUmFuZ2U8SW50ZWdlcj4gZnBzUmFuZ2U7CkBAIC0yODAxLDYgKzI4OTUsNyBAQAogICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZTNhUmVnaW9uKAogICAgICAgICAgICAgQ2FwdHVyZVJlc3VsdCByZXN1bHQsIGludCBhbGdvSWR4LCBNZXRlcmluZ1JlY3RhbmdsZVtdIGV4cGVjdFJlZ2lvbnMpCiAgICAgeworICAgICAgICBmaW5hbCBpbnQgbWF4Q29ycmVjdGlvbkRpc3QgPSAyOwogICAgICAgICBpbnQgbWF4UmVnaW9uczsKICAgICAgICAgQ2FwdHVyZVJlc3VsdC5LZXk8TWV0ZXJpbmdSZWN0YW5nbGVbXT4ga2V5OwogICAgICAgICBNZXRlcmluZ1JlY3RhbmdsZVtdIGFjdHVhbFJlZ2lvbjsKQEAgLTI4MjIsMTMgKzI5MTcsNDEgQEAKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIDNBIEFsZ29yaXRobSEiKTsKICAgICAgICAgfQogCisgICAgICAgIEludGVnZXIgZGlzdG9ydGlvbkNvcnJlY3Rpb25Nb2RlID0gcmVzdWx0LmdldChDYXB0dXJlUmVzdWx0LkRJU1RPUlRJT05fQ09SUkVDVElPTl9NT0RFKTsKKyAgICAgICAgYm9vbGVhbiBjb3JyZWN0aW9uRW5hYmxlZCA9CisgICAgICAgICAgICAgICAgZGlzdG9ydGlvbkNvcnJlY3Rpb25Nb2RlICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICBkaXN0b3J0aW9uQ29ycmVjdGlvbk1vZGUgIT0gQ2FwdHVyZVJlc3VsdC5ESVNUT1JUSU9OX0NPUlJFQ1RJT05fTU9ERV9PRkY7CisKICAgICAgICAgaWYgKG1heFJlZ2lvbnMgPiAwKQogICAgICAgICB7CiAgICAgICAgICAgICBhY3R1YWxSZWdpb24gPSBnZXRWYWx1ZU5vdE51bGwocmVzdWx0LCBrZXkpOwotICAgICAgICAgICAgbUNvbGxlY3Rvci5leHBlY3RFcXVhbHMoCisgICAgICAgICAgICBpZiAoY29ycmVjdGlvbkVuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgYWN0dWFsUmVnaW9uLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIFJlY3QgYSA9IGFjdHVhbFJlZ2lvbltpXS5nZXRSZWN0KCk7CisgICAgICAgICAgICAgICAgICAgIFJlY3QgZSA9IGV4cGVjdFJlZ2lvbnNbaV0uZ2V0UmVjdCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoIW1Db2xsZWN0b3IuZXhwZWN0TGVzc09yRXF1YWwoCisgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgM0EgcmVnaW9uczogIiArIEFycmF5cy50b1N0cmluZyhleHBlY3RSZWdpb25zKSArCisgICAgICAgICAgICAgICAgICAgICAgICAiIGFyZSBub3QgY2xvc2UgZW5vdWdoIHRvIHRoZSBhY3R1YWwgb25lOiAiICsgQXJyYXlzLnRvU3RyaW5nKGFjdHVhbFJlZ2lvbiksCisgICAgICAgICAgICAgICAgICAgICAgICBtYXhDb3JyZWN0aW9uRGlzdCwgTWF0aC5hYnMoYS5sZWZ0IC0gZS5sZWZ0KSkpIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICBpZiAoIW1Db2xsZWN0b3IuZXhwZWN0TGVzc09yRXF1YWwoCisgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgM0EgcmVnaW9uczogIiArIEFycmF5cy50b1N0cmluZyhleHBlY3RSZWdpb25zKSArCisgICAgICAgICAgICAgICAgICAgICAgICAiIGFyZSBub3QgY2xvc2UgZW5vdWdoIHRvIHRoZSBhY3R1YWwgb25lOiAiICsgQXJyYXlzLnRvU3RyaW5nKGFjdHVhbFJlZ2lvbiksCisgICAgICAgICAgICAgICAgICAgICAgICBtYXhDb3JyZWN0aW9uRGlzdCwgTWF0aC5hYnMoYS5yaWdodCAtIGUucmlnaHQpKSkgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIGlmICghbUNvbGxlY3Rvci5leHBlY3RMZXNzT3JFcXVhbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCAzQSByZWdpb25zOiAiICsgQXJyYXlzLnRvU3RyaW5nKGV4cGVjdFJlZ2lvbnMpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgYXJlIG5vdCBjbG9zZSBlbm91Z2ggdG8gdGhlIGFjdHVhbCBvbmU6ICIgKyBBcnJheXMudG9TdHJpbmcoYWN0dWFsUmVnaW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heENvcnJlY3Rpb25EaXN0LCBNYXRoLmFicyhhLnRvcCAtIGUudG9wKSkpIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICBpZiAoIW1Db2xsZWN0b3IuZXhwZWN0TGVzc09yRXF1YWwoCisgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgM0EgcmVnaW9uczogIiArIEFycmF5cy50b1N0cmluZyhleHBlY3RSZWdpb25zKSArCisgICAgICAgICAgICAgICAgICAgICAgICAiIGFyZSBub3QgY2xvc2UgZW5vdWdoIHRvIHRoZSBhY3R1YWwgb25lOiAiICsgQXJyYXlzLnRvU3RyaW5nKGFjdHVhbFJlZ2lvbiksCisgICAgICAgICAgICAgICAgICAgICAgICBtYXhDb3JyZWN0aW9uRGlzdCwgTWF0aC5hYnMoYS5ib3R0b20gLSBlLmJvdHRvbSkpKSBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1Db2xsZWN0b3IuZXhwZWN0RXF1YWxzKAogICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgM0EgcmVnaW9uczogIiArIEFycmF5cy50b1N0cmluZyhleHBlY3RSZWdpb25zKSArCiAgICAgICAgICAgICAgICAgICAgICIgZG9lcyBub3QgbWF0Y2ggYWN0dWFsIG9uZTogIiArIEFycmF5cy50b1N0cmluZyhhY3R1YWxSZWdpb24pLAogICAgICAgICAgICAgICAgICAgICBleHBlY3RSZWdpb25zLCBhY3R1YWxSZWdpb24pOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvY2FtZXJhL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvY3RzL0NhcHR1cmVSZXN1bHRUZXN0LmphdmEgYi90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9jdHMvQ2FwdHVyZVJlc3VsdFRlc3QuamF2YQppbmRleCBiMjlmZDU3Li40MTQ2MzMzIDEwMDY0NAotLS0gYS90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9jdHMvQ2FwdHVyZVJlc3VsdFRlc3QuamF2YQorKysgYi90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9jdHMvQ2FwdHVyZVJlc3VsdFRlc3QuamF2YQpAQCAtMjYsOSArMjYsMTIgQEAKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuVG90YWxDYXB0dXJlUmVzdWx0OwogaW1wb3J0IGFuZHJvaWQubWVkaWEuSW1hZ2U7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5JbWFnZVJlYWRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOwogaW1wb3J0IGFuZHJvaWQudXRpbC5QYWlyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TaXplOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5jdHMuaGVscGVycy5DYW1lcmFFcnJvckNvbGxlY3RvcjsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuY3RzLmhlbHBlcnMuU3RhdGljTWV0YWRhdGE7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLmN0cy50ZXN0Y2FzZXMuQ2FtZXJhMkFuZHJvaWRUZXN0Q2FzZTsKIApAQCAtNDMsMTAgKzQ2LDEyIEBACiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkxpbmtlZEJsb2NraW5nUXVldWU7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiAKK0BBcHBNb2RlRnVsbAogcHVibGljIGNsYXNzIENhcHR1cmVSZXN1bHRUZXN0IGV4dGVuZHMgQ2FtZXJhMkFuZHJvaWRUZXN0Q2FzZSB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJDYXB0dXJlUmVzdWx0VGVzdCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBWRVJCT1NFID0gTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSk7CkBAIC01NCwxNCArNTksMTEgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTlVNX0ZSQU1FU19WRVJJRklFRCA9IDMwOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgV0FJVF9GT1JfUkVTVUxUX1RJTUVPVVRfTVMgPSAzMDAwOwogCi0gICAgLy8gTGlzdCB0aGF0IGluY2x1ZGVzIGFsbCBwdWJsaWMga2V5cyBmcm9tIENhcHR1cmVSZXN1bHQKLSAgICBMaXN0PENhcHR1cmVSZXN1bHQuS2V5PD8+PiBtQWxsS2V5czsKIAogICAgIC8vIExpc3QgdHJhY2tpbmcgdGhlIGZhaWxlZCB0ZXN0IGtleXMuCiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRDb250ZXh0KENvbnRleHQgY29udGV4dCkgewotICAgICAgICBtQWxsS2V5cyA9IGdldEFsbENhcHR1cmVSZXN1bHRLZXlzKCk7CiAgICAgICAgIHN1cGVyLnNldENvbnRleHQoY29udGV4dCk7CiAKICAgICAgICAgLyoqCkBAIC0xMjMsMTIgKzEyNSw5IEBACiAgICAgICAgICAgICAgICAgU2ltcGxlQ2FwdHVyZUNhbGxiYWNrIGNhcHR1cmVMaXN0ZW5lciA9IG5ldyBTaW1wbGVDYXB0dXJlQ2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICBzdGFydENhcHR1cmUocmVxdWVzdEJ1aWxkZXIuYnVpbGQoKSwgLypyZXBlYXRpbmcqL3RydWUsIGNhcHR1cmVMaXN0ZW5lciwgbUhhbmRsZXIpOwogCi0gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSB3YWl2ZWQga2V5cyBmb3IgY3VycmVudCBjYW1lcmEgZGV2aWNlCi0gICAgICAgICAgICAgICAgTGlzdDxDYXB0dXJlUmVzdWx0LktleTw/Pj4gd2FpdmVya2V5cyA9IGdldFdhaXZlcktleXNGb3JDYW1lcmEoKTsKLQogICAgICAgICAgICAgICAgIC8vIFZlcmlmeSByZXN1bHRzCi0gICAgICAgICAgICAgICAgdmFsaWRhdGVDYXB0dXJlUmVzdWx0KGNhcHR1cmVMaXN0ZW5lciwgd2FpdmVya2V5cywgcmVxdWVzdEJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBOVU1fRlJBTUVTX1ZFUklGSUVEKTsKKyAgICAgICAgICAgICAgICB2YWxpZGF0ZUNhcHR1cmVSZXN1bHQobUNvbGxlY3RvciwgY2FwdHVyZUxpc3RlbmVyLCBtU3RhdGljSW5mbywgbUFsbFN0YXRpY0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICBudWxsLypyZXF1ZXN0ZWRQaHlzaWNhbElkcyovLCByZXF1ZXN0QnVpbGRlciwgTlVNX0ZSQU1FU19WRVJJRklFRCk7CiAKICAgICAgICAgICAgICAgICBzdG9wQ2FwdHVyZSgvKmZhc3QqL2ZhbHNlKTsKICAgICAgICAgICAgIH0gZmluYWxseSB7CkBAIC0zMTAsNiArMzA5LDEyIEBACiAgICAgICAgICAgICAgICAgbXVsdGlCdWlsZGVyLmFkZFRhcmdldChwcmV2aWV3UmVhZGVyLmdldFN1cmZhY2UoKSk7CiAgICAgICAgICAgICAgICAgbXVsdGlCdWlsZGVyLmFkZFRhcmdldChqcGVnUmVhZGVyLmdldFN1cmZhY2UoKSk7CiAKKyAgICAgICAgICAgICAgICBpZiAobVN0YXRpY0luZm8uaXNFbmFibGVac2xTdXBwb3J0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBUdXJuIG9mZiBaU0wgdG8gZW5zdXJlIHRpbWVzdGFtcHMgYXJlIGluY3JlYXNpbmcKKyAgICAgICAgICAgICAgICAgICAgcHJldmlld0J1aWxkZXIuc2V0KENhcHR1cmVSZXF1ZXN0LkNPTlRST0xfRU5BQkxFX1pTTCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBtdWx0aUJ1aWxkZXIuc2V0KENhcHR1cmVSZXF1ZXN0LkNPTlRST0xfRU5BQkxFX1pTTCwgZmFsc2UpOworICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIENhcHR1cmVDYWxsYmFjayBtb2NrQ2FwdHVyZUNhbGxiYWNrID0gZ2V0TW9ja0NhcHR1cmVMaXN0ZW5lcigpOwogCiAgICAgICAgICAgICAgICAgLy8gQ2FwdHVyZSB0YXJnZXRpbmcgb25seSBwcmV2aWV3CkBAIC0zNzksNzIgKzM4NCwxMjUgQEAKICAgICAgICAgICAgICAgICByZXN1bHRJbWFnZS5nZXRUaW1lc3RhbXAoKSwgY2FwdHVyZVRpbWUpOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUNhcHR1cmVSZXN1bHQoU2ltcGxlQ2FwdHVyZUNhbGxiYWNrIGNhcHR1cmVMaXN0ZW5lciwKLSAgICAgICAgICAgIExpc3Q8Q2FwdHVyZVJlc3VsdC5LZXk8Pz4+IHNraXBwZWRLZXlzLCBDYXB0dXJlUmVxdWVzdC5CdWlsZGVyIHJlcXVlc3RCdWlsZGVyLAotICAgICAgICAgICAgaW50IG51bUZyYW1lc1ZlcmlmaWVkKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQ2FwdHVyZVJlc3VsdCByZXN1bHQgPSBudWxsOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUZyYW1lc1ZlcmlmaWVkOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBmYWlsTXNnID0gIkZhaWxlZCBjYXB0dXJlIHJlc3VsdCAiICsgaSArICIgdGVzdCAiOwotICAgICAgICAgICAgcmVzdWx0ID0gY2FwdHVyZUxpc3RlbmVyLmdldENhcHR1cmVSZXN1bHQoV0FJVF9GT1JfUkVTVUxUX1RJTUVPVVRfTVMpOworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZUNhcHR1cmVSZXN1bHQoQ2FtZXJhRXJyb3JDb2xsZWN0b3IgZXJyb3JDb2xsZWN0b3IsCisgICAgICAgICAgICBTaW1wbGVDYXB0dXJlQ2FsbGJhY2sgY2FwdHVyZUxpc3RlbmVyLCBTdGF0aWNNZXRhZGF0YSBzdGF0aWNJbmZvLAorICAgICAgICAgICAgTWFwPFN0cmluZywgU3RhdGljTWV0YWRhdGE+IGFsbFN0YXRpY0luZm8sIExpc3Q8U3RyaW5nPiByZXF1ZXN0ZWRQaHlzaWNhbElkcywKKyAgICAgICAgICAgIENhcHR1cmVSZXF1ZXN0LkJ1aWxkZXIgcmVxdWVzdEJ1aWxkZXIsIGludCBudW1GcmFtZXNWZXJpZmllZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIExpc3QgdGhhdCBpbmNsdWRlcyBhbGwgcHVibGljIGtleXMgZnJvbSBDYXB0dXJlUmVzdWx0CisgICAgICAgIExpc3Q8Q2FwdHVyZVJlc3VsdC5LZXk8Pz4+IGFsbEtleXMgPSBnZXRBbGxDYXB0dXJlUmVzdWx0S2V5cygpOworICAgICAgICAvLyBHZXQgdGhlIHdhaXZlZCBrZXlzIGZvciBjdXJyZW50IGNhbWVyYSBkZXZpY2UKKyAgICAgICAgTGlzdDxDYXB0dXJlUmVzdWx0LktleTw/Pj4gd2FpdmVyS2V5cyA9IGdldFdhaXZlcktleXNGb3JDYW1lcmEoc3RhdGljSW5mbyk7CisgICAgICAgIGlmIChyZXF1ZXN0ZWRQaHlzaWNhbElkcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXF1ZXN0ZWRQaHlzaWNhbElkcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICB9CiAKLSAgICAgICAgICAgIGZvciAoQ2FwdHVyZVJlc3VsdC5LZXk8Pz4ga2V5IDogbUFsbEtleXMpIHsKLSAgICAgICAgICAgICAgICBpZiAoIXNraXBwZWRLZXlzLmNvbnRhaW5zKGtleSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAqIENoZWNrIHRoZSBjcml0aWNhbCB0YWdzIGhlcmUuCi0gICAgICAgICAgICAgICAgICAgICAqIFRPRE86IENhbiB1c2UgdGhlIHNhbWUga2V5IGZvciByZXF1ZXN0IGFuZCByZXN1bHQgd2hlbiByZXF1ZXN0L3Jlc3VsdAotICAgICAgICAgICAgICAgICAgICAgKiBiZWNvbWVzIHN5bW1ldHJpYyAoYi8xNDA1OTg4MykuIFRoZW4gYmVsb3cgY2hlY2sgY2FuIGJlIHdyYXBwZWQgaW50bwotICAgICAgICAgICAgICAgICAgICAgKiBhIGdlbmVyaWMgZnVuY3Rpb24uCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gZmFpbE1zZyArICJmb3Iga2V5ICIgKyBrZXkuZ2V0TmFtZSgpOworICAgICAgICBIYXNoTWFwPFN0cmluZywgTGlzdDxDYXB0dXJlUmVzdWx0LktleTw/Pj4+IHBoeXNpY2FsV2FpdmVyS2V5cyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgZm9yIChTdHJpbmcgcGh5c2ljYWxJZCA6IHJlcXVlc3RlZFBoeXNpY2FsSWRzKSB7CisgICAgICAgICAgICBTdGF0aWNNZXRhZGF0YSBwaHlzaWNhbFN0YXRpY0luZm8gPSBhbGxTdGF0aWNJbmZvLmdldChwaHlzaWNhbElkKTsKKyAgICAgICAgICAgIHBoeXNpY2FsV2FpdmVyS2V5cy5wdXQocGh5c2ljYWxJZCwgZ2V0V2FpdmVyS2V5c0ZvckNhbWVyYShwaHlzaWNhbFN0YXRpY0luZm8pKTsKKyAgICAgICAgfQorCisgICAgICAgIFRvdGFsQ2FwdHVyZVJlc3VsdCByZXN1bHQgPSBudWxsOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUZyYW1lc1ZlcmlmaWVkOyBpKyspIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGNhcHR1cmVMaXN0ZW5lci5nZXRUb3RhbENhcHR1cmVSZXN1bHQoV0FJVF9GT1JfUkVTVUxUX1RJTUVPVVRfTVMpOworICAgICAgICAgICAgTWFwPFN0cmluZywgQ2FwdHVyZVJlc3VsdD4gcGh5c2ljYWxDYXB0dXJlUmVzdWx0cyA9IHJlc3VsdC5nZXRQaHlzaWNhbENhbWVyYVJlc3VsdHMoKTsKKyAgICAgICAgICAgIGVycm9yQ29sbGVjdG9yLmV4cGVjdEVxdWFscygiTnVtYmVyIG9mIHBoeXNpY2FsIHJlc3VsdCBtZXRhZGF0YSBkb2Vzbid0IG1hdGNoICIgKworICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhcHR1cmVSZXN1bHRzLnNpemUoKSArICIgdnMgIiArIHJlcXVlc3RlZFBoeXNpY2FsSWRzLnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYXB0dXJlUmVzdWx0cy5zaXplKCksIHJlcXVlc3RlZFBoeXNpY2FsSWRzLnNpemUoKSk7CisKKyAgICAgICAgICAgIHZhbGlkYXRlT25lQ2FwdHVyZVJlc3VsdChlcnJvckNvbGxlY3Rvciwgd2FpdmVyS2V5cywgYWxsS2V5cywgcmVxdWVzdEJ1aWxkZXIsIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgbnVsbC8qY2FtZXJhSWQqLywgaSk7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBwaHlzaWNhbElkIDogcmVxdWVzdGVkUGh5c2ljYWxJZHMpIHsKKyAgICAgICAgICAgICAgICB2YWxpZGF0ZU9uZUNhcHR1cmVSZXN1bHQoZXJyb3JDb2xsZWN0b3IsIHBoeXNpY2FsV2FpdmVyS2V5cy5nZXQocGh5c2ljYWxJZCksCisgICAgICAgICAgICAgICAgICAgICAgICBhbGxLZXlzLCBudWxsLypyZXF1ZXN0QnVpbGRlciovLCBwaHlzaWNhbENhcHR1cmVSZXN1bHRzLmdldChwaHlzaWNhbElkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsSWQsIGkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2YWxpZGF0ZU9uZUNhcHR1cmVSZXN1bHQoQ2FtZXJhRXJyb3JDb2xsZWN0b3IgZXJyb3JDb2xsZWN0b3IsCisgICAgICAgICAgICBMaXN0PENhcHR1cmVSZXN1bHQuS2V5PD8+PiBza2lwcGVkS2V5cywgTGlzdDxDYXB0dXJlUmVzdWx0LktleTw/Pj4gYWxsS2V5cywKKyAgICAgICAgICAgIENhcHR1cmVSZXF1ZXN0LkJ1aWxkZXIgcmVxdWVzdEJ1aWxkZXIsIENhcHR1cmVSZXN1bHQgcmVzdWx0LCBTdHJpbmcgY2FtZXJhSWQsCisgICAgICAgICAgICBpbnQgcmVzdWx0Q291bnQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgZmFpbE1zZyA9ICJGYWlsZWQgY2FwdHVyZSByZXN1bHQgIiArIHJlc3VsdENvdW50ICsgIiB0ZXN0IjsKKyAgICAgICAgU3RyaW5nIGNhbWVyYUlkU3RyaW5nID0gIiAiOworICAgICAgICBpZiAoY2FtZXJhSWQgIT0gbnVsbCkgeworICAgICAgICAgICAgY2FtZXJhSWRTdHJpbmcgKz0gImZvciBwaHlzaWNhbCBjYW1lcmEgIiArIGNhbWVyYUlkOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gdmVyaWZ5TWF0Y2hSZXF1ZXN0ID0gKHJlcXVlc3RCdWlsZGVyICE9IG51bGwpOworICAgICAgICBmb3IgKENhcHR1cmVSZXN1bHQuS2V5PD8+IGtleSA6IGFsbEtleXMpIHsKKyAgICAgICAgICAgIGlmICghc2tpcHBlZEtleXMuY29udGFpbnMoa2V5KSkgeworICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAqIENoZWNrIHRoZSBjcml0aWNhbCB0YWdzIGhlcmUuCisgICAgICAgICAgICAgICAgICogVE9ETzogQ2FuIHVzZSB0aGUgc2FtZSBrZXkgZm9yIHJlcXVlc3QgYW5kIHJlc3VsdCB3aGVuIHJlcXVlc3QvcmVzdWx0CisgICAgICAgICAgICAgICAgICogYmVjb21lcyBzeW1tZXRyaWMgKGIvMTQwNTk4ODMpLiBUaGVuIGJlbG93IGNoZWNrIGNhbiBiZSB3cmFwcGVkIGludG8KKyAgICAgICAgICAgICAgICAgKiBhIGdlbmVyaWMgZnVuY3Rpb24uCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9IGZhaWxNc2cgKyBjYW1lcmFJZFN0cmluZyArICJmb3Iga2V5ICIgKyBrZXkuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIGlmICh2ZXJpZnlNYXRjaFJlcXVlc3QpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGtleS5lcXVhbHMoQ2FwdHVyZVJlc3VsdC5DT05UUk9MX0FFX01PREUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ29sbGVjdG9yLmV4cGVjdEVxdWFscyhtc2csCisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvbGxlY3Rvci5leHBlY3RFcXVhbHMobXNnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QnVpbGRlci5nZXQoQ2FwdHVyZVJlcXVlc3QuQ09OVFJPTF9BRV9NT0RFKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldChDYXB0dXJlUmVzdWx0LkNPTlRST0xfQUVfTU9ERSkpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleS5lcXVhbHMoQ2FwdHVyZVJlc3VsdC5DT05UUk9MX0FGX01PREUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ29sbGVjdG9yLmV4cGVjdEVxdWFscyhtc2csCisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvbGxlY3Rvci5leHBlY3RFcXVhbHMobXNnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QnVpbGRlci5nZXQoQ2FwdHVyZVJlcXVlc3QuQ09OVFJPTF9BRl9NT0RFKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldChDYXB0dXJlUmVzdWx0LkNPTlRST0xfQUZfTU9ERSkpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleS5lcXVhbHMoQ2FwdHVyZVJlc3VsdC5DT05UUk9MX0FXQl9NT0RFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUNvbGxlY3Rvci5leHBlY3RFcXVhbHMobXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2xsZWN0b3IuZXhwZWN0RXF1YWxzKG1zZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEJ1aWxkZXIuZ2V0KENhcHR1cmVSZXF1ZXN0LkNPTlRST0xfQVdCX01PREUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0KENhcHR1cmVSZXN1bHQuQ09OVFJPTF9BV0JfTU9ERSkpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleS5lcXVhbHMoQ2FwdHVyZVJlc3VsdC5DT05UUk9MX01PREUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ29sbGVjdG9yLmV4cGVjdEVxdWFscyhtc2csCisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvbGxlY3Rvci5leHBlY3RFcXVhbHMobXNnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QnVpbGRlci5nZXQoQ2FwdHVyZVJlcXVlc3QuQ09OVFJPTF9NT0RFKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldChDYXB0dXJlUmVzdWx0LkNPTlRST0xfTU9ERSkpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleS5lcXVhbHMoQ2FwdHVyZVJlc3VsdC5TVEFUSVNUSUNTX0ZBQ0VfREVURUNUX01PREUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ29sbGVjdG9yLmV4cGVjdEVxdWFscyhtc2csCisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvbGxlY3Rvci5leHBlY3RFcXVhbHMobXNnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QnVpbGRlci5nZXQoQ2FwdHVyZVJlcXVlc3QuU1RBVElTVElDU19GQUNFX0RFVEVDVF9NT0RFKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldChDYXB0dXJlUmVzdWx0LlNUQVRJU1RJQ1NfRkFDRV9ERVRFQ1RfTU9ERSkpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleS5lcXVhbHMoQ2FwdHVyZVJlc3VsdC5OT0lTRV9SRURVQ1RJT05fTU9ERSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Db2xsZWN0b3IuZXhwZWN0RXF1YWxzKG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29sbGVjdG9yLmV4cGVjdEVxdWFscyhtc2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RCdWlsZGVyLmdldChDYXB0dXJlUmVxdWVzdC5OT0lTRV9SRURVQ1RJT05fTU9ERSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXQoQ2FwdHVyZVJlc3VsdC5OT0lTRV9SRURVQ1RJT05fTU9ERSkpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleS5lcXVhbHMoQ2FwdHVyZVJlc3VsdC5OT0lTRV9SRURVQ1RJT05fTU9ERSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Db2xsZWN0b3IuZXhwZWN0RXF1YWxzKG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29sbGVjdG9yLmV4cGVjdEVxdWFscyhtc2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RCdWlsZGVyLmdldChDYXB0dXJlUmVxdWVzdC5OT0lTRV9SRURVQ1RJT05fTU9ERSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXQoQ2FwdHVyZVJlc3VsdC5OT0lTRV9SRURVQ1RJT05fTU9ERSkpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleS5lcXVhbHMoQ2FwdHVyZVJlc3VsdC5SRVFVRVNUX1BJUEVMSU5FX0RFUFRIKSkgewogCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5LmVxdWFscyhDYXB0dXJlUmVzdWx0LlNUQVRJU1RJQ1NfT0lTX0RBVEFfTU9ERSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29sbGVjdG9yLmV4cGVjdEVxdWFscyhtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RCdWlsZGVyLmdldChDYXB0dXJlUmVxdWVzdC5TVEFUSVNUSUNTX09JU19EQVRBX01PREUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0KENhcHR1cmVSZXN1bHQuU1RBVElTVElDU19PSVNfREFUQV9NT0RFKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5LmVxdWFscyhDYXB0dXJlUmVzdWx0LkRJU1RPUlRJT05fQ09SUkVDVElPTl9NT0RFKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29sbGVjdG9yLmV4cGVjdEVxdWFscyhtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RCdWlsZGVyLmdldChDYXB0dXJlUmVxdWVzdC5ESVNUT1JUSU9OX0NPUlJFQ1RJT05fTU9ERSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXQoQ2FwdHVyZVJlc3VsdC5ESVNUT1JUSU9OX0NPUlJFQ1RJT05fTU9ERSkpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBkbyBub24tbnVsbCBjaGVjayBmb3IgdGhlIHJlc3Qgb2Yga2V5cy4KLSAgICAgICAgICAgICAgICAgICAgICAgIG1Db2xsZWN0b3IuZXhwZWN0S2V5VmFsdWVOb3ROdWxsKGZhaWxNc2csIHJlc3VsdCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29sbGVjdG9yLmV4cGVjdEtleVZhbHVlTm90TnVsbChmYWlsTXNnLCByZXN1bHQsIGtleSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBUaGVzZSBrZXlzIHNob3VsZCBhbHdheXMgYmUgbnVsbAotICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LmVxdWFscyhDYXB0dXJlUmVzdWx0LkNPTlRST0xfQUVfUkVHSU9OUykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Db2xsZWN0b3IuZXhwZWN0TnVsbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhcHR1cmUgcmVzdWx0IGNvbnRhaW5zIEFFIHJlZ2lvbnMgYnV0IGFlTWF4UmVnaW9ucyBpcyAwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldChDYXB0dXJlUmVzdWx0LkNPTlRST0xfQUVfUkVHSU9OUykpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleS5lcXVhbHMoQ2FwdHVyZVJlc3VsdC5DT05UUk9MX0FXQl9SRUdJT05TKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUNvbGxlY3Rvci5leHBlY3ROdWxsKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FwdHVyZSByZXN1bHQgY29udGFpbnMgQVdCIHJlZ2lvbnMgYnV0IGF3Yk1heFJlZ2lvbnMgaXMgMCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXQoQ2FwdHVyZVJlc3VsdC5DT05UUk9MX0FXQl9SRUdJT05TKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5LmVxdWFscyhDYXB0dXJlUmVzdWx0LkNPTlRST0xfQUZfUkVHSU9OUykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Db2xsZWN0b3IuZXhwZWN0TnVsbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhcHR1cmUgcmVzdWx0IGNvbnRhaW5zIEFGIHJlZ2lvbnMgYnV0IGFmTWF4UmVnaW9ucyBpcyAwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldChDYXB0dXJlUmVzdWx0LkNPTlRST0xfQUZfUkVHSU9OUykpOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgZG8gbm9uLW51bGwgY2hlY2sgZm9yIHRoZSByZXN0IG9mIGtleXMuCisgICAgICAgICAgICAgICAgICAgIGVycm9yQ29sbGVjdG9yLmV4cGVjdEtleVZhbHVlTm90TnVsbChmYWlsTXNnLCByZXN1bHQsIGtleSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBUaGVzZSBrZXlzIHNob3VsZCBhbHdheXMgYmUgbnVsbAorICAgICAgICAgICAgICAgIGlmIChrZXkuZXF1YWxzKENhcHR1cmVSZXN1bHQuQ09OVFJPTF9BRV9SRUdJT05TKSkgeworICAgICAgICAgICAgICAgICAgICBlcnJvckNvbGxlY3Rvci5leHBlY3ROdWxsKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYXB0dXJlIHJlc3VsdCBjb250YWlucyBBRSByZWdpb25zIGJ1dCBhZU1heFJlZ2lvbnMgaXMgMCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNhbWVyYUlkU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXQoQ2FwdHVyZVJlc3VsdC5DT05UUk9MX0FFX1JFR0lPTlMpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleS5lcXVhbHMoQ2FwdHVyZVJlc3VsdC5DT05UUk9MX0FXQl9SRUdJT05TKSkgeworICAgICAgICAgICAgICAgICAgICBlcnJvckNvbGxlY3Rvci5leHBlY3ROdWxsKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYXB0dXJlIHJlc3VsdCBjb250YWlucyBBV0IgcmVnaW9ucyBidXQgYXdiTWF4UmVnaW9ucyBpcyAwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY2FtZXJhSWRTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldChDYXB0dXJlUmVzdWx0LkNPTlRST0xfQVdCX1JFR0lPTlMpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleS5lcXVhbHMoQ2FwdHVyZVJlc3VsdC5DT05UUk9MX0FGX1JFR0lPTlMpKSB7CisgICAgICAgICAgICAgICAgICAgIGVycm9yQ29sbGVjdG9yLmV4cGVjdE51bGwoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhcHR1cmUgcmVzdWx0IGNvbnRhaW5zIEFGIHJlZ2lvbnMgYnV0IGFmTWF4UmVnaW9ucyBpcyAwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY2FtZXJhSWRTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldChDYXB0dXJlUmVzdWx0LkNPTlRST0xfQUZfUkVHSU9OUykpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNDU1LDcgKzUxMyw3IEBACiAgICAgICoKICAgICAgKiBNdXN0IGJlIGNhbGxlZCBhZnRlciBjYW1lcmEgZGV2aWNlIGlzIG9wZW5lZC4KICAgICAgKi8KLSAgICBwcml2YXRlIExpc3Q8Q2FwdHVyZVJlc3VsdC5LZXk8Pz4+IGdldFdhaXZlcktleXNGb3JDYW1lcmEoKSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxDYXB0dXJlUmVzdWx0LktleTw/Pj4gZ2V0V2FpdmVyS2V5c0ZvckNhbWVyYShTdGF0aWNNZXRhZGF0YSBzdGF0aWNJbmZvKSB7CiAgICAgICAgIExpc3Q8Q2FwdHVyZVJlc3VsdC5LZXk8Pz4+IHdhaXZlcktleXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAogICAgICAgICAvLyBHbG9iYWwgd2FpdmVyIGtleXMKQEAgLTQ4NCw3ICs1NDIsNyBAQAogICAgICAgICB3YWl2ZXJLZXlzLmFkZChDYXB0dXJlUmVzdWx0LlJFUFJPQ0VTU19FRkZFQ1RJVkVfRVhQT1NVUkVfRkFDVE9SKTsKIAogICAgICAgICAvL0tleXMgbm90IHJlcXVpcmVkIGlmIFJBVyBpcyBub3Qgc3VwcG9ydGVkCi0gICAgICAgIGlmICghbVN0YXRpY0luZm8uaXNDYXBhYmlsaXR5U3VwcG9ydGVkKAorICAgICAgICBpZiAoIXN0YXRpY0luZm8uaXNDYXBhYmlsaXR5U3VwcG9ydGVkKAogICAgICAgICAgICAgICAgIENhbWVyYUNoYXJhY3RlcmlzdGljcy5SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfUkFXKSkgewogICAgICAgICAgICAgd2FpdmVyS2V5cy5hZGQoQ2FwdHVyZVJlc3VsdC5TRU5TT1JfTkVVVFJBTF9DT0xPUl9QT0lOVCk7CiAgICAgICAgICAgICB3YWl2ZXJLZXlzLmFkZChDYXB0dXJlUmVzdWx0LlNFTlNPUl9HUkVFTl9TUExJVCk7CkBAIC00OTIsMTYgKzU1MCwzNyBAQAogICAgICAgICB9CiAKICAgICAgICAgLy9LZXlzIGZvciBkZXB0aCBvdXRwdXQgY2FwYWJpbGl0eQotICAgICAgICBpZiAoIW1TdGF0aWNJbmZvLmlzQ2FwYWJpbGl0eVN1cHBvcnRlZCgKKyAgICAgICAgaWYgKCFzdGF0aWNJbmZvLmlzQ2FwYWJpbGl0eVN1cHBvcnRlZCgKICAgICAgICAgICAgICAgICBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX0RFUFRIX09VVFBVVCkpIHsKICAgICAgICAgICAgIHdhaXZlcktleXMuYWRkKENhcHR1cmVSZXN1bHQuTEVOU19QT1NFX1JPVEFUSU9OKTsKICAgICAgICAgICAgIHdhaXZlcktleXMuYWRkKENhcHR1cmVSZXN1bHQuTEVOU19QT1NFX1RSQU5TTEFUSU9OKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vS2V5cyBmb3IgbGVucyBkaXN0b3J0aW9uIGNvcnJlY3Rpb24KKyAgICAgICAgYm9vbGVhbiBkaXN0b3J0aW9uQ29ycmVjdGlvblN1cHBvcnRlZCA9IHN0YXRpY0luZm8uaXNEaXN0b3J0aW9uQ29ycmVjdGlvblN1cHBvcnRlZCgpOworICAgICAgICBpZiAoIWRpc3RvcnRpb25Db3JyZWN0aW9uU3VwcG9ydGVkKSB7CisgICAgICAgICAgICB3YWl2ZXJLZXlzLmFkZChDYXB0dXJlUmVzdWx0LkRJU1RPUlRJT05fQ09SUkVDVElPTl9NT0RFKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRoZXNlIGtleXMgbXVzdCBwcmVzZW50IG9uIGVpdGhlciBERVBUSCBvciBkaXN0b3J0aW9uIGNvcnJlY3Rpb24gZGV2aWNlcworICAgICAgICBpZiAoIXN0YXRpY0luZm8uaXNDYXBhYmlsaXR5U3VwcG9ydGVkKAorICAgICAgICAgICAgICAgIENhbWVyYUNoYXJhY3RlcmlzdGljcy5SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfREVQVEhfT1VUUFVUKSAmJgorICAgICAgICAgICAgICAgICFkaXN0b3J0aW9uQ29ycmVjdGlvblN1cHBvcnRlZCkgewogICAgICAgICAgICAgd2FpdmVyS2V5cy5hZGQoQ2FwdHVyZVJlc3VsdC5MRU5TX0lOVFJJTlNJQ19DQUxJQlJBVElPTik7CiAgICAgICAgICAgICB3YWl2ZXJLZXlzLmFkZChDYXB0dXJlUmVzdWx0LkxFTlNfUkFESUFMX0RJU1RPUlRJT04pOworICAgICAgICAgICAgd2FpdmVyS2V5cy5hZGQoQ2FwdHVyZVJlc3VsdC5MRU5TX0RJU1RPUlRJT04pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gUmFkaWFsIGRpc3RvcnRpb24gZG9lc24ndCBuZWVkIHRvIGJlIHByZXNlbnQgZm9yIG5ldyBkZXZpY2VzLCBvciBvbGQgZGV2aWNlcyB0aGF0CisgICAgICAgICAgICAvLyBvcHQgaW4gdGhlIG5ldyBsZW5zIGRpc3RvcnRpb24gdGFnLgorICAgICAgICAgICAgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzIGMgPSBzdGF0aWNJbmZvLmdldENoYXJhY3RlcmlzdGljcygpOworICAgICAgICAgICAgaWYgKEJ1aWxkLlZFUlNJT04uRklSU1RfU0RLX0lOVCA+IEJ1aWxkLlZFUlNJT05fQ09ERVMuT19NUjEgfHwKKyAgICAgICAgICAgICAgICAgICAgYy5nZXQoQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLkxFTlNfRElTVE9SVElPTikgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHdhaXZlcktleXMuYWRkKENhcHR1cmVSZXN1bHQuTEVOU19SQURJQUxfRElTVE9SVElPTik7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICAvLyBXYWl2ZWQgaWYgUkFXIG91dHB1dCBpcyBub3Qgc3VwcG9ydGVkCi0gICAgICAgIGludFtdIG91dHB1dEZvcm1hdHMgPSBtU3RhdGljSW5mby5nZXRBdmFpbGFibGVGb3JtYXRzKAorICAgICAgICBpbnRbXSBvdXRwdXRGb3JtYXRzID0gc3RhdGljSW5mby5nZXRBdmFpbGFibGVGb3JtYXRzKAogICAgICAgICAgICAgICAgIFN0YXRpY01ldGFkYXRhLlN0cmVhbURpcmVjdGlvbi5PdXRwdXQpOwogICAgICAgICBib29sZWFuIHN1cHBvcnRSYXcgPSBmYWxzZTsKICAgICAgICAgZm9yIChpbnQgZm9ybWF0IDogb3V0cHV0Rm9ybWF0cykgewpAQCAtNTE1LDI3ICs1OTQsNDQgQEAKICAgICAgICAgICAgIHdhaXZlcktleXMuYWRkKENhcHR1cmVSZXN1bHQuQ09OVFJPTF9QT1NUX1JBV19TRU5TSVRJVklUWV9CT09TVCk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAobVN0YXRpY0luZm8uZ2V0QWVNYXhSZWdpb25zQ2hlY2tlZCgpID09IDApIHsKKyAgICAgICAgLy8gV2FpdmVkIGlmIE1PTk9DSFJPTUUgY2FwYWJpbGl0eQorICAgICAgICBpZiAoIXN0YXRpY0luZm8uaXNDYXBhYmlsaXR5U3VwcG9ydGVkKAorICAgICAgICAgICAgICAgIENhbWVyYUNoYXJhY3RlcmlzdGljcy5SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfTU9OT0NIUk9NRSkpIHsKKyAgICAgICAgICAgIHdhaXZlcktleXMuYWRkKENhcHR1cmVSZXN1bHQuQ09MT1JfQ09SUkVDVElPTl9NT0RFKTsKKyAgICAgICAgICAgIHdhaXZlcktleXMuYWRkKENhcHR1cmVSZXN1bHQuQ09MT1JfQ09SUkVDVElPTl9UUkFOU0ZPUk0pOworICAgICAgICAgICAgd2FpdmVyS2V5cy5hZGQoQ2FwdHVyZVJlc3VsdC5DT0xPUl9DT1JSRUNUSU9OX0dBSU5TKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdGF0aWNJbmZvLmdldEFlTWF4UmVnaW9uc0NoZWNrZWQoKSA9PSAwKSB7CiAgICAgICAgICAgICB3YWl2ZXJLZXlzLmFkZChDYXB0dXJlUmVzdWx0LkNPTlRST0xfQUVfUkVHSU9OUyk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKG1TdGF0aWNJbmZvLmdldEF3Yk1heFJlZ2lvbnNDaGVja2VkKCkgPT0gMCkgeworICAgICAgICBpZiAoc3RhdGljSW5mby5nZXRBd2JNYXhSZWdpb25zQ2hlY2tlZCgpID09IDApIHsKICAgICAgICAgICAgIHdhaXZlcktleXMuYWRkKENhcHR1cmVSZXN1bHQuQ09OVFJPTF9BV0JfUkVHSU9OUyk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKG1TdGF0aWNJbmZvLmdldEFmTWF4UmVnaW9uc0NoZWNrZWQoKSA9PSAwKSB7CisgICAgICAgIGlmIChzdGF0aWNJbmZvLmdldEFmTWF4UmVnaW9uc0NoZWNrZWQoKSA9PSAwKSB7CiAgICAgICAgICAgICB3YWl2ZXJLZXlzLmFkZChDYXB0dXJlUmVzdWx0LkNPTlRST0xfQUZfUkVHSU9OUyk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBLZXlzIGZvciBkeW5hbWljIGJsYWNrL3doaXRlIGxldmVscwotICAgICAgICBpZiAoIW1TdGF0aWNJbmZvLmlzT3B0aWNhbEJsYWNrUmVnaW9uU3VwcG9ydGVkKCkpIHsKKyAgICAgICAgaWYgKCFzdGF0aWNJbmZvLmlzT3B0aWNhbEJsYWNrUmVnaW9uU3VwcG9ydGVkKCkpIHsKICAgICAgICAgICAgIHdhaXZlcktleXMuYWRkKENhcHR1cmVSZXN1bHQuU0VOU09SX0RZTkFNSUNfQkxBQ0tfTEVWRUwpOwogICAgICAgICAgICAgd2FpdmVyS2V5cy5hZGQoQ2FwdHVyZVJlc3VsdC5TRU5TT1JfRFlOQU1JQ19XSElURV9MRVZFTCk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIW1TdGF0aWNJbmZvLmlzRW5hYmxlWnNsU3VwcG9ydGVkKCkpIHsKKyAgICAgICAgaWYgKCFzdGF0aWNJbmZvLmlzRW5hYmxlWnNsU3VwcG9ydGVkKCkpIHsKICAgICAgICAgICAgIHdhaXZlcktleXMuYWRkKENhcHR1cmVSZXN1bHQuQ09OVFJPTF9FTkFCTEVfWlNMKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChtU3RhdGljSW5mby5pc0hhcmR3YXJlTGV2ZWxBdExlYXN0RnVsbCgpKSB7CisgICAgICAgIGlmICghc3RhdGljSW5mby5pc0FmU2NlbmVDaGFuZ2VTdXBwb3J0ZWQoKSkgeworICAgICAgICAgICAgd2FpdmVyS2V5cy5hZGQoQ2FwdHVyZVJlc3VsdC5DT05UUk9MX0FGX1NDRU5FX0NIQU5HRSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXN0YXRpY0luZm8uaXNPaXNEYXRhTW9kZVN1cHBvcnRlZCgpKSB7CisgICAgICAgICAgICB3YWl2ZXJLZXlzLmFkZChDYXB0dXJlUmVzdWx0LlNUQVRJU1RJQ1NfT0lTX0RBVEFfTU9ERSk7CisgICAgICAgICAgICB3YWl2ZXJLZXlzLmFkZChDYXB0dXJlUmVzdWx0LlNUQVRJU1RJQ1NfT0lTX1NBTVBMRVMpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0YXRpY0luZm8uaXNIYXJkd2FyZUxldmVsQXRMZWFzdEZ1bGwoKSkgewogICAgICAgICAgICAgcmV0dXJuIHdhaXZlcktleXM7CiAgICAgICAgIH0KIApAQCAtNTQzLDQwICs2MzksNDAgQEAKICAgICAgICAgICogSGFyZHdhcmUgTGV2ZWwgPSBMSU1JVEVEIG9yIExFR0FDWQogICAgICAgICAgKi8KICAgICAgICAgLy8gS2V5IG5vdCBwcmVzZW50IGlmIGNlcnRhaW4gY29udHJvbCBpcyBub3Qgc3VwcG9ydGVkCi0gICAgICAgIGlmICghbVN0YXRpY0luZm8uaXNDb2xvckNvcnJlY3Rpb25TdXBwb3J0ZWQoKSkgeworICAgICAgICBpZiAoIXN0YXRpY0luZm8uaXNDb2xvckNvcnJlY3Rpb25TdXBwb3J0ZWQoKSkgewogICAgICAgICAgICAgd2FpdmVyS2V5cy5hZGQoQ2FwdHVyZVJlc3VsdC5DT0xPUl9DT1JSRUNUSU9OX0dBSU5TKTsKICAgICAgICAgICAgIHdhaXZlcktleXMuYWRkKENhcHR1cmVSZXN1bHQuQ09MT1JfQ09SUkVDVElPTl9NT0RFKTsKICAgICAgICAgICAgIHdhaXZlcktleXMuYWRkKENhcHR1cmVSZXN1bHQuQ09MT1JfQ09SUkVDVElPTl9UUkFOU0ZPUk0pOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCFtU3RhdGljSW5mby5pc01hbnVhbENvbG9yQWJlcnJhdGlvbkNvbnRyb2xTdXBwb3J0ZWQoKSkgeworICAgICAgICBpZiAoIXN0YXRpY0luZm8uaXNNYW51YWxDb2xvckFiZXJyYXRpb25Db250cm9sU3VwcG9ydGVkKCkpIHsKICAgICAgICAgICAgIHdhaXZlcktleXMuYWRkKENhcHR1cmVSZXN1bHQuQ09MT1JfQ09SUkVDVElPTl9BQkVSUkFUSU9OX01PREUpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCFtU3RhdGljSW5mby5pc01hbnVhbFRvbmVNYXBTdXBwb3J0ZWQoKSkgeworICAgICAgICBpZiAoIXN0YXRpY0luZm8uaXNNYW51YWxUb25lTWFwU3VwcG9ydGVkKCkpIHsKICAgICAgICAgICAgIHdhaXZlcktleXMuYWRkKENhcHR1cmVSZXN1bHQuVE9ORU1BUF9NT0RFKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmICghbVN0YXRpY0luZm8uaXNFZGdlTW9kZUNvbnRyb2xTdXBwb3J0ZWQoKSkgeworICAgICAgICBpZiAoIXN0YXRpY0luZm8uaXNFZGdlTW9kZUNvbnRyb2xTdXBwb3J0ZWQoKSkgewogICAgICAgICAgICAgd2FpdmVyS2V5cy5hZGQoQ2FwdHVyZVJlc3VsdC5FREdFX01PREUpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCFtU3RhdGljSW5mby5pc0hvdFBpeGVsTWFwTW9kZUNvbnRyb2xTdXBwb3J0ZWQoKSkgeworICAgICAgICBpZiAoIXN0YXRpY0luZm8uaXNIb3RQaXhlbE1hcE1vZGVDb250cm9sU3VwcG9ydGVkKCkpIHsKICAgICAgICAgICAgIHdhaXZlcktleXMuYWRkKENhcHR1cmVSZXN1bHQuSE9UX1BJWEVMX01PREUpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCFtU3RhdGljSW5mby5pc05vaXNlUmVkdWN0aW9uTW9kZUNvbnRyb2xTdXBwb3J0ZWQoKSkgeworICAgICAgICBpZiAoIXN0YXRpY0luZm8uaXNOb2lzZVJlZHVjdGlvbk1vZGVDb250cm9sU3VwcG9ydGVkKCkpIHsKICAgICAgICAgICAgIHdhaXZlcktleXMuYWRkKENhcHR1cmVSZXN1bHQuTk9JU0VfUkVEVUNUSU9OX01PREUpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCFtU3RhdGljSW5mby5pc01hbnVhbExlbnNTaGFkaW5nTWFwU3VwcG9ydGVkKCkpIHsKKyAgICAgICAgaWYgKCFzdGF0aWNJbmZvLmlzTWFudWFsTGVuc1NoYWRpbmdNYXBTdXBwb3J0ZWQoKSkgewogICAgICAgICAgICAgd2FpdmVyS2V5cy5hZGQoQ2FwdHVyZVJlc3VsdC5TSEFESU5HX01PREUpOwogICAgICAgICB9CiAKICAgICAgICAgLy9LZXlzIG5vdCByZXF1aXJlZCBpZiBuZWl0aGVyIE1BTlVBTF9TRU5TT1Igbm9yIFJFQURfU0VOU09SX1NFVFRJTkdTIGlzIHN1cHBvcnRlZAotICAgICAgICBpZiAoIW1TdGF0aWNJbmZvLmlzQ2FwYWJpbGl0eVN1cHBvcnRlZCgKKyAgICAgICAgaWYgKCFzdGF0aWNJbmZvLmlzQ2FwYWJpbGl0eVN1cHBvcnRlZCgKICAgICAgICAgICAgICAgICBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX01BTlVBTF9TRU5TT1IpICYmCi0gICAgICAgICAgICAhbVN0YXRpY0luZm8uaXNDYXBhYmlsaXR5U3VwcG9ydGVkKAorICAgICAgICAgICAgIXN0YXRpY0luZm8uaXNDYXBhYmlsaXR5U3VwcG9ydGVkKAogICAgICAgICAgICAgICAgIENhbWVyYUNoYXJhY3RlcmlzdGljcy5SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfUkVBRF9TRU5TT1JfU0VUVElOR1MpKSB7CiAgICAgICAgICAgICB3YWl2ZXJLZXlzLmFkZChDYXB0dXJlUmVzdWx0LlNFTlNPUl9FWFBPU1VSRV9USU1FKTsKICAgICAgICAgICAgIHdhaXZlcktleXMuYWRkKENhcHR1cmVSZXN1bHQuU0VOU09SX1NFTlNJVElWSVRZKTsKQEAgLTU4NCw3ICs2ODAsNyBAQAogICAgICAgICAgICAgd2FpdmVyS2V5cy5hZGQoQ2FwdHVyZVJlc3VsdC5MRU5TX0FQRVJUVVJFKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmICghbVN0YXRpY0luZm8uaXNDYXBhYmlsaXR5U3VwcG9ydGVkKAorICAgICAgICBpZiAoIXN0YXRpY0luZm8uaXNDYXBhYmlsaXR5U3VwcG9ydGVkKAogICAgICAgICAgICAgICAgIENhbWVyYUNoYXJhY3RlcmlzdGljcy5SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfTUFOVUFMX1NFTlNPUikpIHsKICAgICAgICAgICAgIHdhaXZlcktleXMuYWRkKENhcHR1cmVSZXN1bHQuU0VOU09SX0ZSQU1FX0RVUkFUSU9OKTsKICAgICAgICAgICAgIHdhaXZlcktleXMuYWRkKENhcHR1cmVSZXN1bHQuQkxBQ0tfTEVWRUxfTE9DSyk7CkBAIC01OTMsNyArNjg5LDIwIEBACiAgICAgICAgICAgICB3YWl2ZXJLZXlzLmFkZChDYXB0dXJlUmVzdWx0LkxFTlNfRklMVEVSX0RFTlNJVFkpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG1TdGF0aWNJbmZvLmlzSGFyZHdhcmVMZXZlbExpbWl0ZWQoKSAmJiBtU3RhdGljSW5mby5pc0NvbG9yT3V0cHV0U3VwcG9ydGVkKCkpIHsKKyAgICAgICAgaWYgKHN0YXRpY0luZm8uaXNIYXJkd2FyZUxldmVsTGltaXRlZCgpICYmIHN0YXRpY0luZm8uaXNDb2xvck91dHB1dFN1cHBvcnRlZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gd2FpdmVyS2V5czsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIEhhcmR3YXJlIExldmVsID0gRVhURVJOQUwKKyAgICAgICAgICovCisgICAgICAgIGlmIChzdGF0aWNJbmZvLmlzRXh0ZXJuYWxDYW1lcmEoKSkgeworICAgICAgICAgICAgd2FpdmVyS2V5cy5hZGQoQ2FwdHVyZVJlc3VsdC5MRU5TX0ZPQ0FMX0xFTkdUSCk7CisgICAgICAgICAgICB3YWl2ZXJLZXlzLmFkZChDYXB0dXJlUmVzdWx0LlNFTlNPUl9URVNUX1BBVFRFUk5fTU9ERSk7CisgICAgICAgICAgICB3YWl2ZXJLZXlzLmFkZChDYXB0dXJlUmVzdWx0LlNFTlNPUl9ST0xMSU5HX1NIVVRURVJfU0tFVyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3RhdGljSW5mby5pc0V4dGVybmFsQ2FtZXJhKCkgJiYgc3RhdGljSW5mby5pc0NvbG9yT3V0cHV0U3VwcG9ydGVkKCkpIHsKICAgICAgICAgICAgIHJldHVybiB3YWl2ZXJLZXlzOwogICAgICAgICB9CiAKQEAgLTYxMiw3ICs3MjEsNyBAQAogICAgICAgICB3YWl2ZXJLZXlzLmFkZChDYXB0dXJlUmVzdWx0LkNPTlRST0xfQUVfVEFSR0VUX0ZQU19SQU5HRSk7CiAgICAgICAgIHdhaXZlcktleXMuYWRkKENhcHR1cmVSZXN1bHQuQ09OVFJPTF9BRl9UUklHR0VSKTsKIAotICAgICAgICBpZiAobVN0YXRpY0luZm8uaXNIYXJkd2FyZUxldmVsTGVnYWN5KCkpIHsKKyAgICAgICAgaWYgKHN0YXRpY0luZm8uaXNIYXJkd2FyZUxldmVsTGVnYWN5KCkpIHsKICAgICAgICAgICAgIHJldHVybiB3YWl2ZXJLZXlzOwogICAgICAgICB9CiAKQEAgLTc3MCw2ICs4NzksNyBAQAogICAgICAgICByZXN1bHRLZXlzLmFkZChDYXB0dXJlUmVzdWx0LkNPTlRST0xfQVdCX1NUQVRFKTsKICAgICAgICAgcmVzdWx0S2V5cy5hZGQoQ2FwdHVyZVJlc3VsdC5DT05UUk9MX1BPU1RfUkFXX1NFTlNJVElWSVRZX0JPT1NUKTsKICAgICAgICAgcmVzdWx0S2V5cy5hZGQoQ2FwdHVyZVJlc3VsdC5DT05UUk9MX0VOQUJMRV9aU0wpOworICAgICAgICByZXN1bHRLZXlzLmFkZChDYXB0dXJlUmVzdWx0LkNPTlRST0xfQUZfU0NFTkVfQ0hBTkdFKTsKICAgICAgICAgcmVzdWx0S2V5cy5hZGQoQ2FwdHVyZVJlc3VsdC5FREdFX01PREUpOwogICAgICAgICByZXN1bHRLZXlzLmFkZChDYXB0dXJlUmVzdWx0LkZMQVNIX01PREUpOwogICAgICAgICByZXN1bHRLZXlzLmFkZChDYXB0dXJlUmVzdWx0LkZMQVNIX1NUQVRFKTsKQEAgLTc5MCw2ICs5MDAsNyBAQAogICAgICAgICByZXN1bHRLZXlzLmFkZChDYXB0dXJlUmVzdWx0LkxFTlNfU1RBVEUpOwogICAgICAgICByZXN1bHRLZXlzLmFkZChDYXB0dXJlUmVzdWx0LkxFTlNfSU5UUklOU0lDX0NBTElCUkFUSU9OKTsKICAgICAgICAgcmVzdWx0S2V5cy5hZGQoQ2FwdHVyZVJlc3VsdC5MRU5TX1JBRElBTF9ESVNUT1JUSU9OKTsKKyAgICAgICAgcmVzdWx0S2V5cy5hZGQoQ2FwdHVyZVJlc3VsdC5MRU5TX0RJU1RPUlRJT04pOwogICAgICAgICByZXN1bHRLZXlzLmFkZChDYXB0dXJlUmVzdWx0Lk5PSVNFX1JFRFVDVElPTl9NT0RFKTsKICAgICAgICAgcmVzdWx0S2V5cy5hZGQoQ2FwdHVyZVJlc3VsdC5SRVFVRVNUX1BJUEVMSU5FX0RFUFRIKTsKICAgICAgICAgcmVzdWx0S2V5cy5hZGQoQ2FwdHVyZVJlc3VsdC5TQ0FMRVJfQ1JPUF9SRUdJT04pOwpAQCAtODEzLDEyICs5MjQsMTUgQEAKICAgICAgICAgcmVzdWx0S2V5cy5hZGQoQ2FwdHVyZVJlc3VsdC5TVEFUSVNUSUNTX1NDRU5FX0ZMSUNLRVIpOwogICAgICAgICByZXN1bHRLZXlzLmFkZChDYXB0dXJlUmVzdWx0LlNUQVRJU1RJQ1NfSE9UX1BJWEVMX01BUCk7CiAgICAgICAgIHJlc3VsdEtleXMuYWRkKENhcHR1cmVSZXN1bHQuU1RBVElTVElDU19MRU5TX1NIQURJTkdfTUFQX01PREUpOworICAgICAgICByZXN1bHRLZXlzLmFkZChDYXB0dXJlUmVzdWx0LlNUQVRJU1RJQ1NfT0lTX0RBVEFfTU9ERSk7CisgICAgICAgIHJlc3VsdEtleXMuYWRkKENhcHR1cmVSZXN1bHQuU1RBVElTVElDU19PSVNfU0FNUExFUyk7CiAgICAgICAgIHJlc3VsdEtleXMuYWRkKENhcHR1cmVSZXN1bHQuVE9ORU1BUF9DVVJWRSk7CiAgICAgICAgIHJlc3VsdEtleXMuYWRkKENhcHR1cmVSZXN1bHQuVE9ORU1BUF9NT0RFKTsKICAgICAgICAgcmVzdWx0S2V5cy5hZGQoQ2FwdHVyZVJlc3VsdC5UT05FTUFQX0dBTU1BKTsKICAgICAgICAgcmVzdWx0S2V5cy5hZGQoQ2FwdHVyZVJlc3VsdC5UT05FTUFQX1BSRVNFVF9DVVJWRSk7CiAgICAgICAgIHJlc3VsdEtleXMuYWRkKENhcHR1cmVSZXN1bHQuQkxBQ0tfTEVWRUxfTE9DSyk7CiAgICAgICAgIHJlc3VsdEtleXMuYWRkKENhcHR1cmVSZXN1bHQuUkVQUk9DRVNTX0VGRkVDVElWRV9FWFBPU1VSRV9GQUNUT1IpOworICAgICAgICByZXN1bHRLZXlzLmFkZChDYXB0dXJlUmVzdWx0LkRJU1RPUlRJT05fQ09SUkVDVElPTl9NT0RFKTsKIAogICAgICAgICByZXR1cm4gcmVzdWx0S2V5czsKICAgICB9CmRpZmYgLS1naXQgYS90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9jdHMvRG5nQ3JlYXRvclRlc3QuamF2YSBiL3Rlc3RzL2NhbWVyYS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL2N0cy9EbmdDcmVhdG9yVGVzdC5qYXZhCmluZGV4IDhmMzJkNTIuLjA2ODliOWIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2NhbWVyYS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL2N0cy9EbmdDcmVhdG9yVGVzdC5qYXZhCisrKyBiL3Rlc3RzL2NhbWVyYS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL2N0cy9EbmdDcmVhdG9yVGVzdC5qYXZhCkBAIC00MSw2ICs0MSw3IEBACiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5JbWFnZVJlYWRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkNvbmRpdGlvblZhcmlhYmxlOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlBhaXI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNpemU7CkBAIC02NSw2ICs2Niw3IEBACiAvKioKICAqIFRlc3RzIGZvciB0aGUgRG5nQ3JlYXRvciBBUEkuCiAgKi8KK0BBcHBNb2RlRnVsbAogcHVibGljIGNsYXNzIERuZ0NyZWF0b3JUZXN0IGV4dGVuZHMgQ2FtZXJhMkFuZHJvaWRUZXN0Q2FzZSB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJEbmdDcmVhdG9yVGVzdCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBWRVJCT1NFID0gTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSk7CmRpZmYgLS1naXQgYS90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9jdHMvRXh0ZW5kZWRDYW1lcmFDaGFyYWN0ZXJpc3RpY3NUZXN0LmphdmEgYi90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9jdHMvRXh0ZW5kZWRDYW1lcmFDaGFyYWN0ZXJpc3RpY3NUZXN0LmphdmEKaW5kZXggMDAwZWRjZC4uOTMzOTUzNSAxMDA2NDQKLS0tIGEvdGVzdHMvY2FtZXJhL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvY3RzL0V4dGVuZGVkQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzVGVzdC5qYXZhCisrKyBiL3Rlc3RzL2NhbWVyYS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL2N0cy9FeHRlbmRlZENhbWVyYUNoYXJhY3RlcmlzdGljc1Rlc3QuamF2YQpAQCAtMzEsNiArMzEsOCBAQAogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5wYXJhbXMuU3RyZWFtQ29uZmlndXJhdGlvbk1hcDsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkNhbWNvcmRlclByb2ZpbGU7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5JbWFnZVJlYWRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIGltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlJhdGlvbmFsOwpAQCAtMzgsNiArNDAsNyBAQAogaW1wb3J0IGFuZHJvaWQudXRpbC5TaXplOwogaW1wb3J0IGFuZHJvaWQudXRpbC5QYXR0ZXJuczsKIGltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKQEAgLTQ1LDEyICs0OCwxNCBAQAogaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOwogaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwogaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLmN0cy5oZWxwZXJzLkFzc2VydEhlbHBlcnMuKjsKIAogLyoqCiAgKiBFeHRlbmRlZCB0ZXN0cyBmb3Igc3RhdGljIGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MuCiAgKi8KK0BBcHBNb2RlRnVsbAogcHVibGljIGNsYXNzIEV4dGVuZGVkQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJFeENocnNUZXN0IjsgLy8gbXVzdCBiZSBzaG9ydCBzbyBuZXh0IGxpbmUgZG9lc24ndCB0aHJvdwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gVkVSQk9TRSA9IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpOwpAQCAtNzMsNiArNzgsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNpemUgVkdBID0gbmV3IFNpemUoNjQwLCA0ODApOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNpemUgUVZHQSA9IG5ldyBTaXplKDMyMCwgMjQwKTsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgRlJBTUVfRFVSQVRJT05fMzBGUFNfTlNFQyA9IChsb25nKSAxZTkgLyAzMDsKICAgICAvKgogICAgICAqIEhXIExldmVscyBzaG9ydCBoYW5kCiAgICAgICovCkBAIC04MCw2ICs4Niw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExJTUlURUQgPSBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuSU5GT19TVVBQT1JURURfSEFSRFdBUkVfTEVWRUxfTElNSVRFRDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRlVMTCA9IENhbWVyYUNoYXJhY3RlcmlzdGljcy5JTkZPX1NVUFBPUlRFRF9IQVJEV0FSRV9MRVZFTF9GVUxMOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMRVZFTF8zID0gQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLklORk9fU1VQUE9SVEVEX0hBUkRXQVJFX0xFVkVMXzM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVYVEVSTkFMID0gQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLklORk9fU1VQUE9SVEVEX0hBUkRXQVJFX0xFVkVMX0VYVEVSTkFMOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPUFQgPSBJbnRlZ2VyLk1BWF9WQUxVRTsgIC8vIEZvciBrZXlzIHRoYXQgYXJlIG9wdGlvbmFsIG9uIGFsbCBoYXJkd2FyZSBsZXZlbHMuCiAKICAgICAvKgpAQCAtMTAwLDYgKzEwNyw4IEBACiAgICAgICAgICAgICBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1BSSVZBVEVfUkVQUk9DRVNTSU5HOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT05TVFJBSU5FRF9ISUdIX1NQRUVEID0KICAgICAgICAgICAgIENhbWVyYUNoYXJhY3RlcmlzdGljcy5SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfQ09OU1RSQUlORURfSElHSF9TUEVFRF9WSURFTzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU9OT0NIUk9NRSA9CisgICAgICAgICAgICBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX01PTk9DSFJPTUU7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhJR0hfU1BFRURfRlBTX0xPV0VSX01JTiA9IDMwOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBISUdIX1NQRUVEX0ZQU19VUFBFUl9NSU4gPSAxMjA7CiAKQEAgLTE0MSw3ICsxNTAsNyBAQAogICAgIC8qKgogICAgICAqIFRlc3QgdGhhdCB0aGUgYXZhaWxhYmxlIHN0cmVhbSBjb25maWd1cmF0aW9ucyBjb250YWluIGEgZmV3IHJlcXVpcmVkIGZvcm1hdHMgYW5kIHNpemVzLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBdmFpbGFibGVTdHJlYW1Db25maWdzKCkgeworICAgIHB1YmxpYyB2b2lkIHRlc3RBdmFpbGFibGVTdHJlYW1Db25maWdzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGludCBjb3VudGVyID0gMDsKICAgICAgICAgZm9yIChDYW1lcmFDaGFyYWN0ZXJpc3RpY3MgYyA6IG1DaGFyYWN0ZXJpc3RpY3MpIHsKICAgICAgICAgICAgIFN0cmVhbUNvbmZpZ3VyYXRpb25NYXAgY29uZmlnID0KQEAgLTIxMiwxNiArMjIxLDM3IEBACiAgICAgICAgICAgICBBcnJheUxpc3Q8U2l6ZT4ganBlZ1NpemVzTGlzdCA9IG5ldyBBcnJheUxpc3Q8PihBcnJheXMuYXNMaXN0KGpwZWdTaXplcykpOwogICAgICAgICAgICAgQXJyYXlMaXN0PFNpemU+IHl1dlNpemVzTGlzdCA9IG5ldyBBcnJheUxpc3Q8PihBcnJheXMuYXNMaXN0KHl1dlNpemVzKSk7CiAgICAgICAgICAgICBBcnJheUxpc3Q8U2l6ZT4gcHJpdmF0ZVNpemVzTGlzdCA9IG5ldyBBcnJheUxpc3Q8PihBcnJheXMuYXNMaXN0KHByaXZhdGVTaXplcykpOwotCi0gICAgICAgICAgICBpbnQgY2FtZXJhSWQgPSBJbnRlZ2VyLnZhbHVlT2YobUlkc1tjb3VudGVyXSk7Ci0gICAgICAgICAgICBDYW1jb3JkZXJQcm9maWxlIG1heFZpZGVvUHJvZmlsZSA9IENhbWNvcmRlclByb2ZpbGUuZ2V0KAotICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZCwgQ2FtY29yZGVyUHJvZmlsZS5RVUFMSVRZX0hJR0gpOwotICAgICAgICAgICAgU2l6ZSBtYXhWaWRlb1NpemUgPSBuZXcgU2l6ZSgKLSAgICAgICAgICAgICAgICAgICAgbWF4VmlkZW9Qcm9maWxlLnZpZGVvRnJhbWVXaWR0aCwgbWF4VmlkZW9Qcm9maWxlLnZpZGVvRnJhbWVIZWlnaHQpOworICAgICAgICAgICAgYm9vbGVhbiBpc0V4dGVybmFsQ2FtZXJhID0gKGh3TGV2ZWwgPT0KKyAgICAgICAgICAgICAgICAgICAgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLklORk9fU1VQUE9SVEVEX0hBUkRXQVJFX0xFVkVMX0VYVEVSTkFMKTsKKyAgICAgICAgICAgIFNpemUgbWF4VmlkZW9TaXplID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChpc0V4dGVybmFsQ2FtZXJhKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogZm9yIG5vdywgdXNlIEZVTExIRCAzMCBhcyBsYXJnZXN0IHBvc3NpYmxlIHZpZGVvIHNpemUKKyAgICAgICAgICAgICAgICBMaXN0PFNpemU+IHZpZGVvU2l6ZXMgPSBDYW1lcmFUZXN0VXRpbHMuZ2V0U3VwcG9ydGVkVmlkZW9TaXplcygKKyAgICAgICAgICAgICAgICAgICAgICAgIG1JZHNbY291bnRlcl0sIG1DYW1lcmFNYW5hZ2VyLCBGVUxMSEQpOworICAgICAgICAgICAgICAgIGZvciAoU2l6ZSBzeiA6IHZpZGVvU2l6ZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9uZyBtaW5GcmFtZUR1cmF0aW9uID0gY29uZmlnLmdldE91dHB1dE1pbkZyYW1lRHVyYXRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJlY29yZGVyLmNsYXNzLCBzeik7CisgICAgICAgICAgICAgICAgICAgIC8vIEdpdmUgc29tZSBtYXJnaW4gZm9yIHJvdW5kaW5nIGVycm9yCisgICAgICAgICAgICAgICAgICAgIGlmIChtaW5GcmFtZUR1cmF0aW9uID4gKDFlOSAvIDMwLjEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXhWaWRlb1NpemUgPSBzejsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgY2FtZXJhSWQgPSBJbnRlZ2VyLnZhbHVlT2YobUlkc1tjb3VudGVyXSk7CisgICAgICAgICAgICAgICAgQ2FtY29yZGVyUHJvZmlsZSBtYXhWaWRlb1Byb2ZpbGUgPSBDYW1jb3JkZXJQcm9maWxlLmdldCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkLCBDYW1jb3JkZXJQcm9maWxlLlFVQUxJVFlfSElHSCk7CisgICAgICAgICAgICAgICAgbWF4VmlkZW9TaXplID0gbmV3IFNpemUoCisgICAgICAgICAgICAgICAgICAgICAgICBtYXhWaWRlb1Byb2ZpbGUudmlkZW9GcmFtZVdpZHRoLCBtYXhWaWRlb1Byb2ZpbGUudmlkZW9GcmFtZUhlaWdodCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobWF4VmlkZW9TaXplID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJDYW1lcmEgIiArIG1JZHNbY291bnRlcl0gKyAiIGRvZXMgbm90IHN1cHBvcnQgYW55IDMwZnBzIHZpZGVvIG91dHB1dCIpOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBIYW5kbGUgRnVsbEhEIHNwZWNpYWwgY2FzZSBmaXJzdAogICAgICAgICAgICAgaWYgKGpwZWdTaXplc0xpc3QuY29udGFpbnMoRlVMTEhEKSkgewotICAgICAgICAgICAgICAgIGlmIChod0xldmVsID49IExFVkVMXzMgfHwgaHdMZXZlbCA9PSBGVUxMIHx8IChod0xldmVsID09IExJTUlURUQgJiYKKyAgICAgICAgICAgICAgICBpZiAoY29tcGFyZUhhcmR3YXJlTGV2ZWwoaHdMZXZlbCwgTEVWRUxfMykgPj0gMCB8fCBod0xldmVsID09IEZVTEwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChod0xldmVsID09IExJTUlURUQgJiYKICAgICAgICAgICAgICAgICAgICAgICAgIG1heFZpZGVvU2l6ZS5nZXRXaWR0aCgpID49IEZVTExIRC5nZXRXaWR0aCgpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICBtYXhWaWRlb1NpemUuZ2V0SGVpZ2h0KCkgPj0gRlVMTEhELmdldEhlaWdodCgpKSkgewogICAgICAgICAgICAgICAgICAgICBib29sZWFuIHl1dlN1cHBvcnRGdWxsSEQgPSB5dXZTaXplc0xpc3QuY29udGFpbnMoRlVMTEhEKSB8fApAQCAtMjQ5LDcgKzI3OSw4IEBACiAgICAgICAgICAgICAgICAganBlZ1NpemVzTGlzdC5yZW1vdmVBbGwodG9CZVJlbW92ZWQpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoaHdMZXZlbCA+PSBMRVZFTF8zIHx8IGh3TGV2ZWwgPT0gRlVMTCB8fCBod0xldmVsID09IExJTUlURUQpIHsKKyAgICAgICAgICAgIGlmIChjb21wYXJlSGFyZHdhcmVMZXZlbChod0xldmVsLCBMRVZFTF8zKSA+PSAwIHx8IGh3TGV2ZWwgPT0gRlVMTCB8fAorICAgICAgICAgICAgICAgICAgICBod0xldmVsID09IExJTUlURUQpIHsKICAgICAgICAgICAgICAgICBpZiAoIXl1dlNpemVzTGlzdC5jb250YWluc0FsbChqcGVnU2l6ZXNMaXN0KSkgewogICAgICAgICAgICAgICAgICAgICBmb3IgKFNpemUgcyA6IGpwZWdTaXplc0xpc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgheXV2U2l6ZXNMaXN0LmNvbnRhaW5zKHMpKSB7CkBAIC0zMzQsMTEgKzM2NSwxMSBAQAogICAgICAgICAgICAgICAgIGV4cGVjdEtleUF2YWlsYWJsZShjLCBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuRkxBU0hfSU5GT19BVkFJTEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBPUFQgICAgICAsICAgQkMgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICBleHBlY3RLZXlBdmFpbGFibGUoYywgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLkhPVF9QSVhFTF9BVkFJTEFCTEVfSE9UX1BJWEVMX01PREVTICAgICAgICAgICAgICwgT1BUICAgICAgLCAgIFJBVyAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgZXhwZWN0S2V5QXZhaWxhYmxlKGMsIENhbWVyYUNoYXJhY3RlcmlzdGljcy5JTkZPX1NVUFBPUlRFRF9IQVJEV0FSRV9MRVZFTCAgICAgICAgICAgICAgICAgICAsIE9QVCAgICAgICwgICBCQyAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIGV4cGVjdEtleUF2YWlsYWJsZShjLCBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuSU5GT19WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBPUFQgICAgICAsICAgTk9ORSAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICBleHBlY3RLZXlBdmFpbGFibGUoYywgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLkpQRUdfQVZBSUxBQkxFX1RIVU1CTkFJTF9TSVpFUyAgICAgICAgICAgICAgICAgICwgT1BUICAgICAgLCAgIEJDICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgZXhwZWN0S2V5QXZhaWxhYmxlKGMsIENhbWVyYUNoYXJhY3RlcmlzdGljcy5MRU5TX0ZBQ0lORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIE9QVCAgICAgICwgICBCQyAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgIGV4cGVjdEtleUF2YWlsYWJsZShjLCBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuTEVOU19JTkZPX0FWQUlMQUJMRV9BUEVSVFVSRVMgICAgICAgICAgICAgICAgICAgLCBGVUxMICAgICAsICAgTUFOVUFMX1NFTlNPUiAgICAgICAgKTsKICAgICAgICAgICAgICAgICBleHBlY3RLZXlBdmFpbGFibGUoYywgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLkxFTlNfSU5GT19BVkFJTEFCTEVfRklMVEVSX0RFTlNJVElFUyAgICAgICAgICAgICwgRlVMTCAgICAgLCAgIE1BTlVBTF9TRU5TT1IgICAgICAgICk7Ci0gICAgICAgICAgICAgICAgZXhwZWN0S2V5QXZhaWxhYmxlKGMsIENhbWVyYUNoYXJhY3RlcmlzdGljcy5MRU5TX0lORk9fQVZBSUxBQkxFX0ZPQ0FMX0xFTkdUSFMgICAgICAgICAgICAgICAsIE9QVCAgICAgICwgICBCQyAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgIGV4cGVjdEtleUF2YWlsYWJsZShjLCBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuTEVOU19JTkZPX0FWQUlMQUJMRV9PUFRJQ0FMX1NUQUJJTElaQVRJT04gICAgICAgLCBMSU1JVEVEICAsICAgQkMgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICBleHBlY3RLZXlBdmFpbGFibGUoYywgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLkxFTlNfSU5GT19GT0NVU19ESVNUQU5DRV9DQUxJQlJBVElPTiAgICAgICAgICAgICwgTElNSVRFRCAgLCAgIE1BTlVBTF9TRU5TT1IgICAgICAgICk7CiAgICAgICAgICAgICAgICAgZXhwZWN0S2V5QXZhaWxhYmxlKGMsIENhbWVyYUNoYXJhY3RlcmlzdGljcy5MRU5TX0lORk9fSFlQRVJGT0NBTF9ESVNUQU5DRSAgICAgICAgICAgICAgICAgICAsIExJTUlURUQgICwgICBCQyAgICAgICAgICAgICAgICAgICApOwpAQCAtMzU1LDggKzM4Niw3IEBACiAgICAgICAgICAgICAgICAgZXhwZWN0S2V5QXZhaWxhYmxlKGMsIENhbWVyYUNoYXJhY3RlcmlzdGljcy5TQ0FMRVJfQVZBSUxBQkxFX01BWF9ESUdJVEFMX1pPT00gICAgICAgICAgICAgICAsIE9QVCAgICAgICwgICBCQyAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgIGV4cGVjdEtleUF2YWlsYWJsZShjLCBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuU0NBTEVSX1NUUkVBTV9DT05GSUdVUkFUSU9OX01BUCAgICAgICAgICAgICAgICAgLCBPUFQgICAgICAsICAgQkMgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICBleHBlY3RLZXlBdmFpbGFibGUoYywgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLlNDQUxFUl9DUk9QUElOR19UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgT1BUICAgICAgLCAgIEJDICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAgICAgZXhwZWN0S2V5QXZhaWxhYmxlKGMsIENhbWVyYUNoYXJhY3RlcmlzdGljcy5TRU5TT1JfQVZBSUxBQkxFX1RFU1RfUEFUVEVSTl9NT0RFUyAgICAgICAgICAgICAsIE9QVCAgICAgICwgICBCQyAgICAgICAgICAgICAgICAgICApOwotICAgICAgICAgICAgICAgIGV4cGVjdEtleUF2YWlsYWJsZShjLCBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuU0VOU09SX0JMQUNLX0xFVkVMX1BBVFRFUk4gICAgICAgICAgICAgICAgICAgICAgLCBGVUxMICAgICAsICAgTUFOVUFMX1NFTlNPUiwgUkFXICAgKTsKKyAgICAgICAgICAgICAgICBleHBlY3RLZXlBdmFpbGFibGUoYywgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLlNFTlNPUl9CTEFDS19MRVZFTF9QQVRURVJOICAgICAgICAgICAgICAgICAgICAgICwgRlVMTCAgICAgLCAgIFJBVyAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgZXhwZWN0S2V5QXZhaWxhYmxlKGMsIENhbWVyYUNoYXJhY3RlcmlzdGljcy5TRU5TT1JfQ0FMSUJSQVRJT05fVFJBTlNGT1JNMSAgICAgICAgICAgICAgICAgICAsIE9QVCAgICAgICwgICBSQVcgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgIGV4cGVjdEtleUF2YWlsYWJsZShjLCBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuU0VOU09SX0NPTE9SX1RSQU5TRk9STTEgICAgICAgICAgICAgICAgICAgICAgICAgLCBPUFQgICAgICAsICAgUkFXICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICBleHBlY3RLZXlBdmFpbGFibGUoYywgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLlNFTlNPUl9GT1JXQVJEX01BVFJJWDEgICAgICAgICAgICAgICAgICAgICAgICAgICwgT1BUICAgICAgLCAgIFJBVyAgICAgICAgICAgICAgICAgICk7CkBAIC0zNjQsNyArMzk0LDYgQEAKICAgICAgICAgICAgICAgICBleHBlY3RLZXlBdmFpbGFibGUoYywgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLlNFTlNPUl9JTkZPX0NPTE9SX0ZJTFRFUl9BUlJBTkdFTUVOVCAgICAgICAgICAgICwgRlVMTCAgICAgLCAgIFJBVyAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgZXhwZWN0S2V5QXZhaWxhYmxlKGMsIENhbWVyYUNoYXJhY3RlcmlzdGljcy5TRU5TT1JfSU5GT19FWFBPU1VSRV9USU1FX1JBTkdFICAgICAgICAgICAgICAgICAsIEZVTEwgICAgICwgICBNQU5VQUxfU0VOU09SICAgICAgICApOwogICAgICAgICAgICAgICAgIGV4cGVjdEtleUF2YWlsYWJsZShjLCBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuU0VOU09SX0lORk9fTUFYX0ZSQU1FX0RVUkFUSU9OICAgICAgICAgICAgICAgICAgLCBGVUxMICAgICAsICAgTUFOVUFMX1NFTlNPUiAgICAgICAgKTsKLSAgICAgICAgICAgICAgICBleHBlY3RLZXlBdmFpbGFibGUoYywgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLlNFTlNPUl9JTkZPX1BIWVNJQ0FMX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICwgT1BUICAgICAgLCAgIEJDICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgZXhwZWN0S2V5QXZhaWxhYmxlKGMsIENhbWVyYUNoYXJhY3RlcmlzdGljcy5TRU5TT1JfSU5GT19QSVhFTF9BUlJBWV9TSVpFICAgICAgICAgICAgICAgICAgICAsIE9QVCAgICAgICwgICBCQyAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgIGV4cGVjdEtleUF2YWlsYWJsZShjLCBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuU0VOU09SX0lORk9fU0VOU0lUSVZJVFlfUkFOR0UgICAgICAgICAgICAgICAgICAgLCBGVUxMICAgICAsICAgTUFOVUFMX1NFTlNPUiAgICAgICAgKTsKICAgICAgICAgICAgICAgICBleHBlY3RLZXlBdmFpbGFibGUoYywgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLlNFTlNPUl9JTkZPX1dISVRFX0xFVkVMICAgICAgICAgICAgICAgICAgICAgICAgICwgT1BUICAgICAgLCAgIFJBVyAgICAgICAgICAgICAgICAgICk7CkBAIC00MDYsNiArNDM1LDMwIEBACiAgICAgICAgICAgICAgICAgZXhwZWN0S2V5QXZhaWxhYmxlKGMsCiAgICAgICAgICAgICAgICAgICAgICAgICBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuQ09OVFJPTF9QT1NUX1JBV19TRU5TSVRJVklUWV9CT09TVF9SQU5HRSwgT1BULCBCQyk7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEV4dGVybmFsIENhbWVyYSBleGNlcHRpb25hbCBrZXlzCisgICAgICAgICAgICBJbnRlZ2VyIGh3TGV2ZWwgPSBjLmdldChDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuSU5GT19TVVBQT1JURURfSEFSRFdBUkVfTEVWRUwpOworICAgICAgICAgICAgYm9vbGVhbiBpc0V4dGVybmFsQ2FtZXJhID0gKGh3TGV2ZWwgPT0KKyAgICAgICAgICAgICAgICAgICAgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLklORk9fU1VQUE9SVEVEX0hBUkRXQVJFX0xFVkVMX0VYVEVSTkFMKTsKKyAgICAgICAgICAgIGlmICghaXNFeHRlcm5hbENhbWVyYSkgeworICAgICAgICAgICAgICAgIGV4cGVjdEtleUF2YWlsYWJsZShjLCBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuTEVOU19JTkZPX0FWQUlMQUJMRV9GT0NBTF9MRU5HVEhTICAgICAgICAgICAgICAgLCBPUFQgICAgICAsICAgQkMgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICBleHBlY3RLZXlBdmFpbGFibGUoYywgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLlNFTlNPUl9BVkFJTEFCTEVfVEVTVF9QQVRURVJOX01PREVTICAgICAgICAgICAgICwgT1BUICAgICAgLCAgIEJDICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgZXhwZWN0S2V5QXZhaWxhYmxlKGMsIENhbWVyYUNoYXJhY3RlcmlzdGljcy5TRU5TT1JfSU5GT19QSFlTSUNBTF9TSVpFICAgICAgICAgICAgICAgICAgICAgICAsIE9QVCAgICAgICwgICBCQyAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8vIFZlcmlmeSB2ZXJzaW9uIGlzIGEgc2hvcnQgdGV4dCBzdHJpbmcuCisgICAgICAgICAgICBpZiAoYWxsS2V5cy5jb250YWlucyhDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuSU5GT19WRVJTSU9OKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBURVhUX1JFR0VYID0gIltcXHB7QWxudW19XFxwe1B1bmN0fVxccHtTcGFjZX1dKiI7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IE1BWF9WRVJTSU9OX0xFTkdUSCA9IDI1NjsKKworICAgICAgICAgICAgICAgIFN0cmluZyB2ZXJzaW9uID0gYy5nZXQoQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLklORk9fVkVSU0lPTik7CisgICAgICAgICAgICAgICAgbUNvbGxlY3Rvci5leHBlY3RUcnVlKCJWZXJzaW9uIGNvbnRhaW5zIG5vbi10ZXh0IGNoYXJhY3RlcnM6ICIgKyB2ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbi5tYXRjaGVzKFRFWFRfUkVHRVgpKTsKKyAgICAgICAgICAgICAgICBtQ29sbGVjdG9yLmV4cGVjdExlc3NPckVxdWFsKCJWZXJzaW9uIHRvbyBsb25nOiAiICsgdmVyc2lvbiwgTUFYX1ZFUlNJT05fTEVOR1RILAorICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbi5sZW5ndGgoKSk7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGNvdW50ZXIrKzsKICAgICAgICAgfQogICAgIH0KQEAgLTQ5Nyw2ICs1NTAsMjUgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBUZXN0IHZhbHVlcyBmb3IgdGhlIGF2YWlsYWJsZSBzZXNzaW9uIGtleXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFN0YXRpY1Nlc3Npb25LZXlzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzIGMgOiBtQ2hhcmFjdGVyaXN0aWNzKSB7CisgICAgICAgICAgICBMaXN0PENhcHR1cmVSZXF1ZXN0LktleTw/Pj4gYXZhaWxhYmxlU2Vzc2lvbktleXMgPSBjLmdldEF2YWlsYWJsZVNlc3Npb25LZXlzKCk7CisgICAgICAgICAgICBpZiAoYXZhaWxhYmxlU2Vzc2lvbktleXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTGlzdDxDYXB0dXJlUmVxdWVzdC5LZXk8Pz4+IGF2YWlsYWJsZVJlcXVlc3RLZXlzID0gYy5nZXRBdmFpbGFibGVDYXB0dXJlUmVxdWVzdEtleXMoKTsKKworICAgICAgICAgICAgLy9FdmVyeSBzZXNzaW9uIGtleSBzaG91bGQgYmUgcGFydCBvZiB0aGUgYXZhaWxhYmxlIHJlcXVlc3Qga2V5cworICAgICAgICAgICAgZm9yIChDYXB0dXJlUmVxdWVzdC5LZXk8Pz4ga2V5IDogYXZhaWxhYmxlU2Vzc2lvbktleXMpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJTZXNzaW9uIGtleToiICsga2V5LmdldE5hbWUoKSArICIgbm90IHByZXNlbnQgaW4gdGhlIGF2YWlsYWJsZSBjYXB0dXJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgInJlcXVlc3Qga2V5cyEiLCBhdmFpbGFibGVSZXF1ZXN0S2V5cy5jb250YWlucyhrZXkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgogICAgICAqIFRlc3QgdmFsdWVzIGZvciBzdGF0aWMgbWV0YWRhdGEgdXNlZCBieSB0aGUgQlVSU1QgY2FwYWJpbGl0eS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhdGljQnVyc3RDaGFyYWN0ZXJpc3RpY3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTgxMiw4ICs4ODQsNDEgQEAKIAogICAgICAgICAgICAgZmxvYXRbXSBwb3NlUm90YXRpb24gPSBjLmdldChDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuTEVOU19QT1NFX1JPVEFUSU9OKTsKICAgICAgICAgICAgIGZsb2F0W10gcG9zZVRyYW5zbGF0aW9uID0gYy5nZXQoQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLkxFTlNfUE9TRV9UUkFOU0xBVElPTik7CisgICAgICAgICAgICBJbnRlZ2VyIHBvc2VSZWZlcmVuY2UgPSBjLmdldChDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuTEVOU19QT1NFX1JFRkVSRU5DRSk7CiAgICAgICAgICAgICBmbG9hdFtdIGNhbWVyYUludHJpbnNpY3MgPSBjLmdldChDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuTEVOU19JTlRSSU5TSUNfQ0FMSUJSQVRJT04pOwotICAgICAgICAgICAgZmxvYXRbXSByYWRpYWxEaXN0b3J0aW9uID0gYy5nZXQoQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLkxFTlNfUkFESUFMX0RJU1RPUlRJT04pOworICAgICAgICAgICAgZmxvYXRbXSBkaXN0b3J0aW9uID0gZ2V0TGVuc0Rpc3RvcnRpb24oYyk7CisgICAgICAgICAgICBTaXplIHBpeGVsQXJyYXlTaXplID0gYy5nZXQoQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLlNFTlNPUl9JTkZPX1BJWEVMX0FSUkFZX1NJWkUpOworICAgICAgICAgICAgUmVjdCBwcmVjb3JyZWN0aW9uQXJyYXkgPSBjLmdldCgKKyAgICAgICAgICAgICAgICBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuU0VOU09SX0lORk9fUFJFX0NPUlJFQ1RJT05fQUNUSVZFX0FSUkFZX1NJWkUpOworICAgICAgICAgICAgUmVjdCBhY3RpdmVBcnJheSA9IGMuZ2V0KAorICAgICAgICAgICAgICAgIENhbWVyYUNoYXJhY3RlcmlzdGljcy5TRU5TT1JfSU5GT19BQ1RJVkVfQVJSQVlfU0laRSk7CisKKyAgICAgICAgICAgIC8vIExlZ2FjeSBkZXZpY2UgZG9lc24ndCBoYXZlIHByZUNvcnJlY3Rpb25BY3RpdmVBcnJheVNpemUgbWV0YWRhdGEuCisgICAgICAgICAgICBJbnRlZ2VyIGh3TGV2ZWwgPSBjLmdldChDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuSU5GT19TVVBQT1JURURfSEFSRFdBUkVfTEVWRUwpOworICAgICAgICAgICAgaWYgKGh3TGV2ZWwgIT0gTEVHQUNZKSB7CisgICAgICAgICAgICAgICAgLy8gVmVyaWZ5IHByZS1jb3JyZWN0aW9uIGFycmF5IGVuY2xvc2VzIGFjdGl2ZSBhcnJheQorICAgICAgICAgICAgICAgIG1Db2xsZWN0b3IuZXhwZWN0VHJ1ZSgicHJlQ29ycmVjdGlvbkFycmF5IFsiICsgcHJlY29ycmVjdGlvbkFycmF5LmxlZnQgKyAiLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZWNvcnJlY3Rpb25BcnJheS50b3AgKyAiLCAiICsgcHJlY29ycmVjdGlvbkFycmF5LnJpZ2h0ICsgIiwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICBwcmVjb3JyZWN0aW9uQXJyYXkuYm90dG9tICsgIl0gZG9lcyBub3QgZW5jbG9zZSBhY3RpdmVBcnJheVsiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZUFycmF5LmxlZnQgKyAiLCAiICsgYWN0aXZlQXJyYXkudG9wICsgIiwgIiArIGFjdGl2ZUFycmF5LnJpZ2h0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIsICIgKyBhY3RpdmVBcnJheS5ib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICBwcmVjb3JyZWN0aW9uQXJyYXkuY29udGFpbnMoYWN0aXZlQXJyYXkubGVmdCwgYWN0aXZlQXJyYXkudG9wKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgcHJlY29ycmVjdGlvbkFycmF5LmNvbnRhaW5zKGFjdGl2ZUFycmF5LnJpZ2h0LTEsIGFjdGl2ZUFycmF5LmJvdHRvbS0xKSk7CisKKyAgICAgICAgICAgICAgICAvLyBWZXJpZnkgcGl4ZWwgYXJyYXkgZW5jbG9zZXMgcHJlLWNvcnJlY3Rpb24gYXJyYXkKKyAgICAgICAgICAgICAgICBtQ29sbGVjdG9yLmV4cGVjdFRydWUoInByZUNvcnJlY3Rpb25BcnJheSBbIiArIHByZWNvcnJlY3Rpb25BcnJheS5sZWZ0ICsgIiwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICBwcmVjb3JyZWN0aW9uQXJyYXkudG9wICsgIiwgIiArIHByZWNvcnJlY3Rpb25BcnJheS5yaWdodCArICIsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgcHJlY29ycmVjdGlvbkFycmF5LmJvdHRvbSArICJdIGlzbid0IGVuY2xvc2VkIGJ5IHBpeGVsQXJyYXlbIiArCisgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbEFycmF5U2l6ZS5nZXRXaWR0aCgpICsgIiwgIiArIHBpeGVsQXJyYXlTaXplLmdldEhlaWdodCgpICsgIl0iLAorICAgICAgICAgICAgICAgICAgICAgICAgcHJlY29ycmVjdGlvbkFycmF5LmxlZnQgPj0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgcHJlY29ycmVjdGlvbkFycmF5LmxlZnQgPCBwaXhlbEFycmF5U2l6ZS5nZXRXaWR0aCgpICYmCisgICAgICAgICAgICAgICAgICAgICAgICBwcmVjb3JyZWN0aW9uQXJyYXkucmlnaHQgPiAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICBwcmVjb3JyZWN0aW9uQXJyYXkucmlnaHQgPD0gcGl4ZWxBcnJheVNpemUuZ2V0V2lkdGgoKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgcHJlY29ycmVjdGlvbkFycmF5LnRvcCA+PSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICBwcmVjb3JyZWN0aW9uQXJyYXkudG9wIDwgcGl4ZWxBcnJheVNpemUuZ2V0SGVpZ2h0KCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZWNvcnJlY3Rpb25BcnJheS5ib3R0b20gPiAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICBwcmVjb3JyZWN0aW9uQXJyYXkuYm90dG9tIDw9IHBpeGVsQXJyYXlTaXplLmdldEhlaWdodCgpKTsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKHN1cHBvcnREZXB0aCkgewogICAgICAgICAgICAgICAgIG1Db2xsZWN0b3IuZXhwZWN0VHJ1ZSgiU3VwcG9ydHMgREVQVEhfT1VUUFVUIGJ1dCBkb2VzIG5vdCBzdXBwb3J0IERFUFRIMTYiLApAQCAtODY3LDcwICs5NzIsMTQgQEAKICAgICAgICAgICAgICAgICBtQ29sbGVjdG9yLmV4cGVjdFRydWUoIlN1cHBvcnRzIERFUFRIX09VVFBVVCBidXQgREVQVEhfSVNfRVhDTFVTSVZFIGlzIG5vdCBkZWZpbmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoSXNFeGNsdXNpdmUgIT0gbnVsbCk7CiAKLSAgICAgICAgICAgICAgICBtQ29sbGVjdG9yLmV4cGVjdFRydWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAiU3VwcG9ydHMgREVQVEhfT1VUUFVUIGJ1dCBMRU5TX1BPU0VfUk9UQVRJT04gbm90IHJpZ2h0IHNpemUiLAotICAgICAgICAgICAgICAgICAgICAgICAgcG9zZVJvdGF0aW9uICE9IG51bGwgJiYgcG9zZVJvdGF0aW9uLmxlbmd0aCA9PSA0KTsKLSAgICAgICAgICAgICAgICBtQ29sbGVjdG9yLmV4cGVjdFRydWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAiU3VwcG9ydHMgREVQVEhfT1VUUFVUIGJ1dCBMRU5TX1BPU0VfVFJBTlNMQVRJT04gbm90IHJpZ2h0IHNpemUiLAotICAgICAgICAgICAgICAgICAgICAgICAgcG9zZVRyYW5zbGF0aW9uICE9IG51bGwgJiYgcG9zZVRyYW5zbGF0aW9uLmxlbmd0aCA9PSAzKTsKLSAgICAgICAgICAgICAgICBtQ29sbGVjdG9yLmV4cGVjdFRydWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAiU3VwcG9ydHMgREVQVEhfT1VUUFVUIGJ1dCBMRU5TX0lOVFJJTlNJQ19DQUxJQlJBVElPTiBub3QgcmlnaHQgc2l6ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFJbnRyaW5zaWNzICE9IG51bGwgJiYgY2FtZXJhSW50cmluc2ljcy5sZW5ndGggPT0gNSk7Ci0gICAgICAgICAgICAgICAgbUNvbGxlY3Rvci5leHBlY3RUcnVlKAotICAgICAgICAgICAgICAgICAgICAgICAgIlN1cHBvcnRzIERFUFRIX09VVFBVVCBidXQgTEVOU19SQURJQUxfRElTVE9SVElPTiBub3QgcmlnaHQgc2l6ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICByYWRpYWxEaXN0b3J0aW9uICE9IG51bGwgJiYgcmFkaWFsRGlzdG9ydGlvbi5sZW5ndGggPT0gNik7Ci0KLSAgICAgICAgICAgICAgICBpZiAocG9zZVJvdGF0aW9uICE9IG51bGwgJiYgcG9zZVJvdGF0aW9uLmxlbmd0aCA9PSA0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGZsb2F0IG5vcm1TcSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwb3NlUm90YXRpb25bMF0gKiBwb3NlUm90YXRpb25bMF0gKwotICAgICAgICAgICAgICAgICAgICAgICAgcG9zZVJvdGF0aW9uWzFdICogcG9zZVJvdGF0aW9uWzFdICsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBvc2VSb3RhdGlvblsyXSAqIHBvc2VSb3RhdGlvblsyXSArCi0gICAgICAgICAgICAgICAgICAgICAgICBwb3NlUm90YXRpb25bM10gKiBwb3NlUm90YXRpb25bM107Ci0gICAgICAgICAgICAgICAgICAgIG1Db2xsZWN0b3IuZXhwZWN0VHJ1ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEVOU19QT1NFX1JPVEFUSU9OIHF1YXJ0ZXJuaW9uIG11c3QgYmUgdW5pdC1sZW5ndGgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5OWYgPCBub3JtU3EgJiYgbm9ybVNxIDwgMS4wMDAxZik7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogQ3Jvc3MtdmFsaWRhdGUgb3JpZW50YXRpb24vZmFjaW5nIGFuZCBwb3NlUm90YXRpb24KLSAgICAgICAgICAgICAgICAgICAgSW50ZWdlciBvcmllbnRhdGlvbiA9IGMuZ2V0KENhbWVyYUNoYXJhY3RlcmlzdGljcy5TRU5TT1JfT1JJRU5UQVRJT04pOwotICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyIGZhY2luZyA9IGMuZ2V0KENhbWVyYUNoYXJhY3RlcmlzdGljcy5MRU5TX0ZBQ0lORyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHBvc2VUcmFuc2xhdGlvbiAhPSBudWxsICYmIHBvc2VUcmFuc2xhdGlvbi5sZW5ndGggPT0gMykgewotICAgICAgICAgICAgICAgICAgICBmbG9hdCBub3JtU3EgPQotICAgICAgICAgICAgICAgICAgICAgICAgcG9zZVRyYW5zbGF0aW9uWzBdICogcG9zZVRyYW5zbGF0aW9uWzBdICsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBvc2VUcmFuc2xhdGlvblsxXSAqIHBvc2VUcmFuc2xhdGlvblsxXSArCi0gICAgICAgICAgICAgICAgICAgICAgICBwb3NlVHJhbnNsYXRpb25bMl0gKiBwb3NlVHJhbnNsYXRpb25bMl07Ci0gICAgICAgICAgICAgICAgICAgIG1Db2xsZWN0b3IuZXhwZWN0VHJ1ZSgiUG9zZSB0cmFuc2xhdGlvbiBpcyBsYXJnZXIgdGhhbiAxIG0iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1TcSA8IDEuZik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgUmVjdCBwcmVjb3JyZWN0aW9uQXJyYXkgPQotICAgICAgICAgICAgICAgICAgICBjLmdldChDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuU0VOU09SX0lORk9fUFJFX0NPUlJFQ1RJT05fQUNUSVZFX0FSUkFZX1NJWkUpOwotICAgICAgICAgICAgICAgIG1Db2xsZWN0b3IuZXhwZWN0VHJ1ZSgiU3VwcG9ydHMgREVQVEhfT1VUUFVUIGJ1dCBkb2VzIG5vdCBoYXZlICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgInByZWNvcnJlY3Rpb24gYWN0aXZlIGFycmF5IGRlZmluZWQiLCBwcmVjb3JyZWN0aW9uQXJyYXkgIT0gbnVsbCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY2FtZXJhSW50cmluc2ljcyAhPSBudWxsICYmIHByZWNvcnJlY3Rpb25BcnJheSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZsb2F0IGZ4ID0gY2FtZXJhSW50cmluc2ljc1swXTsKLSAgICAgICAgICAgICAgICAgICAgZmxvYXQgZnkgPSBjYW1lcmFJbnRyaW5zaWNzWzFdOwotICAgICAgICAgICAgICAgICAgICBmbG9hdCBjeCA9IGNhbWVyYUludHJpbnNpY3NbMl07Ci0gICAgICAgICAgICAgICAgICAgIGZsb2F0IGN5ID0gY2FtZXJhSW50cmluc2ljc1szXTsKLSAgICAgICAgICAgICAgICAgICAgZmxvYXQgcyA9IGNhbWVyYUludHJpbnNpY3NbNF07Ci0gICAgICAgICAgICAgICAgICAgIG1Db2xsZWN0b3IuZXhwZWN0VHJ1ZSgiT3B0aWNhbCBjZW50ZXIgZXhwZWN0ZWQgdG8gYmUgd2l0aGluIHByZWNvcnJlY3Rpb24gYXJyYXkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgPD0gY3ggJiYgY3ggPCBwcmVjb3JyZWN0aW9uQXJyYXkud2lkdGgoKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgPD0gY3kgJiYgY3kgPCBwcmVjb3JyZWN0aW9uQXJyYXkuaGVpZ2h0KCkpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IFZlcmlmeSBmb2NhbCBsZW5ndGhzIGFuZCBza2V3IGFyZSByZWFzb25hYmxlCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHJhZGlhbERpc3RvcnRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBWZXJpZnkgcmFkaWFsIGRpc3RvcnRpb24KLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdmVyaWZ5TGVuc0NhbGlicmF0aW9uKHBvc2VSb3RhdGlvbiwgcG9zZVRyYW5zbGF0aW9uLCBwb3NlUmVmZXJlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhSW50cmluc2ljcywgZGlzdG9ydGlvbiwgcHJlY29ycmVjdGlvbkFycmF5KTsKIAogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBib29sZWFuIGhhc0ZpZWxkcyA9CiAgICAgICAgICAgICAgICAgICAgIGhhc0RlcHRoMTYgJiYgKHBvc2VUcmFuc2xhdGlvbiAhPSBudWxsKSAmJgogICAgICAgICAgICAgICAgICAgICAocG9zZVJvdGF0aW9uICE9IG51bGwpICYmIChjYW1lcmFJbnRyaW5zaWNzICE9IG51bGwpICYmCi0gICAgICAgICAgICAgICAgICAgIChyYWRpYWxEaXN0b3J0aW9uICE9IG51bGwpICYmIChkZXB0aElzRXhjbHVzaXZlICE9IG51bGwpOworICAgICAgICAgICAgICAgICAgICAoZGlzdG9ydGlvbiAhPSBudWxsKSAmJiAoZGVwdGhJc0V4Y2x1c2l2ZSAhPSBudWxsKTsKIAogICAgICAgICAgICAgICAgIG1Db2xsZWN0b3IuZXhwZWN0VHJ1ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICJBbGwgbmVjZXNzYXJ5IGRlcHRoIGZpZWxkcyBkZWZpbmVkLCBidXQgREVQVEhfT1VUUFVUIGNhcGFiaWxpdHkgaXMgbm90IGxpc3RlZCIsCkBAIC05NDAsNiArOTg5LDg0IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5TGVuc0NhbGlicmF0aW9uKGZsb2F0W10gcG9zZVJvdGF0aW9uLCBmbG9hdFtdIHBvc2VUcmFuc2xhdGlvbiwKKyAgICAgICAgICAgIEludGVnZXIgcG9zZVJlZmVyZW5jZSwgZmxvYXRbXSBjYW1lcmFJbnRyaW5zaWNzLCBmbG9hdFtdIGRpc3RvcnRpb24sCisgICAgICAgICAgICBSZWN0IHByZWNvcnJlY3Rpb25BcnJheSkgeworCisgICAgICAgIG1Db2xsZWN0b3IuZXhwZWN0VHJ1ZSgKKyAgICAgICAgICAgICJMRU5TX1BPU0VfUk9UQVRJT04gbm90IHJpZ2h0IHNpemUiLAorICAgICAgICAgICAgcG9zZVJvdGF0aW9uICE9IG51bGwgJiYgcG9zZVJvdGF0aW9uLmxlbmd0aCA9PSA0KTsKKyAgICAgICAgbUNvbGxlY3Rvci5leHBlY3RUcnVlKAorICAgICAgICAgICAgIkxFTlNfUE9TRV9UUkFOU0xBVElPTiBub3QgcmlnaHQgc2l6ZSIsCisgICAgICAgICAgICBwb3NlVHJhbnNsYXRpb24gIT0gbnVsbCAmJiBwb3NlVHJhbnNsYXRpb24ubGVuZ3RoID09IDMpOworICAgICAgICBtQ29sbGVjdG9yLmV4cGVjdFRydWUoCisgICAgICAgICAgICAiTEVOU19QT1NFX1JFRkVSRU5DRSBpcyBub3QgZGVmaW5lZCIsCisgICAgICAgICAgICBwb3NlUmVmZXJlbmNlICE9IG51bGwpOworICAgICAgICBtQ29sbGVjdG9yLmV4cGVjdFRydWUoCisgICAgICAgICAgICAiTEVOU19JTlRSSU5TSUNfQ0FMSUJSQVRJT04gbm90IHJpZ2h0IHNpemUiLAorICAgICAgICAgICAgY2FtZXJhSW50cmluc2ljcyAhPSBudWxsICYmIGNhbWVyYUludHJpbnNpY3MubGVuZ3RoID09IDUpOworICAgICAgICBtQ29sbGVjdG9yLmV4cGVjdFRydWUoCisgICAgICAgICAgICAiTEVOU19ESVNUT1JUSU9OIG5vdCByaWdodCBzaXplIiwKKyAgICAgICAgICAgIGRpc3RvcnRpb24gIT0gbnVsbCAmJiBkaXN0b3J0aW9uLmxlbmd0aCA9PSA2KTsKKworICAgICAgICBpZiAocG9zZVJvdGF0aW9uICE9IG51bGwgJiYgcG9zZVJvdGF0aW9uLmxlbmd0aCA9PSA0KSB7CisgICAgICAgICAgICBmbG9hdCBub3JtU3EgPQorICAgICAgICAgICAgICAgICAgICBwb3NlUm90YXRpb25bMF0gKiBwb3NlUm90YXRpb25bMF0gKworICAgICAgICAgICAgICAgICAgICBwb3NlUm90YXRpb25bMV0gKiBwb3NlUm90YXRpb25bMV0gKworICAgICAgICAgICAgICAgICAgICBwb3NlUm90YXRpb25bMl0gKiBwb3NlUm90YXRpb25bMl0gKworICAgICAgICAgICAgICAgICAgICBwb3NlUm90YXRpb25bM10gKiBwb3NlUm90YXRpb25bM107CisgICAgICAgICAgICBtQ29sbGVjdG9yLmV4cGVjdFRydWUoCisgICAgICAgICAgICAgICAgIkxFTlNfUE9TRV9ST1RBVElPTiBxdWFydGVybmlvbiBtdXN0IGJlIHVuaXQtbGVuZ3RoIiwKKyAgICAgICAgICAgICAgICAwLjk5OTlmIDwgbm9ybVNxICYmIG5vcm1TcSA8IDEuMDAwMWYpOworCisgICAgICAgICAgICAvLyBUT0RPOiBDcm9zcy12YWxpZGF0ZSBvcmllbnRhdGlvbi9mYWNpbmcgYW5kIHBvc2VSb3RhdGlvbgorICAgICAgICB9CisKKyAgICAgICAgaWYgKHBvc2VUcmFuc2xhdGlvbiAhPSBudWxsICYmIHBvc2VUcmFuc2xhdGlvbi5sZW5ndGggPT0gMykgeworICAgICAgICAgICAgZmxvYXQgbm9ybVNxID0KKyAgICAgICAgICAgICAgICAgICAgcG9zZVRyYW5zbGF0aW9uWzBdICogcG9zZVRyYW5zbGF0aW9uWzBdICsKKyAgICAgICAgICAgICAgICAgICAgcG9zZVRyYW5zbGF0aW9uWzFdICogcG9zZVRyYW5zbGF0aW9uWzFdICsKKyAgICAgICAgICAgICAgICAgICAgcG9zZVRyYW5zbGF0aW9uWzJdICogcG9zZVRyYW5zbGF0aW9uWzJdOworICAgICAgICAgICAgbUNvbGxlY3Rvci5leHBlY3RUcnVlKCJQb3NlIHRyYW5zbGF0aW9uIGlzIGxhcmdlciB0aGFuIDEgbSIsCisgICAgICAgICAgICAgICAgICAgIG5vcm1TcSA8IDEuZik7CisgICAgICAgIH0KKworICAgICAgICBpZiAocG9zZVJlZmVyZW5jZSAhPSBudWxsKSB7CisgICAgICAgICAgICBpbnQgcmVmID0gcG9zZVJlZmVyZW5jZTsKKyAgICAgICAgICAgIGJvb2xlYW4gdmFsaWRSZWZlcmVuY2UgPSBmYWxzZTsKKyAgICAgICAgICAgIHN3aXRjaCAocmVmKSB7CisgICAgICAgICAgICAgICAgY2FzZSBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuTEVOU19QT1NFX1JFRkVSRU5DRV9QUklNQVJZX0NBTUVSQToKKyAgICAgICAgICAgICAgICBjYXNlIENhbWVyYUNoYXJhY3RlcmlzdGljcy5MRU5TX1BPU0VfUkVGRVJFTkNFX0dZUk9TQ09QRToKKyAgICAgICAgICAgICAgICAgICAgLy8gQWxsb3dlZCB2YWx1ZXMKKyAgICAgICAgICAgICAgICAgICAgdmFsaWRSZWZlcmVuY2UgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNvbGxlY3Rvci5leHBlY3RUcnVlKCJQT1NFX1JFRkVSRU5DRSBoYXMgdW5rbm93biB2YWx1ZSIsIHZhbGlkUmVmZXJlbmNlKTsKKyAgICAgICAgfQorCisgICAgICAgIG1Db2xsZWN0b3IuZXhwZWN0VHJ1ZSgiRG9lcyBub3QgaGF2ZSBwcmVjb3JyZWN0aW9uIGFjdGl2ZSBhcnJheSBkZWZpbmVkIiwKKyAgICAgICAgICAgICAgICBwcmVjb3JyZWN0aW9uQXJyYXkgIT0gbnVsbCk7CisKKyAgICAgICAgaWYgKGNhbWVyYUludHJpbnNpY3MgIT0gbnVsbCAmJiBwcmVjb3JyZWN0aW9uQXJyYXkgIT0gbnVsbCkgeworICAgICAgICAgICAgZmxvYXQgZnggPSBjYW1lcmFJbnRyaW5zaWNzWzBdOworICAgICAgICAgICAgZmxvYXQgZnkgPSBjYW1lcmFJbnRyaW5zaWNzWzFdOworICAgICAgICAgICAgZmxvYXQgY3ggPSBjYW1lcmFJbnRyaW5zaWNzWzJdOworICAgICAgICAgICAgZmxvYXQgY3kgPSBjYW1lcmFJbnRyaW5zaWNzWzNdOworICAgICAgICAgICAgZmxvYXQgcyA9IGNhbWVyYUludHJpbnNpY3NbNF07CisgICAgICAgICAgICBtQ29sbGVjdG9yLmV4cGVjdFRydWUoIk9wdGljYWwgY2VudGVyIGV4cGVjdGVkIHRvIGJlIHdpdGhpbiBwcmVjb3JyZWN0aW9uIGFycmF5IiwKKyAgICAgICAgICAgICAgICAgICAgMCA8PSBjeCAmJiBjeCA8IHByZWNvcnJlY3Rpb25BcnJheS53aWR0aCgpICYmCisgICAgICAgICAgICAgICAgICAgIDAgPD0gY3kgJiYgY3kgPCBwcmVjb3JyZWN0aW9uQXJyYXkuaGVpZ2h0KCkpOworCisgICAgICAgICAgICAvLyBUT0RPOiBWZXJpZnkgZm9jYWwgbGVuZ3RocyBhbmQgc2tldyBhcmUgcmVhc29uYWJsZQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGRpc3RvcnRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gVE9ETzogVmVyaWZ5IHJhZGlhbCBkaXN0b3J0aW9uCisgICAgICAgIH0KKworICAgIH0KKwogICAgIC8qKgogICAgICAqIENyb3NzLWNoZWNrIFN0cmVhbUNvbmZpZ3VyYXRpb25NYXAgb3V0cHV0CiAgICAgICovCkBAIC0xMzAzLDYgKzE0MzAsMTI2IEBACiAgICAgICAgICAgICBjb3VudGVyKys7CiAgICAgICAgIH0KICAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayBMb2dpY2FsIGNhbWVyYSBjYXBhYmlsaXR5CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdExvZ2ljYWxDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IGNvdW50ZXIgPSAwOworICAgICAgICBMaXN0PFN0cmluZz4gY2FtZXJhSWRMaXN0ID0gQXJyYXlzLmFzTGlzdChtSWRzKTsKKworICAgICAgICBmb3IgKENhbWVyYUNoYXJhY3RlcmlzdGljcyBjIDogbUNoYXJhY3RlcmlzdGljcykgeworICAgICAgICAgICAgaW50W10gY2FwYWJpbGl0aWVzID0gQ2FtZXJhVGVzdFV0aWxzLmdldFZhbHVlTm90TnVsbCgKKyAgICAgICAgICAgICAgICAgICAgYywgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLlJFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUyk7CisgICAgICAgICAgICBib29sZWFuIHN1cHBvcnRMb2dpY2FsQ2FtZXJhID0gYXJyYXlDb250YWlucyhjYXBhYmlsaXRpZXMsCisgICAgICAgICAgICAgICAgICAgIENhbWVyYUNoYXJhY3RlcmlzdGljcy5SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfTE9HSUNBTF9NVUxUSV9DQU1FUkEpOworICAgICAgICAgICAgaWYgKHN1cHBvcnRMb2dpY2FsQ2FtZXJhKSB7CisgICAgICAgICAgICAgICAgU2V0PFN0cmluZz4gcGh5c2ljYWxDYW1lcmFJZHMgPSBjLmdldFBoeXNpY2FsQ2FtZXJhSWRzKCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiYW5kcm9pZC5sb2dpY2FsQ2FtLnBoeXNpY2FsQ2FtZXJhSWRzIHNob3VsZG4ndCBiZSBudWxsIiwKKyAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZHMpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkxvZ2ljYWwgY2FtZXJhIG11c3QgY29udGFpbiBhdCBsZWFzdCAyIHBoeXNpY2FsIGNhbWVyYSBpZHMiLAorICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkcy5zaXplKCkgPj0gMik7CisKKyAgICAgICAgICAgICAgICBtQ29sbGVjdG9yLmV4cGVjdEtleVZhbHVlSW5SYW5nZShjLAorICAgICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLkxPR0lDQUxfTVVMVElfQ0FNRVJBX1NFTlNPUl9TWU5DX1RZUEUsCisgICAgICAgICAgICAgICAgICAgICAgICBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuTE9HSUNBTF9NVUxUSV9DQU1FUkFfU0VOU09SX1NZTkNfVFlQRV9BUFBST1hJTUFURSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENhbWVyYUNoYXJhY3RlcmlzdGljcy5MT0dJQ0FMX01VTFRJX0NBTUVSQV9TRU5TT1JfU1lOQ19UWVBFX0NBTElCUkFURUQpOworCisgICAgICAgICAgICAgICAgSW50ZWdlciB0aW1lc3RhbXBTb3VyY2UgPSBjLmdldChDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuU0VOU09SX0lORk9fVElNRVNUQU1QX1NPVVJDRSk7CisgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgcGh5c2ljYWxDYW1lcmFJZCA6IHBoeXNpY2FsQ2FtZXJhSWRzKSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIlBoeXNpY2FsIGNhbWVyYSBpZCBzaG91bGRuJ3QgYmUgbnVsbCIsIHBoeXNpY2FsQ2FtZXJhSWQpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIlBoeXNpY2FsIGNhbWVyYSBpZCAlcyBzaG91bGRuJ3QgYmUgdGhlIHNhbWUgYXMgbG9naWNhbCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBjYW1lcmEgaWQgJXMiLCBwaHlzaWNhbENhbWVyYUlkLCBtSWRzW2NvdW50ZXJdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkICE9IG1JZHNbY291bnRlcl0pOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIlBoeXNpY2FsIGNhbWVyYSBpZCAlcyBzaG91bGQgYmUgaW4gYXZhaWxhYmxlIGNhbWVyYSBpZHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWRMaXN0LmNvbnRhaW5zKHBoeXNpY2FsQ2FtZXJhSWQpKTsKKworICAgICAgICAgICAgICAgICAgICAvL3ZhbGlkYXRpb24gZm9yIGRlcHRoIHN0YXRpYyBtZXRhZGF0YSBvZiBwaHlzaWNhbCBjYW1lcmFzCisgICAgICAgICAgICAgICAgICAgIENhbWVyYUNoYXJhY3RlcmlzdGljcyBwYyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhbWVyYU1hbmFnZXIuZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKHBoeXNpY2FsQ2FtZXJhSWQpOworCisgICAgICAgICAgICAgICAgICAgIGZsb2F0W10gcG9zZVJvdGF0aW9uID0gcGMuZ2V0KENhbWVyYUNoYXJhY3RlcmlzdGljcy5MRU5TX1BPU0VfUk9UQVRJT04pOworICAgICAgICAgICAgICAgICAgICBmbG9hdFtdIHBvc2VUcmFuc2xhdGlvbiA9IHBjLmdldChDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuTEVOU19QT1NFX1RSQU5TTEFUSU9OKTsKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlciBwb3NlUmVmZXJlbmNlID0gcGMuZ2V0KENhbWVyYUNoYXJhY3RlcmlzdGljcy5MRU5TX1BPU0VfUkVGRVJFTkNFKTsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXRbXSBjYW1lcmFJbnRyaW5zaWNzID0gcGMuZ2V0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbWVyYUNoYXJhY3RlcmlzdGljcy5MRU5TX0lOVFJJTlNJQ19DQUxJQlJBVElPTik7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0W10gZGlzdG9ydGlvbiA9IGdldExlbnNEaXN0b3J0aW9uKHBjKTsKKyAgICAgICAgICAgICAgICAgICAgUmVjdCBwcmVjb3JyZWN0aW9uQXJyYXkgPSBwYy5nZXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLlNFTlNPUl9JTkZPX1BSRV9DT1JSRUNUSU9OX0FDVElWRV9BUlJBWV9TSVpFKTsKKworICAgICAgICAgICAgICAgICAgICB2ZXJpZnlMZW5zQ2FsaWJyYXRpb24ocG9zZVJvdGF0aW9uLCBwb3NlVHJhbnNsYXRpb24sIHBvc2VSZWZlcmVuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhSW50cmluc2ljcywgZGlzdG9ydGlvbiwgcHJlY29ycmVjdGlvbkFycmF5KTsKKworICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyIHRpbWVzdGFtcFNvdXJjZVBoeXNpY2FsID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYy5nZXQoQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLlNFTlNPUl9JTkZPX1RJTUVTVEFNUF9TT1VSQ0UpOworICAgICAgICAgICAgICAgICAgICBtQ29sbGVjdG9yLmV4cGVjdEVxdWFscygiTG9naWNhbCBjYW1lcmEgYW5kIHBoeXNpY2FsIGNhbWVyYXMgbXVzdCBoYXZlIHNhbWUgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpbWVzdGFtcCBzb3VyY2UiLCB0aW1lc3RhbXBTb3VyY2UsIHRpbWVzdGFtcFNvdXJjZVBoeXNpY2FsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb3VudGVyKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayBtb25vY2hyb21lIGNhbWVyYSBjYXBhYmlsaXR5CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdE1vbm9jaHJvbWVDaGFyYWN0ZXJpc3RpY3MoKSB7CisgICAgICAgIGludCBjb3VudGVyID0gMDsKKworICAgICAgICBmb3IgKENhbWVyYUNoYXJhY3RlcmlzdGljcyBjIDogbUNoYXJhY3RlcmlzdGljcykgeworICAgICAgICAgICAgTG9nLmkoVEFHLCAidGVzdE1vbm9jaHJvbWVDaGFyYWN0ZXJpc3RpY3M6IFRlc3RpbmcgY2FtZXJhIElEICIgKyBtSWRzW2NvdW50ZXJdKTsKKworICAgICAgICAgICAgaW50W10gY2FwYWJpbGl0aWVzID0gYy5nZXQoQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLlJFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUyk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJhbmRyb2lkLnJlcXVlc3QuYXZhaWxhYmxlQ2FwYWJpbGl0aWVzIG11c3QgbmV2ZXIgYmUgbnVsbCIsCisgICAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdGllcyk7CisgICAgICAgICAgICBib29sZWFuIHN1cHBvcnRNb25vY2hyb21lID0gYXJyYXlDb250YWlucyhjYXBhYmlsaXRpZXMsIE1PTk9DSFJPTUUpOworCisgICAgICAgICAgICBpZiAoIXN1cHBvcnRNb25vY2hyb21lKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFzc2VydFRydWUoIk1vbm9jaHJvbWUgY2FtZXJhIG11c3QgaGF2ZSBCQUNLV0FSRF9DT01QQVRJQkxFIGNhcGFiaWxpdHkiLAorICAgICAgICAgICAgICAgICAgICBhcnJheUNvbnRhaW5zKGNhcGFiaWxpdGllcywgQkMpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIk1vbm9jaHJvbWUgY2FtZXJhIG11c3Qgbm90IGhhdmUgUkFXIGNhcGFiaWxpdHkiLAorICAgICAgICAgICAgICAgICAgICAhYXJyYXlDb250YWlucyhjYXBhYmlsaXRpZXMsIFJBVykpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiTW9ub2Nocm9tZSBjYW1lcmEgbXVzdCBub3QgaGF2ZSBNQU5VQUxfUE9TVF9QUk9DRVNTSU5HIGNhcGFiaWxpdHkiLAorICAgICAgICAgICAgICAgICAgICAhYXJyYXlDb250YWlucyhjYXBhYmlsaXRpZXMsIE1BTlVBTF9QT1NUUFJPQykpOworCisgICAgICAgICAgICAvLyBDaGVjayB0aGF0IGF3YlN1cHBvcnRlZE1vZGVzIG9ubHkgY29udGFpbnMgQVVUTworICAgICAgICAgICAgaW50W10gYXdiQXZhaWxhYmxlTW9kZXMgPSBjLmdldChDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuQ09OVFJPTF9BV0JfQVZBSUxBQkxFX01PREVTKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImF2YWlsYWJsZUF3Yk1vZGVzIG11c3Qgbm90IGJlIG51bGwiLCBhd2JBdmFpbGFibGVNb2RlcyAhPSBudWxsKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImF2YWlsYWJsZUF3Yk1vZGVzIG11c3QgY29udGFpbiBvbmx5IEFVVE8iLCBhd2JBdmFpbGFibGVNb2Rlcy5sZW5ndGggPT0gMSAmJgorICAgICAgICAgICAgICAgICAgICBhd2JBdmFpbGFibGVNb2Rlc1swXSA9PSBDYXB0dXJlUmVxdWVzdC5DT05UUk9MX0FXQl9NT0RFX0FVVE8pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGxlbnMgZGlzdG9ydGlvbiBjb2VmZmljaWVudHMsIGFzIGEgbGlzdCBvZiA2IGZsb2F0czsgcmV0dXJucyBudWxsIGlmIG5vIHZhbGlkCisgICAgICogZGlzdG9ydGlvbiBmaWVsZCBpcyBhdmFpbGFibGUKKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0W10gZ2V0TGVuc0Rpc3RvcnRpb24oQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzIGMpIHsKKyAgICAgICAgZmxvYXRbXSBkaXN0b3J0aW9uID0gbnVsbDsKKyAgICAgICAgZmxvYXRbXSBuZXdEaXN0b3J0aW9uID0gYy5nZXQoQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLkxFTlNfRElTVE9SVElPTik7CisgICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLkZJUlNUX1NES19JTlQgPiBCdWlsZC5WRVJTSU9OX0NPREVTLk9fTVIxIHx8IG5ld0Rpc3RvcnRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gTmV3IGRldmljZXMgbmVlZCB0byB1c2UgZml4ZWQgcmFkaWFsIGRpc3RvcnRpb24gZGVmaW5pdGlvbjsgb2xkIGRldmljZXMgY2FuCisgICAgICAgICAgICAvLyBvcHQtaW4gdG8gaXQKKyAgICAgICAgICAgIGlmIChuZXdEaXN0b3J0aW9uICE9IG51bGwgJiYgbmV3RGlzdG9ydGlvbi5sZW5ndGggPT0gNSkgeworICAgICAgICAgICAgICAgIGRpc3RvcnRpb24gPSBuZXcgZmxvYXRbNl07CisgICAgICAgICAgICAgICAgZGlzdG9ydGlvblswXSA9IDEuMGY7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCA2OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZGlzdG9ydGlvbltpXSA9IG5ld0Rpc3RvcnRpb25baS0xXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBTZWxlY3Qgb2xkIGZpZWxkIG9ubHkgaWYgb24gb2xkZXIgZmlyc3QgU0RLIGFuZCBuZXcgZGVmaW5pdGlvbiBub3QgYXZhaWxhYmxlCisgICAgICAgICAgICBkaXN0b3J0aW9uID0gYy5nZXQoQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLkxFTlNfUkFESUFMX0RJU1RPUlRJT04pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBkaXN0b3J0aW9uOworICAgIH0KKwogICAgIC8qKgogICAgICAqIENyZWF0ZSBhbiBpbnZhbGlkIHNpemUgdGhhdCdzIGNsb3NlIHRvIG9uZSBvZiB0aGUgZ29vZCBzaXplcyBpbiB0aGUgbGlzdCwgYnV0IG5vdCBvbmUgb2YgdGhlbQogICAgICAqLwpAQCAtMTQ3NSwxNyArMTcyMiwxNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLk1BWF9WQUxVRTsKICAgICAgICAgICAgIGNhc2UgTEVHQUNZOgogICAgICAgICAgICAgICAgIHJldHVybiAwOyAvLyBsb3dlc3QKLSAgICAgICAgICAgIGNhc2UgTElNSVRFRDoKKyAgICAgICAgICAgIGNhc2UgRVhURVJOQUw6CiAgICAgICAgICAgICAgICAgcmV0dXJuIDE7IC8vIHNlY29uZCBsb3dlc3QKKyAgICAgICAgICAgIGNhc2UgTElNSVRFRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gMjsKICAgICAgICAgICAgIGNhc2UgRlVMTDoKLSAgICAgICAgICAgICAgICByZXR1cm4gMjsgLy8gZ29vZAorICAgICAgICAgICAgICAgIHJldHVybiAzOyAvLyBnb29kCisgICAgICAgICAgICBjYXNlIExFVkVMXzM6CisgICAgICAgICAgICAgICAgcmV0dXJuIDQ7CiAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGlmIChsZXZlbCA+PSBMRVZFTF8zKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBsZXZlbDsgLy8gaGlnaGVyIGxldmVscyBtYXAgZGlyZWN0bHkKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmFpbCgiVW5rbm93biBIVyBsZXZlbDogIiArIGxldmVsKTsKICAgICAgICAgfQotCi0gICAgICAgIGZhaWwoIlVua25vd24gSFcgbGV2ZWw6ICIgKyBsZXZlbCk7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKQEAgLTE0OTcsNiArMTc0NCw4IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuICJMSU1JVEVEIjsKICAgICAgICAgICAgIGNhc2UgRlVMTDoKICAgICAgICAgICAgICAgICByZXR1cm4gIkZVTEwiOworICAgICAgICAgICAgY2FzZSBFWFRFUk5BTDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIkVYVEVSTkFMIjsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgaWYgKGxldmVsID49IExFVkVMXzMpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIkxFVkVMXyVkIiwgbGV2ZWwpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2FtZXJhL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvY3RzL0Zhc3RCYXNpY3NUZXN0LmphdmEgYi90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9jdHMvRmFzdEJhc2ljc1Rlc3QuamF2YQppbmRleCBjNGFlNjFiLi42Y2E5NjAxIDEwMDY0NAotLS0gYS90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9jdHMvRmFzdEJhc2ljc1Rlc3QuamF2YQorKysgYi90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9jdHMvRmFzdEJhc2ljc1Rlc3QuamF2YQpAQCAtNDgsNyArNDgsNiBAQAogICogTWF5IG5vdCB0YWtlIG1vcmUgdGhhbiBhIGZldyBzZWNvbmRzIHRvIHJ1biwgdG8gYmUgc3VpdGFibGUgZm9yIHF1aWNrCiAgKiB0ZXN0aW5nLgogICovCi1AUHJlc3VibWl0CiBwdWJsaWMgY2xhc3MgRmFzdEJhc2ljc1Rlc3QgZXh0ZW5kcyBDYW1lcmEyU3VyZmFjZVZpZXdUZXN0Q2FzZSB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJGYXN0QmFzaWNzVGVzdCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBWRVJCT1NFID0gTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSk7CkBAIC01OCw2ICs1Nyw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdBSVRfRk9SX1BJQ1RVUkVfVElNRU9VVF9NUyA9IDUwMDA7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZSQU1FU19UT19XQUlUX0ZPUl9DQVBUVVJFID0gMTAwOwogCisgICAgQFByZXN1Ym1pdAogICAgIHB1YmxpYyB2b2lkIHRlc3RDYW1lcmEyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUNhbWVyYUlkcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgdHJ5IHsKQEAgLTEwMiw2ICsxMDIsMTEgQEAKIAogICAgICAgICBhc3NlcnRUcnVlKCJCYWQgdGltZXN0YW1wcyIsIHRpbWVzdGFtcDIgPiB0aW1lc3RhbXApOwogCisgICAgICAgIC8vIElmIEVuYWJsZVpzbCBpcyBzdXBwb3J0ZWQsIGRpc2FibGUgWlNMIGluIG9yZGVyIHRvIGNvbXBhcmUgcHJldmlldyBhbmQgc3RpbGwgdGltZXN0YW1wcy4KKyAgICAgICAgaWYgKG1TdGF0aWNJbmZvLmlzRW5hYmxlWnNsU3VwcG9ydGVkKCkpIHsKKyAgICAgICAgICAgIHN0aWxsQ2FwdHVyZVJlcXVlc3Quc2V0KENhcHR1cmVSZXF1ZXN0LkNPTlRST0xfRU5BQkxFX1pTTCwgZmFsc2UpOworICAgICAgICB9CisKICAgICAgICAgQ2FwdHVyZVJlcXVlc3QgY2FwdHVyZSA9IHN0aWxsQ2FwdHVyZVJlcXVlc3QuYnVpbGQoKTsKICAgICAgICAgbVNlc3Npb24uY2FwdHVyZShjYXB0dXJlLCByZXN1bHRMaXN0ZW5lciwgbUhhbmRsZXIpOwogCkBAIC0xNzgsNiArMTgzLDcgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBQcmVzdWJtaXQKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FtZXJhMSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IENhbWVyYS5nZXROdW1iZXJPZkNhbWVyYXMoKTsgaSsrKSB7CiAgICAgICAgICAgICBDYW1lcmEgY2FtZXJhID0gbnVsbDsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NhbWVyYS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL2N0cy9GbGFzaGxpZ2h0VGVzdC5qYXZhIGIvdGVzdHMvY2FtZXJhL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvY3RzL0ZsYXNobGlnaHRUZXN0LmphdmEKaW5kZXggM2FiMTAzMC4uZjBiMzE3OSAxMDA2NDQKLS0tIGEvdGVzdHMvY2FtZXJhL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvY3RzL0ZsYXNobGlnaHRUZXN0LmphdmEKKysrIGIvdGVzdHMvY2FtZXJhL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvY3RzL0ZsYXNobGlnaHRUZXN0LmphdmEKQEAgLTE4LDE0ICsxOCwxNyBAQAogCiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYUFjY2Vzc0V4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuY3RzLkNhbWVyYVRlc3RVdGlscy5IYW5kbGVyRXhlY3V0b3I7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLmN0cy50ZXN0Y2FzZXMuQ2FtZXJhMkFuZHJvaWRUZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuY3RzLmhlbHBlcnMuU3RhdGljTWV0YWRhdGE7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLmN0cy5oZWxwZXJzLlN0YXRpY01ldGFkYXRhLkNoZWNrTGV2ZWw7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQXJyYXlCbG9ja2luZ1F1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogCiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8uKjsKQEAgLTMzLDYgKzM2LDcgQEAKIC8qKgogICogPHA+VGVzdHMgZm9yIGZsYXNobGlnaHQgQVBJLjwvcD4KICAqLworQEFwcE1vZGVGdWxsCiBwdWJsaWMgY2xhc3MgRmxhc2hsaWdodFRlc3QgZXh0ZW5kcyBDYW1lcmEyQW5kcm9pZFRlc3RDYXNlIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkZsYXNobGlnaHRUZXN0IjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFZFUkJPU0UgPSBMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5WRVJCT1NFKTsKQEAgLTEyMyw5ICsxMjcsMTUgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0VG9yY2hDYWxsYmFjaygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0VG9yY2hDYWxsYmFjaygvKnVzZUV4ZWN1dG9yKi8gZmFsc2UpOworICAgICAgICB0ZXN0VG9yY2hDYWxsYmFjaygvKnVzZUV4ZWN1dG9yKi8gdHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RUb3JjaENhbGxiYWNrKGJvb2xlYW4gdXNlRXhlY3V0b3IpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBpZiAobUZsYXNoQ2FtZXJhSWRMaXN0LnNpemUoKSA9PSAwKQogICAgICAgICAgICAgcmV0dXJuOwogCisgICAgICAgIGZpbmFsIEV4ZWN1dG9yIGV4ZWN1dG9yID0gdXNlRXhlY3V0b3IgPyBuZXcgSGFuZGxlckV4ZWN1dG9yKG1IYW5kbGVyKSA6IG51bGw7CiAgICAgICAgIC8vIHJlc2V0IHRvcmNoIG1vZGUgc3RhdHVzCiAgICAgICAgIGZvciAoU3RyaW5nIGlkIDogbUZsYXNoQ2FtZXJhSWRMaXN0KSB7CiAgICAgICAgICAgICByZXNldFRvcmNoTW9kZVN0YXR1cyhpZCk7CkBAIC0xMzUsNyArMTQ1LDExIEBACiAKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fUkVHSVNURVJTOyBpKyspIHsKICAgICAgICAgICAgIC8vIHNob3VsZCBnZXQgT0ZGIGZvciBhbGwgY2FtZXJhcyB3aXRoIGEgZmxhc2ggdW5pdC4KLSAgICAgICAgICAgIG1DYW1lcmFNYW5hZ2VyLnJlZ2lzdGVyVG9yY2hDYWxsYmFjayh0b3JjaExpc3RlbmVyLCBtSGFuZGxlcik7CisgICAgICAgICAgICBpZiAodXNlRXhlY3V0b3IpIHsKKyAgICAgICAgICAgICAgICBtQ2FtZXJhTWFuYWdlci5yZWdpc3RlclRvcmNoQ2FsbGJhY2soZXhlY3V0b3IsIHRvcmNoTGlzdGVuZXIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtQ2FtZXJhTWFuYWdlci5yZWdpc3RlclRvcmNoQ2FsbGJhY2sodG9yY2hMaXN0ZW5lciwgbUhhbmRsZXIpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgbUNhbWVyYU1hbmFnZXIudW5yZWdpc3RlclRvcmNoQ2FsbGJhY2sodG9yY2hMaXN0ZW5lcik7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvdGVzdHMvY2FtZXJhL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvY3RzL0lkbGVVaWRUZXN0LmphdmEgYi90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9jdHMvSWRsZVVpZFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjM0YzdlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2FtZXJhL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvY3RzL0lkbGVVaWRUZXN0LmphdmEKQEAgLTAsMCArMSwyMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5jdHM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24udHJ1dGguVHJ1dGguYXNzZXJ0VGhhdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8uZXE7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ubW9jazsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5yZXNldDsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by50aW1lb3V0OworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnZlcmlmeTsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by52ZXJpZnlOb01vcmVJbnRlcmFjdGlvbnM7CisKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FtZXJhQWNjZXNzRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYW1lcmFEZXZpY2U7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlclRocmVhZDsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlN5c3RlbVV0aWw7CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXJDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5tb2NraXRvLkFyZ3VtZW50Q2FwdG9yOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBUZXN0IGZvciB2YWxpZGF0aW5nIGJlaGF2aW9ycyByZWxhdGVkIHRvIGlkbGUgVUlEcy4gSWRsZSBVSURzIGNhbm5vdAorICogYWNjZXNzIGNhbWVyYS4gSWYgdGhlIFVJRCBoYXMgYSBjYW1lcmEgaGFuZGxlIGFuZCBiZWNvbWVzIGlkbGUgaXQgd291bGQKKyAqIGdldCBhbiBlcnJvciBjYWxsYmFjayBsb3NpbmcgdGhlIGNhbWVyYSBoYW5kbGUuIFNpbWlsYXJseSBpZiB0aGUgVUlEIGlzCisgKiBhbHJlYWR5IGlkbGUgaXQgY2Fubm90IG9idGFpbiBhIGNhbWVyYSBoYW5kbGUuCisgKi8KK0BBcHBNb2RlRnVsbAorQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKK3B1YmxpYyBmaW5hbCBjbGFzcyBJZGxlVWlkVGVzdCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBDQU1FUkFfT1BFUkFUSU9OX1RJTUVPVVRfTUlMTElTID0gNTAwMDsgLy8gNSBzZWMKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEhhbmRsZXJUaHJlYWQgc0NhbGxiYWNrVGhyZWFkID0gbmV3IEhhbmRsZXJUaHJlYWQoIkNhbGxiYWNrIHRocmVhZCIpOworCisgICAgQEJlZm9yZUNsYXNzCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHN0YXJ0SGFuZGxlclRocmVhZCgpIHsKKyAgICAgICAgc0NhbGxiYWNrVGhyZWFkLnN0YXJ0KCk7CisgICAgfQorCisgICAgQEFmdGVyQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc3RvcEhhbmRsZXJUaHJlYWQoKSB7CisgICAgICAgIHNDYWxsYmFja1RocmVhZC5xdWl0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhhdCBhIFVJRCBoYXMgYWNjZXNzIHRvIHRoZSBjYW1lcmEgb25seSBpbiBhY3RpdmUgc3RhdGUuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FtZXJhQWNjZXNzRm9ySWRsZVVpZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBDYW1lcmFNYW5hZ2VyIGNhbWVyYU1hbmFnZXIgPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRUYXJnZXRDb250ZXh0KCkKKyAgICAgICAgICAgICAgICAuZ2V0U3lzdGVtU2VydmljZShDYW1lcmFNYW5hZ2VyLmNsYXNzKTsKKyAgICAgICAgZm9yIChTdHJpbmcgY2FtZXJhSWQgOiBjYW1lcmFNYW5hZ2VyLmdldENhbWVyYUlkTGlzdCgpKSB7CisgICAgICAgICAgICB0ZXN0Q2FtZXJhQWNjZXNzRm9ySWRsZVVpZEJ5Q2FtZXJhKGNhbWVyYU1hbmFnZXIsIGNhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICBuZXcgSGFuZGxlcihzQ2FsbGJhY2tUaHJlYWQuZ2V0TG9vcGVyKCkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoYXQgYSBVSUQgbG9zZXMgYWNjZXNzIHRvIHRoZSBjYW1lcmEgaWYgaXQgYmVjb21lcyBpbmFjdGl2ZS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDYW1lcmFBY2Nlc3NCZWNvbWluZ0luYWN0aXZlVWlkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIENhbWVyYU1hbmFnZXIgY2FtZXJhTWFuYWdlciA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldFRhcmdldENvbnRleHQoKQorICAgICAgICAgICAgICAgIC5nZXRTeXN0ZW1TZXJ2aWNlKENhbWVyYU1hbmFnZXIuY2xhc3MpOworICAgICAgICBmb3IgKFN0cmluZyBjYW1lcmFJZCA6IGNhbWVyYU1hbmFnZXIuZ2V0Q2FtZXJhSWRMaXN0KCkpIHsKKyAgICAgICAgICAgIHRlc3RDYW1lcmFBY2Nlc3NCZWNvbWluZ0luYWN0aXZlVWlkQnlDYW1lcmEoY2FtZXJhTWFuYWdlciwgY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgIG5ldyBIYW5kbGVyKHNDYWxsYmFja1RocmVhZC5nZXRMb29wZXIoKSkpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdENhbWVyYUFjY2Vzc0ZvcklkbGVVaWRCeUNhbWVyYShDYW1lcmFNYW5hZ2VyIGNhbWVyYU1hbmFnZXIsCisgICAgICAgICAgICBTdHJpbmcgY2FtZXJhSWQsIEhhbmRsZXIgaGFuZGxlcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIENhbiBhY2Nlc3MgY2FtZXJhIGZyb20gYW4gYWN0aXZlIFVJRC4KKyAgICAgICAgYXNzZXJ0Q2FtZXJhQWNjZXNzKGNhbWVyYU1hbmFnZXIsIGNhbWVyYUlkLCB0cnVlLCBoYW5kbGVyKTsKKworICAgICAgICAvLyBNYWtlIG91ciBVSUQgaWRsZQorICAgICAgICBtYWtlTXlQYWNrYWdlSWRsZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gQ2FuIG5vdCBhY2Nlc3MgY2FtZXJhIGZyb20gYW4gaWRsZSBVSUQuCisgICAgICAgICAgICBhc3NlcnRDYW1lcmFBY2Nlc3MoY2FtZXJhTWFuYWdlciwgY2FtZXJhSWQsIGZhbHNlLCBoYW5kbGVyKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIC8vIFJlc3RvcmUgb3VyIFVJRCBhcyBhY3RpdmUKKyAgICAgICAgICAgIG1ha2VNeVBhY2thZ2VBY3RpdmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENhbiBhY2Nlc3MgY2FtZXJhIGZyb20gYW4gYWN0aXZlIFVJRC4KKyAgICAgICAgYXNzZXJ0Q2FtZXJhQWNjZXNzKGNhbWVyYU1hbmFnZXIsIGNhbWVyYUlkLCB0cnVlLCBoYW5kbGVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydENhbWVyYUFjY2VzcyhDYW1lcmFNYW5hZ2VyIGNhbWVyYU1hbmFnZXIsCisgICAgICAgICAgICBTdHJpbmcgY2FtZXJhSWQsIGJvb2xlYW4gaGFzQWNjZXNzLCBIYW5kbGVyIGhhbmRsZXIpIHsKKyAgICAgICAgLy8gTW9jayB0aGUgY2FsbGJhY2sgdXNlZCB0byBvYnNlcnZlIGNhbWVyYSBzdGF0ZS4KKyAgICAgICAgZmluYWwgQ2FtZXJhRGV2aWNlLlN0YXRlQ2FsbGJhY2sgY2FsbGJhY2sgPSBtb2NrKENhbWVyYURldmljZS5TdGF0ZUNhbGxiYWNrLmNsYXNzKTsKKworICAgICAgICAvLyBPcGVuIHRoZSBjYW1lcmEKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNhbWVyYU1hbmFnZXIub3BlbkNhbWVyYShjYW1lcmFJZCwgY2FsbGJhY2ssIGhhbmRsZXIpOworICAgICAgICB9IGNhdGNoIChDYW1lcmFBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaWYgKGhhc0FjY2VzcykgeworICAgICAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIiArIGUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUaGF0KGUuZ2V0UmVhc29uKCkpLmlzU2FtZUFzKENhbWVyYUFjY2Vzc0V4Y2VwdGlvbi5DQU1FUkFfRElTQUJMRUQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVmVyaWZ5IGFjY2VzcworICAgICAgICBmaW5hbCBBcmd1bWVudENhcHRvcjxDYW1lcmFEZXZpY2U+IGNhcHRvciA9IEFyZ3VtZW50Q2FwdG9yLmZvckNsYXNzKENhbWVyYURldmljZS5jbGFzcyk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoaGFzQWNjZXNzKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIGNhbWVyYSBzaG91bGQgb3BlbiBmaW5lIGFzIHdlIGFyZSBpbiB0aGUgZm9yZWdyb3VuZAorICAgICAgICAgICAgICAgIHZlcmlmeShjYWxsYmFjaywgdGltZW91dChDQU1FUkFfT1BFUkFUSU9OX1RJTUVPVVRfTUlMTElTKQorICAgICAgICAgICAgICAgICAgICAgICAgLnRpbWVzKDEpKS5vbk9wZW5lZChjYXB0b3IuY2FwdHVyZSgpKTsKKyAgICAgICAgICAgICAgICB2ZXJpZnlOb01vcmVJbnRlcmFjdGlvbnMoY2FsbGJhY2spOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgY2FtZXJhIHNob3VsZCBub3Qgb3BlbiBhcyB3ZSBhcmUgaW4gdGhlIGJhY2tncm91bmQKKyAgICAgICAgICAgICAgICB2ZXJpZnkoY2FsbGJhY2ssIHRpbWVvdXQoQ0FNRVJBX09QRVJBVElPTl9USU1FT1VUX01JTExJUykKKyAgICAgICAgICAgICAgICAgICAgICAgIC50aW1lcygxKSkub25FcnJvcihjYXB0b3IuY2FwdHVyZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgZXEoQ2FtZXJhRGV2aWNlLlN0YXRlQ2FsbGJhY2suRVJST1JfQ0FNRVJBX0RJU0FCTEVEKSk7CisgICAgICAgICAgICAgICAgdmVyaWZ5Tm9Nb3JlSW50ZXJhY3Rpb25zKGNhbGxiYWNrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGZpbmFsIENhbWVyYURldmljZSBjYW1lcmFEZXZpY2UgPSBjYXB0b3IuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoY2FtZXJhRGV2aWNlKS5pc05vdE51bGwoKTsKKyAgICAgICAgICAgIGNhbWVyYURldmljZS5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RDYW1lcmFBY2Nlc3NCZWNvbWluZ0luYWN0aXZlVWlkQnlDYW1lcmEoQ2FtZXJhTWFuYWdlciBjYW1lcmFNYW5hZ2VyLAorICAgICAgICAgICAgU3RyaW5nIGNhbWVyYUlkLCBIYW5kbGVyIGhhbmRsZXIpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBNb2NrIHRoZSBjYWxsYmFjayB1c2VkIHRvIG9ic2VydmUgY2FtZXJhIHN0YXRlLgorICAgICAgICBmaW5hbCBDYW1lcmFEZXZpY2UuU3RhdGVDYWxsYmFjayBjYWxsYmFjayA9IG1vY2soQ2FtZXJhRGV2aWNlLlN0YXRlQ2FsbGJhY2suY2xhc3MpOworCisgICAgICAgIC8vIE9wZW4gdGhlIGNhbWVyYQorICAgICAgICB0cnkgeworICAgICAgICAgICAgY2FtZXJhTWFuYWdlci5vcGVuQ2FtZXJhKGNhbWVyYUlkLCBjYWxsYmFjaywgaGFuZGxlcik7CisgICAgICAgIH0gY2F0Y2ggKENhbWVyYUFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiIgKyBlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFZlcmlmeSBhY2Nlc3MKKyAgICAgICAgZmluYWwgQXJndW1lbnRDYXB0b3I8Q2FtZXJhRGV2aWNlPiBjYXB0b3IgPSBBcmd1bWVudENhcHRvci5mb3JDbGFzcyhDYW1lcmFEZXZpY2UuY2xhc3MpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gVGhlIGNhbWVyYSBzaG91bGQgb3BlbiBmaW5lIGFzIHdlIGFyZSBpbiB0aGUgZm9yZWdyb3VuZAorICAgICAgICAgICAgdmVyaWZ5KGNhbGxiYWNrLCB0aW1lb3V0KENBTUVSQV9PUEVSQVRJT05fVElNRU9VVF9NSUxMSVMpCisgICAgICAgICAgICAgICAgICAgIC50aW1lcygxKSkub25PcGVuZWQoY2FwdG9yLmNhcHR1cmUoKSk7CisgICAgICAgICAgICB2ZXJpZnlOb01vcmVJbnRlcmFjdGlvbnMoY2FsbGJhY2spOworCisgICAgICAgICAgICAvLyBSZWFkeSBmb3IgYSBuZXcgdmVyaWZpY2F0aW9uCisgICAgICAgICAgICByZXNldChjYWxsYmFjayk7CisKKyAgICAgICAgICAgIC8vIE5vdyB3ZSBhcmUgbW92aW5nIGluIHRoZSBiYWNrZ3JvdW5kCisgICAgICAgICAgICBtYWtlTXlQYWNrYWdlSWRsZSgpOworCisgICAgICAgICAgICAvLyBUaGUgY2FtZXJhIHNob3VsZCBiZSBjbG9zZWQgaWYgdGhlIFVJRCBiZWNhbWUgaWRsZQorICAgICAgICAgICAgdmVyaWZ5KGNhbGxiYWNrLCB0aW1lb3V0KENBTUVSQV9PUEVSQVRJT05fVElNRU9VVF9NSUxMSVMpCisgICAgICAgICAgICAgICAgICAgIC50aW1lcygxKSkub25FcnJvcihjYXB0b3IuY2FwdHVyZSgpLAorICAgICAgICAgICAgICAgICAgICBlcShDYW1lcmFEZXZpY2UuU3RhdGVDYWxsYmFjay5FUlJPUl9DQU1FUkFfRElTQUJMRUQpKTsKKyAgICAgICAgICAgIHZlcmlmeU5vTW9yZUludGVyYWN0aW9ucyhjYWxsYmFjayk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAvLyBSZXN0b3JlIHRvIGFjdGl2ZSBzdGF0ZQorICAgICAgICAgICAgbWFrZU15UGFja2FnZUFjdGl2ZSgpOworCisgICAgICAgICAgICBmaW5hbCBDYW1lcmFEZXZpY2UgY2FtZXJhRGV2aWNlID0gY2FwdG9yLmdldFZhbHVlKCk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGNhbWVyYURldmljZSkuaXNOb3ROdWxsKCk7CisgICAgICAgICAgICBjYW1lcmFEZXZpY2UuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgbWFrZU15UGFja2FnZUFjdGl2ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBjb21tYW5kID0gImNtZCBtZWRpYS5jYW1lcmEgcmVzZXQtdWlkLXN0YXRlICIKKyAgICAgICAgICAgICAgICArICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRUYXJnZXRDb250ZXh0KCkuZ2V0UGFja2FnZU5hbWUoKTsKKyAgICAgICAgU3lzdGVtVXRpbC5ydW5TaGVsbENvbW1hbmQoSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCksIGNvbW1hbmQpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgbWFrZU15UGFja2FnZUlkbGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgY29tbWFuZCA9ICJjbWQgbWVkaWEuY2FtZXJhIHNldC11aWQtc3RhdGUgIgorICAgICAgICAgICAgICAgICsgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0VGFyZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VOYW1lKCkgKyAiIGlkbGUiOworICAgICAgICBTeXN0ZW1VdGlsLnJ1blNoZWxsQ29tbWFuZChJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKSwgY29tbWFuZCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvY2FtZXJhL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvY3RzL0ltYWdlUmVhZGVyVGVzdC5qYXZhIGIvdGVzdHMvY2FtZXJhL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvY3RzL0ltYWdlUmVhZGVyVGVzdC5qYXZhCmluZGV4IGJkMDFkMjEuLmVmMTc0ZmEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2NhbWVyYS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL2N0cy9JbWFnZVJlYWRlclRlc3QuamF2YQorKysgYi90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9jdHMvSW1hZ2VSZWFkZXJUZXN0LmphdmEKQEAgLTI1LDYgKzI1LDcgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLk1hdHJpeDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0RjsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLkhhcmR3YXJlQnVmZmVyOwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYW1lcmFDaGFyYWN0ZXJpc3RpY3M7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYURldmljZTsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FwdHVyZVJlcXVlc3Q7CkBAIC0zOCw2ICszOSw3IEBACiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5JbWFnZS5QbGFuZTsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkltYWdlUmVhZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuQ29uZGl0aW9uVmFyaWFibGU7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNpemU7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2U7CkBAIC02NSw2ICs2Nyw3IEBACiAgKiA8cD5Tb21lIGludmFsaWQgYWNjZXNzIHRlc3QuIDwvcD4KICAqIDxwPlRPRE86IEFkZCBtb3JlIGZvcm1hdCB0ZXN0cz8gPC9wPgogICovCitAQXBwTW9kZUZ1bGwKIHB1YmxpYyBjbGFzcyBJbWFnZVJlYWRlclRlc3QgZXh0ZW5kcyBDYW1lcmEyQW5kcm9pZFRlc3RDYXNlIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkltYWdlUmVhZGVyVGVzdCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBWRVJCT1NFID0gTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSk7CkBAIC0zNTgsNyArMzYxLDggQEAKIAogICAgICAgICAgICAgICAgIFNpemUgbWF4SnBlZ1NpemUgPSBDYW1lcmFUZXN0VXRpbHMuZ2V0TWF4U2l6ZShqcGVnU2l6ZXMpOwogICAgICAgICAgICAgICAgIFNpemUgbWF4UHJldmlld1NpemUgPSBtT3JkZXJlZFByZXZpZXdTaXplcy5nZXQoMCk7Ci0KKyAgICAgICAgICAgICAgICBTaXplIFFDSUYgPSBuZXcgU2l6ZSgxNzYsIDE0NCk7CisgICAgICAgICAgICAgICAgU2l6ZSBGVUxMX0hEID0gbmV3IFNpemUoMTkyMCwgMTA4MCk7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgZm9ybWF0IDogc3VwcG9ydGVkWVVWRm9ybWF0cykgewogICAgICAgICAgICAgICAgICAgICBTaXplW10gdGFyZ2V0Q2FwdHVyZVNpemVzID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdGljSW5mby5nZXRBdmFpbGFibGVTaXplc0ZvckZvcm1hdENoZWNrZWQoZm9ybWF0LApAQCAtNDA2LDYgKzQxMCwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJtYXggcHJldmlldyBzaXplICgiICsgbWF4UHJldmlld1NpemUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiKSBpcyBub3Qgc3VwcG9ydGVkIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjYXB0dXJlU3ouZXF1YWxzKFFDSUYpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChtYXhKcGVnU2l6ZS5nZXRXaWR0aCgpID4gRlVMTF9IRC5nZXRXaWR0aCgpKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF4SnBlZ1NpemUuZ2V0SGVpZ2h0KCkgPiBGVUxMX0hELmdldEhlaWdodCgpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgIlNraXAgdGVzdGluZyB7eXV2OiIgKyBjYXB0dXJlU3oKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiICxqcGVnOiIgKyBtYXhKcGVnU2l6ZSArICJ9IGZvciBjYW1lcmEgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1DYW1lcmEuZ2V0SWQoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgYmVjYXVzZSBRQ0lGICsgPkZ1bGxfSEQgc2l6ZSBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwoIkNhbWVyYSAiICsgbUNhbWVyYS5nZXRJZCgpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjpzZXNzaW9uIGNvbmZpZ3VyYXRpb24gZmFpbGVkIGZvciB7anBlZzogIiArCkBAIC01NTMsNiArNTY1LDIxIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogVGVzdCB0aGF0IGltYWdlcyBjYXB0dXJlZCBhZnRlciBkaXNjYXJkaW5nIGZyZWUgYnVmZmVycyBhcmUgdmFsaWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdERpc2NhcmRGcmVlQnVmZmVycygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmb3IgKFN0cmluZyBpZCA6IG1DYW1lcmFJZHMpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiVGVzdGluZyBqcGVnIGNhcHR1cmUgZm9yIENhbWVyYSAiICsgaWQpOworICAgICAgICAgICAgICAgIG9wZW5EZXZpY2UoaWQpOworICAgICAgICAgICAgICAgIGRpc2NhcmRGcmVlQnVmZmVyc1Rlc3RCeUNhbWVyYSgpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBjbG9zZURldmljZShpZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBDb252ZXJ0IGEgcmVjdGFuZ3VsYXIgcGF0Y2ggaW4gYSBZVVYgaW1hZ2UgdG8gYW4gQVJHQiBjb2xvciBhcnJheS4KICAgICAgKgogICAgICAqIEBwYXJhbSB3IHdpZHRoIG9mIHRoZSBwYXRjaC4KQEAgLTc2Miw2ICs3ODksMzggQEAKICAgICAgICAgaW1hZ2VJbnZhbGlkQWNjZXNzVGVzdEFmdGVyQ2xvc2UoaW1nLCBmaXJzdFBsYW5lLCBidWZmZXIpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFRlc3QgdGhhdCBpbWFnZXMgY2FwdHVyZWQgYWZ0ZXIgZGlzY2FyZGluZyBmcmVlIGJ1ZmZlcnMgYXJlIHZhbGlkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBkaXNjYXJkRnJlZUJ1ZmZlcnNUZXN0QnlDYW1lcmEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgaW50IEZPUk1BVCA9IG1TdGF0aWNJbmZvLmlzQ29sb3JPdXRwdXRTdXBwb3J0ZWQoKSA/CisgICAgICAgICAgICBJbWFnZUZvcm1hdC5ZVVZfNDIwXzg4OCA6IEltYWdlRm9ybWF0LkRFUFRIMTY7CisKKyAgICAgICAgZmluYWwgU2l6ZSBTSVpFID0gbVN0YXRpY0luZm8uZ2V0QXZhaWxhYmxlU2l6ZXNGb3JGb3JtYXRDaGVja2VkKEZPUk1BVCwKKyAgICAgICAgICAgICAgICBTdGF0aWNNZXRhZGF0YS5TdHJlYW1EaXJlY3Rpb24uT3V0cHV0KVswXTsKKyAgICAgICAgSW1hZ2UgaW1nID0gbnVsbDsKKyAgICAgICAgLy8gQ3JlYXRlIEltYWdlUmVhZGVyLgorICAgICAgICBtTGlzdGVuZXIgPSBuZXcgU2ltcGxlSW1hZ2VMaXN0ZW5lcigpOworICAgICAgICBjcmVhdGVEZWZhdWx0SW1hZ2VSZWFkZXIoU0laRSwgRk9STUFULCBNQVhfTlVNX0lNQUdFUywgbUxpc3RlbmVyKTsKKworICAgICAgICAvLyBTdGFydCBjYXB0dXJlLgorICAgICAgICBmaW5hbCBib29sZWFuIFJFUEVBVElORyA9IHRydWU7CisgICAgICAgIENhcHR1cmVSZXF1ZXN0IHJlcXVlc3QgPSBwcmVwYXJlQ2FwdHVyZVJlcXVlc3QoKTsKKyAgICAgICAgU2ltcGxlQ2FwdHVyZUNhbGxiYWNrIGxpc3RlbmVyID0gbmV3IFNpbXBsZUNhcHR1cmVDYWxsYmFjaygpOworICAgICAgICBzdGFydENhcHR1cmUocmVxdWVzdCwgUkVQRUFUSU5HLCBsaXN0ZW5lciwgbUhhbmRsZXIpOworCisgICAgICAgIC8vIFZhbGlkYXRlIGltYWdlcyBhbmQgY2FwdHVyZSByZXN1bHRzLgorICAgICAgICB2YWxpZGF0ZUltYWdlKFNJWkUsIEZPUk1BVCwgTlVNX0ZSQU1FX1ZFUklGSUVELCBSRVBFQVRJTkcpOworICAgICAgICB2YWxpZGF0ZUNhcHR1cmVSZXN1bHQoRk9STUFULCBTSVpFLCBsaXN0ZW5lciwgTlVNX0ZSQU1FX1ZFUklGSUVEKTsKKworICAgICAgICAvLyBEaXNjYXJkIGZyZWUgYnVmZmVycy4KKyAgICAgICAgbVJlYWRlci5kaXNjYXJkRnJlZUJ1ZmZlcnMoKTsKKworICAgICAgICAvLyBWYWxpZGF0ZSBpbWFnZXMgYW5kIGNhcHR1cmUgcmVzdWxzdCBhZ2Fpbi4KKyAgICAgICAgdmFsaWRhdGVJbWFnZShTSVpFLCBGT1JNQVQsIE5VTV9GUkFNRV9WRVJJRklFRCwgUkVQRUFUSU5HKTsKKyAgICAgICAgdmFsaWRhdGVDYXB0dXJlUmVzdWx0KEZPUk1BVCwgU0laRSwgbGlzdGVuZXIsIE5VTV9GUkFNRV9WRVJJRklFRCk7CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIGJ1ZmZlckZvcm1hdFRlc3RCeUNhbWVyYShpbnQgZm9ybWF0LCBib29sZWFuIHJlcGVhdGluZykgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICAgICAgU2l6ZVtdIGF2YWlsYWJsZVNpemVzID0gbVN0YXRpY0luZm8uZ2V0QXZhaWxhYmxlU2l6ZXNGb3JGb3JtYXRDaGVja2VkKGZvcm1hdCwKQEAgLTk5NSw2ICsxMDU0LDggQEAKICAgICAgICAgICAgIGlmIChWRVJCT1NFKSBMb2cudihUQUcsICJHb3QgdGhlIGxhdGVzdCBpbWFnZSIpOwogICAgICAgICAgICAgQ2FtZXJhVGVzdFV0aWxzLnZhbGlkYXRlSW1hZ2UoaW1nLCBzei5nZXRXaWR0aCgpLCBzei5nZXRIZWlnaHQoKSwgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICBERUJVR19GSUxFX05BTUVfQkFTRSk7CisgICAgICAgICAgICBIYXJkd2FyZUJ1ZmZlciBod2IgPSBpbWcuZ2V0SGFyZHdhcmVCdWZmZXIoKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIlVuYWJsZSB0byByZXRyaWV2ZSB0aGUgSW1hZ2UncyBIYXJkd2FyZUJ1ZmZlciIsIGh3Yik7CiAgICAgICAgICAgICBpZiAoVkVSQk9TRSkgTG9nLnYoVEFHLCAiZmluaXNoIHZhbGlkYXRpb24gb2YgaW1hZ2UgIiArIG51bUltYWdlVmVyaWZpZWQpOwogICAgICAgICAgICAgaW1nLmNsb3NlKCk7CiAgICAgICAgICAgICBudW1JbWFnZVZlcmlmaWVkKys7CmRpZmYgLS1naXQgYS90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9jdHMvSW1hZ2VXcml0ZXJUZXN0LmphdmEgYi90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9jdHMvSW1hZ2VXcml0ZXJUZXN0LmphdmEKaW5kZXggNzNhMzkxYy4uNjVjOGViMSAxMDA2NDQKLS0tIGEvdGVzdHMvY2FtZXJhL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvY3RzL0ltYWdlV3JpdGVyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL2NhbWVyYS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL2N0cy9JbWFnZVdyaXRlclRlc3QuamF2YQpAQCAtMjgsNiArMjgsNyBAQAogaW1wb3J0IGFuZHJvaWQubWVkaWEuSW1hZ2UuUGxhbmU7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5JbWFnZVJlYWRlcjsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkltYWdlV3JpdGVyOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TaXplOwogaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlOwpAQCAtNDQsNiArNDUsNyBAQAogICogaW50ZXJmYWNlIG9yIEltYWdlUmVhZGVyLgogICogPC9wPgogICovCitAQXBwTW9kZUZ1bGwKIHB1YmxpYyBjbGFzcyBJbWFnZVdyaXRlclRlc3QgZXh0ZW5kcyBDYW1lcmEyQW5kcm9pZFRlc3RDYXNlIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkltYWdlV3JpdGVyVGVzdCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBWRVJCT1NFID0gTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSk7CmRpZmYgLS1naXQgYS90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9jdHMvTG9naWNhbENhbWVyYURldmljZVRlc3QuamF2YSBiL3Rlc3RzL2NhbWVyYS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL2N0cy9Mb2dpY2FsQ2FtZXJhRGV2aWNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZGU4NzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9jdHMvTG9naWNhbENhbWVyYURldmljZVRlc3QuamF2YQpAQCAtMCwwICsxLDc1OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuY3RzOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5jdHMuQ2FtZXJhVGVzdFV0aWxzLio7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkltYWdlRm9ybWF0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuU3VyZmFjZVRleHR1cmU7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYUNhcHR1cmVTZXNzaW9uOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYW1lcmFDaGFyYWN0ZXJpc3RpY3M7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYURldmljZTsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FtZXJhTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FtZXJhTWV0YWRhdGE7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhcHR1cmVSZXF1ZXN0OworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYXB0dXJlUmVzdWx0OworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5Ub3RhbENhcHR1cmVSZXN1bHQ7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhcHR1cmVGYWlsdXJlOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5jdHMuQ2FwdHVyZVJlc3VsdFRlc3Q7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLmN0cy5oZWxwZXJzLlN0YXRpY01ldGFkYXRhOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5jdHMuaGVscGVycy5TdGF0aWNNZXRhZGF0YS5DaGVja0xldmVsOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5jdHMudGVzdGNhc2VzLkNhbWVyYTJTdXJmYWNlVmlld1Rlc3RDYXNlOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5wYXJhbXMuT3V0cHV0Q29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIucGFyYW1zLlN0cmVhbUNvbmZpZ3VyYXRpb25NYXA7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5DYW1jb3JkZXJQcm9maWxlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuSW1hZ2U7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5JbWFnZVJlYWRlcjsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CitpbXBvcnQgYW5kcm9pZC51dGlsLkFycmF5U2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlJhbmdlOworaW1wb3J0IGFuZHJvaWQudXRpbC5TaXplOworaW1wb3J0IGFuZHJvaWQudmlldy5EaXNwbGF5OworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOworCisKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlN0YXQ7CitpbXBvcnQgY29tLmFuZHJvaWQuZXguY2FtZXJhMi5ibG9ja2luZy5CbG9ja2luZ1Nlc3Npb25DYWxsYmFjazsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by4qOworCisvKioKKyAqIFRlc3RzIGV4ZXJjaXNpbmcgbG9naWNhbCBjYW1lcmEgc2V0dXAsIGNvbmZpZ3VyYXRpb24sIGFuZCB1c2FnZS4KKyAqLworQEFwcE1vZGVGdWxsCitwdWJsaWMgZmluYWwgY2xhc3MgTG9naWNhbENhbWVyYURldmljZVRlc3QgZXh0ZW5kcyBDYW1lcmEyU3VyZmFjZVZpZXdUZXN0Q2FzZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJMb2dpY2FsQ2FtZXJhVGVzdCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBWRVJCT1NFID0gTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09ORklHVVJFX1RJTUVPVVQgPSA1MDAwOyAvL21zCisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUgTlNfUEVSX01TID0gMTAwMDAwMC4wOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfSU1BR0VfQ09VTlQgPSAzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOVU1fRlJBTUVTX0NIRUNLRUQgPSAzMDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZSBGUkFNRV9EVVJBVElPTl9USFJFU0hPTEQgPSAwLjAzOworCisgICAgcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgU3RhdGljTWV0YWRhdGE+IG1BbGxTdGF0aWNJbmZvOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKworICAgICAgICBtQWxsU3RhdGljSW5mbyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RhdGljTWV0YWRhdGE+KCk7CisgICAgICAgIGZvciAoU3RyaW5nIGNhbWVyYUlkIDogbUNhbWVyYUlkcykgeworICAgICAgICAgICAgU3RhdGljTWV0YWRhdGEgc3RhdGljTWV0YWRhdGEgPSBuZXcgU3RhdGljTWV0YWRhdGEoCisgICAgICAgICAgICAgICAgICAgIG1DYW1lcmFNYW5hZ2VyLmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjYW1lcmFJZCksCisgICAgICAgICAgICAgICAgICAgIENoZWNrTGV2ZWwuQVNTRVJULCAvKmNvbGxlY3RvciovbnVsbCk7CisgICAgICAgICAgICBtQWxsU3RhdGljSW5mby5wdXQoY2FtZXJhSWQsIHN0YXRpY01ldGFkYXRhKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhhdCBwYXNzaW5nIGluIGludmFsaWQgcGh5c2ljYWwgY2FtZXJhIGlkcyBpbiBPdXRwdXRDb25maWd1cmFndGlvbiBiZWhhdmVzIGFzIGV4cGVjdGVkCisgICAgICogZm9yIGxvZ2ljYWwgbXVsdGktY2FtZXJhIGFuZCBub24tbG9naWNhbCBtdWx0aS1jYW1lcmEuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRQaHlzaWNhbENhbWVyYUlkSW5PdXRwdXRDb25maWd1cmF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoU3RyaW5nIGlkIDogbUNhbWVyYUlkcykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJUZXN0aW5nIENhbWVyYSAiICsgaWQpOworICAgICAgICAgICAgICAgIG9wZW5EZXZpY2UoaWQpOworICAgICAgICAgICAgICAgIGlmIChtU3RhdGljSW5mby5pc0hhcmR3YXJlTGV2ZWxMZWdhY3koKSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJDYW1lcmEgIiArIGlkICsgIiBpcyBsZWdhY3ksIHNraXBwaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIW1TdGF0aWNJbmZvLmlzQ29sb3JPdXRwdXRTdXBwb3J0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJDYW1lcmEgIiArIGlkICsgIiBkb2VzIG5vdCBzdXBwb3J0IGNvbG9yIG91dHB1dHMsIHNraXBwaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFNpemUgeXV2U2l6ZSA9IG1PcmRlcmVkUHJldmlld1NpemVzLmdldCgwKTsKKyAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBZVVYgaW1hZ2UgcmVhZGVyLgorICAgICAgICAgICAgICAgIEltYWdlUmVhZGVyIGltYWdlUmVhZGVyID0gSW1hZ2VSZWFkZXIubmV3SW5zdGFuY2UoeXV2U2l6ZS5nZXRXaWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgeXV2U2l6ZS5nZXRIZWlnaHQoKSwgSW1hZ2VGb3JtYXQuWVVWXzQyMF84ODgsIC8qbWF4SW1hZ2VzKi8xKTsKKworICAgICAgICAgICAgICAgIENhbWVyYUNhcHR1cmVTZXNzaW9uLlN0YXRlQ2FsbGJhY2sgc2Vzc2lvbkxpc3RlbmVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1vY2soQ2FtZXJhQ2FwdHVyZVNlc3Npb24uU3RhdGVDYWxsYmFjay5jbGFzcyk7CisgICAgICAgICAgICAgICAgTGlzdDxPdXRwdXRDb25maWd1cmF0aW9uPiBvdXRwdXRzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICAgICAgT3V0cHV0Q29uZmlndXJhdGlvbiBvdXRwdXRDb25maWcgPSBuZXcgT3V0cHV0Q29uZmlndXJhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlUmVhZGVyLmdldFN1cmZhY2UoKSk7CisgICAgICAgICAgICAgICAgb3V0cHV0Q29uZmlnLnNldFBoeXNpY2FsQ2FtZXJhSWQoaWQpOworCisgICAgICAgICAgICAgICAgLy8gUmVnYXJkbGVzcyBvZiBsb2dpY2FsIGNhbWVyYSBvciBub24tbG9naWNhbCBjYW1lcmEsIGNyZWF0ZSBhIHNlc3Npb24gb2YgYW4KKyAgICAgICAgICAgICAgICAvLyBvdXRwdXQgY29uZmlndXJhdGlvbiB3aXRoIGludmFsaWQgcGh5c2ljYWwgY2FtZXJhIGlkLCB2ZXJpZnkgdGhhdCB0aGUKKyAgICAgICAgICAgICAgICAvLyBjcmVhdGVDYXB0dXJlU2Vzc2lvbiBmYWlscy4KKyAgICAgICAgICAgICAgICBvdXRwdXRzLmFkZChvdXRwdXRDb25maWcpOworICAgICAgICAgICAgICAgIENhbWVyYUNhcHR1cmVTZXNzaW9uIHNlc3Npb24gPQorICAgICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhVGVzdFV0aWxzLmNvbmZpZ3VyZUNhbWVyYVNlc3Npb25XaXRoQ29uZmlnKG1DYW1lcmEsIG91dHB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25MaXN0ZW5lciwgbUhhbmRsZXIpOworICAgICAgICAgICAgICAgIHZlcmlmeShzZXNzaW9uTGlzdGVuZXIsIHRpbWVvdXQoQ09ORklHVVJFX1RJTUVPVVQpLmF0TGVhc3RPbmNlKCkpLgorICAgICAgICAgICAgICAgICAgICAgICAgb25Db25maWd1cmVGYWlsZWQoYW55KENhbWVyYUNhcHR1cmVTZXNzaW9uLmNsYXNzKSk7CisgICAgICAgICAgICAgICAgdmVyaWZ5KHNlc3Npb25MaXN0ZW5lciwgbmV2ZXIoKSkub25Db25maWd1cmVkKGFueShDYW1lcmFDYXB0dXJlU2Vzc2lvbi5jbGFzcykpOworICAgICAgICAgICAgICAgIHZlcmlmeShzZXNzaW9uTGlzdGVuZXIsIG5ldmVyKCkpLm9uUmVhZHkoYW55KENhbWVyYUNhcHR1cmVTZXNzaW9uLmNsYXNzKSk7CisgICAgICAgICAgICAgICAgdmVyaWZ5KHNlc3Npb25MaXN0ZW5lciwgbmV2ZXIoKSkub25BY3RpdmUoYW55KENhbWVyYUNhcHR1cmVTZXNzaW9uLmNsYXNzKSk7CisgICAgICAgICAgICAgICAgdmVyaWZ5KHNlc3Npb25MaXN0ZW5lciwgbmV2ZXIoKSkub25DbG9zZWQoYW55KENhbWVyYUNhcHR1cmVTZXNzaW9uLmNsYXNzKSk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGNsb3NlRGV2aWNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciBtYWtpbmcgc3VyZSB0aGF0IHN0cmVhbWluZyBmcm9tIHBoeXNpY2FsIHN0cmVhbXMgd29yayBhcyBleHBlY3RlZCwgYW5kCisgICAgICogRlBTIGlzbid0IHNsb3dlZCBkb3duLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RCYXNpY1BoeXNpY2FsU3RyZWFtaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgZm9yIChTdHJpbmcgaWQgOiBtQ2FtZXJhSWRzKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIlRlc3RpbmcgQ2FtZXJhICIgKyBpZCk7CisgICAgICAgICAgICAgICAgb3BlbkRldmljZShpZCk7CisKKyAgICAgICAgICAgICAgICBpZiAoIW1TdGF0aWNJbmZvLmlzQ29sb3JPdXRwdXRTdXBwb3J0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJDYW1lcmEgIiArIGlkICsgIiBkb2VzIG5vdCBzdXBwb3J0IGNvbG9yIG91dHB1dHMsIHNraXBwaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghbVN0YXRpY0luZm8uaXNMb2dpY2FsTXVsdGlDYW1lcmEoKSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJDYW1lcmEgIiArIGlkICsgIiBpcyBub3QgYSBsb2dpY2FsIG11bHRpLWNhbWVyYSwgc2tpcHBpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiTG9naWNhbCBtdWx0aS1jYW1lcmEgbXVzdCBiZSBMSU1JVEVEIG9yIGhpZ2hlciIsCisgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdGljSW5mby5pc0hhcmR3YXJlTGV2ZWxBdExlYXN0TGltaXRlZCgpKTsKKworICAgICAgICAgICAgICAgIC8vIEZpZ3VyZSBvdXQgcHJldmlldyBzaXplIGFuZCBwaHlzaWNhbCBjYW1lcmFzIHRvIHVzZS4KKyAgICAgICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBkdWFsUGh5c2ljYWxDYW1lcmFJZHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgICAgICAgICBTaXplIHByZXZpZXdTaXplPSBmaW5kQ29tbW9uUHJldmlld1NpemUoaWQsIGR1YWxQaHlzaWNhbENhbWVyYUlkcyk7CisgICAgICAgICAgICAgICAgaWYgKHByZXZpZXdTaXplID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiQ2FtZXJhICIgKyBpZCArICI6IE5vIG1hdGNoaW5nIHBoeXNpY2FsIHByZXZpZXcgc3RyZWFtcywgc2tpcHBpbmciKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0ZXN0QmFzaWNQaHlzaWNhbFN0cmVhbWluZ0ZvckNhbWVyYSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGlkLCBkdWFsUGh5c2ljYWxDYW1lcmFJZHMsIHByZXZpZXdTaXplKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgY2xvc2VEZXZpY2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIG1ha2luZyBzdXJlIHRoYXQgbG9naWNhbC9waHlzaWNhbCBzdHJlYW0gcmVxdWVzdHMgd29yayB3aGVuIGJvdGggbG9naWNhbCBzdHJlYW0KKyAgICAgKiBhbmQgcGh5c2ljYWwgc3RyZWFtIGFyZSBjb25maWd1cmVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RCYXNpY0xvZ2ljYWxQaHlzaWNhbFN0cmVhbUNvbWJpbmF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgZm9yIChTdHJpbmcgaWQgOiBtQ2FtZXJhSWRzKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIlRlc3RpbmcgQ2FtZXJhICIgKyBpZCk7CisgICAgICAgICAgICAgICAgb3BlbkRldmljZShpZCk7CisKKyAgICAgICAgICAgICAgICBpZiAoIW1TdGF0aWNJbmZvLmlzQ29sb3JPdXRwdXRTdXBwb3J0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJDYW1lcmEgIiArIGlkICsgIiBkb2VzIG5vdCBzdXBwb3J0IGNvbG9yIG91dHB1dHMsIHNraXBwaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghbVN0YXRpY0luZm8uaXNMb2dpY2FsTXVsdGlDYW1lcmEoKSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJDYW1lcmEgIiArIGlkICsgIiBpcyBub3QgYSBsb2dpY2FsIG11bHRpLWNhbWVyYSwgc2tpcHBpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiTG9naWNhbCBtdWx0aS1jYW1lcmEgbXVzdCBiZSBMSU1JVEVEIG9yIGhpZ2hlciIsCisgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdGljSW5mby5pc0hhcmR3YXJlTGV2ZWxBdExlYXN0TGltaXRlZCgpKTsKKworICAgICAgICAgICAgICAgIC8vIEZpZ3VyZSBvdXQgeXV2IHNpemUgYW5kIHBoeXNpY2FsIGNhbWVyYXMgdG8gdXNlLgorICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBkdWFsUGh5c2ljYWxDYW1lcmFJZHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgICAgICAgICBTaXplIHl1dlNpemU9IGZpbmRDb21tb25QcmV2aWV3U2l6ZShpZCwgZHVhbFBoeXNpY2FsQ2FtZXJhSWRzKTsKKyAgICAgICAgICAgICAgICBpZiAoeXV2U2l6ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkNhbWVyYSAiICsgaWQgKyAiOiBObyBtYXRjaGluZyBwaHlzaWNhbCBZVVYgc3RyZWFtcywgc2tpcHBpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKFZFUkJPU0UpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiQ2FtZXJhICIgKyBpZCArICI6IFRlc3RpbmcgWVVWIHNpemUgb2YgIiArIHl1dlNpemUuZ2V0V2lkdGgoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAiIHggIiArIHl1dlNpemUuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIExpc3Q8T3V0cHV0Q29uZmlndXJhdGlvbj4gb3V0cHV0Q29uZmlncyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICAgICAgICAgIExpc3Q8U2ltcGxlSW1hZ2VSZWFkZXJMaXN0ZW5lcj4gaW1hZ2VSZWFkZXJMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgICAgICAgICBTaW1wbGVJbWFnZVJlYWRlckxpc3RlbmVyIHJlYWRlckxpc3RlbmVyUGh5c2ljYWwgPSBuZXcgU2ltcGxlSW1hZ2VSZWFkZXJMaXN0ZW5lcigpOworICAgICAgICAgICAgICAgIEltYWdlUmVhZGVyIHl1dlRhcmdldFBoeXNpY2FsID0gQ2FtZXJhVGVzdFV0aWxzLm1ha2VJbWFnZVJlYWRlcih5dXZTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgSW1hZ2VGb3JtYXQuWVVWXzQyMF84ODgsIE1BWF9JTUFHRV9DT1VOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlckxpc3RlbmVyUGh5c2ljYWwsIG1IYW5kbGVyKTsKKyAgICAgICAgICAgICAgICBPdXRwdXRDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBPdXRwdXRDb25maWd1cmF0aW9uKHl1dlRhcmdldFBoeXNpY2FsLmdldFN1cmZhY2UoKSk7CisgICAgICAgICAgICAgICAgY29uZmlnLnNldFBoeXNpY2FsQ2FtZXJhSWQoZHVhbFBoeXNpY2FsQ2FtZXJhSWRzLmdldCgwKSk7CisgICAgICAgICAgICAgICAgb3V0cHV0Q29uZmlncy5hZGQoY29uZmlnKTsKKworICAgICAgICAgICAgICAgIFNpbXBsZUltYWdlUmVhZGVyTGlzdGVuZXIgcmVhZGVyTGlzdGVuZXJMb2dpY2FsID0gbmV3IFNpbXBsZUltYWdlUmVhZGVyTGlzdGVuZXIoKTsKKyAgICAgICAgICAgICAgICBJbWFnZVJlYWRlciB5dXZUYXJnZXRMb2dpY2FsID0gQ2FtZXJhVGVzdFV0aWxzLm1ha2VJbWFnZVJlYWRlcih5dXZTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgSW1hZ2VGb3JtYXQuWVVWXzQyMF84ODgsIE1BWF9JTUFHRV9DT1VOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlckxpc3RlbmVyTG9naWNhbCwgbUhhbmRsZXIpOworICAgICAgICAgICAgICAgIG91dHB1dENvbmZpZ3MuYWRkKG5ldyBPdXRwdXRDb25maWd1cmF0aW9uKHl1dlRhcmdldExvZ2ljYWwuZ2V0U3VyZmFjZSgpKSk7CisgICAgICAgICAgICAgICAgaW1hZ2VSZWFkZXJMaXN0ZW5lcnMuYWRkKHJlYWRlckxpc3RlbmVyTG9naWNhbCk7CisKKyAgICAgICAgICAgICAgICBtU2Vzc2lvbkxpc3RlbmVyID0gbmV3IEJsb2NraW5nU2Vzc2lvbkNhbGxiYWNrKCk7CisgICAgICAgICAgICAgICAgbVNlc3Npb24gPSBjb25maWd1cmVDYW1lcmFTZXNzaW9uV2l0aENvbmZpZyhtQ2FtZXJhLCBvdXRwdXRDb25maWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25MaXN0ZW5lciwgbUhhbmRsZXIpOworCisgICAgICAgICAgICAgICAgLy8gVGVzdCByZXF1ZXN0IGxvZ2ljYWwgc3RyZWFtIHdpdGggYW4gaWRsZSBwaHlzaWNhbCBzdHJlYW0uCisgICAgICAgICAgICAgICAgQ2FwdHVyZVJlcXVlc3QuQnVpbGRlciByZXF1ZXN0QnVpbGRlciA9CisgICAgICAgICAgICAgICAgICAgIG1DYW1lcmEuY3JlYXRlQ2FwdHVyZVJlcXVlc3QoQ2FtZXJhRGV2aWNlLlRFTVBMQVRFX1BSRVZJRVcpOworICAgICAgICAgICAgICAgIHJlcXVlc3RCdWlsZGVyLmFkZFRhcmdldCh5dXZUYXJnZXRMb2dpY2FsLmdldFN1cmZhY2UoKSk7CisKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9JTUFHRV9DT1VOVDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uLmNhcHR1cmUocmVxdWVzdEJ1aWxkZXIuYnVpbGQoKSwgbmV3IFNpbXBsZUNhcHR1cmVDYWxsYmFjaygpLCBtSGFuZGxlcik7CisgICAgICAgICAgICAgICAgICAgIGZvciAoU2ltcGxlSW1hZ2VSZWFkZXJMaXN0ZW5lciByZWFkZXJMaXN0ZW5lciA6IGltYWdlUmVhZGVyTGlzdGVuZXJzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBJbWFnZSBpbWFnZSA9IHJlYWRlckxpc3RlbmVyLmdldEltYWdlKFdBSVRfRk9SX1JFU1VMVF9USU1FT1VUX01TKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBUZXN0IHJlcXVlc3QgcGh5c2ljYWwgc3RyZWFtIHdpdGggYW4gaWRsZSBsb2dpY2FsIHN0cmVhbS4KKyAgICAgICAgICAgICAgICBpbWFnZVJlYWRlckxpc3RlbmVycy5jbGVhcigpOworICAgICAgICAgICAgICAgIGltYWdlUmVhZGVyTGlzdGVuZXJzLmFkZChyZWFkZXJMaXN0ZW5lclBoeXNpY2FsKTsKKworICAgICAgICAgICAgICAgIHJlcXVlc3RCdWlsZGVyLnJlbW92ZVRhcmdldCh5dXZUYXJnZXRMb2dpY2FsLmdldFN1cmZhY2UoKSk7CisgICAgICAgICAgICAgICAgcmVxdWVzdEJ1aWxkZXIuYWRkVGFyZ2V0KHl1dlRhcmdldFBoeXNpY2FsLmdldFN1cmZhY2UoKSk7CisKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9JTUFHRV9DT1VOVDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uLmNhcHR1cmUocmVxdWVzdEJ1aWxkZXIuYnVpbGQoKSwgbmV3IFNpbXBsZUNhcHR1cmVDYWxsYmFjaygpLCBtSGFuZGxlcik7CisgICAgICAgICAgICAgICAgICAgIGZvciAoU2ltcGxlSW1hZ2VSZWFkZXJMaXN0ZW5lciByZWFkZXJMaXN0ZW5lciA6IGltYWdlUmVhZGVyTGlzdGVuZXJzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBJbWFnZSBpbWFnZSA9IHJlYWRlckxpc3RlbmVyLmdldEltYWdlKFdBSVRfRk9SX1JFU1VMVF9USU1FT1VUX01TKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBUZXN0IHJlcXVlc3QgbG9naWNhbCBhbmQgcGh5c2ljYWwgc3RyZWFtcyBhdCB0aGUgc2FtZSB0aW1lCisgICAgICAgICAgICAgICAgaW1hZ2VSZWFkZXJMaXN0ZW5lcnMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICByZWFkZXJMaXN0ZW5lckxvZ2ljYWwuZHJhaW4oKTsKKyAgICAgICAgICAgICAgICBpbWFnZVJlYWRlckxpc3RlbmVycy5hZGQocmVhZGVyTGlzdGVuZXJMb2dpY2FsKTsKKyAgICAgICAgICAgICAgICByZWFkZXJMaXN0ZW5lclBoeXNpY2FsLmRyYWluKCk7CisgICAgICAgICAgICAgICAgaW1hZ2VSZWFkZXJMaXN0ZW5lcnMuYWRkKHJlYWRlckxpc3RlbmVyUGh5c2ljYWwpOworCisgICAgICAgICAgICAgICAgcmVxdWVzdEJ1aWxkZXIuYWRkVGFyZ2V0KHl1dlRhcmdldExvZ2ljYWwuZ2V0U3VyZmFjZSgpKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9JTUFHRV9DT1VOVDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uLmNhcHR1cmUocmVxdWVzdEJ1aWxkZXIuYnVpbGQoKSwgbmV3IFNpbXBsZUNhcHR1cmVDYWxsYmFjaygpLCBtSGFuZGxlcik7CisgICAgICAgICAgICAgICAgICAgIGZvciAoU2ltcGxlSW1hZ2VSZWFkZXJMaXN0ZW5lciByZWFkZXJMaXN0ZW5lciA6IGltYWdlUmVhZGVyTGlzdGVuZXJzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBJbWFnZSBpbWFnZSA9IHJlYWRlckxpc3RlbmVyLmdldEltYWdlKFdBSVRfRk9SX1JFU1VMVF9USU1FT1VUX01TKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobVNlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbi5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBjbG9zZURldmljZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgbWFraW5nIHN1cmUgdGhhdCBtdWx0aXBsZSByZXF1ZXN0cyBmb3IgcGh5c2ljYWwgY2FtZXJhcyB3b3JrIGFzIGV4cGVjdGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RCYXNpY1BoeXNpY2FsUmVxdWVzdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBmb3IgKFN0cmluZyBpZCA6IG1DYW1lcmFJZHMpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiVGVzdGluZyBDYW1lcmEgIiArIGlkKTsKKyAgICAgICAgICAgICAgICBvcGVuRGV2aWNlKGlkKTsKKworICAgICAgICAgICAgICAgIGlmICghbVN0YXRpY0luZm8uaXNDb2xvck91dHB1dFN1cHBvcnRlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkNhbWVyYSAiICsgaWQgKyAiIGRvZXMgbm90IHN1cHBvcnQgY29sb3Igb3V0cHV0cywgc2tpcHBpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFtU3RhdGljSW5mby5pc0xvZ2ljYWxNdWx0aUNhbWVyYSgpKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkNhbWVyYSAiICsgaWQgKyAiIGlzIG5vdCBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhLCBza2lwcGluZyIpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJMb2dpY2FsIG11bHRpLWNhbWVyYSBtdXN0IGJlIExJTUlURUQgb3IgaGlnaGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0aWNJbmZvLmlzSGFyZHdhcmVMZXZlbEF0TGVhc3RMaW1pdGVkKCkpOworCisgICAgICAgICAgICAgICAgLy8gRmlndXJlIG91dCB5dXYgc2l6ZSBhbmQgcGh5c2ljYWwgY2FtZXJhcyB0byB1c2UuCisgICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGR1YWxQaHlzaWNhbENhbWVyYUlkcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICAgICAgICAgIFNpemUgeXV2U2l6ZT0gZmluZENvbW1vblByZXZpZXdTaXplKGlkLCBkdWFsUGh5c2ljYWxDYW1lcmFJZHMpOworICAgICAgICAgICAgICAgIGlmICh5dXZTaXplID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiQ2FtZXJhICIgKyBpZCArICI6IE5vIG1hdGNoaW5nIHBoeXNpY2FsIFlVViBzdHJlYW1zLCBza2lwcGluZyIpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQXJyYXlTZXQ8U3RyaW5nPiBwaHlzaWNhbElkU2V0ID0gbmV3IEFycmF5U2V0PFN0cmluZz4oZHVhbFBoeXNpY2FsQ2FtZXJhSWRzLnNpemUoKSk7CisgICAgICAgICAgICAgICAgcGh5c2ljYWxJZFNldC5hZGRBbGwoZHVhbFBoeXNpY2FsQ2FtZXJhSWRzKTsKKworICAgICAgICAgICAgICAgIGlmIChWRVJCT1NFKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgIkNhbWVyYSAiICsgaWQgKyAiOiBUZXN0aW5nIFlVViBzaXplIG9mICIgKyB5dXZTaXplLmdldFdpZHRoKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgIiB4ICIgKyB5dXZTaXplLmdldEhlaWdodCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgTGlzdDxDYXB0dXJlUmVxdWVzdC5LZXk8Pz4+IHBoeXNpY2FsUmVxdWVzdEtleXMgPQorICAgICAgICAgICAgICAgICAgICBtU3RhdGljSW5mby5nZXRDaGFyYWN0ZXJpc3RpY3MoKS5nZXRBdmFpbGFibGVQaHlzaWNhbENhbWVyYVJlcXVlc3RLZXlzKCk7CisgICAgICAgICAgICAgICAgaWYgKHBoeXNpY2FsUmVxdWVzdEtleXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJDYW1lcmEgIiArIGlkICsgIjogbm8gYXZhaWxhYmxlIHBoeXNpY2FsIHJlcXVlc3Qga2V5cywgc2tpcHBpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgTGlzdDxPdXRwdXRDb25maWd1cmF0aW9uPiBvdXRwdXRDb25maWdzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICAgICAgTGlzdDxJbWFnZVJlYWRlcj4gaW1hZ2VSZWFkZXJzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICAgICAgTGlzdDxTaW1wbGVJbWFnZVJlYWRlckxpc3RlbmVyPiBpbWFnZVJlYWRlckxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHBoeXNpY2FsQ2FtZXJhSWQgOiBkdWFsUGh5c2ljYWxDYW1lcmFJZHMpIHsKKyAgICAgICAgICAgICAgICAgICAgU2ltcGxlSW1hZ2VSZWFkZXJMaXN0ZW5lciByZWFkZXJMaXN0ZW5lciA9IG5ldyBTaW1wbGVJbWFnZVJlYWRlckxpc3RlbmVyKCk7CisgICAgICAgICAgICAgICAgICAgIEltYWdlUmVhZGVyIHl1dlRhcmdldCA9IENhbWVyYVRlc3RVdGlscy5tYWtlSW1hZ2VSZWFkZXIoeXV2U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbWFnZUZvcm1hdC5ZVVZfNDIwXzg4OCwgTUFYX0lNQUdFX0NPVU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlckxpc3RlbmVyLCBtSGFuZGxlcik7CisgICAgICAgICAgICAgICAgICAgIE91dHB1dENvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IE91dHB1dENvbmZpZ3VyYXRpb24oeXV2VGFyZ2V0LmdldFN1cmZhY2UoKSk7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zZXRQaHlzaWNhbENhbWVyYUlkKHBoeXNpY2FsQ2FtZXJhSWQpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXRDb25maWdzLmFkZChjb25maWcpOworICAgICAgICAgICAgICAgICAgICBpbWFnZVJlYWRlcnMuYWRkKHl1dlRhcmdldCk7CisgICAgICAgICAgICAgICAgICAgIGltYWdlUmVhZGVyTGlzdGVuZXJzLmFkZChyZWFkZXJMaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQ2FwdHVyZVJlcXVlc3QuQnVpbGRlciByZXF1ZXN0QnVpbGRlciA9CisgICAgICAgICAgICAgICAgICAgIG1DYW1lcmEuY3JlYXRlQ2FwdHVyZVJlcXVlc3QoQ2FtZXJhRGV2aWNlLlRFTVBMQVRFX1BSRVZJRVcsIHBoeXNpY2FsSWRTZXQpOworICAgICAgICAgICAgICAgIGZvciAoT3V0cHV0Q29uZmlndXJhdGlvbiBjIDogb3V0cHV0Q29uZmlncykgeworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QnVpbGRlci5hZGRUYXJnZXQoYy5nZXRTdXJmYWNlKCkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1TZXNzaW9uTGlzdGVuZXIgPSBuZXcgQmxvY2tpbmdTZXNzaW9uQ2FsbGJhY2soKTsKKyAgICAgICAgICAgICAgICBtU2Vzc2lvbiA9IGNvbmZpZ3VyZUNhbWVyYVNlc3Npb25XaXRoQ29uZmlnKG1DYW1lcmEsIG91dHB1dENvbmZpZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbkxpc3RlbmVyLCBtSGFuZGxlcik7CisKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9JTUFHRV9DT1VOVDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uLmNhcHR1cmUocmVxdWVzdEJ1aWxkZXIuYnVpbGQoKSwgbmV3IFNpbXBsZUNhcHR1cmVDYWxsYmFjaygpLCBtSGFuZGxlcik7CisgICAgICAgICAgICAgICAgICAgIGZvciAoU2ltcGxlSW1hZ2VSZWFkZXJMaXN0ZW5lciByZWFkZXJMaXN0ZW5lciA6IGltYWdlUmVhZGVyTGlzdGVuZXJzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXJMaXN0ZW5lci5nZXRJbWFnZShXQUlUX0ZPUl9SRVNVTFRfVElNRU9VVF9NUyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBUZXN0IHN0cmVhbWluZyByZXF1ZXN0cworICAgICAgICAgICAgICAgIGltYWdlUmVhZGVycy5jbGVhcigpOworICAgICAgICAgICAgICAgIG91dHB1dENvbmZpZ3MuY2xlYXIoKTsKKworICAgICAgICAgICAgICAgIC8vIEFkZCBwaHlzaWNhbCBZVVYgc3RyZWFtcworICAgICAgICAgICAgICAgIExpc3Q8SW1hZ2VSZWFkZXI+IHBoeXNpY2FsVGFyZ2V0cyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHBoeXNpY2FsQ2FtZXJhSWQgOiBkdWFsUGh5c2ljYWxDYW1lcmFJZHMpIHsKKyAgICAgICAgICAgICAgICAgICAgSW1hZ2VSZWFkZXIgcGh5c2ljYWxUYXJnZXQgPSBDYW1lcmFUZXN0VXRpbHMubWFrZUltYWdlUmVhZGVyKHl1dlNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1hZ2VGb3JtYXQuWVVWXzQyMF84ODgsIE1BWF9JTUFHRV9DT1VOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW1hZ2VEcm9wcGVyTGlzdGVuZXIoKSwgbUhhbmRsZXIpOworICAgICAgICAgICAgICAgICAgICBPdXRwdXRDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBPdXRwdXRDb25maWd1cmF0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsVGFyZ2V0LmdldFN1cmZhY2UoKSk7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zZXRQaHlzaWNhbENhbWVyYUlkKHBoeXNpY2FsQ2FtZXJhSWQpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXRDb25maWdzLmFkZChjb25maWcpOworICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbFRhcmdldHMuYWRkKHBoeXNpY2FsVGFyZ2V0KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtU2Vzc2lvbkxpc3RlbmVyID0gbmV3IEJsb2NraW5nU2Vzc2lvbkNhbGxiYWNrKCk7CisgICAgICAgICAgICAgICAgbVNlc3Npb24gPSBjb25maWd1cmVDYW1lcmFTZXNzaW9uV2l0aENvbmZpZyhtQ2FtZXJhLCBvdXRwdXRDb25maWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25MaXN0ZW5lciwgbUhhbmRsZXIpOworCisgICAgICAgICAgICAgICAgcmVxdWVzdEJ1aWxkZXIgPSBtQ2FtZXJhLmNyZWF0ZUNhcHR1cmVSZXF1ZXN0KENhbWVyYURldmljZS5URU1QTEFURV9QUkVWSUVXLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsSWRTZXQpOworICAgICAgICAgICAgICAgIGZvciAoT3V0cHV0Q29uZmlndXJhdGlvbiBjIDogb3V0cHV0Q29uZmlncykgeworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QnVpbGRlci5hZGRUYXJnZXQoYy5nZXRTdXJmYWNlKCkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFNpbXBsZUNhcHR1cmVDYWxsYmFjayBzaW1wbGVSZXN1bHRMaXN0ZW5lciA9IG5ldyBTaW1wbGVDYXB0dXJlQ2FsbGJhY2soKTsKKyAgICAgICAgICAgICAgICBtU2Vzc2lvbi5zZXRSZXBlYXRpbmdSZXF1ZXN0KHJlcXVlc3RCdWlsZGVyLmJ1aWxkKCksIHNpbXBsZVJlc3VsdExpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgbUhhbmRsZXIpOworCisgICAgICAgICAgICAgICAgLy8gQ29udmVyZ2UgQUUKKyAgICAgICAgICAgICAgICB3YWl0Rm9yQWVTdGFibGUoc2ltcGxlUmVzdWx0TGlzdGVuZXIsIE5VTV9GUkFNRVNfV0FJVEVEX0ZPUl9VTktOT1dOX0xBVEVOQ1kpOworCisgICAgICAgICAgICAgICAgaWYgKG1TZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbVNlc3Npb24uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgY2xvc2VEZXZpY2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIGludmFsaWQvaW5jb3JyZWN0IG11bHRpcGxlIHBoeXNpY2FsIGNhcHR1cmUgcmVxdWVzdCBjYXNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFBoeXNpY2FsQ2FtZXJhUmVxdWVzdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBmb3IgKFN0cmluZyBpZCA6IG1DYW1lcmFJZHMpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiVGVzdGluZyBDYW1lcmEgIiArIGlkKTsKKyAgICAgICAgICAgICAgICBvcGVuRGV2aWNlKGlkKTsKKworICAgICAgICAgICAgICAgIGlmIChtU3RhdGljSW5mby5pc0hhcmR3YXJlTGV2ZWxMZWdhY3koKSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJDYW1lcmEgIiArIGlkICsgIiBpcyBsZWdhY3ksIHNraXBwaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIW1TdGF0aWNJbmZvLmlzQ29sb3JPdXRwdXRTdXBwb3J0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJDYW1lcmEgIiArIGlkICsgIiBkb2VzIG5vdCBzdXBwb3J0IGNvbG9yIG91dHB1dHMsIHNraXBwaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFNpemUgeXV2U2l6ZSA9IG1PcmRlcmVkUHJldmlld1NpemVzLmdldCgwKTsKKyAgICAgICAgICAgICAgICBMaXN0PE91dHB1dENvbmZpZ3VyYXRpb24+IG91dHB1dENvbmZpZ3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgICAgICAgICBMaXN0PEltYWdlUmVhZGVyPiBpbWFnZVJlYWRlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgICAgICAgICBTaW1wbGVJbWFnZVJlYWRlckxpc3RlbmVyIHJlYWRlckxpc3RlbmVyID0gbmV3IFNpbXBsZUltYWdlUmVhZGVyTGlzdGVuZXIoKTsKKyAgICAgICAgICAgICAgICBJbWFnZVJlYWRlciB5dXZUYXJnZXQgPSBDYW1lcmFUZXN0VXRpbHMubWFrZUltYWdlUmVhZGVyKHl1dlNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBJbWFnZUZvcm1hdC5ZVVZfNDIwXzg4OCwgTUFYX0lNQUdFX0NPVU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyTGlzdGVuZXIsIG1IYW5kbGVyKTsKKyAgICAgICAgICAgICAgICBpbWFnZVJlYWRlcnMuYWRkKHl1dlRhcmdldCk7CisgICAgICAgICAgICAgICAgT3V0cHV0Q29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgT3V0cHV0Q29uZmlndXJhdGlvbih5dXZUYXJnZXQuZ2V0U3VyZmFjZSgpKTsKKyAgICAgICAgICAgICAgICBvdXRwdXRDb25maWdzLmFkZChuZXcgT3V0cHV0Q29uZmlndXJhdGlvbih5dXZUYXJnZXQuZ2V0U3VyZmFjZSgpKSk7CisKKyAgICAgICAgICAgICAgICBBcnJheVNldDxTdHJpbmc+IHBoeXNpY2FsSWRTZXQgPSBuZXcgQXJyYXlTZXQ8U3RyaW5nPigpOworICAgICAgICAgICAgICAgIC8vIEludmFsaWQgcGh5c2ljYWwgaWQKKyAgICAgICAgICAgICAgICBwaHlzaWNhbElkU2V0LmFkZCgiLTIiKTsKKworICAgICAgICAgICAgICAgIENhcHR1cmVSZXF1ZXN0LkJ1aWxkZXIgcmVxdWVzdEJ1aWxkZXIgPQorICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhLmNyZWF0ZUNhcHR1cmVSZXF1ZXN0KENhbWVyYURldmljZS5URU1QTEFURV9QUkVWSUVXLCBwaHlzaWNhbElkU2V0KTsKKyAgICAgICAgICAgICAgICByZXF1ZXN0QnVpbGRlci5hZGRUYXJnZXQoY29uZmlnLmdldFN1cmZhY2UoKSk7CisKKyAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgaW52YWxpZCBzZXR0aW5nIGdldC9zZXQKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QnVpbGRlci5nZXRQaHlzaWNhbENhbWVyYUtleShDYXB0dXJlUmVxdWVzdC5DT05UUk9MX0NBUFRVUkVfSU5URU5ULCAiLTEiKTsKKyAgICAgICAgICAgICAgICAgICAgZmFpbCgiTm8gZXhjZXB0aW9uIGZvciBpbnZhbGlkIHBoeXNpY2FsIGNhbWVyYSBpZCIpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vZXhwZWN0ZWQKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QnVpbGRlci5zZXRQaHlzaWNhbENhbWVyYUtleShDYXB0dXJlUmVxdWVzdC5DT05UUk9MX0NBUFRVUkVfSU5URU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlZ2VyKDApLCAiLTEiKTsKKyAgICAgICAgICAgICAgICAgICAgZmFpbCgiTm8gZXhjZXB0aW9uIGZvciBpbnZhbGlkIHBoeXNpY2FsIGNhbWVyYSBpZCIpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vZXhwZWN0ZWQKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtU2Vzc2lvbkxpc3RlbmVyID0gbmV3IEJsb2NraW5nU2Vzc2lvbkNhbGxiYWNrKCk7CisgICAgICAgICAgICAgICAgbVNlc3Npb24gPSBjb25maWd1cmVDYW1lcmFTZXNzaW9uV2l0aENvbmZpZyhtQ2FtZXJhLCBvdXRwdXRDb25maWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25MaXN0ZW5lciwgbUhhbmRsZXIpOworCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbVNlc3Npb24uY2FwdHVyZShyZXF1ZXN0QnVpbGRlci5idWlsZCgpLCBuZXcgU2ltcGxlQ2FwdHVyZUNhbGxiYWNrKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhhbmRsZXIpOworICAgICAgICAgICAgICAgICAgICBmYWlsKCJObyBleGNlcHRpb24gZm9yIGludmFsaWQgcGh5c2ljYWwgY2FtZXJhIGlkIik7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy9leHBlY3RlZAorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChtU3RhdGljSW5mby5pc0xvZ2ljYWxNdWx0aUNhbWVyYSgpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEZpZ3VyZSBvdXQgeXV2IHNpemUgdG8gdXNlLgorICAgICAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gZHVhbFBoeXNpY2FsQ2FtZXJhSWRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICAgICAgICAgICAgICAgIFNpemUgc2hhcmVkU2l6ZT0gZmluZENvbW1vblByZXZpZXdTaXplKGlkLCBkdWFsUGh5c2ljYWxDYW1lcmFJZHMpOworICAgICAgICAgICAgICAgICAgICBpZiAoc2hhcmVkU2l6ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJDYW1lcmEgIiArIGlkICsgIjogTm8gbWF0Y2hpbmcgcGh5c2ljYWwgWVVWIHN0cmVhbXMsIHNraXBwaW5nIik7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsSWRTZXQuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxJZFNldC5hZGRBbGwoZHVhbFBoeXNpY2FsQ2FtZXJhSWRzKTsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEJ1aWxkZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgbUNhbWVyYS5jcmVhdGVDYXB0dXJlUmVxdWVzdChDYW1lcmFEZXZpY2UuVEVNUExBVEVfUFJFVklFVywgcGh5c2ljYWxJZFNldCk7CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RCdWlsZGVyLmFkZFRhcmdldChjb25maWcuZ2V0U3VyZmFjZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgQ2FwdHVyZVJlcXVlc3QgcmVxdWVzdCA9IHJlcXVlc3RCdWlsZGVyLmJ1aWxkKCk7CisKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uLmNhcHR1cmUocmVxdWVzdCwgbmV3IFNpbXBsZUNhcHR1cmVDYWxsYmFjaygpLCBtSGFuZGxlcik7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsKCJDYXB0dXJlIHJlcXVlc3RzIHRoYXQgZG9uJ3QgY29uZmlndXJlIG91dHB1dHMgd2l0aCBjb3JyZXNwb25kaW5nICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGh5c2ljYWwgY2FtZXJhIGlkIHNob3VsZCBmYWlsIik7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL2V4cGVjdGVkCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobVNlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbi5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgY2xvc2VEZXZpY2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgYSBjb21tb24gcHJldmlldyBzaXplIHRoYXQncyBzdXBwb3J0ZWQgYnkgYm90aCB0aGUgbG9naWNhbCBjYW1lcmEgYW5kCisgICAgICogdHdvIG9mIHRoZSB1bmRlcmx5aW5nIHBoeXNpY2FsIGNhbWVyYXMuCisgICAgICovCisgICAgcHJpdmF0ZSBTaXplIGZpbmRDb21tb25QcmV2aWV3U2l6ZShTdHJpbmcgY2FtZXJhSWQsCisgICAgICAgICAgICBMaXN0PFN0cmluZz4gZHVhbFBoeXNpY2FsQ2FtZXJhSWRzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTZXQ8U3RyaW5nPiBwaHlzaWNhbENhbWVyYUlkcyA9CisgICAgICAgICAgICAgICAgbVN0YXRpY0luZm8uZ2V0Q2hhcmFjdGVyaXN0aWNzKCkuZ2V0UGh5c2ljYWxDYW1lcmFJZHMoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiTG9naWNhbCBjYW1lcmEgbXVzdCBjb250YWluIGF0IGxlYXN0IDIgcGh5c2ljYWwgY2FtZXJhIGlkcyIsCisgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZHMuc2l6ZSgpID49IDIpOworCisgICAgICAgIExpc3Q8U2l6ZT4gcHJldmlld1NpemVzID0gZ2V0U3VwcG9ydGVkUHJldmlld1NpemVzKAorICAgICAgICAgICAgICAgIGNhbWVyYUlkLCBtQ2FtZXJhTWFuYWdlciwgUFJFVklFV19TSVpFX0JPVU5EKTsKKyAgICAgICAgSGFzaE1hcDxTdHJpbmcsIExpc3Q8U2l6ZT4+IHBoeXNpY2FsUHJldmlld1NpemVzTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PFNpemU+PigpOworICAgICAgICBIYXNoTWFwPFN0cmluZywgU3RyZWFtQ29uZmlndXJhdGlvbk1hcD4gcGh5c2ljYWxDb25maWdzID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBmb3IgKFN0cmluZyBwaHlzaWNhbENhbWVyYUlkIDogcGh5c2ljYWxDYW1lcmFJZHMpIHsKKyAgICAgICAgICAgIENhbWVyYUNoYXJhY3RlcmlzdGljcyBwcm9wZXJ0aWVzID0KKyAgICAgICAgICAgICAgICAgICAgbUNhbWVyYU1hbmFnZXIuZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKHBoeXNpY2FsQ2FtZXJhSWQpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiQ2FuJ3QgZ2V0IGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MhIiwgcHJvcGVydGllcyk7CisgICAgICAgICAgICBpZiAoIW1BbGxTdGF0aWNJbmZvLmdldChwaHlzaWNhbENhbWVyYUlkKS5pc0NvbG9yT3V0cHV0U3VwcG9ydGVkKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBObyBjb2xvciBvdXRwdXQgc3VwcG9ydCwgc2tpcC4KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmVhbUNvbmZpZ3VyYXRpb25NYXAgY29uZmlnTWFwID0KKyAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLmdldChDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuU0NBTEVSX1NUUkVBTV9DT05GSUdVUkFUSU9OX01BUCk7CisgICAgICAgICAgICBwaHlzaWNhbENvbmZpZ3MucHV0KHBoeXNpY2FsQ2FtZXJhSWQsIGNvbmZpZ01hcCk7CisgICAgICAgICAgICBwaHlzaWNhbFByZXZpZXdTaXplc01hcC5wdXQocGh5c2ljYWxDYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgZ2V0U3VwcG9ydGVkUHJldmlld1NpemVzKHBoeXNpY2FsQ2FtZXJhSWQsIG1DYW1lcmFNYW5hZ2VyLCBQUkVWSUVXX1NJWkVfQk9VTkQpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZpbmQgZGlzcGxheSBzaXplIGZyb20gd2luZG93IHNlcnZpY2UuCisgICAgICAgIENvbnRleHQgY29udGV4dCA9IGdldEluc3RydW1lbnRhdGlvbigpLmdldFRhcmdldENvbnRleHQoKTsKKyAgICAgICAgV2luZG93TWFuYWdlciB3aW5kb3dNYW5hZ2VyID0KKyAgICAgICAgICAgICAgICAoV2luZG93TWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuV0lORE9XX1NFUlZJQ0UpOworICAgICAgICBEaXNwbGF5IGRpc3BsYXkgPSB3aW5kb3dNYW5hZ2VyLmdldERlZmF1bHREaXNwbGF5KCk7CisKKyAgICAgICAgaW50IGRpc3BsYXlXaWR0aCA9IGRpc3BsYXkuZ2V0V2lkdGgoKTsKKyAgICAgICAgaW50IGRpc3BsYXlIZWlnaHQgPSBkaXNwbGF5LmdldEhlaWdodCgpOworCisgICAgICAgIGlmIChkaXNwbGF5SGVpZ2h0ID4gZGlzcGxheVdpZHRoKSB7CisgICAgICAgICAgICBkaXNwbGF5SGVpZ2h0ID0gZGlzcGxheVdpZHRoOworICAgICAgICAgICAgZGlzcGxheVdpZHRoID0gZGlzcGxheS5nZXRIZWlnaHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmVhbUNvbmZpZ3VyYXRpb25NYXAgY29uZmlnID0gbVN0YXRpY0luZm8uZ2V0Q2hhcmFjdGVyaXN0aWNzKCkuZ2V0KAorICAgICAgICAgICAgICAgIENhbWVyYUNoYXJhY3RlcmlzdGljcy5TQ0FMRVJfU1RSRUFNX0NPTkZJR1VSQVRJT05fTUFQKTsKKyAgICAgICAgZm9yIChTaXplIHByZXZpZXdTaXplIDogcHJldmlld1NpemVzKSB7CisgICAgICAgICAgICBkdWFsUGh5c2ljYWxDYW1lcmFJZHMuY2xlYXIoKTsKKyAgICAgICAgICAgIC8vIFNraXAgcHJldmlldyBzaXplcyBsYXJnZXIgdGhhbiBzY3JlZW4gc2l6ZQorICAgICAgICAgICAgaWYgKHByZXZpZXdTaXplLmdldFdpZHRoKCkgPiBkaXNwbGF5V2lkdGggfHwKKyAgICAgICAgICAgICAgICAgICAgcHJldmlld1NpemUuZ2V0SGVpZ2h0KCkgPiBkaXNwbGF5SGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIGxvbmcgbWluRnJhbWVEdXJhdGlvbiA9IGNvbmZpZy5nZXRPdXRwdXRNaW5GcmFtZUR1cmF0aW9uKAorICAgICAgICAgICAgICAgICAgIEltYWdlRm9ybWF0LllVVl80MjBfODg4LCBwcmV2aWV3U2l6ZSk7CisKKyAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHN1cHBvcnRlZFBoeXNpY2FsQ2FtZXJhcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICAgICAgZm9yIChTdHJpbmcgcGh5c2ljYWxDYW1lcmFJZCA6IHBoeXNpY2FsQ2FtZXJhSWRzKSB7CisgICAgICAgICAgICAgICAgTGlzdDxTaXplPiBwaHlzaWNhbFByZXZpZXdTaXplcyA9IHBoeXNpY2FsUHJldmlld1NpemVzTWFwLmdldChwaHlzaWNhbENhbWVyYUlkKTsKKyAgICAgICAgICAgICAgICBpZiAocGh5c2ljYWxQcmV2aWV3U2l6ZXMgIT0gbnVsbCAmJiBwaHlzaWNhbFByZXZpZXdTaXplcy5jb250YWlucyhwcmV2aWV3U2l6ZSkpIHsKKyAgICAgICAgICAgICAgICAgICBsb25nIG1pbkR1cmF0aW9uUGh5c2ljYWwgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDb25maWdzLmdldChwaHlzaWNhbENhbWVyYUlkKS5nZXRPdXRwdXRNaW5GcmFtZUR1cmF0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1hZ2VGb3JtYXQuWVVWXzQyMF84ODgsIHByZXZpZXdTaXplKTsKKyAgICAgICAgICAgICAgICAgICBpZiAobWluRHVyYXRpb25QaHlzaWNhbCA8PSBtaW5GcmFtZUR1cmF0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkdWFsUGh5c2ljYWxDYW1lcmFJZHMuYWRkKHBoeXNpY2FsQ2FtZXJhSWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR1YWxQaHlzaWNhbENhbWVyYUlkcy5zaXplKCkgPT0gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcmV2aWV3U2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgcGh5c2ljYWwgY2FtZXJhIFlVViBzdHJlYW1pbmcgd2l0aGluIGEgcGFydGljdWxhciBsb2dpY2FsIGNhbWVyYS4KKyAgICAgKgorICAgICAqIFVzZSAyIFlVViBzdHJlYW1zIHdpdGggUFJFVklFVyBvciBzbWFsbGVyIHNpemUsIHdoaWNoIGlzIGd1YXJhbnRlZWQgZm9yIExJTUlURUQgZGV2aWNlIGxldmVsLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB0ZXN0QmFzaWNQaHlzaWNhbFN0cmVhbWluZ0ZvckNhbWVyYShTdHJpbmcgbG9naWNhbENhbWVyYUlkLAorICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHBoeXNpY2FsQ2FtZXJhSWRzLCBTaXplIHByZXZpZXdTaXplKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTGlzdDxPdXRwdXRDb25maWd1cmF0aW9uPiBvdXRwdXRDb25maWdzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIExpc3Q8SW1hZ2VSZWFkZXI+IGltYWdlUmVhZGVycyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgICAgIC8vIEFkZCAxIGxvZ2ljYWwgWVVWIHN0cmVhbQorICAgICAgICBJbWFnZVJlYWRlciBsb2dpY2FsVGFyZ2V0ID0gQ2FtZXJhVGVzdFV0aWxzLm1ha2VJbWFnZVJlYWRlcihwcmV2aWV3U2l6ZSwKKyAgICAgICAgICAgICAgICBJbWFnZUZvcm1hdC5ZVVZfNDIwXzg4OCwgTUFYX0lNQUdFX0NPVU5ULAorICAgICAgICAgICAgICAgIG5ldyBJbWFnZURyb3BwZXJMaXN0ZW5lcigpLCBtSGFuZGxlcik7CisgICAgICAgIGltYWdlUmVhZGVycy5hZGQobG9naWNhbFRhcmdldCk7CisgICAgICAgIG91dHB1dENvbmZpZ3MuYWRkKG5ldyBPdXRwdXRDb25maWd1cmF0aW9uKGxvZ2ljYWxUYXJnZXQuZ2V0U3VyZmFjZSgpKSk7CisKKyAgICAgICAgLy8gQWRkIHBoeXNpY2FsIFlVViBzdHJlYW1zCisgICAgICAgIGlmIChwaHlzaWNhbENhbWVyYUlkcy5zaXplKCkgIT0gMikgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGh5aXNjYWxDYW1lcmFJZHMgbXVzdCBjb250YWluIDIgY2FtZXJhIGlkcyIpOworICAgICAgICB9CisgICAgICAgIExpc3Q8SW1hZ2VSZWFkZXI+IHBoeXNpY2FsVGFyZ2V0cyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBmb3IgKFN0cmluZyBwaHlzaWNhbENhbWVyYUlkIDogcGh5c2ljYWxDYW1lcmFJZHMpIHsKKyAgICAgICAgICAgIEltYWdlUmVhZGVyIHBoeXNpY2FsVGFyZ2V0ID0gQ2FtZXJhVGVzdFV0aWxzLm1ha2VJbWFnZVJlYWRlcihwcmV2aWV3U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgSW1hZ2VGb3JtYXQuWVVWXzQyMF84ODgsIE1BWF9JTUFHRV9DT1VOVCwKKyAgICAgICAgICAgICAgICAgICAgbmV3IEltYWdlRHJvcHBlckxpc3RlbmVyKCksIG1IYW5kbGVyKTsKKyAgICAgICAgICAgIE91dHB1dENvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IE91dHB1dENvbmZpZ3VyYXRpb24ocGh5c2ljYWxUYXJnZXQuZ2V0U3VyZmFjZSgpKTsKKyAgICAgICAgICAgIGNvbmZpZy5zZXRQaHlzaWNhbENhbWVyYUlkKHBoeXNpY2FsQ2FtZXJhSWQpOworICAgICAgICAgICAgb3V0cHV0Q29uZmlncy5hZGQoY29uZmlnKTsKKyAgICAgICAgICAgIHBoeXNpY2FsVGFyZ2V0cy5hZGQocGh5c2ljYWxUYXJnZXQpOworICAgICAgICB9CisKKyAgICAgICAgbVNlc3Npb25MaXN0ZW5lciA9IG5ldyBCbG9ja2luZ1Nlc3Npb25DYWxsYmFjaygpOworICAgICAgICBtU2Vzc2lvbiA9IGNvbmZpZ3VyZUNhbWVyYVNlc3Npb25XaXRoQ29uZmlnKG1DYW1lcmEsIG91dHB1dENvbmZpZ3MsCisgICAgICAgICAgICAgICAgbVNlc3Npb25MaXN0ZW5lciwgbUhhbmRsZXIpOworCisgICAgICAgIC8vIFN0cmVhbSBsb2dpY2FsIFlVViBzdHJlYW0gYW5kIG5vdGUgZG93biB0aGUgRlBTCisgICAgICAgIENhcHR1cmVSZXF1ZXN0LkJ1aWxkZXIgcmVxdWVzdEJ1aWxkZXIgPQorICAgICAgICAgICAgICAgIG1DYW1lcmEuY3JlYXRlQ2FwdHVyZVJlcXVlc3QoQ2FtZXJhRGV2aWNlLlRFTVBMQVRFX1BSRVZJRVcpOworICAgICAgICByZXF1ZXN0QnVpbGRlci5hZGRUYXJnZXQobG9naWNhbFRhcmdldC5nZXRTdXJmYWNlKCkpOworCisgICAgICAgIFNpbXBsZUNhcHR1cmVDYWxsYmFjayBzaW1wbGVSZXN1bHRMaXN0ZW5lciA9CisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUNhcHR1cmVDYWxsYmFjaygpOworICAgICAgICBTdHJlYW1Db25maWd1cmF0aW9uTWFwIGNvbmZpZyA9IG1TdGF0aWNJbmZvLmdldENoYXJhY3RlcmlzdGljcygpLmdldCgKKyAgICAgICAgICAgICAgICBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuU0NBTEVSX1NUUkVBTV9DT05GSUdVUkFUSU9OX01BUCk7CisgICAgICAgIGZpbmFsIGxvbmcgbWluRnJhbWVEdXJhdGlvbiA9IGNvbmZpZy5nZXRPdXRwdXRNaW5GcmFtZUR1cmF0aW9uKAorICAgICAgICAgICAgICAgIEltYWdlRm9ybWF0LllVVl80MjBfODg4LCBwcmV2aWV3U2l6ZSk7CisgICAgICAgIGlmIChtaW5GcmFtZUR1cmF0aW9uID4gMCkgeworICAgICAgICAgICAgUmFuZ2U8SW50ZWdlcj4gdGFyZ2V0UmFuZ2UgPSBnZXRTdWl0YWJsZUZwc1JhbmdlRm9yRHVyYXRpb24obG9naWNhbENhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICBtaW5GcmFtZUR1cmF0aW9uKTsKKyAgICAgICAgICAgIHJlcXVlc3RCdWlsZGVyLnNldChDYXB0dXJlUmVxdWVzdC5DT05UUk9MX0FFX1RBUkdFVF9GUFNfUkFOR0UsIHRhcmdldFJhbmdlKTsKKyAgICAgICAgfQorICAgICAgICBtU2Vzc2lvbi5zZXRSZXBlYXRpbmdSZXF1ZXN0KHJlcXVlc3RCdWlsZGVyLmJ1aWxkKCksCisgICAgICAgICAgICAgICAgc2ltcGxlUmVzdWx0TGlzdGVuZXIsIG1IYW5kbGVyKTsKKworICAgICAgICAvLyBDb252ZXJnZSBBRQorICAgICAgICB3YWl0Rm9yQWVTdGFibGUoc2ltcGxlUmVzdWx0TGlzdGVuZXIsIE5VTV9GUkFNRVNfV0FJVEVEX0ZPUl9VTktOT1dOX0xBVEVOQ1kpOworCisgICAgICAgIGlmIChtU3RhdGljSW5mby5pc0FlTG9ja1N1cHBvcnRlZCgpKSB7CisgICAgICAgICAgICAvLyBMb2NrIEFFIGlmIHN1cHBvcnRlZC4KKyAgICAgICAgICAgIHJlcXVlc3RCdWlsZGVyLnNldChDYXB0dXJlUmVxdWVzdC5DT05UUk9MX0FFX0xPQ0ssIHRydWUpOworICAgICAgICAgICAgbVNlc3Npb24uc2V0UmVwZWF0aW5nUmVxdWVzdChyZXF1ZXN0QnVpbGRlci5idWlsZCgpLCBzaW1wbGVSZXN1bHRMaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgbUhhbmRsZXIpOworICAgICAgICAgICAgd2FpdEZvclJlc3VsdFZhbHVlKHNpbXBsZVJlc3VsdExpc3RlbmVyLCBDYXB0dXJlUmVzdWx0LkNPTlRST0xfQUVfU1RBVEUsCisgICAgICAgICAgICAgICAgICAgIENhcHR1cmVSZXN1bHQuQ09OVFJPTF9BRV9TVEFURV9MT0NLRUQsIE5VTV9SRVNVTFRTX1dBSVRfVElNRU9VVCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBWZXJpZnkgcmVzdWx0cworICAgICAgICBDYXB0dXJlUmVzdWx0VGVzdC52YWxpZGF0ZUNhcHR1cmVSZXN1bHQobUNvbGxlY3Rvciwgc2ltcGxlUmVzdWx0TGlzdGVuZXIsCisgICAgICAgICAgICAgICAgbVN0YXRpY0luZm8sIG1BbGxTdGF0aWNJbmZvLCBudWxsLypyZXF1ZXN0ZWRQaHlzaWNhbElkcyovLAorICAgICAgICAgICAgICAgIHJlcXVlc3RCdWlsZGVyLCBOVU1fRlJBTUVTX0NIRUNLRUQpOworCisgICAgICAgIC8vIENvbGxlY3QgdGltZXN0YW1wcyBmb3Igb25lIGxvZ2ljYWwgc3RyZWFtIG9ubHkuCisgICAgICAgIGxvbmcgcHJldlRpbWVzdGFtcCA9IC0xOworICAgICAgICBsb25nW10gbG9naWNhbFRpbWVzdGFtcHMgPSBuZXcgbG9uZ1tOVU1fRlJBTUVTX0NIRUNLRURdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9GUkFNRVNfQ0hFQ0tFRDsgaSsrKSB7CisgICAgICAgICAgICBUb3RhbENhcHR1cmVSZXN1bHQgdG90YWxDYXB0dXJlUmVzdWx0ID0KKyAgICAgICAgICAgICAgICAgICAgc2ltcGxlUmVzdWx0TGlzdGVuZXIuZ2V0VG90YWxDYXB0dXJlUmVzdWx0KAorICAgICAgICAgICAgICAgICAgICBDYW1lcmFUZXN0VXRpbHMuQ0FQVFVSRV9SRVNVTFRfVElNRU9VVF9NUyk7CisgICAgICAgICAgICBsb2dpY2FsVGltZXN0YW1wc1tpXSA9IHRvdGFsQ2FwdHVyZVJlc3VsdC5nZXQoQ2FwdHVyZVJlc3VsdC5TRU5TT1JfVElNRVNUQU1QKTsKKyAgICAgICAgfQorCisgICAgICAgIGRvdWJsZSBsb2dpY2FsQXZnRHVyYXRpb25NcyA9IChsb2dpY2FsVGltZXN0YW1wc1tOVU1fRlJBTUVTX0NIRUNLRUQtMV0gLQorICAgICAgICAgICAgICAgIGxvZ2ljYWxUaW1lc3RhbXBzWzBdKS8oTlNfUEVSX01TKihOVU1fRlJBTUVTX0NIRUNLRUQtMSkpOworCisgICAgICAgIC8vIFJlcXVlc3Qgb25lIGxvZ2ljYWwgc3RyZWFtIGFuZCBvbmUgcGh5c2ljYWwgc3RyZWFtCisgICAgICAgIHNpbXBsZVJlc3VsdExpc3RlbmVyID0gbmV3IFNpbXBsZUNhcHR1cmVDYWxsYmFjaygpOworICAgICAgICByZXF1ZXN0QnVpbGRlci5hZGRUYXJnZXQocGh5c2ljYWxUYXJnZXRzLmdldCgxKS5nZXRTdXJmYWNlKCkpOworICAgICAgICBtU2Vzc2lvbi5zZXRSZXBlYXRpbmdSZXF1ZXN0KHJlcXVlc3RCdWlsZGVyLmJ1aWxkKCksIHNpbXBsZVJlc3VsdExpc3RlbmVyLAorICAgICAgICAgICAgICAgIG1IYW5kbGVyKTsKKworICAgICAgICAvLyBWZXJpZnkgcmVzdWx0cyBmb3IgcGh5c2ljYWwgc3RyZWFtcyByZXF1ZXN0LgorICAgICAgICBDYXB0dXJlUmVzdWx0VGVzdC52YWxpZGF0ZUNhcHR1cmVSZXN1bHQobUNvbGxlY3Rvciwgc2ltcGxlUmVzdWx0TGlzdGVuZXIsCisgICAgICAgICAgICAgICAgbVN0YXRpY0luZm8sIG1BbGxTdGF0aWNJbmZvLCBwaHlzaWNhbENhbWVyYUlkcy5zdWJMaXN0KDEsIDIpLCByZXF1ZXN0QnVpbGRlciwKKyAgICAgICAgICAgICAgICBOVU1fRlJBTUVTX0NIRUNLRUQpOworCisKKyAgICAgICAgLy8gU3RhcnQgcmVxdWVzdGluZyBvbiBib3RoIGxvZ2ljYWwgYW5kIHBoeXNpY2FsIHN0cmVhbXMKKyAgICAgICAgU2ltcGxlQ2FwdHVyZUNhbGxiYWNrIHNpbXBsZVJlc3VsdExpc3RlbmVyRHVhbCA9CisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUNhcHR1cmVDYWxsYmFjaygpOworICAgICAgICBmb3IgKEltYWdlUmVhZGVyIHBoeXNpY2FsVGFyZ2V0IDogcGh5c2ljYWxUYXJnZXRzKSB7CisgICAgICAgICAgICByZXF1ZXN0QnVpbGRlci5hZGRUYXJnZXQocGh5c2ljYWxUYXJnZXQuZ2V0U3VyZmFjZSgpKTsKKyAgICAgICAgfQorICAgICAgICBtU2Vzc2lvbi5zZXRSZXBlYXRpbmdSZXF1ZXN0KHJlcXVlc3RCdWlsZGVyLmJ1aWxkKCksIHNpbXBsZVJlc3VsdExpc3RlbmVyRHVhbCwKKyAgICAgICAgICAgICAgICBtSGFuZGxlcik7CisKKyAgICAgICAgLy8gVmVyaWZ5IHJlc3VsdHMgZm9yIHBoeXNpY2FsIHN0cmVhbXMgcmVxdWVzdC4KKyAgICAgICAgQ2FwdHVyZVJlc3VsdFRlc3QudmFsaWRhdGVDYXB0dXJlUmVzdWx0KG1Db2xsZWN0b3IsIHNpbXBsZVJlc3VsdExpc3RlbmVyRHVhbCwKKyAgICAgICAgICAgICAgICBtU3RhdGljSW5mbywgbUFsbFN0YXRpY0luZm8sIHBoeXNpY2FsQ2FtZXJhSWRzLCByZXF1ZXN0QnVpbGRlciwKKyAgICAgICAgICAgICAgICBOVU1fRlJBTUVTX0NIRUNLRUQpOworCisgICAgICAgIC8vIEFjcXVpcmUgdGhlIHRpbWVzdGFtcHMgb2YgdGhlIHBoeXNpY2FsIGNhbWVyYS4KKyAgICAgICAgbG9uZ1tdIGxvZ2ljYWxUaW1lc3RhbXBzMiA9IG5ldyBsb25nW05VTV9GUkFNRVNfQ0hFQ0tFRF07CisgICAgICAgIGxvbmcgW11bXSBwaHlzaWNhbFRpbWVzdGFtcHMgPSBuZXcgbG9uZ1twaHlzaWNhbFRhcmdldHMuc2l6ZSgpXVtdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBoeXNpY2FsVGFyZ2V0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgcGh5c2ljYWxUaW1lc3RhbXBzW2ldID0gbmV3IGxvbmdbTlVNX0ZSQU1FU19DSEVDS0VEXTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9GUkFNRVNfQ0hFQ0tFRDsgaSsrKSB7CisgICAgICAgICAgICBUb3RhbENhcHR1cmVSZXN1bHQgdG90YWxDYXB0dXJlUmVzdWx0RHVhbCA9CisgICAgICAgICAgICAgICAgICAgIHNpbXBsZVJlc3VsdExpc3RlbmVyRHVhbC5nZXRUb3RhbENhcHR1cmVSZXN1bHQoCisgICAgICAgICAgICAgICAgICAgIENhbWVyYVRlc3RVdGlscy5DQVBUVVJFX1JFU1VMVF9USU1FT1VUX01TKTsKKyAgICAgICAgICAgIGxvZ2ljYWxUaW1lc3RhbXBzMltpXSA9IHRvdGFsQ2FwdHVyZVJlc3VsdER1YWwuZ2V0KENhcHR1cmVSZXN1bHQuU0VOU09SX1RJTUVTVEFNUCk7CisKKyAgICAgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgICAgICBNYXA8U3RyaW5nLCBDYXB0dXJlUmVzdWx0PiBwaHlzaWNhbFJlc3VsdHNEdWFsID0KKyAgICAgICAgICAgICAgICAgICAgdG90YWxDYXB0dXJlUmVzdWx0RHVhbC5nZXRQaHlzaWNhbENhbWVyYVJlc3VsdHMoKTsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIHBoeXNpY2FsSWQgOiBwaHlzaWNhbENhbWVyYUlkcykgeworICAgICAgICAgICAgICAgICBwaHlzaWNhbFRpbWVzdGFtcHNbaW5kZXhdW2ldID0gcGh5c2ljYWxSZXN1bHRzRHVhbC5nZXQocGh5c2ljYWxJZCkuZ2V0KAorICAgICAgICAgICAgICAgICAgICAgICAgIENhcHR1cmVSZXN1bHQuU0VOU09SX1RJTUVTVEFNUCk7CisgICAgICAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayB0aW1lc3RhbXAgbW9ub2xpdGhpdHkgZm9yIGluZGl2aWR1YWwgY2FtZXJhIGFuZCBhY3Jvc3MgY2FtZXJhcworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9GUkFNRVNfQ0hFQ0tFRC0xOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkxvZ2ljYWwgY2FtZXJhIHRpbWVzdGFtcCBtdXN0IG1vbm9saXRoaWNhbGx5IGluY3JlYXNlIiwKKyAgICAgICAgICAgICAgICAgICAgbG9naWNhbFRpbWVzdGFtcHMyW2ldIDwgbG9naWNhbFRpbWVzdGFtcHMyW2krMV0pOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGh5c2ljYWxDYW1lcmFJZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwIDsgaiA8IE5VTV9GUkFNRVNfQ0hFQ0tFRC0xOyBqKyspIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJQaHlzaWNhbCBjYW1lcmEgdGltZXN0YW1wIG11c3QgbW9ub2xpdGhpY2FsbHkgaW5jcmVhc2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxUaW1lc3RhbXBzW2ldW2pdIDwgcGh5c2ljYWxUaW1lc3RhbXBzW2ldW2orMV0pOworICAgICAgICAgICAgICAgIGlmIChqID4gMCkgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJQaHlzaWNhbCBjYW1lcmEncyB0aW1lc3RhbXAgTiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBsb2dpY2FsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYW1lcmEncyB0aW1lc3RhbXAgTi0xIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbFRpbWVzdGFtcHNbaV1bal0gPiBsb2dpY2FsVGltZXN0YW1wc1tqLTFdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiUGh5c2ljYWwgY2FtZXJhJ3MgdGltZXN0YW1wIE4gbXVzdCBiZSBsZXNzIHRoYW4gbG9naWNhbCBjYW1lcmEncyAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aW1lc3RhbXAgTisxIiwgcGh5c2ljYWxUaW1lc3RhbXBzW2ldW2pdID4gbG9naWNhbFRpbWVzdGFtcHNbaisxXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZG91YmxlIGxvZ2ljYWxBdmdEdXJhdGlvbk1zMiA9IChsb2dpY2FsVGltZXN0YW1wczJbTlVNX0ZSQU1FU19DSEVDS0VELTFdIC0KKyAgICAgICAgICAgICAgICBsb2dpY2FsVGltZXN0YW1wczJbMF0pLyhOU19QRVJfTVMqKE5VTV9GUkFNRVNfQ0hFQ0tFRC0xKSk7CisKKyAgICAgICAgbUNvbGxlY3Rvci5leHBlY3RMZXNzT3JFcXVhbCgiVGhlIGF2ZXJhZ2UgZnJhbWUgZHVyYXRpb24gaW5jcmVhc2Ugb2YgYWxsIHBoeXNpY2FsICIKKyAgICAgICAgICAgICAgICArICJzdHJlYW1zIGlzIGxhcmdlciB0aGFuIHRocmVzaG9sZDogIgorICAgICAgICAgICAgICAgICsgU3RyaW5nLmZvcm1hdCgiaW5jcmVhc2UgPSAlLjJmLCB0aHJlc2hvbGQgPSAlLjJmIiwKKyAgICAgICAgICAgICAgICAgIChsb2dpY2FsQXZnRHVyYXRpb25NczIgLSBsb2dpY2FsQXZnRHVyYXRpb25NcykvbG9naWNhbEF2Z0R1cmF0aW9uTXMsCisgICAgICAgICAgICAgICAgICBGUkFNRV9EVVJBVElPTl9USFJFU0hPTEQpLAorICAgICAgICAgICAgICAgIGxvZ2ljYWxBdmdEdXJhdGlvbk1zKigxK0ZSQU1FX0RVUkFUSU9OX1RIUkVTSE9MRCksCisgICAgICAgICAgICAgICAgbG9naWNhbEF2Z0R1cmF0aW9uTXMyKTsKKworICAgICAgICAvLyBTdG9wIHByZXZpZXcKKyAgICAgICAgaWYgKG1TZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1TZXNzaW9uLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9jdHMvTXVsdGlWaWV3VGVzdC5qYXZhIGIvdGVzdHMvY2FtZXJhL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvY3RzL011bHRpVmlld1Rlc3QuamF2YQppbmRleCAyNjU3MjlkLi45YmRiODk4IDEwMDY0NAotLS0gYS90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9jdHMvTXVsdGlWaWV3VGVzdC5qYXZhCisrKyBiL3Rlc3RzL2NhbWVyYS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL2N0cy9NdWx0aVZpZXdUZXN0LmphdmEKQEAgLTIxLDEzICsyMSwyMCBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuSW1hZ2VGb3JtYXQ7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5TdXJmYWNlVGV4dHVyZTsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FtZXJhRGV2aWNlOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYW1lcmFBY2Nlc3NFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhcHR1cmVSZXF1ZXN0OworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYXB0dXJlRmFpbHVyZTsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuVG90YWxDYXB0dXJlUmVzdWx0OwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5jdHMuQ2FtZXJhVGVzdFV0aWxzLkltYWdlVmVyaWZpZXJMaXN0ZW5lcjsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuY3RzLmhlbHBlcnMuU3RhdGljTWV0YWRhdGE7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLmN0cy50ZXN0Y2FzZXMuQ2FtZXJhMk11bHRpVmlld1Rlc3RDYXNlOwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5jdHMudGVzdGNhc2VzLkNhbWVyYTJNdWx0aVZpZXdUZXN0Q2FzZS5DYW1lcmFQcmV2aWV3TGlzdGVuZXI7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLnBhcmFtcy5PdXRwdXRDb25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQubWVkaWEuSW1hZ2U7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5JbWFnZVJlYWRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQub3MuQ29uZGl0aW9uVmFyaWFibGU7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNpemU7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2U7CkBAIC00MiwxMCArNDksMTQgQEAKIC8qKgogICogQ2FtZXJhRGV2aWNlIHRlc3QgYnkgdXNpbmcgY29tYmluYXRpb24gb2YgU3VyZmFjZVZpZXcsIFRleHR1cmVWaWV3IGFuZCBJbWFnZVJlYWRlcgogICovCitAQXBwTW9kZUZ1bGwKIHB1YmxpYyBjbGFzcyBNdWx0aVZpZXdUZXN0IGV4dGVuZHMgQ2FtZXJhMk11bHRpVmlld1Rlc3RDYXNlIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk11bHRpVmlld1Rlc3QiOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGxvbmcgV0FJVF9GT1JfQ09NTUFORF9UT19DT01QTEVURSA9IDIwMDA7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgbG9uZyBXQUlUX0ZPUl9DT01NQU5EX1RPX0NPTVBMRVRFID0gNTAwMDsgLy9tcwogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGxvbmcgUFJFVklFV19USU1FX01TID0gMjAwMDsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgTlVNX1NVUkZBQ0VfU1dJVENIRVMgPSAxMDsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgSU1HX1JFQURFUl9DT1VOVCA9IDI7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFlVVl9JTUdfUkVBREVSX0NPVU5UID0gMzsKIAogICAgIHB1YmxpYyB2b2lkIHRlc3RUZXh0dXJlVmlld1ByZXZpZXcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZm9yIChTdHJpbmcgY2FtZXJhSWQgOiBtQ2FtZXJhSWRzKSB7CkBAIC0yMzUsNiArMjQ2LDU3OSBAQAogICAgIH0KIAogICAgIC8qCisgICAgICogVmVyaWZ5IGR5bmFtaWMgc2hhcmVkIHN1cmZhY2UgYmVoYXZpb3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFNoYXJlZFN1cmZhY2VCYXNpYygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmb3IgKFN0cmluZyBjYW1lcmFJZCA6IG1DYW1lcmFJZHMpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb3BlbkNhbWVyYShjYW1lcmFJZCk7CisgICAgICAgICAgICAgICAgaWYgKGdldFN0YXRpY0luZm8oY2FtZXJhSWQpLmlzSGFyZHdhcmVMZXZlbExlZ2FjeSgpKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkNhbWVyYSAiICsgY2FtZXJhSWQgKyAiIGlzIGxlZ2FjeSwgc2tpcHBpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghZ2V0U3RhdGljSW5mbyhjYW1lcmFJZCkuaXNDb2xvck91dHB1dFN1cHBvcnRlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkNhbWVyYSAiICsgY2FtZXJhSWQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZG9lcyBub3Qgc3VwcG9ydCBjb2xvciBvdXRwdXRzLCBza2lwcGluZyIpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0ZXN0U2hhcmVkU3VyZmFjZUJhc2ljQnlDYW1lcmEoY2FtZXJhSWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgICAgICAgY2xvc2VDYW1lcmEoY2FtZXJhSWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RTaGFyZWRTdXJmYWNlQmFzaWNCeUNhbWVyYShTdHJpbmcgY2FtZXJhSWQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTaXplIHByZXZpZXdTaXplID0gZ2V0T3JkZXJlZFByZXZpZXdTaXplcyhjYW1lcmFJZCkuZ2V0KDApOworICAgICAgICBDYW1lcmFQcmV2aWV3TGlzdGVuZXJbXSBwcmV2aWV3TGlzdGVuZXIgPSBuZXcgQ2FtZXJhUHJldmlld0xpc3RlbmVyWzJdOworICAgICAgICBTdXJmYWNlVGV4dHVyZVtdIHByZXZpZXdUZXh0dXJlID0gbmV3IFN1cmZhY2VUZXh0dXJlWzJdOworICAgICAgICBTdXJmYWNlW10gc3VyZmFjZXMgPSBuZXcgU3VyZmFjZVsyXTsKKyAgICAgICAgT3V0cHV0Q29uZmlndXJhdGlvbltdIG91dHB1dENvbmZpZ3MgPSBuZXcgT3V0cHV0Q29uZmlndXJhdGlvblsyXTsKKyAgICAgICAgTGlzdDxPdXRwdXRDb25maWd1cmF0aW9uPiBvdXRwdXRDb25maWd1cmF0aW9ucyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgICAgIC8vIENyZWF0ZSBzdXJmYWNlIHRleHR1cmVzIHdpdGggdGhlIHNhbWUgc2l6ZQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICAgICAgcHJldmlld0xpc3RlbmVyW2ldID0gbmV3IENhbWVyYVByZXZpZXdMaXN0ZW5lcigpOworICAgICAgICAgICAgbVRleHR1cmVWaWV3W2ldLnNldFN1cmZhY2VUZXh0dXJlTGlzdGVuZXIocHJldmlld0xpc3RlbmVyW2ldKTsKKyAgICAgICAgICAgIHByZXZpZXdUZXh0dXJlW2ldID0gZ2V0QXZhaWxhYmxlU3VyZmFjZVRleHR1cmUoCisgICAgICAgICAgICAgICAgICAgIFdBSVRfRk9SX0NPTU1BTkRfVE9fQ09NUExFVEUsIG1UZXh0dXJlVmlld1tpXSk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJVbmFibGUgdG8gZ2V0IHByZXZpZXcgc3VyZmFjZSB0ZXh0dXJlIiwgcHJldmlld1RleHR1cmVbaV0pOworICAgICAgICAgICAgcHJldmlld1RleHR1cmVbaV0uc2V0RGVmYXVsdEJ1ZmZlclNpemUocHJldmlld1NpemUuZ2V0V2lkdGgoKSwgcHJldmlld1NpemUuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgLy8gQ29ycmVjdCB0aGUgcHJldmlldyBkaXNwbGF5IHJvdGF0aW9uLgorICAgICAgICAgICAgdXBkYXRlUHJldmlld0Rpc3BsYXlSb3RhdGlvbihwcmV2aWV3U2l6ZSwgbVRleHR1cmVWaWV3W2ldKTsKKyAgICAgICAgICAgIHN1cmZhY2VzW2ldID0gbmV3IFN1cmZhY2UocHJldmlld1RleHR1cmVbaV0pOworICAgICAgICAgICAgb3V0cHV0Q29uZmlnc1tpXSA9IG5ldyBPdXRwdXRDb25maWd1cmF0aW9uKHN1cmZhY2VzW2ldKTsKKyAgICAgICAgICAgIG91dHB1dENvbmZpZ3NbaV0uZW5hYmxlU3VyZmFjZVNoYXJpbmcoKTsKKyAgICAgICAgICAgIG91dHB1dENvbmZpZ3VyYXRpb25zLmFkZChvdXRwdXRDb25maWdzW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXJ0UHJldmlld1dpdGhDb25maWdzKGNhbWVyYUlkLCBvdXRwdXRDb25maWd1cmF0aW9ucywgbnVsbCk7CisKKyAgICAgICAgYm9vbGVhbiBwcmV2aWV3RG9uZSA9CisgICAgICAgICAgICAgICAgcHJldmlld0xpc3RlbmVyWzBdLndhaXRGb3JQcmV2aWV3RG9uZShXQUlUX0ZPUl9DT01NQU5EX1RPX0NPTVBMRVRFKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVW5hYmxlIHRvIHN0YXJ0IHByZXZpZXciLCBwcmV2aWV3RG9uZSk7CisKKyAgICAgICAgLy90cnkgdG8gZHluYW1pY2FsbHkgYWRkIGFuZCByZW1vdmUgYW55IG9mIHRoZSBpbml0aWFsIGNvbmZpZ3VyZWQgb3V0cHV0cworICAgICAgICB0cnkgeworICAgICAgICAgICAgb3V0cHV0Q29uZmlnc1sxXS5hZGRTdXJmYWNlKHN1cmZhY2VzWzBdKTsKKyAgICAgICAgICAgIHVwZGF0ZU91dHB1dENvbmZpZ3VyYXRpb24oY2FtZXJhSWQsIG91dHB1dENvbmZpZ3NbMV0pOworICAgICAgICAgICAgZmFpbCgic2hvdWxkIGdldCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZHVlIHRvIGludmFsaWQgb3V0cHV0Iik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZCBleGNlcHRpb24KKyAgICAgICAgICAgIG91dHB1dENvbmZpZ3NbMV0ucmVtb3ZlU3VyZmFjZShzdXJmYWNlc1swXSk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgb3V0cHV0Q29uZmlnc1sxXS5yZW1vdmVTdXJmYWNlKHN1cmZhY2VzWzFdKTsKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCBnZXQgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGR1ZSB0byBpbnZhbGlkIG91dHB1dCIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQgZXhjZXB0aW9uCisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgb3V0cHV0Q29uZmlnc1swXS5hZGRTdXJmYWNlKHN1cmZhY2VzWzFdKTsKKyAgICAgICAgICAgIHVwZGF0ZU91dHB1dENvbmZpZ3VyYXRpb24oY2FtZXJhSWQsIG91dHB1dENvbmZpZ3NbMF0pOworICAgICAgICAgICAgZmFpbCgic2hvdWxkIGdldCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZHVlIHRvIGludmFsaWQgb3V0cHV0Iik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZCBleGNlcHRpb24KKyAgICAgICAgICAgIG91dHB1dENvbmZpZ3NbMF0ucmVtb3ZlU3VyZmFjZShzdXJmYWNlc1sxXSk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgb3V0cHV0Q29uZmlnc1swXS5yZW1vdmVTdXJmYWNlKHN1cmZhY2VzWzBdKTsKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCBnZXQgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGR1ZSB0byBpbnZhbGlkIG91dHB1dCIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQgZXhjZXB0aW9uCisgICAgICAgIH0KKworICAgICAgICAvL0NoZWNrIHRoYXQgd2UgYXJlIGFibGUgdG8gYWRkIGEgc2hhcmVkIHRleHR1cmUgc3VyZmFjZSB3aXRoIGRpZmZlcmVudCBzaXplCisgICAgICAgIExpc3Q8U2l6ZT4gb3JkZXJlZFByZXZpZXdTaXplcyA9IGdldE9yZGVyZWRQcmV2aWV3U2l6ZXMoY2FtZXJhSWQpOworICAgICAgICBTaXplIHRleHR1cmVTaXplID0gcHJldmlld1NpemU7CisgICAgICAgIGZvciAoU2l6ZSBzIDogb3JkZXJlZFByZXZpZXdTaXplcykgeworICAgICAgICAgICAgaWYgKCFzLmVxdWFscyhwcmV2aWV3U2l6ZSkpIHsKKyAgICAgICAgICAgICAgICB0ZXh0dXJlU2l6ZSA9IHM7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRleHR1cmVTaXplLmVxdWFscyhwcmV2aWV3U2l6ZSkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBTdXJmYWNlVGV4dHVyZSBvdXRwdXRUZXh0dXJlID0gbmV3IFN1cmZhY2VUZXh0dXJlKC8qIHJhbmRvbSB0ZXh0dXJlIElEKi8gNSk7CisgICAgICAgIG91dHB1dFRleHR1cmUuc2V0RGVmYXVsdEJ1ZmZlclNpemUodGV4dHVyZVNpemUuZ2V0V2lkdGgoKSwgdGV4dHVyZVNpemUuZ2V0SGVpZ2h0KCkpOworICAgICAgICBTdXJmYWNlIG91dHB1dFN1cmZhY2UgPSBuZXcgU3VyZmFjZShvdXRwdXRUZXh0dXJlKTsKKyAgICAgICAgLy9BZGQgYSB2YWxpZCBvdXRwdXQgc3VyZmFjZSBhbmQgdGhlbiB2ZXJpZnkgdGhhdCBpdCBjYW5ub3QgYmUgYWRkZWQgYW55IG1vcmUKKyAgICAgICAgb3V0cHV0Q29uZmlnc1sxXS5hZGRTdXJmYWNlKG91dHB1dFN1cmZhY2UpOworICAgICAgICB1cGRhdGVPdXRwdXRDb25maWd1cmF0aW9uKGNhbWVyYUlkLCBvdXRwdXRDb25maWdzWzFdKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG91dHB1dENvbmZpZ3NbMV0uYWRkU3VyZmFjZShvdXRwdXRTdXJmYWNlKTsKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCBnZXQgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGR1ZSB0byBkdXBsaWNhdGUgb3V0cHV0Iik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZCBleGNlcHRpb24KKyAgICAgICAgfQorCisgICAgICAgIG91dHB1dENvbmZpZ3NbMF0uYWRkU3VyZmFjZShvdXRwdXRTdXJmYWNlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHVwZGF0ZU91dHB1dENvbmZpZ3VyYXRpb24oY2FtZXJhSWQsIG91dHB1dENvbmZpZ3NbMF0pOworICAgICAgICAgICAgZmFpbCgic2hvdWxkIGdldCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZHVlIHRvIGR1cGxpY2F0ZSBvdXRwdXQiKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkIGV4Y2VwdGlvbgorICAgICAgICAgICAgb3V0cHV0Q29uZmlnc1swXS5yZW1vdmVTdXJmYWNlKG91dHB1dFN1cmZhY2UpOworICAgICAgICB9CisKKyAgICAgICAgLy9WZXJpZnkgdGhhdCB0aGUgc2FtZSBzdXJmYWNlIGNhbm5vdCBiZSByZW1vdmVkIHR3aWNlCisgICAgICAgIG91dHB1dENvbmZpZ3NbMV0ucmVtb3ZlU3VyZmFjZShvdXRwdXRTdXJmYWNlKTsKKyAgICAgICAgdXBkYXRlT3V0cHV0Q29uZmlndXJhdGlvbihjYW1lcmFJZCwgb3V0cHV0Q29uZmlnc1sxXSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvdXRwdXRDb25maWdzWzBdLnJlbW92ZVN1cmZhY2Uob3V0cHV0U3VyZmFjZSk7CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgZ2V0IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBkdWUgdG8gaW52YWxpZCBvdXRwdXQiKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkIGV4Y2VwdGlvbgorICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvdXRwdXRDb25maWdzWzFdLnJlbW92ZVN1cmZhY2Uob3V0cHV0U3VyZmFjZSk7CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgZ2V0IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBkdWUgdG8gaW52YWxpZCBvdXRwdXQiKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkIGV4Y2VwdGlvbgorICAgICAgICB9CisKKyAgICAgICAgc3RvcFByZXZpZXcoY2FtZXJhSWQpOworICAgIH0KKworICAgIC8qCisgICAgICogVmVyaWZ5IGR5bmFtaWMgc2hhcmVkIHN1cmZhY2UgYmVoYXZpb3IgdXNpbmcgbXVsdGlwbGUgSW1hZ2VSZWFkZXJzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTaGFyZWRTdXJmYWNlSW1hZ2VSZWFkZXJTd2l0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChTdHJpbmcgY2FtZXJhSWQgOiBtQ2FtZXJhSWRzKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG9wZW5DYW1lcmEoY2FtZXJhSWQpOworICAgICAgICAgICAgICAgIGlmIChnZXRTdGF0aWNJbmZvKGNhbWVyYUlkKS5pc0hhcmR3YXJlTGV2ZWxMZWdhY3koKSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJDYW1lcmEgIiArIGNhbWVyYUlkICsgIiBpcyBsZWdhY3ksIHNraXBwaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIWdldFN0YXRpY0luZm8oY2FtZXJhSWQpLmlzQ29sb3JPdXRwdXRTdXBwb3J0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJDYW1lcmEgIiArIGNhbWVyYUlkICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGRvZXMgbm90IHN1cHBvcnQgY29sb3Igb3V0cHV0cywgc2tpcHBpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGVzdFNoYXJlZFN1cmZhY2VJbWFnZVJlYWRlclN3aXRjaChjYW1lcmFJZCwgTlVNX1NVUkZBQ0VfU1dJVENIRVMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgICAgICAgY2xvc2VDYW1lcmEoY2FtZXJhSWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RTaGFyZWRTdXJmYWNlSW1hZ2VSZWFkZXJTd2l0Y2goU3RyaW5nIGNhbWVyYUlkLCBpbnQgc3dpdGNoQ291bnQpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU2ltcGxlSW1hZ2VMaXN0ZW5lciBpbWFnZUxpc3RlbmVyc1tdID0gbmV3IFNpbXBsZUltYWdlTGlzdGVuZXJbSU1HX1JFQURFUl9DT1VOVF07CisgICAgICAgIFNpbXBsZUNhcHR1cmVDYWxsYmFjayByZXN1bHRMaXN0ZW5lciA9IG5ldyBTaW1wbGVDYXB0dXJlQ2FsbGJhY2soKTsKKyAgICAgICAgSW1hZ2VSZWFkZXIgaW1hZ2VSZWFkZXJzW10gPSBuZXcgSW1hZ2VSZWFkZXJbSU1HX1JFQURFUl9DT1VOVF07CisgICAgICAgIFN1cmZhY2UgcmVhZGVyU3VyZmFjZXNbXSA9IG5ldyBTdXJmYWNlW0lNR19SRUFERVJfQ09VTlRdOworICAgICAgICBTaXplIHByZXZpZXdTaXplID0gZ2V0T3JkZXJlZFByZXZpZXdTaXplcyhjYW1lcmFJZCkuZ2V0KDApOworICAgICAgICBDYW1lcmFQcmV2aWV3TGlzdGVuZXIgcHJldmlld0xpc3RlbmVyID0gbmV3IENhbWVyYVByZXZpZXdMaXN0ZW5lcigpOworICAgICAgICBtVGV4dHVyZVZpZXdbMF0uc2V0U3VyZmFjZVRleHR1cmVMaXN0ZW5lcihwcmV2aWV3TGlzdGVuZXIpOworICAgICAgICBTdXJmYWNlVGV4dHVyZSBwcmV2aWV3VGV4dHVyZSA9IGdldEF2YWlsYWJsZVN1cmZhY2VUZXh0dXJlKFdBSVRfRk9SX0NPTU1BTkRfVE9fQ09NUExFVEUsCisgICAgICAgICAgICAgICAgbVRleHR1cmVWaWV3WzBdKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiVW5hYmxlIHRvIGdldCBwcmV2aWV3IHN1cmZhY2UgdGV4dHVyZSIsIHByZXZpZXdUZXh0dXJlKTsKKyAgICAgICAgcHJldmlld1RleHR1cmUuc2V0RGVmYXVsdEJ1ZmZlclNpemUocHJldmlld1NpemUuZ2V0V2lkdGgoKSwgcHJldmlld1NpemUuZ2V0SGVpZ2h0KCkpOworICAgICAgICB1cGRhdGVQcmV2aWV3RGlzcGxheVJvdGF0aW9uKHByZXZpZXdTaXplLCBtVGV4dHVyZVZpZXdbMF0pOworICAgICAgICBTdXJmYWNlIHByZXZpZXdTdXJmYWNlID0gbmV3IFN1cmZhY2UocHJldmlld1RleHR1cmUpOworICAgICAgICBPdXRwdXRDb25maWd1cmF0aW9uIG91dHB1dENvbmZpZyA9IG5ldyBPdXRwdXRDb25maWd1cmF0aW9uKHByZXZpZXdTdXJmYWNlKTsKKyAgICAgICAgb3V0cHV0Q29uZmlnLmVuYWJsZVN1cmZhY2VTaGFyaW5nKCk7CisgICAgICAgIExpc3Q8T3V0cHV0Q29uZmlndXJhdGlvbj4gb3V0cHV0Q29uZmlndXJhdGlvbnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgb3V0cHV0Q29uZmlndXJhdGlvbnMuYWRkKG91dHB1dENvbmZpZyk7CisKKyAgICAgICAgaWYgKG91dHB1dENvbmZpZy5nZXRNYXhTaGFyZWRTdXJmYWNlQ291bnQoKSA8IChJTUdfUkVBREVSX0NPVU5UICsgMSkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vU3RhcnQgcmVndWxhciBwcmV2aWV3IHN0cmVhbWluZworICAgICAgICBzdGFydFByZXZpZXdXaXRoQ29uZmlncyhjYW1lcmFJZCwgb3V0cHV0Q29uZmlndXJhdGlvbnMsIG51bGwpOworCisgICAgICAgIGJvb2xlYW4gcHJldmlld0RvbmUgPSBwcmV2aWV3TGlzdGVuZXIud2FpdEZvclByZXZpZXdEb25lKFdBSVRfRk9SX0NPTU1BTkRfVE9fQ09NUExFVEUpOworICAgICAgICBhc3NlcnRUcnVlKCJVbmFibGUgdG8gc3RhcnQgcHJldmlldyIsIHByZXZpZXdEb25lKTsKKworICAgICAgICAvL1Rlc3Qgc2hhcmVkIGltYWdlIHJlYWRlciBvdXRwdXRzCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgSU1HX1JFQURFUl9DT1VOVDsgaSsrKSB7CisgICAgICAgICAgICBpbWFnZUxpc3RlbmVyc1tpXSA9IG5ldyBTaW1wbGVJbWFnZUxpc3RlbmVyKCk7CisgICAgICAgICAgICBpbWFnZVJlYWRlcnNbaV0gPSBJbWFnZVJlYWRlci5uZXdJbnN0YW5jZShwcmV2aWV3U2l6ZS5nZXRXaWR0aCgpLAorICAgICAgICAgICAgICAgICAgICBwcmV2aWV3U2l6ZS5nZXRIZWlnaHQoKSwgSW1hZ2VGb3JtYXQuUFJJVkFURSwgMik7CisgICAgICAgICAgICBpbWFnZVJlYWRlcnNbaV0uc2V0T25JbWFnZUF2YWlsYWJsZUxpc3RlbmVyKGltYWdlTGlzdGVuZXJzW2ldLCBtSGFuZGxlcik7CisgICAgICAgICAgICByZWFkZXJTdXJmYWNlc1tpXSA9IGltYWdlUmVhZGVyc1tpXS5nZXRTdXJmYWNlKCk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHN3aXRjaENvdW50OyBqKyspIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgSU1HX1JFQURFUl9DT1VOVDsgaSsrKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0Q29uZmlnLmFkZFN1cmZhY2UocmVhZGVyU3VyZmFjZXNbaV0pOworICAgICAgICAgICAgICAgIHVwZGF0ZU91dHB1dENvbmZpZ3VyYXRpb24oY2FtZXJhSWQsIG91dHB1dENvbmZpZyk7CisgICAgICAgICAgICAgICAgQ2FwdHVyZVJlcXVlc3QuQnVpbGRlciBpbWFnZVJlYWRlclJlcXVlc3RCdWlsZGVyID0gZ2V0Q2FwdHVyZUJ1aWxkZXIoY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgICAgICBDYW1lcmFEZXZpY2UuVEVNUExBVEVfUFJFVklFVyk7CisgICAgICAgICAgICAgICAgaW1hZ2VSZWFkZXJSZXF1ZXN0QnVpbGRlci5hZGRUYXJnZXQocmVhZGVyU3VyZmFjZXNbaV0pOworICAgICAgICAgICAgICAgIGNhcHR1cmUoY2FtZXJhSWQsIGltYWdlUmVhZGVyUmVxdWVzdEJ1aWxkZXIuYnVpbGQoKSwgcmVzdWx0TGlzdGVuZXIpOworICAgICAgICAgICAgICAgIGltYWdlTGlzdGVuZXJzW2ldLndhaXRGb3JBbnlJbWFnZUF2YWlsYWJsZShQUkVWSUVXX1RJTUVfTVMpOworICAgICAgICAgICAgICAgIEltYWdlIGltZyA9IGltYWdlUmVhZGVyc1tpXS5hY3F1aXJlTGF0ZXN0SW1hZ2UoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJJbnZhbGlkIGltYWdlIGFjcXVpcmVkISIsIGltZyk7CisgICAgICAgICAgICAgICAgaW1nLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgb3V0cHV0Q29uZmlnLnJlbW92ZVN1cmZhY2UocmVhZGVyU3VyZmFjZXNbaV0pOworICAgICAgICAgICAgICAgIHVwZGF0ZU91dHB1dENvbmZpZ3VyYXRpb24oY2FtZXJhSWQsIG91dHB1dENvbmZpZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IElNR19SRUFERVJfQ09VTlQ7IGkrKykgeworICAgICAgICAgICAgaW1hZ2VSZWFkZXJzW2ldLmNsb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICBzdG9wUHJldmlldyhjYW1lcmFJZCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBWZXJpZnkgZHluYW1pYyBzaGFyZWQgc3VyZmFjZSBiZWhhdmlvciB1c2luZyBZVVYgSW1hZ2VSZWFkZXJzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTaGFyZWRTdXJmYWNlWVVWSW1hZ2VSZWFkZXJTd2l0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IFlVVkZvcm1hdHNbXSA9IHtJbWFnZUZvcm1hdC5ZVVZfNDIwXzg4OCwgSW1hZ2VGb3JtYXQuWVVWXzQyMl84ODgsCisgICAgICAgICAgICBJbWFnZUZvcm1hdC5ZVVZfNDQ0Xzg4OCwgSW1hZ2VGb3JtYXQuWVVZMiwgSW1hZ2VGb3JtYXQuWVYxMiwKKyAgICAgICAgICAgIEltYWdlRm9ybWF0Lk5WMTYsIEltYWdlRm9ybWF0Lk5WMjF9OworICAgICAgICBmb3IgKFN0cmluZyBjYW1lcmFJZCA6IG1DYW1lcmFJZHMpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb3BlbkNhbWVyYShjYW1lcmFJZCk7CisgICAgICAgICAgICAgICAgaWYgKGdldFN0YXRpY0luZm8oY2FtZXJhSWQpLmlzSGFyZHdhcmVMZXZlbExlZ2FjeSgpKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkNhbWVyYSAiICsgY2FtZXJhSWQgKyAiIGlzIGxlZ2FjeSwgc2tpcHBpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghZ2V0U3RhdGljSW5mbyhjYW1lcmFJZCkuaXNDb2xvck91dHB1dFN1cHBvcnRlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkNhbWVyYSAiICsgY2FtZXJhSWQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZG9lcyBub3Qgc3VwcG9ydCBjb2xvciBvdXRwdXRzLCBza2lwcGluZyIpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU2l6ZSBmcmFtZVNpemUgPSBudWxsOworICAgICAgICAgICAgICAgIGludCB5dXZGb3JtYXQgPSAtMTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpdCA6IFlVVkZvcm1hdHMpIHsKKyAgICAgICAgICAgICAgICAgICAgU2l6ZSB5dXZTaXplc1tdID0gZ2V0U3RhdGljSW5mbyhjYW1lcmFJZCkuZ2V0QXZhaWxhYmxlU2l6ZXNGb3JGb3JtYXRDaGVja2VkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0LCBTdGF0aWNNZXRhZGF0YS5TdHJlYW1EaXJlY3Rpb24uT3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHl1dlNpemVzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lU2l6ZSA9IHl1dlNpemVzWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgeXV2Rm9ybWF0ID0gaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgoeXV2Rm9ybWF0ICE9IC0xKSAmJiAoZnJhbWVTaXplLmdldFdpZHRoKCkgPiAwKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKGZyYW1lU2l6ZS5nZXRIZWlnaHQoKSA+IDApKSB7CisgICAgICAgICAgICAgICAgICAgIHRlc3RTaGFyZWRTdXJmYWNlWVVWSW1hZ2VSZWFkZXJTd2l0Y2goY2FtZXJhSWQsIE5VTV9TVVJGQUNFX1NXSVRDSEVTLCB5dXZGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVTaXplKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJDYW1lcmEgIiArIGNhbWVyYUlkICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGRvZXMgbm90IHN1cHBvcnQgWVVWIG91dHB1dHMsIHNraXBwaW5nIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgICAgICAgY2xvc2VDYW1lcmEoY2FtZXJhSWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RTaGFyZWRTdXJmYWNlWVVWSW1hZ2VSZWFkZXJTd2l0Y2goU3RyaW5nIGNhbWVyYUlkLCBpbnQgc3dpdGNoQ291bnQsIGludCBmb3JtYXQsCisgICAgICAgICAgICBTaXplIGZyYW1lU2l6ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiWVVWX0lNR19SRUFERVJfQ09VTlQgc2hvdWxkIGJlIGVxdWFsIG9yIGdyZWF0ZXIgdGhhbiAyIiwKKyAgICAgICAgICAgICAgICAoWVVWX0lNR19SRUFERVJfQ09VTlQgPj0gMikpOworCisgICAgICAgIFNpbXBsZUltYWdlTGlzdGVuZXIgaW1hZ2VMaXN0ZW5lcnNbXSA9IG5ldyBTaW1wbGVJbWFnZUxpc3RlbmVyW1lVVl9JTUdfUkVBREVSX0NPVU5UXTsKKyAgICAgICAgU2ltcGxlQ2FwdHVyZUNhbGxiYWNrIHJlc3VsdExpc3RlbmVyID0gbmV3IFNpbXBsZUNhcHR1cmVDYWxsYmFjaygpOworICAgICAgICBJbWFnZVJlYWRlciBpbWFnZVJlYWRlcnNbXSA9IG5ldyBJbWFnZVJlYWRlcltZVVZfSU1HX1JFQURFUl9DT1VOVF07CisgICAgICAgIFN1cmZhY2UgcmVhZGVyU3VyZmFjZXNbXSA9IG5ldyBTdXJmYWNlW1lVVl9JTUdfUkVBREVSX0NPVU5UXTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFlVVl9JTUdfUkVBREVSX0NPVU5UOyBpKyspIHsKKyAgICAgICAgICAgIGltYWdlTGlzdGVuZXJzW2ldID0gbmV3IFNpbXBsZUltYWdlTGlzdGVuZXIoKTsKKyAgICAgICAgICAgIGltYWdlUmVhZGVyc1tpXSA9IEltYWdlUmVhZGVyLm5ld0luc3RhbmNlKGZyYW1lU2l6ZS5nZXRXaWR0aCgpLCBmcmFtZVNpemUuZ2V0SGVpZ2h0KCksCisgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgMik7CisgICAgICAgICAgICBpbWFnZVJlYWRlcnNbaV0uc2V0T25JbWFnZUF2YWlsYWJsZUxpc3RlbmVyKGltYWdlTGlzdGVuZXJzW2ldLCBtSGFuZGxlcik7CisgICAgICAgICAgICByZWFkZXJTdXJmYWNlc1tpXSA9IGltYWdlUmVhZGVyc1tpXS5nZXRTdXJmYWNlKCk7CisgICAgICAgIH0KKworICAgICAgICBPdXRwdXRDb25maWd1cmF0aW9uIG91dHB1dENvbmZpZyA9IG5ldyBPdXRwdXRDb25maWd1cmF0aW9uKHJlYWRlclN1cmZhY2VzWzBdKTsKKyAgICAgICAgb3V0cHV0Q29uZmlnLmVuYWJsZVN1cmZhY2VTaGFyaW5nKCk7CisgICAgICAgIExpc3Q8T3V0cHV0Q29uZmlndXJhdGlvbj4gb3V0cHV0Q29uZmlndXJhdGlvbnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgb3V0cHV0Q29uZmlndXJhdGlvbnMuYWRkKG91dHB1dENvbmZpZyk7CisgICAgICAgIGlmIChvdXRwdXRDb25maWcuZ2V0TWF4U2hhcmVkU3VyZmFjZUNvdW50KCkgPCBZVVZfSU1HX1JFQURFUl9DT1VOVCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgY3JlYXRlU2Vzc2lvbldpdGhDb25maWdzKGNhbWVyYUlkLCBvdXRwdXRDb25maWd1cmF0aW9ucyk7CisKKyAgICAgICAgLy8gVGVzdCBZVVYgSW1hZ2VSZWFkZXIgc3VyZmFjZSBzaGFyaW5nLiBUaGUgZmlyc3QgSW1hZ2VSZWFkZXIgd2lsbAorICAgICAgICAvLyBhbHdheXMgYmUgcGFydCBvZiB0aGUgY2FwdHVyZSByZXF1ZXN0LCB0aGUgcmVzdCB3aWxsIHN3aXRjaCBvbiBlYWNoCisgICAgICAgIC8vIGl0ZXJhdGlvbi4KKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzd2l0Y2hDb3VudDsgaisrKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IFlVVl9JTUdfUkVBREVSX0NPVU5UOyBpKyspIHsKKyAgICAgICAgICAgICAgICBvdXRwdXRDb25maWcuYWRkU3VyZmFjZShyZWFkZXJTdXJmYWNlc1tpXSk7CisgICAgICAgICAgICAgICAgdXBkYXRlT3V0cHV0Q29uZmlndXJhdGlvbihjYW1lcmFJZCwgb3V0cHV0Q29uZmlnKTsKKyAgICAgICAgICAgICAgICBDYXB0dXJlUmVxdWVzdC5CdWlsZGVyIGltYWdlUmVhZGVyUmVxdWVzdEJ1aWxkZXIgPSBnZXRDYXB0dXJlQnVpbGRlcihjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENhbWVyYURldmljZS5URU1QTEFURV9QUkVWSUVXKTsKKyAgICAgICAgICAgICAgICBpbWFnZVJlYWRlclJlcXVlc3RCdWlsZGVyLmFkZFRhcmdldChyZWFkZXJTdXJmYWNlc1tpXSk7CisgICAgICAgICAgICAgICAgaW1hZ2VSZWFkZXJSZXF1ZXN0QnVpbGRlci5hZGRUYXJnZXQocmVhZGVyU3VyZmFjZXNbMF0pOworICAgICAgICAgICAgICAgIGNhcHR1cmUoY2FtZXJhSWQsIGltYWdlUmVhZGVyUmVxdWVzdEJ1aWxkZXIuYnVpbGQoKSwgcmVzdWx0TGlzdGVuZXIpOworICAgICAgICAgICAgICAgIGltYWdlTGlzdGVuZXJzW2ldLndhaXRGb3JBbnlJbWFnZUF2YWlsYWJsZShQUkVWSUVXX1RJTUVfTVMpOworICAgICAgICAgICAgICAgIEltYWdlIGltZyA9IGltYWdlUmVhZGVyc1tpXS5hY3F1aXJlTGF0ZXN0SW1hZ2UoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJJbnZhbGlkIGltYWdlIGFjcXVpcmVkISIsIGltZyk7CisgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiSW1hZ2UgcGxhbmVzIGFyZSBpbnZhbGlkISIsIGltZy5nZXRQbGFuZXMoKSk7CisgICAgICAgICAgICAgICAgaW1nLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgaW1hZ2VMaXN0ZW5lcnNbMF0ud2FpdEZvckFueUltYWdlQXZhaWxhYmxlKFBSRVZJRVdfVElNRV9NUyk7CisgICAgICAgICAgICAgICAgaW1nID0gaW1hZ2VSZWFkZXJzWzBdLmFjcXVpcmVMYXRlc3RJbWFnZSgpOworICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIkludmFsaWQgaW1hZ2UgYWNxdWlyZWQhIiwgaW1nKTsKKyAgICAgICAgICAgICAgICBpbWcuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICBvdXRwdXRDb25maWcucmVtb3ZlU3VyZmFjZShyZWFkZXJTdXJmYWNlc1tpXSk7CisgICAgICAgICAgICAgICAgdXBkYXRlT3V0cHV0Q29uZmlndXJhdGlvbihjYW1lcmFJZCwgb3V0cHV0Q29uZmlnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgWVVWX0lNR19SRUFERVJfQ09VTlQ7IGkrKykgeworICAgICAgICAgICAgaW1hZ2VSZWFkZXJzW2ldLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFRlc3QgdGhlIGR5bmFtaWMgc2hhcmVkIHN1cmZhY2UgbGltaXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFNoYXJlZFN1cmZhY2VMaW1pdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmb3IgKFN0cmluZyBjYW1lcmFJZCA6IG1DYW1lcmFJZHMpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb3BlbkNhbWVyYShjYW1lcmFJZCk7CisgICAgICAgICAgICAgICAgaWYgKGdldFN0YXRpY0luZm8oY2FtZXJhSWQpLmlzSGFyZHdhcmVMZXZlbExlZ2FjeSgpKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkNhbWVyYSAiICsgY2FtZXJhSWQgKyAiIGlzIGxlZ2FjeSwgc2tpcHBpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghZ2V0U3RhdGljSW5mbyhjYW1lcmFJZCkuaXNDb2xvck91dHB1dFN1cHBvcnRlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkNhbWVyYSAiICsgY2FtZXJhSWQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZG9lcyBub3Qgc3VwcG9ydCBjb2xvciBvdXRwdXRzLCBza2lwcGluZyIpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0ZXN0U2hhcmVkU3VyZmFjZUxpbWl0QnlDYW1lcmEoY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgICAgICBDYW1lcmEyTXVsdGlWaWV3Q3RzQWN0aXZpdHkuTUFYX1RFWFRVUkVfVklFV1MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgICAgICAgY2xvc2VDYW1lcmEoY2FtZXJhSWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RTaGFyZWRTdXJmYWNlTGltaXRCeUNhbWVyYShTdHJpbmcgY2FtZXJhSWQsIGludCBzdXJmYWNlTGltaXQpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU2l6ZSBwcmV2aWV3U2l6ZSA9IGdldE9yZGVyZWRQcmV2aWV3U2l6ZXMoY2FtZXJhSWQpLmdldCgwKTsKKyAgICAgICAgQ2FtZXJhUHJldmlld0xpc3RlbmVyW10gcHJldmlld0xpc3RlbmVyID0gbmV3IENhbWVyYVByZXZpZXdMaXN0ZW5lcltzdXJmYWNlTGltaXRdOworICAgICAgICBTdXJmYWNlVGV4dHVyZVtdIHByZXZpZXdUZXh0dXJlID0gbmV3IFN1cmZhY2VUZXh0dXJlW3N1cmZhY2VMaW1pdF07CisgICAgICAgIFN1cmZhY2VbXSBzdXJmYWNlcyA9IG5ldyBTdXJmYWNlW3N1cmZhY2VMaW1pdF07CisgICAgICAgIGludCBzZXF1ZW5jZUlkID0gLTE7CisKKyAgICAgICAgLy8gQ3JlYXRlIHN1cmZhY2UgdGV4dHVyZXMgd2l0aCB0aGUgc2FtZSBzaXplCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3VyZmFjZUxpbWl0OyBpKyspIHsKKyAgICAgICAgICAgIHByZXZpZXdMaXN0ZW5lcltpXSA9IG5ldyBDYW1lcmFQcmV2aWV3TGlzdGVuZXIoKTsKKyAgICAgICAgICAgIG1UZXh0dXJlVmlld1tpXS5zZXRTdXJmYWNlVGV4dHVyZUxpc3RlbmVyKHByZXZpZXdMaXN0ZW5lcltpXSk7CisgICAgICAgICAgICBwcmV2aWV3VGV4dHVyZVtpXSA9IGdldEF2YWlsYWJsZVN1cmZhY2VUZXh0dXJlKAorICAgICAgICAgICAgICAgICAgICBXQUlUX0ZPUl9DT01NQU5EX1RPX0NPTVBMRVRFLCBtVGV4dHVyZVZpZXdbaV0pOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiVW5hYmxlIHRvIGdldCBwcmV2aWV3IHN1cmZhY2UgdGV4dHVyZSIsIHByZXZpZXdUZXh0dXJlW2ldKTsKKyAgICAgICAgICAgIHByZXZpZXdUZXh0dXJlW2ldLnNldERlZmF1bHRCdWZmZXJTaXplKHByZXZpZXdTaXplLmdldFdpZHRoKCksIHByZXZpZXdTaXplLmdldEhlaWdodCgpKTsKKyAgICAgICAgICAgIC8vIENvcnJlY3QgdGhlIHByZXZpZXcgZGlzcGxheSByb3RhdGlvbi4KKyAgICAgICAgICAgIHVwZGF0ZVByZXZpZXdEaXNwbGF5Um90YXRpb24ocHJldmlld1NpemUsIG1UZXh0dXJlVmlld1tpXSk7CisgICAgICAgICAgICBzdXJmYWNlc1tpXSA9IG5ldyBTdXJmYWNlKHByZXZpZXdUZXh0dXJlW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIFNpbXBsZUNhcHR1cmVDYWxsYmFjayByZXN1bHRMaXN0ZW5lciA9IG5ldyBTaW1wbGVDYXB0dXJlQ2FsbGJhY2soKTsKKworICAgICAgICAvLyBDcmVhdGUgc2hhcmVkIG91dHB1dHMgZm9yIHRoZSB0d28gc3VyZmFjZSB0ZXh0dXJlcworICAgICAgICBPdXRwdXRDb25maWd1cmF0aW9uIHN1cmZhY2VTaGFyZWRPdXRwdXQgPSBuZXcgT3V0cHV0Q29uZmlndXJhdGlvbihzdXJmYWNlc1swXSk7CisgICAgICAgIHN1cmZhY2VTaGFyZWRPdXRwdXQuZW5hYmxlU3VyZmFjZVNoYXJpbmcoKTsKKworICAgICAgICBpZiAoKHN1cmZhY2VMaW1pdCA8PSAxKSB8fAorICAgICAgICAgICAgICAgIChzdXJmYWNlTGltaXQgPCBzdXJmYWNlU2hhcmVkT3V0cHV0LmdldE1heFNoYXJlZFN1cmZhY2VDb3VudCgpKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgTGlzdDxPdXRwdXRDb25maWd1cmF0aW9uPiBvdXRwdXRDb25maWd1cmF0aW9ucyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBvdXRwdXRDb25maWd1cmF0aW9ucy5hZGQoc3VyZmFjZVNoYXJlZE91dHB1dCk7CisKKyAgICAgICAgc3RhcnRQcmV2aWV3V2l0aENvbmZpZ3MoY2FtZXJhSWQsIG91dHB1dENvbmZpZ3VyYXRpb25zLCBudWxsKTsKKworICAgICAgICBib29sZWFuIHByZXZpZXdEb25lID0KKyAgICAgICAgICAgICAgICBwcmV2aWV3TGlzdGVuZXJbMF0ud2FpdEZvclByZXZpZXdEb25lKFdBSVRfRk9SX0NPTU1BTkRfVE9fQ09NUExFVEUpOworICAgICAgICBhc3NlcnRUcnVlKCJVbmFibGUgdG8gc3RhcnQgcHJldmlldyIsIHByZXZpZXdEb25lKTsKKyAgICAgICAgbVRleHR1cmVWaWV3WzBdLnNldFN1cmZhY2VUZXh0dXJlTGlzdGVuZXIobnVsbCk7CisKKyAgICAgICAgU3lzdGVtQ2xvY2suc2xlZXAoUFJFVklFV19USU1FX01TKTsKKworICAgICAgICBpbnQgaSA9IDE7CisgICAgICAgIGZvciAoOyBpIDwgc3VyZmFjZUxpbWl0OyBpKyspIHsKKyAgICAgICAgICAgIC8vQWRkIG9uZSBtb3JlIG91dHB1dCBzdXJmYWNlIHdoaWxlIHByZXZpZXcgaXMgc3RyZWFtaW5nCisgICAgICAgICAgICBpZiAoaSA+PSBzdXJmYWNlU2hhcmVkT3V0cHV0LmdldE1heFNoYXJlZFN1cmZhY2VDb3VudCgpKXsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzdXJmYWNlU2hhcmVkT3V0cHV0LmFkZFN1cmZhY2Uoc3VyZmFjZXNbaV0pOworICAgICAgICAgICAgICAgICAgICBmYWlsKCJzaG91bGQgZ2V0IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBkdWUgdG8gb3V0cHV0IHN1cmZhY2UgbGltaXQiKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvL2V4cGVjdGVkCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3VyZmFjZVNoYXJlZE91dHB1dC5hZGRTdXJmYWNlKHN1cmZhY2VzW2ldKTsKKyAgICAgICAgICAgICAgICB1cGRhdGVPdXRwdXRDb25maWd1cmF0aW9uKGNhbWVyYUlkLCBzdXJmYWNlU2hhcmVkT3V0cHV0KTsKKyAgICAgICAgICAgICAgICBzZXF1ZW5jZUlkID0gdXBkYXRlUmVwZWF0aW5nUmVxdWVzdChjYW1lcmFJZCwgb3V0cHV0Q29uZmlndXJhdGlvbnMsIHJlc3VsdExpc3RlbmVyKTsKKworICAgICAgICAgICAgICAgIFN5c3RlbUNsb2NrLnNsZWVwKFBSRVZJRVdfVElNRV9NUyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKDsgaSA+IDA7IGktLSkgeworICAgICAgICAgICAgaWYgKGkgPj0gc3VyZmFjZVNoYXJlZE91dHB1dC5nZXRNYXhTaGFyZWRTdXJmYWNlQ291bnQoKSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHN1cmZhY2VTaGFyZWRPdXRwdXQucmVtb3ZlU3VyZmFjZShzdXJmYWNlc1tpXSk7CisgICAgICAgICAgICAgICAgICAgIGZhaWwoInNob3VsZCBnZXQgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGR1ZSB0byBvdXRwdXQgc3VyZmFjZSBsaW1pdCIpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkIGV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3VyZmFjZVNoYXJlZE91dHB1dC5yZW1vdmVTdXJmYWNlKHN1cmZhY2VzW2ldKTsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vUmVtb3ZlIGFsbCBwcmV2aW91c2x5IGFkZGVkIHNoYXJlZCBvdXRwdXRzIGluIG9uZSBjYWxsCisgICAgICAgIHVwZGF0ZVJlcGVhdGluZ1JlcXVlc3QoY2FtZXJhSWQsIG91dHB1dENvbmZpZ3VyYXRpb25zLCByZXN1bHRMaXN0ZW5lcik7CisgICAgICAgIGxvbmcgbGFzdFNlcXVlbmNlRnJhbWVOdW1iZXIgPSByZXN1bHRMaXN0ZW5lci5nZXRDYXB0dXJlU2VxdWVuY2VMYXN0RnJhbWVOdW1iZXIoCisgICAgICAgICAgICAgICAgc2VxdWVuY2VJZCwgUFJFVklFV19USU1FX01TKTsKKyAgICAgICAgY2hlY2tGb3JMYXN0RnJhbWVJblNlcXVlbmNlKGxhc3RTZXF1ZW5jZUZyYW1lTnVtYmVyLCByZXN1bHRMaXN0ZW5lcik7CisgICAgICAgIHVwZGF0ZU91dHB1dENvbmZpZ3VyYXRpb24oY2FtZXJhSWQsIHN1cmZhY2VTaGFyZWRPdXRwdXQpOworICAgICAgICBTeXN0ZW1DbG9jay5zbGVlcChQUkVWSUVXX1RJTUVfTVMpOworCisgICAgICAgIHN0b3BQcmV2aWV3KGNhbWVyYUlkKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFRlc3QgZHluYW1pYyBzaGFyZWQgc3VyZmFjZSBzd2l0Y2ggYmVoYXZpb3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFNoYXJlZFN1cmZhY2VTd2l0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChTdHJpbmcgY2FtZXJhSWQgOiBtQ2FtZXJhSWRzKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG9wZW5DYW1lcmEoY2FtZXJhSWQpOworICAgICAgICAgICAgICAgIGlmIChnZXRTdGF0aWNJbmZvKGNhbWVyYUlkKS5pc0hhcmR3YXJlTGV2ZWxMZWdhY3koKSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJDYW1lcmEgIiArIGNhbWVyYUlkICsgIiBpcyBsZWdhY3ksIHNraXBwaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIWdldFN0YXRpY0luZm8oY2FtZXJhSWQpLmlzQ29sb3JPdXRwdXRTdXBwb3J0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJDYW1lcmEgIiArIGNhbWVyYUlkICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGRvZXMgbm90IHN1cHBvcnQgY29sb3Igb3V0cHV0cywgc2tpcHBpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGVzdFNoYXJlZFN1cmZhY2VTd2l0Y2hCeUNhbWVyYShjYW1lcmFJZCwgTlVNX1NVUkZBQ0VfU1dJVENIRVMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgICAgICAgY2xvc2VDYW1lcmEoY2FtZXJhSWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RTaGFyZWRTdXJmYWNlU3dpdGNoQnlDYW1lcmEoU3RyaW5nIGNhbWVyYUlkLCBpbnQgc3dpdGNoQ291bnQpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU2l6ZSBwcmV2aWV3U2l6ZSA9IGdldE9yZGVyZWRQcmV2aWV3U2l6ZXMoY2FtZXJhSWQpLmdldCgwKTsKKyAgICAgICAgQ2FtZXJhUHJldmlld0xpc3RlbmVyW10gcHJldmlld0xpc3RlbmVyID0gbmV3IENhbWVyYVByZXZpZXdMaXN0ZW5lclsyXTsKKyAgICAgICAgU3VyZmFjZVRleHR1cmVbXSBwcmV2aWV3VGV4dHVyZSA9IG5ldyBTdXJmYWNlVGV4dHVyZVsyXTsKKyAgICAgICAgU3VyZmFjZVtdIHN1cmZhY2VzID0gbmV3IFN1cmZhY2VbMl07CisKKyAgICAgICAgLy8gQ3JlYXRlIHN1cmZhY2UgdGV4dHVyZXMgd2l0aCB0aGUgc2FtZSBzaXplCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgICAgICBwcmV2aWV3TGlzdGVuZXJbaV0gPSBuZXcgQ2FtZXJhUHJldmlld0xpc3RlbmVyKCk7CisgICAgICAgICAgICBtVGV4dHVyZVZpZXdbaV0uc2V0U3VyZmFjZVRleHR1cmVMaXN0ZW5lcihwcmV2aWV3TGlzdGVuZXJbaV0pOworICAgICAgICAgICAgcHJldmlld1RleHR1cmVbaV0gPSBnZXRBdmFpbGFibGVTdXJmYWNlVGV4dHVyZSgKKyAgICAgICAgICAgICAgICAgICAgV0FJVF9GT1JfQ09NTUFORF9UT19DT01QTEVURSwgbVRleHR1cmVWaWV3W2ldKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIlVuYWJsZSB0byBnZXQgcHJldmlldyBzdXJmYWNlIHRleHR1cmUiLCBwcmV2aWV3VGV4dHVyZVtpXSk7CisgICAgICAgICAgICBwcmV2aWV3VGV4dHVyZVtpXS5zZXREZWZhdWx0QnVmZmVyU2l6ZShwcmV2aWV3U2l6ZS5nZXRXaWR0aCgpLCBwcmV2aWV3U2l6ZS5nZXRIZWlnaHQoKSk7CisgICAgICAgICAgICAvLyBDb3JyZWN0IHRoZSBwcmV2aWV3IGRpc3BsYXkgcm90YXRpb24uCisgICAgICAgICAgICB1cGRhdGVQcmV2aWV3RGlzcGxheVJvdGF0aW9uKHByZXZpZXdTaXplLCBtVGV4dHVyZVZpZXdbaV0pOworICAgICAgICAgICAgc3VyZmFjZXNbaV0gPSBuZXcgU3VyZmFjZShwcmV2aWV3VGV4dHVyZVtpXSk7CisgICAgICAgIH0KKworICAgICAgICBTaW1wbGVDYXB0dXJlQ2FsbGJhY2sgcmVzdWx0TGlzdGVuZXIgPSBuZXcgU2ltcGxlQ2FwdHVyZUNhbGxiYWNrKCk7CisKKyAgICAgICAgLy8gQ3JlYXRlIHNoYXJlZCBvdXRwdXRzIGZvciB0aGUgdHdvIHN1cmZhY2UgdGV4dHVyZXMKKyAgICAgICAgT3V0cHV0Q29uZmlndXJhdGlvbiBzdXJmYWNlU2hhcmVkT3V0cHV0ID0gbmV3IE91dHB1dENvbmZpZ3VyYXRpb24oc3VyZmFjZXNbMF0pOworICAgICAgICBzdXJmYWNlU2hhcmVkT3V0cHV0LmVuYWJsZVN1cmZhY2VTaGFyaW5nKCk7CisKKyAgICAgICAgTGlzdDxPdXRwdXRDb25maWd1cmF0aW9uPiBvdXRwdXRDb25maWd1cmF0aW9ucyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBvdXRwdXRDb25maWd1cmF0aW9ucy5hZGQoc3VyZmFjZVNoYXJlZE91dHB1dCk7CisKKyAgICAgICAgc3RhcnRQcmV2aWV3V2l0aENvbmZpZ3MoY2FtZXJhSWQsIG91dHB1dENvbmZpZ3VyYXRpb25zLCBudWxsKTsKKworICAgICAgICBib29sZWFuIHByZXZpZXdEb25lID0KKyAgICAgICAgICAgICAgICBwcmV2aWV3TGlzdGVuZXJbMF0ud2FpdEZvclByZXZpZXdEb25lKFdBSVRfRk9SX0NPTU1BTkRfVE9fQ09NUExFVEUpOworICAgICAgICBhc3NlcnRUcnVlKCJVbmFibGUgdG8gc3RhcnQgcHJldmlldyIsIHByZXZpZXdEb25lKTsKKyAgICAgICAgbVRleHR1cmVWaWV3WzBdLnNldFN1cmZhY2VUZXh0dXJlTGlzdGVuZXIobnVsbCk7CisKKyAgICAgICAgU3lzdGVtQ2xvY2suc2xlZXAoUFJFVklFV19USU1FX01TKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN3aXRjaENvdW50OyBpKyspIHsKKyAgICAgICAgICAgIC8vQWRkIG9uZSBtb3JlIG91dHB1dCBzdXJmYWNlIHdoaWxlIHByZXZpZXcgaXMgc3RyZWFtaW5nCisgICAgICAgICAgICBzdXJmYWNlU2hhcmVkT3V0cHV0LmFkZFN1cmZhY2Uoc3VyZmFjZXNbMV0pOworICAgICAgICAgICAgdXBkYXRlT3V0cHV0Q29uZmlndXJhdGlvbihjYW1lcmFJZCwgc3VyZmFjZVNoYXJlZE91dHB1dCk7CisgICAgICAgICAgICBpbnQgc2VxdWVuY2VJZCA9IHVwZGF0ZVJlcGVhdGluZ1JlcXVlc3QoY2FtZXJhSWQsIG91dHB1dENvbmZpZ3VyYXRpb25zLCByZXN1bHRMaXN0ZW5lcik7CisKKyAgICAgICAgICAgIFN5c3RlbUNsb2NrLnNsZWVwKFBSRVZJRVdfVElNRV9NUyk7CisKKyAgICAgICAgICAgIC8vVHJ5IHRvIHJlbW92ZSB0aGUgc2hhcmVkIHN1cmZhY2Ugd2hpbGUgd2hpbGUgd2Ugc3RpbGwgaGF2ZSBhY3RpdmUgcmVxdWVzdHMgdGhhdAorICAgICAgICAgICAgLy91c2UgaXQgYXMgb3V0cHV0LgorICAgICAgICAgICAgc3VyZmFjZVNoYXJlZE91dHB1dC5yZW1vdmVTdXJmYWNlKHN1cmZhY2VzWzFdKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdXBkYXRlT3V0cHV0Q29uZmlndXJhdGlvbihjYW1lcmFJZCwgc3VyZmFjZVNoYXJlZE91dHB1dCk7CisgICAgICAgICAgICAgICAgZmFpbCgic2hvdWxkIGdldCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZHVlIHRvIHBlbmRpbmcgcmVxdWVzdHMiKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQgZXhjZXB0aW9uCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vV2FpdCBmb3IgYWxsIHBlbmRpbmcgcmVxdWVzdHMgdG8gYXJyaXZlIGFuZCByZW1vdmUgdGhlIHNoYXJlZCBvdXRwdXQgZHVyaW5nIGFjdGl2ZQorICAgICAgICAgICAgLy9zdHJlYW1pbmcKKyAgICAgICAgICAgIHVwZGF0ZVJlcGVhdGluZ1JlcXVlc3QoY2FtZXJhSWQsIG91dHB1dENvbmZpZ3VyYXRpb25zLCByZXN1bHRMaXN0ZW5lcik7CisgICAgICAgICAgICBsb25nIGxhc3RTZXF1ZW5jZUZyYW1lTnVtYmVyID0gcmVzdWx0TGlzdGVuZXIuZ2V0Q2FwdHVyZVNlcXVlbmNlTGFzdEZyYW1lTnVtYmVyKAorICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlkLCBQUkVWSUVXX1RJTUVfTVMpOworICAgICAgICAgICAgY2hlY2tGb3JMYXN0RnJhbWVJblNlcXVlbmNlKGxhc3RTZXF1ZW5jZUZyYW1lTnVtYmVyLCByZXN1bHRMaXN0ZW5lcik7CisgICAgICAgICAgICB1cGRhdGVPdXRwdXRDb25maWd1cmF0aW9uKGNhbWVyYUlkLCBzdXJmYWNlU2hhcmVkT3V0cHV0KTsKKworICAgICAgICAgICAgU3lzdGVtQ2xvY2suc2xlZXAoUFJFVklFV19USU1FX01TKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0b3BQcmV2aWV3KGNhbWVyYUlkKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tGb3JMYXN0RnJhbWVJblNlcXVlbmNlKGxvbmcgbGFzdFNlcXVlbmNlRnJhbWVOdW1iZXIsCisgICAgICAgICAgICBTaW1wbGVDYXB0dXJlQ2FsbGJhY2sgbGlzdGVuZXIpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBGaW5kIHRoZSBsYXN0IGZyYW1lIG51bWJlciByZWNlaXZlZCBpbiByZXN1bHRzIGFuZCBmYWlsdXJlcy4KKyAgICAgICAgbG9uZyBsYXN0RnJhbWVOdW1iZXIgPSAtMTsKKyAgICAgICAgd2hpbGUgKGxpc3RlbmVyLmhhc01vcmVSZXN1bHRzKCkpIHsKKyAgICAgICAgICAgIFRvdGFsQ2FwdHVyZVJlc3VsdCByZXN1bHQgPSBsaXN0ZW5lci5nZXRUb3RhbENhcHR1cmVSZXN1bHQoUFJFVklFV19USU1FX01TKTsKKyAgICAgICAgICAgIGlmIChsYXN0RnJhbWVOdW1iZXIgPCByZXN1bHQuZ2V0RnJhbWVOdW1iZXIoKSkgeworICAgICAgICAgICAgICAgIGxhc3RGcmFtZU51bWJlciA9IHJlc3VsdC5nZXRGcmFtZU51bWJlcigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKGxpc3RlbmVyLmhhc01vcmVGYWlsdXJlcygpKSB7CisgICAgICAgICAgICBBcnJheUxpc3Q8Q2FwdHVyZUZhaWx1cmU+IGZhaWx1cmVzID0gbGlzdGVuZXIuZ2V0Q2FwdHVyZUZhaWx1cmVzKAorICAgICAgICAgICAgICAgICAgICAvKm1heE51bUZhaWx1cmVzKi8gMSk7CisgICAgICAgICAgICBmb3IgKENhcHR1cmVGYWlsdXJlIGZhaWx1cmUgOiBmYWlsdXJlcykgeworICAgICAgICAgICAgICAgIGlmIChsYXN0RnJhbWVOdW1iZXIgPCBmYWlsdXJlLmdldEZyYW1lTnVtYmVyKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbGFzdEZyYW1lTnVtYmVyID0gZmFpbHVyZS5nZXRGcmFtZU51bWJlcigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFZlcmlmeSB0aGUgbGFzdCBmcmFtZSBudW1iZXIgcmVjZWl2ZWQgZnJvbSBjYXB0dXJlIHNlcXVlbmNlIGNvbXBsZXRlZCBtYXRjaGVzIHRoZQorICAgICAgICAvLyB0aGUgbGFzdCBmcmFtZSBudW1iZXIgb2YgdGhlIHJlc3VsdHMgYW5kIGZhaWx1cmVzLgorICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLmZvcm1hdCgiTGFzdCBmcmFtZSBudW1iZXIgZnJvbSBvbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZCAiICsKKyAgICAgICAgICAgICAgICAiKCVkKSBkb2Vzbid0IG1hdGNoIHRoZSBsYXN0IGZyYW1lIG51bWJlciByZWNlaXZlZCBmcm9tICIgKworICAgICAgICAgICAgICAgICJyZXN1bHRzL2ZhaWx1cmVzICglZCkiLCBsYXN0U2VxdWVuY2VGcmFtZU51bWJlciwgbGFzdEZyYW1lTnVtYmVyKSwKKyAgICAgICAgICAgICAgICBsYXN0U2VxdWVuY2VGcmFtZU51bWJlciwgbGFzdEZyYW1lTnVtYmVyKTsKKyAgICB9CisKKyAgICAvKgogICAgICAqIFZlcmlmeSBiZWhhdmlvciBvZiBzaGFyaW5nIHN1cmZhY2VzIHdpdGhpbiBvbmUgT3V0cHV0Q29uZmlndXJhdGlvbgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHRlc3RTaGFyZWRTdXJmYWNlcygpIHRocm93cyBFeGNlcHRpb24gewpAQCAtMzk3LDMxICs5ODEsNiBAQAogICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgLy8gZXhwZWN0ZWQ7CiAgICAgICAgIH0KLQotICAgICAgICAvLyBWZXJpZnkgdGhhdCBub24gaW1wbGVtZW50YXRpb24tZGVmaW5lZCBmb3JtYXRzIHNoYXJpbmcgYXJlIG5vdCBzdXBwb3J0ZWQuCi0gICAgICAgIGludFtdIHVuc3VwcG9ydGVkRm9ybWF0cyA9Ci0gICAgICAgICAgICAgICAge0ltYWdlRm9ybWF0LllVVl80MjBfODg4LCBJbWFnZUZvcm1hdC5ERVBUSDE2LCBJbWFnZUZvcm1hdC5ERVBUSF9QT0lOVF9DTE9VRCwKLSAgICAgICAgICAgICAgICAgSW1hZ2VGb3JtYXQuSlBFRywgSW1hZ2VGb3JtYXQuUkFXX1NFTlNPUiwgSW1hZ2VGb3JtYXQuUkFXX1BSSVZBVEV9OwotICAgICAgICBmb3IgKGludCBmb3JtYXQgOiB1bnN1cHBvcnRlZEZvcm1hdHMpIHsKLSAgICAgICAgICAgIFNpemVbXSBhdmFpbGFibGVTaXplcyA9IGdldFN0YXRpY0luZm8oY2FtZXJhSWQpLmdldEF2YWlsYWJsZVNpemVzRm9yRm9ybWF0Q2hlY2tlZCgKLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBTdGF0aWNNZXRhZGF0YS5TdHJlYW1EaXJlY3Rpb24uT3V0cHV0KTsKLSAgICAgICAgICAgIGlmIChhdmFpbGFibGVTaXplcy5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU2l6ZSBzaXplID0gYXZhaWxhYmxlU2l6ZXNbMF07Ci0KLSAgICAgICAgICAgIGltYWdlUmVhZGVyID0gbWFrZUltYWdlUmVhZGVyKHNpemUsIGZvcm1hdCwgTUFYX1JFQURFUl9JTUFHRVMsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBJbWFnZURyb3BwZXJMaXN0ZW5lcigpLCBtSGFuZGxlcik7Ci0gICAgICAgICAgICBjb25maWd1cmF0aW9uID0gbmV3IE91dHB1dENvbmZpZ3VyYXRpb24oT3V0cHV0Q29uZmlndXJhdGlvbi5TVVJGQUNFX0dST1VQX0lEX05PTkUsCi0gICAgICAgICAgICAgICAgICAgIGltYWdlUmVhZGVyLmdldFN1cmZhY2UoKSk7Ci0gICAgICAgICAgICBjb25maWd1cmF0aW9uLmVuYWJsZVN1cmZhY2VTaGFyaW5nKCk7Ci0KLSAgICAgICAgICAgIExpc3Q8T3V0cHV0Q29uZmlndXJhdGlvbj4gb3V0cHV0Q29uZmlncyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgb3V0cHV0Q29uZmlncy5hZGQoY29uZmlndXJhdGlvbik7Ci0KLSAgICAgICAgICAgIHZlcmlmeUNyZWF0ZVNlc3Npb25XaXRoQ29uZmlnc0ZhaWx1cmUoY2FtZXJhSWQsIG91dHB1dENvbmZpZ3MpOwotCi0gICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgdGVzdFNoYXJlZFN1cmZhY2VzQ2FwdHVyZVNlc3Npb25CeUNhbWVyYShTdHJpbmcgY2FtZXJhSWQpIHRocm93cyBFeGNlcHRpb24gewpAQCAtNTE3LDcgKzEwNzYsNyBAQAogCiAgICAgICAgIC8vIFJ1biBwcmV2aWV3IHdpdGggYm90aCBzdXJmYWNlcywgYW5kIHZlcmlmeSBhdCBsZWFzdCBvbmUgZnJhbWUgaXMgcmVjZWl2ZWQgZm9yIGVhY2gKICAgICAgICAgLy8gc3VyZmFjZS4KLSAgICAgICAgdXBkYXRlT3V0cHV0Q29uZmlncyhjYW1lcmFJZCwgZGVmZXJyZWRDb25maWdzLCBudWxsKTsKKyAgICAgICAgZmluYWxpemVPdXRwdXRDb25maWdzKGNhbWVyYUlkLCBkZWZlcnJlZENvbmZpZ3MsIG51bGwpOwogICAgICAgICBwcmV2aWV3RG9uZSA9CiAgICAgICAgICAgICAgICAgcHJldmlld0xpc3RlbmVyWzFdLndhaXRGb3JQcmV2aWV3RG9uZShXQUlUX0ZPUl9DT01NQU5EX1RPX0NPTVBMRVRFKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiVW5hYmxlIHRvIHN0YXJ0IHByZXZpZXcgMSIsIHByZXZpZXdEb25lKTsKQEAgLTU0Nyw3ICsxMTA2LDcgQEAKICAgICAgICAgc3VyZmFjZVNoYXJlZE91dHB1dC5hZGRTdXJmYWNlKHN1cmZhY2VzWzFdKTsKICAgICAgICAgZGVmZXJyZWRDb25maWdzLmNsZWFyKCk7CiAgICAgICAgIGRlZmVycmVkQ29uZmlncy5hZGQoc3VyZmFjZVNoYXJlZE91dHB1dCk7Ci0gICAgICAgIHVwZGF0ZU91dHB1dENvbmZpZ3MoY2FtZXJhSWQsIGRlZmVycmVkQ29uZmlncywgbnVsbCk7CisgICAgICAgIGZpbmFsaXplT3V0cHV0Q29uZmlncyhjYW1lcmFJZCwgZGVmZXJyZWRDb25maWdzLCBudWxsKTsKICAgICAgICAgcHJldmlld0RvbmUgPQogICAgICAgICAgICAgICAgIHByZXZpZXdMaXN0ZW5lclsxXS53YWl0Rm9yUHJldmlld0RvbmUoV0FJVF9GT1JfQ09NTUFORF9UT19DT01QTEVURSk7CiAgICAgICAgIGFzc2VydFRydWUoIlVuYWJsZSB0byBzdGFydCBwcmV2aWV3IDEiLCBwcmV2aWV3RG9uZSk7CkBAIC01NzQsNyArMTEzMyw3IEBACiAgICAgICAgIHN1cmZhY2VTaGFyZWRPdXRwdXQuYWRkU3VyZmFjZShzdXJmYWNlc1sxXSk7CiAgICAgICAgIGRlZmVycmVkQ29uZmlncy5jbGVhcigpOwogICAgICAgICBkZWZlcnJlZENvbmZpZ3MuYWRkKHN1cmZhY2VTaGFyZWRPdXRwdXQpOwotICAgICAgICB1cGRhdGVPdXRwdXRDb25maWdzKGNhbWVyYUlkLCBkZWZlcnJlZENvbmZpZ3MsIG51bGwpOworICAgICAgICBmaW5hbGl6ZU91dHB1dENvbmZpZ3MoY2FtZXJhSWQsIGRlZmVycmVkQ29uZmlncywgbnVsbCk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7CiAgICAgICAgICAgICBwcmV2aWV3RG9uZSA9CiAgICAgICAgICAgICAgICAgICAgIHByZXZpZXdMaXN0ZW5lcltpXS53YWl0Rm9yUHJldmlld0RvbmUoV0FJVF9GT1JfQ09NTUFORF9UT19DT01QTEVURSk7CkBAIC01ODQsNCArMTE0MywyMCBAQAogICAgICAgICBTeXN0ZW1DbG9jay5zbGVlcChQUkVWSUVXX1RJTUVfTVMpOwogICAgICAgICBzdG9wUHJldmlldyhjYW1lcmFJZCk7CiAgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBTaW1wbGVJbWFnZUxpc3RlbmVyIGltcGxlbWVudHMgSW1hZ2VSZWFkZXIuT25JbWFnZUF2YWlsYWJsZUxpc3RlbmVyIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb25kaXRpb25WYXJpYWJsZSBpbWFnZUF2YWlsYWJsZSA9IG5ldyBDb25kaXRpb25WYXJpYWJsZSgpOworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25JbWFnZUF2YWlsYWJsZShJbWFnZVJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgICAgIGltYWdlQXZhaWxhYmxlLm9wZW4oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHdhaXRGb3JBbnlJbWFnZUF2YWlsYWJsZShsb25nIHRpbWVvdXQpIHsKKyAgICAgICAgICAgIGlmIChpbWFnZUF2YWlsYWJsZS5ibG9jayh0aW1lb3V0KSkgeworICAgICAgICAgICAgICAgIGltYWdlQXZhaWxhYmxlLmNsb3NlKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZhaWwoIndhaXQgZm9yIGltYWdlIGF2YWlsYWJsZSB0aW1lZCBvdXQgYWZ0ZXIgIiArIHRpbWVvdXQgKyAibXMiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2NhbWVyYS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL2N0cy9OYXRpdmVDYW1lcmFEZXZpY2VUZXN0LmphdmEgYi90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9jdHMvTmF0aXZlQ2FtZXJhRGV2aWNlVGVzdC5qYXZhCmluZGV4IGUyYTYxYTYuLmQ1NGFiMTcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2NhbWVyYS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL2N0cy9OYXRpdmVDYW1lcmFEZXZpY2VUZXN0LmphdmEKKysrIGIvdGVzdHMvY2FtZXJhL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvY3RzL05hdGl2ZUNhbWVyYURldmljZVRlc3QuamF2YQpAQCAtMTYsNyArMTYsOSBAQAogCiBwYWNrYWdlIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5jdHM7CiAKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlN1cmZhY2VUZXh0dXJlOwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5jdHMudGVzdGNhc2VzLkNhbWVyYTJTdXJmYWNlVmlld1Rlc3RDYXNlOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TaXplOwogaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlOwpAQCAtMjQsNiArMjYsNyBAQAogLyoqCiAgKiA8cD5CYXNpYyB0ZXN0IGZvciBDYW1lcmFNYW5hZ2VyIGNsYXNzLjwvcD4KICAqLworQEFwcE1vZGVGdWxsCiBwdWJsaWMgY2xhc3MgTmF0aXZlQ2FtZXJhRGV2aWNlVGVzdCBleHRlbmRzIENhbWVyYTJTdXJmYWNlVmlld1Rlc3RDYXNlIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk5hdGl2ZUNhbWVyYURldmljZVRlc3QiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gVkVSQk9TRSA9IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpOwpAQCAtNTksOCArNjIsMjkgQEAKICAgICAgICAgICAgICAgICB0ZXN0Q2FtZXJhRGV2aWNlU2ltcGxlUHJldmlld05hdGl2ZShtUHJldmlld1N1cmZhY2UpKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FtZXJhRGV2aWNlUHJldmlld1dpdGhTZXNzaW9uUGFyYW1ldGVycygpIHsKKyAgICAgICAgLy8gSW5pdCBwcmV2aWV3IHN1cmZhY2UgdG8gYSBndWFyYW50ZWVkIHdvcmtpbmcgc2l6ZQorICAgICAgICB1cGRhdGVQcmV2aWV3U3VyZmFjZShuZXcgU2l6ZSg2NDAsIDQ4MCkpOworICAgICAgICBhc3NlcnRUcnVlKCJ0ZXN0Q2FtZXJhRGV2aWNlUHJldmlld1dpdGhTZXNzaW9uUGFyYW1ldGVyc05hdGl2ZSBmYWlsLCBzZWUgbG9nIGZvciBkZXRhaWxzIiwKKyAgICAgICAgICAgICAgICB0ZXN0Q2FtZXJhRGV2aWNlUHJldmlld1dpdGhTZXNzaW9uUGFyYW1ldGVyc05hdGl2ZShtUHJldmlld1N1cmZhY2UpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FtZXJhRGV2aWNlU2hhcmVkT3V0cHV0VXBkYXRlKCkgeworICAgICAgICAvLyBJbml0IHByZXZpZXcgc3VyZmFjZSB0byBhIGd1YXJhbnRlZWQgd29ya2luZyBzaXplCisgICAgICAgIFNpemUgcHJldmlld1NpemUgPSBuZXcgU2l6ZSg2NDAsIDQ4MCk7CisgICAgICAgIHVwZGF0ZVByZXZpZXdTdXJmYWNlKHByZXZpZXdTaXplKTsKKyAgICAgICAgU3VyZmFjZVRleHR1cmUgb3V0cHV0VGV4dHVyZSA9IG5ldyBTdXJmYWNlVGV4dHVyZSgvKiByYW5kb20gdGV4dHVyZSBJRCovIDUpOworICAgICAgICBvdXRwdXRUZXh0dXJlLnNldERlZmF1bHRCdWZmZXJTaXplKHByZXZpZXdTaXplLmdldFdpZHRoKCksIHByZXZpZXdTaXplLmdldEhlaWdodCgpKTsKKyAgICAgICAgU3VyZmFjZSBvdXRwdXRTdXJmYWNlID0gbmV3IFN1cmZhY2Uob3V0cHV0VGV4dHVyZSk7CisgICAgICAgIGFzc2VydFRydWUoInRlc3RDYW1lcmFEZXZpY2VTaGFyZWRXaW5kb3dBZGRSZW1vdmUgZmFpbCwgc2VlIGxvZyBmb3IgZGV0YWlscyIsCisgICAgICAgICAgICAgICAgdGVzdENhbWVyYURldmljZVNoYXJlZE91dHB1dFVwZGF0ZShtUHJldmlld1N1cmZhY2UsIG91dHB1dFN1cmZhY2UpKTsKKyAgICB9CisKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiB0ZXN0Q2FtZXJhRGV2aWNlT3BlbkFuZENsb3NlTmF0aXZlKCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gdGVzdENhbWVyYURldmljZUNyZWF0ZUNhcHR1cmVSZXF1ZXN0TmF0aXZlKCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gdGVzdENhbWVyYURldmljZVNlc3Npb25PcGVuQW5kQ2xvc2VOYXRpdmUoU3VyZmFjZSBwcmV2aWV3KTsKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiB0ZXN0Q2FtZXJhRGV2aWNlU2ltcGxlUHJldmlld05hdGl2ZShTdXJmYWNlIHByZXZpZXcpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBib29sZWFuIHRlc3RDYW1lcmFEZXZpY2VQcmV2aWV3V2l0aFNlc3Npb25QYXJhbWV0ZXJzTmF0aXZlKAorICAgICAgICAgICAgU3VyZmFjZSBwcmV2aWV3KTsKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiB0ZXN0Q2FtZXJhRGV2aWNlU2hhcmVkT3V0cHV0VXBkYXRlKFN1cmZhY2Ugc3JjLCBTdXJmYWNlIGRzdCk7CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9jdHMvTmF0aXZlQ2FtZXJhTWFuYWdlclRlc3QuamF2YSBiL3Rlc3RzL2NhbWVyYS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL2N0cy9OYXRpdmVDYW1lcmFNYW5hZ2VyVGVzdC5qYXZhCmluZGV4IDA4ZTAzNjMuLjg2NGI3ZDEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2NhbWVyYS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL2N0cy9OYXRpdmVDYW1lcmFNYW5hZ2VyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL2NhbWVyYS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL2N0cy9OYXRpdmVDYW1lcmFNYW5hZ2VyVGVzdC5qYXZhCkBAIC0xNiwxMiArMTYsMTQgQEAKIAogcGFja2FnZSBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuY3RzOwogCitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOwogaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogLyoqCiAgKiA8cD5CYXNpYyB0ZXN0IGZvciBDYW1lcmFNYW5hZ2VyIGNsYXNzLjwvcD4KICAqLworQEFwcE1vZGVGdWxsCiBwdWJsaWMgY2xhc3MgTmF0aXZlQ2FtZXJhTWFuYWdlclRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTmF0aXZlQ2FtZXJhTWFuYWdlclRlc3QiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gVkVSQk9TRSA9IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2FtZXJhL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvY3RzL05hdGl2ZUltYWdlUmVhZGVyVGVzdC5qYXZhIGIvdGVzdHMvY2FtZXJhL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvY3RzL05hdGl2ZUltYWdlUmVhZGVyVGVzdC5qYXZhCmluZGV4IGIwMTg2NDUuLmZlMDFmYmQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2NhbWVyYS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL2N0cy9OYXRpdmVJbWFnZVJlYWRlclRlc3QuamF2YQorKysgYi90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9jdHMvTmF0aXZlSW1hZ2VSZWFkZXJUZXN0LmphdmEKQEAgLTE3LDExICsxNywxMyBAQAogcGFja2FnZSBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuY3RzOwogCiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLmN0cy50ZXN0Y2FzZXMuQ2FtZXJhMkFuZHJvaWRUZXN0Q2FzZTsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogLyoqCiAgKiA8cD5CYXNpYyB0ZXN0IGZvciBDYW1lcmFNYW5hZ2VyIGNsYXNzLjwvcD4KICAqLworQEFwcE1vZGVGdWxsCiBwdWJsaWMgY2xhc3MgTmF0aXZlSW1hZ2VSZWFkZXJUZXN0IGV4dGVuZHMgQ2FtZXJhMkFuZHJvaWRUZXN0Q2FzZSB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJOYXRpdmVJbWFnZVJlYWRlclRlc3QiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gVkVSQk9TRSA9IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2FtZXJhL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvY3RzL05hdGl2ZVN0aWxsQ2FwdHVyZVRlc3QuamF2YSBiL3Rlc3RzL2NhbWVyYS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL2N0cy9OYXRpdmVTdGlsbENhcHR1cmVUZXN0LmphdmEKaW5kZXggMTRiNWEyMi4uODg4MmI0MCAxMDA2NDQKLS0tIGEvdGVzdHMvY2FtZXJhL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvY3RzL05hdGl2ZVN0aWxsQ2FwdHVyZVRlc3QuamF2YQorKysgYi90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9jdHMvTmF0aXZlU3RpbGxDYXB0dXJlVGVzdC5qYXZhCkBAIC0xNyw2ICsxNyw3IEBACiBwYWNrYWdlIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5jdHM7CiAKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuY3RzLnRlc3RjYXNlcy5DYW1lcmEyU3VyZmFjZVZpZXdUZXN0Q2FzZTsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU2l6ZTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZTsKQEAgLTI0LDYgKzI1LDcgQEAKIC8qKgogICogPHA+QmFzaWMgdGVzdCBmb3IgQ2FtZXJhTWFuYWdlciBjbGFzcy48L3A+CiAgKi8KK0BBcHBNb2RlRnVsbAogcHVibGljIGNsYXNzIE5hdGl2ZVN0aWxsQ2FwdHVyZVRlc3QgZXh0ZW5kcyBDYW1lcmEyU3VyZmFjZVZpZXdUZXN0Q2FzZSB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJOYXRpdmVTdGlsbENhcHR1cmVUZXN0IjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFZFUkJPU0UgPSBMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5WRVJCT1NFKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NhbWVyYS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL2N0cy9QZXJmb3JtYW5jZVRlc3QuamF2YSBiL3Rlc3RzL2NhbWVyYS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL2N0cy9QZXJmb3JtYW5jZVRlc3QuamF2YQppbmRleCAzZTc5Y2JjLi45MDA2YjA5IDEwMDY0NAotLS0gYS90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9jdHMvUGVyZm9ybWFuY2VUZXN0LmphdmEKKysrIGIvdGVzdHMvY2FtZXJhL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvY3RzL1BlcmZvcm1hbmNlVGVzdC5qYXZhCkBAIC0zOSw2ICszOSw3IEBACiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5JbWFnZVdyaXRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkNvbmRpdGlvblZhcmlhYmxlOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlBhaXI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlJhbmdlOwpAQCAtNjIsNiArNjMsNyBAQAogICogVGVzdCBjYW1lcmEyIEFQSSB1c2UgY2FzZSBwZXJmb3JtYW5jZSBLUElzLCBzdWNoIGFzIGNhbWVyYSBvcGVuIHRpbWUsIHNlc3Npb24gY3JlYXRpb24gdGltZSwKICAqIHNodXR0ZXIgbGFnIGV0Yy4gVGhlIEtQSSBkYXRhIHdpbGwgYmUgcmVwb3J0ZWQgaW4gY3RzIHJlc3VsdHMuCiAgKi8KK0BBcHBNb2RlRnVsbAogcHVibGljIGNsYXNzIFBlcmZvcm1hbmNlVGVzdCBleHRlbmRzIENhbWVyYTJTdXJmYWNlVmlld1Rlc3RDYXNlIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlBlcmZvcm1hbmNlVGVzdCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUE9SVF9MT0dfTkFNRSA9ICJDdHNDYW1lcmFUZXN0Q2FzZXMiOwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2FtZXJhL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvY3RzL1JlY29yZGluZ1Rlc3QuamF2YSBiL3Rlc3RzL2NhbWVyYS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL2N0cy9SZWNvcmRpbmdUZXN0LmphdmEKaW5kZXggMWU5Njk2Zi4uNzYxNzA0MyAxMDA2NDQKLS0tIGEvdGVzdHMvY2FtZXJhL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvY3RzL1JlY29yZGluZ1Rlc3QuamF2YQorKysgYi90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9jdHMvUmVjb3JkaW5nVGVzdC5qYXZhCkBAIC0xNSw2ICsxNSw3IEBACiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmV4LmNhbWVyYTIuYmxvY2tpbmcuQmxvY2tpbmdTZXNzaW9uQ2FsbGJhY2suKjsKIAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuSW1hZ2VGb3JtYXQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5TdXJmYWNlVGV4dHVyZTsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzOwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYW1lcmFDYXB0dXJlU2Vzc2lvbjsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FtZXJhQ29uc3RyYWluZWRIaWdoU3BlZWRDYXB0dXJlU2Vzc2lvbjsKQEAgLTM4LDYgKzM5LDcgQEAKIGltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUmVjb3JkZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5FbnZpcm9ubWVudDsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIGltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTGFyZ2VUZXN0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlJhbmdlOwpAQCAtNTksMTIgKzYxLDE0IEBACiAgKiBDYW1lcmFEZXZpY2UgdmlkZW8gcmVjb3JkaW5nIHVzZSBjYXNlIHRlc3RzIGJ5IHVzaW5nIE1lZGlhUmVjb3JkZXIgYW5kCiAgKiBNZWRpYUNvZGVjLgogICovCitAQXBwTW9kZUZ1bGwKIEBMYXJnZVRlc3QKIHB1YmxpYyBjbGFzcyBSZWNvcmRpbmdUZXN0IGV4dGVuZHMgQ2FtZXJhMlN1cmZhY2VWaWV3VGVzdENhc2UgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiUmVjb3JkaW5nVGVzdCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBWRVJCT1NFID0gTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19EVU1QID0gTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRUNPUkRJTkdfRFVSQVRJT05fTVMgPSAzMDAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUkVWSUVXX0RVUkFUSU9OX01TID0gMzAwMDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBEVVJBVElPTl9NQVJHSU4gPSAwLjJmOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZSBGUkFNRV9EVVJBVElPTl9FUlJPUl9UT0xFUkFOQ0VfTVMgPSAzLjA7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgRlJBTUVEVVJBVElPTl9NQVJHSU4gPSAwLjJmOwpAQCAtMTIyLDYgKzEyNiwxMyBAQAogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICAvLyBFeHRlcm5hbCBjYW1lcmEgZG9lc24ndCBzdXBwb3J0IENhbWNvcmRlclByb2ZpbGUgcmVjb3JkaW5nCisgICAgICAgICAgICAgICAgaWYgKG1TdGF0aWNJbmZvLmlzRXh0ZXJuYWxDYW1lcmEoKSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJDYW1lcmEgIiArIG1DYW1lcmFJZHNbaV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZG9lcyBub3Qgc3VwcG9ydCBDYW1jb3JkZXJQcm9maWxlLCBza2lwcGluZyIpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBpZiAoIW1TdGF0aWNJbmZvLmlzVmlkZW9TdGFiaWxpemF0aW9uU3VwcG9ydGVkKCkgJiYgdXNlVmlkZW9TdGFiKSB7CiAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkNhbWVyYSAiICsgbUNhbWVyYUlkc1tpXSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBkb2VzIG5vdCBzdXBwb3J0IHZpZGVvIHN0YWJpbGl6YXRpb24sIHNraXBwaW5nIHRoZSBzdGFiaWxpemF0aW9uIgpAQCAtMjk4LDYgKzMwOSwxMTYgQEAKICAgICAgICAgY29uc3RyYWluZWRIaWdoU3BlZWRSZWNvcmRpbmcoKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWJhbmRvbmVkSGlnaFNwZWVkUmVxdWVzdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmb3IgKFN0cmluZyBpZCA6IG1DYW1lcmFJZHMpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiVGVzdGluZyBiYWQgc3VmYWNlIGZvciBjcmVhdGVIaWdoU3BlZWRSZXF1ZXN0TGlzdCBmb3IgY2FtZXJhICIgKyBpZCk7CisgICAgICAgICAgICAgICAgLy8gUmUtdXNlIHRoZSBNZWRpYVJlY29yZGVyIG9iamVjdCBmb3IgdGhlIHNhbWUgY2FtZXJhIGRldmljZS4KKyAgICAgICAgICAgICAgICBtTWVkaWFSZWNvcmRlciA9IG5ldyBNZWRpYVJlY29yZGVyKCk7CisgICAgICAgICAgICAgICAgb3BlbkRldmljZShpZCk7CisgICAgICAgICAgICAgICAgaWYgKCFtU3RhdGljSW5mby5pc0NvbG9yT3V0cHV0U3VwcG9ydGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiQ2FtZXJhICIgKyBpZCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBkb2VzIG5vdCBzdXBwb3J0IGNvbG9yIG91dHB1dHMsIHNraXBwaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIW1TdGF0aWNJbmZvLmlzQ29uc3RyYWluZWRIaWdoU3BlZWRWaWRlb1N1cHBvcnRlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkNhbWVyYSAiICsgaWQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZG9lcyBub3Qgc3VwcG9ydCBjb25zdHJhaW5lZCBoaWdoIHNwZWVkIHZpZGVvLCBza2lwcGluZyIpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBTdHJlYW1Db25maWd1cmF0aW9uTWFwIGNvbmZpZyA9CisgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdGljSW5mby5nZXRWYWx1ZUZyb21LZXlOb25OdWxsKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuU0NBTEVSX1NUUkVBTV9DT05GSUdVUkFUSU9OX01BUCk7CisgICAgICAgICAgICAgICAgU2l6ZVtdIGhpZ2hTcGVlZFZpZGVvU2l6ZXMgPSBjb25maWcuZ2V0SGlnaFNwZWVkVmlkZW9TaXplcygpOworICAgICAgICAgICAgICAgIFNpemUgc2l6ZSA9IGhpZ2hTcGVlZFZpZGVvU2l6ZXNbMF07CisgICAgICAgICAgICAgICAgUmFuZ2U8SW50ZWdlcj4gZnBzUmFuZ2UgPSBnZXRIaWdoZXN0SGlnaFNwZWVkRml4ZWRGcHNSYW5nZUZvclNpemUoY29uZmlnLCBzaXplKTsKKyAgICAgICAgICAgICAgICBtQ29sbGVjdG9yLmV4cGVjdE5vdE51bGwoIlVuYWJsZSB0byBmaW5kIHRoZSBmaXhlZCBmcmFtZSByYXRlIGZwcyByYW5nZSBmb3IgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAic2l6ZSAiICsgc2l6ZSwgZnBzUmFuZ2UpOworICAgICAgICAgICAgICAgIGlmIChmcHNSYW5nZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGludCBjYXB0dXJlUmF0ZSA9IGZwc1JhbmdlLmdldExvd2VyKCk7CisgICAgICAgICAgICAgICAgaW50IHZpZGVvRnJhbWVyYXRlID0gY2FwdHVyZVJhdGUgLyBTTE9XTU9fU0xPV19GQUNUT1I7CisgICAgICAgICAgICAgICAgLy8gU2tpcCB0aGUgdGVzdCBpZiB0aGUgaGlnaGVzdCByZWNvcmRpbmcgRlBTIHN1cHBvcnRlZCBieSBDYW1jb3JkZXJQcm9maWxlCisgICAgICAgICAgICAgICAgaWYgKGZwc1JhbmdlLmdldFVwcGVyKCkgPiBnZXRGcHNGcm9tSGlnaFNwZWVkUHJvZmlsZUZvclNpemUoc2l6ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiaGlnaCBzcGVlZCByZWNvcmRpbmcgIiArIHNpemUgKyAiQCIgKyBjYXB0dXJlUmF0ZSArICJmcHMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGlzIG5vdCBzdXBwb3J0ZWQgYnkgQ2FtY29yZGVyUHJvZmlsZSIpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtT3V0TWVkaWFGaWxlTmFtZSA9IFZJREVPX0ZJTEVfUEFUSCArICIvdGVzdF92aWRlby5tcDQiOworICAgICAgICAgICAgICAgIHByZXBhcmVSZWNvcmRpbmcoc2l6ZSwgdmlkZW9GcmFtZXJhdGUsIGNhcHR1cmVSYXRlKTsKKyAgICAgICAgICAgICAgICB1cGRhdGVQcmV2aWV3U3VyZmFjZVdpdGhWaWRlbyhzaXplLCBjYXB0dXJlUmF0ZSk7CisKKyAgICAgICAgICAgICAgICBMaXN0PFN1cmZhY2U+IG91dHB1dFN1cmZhY2VzID0gbmV3IEFycmF5TGlzdDxTdXJmYWNlPigyKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJCb3RoIHByZXZpZXcgYW5kIHJlY29yZGluZyBzdXJmYWNlcyBzaG91bGQgYmUgdmFsaWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgbVByZXZpZXdTdXJmYWNlLmlzVmFsaWQoKSAmJiBtUmVjb3JkaW5nU3VyZmFjZS5pc1ZhbGlkKCkpOworCisgICAgICAgICAgICAgICAgb3V0cHV0U3VyZmFjZXMuYWRkKG1QcmV2aWV3U3VyZmFjZSk7CisgICAgICAgICAgICAgICAgb3V0cHV0U3VyZmFjZXMuYWRkKG1SZWNvcmRpbmdTdXJmYWNlKTsKKworICAgICAgICAgICAgICAgIG1TZXNzaW9uTGlzdGVuZXIgPSBuZXcgQmxvY2tpbmdTZXNzaW9uQ2FsbGJhY2soKTsKKyAgICAgICAgICAgICAgICBtU2Vzc2lvbiA9IGNvbmZpZ3VyZUNhbWVyYVNlc3Npb24obUNhbWVyYSwgb3V0cHV0U3VyZmFjZXMsIC8qaGlnaFNwZWVkKi90cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25MaXN0ZW5lciwgbUhhbmRsZXIpOworCisgICAgICAgICAgICAgICAgQ2FwdHVyZVJlcXVlc3QuQnVpbGRlciByZXF1ZXN0QnVpbGRlciA9CisgICAgICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhLmNyZWF0ZUNhcHR1cmVSZXF1ZXN0KENhbWVyYURldmljZS5URU1QTEFURV9SRUNPUkQpOworICAgICAgICAgICAgICAgIHJlcXVlc3RCdWlsZGVyLnNldChDYXB0dXJlUmVxdWVzdC5DT05UUk9MX0FFX1RBUkdFVF9GUFNfUkFOR0UsIGZwc1JhbmdlKTsKKyAgICAgICAgICAgICAgICByZXF1ZXN0QnVpbGRlci5hZGRUYXJnZXQobVByZXZpZXdTdXJmYWNlKTsKKyAgICAgICAgICAgICAgICByZXF1ZXN0QnVpbGRlci5hZGRUYXJnZXQobVJlY29yZGluZ1N1cmZhY2UpOworCisgICAgICAgICAgICAgICAgLy8gMS4gVGVzdCBhYmFuZG9uZWQgTWVkaWFSZWNvcmRlcgorICAgICAgICAgICAgICAgIHJlbGVhc2VSZWNvcmRlcigpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2FwdHVyZVJlcXVlc3Q+IHNsb3dNb1JlcXVlc3RzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENhbWVyYUNvbnN0cmFpbmVkSGlnaFNwZWVkQ2FwdHVyZVNlc3Npb24pIG1TZXNzaW9uKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVIaWdoU3BlZWRSZXF1ZXN0TGlzdChyZXF1ZXN0QnVpbGRlci5idWlsZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgZmFpbCgiQ3JlYXRlIGhpZ2ggc3BlZWQgcmVxdWVzdCBvbiBhYmFuZG9uZWQgc3VyZmFjZSBtdXN0IGZhaWwhIik7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiUmVsZWFzZSByZWNvcmRpbmcgc3VyZmFjZSB0ZXN0IHBhc3NlZCIpOworICAgICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIDIuIFRlc3QgYWJhbmRvbmVkIHByZXZpZXcgc3VyZmFjZQorICAgICAgICAgICAgICAgIG1NZWRpYVJlY29yZGVyID0gbmV3IE1lZGlhUmVjb3JkZXIoKTsKKyAgICAgICAgICAgICAgICBTdXJmYWNlVGV4dHVyZSBwcmV2aWV3ID0gbmV3IFN1cmZhY2VUZXh0dXJlKC8qcmFuZG9tIGludCovIDEpOworICAgICAgICAgICAgICAgIFN1cmZhY2UgcHJldmlld1N1cmZhY2UgPSBuZXcgU3VyZmFjZShwcmV2aWV3KTsKKyAgICAgICAgICAgICAgICBwcmV2aWV3LnNldERlZmF1bHRCdWZmZXJTaXplKHNpemUuZ2V0V2lkdGgoKSwgc2l6ZS5nZXRIZWlnaHQoKSk7CisKKyAgICAgICAgICAgICAgICBvdXRwdXRTdXJmYWNlcyA9IG5ldyBBcnJheUxpc3Q8U3VyZmFjZT4oKTsKKyAgICAgICAgICAgICAgICBvdXRwdXRTdXJmYWNlcy5hZGQocHJldmlld1N1cmZhY2UpOworCisgICAgICAgICAgICAgICAgcHJlcGFyZVJlY29yZGluZyhzaXplLCB2aWRlb0ZyYW1lcmF0ZSwgY2FwdHVyZVJhdGUpOworICAgICAgICAgICAgICAgIHVwZGF0ZVByZXZpZXdTdXJmYWNlV2l0aFZpZGVvKHNpemUsIGNhcHR1cmVSYXRlKTsKKworICAgICAgICAgICAgICAgIG1TZXNzaW9uID0gY29uZmlndXJlQ2FtZXJhU2Vzc2lvbihtQ2FtZXJhLCBvdXRwdXRTdXJmYWNlcywgLypoaWdoU3BlZWQqL3RydWUsCisgICAgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbkxpc3RlbmVyLCBtSGFuZGxlcik7CisKKyAgICAgICAgICAgICAgICByZXF1ZXN0QnVpbGRlciA9IG1DYW1lcmEuY3JlYXRlQ2FwdHVyZVJlcXVlc3QoQ2FtZXJhRGV2aWNlLlRFTVBMQVRFX1JFQ09SRCk7CisgICAgICAgICAgICAgICAgcmVxdWVzdEJ1aWxkZXIuc2V0KENhcHR1cmVSZXF1ZXN0LkNPTlRST0xfQUVfVEFSR0VUX0ZQU19SQU5HRSwgZnBzUmFuZ2UpOworICAgICAgICAgICAgICAgIHJlcXVlc3RCdWlsZGVyLmFkZFRhcmdldChwcmV2aWV3U3VyZmFjZSk7CisKKyAgICAgICAgICAgICAgICAvLyBBYmFuZG9uIHByZXZpZXcgc3VyZmFjZS4KKyAgICAgICAgICAgICAgICBwcmV2aWV3U3VyZmFjZS5yZWxlYXNlKCk7CisKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBMaXN0PENhcHR1cmVSZXF1ZXN0PiBzbG93TW9SZXF1ZXN0cyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDYW1lcmFDb25zdHJhaW5lZEhpZ2hTcGVlZENhcHR1cmVTZXNzaW9uKSBtU2Vzc2lvbikuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlSGlnaFNwZWVkUmVxdWVzdExpc3QocmVxdWVzdEJ1aWxkZXIuYnVpbGQoKSk7CisgICAgICAgICAgICAgICAgICAgIGZhaWwoIkNyZWF0ZSBoaWdoIHNwZWVkIHJlcXVlc3Qgb24gYWJhbmRvbmVkIHByZXZpZXcgc3VyZmFjZSBtdXN0IGZhaWwhIik7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiUmVsZWFzZSBwcmV2aWV3IHN1cmZhY2UgdGVzdCBwYXNzZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGNsb3NlRGV2aWNlKCk7CisgICAgICAgICAgICAgICAgcmVsZWFzZVJlY29yZGVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKICAgICAgKiA8cD4KICAgICAgKiBUZXN0IHJlY29yZGluZyBmcmFtZXJhdGUgYWNjdXJhY3kgd2hlbiBzd2l0Y2hpbmcgZnJvbSBsb3cgRlBTIHRvIGhpZ2ggRlBTLgpAQCAtMzE5LDYgKzQ0MCwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZG9lcyBub3Qgc3VwcG9ydCBjb2xvciBvdXRwdXRzLCBza2lwcGluZyIpOwogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1TdGF0aWNJbmZvLmlzRXh0ZXJuYWxDYW1lcmEoKSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJDYW1lcmEgIiArIG1DYW1lcmFJZHNbaV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZG9lcyBub3Qgc3VwcG9ydCBDYW1jb3JkZXJQcm9maWxlLCBza2lwcGluZyIpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaW5pdFN1cHBvcnRlZFZpZGVvU2l6ZShtQ2FtZXJhSWRzW2ldKTsKIAogICAgICAgICAgICAgICAgIGludCBtaW5GcHNQcm9maWxlSWQgPSAtMSwgbWluRnBzID0gMTAwMDsKQEAgLTQwMCw2ICs1MjYsMjUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICsgc3oudG9TdHJpbmcoKSArICIubXA0IjsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgLy8gQWxsb3cgZXh0ZXJuYWwgY2FtZXJhIHRvIHVzZSB2YXJpYWJsZSBmcHMgcmFuZ2UKKyAgICAgICAgICAgIFJhbmdlPEludGVnZXI+IGZwc1JhbmdlID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChtU3RhdGljSW5mby5pc0V4dGVybmFsQ2FtZXJhKCkpIHsKKyAgICAgICAgICAgICAgICBSYW5nZTxJbnRlZ2VyPltdIGF2YWlsYWJsZUZwc1JhbmdlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0aWNJbmZvLmdldEFlQXZhaWxhYmxlVGFyZ2V0RnBzUmFuZ2VzQ2hlY2tlZCgpOworCisgICAgICAgICAgICAgICAgYm9vbGVhbiBmb3VuZFJhbmdlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaW50IG1pbkZwcyA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdmFpbGFibGVGcHNSYW5nZS5sZW5ndGg7IGkgKz0gMSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobWluRnBzIDwgYXZhaWxhYmxlRnBzUmFuZ2VbaV0uZ2V0TG93ZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIFZJREVPX0ZSQU1FX1JBVEUgPT0gYXZhaWxhYmxlRnBzUmFuZ2VbaV0uZ2V0VXBwZXIoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWluRnBzID0gYXZhaWxhYmxlRnBzUmFuZ2VbaV0uZ2V0TG93ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kUmFuZ2UgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkNhbm5vdCBmaW5kIEZQUyByYW5nZSBmb3IgbWF4RnBzICIgKyBWSURFT19GUkFNRV9SQVRFLCBmb3VuZFJhbmdlKTsKKyAgICAgICAgICAgICAgICBmcHNSYW5nZSA9IFJhbmdlLmNyZWF0ZShtaW5GcHMsIFZJREVPX0ZSQU1FX1JBVEUpOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAvLyBVc2UgQVZDIGFuZCBBQUMgYS92IGNvbXByZXNzaW9uIGZvcm1hdC4KICAgICAgICAgICAgIHByZXBhcmVSZWNvcmRpbmcoc3osIFZJREVPX0ZSQU1FX1JBVEUsIFZJREVPX0ZSQU1FX1JBVEUpOwogCkBAIC00MDksNyArNTU0LDcgQEAKICAgICAgICAgICAgIC8vIFN0YXJ0IHJlY29yZGluZwogICAgICAgICAgICAgU2ltcGxlQ2FwdHVyZUNhbGxiYWNrIHJlc3VsdExpc3RlbmVyID0gbmV3IFNpbXBsZUNhcHR1cmVDYWxsYmFjaygpOwogICAgICAgICAgICAgaWYgKCFzdGFydFNoYXJlZFJlY29yZGluZygvKiB1c2VNZWRpYVJlY29yZGVyICovdHJ1ZSwgcmVzdWx0TGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgICAgIC8qdXNlVmlkZW9TdGFiKi9mYWxzZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLyp1c2VWaWRlb1N0YWIqL2ZhbHNlLCBmcHNSYW5nZSkpIHsKICAgICAgICAgICAgICAgICBtTWVkaWFSZWNvcmRlci5yZXNldCgpOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQpAQCAtNDIwLDExICs1NjUsMTkgQEAKICAgICAgICAgICAgIC8vIFN0b3AgcmVjb3JkaW5nIGFuZCBwcmV2aWV3CiAgICAgICAgICAgICBzdG9wUmVjb3JkaW5nKC8qIHVzZU1lZGlhUmVjb3JkZXIgKi90cnVlKTsKICAgICAgICAgICAgIC8vIENvbnZlcnQgbnVtYmVyIG9mIGZyYW1lcyBjYW1lcmEgcHJvZHVjZWQgaW50byB0aGUgZHVyYXRpb24gaW4gdW5pdCBvZiBtcy4KLSAgICAgICAgICAgIGZsb2F0IGZyYW1lRHVyYXRpb25NcyA9IDEwMDAuMGYgLyBWSURFT19GUkFNRV9SQVRFOwotICAgICAgICAgICAgZmxvYXQgZHVyYXRpb25NcyA9IHJlc3VsdExpc3RlbmVyLmdldFRvdGFsTnVtRnJhbWVzKCkgKiBmcmFtZUR1cmF0aW9uTXM7CisgICAgICAgICAgICBmbG9hdCBmcmFtZUR1cmF0aW9uTWluTXMgPSAxMDAwLjBmIC8gVklERU9fRlJBTUVfUkFURTsKKyAgICAgICAgICAgIGZsb2F0IGR1cmF0aW9uTWluTXMgPSByZXN1bHRMaXN0ZW5lci5nZXRUb3RhbE51bUZyYW1lcygpICogZnJhbWVEdXJhdGlvbk1pbk1zOworICAgICAgICAgICAgZmxvYXQgZHVyYXRpb25NYXhNcyA9IGR1cmF0aW9uTWluTXM7CisgICAgICAgICAgICBmbG9hdCBmcmFtZUR1cmF0aW9uTWF4TXMgPSAwLmY7CisgICAgICAgICAgICBpZiAoZnBzUmFuZ2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZyYW1lRHVyYXRpb25NYXhNcyA9IDEwMDAuMGYgLyBmcHNSYW5nZS5nZXRMb3dlcigpOworICAgICAgICAgICAgICAgIGR1cmF0aW9uTWF4TXMgPSByZXN1bHRMaXN0ZW5lci5nZXRUb3RhbE51bUZyYW1lcygpICogZnJhbWVEdXJhdGlvbk1heE1zOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBWYWxpZGF0aW9uLgotICAgICAgICAgICAgdmFsaWRhdGVSZWNvcmRpbmcoc3osIGR1cmF0aW9uTXMsIGZyYW1lRHVyYXRpb25NcywgRlJNRFJQX1JBVEVfVE9MRVJBTkNFKTsKKyAgICAgICAgICAgIHZhbGlkYXRlUmVjb3JkaW5nKHN6LCBkdXJhdGlvbk1pbk1zLCBkdXJhdGlvbk1heE1zLAorICAgICAgICAgICAgICAgICAgICBmcmFtZUR1cmF0aW9uTWluTXMsIGZyYW1lRHVyYXRpb25NYXhNcywKKyAgICAgICAgICAgICAgICAgICAgRlJNRFJQX1JBVEVfVE9MRVJBTkNFKTsKIAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTU1MCwxNiArNzAzLDI0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICAgICAgICAgIFNpbXBsZUNhcHR1cmVDYWxsYmFjayBwcmV2aWV3UmVzdWx0TGlzdGVuZXIgPSBuZXcgU2ltcGxlQ2FwdHVyZUNhbGxiYWNrKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByZXBhcmUgcHJldmlldyBzdXJmYWNlIGJ5IHVzaW5nIHZpZGVvIHNpemUuCisgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVQcmV2aWV3U3VyZmFjZVdpdGhWaWRlbyhzaXplLCBjYXB0dXJlUmF0ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0Q29uc3RyYWluZWRQcmV2aWV3KGZwc1JhbmdlLCBwcmV2aWV3UmVzdWx0TGlzdGVuZXIpOworCiAgICAgICAgICAgICAgICAgICAgICAgICBtT3V0TWVkaWFGaWxlTmFtZSA9IFZJREVPX0ZJTEVfUEFUSCArICIvdGVzdF9jc2xvd01vX3ZpZGVvXyIgKyBjYXB0dXJlUmF0ZSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmcHNfIiArIGlkICsgIl8iICsgc2l6ZS50b1N0cmluZygpICsgIi5tcDQiOwogCiAgICAgICAgICAgICAgICAgICAgICAgICBwcmVwYXJlUmVjb3JkaW5nKHNpemUsIFZJREVPX0ZSQU1FX1JBVEUsIGNhcHR1cmVSYXRlKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJlcGFyZSBwcmV2aWV3IHN1cmZhY2UgYnkgdXNpbmcgdmlkZW8gc2l6ZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVByZXZpZXdTdXJmYWNlV2l0aFZpZGVvKHNpemUsIGNhcHR1cmVSYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbUNsb2NrLnNsZWVwKFBSRVZJRVdfRFVSQVRJT05fTVMpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGFydCByZWNvcmRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BDYW1lcmFTdHJlYW1pbmcoKTsKKwogICAgICAgICAgICAgICAgICAgICAgICAgU2ltcGxlQ2FwdHVyZUNhbGxiYWNrIHJlc3VsdExpc3RlbmVyID0gbmV3IFNpbXBsZUNhcHR1cmVDYWxsYmFjaygpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RhcnQgcmVjb3JkaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFNsb3dNb3Rpb25SZWNvcmRpbmcoLyp1c2VNZWRpYVJlY29yZGVyKi90cnVlLCBWSURFT19GUkFNRV9SQVRFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXB0dXJlUmF0ZSwgZnBzUmFuZ2UsIHJlc3VsdExpc3RlbmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnVzZUhpZ2hTcGVlZFNlc3Npb24qL3RydWUpOwpAQCAtNTY5LDEyICs3MzAsMTkgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RvcCByZWNvcmRpbmcgYW5kIHByZXZpZXcKICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BSZWNvcmRpbmcoLyp1c2VNZWRpYVJlY29yZGVyKi90cnVlKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRDb25zdHJhaW5lZFByZXZpZXcoZnBzUmFuZ2UsIHByZXZpZXdSZXN1bHRMaXN0ZW5lcik7CisKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgbnVtYmVyIG9mIGZyYW1lcyBjYW1lcmEgcHJvZHVjZWQgaW50byB0aGUgZHVyYXRpb24gaW4gdW5pdCBvZiBtcy4KICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZyYW1lRHVyYXRpb25NcyA9IDEwMDAuMGYgLyBWSURFT19GUkFNRV9SQVRFOwogICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZHVyYXRpb25NcyA9IHJlc3VsdExpc3RlbmVyLmdldFRvdGFsTnVtRnJhbWVzKCkgKiBmcmFtZUR1cmF0aW9uTXM7CiAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFZhbGlkYXRpb24uCiAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZVJlY29yZGluZyhzaXplLCBkdXJhdGlvbk1zLCBmcmFtZUR1cmF0aW9uTXMsIEZSTURSUF9SQVRFX1RPTEVSQU5DRSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbUNsb2NrLnNsZWVwKFBSRVZJRVdfRFVSQVRJT05fTVMpOworCisgICAgICAgICAgICAgICAgICAgICAgICBzdG9wQ2FtZXJhU3RyZWFtaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKQEAgLTYzNSw5ICs4MDMsMzEgQEAKICAgICAgICAgcmV0dXJuIGZpeGVkUmFuZ2VzOwogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBzdGFydENvbnN0cmFpbmVkUHJldmlldyhSYW5nZTxJbnRlZ2VyPiBmcHNSYW5nZSwKKyAgICAgICAgICAgIENhbWVyYUNhcHR1cmVTZXNzaW9uLkNhcHR1cmVDYWxsYmFjayBsaXN0ZW5lcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIExpc3Q8U3VyZmFjZT4gb3V0cHV0U3VyZmFjZXMgPSBuZXcgQXJyYXlMaXN0PFN1cmZhY2U+KDEpOworICAgICAgICBhc3NlcnRUcnVlKCJQcmV2aWV3IHN1cmZhY2Ugc2hvdWxkIGJlIHZhbGlkIiwgbVByZXZpZXdTdXJmYWNlLmlzVmFsaWQoKSk7CisgICAgICAgIG91dHB1dFN1cmZhY2VzLmFkZChtUHJldmlld1N1cmZhY2UpOworICAgICAgICBtU2Vzc2lvbkxpc3RlbmVyID0gbmV3IEJsb2NraW5nU2Vzc2lvbkNhbGxiYWNrKCk7CisKKyAgICAgICAgTGlzdDxDYXB0dXJlUmVxdWVzdD4gc2xvd01vUmVxdWVzdHMgPSBudWxsOworICAgICAgICBDYXB0dXJlUmVxdWVzdC5CdWlsZGVyIHJlcXVlc3RCdWlsZGVyID0KKyAgICAgICAgICAgIG1DYW1lcmEuY3JlYXRlQ2FwdHVyZVJlcXVlc3QoQ2FtZXJhRGV2aWNlLlRFTVBMQVRFX1JFQ09SRCk7CisgICAgICAgIHJlcXVlc3RCdWlsZGVyLnNldChDYXB0dXJlUmVxdWVzdC5DT05UUk9MX0FFX1RBUkdFVF9GUFNfUkFOR0UsIGZwc1JhbmdlKTsKKyAgICAgICAgcmVxdWVzdEJ1aWxkZXIuYWRkVGFyZ2V0KG1QcmV2aWV3U3VyZmFjZSk7CisgICAgICAgIENhcHR1cmVSZXF1ZXN0IGluaXRpYWxSZXF1ZXN0ID0gcmVxdWVzdEJ1aWxkZXIuYnVpbGQoKTsKKyAgICAgICAgbVNlc3Npb24gPSBidWlsZENvbnN0cmFpbmVkQ2FtZXJhU2Vzc2lvbihtQ2FtZXJhLCBvdXRwdXRTdXJmYWNlcywgbVNlc3Npb25MaXN0ZW5lciwKKyAgICAgICAgICAgICAgICBtSGFuZGxlciwgaW5pdGlhbFJlcXVlc3QpOworICAgICAgICBzbG93TW9SZXF1ZXN0cyA9ICgoQ2FtZXJhQ29uc3RyYWluZWRIaWdoU3BlZWRDYXB0dXJlU2Vzc2lvbikgbVNlc3Npb24pLgorICAgICAgICAgICAgY3JlYXRlSGlnaFNwZWVkUmVxdWVzdExpc3QoaW5pdGlhbFJlcXVlc3QpOworCisgICAgICAgIG1TZXNzaW9uLnNldFJlcGVhdGluZ0J1cnN0KHNsb3dNb1JlcXVlc3RzLCBsaXN0ZW5lciwgbUhhbmRsZXIpOworICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCBzdGFydFNsb3dNb3Rpb25SZWNvcmRpbmcoYm9vbGVhbiB1c2VNZWRpYVJlY29yZGVyLCBpbnQgdmlkZW9GcmFtZVJhdGUsCiAgICAgICAgICAgICBpbnQgY2FwdHVyZVJhdGUsIFJhbmdlPEludGVnZXI+IGZwc1JhbmdlLAotICAgICAgICAgICAgQ2FtZXJhQ2FwdHVyZVNlc3Npb24uQ2FwdHVyZUNhbGxiYWNrIGxpc3RlbmVyLCBib29sZWFuIHVzZUhpZ2hTcGVlZFNlc3Npb24pIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgQ2FtZXJhQ2FwdHVyZVNlc3Npb24uQ2FwdHVyZUNhbGxiYWNrIGxpc3RlbmVyLCBib29sZWFuIHVzZUhpZ2hTcGVlZFNlc3Npb24pCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgTGlzdDxTdXJmYWNlPiBvdXRwdXRTdXJmYWNlcyA9IG5ldyBBcnJheUxpc3Q8U3VyZmFjZT4oMik7CiAgICAgICAgIGFzc2VydFRydWUoIkJvdGggcHJldmlldyBhbmQgcmVjb3JkaW5nIHN1cmZhY2VzIHNob3VsZCBiZSB2YWxpZCIsCiAgICAgICAgICAgICAgICAgbVByZXZpZXdTdXJmYWNlLmlzVmFsaWQoKSAmJiBtUmVjb3JkaW5nU3VyZmFjZS5pc1ZhbGlkKCkpOwpAQCAtNjQ4LDggKzgzOCw2IEBACiAgICAgICAgICAgICBvdXRwdXRTdXJmYWNlcy5hZGQobVJlYWRlclN1cmZhY2UpOwogICAgICAgICB9CiAgICAgICAgIG1TZXNzaW9uTGlzdGVuZXIgPSBuZXcgQmxvY2tpbmdTZXNzaW9uQ2FsbGJhY2soKTsKLSAgICAgICAgbVNlc3Npb24gPSBjb25maWd1cmVDYW1lcmFTZXNzaW9uKG1DYW1lcmEsIG91dHB1dFN1cmZhY2VzLCB1c2VIaWdoU3BlZWRTZXNzaW9uLAotICAgICAgICAgICAgICAgIG1TZXNzaW9uTGlzdGVuZXIsIG1IYW5kbGVyKTsKIAogICAgICAgICAvLyBDcmVhdGUgc2xvdyBtb3Rpb24gcmVxdWVzdCBsaXN0CiAgICAgICAgIExpc3Q8Q2FwdHVyZVJlcXVlc3Q+IHNsb3dNb1JlcXVlc3RzID0gbnVsbDsKQEAgLTY1OSw4ICs4NDcsMTEgQEAKICAgICAgICAgICAgIHJlcXVlc3RCdWlsZGVyLnNldChDYXB0dXJlUmVxdWVzdC5DT05UUk9MX0FFX1RBUkdFVF9GUFNfUkFOR0UsIGZwc1JhbmdlKTsKICAgICAgICAgICAgIHJlcXVlc3RCdWlsZGVyLmFkZFRhcmdldChtUHJldmlld1N1cmZhY2UpOwogICAgICAgICAgICAgcmVxdWVzdEJ1aWxkZXIuYWRkVGFyZ2V0KG1SZWNvcmRpbmdTdXJmYWNlKTsKKyAgICAgICAgICAgIENhcHR1cmVSZXF1ZXN0IGluaXRpYWxSZXF1ZXN0ID0gcmVxdWVzdEJ1aWxkZXIuYnVpbGQoKTsKKyAgICAgICAgICAgIG1TZXNzaW9uID0gYnVpbGRDb25zdHJhaW5lZENhbWVyYVNlc3Npb24obUNhbWVyYSwgb3V0cHV0U3VyZmFjZXMsIG1TZXNzaW9uTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgIG1IYW5kbGVyLCBpbml0aWFsUmVxdWVzdCk7CiAgICAgICAgICAgICBzbG93TW9SZXF1ZXN0cyA9ICgoQ2FtZXJhQ29uc3RyYWluZWRIaWdoU3BlZWRDYXB0dXJlU2Vzc2lvbikgbVNlc3Npb24pLgotICAgICAgICAgICAgICAgICAgICBjcmVhdGVIaWdoU3BlZWRSZXF1ZXN0TGlzdChyZXF1ZXN0QnVpbGRlci5idWlsZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgY3JlYXRlSGlnaFNwZWVkUmVxdWVzdExpc3QoaW5pdGlhbFJlcXVlc3QpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQ2FwdHVyZVJlcXVlc3QuQnVpbGRlciByZWNvcmRpbmdSZXF1ZXN0QnVpbGRlciA9CiAgICAgICAgICAgICAgICAgICAgIG1DYW1lcmEuY3JlYXRlQ2FwdHVyZVJlcXVlc3QoQ2FtZXJhRGV2aWNlLlRFTVBMQVRFX1JFQ09SRCk7CkBAIC02ODQsOCArODc1LDEyIEBACiAgICAgICAgICAgICByZWNvcmRpbmdPbmx5QnVpbGRlci5zZXQoQ2FwdHVyZVJlcXVlc3QuQ09OVFJPTF9BRV9UQVJHRVRfRlBTX1JBTkdFLCBmcHNSYW5nZSk7CiAgICAgICAgICAgICByZWNvcmRpbmdPbmx5QnVpbGRlci5hZGRUYXJnZXQobVJlY29yZGluZ1N1cmZhY2UpOwogCisgICAgICAgICAgICBDYXB0dXJlUmVxdWVzdCBpbml0aWFsUmVxdWVzdCA9IHJlY29yZGluZ1JlcXVlc3RCdWlsZGVyLmJ1aWxkKCk7CisgICAgICAgICAgICBtU2Vzc2lvbiA9IGNvbmZpZ3VyZUNhbWVyYVNlc3Npb25XaXRoUGFyYW1ldGVycyhtQ2FtZXJhLCBvdXRwdXRTdXJmYWNlcywKKyAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25MaXN0ZW5lciwgbUhhbmRsZXIsIGluaXRpYWxSZXF1ZXN0KTsKKwogICAgICAgICAgICAgc2xvd01vUmVxdWVzdHMgPSBuZXcgQXJyYXlMaXN0PENhcHR1cmVSZXF1ZXN0PigpOwotICAgICAgICAgICAgc2xvd01vUmVxdWVzdHMuYWRkKHJlY29yZGluZ1JlcXVlc3RCdWlsZGVyLmJ1aWxkKCkpOy8vIFByZXZpZXcgKyByZWNvcmRpbmcuCisgICAgICAgICAgICBzbG93TW9SZXF1ZXN0cy5hZGQoaW5pdGlhbFJlcXVlc3QpOy8vIFByZXZpZXcgKyByZWNvcmRpbmcuCiAKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2xvd01vdGlvbkZhY3RvciAtIDE7IGkrKykgewogICAgICAgICAgICAgICAgIHNsb3dNb1JlcXVlc3RzLmFkZChyZWNvcmRpbmdPbmx5QnVpbGRlci5idWlsZCgpKTsgLy8gUmVjb3JkaW5nIG9ubHkuCkBAIC04MDcsNiArMTAwMiwyNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgKyBzei50b1N0cmluZygpICsgIi5tcDQiOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICAvLyBBbGxvdyBleHRlcm5hbCBjYW1lcmEgdG8gdXNlIHZhcmlhYmxlIGZwcyByYW5nZQorICAgICAgICAgICAgUmFuZ2U8SW50ZWdlcj4gZnBzUmFuZ2UgPSBudWxsOworICAgICAgICAgICAgaWYgKG1TdGF0aWNJbmZvLmlzRXh0ZXJuYWxDYW1lcmEoKSkgeworICAgICAgICAgICAgICAgIFJhbmdlPEludGVnZXI+W10gYXZhaWxhYmxlRnBzUmFuZ2UgPQorICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRpY0luZm8uZ2V0QWVBdmFpbGFibGVUYXJnZXRGcHNSYW5nZXNDaGVja2VkKCk7CisKKyAgICAgICAgICAgICAgICBib29sZWFuIGZvdW5kUmFuZ2UgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpbnQgbWluRnBzID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF2YWlsYWJsZUZwc1JhbmdlLmxlbmd0aDsgaSArPSAxKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtaW5GcHMgPCBhdmFpbGFibGVGcHNSYW5nZVtpXS5nZXRMb3dlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgVklERU9fRlJBTUVfUkFURSA9PSBhdmFpbGFibGVGcHNSYW5nZVtpXS5nZXRVcHBlcigpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtaW5GcHMgPSBhdmFpbGFibGVGcHNSYW5nZVtpXS5nZXRMb3dlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRSYW5nZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQ2Fubm90IGZpbmQgRlBTIHJhbmdlIGZvciBtYXhGcHMgIiArIFZJREVPX0ZSQU1FX1JBVEUsIGZvdW5kUmFuZ2UpOworICAgICAgICAgICAgICAgIGZwc1JhbmdlID0gUmFuZ2UuY3JlYXRlKG1pbkZwcywgVklERU9fRlJBTUVfUkFURSk7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIC8vIFVzZSBBVkMgYW5kIEFBQyBhL3YgY29tcHJlc3Npb24gZm9ybWF0LgogICAgICAgICAgICAgcHJlcGFyZVJlY29yZGluZyhzeiwgVklERU9fRlJBTUVfUkFURSwgVklERU9fRlJBTUVfUkFURSk7CiAKQEAgLTgxNSw3ICsxMDI5LDkgQEAKIAogICAgICAgICAgICAgLy8gU3RhcnQgcmVjb3JkaW5nCiAgICAgICAgICAgICBTaW1wbGVDYXB0dXJlQ2FsbGJhY2sgcmVzdWx0TGlzdGVuZXIgPSBuZXcgU2ltcGxlQ2FwdHVyZUNhbGxiYWNrKCk7Ci0gICAgICAgICAgICBzdGFydFJlY29yZGluZygvKiB1c2VNZWRpYVJlY29yZGVyICovdHJ1ZSwgcmVzdWx0TGlzdGVuZXIsIC8qdXNlVmlkZW9TdGFiKi9mYWxzZSk7CisgICAgICAgICAgICBzdGFydFJlY29yZGluZygKKyAgICAgICAgICAgICAgICAgICAgLyogdXNlTWVkaWFSZWNvcmRlciAqL3RydWUsIHJlc3VsdExpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAvKnVzZVZpZGVvU3RhYiovZmFsc2UsIGZwc1JhbmdlKTsKIAogICAgICAgICAgICAgLy8gUmVjb3JkIGNlcnRhaW4gZHVyYXRpb24uCiAgICAgICAgICAgICBTeXN0ZW1DbG9jay5zbGVlcChSRUNPUkRJTkdfRFVSQVRJT05fTVMpOwpAQCAtODIzLDExICsxMDM5LDE5IEBACiAgICAgICAgICAgICAvLyBTdG9wIHJlY29yZGluZyBhbmQgcHJldmlldwogICAgICAgICAgICAgc3RvcFJlY29yZGluZygvKiB1c2VNZWRpYVJlY29yZGVyICovdHJ1ZSk7CiAgICAgICAgICAgICAvLyBDb252ZXJ0IG51bWJlciBvZiBmcmFtZXMgY2FtZXJhIHByb2R1Y2VkIGludG8gdGhlIGR1cmF0aW9uIGluIHVuaXQgb2YgbXMuCi0gICAgICAgICAgICBmbG9hdCBmcmFtZUR1cmF0aW9uTXMgPSAxMDAwLjBmIC8gVklERU9fRlJBTUVfUkFURTsKLSAgICAgICAgICAgIGZsb2F0IGR1cmF0aW9uTXMgPSByZXN1bHRMaXN0ZW5lci5nZXRUb3RhbE51bUZyYW1lcygpICogZnJhbWVEdXJhdGlvbk1zOworICAgICAgICAgICAgZmxvYXQgZnJhbWVEdXJhdGlvbk1pbk1zID0gMTAwMC4wZiAvIFZJREVPX0ZSQU1FX1JBVEU7CisgICAgICAgICAgICBmbG9hdCBkdXJhdGlvbk1pbk1zID0gcmVzdWx0TGlzdGVuZXIuZ2V0VG90YWxOdW1GcmFtZXMoKSAqIGZyYW1lRHVyYXRpb25NaW5NczsKKyAgICAgICAgICAgIGZsb2F0IGR1cmF0aW9uTWF4TXMgPSBkdXJhdGlvbk1pbk1zOworICAgICAgICAgICAgZmxvYXQgZnJhbWVEdXJhdGlvbk1heE1zID0gMC5mOworICAgICAgICAgICAgaWYgKGZwc1JhbmdlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmcmFtZUR1cmF0aW9uTWF4TXMgPSAxMDAwLjBmIC8gZnBzUmFuZ2UuZ2V0TG93ZXIoKTsKKyAgICAgICAgICAgICAgICBkdXJhdGlvbk1heE1zID0gcmVzdWx0TGlzdGVuZXIuZ2V0VG90YWxOdW1GcmFtZXMoKSAqIGZyYW1lRHVyYXRpb25NYXhNczsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gVmFsaWRhdGlvbi4KLSAgICAgICAgICAgIHZhbGlkYXRlUmVjb3JkaW5nKHN6LCBkdXJhdGlvbk1zLCBmcmFtZUR1cmF0aW9uTXMsIEZSTURSUF9SQVRFX1RPTEVSQU5DRSk7CisgICAgICAgICAgICB2YWxpZGF0ZVJlY29yZGluZyhzeiwgZHVyYXRpb25NaW5NcywgZHVyYXRpb25NYXhNcywKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVEdXJhdGlvbk1pbk1zLCBmcmFtZUR1cmF0aW9uTWF4TXMsCisgICAgICAgICAgICAgICAgICAgIEZSTURSUF9SQVRFX1RPTEVSQU5DRSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTg2MSw2ICsxMDg1LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdGljSW5mby5pc0V4dGVybmFsQ2FtZXJhKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkNhbWVyYSAiICsgaWQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGRvZXMgbm90IHN1cHBvcnQgQ2FtY29yZGVyUHJvZmlsZSwgc2tpcHBpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAgICAgaW5pdFN1cHBvcnRlZFZpZGVvU2l6ZShpZCk7CiAKICAgICAgICAgICAgICAgICAgICAgdmlkZW9TbmFwc2hvdFRlc3RCeUNhbWVyYShidXJzdFRlc3QpOwpAQCAtOTIxLDYgKzExNTEsOCBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBDYW1jb3JkZXJQcm9maWxlIHByb2ZpbGUgPSBDYW1jb3JkZXJQcm9maWxlLmdldChjYW1lcmFJZCwgcHJvZmlsZUlkKTsKKyAgICAgICAgICAgIFNpemUgUUNJRiA9IG5ldyBTaXplKDE3NiwgMTQ0KTsKKyAgICAgICAgICAgIFNpemUgRlVMTF9IRCA9IG5ldyBTaXplKDE5MjAsIDEwODApOwogICAgICAgICAgICAgU2l6ZSB2aWRlb1N6ID0gbmV3IFNpemUocHJvZmlsZS52aWRlb0ZyYW1lV2lkdGgsIHByb2ZpbGUudmlkZW9GcmFtZUhlaWdodCk7CiAgICAgICAgICAgICBTaXplIG1heFByZXZpZXdTaXplID0gbU9yZGVyZWRQcmV2aWV3U2l6ZXMuZ2V0KDApOwogCkBAIC05OTcsOCArMTIyOSw2IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBMb2cuaShUQUcsICJUZXN0aW5nIHZpZGVvIHNuYXBzaG90IHNpemUgIiArIHZpZGVvU25hcHNob3RTeiArCi0gICAgICAgICAgICAgICAgICAgICIgZm9yIHZpZGVvIHNpemUgIiArIHZpZGVvU3opOwogICAgICAgICAgICAgaWYgKHZpZGVvU25hcHNob3RTei5nZXRXaWR0aCgpICogdmlkZW9TbmFwc2hvdFN6LmdldEhlaWdodCgpID4gRlJBTUVfU0laRV8xNU0pCiAgICAgICAgICAgICAgICAga0ZyYW1lRHJvcF9Ub2xlcmVuY2UgPSAoaW50KShGUkFNRURST1BfVE9MRVJBTkNFICogRlJBTUVfRFJPUF9UT0xFUkVOQ0VfRkFDVE9SKTsKIApAQCAtMTAyMyw2ICsxMjUzLDI2IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAodmlkZW9Tei5lcXVhbHMoUUNJRikgJiYKKyAgICAgICAgICAgICAgICAgICAgKCh2aWRlb1NuYXBzaG90U3ouZ2V0V2lkdGgoKSA+IEZVTExfSEQuZ2V0V2lkdGgoKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICh2aWRlb1NuYXBzaG90U3ouZ2V0SGVpZ2h0KCkgPiBGVUxMX0hELmdldEhlaWdodCgpKSkpIHsKKyAgICAgICAgICAgICAgICBMaXN0PFN1cmZhY2U+IG91dHB1dHMgPSBuZXcgQXJyYXlMaXN0PFN1cmZhY2U+KCk7CisgICAgICAgICAgICAgICAgb3V0cHV0cy5hZGQobVByZXZpZXdTdXJmYWNlKTsKKyAgICAgICAgICAgICAgICBvdXRwdXRzLmFkZChtUmVjb3JkaW5nU3VyZmFjZSk7CisgICAgICAgICAgICAgICAgb3V0cHV0cy5hZGQobVJlYWRlclN1cmZhY2UpOworICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNTdXBwb3J0ZWQgPSBpc1N0cmVhbUNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoCisgICAgICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhLCBvdXRwdXRzLCBtU2Vzc2lvbkxpc3RlbmVyLCBtSGFuZGxlcik7CisgICAgICAgICAgICAgICAgaWYgKCFpc1N1cHBvcnRlZCkgeworICAgICAgICAgICAgICAgICAgICB2aWRlb1NuYXBzaG90U3ogPSBkZWZhdWx0dmlkZW9TbmFwc2hvdFN6OworICAgICAgICAgICAgICAgICAgICBjcmVhdGVJbWFnZVJlYWRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb1NuYXBzaG90U3osIEltYWdlRm9ybWF0LkpQRUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1ZJREVPX1NOQVBTSE9UX0lNQUdFUywgLypsaXN0ZW5lciovbnVsbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMb2cuaShUQUcsICJUZXN0aW5nIHZpZGVvIHNuYXBzaG90IHNpemUgIiArIHZpZGVvU25hcHNob3RTeiArCisgICAgICAgICAgICAgICAgICAgICIgZm9yIHZpZGVvIHNpemUgIiArIHZpZGVvU3opOworCiAgICAgICAgICAgICBpZiAoVkVSQk9TRSkgewogICAgICAgICAgICAgICAgIExvZy52KFRBRywgIlRlc3RpbmcgY2FtZXJhIHJlY29yZGluZyB3aXRoIHZpZGVvIHNpemUgIiArIHZpZGVvU3oudG9TdHJpbmcoKSk7CiAgICAgICAgICAgICB9CkBAIC0xMDUyLDYgKzEzMDIsMTQgQEAKICAgICAgICAgICAgICAgICB1cGRhdGVQcmV2aWV3U3VyZmFjZVdpdGhWaWRlbyh2aWRlb1N6LCBwcm9maWxlLnZpZGVvRnJhbWVSYXRlKTsKIAogICAgICAgICAgICAgICAgIHByZXBhcmVWaWRlb1NuYXBzaG90KHZpZGVvU25hcHNob3RSZXF1ZXN0QnVpbGRlciwgaW1hZ2VMaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgUmFuZ2U8SW50ZWdlcj4gZnBzUmFuZ2UgPSBSYW5nZS5jcmVhdGUocHJvZmlsZS52aWRlb0ZyYW1lUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUudmlkZW9GcmFtZVJhdGUpOworICAgICAgICAgICAgICAgIHZpZGVvU25hcHNob3RSZXF1ZXN0QnVpbGRlci5zZXQoQ2FwdHVyZVJlcXVlc3QuQ09OVFJPTF9BRV9UQVJHRVRfRlBTX1JBTkdFLAorICAgICAgICAgICAgICAgICAgICAgICAgZnBzUmFuZ2UpOworICAgICAgICAgICAgICAgIGlmIChtU3RhdGljSW5mby5pc1ZpZGVvU3RhYmlsaXphdGlvblN1cHBvcnRlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHZpZGVvU25hcHNob3RSZXF1ZXN0QnVpbGRlci5zZXQoQ2FwdHVyZVJlcXVlc3QuQ09OVFJPTF9WSURFT19TVEFCSUxJWkFUSU9OX01PREUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FwdHVyZVJlcXVlc3QuQ09OVFJPTF9WSURFT19TVEFCSUxJWkFUSU9OX01PREVfT04pOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBDYXB0dXJlUmVxdWVzdCByZXF1ZXN0ID0gdmlkZW9TbmFwc2hvdFJlcXVlc3RCdWlsZGVyLmJ1aWxkKCk7CiAKICAgICAgICAgICAgICAgICAvLyBTdGFydCByZWNvcmRpbmcKQEAgLTEyNTAsNiArMTUwOCwxMiBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0UmVjb3JkaW5nKGJvb2xlYW4gdXNlTWVkaWFSZWNvcmRlciwKICAgICAgICAgICAgIENhbWVyYUNhcHR1cmVTZXNzaW9uLkNhcHR1cmVDYWxsYmFjayBsaXN0ZW5lciwgYm9vbGVhbiB1c2VWaWRlb1N0YWIpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdGFydFJlY29yZGluZyh1c2VNZWRpYVJlY29yZGVyLCBsaXN0ZW5lciwgdXNlVmlkZW9TdGFiLCAvKnZhcmlhYmxlRnBzUmFuZ2UqL251bGwpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzdGFydFJlY29yZGluZyhib29sZWFuIHVzZU1lZGlhUmVjb3JkZXIsCisgICAgICAgICAgICBDYW1lcmFDYXB0dXJlU2Vzc2lvbi5DYXB0dXJlQ2FsbGJhY2sgbGlzdGVuZXIsIGJvb2xlYW4gdXNlVmlkZW9TdGFiLAorICAgICAgICAgICAgUmFuZ2U8SW50ZWdlcj4gdmFyaWFibGVGcHNSYW5nZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghbVN0YXRpY0luZm8uaXNWaWRlb1N0YWJpbGl6YXRpb25TdXBwb3J0ZWQoKSAmJiB1c2VWaWRlb1N0YWIpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlZpZGVvIHN0YWJpbGl6YXRpb24gaXMgbm90IHN1cHBvcnRlZCIpOwogICAgICAgICB9CkBAIC0xMjY0LDEyICsxNTI4LDEzIEBACiAgICAgICAgICAgICBvdXRwdXRTdXJmYWNlcy5hZGQobVJlYWRlclN1cmZhY2UpOwogICAgICAgICB9CiAgICAgICAgIG1TZXNzaW9uTGlzdGVuZXIgPSBuZXcgQmxvY2tpbmdTZXNzaW9uQ2FsbGJhY2soKTsKLSAgICAgICAgbVNlc3Npb24gPSBjb25maWd1cmVDYW1lcmFTZXNzaW9uKG1DYW1lcmEsIG91dHB1dFN1cmZhY2VzLCBtU2Vzc2lvbkxpc3RlbmVyLCBtSGFuZGxlcik7CiAKICAgICAgICAgQ2FwdHVyZVJlcXVlc3QuQnVpbGRlciByZWNvcmRpbmdSZXF1ZXN0QnVpbGRlciA9CiAgICAgICAgICAgICAgICAgbUNhbWVyYS5jcmVhdGVDYXB0dXJlUmVxdWVzdChDYW1lcmFEZXZpY2UuVEVNUExBVEVfUkVDT1JEKTsKICAgICAgICAgLy8gTWFrZSBzdXJlIGNhbWVyYSBvdXRwdXQgZnJhbWUgcmF0ZSBpcyBzZXQgdG8gY29ycmVjdCB2YWx1ZS4KLSAgICAgICAgUmFuZ2U8SW50ZWdlcj4gZnBzUmFuZ2UgPSBSYW5nZS5jcmVhdGUobVZpZGVvRnJhbWVSYXRlLCBtVmlkZW9GcmFtZVJhdGUpOworICAgICAgICBSYW5nZTxJbnRlZ2VyPiBmcHNSYW5nZSA9ICh2YXJpYWJsZUZwc1JhbmdlID09IG51bGwpID8KKyAgICAgICAgICAgICAgICBSYW5nZS5jcmVhdGUobVZpZGVvRnJhbWVSYXRlLCBtVmlkZW9GcmFtZVJhdGUpIDogdmFyaWFibGVGcHNSYW5nZTsKKwogICAgICAgICByZWNvcmRpbmdSZXF1ZXN0QnVpbGRlci5zZXQoQ2FwdHVyZVJlcXVlc3QuQ09OVFJPTF9BRV9UQVJHRVRfRlBTX1JBTkdFLCBmcHNSYW5nZSk7CiAgICAgICAgIGlmICh1c2VWaWRlb1N0YWIpIHsKICAgICAgICAgICAgIHJlY29yZGluZ1JlcXVlc3RCdWlsZGVyLnNldChDYXB0dXJlUmVxdWVzdC5DT05UUk9MX1ZJREVPX1NUQUJJTElaQVRJT05fTU9ERSwKQEAgLTEyNzcsNyArMTU0MiwxMCBAQAogICAgICAgICB9CiAgICAgICAgIHJlY29yZGluZ1JlcXVlc3RCdWlsZGVyLmFkZFRhcmdldChtUmVjb3JkaW5nU3VyZmFjZSk7CiAgICAgICAgIHJlY29yZGluZ1JlcXVlc3RCdWlsZGVyLmFkZFRhcmdldChtUHJldmlld1N1cmZhY2UpOwotICAgICAgICBtU2Vzc2lvbi5zZXRSZXBlYXRpbmdSZXF1ZXN0KHJlY29yZGluZ1JlcXVlc3RCdWlsZGVyLmJ1aWxkKCksIGxpc3RlbmVyLCBtSGFuZGxlcik7CisgICAgICAgIENhcHR1cmVSZXF1ZXN0IHJlY29yZGluZ1JlcXVlc3QgPSByZWNvcmRpbmdSZXF1ZXN0QnVpbGRlci5idWlsZCgpOworICAgICAgICBtU2Vzc2lvbiA9IGNvbmZpZ3VyZUNhbWVyYVNlc3Npb25XaXRoUGFyYW1ldGVycyhtQ2FtZXJhLCBvdXRwdXRTdXJmYWNlcywgbVNlc3Npb25MaXN0ZW5lciwKKyAgICAgICAgICAgICAgICBtSGFuZGxlciwgcmVjb3JkaW5nUmVxdWVzdCk7CisgICAgICAgIG1TZXNzaW9uLnNldFJlcGVhdGluZ1JlcXVlc3QocmVjb3JkaW5nUmVxdWVzdCwgbGlzdGVuZXIsIG1IYW5kbGVyKTsKIAogICAgICAgICBpZiAodXNlTWVkaWFSZWNvcmRlcikgewogICAgICAgICAgICAgbU1lZGlhUmVjb3JkZXIuc3RhcnQoKTsKQEAgLTEyOTQsNyArMTU2Miw4IEBACiAgICAgICogQHJldHVybiB0cnVlIGlmIHN1Y2Nlc3MsIGZhbHNlIGlmIHNoYXJpbmcgaXMgbm90IHN1cHBvcnRlZC4KICAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gc3RhcnRTaGFyZWRSZWNvcmRpbmcoYm9vbGVhbiB1c2VNZWRpYVJlY29yZGVyLAotICAgICAgICAgICAgQ2FtZXJhQ2FwdHVyZVNlc3Npb24uQ2FwdHVyZUNhbGxiYWNrIGxpc3RlbmVyLCBib29sZWFuIHVzZVZpZGVvU3RhYikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBDYW1lcmFDYXB0dXJlU2Vzc2lvbi5DYXB0dXJlQ2FsbGJhY2sgbGlzdGVuZXIsIGJvb2xlYW4gdXNlVmlkZW9TdGFiLAorICAgICAgICAgICAgUmFuZ2U8SW50ZWdlcj4gdmFyaWFibGVGcHNSYW5nZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghbVN0YXRpY0luZm8uaXNWaWRlb1N0YWJpbGl6YXRpb25TdXBwb3J0ZWQoKSAmJiB1c2VWaWRlb1N0YWIpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlZpZGVvIHN0YWJpbGl6YXRpb24gaXMgbm90IHN1cHBvcnRlZCIpOwogICAgICAgICB9CkBAIC0xMzE5LDcgKzE1ODgsOSBAQAogICAgICAgICBDYXB0dXJlUmVxdWVzdC5CdWlsZGVyIHJlY29yZGluZ1JlcXVlc3RCdWlsZGVyID0KICAgICAgICAgICAgICAgICBtQ2FtZXJhLmNyZWF0ZUNhcHR1cmVSZXF1ZXN0KENhbWVyYURldmljZS5URU1QTEFURV9SRUNPUkQpOwogICAgICAgICAvLyBNYWtlIHN1cmUgY2FtZXJhIG91dHB1dCBmcmFtZSByYXRlIGlzIHNldCB0byBjb3JyZWN0IHZhbHVlLgotICAgICAgICBSYW5nZTxJbnRlZ2VyPiBmcHNSYW5nZSA9IFJhbmdlLmNyZWF0ZShtVmlkZW9GcmFtZVJhdGUsIG1WaWRlb0ZyYW1lUmF0ZSk7CisgICAgICAgIFJhbmdlPEludGVnZXI+IGZwc1JhbmdlID0gKHZhcmlhYmxlRnBzUmFuZ2UgPT0gbnVsbCkgPworICAgICAgICAgICAgICAgIFJhbmdlLmNyZWF0ZShtVmlkZW9GcmFtZVJhdGUsIG1WaWRlb0ZyYW1lUmF0ZSkgOiB2YXJpYWJsZUZwc1JhbmdlOworCiAgICAgICAgIHJlY29yZGluZ1JlcXVlc3RCdWlsZGVyLnNldChDYXB0dXJlUmVxdWVzdC5DT05UUk9MX0FFX1RBUkdFVF9GUFNfUkFOR0UsIGZwc1JhbmdlKTsKICAgICAgICAgaWYgKHVzZVZpZGVvU3RhYikgewogICAgICAgICAgICAgcmVjb3JkaW5nUmVxdWVzdEJ1aWxkZXIuc2V0KENhcHR1cmVSZXF1ZXN0LkNPTlRST0xfVklERU9fU1RBQklMSVpBVElPTl9NT0RFLApAQCAtMTM3OCw5ICsxNjQ5LDMwIEBACiAgICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlUmVjb3JkaW5nKAogICAgICAgICAgICAgU2l6ZSBzeiwgZmxvYXQgZXhwZWN0ZWREdXJhdGlvbk1zLCBmbG9hdCBleHBlY3RlZEZyYW1lRHVyYXRpb25NcywKICAgICAgICAgICAgIGZsb2F0IGZyYW1lRHJvcFRvbGVyYW5jZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHZhbGlkYXRlUmVjb3JkaW5nKHN6LAorICAgICAgICAgICAgICAgIGV4cGVjdGVkRHVyYXRpb25NcywgIC8qZml4ZWQgRlBTIHJlY29yZGluZyovMC5mLAorICAgICAgICAgICAgICAgIGV4cGVjdGVkRnJhbWVEdXJhdGlvbk1zLCAvKmZpeGVkIEZQUyByZWNvcmRpbmcqLzAuZiwKKyAgICAgICAgICAgICAgICBmcmFtZURyb3BUb2xlcmFuY2UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZVJlY29yZGluZygKKyAgICAgICAgICAgIFNpemUgc3osCisgICAgICAgICAgICBmbG9hdCBleHBlY3RlZER1cmF0aW9uTWluTXMsICAgICAgLy8gTWluIGR1cmF0aW9uIChtYXhGcHMpCisgICAgICAgICAgICBmbG9hdCBleHBlY3RlZER1cmF0aW9uTWF4TXMsICAgICAgLy8gTWF4IGR1cmF0aW9uIChtaW5GcHMpLiAwLmYgZm9yIGZpeGVkIGZwcyByZWNvcmRpbmcKKyAgICAgICAgICAgIGZsb2F0IGV4cGVjdGVkRnJhbWVEdXJhdGlvbk1pbk1zLCAvLyBtYXhGcHMKKyAgICAgICAgICAgIGZsb2F0IGV4cGVjdGVkRnJhbWVEdXJhdGlvbk1heE1zLCAvLyBtaW5GcHMuIDAuZiBmb3IgZml4ZWQgZnBzIHJlY29yZGluZworICAgICAgICAgICAgZmxvYXQgZnJhbWVEcm9wVG9sZXJhbmNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgRmlsZSBvdXRGaWxlID0gbmV3IEZpbGUobU91dE1lZGlhRmlsZU5hbWUpOwogICAgICAgICBhc3NlcnRUcnVlKCJObyB2aWRlbyBpcyByZWNvcmRlZCIsIG91dEZpbGUuZXhpc3RzKCkpOwotICAgICAgICBmbG9hdCBtYXhGcmFtZUR1cmF0aW9uID0gZXhwZWN0ZWRGcmFtZUR1cmF0aW9uTXMgKiAoMS4wZiArIEZSQU1FRFVSQVRJT05fTUFSR0lOKTsKKyAgICAgICAgZmxvYXQgbWF4RnJhbWVEdXJhdGlvbiA9IGV4cGVjdGVkRnJhbWVEdXJhdGlvbk1pbk1zICogKDEuMGYgKyBGUkFNRURVUkFUSU9OX01BUkdJTik7CisgICAgICAgIGlmIChleHBlY3RlZEZyYW1lRHVyYXRpb25NYXhNcyA+IDAuZikgeworICAgICAgICAgICAgbWF4RnJhbWVEdXJhdGlvbiA9IGV4cGVjdGVkRnJhbWVEdXJhdGlvbk1heE1zICogKDEuMGYgKyBGUkFNRURVUkFUSU9OX01BUkdJTik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXhwZWN0ZWREdXJhdGlvbk1heE1zID09IDAuZikgeworICAgICAgICAgICAgZXhwZWN0ZWREdXJhdGlvbk1heE1zID0gZXhwZWN0ZWREdXJhdGlvbk1pbk1zOworICAgICAgICB9CisKICAgICAgICAgTWVkaWFFeHRyYWN0b3IgZXh0cmFjdG9yID0gbmV3IE1lZGlhRXh0cmFjdG9yKCk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBleHRyYWN0b3Iuc2V0RGF0YVNvdXJjZShtT3V0TWVkaWFGaWxlTmFtZSk7CkBAIC0xNDEyLDggKzE3MDQsOCBAQAogICAgICAgICAgICAgICAgICAgICAiIGdvdCAiICsgdmlkZW9Tei50b1N0cmluZygpLCB2aWRlb1N6LmVxdWFscyhzeikpOwogICAgICAgICAgICAgZmxvYXQgZHVyYXRpb24gPSAoZmxvYXQpIChkdXJhdGlvblVzIC8gMTAwMCk7CiAgICAgICAgICAgICBpZiAoVkVSQk9TRSkgewotICAgICAgICAgICAgICAgIExvZy52KFRBRywgU3RyaW5nLmZvcm1hdCgiVmlkZW8gZHVyYXRpb246IHJlY29yZGVkICVmbXMsIGV4cGVjdGVkICVmbXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiwgZXhwZWN0ZWREdXJhdGlvbk1zKSk7CisgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCBTdHJpbmcuZm9ybWF0KCJWaWRlbyBkdXJhdGlvbjogcmVjb3JkZWQgJWZtcywgZXhwZWN0ZWQgWyVmLCVmXW1zIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24sIGV4cGVjdGVkRHVyYXRpb25NaW5NcywgZXhwZWN0ZWREdXJhdGlvbk1heE1zKSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIERvIHJlc3Qgb2YgdmFsaWRhdGlvbiBvbmx5IGZvciBiZXR0ZXItdGhhbi1MRUdBQ1kgZGV2aWNlcwpAQCAtMTQyMSwxNSArMTcxMywxNSBAQAogCiAgICAgICAgICAgICAvLyBUT0RPOiBEb24ndCBza2lwIHRoaXMgb25lIGZvciB2aWRlbyBzbmFwc2hvdCBvbiBMRUdBQ1kKICAgICAgICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgIkNhbWVyYSAlczogVmlkZW8gZHVyYXRpb24gZG9lc24ndCBtYXRjaDogcmVjb3JkZWQgJWZtcywgZXhwZWN0ZWQgJWZtcy4iLAotICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhLmdldElkKCksIGR1cmF0aW9uLCBleHBlY3RlZER1cmF0aW9uTXMpLAotICAgICAgICAgICAgICAgICAgICBNYXRoLmFicyhkdXJhdGlvbiAtIGV4cGVjdGVkRHVyYXRpb25NcykgPAotICAgICAgICAgICAgICAgICAgICBEVVJBVElPTl9NQVJHSU4gKiBleHBlY3RlZER1cmF0aW9uTXMpOworICAgICAgICAgICAgICAgICAgICAiQ2FtZXJhICVzOiBWaWRlbyBkdXJhdGlvbiBkb2Vzbid0IG1hdGNoOiByZWNvcmRlZCAlZm1zLCBleHBlY3RlZCBbJWYsJWZdbXMuIiwKKyAgICAgICAgICAgICAgICAgICAgbUNhbWVyYS5nZXRJZCgpLCBkdXJhdGlvbiwgZXhwZWN0ZWREdXJhdGlvbk1pbk1zLCBleHBlY3RlZER1cmF0aW9uTWF4TXMpLAorICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiA+IGV4cGVjdGVkRHVyYXRpb25NaW5NcyAqICgxLmYgLSBEVVJBVElPTl9NQVJHSU4pICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24gPCBleHBlY3RlZER1cmF0aW9uTWF4TXMgKiAoMS5mICsgRFVSQVRJT05fTUFSR0lOKSk7CiAKICAgICAgICAgICAgIC8vIENoZWNrIGZvciBmcmFtZWRyb3AKICAgICAgICAgICAgIGxvbmcgbGFzdFNhbXBsZVVzID0gMDsKICAgICAgICAgICAgIGludCBmcmFtZURyb3BDb3VudCA9IDA7Ci0gICAgICAgICAgICBpbnQgZXhwZWN0ZWRGcmFtZUNvdW50ID0gKGludCkgKGV4cGVjdGVkRHVyYXRpb25NcyAvIGV4cGVjdGVkRnJhbWVEdXJhdGlvbk1zKTsKKyAgICAgICAgICAgIGludCBleHBlY3RlZEZyYW1lQ291bnQgPSAoaW50KSAoZXhwZWN0ZWREdXJhdGlvbk1pbk1zIC8gZXhwZWN0ZWRGcmFtZUR1cmF0aW9uTWluTXMpOwogICAgICAgICAgICAgQXJyYXlMaXN0PExvbmc+IHRpbWVzdGFtcHMgPSBuZXcgQXJyYXlMaXN0PExvbmc+KGV4cGVjdGVkRnJhbWVDb3VudCk7CiAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgICAgICAgIHRpbWVzdGFtcHMuYWRkKGV4dHJhY3Rvci5nZXRTYW1wbGVUaW1lKCkpOwpAQCAtMTQ0NSwxNyArMTczNywyMSBAQAogICAgICAgICAgICAgICAgIGlmIChmcmFtZUR1cmF0aW9uTXMgPiBtYXhGcmFtZUR1cmF0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgU3RyaW5nLmZvcm1hdCgKICAgICAgICAgICAgICAgICAgICAgICAgICJGcmFtZSBkcm9wIGF0ICVkOiBleHBlY3RhdGlvbiAlZiwgb2JzZXJ2ZWQgJWYiLAotICAgICAgICAgICAgICAgICAgICAgICAgaSwgZXhwZWN0ZWRGcmFtZUR1cmF0aW9uTXMsIGZyYW1lRHVyYXRpb25NcykpOworICAgICAgICAgICAgICAgICAgICAgICAgaSwgZXhwZWN0ZWRGcmFtZUR1cmF0aW9uTWluTXMsIGZyYW1lRHVyYXRpb25NcykpOwogICAgICAgICAgICAgICAgICAgICBmcmFtZURyb3BDb3VudCsrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBwcmV2U2FtcGxlVXMgPSBjdXJyZW50U2FtcGxlVXM7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBmbG9hdCBmcmFtZURyb3BSYXRlID0gMTAwLmYgKiBmcmFtZURyb3BDb3VudCAvIGV4cGVjdGVkRnJhbWVDb3VudDsKKyAgICAgICAgICAgIGZsb2F0IGZyYW1lRHJvcFJhdGUgPSAxMDAuZiAqIGZyYW1lRHJvcENvdW50IC8gdGltZXN0YW1wcy5zaXplKCk7CiAgICAgICAgICAgICBMb2cuaShUQUcsIFN0cmluZy5mb3JtYXQoIkZyYW1lIGRyb3AgcmF0ZSAlZC8lZCAoJWYlJSkiLAotICAgICAgICAgICAgICAgIGZyYW1lRHJvcENvdW50LCBleHBlY3RlZEZyYW1lQ291bnQsIGZyYW1lRHJvcFJhdGUpKTsKKyAgICAgICAgICAgICAgICBmcmFtZURyb3BDb3VudCwgdGltZXN0YW1wcy5zaXplKCksIGZyYW1lRHJvcFJhdGUpKTsKICAgICAgICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgIkNhbWVyYSAlczogVmlkZW8gZnJhbWUgZHJvcCByYXRlIHRvbyBoaWdoOiAlZiUlLCB0b2xlcmFuY2UgJWYlJS4iLAotICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhLmdldElkKCksIGZyYW1lRHJvcFJhdGUsIGZyYW1lRHJvcFRvbGVyYW5jZSksCisgICAgICAgICAgICAgICAgICAgICJDYW1lcmEgJXM6IFZpZGVvIGZyYW1lIGRyb3AgcmF0ZSB0b28gaGlnaDogJWYlJSwgdG9sZXJhbmNlICVmJSUuICIgKworICAgICAgICAgICAgICAgICAgICAiVmlkZW8gc2l6ZTogJXMsIGV4cGVjdGVkRHVyYXRpb24gWyVmLCVmXSwgZXhwZWN0ZWRGcmFtZUR1cmF0aW9uICVmLCAiICsKKyAgICAgICAgICAgICAgICAgICAgImZyYW1lRHJvcENudCAlZCwgZnJhbWVDb3VudCAlZCIsCisgICAgICAgICAgICAgICAgICAgIG1DYW1lcmEuZ2V0SWQoKSwgZnJhbWVEcm9wUmF0ZSwgZnJhbWVEcm9wVG9sZXJhbmNlLAorICAgICAgICAgICAgICAgICAgICBzei50b1N0cmluZygpLCBleHBlY3RlZER1cmF0aW9uTWluTXMsIGV4cGVjdGVkRHVyYXRpb25NYXhNcywKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRGcmFtZUR1cmF0aW9uTWluTXMsIGZyYW1lRHJvcENvdW50LCB0aW1lc3RhbXBzLnNpemUoKSksCiAgICAgICAgICAgICAgICAgICAgIGZyYW1lRHJvcFJhdGUgPCBmcmFtZURyb3BUb2xlcmFuY2UpOwogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgZXh0cmFjdG9yLnJlbGVhc2UoKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NhbWVyYS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL2N0cy9SZXByb2Nlc3NDYXB0dXJlVGVzdC5qYXZhIGIvdGVzdHMvY2FtZXJhL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvY3RzL1JlcHJvY2Vzc0NhcHR1cmVUZXN0LmphdmEKaW5kZXggZGQ0OWM4ZC4uNTdiNDcwZSAxMDA2NDQKLS0tIGEvdGVzdHMvY2FtZXJhL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvY3RzL1JlcHJvY2Vzc0NhcHR1cmVUZXN0LmphdmEKKysrIGIvdGVzdHMvY2FtZXJhL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvY3RzL1JlcHJvY2Vzc0NhcHR1cmVUZXN0LmphdmEKQEAgLTMyLDYgKzMyLDcgQEAKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuY3RzLmhlbHBlcnMuU3RhdGljTWV0YWRhdGEuQ2hlY2tMZXZlbDsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuY3RzLnRlc3RjYXNlcy5DYW1lcmEyU3VyZmFjZVZpZXdUZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIucGFyYW1zLklucHV0Q29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU2l6ZTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZTsKQEAgLTQ2LDYgKzQ3LDcgQEAKIC8qKgogICogPHA+VGVzdHMgZm9yIFJlcHJvY2VzcyBBUEkuPC9wPgogICovCitAQXBwTW9kZUZ1bGwKIHB1YmxpYyBjbGFzcyBSZXByb2Nlc3NDYXB0dXJlVGVzdCBleHRlbmRzIENhbWVyYTJTdXJmYWNlVmlld1Rlc3RDYXNlICB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJSZXByb2Nlc3NDYXB0dXJlVGVzdCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBWRVJCT1NFID0gTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSk7CkBAIC01MDksNiArNTExLDkgQEAKICAgICBwcml2YXRlIHZvaWQgdGVzdFJlcHJvY2Vzc2luZ0FsbENvbWJpbmF0aW9ucyhTdHJpbmcgY2FtZXJhSWQsIFNpemUgcHJldmlld1NpemUsCiAgICAgICAgICAgICBDYXB0dXJlVGVzdENhc2UgY2FwdHVyZVRlc3RDYXNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAorICAgICAgICBTaXplIFFDSUYgPSBuZXcgU2l6ZSgxNzYsIDE0NCk7CisgICAgICAgIFNpemUgVkdBID0gbmV3IFNpemUoNjQwLCA0ODApOworICAgICAgICBTaXplIEZVTExfSEQgPSBuZXcgU2l6ZSgxOTIwLCAxMDgwKTsKICAgICAgICAgaW50W10gc3VwcG9ydGVkSW5wdXRGb3JtYXRzID0KICAgICAgICAgICAgICAgICBtU3RhdGljSW5mby5nZXRBdmFpbGFibGVGb3JtYXRzKFN0YXRpY01ldGFkYXRhLlN0cmVhbURpcmVjdGlvbi5JbnB1dCk7CiAgICAgICAgIGZvciAoaW50IGlucHV0Rm9ybWF0IDogc3VwcG9ydGVkSW5wdXRGb3JtYXRzKSB7CkBAIC01MjYsNiArNTMxLDI0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGljTWV0YWRhdGEuU3RyZWFtRGlyZWN0aW9uLk91dHB1dCk7CiAKICAgICAgICAgICAgICAgICAgICAgZm9yIChTaXplIHJlcHJvY2Vzc091dHB1dFNpemUgOiBzdXBwb3J0ZWRSZXByb2Nlc3NPdXRwdXRTaXplcykgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGFuZGxlIFFDSUYgZXhjZXB0aW9ucworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcHJvY2Vzc091dHB1dFNpemUuZXF1YWxzKFFDSUYpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW5wdXRTaXplLmdldFdpZHRoKCkgPiBGVUxMX0hELmdldFdpZHRoKCkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXRTaXplLmdldEhlaWdodCgpID4gRlVMTF9IRC5nZXRIZWlnaHQoKSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRTaXplLmVxdWFscyhRQ0lGKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHJlcHJvY2Vzc091dHB1dFNpemUuZ2V0V2lkdGgoKSA+IEZVTExfSEQuZ2V0V2lkdGgoKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXByb2Nlc3NPdXRwdXRTaXplLmdldEhlaWdodCgpID4gRlVMTF9IRC5nZXRIZWlnaHQoKSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZXZpZXdTaXplICE9IG51bGwpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocHJldmlld1NpemUuZ2V0V2lkdGgoKSA+IEZVTExfSEQuZ2V0V2lkdGgoKSkgfHwgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpZXdTaXplLmdldEhlaWdodCgpID4gRlVMTF9IRC5nZXRIZWlnaHQoKSkpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dFNpemUuZXF1YWxzKFFDSUYpIHx8IHJlcHJvY2Vzc091dHB1dFNpemUuZXF1YWxzKFFDSUYpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpZXdTaXplID0gVkdBOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNhcHR1cmVUZXN0Q2FzZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU0lOR0xFX1NIT1Q6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RSZXByb2Nlc3MoY2FtZXJhSWQsIGlucHV0U2l6ZSwgaW5wdXRGb3JtYXQsCmRpZmYgLS1naXQgYS90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9jdHMvUm9idXN0bmVzc1Rlc3QuamF2YSBiL3Rlc3RzL2NhbWVyYS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL2N0cy9Sb2J1c3RuZXNzVGVzdC5qYXZhCmluZGV4IDVlZWQzZTguLjg0YTIyZDcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2NhbWVyYS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL2N0cy9Sb2J1c3RuZXNzVGVzdC5qYXZhCisrKyBiL3Rlc3RzL2NhbWVyYS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL2N0cy9Sb2J1c3RuZXNzVGVzdC5qYXZhCkBAIC0zMCwxNCArMzAsMTcgQEAKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FwdHVyZVJlc3VsdDsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuVG90YWxDYXB0dXJlUmVzdWx0OwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYXB0dXJlRmFpbHVyZTsKLWltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIucGFyYW1zLklucHV0Q29uZmlndXJhdGlvbjsKLWltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIucGFyYW1zLlN0cmVhbUNvbmZpZ3VyYXRpb25NYXA7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLmN0cy5oZWxwZXJzLlN0YXRpY01ldGFkYXRhOwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5jdHMudGVzdGNhc2VzLkNhbWVyYTJBbmRyb2lkVGVzdENhc2U7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLnBhcmFtcy5JbnB1dENvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLnBhcmFtcy5PaXNTYW1wbGU7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLnBhcmFtcy5PdXRwdXRDb25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5wYXJhbXMuU3RyZWFtQ29uZmlndXJhdGlvbk1hcDsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkNhbWNvcmRlclByb2ZpbGU7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5JbWFnZTsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkltYWdlUmVhZGVyOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuSW1hZ2VXcml0ZXI7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNpemU7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkRpc3BsYXk7CkBAIC00OCw3ICs1MSwxMCBAQAogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKIAogaW1wb3J0IHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0LmFzc2VydFRydWU7CiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8uKjsKQEAgLTU2LDYgKzYyLDcgQEAKIC8qKgogICogVGVzdHMgZXhlcmNpc2luZyBlZGdlIGNhc2VzIGluIGNhbWVyYSBzZXR1cCwgY29uZmlndXJhdGlvbiwgYW5kIHVzYWdlLgogICovCitAQXBwTW9kZUZ1bGwKIHB1YmxpYyBjbGFzcyBSb2J1c3RuZXNzVGVzdCBleHRlbmRzIENhbWVyYTJBbmRyb2lkVGVzdENhc2UgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiUm9idXN0bmVzc1Rlc3QiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gVkVSQk9TRSA9IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpOwpAQCAtMzA1LDYgKzMxMiwxMCBAQAogICAgICAgICAgICAgICAgICAgICBmb3IgKGludFtdIGNvbmZpZyA6IFJBV19DT01CSU5BVElPTlMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RPdXRwdXRDb21iaW5hdGlvbihpZCwgY29uZmlnLCBtYXhTaXplcyk7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1TdGF0aWNJbmZvLmlzTG9naWNhbE11bHRpQ2FtZXJhKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnRbXSBjb25maWcgOiBSQVdfQ09NQklOQVRJT05TKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0TXVsdGlDYW1lcmFPdXRwdXRDb21iaW5hdGlvbihpZCwgY29uZmlnLCBtYXhTaXplcyk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpZiAobVN0YXRpY0luZm8uaXNIYXJkd2FyZUxldmVsQXRMZWFzdCgKQEAgLTkwMiw4ICs5MTMsMTYgQEAKICAgICAgICAgICAgIExvZy5pKFRBRywgU3RyaW5nLmZvcm1hdCgKICAgICAgICAgICAgICAgICAgICAgIlRlc3RpbmcgQ2FtZXJhICVzIGZvciBhYmFuZG9uaW5nIHN1cmZhY2Ugb2YgYSByZXBlYXRpbmcgcmVxdWVzdCIsIGlkKSk7CiAKKyAgICAgICAgICAgIFN0YXRpY01ldGFkYXRhIHN0YXRpY0luZm8gPSBtQWxsU3RhdGljSW5mby5nZXQoaWQpOworICAgICAgICAgICAgaWYgKCFzdGF0aWNJbmZvLmlzQ29sb3JPdXRwdXRTdXBwb3J0ZWQoKSkgeworICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkNhbWVyYSAiICsgaWQgKyAiIGRvZXMgbm90IHN1cHBvcnQgY29sb3Igb3V0cHV0LCBza2lwcGluZyIpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBvcGVuRGV2aWNlKGlkKTsKKwogICAgICAgICAgICAgdHJ5IHsKKwogICAgICAgICAgICAgICAgIFN1cmZhY2VUZXh0dXJlIHByZXZpZXcgPSBuZXcgU3VyZmFjZVRleHR1cmUoLypyYW5kb20gaW50Ki8gMSk7CiAgICAgICAgICAgICAgICAgU3VyZmFjZSBwcmV2aWV3U3VyZmFjZSA9IG5ldyBTdXJmYWNlKHByZXZpZXcpOwogCkBAIC05NTgsNiArOTc3LDE3OSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgdGVzdENvbmZpZ3VyZUFiYW5kb25lZFN1cmZhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChTdHJpbmcgaWQgOiBtQ2FtZXJhSWRzKSB7CisgICAgICAgICAgICBMb2cuaShUQUcsIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICJUZXN0aW5nIENhbWVyYSAlcyBmb3IgY29uZmlndXJpbmcgYWJhbmRvbmVkIHN1cmZhY2UiLCBpZCkpOworCisgICAgICAgICAgICBvcGVuRGV2aWNlKGlkKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgU3VyZmFjZVRleHR1cmUgcHJldmlldyA9IG5ldyBTdXJmYWNlVGV4dHVyZSgvKnJhbmRvbSBpbnQqLyAxKTsKKyAgICAgICAgICAgICAgICBTdXJmYWNlIHByZXZpZXdTdXJmYWNlID0gbmV3IFN1cmZhY2UocHJldmlldyk7CisKKyAgICAgICAgICAgICAgICAvLyBBYmFuZG9uIHByZXZpZXcgU3VyZmFjZVRleHR1cmUuCisgICAgICAgICAgICAgICAgcHJldmlldy5yZWxlYXNlKCk7CisKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBDYXB0dXJlUmVxdWVzdC5CdWlsZGVyIHByZXZpZXdSZXF1ZXN0ID0gcHJlcGFyZVByZXZpZXdUZXN0U2Vzc2lvbihwcmV2aWV3KTsKKyAgICAgICAgICAgICAgICAgICAgZmFpbCgiQ29uZmlndXJpbmcgYWJhbmRvbmVkIHN1cmZhY2VzIG11c3QgZmFpbCEiKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJub3JtYWwgc2Vzc2lvbiBjaGVjayBwYXNzZWQiKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBUcnkgY29uc3RyYWluZWQgaGlnaCBzcGVlZCBzZXNzaW9uL3JlcXVlc3RzCisgICAgICAgICAgICAgICAgaWYgKCFtU3RhdGljSW5mby5pc0NvbnN0cmFpbmVkSGlnaFNwZWVkVmlkZW9TdXBwb3J0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBMaXN0PFN1cmZhY2U+IHN1cmZhY2VzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICAgICAgc3VyZmFjZXMuYWRkKHByZXZpZXdTdXJmYWNlKTsKKyAgICAgICAgICAgICAgICBDYW1lcmFDYXB0dXJlU2Vzc2lvbi5TdGF0ZUNhbGxiYWNrIHNlc3Npb25MaXN0ZW5lciA9CisgICAgICAgICAgICAgICAgICAgICAgICBtb2NrKENhbWVyYUNhcHR1cmVTZXNzaW9uLlN0YXRlQ2FsbGJhY2suY2xhc3MpOworCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbUNhbWVyYS5jcmVhdGVDb25zdHJhaW5lZEhpZ2hTcGVlZENhcHR1cmVTZXNzaW9uKHN1cmZhY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25MaXN0ZW5lciwgbUhhbmRsZXIpOworICAgICAgICAgICAgICAgICAgICBmYWlsKCJDb25maWd1cmluZyBhYmFuZG9uZWQgc3VyZmFjZXMgaW4gaGlnaCBzcGVlZCBzZXNzaW9uIG11c3QgZmFpbCEiKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJoaWdoIHNwZWVkIHNlc3Npb24gY2hlY2sgMSBwYXNzZWQiKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBBbHNvIHRyeSBhYmFuZG9uZSB0aGUgU3VyZmFjZSBkaXJlY3RseQorICAgICAgICAgICAgICAgIHByZXZpZXdTdXJmYWNlLnJlbGVhc2UoKTsKKworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG1DYW1lcmEuY3JlYXRlQ29uc3RyYWluZWRIaWdoU3BlZWRDYXB0dXJlU2Vzc2lvbihzdXJmYWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uTGlzdGVuZXIsIG1IYW5kbGVyKTsKKyAgICAgICAgICAgICAgICAgICAgZmFpbCgiQ29uZmlndXJpbmcgYWJhbmRvbmVkIHN1cmZhY2VzIGluIGhpZ2ggc3BlZWQgc2Vzc2lvbiBtdXN0IGZhaWwhIik7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiaGlnaCBzcGVlZCBzZXNzaW9uIGNoZWNrIDIgcGFzc2VkIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBjbG9zZURldmljZShpZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWZTY2VuZUNoYW5nZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBpbnQgTlVNX0ZSQU1FU19WRVJJRklFRCA9IDM7CisKKyAgICAgICAgZm9yIChTdHJpbmcgaWQgOiBtQ2FtZXJhSWRzKSB7CisgICAgICAgICAgICBMb2cuaShUQUcsIFN0cmluZy5mb3JtYXQoIlRlc3RpbmcgQ2FtZXJhICVzIGZvciBBRiBzY2VuZSBjaGFuZ2UiLCBpZCkpOworCisgICAgICAgICAgICBTdGF0aWNNZXRhZGF0YSBzdGF0aWNJbmZvID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IFN0YXRpY01ldGFkYXRhKG1DYW1lcmFNYW5hZ2VyLmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhpZCkpOworICAgICAgICAgICAgaWYgKCFzdGF0aWNJbmZvLmlzQWZTY2VuZUNoYW5nZVN1cHBvcnRlZCgpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG9wZW5EZXZpY2UoaWQpOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFN1cmZhY2VUZXh0dXJlIHByZXZpZXcgPSBuZXcgU3VyZmFjZVRleHR1cmUoLypyYW5kb20gaW50Ki8gMSk7CisgICAgICAgICAgICAgICAgU3VyZmFjZSBwcmV2aWV3U3VyZmFjZSA9IG5ldyBTdXJmYWNlKHByZXZpZXcpOworCisgICAgICAgICAgICAgICAgQ2FwdHVyZVJlcXVlc3QuQnVpbGRlciBwcmV2aWV3UmVxdWVzdCA9IHByZXBhcmVQcmV2aWV3VGVzdFNlc3Npb24ocHJldmlldyk7CisgICAgICAgICAgICAgICAgU2ltcGxlQ2FwdHVyZUNhbGxiYWNrIHByZXZpZXdMaXN0ZW5lciA9IG5ldyBDYW1lcmFUZXN0VXRpbHMuU2ltcGxlQ2FwdHVyZUNhbGxiYWNrKCk7CisKKyAgICAgICAgICAgICAgICBpbnRbXSBhdmFpbGFibGVBZk1vZGVzID0gbVN0YXRpY0luZm8uZ2V0QWZBdmFpbGFibGVNb2Rlc0NoZWNrZWQoKTsKKworICAgICAgICAgICAgICAgIC8vIFRlc3QgQUYgc2NlbmUgY2hhbmdlIGluIGVhY2ggQUYgbW9kZS4KKyAgICAgICAgICAgICAgICBmb3IgKGludCBhZk1vZGUgOiBhdmFpbGFibGVBZk1vZGVzKSB7CisgICAgICAgICAgICAgICAgICAgIHByZXZpZXdSZXF1ZXN0LnNldChDYXB0dXJlUmVxdWVzdC5DT05UUk9MX0FGX01PREUsIGFmTW9kZSk7CisKKyAgICAgICAgICAgICAgICAgICAgaW50IHNlcXVlbmNlSWQgPSBtQ2FtZXJhU2Vzc2lvbi5zZXRSZXBlYXRpbmdSZXF1ZXN0KHByZXZpZXdSZXF1ZXN0LmJ1aWxkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlld0xpc3RlbmVyLCBtSGFuZGxlcik7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gVmVyaWZ5IHRoYXQgQUYgc2NlbmUgY2hhbmdlIGlzIE5PVF9ERVRFQ1RFRCBvciBERVRFQ1RFRC4KKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fRlJBTUVTX1ZFUklGSUVEOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRvdGFsQ2FwdHVyZVJlc3VsdCByZXN1bHQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpZXdMaXN0ZW5lci5nZXRUb3RhbENhcHR1cmVSZXN1bHQoQ0FQVFVSRV9USU1FT1VUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db2xsZWN0b3IuZXhwZWN0S2V5VmFsdWVJc0luKHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FwdHVyZVJlc3VsdC5DT05UUk9MX0FGX1NDRU5FX0NIQU5HRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FwdHVyZVJlc3VsdC5DT05UUk9MX0FGX1NDRU5FX0NIQU5HRV9ERVRFQ1RFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FwdHVyZVJlc3VsdC5DT05UUk9MX0FGX1NDRU5FX0NIQU5HRV9OT1RfREVURUNURUQpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbUNhbWVyYVNlc3Npb24uc3RvcFJlcGVhdGluZygpOworICAgICAgICAgICAgICAgICAgICBwcmV2aWV3TGlzdGVuZXIuZ2V0Q2FwdHVyZVNlcXVlbmNlTGFzdEZyYW1lTnVtYmVyKHNlcXVlbmNlSWQsIENBUFRVUkVfVElNRU9VVCk7CisgICAgICAgICAgICAgICAgICAgIHByZXZpZXdMaXN0ZW5lci5kcmFpbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgY2xvc2VEZXZpY2UoaWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE9pc0RhdGFNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIGludCBOVU1fRlJBTUVTX1ZFUklGSUVEID0gMzsKKworICAgICAgICBmb3IgKFN0cmluZyBpZCA6IG1DYW1lcmFJZHMpIHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgU3RyaW5nLmZvcm1hdCgiVGVzdGluZyBDYW1lcmEgJXMgZm9yIE9JUyBtb2RlIiwgaWQpKTsKKworICAgICAgICAgICAgU3RhdGljTWV0YWRhdGEgc3RhdGljSW5mbyA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBTdGF0aWNNZXRhZGF0YShtQ2FtZXJhTWFuYWdlci5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoaWQpKTsKKyAgICAgICAgICAgIGlmICghc3RhdGljSW5mby5pc09pc0RhdGFNb2RlU3VwcG9ydGVkKCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3BlbkRldmljZShpZCk7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgU3VyZmFjZVRleHR1cmUgcHJldmlldyA9IG5ldyBTdXJmYWNlVGV4dHVyZSgvKnJhbmRvbSBpbnQqLyAxKTsKKyAgICAgICAgICAgICAgICBTdXJmYWNlIHByZXZpZXdTdXJmYWNlID0gbmV3IFN1cmZhY2UocHJldmlldyk7CisKKyAgICAgICAgICAgICAgICBDYXB0dXJlUmVxdWVzdC5CdWlsZGVyIHByZXZpZXdSZXF1ZXN0ID0gcHJlcGFyZVByZXZpZXdUZXN0U2Vzc2lvbihwcmV2aWV3KTsKKyAgICAgICAgICAgICAgICBTaW1wbGVDYXB0dXJlQ2FsbGJhY2sgcHJldmlld0xpc3RlbmVyID0gbmV3IENhbWVyYVRlc3RVdGlscy5TaW1wbGVDYXB0dXJlQ2FsbGJhY2soKTsKKworICAgICAgICAgICAgICAgIGludFtdIGF2YWlsYWJsZU9pc0RhdGFNb2RlcyA9IHN0YXRpY0luZm8uZ2V0Q2hhcmFjdGVyaXN0aWNzKCkuZ2V0KAorICAgICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLlNUQVRJU1RJQ1NfSU5GT19BVkFJTEFCTEVfT0lTX0RBVEFfTU9ERVMpOworCisgICAgICAgICAgICAgICAgLy8gVGVzdCBlYWNoIE9JUyBkYXRhIG1vZGUKKyAgICAgICAgICAgICAgICBmb3IgKGludCBvaXNNb2RlIDogYXZhaWxhYmxlT2lzRGF0YU1vZGVzKSB7CisgICAgICAgICAgICAgICAgICAgIHByZXZpZXdSZXF1ZXN0LnNldChDYXB0dXJlUmVxdWVzdC5TVEFUSVNUSUNTX09JU19EQVRBX01PREUsIG9pc01vZGUpOworCisgICAgICAgICAgICAgICAgICAgIGludCBzZXF1ZW5jZUlkID0gbUNhbWVyYVNlc3Npb24uc2V0UmVwZWF0aW5nUmVxdWVzdChwcmV2aWV3UmVxdWVzdC5idWlsZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpZXdMaXN0ZW5lciwgbUhhbmRsZXIpOworCisgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIE9JUyBkYXRhIGluIGVhY2ggbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fRlJBTUVTX1ZFUklGSUVEOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRvdGFsQ2FwdHVyZVJlc3VsdCByZXN1bHQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpZXdMaXN0ZW5lci5nZXRUb3RhbENhcHR1cmVSZXN1bHQoQ0FQVFVSRV9USU1FT1VUKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgT2lzU2FtcGxlW10gb2lzU2FtcGxlcyA9IHJlc3VsdC5nZXQoQ2FwdHVyZVJlc3VsdC5TVEFUSVNUSUNTX09JU19TQU1QTEVTKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9pc01vZGUgPT0gQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLlNUQVRJU1RJQ1NfT0lTX0RBVEFfTU9ERV9PRkYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29sbGVjdG9yLmV4cGVjdEtleVZhbHVlRXF1YWxzKHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcHR1cmVSZXN1bHQuU1RBVElTVElDU19PSVNfREFUQV9NT0RFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FwdHVyZVJlc3VsdC5TVEFUSVNUSUNTX09JU19EQVRBX01PREVfT0ZGKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29sbGVjdG9yLmV4cGVjdFRydWUoIk9JUyBzYW1wbGVzIHJlcG9ydGVkIGluIE9JU19EQVRBX01PREVfT0ZGIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9pc1NhbXBsZXMgPT0gbnVsbCB8fCBvaXNTYW1wbGVzLmxlbmd0aCA9PSAwKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvaXNNb2RlID09IENhbWVyYUNoYXJhY3RlcmlzdGljcy5TVEFUSVNUSUNTX09JU19EQVRBX01PREVfT04pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29sbGVjdG9yLmV4cGVjdEtleVZhbHVlRXF1YWxzKHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcHR1cmVSZXN1bHQuU1RBVElTVElDU19PSVNfREFUQV9NT0RFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FwdHVyZVJlc3VsdC5TVEFUSVNUSUNTX09JU19EQVRBX01PREVfT04pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2xsZWN0b3IuZXhwZWN0VHJ1ZSgiT0lTIHNhbXBsZXMgbm90IHJlcG9ydGVkIGluIE9JU19EQVRBX01PREVfT04iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2lzU2FtcGxlcyAhPSBudWxsICYmIG9pc1NhbXBsZXMubGVuZ3RoICE9IDApOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29sbGVjdG9yLmFkZE1lc3NhZ2UoU3RyaW5nLmZvcm1hdCgiSW52YWxpZCBPSVMgbW9kZTogJWQiLCBvaXNNb2RlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhU2Vzc2lvbi5zdG9wUmVwZWF0aW5nKCk7CisgICAgICAgICAgICAgICAgICAgIHByZXZpZXdMaXN0ZW5lci5nZXRDYXB0dXJlU2VxdWVuY2VMYXN0RnJhbWVOdW1iZXIoc2VxdWVuY2VJZCwgQ0FQVFVSRV9USU1FT1VUKTsKKyAgICAgICAgICAgICAgICAgICAgcHJldmlld0xpc3RlbmVyLmRyYWluKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBjbG9zZURldmljZShpZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICBwcml2YXRlIENhcHR1cmVSZXF1ZXN0LkJ1aWxkZXIgcHJlcGFyZVByZXZpZXdUZXN0U2Vzc2lvbihTdXJmYWNlVGV4dHVyZSBwcmV2aWV3KQogICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFN1cmZhY2UgcHJldmlld1N1cmZhY2UgPSBuZXcgU3VyZmFjZShwcmV2aWV3KTsKQEAgLTExNzIsNyArMTM2NCwxMSBAQAogICAgICAgICBzdGF0aWMgZmluYWwgaW50IFJFQ09SRCAgPSAxOwogICAgICAgICBzdGF0aWMgZmluYWwgaW50IE1BWElNVU0gPSAyOwogICAgICAgICBzdGF0aWMgZmluYWwgaW50IFZHQSA9IDM7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgUkVTT0xVVElPTl9DT1VOVCA9IDQ7CisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgVkdBX0ZVTExfRk9WID0gNDsKKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBNQVhfMzBGUFMgPSA1OworICAgICAgICBzdGF0aWMgZmluYWwgaW50IFJFU09MVVRJT05fQ09VTlQgPSA2OworCisgICAgICAgIHN0YXRpYyBmaW5hbCBsb25nIEZSQU1FX0RVUkFUSU9OXzMwRlBTX05TRUMgPSAobG9uZykgMWU5IC8gMzA7CiAKICAgICAgICAgcHVibGljIE1heFN0cmVhbVNpemVzKFN0YXRpY01ldGFkYXRhIHNtLCBTdHJpbmcgY2FtZXJhSWQsIENvbnRleHQgY29udGV4dCkgewogICAgICAgICAgICAgU2l6ZVtdIHByaXZTaXplcyA9IHNtLmdldEF2YWlsYWJsZVNpemVzRm9yRm9ybWF0Q2hlY2tlZChJbWFnZUZvcm1hdC5QUklWQVRFLApAQCAtMTE4MiwxOCArMTM3OCwyNSBAQAogICAgICAgICAgICAgU2l6ZVtdIGpwZWdTaXplcyA9IHNtLmdldEpwZWdPdXRwdXRTaXplc0NoZWNrZWQoKTsKICAgICAgICAgICAgIFNpemVbXSByYXdTaXplcyA9IHNtLmdldFJhd091dHB1dFNpemVzQ2hlY2tlZCgpOwogCi0gICAgICAgICAgICBTaXplIG1heFByZXZpZXdTaXplID0gZ2V0TWF4UHJldmlld1NpemUoY29udGV4dCwgY2FtZXJhSWQpOwotCiAgICAgICAgICAgICBtYXhSYXdTaXplID0gKHJhd1NpemVzLmxlbmd0aCAhPSAwKSA/IENhbWVyYVRlc3RVdGlscy5nZXRNYXhTaXplKHJhd1NpemVzKSA6IG51bGw7CiAKKyAgICAgICAgICAgIFN0cmVhbUNvbmZpZ3VyYXRpb25NYXAgY29uZmlncyA9IHNtLmdldENoYXJhY3RlcmlzdGljcygpLmdldCgKKyAgICAgICAgICAgICAgICAgICAgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLlNDQUxFUl9TVFJFQU1fQ09ORklHVVJBVElPTl9NQVApOwogICAgICAgICAgICAgaWYgKHNtLmlzQ29sb3JPdXRwdXRTdXBwb3J0ZWQoKSkgeworICAgICAgICAgICAgICAgIFNpemUgbWF4UHJldmlld1NpemUgPSBnZXRNYXhQcmV2aWV3U2l6ZShjb250ZXh0LCBjYW1lcmFJZCk7CiAgICAgICAgICAgICAgICAgbWF4UHJpdlNpemVzW1BSRVZJRVddID0gZ2V0TWF4U2l6ZShwcml2U2l6ZXMsIG1heFByZXZpZXdTaXplKTsKICAgICAgICAgICAgICAgICBtYXhZdXZTaXplc1tQUkVWSUVXXSAgPSBnZXRNYXhTaXplKHl1dlNpemVzLCBtYXhQcmV2aWV3U2l6ZSk7CiAgICAgICAgICAgICAgICAgbWF4SnBlZ1NpemVzW1BSRVZJRVddID0gZ2V0TWF4U2l6ZShqcGVnU2l6ZXMsIG1heFByZXZpZXdTaXplKTsKIAotICAgICAgICAgICAgICAgIG1heFByaXZTaXplc1tSRUNPUkRdID0gZ2V0TWF4UmVjb3JkaW5nU2l6ZShjYW1lcmFJZCk7Ci0gICAgICAgICAgICAgICAgbWF4WXV2U2l6ZXNbUkVDT1JEXSAgPSBnZXRNYXhSZWNvcmRpbmdTaXplKGNhbWVyYUlkKTsKLSAgICAgICAgICAgICAgICBtYXhKcGVnU2l6ZXNbUkVDT1JEXSA9IGdldE1heFJlY29yZGluZ1NpemUoY2FtZXJhSWQpOworICAgICAgICAgICAgICAgIGlmIChzbS5pc0V4dGVybmFsQ2FtZXJhKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbWF4UHJpdlNpemVzW1JFQ09SRF0gPSBnZXRNYXhFeHRlcm5hbFJlY29yZGluZ1NpemUoY2FtZXJhSWQsIGNvbmZpZ3MpOworICAgICAgICAgICAgICAgICAgICBtYXhZdXZTaXplc1tSRUNPUkRdICA9IGdldE1heEV4dGVybmFsUmVjb3JkaW5nU2l6ZShjYW1lcmFJZCwgY29uZmlncyk7CisgICAgICAgICAgICAgICAgICAgIG1heEpwZWdTaXplc1tSRUNPUkRdID0gZ2V0TWF4RXh0ZXJuYWxSZWNvcmRpbmdTaXplKGNhbWVyYUlkLCBjb25maWdzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtYXhQcml2U2l6ZXNbUkVDT1JEXSA9IGdldE1heFJlY29yZGluZ1NpemUoY2FtZXJhSWQpOworICAgICAgICAgICAgICAgICAgICBtYXhZdXZTaXplc1tSRUNPUkRdICA9IGdldE1heFJlY29yZGluZ1NpemUoY2FtZXJhSWQpOworICAgICAgICAgICAgICAgICAgICBtYXhKcGVnU2l6ZXNbUkVDT1JEXSA9IGdldE1heFJlY29yZGluZ1NpemUoY2FtZXJhSWQpOworICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIG1heFByaXZTaXplc1tNQVhJTVVNXSA9IENhbWVyYVRlc3RVdGlscy5nZXRNYXhTaXplKHByaXZTaXplcyk7CiAgICAgICAgICAgICAgICAgbWF4WXV2U2l6ZXNbTUFYSU1VTV0gPSBDYW1lcmFUZXN0VXRpbHMuZ2V0TWF4U2l6ZSh5dXZTaXplcyk7CkBAIC0xMjA2LDggKzE0MDksNzIgQEAKICAgICAgICAgICAgICAgICBtYXhKcGVnU2l6ZXNbVkdBXSA9IHZnYVNpemU7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIFN0cmVhbUNvbmZpZ3VyYXRpb25NYXAgY29uZmlncyA9IHNtLmdldENoYXJhY3RlcmlzdGljcygpLmdldCgKLSAgICAgICAgICAgICAgICAgICAgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLlNDQUxFUl9TVFJFQU1fQ09ORklHVVJBVElPTl9NQVApOworICAgICAgICAgICAgaWYgKHNtLmlzQ29sb3JPdXRwdXRTdXBwb3J0ZWQoKSAmJiAhc20uaXNIYXJkd2FyZUxldmVsTGVnYWN5KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBWR0EgcmVzb2x1dGlvbiwgYnV0IHdpdGggYXNwZWN0IHJhdGlvIG1hdGNoaW5nIGZ1bGwgcmVzIEZPVgorICAgICAgICAgICAgICAgIGZsb2F0IGZ1bGxGb3ZBc3BlY3QgPSBtYXhZdXZTaXplc1tNQVhJTVVNXS5nZXRXaWR0aCgpIC8gKGZsb2F0KSBtYXhZdXZTaXplc1tNQVhJTVVNXS5nZXRIZWlnaHQoKTsKKyAgICAgICAgICAgICAgICBTaXplIHZnYUZ1bGxGb3ZTaXplID0gbmV3IFNpemUoNjQwLCAoaW50KSAoNjQwIC8gZnVsbEZvdkFzcGVjdCkpOworCisgICAgICAgICAgICAgICAgbWF4UHJpdlNpemVzW1ZHQV9GVUxMX0ZPVl0gPSB2Z2FGdWxsRm92U2l6ZTsKKyAgICAgICAgICAgICAgICBtYXhZdXZTaXplc1tWR0FfRlVMTF9GT1ZdID0gdmdhRnVsbEZvdlNpemU7CisgICAgICAgICAgICAgICAgbWF4SnBlZ1NpemVzW1ZHQV9GVUxMX0ZPVl0gPSB2Z2FGdWxsRm92U2l6ZTsKKworICAgICAgICAgICAgICAgIC8vIE1heCByZXNvbHV0aW9uIHRoYXQgcnVucyBhdCAzMGZwcworCisgICAgICAgICAgICAgICAgU2l6ZSBtYXhQcml2MzBmcHNTaXplID0gbnVsbDsKKyAgICAgICAgICAgICAgICBTaXplIG1heFl1djMwZnBzU2l6ZSA9IG51bGw7CisgICAgICAgICAgICAgICAgU2l6ZSBtYXhKcGVnMzBmcHNTaXplID0gbnVsbDsKKyAgICAgICAgICAgICAgICBDb21wYXJhdG9yPFNpemU+IGNvbXBhcmF0b3IgPSBuZXcgU2l6ZUNvbXBhcmF0b3IoKTsKKyAgICAgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTaXplLCBMb25nPiBlIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc20uZ2V0QXZhaWxhYmxlTWluRnJhbWVEdXJhdGlvbnNGb3JGb3JtYXRDaGVja2VkKEltYWdlRm9ybWF0LlBSSVZBVEUpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeVNldCgpKSB7CisgICAgICAgICAgICAgICAgICAgIFNpemUgcyA9IGUuZ2V0S2V5KCk7CisgICAgICAgICAgICAgICAgICAgIExvbmcgbWluRHVyYXRpb24gPSBlLmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgU3RyaW5nLmZvcm1hdCgiUHJpdiBTaXplOiAlcywgZHVyYXRpb24gJWQgbGltaXQgJWQiLCBzLCBtaW5EdXJhdGlvbiwgRlJBTUVfRFVSQVRJT05fMzBGUFNfTlNFQykpOworICAgICAgICAgICAgICAgICAgICBpZiAobWluRHVyYXRpb24gPD0gRlJBTUVfRFVSQVRJT05fMzBGUFNfTlNFQykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1heFByaXYzMGZwc1NpemUgPT0gbnVsbCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJhdG9yLmNvbXBhcmUobWF4UHJpdjMwZnBzU2l6ZSwgcykgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UHJpdjMwZnBzU2l6ZSA9IHM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiTm8gUFJJVkFURSByZXNvbHV0aW9uIGF2YWlsYWJsZSBhdCAzMGZwcyEiLCBtYXhQcml2MzBmcHNTaXplICE9IG51bGwpOworCisgICAgICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U2l6ZSwgTG9uZz4gZSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtLmdldEF2YWlsYWJsZU1pbkZyYW1lRHVyYXRpb25zRm9yRm9ybWF0Q2hlY2tlZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbWFnZUZvcm1hdC5ZVVZfNDIwXzg4OCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgU2l6ZSBzID0gZS5nZXRLZXkoKTsKKyAgICAgICAgICAgICAgICAgICAgTG9uZyBtaW5EdXJhdGlvbiA9IGUuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBTdHJpbmcuZm9ybWF0KCJZVVYgU2l6ZTogJXMsIGR1cmF0aW9uICVkIGxpbWl0ICVkIiwgcywgbWluRHVyYXRpb24sIEZSQU1FX0RVUkFUSU9OXzMwRlBTX05TRUMpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1pbkR1cmF0aW9uIDw9IEZSQU1FX0RVUkFUSU9OXzMwRlBTX05TRUMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXhZdXYzMGZwc1NpemUgPT0gbnVsbCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJhdG9yLmNvbXBhcmUobWF4WXV2MzBmcHNTaXplLCBzKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhZdXYzMGZwc1NpemUgPSBzOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIk5vIFlVVl80MjBfODg4IHJlc29sdXRpb24gYXZhaWxhYmxlIGF0IDMwZnBzISIsIG1heFl1djMwZnBzU2l6ZSAhPSBudWxsKTsKKworICAgICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFNpemUsIExvbmc+IGUgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbS5nZXRBdmFpbGFibGVNaW5GcmFtZUR1cmF0aW9uc0ZvckZvcm1hdENoZWNrZWQoSW1hZ2VGb3JtYXQuSlBFRykuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgU2l6ZSBzID0gZS5nZXRLZXkoKTsKKyAgICAgICAgICAgICAgICAgICAgTG9uZyBtaW5EdXJhdGlvbiA9IGUuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBTdHJpbmcuZm9ybWF0KCJKUEVHIFNpemU6ICVzLCBkdXJhdGlvbiAlZCBsaW1pdCAlZCIsIHMsIG1pbkR1cmF0aW9uLCBGUkFNRV9EVVJBVElPTl8zMEZQU19OU0VDKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtaW5EdXJhdGlvbiA8PSBGUkFNRV9EVVJBVElPTl8zMEZQU19OU0VDKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF4SnBlZzMwZnBzU2l6ZSA9PSBudWxsIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmF0b3IuY29tcGFyZShtYXhKcGVnMzBmcHNTaXplLCBzKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhKcGVnMzBmcHNTaXplID0gczsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJObyBKUEVHIHJlc29sdXRpb24gYXZhaWxhYmxlIGF0IDMwZnBzISIsIG1heEpwZWczMGZwc1NpemUgIT0gbnVsbCk7CisKKyAgICAgICAgICAgICAgICBtYXhQcml2U2l6ZXNbTUFYXzMwRlBTXSA9IG1heFByaXYzMGZwc1NpemU7CisgICAgICAgICAgICAgICAgbWF4WXV2U2l6ZXNbTUFYXzMwRlBTXSA9IG1heFl1djMwZnBzU2l6ZTsKKyAgICAgICAgICAgICAgICBtYXhKcGVnU2l6ZXNbTUFYXzMwRlBTXSA9IG1heEpwZWczMGZwc1NpemU7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIFNpemVbXSBwcml2SW5wdXRTaXplcyA9IGNvbmZpZ3MuZ2V0SW5wdXRTaXplcyhJbWFnZUZvcm1hdC5QUklWQVRFKTsKICAgICAgICAgICAgIG1heElucHV0UHJpdlNpemUgPSBwcml2SW5wdXRTaXplcyAhPSBudWxsID8KICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhVGVzdFV0aWxzLmdldE1heFNpemUocHJpdklucHV0U2l6ZXMpIDogbnVsbDsKQEAgLTEyODgsNiArMTU1NSwxMiBAQAogICAgICAgICAgICAgICAgIGNhc2UgVkdBOgogICAgICAgICAgICAgICAgICAgICBiLmFwcGVuZCgiVkdBXSIpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFZHQV9GVUxMX0ZPVjoKKyAgICAgICAgICAgICAgICAgICAgYi5hcHBlbmQoIlZHQV9GVUxMX0ZPVl0iKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNQVhfMzBGUFM6CisgICAgICAgICAgICAgICAgICAgIGIuYXBwZW5kKCJNQVhfMzBGUFNdIik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgIGIuYXBwZW5kKCJVTktdIik7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTQ2MywzNiArMTczNiw1MCBAQAogICAgIHByaXZhdGUgdm9pZCB0ZXN0T3V0cHV0Q29tYmluYXRpb24oU3RyaW5nIGNhbWVyYUlkLCBpbnRbXSBjb25maWcsIE1heFN0cmVhbVNpemVzIG1heFNpemVzKQogICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKLSAgICAgICAgTG9nLmkoVEFHLCBTdHJpbmcuZm9ybWF0KCJUZXN0aW5nIENhbWVyYSAlcywgY29uZmlnICVzIiwKKyAgICAgICAgTG9nLmkoVEFHLCBTdHJpbmcuZm9ybWF0KCJUZXN0aW5nIHNpbmdsZSBDYW1lcmEgJXMsIGNvbmZpZyAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZCwgTWF4U3RyZWFtU2l6ZXMuY29uZmlnVG9TdHJpbmcoY29uZmlnKSkpOwogCisgICAgICAgIHRlc3RTaW5nbGVDYW1lcmFPdXRwdXRDb21iaW5hdGlvbihjYW1lcmFJZCwgY29uZmlnLCBtYXhTaXplcyk7CisKKyAgICAgICAgaWYgKG1TdGF0aWNJbmZvLmlzTG9naWNhbE11bHRpQ2FtZXJhKCkpIHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgU3RyaW5nLmZvcm1hdCgiVGVzdGluZyBsb2dpY2FsIENhbWVyYSAlcywgY29uZmlnICVzIiwKKyAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQsIE1heFN0cmVhbVNpemVzLmNvbmZpZ1RvU3RyaW5nKGNvbmZpZykpKTsKKworICAgICAgICAgICAgdGVzdE11bHRpQ2FtZXJhT3V0cHV0Q29tYmluYXRpb24oY2FtZXJhSWQsIGNvbmZpZywgbWF4U2l6ZXMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RTaW5nbGVDYW1lcmFPdXRwdXRDb21iaW5hdGlvbihTdHJpbmcgY2FtZXJhSWQsIGludFtdIGNvbmZpZywKKyAgICAgICAgTWF4U3RyZWFtU2l6ZXMgbWF4U2l6ZXMpIHRocm93cyBFeGNlcHRpb24geworCiAgICAgICAgIC8vIFRpbWVvdXQgaXMgcmVsYXhlZCBieSAxIHNlY29uZCBmb3IgTEVHQUNZIGRldmljZXMgdG8gcmVkdWNlIGZhbHNlIHBvc2l0aXZlIHJhdGUgaW4gQ1RTCiAgICAgICAgIGZpbmFsIGludCBUSU1FT1VUX0ZPUl9SRVNVTFRfTVMgPSAobVN0YXRpY0luZm8uaXNIYXJkd2FyZUxldmVsTGVnYWN5KCkpID8gMjAwMCA6IDEwMDA7CiAgICAgICAgIGZpbmFsIGludCBNSU5fUkVTVUxUX0NPVU5UID0gMzsKIAogICAgICAgICAvLyBTZXQgdXAgb3V0cHV0cwotICAgICAgICBMaXN0PFN1cmZhY2U+IG91dHB1dFN1cmZhY2VzID0gbmV3IEFycmF5TGlzdDxTdXJmYWNlPigpOworICAgICAgICBMaXN0PE91dHB1dENvbmZpZ3VyYXRpb24+IG91dHB1dENvbmZpZ3MgPSBuZXcgQXJyYXlMaXN0PE91dHB1dENvbmZpZ3VyYXRpb24+KCk7CiAgICAgICAgIExpc3Q8U3VyZmFjZVRleHR1cmU+IHByaXZUYXJnZXRzID0gbmV3IEFycmF5TGlzdDxTdXJmYWNlVGV4dHVyZT4oKTsKICAgICAgICAgTGlzdDxJbWFnZVJlYWRlcj4ganBlZ1RhcmdldHMgPSBuZXcgQXJyYXlMaXN0PEltYWdlUmVhZGVyPigpOwogICAgICAgICBMaXN0PEltYWdlUmVhZGVyPiB5dXZUYXJnZXRzID0gbmV3IEFycmF5TGlzdDxJbWFnZVJlYWRlcj4oKTsKICAgICAgICAgTGlzdDxJbWFnZVJlYWRlcj4gcmF3VGFyZ2V0cyA9IG5ldyBBcnJheUxpc3Q8SW1hZ2VSZWFkZXI+KCk7CiAKICAgICAgICAgc2V0dXBDb25maWd1cmF0aW9uVGFyZ2V0cyhjb25maWcsIG1heFNpemVzLCBwcml2VGFyZ2V0cywganBlZ1RhcmdldHMsIHl1dlRhcmdldHMsCi0gICAgICAgICAgICAgICAgcmF3VGFyZ2V0cywgb3V0cHV0U3VyZmFjZXMsIE1JTl9SRVNVTFRfQ09VTlQpOworICAgICAgICAgICAgICAgIHJhd1RhcmdldHMsIG91dHB1dENvbmZpZ3MsIE1JTl9SRVNVTFRfQ09VTlQsIC0xIC8qb3ZlcnJpZGVTdHJlYW1JbmRleCovLAorICAgICAgICAgICAgICAgIG51bGwgLypvdmVycmlkZVBoeXNpY2FsQ2FtZXJhSWRzKi8sIG51bGwgLypvdmVycmlkZVBoeXNpY2FsQ2FtZXJhU2l6ZXMqLyk7CiAKICAgICAgICAgYm9vbGVhbiBoYXZlU2Vzc2lvbiA9IGZhbHNlOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgQ2FwdHVyZVJlcXVlc3QuQnVpbGRlciByZXF1ZXN0QnVpbGRlciA9CiAgICAgICAgICAgICAgICAgICAgIG1DYW1lcmEuY3JlYXRlQ2FwdHVyZVJlcXVlc3QoQ2FtZXJhRGV2aWNlLlRFTVBMQVRFX1BSRVZJRVcpOwogCi0gICAgICAgICAgICBmb3IgKFN1cmZhY2UgcyA6IG91dHB1dFN1cmZhY2VzKSB7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdEJ1aWxkZXIuYWRkVGFyZ2V0KHMpOworICAgICAgICAgICAgZm9yIChPdXRwdXRDb25maWd1cmF0aW9uIGMgOiBvdXRwdXRDb25maWdzKSB7CisgICAgICAgICAgICAgICAgcmVxdWVzdEJ1aWxkZXIuYWRkVGFyZ2V0KGMuZ2V0U3VyZmFjZSgpKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgQ2FtZXJhQ2FwdHVyZVNlc3Npb24uQ2FwdHVyZUNhbGxiYWNrIG1vY2tDYXB0dXJlQ2FsbGJhY2sgPQogICAgICAgICAgICAgICAgICAgICBtb2NrKENhbWVyYUNhcHR1cmVTZXNzaW9uLkNhcHR1cmVDYWxsYmFjay5jbGFzcyk7CiAKLSAgICAgICAgICAgIGNyZWF0ZVNlc3Npb24ob3V0cHV0U3VyZmFjZXMpOworICAgICAgICAgICAgY3JlYXRlU2Vzc2lvbkJ5Q29uZmlncyhvdXRwdXRDb25maWdzKTsKICAgICAgICAgICAgIGhhdmVTZXNzaW9uID0gdHJ1ZTsKICAgICAgICAgICAgIENhcHR1cmVSZXF1ZXN0IHJlcXVlc3QgPSByZXF1ZXN0QnVpbGRlci5idWlsZCgpOwogICAgICAgICAgICAgbUNhbWVyYVNlc3Npb24uc2V0UmVwZWF0aW5nUmVxdWVzdChyZXF1ZXN0LCBtb2NrQ2FwdHVyZUNhbGxiYWNrLCBtSGFuZGxlcik7CkBAIC0xNTM5LDU1ICsxODI2LDIxNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHNldHVwQ29uZmlndXJhdGlvblRhcmdldHMoaW50W10gb3V0cHV0Q29uZmlncywgTWF4U3RyZWFtU2l6ZXMgbWF4U2l6ZXMsCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RNdWx0aUNhbWVyYU91dHB1dENvbWJpbmF0aW9uKFN0cmluZyBjYW1lcmFJZCwgaW50W10gY29uZmlnLAorICAgICAgICBNYXhTdHJlYW1TaXplcyBtYXhTaXplcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gVGltZW91dCBpcyByZWxheGVkIGJ5IDEgc2Vjb25kIGZvciBMRUdBQ1kgZGV2aWNlcyB0byByZWR1Y2UgZmFsc2UgcG9zaXRpdmUgcmF0ZSBpbiBDVFMKKyAgICAgICAgZmluYWwgaW50IFRJTUVPVVRfRk9SX1JFU1VMVF9NUyA9IChtU3RhdGljSW5mby5pc0hhcmR3YXJlTGV2ZWxMZWdhY3koKSkgPyAyMDAwIDogMTAwMDsKKyAgICAgICAgZmluYWwgaW50IE1JTl9SRVNVTFRfQ09VTlQgPSAzOworICAgICAgICBTZXQ8U3RyaW5nPiBwaHlzaWNhbENhbWVyYUlkcyA9IG1TdGF0aWNJbmZvLmdldENoYXJhY3RlcmlzdGljcygpLmdldFBoeXNpY2FsQ2FtZXJhSWRzKCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWcubGVuZ3RoOyBpICs9IDIpIHsKKyAgICAgICAgICAgIGludCBmb3JtYXQgPSBjb25maWdbaV07CisgICAgICAgICAgICBpbnQgc2l6ZUxpbWl0ID0gY29uZmlnW2krMV07CisgICAgICAgICAgICBpZiAoZm9ybWF0ICE9IFlVViAmJiBmb3JtYXQgIT0gUkFXKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEZpbmQgcGh5c2ljYWwgY2FtZXJhcyB3aXRoIG1hdGNoaW5nIHNpemUuCisgICAgICAgICAgICBTaXplIHRhcmdldFNpemUgPSAoZm9ybWF0ID09IFlVVikgPyBtYXhTaXplcy5tYXhZdXZTaXplc1tzaXplTGltaXRdIDoKKyAgICAgICAgICAgICAgICAgICAgbWF4U2l6ZXMubWF4UmF3U2l6ZTsKKyAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwaHlzaWNhbENhbWVyYXNGb3JTaXplID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICAgICAgICBMaXN0PFNpemU+IHBoeXNpY2FsQ2FtZXJhU2l6ZXMgPSBuZXcgQXJyYXlMaXN0PFNpemU+KCk7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBwaHlzaWNhbElkIDogcGh5c2ljYWxDYW1lcmFJZHMpIHsKKyAgICAgICAgICAgICAgICBTaXplW10gc2l6ZXMgPSBtQWxsU3RhdGljSW5mby5nZXQocGh5c2ljYWxJZCkuZ2V0QXZhaWxhYmxlU2l6ZXNGb3JGb3JtYXRDaGVja2VkKAorICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBTdGF0aWNNZXRhZGF0YS5TdHJlYW1EaXJlY3Rpb24uT3V0cHV0KTsKKyAgICAgICAgICAgICAgICBpZiAodGFyZ2V0U2l6ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheXMuYXNMaXN0KHNpemVzKS5jb250YWlucyh0YXJnZXRTaXplKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFTaXplcy5hZGQodGFyZ2V0U2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYXNGb3JTaXplLmFkZChwaHlzaWNhbElkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09IFJBVyAmJiBzaXplcy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhc0ZvclNpemUuYWRkKHBoeXNpY2FsSWQpOworICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYVNpemVzLmFkZChDYW1lcmFUZXN0VXRpbHMuZ2V0TWF4U2l6ZShzaXplcykpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocGh5c2ljYWxDYW1lcmFzRm9yU2l6ZS5zaXplKCkgPT0gMikgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGh5c2ljYWxDYW1lcmFzRm9yU2l6ZS5zaXplKCkgPCAyKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFNldCB1cCBvdXRwdXRzCisgICAgICAgICAgICBMaXN0PE91dHB1dENvbmZpZ3VyYXRpb24+IG91dHB1dENvbmZpZ3MgPSBuZXcgQXJyYXlMaXN0PE91dHB1dENvbmZpZ3VyYXRpb24+KCk7CisgICAgICAgICAgICBMaXN0PFN1cmZhY2VUZXh0dXJlPiBwcml2VGFyZ2V0cyA9IG5ldyBBcnJheUxpc3Q8U3VyZmFjZVRleHR1cmU+KCk7CisgICAgICAgICAgICBMaXN0PEltYWdlUmVhZGVyPiBqcGVnVGFyZ2V0cyA9IG5ldyBBcnJheUxpc3Q8SW1hZ2VSZWFkZXI+KCk7CisgICAgICAgICAgICBMaXN0PEltYWdlUmVhZGVyPiB5dXZUYXJnZXRzID0gbmV3IEFycmF5TGlzdDxJbWFnZVJlYWRlcj4oKTsKKyAgICAgICAgICAgIExpc3Q8SW1hZ2VSZWFkZXI+IHJhd1RhcmdldHMgPSBuZXcgQXJyYXlMaXN0PEltYWdlUmVhZGVyPigpOworCisgICAgICAgICAgICBzZXR1cENvbmZpZ3VyYXRpb25UYXJnZXRzKGNvbmZpZywgbWF4U2l6ZXMsIHByaXZUYXJnZXRzLCBqcGVnVGFyZ2V0cywgeXV2VGFyZ2V0cywKKyAgICAgICAgICAgICAgICAgICAgcmF3VGFyZ2V0cywgb3V0cHV0Q29uZmlncywgTUlOX1JFU1VMVF9DT1VOVCwgaSwgcGh5c2ljYWxDYW1lcmFzRm9yU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFTaXplcyk7CisKKyAgICAgICAgICAgIGJvb2xlYW4gaGF2ZVNlc3Npb24gPSBmYWxzZTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQ2FwdHVyZVJlcXVlc3QuQnVpbGRlciByZXF1ZXN0QnVpbGRlciA9CisgICAgICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhLmNyZWF0ZUNhcHR1cmVSZXF1ZXN0KENhbWVyYURldmljZS5URU1QTEFURV9QUkVWSUVXKTsKKworICAgICAgICAgICAgICAgIGZvciAoT3V0cHV0Q29uZmlndXJhdGlvbiBjIDogb3V0cHV0Q29uZmlncykgeworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QnVpbGRlci5hZGRUYXJnZXQoYy5nZXRTdXJmYWNlKCkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIENhbWVyYUNhcHR1cmVTZXNzaW9uLkNhcHR1cmVDYWxsYmFjayBtb2NrQ2FwdHVyZUNhbGxiYWNrID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1vY2soQ2FtZXJhQ2FwdHVyZVNlc3Npb24uQ2FwdHVyZUNhbGxiYWNrLmNsYXNzKTsKKworICAgICAgICAgICAgICAgIGNyZWF0ZVNlc3Npb25CeUNvbmZpZ3Mob3V0cHV0Q29uZmlncyk7CisgICAgICAgICAgICAgICAgaGF2ZVNlc3Npb24gPSB0cnVlOworICAgICAgICAgICAgICAgIENhcHR1cmVSZXF1ZXN0IHJlcXVlc3QgPSByZXF1ZXN0QnVpbGRlci5idWlsZCgpOworICAgICAgICAgICAgICAgIG1DYW1lcmFTZXNzaW9uLnNldFJlcGVhdGluZ1JlcXVlc3QocmVxdWVzdCwgbW9ja0NhcHR1cmVDYWxsYmFjaywgbUhhbmRsZXIpOworCisgICAgICAgICAgICAgICAgdmVyaWZ5KG1vY2tDYXB0dXJlQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0KFRJTUVPVVRfRk9SX1JFU1VMVF9NUyAqIE1JTl9SRVNVTFRfQ09VTlQpLmF0TGVhc3QoTUlOX1JFU1VMVF9DT1VOVCkpCisgICAgICAgICAgICAgICAgICAgICAgICAub25DYXB0dXJlQ29tcGxldGVkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVxKG1DYW1lcmFTZXNzaW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcShyZXF1ZXN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0EoVG90YWxDYXB0dXJlUmVzdWx0LmNsYXNzKSk7CisgICAgICAgICAgICAgICAgdmVyaWZ5KG1vY2tDYXB0dXJlQ2FsbGJhY2ssIG5ldmVyKCkpLgorICAgICAgICAgICAgICAgICAgICAgICAgb25DYXB0dXJlRmFpbGVkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVxKG1DYW1lcmFTZXNzaW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcShyZXF1ZXN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0EoQ2FwdHVyZUZhaWx1cmUuY2xhc3MpKTsKKworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgICAgICAgICBtQ29sbGVjdG9yLmFkZE1lc3NhZ2UoU3RyaW5nLmZvcm1hdCgiT3V0cHV0IGNvbWJpbmF0aW9uICVzIGZhaWxlZCBkdWUgdG86ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1heFN0cmVhbVNpemVzLmNvbmZpZ1RvU3RyaW5nKGNvbmZpZyksIGUuZ2V0TWVzc2FnZSgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaGF2ZVNlc3Npb24pIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsIFN0cmluZy5mb3JtYXQoIkRvbmUgd2l0aCBjYW1lcmEgJXMsIGNvbmZpZyAlcywgY2xvc2luZyBzZXNzaW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkLCBNYXhTdHJlYW1TaXplcy5jb25maWdUb1N0cmluZyhjb25maWcpKSk7CisgICAgICAgICAgICAgICAgICAgIHN0b3BDYXB0dXJlKC8qZmFzdCovZmFsc2UpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICAgICAgICAgIG1Db2xsZWN0b3IuYWRkTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIkNsb3NpbmcgZG93biBmb3Igb3V0cHV0IGNvbWJpbmF0aW9uICVzIGZhaWxlZCBkdWUgdG86ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4U3RyZWFtU2l6ZXMuY29uZmlnVG9TdHJpbmcoY29uZmlnKSwgZS5nZXRNZXNzYWdlKCkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoU3VyZmFjZVRleHR1cmUgdGFyZ2V0IDogcHJpdlRhcmdldHMpIHsKKyAgICAgICAgICAgICAgICB0YXJnZXQucmVsZWFzZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChJbWFnZVJlYWRlciB0YXJnZXQgOiBqcGVnVGFyZ2V0cykgeworICAgICAgICAgICAgICAgIHRhcmdldC5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChJbWFnZVJlYWRlciB0YXJnZXQgOiB5dXZUYXJnZXRzKSB7CisgICAgICAgICAgICAgICAgdGFyZ2V0LmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKEltYWdlUmVhZGVyIHRhcmdldCA6IHJhd1RhcmdldHMpIHsKKyAgICAgICAgICAgICAgICB0YXJnZXQuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXR1cENvbmZpZ3VyYXRpb25UYXJnZXRzKGludFtdIGNvbmZpZ3MsIE1heFN0cmVhbVNpemVzIG1heFNpemVzLAogICAgICAgICAgICAgTGlzdDxTdXJmYWNlVGV4dHVyZT4gcHJpdlRhcmdldHMsIExpc3Q8SW1hZ2VSZWFkZXI+IGpwZWdUYXJnZXRzLAogICAgICAgICAgICAgTGlzdDxJbWFnZVJlYWRlcj4geXV2VGFyZ2V0cywgTGlzdDxJbWFnZVJlYWRlcj4gcmF3VGFyZ2V0cywKICAgICAgICAgICAgIExpc3Q8U3VyZmFjZT4gb3V0cHV0U3VyZmFjZXMsIGludCBudW1CdWZmZXJzKSB7CisgICAgICAgIExpc3Q8T3V0cHV0Q29uZmlndXJhdGlvbj4gb3V0cHV0Q29uZmlncyA9IG5ldyBBcnJheUxpc3Q8T3V0cHV0Q29uZmlndXJhdGlvbj4gKCk7CisKKyAgICAgICAgc2V0dXBDb25maWd1cmF0aW9uVGFyZ2V0cyhjb25maWdzLCBtYXhTaXplcywgcHJpdlRhcmdldHMsIGpwZWdUYXJnZXRzLCB5dXZUYXJnZXRzLAorICAgICAgICAgICAgICAgIHJhd1RhcmdldHMsIG91dHB1dENvbmZpZ3MsIG51bUJ1ZmZlcnMsIC0xIC8qb3ZlcnJpZGVTdHJlYW1JbmRleCovLAorICAgICAgICAgICAgICAgIG51bGwgLypvdmVycmlkZVBoeXNpY2FsQ2FtZXJhSWRzKi8sIG51bGwgLyogb3ZlcnJpZGVQaHlzaWNhbENhbWVyYVNpemVzKSAqLyk7CisKKyAgICAgICAgZm9yIChPdXRwdXRDb25maWd1cmF0aW9uIG91dHB1dENvbmZpZyA6IG91dHB1dENvbmZpZ3MpIHsKKyAgICAgICAgICAgIG91dHB1dFN1cmZhY2VzLmFkZChvdXRwdXRDb25maWcuZ2V0U3VyZmFjZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXR1cENvbmZpZ3VyYXRpb25UYXJnZXRzKGludFtdIGNvbmZpZ3MsIE1heFN0cmVhbVNpemVzIG1heFNpemVzLAorICAgICAgICAgICAgTGlzdDxTdXJmYWNlVGV4dHVyZT4gcHJpdlRhcmdldHMsIExpc3Q8SW1hZ2VSZWFkZXI+IGpwZWdUYXJnZXRzLAorICAgICAgICAgICAgTGlzdDxJbWFnZVJlYWRlcj4geXV2VGFyZ2V0cywgTGlzdDxJbWFnZVJlYWRlcj4gcmF3VGFyZ2V0cywKKyAgICAgICAgICAgIExpc3Q8T3V0cHV0Q29uZmlndXJhdGlvbj4gb3V0cHV0Q29uZmlncywgaW50IG51bUJ1ZmZlcnMsCisgICAgICAgICAgICBpbnQgb3ZlcnJpZGVTdHJlYW1JbmRleCwgTGlzdDxTdHJpbmc+IG92ZXJyaWRlUGh5c2ljYWxDYW1lcmFJZHMsCisgICAgICAgICAgICBMaXN0PFNpemU+IG92ZXJyaWRlUGh5c2ljYWxDYW1lcmFTaXplcykgewogCiAgICAgICAgIEltYWdlRHJvcHBlckxpc3RlbmVyIGltYWdlRHJvcHBlckxpc3RlbmVyID0gbmV3IEltYWdlRHJvcHBlckxpc3RlbmVyKCk7CiAKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvdXRwdXRDb25maWdzLmxlbmd0aDsgaSArPSAyKSB7Ci0gICAgICAgICAgICBpbnQgZm9ybWF0ID0gb3V0cHV0Q29uZmlnc1tpXTsKLSAgICAgICAgICAgIGludCBzaXplTGltaXQgPSBvdXRwdXRDb25maWdzW2kgKyAxXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWdzLmxlbmd0aDsgaSArPSAyKSB7CisgICAgICAgICAgICBpbnQgZm9ybWF0ID0gY29uZmlnc1tpXTsKKyAgICAgICAgICAgIGludCBzaXplTGltaXQgPSBjb25maWdzW2kgKyAxXTsKKyAgICAgICAgICAgIFN1cmZhY2UgbmV3U3VyZmFjZTsKIAotICAgICAgICAgICAgc3dpdGNoIChmb3JtYXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFBSSVY6IHsKLSAgICAgICAgICAgICAgICAgICAgU2l6ZSB0YXJnZXRTaXplID0gbWF4U2l6ZXMubWF4UHJpdlNpemVzW3NpemVMaW1pdF07Ci0gICAgICAgICAgICAgICAgICAgIFN1cmZhY2VUZXh0dXJlIHRhcmdldCA9IG5ldyBTdXJmYWNlVGV4dHVyZSgvKnJhbmRvbSBpbnQqLzEpOwotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0RGVmYXVsdEJ1ZmZlclNpemUodGFyZ2V0U2l6ZS5nZXRXaWR0aCgpLCB0YXJnZXRTaXplLmdldEhlaWdodCgpKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3VyZmFjZXMuYWRkKG5ldyBTdXJmYWNlKHRhcmdldCkpOwotICAgICAgICAgICAgICAgICAgICBwcml2VGFyZ2V0cy5hZGQodGFyZ2V0KTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpbnQgbnVtQ29uZmlncyA9IDE7CisgICAgICAgICAgICBpZiAob3ZlcnJpZGVTdHJlYW1JbmRleCA9PSBpICYmIG92ZXJyaWRlUGh5c2ljYWxDYW1lcmFJZHMgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICBvdmVycmlkZVBoeXNpY2FsQ2FtZXJhSWRzLnNpemUoKSA+IDEpIHsKKyAgICAgICAgICAgICAgICBudW1Db25maWdzID0gb3ZlcnJpZGVQaHlzaWNhbENhbWVyYUlkcy5zaXplKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG51bUNvbmZpZ3M7IGorKykgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUFJJVjogeworICAgICAgICAgICAgICAgICAgICAgICAgU2l6ZSB0YXJnZXRTaXplID0gKG51bUNvbmZpZ3MgPT0gMSkgPyBtYXhTaXplcy5tYXhQcml2U2l6ZXNbc2l6ZUxpbWl0XSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlUGh5c2ljYWxDYW1lcmFTaXplcy5nZXQoaik7CisgICAgICAgICAgICAgICAgICAgICAgICBTdXJmYWNlVGV4dHVyZSB0YXJnZXQgPSBuZXcgU3VyZmFjZVRleHR1cmUoLypyYW5kb20gaW50Ki8xKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXREZWZhdWx0QnVmZmVyU2l6ZSh0YXJnZXRTaXplLmdldFdpZHRoKCksIHRhcmdldFNpemUuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0Q29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgT3V0cHV0Q29uZmlndXJhdGlvbihuZXcgU3VyZmFjZSh0YXJnZXQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudW1Db25maWdzID4gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zZXRQaHlzaWNhbENhbWVyYUlkKG92ZXJyaWRlUGh5c2ljYWxDYW1lcmFJZHMuZ2V0KGopKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dENvbmZpZ3MuYWRkKGNvbmZpZyk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcml2VGFyZ2V0cy5hZGQodGFyZ2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhc2UgSlBFRzogeworICAgICAgICAgICAgICAgICAgICAgICAgU2l6ZSB0YXJnZXRTaXplID0gKG51bUNvbmZpZ3MgPT0gMSkgPyBtYXhTaXplcy5tYXhKcGVnU2l6ZXNbc2l6ZUxpbWl0XSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlUGh5c2ljYWxDYW1lcmFTaXplcy5nZXQoaik7CisgICAgICAgICAgICAgICAgICAgICAgICBJbWFnZVJlYWRlciB0YXJnZXQgPSBJbWFnZVJlYWRlci5uZXdJbnN0YW5jZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRTaXplLmdldFdpZHRoKCksIHRhcmdldFNpemUuZ2V0SGVpZ2h0KCksIEpQRUcsIG51bUJ1ZmZlcnMpOworICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldE9uSW1hZ2VBdmFpbGFibGVMaXN0ZW5lcihpbWFnZURyb3BwZXJMaXN0ZW5lciwgbUhhbmRsZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0Q29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgT3V0cHV0Q29uZmlndXJhdGlvbih0YXJnZXQuZ2V0U3VyZmFjZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudW1Db25maWdzID4gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zZXRQaHlzaWNhbENhbWVyYUlkKG92ZXJyaWRlUGh5c2ljYWxDYW1lcmFJZHMuZ2V0KGopKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dENvbmZpZ3MuYWRkKGNvbmZpZyk7CisgICAgICAgICAgICAgICAgICAgICAgICBqcGVnVGFyZ2V0cy5hZGQodGFyZ2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhc2UgWVVWOiB7CisgICAgICAgICAgICAgICAgICAgICAgICBTaXplIHRhcmdldFNpemUgPSAobnVtQ29uZmlncyA9PSAxKSA/IG1heFNpemVzLm1heFl1dlNpemVzW3NpemVMaW1pdF0gOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZVBoeXNpY2FsQ2FtZXJhU2l6ZXMuZ2V0KGopOworICAgICAgICAgICAgICAgICAgICAgICAgSW1hZ2VSZWFkZXIgdGFyZ2V0ID0gSW1hZ2VSZWFkZXIubmV3SW5zdGFuY2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0U2l6ZS5nZXRXaWR0aCgpLCB0YXJnZXRTaXplLmdldEhlaWdodCgpLCBZVVYsIG51bUJ1ZmZlcnMpOworICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldE9uSW1hZ2VBdmFpbGFibGVMaXN0ZW5lcihpbWFnZURyb3BwZXJMaXN0ZW5lciwgbUhhbmRsZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0Q29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgT3V0cHV0Q29uZmlndXJhdGlvbih0YXJnZXQuZ2V0U3VyZmFjZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudW1Db25maWdzID4gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zZXRQaHlzaWNhbENhbWVyYUlkKG92ZXJyaWRlUGh5c2ljYWxDYW1lcmFJZHMuZ2V0KGopKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dENvbmZpZ3MuYWRkKGNvbmZpZyk7CisgICAgICAgICAgICAgICAgICAgICAgICB5dXZUYXJnZXRzLmFkZCh0YXJnZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSQVc6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNpemUgdGFyZ2V0U2l6ZSA9IChudW1Db25maWdzID09IDEpID8gbWF4U2l6ZXMubWF4UmF3U2l6ZSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlUGh5c2ljYWxDYW1lcmFTaXplcy5nZXQoaik7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0YXJnZXRTaXplIGNvdWxkIGJlIG51bGwgaW4gdGhlIGxvZ2ljYWwgY2FtZXJhIGNhc2Ugd2hlcmUgb25seQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGh5c2ljYWwgY2FtZXJhIHN1cHBvcnRzIFJBVyBzdHJlYW0uCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0U2l6ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1hZ2VSZWFkZXIgdGFyZ2V0ID0gSW1hZ2VSZWFkZXIubmV3SW5zdGFuY2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFNpemUuZ2V0V2lkdGgoKSwgdGFyZ2V0U2l6ZS5nZXRIZWlnaHQoKSwgUkFXLCBudW1CdWZmZXJzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0T25JbWFnZUF2YWlsYWJsZUxpc3RlbmVyKGltYWdlRHJvcHBlckxpc3RlbmVyLCBtSGFuZGxlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0Q29uZmlndXJhdGlvbiBjb25maWcgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE91dHB1dENvbmZpZ3VyYXRpb24odGFyZ2V0LmdldFN1cmZhY2UoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bUNvbmZpZ3MgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zZXRQaHlzaWNhbENhbWVyYUlkKG92ZXJyaWRlUGh5c2ljYWxDYW1lcmFJZHMuZ2V0KGopKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0Q29uZmlncy5hZGQoY29uZmlnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdUYXJnZXRzLmFkZCh0YXJnZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwoIlVua25vd24gb3V0cHV0IGZvcm1hdCAiICsgZm9ybWF0KTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSBKUEVHOiB7Ci0gICAgICAgICAgICAgICAgICAgIFNpemUgdGFyZ2V0U2l6ZSA9IG1heFNpemVzLm1heEpwZWdTaXplc1tzaXplTGltaXRdOwotICAgICAgICAgICAgICAgICAgICBJbWFnZVJlYWRlciB0YXJnZXQgPSBJbWFnZVJlYWRlci5uZXdJbnN0YW5jZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFNpemUuZ2V0V2lkdGgoKSwgdGFyZ2V0U2l6ZS5nZXRIZWlnaHQoKSwgSlBFRywgbnVtQnVmZmVycyk7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRPbkltYWdlQXZhaWxhYmxlTGlzdGVuZXIoaW1hZ2VEcm9wcGVyTGlzdGVuZXIsIG1IYW5kbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3VyZmFjZXMuYWRkKHRhcmdldC5nZXRTdXJmYWNlKCkpOwotICAgICAgICAgICAgICAgICAgICBqcGVnVGFyZ2V0cy5hZGQodGFyZ2V0KTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgWVVWOiB7Ci0gICAgICAgICAgICAgICAgICAgIFNpemUgdGFyZ2V0U2l6ZSA9IG1heFNpemVzLm1heFl1dlNpemVzW3NpemVMaW1pdF07Ci0gICAgICAgICAgICAgICAgICAgIEltYWdlUmVhZGVyIHRhcmdldCA9IEltYWdlUmVhZGVyLm5ld0luc3RhbmNlKAotICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0U2l6ZS5nZXRXaWR0aCgpLCB0YXJnZXRTaXplLmdldEhlaWdodCgpLCBZVVYsIG51bUJ1ZmZlcnMpOwotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0T25JbWFnZUF2YWlsYWJsZUxpc3RlbmVyKGltYWdlRHJvcHBlckxpc3RlbmVyLCBtSGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgICAgIG91dHB1dFN1cmZhY2VzLmFkZCh0YXJnZXQuZ2V0U3VyZmFjZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgeXV2VGFyZ2V0cy5hZGQodGFyZ2V0KTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgUkFXOiB7Ci0gICAgICAgICAgICAgICAgICAgIFNpemUgdGFyZ2V0U2l6ZSA9IG1heFNpemVzLm1heFJhd1NpemU7Ci0gICAgICAgICAgICAgICAgICAgIEltYWdlUmVhZGVyIHRhcmdldCA9IEltYWdlUmVhZGVyLm5ld0luc3RhbmNlKAotICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0U2l6ZS5nZXRXaWR0aCgpLCB0YXJnZXRTaXplLmdldEhlaWdodCgpLCBSQVcsIG51bUJ1ZmZlcnMpOwotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0T25JbWFnZUF2YWlsYWJsZUxpc3RlbmVyKGltYWdlRHJvcHBlckxpc3RlbmVyLCBtSGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgICAgIG91dHB1dFN1cmZhY2VzLmFkZCh0YXJnZXQuZ2V0U3VyZmFjZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgcmF3VGFyZ2V0cy5hZGQodGFyZ2V0KTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGZhaWwoIlVua25vd24gb3V0cHV0IGZvcm1hdCAiICsgZm9ybWF0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTE2MTgsNiArMjA2NiwzMSBAQAogICAgICAgICByZXR1cm4gbmV3IFNpemUobWF4UHJvZmlsZS52aWRlb0ZyYW1lV2lkdGgsIG1heFByb2ZpbGUudmlkZW9GcmFtZUhlaWdodCk7CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgU2l6ZSBnZXRNYXhFeHRlcm5hbFJlY29yZGluZ1NpemUoCisgICAgICAgICAgICBTdHJpbmcgY2FtZXJhSWQsIFN0cmVhbUNvbmZpZ3VyYXRpb25NYXAgY29uZmlnKSB7CisgICAgICAgIGZpbmFsIFNpemUgRlVMTEhEID0gbmV3IFNpemUoMTkyMCwgMTA4MCk7CisKKyAgICAgICAgU2l6ZVtdIHZpZGVvU2l6ZUFyciA9IGNvbmZpZy5nZXRPdXRwdXRTaXplcyhhbmRyb2lkLm1lZGlhLk1lZGlhUmVjb3JkZXIuY2xhc3MpOworICAgICAgICBMaXN0PFNpemU+IHNpemVzID0gbmV3IEFycmF5TGlzdDxTaXplPigpOworICAgICAgICBmb3IgKFNpemUgc3o6IHZpZGVvU2l6ZUFycikgeworICAgICAgICAgICAgaWYgKHN6LmdldFdpZHRoKCkgPD0gRlVMTEhELmdldFdpZHRoKCkgJiYgc3ouZ2V0SGVpZ2h0KCkgPD0gRlVMTEhELmdldEhlaWdodCgpKSB7CisgICAgICAgICAgICAgICAgc2l6ZXMuYWRkKHN6KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBMaXN0PFNpemU+IHZpZGVvU2l6ZXMgPSBnZXRBc2NlbmRpbmdPcmRlclNpemVzKHNpemVzLCAvKmFzY2VuZGluZyovZmFsc2UpOworICAgICAgICBmb3IgKFNpemUgc3ogOiB2aWRlb1NpemVzKSB7CisgICAgICAgICAgICBsb25nIG1pbkZyYW1lRHVyYXRpb24gPSBjb25maWcuZ2V0T3V0cHV0TWluRnJhbWVEdXJhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJlY29yZGVyLmNsYXNzLCBzeik7CisgICAgICAgICAgICAvLyBHaXZlIHNvbWUgbWFyZ2luIGZvciByb3VuZGluZyBlcnJvcgorICAgICAgICAgICAgaWYgKG1pbkZyYW1lRHVyYXRpb24gPiAoMWU5IC8gMzAuMSkpIHsKKyAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJFeHRlcm5hbCBjYW1lcmEgIiArIGNhbWVyYUlkICsgIiBoYXMgbWF4IHZpZGVvIHNpemU6IiArIHN6KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3o7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZmFpbCgiQ2FtZXJhICIgKyBjYW1lcmFJZCArICIgZG9lcyBub3Qgc3VwcG9ydCBhbnkgMzBmcHMgdmlkZW8gb3V0cHV0Iik7CisgICAgICAgIHJldHVybiBGVUxMSEQ7IC8vIGRvZXNuJ3QgbWF0dGVyIHdoYXQgc2l6ZSBpcyByZXR1cm5lZCBoZXJlCisgICAgfQorCiAgICAgLyoqCiAgICAgICogR2V0IG1heGltdW0gc2l6ZSBpbiBsaXN0IHRoYXQncyBlcXVhbCBvciBzbWFsbGVyIHRvIHRoYW4gdGhlIGJvdW5kLgogICAgICAqIFJldHVybnMgbnVsbCBpZiBubyBzaXplIGlzIHNtYWxsZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgYm91bmQuCmRpZmYgLS1naXQgYS90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9jdHMvU3RhdGljTWV0YWRhdGFUZXN0LmphdmEgYi90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9jdHMvU3RhdGljTWV0YWRhdGFUZXN0LmphdmEKaW5kZXggM2M5MmVhZi4uMDBlZDE4MCAxMDA2NDQKLS0tIGEvdGVzdHMvY2FtZXJhL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvY3RzL1N0YXRpY01ldGFkYXRhVGVzdC5qYXZhCisrKyBiL3Rlc3RzL2NhbWVyYS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL2N0cy9TdGF0aWNNZXRhZGF0YVRlc3QuamF2YQpAQCAtMjksNiArMjksNyBAQAogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5jdHMuaGVscGVycy5TdGF0aWNNZXRhZGF0YS5DaGVja0xldmVsOwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5jdHMudGVzdGNhc2VzLkNhbWVyYTJBbmRyb2lkVGVzdENhc2U7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLnBhcmFtcy5TdHJlYW1Db25maWd1cmF0aW9uTWFwOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5QYWlyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TaXplOwpAQCAtNTAsNiArNTEsNyBAQAogICogTm90ZSB0aGF0IG1vc3Qgb2YgdGhlIHRlc3RzIGluIHRoaXMgY2xhc3MgZG9uJ3QgcmVxdWlyZSBjYW1lcmEgb3Blbi4KICAqIDwvcD4KICAqLworQEFwcE1vZGVGdWxsCiBwdWJsaWMgY2xhc3MgU3RhdGljTWV0YWRhdGFUZXN0IGV4dGVuZHMgQ2FtZXJhMkFuZHJvaWRUZXN0Q2FzZSB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTdGF0aWNNZXRhZGF0YVRlc3QiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gVkVSQk9TRSA9IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpOwpAQCAtNTcsNyArNTksNyBAQAogICAgIHByaXZhdGUgU3RyaW5nIG1DYW1lcmFJZDsKIAogICAgIC8vIExhc3QgZGVmaW5lZCBjYXBhYmlsaXR5IGVudW0sIGZvciBpdGVyYXRpbmcgb3ZlciBhbGwgb2YgdGhlbQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMQVNUX0NBUEFCSUxJVFlfRU5VTSA9IFJFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19CVVJTVF9DQVBUVVJFOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMQVNUX0NBUEFCSUxJVFlfRU5VTSA9IFJFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19NT05PQ0hST01FOwogCiAgICAgLyoqCiAgICAgICogVGVzdCB0aGUgYXZhaWxhYmxlIGNhcGFiaWxpdHkgZm9yIGRpZmZlcmVudCBoYXJkd2FyZSBzdXBwb3J0IGxldmVsIGRldmljZXMuCkBAIC00MTgsNiArNDIwLDEyIEBACiAgICAgICAgICAgICBjYXNlIFJFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19ERVBUSF9PVVRQVVQ6CiAgICAgICAgICAgICAgICAgLy8gVGVzdGVkIGluIEV4dGVuZGVkQ2FtZXJhY2hhcmFjdGVyaXN0aWNzVGVzdAogICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGNhc2UgUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX0NPTlNUUkFJTkVEX0hJR0hfU1BFRURfVklERU86CisgICAgICAgICAgICBjYXNlIFJFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19NT1RJT05fVFJBQ0tJTkc6CisgICAgICAgICAgICBjYXNlIFJFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19MT0dJQ0FMX01VTFRJX0NBTUVSQToKKyAgICAgICAgICAgIGNhc2UgUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX01PTk9DSFJPTUU6CisgICAgICAgICAgICAgICAgLy8gVGVzdGVkIGluIEV4dGVuZGVkQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzVGVzdAorICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgY2FwYWJpbGl0eU5hbWUgPSAiVW5rbm93biI7CiAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJVbmtub3duIGNhcGFiaWxpdHkgc2V0OiAlZCIsIGNhcGFiaWxpdHkpLApkaWZmIC0tZ2l0IGEvdGVzdHMvY2FtZXJhL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvY3RzL1N0aWxsQ2FwdHVyZVRlc3QuamF2YSBiL3Rlc3RzL2NhbWVyYS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL2N0cy9TdGlsbENhcHR1cmVUZXN0LmphdmEKaW5kZXggOWY1MWZkZi4uZjMyN2IzMCAxMDA2NDQKLS0tIGEvdGVzdHMvY2FtZXJhL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvY3RzL1N0aWxsQ2FwdHVyZVRlc3QuamF2YQorKysgYi90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9jdHMvU3RpbGxDYXB0dXJlVGVzdC5qYXZhCkBAIC0yOSw2ICsyOSw4IEBACiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhcHR1cmVSZXF1ZXN0OwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYXB0dXJlUmVzdWx0OwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5EbmdDcmVhdG9yOworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uTG9jYXRpb247CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbk1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5JbWFnZVJlYWRlcjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuUGFpcjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU2l6ZTsKQEAgLTM5LDYgKzQxLDcgQEAKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIucGFyYW1zLk1ldGVyaW5nUmVjdGFuZ2xlOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuSW1hZ2U7CiBpbXBvcnQgYW5kcm9pZC5vcy5Db25kaXRpb25WYXJpYWJsZTsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuUmFuZ2U7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlJhdGlvbmFsOwpAQCAtNTIsNiArNTUsNyBAQAogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKK0BBcHBNb2RlRnVsbAogcHVibGljIGNsYXNzIFN0aWxsQ2FwdHVyZVRlc3QgZXh0ZW5kcyBDYW1lcmEyU3VyZmFjZVZpZXdUZXN0Q2FzZSB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTdGlsbENhcHR1cmVUZXN0IjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFZFUkJPU0UgPSBMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5WRVJCT1NFKTsKQEAgLTUwMyw2ICs1MDcsOTQgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBUZXN0IGZvY2FsIGxlbmd0aCBjb250cm9scy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9jYWxMZW5ndGhzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoU3RyaW5nIGlkIDogbUNhbWVyYUlkcykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBvcGVuRGV2aWNlKGlkKTsKKyAgICAgICAgICAgICAgICBpZiAobVN0YXRpY0luZm8uaXNIYXJkd2FyZUxldmVsTGVnYWN5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiQ2FtZXJhICIgKyBpZCArICIgaXMgbGVnYWN5LCBza2lwcGluZyIpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFtU3RhdGljSW5mby5pc0NvbG9yT3V0cHV0U3VwcG9ydGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiQ2FtZXJhICIgKyBpZCArICIgZG9lcyBub3Qgc3VwcG9ydCBjb2xvciBvdXRwdXRzLCBza2lwcGluZyIpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1TdGF0aWNJbmZvLmlzRXh0ZXJuYWxDYW1lcmEoKSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJDYW1lcmEgIiArIGlkICsgIiBpcyBleHRlcm5hbCwgc2tpcHBpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvY2FsTGVuZ3RoVGVzdEJ5Q2FtZXJhKCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGNsb3NlRGV2aWNlKCk7CisgICAgICAgICAgICAgICAgY2xvc2VJbWFnZVJlYWRlcigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGZvY2FsTGVuZ3RoVGVzdEJ5Q2FtZXJhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZsb2F0W10gZm9jYWxMZW5ndGhzID0gbVN0YXRpY0luZm8uZ2V0QXZhaWxhYmxlRm9jYWxMZW5ndGhzQ2hlY2tlZCgpOworICAgICAgICBpbnQgbnVtU3RpbGxDYXB0dXJlcyA9IGZvY2FsTGVuZ3Rocy5sZW5ndGg7CisKKyAgICAgICAgU2l6ZSBtYXhTdGlsbFN6ID0gbU9yZGVyZWRTdGlsbFNpemVzLmdldCgwKTsKKyAgICAgICAgU2l6ZSBtYXhQcmV2aWV3U3ogPSBtT3JkZXJlZFByZXZpZXdTaXplcy5nZXQoMCk7CisgICAgICAgIFNpbXBsZUNhcHR1cmVDYWxsYmFjayByZXN1bHRMaXN0ZW5lciA9IG5ldyBTaW1wbGVDYXB0dXJlQ2FsbGJhY2soKTsKKyAgICAgICAgU2ltcGxlSW1hZ2VSZWFkZXJMaXN0ZW5lciBpbWFnZUxpc3RlbmVyID0gbmV3IFNpbXBsZUltYWdlUmVhZGVyTGlzdGVuZXIoKTsKKyAgICAgICAgQ2FwdHVyZVJlcXVlc3QuQnVpbGRlciBwcmV2aWV3UmVxdWVzdCA9CisgICAgICAgICAgICAgICAgbUNhbWVyYS5jcmVhdGVDYXB0dXJlUmVxdWVzdChDYW1lcmFEZXZpY2UuVEVNUExBVEVfUFJFVklFVyk7CisgICAgICAgIENhcHR1cmVSZXF1ZXN0LkJ1aWxkZXIgc3RpbGxSZXF1ZXN0ID0KKyAgICAgICAgICAgICAgICBtQ2FtZXJhLmNyZWF0ZUNhcHR1cmVSZXF1ZXN0KENhbWVyYURldmljZS5URU1QTEFURV9TVElMTF9DQVBUVVJFKTsKKyAgICAgICAgU2l6ZSB0aHVtYm5haWxTaXplID0gbmV3IFNpemUoMCwgMCk7CisgICAgICAgIExvY2F0aW9uIHNUZXN0TG9jYXRpb24gPSBuZXcgTG9jYXRpb24oTG9jYXRpb25NYW5hZ2VyLkdQU19QUk9WSURFUik7CisgICAgICAgIHNUZXN0TG9jYXRpb24uc2V0VGltZSgxMTk5MTQ1NjAwMDAwTCk7CisgICAgICAgIHNUZXN0TG9jYXRpb24uc2V0TGF0aXR1ZGUoMzcuNzM2MDcxKTsKKyAgICAgICAgc1Rlc3RMb2NhdGlvbi5zZXRMb25naXR1ZGUoLTEyMi40NDE5ODMpOworICAgICAgICBzVGVzdExvY2F0aW9uLnNldEFsdGl0dWRlKDIxLjApOworICAgICAgICBFeGlmVGVzdERhdGEgZXhpZlRlc3REYXRhID0gbmV3IEV4aWZUZXN0RGF0YSgKKyAgICAgICAgICAgICAgICAvKiBncHNMb2NhdGlvbiAqLyBzVGVzdExvY2F0aW9uLAorICAgICAgICAgICAgICAgIC8qIG9yaWVudGF0aW9uICovIDAsCisgICAgICAgICAgICAgICAgLyoganBnUXVhbGl0eSAqLyAoYnl0ZSkgODAsCisgICAgICAgICAgICAgICAgLyogdGh1bWJuYWlsUXVhbGl0eSAqLyAoYnl0ZSkgNzUpOworICAgICAgICBzZXRKcGVnS2V5cyhzdGlsbFJlcXVlc3QsIGV4aWZUZXN0RGF0YSwgdGh1bWJuYWlsU2l6ZSwgbUNvbGxlY3Rvcik7CisgICAgICAgIENhcHR1cmVSZXN1bHQgcmVzdWx0OworCisgICAgICAgIC8vIFNldCB0aGUgbWF4IG51bWJlciBvZiBpbWFnZXMgdG8gbnVtYmVyIG9mIGZvY2FsIGxlbmd0aHMgc3VwcG9ydGVkCisgICAgICAgIHByZXBhcmVTdGlsbENhcHR1cmVBbmRTdGFydFByZXZpZXcocHJldmlld1JlcXVlc3QsIHN0aWxsUmVxdWVzdCwgbWF4UHJldmlld1N6LAorICAgICAgICAgICAgICAgIG1heFN0aWxsU3osIHJlc3VsdExpc3RlbmVyLCBmb2NhbExlbmd0aHMubGVuZ3RoLCBpbWFnZUxpc3RlbmVyKTsKKworICAgICAgICBmb3IoZmxvYXQgZm9jYWxMZW5ndGggOiBmb2NhbExlbmd0aHMpIHsKKworICAgICAgICAgICAgcHJldmlld1JlcXVlc3Quc2V0KENhcHR1cmVSZXF1ZXN0LkxFTlNfRk9DQUxfTEVOR1RILCBmb2NhbExlbmd0aCk7CisgICAgICAgICAgICBtU2Vzc2lvbi5zZXRSZXBlYXRpbmdSZXF1ZXN0KHByZXZpZXdSZXF1ZXN0LmJ1aWxkKCksIHJlc3VsdExpc3RlbmVyLCBtSGFuZGxlcik7CisgICAgICAgICAgICB3YWl0Rm9yU2V0dGluZ3NBcHBsaWVkKHJlc3VsdExpc3RlbmVyLCBOVU1fRlJBTUVTX1dBSVRFRF9GT1JfVU5LTk9XTl9MQVRFTkNZKTsKKyAgICAgICAgICAgIHdhaXRGb3JSZXN1bHRWYWx1ZShyZXN1bHRMaXN0ZW5lciwgQ2FwdHVyZVJlc3VsdC5MRU5TX1NUQVRFLAorICAgICAgICAgICAgICAgICAgICBDYXB0dXJlUmVzdWx0LkxFTlNfU1RBVEVfU1RBVElPTkFSWSwgTlVNX1JFU1VMVFNfV0FJVF9USU1FT1VUKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdExpc3RlbmVyLmdldENhcHR1cmVSZXN1bHQoV0FJVF9GT1JfUkVTVUxUX1RJTUVPVVRfTVMpOworICAgICAgICAgICAgbUNvbGxlY3Rvci5leHBlY3RFcXVhbHMoIkZvY2FsIGxlbmd0aCBpbiBwcmV2aWV3IHJlc3VsdCBhbmQgcmVxdWVzdCBzaG91bGQgYmUgdGhlIHNhbWUiLAorICAgICAgICAgICAgICAgICAgICBwcmV2aWV3UmVxdWVzdC5nZXQoQ2FwdHVyZVJlcXVlc3QuTEVOU19GT0NBTF9MRU5HVEgpLAorICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0KENhcHR1cmVSZXN1bHQuTEVOU19GT0NBTF9MRU5HVEgpKTsKKworICAgICAgICAgICAgc3RpbGxSZXF1ZXN0LnNldChDYXB0dXJlUmVxdWVzdC5MRU5TX0ZPQ0FMX0xFTkdUSCwgZm9jYWxMZW5ndGgpOworICAgICAgICAgICAgQ2FwdHVyZVJlcXVlc3QgcmVxdWVzdCA9IHN0aWxsUmVxdWVzdC5idWlsZCgpOworICAgICAgICAgICAgcmVzdWx0TGlzdGVuZXIgPSBuZXcgU2ltcGxlQ2FwdHVyZUNhbGxiYWNrKCk7CisgICAgICAgICAgICBtU2Vzc2lvbi5jYXB0dXJlKHJlcXVlc3QsIHJlc3VsdExpc3RlbmVyLCBtSGFuZGxlcik7CisgICAgICAgICAgICByZXN1bHQgPSByZXN1bHRMaXN0ZW5lci5nZXRDYXB0dXJlUmVzdWx0KFdBSVRfRk9SX1JFU1VMVF9USU1FT1VUX01TKTsKKyAgICAgICAgICAgIG1Db2xsZWN0b3IuZXhwZWN0RXF1YWxzKAorICAgICAgICAgICAgICAgICAgICAiRm9jYWwgbGVuZ3RoIGluIHN0aWxsIGNhcHR1cmUgcmVzdWx0IGFuZCByZXF1ZXN0IHNob3VsZCBiZSB0aGUgc2FtZSIsCisgICAgICAgICAgICAgICAgICAgIHN0aWxsUmVxdWVzdC5nZXQoQ2FwdHVyZVJlcXVlc3QuTEVOU19GT0NBTF9MRU5HVEgpLAorICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0KENhcHR1cmVSZXN1bHQuTEVOU19GT0NBTF9MRU5HVEgpKTsKKworICAgICAgICAgICAgSW1hZ2UgaW1hZ2UgPSBpbWFnZUxpc3RlbmVyLmdldEltYWdlKENBUFRVUkVfSU1BR0VfVElNRU9VVF9NUyk7CisKKyAgICAgICAgICAgIHZhbGlkYXRlSnBlZ0NhcHR1cmUoaW1hZ2UsIG1heFN0aWxsU3opOworICAgICAgICAgICAgdmVyaWZ5SnBlZ0tleXMoaW1hZ2UsIHJlc3VsdCwgbWF4U3RpbGxTeiwgdGh1bWJuYWlsU2l6ZSwgZXhpZlRlc3REYXRhLAorICAgICAgICAgICAgICAgICAgICBtU3RhdGljSW5mbywgbUNvbGxlY3Rvcik7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgogICAgICAqIFN0YXJ0IHByZXZpZXcsdGFrZSBhIHBpY3R1cmUgYW5kIHRlc3QgcHJldmlldyBpcyBzdGlsbCBydW5uaW5nIGFmdGVyIHNuYXBzaG90CiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHByZXZpZXdQZXJzaXN0ZW5jZVRlc3RCeUNhbWVyYSgpIHRocm93cyBFeGNlcHRpb24gewpAQCAtODAyLDYgKzg5NCw4IEBACiAgICAgICAgIFNpbXBsZUNhcHR1cmVDYWxsYmFjayByZXN1bHRMaXN0ZW5lciA9IG5ldyBTaW1wbGVDYXB0dXJlQ2FsbGJhY2soKTsKICAgICAgICAgU2ltcGxlSW1hZ2VSZWFkZXJMaXN0ZW5lciBpbWFnZUxpc3RlbmVyID0gbmV3IFNpbXBsZUltYWdlUmVhZGVyTGlzdGVuZXIoKTsKIAorICAgICAgICBTaXplIFFDSUYgPSBuZXcgU2l6ZSgxNzYsIDE0NCk7CisgICAgICAgIFNpemUgRlVMTF9IRCA9IG5ldyBTaXplKDE5MjAsIDEwODApOwogICAgICAgICBmb3IgKFNpemUgc3RpbGxTeiA6IG1PcmRlcmVkU3RpbGxTaXplcykKICAgICAgICAgICAgIGZvciAoU2l6ZSBwcmV2aWV3U3ogOiBtT3JkZXJlZFByZXZpZXdTaXplcykgewogICAgICAgICAgICAgICAgIGlmIChWRVJCT1NFKSB7CkBAIC04MDksNiArOTAzLDIwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHdpdGggcHJldmlldyBzaXplICIgKyBwcmV2aWV3U3oudG9TdHJpbmcoKSArICIgZm9yIGNhbWVyYSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtQ2FtZXJhLmdldElkKCkpOwogICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFNraXAgdGVzdGluZyBRQ0lGICsgPkZ1bGxIRCBjb21iaW5hdGlvbnMKKyAgICAgICAgICAgICAgICBpZiAoc3RpbGxTei5lcXVhbHMoUUNJRikgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICgocHJldmlld1N6LmdldFdpZHRoKCkgPiBGVUxMX0hELmdldFdpZHRoKCkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgKHByZXZpZXdTei5nZXRIZWlnaHQoKSA+IEZVTExfSEQuZ2V0SGVpZ2h0KCkpKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAocHJldmlld1N6LmVxdWFscyhRQ0lGKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKChzdGlsbFN6LmdldFdpZHRoKCkgPiBGVUxMX0hELmdldFdpZHRoKCkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgKHN0aWxsU3ouZ2V0SGVpZ2h0KCkgPiBGVUxMX0hELmdldEhlaWdodCgpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgQ2FwdHVyZVJlcXVlc3QuQnVpbGRlciBwcmV2aWV3UmVxdWVzdCA9CiAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhLmNyZWF0ZUNhcHR1cmVSZXF1ZXN0KENhbWVyYURldmljZS5URU1QTEFURV9QUkVWSUVXKTsKICAgICAgICAgICAgICAgICBDYXB0dXJlUmVxdWVzdC5CdWlsZGVyIHN0aWxsUmVxdWVzdCA9CmRpZmYgLS1naXQgYS90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9jdHMvU3VyZmFjZVZpZXdQcmV2aWV3VGVzdC5qYXZhIGIvdGVzdHMvY2FtZXJhL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvY3RzL1N1cmZhY2VWaWV3UHJldmlld1Rlc3QuamF2YQppbmRleCAzNGQyOWU1Li5hMWE3ZTAyIDEwMDY0NAotLS0gYS90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9jdHMvU3VyZmFjZVZpZXdQcmV2aWV3VGVzdC5qYXZhCisrKyBiL3Rlc3RzL2NhbWVyYS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL2N0cy9TdXJmYWNlVmlld1ByZXZpZXdUZXN0LmphdmEKQEAgLTM1LDYgKzM1LDcgQEAKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuY3RzLkNhbWVyYVRlc3RVdGlscy5TaW1wbGVDYXB0dXJlQ2FsbGJhY2s7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLmN0cy50ZXN0Y2FzZXMuQ2FtZXJhMlN1cmZhY2VWaWV3VGVzdENhc2U7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLnBhcmFtcy5PdXRwdXRDb25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5QYWlyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5SYW5nZTsKQEAgLTQyLDcgKzQzLDcgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlcjsKIAogaW1wb3J0IG9yZy5tb2NraXRvLkFyZ3VtZW50Q2FwdG9yOwotaW1wb3J0IG9yZy5tb2NraXRvLmNvbXBhdC5Bcmd1bWVudE1hdGNoZXI7CitpbXBvcnQgb3JnLm1vY2tpdG8uQXJndW1lbnRNYXRjaGVyOwogCiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8uKjsKIApAQCAtNTMsNiArNTQsNyBAQAogLyoqCiAgKiBDYW1lcmFEZXZpY2UgcHJldmlldyB0ZXN0IGJ5IHVzaW5nIFN1cmZhY2VWaWV3LgogICovCitAQXBwTW9kZUZ1bGwKIHB1YmxpYyBjbGFzcyBTdXJmYWNlVmlld1ByZXZpZXdUZXN0IGV4dGVuZHMgQ2FtZXJhMlN1cmZhY2VWaWV3VGVzdENhc2UgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3VyZmFjZVZpZXdQcmV2aWV3VGVzdCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBWRVJCT1NFID0gTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSk7CkBAIC04NzEsMTAgKzg3MywxMCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBjbGFzcyBJc0NhcHR1cmVSZXN1bHRWYWxpZCBleHRlbmRzIEFyZ3VtZW50TWF0Y2hlcjxUb3RhbENhcHR1cmVSZXN1bHQ+IHsKKyAgICBwcml2YXRlIGNsYXNzIElzQ2FwdHVyZVJlc3VsdFZhbGlkIGltcGxlbWVudHMgQXJndW1lbnRNYXRjaGVyPFRvdGFsQ2FwdHVyZVJlc3VsdD4gewogICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlc09iamVjdChPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgICBUb3RhbENhcHR1cmVSZXN1bHQgcmVzdWx0ID0gKFRvdGFsQ2FwdHVyZVJlc3VsdClvYmo7CisgICAgICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoVG90YWxDYXB0dXJlUmVzdWx0IG9iaikgeworICAgICAgICAgICAgVG90YWxDYXB0dXJlUmVzdWx0IHJlc3VsdCA9IG9iajsKICAgICAgICAgICAgIExvbmcgdGltZVN0YW1wID0gcmVzdWx0LmdldChDYXB0dXJlUmVzdWx0LlNFTlNPUl9USU1FU1RBTVApOwogICAgICAgICAgICAgaWYgKHRpbWVTdGFtcCAhPSBudWxsICYmIHRpbWVTdGFtcC5sb25nVmFsdWUoKSA+IDBMKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CmRpZmYgLS1naXQgYS90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9jdHMvcnMvQWxsb2NhdGlvbkNhY2hlLmphdmEgYi90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9jdHMvcnMvQWxsb2NhdGlvbkNhY2hlLmphdmEKaW5kZXggYjg5ZjliYi4uOThmMTAzMiAxMDA2NDQKLS0tIGEvdGVzdHMvY2FtZXJhL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvY3RzL3JzL0FsbG9jYXRpb25DYWNoZS5qYXZhCisrKyBiL3Rlc3RzL2NhbWVyYS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL2N0cy9ycy9BbGxvY2F0aW9uQ2FjaGUuamF2YQpAQCAtMjIzLDcgKzIyMyw3IEBACiAgICAgICAgICAgICBpZiAob3RoZXIgaW5zdGFuY2VvZiBBbGxvY2F0aW9uS2V5KXsKICAgICAgICAgICAgICAgICBBbGxvY2F0aW9uS2V5IG90aGVyS2V5ID0gKEFsbG9jYXRpb25LZXkpIG90aGVyOwogCi0gICAgICAgICAgICAgICAgcmV0dXJuIG90aGVyS2V5Lm1UeXBlLmVxdWFscyhtVHlwZSkgJiYgb3RoZXJLZXkubVVzYWdlID09IG90aGVyS2V5Lm1Vc2FnZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gb3RoZXJLZXkubVR5cGUuZXF1YWxzKG1UeXBlKSAmJiBvdGhlcktleS5tVXNhZ2UgPT0gbVVzYWdlOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9jdHMvcnMvUmF3Q29udmVydGVyLmphdmEgYi90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9jdHMvcnMvUmF3Q29udmVydGVyLmphdmEKaW5kZXggMGFjNWU2NC4uZmEwNTE5OSAxMDA2NDQKLS0tIGEvdGVzdHMvY2FtZXJhL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvY3RzL3JzL1Jhd0NvbnZlcnRlci5qYXZhCisrKyBiL3Rlc3RzL2NhbWVyYS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL2N0cy9ycy9SYXdDb252ZXJ0ZXIuamF2YQpAQCAtOTEsMTIgKzkxLDIyIEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3BhcnNlSW50QXJyYXkgc1N0YW5kYXJkSWxsdW1pbmFudHMgPSBuZXcgU3BhcnNlSW50QXJyYXkoKTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9fSUxMVU1JTkFOVCA9IC0xOwogICAgIHN0YXRpYyB7CisgICAgICAgIHNTdGFuZGFyZElsbHVtaW5hbnRzLmFwcGVuZChDYW1lcmFNZXRhZGF0YS5TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQxX0NMT1VEWV9XRUFUSEVSLAorICAgICAgICAgICAgICAgIDY1MDQpOwogICAgICAgICBzU3RhbmRhcmRJbGx1bWluYW50cy5hcHBlbmQoQ2FtZXJhTWV0YWRhdGEuU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMV9EQVlMSUdIVCwgNjUwNCk7CiAgICAgICAgIHNTdGFuZGFyZElsbHVtaW5hbnRzLmFwcGVuZChDYW1lcmFNZXRhZGF0YS5TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQxX0Q2NSwgNjUwNCk7CisgICAgICAgIHNTdGFuZGFyZElsbHVtaW5hbnRzLmFwcGVuZChDYW1lcmFNZXRhZGF0YS5TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQxX0ZJTkVfV0VBVEhFUiwgNTAwMyk7CiAgICAgICAgIHNTdGFuZGFyZElsbHVtaW5hbnRzLmFwcGVuZChDYW1lcmFNZXRhZGF0YS5TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQxX0Q1MCwgNTAwMyk7CisgICAgICAgIHNTdGFuZGFyZElsbHVtaW5hbnRzLmFwcGVuZChDYW1lcmFNZXRhZGF0YS5TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQxX0ZMQVNILCA1NTAzKTsKICAgICAgICAgc1N0YW5kYXJkSWxsdW1pbmFudHMuYXBwZW5kKENhbWVyYU1ldGFkYXRhLlNFTlNPUl9SRUZFUkVOQ0VfSUxMVU1JTkFOVDFfRDU1LCA1NTAzKTsKKyAgICAgICAgc1N0YW5kYXJkSWxsdW1pbmFudHMuYXBwZW5kKENhbWVyYU1ldGFkYXRhLlNFTlNPUl9SRUZFUkVOQ0VfSUxMVU1JTkFOVDFfU0hBREUsIDc1MDQpOwogICAgICAgICBzU3RhbmRhcmRJbGx1bWluYW50cy5hcHBlbmQoQ2FtZXJhTWV0YWRhdGEuU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMV9ENzUsIDc1MDQpOworICAgICAgICBzU3RhbmRhcmRJbGx1bWluYW50cy5hcHBlbmQoQ2FtZXJhTWV0YWRhdGEuU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMV9JU09fU1RVRElPX1RVTkdTVEVOLAorICAgICAgICAgICAgICAgIDI4NTYpOworICAgICAgICBzU3RhbmRhcmRJbGx1bWluYW50cy5hcHBlbmQoQ2FtZXJhTWV0YWRhdGEuU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMV9UVU5HU1RFTiwgMjg1Nik7CiAgICAgICAgIHNTdGFuZGFyZElsbHVtaW5hbnRzLmFwcGVuZChDYW1lcmFNZXRhZGF0YS5TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQxX1NUQU5EQVJEX0EsIDI4NTYpOworICAgICAgICBzU3RhbmRhcmRJbGx1bWluYW50cy5hcHBlbmQoCisgICAgICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEuU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMV9EQVlfV0hJVEVfRkxVT1JFU0NFTlQsIDQ4NzQpOwogICAgICAgICBzU3RhbmRhcmRJbGx1bWluYW50cy5hcHBlbmQoQ2FtZXJhTWV0YWRhdGEuU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMV9TVEFOREFSRF9CLCA0ODc0KTsKICAgICAgICAgc1N0YW5kYXJkSWxsdW1pbmFudHMuYXBwZW5kKENhbWVyYU1ldGFkYXRhLlNFTlNPUl9SRUZFUkVOQ0VfSUxMVU1JTkFOVDFfU1RBTkRBUkRfQywgNjc3NCk7CiAgICAgICAgIHNTdGFuZGFyZElsbHVtaW5hbnRzLmFwcGVuZCgKQEAgLTEwNSw3ICsxMTUsNyBAQAogICAgICAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhLlNFTlNPUl9SRUZFUkVOQ0VfSUxMVU1JTkFOVDFfQ09PTF9XSElURV9GTFVPUkVTQ0VOVCwgNDIzMCk7CiAgICAgICAgIHNTdGFuZGFyZElsbHVtaW5hbnRzLmFwcGVuZCgKICAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YS5TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQxX1dISVRFX0ZMVU9SRVNDRU5ULCAzNDUwKTsKLSAgICAgICAgLy8gVE9ETzogQWRkIHRoZSByZXN0IG9mIHRoZSBpbGx1bWluYW50cyBpbmNsdWRlZCBpbiB0aGUgTGlnaHRTb3VyY2UgRVhJRiB0YWcuCisgICAgICAgIHNTdGFuZGFyZElsbHVtaW5hbnRzLmFwcGVuZChDYW1lcmFNZXRhZGF0YS5TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQxX0ZMVU9SRVNDRU5ULCAyOTQwKTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL3Rlc3RzL2NhbWVyYS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL2N0cy90ZXN0Y2FzZXMvQ2FtZXJhMkFuZHJvaWRUZXN0Q2FzZS5qYXZhIGIvdGVzdHMvY2FtZXJhL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvY3RzL3Rlc3RjYXNlcy9DYW1lcmEyQW5kcm9pZFRlc3RDYXNlLmphdmEKaW5kZXggMDEwOGVlNi4uNDUxM2M1YyAxMDA2NDQKLS0tIGEvdGVzdHMvY2FtZXJhL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvY3RzL3Rlc3RjYXNlcy9DYW1lcmEyQW5kcm9pZFRlc3RDYXNlLmphdmEKKysrIGIvdGVzdHMvY2FtZXJhL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvY3RzL3Rlc3RjYXNlcy9DYW1lcmEyQW5kcm9pZFRlc3RDYXNlLmphdmEKQEAgLTI3LDYgKzI3LDcgQEAKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FtZXJhRGV2aWNlOwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYW1lcmFNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYXB0dXJlUmVxdWVzdDsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIucGFyYW1zLk91dHB1dENvbmZpZ3VyYXRpb247CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNpemU7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLmN0cy5DYW1lcmFUZXN0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLmN0cy5oZWxwZXJzLkNhbWVyYUVycm9yQ29sbGVjdG9yOwpAQCAtNDgsNiArNDksOCBAQAogCiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIHB1YmxpYyBjbGFzcyBDYW1lcmEyQW5kcm9pZFRlc3RDYXNlIGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKQEAgLTY2LDYgKzY5LDcgQEAKICAgICBwcm90ZWN0ZWQgQmxvY2tpbmdTZXNzaW9uQ2FsbGJhY2sgbUNhbWVyYVNlc3Npb25MaXN0ZW5lcjsKICAgICBwcm90ZWN0ZWQgQmxvY2tpbmdTdGF0ZUNhbGxiYWNrIG1DYW1lcmFMaXN0ZW5lcjsKICAgICBwcm90ZWN0ZWQgU3RyaW5nW10gbUNhbWVyYUlkczsKKyAgICBwcm90ZWN0ZWQgSGFzaE1hcDxTdHJpbmcsIFN0YXRpY01ldGFkYXRhPiBtQWxsU3RhdGljSW5mbzsKICAgICBwcm90ZWN0ZWQgSW1hZ2VSZWFkZXIgbVJlYWRlcjsKICAgICBwcm90ZWN0ZWQgU3VyZmFjZSBtUmVhZGVyU3VyZmFjZTsKICAgICBwcm90ZWN0ZWQgSGFuZGxlciBtSGFuZGxlcjsKQEAgLTEwOSwxMCArMTEzLDI2IEBACiAgICAgICAgIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIobUhhbmRsZXJUaHJlYWQuZ2V0TG9vcGVyKCkpOwogICAgICAgICBtQ2FtZXJhTGlzdGVuZXIgPSBuZXcgQmxvY2tpbmdTdGF0ZUNhbGxiYWNrKCk7CiAgICAgICAgIG1Db2xsZWN0b3IgPSBuZXcgQ2FtZXJhRXJyb3JDb2xsZWN0b3IoKTsKKworICAgICAgICBtQWxsU3RhdGljSW5mbyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RhdGljTWV0YWRhdGE+KCk7CisgICAgICAgIGZvciAoU3RyaW5nIGNhbWVyYUlkIDogbUNhbWVyYUlkcykgeworICAgICAgICAgICAgU3RhdGljTWV0YWRhdGEgc3RhdGljTWV0YWRhdGEgPSBuZXcgU3RhdGljTWV0YWRhdGEoCisgICAgICAgICAgICAgICAgICAgIG1DYW1lcmFNYW5hZ2VyLmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjYW1lcmFJZCksCisgICAgICAgICAgICAgICAgICAgIENoZWNrTGV2ZWwuQVNTRVJULCAvKmNvbGxlY3RvciovbnVsbCk7CisgICAgICAgICAgICBtQWxsU3RhdGljSW5mby5wdXQoY2FtZXJhSWQsIHN0YXRpY01ldGFkYXRhKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1tdIGNhbWVyYUlkc1Bvc3RUZXN0ID0gbUNhbWVyYU1hbmFnZXIuZ2V0Q2FtZXJhSWRMaXN0KCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoIkNhbWVyYSBpZHMgc2hvdWxkbid0IGJlIG51bGwiLCBjYW1lcmFJZHNQb3N0VGVzdCk7CisgICAgICAgIExvZy5pKFRBRywgIkNhbWVyYSBpZHMgaW4gc2V0dXA6IiArIEFycmF5cy50b1N0cmluZyhtQ2FtZXJhSWRzKSk7CisgICAgICAgIExvZy5pKFRBRywgIkNhbWVyYSBpZHMgaW4gdGVhckRvd246IiArIEFycmF5cy50b1N0cmluZyhjYW1lcmFJZHNQb3N0VGVzdCkpOworICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgICJOdW1iZXIgb2YgY2FtZXJhcyBjaGFuZ2VkIGZyb20gIiArIG1DYW1lcmFJZHMubGVuZ3RoICsgIiB0byAiICsKKyAgICAgICAgICAgICAgICBjYW1lcmFJZHNQb3N0VGVzdC5sZW5ndGgsCisgICAgICAgICAgICAgICAgbUNhbWVyYUlkcy5sZW5ndGggPT0gY2FtZXJhSWRzUG9zdFRlc3QubGVuZ3RoKTsKICAgICAgICAgbUhhbmRsZXJUaHJlYWQucXVpdFNhZmVseSgpOwogICAgICAgICBtSGFuZGxlciA9IG51bGw7CiAgICAgICAgIGNsb3NlRGVmYXVsdEltYWdlUmVhZGVyKCk7CkBAIC0yMTcsNiArMjM3LDE4IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogQ3JlYXRlIGEge0BsaW5rICNDYW1lcmFDYXB0dXJlU2Vzc2lvbn0gdXNpbmcgdGhlIGN1cnJlbnRseSBvcGVuIGNhbWVyYSB3aXRoCisgICAgICogT3V0cHV0Q29uZmlndXJhdGlvbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3V0cHV0U3VyZmFjZXMgVGhlIHNldCBvZiBvdXRwdXQgc3VyZmFjZXMgdG8gY29uZmlndXJlIGZvciB0aGlzIHNlc3Npb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVTZXNzaW9uQnlDb25maWdzKExpc3Q8T3V0cHV0Q29uZmlndXJhdGlvbj4gb3V0cHV0Q29uZmlncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1DYW1lcmFTZXNzaW9uTGlzdGVuZXIgPSBuZXcgQmxvY2tpbmdTZXNzaW9uQ2FsbGJhY2soKTsKKyAgICAgICAgbUNhbWVyYVNlc3Npb24gPSBDYW1lcmFUZXN0VXRpbHMuY29uZmlndXJlQ2FtZXJhU2Vzc2lvbldpdGhDb25maWcobUNhbWVyYSwgb3V0cHV0Q29uZmlncywKKyAgICAgICAgICAgICAgICBtQ2FtZXJhU2Vzc2lvbkxpc3RlbmVyLCBtSGFuZGxlcik7CisgICAgfQorCisgICAgLyoqCiAgICAgICogQ2xvc2UgYSB7QGxpbmsgI0NhbWVyYURldmljZSBjYW1lcmEgZGV2aWNlfSBhbmQgY2xlYXIgdGhlIGFzc29jaWF0ZWQgU3RhdGljSW5mbyBmaWVsZCBmb3IgYQogICAgICAqIGdpdmVuIGNhbWVyYSBpZC4gVGhlIGRlZmF1bHQgbUNhbWVyYUxpc3RlbmVyIGlzIHVzZWQgdG8gd2FpdCBmb3Igc3RhdGVzLgogICAgICAqIDxwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvY2FtZXJhL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvY3RzL3Rlc3RjYXNlcy9DYW1lcmEyTXVsdGlWaWV3VGVzdENhc2UuamF2YSBiL3Rlc3RzL2NhbWVyYS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL2N0cy90ZXN0Y2FzZXMvQ2FtZXJhMk11bHRpVmlld1Rlc3RDYXNlLmphdmEKaW5kZXggYTFkNjNkOC4uYWUwNmYzZCAxMDA2NDQKLS0tIGEvdGVzdHMvY2FtZXJhL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvY3RzL3Rlc3RjYXNlcy9DYW1lcmEyTXVsdGlWaWV3VGVzdENhc2UuamF2YQorKysgYi90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9jdHMvdGVzdGNhc2VzL0NhbWVyYTJNdWx0aVZpZXdUZXN0Q2FzZS5qYXZhCkBAIC02NCwxNSArNjQsMTQgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk11bHRpVmlld1Rlc3RDYXNlIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFZFUkJPU0UgPSBMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5WRVJCT1NFKTsKIAotCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBTSE9SVF9TTEVFUF9XQUlUX1RJTUVfTVMgPSAxMDA7CiAKLSAgICBwcm90ZWN0ZWQgVGV4dHVyZVZpZXdbXSBtVGV4dHVyZVZpZXcgPSBuZXcgVGV4dHVyZVZpZXdbMl07CisgICAgcHJvdGVjdGVkIFRleHR1cmVWaWV3W10gbVRleHR1cmVWaWV3ID0KKyAgICAgICAgICAgIG5ldyBUZXh0dXJlVmlld1tDYW1lcmEyTXVsdGlWaWV3Q3RzQWN0aXZpdHkuTUFYX1RFWFRVUkVfVklFV1NdOwogICAgIHByb3RlY3RlZCBTdHJpbmdbXSBtQ2FtZXJhSWRzOwogICAgIHByb3RlY3RlZCBIYW5kbGVyIG1IYW5kbGVyOwogCiAgICAgcHJpdmF0ZSBDYW1lcmFNYW5hZ2VyIG1DYW1lcmFNYW5hZ2VyOwotICAgIHByaXZhdGUgQmxvY2tpbmdTdGF0ZUNhbGxiYWNrIG1DYW1lcmFMaXN0ZW5lcjsKICAgICBwcml2YXRlIEhhbmRsZXJUaHJlYWQgbUhhbmRsZXJUaHJlYWQ7CiAgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OwogCkBAIC05NywxMCArOTYsMTAgQEAKICAgICAgICAgbUhhbmRsZXJUaHJlYWQgPSBuZXcgSGFuZGxlclRocmVhZChUQUcpOwogICAgICAgICBtSGFuZGxlclRocmVhZC5zdGFydCgpOwogICAgICAgICBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKG1IYW5kbGVyVGhyZWFkLmdldExvb3BlcigpKTsKLSAgICAgICAgbUNhbWVyYUxpc3RlbmVyID0gbmV3IEJsb2NraW5nU3RhdGVDYWxsYmFjaygpOwogICAgICAgICBDYW1lcmEyTXVsdGlWaWV3Q3RzQWN0aXZpdHkgYWN0aXZpdHkgPSAoQ2FtZXJhMk11bHRpVmlld0N0c0FjdGl2aXR5KSBtQ29udGV4dDsKLSAgICAgICAgbVRleHR1cmVWaWV3WzBdID0gYWN0aXZpdHkuZ2V0VGV4dHVyZVZpZXcoMCk7Ci0gICAgICAgIG1UZXh0dXJlVmlld1sxXSA9IGFjdGl2aXR5LmdldFRleHR1cmVWaWV3KDEpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IENhbWVyYTJNdWx0aVZpZXdDdHNBY3Rpdml0eS5NQVhfVEVYVFVSRV9WSUVXUzsgaSsrKSB7CisgICAgICAgICAgICBtVGV4dHVyZVZpZXdbaV0gPSBhY3Rpdml0eS5nZXRUZXh0dXJlVmlldyhpKTsKKyAgICAgICAgfQogICAgICAgICBhc3NlcnROb3ROdWxsKCJVbmFibGUgdG8gZ2V0IHRleHR1cmUgdmlldyIsIG1UZXh0dXJlVmlldyk7CiAgICAgICAgIG1DYW1lcmFJZE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKICAgICAgICAgaW50IG51bUNhbWVyYXMgPSBtQ2FtZXJhSWRzLmxlbmd0aDsKQEAgLTExNCw5ICsxMTMsMTYgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1tdIGNhbWVyYUlkc1Bvc3RUZXN0ID0gbUNhbWVyYU1hbmFnZXIuZ2V0Q2FtZXJhSWRMaXN0KCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoIkNhbWVyYSBpZHMgc2hvdWxkbid0IGJlIG51bGwiLCBjYW1lcmFJZHNQb3N0VGVzdCk7CisgICAgICAgIExvZy5pKFRBRywgIkNhbWVyYSBpZHMgaW4gc2V0dXA6IiArIEFycmF5cy50b1N0cmluZyhtQ2FtZXJhSWRzKSk7CisgICAgICAgIExvZy5pKFRBRywgIkNhbWVyYSBpZHMgaW4gdGVhckRvd246IiArIEFycmF5cy50b1N0cmluZyhjYW1lcmFJZHNQb3N0VGVzdCkpOworICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgICJOdW1iZXIgb2YgY2FtZXJhcyBjaGFuZ2VkIGZyb20gIiArIG1DYW1lcmFJZHMubGVuZ3RoICsgIiB0byAiICsKKyAgICAgICAgICAgICAgICBjYW1lcmFJZHNQb3N0VGVzdC5sZW5ndGgsCisgICAgICAgICAgICAgICAgbUNhbWVyYUlkcy5sZW5ndGggPT0gY2FtZXJhSWRzUG9zdFRlc3QubGVuZ3RoKTsKICAgICAgICAgbUhhbmRsZXJUaHJlYWQucXVpdFNhZmVseSgpOwogICAgICAgICBtSGFuZGxlciA9IG51bGw7Ci0gICAgICAgIG1DYW1lcmFMaXN0ZW5lciA9IG51bGw7CiAgICAgICAgIGZvciAoQ2FtZXJhSG9sZGVyIGNhbWVyYSA6IG1DYW1lcmFIb2xkZXJzKSB7CiAgICAgICAgICAgICBpZiAoY2FtZXJhLmlzT3BlbmVkKCkpIHsKICAgICAgICAgICAgICAgICBjYW1lcmEuY2xvc2UoKTsKQEAgLTI0NiwxMyArMjUyLDEzIEBACiAgICAgICAgIGNhbWVyYS5zdGFydFByZXZpZXcob3V0cHV0U3VyZmFjZXMsIGxpc3RlbmVyKTsKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgdm9pZCBzdGFydFByZXZpZXdXaXRoQ29uZmlncyhTdHJpbmcgY2FtZXJhSWQsCisgICAgcHJvdGVjdGVkIGludCBzdGFydFByZXZpZXdXaXRoQ29uZmlncyhTdHJpbmcgY2FtZXJhSWQsCiAgICAgICAgICAgICBMaXN0PE91dHB1dENvbmZpZ3VyYXRpb24+IG91dHB1dENvbmZpZ3MsCiAgICAgICAgICAgICBDYXB0dXJlQ2FsbGJhY2sgbGlzdGVuZXIpCiAgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgQ2FtZXJhSG9sZGVyIGNhbWVyYSA9IGdldENhbWVyYUhvbGRlcihjYW1lcmFJZCk7CiAgICAgICAgIGFzc2VydFRydWUoIkNhbWVyYSAiICsgY2FtZXJhSWQgKyAiIGlzIG5vdCBvcGVubmVkIiwgY2FtZXJhLmlzT3BlbmVkKCkpOwotICAgICAgICBjYW1lcmEuc3RhcnRQcmV2aWV3V2l0aENvbmZpZ3Mob3V0cHV0Q29uZmlncywgbGlzdGVuZXIpOworICAgICAgICByZXR1cm4gY2FtZXJhLnN0YXJ0UHJldmlld1dpdGhDb25maWdzKG91dHB1dENvbmZpZ3MsIGxpc3RlbmVyKTsKICAgICB9CiAKICAgICBwcm90ZWN0ZWQgdm9pZCBzdG9wUHJldmlldyhTdHJpbmcgY2FtZXJhSWQpIHRocm93cyBFeGNlcHRpb24gewpAQCAtMjYxLDExICsyNjcsMzkgQEAKICAgICAgICAgY2FtZXJhLnN0b3BQcmV2aWV3KCk7CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlT3V0cHV0Q29uZmlncyhTdHJpbmcgY2FtZXJhSWQsIExpc3Q8T3V0cHV0Q29uZmlndXJhdGlvbj4gY29uZmlncywKKyAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZU91dHB1dENvbmZpZ3MoU3RyaW5nIGNhbWVyYUlkLCBMaXN0PE91dHB1dENvbmZpZ3VyYXRpb24+IGNvbmZpZ3MsCiAgICAgICAgICAgICBDYXB0dXJlQ2FsbGJhY2sgbGlzdGVuZXIpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBDYW1lcmFIb2xkZXIgY2FtZXJhID0gZ2V0Q2FtZXJhSG9sZGVyKGNhbWVyYUlkKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiQ2FtZXJhICIgKyBjYW1lcmFJZCArICIgaXMgbm90IG9wZW5lZCIsIGNhbWVyYS5pc09wZW5lZCgpKTsKLSAgICAgICAgY2FtZXJhLnVwZGF0ZU91dHB1dENvbmZpZ3MoY29uZmlncywgbGlzdGVuZXIpOworICAgICAgICBjYW1lcmEuZmluYWxpemVPdXRwdXRDb25maWdzKGNvbmZpZ3MsIGxpc3RlbmVyKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgaW50IHVwZGF0ZVJlcGVhdGluZ1JlcXVlc3QoU3RyaW5nIGNhbWVyYUlkLCBMaXN0PE91dHB1dENvbmZpZ3VyYXRpb24+IGNvbmZpZ3MsCisgICAgICAgICAgICBDYXB0dXJlQ2FsbGJhY2sgbGlzdGVuZXIpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDYW1lcmFIb2xkZXIgY2FtZXJhID0gZ2V0Q2FtZXJhSG9sZGVyKGNhbWVyYUlkKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiQ2FtZXJhICIgKyBjYW1lcmFJZCArICIgaXMgbm90IG9wZW5lZCIsIGNhbWVyYS5pc09wZW5lZCgpKTsKKyAgICAgICAgcmV0dXJuIGNhbWVyYS51cGRhdGVSZXBlYXRpbmdSZXF1ZXN0KGNvbmZpZ3MsIGxpc3RlbmVyKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVPdXRwdXRDb25maWd1cmF0aW9uKFN0cmluZyBjYW1lcmFJZCwgT3V0cHV0Q29uZmlndXJhdGlvbiBjb25maWcpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQ2FtZXJhSG9sZGVyIGNhbWVyYSA9IGdldENhbWVyYUhvbGRlcihjYW1lcmFJZCk7CisgICAgICAgIGFzc2VydFRydWUoIkNhbWVyYSAiICsgY2FtZXJhSWQgKyAiIGlzIG5vdCBvcGVuZWQiLCBjYW1lcmEuaXNPcGVuZWQoKSk7CisgICAgICAgIGNhbWVyYS51cGRhdGVPdXRwdXRDb25maWd1cmF0aW9uKGNvbmZpZyk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgY2FwdHVyZShTdHJpbmcgY2FtZXJhSWQsIENhcHR1cmVSZXF1ZXN0IHJlcXVlc3QsIENhcHR1cmVDYWxsYmFjayBsaXN0ZW5lcikKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDYW1lcmFIb2xkZXIgY2FtZXJhID0gZ2V0Q2FtZXJhSG9sZGVyKGNhbWVyYUlkKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiQ2FtZXJhICIgKyBjYW1lcmFJZCArICIgaXMgbm90IG9wZW5lZCIsIGNhbWVyYS5pc09wZW5lZCgpKTsKKyAgICAgICAgY2FtZXJhLmNhcHR1cmUocmVxdWVzdCwgbGlzdGVuZXIpOworICAgIH0KKworICAgIHByb3RlY3RlZCBDYXB0dXJlUmVxdWVzdC5CdWlsZGVyIGdldENhcHR1cmVCdWlsZGVyKFN0cmluZyBjYW1lcmFJZCwgaW50IHRlbXBsYXRlSWQpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQ2FtZXJhSG9sZGVyIGNhbWVyYSA9IGdldENhbWVyYUhvbGRlcihjYW1lcmFJZCk7CisgICAgICAgIGFzc2VydFRydWUoIkNhbWVyYSAiICsgY2FtZXJhSWQgKyAiIGlzIG5vdCBvcGVuZWQiLCBjYW1lcmEuaXNPcGVuZWQoKSk7CisgICAgICAgIHJldHVybiBjYW1lcmEuZ2V0Q2FwdHVyZUJ1aWxkZXIodGVtcGxhdGVJZCk7CiAgICAgfQogCiAgICAgcHJvdGVjdGVkIFN0YXRpY01ldGFkYXRhIGdldFN0YXRpY0luZm8oU3RyaW5nIGNhbWVyYUlkKSB7CkBAIC0zNzQsNiArNDA4LDggQEAKICAgICAvLyBQZXIgZGV2aWNlIGZpZWxkcwogICAgIHByaXZhdGUgY2xhc3MgQ2FtZXJhSG9sZGVyIHsKICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbUNhbWVyYUlkOworICAgICAgICBwcml2YXRlIENhbWVyYVN0YXRlTGlzdGVuZXIgbUNhbWVyYVN0YXRlTGlzdGVuZXI7CisgICAgICAgIHByaXZhdGUgQmxvY2tpbmdTdGF0ZUNhbGxiYWNrIG1CbG9ja2luZ1N0YXRlTGlzdGVuZXI7CiAgICAgICAgIHByaXZhdGUgQ2FtZXJhQ2FwdHVyZVNlc3Npb24gbVNlc3Npb247CiAgICAgICAgIHByaXZhdGUgQ2FtZXJhRGV2aWNlIG1DYW1lcmE7CiAgICAgICAgIHByaXZhdGUgU3RhdGljTWV0YWRhdGEgbVN0YXRpY0luZm87CkBAIC0zODIsNiArNDE4LDcgQEAKIAogICAgICAgICBwdWJsaWMgQ2FtZXJhSG9sZGVyKFN0cmluZyBpZCl7CiAgICAgICAgICAgICBtQ2FtZXJhSWQgPSBpZDsKKyAgICAgICAgICAgIG1DYW1lcmFTdGF0ZUxpc3RlbmVyID0gbmV3IENhbWVyYVN0YXRlTGlzdGVuZXIoKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBTdGF0aWNNZXRhZGF0YSBnZXRTdGF0aWNJbmZvKCkgewpAQCAtMzkyLDEwICs0MjksMzQgQEAKICAgICAgICAgICAgIHJldHVybiBtT3JkZXJlZFByZXZpZXdTaXplczsKICAgICAgICAgfQogCisgICAgICAgIGNsYXNzIENhbWVyYVN0YXRlTGlzdGVuZXIgZXh0ZW5kcyBDYW1lcmFEZXZpY2UuU3RhdGVDYWxsYmFjayB7CisgICAgICAgICAgICBib29sZWFuIG1EaXNjb25uZWN0ZWQgPSBmYWxzZTsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbk9wZW5lZChDYW1lcmFEZXZpY2UgY2FtZXJhKSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25EaXNjb25uZWN0ZWQoQ2FtZXJhRGV2aWNlIGNhbWVyYSkgeworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CisgICAgICAgICAgICAgICAgICAgIG1EaXNjb25uZWN0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKENhbWVyYURldmljZSBjYW1lcmEsIGludCBlcnJvcikgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNEaXNjb25uZWN0ZWQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1EaXNjb25uZWN0ZWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICBwdWJsaWMgdm9pZCBvcGVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICBhc3NlcnROdWxsKCJDYW1lcmEgaXMgYWxyZWFkeSBvcGVuZWQiLCBtQ2FtZXJhKTsKKyAgICAgICAgICAgIG1CbG9ja2luZ1N0YXRlTGlzdGVuZXIgPSBuZXcgQmxvY2tpbmdTdGF0ZUNhbGxiYWNrKG1DYW1lcmFTdGF0ZUxpc3RlbmVyKTsKICAgICAgICAgICAgIG1DYW1lcmEgPSAobmV3IEJsb2NraW5nQ2FtZXJhTWFuYWdlcihtQ2FtZXJhTWFuYWdlcikpLm9wZW5DYW1lcmEoCi0gICAgICAgICAgICAgICAgICAgIG1DYW1lcmFJZCwgbUNhbWVyYUxpc3RlbmVyLCBtSGFuZGxlcik7CisgICAgICAgICAgICAgICAgICAgIG1DYW1lcmFJZCwgbUJsb2NraW5nU3RhdGVMaXN0ZW5lciwgbUhhbmRsZXIpOwogICAgICAgICAgICAgbVN0YXRpY0luZm8gPSBuZXcgU3RhdGljTWV0YWRhdGEobUNhbWVyYU1hbmFnZXIuZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKG1DYW1lcmFJZCksCiAgICAgICAgICAgICAgICAgICAgIENoZWNrTGV2ZWwuQVNTRVJULCAvKmNvbGxlY3RvciovbnVsbCk7CiAgICAgICAgICAgICBpZiAobVN0YXRpY0luZm8uaXNDb2xvck91dHB1dFN1cHBvcnRlZCgpKSB7CkBAIC00MDcsNyArNDY4LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzT3BlbmVkKCkgewotICAgICAgICAgICAgcmV0dXJuIChtQ2FtZXJhICE9IG51bGwpOworICAgICAgICAgICAgcmV0dXJuIChtQ2FtZXJhICE9IG51bGwgJiYgIW1DYW1lcmFTdGF0ZUxpc3RlbmVyLmlzRGlzY29ubmVjdGVkKCkpOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTQxNSwxNyArNDc2LDIxIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUNhbWVyYS5jbG9zZSgpOwotICAgICAgICAgICAgbUNhbWVyYUxpc3RlbmVyLndhaXRGb3JTdGF0ZShTVEFURV9DTE9TRUQsIENBTUVSQV9DTE9TRV9USU1FT1VUX01TKTsKKyAgICAgICAgICAgIG1CbG9ja2luZ1N0YXRlTGlzdGVuZXIud2FpdEZvclN0YXRlKFNUQVRFX0NMT1NFRCwgQ0FNRVJBX0NMT1NFX1RJTUVPVVRfTVMpOwogICAgICAgICAgICAgbUNhbWVyYSA9IG51bGw7CiAgICAgICAgICAgICBtU2Vzc2lvbiA9IG51bGw7CiAgICAgICAgICAgICBtU3RhdGljSW5mbyA9IG51bGw7CiAgICAgICAgICAgICBtT3JkZXJlZFByZXZpZXdTaXplcyA9IG51bGw7CisgICAgICAgICAgICBtQmxvY2tpbmdTdGF0ZUxpc3RlbmVyID0gbnVsbDsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0UHJldmlldyhMaXN0PFN1cmZhY2U+IG91dHB1dFN1cmZhY2VzLCBDYXB0dXJlQ2FsbGJhY2sgbGlzdGVuZXIpCiAgICAgICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICBtU2Vzc2lvbkxpc3RlbmVyID0gbmV3IEJsb2NraW5nU2Vzc2lvbkNhbGxiYWNrKCk7CiAgICAgICAgICAgICBtU2Vzc2lvbiA9IGNvbmZpZ3VyZUNhbWVyYVNlc3Npb24obUNhbWVyYSwgb3V0cHV0U3VyZmFjZXMsIG1TZXNzaW9uTGlzdGVuZXIsIG1IYW5kbGVyKTsKKyAgICAgICAgICAgIGlmIChvdXRwdXRTdXJmYWNlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIFRPRE86IHZhcnkgdGhlIGRpZmZlcmVudCBzZXR0aW5ncyBsaWtlIGNyb3AgcmVnaW9uIHRvIGNvdmVyIG1vcmUgY2FzZXMuCiAgICAgICAgICAgICBDYXB0dXJlUmVxdWVzdC5CdWlsZGVyIGNhcHR1cmVCdWlsZGVyID0KQEAgLTQ1Nyw3ICs1MjIsNyBAQAogICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9PSBCbG9ja2luZ1Nlc3Npb25DYWxsYmFjay5TRVNTSU9OX0NPTkZJR1VSRV9GQUlMRUQpOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgc3RhcnRQcmV2aWV3V2l0aENvbmZpZ3MoTGlzdDxPdXRwdXRDb25maWd1cmF0aW9uPiBvdXRwdXRDb25maWdzLAorICAgICAgICBwdWJsaWMgaW50IHN0YXJ0UHJldmlld1dpdGhDb25maWdzKExpc3Q8T3V0cHV0Q29uZmlndXJhdGlvbj4gb3V0cHV0Q29uZmlncywKICAgICAgICAgICAgICAgICBDYXB0dXJlQ2FsbGJhY2sgbGlzdGVuZXIpCiAgICAgICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICBjcmVhdGVTZXNzaW9uV2l0aENvbmZpZ3Mob3V0cHV0Q29uZmlncyk7CkBAIC00NzAsMTMgKzUzNSwxMSBAQAogICAgICAgICAgICAgICAgICAgICBjYXB0dXJlQnVpbGRlci5hZGRUYXJnZXQoc3VyZmFjZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgbVNlc3Npb24uc2V0UmVwZWF0aW5nUmVxdWVzdChjYXB0dXJlQnVpbGRlci5idWlsZCgpLCBsaXN0ZW5lciwgbUhhbmRsZXIpOworICAgICAgICAgICAgcmV0dXJuIG1TZXNzaW9uLnNldFJlcGVhdGluZ1JlcXVlc3QoY2FwdHVyZUJ1aWxkZXIuYnVpbGQoKSwgbGlzdGVuZXIsIG1IYW5kbGVyKTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZU91dHB1dENvbmZpZ3MoTGlzdDxPdXRwdXRDb25maWd1cmF0aW9uPiBjb25maWdzLAorICAgICAgICBwdWJsaWMgaW50IHVwZGF0ZVJlcGVhdGluZ1JlcXVlc3QoTGlzdDxPdXRwdXRDb25maWd1cmF0aW9uPiBjb25maWdzLAogICAgICAgICAgICAgICAgIENhcHR1cmVDYWxsYmFjayBsaXN0ZW5lcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBtU2Vzc2lvbi5maW5hbGl6ZU91dHB1dENvbmZpZ3VyYXRpb25zKGNvbmZpZ3MpOwotCiAgICAgICAgICAgICBDYXB0dXJlUmVxdWVzdC5CdWlsZGVyIGNhcHR1cmVCdWlsZGVyID0KICAgICAgICAgICAgICAgICAgICAgbUNhbWVyYS5jcmVhdGVDYXB0dXJlUmVxdWVzdChDYW1lcmFEZXZpY2UuVEVNUExBVEVfUFJFVklFVyk7CiAKQEAgLTQ4NSw3ICs1NDgsMjYgQEAKICAgICAgICAgICAgICAgICAgICAgY2FwdHVyZUJ1aWxkZXIuYWRkVGFyZ2V0KHN1cmZhY2UpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1TZXNzaW9uLnNldFJlcGVhdGluZ1JlcXVlc3QoY2FwdHVyZUJ1aWxkZXIuYnVpbGQoKSwgbGlzdGVuZXIsIG1IYW5kbGVyKTsKKyAgICAgICAgICAgIHJldHVybiBtU2Vzc2lvbi5zZXRSZXBlYXRpbmdSZXF1ZXN0KGNhcHR1cmVCdWlsZGVyLmJ1aWxkKCksIGxpc3RlbmVyLCBtSGFuZGxlcik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGVPdXRwdXRDb25maWd1cmF0aW9uKE91dHB1dENvbmZpZ3VyYXRpb24gY29uZmlnKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIG1TZXNzaW9uLnVwZGF0ZU91dHB1dENvbmZpZ3VyYXRpb24oY29uZmlnKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNhcHR1cmUoQ2FwdHVyZVJlcXVlc3QgcmVxdWVzdCwgQ2FwdHVyZUNhbGxiYWNrIGxpc3RlbmVyKQorICAgICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgbVNlc3Npb24uY2FwdHVyZShyZXF1ZXN0LCBsaXN0ZW5lciwgbUhhbmRsZXIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENhcHR1cmVSZXF1ZXN0LkJ1aWxkZXIgZ2V0Q2FwdHVyZUJ1aWxkZXIoaW50IHRlbXBsYXRlSWQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIG1DYW1lcmEuY3JlYXRlQ2FwdHVyZVJlcXVlc3QodGVtcGxhdGVJZCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBmaW5hbGl6ZU91dHB1dENvbmZpZ3MoTGlzdDxPdXRwdXRDb25maWd1cmF0aW9uPiBjb25maWdzLAorICAgICAgICAgICAgICAgIENhcHR1cmVDYWxsYmFjayBsaXN0ZW5lcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBtU2Vzc2lvbi5maW5hbGl6ZU91dHB1dENvbmZpZ3VyYXRpb25zKGNvbmZpZ3MpOworICAgICAgICAgICAgdXBkYXRlUmVwZWF0aW5nUmVxdWVzdChjb25maWdzLCBsaXN0ZW5lcik7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1ByZXZpZXdTdGFydGVkKCkgewpAQCAtNDk1LDYgKzU3Nyw5IEBACiAgICAgICAgIHB1YmxpYyB2b2lkIHN0b3BQcmV2aWV3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICBpZiAoVkVSQk9TRSkgTG9nLnYoVEFHLAogICAgICAgICAgICAgICAgICAgICAiU3RvcHBpbmcgY2FtZXJhICIgKyBtQ2FtZXJhSWQgKyIgcHJldmlldyBhbmQgd2FpdGluZyBmb3IgaWRsZSIpOworICAgICAgICAgICAgaWYgKCFpc09wZW5lZCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gU3RvcCByZXBlYXQsIHdhaXQgZm9yIGNhcHR1cmVzIHRvIGNvbXBsZXRlLCBhbmQgZGlzY29ubmVjdCBmcm9tIHN1cmZhY2VzCiAgICAgICAgICAgICBtU2Vzc2lvbi5jbG9zZSgpOwogICAgICAgICAgICAgbVNlc3Npb25MaXN0ZW5lci5nZXRTdGF0ZVdhaXRlcigpLndhaXRGb3JTdGF0ZSgKZGlmZiAtLWdpdCBhL3Rlc3RzL2NhbWVyYS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL2N0cy90ZXN0Y2FzZXMvQ2FtZXJhMlN1cmZhY2VWaWV3VGVzdENhc2UuamF2YSBiL3Rlc3RzL2NhbWVyYS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL2N0cy90ZXN0Y2FzZXMvQ2FtZXJhMlN1cmZhY2VWaWV3VGVzdENhc2UuamF2YQppbmRleCA4YzYwMjMxLi42Njk3Yjc1IDEwMDY0NAotLS0gYS90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9jdHMvdGVzdGNhc2VzL0NhbWVyYTJTdXJmYWNlVmlld1Rlc3RDYXNlLmphdmEKKysrIGIvdGVzdHMvY2FtZXJhL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvY3RzL3Rlc3RjYXNlcy9DYW1lcmEyU3VyZmFjZVZpZXdUZXN0Q2FzZS5qYXZhCkBAIC0xNDQsNiArMTQ0LDE0IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmdbXSBjYW1lcmFJZHNQb3N0VGVzdCA9IG1DYW1lcmFNYW5hZ2VyLmdldENhbWVyYUlkTGlzdCgpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJDYW1lcmEgaWRzIHNob3VsZG4ndCBiZSBudWxsIiwgY2FtZXJhSWRzUG9zdFRlc3QpOworICAgICAgICBMb2cuaShUQUcsICJDYW1lcmEgaWRzIGluIHNldHVwOiIgKyBBcnJheXMudG9TdHJpbmcobUNhbWVyYUlkcykpOworICAgICAgICBMb2cuaShUQUcsICJDYW1lcmEgaWRzIGluIHRlYXJEb3duOiIgKyBBcnJheXMudG9TdHJpbmcoY2FtZXJhSWRzUG9zdFRlc3QpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICAgICAiTnVtYmVyIG9mIGNhbWVyYXMgY2hhbmdlZCBmcm9tICIgKyBtQ2FtZXJhSWRzLmxlbmd0aCArICIgdG8gIiArCisgICAgICAgICAgICAgICAgY2FtZXJhSWRzUG9zdFRlc3QubGVuZ3RoLAorICAgICAgICAgICAgICAgIG1DYW1lcmFJZHMubGVuZ3RoID09IGNhbWVyYUlkc1Bvc3RUZXN0Lmxlbmd0aCk7CiAgICAgICAgIC8vIFRlYXJkb3duIHRoZSBjYW1lcmEgcHJldmlldyByZXF1aXJlZCBlbnZpcm9ubWVudHMuCiAgICAgICAgIG1IYW5kbGVyVGhyZWFkLnF1aXRTYWZlbHkoKTsKICAgICAgICAgbUhhbmRsZXIgPSBudWxsOwpAQCAtODI1LDYgKzgzMyw3IEBACiAgICAgICAgIGludCBtaW5CdXJzdEZwcyA9IChpbnQpIE1hdGguZmxvb3IoMWU5IC8gZnJhbWVEdXJhdGlvbiArIDAuMDVmKTsKICAgICAgICAgYm9vbGVhbiBmb3VuZENvbnN0YW50TWF4WVVWUmFuZ2UgPSBmYWxzZTsKICAgICAgICAgYm9vbGVhbiBmb3VuZFlVVlN0cmVhbWluZ1JhbmdlID0gZmFsc2U7CisgICAgICAgIGJvb2xlYW4gaXNFeHRlcm5hbENhbWVyYSA9IG1TdGF0aWNJbmZvLmlzRXh0ZXJuYWxDYW1lcmEoKTsKIAogICAgICAgICAvLyBGaW5kIHN1aXRhYmxlIHRhcmdldCBGUFMgcmFuZ2UgLSBhcyBoaWdoIGFzIHBvc3NpYmxlIHRoYXQgY292ZXJzIHRoZSBtYXggWVVWIHJhdGUKICAgICAgICAgLy8gQWxzbyB2ZXJpZnkgdGhhdCB0aGVyZSdzIGEgZ29vZCBwcmV2aWV3IHJhdGUgYXMgd2VsbApAQCAtODM1LDE0ICs4NDQsMTkgQEAKICAgICAgICAgICAgIGlmIChmcHNSYW5nZS5nZXRMb3dlcigpID09IG1pbkJ1cnN0RnBzICYmIGZwc1JhbmdlLmdldFVwcGVyKCkgPT0gbWluQnVyc3RGcHMpIHsKICAgICAgICAgICAgICAgICBmb3VuZENvbnN0YW50TWF4WVVWUmFuZ2UgPSB0cnVlOwogICAgICAgICAgICAgICAgIHRhcmdldFJhbmdlID0gZnBzUmFuZ2U7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGlzRXh0ZXJuYWxDYW1lcmEgJiYgZnBzUmFuZ2UuZ2V0VXBwZXIoKSA9PSBtaW5CdXJzdEZwcykgeworICAgICAgICAgICAgICAgIHRhcmdldFJhbmdlID0gZnBzUmFuZ2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZnBzUmFuZ2UuZ2V0TG93ZXIoKSA8PSAxNSAmJiBmcHNSYW5nZS5nZXRVcHBlcigpID09IG1pbkJ1cnN0RnBzKSB7CiAgICAgICAgICAgICAgICAgZm91bmRZVVZTdHJlYW1pbmdSYW5nZSA9IHRydWU7CiAgICAgICAgICAgICB9CisKICAgICAgICAgfQogCi0gICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiQ2FtICVzOiBUYXJnZXQgRlBTIHJhbmdlIG9mICglZCwgJWQpIG11c3QgYmUgc3VwcG9ydGVkIiwKLSAgICAgICAgICAgICAgICBjYW1lcmFJZCwgbWluQnVyc3RGcHMsIG1pbkJ1cnN0RnBzKSwgZm91bmRDb25zdGFudE1heFlVVlJhbmdlKTsKKyAgICAgICAgaWYgKCFpc0V4dGVybmFsQ2FtZXJhKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoIkNhbSAlczogVGFyZ2V0IEZQUyByYW5nZSBvZiAoJWQsICVkKSBtdXN0IGJlIHN1cHBvcnRlZCIsCisgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkLCBtaW5CdXJzdEZwcywgbWluQnVyc3RGcHMpLCBmb3VuZENvbnN0YW50TWF4WVVWUmFuZ2UpOworICAgICAgICB9CiAgICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgKICAgICAgICAgICAgICAgICAiQ2FtICVzOiBUYXJnZXQgRlBTIHJhbmdlIG9mICh4LCAlZCkgd2hlcmUgeCA8PSAxNSBtdXN0IGJlIHN1cHBvcnRlZCIsCiAgICAgICAgICAgICAgICAgY2FtZXJhSWQsIG1pbkJ1cnN0RnBzKSwgZm91bmRZVVZTdHJlYW1pbmdSYW5nZSk7CmRpZmYgLS1naXQgYS90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY3RzL0NhbWVyYUdMVGVzdC5qYXZhIGIvdGVzdHMvY2FtZXJhL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2N0cy9DYW1lcmFHTFRlc3QuamF2YQppbmRleCA5MzRiZjViLi43MzhjM2I3IDEwMDY0NAotLS0gYS90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY3RzL0NhbWVyYUdMVGVzdC5qYXZhCisrKyBiL3Rlc3RzL2NhbWVyYS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jdHMvQ2FtZXJhR0xUZXN0LmphdmEKQEAgLTIxLDYgKzIxLDcgQEAKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLkNhbWVyYTsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLkNhbWVyYS5QYXJhbWV0ZXJzOwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuQ2FtZXJhLlNpemU7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jdHMuaGVscGVycy5DYW1lcmFVdGlsczsKIAogaW1wb3J0IGFuZHJvaWQub3BlbmdsLkdMRVMyMDsKIGltcG9ydCBhbmRyb2lkLm9wZW5nbC5HTFN1cmZhY2VWaWV3OwpAQCAtMzEsNiArMzIsNyBAQAogaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwogaW1wb3J0IGFuZHJvaWQub3MuUG93ZXJNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQub3MuUG93ZXJNYW5hZ2VyLldha2VMb2NrOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIAogaW1wb3J0IGFuZHJvaWQudGVzdC5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjsKIGltcG9ydCBhbmRyb2lkLnRlc3QuTW9yZUFzc2VydHM7CkBAIC01Nyw2ICs1OSw3IEBACiAvKioKICAqIFRoaXMgdGVzdCBjYXNlIG11c3QgcnVuIHdpdGggaGFyZHdhcmUuIEl0IGNhbid0IGJlIHRlc3RlZCBpbiBlbXVsYXRvcgogICovCitAQXBwTW9kZUZ1bGwKIEBMYXJnZVRlc3QKIHB1YmxpYyBjbGFzcyBDYW1lcmFHTFRlc3QgZXh0ZW5kcyBBY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjxHTFN1cmZhY2VWaWV3Q3RzQWN0aXZpdHk+IHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkNhbWVyYUdMVGVzdCI7CkBAIC04MCw2ICs4Myw3IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBDb25kaXRpb25WYXJpYWJsZSBtUHJldmlld0RvbmUgPSBuZXcgQ29uZGl0aW9uVmFyaWFibGUoKTsKIAogICAgIENhbWVyYSBtQ2FtZXJhOworICAgIGJvb2xlYW4gbUlzRXh0ZXJuYWxDYW1lcmE7CiAgICAgU3VyZmFjZVRleHR1cmUgbVN1cmZhY2VUZXh0dXJlOwogICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1TdXJmYWNlVGV4dHVyZVN5bmNMb2NrID0gbmV3IE9iamVjdCgpOwogICAgIFJlbmRlcmVyIG1SZW5kZXJlcjsKQEAgLTEzNSw2ICsxMzksMTIgQEAKICAgICAgICAgICAgICAgICAvLyBUaGVzZSBtdXN0IGJlIGluc3RhbnRpYXRlZCBvdXRzaWRlIHRoZSBVSSB0aHJlYWQsIHNpbmNlIHRoZQogICAgICAgICAgICAgICAgIC8vIFVJIHRocmVhZCB3aWxsIGJlIGRvaW5nIGEgbG90IG9mIHdhaXRpbmcsIHN0b3BwaW5nIGNhbGxiYWNrcy4KICAgICAgICAgICAgICAgICBtQ2FtZXJhID0gQ2FtZXJhLm9wZW4oY2FtZXJhSWQpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG1Jc0V4dGVybmFsQ2FtZXJhID0gQ2FtZXJhVXRpbHMuaXNFeHRlcm5hbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRDb250ZXh0KCksIGNhbWVyYUlkKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJVbmFibGUgdG8gcXVlcnkgZXh0ZXJuYWwgY2FtZXJhISIgKyBlKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbVN1cmZhY2VUZXh0dXJlID0gbmV3IFN1cmZhY2VUZXh0dXJlKG1SZW5kZXJlci5nZXRUZXh0dXJlSUQoKSk7CiAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiQ2FtZXJhICIgKyBjYW1lcmFJZCArICIgaXMgb3BlbmVkLiIpOwogICAgICAgICAgICAgICAgIHN0YXJ0RG9uZS5vcGVuKCk7CkBAIC01MTAsMTIgKzUyMCwxNCBAQAogICAgICAgICAgICAgaW50IGtMb29wQ291bnQgPSAxMDA7CiAgICAgICAgICAgICAvLyBOdW1iZXIgb2YgZnJhbWVzIHRoYXQgY2FuIGJlIG91dCBvZiBib3VuZHMgYmVmb3JlIGNhbGxpbmcgdGhpcyBhIGZhaWx1cmUKICAgICAgICAgICAgIGludCBrTWF4T3V0T2ZCb3VuZHNGcmFtZXMgPSBrTG9vcENvdW50IC8gMjU7IC8vIDQlIG9mIGZyYW1lcworICAgICAgICAgICAgaW50IGtFeHRDYW1NYXhPdXRPZkJvdW5kc0ZyYW1lcyA9IGtMb29wQ291bnQgLyAxMDsgLy8gMTAlIHRocmVzaG9sZCBmb3IgZXh0ZXJuYWwgY2FtZXJhCiAgICAgICAgICAgICAvLyBJZ25vcmUgdGltZXN0YW1wIGlzc3VlcyBiZWZvcmUgdGhpcyBmcmFtZQogICAgICAgICAgICAgaW50IGtGaXJzdFRlc3RlZEZyYW1lID0gMTA7CiAgICAgICAgICAgICAvLyBTbG9wIGluIHRpbWVzdGFtcCB0ZXN0aW5nLCBuZWVkZWQgYmVjYXVzZSB0aW1lc3RhbXBzIGFyZSBub3QKICAgICAgICAgICAgIC8vIGN1cnJlbnRseSBiZWluZyBzZXQgYnkgZHJpdmVyLWxldmVsIGNvZGUgc28gYXJlIHN1YmplY3QgdG8KICAgICAgICAgICAgIC8vIHVzZXItc3BhY2UgdGltaW5nIHZhcmlhYmlsaXR5CiAgICAgICAgICAgICBmbG9hdCBrVGVzdFNsb3BNYXJnaW4gPSAyMDsgLy8gbXMKKyAgICAgICAgICAgIGZsb2F0IGtFeHRDYW1UZXN0U2xvcE1hcmdpbiA9IDAuMmY7IC8vICoxMDAlCiAKICAgICAgICAgICAgIGJvb2xlYW4gbm9UaW1lb3V0OwogICAgICAgICAgICAgaW5pdGlhbGl6ZU1lc3NhZ2VMb29wZXIoY2FtZXJhSWQpOwpAQCAtNjA0LDYgKzYxNiwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwc1tQYXJhbWV0ZXJzLlBSRVZJRVdfRlBTX01BWF9JTkRFWF07CiAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNsb3BNaW5GcmFtZUR1cmF0aW9uTXMgPSBleHBlY3RlZE1pbkZyYW1lRHVyYXRpb25NcyAgLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtUZXN0U2xvcE1hcmdpbjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Jc0V4dGVybmFsQ2FtZXJhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzbG9wTWF4RnJhbWVEdXJhdGlvbk1zID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRNYXhGcmFtZUR1cmF0aW9uTXMgKiAoMS4wZiArIGtFeHRDYW1UZXN0U2xvcE1hcmdpbik7CisgICAgICAgICAgICAgICAgICAgICAgICBzbG9wTWluRnJhbWVEdXJhdGlvbk1zID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRNaW5GcmFtZUR1cmF0aW9uTXMgKiAoMS4wZiAtIGtFeHRDYW1UZXN0U2xvcE1hcmdpbik7CisgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBpbnQgb3V0T2ZCb3VuZHNDb3VudCA9IDA7CiAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBsYXN0IGZyYW1lIGJlY2F1c2UgcHJldmlldyBpcyB0dXJuZWQgb2ZmIHdoaWNoIGltcGFjdHMgZnBzCkBAIC02MjQsMTEgKzY0MiwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dE9mQm91bmRzQ291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpbnQgb29iVGhyZXNob2xkID0gbUlzRXh0ZXJuYWxDYW1lcmEgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtFeHRDYW1NYXhPdXRPZkJvdW5kc0ZyYW1lcyA6IGtNYXhPdXRPZkJvdW5kc0ZyYW1lczsKICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVG9vIG1hbnkgZnJhbWUgaW50ZXJ2YWxzIG91dCBvZiBmcmFtZSByYXRlIGJvdW5kczogIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgb3V0T2ZCb3VuZHNDb3VudCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgbGltaXQgIiArIGtNYXhPdXRPZkJvdW5kc0ZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRPZkJvdW5kc0NvdW50IDw9IGtNYXhPdXRPZkJvdW5kc0ZyYW1lcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgbGltaXQgIiArIG9vYlRocmVzaG9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRPZkJvdW5kc0NvdW50IDw9IG9vYlRocmVzaG9sZCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgdGVybWluYXRlTWVzc2FnZUxvb3BlcigpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2FtZXJhL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2N0cy9DYW1lcmFUZXN0LmphdmEgYi90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY3RzL0NhbWVyYVRlc3QuamF2YQppbmRleCAzYjY5N2NlLi5mNjUwMmZjIDEwMDY0NAotLS0gYS90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY3RzL0NhbWVyYVRlc3QuamF2YQorKysgYi90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY3RzL0NhbWVyYVRlc3QuamF2YQpAQCAtMzAsNiArMzAsNyBAQAogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuQ2FtZXJhLlBpY3R1cmVDYWxsYmFjazsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLkNhbWVyYS5TaHV0dGVyQ2FsbGJhY2s7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5DYW1lcmEuU2l6ZTsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmN0cy5oZWxwZXJzLkNhbWVyYVV0aWxzOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuQ2FtY29yZGVyUHJvZmlsZTsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkV4aWZJbnRlcmZhY2U7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVJlY29yZGVyOwpAQCAtMzgsNiArMzksNyBAQAogaW1wb3J0IGFuZHJvaWQub3MuRW52aXJvbm1lbnQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyOwogaW1wb3J0IGFuZHJvaWQudGVzdC5Nb3JlQXNzZXJ0czsKIGltcG9ydCBhbmRyb2lkLnRlc3QuVWlUaHJlYWRUZXN0OwpAQCAtNjMsNiArNjUsNyBAQAogLyoqCiAgKiBUaGlzIHRlc3QgY2FzZSBtdXN0IHJ1biB3aXRoIGhhcmR3YXJlLiBJdCBjYW4ndCBiZSB0ZXN0ZWQgaW4gZW11bGF0b3IKICAqLworQEFwcE1vZGVGdWxsCiBATGFyZ2VUZXN0CiBwdWJsaWMgY2xhc3MgQ2FtZXJhVGVzdCBleHRlbmRzIEFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyPENhbWVyYUN0c0FjdGl2aXR5PiB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJDYW1lcmFUZXN0IjsKQEAgLTk1LDEzICs5OCwxNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBVVRPRVhQT1NVUkVfTE9DSyA9IDA7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFVVE9XSElURUJBTEFOQ0VfTE9DSyA9IDE7CiAKKyAgICAvLyBGb3IgZXh0ZXJuYWwgY2FtZXJhIHJlY29yZGluZworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1ZJREVPX1dJRFRIID0gMTc2OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1ZJREVPX0hFSUdIVCA9IDE0NDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVklERU9fQklUX1JBVEVfSU5fQlBTID0gMTI4MDAwOworCiAgICAgLy8gU29tZSBleGlmIHRhZ3MgdGhhdCBhcmUgbm90IGRlZmluZWQgYnkgRXhpZkludGVyZmFjZSBidXQgc3VwcG9ydGVkLgogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfREFURVRJTUVfRElHSVRJWkVEID0gIkRhdGVUaW1lRGlnaXRpemVkIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1NVQlNFQ19USU1FID0gIlN1YlNlY1RpbWUiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfU1VCU0VDX1RJTUVfT1JJRyA9ICJTdWJTZWNUaW1lT3JpZ2luYWwiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfU1VCU0VDX1RJTUVfRElHID0gIlN1YlNlY1RpbWVEaWdpdGl6ZWQiOwogCi0KICAgICBwcml2YXRlIFByZXZpZXdDYWxsYmFjayBtUHJldmlld0NhbGxiYWNrID0gbmV3IFByZXZpZXdDYWxsYmFjaygpOwogICAgIHByaXZhdGUgVGVzdFNodXR0ZXJDYWxsYmFjayBtU2h1dHRlckNhbGxiYWNrID0gbmV3IFRlc3RTaHV0dGVyQ2FsbGJhY2soKTsKICAgICBwcml2YXRlIFJhd1BpY3R1cmVDYWxsYmFjayBtUmF3UGljdHVyZUNhbGxiYWNrID0gbmV3IFJhd1BpY3R1cmVDYWxsYmFjaygpOwpAQCAtMTE2LDYgKzEyMyw3IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBDb25kaXRpb25WYXJpYWJsZSBtU25hcHNob3REb25lID0gbmV3IENvbmRpdGlvblZhcmlhYmxlKCk7CiAKICAgICBDYW1lcmEgbUNhbWVyYTsKKyAgICBib29sZWFuIG1Jc0V4dGVybmFsQ2FtZXJhOwogCiAgICAgcHVibGljIENhbWVyYVRlc3QoKSB7CiAgICAgICAgIHN1cGVyKFBBQ0tBR0UsIENhbWVyYUN0c0FjdGl2aXR5LmNsYXNzKTsKQEAgLTE1NCw2ICsxNjIsMTMgQEAKICAgICAgICAgICAgICAgICAvLyBhZnRlciB3ZSBhcmUgZG9uZSB3aXRoIGl0LgogICAgICAgICAgICAgICAgIG1Mb29wZXIgPSBMb29wZXIubXlMb29wZXIoKTsKICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBtSXNFeHRlcm5hbENhbWVyYSA9IENhbWVyYVV0aWxzLmlzRXh0ZXJuYWwoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0Q29udGV4dCgpLCBjYW1lcmFJZCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiVW5hYmxlIHRvIHF1ZXJ5IGV4dGVybmFsIGNhbWVyYSEiICsgZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgbUNhbWVyYSA9IENhbWVyYS5vcGVuKGNhbWVyYUlkKTsKICAgICAgICAgICAgICAgICAgICAgbUNhbWVyYS5zZXRFcnJvckNhbGxiYWNrKG1FcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKQEAgLTE3OSw2ICsxOTQsMTMgQEAKICAgICAgKiBUZXJtaW5hdGVzIHRoZSBtZXNzYWdlIGxvb3BlciB0aHJlYWQuCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHRlcm1pbmF0ZU1lc3NhZ2VMb29wZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVybWluYXRlTWVzc2FnZUxvb3BlcihmYWxzZSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBUZXJtaW5hdGVzIHRoZSBtZXNzYWdlIGxvb3BlciB0aHJlYWQsIG9wdGlvbmFsbHkgYWxsb3dpbmcgZXZpY3QgZXJyb3IKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdGVybWluYXRlTWVzc2FnZUxvb3Blcihib29sZWFuIGFsbG93RXZpY3QpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBtTG9vcGVyLnF1aXQoKTsKICAgICAgICAgLy8gTG9vcGVyLnF1aXQoKSBpcyBhc3luY2hyb25vdXMuIFRoZSBsb29wZXIgbWF5IHN0aWxsIGhhcyBzb21lCiAgICAgICAgIC8vIHByZXZpZXcgY2FsbGJhY2tzIGluIHRoZSBxdWV1ZSBhZnRlciBxdWl0IGlzIGNhbGxlZC4gVGhlIHByZXZpZXcKQEAgLTE4OCw3ICsyMTAsMTMgQEAKICAgICAgICAgbUxvb3Blci5nZXRUaHJlYWQoKS5qb2luKCk7CiAgICAgICAgIG1DYW1lcmEucmVsZWFzZSgpOwogICAgICAgICBtQ2FtZXJhID0gbnVsbDsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJHb3QgY2FtZXJhIGVycm9yIGNhbGxiYWNrLiIsIE5PX0VSUk9SLCBtQ2FtZXJhRXJyb3JDb2RlKTsKKyAgICAgICAgaWYgKGFsbG93RXZpY3QpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkdvdCB1bmV4cGVjdGVkIGNhbWVyYSBlcnJvciBjYWxsYmFjay4iLAorICAgICAgICAgICAgICAgICAgICAoTk9fRVJST1IgPT0gbUNhbWVyYUVycm9yQ29kZSB8fAorICAgICAgICAgICAgICAgICAgICBDYW1lcmEuQ0FNRVJBX0VSUk9SX0VWSUNURUQgPT0gbUNhbWVyYUVycm9yQ29kZSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJHb3QgY2FtZXJhIGVycm9yIGNhbGxiYWNrLiIsIE5PX0VSUk9SLCBtQ2FtZXJhRXJyb3JDb2RlKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8vIEFsaWduICd4JyB0byAndG8nLCB3aGljaCBzaG91bGQgYmUgYSBwb3dlciBvZiAyCkBAIC00NDIsMTAgKzQ3MCwyMCBAQAogICAgICAgICAvLyBUZXN0IGFsbCBwcmV2aWV3IHNpemVzLgogICAgICAgICBpbml0aWFsaXplTWVzc2FnZUxvb3BlcihjYW1lcmFJZCk7CiAgICAgICAgIFBhcmFtZXRlcnMgcGFyYW1ldGVycyA9IG1DYW1lcmEuZ2V0UGFyYW1ldGVycygpOworCisgICAgICAgIFNpemUgUUNJRiA9IG1DYW1lcmEubmV3IFNpemUoMTc2LCAxNDQpOworICAgICAgICBTaXplIFZHQSA9IG1DYW1lcmEubmV3IFNpemUoNjQwLCA0ODApOworICAgICAgICBTaXplIGRlZmF1bHRQaWNTaXplID0gcGFyYW1ldGVycy5nZXRQaWN0dXJlU2l6ZSgpOworCiAgICAgICAgIGZvciAoU2l6ZSBzaXplOiBwYXJhbWV0ZXJzLmdldFN1cHBvcnRlZFByZXZpZXdTaXplcygpKSB7CiAgICAgICAgICAgICBtUHJldmlld0NhbGxiYWNrUmVzdWx0ID0gUFJFVklFV19DQUxMQkFDS19OT1RfUkVDRUlWRUQ7CiAgICAgICAgICAgICBtQ2FtZXJhLnNldFByZXZpZXdDYWxsYmFjayhtUHJldmlld0NhbGxiYWNrKTsKICAgICAgICAgICAgIHBhcmFtZXRlcnMuc2V0UHJldmlld1NpemUoc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQpOworICAgICAgICAgICAgaWYgKHNpemUuZXF1YWxzKFFDSUYpKSB7CisgICAgICAgICAgICAgICAgcGFyYW1ldGVycy5zZXRQaWN0dXJlU2l6ZShWR0Eud2lkdGgsIFZHQS5oZWlnaHQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLnNldFBpY3R1cmVTaXplKGRlZmF1bHRQaWNTaXplLndpZHRoLCBkZWZhdWx0UGljU2l6ZS5oZWlnaHQpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgbUNhbWVyYS5zZXRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNpemUsIG1DYW1lcmEuZ2V0UGFyYW1ldGVycygpLmdldFByZXZpZXdTaXplKCkpOwogICAgICAgICAgICAgY2hlY2tQcmV2aWV3Q2FsbGJhY2soKTsKQEAgLTQ2Miw2ICs1MDAsMzEgQEAKICAgICB9CiAKICAgICBAVWlUaHJlYWRUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0YWJpbGl6YXRpb25PbmVTaG90UHJldmlld0NhbGxiYWNrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGludCBuQ2FtZXJhcyA9IENhbWVyYS5nZXROdW1iZXJPZkNhbWVyYXMoKTsKKyAgICAgICAgZm9yIChpbnQgaWQgPSAwOyBpZCA8IG5DYW1lcmFzOyBpZCsrKSB7CisgICAgICAgICAgICBMb2cudihUQUcsICJDYW1lcmEgaWQ9IiArIGlkKTsKKyAgICAgICAgICAgIHRlc3RTdGFiaWxpemF0aW9uT25lU2hvdFByZXZpZXdDYWxsYmFja0J5Q2FtZXJhKGlkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0U3RhYmlsaXphdGlvbk9uZVNob3RQcmV2aWV3Q2FsbGJhY2tCeUNhbWVyYShpbnQgY2FtZXJhSWQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbml0aWFsaXplTWVzc2FnZUxvb3BlcihjYW1lcmFJZCk7CisgICAgICAgIFBhcmFtZXRlcnMgcGFyYW1zID0gbUNhbWVyYS5nZXRQYXJhbWV0ZXJzKCk7CisgICAgICAgIGlmKCFwYXJhbXMuaXNWaWRlb1N0YWJpbGl6YXRpb25TdXBwb3J0ZWQoKSkgeworICAgICAgICAgICAgdGVybWluYXRlTWVzc2FnZUxvb3BlcigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vQ2hlY2sgd2hldGhlciB3ZSBjYW4gc3VwcG9ydCBwcmV2aWV3IGNhbGxiYWNrcyBhbG9uZyB3aXRoIHN0YWJpbGl6YXRpb24KKyAgICAgICAgcGFyYW1zLnNldFZpZGVvU3RhYmlsaXphdGlvbih0cnVlKTsKKyAgICAgICAgbUNhbWVyYS5zZXRQYXJhbWV0ZXJzKHBhcmFtcyk7CisgICAgICAgIG1DYW1lcmEuc2V0T25lU2hvdFByZXZpZXdDYWxsYmFjayhtUHJldmlld0NhbGxiYWNrKTsKKyAgICAgICAgY2hlY2tQcmV2aWV3Q2FsbGJhY2soKTsKKyAgICAgICAgdGVybWluYXRlTWVzc2FnZUxvb3BlcigpOworICAgICAgICBhc3NlcnRFcXVhbHMoUFJFVklFV19DQUxMQkFDS19SRUNFSVZFRCwgbVByZXZpZXdDYWxsYmFja1Jlc3VsdCk7CisgICAgfQorCisgICAgQFVpVGhyZWFkVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRPbmVTaG90UHJldmlld0NhbGxiYWNrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGludCBuQ2FtZXJhcyA9IENhbWVyYS5nZXROdW1iZXJPZkNhbWVyYXMoKTsKICAgICAgICAgZm9yIChpbnQgaWQgPSAwOyBpZCA8IG5DYW1lcmFzOyBpZCsrKSB7CkBAIC02NDMsOSArNzA2LDIxIEBACiAgICAgICAgIGlmIChmb2N1c01vZGVzLmNvbnRhaW5zKFBhcmFtZXRlcnMuRk9DVVNfTU9ERV9BVVRPKSkgewogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFBhcmFtZXRlcnMuRk9DVVNfTU9ERV9BVVRPLCBmb2N1c01vZGUpOwogICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoZm9jYWxMZW5ndGggPiAwKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShob3Jpem9udGFsVmlld0FuZ2xlID4gMCAmJiBob3Jpem9udGFsVmlld0FuZ2xlIDw9IDM2MCk7Ci0gICAgICAgIGFzc2VydFRydWUodmVydGljYWxWaWV3QW5nbGUgPiAwICYmIHZlcnRpY2FsVmlld0FuZ2xlIDw9IDM2MCk7CisKKyAgICAgICAgaWYgKG1Jc0V4dGVybmFsQ2FtZXJhKSB7CisgICAgICAgICAgICAvLyBFeHRlcm5hbCBjYW1lcmEgYnkgZGVmYXVsdCByZXBvcnRzIC0xLjAsIGJ1dCBkb24ndCBmYWlsIGlmCisgICAgICAgICAgICAvLyB0aGUgSEFMIGltcGxlbWVudGF0aW9uIHNvbWVob3cgY2hvb3NlcyB0byByZXBvcnQgdGhpcyBpbmZvcm1hdGlvbi4KKyAgICAgICAgICAgIGFzc2VydFRydWUoZm9jYWxMZW5ndGggPT0gLTEuMCB8fCBmb2NhbExlbmd0aCA+IDApOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShob3Jpem9udGFsVmlld0FuZ2xlID09IC0xLjAgfHwKKyAgICAgICAgICAgICAgICAgICAgKGhvcml6b250YWxWaWV3QW5nbGUgPiAwICYmIGhvcml6b250YWxWaWV3QW5nbGUgPD0gMzYwKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHZlcnRpY2FsVmlld0FuZ2xlID09IC0xLjAgfHwKKyAgICAgICAgICAgICAgICAgICAgKHZlcnRpY2FsVmlld0FuZ2xlID4gMCAmJiB2ZXJ0aWNhbFZpZXdBbmdsZSA8PSAzNjApKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZm9jYWxMZW5ndGggPiAwKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoaG9yaXpvbnRhbFZpZXdBbmdsZSA+IDAgJiYgaG9yaXpvbnRhbFZpZXdBbmdsZSA8PSAzNjApOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh2ZXJ0aWNhbFZpZXdBbmdsZSA+IDAgJiYgdmVydGljYWxWaWV3QW5nbGUgPD0gMzYwKTsKKyAgICAgICAgfQorCiAgICAgICAgIFNpemUgcHJldmlld1NpemUgPSBwcmV2aWV3U2l6ZXMuZ2V0KDApOwogICAgICAgICBTaXplIHBpY3R1cmVTaXplID0gcGljdHVyZVNpemVzLmdldCgwKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShqcGVnUXVhbGl0eSA+PSAxICYmIGpwZWdRdWFsaXR5IDw9IDEwMCk7CkBAIC0xMTU1LDE4ICsxMjMwLDI3IEBACiAgICAgICAgIENhbWVyYS5QYXJhbWV0ZXJzIHBhcmFtZXRlcnMgPSBtQ2FtZXJhLmdldFBhcmFtZXRlcnMoKTsKICAgICAgICAgU3VyZmFjZUhvbGRlciBzdXJmYWNlSG9sZGVyOwogICAgICAgICBzdXJmYWNlSG9sZGVyID0gZ2V0QWN0aXZpdHkoKS5nZXRTdXJmYWNlVmlldygpLmdldEhvbGRlcigpOwotICAgICAgICBDYW1jb3JkZXJQcm9maWxlIHByb2ZpbGUgPSBDYW1jb3JkZXJQcm9maWxlLmdldChjYW1lcmFJZCwKLSAgICAgICAgICAgICAgICBDYW1jb3JkZXJQcm9maWxlLlFVQUxJVFlfTE9XKTsKKyAgICAgICAgQ2FtY29yZGVyUHJvZmlsZSBwcm9maWxlID0gbnVsbDsgLy8gVXNlZCBmb3IgYnVpbHQtaW4gY2FtZXJhCisgICAgICAgIENhbWVyYS5TaXplIHZpZGVvU2l6ZSA9IG51bGw7IC8vIFVzZWQgZm9yIGV4dGVybmFsIGNhbWVyYQogCiAgICAgICAgIC8vIFNldCB0aGUgcHJldmlldyBzaXplLgotICAgICAgICBzZXRQcmV2aWV3U2l6ZUJ5UHJvZmlsZShwYXJhbWV0ZXJzLCBwcm9maWxlKTsKKyAgICAgICAgaWYgKG1Jc0V4dGVybmFsQ2FtZXJhKSB7CisgICAgICAgICAgICB2aWRlb1NpemUgPSBzZXR1cEV4dGVybmFsQ2FtZXJhUmVjb3JkKHBhcmFtZXRlcnMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJvZmlsZSA9IENhbWNvcmRlclByb2ZpbGUuZ2V0KGNhbWVyYUlkLCBDYW1jb3JkZXJQcm9maWxlLlFVQUxJVFlfTE9XKTsKKyAgICAgICAgICAgIHNldFByZXZpZXdTaXplQnlQcm9maWxlKHBhcmFtZXRlcnMsIHByb2ZpbGUpOworICAgICAgICB9CiAKICAgICAgICAgbUNhbWVyYS5zZXRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpOwogICAgICAgICBtQ2FtZXJhLnNldFByZXZpZXdEaXNwbGF5KHN1cmZhY2VIb2xkZXIpOwogICAgICAgICBtQ2FtZXJhLnN0YXJ0UHJldmlldygpOwogICAgICAgICBtQ2FtZXJhLmxvY2soKTsgIC8vIExvY2tpbmcgYWdhaW4gZnJvbSB0aGUgc2FtZSBwcm9jZXNzIGhhcyBubyBlZmZlY3QuCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZWNvcmRWaWRlbyhwcm9maWxlLCBzdXJmYWNlSG9sZGVyKTsKKyAgICAgICAgICAgIGlmIChtSXNFeHRlcm5hbENhbWVyYSkgeworICAgICAgICAgICAgICAgIHJlY29yZFZpZGVvQnlTaXplKHZpZGVvU2l6ZSwgc3VyZmFjZUhvbGRlcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlY29yZFZpZGVvKHByb2ZpbGUsIHN1cmZhY2VIb2xkZXIpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgZmFpbCgiUmVjb3JkaW5nIHNob3VsZCBub3Qgc3VjY2VlZCBiZWNhdXNlIGNhbWVyYSBpcyBsb2NrZWQuIik7CiAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAvLyBleHBlY3RlZApAQCAtMTE4MCw3ICsxMjY0LDEyIEBACiAgICAgICAgICAgICAvLyBleHBlY3RlZAogICAgICAgICB9CiAKLSAgICAgICAgcmVjb3JkVmlkZW8ocHJvZmlsZSwgc3VyZmFjZUhvbGRlcik7ICAvLyBzaG91bGQgbm90IHRocm93IGV4Y2VwdGlvbgorICAgICAgICBpZiAobUlzRXh0ZXJuYWxDYW1lcmEpIHsKKyAgICAgICAgICAgIHJlY29yZFZpZGVvQnlTaXplKHZpZGVvU2l6ZSwgc3VyZmFjZUhvbGRlcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZWNvcmRWaWRlbyhwcm9maWxlLCBzdXJmYWNlSG9sZGVyKTsgIC8vIHNob3VsZCBub3QgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0KKwogICAgICAgICAvLyBNZWRpYSByZWNvcmRlciBhbHJlYWR5IHJlbGVhc2VzIHRoZSBjYW1lcmEgc28gdGhlIHRlc3QgYXBwbGljYXRpb24KICAgICAgICAgLy8gY2FuIGxvY2sgYW5kIHVzZSB0aGUgY2FtZXJhIG5vdy4KICAgICAgICAgbUNhbWVyYS5sb2NrKCk7ICAvLyBzaG91bGQgbm90IGZhaWwKQEAgLTExODgsNiArMTI3NywyMiBAQAogICAgICAgICB0ZXJtaW5hdGVNZXNzYWdlTG9vcGVyKCk7CiAgICAgfQogCisgICAgcHJpdmF0ZSBDYW1lcmEuU2l6ZSBzZXR1cEV4dGVybmFsQ2FtZXJhUmVjb3JkKFBhcmFtZXRlcnMgcGFyYW1ldGVycykgeworICAgICAgICBhc3NlcnRUcnVlKHBhcmFtZXRlcnMuZ2V0U3VwcG9ydGVkVmlkZW9TaXplcygpICE9IG51bGwpOworICAgICAgICBhc3NlcnRUcnVlKHBhcmFtZXRlcnMuZ2V0U3VwcG9ydGVkVmlkZW9TaXplcygpLnNpemUoKSA+IDApOworCisgICAgICAgIENhbWVyYS5TaXplIHZpZGVvU2l6ZSA9IG51bGw7CisgICAgICAgIGZvciAoQ2FtZXJhLlNpemUgc3ogOiBwYXJhbWV0ZXJzLmdldFN1cHBvcnRlZFZpZGVvU2l6ZXMoKSkgeworICAgICAgICAgICAgaWYgKHN6LndpZHRoID49IERFRkFVTFRfVklERU9fV0lEVEggJiYgc3ouaGVpZ2h0ID49IERFRkFVTFRfVklERU9fSEVJR0hUKSB7CisgICAgICAgICAgICAgICAgdmlkZW9TaXplID0gc3o7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh2aWRlb1NpemUpOworICAgICAgICBwYXJhbWV0ZXJzLnNldFByZXZpZXdTaXplKHZpZGVvU2l6ZS53aWR0aCwgdmlkZW9TaXplLmhlaWdodCk7CisgICAgICAgIHJldHVybiB2aWRlb1NpemU7CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIHNldFByZXZpZXdTaXplQnlQcm9maWxlKFBhcmFtZXRlcnMgcGFyYW1ldGVycywgQ2FtY29yZGVyUHJvZmlsZSBwcm9maWxlKSB7CiAgICAgICAgIGlmIChwYXJhbWV0ZXJzLmdldFN1cHBvcnRlZFZpZGVvU2l6ZXMoKSA9PSBudWxsKSB7CiAgICAgICAgICAgICBwYXJhbWV0ZXJzLnNldFByZXZpZXdTaXplKHByb2ZpbGUudmlkZW9GcmFtZVdpZHRoLApAQCAtMTIwNSw2ICsxMzEwLDU3IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgcmVjb3JkVmlkZW9CeVNpemUoQ2FtZXJhLlNpemUgc2l6ZSwKKyAgICAgICAgICAgIFN1cmZhY2VIb2xkZXIgaG9sZGVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTWVkaWFSZWNvcmRlciByZWNvcmRlciA9IG5ldyBNZWRpYVJlY29yZGVyKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBQYXNzIHRoZSBjYW1lcmEgZnJvbSB0aGUgdGVzdCBhcHBsaWNhdGlvbiB0byBtZWRpYSByZWNvcmRlci4KKyAgICAgICAgICAgIHJlY29yZGVyLnNldENhbWVyYShtQ2FtZXJhKTsKKyAgICAgICAgICAgIHJlY29yZGVyLnNldEF1ZGlvU291cmNlKE1lZGlhUmVjb3JkZXIuQXVkaW9Tb3VyY2UuQ0FNQ09SREVSKTsKKyAgICAgICAgICAgIHJlY29yZGVyLnNldFZpZGVvU291cmNlKE1lZGlhUmVjb3JkZXIuVmlkZW9Tb3VyY2UuQ0FNRVJBKTsKKyAgICAgICAgICAgIHJlY29yZGVyLnNldE91dHB1dEZvcm1hdChNZWRpYVJlY29yZGVyLk91dHB1dEZvcm1hdC5ERUZBVUxUKTsKKyAgICAgICAgICAgIHJlY29yZGVyLnNldFZpZGVvRW5jb2RpbmdCaXRSYXRlKFZJREVPX0JJVF9SQVRFX0lOX0JQUyk7CisgICAgICAgICAgICByZWNvcmRlci5zZXRWaWRlb0VuY29kZXIoTWVkaWFSZWNvcmRlci5WaWRlb0VuY29kZXIuREVGQVVMVCk7CisgICAgICAgICAgICByZWNvcmRlci5zZXRBdWRpb0VuY29kZXIoTWVkaWFSZWNvcmRlci5BdWRpb0VuY29kZXIuREVGQVVMVCk7CisgICAgICAgICAgICByZWNvcmRlci5zZXRWaWRlb1NpemUoc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQpOworICAgICAgICAgICAgcmVjb3JkZXIuc2V0T3V0cHV0RmlsZSgiL2Rldi9udWxsIik7CisgICAgICAgICAgICByZWNvcmRlci5zZXRQcmV2aWV3RGlzcGxheShob2xkZXIuZ2V0U3VyZmFjZSgpKTsKKyAgICAgICAgICAgIHJlY29yZGVyLnByZXBhcmUoKTsKKyAgICAgICAgICAgIHJlY29yZGVyLnN0YXJ0KCk7CisKKyAgICAgICAgICAgIC8vIEFwcHMgY2FuIHVzZSB0aGUgY2FtZXJhIGFmdGVyIHN0YXJ0IHNpbmNlIEFQSSBsZXZlbCAxMy4KKyAgICAgICAgICAgIFBhcmFtZXRlcnMgcGFyYW1ldGVycyA9IG1DYW1lcmEuZ2V0UGFyYW1ldGVycygpOworICAgICAgICAgICAgaWYgKHBhcmFtZXRlcnMuaXNab29tU3VwcG9ydGVkKCkpIHsKKyAgICAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJzLmdldE1heFpvb20oKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLnNldFpvb20oMSk7CisgICAgICAgICAgICAgICAgICAgbUNhbWVyYS5zZXRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpOworICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMuc2V0Wm9vbSgwKTsKKyAgICAgICAgICAgICAgICAgICBtQ2FtZXJhLnNldFBhcmFtZXRlcnMocGFyYW1ldGVycyk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGFyYW1ldGVycy5pc1Ntb290aFpvb21TdXBwb3J0ZWQoKSkgeworICAgICAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJzLmdldE1heFpvb20oKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgWm9vbUxpc3RlbmVyIHpvb21MaXN0ZW5lciA9IG5ldyBab29tTGlzdGVuZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgbUNhbWVyYS5zZXRab29tQ2hhbmdlTGlzdGVuZXIoem9vbUxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICAgICAgbUNhbWVyYS5zdGFydFNtb290aFpvb20oMSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoem9vbUxpc3RlbmVyLm1ab29tRG9uZS5ibG9jaygxMDAwKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1DYW1lcmEudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgZmFpbCgidW5sb2NrIHNob3VsZCBub3Qgc3VjY2VlZCBkdXJpbmcgcmVjb3JkaW5nLiIpOworICAgICAgICAgICAgfSBjYXRjaChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMjAwMCk7CisgICAgICAgICAgICByZWNvcmRlci5zdG9wKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICByZWNvcmRlci5yZWxlYXNlKCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgcmVjb3JkVmlkZW8oQ2FtY29yZGVyUHJvZmlsZSBwcm9maWxlLAogICAgICAgICAgICAgU3VyZmFjZUhvbGRlciBob2xkZXIpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBNZWRpYVJlY29yZGVyIHJlY29yZGVyID0gbmV3IE1lZGlhUmVjb3JkZXIoKTsKQEAgLTEyNjgsOCArMTQyNCwxNyBAQAogICAgICAgICBtQ2FtZXJhLnNldFByZXZpZXdEaXNwbGF5KHN1cmZhY2VIb2xkZXIpOwogICAgICAgICBQYXJhbWV0ZXJzIHBhcmFtZXRlcnMgPSBtQ2FtZXJhLmdldFBhcmFtZXRlcnMoKTsKICAgICAgICAgUHJldmlld0NhbGxiYWNrV2l0aEJ1ZmZlciBjYWxsYmFjayA9IG5ldyBQcmV2aWV3Q2FsbGJhY2tXaXRoQnVmZmVyKCk7CisgICAgICAgIFNpemUgUUNJRiA9IG1DYW1lcmEubmV3IFNpemUoMTc2LCAxNDQpOworICAgICAgICBTaXplIFZHQSA9IG1DYW1lcmEubmV3IFNpemUoNjQwLCA0ODApOworICAgICAgICBTaXplIGRlZmF1bHRQaWNTaXplID0gcGFyYW1ldGVycy5nZXRQaWN0dXJlU2l6ZSgpOworCiAgICAgICAgIC8vIFRlc3QgYWxsIHByZXZpZXcgc2l6ZXMuCiAgICAgICAgIGZvciAoU2l6ZSBzaXplOiBwYXJhbWV0ZXJzLmdldFN1cHBvcnRlZFByZXZpZXdTaXplcygpKSB7CisgICAgICAgICAgICBpZiAoc2l6ZS5lcXVhbHMoUUNJRikpIHsKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLnNldFBpY3R1cmVTaXplKFZHQS53aWR0aCwgVkdBLmhlaWdodCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMuc2V0UGljdHVyZVNpemUoZGVmYXVsdFBpY1NpemUud2lkdGgsIGRlZmF1bHRQaWNTaXplLmhlaWdodCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBwYXJhbWV0ZXJzLnNldFByZXZpZXdTaXplKHNpemUud2lkdGgsIHNpemUuaGVpZ2h0KTsKICAgICAgICAgICAgIG1DYW1lcmEuc2V0UGFyYW1ldGVycyhwYXJhbWV0ZXJzKTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscyhzaXplLCBtQ2FtZXJhLmdldFBhcmFtZXRlcnMoKS5nZXRQcmV2aWV3U2l6ZSgpKTsKQEAgLTEzNTgsMTEgKzE1MjMsMjAgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCisgICAgICAgIFNpemUgUUNJRiA9IG1DYW1lcmEubmV3IFNpemUoMTc2LCAxNDQpOworICAgICAgICBTaXplIFZHQSA9IG1DYW1lcmEubmV3IFNpemUoNjQwLCA0ODApOworICAgICAgICBTaXplIGRlZmF1bHRQaWNTaXplID0gcGFyYW1ldGVycy5nZXRQaWN0dXJlU2l6ZSgpOworCiAgICAgICAgIC8vIFRlc3QgdGhlIHpvb20gcGFyYW1ldGVycy4KICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHBhcmFtZXRlcnMuZ2V0Wm9vbSgpKTsgIC8vIGRlZmF1bHQgem9vbSBzaG91bGQgYmUgMC4KICAgICAgICAgZm9yIChTaXplIHNpemU6IHBhcmFtZXRlcnMuZ2V0U3VwcG9ydGVkUHJldmlld1NpemVzKCkpIHsKICAgICAgICAgICAgIHBhcmFtZXRlcnMgPSBtQ2FtZXJhLmdldFBhcmFtZXRlcnMoKTsKICAgICAgICAgICAgIHBhcmFtZXRlcnMuc2V0UHJldmlld1NpemUoc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQpOworICAgICAgICAgICAgaWYgKHNpemUuZXF1YWxzKFFDSUYpKSB7CisgICAgICAgICAgICAgICAgcGFyYW1ldGVycy5zZXRQaWN0dXJlU2l6ZShWR0Eud2lkdGgsIFZHQS5oZWlnaHQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLnNldFBpY3R1cmVTaXplKGRlZmF1bHRQaWNTaXplLndpZHRoLCBkZWZhdWx0UGljU2l6ZS5oZWlnaHQpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgbUNhbWVyYS5zZXRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpOwogICAgICAgICAgICAgcGFyYW1ldGVycyA9IG1DYW1lcmEuZ2V0UGFyYW1ldGVycygpOwogICAgICAgICAgICAgaW50IG1heFpvb20gPSBwYXJhbWV0ZXJzLmdldE1heFpvb20oKTsKQEAgLTE3ODcsNiArMTk2MSwyMiBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLy8gQVBJIGV4Y2VwdGlvbiBvbiBRQ0lGIHNpemUuIFFDSUYgc2l6ZSBhbG9uZyB3aXRoIGFueXRoaW5nIGxhcmdlciB0aGFuCisgICAgLy8gMTkyMHgxMDgwIG9uIGVpdGhlciB3aWR0aC9oZWlnaHQgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgc3VwcG9ydGVkLgorICAgIHByaXZhdGUgYm9vbGVhbiBpc1dhaXZlZENvbWJpbmF0aW9uKFNpemUgcHJldmlld1NpemUsIFNpemUgcGljdHVyZVNpemUpIHsKKyAgICAgICAgU2l6ZSBRQ0lGID0gbUNhbWVyYS5uZXcgU2l6ZSgxNzYsIDE0NCk7CisgICAgICAgIFNpemUgRlVMTF9IRCA9IG1DYW1lcmEubmV3IFNpemUoMTkyMCwgMTA4MCk7CisgICAgICAgIGlmIChwcmV2aWV3U2l6ZS5lcXVhbHMoUUNJRikgJiYgKHBpY3R1cmVTaXplLndpZHRoID4gRlVMTF9IRC53aWR0aCB8fAorICAgICAgICAgICAgICAgIHBpY3R1cmVTaXplLmhlaWdodCA+IEZVTExfSEQuaGVpZ2h0KSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBpY3R1cmVTaXplLmVxdWFscyhRQ0lGKSAmJiAocHJldmlld1NpemUud2lkdGggPiBGVUxMX0hELndpZHRoIHx8CisgICAgICAgICAgICAgICAgcHJldmlld1NpemUuaGVpZ2h0ID4gRlVMTF9IRC5oZWlnaHQpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIHRlc3RQcmV2aWV3UGljdHVyZVNpemVzQ29tYmluYXRpb25CeUNhbWVyYShpbnQgY2FtZXJhSWQpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBpbml0aWFsaXplTWVzc2FnZUxvb3BlcihjYW1lcmFJZCk7CiAgICAgICAgIFBhcmFtZXRlcnMgcGFyYW1ldGVycyA9IG1DYW1lcmEuZ2V0UGFyYW1ldGVycygpOwpAQCAtMTgwNCwxMiArMTk5NCwzMyBAQAogICAgICAgICAgICAgICAgIGNhbGxiYWNrLmV4cGVjdGVkUHJldmlld1NpemUgPSBwcmV2aWV3U2l6ZTsKICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLnNldFByZXZpZXdTaXplKHByZXZpZXdTaXplLndpZHRoLCBwcmV2aWV3U2l6ZS5oZWlnaHQpOwogICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMuc2V0UGljdHVyZVNpemUocGljdHVyZVNpemUud2lkdGgsIHBpY3R1cmVTaXplLmhlaWdodCk7Ci0gICAgICAgICAgICAgICAgbUNhbWVyYS5zZXRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG1DYW1lcmEuc2V0UGFyYW1ldGVycyhwYXJhbWV0ZXJzKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzV2FpdmVkQ29tYmluYXRpb24ocHJldmlld1NpemUsIHBpY3R1cmVTaXplKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCBTdHJpbmcuZm9ybWF0KCJQcmV2aWV3ICVkeCVkIGFuZCBzdGlsbCAlZHglZCBjb21iaW5hdGlvbiBpcyIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2FpdmVkIiwgcHJldmlld1NpemUud2lkdGgsIHByZXZpZXdTaXplLmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdHVyZVNpemUud2lkdGgsIHBpY3R1cmVTaXplLmhlaWdodCkpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMocHJldmlld1NpemUsIG1DYW1lcmEuZ2V0UGFyYW1ldGVycygpLmdldFByZXZpZXdTaXplKCkpOwogICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhwaWN0dXJlU2l6ZSwgbUNhbWVyYS5nZXRQYXJhbWV0ZXJzKCkuZ2V0UGljdHVyZVNpemUoKSk7CiAKICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcHJldmlldyBzaXplIGlzIHRoZSBzYW1lIGFzIHJlcXVlc3RlZC4KLSAgICAgICAgICAgICAgICBtQ2FtZXJhLnN0YXJ0UHJldmlldygpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG1DYW1lcmEuc3RhcnRQcmV2aWV3KCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc1dhaXZlZENvbWJpbmF0aW9uKHByZXZpZXdTaXplLCBwaWN0dXJlU2l6ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgU3RyaW5nLmZvcm1hdCgiUHJldmlldyAlZHglZCBhbmQgc3RpbGwgJWR4JWQgY29tYmluYXRpb24gaXMiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndhaXZlZCIsIHByZXZpZXdTaXplLndpZHRoLCBwcmV2aWV3U2l6ZS5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmVTaXplLndpZHRoLCBwaWN0dXJlU2l6ZS5oZWlnaHQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHdhaXRGb3JQcmV2aWV3RG9uZSgpOwogICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhQUkVWSUVXX0NBTExCQUNLX1JFQ0VJVkVELCBtUHJldmlld0NhbGxiYWNrUmVzdWx0KTsKIApAQCAtMjAxNSw2ICsyMjI2LDkgQEAKICAgICAgICAgICAgICAgICAvLyB4MTAwID0gcGVyY2VudCwgaW50ZXJ2YWxNYXJnaW4gc2hvdWxkIGJlIGJpZ2dlciB0aGFuCiAgICAgICAgICAgICAgICAgLy8gZnBzTWFyZ2luIGNvbnNpZGVyaW5nIHRoYXQgZnBzIHdpbGwgYmUgaW4gdGhlIG9yZGVyIG9mIDEwLgogICAgICAgICAgICAgICAgIGRvdWJsZSBpbnRlcnZhbE1hcmdpbiA9IDAuOTsKKyAgICAgICAgICAgICAgICBpZiAobUlzRXh0ZXJuYWxDYW1lcmEpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50ZXJ2YWxNYXJnaW4gPSAwLjg7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGxvbmcgbGFzdEFycml2YWxUaW1lID0gbUZyYW1lcy5nZXQobUZyYW1lcy5zaXplKCkgLSAxKTsKICAgICAgICAgICAgICAgICBkb3VibGUgaW50ZXJ2YWwgPSBhcnJpdmFsVGltZSAtIGxhc3RBcnJpdmFsVGltZTsKICAgICAgICAgICAgICAgICBpZiAoVkVSQk9TRSkgTG9nLnYoVEFHLCAiRnJhbWUgaW50ZXJ2YWw9IiArIGludGVydmFsKTsKQEAgLTIwMjksNiArMjI0Myw5IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGZwcyBpcyB3aXRoaW4gcmFuZ2UuCiAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBmcHNNYXJnaW4gPSAwLjU7IC8vIHgxMDAgPSBwZXJjZW50CisgICAgICAgICAgICAgICAgICAgIGlmIChtSXNFeHRlcm5hbENhbWVyYSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZnBzTWFyZ2luID0gMC42OworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhdmdJbnRlcnZhbCA9IChkb3VibGUpKGFycml2YWxUaW1lIC0gbUZyYW1lcy5nZXQoMCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBtRnJhbWVzLnNpemUoKTsKICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGZwcyA9IDEwMDAuMCAvIGF2Z0ludGVydmFsOwpAQCAtMjM2Myw3ICsyNTgwLDcgQEAKICAgICAgICAgbUNhbWVyYS5zdG9wUHJldmlldygpOwogCiAgICAgICAgIGZpcnN0TG9vcGVyLnF1aXQoKTsKLSAgICAgICAgdGVybWluYXRlTWVzc2FnZUxvb3BlcigpOworICAgICAgICB0ZXJtaW5hdGVNZXNzYWdlTG9vcGVyKHRydWUvKmFsbG93RXZpY3QqLyk7CiAgICAgfQogCiAgICAgLy8gVGhpcyBjYWxsYmFjayBqdXN0IHNpZ25hbHMgb24gdGhlIGNvbmRpdGlvbiB2YXJpYWJsZSwgbWFraW5nIGl0IHVzZWZ1bCBmb3IgY2hlY2tpbmcgdGhhdApAQCAtMjU3OCwxNyArMjc5NSwyNyBAQAogICAgICAgICBQYXJhbWV0ZXJzIHBhcmFtZXRlcnMgPSBtQ2FtZXJhLmdldFBhcmFtZXRlcnMoKTsKIAogICAgICAgICBTdXJmYWNlSG9sZGVyIGhvbGRlciA9IGdldEFjdGl2aXR5KCkuZ2V0U3VyZmFjZVZpZXcoKS5nZXRIb2xkZXIoKTsKLSAgICAgICAgQ2FtY29yZGVyUHJvZmlsZSBwcm9maWxlID0gQ2FtY29yZGVyUHJvZmlsZS5nZXQoY2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgQ2FtY29yZGVyUHJvZmlsZS5RVUFMSVRZX0xPVyk7CisgICAgICAgIENhbWNvcmRlclByb2ZpbGUgcHJvZmlsZSA9IG51bGw7IC8vIGZvciBidWlsdC1pbiBjYW1lcmEKKyAgICAgICAgQ2FtZXJhLlNpemUgdmlkZW9TaXplID0gbnVsbDsgLy8gZm9yIGV4dGVybmFsIGNhbWVyYQogCi0gICAgICAgIHNldFByZXZpZXdTaXplQnlQcm9maWxlKHBhcmFtZXRlcnMsIHByb2ZpbGUpOworICAgICAgICBpZiAobUlzRXh0ZXJuYWxDYW1lcmEpIHsKKyAgICAgICAgICAgIHZpZGVvU2l6ZSA9IHNldHVwRXh0ZXJuYWxDYW1lcmFSZWNvcmQocGFyYW1ldGVycyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcm9maWxlID0gQ2FtY29yZGVyUHJvZmlsZS5nZXQoY2FtZXJhSWQsIENhbWNvcmRlclByb2ZpbGUuUVVBTElUWV9MT1cpOworICAgICAgICAgICAgc2V0UHJldmlld1NpemVCeVByb2ZpbGUocGFyYW1ldGVycywgcHJvZmlsZSk7CisgICAgICAgIH0KKwogCiAgICAgICAgIC8vIFRlc3QgcmVjb3JkaW5nIHZpZGVvcyBhbmQgdGFraW5nIHBpY3R1cmVzIHdoZW4gdGhlIGhpbnQgaXMgb2ZmIGFuZCBvbi4KICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKICAgICAgICAgICAgIHBhcmFtZXRlcnMuc2V0UmVjb3JkaW5nSGludChpID09IDAgPyBmYWxzZSA6IHRydWUpOwogICAgICAgICAgICAgbUNhbWVyYS5zZXRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpOwogICAgICAgICAgICAgbUNhbWVyYS5zdGFydFByZXZpZXcoKTsKLSAgICAgICAgICAgIHJlY29yZFZpZGVvU2ltcGxlKHByb2ZpbGUsIGhvbGRlcik7CisgICAgICAgICAgICBpZiAobUlzRXh0ZXJuYWxDYW1lcmEpIHsKKyAgICAgICAgICAgICAgICByZWNvcmRWaWRlb1NpbXBsZUJ5U2l6ZSh2aWRlb1NpemUsIGhvbGRlcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlY29yZFZpZGVvU2ltcGxlKHByb2ZpbGUsIGhvbGRlcik7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBtQ2FtZXJhLnRha2VQaWN0dXJlKG1TaHV0dGVyQ2FsbGJhY2ssIG1SYXdQaWN0dXJlQ2FsbGJhY2ssIG1KcGVnUGljdHVyZUNhbGxiYWNrKTsKICAgICAgICAgICAgIHdhaXRGb3JTbmFwc2hvdERvbmUoKTsKICAgICAgICAgICAgIGFzc2VydFRydWUobUpwZWdQaWN0dXJlQ2FsbGJhY2tSZXN1bHQpOwpAQCAtMjYwMyw2ICsyODMwLDMxIEBACiAgICAgICAgIHRlcm1pbmF0ZU1lc3NhZ2VMb29wZXIoKTsKICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgcmVjb3JkVmlkZW9TaW1wbGVCeVNpemUoQ2FtZXJhLlNpemUgc2l6ZSwKKyAgICAgICAgICAgIFN1cmZhY2VIb2xkZXIgaG9sZGVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbUNhbWVyYS51bmxvY2soKTsKKyAgICAgICAgTWVkaWFSZWNvcmRlciByZWNvcmRlciA9IG5ldyBNZWRpYVJlY29yZGVyKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWNvcmRlci5zZXRDYW1lcmEobUNhbWVyYSk7CisgICAgICAgICAgICByZWNvcmRlci5zZXRBdWRpb1NvdXJjZShNZWRpYVJlY29yZGVyLkF1ZGlvU291cmNlLkNBTUNPUkRFUik7CisgICAgICAgICAgICByZWNvcmRlci5zZXRWaWRlb1NvdXJjZShNZWRpYVJlY29yZGVyLlZpZGVvU291cmNlLkNBTUVSQSk7CisgICAgICAgICAgICByZWNvcmRlci5zZXRPdXRwdXRGb3JtYXQoTWVkaWFSZWNvcmRlci5PdXRwdXRGb3JtYXQuREVGQVVMVCk7CisgICAgICAgICAgICByZWNvcmRlci5zZXRWaWRlb0VuY29kaW5nQml0UmF0ZShWSURFT19CSVRfUkFURV9JTl9CUFMpOworICAgICAgICAgICAgcmVjb3JkZXIuc2V0VmlkZW9FbmNvZGVyKE1lZGlhUmVjb3JkZXIuVmlkZW9FbmNvZGVyLkRFRkFVTFQpOworICAgICAgICAgICAgcmVjb3JkZXIuc2V0QXVkaW9FbmNvZGVyKE1lZGlhUmVjb3JkZXIuQXVkaW9FbmNvZGVyLkRFRkFVTFQpOworICAgICAgICAgICAgcmVjb3JkZXIuc2V0VmlkZW9TaXplKHNpemUud2lkdGgsIHNpemUuaGVpZ2h0KTsKKyAgICAgICAgICAgIHJlY29yZGVyLnNldE91dHB1dEZpbGUoIi9kZXYvbnVsbCIpOworICAgICAgICAgICAgcmVjb3JkZXIuc2V0UHJldmlld0Rpc3BsYXkoaG9sZGVyLmdldFN1cmZhY2UoKSk7CisgICAgICAgICAgICByZWNvcmRlci5wcmVwYXJlKCk7CisgICAgICAgICAgICByZWNvcmRlci5zdGFydCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDIwMDApOworICAgICAgICAgICAgcmVjb3JkZXIuc3RvcCgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcmVjb3JkZXIucmVsZWFzZSgpOworICAgICAgICAgICAgbUNhbWVyYS5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgcmVjb3JkVmlkZW9TaW1wbGUoQ2FtY29yZGVyUHJvZmlsZSBwcm9maWxlLAogICAgICAgICAgICAgU3VyZmFjZUhvbGRlciBob2xkZXIpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBtQ2FtZXJhLnVubG9jaygpOwpAQCAtMzE4OCw1ICszNDQwLDQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvY2FtZXJhL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2N0cy9DYW1lcmFfUGFyYW1ldGVyc1Rlc3QuamF2YSBiL3Rlc3RzL2NhbWVyYS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jdHMvQ2FtZXJhX1BhcmFtZXRlcnNUZXN0LmphdmEKaW5kZXggYjM3OTU5ZS4uYTYxNDk4MiAxMDA2NDQKLS0tIGEvdGVzdHMvY2FtZXJhL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2N0cy9DYW1lcmFfUGFyYW1ldGVyc1Rlc3QuamF2YQorKysgYi90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY3RzL0NhbWVyYV9QYXJhbWV0ZXJzVGVzdC5qYXZhCkBAIC0xOCw3ICsxOCw5IEBACiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5DYW1lcmEuUGFyYW1ldGVyczsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CiAKK0BBcHBNb2RlRnVsbAogcHVibGljIGNsYXNzIENhbWVyYV9QYXJhbWV0ZXJzVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIAogICAgIHB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NNZXRob2RzKCkgewpkaWZmIC0tZ2l0IGEvdGVzdHMvY2FtZXJhL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2N0cy9DYW1lcmFfU2l6ZVRlc3QuamF2YSBiL3Rlc3RzL2NhbWVyYS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jdHMvQ2FtZXJhX1NpemVUZXN0LmphdmEKaW5kZXggNzdlNzVkZC4uYWNlM2NmNyAxMDA2NDQKLS0tIGEvdGVzdHMvY2FtZXJhL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2N0cy9DYW1lcmFfU2l6ZVRlc3QuamF2YQorKysgYi90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY3RzL0NhbWVyYV9TaXplVGVzdC5qYXZhCkBAIC0xOSw2ICsxOSw3IEBACiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5DYW1lcmE7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5DYW1lcmEuUGFyYW1ldGVyczsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmN0cy5oZWxwZXJzLkNhbWVyYVV0aWxzOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIGltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTGFyZ2VUZXN0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKQEAgLTMwLDYgKzMxLDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKK0BBcHBNb2RlRnVsbAogQExhcmdlVGVzdAogcHVibGljIGNsYXNzIENhbWVyYV9TaXplVGVzdCBleHRlbmRzIEN0c0FuZHJvaWRUZXN0Q2FzZSB7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL2NhbWVyYS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9tdWx0aXByb2Nlc3MvY2FtZXJhL2N0cy9DYW1lcmFFdmljdGlvblRlc3QuamF2YSBiL3Rlc3RzL2NhbWVyYS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9tdWx0aXByb2Nlc3MvY2FtZXJhL2N0cy9DYW1lcmFFdmljdGlvblRlc3QuamF2YQppbmRleCA4MzRkMzdjLi42YWQ4YjJlIDEwMDY0NAotLS0gYS90ZXN0cy9jYW1lcmEvc3JjL2FuZHJvaWQvaGFyZHdhcmUvbXVsdGlwcm9jZXNzL2NhbWVyYS9jdHMvQ2FtZXJhRXZpY3Rpb25UZXN0LmphdmEKKysrIGIvdGVzdHMvY2FtZXJhL3NyYy9hbmRyb2lkL2hhcmR3YXJlL211bHRpcHJvY2Vzcy9jYW1lcmEvY3RzL0NhbWVyYUV2aWN0aW9uVGVzdC5qYXZhCkBAIC0yNiw2ICsyNiw3IEBACiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jdHMuQ2FtZXJhQ3RzQWN0aXZpdHk7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIGltcG9ydCBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIApAQCAtNDAsNiArNDEsNyBAQAogLyoqCiAgKiBUZXN0cyBmb3IgbXVsdGktcHJvY2VzcyBjYW1lcmEgdXNhZ2UgYmVoYXZpb3IuCiAgKi8KK0BBcHBNb2RlRnVsbAogcHVibGljIGNsYXNzIENhbWVyYUV2aWN0aW9uVGVzdCBleHRlbmRzIEFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyPENhbWVyYUN0c0FjdGl2aXR5PiB7CiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQ2FtZXJhRXZpY3Rpb25UZXN0IjsKQEAgLTIyNywxOCArMjI5LDE1IEBACiAgICAgICAgIHZlcmlmeShzcHlTdGF0ZUNiLCB0aW1lcygxKSkub25PcGVuZWQoYW55KENhbWVyYURldmljZS5jbGFzcykpOwogCiAgICAgICAgIC8vIFZlcmlmeSB0aGF0IHdlIGNhbiBubyBsb25nZXIgb3BlbiB0aGUgY2FtZXJhLCBhcyBpdCBpcyBoZWxkIGJ5IGEgaGlnaGVyIHByaW9yaXR5IHByb2Nlc3MKLSAgICAgICAgYm9vbGVhbiBvcGVuRXhjZXB0aW9uID0gZmFsc2U7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBtYW5hZ2VyLm9wZW5DYW1lcmEoY2hvc2VuQ2FtZXJhLCBzcHlTdGF0ZUNiLCBjYW1lcmFIYW5kbGVyKTsKKyAgICAgICAgICAgIGZhaWwoIkRpZG4ndCByZWNlaXZlIGV4Y2VwdGlvbiB3aGVuIHRyeWluZyB0byBvcGVuIGNhbWVyYSBoZWxkIGJ5IGhpZ2hlciBwcmlvcml0eSAiICsKKyAgICAgICAgICAgICAgICAgICAgInByb2Nlc3MuIik7CiAgICAgICAgIH0gY2F0Y2goQ2FtZXJhQWNjZXNzRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIGFzc2VydFRydWUoIlJlY2VpdmVkIGluY29ycmVjdCBjYW1lcmEgZXhjZXB0aW9uIHdoZW4gb3BlbmluZyBjYW1lcmE6ICIgKyBlLAogICAgICAgICAgICAgICAgICAgICBlLmdldFJlYXNvbigpID09IENhbWVyYUFjY2Vzc0V4Y2VwdGlvbi5DQU1FUkFfSU5fVVNFKTsKLSAgICAgICAgICAgIG9wZW5FeGNlcHRpb24gPSB0cnVlOwogICAgICAgICB9CiAKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRGlkbid0IHJlY2VpdmUgZXhjZXB0aW9uIHdoZW4gdHJ5aW5nIHRvIG9wZW4gY2FtZXJhIGhlbGQgYnkgaGlnaGVyIHByaW9yaXR5ICIgKwotICAgICAgICAgICAgICAgICJwcm9jZXNzLiIsIG9wZW5FeGNlcHRpb24pOwotCiAgICAgICAgIC8vIFZlcmlmeSB0aGF0IGF0dGVtcHRpbmcgdG8gb3BlbiB0aGUgY2FtZXJhIGRpZG4ndCBjYXVzZSBhbnl0aGluZyB3ZWlyZCB0byBoYXBwZW4gaW4gdGhlCiAgICAgICAgIC8vIG90aGVyIHByb2Nlc3MuCiAgICAgICAgIExpc3Q8RXJyb3JMb2dnaW5nU2VydmljZS5Mb2dFdmVudD4gZXZlbnRMaXN0MiA9IG51bGw7CmRpZmYgLS1naXQgYS90ZXN0cy9jYW1lcmEvdXRpbHMvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9jdHMvQ2FtZXJhVGVzdFV0aWxzLmphdmEgYi90ZXN0cy9jYW1lcmEvdXRpbHMvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9jdHMvQ2FtZXJhVGVzdFV0aWxzLmphdmEKaW5kZXggMTY3OTE5NS4uOTI1NGVhOSAxMDA2NDQKLS0tIGEvdGVzdHMvY2FtZXJhL3V0aWxzL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvY3RzL0NhbWVyYVRlc3RVdGlscy5qYXZhCisrKyBiL3Rlc3RzL2NhbWVyYS91dGlscy9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL2N0cy9DYW1lcmFUZXN0VXRpbHMuamF2YQpAQCAtMzcsNiArMzcsNyBAQAogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY3RzLmhlbHBlcnMuQ2FtZXJhVXRpbHM7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLnBhcmFtcy5NZXRlcmluZ1JlY3RhbmdsZTsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIucGFyYW1zLk91dHB1dENvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLnBhcmFtcy5TZXNzaW9uQ29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIucGFyYW1zLlN0cmVhbUNvbmZpZ3VyYXRpb25NYXA7CiBpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uTWFuYWdlcjsKQEAgLTc4LDYgKzc5LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljTG9uZzsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5MaW5rZWRCbG9ja2luZ1F1ZXVlOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNlbWFwaG9yZTsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKQEAgLTEwOCw3ICsxMTAsNyBAQAogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VTU0lPTl9DT05GSUdVUkVfVElNRU9VVF9NUyA9IDMwMDA7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VTU0lPTl9DTE9TRV9USU1FT1VUX01TID0gMzAwMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVNTSU9OX1JFQURZX1RJTUVPVVRfTVMgPSAzMDAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFU1NJT05fUkVBRFlfVElNRU9VVF9NUyA9IDUwMDA7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VTU0lPTl9BQ1RJVkVfVElNRU9VVF9NUyA9IDEwMDA7CiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfUkVBREVSX0lNQUdFUyA9IDU7CkBAIC03ODAsNiArNzgyLDQxIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogQnVpbGQgYSBuZXcgY29uc3RyYWluZWQgY2FtZXJhIHNlc3Npb24gd2l0aCBvdXRwdXQgc3VyZmFjZXMsIHR5cGUgYW5kIHJlY29yZGluZyBzZXNzaW9uCisgICAgICogcGFyYW1ldGVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjYW1lcmEgVGhlIENhbWVyYURldmljZSB0byBiZSBjb25maWd1cmVkLgorICAgICAqIEBwYXJhbSBvdXRwdXRTdXJmYWNlcyBUaGUgc3VyZmFjZSBsaXN0IHRoYXQgdXNlZCBmb3IgY2FtZXJhIG91dHB1dC4KKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGNhbGxiYWNrIENhbWVyYURldmljZSB3aWxsIG5vdGlmeSB3aGVuIGNhcHR1cmUgcmVzdWx0cyBhcmUgYXZhaWxhYmxlLgorICAgICAqIEBwYXJhbSBpbml0aWFsUmVxdWVzdCBJbml0aWFsIHJlcXVlc3Qgc2V0dGluZ3MgdG8gdXNlIGFzIHNlc3Npb24gcGFyYW1ldGVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENhbWVyYUNhcHR1cmVTZXNzaW9uIGJ1aWxkQ29uc3RyYWluZWRDYW1lcmFTZXNzaW9uKENhbWVyYURldmljZSBjYW1lcmEsCisgICAgICAgICAgICBMaXN0PFN1cmZhY2U+IG91dHB1dFN1cmZhY2VzLCBDYW1lcmFDYXB0dXJlU2Vzc2lvbi5TdGF0ZUNhbGxiYWNrIGxpc3RlbmVyLAorICAgICAgICAgICAgSGFuZGxlciBoYW5kbGVyLCBDYXB0dXJlUmVxdWVzdCBpbml0aWFsUmVxdWVzdCkgdGhyb3dzIENhbWVyYUFjY2Vzc0V4Y2VwdGlvbiB7CisgICAgICAgIEJsb2NraW5nU2Vzc2lvbkNhbGxiYWNrIHNlc3Npb25MaXN0ZW5lciA9IG5ldyBCbG9ja2luZ1Nlc3Npb25DYWxsYmFjayhsaXN0ZW5lcik7CisKKyAgICAgICAgTGlzdDxPdXRwdXRDb25maWd1cmF0aW9uPiBvdXRDb25maWd1cmF0aW9ucyA9IG5ldyBBcnJheUxpc3Q8PihvdXRwdXRTdXJmYWNlcy5zaXplKCkpOworICAgICAgICBmb3IgKFN1cmZhY2Ugc3VyZmFjZSA6IG91dHB1dFN1cmZhY2VzKSB7CisgICAgICAgICAgICBvdXRDb25maWd1cmF0aW9ucy5hZGQobmV3IE91dHB1dENvbmZpZ3VyYXRpb24oc3VyZmFjZSkpOworICAgICAgICB9CisgICAgICAgIFNlc3Npb25Db25maWd1cmF0aW9uIHNlc3Npb25Db25maWcgPSBuZXcgU2Vzc2lvbkNvbmZpZ3VyYXRpb24oCisgICAgICAgICAgICAgICAgU2Vzc2lvbkNvbmZpZ3VyYXRpb24uU0VTU0lPTl9ISUdIX1NQRUVELCBvdXRDb25maWd1cmF0aW9ucywKKyAgICAgICAgICAgICAgICBuZXcgSGFuZGxlckV4ZWN1dG9yKGhhbmRsZXIpLCBzZXNzaW9uTGlzdGVuZXIpOworICAgICAgICBzZXNzaW9uQ29uZmlnLnNldFNlc3Npb25QYXJhbWV0ZXJzKGluaXRpYWxSZXF1ZXN0KTsKKyAgICAgICAgY2FtZXJhLmNyZWF0ZUNhcHR1cmVTZXNzaW9uKHNlc3Npb25Db25maWcpOworCisgICAgICAgIENhbWVyYUNhcHR1cmVTZXNzaW9uIHNlc3Npb24gPQorICAgICAgICAgICAgICAgIHNlc3Npb25MaXN0ZW5lci53YWl0QW5kR2V0U2Vzc2lvbihTRVNTSU9OX0NPTkZJR1VSRV9USU1FT1VUX01TKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIkNhbWVyYSBzZXNzaW9uIHNob3VsZCBub3QgYmUgYSByZXByb2Nlc3NhYmxlIHNlc3Npb24iLAorICAgICAgICAgICAgICAgIHNlc3Npb24uaXNSZXByb2Nlc3NhYmxlKCkpOworICAgICAgICBhc3NlcnRUcnVlKCJDYXB0dXJlIHNlc3Npb24gdHlwZSBtdXN0IGJlIEhpZ2ggU3BlZWQiLAorICAgICAgICAgICAgICAgIENhbWVyYUNvbnN0cmFpbmVkSGlnaFNwZWVkQ2FwdHVyZVNlc3Npb24uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2xhc3MoKSkpOworCisgICAgICAgIHJldHVybiBzZXNzaW9uOworICAgIH0KKworICAgIC8qKgogICAgICAqIENvbmZpZ3VyZSBhIG5ldyBjYW1lcmEgc2Vzc2lvbiB3aXRoIG91dHB1dCBjb25maWd1cmF0aW9ucy4KICAgICAgKgogICAgICAqIEBwYXJhbSBjYW1lcmEgVGhlIENhbWVyYURldmljZSB0byBiZSBjb25maWd1cmVkLgpAQCAtODI3LDYgKzg2NCwzNyBAQAogICAgICAgICByZXR1cm4gc2Vzc2lvbjsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmUgYSBuZXcgY2FtZXJhIHNlc3Npb24gd2l0aCBvdXRwdXQgc3VyZmFjZXMgYW5kIGluaXRpYWwgc2Vzc2lvbiBwYXJhbWV0ZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIGNhbWVyYSBUaGUgQ2FtZXJhRGV2aWNlIHRvIGJlIGNvbmZpZ3VyZWQuCisgICAgICogQHBhcmFtIG91dHB1dFN1cmZhY2VzIFRoZSBzdXJmYWNlIGxpc3QgdGhhdCB1c2VkIGZvciBjYW1lcmEgb3V0cHV0LgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgY2FsbGJhY2sgQ2FtZXJhRGV2aWNlIHdpbGwgbm90aWZ5IHdoZW4gc2Vzc2lvbiBpcyBhdmFpbGFibGUuCisgICAgICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgdXNlZCB0byBub3RpZnkgY2FsbGJhY2tzLgorICAgICAqIEBwYXJhbSBpbml0aWFsUmVxdWVzdCBJbml0aWFsIHJlcXVlc3Qgc2V0dGluZ3MgdG8gdXNlIGFzIHNlc3Npb24gcGFyYW1ldGVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENhbWVyYUNhcHR1cmVTZXNzaW9uIGNvbmZpZ3VyZUNhbWVyYVNlc3Npb25XaXRoUGFyYW1ldGVycyhDYW1lcmFEZXZpY2UgY2FtZXJhLAorICAgICAgICAgICAgTGlzdDxTdXJmYWNlPiBvdXRwdXRTdXJmYWNlcywgQmxvY2tpbmdTZXNzaW9uQ2FsbGJhY2sgbGlzdGVuZXIsCisgICAgICAgICAgICBIYW5kbGVyIGhhbmRsZXIsIENhcHR1cmVSZXF1ZXN0IGluaXRpYWxSZXF1ZXN0KSB0aHJvd3MgQ2FtZXJhQWNjZXNzRXhjZXB0aW9uIHsKKyAgICAgICAgTGlzdDxPdXRwdXRDb25maWd1cmF0aW9uPiBvdXRDb25maWd1cmF0aW9ucyA9IG5ldyBBcnJheUxpc3Q8PihvdXRwdXRTdXJmYWNlcy5zaXplKCkpOworICAgICAgICBmb3IgKFN1cmZhY2Ugc3VyZmFjZSA6IG91dHB1dFN1cmZhY2VzKSB7CisgICAgICAgICAgICBvdXRDb25maWd1cmF0aW9ucy5hZGQobmV3IE91dHB1dENvbmZpZ3VyYXRpb24oc3VyZmFjZSkpOworICAgICAgICB9CisgICAgICAgIFNlc3Npb25Db25maWd1cmF0aW9uIHNlc3Npb25Db25maWcgPSBuZXcgU2Vzc2lvbkNvbmZpZ3VyYXRpb24oCisgICAgICAgICAgICAgICAgU2Vzc2lvbkNvbmZpZ3VyYXRpb24uU0VTU0lPTl9SRUdVTEFSLCBvdXRDb25maWd1cmF0aW9ucywKKyAgICAgICAgICAgICAgICBuZXcgSGFuZGxlckV4ZWN1dG9yKGhhbmRsZXIpLCBsaXN0ZW5lcik7CisgICAgICAgIHNlc3Npb25Db25maWcuc2V0U2Vzc2lvblBhcmFtZXRlcnMoaW5pdGlhbFJlcXVlc3QpOworICAgICAgICBjYW1lcmEuY3JlYXRlQ2FwdHVyZVNlc3Npb24oc2Vzc2lvbkNvbmZpZyk7CisKKyAgICAgICAgQ2FtZXJhQ2FwdHVyZVNlc3Npb24gc2Vzc2lvbiA9IGxpc3RlbmVyLndhaXRBbmRHZXRTZXNzaW9uKFNFU1NJT05fQ09ORklHVVJFX1RJTUVPVVRfTVMpOworICAgICAgICBhc3NlcnRGYWxzZSgiQ2FtZXJhIHNlc3Npb24gc2hvdWxkIG5vdCBiZSBhIHJlcHJvY2Vzc2FibGUgc2Vzc2lvbiIsCisgICAgICAgICAgICAgICAgc2Vzc2lvbi5pc1JlcHJvY2Vzc2FibGUoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJDYXB0dXJlIHNlc3Npb24gdHlwZSBtdXN0IGJlIHJlZ3VsYXIiLAorICAgICAgICAgICAgICAgIENhbWVyYUNvbnN0cmFpbmVkSGlnaFNwZWVkQ2FwdHVyZVNlc3Npb24uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2xhc3MoKSkpOworCisgICAgICAgIHJldHVybiBzZXNzaW9uOworICAgIH0KIAogICAgIC8qKgogICAgICAqIENvbmZpZ3VyZSBhIG5ldyBjYW1lcmEgc2Vzc2lvbiB3aXRoIG91dHB1dCBzdXJmYWNlcy4KQEAgLTE0NzMsNiArMTU0MSwyMCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBIYW5kbGVyRXhlY3V0b3IgaW1wbGVtZW50cyBFeGVjdXRvciB7CisgICAgICAgIHByaXZhdGUgZmluYWwgSGFuZGxlciBtSGFuZGxlcjsKKworICAgICAgICBwdWJsaWMgSGFuZGxlckV4ZWN1dG9yKEhhbmRsZXIgaGFuZGxlcikgeworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiaGFuZGxlciBtdXN0IGJlIHZhbGlkIiwgaGFuZGxlcik7CisgICAgICAgICAgICBtSGFuZGxlciA9IGhhbmRsZXI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZShSdW5uYWJsZSBydW5DbWQpIHsKKyAgICAgICAgICAgIG1IYW5kbGVyLnBvc3QocnVuQ21kKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qKgogICAgICAqIFByb3ZpZGUgYSBtb2NrIGZvciB7QGxpbmsgQ2FtZXJhRGV2aWNlLlN0YXRlQ2FsbGJhY2t9LgogICAgICAqCkBAIC0xNzg2LDcgKzE4NjgsNyBAQAogICAgICAqIEBwYXJhbSBzcmMgVGhlIHNvdXJjZSBpbWFnZSB0byBiZSBjb3BpZWQgZnJvbS4KICAgICAgKiBAcGFyYW0gZHN0IFRoZSBkZXN0aW5hdGlvbiBpbWFnZSB0byBiZSBjb3BpZWQgdG8uCiAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gSWYgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gaW1hZ2VzIGhhdmUKLSAgICAgKiAgICAgICAgICAgICBkaWZmZXJlbnQgZm9ybWF0LCBvciBvbmUgb2YgdGhlIGltYWdlcyBpcyBub3QgY29weWFibGUuCisgICAgICogICAgICAgICAgICAgZGlmZmVyZW50IGZvcm1hdCwgc2l6ZSwgb3Igb25lIG9mIHRoZSBpbWFnZXMgaXMgbm90IGNvcHlhYmxlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbWFnZUNvcHkoSW1hZ2Ugc3JjLCBJbWFnZSBkc3QpIHsKICAgICAgICAgaWYgKHNyYyA9PSBudWxsIHx8IGRzdCA9PSBudWxsKSB7CkBAIC0xODAwLDYgKzE4ODIsMTMgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlBSSVZBVEUgZm9ybWF0IGltYWdlcyBhcmUgbm90IGNvcHlhYmxlIik7CiAgICAgICAgIH0KIAorICAgICAgICBTaXplIHNyY1NpemUgPSBuZXcgU2l6ZShzcmMuZ2V0V2lkdGgoKSwgc3JjLmdldEhlaWdodCgpKTsKKyAgICAgICAgU2l6ZSBkc3RTaXplID0gbmV3IFNpemUoZHN0LmdldFdpZHRoKCksIGRzdC5nZXRIZWlnaHQoKSk7CisgICAgICAgIGlmICghc3JjU2l6ZS5lcXVhbHMoZHN0U2l6ZSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNvdXJjZSBpbWFnZSBzaXplICIgKyBzcmNTaXplICsgIiBpcyBkaWZmZXJlbnQiCisgICAgICAgICAgICAgICAgICAgICsgIiB3aXRoICIgKyAiZGVzdGluYXRpb24gaW1hZ2Ugc2l6ZSAiICsgZHN0U2l6ZSk7CisgICAgICAgIH0KKwogICAgICAgICAvLyBUT0RPOiBjaGVjayB0aGUgb3duZXIgb2YgdGhlIGRzdCBpbWFnZSwgaXQgbXVzdCBiZSBmcm9tIEltYWdlV3JpdGVyLCBvdGhlciBzb3VyY2UgbWF5CiAgICAgICAgIC8vIG5vdCBiZSB3cml0YWJsZS4gTWF5YmUgd2Ugc2hvdWxkIGFkZCBhbiBpc1dyaXRhYmxlKCkgbWV0aG9kIGluIGltYWdlIGNsYXNzLgogCkBAIC0xODA5LDE2ICsxODk4LDEwMSBAQAogICAgICAgICBCeXRlQnVmZmVyIGRzdEJ1ZmZlciA9IG51bGw7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3JjUGxhbmVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICBzcmNCdWZmZXIgPSBzcmNQbGFuZXNbaV0uZ2V0QnVmZmVyKCk7CisgICAgICAgICAgICBkc3RCdWZmZXIgPSBkc3RQbGFuZXNbaV0uZ2V0QnVmZmVyKCk7CiAgICAgICAgICAgICBpbnQgc3JjUG9zID0gc3JjQnVmZmVyLnBvc2l0aW9uKCk7CiAgICAgICAgICAgICBzcmNCdWZmZXIucmV3aW5kKCk7Ci0gICAgICAgICAgICBkc3RCdWZmZXIgPSBkc3RQbGFuZXNbaV0uZ2V0QnVmZmVyKCk7CiAgICAgICAgICAgICBkc3RCdWZmZXIucmV3aW5kKCk7Ci0gICAgICAgICAgICBkc3RCdWZmZXIucHV0KHNyY0J1ZmZlcik7CisgICAgICAgICAgICBpbnQgc3JjUm93U3RyaWRlID0gc3JjUGxhbmVzW2ldLmdldFJvd1N0cmlkZSgpOworICAgICAgICAgICAgaW50IGRzdFJvd1N0cmlkZSA9IGRzdFBsYW5lc1tpXS5nZXRSb3dTdHJpZGUoKTsKKyAgICAgICAgICAgIGludCBzcmNQaXhTdHJpZGUgPSBzcmNQbGFuZXNbaV0uZ2V0UGl4ZWxTdHJpZGUoKTsKKyAgICAgICAgICAgIGludCBkc3RQaXhTdHJpZGUgPSBkc3RQbGFuZXNbaV0uZ2V0UGl4ZWxTdHJpZGUoKTsKKworICAgICAgICAgICAgaWYgKHNyY1BpeFN0cmlkZSA+IDIgfHwgZHN0UGl4U3RyaWRlID4gMikgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNvdXJjZSBwaXhlbCBzdHJpZGUgIiArIHNyY1BpeFN0cmlkZSArCisgICAgICAgICAgICAgICAgICAgICAgICAiIHdpdGggZGVzdGluYXRpb24gcGl4ZWwgc3RyaWRlICIgKyBkc3RQaXhTdHJpZGUgKworICAgICAgICAgICAgICAgICAgICAgICAgIiBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzcmNSb3dTdHJpZGUgPT0gZHN0Um93U3RyaWRlICYmIHNyY1BpeFN0cmlkZSA9PSBkc3RQaXhTdHJpZGUpIHsKKyAgICAgICAgICAgICAgICAvLyBGYXN0IHBhdGgsIGp1c3QgY29weSB0aGUgY29udGVudCBpbiB0aGUgYnl0ZUJ1ZmZlciBhbGwgdG9nZXRoZXIuCisgICAgICAgICAgICAgICAgZHN0QnVmZmVyLnB1dChzcmNCdWZmZXIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTaXplIGVmZmVjdGl2ZVBsYW5lU2l6ZSA9IGdldEVmZmVjdGl2ZVBsYW5lU2l6ZUZvckltYWdlKHNyYywgaSk7CisgICAgICAgICAgICAgICAgaW50IHNyY1Jvd0J5dGVDb3VudCA9IHNyY1Jvd1N0cmlkZTsKKyAgICAgICAgICAgICAgICBpbnQgZHN0Um93Qnl0ZUNvdW50ID0gZHN0Um93U3RyaWRlOworICAgICAgICAgICAgICAgIGJ5dGVbXSBzcmNEYXRhUm93ID0gbmV3IGJ5dGVbc3JjUm93Qnl0ZUNvdW50XTsKKworICAgICAgICAgICAgICAgIGlmIChzcmNQaXhTdHJpZGUgPT0gZHN0UGl4U3RyaWRlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFJvdyBieSByb3cgY29weSBjYXNlCisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGVmZmVjdGl2ZVBsYW5lU2l6ZS5nZXRIZWlnaHQoKTsgcm93KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3cgPT0gZWZmZWN0aXZlUGxhbmVTaXplLmdldEhlaWdodCgpIC0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgaW50ZXJsZWF2ZWQgcGxhbmVzOiBuZWVkIGhhbmRsZSB0aGUgbGFzdCByb3cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXJlZnVsbHkgdG8gYXZvaWQgbWVtb3J5IGNvcnJ1cHRpb24uIENoZWNrIGlmIHdlIGhhdmUgZW5vdWdoIGJ5dGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gY29weS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVtYWluaW5nQnl0ZXMgPSBzcmNCdWZmZXIucmVtYWluaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNyY1Jvd0J5dGVDb3VudCA+IHJlbWFpbmluZ0J5dGVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1Jvd0J5dGVDb3VudCA9IHJlbWFpbmluZ0J5dGVzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNyY0J1ZmZlci5nZXQoc3JjRGF0YVJvdywgLypvZmZzZXQqLzAsIHNyY1Jvd0J5dGVDb3VudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkc3RCdWZmZXIucHV0KHNyY0RhdGFSb3csIC8qb2Zmc2V0Ki8wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLm1pbihzcmNSb3dCeXRlQ291bnQsIGRzdFJvd0J5dGVDb3VudCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gUm93IGJ5IHJvdyBwZXIgcGl4ZWwgY29weSBjYXNlCisgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBkc3REYXRhUm93ID0gbmV3IGJ5dGVbZHN0Um93Qnl0ZUNvdW50XTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgZWZmZWN0aXZlUGxhbmVTaXplLmdldEhlaWdodCgpOyByb3crKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdyA9PSBlZmZlY3RpdmVQbGFuZVNpemUuZ2V0SGVpZ2h0KCkgLSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBpbnRlcmxlYXZlZCBwbGFuZXM6IG5lZWQgaGFuZGxlIHRoZSBsYXN0IHJvdworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhcmVmdWxseSB0byBhdm9pZCBtZW1vcnkgY29ycnVwdGlvbi4gQ2hlY2sgaWYgd2UgaGF2ZSBlbm91Z2ggYnl0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBjb3B5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZW1haW5pbmdCeXRlcyA9IHNyY0J1ZmZlci5yZW1haW5pbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3JjUm93Qnl0ZUNvdW50ID4gcmVtYWluaW5nQnl0ZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUm93Qnl0ZUNvdW50ID0gcmVtYWluaW5nQnl0ZXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZ0J5dGVzID0gZHN0QnVmZmVyLnJlbWFpbmluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkc3RSb3dCeXRlQ291bnQgPiByZW1haW5pbmdCeXRlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RSb3dCeXRlQ291bnQgPSByZW1haW5pbmdCeXRlczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzcmNCdWZmZXIuZ2V0KHNyY0RhdGFSb3csIC8qb2Zmc2V0Ki8wLCBzcmNSb3dCeXRlQ291bnQpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvcyA9IGRzdEJ1ZmZlci5wb3NpdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgZHN0QnVmZmVyLmdldChkc3REYXRhUm93LCAvKm9mZnNldCovMCwgZHN0Um93Qnl0ZUNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJ1ZmZlci5wb3NpdGlvbihwb3MpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCBlZmZlY3RpdmVQbGFuZVNpemUuZ2V0V2lkdGgoKTsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0RGF0YVJvd1t4ICogZHN0UGl4U3RyaWRlXSA9IHNyY0RhdGFSb3dbeCAqIHNyY1BpeFN0cmlkZV07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBkc3RCdWZmZXIucHV0KGRzdERhdGFSb3csIC8qb2Zmc2V0Ki8wLCBkc3RSb3dCeXRlQ291bnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICAgICAgc3JjQnVmZmVyLnBvc2l0aW9uKHNyY1Bvcyk7CiAgICAgICAgICAgICBkc3RCdWZmZXIucmV3aW5kKCk7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIHN0YXRpYyBTaXplIGdldEVmZmVjdGl2ZVBsYW5lU2l6ZUZvckltYWdlKEltYWdlIGltYWdlLCBpbnQgcGxhbmVJZHgpIHsKKyAgICAgICAgc3dpdGNoIChpbWFnZS5nZXRGb3JtYXQoKSkgeworICAgICAgICAgICAgY2FzZSBJbWFnZUZvcm1hdC5ZVVZfNDIwXzg4ODoKKyAgICAgICAgICAgICAgICBpZiAocGxhbmVJZHggPT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNpemUoaW1hZ2UuZ2V0V2lkdGgoKSwgaW1hZ2UuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2l6ZShpbWFnZS5nZXRXaWR0aCgpIC8gMiwgaW1hZ2UuZ2V0SGVpZ2h0KCkgLyAyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEltYWdlRm9ybWF0LkpQRUc6CisgICAgICAgICAgICBjYXNlIEltYWdlRm9ybWF0LlJBV19TRU5TT1I6CisgICAgICAgICAgICBjYXNlIEltYWdlRm9ybWF0LlJBVzEwOgorICAgICAgICAgICAgY2FzZSBJbWFnZUZvcm1hdC5SQVcxMjoKKyAgICAgICAgICAgIGNhc2UgSW1hZ2VGb3JtYXQuREVQVEgxNjoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNpemUoaW1hZ2UuZ2V0V2lkdGgoKSwgaW1hZ2UuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgY2FzZSBJbWFnZUZvcm1hdC5QUklWQVRFOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2l6ZSgwLCAwKTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiSW52YWxpZCBpbWFnZSBmb3JtYXQgJWQiLCBpbWFnZS5nZXRGb3JtYXQoKSkpOworICAgICAgICB9CisgICAgfQorCiAgICAgLyoqCiAgICAgICogPHA+CiAgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIHR3byBpbWFnZXMgYXJlIHN0cm9uZ2x5IGVxdWFsLgpAQCAtMTg4Miw5ICsyMDU2LDQyIEBACiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGhzUGxhbmVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICBsaHNCdWZmZXIgPSBsaHNQbGFuZXNbaV0uZ2V0QnVmZmVyKCk7CiAgICAgICAgICAgICByaHNCdWZmZXIgPSByaHNQbGFuZXNbaV0uZ2V0QnVmZmVyKCk7Ci0gICAgICAgICAgICBpZiAoIWxoc0J1ZmZlci5lcXVhbHMocmhzQnVmZmVyKSkgewotICAgICAgICAgICAgICAgIExvZy5pKFRBRywgImJ5dGUgYnVmZmVycyBmb3IgcGxhbmUgIiArICBpICsgIiBkb24ndCBtYXRhY2guIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgbGhzQnVmZmVyLnJld2luZCgpOworICAgICAgICAgICAgcmhzQnVmZmVyLnJld2luZCgpOworICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBZVVY0MjBfODg4IGJ1ZmZlciB3aXRoIGRpZmZlcmVudCBsYXlvdXQKKyAgICAgICAgICAgIGlmIChsaHNJbWcuZ2V0Rm9ybWF0KCkgPT0gSW1hZ2VGb3JtYXQuWVVWXzQyMF84ODggJiYKKyAgICAgICAgICAgICAgICAgICAgKGxoc1BsYW5lc1tpXS5nZXRQaXhlbFN0cmlkZSgpICE9IHJoc1BsYW5lc1tpXS5nZXRQaXhlbFN0cmlkZSgpIHx8CisgICAgICAgICAgICAgICAgICAgICBsaHNQbGFuZXNbaV0uZ2V0Um93U3RyaWRlKCkgIT0gcmhzUGxhbmVzW2ldLmdldFJvd1N0cmlkZSgpKSkgeworICAgICAgICAgICAgICAgIGludCB3aWR0aCA9IGdldEVmZmVjdGl2ZVBsYW5lU2l6ZUZvckltYWdlKGxoc0ltZywgaSkuZ2V0V2lkdGgoKTsKKyAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0ID0gZ2V0RWZmZWN0aXZlUGxhbmVTaXplRm9ySW1hZ2UobGhzSW1nLCBpKS5nZXRIZWlnaHQoKTsKKyAgICAgICAgICAgICAgICBpbnQgcm93U2l6ZUwgPSBsaHNQbGFuZXNbaV0uZ2V0Um93U3RyaWRlKCk7CisgICAgICAgICAgICAgICAgaW50IHJvd1NpemVSID0gcmhzUGxhbmVzW2ldLmdldFJvd1N0cmlkZSgpOworICAgICAgICAgICAgICAgIGJ5dGVbXSBsaHNSb3cgPSBuZXcgYnl0ZVtyb3dTaXplTF07CisgICAgICAgICAgICAgICAgYnl0ZVtdIHJoc1JvdyA9IG5ldyBieXRlW3Jvd1NpemVSXTsKKyAgICAgICAgICAgICAgICBpbnQgcGl4U3RyaWRlTCA9IGxoc1BsYW5lc1tpXS5nZXRQaXhlbFN0cmlkZSgpOworICAgICAgICAgICAgICAgIGludCBwaXhTdHJpZGVSID0gcmhzUGxhbmVzW2ldLmdldFBpeGVsU3RyaWRlKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgciA9IDA7IHIgPCBoZWlnaHQ7IHIrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAociA9PSBoZWlnaHQgLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvd1NpemVMID0gbGhzQnVmZmVyLnJlbWFpbmluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgcm93U2l6ZVIgPSByaHNCdWZmZXIucmVtYWluaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbGhzQnVmZmVyLmdldChsaHNSb3csIC8qb2Zmc2V0Ki8wLCByb3dTaXplTCk7CisgICAgICAgICAgICAgICAgICAgIHJoc0J1ZmZlci5nZXQocmhzUm93LCAvKm9mZnNldCovMCwgcm93U2l6ZVIpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBjID0gMDsgYyA8IHdpZHRoOyBjKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaHNSb3dbYyAqIHBpeFN0cmlkZUxdICE9IHJoc1Jvd1tjICogcGl4U3RyaWRlUl0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZSBidWZmZXJzIGZvciBwbGFuZSAlZCByb3cgJWQgY29sICVkIGRvbid0IG1hdGNoLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCByLCBjKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBDb21wYXJlIGVudGlyZSBidWZmZXIgZGlyZWN0bHkKKyAgICAgICAgICAgICAgICBpZiAoIWxoc0J1ZmZlci5lcXVhbHMocmhzQnVmZmVyKSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJieXRlIGJ1ZmZlcnMgZm9yIHBsYW5lICIgKyAgaSArICIgZG9uJ3QgbWF0Y2guIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMjIwMiw1MCArMjQwOSw5MSBAQAogICAgICAgICAgICAgICAgICAgICBkYXRlVGltZS5zdGFydHNXaXRoKGxvY2FsRGF0ZXRpbWUpKTsKICAgICAgICAgfQogCi0gICAgICAgIC8vIFRBR19GT0NBTF9MRU5HVEguCi0gICAgICAgIGZsb2F0W10gZm9jYWxMZW5ndGhzID0gc3RhdGljSW5mby5nZXRBdmFpbGFibGVGb2NhbExlbmd0aHNDaGVja2VkKCk7Ci0gICAgICAgIGZsb2F0IGV4aWZGb2NhbExlbmd0aCA9IChmbG9hdClleGlmLmdldEF0dHJpYnV0ZURvdWJsZShFeGlmSW50ZXJmYWNlLlRBR19GT0NBTF9MRU5HVEgsIC0xKTsKLSAgICAgICAgY29sbGVjdG9yLmV4cGVjdEVxdWFscygiRm9jYWwgbGVuZ3RoIHNob3VsZCBtYXRjaCIsCi0gICAgICAgICAgICAgICAgZ2V0Q2xvc2VzdFZhbHVlSW5BcnJheShmb2NhbExlbmd0aHMsIGV4aWZGb2NhbExlbmd0aCksCi0gICAgICAgICAgICAgICAgZXhpZkZvY2FsTGVuZ3RoLCBFWElGX0ZPQ0FMX0xFTkdUSF9FUlJPUl9NQVJHSU4pOwotICAgICAgICAvLyBNb3JlIGNoZWNrcyBmb3IgZm9jYWwgbGVuZ3RoLgotICAgICAgICBjb2xsZWN0b3IuZXhwZWN0RXF1YWxzKCJFeGlmIGZvY2FsIGxlbmd0aCBzaG91bGQgbWF0Y2ggY2FwdHVyZSByZXN1bHQiLAotICAgICAgICAgICAgICAgIHZhbGlkYXRlRm9jYWxMZW5ndGgocmVzdWx0LCBzdGF0aWNJbmZvLCBjb2xsZWN0b3IpLAotICAgICAgICAgICAgICAgIGV4aWZGb2NhbExlbmd0aCwgRVhJRl9GT0NBTF9MRU5HVEhfRVJST1JfTUFSR0lOKTsKKyAgICAgICAgYm9vbGVhbiBpc0V4dGVybmFsQ2FtZXJhID0gc3RhdGljSW5mby5pc0V4dGVybmFsQ2FtZXJhKCk7CisgICAgICAgIGlmICghaXNFeHRlcm5hbENhbWVyYSkgeworICAgICAgICAgICAgLy8gVEFHX0ZPQ0FMX0xFTkdUSC4KKyAgICAgICAgICAgIGZsb2F0W10gZm9jYWxMZW5ndGhzID0gc3RhdGljSW5mby5nZXRBdmFpbGFibGVGb2NhbExlbmd0aHNDaGVja2VkKCk7CisgICAgICAgICAgICBmbG9hdCBleGlmRm9jYWxMZW5ndGggPSAoZmxvYXQpZXhpZi5nZXRBdHRyaWJ1dGVEb3VibGUoCisgICAgICAgICAgICAgICAgICAgICAgICBFeGlmSW50ZXJmYWNlLlRBR19GT0NBTF9MRU5HVEgsIC0xKTsKKyAgICAgICAgICAgIGNvbGxlY3Rvci5leHBlY3RFcXVhbHMoIkZvY2FsIGxlbmd0aCBzaG91bGQgbWF0Y2giLAorICAgICAgICAgICAgICAgICAgICBnZXRDbG9zZXN0VmFsdWVJbkFycmF5KGZvY2FsTGVuZ3RocywgZXhpZkZvY2FsTGVuZ3RoKSwKKyAgICAgICAgICAgICAgICAgICAgZXhpZkZvY2FsTGVuZ3RoLCBFWElGX0ZPQ0FMX0xFTkdUSF9FUlJPUl9NQVJHSU4pOworICAgICAgICAgICAgLy8gTW9yZSBjaGVja3MgZm9yIGZvY2FsIGxlbmd0aC4KKyAgICAgICAgICAgIGNvbGxlY3Rvci5leHBlY3RFcXVhbHMoIkV4aWYgZm9jYWwgbGVuZ3RoIHNob3VsZCBtYXRjaCBjYXB0dXJlIHJlc3VsdCIsCisgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlRm9jYWxMZW5ndGgocmVzdWx0LCBzdGF0aWNJbmZvLCBjb2xsZWN0b3IpLAorICAgICAgICAgICAgICAgICAgICBleGlmRm9jYWxMZW5ndGgsIEVYSUZfRk9DQUxfTEVOR1RIX0VSUk9SX01BUkdJTik7CiAKLSAgICAgICAgLy8gVEFHX0VYUE9TVVJFX1RJTUUKLSAgICAgICAgLy8gRXhpZkludGVyZmFjZSBBUEkgZ2l2ZXMgZXhwb3N1cmUgdGltZSB2YWx1ZSBpbiB0aGUgZm9ybSBvZiBmbG9hdCBpbnN0ZWFkIG9mIHJhdGlvbmFsCi0gICAgICAgIFN0cmluZyBleHBvc3VyZVRpbWUgPSBleGlmLmdldEF0dHJpYnV0ZShFeGlmSW50ZXJmYWNlLlRBR19FWFBPU1VSRV9USU1FKTsKLSAgICAgICAgY29sbGVjdG9yLmV4cGVjdE5vdE51bGwoIkV4aWYgVEFHX0VYUE9TVVJFX1RJTUUgc2hvdWxkbid0IGJlIG51bGwiLCBleHBvc3VyZVRpbWUpOwotICAgICAgICBpZiAoc3RhdGljSW5mby5hcmVLZXlzQXZhaWxhYmxlKENhcHR1cmVSZXN1bHQuU0VOU09SX0VYUE9TVVJFX1RJTUUpKSB7Ci0gICAgICAgICAgICBpZiAoZXhwb3N1cmVUaW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBkb3VibGUgZXhwb3N1cmVUaW1lVmFsdWUgPSBEb3VibGUucGFyc2VEb3VibGUoZXhwb3N1cmVUaW1lKTsKLSAgICAgICAgICAgICAgICBsb25nIGV4cFRpbWVSZXN1bHQgPSByZXN1bHQuZ2V0KENhcHR1cmVSZXN1bHQuU0VOU09SX0VYUE9TVVJFX1RJTUUpOwotICAgICAgICAgICAgICAgIGRvdWJsZSBleHBlY3RlZCA9IGV4cFRpbWVSZXN1bHQgLyAxZTk7Ci0gICAgICAgICAgICAgICAgZG91YmxlIHRvbGVyYW5jZSA9IGV4cGVjdGVkICogRVhJRl9FWFBPU1VSRV9USU1FX0VSUk9SX01BUkdJTl9SQVRJTzsKLSAgICAgICAgICAgICAgICB0b2xlcmFuY2UgPSBNYXRoLm1heCh0b2xlcmFuY2UsIEVYSUZfRVhQT1NVUkVfVElNRV9NSU5fRVJST1JfTUFSR0lOX1NFQyk7Ci0gICAgICAgICAgICAgICAgY29sbGVjdG9yLmV4cGVjdEVxdWFscygiRXhpZiBleHBvc3VyZSB0aW1lIGRvZXNuJ3QgbWF0Y2giLCBleHBlY3RlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9zdXJlVGltZVZhbHVlLCB0b2xlcmFuY2UpOworICAgICAgICAgICAgLy8gVEFHX0VYUE9TVVJFX1RJTUUKKyAgICAgICAgICAgIC8vIEV4aWZJbnRlcmZhY2UgQVBJIGdpdmVzIGV4cG9zdXJlIHRpbWUgdmFsdWUgaW4gdGhlIGZvcm0gb2YgZmxvYXQgaW5zdGVhZCBvZiByYXRpb25hbAorICAgICAgICAgICAgU3RyaW5nIGV4cG9zdXJlVGltZSA9IGV4aWYuZ2V0QXR0cmlidXRlKEV4aWZJbnRlcmZhY2UuVEFHX0VYUE9TVVJFX1RJTUUpOworICAgICAgICAgICAgY29sbGVjdG9yLmV4cGVjdE5vdE51bGwoIkV4aWYgVEFHX0VYUE9TVVJFX1RJTUUgc2hvdWxkbid0IGJlIG51bGwiLCBleHBvc3VyZVRpbWUpOworICAgICAgICAgICAgaWYgKHN0YXRpY0luZm8uYXJlS2V5c0F2YWlsYWJsZShDYXB0dXJlUmVzdWx0LlNFTlNPUl9FWFBPU1VSRV9USU1FKSkgeworICAgICAgICAgICAgICAgIGlmIChleHBvc3VyZVRpbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBkb3VibGUgZXhwb3N1cmVUaW1lVmFsdWUgPSBEb3VibGUucGFyc2VEb3VibGUoZXhwb3N1cmVUaW1lKTsKKyAgICAgICAgICAgICAgICAgICAgbG9uZyBleHBUaW1lUmVzdWx0ID0gcmVzdWx0LmdldChDYXB0dXJlUmVzdWx0LlNFTlNPUl9FWFBPU1VSRV9USU1FKTsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIGV4cGVjdGVkID0gZXhwVGltZVJlc3VsdCAvIDFlOTsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIHRvbGVyYW5jZSA9IGV4cGVjdGVkICogRVhJRl9FWFBPU1VSRV9USU1FX0VSUk9SX01BUkdJTl9SQVRJTzsKKyAgICAgICAgICAgICAgICAgICAgdG9sZXJhbmNlID0gTWF0aC5tYXgodG9sZXJhbmNlLCBFWElGX0VYUE9TVVJFX1RJTUVfTUlOX0VSUk9SX01BUkdJTl9TRUMpOworICAgICAgICAgICAgICAgICAgICBjb2xsZWN0b3IuZXhwZWN0RXF1YWxzKCJFeGlmIGV4cG9zdXJlIHRpbWUgZG9lc24ndCBtYXRjaCIsIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9zdXJlVGltZVZhbHVlLCB0b2xlcmFuY2UpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVEFHX0FQRVJUVVJFCisgICAgICAgICAgICAvLyBFeGlmSW50ZXJmYWNlIEFQSSBnaXZlcyBhcGVydHVyZSB2YWx1ZSBpbiB0aGUgZm9ybSBvZiBmbG9hdCBpbnN0ZWFkIG9mIHJhdGlvbmFsCisgICAgICAgICAgICBTdHJpbmcgZXhpZkFwZXJ0dXJlID0gZXhpZi5nZXRBdHRyaWJ1dGUoRXhpZkludGVyZmFjZS5UQUdfQVBFUlRVUkUpOworICAgICAgICAgICAgY29sbGVjdG9yLmV4cGVjdE5vdE51bGwoIkV4aWYgVEFHX0FQRVJUVVJFIHNob3VsZG4ndCBiZSBudWxsIiwgZXhpZkFwZXJ0dXJlKTsKKyAgICAgICAgICAgIGlmIChzdGF0aWNJbmZvLmFyZUtleXNBdmFpbGFibGUoQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLkxFTlNfSU5GT19BVkFJTEFCTEVfQVBFUlRVUkVTKSkgeworICAgICAgICAgICAgICAgIGZsb2F0W10gYXBlcnR1cmVzID0gc3RhdGljSW5mby5nZXRBdmFpbGFibGVBcGVydHVyZXNDaGVja2VkKCk7CisgICAgICAgICAgICAgICAgaWYgKGV4aWZBcGVydHVyZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFwZXJ0dXJlVmFsdWUgPSBGbG9hdC5wYXJzZUZsb2F0KGV4aWZBcGVydHVyZSk7CisgICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rvci5leHBlY3RFcXVhbHMoIkFwZXJ0dXJlIHZhbHVlIHNob3VsZCBtYXRjaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2xvc2VzdFZhbHVlSW5BcnJheShhcGVydHVyZXMsIGFwZXJ0dXJlVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwZXJ0dXJlVmFsdWUsIEVYSUZfQVBFUlRVUkVfRVJST1JfTUFSR0lOKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gTW9yZSBjaGVja3MgZm9yIGFwZXJ0dXJlLgorICAgICAgICAgICAgICAgICAgICBjb2xsZWN0b3IuZXhwZWN0RXF1YWxzKCJFeGlmIGFwZXJ0dXJlIGxlbmd0aCBzaG91bGQgbWF0Y2ggY2FwdHVyZSByZXN1bHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlQXBlcnR1cmUocmVzdWx0LCBzdGF0aWNJbmZvLCBjb2xsZWN0b3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwZXJ0dXJlVmFsdWUsIEVYSUZfQVBFUlRVUkVfRVJST1JfTUFSR0lOKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRBR19NQUtFCisgICAgICAgICAgICBTdHJpbmcgbWFrZSA9IGV4aWYuZ2V0QXR0cmlidXRlKEV4aWZJbnRlcmZhY2UuVEFHX01BS0UpOworICAgICAgICAgICAgY29sbGVjdG9yLmV4cGVjdEVxdWFscygiRXhpZiBUQUdfTUFLRSBpcyBpbmNvcnJlY3QiLCBCdWlsZC5NQU5VRkFDVFVSRVIsIG1ha2UpOworCisgICAgICAgICAgICAvLyBUQUdfTU9ERUwKKyAgICAgICAgICAgIFN0cmluZyBtb2RlbCA9IGV4aWYuZ2V0QXR0cmlidXRlKEV4aWZJbnRlcmZhY2UuVEFHX01PREVMKTsKKyAgICAgICAgICAgIGNvbGxlY3Rvci5leHBlY3RFcXVhbHMoIkV4aWYgVEFHX01PREVMIGlzIGluY29ycmVjdCIsIEJ1aWxkLk1PREVMLCBtb2RlbCk7CisKKworICAgICAgICAgICAgLy8gVEFHX0lTTworICAgICAgICAgICAgaW50IGlzbyA9IGV4aWYuZ2V0QXR0cmlidXRlSW50KEV4aWZJbnRlcmZhY2UuVEFHX0lTTywgLypkZWZhdWx0VmFsdWUqLy0xKTsKKyAgICAgICAgICAgIGlmIChzdGF0aWNJbmZvLmFyZUtleXNBdmFpbGFibGUoQ2FwdHVyZVJlc3VsdC5TRU5TT1JfU0VOU0lUSVZJVFkpIHx8CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY0luZm8uYXJlS2V5c0F2YWlsYWJsZShDYXB0dXJlUmVzdWx0LkNPTlRST0xfUE9TVF9SQVdfU0VOU0lUSVZJVFlfQk9PU1QpKSB7CisgICAgICAgICAgICAgICAgaW50IGV4cGVjdGVkSXNvID0gMTAwOworICAgICAgICAgICAgICAgIGlmIChzdGF0aWNJbmZvLmFyZUtleXNBdmFpbGFibGUoQ2FwdHVyZVJlc3VsdC5TRU5TT1JfU0VOU0lUSVZJVFkpKSB7CisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkSXNvID0gcmVzdWx0LmdldChDYXB0dXJlUmVzdWx0LlNFTlNPUl9TRU5TSVRJVklUWSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzdGF0aWNJbmZvLmFyZUtleXNBdmFpbGFibGUoQ2FwdHVyZVJlc3VsdC5DT05UUk9MX1BPU1RfUkFXX1NFTlNJVElWSVRZX0JPT1NUKSkgeworICAgICAgICAgICAgICAgICAgICBleHBlY3RlZElzbyA9IGV4cGVjdGVkSXNvICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0KENhcHR1cmVSZXN1bHQuQ09OVFJPTF9QT1NUX1JBV19TRU5TSVRJVklUWV9CT09TVCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRJc28gKj0gMTAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb2xsZWN0b3IuZXhwZWN0SW5SYW5nZSgiRXhpZiBUQUdfSVNPIGlzIGluY29ycmVjdCIsIGlzbywKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkSXNvLzEwMCwgKGV4cGVjdGVkSXNvKzUwKS8xMDApOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gRXh0ZXJuYWwgY2FtZXJhIHNwZWNpZmljIGNoZWNrcworICAgICAgICAgICAgLy8gVEFHX01BS0UKKyAgICAgICAgICAgIFN0cmluZyBtYWtlID0gZXhpZi5nZXRBdHRyaWJ1dGUoRXhpZkludGVyZmFjZS5UQUdfTUFLRSk7CisgICAgICAgICAgICBjb2xsZWN0b3IuZXhwZWN0Tm90TnVsbCgiRXhpZiBUQUdfTUFLRSBpcyBudWxsIiwgbWFrZSk7CisKKyAgICAgICAgICAgIC8vIFRBR19NT0RFTAorICAgICAgICAgICAgU3RyaW5nIG1vZGVsID0gZXhpZi5nZXRBdHRyaWJ1dGUoRXhpZkludGVyZmFjZS5UQUdfTU9ERUwpOworICAgICAgICAgICAgY29sbGVjdG9yLmV4cGVjdE5vdE51bGwoIkV4aWYgVEFHX01PREVMIGlzIG51aWxsIiwgbW9kZWwpOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gVEFHX0FQRVJUVVJFCi0gICAgICAgIC8vIEV4aWZJbnRlcmZhY2UgQVBJIGdpdmVzIGFwZXJ0dXJlIHZhbHVlIGluIHRoZSBmb3JtIG9mIGZsb2F0IGluc3RlYWQgb2YgcmF0aW9uYWwKLSAgICAgICAgU3RyaW5nIGV4aWZBcGVydHVyZSA9IGV4aWYuZ2V0QXR0cmlidXRlKEV4aWZJbnRlcmZhY2UuVEFHX0FQRVJUVVJFKTsKLSAgICAgICAgY29sbGVjdG9yLmV4cGVjdE5vdE51bGwoIkV4aWYgVEFHX0FQRVJUVVJFIHNob3VsZG4ndCBiZSBudWxsIiwgZXhpZkFwZXJ0dXJlKTsKLSAgICAgICAgaWYgKHN0YXRpY0luZm8uYXJlS2V5c0F2YWlsYWJsZShDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuTEVOU19JTkZPX0FWQUlMQUJMRV9BUEVSVFVSRVMpKSB7Ci0gICAgICAgICAgICBmbG9hdFtdIGFwZXJ0dXJlcyA9IHN0YXRpY0luZm8uZ2V0QXZhaWxhYmxlQXBlcnR1cmVzQ2hlY2tlZCgpOwotICAgICAgICAgICAgaWYgKGV4aWZBcGVydHVyZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgYXBlcnR1cmVWYWx1ZSA9IEZsb2F0LnBhcnNlRmxvYXQoZXhpZkFwZXJ0dXJlKTsKLSAgICAgICAgICAgICAgICBjb2xsZWN0b3IuZXhwZWN0RXF1YWxzKCJBcGVydHVyZSB2YWx1ZSBzaG91bGQgbWF0Y2giLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2xvc2VzdFZhbHVlSW5BcnJheShhcGVydHVyZXMsIGFwZXJ0dXJlVmFsdWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgYXBlcnR1cmVWYWx1ZSwgRVhJRl9BUEVSVFVSRV9FUlJPUl9NQVJHSU4pOwotICAgICAgICAgICAgICAgIC8vIE1vcmUgY2hlY2tzIGZvciBhcGVydHVyZS4KLSAgICAgICAgICAgICAgICBjb2xsZWN0b3IuZXhwZWN0RXF1YWxzKCJFeGlmIGFwZXJ0dXJlIGxlbmd0aCBzaG91bGQgbWF0Y2ggY2FwdHVyZSByZXN1bHQiLAotICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVBcGVydHVyZShyZXN1bHQsIHN0YXRpY0luZm8sIGNvbGxlY3RvciksCi0gICAgICAgICAgICAgICAgICAgICAgICBhcGVydHVyZVZhbHVlLCBFWElGX0FQRVJUVVJFX0VSUk9SX01BUkdJTik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KIAogICAgICAgICAvKioKICAgICAgICAgICogVEFHX0ZMQVNILiBUT0RPOiBGb3IgZnVsbCBkZXZpY2VzLCBjYW4gY2hlY2sgYSBsb3QgbW9yZSBpbmZvCkBAIC0yMjYxLDMzICsyNTA5LDYgQEAKICAgICAgICAgU3RyaW5nIHdoaXRlQmFsYW5jZSA9IGV4aWYuZ2V0QXR0cmlidXRlKEV4aWZJbnRlcmZhY2UuVEFHX1dISVRFX0JBTEFOQ0UpOwogICAgICAgICBjb2xsZWN0b3IuZXhwZWN0Tm90TnVsbCgiRXhpZiBUQUdfV0hJVEVfQkFMQU5DRSBzaG91bGRuJ3QgYmUgbnVsbCIsIHdoaXRlQmFsYW5jZSk7CiAKLSAgICAgICAgLy8gVEFHX01BS0UKLSAgICAgICAgU3RyaW5nIG1ha2UgPSBleGlmLmdldEF0dHJpYnV0ZShFeGlmSW50ZXJmYWNlLlRBR19NQUtFKTsKLSAgICAgICAgY29sbGVjdG9yLmV4cGVjdEVxdWFscygiRXhpZiBUQUdfTUFLRSBpcyBpbmNvcnJlY3QiLCBCdWlsZC5NQU5VRkFDVFVSRVIsIG1ha2UpOwotCi0gICAgICAgIC8vIFRBR19NT0RFTAotICAgICAgICBTdHJpbmcgbW9kZWwgPSBleGlmLmdldEF0dHJpYnV0ZShFeGlmSW50ZXJmYWNlLlRBR19NT0RFTCk7Ci0gICAgICAgIGNvbGxlY3Rvci5leHBlY3RFcXVhbHMoIkV4aWYgVEFHX01PREVMIGlzIGluY29ycmVjdCIsIEJ1aWxkLk1PREVMLCBtb2RlbCk7Ci0KLQotICAgICAgICAvLyBUQUdfSVNPCi0gICAgICAgIGludCBpc28gPSBleGlmLmdldEF0dHJpYnV0ZUludChFeGlmSW50ZXJmYWNlLlRBR19JU08sIC8qZGVmYXVsdFZhbHVlKi8tMSk7Ci0gICAgICAgIGlmIChzdGF0aWNJbmZvLmFyZUtleXNBdmFpbGFibGUoQ2FwdHVyZVJlc3VsdC5TRU5TT1JfU0VOU0lUSVZJVFkpIHx8Ci0gICAgICAgICAgICAgICAgc3RhdGljSW5mby5hcmVLZXlzQXZhaWxhYmxlKENhcHR1cmVSZXN1bHQuQ09OVFJPTF9QT1NUX1JBV19TRU5TSVRJVklUWV9CT09TVCkpIHsKLSAgICAgICAgICAgIGludCBleHBlY3RlZElzbyA9IDEwMDsKLSAgICAgICAgICAgIGlmIChzdGF0aWNJbmZvLmFyZUtleXNBdmFpbGFibGUoQ2FwdHVyZVJlc3VsdC5TRU5TT1JfU0VOU0lUSVZJVFkpKSB7Ci0gICAgICAgICAgICAgICAgZXhwZWN0ZWRJc28gPSByZXN1bHQuZ2V0KENhcHR1cmVSZXN1bHQuU0VOU09SX1NFTlNJVElWSVRZKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzdGF0aWNJbmZvLmFyZUtleXNBdmFpbGFibGUoQ2FwdHVyZVJlc3VsdC5DT05UUk9MX1BPU1RfUkFXX1NFTlNJVElWSVRZX0JPT1NUKSkgewotICAgICAgICAgICAgICAgIGV4cGVjdGVkSXNvID0gZXhwZWN0ZWRJc28gKgotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldChDYXB0dXJlUmVzdWx0LkNPTlRST0xfUE9TVF9SQVdfU0VOU0lUSVZJVFlfQk9PU1QpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBleHBlY3RlZElzbyAqPSAxMDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb2xsZWN0b3IuZXhwZWN0SW5SYW5nZSgiRXhpZiBUQUdfSVNPIGlzIGluY29ycmVjdCIsIGlzbywKLSAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRJc28vMTAwLCAoZXhwZWN0ZWRJc28rNTApLzEwMCk7Ci0gICAgICAgIH0KLQogICAgICAgICAvLyBUQUdfREFURVRJTUVfRElHSVRJWkVEIChhLmsuYSBDcmVhdGUgdGltZSBmb3IgZGlnaXRhbCBjYW1lcmFzKS4KICAgICAgICAgU3RyaW5nIGRpZ2l0aXplZFRpbWUgPSBleGlmLmdldEF0dHJpYnV0ZShFeGlmSW50ZXJmYWNlLlRBR19EQVRFVElNRV9ESUdJVElaRUQpOwogICAgICAgICBjb2xsZWN0b3IuZXhwZWN0Tm90TnVsbCgiRXhpZiBUQUdfREFURVRJTUVfRElHSVRJWkVEIHNob3VsZG4ndCBiZSBudWxsIiwgZGlnaXRpemVkVGltZSk7CmRpZmYgLS1naXQgYS90ZXN0cy9jYW1lcmEvdXRpbHMvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9jdHMvaGVscGVycy9DYW1lcmFFcnJvckNvbGxlY3Rvci5qYXZhIGIvdGVzdHMvY2FtZXJhL3V0aWxzL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvY3RzL2hlbHBlcnMvQ2FtZXJhRXJyb3JDb2xsZWN0b3IuamF2YQppbmRleCBhYTA0OGNmLi4zMjhkOTFmIDEwMDY0NAotLS0gYS90ZXN0cy9jYW1lcmEvdXRpbHMvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9jdHMvaGVscGVycy9DYW1lcmFFcnJvckNvbGxlY3Rvci5qYXZhCisrKyBiL3Rlc3RzL2NhbWVyYS91dGlscy9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL2N0cy9oZWxwZXJzL0NhbWVyYUVycm9yQ29sbGVjdG9yLmphdmEKQEAgLTg0MSw2ICs4NDEsMjMgQEAKICAgICAgICAgZXhwZWN0SW5SYW5nZShrZXkuZ2V0TmFtZSgpLCB2YWx1ZSwgbWluLCBtYXgpOwogICAgIH0KIAorICAvKioKKyAgICAgKiBDaGVjayBpZiB0aGUga2V5IGlzIG5vbi1udWxsLCBhbmQgdGhlIGtleSB2YWx1ZSBpcyBpbiB0aGUgZXhwZWN0ZWQgcmFuZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCB7QGxpbmsgQ2FwdHVyZVJlcXVlc3QuQnVpbGRlcn0gdG8gY2hlY2suCisgICAgICogQHBhcmFtIGtleSBUaGUge0BsaW5rIENhcHR1cmVSZXF1ZXN0fSBrZXkgdG8gYmUgY2hlY2tlZC4KKyAgICAgKiBAcGFyYW0gbWluIFRoZSBtaW4gdmFsdWUgb2YgdGhlIHJhbmdlCisgICAgICogQHBhcmFtIG1heCBUaGUgbWF4IHZhbHVlIG9mIHRoZSByYW5nZQorICAgICAqLworICAgIHB1YmxpYyA8VCBleHRlbmRzIENvbXBhcmFibGU8PyBzdXBlciBUPj4gdm9pZCBleHBlY3RLZXlWYWx1ZUluUmFuZ2UoCisgICAgICAgICAgICBCdWlsZGVyIHJlcXVlc3QsIENhcHR1cmVSZXF1ZXN0LktleTxUPiBrZXksIFQgbWluLCBUIG1heCkgeworICAgICAgICBUIHZhbHVlOworICAgICAgICBpZiAoKHZhbHVlID0gZXhwZWN0S2V5VmFsdWVOb3ROdWxsKHJlcXVlc3QsIGtleSkpID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBleHBlY3RJblJhbmdlKGtleS5nZXROYW1lKCksIHZhbHVlLCBtaW4sIG1heCk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQ2hlY2sgaWYgdGhlIGtleSBpcyBub24tbnVsbCwgYW5kIHRoZSBrZXkgdmFsdWUgaXMgb25lIG9mIHRoZSBleHBlY3RlZCB2YWx1ZXMuCiAgICAgICoKQEAgLTg3Nyw2ICs4OTQsMjQgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBDaGVjayBpZiB0aGUga2V5IGlzIG5vbi1udWxsLCBhbmQgdGhlIGtleSB2YWx1ZSBpcyBvbmUgb2YgdGhlIGV4cGVjdGVkIHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXN1bHQge0BsaW5rIENhcHR1cmVSZXN1bHR9IHRvIGdldCB0aGUga2V5IGZyb20uCisgICAgICogQHBhcmFtIGtleSBUaGUge0BsaW5rIENhcHR1cmVSZXN1bHR9IGtleSB0byBiZSBjaGVja2VkLgorICAgICAqIEBwYXJhbSBleHBlY3RlZCBUaGUgZXhwZWN0ZWQgdmFsdWVzIG9mIHRoZSBDYXB0dXJlUmVzdWx0IGtleS4KKyAgICAgKi8KKyAgICBwdWJsaWMgPFQ+IHZvaWQgZXhwZWN0S2V5VmFsdWVJc0luKENhcHR1cmVSZXN1bHQgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FwdHVyZVJlc3VsdC5LZXk8VD4ga2V5LCBULi4uIGV4cGVjdGVkKSB7CisgICAgICAgIFQgdmFsdWUgPSBleHBlY3RLZXlWYWx1ZU5vdE51bGwocmVzdWx0LCBrZXkpOworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFN0cmluZyByZWFzb24gPSAiS2V5ICIgKyBrZXkuZ2V0TmFtZSgpICsgIiB2YWx1ZSAiICsgdmFsdWUKKyAgICAgICAgICAgICAgICArICIgaXNuJ3Qgb25lIG9mIHRoZSBleHBlY3RlZCB2YWx1ZXMgIiArIEFycmF5cy5kZWVwVG9TdHJpbmcoZXhwZWN0ZWQpOworICAgICAgICBleHBlY3RDb250YWlucyhyZWFzb24sIGV4cGVjdGVkLCB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogQ2hlY2sgaWYgdGhlIGtleSBpcyBub24tbnVsbCwgYW5kIHRoZSBrZXkgdmFsdWUgY29udGFpbnMgdGhlIGV4cGVjdGVkIGVsZW1lbnQuCiAgICAgICoKICAgICAgKiBAcGFyYW0gY2hhcmFjdGVyaXN0aWNzIHtAbGluayBDYW1lcmFDaGFyYWN0ZXJpc3RpY3N9IHRvIGNoZWNrLgpkaWZmIC0tZ2l0IGEvdGVzdHMvY2FtZXJhL3V0aWxzL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvY3RzL2hlbHBlcnMvU3RhdGljTWV0YWRhdGEuamF2YSBiL3Rlc3RzL2NhbWVyYS91dGlscy9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL2N0cy9oZWxwZXJzL1N0YXRpY01ldGFkYXRhLmphdmEKaW5kZXggMzE5ZWM5MS4uNjQ2ZGZlNyAxMDA2NDQKLS0tIGEvdGVzdHMvY2FtZXJhL3V0aWxzL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvY3RzL2hlbHBlcnMvU3RhdGljTWV0YWRhdGEuamF2YQorKysgYi90ZXN0cy9jYW1lcmEvdXRpbHMvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9jdHMvaGVscGVycy9TdGF0aWNNZXRhZGF0YS5qYXZhCkBAIC0yMDcsMTIgKzIwNyw0MiBAQAogICAgICAqIGF0IGxlYXN0IHRoZSBkZXNpcmVkIG9uZSAoYnV0IGNvdWxkIGJlIGhpZ2hlcikKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0hhcmR3YXJlTGV2ZWxBdExlYXN0KGludCBsZXZlbCkgeworICAgICAgICBmaW5hbCBpbnRbXSBzb3J0ZWRId0xldmVscyA9IHsKKyAgICAgICAgICAgIENhbWVyYUNoYXJhY3RlcmlzdGljcy5JTkZPX1NVUFBPUlRFRF9IQVJEV0FSRV9MRVZFTF9MRUdBQ1ksCisgICAgICAgICAgICBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuSU5GT19TVVBQT1JURURfSEFSRFdBUkVfTEVWRUxfRVhURVJOQUwsCisgICAgICAgICAgICBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuSU5GT19TVVBQT1JURURfSEFSRFdBUkVfTEVWRUxfTElNSVRFRCwKKyAgICAgICAgICAgIENhbWVyYUNoYXJhY3RlcmlzdGljcy5JTkZPX1NVUFBPUlRFRF9IQVJEV0FSRV9MRVZFTF9GVUxMLAorICAgICAgICAgICAgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLklORk9fU1VQUE9SVEVEX0hBUkRXQVJFX0xFVkVMXzMKKyAgICAgICAgfTsKICAgICAgICAgaW50IGRldmljZUxldmVsID0gZ2V0SGFyZHdhcmVMZXZlbENoZWNrZWQoKTsKLSAgICAgICAgaWYgKGRldmljZUxldmVsID09IENhbWVyYUNoYXJhY3RlcmlzdGljcy5JTkZPX1NVUFBPUlRFRF9IQVJEV0FSRV9MRVZFTF9MRUdBQ1kpIHsKLSAgICAgICAgICAgIHJldHVybiBsZXZlbCA9PSBkZXZpY2VMZXZlbDsKKyAgICAgICAgaWYgKGxldmVsID09IGRldmljZUxldmVsKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQotICAgICAgICAvLyBkZXZpY2VMZXZlbCBpcyBub3QgTEVHQUNZLCBjYW4gdXNlIG51bWVyaWNhbCBzb3J0Ci0gICAgICAgIHJldHVybiBsZXZlbCA8PSBkZXZpY2VMZXZlbDsKKworICAgICAgICBmb3IgKGludCBzb3J0ZWRsZXZlbCA6IHNvcnRlZEh3TGV2ZWxzKSB7CisgICAgICAgICAgICBpZiAoc29ydGVkbGV2ZWwgPT0gbGV2ZWwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc29ydGVkbGV2ZWwgPT0gZGV2aWNlTGV2ZWwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQXNzZXJ0LmZhaWwoIlVua25vd24gaGFyZHdhcmVMZXZlbCAiICsgbGV2ZWwgKyAiIGFuZCBkZXZpY2UgaGFyZHdhcmUgbGV2ZWwgIiArIGRldmljZUxldmVsKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSBjYW1lcmEgaXMgYW4gZXh0ZXJuYWwgY2FtZXJhLiBJZiBzbyB0aGUgaGFyZHdhcmUgbGV2ZWwKKyAgICAgKiByZXBvcnRlZCBieSBhbmRyb2lkLmluZm8uc3VwcG9ydGVkSGFyZHdhcmVMZXZlbCBpcworICAgICAqIHtAdmFsdWUgQ2FtZXJhTWV0YWRhdGEjSU5GT19TVVBQT1JURURfSEFSRFdBUkVfTEVWRUxfRVhURVJOQUx9LgorICAgICAqCisgICAgICogPHA+SWYgdGhlIGNhbWVyYSBkZXZpY2UgaXMgbm90IHJlcG9ydGluZyB0aGUgaGFyZHdhcmVMZXZlbCwgdGhpcworICAgICAqIHdpbGwgY2F1c2UgdGhlIHRlc3QgdG8gZmFpbC48L3A+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgZGV2aWNlIGlzIGV4dGVybmFsLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0V4dGVybmFsQ2FtZXJhKCkgeworICAgICAgICBpbnQgZGV2aWNlTGV2ZWwgPSBnZXRIYXJkd2FyZUxldmVsQ2hlY2tlZCgpOworICAgICAgICByZXR1cm4gZGV2aWNlTGV2ZWwgPT0gQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLklORk9fU1VQUE9SVEVEX0hBUkRXQVJFX0xFVkVMX0VYVEVSTkFMOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTU0Niw2ICsxNTc2LDM2IEBACiAgICAgICAgIHJldHVybiBlZGdlTW9kZXM7CiAgICAgfQogCisgICAgICBwdWJsaWMgaW50W10gZ2V0QXZhaWxhYmxlU2hhZGluZ01vZGVzQ2hlY2tlZCgpIHsKKyAgICAgICAgS2V5PGludFtdPiBrZXkgPSBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuU0hBRElOR19BVkFJTEFCTEVfTU9ERVM7CisgICAgICAgIGludFtdIHNoYWRpbmdNb2RlcyA9IGdldFZhbHVlRnJvbUtleU5vbk51bGwoa2V5KTsKKworICAgICAgICBpZiAoc2hhZGluZ01vZGVzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgaW50WzBdOworICAgICAgICB9CisKKyAgICAgICAgTGlzdDxJbnRlZ2VyPiBtb2RlTGlzdCA9IEFycmF5cy5hc0xpc3QoQ2FtZXJhVGVzdFV0aWxzLnRvT2JqZWN0KHNoYWRpbmdNb2RlcykpOworICAgICAgICAvLyBGdWxsIGRldmljZSBzaG91bGQgYWx3YXlzIGluY2x1ZGUgT0ZGIGFuZCBGQVNUCisgICAgICAgIGlmIChpc0hhcmR3YXJlTGV2ZWxBdExlYXN0RnVsbCgpKSB7CisgICAgICAgICAgICBjaGVja1RydWVGb3JLZXkoa2V5LCAiRnVsbCBkZXZpY2UgbXVzdCBjb250YWluIE9GRiBhbmQgRkFTVCBzaGFkaW5nIG1vZGVzIiwKKyAgICAgICAgICAgICAgICAgICAgbW9kZUxpc3QuY29udGFpbnMoQ2FtZXJhTWV0YWRhdGEuU0hBRElOR19NT0RFX09GRikgJiYKKyAgICAgICAgICAgICAgICAgICAgbW9kZUxpc3QuY29udGFpbnMoQ2FtZXJhTWV0YWRhdGEuU0hBRElOR19NT0RFX0ZBU1QpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc0hhcmR3YXJlTGV2ZWxBdExlYXN0TGltaXRlZCgpKSB7CisgICAgICAgICAgICAvLyBGQVNUIGFuZCBISUdIX1FVQUxJVFkgbW9kZSBtdXN0IGJlIGJvdGggcHJlc2VudCBvciBib3RoIG5vdCBwcmVzZW50CisgICAgICAgICAgICBMaXN0PEludGVnZXI+IGNvdXBsZWRNb2RlcyA9IEFycmF5cy5hc0xpc3QobmV3IEludGVnZXJbXSB7CisgICAgICAgICAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhLlNIQURJTkdfTU9ERV9GQVNULAorICAgICAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YS5TSEFESU5HX01PREVfSElHSF9RVUFMSVRZCisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGNoZWNrVHJ1ZUZvcktleSgKKyAgICAgICAgICAgICAgICAgICAga2V5LCAiIEZBU1QgYW5kIEhJR0hfUVVBTElUWSBtb2RlIG11c3QgYm90aCBwcmVzZW50IG9yIGJvdGggbm90IHByZXNlbnQiLAorICAgICAgICAgICAgICAgICAgICBjb250YWluc0FsbE9yTm9uZShtb2RlTGlzdCwgY291cGxlZE1vZGVzKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc2hhZGluZ01vZGVzOworICAgIH0KKwogICAgIHB1YmxpYyBpbnRbXSBnZXRBdmFpbGFibGVOb2lzZVJlZHVjdGlvbk1vZGVzQ2hlY2tlZCgpIHsKICAgICAgICAgS2V5PGludFtdPiBrZXkgPQogICAgICAgICAgICAgICAgIENhbWVyYUNoYXJhY3RlcmlzdGljcy5OT0lTRV9SRURVQ1RJT05fQVZBSUxBQkxFX05PSVNFX1JFRFVDVElPTl9NT0RFUzsKQEAgLTE4NjAsNyArMTkyMCw3IEBACiAKICAgICAgICAgY2hlY2tBcnJheVZhbHVlc0luUmFuZ2Uoa2V5LCBhdmFpbGFibGVDYXBzLAogICAgICAgICAgICAgICAgIENhbWVyYUNoYXJhY3RlcmlzdGljcy5SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfQkFDS1dBUkRfQ09NUEFUSUJMRSwKLSAgICAgICAgICAgICAgICBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX0NPTlNUUkFJTkVEX0hJR0hfU1BFRURfVklERU8pOworICAgICAgICAgICAgICAgIENhbWVyYUNoYXJhY3RlcmlzdGljcy5SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfTU9OT0NIUk9NRSk7CiAgICAgICAgIGNhcExpc3QgPSBBcnJheXMuYXNMaXN0KENhbWVyYVRlc3RVdGlscy50b09iamVjdChhdmFpbGFibGVDYXBzKSk7CiAgICAgICAgIHJldHVybiBjYXBMaXN0OwogICAgIH0KQEAgLTIxODIsNiArMjI0MiwxOCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIENoZWNrIGlmIHRoaXMgY2FtZXJhIGRldmljZSBpcyBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhIGJhY2tlZCBieSBtdWx0aXBsZQorICAgICAqIHBoeXNpY2FsIGNhbWVyYXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzTG9naWNhbE11bHRpQ2FtZXJhKCkgeworICAgICAgICBMaXN0PEludGVnZXI+IGF2YWlsYWJsZUNhcGFiaWxpdGllcyA9IGdldEF2YWlsYWJsZUNhcGFiaWxpdGllc0NoZWNrZWQoKTsKKyAgICAgICAgcmV0dXJuIChhdmFpbGFibGVDYXBhYmlsaXRpZXMuY29udGFpbnMoCisgICAgICAgICAgICAgICAgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLlJFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19MT0dJQ0FMX01VTFRJX0NBTUVSQSkpOworICAgIH0KKworICAgIC8qKgogICAgICAqIENoZWNrIGlmIGhpZ2ggc3BlZWQgdmlkZW8gaXMgc3VwcG9ydGVkIChISUdIX1NQRUVEX1ZJREVPIHNjZW5lIG1vZGUgaXMKICAgICAgKiBzdXBwb3J0ZWQsIHN1cHBvcnRlZCBoaWdoIHNwZWVkIGZwcyByYW5nZXMgYW5kIHNpemVzIGFyZSB2YWxpZCkuCiAgICAgICoKQEAgLTIyNTgsNiArMjMzMCw1MyBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIENoZWNrIGlmIEFGIHNjZW5lIGNoYW5nZSBrZXkgaXMgc3VwcG9ydGVkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQWZTY2VuZUNoYW5nZVN1cHBvcnRlZCgpIHsKKyAgICAgICAgcmV0dXJuIGFyZUtleXNBdmFpbGFibGUoQ2FwdHVyZVJlc3VsdC5DT05UUk9MX0FGX1NDRU5FX0NIQU5HRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgT0lTIGRhdGEgbW9kZSBpcyBzdXBwb3J0ZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNPaXNEYXRhTW9kZVN1cHBvcnRlZCgpIHsKKyAgICAgICAgaW50W10gYXZhaWxhYmxlT2lzRGF0YU1vZGVzID0gbUNoYXJhY3RlcmlzdGljcy5nZXQoCisgICAgICAgICAgICAgICAgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLlNUQVRJU1RJQ1NfSU5GT19BVkFJTEFCTEVfT0lTX0RBVEFfTU9ERVMpOworCisgICAgICAgIGlmIChhdmFpbGFibGVPaXNEYXRhTW9kZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgbW9kZSA6IGF2YWlsYWJsZU9pc0RhdGFNb2RlcykgeworICAgICAgICAgICAgaWYgKG1vZGUgPT0gQ2FtZXJhTWV0YWRhdGEuU1RBVElTVElDU19PSVNfREFUQV9NT0RFX09OKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgZGlzdG9ydGlvbiBjb3JyZWN0aW9uIGlzIHN1cHBvcnRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Rpc3RvcnRpb25Db3JyZWN0aW9uU3VwcG9ydGVkKCkgeworICAgICAgICBib29sZWFuIGRpc3RvcnRpb25Db3JyZWN0aW9uU3VwcG9ydGVkID0gZmFsc2U7CisgICAgICAgIGludFtdIGRpc3RvcnRpb25Nb2RlcyA9IG1DaGFyYWN0ZXJpc3RpY3MuZ2V0KAorICAgICAgICAgICAgICAgIENhbWVyYUNoYXJhY3RlcmlzdGljcy5ESVNUT1JUSU9OX0NPUlJFQ1RJT05fQVZBSUxBQkxFX01PREVTKTsKKyAgICAgICAgaWYgKGRpc3RvcnRpb25Nb2RlcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBtb2RlIDogZGlzdG9ydGlvbk1vZGVzKSB7CisgICAgICAgICAgICBpZiAobW9kZSAhPSBDYXB0dXJlUmVxdWVzdC5ESVNUT1JUSU9OX0NPUlJFQ1RJT05fTU9ERV9PRkYpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBHZXQgdGhlIHZhbHVlIGluIGluZGV4IGZvciBhIGZpeGVkLXNpemUgYXJyYXkgZnJvbSBhIGdpdmVuIGtleS4KICAgICAgKgogICAgICAqIDxwPklmIHRoZSBjYW1lcmEgZGV2aWNlIGlzIGluY29ycmVjdGx5IHJlcG9ydGluZyB2YWx1ZXMsIGxvZyBhIHdhcm5pbmcgYW5kIHJldHVybgpkaWZmIC0tZ2l0IGEvdGVzdHMvY2FtZXJhL3V0aWxzL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2N0cy9oZWxwZXJzL0NhbWVyYVV0aWxzLmphdmEgYi90ZXN0cy9jYW1lcmEvdXRpbHMvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY3RzL2hlbHBlcnMvQ2FtZXJhVXRpbHMuamF2YQppbmRleCBhYWY5NTkwLi5mZTExOWE5IDEwMDY0NAotLS0gYS90ZXN0cy9jYW1lcmEvdXRpbHMvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY3RzL2hlbHBlcnMvQ2FtZXJhVXRpbHMuamF2YQorKysgYi90ZXN0cy9jYW1lcmEvdXRpbHMvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY3RzL2hlbHBlcnMvQ2FtZXJhVXRpbHMuamF2YQpAQCAtMzgsMTQgKzM4LDMzIEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTGVnYWN5SEFMKENvbnRleHQgY29udGV4dCwgaW50IGNhbWVyYUlkKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgQ2FtZXJhTWFuYWdlciBtYW5hZ2VyID0gKENhbWVyYU1hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkNBTUVSQV9TRVJWSUNFKTsKKyAgICAgICAgU3RyaW5nIGNhbWVyYUlkU3RyID0gbWFuYWdlci5nZXRDYW1lcmFJZExpc3QoKVtjYW1lcmFJZF07CiAgICAgICAgIENhbWVyYUNoYXJhY3RlcmlzdGljcyBjaGFyYWN0ZXJpc3RpY3MgPQotICAgICAgICAgICAgICAgIG1hbmFnZXIuZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKEludGVnZXIudG9TdHJpbmcoY2FtZXJhSWQpKTsKKyAgICAgICAgICAgICAgICBtYW5hZ2VyLmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjYW1lcmFJZFN0cik7CiAKICAgICAgICAgcmV0dXJuIGNoYXJhY3RlcmlzdGljcy5nZXQoQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLklORk9fU1VQUE9SVEVEX0hBUkRXQVJFX0xFVkVMKSA9PQogICAgICAgICAgICAgICAgIENhbWVyYUNoYXJhY3RlcmlzdGljcy5JTkZPX1NVUFBPUlRFRF9IQVJEV0FSRV9MRVZFTF9MRUdBQ1k7CiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBkZXZpY2Ugb25seSBzdXBwb3J0cyB7QGNvZGUgRVhURVJOQUx9IG1vZGUgb3BlcmF0aW9uIGluIHRoZQorICAgICAqIENhbWVyYTIgQVBJIGZvciB0aGUgZ2l2ZW4gY2FtZXJhIElELgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQge0BsaW5rIENvbnRleHR9IHRvIGFjY2VzcyB0aGUge0BsaW5rIENhbWVyYU1hbmFnZXJ9IGluLgorICAgICAqIEBwYXJhbSBjYW1lcmFJZCB0aGUgSUQgb2YgdGhlIGNhbWVyYSBkZXZpY2UgdG8gY2hlY2suCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBkZXZpY2Ugb25seSBzdXBwb3J0cyB7QGNvZGUgTEVHQUNZfSBtb2RlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0V4dGVybmFsKENvbnRleHQgY29udGV4dCwgaW50IGNhbWVyYUlkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQ2FtZXJhTWFuYWdlciBtYW5hZ2VyID0gKENhbWVyYU1hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkNBTUVSQV9TRVJWSUNFKTsKKyAgICAgICAgU3RyaW5nIGNhbWVyYUlkU3RyID0gbWFuYWdlci5nZXRDYW1lcmFJZExpc3QoKVtjYW1lcmFJZF07CisgICAgICAgIENhbWVyYUNoYXJhY3RlcmlzdGljcyBjaGFyYWN0ZXJpc3RpY3MgPQorICAgICAgICAgICAgICAgIG1hbmFnZXIuZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNhbWVyYUlkU3RyKTsKKworICAgICAgICByZXR1cm4gY2hhcmFjdGVyaXN0aWNzLmdldChDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuSU5GT19TVVBQT1JURURfSEFSRFdBUkVfTEVWRUwpID09CisgICAgICAgICAgICAgICAgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLklORk9fU1VQUE9SVEVEX0hBUkRXQVJFX0xFVkVMX0VYVEVSTkFMOworICAgIH0KKworICAgIC8qKgogICAgICAqIFNoYXJlZCBzaXplIGNvbXBhcmlzb24gbWV0aG9kIHVzZWQgYnkgc2l6ZSBjb21wYXJhdG9ycy4KICAgICAgKgogICAgICAqIDxwPkNvbXBhcmVzIHRoZSBudW1iZXIgb2YgcGl4ZWxzIGl0IGNvdmVycy5JZiB0d28gdGhlIGFyZWFzIG9mIHR3byBzaXplcyBhcmUgc2FtZSwgY29tcGFyZQpkaWZmIC0tZ2l0IGEvdGVzdHMvY29yZS9BbmRyb2lkLm1rIGIvdGVzdHMvY29yZS9BbmRyb2lkLm1rCmluZGV4IDdhMmE3MDguLmU5Yzk3OTMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2NvcmUvQW5kcm9pZC5taworKysgYi90ZXN0cy9jb3JlL0FuZHJvaWQubWsKQEAgLTE0LDYgKzE0LDQgQEAKIAogTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCiAKLUJVSUxEX0NUU0NPUkVfUEFDS0FHRTo9JChMT0NBTF9QQVRIKS9jdHNjb3JlLm1rCi0KIGluY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2NvcmUvY3RzY29yZS5tayBiL3Rlc3RzL2NvcmUvY3RzY29yZS5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBhOTFmMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9jb3JlL2N0c2NvcmUubWsKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1MT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyIGJvdW5jeWNhc3RsZSBjb25zY3J5cHQKLUxPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKLUxPQ0FMX0RFWF9QUkVPUFQgOj0gZmFsc2UKLQotIyBkb24ndCBpbmNsdWRlIHRoZXNlIHBhY2thZ2VzIGluIGFueSB0YXJnZXQKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0jIGFuZCB3aGVuIGluc3RhbGxlZCBleHBsaWNpdGx5IHB1dCB0aGVtIGluIHRoZSBkYXRhIHBhcnRpdGlvbgotTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKLSMgRG9uJ3QgZGVsZXRlIE1FVEEtSU5GIGZyb20gdGhlIGNvcmUtdGVzdHMgamFyCi1MT0NBTF9ET05UX0RFTEVURV9KQVJfTUVUQV9JTkYgOj0gdHJ1ZQotCi0jIFRPRE86IENsZWFuIHVwIHRoaXMgbWVzcy4gKGIvMjY0ODM5NDkpLiBsaWJuYXRpdmVoZWxwZXJfY29tcGF0X2xpYmMrKyBwdWxscyBpbiBpdHMgb3duCi0jIHN0YXRpYyBjb3B5IG9mIGxpYmMrKyBhbmQgdGhlIGxpYmMrKyB3ZSdyZSBidW5kbGluZyBoZXJlIGlzIHRoZSBwbGF0Zm9ybSBsaWJjKysuIFRoaXMgaXMKLSMgYnJvdW5kIHRvIGJyZWFrIGJ1dCBpcyBiZWluZyBzdWJtaXR0ZWQgYXMgYSB3b3JrYXJvdW5kIGZvciBmYWlsaW5nIENUUyB0ZXN0cy4KLUxPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmphdmFjb3JldGVzdHMgbGlic3FsaXRlX2puaSBsaWJuYXRpdmVoZWxwZXJfY29tcGF0X2xpYmMrKyBsaWJjKysKLQotIyBJbmNsdWRlIGJvdGggdGhlIDMyIGFuZCA2NCBiaXQgdmVyc2lvbnMgb2YgbGliamF2YWNvcmV0ZXN0cywKLSMgd2hlcmUgYXBwbGljYWJsZS4KLUxPQ0FMX01VTFRJTElCIDo9IGJvdGgKLQotaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS90ZXN0cy9jb3JlL3J1bm5lci1heHQvQW5kcm9pZC5tayBiL3Rlc3RzL2NvcmUvcnVubmVyLWF4dC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhYjkxYjgxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY29yZS9ydW5uZXItYXh0L0FuZHJvaWQubWsKQEAgLTAsMCArMSw1MSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIEJ1aWxkIHRoZSBjb3JlIHJ1bm5lci4KKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyMgQnVpbGQgbGlicmFyeQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLHNyYykKK0xPQ0FMX01PRFVMRSA6PSBjdHMtY29yZS10ZXN0LXJ1bm5lci1heHQKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCisgICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgXAorICAgIGFuZHJvaWR4LnRlc3QucnVsZXMgXAorICAgIHZvZ2FyZXhwZWN0IFwKKyAgICB0ZXN0bmcKKworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lci5zdHVicworTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0pBVkFfTElCUkFSWSkKKworIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgQnVpbGQgdGhlIHJ1biBsaXN0ZW5lcgorIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworIyBCdWlsZCBsaWJyYXJ5CitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsc3JjL2NvbS9hbmRyb2lkL2N0cy9ydW5uZXIpCitMT0NBTF9NT0RVTEUgOj0gY3RzLXRlc3QtcnVubmVyLWF4dAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWR4LnRlc3QucnVsZXMKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19KQVZBX0xJQlJBUlkpCmRpZmYgLS1naXQgYS90ZXN0cy9jb3JlL3J1bm5lci1heHQvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL2NvcmUvcnVubmVyLWF4dC9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MjU1MDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jb3JlL3J1bm5lci1heHQvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDMxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iYW5kcm9pZC5jb3JlLnRlc3RzLnJ1bm5lciI+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5JTlRFUk5FVCIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0VYVEVSTkFMX1NUT1JBR0UiIC8+CisKKyAgICA8YXBwbGljYXRpb24+CisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgorICAgIDwvYXBwbGljYXRpb24+CisKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmNvcmUudGVzdHMucnVubmVyIgorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iY3RzIGZyYW1ld29yayB0ZXN0cyIvPgorCis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvY29yZS9ydW5uZXItYXh0L3NyYy9jb20vYW5kcm9pZC9jdHMvY29yZS9ydW5uZXIvRXhwZWN0YXRpb25CYXNlZEZpbHRlci5qYXZhIGIvdGVzdHMvY29yZS9ydW5uZXItYXh0L3NyYy9jb20vYW5kcm9pZC9jdHMvY29yZS9ydW5uZXIvRXhwZWN0YXRpb25CYXNlZEZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MDlkYmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jb3JlL3J1bm5lci1heHQvc3JjL2NvbS9hbmRyb2lkL2N0cy9jb3JlL3J1bm5lci9FeHBlY3RhdGlvbkJhc2VkRmlsdGVyLmphdmEKQEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5jdHMuY29yZS5ydW5uZXI7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3BsaXR0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmF4LmFubm90YXRpb24uTnVsbGFibGU7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5EZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLm1hbmlwdWxhdGlvbi5GaWx0ZXI7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyZW50UnVubmVyOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlN1aXRlOworaW1wb3J0IHZvZ2FyLkV4cGVjdGF0aW9uOworaW1wb3J0IHZvZ2FyLkV4cGVjdGF0aW9uU3RvcmU7CitpbXBvcnQgdm9nYXIuTW9kZUlkOworaW1wb3J0IHZvZ2FyLlJlc3VsdDsKKworLyoqCisgKiBGaWx0ZXIgb3V0IHRlc3RzL2NsYXNzZXMgdGhhdCBhcmUgbm90IHJlcXVlc3RlZCBvciB3aGljaCBhcmUgZXhwZWN0ZWQgdG8gZmFpbC4KKyAqCisgKiA8cD5UaGlzIGZpbHRlciBoYXMgdG8gaGFuZGxlIGJvdGggYSBoaWVyYXJjaHkgb2Yge0Bjb2RlIERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uc30gdGhhdCBsb29rcworICogc29tZXRoaW5nIGxpa2UgdGhpczoKKyAqIDxwcmU+CisgKiBTdWl0ZQorICogICAgIFN1aXRlCisgKiAgICAgICAgIFN1aXRlCisgKiAgICAgICAgICAgICBQYXJlbnRSdW5uZXIKKyAqICAgICAgICAgICAgICAgICBUZXN0CisgKiAgICAgICAgICAgICAgICAgLi4uCisgKiAgICAgICAgICAgICAuLi4KKyAqICAgICAgICAgUGFyZW50UnVubmVyCisgKiAgICAgICAgICAgICBUZXN0CisgKiAgICAgICAgICAgICAuLi4KKyAqICAgICAgICAgLi4uCisgKiAgICAgU3VpdGUKKyAqICAgICAgICAgUGFyZW50UnVubmVyCisgKiAgICAgICAgICAgICBUZXN0CisgKiAgICAgICAgICAgICAuLi4KKyAqICAgICAgICAgLi4uCisgKiAgICAgLi4uCisgKiA8L3ByZT4KKyAqCisgKiA8cD5JdCBjYW5ub3QgZmlsdGVyIG91dCB0aGUgbm9uLWxlYWYgbm9kZXMgaW4gdGhlIGhpZXJhcmNoeSwgaS5lLiB7QGxpbmsgU3VpdGV9IGFuZAorICoge0BsaW5rIFBhcmVudFJ1bm5lcn0sIGFzIHRoYXQgd291bGQgcHJldmVudCBpdCBmcm9tIHRyYXZlcnNpbmcgdGhlIGhpZXJhcmNoeSBhbmQgZmluZGluZworICogdGhlIGxlYWYgbm9kZXMuCisgKi8KK2NsYXNzIEV4cGVjdGF0aW9uQmFzZWRGaWx0ZXIgZXh0ZW5kcyBGaWx0ZXIgeworCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRXhwZWN0YXRpb25CYXNlZEZpbHRlciI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJHVU1FTlRfRVhQRUNUQVRJT05TID0gImNvcmUtZXhwZWN0YXRpb25zIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNwbGl0dGVyIENMQVNTX0xJU1RfU1BMSVRURVIgPSBTcGxpdHRlci5vbignLCcpLnRyaW1SZXN1bHRzKCk7CisKKyAgICBwcml2YXRlIGZpbmFsIEV4cGVjdGF0aW9uU3RvcmUgZXhwZWN0YXRpb25TdG9yZTsKKworICAgIHByaXZhdGUgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRFeHBlY3RhdGlvblJlc291cmNlUGF0aHMoQnVuZGxlIGFyZ3MpIHsKKyAgICAgICAgcmV0dXJuIENMQVNTX0xJU1RfU1BMSVRURVIuc3BsaXRUb0xpc3QoYXJncy5nZXRTdHJpbmcoQVJHVU1FTlRfRVhQRUNUQVRJT05TKSk7CisgICAgfQorCisgICAgcHVibGljIEV4cGVjdGF0aW9uQmFzZWRGaWx0ZXIoQnVuZGxlIGFyZ3MpIHsKKyAgICAgICAgRXhwZWN0YXRpb25TdG9yZSBleHBlY3RhdGlvblN0b3JlID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEdldCB0aGUgc2V0IG9mIHJlc291cmNlIG5hbWVzIGNvbnRhaW5pbmcgdGhlIGV4cGVjdGF0aW9ucy4KKyAgICAgICAgICAgIFNldDxTdHJpbmc+IGV4cGVjdGF0aW9uUmVzb3VyY2VzID0gbmV3IExpbmtlZEhhc2hTZXQ8PigKKyAgICAgICAgICAgICAgICBnZXRFeHBlY3RhdGlvblJlc291cmNlUGF0aHMoYXJncykpOworICAgICAgICAgICAgTG9nLmkoVEFHLCAiTG9hZGluZyBleHBlY3RhdGlvbnMgZnJvbTogIiArIGV4cGVjdGF0aW9uUmVzb3VyY2VzKTsKKyAgICAgICAgICAgIGV4cGVjdGF0aW9uU3RvcmUgPSBFeHBlY3RhdGlvblN0b3JlLnBhcnNlUmVzb3VyY2VzKAorICAgICAgICAgICAgICAgIGdldENsYXNzKCksIGV4cGVjdGF0aW9uUmVzb3VyY2VzLCBNb2RlSWQuREVWSUNFKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ291bGQgbm90IGluaXRpYWxpemUgRXhwZWN0YXRpb25TdG9yZTogIiwgZSk7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLmV4cGVjdGF0aW9uU3RvcmUgPSBleHBlY3RhdGlvblN0b3JlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHNob3VsZFJ1bihEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgeworICAgICAgICAvLyBPbmx5IGZpbHRlciBsZWFmIG5vZGVzLiBUaGUgZGVzY3JpcHRpb24gaXMgZm9yIGEgdGVzdCBpZiBhbmQgb25seSBpZiBpdCBpcyBhIGxlYWYgbm9kZS4KKyAgICAgICAgLy8gTm9uLWxlYWYgbm9kZXMgbXVzdCBub3QgYmUgZmlsdGVyZWQgb3V0IGFzIHRoYXQgd291bGQgcHJldmVudCBsZWFmIG5vZGVzIGZyb20gYmVpbmcKKyAgICAgICAgLy8gdmlzaXRlZCBpbiB0aGUgY2FzZSB3aGVuIHdlIGFyZSB0cmF2ZXJzaW5nIHRoZSBoaWVyYXJjaHkgb2YgY2xhc3Nlcy4KKyAgICAgICAgRGVzY3JpcHRpb24gdGVzdERlc2NyaXB0aW9uID0gZ2V0VGVzdERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKKyAgICAgICAgaWYgKHRlc3REZXNjcmlwdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gdGVzdERlc2NyaXB0aW9uLmdldENsYXNzTmFtZSgpOworICAgICAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSB0ZXN0RGVzY3JpcHRpb24uZ2V0TWV0aG9kTmFtZSgpOworICAgICAgICAgICAgU3RyaW5nIHRlc3ROYW1lID0gY2xhc3NOYW1lICsgIiMiICsgbWV0aG9kTmFtZTsKKworICAgICAgICAgICAgaWYgKGV4cGVjdGF0aW9uU3RvcmUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEV4cGVjdGF0aW9uIGV4cGVjdGF0aW9uID0gZXhwZWN0YXRpb25TdG9yZS5nZXQodGVzdE5hbWUpOworICAgICAgICAgICAgICAgIGlmIChleHBlY3RhdGlvbi5nZXRSZXN1bHQoKSAhPSBSZXN1bHQuU1VDQ0VTUykgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJFeGNsdWRpbmcgdGVzdCAiICsgdGVzdERlc2NyaXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGFzIGl0IG1hdGNoZXMgZXhwZWN0YXRpb246ICIgKyBleHBlY3RhdGlvbik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIERlc2NyaXB0aW9uIGdldFRlc3REZXNjcmlwdGlvbihEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgeworICAgICAgICBMaXN0PERlc2NyaXB0aW9uPiBjaGlsZHJlbiA9IGRlc2NyaXB0aW9uLmdldENoaWxkcmVuKCk7CisgICAgICAgIC8vIEFuIGVtcHR5IGRlc2NyaXB0aW9uIGlzIGJ5IGRlZmluaXRpb24gYSB0ZXN0LgorICAgICAgICBpZiAoY2hpbGRyZW4uaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRpb247CisgICAgICAgIH0KKworICAgICAgICAvLyBIYW5kbGUgaW5pdGlhbGl6YXRpb24gZXJyb3JzIHRoYXQgd2VyZSB3cmFwcGVkIGluIGFuIEVycm9yUmVwb3J0aW5nUnVubmVyIGFzIGEgc3BlY2lhbAorICAgICAgICAvLyBjYXNlLiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIEVycm9yUmVwb3J0aW5nUnVubmVyIGlzIHRyZWF0ZWQgYXMgYSBzdWl0ZSBvZiBUaHJvd2FibGVzLAorICAgICAgICAvLyAod2hlcmUgZWFjaCBUaHJvd2FibGUgY29ycmVzcG9uZHMgdG8gYSB0ZXN0IGNhbGxlZCBpbml0aWFsaXphdGlvbkVycm9yKSBhbmQgc28gaXRzCisgICAgICAgIC8vIGRlc2NyaXB0aW9uIGNvbnRhaW5zIGNoaWxkcmVuLCBvbmUgZm9yIGVhY2ggVGhyb3dhYmxlLCBhbmQgc28gaXMgbm90IHRyZWF0ZWQgYXMgYSB0ZXN0CisgICAgICAgIC8vIHRvIGZpbHRlci4gVW5mb3J0dW5hdGVseSwgaXQgZG9lcyBub3Qgc3VwcG9ydCBGaWx0ZXJhYmxlIHNvIHRoaXMgZmlsdGVyIGlzIG5ldmVyIGFwcGxpZWQKKyAgICAgICAgLy8gdG8gaXRzIGNoaWxkcmVuLgorICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2p1bml0LXRlYW0vanVuaXQvaXNzdWVzLzEyNTMKKyAgICAgICAgRGVzY3JpcHRpb24gY2hpbGQgPSBjaGlsZHJlbi5nZXQoMCk7CisgICAgICAgIFN0cmluZyBtZXRob2ROYW1lID0gY2hpbGQuZ2V0TWV0aG9kTmFtZSgpOworICAgICAgICBpZiAoImluaXRpYWxpemF0aW9uRXJyb3IiLmVxdWFscyhtZXRob2ROYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuIGNoaWxkOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBkZXNjcmliZSgpIHsKKyAgICAgICAgcmV0dXJuICJUZXN0RmlsdGVyIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9jb3JlL3J1bm5lci1heHQvc3JjL2NvbS9hbmRyb2lkL2N0cy9jb3JlL3J1bm5lci9zdXBwb3J0L1NpbmdsZVRlc3ROR1Rlc3RSdW5MaXN0ZW5lci5qYXZhIGIvdGVzdHMvY29yZS9ydW5uZXItYXh0L3NyYy9jb20vYW5kcm9pZC9jdHMvY29yZS9ydW5uZXIvc3VwcG9ydC9TaW5nbGVUZXN0TkdUZXN0UnVuTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTY4YThiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY29yZS9ydW5uZXItYXh0L3NyYy9jb20vYW5kcm9pZC9jdHMvY29yZS9ydW5uZXIvc3VwcG9ydC9TaW5nbGVUZXN0TkdUZXN0UnVuTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDEyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY3RzLmNvcmUucnVubmVyLnN1cHBvcnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIExpc3RlbmVyIGZvciBUZXN0TkcgcnVucyB0aGF0IHByb3ZpZGVzIGd0ZXN0LWxpa2UgY29uc29sZSBvdXRwdXQuCisgKgorICogUHJpbnRzIGEgbWVzc2FnZSBsaWtlIFtSVU5dLCBbT0tdLCBbRVJST1JdLCBbU0tJUF0gdG8gc3Rkb3V0CisgKiBhcyB0ZXN0cyBhcmUgYmVpbmcgZXhlY3V0ZWQgd2l0aCB0aGVpciBzdGF0dXMuCisgKgorICogVGhpcyBvdXRwdXQgaXMgYWxzbyBzYXZlZCBhcyB0aGUgZGV2aWNlIGxvZ3MgKGxvZ2NhdCkgd2hlbiB0aGUgdGVzdCBpcyBydW4gdGhyb3VnaAorICogY3RzLXRyYWRlZmVkLgorICovCitwdWJsaWMgY2xhc3MgU2luZ2xlVGVzdE5HVGVzdFJ1bkxpc3RlbmVyIGltcGxlbWVudHMgb3JnLnRlc3RuZy5JVGVzdExpc3RlbmVyIHsKKyAgICBwcml2YXRlIGludCBtVGVzdFN0YXJ0ZWQgPSAwOworCisgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBUaHJvd2FibGU+IGZhaWx1cmVzID0gbmV3IExpbmtlZEhhc2hNYXA8PigpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJlZml4ZXMgeworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElORk9STUFUSU9OQUxfTUFSS0VSID0gICJbLS0tLS0tLS0tLV0iOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRfVEVTVF9NQVJLRVIgPSAgICAgIlsgUlVOICAgICAgXSI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPS19URVNUX01BUktFUiA9ICAgICAgICAiWyAgICAgICBPSyBdIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX1RFU1RfUlVOX01BUktFUiA9ICJbICAgIEVSUk9SIF0iOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0tJUFBFRF9URVNUX01BUktFUiA9ICAgIlsgICAgIFNLSVAgXSI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1JVTl9NQVJLRVIgPSAgICAgICAiWz09PT09PT09PT1dIjsKKyAgICB9CisKKyAgICAvLyBIb3cgbWFueSB0ZXN0cyBkaWQgVGVzdE5HICphY3R1YWxseSogdHJ5IHRvIHJ1bj8KKyAgICBwdWJsaWMgaW50IGdldE51bVRlc3RTdGFydGVkKCkgeworICAgICAgcmV0dXJuIG1UZXN0U3RhcnRlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgTWFwPFN0cmluZywgVGhyb3dhYmxlPiBnZXRGYWlsdXJlcygpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChmYWlsdXJlcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25GaW5pc2gob3JnLnRlc3RuZy5JVGVzdENvbnRleHQgY29udGV4dCkgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oU3RyaW5nLmZvcm1hdCgiJXMiLCBQcmVmaXhlcy5URVNUX1JVTl9NQVJLRVIpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblN0YXJ0KG9yZy50ZXN0bmcuSVRlc3RDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFN0cmluZy5mb3JtYXQoIiVzIiwgUHJlZml4ZXMuSU5GT1JNQVRJT05BTF9NQVJLRVIpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblRlc3RGYWlsZWRCdXRXaXRoaW5TdWNjZXNzUGVyY2VudGFnZShvcmcudGVzdG5nLklUZXN0UmVzdWx0IHJlc3VsdCkgeworICAgICAgICBvblRlc3RGYWlsdXJlKHJlc3VsdCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25UZXN0RmFpbHVyZShvcmcudGVzdG5nLklUZXN0UmVzdWx0IHJlc3VsdCkgeworICAgICAgICAvLyBBbGwgZmFpbHVyZXMgYXJlIGNvYWxlc2NlZCBpbnRvIG9uZSAnWyBGQUlMRUQgXScgbWVzc2FnZSBhdCB0aGUgZW5kCisgICAgICAgIC8vIFRoaXMgaXMgYmVjYXVzZSBhIHNpbmdsZSB0ZXN0IG1ldGhvZCBjYW4gcnVuIG11bHRpcGxlIHRpbWVzIHdpdGggZGlmZmVyZW50IHBhcmFtZXRlcnMuCisgICAgICAgIC8vIFNpbmNlIHdlIG9ubHkgdGVzdCBhIHNpbmdsZSBtZXRob2QsIGl0J3Mgc2FmZSB0byBjb21iaW5lIGFsbCBmYWlsdXJlcyBpbnRvIG9uZQorICAgICAgICAvLyBmYWlsdXJlIGF0IHRoZSBlbmQuCisgICAgICAgIC8vCisgICAgICAgIC8vIFRoZSBiaWcgcGFzcy9mYWlsIGlzIHByaW50ZWQgZnJvbSBTaW5nbGVUZXN0TkdUZXN0UnVubmVyLCBub3QgZnJvbSB0aGUgbGlzdGVuZXIuCisgICAgICAgIFN0cmluZyBpZCA9IGdldElkKHJlc3VsdCk7CisgICAgICAgIFRocm93YWJsZSB0aHJvd2FibGUgPSByZXN1bHQuZ2V0VGhyb3dhYmxlKCk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihTdHJpbmcuZm9ybWF0KCIlcyAlcyA6OjogJXMiLCBQcmVmaXhlcy5FUlJPUl9URVNUX1JVTl9NQVJLRVIsCisgICAgICAgICAgICAgICAgaWQsIHN0cmluZ2lmeSh0aHJvd2FibGUpKSk7CisgICAgICAgIGZhaWx1cmVzLnB1dChpZCwgdGhyb3dhYmxlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblRlc3RTa2lwcGVkKG9yZy50ZXN0bmcuSVRlc3RSZXN1bHQgcmVzdWx0KSB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihTdHJpbmcuZm9ybWF0KCIlcyAlcyIsIFByZWZpeGVzLlNLSVBQRURfVEVTVF9NQVJLRVIsCisgICAgICAgICAgICAgIGdldElkKHJlc3VsdCkpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblRlc3RTdGFydChvcmcudGVzdG5nLklUZXN0UmVzdWx0IHJlc3VsdCkgeworICAgICAgICBtVGVzdFN0YXJ0ZWQrKzsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFN0cmluZy5mb3JtYXQoIiVzICVzIiwgUHJlZml4ZXMuU1RBUlRfVEVTVF9NQVJLRVIsCisgICAgICAgICAgICAgIGdldElkKHJlc3VsdCkpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblRlc3RTdWNjZXNzKG9yZy50ZXN0bmcuSVRlc3RSZXN1bHQgcmVzdWx0KSB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihTdHJpbmcuZm9ybWF0KCIlcyIsIFByZWZpeGVzLk9LX1RFU1RfTUFSS0VSKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0SWQob3JnLnRlc3RuZy5JVGVzdFJlc3VsdCB0ZXN0KSB7CisgICAgICAgIC8vIFRlc3RORyBpcyBxdWl0ZSBjb21wbGljYXRlZCBzaW5jZSB0ZXN0cyBjYW4gaGF2ZSBhcmJpdHJhcnkgcGFyYW1ldGVycy4KKyAgICAgICAgLy8gVXNlIGl0cyBjb2RlIHRvIHN0cmluZ2lmeSBhIHJlc3VsdCBuYW1lIGluc3RlYWQgb2YgZG9pbmcgaXQgb3Vyc2VsdmVzLgorCisgICAgICAgIG9yZy50ZXN0bmcucmVtb3RlLnN0cnByb3RvY29sLlRlc3RSZXN1bHRNZXNzYWdlIG1zZyA9CisgICAgICAgICAgICAgICAgbmV3IG9yZy50ZXN0bmcucmVtb3RlLnN0cnByb3RvY29sLlRlc3RSZXN1bHRNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICBudWxsLCAvKnN1aXRlIG5hbWUqLworICAgICAgICAgICAgICAgICAgICBudWxsLCAvKnRlc3QgbmFtZSAtLSBkaXNwbGF5IHRoZSB0ZXN0IG1ldGhvZCBuYW1lIGluc3RlYWQgKi8KKyAgICAgICAgICAgICAgICAgICAgdGVzdCk7CisKKyAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IHRlc3QuZ2V0VGVzdENsYXNzKCkuZ2V0TmFtZSgpOworICAgICAgICAvL1N0cmluZyBuYW1lID0gdGVzdC5nZXRNZXRob2QoKS5nZXRNZXRob2ROYW1lKCk7CisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlcyMlcyIsIGNsYXNzTmFtZSwgbXNnLnRvRGlzcGxheVN0cmluZygpKTsKKworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIHN0cmluZ2lmeShUaHJvd2FibGUgZXJyb3IpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy50b1N0cmluZyhlcnJvci5nZXRTdGFja1RyYWNlKCkpLnJlcGxhY2VBbGwoIlxuIiwgIiAiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9jb3JlL3J1bm5lci1heHQvc3JjL2NvbS9hbmRyb2lkL2N0cy9jb3JlL3J1bm5lci9zdXBwb3J0L1NpbmdsZVRlc3ROZ1Rlc3RFeGVjdXRvci5qYXZhIGIvdGVzdHMvY29yZS9ydW5uZXItYXh0L3NyYy9jb20vYW5kcm9pZC9jdHMvY29yZS9ydW5uZXIvc3VwcG9ydC9TaW5nbGVUZXN0TmdUZXN0RXhlY3V0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWIxOGRmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY29yZS9ydW5uZXItYXh0L3NyYy9jb20vYW5kcm9pZC9jdHMvY29yZS9ydW5uZXIvc3VwcG9ydC9TaW5nbGVUZXN0TmdUZXN0RXhlY3V0b3IuamF2YQpAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY3RzLmNvcmUucnVubmVyLnN1cHBvcnQ7CisKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0Tkc7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sQ2xhc3M7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sSW5jbHVkZTsKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxTdWl0ZTsKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxUZXN0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBUZXN0IGV4ZWN1dG9yIHRvIHJ1biBhIHNpbmdsZSBUZXN0TkcgdGVzdCBtZXRob2QuCisgKi8KK3B1YmxpYyBjbGFzcyBTaW5nbGVUZXN0TmdUZXN0RXhlY3V0b3IgeworICAgIC8vIEV4ZWN1dGUgYW55IG1ldGhvZCB3aGljaCBpcyBpbiB0aGUgY2xhc3Mga2xhc3MuCisgICAgLy8gVGhlIGtsYXNzIGlzIHBhc3NlZCBpbiBzZXBhcmF0ZWx5IHRvIGhhbmRsZSBpbmhlcml0ZWQgbWV0aG9kcyBvbmx5LgorICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBhbGwgdGVzdHMgcGFzcywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgIHB1YmxpYyBzdGF0aWMgUmVzdWx0IGV4ZWN1dGUoQ2xhc3M8Pz4ga2xhc3MsIFN0cmluZyBtZXRob2ROYW1lKSB7CisgICAgICAgIGlmIChrbGFzcyA9PSBudWxsKSB7CisgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJrbGFzcyBtdXN0IG5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAobWV0aG9kTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJtZXRob2ROYW1lIG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vaWYgKCFtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5pc0Fzc2lnbmFibGVGcm9tKGtsYXNzKSkgeworICAgICAgICAvLyAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigia2xhc3MgbXVzdCBtYXRjaCBtZXRob2QncyBkZWNsYXJpbmcgY2xhc3MiKTsKKyAgICAgICAgLy99CisKKyAgICAgICAgU2luZ2xlVGVzdE5HVGVzdFJ1bkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFNpbmdsZVRlc3ROR1Rlc3RSdW5MaXN0ZW5lcigpOworCisgICAgICAgIC8vIEFsdGhvdWdoIGNyZWF0aW5nIGEgbmV3IHRlc3RuZyAiY29yZSIgZXZlcnkgdGltZSBtaWdodCBzZWVtIGhlYXZ5d2VpZ2h0LCBpbiBwcmFjdGljZQorICAgICAgICAvLyBpdCBzZWVtcyB0byB0YWtlIGEgbWVyZSBmZXcgbWlsbGlzZWNvbmRzIGF0IG1vc3QuCisgICAgICAgIC8vIFNpbmNlIHdlJ3JlIHJ1bm5pbmcgYWxsIHRoZSBwYXJhbWV0ZXJpYyBjb21iaW5hdGlvbnMgb2YgYSB0ZXN0LAorICAgICAgICAvLyB0aGlzIGVuZHMgdXAgYmVpbmcgbmVnbGlibGUgcmVsYXRpdmUgdG8gdGhhdC4KKyAgICAgICAgVGVzdE5HIHRlc3RuZyA9IGNyZWF0ZVRlc3RORyhrbGFzcy5nZXROYW1lKCksIG1ldGhvZE5hbWUsIGxpc3RlbmVyKTsKKyAgICAgICAgdGVzdG5nLnJ1bigpOworCisgICAgICAgIGlmIChsaXN0ZW5lci5nZXROdW1UZXN0U3RhcnRlZCgpIDw9IDApIHsKKyAgICAgICAgICAvLyBJdCdzIHBvc3NpYmxlIHRvIGJlIGludm9rZWQgaGVyZSB3aXRoIGFuIGFyYml0cmFyeSBtZXRob2QgbmFtZQorICAgICAgICAgIC8vIHNvIHByaW50IG91dCBhIHdhcm5pbmcgaW5jYXNlIFRlc3RORyBhY3R1YWxseSBoYWQgYSBuby1vcC4KKyAgICAgICAgICBMb2cudygiVGVzdE5nRXhlYyIsICJleGVjdXRlIGNsYXNzICIgKyBrbGFzcy5nZXROYW1lKCkgKyAiLCBtZXRob2QgIiArIG1ldGhvZE5hbWUgKworICAgICAgICAgICAgICAiIGhhZCAwIHRlc3RzIGV4ZWN1dGVkLiBOb3QgYSB0ZXN0IG1ldGhvZD8iKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXcgUmVzdWx0KHRlc3RuZy5oYXNGYWlsdXJlKCksIGxpc3RlbmVyLmdldEZhaWx1cmVzKCkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIG9yZy50ZXN0bmcuVGVzdE5HIGNyZWF0ZVRlc3RORyhTdHJpbmcga2xhc3MsIFN0cmluZyBtZXRob2QsCisgICAgICAgICAgICBTaW5nbGVUZXN0TkdUZXN0UnVuTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgb3JnLnRlc3RuZy5UZXN0TkcgdGVzdG5nID0gbmV3IG9yZy50ZXN0bmcuVGVzdE5HKCk7CisgICAgICAgIHRlc3RuZy5zZXRVc2VEZWZhdWx0TGlzdGVuZXJzKGZhbHNlKTsgIC8vIERvbid0IGNyZWF0ZSB0aGUgdGVzdG5nLXNwZWNpZmljIEhUTUwvWE1MIHJlcG9ydHMuCisgICAgICAgIC8vIEl0IHN0aWxsIHByaW50cyB0aGUgWC9ZIHRlc3RzIHN1Y2NlZWRlZC9mYWlsZWQgc3VtbWFyeSB0byBzdGRvdXQuCisKKyAgICAgICAgLy8gV2UgZG9uJ3Qgc3RyaWN0bHkgbmVlZCB0aGlzIGxpc3RlbmVyIGZvciBDVFMsIGJ1dCBoYXZpbmcgaXQgcHJpbnQgU1VDQ0VTUy9GQUlMCisgICAgICAgIC8vIG1ha2VzIGl0IGVhc2llciB0byBkaWFnbm9zZSB3aGljaCBwYXJ0aWN1bGFyIGNvbWJpbmF0aW9uIG9mIGEgdGVzdCBtZXRob2QgaGFkIGZhaWxlZAorICAgICAgICAvLyBmcm9tIGxvb2tpbmcgYXQgZGV2aWNlIGxvZ2NhdC4KKyAgICAgICAgdGVzdG5nLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKKworICAgICAgICAvKiBDb25zdHJ1Y3QgdGhlIGZvbGxvd2luZyBlcXVpdmFsZW50IFhNTCBjb25maWd1cmF0aW9uOgorICAgICAgICAgKgorICAgICAgICAgKiA8IURPQ1RZUEUgc3VpdGUgU1lTVEVNICJodHRwOi8vdGVzdG5nLm9yZy90ZXN0bmctMS4wLmR0ZCIgPgorICAgICAgICAgKiA8c3VpdGU+CisgICAgICAgICAqICAgPHRlc3Q+CisgICAgICAgICAqICAgICA8Y2xhc3Nlcz4KKyAgICAgICAgICogICAgICAgPGNsYXNzIG5hbWU9IiRrbGFzcyI+CisgICAgICAgICAqICAgICAgICAgPGluY2x1ZGUgbmFtZT0iJG1ldGhvZCIgLz4KKyAgICAgICAgICogICAgICAgPC9jbGFzcz4KKyAgICAgICAgICogICAgIDwvY2xhc3Nlcz4KKyAgICAgICAgICogICA8L3Rlc3Q+CisgICAgICAgICAqIDwvc3VpdGU+CisgICAgICAgICAqCisgICAgICAgICAqIFRoaXMgd2lsbCBlbnN1cmUgdGhhdCBvbmx5IGEgc2luZ2xlIGtsYXNzL21ldGhvZCBpcyBiZWluZyBydW4gYnkgdGVzdG5nLgorICAgICAgICAgKiAoSXQgY2FuIHN0aWxsIGJlIHJ1biBtdWx0aXBsZSB0aW1lcyBkdWUgdG8gQERhdGFQcm92aWRlciwgd2l0aCBkaWZmZXJlbnQgcGFyYW1ldGVycworICAgICAgICAgKiBlYWNoIHRpbWUpCisgICAgICAgICAqLworICAgICAgICBMaXN0PFhtbFN1aXRlPiBzdWl0ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgWG1sU3VpdGUgdGhlX3N1aXRlID0gbmV3IFhtbFN1aXRlKCk7CisgICAgICAgIFhtbFRlc3QgdGhlX3Rlc3QgPSBuZXcgWG1sVGVzdCh0aGVfc3VpdGUpOworICAgICAgICBYbWxDbGFzcyB0aGVfY2xhc3MgPSBuZXcgWG1sQ2xhc3Moa2xhc3MpOworICAgICAgICBYbWxJbmNsdWRlIHRoZV9pbmNsdWRlID0gbmV3IFhtbEluY2x1ZGUobWV0aG9kKTsKKworICAgICAgICB0aGVfY2xhc3MuZ2V0SW5jbHVkZWRNZXRob2RzKCkuYWRkKHRoZV9pbmNsdWRlKTsKKyAgICAgICAgdGhlX3Rlc3QuZ2V0WG1sQ2xhc3NlcygpLmFkZCh0aGVfY2xhc3MpOworICAgICAgICBzdWl0ZXMuYWRkKHRoZV9zdWl0ZSk7CisgICAgICAgIHRlc3RuZy5zZXRYbWxTdWl0ZXMoc3VpdGVzKTsKKworICAgICAgICByZXR1cm4gdGVzdG5nOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzdWx0IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGhhc0ZhaWx1cmU7CisgICAgICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZyxUaHJvd2FibGU+IGZhaWx1cmVzOworCisKKyAgICAgICAgUmVzdWx0KGJvb2xlYW4gaGFzRmFpbHVyZSwgTWFwPFN0cmluZywgVGhyb3dhYmxlPiBmYWlsdXJlcykgeworICAgICAgICAgICAgdGhpcy5oYXNGYWlsdXJlID0gaGFzRmFpbHVyZTsKKyAgICAgICAgICAgIHRoaXMuZmFpbHVyZXMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAobmV3IExpbmtlZEhhc2hNYXA8PihmYWlsdXJlcykpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzRmFpbHVyZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBoYXNGYWlsdXJlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE1hcDxTdHJpbmcsIFRocm93YWJsZT4gZ2V0RmFpbHVyZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gZmFpbHVyZXM7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9jb3JlL3J1bm5lci1heHQvc3JjL2NvbS9hbmRyb2lkL2N0cy9jb3JlL3J1bm5lci9zdXBwb3J0L1Rlc3ROZ1J1bm5lci5qYXZhIGIvdGVzdHMvY29yZS9ydW5uZXItYXh0L3NyYy9jb20vYW5kcm9pZC9jdHMvY29yZS9ydW5uZXIvc3VwcG9ydC9UZXN0TmdSdW5uZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWJmMDM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY29yZS9ydW5uZXItYXh0L3NyYy9jb20vYW5kcm9pZC9jdHMvY29yZS9ydW5uZXIvc3VwcG9ydC9UZXN0TmdSdW5uZXIuamF2YQpAQCAtMCwwICsxLDIzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY3RzLmNvcmUucnVubmVyLnN1cHBvcnQ7CisKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5EZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bm5lcjsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLm1hbmlwdWxhdGlvbi5GaWx0ZXI7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5tYW5pcHVsYXRpb24uRmlsdGVyYWJsZTsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLm1hbmlwdWxhdGlvbi5Ob1Rlc3RzUmVtYWluRXhjZXB0aW9uOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIubm90aWZpY2F0aW9uLkZhaWx1cmU7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5ub3RpZmljYXRpb24uUnVuTm90aWZpZXI7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBBIHtAbGluayBSdW5uZXJ9IHRoYXQgY2FuIFRlc3RORyB0ZXN0cy4KKyAqCisgKiA8cD5JbXBsZW1lbnRhdGlvbiBub3RlOiBBdm9pZCBleHRlbmRpbmcgUGFyZW50UnVubmVyIHNpbmNlIHRoYXQgYWxzbyBoYXMKKyAqIGxvZ2ljIHRvIGhhbmRsZSBCZWZvcmVDbGFzcy9BZnRlckNsYXNzIGFuZCBvdGhlciBqdW5pdC1zcGVjaWZpYyBmdW5jdGlvbmFsaXR5CisgKiB0aGF0IHdvdWxkIGJlIGludmFsaWQgZm9yIFRlc3RORy48L3A+CisgKi8KK2NsYXNzIFRlc3ROZ1J1bm5lciBleHRlbmRzIFJ1bm5lciBpbXBsZW1lbnRzIEZpbHRlcmFibGUgeworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKKworICBwcml2YXRlIERlc2NyaXB0aW9uIG1EZXNjcmlwdGlvbjsKKyAgLyoqIENsYXNzIG5hbWUgZm9yIGRlYnVnZ2luZy4gKi8KKyAgcHJpdmF0ZSBTdHJpbmcgbUNsYXNzTmFtZTsKKyAgLyoqIERvbid0IGluY2x1ZGUgdGhlIHNhbWUgbWV0aG9kIG5hbWVzIHR3aWNlLiAqLworICBwcml2YXRlIEhhc2hTZXQ8U3RyaW5nPiBtTWV0aG9kU2V0ID0gbmV3IEhhc2hTZXQ8PigpOworCisgIC8qKgorICAgKiBAcGFyYW0gdGVzdENsYXNzIHRoZSB0ZXN0IGNsYXNzIHRvIHJ1bgorICAgKi8KKyAgVGVzdE5nUnVubmVyKENsYXNzPD8+IHRlc3RDbGFzcykgeworICAgIG1EZXNjcmlwdGlvbiA9IGdlbmVyYXRlVGVzdE5nRGVzY3JpcHRpb24odGVzdENsYXNzKTsKKyAgICBtQ2xhc3NOYW1lID0gdGVzdENsYXNzLmdldE5hbWUoKTsKKyAgfQorCisgIC8vIFJ1bm5lciBpbXBsZW1lbnRhdGlvbgorICBAT3ZlcnJpZGUKKyAgcHVibGljIERlc2NyaXB0aW9uIGdldERlc2NyaXB0aW9uKCkgeworICAgIHJldHVybiBtRGVzY3JpcHRpb247CisgIH0KKworICAvLyBSdW5uZXIgaW1wbGVtZW50YXRpb24KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgdGVzdENvdW50KCkgeworICAgIGlmICghZGVzY3JpcHRpb25IYXNDaGlsZHJlbihnZXREZXNjcmlwdGlvbigpKSkgeyAgLy8gQXZvaWQgTlBFIHdoZW4gZGVzY3JpcHRpb24gaXMgbnVsbC4KKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vIFdlIGFsd2F5cyBmb2xsb3cgYSBmbGF0IFBhcmVudC0+TGVhZiBoaWVyYXJjaHksIHNvIG5vIHJlY3Vyc2lvbiBuZWNlc3NhcnkuCisgICAgcmV0dXJuIGdldERlc2NyaXB0aW9uKCkudGVzdENvdW50KCk7CisgIH0KKworICAvLyBGaWx0ZXJhYmxlIGltcGxlbWVudGF0aW9uCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBmaWx0ZXIoRmlsdGVyIGZpbHRlcikgdGhyb3dzIE5vVGVzdHNSZW1haW5FeGNlcHRpb24geworICAgIG1EZXNjcmlwdGlvbiA9IGZpbHRlckRlc2NyaXB0aW9uKG1EZXNjcmlwdGlvbiwgZmlsdGVyKTsKKworICAgIGlmICghZGVzY3JpcHRpb25IYXNDaGlsZHJlbihnZXREZXNjcmlwdGlvbigpKSkgeyAgLy8gQXZvaWQgTlBFIHdoZW4gZGVzY3JpcHRpb24gaXMgbnVsbC4KKyAgICAgIGlmIChERUJVRykgeworICAgICAgICBMb2cuZCgiVGVzdE5nUnVubmVyIiwKKyAgICAgICAgICAgICJGaWx0ZXJpbmcgaGFzIHJlbW92ZWQgYWxsIHRlc3RzIDooIGZvciBjbGFzcyAiICsgbUNsYXNzTmFtZSk7CisgICAgICB9CisgICAgICB0aHJvdyBuZXcgTm9UZXN0c1JlbWFpbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIGlmIChERUJVRykgeworICAgICAgTG9nLmQoIlRlc3ROZ1J1bm5lciIsCisgICAgICAgICAgIkZpbHRlcmluZyBoYXMgcmV0YWluZWQgIiArIHRlc3RDb3VudCgpICsgIiB0ZXN0cyBmb3IgY2xhc3MgIiArIG1DbGFzc05hbWUpOworICAgIH0KKyAgfQorCisgIC8vIEZpbHRlcmFibGUgaW1wbGVtZW50YXRpb24KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJ1bihSdW5Ob3RpZmllciBub3RpZmllcikgeworICAgIGlmICghZGVzY3JpcHRpb25IYXNDaGlsZHJlbihnZXREZXNjcmlwdGlvbigpKSkgeyAgLy8gQXZvaWQgTlBFIHdoZW4gZGVzY3JpcHRpb24gaXMgbnVsbC4KKyAgICAgIC8vIE5vdGhpbmcgdG8gZG8uCisgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yIChEZXNjcmlwdGlvbiBjaGlsZCA6IGdldERlc2NyaXB0aW9uKCkuZ2V0Q2hpbGRyZW4oKSkgeworICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGNoaWxkLmdldENsYXNzTmFtZSgpOworICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSBjaGlsZC5nZXRNZXRob2ROYW1lKCk7CisKKyAgICAgIENsYXNzPD8+IGtsYXNzOworICAgICAgdHJ5IHsKKyAgICAgICAga2xhc3MgPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSwgZmFsc2UsIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOworICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihlKTsKKyAgICAgIH0KKworICAgICAgbm90aWZpZXIuZmlyZVRlc3RTdGFydGVkKGNoaWxkKTsKKworICAgICAgLy8gQXZvaWQgbG9va2luZyBhdCBhbGwgdGhlIG1ldGhvZHMgYnkganVzdCB1c2luZyB0aGUgc3RyaW5nIG1ldGhvZCBuYW1lLgorICAgICAgU2luZ2xlVGVzdE5nVGVzdEV4ZWN1dG9yLlJlc3VsdCByZXN1bHQgPSBTaW5nbGVUZXN0TmdUZXN0RXhlY3V0b3IuZXhlY3V0ZShrbGFzcywgbWV0aG9kTmFtZSk7CisgICAgICBpZiAocmVzdWx0Lmhhc0ZhaWx1cmUoKSkgeworICAgICAgICAvLyBUT0RPOiBnZXQgdGhlIGVycm9yIG1lc3NhZ2VzIGZyb20gdGVzdG5nIHNvbWVob3cuCisgICAgICAgIG5vdGlmaWVyLmZpcmVUZXN0RmFpbHVyZShuZXcgRmFpbHVyZShjaGlsZCwgZXh0cmFjdEV4Y2VwdGlvbihyZXN1bHQuZ2V0RmFpbHVyZXMoKSkpKTsKKyAgICAgIH0KKworICAgICAgbm90aWZpZXIuZmlyZVRlc3RGaW5pc2hlZChjaGlsZCk7CisgICAgICAvLyBUT0RPOiBDaGVjayBAVGVzdChlbmFibGVkPWZhbHNlKSBhbmQgaW52b2tlICNmaXJlVGVzdElnbm9yZWQgaW5zdGVhZC4KKyAgICB9CisgIH0KKworICBwcml2YXRlIFRocm93YWJsZSBleHRyYWN0RXhjZXB0aW9uKE1hcDxTdHJpbmcsIFRocm93YWJsZT4gZmFpbHVyZXMpIHsKKyAgICBpZiAoZmFpbHVyZXMuaXNFbXB0eSgpKSB7CisgICAgICByZXR1cm4gbmV3IEFzc2VydGlvbkVycm9yKCk7CisgICAgfQorICAgIGlmIChmYWlsdXJlcy5zaXplKCkgPT0gMSkgeworICAgICAgcmV0dXJuIGZhaWx1cmVzLnZhbHVlcygpLml0ZXJhdG9yKCkubmV4dCgpOworICAgIH0KKworICAgIFN0cmluZ0J1aWxkZXIgZXJyb3JNZXNzYWdlID0gbmV3IFN0cmluZ0J1aWxkZXIoIj09PT09PT09PT0gTXVsdGlwbGUgRmFpbHVyZXMgPT09PT09PT09PSIpOworICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgVGhyb3dhYmxlPiBmYWlsdXJlRW50cnkgOiBmYWlsdXJlcy5lbnRyeVNldCgpKSB7CisgICAgICBlcnJvck1lc3NhZ2UuYXBwZW5kKCJcblxuPT09ICIpLiBhcHBlbmQoZmFpbHVyZUVudHJ5LmdldEtleSgpKS5hcHBlbmQoIiA9PT1cbiIpOworICAgICAgVGhyb3dhYmxlIHRocm93YWJsZSA9IGZhaWx1cmVFbnRyeS5nZXRWYWx1ZSgpOworICAgICAgZXJyb3JNZXNzYWdlCisgICAgICAgICAgICAgIC5hcHBlbmQodGhyb3dhYmxlLmdldENsYXNzKCkpLmFwcGVuZCgiOiAiKQorICAgICAgICAgICAgICAuYXBwZW5kKHRocm93YWJsZS5nZXRNZXNzYWdlKCkpOworICAgICAgZm9yIChTdGFja1RyYWNlRWxlbWVudCBlIDogdGhyb3dhYmxlLmdldFN0YWNrVHJhY2UoKSkgeworICAgICAgICBpZiAoZS5nZXRDbGFzc05hbWUoKS5lcXVhbHMoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZXJyb3JNZXNzYWdlLmFwcGVuZCgiXG4gIGF0ICIpLmFwcGVuZChlKTsKKyAgICAgIH0KKyAgICB9CisgICAgZXJyb3JNZXNzYWdlLmFwcGVuZCgiXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuIik7CisgICAgcmV0dXJuIG5ldyBBc3NlcnRpb25FcnJvcihlcnJvck1lc3NhZ2UudG9TdHJpbmcoKSk7CisgIH0KKworCisgIC8qKgorICAgKiBSZWN1cnNpdmVseSAocHJlb3JkZXIgdHJhdmVyc2FsKSBhcHBseSB0aGUgZmlsdGVyIHRvIGFsbCB0aGUgZGVzY3JpcHRpb25zLgorICAgKgorICAgKiBAcmV0dXJuIG51bGwgaWYgdGhlIGZpbHRlciByZWplY3RzIHRoZSB3aG9sZSB0cmVlLgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgRGVzY3JpcHRpb24gZmlsdGVyRGVzY3JpcHRpb24oRGVzY3JpcHRpb24gZGVzYywgRmlsdGVyIGZpbHRlcikgeworICAgIGlmICghZmlsdGVyLnNob3VsZFJ1bihkZXNjKSkgeyAgLy8gWFg6IERvZXMgdGhlIGZpbHRlciBpdHNlbGYgZG8gdGhlIHJlY3Vyc2lvbj8KKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIERlc2NyaXB0aW9uIG5ld0Rlc2MgPSBkZXNjLmNoaWxkbGVzc0NvcHkoKTsKKworICAgIC8vIFJldHVybiBsZWFmcy4KKyAgICBpZiAoIWRlc2NyaXB0aW9uSGFzQ2hpbGRyZW4oZGVzYykpIHsKKyAgICAgIHJldHVybiBuZXdEZXNjOworICAgIH0KKworICAgIC8vIEZpbHRlciBhbGwgc3VidHJlZXMsIG9ubHkgY29weWluZyB0aGVtIGlmIHRoZSBmaWx0ZXIgYWNjZXB0cyB0aGVtLgorICAgIGZvciAoRGVzY3JpcHRpb24gY2hpbGQgOiBkZXNjLmdldENoaWxkcmVuKCkpIHsKKyAgICAgIERlc2NyaXB0aW9uIGZpbHRlcmVkQ2hpbGQgPSBmaWx0ZXJEZXNjcmlwdGlvbihjaGlsZCwgZmlsdGVyKTsKKworICAgICAgaWYgKGZpbHRlcmVkQ2hpbGQgIT0gbnVsbCkgeworICAgICAgICBuZXdEZXNjLmFkZENoaWxkKGZpbHRlcmVkQ2hpbGQpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBuZXdEZXNjOworICB9CisKKyAgcHJpdmF0ZSBEZXNjcmlwdGlvbiBnZW5lcmF0ZVRlc3ROZ0Rlc2NyaXB0aW9uKENsYXNzPD8+IGNscykgeworICAgIC8vIEFkZCB0aGUgb3ZlcmFsbCBjbGFzcyBkZXNjcmlwdGlvbiBhcyB0aGUgcGFyZW50LgorICAgIERlc2NyaXB0aW9uIHBhcmVudCA9IERlc2NyaXB0aW9uLmNyZWF0ZVN1aXRlRGVzY3JpcHRpb24oY2xzKTsKKworICAgIGlmIChERUJVRykgeworICAgICAgTG9nLmQoIlRlc3ROZ1J1bm5lciIsICJHZW5lcmF0aW5nIFRlc3ROZyBEZXNjcmlwdGlvbiBmb3IgY2xhc3MgIiArIGNscy5nZXROYW1lKCkpOworICAgIH0KKworICAgIC8vIEFkZCBlYWNoIHRlc3QgbWV0aG9kIGFzIGEgY2hpbGQuCisgICAgZm9yIChNZXRob2QgbSA6IGNscy5nZXREZWNsYXJlZE1ldGhvZHMoKSkgeworCisgICAgICAvLyBGaWx0ZXIgdG8gb25seSAncHVibGljIHZvaWQnIHNpZ25hdHVyZXMuCisgICAgICBpZiAoKG0uZ2V0TW9kaWZpZXJzKCkgJiBNb2RpZmllci5QVUJMSUMpID09IDApIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGlmICghbS5nZXRSZXR1cm5UeXBlKCkuZXF1YWxzKFZvaWQuVFlQRSkpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8vIE5vdGUgdGhhdCBUZXN0TkcgbWV0aG9kcyBtYXkgYWN0dWFsbHkgaGF2ZSBwYXJhbWV0ZXJzCisgICAgICAvLyAoZS5nLiB3aXRoIEBEYXRhUHJvdmlkZXIpIHdoaWNoIFRlc3RORyB3aWxsIHBvcHVsYXRlIGl0c2VsZi4KKworICAgICAgLy8gQWRkIFtDbGFzcywgTWV0aG9kTmFtZV0gYXMgYSBEZXNjcmlwdGlvbiBsZWFmIG5vZGUuCisgICAgICBTdHJpbmcgbmFtZSA9IG0uZ2V0TmFtZSgpOworCisgICAgICBpZiAoIW1NZXRob2RTZXQuYWRkKG5hbWUpKSB7CisgICAgICAgIC8vIE92ZXJsb2FkZWQgbWV0aG9kcyBoYXZlIHRoZSBzYW1lIG5hbWUsIGRvbid0IGFkZCB0aGVtIHR3aWNlLgorICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICBMb2cuZCgiVGVzdE5nUnVubmVyIiwgIkFscmVhZHkgYWRkZWQgY2hpbGQgIiArIGNscy5nZXROYW1lKCkgKyAiIyIgKyBuYW1lKTsKKyAgICAgICAgfQorICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgRGVzY3JpcHRpb24gY2hpbGQgPSBEZXNjcmlwdGlvbi5jcmVhdGVUZXN0RGVzY3JpcHRpb24oY2xzLCBuYW1lKTsKKworICAgICAgcGFyZW50LmFkZENoaWxkKGNoaWxkKTsKKworICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgIExvZy5kKCJUZXN0TmdSdW5uZXIiLCAiQWRkIGNoaWxkICIgKyBjbHMuZ2V0TmFtZSgpICsgIiMiICsgbmFtZSk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHBhcmVudDsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGVzY3JpcHRpb25IYXNDaGlsZHJlbihEZXNjcmlwdGlvbiBkZXNjKSB7CisgICAgLy8gTm90ZTogQWx0aG91Z2ggImRlc2MuaXNUZXN0KCkiIGlzIGVxdWl2YWxlbnQgdG8gIiFkZXNjLmdldENoaWxkcmVuKCkuaXNFbXB0eSgpIgorICAgIC8vIHdlIGFkZCB0aGUgcHJlLXJlcXVpc2l0ZSAyIGV4dHJhIG51bGwgY2hlY2tzIHRvIGF2b2lkIHRocm93aW5nIE5QRXMuCisgICAgcmV0dXJuIGRlc2MgIT0gbnVsbCAmJiBkZXNjLmdldENoaWxkcmVuKCkgIT0gbnVsbCAmJiAhZGVzYy5nZXRDaGlsZHJlbigpLmlzRW1wdHkoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvY29yZS9ydW5uZXItYXh0L3NyYy9jb20vYW5kcm9pZC9jdHMvY29yZS9ydW5uZXIvc3VwcG9ydC9UZXN0TmdSdW5uZXJCdWlsZGVyLmphdmEgYi90ZXN0cy9jb3JlL3J1bm5lci1heHQvc3JjL2NvbS9hbmRyb2lkL2N0cy9jb3JlL3J1bm5lci9zdXBwb3J0L1Rlc3ROZ1J1bm5lckJ1aWxkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjA4NGIzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY29yZS9ydW5uZXItYXh0L3NyYy9jb20vYW5kcm9pZC9jdHMvY29yZS9ydW5uZXIvc3VwcG9ydC9UZXN0TmdSdW5uZXJCdWlsZGVyLmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY3RzLmNvcmUucnVubmVyLnN1cHBvcnQ7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bm5lcjsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5tb2RlbC5SdW5uZXJCdWlsZGVyOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCisvKioKKyAqIEEge0BsaW5rIFJ1bm5lckJ1aWxkZXJ9IHRoYXQgY2FuIGhhbmRsZSBUZXN0TkcgdGVzdHMuCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0TmdSdW5uZXJCdWlsZGVyIGV4dGVuZHMgUnVubmVyQnVpbGRlciB7CisgIC8vIFJldHVybnMgYSBUZXN0TkcgcnVubmVyIGZvciB0aGlzIGNsYXNzLCBvbmx5IGlmIGl0IGlzIGEgY2xhc3MKKyAgLy8gYW5ub3RhdGVkIHdpdGggdGVzdG5nJ3MgQFRlc3Qgb3IgaGFzIGFueSBtZXRob2RzIHdpdGggQFRlc3QgaW4gaXQuCisgIEBPdmVycmlkZQorICBwdWJsaWMgUnVubmVyIHJ1bm5lckZvckNsYXNzKENsYXNzPD8+IHRlc3RDbGFzcykgeworICAgIGlmIChpc1Rlc3ROZ1Rlc3RDbGFzcyh0ZXN0Q2xhc3MpKSB7CisgICAgICByZXR1cm4gbmV3IFRlc3ROZ1J1bm5lcih0ZXN0Q2xhc3MpOworICAgIH0KKworICAgIHJldHVybiBudWxsOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1Rlc3ROZ1Rlc3RDbGFzcyhDbGFzczw/PiBjbHMpIHsKKyAgICAvLyBUZXN0TkcgdGVzdCBpcyBlaXRoZXIgbWFya2VkIEBUZXN0IGF0IHRoZSBjbGFzcworICAgIGlmIChjbHMuZ2V0QW5ub3RhdGlvbihUZXN0LmNsYXNzKSAhPSBudWxsKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBPciBJdCdzIG1hcmtlZCBAVGVzdCBhdCB0aGUgbWV0aG9kIGxldmVsCisgICAgZm9yIChNZXRob2QgbSA6IGNscy5nZXREZWNsYXJlZE1ldGhvZHMoKSkgeworICAgICAgaWYgKG0uZ2V0QW5ub3RhdGlvbihUZXN0LmNsYXNzKSAhPSBudWxsKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvY29yZS9ydW5uZXItYXh0L3NyYy9jb20vYW5kcm9pZC9jdHMvcnVubmVyL0NyYXNoUGFyc2VyUnVuTGlzdGVuZXIuamF2YSBiL3Rlc3RzL2NvcmUvcnVubmVyLWF4dC9zcmMvY29tL2FuZHJvaWQvY3RzL3J1bm5lci9DcmFzaFBhcnNlclJ1bkxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgzOGZiNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NvcmUvcnVubmVyLWF4dC9zcmMvY29tL2FuZHJvaWQvY3RzL3J1bm5lci9DcmFzaFBhcnNlclJ1bkxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY3RzLnJ1bm5lcjsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuaW50ZXJuYWwucnVubmVyLmxpc3RlbmVyLkluc3RydW1lbnRhdGlvblJ1bkxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5EZXNjcmlwdGlvbjsKKworLyoqCisgKiBBIHtAbGluayBSdW5MaXN0ZW5lcn0gZm9yIENyYXNoUGFyc2VyLiBEdW1wcyB0aGUgdGVzdCBuYW1lIHRvIGxvZ3Mgd2hlbgorICogdGVzdHMgc3RhcnQuCisgKi8KK3B1YmxpYyBjbGFzcyBDcmFzaFBhcnNlclJ1bkxpc3RlbmVyIGV4dGVuZHMgSW5zdHJ1bWVudGF0aW9uUnVuTGlzdGVuZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJDcmFzaFBhcnNlclJ1bkxpc3RlbmVyIjsKKworICAgIC8vIENvbnN0YW50IG11c3QgYmUga2VwdCBpbiBzeW5jIHdpdGggQ3Jhc2hVdGlscy5qYXZhCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1RFU1RfQUxFUlQgPSAiTmV3IHRlc3Qgc3RhcnRpbmcgd2l0aCBuYW1lOiAiOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdFN0YXJ0ZWQoRGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBMb2cuaShUQUcsIE5FV19URVNUX0FMRVJUICsgZGVzY3JpcHRpb24udG9TdHJpbmcoKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9jb3JlL3J1bm5lci1heHQvc3JjL2NvbS9hbmRyb2lkL2N0cy9ydW5uZXIvQ3RzVGVzdFJ1bkxpc3RlbmVyLmphdmEgYi90ZXN0cy9jb3JlL3J1bm5lci1heHQvc3JjL2NvbS9hbmRyb2lkL2N0cy9ydW5uZXIvQ3RzVGVzdFJ1bkxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJkYTVhNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NvcmUvcnVubmVyLWF4dC9zcmMvY29tL2FuZHJvaWQvY3RzL3J1bm5lci9DdHNUZXN0UnVuTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDI2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY3RzLnJ1bm5lcjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb247CitpbXBvcnQgYW5kcm9pZC5hcHAuS2V5Z3VhcmRNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmludGVybmFsLnJ1bm5lci5saXN0ZW5lci5JbnN0cnVtZW50YXRpb25SdW5MaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLkRlc2NyaXB0aW9uOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIubm90aWZpY2F0aW9uLlJ1bkxpc3RlbmVyOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEubGFuZy5DbGFzczsKK2ltcG9ydCBqYXZhLmxhbmcuUmVmbGVjdGl2ZU9wZXJhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKK2ltcG9ydCBqYXZhLm5ldC5BdXRoZW50aWNhdG9yOworaW1wb3J0IGphdmEubmV0LkNvb2tpZUhhbmRsZXI7CitpbXBvcnQgamF2YS5uZXQuUmVzcG9uc2VDYWNoZTsKK2ltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKKworaW1wb3J0IGphdmF4Lm5ldC5zc2wuSG9zdG5hbWVWZXJpZmllcjsKK2ltcG9ydCBqYXZheC5uZXQuc3NsLkh0dHBzVVJMQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZheC5uZXQuc3NsLlNTTFNvY2tldEZhY3Rvcnk7CisKKy8qKgorICogQSB7QGxpbmsgUnVuTGlzdGVuZXJ9IGZvciBDVFMuIFNldHMgdGhlIHN5c3RlbSBwcm9wZXJ0aWVzIG5lY2Vzc2FyeSBmb3IgbWFueQorICogY29yZSB0ZXN0cyB0byBydW4uIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgdGhlcmUgYXJlIHNvbWUgY29yZSB0ZXN0cyB0aGF0IG5lZWQKKyAqIHdyaXRpbmcgYWNjZXNzIHRvIHRoZSBmaWxlIHN5c3RlbS4KKyAqIEZpbmFsbHksIHdlIGFkZCBhIG1lYW5zIHRvIGZyZWUgbWVtb3J5IGFsbG9jYXRlZCBieSBhIFRlc3RDYXNlIGFmdGVyIGl0cworICogZXhlY3V0aW9uLgorICovCitwdWJsaWMgY2xhc3MgQ3RzVGVzdFJ1bkxpc3RlbmVyIGV4dGVuZHMgSW5zdHJ1bWVudGF0aW9uUnVuTGlzdGVuZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJDdHNUZXN0UnVuTGlzdGVuZXIiOworCisgICAgcHJpdmF0ZSBUZXN0RW52aXJvbm1lbnQgbUVudmlyb25tZW50OworICAgIHByaXZhdGUgQ2xhc3M8Pz4gbGFzdENsYXNzOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdFJ1blN0YXJ0ZWQoRGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtRW52aXJvbm1lbnQgPSBuZXcgVGVzdEVudmlyb25tZW50KGdldEluc3RydW1lbnRhdGlvbigpLmdldFRhcmdldENvbnRleHQoKSk7CisKKyAgICAgICAgLy8gV2UgbWlnaHQgd2FudCB0byBtb3ZlIHRoaXMgdG8gL3NkY2FyZCwgaWYgaXMgaXMgbW91bnRlZC93cml0YWJsZS4KKyAgICAgICAgRmlsZSBjYWNoZURpciA9IGdldEluc3RydW1lbnRhdGlvbigpLmdldFRhcmdldENvbnRleHQoKS5nZXRDYWNoZURpcigpOworICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIiwgY2FjaGVEaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisgICAgICAgIC8vIGF0dGVtcHQgdG8gZGlzYWJsZSBrZXlndWFyZCwgaWYgY3VycmVudCB0ZXN0IGhhcyBwZXJtaXNzaW9uIHRvIGRvIHNvCisgICAgICAgIC8vIFRPRE86IG1vdmUgdGhpcyB0byBhIGJldHRlciBwbGFjZSwgc3VjaCBhcyBJbnN0cnVtZW50YXRpb25UZXN0UnVubmVyCisgICAgICAgIC8vID8KKyAgICAgICAgaWYgKGdldEluc3RydW1lbnRhdGlvbigpLmdldENvbnRleHQoKS5jaGVja0NhbGxpbmdPclNlbGZQZXJtaXNzaW9uKAorICAgICAgICAgICAgICAgIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5ESVNBQkxFX0tFWUdVQVJEKQorICAgICAgICAgICAgICAgID09IFBhY2thZ2VNYW5hZ2VyLlBFUk1JU1NJT05fR1JBTlRFRCkgeworICAgICAgICAgICAgTG9nLmkoVEFHLCAiRGlzYWJsaW5nIGtleWd1YXJkIik7CisgICAgICAgICAgICBLZXlndWFyZE1hbmFnZXIga2V5Z3VhcmRNYW5hZ2VyID0KKyAgICAgICAgICAgICAgICAgICAgKEtleWd1YXJkTWFuYWdlcikgZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dC5LRVlHVUFSRF9TRVJWSUNFKTsKKyAgICAgICAgICAgIGtleWd1YXJkTWFuYWdlci5uZXdLZXlndWFyZExvY2soImN0cyIpLmRpc2FibGVLZXlndWFyZCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTG9nLmkoVEFHLCAiVGVzdCBsYWNrcyBwZXJtaXNzaW9uIHRvIGRpc2FibGUga2V5Z3VhcmQuICIgKworICAgICAgICAgICAgICAgICAgICAiVUkgYmFzZWQgdGVzdHMgbWF5IGZhaWwgaWYga2V5Z3VhcmQgaXMgdXAiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFydGVkKERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGRlc2NyaXB0aW9uLmdldFRlc3RDbGFzcygpICE9IGxhc3RDbGFzcykgeworICAgICAgICAgICAgbGFzdENsYXNzID0gZGVzY3JpcHRpb24uZ2V0VGVzdENsYXNzKCk7CisgICAgICAgICAgICBwcmludE1lbW9yeShkZXNjcmlwdGlvbi5nZXRUZXN0Q2xhc3MoKSk7CisgICAgICAgIH0KKworICAgICAgICBtRW52aXJvbm1lbnQucmVzZXQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmluaXNoZWQoRGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHsKKyAgICAgICAgLy8gbm8gd2F5IHRvIGltcGxlbWVudCB0aGlzIGluIEpVbml0NC4uLgorICAgICAgICAvLyBvZmZlbmRpbmcgdGVzdCBjYXNlcyB0aGF0IG5lZWQgdGhpcyBsb2dpYyBzaG91bGQgcHJvYmFibHkgYmUgY2xlYW5lZAorICAgICAgICAvLyB1cCBpbmRpdmlkdWFsbHkKKyAgICAgICAgLy8gaWYgKHRlc3QgaW5zdGFuY2VvZiBUZXN0Q2FzZSkgeworICAgICAgICAvLyBjbGVhbnVwKChUZXN0Q2FzZSkgdGVzdCk7CisgICAgICAgIC8vIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEdW1wcyBzb21lIG1lbW9yeSBpbmZvLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwcmludE1lbW9yeShDbGFzczw/PiB0ZXN0Q2xhc3MpIHsKKyAgICAgICAgUnVudGltZSBydW50aW1lID0gUnVudGltZS5nZXRSdW50aW1lKCk7CisKKyAgICAgICAgbG9uZyB0b3RhbCA9IHJ1bnRpbWUudG90YWxNZW1vcnkoKTsKKyAgICAgICAgbG9uZyBmcmVlID0gcnVudGltZS5mcmVlTWVtb3J5KCk7CisgICAgICAgIGxvbmcgdXNlZCA9IHRvdGFsIC0gZnJlZTsKKworICAgICAgICBMb2cuZChUQUcsICJUb3RhbCBtZW1vcnkgIDogIiArIHRvdGFsKTsKKyAgICAgICAgTG9nLmQoVEFHLCAiVXNlZCBtZW1vcnkgICA6ICIgKyB1c2VkKTsKKyAgICAgICAgTG9nLmQoVEFHLCAiRnJlZSBtZW1vcnkgICA6ICIgKyBmcmVlKTsKKworICAgICAgICBTdHJpbmcgdGVtcGRpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiLCAiIik7CisgICAgICAgIC8vIFRPRE86IFJlbW92ZSB0aGVzZSBleHRyYSBMb2dzIGFkZGVkIHRvIGRlYnVnIGEgc3BlY2lmaWMgdGltZW91dCBwcm9ibGVtLgorICAgICAgICBMb2cuZChUQUcsICJqYXZhLmlvLnRtcGRpciBpczoiICsgdGVtcGRpcik7CisKKyAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh0ZW1wZGlyKSkgeworICAgICAgICAgICAgU3RyaW5nW10gY29tbWFuZHMgPSB7ImRmIiwgdGVtcGRpcn07CisgICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBpbiA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkFib3V0IHRvIC5leGVjIGRmIik7CisgICAgICAgICAgICAgICAgUHJvY2VzcyBwcm9jID0gcnVudGltZS5leGVjKGNvbW1hbmRzKTsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICIuZXhlYyByZXR1cm5lZCIpOworICAgICAgICAgICAgICAgIGluID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihwcm9jLmdldElucHV0U3RyZWFtKCkpKTsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJTdHJlYW0gcmVhZGVyIGNyZWF0ZWQiKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbGluZTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKGxpbmUgPSBpbi5yZWFkTGluZSgpKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgbGluZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkV4Y2VwdGlvbjogIiArIGUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgLy8gV2VsbCwgd2UgdHJpZWQKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiSW4gZmluYWxseSIpOworICAgICAgICAgICAgICAgIGlmIChpbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBNZWgKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIExvZy5kKFRBRywgIk5vdyBleGVjdXRpbmcgOiAiICsgdGVzdENsYXNzLmdldE5hbWUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTnVsbHMgYWxsIG5vbi1zdGF0aWMgcmVmZXJlbmNlIGZpZWxkcyBpbiB0aGUgZ2l2ZW4gdGVzdCBjbGFzcy4gVGhpcworICAgICAqIG1ldGhvZCBoZWxwcyB1cyB3aXRoIHRob3NlIHRlc3QgY2xhc3NlcyB0aGF0IGRvbid0IGhhdmUgYW4gZXhwbGljaXQKKyAgICAgKiB0ZWFyRG93bigpIG1ldGhvZC4gTm9ybWFsbHkgdGhlIGdhcmJhZ2UgY29sbGVjdG9yIHNob3VsZCB0YWtlIGNhcmUgb2YKKyAgICAgKiBldmVyeXRoaW5nLCBidXQgc2luY2UgSlVuaXQga2VlcHMgcmVmZXJlbmNlcyB0byBhbGwgdGVzdCBjYXNlcywgYSBsaXR0bGUKKyAgICAgKiBoZWxwIG1pZ2h0IGJlIGEgZ29vZCBpZGVhLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjbGVhbnVwKFRlc3RDYXNlIHRlc3QpIHsKKyAgICAgICAgQ2xhc3M8Pz4gY2xhenogPSB0ZXN0LmdldENsYXNzKCk7CisKKyAgICAgICAgd2hpbGUgKGNsYXp6ICE9IFRlc3RDYXNlLmNsYXNzKSB7CisgICAgICAgICAgICBGaWVsZFtdIGZpZWxkcyA9IGNsYXp6LmdldERlY2xhcmVkRmllbGRzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIEZpZWxkIGYgPSBmaWVsZHNbaV07CisgICAgICAgICAgICAgICAgaWYgKCFmLmdldFR5cGUoKS5pc1ByaW1pdGl2ZSgpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAhTW9kaWZpZXIuaXNTdGF0aWMoZi5nZXRNb2RpZmllcnMoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYuc2V0QWNjZXNzaWJsZSh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYuc2V0KHRlc3QsIG51bGwpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90aGluZyB3ZSBjYW4gZG8gYWJvdXQgaXQuCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsYXp6ID0gY2xhenouZ2V0U3VwZXJjbGFzcygpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3ZvZ2FyL3NvdXJjZS9icm93c2UvdHJ1bmsvc3JjL3ZvZ2FyL3RhcmdldC9UZXN0RW52aXJvbm1lbnQuamF2YQorICAgIHN0YXRpYyBjbGFzcyBUZXN0RW52aXJvbm1lbnQgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWVsZCBzRGF0ZUZvcm1hdElzMjRIb3VyRmllbGQ7CisgICAgICAgIHN0YXRpYyB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIENsYXNzPD8+IGRhdGVGb3JtYXRDbGFzcyA9IENsYXNzLmZvck5hbWUoImphdmEudGV4dC5EYXRlRm9ybWF0Iik7CisgICAgICAgICAgICAgICAgc0RhdGVGb3JtYXRJczI0SG91ckZpZWxkID0gZGF0ZUZvcm1hdENsYXNzLmdldERlY2xhcmVkRmllbGQoImlzMjRIb3VyIik7CisgICAgICAgICAgICB9IGNhdGNoIChSZWZsZWN0aXZlT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIk1pc3NpbmcgRGF0ZUZvcm1hdC5pczI0SG91ciIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBMb2NhbGUgbURlZmF1bHRMb2NhbGU7CisgICAgICAgIHByaXZhdGUgZmluYWwgVGltZVpvbmUgbURlZmF1bHRUaW1lWm9uZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBIb3N0bmFtZVZlcmlmaWVyIG1Ib3N0bmFtZVZlcmlmaWVyOworICAgICAgICBwcml2YXRlIGZpbmFsIFNTTFNvY2tldEZhY3RvcnkgbVNzbFNvY2tldEZhY3Rvcnk7CisgICAgICAgIHByaXZhdGUgZmluYWwgUHJvcGVydGllcyBtUHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIHByaXZhdGUgZmluYWwgQm9vbGVhbiBtRGVmYXVsdElzMjRIb3VyOworCisgICAgICAgIFRlc3RFbnZpcm9ubWVudChDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIG1EZWZhdWx0TG9jYWxlID0gTG9jYWxlLmdldERlZmF1bHQoKTsKKyAgICAgICAgICAgIG1EZWZhdWx0VGltZVpvbmUgPSBUaW1lWm9uZS5nZXREZWZhdWx0KCk7CisgICAgICAgICAgICBtSG9zdG5hbWVWZXJpZmllciA9IEh0dHBzVVJMQ29ubmVjdGlvbi5nZXREZWZhdWx0SG9zdG5hbWVWZXJpZmllcigpOworICAgICAgICAgICAgbVNzbFNvY2tldEZhY3RvcnkgPSBIdHRwc1VSTENvbm5lY3Rpb24uZ2V0RGVmYXVsdFNTTFNvY2tldEZhY3RvcnkoKTsKKworICAgICAgICAgICAgbVByb3BlcnRpZXMuc2V0UHJvcGVydHkoInVzZXIuaG9tZSIsICIiKTsKKyAgICAgICAgICAgIG1Qcm9wZXJ0aWVzLnNldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIsIGNvbnRleHQuZ2V0Q2FjaGVEaXIoKS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICAvLyBUaGUgQ0REIG1hbmRhdGVzIHRoYXQgZGV2aWNlcyB0aGF0IHN1cHBvcnQgV2lGaSBhcmUgdGhlIG9ubHkgb25lcyB0aGF0IHdpbGwgaGF2ZQorICAgICAgICAgICAgLy8gbXVsdGljYXN0LgorICAgICAgICAgICAgUGFja2FnZU1hbmFnZXIgcG0gPSBjb250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgICAgICBtUHJvcGVydGllcy5zZXRQcm9wZXJ0eSgiYW5kcm9pZC5jdHMuZGV2aWNlLm11bHRpY2FzdCIsCisgICAgICAgICAgICAgICAgICAgIEJvb2xlYW4udG9TdHJpbmcocG0uaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX1dJRkkpKSk7CisgICAgICAgICAgICBtRGVmYXVsdElzMjRIb3VyID0gZ2V0RGF0ZUZvcm1hdElzMjRIb3VyKCk7CisKKyAgICAgICAgICAgIC8vIFRoZXJlIGFyZSB0ZXN0cyBpbiBsaWJjb3JlIHRoYXQgc2hvdWxkIGJlIGRpc2FibGVkIGZvciBsb3cgcmFtIGRldmljZXMuIFRoZXkgY2FuJ3QKKyAgICAgICAgICAgIC8vIGFjY2VzcyBBY3Rpdml0eU1hbmFnZXIgdG8gY2FsbCBpc0xvd1JhbURldmljZSwgYnV0IGNhbiByZWFkIHN5c3RlbSBwcm9wZXJ0aWVzLgorICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyIGFjdGl2aXR5TWFuYWdlciA9CisgICAgICAgICAgICAgICAgICAgIChBY3Rpdml0eU1hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkFDVElWSVRZX1NFUlZJQ0UpOworICAgICAgICAgICAgbVByb3BlcnRpZXMuc2V0UHJvcGVydHkoImFuZHJvaWQuY3RzLmRldmljZS5sb3dyYW0iLAorICAgICAgICAgICAgICAgICAgICBCb29sZWFuLnRvU3RyaW5nKGFjdGl2aXR5TWFuYWdlci5pc0xvd1JhbURldmljZSgpKSk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHJlc2V0KCkgeworICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnRpZXMobnVsbCk7CisgICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydGllcyhtUHJvcGVydGllcyk7CisgICAgICAgICAgICBMb2NhbGUuc2V0RGVmYXVsdChtRGVmYXVsdExvY2FsZSk7CisgICAgICAgICAgICBUaW1lWm9uZS5zZXREZWZhdWx0KG1EZWZhdWx0VGltZVpvbmUpOworICAgICAgICAgICAgQXV0aGVudGljYXRvci5zZXREZWZhdWx0KG51bGwpOworICAgICAgICAgICAgQ29va2llSGFuZGxlci5zZXREZWZhdWx0KG51bGwpOworICAgICAgICAgICAgUmVzcG9uc2VDYWNoZS5zZXREZWZhdWx0KG51bGwpOworICAgICAgICAgICAgSHR0cHNVUkxDb25uZWN0aW9uLnNldERlZmF1bHRIb3N0bmFtZVZlcmlmaWVyKG1Ib3N0bmFtZVZlcmlmaWVyKTsKKyAgICAgICAgICAgIEh0dHBzVVJMQ29ubmVjdGlvbi5zZXREZWZhdWx0U1NMU29ja2V0RmFjdG9yeShtU3NsU29ja2V0RmFjdG9yeSk7CisgICAgICAgICAgICBzZXREYXRlRm9ybWF0SXMyNEhvdXIobURlZmF1bHRJczI0SG91cik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBCb29sZWFuIGdldERhdGVGb3JtYXRJczI0SG91cigpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChCb29sZWFuKSBzRGF0ZUZvcm1hdElzMjRIb3VyRmllbGQuZ2V0KG51bGwpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVmbGVjdGl2ZU9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJVbmFibGUgdG8gZ2V0IGphdmEudGV4dC5EYXRlRm9ybWF0LmlzMjRIb3VyIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHNldERhdGVGb3JtYXRJczI0SG91cihCb29sZWFuIHZhbHVlKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNEYXRlRm9ybWF0SXMyNEhvdXJGaWVsZC5zZXQobnVsbCwgdmFsdWUpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVmbGVjdGl2ZU9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJVbmFibGUgdG8gc2V0IGphdmEudGV4dC5EYXRlRm9ybWF0LmlzMjRIb3VyIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2NvcmUvcnVubmVyL0FuZHJvaWQubWsgYi90ZXN0cy9jb3JlL3J1bm5lci9BbmRyb2lkLm1rCmluZGV4IDdlNGZiMGQuLmUyZDUwNDcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2NvcmUvcnVubmVyL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvY29yZS9ydW5uZXIvQW5kcm9pZC5tawpAQCAtMTQsMjEgKzE0LDYgQEAKIAogTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCiAKLWlmZXEgKCQoQlVJTERfQ1RTQ09SRV9QQUNLQUdFKSwpCi0gICAgJChlcnJvciBCVUlMRF9DVFNDT1JFX1BBQ0tBR0UgbXVzdCBiZSBkZWZpbmVkKQotZW5kaWYKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLSMgaW5jbHVkZSB0aGlzIHBhY2thZ2UgaW4gdGhlIHRlc3RzIHRhcmdldCBmb3IgY29udGludW91cyB0ZXN0aW5nCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotCi1MT0NBTF9QQUNLQUdFX05BTUUgOj0gYW5kcm9pZC5jb3JlLnRlc3RzLnJ1bm5lcgotCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY3RzLXRlc3QtcnVubmVyCi0KLWluY2x1ZGUgJChCVUlMRF9DVFNDT1JFX1BBQ0tBR0UpCi0KICM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAjIEJ1aWxkIHRoZSBjb3JlIHJ1bm5lci4KICM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC00NSw3ICszMCw4IEBACiAgICAgdm9nYXJleHBlY3QgXAogICAgIHRlc3RuZwogCi1MT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CiAKIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfSkFWQV9MSUJSQVJZKQogCmRpZmYgLS1naXQgYS90ZXN0cy9jb3JlL3J1bm5lci9zcmMvY29tL2FuZHJvaWQvY3RzL2NvcmUvaW50ZXJuYWwvcnVubmVyL1Rlc3RMb2FkZXIuamF2YSBiL3Rlc3RzL2NvcmUvcnVubmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvY29yZS9pbnRlcm5hbC9ydW5uZXIvVGVzdExvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDhlOGZkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL2NvcmUvcnVubmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvY29yZS9pbnRlcm5hbC9ydW5uZXIvVGVzdExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIFRoaXMgZmlsZSBpcyBhIGNvcHkgb2YgaHR0cHM6Ly9jcy5jb3JwLmdvb2dsZS5jb20vYW5kcm9pZC9mcmFtZXdvcmtzL3Rlc3RpbmcvcnVubmVyL3NyYy9tYWluL2phdmEvYW5kcm9pZC9zdXBwb3J0L3Rlc3QvaW50ZXJuYWwvcnVubmVyL1Rlc3RMb2FkZXIuamF2YQotICogVGhlIG9ubHkgY2hhbmdlcyB0aGF0IGhhdmUgYmVlbiBtYWRlIHN0YXJ0cyB3aXRoIC8vIExpYmNvcmUtc3BlY2lmaWMKLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5jb3JlLmludGVybmFsLnJ1bm5lcjsKLQotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBvcmcuanVuaXQucnVubmVyLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIubm90aWZpY2F0aW9uLkZhaWx1cmU7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEEgY2xhc3MgZm9yIGxvYWRpbmcgSlVuaXQzIGFuZCBKVW5pdDQgdGVzdCBjbGFzc2VzIGdpdmVuIGEgc2V0IG9mIHBvdGVudGlhbCBjbGFzcyBuYW1lcy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFRlc3RMb2FkZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiVGVzdExvYWRlciI7Ci0gICAgLy8gTGliY29yZS1zcGVjaWZpYyBjaGFuZ2U6IEZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIFRlc3RORyBhbm5vdGF0aW9uIGNsYXNzLgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUTkdfVEVTVCA9ICJvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3QiOwotCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBDbGFzczw/Pj4gbUxvYWRlZENsYXNzZXNNYXAgPSBuZXcgTGlua2VkSGFzaE1hcDxTdHJpbmcsIENsYXNzPD8+PigpOwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgRmFpbHVyZT4gbUxvYWRGYWlsdXJlc01hcCA9IG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZywgRmFpbHVyZT4oKTsKLQotICAgIHByaXZhdGUgQ2xhc3NMb2FkZXIgbUNsYXNzTG9hZGVyOwotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSB7QGxpbmsgQ2xhc3NMb2FkZXJ9IHRvIGJlIHVzZWQgdG8gbG9hZCB0ZXN0IGNhc2VzLgotICAgICAqCi0gICAgICogQHBhcmFtIGxvYWRlciB7QGxpbmsgQ2xhc3NMb2FkZXJ9IHRvIGxvYWQgdGVzdCBjYXNlcyB3aXRoLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzTG9hZGVyKENsYXNzTG9hZGVyIGxvYWRlcikgewotICAgICAgICBtQ2xhc3NMb2FkZXIgPSBsb2FkZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9hZHMgdGhlIHRlc3QgY2xhc3MgZnJvbSBhIGdpdmVuIGNsYXNzIG5hbWUgaWYgaXRzIG5vdCBhbHJlYWR5IGxvYWRlZC4KLSAgICAgKiA8cC8+Ci0gICAgICogV2lsbCBzdG9yZSB0aGUgcmVzdWx0IGludGVybmFsbHkuIFN1Y2Nlc3NmdWxseSBsb2FkZWQgY2xhc3NlcyBjYW4gYmUgcmV0cmlldmVkIHZpYQotICAgICAqIHtAbGluayAjZ2V0TG9hZGVkQ2xhc3NlcygpfSwgZmFpbHVyZXMgdmlhIHtAbGluayAjZ2V0TG9hZEZhaWx1cmVzKCl9LgotICAgICAqCi0gICAgICogQHBhcmFtIGNsYXNzTmFtZSB0aGUgY2xhc3MgbmFtZSB0byBhdHRlbXB0IHRvIGxvYWQKLSAgICAgKiBAcmV0dXJuIHRoZSBsb2FkZWQgY2xhc3Mgb3IgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ2xhc3M8Pz4gbG9hZENsYXNzKFN0cmluZyBjbGFzc05hbWUpIHsKLSAgICAgICAgQ2xhc3M8Pz4gbG9hZGVkQ2xhc3MgPSBkb0xvYWRDbGFzcyhjbGFzc05hbWUpOwotICAgICAgICBpZiAobG9hZGVkQ2xhc3MgIT0gbnVsbCkgewotICAgICAgICAgICAgbUxvYWRlZENsYXNzZXNNYXAucHV0KGNsYXNzTmFtZSwgbG9hZGVkQ2xhc3MpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsb2FkZWRDbGFzczsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXIoKSB7Ci0gICAgICAgIGlmIChtQ2xhc3NMb2FkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1DbGFzc0xvYWRlcjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRPRE86IEluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIgdXNlcwotICAgICAgICAvLyBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSwgZmFsc2UsIGdldFRhcmdldENvbnRleHQoKS5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgLy8gRXZhbHVhdGUgaWYgdGhhdCBpcyBuZWVkZWQuIEluaXRpYWwgdGVzdGluZyBpbmRpY2F0ZXMKLSAgICAgICAgLy8gZ2V0VGFyZ2V0Q29udGV4dCgpLmdldENsYXNzTG9hZGVyKCkgPT0gdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkKLSAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOwotICAgIH0KLQotICAgIHByaXZhdGUgQ2xhc3M8Pz4gZG9Mb2FkQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSkgewotICAgICAgICBpZiAobUxvYWRGYWlsdXJlc01hcC5jb250YWluc0tleShjbGFzc05hbWUpKSB7Ci0gICAgICAgICAgICAvLyBEb24ndCBsb2FkIGNsYXNzZXMgdGhhdCBhbHJlYWR5IGZhaWxlZCB0byBsb2FkCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSBlbHNlIGlmIChtTG9hZGVkQ2xhc3Nlc01hcC5jb250YWluc0tleShjbGFzc05hbWUpKSB7Ci0gICAgICAgICAgICAvLyBDbGFzcyB3aXRoIHRoZSBzYW1lIG5hbWUgd2FzIGFscmVhZHkgbG9hZGVkLCByZXR1cm4gaXQKLSAgICAgICAgICAgIHJldHVybiBtTG9hZGVkQ2xhc3Nlc01hcC5nZXQoY2xhc3NOYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDbGFzc0xvYWRlciBteUNsYXNzTG9hZGVyID0gZ2V0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSwgZmFsc2UsIG15Q2xhc3NMb2FkZXIpOwotICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN0cmluZyBlcnJNc2cgPSBTdHJpbmcuZm9ybWF0KCJDb3VsZCBub3QgZmluZCBjbGFzczogJXMiLCBjbGFzc05hbWUpOwotICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgZXJyTXNnKTsKLSAgICAgICAgICAgIERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gRGVzY3JpcHRpb24uY3JlYXRlU3VpdGVEZXNjcmlwdGlvbihjbGFzc05hbWUpOwotICAgICAgICAgICAgRmFpbHVyZSBmYWlsdXJlID0gbmV3IEZhaWx1cmUoZGVzY3JpcHRpb24sIGUpOwotICAgICAgICAgICAgbUxvYWRGYWlsdXJlc01hcC5wdXQoY2xhc3NOYW1lLCBmYWlsdXJlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb2FkcyB0aGUgdGVzdCBjbGFzcyBmcm9tIHRoZSBnaXZlbiBjbGFzcyBuYW1lLgotICAgICAqIDxwLz4KLSAgICAgKiBTaW1pbGFyIHRvIHtAbGluayAjbG9hZENsYXNzKFN0cmluZyl9LCBidXQgd2lsbCBpZ25vcmUgY2xhc3NlcyB0aGF0IGFyZQotICAgICAqIG5vdCB0ZXN0cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjbGFzc05hbWUgdGhlIGNsYXNzIG5hbWUgdG8gYXR0ZW1wdCB0byBsb2FkCi0gICAgICogQHJldHVybiB0aGUgbG9hZGVkIGNsYXNzIG9yIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIENsYXNzPD8+IGxvYWRJZlRlc3QoU3RyaW5nIGNsYXNzTmFtZSkgewotICAgICAgICBDbGFzczw/PiBsb2FkZWRDbGFzcyA9IGRvTG9hZENsYXNzKGNsYXNzTmFtZSk7Ci0gICAgICAgIGlmIChsb2FkZWRDbGFzcyAhPSBudWxsICYmIGlzVGVzdENsYXNzKGxvYWRlZENsYXNzKSkgewotICAgICAgICAgICAgbUxvYWRlZENsYXNzZXNNYXAucHV0KGNsYXNzTmFtZSwgbG9hZGVkQ2xhc3MpOwotICAgICAgICAgICAgcmV0dXJuIGxvYWRlZENsYXNzOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gd2hldGhlciB0aGlzIHtAbGluayBUZXN0TG9hZGVyfSBjb250YWlucyBhbnkgbG9hZGVkIGNsYXNzZXMgb3IgbG9hZCBmYWlsdXJlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotICAgICAgICByZXR1cm4gbUxvYWRlZENsYXNzZXNNYXAuaXNFbXB0eSgpICYmIG1Mb2FkRmFpbHVyZXNNYXAuaXNFbXB0eSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUge0BsaW5rIENvbGxlY3Rpb24pIG9mIGNsYXNzZXMgc3VjY2Vzc2Z1bGx5IGxvYWRlZCB2aWEKLSAgICAgKiB7QGxpbmsgI2xvYWRJZlRlc3QoU3RyaW5nKX0gY2FsbHMuCi0gICAgICovCi0gICAgcHVibGljIENvbGxlY3Rpb248Q2xhc3M8Pz4+IGdldExvYWRlZENsYXNzZXMoKSB7Ci0gICAgICAgIHJldHVybiBtTG9hZGVkQ2xhc3Nlc01hcC52YWx1ZXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHtAbGluayBMaXN0KSBvZiB7QGxpbmsgRmFpbHVyZX0gdGhhdCBvY2N1cnJlZCBkdXJpbmcKLSAgICAgKiB7QGxpbmsgI2xvYWRJZlRlc3QoU3RyaW5nKX0gY2FsbHMuCi0gICAgICovCi0gICAgcHVibGljIENvbGxlY3Rpb248RmFpbHVyZT4gZ2V0TG9hZEZhaWx1cmVzKCkgewotICAgICAgICByZXR1cm4gbUxvYWRGYWlsdXJlc01hcC52YWx1ZXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmVzIGlmIGdpdmVuIGNsYXNzIGlzIGEgdmFsaWQgdGVzdCBjbGFzcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsb2FkZWRDbGFzcwotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgbG9hZGVkQ2xhc3MgaXMgYSB0ZXN0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzVGVzdENsYXNzKENsYXNzPD8+IGxvYWRlZENsYXNzKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoTW9kaWZpZXIuaXNBYnN0cmFjdChsb2FkZWRDbGFzcy5nZXRNb2RpZmllcnMoKSkpIHsKLSAgICAgICAgICAgICAgICBsb2dEZWJ1ZyhTdHJpbmcuZm9ybWF0KCJTa2lwcGluZyBhYnN0cmFjdCBjbGFzcyAlczogbm90IGEgdGVzdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWRDbGFzcy5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBMaWJjb3JlLXNwZWNpZmljIGNoYW5nZTogQWxzbyBjb25zaWRlciBUZXN0TkcgYW5ub3RhdGVkIGNsYXNzZXMuCi0gICAgICAgICAgICBpZiAoaXNUZXN0TmdUZXN0Q2xhc3MobG9hZGVkQ2xhc3MpKSB7Ci0gICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gVE9ETzogdHJ5IHRvIGZpbmQgdXBzdHJlYW0ganVuaXQgY2FsbHMgdG8gcmVwbGFjZSB0aGVzZSBjaGVja3MKLSAgICAgICAgICAgIGlmIChqdW5pdC5mcmFtZXdvcmsuVGVzdC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGxvYWRlZENsYXNzKSkgewotICAgICAgICAgICAgICAgIC8vIGVuc3VyZSB0aGF0IGlmIGEgVGVzdENhc2UsIGl0IGhhcyBhdCBsZWFzdCBvbmUgdGVzdCBtZXRob2Qgb3RoZXJ3aXNlCi0gICAgICAgICAgICAgICAgLy8gVGVzdFN1aXRlIHdpbGwgdGhyb3cgZXJyb3IKLSAgICAgICAgICAgICAgICBpZiAoanVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20obG9hZGVkQ2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBoYXNKVW5pdDNUZXN0TWV0aG9kKGxvYWRlZENsYXNzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBUT0RPOiBsb29rIGZvciBhICdzdWl0ZScgbWV0aG9kPwotICAgICAgICAgICAgaWYgKGxvYWRlZENsYXNzLmlzQW5ub3RhdGlvblByZXNlbnQob3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoLmNsYXNzKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChNZXRob2QgdGVzdE1ldGhvZCA6IGxvYWRlZENsYXNzLmdldE1ldGhvZHMoKSkgewotICAgICAgICAgICAgICAgIGlmICh0ZXN0TWV0aG9kLmlzQW5ub3RhdGlvblByZXNlbnQob3JnLmp1bml0LlRlc3QuY2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxvZ0RlYnVnKFN0cmluZy5mb3JtYXQoIlNraXBwaW5nIGNsYXNzICVzOiBub3QgYSB0ZXN0IiwgbG9hZGVkQ2xhc3MuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBEZWZlbnNpdmVseSBjYXRjaCBleGNlcHRpb25zIC0gV2lsbCB0aHJvdyBydW50aW1lIGV4Y2VwdGlvbiBpZiBpdCBjYW5ub3QgbG9hZCBtZXRob2RzLgotICAgICAgICAgICAgLy8gRm9yIGVhcmxpZXIgdmVyc2lvbnMgb2YgQW5kcm9pZCAoUHJlLUlDUyksIERhbHZpayBtaWdodCB0cnkgdG8gaW5pdGlhbGl6ZSBhIGNsYXNzCi0gICAgICAgICAgICAvLyBkdXJpbmcgZ2V0TWV0aG9kcygpLCBmYWlsIHRvIGRvIHNvLCBoaWRlIHRoZSBlcnJvciBhbmQgdGhyb3cgYSBOb1N1Y2hNZXRob2RFeGNlcHRpb24uCi0gICAgICAgICAgICAvLyBTaW5jZSB0aGUgamF2YS5sYW5nLkNsYXNzLmdldE1ldGhvZHMgZG9lcyBub3QgZGVjbGFyZSBzdWNoIGFuIGV4Y2VwdGlvbiwgcmVzb3J0IHRvIGEKLSAgICAgICAgICAgIC8vIGdlbmVyaWMgY2F0Y2ggYWxsLgotICAgICAgICAgICAgLy8gRm9yIElDUyssIERhbHZpayB3aWxsIHRocm93IGEgTm9DbGFzc0RlZkZvdW5kRXhjZXB0aW9uLgotICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgU3RyaW5nLmZvcm1hdCgiJXMgaW4gaXNUZXN0Q2xhc3MgZm9yICVzIiwgZS50b1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICBsb2FkZWRDbGFzcy5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBjYXRjaCAoRXJyb3IgZSkgewotICAgICAgICAgICAgLy8gZGVmZW5zaXZlbHkgY2F0Y2ggRXJyb3JzIHRvbwotICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgU3RyaW5nLmZvcm1hdCgiJXMgaW4gaXNUZXN0Q2xhc3MgZm9yICVzIiwgZS50b1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICBsb2FkZWRDbGFzcy5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNKVW5pdDNUZXN0TWV0aG9kKENsYXNzPD8+IGxvYWRlZENsYXNzKSB7Ci0gICAgICAgIGZvciAoTWV0aG9kIHRlc3RNZXRob2QgOiBsb2FkZWRDbGFzcy5nZXRNZXRob2RzKCkpIHsKLSAgICAgICAgICAgIGlmIChpc1B1YmxpY1Rlc3RNZXRob2QodGVzdE1ldGhvZCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gY29waWVkIGZyb20ganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1B1YmxpY1Rlc3RNZXRob2QoTWV0aG9kIG0pIHsKLSAgICAgICAgcmV0dXJuIGlzVGVzdE1ldGhvZChtKSAmJiBNb2RpZmllci5pc1B1YmxpYyhtLmdldE1vZGlmaWVycygpKTsKLSAgICB9Ci0KLSAgICAvLyBjb3BpZWQgZnJvbSBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzVGVzdE1ldGhvZChNZXRob2QgbSkgewotICAgICAgICByZXR1cm4gbS5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aCA9PSAwICYmIG0uZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoInRlc3QiKQotICAgICAgICAgICAgICAgICYmIG0uZ2V0UmV0dXJuVHlwZSgpLmVxdWFscyhWb2lkLlRZUEUpOwotICAgIH0KLQotICAgIC8vIExpYmNvcmUtc3BlY2lmaWMgY2hhbmdlOiBBZGQgbWV0aG9kIGZvciBjaGVja2luZyBUZXN0TkctYW5ub3RhdGVkIGNsYXNzZXMuCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1Rlc3ROZ1Rlc3RDbGFzcyhDbGFzczw/PiBjbHMpIHsKLSAgICAgIC8vIFRlc3RORyB0ZXN0IGlzIGVpdGhlciBtYXJrZWQgQFRlc3QgYXQgdGhlIGNsYXNzCi0gICAgICBmb3IgKEFubm90YXRpb24gYSA6IGNscy5nZXRBbm5vdGF0aW9ucygpKSB7Ci0gICAgICAgICAgaWYgKGEuYW5ub3RhdGlvblR5cGUoKS5nZXROYW1lKCkuZXF1YWxzKFRFU1ROR19URVNUKSkgewotICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIE9yIEl0J3MgbWFya2VkIEBUZXN0IGF0IHRoZSBtZXRob2QgbGV2ZWwKLSAgICAgIGZvciAoTWV0aG9kIG0gOiBjbHMuZ2V0RGVjbGFyZWRNZXRob2RzKCkpIHsKLSAgICAgICAgZm9yIChBbm5vdGF0aW9uIGEgOiBtLmdldEFubm90YXRpb25zKCkpIHsKLSAgICAgICAgICBpZiAoYS5hbm5vdGF0aW9uVHlwZSgpLmdldE5hbWUoKS5lcXVhbHMoVEVTVE5HX1RFU1QpKSB7Ci0gICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBVdGlsaXR5IG1ldGhvZCBmb3IgbG9nZ2luZyBkZWJ1ZyBtZXNzYWdlcy4gT25seSBhY3R1YWxseSBsb2dzIGEgbWVzc2FnZSBpZiBMT0dfVEFHIGlzIG1hcmtlZAotICAgICAqIGFzIGxvZ2dhYmxlIHRvIGxpbWl0IGxvZyBzcGFtIGR1cmluZyBub3JtYWwgdXNlLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBsb2dEZWJ1ZyhTdHJpbmcgbXNnKSB7Ci0gICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShMT0dfVEFHLCBMb2cuREVCVUcpKSB7Ci0gICAgICAgICAgICBMb2cuZChMT0dfVEFHLCBtc2cpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvY29yZS9ydW5uZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9jb3JlL3J1bm5lci9BbmRyb2lkSlVuaXRSdW5uZXJDb25zdGFudHMuamF2YSBiL3Rlc3RzL2NvcmUvcnVubmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvY29yZS9ydW5uZXIvQW5kcm9pZEpVbml0UnVubmVyQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMThjZGMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvY29yZS9ydW5uZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9jb3JlL3J1bm5lci9BbmRyb2lkSlVuaXRSdW5uZXJDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5jdHMuY29yZS5ydW5uZXI7Ci0KLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyOwotCi0vKioKLSAqIENvbnN0YW50cyB1c2VkIHRvIGNvbW11bmljYXRlIHRvIGFuZCBmcm9tIHtAbGluayBBbmRyb2lkSlVuaXRSdW5uZXJ9LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFuZHJvaWRKVW5pdFJ1bm5lckNvbnN0YW50cyB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBuYW1lcyBvZiB0aGUgdGVzdHMgdG8gcnVuLgotICAgICAqCi0gICAgICogPHA+VGhpcyBpcyBhbiBpbnRlcm5hbCBjb25zdGFudCB1c2VkIHdpdGhpbgotICAgICAqIHtAY29kZSBhbmRyb2lkLnN1cHBvcnQudGVzdC5pbnRlcm5hbC5ydW5uZXIuUnVubmVyQXJnc30sIHdoaWNoIGlzIHVzZWQgb24gYm90aCB0aGUgc2VydmVyCi0gICAgICogYW5kCi0gICAgICogY2xpZW50IHNpZGUuIFRoZSBjb25zdGFudCBpcyB1c2VkIHdoZW4gdGhlcmUgYXJlIHRvbyBtYW55IHRlc3QgbmFtZXMgdG8gcGFzcyBvbiB0aGUgY29tbWFuZAotICAgICAqIGxpbmUsIGluIHdoaWNoIGNhc2UgdGhleSBhcmUgc3RvcmVkIGluIGEgZmlsZSB0aGF0IGlzIHB1c2hlZCB0byB0aGUgZGV2aWNlIGFuZCB0aGVuIHRoZQotICAgICAqIGxvY2F0aW9uIG9mIHRoYXQgZmlsZSBpcyBwYXNzZWQgaW4gdGhpcyBhcmd1bWVudC4gVGhlIHtAY29kZSBSdW5uZXJBcmdzfSBvbiB0aGUgY2xpZW50IHdpbGwKLSAgICAgKiByZWFkIHRoZSBjb250ZW50cyBvZiB0aGF0IGZpbGUgaW4gb3JkZXIgdG8gcmV0cmlldmUgdGhlIGxpc3Qgb2YgbmFtZXMgYW5kIHRoZW4gcmV0dXJuIHRoYXQKLSAgICAgKiB0bwotICAgICAqIGl0cyBjbGllbnQgd2l0aG91dCB0aGUgY2xpZW50IGJlaW5nIGF3YXJlIG9mIGhvdyB0aGF0IHdhcyBkb25lLgotICAgICAqLwotICAgIFN0cmluZyBBUkdVTUVOVF9URVNUX0ZJTEUgPSAidGVzdEZpbGUiOwotCi0gICAgLyoqCi0gICAgICogVGhlIG5hbWUgb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgbmFtZXMgb2YgdGhlIHRlc3RzIG5vdCB0byBydW4uCi0gICAgICoKLSAgICAgKiA8cD5UaGlzIGlzIGFuIGludGVybmFsIGNvbnN0YW50IHVzZWQgd2l0aGluCi0gICAgICoge0Bjb2RlIGFuZHJvaWQuc3VwcG9ydC50ZXN0LmludGVybmFsLnJ1bm5lci5SdW5uZXJBcmdzfSwgd2hpY2ggaXMgdXNlZCBvbiBib3RoIHRoZSBzZXJ2ZXIKLSAgICAgKiBhbmQKLSAgICAgKiBjbGllbnQgc2lkZS4gVGhlIGNvbnN0YW50IGlzIHVzZWQgd2hlbiB0aGVyZSBhcmUgdG9vIG1hbnkgdGVzdCBuYW1lcyB0byBwYXNzIG9uIHRoZSBjb21tYW5kCi0gICAgICogbGluZSwgaW4gd2hpY2ggY2FzZSB0aGV5IGFyZSBzdG9yZWQgaW4gYSBmaWxlIHRoYXQgaXMgcHVzaGVkIHRvIHRoZSBkZXZpY2UgYW5kIHRoZW4gdGhlCi0gICAgICogbG9jYXRpb24gb2YgdGhhdCBmaWxlIGlzIHBhc3NlZCBpbiB0aGlzIGFyZ3VtZW50LiBUaGUge0Bjb2RlIFJ1bm5lckFyZ3N9IG9uIHRoZSBjbGllbnQgd2lsbAotICAgICAqIHJlYWQgdGhlIGNvbnRlbnRzIG9mIHRoYXQgZmlsZSBpbiBvcmRlciB0byByZXRyaWV2ZSB0aGUgbGlzdCBvZiBuYW1lcyBhbmQgdGhlbiByZXR1cm4gdGhhdAotICAgICAqIHRvCi0gICAgICogaXRzIGNsaWVudCB3aXRob3V0IHRoZSBjbGllbnQgYmVpbmcgYXdhcmUgb2YgaG93IHRoYXQgd2FzIGRvbmUuCi0gICAgICovCi0gICAgU3RyaW5nIEFSR1VNRU5UX05PVF9URVNUX0ZJTEUgPSAibm90VGVzdEZpbGUiOwotCi0gICAgLyoqCi0gICAgICogQSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiB0aGUgbmFtZXMgb2YgdGVzdCBjbGFzc2VzIHRvIHJ1bi4KLSAgICAgKgotICAgICAqIDxwPlRoZSBlcXVpdmFsZW50IGNvbnN0YW50IGluIHtAY29kZSBJbnN0cnVtZW50YXRpb25UZXN0UnVubmVyfSBpcyBoaWRkZW4gYW5kIHNvIG5vdAotICAgICAqIGF2YWlsYWJsZQotICAgICAqIHRocm91Z2ggdGhlIHB1YmxpYyBBUEkuCi0gICAgICovCi0gICAgU3RyaW5nIEFSR1VNRU5UX1RFU1RfQ0xBU1MgPSAiY2xhc3MiOwotCi0gICAgLyoqCi0gICAgICogQSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiB0aGUgbmFtZXMgb2YgdGVzdCBjbGFzc2VzIG5vdCB0byBydW4KLSAgICAgKi8KLSAgICBTdHJpbmcgQVJHVU1FTlRfTk9UX1RFU1RfQ0xBU1MgPSAibm90Q2xhc3MiOwotCi0gICAgLyoqCi0gICAgICogQSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiB0aGUgbmFtZXMgb2YgdGVzdCBwYWNrYWdlcyB0byBydW4uCi0gICAgICoKLSAgICAgKiA8cD5UaGUgZXF1aXZhbGVudCBjb25zdGFudCBpbiB7QGNvZGUgSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcn0gaXMgaGlkZGVuIGFuZCBzbyBub3QKLSAgICAgKiBhdmFpbGFibGUKLSAgICAgKiB0aHJvdWdoIHRoZSBwdWJsaWMgQVBJLgotICAgICAqLwotICAgIFN0cmluZyBBUkdVTUVOVF9URVNUX1BBQ0tBR0UgPSAicGFja2FnZSI7Ci0KLSAgICAvKioKLSAgICAgKiBBIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHRoZSBuYW1lcyBvZiB0ZXN0IHBhY2thZ2VzIG5vdCB0byBydW4uCi0gICAgICovCi0gICAgU3RyaW5nIEFSR1VNRU5UX05PVF9URVNUX1BBQ0tBR0UgPSAibm90UGFja2FnZSI7Ci0KLSAgICAvKioKLSAgICAgKiBMb2cgdGhlIHJlc3VsdHMgYXMgaWYgdGhlIHRlc3RzIHdlcmUgZXhlY3V0ZWQgYnV0IGRvbid0IGFjdHVhbGx5IHJ1biB0aGUgdGVzdHMuCi0gICAgICoKLSAgICAgKiA8cD5UaGUgZXF1aXZhbGVudCBjb25zdGFudCBpbiB7QGNvZGUgSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcn0gaXMgcHJpdmF0ZS4KLSAgICAgKi8KLSAgICBTdHJpbmcgQVJHVU1FTlRfTE9HX09OTFkgPSAibG9nIjsKLQotICAgIC8qKgotICAgICAqIFdhaXQgZm9yIHRoZSBkZWJ1Z2dlciBiZWZvcmUgc3RhcnRpbmcuCi0gICAgICoKLSAgICAgKiA8cD5UaGVyZSBpcyBubyBlcXVpdmFsZW50IGNvbnN0YW50IGluIHtAY29kZSBJbnN0cnVtZW50YXRpb25UZXN0UnVubmVyfSBidXQgdGhlIHN0cmluZyBpcwotICAgICAqIHVzZWQKLSAgICAgKiB3aXRoaW4gdGhhdCBjbGFzcy4KLSAgICAgKi8KLSAgICBTdHJpbmcgQVJHVU1FTlRfREVCVUcgPSAiZGVidWciOwotCi0gICAgLyoqCi0gICAgICogT25seSBjb3VudCB0aGUgbnVtYmVyIG9mIHRlc3RzIHRvIHJ1bi4KLSAgICAgKgotICAgICAqIDxwPlRoZXJlIGlzIG5vIGVxdWl2YWxlbnQgY29uc3RhbnQgaW4ge0Bjb2RlIEluc3RydW1lbnRhdGlvblRlc3RSdW5uZXJ9IGJ1dCB0aGUgc3RyaW5nIGlzCi0gICAgICogdXNlZAotICAgICAqIHdpdGhpbiB0aGF0IGNsYXNzLgotICAgICAqLwotICAgIFN0cmluZyBBUkdVTUVOVF9DT1VOVCA9ICJjb3VudCI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgcGVyIHRlc3QgdGltZW91dCB2YWx1ZS4KLSAgICAgKi8KLSAgICBTdHJpbmcgQVJHVU1FTlRfVElNRU9VVCA9ICJ0aW1lb3V0X21zZWMiOwotCi0gICAgLyoqCi0gICAgICogVG9rZW4gcmVwcmVzZW50aW5nIGhvdyBsb25nIChpbiBzZWNvbmRzKSB0aGUgY3VycmVudCB0ZXN0IHRvb2sgdG8gZXhlY3V0ZS4KLSAgICAgKgotICAgICAqIDxwPlRoZSBlcXVpdmFsZW50IGNvbnN0YW50IGluIHtAY29kZSBJbnN0cnVtZW50YXRpb25UZXN0UnVubmVyfSBpcyBwcml2YXRlLgotICAgICAqLwotICAgIFN0cmluZyBSRVBPUlRfS0VZX1JVTlRJTUUgPSAicnVudGltZSI7Ci0KLSAgICAvKioKLSAgICAgKiBBbiBpZGVudGlmaWVyIGZvciB0ZXN0cyBydW4gdXNpbmcgdGhpcyBjbGFzcy4KLSAgICAgKi8KLSAgICBTdHJpbmcgUkVQT1JUX1ZBTFVFX0lEID0gIkNvcmVUZXN0UnVubmVyIjsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL2NvcmUvcnVubmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvY29yZS9ydW5uZXIvQ29yZVRlc3RSdW5uZXIuamF2YSBiL3Rlc3RzL2NvcmUvcnVubmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvY29yZS9ydW5uZXIvQ29yZVRlc3RSdW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJiNjY4NC4uMDAwMDAwMAotLS0gYS90ZXN0cy9jb3JlL3J1bm5lci9zcmMvY29tL2FuZHJvaWQvY3RzL2NvcmUvcnVubmVyL0NvcmVUZXN0UnVubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuY3RzLmNvcmUucnVubmVyOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuRGVidWc7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuaW50ZXJuYWwucnVubmVyLmxpc3RlbmVyLkluc3RydW1lbnRhdGlvblJlc3VsdFByaW50ZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuaW50ZXJuYWwucnVubmVyLmxpc3RlbmVyLkluc3RydW1lbnRhdGlvblJ1bkxpc3RlbmVyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmludGVybmFsLnV0aWwuQW5kcm9pZFJ1bm5lclBhcmFtczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy5jb3JlLnJ1bm5lci5zdXBwb3J0LkV4dGVuZGVkQW5kcm9pZFJ1bm5lckJ1aWxkZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TcGxpdHRlcjsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuQ29tcHV0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5KVW5pdENvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SZXF1ZXN0OwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUmVzdWx0OwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVubmVyOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIubWFuaXB1bGF0aW9uLkZpbHRlcjsKLWltcG9ydCBvcmcuanVuaXQucnVubmVyLm1hbmlwdWxhdGlvbi5GaWx0ZXJhYmxlOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIubWFuaXB1bGF0aW9uLk5vVGVzdHNSZW1haW5FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5ub3RpZmljYXRpb24uUnVuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMubW9kZWwuSW5pdGlhbGl6YXRpb25FcnJvcjsKLWltcG9ydCBvcmcuanVuaXQucnVubmVycy5tb2RlbC5SdW5uZXJCdWlsZGVyOwotCi1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmN0cy5jb3JlLnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXJDb25zdGFudHMuQVJHVU1FTlRfQ09VTlQ7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmN0cy5jb3JlLnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXJDb25zdGFudHMuQVJHVU1FTlRfREVCVUc7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmN0cy5jb3JlLnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXJDb25zdGFudHMuQVJHVU1FTlRfTE9HX09OTFk7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmN0cy5jb3JlLnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXJDb25zdGFudHMuQVJHVU1FTlRfTk9UX1RFU1RfQ0xBU1M7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmN0cy5jb3JlLnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXJDb25zdGFudHMuQVJHVU1FTlRfTk9UX1RFU1RfRklMRTsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY3RzLmNvcmUucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lckNvbnN0YW50cy5BUkdVTUVOVF9OT1RfVEVTVF9QQUNLQUdFOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jdHMuY29yZS5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyQ29uc3RhbnRzLkFSR1VNRU5UX1RFU1RfQ0xBU1M7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmN0cy5jb3JlLnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXJDb25zdGFudHMuQVJHVU1FTlRfVEVTVF9GSUxFOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jdHMuY29yZS5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyQ29uc3RhbnRzLkFSR1VNRU5UX1RFU1RfUEFDS0FHRTsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY3RzLmNvcmUucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lckNvbnN0YW50cy5BUkdVTUVOVF9USU1FT1VUOwotCi0vKioKLSAqIEEgZHJvcC1pbiByZXBsYWNlbWVudCBmb3IgQW5kcm9pZEpVbml0VGVzdFJ1bm5lciwgd2hpY2ggdW5kZXJzdGFuZHMgdGhlIHNhbWUgYXJndW1lbnRzLCBhbmQgaGFzCi0gKiBzaW1pbGFyIGZ1bmN0aW9uYWxpdHksIGJ1dCBjYW4gZmlsdGVyIGJ5IGV4cGVjdGF0aW9ucyBhbmQgYWxsb3dzIGEgY3VzdG9tIHJ1bm5lci1idWlsZGVyIHRvIGJlCi0gKiBwcm92aWRlZC4KLSAqLwotcHVibGljIGNsYXNzIENvcmVUZXN0UnVubmVyIGV4dGVuZHMgSW5zdHJ1bWVudGF0aW9uIHsKLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkxpYmNvcmVUZXN0UnVubmVyIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQVJHVU1FTlRfUk9PVF9DTEFTU0VTID0gImNvcmUtcm9vdC1jbGFzc2VzIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdVTUVOVF9DT1JFX0xJU1RFTkVSID0gImNvcmUtbGlzdGVuZXIiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3BsaXR0ZXIgQ0xBU1NfTElTVF9TUExJVFRFUiA9IFNwbGl0dGVyLm9uKCcsJykudHJpbVJlc3VsdHMoKTsKLQotICAgIC8qKiBUaGUgYXJncyBmb3IgdGhlIHJ1bm5lci4gKi8KLSAgICBwcml2YXRlIEJ1bmRsZSBhcmdzOwotCi0gICAgLyoqIE9ubHkgbG9nIHRoZSBudW1iZXIgYW5kIG5hbWVzIG9mIHRlc3RzLCBhbmQgbm90IHJ1biB0aGVtLiAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBsb2dPbmx5OwotCi0gICAgLyoqIFRoZSBhbW91bnQgb2YgdGltZSBpbiBtaWxsaXMgdG8gd2FpdCBmb3IgYSBzaW5nbGUgdGVzdCB0byBjb21wbGV0ZS4gKi8KLSAgICBwcml2YXRlIGxvbmcgdGVzdFRpbWVvdXQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbGlzdCBvZiB0ZXN0cyB0byBydW4uCi0gICAgICovCi0gICAgcHJpdmF0ZSBUZXN0TGlzdCB0ZXN0TGlzdDsKLQotICAgIC8qKgotICAgICAqIFRoZSBsaXN0IG9mIHtAbGluayBSdW5MaXN0ZW5lcn0gY2xhc3NlcyB0byBjcmVhdGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0PENsYXNzPD8gZXh0ZW5kcyBSdW5MaXN0ZW5lcj4+IGxpc3RlbmVyQ2xhc3NlczsKLSAgICBwcml2YXRlIEZpbHRlciBleHBlY3RhdGlvbkZpbHRlcjsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKGZpbmFsIEJ1bmRsZSBhcmdzKSB7Ci0gICAgICAgIHN1cGVyLm9uQ3JlYXRlKGFyZ3MpOwotICAgICAgICB0aGlzLmFyZ3MgPSBhcmdzOwotCi0gICAgICAgIGJvb2xlYW4gZGVidWcgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShhcmdzLmdldFN0cmluZyhBUkdVTUVOVF9ERUJVRykpOwotICAgICAgICBpZiAoZGVidWcpIHsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIldhaXRpbmcgZm9yIGRlYnVnZ2VyIHRvIGNvbm5lY3QuLi4iKTsKLSAgICAgICAgICAgIERlYnVnLndhaXRGb3JEZWJ1Z2dlcigpOwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiRGVidWdnZXIgY29ubmVjdGVkLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTG9nIHRoZSBtZXNzYWdlIG9ubHkgYWZ0ZXIgZ2V0dGluZyBhIHZhbHVlIGZyb20gdGhlIGFyZ3Mgc28gdGhhdCB0aGUgYXJncyBhcmUKLSAgICAgICAgLy8gdW5wYXJjZWxlZC4KLSAgICAgICAgTG9nLmQoVEFHLCAiSW4gT25DcmVhdGU6ICIgKyBhcmdzKTsKLQotICAgICAgICAvLyBUcmVhdCBsb2dPbmx5IGFuZCBjb3VudCBhcyB0aGUgc2FtZS4gVGhpcyBpcyBub3QgcXVpdGUgdHJ1ZSBhcyBjb3VudCBzaG91bGQgb25seSBzZW5kCi0gICAgICAgIC8vIHRoZSBob3N0IHRoZSBudW1iZXIgb2YgdGVzdHMgYnV0IGxvZ09ubHkgc2hvdWxkIHNlbmQgdGhlIG5hbWUgYW5kIG51bWJlci4gSG93ZXZlciwKLSAgICAgICAgLy8gdGhpcyBpcyBob3cgdGhpcyBoYXMgYWx3YXlzIGJlaGF2ZWQgYW5kIGl0IGRvZXMgbm90IGFwcGVhciB0byBoYXZlIGNhdXNlZCBhbnkgcHJvYmxlbXMuCi0gICAgICAgIC8vIENoYW5naW5nIGl0IHNlZW1zIHVubmVjZXNzYXJ5IGdpdmVuIHRoYXQgY291bnQgaXMgQ1RTdjEgb25seSBhbmQgQ1RTdjEgd2lsbCBiZSByZW1vdmVkCi0gICAgICAgIC8vIHNvb24gbm93IHRoYXQgQ1RTdjIgaXMgcmVhZHkuCi0gICAgICAgIGJvb2xlYW4gdGVzdENvdW50T25seSA9IGFyZ3MuZ2V0Qm9vbGVhbihBUkdVTUVOVF9DT1VOVCk7Ci0gICAgICAgIHRoaXMubG9nT25seSA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKGFyZ3MuZ2V0U3RyaW5nKEFSR1VNRU5UX0xPR19PTkxZKSkgfHwgdGVzdENvdW50T25seTsKLSAgICAgICAgdGhpcy50ZXN0VGltZW91dCA9IHBhcnNlVW5zaWduZWRMb25nKGFyZ3MuZ2V0U3RyaW5nKEFSR1VNRU5UX1RJTUVPVVQpLCBBUkdVTUVOVF9USU1FT1VUKTsKLQotICAgICAgICBleHBlY3RhdGlvbkZpbHRlciA9IG5ldyBFeHBlY3RhdGlvbkJhc2VkRmlsdGVyKGFyZ3MpOwotCi0gICAgICAgIC8vIFRoZSB0ZXN0IGNhbiBiZSBydW4gc3BlY2lmeWluZyBhIGxpc3Qgb2YgdGVzdHMgdG8gcnVuLCBvciBhcyBjdHMtdHJhZGVmZWQgZG9lcyBpdCwKLSAgICAgICAgLy8gYnkgcGFzc2luZyBhIGZpbGVOYW1lIHdpdGggYSB0ZXN0IHRvIHJ1biBvbiBlYWNoIGxpbmUuCi0gICAgICAgIFNldDxTdHJpbmc+IHRlc3ROYW1lU2V0ID0gbmV3IEhhc2hTZXQ8PigpOwotICAgICAgICBTdHJpbmcgYXJnOwotICAgICAgICBpZiAoKGFyZyA9IGFyZ3MuZ2V0U3RyaW5nKEFSR1VNRU5UX1RFU1RfRklMRSkpICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRoZSB0ZXN0cyBhcmUgc3BlY2lmaWVkIGluIGEgZmlsZS4KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdGVzdE5hbWVTZXQuYWRkQWxsKHJlYWRUZXN0c0Zyb21GaWxlKGFyZykpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXJyKSB7Ci0gICAgICAgICAgICAgICAgZmluaXNoKEFjdGl2aXR5LlJFU1VMVF9DQU5DRUxFRCwgbmV3IEJ1bmRsZSgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoKGFyZyA9IGFyZ3MuZ2V0U3RyaW5nKEFSR1VNRU5UX1RFU1RfQ0xBU1MpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBUaGUgdGVzdHMgYXJlIHNwZWNpZmllZCBpbiBhIFN0cmluZyBwYXNzZWQgaW4gdGhlIGJ1bmRsZS4KLSAgICAgICAgICAgIFN0cmluZ1tdIHRlc3RzID0gYXJnLnNwbGl0KCIsIik7Ci0gICAgICAgICAgICB0ZXN0TmFtZVNldC5hZGRBbGwoQXJyYXlzLmFzTGlzdCh0ZXN0cykpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGVzdHMgbWF5IGJlIGV4Y2x1ZGVkIGZyb20gdGhlIHJ1biBieSBwYXNzaW5nIGEgbGlzdCBvZiB0ZXN0cyBub3QgdG8gcnVuLAotICAgICAgICAvLyBvciBieSBwYXNzaW5nIGEgZmlsZU5hbWUgd2l0aCBhIHRlc3Qgbm90IHRvIHJ1biBvbiBlYWNoIGxpbmUuCi0gICAgICAgIFNldDxTdHJpbmc+IG5vdFRlc3ROYW1lU2V0ID0gbmV3IEhhc2hTZXQ8PigpOwotICAgICAgICBpZiAoKGFyZyA9IGFyZ3MuZ2V0U3RyaW5nKEFSR1VNRU5UX05PVF9URVNUX0ZJTEUpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBUaGUgdGVzdHMgYXJlIHNwZWNpZmllZCBpbiBhIGZpbGUuCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG5vdFRlc3ROYW1lU2V0LmFkZEFsbChyZWFkVGVzdHNGcm9tRmlsZShhcmcpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGVycikgewotICAgICAgICAgICAgICAgIGZpbmlzaChBY3Rpdml0eS5SRVNVTFRfQ0FOQ0VMRUQsIG5ldyBCdW5kbGUoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKChhcmcgPSBhcmdzLmdldFN0cmluZyhBUkdVTUVOVF9OT1RfVEVTVF9DTEFTUykpICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRoZSBjbGFzc2VzIGFyZSBzcGVjaWZpZWQgaW4gYSBTdHJpbmcgcGFzc2VkIGluIHRoZSBidW5kbGUKLSAgICAgICAgICAgIFN0cmluZ1tdIHRlc3RzID0gYXJnLnNwbGl0KCIsIik7Ci0gICAgICAgICAgICBub3RUZXN0TmFtZVNldC5hZGRBbGwoQXJyYXlzLmFzTGlzdCh0ZXN0cykpOwotICAgICAgICB9Ci0KLSAgICAgICAgU2V0PFN0cmluZz4gcGFja2FnZU5hbWVTZXQgPSBuZXcgSGFzaFNldDw+KCk7Ci0gICAgICAgIGlmICgoYXJnID0gYXJncy5nZXRTdHJpbmcoQVJHVU1FTlRfVEVTVF9QQUNLQUdFKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVGhlIHBhY2thZ2VzIGFyZSBzcGVjaWZpZWQgaW4gYSBTdHJpbmcgcGFzc2VkIGluIHRoZSBidW5kbGUKLSAgICAgICAgICAgIFN0cmluZ1tdIHBhY2thZ2VzID0gYXJnLnNwbGl0KCIsIik7Ci0gICAgICAgICAgICBwYWNrYWdlTmFtZVNldC5hZGRBbGwoQXJyYXlzLmFzTGlzdChwYWNrYWdlcykpOwotICAgICAgICB9Ci0KLSAgICAgICAgU2V0PFN0cmluZz4gbm90UGFja2FnZU5hbWVTZXQgPSBuZXcgSGFzaFNldDw+KCk7Ci0gICAgICAgIGlmICgoYXJnID0gYXJncy5nZXRTdHJpbmcoQVJHVU1FTlRfTk9UX1RFU1RfUEFDS0FHRSkpICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRoZSBwYWNrYWdlcyBhcmUgc3BlY2lmaWVkIGluIGEgU3RyaW5nIHBhc3NlZCBpbiB0aGUgYnVuZGxlCi0gICAgICAgICAgICBTdHJpbmdbXSBwYWNrYWdlcyA9IGFyZy5zcGxpdCgiLCIpOwotICAgICAgICAgICAgbm90UGFja2FnZU5hbWVTZXQuYWRkQWxsKEFycmF5cy5hc0xpc3QocGFja2FnZXMpKTsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3Q8U3RyaW5nPiByb290cyA9IGdldFJvb3RDbGFzc05hbWVzKGFyZ3MpOwotICAgICAgICBpZiAocm9vdHMgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gRmluZCBhbGwgdGVzdCBjbGFzc2VzCi0gICAgICAgICAgICBDb2xsZWN0aW9uPENsYXNzPD8+PiBjbGFzc2VzID0gVGVzdENsYXNzRmluZGVyLmdldENsYXNzZXMoCi0gICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChnZXRDb250ZXh0KCkuZ2V0UGFja2FnZUNvZGVQYXRoKCkpLAotICAgICAgICAgICAgICAgIGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgICAgICB0ZXN0TGlzdCA9IG5ldyBUZXN0TGlzdChjbGFzc2VzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRlc3RMaXN0ID0gVGVzdExpc3Qucm9vdExpc3Qocm9vdHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGVzdExpc3QuYWRkSW5jbHVkZVRlc3RQYWNrYWdlcyhwYWNrYWdlTmFtZVNldCk7Ci0gICAgICAgIHRlc3RMaXN0LmFkZEV4Y2x1ZGVUZXN0UGFja2FnZXMobm90UGFja2FnZU5hbWVTZXQpOwotICAgICAgICB0ZXN0TGlzdC5hZGRJbmNsdWRlVGVzdHModGVzdE5hbWVTZXQpOwotICAgICAgICB0ZXN0TGlzdC5hZGRFeGNsdWRlVGVzdHMobm90VGVzdE5hbWVTZXQpOwotCi0gICAgICAgIGxpc3RlbmVyQ2xhc3NlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBTdHJpbmcgbGlzdGVuZXJBcmcgPSBhcmdzLmdldFN0cmluZyhBUkdVTUVOVF9DT1JFX0xJU1RFTkVSKTsKLSAgICAgICAgaWYgKGxpc3RlbmVyQXJnICE9IG51bGwpIHsKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBsaXN0ZW5lckNsYXNzTmFtZXMgPSBDTEFTU19MSVNUX1NQTElUVEVSLnNwbGl0VG9MaXN0KGxpc3RlbmVyQXJnKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGxpc3RlbmVyQ2xhc3NOYW1lIDogbGlzdGVuZXJDbGFzc05hbWVzKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFJ1bkxpc3RlbmVyPiBsaXN0ZW5lckNsYXNzID0gQ2xhc3MuZm9yTmFtZShsaXN0ZW5lckNsYXNzTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXNTdWJjbGFzcyhSdW5MaXN0ZW5lci5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyQ2xhc3Nlcy5hZGQobGlzdGVuZXJDbGFzcyk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkNvdWxkIG5vdCBsb2FkIGxpc3RlbmVyIGNsYXNzOiAiICsgbGlzdGVuZXJDbGFzc05hbWUsIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHN0YXJ0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gZ2V0Um9vdENsYXNzTmFtZXMoQnVuZGxlIGFyZ3MpIHsKLSAgICAgICAgU3RyaW5nIHJvb3RDbGFzc2VzID0gYXJncy5nZXRTdHJpbmcoQVJHVU1FTlRfUk9PVF9DTEFTU0VTKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IHJvb3RzOwotICAgICAgICBpZiAocm9vdENsYXNzZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcm9vdHMgPSBudWxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcm9vdHMgPSBDTEFTU19MSVNUX1NQTElUVEVSLnNwbGl0VG9MaXN0KHJvb3RDbGFzc2VzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcm9vdHM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TdGFydCgpIHsKLSAgICAgICAgaWYgKGxvZ09ubHkpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkNvdW50aW5nL2xvZ2dpbmcgdGVzdHMgb25seSIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiUnVubmluZyB0ZXN0cyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQW5kcm9pZFJ1bm5lclBhcmFtcyBydW5uZXJQYXJhbXMgPSBuZXcgQW5kcm9pZFJ1bm5lclBhcmFtcyh0aGlzLCBhcmdzLAotICAgICAgICAgICAgICAgIGZhbHNlLCB0ZXN0VGltZW91dCwgZmFsc2UgLyppZ25vcmVTdWl0ZU1ldGhvZHMqLyk7Ci0KLSAgICAgICAgUnVubmVyIHJ1bm5lcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFJ1bm5lckJ1aWxkZXIgcnVubmVyQnVpbGRlciA9IG5ldyBFeHRlbmRlZEFuZHJvaWRSdW5uZXJCdWlsZGVyKHJ1bm5lclBhcmFtcyk7Ci0gICAgICAgICAgICBDbGFzc1tdIGNsYXNzZXMgPSB0ZXN0TGlzdC5nZXRDbGFzc2VzVG9SdW4oKTsKLSAgICAgICAgICAgIGZvciAoQ2xhc3MgY2xzIDogY2xhc3NlcykgewotICAgICAgICAgICAgICBMb2cuZChUQUcsICJGb3VuZCBjbGFzcyB0byBydW46ICIgKyBjbHMuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJ1bm5lciA9IG5ldyBDb21wdXRlcigpLmdldFN1aXRlKHJ1bm5lckJ1aWxkZXIsIGNsYXNzZXMpOwotCi0gICAgICAgICAgICBpZiAocnVubmVyIGluc3RhbmNlb2YgRmlsdGVyYWJsZSkgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkFwcGx5aW5nIGZpbHRlcnMiKTsKLSAgICAgICAgICAgICAgICBGaWx0ZXJhYmxlIGZpbHRlcmFibGUgPSAoRmlsdGVyYWJsZSkgcnVubmVyOwotCi0gICAgICAgICAgICAgICAgLy8gRmlsdGVyIG91dCBhbGwgdGhlIHRlc3RzIHRoYXQgYXJlIGV4cGVjdGVkIHRvIGZhaWwuCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgZmlsdGVyYWJsZS5maWx0ZXIoZXhwZWN0YXRpb25GaWx0ZXIpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5vVGVzdHNSZW1haW5FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBTb21ldGltZXMgZmlsdGVyaW5nIHdpbGwgcmVtb3ZlIGFsbCB0ZXN0cyBidXQgd2UgZG8gbm90IGNhcmUgYWJvdXQgdGhhdC4KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQXBwbGllZCBmaWx0ZXJzIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIElmIHRoZSB0ZXN0cyBhcmUgb25seSBzdXBwb3NlZCB0byBiZSBsb2dnZWQgYW5kIG5vdCBhY3R1YWxseSBydW4gdGhlbiByZXBsYWNlIHRoZQotICAgICAgICAgICAgLy8gcnVubmVyIHdpdGggYSBydW5uZXIgdGhhdCB3aWxsIGZpcmUgbm90aWZpY2F0aW9ucyBmb3IgYWxsIHRoZSB0ZXN0cyB0aGF0IHdvdWxkIGhhdmUKLSAgICAgICAgICAgIC8vIGJlZW4gcnVuLiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIENUU3YyIGRvZXMgYSBsb2cgb25seSBydW4gdGhyb3VnaCBhIENUUyBtb2R1bGUgaW4KLSAgICAgICAgICAgIC8vIG9yZGVyIHRvIGdlbmVyYXRlIGEgbGlzdCBvZiB0ZXN0cyB0aGF0IHdpbGwgYmUgcnVuIHNvIHRoYXQgaXQgY2FuIG1vbml0b3IgdGhlbS4KLSAgICAgICAgICAgIC8vIEVuY2Fwc3VsYXRpbmcgdGhhdCBpbiBhIFJ1bm5lciBpbXBsZW1lbnRhdGlvbiBtYWtlcyBpdCBlYXNpZXIgdG8gbGV2ZXJhZ2UgdGhlCi0gICAgICAgICAgICAvLyBleGlzdGluZyBjb2RlIGZvciBydW5uaW5nIHRlc3RzLgotICAgICAgICAgICAgaWYgKGxvZ09ubHkpIHsKLSAgICAgICAgICAgICAgICBydW5uZXIgPSBuZXcgRGVzY3JpcHRpb25IaWVyYXJjaHlOb3RpZmllcihydW5uZXIuZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBjYXRjaCAoSW5pdGlhbGl6YXRpb25FcnJvciBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSBhIHN1aXRlIiwgZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBJbnN0cnVtZW50YXRpb25SZXN1bHRQcmludGVyIGluc3RydW1lbnRhdGlvblJlc3VsdFByaW50ZXIgPQotICAgICAgICAgICAgICAgIG5ldyBJbnN0cnVtZW50YXRpb25SZXN1bHRQcmludGVyKCk7Ci0gICAgICAgIGluc3RydW1lbnRhdGlvblJlc3VsdFByaW50ZXIuc2V0SW5zdHJ1bWVudGF0aW9uKHRoaXMpOwotCi0gICAgICAgIEpVbml0Q29yZSBjb3JlID0gbmV3IEpVbml0Q29yZSgpOwotICAgICAgICBjb3JlLmFkZExpc3RlbmVyKGluc3RydW1lbnRhdGlvblJlc3VsdFByaW50ZXIpOwotCi0gICAgICAgIC8vIElmIG5vdCBsb2dnaW5nIHRoZSBsaXN0IG9mIHRlc3RzIHRoZW4gYWRkIGFueSBhZGRpdGlvbmFsIGNvbmZpZ3VyZWQgbGlzdGVuZXJzLiBUaGVzZQotICAgICAgICAvLyBtdXN0IGJlIGFkZGVkIGJlZm9yZSBmaXJpbmcgYW55IGV2ZW50cy4KLSAgICAgICAgaWYgKCFsb2dPbmx5KSB7Ci0gICAgICAgICAgICAvLyBBZGQgYWRkaXRpb25hbCBjb25maWd1cmVkIGxpc3RlbmVycy4KLSAgICAgICAgICAgIGZvciAoQ2xhc3M8PyBleHRlbmRzIFJ1bkxpc3RlbmVyPiBsaXN0ZW5lckNsYXNzIDogbGlzdGVuZXJDbGFzc2VzKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgUnVuTGlzdGVuZXIgcnVuTGlzdGVuZXIgPSBsaXN0ZW5lckNsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChydW5MaXN0ZW5lciBpbnN0YW5jZW9mIEluc3RydW1lbnRhdGlvblJ1bkxpc3RlbmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKEluc3RydW1lbnRhdGlvblJ1bkxpc3RlbmVyKSBydW5MaXN0ZW5lcikuc2V0SW5zdHJ1bWVudGF0aW9uKHRoaXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNvcmUuYWRkTGlzdGVuZXIocnVuTGlzdGVuZXIpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gfCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgY3JlYXRlIGluc3RhbmNlIG9mIGxpc3RlbmVyOiAiICsgbGlzdGVuZXJDbGFzcywgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgTG9nLmQoVEFHLCAiRmluaXNoZWQgcHJlcGFyYXRpb25zLCBydW5uaW5nL2xpc3RpbmcgdGVzdHMiKTsKLQotICAgICAgICBCdW5kbGUgcmVzdWx0cyA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgUmVzdWx0IGp1bml0UmVzdWx0cyA9IG5ldyBSZXN1bHQoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGp1bml0UmVzdWx0cyA9IGNvcmUucnVuKFJlcXVlc3QucnVubmVyKHJ1bm5lcikpOwotICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cgPSAiRmF0YWwgZXhjZXB0aW9uIHdoZW4gcnVubmluZyB0ZXN0cyI7Ci0gICAgICAgICAgICBMb2cuZShUQUcsIG1zZywgZSk7Ci0gICAgICAgICAgICAvLyByZXBvcnQgdGhlIGV4Y2VwdGlvbiB0byBpbnN0cnVtZW50YXRpb24gb3V0Ci0gICAgICAgICAgICByZXN1bHRzLnB1dFN0cmluZyhJbnN0cnVtZW50YXRpb24uUkVQT1JUX0tFWV9TVFJFQU1SRVNVTFQsCi0gICAgICAgICAgICAgICAgICAgIG1zZyArICJcbiIgKyBMb2cuZ2V0U3RhY2tUcmFjZVN0cmluZyhlKSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gc3VtbWFyeVN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgc3RyZWFtIHVzZWQgdG8gb3V0cHV0IHN1bW1hcnkgZGF0YSB0byB0aGUgdXNlcgotICAgICAgICAgICAgUHJpbnRTdHJlYW0gc3VtbWFyeVdyaXRlciA9IG5ldyBQcmludFN0cmVhbShzdW1tYXJ5U3RyZWFtKTsKLSAgICAgICAgICAgIGluc3RydW1lbnRhdGlvblJlc3VsdFByaW50ZXIuaW5zdHJ1bWVudGF0aW9uUnVuRmluaXNoZWQoc3VtbWFyeVdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0cywganVuaXRSZXN1bHRzKTsKLSAgICAgICAgICAgIHN1bW1hcnlXcml0ZXIuY2xvc2UoKTsKLSAgICAgICAgICAgIHJlc3VsdHMucHV0U3RyaW5nKEluc3RydW1lbnRhdGlvbi5SRVBPUlRfS0VZX1NUUkVBTVJFU1VMVCwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiXG4lcyIsIHN1bW1hcnlTdHJlYW0udG9TdHJpbmcoKSkpOwotICAgICAgICB9Ci0KLQotICAgICAgICBMb2cuZChUQUcsICJGaW5pc2hlZCIpOwotICAgICAgICBmaW5pc2goQWN0aXZpdHkuUkVTVUxUX09LLCByZXN1bHRzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkIHRlc3RzIGZyb20gYSBzcGVjaWZpZWQgZmlsZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gY2xhc3MgbmFtZXMgb2YgdGVzdHMuIElmIHRoZXJlIHdhcyBhbiBlcnJvciByZWFkaW5nIHRoZSBmaWxlLCBudWxsIGlzIHJldHVybmVkLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8U3RyaW5nPiByZWFkVGVzdHNGcm9tRmlsZShTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSAoQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoZmlsZU5hbWUpKSkgewotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHRlc3RzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICBTdHJpbmcgbGluZTsKLSAgICAgICAgICAgIHdoaWxlICgobGluZSA9IGJyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0ZXN0cy5hZGQobGluZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdGVzdHM7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGVycikgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiVGhlcmUgd2FzIGFuIGVycm9yIHJlYWRpbmcgdGhlIHRlc3QgY2xhc3MgbGlzdDogIiArIGVyci5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgdGhyb3cgZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2UgbG9uZyBmcm9tIGdpdmVuIHZhbHVlIC0gZXhjZXB0IGVpdGhlciBMb25nIG9yIFN0cmluZy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlLCAtMSBpZiBub3QgZm91bmQKLSAgICAgKiBAdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiBpZiB2YWx1ZSBpcyBuZWdhdGl2ZSBvciBub3QgYSBudW1iZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBsb25nIHBhcnNlVW5zaWduZWRMb25nKE9iamVjdCB2YWx1ZSwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGxvbmcgbG9uZ1ZhbHVlID0gTG9uZy5wYXJzZUxvbmcodmFsdWUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBpZiAobG9uZ1ZhbHVlIDwgMCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24obmFtZSArICIgY2FuIG5vdCBiZSBuZWdhdGl2ZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGxvbmdWYWx1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvY29yZS9ydW5uZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9jb3JlL3J1bm5lci9EZXNjcmlwdGlvbkhpZXJhcmNoeU5vdGlmaWVyLmphdmEgYi90ZXN0cy9jb3JlL3J1bm5lci9zcmMvY29tL2FuZHJvaWQvY3RzL2NvcmUvcnVubmVyL0Rlc2NyaXB0aW9uSGllcmFyY2h5Tm90aWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM5NGZkNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9jb3JlL3J1bm5lci9zcmMvY29tL2FuZHJvaWQvY3RzL2NvcmUvcnVubmVyL0Rlc2NyaXB0aW9uSGllcmFyY2h5Tm90aWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5jdHMuY29yZS5ydW5uZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuanVuaXQucnVubmVyLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVubmVyOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIubm90aWZpY2F0aW9uLlJ1bk5vdGlmaWVyOwotCi0vKioKLSAqIEEge0BsaW5rIFJ1bm5lcn0gdGhhdCBkb2VzIG5vdCBhY3R1YWxseSBydW4gYW55IHRlc3RzIGJ1dCBzaW1wbHkgZmlyZXMgZXZlbnRzIGZvciBhbGwgbGVhZgotICoge0BsaW5rIERlc2NyaXB0aW9ufSBpbnN0YW5jZXMgaW4gdGhlIHN1cHBsaWVkIHtAbGluayBEZXNjcmlwdGlvbn0gaGllcmFyY2h5LgotICovCi1jbGFzcyBEZXNjcmlwdGlvbkhpZXJhcmNoeU5vdGlmaWVyIGV4dGVuZHMgUnVubmVyIHsKLQotICAgIHByaXZhdGUgZmluYWwgRGVzY3JpcHRpb24gZGVzY3JpcHRpb247Ci0KLSAgICBEZXNjcmlwdGlvbkhpZXJhcmNoeU5vdGlmaWVyKERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7Ci0gICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRGVzY3JpcHRpb24gZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIHJldHVybiBkZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBydW4oUnVuTm90aWZpZXIgbm90aWZpZXIpIHsKLSAgICAgICAgZ2VuZXJhdGVMaXN0T2ZUZXN0cyhub3RpZmllciwgZGVzY3JpcHRpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlcyBhIGxpc3Qgb2YgdGVzdHMgdG8gcnVuIGJ5IHJlY3Vyc2luZyBvdmVyIHRoZSB7QGxpbmsgRGVzY3JpcHRpb259IGhpZXJhcmNoeSBhbmQKLSAgICAgKiBmaXJpbmcgZXZlbnRzIHRvIHNpbXVsYXRlIHRoZSB0ZXN0cyBiZWluZyBydW4gc3VjY2Vzc2Z1bGx5LgotICAgICAqIEBwYXJhbSBydW5Ob3RpZmllciB0aGUgbm90aWZpZXIgdG8gd2hpY2ggdGhlIGV2ZW50cyBhcmUgc2VudC4KLSAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gdGhlIGRlc2NyaXB0aW9uIHRvIHRyYXZlcnNlLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZUxpc3RPZlRlc3RzKFJ1bk5vdGlmaWVyIHJ1bk5vdGlmaWVyLCBEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgewotICAgICAgICBMaXN0PERlc2NyaXB0aW9uPiBjaGlsZHJlbiA9IGRlc2NyaXB0aW9uLmdldENoaWxkcmVuKCk7Ci0gICAgICAgIGlmIChjaGlsZHJlbi5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJ1bk5vdGlmaWVyLmZpcmVUZXN0U3RhcnRlZChkZXNjcmlwdGlvbik7Ci0gICAgICAgICAgICBydW5Ob3RpZmllci5maXJlVGVzdEZpbmlzaGVkKGRlc2NyaXB0aW9uKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoRGVzY3JpcHRpb24gY2hpbGQgOiBjaGlsZHJlbikgewotICAgICAgICAgICAgICAgIGdlbmVyYXRlTGlzdE9mVGVzdHMocnVuTm90aWZpZXIsIGNoaWxkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL2NvcmUvcnVubmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvY29yZS9ydW5uZXIvRXhwZWN0YXRpb25CYXNlZEZpbHRlci5qYXZhIGIvdGVzdHMvY29yZS9ydW5uZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9jb3JlL3J1bm5lci9FeHBlY3RhdGlvbkJhc2VkRmlsdGVyLmphdmEKaW5kZXggOTAwMzRlYy4uZjQwOWRiZCAxMDA2NDQKLS0tIGEvdGVzdHMvY29yZS9ydW5uZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9jb3JlL3J1bm5lci9FeHBlY3RhdGlvbkJhc2VkRmlsdGVyLmphdmEKKysrIGIvdGVzdHMvY29yZS9ydW5uZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9jb3JlL3J1bm5lci9FeHBlY3RhdGlvbkJhc2VkRmlsdGVyLmphdmEKQEAgLTEwNSw3ICsxMDUsNyBAQAogICAgICAgICAgICAgaWYgKGV4cGVjdGF0aW9uU3RvcmUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIEV4cGVjdGF0aW9uIGV4cGVjdGF0aW9uID0gZXhwZWN0YXRpb25TdG9yZS5nZXQodGVzdE5hbWUpOwogICAgICAgICAgICAgICAgIGlmIChleHBlY3RhdGlvbi5nZXRSZXN1bHQoKSAhPSBSZXN1bHQuU1VDQ0VTUykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChDb3JlVGVzdFJ1bm5lci5UQUcsICJFeGNsdWRpbmcgdGVzdCAiICsgdGVzdERlc2NyaXB0aW9uCisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkV4Y2x1ZGluZyB0ZXN0ICIgKyB0ZXN0RGVzY3JpcHRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYXMgaXQgbWF0Y2hlcyBleHBlY3RhdGlvbjogIiArIGV4cGVjdGF0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2NvcmUvcnVubmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvY29yZS9ydW5uZXIvVGVzdENsYXNzRmluZGVyLmphdmEgYi90ZXN0cy9jb3JlL3J1bm5lci9zcmMvY29tL2FuZHJvaWQvY3RzL2NvcmUvcnVubmVyL1Rlc3RDbGFzc0ZpbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWQ5NWY2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL2NvcmUvcnVubmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvY29yZS9ydW5uZXIvVGVzdENsYXNzRmluZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuY3RzLmNvcmUucnVubmVyOwotCi1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuaW50ZXJuYWwucnVubmVyLkNsYXNzUGF0aFNjYW5uZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuaW50ZXJuYWwucnVubmVyLkNsYXNzUGF0aFNjYW5uZXIuQ2xhc3NOYW1lRmlsdGVyOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5jdHMuY29yZS5pbnRlcm5hbC5ydW5uZXIuVGVzdExvYWRlcjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGRhbHZpay5zeXN0ZW0uRGV4RmlsZTsKLQotLyoqCi0gKiBGaW5kIHRlc3RzIGluIHRoZSBjdXJyZW50IEFQSy4KLSAqLwotcHVibGljIGNsYXNzIFRlc3RDbGFzc0ZpbmRlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlRlc3RDbGFzc0ZpbmRlciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCi0gICAgLy8gRXhjbHVkZWQgdGVzdCBwYWNrYWdlcwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfRVhDTFVERURfUEFDS0FHRVMgPSB7Ci0gICAgICAgICAgICAianVuaXQiLAotICAgICAgICAgICAgIm9yZy5qdW5pdCIsCi0gICAgICAgICAgICAib3JnLmhhbWNyZXN0IiwKLSAgICAgICAgICAgICJvcmcubW9ja2l0byIsLy8gZXhjbHVkZSBNb2NraXRvIGZvciBwZXJmb3JtYW5jZSBhbmQgdG8gcHJldmVudCBKVk0gcmVsYXRlZCBlcnJvcnMKLSAgICAgICAgICAgICJhbmRyb2lkLnN1cHBvcnQudGVzdC5pbnRlcm5hbC5ydW5uZXIuanVuaXQzIiwvLyBhbHdheXMgc2tpcCBBbmRyb2lkVGVzdFN1aXRlCi0gICAgfTsKLQotICAgIHN0YXRpYyBDb2xsZWN0aW9uPENsYXNzPD8+PiBnZXRDbGFzc2VzKExpc3Q8U3RyaW5nPiBhcGtzLCBDbGFzc0xvYWRlciBsb2FkZXIpIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgTG9nLmQoVEFHLCAiZ2V0Q2xhc3NlczogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7Ci0KLSAgICAgICAgICBmb3IgKFN0cmluZyBhcGtQYXRoIDogYXBrcykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiZ2V0Q2xhc3NlczogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOwotICAgICAgICAgICAgTG9nLmQoVEFHLCAiZ2V0Q2xhc3NlczogQVBLICIgKyBhcGtQYXRoKTsKLQotICAgICAgICAgICAgRGV4RmlsZSBkZXhGaWxlID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZGV4RmlsZSA9IG5ldyBEZXhGaWxlKGFwa1BhdGgpOwotICAgICAgICAgICAgICAgIEVudW1lcmF0aW9uPFN0cmluZz4gYXBrQ2xhc3NOYW1lcyA9IGRleEZpbGUuZW50cmllcygpOwotICAgICAgICAgICAgICAgIHdoaWxlIChhcGtDbGFzc05hbWVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBhcGtDbGFzc05hbWUgPSBhcGtDbGFzc05hbWVzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImdldENsYXNzZXM6IERleENsYXNzIGVsZW1lbnQgIiArIGFwa0NsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoZSk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIGlmIChkZXhGaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGRleEZpbGUuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGUpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExvZy5kKFRBRywgImdldENsYXNzZXM6IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gIC8vIGlmIERFQlVHCi0KLSAgICAgICAgTGlzdDxDbGFzczw/Pj4gY2xhc3NlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBDbGFzc1BhdGhTY2FubmVyIHNjYW5uZXIgPSBuZXcgQ2xhc3NQYXRoU2Nhbm5lcihhcGtzKTsKLQotICAgICAgICBDbGFzc1BhdGhTY2FubmVyLkNoYWluZWRDbGFzc05hbWVGaWx0ZXIgZmlsdGVyID0KLSAgICAgICAgICAgICAgICBuZXcgQ2xhc3NQYXRoU2Nhbm5lci5DaGFpbmVkQ2xhc3NOYW1lRmlsdGVyKCk7Ci0gICAgICAgIC8vIGV4Y2x1ZGUgaW5uZXIgY2xhc3NlcwotICAgICAgICBmaWx0ZXIuYWRkKG5ldyBDbGFzc1BhdGhTY2FubmVyLkV4dGVybmFsQ2xhc3NOYW1lRmlsdGVyKCkpOwotCi0gICAgICAgIC8vIGV4Y2x1ZGUgZGVmYXVsdCBjbGFzc2VzCi0gICAgICAgIGZvciAoU3RyaW5nIGRlZmF1bHRFeGNsdWRlZFBhY2thZ2UgOiBERUZBVUxUX0VYQ0xVREVEX1BBQ0tBR0VTKSB7Ci0gICAgICAgICAgICBmaWx0ZXIuYWRkKG5ldyBFeGNsdWRlUGFja2FnZU5hbWVGaWx0ZXIoZGVmYXVsdEV4Y2x1ZGVkUGFja2FnZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZXhjbHVkZSBhbnkgY2xhc3NlcyB0aGF0IGFyZW4ndCBhICJ0ZXN0IGNsYXNzIiAoc2VlICNsb2FkSWZUZXN0KQotICAgICAgICBUZXN0TG9hZGVyIHRlc3RMb2FkZXIgPSBuZXcgVGVzdExvYWRlcigpOwotICAgICAgICB0ZXN0TG9hZGVyLnNldENsYXNzTG9hZGVyKGxvYWRlcik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNldDxTdHJpbmc+IGNsYXNzTmFtZXMgPSBzY2FubmVyLmdldENsYXNzUGF0aEVudHJpZXMoZmlsdGVyKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IGNsYXNzTmFtZXMpIHsKLSAgICAgICAgICAgICAgICAvLyBJbXBvcnRhbnQ6IFRoaXMgZnVydGhlciBhY3RzIGFzIGFuIGFkZGl0aW9uYWwgZmlsdGVyOwotICAgICAgICAgICAgICAgIC8vIGNsYXNzZXMgdGhhdCBhcmVuJ3QgYSAidGVzdCBjbGFzcyIgYXJlIG5ldmVyIGxvYWRlZC4KLSAgICAgICAgICAgICAgICBDbGFzczw/PiBjbHMgPSB0ZXN0TG9hZGVyLmxvYWRJZlRlc3QoY2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoY2xzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY2xhc3Nlcy5hZGQoY2xzKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJnZXRDbGFzc2VzOiBMb2FkZWQgIiArIGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJnZXRDbGFzc2VzOiBGYWlsZWQgdG8gbG9hZCBjbGFzcyAiICsgY2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY2xhc3NlczsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoQ29yZVRlc3RSdW5uZXIuVEFHLCAiRmFpbGVkIHRvIHNjYW4gY2xhc3NlcyIsIGUpOwotICAgICAgICB9Ci0KLQotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgImdldENsYXNzZXM6ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRlc3RMb2FkZXIuZ2V0TG9hZGVkQ2xhc3NlcygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEge0BsaW5rIENsYXNzTmFtZUZpbHRlcn0gdGhhdCBvbmx5IHJlamVjdHMgYSBnaXZlbiBwYWNrYWdlIG5hbWVzIHdpdGhpbiB0aGUgZ2l2ZW4gbmFtZXNwYWNlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRXhjbHVkZVBhY2thZ2VOYW1lRmlsdGVyIGltcGxlbWVudHMgQ2xhc3NOYW1lRmlsdGVyIHsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtUGtnTmFtZTsKLQotICAgICAgICBFeGNsdWRlUGFja2FnZU5hbWVGaWx0ZXIoU3RyaW5nIHBrZ05hbWUpIHsKLSAgICAgICAgICAgIGlmICghcGtnTmFtZS5lbmRzV2l0aCgiLiIpKSB7Ci0gICAgICAgICAgICAgICAgbVBrZ05hbWUgPSBTdHJpbmcuZm9ybWF0KCIlcy4iLCBwa2dOYW1lKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVBrZ05hbWUgPSBwa2dOYW1lOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgICAgICovCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoU3RyaW5nIHBhdGhOYW1lKSB7Ci0gICAgICAgICAgICByZXR1cm4gIXBhdGhOYW1lLnN0YXJ0c1dpdGgobVBrZ05hbWUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvY29yZS9ydW5uZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9jb3JlL3J1bm5lci9UZXN0TGlzdC5qYXZhIGIvdGVzdHMvY29yZS9ydW5uZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9jb3JlL3J1bm5lci9UZXN0TGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDk3NTAxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL2NvcmUvcnVubmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvY29yZS9ydW5uZXIvVGVzdExpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuY3RzLmNvcmUucnVubmVyOwotCi1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKLQotLyoqCi0gKiBBIGxpc3Qgb2YgdGhlIHRlc3RzIHRvIHJ1bi4KLSAqLwotY2xhc3MgVGVzdExpc3QgewotCi0gICAgLyoqIFRoZSBzZXQgb2YgdGVzdCBwYWNha2dlcyB0byBydW4gKi8KLSAgICBwcml2YXRlIGZpbmFsIFNldDxTdHJpbmc+IG1JbmNsdWRlZFBhY2thZ2VzID0gbmV3IEhhc2hTZXQ8PigpOwotCi0gICAgLyoqIFRoZSBzZXQgb2YgdGVzdCBwYWNrYWdlcyBub3QgdG8gcnVuICovCi0gICAgcHJpdmF0ZSBmaW5hbCBTZXQ8U3RyaW5nPiBtRXhjbHVkZWRQYWNrYWdlcyA9IG5ldyBIYXNoU2V0PD4oKTsKLQotICAgIC8qKiBUaGUgc2V0IG9mIHRlc3RzIChjbGFzc2VzIG9yIG1ldGhvZHMpIHRvIHJ1biAqLwotICAgIHByaXZhdGUgZmluYWwgU2V0PFN0cmluZz4gbUluY2x1ZGVkVGVzdHMgPSBuZXcgSGFzaFNldDw+KCk7Ci0KLSAgICAvKiogVGhlIHNldCBvZiB0ZXN0cyAoY2xhc3NlcyBvciBtZXRob2RzKSBub3QgdG8gcnVuICovCi0gICAgcHJpdmF0ZSBmaW5hbCBTZXQ8U3RyaW5nPiBtRXhjbHVkZWRUZXN0cyA9IG5ldyBIYXNoU2V0PD4oKTsKLQotICAgIC8qKiBUaGUgbGlzdCBvZiBhbGwgdGVzdCBjbGFzc2VzIHRvIHJ1biAod2l0aG91dCBmaWx0ZXJpbmcgYXBwbGllZCkqLwotICAgIHByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjxDbGFzczw/Pj4gY2xhc3Nlc1RvUnVuOwotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0TGlzdCByb290TGlzdChMaXN0PFN0cmluZz4gcm9vdExpc3QpIHsKLQotICAgICAgICAvLyBSdW4gZnJvbSB0aGUgcm9vdCB0ZXN0IGNsYXNzLgotICAgICAgICBTZXQ8U3RyaW5nPiBjbGFzc05hbWVzVG9SdW4gPSBuZXcgTGlua2VkSGFzaFNldDw+KHJvb3RMaXN0KTsKLSAgICAgICAgTG9nLmQoQ29yZVRlc3RSdW5uZXIuVEFHLCAiUnVubmluZyBhbGwgdGVzdHMgcm9vdGVkIGF0ICIgKyBjbGFzc05hbWVzVG9SdW4pOwotCi0gICAgICAgIExpc3Q8Q2xhc3M8Pz4+IGNsYXNzZXNUb1J1bjEgPSBnZXRDbGFzc2VzKGNsYXNzTmFtZXNUb1J1bik7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0TGlzdChjbGFzc2VzVG9SdW4xKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PENsYXNzPD8+PiBnZXRDbGFzc2VzKFNldDxTdHJpbmc+IGNsYXNzTmFtZXMpIHsKLSAgICAgICAgLy8gUG9wdWxhdGUgdGhlIGxpc3Qgb2YgY2xhc3NlcyB0byBydW4uCi0gICAgICAgIExpc3Q8Q2xhc3M8Pz4+IGNsYXNzZXNUb1J1biA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBjbGFzc05hbWVzKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNsYXNzZXNUb1J1bi5hZGQoQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNvdWxkIG5vdCBsb2FkIGNsYXNzICciICsgY2xhc3NOYW1lLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2xhc3Nlc1RvUnVuOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBjbGFzc2VzIFRoZSBsaXN0IG9mIGNsYXNzZXMgdG8gcnVuLgotICAgICAqLwotICAgIHB1YmxpYyBUZXN0TGlzdChDb2xsZWN0aW9uPENsYXNzPD8+PiBjbGFzc2VzKSB7Ci0gICAgICAgIHRoaXMuY2xhc3Nlc1RvUnVuID0gY2xhc3NlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRJbmNsdWRlVGVzdFBhY2thZ2VzKFNldDxTdHJpbmc+IHBhY2thZ2VOYW1lU2V0KSB7Ci0gICAgICAgIG1JbmNsdWRlZFBhY2thZ2VzLmFkZEFsbChwYWNrYWdlTmFtZVNldCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkRXhjbHVkZVRlc3RQYWNrYWdlcyhTZXQ8U3RyaW5nPiBwYWNrYWdlTmFtZVNldCkgewotICAgICAgICBtRXhjbHVkZWRQYWNrYWdlcy5hZGRBbGwocGFja2FnZU5hbWVTZXQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEluY2x1ZGVUZXN0cyhTZXQ8U3RyaW5nPiB0ZXN0TmFtZVNldCkgewotICAgICAgICBtSW5jbHVkZWRUZXN0cy5hZGRBbGwodGVzdE5hbWVTZXQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEV4Y2x1ZGVUZXN0cyhTZXQ8U3RyaW5nPiB0ZXN0TmFtZVNldCkgewotICAgICAgICBtRXhjbHVkZWRUZXN0cy5hZGRBbGwodGVzdE5hbWVTZXQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiBhbGwgdGhlIGNsYXNzZXMgdG8gcnVuLgotICAgICAqLwotICAgIHB1YmxpYyBDbGFzc1tdIGdldENsYXNzZXNUb1J1bigpIHsKLSAgICAgICAgcmV0dXJuIGNsYXNzZXNUb1J1bi50b0FycmF5KG5ldyBDbGFzc1tjbGFzc2VzVG9SdW4uc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRydWUgaWYgdGhlIHRlc3Qgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgc2hvdWxkIGJlIHJ1biwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHNob3VsZFJ1blRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0KLSAgICAgICAgaW50IGluZGV4ID0gdGVzdE5hbWUuaW5kZXhPZignIycpOwotICAgICAgICBTdHJpbmcgY2xhc3NOYW1lOwotICAgICAgICBpZiAoaW5kZXggPT0gLTEpIHsKLSAgICAgICAgICAgIGNsYXNzTmFtZSA9IHRlc3ROYW1lOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2xhc3NOYW1lID0gdGVzdE5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ2xhc3M8Pz4gdGVzdENsYXNzID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOwotICAgICAgICAgICAgUGFja2FnZSB0ZXN0UGFja2FnZSA9IHRlc3RDbGFzcy5nZXRQYWNrYWdlKCk7Ci0gICAgICAgICAgICBTdHJpbmcgdGVzdFBhY2thZ2VOYW1lID0gIiI7Ci0gICAgICAgICAgICBpZiAodGVzdFBhY2thZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRlc3RQYWNrYWdlTmFtZSA9IHRlc3RQYWNrYWdlLmdldE5hbWUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYm9vbGVhbiBpbmNsdWRlID0KLSAgICAgICAgICAgICAgICAgICAgKG1JbmNsdWRlZFBhY2thZ2VzLmlzRW1wdHkoKSB8fCBtSW5jbHVkZWRQYWNrYWdlcy5jb250YWlucyh0ZXN0UGFja2FnZU5hbWUpKSAmJgotICAgICAgICAgICAgICAgICAgICAobUluY2x1ZGVkVGVzdHMuaXNFbXB0eSgpIHx8IG1JbmNsdWRlZFRlc3RzLmNvbnRhaW5zKGNsYXNzTmFtZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5jbHVkZWRUZXN0cy5jb250YWlucyh0ZXN0TmFtZSkpOwotCi0gICAgICAgICAgICBib29sZWFuIGV4Y2x1ZGUgPQotICAgICAgICAgICAgICAgICAgICBtRXhjbHVkZWRQYWNrYWdlcy5jb250YWlucyh0ZXN0UGFja2FnZU5hbWUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIG1FeGNsdWRlZFRlc3RzLmNvbnRhaW5zKGNsYXNzTmFtZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgbUV4Y2x1ZGVkVGVzdHMuY29udGFpbnModGVzdE5hbWUpOwotCi0gICAgICAgICAgICByZXR1cm4gaW5jbHVkZSAmJiAhZXhjbHVkZTsKLSAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudygiQ291bGQgbm90IGxvYWQgY2xhc3MgJyIgKyBjbGFzc05hbWUsIGUpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvY29yZS9ydW5uZXIvc3JjL2NvbS9hbmRyb2lkL2N0cy9jb3JlL3J1bm5lci9zdXBwb3J0L0FuZHJvaWRSdW5uZXJCdWlsZGVyLmphdmEgYi90ZXN0cy9jb3JlL3J1bm5lci9zcmMvY29tL2FuZHJvaWQvY3RzL2NvcmUvcnVubmVyL3N1cHBvcnQvQW5kcm9pZFJ1bm5lckJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFkZjJiOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9jb3JlL3J1bm5lci9zcmMvY29tL2FuZHJvaWQvY3RzL2NvcmUvcnVubmVyL3N1cHBvcnQvQW5kcm9pZFJ1bm5lckJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5jdHMuY29yZS5ydW5uZXIuc3VwcG9ydDsKLQotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmludGVybmFsLnJ1bm5lci5qdW5pdDMuQW5kcm9pZEpVbml0M0J1aWxkZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuaW50ZXJuYWwucnVubmVyLmp1bml0My5BbmRyb2lkU3VpdGVCdWlsZGVyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmludGVybmFsLnJ1bm5lci5qdW5pdDQuQW5kcm9pZEFubm90YXRlZEJ1aWxkZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuaW50ZXJuYWwucnVubmVyLmp1bml0NC5BbmRyb2lkSlVuaXQ0QnVpbGRlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5pbnRlcm5hbC51dGlsLkFuZHJvaWRSdW5uZXJQYXJhbXM7Ci0KLWltcG9ydCBvcmcuanVuaXQuaW50ZXJuYWwuYnVpbGRlcnMuQWxsRGVmYXVsdFBvc3NpYmlsaXRpZXNCdWlsZGVyOwotaW1wb3J0IG9yZy5qdW5pdC5pbnRlcm5hbC5idWlsZGVycy5Bbm5vdGF0ZWRCdWlsZGVyOwotaW1wb3J0IG9yZy5qdW5pdC5pbnRlcm5hbC5idWlsZGVycy5JZ25vcmVkQnVpbGRlcjsKLWltcG9ydCBvcmcuanVuaXQuaW50ZXJuYWwuYnVpbGRlcnMuSlVuaXQzQnVpbGRlcjsKLWltcG9ydCBvcmcuanVuaXQuaW50ZXJuYWwuYnVpbGRlcnMuSlVuaXQ0QnVpbGRlcjsKLWltcG9ydCBvcmcuanVuaXQucnVubmVycy5tb2RlbC5SdW5uZXJCdWlsZGVyOwotCi0vKioKLSAqIEEge0BsaW5rIFJ1bm5lckJ1aWxkZXJ9IHRoYXQgY2FuIGhhbmRsZSBhbGwgdHlwZXMgb2YgdGVzdHMuCi0gKi8KLS8vIEEgY29weSBvZiBwYWNrYWdlIHByaXZhdGUgY2xhc3MgYW5kcm9pZC5zdXBwb3J0LnRlc3QuaW50ZXJuYWwucnVubmVyLkFuZHJvaWRSdW5uZXJCdWlsZGVyLgotLy8gQ29waWVkIGhlcmUgc28gdGhhdCBpdCBjYW4gYmUgZXh0ZW5kZWQuCi1jbGFzcyBBbmRyb2lkUnVubmVyQnVpbGRlciBleHRlbmRzIEFsbERlZmF1bHRQb3NzaWJpbGl0aWVzQnVpbGRlciB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEFuZHJvaWRKVW5pdDNCdWlsZGVyIG1BbmRyb2lkSlVuaXQzQnVpbGRlcjsKLSAgICBwcml2YXRlIGZpbmFsIEFuZHJvaWRKVW5pdDRCdWlsZGVyIG1BbmRyb2lkSlVuaXQ0QnVpbGRlcjsKLSAgICBwcml2YXRlIGZpbmFsIEFuZHJvaWRTdWl0ZUJ1aWxkZXIgbUFuZHJvaWRTdWl0ZUJ1aWxkZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBBbmRyb2lkQW5ub3RhdGVkQnVpbGRlciBtQW5kcm9pZEFubm90YXRlZEJ1aWxkZXI7Ci0gICAgLy8gVE9ETzogY3VzdG9taXplIGZvciBBbmRyb2lkID8KLSAgICBwcml2YXRlIGZpbmFsIElnbm9yZWRCdWlsZGVyIG1JZ25vcmVkQnVpbGRlcjsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBydW5uZXJQYXJhbXMge0BsaW5rIEFuZHJvaWRSdW5uZXJQYXJhbXN9IHRoYXQgc3RvcmVzIGNvbW1vbiBydW5uZXIgcGFyYW1ldGVycwotICAgICAqLwotICAgIC8vIEFkZGVkIGNhblVzZVN1aXRlTWV0aG9kIHBhcmFtZXRlci4KLSAgICBBbmRyb2lkUnVubmVyQnVpbGRlcihBbmRyb2lkUnVubmVyUGFyYW1zIHJ1bm5lclBhcmFtcywgYm9vbGVhbiBjYW5Vc2VTdWl0ZU1ldGhvZCkgewotICAgICAgICBzdXBlcihjYW5Vc2VTdWl0ZU1ldGhvZCk7Ci0gICAgICAgIG1BbmRyb2lkSlVuaXQzQnVpbGRlciA9IG5ldyBBbmRyb2lkSlVuaXQzQnVpbGRlcihydW5uZXJQYXJhbXMpOwotICAgICAgICBtQW5kcm9pZEpVbml0NEJ1aWxkZXIgPSBuZXcgQW5kcm9pZEpVbml0NEJ1aWxkZXIocnVubmVyUGFyYW1zKTsKLSAgICAgICAgbUFuZHJvaWRTdWl0ZUJ1aWxkZXIgPSBuZXcgQW5kcm9pZFN1aXRlQnVpbGRlcihydW5uZXJQYXJhbXMpOwotICAgICAgICBtQW5kcm9pZEFubm90YXRlZEJ1aWxkZXIgPSBuZXcgQW5kcm9pZEFubm90YXRlZEJ1aWxkZXIodGhpcywgcnVubmVyUGFyYW1zKTsKLSAgICAgICAgbUlnbm9yZWRCdWlsZGVyID0gbmV3IElnbm9yZWRCdWlsZGVyKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEpVbml0NEJ1aWxkZXIganVuaXQ0QnVpbGRlcigpIHsKLSAgICAgICAgcmV0dXJuIG1BbmRyb2lkSlVuaXQ0QnVpbGRlcjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgSlVuaXQzQnVpbGRlciBqdW5pdDNCdWlsZGVyKCkgewotICAgICAgICByZXR1cm4gbUFuZHJvaWRKVW5pdDNCdWlsZGVyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBBbm5vdGF0ZWRCdWlsZGVyIGFubm90YXRlZEJ1aWxkZXIoKSB7Ci0gICAgICAgIHJldHVybiBtQW5kcm9pZEFubm90YXRlZEJ1aWxkZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIElnbm9yZWRCdWlsZGVyIGlnbm9yZWRCdWlsZGVyKCkgewotICAgICAgICByZXR1cm4gbUlnbm9yZWRCdWlsZGVyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBSdW5uZXJCdWlsZGVyIHN1aXRlTWV0aG9kQnVpbGRlcigpIHsKLSAgICAgICAgcmV0dXJuIG1BbmRyb2lkU3VpdGVCdWlsZGVyOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL2NvcmUvcnVubmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvY29yZS9ydW5uZXIvc3VwcG9ydC9FeHRlbmRlZEFuZHJvaWRSdW5uZXJCdWlsZGVyLmphdmEgYi90ZXN0cy9jb3JlL3J1bm5lci9zcmMvY29tL2FuZHJvaWQvY3RzL2NvcmUvcnVubmVyL3N1cHBvcnQvRXh0ZW5kZWRBbmRyb2lkUnVubmVyQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmY5NWUyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL2NvcmUvcnVubmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvY29yZS9ydW5uZXIvc3VwcG9ydC9FeHRlbmRlZEFuZHJvaWRSdW5uZXJCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5jdHMuY29yZS5ydW5uZXIuc3VwcG9ydDsKLQotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmludGVybmFsLnV0aWwuQW5kcm9pZFJ1bm5lclBhcmFtczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLm1vZGVsLlJ1bm5lckJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5uZXI7Ci0KLS8qKgotICogRXh0ZW5kcyB7QGxpbmsgQW5kcm9pZFJ1bm5lckJ1aWxkZXJ9IGluIG9yZGVyIHRvIHByb3ZpZGUgYWx0ZXJuYXRlIHtAbGluayBSdW5uZXJCdWlsZGVyfQotICogaW1wbGVtZW50YXRpb25zLgotICovCi1wdWJsaWMgY2xhc3MgRXh0ZW5kZWRBbmRyb2lkUnVubmVyQnVpbGRlciBleHRlbmRzIEFuZHJvaWRSdW5uZXJCdWlsZGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgZmluYWwgVGVzdE5nUnVubmVyQnVpbGRlciBtVGVzdE5nQnVpbGRlcjsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBydW5uZXJQYXJhbXMge0BsaW5rIEFuZHJvaWRSdW5uZXJQYXJhbXN9IHRoYXQgc3RvcmVzIGNvbW1vbiBydW5uZXIgcGFyYW1ldGVycwotICAgICAqLwotICAgIHB1YmxpYyBFeHRlbmRlZEFuZHJvaWRSdW5uZXJCdWlsZGVyKEFuZHJvaWRSdW5uZXJQYXJhbXMgcnVubmVyUGFyYW1zKSB7Ci0gICAgICAgIHN1cGVyKHJ1bm5lclBhcmFtcywgZmFsc2UgLyogQ1RTdjEgZmlsdGVyZWQgb3V0IFRlc3Qgc3VpdGUoKSBjbGFzc2VzLiAqLyk7Ci0gICAgICAgIG1UZXN0TmdCdWlsZGVyID0gbmV3IFRlc3ROZ1J1bm5lckJ1aWxkZXIoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUnVubmVyIHJ1bm5lckZvckNsYXNzKENsYXNzPD8+IHRlc3RDbGFzcykgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgTG9nLmQoIkV4QW5kUnVuQnVpbGQiLCAicnVubmVyRm9yQ2xhc3M6IFNlYXJjaGluZyBydW5uZXIgZm9yIGNsYXNzICIgKyB0ZXN0Q2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgIH0KLQotICAgICAgLy8gR2l2ZSBUZXN0TkcgdGVzdHMgYSBjaGFuY2UgdG8gcGFydGljaXBhdGUgaW4gdGhlIFJ1bm5lciBzZWFyY2ggZmlyc3QuCi0gICAgICAvLyAoTm90ZSB0aGF0IHRoZSBUZXN0TkcgcnVubmVyIGhhbmRsZXMgbG9nLW9ubHkgcnVucyBieSBpdHNlbGYpCi0gICAgICBSdW5uZXIgcnVubmVyID0gbVRlc3ROZ0J1aWxkZXIucnVubmVyRm9yQ2xhc3ModGVzdENsYXNzKTsKLSAgICAgIGlmIChydW5uZXIgPT0gbnVsbCkgewotICAgICAgICAvLyBVc2UgdGhlIG5vcm1hbCBSdW5uZXIgc2VhcmNoIG1lY2hhbmlzbSAoZm9yIEp1bml0IHRlc3RzKS4KLSAgICAgICAgcnVubmVyID0gc3VwZXIucnVubmVyRm9yQ2xhc3ModGVzdENsYXNzKTsKLSAgICAgIH0KLQotICAgICAgbG9nRm91bmRSdW5uZXIocnVubmVyKTsKLSAgICAgIHJldHVybiBydW5uZXI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2dGb3VuZFJ1bm5lcihSdW5uZXIgcnVubmVyKSB7Ci0gICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgTG9nLmQoIkV4QW5kUnVuQnVpbGQiLCAicnVubmVyRm9yQ2xhc3M6IEZvdW5kIHJ1bm5lciBvZiB0eXBlICIgKwotICAgICAgICAgICAgKChydW5uZXIgPT0gbnVsbCkgPyAiPG51bGw+IiA6IHJ1bm5lci5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL2NvcmUvcnVubmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvY29yZS9ydW5uZXIvc3VwcG9ydC9wYWNrYWdlLWluZm8uamF2YSBiL3Rlc3RzL2NvcmUvcnVubmVyL3NyYy9jb20vYW5kcm9pZC9jdHMvY29yZS9ydW5uZXIvc3VwcG9ydC9wYWNrYWdlLWluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NjZWMzYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9jb3JlL3J1bm5lci9zcmMvY29tL2FuZHJvaWQvY3RzL2NvcmUvcnVubmVyL3N1cHBvcnQvcGFja2FnZS1pbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBDb250YWlucyBhbGwgdGhlIGNoYW5nZXMgbmVlZGVkIHRvIHRoZSB7QGNvZGUgYW5kcm9pZC5zdXBwb3J0LnRlc3QuaW50ZXJuYWwucnVubmVyfSBjbGFzc2VzLgotICoKLSAqIDxwPkFzIGl0cyBuYW1lIHN1Z2dlc3RzIHtAY29kZSBhbmRyb2lkLnN1cHBvcnQudGVzdC5pbnRlcm5hbC5ydW5uZXJ9IGFyZSBpbnRlcm5hbCBjbGFzc2VzIHRoYXQKLSAqIGFyZSBub3QgZGVzaWduZWQgdG8gYmUgZXh0ZW5kZWQgZnJvbSBvdXRzaWRlIHRob3NlIHBhY2thZ2VzLiBUaGlzIHBhY2thZ2UgZW5jYXBzdWxhdGVzIGFsbCB0aGUKLSAqIHdvcmthcm91bmRzIG5lZWRlZCB0byBvdmVyY29tZSB0aGF0IGxpbWl0YXRpb24sIGZyb20gZHVwbGljYXRpbmcgY2xhc3NlcyB0byB1c2luZyByZWZsZWN0aW9uLgotICogVGhlIGludGVudGlvbiBpcyB0aGF0IHRoZXNlIGNoYW5nZXMgYXJlIHRlbXBvcmFyeSBhbmQgdGhleSAob3IgYSBiZXR0ZXIgZXF1aXZhbGVudCkgd2lsbCBiZQotICogcXVpY2tseSBpbnRlZ3JhdGVkIGludG8gdGhlIGludGVybmFsIGNsYXNzZXMuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuY3RzLmNvcmUucnVubmVyLnN1cHBvcnQ7CmRpZmYgLS1naXQgYS90ZXN0cy9kcmFtL0FuZHJvaWQubWsgYi90ZXN0cy9kcmFtL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMjFjZGMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvZHJhbS9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotIyBkb24ndCBpbmNsdWRlIHRoaXMgcGFja2FnZSBpbiBhbnkgdGFyZ2V0Ci1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotCi0jIEluY2x1ZGUgYm90aCB0aGUgMzIgYW5kIDY0IGJpdCB2ZXJzaW9ucwotTE9DQUxfTVVMVElMSUIgOj0gYm90aAotCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbCBjdHN0ZXN0cnVubmVyCi0KLUxPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmN0c2RyYW1fam5pCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKLQotTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0RyYW1UZXN0Q2FzZXMKLQotIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKLQotTE9DQUxfU0RLX1ZFUlNJT04gOj0gMTYKLQotaW5jbHVkZSAkKEJVSUxEX0NUU19QQUNLQUdFKQotCi1pbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCmRpZmYgLS1naXQgYS90ZXN0cy9kcmFtL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9kcmFtL0FuZHJvaWRNYW5pZmVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0M2ZlNzkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvZHJhbS9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgcGFja2FnZT0iYW5kcm9pZC5kcmFtLmN0cyI+Ci0KLSAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkRJU0FCTEVfS0VZR1VBUkQiIC8+Ci0gICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9FWFRFUk5BTF9TVE9SQUdFIiAvPgotCi0gICAgPGFwcGxpY2F0aW9uPgotICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KLSAgICA8L2FwcGxpY2F0aW9uPgotICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgotICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmRyYW0uY3RzIgotICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iRFJBTSBiYW5kd2lkdGggbWVhc3VyZW1lbnQiIC8+Ci08L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvZHJhbS9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy9kcmFtL0FuZHJvaWRUZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM2YzhjMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9kcmFtL0FuZHJvaWRUZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgRHJhbSB0ZXN0IGNhc2VzIj4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9InN5c3RlbXMiIC8+Ci0gICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0RyYW1UZXN0Q2FzZXMuYXBrIiAvPgotICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgotICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5BbmRyb2lkSlVuaXRUZXN0IiA+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0icGFja2FnZSIgdmFsdWU9ImFuZHJvaWQuZHJhbS5jdHMiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0icnVudGltZS1oaW50IiB2YWx1ZT0iOG0iIC8+Ci0gICAgPC90ZXN0PgotPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvZHJhbS9qbmkvQW5kcm9pZC5tayBiL3Rlc3RzL2RyYW0vam5pL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMjFhYWEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvZHJhbS9qbmkvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEUgICAgOj0gbGliY3RzZHJhbV9qbmkKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfU1JDX0ZJTEVTIDo9IE1lbW9yeU5hdGl2ZUpuaS5jcHAKLQotTE9DQUxfQ19JTkNMVURFUyA6PSAkKEpOSV9IX0lOQ0xVREUpCi0KLUxPQ0FMX1NES19WRVJTSU9OIDo9IDE0Ci0KLUxPQ0FMX0NGTEFHUyA6PSAtV25vLXVudXNlZC1wYXJhbWV0ZXIKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZHJhbS9qbmkvTWVtb3J5TmF0aXZlSm5pLmNwcCBiL3Rlc3RzL2RyYW0vam5pL01lbW9yeU5hdGl2ZUpuaS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiZjE0NWMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvZHJhbS9qbmkvTWVtb3J5TmF0aXZlSm5pLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8am5pLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLQotZG91YmxlIGN1cnJlbnRUaW1lTWlsbGlzKCkKLXsKLSAgICBzdHJ1Y3QgdGltZXZhbCB0djsKLSAgICBnZXR0aW1lb2ZkYXkoJnR2LCAoc3RydWN0IHRpbWV6b25lICopIE5VTEwpOwotICAgIHJldHVybiB0di50dl9zZWMgKiAxMDAwLjAgKyB0di50dl91c2VjIC8gMTAwMC4wOwotfQotCi1leHRlcm4gIkMiIEpOSUVYUE9SVCBqZG91YmxlIEpOSUNBTEwgSmF2YV9hbmRyb2lkX2RyYW1fY3RzX01lbW9yeU5hdGl2ZV9ydW5NZW1jcHkoSk5JRW52KiBlbnYsCi0gICAgICAgIGpjbGFzcyBjbGF6eiwgamludCBidWZmZXJTaXplLCBqaW50IHJlcGV0aXRpb24pCi17Ci0gICAgY2hhciogc3JjID0gbmV3IGNoYXJbYnVmZmVyU2l6ZV07Ci0gICAgY2hhciogZHN0ID0gbmV3IGNoYXJbYnVmZmVyU2l6ZV07Ci0gICAgaWYgKChzcmMgPT0gTlVMTCkgfHwgKGRzdCA9PSBOVUxMKSkgewotICAgICAgICBkZWxldGVbXSBzcmM7Ci0gICAgICAgIGRlbGV0ZVtdIGRzdDsKLSAgICAgICAgZW52LT5UaHJvd05ldyhlbnYtPkZpbmRDbGFzcygiamF2YS9sYW5nL091dE9mTWVtb3J5RXJyb3IiKSwgIk5vIG1lbW9yeSIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIG1lbXNldChzcmMsIDAsIGJ1ZmZlclNpemUpOwotICAgIG1lbXNldChkc3QsIDAsIGJ1ZmZlclNpemUpOwotICAgIGRvdWJsZSBzdGFydCA9IGN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBldGl0aW9uOyBpKyspIHsKLSAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCBidWZmZXJTaXplKTsKLSAgICAgICAgc3JjW2J1ZmZlclNpemUgLSAxXSA9IGkgJiAweGZmOwotICAgIH0KLSAgICBkb3VibGUgZW5kID0gY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICBkZWxldGVbXSBzcmM7Ci0gICAgZGVsZXRlW10gZHN0OwotICAgIHJldHVybiBlbmQgLSBzdGFydDsKLX0KLQotZXh0ZXJuICJDIiBKTklFWFBPUlQgamRvdWJsZSBKTklDQUxMIEphdmFfYW5kcm9pZF9kcmFtX2N0c19NZW1vcnlOYXRpdmVfcnVuTWVtc2V0KEpOSUVudiogZW52LAotICAgICAgICBqY2xhc3MgY2xhenosIGppbnQgYnVmZmVyU2l6ZSwgamludCByZXBldGl0aW9uLCBqaW50IGMpCi17Ci0gICAgY2hhciogZHN0ID0gbmV3IGNoYXJbYnVmZmVyU2l6ZV07Ci0gICAgaWYgKGRzdCA9PSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZVtdIGRzdDsKLSAgICAgICAgZW52LT5UaHJvd05ldyhlbnYtPkZpbmRDbGFzcygiamF2YS9sYW5nL091dE9mTWVtb3J5RXJyb3IiKSwgIk5vIG1lbW9yeSIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIG1lbXNldChkc3QsIDAsIGJ1ZmZlclNpemUpOwotICAgIGRvdWJsZSBzdGFydCA9IGN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBldGl0aW9uOyBpKyspIHsKLSAgICAgICAgbWVtc2V0KGRzdCwgKGMgKyBpKSAmIDB4ZmYsIGJ1ZmZlclNpemUpOwotICAgIH0KLSAgICBkb3VibGUgZW5kID0gY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICBkZWxldGVbXSBkc3Q7Ci0gICAgcmV0dXJuIGVuZCAtIHN0YXJ0OwotfQotCmRpZmYgLS1naXQgYS90ZXN0cy9kcmFtL3NyYy9hbmRyb2lkL2RyYW0vY3RzL0JhbmR3aWR0aFRlc3QuamF2YSBiL3Rlc3RzL2RyYW0vc3JjL2FuZHJvaWQvZHJhbS9jdHMvQmFuZHdpZHRoVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjU0ZDkwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL2RyYW0vc3JjL2FuZHJvaWQvZHJhbS9jdHMvQmFuZHdpZHRoVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuZHJhbS5jdHM7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkN0c0FuZHJvaWRUZXN0Q2FzZTsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkRldmljZVJlcG9ydExvZzsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlJlc3VsdFR5cGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5SZXN1bHRVbml0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuU3RhdDsKLQotLyoqCi0gKiBjaGVjayBob3cgbWFueSBzY3JlZW5zIHRoZSBtZW1jcHkgZnVuY3Rpb24gY2FuIGNvcHkgaW4gYSBzZWMuCi0gKiBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCByZXByZXNlbnQgdGhlIHRvdGFsIG1lbW9yeSBiYW5kd2lkdGggYXZhaWxhYmxlIGluIHRoZSBzeXN0ZW0KLSAqIGFzIHR5cGljYWxseSBDUFUgY2Fubm90IHVzZSB0aGUgd2hvbGUgYmFuZHdpZHRoLgotICogU21hbGxlciBidWZmZXJzIGNhbiBmaXQgaW50byBMMSBvciBMMiBjYWNoZSwgd2hpY2ggY2FuIHNob3cgYmlnIGJvb3N0LgotICovCi1wdWJsaWMgY2xhc3MgQmFuZHdpZHRoVGVzdCBleHRlbmRzIEN0c0FuZHJvaWRUZXN0Q2FzZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IEJhbmR3aWR0aFRlc3QuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBPUlRfTE9HX05BTUUgPSAiQ3RzRHJhbVRlc3RDYXNlcyI7Ci0gICAgLy8gZGF0YSBsZW5ndGggaXMgb2RkIHRvIHByZXZlbnQgcmFyZSBjYXNlcyB0aGF0IGFsbCBkYXRhIGFyZSByZWplY3RlZC4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVNQ1BZX1JFUEVUSVRJT04gPSAxMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVNU0VUX1JFUEVUSVRJT04gPSAzMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVQRUFUX0lOX0VBQ0hfQ0FMTCA9IDEwMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgS0IgPSAxMDI0OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQiA9IDEwMjQgKiAxMDI0OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRU1TRVRfQ0hBUiA9IDB4YTU7Ci0gICAgLy8gcmVqZWN0IGRhdGEgb3V0c2lkZSArLy0gdGhpcyB2YWx1ZSAqIG1lZGlhbgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZSBPVVRMSUVSX1RIUkVTSE9MRCA9IDAuMTsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIC8vIHdhcm0tdXAKLSAgICAgICAgTWVtb3J5TmF0aXZlLnJ1bk1lbWNweSgyICogTUIsIDEwMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1lbWNweUswMDQoKSB7Ci0gICAgICAgIGRvUnVuTWVtY3B5KDQgKiBLQik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1lbWNweUswMDgoKSB7Ci0gICAgICAgIGRvUnVuTWVtY3B5KDggKiBLQik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1lbWNweUswMTYoKSB7Ci0gICAgICAgIGRvUnVuTWVtY3B5KDE2ICogS0IpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZW1jcHlLMDMyKCkgewotICAgICAgICBkb1J1bk1lbWNweSgzMiAqIEtCKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWVtY3B5SzA2NCgpIHsKLSAgICAgICAgZG9SdW5NZW1jcHkoNjQgKiBLQik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1lbWNweUsxMjgoKSB7Ci0gICAgICAgIGRvUnVuTWVtY3B5KDEyOCAqIEtCKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWVtY3B5SzI1NigpIHsKLSAgICAgICAgZG9SdW5NZW1jcHkoMjU2ICogS0IpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZW1jcHlLNTEyKCkgewotICAgICAgICBkb1J1bk1lbWNweSg1MTIgKiBLQik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1lbWNweU0wMDEoKSB7Ci0gICAgICAgIGRvUnVuTWVtY3B5KDEgKiBNQik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1lbWNweU0wMDIoKSB7Ci0gICAgICAgIGRvUnVuTWVtY3B5KDIgKiBNQik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1lbWNweU0wMDQoKSB7Ci0gICAgICAgIGRvUnVuTWVtY3B5KDQgKiBNQik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1lbWNweU0wMDgoKSB7Ci0gICAgICAgIGRvUnVuTWVtY3B5KDggKiBNQik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1lbWNweU0wMTYoKSB7Ci0gICAgICAgIGRvUnVuTWVtY3B5KDE2ICogTUIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZW1zZXRLMDA0KCkgewotICAgICAgICBkb1J1bk1lbXNldCg0ICogS0IpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZW1zZXRLMDA4KCkgewotICAgICAgICBkb1J1bk1lbXNldCg4ICogS0IpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZW1zZXRLMDE2KCkgewotICAgICAgICBkb1J1bk1lbXNldCgxNiAqIEtCKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWVtc2V0SzAzMigpIHsKLSAgICAgICAgZG9SdW5NZW1zZXQoMzIgKiBLQik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1lbXNldEswNjQoKSB7Ci0gICAgICAgIGRvUnVuTWVtc2V0KDY0ICogS0IpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZW1zZXRLMTI4KCkgewotICAgICAgICBkb1J1bk1lbXNldCgxMjggKiBLQik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1lbXNldEsyNTYoKSB7Ci0gICAgICAgIGRvUnVuTWVtc2V0KDI1NiAqIEtCKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWVtc2V0SzUxMigpIHsKLSAgICAgICAgZG9SdW5NZW1zZXQoNTEyICogS0IpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZW1zZXRNMDAxKCkgewotICAgICAgICBkb1J1bk1lbXNldCgxICogTUIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZW1zZXRNMDAyKCkgewotICAgICAgICBkb1J1bk1lbXNldCgyICogTUIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZW1zZXRNMDA0KCkgewotICAgICAgICBkb1J1bk1lbXNldCg0ICogTUIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZW1zZXRNMDA4KCkgewotICAgICAgICBkb1J1bk1lbXNldCg4ICogTUIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZW1zZXRNMDE2KCkgewotICAgICAgICBkb1J1bk1lbXNldCgxNiAqIE1CKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZG9SdW5NZW1jcHkoaW50IGJ1ZmZlclNpemUpIHsKLSAgICAgICAgZG91YmxlW10gcmVzdWx0ID0gbmV3IGRvdWJsZVtNRU1DUFlfUkVQRVRJVElPTl07Ci0gICAgICAgIGludCByZXBlYXRJbkVhY2hDYWxsID0gUkVQRUFUX0lOX0VBQ0hfQ0FMTDsKLSAgICAgICAgaWYgKGJ1ZmZlclNpemUgPCAoMSAqIE1CKSkgewotICAgICAgICAgICAgLy8gdG9vIHNtYWxsIGJ1ZmZlciBzaXplIGZpbmlzaGVzIHRvbyBlYXJseSB0byBnaXZlIGFjY3VyYXRlIHJlc3VsdC4KLSAgICAgICAgICAgIHJlcGVhdEluRWFjaENhbGwgKj0gKDEgKiBNQiAvIGJ1ZmZlclNpemUpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUVNQ1BZX1JFUEVUSVRJT047IGkrKykgewotICAgICAgICAgICAgcmVzdWx0W2ldID0gTWVtb3J5TmF0aXZlLnJ1bk1lbWNweShidWZmZXJTaXplLCByZXBlYXRJbkVhY2hDYWxsKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgc3RyZWFtTmFtZSA9ICJydW5fbWVtY3B5IjsKLSAgICAgICAgRGV2aWNlUmVwb3J0TG9nIHJlcG9ydCA9IG5ldyBEZXZpY2VSZXBvcnRMb2coUkVQT1JUX0xPR19OQU1FLCBzdHJlYW1OYW1lKTsKLSAgICAgICAgcmVwb3J0LmFkZFZhbHVlKCJidWZmZXJfc2l6ZSIsIGJ1ZmZlclNpemUsIFJlc3VsdFR5cGUuTkVVVFJBTCwgUmVzdWx0VW5pdC5OT05FKTsKLSAgICAgICAgcmVwb3J0LmFkZFZhbHVlcygibWVtY3B5X3RpbWUiLCByZXN1bHQsIFJlc3VsdFR5cGUuTE9XRVJfQkVUVEVSLCBSZXN1bHRVbml0Lk1TKTsKLSAgICAgICAgZG91YmxlW10gbWJwcyA9IFN0YXQuY2FsY1JhdGVQZXJTZWNBcnJheSgKLSAgICAgICAgICAgICAgICAoZG91YmxlKWJ1ZmZlclNpemUgKiByZXBlYXRJbkVhY2hDYWxsIC8gMTAyNC4wIC8gMTAyNC4wLCByZXN1bHQpOwotICAgICAgICByZXBvcnQuYWRkVmFsdWVzKCJtZW1jcHlfdGhyb3VnaHB1dCIsIG1icHMsIFJlc3VsdFR5cGUuSElHSEVSX0JFVFRFUiwgUmVzdWx0VW5pdC5NQlBTKTsKLSAgICAgICAgU3RhdC5TdGF0UmVzdWx0IHN0YXQgPSBTdGF0LmdldFN0YXRXaXRoT3V0bGllclJlamVjdGlvbihtYnBzLCBPVVRMSUVSX1RIUkVTSE9MRCk7Ci0gICAgICAgIGlmIChzdGF0Lm1EYXRhQ291bnQgIT0gcmVzdWx0Lmxlbmd0aCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAicmVqZWN0aW5nICIgKyAocmVzdWx0Lmxlbmd0aCAtIHN0YXQubURhdGFDb3VudCkgKyAiIG91dGxpZXJzIik7Ci0gICAgICAgIH0KLSAgICAgICAgV2luZG93TWFuYWdlciB3bSA9IChXaW5kb3dNYW5hZ2VyKSBnZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LldJTkRPV19TRVJWSUNFKTsKLSAgICAgICAgUG9pbnQgc2l6ZSA9IG5ldyBQb2ludCgpOwotICAgICAgICB3bS5nZXREZWZhdWx0RGlzcGxheSgpLmdldFNpemUoc2l6ZSk7Ci0gICAgICAgIExvZy5pKFRBRywgIiB4ICIgKyBzaXplLnggKyAiIHkgIiArIHNpemUueSk7Ci0gICAgICAgIGRvdWJsZSBwaXhlbHMgPSBzaXplLnggKiBzaXplLnk7Ci0gICAgICAgIC8vIG5vdyB0aGlzIHJlcHJlc2VudHMgaG93IG1hbnkgdGltZXMgdGhlIHdob2xlIHNjcmVlbiBjYW4gYmUgY29waWVkIGluIGEgc2VjLgotICAgICAgICBkb3VibGUgc2NyZWVuc1BlclNlY0F2ZXJhZ2UgPSBzdGF0Lm1BdmVyYWdlIC8gcGl4ZWxzICogMTAyNC4wICogMTAyNC4wIC8gNC4wOwotICAgICAgICByZXBvcnQuYWRkVmFsdWUoIm1lbWNweV9pbl9mcHMiLCBzY3JlZW5zUGVyU2VjQXZlcmFnZSwgUmVzdWx0VHlwZS5ISUdIRVJfQkVUVEVSLAotICAgICAgICAgICAgICAgIFJlc3VsdFVuaXQuRlBTKTsKLSAgICAgICAgcmVwb3J0LnNldFN1bW1hcnkoIm1lbWNweV90aHJvdWdocHV0X2F2ZXJhZ2UiLCBzdGF0Lm1BdmVyYWdlLCBSZXN1bHRUeXBlLkhJR0hFUl9CRVRURVIsCi0gICAgICAgICAgICAgICAgUmVzdWx0VW5pdC5NQlBTKTsKLSAgICAgICAgcmVwb3J0LnN1Ym1pdChnZXRJbnN0cnVtZW50YXRpb24oKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRvUnVuTWVtc2V0KGludCBidWZmZXJTaXplKSB7Ci0gICAgICAgIGRvdWJsZVtdIHJlc3VsdCA9IG5ldyBkb3VibGVbTUVNU0VUX1JFUEVUSVRJT05dOwotICAgICAgICBpbnQgcmVwZWF0SW5FYWNoQ2FsbCA9IFJFUEVBVF9JTl9FQUNIX0NBTEw7Ci0gICAgICAgIGlmIChidWZmZXJTaXplIDwgKDEgKiBNQikpIHsKLSAgICAgICAgICAgIC8vIHRvbyBzbWFsbCBidWZmZXIgc2l6ZSBmaW5pc2hlcyB0b28gZWFybHkgdG8gZ2l2ZSBhY2N1cmF0ZSByZXN1bHQuCi0gICAgICAgICAgICByZXBlYXRJbkVhY2hDYWxsICo9ICgxICogTUIgLyBidWZmZXJTaXplKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1FTVNFVF9SRVBFVElUSU9OOyBpKyspIHsKLSAgICAgICAgICAgIHJlc3VsdFtpXSA9IE1lbW9yeU5hdGl2ZS5ydW5NZW1zZXQoYnVmZmVyU2l6ZSwgcmVwZWF0SW5FYWNoQ2FsbCwgTUVNU0VUX0NIQVIpOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBzdHJlYW1OYW1lID0gInJ1bl9tZW1zZXQiOwotICAgICAgICBEZXZpY2VSZXBvcnRMb2cgcmVwb3J0ID0gbmV3IERldmljZVJlcG9ydExvZyhSRVBPUlRfTE9HX05BTUUsIHN0cmVhbU5hbWUpOwotICAgICAgICByZXBvcnQuYWRkVmFsdWUoImJ1ZmZlcl9zaXplIiwgYnVmZmVyU2l6ZSwgUmVzdWx0VHlwZS5ORVVUUkFMLCBSZXN1bHRVbml0Lk5PTkUpOwotICAgICAgICByZXBvcnQuYWRkVmFsdWVzKCJtZW1zZXRfdGltZSIsIHJlc3VsdCwgUmVzdWx0VHlwZS5MT1dFUl9CRVRURVIsIFJlc3VsdFVuaXQuTVMpOwotICAgICAgICBkb3VibGVbXSBtYnBzID0gU3RhdC5jYWxjUmF0ZVBlclNlY0FycmF5KAotICAgICAgICAgICAgICAgIChkb3VibGUpYnVmZmVyU2l6ZSAqIHJlcGVhdEluRWFjaENhbGwgLyAxMDI0LjAgLyAxMDI0LjAsIHJlc3VsdCk7Ci0gICAgICAgIHJlcG9ydC5hZGRWYWx1ZXMoIm1lbXNldF90aHJvdWdocHV0IiwgbWJwcywgUmVzdWx0VHlwZS5ISUdIRVJfQkVUVEVSLCBSZXN1bHRVbml0Lk1CUFMpOwotICAgICAgICBTdGF0LlN0YXRSZXN1bHQgc3RhdCA9IFN0YXQuZ2V0U3RhdFdpdGhPdXRsaWVyUmVqZWN0aW9uKG1icHMsIE9VVExJRVJfVEhSRVNIT0xEKTsKLSAgICAgICAgaWYgKHN0YXQubURhdGFDb3VudCAhPSByZXN1bHQubGVuZ3RoKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJyZWplY3RpbmcgIiArIChyZXN1bHQubGVuZ3RoIC0gc3RhdC5tRGF0YUNvdW50KSArICIgb3V0bGllcnMiKTsKLSAgICAgICAgfQotICAgICAgICBXaW5kb3dNYW5hZ2VyIHdtID0gKFdpbmRvd01hbmFnZXIpIGdldENvbnRleHQoKS5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuV0lORE9XX1NFUlZJQ0UpOwotICAgICAgICBQb2ludCBzaXplID0gbmV3IFBvaW50KCk7Ci0gICAgICAgIHdtLmdldERlZmF1bHREaXNwbGF5KCkuZ2V0U2l6ZShzaXplKTsKLSAgICAgICAgTG9nLmkoVEFHLCAiIHggIiArIHNpemUueCArICIgeSAiICsgc2l6ZS55KTsKLSAgICAgICAgZG91YmxlIHBpeGVscyA9IHNpemUueCAqIHNpemUueTsKLSAgICAgICAgLy8gbm93IHRoaXMgcmVwcmVzZW50cyBob3cgbWFueSB0aW1lcyB0aGUgd2hvbGUgc2NyZWVuIGNhbiBiZSBjb3BpZWQgaW4gYSBzZWMuCi0gICAgICAgIGRvdWJsZSBzY3JlZW5zUGVyU2VjQXZlcmFnZSA9IHN0YXQubUF2ZXJhZ2UgLyBwaXhlbHMgKiAxMDI0LjAgKiAxMDI0LjAgLyA0LjA7Ci0gICAgICAgIHJlcG9ydC5hZGRWYWx1ZSgibWVtc2V0X2luX2ZwcyIsIHNjcmVlbnNQZXJTZWNBdmVyYWdlLCBSZXN1bHRUeXBlLkhJR0hFUl9CRVRURVIsCi0gICAgICAgICAgICAgICAgUmVzdWx0VW5pdC5GUFMpOwotICAgICAgICByZXBvcnQuc2V0U3VtbWFyeSgibWVtc2V0X3Rocm91Z2hwdXRfYXZlcmFnZSIsIHN0YXQubUF2ZXJhZ2UsIFJlc3VsdFR5cGUuSElHSEVSX0JFVFRFUiwKLSAgICAgICAgICAgICAgICBSZXN1bHRVbml0Lk1CUFMpOwotICAgICAgICByZXBvcnQuc3VibWl0KGdldEluc3RydW1lbnRhdGlvbigpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9kcmFtL3NyYy9hbmRyb2lkL2RyYW0vY3RzL01lbW9yeU5hdGl2ZS5qYXZhIGIvdGVzdHMvZHJhbS9zcmMvYW5kcm9pZC9kcmFtL2N0cy9NZW1vcnlOYXRpdmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZhNGM0Ni4uMDAwMDAwMAotLS0gYS90ZXN0cy9kcmFtL3NyYy9hbmRyb2lkL2RyYW0vY3RzL01lbW9yeU5hdGl2ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5kcmFtLmN0czsKLQotcHVibGljIGNsYXNzIE1lbW9yeU5hdGl2ZSB7Ci0gICAgc3RhdGljIHsKLSAgICAgICAgU3lzdGVtLmxvYWRMaWJyYXJ5KCJjdHNkcmFtX2puaSIpOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBydW4gbWVtY3B5IGZvciBnaXZlbiBudW1iZXIgb2YgcmVwZXRpdGlvbiBmcm9tIGEgc291cmNlIHRvIGEgZGVzdGluYXRpb24gYnVmZmVycwotICAgICAqIHdpdGggZWFjaCBoYXZpbmcgdGhlIHNpemUgb2YgYnVmZmVyU2l6ZS4KLSAgICAgKiBAcGFyYW0gYnVmZmVyU2l6ZQotICAgICAqIEBwYXJhbSByZXBldGl0aW9uCi0gICAgICogQHJldHVybiB0aW1lIHNwZW50IGluIGNvcHlpbmcgaW4gbXMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIHJ1bk1lbWNweShpbnQgYnVmZmVyU2l6ZSwgaW50IHJlcGV0aXRpb24pOwotCi0gICAgLyoqCi0gICAgICogcnVuIG1lbXNldCBmb3IgZ2l2ZW4gbnVtYmVyIG9mIHJlcGV0aXRpb24gZnJvbSBhIHNvdXJjZSB0byBhIGRlc3RpbmF0aW9uIGJ1ZmZlcnMKLSAgICAgKiB3aXRoIGVhY2ggaGF2aW5nIHRoZSBzaXplIG9mIGJ1ZmZlclNpemUuCi0gICAgICogQHBhcmFtIGJ1ZmZlclNpemUKLSAgICAgKiBAcGFyYW0gcmVwZXRpdGlvbgotICAgICAqIEBwYXJhbSBjIGNoYXIgdG8gc2V0LiBPbmx5IExTQnMgd2lsbCBiZSB1c2VkIHRvIGdldCBjaGFyIHZhbHVlLgotICAgICAqIEByZXR1cm4gdGltZSBzcGVudCBpbiBtZW1zZXQgaW4gbXMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIHJ1bk1lbXNldChpbnQgYnVmZmVyU2l6ZSwgaW50IHJlcGV0aXRpb24sIGludCBjKTsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL2V4cGVjdGF0aW9ucy9rbm93bmZhaWx1cmVzLnR4dCBiL3Rlc3RzL2V4cGVjdGF0aW9ucy9rbm93bmZhaWx1cmVzLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhjMmE1ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9leHBlY3RhdGlvbnMva25vd25mYWlsdXJlcy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyODIgKzAsMCBAQAotWwotewotICBkZXNjcmlwdGlvbjogIkRpc2FibGUgTGlzdGVuaW5nUG9ydHNUZXN0IiwKLSAgbmFtZXM6IFsKLSAgICAiYW5kcm9pZC5zZWN1cml0eS5jdHMuTGlzdGVuaW5nUG9ydHNUZXN0IgotICBdLAotICBidWc6IDMxODAzNjMwCi19LAotewotICBkZXNjcmlwdGlvbjogInNvbWUgQWxhcm1DbG9ja1Rlc3RzIGFyZSBub3Qgcm9idXN0IGFjcm9zcyBkaWZmZXJlbnQgZGV2aWNlIHR5cGVzIiwKLSAgbmFtZXM6IFsKLSAgICAiYW5kcm9pZC5hbGFybWNsb2NrLmN0cy5EaXNtaXNzQWxhcm1UZXN0I3Rlc3RBbGwiLAotICAgICJhbmRyb2lkLmFsYXJtY2xvY2suY3RzLlNldEFsYXJtVGVzdCN0ZXN0QWxsIiwKLSAgICAiYW5kcm9pZC5hbGFybWNsb2NrLmN0cy5Tbm9vemVBbGFybVRlc3QjdGVzdEFsbCIKLSAgXSwKLSAgYnVnOiAyMzc3NjA4MwotfSwKLXsKLSAgZGVzY3JpcHRpb246ICJ0aGUgVXNhZ2VTdGF0cyBpcyBub3QgeWV0IHN0YWJsZSBlbm91Z2giLAotICBuYW1lczogWwotICAgICJhbmRyb2lkLmFwcC51c2FnZS5jdHMuVXNhZ2VTdGF0c1Rlc3QiCi0gIF0sCi0gIGJ1ZzogMTc1MzYxMTMKLX0sCi17Ci0gIGRlc2NyaXB0aW9uOiAidGhlIENvbm5lY3Rpdml0eUNvbnN0cmFpbnRUZXN0IGFyZSBub3QgeWV0IHN0YWJsZSIsCi0gIG5hbWVzOiBbCi0gICAgImFuZHJvaWQuam9ic2NoZWR1bGVyLmN0cy5Db25uZWN0aXZpdHlDb25zdHJhaW50VGVzdCIKLSAgXSwKLSAgYnVnOiAxODExNzI3OQotfSwKLXsKLSAgZGVzY3JpcHRpb246ICJ0ZXN0cyBhIGZyYWdpbGUgYnkgbmF0dXJlIGFzIHRoZXkgcmVseSBvbiBoYXJkY29kZWQgYmVoYXZpb3IiLAotICBuYW1lczogWwotICAgICJhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLmN0cy5BY2Nlc3NpYmlsaXR5VGV4dFRyYXZlcnNhbFRlc3QjdGVzdEFjdGlvbk5leHRBbmRQcmV2aW91c0F0R3JhbnVsYXJpdHlQYWdlT3ZlclRleHQiLAotICAgICJhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLmN0cy5BY2Nlc3NpYmlsaXR5VGV4dFRyYXZlcnNhbFRlc3QjdGVzdEFjdGlvbk5leHRBbmRQcmV2aW91c0F0R3JhbnVsYXJpdHlQYWdlT3ZlclRleHRFeHRlbmQiCi0gIF0sCi0gIGJ1ZzogMTc1OTUwNTAKLX0sCi17Ci0gIGRlc2NyaXB0aW9uOiAidGVzdCBmYWlscyBvbiBzb21lIGRldmljZXMiLAotICBuYW1lczogWwotICAgICJhbmRyb2lkLmR1bXBzeXMuY3RzLkR1bXBzeXNIb3N0VGVzdCN0ZXN0QmF0dGVyeXN0YXRzT3V0cHV0IiwKLSAgICAiYW5kcm9pZC5kdW1wc3lzLmN0cy5EdW1wc3lzSG9zdFRlc3QjdGVzdEdmeGluZm9GcmFtZXN0YXRzIgotICBdLAotICBidWc6IDIzNzc2ODkzCi19LAotewotICBkZXNjcmlwdGlvbjogInRoZSBTU0xDZXJ0aWZpY2F0ZVNvY2tldEZhY3RvcnlUZXN0IG9mdGVuIGZhaWxzIGJlY2F1c2Ugb2YgbGFjayBvZiBsaXZlIGludGVybmV0IG9yIHNob3J0IHRpbWVvdXQsIGl0IHNob3VsZCBiZSByZWZhY3RvcmVkIHRvIGRvIGEgbG9jYWwgc2VydmVyIHRlc3RpbmciLAotICBuYW1lczogWwotICAgICJhbmRyb2lkLm5ldC5jdHMuU1NMQ2VydGlmaWNhdGVTb2NrZXRGYWN0b3J5VGVzdCN0ZXN0Q3JlYXRlU29ja2V0IiwKLSAgICAiYW5kcm9pZC5uZXQuY3RzLlNTTENlcnRpZmljYXRlU29ja2V0RmFjdG9yeVRlc3QjdGVzdF9jcmVhdGVTb2NrZXRfYmluZCIsCi0gICAgImFuZHJvaWQubmV0LmN0cy5TU0xDZXJ0aWZpY2F0ZVNvY2tldEZhY3RvcnlUZXN0I3Rlc3RfY3JlYXRlU29ja2V0X3NpbXBsZSIsCi0gICAgImFuZHJvaWQubmV0LmN0cy5TU0xDZXJ0aWZpY2F0ZVNvY2tldEZhY3RvcnlUZXN0I3Rlc3RfY3JlYXRlU29ja2V0X3dyYXBwaW5nIgotICBdLAotICBidWc6IDE4NjgyMzE1Ci19LAotewotICBkZXNjcmlwdGlvbjogInRoZSB0ZXN0IHJlc3VsdCBhcmUgdG9vIG11Y2ggZGVwZW5kZW50IG9uIGxpdmUtaW50ZXJuZXQgY29ubmVjdGlvbiwgd2hpY2ggZm9yIHNvbWUgZGV2aWNlcyBtaWdodCBub3QgZXhpc3QiLAotICBuYW1lczogWwotICAgICJhbmRyb2lkLm5ldC53aWZpLmN0cy5Oc2RNYW5hZ2VyVGVzdCN0ZXN0QW5kcm9pZFRlc3RDYXNlU2V0dXBQcm9wZXJseSIKLSAgXSwKLSAgYnVnOiAxODY4MDA4OQotfSwKLXsKLSAgZGVzY3JpcHRpb246ICJBdWRpb1BvbGljeUJpbmRlciB0ZXN0cyBhcmUgbm90IHlldCByb2J1c3QgZW5vdWdoIiwKLSAgbmFtZXM6IFsKLSAgICAiYW5kcm9pZC5zZWN1cml0eS5jdHMuQXVkaW9Qb2xpY3lCaW5kZXJUZXN0IgotICBdLAotICBidWc6IDE4NDYxNjcwCi19LAotewotICBkZXNjcmlwdGlvbjogInRlc3Qgbm90IHJvYnVzdCIsCi0gIG5hbWVzOiBbCi0gICAgImFuZHJvaWQudGVsZWNvbS5jdHMuRXh0ZW5kZWRJbkNhbGxTZXJ2aWNlVGVzdCN0ZXN0QWRkTmV3T3V0Z29pbmdDYWxsQW5kVGhlbkRpc2Nvbm5lY3QiLAotICAgICJhbmRyb2lkLnRlbGVjb20uY3RzLlJlbW90ZUNvbmZlcmVuY2VUZXN0I3Rlc3RSZW1vdGVDb25mZXJlbmNlQ2FsbGJhY2tzX0NvbmZlcmVuY2VhYmxlQ29ubmVjdGlvbnMiCi0gIF0sCi0gIGJ1ZzogMjM2MDQyNTQKLX0sCi17Ci0gIGRlc2NyaXB0aW9uOiAidGVzdHMgdG9vIGZsYWt5IiwKLSAgbmFtZXM6IFsKLSAgICAiYW5kcm9pZC50cmFuc2l0aW9uLmN0cy5DaGFuZ2VTY3JvbGxUZXN0I3Rlc3RDaGFuZ2VTY3JvbGwiCi0gIF0sCi0gIGJ1ZzogMjM3NzkwMjAKLX0sCi17Ci0gIGRlc2NyaXB0aW9uOiAiTm90IGFsbCBqZHdwIGZlYXR1cmVzIGFyZSBjdXJyZW50bHkgc3VwcG9ydGVkLiBUaGVzZSB0ZXN0cyB3aWxsIGZhaWwiLAotICBuYW1lczogWwotICAgICJvcmcuYXBhY2hlLmhhcm1vbnkuanBkYS50ZXN0cy5qZHdwLkRlYnVnZ2VyT25EZW1hbmQuT250aHJvd0RlYnVnZ2VyTGF1bmNoVGVzdCN0ZXN0RGVidWdnZXJMYXVuY2gwMDEiLAotICAgICJvcmcuYXBhY2hlLmhhcm1vbnkuanBkYS50ZXN0cy5qZHdwLkRlYnVnZ2VyT25EZW1hbmQuT250aHJvd0RlYnVnZ2VyTGF1bmNoVGVzdCN0ZXN0RGVidWdnZXJMYXVuY2gwMDIiLAotICAgICJvcmcuYXBhY2hlLmhhcm1vbnkuanBkYS50ZXN0cy5qZHdwLkRlYnVnZ2VyT25EZW1hbmQuT250aHJvd0RlYnVnZ2VyTGF1bmNoVGVzdCN0ZXN0RGVidWdnZXJMYXVuY2gwMDMiLAotICAgICJvcmcuYXBhY2hlLmhhcm1vbnkuanBkYS50ZXN0cy5qZHdwLkRlYnVnZ2VyT25EZW1hbmQuT250aHJvd0RlYnVnZ2VyTGF1bmNoVGVzdCN0ZXN0RGVidWdnZXJMYXVuY2gwMDQiLAotICAgICJvcmcuYXBhY2hlLmhhcm1vbnkuanBkYS50ZXN0cy5qZHdwLkRlYnVnZ2VyT25EZW1hbmQuT250aHJvd0xhdW5jaERlYnVnZ2VyMDAxI3Rlc3REZWJ1Z2dlcjAwMiIsCi0gICAgIm9yZy5hcGFjaGUuaGFybW9ueS5qcGRhLnRlc3RzLmpkd3AuRGVidWdnZXJPbkRlbWFuZC5PbnRocm93TGF1bmNoRGVidWdnZXIwMDIjdGVzdERlYnVnZ2VyIiwKLSAgICAib3JnLmFwYWNoZS5oYXJtb255LmpwZGEudGVzdHMuamR3cC5FdmVudHMuQ2xhc3NVbmxvYWRUZXN0I3Rlc3RDbGFzc1VubG9hZEV2ZW50IiwKLSAgICAib3JnLmFwYWNoZS5oYXJtb255LmpwZGEudGVzdHMuamR3cC5FdmVudHMuTW9uaXRvckNvbnRlbmRlZEVudGVyVGVzdCN0ZXN0TW9uaXRvckNvbnRlbmRlZEVudGVyRm9yQ2xhc3NNYXRjaCIsCi0gICAgIm9yZy5hcGFjaGUuaGFybW9ueS5qcGRhLnRlc3RzLmpkd3AuRXZlbnRzLk1vbml0b3JDb250ZW5kZWRFbnRlcmVkVGVzdCN0ZXN0TW9uaXRvckNvbnRlbmRlZEVudGVyZWRGb3JDbGFzc01hdGNoIiwKLSAgICAib3JnLmFwYWNoZS5oYXJtb255LmpwZGEudGVzdHMuamR3cC5FdmVudHMuTW9uaXRvcldhaXRUZXN0I3Rlc3RNb25pdG9yV2FpdEZvckNsYXNzRXhjbHVkZSIsCi0gICAgIm9yZy5hcGFjaGUuaGFybW9ueS5qcGRhLnRlc3RzLmpkd3AuRXZlbnRzLk1vbml0b3JXYWl0VGVzdCN0ZXN0TW9uaXRvcldhaXRGb3JDbGFzc01hdGNoRXhhY3QiLAotICAgICJvcmcuYXBhY2hlLmhhcm1vbnkuanBkYS50ZXN0cy5qZHdwLkV2ZW50cy5Nb25pdG9yV2FpdFRlc3QjdGVzdE1vbml0b3JXYWl0Rm9yQ2xhc3NNYXRjaEZpcnN0IiwKLSAgICAib3JnLmFwYWNoZS5oYXJtb255LmpwZGEudGVzdHMuamR3cC5FdmVudHMuTW9uaXRvcldhaXRUZXN0I3Rlc3RNb25pdG9yV2FpdEZvckNsYXNzTWF0Y2hTZWNvbmQiLAotICAgICJvcmcuYXBhY2hlLmhhcm1vbnkuanBkYS50ZXN0cy5qZHdwLkV2ZW50cy5Nb25pdG9yV2FpdFRlc3QjdGVzdE1vbml0b3JXYWl0Rm9yQ2xhc3NPbmx5IiwKLSAgICAib3JnLmFwYWNoZS5oYXJtb255LmpwZGEudGVzdHMuamR3cC5FdmVudHMuTW9uaXRvcldhaXRlZFRlc3QjdGVzdE1vbml0b3JXYWl0ZWRGb3JDbGFzc0V4Y2x1ZGUiLAotICAgICJvcmcuYXBhY2hlLmhhcm1vbnkuanBkYS50ZXN0cy5qZHdwLkV2ZW50cy5Nb25pdG9yV2FpdGVkVGVzdCN0ZXN0TW9uaXRvcldhaXRlZEZvckNsYXNzTWF0Y2hFeGFjdCIsCi0gICAgIm9yZy5hcGFjaGUuaGFybW9ueS5qcGRhLnRlc3RzLmpkd3AuRXZlbnRzLk1vbml0b3JXYWl0ZWRUZXN0I3Rlc3RNb25pdG9yV2FpdGVkRm9yQ2xhc3NNYXRjaEZpcnN0IiwKLSAgICAib3JnLmFwYWNoZS5oYXJtb255LmpwZGEudGVzdHMuamR3cC5FdmVudHMuTW9uaXRvcldhaXRlZFRlc3QjdGVzdE1vbml0b3JXYWl0ZWRGb3JDbGFzc01hdGNoU2Vjb25kIiwKLSAgICAib3JnLmFwYWNoZS5oYXJtb255LmpwZGEudGVzdHMuamR3cC5FdmVudHMuTW9uaXRvcldhaXRlZFRlc3QjdGVzdE1vbml0b3JXYWl0ZWRGb3JDbGFzc09ubHkiLAotICAgICJvcmcuYXBhY2hlLmhhcm1vbnkuanBkYS50ZXN0cy5qZHdwLlJlZmVyZW5jZVR5cGUuQ2xhc3NGaWxlVmVyc2lvblRlc3QjdGVzdENsYXNzRmlsZVZlcnNpb24wMDEiLAotICAgICJvcmcuYXBhY2hlLmhhcm1vbnkuanBkYS50ZXN0cy5qZHdwLlJlZmVyZW5jZVR5cGUuTmVzdGVkVHlwZXNUZXN0I3Rlc3ROZXN0ZWRUeXBlczAwMSIsCi0gICAgIm9yZy5hcGFjaGUuaGFybW9ueS5qcGRhLnRlc3RzLmpkd3AuVGhyZWFkUmVmZXJlbmNlLlN0b3BUZXN0I3Rlc3RTdG9wMDAxIiwKLSAgICAib3JnLmFwYWNoZS5oYXJtb255LmpwZGEudGVzdHMuamR3cC5WaXJ0dWFsTWFjaGluZS5Ib2xkRXZlbnRzVGVzdCN0ZXN0SG9sZEV2ZW50czAwMSIsCi0gICAgIm9yZy5hcGFjaGUuaGFybW9ueS5qcGRhLnRlc3RzLmpkd3AuVmlydHVhbE1hY2hpbmUuUmVsZWFzZUV2ZW50c1Rlc3QjdGVzdFJlbGVhc2VFdmVudHMwMDEiCi0gIF0sCi0gIGJ1ZzogMTY3MjA2ODkKLX0sCi17Ci0gIGRlc2NyaXB0aW9uOiAidGVzdCBjYW4gb25seSBydW4gcHJvcGVybHkgb24gYSB1c2VyIGJ1aWxkIGRldmljZSB3aGVuIHRoZSBidWcgaXMgcmVzb2x2ZWQiLAotICBuYW1lczogWwotICAgICJhbmRyb2lkLmFwcHdpZGdldC5jdHMuQXBwV2lkZ2V0VGVzdCN0ZXN0QXBwV2lkZ2V0UHJvdmlkZXJDYWxsYmFja3MiLAotICAgICJhbmRyb2lkLmFwcHdpZGdldC5jdHMuQXBwV2lkZ2V0VGVzdCN0ZXN0QmluZEFwcFdpZGdldCIsCi0gICAgImFuZHJvaWQuYXBwd2lkZ2V0LmN0cy5BcHBXaWRnZXRUZXN0I3Rlc3RDb2xsZWN0aW9uV2lkZ2V0cyIsCi0gICAgImFuZHJvaWQuYXBwd2lkZ2V0LmN0cy5BcHBXaWRnZXRUZXN0I3Rlc3REZWxldGVIb3N0IiwKLSAgICAiYW5kcm9pZC5hcHB3aWRnZXQuY3RzLkFwcFdpZGdldFRlc3QjdGVzdERlbGV0ZUhvc3RzIiwKLSAgICAiYW5kcm9pZC5hcHB3aWRnZXQuY3RzLkFwcFdpZGdldFRlc3QjdGVzdEdldEFwcFdpZGdldElkcyIsCi0gICAgImFuZHJvaWQuYXBwd2lkZ2V0LmN0cy5BcHBXaWRnZXRUZXN0I3Rlc3RHZXRBcHBXaWRnZXRJbmZvIiwKLSAgICAiYW5kcm9pZC5hcHB3aWRnZXQuY3RzLkFwcFdpZGdldFRlc3QjdGVzdEdldEFwcFdpZGdldE9wdGlvbnMiLAotICAgICJhbmRyb2lkLmFwcHdpZGdldC5jdHMuQXBwV2lkZ2V0VGVzdCN0ZXN0UGFydGlhbGx5VXBkYXRlQXBwV2lkZ2V0VmlhV2lkZ2V0SWQiLAotICAgICJhbmRyb2lkLmFwcHdpZGdldC5jdHMuQXBwV2lkZ2V0VGVzdCN0ZXN0UGFydGlhbGx5VXBkYXRlQXBwV2lkZ2V0VmlhV2lkZ2V0SWRzIiwKLSAgICAiYW5kcm9pZC5hcHB3aWRnZXQuY3RzLkFwcFdpZGdldFRlc3QjdGVzdFR3b0FwcFdpZGdldFByb3ZpZGVyQ2FsbGJhY2tzIiwKLSAgICAiYW5kcm9pZC5hcHB3aWRnZXQuY3RzLkFwcFdpZGdldFRlc3QjdGVzdFVwZGF0ZUFwcFdpZGdldFZpYUNvbXBvbmVudE5hbWUiLAotICAgICJhbmRyb2lkLmFwcHdpZGdldC5jdHMuQXBwV2lkZ2V0VGVzdCN0ZXN0VXBkYXRlQXBwV2lkZ2V0VmlhV2lkZ2V0SWQiLAotICAgICJhbmRyb2lkLmFwcHdpZGdldC5jdHMuQXBwV2lkZ2V0VGVzdCN0ZXN0VXBkYXRlQXBwV2lkZ2V0VmlhV2lkZ2V0SWRzIgotICBdLAotICBidWc6IDE3OTkzMTIxCi19LAotewotICBkZXNjcmlwdGlvbjogInBlcm1pc3Npb25zIGZvciB0aGUgQVBJIHByZXZpb3VzbHkgdXNlZCBpbiB0aGUgdGVzdCBoYXMgY2hhbmdlZCwgbWFraW5nIGl0IGltcG9zc2libGUgdG8gcGFzcyIsCi0gIG5hbWVzOiBbCi0gICAgImFuZHJvaWQub3BlbmdscGVyZi5jdHMuR2xBcHBTd2l0Y2hUZXN0I3Rlc3RHbEFjdGl2aXR5U3dpdGNoaW5nRmFzdCIsCi0gICAgImFuZHJvaWQub3BlbmdscGVyZi5jdHMuR2xBcHBTd2l0Y2hUZXN0I3Rlc3RHbEFjdGl2aXR5U3dpdGNoaW5nU2xvdyIKLSAgXSwKLSAgYnVnOiAxNzM5NDMyMQotfSwKLXsKLSAgZGVzY3JpcHRpb246ICJ1bmV4cGVjdGVkIGZhaWx1cmVzIiwKLSAgbmFtZXM6IFsKLSAgICAiYW5kcm9pZC5vcGVuZ2xwZXJmLmN0cy5HbFZib1BlcmZUZXN0I3Rlc3RWYm9XaXRoVmFyeWluZ0luZGV4QnVmZmVyTnVtYmVycyIKLSAgXSwKLSAgYnVnOiAxODA5MTU5MAotfSwKLXsKLSAgZGVzY3JpcHRpb246ICJUZXN0IGlzIG5vdCB5ZXQgcHJvcGVybHkgaW1wbGVtZW50ZWQiLAotICBuYW1lczogWwotICAgICJhbmRyb2lkLnZvaWNlc2V0dGluZ3MuY3RzLlplbk1vZGVUZXN0I3Rlc3RBbGwiCi0gIF0sCi0gIGJ1ZzogMjMyMzg5ODQKLX0sCi17Ci0gIGRlc2NyaXB0aW9uOiAiVGhpcyB0ZXN0IGZhaWxlZCBvbiBkZXZpY2VzIHRoYXQgdXNlIGVmZmVjdCBvZmYgbG9hZGluZy4gSW4gYWRkaXRpb24gaXQgdXNlcyBoaWRkZW4gYXBpcyIsCi0gIG5hbWVzOiBbCi0gICAgImFuZHJvaWQubWVkaWEuY3RzLkF1ZGlvRWZmZWN0VGVzdCN0ZXN0MV8xQ29uc3RydWN0b3JGcm9tVXVpZCIKLSAgXSwKLSAgYnVnOiAxNzYwNTg3NQotfSwKLXsKLSAgZGVzY3JpcHRpb246ICJUaGlzIHRlc3QgZmFpbGVkIG9uIGh3IGRlY29kZXIgdGhhdCBkb2Vzbid0IG91dHB1dCBmcmFtZSB3aXRoIHRoZSBjb25maWd1cmVkIGZvcm1hdC4iLAotICBuYW1lczogWwotICAgICJhbmRyb2lkLm1lZGlhLmN0cy5JbWFnZVJlYWRlckRlY29kZXJUZXN0I3Rlc3RId0FWQ0RlY29kZTM2MHBGb3JGbGV4aWJsZVl1diIKLSAgXSwKLSAgYnVnOiAxNzE0NDc3OAotfSwKLXsKLSAgZGVzY3JpcHRpb246ICJhbmRyb2lkLmtleXN0b3JlIHRlc3RzIHdpbGwgcmVwbGFjZSB0aGVzZSB0ZXN0cyIsCi0gIG5hbWVzOiBbCi0gICAgImNvbS5hbmRyb2lkLm9yZy5jb25zY3J5cHQuTWFjVGVzdCN0ZXN0X2dldEluc3RhbmNlX09wZW5TU0xfRU5HSU5FIiwKLSAgICAiY29tLmFuZHJvaWQub3JnLmNvbnNjcnlwdC5OYXRpdmVDcnlwdG9UZXN0I3Rlc3RfRU5HSU5FX2J5X2lkX1Rlc3RFbmdpbmUiLAotICAgICJjb20uYW5kcm9pZC5vcmcuY29uc2NyeXB0LlNpZ25hdHVyZVRlc3QjdGVzdF9nZXRJbnN0YW5jZV9PcGVuU1NMX0VOR0lORSIKLSAgXSwKLSAgYnVnOiAxODAzMDA0OQotfSwKLXsKLSAgZGVzY3JpcHRpb246ICJUaGUgbmV3IHByZXBhcmUgcGVyZm9ybWFuY2UgdGVzdCBpcyBub3QgeWV0IHBhc3Npbmcgb24gYWxsIGRldmljZXMiLAotICBuYW1lczogWwotICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuY3RzLlN1cmZhY2VWaWV3UHJldmlld1Rlc3QjdGVzdFByZXBhcmVQZXJmb3JtYW5jZSIKLSAgXSwKLSAgYnVnOiAxNzk4OTUzMgotfSwKLXsKLSAgZGVzY3JpcHRpb246ICJUaGUgdGltaW5nIG1lYXN1cmVtZW50cyBmb3IgcHJldmlldyBjYWxsYmFja3MgYXJlIG5vdCByZWxpYWJsZSIsCi0gIG5hbWVzOiBbCi0gICAgImFuZHJvaWQuaGFyZHdhcmUuY3RzLkNhbWVyYVRlc3QjdGVzdFByZXZpZXdGcHNSYW5nZSIKLSAgXSwKLSAgYnVnOiAyMzAwODUxMQotfSwKLXsKLSAgZGVzY3JpcHRpb246ICJMaWdodCBzdGF0dXMgYmFyIENUUyBjb21pbmcgaW4gbGF0ZSIsCi0gIG5hbWVzOiBbCi0gICAgImFuZHJvaWQuc3lzdGVtdWkuY3RzLkxpZ2h0U3RhdHVzQmFyVGVzdHMjdGVzdExpZ2h0U3RhdHVzQmFySWNvbnMiCi0gIF0sCi0gIGJ1ZzogMjM0Mjc2MjEKLX0sCi17Ci0gIGRlc2NyaXB0aW9uOiAidGVzdHMgYXJlIG5vdCB5ZXQgcmVhZHkiLAotICBuYW1lczogWwotICAgICJjb20uYW5kcm9pZC5jdHMuYXBwLm9zLk9zSG9zdFRlc3RzI3Rlc3ROb25FeHBvcnRlZEFjdGl2aXRpZXMiCi0gIF0sCi0gIGJ1ZzogMjM3NzkxNjgKLX0sCi17Ci0gIGRlc2NyaXB0aW9uOiAiQ29ubmVjdGl2aXR5Q29uc3RyYWludFRlc3Qgam9iIHNjaGVkdWxlciBub3Qgd29ya2luZy4iLAotICBuYW1lczogWwotICAgICAiYW5kcm9pZC5qb2JzY2hlZHVsZXIuY3RzLkNvbm5lY3Rpdml0eUNvbnN0cmFpbnRUZXN0I3Rlc3RDb25uZWN0aXZpdHlDb25zdHJhaW50RXhlY3V0ZXNfd2l0aFdpZmkiLAotICAgICAiYW5kcm9pZC5qb2JzY2hlZHVsZXIuY3RzLkNvbm5lY3Rpdml0eUNvbnN0cmFpbnRUZXN0I3Rlc3RVbm1ldGVyZWRDb25zdHJhaW50RXhlY3V0ZXNfd2l0aFdpZmkiLAotICAgICAiYW5kcm9pZC5qb2JzY2hlZHVsZXIuY3RzLkNvbm5lY3Rpdml0eUNvbnN0cmFpbnRUZXN0I3Rlc3RDb25uZWN0aXZpdHlDb25zdHJhaW50RXhlY3V0ZXNfd2l0aE1vYmlsZSIKLSAgXSwKLSAgYnVnOiAyMTI2MjIyNgotfSwKLXsKLSAgIGRlc2NyaXB0aW9uOiAiQ29ubmVjdGl2aXR5Q29uc3RyYWludFRlc3QgdGltZXMgb3V0LiIsCi0gICBuYW1lczogWwotICAgICAiYW5kcm9pZC5qb2JzY2hlZHVsZXIuY3RzLlRpbWluZ0NvbnN0cmFpbnRzVGVzdCN0ZXN0Sm9iUGFyYW1ldGVyc191bmV4cGlyZWREZWFkbGluZSIKLSAgIF0sCi0gICBidWc6IDIzMTQ0NDI1Ci19LAotewotICAgZGVzY3JpcHRpb246ICJWaWRlbyBlbmNvZGluZyB0ZXN0cyBhcmUgdGltaW5nIG91dC4iLAotICAgbmFtZXM6IFsKLSAgICAgImFuZHJvaWQubWVkaWEuY3RzLlZpZGVvRW5jb2RlclRlc3QjdGVzdEdvb2dIMjY0RmxleEFyYml0cmFyeVciLAotICAgICAiYW5kcm9pZC5tZWRpYS5jdHMuVmlkZW9FbmNvZGVyVGVzdCN0ZXN0R29vZ0gyNjRTdXJmQXJiaXRyYXJ5VyIKLSAgIF0sCi0gICBidWc6IDIzODI3OTgyCi19LAotewotICBkZXNjcmlwdGlvbjogInByb3RlY3RlZCBicm9hZGNhc3Qgbm90IHdvcmtpbmciLAotICBuYW1lczogWwotICAgImFuZHJvaWQucGVybWlzc2lvbjIuY3RzLlByb3RlY3RlZEJyb2FkY2FzdHNUZXN0I3Rlc3RTZW5kUHJvdGVjdGVkQnJvYWRjYXN0cyIKLSAgXSwKLSAgYnVnOiAyMzE5MjQ5MgotfSwKLXsKLSAgZGVzY3JpcHRpb246ICJyZXN0cmljdGVkIG5ldHdvcmsgaXMgbm90IHdvcmtpbmciLAotICBuYW1lczogWwotICAgICJhbmRyb2lkLm5ldC5jdHMuQ29ubmVjdGl2aXR5TWFuYWdlclRlc3QjdGVzdFJlc3RyaWN0ZWROZXR3b3JrcyIKLSAgXSwKLSAgYnVnOiAyNTY1MTgwNQotfSwKLXsKLSAgZGVzY3JpcHRpb246ICJ1bml0IHRlc3RpbmcgZm9yIE1lZGlhUHJlcGFyZXIgbGl2ZXMgd2l0aGluIG1lZGlhc3RyZXNzIG1vZHVsZSIsCi0gIG5hbWVzOiBbCi0gICAgImFuZHJvaWQubWVkaWFzdHJlc3MuY3RzLnByZWNvbmRpdGlvbnMuTWVkaWFQcmVwYXJlclRlc3QiCi0gIF0sCi0gIGJ1ZzogMjU4NTA1MDgKLX0sCi17Ci0gIGRlc2NyaXB0aW9uOiAiVGVzdHMgZm9yIHRoZSBzaWduYXR1cmUgdGVzdHMgc2hvdWxkIG5vdCBiZSBpbiBDVFMiLAotICBuYW1lczogWwotICAgICJhbmRyb2lkLnNpZ25hdHVyZS5jdHMudGVzdHMiCi0gIF0sCi0gIGJ1ZzogMjYxNTA4MDYKLX0sCi17Ci0gIGRlc2NyaXB0aW9uOiAiYW5kcm9pZC5zZWN1cml0eS5jdHMgaXMgdXNpbmcgYSBOb24tTkRLIGxpYnJhcnksIGxpYm1lZGlhX2puaS5zbyIsCi0gIG5hbWVzOiBbCi0gICAgICAiYW5kcm9pZC5zZWN1cml0eS5jdHMuTWVkaWFDcnlwdG9UZXN0I3Rlc3RNZWRpYUNyeXB0b0NsZWFyS2V5IiwKLSAgICAgICJhbmRyb2lkLnNlY3VyaXR5LmN0cy5NZWRpYUNyeXB0b1Rlc3QjdGVzdE1lZGlhQ3J5cHRvV2lkZXZpbmUiCi0gIF0sCi0gIGJ1ZzogMjcyMTg1MDIKLX0sCi17Ci0gIGRlc2NyaXB0aW9uOiAiU3RpbGwgaW52ZXN0aWdhdGluZyB0aGlzLCByb290IGNhdXNlIHVua25vd24geWV0IiwKLSAgYnVnOiAyNzU3ODgwNiwKLSAgbmFtZXM6IFsiY29tLmFuZHJvaWQuY3RzLmNwcHRvb2xzLlJ1bkFzSG9zdFRlc3QjdGVzdFJ1bkFzIl0KLX0sCi17Ci0gIGRlc2NyaXB0aW9uOiAiV2lyZWQgaGVhZHNldCB0ZXN0cyBhcmUgbm8gbG9uZ2VyIGEgcmVxdWlyZW1lbnQgcGVyIENERCIsCi0gIG5hbWVzOiBbCi0gICAgImFuZHJvaWQudGVsZWNvbS5jdHMuV2lyZWRIZWFkc2V0VGVzdCIKLSAgXSwKLSAgYnVnOiAyNjE0OTUyOAotfQotXQpkaWZmIC0tZ2l0IGEvdGVzdHMvZmlsZXN5c3RlbS9BbmRyb2lkLm1rIGIvdGVzdHMvZmlsZXN5c3RlbS9BbmRyb2lkLm1rCmluZGV4IDlkY2E2YWYuLmRlNWE4MzEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2ZpbGVzeXN0ZW0vQW5kcm9pZC5taworKysgYi90ZXN0cy9maWxlc3lzdGVtL0FuZHJvaWQubWsKQEAgLTE4LDE2ICsxOCwxNiBAQAogIyBkb24ndCBpbmNsdWRlIHRoaXMgcGFja2FnZSBpbiBhbnkgdGFyZ2V0CiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAogCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbCBjdHN0ZXN0cnVubmVyCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgY3RzdGVzdHJ1bm5lci1heHQKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzRmlsZVN5c3RlbVRlc3RDYXNlcwogCiAjIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0Ci1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMgY3RzX2luc3RhbnQKIAotTE9DQUxfU0RLX1ZFUlNJT04gOj0gMTYKK0xPQ0FMX1NES19WRVJTSU9OIDo9IHRlc3RfY3VycmVudAogCiBpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCiAKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZpbGVzeXN0ZW0vQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL2ZpbGVzeXN0ZW0vQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBjMDJhYzc3Li5kMjAzYTFhIDEwMDY0NAotLS0gYS90ZXN0cy9maWxlc3lzdGVtL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvZmlsZXN5c3RlbS9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0xNSw3ICsxNSw4IEBACiAtLT4KIAogPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgcGFja2FnZT0iYW5kcm9pZC5maWxlc3lzdGVtLmN0cyI+CisgICAgICAgIHBhY2thZ2U9ImFuZHJvaWQuZmlsZXN5c3RlbS5jdHMiCisgICAgICAgIGFuZHJvaWQ6dGFyZ2V0U2FuZGJveFZlcnNpb249IjIiPgogCiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5ESVNBQkxFX0tFWUdVQVJEIiAvPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uV1JJVEVfRVhURVJOQUxfU1RPUkFHRSIgLz4KQEAgLTIzLDcgKzI0LDcgQEAKICAgICA8YXBwbGljYXRpb24+CiAgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgogICAgIDwvYXBwbGljYXRpb24+Ci0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5maWxlc3lzdGVtLmN0cyIKICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBmb3IgZmlsZSBzeXN0ZW0iIC8+CiA8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvZmlsZXN5c3RlbS9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy9maWxlc3lzdGVtL0FuZHJvaWRUZXN0LnhtbAppbmRleCA1ZjM5MjNiLi5mZWQyMmRmIDEwMDY0NAotLS0gYS90ZXN0cy9maWxlc3lzdGVtL0FuZHJvaWRUZXN0LnhtbAorKysgYi90ZXN0cy9maWxlc3lzdGVtL0FuZHJvaWRUZXN0LnhtbApAQCAtMTQsNiArMTQsNyBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIEZpbGUgU3lzdGVtIHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJmcmFtZXdvcmsiIC8+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CiAgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZpbGVzeXN0ZW0vc3JjL2FuZHJvaWQvZmlsZXN5c3RlbS9jdHMvQWxtb3N0RnVsbFRlc3QuamF2YSBiL3Rlc3RzL2ZpbGVzeXN0ZW0vc3JjL2FuZHJvaWQvZmlsZXN5c3RlbS9jdHMvQWxtb3N0RnVsbFRlc3QuamF2YQppbmRleCBlMjVjMmJlLi4xZTJmYzdjIDEwMDY0NAotLS0gYS90ZXN0cy9maWxlc3lzdGVtL3NyYy9hbmRyb2lkL2ZpbGVzeXN0ZW0vY3RzL0FsbW9zdEZ1bGxUZXN0LmphdmEKKysrIGIvdGVzdHMvZmlsZXN5c3RlbS9zcmMvYW5kcm9pZC9maWxlc3lzdGVtL2N0cy9BbG1vc3RGdWxsVGVzdC5qYXZhCkBAIC0xNiwxOCArMTYsMjYgQEAKIAogcGFja2FnZSBhbmRyb2lkLmZpbGVzeXN0ZW0uY3RzOwogCitpbXBvcnQgc3RhdGljIGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb247CisKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DdHNBbmRyb2lkVGVzdENhc2U7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuRGV2aWNlUmVwb3J0TG9nOwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuU3lzdGVtVXRpbDsKIAoraW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKKwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOwogCi1wdWJsaWMgY2xhc3MgQWxtb3N0RnVsbFRlc3QgZXh0ZW5kcyBDdHNBbmRyb2lkVGVzdENhc2UgewotCitAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIEFsbW9zdEZ1bGxUZXN0IHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElSX0lOSVRJQUxfRklMTCA9ICJJTklUSUFMX0ZJTEwiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESVJfU0VRX1VQREFURSA9ICJTRVFfVVBEQVRFIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElSX1JBTkRPTV9XUiA9ICJSQU5ET01fV1IiOwpAQCAtNDgsOSArNTYsOCBAQAogICAgICAgICBMb2cuaShUQUcsICIrK2N1cnJlbnRDb3VudGVyOiAiICsgY3VycmVudENvdW50ZXIpOwogICAgIH0KIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChtRGlza0ZpbGxlZC5jb21wYXJlQW5kU2V0KGZhbHNlLCB0cnVlKSkgewogICAgICAgICAgICAgTG9nLmkoVEFHLCAiRmlsbGluZyBkaXNrIik7CiAgICAgICAgICAgICAvLyBpbml0aWFsIGZpbGwgZG9uZSBpbiB0d28gc3RhZ2UgYXMgZGlzayBjYW4gYmUgZmlsbGVkIGJ5IG90aGVyCkBAIC04MSw4ICs4OCw4IEBACiAgICAgICAgIExvZy5pKFRBRywgImZyZWUgZGlzayAiICsgU3lzdGVtVXRpbC5nZXRGcmVlRGlza1NpemUoZ2V0Q29udGV4dCgpKSk7CiAgICAgfQogCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBMb2cuaShUQUcsICJ0ZWFyRG93biBmcmVlIGRpc2sgIiArIFN5c3RlbVV0aWwuZ2V0RnJlZURpc2tTaXplKGdldENvbnRleHQoKSkpOwogICAgICAgICBpbnQgY3VycmVudENvdW50ZXIgPSBtUmVmQ291bnRlci5kZWNyZW1lbnRBbmRHZXQoKTsKICAgICAgICAgTG9nLmkoVEFHLCAiLS1jdXJyZW50Q291bnRlcjogIiArIGN1cnJlbnRDb3VudGVyKTsKQEAgLTkzLDkgKzEwMCw5IEBACiAgICAgICAgIEZpbGVVdGlsLnJlbW92ZUZpbGVPckRpcihnZXRDb250ZXh0KCksIERJUl9SQU5ET01fV1IpOwogICAgICAgICBGaWxlVXRpbC5yZW1vdmVGaWxlT3JEaXIoZ2V0Q29udGV4dCgpLCBESVJfUkFORE9NX1JEKTsKICAgICAgICAgTG9nLmkoVEFHLCAidGVhckRvd24gZnJlZSBkaXNrICIgKyBTeXN0ZW1VdGlsLmdldEZyZWVEaXNrU2l6ZShnZXRDb250ZXh0KCkpKTsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKICAgICB9CiAKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXF1ZW50aWFsVXBkYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIG5vdyBhYm91dCBmcmVlU3BhY2VUb0xlYXZlIHNob3VsZCBiZSBsZWZ0CiAgICAgICAgIC8vIGFuZCB0cnkgdXBkYXRpbmcgZXhjZWVkaW5nIHRoZSBmcmVlIHNwYWNlIHNpemUKQEAgLTExNSw2ICsxMjIsNyBAQAogCiAgICAgLy8gVE9ETzogZmlsZSBzaXplIHRvbyBzbWFsbCBhbmQgY2FjaGluZyB3aWxsIGdpdmUgd3JvbmcgYmV0dGVyIHJlc3VsdC4KICAgICAvLyBuZWVkcyB0byBmbHVzaCBjYWNoZSBieSByZWFkaW5nIGJpZyBmaWxlcyBwZXIgZWFjaCByZWFkLgorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFJhbmRvbVJlYWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgaW50IEJVRkZFUl9TSVpFID0gNCAqIDEwMjQ7CiAgICAgICAgIGZpbmFsIGxvbmcgZmlsZVNpemUgPSA0MDBMICogMTAyNEwgKiAxMDI0TDsKQEAgLTEyOSw2ICsxMzcsNyBAQAogICAgICAgICByZXBvcnQuc3VibWl0KGdldEluc3RydW1lbnRhdGlvbigpKTsKICAgICB9CiAKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RSYW5kb21VcGRhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgaW50IEJVRkZFUl9TSVpFID0gNCAqIDEwMjQ7CiAgICAgICAgIGZpbmFsIGxvbmcgZmlsZVNpemUgPSAyNTZMICogMTAyNEwgKiAxMDI0TDsKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZpbGVzeXN0ZW0vc3JjL2FuZHJvaWQvZmlsZXN5c3RlbS9jdHMvUmFuZG9tUldUZXN0LmphdmEgYi90ZXN0cy9maWxlc3lzdGVtL3NyYy9hbmRyb2lkL2ZpbGVzeXN0ZW0vY3RzL1JhbmRvbVJXVGVzdC5qYXZhCmluZGV4IDQwOGZhNzkuLjFjNDYzMzkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2ZpbGVzeXN0ZW0vc3JjL2FuZHJvaWQvZmlsZXN5c3RlbS9jdHMvUmFuZG9tUldUZXN0LmphdmEKKysrIGIvdGVzdHMvZmlsZXN5c3RlbS9zcmMvYW5kcm9pZC9maWxlc3lzdGVtL2N0cy9SYW5kb21SV1Rlc3QuamF2YQpAQCAtMTYsMjUgKzE2LDM0IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5maWxlc3lzdGVtLmN0czsKIAoraW1wb3J0IHN0YXRpYyBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uOworCiBpbXBvcnQgYW5kcm9pZC5vcy5FbnZpcm9ubWVudDsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNkZFRlc3Q7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DdHNBbmRyb2lkVGVzdENhc2U7CiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5EZXZpY2VSZXBvcnRMb2c7CiAKLXB1YmxpYyBjbGFzcyBSYW5kb21SV1Rlc3QgZXh0ZW5kcyBDdHNBbmRyb2lkVGVzdENhc2UgeworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKK0BSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgUmFuZG9tUldUZXN0IHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElSX1JBTkRPTV9XUiA9ICJSQU5ET01fV1IiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESVJfUkFORE9NX1JEID0gIlJBTkRPTV9SRCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUE9SVF9MT0dfTkFNRSA9ICJDdHNGaWxlU3lzdGVtVGVzdENhc2VzIjsKIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgRmlsZVV0aWwucmVtb3ZlRmlsZU9yRGlyKGdldENvbnRleHQoKSwgRElSX1JBTkRPTV9XUik7CiAgICAgICAgIEZpbGVVdGlsLnJlbW92ZUZpbGVPckRpcihnZXRDb250ZXh0KCksIERJUl9SQU5ET01fUkQpOwotICAgICAgICBzdXBlci50ZWFyRG93bigpOwogICAgIH0KIAotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI4LjIvSC0wLTQsVC0wLTQiKQorICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI4LjIiKQorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFJhbmRvbVJlYWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgaW50IFJFQURfQlVGRkVSX1NJWkUgPSA0ICogMTAyNDsKICAgICAgICAgZmluYWwgbG9uZyBmaWxlU2l6ZSA9IEZpbGVVdGlsLmdldEZpbGVTaXplRXhjZWVkaW5nTWVtb3J5KGdldENvbnRleHQoKSwgUkVBRF9CVUZGRVJfU0laRSk7CkBAIC00OSw3ICs1OCw4IEBACiAgICAgfQogCiAgICAgLy8gSXQgaXMgdGFraW5nIHRvbyBsb25nIGluIHNvbWUgZGV2aWNlLCBhbmQgdGh1cyBjYW5ub3QgcnVuIG11bHRpcGxlIHRpbWVzCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjguMi9ILTAtMixULTAtMiIpCisgICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjguMiIpCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmFuZG9tVXBkYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIGludCBXUklURV9CVUZGRVJfU0laRSA9IDQgKiAxMDI0OwogICAgICAgICBmaW5hbCBsb25nIHVzYWJsZVNwYWNlID0gRW52aXJvbm1lbnQuZ2V0RGF0YURpcmVjdG9yeSgpLmdldFVzYWJsZVNwYWNlKCk7CmRpZmYgLS1naXQgYS90ZXN0cy9maWxlc3lzdGVtL3NyYy9hbmRyb2lkL2ZpbGVzeXN0ZW0vY3RzL1NlcXVlbnRpYWxSV1Rlc3QuamF2YSBiL3Rlc3RzL2ZpbGVzeXN0ZW0vc3JjL2FuZHJvaWQvZmlsZXN5c3RlbS9jdHMvU2VxdWVudGlhbFJXVGVzdC5qYXZhCmluZGV4IDQ5MDdiODEuLjY3MzVlYmEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2ZpbGVzeXN0ZW0vc3JjL2FuZHJvaWQvZmlsZXN5c3RlbS9jdHMvU2VxdWVudGlhbFJXVGVzdC5qYXZhCisrKyBiL3Rlc3RzL2ZpbGVzeXN0ZW0vc3JjL2FuZHJvaWQvZmlsZXN5c3RlbS9jdHMvU2VxdWVudGlhbFJXVGVzdC5qYXZhCkBAIC0xNiw3ICsxNiwxMCBAQAogCiBwYWNrYWdlIGFuZHJvaWQuZmlsZXN5c3RlbS5jdHM7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkN0c0FuZHJvaWRUZXN0Q2FzZTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0OworaW1wb3J0IHN0YXRpYyBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbjsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNkZFRlc3Q7CiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5EZXZpY2VSZXBvcnRMb2c7CkBAIC0yNiwyOCArMjksMzEgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlJlc3VsdFVuaXQ7CiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5TdGF0OwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DZGRUZXN0OworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAotcHVibGljIGNsYXNzIFNlcXVlbnRpYWxSV1Rlc3QgZXh0ZW5kcyBDdHNBbmRyb2lkVGVzdENhc2UgeworQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBTZXF1ZW50aWFsUldUZXN0IHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElSX1NFUV9XUiA9ICJTRVFfV1IiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESVJfU0VRX1VQREFURSA9ICJTRVFfVVBEQVRFIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElSX1NFUV9SRCA9ICJTRVFfUkQiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBPUlRfTE9HX05BTUUgPSAiQ3RzRmlsZVN5c3RlbVRlc3RDYXNlcyI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9TSVpFID0gMTAgKiAxMDI0ICogMTAyNDsKIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgRmlsZVV0aWwucmVtb3ZlRmlsZU9yRGlyKGdldENvbnRleHQoKSwgRElSX1NFUV9XUik7CiAgICAgICAgIEZpbGVVdGlsLnJlbW92ZUZpbGVPckRpcihnZXRDb250ZXh0KCksIERJUl9TRVFfVVBEQVRFKTsKICAgICAgICAgRmlsZVV0aWwucmVtb3ZlRmlsZU9yRGlyKGdldENvbnRleHQoKSwgRElSX1NFUV9SRCk7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CiAgICAgfQogCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjguMi9ILTAtMSxULTAtMSIpCisgICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjguMiIpCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlU2VxdWVudGlhbFdyaXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIGxvbmcgZmlsZVNpemUgPSBGaWxlVXRpbC5nZXRGaWxlU2l6ZUV4Y2VlZGluZ01lbW9yeShnZXRDb250ZXh0KCksIEJVRkZFUl9TSVpFKTsKICAgICAgICAgaWYgKGZpbGVTaXplID09IDApIHsgLy8gbm90IGVub3VnaCBzcGFjZSwgZ2l2ZSB1cApAQCAtNzgsNiArODQsNyBAQAogICAgICAgICByZXBvcnQuc3VibWl0KGdldEluc3RydW1lbnRhdGlvbigpKTsKICAgICB9CiAKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGVTZXF1ZW50aWFsVXBkYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIGxvbmcgZmlsZVNpemUgPSBGaWxlVXRpbC5nZXRGaWxlU2l6ZUV4Y2VlZGluZ01lbW9yeShnZXRDb250ZXh0KCksIEJVRkZFUl9TSVpFKTsKICAgICAgICAgaWYgKGZpbGVTaXplID09IDApIHsgLy8gbm90IGVub3VnaCBzcGFjZSwgZ2l2ZSB1cApAQCAtODksNyArOTYsOCBAQAogICAgICAgICAgICAgICAgIE5VTUJFUl9SRVBFVElUSU9OLCBSRVBPUlRfTE9HX05BTUUsIHN0cmVhbU5hbWUpOwogICAgIH0KIAotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI4LjIvSC0wLTMsVC0wLTMiKQorICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI4LjIiKQorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFNpbmdsZVNlcXVlbnRpYWxSZWFkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIGxvbmcgZmlsZVNpemUgPSBGaWxlVXRpbC5nZXRGaWxlU2l6ZUV4Y2VlZGluZ01lbW9yeShnZXRDb250ZXh0KCksIEJVRkZFUl9TSVpFKTsKICAgICAgICAgaWYgKGZpbGVTaXplID09IDApIHsgLy8gbm90IGVub3VnaCBzcGFjZSwgZ2l2ZSB1cApkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhZ21lbnQvQW5kcm9pZC5tayBiL3Rlc3RzL2ZyYWdtZW50L0FuZHJvaWQubWsKaW5kZXggMTc4NTA5Ny4uM2U1NDVkNCAxMDA2NDQKLS0tIGEvdGVzdHMvZnJhZ21lbnQvQW5kcm9pZC5taworKysgYi90ZXN0cy9mcmFnbWVudC9BbmRyb2lkLm1rCkBAIC0yOSwxOSArMjksMjEgQEAKIExPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKIAogTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTICs9IFwKLSAgICBhbmRyb2lkLXN1cHBvcnQtdGVzdCBcCisgICAgYW5kcm9pZHgudGVzdC5ydWxlcyBcCiAgICAgbW9ja2l0by10YXJnZXQtbWludXMtanVuaXQ0IFwKICAgICBhbmRyb2lkLWNvbW1vbiBcCi0gICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbCBcCi0gICAgY3RzdGVzdHJ1bm5lciBcCi0gICAgbGVnYWN5LWFuZHJvaWQtdGVzdAotI0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsIGFuZHJvaWQtc3VwcG9ydC10ZXN0CisgICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgXAorICAgIGN0c3Rlc3RydW5uZXItYXh0CitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicworI0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBhbmRyb2lkeC50ZXN0LnJ1bGVzCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIAogIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzIGN0c19pbnN0YW50CiAKIExPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKIAotaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCitpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCisKK2luY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYWdtZW50L0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9mcmFnbWVudC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGE5ZmJkZTIuLjQ0N2Y5YTggMTAwNjQ0Ci0tLSBhL3Rlc3RzL2ZyYWdtZW50L0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvZnJhZ21lbnQvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMTQsNyArMTQsOCBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBwYWNrYWdlPSJhbmRyb2lkLmZyYWdtZW50LmN0cyI+CisgICAgcGFja2FnZT0iYW5kcm9pZC5mcmFnbWVudC5jdHMiCisgICAgYW5kcm9pZDp0YXJnZXRTYW5kYm94VmVyc2lvbj0iMiI+CiAKICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkRJU0FCTEVfS0VZR1VBUkQiIC8+CiAKQEAgLTI5LDEwICszMCwxMCBAQAogICAgICAgICA8L2FjdGl2aXR5PgogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuTG9hZGVyQWN0aXZpdHkiLz4KICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLk5ld0ludGVudEFjdGl2aXR5IiBhbmRyb2lkOmxhdW5jaE1vZGU9InNpbmdsZUluc3RhbmNlIiAvPgotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuTm9uQ29uZmlnT25TdG9wQWN0aXZpdHkiLz4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLkNvbmZpZ09uU3RvcEFjdGl2aXR5Ii8+CiAgICAgPC9hcHBsaWNhdGlvbj4KIAotICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuZnJhZ21lbnQuY3RzIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIG9mIGFuZHJvaWQuYXBwIEZyYWdtZW50cyIgLz4KIApkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhZ21lbnQvQW5kcm9pZFRlc3QueG1sIGIvdGVzdHMvZnJhZ21lbnQvQW5kcm9pZFRlc3QueG1sCmluZGV4IDRlNTYzZDkuLmYzNTJlZjIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2ZyYWdtZW50L0FuZHJvaWRUZXN0LnhtbAorKysgYi90ZXN0cy9mcmFnbWVudC9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWd1cmF0aW9uIGZvciBhcHAudXNhZ2UgVGVzdHMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJ1aXRvb2xraXQiIC8+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CiAgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYWdtZW50L3NkazI2L0FuZHJvaWQubWsgYi90ZXN0cy9mcmFnbWVudC9zZGsyNi9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZDI1NzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFnbWVudC9zZGsyNi9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNDAgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0ZyYWdtZW50VGVzdENhc2VzU2RrMjYKKworIyBkb24ndCBpbmNsdWRlIHRoaXMgcGFja2FnZSBpbiBhbnkgdGFyZ2V0CitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworCisjIGFuZCB3aGVuIGJ1aWx0IGV4cGxpY2l0bHkgcHV0IGl0IGluIHRoZSBkYXRhIHBhcnRpdGlvbgorTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKKworTE9DQUxfREVYX1BSRU9QVCA6PSBmYWxzZQorCitMT0NBTF9QUk9HVUFSRF9FTkFCTEVEIDo9IGRpc2FibGVkCisKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyArPSBhbmRyb2lkeC50ZXN0LnJ1bGVzCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKKworIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMgY3RzX2luc3RhbnQKKworTE9DQUxfU0RLX1ZFUlNJT04gOj0gMjYKKworaW5jbHVkZSAkKEJVSUxEX0NUU19QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhZ21lbnQvc2RrMjYvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL2ZyYWdtZW50L3NkazI2L0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg4NWJiNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYWdtZW50L3NkazI2L0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iYW5kcm9pZC5mcmFnbWVudC5jdHMuc2RrMjYiCisgICAgYW5kcm9pZDp0YXJnZXRTYW5kYm94VmVyc2lvbj0iMiI+CisKKyAgICA8YXBwbGljYXRpb24+CisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuTm9uQ29uZmlnT25TdG9wQWN0aXZpdHkiLz4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5mcmFnbWVudC5jdHMuc2RrMjYiCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgdGVzdHMgb2YgYW5kcm9pZC5hcHAgRnJhZ21lbnRzIiAvPgorPC9tYW5pZmVzdD4KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhZ21lbnQvc2RrMjYvQW5kcm9pZFRlc3QueG1sIGIvdGVzdHMvZnJhZ21lbnQvc2RrMjYvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZmFiMTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFnbWVudC9zZGsyNi9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwyNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWd1cmF0aW9uIGZvciBhcHAudXNhZ2UgVGVzdHMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CisgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJ1aXRvb2xraXQiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0ZyYWdtZW50VGVzdENhc2VzU2RrMjYuYXBrIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5BbmRyb2lkSlVuaXRUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0icGFja2FnZSIgdmFsdWU9ImFuZHJvaWQuZnJhZ21lbnQuY3RzLnNkazI2IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjEzbSIgLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9mcmFnbWVudC9zZGsyNi9zcmMvYW5kcm9pZC9mcmFnbWVudC9jdHMvc2RrMjYvRnJhZ21lbnRNYW5hZ2VyTm9uQ29uZmlnVGVzdC5qYXZhIGIvdGVzdHMvZnJhZ21lbnQvc2RrMjYvc3JjL2FuZHJvaWQvZnJhZ21lbnQvY3RzL3NkazI2L0ZyYWdtZW50TWFuYWdlck5vbkNvbmZpZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmFhZTk1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhZ21lbnQvc2RrMjYvc3JjL2FuZHJvaWQvZnJhZ21lbnQvY3RzL3NkazI2L0ZyYWdtZW50TWFuYWdlck5vbkNvbmZpZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmZyYWdtZW50LmN0cy5zZGsyNjsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK0BNZWRpdW1UZXN0CitAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIEZyYWdtZW50TWFuYWdlck5vbkNvbmZpZ1Rlc3QgeworCisgICAgQFJ1bGUKKyAgICBwdWJsaWMgQWN0aXZpdHlUZXN0UnVsZTxOb25Db25maWdPblN0b3BBY3Rpdml0eT4gbUFjdGl2aXR5UnVsZSA9CisgICAgICAgICAgICBuZXcgQWN0aXZpdHlUZXN0UnVsZTw+KE5vbkNvbmZpZ09uU3RvcEFjdGl2aXR5LmNsYXNzKTsKKworICAgIC8qKgorICAgICAqIFdoZW4gYSBmcmFnbWVudCBpcyBhZGRlZCBkdXJpbmcgb25TdG9wKCksIGl0IHNob3VsZG4ndCBzaG93IHVwIGluIG5vbi1jb25maWcKKyAgICAgKiBzdGF0ZSB3aGVuIHJlc3RvcmVkIGZvciBhcHBzIHRhcmdldGluZyBTREtzIGJlZm9yZSBQLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgbm9uQ29uZmlnU3RvcCgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICAvLyBUcmlnZ2VyIGFjdGl2aXR5IHJlbGF1bmNoLgorICAgICAgICBmaW5hbCBOb25Db25maWdPblN0b3BBY3Rpdml0eSBhY3Rpdml0eSA9IG1BY3Rpdml0eVJ1bGUuZ2V0QWN0aXZpdHkoKTsKKyAgICAgICAgYWN0aXZpdHkuc0Rlc3Ryb3llZCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICAgICAgYWN0aXZpdHkuc1Jlc3VtZWQgPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgICAgIG1BY3Rpdml0eVJ1bGUucnVuT25VaVRocmVhZCgoKSAtPiBhY3Rpdml0eS5yZWNyZWF0ZSgpKTsKKworICAgICAgICAvLyBXYWl0IGZvciBhY3Rpdml0eSB0byBiZSByZWxhdW5jaGVkLgorICAgICAgICBhc3NlcnRUcnVlKGFjdGl2aXR5LnNEZXN0cm95ZWQuYXdhaXQoMSwgVGltZVVuaXQuU0VDT05EUykpOworICAgICAgICBhc3NlcnRUcnVlKGFjdGl2aXR5LnNSZXN1bWVkLmF3YWl0KDEsIFRpbWVVbml0LlNFQ09ORFMpKTsKKworICAgICAgICAvLyBBIGZyYWdtZW50IHdhcyBhZGRlZCBpbiBvblN0b3AoKSwgYnV0IHdlIHNob3VsZG4ndCBzZWUgaXQgaGVyZS4uLgorICAgICAgICBmaW5hbCBOb25Db25maWdPblN0b3BBY3Rpdml0eSByZWNyZWF0ZWRBY3Rpdml0eSA9IE5vbkNvbmZpZ09uU3RvcEFjdGl2aXR5LnNBY3Rpdml0eTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZWNyZWF0ZWRBY3Rpdml0eS5nZXRGcmFnbWVudE1hbmFnZXIoKS5nZXRGcmFnbWVudHMoKS5pc0VtcHR5KCkpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9mcmFnbWVudC9zZGsyNi9zcmMvYW5kcm9pZC9mcmFnbWVudC9jdHMvc2RrMjYvTm9uQ29uZmlnT25TdG9wQWN0aXZpdHkuamF2YSBiL3Rlc3RzL2ZyYWdtZW50L3NkazI2L3NyYy9hbmRyb2lkL2ZyYWdtZW50L2N0cy9zZGsyNi9Ob25Db25maWdPblN0b3BBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzOTIyY2EKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFnbWVudC9zZGsyNi9zcmMvYW5kcm9pZC9mcmFnbWVudC9jdHMvc2RrMjYvTm9uQ29uZmlnT25TdG9wQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmZyYWdtZW50LmN0cy5zZGsyNjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CisKK3B1YmxpYyBjbGFzcyBOb25Db25maWdPblN0b3BBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBzdGF0aWMgTm9uQ29uZmlnT25TdG9wQWN0aXZpdHkgc0FjdGl2aXR5OworICAgIHN0YXRpYyBDb3VudERvd25MYXRjaCBzRGVzdHJveWVkOworICAgIHN0YXRpYyBDb3VudERvd25MYXRjaCBzUmVzdW1lZDsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgc0FjdGl2aXR5ID0gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKKyAgICAgICAgaWYgKHNSZXN1bWVkICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNSZXN1bWVkLmNvdW50RG93bigpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25TdG9wKCkgeworICAgICAgICBzdXBlci5vblN0b3AoKTsKKworICAgICAgICBnZXRGcmFnbWVudE1hbmFnZXIoKQorICAgICAgICAgICAgICAgIC5iZWdpblRyYW5zYWN0aW9uKCkKKyAgICAgICAgICAgICAgICAuYWRkKG5ldyBSZXRhaW5lZEZyYWdtZW50KCksICIxIikKKyAgICAgICAgICAgICAgICAuY29tbWl0Tm93QWxsb3dpbmdTdGF0ZUxvc3MoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkRlc3Ryb3koKSB7CisgICAgICAgIHN1cGVyLm9uRGVzdHJveSgpOworICAgICAgICBpZiAoc0Rlc3Ryb3llZCAhPSBudWxsKSB7CisgICAgICAgICAgICBzRGVzdHJveWVkLmNvdW50RG93bigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXRhaW5lZEZyYWdtZW50IGV4dGVuZHMgRnJhZ21lbnQgeworICAgICAgICBwdWJsaWMgUmV0YWluZWRGcmFnbWVudCgpIHsKKyAgICAgICAgICAgIHNldFJldGFpbkluc3RhbmNlKHRydWUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhZ21lbnQvc3JjL2FuZHJvaWQvZnJhZ21lbnQvY3RzL0NvbmZpZ09uU3RvcEFjdGl2aXR5LmphdmEgYi90ZXN0cy9mcmFnbWVudC9zcmMvYW5kcm9pZC9mcmFnbWVudC9jdHMvQ29uZmlnT25TdG9wQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWZmNDU5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhZ21lbnQvc3JjL2FuZHJvaWQvZnJhZ21lbnQvY3RzL0NvbmZpZ09uU3RvcEFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQuZnJhZ21lbnQuY3RzOworCitpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnQ7CisKK3B1YmxpYyBjbGFzcyBDb25maWdPblN0b3BBY3Rpdml0eSBleHRlbmRzIFJlY3JlYXRlZEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblN0b3AoKSB7CisgICAgICAgIHN1cGVyLm9uU3RvcCgpOworCisgICAgICAgIGdldEZyYWdtZW50TWFuYWdlcigpCisgICAgICAgICAgICAgICAgLmJlZ2luVHJhbnNhY3Rpb24oKQorICAgICAgICAgICAgICAgIC5hZGQobmV3IFJldGFpbmVkRnJhZ21lbnQoKSwgIjEiKQorICAgICAgICAgICAgICAgIC5jb21taXROb3dBbGxvd2luZ1N0YXRlTG9zcygpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmV0YWluZWRGcmFnbWVudCBleHRlbmRzIEZyYWdtZW50IHsKKyAgICAgICAgcHVibGljIFJldGFpbmVkRnJhZ21lbnQoKSB7CisgICAgICAgICAgICBzZXRSZXRhaW5JbnN0YW5jZSh0cnVlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYWdtZW50L3NyYy9hbmRyb2lkL2ZyYWdtZW50L2N0cy9GcmFnbWVudEFuaW1hdG9yVGVzdC5qYXZhIGIvdGVzdHMvZnJhZ21lbnQvc3JjL2FuZHJvaWQvZnJhZ21lbnQvY3RzL0ZyYWdtZW50QW5pbWF0b3JUZXN0LmphdmEKaW5kZXggZjk5YmIwYi4uMGE2MmIzYiAxMDA2NDQKLS0tIGEvdGVzdHMvZnJhZ21lbnQvc3JjL2FuZHJvaWQvZnJhZ21lbnQvY3RzL0ZyYWdtZW50QW5pbWF0b3JUZXN0LmphdmEKKysrIGIvdGVzdHMvZnJhZ21lbnQvc3JjL2FuZHJvaWQvZnJhZ21lbnQvY3RzL0ZyYWdtZW50QW5pbWF0b3JUZXN0LmphdmEKQEAgLTI5LDEzICsyOSwxNCBAQAogaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmFwcC5GcmFnbWVudE1hbmFnZXJOb25Db25maWc7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlBhaXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5UcmFuc2xhdGVBbmltYXRpb247CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYWdtZW50L3NyYy9hbmRyb2lkL2ZyYWdtZW50L2N0cy9GcmFnbWVudEV4ZWN1dGVUZXN0cy5qYXZhIGIvdGVzdHMvZnJhZ21lbnQvc3JjL2FuZHJvaWQvZnJhZ21lbnQvY3RzL0ZyYWdtZW50RXhlY3V0ZVRlc3RzLmphdmEKaW5kZXggNmU2Y2RhOS4uNzM5ZjM1OSAxMDA2NDQKLS0tIGEvdGVzdHMvZnJhZ21lbnQvc3JjL2FuZHJvaWQvZnJhZ21lbnQvY3RzL0ZyYWdtZW50RXhlY3V0ZVRlc3RzLmphdmEKKysrIGIvdGVzdHMvZnJhZ21lbnQvc3JjL2FuZHJvaWQvZnJhZ21lbnQvY3RzL0ZyYWdtZW50RXhlY3V0ZVRlc3RzLmphdmEKQEAgLTIyLDEzICsyMiwxMiBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKIGltcG9ydCBhbmRyb2lkLmFwcC5GcmFnbWVudE1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhZ21lbnQvc3JjL2FuZHJvaWQvZnJhZ21lbnQvY3RzL0ZyYWdtZW50TGlmZWN5Y2xlVGVzdC5qYXZhIGIvdGVzdHMvZnJhZ21lbnQvc3JjL2FuZHJvaWQvZnJhZ21lbnQvY3RzL0ZyYWdtZW50TGlmZWN5Y2xlVGVzdC5qYXZhCmluZGV4IGMxZmQ5ZDguLjIyYzQzOGMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2ZyYWdtZW50L3NyYy9hbmRyb2lkL2ZyYWdtZW50L2N0cy9GcmFnbWVudExpZmVjeWNsZVRlc3QuamF2YQorKysgYi90ZXN0cy9mcmFnbWVudC9zcmMvYW5kcm9pZC9mcmFnbWVudC9jdHMvRnJhZ21lbnRMaWZlY3ljbGVUZXN0LmphdmEKQEAgLTQxLDggKzQxLDYgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLk1lZGl1bVRlc3Q7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlBhaXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwpAQCAtNTIsNiArNTAsOSBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhZ21lbnQvc3JjL2FuZHJvaWQvZnJhZ21lbnQvY3RzL0ZyYWdtZW50TWFuYWdlckNvbmZpZ1Rlc3QuamF2YSBiL3Rlc3RzL2ZyYWdtZW50L3NyYy9hbmRyb2lkL2ZyYWdtZW50L2N0cy9GcmFnbWVudE1hbmFnZXJDb25maWdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBkNzIzOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYWdtZW50L3NyYy9hbmRyb2lkL2ZyYWdtZW50L2N0cy9GcmFnbWVudE1hbmFnZXJDb25maWdUZXN0LmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQuZnJhZ21lbnQuY3RzOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworCitATWVkaXVtVGVzdAorQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBGcmFnbWVudE1hbmFnZXJDb25maWdUZXN0IHsKKworICAgIEBSdWxlCisgICAgcHVibGljIEFjdGl2aXR5VGVzdFJ1bGU8Q29uZmlnT25TdG9wQWN0aXZpdHk+IG1BY3Rpdml0eVJ1bGUgPQorICAgICAgICAgICAgbmV3IEFjdGl2aXR5VGVzdFJ1bGU8PihDb25maWdPblN0b3BBY3Rpdml0eS5jbGFzcyk7CisKKyAgICAvKioKKyAgICAgKiBXaGVuIGEgZnJhZ21lbnQgaXMgYWRkZWQgZHVyaW5nIG9uU3RvcCgpLCBpdCBzaG91bGQgc2hvdyB1cCBpbiBub24tY29uZmlnCisgICAgICogc3RhdGUgd2hlbiByZXN0b3JlZCBmb3IgYXBwcyB0YXJnZXRpbmcgU0RLcyBQKy4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGNvbmZpZ1N0b3AoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgQ29uZmlnT25TdG9wQWN0aXZpdHkgYWN0aXZpdHkgPSBGcmFnbWVudFRlc3RVdGlsLnJlY3JlYXRlQWN0aXZpdHkobUFjdGl2aXR5UnVsZSwKKyAgICAgICAgICAgICAgICBtQWN0aXZpdHlSdWxlLmdldEFjdGl2aXR5KCkpOworCisgICAgICAgIC8vIEEgZnJhZ21lbnQgd2FzIGFkZGVkIGluIG9uU3RvcCgpLCBidXQgd2Ugc2hvdWxkbid0IHNlZSBpdCBoZXJlLi4uCisgICAgICAgIGFzc2VydEZhbHNlKGFjdGl2aXR5LmdldEZyYWdtZW50TWFuYWdlcigpLmdldEZyYWdtZW50cygpLmlzRW1wdHkoKSk7CisgICAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhZ21lbnQvc3JjL2FuZHJvaWQvZnJhZ21lbnQvY3RzL0ZyYWdtZW50TWFuYWdlck5vbkNvbmZpZ1Rlc3QuamF2YSBiL3Rlc3RzL2ZyYWdtZW50L3NyYy9hbmRyb2lkL2ZyYWdtZW50L2N0cy9GcmFnbWVudE1hbmFnZXJOb25Db25maWdUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiMjgyOTAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvZnJhZ21lbnQvc3JjL2FuZHJvaWQvZnJhZ21lbnQvY3RzL0ZyYWdtZW50TWFuYWdlck5vbkNvbmZpZ1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLmZyYWdtZW50LmN0czsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwotCi1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKLQotQE1lZGl1bVRlc3QKLUBSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCi1wdWJsaWMgY2xhc3MgRnJhZ21lbnRNYW5hZ2VyTm9uQ29uZmlnVGVzdCB7Ci0KLSAgICBAUnVsZQotICAgIHB1YmxpYyBBY3Rpdml0eVRlc3RSdWxlPE5vbkNvbmZpZ09uU3RvcEFjdGl2aXR5PiBtQWN0aXZpdHlSdWxlID0KLSAgICAgICAgICAgIG5ldyBBY3Rpdml0eVRlc3RSdWxlPD4oTm9uQ29uZmlnT25TdG9wQWN0aXZpdHkuY2xhc3MpOwotCi0gICAgLyoqCi0gICAgICogV2hlbiBhIGZyYWdtZW50IGlzIGFkZGVkIGR1cmluZyBvblN0b3AoKSwgaXQgc2hvdWxkbid0IHNob3cgdXAgaW4gbm9uLWNvbmZpZwotICAgICAqIHN0YXRlIHdoZW4gcmVzdG9yZWQuCi0gICAgICovCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBub25Db25maWdTdG9wKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIE5vbkNvbmZpZ09uU3RvcEFjdGl2aXR5IGFjdGl2aXR5ID0gRnJhZ21lbnRUZXN0VXRpbC5yZWNyZWF0ZUFjdGl2aXR5KG1BY3Rpdml0eVJ1bGUsCi0gICAgICAgICAgICAgICAgbUFjdGl2aXR5UnVsZS5nZXRBY3Rpdml0eSgpKTsKLQotICAgICAgICAvLyBBIGZyYWdtZW50IHdhcyBhZGRlZCBpbiBvblN0b3AoKSwgYnV0IHdlIHNob3VsZG4ndCBzZWUgaXQgaGVyZS4uLgotICAgICAgICBhc3NlcnRUcnVlKGFjdGl2aXR5LmdldEZyYWdtZW50TWFuYWdlcigpLmdldEZyYWdtZW50cygpLmlzRW1wdHkoKSk7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhZ21lbnQvc3JjL2FuZHJvaWQvZnJhZ21lbnQvY3RzL0ZyYWdtZW50UmVvcmRlcmluZ1Rlc3QuamF2YSBiL3Rlc3RzL2ZyYWdtZW50L3NyYy9hbmRyb2lkL2ZyYWdtZW50L2N0cy9GcmFnbWVudFJlb3JkZXJpbmdUZXN0LmphdmEKaW5kZXggZjFjNmI5Zi4uMjkxZGZmYiAxMDA2NDQKLS0tIGEvdGVzdHMvZnJhZ21lbnQvc3JjL2FuZHJvaWQvZnJhZ21lbnQvY3RzL0ZyYWdtZW50UmVvcmRlcmluZ1Rlc3QuamF2YQorKysgYi90ZXN0cy9mcmFnbWVudC9zcmMvYW5kcm9pZC9mcmFnbWVudC9jdHMvRnJhZ21lbnRSZW9yZGVyaW5nVGVzdC5qYXZhCkBAIC0yMCwxMSArMjAsMTIgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCiBpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnRNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhZ21lbnQvc3JjL2FuZHJvaWQvZnJhZ21lbnQvY3RzL0ZyYWdtZW50VGVzdFV0aWwuamF2YSBiL3Rlc3RzL2ZyYWdtZW50L3NyYy9hbmRyb2lkL2ZyYWdtZW50L2N0cy9GcmFnbWVudFRlc3RVdGlsLmphdmEKaW5kZXggNjJjNDkwNi4uZGViMzcyMyAxMDA2NDQKLS0tIGEvdGVzdHMvZnJhZ21lbnQvc3JjL2FuZHJvaWQvZnJhZ21lbnQvY3RzL0ZyYWdtZW50VGVzdFV0aWwuamF2YQorKysgYi90ZXN0cy9mcmFnbWVudC9zcmMvYW5kcm9pZC9mcmFnbWVudC9jdHMvRnJhZ21lbnRUZXN0VXRpbC5qYXZhCkBAIC0yNSwxMiArMjUsMTMgQEAKIGltcG9ydCBhbmRyb2lkLmFwcC5GcmFnbWVudE1hbmFnZXJOb25Db25maWc7CiBpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuUGFpcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwogaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlOb2RlSW5mbzsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworCiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYWdtZW50L3NyYy9hbmRyb2lkL2ZyYWdtZW50L2N0cy9GcmFnbWVudFRyYW5zYWN0aW9uVGVzdC5qYXZhIGIvdGVzdHMvZnJhZ21lbnQvc3JjL2FuZHJvaWQvZnJhZ21lbnQvY3RzL0ZyYWdtZW50VHJhbnNhY3Rpb25UZXN0LmphdmEKaW5kZXggMmE1MzJkNy4uNTViNzgwOSAxMDA2NDQKLS0tIGEvdGVzdHMvZnJhZ21lbnQvc3JjL2FuZHJvaWQvZnJhZ21lbnQvY3RzL0ZyYWdtZW50VHJhbnNhY3Rpb25UZXN0LmphdmEKKysrIGIvdGVzdHMvZnJhZ21lbnQvc3JjL2FuZHJvaWQvZnJhZ21lbnQvY3RzL0ZyYWdtZW50VHJhbnNhY3Rpb25UZXN0LmphdmEKQEAgLTMyLDE0ICszMiwxNSBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkFmdGVyOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CmRpZmYgLS1naXQgYS90ZXN0cy9mcmFnbWVudC9zcmMvYW5kcm9pZC9mcmFnbWVudC9jdHMvRnJhZ21lbnRUcmFuc2l0aW9uVGVzdC5qYXZhIGIvdGVzdHMvZnJhZ21lbnQvc3JjL2FuZHJvaWQvZnJhZ21lbnQvY3RzL0ZyYWdtZW50VHJhbnNpdGlvblRlc3QuamF2YQppbmRleCA2ZjYzZTk4Li44MDliYzVlIDEwMDY0NAotLS0gYS90ZXN0cy9mcmFnbWVudC9zcmMvYW5kcm9pZC9mcmFnbWVudC9jdHMvRnJhZ21lbnRUcmFuc2l0aW9uVGVzdC5qYXZhCisrKyBiL3Rlc3RzL2ZyYWdtZW50L3NyYy9hbmRyb2lkL2ZyYWdtZW50L2N0cy9GcmFnbWVudFRyYW5zaXRpb25UZXN0LmphdmEKQEAgLTMwLDExICszMCwxMiBAQAogaW1wb3J0IGFuZHJvaWQuYXBwLlNoYXJlZEVsZW1lbnRDYWxsYmFjazsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKIGltcG9ydCBhbmRyb2lkLnRyYW5zaXRpb24uVHJhbnNpdGlvblNldDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworCiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC50cmFuc2l0aW9uLlRhcmdldFRyYWNraW5nOwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwudHJhbnNpdGlvbi5UcmFja2luZ1RyYW5zaXRpb247CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYWdtZW50L3NyYy9hbmRyb2lkL2ZyYWdtZW50L2N0cy9GcmFnbWVudFZpZXdUZXN0cy5qYXZhIGIvdGVzdHMvZnJhZ21lbnQvc3JjL2FuZHJvaWQvZnJhZ21lbnQvY3RzL0ZyYWdtZW50Vmlld1Rlc3RzLmphdmEKaW5kZXggOTI3NTUyZC4uNzg1MjFlZiAxMDA2NDQKLS0tIGEvdGVzdHMvZnJhZ21lbnQvc3JjL2FuZHJvaWQvZnJhZ21lbnQvY3RzL0ZyYWdtZW50Vmlld1Rlc3RzLmphdmEKKysrIGIvdGVzdHMvZnJhZ21lbnQvc3JjL2FuZHJvaWQvZnJhZ21lbnQvY3RzL0ZyYWdtZW50Vmlld1Rlc3RzLmphdmEKQEAgLTI0LDE0ICsyNCwxNCBAQAogaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50OwogaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYWdtZW50L3NyYy9hbmRyb2lkL2ZyYWdtZW50L2N0cy9Mb2FkZXJUZXN0LmphdmEgYi90ZXN0cy9mcmFnbWVudC9zcmMvYW5kcm9pZC9mcmFnbWVudC9jdHMvTG9hZGVyVGVzdC5qYXZhCmluZGV4IGZiZjQyNTguLmZkNjE4NmQgMTAwNzU1Ci0tLSBhL3Rlc3RzL2ZyYWdtZW50L3NyYy9hbmRyb2lkL2ZyYWdtZW50L2N0cy9Mb2FkZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvZnJhZ21lbnQvc3JjL2FuZHJvaWQvZnJhZ21lbnQvY3RzL0xvYWRlclRlc3QuamF2YQpAQCAtMjgsMTAgKzI4LDExIEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkxvYWRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiAKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYWdtZW50L3NyYy9hbmRyb2lkL2ZyYWdtZW50L2N0cy9OZXN0ZWRJbmZsYXRlZEZyYWdtZW50VGVzdC5qYXZhIGIvdGVzdHMvZnJhZ21lbnQvc3JjL2FuZHJvaWQvZnJhZ21lbnQvY3RzL05lc3RlZEluZmxhdGVkRnJhZ21lbnRUZXN0LmphdmEKaW5kZXggZTI0ZWIzOS4uNGZjNjViOSAxMDA2NDQKLS0tIGEvdGVzdHMvZnJhZ21lbnQvc3JjL2FuZHJvaWQvZnJhZ21lbnQvY3RzL05lc3RlZEluZmxhdGVkRnJhZ21lbnRUZXN0LmphdmEKKysrIGIvdGVzdHMvZnJhZ21lbnQvc3JjL2FuZHJvaWQvZnJhZ21lbnQvY3RzL05lc3RlZEluZmxhdGVkRnJhZ21lbnRUZXN0LmphdmEKQEAgLTIwLDE2ICsyMCwxNiBAQAogaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50OwogaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwogCitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5OdWxsYWJsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhZ21lbnQvc3JjL2FuZHJvaWQvZnJhZ21lbnQvY3RzL05vbkNvbmZpZ09uU3RvcEFjdGl2aXR5LmphdmEgYi90ZXN0cy9mcmFnbWVudC9zcmMvYW5kcm9pZC9mcmFnbWVudC9jdHMvTm9uQ29uZmlnT25TdG9wQWN0aXZpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkzYjYxNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9mcmFnbWVudC9zcmMvYW5kcm9pZC9mcmFnbWVudC9jdHMvTm9uQ29uZmlnT25TdG9wQWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLmZyYWdtZW50LmN0czsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50OwotCi1wdWJsaWMgY2xhc3MgTm9uQ29uZmlnT25TdG9wQWN0aXZpdHkgZXh0ZW5kcyBSZWNyZWF0ZWRBY3Rpdml0eSB7Ci0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25TdG9wKCkgewotICAgICAgICBzdXBlci5vblN0b3AoKTsKLQotICAgICAgICBnZXRGcmFnbWVudE1hbmFnZXIoKQotICAgICAgICAgICAgICAgIC5iZWdpblRyYW5zYWN0aW9uKCkKLSAgICAgICAgICAgICAgICAuYWRkKG5ldyBSZXRhaW5lZEZyYWdtZW50KCksICIxIikKLSAgICAgICAgICAgICAgICAuY29tbWl0Tm93QWxsb3dpbmdTdGF0ZUxvc3MoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJldGFpbmVkRnJhZ21lbnQgZXh0ZW5kcyBGcmFnbWVudCB7Ci0gICAgICAgIHB1YmxpYyBSZXRhaW5lZEZyYWdtZW50KCkgewotICAgICAgICAgICAgc2V0UmV0YWluSW5zdGFuY2UodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9mcmFnbWVudC9zcmMvYW5kcm9pZC9mcmFnbWVudC9jdHMvUG9zdHBvbmVkVHJhbnNpdGlvblRlc3QuamF2YSBiL3Rlc3RzL2ZyYWdtZW50L3NyYy9hbmRyb2lkL2ZyYWdtZW50L2N0cy9Qb3N0cG9uZWRUcmFuc2l0aW9uVGVzdC5qYXZhCmluZGV4IGRiZGY5NGQuLjMzNDA2ZGYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2ZyYWdtZW50L3NyYy9hbmRyb2lkL2ZyYWdtZW50L2N0cy9Qb3N0cG9uZWRUcmFuc2l0aW9uVGVzdC5qYXZhCisrKyBiL3Rlc3RzL2ZyYWdtZW50L3NyYy9hbmRyb2lkL2ZyYWdtZW50L2N0cy9Qb3N0cG9uZWRUcmFuc2l0aW9uVGVzdC5qYXZhCkBAIC0yOCwxNCArMjgsMTUgQEAKIGltcG9ydCBhbmRyb2lkLmFwcC5GcmFnbWVudE1hbmFnZXJOb25Db25maWc7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlBhaXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYWdtZW50L3NyYy9hbmRyb2lkL2ZyYWdtZW50L2N0cy9QcmltYXJ5TmF2RnJhZ21lbnRUZXN0LmphdmEgYi90ZXN0cy9mcmFnbWVudC9zcmMvYW5kcm9pZC9mcmFnbWVudC9jdHMvUHJpbWFyeU5hdkZyYWdtZW50VGVzdC5qYXZhCmluZGV4IGM1YzExY2YuLjcyNjhiNTYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2ZyYWdtZW50L3NyYy9hbmRyb2lkL2ZyYWdtZW50L2N0cy9QcmltYXJ5TmF2RnJhZ21lbnRUZXN0LmphdmEKKysrIGIvdGVzdHMvZnJhZ21lbnQvc3JjL2FuZHJvaWQvZnJhZ21lbnQvY3RzL1ByaW1hcnlOYXZGcmFnbWVudFRlc3QuamF2YQpAQCAtMTcsMTggKzE3LDIxIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5mcmFnbWVudC5jdHM7CiAKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5mcmFnbWVudC5jdHMuRnJhZ21lbnRUZXN0VXRpbC5leGVjdXRlUGVuZGluZ1RyYW5zYWN0aW9uczsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5mcmFnbWVudC5jdHMuRnJhZ21lbnRUZXN0VXRpbC5wb3BCYWNrU3RhY2tJbW1lZGlhdGU7CisKK2ltcG9ydCBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlLio7CisKIGltcG9ydCBhbmRyb2lkLmFwcC5GcmFnbWVudE1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5NZWRpdW1UZXN0OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIAotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmZyYWdtZW50LmN0cy5GcmFnbWVudFRlc3RVdGlsLmV4ZWN1dGVQZW5kaW5nVHJhbnNhY3Rpb25zOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmZyYWdtZW50LmN0cy5GcmFnbWVudFRlc3RVdGlsLnBvcEJhY2tTdGFja0ltbWVkaWF0ZTsKLWltcG9ydCBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlLio7Ci0KIEBNZWRpdW1UZXN0CiBAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQogcHVibGljIGNsYXNzIFByaW1hcnlOYXZGcmFnbWVudFRlc3QgewpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhZ21lbnQvc3JjL2FuZHJvaWQvZnJhZ21lbnQvY3RzL1JlY3JlYXRlZEFjdGl2aXR5LmphdmEgYi90ZXN0cy9mcmFnbWVudC9zcmMvYW5kcm9pZC9mcmFnbWVudC9jdHMvUmVjcmVhdGVkQWN0aXZpdHkuamF2YQppbmRleCA4MzNkNTMyLi42YzgwMTY4IDEwMDY0NAotLS0gYS90ZXN0cy9mcmFnbWVudC9zcmMvYW5kcm9pZC9mcmFnbWVudC9jdHMvUmVjcmVhdGVkQWN0aXZpdHkuamF2YQorKysgYi90ZXN0cy9mcmFnbWVudC9zcmMvYW5kcm9pZC9mcmFnbWVudC9jdHMvUmVjcmVhdGVkQWN0aXZpdHkuamF2YQpAQCAtMTksNyArMTksOCBAQAogCiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CiAKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvQW5kcm9pZC5tayBiL3Rlc3RzL2ZyYW1ld29yay9BbmRyb2lkLm1rCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBob3N0c2lkZXRlc3RzL3NlcnZpY2VzL0FuZHJvaWQubWsKcmVuYW1lIHRvIHRlc3RzL2ZyYW1ld29yay9BbmRyb2lkLm1rCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL0FuZHJvaWQubWsgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9BbmRyb2lkLm1rCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9BbmRyb2lkLm1rCmNvcHkgdG8gdGVzdHMvZnJhbWV3b3JrL2Jhc2UvQW5kcm9pZC5tawpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL0FuZHJvaWQubWsgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODMyZmUxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL0FuZHJvaWQubWsKQEAgLTAsMCArMSw1MCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMgb3B0aW9uYWwKKworIyBNdXN0IG1hdGNoIHRoZSBwYWNrYWdlIG5hbWUgaW4gQ3RzVGVzdENhc2VMaXN0Lm1rCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzQWN0aXZpdHlNYW5hZ2VyRGV2aWNlVGVzdENhc2VzCitMT0NBTF9QUklWQVRFX1BMQVRGT1JNX0FQSVMgOj0gdHJ1ZQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKSBcCisgICAgJChjYWxsIGFsbC1uYW1lZC1maWxlcy11bmRlcixDb21wb25lbnRzLmphdmEsIGFwcCkgXAorICAgICQoY2FsbCBhbGwtbmFtZWQtZmlsZXMtdW5kZXIsQ29tcG9uZW50cy5qYXZhLCBhcHAyNykgXAorICAgICQoY2FsbCBhbGwtbmFtZWQtZmlsZXMtdW5kZXIsQ29tcG9uZW50cy5qYXZhLCBhcHBEZWJ1Z2dhYmxlKSBcCisgICAgJChjYWxsIGFsbC1uYW1lZC1maWxlcy11bmRlcixDb21wb25lbnRzLmphdmEsIGFwcERlcHJlY2F0ZWRTZGspIFwKKyAgICAkKGNhbGwgYWxsLW5hbWVkLWZpbGVzLXVuZGVyLENvbXBvbmVudHMuamF2YSwgYXBwRGlzcGxheVNpemUpIFwKKyAgICAkKGNhbGwgYWxsLW5hbWVkLWZpbGVzLXVuZGVyLENvbXBvbmVudHMuamF2YSwgYXBwUHJlcmVsZWFzZVNkaykgXAorICAgICQoY2FsbCBhbGwtbmFtZWQtZmlsZXMtdW5kZXIsQ29tcG9uZW50cy5qYXZhLCBhcHBTZWNvbmRVaWQpIFwKKyAgICAkKGNhbGwgYWxsLW5hbWVkLWZpbGVzLXVuZGVyLENvbXBvbmVudHMuamF2YSwgYXBwVGhpcmRVaWQpIFwKKyAgICAkKGNhbGwgYWxsLW5hbWVkLWZpbGVzLXVuZGVyLENvbXBvbmVudHMuamF2YSwgdHJhbnNsdWNlbnRhcHApIFwKKyAgICAkKGNhbGwgYWxsLW5hbWVkLWZpbGVzLXVuZGVyLENvbXBvbmVudHMuamF2YSwgdHJhbnNsdWNlbnRhcHBzZGsyNikgXAorCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAorICAgIGFuZHJvaWR4LnRlc3QucnVsZXMgaGFtY3Jlc3QtbGlicmFyeSBcCisgICAgY3RzLWFtd20tdXRpbAorCitMT0NBTF9DVFNfVEVTVF9QQUNLQUdFIDo9IGFuZHJvaWQuc2VydmVyCisKKyMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCisKK2luY2x1ZGUgJChCVUlMRF9DVFNfUEFDS0FHRSkKKworIyBCdWlsZCB0aGUgdGVzdCBBUEtzIHVzaW5nIHRoZWlyIG93biBtYWtlZmlsZXMKK2luY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWY4Y2E4YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsOTQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJhbmRyb2lkLnNlcnZlci5jdHMuYW0iPgorCisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX0VYVEVSTkFMX1NUT1JBR0UiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX1BIT05FX1NUQVRFIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uTUFOQUdFX0FDVElWSVRZX1NUQUNLUyIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkFDVElWSVRZX0VNQkVERElORyIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX1NFQ1VSRV9TRVRUSU5HUyIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlJFUVVFU1RfREVMRVRFX1BBQ0tBR0VTIiAvPgorCisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFiZWw9IkN0c0FjdGl2aXR5TWFuYWdlckRldmljZVRlc3RDYXNlcyI+CisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgorCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnNlcnZlci5hbS5Bc3BlY3RSYXRpb1Rlc3RzJE1heEFzcGVjdFJhdGlvQWN0aXZpdHkiCisgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJNYXhBc3BlY3RSYXRpb0FjdGl2aXR5IgorICAgICAgICAgICAgYW5kcm9pZDptYXhBc3BlY3RSYXRpbz0iMS4wIgorICAgICAgICAgICAgYW5kcm9pZDpyZXNpemVhYmxlQWN0aXZpdHk9ImZhbHNlIiAvPgorCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnNlcnZlci5hbS5Bc3BlY3RSYXRpb1Rlc3RzJE1ldGFEYXRhTWF4QXNwZWN0UmF0aW9BY3Rpdml0eSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Ik1ldGFEYXRhTWF4QXNwZWN0UmF0aW9BY3Rpdml0eSIKKyAgICAgICAgICAgIGFuZHJvaWQ6cmVzaXplYWJsZUFjdGl2aXR5PSJmYWxzZSI+CisgICAgICAgICAgICA8bWV0YS1kYXRhCisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLm1heF9hc3BlY3QiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp2YWx1ZT0iMS4wIiAvPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnNlcnZlci5hbS5Bc3BlY3RSYXRpb1Rlc3RzJE1heEFzcGVjdFJhdGlvUmVzaXplYWJsZUFjdGl2aXR5IgorICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iTWF4QXNwZWN0UmF0aW9SZXNpemVhYmxlQWN0aXZpdHkiCisgICAgICAgICAgICBhbmRyb2lkOm1heEFzcGVjdFJhdGlvPSIxLjAiCisgICAgICAgICAgICBhbmRyb2lkOnJlc2l6ZWFibGVBY3Rpdml0eT0idHJ1ZSIgLz4KKworICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zZXJ2ZXIuYW0uQXNwZWN0UmF0aW9UZXN0cyRNYXhBc3BlY3RSYXRpb1Vuc2V0QWN0aXZpdHkiCisgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJNYXhBc3BlY3RSYXRpb1Vuc2V0QWN0aXZpdHkiCisgICAgICAgICAgICBhbmRyb2lkOnJlc2l6ZWFibGVBY3Rpdml0eT0iZmFsc2UiIC8+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zZXJ2ZXIuYW0uQWN0aXZpdHlNYW5hZ2VyVGVzdEJhc2UkU2lkZUFjdGl2aXR5IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpyZXNpemVhYmxlQWN0aXZpdHk9InRydWUiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhc2tBZmZpbml0eT0ibm9ib2R5LmJ1dC5TaWRlQWN0aXZpdHkiLz4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnNlcnZlci5hbS5saWZlY3ljbGUuQWN0aXZpdHlMaWZlY3ljbGVDbGllbnRUZXN0QmFzZSRGaXJzdEFjdGl2aXR5IiAvPgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc2VydmVyLmFtLmxpZmVjeWNsZS5BY3Rpdml0eUxpZmVjeWNsZUNsaWVudFRlc3RCYXNlJFNlY29uZEFjdGl2aXR5Ii8+CisKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnNlcnZlci5hbS5saWZlY3ljbGUuQWN0aXZpdHlMaWZlY3ljbGVDbGllbnRUZXN0QmFzZSRUcmFuc2x1Y2VudEFjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLlRyYW5zbHVjZW50Lk5vVGl0bGVCYXIiIC8+CisKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnNlcnZlci5hbS5saWZlY3ljbGUuQWN0aXZpdHlMaWZlY3ljbGVDbGllbnRUZXN0QmFzZSRTZWNvbmRUcmFuc2x1Y2VudEFjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLlRyYW5zbHVjZW50Lk5vVGl0bGVCYXIiIC8+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zZXJ2ZXIuYW0ubGlmZWN5Y2xlLkFjdGl2aXR5TGlmZWN5Y2xlQ2xpZW50VGVzdEJhc2UkQ2FsbGJhY2tUcmFja2luZ0FjdGl2aXR5Ii8+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zZXJ2ZXIuYW0ubGlmZWN5Y2xlLkFjdGl2aXR5TGlmZWN5Y2xlQ2xpZW50VGVzdEJhc2UkTGF1bmNoRm9yUmVzdWx0QWN0aXZpdHkiLz4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnNlcnZlci5hbS5saWZlY3ljbGUuQWN0aXZpdHlMaWZlY3ljbGVDbGllbnRUZXN0QmFzZSRSZXN1bHRBY3Rpdml0eSIvPgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc2VydmVyLmFtLmxpZmVjeWNsZS5BY3Rpdml0eUxpZmVjeWNsZUNsaWVudFRlc3RCYXNlJFNpbmdsZVRvcEFjdGl2aXR5IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXVuY2hNb2RlPSJzaW5nbGVUb3AiIC8+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zZXJ2ZXIuYW0ubGlmZWN5Y2xlLkFjdGl2aXR5TGlmZWN5Y2xlQ2xpZW50VGVzdEJhc2UkQ29uZmlnQ2hhbmdlSGFuZGxpbmdBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29uZmlnQ2hhbmdlcz0ib3JpZW50YXRpb258c2NyZWVuU2l6ZXxzbWFsbGVzdFNjcmVlblNpemV8c2NyZWVuTGF5b3V0fGNvbG9yTW9kZXxkZW5zaXR5IiAvPgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc2VydmVyLmFtLlN0YXJ0QWN0aXZpdHlUZXN0cyRUZXN0QWN0aXZpdHkyIiAvPgorCisgICAgPC9hcHBsaWNhdGlvbj4KKworICAgIDxpbnN0cnVtZW50YXRpb24KKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBvZiBBY3Rpdml0eU1hbmFnZXIiCisgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5zZXJ2ZXIuY3RzLmFtIiAvPgorCis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE2YzM0ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSw0MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBBY3Rpdml0eU1hbmFnZXIgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KKyAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImZyYW1ld29yayIgLz4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50YXJnZXRwcmVwLkxvY2F0aW9uQ2hlY2siLz4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzQWN0aXZpdHlNYW5hZ2VyRGV2aWNlVGVzdENhc2VzLmFwayIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0RldmljZVNlcnZpY2VzVGVzdEFwcC5hcGsiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJDdHNEZXZpY2VTZXJ2aWNlc1Rlc3RBcHAyNy5hcGsiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJDdHNEZXZpY2VTZXJ2aWNlc1Rlc3RTZWNvbmRBcHAuYXBrIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzRGV2aWNlU2VydmljZXNUZXN0VGhpcmRBcHAuYXBrIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzRGV2aWNlRGVidWdnYWJsZUFwcC5hcGsiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJDdHNEZXZpY2VEZXByZWNhdGVkU2RrQXBwLmFwayIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0RldmljZURpc3BsYXlTaXplQXBwLmFwayIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0RldmljZVByZXJlbGVhc2VTZGtBcHAuYXBrIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzRGV2aWNlVHJhbnNsdWNlbnRUZXN0QXBwLmFwayIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0RldmljZVRyYW5zbHVjZW50VGVzdEFwcDI2LmFwayIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlJ1bkNvbW1hbmRUYXJnZXRQcmVwYXJlciI+CisgICAgICAgIDwhLS0gMTIwIHNlY29uZHMgc2NyZWVuIG9mZiB0aW1lb3V0IHRvIHByZXZlbnQgZGV2aWNlIHNsZWVwIHdoaWxlIGxvbmcgcnVubmluZyB0ZXN0LiAtLT4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJydW4tY29tbWFuZCIgdmFsdWU9InNldHRpbmdzIHB1dCBzeXN0ZW0gc2NyZWVuX29mZl90aW1lb3V0IDEyMDAwMCIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuQW5kcm9pZEpVbml0VGVzdCI+CisgICAgICAgIDxvcHRpb24gbmFtZT0icGFja2FnZSIgdmFsdWU9ImFuZHJvaWQuc2VydmVyLmN0cy5hbSIvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjFoIi8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9BbmRyb2lkLm1rIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMzU1OTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL0FuZHJvaWQubWsKQEAgLTAsMCArMSw0MCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCisjIERvbid0IGluY2x1ZGUgdGhpcyBwYWNrYWdlIGluIGFueSB0YXJnZXQuCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworCitMT0NBTF9VU0VfQUFQVDIgOj0gdHJ1ZQorCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAorICAgIGN0cy1hbS1hcHAtYmFzZQorCitMT0NBTF9TVEFUSUNfQU5EUk9JRF9MSUJSQVJJRVMgOj0gXAorICAgIGFuZHJvaWR4LmxlZ2FjeV9sZWdhY3ktc3VwcG9ydC12NAorCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpIFwKKyAgICAgICAgICAgICAgICAgICAuLi8uLi8uLi8uLi8uLi9hcHBzL0N0c1ZlcmlmaWVyL3NyYy9jb20vYW5kcm9pZC9jdHMvdmVyaWZpZXIvdnIvTW9ja1ZyTGlzdGVuZXJTZXJ2aWNlLmphdmEKKworTE9DQUxfU0RLX1ZFUlNJT04gOj0gdGVzdF9jdXJyZW50CisKKyMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNEZXZpY2VTZXJ2aWNlc1Rlc3RBcHAKKworaW5jbHVkZSAkKEJVSUxEX0NUU19TVVBQT1JUX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjQ0NTA5MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDQyMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICAgIHhtbG5zOmFuZHJvaWRwcnY9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9wcnYvcmVzL2FuZHJvaWQiCisgICAgICAgICAgcGFja2FnZT0iYW5kcm9pZC5zZXJ2ZXIuYW0iPgorCisgICAgPCEtLSB2aXJ0dWFsIGRpc3BsYXkgdGVzdCBwZXJtaXNzaW9ucyAtLT4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkNBUFRVUkVfVklERU9fT1VUUFVUIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uRElTQUJMRV9LRVlHVUFSRCIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkJJTkRfVk9JQ0VfSU5URVJBQ1RJT04iIC8+CisKKyAgICA8YXBwbGljYXRpb24+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5UZXN0QWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpyZXNpemVhYmxlQWN0aXZpdHk9InRydWUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpzdXBwb3J0c1BpY3R1cmVJblBpY3R1cmU9InRydWUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIKKyAgICAgICAgLz4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLlRlc3RBY3Rpdml0eVdpdGhTYW1lQWZmaW5pdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpyZXNpemVhYmxlQWN0aXZpdHk9InRydWUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpzdXBwb3J0c1BpY3R1cmVJblBpY3R1cmU9InRydWUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRhc2tBZmZpbml0eT0ibm9ib2R5LmJ1dC5QaXBBY3Rpdml0eVNhbWVBZmZpbml0eSIKKyAgICAgICAgLz4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLlRyYW5zbHVjZW50VGVzdEFjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cmVzaXplYWJsZUFjdGl2aXR5PSJ0cnVlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3VwcG9ydHNQaWN0dXJlSW5QaWN0dXJlPSJ0cnVlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29uZmlnQ2hhbmdlcz0ib3JpZW50YXRpb258c2NyZWVuU2l6ZXxzbWFsbGVzdFNjcmVlblNpemV8c2NyZWVuTGF5b3V0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBzdHlsZS9UaGVtZS5UcmFuc3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIgorICAgICAgICAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuVnJUZXN0QWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpyZXNpemVhYmxlQWN0aXZpdHk9InRydWUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIKKyAgICAgICAgLz4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLlJlc3VtZVdoaWxlUGF1c2luZ0FjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6YWxsb3dFbWJlZGRlZD0idHJ1ZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnJlc3VtZVdoaWxlUGF1c2luZz0idHJ1ZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRhc2tBZmZpbml0eT0iIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiCisgICAgICAgIC8+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5SZXNpemVhYmxlQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpyZXNpemVhYmxlQWN0aXZpdHk9InRydWUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDphbGxvd0VtYmVkZGVkPSJ0cnVlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpjb25maWdDaGFuZ2VzPSJvcmllbnRhdGlvbnxzY3JlZW5TaXplfHNtYWxsZXN0U2NyZWVuU2l6ZXxzY3JlZW5MYXlvdXR8Y29sb3JNb2RlfGRlbnNpdHkiCisgICAgICAgIC8+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5Ob25SZXNpemVhYmxlQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpyZXNpemVhYmxlQWN0aXZpdHk9ImZhbHNlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiCisgICAgICAgIC8+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5Eb2NrZWRBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnJlc2l6ZWFibGVBY3Rpdml0eT0idHJ1ZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFza0FmZmluaXR5PSJub2JvZHkuYnV0LkRvY2tlZEFjdGl2aXR5IgorICAgICAgICAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuVHJhbnNsdWNlbnRBY3Rpdml0eSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLlRyYW5zbHVjZW50Lk5vVGl0bGVCYXIiCisgICAgICAgICAgICBhbmRyb2lkOnJlc2l6ZWFibGVBY3Rpdml0eT0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGFza0FmZmluaXR5PSJub2JvZHkuYnV0LlRyYW5zbHVjZW50QWN0aXZpdHkiCisgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIgorICAgICAgICAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuRGlhbG9nV2hlbkxhcmdlQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5EZXZpY2VEZWZhdWx0LkxpZ2h0LkRpYWxvZ1doZW5MYXJnZSIKKyAgICAgICAgLz4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLk5vUmVsYXVuY2hBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnJlc2l6ZWFibGVBY3Rpdml0eT0idHJ1ZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmNvbmZpZ0NoYW5nZXM9Im9yaWVudGF0aW9ufHNjcmVlblNpemV8c21hbGxlc3RTY3JlZW5TaXplfHNjcmVlbkxheW91dHxmb250U2NhbGUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRhc2tBZmZpbml0eT0ibm9ib2R5LmJ1dC5Ob1JlbGF1bmNoQWN0aXZpdHkiCisgICAgICAgIC8+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5TbG93Q3JlYXRlQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpyZXNpemVhYmxlQWN0aXZpdHk9InRydWUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIKKyAgICAgICAgLz4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLkxhdW5jaGluZ0FjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cmVzaXplYWJsZUFjdGl2aXR5PSJ0cnVlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXNrQWZmaW5pdHk9Im5vYm9keS5idXQuTGF1bmNoaW5nQWN0aXZpdHkiCisgICAgICAgIC8+CisgICAgICAgIDwhLS0KKyAgICAgICAgICogVGhpcyBhY3Rpdml0eSBzaG91bGQgaGF2ZSBzYW1lIGFmZmluaXR5IGFzIExhdW5jaGluZ0FjdGl2aXR5LCBiZWNhdXNlIHdlJ3JlIHVzaW5nIGl0IHRvCisgICAgICAgICAqIGNoZWNrIGFjdGl2aXRpZXMgYmVpbmcgbGF1bmNoZWQgaW50byB0aGUgc2FtZSB0YXNrLgorICAgICAgICAgLS0+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5BbHRMYXVuY2hpbmdBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnJlc2l6ZWFibGVBY3Rpdml0eT0idHJ1ZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFza0FmZmluaXR5PSJub2JvZHkuYnV0LkxhdW5jaGluZ0FjdGl2aXR5IgorICAgICAgICAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuUGlwQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpyZXNpemVhYmxlQWN0aXZpdHk9ImZhbHNlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3VwcG9ydHNQaWN0dXJlSW5QaWN0dXJlPSJ0cnVlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29uZmlnQ2hhbmdlcz0ib3JpZW50YXRpb258c2NyZWVuU2l6ZXxzbWFsbGVzdFNjcmVlblNpemV8c2NyZWVuTGF5b3V0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXNrQWZmaW5pdHk9Im5vYm9keS5idXQuUGlwQWN0aXZpdHkiCisgICAgICAgIC8+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5QaXBBY3Rpdml0eTIiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnJlc2l6ZWFibGVBY3Rpdml0eT0iZmFsc2UiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnN1cHBvcnRzUGljdHVyZUluUGljdHVyZT0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29uZmlnQ2hhbmdlcz0ib3JpZW50YXRpb258c2NyZWVuU2l6ZXxzbWFsbGVzdFNjcmVlblNpemV8c2NyZWVuTGF5b3V0IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFza0FmZmluaXR5PSJub2JvZHkuYnV0LlBpcEFjdGl2aXR5MiIKKyAgICAgICAgLz4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLlBpcE9uU3RvcEFjdGl2aXR5IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpyZXNpemVhYmxlQWN0aXZpdHk9ImZhbHNlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzdXBwb3J0c1BpY3R1cmVJblBpY3R1cmU9InRydWUiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmNvbmZpZ0NoYW5nZXM9Im9yaWVudGF0aW9ufHNjcmVlblNpemV8c21hbGxlc3RTY3JlZW5TaXplfHNjcmVlbkxheW91dCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhc2tBZmZpbml0eT0ibm9ib2R5LmJ1dC5QaXBPblN0b3BBY3Rpdml0eSIKKyAgICAgICAgLz4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLlBpcEFjdGl2aXR5V2l0aFNhbWVBZmZpbml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cmVzaXplYWJsZUFjdGl2aXR5PSJmYWxzZSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3VwcG9ydHNQaWN0dXJlSW5QaWN0dXJlPSJ0cnVlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpjb25maWdDaGFuZ2VzPSJvcmllbnRhdGlvbnxzY3JlZW5TaXplfHNtYWxsZXN0U2NyZWVuU2l6ZXxzY3JlZW5MYXlvdXQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXNrQWZmaW5pdHk9Im5vYm9keS5idXQuUGlwQWN0aXZpdHlTYW1lQWZmaW5pdHkiCisgICAgICAgIC8+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5BbHdheXNGb2N1c2FibGVQaXBBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBzdHlsZS9UaGVtZS5UcmFuc3BhcmVudCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cmVzaXplYWJsZUFjdGl2aXR5PSJmYWxzZSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3VwcG9ydHNQaWN0dXJlSW5QaWN0dXJlPSJ0cnVlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZHBydjphbHdheXNGb2N1c2FibGU9InRydWUiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXNrQWZmaW5pdHk9Im5vYm9keS5idXQuQWx3YXlzRm9jdXNhYmxlUGlwQWN0aXZpdHkiCisgICAgICAgIC8+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5MYXVuY2hJbnRvUGlubmVkU3RhY2tQaXBBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cmVzaXplYWJsZUFjdGl2aXR5PSJmYWxzZSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWRwcnY6YWx3YXlzRm9jdXNhYmxlPSJ0cnVlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpjb25maWdDaGFuZ2VzPSJvcmllbnRhdGlvbnxzY3JlZW5TaXplfHNtYWxsZXN0U2NyZWVuU2l6ZXxzY3JlZW5MYXlvdXQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIgorICAgICAgICAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuTGF1bmNoUGlwT25QaXBBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cmVzaXplYWJsZUFjdGl2aXR5PSJmYWxzZSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3VwcG9ydHNQaWN0dXJlSW5QaWN0dXJlPSJ0cnVlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXNrQWZmaW5pdHk9Im5vYm9keS5idXQuTGF1bmNoUGlwT25QaXBBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29uZmlnQ2hhbmdlcz0ib3JpZW50YXRpb258c2NyZWVuU2l6ZXxzbWFsbGVzdFNjcmVlblNpemV8c2NyZWVuTGF5b3V0IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIKKyAgICAgICAgLz4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLkxhdW5jaEVudGVyUGlwQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnJlc2l6ZWFibGVBY3Rpdml0eT0iZmFsc2UiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnN1cHBvcnRzUGljdHVyZUluUGljdHVyZT0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWRwcnY6YWx3YXlzRm9jdXNhYmxlPSJ0cnVlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpjb25maWdDaGFuZ2VzPSJvcmllbnRhdGlvbnxzY3JlZW5TaXplfHNtYWxsZXN0U2NyZWVuU2l6ZXxzY3JlZW5MYXlvdXQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIgorICAgICAgICAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuRnJlZWZvcm1BY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cmVzaXplYWJsZUFjdGl2aXR5PSJ0cnVlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXNrQWZmaW5pdHk9Im5vYm9keS5idXQuRnJlZWZvcm1BY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiCisgICAgICAgIC8+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5Ub3BMZWZ0TGF5b3V0QWN0aXZpdHkiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnJlc2l6ZWFibGVBY3Rpdml0eT0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29uZmlnQ2hhbmdlcz0ib3JpZW50YXRpb258c2NyZWVuU2l6ZXxzbWFsbGVzdFNjcmVlblNpemV8c2NyZWVuTGF5b3V0IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSI+CisgICAgICAgICAgICAgICAgICA8bGF5b3V0IGFuZHJvaWQ6ZGVmYXVsdFdpZHRoPSIyNDBkcCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpkZWZhdWx0SGVpZ2h0PSIxNjBkcCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJ0b3B8bGVmdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDptaW5XaWR0aD0iMTAwZHAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSI4MGRwIgorICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLlRvcFJpZ2h0TGF5b3V0QWN0aXZpdHkiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnJlc2l6ZWFibGVBY3Rpdml0eT0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29uZmlnQ2hhbmdlcz0ib3JpZW50YXRpb258c2NyZWVuU2l6ZXxzbWFsbGVzdFNjcmVlblNpemV8c2NyZWVuTGF5b3V0IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSI+CisgICAgICAgICAgICAgICAgICA8bGF5b3V0IGFuZHJvaWQ6ZGVmYXVsdFdpZHRoPSI1MCUiCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZGVmYXVsdEhlaWdodD0iNzAlIgorICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9InRvcHxyaWdodCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDptaW5XaWR0aD0iNTBkcCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDptaW5IZWlnaHQ9IjgwZHAiCisgICAgICAgICAgICAgICAgICAvPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuQm90dG9tTGVmdExheW91dEFjdGl2aXR5IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpyZXNpemVhYmxlQWN0aXZpdHk9InRydWUiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmNvbmZpZ0NoYW5nZXM9Im9yaWVudGF0aW9ufHNjcmVlblNpemV8c21hbGxlc3RTY3JlZW5TaXplfHNjcmVlbkxheW91dCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiPgorICAgICAgICAgICAgICAgICAgPGxheW91dCBhbmRyb2lkOmRlZmF1bHRXaWR0aD0iNTAlIgorICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmRlZmF1bHRIZWlnaHQ9IjcwJSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJib3R0b218bGVmdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDptaW5XaWR0aD0iNTBkcCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDptaW5IZWlnaHQ9IjgwZHAiCisgICAgICAgICAgICAgICAgICAvPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuQm90dG9tUmlnaHRMYXlvdXRBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cmVzaXplYWJsZUFjdGl2aXR5PSJ0cnVlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpjb25maWdDaGFuZ2VzPSJvcmllbnRhdGlvbnxzY3JlZW5TaXplfHNtYWxsZXN0U2NyZWVuU2l6ZXxzY3JlZW5MYXlvdXQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIj4KKyAgICAgICAgICAgICAgICAgIDxsYXlvdXQgYW5kcm9pZDpkZWZhdWx0V2lkdGg9IjI0MGRwIgorICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmRlZmF1bHRIZWlnaHQ9IjE2MGRwIgorICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImJvdHRvbXxyaWdodCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDptaW5XaWR0aD0iMTAwZHAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSI4MGRwIgorICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLlR1cm5TY3JlZW5PbkFjdGl2aXR5IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIKKyAgICAgICAgLz4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLlR1cm5TY3JlZW5PbkRpc21pc3NLZXlndWFyZEFjdGl2aXR5IgorICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIKKyAgICAgICAgLz4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLlNpbmdsZVRhc2tBY3Rpdml0eSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmxhdW5jaE1vZGU9InNpbmdsZVRhc2siCisgICAgICAgIC8+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5TaW5nbGVJbnN0YW5jZUFjdGl2aXR5IgorICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF1bmNoTW9kZT0ic2luZ2xlSW5zdGFuY2UiCisgICAgICAgIC8+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5UcmFtcG9saW5lQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuTm9EaXNwbGF5IgorICAgICAgICAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuQnJvYWRjYXN0UmVjZWl2ZXJBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cmVzaXplYWJsZUFjdGl2aXR5PSJ0cnVlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIKKyAgICAgICAgLz4KKyAgICAgICAgPGFjdGl2aXR5LWFsaWFzIGFuZHJvaWQ6ZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iLkVudHJ5UG9pbnRBbGlhc0FjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0QWN0aXZpdHk9Ii5UcmFtcG9saW5lQWN0aXZpdHkiID4KKyAgICAgICAgPC9hY3Rpdml0eS1hbGlhcz4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLkJvdHRvbUFjdGl2aXR5IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBzdHlsZS9Ob1ByZXZpZXciCisgICAgICAgIC8+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5Ub3BBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cHJvY2Vzcz0iLnRvcF9wcm9jZXNzIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBzdHlsZS9Ob1ByZXZpZXciCisgICAgICAgIC8+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5UcmFuc2x1Y2VudFRvcEFjdGl2aXR5IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwcm9jZXNzPSIudG9wX3Byb2Nlc3MiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQHN0eWxlL1RyYW5zbHVjZW50VGhlbWUiCisgICAgICAgIC8+CisgICAgICAgIDwhLS0gQW4gYW5pbWF0aW9uIHRlc3Qgd2l0aCBhbiBleHBsaWNpdGx5IG9wYXF1ZSB0aGVtZSwgb3ZlcnJpZGluZyBkZXZpY2UgZGVmYXVsdHMsIGFzIHRoZQorICAgICAgICAgICAgIGFuaW1hdGlvbiBiYWNrZ3JvdW5kIGJlaW5nIHRlc3RlZCBpcyBub3QgdXNlZCBpbiB0cmFuc2x1Y2VudCBhY3Rpdml0aWVzLiAtLT4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLkFuaW1hdGlvblRlc3RBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBzdHlsZS9PcGFxdWVUaGVtZSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiCisgICAgICAgIC8+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5WaXJ0dWFsRGlzcGxheUFjdGl2aXR5IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpyZXNpemVhYmxlQWN0aXZpdHk9InRydWUiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXNrQWZmaW5pdHk9Im5vYm9keS5idXQuVmlydHVhbERpc3BsYXlBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29uZmlnQ2hhbmdlcz0ib3JpZW50YXRpb258c2NyZWVuU2l6ZXxzbWFsbGVzdFNjcmVlblNpemV8c2NyZWVuTGF5b3V0IgorICAgICAgICAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuU2hvd1doZW5Mb2NrZWRBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiCisgICAgICAgIC8+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5TaG93V2hlbkxvY2tlZFdpdGhEaWFsb2dBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiCisgICAgICAgIC8+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5TaG93V2hlbkxvY2tlZERpYWxvZ0FjdGl2aXR5IgorICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLk1hdGVyaWFsLkRpYWxvZyIKKyAgICAgICAgLz4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLlNob3dXaGVuTG9ja2VkVHJhbnNsdWNlbnRBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5UcmFuc2x1Y2VudCIKKyAgICAgICAgLz4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLkRpc21pc3NLZXlndWFyZEFjdGl2aXR5IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIKKyAgICAgICAgLz4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLkRpc21pc3NLZXlndWFyZE1ldGhvZEFjdGl2aXR5IgorICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIKKyAgICAgICAgLz4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLldhbGxwYXBlckFjdGl2aXR5IgorICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBzdHlsZS9XYWxscGFwZXJUaGVtZSIKKyAgICAgICAgLz4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLktleWd1YXJkTG9ja0FjdGl2aXR5IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIKKyAgICAgICAgLz4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLkxvZ0NvbmZpZ3VyYXRpb25BY3Rpdml0eSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmNvbmZpZ0NoYW5nZXM9Im9yaWVudGF0aW9ufHNjcmVlblNpemV8c21hbGxlc3RTY3JlZW5TaXplfHNjcmVlbkxheW91dCIKKyAgICAgICAgLz4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLlBvcnRyYWl0T3JpZW50YXRpb25BY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNjcmVlbk9yaWVudGF0aW9uPSJwb3J0cmFpdCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZG9jdW1lbnRMYXVuY2hNb2RlPSJhbHdheXMiCisgICAgICAgIC8+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5MYW5kc2NhcGVPcmllbnRhdGlvbkFjdGl2aXR5IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2NyZWVuT3JpZW50YXRpb249ImxhbmRzY2FwZSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZG9jdW1lbnRMYXVuY2hNb2RlPSJhbHdheXMiCisgICAgICAgIC8+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5Nb3ZlVGFza1RvQmFja0FjdGl2aXR5IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF1bmNoTW9kZT0ic2luZ2xlSW5zdGFuY2UiCisgICAgICAgIC8+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5OaWdodE1vZGVBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmNvbmZpZ0NoYW5nZXM9InVpTW9kZSIKKyAgICAgICAgLz4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLkZvbnRTY2FsZUFjdGl2aXR5IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIKKyAgICAgICAgLz4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLkZvbnRTY2FsZU5vUmVsYXVuY2hBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmNvbmZpZ0NoYW5nZXM9ImZvbnRTY2FsZSIKKyAgICAgICAgLz4KKyAgICAgICAgPHJlY2VpdmVyCisgICAgICAgICAgICBhbmRyb2lkOm5hbWU9Ii5MYXVuY2hCcm9hZGNhc3RSZWNlaXZlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiID4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnNlcnZlci5hbS5MQVVOQ0hfQlJPQURDQVNUX0FDVElPTiIvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L3JlY2VpdmVyPgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5Bc3Npc3RhbnRBY3Rpdml0eSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOnNjcmVlbk9yaWVudGF0aW9uPSJsb2NrZWQiIC8+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5UcmFuc2x1Y2VudEFzc2lzdGFudEFjdGl2aXR5IgorICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBzdHlsZS9UaGVtZS5UcmFuc3BhcmVudCIgLz4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLkxhdW5jaEFzc2lzdGFudEFjdGl2aXR5RnJvbVNlc3Npb24iCisgICAgICAgICAgICBhbmRyb2lkOnRhc2tBZmZpbml0eT0ibm9ib2R5LmJ1dC5MYXVuY2hBc3Npc3RhbnRBY3Rpdml0eUZyb21TZXNzaW9uIgorICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIgLz4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLkxhdW5jaEFzc2lzdGFudEFjdGl2aXR5SW50b0Fzc2lzdGFudFN0YWNrIgorICAgICAgICAgICAgYW5kcm9pZDp0YXNrQWZmaW5pdHk9Im5vYm9keS5idXQuTGF1bmNoQXNzaXN0YW50QWN0aXZpdHlJbnRvQXNzaXN0YW50U3RhY2siCisgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIiAvPgorCisgICAgICAgIDxzZXJ2aWNlIGFuZHJvaWQ6bmFtZT0iLkFzc2lzdGFudFZvaWNlSW50ZXJhY3Rpb25TZXJ2aWNlIgorICAgICAgICAgICAgICAgICBhbmRyb2lkOnBlcm1pc3Npb249ImFuZHJvaWQucGVybWlzc2lvbi5CSU5EX1ZPSUNFX0lOVEVSQUNUSU9OIgorICAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIj4KKyAgICAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnZvaWNlX2ludGVyYWN0aW9uIgorICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnJlc291cmNlPSJAeG1sL2ludGVyYWN0aW9uX3NlcnZpY2UiIC8+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zZXJ2aWNlLnZvaWNlLlZvaWNlSW50ZXJhY3Rpb25TZXJ2aWNlIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L3NlcnZpY2U+CisKKyAgICAgICAgPHNlcnZpY2UgYW5kcm9pZDpuYW1lPSIuQXNzaXN0YW50Vm9pY2VJbnRlcmFjdGlvblNlc3Npb25TZXJ2aWNlIgorICAgICAgICAgICAgICAgICBhbmRyb2lkOnBlcm1pc3Npb249ImFuZHJvaWQucGVybWlzc2lvbi5CSU5EX1ZPSUNFX0lOVEVSQUNUSU9OIgorICAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIiAvPgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5TcGxhc2hzY3JlZW5BY3Rpdml0eSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGFza0FmZmluaXR5PSJub2JvZHkuYnV0LlNwbGFzaHNjcmVlbkFjdGl2aXR5IgorICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQHN0eWxlL1NwbGFzaHNjcmVlblRoZW1lIgorICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIgLz4KKworCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5Td2lwZVJlZnJlc2hBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiIC8+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLk5vSGlzdG9yeUFjdGl2aXR5IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpub0hpc3Rvcnk9InRydWUiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIiAvPgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5TaG93V2hlbkxvY2tlZEF0dHJBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2hvd1doZW5Mb2NrZWQ9InRydWUiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIiAvPgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5TaG93V2hlbkxvY2tlZEF0dHJSZW1vdmVBdHRyQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNob3dXaGVuTG9ja2VkPSJ0cnVlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIgLz4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuU2hvd1doZW5Mb2NrZWRBdHRyV2l0aERpYWxvZ0FjdGl2aXR5IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzaG93V2hlbkxvY2tlZD0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiIC8+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLlR1cm5TY3JlZW5PbkF0dHJBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dHVyblNjcmVlbk9uPSJ0cnVlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIgLz4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuVHVyblNjcmVlbk9uU2hvd09uTG9ja0FjdGl2aXR5IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzaG93V2hlbkxvY2tlZD0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dHVyblNjcmVlbk9uPSJ0cnVlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIgLz4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuVHVyblNjcmVlbk9uQXR0clJlbW92ZUF0dHJBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dHVyblNjcmVlbk9uPSJ0cnVlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzaG93V2hlbkxvY2tlZD0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiIC8+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLlR1cm5TY3JlZW5PblNpbmdsZVRhc2tBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dHVyblNjcmVlbk9uPSJ0cnVlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzaG93V2hlbkxvY2tlZD0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhdW5jaE1vZGU9InNpbmdsZVRhc2siIC8+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLlR1cm5TY3JlZW5PbkF0dHJEaXNtaXNzS2V5Z3VhcmRBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dHVyblNjcmVlbk9uPSJ0cnVlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIvPgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5UdXJuU2NyZWVuT25XaXRoUmVsYXlvdXRBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiLz4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuUmVjdXJzaXZlQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIi8+CisKKyAgICAgICAgPHNlcnZpY2UgYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5jdHMudmVyaWZpZXIudnIuTW9ja1ZyTGlzdGVuZXJTZXJ2aWNlIgorICAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIgorICAgICAgICAgICAgICAgICBhbmRyb2lkOmVuYWJsZWQ9InRydWUiCisgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGVybWlzc2lvbj0iYW5kcm9pZC5wZXJtaXNzaW9uLkJJTkRfVlJfTElTVEVORVJfU0VSVklDRSI+CisgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc2VydmljZS52ci5Wckxpc3RlbmVyU2VydmljZSIgLz4KKyAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L3NlcnZpY2U+CisgICAgPC9hcHBsaWNhdGlvbj4KKzwvbWFuaWZlc3Q+CisKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvcmVzL2FuaW0vYW5pbWF0aW9uX3dpdGhfYmFja2dyb3VuZC54bWwgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3Jlcy9hbmltL2FuaW1hdGlvbl93aXRoX2JhY2tncm91bmQueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3Jlcy9hbmltL2FuaW1hdGlvbl93aXRoX2JhY2tncm91bmQueG1sCnJlbmFtZSB0byB0ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3Jlcy9hbmltL2FuaW1hdGlvbl93aXRoX2JhY2tncm91bmQueG1sCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3Jlcy9sYXlvdXQvYXNzaXN0YW50LnhtbCBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvcmVzL2xheW91dC9hc3Npc3RhbnQueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3Jlcy9sYXlvdXQvYXNzaXN0YW50LnhtbApyZW5hbWUgdG8gdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9yZXMvbGF5b3V0L2Fzc2lzdGFudC54bWwKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvcmVzL2xheW91dC9mbG9hdGluZy54bWwgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3Jlcy9sYXlvdXQvZmxvYXRpbmcueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3Jlcy9sYXlvdXQvZmxvYXRpbmcueG1sCnJlbmFtZSB0byB0ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3Jlcy9sYXlvdXQvZmxvYXRpbmcueG1sCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3Jlcy9sYXlvdXQvZm9udF9zY2FsZS54bWwgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3Jlcy9sYXlvdXQvZm9udF9zY2FsZS54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGhvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvcmVzL2xheW91dC9mb250X3NjYWxlLnhtbApyZW5hbWUgdG8gdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9yZXMvbGF5b3V0L2ZvbnRfc2NhbGUueG1sCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3Jlcy9sYXlvdXQvbWFpbi54bWwgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3Jlcy9sYXlvdXQvbWFpbi54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGhvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvcmVzL2xheW91dC9tYWluLnhtbApyZW5hbWUgdG8gdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9yZXMvbGF5b3V0L21haW4ueG1sCmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3Jlcy9sYXlvdXQvcmVzaXplYWJsZV9hY3Rpdml0eS54bWwgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3Jlcy9sYXlvdXQvcmVzaXplYWJsZV9hY3Rpdml0eS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MyNDliZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvcmVzL2xheW91dC9yZXNpemVhYmxlX2FjdGl2aXR5LnhtbApAQCAtMCwwICsxLDIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICB+IENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgIH4KKyAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIH4KKyAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICB+CisgIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgIC0tPgorCis8YW5kcm9pZC5zZXJ2ZXIuYW0uTGlmZWN5Y2xlTG9nVmlldyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCI+Cis8L2FuZHJvaWQuc2VydmVyLmFtLkxpZmVjeWNsZUxvZ1ZpZXc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9yZXMvbGF5b3V0L3RhcF90b19maW5pc2hfcGlwX2xheW91dC54bWwgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3Jlcy9sYXlvdXQvdGFwX3RvX2ZpbmlzaF9waXBfbGF5b3V0LnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaG9zdHNpZGV0ZXN0cy9zZXJ2aWNlcy9hY3Rpdml0eWFuZHdpbmRvd21hbmFnZXIvYWN0aXZpdHltYW5hZ2VyL2FwcC9yZXMvbGF5b3V0L3RhcF90b19maW5pc2hfcGlwX2xheW91dC54bWwKcmVuYW1lIHRvIHRlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvcmVzL2xheW91dC90YXBfdG9fZmluaXNoX3BpcF9sYXlvdXQueG1sCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3Jlcy9sYXlvdXQvdGFza19vdmVybGF5LnhtbCBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvcmVzL2xheW91dC90YXNrX292ZXJsYXkueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3Jlcy9sYXlvdXQvdGFza19vdmVybGF5LnhtbApyZW5hbWUgdG8gdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9yZXMvbGF5b3V0L3Rhc2tfb3ZlcmxheS54bWwKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvcmVzL2xheW91dC90cmFuc2x1Y2VudC54bWwgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3Jlcy9sYXlvdXQvdHJhbnNsdWNlbnQueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3Jlcy9sYXlvdXQvdHJhbnNsdWNlbnQueG1sCnJlbmFtZSB0byB0ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3Jlcy9sYXlvdXQvdHJhbnNsdWNlbnQueG1sCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3Jlcy9sYXlvdXQvdmlydHVhbF9kaXNwbGF5X2xheW91dC54bWwgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3Jlcy9sYXlvdXQvdmlydHVhbF9kaXNwbGF5X2xheW91dC54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGhvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvcmVzL2xheW91dC92aXJ0dWFsX2Rpc3BsYXlfbGF5b3V0LnhtbApyZW5hbWUgdG8gdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9yZXMvbGF5b3V0L3ZpcnR1YWxfZGlzcGxheV9sYXlvdXQueG1sCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3Jlcy92YWx1ZXMvY29sb3JzLnhtbCBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvcmVzL3ZhbHVlcy9jb2xvcnMueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci9hY3Rpdml0eW1hbmFnZXIvYXBwL3Jlcy92YWx1ZXMvY29sb3JzLnhtbApyZW5hbWUgdG8gdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9yZXMvdmFsdWVzL2NvbG9ycy54bWwKZGlmZiAtLWdpdCBhL2hvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvcmVzL3ZhbHVlcy9zdHlsZXMueG1sIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9yZXMvdmFsdWVzL3N0eWxlcy54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGhvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL2FjdGl2aXR5bWFuYWdlci9hcHAvcmVzL3ZhbHVlcy9zdHlsZXMueG1sCnJlbmFtZSB0byB0ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbApkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9yZXMveG1sL2ludGVyYWN0aW9uX3NlcnZpY2UueG1sIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9yZXMveG1sL2ludGVyYWN0aW9uX3NlcnZpY2UueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ODYwMzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3Jlcy94bWwvaW50ZXJhY3Rpb25fc2VydmljZS54bWwKQEAgLTAsMCArMSwyMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHZvaWNlLWludGVyYWN0aW9uLXNlcnZpY2UgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6c2Vzc2lvblNlcnZpY2U9ImFuZHJvaWQuc2VydmVyLmFtLkFzc2lzdGFudFZvaWNlSW50ZXJhY3Rpb25TZXNzaW9uU2VydmljZSIKKyAgICBhbmRyb2lkOnJlY29nbml0aW9uU2VydmljZT0iYW5kcm9pZC5zZXJ2ZXIuYW0uQXNzaXN0YW50Vm9pY2VJbnRlcmFjdGlvblNlc3Npb25TZXJ2aWNlIgorICAgIGFuZHJvaWQ6c3VwcG9ydHNBc3Npc3Q9InRydWUiIC8+CmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9BbHRMYXVuY2hpbmdBY3Rpdml0eS5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vQWx0TGF1bmNoaW5nQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDdhYThhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vQWx0TGF1bmNoaW5nQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLmFtOworCisvKioKKyAqIEFuIGFkZGl0aW9uYWwgbGF1bmNoaW5nIGFjdGl2aXR5IHVzZWQgZm9yIGFsdGVybmF0aW5nIGJldHdlZW4gdHdvIGFjdGl2aXRpZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBBbHRMYXVuY2hpbmdBY3Rpdml0eSBleHRlbmRzIExhdW5jaGluZ0FjdGl2aXR5IHsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0Fsd2F5c0ZvY3VzYWJsZVBpcEFjdGl2aXR5LmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9BbHdheXNGb2N1c2FibGVQaXBBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNzQ5NzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9BbHdheXNGb2N1c2FibGVQaXBBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW07CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuV2luZG93Q29uZmlndXJhdGlvbi5XSU5ET1dJTkdfTU9ERV9QSU5ORUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5JbnRlbnQuRkxBR19BQ1RJVklUWV9DTEVBUl9UQVNLOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0s7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU9wdGlvbnM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OworCitwdWJsaWMgY2xhc3MgQWx3YXlzRm9jdXNhYmxlUGlwQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBzdGF0aWMgdm9pZCBsYXVuY2hBbHdheXNGb2N1c2FibGVQaXBBY3Rpdml0eShBY3Rpdml0eSBjYWxsZXIsIGJvb2xlYW4gbmV3VGFzaykgeworICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChjYWxsZXIsIEFsd2F5c0ZvY3VzYWJsZVBpcEFjdGl2aXR5LmNsYXNzKTsKKworICAgICAgICBpbnRlbnQuc2V0RmxhZ3MoRkxBR19BQ1RJVklUWV9DTEVBUl9UQVNLKTsKKyAgICAgICAgaWYgKG5ld1Rhc2spIHsKKyAgICAgICAgICAgIGludGVudC5hZGRGbGFncyhGTEFHX0FDVElWSVRZX05FV19UQVNLKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIEFjdGl2aXR5T3B0aW9ucyBvcHRpb25zID0gQWN0aXZpdHlPcHRpb25zLm1ha2VCYXNpYygpOworICAgICAgICBvcHRpb25zLnNldExhdW5jaEJvdW5kcyhuZXcgUmVjdCgwLCAwLCA1MDAsIDUwMCkpOworICAgICAgICBvcHRpb25zLnNldExhdW5jaFdpbmRvd2luZ01vZGUoV0lORE9XSU5HX01PREVfUElOTkVEKTsKKyAgICAgICAgY2FsbGVyLnN0YXJ0QWN0aXZpdHkoaW50ZW50LCBvcHRpb25zLnRvQnVuZGxlKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0FuaW1hdGlvblRlc3RBY3Rpdml0eS5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vQW5pbWF0aW9uVGVzdEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg3YWM4NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0FuaW1hdGlvblRlc3RBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLmFtOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CisKK3B1YmxpYyBjbGFzcyBBbmltYXRpb25UZXN0QWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKKyAgICAgICAgb3ZlcnJpZGVQZW5kaW5nVHJhbnNpdGlvbihSLmFuaW0uYW5pbWF0aW9uX3dpdGhfYmFja2dyb3VuZCwgLTEpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0Fzc2lzdGFudEFjdGl2aXR5LmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9Bc3Npc3RhbnRBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxYTlmOWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9Bc3Npc3RhbnRBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW07CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuV2luZG93Q29uZmlndXJhdGlvbi5BQ1RJVklUWV9UWVBFX0FTU0lTVEFOVDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LkludGVudC5GTEFHX0FDVElWSVRZX0NMRUFSX1RBU0s7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5JbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSzsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5Bc3Npc3RhbnRBY3Rpdml0eS5FWFRSQV9BU1NJU1RBTlRfRElTUExBWV9JRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5Bc3Npc3RhbnRBY3Rpdml0eS5FWFRSQV9BU1NJU1RBTlRfRU5URVJfUElQOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLkFzc2lzdGFudEFjdGl2aXR5LkVYVFJBX0FTU0lTVEFOVF9GSU5JU0hfU0VMRjsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5Bc3Npc3RhbnRBY3Rpdml0eS5FWFRSQV9BU1NJU1RBTlRfTEFVTkNIX05FV19UQVNLOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlPcHRpb25zOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CisKK3B1YmxpYyBjbGFzcyBBc3Npc3RhbnRBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICAvLyBTZXQgdGhlIGxheW91dAorICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5hc3Npc3RhbnQpOworCisgICAgICAgIC8vIExhdW5jaCB0aGUgbmV3IGFjdGl2aXR5IGlmIHJlcXVlc3RlZAorICAgICAgICBpZiAoZ2V0SW50ZW50KCkuaGFzRXh0cmEoRVhUUkFfQVNTSVNUQU5UX0xBVU5DSF9ORVdfVEFTSykpIHsKKyAgICAgICAgICAgIGZpbmFsIENvbXBvbmVudE5hbWUgbGF1bmNoQWN0aXZpdHkgPSBDb21wb25lbnROYW1lLnVuZmxhdHRlbkZyb21TdHJpbmcoCisgICAgICAgICAgICAgICAgICAgIGdldEludGVudCgpLmdldFN0cmluZ0V4dHJhKEVYVFJBX0FTU0lTVEFOVF9MQVVOQ0hfTkVXX1RBU0spKTsKKyAgICAgICAgICAgIGZpbmFsIEludGVudCBsYXVuY2hJbnRlbnQgPSBuZXcgSW50ZW50KCk7CisgICAgICAgICAgICBsYXVuY2hJbnRlbnQuc2V0Q29tcG9uZW50KGxhdW5jaEFjdGl2aXR5KQorICAgICAgICAgICAgICAgICAgICAuc2V0RmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0sgfCBJbnRlbnQuRkxBR19BQ1RJVklUWV9DTEVBUl9UQVNLKTsKKyAgICAgICAgICAgIGlmIChnZXRJbnRlbnQoKS5oYXNFeHRyYShFWFRSQV9BU1NJU1RBTlRfRElTUExBWV9JRCkpIHsKKyAgICAgICAgICAgICAgICBBY3Rpdml0eU9wdGlvbnMgZGlzcGxheU9wdGlvbnMgPSBBY3Rpdml0eU9wdGlvbnMubWFrZUJhc2ljKCk7CisgICAgICAgICAgICAgICAgZGlzcGxheU9wdGlvbnMuc2V0TGF1bmNoRGlzcGxheUlkKEludGVnZXIucGFyc2VJbnQoZ2V0SW50ZW50KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTdHJpbmdFeHRyYShFWFRSQV9BU1NJU1RBTlRfRElTUExBWV9JRCkpKTsKKyAgICAgICAgICAgICAgICBzdGFydEFjdGl2aXR5KGxhdW5jaEludGVudCwgZGlzcGxheU9wdGlvbnMudG9CdW5kbGUoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0YXJ0QWN0aXZpdHkobGF1bmNoSW50ZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEVudGVyIHBpcCBpZiByZXF1ZXN0ZWQKKyAgICAgICAgaWYgKGdldEludGVudCgpLmhhc0V4dHJhKEVYVFJBX0FTU0lTVEFOVF9FTlRFUl9QSVApKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGVudGVyUGljdHVyZUluUGljdHVyZU1vZGUoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZmluaXNoKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gRmluaXNoIHRoaXMgYWN0aXZpdHkgaWYgcmVxdWVzdGVkCisgICAgICAgIGlmIChnZXRJbnRlbnQoKS5oYXNFeHRyYShFWFRSQV9BU1NJU1RBTlRfRklOSVNIX1NFTEYpKSB7CisgICAgICAgICAgICBmaW5pc2goKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIExhdW5jaGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBBc3Npc3RhbnRBY3Rpdml0eSBkaXJlY3RseSBpbnRvIHRoZSBhc3Npc3RhbnQgc3RhY2suCisgICAgICovCisgICAgc3RhdGljIHZvaWQgbGF1bmNoQWN0aXZpdHlJbnRvQXNzaXN0YW50U3RhY2soQWN0aXZpdHkgY2FsbGVyLCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KGNhbGxlciwgQXNzaXN0YW50QWN0aXZpdHkuY2xhc3MpOworICAgICAgICBpbnRlbnQuc2V0RmxhZ3MoRkxBR19BQ1RJVklUWV9DTEVBUl9UQVNLIHwgRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7CisgICAgICAgIGlmIChleHRyYXMgIT0gbnVsbCkgeworICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhcyhleHRyYXMpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgQWN0aXZpdHlPcHRpb25zIG9wdGlvbnMgPSBBY3Rpdml0eU9wdGlvbnMubWFrZUJhc2ljKCk7CisgICAgICAgIG9wdGlvbnMuc2V0TGF1bmNoQWN0aXZpdHlUeXBlKEFDVElWSVRZX1RZUEVfQVNTSVNUQU5UKTsKKyAgICAgICAgY2FsbGVyLnN0YXJ0QWN0aXZpdHkoaW50ZW50LCBvcHRpb25zLnRvQnVuZGxlKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0Fzc2lzdGFudFZvaWNlSW50ZXJhY3Rpb25TZXJ2aWNlLmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9Bc3Npc3RhbnRWb2ljZUludGVyYWN0aW9uU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZjdhODUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9Bc3Npc3RhbnRWb2ljZUludGVyYWN0aW9uU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW07CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQuc2VydmljZS52b2ljZS5Wb2ljZUludGVyYWN0aW9uU2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitwdWJsaWMgY2xhc3MgQXNzaXN0YW50Vm9pY2VJbnRlcmFjdGlvblNlcnZpY2UgZXh0ZW5kcyBWb2ljZUludGVyYWN0aW9uU2VydmljZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gQXNzaXN0YW50Vm9pY2VJbnRlcmFjdGlvblNlcnZpY2UuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOworCisgICAgcHJpdmF0ZSBib29sZWFuIG1SZWFkeTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBtU3RhcnRlZDsKKyAgICBwcml2YXRlIEJ1bmRsZSBtRXh0cmFzOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25SZWFkeSgpIHsKKyAgICAgICAgc3VwZXIub25SZWFkeSgpOworICAgICAgICBtUmVhZHkgPSB0cnVlOworICAgICAgICBzaG93U2Vzc2lvbklmUmVhZHkoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IG9uU3RhcnRDb21tYW5kKEludGVudCBpbnRlbnQsIGludCBmbGFncywgaW50IHN0YXJ0SWQpIHsKKyAgICAgICAgaWYgKCFpc0FjdGl2ZVNlcnZpY2UodGhpcywgbmV3IENvbXBvbmVudE5hbWUodGhpcywgZ2V0Q2xhc3MoKSkpKSB7CisgICAgICAgICAgICBMb2cud3RmKFRBRywgIioqKiogTm90IHN0YXJ0aW5nIEFzc2lzdGFudFZvaWNlSW50ZXJhY3Rpb25TZXJ2aWNlIGJlY2F1c2UiICsKKyAgICAgICAgICAgICAgICAgICAgIiBpdCBpcyBub3Qgc2V0IGFzIHRoZSBjdXJyZW50IHZvaWNlIGludGVyYWN0aW9uIHNlcnZpY2UiKTsKKyAgICAgICAgICAgIHN0b3BTZWxmKCk7CisgICAgICAgICAgICByZXR1cm4gU1RBUlRfTk9UX1NUSUNLWTsKKyAgICAgICAgfQorICAgICAgICBtRXh0cmFzID0gaW50ZW50LmdldEV4dHJhcygpICE9IG51bGwgPyBpbnRlbnQuZ2V0RXh0cmFzKCkgOiBuZXcgQnVuZGxlKCk7CisgICAgICAgIG1TdGFydGVkID0gdHJ1ZTsKKyAgICAgICAgc2hvd1Nlc3Npb25JZlJlYWR5KCk7CisgICAgICAgIHJldHVybiBTVEFSVF9OT1RfU1RJQ0tZOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzaG93U2Vzc2lvbklmUmVhZHkoKSB7CisgICAgICAgIGlmIChtUmVhZHkgJiYgbVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgIHNob3dTZXNzaW9uKG1FeHRyYXMsIDApOworICAgICAgICB9CisgICAgfTsKKworICAgIC8qKgorICAgICAqIFN0YXJ0cyB0aGUgYXNzaXN0YW50IHZvaWNlIGludGVyYWN0aW9uIHNlcnZpY2UsIHdoaWNoIGluaXRpYXRlcyBhIG5ldyBzZXNzaW9uIHRoYXQgc3RhcnRzCisgICAgICogdGhlIGFzc2lzdGFudCBhY3Rpdml0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbGF1bmNoQXNzaXN0YW50QWN0aXZpdHkoQ29udGV4dCBjb250ZXh0LCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgIEludGVudCBpID0gbmV3IEludGVudChjb250ZXh0LCBBc3Npc3RhbnRWb2ljZUludGVyYWN0aW9uU2VydmljZS5jbGFzcyk7CisgICAgICAgIGlmIChleHRyYXMgIT0gbnVsbCkgeworICAgICAgICAgICAgaS5wdXRFeHRyYXMoZXh0cmFzKTsKKyAgICAgICAgfQorICAgICAgICBjb250ZXh0LnN0YXJ0U2VydmljZShpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9Bc3Npc3RhbnRWb2ljZUludGVyYWN0aW9uU2Vzc2lvblNlcnZpY2UuamF2YSBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0Fzc2lzdGFudFZvaWNlSW50ZXJhY3Rpb25TZXNzaW9uU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZWQyMDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9Bc3Npc3RhbnRWb2ljZUludGVyYWN0aW9uU2Vzc2lvblNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLmFtOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnNlcnZpY2Uudm9pY2UuVm9pY2VJbnRlcmFjdGlvblNlc3Npb247CitpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLnZvaWNlLlZvaWNlSW50ZXJhY3Rpb25TZXNzaW9uU2VydmljZTsKKworcHVibGljIGNsYXNzIEFzc2lzdGFudFZvaWNlSW50ZXJhY3Rpb25TZXNzaW9uU2VydmljZSBleHRlbmRzIFZvaWNlSW50ZXJhY3Rpb25TZXNzaW9uU2VydmljZSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVm9pY2VJbnRlcmFjdGlvblNlc3Npb24gb25OZXdTZXNzaW9uKEJ1bmRsZSBhcmdzKSB7CisgICAgICAgIHJldHVybiBuZXcgVm9pY2VJbnRlcmFjdGlvblNlc3Npb24odGhpcykgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblByZXBhcmVTaG93KEJ1bmRsZSBhcmdzLCBpbnQgc2hvd0ZsYWdzKSB7CisgICAgICAgICAgICAgICAgc2V0VWlFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblNob3coQnVuZGxlIGFyZ3MsIGludCBzaG93RmxhZ3MpIHsKKyAgICAgICAgICAgICAgICBJbnRlbnQgaSA9IG5ldyBJbnRlbnQoQXNzaXN0YW50Vm9pY2VJbnRlcmFjdGlvblNlc3Npb25TZXJ2aWNlLnRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICBBc3Npc3RhbnRBY3Rpdml0eS5jbGFzcyk7CisgICAgICAgICAgICAgICAgaWYgKGFyZ3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpLnB1dEV4dHJhcyhhcmdzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RhcnRBc3Npc3RhbnRBY3Rpdml0eShpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9Cb3R0b21BY3Rpdml0eS5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vQm90dG9tQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzI2ODk0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vQm90dG9tQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbTsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLkJvdHRvbUFjdGl2aXR5LkVYVFJBX0JPVFRPTV9XQUxMUEFQRVI7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuQm90dG9tQWN0aXZpdHkuRVhUUkFfU1RPUF9ERUxBWTsKKworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7CisKK3B1YmxpYyBjbGFzcyBCb3R0b21BY3Rpdml0eSBleHRlbmRzIEFic3RyYWN0TGlmZWN5Y2xlTG9nQWN0aXZpdHkgeworCisgICAgcHJpdmF0ZSBpbnQgbVN0b3BEZWxheTsKKyAgICBwcml2YXRlIFZpZXcgbUZsb2F0aW5nV2luZG93OworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIGZpbmFsIGJvb2xlYW4gdXNlV2FsbHBhcGVyID0gZ2V0SW50ZW50KCkuZ2V0Qm9vbGVhbkV4dHJhKEVYVFJBX0JPVFRPTV9XQUxMUEFQRVIsIGZhbHNlKTsKKyAgICAgICAgaWYgKHVzZVdhbGxwYXBlcikgeworICAgICAgICAgICAgc2V0VGhlbWUoUi5zdHlsZS5XYWxscGFwZXJUaGVtZSk7CisgICAgICAgIH0KKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQubWFpbik7CisKKyAgICAgICAgLy8gRGVsYXllZCBzdG9wIGlzIGZvciBzaW11bGF0aW5nIGEgY2FzZSB3aGVyZSByZXN1bWUgaGFwcGVucyBiZWZvcmUKKyAgICAgICAgLy8gYWN0aXZpdHlTdG9wcGVkKCkgaXMgcmVjZWl2ZWQgYnkgQU0sIGFuZCB0aGUgdHJhbnNpdGlvbiBzdGFydHMgd2l0aG91dAorICAgICAgICAvLyBnb2luZyB0aHJvdWdoIGZ1bGx5IHN0b3BwZWQgc3RhdGUgKHNlZSBiLzMwMjU1MzU0KS4KKyAgICAgICAgLy8gSWYgZW5hYmxlZCwgd2Ugc3RhbGwgb25TdG9wKCkgb2YgQm90dG9tQWN0aXZpdHksIG9wZW4gVG9wQWN0aXZpdHkgYnV0IG1ha2UKKyAgICAgICAgLy8gaXQgZmluaXNoIGJlZm9yZSBvblN0b3AoKSBlbmRzLiBUaGlzIHdpbGwgY2F1c2UgQm90dG9tQWN0aXZpdHkgdG8gcmVzdW1lIGJlZm9yZQorICAgICAgICAvLyBpdCBub3RpZmllcyBBTSBvZiBhY3Rpdml0eVN0b3BwZWQoKS4gV2UgYWxzbyBhZGQgYSBzZWNvbmQgd2luZG93IG9mCisgICAgICAgIC8vIFRZUEVfQkFTRV9BUFBMSUNBVElPTiwgc28gdGhhdCB0aGUgdHJhbnNpdGlvbiBhbmltYXRpb24gY291bGQgc3RhcnQgZWFybGllci4KKyAgICAgICAgLy8gT3RoZXJ3aXNlIHRoZSBtYWluIHdpbmRvdyBoYXMgdG8gcmVsYXlvdXQgdG8gdmlzaWJsZSBmaXJzdCBhbmQgdGhlIGVycm9yIHdvbid0IG9jY3VyLgorICAgICAgICAvLyBOb3RlIHRoYXQgaWYgdGhlIHRlc3QgZmFpbHMsIHdlIHNob3VsZG4ndCB0cnkgdG8gY2hhbmdlIHRoZSBhcHAgaGVyZSB0byBtYWtlCisgICAgICAgIC8vIGl0IHBhc3MuIFRoZSB0ZXN0IGFwcCBpcyBhcnRpZmljaWFsbHkgbWFkZSB0byBzaW11bGF0ZSBhbiBmYWlsdXJlIGNhc2UsIGJ1dAorICAgICAgICAvLyBpdCdzIG5vdCBkb2luZyBhbnl0aGluZyB3cm9uZy4KKyAgICAgICAgbVN0b3BEZWxheSA9IGdldEludGVudCgpLmdldEludEV4dHJhKEVYVFJBX1NUT1BfREVMQVksIDApOworICAgICAgICBpZiAobVN0b3BEZWxheSA+IDApIHsKKyAgICAgICAgICAgIExheW91dEluZmxhdGVyIGluZmxhdGVyID0gZ2V0TGF5b3V0SW5mbGF0ZXIoKTsKKyAgICAgICAgICAgIG1GbG9hdGluZ1dpbmRvdyA9IGluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQuZmxvYXRpbmcsIG51bGwpOworCisgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBwYXJhbXMgPSBuZXcgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMoKTsKKyAgICAgICAgICAgIHBhcmFtcy5oZWlnaHQgPSBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQ7CisgICAgICAgICAgICBwYXJhbXMud2lkdGggPSBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQ7CisgICAgICAgICAgICBwYXJhbXMudHlwZSA9IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlRZUEVfQkFTRV9BUFBMSUNBVElPTjsKKyAgICAgICAgICAgIHBhcmFtcy5zZXRUaXRsZSgiRmxvYXRpbmciKTsKKyAgICAgICAgICAgIGdldFdpbmRvd01hbmFnZXIoKS5hZGRWaWV3KG1GbG9hdGluZ1dpbmRvdywgcGFyYW1zKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uUmVzdW1lKCkgeworICAgICAgICBMb2cuZChnZXRUYWcoKSwgIm9uUmVzdW1lKCkgRSIpOworICAgICAgICBzdXBlci5vblJlc3VtZSgpOworCisgICAgICAgIGlmIChtU3RvcERlbGF5ID4gMCkgeworICAgICAgICAgICAgLy8gUmVmcmVzaCBmbG9hdGluZyB3aW5kb3cKKyAgICAgICAgICAgIExvZy5kKGdldFRhZygpLCAiU2NoZWR1bGluZyBpbnZhbGlkYXRlIEZsb2F0aW5nIFdpbmRvdyBpbiBvblJlc3VtZSgpIik7CisgICAgICAgICAgICBtRmxvYXRpbmdXaW5kb3cuaW52YWxpZGF0ZSgpOworICAgICAgICB9CisKKyAgICAgICAgTG9nLmQoZ2V0VGFnKCksICJvblJlc3VtZSgpIFgiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblN0b3AoKSB7CisgICAgICAgIHN1cGVyLm9uU3RvcCgpOworCisgICAgICAgIGlmIChtU3RvcERlbGF5ID4gMCkgeworICAgICAgICAgICAgTG9nLmQoZ2V0VGFnKCksICJTdGFsbGluZyBvblN0b3AoKSBieSAiICsgbVN0b3BEZWxheSArICIgbXMuLi4iKTsKKyAgICAgICAgICAgIFN5c3RlbUNsb2NrLnNsZWVwKG1TdG9wRGVsYXkpOworCisgICAgICAgICAgICAvLyBSZWZyZXNoIGZsb2F0aW5nIHdpbmRvdworICAgICAgICAgICAgTG9nLmQoZ2V0VGFnKCksICJTY2hlZHVsaW5nIGludmFsaWRhdGUgRmxvYXRpbmcgV2luZG93IGluIG9uU3RvcCgpIik7CisgICAgICAgICAgICBtRmxvYXRpbmdXaW5kb3cuaW52YWxpZGF0ZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vQm90dG9tTGVmdExheW91dEFjdGl2aXR5LmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9Cb3R0b21MZWZ0TGF5b3V0QWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzRmY2IwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vQm90dG9tTGVmdExheW91dEFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW07CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKKworcHVibGljIGNsYXNzIEJvdHRvbUxlZnRMYXlvdXRBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0JvdHRvbVJpZ2h0TGF5b3V0QWN0aXZpdHkuamF2YSBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0JvdHRvbVJpZ2h0TGF5b3V0QWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDBlMWUyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vQm90dG9tUmlnaHRMYXlvdXRBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLmFtOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CisKK3B1YmxpYyBjbGFzcyBCb3R0b21SaWdodExheW91dEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vQnJvYWRjYXN0UmVjZWl2ZXJBY3Rpdml0eS5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vQnJvYWRjYXN0UmVjZWl2ZXJBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNDhiMzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9Ccm9hZGNhc3RSZWNlaXZlckFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW07CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5Ccm9hZGNhc3RSZWNlaXZlckFjdGl2aXR5LkFDVElPTl9UUklHR0VSX0JST0FEQ0FTVDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5Ccm9hZGNhc3RSZWNlaXZlckFjdGl2aXR5LkVYVFJBX0JST0FEQ0FTVF9PUklFTlRBVElPTjsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5Ccm9hZGNhc3RSZWNlaXZlckFjdGl2aXR5LkVYVFJBX0RJU01JU1NfS0VZR1VBUkQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuQnJvYWRjYXN0UmVjZWl2ZXJBY3Rpdml0eS5FWFRSQV9ESVNNSVNTX0tFWUdVQVJEX01FVEhPRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5Ccm9hZGNhc3RSZWNlaXZlckFjdGl2aXR5LkVYVFJBX0ZJTklTSF9CUk9BRENBU1Q7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuQnJvYWRjYXN0UmVjZWl2ZXJBY3Rpdml0eS5FWFRSQV9NT1ZFX0JST0FEQ0FTVF9UT19CQUNLOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0RJU01JU1NfS0VZR1VBUkQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5MQVlPVVRfSU5fRElTUExBWV9DVVRPVVRfTU9ERV9TSE9SVF9FREdFUzsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuYXBwLktleWd1YXJkTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OworCisvKioKKyAqIEFjdGl2aXR5IHRoYXQgcmVnaXN0ZXJzIGJyb2FkY2FzdCByZWNlaXZlciAuCisgKi8KK3B1YmxpYyBjbGFzcyBCcm9hZGNhc3RSZWNlaXZlckFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBCcm9hZGNhc3RSZWNlaXZlckFjdGl2aXR5LmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKworICAgIHByaXZhdGUgVGVzdEJyb2FkY2FzdFJlY2VpdmVyIG1Ccm9hZGNhc3RSZWNlaXZlciA9IG5ldyBUZXN0QnJvYWRjYXN0UmVjZWl2ZXIoKTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKKworICAgICAgICBJbnRlbnRGaWx0ZXIgYnJvYWRjYXN0RmlsdGVyID0gbmV3IEludGVudEZpbHRlcihBQ1RJT05fVFJJR0dFUl9CUk9BRENBU1QpOworCisgICAgICAgIHJlZ2lzdGVyUmVjZWl2ZXIobUJyb2FkY2FzdFJlY2VpdmVyLCBicm9hZGNhc3RGaWx0ZXIpOworCisgICAgICAgIC8vIERldGVybWluZSBpZiBhIGRpc3BsYXkgY3V0b3V0IGlzIHByZXNlbnQKKyAgICAgICAgZmluYWwgVmlldyB2aWV3ID0gbmV3IFZpZXcodGhpcyk7CisgICAgICAgIGdldFdpbmRvdygpLnJlcXVlc3RGZWF0dXJlKFdpbmRvdy5GRUFUVVJFX05PX1RJVExFKTsKKyAgICAgICAgZ2V0V2luZG93KCkuZ2V0QXR0cmlidXRlcygpLmxheW91dEluRGlzcGxheUN1dG91dE1vZGUgPQorICAgICAgICAgICAgICAgIExBWU9VVF9JTl9ESVNQTEFZX0NVVE9VVF9NT0RFX1NIT1JUX0VER0VTOworICAgICAgICB2aWV3LnNldExheW91dFBhcmFtcyhuZXcgVmlld0dyb3VwLkxheW91dFBhcmFtcyhNQVRDSF9QQVJFTlQsIE1BVENIX1BBUkVOVCkpOworICAgICAgICB2aWV3LnNldFN5c3RlbVVpVmlzaWJpbGl0eShWaWV3LlNZU1RFTV9VSV9GTEFHX0xBWU9VVF9GVUxMU0NSRUVOCisgICAgICAgICAgICAgICAgfCBWaWV3LlNZU1RFTV9VSV9GTEFHX0xBWU9VVF9ISURFX05BVklHQVRJT04pOworICAgICAgICB2aWV3LnNldE9uQXBwbHlXaW5kb3dJbnNldHNMaXN0ZW5lcigodiwgaW5zZXRzKSAtPiB7CisgICAgICAgICAgICBMb2cuaShnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSwgImN1dG91dD0iICsgKGluc2V0cy5nZXREaXNwbGF5Q3V0b3V0KCkgIT0gbnVsbCkpOworICAgICAgICAgICAgcmV0dXJuIGluc2V0czsKKyAgICAgICAgfSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KHZpZXcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uRGVzdHJveSgpIHsKKyAgICAgICAgc3VwZXIub25EZXN0cm95KCk7CisKKyAgICAgICAgdW5yZWdpc3RlclJlY2VpdmVyKG1Ccm9hZGNhc3RSZWNlaXZlcik7CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIFRlc3RCcm9hZGNhc3RSZWNlaXZlciBleHRlbmRzIEJyb2FkY2FzdFJlY2VpdmVyIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBleHRyYXMgPSBpbnRlbnQuZ2V0RXh0cmFzKCk7CisgICAgICAgICAgICBMb2cuaShUQUcsICJvblJlY2VpdmU6IGV4dHJhcz0iICsgZXh0cmFzKTsKKworICAgICAgICAgICAgaWYgKGV4dHJhcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGV4dHJhcy5nZXRCb29sZWFuKEVYVFJBX0ZJTklTSF9CUk9BRENBU1QpKSB7CisgICAgICAgICAgICAgICAgZmluaXNoKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZXh0cmFzLmdldEJvb2xlYW4oRVhUUkFfTU9WRV9CUk9BRENBU1RfVE9fQkFDSykpIHsKKyAgICAgICAgICAgICAgICBtb3ZlVGFza1RvQmFjayh0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChleHRyYXMuY29udGFpbnNLZXkoRVhUUkFfQlJPQURDQVNUX09SSUVOVEFUSU9OKSkgeworICAgICAgICAgICAgICAgIHNldFJlcXVlc3RlZE9yaWVudGF0aW9uKGV4dHJhcy5nZXRJbnQoRVhUUkFfQlJPQURDQVNUX09SSUVOVEFUSU9OKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZXh0cmFzLmdldEJvb2xlYW4oRVhUUkFfRElTTUlTU19LRVlHVUFSRCkpIHsKKyAgICAgICAgICAgICAgICBnZXRXaW5kb3coKS5hZGRGbGFncyhGTEFHX0RJU01JU1NfS0VZR1VBUkQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGV4dHJhcy5nZXRCb29sZWFuKEVYVFJBX0RJU01JU1NfS0VZR1VBUkRfTUVUSE9EKSkgeworICAgICAgICAgICAgICAgIGdldFN5c3RlbVNlcnZpY2UoS2V5Z3VhcmRNYW5hZ2VyLmNsYXNzKS5yZXF1ZXN0RGlzbWlzc0tleWd1YXJkKAorICAgICAgICAgICAgICAgICAgICAgICAgQnJvYWRjYXN0UmVjZWl2ZXJBY3Rpdml0eS50aGlzLCBuZXcgS2V5Z3VhcmREaXNtaXNzTG9nZ2VyQ2FsbGJhY2soY29udGV4dCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBY3Rpdml0eUxhdW5jaGVyLmxhdW5jaEFjdGl2aXR5RnJvbUV4dHJhcyhCcm9hZGNhc3RSZWNlaXZlckFjdGl2aXR5LnRoaXMsIGV4dHJhcyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9Db21wb25lbnRzLmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9Db21wb25lbnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAyZmU4NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0NvbXBvbmVudHMuamF2YQpAQCAtMCwwICsxLDM0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW07CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLnNlcnZlci5hbS5jb21wb25lbnQuQ29tcG9uZW50c0Jhc2U7CisKK3B1YmxpYyBjbGFzcyBDb21wb25lbnRzIGV4dGVuZHMgQ29tcG9uZW50c0Jhc2UgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcG9uZW50TmFtZSBBTFRfTEFVTkNISU5HX0FDVElWSVRZID0gY29tcG9uZW50KCJBbHRMYXVuY2hpbmdBY3Rpdml0eSIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcG9uZW50TmFtZSBBTFdBWVNfRk9DVVNBQkxFX1BJUF9BQ1RJVklUWSA9CisgICAgICAgICAgICBjb21wb25lbnQoIkFsd2F5c0ZvY3VzYWJsZVBpcEFjdGl2aXR5Iik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wb25lbnROYW1lIEFOSU1BVElPTl9URVNUX0FDVElWSVRZID0gY29tcG9uZW50KCJBbmltYXRpb25UZXN0QWN0aXZpdHkiKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBvbmVudE5hbWUgQVNTSVNUQU5UX0FDVElWSVRZID0gY29tcG9uZW50KCJBc3Npc3RhbnRBY3Rpdml0eSIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcG9uZW50TmFtZSBCT1RUT01fQUNUSVZJVFkgPSBjb21wb25lbnQoIkJvdHRvbUFjdGl2aXR5Iik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wb25lbnROYW1lIEJPVFRPTV9MRUZUX0xBWU9VVF9BQ1RJVklUWSA9CisgICAgICAgICAgICBjb21wb25lbnQoIkJvdHRvbUxlZnRMYXlvdXRBY3Rpdml0eSIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcG9uZW50TmFtZSBCT1RUT01fUklHSFRfTEFZT1VUX0FDVElWSVRZID0KKyAgICAgICAgICAgIGNvbXBvbmVudCgiQm90dG9tUmlnaHRMYXlvdXRBY3Rpdml0eSIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcG9uZW50TmFtZSBCUk9BRENBU1RfUkVDRUlWRVJfQUNUSVZJVFkgPQorICAgICAgICAgICAgY29tcG9uZW50KCJCcm9hZGNhc3RSZWNlaXZlckFjdGl2aXR5Iik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wb25lbnROYW1lIERJQUxPR19XSEVOX0xBUkdFX0FDVElWSVRZID0KKyAgICAgICAgICAgIGNvbXBvbmVudCgiRGlhbG9nV2hlbkxhcmdlQWN0aXZpdHkiKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBvbmVudE5hbWUgRElTTUlTU19LRVlHVUFSRF9BQ1RJVklUWSA9CisgICAgICAgICAgICBjb21wb25lbnQoIkRpc21pc3NLZXlndWFyZEFjdGl2aXR5Iik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wb25lbnROYW1lIERJU01JU1NfS0VZR1VBUkRfTUVUSE9EX0FDVElWSVRZID0KKyAgICAgICAgICAgIGNvbXBvbmVudCgiRGlzbWlzc0tleWd1YXJkTWV0aG9kQWN0aXZpdHkiKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBvbmVudE5hbWUgRE9DS0VEX0FDVElWSVRZID0gY29tcG9uZW50KCJEb2NrZWRBY3Rpdml0eSIpOworICAgIC8qKiBUaGlzIGFjdGl2aXR5IGlzIGFuIGFsaWFzIGFjdGl2aXR5IHBvaW50aW5nIHtAbGluayBUcmFtcG9saW5lQWN0aXZpdHl9IGluIEFuZHJvaWRNYW5pZmVzdC54bWwgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBvbmVudE5hbWUgRU5UUllfUE9JTlRfQUxJQVNfQUNUSVZJVFkgPQorICAgICAgICAgICAgY29tcG9uZW50KCJFbnRyeVBvaW50QWxpYXNBY3Rpdml0eSIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcG9uZW50TmFtZSBGT05UX1NDQUxFX0FDVElWSVRZID0gY29tcG9uZW50KCJGb250U2NhbGVBY3Rpdml0eSIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcG9uZW50TmFtZSBGT05UX1NDQUxFX05PX1JFTEFVTkNIX0FDVElWSVRZID0KKyAgICAgICAgICAgIGNvbXBvbmVudCgiRm9udFNjYWxlTm9SZWxhdW5jaEFjdGl2aXR5Iik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wb25lbnROYW1lIEZSRUVGT1JNX0FDVElWSVRZID0gY29tcG9uZW50KCJGcmVlZm9ybUFjdGl2aXR5Iik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wb25lbnROYW1lIEtFWUdVQVJEX0xPQ0tfQUNUSVZJVFkgPSBjb21wb25lbnQoIktleWd1YXJkTG9ja0FjdGl2aXR5Iik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wb25lbnROYW1lIExBTkRTQ0FQRV9PUklFTlRBVElPTl9BQ1RJVklUWSA9CisgICAgICAgICAgICBjb21wb25lbnQoIkxhbmRzY2FwZU9yaWVudGF0aW9uQWN0aXZpdHkiKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBvbmVudE5hbWUgTEFVTkNIX0FTU0lTVEFOVF9BQ1RJVklUWV9GUk9NX1NFU1NJT04gPQorICAgICAgICAgICAgY29tcG9uZW50KCJMYXVuY2hBc3Npc3RhbnRBY3Rpdml0eUZyb21TZXNzaW9uIik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wb25lbnROYW1lIExBVU5DSF9BU1NJU1RBTlRfQUNUSVZJVFlfSU5UT19TVEFDSyAgPQorICAgICAgICAgICAgY29tcG9uZW50KCJMYXVuY2hBc3Npc3RhbnRBY3Rpdml0eUludG9Bc3Npc3RhbnRTdGFjayIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcG9uZW50TmFtZSBMQVVOQ0hfRU5URVJfUElQX0FDVElWSVRZID0KKyAgICAgICAgICAgIGNvbXBvbmVudCgiTGF1bmNoRW50ZXJQaXBBY3Rpdml0eSIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcG9uZW50TmFtZSBMQVVOQ0hfSU5UT19QSU5ORURfU1RBQ0tfUElQX0FDVElWSVRZID0KKyAgICAgICAgICAgIGNvbXBvbmVudCgiTGF1bmNoSW50b1Bpbm5lZFN0YWNrUGlwQWN0aXZpdHkiKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBvbmVudE5hbWUgTEFVTkNIX1BJUF9PTl9QSVBfQUNUSVZJVFkgPQorICAgICAgICAgICAgY29tcG9uZW50KCJMYXVuY2hQaXBPblBpcEFjdGl2aXR5Iik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wb25lbnROYW1lIExBVU5DSElOR19BQ1RJVklUWSA9IGNvbXBvbmVudCgiTGF1bmNoaW5nQWN0aXZpdHkiKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBvbmVudE5hbWUgTE9HX0NPTkZJR1VSQVRJT05fQUNUSVZJVFkgPQorICAgICAgICAgICAgY29tcG9uZW50KCJMb2dDb25maWd1cmF0aW9uQWN0aXZpdHkiKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBvbmVudE5hbWUgTU9WRV9UQVNLX1RPX0JBQ0tfQUNUSVZJVFkgPQorICAgICAgICAgICAgY29tcG9uZW50KCJNb3ZlVGFza1RvQmFja0FjdGl2aXR5Iik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wb25lbnROYW1lIE5JR0hUX01PREVfQUNUSVZJVFkgPSBjb21wb25lbnQoIk5pZ2h0TW9kZUFjdGl2aXR5Iik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wb25lbnROYW1lIE5PX0hJU1RPUllfQUNUSVZJVFkgPSBjb21wb25lbnQoIk5vSGlzdG9yeUFjdGl2aXR5Iik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wb25lbnROYW1lIE5PX1JFTEFVTkNIX0FDVElWSVRZID0gY29tcG9uZW50KCJOb1JlbGF1bmNoQWN0aXZpdHkiKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBvbmVudE5hbWUgTk9OX1JFU0laRUFCTEVfQUNUSVZJVFkgPSBjb21wb25lbnQoIk5vblJlc2l6ZWFibGVBY3Rpdml0eSIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcG9uZW50TmFtZSBQSVBfQUNUSVZJVFkgPSBjb21wb25lbnQoIlBpcEFjdGl2aXR5Iik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wb25lbnROYW1lIFBJUF9BQ1RJVklUWTIgPSBjb21wb25lbnQoIlBpcEFjdGl2aXR5MiIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcG9uZW50TmFtZSBQSVBfQUNUSVZJVFlfV0lUSF9TQU1FX0FGRklOSVRZID0KKyAgICAgICAgICAgIGNvbXBvbmVudCgiUGlwQWN0aXZpdHlXaXRoU2FtZUFmZmluaXR5Iik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wb25lbnROYW1lIFBJUF9PTl9TVE9QX0FDVElWSVRZID0gY29tcG9uZW50KCJQaXBPblN0b3BBY3Rpdml0eSIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcG9uZW50TmFtZSBQT1JUUkFJVF9PUklFTlRBVElPTl9BQ1RJVklUWSA9CisgICAgICAgICAgICBjb21wb25lbnQoIlBvcnRyYWl0T3JpZW50YXRpb25BY3Rpdml0eSIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcG9uZW50TmFtZSBSRUNVUlNJVkVfQUNUSVZJVFkgPSBjb21wb25lbnQoIlJlY3Vyc2l2ZUFjdGl2aXR5Iik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wb25lbnROYW1lIFJFU0laRUFCTEVfQUNUSVZJVFkgPSBjb21wb25lbnQoIlJlc2l6ZWFibGVBY3Rpdml0eSIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcG9uZW50TmFtZSBSRVNVTUVfV0hJTEVfUEFVU0lOR19BQ1RJVklUWSA9CisgICAgICAgICAgICBjb21wb25lbnQoIlJlc3VtZVdoaWxlUGF1c2luZ0FjdGl2aXR5Iik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wb25lbnROYW1lIFNIT1dfV0hFTl9MT0NLRURfQUNUSVZJVFkgPQorICAgICAgICAgICAgY29tcG9uZW50KCJTaG93V2hlbkxvY2tlZEFjdGl2aXR5Iik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wb25lbnROYW1lIFNIT1dfV0hFTl9MT0NLRURfQVRUUl9BQ1RJVklUWSA9CisgICAgICAgICAgICBjb21wb25lbnQoIlNob3dXaGVuTG9ja2VkQXR0ckFjdGl2aXR5Iik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wb25lbnROYW1lIFNIT1dfV0hFTl9MT0NLRURfQVRUUl9SRU1PVkVfQVRUUl9BQ1RJVklUWSA9CisgICAgICAgICAgICBjb21wb25lbnQoIlNob3dXaGVuTG9ja2VkQXR0clJlbW92ZUF0dHJBY3Rpdml0eSIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcG9uZW50TmFtZSBTSE9XX1dIRU5fTE9DS0VEX0RJQUxPR19BQ1RJVklUWSA9CisgICAgICAgICAgICBjb21wb25lbnQoIlNob3dXaGVuTG9ja2VkRGlhbG9nQWN0aXZpdHkiKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBvbmVudE5hbWUgU0hPV19XSEVOX0xPQ0tFRF9UUkFOU0xVQ0VOVF9BQ1RJVklUWSA9CisgICAgICAgICAgICBjb21wb25lbnQoIlNob3dXaGVuTG9ja2VkVHJhbnNsdWNlbnRBY3Rpdml0eSIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcG9uZW50TmFtZSBTSE9XX1dIRU5fTE9DS0VEX1dJVEhfRElBTE9HX0FDVElWSVRZID0KKyAgICAgICAgICAgIGNvbXBvbmVudCgiU2hvd1doZW5Mb2NrZWRXaXRoRGlhbG9nQWN0aXZpdHkiKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBvbmVudE5hbWUgU0lOR0xFX0lOU1RBTkNFX0FDVElWSVRZID0KKyAgICAgICAgICAgIGNvbXBvbmVudCgiU2luZ2xlSW5zdGFuY2VBY3Rpdml0eSIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcG9uZW50TmFtZSBTSU5HTEVfVEFTS19BQ1RJVklUWSA9IGNvbXBvbmVudCgiU2luZ2xlVGFza0FjdGl2aXR5Iik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wb25lbnROYW1lIFNMT1dfQ1JFQVRFX0FDVElWSVRZID0gY29tcG9uZW50KCJTbG93Q3JlYXRlQWN0aXZpdHkiKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBvbmVudE5hbWUgU1BMQVNIU0NSRUVOX0FDVElWSVRZID0gY29tcG9uZW50KCJTcGxhc2hzY3JlZW5BY3Rpdml0eSIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcG9uZW50TmFtZSBTV0lQRV9SRUZSRVNIX0FDVElWSVRZID0gY29tcG9uZW50KCJTd2lwZVJlZnJlc2hBY3Rpdml0eSIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcG9uZW50TmFtZSBURVNUX0FDVElWSVRZID0gY29tcG9uZW50KCJUZXN0QWN0aXZpdHkiKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBvbmVudE5hbWUgVE9QX0FDVElWSVRZID0gY29tcG9uZW50KCJUb3BBY3Rpdml0eSIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcG9uZW50TmFtZSBURVNUX0FDVElWSVRZX1dJVEhfU0FNRV9BRkZJTklUWSA9CisgICAgICAgICAgICBjb21wb25lbnQoIlRlc3RBY3Rpdml0eVdpdGhTYW1lQWZmaW5pdHkiKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBvbmVudE5hbWUgVE9QX0xFRlRfTEFZT1VUX0FDVElWSVRZID0gY29tcG9uZW50KCJUb3BMZWZ0TGF5b3V0QWN0aXZpdHkiKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBvbmVudE5hbWUgVE9QX1JJR0hUX0xBWU9VVF9BQ1RJVklUWSA9CisgICAgICAgICAgICBjb21wb25lbnQoIlRvcFJpZ2h0TGF5b3V0QWN0aXZpdHkiKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBvbmVudE5hbWUgVFJBTlNMVUNFTlRfQUNUSVZJVFkgPSBjb21wb25lbnQoIlRyYW5zbHVjZW50QWN0aXZpdHkiKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBvbmVudE5hbWUgVFJBTlNMVUNFTlRfQVNTSVNUQU5UX0FDVElWSVRZID0KKyAgICAgICAgICAgIGNvbXBvbmVudCgiVHJhbnNsdWNlbnRBc3Npc3RhbnRBY3Rpdml0eSIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcG9uZW50TmFtZSBUUkFOU0xVQ0VOVF9UT1BfQUNUSVZJVFkgPQorICAgICAgICAgICAgY29tcG9uZW50KCJUcmFuc2x1Y2VudFRvcEFjdGl2aXR5Iik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wb25lbnROYW1lIFRSQU5TTFVDRU5UX1RFU1RfQUNUSVZJVFkgPQorICAgICAgICAgICAgY29tcG9uZW50KCJUcmFuc2x1Y2VudFRlc3RBY3Rpdml0eSIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcG9uZW50TmFtZSBUVVJOX1NDUkVFTl9PTl9BQ1RJVklUWSA9IGNvbXBvbmVudCgiVHVyblNjcmVlbk9uQWN0aXZpdHkiKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBvbmVudE5hbWUgVFVSTl9TQ1JFRU5fT05fQVRUUl9BQ1RJVklUWSA9CisgICAgICAgICAgICBjb21wb25lbnQoIlR1cm5TY3JlZW5PbkF0dHJBY3Rpdml0eSIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcG9uZW50TmFtZSBUVVJOX1NDUkVFTl9PTl9BVFRSX0RJU01JU1NfS0VZR1VBUkRfQUNUSVZJVFkgPQorICAgICAgICAgICAgY29tcG9uZW50KCJUdXJuU2NyZWVuT25BdHRyRGlzbWlzc0tleWd1YXJkQWN0aXZpdHkiKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBvbmVudE5hbWUgVFVSTl9TQ1JFRU5fT05fQVRUUl9SRU1PVkVfQVRUUl9BQ1RJVklUWSA9CisgICAgICAgICAgICBjb21wb25lbnQoIlR1cm5TY3JlZW5PbkF0dHJSZW1vdmVBdHRyQWN0aXZpdHkiKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBvbmVudE5hbWUgVFVSTl9TQ1JFRU5fT05fRElTTUlTU19LRVlHVUFSRF9BQ1RJVklUWSA9CisgICAgICAgICAgICBjb21wb25lbnQoIlR1cm5TY3JlZW5PbkRpc21pc3NLZXlndWFyZEFjdGl2aXR5Iik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wb25lbnROYW1lIFRVUk5fU0NSRUVOX09OX1NIT1dfT05fTE9DS19BQ1RJVklUWSA9CisgICAgICAgICAgICBjb21wb25lbnQoIlR1cm5TY3JlZW5PblNob3dPbkxvY2tBY3Rpdml0eSIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcG9uZW50TmFtZSBUVVJOX1NDUkVFTl9PTl9TSU5HTEVfVEFTS19BQ1RJVklUWSA9CisgICAgICAgICAgICBjb21wb25lbnQoIlR1cm5TY3JlZW5PblNpbmdsZVRhc2tBY3Rpdml0eSIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcG9uZW50TmFtZSBUVVJOX1NDUkVFTl9PTl9XSVRIX1JFTEFZT1VUX0FDVElWSVRZID0KKyAgICAgICAgICAgIGNvbXBvbmVudCgiVHVyblNjcmVlbk9uV2l0aFJlbGF5b3V0QWN0aXZpdHkiKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBvbmVudE5hbWUgVklSVFVBTF9ESVNQTEFZX0FDVElWSVRZID0KKyAgICAgICAgICAgIGNvbXBvbmVudCgiVmlydHVhbERpc3BsYXlBY3Rpdml0eSIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcG9uZW50TmFtZSBWUl9URVNUX0FDVElWSVRZID0gY29tcG9uZW50KCJWclRlc3RBY3Rpdml0eSIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcG9uZW50TmFtZSBXQUxMUEFQQUVSX0FDVElWSVRZID0gY29tcG9uZW50KCJXYWxscGFwZXJBY3Rpdml0eSIpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wb25lbnROYW1lIEFTU0lTVEFOVF9WT0lDRV9JTlRFUkFDVElPTl9TRVJWSUNFID0KKyAgICAgICAgICAgIGNvbXBvbmVudCgiQXNzaXN0YW50Vm9pY2VJbnRlcmFjdGlvblNlcnZpY2UiKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcG9uZW50TmFtZSBMQVVOQ0hfQlJPQURDQVNUX1JFQ0VJVkVSID0KKyAgICAgICAgICAgIGNvbXBvbmVudCgiTGF1bmNoQnJvYWRjYXN0UmVjZWl2ZXIiKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVVOQ0hfQlJPQURDQVNUX0FDVElPTiA9CisgICAgICAgICAgICBnZXRQYWNrYWdlTmFtZSgpICsgIi5MQVVOQ0hfQlJPQURDQVNUX0FDVElPTiI7CisKKyAgICAvKioKKyAgICAgKiBBY3Rpb24gYW5kIGV4dHJhIGtleSBjb25zdGFudHMgZm9yIHtAbGluayAjVEVTVF9BQ1RJVklUWX0uCisgICAgICoKKyAgICAgKiBUT0RPKGIvNzMzNDY4ODUpOiBUaGVzZSBjb25zdGFudHMgc2hvdWxkIGJlIGluIHtAbGluayBhbmRyb2lkLnNlcnZlci5hbS5UZXN0QWN0aXZpdHl9IG9uY2UKKyAgICAgKiB0aGUgYWN0aXZpdHkgaXMgbW92ZWQgdG8gdGVzdCBBUEsuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0QWN0aXZpdHkgeworICAgICAgICAvLyBGaW5pc2hlcyB0aGUgYWN0aXZpdHkKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9BQ1RJVklUWV9BQ1RJT05fRklOSVNIX1NFTEYgPQorICAgICAgICAgICAgICAgICJhbmRyb2lkLnNlcnZlci5hbS5UZXN0QWN0aXZpdHkuZmluaXNoX3NlbGYiOworICAgICAgICAvLyBTZXRzIHRoZSBmaXhlZCBvcmllbnRhdGlvbiAoY2FuIGJlIG9uZSBvZiB7QGxpbmsgQWN0aXZpdHlJbmZvLlNjcmVlbk9yaWVudGF0aW9ufQorICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9GSVhFRF9PUklFTlRBVElPTiA9ICJmaXhlZF9vcmllbnRhdGlvbiI7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXh0cmEga2V5IGNvbnN0YW50cyBmb3Ige0BsaW5rICNMQVVOQ0hfQVNTSVNUQU5UX0FDVElWSVRZX0lOVE9fU1RBQ0t9IGFuZAorICAgICAqIHtAbGluayAjTEFVTkNIX0FTU0lTVEFOVF9BQ1RJVklUWV9GUk9NX1NFU1NJT059LgorICAgICAqCisgICAgICogVE9ETyhiLzczMzQ2ODg1KTogVGhlc2UgY29uc3RhbnRzIHNob3VsZCBiZSBpbiB7QGxpbmsgYW5kcm9pZC5zZXJ2ZXIuYW0uQXNzaXN0YW50QWN0aXZpdHl9CisgICAgICogb25jZSB0aGUgYWN0aXZpdHkgaXMgbW92ZWQgdG8gdGVzdCBBUEsuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBc3Npc3RhbnRBY3Rpdml0eSB7CisgICAgICAgIC8vIExhdW5jaGVzIHRoZSBnaXZlbiBhY3Rpdml0eSBpbiBvblJlc3VtZQorICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9BU1NJU1RBTlRfTEFVTkNIX05FV19UQVNLID0gImxhdW5jaF9uZXdfdGFzayI7CisgICAgICAgIC8vIEZpbmlzaGVzIHRoaXMgYWN0aXZpdHkgaW4gb25SZXN1bWUsIHRoaXMgaGFwcGVucyBhZnRlciBFWFRSQV9BU1NJU1RBTlRfTEFVTkNIX05FV19UQVNLCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0FTU0lTVEFOVF9GSU5JU0hfU0VMRiA9ICJmaW5pc2hfc2VsZiI7CisgICAgICAgIC8vIEF0dGVtcHRzIHRvIGVudGVyIHBpY3R1cmUtaW4tcGljdHVyZSBpbiBvblJlc3VtZQorICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9BU1NJU1RBTlRfRU5URVJfUElQID0gImVudGVyX3BpcCI7CisgICAgICAgIC8vIERpc3BsYXkgb24gd2hpY2ggQXNzaXN0YW50IHJ1bnMKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfQVNTSVNUQU5UX0RJU1BMQVlfSUQgPSAiYXNzaXN0YW50X2Rpc3BsYXlfaWQiOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4dHJhIGtleSBjb25zdGFudHMgZm9yIHtAbGluayBhbmRyb2lkLnNlcnZlci5hbS5Cb3R0b21BY3Rpdml0eX0uCisgICAgICoKKyAgICAgKiBUT0RPKGIvNzMzNDY4ODUpOiBUaGVzZSBjb25zdGFudHMgc2hvdWxkIGJlIGluIHtAbGluayBhbmRyb2lkLnNlcnZlci5hbS5Cb3R0b21BY3Rpdml0eX0KKyAgICAgKiBvbmNlIHRoZSBhY3Rpdml0eSBpcyBtb3ZlZCB0byB0ZXN0IEFQSy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJvdHRvbUFjdGl2aXR5IHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfQk9UVE9NX1dBTExQQVBFUiA9ICJVU0VfV0FMTFBBUEVSIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfU1RPUF9ERUxBWSA9ICJTVE9QX0RFTEFZIjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeHRyYSBrZXkgY29uc3RhbnRzIGZvciB7QGxpbmsgYW5kcm9pZC5zZXJ2ZXIuYW0uQnJvYWRjYXN0UmVjZWl2ZXJBY3Rpdml0eX0uCisgICAgICoKKyAgICAgKiBUT0RPKGIvNzMzNDY4ODUpOiBUaGVzZSBjb25zdGFudHMgc2hvdWxkIGJlIGluCisgICAgICoge0BsaW5rIGFuZHJvaWQuc2VydmVyLmFtLkJyb2FkY2FzdFJlY2VpdmVyQWN0aXZpdHl9IG9uY2UgdGhlIGFjdGl2aXR5IGlzIG1vdmVkIHRvIHRlc3QgQVBLLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnJvYWRjYXN0UmVjZWl2ZXJBY3Rpdml0eSB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9UUklHR0VSX0JST0FEQ0FTVCA9ICJ0cmlnZ2VyX2Jyb2FkY2FzdCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0RJU01JU1NfS0VZR1VBUkQgPSAiZGlzbWlzc0tleWd1YXJkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfRElTTUlTU19LRVlHVUFSRF9NRVRIT0QgPSAiZGlzbWlzc0tleWd1YXJkTWV0aG9kIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfRklOSVNIX0JST0FEQ0FTVCA9ICJmaW5pc2giOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9NT1ZFX0JST0FEQ0FTVF9UT19CQUNLID0gIm1vdmVUb0JhY2siOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9CUk9BRENBU1RfT1JJRU5UQVRJT04gPSAib3JpZW50YXRpb24iOworICAgIH0KKworICAgIC8qKgorICAgICAqICBMb2dnaW5nIGNvbnN0YW50cyBmb3Ige0BsaW5rIGFuZHJvaWQuc2VydmVyLmFtLktleWd1YXJkRGlzbWlzc0xvZ2dlckNhbGxiYWNrfS4KKyAgICAgKgorICAgICAqIFRPRE8oYi83MzM0Njg4NSk6IFRoZXNlIGNvbnN0YW50cyBzaG91bGQgYmUgaW4KKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5zZXJ2ZXIuYW0uS2V5Z3VhcmREaXNtaXNzTG9nZ2VyQ2FsbGJhY2t9IG9uY2UgdGhlIGNsYXNzIGlzIG1vdmVkIHRvIHRlc3QgQVBLLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgS2V5Z3VhcmREaXNtaXNzTG9nZ2VyQ2FsbGJhY2sgeworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlHVUFSRF9ESVNNSVNTX0xPR19UQUcgPSAiS2V5Z3VhcmREaXNtaXNzTG9nZ2VyQ2FsbGJhY2siOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRSWV9PTl9ESVNNSVNTX0NBTkNFTExFRCA9ICJvbkRpc21pc3NDYW5jZWxsZWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRSWV9PTl9ESVNNSVNTX0VSUk9SID0gIm9uRGlzbWlzc0Vycm9yIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5UUllfT05fRElTTUlTU19TVUNDRUVERUQgPSAib25EaXNtaXNzU3VjY2VlZGVkIjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeHRyYSBrZXkgY29uc3RhbnRzIGZvciB7QGxpbmsgI0xBVU5DSF9BU1NJU1RBTlRfQUNUSVZJVFlfSU5UT19TVEFDS30uCisgICAgICoKKyAgICAgKiBUT0RPKGIvNzMzNDY4ODUpOiBUaGVzZSBjb25zdGFudHMgc2hvdWxkIGJlIGluCisgICAgICoge0BsaW5rIGFuZHJvaWQuc2VydmVyLmFtLkxhdW5jaEFzc2lzdGFudEFjdGl2aXR5SW50b0Fzc2lzdGFudFN0YWNrfSBvbmNlIHRoZSBhY3Rpdml0eSBpcworICAgICAqIG1vdmVkIHRvIHRlc3QgQVBLLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTGF1bmNoQXNzaXN0YW50QWN0aXZpdHlJbnRvQXNzaXN0YW50U3RhY2sgeworICAgICAgICAvLyBMYXVuY2hlcyB0aGUgdHJhbnNsdWNlbnQgYXNzaXN0IGFjdGl2aXR5CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0FTU0lTVEFOVF9JU19UUkFOU0xVQ0VOVCA9ICJpc190cmFuc2x1Y2VudCI7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXh0cmEgY29uc3RhbnRzIGZvciB7QGxpbmsgYW5kcm9pZC5zZXJ2ZXIuYW0uTW92ZVRhc2tUb0JhY2tBY3Rpdml0eX0uCisgICAgICoKKyAgICAgKiBUT0RPKGIvNzMzNDY4ODUpOiBUaGVzZSBjb25zdGFudHMgc2hvdWxkIGJlIGluCisgICAgICoge0BsaW5rIGFuZHJvaWQuc2VydmVyLmFtLk1vdmVUYXNrVG9CYWNrQWN0aXZpdHl9IG9uY2UgdGhlIGFjdGl2aXR5IGlzIG1vdmVkIHRvIHRlc3QgQVBLLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTW92ZVRhc2tUb0JhY2tBY3Rpdml0eSB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0ZJTklTSF9QT0lOVCA9ICJmaW5pc2hfcG9pbnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSU5JU0hfUE9JTlRfT05fUEFVU0UgPSAib25fcGF1c2UiOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSU5JU0hfUE9JTlRfT05fU1RPUCA9ICJvbl9zdG9wIjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBY3Rpb24gYW5kIGV4dHJhIGtleSBjb25zdGFudHMgZm9yIHtAbGluayBhbmRyb2lkLnNlcnZlci5hbS5QaXBBY3Rpdml0eX0uCisgICAgICoKKyAgICAgKiBUT0RPKGIvNzMzNDY4ODUpOiBUaGVzZSBjb25zdGFudHMgc2hvdWxkIGJlIGluIHtAbGluayBhbmRyb2lkLnNlcnZlci5hbS5QaXBBY3Rpdml0eX0KKyAgICAgKiBvbmNlIHRoZSBhY3Rpdml0eSBpcyBtb3ZlZCB0byB0ZXN0IEFQSy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBpcEFjdGl2aXR5IHsKKyAgICAgICAgLy8gSW50ZW50IGFjdGlvbiB0aGF0IHRoaXMgYWN0aXZpdHkgZHluYW1pY2FsbHkgcmVnaXN0ZXJzIHRvIGVudGVyIHBpY3R1cmUtaW4tcGljdHVyZQorICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fRU5URVJfUElQID0gImFuZHJvaWQuc2VydmVyLmFtLlBpcEFjdGl2aXR5LmVudGVyX3BpcCI7CisgICAgICAgIC8vIEludGVudCBhY3Rpb24gdGhhdCB0aGlzIGFjdGl2aXR5IGR5bmFtaWNhbGx5IHJlZ2lzdGVycyB0byBtb3ZlIGl0c2VsZiB0byB0aGUgYmFjaworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fTU9WRV9UT19CQUNLID0KKyAgICAgICAgICAgICAgICAiYW5kcm9pZC5zZXJ2ZXIuYW0uUGlwQWN0aXZpdHkubW92ZV90b19iYWNrIjsKKyAgICAgICAgLy8gSW50ZW50IGFjdGlvbiB0aGF0IHRoaXMgYWN0aXZpdHkgZHluYW1pY2FsbHkgcmVnaXN0ZXJzIHRvIGV4cGFuZCBpdHNlbGYuCisgICAgICAgIC8vIElmIEVYVFJBX1NFVF9BU1BFQ1RfUkFUSU9fV0lUSF9ERUxBWSBpcyBzZXQsIGl0IHdpbGwgYWxzbyBhdHRlbXB0IHRvIGFwcGx5IHRoZSBhc3BlY3QKKyAgICAgICAgLy8gcmF0aW8gYWZ0ZXIgYSBzaG9ydCBkZWxheS4KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0VYUEFORF9QSVAgPSAiYW5kcm9pZC5zZXJ2ZXIuYW0uUGlwQWN0aXZpdHkuZXhwYW5kX3BpcCI7CisgICAgICAgIC8vIEludGVudCBhY3Rpb24gdGhhdCB0aGlzIGFjdGl2aXR5IGR5bmFtaWNhbGx5IHJlZ2lzdGVycyB0byBzZXQgcmVxdWVzdGVkIG9yaWVudGF0aW9uLgorICAgICAgICAvLyBXaWxsIGFwcGx5IHRoZSBvcmllbnRpb24gdG8gdGhlIHZhbHVlIHNldCBpbiB0aGUgRVhUUkFfRklYRURfT1JJRU5UQVRJT04gZXh0cmEuCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TRVRfUkVRVUVTVEVEX09SSUVOVEFUSU9OID0KKyAgICAgICAgICAgICAgICAiYW5kcm9pZC5zZXJ2ZXIuYW0uUGlwQWN0aXZpdHkuc2V0X3JlcXVlc3RlZF9vcmllbnRhdGlvbiI7CisgICAgICAgIC8vIEludGVudCBhY3Rpb24gdGhhdCB3aWxsIGZpbmlzaCB0aGlzIGFjdGl2aXR5CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9GSU5JU0ggPSAiYW5kcm9pZC5zZXJ2ZXIuYW0uUGlwQWN0aXZpdHkuZmluaXNoIjsKKworICAgICAgICAvLyBBZGRzIGFuIGFzc2VydGlvbiB0aGF0IHdlIGRvIG5vdCBldmVyIGdldCBvblN0b3AoKSBiZWZvcmUgd2UgZW50ZXIgcGljdHVyZSBpbiBwaWN0dXJlCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0FTU0VSVF9OT19PTl9TVE9QX0JFRk9SRV9QSVAgPQorICAgICAgICAgICAgICAgICJhc3NlcnRfbm9fb25fc3RvcF9iZWZvcmVfcGlwIjsKKyAgICAgICAgLy8gQ2FsbHMgZW50ZXJQaWN0dXJlSW5QaWN0dXJlKCkgb24gY3JlYXRpb24KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfRU5URVJfUElQID0gImVudGVyX3BpcCI7CisgICAgICAgIC8vIFVzZWQgd2l0aCBFWFRSQV9BVVRPX0VOVEVSX1BJUCwgdmFsdWUgc3BlY2lmaWVzIHRoZSBhc3BlY3QgcmF0aW8gdG8gZW50ZXIgUElQIHdpdGgKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfRU5URVJfUElQX0FTUEVDVF9SQVRJT19OVU1FUkFUT1IgPQorICAgICAgICAgICAgICAgICJlbnRlcl9waXBfYXNwZWN0X3JhdGlvX251bWVyYXRvciI7CisgICAgICAgIC8vIFVzZWQgd2l0aCBFWFRSQV9BVVRPX0VOVEVSX1BJUCwgdmFsdWUgc3BlY2lmaWVzIHRoZSBhc3BlY3QgcmF0aW8gdG8gZW50ZXIgUElQIHdpdGgKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfRU5URVJfUElQX0FTUEVDVF9SQVRJT19ERU5PTUlOQVRPUiA9CisgICAgICAgICAgICAgICAgImVudGVyX3BpcF9hc3BlY3RfcmF0aW9fZGVub21pbmF0b3IiOworICAgICAgICAvLyBDYWxscyByZXF1ZXN0QXV0b0VudGVyUGljdHVyZUluUGljdHVyZSgpIHdpdGggdGhlIHZhbHVlIHByb3ZpZGVkCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0VOVEVSX1BJUF9PTl9QQVVTRSA9ICJlbnRlcl9waXBfb25fcGF1c2UiOworICAgICAgICAvLyBGaW5pc2hlcyB0aGUgYWN0aXZpdHkgYXQgdGhlIGVuZCBvZiBvblJlc3VtZSAoYWZ0ZXIgRVhUUkFfU1RBUlRfQUNUSVZJVFkgaXMgaGFuZGxlZCkKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfRklOSVNIX1NFTEZfT05fUkVTVU1FID0gImZpbmlzaF9zZWxmX29uX3Jlc3VtZSI7CisgICAgICAgIC8vIFNldHMgdGhlIGZpeGVkIG9yaWVudGF0aW9uIChjYW4gYmUgb25lIG9mIHtAbGluayBBY3Rpdml0eUluZm8uU2NyZWVuT3JpZW50YXRpb259CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1BJUF9PUklFTlRBVElPTiA9ICJmaXhlZF9vcmllbnRhdGlvbiI7CisgICAgICAgIC8vIFRoZSBhbW91bnQgdG8gZGVsYXkgdG8gYXJ0aWZpY2lhbGx5IGludHJvZHVjZSBpbiBvblBhdXNlKCkKKyAgICAgICAgLy8gKGJlZm9yZSBFWFRSQV9FTlRFUl9QSVBfT05fUEFVU0UgaXMgcHJvY2Vzc2VkKQorICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9PTl9QQVVTRV9ERUxBWSA9ICJvbl9wYXVzZV9kZWxheSI7CisgICAgICAgIC8vIENhbGxzIGVudGVyUGljdHVyZUluUGljdHVyZSgpIGFnYWluIGFmdGVyIG9uUGljdHVyZUluUGljdHVyZU1vZGVDaGFuZ2VkKGZhbHNlKSBpcyBjYWxsZWQKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfUkVFTlRFUl9QSVBfT05fRVhJVCA9ICJyZWVudGVyX3BpcF9vbl9leGl0IjsKKyAgICAgICAgLy8gQ2FsbHMgc2V0UGljdHVyZUluUGljdHVyZUFzcGVjdFJhdGlvIHdpdGggdGhlIGFzcGVjdCByYXRpbyBzcGVjaWZpZWQgaW4gdGhlIHZhbHVlCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1NFVF9BU1BFQ1RfUkFUSU9fREVOT01JTkFUT1IgPQorICAgICAgICAgICAgICAgICJzZXRfYXNwZWN0X3JhdGlvX2Rlbm9taW5hdG9yIjsKKyAgICAgICAgLy8gQ2FsbHMgc2V0UGljdHVyZUluUGljdHVyZUFzcGVjdFJhdGlvIHdpdGggdGhlIGFzcGVjdCByYXRpbyBzcGVjaWZpZWQgaW4gdGhlIHZhbHVlCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1NFVF9BU1BFQ1RfUkFUSU9fTlVNRVJBVE9SID0gInNldF9hc3BlY3RfcmF0aW9fbnVtZXJhdG9yIjsKKyAgICAgICAgLy8gQ2FsbHMgc2V0UGljdHVyZUluUGljdHVyZUFzcGVjdFJhdGlvIHdpdGggdGhlIGFzcGVjdCByYXRpbyBzcGVjaWZpZWQgaW4gdGhlIHZhbHVlIHdpdGggYQorICAgICAgICAvLyBmaXhlZCBkZWxheQorICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9TRVRfQVNQRUNUX1JBVElPX1dJVEhfREVMQVlfTlVNRVJBVE9SID0KKyAgICAgICAgICAgICAgICAic2V0X2FzcGVjdF9yYXRpb193aXRoX2RlbGF5X251bWVyYXRvciI7CisgICAgICAgIC8vIENhbGxzIHNldFBpY3R1cmVJblBpY3R1cmVBc3BlY3RSYXRpbyB3aXRoIHRoZSBhc3BlY3QgcmF0aW8gc3BlY2lmaWVkIGluIHRoZSB2YWx1ZSB3aXRoIGEKKyAgICAgICAgLy8gZml4ZWQgZGVsYXkKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfU0VUX0FTUEVDVF9SQVRJT19XSVRIX0RFTEFZX0RFTk9NSU5BVE9SID0KKyAgICAgICAgICAgICAgICAic2V0X2FzcGVjdF9yYXRpb193aXRoX2RlbGF5X2Rlbm9taW5hdG9yIjsKKyAgICAgICAgLy8gU2hvd3MgdGhpcyBhY3Rpdml0eSBvdmVyIHRoZSBrZXlndWFyZAorICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9TSE9XX09WRVJfS0VZR1VBUkQgPSAic2hvd19vdmVyX2tleWd1YXJkIjsKKyAgICAgICAgLy8gU3RhcnRzIHRoZSBhY3Rpdml0eSAoY29tcG9uZW50IG5hbWUpIHByb3ZpZGVkIGJ5IHRoZSB2YWx1ZSBhdCB0aGUgZW5kIG9mIG9uQ3JlYXRlCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1NUQVJUX0FDVElWSVRZID0gInN0YXJ0X2FjdGl2aXR5IjsKKyAgICAgICAgLy8gQWRkcyBhIGNsaWNrIGxpc3RlbmVyIHRvIGZpbmlzaCB0aGlzIGFjdGl2aXR5IHdoZW4gaXQgaXMgY2xpY2tlZAorICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9UQVBfVE9fRklOSVNIID0gInRhcF90b19maW5pc2giOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4dHJhIGtleSBjb25zdGFudHMgZm9yIHtAbGluayBhbmRyb2lkLnNlcnZlci5hbS5Ub3BBY3Rpdml0eX0gYW5kCisgICAgICoge0BsaW5rIGFuZHJvaWQuc2VydmVyLmFtLlRyYW5zbHVjZW50VG9wQWN0aXZpdHl9LgorICAgICAqCisgICAgICogVE9ETyhiLzczMzQ2ODg1KTogVGhlc2UgY29uc3RhbnRzIHNob3VsZCBiZSBpbiB7QGxpbmsgYW5kcm9pZC5zZXJ2ZXIuYW0uVG9wQWN0aXZpdHl9CisgICAgICogb25jZSB0aGUgYWN0aXZpdHkgaXMgbW92ZWQgdG8gdGVzdCBBUEsuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUb3BBY3Rpdml0eSB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0ZJTklTSF9ERUxBWSA9ICJGSU5JU0hfREVMQVkiOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9UT1BfV0FMTFBBUEVSID0gIlVTRV9XQUxMUEFQRVIiOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4dHJhIGtleSBjb25zdGFudHMgZm9yIHtAbGluayBhbmRyb2lkLnNlcnZlci5hbS5WaXJ0dWFsRGlzcGxheUFjdGl2aXR5fS4KKyAgICAgKgorICAgICAqIFRPRE8oYi83MzM0Njg4NSk6IFRoZXNlIGNvbnN0YW50cyBzaG91bGQgYmUgaW4KKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5zZXJ2ZXIuYW0uVmlydHVhbERpc3BsYXlBY3Rpdml0eX0gb25jZSB0aGUgYWN0aXZpdHkgaXMgbW92ZWQgdG8gdGVzdCBBUEsuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBWaXJ0dWFsRGlzcGxheUFjdGl2aXR5IHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklSVFVBTF9ESVNQTEFZX1BSRUZJWCA9ICJIb3N0ZWRWaXJ0dWFsRGlzcGxheSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DQU5fU0hPV19XSVRIX0lOU0VDVVJFX0tFWUdVQVJEID0KKyAgICAgICAgICAgICAgICAiY2FuX3Nob3dfd2l0aF9pbnNlY3VyZV9rZXlndWFyZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT01NQU5EID0gImNvbW1hbmQiOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09VTlQgPSAiY291bnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfREVOU0lUWV9EUEkgPSAiZGVuc2l0eV9kcGkiOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTEFVTkNIX1RBUkdFVF9DT01QT05FTlQgPSAibGF1bmNoX3RhcmdldF9jb21wb25lbnQiOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUFVCTElDX0RJU1BMQVkgPSAicHVibGljX2Rpc3BsYXkiOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUkVTSVpFX0RJU1BMQVkgPSAicmVzaXplX2Rpc3BsYXkiOworICAgICAgICAvLyBWYWx1ZSBjb25zdGFudHMgb2Yge0BsaW5rICNLRVlfQ09NTUFORH0uCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfQ1JFQVRFX0RJU1BMQVkgPSAiY3JlYXRlX2Rpc3BsYXkiOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX0RFU1RST1lfRElTUExBWSA9ICJkZXN0cm95X2Rpc3BsYXkiOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX1JFU0laRV9ESVNQTEFZID0gInJlc2l6ZV9kaXNwbGF5IjsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBDb21wb25lbnROYW1lIGNvbXBvbmVudChTdHJpbmcgY2xhc3NOYW1lKSB7CisgICAgICAgIHJldHVybiBjb21wb25lbnQoQ29tcG9uZW50cy5jbGFzcywgY2xhc3NOYW1lKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7CisgICAgICAgIHJldHVybiBnZXRQYWNrYWdlTmFtZShDb21wb25lbnRzLmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9EaWFsb2dXaGVuTGFyZ2VBY3Rpdml0eS5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vRGlhbG9nV2hlbkxhcmdlQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGI3ZjVmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vRGlhbG9nV2hlbkxhcmdlQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLmFtOworCisvKioKKyAqIEFjdGl2aXR5IHdpdGggRGlhbG9nV2hlbkxhcmdlIFRoZW1lLgorICovCitwdWJsaWMgY2xhc3MgRGlhbG9nV2hlbkxhcmdlQWN0aXZpdHkgZXh0ZW5kcyBBYnN0cmFjdExpZmVjeWNsZUxvZ0FjdGl2aXR5IHsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0Rpc21pc3NLZXlndWFyZEFjdGl2aXR5LmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9EaXNtaXNzS2V5Z3VhcmRBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZGM2OWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9EaXNtaXNzS2V5Z3VhcmRBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW07CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKKworcHVibGljIGNsYXNzIERpc21pc3NLZXlndWFyZEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBnZXRXaW5kb3coKS5hZGRGbGFncyhXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0RJU01JU1NfS0VZR1VBUkQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0Rpc21pc3NLZXlndWFyZE1ldGhvZEFjdGl2aXR5LmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9EaXNtaXNzS2V5Z3VhcmRNZXRob2RBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxOWM0YTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9EaXNtaXNzS2V5Z3VhcmRNZXRob2RBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW07CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5LZXlndWFyZE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CisKK3B1YmxpYyBjbGFzcyBEaXNtaXNzS2V5Z3VhcmRNZXRob2RBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgZ2V0U3lzdGVtU2VydmljZShLZXlndWFyZE1hbmFnZXIuY2xhc3MpLnJlcXVlc3REaXNtaXNzS2V5Z3VhcmQodGhpcywKKyAgICAgICAgICAgICAgICBuZXcgS2V5Z3VhcmREaXNtaXNzTG9nZ2VyQ2FsbGJhY2sodGhpcykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0RvY2tlZEFjdGl2aXR5LmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9Eb2NrZWRBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNmRiYjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9Eb2NrZWRBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLmFtOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CisKK3B1YmxpYyBjbGFzcyBEb2NrZWRBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0ZvbnRTY2FsZUFjdGl2aXR5LmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9Gb250U2NhbGVBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NzdkNDYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9Gb250U2NhbGVBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkKKyAqIG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW07CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5YbWxSZXNvdXJjZVBhcnNlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlhtbDsKKworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7CitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBGb250U2NhbGVBY3Rpdml0eSBleHRlbmRzIEFic3RyYWN0TGlmZWN5Y2xlTG9nQWN0aXZpdHkgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOworICAgICAgICBkdW1wQWN0aXZpdHlEcGkoKTsKKyAgICAgICAgZHVtcEZvbnRTaXplKCk7CisgICAgfQorCisgICAgLy8gV2UncmUgYmFzaWNhbGx5IGVuc3VyaW5nIHRoYXQgbm8gbWF0dGVyIHdoYXQgaGFwcGVucyB0byB0aGUgcmVzb3VyY2VzIHVuZGVybmVhdGggdGhlCisgICAgLy8gQWN0aXZpdHksIGFueSBUeXBlZEFycmF5cyBvYnRhaW5lZCBmcm9tIHRoZSBwb29sIGhhdmUgdGhlIGNvcnJlY3QgRGlzcGxheU1ldHJpY3MuCisgICAgcHJvdGVjdGVkIHZvaWQgZHVtcEZvbnRTaXplKCkgeworICAgICAgICB0cnkgKFhtbFJlc291cmNlUGFyc2VyIHBhcnNlciA9IGdldFJlc291cmNlcygpLmdldFhtbChSLmxheW91dC5mb250X3NjYWxlKSkgeworICAgICAgICAgICAgLy9ub2luc3BlY3Rpb24gU3RhdGVtZW50V2l0aEVtcHR5Qm9keQorICAgICAgICAgICAgd2hpbGUgKHBhcnNlci5uZXh0KCkgIT0gWG1sUHVsbFBhcnNlci5TVEFSVF9UQUcpIHsgfQorCisgICAgICAgICAgICBmaW5hbCBBdHRyaWJ1dGVTZXQgYXR0cnMgPSBYbWwuYXNBdHRyaWJ1dGVTZXQocGFyc2VyKTsKKyAgICAgICAgICAgIFR5cGVkQXJyYXkgdGEgPSBnZXRUaGVtZSgpLm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoYXR0cnMsCisgICAgICAgICAgICAgICAgICAgIG5ldyBpbnRbXSB7IGFuZHJvaWQuUi5hdHRyLnRleHRTaXplIH0sIDAsIDApOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZm9udFBpeGVsU2l6ZSA9IHRhLmdldERpbWVuc2lvblBpeGVsU2l6ZSgwLCAtMSk7CisgICAgICAgICAgICAgICAgaWYgKGZvbnRQaXhlbFNpemUgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJhbmRyb2lkOmF0dHIvdGV4dFNpemUgbm90IGZvdW5kIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgTG9nLmkoZ2V0VGFnKCksICJmb250UGl4ZWxTaXplPSIgKyBmb250UGl4ZWxTaXplKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgdGEucmVjeWNsZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHwgSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBkdW1wQWN0aXZpdHlEcGkoKSB7CisgICAgICAgIGZpbmFsIGludCBmb250QWN0aXZpdHlEcGkgPSBnZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpLmRlbnNpdHlEcGk7CisgICAgICAgIExvZy5pKGdldFRhZygpLCAiZm9udEFjdGl2aXR5RHBpPSIgKyBmb250QWN0aXZpdHlEcGkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0ZvbnRTY2FsZU5vUmVsYXVuY2hBY3Rpdml0eS5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vRm9udFNjYWxlTm9SZWxhdW5jaEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBiOGE5MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0ZvbnRTY2FsZU5vUmVsYXVuY2hBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkKKyAqIG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKKworcHVibGljIGNsYXNzIEZvbnRTY2FsZU5vUmVsYXVuY2hBY3Rpdml0eSBleHRlbmRzIEZvbnRTY2FsZUFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKENvbmZpZ3VyYXRpb24gbmV3Q29uZmlnKSB7CisgICAgICAgIHN1cGVyLm9uQ29uZmlndXJhdGlvbkNoYW5nZWQobmV3Q29uZmlnKTsKKyAgICAgICAgZHVtcEFjdGl2aXR5RHBpKCk7CisgICAgICAgIGR1bXBGb250U2l6ZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0ZyZWVmb3JtQWN0aXZpdHkuamF2YSBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0ZyZWVmb3JtQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDYwZTY2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vRnJlZWZvcm1BY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW07CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LkludGVudC5GTEFHX0FDVElWSVRZX0NMRUFSX1RBU0s7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5JbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSzsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5T3B0aW9uczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKKworcHVibGljIGNsYXNzIEZyZWVmb3JtQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKKyAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQodGhpcywgVGVzdEFjdGl2aXR5LmNsYXNzKTsKKyAgICAgICAgaW50ZW50LnNldEZsYWdzKEZMQUdfQUNUSVZJVFlfQ0xFQVJfVEFTSyB8IEZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOworCisgICAgICAgIGZpbmFsIEFjdGl2aXR5T3B0aW9ucyBvcHRpb25zID0gQWN0aXZpdHlPcHRpb25zLm1ha2VCYXNpYygpOworICAgICAgICBvcHRpb25zLnNldExhdW5jaEJvdW5kcyhuZXcgUmVjdCgwLCAwLCA5MDAsIDkwMCkpOworICAgICAgICB0aGlzLnN0YXJ0QWN0aXZpdHkoaW50ZW50LCBvcHRpb25zLnRvQnVuZGxlKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0tleWd1YXJkRGlzbWlzc0xvZ2dlckNhbGxiYWNrLmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9LZXlndWFyZERpc21pc3NMb2dnZXJDYWxsYmFjay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ZTRmZWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9LZXlndWFyZERpc21pc3NMb2dnZXJDYWxsYmFjay5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW07CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5LZXlndWFyZERpc21pc3NMb2dnZXJDYWxsYmFjay5FTlRSWV9PTl9ESVNNSVNTX0NBTkNFTExFRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5LZXlndWFyZERpc21pc3NMb2dnZXJDYWxsYmFjay5FTlRSWV9PTl9ESVNNSVNTX0VSUk9SOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLktleWd1YXJkRGlzbWlzc0xvZ2dlckNhbGxiYWNrLkVOVFJZX09OX0RJU01JU1NfU1VDQ0VFREVEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLktleWd1YXJkRGlzbWlzc0xvZ2dlckNhbGxiYWNrLktFWUdVQVJEX0RJU01JU1NfTE9HX1RBRzsKKworaW1wb3J0IGFuZHJvaWQuYXBwLktleWd1YXJkTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5LZXlndWFyZE1hbmFnZXIuS2V5Z3VhcmREaXNtaXNzQ2FsbGJhY2s7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworY2xhc3MgS2V5Z3VhcmREaXNtaXNzTG9nZ2VyQ2FsbGJhY2sgZXh0ZW5kcyBLZXlndWFyZERpc21pc3NDYWxsYmFjayB7CisKKyAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CisKKyAgICBLZXlndWFyZERpc21pc3NMb2dnZXJDYWxsYmFjayhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRGlzbWlzc0Vycm9yKCkgeworICAgICAgICBMb2cuaShLRVlHVUFSRF9ESVNNSVNTX0xPR19UQUcsIEVOVFJZX09OX0RJU01JU1NfRVJST1IpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRGlzbWlzc1N1Y2NlZWRlZCgpIHsKKyAgICAgICAgaWYgKG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoS2V5Z3VhcmRNYW5hZ2VyLmNsYXNzKS5pc0RldmljZUxvY2tlZCgpKSB7CisgICAgICAgICAgICAvLyBEZXZpY2UgaXMgc3RpbGwgbG9ja2VkPyBXaGF0IGEgZmFpbC4gRG9uJ3QgcHJpbnQgIm9uRGlzbWlzc1N1Y2NlZWRlZCIgc3VjaCB0aGF0IHRoZQorICAgICAgICAgICAgLy8gbG9nIGZhaWxzLgorICAgICAgICAgICAgTG9nLmkoS0VZR1VBUkRfRElTTUlTU19MT0dfVEFHLAorICAgICAgICAgICAgICAgICAgICAiZGlzbWlzcyBzdWNjZWVkZWQgd2FzIGNhbGxlZCBidXQgZGV2aWNlIGlzIHN0aWxsIGxvY2tlZC4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExvZy5pKEtFWUdVQVJEX0RJU01JU1NfTE9HX1RBRywgRU5UUllfT05fRElTTUlTU19TVUNDRUVERUQpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25EaXNtaXNzQ2FuY2VsbGVkKCkgeworICAgICAgICBMb2cuaShLRVlHVUFSRF9ESVNNSVNTX0xPR19UQUcsIEVOVFJZX09OX0RJU01JU1NfQ0FOQ0VMTEVEKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9LZXlndWFyZExvY2tBY3Rpdml0eS5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vS2V5Z3VhcmRMb2NrQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjlkYzVkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vS2V5Z3VhcmRMb2NrQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLmFtOworCitpbXBvcnQgYW5kcm9pZC5hcHAuS2V5Z3VhcmRNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworCitwdWJsaWMgY2xhc3MgS2V5Z3VhcmRMb2NrQWN0aXZpdHkgZXh0ZW5kcyBCcm9hZGNhc3RSZWNlaXZlckFjdGl2aXR5IHsKKworICAgIHByaXZhdGUgS2V5Z3VhcmRNYW5hZ2VyLktleWd1YXJkTG9jayBtS2V5Z3VhcmRMb2NrOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBtS2V5Z3VhcmRMb2NrID0gZ2V0U3lzdGVtU2VydmljZShLZXlndWFyZE1hbmFnZXIuY2xhc3MpLm5ld0tleWd1YXJkTG9jaygidGVzdCIpOworICAgICAgICBtS2V5Z3VhcmRMb2NrLmRpc2FibGVLZXlndWFyZCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uRGVzdHJveSgpIHsKKyAgICAgICAgbUtleWd1YXJkTG9jay5yZWVuYWJsZUtleWd1YXJkKCk7CisgICAgICAgIHN1cGVyLm9uRGVzdHJveSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0xhbmRzY2FwZU9yaWVudGF0aW9uQWN0aXZpdHkuamF2YSBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0xhbmRzY2FwZU9yaWVudGF0aW9uQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzdiZWVlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vTGFuZHNjYXBlT3JpZW50YXRpb25BY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW07CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CisKK3B1YmxpYyBjbGFzcyBMYW5kc2NhcGVPcmllbnRhdGlvbkFjdGl2aXR5IGV4dGVuZHMgQWJzdHJhY3RMaWZlY3ljbGVMb2dBY3Rpdml0eSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKKyAgICAgICAgZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWcgPSBnZXRSZXNvdXJjZXMoKS5nZXRDb25maWd1cmF0aW9uKCk7CisgICAgICAgIGR1bXBEaXNwbGF5U2l6ZShjb25maWcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQoQ29uZmlndXJhdGlvbiBuZXdDb25maWcpIHsKKyAgICAgICAgc3VwZXIub25Db25maWd1cmF0aW9uQ2hhbmdlZChuZXdDb25maWcpOworICAgICAgICBkdW1wRGlzcGxheVNpemUobmV3Q29uZmlnKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9MYXVuY2hBc3Npc3RhbnRBY3Rpdml0eUZyb21TZXNzaW9uLmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9MYXVuY2hBc3Npc3RhbnRBY3Rpdml0eUZyb21TZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY3ZTlkZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0xhdW5jaEFzc2lzdGFudEFjdGl2aXR5RnJvbVNlc3Npb24uamF2YQpAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLmFtOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CisKK3B1YmxpYyBjbGFzcyBMYXVuY2hBc3Npc3RhbnRBY3Rpdml0eUZyb21TZXNzaW9uIGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgeworICAgICAgICBzdXBlci5vblJlc3VtZSgpOworICAgICAgICBBc3Npc3RhbnRWb2ljZUludGVyYWN0aW9uU2VydmljZS5sYXVuY2hBc3Npc3RhbnRBY3Rpdml0eSh0aGlzLCBnZXRJbnRlbnQoKS5nZXRFeHRyYXMoKSk7CisgICAgICAgIGZpbmlzaEFuZFJlbW92ZVRhc2soKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9MYXVuY2hBc3Npc3RhbnRBY3Rpdml0eUludG9Bc3Npc3RhbnRTdGFjay5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vTGF1bmNoQXNzaXN0YW50QWN0aXZpdHlJbnRvQXNzaXN0YW50U3RhY2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODAwMzYwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vTGF1bmNoQXNzaXN0YW50QWN0aXZpdHlJbnRvQXNzaXN0YW50U3RhY2suamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLmFtOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuTGF1bmNoQXNzaXN0YW50QWN0aXZpdHlJbnRvQXNzaXN0YW50U3RhY2sKKyAgICAgICAgLkVYVFJBX0FTU0lTVEFOVF9JU19UUkFOU0xVQ0VOVDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CisKK3B1YmxpYyBjbGFzcyBMYXVuY2hBc3Npc3RhbnRBY3Rpdml0eUludG9Bc3Npc3RhbnRTdGFjayBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgeworICAgICAgICBzdXBlci5vblJlc3VtZSgpOworCisgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBnZXRJbnRlbnQoKTsKKyAgICAgICAgaWYgKGlzVHJhbnNsdWNlbnQoaW50ZW50KSkgeworICAgICAgICAgICAgVHJhbnNsdWNlbnRBc3Npc3RhbnRBY3Rpdml0eS5sYXVuY2hBY3Rpdml0eUludG9Bc3Npc3RhbnRTdGFjayh0aGlzLCBpbnRlbnQuZ2V0RXh0cmFzKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQXNzaXN0YW50QWN0aXZpdHkubGF1bmNoQWN0aXZpdHlJbnRvQXNzaXN0YW50U3RhY2sodGhpcywgZ2V0SW50ZW50KCkuZ2V0RXh0cmFzKCkpOworICAgICAgICB9CisgICAgICAgIGZpbmlzaEFuZFJlbW92ZVRhc2soKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVHJhbnNsdWNlbnQoSW50ZW50IGludGVudCkgeworICAgICAgICByZXR1cm4gaW50ZW50Lmhhc0V4dHJhKEVYVFJBX0FTU0lTVEFOVF9JU19UUkFOU0xVQ0VOVCkKKyAgICAgICAgICAgICAgICAmJiBCb29sZWFuLnZhbHVlT2YoaW50ZW50LmdldFN0cmluZ0V4dHJhKEVYVFJBX0FTU0lTVEFOVF9JU19UUkFOU0xVQ0VOVCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0xhdW5jaEJyb2FkY2FzdFJlY2VpdmVyLmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9MYXVuY2hCcm9hZGNhc3RSZWNlaXZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzY2I5NjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9MYXVuY2hCcm9hZGNhc3RSZWNlaXZlci5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW07CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisvKiogQnJvYWRjYXN0IHJlY2VpdmVyIHRoYXQgY2FuIGxhdW5jaCBhY3Rpdml0aWVzLiAqLworcHVibGljIGNsYXNzIExhdW5jaEJyb2FkY2FzdFJlY2VpdmVyIGV4dGVuZHMgQnJvYWRjYXN0UmVjZWl2ZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBMYXVuY2hCcm9hZGNhc3RSZWNlaXZlci5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBBY3Rpdml0eUxhdW5jaGVyLmxhdW5jaEFjdGl2aXR5RnJvbUV4dHJhcyhjb250ZXh0LCBpbnRlbnQuZ2V0RXh0cmFzKCkpOworICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJTZWN1cml0eUV4Y2VwdGlvbiBsYXVuY2hpbmcgYWN0aXZpdHkiKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0xhdW5jaEVudGVyUGlwQWN0aXZpdHkuamF2YSBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0xhdW5jaEVudGVyUGlwQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjExMTlkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vTGF1bmNoRW50ZXJQaXBBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW07CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CisKK3B1YmxpYyBjbGFzcyBMYXVuY2hFbnRlclBpcEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBidW5kbGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoYnVuZGxlKTsKKyAgICAgICAgUGlwQWN0aXZpdHkubGF1bmNoRW50ZXJQaXBBY3Rpdml0eSh0aGlzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9MYXVuY2hJbnRvUGlubmVkU3RhY2tQaXBBY3Rpdml0eS5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vTGF1bmNoSW50b1Bpbm5lZFN0YWNrUGlwQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjk3MjYxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vTGF1bmNoSW50b1Bpbm5lZFN0YWNrUGlwQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLmFtOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CisKK3B1YmxpYyBjbGFzcyBMYXVuY2hJbnRvUGlubmVkU3RhY2tQaXBBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKKyAgICAgICAgQWx3YXlzRm9jdXNhYmxlUGlwQWN0aXZpdHkubGF1bmNoQWx3YXlzRm9jdXNhYmxlUGlwQWN0aXZpdHkodGhpcywgdHJ1ZSAvKiBuZXdUYXNrICovKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9MYXVuY2hQaXBPblBpcEFjdGl2aXR5LmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9MYXVuY2hQaXBPblBpcEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAxNzJlZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0xhdW5jaFBpcE9uUGlwQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLmFtOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKKworcHVibGljIGNsYXNzIExhdW5jaFBpcE9uUGlwQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblBpY3R1cmVJblBpY3R1cmVNb2RlQ2hhbmdlZChib29sZWFuIGlzSW5QaWN0dXJlSW5QaWN0dXJlTW9kZSwKKyAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gbmV3Q29uZmlnKSB7CisgICAgICAgIHN1cGVyLm9uUGljdHVyZUluUGljdHVyZU1vZGVDaGFuZ2VkKGlzSW5QaWN0dXJlSW5QaWN0dXJlTW9kZSwgbmV3Q29uZmlnKTsKKyAgICAgICAgQWx3YXlzRm9jdXNhYmxlUGlwQWN0aXZpdHkubGF1bmNoQWx3YXlzRm9jdXNhYmxlUGlwQWN0aXZpdHkodGhpcywKKyAgICAgICAgICAgIGdldFBhY2thZ2VNYW5hZ2VyKCkuaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX0xFQU5CQUNLKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vTGlmZWN5Y2xlTG9nVmlldy5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vTGlmZWN5Y2xlTG9nVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5Y2M4OTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9MaWZlY3ljbGVMb2dWaWV3LmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK3B1YmxpYyBjbGFzcyBMaWZlY3ljbGVMb2dWaWV3IGV4dGVuZHMgVmlldyB7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVEFHID0gIkxpZmVjeWNsZUxvZ1ZpZXciOworCisgICAgcHVibGljIExpZmVjeWNsZUxvZ1ZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgIH0KKworICAgIHB1YmxpYyBMaWZlY3ljbGVMb2dWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIDApOworICAgIH0KKworICAgIHB1YmxpYyBMaWZlY3ljbGVMb2dWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyKSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlQXR0ciwgMCk7CisgICAgfQorCisgICAgcHVibGljIExpZmVjeWNsZUxvZ1ZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIsIGludCBkZWZTdHlsZVJlcykKKyAgICB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIsIGRlZlN0eWxlUmVzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKENvbmZpZ3VyYXRpb24gbmV3Q29uZmlnKSB7CisgICAgICAgIHN1cGVyLm9uQ29uZmlndXJhdGlvbkNoYW5nZWQobmV3Q29uZmlnKTsKKyAgICAgICAgTG9nLmkoVEFHLCAib25Db25maWd1cmF0aW9uQ2hhbmdlZCIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0xvZ0NvbmZpZ3VyYXRpb25BY3Rpdml0eS5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vTG9nQ29uZmlndXJhdGlvbkFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVkMzcwZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0xvZ0NvbmZpZ3VyYXRpb25BY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW07CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworLyoqCisgKiBBY3Rpdml0eSB0aGF0IGxvZ3MgY29uZmlndXJhdGlvbiBjaGFuZ2VzLgorICovCitwdWJsaWMgY2xhc3MgTG9nQ29uZmlndXJhdGlvbkFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJMb2dDb25maWd1cmF0aW9uQWN0aXZpdHkiOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25Db25maWd1cmF0aW9uQ2hhbmdlZChDb25maWd1cmF0aW9uIG5ld0NvbmZpZykgeworICAgICAgICBzdXBlci5vbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKG5ld0NvbmZpZyk7CisgICAgICAgIExvZy5pKFRBRywgIkNvbmZpZ3VyYXRpb24gY2hhbmdlZDogIiArIG5ld0NvbmZpZy5zY3JlZW5XaWR0aERwICsgIiwiCisgICAgICAgICAgICAgICAgKyBuZXdDb25maWcuc2NyZWVuSGVpZ2h0RHApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL01vdmVUYXNrVG9CYWNrQWN0aXZpdHkuamF2YSBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL01vdmVUYXNrVG9CYWNrQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGMwNWY0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vTW92ZVRhc2tUb0JhY2tBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW07CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5Nb3ZlVGFza1RvQmFja0FjdGl2aXR5LkVYVFJBX0ZJTklTSF9QT0lOVDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5Nb3ZlVGFza1RvQmFja0FjdGl2aXR5LkZJTklTSF9QT0lOVF9PTl9QQVVTRTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5Nb3ZlVGFza1RvQmFja0FjdGl2aXR5LkZJTklTSF9QT0lOVF9PTl9TVE9QOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKKworLyoqCisgKiBBY3Rpdml0eSB0aGF0IGZpbmlzaGVzIGl0c2VsZiB1c2luZyAibW92ZVRhc2tUb0JhY2siLgorICovCitwdWJsaWMgY2xhc3MgTW92ZVRhc2tUb0JhY2tBY3Rpdml0eSBleHRlbmRzIEFic3RyYWN0TGlmZWN5Y2xlTG9nQWN0aXZpdHkgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgbUZpbmlzaFBvaW50OworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOworCisgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBnZXRJbnRlbnQoKTsKKyAgICAgICAgbUZpbmlzaFBvaW50ID0gaW50ZW50LmdldEV4dHJhcygpLmdldFN0cmluZyhFWFRSQV9GSU5JU0hfUE9JTlQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUGF1c2UoKSB7CisgICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKKworICAgICAgICBpZiAoRklOSVNIX1BPSU5UX09OX1BBVVNFLmVxdWFscyhtRmluaXNoUG9pbnQpKSB7CisgICAgICAgICAgICBtb3ZlVGFza1RvQmFjayh0cnVlIC8qIG5vblJvb3QgKi8pOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25TdG9wKCkgeworICAgICAgICBzdXBlci5vblN0b3AoKTsKKworICAgICAgICBpZiAoRklOSVNIX1BPSU5UX09OX1NUT1AuZXF1YWxzKG1GaW5pc2hQb2ludCkpIHsKKyAgICAgICAgICAgIG1vdmVUYXNrVG9CYWNrKHRydWUgLyogbm9uUm9vdCAqLyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9OaWdodE1vZGVBY3Rpdml0eS5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vTmlnaHRNb2RlQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjAxNWVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vTmlnaHRNb2RlQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLmFtOworCitpbXBvcnQgYW5kcm9pZC5hcHAuVWlNb2RlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKKworLyoqIEFjdGl2aXR5IHRoYXQgY2hhbmdlcyBVSSBtb2RlIG9uIGNyZWF0aW9uIGFuZCBoYW5kbGVzIGNvcnJlc3BvbmRpbmcgY29uZmlndXJhdGlvbiBjaGFuZ2UuICovCitwdWJsaWMgY2xhc3MgTmlnaHRNb2RlQWN0aXZpdHkgZXh0ZW5kcyBBYnN0cmFjdExpZmVjeWNsZUxvZ0FjdGl2aXR5IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKKworICAgICAgICBVaU1vZGVNYW5hZ2VyIHVpTWFuYWdlciA9IChVaU1vZGVNYW5hZ2VyKSBnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuVUlfTU9ERV9TRVJWSUNFKTsKKyAgICAgICAgLy8gU3dpdGNoIHRoZSBtb2RlIHR3byB0aW1lcyB0byBtYWtlIHN1cmUgaXQgaXMgaW5kZXBlbmRlbnQgb2YgdGhlIGN1cnJlbnQgc2V0dGluZy4KKyAgICAgICAgdWlNYW5hZ2VyLnNldE5pZ2h0TW9kZShVaU1vZGVNYW5hZ2VyLk1PREVfTklHSFRfWUVTKTsKKyAgICAgICAgdWlNYW5hZ2VyLnNldE5pZ2h0TW9kZShVaU1vZGVNYW5hZ2VyLk1PREVfTklHSFRfTk8pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL05vSGlzdG9yeUFjdGl2aXR5LmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9Ob0hpc3RvcnlBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyY2QwNjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9Ob0hpc3RvcnlBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW07CisKKy8qKgorICogQW4gYWN0aXZpdHkgdGhhdCBoYXMgdGhlIG5vSGlzdG9yeSBmbGFnIHNldC4KKyAqLworcHVibGljIGNsYXNzIE5vSGlzdG9yeUFjdGl2aXR5IGV4dGVuZHMgQWJzdHJhY3RMaWZlY3ljbGVMb2dBY3Rpdml0eSB7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9Ob1JlbGF1bmNoQWN0aXZpdHkuamF2YSBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL05vUmVsYXVuY2hBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MzExM2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9Ob1JlbGF1bmNoQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbTsKKworcHVibGljIGNsYXNzIE5vUmVsYXVuY2hBY3Rpdml0eSBleHRlbmRzIEFic3RyYWN0TGlmZWN5Y2xlTG9nQWN0aXZpdHkgeworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vTm9uUmVzaXplYWJsZUFjdGl2aXR5LmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9Ob25SZXNpemVhYmxlQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGM1ZDM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vTm9uUmVzaXplYWJsZUFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW07CisKK3B1YmxpYyBjbGFzcyBOb25SZXNpemVhYmxlQWN0aXZpdHkgZXh0ZW5kcyBBYnN0cmFjdExpZmVjeWNsZUxvZ0FjdGl2aXR5IHsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1BpcEFjdGl2aXR5LmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9QaXBBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NGUwNTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9QaXBBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMjk5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLmFtOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLldpbmRvd0NvbmZpZ3VyYXRpb24uV0lORE9XSU5HX01PREVfUElOTkVEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50LkZMQUdfQUNUSVZJVFlfQ0xFQVJfVEFTSzsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LkludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLlBpcEFjdGl2aXR5LkFDVElPTl9FTlRFUl9QSVA7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuUGlwQWN0aXZpdHkuQUNUSU9OX0VYUEFORF9QSVA7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuUGlwQWN0aXZpdHkuQUNUSU9OX0ZJTklTSDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5QaXBBY3Rpdml0eS5BQ1RJT05fTU9WRV9UT19CQUNLOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLlBpcEFjdGl2aXR5LkFDVElPTl9TRVRfUkVRVUVTVEVEX09SSUVOVEFUSU9OOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLlBpcEFjdGl2aXR5LkVYVFJBX0FTU0VSVF9OT19PTl9TVE9QX0JFRk9SRV9QSVA7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuUGlwQWN0aXZpdHkuRVhUUkFfRU5URVJfUElQOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLlBpcEFjdGl2aXR5LkVYVFJBX0VOVEVSX1BJUF9BU1BFQ1RfUkFUSU9fREVOT01JTkFUT1I7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuUGlwQWN0aXZpdHkuRVhUUkFfRU5URVJfUElQX0FTUEVDVF9SQVRJT19OVU1FUkFUT1I7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuUGlwQWN0aXZpdHkuRVhUUkFfRU5URVJfUElQX09OX1BBVVNFOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLlBpcEFjdGl2aXR5LkVYVFJBX0ZJTklTSF9TRUxGX09OX1JFU1VNRTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5QaXBBY3Rpdml0eS5FWFRSQV9PTl9QQVVTRV9ERUxBWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5QaXBBY3Rpdml0eS5FWFRSQV9QSVBfT1JJRU5UQVRJT047CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuUGlwQWN0aXZpdHkuRVhUUkFfUkVFTlRFUl9QSVBfT05fRVhJVDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5QaXBBY3Rpdml0eS5FWFRSQV9TRVRfQVNQRUNUX1JBVElPX0RFTk9NSU5BVE9SOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLlBpcEFjdGl2aXR5LkVYVFJBX1NFVF9BU1BFQ1RfUkFUSU9fTlVNRVJBVE9SOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLlBpcEFjdGl2aXR5LkVYVFJBX1NFVF9BU1BFQ1RfUkFUSU9fV0lUSF9ERUxBWV9ERU5PTUlOQVRPUjsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5QaXBBY3Rpdml0eS5FWFRSQV9TRVRfQVNQRUNUX1JBVElPX1dJVEhfREVMQVlfTlVNRVJBVE9SOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLlBpcEFjdGl2aXR5LkVYVFJBX1NIT1dfT1ZFUl9LRVlHVUFSRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5QaXBBY3Rpdml0eS5FWFRSQV9TVEFSVF9BQ1RJVklUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5QaXBBY3Rpdml0eS5FWFRSQV9UQVBfVE9fRklOSVNIOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlPcHRpb25zOworaW1wb3J0IGFuZHJvaWQuYXBwLlBpY3R1cmVJblBpY3R1cmVQYXJhbXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlJhdGlvbmFsOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOworCitwdWJsaWMgY2xhc3MgUGlwQWN0aXZpdHkgZXh0ZW5kcyBBYnN0cmFjdExpZmVjeWNsZUxvZ0FjdGl2aXR5IHsKKworICAgIHByaXZhdGUgYm9vbGVhbiBtRW50ZXJlZFBpY3R1cmVJblBpY3R1cmU7CisKKyAgICBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpOworICAgIHByaXZhdGUgQnJvYWRjYXN0UmVjZWl2ZXIgbVJlY2VpdmVyID0gbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgaWYgKGludGVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChpbnRlbnQuZ2V0QWN0aW9uKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBQ1RJT05fRU5URVJfUElQOgorICAgICAgICAgICAgICAgICAgICAgICAgZW50ZXJQaWN0dXJlSW5QaWN0dXJlTW9kZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQUNUSU9OX01PVkVfVE9fQkFDSzoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVUYXNrVG9CYWNrKGZhbHNlIC8qIG5vblJvb3QgKi8pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQUNUSU9OX0VYUEFORF9QSVA6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUcmlnZ2VyIHRoZSBhY3Rpdml0eSB0byBleHBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIEludGVudCBzdGFydEludGVudCA9IG5ldyBJbnRlbnQoUGlwQWN0aXZpdHkudGhpcywgUGlwQWN0aXZpdHkuY2xhc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRJbnRlbnQuc2V0RmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfUkVPUkRFUl9UT19GUk9OVCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydEFjdGl2aXR5KHN0YXJ0SW50ZW50KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVudC5oYXNFeHRyYShFWFRSQV9TRVRfQVNQRUNUX1JBVElPX1dJVEhfREVMQVlfTlVNRVJBVE9SKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbnRlbnQuaGFzRXh0cmEoRVhUUkFfU0VUX0FTUEVDVF9SQVRJT19XSVRIX0RFTEFZX0RFTk9NSU5BVE9SKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVnbHksIGJ1dCByZXF1aXJlZCB0byB3YWl0IGZvciB0aGUgc3RhcnRBY3Rpdml0eSB0byBhY3R1YWxseSBzdGFydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBhY3Rpdml0eS4uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IYW5kbGVyLnBvc3REZWxheWVkKCgpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUGljdHVyZUluUGljdHVyZVBhcmFtcy5CdWlsZGVyIGJ1aWxkZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQaWN0dXJlSW5QaWN0dXJlUGFyYW1zLkJ1aWxkZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5zZXRBc3BlY3RSYXRpbyhnZXRBc3BlY3RSYXRpbyhpbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFfU0VUX0FTUEVDVF9SQVRJT19XSVRIX0RFTEFZX05VTUVSQVRPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRSQV9TRVRfQVNQRUNUX1JBVElPX1dJVEhfREVMQVlfREVOT01JTkFUT1IpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UGljdHVyZUluUGljdHVyZVBhcmFtcyhidWlsZGVyLmJ1aWxkKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDEwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBQ1RJT05fU0VUX1JFUVVFU1RFRF9PUklFTlRBVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldFJlcXVlc3RlZE9yaWVudGF0aW9uKEludGVnZXIucGFyc2VJbnQoaW50ZW50LmdldFN0cmluZ0V4dHJhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRSQV9QSVBfT1JJRU5UQVRJT04pKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBQ1RJT05fRklOSVNIOgorICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIC8vIFNldCB0aGUgZml4ZWQgb3JpZW50YXRpb24gaWYgcmVxdWVzdGVkCisgICAgICAgIGlmIChnZXRJbnRlbnQoKS5oYXNFeHRyYShFWFRSQV9QSVBfT1JJRU5UQVRJT04pKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgb3JpID0gSW50ZWdlci5wYXJzZUludChnZXRJbnRlbnQoKS5nZXRTdHJpbmdFeHRyYShFWFRSQV9QSVBfT1JJRU5UQVRJT04pKTsKKyAgICAgICAgICAgIHNldFJlcXVlc3RlZE9yaWVudGF0aW9uKG9yaSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTZXQgdGhlIHdpbmRvdyBmbGFnIHRvIHNob3cgb3ZlciB0aGUga2V5Z3VhcmQKKyAgICAgICAgaWYgKGdldEludGVudCgpLmhhc0V4dHJhKEVYVFJBX1NIT1dfT1ZFUl9LRVlHVUFSRCkpIHsKKyAgICAgICAgICAgIHNldFNob3dXaGVuTG9ja2VkKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRW50ZXIgcGljdHVyZSBpbiBwaWN0dXJlIHdpdGggdGhlIGdpdmVuIGFzcGVjdCByYXRpbyBpZiBwcm92aWRlZAorICAgICAgICBpZiAoZ2V0SW50ZW50KCkuaGFzRXh0cmEoRVhUUkFfRU5URVJfUElQKSkgeworICAgICAgICAgICAgaWYgKGdldEludGVudCgpLmhhc0V4dHJhKEVYVFJBX0VOVEVSX1BJUF9BU1BFQ1RfUkFUSU9fTlVNRVJBVE9SKQorICAgICAgICAgICAgICAgICAgICAmJiBnZXRJbnRlbnQoKS5oYXNFeHRyYShFWFRSQV9FTlRFUl9QSVBfQVNQRUNUX1JBVElPX0RFTk9NSU5BVE9SKSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFBpY3R1cmVJblBpY3R1cmVQYXJhbXMuQnVpbGRlciBidWlsZGVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUGljdHVyZUluUGljdHVyZVBhcmFtcy5CdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0QXNwZWN0UmF0aW8oZ2V0QXNwZWN0UmF0aW8oZ2V0SW50ZW50KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFfRU5URVJfUElQX0FTUEVDVF9SQVRJT19OVU1FUkFUT1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFfRU5URVJfUElQX0FTUEVDVF9SQVRJT19ERU5PTUlOQVRPUikpOworICAgICAgICAgICAgICAgICAgICBlbnRlclBpY3R1cmVJblBpY3R1cmVNb2RlKGJ1aWxkZXIuYnVpbGQoKSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBjYWxsIGNhbiBmYWlsIGludGVudGlvbmFsbHkgaWYgdGhlIGFzcGVjdCByYXRpbyBpcyB0b28gZXh0cmVtZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZW50ZXJQaWN0dXJlSW5QaWN0dXJlTW9kZShuZXcgUGljdHVyZUluUGljdHVyZVBhcmFtcy5CdWlsZGVyKCkuYnVpbGQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBXZSBuZWVkIHRvIHdhaXQgZm9yIGVpdGhlciBlbnRlclBpY3R1cmVJblBpY3R1cmUoKSBvciByZXF1ZXN0QXV0b0VudGVyUGljdHVyZUluUGljdHVyZSgpCisgICAgICAgIC8vIHRvIGJlIGNhbGxlZCBiZWZvcmUgc2V0dGluZyB0aGUgYXNwZWN0IHJhdGlvCisgICAgICAgIGlmIChnZXRJbnRlbnQoKS5oYXNFeHRyYShFWFRSQV9TRVRfQVNQRUNUX1JBVElPX05VTUVSQVRPUikKKyAgICAgICAgICAgICAgICAmJiBnZXRJbnRlbnQoKS5oYXNFeHRyYShFWFRSQV9TRVRfQVNQRUNUX1JBVElPX0RFTk9NSU5BVE9SKSkgeworICAgICAgICAgICAgZmluYWwgUGljdHVyZUluUGljdHVyZVBhcmFtcy5CdWlsZGVyIGJ1aWxkZXIgPQorICAgICAgICAgICAgICAgICAgICBuZXcgUGljdHVyZUluUGljdHVyZVBhcmFtcy5CdWlsZGVyKCk7CisgICAgICAgICAgICBidWlsZGVyLnNldEFzcGVjdFJhdGlvKGdldEFzcGVjdFJhdGlvKGdldEludGVudCgpLAorICAgICAgICAgICAgICAgICAgICBFWFRSQV9TRVRfQVNQRUNUX1JBVElPX05VTUVSQVRPUiwgRVhUUkFfU0VUX0FTUEVDVF9SQVRJT19ERU5PTUlOQVRPUikpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzZXRQaWN0dXJlSW5QaWN0dXJlUGFyYW1zKGJ1aWxkZXIuYnVpbGQoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgY2FsbCBjYW4gZmFpbCBpbnRlbnRpb25hbGx5IGlmIHRoZSBhc3BlY3QgcmF0aW8gaXMgdG9vIGV4dHJlbWUKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEVuYWJsZSB0YXAgdG8gZmluaXNoIGlmIG5lY2Vzc2FyeQorICAgICAgICBpZiAoZ2V0SW50ZW50KCkuaGFzRXh0cmEoRVhUUkFfVEFQX1RPX0ZJTklTSCkpIHsKKyAgICAgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LnRhcF90b19maW5pc2hfcGlwX2xheW91dCk7CisgICAgICAgICAgICBmaW5kVmlld0J5SWQoUi5pZC5jb250ZW50KS5zZXRPbkNsaWNrTGlzdGVuZXIodiAtPiB7CisgICAgICAgICAgICAgICAgZmluaXNoKCk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIExhdW5jaCBhIG5ldyBhY3Rpdml0eSBpZiByZXF1ZXN0ZWQKKyAgICAgICAgU3RyaW5nIGxhdW5jaEFjdGl2aXR5Q29tcG9uZW50ID0gZ2V0SW50ZW50KCkuZ2V0U3RyaW5nRXh0cmEoRVhUUkFfU1RBUlRfQUNUSVZJVFkpOworICAgICAgICBpZiAobGF1bmNoQWN0aXZpdHlDb21wb25lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgSW50ZW50IGxhdW5jaEludGVudCA9IG5ldyBJbnRlbnQoKTsKKyAgICAgICAgICAgIGxhdW5jaEludGVudC5zZXRDb21wb25lbnQoQ29tcG9uZW50TmFtZS51bmZsYXR0ZW5Gcm9tU3RyaW5nKGxhdW5jaEFjdGl2aXR5Q29tcG9uZW50KSk7CisgICAgICAgICAgICBzdGFydEFjdGl2aXR5KGxhdW5jaEludGVudCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZWdpc3RlciB0aGUgYnJvYWRjYXN0IHJlY2VpdmVyCisgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oQUNUSU9OX0VOVEVSX1BJUCk7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oQUNUSU9OX01PVkVfVE9fQkFDSyk7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oQUNUSU9OX0VYUEFORF9QSVApOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEFDVElPTl9TRVRfUkVRVUVTVEVEX09SSUVOVEFUSU9OKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihBQ1RJT05fRklOSVNIKTsKKyAgICAgICAgcmVnaXN0ZXJSZWNlaXZlcihtUmVjZWl2ZXIsIGZpbHRlcik7CisKKyAgICAgICAgLy8gRHVtcCBhcHBsaWVkIGRpc3BsYXkgbWV0cmljcy4KKyAgICAgICAgQ29uZmlndXJhdGlvbiBjb25maWcgPSBnZXRSZXNvdXJjZXMoKS5nZXRDb25maWd1cmF0aW9uKCk7CisgICAgICAgIGR1bXBEaXNwbGF5U2l6ZShjb25maWcpOworICAgICAgICBkdW1wQ29uZmlndXJhdGlvbihjb25maWcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgeworICAgICAgICBzdXBlci5vblJlc3VtZSgpOworCisgICAgICAgIC8vIEZpbmlzaCBzZWxmIGlmIHJlcXVlc3RlZAorICAgICAgICBpZiAoZ2V0SW50ZW50KCkuaGFzRXh0cmEoRVhUUkFfRklOSVNIX1NFTEZfT05fUkVTVU1FKSkgeworICAgICAgICAgICAgZmluaXNoKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblBhdXNlKCkgeworICAgICAgICBzdXBlci5vblBhdXNlKCk7CisKKyAgICAgICAgLy8gUGF1c2UgaWYgcmVxdWVzdGVkCisgICAgICAgIGlmIChnZXRJbnRlbnQoKS5oYXNFeHRyYShFWFRSQV9PTl9QQVVTRV9ERUxBWSkpIHsKKyAgICAgICAgICAgIFN5c3RlbUNsb2NrLnNsZWVwKExvbmcudmFsdWVPZihnZXRJbnRlbnQoKS5nZXRTdHJpbmdFeHRyYShFWFRSQV9PTl9QQVVTRV9ERUxBWSkpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEVudGVyIFBJUCBvbiBtb3ZlIHRvIGJhY2tncm91bmQKKyAgICAgICAgaWYgKGdldEludGVudCgpLmhhc0V4dHJhKEVYVFJBX0VOVEVSX1BJUF9PTl9QQVVTRSkpIHsKKyAgICAgICAgICAgIGVudGVyUGljdHVyZUluUGljdHVyZU1vZGUobmV3IFBpY3R1cmVJblBpY3R1cmVQYXJhbXMuQnVpbGRlcigpLmJ1aWxkKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25TdG9wKCkgeworICAgICAgICBzdXBlci5vblN0b3AoKTsKKworICAgICAgICBpZiAoZ2V0SW50ZW50KCkuaGFzRXh0cmEoRVhUUkFfQVNTRVJUX05PX09OX1NUT1BfQkVGT1JFX1BJUCkgJiYgIW1FbnRlcmVkUGljdHVyZUluUGljdHVyZSkgeworICAgICAgICAgICAgTG9nLncoZ2V0VGFnKCksICJVbmV4cGVjdGVkIG9uU3RvcCgpIGNhbGxlZCBiZWZvcmUgZW50ZXJpbmcgcGljdHVyZS1pbi1waWN0dXJlIik7CisgICAgICAgICAgICBmaW5pc2goKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uRGVzdHJveSgpIHsKKyAgICAgICAgc3VwZXIub25EZXN0cm95KCk7CisKKyAgICAgICAgdW5yZWdpc3RlclJlY2VpdmVyKG1SZWNlaXZlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25QaWN0dXJlSW5QaWN0dXJlTW9kZUNoYW5nZWQoYm9vbGVhbiBpc0luUGljdHVyZUluUGljdHVyZU1vZGUsCisgICAgICAgICAgICBDb25maWd1cmF0aW9uIG5ld0NvbmZpZykgeworICAgICAgICBzdXBlci5vblBpY3R1cmVJblBpY3R1cmVNb2RlQ2hhbmdlZChpc0luUGljdHVyZUluUGljdHVyZU1vZGUsIG5ld0NvbmZpZyk7CisKKyAgICAgICAgLy8gRmFpbCBlYXJseSBpZiB0aGUgYWN0aXZpdHkgc3RhdGUgZG9lcyBub3QgbWF0Y2ggdGhlIGRpc3BhdGNoZWQgc3RhdGUKKyAgICAgICAgaWYgKGlzSW5QaWN0dXJlSW5QaWN0dXJlTW9kZSgpICE9IGlzSW5QaWN0dXJlSW5QaWN0dXJlTW9kZSkgeworICAgICAgICAgICAgTG9nLncoZ2V0VGFnKCksICJSZWNlaXZlZCBvblBpY3R1cmVJblBpY3R1cmVNb2RlQ2hhbmdlZCBtb2RlPSIKKyAgICAgICAgICAgICAgICAgICAgKyBpc0luUGljdHVyZUluUGljdHVyZU1vZGUgKyAiIGFjdGl2aXR5U3RhdGU9IiArIGlzSW5QaWN0dXJlSW5QaWN0dXJlTW9kZSgpKTsKKyAgICAgICAgICAgIGZpbmlzaCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gTWFyayB0aGF0IHdlJ3ZlIGVudGVyZWQgcGljdHVyZS1pbi1waWN0dXJlIHNvIHRoYXQgd2UgY2FuIHN0b3AgY2hlY2tpbmcgZm9yCisgICAgICAgIC8vIEVYVFJBX0FTU0VSVF9OT19PTl9TVE9QX0JFRk9SRV9QSVAKKyAgICAgICAgaWYgKGlzSW5QaWN0dXJlSW5QaWN0dXJlTW9kZSkgeworICAgICAgICAgICAgbUVudGVyZWRQaWN0dXJlSW5QaWN0dXJlID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghaXNJblBpY3R1cmVJblBpY3R1cmVNb2RlICYmIGdldEludGVudCgpLmhhc0V4dHJhKEVYVFJBX1JFRU5URVJfUElQX09OX0VYSVQpKSB7CisgICAgICAgICAgICAvLyBUaGlzIGNhbGwgdG8gcmUtZW50ZXIgUElQIGNhbiBoYXBwZW4gdG9vIHF1aWNrbHkgKGhvc3Qgc2lkZSB0ZXN0cyBjYW4gaGF2ZSBkaWZmaWN1bHR5CisgICAgICAgICAgICAvLyBjaGVja2luZyB0aGF0IHRoZSBzdGFja3MgZXZlciBjaGFuZ2VkKS4gVGhlcmVmb3IsIHdlIG5lZWQgdG8gZGVsYXkgaGVyZSBzbGlnaHRseSB0bworICAgICAgICAgICAgLy8gYWxsb3cgdGhlIHRlc3RzIHRvIHZlcmlmeSB0aGF0IHRoZSBzdGFja3MgaGF2ZSBjaGFuZ2VkIGJlZm9yZSByZS1lbnRlcmluZy4KKyAgICAgICAgICAgIG1IYW5kbGVyLnBvc3REZWxheWVkKCgpIC0+IHsKKyAgICAgICAgICAgICAgICBlbnRlclBpY3R1cmVJblBpY3R1cmVNb2RlKG5ldyBQaWN0dXJlSW5QaWN0dXJlUGFyYW1zLkJ1aWxkZXIoKS5idWlsZCgpKTsKKyAgICAgICAgICAgIH0sIDEwMDApOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25Db25maWd1cmF0aW9uQ2hhbmdlZChDb25maWd1cmF0aW9uIG5ld0NvbmZpZykgeworICAgICAgICBzdXBlci5vbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKG5ld0NvbmZpZyk7CisgICAgICAgIGR1bXBEaXNwbGF5U2l6ZShuZXdDb25maWcpOworICAgICAgICBkdW1wQ29uZmlndXJhdGlvbihuZXdDb25maWcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIExhdW5jaGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBQaXBBY3Rpdml0eSBkaXJlY3RseSBpbnRvIHRoZSBwaW5uZWQgc3RhY2suCisgICAgICovCisgICAgc3RhdGljIHZvaWQgbGF1bmNoQWN0aXZpdHlJbnRvUGlubmVkU3RhY2soQWN0aXZpdHkgY2FsbGVyLCBSZWN0IGJvdW5kcykgeworICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChjYWxsZXIsIFBpcEFjdGl2aXR5LmNsYXNzKTsKKyAgICAgICAgaW50ZW50LnNldEZsYWdzKEZMQUdfQUNUSVZJVFlfQ0xFQVJfVEFTSyB8IEZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoRVhUUkFfQVNTRVJUX05PX09OX1NUT1BfQkVGT1JFX1BJUCwgInRydWUiKTsKKworICAgICAgICBmaW5hbCBBY3Rpdml0eU9wdGlvbnMgb3B0aW9ucyA9IEFjdGl2aXR5T3B0aW9ucy5tYWtlQmFzaWMoKTsKKyAgICAgICAgb3B0aW9ucy5zZXRMYXVuY2hCb3VuZHMoYm91bmRzKTsKKyAgICAgICAgb3B0aW9ucy5zZXRMYXVuY2hXaW5kb3dpbmdNb2RlKFdJTkRPV0lOR19NT0RFX1BJTk5FRCk7CisgICAgICAgIGNhbGxlci5zdGFydEFjdGl2aXR5KGludGVudCwgb3B0aW9ucy50b0J1bmRsZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMYXVuY2hlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgUGlwQWN0aXZpdHkgaW4gdGhlIHNhbWUgdGFzayB0aGF0IHdpbGwgYXV0b21hdGljYWxseSBlbnRlcgorICAgICAqIFBpUC4KKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBsYXVuY2hFbnRlclBpcEFjdGl2aXR5KEFjdGl2aXR5IGNhbGxlcikgeworICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChjYWxsZXIsIFBpcEFjdGl2aXR5LmNsYXNzKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKEVYVFJBX0VOVEVSX1BJUCwgInRydWUiKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKEVYVFJBX0FTU0VSVF9OT19PTl9TVE9QX0JFRk9SRV9QSVAsICJ0cnVlIik7CisgICAgICAgIGNhbGxlci5zdGFydEFjdGl2aXR5KGludGVudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBhIHtAbGluayBSYXRpb25hbH0gYXNwZWN0IHJhdGlvIGZyb20gdGhlIGdpdmVuIGludGVudCBhbmQgZXh0cmFzLgorICAgICAqLworICAgIHByaXZhdGUgUmF0aW9uYWwgZ2V0QXNwZWN0UmF0aW8oSW50ZW50IGludGVudCwgU3RyaW5nIGV4dHJhTnVtLCBTdHJpbmcgZXh0cmFEZW5vbSkgeworICAgICAgICByZXR1cm4gbmV3IFJhdGlvbmFsKAorICAgICAgICAgICAgICAgIEludGVnZXIudmFsdWVPZihpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoZXh0cmFOdW0pKSwKKyAgICAgICAgICAgICAgICBJbnRlZ2VyLnZhbHVlT2YoaW50ZW50LmdldFN0cmluZ0V4dHJhKGV4dHJhRGVub20pKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vUGlwQWN0aXZpdHkyLmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9QaXBBY3Rpdml0eTIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2M5ODU4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vUGlwQWN0aXZpdHkyLmphdmEKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbTsKKworLyoqCisgKiBBIHNlY29uZGFyeSBhY3Rpdml0eSB0aGF0IGhhcyB0aGUgc2FtZSBiZWhhdmlvciBhcyB7QGxpbmsgUGlwQWN0aXZpdHl9LgorICovCitwdWJsaWMgY2xhc3MgUGlwQWN0aXZpdHkyIGV4dGVuZHMgUGlwQWN0aXZpdHkgeworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vUGlwQWN0aXZpdHlXaXRoU2FtZUFmZmluaXR5LmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9QaXBBY3Rpdml0eVdpdGhTYW1lQWZmaW5pdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmZmMzlmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vUGlwQWN0aXZpdHlXaXRoU2FtZUFmZmluaXR5LmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuYXBwLlBpY3R1cmVJblBpY3R1cmVQYXJhbXM7CisKKy8qKgorICogQW4gYWN0aXZpdHkgdGhhdCBjYW4gZW50ZXIgUGlQIHdpdGggYSBmaXhlZCBhZmZpbml0eSB0byBtYXRjaAorICoge0BsaW5rIFRlc3RBY3Rpdml0eVdpdGhTYW1lQWZmaW5pdHl9LgorICovCitwdWJsaWMgY2xhc3MgUGlwQWN0aXZpdHlXaXRoU2FtZUFmZmluaXR5IGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7CisgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CisKKyAgICAgICAgZW50ZXJQaWN0dXJlSW5QaWN0dXJlTW9kZShuZXcgUGljdHVyZUluUGljdHVyZVBhcmFtcy5CdWlsZGVyKCkuYnVpbGQoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vUGlwT25TdG9wQWN0aXZpdHkuamF2YSBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1BpcE9uU3RvcEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY0ZTE0YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1BpcE9uU3RvcEFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CisKKy8qKgorICogVGhpcyBhY3Rpdml0eSB3aWxsIHRyeSBhbmQgZW50ZXIgcGljdHVyZSBpbiBwaWN0dXJlIHdoZW4gaXQgaXMgc3RvcHBlZC4KKyAqLworcHVibGljIGNsYXNzIFBpcE9uU3RvcEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LnRhcF90b19maW5pc2hfcGlwX2xheW91dCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7CisgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CisKKyAgICAgICAgc3RhcnRBY3Rpdml0eShuZXcgSW50ZW50KHRoaXMsIFBpcEFjdGl2aXR5LmNsYXNzKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25TdG9wKCkgeworICAgICAgICBzdXBlci5vblN0b3AoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgZW50ZXJQaWN0dXJlSW5QaWN0dXJlTW9kZSgpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIEtub3duIGZhaWx1cmUsIHdlIGV4cGVjdCB0aGlzIGNhbGwgdG8gdGhyb3cgYW4gZXhjZXB0aW9uCisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9Qb3J0cmFpdE9yaWVudGF0aW9uQWN0aXZpdHkuamF2YSBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1BvcnRyYWl0T3JpZW50YXRpb25BY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMjJiYzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9Qb3J0cmFpdE9yaWVudGF0aW9uQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLmFtOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworCitwdWJsaWMgY2xhc3MgUG9ydHJhaXRPcmllbnRhdGlvbkFjdGl2aXR5IGV4dGVuZHMgQWJzdHJhY3RMaWZlY3ljbGVMb2dBY3Rpdml0eSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKKyAgICAgICAgZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWcgPSBnZXRSZXNvdXJjZXMoKS5nZXRDb25maWd1cmF0aW9uKCk7CisgICAgICAgIGR1bXBEaXNwbGF5U2l6ZShjb25maWcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQoQ29uZmlndXJhdGlvbiBuZXdDb25maWcpIHsKKyAgICAgICAgc3VwZXIub25Db25maWd1cmF0aW9uQ2hhbmdlZChuZXdDb25maWcpOworICAgICAgICBkdW1wRGlzcGxheVNpemUobmV3Q29uZmlnKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9SZWN1cnNpdmVBY3Rpdml0eS5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vUmVjdXJzaXZlQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2UyZDRlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vUmVjdXJzaXZlQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLmFtOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitwdWJsaWMgY2xhc3MgUmVjdXJzaXZlQWN0aXZpdHkgZXh0ZW5kcyBBYnN0cmFjdExpZmVjeWNsZUxvZ0FjdGl2aXR5IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfUkVDVVJTSU9OX0RFUFRIID0gMjA7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHNSZWN1cnNpb25EZXB0aDsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKKyAgICAgICAgTG9nLmkoZ2V0VGFnKCksICJJbnN0YW5jZSBudW1iZXI6ICIgKyBzUmVjdXJzaW9uRGVwdGgpOworICAgICAgICBpZiAoc1JlY3Vyc2lvbkRlcHRoKysgPCBNQVhfUkVDVVJTSU9OX0RFUFRIKSB7CisgICAgICAgICAgICBMb2cuaShnZXRUYWcoKSwgIkxhdW5jaGluZyBuZXcgaW5zdGFuY2UgcmVjdXJzaXZlbHkuIik7CisgICAgICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCh0aGlzLCBSZWN1cnNpdmVBY3Rpdml0eS5jbGFzcyk7CisgICAgICAgICAgICBpbnRlbnQuc2V0RmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0sgfCBJbnRlbnQuRkxBR19BQ1RJVklUWV9NVUxUSVBMRV9UQVNLKTsKKyAgICAgICAgICAgIHN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExvZy5pKGdldFRhZygpLCAiUmVhY2hlZCBlbmQgb2YgcmVjdXJzaXZlIGxhdW5jaGVzLiBMYXVuY2hpbmcgVGVzdEFjdGl2aXR5LiIpOworICAgICAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQodGhpcywgVGVzdEFjdGl2aXR5LmNsYXNzKTsKKyAgICAgICAgICAgIGludGVudC5zZXRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyB8IEludGVudC5GTEFHX0FDVElWSVRZX01VTFRJUExFX1RBU0spOworICAgICAgICAgICAgc3RhcnRBY3Rpdml0eShpbnRlbnQpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vUmVzaXplYWJsZUFjdGl2aXR5LmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9SZXNpemVhYmxlQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzAxMTBjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vUmVzaXplYWJsZUFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisgKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorICogdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisgKiB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKKworcHVibGljIGNsYXNzIFJlc2l6ZWFibGVBY3Rpdml0eSBleHRlbmRzIEFic3RyYWN0TGlmZWN5Y2xlTG9nQWN0aXZpdHkgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5yZXNpemVhYmxlX2FjdGl2aXR5KTsKKyAgICAgICAgZHVtcERpc3BsYXlTaXplKGdldFJlc291cmNlcygpLmdldENvbmZpZ3VyYXRpb24oKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25Db25maWd1cmF0aW9uQ2hhbmdlZChDb25maWd1cmF0aW9uIG5ld0NvbmZpZykgeworICAgICAgICBzdXBlci5vbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKG5ld0NvbmZpZyk7CisgICAgICAgIGR1bXBEaXNwbGF5U2l6ZShuZXdDb25maWcpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1Jlc3VtZVdoaWxlUGF1c2luZ0FjdGl2aXR5LmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9SZXN1bWVXaGlsZVBhdXNpbmdBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZmJiOGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9SZXN1bWVXaGlsZVBhdXNpbmdBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLmFtOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CisKK3B1YmxpYyBjbGFzcyBSZXN1bWVXaGlsZVBhdXNpbmdBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICAvLyBFbXB0eQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vU2hvd1doZW5Mb2NrZWRBY3Rpdml0eS5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vU2hvd1doZW5Mb2NrZWRBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NTZhYTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9TaG93V2hlbkxvY2tlZEFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbTsKKworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOworCitwdWJsaWMgY2xhc3MgU2hvd1doZW5Mb2NrZWRBY3Rpdml0eSBleHRlbmRzIEJyb2FkY2FzdFJlY2VpdmVyQWN0aXZpdHkgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBnZXRXaW5kb3coKS5hZGRGbGFncyhXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX1NIT1dfV0hFTl9MT0NLRUQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1Nob3dXaGVuTG9ja2VkQXR0ckFjdGl2aXR5LmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9TaG93V2hlbkxvY2tlZEF0dHJBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YzcwODMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9TaG93V2hlbkxvY2tlZEF0dHJBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW07CisKK3B1YmxpYyBjbGFzcyBTaG93V2hlbkxvY2tlZEF0dHJBY3Rpdml0eSBleHRlbmRzIEFic3RyYWN0TGlmZWN5Y2xlTG9nQWN0aXZpdHkgeworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vU2hvd1doZW5Mb2NrZWRBdHRyUmVtb3ZlQXR0ckFjdGl2aXR5LmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9TaG93V2hlbkxvY2tlZEF0dHJSZW1vdmVBdHRyQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDMwM2ViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vU2hvd1doZW5Mb2NrZWRBdHRyUmVtb3ZlQXR0ckFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbTsKKworcHVibGljIGNsYXNzIFNob3dXaGVuTG9ja2VkQXR0clJlbW92ZUF0dHJBY3Rpdml0eSBleHRlbmRzIEFic3RyYWN0TGlmZWN5Y2xlTG9nQWN0aXZpdHkgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25TdG9wKCkgeworICAgICAgICBzdXBlci5vblN0b3AoKTsKKyAgICAgICAgc2V0U2hvd1doZW5Mb2NrZWQoZmFsc2UpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1Nob3dXaGVuTG9ja2VkQXR0cldpdGhEaWFsb2dBY3Rpdml0eS5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vU2hvd1doZW5Mb2NrZWRBdHRyV2l0aERpYWxvZ0FjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY5YjIxNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1Nob3dXaGVuTG9ja2VkQXR0cldpdGhEaWFsb2dBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW07CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BbGVydERpYWxvZzsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKKworcHVibGljIGNsYXNzIFNob3dXaGVuTG9ja2VkQXR0cldpdGhEaWFsb2dBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgbmV3IEFsZXJ0RGlhbG9nLkJ1aWxkZXIodGhpcykKKyAgICAgICAgICAgICAgICAuc2V0VGl0bGUoIkRpYWxvZyIpCisgICAgICAgICAgICAgICAgLnNob3coKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9TaG93V2hlbkxvY2tlZERpYWxvZ0FjdGl2aXR5LmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9TaG93V2hlbkxvY2tlZERpYWxvZ0FjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZlYjE1NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1Nob3dXaGVuTG9ja2VkRGlhbG9nQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLmFtOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7CisKK3B1YmxpYyBjbGFzcyBTaG93V2hlbkxvY2tlZERpYWxvZ0FjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBnZXRXaW5kb3coKS5hZGRGbGFncyhXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX1NIT1dfV0hFTl9MT0NLRUQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1Nob3dXaGVuTG9ja2VkVHJhbnNsdWNlbnRBY3Rpdml0eS5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vU2hvd1doZW5Mb2NrZWRUcmFuc2x1Y2VudEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQyMjEwNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1Nob3dXaGVuTG9ja2VkVHJhbnNsdWNlbnRBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW07CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKKworcHVibGljIGNsYXNzIFNob3dXaGVuTG9ja2VkVHJhbnNsdWNlbnRBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgZ2V0V2luZG93KCkuYWRkRmxhZ3MoV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19TSE9XX1dIRU5fTE9DS0VEKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQudHJhbnNsdWNlbnQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1Nob3dXaGVuTG9ja2VkV2l0aERpYWxvZ0FjdGl2aXR5LmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9TaG93V2hlbkxvY2tlZFdpdGhEaWFsb2dBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NTE1MzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9TaG93V2hlbkxvY2tlZFdpdGhEaWFsb2dBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW07CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BbGVydERpYWxvZzsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKKworcHVibGljIGNsYXNzIFNob3dXaGVuTG9ja2VkV2l0aERpYWxvZ0FjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBnZXRXaW5kb3coKS5hZGRGbGFncyhXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX1NIT1dfV0hFTl9MT0NLRUQpOworICAgICAgICBuZXcgQWxlcnREaWFsb2cuQnVpbGRlcih0aGlzKQorICAgICAgICAgICAgICAgIC5zZXRUaXRsZSgiRGlhbG9nIikKKyAgICAgICAgICAgICAgICAuc2hvdygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1NpbmdsZUluc3RhbmNlQWN0aXZpdHkuamF2YSBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1NpbmdsZUluc3RhbmNlQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzhiNDBmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vU2luZ2xlSW5zdGFuY2VBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW07CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKKworcHVibGljIGNsYXNzIFNpbmdsZUluc3RhbmNlQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9TaW5nbGVUYXNrQWN0aXZpdHkuamF2YSBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1NpbmdsZVRhc2tBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NWFhM2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9TaW5nbGVUYXNrQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDIyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLmFtOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CisKK3B1YmxpYyBjbGFzcyBTaW5nbGVUYXNrQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9TbG93Q3JlYXRlQWN0aXZpdHkuamF2YSBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1Nsb3dDcmVhdGVBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNzhmYzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9TbG93Q3JlYXRlQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworcHVibGljIGNsYXNzIFNsb3dDcmVhdGVBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIFN5c3RlbUNsb2NrLnNsZWVwKFRpbWVVbml0LlNFQ09ORFMudG9NaWxsaXMoMikpOworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1NwbGFzaHNjcmVlbkFjdGl2aXR5LmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9TcGxhc2hzY3JlZW5BY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkOGZiYWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9TcGxhc2hzY3JlZW5BY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW07CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworCisvKioKKyAqIEFjdGl2aXR5IHRoYXQgc2hvd3MgYSBjdXN0b20gc3BsYXNoc2NyZWVuIHdoZW4gYmVpbmcgbGF1bmNoZWQuCisgKi8KK3B1YmxpYyBjbGFzcyBTcGxhc2hzY3JlZW5BY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgLy8gTWFrZSBzdXJlIHNwbGFzaCBzY3JlZW4gaXMgdmlzaWJsZS4gVGhlIHRlc3Qgd29uJ3QgdGFrZSA1IHNlY29uZHMgYmVjYXVzZSB0aGUgY29uZGl0aW9uCisgICAgICAgIC8vIHN1Y2ggdGhhdCB3ZSBjYW4gZHVtcCB0aGUgc3RhdGUgd2lsbCB0cmlnZ2VyIG11Y2ggZWFybGllciBhbmQgdGhlbiB0aGUgdGVzdCB3aWxsIGp1c3QKKyAgICAgICAgLy8ga2lsbCB1cy4KKyAgICAgICAgU3lzdGVtQ2xvY2suc2xlZXAoNTAwMCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vU3dpcGVSZWZyZXNoQWN0aXZpdHkuamF2YSBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1N3aXBlUmVmcmVzaEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZiYmQyMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1N3aXBlUmVmcmVzaEFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbTsKKworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworCisvKioKKyAqIEFuIGFjdGl2aXR5IGNvbnRhaW5pbmcgYSBTd2lwZVJlZnJlc2hMYXlvdXQgd2hpY2ggcHJldmVudHMgYWN0aXZpdHkgaWRsZS4KKyAqLworcHVibGljIGNsYXNzIFN3aXBlUmVmcmVzaEFjdGl2aXR5IGV4dGVuZHMgQWJzdHJhY3RMaWZlY3ljbGVMb2dBY3Rpdml0eSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KG5ldyBTd2lwZVJlZnJlc2hMYXlvdXQodGhpcykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1N3aXBlUmVmcmVzaExheW91dC5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vU3dpcGVSZWZyZXNoTGF5b3V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAxMWMwNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1N3aXBlUmVmcmVzaExheW91dC5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW07CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworCisvKioKKyAqIEFuIGV4dGVuc2lvbiBvZiB7QGxpbmsgYW5kcm9pZHguc3dpcGVyZWZyZXNobGF5b3V0LndpZGdldC5Td2lwZVJlZnJlc2hMYXlvdXR9IHRoYXQgY2FsbHMKKyAqIHtAbGluayAjc2V0UmVmcmVzaGluZ30gZHVyaW5nIGNvbnN0cnVjdGlvbiwgcHJldmVudGluZyBhY3Rpdml0eSBpZGxlLgorICovCitwdWJsaWMgY2xhc3MgU3dpcGVSZWZyZXNoTGF5b3V0IGV4dGVuZHMgYW5kcm9pZHguc3dpcGVyZWZyZXNobGF5b3V0LndpZGdldC5Td2lwZVJlZnJlc2hMYXlvdXQgeworICAgIHB1YmxpYyBTd2lwZVJlZnJlc2hMYXlvdXQoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICBpbml0aWFsaXplKCk7CisgICAgfQorCisgICAgcHVibGljIFN3aXBlUmVmcmVzaExheW91dChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CisgICAgICAgIGluaXRpYWxpemUoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKKyAgICAgICAgc2V0UmVmcmVzaGluZyh0cnVlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9UZXN0QWN0aXZpdHlXaXRoU2FtZUFmZmluaXR5LmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9UZXN0QWN0aXZpdHlXaXRoU2FtZUFmZmluaXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU3ZWM1ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1Rlc3RBY3Rpdml0eVdpdGhTYW1lQWZmaW5pdHkuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLlBpY3R1cmVJblBpY3R1cmVQYXJhbXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKKworcHVibGljIGNsYXNzIFRlc3RBY3Rpdml0eVdpdGhTYW1lQWZmaW5pdHkgZXh0ZW5kcyBUZXN0QWN0aXZpdHkgeworCisgICAgLy8gQ2FsbHMgZW50ZXJQaWN0dXJlSW5QaWN0dXJlKCkgb24gY3JlYXRpb24KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfRU5URVJfUElQID0gImVudGVyX3BpcCI7CisgICAgLy8gU3RhcnRzIHRoZSBhY3Rpdml0eSAoY29tcG9uZW50IG5hbWUpIHByb3ZpZGVkIGJ5IHRoZSB2YWx1ZSBhdCB0aGUgZW5kIG9mIG9uQ3JlYXRlCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1NUQVJUX0FDVElWSVRZID0gInN0YXJ0X2FjdGl2aXR5IjsKKyAgICAvLyBGaW5pc2hlcyB0aGUgYWN0aXZpdHkgYXQgdGhlIGVuZCBvZiBvblJlc3VtZSAoYWZ0ZXIgRVhUUkFfU1RBUlRfQUNUSVZJVFkgaXMgaGFuZGxlZCkKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfRklOSVNIX1NFTEZfT05fUkVTVU1FID0gImZpbmlzaF9zZWxmX29uX3Jlc3VtZSI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgaWNpY2xlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKGljaWNsZSk7CisKKyAgICAgICAgLy8gRW50ZXIgcGljdHVyZSBpbiBwaWN0dXJlIGlmIHJlcXVlc3RlZAorICAgICAgICBpZiAoZ2V0SW50ZW50KCkuaGFzRXh0cmEoRVhUUkFfRU5URVJfUElQKSkgeworICAgICAgICAgICAgZW50ZXJQaWN0dXJlSW5QaWN0dXJlTW9kZShuZXcgUGljdHVyZUluUGljdHVyZVBhcmFtcy5CdWlsZGVyKCkuYnVpbGQoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBMYXVuY2ggYSBuZXcgYWN0aXZpdHkgaWYgcmVxdWVzdGVkCisgICAgICAgIFN0cmluZyBsYXVuY2hBY3Rpdml0eUNvbXBvbmVudCA9IGdldEludGVudCgpLmdldFN0cmluZ0V4dHJhKEVYVFJBX1NUQVJUX0FDVElWSVRZKTsKKyAgICAgICAgaWYgKGxhdW5jaEFjdGl2aXR5Q29tcG9uZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIEludGVudCBsYXVuY2hJbnRlbnQgPSBuZXcgSW50ZW50KCk7CisgICAgICAgICAgICBsYXVuY2hJbnRlbnQuc2V0Q29tcG9uZW50KENvbXBvbmVudE5hbWUudW5mbGF0dGVuRnJvbVN0cmluZyhsYXVuY2hBY3Rpdml0eUNvbXBvbmVudCkpOworICAgICAgICAgICAgc3RhcnRBY3Rpdml0eShsYXVuY2hJbnRlbnQpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7CisgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CisKKyAgICAgICAgLy8gRmluaXNoIHNlbGYgaWYgcmVxdWVzdGVkCisgICAgICAgIGlmIChnZXRJbnRlbnQoKS5oYXNFeHRyYShFWFRSQV9GSU5JU0hfU0VMRl9PTl9SRVNVTUUpKSB7CisgICAgICAgICAgICBmaW5pc2goKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1RvcEFjdGl2aXR5LmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9Ub3BBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3OTQ4YmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9Ub3BBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLmFtOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuVG9wQWN0aXZpdHkuRVhUUkFfRklOSVNIX0RFTEFZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLlRvcEFjdGl2aXR5LkVYVFJBX1RPUF9XQUxMUEFQRVI7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworcHVibGljIGNsYXNzIFRvcEFjdGl2aXR5IGV4dGVuZHMgQWJzdHJhY3RMaWZlY3ljbGVMb2dBY3Rpdml0eSB7CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRXYWxscGFwZXJUaGVtZSgpIHsKKyAgICAgICAgc2V0VGhlbWUoUi5zdHlsZS5XYWxscGFwZXJUaGVtZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIGZpbmFsIGJvb2xlYW4gdXNlV2FsbHBhcGVyID0gZ2V0SW50ZW50KCkuZ2V0Qm9vbGVhbkV4dHJhKEVYVFJBX1RPUF9XQUxMUEFQRVIsIGZhbHNlKTsKKyAgICAgICAgaWYgKHVzZVdhbGxwYXBlcikgeworICAgICAgICAgICAgc2V0V2FsbHBhcGVyVGhlbWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGludCBmaW5pc2hEZWxheSA9IGdldEludGVudCgpLmdldEludEV4dHJhKEVYVFJBX0ZJTklTSF9ERUxBWSwgMCk7CisgICAgICAgIGlmIChmaW5pc2hEZWxheSA+IDApIHsKKyAgICAgICAgICAgIEhhbmRsZXIgaGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7CisgICAgICAgICAgICBoYW5kbGVyLnBvc3REZWxheWVkKCgpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoZ2V0VGFnKCksICJDYWxsaW5nIGZpbmlzaCgpIik7CisgICAgICAgICAgICAgICAgICAgIGZpbmlzaCgpOworICAgICAgICAgICAgfSwgZmluaXNoRGVsYXkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vVG9wTGVmdExheW91dEFjdGl2aXR5LmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9Ub3BMZWZ0TGF5b3V0QWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzAyYjIyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vVG9wTGVmdExheW91dEFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW07CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKKworcHVibGljIGNsYXNzIFRvcExlZnRMYXlvdXRBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1RvcFJpZ2h0TGF5b3V0QWN0aXZpdHkuamF2YSBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1RvcFJpZ2h0TGF5b3V0QWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjEzYzAxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vVG9wUmlnaHRMYXlvdXRBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLmFtOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CisKK3B1YmxpYyBjbGFzcyBUb3BSaWdodExheW91dEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vVHJhbXBvbGluZUFjdGl2aXR5LmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9UcmFtcG9saW5lQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGYyNDhjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vVHJhbXBvbGluZUFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW07CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LkludGVudC5GTEFHX0FDVElWSVRZX0NMRUFSX1RPUDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LkludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworCisvKioKKyAqIFRoaXMgYWN0aXZpdHkgaGFzIGFuIGFsaWFzIHtAbGluayBDb21wb25lbnRzI0VOVFJZX1BPSU5UX0FMSUFTX0FDVElWSVRZfSBpbiBBbmRyb2lkTWFuaWZlc3QueG1sCisgKi8KK3B1YmxpYyBjbGFzcyBUcmFtcG9saW5lQWN0aXZpdHkgZXh0ZW5kcyBBYnN0cmFjdExpZmVjeWNsZUxvZ0FjdGl2aXR5IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgLy8gQWRkIGEgZGVsYXkgaGVyZSB0byBleHBvc2UgbW9yZSBlYXNpbHkgYSBmYWlsdXJlIGNhc2Ugd2hlcmUgdGhlIHJlYWwgdGFyZ2V0CisgICAgICAgIC8vIGFjdGl2aXR5IGlzIHZpc2libGUgYmVmb3JlIGl0J3MgbGF1bmNoZWQsIGJlY2F1c2UgaXRzIHRhc2sgaXMgYmVpbmcgYnJvdWdodAorICAgICAgICAvLyB0byBmb3JlZ3JvdW5kLiBXZSBuZWVkIHRvIHZlcmlmeSB0aGF0ICdhbSBzdGFydCcgaXMgdW5ibG9ja2VkIGNvcnJlY3RseS4KKyAgICAgICAgU3lzdGVtQ2xvY2suc2xlZXAoMjAwMCk7CisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KHRoaXMsIFNpbmdsZVRhc2tBY3Rpdml0eS5jbGFzcyk7CisgICAgICAgIGludGVudC5zZXRGbGFncyhGTEFHX0FDVElWSVRZX0NMRUFSX1RPUCB8IEZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOworCisgICAgICAgIHN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKKyAgICAgICAgZmluaXNoKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vVHJhbnNsdWNlbnRBY3Rpdml0eS5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vVHJhbnNsdWNlbnRBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4M2NlYWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9UcmFuc2x1Y2VudEFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworCitwdWJsaWMgY2xhc3MgVHJhbnNsdWNlbnRBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vVHJhbnNsdWNlbnRBc3Npc3RhbnRBY3Rpdml0eS5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vVHJhbnNsdWNlbnRBc3Npc3RhbnRBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZDVlMTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9UcmFuc2x1Y2VudEFzc2lzdGFudEFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbTsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5XaW5kb3dDb25maWd1cmF0aW9uLkFDVElWSVRZX1RZUEVfQVNTSVNUQU5UOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50LkZMQUdfQUNUSVZJVFlfQ0xFQVJfVEFTSzsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LkludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlPcHRpb25zOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CisKK3B1YmxpYyBjbGFzcyBUcmFuc2x1Y2VudEFzc2lzdGFudEFjdGl2aXR5IGV4dGVuZHMgQXNzaXN0YW50QWN0aXZpdHkgeworCisgICAgLyoqCisgICAgICogTGF1bmNoZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFRyYW5zbHVjZW50QXNzaXN0YW50QWN0aXZpdHkgZGlyZWN0bHkgaW50byB0aGUgYXNzaXN0YW50CisgICAgICogc3RhY2suCisgICAgICovCisgICAgc3RhdGljIHZvaWQgbGF1bmNoQWN0aXZpdHlJbnRvQXNzaXN0YW50U3RhY2soQWN0aXZpdHkgY2FsbGVyLCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KGNhbGxlciwgVHJhbnNsdWNlbnRBc3Npc3RhbnRBY3Rpdml0eS5jbGFzcyk7CisgICAgICAgIGludGVudC5zZXRGbGFncyhGTEFHX0FDVElWSVRZX0NMRUFSX1RBU0sgfCBGTEFHX0FDVElWSVRZX05FV19UQVNLKTsKKyAgICAgICAgaWYgKGV4dHJhcyAhPSBudWxsKSB7CisgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmFzKGV4dHJhcyk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBBY3Rpdml0eU9wdGlvbnMgb3B0aW9ucyA9IEFjdGl2aXR5T3B0aW9ucy5tYWtlQmFzaWMoKTsKKyAgICAgICAgb3B0aW9ucy5zZXRMYXVuY2hBY3Rpdml0eVR5cGUoQUNUSVZJVFlfVFlQRV9BU1NJU1RBTlQpOworICAgICAgICBjYWxsZXIuc3RhcnRBY3Rpdml0eShpbnRlbnQsIG9wdGlvbnMudG9CdW5kbGUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vVHJhbnNsdWNlbnRUZXN0QWN0aXZpdHkuamF2YSBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1RyYW5zbHVjZW50VGVzdEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZmYmQ0OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1RyYW5zbHVjZW50VGVzdEFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW07CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKKworcHVibGljIGNsYXNzIFRyYW5zbHVjZW50VGVzdEFjdGl2aXR5IGV4dGVuZHMgVGVzdEFjdGl2aXR5IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKKworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC50YXNrX292ZXJsYXkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1RyYW5zbHVjZW50VG9wQWN0aXZpdHkuamF2YSBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1RyYW5zbHVjZW50VG9wQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTYxYjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vVHJhbnNsdWNlbnRUb3BBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLmFtOworCitwdWJsaWMgY2xhc3MgVHJhbnNsdWNlbnRUb3BBY3Rpdml0eSBleHRlbmRzIFRvcEFjdGl2aXR5IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldFdhbGxwYXBlclRoZW1lKCkgeworICAgICAgICBzZXRUaGVtZShSLnN0eWxlLlRyYW5zbHVjZW50V2FsbHBhcGVyVGhlbWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1R1cm5TY3JlZW5PbkFjdGl2aXR5LmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9UdXJuU2NyZWVuT25BY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMzQ1MDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9UdXJuU2NyZWVuT25BY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW07CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKKworcHVibGljIGNsYXNzIFR1cm5TY3JlZW5PbkFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgZ2V0V2luZG93KCkuYWRkRmxhZ3MoV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19LRUVQX1NDUkVFTl9PTgorICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19TSE9XX1dIRU5fTE9DS0VECisgICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0RJU01JU1NfS0VZR1VBUkQKKyAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfVFVSTl9TQ1JFRU5fT04pOworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1R1cm5TY3JlZW5PbkF0dHJBY3Rpdml0eS5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vVHVyblNjcmVlbk9uQXR0ckFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RkMWFhMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1R1cm5TY3JlZW5PbkF0dHJBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW07CisKK3B1YmxpYyBjbGFzcyBUdXJuU2NyZWVuT25BdHRyQWN0aXZpdHkgZXh0ZW5kcyBBYnN0cmFjdExpZmVjeWNsZUxvZ0FjdGl2aXR5IHsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1R1cm5TY3JlZW5PbkF0dHJEaXNtaXNzS2V5Z3VhcmRBY3Rpdml0eS5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vVHVyblNjcmVlbk9uQXR0ckRpc21pc3NLZXlndWFyZEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I3MjQ2NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1R1cm5TY3JlZW5PbkF0dHJEaXNtaXNzS2V5Z3VhcmRBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW07CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5LZXlndWFyZE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CisKK3B1YmxpYyBjbGFzcyBUdXJuU2NyZWVuT25BdHRyRGlzbWlzc0tleWd1YXJkQWN0aXZpdHkgZXh0ZW5kcyBBYnN0cmFjdExpZmVjeWNsZUxvZ0FjdGl2aXR5IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKKyAgICAgICAgKChLZXlndWFyZE1hbmFnZXIpIGdldFN5c3RlbVNlcnZpY2UoS0VZR1VBUkRfU0VSVklDRSkpCisgICAgICAgICAgICAgICAgLnJlcXVlc3REaXNtaXNzS2V5Z3VhcmQodGhpcywgbmV3IEtleWd1YXJkRGlzbWlzc0xvZ2dlckNhbGxiYWNrKHRoaXMpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9UdXJuU2NyZWVuT25BdHRyUmVtb3ZlQXR0ckFjdGl2aXR5LmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9UdXJuU2NyZWVuT25BdHRyUmVtb3ZlQXR0ckFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU4NTA2YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1R1cm5TY3JlZW5PbkF0dHJSZW1vdmVBdHRyQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLmFtOworCitwdWJsaWMgY2xhc3MgVHVyblNjcmVlbk9uQXR0clJlbW92ZUF0dHJBY3Rpdml0eSBleHRlbmRzIEFic3RyYWN0TGlmZWN5Y2xlTG9nQWN0aXZpdHkgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25TdG9wKCkgeworICAgICAgICBzdXBlci5vblN0b3AoKTsKKyAgICAgICAgc2V0VHVyblNjcmVlbk9uKGZhbHNlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9UdXJuU2NyZWVuT25EaXNtaXNzS2V5Z3VhcmRBY3Rpdml0eS5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vVHVyblNjcmVlbk9uRGlzbWlzc0tleWd1YXJkQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjRiOTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vVHVyblNjcmVlbk9uRGlzbWlzc0tleWd1YXJkQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLmFtOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuS2V5Z3VhcmRNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOworCitwdWJsaWMgY2xhc3MgVHVyblNjcmVlbk9uRGlzbWlzc0tleWd1YXJkQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBnZXRXaW5kb3coKS5hZGRGbGFncyhXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX1NIT1dfV0hFTl9MT0NLRUQKKyAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfVFVSTl9TQ1JFRU5fT04pOworICAgICAgICBnZXRTeXN0ZW1TZXJ2aWNlKEtleWd1YXJkTWFuYWdlci5jbGFzcykucmVxdWVzdERpc21pc3NLZXlndWFyZCh0aGlzLAorICAgICAgICAgICAgICAgIG5ldyBLZXlndWFyZERpc21pc3NMb2dnZXJDYWxsYmFjayh0aGlzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vVHVyblNjcmVlbk9uU2hvd09uTG9ja0FjdGl2aXR5LmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9UdXJuU2NyZWVuT25TaG93T25Mb2NrQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2M2YzA4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vVHVyblNjcmVlbk9uU2hvd09uTG9ja0FjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbTsKKworcHVibGljIGNsYXNzIFR1cm5TY3JlZW5PblNob3dPbkxvY2tBY3Rpdml0eSBleHRlbmRzIEFic3RyYWN0TGlmZWN5Y2xlTG9nQWN0aXZpdHkgeworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vVHVyblNjcmVlbk9uU2luZ2xlVGFza0FjdGl2aXR5LmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9UdXJuU2NyZWVuT25TaW5nbGVUYXNrQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzQwZjZjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vVHVyblNjcmVlbk9uU2luZ2xlVGFza0FjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbTsKKworcHVibGljIGNsYXNzIFR1cm5TY3JlZW5PblNpbmdsZVRhc2tBY3Rpdml0eSBleHRlbmRzIEFic3RyYWN0TGlmZWN5Y2xlTG9nQWN0aXZpdHkgeworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vVHVyblNjcmVlbk9uV2l0aFJlbGF5b3V0QWN0aXZpdHkuamF2YSBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1R1cm5TY3JlZW5PbldpdGhSZWxheW91dEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA5NmUxZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1R1cm5TY3JlZW5PbldpdGhSZWxheW91dEFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOworCitwdWJsaWMgY2xhc3MgVHVyblNjcmVlbk9uV2l0aFJlbGF5b3V0QWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblN0YXJ0KCkgeworICAgICAgICBzdXBlci5vblN0YXJ0KCk7CisgICAgICAgIGdldFdpbmRvdygpLmFkZEZsYWdzKFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfU0hPV19XSEVOX0xPQ0tFRAorICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19UVVJOX1NDUkVFTl9PTik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25TdG9wKCkgeworICAgICAgICBzdXBlci5vblN0b3AoKTsKKworICAgICAgICAvLyBUaGlzIGlzIHRvIGZvcmNlIGEgcmVsYXlvdXQsIHNwZWNpZmljYWxseSB3aXRoIGluc2V0cyBjaGFuZ2VkLiBXaGVuIHRoZSBpbnNldHMgYXJlCisgICAgICAgIC8vIGNoYW5nZWQsIGl0IHdpbGwgdHJpZ2dlciBhIHBlcmZvcm1TaG93IHRoYXQgY291bGQgdHVybiB0aGUgc2NyZWVuIG9uLgorICAgICAgICBnZXRXaW5kb3coKS5hZGRGbGFncyhXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0ZVTExTQ1JFRU4pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1ZpcnR1YWxEaXNwbGF5QWN0aXZpdHkuamF2YSBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1ZpcnR1YWxEaXNwbGF5QWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjFjZGIxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vVmlydHVhbERpc3BsYXlBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMjQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLmFtOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuaGFyZHdhcmUuZGlzcGxheS5EaXNwbGF5TWFuYWdlci5WSVJUVUFMX0RJU1BMQVlfRkxBR19PV05fQ09OVEVOVF9PTkxZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmhhcmR3YXJlLmRpc3BsYXkuRGlzcGxheU1hbmFnZXIuVklSVFVBTF9ESVNQTEFZX0ZMQUdfUFVCTElDOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5BY3Rpdml0eUxhdW5jaGVyLktFWV9ESVNQTEFZX0lEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5BY3Rpdml0eUxhdW5jaGVyLktFWV9MQVVOQ0hfQUNUSVZJVFk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkFjdGl2aXR5TGF1bmNoZXIuS0VZX1RBUkdFVF9DT01QT05FTlQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudE5hbWVVdGlscy5nZXRBY3Rpdml0eU5hbWU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuVmlydHVhbERpc3BsYXlBY3Rpdml0eS5DT01NQU5EX0NSRUFURV9ESVNQTEFZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLlZpcnR1YWxEaXNwbGF5QWN0aXZpdHkuQ09NTUFORF9ERVNUUk9ZX0RJU1BMQVk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuVmlydHVhbERpc3BsYXlBY3Rpdml0eS5DT01NQU5EX1JFU0laRV9ESVNQTEFZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLlZpcnR1YWxEaXNwbGF5QWN0aXZpdHkuS0VZX0NBTl9TSE9XX1dJVEhfSU5TRUNVUkVfS0VZR1VBUkQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuVmlydHVhbERpc3BsYXlBY3Rpdml0eS5LRVlfQ09NTUFORDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5WaXJ0dWFsRGlzcGxheUFjdGl2aXR5LktFWV9DT1VOVDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5WaXJ0dWFsRGlzcGxheUFjdGl2aXR5LktFWV9ERU5TSVRZX0RQSTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5WaXJ0dWFsRGlzcGxheUFjdGl2aXR5LktFWV9MQVVOQ0hfVEFSR0VUX0NPTVBPTkVOVDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5WaXJ0dWFsRGlzcGxheUFjdGl2aXR5LktFWV9QVUJMSUNfRElTUExBWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5WaXJ0dWFsRGlzcGxheUFjdGl2aXR5LktFWV9SRVNJWkVfRElTUExBWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5WaXJ0dWFsRGlzcGxheUFjdGl2aXR5LlZJUlRVQUxfRElTUExBWV9QUkVGSVg7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuZGlzcGxheS5EaXNwbGF5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmRpc3BsYXkuVmlydHVhbERpc3BsYXk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZVZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCisvKioKKyAqIEFjdGl2aXR5IHRoYXQgaXMgYWJsZSB0byBjcmVhdGUgYW5kIGRlc3Ryb3kgYSB2aXJ0dWFsIGRpc3BsYXkuCisgKi8KK3B1YmxpYyBjbGFzcyBWaXJ0dWFsRGlzcGxheUFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgaW1wbGVtZW50cyBTdXJmYWNlSG9sZGVyLkNhbGxiYWNrIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gVmlydHVhbERpc3BsYXlBY3Rpdml0eS5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9ERU5TSVRZX0RQSSA9IDE2MDsKKworICAgIC8vIENvbnRhaW5lciBmb3IgZGV0YWlscyBhYm91dCBhIHBlbmRpbmcgdmlydHVhbCBkaXNwbGF5IGNyZWF0aW9uIHJlcXVlc3QuCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVmlydHVhbERpc3BsYXlSZXF1ZXN0IHsKKyAgICAgICAgZmluYWwgU3VyZmFjZVZpZXcgc3VyZmFjZVZpZXc7CisgICAgICAgIGZpbmFsIEJ1bmRsZSBleHRyYXM7CisKKyAgICAgICAgVmlydHVhbERpc3BsYXlSZXF1ZXN0KFN1cmZhY2VWaWV3IHN1cmZhY2VWaWV3LCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgICAgICB0aGlzLnN1cmZhY2VWaWV3ID0gc3VyZmFjZVZpZXc7CisgICAgICAgICAgICB0aGlzLmV4dHJhcyA9IGV4dHJhczsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIENvbnRhaW5lciB0byBob2xkIGFzc29jaWF0aW9uIGJldHdlZW4gYW4gYWN0aXZlIHZpcnR1YWwgZGlzcGxheSBhbmQgc3VyZmFjZSB2aWV3LgorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFZpcnR1YWxEaXNwbGF5RW50cnkgeworICAgICAgICBmaW5hbCBWaXJ0dWFsRGlzcGxheSBkaXNwbGF5OworICAgICAgICBmaW5hbCBTdXJmYWNlVmlldyBzdXJmYWNlVmlldzsKKyAgICAgICAgZmluYWwgYm9vbGVhbiByZXNpemVEaXNwbGF5OworICAgICAgICBmaW5hbCBpbnQgZGVuc2l0eTsKKworICAgICAgICBWaXJ0dWFsRGlzcGxheUVudHJ5KFZpcnR1YWxEaXNwbGF5IGRpc3BsYXksIFN1cmZhY2VWaWV3IHN1cmZhY2VWaWV3LCBpbnQgZGVuc2l0eSwKKyAgICAgICAgICAgICAgICBib29sZWFuIHJlc2l6ZURpc3BsYXkpIHsKKyAgICAgICAgICAgIHRoaXMuZGlzcGxheSA9IGRpc3BsYXk7CisgICAgICAgICAgICB0aGlzLnN1cmZhY2VWaWV3ID0gc3VyZmFjZVZpZXc7CisgICAgICAgICAgICB0aGlzLmRlbnNpdHkgPSBkZW5zaXR5OworICAgICAgICAgICAgdGhpcy5yZXNpemVEaXNwbGF5ID0gcmVzaXplRGlzcGxheTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxTdXJmYWNlLCBWaXJ0dWFsRGlzcGxheVJlcXVlc3Q+IG1QZW5kaW5nRGlzcGxheVJlcXVlc3RzID0gbmV3IEhhc2hNYXA8PigpOworICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxTdXJmYWNlLCBWaXJ0dWFsRGlzcGxheUVudHJ5PiBtVmlydHVhbERpc3BsYXlzID0gbmV3IEhhc2hNYXA8PigpOworICAgIHByaXZhdGUgRGlzcGxheU1hbmFnZXIgbURpc3BsYXlNYW5hZ2VyOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC52aXJ0dWFsX2Rpc3BsYXlfbGF5b3V0KTsKKworICAgICAgICBtRGlzcGxheU1hbmFnZXIgPSAoRGlzcGxheU1hbmFnZXIpIGdldFN5c3RlbVNlcnZpY2UoRElTUExBWV9TRVJWSUNFKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbk5ld0ludGVudChJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIHN1cGVyLm9uTmV3SW50ZW50KGludGVudCk7CisgICAgICAgIGZpbmFsIEJ1bmRsZSBleHRyYXMgPSBpbnRlbnQuZ2V0RXh0cmFzKCk7CisgICAgICAgIGlmIChleHRyYXMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGNvbW1hbmQgPSBleHRyYXMuZ2V0U3RyaW5nKEtFWV9DT01NQU5EKTsKKyAgICAgICAgc3dpdGNoIChjb21tYW5kKSB7CisgICAgICAgICAgICBjYXNlIENPTU1BTkRfQ1JFQVRFX0RJU1BMQVk6CisgICAgICAgICAgICAgICAgY3JlYXRlVmlydHVhbERpc3BsYXkoZXh0cmFzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ09NTUFORF9ERVNUUk9ZX0RJU1BMQVk6CisgICAgICAgICAgICAgICAgZGVzdHJveVZpcnR1YWxEaXNwbGF5cygpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDT01NQU5EX1JFU0laRV9ESVNQTEFZOgorICAgICAgICAgICAgICAgIHJlc2l6ZURpc3BsYXkoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uRGVzdHJveSgpIHsKKyAgICAgICAgc3VwZXIub25EZXN0cm95KCk7CisgICAgICAgIGRlc3Ryb3lWaXJ0dWFsRGlzcGxheXMoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlVmlydHVhbERpc3BsYXkoQnVuZGxlIGV4dHJhcykgeworICAgICAgICBmaW5hbCBpbnQgcmVxdWVzdGVkQ291bnQgPSBleHRyYXMuZ2V0SW50KEtFWV9DT1VOVCwgMSk7CisgICAgICAgIExvZy5kKFRBRywgImNyZWF0ZVZpcnR1YWxEaXNwbGF5cy4gcmVxdWVzdGVkIGNvdW50OiIgKyByZXF1ZXN0ZWRDb3VudCk7CisKKyAgICAgICAgZm9yIChpbnQgZGlzcGxheUNvdW50ID0gMDsgZGlzcGxheUNvdW50IDwgcmVxdWVzdGVkQ291bnQ7ICsrZGlzcGxheUNvdW50KSB7CisgICAgICAgICAgICBmaW5hbCBWaWV3R3JvdXAgcm9vdCA9IGZpbmRWaWV3QnlJZChhbmRyb2lkLlIuaWQuY29udGVudCk7CisgICAgICAgICAgICBmaW5hbCBTdXJmYWNlVmlldyBzdXJmYWNlVmlldyA9IG5ldyBTdXJmYWNlVmlldyh0aGlzKTsKKyAgICAgICAgICAgIHN1cmZhY2VWaWV3LnNldExheW91dFBhcmFtcyhuZXcgVmlld0dyb3VwLkxheW91dFBhcmFtcygKKyAgICAgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSk7CisgICAgICAgICAgICBzdXJmYWNlVmlldy5nZXRIb2xkZXIoKS5hZGRDYWxsYmFjayh0aGlzKTsKKyAgICAgICAgICAgIG1QZW5kaW5nRGlzcGxheVJlcXVlc3RzLnB1dChzdXJmYWNlVmlldy5nZXRIb2xkZXIoKS5nZXRTdXJmYWNlKCksCisgICAgICAgICAgICAgICAgICAgIG5ldyBWaXJ0dWFsRGlzcGxheVJlcXVlc3Qoc3VyZmFjZVZpZXcsIGV4dHJhcykpOworICAgICAgICAgICAgcm9vdC5hZGRWaWV3KHN1cmZhY2VWaWV3KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkZXN0cm95VmlydHVhbERpc3BsYXlzKCkgeworICAgICAgICBMb2cuZChUQUcsICJkZXN0cm95VmlydHVhbERpc3BsYXlzIik7CisgICAgICAgIGZpbmFsIFZpZXdHcm91cCByb290ID0gZmluZFZpZXdCeUlkKGFuZHJvaWQuUi5pZC5jb250ZW50KTsKKworICAgICAgICBmb3IgKFZpcnR1YWxEaXNwbGF5RW50cnkgZW50cnkgOiBtVmlydHVhbERpc3BsYXlzLnZhbHVlcygpKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJkZXN0cm95aW5nOiIgKyBlbnRyeS5kaXNwbGF5KTsKKyAgICAgICAgICAgIGVudHJ5LmRpc3BsYXkucmVsZWFzZSgpOworICAgICAgICAgICAgcm9vdC5yZW1vdmVWaWV3KGVudHJ5LnN1cmZhY2VWaWV3KTsKKyAgICAgICAgfQorCisgICAgICAgIG1QZW5kaW5nRGlzcGxheVJlcXVlc3RzLmNsZWFyKCk7CisgICAgICAgIG1WaXJ0dWFsRGlzcGxheXMuY2xlYXIoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzdXJmYWNlQ3JlYXRlZChTdXJmYWNlSG9sZGVyIHN1cmZhY2VIb2xkZXIpIHsKKyAgICAgICAgZmluYWwgVmlydHVhbERpc3BsYXlSZXF1ZXN0IGVudHJ5ID0KKyAgICAgICAgICAgICAgICBtUGVuZGluZ0Rpc3BsYXlSZXF1ZXN0cy5yZW1vdmUoc3VyZmFjZUhvbGRlci5nZXRTdXJmYWNlKCkpOworCisgICAgICAgIGlmIChlbnRyeSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBpbnQgZGVuc2l0eURwaSA9IGVudHJ5LmV4dHJhcy5nZXRJbnQoS0VZX0RFTlNJVFlfRFBJLCBERUZBVUxUX0RFTlNJVFlfRFBJKTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiByZXNpemVEaXNwbGF5ID0gZW50cnkuZXh0cmFzLmdldEJvb2xlYW4oS0VZX1JFU0laRV9ESVNQTEFZKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGxhdW5jaENvbXBvbmVudE5hbWUgPSBlbnRyeS5leHRyYXMuZ2V0U3RyaW5nKEtFWV9MQVVOQ0hfVEFSR0VUX0NPTVBPTkVOVCk7CisgICAgICAgIGZpbmFsIFN1cmZhY2Ugc3VyZmFjZSA9IHN1cmZhY2VIb2xkZXIuZ2V0U3VyZmFjZSgpOworCisgICAgICAgIC8vIEluaXRpYWxseSwgdGhlIHN1cmZhY2Ugd2lsbCBub3QgaGF2ZSBhIHNldCB3aWR0aCBvciBoZWlnaHQgc28gcmVseSBvbiB0aGUgcGFyZW50LgorICAgICAgICAvLyBUaGlzIHNob3VsZCBiZSBhY2N1cmF0ZSB3aXRoIG1hdGNoIHBhcmVudCBvbiBib3RoIHBhcmFtcy4KKyAgICAgICAgZmluYWwgaW50IHdpZHRoID0gc3VyZmFjZUhvbGRlci5nZXRTdXJmYWNlRnJhbWUoKS53aWR0aCgpOworICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gc3VyZmFjZUhvbGRlci5nZXRTdXJmYWNlRnJhbWUoKS5oZWlnaHQoKTsKKworICAgICAgICBpbnQgZmxhZ3MgPSAwOworCisgICAgICAgIGZpbmFsIGJvb2xlYW4gY2FuU2hvd1dpdGhJbnNlY3VyZUtleWd1YXJkCisgICAgICAgICAgICAgICAgPSBlbnRyeS5leHRyYXMuZ2V0Qm9vbGVhbihLRVlfQ0FOX1NIT1dfV0lUSF9JTlNFQ1VSRV9LRVlHVUFSRCk7CisgICAgICAgIGlmIChjYW5TaG93V2l0aEluc2VjdXJlS2V5Z3VhcmQpIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IDEgPDwgNTsgLy8gVklSVFVBTF9ESVNQTEFZX0ZMQUdfQ0FOX1NIT1dfV0lUSF9JTlNFQ1VSRV9LRVlHVUFSRAorICAgICAgICB9CisKKyAgICAgICAgZmluYWwgYm9vbGVhbiBwdWJsaWNEaXNwbGF5ID0gZW50cnkuZXh0cmFzLmdldEJvb2xlYW4oS0VZX1BVQkxJQ19ESVNQTEFZKTsKKyAgICAgICAgaWYgKHB1YmxpY0Rpc3BsYXkpIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IFZJUlRVQUxfRElTUExBWV9GTEFHX1BVQkxJQyB8IFZJUlRVQUxfRElTUExBWV9GTEFHX09XTl9DT05URU5UX09OTFk7CisgICAgICAgIH0KKworICAgICAgICBMb2cuZChUQUcsICJjcmVhdGVWaXJ0dWFsRGlzcGxheTogIiArIHdpZHRoICsgIngiICsgaGVpZ2h0ICsgIiwgZHBpOiAiCisgICAgICAgICAgICAgICAgKyBkZW5zaXR5RHBpICsgIiwgY2FuU2hvd1dpdGhJbnNlY3VyZUtleWd1YXJkPSIgKyBjYW5TaG93V2l0aEluc2VjdXJlS2V5Z3VhcmQKKyAgICAgICAgICAgICAgICArICIsIHB1YmxpY0Rpc3BsYXk9IiArIHB1YmxpY0Rpc3BsYXkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgVmlydHVhbERpc3BsYXkgdmlydHVhbERpc3BsYXkgPSBtRGlzcGxheU1hbmFnZXIuY3JlYXRlVmlydHVhbERpc3BsYXkoCisgICAgICAgICAgICAgICAgICAgIFZJUlRVQUxfRElTUExBWV9QUkVGSVggKyBtVmlydHVhbERpc3BsYXlzLnNpemUoKSwgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgIGhlaWdodCwgZGVuc2l0eURwaSwgc3VyZmFjZSwgZmxhZ3MpOworICAgICAgICAgICAgbVZpcnR1YWxEaXNwbGF5cy5wdXQoc3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFZpcnR1YWxEaXNwbGF5RW50cnkodmlydHVhbERpc3BsYXksIGVudHJ5LnN1cmZhY2VWaWV3LCBkZW5zaXR5RHBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2l6ZURpc3BsYXkpKTsKKyAgICAgICAgICAgIGlmIChsYXVuY2hDb21wb25lbnROYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBDb21wb25lbnROYW1lIHRhcmdldEFjdGl2aXR5ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvbmVudE5hbWUudW5mbGF0dGVuRnJvbVN0cmluZyhsYXVuY2hDb21wb25lbnROYW1lKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZGlzcGxheUlkID0gdmlydHVhbERpc3BsYXkuZ2V0RGlzcGxheSgpLmdldERpc3BsYXlJZCgpOworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkxhdW5jaCBhY3Rpdml0eSBhZnRlciBkaXNwbGF5IGNyZWF0ZWQ6IGFjdGl2aXR5TmFtZT0iCisgICAgICAgICAgICAgICAgICAgICAgICArIGdldEFjdGl2aXR5TmFtZSh0YXJnZXRBY3Rpdml0eSkgKyAiLCBkaXNwbGF5SWQ9IiArIGRpc3BsYXlJZCk7CisgICAgICAgICAgICAgICAgbGF1bmNoQWN0aXZpdHkodGFyZ2V0QWN0aXZpdHksIGRpc3BsYXlJZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmaW5hbCBWaWV3R3JvdXAgcm9vdCA9IGZpbmRWaWV3QnlJZChhbmRyb2lkLlIuaWQuY29udGVudCk7CisgICAgICAgICAgICAvLyBUaGlzIGlzIGV4cGVjdGVkIHdoZW4gdHJ5aW5nIHRvIGNyZWF0ZSBzaG93LXdoZW4tbG9ja2VkIHB1YmxpYyBkaXNwbGF5LgorICAgICAgICAgICAgcm9vdC5yZW1vdmVWaWV3KGVudHJ5LnN1cmZhY2VWaWV3KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHN1cmZhY2VDaGFuZ2VkKFN1cmZhY2VIb2xkZXIgc3VyZmFjZUhvbGRlciwgaW50IGZvcm1hdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgIGZpbmFsIFZpcnR1YWxEaXNwbGF5RW50cnkgZW50cnkgPSBtVmlydHVhbERpc3BsYXlzLmdldChzdXJmYWNlSG9sZGVyLmdldFN1cmZhY2UoKSk7CisKKyAgICAgICAgaWYgKGVudHJ5ICE9IG51bGwgJiYgZW50cnkucmVzaXplRGlzcGxheSkgeworICAgICAgICAgICAgZW50cnkuZGlzcGxheS5yZXNpemUod2lkdGgsIGhlaWdodCwgZW50cnkuZGVuc2l0eSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzdXJmYWNlRGVzdHJveWVkKFN1cmZhY2VIb2xkZXIgc3VyZmFjZUhvbGRlcikgeworICAgIH0KKworICAgIC8qKiBSZXNpemUgdmlydHVhbCBkaXNwbGF5IHRvIGhhbGYgb2YgdGhlIHN1cmZhY2UgZnJhbWUgc2l6ZS4gKi8KKyAgICBwcml2YXRlIHZvaWQgcmVzaXplRGlzcGxheSgpIHsKKyAgICAgICAgZmluYWwgVmlydHVhbERpc3BsYXlFbnRyeSB2ZCA9IChWaXJ0dWFsRGlzcGxheUVudHJ5KSBtVmlydHVhbERpc3BsYXlzLnZhbHVlcygpLnRvQXJyYXkoKVswXTsKKyAgICAgICAgZmluYWwgU3VyZmFjZUhvbGRlciBzdXJmYWNlSG9sZGVyID0gdmQuc3VyZmFjZVZpZXcuZ2V0SG9sZGVyKCk7CisgICAgICAgIHZkLmRpc3BsYXkucmVzaXplKHN1cmZhY2VIb2xkZXIuZ2V0U3VyZmFjZUZyYW1lKCkud2lkdGgoKSAvIDIsCisgICAgICAgICAgICAgICAgc3VyZmFjZUhvbGRlci5nZXRTdXJmYWNlRnJhbWUoKS5oZWlnaHQoKSAvIDIsIHZkLmRlbnNpdHkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBsYXVuY2hBY3Rpdml0eShDb21wb25lbnROYW1lIGFjdGl2aXR5TmFtZSwgaW50IGRpc3BsYXlJZCkgeworICAgICAgICBmaW5hbCBCdW5kbGUgZXh0cmFzID0gbmV3IEJ1bmRsZSgpOworICAgICAgICBleHRyYXMucHV0Qm9vbGVhbihLRVlfTEFVTkNIX0FDVElWSVRZLCB0cnVlKTsKKyAgICAgICAgZXh0cmFzLnB1dFN0cmluZyhLRVlfVEFSR0VUX0NPTVBPTkVOVCwgZ2V0QWN0aXZpdHlOYW1lKGFjdGl2aXR5TmFtZSkpOworICAgICAgICBleHRyYXMucHV0SW50KEtFWV9ESVNQTEFZX0lELCBkaXNwbGF5SWQpOworICAgICAgICBBY3Rpdml0eUxhdW5jaGVyLmxhdW5jaEFjdGl2aXR5RnJvbUV4dHJhcyh0aGlzLCBleHRyYXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1ZyVGVzdEFjdGl2aXR5LmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9WclRlc3RBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNjNhYTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9WclRlc3RBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW07CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy52ZXJpZmllci52ci5Nb2NrVnJMaXN0ZW5lclNlcnZpY2U7CisKKy8qKgorICogQWN0aXZpdHkgdGhhdCBpcyBhYmxlIHRvIGNyZWF0ZSBhbmQgZGVzdHJveSBhIHZpcnR1YWwgZGlzcGxheS4KKyAqLworcHVibGljIGNsYXNzIFZyVGVzdEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiVnJUZXN0QWN0aXZpdHkiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cuaShUQUcsICJvbkNyZWF0ZSBjYWxsZWQuIik7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZXRWck1vZGVFbmFibGVkKHRydWUsIG5ldyBDb21wb25lbnROYW1lKHRoaXMsIE1vY2tWckxpc3RlbmVyU2VydmljZS5jbGFzcykpOworICAgICAgICB9IGNhdGNoIChQYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ291bGQgbm90IHNldCBWUiBtb2RlOiAiICsgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cuaShUQUcsICJvblJlc3VtZSBjYWxsZWQuIik7CisgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25XaW5kb3dGb2N1c0NoYW5nZWQoYm9vbGVhbiBoYXNGb2N1cykgeworICAgICAgICBpZiAoREVCVUcpIExvZy5pKFRBRywgIm9uV2luZG93Rm9jdXNDaGFuZ2VkIGNhbGxlZCB3aXRoICIgKyBoYXNGb2N1cyk7CisgICAgICAgIHN1cGVyLm9uV2luZG93Rm9jdXNDaGFuZ2VkKGhhc0ZvY3VzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblBhdXNlKCkgeworICAgICAgICBpZiAoREVCVUcpIExvZy5pKFRBRywgIm9uUGF1c2UgY2FsbGVkLiIpOworICAgICAgICBzdXBlci5vblBhdXNlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vV2FsbHBhcGVyQWN0aXZpdHkuamF2YSBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1dhbGxwYXBlckFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJiZTFiMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1dhbGxwYXBlckFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworCitwdWJsaWMgY2xhc3MgV2FsbHBhcGVyQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwMjcvQW5kcm9pZC5tayBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHAyNy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YjM1MDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwMjcvQW5kcm9pZC5tawpAQCAtMCwwICsxLDM2IEBACisjIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKKyMgRG9uJ3QgaW5jbHVkZSB0aGlzIHBhY2thZ2UgaW4gYW55IHRhcmdldC4KK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCisKK0xPQ0FMX1VTRV9BQVBUMiA6PSB0cnVlCisKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCisgICAgY3RzLWFtLWFwcC1iYXNlCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKKworTE9DQUxfU0RLX1ZFUlNJT04gOj0gMjcKKworIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0RldmljZVNlcnZpY2VzVGVzdEFwcDI3CisKK2luY2x1ZGUgJChCVUlMRF9DVFNfU1VQUE9SVF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcDI3L0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwMjcvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zZWQzNzhlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcDI3L0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAgfiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICB+CisgIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICB+CisgIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgfgorICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJhbmRyb2lkLnNlcnZlci5hbS5hcHAyNyI+CisKKyAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpsYWJlbD0iQXBwMjciPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnNlcnZlci5hbS5MYXVuY2hpbmdBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cmVzaXplYWJsZUFjdGl2aXR5PSJ0cnVlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzdXBwb3J0c1BpY3R1cmVJblBpY3R1cmU9InRydWUiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIgorICAgICAgICAvPgorICAgIDwvYXBwbGljYXRpb24+Cis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcDI3L3NyYy9hbmRyb2lkL3NlcnZlci9hbS9hcHAyNy9Db21wb25lbnRzLmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwMjcvc3JjL2FuZHJvaWQvc2VydmVyL2FtL2FwcDI3L0NvbXBvbmVudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzUwY2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcDI3L3NyYy9hbmRyb2lkL3NlcnZlci9hbS9hcHAyNy9Db21wb25lbnRzLmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW0uYXBwMjc7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLnNlcnZlci5hbS5jb21wb25lbnQuQ29tcG9uZW50c0Jhc2U7CisKK3B1YmxpYyBjbGFzcyBDb21wb25lbnRzIGV4dGVuZHMgQ29tcG9uZW50c0Jhc2UgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wb25lbnROYW1lIFNES18yN19MQVVOQ0hJTkdfQUNUSVZJVFkgPQorICAgICAgICAgICAgY29tcG9uZW50KENvbXBvbmVudHMuY2xhc3MsICJhbmRyb2lkLnNlcnZlci5hbS5MYXVuY2hpbmdBY3Rpdml0eSIpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcERlYnVnZ2FibGUvQW5kcm9pZC5tayBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHBEZWJ1Z2dhYmxlL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q4YmIxYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHBEZWJ1Z2dhYmxlL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCisjIGRvbid0IGluY2x1ZGUgdGhpcyBwYWNrYWdlIGluIGFueSB0YXJnZXQKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjdHMtYW0tYXBwLWJhc2UKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQorCitMT0NBTF9TREtfVkVSU0lPTiA6PSB0ZXN0X2N1cnJlbnQKKworIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0RldmljZURlYnVnZ2FibGVBcHAKKworaW5jbHVkZSAkKEJVSUxEX0NUU19TVVBQT1JUX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwRGVidWdnYWJsZS9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcERlYnVnZ2FibGUvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGEyNDUyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcERlYnVnZ2FibGUvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDMxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICAgICBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICAgIHBhY2thZ2U9ImFuZHJvaWQuc2VydmVyLmFtLmRlYnVnZ2FibGUiPgorCisgICAgPCEtLQorICAgICAqIFNlY3VyaXR5IHBvbGljeSByZXF1aXJlcyB0aGF0IG9ubHkgZGVidWdnYWJsZSBwcm9jZXNzZXMgY2FuIGJlIHByb2ZpbGVkCisgICAgICogd2hpY2ggaXMgdGVzdGVkIGJ5IEFjdGl2aXR5TWFuYWdlckFtUHJvZmlsZVRlc3RzLgorICAgICAtLT4KKyAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpkZWJ1Z2dhYmxlPSJ0cnVlIj4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLkRlYnVnZ2FibGVBcHBBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cmVzaXplYWJsZUFjdGl2aXR5PSJ0cnVlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIgLz4KKyAgICA8L2FwcGxpY2F0aW9uPgorCis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcERlYnVnZ2FibGUvc3JjL2FuZHJvaWQvc2VydmVyL2FtL2RlYnVnZ2FibGUvQ29tcG9uZW50cy5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcERlYnVnZ2FibGUvc3JjL2FuZHJvaWQvc2VydmVyL2FtL2RlYnVnZ2FibGUvQ29tcG9uZW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMzJkZTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwRGVidWdnYWJsZS9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vZGVidWdnYWJsZS9Db21wb25lbnRzLmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW0uZGVidWdnYWJsZTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuc2VydmVyLmFtLmNvbXBvbmVudC5Db21wb25lbnRzQmFzZTsKKworcHVibGljIGNsYXNzIENvbXBvbmVudHMgZXh0ZW5kcyBDb21wb25lbnRzQmFzZSB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBvbmVudE5hbWUgREVCVUdHQUJMRV9BUFBfQUNUSVZJVFkgPQorICAgICAgICAgICAgY29tcG9uZW50KENvbXBvbmVudHMuY2xhc3MsICJEZWJ1Z2dhYmxlQXBwQWN0aXZpdHkiKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHBEZWJ1Z2dhYmxlL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9kZWJ1Z2dhYmxlL0RlYnVnZ2FibGVBcHBBY3Rpdml0eS5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcERlYnVnZ2FibGUvc3JjL2FuZHJvaWQvc2VydmVyL2FtL2RlYnVnZ2FibGUvRGVidWdnYWJsZUFwcEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMwMzRiMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHBEZWJ1Z2dhYmxlL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9kZWJ1Z2dhYmxlL0RlYnVnZ2FibGVBcHBBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW0uZGVidWdnYWJsZTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworCitwdWJsaWMgY2xhc3MgRGVidWdnYWJsZUFwcEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcERlcHJlY2F0ZWRTZGsvQW5kcm9pZC5tayBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHBEZXByZWNhdGVkU2RrL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI1NTZmNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHBEZXByZWNhdGVkU2RrL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCisjIGRvbid0IGluY2x1ZGUgdGhpcyBwYWNrYWdlIGluIGFueSB0YXJnZXQKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjdHMtYW0tYXBwLWJhc2UKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQorCitMT0NBTF9TREtfVkVSU0lPTiA6PSAxNgorCisjIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0CitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzRGV2aWNlRGVwcmVjYXRlZFNka0FwcAorCitpbmNsdWRlICQoQlVJTERfQ1RTX1NVUFBPUlRfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHBEZXByZWNhdGVkU2RrL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwRGVwcmVjYXRlZFNkay9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5ODQ3YjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwRGVwcmVjYXRlZFNkay9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgICAgIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gVGFyZ2V0IHNkayB2ZXJzaW9uIHNldCA8IDE3LiAtLT4KKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgICAgcGFja2FnZT0iYW5kcm9pZC5zZXJ2ZXIuYW0uZGVwcmVjYXRlZHNkayI+CisKKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkRJU0FCTEVfS0VZR1VBUkQiIC8+CisKKyAgICA8YXBwbGljYXRpb24+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5NYWluQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIi8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgPC9hcHBsaWNhdGlvbj4KKworPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHBEZXByZWNhdGVkU2RrL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9kZXByZWNhdGVkc2RrL0NvbXBvbmVudHMuamF2YSBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHBEZXByZWNhdGVkU2RrL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9kZXByZWNhdGVkc2RrL0NvbXBvbmVudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODA3MzhkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcERlcHJlY2F0ZWRTZGsvc3JjL2FuZHJvaWQvc2VydmVyL2FtL2RlcHJlY2F0ZWRzZGsvQ29tcG9uZW50cy5qYXZhCkBAIC0wLDAgKzEsOSBAQAorcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbS5kZXByZWNhdGVkc2RrOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5zZXJ2ZXIuYW0uY29tcG9uZW50LkNvbXBvbmVudHNCYXNlOworCitwdWJsaWMgY2xhc3MgQ29tcG9uZW50cyBleHRlbmRzIENvbXBvbmVudHNCYXNlIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcG9uZW50TmFtZSBNQUlOX0FDVElWSVRZID0gY29tcG9uZW50KENvbXBvbmVudHMuY2xhc3MsICJNYWluQWN0aXZpdHkiKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHBEZXByZWNhdGVkU2RrL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9kZXByZWNhdGVkc2RrL01haW5BY3Rpdml0eS5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcERlcHJlY2F0ZWRTZGsvc3JjL2FuZHJvaWQvc2VydmVyL2FtL2RlcHJlY2F0ZWRzZGsvTWFpbkFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdiNGU0NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHBEZXByZWNhdGVkU2RrL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9kZXByZWNhdGVkc2RrL01haW5BY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLmFtLmRlcHJlY2F0ZWRzZGs7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKKworcHVibGljIGNsYXNzIE1haW5BY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcERpc3BsYXlTaXplL0FuZHJvaWQubWsgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwRGlzcGxheVNpemUvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDQ0MTM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcERpc3BsYXlTaXplL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCisjIGRvbid0IGluY2x1ZGUgdGhpcyBwYWNrYWdlIGluIGFueSB0YXJnZXQKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjdHMtYW0tYXBwLWJhc2UKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQorCitMT0NBTF9TREtfVkVSU0lPTiA6PSB0ZXN0X2N1cnJlbnQKKworIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0RldmljZURpc3BsYXlTaXplQXBwCisKK2luY2x1ZGUgJChCVUlMRF9DVFNfU1VQUE9SVF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcERpc3BsYXlTaXplL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwRGlzcGxheVNpemUvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2JlZjMxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcERpc3BsYXlTaXplL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwzMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAgICAgQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgICBwYWNrYWdlPSJhbmRyb2lkLnNlcnZlci5hbS5kaXNwbGF5c2l6ZSI+CisKKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkRJU0FCTEVfS0VZR1VBUkQiIC8+CisKKyAgICA8IS0tIFNldCBhIHJpZGljdWxvdXNseSBoaWdoIHZhbHVlIGZvciByZXF1aXJlZCBzbWFsbGVzdCB3aWR0aC4gSG9wZWZ1bGx5CisgICAgICAgICB3ZSBuZXZlciBoYXZlIHRvIHJ1biBDVFMgb24gVGltZXMgU3F1YXJlIGRpc3BsYXkuIC0tPgorICAgIDxzdXBwb3J0cy1zY3JlZW5zIGFuZHJvaWQ6cmVxdWlyZXNTbWFsbGVzdFdpZHRoRHA9IjEwMDAwMCIgLz4KKworICAgIDxhcHBsaWNhdGlvbj4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLlNtYWxsZXN0V2lkdGhBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiIC8+CisgICAgPC9hcHBsaWNhdGlvbj4KKworPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHBEaXNwbGF5U2l6ZS9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vZGlzcGxheXNpemUvQ29tcG9uZW50cy5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcERpc3BsYXlTaXplL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9kaXNwbGF5c2l6ZS9Db21wb25lbnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI2MzNlZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHBEaXNwbGF5U2l6ZS9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vZGlzcGxheXNpemUvQ29tcG9uZW50cy5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLmFtLmRpc3BsYXlzaXplOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5zZXJ2ZXIuYW0uY29tcG9uZW50LkNvbXBvbmVudHNCYXNlOworCitwdWJsaWMgY2xhc3MgQ29tcG9uZW50cyBleHRlbmRzIENvbXBvbmVudHNCYXNlIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcG9uZW50TmFtZSBTTUFMTEVTVF9XSURUSF9BQ1RJVklUWSA9CisgICAgICAgICAgICBjb21wb25lbnQoQ29tcG9uZW50cy5jbGFzcywgIlNtYWxsZXN0V2lkdGhBY3Rpdml0eSIpOworCisgICAgLyoqCisgICAgICogRXh0cmEga2V5IHRvIGxhdW5jaCBhbm90aGVyIGFjdGl2aXR5LiBUaGUgZXh0cmEgdmFsdWUgaXMgYWN0aXZpdHkncyBjb21wb25lbnQgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNtYWxsZXN0V2lkdGhBY3Rpdml0eSB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0xBVU5DSF9BTk9USEVSX0FDVElWSVRZID0gImxhdW5jaF9hbm90aGVyX2FjdGl2aXR5IjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwRGlzcGxheVNpemUvc3JjL2FuZHJvaWQvc2VydmVyL2FtL2Rpc3BsYXlzaXplL1NtYWxsZXN0V2lkdGhBY3Rpdml0eS5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcERpc3BsYXlTaXplL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9kaXNwbGF5c2l6ZS9TbWFsbGVzdFdpZHRoQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzMwYjg1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcERpc3BsYXlTaXplL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9kaXNwbGF5c2l6ZS9TbWFsbGVzdFdpZHRoQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbS5kaXNwbGF5c2l6ZTsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5kaXNwbGF5c2l6ZS5Db21wb25lbnRzLlNtYWxsZXN0V2lkdGhBY3Rpdml0eQorICAgICAgICAuRVhUUkFfTEFVTkNIX0FOT1RIRVJfQUNUSVZJVFk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworCitwdWJsaWMgY2xhc3MgU21hbGxlc3RXaWR0aEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25OZXdJbnRlbnQoZmluYWwgSW50ZW50IGludGVudCkgeworICAgICAgICBzdXBlci5vbk5ld0ludGVudChpbnRlbnQpOworCisgICAgICAgIGlmIChpbnRlbnQuaGFzRXh0cmEoRVhUUkFfTEFVTkNIX0FOT1RIRVJfQUNUSVZJVFkpKSB7CisgICAgICAgICAgICBzdGFydEFjdGl2aXR5KG5ldyBJbnRlbnQoKS5zZXRDb21wb25lbnQoQ29tcG9uZW50TmFtZS51bmZsYXR0ZW5Gcm9tU3RyaW5nKAorICAgICAgICAgICAgICAgICAgICBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoRVhUUkFfTEFVTkNIX0FOT1RIRVJfQUNUSVZJVFkpKSkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcFByZXJlbGVhc2VTZGsvQW5kcm9pZC5tayBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHBQcmVyZWxlYXNlU2RrL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFmOTA5NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHBQcmVyZWxlYXNlU2RrL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzOCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9VU0VfQUFQVDIgOj0gdHJ1ZQorCisjIGRvbid0IGluY2x1ZGUgdGhpcyBwYWNrYWdlIGluIGFueSB0YXJnZXQKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGNvcmVfY3VycmVudAorCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCisKK0xPQ0FMX0FQS19MSUJSQVJJRVMgOj0gZmFrZS1mcmFtZXdvcmsKK0xPQ0FMX1JFU19MSUJSQVJJRVMgOj0gZmFrZS1mcmFtZXdvcmsKKworIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0RldmljZVByZXJlbGVhc2VTZGtBcHAKKworaW5jbHVkZSAkKEJVSUxEX0NUU19TVVBQT1JUX1BBQ0tBR0UpCisKK2luY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHBQcmVyZWxlYXNlU2RrL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwUHJlcmVsZWFzZVNkay9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZjc1YTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwUHJlcmVsZWFzZVNkay9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgICAgIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iYW5kcm9pZC5zZXJ2ZXIuYW0ucHJlcmVsZWFzZSI+CisKKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkRJU0FCTEVfS0VZR1VBUkQiIC8+CisKKyAgICA8YXBwbGljYXRpb24+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5NYWluQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIi8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgPC9hcHBsaWNhdGlvbj4KKworPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHBQcmVyZWxlYXNlU2RrL2Zha2UtZnJhbWV3b3JrL0FuZHJvaWQubWsgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwUHJlcmVsZWFzZVNkay9mYWtlLWZyYW1ld29yay9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NGNkNDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwUHJlcmVsZWFzZVNkay9mYWtlLWZyYW1ld29yay9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzEgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKKyMgQSBmYWtlIGZyYW1ld29yayB0aGF0IG1pbWljcyBhbiBvbGRlciwgcHJlLXJlbGVhc2UgU0RLIGZvciB0aGUgcHVycG9zZXMgb2YKKyMgdGVzdGluZyB3aGF0IGhhcHBlbnMgd2hlbiBhbiBhcHAgbGlua2VkIGFnYWluc3QgYSBwcmUtcmVsZWFzZSBTREsgaXMgaW5zdGFsbGVkCisjIG9uIHJlbGVhc2UgZGV2aWNlLgorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX1VTRV9BQVBUMiA6PSB0cnVlCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gZmFrZS1mcmFtZXdvcmsKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGNvcmVfY3VycmVudAorTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKK0xPQ0FMX0VYUE9SVF9QQUNLQUdFX1JFU09VUkNFUyA6PSB0cnVlCitMT0NBTF9QUk9HVUFSRF9FTkFCTEVEIDo9IGRpc2FibGVkCitMT0NBTF9VTklOU1RBTExBQkxFX01PRFVMRSA6PSB0cnVlCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHBQcmVyZWxlYXNlU2RrL2Zha2UtZnJhbWV3b3JrL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwUHJlcmVsZWFzZVNkay9mYWtlLWZyYW1ld29yay9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkN2VjM2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwUHJlcmVsZWFzZVNkay9mYWtlLWZyYW1ld29yay9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgICAgIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iYW5kcm9pZCIKKyAgICBhbmRyb2lkOnZlcnNpb25Db2RlPSIyNSIKKyAgICBhbmRyb2lkOnZlcnNpb25OYW1lPSJPIiAvPgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcFByZXJlbGVhc2VTZGsvZmFrZS1mcmFtZXdvcmsvcmVzL3ZhbHVlcy92YWx1ZXMueG1sIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcFByZXJlbGVhc2VTZGsvZmFrZS1mcmFtZXdvcmsvcmVzL3ZhbHVlcy92YWx1ZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0Y2FjZTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwUHJlcmVsZWFzZVNkay9mYWtlLWZyYW1ld29yay9yZXMvdmFsdWVzL3ZhbHVlcy54bWwKQEAgLTAsMCArMSw0NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAgICAgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHJlc291cmNlcz4KKyAgICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InRoZW1lIiBpZD0iMHgwMTAxMDAwMCIgLz4KKyAgICA8YXR0ciBuYW1lPSJ0aGVtZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisKKyAgICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9Im5hbWUiIGlkPSIweDAxMDEwMDAzIiAvPgorICAgIDxhdHRyIG5hbWU9Im5hbWUiIGZvcm1hdD0ic3RyaW5nIiAvPgorCisgICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJleHBvcnRlZCIgaWQ9IjB4MDEwMTAwMTAiIC8+CisgICAgPGF0dHIgbmFtZT0iZXhwb3J0ZWQiIGZvcm1hdD0iYm9vbGVhbiIgLz4KKworICAgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0ibWluU2RrVmVyc2lvbiIgaWQ9IjB4MDEwMTAyMGMiIC8+CisgICAgPGF0dHIgbmFtZT0ibWluU2RrVmVyc2lvbiIgZm9ybWF0PSJpbnRlZ2VyfHN0cmluZyIgLz4KKworICAgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0idmVyc2lvbkNvZGUiIGlkPSIweDAxMDEwMjFiIiAvPgorICAgIDxhdHRyIG5hbWU9InZlcnNpb25Db2RlIiBmb3JtYXQ9ImludGVnZXIiIC8+CisKKyAgICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InZlcnNpb25OYW1lIiBpZD0iMHgwMTAxMDIxYyIgLz4KKyAgICA8YXR0ciBuYW1lPSJ2ZXJzaW9uTmFtZSIgZm9ybWF0PSJzdHJpbmciIC8+CisKKyAgICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InRhcmdldFNka1ZlcnNpb24iIGlkPSIweDAxMDEwMjcwIiAvPgorICAgIDxhdHRyIG5hbWU9InRhcmdldFNka1ZlcnNpb24iIGZvcm1hdD0iaW50ZWdlcnxzdHJpbmciIC8+CisKKyAgICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImNvbXBpbGVTZGtWZXJzaW9uIiBpZD0iMHgwMTAxMDU3MiIgLz4KKyAgICA8YXR0ciBuYW1lPSJjb21waWxlU2RrVmVyc2lvbiIgZm9ybWF0PSJpbnRlZ2VyIiAvPgorCisgICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJjb21waWxlU2RrVmVyc2lvbkNvZGVuYW1lIiBpZD0iMHgwMTAxMDU3MyIgLz4KKyAgICA8YXR0ciBuYW1lPSJjb21waWxlU2RrVmVyc2lvbkNvZGVuYW1lIiBmb3JtYXQ9InN0cmluZyIgLz4KKzwvcmVzb3VyY2VzPgorCmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwUHJlcmVsZWFzZVNkay9mYWtlLWZyYW1ld29yay9zcmMvYW5kcm9pZC9hcHAvQWN0aXZpdHkuamF2YSBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHBQcmVyZWxlYXNlU2RrL2Zha2UtZnJhbWV3b3JrL3NyYy9hbmRyb2lkL2FwcC9BY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2MDM5MmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwUHJlcmVsZWFzZVNkay9mYWtlLWZyYW1ld29yay9zcmMvYW5kcm9pZC9hcHAvQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFwcDsKKworcHVibGljIGNsYXNzIEFjdGl2aXR5IHsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHBQcmVyZWxlYXNlU2RrL2Zha2UtZnJhbWV3b3JrL3NyYy9hbmRyb2lkL2NvbnRlbnQvQ29tcG9uZW50TmFtZS5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcFByZXJlbGVhc2VTZGsvZmFrZS1mcmFtZXdvcmsvc3JjL2FuZHJvaWQvY29udGVudC9Db21wb25lbnROYW1lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI2NTdmZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHBQcmVyZWxlYXNlU2RrL2Zha2UtZnJhbWV3b3JrL3NyYy9hbmRyb2lkL2NvbnRlbnQvQ29tcG9uZW50TmFtZS5qYXZhCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuY29udGVudDsKKworcHVibGljIGNsYXNzIENvbXBvbmVudE5hbWUgeworICAgIHB1YmxpYyBDb21wb25lbnROYW1lKFN0cmluZyBwa2csIFN0cmluZyBjbHMpIHt9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcFByZXJlbGVhc2VTZGsvc3JjL2FuZHJvaWQvc2VydmVyL2FtL3ByZXJlbGVhc2UvQ29tcG9uZW50cy5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcFByZXJlbGVhc2VTZGsvc3JjL2FuZHJvaWQvc2VydmVyL2FtL3ByZXJlbGVhc2UvQ29tcG9uZW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMjRmZjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwUHJlcmVsZWFzZVNkay9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vcHJlcmVsZWFzZS9Db21wb25lbnRzLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW0ucHJlcmVsZWFzZTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworCisvLyBCZWNhdXNlIHdlIGFyZSB1c2luZyBmYWtlLWZyYW1ld29yaywgd2UgY2FuJ3QgZXh0ZW5kIENvbXBvbmVudHNCYXNlIGhlcmUuCitwdWJsaWMgY2xhc3MgQ29tcG9uZW50cyB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRV9OQU1FID0gQ29tcG9uZW50cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wb25lbnROYW1lIE1BSU5fQUNUSVZJVFkgPSBuZXcgQ29tcG9uZW50TmFtZSgKKyAgICAgICAgICAgIFBBQ0tBR0VfTkFNRSwgUEFDS0FHRV9OQU1FICsgIi5NYWluQWN0aXZpdHkiKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHBQcmVyZWxlYXNlU2RrL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9wcmVyZWxlYXNlL01haW5BY3Rpdml0eS5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcFByZXJlbGVhc2VTZGsvc3JjL2FuZHJvaWQvc2VydmVyL2FtL3ByZXJlbGVhc2UvTWFpbkFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY4NGZhZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHBQcmVyZWxlYXNlU2RrL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9wcmVyZWxlYXNlL01haW5BY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLmFtLnByZXJlbGVhc2U7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKKworcHVibGljIGNsYXNzIE1haW5BY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcFNlY29uZFVpZC9BbmRyb2lkLm1rIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcFNlY29uZFVpZC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNzY0NDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwU2Vjb25kVWlkL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCisjIGRvbid0IGluY2x1ZGUgdGhpcyBwYWNrYWdlIGluIGFueSB0YXJnZXQKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjdHMtYW0tYXBwLWJhc2UKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQorCitMT0NBTF9TREtfVkVSU0lPTiA6PSB0ZXN0X2N1cnJlbnQKKworIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0RldmljZVNlcnZpY2VzVGVzdFNlY29uZEFwcAorCitpbmNsdWRlICQoQlVJTERfQ1RTX1NVUFBPUlRfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHBTZWNvbmRVaWQvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHBTZWNvbmRVaWQvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDRlOThkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcFNlY29uZFVpZC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsNDIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgICAgIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgICAgcGFja2FnZT0iYW5kcm9pZC5zZXJ2ZXIuYW0uc2Vjb25kIj4KKworICAgIDxhcHBsaWNhdGlvbj4KKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICBhbmRyb2lkOm5hbWU9Ii5TZWNvbmRBY3Rpdml0eSIKKyAgICAgICAgICAgIGFuZHJvaWQ6cmVzaXplYWJsZUFjdGl2aXR5PSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDphbGxvd0VtYmVkZGVkPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIgLz4KKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICBhbmRyb2lkOm5hbWU9Ii5TZWNvbmRBY3Rpdml0eU5vRW1iZWRkaW5nIgorICAgICAgICAgICAgYW5kcm9pZDpyZXNpemVhYmxlQWN0aXZpdHk9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmFsbG93RW1iZWRkZWQ9ImZhbHNlIgorICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIgLz4KKyAgICAgICAgPHJlY2VpdmVyCisgICAgICAgICAgICBhbmRyb2lkOm5hbWU9Ii5MYXVuY2hCcm9hZGNhc3RSZWNlaXZlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiID4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnNlcnZlci5hbS5zZWNvbmQuTEFVTkNIX0JST0FEQ0FTVF9BQ1RJT04iLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9yZWNlaXZlcj4KKyAgICA8L2FwcGxpY2F0aW9uPgorCis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcFNlY29uZFVpZC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vc2Vjb25kL0NvbXBvbmVudHMuamF2YSBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHBTZWNvbmRVaWQvc3JjL2FuZHJvaWQvc2VydmVyL2FtL3NlY29uZC9Db21wb25lbnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY0YjgzYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHBTZWNvbmRVaWQvc3JjL2FuZHJvaWQvc2VydmVyL2FtL3NlY29uZC9Db21wb25lbnRzLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW0uc2Vjb25kOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5zZXJ2ZXIuYW0uY29tcG9uZW50LkNvbXBvbmVudHNCYXNlOworCitwdWJsaWMgY2xhc3MgQ29tcG9uZW50cyBleHRlbmRzIENvbXBvbmVudHNCYXNlIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcG9uZW50TmFtZSBTRUNPTkRfQUNUSVZJVFkgPSBjb21wb25lbnQoIlNlY29uZEFjdGl2aXR5Iik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wb25lbnROYW1lIFNFQ09ORF9OT19FTUJFRERJTkdfQUNUSVZJVFkgPQorICAgICAgICAgICAgY29tcG9uZW50KCJTZWNvbmRBY3Rpdml0eU5vRW1iZWRkaW5nIik7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBvbmVudE5hbWUgU0VDT05EX0xBVU5DSF9CUk9BRENBU1RfUkVDRUlWRVIgPQorICAgICAgICAgICAgY29tcG9uZW50KCJMYXVuY2hCcm9hZGNhc3RSZWNlaXZlciIpOworICAgIC8qKiBTZWUgQW5kcm9pZE1hbmlmZXN0LnhtbC4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUNPTkRfTEFVTkNIX0JST0FEQ0FTVF9BQ1RJT04gPQorICAgICAgICAgICAgZ2V0UGFja2FnZU5hbWUoKSArICIuTEFVTkNIX0JST0FEQ0FTVF9BQ1RJT04iOworCisgICAgcHJpdmF0ZSBzdGF0aWMgQ29tcG9uZW50TmFtZSBjb21wb25lbnQoU3RyaW5nIGNsYXNzTmFtZSkgeworICAgICAgICByZXR1cm4gY29tcG9uZW50KENvbXBvbmVudHMuY2xhc3MsIGNsYXNzTmFtZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgeworICAgICAgICByZXR1cm4gZ2V0UGFja2FnZU5hbWUoQ29tcG9uZW50cy5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcFNlY29uZFVpZC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vc2Vjb25kL0xhdW5jaEJyb2FkY2FzdFJlY2VpdmVyLmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwU2Vjb25kVWlkL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9zZWNvbmQvTGF1bmNoQnJvYWRjYXN0UmVjZWl2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjk3NWFjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcFNlY29uZFVpZC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vc2Vjb25kL0xhdW5jaEJyb2FkY2FzdFJlY2VpdmVyLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbS5zZWNvbmQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLnNlcnZlci5hbS5BY3Rpdml0eUxhdW5jaGVyOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKy8qKiBCcm9hZGNhc3QgcmVjZWl2ZXIgdGhhdCBjYW4gbGF1bmNoIGFjdGl2aXRpZXMuICovCitwdWJsaWMgY2xhc3MgTGF1bmNoQnJvYWRjYXN0UmVjZWl2ZXIgZXh0ZW5kcyBCcm9hZGNhc3RSZWNlaXZlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IExhdW5jaEJyb2FkY2FzdFJlY2VpdmVyLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEFjdGl2aXR5TGF1bmNoZXIubGF1bmNoQWN0aXZpdHlGcm9tRXh0cmFzKGNvbnRleHQsIGludGVudC5nZXRFeHRyYXMoKSk7CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIlNlY3VyaXR5RXhjZXB0aW9uIGxhdW5jaGluZyBhY3Rpdml0eSIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcFNlY29uZFVpZC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vc2Vjb25kL1NlY29uZEFjdGl2aXR5LmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwU2Vjb25kVWlkL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9zZWNvbmQvU2Vjb25kQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjA3ZWUyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcFNlY29uZFVpZC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vc2Vjb25kL1NlY29uZEFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbS5zZWNvbmQ7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKKworcHVibGljIGNsYXNzIFNlY29uZEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcFNlY29uZFVpZC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vc2Vjb25kL1NlY29uZEFjdGl2aXR5Tm9FbWJlZGRpbmcuamF2YSBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHBTZWNvbmRVaWQvc3JjL2FuZHJvaWQvc2VydmVyL2FtL3NlY29uZC9TZWNvbmRBY3Rpdml0eU5vRW1iZWRkaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNhOTY3YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHBTZWNvbmRVaWQvc3JjL2FuZHJvaWQvc2VydmVyL2FtL3NlY29uZC9TZWNvbmRBY3Rpdml0eU5vRW1iZWRkaW5nLmphdmEKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbS5zZWNvbmQ7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKKworcHVibGljIGNsYXNzIFNlY29uZEFjdGl2aXR5Tm9FbWJlZGRpbmcgZXh0ZW5kcyBBY3Rpdml0eSB7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcFRoaXJkVWlkL0FuZHJvaWQubWsgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwVGhpcmRVaWQvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjhjOGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcFRoaXJkVWlkL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCisjIGRvbid0IGluY2x1ZGUgdGhpcyBwYWNrYWdlIGluIGFueSB0YXJnZXQKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjdHMtYW0tYXBwLWJhc2UKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQorCitMT0NBTF9TREtfVkVSU0lPTiA6PSB0ZXN0X2N1cnJlbnQKKworIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0RldmljZVNlcnZpY2VzVGVzdFRoaXJkQXBwCisKK2luY2x1ZGUgJChCVUlMRF9DVFNfU1VQUE9SVF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcFRoaXJkVWlkL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwVGhpcmRVaWQvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGQ4OWIwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcFRoaXJkVWlkL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAgICAgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgICBwYWNrYWdlPSJhbmRyb2lkLnNlcnZlci5hbS50aGlyZCI+CisKKyAgICA8YXBwbGljYXRpb24+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5UaGlyZEFjdGl2aXR5IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpyZXNpemVhYmxlQWN0aXZpdHk9InRydWUiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmFsbG93RW1iZWRkZWQ9InRydWUiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIiAvPgorICAgIDwvYXBwbGljYXRpb24+CisKKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwVGhpcmRVaWQvc3JjL2FuZHJvaWQvc2VydmVyL2FtL3RoaXJkL0NvbXBvbmVudHMuamF2YSBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHBUaGlyZFVpZC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vdGhpcmQvQ29tcG9uZW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZDJmYmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwVGhpcmRVaWQvc3JjL2FuZHJvaWQvc2VydmVyL2FtL3RoaXJkL0NvbXBvbmVudHMuamF2YQpAQCAtMCwwICsxLDI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbS50aGlyZDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuc2VydmVyLmFtLmNvbXBvbmVudC5Db21wb25lbnRzQmFzZTsKKworcHVibGljIGNsYXNzIENvbXBvbmVudHMgZXh0ZW5kcyBDb21wb25lbnRzQmFzZSB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBvbmVudE5hbWUgVEhJUkRfQUNUSVZJVFkgPSBjb21wb25lbnQoQ29tcG9uZW50cy5jbGFzcywgIlRoaXJkQWN0aXZpdHkiKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHBUaGlyZFVpZC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vdGhpcmQvVGhpcmRBY3Rpdml0eS5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcFRoaXJkVWlkL3NyYy9hbmRyb2lkL3NlcnZlci9hbS90aGlyZC9UaGlyZEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMyN2Q1ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHBUaGlyZFVpZC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vdGhpcmQvVGhpcmRBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW0udGhpcmQ7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKKworcHVibGljIGNsYXNzIFRoaXJkQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwX2Jhc2UvQW5kcm9pZC5tayBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHBfYmFzZS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMjk4M2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwX2Jhc2UvQW5kcm9pZC5tawpAQCAtMCwwICsxLDIxIEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKKyMgRG9uJ3QgaW5jbHVkZSB0aGlzIHBhY2thZ2UgaW4gYW55IHRhcmdldC4KK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCisKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCisgICAgYW5kcm9pZHgudGVzdC5ydWxlcyBcCisgICAgY3RzLWFtd20tdXRpbCBcCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpIFwKKyAgICAkKGNhbGwgYWxsLW5hbWVkLWZpbGVzLXVuZGVyLENvbXBvbmVudHMuamF2YSwgLi4vYXBwKSBcCisgICAgJChjYWxsIGFsbC1uYW1lZC1maWxlcy11bmRlcixDb21wb25lbnRzLmphdmEsIC4uL2FwcDI3KSBcCisKK0xPQ0FMX01PRFVMRSA6PSBjdHMtYW0tYXBwLWJhc2UKKworTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0pBVkFfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHBfYmFzZS9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vQWJzdHJhY3RMaWZlY3ljbGVMb2dBY3Rpdml0eS5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcF9iYXNlL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9BYnN0cmFjdExpZmVjeWNsZUxvZ0FjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNlODAxZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHBfYmFzZS9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vQWJzdHJhY3RMaWZlY3ljbGVMb2dBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMTIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLmFtOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LkRpc3BsYXk7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdExpZmVjeWNsZUxvZ0FjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOworICAgICAgICBMb2cuaShnZXRUYWcoKSwgIm9uQ3JlYXRlIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25TdGFydCgpIHsKKyAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKKyAgICAgICAgTG9nLmkoZ2V0VGFnKCksICJvblN0YXJ0Iik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7CisgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CisgICAgICAgIExvZy5pKGdldFRhZygpLCAib25SZXN1bWUiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKENvbmZpZ3VyYXRpb24gbmV3Q29uZmlnKSB7CisgICAgICAgIHN1cGVyLm9uQ29uZmlndXJhdGlvbkNoYW5nZWQobmV3Q29uZmlnKTsKKyAgICAgICAgTG9nLmkoZ2V0VGFnKCksICJvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25NdWx0aVdpbmRvd01vZGVDaGFuZ2VkKGJvb2xlYW4gaXNJbk11bHRpV2luZG93TW9kZSwgQ29uZmlndXJhdGlvbiBuZXdDb25maWcpIHsKKyAgICAgICAgc3VwZXIub25NdWx0aVdpbmRvd01vZGVDaGFuZ2VkKGlzSW5NdWx0aVdpbmRvd01vZGUsIG5ld0NvbmZpZyk7CisgICAgICAgIExvZy5pKGdldFRhZygpLCAib25NdWx0aVdpbmRvd01vZGVDaGFuZ2VkIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25QaWN0dXJlSW5QaWN0dXJlTW9kZUNoYW5nZWQoYm9vbGVhbiBpc0luUGljdHVyZUluUGljdHVyZU1vZGUsCisgICAgICAgICAgICBDb25maWd1cmF0aW9uIG5ld0NvbmZpZykgeworICAgICAgICBzdXBlci5vblBpY3R1cmVJblBpY3R1cmVNb2RlQ2hhbmdlZChpc0luUGljdHVyZUluUGljdHVyZU1vZGUsIG5ld0NvbmZpZyk7CisgICAgICAgIExvZy5pKGdldFRhZygpLCAib25QaWN0dXJlSW5QaWN0dXJlTW9kZUNoYW5nZWQiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblBhdXNlKCkgeworICAgICAgICBzdXBlci5vblBhdXNlKCk7CisgICAgICAgIExvZy5pKGdldFRhZygpLCAib25QYXVzZSIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uU3RvcCgpIHsKKyAgICAgICAgc3VwZXIub25TdG9wKCk7CisgICAgICAgIExvZy5pKGdldFRhZygpLCAib25TdG9wIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25EZXN0cm95KCkgeworICAgICAgICBzdXBlci5vbkRlc3Ryb3koKTsKKyAgICAgICAgTG9nLmkoZ2V0VGFnKCksICJvbkRlc3Ryb3kiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblVzZXJMZWF2ZUhpbnQoKSB7CisgICAgICAgIHN1cGVyLm9uVXNlckxlYXZlSGludCgpOworICAgICAgICBMb2cuaShnZXRUYWcoKSwgIm9uVXNlckxlYXZlSGludCIpOworICAgIH0KKworICAgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZ2V0VGFnKCkgeworICAgICAgICByZXR1cm4gZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgZHVtcENvbmZpZ3VyYXRpb24oQ29uZmlndXJhdGlvbiBjb25maWcpIHsKKyAgICAgICAgTG9nLmkoZ2V0VGFnKCksICJDb25maWd1cmF0aW9uOiAiICsgY29uZmlnKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBkdW1wRGlzcGxheVNpemUoQ29uZmlndXJhdGlvbiBjb25maWcpIHsKKyAgICAgICAgLy8gRHVtcCB0aGUgZGlzcGxheSBzaXplIGFzIHNlZW4gYnkgdGhpcyBBY3Rpdml0eS4KKyAgICAgICAgZmluYWwgV2luZG93TWFuYWdlciB3bSA9IGdldFN5c3RlbVNlcnZpY2UoV2luZG93TWFuYWdlci5jbGFzcyk7CisgICAgICAgIGZpbmFsIERpc3BsYXkgZGlzcGxheSA9IHdtLmdldERlZmF1bHREaXNwbGF5KCk7CisgICAgICAgIGZpbmFsIFBvaW50IHBvaW50ID0gbmV3IFBvaW50KCk7CisgICAgICAgIGRpc3BsYXkuZ2V0U2l6ZShwb2ludCk7CisgICAgICAgIGZpbmFsIERpc3BsYXlNZXRyaWNzIG1ldHJpY3MgPSBnZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpOworCisgICAgICAgIGZpbmFsIFN0cmluZyBsaW5lID0gImNvbmZpZyIKKyAgICAgICAgICAgICAgICArICIgc2l6ZT0iICsgYnVpbGRDb29yZFN0cmluZyhjb25maWcuc2NyZWVuV2lkdGhEcCwgY29uZmlnLnNjcmVlbkhlaWdodERwKQorICAgICAgICAgICAgICAgICsgIiBkaXNwbGF5U2l6ZT0iICsgYnVpbGRDb29yZFN0cmluZyhwb2ludC54LCBwb2ludC55KQorICAgICAgICAgICAgICAgICsgIiBtZXRyaWNzU2l6ZT0iICsgYnVpbGRDb29yZFN0cmluZyhtZXRyaWNzLndpZHRoUGl4ZWxzLCBtZXRyaWNzLmhlaWdodFBpeGVscykKKyAgICAgICAgICAgICAgICArICIgc21hbGxlc3RTY3JlZW5XaWR0aD0iICsgY29uZmlnLnNtYWxsZXN0U2NyZWVuV2lkdGhEcAorICAgICAgICAgICAgICAgICsgIiBkZW5zaXR5RHBpPSIgKyBjb25maWcuZGVuc2l0eURwaQorICAgICAgICAgICAgICAgICsgIiBvcmllbnRhdGlvbj0iICsgY29uZmlnLm9yaWVudGF0aW9uOworCisgICAgICAgIExvZy5pKGdldFRhZygpLCBsaW5lKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBidWlsZENvb3JkU3RyaW5nKGludCB4LCBpbnQgeSkgeworICAgICAgICByZXR1cm4gIigiICsgeCArICIsIiArIHkgKyAiKSI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcF9iYXNlL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9MYXVuY2hpbmdBY3Rpdml0eS5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcF9iYXNlL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9MYXVuY2hpbmdBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlYWRmNjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwX2Jhc2Uvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0xhdW5jaGluZ0FjdGl2aXR5LmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbTsKKworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CisKKy8qKgorICogQWN0aXZpdHkgdGhhdCBsYXVuY2hlcyBhbm90aGVyIGFjdGl2aXRpZXMgd2hlbiBuZXcgaW50ZW50IGlzIHJlY2VpdmVkLgorICovCitwdWJsaWMgY2xhc3MgTGF1bmNoaW5nQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBnZXRJbnRlbnQoKTsKKyAgICAgICAgaWYgKHNhdmVkSW5zdGFuY2VTdGF0ZSA9PSBudWxsICYmIGludGVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBBY3Rpdml0eUxhdW5jaGVyLmxhdW5jaEFjdGl2aXR5RnJvbUV4dHJhcyh0aGlzLCBpbnRlbnQuZ2V0RXh0cmFzKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25OZXdJbnRlbnQoSW50ZW50IGludGVudCkgeworICAgICAgICBzdXBlci5vbk5ld0ludGVudChpbnRlbnQpOworICAgICAgICBBY3Rpdml0eUxhdW5jaGVyLmxhdW5jaEFjdGl2aXR5RnJvbUV4dHJhcyh0aGlzLCBpbnRlbnQuZ2V0RXh0cmFzKCkpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL2FwcF9iYXNlL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9UZXN0QWN0aXZpdHkuamF2YSBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHBfYmFzZS9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vVGVzdEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRiYzgxZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHBfYmFzZS9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vVGVzdEFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW07CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5UZXN0QWN0aXZpdHkuVEVTVF9BQ1RJVklUWV9BQ1RJT05fRklOSVNIX1NFTEY7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuVGVzdEFjdGl2aXR5LkVYVFJBX0ZJWEVEX09SSUVOVEFUSU9OOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CisKK3B1YmxpYyBjbGFzcyBUZXN0QWN0aXZpdHkgZXh0ZW5kcyBBYnN0cmFjdExpZmVjeWNsZUxvZ0FjdGl2aXR5IHsKKworICAgIHByaXZhdGUgQnJvYWRjYXN0UmVjZWl2ZXIgbVJlY2VpdmVyID0gbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgaWYgKGludGVudCAhPSBudWxsICYmIFRFU1RfQUNUSVZJVFlfQUNUSU9OX0ZJTklTSF9TRUxGLmVxdWFscyhpbnRlbnQuZ2V0QWN0aW9uKCkpKSB7CisgICAgICAgICAgICAgICAgZmluaXNoKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOworCisgICAgICAgIC8vIFNldCB0aGUgZml4ZWQgb3JpZW50YXRpb24gaWYgcmVxdWVzdGVkCisgICAgICAgIGlmIChnZXRJbnRlbnQoKS5oYXNFeHRyYShFWFRSQV9GSVhFRF9PUklFTlRBVElPTikpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBvcmkgPSBJbnRlZ2VyLnBhcnNlSW50KGdldEludGVudCgpLmdldFN0cmluZ0V4dHJhKEVYVFJBX0ZJWEVEX09SSUVOVEFUSU9OKSk7CisgICAgICAgICAgICBzZXRSZXF1ZXN0ZWRPcmllbnRhdGlvbihvcmkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25TdGFydCgpIHsKKyAgICAgICAgc3VwZXIub25TdGFydCgpOworICAgICAgICByZWdpc3RlclJlY2VpdmVyKG1SZWNlaXZlciwgbmV3IEludGVudEZpbHRlcihURVNUX0FDVElWSVRZX0FDVElPTl9GSU5JU0hfU0VMRikpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgeworICAgICAgICBzdXBlci5vblJlc3VtZSgpOworICAgICAgICBmaW5hbCBDb25maWd1cmF0aW9uIGNvbmZpZyA9IGdldFJlc291cmNlcygpLmdldENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgZHVtcERpc3BsYXlTaXplKGNvbmZpZyk7CisgICAgICAgIGR1bXBDb25maWd1cmF0aW9uKGNvbmZpZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25TdG9wKCkgeworICAgICAgICBzdXBlci5vblN0b3AoKTsKKyAgICAgICAgdW5yZWdpc3RlclJlY2VpdmVyKG1SZWNlaXZlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25Db25maWd1cmF0aW9uQ2hhbmdlZChDb25maWd1cmF0aW9uIG5ld0NvbmZpZykgeworICAgICAgICBzdXBlci5vbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKG5ld0NvbmZpZyk7CisgICAgICAgIGR1bXBEaXNwbGF5U2l6ZShuZXdDb25maWcpOworICAgICAgICBkdW1wQ29uZmlndXJhdGlvbihuZXdDb25maWcpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9hcHBfYmFzZS9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vY29tcG9uZW50L0NvbXBvbmVudHNCYXNlLmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwX2Jhc2Uvc3JjL2FuZHJvaWQvc2VydmVyL2FtL2NvbXBvbmVudC9Db21wb25lbnRzQmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2YzM0NzEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvYXBwX2Jhc2Uvc3JjL2FuZHJvaWQvc2VydmVyL2FtL2NvbXBvbmVudC9Db21wb25lbnRzQmFzZS5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLmFtLmNvbXBvbmVudDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIENvbXBvbmVudHMgY29uc3RhbnRzIGhvbGRpbmcgY2xhc3MuCisgKgorICogRXZlcnkgdGVzdGluZyBBUEsgc2hvdWxkIGhhdmUgQ29tcG9uZW50cyBjbGFzcyBpbiBKYXZhIHBhY2thZ2UgdGhhdCBlcXVhbHMgdG8gcGFja2FnZSBvZiBBUEsuCisgKiBUaG9zZSBDb21wb25lbnRzIGNsYXNzIHNob3VsZCBleHRlbmRzIHtAbGluayBDb21wb25lbnRzQmFzZX0uCisgKi8KK3B1YmxpYyBjbGFzcyBDb21wb25lbnRzQmFzZSB7CisKKyAgICAvKioKKyAgICAgKiBCdWlsZCB7QGxpbmsgQ29tcG9uZW50TmFtZX0gY29uc3RhbnQgd2hpY2ggYmVsb25ncyB0byB7QGNvZGUgY29tcG9uZW50c0NsYXNzfSdzIHBhY2thZ2UuCisgICAgICogQHBhcmFtIGNvbXBvbmVudHNDbGFzcyBDb21wb25lbnRzIGNsYXNzIG9iamVjdCB3aGljaCBoYXMgdGhlIHNhbWUgcGFja2FnZSBvZiBBUEsuCisgICAgICogQHBhcmFtIGNsYXNzTmFtZSBzaW1wbGUgY2xhc3MgbmFtZSAoaGFzIG5vICcuJykgb3IgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUuCisgICAgICogQHJldHVybiB7QGxpbmsgQ29tcG9uZW50TmFtZX0gb2JqZWN0LgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgQ29tcG9uZW50TmFtZSBjb21wb25lbnQoCisgICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgQ29tcG9uZW50c0Jhc2U+IGNvbXBvbmVudHNDbGFzcywgU3RyaW5nIGNsYXNzTmFtZSkgeworICAgICAgICBhc3NlcnRGYWxzZSgiY2xhc3NOYW1lIHNob3VsZCBub3Qgc3RhcnQgd2l0aCAnLiciLCBjbGFzc05hbWUuc3RhcnRzV2l0aCgiLiIpKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHBhY2thZ2VOYW1lID0gZ2V0UGFja2FnZU5hbWUoY29tcG9uZW50c0NsYXNzKTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBpc1NpbXBsZUNsYXNzTmFtZSA9IGNsYXNzTmFtZS5pbmRleE9mKCcuJykgPCAwOworICAgICAgICBmaW5hbCBTdHJpbmcgZnVsbENsYXNzTmFtZSA9IGlzU2ltcGxlQ2xhc3NOYW1lID8gcGFja2FnZU5hbWUgKyAiLiIgKyBjbGFzc05hbWUgOiBjbGFzc05hbWU7CisgICAgICAgIHJldHVybiBuZXcgQ29tcG9uZW50TmFtZShwYWNrYWdlTmFtZSwgZnVsbENsYXNzTmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHBhY2thZ2UgbmFtZSBvZiB7QGNvZGUgY29tcG9uZW50c0NsYXNzfS4KKyAgICAgKiBAcGFyYW0gY29tcG9uZW50c0NsYXNzIENvbXBvbmVudHMgY2xhc3Mgb2JqZWN0IHdoaWNoIGhhcyB0aGUgc2FtZSBwYWNrYWdlIG9mIEFQSy4KKyAgICAgKiBAcmV0dXJuIHBhY2thZ2UgbmFtZSBvZiBBUEsuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoQ2xhc3M8PyBleHRlbmRzIENvbXBvbmVudHNCYXNlPiBjb21wb25lbnRzQ2xhc3MpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJDb21wb25lbnRzIiwgY29tcG9uZW50c0NsYXNzLmdldFNpbXBsZU5hbWUoKSk7CisgICAgICAgIHJldHVybiBjb21wb25lbnRzQ2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5QW5kV2luZG93TWFuYWdlck92ZXJyaWRlQ29uZmlnVGVzdHMuamF2YSBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlBbmRXaW5kb3dNYW5hZ2VyT3ZlcnJpZGVDb25maWdUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxZTJlZTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5QW5kV2luZG93TWFuYWdlck92ZXJyaWRlQ29uZmlnVGVzdHMuamF2YQpAQCAtMCwwICsxLDk5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbTsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5XaW5kb3dDb25maWd1cmF0aW9uLldJTkRPV0lOR19NT0RFX0ZSRUVGT1JNOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnROYW1lVXRpbHMuZ2V0TG9nVGFnOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLkxPR19DT05GSUdVUkFUSU9OX0FDVElWSVRZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5TdGF0ZUxvZ2dlci5sb2c7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLlN0YXRlTG9nZ2VyLmxvZ0Fsd2F5czsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LlN1cmZhY2UuUk9UQVRJT05fMDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LlN1cmZhY2UuUk9UQVRJT05fMTgwOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc3VtZS5hc3N1bWVUcnVlOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKKy8qKgorICogQnVpbGQvSW5zdGFsbC9SdW46CisgKiAgICAgYXRlc3QgQ3RzQWN0aXZpdHlNYW5hZ2VyRGV2aWNlVGVzdENhc2VzOkFjdGl2aXR5QW5kV2luZG93TWFuYWdlck92ZXJyaWRlQ29uZmlnVGVzdHMKKyAqLworcHVibGljIGNsYXNzIEFjdGl2aXR5QW5kV2luZG93TWFuYWdlck92ZXJyaWRlQ29uZmlnVGVzdHMgZXh0ZW5kcyBBY3Rpdml0eU1hbmFnZXJUZXN0QmFzZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDb25maWd1cmF0aW9uQ2hhbmdlT2JzZXJ2ZXIgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIENPTkZJR1VSQVRJT05fQ0hBTkdFRF9QQVRURVJOID0KKyAgICAgICAgICAgIFBhdHRlcm4uY29tcGlsZSgiKC4rKUNvbmZpZ3VyYXRpb24gY2hhbmdlZDogKFxcZCspLChcXGQrKSIpOworCisgICAgICAgIHByaXZhdGUgQ29uZmlndXJhdGlvbkNoYW5nZU9ic2VydmVyKCkgeworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGZpbmRDb25maWd1cmF0aW9uQ2hhbmdlKAorICAgICAgICAgICAgICAgIENvbXBvbmVudE5hbWUgYWN0aXZpdHlOYW1lLCBMb2dTZXBhcmF0b3IgbG9nU2VwYXJhdG9yKSB7CisgICAgICAgICAgICBmb3IgKGludCByZXRyeSA9IDE7IHJldHJ5IDw9IDU7IHJldHJ5KyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBsaW5lcyA9CisgICAgICAgICAgICAgICAgICAgICAgICBnZXREZXZpY2VMb2dzRm9yQ29tcG9uZW50cyhsb2dTZXBhcmF0b3IsIGdldExvZ1RhZyhhY3Rpdml0eU5hbWUpKTsKKyAgICAgICAgICAgICAgICBsb2coIkxvb2tpbmcgYXQgbG9nY2F0Iik7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IGxpbmVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsaW5lID0gbGluZXNbaV0udHJpbSgpOworICAgICAgICAgICAgICAgICAgICBsb2cobGluZSk7CisgICAgICAgICAgICAgICAgICAgIE1hdGNoZXIgbWF0Y2hlciA9IENPTkZJR1VSQVRJT05fQ0hBTkdFRF9QQVRURVJOLm1hdGNoZXIobGluZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaGVyLm1hdGNoZXMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbG9nQWx3YXlzKCIqKipXYWl0aW5nIGNvbmZpZ3VyYXRpb24gY2hhbmdlIG9mICIgKyBnZXRMb2dUYWcoYWN0aXZpdHlOYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHJldHJ5PSIgKyByZXRyeSk7CisgICAgICAgICAgICAgICAgU3lzdGVtQ2xvY2suc2xlZXAoNTAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlY2VpdmVPdmVycmlkZUNvbmZpZ0Zyb21SZWxheW91dCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3N1bWVUcnVlKCJEZXZpY2UgZG9lc24ndCBzdXBwb3J0IGZyZWVmb3JtLiBTa2lwcGluZyB0ZXN0LiIsIHN1cHBvcnRzRnJlZWZvcm0oKSk7CisKKyAgICAgICAgbGF1bmNoQWN0aXZpdHkoTE9HX0NPTkZJR1VSQVRJT05fQUNUSVZJVFksIFdJTkRPV0lOR19NT0RFX0ZSRUVGT1JNKTsKKworICAgICAgICB0cnkgKGZpbmFsIFJvdGF0aW9uU2Vzc2lvbiByb3RhdGlvblNlc3Npb24gPSBuZXcgUm90YXRpb25TZXNzaW9uKCkpIHsKKyAgICAgICAgICAgIHJvdGF0aW9uU2Vzc2lvbi5zZXQoUk9UQVRJT05fMCk7CisgICAgICAgICAgICBMb2dTZXBhcmF0b3IgbG9nU2VwYXJhdG9yID0gc2VwYXJhdGVMb2dzKCk7CisgICAgICAgICAgICByZXNpemVBY3Rpdml0eVRhc2soTE9HX0NPTkZJR1VSQVRJT05fQUNUSVZJVFksIDAsIDAsIDEwMCwgMTAwKTsKKyAgICAgICAgICAgIENvbmZpZ3VyYXRpb25DaGFuZ2VPYnNlcnZlciBjID0gbmV3IENvbmZpZ3VyYXRpb25DaGFuZ2VPYnNlcnZlcigpOworICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByZXBvcnRlZFNpemVBZnRlclJlc2l6ZSA9IGMuZmluZENvbmZpZ3VyYXRpb25DaGFuZ2UoCisgICAgICAgICAgICAgICAgICAgIExPR19DT05GSUdVUkFUSU9OX0FDVElWSVRZLCBsb2dTZXBhcmF0b3IpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgdG8gb2JzZXJ2ZSBjb25maWd1cmF0aW9uIGNoYW5nZSB3aGVuIHJlc2l6aW5nIiwKKyAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZWRTaXplQWZ0ZXJSZXNpemUpOworCisgICAgICAgICAgICBsb2dTZXBhcmF0b3IgPSBzZXBhcmF0ZUxvZ3MoKTsKKyAgICAgICAgICAgIHJvdGF0aW9uU2Vzc2lvbi5zZXQoUk9UQVRJT05fMTgwKTsKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVwb3J0ZWRTaXplQWZ0ZXJSb3RhdGlvbiA9IGMuZmluZENvbmZpZ3VyYXRpb25DaGFuZ2UoCisgICAgICAgICAgICAgICAgICAgIExPR19DT05GSUdVUkFUSU9OX0FDVElWSVRZLCBsb2dTZXBhcmF0b3IpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoIk5vdCBleHBlY3RlZCB0byBvYnNlcnZlIGNvbmZpZ3VyYXRpb24gY2hhbmdlIGFmdGVyIGZsaXAgcm90YXRpb24iLAorICAgICAgICAgICAgICAgICAgICByZXBvcnRlZFNpemVBZnRlclJvdGF0aW9uKTsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJBY3Rpdml0eVZpc2liaWxpdHlUZXN0cy5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJBY3Rpdml0eVZpc2liaWxpdHlUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1M2MwYmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlckFjdGl2aXR5VmlzaWJpbGl0eVRlc3RzLmphdmEKQEAgLTAsMCArMSw0NzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW07CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyLlN0YWNrSWQuSU5WQUxJRF9TVEFDS19JRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuV2luZG93Q29uZmlndXJhdGlvbi5BQ1RJVklUWV9UWVBFX1NUQU5EQVJEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5XaW5kb3dDb25maWd1cmF0aW9uLldJTkRPV0lOR19NT0RFX0ZVTExTQ1JFRU47CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLldpbmRvd0NvbmZpZ3VyYXRpb24uV0lORE9XSU5HX01PREVfRlVMTFNDUkVFTl9PUl9TUExJVF9TQ1JFRU5fU0VDT05EQVJZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5XaW5kb3dDb25maWd1cmF0aW9uLldJTkRPV0lOR19NT0RFX1BJTk5FRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuV2luZG93Q29uZmlndXJhdGlvbi5XSU5ET1dJTkdfTU9ERV9TUExJVF9TQ1JFRU5fUFJJTUFSWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuV2luZG93Q29uZmlndXJhdGlvbi5XSU5ET1dJTkdfTU9ERV9TUExJVF9TQ1JFRU5fU0VDT05EQVJZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5BY3Rpdml0eU1hbmFnZXJTdGF0ZS5TVEFURV9QQVVTRUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkFjdGl2aXR5TWFuYWdlclN0YXRlLlNUQVRFX1JFU1VNRUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkFjdGl2aXR5TWFuYWdlclN0YXRlLlNUQVRFX1NUT1BQRUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudE5hbWVVdGlscy5nZXRBY3Rpdml0eU5hbWU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuQUxUX0xBVU5DSElOR19BQ1RJVklUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5BTFdBWVNfRk9DVVNBQkxFX1BJUF9BQ1RJVklUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5CUk9BRENBU1RfUkVDRUlWRVJfQUNUSVZJVFk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuQnJvYWRjYXN0UmVjZWl2ZXJBY3Rpdml0eS5BQ1RJT05fVFJJR0dFUl9CUk9BRENBU1Q7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuQnJvYWRjYXN0UmVjZWl2ZXJBY3Rpdml0eS5FWFRSQV9GSU5JU0hfQlJPQURDQVNUOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLkRPQ0tFRF9BQ1RJVklUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5MQVVOQ0hJTkdfQUNUSVZJVFk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuTEFVTkNIX1BJUF9PTl9QSVBfQUNUSVZJVFk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuTU9WRV9UQVNLX1RPX0JBQ0tfQUNUSVZJVFk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuTW92ZVRhc2tUb0JhY2tBY3Rpdml0eS5FWFRSQV9GSU5JU0hfUE9JTlQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuTW92ZVRhc2tUb0JhY2tBY3Rpdml0eS5GSU5JU0hfUE9JTlRfT05fUEFVU0U7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuTW92ZVRhc2tUb0JhY2tBY3Rpdml0eS5GSU5JU0hfUE9JTlRfT05fU1RPUDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5OT19ISVNUT1JZX0FDVElWSVRZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLlNXSVBFX1JFRlJFU0hfQUNUSVZJVFk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuVEVTVF9BQ1RJVklUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5UUkFOU0xVQ0VOVF9BQ1RJVklUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5UVVJOX1NDUkVFTl9PTl9BQ1RJVklUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5UVVJOX1NDUkVFTl9PTl9BVFRSX0FDVElWSVRZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLlRVUk5fU0NSRUVOX09OX0FUVFJfUkVNT1ZFX0FUVFJfQUNUSVZJVFk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuVFVSTl9TQ1JFRU5fT05fU0hPV19PTl9MT0NLX0FDVElWSVRZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLlRVUk5fU0NSRUVOX09OX1NJTkdMRV9UQVNLX0FDVElWSVRZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLlRVUk5fU0NSRUVOX09OX1dJVEhfUkVMQVlPVVRfQUNUSVZJVFk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLlVpRGV2aWNlVXRpbHMucHJlc3NCYWNrQnV0dG9uOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3N1bWUuYXNzdW1lVHJ1ZTsKKworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5QcmVzdWJtaXQ7CisKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBCdWlsZC9JbnN0YWxsL1J1bjoKKyAqICAgICBhdGVzdCBDdHNBY3Rpdml0eU1hbmFnZXJEZXZpY2VUZXN0Q2FzZXM6QWN0aXZpdHlNYW5hZ2VyQWN0aXZpdHlWaXNpYmlsaXR5VGVzdHMKKyAqLworcHVibGljIGNsYXNzIEFjdGl2aXR5TWFuYWdlckFjdGl2aXR5VmlzaWJpbGl0eVRlc3RzIGV4dGVuZHMgQWN0aXZpdHlNYW5hZ2VyVGVzdEJhc2UgeworCisgICAgQFJ1bGUKKyAgICBwdWJsaWMgZmluYWwgRGlzYWJsZVNjcmVlbkRvemVSdWxlIG1EaXNhYmxlU2NyZWVuRG96ZVJ1bGUgPSBuZXcgRGlzYWJsZVNjcmVlbkRvemVSdWxlKCk7CisKKyAgICBAUHJlc3VibWl0CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJhbnNsdWNlbnRBY3Rpdml0eU9uVG9wT2ZQaW5uZWRTdGFjaygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIXN1cHBvcnRzUGlwKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoZ2V0QW1TdGFydENtZE92ZXJIb21lKExBVU5DSF9QSVBfT05fUElQX0FDVElWSVRZKSk7CisgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvclZhbGlkU3RhdGUoTEFVTkNIX1BJUF9PTl9QSVBfQUNUSVZJVFkpOworICAgICAgICAvLyBOT1RFOiBtb3ZpbmcgdG8gcGlubmVkIHN0YWNrIHdpbGwgdHJpZ2dlciB0aGUgcGlwLW9uLXBpcCBhY3Rpdml0eSB0byBsYXVuY2ggdGhlCisgICAgICAgIC8vIHRyYW5zbHVjZW50IGFjdGl2aXR5LgorICAgICAgICBmaW5hbCBpbnQgc3RhY2tJZCA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFN0YWNrSWRCeUFjdGl2aXR5KAorICAgICAgICAgICAgICAgIExBVU5DSF9QSVBfT05fUElQX0FDVElWSVRZKTsKKworICAgICAgICBhc3NlcnROb3RFcXVhbHMoc3RhY2tJZCwgSU5WQUxJRF9TVEFDS19JRCk7CisgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoZ2V0TW92ZVRvUGlubmVkU3RhY2tDb21tYW5kKHN0YWNrSWQpKTsKKyAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yVmFsaWRTdGF0ZSgKKyAgICAgICAgICAgICAgICBuZXcgV2FpdEZvclZhbGlkQWN0aXZpdHlTdGF0ZS5CdWlsZGVyKEFMV0FZU19GT0NVU0FCTEVfUElQX0FDVElWSVRZKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFdpbmRvd2luZ01vZGUoV0lORE9XSU5HX01PREVfUElOTkVEKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEFjdGl2aXR5VHlwZShBQ1RJVklUWV9UWVBFX1NUQU5EQVJEKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0RnJvbnRTdGFjaygiUGlubmVkIHN0YWNrIG11c3QgYmUgdGhlIGZyb250IHN0YWNrLiIsCisgICAgICAgICAgICAgICAgV0lORE9XSU5HX01PREVfUElOTkVELCBBQ1RJVklUWV9UWVBFX1NUQU5EQVJEKTsKKyAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KExBVU5DSF9QSVBfT05fUElQX0FDVElWSVRZLCB0cnVlKTsKKyAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KEFMV0FZU19GT0NVU0FCTEVfUElQX0FDVElWSVRZLCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBc3NlcnRzIHRoYXQgdGhlIGhvbWUgYWN0aXZpdHkgaXMgdmlzaWJsZSB3aGVuIGEgdHJhbnNsdWNlbnQgYWN0aXZpdHkgaXMgbGF1bmNoZWQgaW4gdGhlCisgICAgICogZnVsbHNjcmVlbiBzdGFjayBvdmVyIHRoZSBob21lIGFjdGl2aXR5LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRyYW5zbHVjZW50QWN0aXZpdHlPblRvcE9mSG9tZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIWhhc0hvbWVTY3JlZW4oKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbGF1bmNoSG9tZUFjdGl2aXR5KCk7CisgICAgICAgIGxhdW5jaEFjdGl2aXR5KEFMV0FZU19GT0NVU0FCTEVfUElQX0FDVElWSVRZKTsKKworICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZyb250U3RhY2soIkZ1bGxzY3JlZW4gc3RhY2sgbXVzdCBiZSB0aGUgZnJvbnQgc3RhY2suIiwKKyAgICAgICAgICAgICAgICBXSU5ET1dJTkdfTU9ERV9GVUxMU0NSRUVOLCBBQ1RJVklUWV9UWVBFX1NUQU5EQVJEKTsKKyAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KEFMV0FZU19GT0NVU0FCTEVfUElQX0FDVElWSVRZLCB0cnVlKTsKKyAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRIb21lQWN0aXZpdHlWaXNpYmxlKHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFzc2VydCB0aGF0IHRoZSBob21lIGFjdGl2aXR5IGlzIHZpc2libGUgaWYgYSB0YXNrIHRoYXQgd2FzIGxhdW5jaGVkIGZyb20gaG9tZSBpcyBwaW5uZWQKKyAgICAgKiBhbmQgYWxzbyBhc3NlcnQgdGhlIG5leHQgdGFzayBpbiB0aGUgZnVsbHNjcmVlbiBzdGFjayBpc24ndCB2aXNpYmxlLgorICAgICAqLworICAgIEBQcmVzdWJtaXQKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIb21lVmlzaWJsZU9uQWN0aXZpdHlUYXNrUGlubmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghc3VwcG9ydHNQaXAoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbGF1bmNoSG9tZUFjdGl2aXR5KCk7CisgICAgICAgIGxhdW5jaEFjdGl2aXR5KFRFU1RfQUNUSVZJVFkpOworICAgICAgICBsYXVuY2hIb21lQWN0aXZpdHkoKTsKKyAgICAgICAgbGF1bmNoQWN0aXZpdHkoQUxXQVlTX0ZPQ1VTQUJMRV9QSVBfQUNUSVZJVFkpOworICAgICAgICBmaW5hbCBpbnQgc3RhY2tJZCA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFN0YWNrSWRCeUFjdGl2aXR5KAorICAgICAgICAgICAgICAgIEFMV0FZU19GT0NVU0FCTEVfUElQX0FDVElWSVRZKTsKKworICAgICAgICBhc3NlcnROb3RFcXVhbHMoc3RhY2tJZCwgSU5WQUxJRF9TVEFDS19JRCk7CisgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoZ2V0TW92ZVRvUGlubmVkU3RhY2tDb21tYW5kKHN0YWNrSWQpKTsKKyAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yVmFsaWRTdGF0ZSgKKyAgICAgICAgICAgICAgICBuZXcgV2FpdEZvclZhbGlkQWN0aXZpdHlTdGF0ZS5CdWlsZGVyKEFMV0FZU19GT0NVU0FCTEVfUElQX0FDVElWSVRZKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFdpbmRvd2luZ01vZGUoV0lORE9XSU5HX01PREVfUElOTkVEKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEFjdGl2aXR5VHlwZShBQ1RJVklUWV9UWVBFX1NUQU5EQVJEKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShBTFdBWVNfRk9DVVNBQkxFX1BJUF9BQ1RJVklUWSwgdHJ1ZSk7CisgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShURVNUX0FDVElWSVRZLCBmYWxzZSk7CisgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0SG9tZUFjdGl2aXR5VmlzaWJsZSh0cnVlKTsKKyAgICB9CisKKyAgICBAUHJlc3VibWl0CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJhbnNsdWNlbnRBY3Rpdml0eU92ZXJEb2NrZWRTdGFjaygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIXN1cHBvcnRzU3BsaXRTY3JlZW5NdWx0aVdpbmRvdygpKSB7CisgICAgICAgICAgICAvLyBTa2lwcGluZyB0ZXN0OiBubyBtdWx0aS13aW5kb3cgc3VwcG9ydAorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbGF1bmNoQWN0aXZpdGllc0luU3BsaXRTY3JlZW4oCisgICAgICAgICAgICAgICAgZ2V0TGF1bmNoQWN0aXZpdHlCdWlsZGVyKCkuc2V0VGFyZ2V0QWN0aXZpdHkoRE9DS0VEX0FDVElWSVRZKSwKKyAgICAgICAgICAgICAgICBnZXRMYXVuY2hBY3Rpdml0eUJ1aWxkZXIoKS5zZXRUYXJnZXRBY3Rpdml0eShURVNUX0FDVElWSVRZKSk7CisgICAgICAgIGxhdW5jaEFjdGl2aXR5KFRSQU5TTFVDRU5UX0FDVElWSVRZLCBXSU5ET1dJTkdfTU9ERV9TUExJVF9TQ1JFRU5fUFJJTUFSWSk7CisgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKGZhbHNlIC8qIGNvbXBhcmVUYXNrQW5kU3RhY2tCb3VuZHMgKi8sCisgICAgICAgICAgICAgICAgbmV3IFdhaXRGb3JWYWxpZEFjdGl2aXR5U3RhdGUoVEVTVF9BQ1RJVklUWSksCisgICAgICAgICAgICAgICAgbmV3IFdhaXRGb3JWYWxpZEFjdGl2aXR5U3RhdGUoRE9DS0VEX0FDVElWSVRZKSwKKyAgICAgICAgICAgICAgICBuZXcgV2FpdEZvclZhbGlkQWN0aXZpdHlTdGF0ZShUUkFOU0xVQ0VOVF9BQ1RJVklUWSkpOworICAgICAgICBtQW1XbVN0YXRlLmFzc2VydENvbnRhaW5zU3RhY2soIk11c3QgY29udGFpbiBmdWxsc2NyZWVuIHN0YWNrLiIsCisgICAgICAgICAgICAgICAgV0lORE9XSU5HX01PREVfU1BMSVRfU0NSRUVOX1NFQ09OREFSWSwgQUNUSVZJVFlfVFlQRV9TVEFOREFSRCk7CisgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Q29udGFpbnNTdGFjaygiTXVzdCBjb250YWluIGRvY2tlZCBzdGFjay4iLAorICAgICAgICAgICAgICAgIFdJTkRPV0lOR19NT0RFX1NQTElUX1NDUkVFTl9QUklNQVJZLCBBQ1RJVklUWV9UWVBFX1NUQU5EQVJEKTsKKyAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KERPQ0tFRF9BQ1RJVklUWSwgdHJ1ZSk7CisgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShURVNUX0FDVElWSVRZLCB0cnVlKTsKKyAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFRSQU5TTFVDRU5UX0FDVElWSVRZLCB0cnVlKTsKKyAgICB9CisKKyAgICBAUHJlc3VibWl0CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHVyblNjcmVlbk9uQWN0aXZpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IChmaW5hbCBMb2NrU2NyZWVuU2Vzc2lvbiBsb2NrU2NyZWVuU2Vzc2lvbiA9IG5ldyBMb2NrU2NyZWVuU2Vzc2lvbigpKSB7CisgICAgICAgICAgICBsb2NrU2NyZWVuU2Vzc2lvbi5zbGVlcERldmljZSgpOworICAgICAgICAgICAgbGF1bmNoQWN0aXZpdHkoVFVSTl9TQ1JFRU5fT05fQUNUSVZJVFkpOworCisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoVFVSTl9TQ1JFRU5fT05fQUNUSVZJVFksIHRydWUpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRGlzcGxheSB0dXJucyBvbiIsIGlzRGlzcGxheU9uKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFByZXN1Ym1pdAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZpbmlzaEFjdGl2aXR5SW5Ob25Gb2N1c2VkU3RhY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFzdXBwb3J0c1NwbGl0U2NyZWVuTXVsdGlXaW5kb3coKSkgeworICAgICAgICAgICAgLy8gU2tpcHBpbmcgdGVzdDogbm8gbXVsdGktd2luZG93IHN1cHBvcnQKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIExhdW5jaCB0d28gYWN0aXZpdGllcyBpbiBkb2NrZWQgc3RhY2suCisgICAgICAgIGxhdW5jaEFjdGl2aXR5SW5TcGxpdFNjcmVlbldpdGhSZWNlbnRzKExBVU5DSElOR19BQ1RJVklUWSk7CisgICAgICAgIGdldExhdW5jaEFjdGl2aXR5QnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldFRhcmdldEFjdGl2aXR5KEJST0FEQ0FTVF9SRUNFSVZFUl9BQ1RJVklUWSkKKyAgICAgICAgICAgICAgICAuc2V0V2FpdEZvckxhdW5jaGVkKHRydWUpCisgICAgICAgICAgICAgICAgLmV4ZWN1dGUoKTsKKyAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KEJST0FEQ0FTVF9SRUNFSVZFUl9BQ1RJVklUWSwgdHJ1ZSk7CisgICAgICAgIC8vIExhdW5jaCBzb21ldGhpbmcgdG8gZnVsbHNjcmVlbiBzdGFjayB0byBtYWtlIGl0IGZvY3VzZWQuCisgICAgICAgIGxhdW5jaEFjdGl2aXR5KFRFU1RfQUNUSVZJVFksIFdJTkRPV0lOR19NT0RFX0ZVTExTQ1JFRU5fT1JfU1BMSVRfU0NSRUVOX1NFQ09OREFSWSk7CisgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShURVNUX0FDVElWSVRZLCB0cnVlKTsKKyAgICAgICAgLy8gRmluaXNoIGFjdGl2aXR5IGluIG5vbi1mb2N1c2VkIChkb2NrZWQpIHN0YWNrLgorICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKEZJTklTSF9BQ1RJVklUWV9CUk9BRENBU1QpOworCisgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvckFjdGl2aXR5U3RhdGUoTEFVTkNISU5HX0FDVElWSVRZLCBTVEFURV9QQVVTRUQpOworICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JBbGxFeGl0aW5nV2luZG93cygpOworCisgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKExBVU5DSElOR19BQ1RJVklUWSk7CisgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShMQVVOQ0hJTkdfQUNUSVZJVFksIHRydWUpOworICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoQlJPQURDQVNUX1JFQ0VJVkVSX0FDVElWSVRZLCBmYWxzZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmluaXNoQWN0aXZpdHlXaXRoTW92ZVRhc2tUb0JhY2tBZnRlclBhdXNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHBlcmZvcm1GaW5pc2hBY3Rpdml0eVdpdGhNb3ZlVGFza1RvQmFjayhGSU5JU0hfUE9JTlRfT05fUEFVU0UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZpbmlzaEFjdGl2aXR5V2l0aE1vdmVUYXNrVG9CYWNrQWZ0ZXJTdG9wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHBlcmZvcm1GaW5pc2hBY3Rpdml0eVdpdGhNb3ZlVGFza1RvQmFjayhGSU5JU0hfUE9JTlRfT05fU1RPUCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHBlcmZvcm1GaW5pc2hBY3Rpdml0eVdpdGhNb3ZlVGFza1RvQmFjayhTdHJpbmcgZmluaXNoUG9pbnQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBNYWtlIHN1cmUgaG9tZSBhY3Rpdml0eSBpcyB2aXNpYmxlLgorICAgICAgICBsYXVuY2hIb21lQWN0aXZpdHkoKTsKKyAgICAgICAgaWYgKGhhc0hvbWVTY3JlZW4oKSkgeworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRIb21lQWN0aXZpdHlWaXNpYmxlKHRydWUgLyogdmlzaWJsZSAqLyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBMYXVuY2ggYW4gYWN0aXZpdHkgdGhhdCBjYWxscyAibW92ZVRhc2tUb0JhY2siIHRvIGZpbmlzaCBpdHNlbGYuCisgICAgICAgIGxhdW5jaEFjdGl2aXR5KE1PVkVfVEFTS19UT19CQUNLX0FDVElWSVRZLCBFWFRSQV9GSU5JU0hfUE9JTlQsIGZpbmlzaFBvaW50KTsKKyAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KE1PVkVfVEFTS19UT19CQUNLX0FDVElWSVRZLCB0cnVlKTsKKworICAgICAgICAvLyBMYXVuY2ggYSBkaWZmZXJlbnQgYWN0aXZpdHkgb24gdG9wLgorICAgICAgICBsYXVuY2hBY3Rpdml0eShCUk9BRENBU1RfUkVDRUlWRVJfQUNUSVZJVFkpOworICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JBY3Rpdml0eVN0YXRlKEJST0FEQ0FTVF9SRUNFSVZFUl9BQ1RJVklUWSwgU1RBVEVfUkVTVU1FRCk7CisgICAgICAgIC8vIFdhaXQgZm9yIHRyYW5zaXRpb24gY29tcGxldGUuCisgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvclZhbGlkU3RhdGUoTU9WRV9UQVNLX1RPX0JBQ0tfQUNUSVZJVFkpOworICAgICAgICBmaW5hbCBib29sZWFuIHNob3VsZEJlVmlzaWJsZSA9CisgICAgICAgICAgICAgICAgIW1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmlzQmVoaW5kT3BhcXVlQWN0aXZpdGllcyhNT1ZFX1RBU0tfVE9fQkFDS19BQ1RJVklUWSk7CisgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShNT1ZFX1RBU0tfVE9fQkFDS19BQ1RJVklUWSwgc2hvdWxkQmVWaXNpYmxlKTsKKyAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KEJST0FEQ0FTVF9SRUNFSVZFUl9BQ1RJVklUWSwgdHJ1ZSk7CisKKyAgICAgICAgLy8gRmluaXNoIHRoZSB0b3AtbW9zdCBhY3Rpdml0eS4KKyAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChGSU5JU0hfQUNUSVZJVFlfQlJPQURDQVNUKTsKKyAgICAgICAgLy9UT0RPOiBCVUc6IE1vdmVUYXNrVG9CYWNrQWN0aXZpdHkgcmV0dXJucyB0byB0aGUgdG9wIG9mIHRoZSBzdGFjayB3aGVuCisgICAgICAgIC8vIEJyb2FkY2FzdEFjdGl2aXR5IGZpbmlzaGVzLCBzbyBob21lQWN0aXZpdHkgaXMgbm90IHZpc2libGUgYWZ0ZXJ3YXJkcworCisgICAgICAgIC8vIEhvbWUgbXVzdCBiZSB2aXNpYmxlLgorICAgICAgICBpZiAoaGFzSG9tZVNjcmVlbigpKSB7CisgICAgICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JIb21lQWN0aXZpdHlWaXNpYmxlKCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEhvbWVBY3Rpdml0eVZpc2libGUodHJ1ZSAvKiB2aXNpYmxlICovKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFzc2VydHMgdGhhdCBsYXVuY2hpbmcgYmV0d2VlbiByZW9yZGVyIHRvIGZyb250IGFjdGl2aXRpZXMgZXhoaWJpdHMgdGhlIGNvcnJlY3QgYmFja3N0YWNrCisgICAgICogYmVoYXZpb3IuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVvcmRlclRvRnJvbnRCYWNrc3RhY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gU3RhcnQgd2l0aCBob21lIG9uIHRvcAorICAgICAgICBsYXVuY2hIb21lQWN0aXZpdHkoKTsKKyAgICAgICAgaWYgKGhhc0hvbWVTY3JlZW4oKSkgeworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRIb21lQWN0aXZpdHlWaXNpYmxlKHRydWUgLyogdmlzaWJsZSAqLyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBMYXVuY2ggdGhlIGxhdW5jaGluZyBhY3Rpdml0eSB0byB0aGUgZm9yZWdyb3VuZAorICAgICAgICBsYXVuY2hBY3Rpdml0eShMQVVOQ0hJTkdfQUNUSVZJVFkpOworCisgICAgICAgIC8vIExhdW5jaCB0aGUgYWx0ZXJuYXRlIGxhdW5jaGluZyBhY3Rpdml0eSBmcm9tIGxhdW5jaGluZyBhY3Rpdml0eSB3aXRoIHJlb3JkZXIgdG8gZnJvbnQuCisgICAgICAgIGdldExhdW5jaEFjdGl2aXR5QnVpbGRlcigpLnNldFRhcmdldEFjdGl2aXR5KEFMVF9MQVVOQ0hJTkdfQUNUSVZJVFkpCisgICAgICAgICAgICAgICAgLnNldFJlb3JkZXJUb0Zyb250KHRydWUpLmV4ZWN1dGUoKTsKKworICAgICAgICAvLyBMYXVuY2ggdGhlIGxhdW5jaGluZyBhY3Rpdml0eSBmcm9tIHRoZSBhbHRlcm5hdGUgbGF1bmNoaW5nIGFjdGl2aXR5IHdpdGggcmVvcmRlciB0bworICAgICAgICAvLyBmcm9udC4KKyAgICAgICAgZ2V0TGF1bmNoQWN0aXZpdHlCdWlsZGVyKCkuc2V0VGFyZ2V0QWN0aXZpdHkoTEFVTkNISU5HX0FDVElWSVRZKQorICAgICAgICAgICAgICAgIC5zZXRMYXVuY2hpbmdBY3Rpdml0eShBTFRfTEFVTkNISU5HX0FDVElWSVRZKQorICAgICAgICAgICAgICAgIC5zZXRSZW9yZGVyVG9Gcm9udCh0cnVlKQorICAgICAgICAgICAgICAgIC5leGVjdXRlKCk7CisKKyAgICAgICAgLy8gUHJlc3MgYmFjaworICAgICAgICBwcmVzc0JhY2tCdXR0b24oKTsKKworICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JWYWxpZFN0YXRlKEFMVF9MQVVOQ0hJTkdfQUNUSVZJVFkpOworCisgICAgICAgIC8vIEVuc3VyZSB0aGUgYWx0ZXJuYXRlIGxhdW5jaGluZyBhY3Rpdml0eSBpcyBpbiBmb2N1cworICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRBY3Rpdml0eSgiQWx0IExhdW5jaGluZyBBY3Rpdml0eSBtdXN0IGJlIGZvY3VzZWQiLAorICAgICAgICAgICAgICAgIEFMVF9MQVVOQ0hJTkdfQUNUSVZJVFkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFzc2VydHMgdGhhdCB0aGUgYWN0aXZpdHkgZm9jdXMgYW5kIGhpc3RvcnkgaXMgcHJlc2VydmVkIG1vdmluZyBiZXR3ZWVuIHRoZSBhY3Rpdml0eSBhbmQKKyAgICAgKiBob21lIHN0YWNrLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlb3JkZXJUb0Zyb250Q2hhbmdpbmdTdGFjaygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBTdGFydCB3aXRoIGhvbWUgb24gdG9wCisgICAgICAgIGxhdW5jaEhvbWVBY3Rpdml0eSgpOworICAgICAgICBpZiAoaGFzSG9tZVNjcmVlbigpKSB7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEhvbWVBY3Rpdml0eVZpc2libGUodHJ1ZSAvKiB2aXNpYmxlICovKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIExhdW5jaCB0aGUgbGF1bmNoaW5nIGFjdGl2aXR5IHRvIHRoZSBmb3JlZ3JvdW5kCisgICAgICAgIGxhdW5jaEFjdGl2aXR5KExBVU5DSElOR19BQ1RJVklUWSk7CisKKyAgICAgICAgLy8gTGF1bmNoIHRoZSBhbHRlcm5hdGUgbGF1bmNoaW5nIGFjdGl2aXR5IGZyb20gbGF1bmNoaW5nIGFjdGl2aXR5IHdpdGggcmVvcmRlciB0byBmcm9udC4KKyAgICAgICAgZ2V0TGF1bmNoQWN0aXZpdHlCdWlsZGVyKCkuc2V0VGFyZ2V0QWN0aXZpdHkoQUxUX0xBVU5DSElOR19BQ1RJVklUWSkKKyAgICAgICAgICAgICAgICAuc2V0UmVvcmRlclRvRnJvbnQodHJ1ZSkKKyAgICAgICAgICAgICAgICAuZXhlY3V0ZSgpOworCisgICAgICAgIC8vIFJldHVybiBob21lCisgICAgICAgIGxhdW5jaEhvbWVBY3Rpdml0eSgpOworICAgICAgICBpZiAoaGFzSG9tZVNjcmVlbigpKSB7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEhvbWVBY3Rpdml0eVZpc2libGUodHJ1ZSAvKiB2aXNpYmxlICovKTsKKyAgICAgICAgfQorICAgICAgICAvLyBMYXVuY2ggdGhlIGxhdW5jaGluZyBhY3Rpdml0eSBmcm9tIHRoZSBhbHRlcm5hdGUgbGF1bmNoaW5nIGFjdGl2aXR5IHdpdGggcmVvcmRlciB0bworICAgICAgICAvLyBmcm9udC4KKworICAgICAgICAvLyBCcmluZyBsYXVuY2hpbmcgYWN0aXZpdHkgYmFjayB0byB0aGUgZm9yZWdyb3VuZAorICAgICAgICBsYXVuY2hBY3Rpdml0eU5vV2FpdChMQVVOQ0hJTkdfQUNUSVZJVFkpOworICAgICAgICAvLyBXYWl0IGZvciB0aGUgbW9zdCBmcm9udCBhY3Rpdml0eSBvZiB0aGUgdGFzay4KKyAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yVmFsaWRTdGF0ZShBTFRfTEFVTkNISU5HX0FDVElWSVRZKTsKKworICAgICAgICAvLyBFbnN1cmUgdGhlIGFsdGVybmF0ZSBsYXVuY2hpbmcgYWN0aXZpdHkgaXMgc3RpbGwgaW4gZm9jdXMuCisgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZEFjdGl2aXR5KCJBbHQgTGF1bmNoaW5nIEFjdGl2aXR5IG11c3QgYmUgZm9jdXNlZCIsCisgICAgICAgICAgICAgICAgQUxUX0xBVU5DSElOR19BQ1RJVklUWSk7CisKKyAgICAgICAgcHJlc3NCYWNrQnV0dG9uKCk7CisKKyAgICAgICAgLy8gV2FpdCBmb3IgdGhlIGJvdHRvbSBhY3Rpdml0eSBiYWNrIHRvIHRoZSBmb3JlZ3JvdW5kLgorICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JWYWxpZFN0YXRlKExBVU5DSElOR19BQ1RJVklUWSk7CisKKyAgICAgICAgLy8gRW5zdXJlIGxhdW5jaGluZyBhY3Rpdml0eSB3YXMgYnJvdWdodCBmb3J3YXJkLgorICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRBY3Rpdml0eSgiTGF1bmNoaW5nIEFjdGl2aXR5IG11c3QgYmUgZm9jdXNlZCIsCisgICAgICAgICAgICAgICAgTEFVTkNISU5HX0FDVElWSVRZKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBc3NlcnRzIHRoYXQgYSBub2hpc3RvcnkgYWN0aXZpdHkgaXMgc3RvcHBlZCBhbmQgcmVtb3ZlZCBpbW1lZGlhdGVseSBhZnRlciBhIHJlc3VtZWQgYWN0aXZpdHkKKyAgICAgKiBhYm92ZSBiZWNvbWVzIHZpc2libGUgYW5kIGRvZXMgbm90IGlkbGUuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9IaXN0b3J5QWN0aXZpdHlGaW5pc2hlZFJlc3VtZWRBY3Rpdml0eU5vdElkbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFoYXNIb21lU2NyZWVuKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFN0YXJ0IHdpdGggaG9tZSBvbiB0b3AKKyAgICAgICAgbGF1bmNoSG9tZUFjdGl2aXR5KCk7CisKKyAgICAgICAgLy8gTGF1bmNoIG5vIGhpc3RvcnkgYWN0aXZpdHkKKyAgICAgICAgbGF1bmNoQWN0aXZpdHkoTk9fSElTVE9SWV9BQ1RJVklUWSk7CisKKyAgICAgICAgLy8gTGF1bmNoIGFuIGFjdGl2aXR5IHdpdGggYSBzd2lwZSByZWZyZXNoIGxheW91dCBjb25maWd1cmVkIHRvIHByZXZlbnQgaWRsZS4KKyAgICAgICAgbGF1bmNoQWN0aXZpdHkoU1dJUEVfUkVGUkVTSF9BQ1RJVklUWSk7CisKKyAgICAgICAgcHJlc3NCYWNrQnV0dG9uKCk7CisgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvckhvbWVBY3Rpdml0eVZpc2libGUoKTsKKyAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRIb21lQWN0aXZpdHlWaXNpYmxlKHRydWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFR1cm5TY3JlZW5PbkF0dHJOb0xvY2tTY3JlZW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IChmaW5hbCBMb2NrU2NyZWVuU2Vzc2lvbiBsb2NrU2NyZWVuU2Vzc2lvbiA9IG5ldyBMb2NrU2NyZWVuU2Vzc2lvbigpKSB7CisgICAgICAgICAgICBsb2NrU2NyZWVuU2Vzc2lvbi5kaXNhYmxlTG9ja1NjcmVlbigpCisgICAgICAgICAgICAgICAgICAgIC5zbGVlcERldmljZSgpOworICAgICAgICAgICAgZmluYWwgTG9nU2VwYXJhdG9yIGxvZ1NlcGFyYXRvciA9IHNlcGFyYXRlTG9ncygpOworICAgICAgICAgICAgbGF1bmNoQWN0aXZpdHkoVFVSTl9TQ1JFRU5fT05fQVRUUl9BQ1RJVklUWSk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoVFVSTl9TQ1JFRU5fT05fQVRUUl9BQ1RJVklUWSwgdHJ1ZSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJEaXNwbGF5IHR1cm5zIG9uIiwgaXNEaXNwbGF5T24oKSk7CisgICAgICAgICAgICBhc3NlcnRTaW5nbGVMYXVuY2goVFVSTl9TQ1JFRU5fT05fQVRUUl9BQ1RJVklUWSwgbG9nU2VwYXJhdG9yKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFR1cm5TY3JlZW5PbkF0dHJXaXRoTG9ja1NjcmVlbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIXN1cHBvcnRzU2VjdXJlTG9jaygpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB0cnkgKGZpbmFsIExvY2tTY3JlZW5TZXNzaW9uIGxvY2tTY3JlZW5TZXNzaW9uID0gbmV3IExvY2tTY3JlZW5TZXNzaW9uKCkpIHsKKyAgICAgICAgICAgIGxvY2tTY3JlZW5TZXNzaW9uLnNldExvY2tDcmVkZW50aWFsKCkKKyAgICAgICAgICAgICAgICAgICAgLnNsZWVwRGV2aWNlKCk7CisgICAgICAgICAgICBmaW5hbCBMb2dTZXBhcmF0b3IgbG9nU2VwYXJhdG9yID0gc2VwYXJhdGVMb2dzKCk7CisgICAgICAgICAgICBsYXVuY2hBY3Rpdml0eU5vV2FpdChUVVJOX1NDUkVFTl9PTl9BVFRSX0FDVElWSVRZKTsKKyAgICAgICAgICAgIC8vIFdhaXQgZm9yIHRoZSBhY3Rpdml0eSBzdG9wcGVkIGJlY2F1c2UgbG9jayBzY3JlZW4gcHJldmVudCBzaG93aW5nIHRoZSBhY3Rpdml0eS4KKyAgICAgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvckFjdGl2aXR5U3RhdGUoVFVSTl9TQ1JFRU5fT05fQVRUUl9BQ1RJVklUWSwgU1RBVEVfU1RPUFBFRCk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZSgiRGlzcGxheSBrZWVwcyBvZmYiLCBpc0Rpc3BsYXlPbigpKTsKKyAgICAgICAgICAgIGFzc2VydFNpbmdsZUxhdW5jaEFuZFN0b3AoVFVSTl9TQ1JFRU5fT05fQVRUUl9BQ1RJVklUWSwgbG9nU2VwYXJhdG9yKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFR1cm5TY3JlZW5PblNob3dPbkxvY2tBdHRyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSAoZmluYWwgTG9ja1NjcmVlblNlc3Npb24gbG9ja1NjcmVlblNlc3Npb24gPSBuZXcgTG9ja1NjcmVlblNlc3Npb24oKSkgeworICAgICAgICAgICAgbG9ja1NjcmVlblNlc3Npb24uc2xlZXBEZXZpY2UoKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvckFsbFN0b3BwZWRBY3Rpdml0aWVzKCk7CisgICAgICAgICAgICBmaW5hbCBMb2dTZXBhcmF0b3IgbG9nU2VwYXJhdG9yID0gc2VwYXJhdGVMb2dzKCk7CisgICAgICAgICAgICBsYXVuY2hBY3Rpdml0eShUVVJOX1NDUkVFTl9PTl9TSE9XX09OX0xPQ0tfQUNUSVZJVFkpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFRVUk5fU0NSRUVOX09OX1NIT1dfT05fTE9DS19BQ1RJVklUWSwgdHJ1ZSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJEaXNwbGF5IHR1cm5zIG9uIiwgaXNEaXNwbGF5T24oKSk7CisgICAgICAgICAgICBhc3NlcnRTaW5nbGVMYXVuY2goVFVSTl9TQ1JFRU5fT05fU0hPV19PTl9MT0NLX0FDVElWSVRZLCBsb2dTZXBhcmF0b3IpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHVyblNjcmVlbk9uQXR0clJlbW92ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgKGZpbmFsIExvY2tTY3JlZW5TZXNzaW9uIGxvY2tTY3JlZW5TZXNzaW9uID0gbmV3IExvY2tTY3JlZW5TZXNzaW9uKCkpIHsKKyAgICAgICAgICAgIGxvY2tTY3JlZW5TZXNzaW9uLnNsZWVwRGV2aWNlKCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JBbGxTdG9wcGVkQWN0aXZpdGllcygpOworICAgICAgICAgICAgTG9nU2VwYXJhdG9yIGxvZ1NlcGFyYXRvciA9IHNlcGFyYXRlTG9ncygpOworICAgICAgICAgICAgbGF1bmNoQWN0aXZpdHkoVFVSTl9TQ1JFRU5fT05fQVRUUl9SRU1PVkVfQVRUUl9BQ1RJVklUWSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJEaXNwbGF5IHR1cm5zIG9uIiwgaXNEaXNwbGF5T24oKSk7CisgICAgICAgICAgICBhc3NlcnRTaW5nbGVMYXVuY2goVFVSTl9TQ1JFRU5fT05fQVRUUl9SRU1PVkVfQVRUUl9BQ1RJVklUWSwgbG9nU2VwYXJhdG9yKTsKKworICAgICAgICAgICAgbG9ja1NjcmVlblNlc3Npb24uc2xlZXBEZXZpY2UoKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvckFsbFN0b3BwZWRBY3Rpdml0aWVzKCk7CisgICAgICAgICAgICBsb2dTZXBhcmF0b3IgPSBzZXBhcmF0ZUxvZ3MoKTsKKyAgICAgICAgICAgIGxhdW5jaEFjdGl2aXR5KFRVUk5fU0NSRUVOX09OX0FUVFJfUkVNT1ZFX0FUVFJfQUNUSVZJVFkpOworICAgICAgICAgICAgLy8gRGlzcGxheSBzaG91bGQga2VlcCBvZmYsIGJlY2F1c2Ugc2V0VHVyblNjcmVlbk9uKGZhbHNlKSBoYXMgYmVlbiBjYWxsZWQgYXQKKyAgICAgICAgICAgIC8vIHtAbGluayBUVVJOX1NDUkVFTl9PTl9BVFRSX1JFTU9WRV9BVFRSX0FDVElWSVRZfSdzIG9uU3RvcC4KKyAgICAgICAgICAgIGFzc2VydEZhbHNlKCJEaXNwbGF5IGtlZXBzIG9mZiIsIGlzRGlzcGxheU9uKCkpOworICAgICAgICAgICAgYXNzZXJ0U2luZ2xlU3RhcnRBbmRTdG9wKFRVUk5fU0NSRUVOX09OX0FUVFJfUkVNT1ZFX0FUVFJfQUNUSVZJVFksIGxvZ1NlcGFyYXRvcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBQcmVzdWJtaXQKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHVyblNjcmVlbk9uU2luZ2xlVGFzaygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgKGZpbmFsIExvY2tTY3JlZW5TZXNzaW9uIGxvY2tTY3JlZW5TZXNzaW9uID0gbmV3IExvY2tTY3JlZW5TZXNzaW9uKCkpIHsKKyAgICAgICAgICAgIGxvY2tTY3JlZW5TZXNzaW9uLnNsZWVwRGV2aWNlKCk7CisgICAgICAgICAgICBMb2dTZXBhcmF0b3IgbG9nU2VwYXJhdG9yID0gc2VwYXJhdGVMb2dzKCk7CisgICAgICAgICAgICBsYXVuY2hBY3Rpdml0eShUVVJOX1NDUkVFTl9PTl9TSU5HTEVfVEFTS19BQ1RJVklUWSk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoVFVSTl9TQ1JFRU5fT05fU0lOR0xFX1RBU0tfQUNUSVZJVFksIHRydWUpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRGlzcGxheSB0dXJucyBvbiIsIGlzRGlzcGxheU9uKCkpOworICAgICAgICAgICAgYXNzZXJ0U2luZ2xlTGF1bmNoKFRVUk5fU0NSRUVOX09OX1NJTkdMRV9UQVNLX0FDVElWSVRZLCBsb2dTZXBhcmF0b3IpOworCisgICAgICAgICAgICBsb2NrU2NyZWVuU2Vzc2lvbi5zbGVlcERldmljZSgpOworICAgICAgICAgICAgbG9nU2VwYXJhdG9yID0gc2VwYXJhdGVMb2dzKCk7CisgICAgICAgICAgICBsYXVuY2hBY3Rpdml0eShUVVJOX1NDUkVFTl9PTl9TSU5HTEVfVEFTS19BQ1RJVklUWSk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoVFVSTl9TQ1JFRU5fT05fU0lOR0xFX1RBU0tfQUNUSVZJVFksIHRydWUpOworICAgICAgICAgICAgLy8gV2FpdCBtb3JlIGZvciBkaXNwbGF5IHN0YXRlIGNoYW5nZSBzaW5jZSB0dXJuaW5nIHRoZSBkaXNwbGF5IE9OIG1heSB0YWtlIGxvbmdlcgorICAgICAgICAgICAgLy8gYW5kIHJlcG9ydGVkIGFmdGVyIHRoZSBhY3Rpdml0eSBsYXVuY2guCisgICAgICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3IoCisgICAgICAgICAgICAgICAgICAgICIqKipXYWl0aW5nIGZvciBkaXNwbGF5IHRvIHR1cm4gb24uLi4iLAorICAgICAgICAgICAgICAgICAgICAoKS0+eyByZXR1cm4gaXNEaXNwbGF5T24oKTsgfSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJEaXNwbGF5IHR1cm5zIG9uIiwgaXNEaXNwbGF5T24oKSk7CisgICAgICAgICAgICBhc3NlcnRTaW5nbGVTdGFydChUVVJOX1NDUkVFTl9PTl9TSU5HTEVfVEFTS19BQ1RJVklUWSwgbG9nU2VwYXJhdG9yKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFR1cm5TY3JlZW5PbkFjdGl2aXR5X3dpdGhSZWxheW91dCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgKGZpbmFsIExvY2tTY3JlZW5TZXNzaW9uIGxvY2tTY3JlZW5TZXNzaW9uID0gbmV3IExvY2tTY3JlZW5TZXNzaW9uKCkpIHsKKyAgICAgICAgICAgIGxvY2tTY3JlZW5TZXNzaW9uLnNsZWVwRGV2aWNlKCk7CisgICAgICAgICAgICBsYXVuY2hBY3Rpdml0eShUVVJOX1NDUkVFTl9PTl9XSVRIX1JFTEFZT1VUX0FDVElWSVRZKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShUVVJOX1NDUkVFTl9PTl9XSVRIX1JFTEFZT1VUX0FDVElWSVRZLCB0cnVlKTsKKworICAgICAgICAgICAgbG9ja1NjcmVlblNlc3Npb24uc2xlZXBEZXZpY2UoKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvckFjdGl2aXR5U3RhdGUoVFVSTl9TQ1JFRU5fT05fV0lUSF9SRUxBWU9VVF9BQ1RJVklUWSwgU1RBVEVfU1RPUFBFRCk7CisKKyAgICAgICAgICAgIC8vIEVuc3VyZSB0aGVyZSB3YXMgYW4gYWN0dWFsIHN0b3AgaWYgdGhlIHdhaXRGb3IgdGltZWQgb3V0LgorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShnZXRBY3Rpdml0eU5hbWUoVFVSTl9TQ1JFRU5fT05fV0lUSF9SRUxBWU9VVF9BQ1RJVklUWSkgKyAiIHN0b3BwZWQiLAorICAgICAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5oYXNBY3Rpdml0eVN0YXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRVUk5fU0NSRUVOX09OX1dJVEhfUkVMQVlPVVRfQUNUSVZJVFksIFNUQVRFX1NUT1BQRUQpKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKCJEaXNwbGF5IGtlZXBzIG9mZiIsIGlzRGlzcGxheU9uKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJBbVByb2ZpbGVUZXN0cy5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJBbVByb2ZpbGVUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZjQ1NDYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlckFtUHJvZmlsZVRlc3RzLmphdmEKQEAgLTAsMCArMSwxNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLmFtOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudE5hbWVVdGlscy5nZXRBY3Rpdml0eU5hbWU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLlVpRGV2aWNlVXRpbHMucHJlc3NIb21lQnV0dG9uOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5kZWJ1Z2dhYmxlLkNvbXBvbmVudHMuREVCVUdHQUJMRV9BUFBfQUNUSVZJVFk7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmdyZWF0ZXJUaGFuT3JFcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBCdWlsZC9JbnN0YWxsL1J1bjoKKyAqICAgICBhdGVzdCBDdHNBY3Rpdml0eU1hbmFnZXJEZXZpY2VUZXN0Q2FzZXM6QWN0aXZpdHlNYW5hZ2VyQW1Qcm9maWxlVGVzdHMKKyAqCisgKiBQbGVhc2UgdGFsayB0byBBbmRyb2lkIFN0dWRpbyB0ZWFtIGZpcnN0IGlmIHlvdSB3YW50IHRvIG1vZGlmeSBvciBkZWxldGUgdGhlc2UgdGVzdHMuCisgKi8KK3B1YmxpYyBjbGFzcyBBY3Rpdml0eU1hbmFnZXJBbVByb2ZpbGVUZXN0cyBleHRlbmRzIEFjdGl2aXR5TWFuYWdlclRlc3RCYXNlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPVVRQVVRfRklMRV9QQVRIID0gIi9kYXRhL2xvY2FsL3RtcC9wcm9maWxlLnRyYWNlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklSU1RfV09SRF9OT19TVFJFQU1JTkcgPSAiKnZlcnNpb25cbiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJUlNUX1dPUkRfU1RSRUFNSU5HID0gIlNMT1ciOyAgLy8gTWFnaWMgd29yZCBzZXQgYnkgcnVudGltZS4KKworICAgIC8qKgorICAgICAqIFRlc3QgYW0gcHJvZmlsZSBmdW5jdGlvbmFsaXR5IHdpdGggdGhlIGZvbGxvd2luZyAzIGNvbmZpZ3VyYWJsZSBvcHRpb25zOgorICAgICAqICAgIHN0YXJ0aW5nIHRoZSBhY3Rpdml0eSBiZWZvcmUgc3RhcnQgcHJvZmlsaW5nPyB5ZXM7CisgICAgICogICAgc2FtcGxpbmctYmFzZWQgcHJvZmlsaW5nPyBubzsKKyAgICAgKiAgICB1c2luZyBzdHJlYW1pbmcgb3V0cHV0IG1vZGU/IG5vLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFtUHJvZmlsZVN0YXJ0Tm9TYW1wbGluZ05vU3RyZWFtaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGFtIHByb2ZpbGUgc3RhcnQgLi4uICwgYW5kIHRoZSBzYW1lIHRvIHRoZSBmb2xsb3dpbmcgMyB0ZXN0IG1ldGhvZHMuCisgICAgICAgIHRlc3RQcm9maWxlKHRydWUsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGZvbGxvd2luZyB0ZXN0cyBhcmUgc2ltaWxhciB0byB0ZXN0QW1Qcm9maWxlU3RhcnROb1NhbXBsaW5nTm9TdHJlYW1pbmcoKSwKKyAgICAgKiBvbmx5IGRpZmZlcmVudCBpbiB0aGUgdGhyZWUgY29uZmlndXJhdGlvbiBvcHRpb25zLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFtUHJvZmlsZVN0YXJ0Tm9TYW1wbGluZ1N0cmVhbWluZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0UHJvZmlsZSh0cnVlLCBmYWxzZSwgdHJ1ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QW1Qcm9maWxlU3RhcnRTYW1wbGluZ05vU3RyZWFtaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RQcm9maWxlKHRydWUsIHRydWUsIGZhbHNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBbVByb2ZpbGVTdGFydFNhbXBsaW5nU3RyZWFtaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RQcm9maWxlKHRydWUsIHRydWUsIHRydWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFtU3RhcnRTdGFydFByb2ZpbGVyTm9TYW1wbGluZ05vU3RyZWFtaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGFtIHN0YXJ0IC0tc3RhcnQtcHJvZmlsZXIgLi4uLCBhbmQgdGhlIHNhbWUgdG8gdGhlIGZvbGxvd2luZyAzIHRlc3QgbWV0aG9kcy4KKyAgICAgICAgdGVzdFByb2ZpbGUoZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QW1TdGFydFN0YXJ0UHJvZmlsZXJOb1NhbXBsaW5nU3RyZWFtaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RQcm9maWxlKGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QW1TdGFydFN0YXJ0UHJvZmlsZXJTYW1wbGluZ05vU3RyZWFtaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RQcm9maWxlKGZhbHNlLCB0cnVlLCBmYWxzZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QW1TdGFydFN0YXJ0UHJvZmlsZXJTYW1wbGluZ1N0cmVhbWluZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0UHJvZmlsZShmYWxzZSwgdHJ1ZSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RQcm9maWxlKGZpbmFsIGJvb2xlYW4gc3RhcnRBY3Rpdml0eUZpcnN0LCBmaW5hbCBib29sZWFuIHNhbXBsaW5nLAorICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBzdHJlYW1pbmcpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoc3RhcnRBY3Rpdml0eUZpcnN0KSB7CisgICAgICAgICAgICBsYXVuY2hBY3Rpdml0eShERUJVR0dBQkxFX0FQUF9BQ1RJVklUWSk7CisgICAgICAgIH0KKworICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKAorICAgICAgICAgICAgICAgIGdldFN0YXJ0Q21kKERFQlVHR0FCTEVfQVBQX0FDVElWSVRZLCBzdGFydEFjdGl2aXR5Rmlyc3QsIHNhbXBsaW5nLCBzdHJlYW1pbmcpKTsKKyAgICAgICAgLy8gR28gdG8gaG9tZSBzY3JlZW4gYW5kIHRoZW4gd2FybSBzdGFydCB0aGUgYWN0aXZpdHkgdG8gZ2VuZXJhdGUgc29tZSBpbnRlcmVzdGluZyB0cmFjZS4KKyAgICAgICAgcHJlc3NIb21lQnV0dG9uKCk7CisgICAgICAgIGxhdW5jaEFjdGl2aXR5KERFQlVHR0FCTEVfQVBQX0FDVElWSVRZKTsKKworICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKGdldFN0b3BQcm9maWxlQ21kKERFQlVHR0FCTEVfQVBQX0FDVElWSVRZKSk7CisKKyAgICAgICAgLy8gU2xlZXAgZm9yIDAuMyBzZWNvbmQgKDMwMCBtaWxsaXNlY29uZHMpIHNvIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBwcm9maWxpbmcKKyAgICAgICAgLy8gZmlsZSBpcyBjb21wbGV0ZS4KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcCgzMDApOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvL2lnbm9yZWQKKyAgICAgICAgfQorICAgICAgICB2ZXJpZnlPdXRwdXRGaWxlRm9ybWF0KHN0cmVhbWluZyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFN0YXJ0Q21kKGZpbmFsIENvbXBvbmVudE5hbWUgYWN0aXZpdHlOYW1lLAorICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBhY3Rpdml0eUFscmVhZHlTdGFydGVkLCBmaW5hbCBib29sZWFuIHNhbXBsaW5nLCBmaW5hbCBib29sZWFuIHN0cmVhbWluZykgeworICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigiYW0iKTsKKyAgICAgICAgaWYgKGFjdGl2aXR5QWxyZWFkeVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIgcHJvZmlsZSBzdGFydCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiIHN0YXJ0IC1uICVzIC1XIC1TIC0tc3RhcnQtcHJvZmlsZXIgJXMiLAorICAgICAgICAgICAgICAgICAgICBnZXRBY3Rpdml0eU5hbWUoYWN0aXZpdHlOYW1lKSwgT1VUUFVUX0ZJTEVfUEFUSCkpOworICAgICAgICB9CisgICAgICAgIGlmIChzYW1wbGluZykgeworICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiAtLXNhbXBsaW5nIDEwMDAiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RyZWFtaW5nKSB7CisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiIC0tc3RyZWFtaW5nIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFjdGl2aXR5QWxyZWFkeVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICIgJXMgJXMiLCBhY3Rpdml0eU5hbWUuZ2V0UGFja2FnZU5hbWUoKSwgT1VUUFVUX0ZJTEVfUEFUSCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFN0b3BQcm9maWxlQ21kKGZpbmFsIENvbXBvbmVudE5hbWUgYWN0aXZpdHlOYW1lKSB7CisgICAgICAgIHJldHVybiAiYW0gcHJvZmlsZSBzdG9wICIgKyBhY3Rpdml0eU5hbWUuZ2V0UGFja2FnZU5hbWUoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5T3V0cHV0RmlsZUZvcm1hdChmaW5hbCBib29sZWFuIHN0cmVhbWluZykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFRoaXMgaXMgYSBoYWNrLiBUaGUgYW0gc2VydmljZSBoYXMgdG8gd3JpdGUgdG8gL2RhdGEvbG9jYWwvdG1wIGJlY2F1c2UgaXQgZG9lc24ndCBoYXZlCisgICAgICAgIC8vIGFjY2VzcyB0byB0aGUgc2RjYXJkLiBUaGUgdGVzdCBjYW5ub3QgcmVhZCBmcm9tIC9kYXRhL2xvY2FsL3RtcC4gVGhpcyBhbGxvd3MgdXMgdG8KKyAgICAgICAgLy8gc2NhbiB0aGUgY29udGVudCB0byB2YWxpZGF0ZSB3aGF0IGlzIG5lZWRlZCBmb3IgdGhpcyB0ZXN0LgorICAgICAgICBmaW5hbCBTdHJpbmcgZmlyc3RMaW5lID0gZXhlY3V0ZVNoZWxsQ29tbWFuZCgiaGVhZCAtMSAiICsgT1VUUFVUX0ZJTEVfUEFUSCk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdGVkRmlyc3RXb3JkID0gc3RyZWFtaW5nID8gRklSU1RfV09SRF9TVFJFQU1JTkcgOiBGSVJTVF9XT1JEX05PX1NUUkVBTUlORzsKKyAgICAgICAgYXNzZXJ0VGhhdCgKKyAgICAgICAgICAgICAgICAiZGF0YSBzaXplIiwgZmlyc3RMaW5lLmxlbmd0aCgpLCBncmVhdGVyVGhhbk9yRXF1YWxUbyhleHBlY3RlZEZpcnN0V29yZC5sZW5ndGgoKSkpOworICAgICAgICBmaW5hbCBTdHJpbmcgYWN0dWFsRmlyc3RXb3JkID0gZmlyc3RMaW5lLnN1YnN0cmluZygwLCBleHBlY3RlZEZpcnN0V29yZC5sZW5ndGgoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBmaXJzdCB3b3JkIiwgZXhwZWN0ZWRGaXJzdFdvcmQsIGFjdHVhbEZpcnN0V29yZCk7CisKKyAgICAgICAgLy8gQ2xlYW4gdXAuCisgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoInJtIC1mICIgKyBPVVRQVVRfRklMRV9QQVRIKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlckFtU3RhcnRPcHRpb25zVGVzdHMuamF2YSBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlNYW5hZ2VyQW1TdGFydE9wdGlvbnNUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNjI4NjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlckFtU3RhcnRPcHRpb25zVGVzdHMuamF2YQpAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW07CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50TmFtZVV0aWxzLmdldEFjdGl2aXR5TmFtZTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5FTlRSWV9QT0lOVF9BTElBU19BQ1RJVklUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5TSU5HTEVfVEFTS19BQ1RJVklUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5URVNUX0FDVElWSVRZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5VaURldmljZVV0aWxzLnByZXNzSG9tZUJ1dHRvbjsKKworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuZ3JlYXRlclRoYW5PckVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCisvKioKKyAqIEJ1aWxkL0luc3RhbGwvUnVuOgorICogICAgIGF0ZXN0IEN0c0FjdGl2aXR5TWFuYWdlckRldmljZVRlc3RDYXNlczpBY3Rpdml0eU1hbmFnZXJBbVN0YXJ0T3B0aW9uc1Rlc3RzCisgKi8KK3B1YmxpYyBjbGFzcyBBY3Rpdml0eU1hbmFnZXJBbVN0YXJ0T3B0aW9uc1Rlc3RzIGV4dGVuZHMgQWN0aXZpdHlNYW5hZ2VyVGVzdEJhc2UgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGFzaEQoKSB7CisgICAgICAgIC8vIFJ1biBhdCBsZWFzdCAyIHJvdW5kcyB0byB2ZXJpZnkgdGhhdCAtRCB3b3JrcyB3aXRoIGFuIGV4aXN0aW5nIHByb2Nlc3MuCisgICAgICAgIC8vIC1EIGNvdWxkIGZhaWwgaW4gdGhpcyBjYXNlIGlmIHRoZSBmb3JjZSBzdG9wIG9mIHByb2Nlc3MgaXMgYnJva2VuLgorICAgICAgICBpbnQgcHJldlByb2NJZCA9IC0xOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZCgiYW0gc3RhcnQgLW4gIiArIGdldEFjdGl2aXR5TmFtZShURVNUX0FDVElWSVRZKSArICIgLUQiKTsKKworICAgICAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yRGVidWdnZXJXaW5kb3dWaXNpYmxlKFRFU1RfQUNUSVZJVFkpOworICAgICAgICAgICAgaW50IHByb2NJZCA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEFjdGl2aXR5UHJvY0lkKFRFU1RfQUNUSVZJVFkpOworCisgICAgICAgICAgICBhc3NlcnRUaGF0KCJJbnZhbGlkIFByb2NJZC4iLCBwcm9jSWQsIGdyZWF0ZXJUaGFuT3JFcXVhbFRvKDApKTsKKyAgICAgICAgICAgIGlmIChpID4gMCkgeworICAgICAgICAgICAgICAgIGFzc2VydE5vdEVxdWFscygiUnVuICIgKyBpICsgIiBkaWRuJ3Qgc3RhcnQgbmV3IHByb2MuIiwgcHJldlByb2NJZCwgcHJvY0lkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByZXZQcm9jSWQgPSBwcm9jSWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REYXNoV19EaXJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdERhc2hXKFNJTkdMRV9UQVNLX0FDVElWSVRZLCBTSU5HTEVfVEFTS19BQ1RJVklUWSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGFzaFdfSW5kaXJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdERhc2hXKEVOVFJZX1BPSU5UX0FMSUFTX0FDVElWSVRZLCBTSU5HTEVfVEFTS19BQ1RJVklUWSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3REYXNoVyhmaW5hbCBDb21wb25lbnROYW1lIGVudHJ5QWN0aXZpdHksIGZpbmFsIENvbXBvbmVudE5hbWUgYWN0dWFsQWN0aXZpdHkpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gVGVzdCBjb2xkIHN0YXJ0CisgICAgICAgIHN0YXJ0QWN0aXZpdHlBbmRWZXJpZnlSZXN1bHQoZW50cnlBY3Rpdml0eSwgYWN0dWFsQWN0aXZpdHksIHRydWUpOworCisgICAgICAgIC8vIFRlc3Qgd2FybSBzdGFydAorICAgICAgICBwcmVzc0hvbWVCdXR0b24oKTsKKyAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9ySG9tZUFjdGl2aXR5VmlzaWJsZSgpOworICAgICAgICBzdGFydEFjdGl2aXR5QW5kVmVyaWZ5UmVzdWx0KGVudHJ5QWN0aXZpdHksIGFjdHVhbEFjdGl2aXR5LCBmYWxzZSk7CisgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvclZhbGlkU3RhdGUoYWN0dWFsQWN0aXZpdHkpOworICAgICAgICAvLyBUZXN0ICJob3QiIHN0YXJ0IChhcHAgYWxyZWFkeSBpbiBmcm9udCkKKyAgICAgICAgc3RhcnRBY3Rpdml0eUFuZFZlcmlmeVJlc3VsdChlbnRyeUFjdGl2aXR5LCBhY3R1YWxBY3Rpdml0eSwgZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzdGFydEFjdGl2aXR5QW5kVmVyaWZ5UmVzdWx0KGZpbmFsIENvbXBvbmVudE5hbWUgZW50cnlBY3Rpdml0eSwKKyAgICAgICAgICAgIGZpbmFsIENvbXBvbmVudE5hbWUgYWN0dWFsQWN0aXZpdHksIGJvb2xlYW4gc2hvdWxkU3RhcnQpIHsKKyAgICAgICAgLy8gU2VlIFRPRE8gYmVsb3cKKyAgICAgICAgLy8gZmluYWwgTG9nU2VwYXJhdG9yIGxvZ1NlcGFyYXRvciA9IHNlcGFyYXRlTG9ncygpOworCisgICAgICAgIC8vIFBhc3MgaW4gZGlmZmVyZW50IGRhdGEgb25seSB3aGVuIGNvbGQgc3RhcnRpbmcuIFRoaXMgaXMgdG8gbWFrZSB0aGUgaW50ZW50CisgICAgICAgIC8vIGRpZmZlcmVudCBpbiBzdWJzZXF1ZW50IHdhcm0vaG90IGxhdW5jaGVzLCBzbyB0aGF0IHRoZSBlbnRyeXBvaW50IGFsaWFzCisgICAgICAgIC8vIGFjdGl2aXR5IGlzIGFsd2F5cyBzdGFydGVkLCBidXQgdGhlIGFjdHVhbCBhY3Rpdml0eSBpcyBub3Qgc3RhcnRlZCBhZ2FpbgorICAgICAgICAvLyBiZWNhdXNlIG9mIHRoZSBORVdfVEFTSyBhbmQgc2luZ2xlVGFzayBmbGFncy4KKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdCA9IGV4ZWN1dGVTaGVsbENvbW1hbmQoCisgICAgICAgICAgICAgICAgImFtIHN0YXJ0IC1uICIgKyBnZXRBY3Rpdml0eU5hbWUoZW50cnlBY3Rpdml0eSkgKyAiIC1XIgorICAgICAgICAgICAgICAgICsgKHNob3VsZFN0YXJ0ID8gIiAtZCBhYm91dDpibGFuayIgOiAiIikpOworCisgICAgICAgIC8vIFZlcmlmeSBzaGVsbCBjb21tYW5kIHJldHVybiB2YWx1ZQorICAgICAgICB2ZXJpZnlTaGVsbE91dHB1dChyZXN1bHQsIGFjdHVhbEFjdGl2aXR5LCBzaG91bGRTdGFydCk7CisKKyAgICAgICAgLy8gVE9ETzogRGlzYWJsZSBsb2djYXQgY2hlY2sgZm9yIG5vdy4KKyAgICAgICAgLy8gTG9nY2F0IG9mIFdNIG9yIEFNIHRhZyBjb3VsZCBiZSBsb3N0IChlZy4gY2hhdHR5IGlmIGVhcmxpZXIgZXZlbnRzIGdlbmVyYXRlZAorICAgICAgICAvLyB0b28gbWFueSBsaW5lcyksIGFuZCBtYWtlIHRoZSB0ZXN0IGxvb2sgZmxha3kuIFdlIG5lZWQgdG8gZWl0aGVyIHVzZSBldmVudAorICAgICAgICAvLyBsb2cgb3Igc3dpdGggdG8gb3RoZXIgbWVjaGFuaXNtcy4gT25seSB2ZXJpZnkgc2hlbGwgb3V0cHV0IGZvciBub3csIGl0IHNob3VsZAorICAgICAgICAvLyBzdGlsbCBjYXRjaCBtb3N0IGZhaWx1cmVzLgorCisgICAgICAgIC8vIFZlcmlmeSBhZGIgbG9nY2F0IGxvZworICAgICAgICAvL3ZlcmlmeUxvZ2NhdChhY3R1YWxBY3Rpdml0eSwgc2hvdWxkU3RhcnQsIGxvZ1NlcGFyYXRvcik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBzTm90U3RhcnRlZFdhcm5pbmdQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKAorICAgICAgICAgICAgIldhcm5pbmc6IEFjdGl2aXR5IG5vdCBzdGFydGVkKC4qKSIpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gc1N0YXR1c1BhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoCisgICAgICAgICAgICAiU3RhdHVzOiAoLiopIik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBzQWN0aXZpdHlQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKAorICAgICAgICAgICAgIkFjdGl2aXR5OiAoLiopIik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNTdGF0dXNPayA9ICJvayI7CisKKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5U2hlbGxPdXRwdXQoCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmVzdWx0LCBmaW5hbCBDb21wb25lbnROYW1lIGFjdGl2aXR5LCBib29sZWFuIHNob3VsZFN0YXJ0KSB7CisgICAgICAgIGJvb2xlYW4gd2FybmluZ0ZvdW5kID0gZmFsc2U7CisgICAgICAgIFN0cmluZyBzdGF0dXMgPSBudWxsOworICAgICAgICBTdHJpbmcgcmVwb3J0ZWRBY3Rpdml0eSA9IG51bGw7CisKKyAgICAgICAgZmluYWwgU3RyaW5nW10gbGluZXMgPSByZXN1bHQuc3BsaXQoIlxcbiIpOworICAgICAgICAvLyBHb2luZyBmcm9tIHRoZSBlbmQgb2YgbG9ncyB0byBiZWdpbm5pbmcgaW4gY2FzZSBpZiBzb21lIG90aGVyIGFjdGl2aXR5IGlzIHN0YXJ0ZWQgZmlyc3QuCisgICAgICAgIGZvciAoaW50IGkgPSBsaW5lcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxpbmUgPSBsaW5lc1tpXS50cmltKCk7CisgICAgICAgICAgICBNYXRjaGVyIG1hdGNoZXIgPSBzTm90U3RhcnRlZFdhcm5pbmdQYXR0ZXJuLm1hdGNoZXIobGluZSk7CisgICAgICAgICAgICBpZiAobWF0Y2hlci5tYXRjaGVzKCkpIHsKKyAgICAgICAgICAgICAgICB3YXJuaW5nRm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2hlciA9IHNTdGF0dXNQYXR0ZXJuLm1hdGNoZXIobGluZSk7CisgICAgICAgICAgICBpZiAobWF0Y2hlci5tYXRjaGVzKCkpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBtYXRjaGVyLmdyb3VwKDEpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2hlciA9IHNBY3Rpdml0eVBhdHRlcm4ubWF0Y2hlcihsaW5lKTsKKyAgICAgICAgICAgIGlmIChtYXRjaGVyLm1hdGNoZXMoKSkgeworICAgICAgICAgICAgICAgIHJlcG9ydGVkQWN0aXZpdHkgPSBtYXRjaGVyLmdyb3VwKDEpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJTdGF0dXMgaXMgb2siLCBzU3RhdHVzT2ssIHN0YXR1cyk7CisgICAgICAgIGFzc2VydEVxdWFscygiUmVwb3J0ZWQgYWN0aXZpdHkgaXMgIiArICBnZXRBY3Rpdml0eU5hbWUoYWN0aXZpdHkpLAorICAgICAgICAgICAgICAgIGdldEFjdGl2aXR5TmFtZShhY3Rpdml0eSksIHJlcG9ydGVkQWN0aXZpdHkpOworCisgICAgICAgIGlmIChzaG91bGRTdGFydCAmJiB3YXJuaW5nRm91bmQpIHsKKyAgICAgICAgICAgIGZhaWwoIlNob3VsZCBzdGFydCBuZXcgYWN0aXZpdHkgYnV0IGJyb3VnaHQgc29tZXRoaW5nIHRvIGZyb250LiIpOworICAgICAgICB9IGVsc2UgaWYgKCFzaG91bGRTdGFydCAmJiAhd2FybmluZ0ZvdW5kKXsKKyAgICAgICAgICAgIGZhaWwoIlNob3VsZCBicmluZyBleGlzdGluZyBhY3Rpdml0eSB0byBmcm9udCBidXQgc3RhcnRlZCBuZXcgYWN0aXZpdHkuIik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlckFwcENvbmZpZ3VyYXRpb25UZXN0cy5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJBcHBDb25maWd1cmF0aW9uVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODZjOWM1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJBcHBDb25maWd1cmF0aW9uVGVzdHMuamF2YQpAQCAtMCwwICsxLDkxNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisgKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorICogdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisgKiB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLmFtOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLldpbmRvd0NvbmZpZ3VyYXRpb24uQUNUSVZJVFlfVFlQRV9TVEFOREFSRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuV2luZG93Q29uZmlndXJhdGlvbi5XSU5ET1dJTkdfTU9ERV9GVUxMU0NSRUVOOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5XaW5kb3dDb25maWd1cmF0aW9uLldJTkRPV0lOR19NT0RFX0ZVTExTQ1JFRU5fT1JfU1BMSVRfU0NSRUVOX1NFQ09OREFSWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuV2luZG93Q29uZmlndXJhdGlvbi5XSU5ET1dJTkdfTU9ERV9TUExJVF9TQ1JFRU5fUFJJTUFSWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LnBtLkFjdGl2aXR5SW5mby5TQ1JFRU5fT1JJRU5UQVRJT05fTEFORFNDQVBFOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQucG0uQWN0aXZpdHlJbmZvLlNDUkVFTl9PUklFTlRBVElPTl9QT1JUUkFJVDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQWN0aXZpdHlBbmRXaW5kb3dNYW5hZ2Vyc1N0YXRlLmRwVG9QeDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQWN0aXZpdHlNYW5hZ2VyU3RhdGUuU1RBVEVfUkVTVU1FRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50TmFtZVV0aWxzLmdldFdpbmRvd05hbWU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuQlJPQURDQVNUX1JFQ0VJVkVSX0FDVElWSVRZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLkJyb2FkY2FzdFJlY2VpdmVyQWN0aXZpdHkuQUNUSU9OX1RSSUdHRVJfQlJPQURDQVNUOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLkJyb2FkY2FzdFJlY2VpdmVyQWN0aXZpdHkuRVhUUkFfQlJPQURDQVNUX09SSUVOVEFUSU9OOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLkJyb2FkY2FzdFJlY2VpdmVyQWN0aXZpdHkuRVhUUkFfTU9WRV9CUk9BRENBU1RfVE9fQkFDSzsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5ESUFMT0dfV0hFTl9MQVJHRV9BQ1RJVklUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5MQU5EU0NBUEVfT1JJRU5UQVRJT05fQUNUSVZJVFk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuTEFVTkNISU5HX0FDVElWSVRZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLk5JR0hUX01PREVfQUNUSVZJVFk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuUE9SVFJBSVRfT1JJRU5UQVRJT05fQUNUSVZJVFk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuUkVTSVpFQUJMRV9BQ1RJVklUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5URVNUX0FDVElWSVRZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5TdGF0ZUxvZ2dlci5sb2dFOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS50cmFuc2x1Y2VudGFwcC5Db21wb25lbnRzLlRSQU5TTFVDRU5UX0xBTkRTQ0FQRV9BQ1RJVklUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0udHJhbnNsdWNlbnRhcHAyNi5Db21wb25lbnRzLlNESzI2X1RSQU5TTFVDRU5UX0xBTkRTQ0FQRV9BQ1RJVklUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LlN1cmZhY2UuUk9UQVRJT05fMDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LlN1cmZhY2UuUk9UQVRJT05fMTgwOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuU3VyZmFjZS5ST1RBVElPTl8yNzA7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5TdXJmYWNlLlJPVEFUSU9OXzkwOworCitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuUGFja2FnZVV0aWwuc3VwcG9ydHNSb3RhdGlvbjsKKworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMubGVzc1RoYW47CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc3VtZS5hc3N1bWVGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc3VtZS5hc3N1bWVUcnVlOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5QcmVzdWJtaXQ7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuRmxha3lUZXN0OworCitpbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEJ1aWxkL0luc3RhbGwvUnVuOgorICogICAgIGF0ZXN0IEN0c0FjdGl2aXR5TWFuYWdlckRldmljZVRlc3RDYXNlczpBY3Rpdml0eU1hbmFnZXJBcHBDb25maWd1cmF0aW9uVGVzdHMKKyAqLworcHVibGljIGNsYXNzIEFjdGl2aXR5TWFuYWdlckFwcENvbmZpZ3VyYXRpb25UZXN0cyBleHRlbmRzIEFjdGl2aXR5TWFuYWdlclRlc3RCYXNlIHsKKworICAgIC8vIFRPRE8oYi83MDI0NzA1OCk6IFVzZSB7QGxpbmsgQ29udGV4dCNzZW5kQnJvYWRjYXN0KEludGVudCkuCisgICAgLy8gU2hlbGwgY29tbWFuZCB0byBtb3ZlIHtAbGluayAjQlJPQURDQVNUX1JFQ0VJVkVSX0FDVElWSVRZfSB0YXNrIHRvIGJhY2suCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1PVkVfVEFTS19UT19CQUNLX0JST0FEQ0FTVCA9ICJhbSBicm9hZGNhc3QgLWEgIgorICAgICAgICAgICAgKyBBQ1RJT05fVFJJR0dFUl9CUk9BRENBU1QgKyAiIC0tZXogIiArIEVYVFJBX01PVkVfQlJPQURDQVNUX1RPX0JBQ0sgKyAiIHRydWUiOworICAgIC8vIFNoZWxsIGNvbW1hbmQgdG8gcmVxdWVzdCBwb3J0cmFpdCBvcmllbnRhdGlvbiB0byB7QGxpbmsgI0JST0FEQ0FTVF9SRUNFSVZFUl9BQ1RJVklUWX0uCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVFU1RfUE9SVFJBSVRfQlJPQURDQVNUID0gImFtIGJyb2FkY2FzdCAtYSAiCisgICAgICAgICAgICArIEFDVElPTl9UUklHR0VSX0JST0FEQ0FTVCArICIgLS1laSAiICsgRVhUUkFfQlJPQURDQVNUX09SSUVOVEFUSU9OICsgIiAxIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVRVUVTVF9MQU5EU0NBUEVfQlJPQURDQVNUID0gImFtIGJyb2FkY2FzdCAtYSAiCisgICAgICAgICAgICArIEFDVElPTl9UUklHR0VSX0JST0FEQ0FTVCArICIgLS1laSAiICsgRVhUUkFfQlJPQURDQVNUX09SSUVOVEFUSU9OICsgIiAwIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTTUFMTF9XSURUSF9EUCA9IDQyNjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU01BTExfSEVJR0hUX0RQID0gMzIwOworCisgICAgLyoqCisgICAgICogVGVzdHMgdGhhdCB0aGUgV2luZG93TWFuYWdlciNnZXREZWZhdWx0RGlzcGxheSgpIGFuZCB0aGUgQ29uZmlndXJhdGlvbiBvZiB0aGUgQWN0aXZpdHkKKyAgICAgKiBoYXMgYW4gdXBkYXRlZCBzaXplIHdoZW4gdGhlIEFjdGl2aXR5IGlzIHJlc2l6ZWQgZnJvbSBmdWxsc2NyZWVuIHRvIGRvY2tlZCBzdGF0ZS4KKyAgICAgKgorICAgICAqIFRoZSBBY3Rpdml0eSBoYW5kbGVzIGNvbmZpZ3VyYXRpb24gY2hhbmdlcywgc28gaXQgd2lsbCBub3QgYmUgcmVzdGFydGVkIGJldHdlZW4gcmVzaXplcy4KKyAgICAgKiBPbiBDb25maWd1cmF0aW9uIGNoYW5nZXMsIHRoZSBBY3Rpdml0eSBsb2dzIHRoZSBEaXNwbGF5IHNpemUgYW5kIENvbmZpZ3VyYXRpb24gd2lkdGgKKyAgICAgKiBhbmQgaGVpZ2h0cy4gVGhlIHZhbHVlcyByZXBvcnRlZCBpbiBmdWxsc2NyZWVuIHNob3VsZCBiZSBsYXJnZXIgdGhhbiB0aG9zZSByZXBvcnRlZCBpbgorICAgICAqIGRvY2tlZCBzdGF0ZS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25maWd1cmF0aW9uVXBkYXRlc1doZW5SZXNpemVkRnJvbUZ1bGxzY3JlZW4oKSB7CisgICAgICAgIGFzc3VtZVRydWUoIlNraXBwaW5nIHRlc3Q6IG5vIG11bHRpLXdpbmRvdyBzdXBwb3J0Iiwgc3VwcG9ydHNTcGxpdFNjcmVlbk11bHRpV2luZG93KCkpOworCisgICAgICAgIExvZ1NlcGFyYXRvciBsb2dTZXBhcmF0b3IgPSBzZXBhcmF0ZUxvZ3MoKTsKKyAgICAgICAgbGF1bmNoQWN0aXZpdHkoUkVTSVpFQUJMRV9BQ1RJVklUWSwgV0lORE9XSU5HX01PREVfRlVMTFNDUkVFTl9PUl9TUExJVF9TQ1JFRU5fU0VDT05EQVJZKTsKKyAgICAgICAgZmluYWwgUmVwb3J0ZWRTaXplcyBmdWxsc2NyZWVuU2l6ZXMgPSBnZXRBY3Rpdml0eURpc3BsYXlTaXplKFJFU0laRUFCTEVfQUNUSVZJVFksCisgICAgICAgICAgICAgICAgbG9nU2VwYXJhdG9yKTsKKworICAgICAgICBsb2dTZXBhcmF0b3IgPSBzZXBhcmF0ZUxvZ3MoKTsKKyAgICAgICAgc2V0QWN0aXZpdHlUYXNrV2luZG93aW5nTW9kZShSRVNJWkVBQkxFX0FDVElWSVRZLCBXSU5ET1dJTkdfTU9ERV9TUExJVF9TQ1JFRU5fUFJJTUFSWSk7CisgICAgICAgIGZpbmFsIFJlcG9ydGVkU2l6ZXMgZG9ja2VkU2l6ZXMgPSBnZXRBY3Rpdml0eURpc3BsYXlTaXplKFJFU0laRUFCTEVfQUNUSVZJVFksCisgICAgICAgICAgICAgICAgbG9nU2VwYXJhdG9yKTsKKworICAgICAgICBhc3NlcnRTaXplc0FyZVNhbmUoZnVsbHNjcmVlblNpemVzLCBkb2NrZWRTaXplcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2FtZSBhcyB7QGxpbmsgI3Rlc3RDb25maWd1cmF0aW9uVXBkYXRlc1doZW5SZXNpemVkRnJvbUZ1bGxzY3JlZW4oKX0gYnV0IHJlc2l6aW5nCisgICAgICogZnJvbSBkb2NrZWQgc3RhdGUgdG8gZnVsbHNjcmVlbiAocmV2ZXJzZSkuCisgICAgICovCisgICAgQFByZXN1Ym1pdAorICAgIEBUZXN0CisgICAgQEZsYWt5VGVzdChidWdJZCA9IDcxNzkyMzkzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25maWd1cmF0aW9uVXBkYXRlc1doZW5SZXNpemVkRnJvbURvY2tlZFN0YWNrKCkgeworICAgICAgICBhc3N1bWVUcnVlKCJTa2lwcGluZyB0ZXN0OiBubyBtdWx0aS13aW5kb3cgc3VwcG9ydCIsIHN1cHBvcnRzU3BsaXRTY3JlZW5NdWx0aVdpbmRvdygpKTsKKworICAgICAgICBMb2dTZXBhcmF0b3IgbG9nU2VwYXJhdG9yID0gc2VwYXJhdGVMb2dzKCk7CisgICAgICAgIGxhdW5jaEFjdGl2aXR5KFJFU0laRUFCTEVfQUNUSVZJVFksIFdJTkRPV0lOR19NT0RFX1NQTElUX1NDUkVFTl9QUklNQVJZKTsKKyAgICAgICAgZmluYWwgUmVwb3J0ZWRTaXplcyBkb2NrZWRTaXplcyA9IGdldEFjdGl2aXR5RGlzcGxheVNpemUoUkVTSVpFQUJMRV9BQ1RJVklUWSwKKyAgICAgICAgICAgICAgICBsb2dTZXBhcmF0b3IpOworCisgICAgICAgIGxvZ1NlcGFyYXRvciA9IHNlcGFyYXRlTG9ncygpOworICAgICAgICBzZXRBY3Rpdml0eVRhc2tXaW5kb3dpbmdNb2RlKFJFU0laRUFCTEVfQUNUSVZJVFksIFdJTkRPV0lOR19NT0RFX0ZVTExTQ1JFRU4pOworICAgICAgICBmaW5hbCBSZXBvcnRlZFNpemVzIGZ1bGxzY3JlZW5TaXplcyA9IGdldEFjdGl2aXR5RGlzcGxheVNpemUoUkVTSVpFQUJMRV9BQ1RJVklUWSwKKyAgICAgICAgICAgICAgICBsb2dTZXBhcmF0b3IpOworCisgICAgICAgIGFzc2VydFNpemVzQXJlU2FuZShmdWxsc2NyZWVuU2l6ZXMsIGRvY2tlZFNpemVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB3aGV0aGVyIHRoZSBEaXNwbGF5IHNpemVzIGNoYW5nZSB3aGVuIHJvdGF0aW5nIHRoZSBkZXZpY2UuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uZmlndXJhdGlvblVwZGF0ZXNXaGVuUm90YXRpbmdXaGlsZUZ1bGxzY3JlZW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzdW1lVHJ1ZSgiU2tpcHBpbmcgdGVzdDogbm8gcm90YXRpb24gc3VwcG9ydCIsIHN1cHBvcnRzUm90YXRpb24oKSk7CisKKyAgICAgICAgdHJ5IChmaW5hbCBSb3RhdGlvblNlc3Npb24gcm90YXRpb25TZXNzaW9uID0gbmV3IFJvdGF0aW9uU2Vzc2lvbigpKSB7CisgICAgICAgICAgICByb3RhdGlvblNlc3Npb24uc2V0KFJPVEFUSU9OXzApOworCisgICAgICAgICAgICBmaW5hbCBMb2dTZXBhcmF0b3IgbG9nU2VwYXJhdG9yID0gc2VwYXJhdGVMb2dzKCk7CisgICAgICAgICAgICBsYXVuY2hBY3Rpdml0eShSRVNJWkVBQkxFX0FDVElWSVRZLAorICAgICAgICAgICAgICAgICAgICBXSU5ET1dJTkdfTU9ERV9GVUxMU0NSRUVOX09SX1NQTElUX1NDUkVFTl9TRUNPTkRBUlkpOworICAgICAgICAgICAgZmluYWwgUmVwb3J0ZWRTaXplcyBpbml0aWFsU2l6ZXMgPSBnZXRBY3Rpdml0eURpc3BsYXlTaXplKFJFU0laRUFCTEVfQUNUSVZJVFksCisgICAgICAgICAgICAgICAgICAgIGxvZ1NlcGFyYXRvcik7CisKKyAgICAgICAgICAgIHJvdGF0ZUFuZENoZWNrU2l6ZXMocm90YXRpb25TZXNzaW9uLCBpbml0aWFsU2l6ZXMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2FtZSBhcyB7QGxpbmsgI3Rlc3RDb25maWd1cmF0aW9uVXBkYXRlc1doZW5Sb3RhdGluZ1doaWxlRnVsbHNjcmVlbigpfSBidXQgd2hlbiB0aGUgQWN0aXZpdHkKKyAgICAgKiBpcyBpbiB0aGUgZG9ja2VkIHN0YWNrLgorICAgICAqLworICAgIEBQcmVzdWJtaXQKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25maWd1cmF0aW9uVXBkYXRlc1doZW5Sb3RhdGluZ1doaWxlRG9ja2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc3VtZVRydWUoIlNraXBwaW5nIHRlc3Q6IG5vIG11bHRpLXdpbmRvdyBzdXBwb3J0Iiwgc3VwcG9ydHNTcGxpdFNjcmVlbk11bHRpV2luZG93KCkpOworCisgICAgICAgIHRyeSAoZmluYWwgUm90YXRpb25TZXNzaW9uIHJvdGF0aW9uU2Vzc2lvbiA9IG5ldyBSb3RhdGlvblNlc3Npb24oKSkgeworICAgICAgICAgICAgcm90YXRpb25TZXNzaW9uLnNldChST1RBVElPTl8wKTsKKworICAgICAgICAgICAgZmluYWwgTG9nU2VwYXJhdG9yIGxvZ1NlcGFyYXRvciA9IHNlcGFyYXRlTG9ncygpOworICAgICAgICAgICAgLy8gTGF1bmNoIG91ciBvd24gYWN0aXZpdHkgdG8gc2lkZSBpbiBjYXNlIFJlY2VudHMgKG9yIG90aGVyIGFjdGl2aXR5IHRvIHNpZGUpIGRvZXNuJ3QKKyAgICAgICAgICAgIC8vIHN1cHBvcnQgcm90YXRpb24uCisgICAgICAgICAgICBsYXVuY2hBY3Rpdml0aWVzSW5TcGxpdFNjcmVlbigKKyAgICAgICAgICAgICAgICAgICAgZ2V0TGF1bmNoQWN0aXZpdHlCdWlsZGVyKCkuc2V0VGFyZ2V0QWN0aXZpdHkoTEFVTkNISU5HX0FDVElWSVRZKSwKKyAgICAgICAgICAgICAgICAgICAgZ2V0TGF1bmNoQWN0aXZpdHlCdWlsZGVyKCkuc2V0VGFyZ2V0QWN0aXZpdHkoVEVTVF9BQ1RJVklUWSkpOworICAgICAgICAgICAgLy8gTGF1bmNoIHRhcmdldCBhY3Rpdml0eSBpbiBkb2NrZWQgc3RhY2suCisgICAgICAgICAgICBnZXRMYXVuY2hBY3Rpdml0eUJ1aWxkZXIoKS5zZXRUYXJnZXRBY3Rpdml0eShSRVNJWkVBQkxFX0FDVElWSVRZKS5leGVjdXRlKCk7CisgICAgICAgICAgICBmaW5hbCBSZXBvcnRlZFNpemVzIGluaXRpYWxTaXplcyA9IGdldEFjdGl2aXR5RGlzcGxheVNpemUoUkVTSVpFQUJMRV9BQ1RJVklUWSwKKyAgICAgICAgICAgICAgICAgICAgbG9nU2VwYXJhdG9yKTsKKworICAgICAgICAgICAgcm90YXRlQW5kQ2hlY2tTaXplcyhyb3RhdGlvblNlc3Npb24sIGluaXRpYWxTaXplcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTYW1lIGFzIHtAbGluayAjdGVzdENvbmZpZ3VyYXRpb25VcGRhdGVzV2hlblJvdGF0aW5nV2hpbGVEb2NrZWQoKX0gYnV0IHdoZW4gdGhlIEFjdGl2aXR5CisgICAgICogaXMgbGF1bmNoZWQgdG8gc2lkZSBmcm9tIGRvY2tlZCBzdGFjay4KKyAgICAgKi8KKyAgICBAUHJlc3VibWl0CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uZmlndXJhdGlvblVwZGF0ZXNXaGVuUm90YXRpbmdUb1NpZGVGcm9tRG9ja2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc3VtZVRydWUoIlNraXBwaW5nIHRlc3Q6IG5vIG11bHRpLXdpbmRvdyBzdXBwb3J0Iiwgc3VwcG9ydHNTcGxpdFNjcmVlbk11bHRpV2luZG93KCkpOworCisgICAgICAgIHRyeSAoZmluYWwgUm90YXRpb25TZXNzaW9uIHJvdGF0aW9uU2Vzc2lvbiA9IG5ldyBSb3RhdGlvblNlc3Npb24oKSkgeworICAgICAgICAgICAgcm90YXRpb25TZXNzaW9uLnNldChST1RBVElPTl8wKTsKKworICAgICAgICAgICAgZmluYWwgTG9nU2VwYXJhdG9yIGxvZ1NlcGFyYXRvciA9IHNlcGFyYXRlTG9ncygpOworICAgICAgICAgICAgbGF1bmNoQWN0aXZpdGllc0luU3BsaXRTY3JlZW4oCisgICAgICAgICAgICAgICAgICAgIGdldExhdW5jaEFjdGl2aXR5QnVpbGRlcigpLnNldFRhcmdldEFjdGl2aXR5KExBVU5DSElOR19BQ1RJVklUWSksCisgICAgICAgICAgICAgICAgICAgIGdldExhdW5jaEFjdGl2aXR5QnVpbGRlcigpLnNldFRhcmdldEFjdGl2aXR5KFJFU0laRUFCTEVfQUNUSVZJVFkpKTsKKyAgICAgICAgICAgIGZpbmFsIFJlcG9ydGVkU2l6ZXMgaW5pdGlhbFNpemVzID0gZ2V0QWN0aXZpdHlEaXNwbGF5U2l6ZShSRVNJWkVBQkxFX0FDVElWSVRZLAorICAgICAgICAgICAgICAgICAgICBsb2dTZXBhcmF0b3IpOworCisgICAgICAgICAgICByb3RhdGVBbmRDaGVja1NpemVzKHJvdGF0aW9uU2Vzc2lvbiwgaW5pdGlhbFNpemVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByb3RhdGVBbmRDaGVja1NpemVzKFJvdGF0aW9uU2Vzc2lvbiByb3RhdGlvblNlc3Npb24sIFJlcG9ydGVkU2l6ZXMgcHJldlNpemVzKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEFjdGl2aXR5TWFuYWdlclN0YXRlLkFjdGl2aXR5VGFzayB0YXNrID0KKyAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRUYXNrQnlBY3Rpdml0eShSRVNJWkVBQkxFX0FDVElWSVRZKTsKKyAgICAgICAgZmluYWwgaW50IGRpc3BsYXlJZCA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFN0YWNrQnlJZCh0YXNrLm1TdGFja0lkKS5tRGlzcGxheUlkOworCisgICAgICAgIGFzc3VtZVRydWUoc3VwcG9ydHNMb2NrZWRVc2VyUm90YXRpb24ocm90YXRpb25TZXNzaW9uLCBkaXNwbGF5SWQpKTsKKworICAgICAgICBmaW5hbCBpbnRbXSByb3RhdGlvbnMgPSB7IFJPVEFUSU9OXzI3MCwgUk9UQVRJT05fMTgwLCBST1RBVElPTl85MCwgUk9UQVRJT05fMCB9OworICAgICAgICBmb3IgKGZpbmFsIGludCByb3RhdGlvbiA6IHJvdGF0aW9ucykgeworICAgICAgICAgICAgZmluYWwgTG9nU2VwYXJhdG9yIGxvZ1NlcGFyYXRvciA9IHNlcGFyYXRlTG9ncygpOworICAgICAgICAgICAgcm90YXRpb25TZXNzaW9uLnNldChyb3RhdGlvbik7CisgICAgICAgICAgICBmaW5hbCBpbnQgbmV3RGV2aWNlUm90YXRpb24gPSBnZXREZXZpY2VSb3RhdGlvbihkaXNwbGF5SWQpOworICAgICAgICAgICAgaWYgKG5ld0RldmljZVJvdGF0aW9uID09IElOVkFMSURfREVWSUNFX1JPVEFUSU9OKSB7CisgICAgICAgICAgICAgICAgbG9nRSgiR290IGFuIGludmFsaWQgZGV2aWNlIHJvdGF0aW9uIHZhbHVlLiAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJDb250aW51aW5nIHRoZSB0ZXN0IGRlc3BpdGUgb2YgdGhhdCwgYnV0IGl0IGlzIGxpa2VseSB0byBmYWlsLiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBSZXBvcnRlZFNpemVzIHJvdGF0ZWRTaXplcyA9IGdldEFjdGl2aXR5RGlzcGxheVNpemUoUkVTSVpFQUJMRV9BQ1RJVklUWSwKKyAgICAgICAgICAgICAgICAgICAgbG9nU2VwYXJhdG9yKTsKKyAgICAgICAgICAgIGFzc2VydFNpemVzUm90YXRlKHByZXZTaXplcywgcm90YXRlZFNpemVzLAorICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIG9yaWVudGF0aW9uIGNoZWNrcyBpZiB3ZSBhcmUgbm90IGluIGZ1bGxzY3JlZW4gbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgdGFzay5nZXRXaW5kb3dpbmdNb2RlKCkgIT0gV0lORE9XSU5HX01PREVfRlVMTFNDUkVFTik7CisgICAgICAgICAgICBwcmV2U2l6ZXMgPSByb3RhdGVkU2l6ZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB3aGVuIGFjdGl2aXR5IG1vdmVkIGZyb20gZnVsbHNjcmVlbiBzdGFjayB0byBkb2NrZWQgYW5kIGJhY2suIEFjdGl2aXR5IHdpbGwgYmUKKyAgICAgKiByZWxhdW5jaGVkIHR3aWNlIGFuZCBpdCBzaG91bGQgaGF2ZSBzYW1lIGNvbmZpZyBhcyBpbml0aWFsIG9uZS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTYW1lQ29uZmlndXJhdGlvbkZ1bGxTcGxpdEZ1bGxSZWxhdW5jaCgpIHsKKyAgICAgICAgbW92ZUFjdGl2aXR5RnVsbFNwbGl0RnVsbChURVNUX0FDVElWSVRZKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTYW1lIGFzIHtAbGluayAjdGVzdFNhbWVDb25maWd1cmF0aW9uRnVsbFNwbGl0RnVsbFJlbGF1bmNofSBidXQgd2l0aG91dCByZWxhdW5jaC4KKyAgICAgKi8KKyAgICBAUHJlc3VibWl0CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2FtZUNvbmZpZ3VyYXRpb25GdWxsU3BsaXRGdWxsTm9SZWxhdW5jaCgpIHsKKyAgICAgICAgbW92ZUFjdGl2aXR5RnVsbFNwbGl0RnVsbChSRVNJWkVBQkxFX0FDVElWSVRZKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMYXVuY2hlcyBhY3Rpdml0eSBpbiBmdWxsc2NyZWVuIHN0YWNrLCBtb3ZlcyB0byBkb2NrZWQgc3RhY2sgYW5kIGJhY2sgdG8gZnVsbHNjcmVlbiBzdGFjay4KKyAgICAgKiBMYXN0IG9wZXJhdGlvbiBpcyBkb25lIGluIGEgd2F5IHdoaWNoIHNpbXVsYXRlcyBzcGxpdC1zY3JlZW4gZGl2aWRlciBtb3ZlbWVudCBtYXhpbWl6aW5nCisgICAgICogZG9ja2VkIHN0YWNrIHNpemUgYW5kIHRoZW4gbW92aW5nIHRhc2sgdG8gZnVsbHNjcmVlbiBzdGFjayAtIHRoZSBzYW1lIHdheSBpdCBpcyBkb25lIHdoZW4KKyAgICAgKiB1c2VyIGxvbmctcHJlc3NlcyBvdmVydmlldy9yZWNlbnRzIGJ1dHRvbiB0byBleGl0IHNwbGl0LXNjcmVlbi4KKyAgICAgKiBBc3NlcnRzIHRoYXQgaW5pdGlhbCBhbmQgZmluYWwgcmVwb3J0ZWQgc2l6ZXMgaW4gZnVsbHNjcmVlbiBzdGFjayBhcmUgdGhlIHNhbWUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIG1vdmVBY3Rpdml0eUZ1bGxTcGxpdEZ1bGwoQ29tcG9uZW50TmFtZSBhY3Rpdml0eU5hbWUpIHsKKyAgICAgICAgYXNzdW1lVHJ1ZSgiU2tpcHBpbmcgdGVzdDogbm8gbXVsdGktd2luZG93IHN1cHBvcnQiLCBzdXBwb3J0c1NwbGl0U2NyZWVuTXVsdGlXaW5kb3coKSk7CisKKyAgICAgICAgLy8gTGF1bmNoIHRvIGZ1bGxzY3JlZW4gc3RhY2sgYW5kIHJlY29yZCBzaXplLgorICAgICAgICBMb2dTZXBhcmF0b3IgbG9nU2VwYXJhdG9yID0gc2VwYXJhdGVMb2dzKCk7CisgICAgICAgIGxhdW5jaEFjdGl2aXR5KGFjdGl2aXR5TmFtZSwgV0lORE9XSU5HX01PREVfRlVMTFNDUkVFTl9PUl9TUExJVF9TQ1JFRU5fU0VDT05EQVJZKTsKKyAgICAgICAgZmluYWwgUmVwb3J0ZWRTaXplcyBpbml0aWFsRnVsbHNjcmVlblNpemVzID0gZ2V0QWN0aXZpdHlEaXNwbGF5U2l6ZShhY3Rpdml0eU5hbWUsCisgICAgICAgICAgICAgICAgbG9nU2VwYXJhdG9yKTsKKyAgICAgICAgZmluYWwgUmVjdCBkaXNwbGF5UmVjdCA9IGdldERpc3BsYXlSZWN0KGFjdGl2aXR5TmFtZSk7CisKKyAgICAgICAgLy8gTW92ZSB0byBkb2NrZWQgc3RhY2suCisgICAgICAgIGxvZ1NlcGFyYXRvciA9IHNlcGFyYXRlTG9ncygpOworICAgICAgICBzZXRBY3Rpdml0eVRhc2tXaW5kb3dpbmdNb2RlKGFjdGl2aXR5TmFtZSwgV0lORE9XSU5HX01PREVfU1BMSVRfU0NSRUVOX1BSSU1BUlkpOworICAgICAgICBmaW5hbCBSZXBvcnRlZFNpemVzIGRvY2tlZFNpemVzID0gZ2V0QWN0aXZpdHlEaXNwbGF5U2l6ZShhY3Rpdml0eU5hbWUsIGxvZ1NlcGFyYXRvcik7CisgICAgICAgIGFzc2VydFNpemVzQXJlU2FuZShpbml0aWFsRnVsbHNjcmVlblNpemVzLCBkb2NrZWRTaXplcyk7CisgICAgICAgIC8vIE1ha2Ugc3VyZSBkb2NrZWQgc3RhY2sgaXMgZm9jdXNlZC4gVGhpcyB3YXkgd2hlbiB3ZSBkaXNtaXNzIGl0IGxhdGVyIGZ1bGxzY3JlZW4gc3RhY2sKKyAgICAgICAgLy8gd2lsbCBjb21lIHVwLgorICAgICAgICBsYXVuY2hBY3Rpdml0eShhY3Rpdml0eU5hbWUsIFdJTkRPV0lOR19NT0RFX1NQTElUX1NDUkVFTl9QUklNQVJZKTsKKyAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUoZmFsc2UgLyogY29tcGFyZVRhc2tBbmRTdGFja0JvdW5kcyAqLywKKyAgICAgICAgICAgICAgICBuZXcgV2FpdEZvclZhbGlkQWN0aXZpdHlTdGF0ZS5CdWlsZGVyKGFjdGl2aXR5TmFtZSkuYnVpbGQoKSk7CisgICAgICAgIGZpbmFsIEFjdGl2aXR5TWFuYWdlclN0YXRlLkFjdGl2aXR5U3RhY2sgc3RhY2sgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKQorICAgICAgICAgICAgICAgIC5nZXRTdGFuZGFyZFN0YWNrQnlXaW5kb3dpbmdNb2RlKFdJTkRPV0lOR19NT0RFX1NQTElUX1NDUkVFTl9QUklNQVJZKTsKKworICAgICAgICAvLyBSZXNpemUgZG9ja2VkIHN0YWNrIHRvIGZ1bGxzY3JlZW4gc2l6ZS4gVGhpcyB3aWxsIHRyaWdnZXIgYWN0aXZpdHkgcmVsYXVuY2ggd2l0aAorICAgICAgICAvLyBub24tZW1wdHkgb3ZlcnJpZGUgY29uZmlndXJhdGlvbiBjb3JyZXNwb25kaW5nIHRvIGZ1bGxzY3JlZW4gc2l6ZS4KKyAgICAgICAgbG9nU2VwYXJhdG9yID0gc2VwYXJhdGVMb2dzKCk7CisgICAgICAgIG1BbS5yZXNpemVTdGFjayhzdGFjay5tU3RhY2tJZCwgZGlzcGxheVJlY3QpOworCisgICAgICAgIC8vIE1vdmUgYWN0aXZpdHkgYmFjayB0byBmdWxsc2NyZWVuIHN0YWNrLgorICAgICAgICBzZXRBY3Rpdml0eVRhc2tXaW5kb3dpbmdNb2RlKGFjdGl2aXR5TmFtZSwKKyAgICAgICAgICAgICAgICBXSU5ET1dJTkdfTU9ERV9GVUxMU0NSRUVOX09SX1NQTElUX1NDUkVFTl9TRUNPTkRBUlkpOworICAgICAgICBmaW5hbCBSZXBvcnRlZFNpemVzIGZpbmFsRnVsbHNjcmVlblNpemVzID0gZ2V0QWN0aXZpdHlEaXNwbGF5U2l6ZShhY3Rpdml0eU5hbWUsCisgICAgICAgICAgICAgICAgbG9nU2VwYXJhdG9yKTsKKworICAgICAgICAvLyBBZnRlciBhY3Rpdml0eSBjb25maWd1cmF0aW9uIHdhcyBjaGFuZ2VkIHR3aWNlIGl0IG11c3QgcmVwb3J0IHNhbWUgc2l6ZSBhcyBvcmlnaW5hbCBvbmUuCisgICAgICAgIGFzc2VydFNpemVzQXJlU2FtZShpbml0aWFsRnVsbHNjcmVlblNpemVzLCBmaW5hbEZ1bGxzY3JlZW5TaXplcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgd2hlbiBhY3Rpdml0eSBtb3ZlZCBmcm9tIGRvY2tlZCBzdGFjayB0byBmdWxsc2NyZWVuIGFuZCBiYWNrLiBBY3Rpdml0eSB3aWxsIGJlCisgICAgICogcmVsYXVuY2hlZCB0d2ljZSBhbmQgaXQgc2hvdWxkIGhhdmUgc2FtZSBjb25maWcgYXMgaW5pdGlhbCBvbmUuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2FtZUNvbmZpZ3VyYXRpb25TcGxpdEZ1bGxTcGxpdFJlbGF1bmNoKCkgeworICAgICAgICBtb3ZlQWN0aXZpdHlTcGxpdEZ1bGxTcGxpdChURVNUX0FDVElWSVRZKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTYW1lIGFzIHtAbGluayAjdGVzdFNhbWVDb25maWd1cmF0aW9uU3BsaXRGdWxsU3BsaXRSZWxhdW5jaH0gYnV0IHdpdGhvdXQgcmVsYXVuY2guCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2FtZUNvbmZpZ3VyYXRpb25TcGxpdEZ1bGxTcGxpdE5vUmVsYXVuY2goKSB7CisgICAgICAgIG1vdmVBY3Rpdml0eVNwbGl0RnVsbFNwbGl0KFJFU0laRUFCTEVfQUNUSVZJVFkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoYXQgYW4gYWN0aXZpdHkgd2l0aCB0aGUgRGlhbG9nV2hlbkxhcmdlIHRoZW1lIGNhbiB0cmFuc2Zvcm0gcHJvcGVybHkgd2hlbiBpbiBzcGxpdAorICAgICAqIHNjcmVlbi4KKyAgICAgKi8KKyAgICBAUHJlc3VibWl0CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlhbG9nV2hlbkxhcmdlU3BsaXRTbWFsbCgpIHsKKyAgICAgICAgYXNzdW1lVHJ1ZSgiU2tpcHBpbmcgdGVzdDogbm8gbXVsdGktd2luZG93IHN1cHBvcnQiLCBzdXBwb3J0c1NwbGl0U2NyZWVuTXVsdGlXaW5kb3coKSk7CisKKyAgICAgICAgbGF1bmNoQWN0aXZpdHkoRElBTE9HX1dIRU5fTEFSR0VfQUNUSVZJVFksIFdJTkRPV0lOR19NT0RFX1NQTElUX1NDUkVFTl9QUklNQVJZKTsKKyAgICAgICAgZmluYWwgQWN0aXZpdHlNYW5hZ2VyU3RhdGUuQWN0aXZpdHlTdGFjayBzdGFjayA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpCisgICAgICAgICAgICAgICAgLmdldFN0YW5kYXJkU3RhY2tCeVdpbmRvd2luZ01vZGUoV0lORE9XSU5HX01PREVfU1BMSVRfU0NSRUVOX1BSSU1BUlkpOworICAgICAgICBmaW5hbCBXaW5kb3dNYW5hZ2VyU3RhdGUuRGlzcGxheSBkaXNwbGF5ID0KKyAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLmdldFdtU3RhdGUoKS5nZXREaXNwbGF5KHN0YWNrLm1EaXNwbGF5SWQpOworICAgICAgICBmaW5hbCBpbnQgZGVuc2l0eSA9IGRpc3BsYXkuZ2V0RHBpKCk7CisgICAgICAgIGZpbmFsIGludCBzbWFsbFdpZHRoUHggPSBkcFRvUHgoU01BTExfV0lEVEhfRFAsIGRlbnNpdHkpOworICAgICAgICBmaW5hbCBpbnQgc21hbGxIZWlnaHRQeCA9IGRwVG9QeChTTUFMTF9IRUlHSFRfRFAsIGRlbnNpdHkpOworCisgICAgICAgIG1BbS5yZXNpemVTdGFjayhzdGFjay5tU3RhY2tJZCwgbmV3IFJlY3QoMCwgMCwgc21hbGxXaWR0aFB4LCBzbWFsbEhlaWdodFB4KSk7CisgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvclZhbGlkU3RhdGUoCisgICAgICAgICAgICAgICAgbmV3IFdhaXRGb3JWYWxpZEFjdGl2aXR5U3RhdGUuQnVpbGRlcihESUFMT0dfV0hFTl9MQVJHRV9BQ1RJVklUWSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRXaW5kb3dpbmdNb2RlKFdJTkRPV0lOR19NT0RFX1NQTElUX1NDUkVFTl9QUklNQVJZKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEFjdGl2aXR5VHlwZShBQ1RJVklUWV9UWVBFX1NUQU5EQVJEKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhhdCBkZXZpY2UgaGFuZGxlcyBjb25zZXF1ZW50IHJlcXVlc3RlZCBvcmllbnRhdGlvbnMgYW5kIGRpc3BsYXlzIHRoZSBhY3Rpdml0aWVzLgorICAgICAqLworICAgIEBQcmVzdWJtaXQKKyAgICBAVGVzdAorICAgIEBGbGFreVRlc3QoYnVnSWQgPSA3MTg3NTc1NSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RnVsbHNjcmVlbkFwcE9yaWVudGF0aW9uUmVxdWVzdHMoKSB7CisgICAgICAgIGFzc3VtZVRydWUoIlNraXBwaW5nIHRlc3Q6IG5vIHJvdGF0aW9uIHN1cHBvcnQiLCBzdXBwb3J0c1JvdGF0aW9uKCkpOworCisgICAgICAgIExvZ1NlcGFyYXRvciBsb2dTZXBhcmF0b3IgPSBzZXBhcmF0ZUxvZ3MoKTsKKyAgICAgICAgbGF1bmNoQWN0aXZpdHkoUE9SVFJBSVRfT1JJRU5UQVRJT05fQUNUSVZJVFkpOworICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoUE9SVFJBSVRfT1JJRU5UQVRJT05fQUNUSVZJVFksIHRydWUgLyogdmlzaWJsZSAqLyk7CisgICAgICAgIFJlcG9ydGVkU2l6ZXMgcmVwb3J0ZWRTaXplcyA9CisgICAgICAgICAgICAgICAgZ2V0TGFzdFJlcG9ydGVkU2l6ZXNGb3JBY3Rpdml0eShQT1JUUkFJVF9PUklFTlRBVElPTl9BQ1RJVklUWSwgbG9nU2VwYXJhdG9yKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwb3J0cmFpdCBhY3Rpdml0eSBzaG91bGQgYmUgaW4gcG9ydHJhaXQiLAorICAgICAgICAgICAgICAgIDEgLyogcG9ydHJhaXQgKi8sIHJlcG9ydGVkU2l6ZXMub3JpZW50YXRpb24pOworICAgICAgICBsb2dTZXBhcmF0b3IgPSBzZXBhcmF0ZUxvZ3MoKTsKKworICAgICAgICBsYXVuY2hBY3Rpdml0eShMQU5EU0NBUEVfT1JJRU5UQVRJT05fQUNUSVZJVFkpOworICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoTEFORFNDQVBFX09SSUVOVEFUSU9OX0FDVElWSVRZLCB0cnVlIC8qIHZpc2libGUgKi8pOworICAgICAgICByZXBvcnRlZFNpemVzID0KKyAgICAgICAgICAgICAgICBnZXRMYXN0UmVwb3J0ZWRTaXplc0ZvckFjdGl2aXR5KExBTkRTQ0FQRV9PUklFTlRBVElPTl9BQ1RJVklUWSwgbG9nU2VwYXJhdG9yKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJsYW5kc2NhcGUgYWN0aXZpdHkgc2hvdWxkIGJlIGluIGxhbmRzY2FwZSIsCisgICAgICAgICAgICAgICAgMiAvKiBsYW5kc2NhcGUgKi8sIHJlcG9ydGVkU2l6ZXMub3JpZW50YXRpb24pOworICAgICAgICBsb2dTZXBhcmF0b3IgPSBzZXBhcmF0ZUxvZ3MoKTsKKworICAgICAgICBsYXVuY2hBY3Rpdml0eShQT1JUUkFJVF9PUklFTlRBVElPTl9BQ1RJVklUWSk7CisgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShQT1JUUkFJVF9PUklFTlRBVElPTl9BQ1RJVklUWSwgdHJ1ZSAvKiB2aXNpYmxlICovKTsKKyAgICAgICAgcmVwb3J0ZWRTaXplcyA9CisgICAgICAgICAgICAgICAgZ2V0TGFzdFJlcG9ydGVkU2l6ZXNGb3JBY3Rpdml0eShQT1JUUkFJVF9PUklFTlRBVElPTl9BQ1RJVklUWSwgbG9nU2VwYXJhdG9yKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwb3J0cmFpdCBhY3Rpdml0eSBzaG91bGQgYmUgaW4gcG9ydHJhaXQiLAorICAgICAgICAgICAgICAgIDEgLyogcG9ydHJhaXQgKi8sIHJlcG9ydGVkU2l6ZXMub3JpZW50YXRpb24pOworICAgICAgICBsb2dTZXBhcmF0b3IgPSBzZXBhcmF0ZUxvZ3MoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb25mdWxsc2NyZWVuQXBwT3JpZW50YXRpb25SZXF1ZXN0cygpIHsKKyAgICAgICAgYXNzdW1lVHJ1ZSgiU2tpcHBpbmcgdGVzdDogbm8gcm90YXRpb24gc3VwcG9ydCIsIHN1cHBvcnRzUm90YXRpb24oKSk7CisKKyAgICAgICAgTG9nU2VwYXJhdG9yIGxvZ1NlcGFyYXRvciA9IHNlcGFyYXRlTG9ncygpOworICAgICAgICBsYXVuY2hBY3Rpdml0eShQT1JUUkFJVF9PUklFTlRBVElPTl9BQ1RJVklUWSwgV0lORE9XSU5HX01PREVfRlVMTFNDUkVFTik7CisgICAgICAgIGZpbmFsIFJlcG9ydGVkU2l6ZXMgaW5pdGlhbFJlcG9ydGVkU2l6ZXMgPQorICAgICAgICAgICAgICAgIGdldExhc3RSZXBvcnRlZFNpemVzRm9yQWN0aXZpdHkoUE9SVFJBSVRfT1JJRU5UQVRJT05fQUNUSVZJVFksIGxvZ1NlcGFyYXRvcik7CisgICAgICAgIGFzc2VydEVxdWFscygicG9ydHJhaXQgYWN0aXZpdHkgc2hvdWxkIGJlIGluIHBvcnRyYWl0IiwKKyAgICAgICAgICAgICAgICAxIC8qIHBvcnRyYWl0ICovLCBpbml0aWFsUmVwb3J0ZWRTaXplcy5vcmllbnRhdGlvbik7CisgICAgICAgIGxvZ1NlcGFyYXRvciA9IHNlcGFyYXRlTG9ncygpOworCisgICAgICAgIGxhdW5jaEFjdGl2aXR5KFNESzI2X1RSQU5TTFVDRU5UX0xBTkRTQ0FQRV9BQ1RJVklUWSwgV0lORE9XSU5HX01PREVfRlVMTFNDUkVFTik7CisgICAgICAgIGFzc2VydEVxdWFscygiTGVnYWN5IG5vbi1mdWxsc2NyZWVuIGFjdGl2aXR5IHJlcXVlc3RlZCBsYW5kc2NhcGUgb3JpZW50YXRpb24iLAorICAgICAgICAgICAgICAgIDAgLyogbGFuZHNjYXBlICovLCBtQW1XbVN0YXRlLmdldFdtU3RhdGUoKS5nZXRMYXN0T3JpZW50YXRpb24oKSk7CisKKyAgICAgICAgLy8gVE9ETyhiLzM2ODk3OTY4KTogdW5jb21tZW50IG9uY2Ugd2UgY2FuIHN1cHByZXNzIHVuc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb25zCisgICAgICAgIC8vIGZpbmFsIFJlcG9ydGVkU2l6ZXMgdXBkYXRlZFJlcG9ydGVkU2l6ZXMgPQorICAgICAgICAvLyAgICAgIGdldExhc3RSZXBvcnRlZFNpemVzRm9yQWN0aXZpdHkoUE9SVFJBSVRfQUNUSVZJVFlfTkFNRSwgbG9nU2VwYXJhdG9yKTsKKyAgICAgICAgLy8gYXNzZXJ0RXF1YWxzKCJwb3J0cmFpdCBhY3Rpdml0eSBzaG91bGQgbm90IGhhdmUgbW92ZWQgZnJvbSBwb3J0cmFpdCIsCisgICAgICAgIC8vICAgICAgICAgMSAvKiBwb3J0cmFpdCAqLywgdXBkYXRlZFJlcG9ydGVkU2l6ZXMub3JpZW50YXRpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhhdCBkZXZpY2UgaGFuZGxlcyBjb25zZXF1ZW50IHJlcXVlc3RlZCBvcmllbnRhdGlvbnMgYW5kIHdpbGwgbm90IHJlcG9ydCBhIGNvbmZpZworICAgICAqIGNoYW5nZSB0byBhbiBpbnZpc2libGUgYWN0aXZpdHkuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwT3JpZW50YXRpb25SZXF1ZXN0Q29uZmlnQ2hhbmdlcygpIHsKKyAgICAgICAgYXNzdW1lVHJ1ZSgiU2tpcHBpbmcgdGVzdDogbm8gcm90YXRpb24gc3VwcG9ydCIsIHN1cHBvcnRzUm90YXRpb24oKSk7CisKKyAgICAgICAgTG9nU2VwYXJhdG9yIGxvZ1NlcGFyYXRvciA9IHNlcGFyYXRlTG9ncygpOworICAgICAgICBsYXVuY2hBY3Rpdml0eShQT1JUUkFJVF9PUklFTlRBVElPTl9BQ1RJVklUWSwgV0lORE9XSU5HX01PREVfRlVMTFNDUkVFTik7CisgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShQT1JUUkFJVF9PUklFTlRBVElPTl9BQ1RJVklUWSwgdHJ1ZSAvKiB2aXNpYmxlICovKTsKKworICAgICAgICBhc3NlcnRMaWZlY3ljbGVDb3VudHMoUE9SVFJBSVRfT1JJRU5UQVRJT05fQUNUSVZJVFksIGxvZ1NlcGFyYXRvciwgMSAvKiBjcmVhdGUgKi8sCisgICAgICAgICAgICAgICAgMSAvKiBzdGFydCAqLywgMSAvKiByZXN1bWUgKi8sIDAgLyogcGF1c2UgKi8sIDAgLyogc3RvcCAqLywgMCAvKiBkZXN0cm95ICovLAorICAgICAgICAgICAgICAgIDAgLyogY29uZmlnICovKTsKKworICAgICAgICBsYXVuY2hBY3Rpdml0eShMQU5EU0NBUEVfT1JJRU5UQVRJT05fQUNUSVZJVFksIFdJTkRPV0lOR19NT0RFX0ZVTExTQ1JFRU4pOworICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoTEFORFNDQVBFX09SSUVOVEFUSU9OX0FDVElWSVRZLCB0cnVlIC8qIHZpc2libGUgKi8pOworCisgICAgICAgIGFzc2VydExpZmVjeWNsZUNvdW50cyhQT1JUUkFJVF9PUklFTlRBVElPTl9BQ1RJVklUWSwgbG9nU2VwYXJhdG9yLCAxIC8qIGNyZWF0ZSAqLywKKyAgICAgICAgICAgICAgICAxIC8qIHN0YXJ0ICovLCAxIC8qIHJlc3VtZSAqLywgMSAvKiBwYXVzZSAqLywgMSAvKiBzdG9wICovLCAwIC8qIGRlc3Ryb3kgKi8sCisgICAgICAgICAgICAgICAgMCAvKiBjb25maWcgKi8pOworICAgICAgICBhc3NlcnRMaWZlY3ljbGVDb3VudHMoTEFORFNDQVBFX09SSUVOVEFUSU9OX0FDVElWSVRZLCBsb2dTZXBhcmF0b3IsIDEgLyogY3JlYXRlICovLAorICAgICAgICAgICAgICAgIDEgLyogc3RhcnQgKi8sIDEgLyogcmVzdW1lICovLCAwIC8qIHBhdXNlICovLCAwIC8qIHN0b3AgKi8sIDAgLyogZGVzdHJveSAqLywKKyAgICAgICAgICAgICAgICAwIC8qIGNvbmZpZyAqLyk7CisKKyAgICAgICAgbGF1bmNoQWN0aXZpdHkoUE9SVFJBSVRfT1JJRU5UQVRJT05fQUNUSVZJVFksIFdJTkRPV0lOR19NT0RFX0ZVTExTQ1JFRU4pOworICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoUE9SVFJBSVRfT1JJRU5UQVRJT05fQUNUSVZJVFksIHRydWUgLyogdmlzaWJsZSAqLyk7CisKKyAgICAgICAgYXNzZXJ0TGlmZWN5Y2xlQ291bnRzKFBPUlRSQUlUX09SSUVOVEFUSU9OX0FDVElWSVRZLCBsb2dTZXBhcmF0b3IsIDIgLyogY3JlYXRlICovLAorICAgICAgICAgICAgICAgIDIgLyogc3RhcnQgKi8sIDIgLyogcmVzdW1lICovLCAxIC8qIHBhdXNlICovLCAxIC8qIHN0b3AgKi8sIDAgLyogZGVzdHJveSAqLywKKyAgICAgICAgICAgICAgICAwIC8qIGNvbmZpZyAqLyk7CisgICAgICAgIGFzc2VydExpZmVjeWNsZUNvdW50cyhMQU5EU0NBUEVfT1JJRU5UQVRJT05fQUNUSVZJVFksIGxvZ1NlcGFyYXRvciwgMSAvKiBjcmVhdGUgKi8sCisgICAgICAgICAgICAgICAgMSAvKiBzdGFydCAqLywgMSAvKiByZXN1bWUgKi8sIDEgLyogcGF1c2UgKi8sIDEgLyogc3RvcCAqLywgMCAvKiBkZXN0cm95ICovLAorICAgICAgICAgICAgICAgIDAgLyogY29uZmlnICovKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoYXQgZGV2aWNlIG9yaWVudGF0aW9uIGlzIHJlc3RvcmVkIHdoZW4gYW4gYWN0aXZpdHkgdGhhdCByZXF1ZXN0cyBpdCBpcyBubyBsb25nZXIKKyAgICAgKiB2aXNpYmxlLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFwcE9yaWVudGF0aW9uUmVxdWVzdENvbmZpZ0NsZWFycygpIHsKKyAgICAgICAgYXNzdW1lVHJ1ZSgiU2tpcHBpbmcgdGVzdDogbm8gcm90YXRpb24gc3VwcG9ydCIsIHN1cHBvcnRzUm90YXRpb24oKSk7CisKKyAgICAgICAgTG9nU2VwYXJhdG9yIGxvZ1NlcGFyYXRvciA9IHNlcGFyYXRlTG9ncygpOworICAgICAgICBsYXVuY2hBY3Rpdml0eShURVNUX0FDVElWSVRZKTsKKyAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFRFU1RfQUNUSVZJVFksIHRydWUgLyogdmlzaWJsZSAqLyk7CisgICAgICAgIGZpbmFsIFJlcG9ydGVkU2l6ZXMgaW5pdGlhbFJlcG9ydGVkU2l6ZXMgPQorICAgICAgICAgICAgICAgIGdldExhc3RSZXBvcnRlZFNpemVzRm9yQWN0aXZpdHkoVEVTVF9BQ1RJVklUWSwgbG9nU2VwYXJhdG9yKTsKKyAgICAgICAgZmluYWwgaW50ICBpbml0aWFsT3JpZW50YXRpb24gPSBpbml0aWFsUmVwb3J0ZWRTaXplcy5vcmllbnRhdGlvbjsKKworCisgICAgICAgIC8vIExhdW5jaCBhbiBhY3Rpdml0eSB0aGF0IHJlcXVlc3RzIGRpZmZlcmVudCBvcmllbnRhdGlvbiBhbmQgY2hlY2sgdGhhdCBpdCB3aWxsIGJlIGFwcGxpZWQKKyAgICAgICAgZmluYWwgYm9vbGVhbiBsYXVuY2hpbmdQb3J0cmFpdDsKKyAgICAgICAgaWYgKGluaXRpYWxPcmllbnRhdGlvbiA9PSAyIC8qIGxhbmRzY2FwZSAqLykgeworICAgICAgICAgICAgbGF1bmNoaW5nUG9ydHJhaXQgPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKGluaXRpYWxPcmllbnRhdGlvbiA9PSAxIC8qIHBvcnRyYWl0ICovKSB7CisgICAgICAgICAgICBsYXVuY2hpbmdQb3J0cmFpdCA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBvcmllbnRhdGlvbiB2YWx1ZTogIiArIGluaXRpYWxPcmllbnRhdGlvbik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgQ29tcG9uZW50TmFtZSBkaWZmZXJlbnRPcmllbnRhdGlvbkFjdGl2aXR5ID0gbGF1bmNoaW5nUG9ydHJhaXQKKyAgICAgICAgICAgICAgICA/IFBPUlRSQUlUX09SSUVOVEFUSU9OX0FDVElWSVRZIDogTEFORFNDQVBFX09SSUVOVEFUSU9OX0FDVElWSVRZOworICAgICAgICBsb2dTZXBhcmF0b3IgPSBzZXBhcmF0ZUxvZ3MoKTsKKyAgICAgICAgbGF1bmNoQWN0aXZpdHkoZGlmZmVyZW50T3JpZW50YXRpb25BY3Rpdml0eSk7CisgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShkaWZmZXJlbnRPcmllbnRhdGlvbkFjdGl2aXR5LCB0cnVlIC8qIHZpc2libGUgKi8pOworICAgICAgICBmaW5hbCBSZXBvcnRlZFNpemVzIHJvdGF0ZWRSZXBvcnRlZFNpemVzID0KKyAgICAgICAgICAgICAgICBnZXRMYXN0UmVwb3J0ZWRTaXplc0ZvckFjdGl2aXR5KGRpZmZlcmVudE9yaWVudGF0aW9uQWN0aXZpdHksIGxvZ1NlcGFyYXRvcik7CisgICAgICAgIGFzc2VydEVxdWFscygiQXBwbGllZCBvcmllbnRhdGlvbiBtdXN0IGNvcnJlc3BvbmQgdG8gYWN0aXZpdHkgcmVxdWVzdCIsCisgICAgICAgICAgICAgICAgbGF1bmNoaW5nUG9ydHJhaXQgPyAxIDogMiwgcm90YXRlZFJlcG9ydGVkU2l6ZXMub3JpZW50YXRpb24pOworCisgICAgICAgIC8vIExhdW5jaCBhbm90aGVyIGFjdGl2aXR5IG9uIHRvcCBhbmQgY2hlY2sgdGhhdCBpdHMgb3JpZW50YXRpb24gaXMgbm90IGFmZmVjdGVkIGJ5IHByZXZpb3VzCisgICAgICAgIC8vIGFjdGl2aXR5LgorICAgICAgICBsb2dTZXBhcmF0b3IgPSBzZXBhcmF0ZUxvZ3MoKTsKKyAgICAgICAgbGF1bmNoQWN0aXZpdHkoUkVTSVpFQUJMRV9BQ1RJVklUWSk7CisgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShSRVNJWkVBQkxFX0FDVElWSVRZLCB0cnVlIC8qIHZpc2libGUgKi8pOworICAgICAgICBmaW5hbCBSZXBvcnRlZFNpemVzIGZpbmFsUmVwb3J0ZWRTaXplcyA9CisgICAgICAgICAgICAgICAgZ2V0TGFzdFJlcG9ydGVkU2l6ZXNGb3JBY3Rpdml0eShSRVNJWkVBQkxFX0FDVElWSVRZLCBsb2dTZXBhcmF0b3IpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkFwcGxpZWQgb3JpZW50YXRpb24gbXVzdCBub3QgYmUgaW5mbHVlbmNlZCBieSBwcmV2aW91c2x5IHZpc2libGUgYWN0aXZpdHkiLAorICAgICAgICAgICAgICAgIGluaXRpYWxPcmllbnRhdGlvbiwgZmluYWxSZXBvcnRlZFNpemVzLm9yaWVudGF0aW9uKTsKKyAgICB9CisKKyAgICAvLyBUT0RPKGIvNzA4NzAyNTMpOiBUaGlzIHRlc3Qgc2VlbXMgbWFsZnVuY3Rpb24uCisgICAgQElnbm9yZSgiYi83MDg3MDI1MyIpCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uRnVsbHNjcmVlbkFjdGl2aXR5UHJvaGliaXRlZCgpIHsKKyAgICAgICAgLy8gV2UgZG8gbm90IHdhaXQgZm9yIHRoZSBhY3Rpdml0eSBhcyBpdCBzaG91bGQgbm90IGxhdW5jaCBiYXNlZCBvbiB0aGUgcmVzdHJpY3Rpb25zIGFyb3VuZAorICAgICAgICAvLyBzcGVjaWZ5aW5nIG9yaWVudGF0aW9uLiBXZSBpbnN0ZWFkIHN0YXJ0IGFuIGFjdGl2aXR5IGtub3duIHRvIGxhdW5jaCBpbW1lZGlhdGVseSBhZnRlcgorICAgICAgICAvLyBzbyB0aGF0IHdlIGNhbiBlbnN1cmUgcHJvY2Vzc2luZyB0aGUgZmlyc3QgYWN0aXZpdHkgb2NjdXJyZWQuCisgICAgICAgIGxhdW5jaEFjdGl2aXR5Tm9XYWl0KFRSQU5TTFVDRU5UX0xBTkRTQ0FQRV9BQ1RJVklUWSk7CisgICAgICAgIGxhdW5jaEFjdGl2aXR5KFBPUlRSQUlUX09SSUVOVEFUSU9OX0FDVElWSVRZKTsKKworICAgICAgICBhc3NlcnRGYWxzZSgidGFyZ2V0IFNESyA+IDI2IG5vbi1mdWxsc2NyZWVuIGFjdGl2aXR5IHNob3VsZCBub3QgcmVhY2ggb25SZXN1bWUiLAorICAgICAgICAgICAgICAgIG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmNvbnRhaW5zQWN0aXZpdHkoVFJBTlNMVUNFTlRfTEFORFNDQVBFX0FDVElWSVRZKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uRnVsbHNjcmVlbkFjdGl2aXR5UGVybWl0dGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmKCFzdXBwb3J0c1JvdGF0aW9uKCkpIHsKKyAgICAgICAgICAgIC8vY2Fubm90IHBoeXNpY2FsbHkgcm90YXRlIHRoZSBzY3JlZW4gb24gYXV0b21vdGl2ZSBkZXZpY2UsIHNraXAKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0cnkgKGZpbmFsIFJvdGF0aW9uU2Vzc2lvbiByb3RhdGlvblNlc3Npb24gPSBuZXcgUm90YXRpb25TZXNzaW9uKCkpIHsKKyAgICAgICAgICAgIHJvdGF0aW9uU2Vzc2lvbi5zZXQoUk9UQVRJT05fMCk7CisKKyAgICAgICAgICAgIGxhdW5jaEFjdGl2aXR5KFNESzI2X1RSQU5TTFVDRU5UX0xBTkRTQ0FQRV9BQ1RJVklUWSk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFJlc3VtZWRBY3Rpdml0eSgKKyAgICAgICAgICAgICAgICAgICAgInRhcmdldCBTREsgPD0gMjYgbm9uLWZ1bGxzY3JlZW4gYWN0aXZpdHkgc2hvdWxkIGJlIGFsbG93ZWQgdG8gbGF1bmNoIiwKKyAgICAgICAgICAgICAgICAgICAgU0RLMjZfVFJBTlNMVUNFTlRfTEFORFNDQVBFX0FDVElWSVRZKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygibm9uLWZ1bGxzY3JlZW4gYWN0aXZpdHkgcmVxdWVzdGVkIGxhbmRzY2FwZSBvcmllbnRhdGlvbiIsCisgICAgICAgICAgICAgICAgICAgIDAgLyogbGFuZHNjYXBlICovLCBtQW1XbVN0YXRlLmdldFdtU3RhdGUoKS5nZXRMYXN0T3JpZW50YXRpb24oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoYXQgZGV2aWNlIGhhbmRsZXMgbW92aW5nIGJldHdlZW4gdHdvIHRhc2tzIHdpdGggZGlmZmVyZW50IG9yaWVudGF0aW9ucy4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUYXNrQ2xvc2VSZXN0b3JlRml4ZWRPcmllbnRhdGlvbigpIHsKKyAgICAgICAgYXNzdW1lVHJ1ZSgiU2tpcHBpbmcgdGVzdDogbm8gcm90YXRpb24gc3VwcG9ydCIsIHN1cHBvcnRzUm90YXRpb24oKSk7CisKKyAgICAgICAgLy8gU3RhcnQgbGFuZHNjYXBlIGFjdGl2aXR5LgorICAgICAgICBsYXVuY2hBY3Rpdml0eShMQU5EU0NBUEVfT1JJRU5UQVRJT05fQUNUSVZJVFkpOworICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoTEFORFNDQVBFX09SSUVOVEFUSU9OX0FDVElWSVRZLCB0cnVlIC8qIHZpc2libGUgKi8pOworICAgICAgICBhc3NlcnRFcXVhbHMoIkZ1bGxzY3JlZW4gYXBwIHJlcXVlc3RlZCBsYW5kc2NhcGUgb3JpZW50YXRpb24iLAorICAgICAgICAgICAgICAgIDAgLyogbGFuZHNjYXBlICovLCBtQW1XbVN0YXRlLmdldFdtU3RhdGUoKS5nZXRMYXN0T3JpZW50YXRpb24oKSk7CisKKyAgICAgICAgLy8gU3RhcnQgYW5vdGhlciBhY3Rpdml0eSBpbiBhIGRpZmZlcmVudCB0YXNrLgorICAgICAgICBsYXVuY2hBY3Rpdml0eUluTmV3VGFzayhCUk9BRENBU1RfUkVDRUlWRVJfQUNUSVZJVFkpOworCisgICAgICAgIC8vIFJlcXVlc3QgcG9ydHJhaXQKKyAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChSRVFVRVNUX1BPUlRSQUlUX0JST0FEQ0FTVCk7CisgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvckxhc3RPcmllbnRhdGlvbihTQ1JFRU5fT1JJRU5UQVRJT05fUE9SVFJBSVQpOworICAgICAgICB3YWl0Rm9yQnJvYWRjYXN0QWN0aXZpdHlSZWFkeShTQ1JFRU5fT1JJRU5UQVRJT05fUE9SVFJBSVQpOworCisgICAgICAgIC8vIEZpbmlzaCBhY3Rpdml0eQorICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKEZJTklTSF9BQ1RJVklUWV9CUk9BRENBU1QpOworCisgICAgICAgIC8vIFZlcmlmeSB0aGF0IGFjdGl2aXR5IGJyb3VnaHQgdG8gZnJvbnQgaXMgaW4gb3JpZ2luYWxseSByZXF1ZXN0ZWQgb3JpZW50YXRpb24uCisgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKExBTkRTQ0FQRV9PUklFTlRBVElPTl9BQ1RJVklUWSk7CisgICAgICAgIGFzc2VydEVxdWFscygiU2hvdWxkIHJldHVybiB0byBhcHAgaW4gbGFuZHNjYXBlIG9yaWVudGF0aW9uIiwKKyAgICAgICAgICAgICAgICAwIC8qIGxhbmRzY2FwZSAqLywgbUFtV21TdGF0ZS5nZXRXbVN0YXRlKCkuZ2V0TGFzdE9yaWVudGF0aW9uKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhhdCBkZXZpY2UgaGFuZGxlcyBtb3ZpbmcgYmV0d2VlbiB0d28gdGFza3Mgd2l0aCBkaWZmZXJlbnQgb3JpZW50YXRpb25zLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRhc2tDbG9zZVJlc3RvcmVGcmVlT3JpZW50YXRpb24oKSB7CisgICAgICAgIGFzc3VtZVRydWUoIlNraXBwaW5nIHRlc3Q6IG5vIHJvdGF0aW9uIHN1cHBvcnQiLCBzdXBwb3J0c1JvdGF0aW9uKCkpOworCisgICAgICAgIC8vIFN0YXJ0IGxhbmRzY2FwZSBhY3Rpdml0eS4KKyAgICAgICAgbGF1bmNoQWN0aXZpdHkoUkVTSVpFQUJMRV9BQ1RJVklUWSk7CisgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShSRVNJWkVBQkxFX0FDVElWSVRZLCB0cnVlIC8qIHZpc2libGUgKi8pOworICAgICAgICBmaW5hbCBpbnQgaW5pdGlhbFNlcnZlck9yaWVudGF0aW9uID0gbUFtV21TdGF0ZS5nZXRXbVN0YXRlKCkuZ2V0TGFzdE9yaWVudGF0aW9uKCk7CisKKyAgICAgICAgLy8gVmVyaWZ5IGZpeGVkLWxhbmRzY2FwZQorICAgICAgICBMb2dTZXBhcmF0b3IgbG9nU2VwYXJhdG9yID0gc2VwYXJhdGVMb2dzKCk7CisgICAgICAgIGxhdW5jaEFjdGl2aXR5SW5OZXdUYXNrKEJST0FEQ0FTVF9SRUNFSVZFUl9BQ1RJVklUWSk7CisgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoUkVRVUVTVF9MQU5EU0NBUEVfQlJPQURDQVNUKTsKKyAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yTGFzdE9yaWVudGF0aW9uKFNDUkVFTl9PUklFTlRBVElPTl9MQU5EU0NBUEUpOworICAgICAgICB3YWl0Rm9yQnJvYWRjYXN0QWN0aXZpdHlSZWFkeShTQ1JFRU5fT1JJRU5UQVRJT05fTEFORFNDQVBFKTsKKyAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChGSU5JU0hfQUNUSVZJVFlfQlJPQURDQVNUKTsKKworICAgICAgICAvLyBWZXJpZnkgdGhhdCBhY3Rpdml0eSBicm91Z2h0IHRvIGZyb250IGlzIGluIG9yaWdpbmFsbHkgcmVxdWVzdGVkIG9yaWVudGF0aW9uLgorICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JBY3Rpdml0eVN0YXRlKFJFU0laRUFCTEVfQUNUSVZJVFksIFNUQVRFX1JFU1VNRUQpOworICAgICAgICBSZXBvcnRlZFNpemVzIHJlcG9ydGVkU2l6ZXMgPSBnZXRMYXN0UmVwb3J0ZWRTaXplc0ZvckFjdGl2aXR5KFJFU0laRUFCTEVfQUNUSVZJVFksCisgICAgICAgICAgICAgICAgbG9nU2VwYXJhdG9yKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiU2hvdWxkIGNvbWUgYmFjayBpbiBvcmlnaW5hbCBvcmllbnRhdGlvbiIsIHJlcG9ydGVkU2l6ZXMpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlNob3VsZCBjb21lIGJhY2sgaW4gb3JpZ2luYWwgc2VydmVyIG9yaWVudGF0aW9uIiwKKyAgICAgICAgICAgICAgICBpbml0aWFsU2VydmVyT3JpZW50YXRpb24sIG1BbVdtU3RhdGUuZ2V0V21TdGF0ZSgpLmdldExhc3RPcmllbnRhdGlvbigpKTsKKyAgICAgICAgYXNzZXJ0UmVsYXVuY2hPckNvbmZpZ0NoYW5nZWQoUkVTSVpFQUJMRV9BQ1RJVklUWSwgMCAvKiBudW1SZWxhdW5jaCAqLywKKyAgICAgICAgICAgICAgICAwIC8qIG51bUNvbmZpZ0NoYW5nZSAqLywgbG9nU2VwYXJhdG9yKTsKKworICAgICAgICAvLyBWZXJpZnkgZml4ZWQtcG9ydHJhaXQKKyAgICAgICAgbG9nU2VwYXJhdG9yID0gc2VwYXJhdGVMb2dzKCk7CisgICAgICAgIGxhdW5jaEFjdGl2aXR5SW5OZXdUYXNrKEJST0FEQ0FTVF9SRUNFSVZFUl9BQ1RJVklUWSk7CisgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoUkVRVUVTVF9QT1JUUkFJVF9CUk9BRENBU1QpOworICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JMYXN0T3JpZW50YXRpb24oU0NSRUVOX09SSUVOVEFUSU9OX1BPUlRSQUlUKTsKKyAgICAgICAgd2FpdEZvckJyb2FkY2FzdEFjdGl2aXR5UmVhZHkoU0NSRUVOX09SSUVOVEFUSU9OX1BPUlRSQUlUKTsKKyAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChGSU5JU0hfQUNUSVZJVFlfQlJPQURDQVNUKTsKKworICAgICAgICAvLyBWZXJpZnkgdGhhdCBhY3Rpdml0eSBicm91Z2h0IHRvIGZyb250IGlzIGluIG9yaWdpbmFsbHkgcmVxdWVzdGVkIG9yaWVudGF0aW9uLgorICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JBY3Rpdml0eVN0YXRlKFJFU0laRUFCTEVfQUNUSVZJVFksIFNUQVRFX1JFU1VNRUQpOworICAgICAgICByZXBvcnRlZFNpemVzID0gZ2V0TGFzdFJlcG9ydGVkU2l6ZXNGb3JBY3Rpdml0eShSRVNJWkVBQkxFX0FDVElWSVRZLCBsb2dTZXBhcmF0b3IpOworICAgICAgICBhc3NlcnROdWxsKCJTaG91bGQgY29tZSBiYWNrIGluIG9yaWdpbmFsIG9yaWVudGF0aW9uIiwgcmVwb3J0ZWRTaXplcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiU2hvdWxkIGNvbWUgYmFjayBpbiBvcmlnaW5hbCBzZXJ2ZXIgb3JpZW50YXRpb24iLAorICAgICAgICAgICAgICAgIGluaXRpYWxTZXJ2ZXJPcmllbnRhdGlvbiwgbUFtV21TdGF0ZS5nZXRXbVN0YXRlKCkuZ2V0TGFzdE9yaWVudGF0aW9uKCkpOworICAgICAgICBhc3NlcnRSZWxhdW5jaE9yQ29uZmlnQ2hhbmdlZChSRVNJWkVBQkxFX0FDVElWSVRZLCAwIC8qIG51bVJlbGF1bmNoICovLAorICAgICAgICAgICAgICAgIDAgLyogbnVtQ29uZmlnQ2hhbmdlICovLCBsb2dTZXBhcmF0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhhdCBhY3Rpdml0eSBvcmllbnRhdGlvbiB3aWxsIGNoYW5nZSB3aGVuIGRldmljZSBpcyByb3RhdGVkLgorICAgICAqIEFsc28gdmVyaWZ5IHRoYXQgb2NjbHVkZWQgYWN0aXZpdHkgd2lsbCBub3QgZ2V0IGNvbmZpZyBjaGFuZ2VzLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFwcE9yaWVudGF0aW9uV2hlblJvdGF0aW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc3VtZVRydWUoIlNraXBwaW5nIHRlc3Q6IG5vIHJvdGF0aW9uIHN1cHBvcnQiLCBzdXBwb3J0c1JvdGF0aW9uKCkpOworCisgICAgICAgIC8vIFN0YXJ0IHJlc2l6ZWFibGUgYWN0aXZpdHkgdGhhdCBoYW5kbGVzIGNvbmZpZ3VyYXRpb24gY2hhbmdlcy4KKyAgICAgICAgTG9nU2VwYXJhdG9yIGxvZ1NlcGFyYXRvciA9IHNlcGFyYXRlTG9ncygpOworICAgICAgICBsYXVuY2hBY3Rpdml0eShURVNUX0FDVElWSVRZKTsKKyAgICAgICAgbGF1bmNoQWN0aXZpdHkoUkVTSVpFQUJMRV9BQ1RJVklUWSk7CisgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShSRVNJWkVBQkxFX0FDVElWSVRZLCB0cnVlIC8qIHZpc2libGUgKi8pOworCisgICAgICAgIGZpbmFsIGludCBkaXNwbGF5SWQgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXREaXNwbGF5QnlBY3Rpdml0eShSRVNJWkVBQkxFX0FDVElWSVRZKTsKKworICAgICAgICAvLyBSb3RhdGUgdGhlIGFjdGl2aXR5IGFuZCBjaGVjayB0aGF0IGl0IHJlY2VpdmVzIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyB3aXRoIGEgZGlmZmVyZW50CisgICAgICAgIC8vIG9yaWVudGF0aW9uIGVhY2ggdGltZS4KKyAgICAgICAgdHJ5IChmaW5hbCBSb3RhdGlvblNlc3Npb24gcm90YXRpb25TZXNzaW9uID0gbmV3IFJvdGF0aW9uU2Vzc2lvbigpKSB7CisgICAgICAgICAgICBhc3N1bWVUcnVlKCJTa2lwcGluZyB0ZXN0OiBubyBsb2NrZWQgdXNlciByb3RhdGlvbiBtb2RlIHN1cHBvcnQuIiwKKyAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHNMb2NrZWRVc2VyUm90YXRpb24ocm90YXRpb25TZXNzaW9uLCBkaXNwbGF5SWQpKTsKKworICAgICAgICAgICAgcm90YXRpb25TZXNzaW9uLnNldChST1RBVElPTl8wKTsKKyAgICAgICAgICAgIFJlcG9ydGVkU2l6ZXMgcmVwb3J0ZWRTaXplcyA9CisgICAgICAgICAgICAgICAgICAgIGdldExhc3RSZXBvcnRlZFNpemVzRm9yQWN0aXZpdHkoUkVTSVpFQUJMRV9BQ1RJVklUWSwgbG9nU2VwYXJhdG9yKTsKKyAgICAgICAgICAgIGludCBwcmV2T3JpZW50YXRpb24gPSByZXBvcnRlZFNpemVzLm9yaWVudGF0aW9uOworCisgICAgICAgICAgICBmaW5hbCBpbnRbXSByb3RhdGlvbnMgPSB7IFJPVEFUSU9OXzI3MCwgUk9UQVRJT05fMTgwLCBST1RBVElPTl85MCwgUk9UQVRJT05fMCB9OworICAgICAgICAgICAgZm9yIChmaW5hbCBpbnQgcm90YXRpb24gOiByb3RhdGlvbnMpIHsKKyAgICAgICAgICAgICAgICBsb2dTZXBhcmF0b3IgPSBzZXBhcmF0ZUxvZ3MoKTsKKyAgICAgICAgICAgICAgICByb3RhdGlvblNlc3Npb24uc2V0KHJvdGF0aW9uKTsKKworICAgICAgICAgICAgICAgIC8vIFZlcmlmeSBsaWZlY3ljbGUgY291bnQgYW5kIG9yaWVudGF0aW9uIGNoYW5nZXMuCisgICAgICAgICAgICAgICAgYXNzZXJ0UmVsYXVuY2hPckNvbmZpZ0NoYW5nZWQoUkVTSVpFQUJMRV9BQ1RJVklUWSwgMCAvKiBudW1SZWxhdW5jaCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIDEgLyogbnVtQ29uZmlnQ2hhbmdlICovLCBsb2dTZXBhcmF0b3IpOworICAgICAgICAgICAgICAgIHJlcG9ydGVkU2l6ZXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TGFzdFJlcG9ydGVkU2l6ZXNGb3JBY3Rpdml0eShSRVNJWkVBQkxFX0FDVElWSVRZLCBsb2dTZXBhcmF0b3IpOworICAgICAgICAgICAgICAgIGFzc2VydE5vdEVxdWFscyhwcmV2T3JpZW50YXRpb24sIHJlcG9ydGVkU2l6ZXMub3JpZW50YXRpb24pOworICAgICAgICAgICAgICAgIGFzc2VydFJlbGF1bmNoT3JDb25maWdDaGFuZ2VkKFRFU1RfQUNUSVZJVFksIDAgLyogbnVtUmVsYXVuY2ggKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIG51bUNvbmZpZ0NoYW5nZSAqLywgbG9nU2VwYXJhdG9yKTsKKworICAgICAgICAgICAgICAgIHByZXZPcmllbnRhdGlvbiA9IHJlcG9ydGVkU2l6ZXMub3JpZW50YXRpb247CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoYXQgYWN0aXZpdHkgb3JpZW50YXRpb24gd2lsbCBub3QgY2hhbmdlIHdoZW4gdHJ5aW5nIHRvIHJvdGF0ZSBmaXhlZC1vcmllbnRhdGlvbgorICAgICAqIGFjdGl2aXR5LgorICAgICAqIEFsc28gdmVyaWZ5IHRoYXQgb2NjbHVkZWQgYWN0aXZpdHkgd2lsbCBub3QgZ2V0IGNvbmZpZyBjaGFuZ2VzLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZpeGVkT3JpZW50YXRpb25XaGVuUm90YXRpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzdW1lVHJ1ZSgiU2tpcHBpbmcgdGVzdDogbm8gcm90YXRpb24gc3VwcG9ydCIsIHN1cHBvcnRzUm90YXRpb24oKSk7CisgICAgICAgIC8vIFRPRE8oYi8xMTA1MzMyMjYpOiBGaXggdGVzdCBvbiBkZXZpY2VzIHdpdGggZGlzcGxheSBjdXRvdXQKKyAgICAgICAgYXNzdW1lRmFsc2UoIlNraXBwaW5nIHRlc3Q6IGRpc3BsYXkgY3V0b3V0IHByZXNlbnQsIGNhbid0IHByZWRpY3QgZXhhY3QgbGlmZWN5Y2xlIiwKKyAgICAgICAgICAgICAgICBoYXNEaXNwbGF5Q3V0b3V0KCkpOworCisgICAgICAgIC8vIFN0YXJ0IHBvcnRyYWl0LWZpeGVkIGFjdGl2aXR5CisgICAgICAgIExvZ1NlcGFyYXRvciBsb2dTZXBhcmF0b3IgPSBzZXBhcmF0ZUxvZ3MoKTsKKyAgICAgICAgbGF1bmNoQWN0aXZpdHkoUkVTSVpFQUJMRV9BQ1RJVklUWSk7CisgICAgICAgIGxhdW5jaEFjdGl2aXR5KFBPUlRSQUlUX09SSUVOVEFUSU9OX0FDVElWSVRZKTsKKyAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFBPUlRSQUlUX09SSUVOVEFUSU9OX0FDVElWSVRZLCB0cnVlIC8qIHZpc2libGUgKi8pOworCisgICAgICAgIGZpbmFsIGludCBkaXNwbGF5SWQgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKQorICAgICAgICAgICAgICAgIC5nZXREaXNwbGF5QnlBY3Rpdml0eShQT1JUUkFJVF9PUklFTlRBVElPTl9BQ1RJVklUWSk7CisKKyAgICAgICAgLy8gUm90YXRlIHRoZSBhY3Rpdml0eSBhbmQgY2hlY2sgdGhhdCB0aGUgb3JpZW50YXRpb24gZG9lc24ndCBjaGFuZ2UKKyAgICAgICAgdHJ5IChmaW5hbCBSb3RhdGlvblNlc3Npb24gcm90YXRpb25TZXNzaW9uID0gbmV3IFJvdGF0aW9uU2Vzc2lvbigpKSB7CisgICAgICAgICAgICBhc3N1bWVUcnVlKCJTa2lwcGluZyB0ZXN0OiBubyB1c2VyIGxvY2tlZCByb3RhdGlvbiBzdXBwb3J0LiIsCisgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRzTG9ja2VkVXNlclJvdGF0aW9uKHJvdGF0aW9uU2Vzc2lvbiwgZGlzcGxheUlkKSk7CisKKyAgICAgICAgICAgIHJvdGF0aW9uU2Vzc2lvbi5zZXQoUk9UQVRJT05fMCk7CisKKyAgICAgICAgICAgIGZpbmFsIGludFtdIHJvdGF0aW9ucyA9IHsgUk9UQVRJT05fMjcwLCBST1RBVElPTl8xODAsIFJPVEFUSU9OXzkwLCBST1RBVElPTl8wIH07CisgICAgICAgICAgICBmb3IgKGZpbmFsIGludCByb3RhdGlvbiA6IHJvdGF0aW9ucykgeworICAgICAgICAgICAgICAgIGxvZ1NlcGFyYXRvciA9IHNlcGFyYXRlTG9ncygpOworICAgICAgICAgICAgICAgIHJvdGF0aW9uU2Vzc2lvbi5zZXQocm90YXRpb24pOworCisgICAgICAgICAgICAgICAgLy8gVmVyaWZ5IGxpZmVjeWNsZSBjb3VudCBhbmQgb3JpZW50YXRpb24gY2hhbmdlcy4KKyAgICAgICAgICAgICAgICBhc3NlcnRSZWxhdW5jaE9yQ29uZmlnQ2hhbmdlZChQT1JUUkFJVF9PUklFTlRBVElPTl9BQ1RJVklUWSwgMCAvKiBudW1SZWxhdW5jaCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogbnVtQ29uZmlnQ2hhbmdlICovLCBsb2dTZXBhcmF0b3IpOworICAgICAgICAgICAgICAgIGZpbmFsIFJlcG9ydGVkU2l6ZXMgcmVwb3J0ZWRTaXplcyA9IGdldExhc3RSZXBvcnRlZFNpemVzRm9yQWN0aXZpdHkoCisgICAgICAgICAgICAgICAgICAgICAgICBQT1JUUkFJVF9PUklFTlRBVElPTl9BQ1RJVklUWSwgbG9nU2VwYXJhdG9yKTsKKyAgICAgICAgICAgICAgICBhc3NlcnROdWxsKCJObyBuZXcgc2l6ZXMgbXVzdCBiZSByZXBvcnRlZCIsIHJlcG9ydGVkU2l6ZXMpOworICAgICAgICAgICAgICAgIGFzc2VydFJlbGF1bmNoT3JDb25maWdDaGFuZ2VkKFJFU0laRUFCTEVfQUNUSVZJVFksIDAgLyogbnVtUmVsYXVuY2ggKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIG51bUNvbmZpZ0NoYW5nZSAqLywgbG9nU2VwYXJhdG9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhhdCBkZXZpY2UgaGFuZGxlcyBtb3ZpbmcgYmV0d2VlbiB0d28gdGFza3Mgd2l0aCBkaWZmZXJlbnQgb3JpZW50YXRpb25zLgorICAgICAqLworICAgIEBQcmVzdWJtaXQKKyAgICBAVGVzdAorICAgIEBGbGFreVRlc3QoYnVnSWQgPSA3MTc5MjM5MykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGFza01vdmVUb0JhY2tPcmllbnRhdGlvbigpIHsKKyAgICAgICAgYXNzdW1lVHJ1ZSgiU2tpcHBpbmcgdGVzdDogbm8gcm90YXRpb24gc3VwcG9ydCIsIHN1cHBvcnRzUm90YXRpb24oKSk7CisKKyAgICAgICAgLy8gU3RhcnQgbGFuZHNjYXBlIGFjdGl2aXR5LgorICAgICAgICBsYXVuY2hBY3Rpdml0eShMQU5EU0NBUEVfT1JJRU5UQVRJT05fQUNUSVZJVFkpOworICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoTEFORFNDQVBFX09SSUVOVEFUSU9OX0FDVElWSVRZLCB0cnVlIC8qIHZpc2libGUgKi8pOworICAgICAgICBhc3NlcnRFcXVhbHMoIkZ1bGxzY3JlZW4gYXBwIHJlcXVlc3RlZCBsYW5kc2NhcGUgb3JpZW50YXRpb24iLAorICAgICAgICAgICAgICAgIDAgLyogbGFuZHNjYXBlICovLCBtQW1XbVN0YXRlLmdldFdtU3RhdGUoKS5nZXRMYXN0T3JpZW50YXRpb24oKSk7CisKKyAgICAgICAgLy8gU3RhcnQgYW5vdGhlciBhY3Rpdml0eSBpbiBhIGRpZmZlcmVudCB0YXNrLgorICAgICAgICBsYXVuY2hBY3Rpdml0eUluTmV3VGFzayhCUk9BRENBU1RfUkVDRUlWRVJfQUNUSVZJVFkpOworCisgICAgICAgIC8vIFJlcXVlc3QgcG9ydHJhaXQKKyAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChSRVFVRVNUX1BPUlRSQUlUX0JST0FEQ0FTVCk7CisgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvckxhc3RPcmllbnRhdGlvbihTQ1JFRU5fT1JJRU5UQVRJT05fUE9SVFJBSVQpOworICAgICAgICB3YWl0Rm9yQnJvYWRjYXN0QWN0aXZpdHlSZWFkeShTQ1JFRU5fT1JJRU5UQVRJT05fUE9SVFJBSVQpOworCisgICAgICAgIC8vIEZpbmlzaCBhY3Rpdml0eQorICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKE1PVkVfVEFTS19UT19CQUNLX0JST0FEQ0FTVCk7CisKKyAgICAgICAgLy8gVmVyaWZ5IHRoYXQgYWN0aXZpdHkgYnJvdWdodCB0byBmcm9udCBpcyBpbiBvcmlnaW5hbGx5IHJlcXVlc3RlZCBvcmllbnRhdGlvbi4KKyAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yVmFsaWRTdGF0ZShMQU5EU0NBUEVfT1JJRU5UQVRJT05fQUNUSVZJVFkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlNob3VsZCByZXR1cm4gdG8gYXBwIGluIGxhbmRzY2FwZSBvcmllbnRhdGlvbiIsCisgICAgICAgICAgICAgICAgMCAvKiBsYW5kc2NhcGUgKi8sIG1BbVdtU3RhdGUuZ2V0V21TdGF0ZSgpLmdldExhc3RPcmllbnRhdGlvbigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoYXQgZGV2aWNlIGRvZXNuJ3QgY2hhbmdlIGRldmljZSBvcmllbnRhdGlvbiBieSBhcHAgcmVxdWVzdCB3aGlsZSBpbiBtdWx0aS13aW5kb3cuCisgICAgICovCisgICAgQFByZXN1Ym1pdAorICAgIEBGbGFreVRlc3QoYnVnSWQgPSA3MTkxODczMSkKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTcGxpdHNjcmVlblBvcnRyYWl0QXBwT3JpZW50YXRpb25SZXF1ZXN0cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3N1bWVUcnVlKCJTa2lwcGluZyB0ZXN0OiBubyByb3RhdGlvbiBzdXBwb3J0Iiwgc3VwcG9ydHNSb3RhdGlvbigpKTsKKyAgICAgICAgYXNzdW1lVHJ1ZSgiU2tpcHBpbmcgdGVzdDogbm8gbXVsdGktd2luZG93IHN1cHBvcnQiLCBzdXBwb3J0c1NwbGl0U2NyZWVuTXVsdGlXaW5kb3coKSk7CisKKyAgICAgICAgdHJ5IChmaW5hbCBSb3RhdGlvblNlc3Npb24gcm90YXRpb25TZXNzaW9uID0gbmV3IFJvdGF0aW9uU2Vzc2lvbigpKSB7CisgICAgICAgICAgICByZXF1ZXN0T3JpZW50YXRpb25JblNwbGl0U2NyZWVuKHJvdGF0aW9uU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgUk9UQVRJT05fOTAgLyogcG9ydHJhaXQgKi8sIExBTkRTQ0FQRV9PUklFTlRBVElPTl9BQ1RJVklUWSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoYXQgZGV2aWNlIGRvZXNuJ3QgY2hhbmdlIGRldmljZSBvcmllbnRhdGlvbiBieSBhcHAgcmVxdWVzdCB3aGlsZSBpbiBtdWx0aS13aW5kb3cuCisgICAgICovCisgICAgQFByZXN1Ym1pdAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNwbGl0c2NyZWVuTGFuZHNjYXBlQXBwT3JpZW50YXRpb25SZXF1ZXN0cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3N1bWVUcnVlKCJTa2lwcGluZyB0ZXN0OiBubyBtdWx0aS13aW5kb3cgc3VwcG9ydCIsIHN1cHBvcnRzU3BsaXRTY3JlZW5NdWx0aVdpbmRvdygpKTsKKworICAgICAgICB0cnkgKGZpbmFsIFJvdGF0aW9uU2Vzc2lvbiByb3RhdGlvblNlc3Npb24gPSBuZXcgUm90YXRpb25TZXNzaW9uKCkpIHsKKyAgICAgICAgICAgIHJlcXVlc3RPcmllbnRhdGlvbkluU3BsaXRTY3JlZW4ocm90YXRpb25TZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICBST1RBVElPTl8wIC8qIGxhbmRzY2FwZSAqLywgUE9SVFJBSVRfT1JJRU5UQVRJT05fQUNUSVZJVFkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUm90YXRlIHRoZSBkZXZpY2UgYW5kIGxhdW5jaCBzcGVjaWZpZWQgYWN0aXZpdHkgaW4gc3BsaXQtc2NyZWVuLCBjaGVja2luZyBpZiBvcmllbnRhdGlvbgorICAgICAqIGRpZG4ndCBjaGFuZ2UuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlcXVlc3RPcmllbnRhdGlvbkluU3BsaXRTY3JlZW4oUm90YXRpb25TZXNzaW9uIHJvdGF0aW9uU2Vzc2lvbiwgaW50IG9yaWVudGF0aW9uLAorICAgICAgICAgICAgQ29tcG9uZW50TmFtZSBhY3Rpdml0eSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc3VtZVRydWUoIlNraXBwaW5nIHRlc3Q6IG5vIG11bHRpLXdpbmRvdyBzdXBwb3J0Iiwgc3VwcG9ydHNTcGxpdFNjcmVlbk11bHRpV2luZG93KCkpOworCisgICAgICAgIC8vIFNldCBpbml0aWFsIG9yaWVudGF0aW9uLgorICAgICAgICByb3RhdGlvblNlc3Npb24uc2V0KG9yaWVudGF0aW9uKTsKKworICAgICAgICAvLyBMYXVuY2ggYWN0aXZpdGllcyB0aGF0IHJlcXVlc3Qgb3JpZW50YXRpb25zIGFuZCBjaGVjayB0aGF0IGRldmljZSBkb2Vzbid0IHJvdGF0ZS4KKyAgICAgICAgbGF1bmNoQWN0aXZpdGllc0luU3BsaXRTY3JlZW4oCisgICAgICAgICAgICAgICAgZ2V0TGF1bmNoQWN0aXZpdHlCdWlsZGVyKCkuc2V0VGFyZ2V0QWN0aXZpdHkoTEFVTkNISU5HX0FDVElWSVRZKSwKKyAgICAgICAgICAgICAgICBnZXRMYXVuY2hBY3Rpdml0eUJ1aWxkZXIoKS5zZXRUYXJnZXRBY3Rpdml0eShhY3Rpdml0eSkuc2V0TXVsdGlwbGVUYXNrKHRydWUpKTsKKworICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoYWN0aXZpdHksIHRydWUgLyogdmlzaWJsZSAqLyk7CisgICAgICAgIGFzc2VydEVxdWFscygiU3BsaXQtc2NyZWVuIGFwcHMgc2hvdWxkbid0IGluZmx1ZW5jZSBkZXZpY2Ugb3JpZW50YXRpb24iLAorICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uLCBtQW1XbVN0YXRlLmdldFdtU3RhdGUoKS5nZXRSb3RhdGlvbigpKTsKKworICAgICAgICBnZXRMYXVuY2hBY3Rpdml0eUJ1aWxkZXIoKS5zZXRNdWx0aXBsZVRhc2sodHJ1ZSkuc2V0VGFyZ2V0QWN0aXZpdHkoYWN0aXZpdHkpLmV4ZWN1dGUoKTsKKyAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUoYWN0aXZpdHkpOworICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoYWN0aXZpdHksIHRydWUgLyogdmlzaWJsZSAqLyk7CisgICAgICAgIGFzc2VydEVxdWFscygiU3BsaXQtc2NyZWVuIGFwcHMgc2hvdWxkbid0IGluZmx1ZW5jZSBkZXZpY2Ugb3JpZW50YXRpb24iLAorICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uLCBtQW1XbVN0YXRlLmdldFdtU3RhdGUoKS5nZXRSb3RhdGlvbigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMYXVuY2hlcyBhY3Rpdml0eSBpbiBkb2NrZWQgc3RhY2ssIG1vdmVzIHRvIGZ1bGxzY3JlZW4gc3RhY2sgYW5kIGJhY2sgdG8gZG9ja2VkIHN0YWNrLgorICAgICAqIEFzc2VydHMgdGhhdCBpbml0aWFsIGFuZCBmaW5hbCByZXBvcnRlZCBzaXplcyBpbiBkb2NrZWQgc3RhY2sgYXJlIHRoZSBzYW1lLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBtb3ZlQWN0aXZpdHlTcGxpdEZ1bGxTcGxpdChDb21wb25lbnROYW1lIGFjdGl2aXR5TmFtZSkgeworICAgICAgICBhc3N1bWVUcnVlKCJTa2lwcGluZyB0ZXN0OiBubyBtdWx0aS13aW5kb3cgc3VwcG9ydCIsIHN1cHBvcnRzU3BsaXRTY3JlZW5NdWx0aVdpbmRvdygpKTsKKworICAgICAgICAvLyBMYXVuY2ggdG8gZG9ja2VkIHN0YWNrIGFuZCByZWNvcmQgc2l6ZS4KKyAgICAgICAgTG9nU2VwYXJhdG9yIGxvZ1NlcGFyYXRvciA9IHNlcGFyYXRlTG9ncygpOworICAgICAgICBsYXVuY2hBY3Rpdml0eUluU3BsaXRTY3JlZW5XaXRoUmVjZW50cyhhY3Rpdml0eU5hbWUpOworICAgICAgICBmaW5hbCBSZXBvcnRlZFNpemVzIGluaXRpYWxEb2NrZWRTaXplcyA9IGdldEFjdGl2aXR5RGlzcGxheVNpemUoYWN0aXZpdHlOYW1lLCBsb2dTZXBhcmF0b3IpOworICAgICAgICAvLyBNYWtlIHN1cmUgZG9ja2VkIHN0YWNrIGlzIGZvY3VzZWQuIFRoaXMgd2F5IHdoZW4gd2UgZGlzbWlzcyBpdCBsYXRlciBmdWxsc2NyZWVuIHN0YWNrCisgICAgICAgIC8vIHdpbGwgY29tZSB1cC4KKyAgICAgICAgbGF1bmNoQWN0aXZpdHkoYWN0aXZpdHlOYW1lLCBXSU5ET1dJTkdfTU9ERV9TUExJVF9TQ1JFRU5fUFJJTUFSWSk7CisgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKGZhbHNlIC8qIGNvbXBhcmVUYXNrQW5kU3RhY2tCb3VuZHMgKi8sCisgICAgICAgICAgICAgICAgbmV3IFdhaXRGb3JWYWxpZEFjdGl2aXR5U3RhdGUuQnVpbGRlcihhY3Rpdml0eU5hbWUpLmJ1aWxkKCkpOworCisgICAgICAgIC8vIE1vdmUgdG8gZnVsbHNjcmVlbiBzdGFjay4KKyAgICAgICAgbG9nU2VwYXJhdG9yID0gc2VwYXJhdGVMb2dzKCk7CisgICAgICAgIHNldEFjdGl2aXR5VGFza1dpbmRvd2luZ01vZGUoCisgICAgICAgICAgICAgICAgYWN0aXZpdHlOYW1lLCBXSU5ET1dJTkdfTU9ERV9GVUxMU0NSRUVOX09SX1NQTElUX1NDUkVFTl9TRUNPTkRBUlkpOworICAgICAgICBmaW5hbCBSZXBvcnRlZFNpemVzIGZ1bGxzY3JlZW5TaXplcyA9IGdldEFjdGl2aXR5RGlzcGxheVNpemUoYWN0aXZpdHlOYW1lLCBsb2dTZXBhcmF0b3IpOworICAgICAgICBhc3NlcnRTaXplc0FyZVNhbmUoZnVsbHNjcmVlblNpemVzLCBpbml0aWFsRG9ja2VkU2l6ZXMpOworCisgICAgICAgIC8vIE1vdmUgYWN0aXZpdHkgYmFjayB0byBkb2NrZWQgc3RhY2suCisgICAgICAgIGxvZ1NlcGFyYXRvciA9IHNlcGFyYXRlTG9ncygpOworICAgICAgICBzZXRBY3Rpdml0eVRhc2tXaW5kb3dpbmdNb2RlKGFjdGl2aXR5TmFtZSwgV0lORE9XSU5HX01PREVfU1BMSVRfU0NSRUVOX1BSSU1BUlkpOworICAgICAgICBmaW5hbCBSZXBvcnRlZFNpemVzIGZpbmFsRG9ja2VkU2l6ZXMgPSBnZXRBY3Rpdml0eURpc3BsYXlTaXplKGFjdGl2aXR5TmFtZSwgbG9nU2VwYXJhdG9yKTsKKworICAgICAgICAvLyBBZnRlciBhY3Rpdml0eSBjb25maWd1cmF0aW9uIHdhcyBjaGFuZ2VkIHR3aWNlIGl0IG11c3QgcmVwb3J0IHNhbWUgc2l6ZSBhcyBvcmlnaW5hbCBvbmUuCisgICAgICAgIGFzc2VydFNpemVzQXJlU2FtZShpbml0aWFsRG9ja2VkU2l6ZXMsIGZpbmFsRG9ja2VkU2l6ZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFzc2VydHMgdGhhdCBhZnRlciByb3RhdGlvbiwgdGhlIGFzcGVjdCByYXRpb3Mgb2YgZGlzcGxheSBzaXplLCBtZXRyaWNzLCBhbmQgY29uZmlndXJhdGlvbgorICAgICAqIGhhdmUgZmxpcHBlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydFNpemVzUm90YXRlKFJlcG9ydGVkU2l6ZXMgcm90YXRpb25BLCBSZXBvcnRlZFNpemVzIHJvdGF0aW9uQiwKKyAgICAgICAgICAgIGJvb2xlYW4gc2tpcE9yaWVudGF0aW9uQ2hlY2spIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJvdGF0aW9uQS5kaXNwbGF5V2lkdGgsIHJvdGF0aW9uQS5tZXRyaWNzV2lkdGgpOworICAgICAgICBhc3NlcnRFcXVhbHMocm90YXRpb25BLmRpc3BsYXlIZWlnaHQsIHJvdGF0aW9uQS5tZXRyaWNzSGVpZ2h0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJvdGF0aW9uQi5kaXNwbGF5V2lkdGgsIHJvdGF0aW9uQi5tZXRyaWNzV2lkdGgpOworICAgICAgICBhc3NlcnRFcXVhbHMocm90YXRpb25CLmRpc3BsYXlIZWlnaHQsIHJvdGF0aW9uQi5tZXRyaWNzSGVpZ2h0KTsKKworICAgICAgICBpZiAoc2tpcE9yaWVudGF0aW9uQ2hlY2spIHsKKyAgICAgICAgICAgIC8vIEFsbCBkb25lIGlmIHdlIGFyZSBub3QgZG9pbmcgb3JpZW50YXRpb24gY2hlY2suCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgYm9vbGVhbiBiZWZvcmVQb3J0cmFpdCA9IHJvdGF0aW9uQS5kaXNwbGF5V2lkdGggPCByb3RhdGlvbkEuZGlzcGxheUhlaWdodDsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBhZnRlclBvcnRyYWl0ID0gcm90YXRpb25CLmRpc3BsYXlXaWR0aCA8IHJvdGF0aW9uQi5kaXNwbGF5SGVpZ2h0OworICAgICAgICBhc3NlcnRGYWxzZShiZWZvcmVQb3J0cmFpdCA9PSBhZnRlclBvcnRyYWl0KTsKKworICAgICAgICBmaW5hbCBib29sZWFuIGJlZm9yZUNvbmZpZ1BvcnRyYWl0ID0gcm90YXRpb25BLndpZHRoRHAgPCByb3RhdGlvbkEuaGVpZ2h0RHA7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gYWZ0ZXJDb25maWdQb3J0cmFpdCA9IHJvdGF0aW9uQi53aWR0aERwIDwgcm90YXRpb25CLmhlaWdodERwOworICAgICAgICBhc3NlcnRFcXVhbHMoYmVmb3JlUG9ydHJhaXQsIGJlZm9yZUNvbmZpZ1BvcnRyYWl0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGFmdGVyUG9ydHJhaXQsIGFmdGVyQ29uZmlnUG9ydHJhaXQpOworCisgICAgICAgIGFzc2VydEVxdWFscyhyb3RhdGlvbkEuc21hbGxlc3RXaWR0aERwLCByb3RhdGlvbkIuc21hbGxlc3RXaWR0aERwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaHJvd3MgYW4gQXNzZXJ0aW9uRXJyb3IgaWYgZnVsbHNjcmVlblNpemVzIGhhcyB3aWR0aHMvaGVpZ2h0cyAoZGVwZW5kaW5nIG9uIGFzcGVjdCByYXRpbykKKyAgICAgKiB0aGF0IGFyZSBzbWFsbGVyIHRoYW4gdGhlIGRvY2tlZFNpemVzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0U2l6ZXNBcmVTYW5lKFJlcG9ydGVkU2l6ZXMgZnVsbHNjcmVlblNpemVzLCBSZXBvcnRlZFNpemVzIGRvY2tlZFNpemVzKQorICAgIHsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBwb3J0cmFpdCA9IGZ1bGxzY3JlZW5TaXplcy5kaXNwbGF5V2lkdGggPCBmdWxsc2NyZWVuU2l6ZXMuZGlzcGxheUhlaWdodDsKKyAgICAgICAgaWYgKHBvcnRyYWl0KSB7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGRvY2tlZFNpemVzLmRpc3BsYXlIZWlnaHQsIGxlc3NUaGFuKGZ1bGxzY3JlZW5TaXplcy5kaXNwbGF5SGVpZ2h0KSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGRvY2tlZFNpemVzLmhlaWdodERwLCBsZXNzVGhhbihmdWxsc2NyZWVuU2l6ZXMuaGVpZ2h0RHApKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoZG9ja2VkU2l6ZXMubWV0cmljc0hlaWdodCwgbGVzc1RoYW4oZnVsbHNjcmVlblNpemVzLm1ldHJpY3NIZWlnaHQpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoZG9ja2VkU2l6ZXMuZGlzcGxheVdpZHRoLCBsZXNzVGhhbihmdWxsc2NyZWVuU2l6ZXMuZGlzcGxheVdpZHRoKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGRvY2tlZFNpemVzLndpZHRoRHAsIGxlc3NUaGFuKGZ1bGxzY3JlZW5TaXplcy53aWR0aERwKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGRvY2tlZFNpemVzLm1ldHJpY3NXaWR0aCwgbGVzc1RoYW4oZnVsbHNjcmVlblNpemVzLm1ldHJpY3NXaWR0aCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhyb3dzIGFuIEFzc2VydGlvbkVycm9yIGlmIHNpemVzIGFyZSBkaWZmZXJlbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRTaXplc0FyZVNhbWUoUmVwb3J0ZWRTaXplcyBmaXJzdFNpemUsIFJlcG9ydGVkU2l6ZXMgc2Vjb25kU2l6ZSkgeworICAgICAgICBhc3NlcnRFcXVhbHMoZmlyc3RTaXplLndpZHRoRHAsIHNlY29uZFNpemUud2lkdGhEcCk7CisgICAgICAgIGFzc2VydEVxdWFscyhmaXJzdFNpemUuaGVpZ2h0RHAsIHNlY29uZFNpemUuaGVpZ2h0RHApOworICAgICAgICBhc3NlcnRFcXVhbHMoZmlyc3RTaXplLmRpc3BsYXlXaWR0aCwgc2Vjb25kU2l6ZS5kaXNwbGF5V2lkdGgpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmlyc3RTaXplLmRpc3BsYXlIZWlnaHQsIHNlY29uZFNpemUuZGlzcGxheUhlaWdodCk7CisgICAgICAgIGFzc2VydEVxdWFscyhmaXJzdFNpemUubWV0cmljc1dpZHRoLCBzZWNvbmRTaXplLm1ldHJpY3NXaWR0aCk7CisgICAgICAgIGFzc2VydEVxdWFscyhmaXJzdFNpemUubWV0cmljc0hlaWdodCwgc2Vjb25kU2l6ZS5tZXRyaWNzSGVpZ2h0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZpcnN0U2l6ZS5zbWFsbGVzdFdpZHRoRHAsIHNlY29uZFNpemUuc21hbGxlc3RXaWR0aERwKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFJlcG9ydGVkU2l6ZXMgZ2V0QWN0aXZpdHlEaXNwbGF5U2l6ZShDb21wb25lbnROYW1lIGFjdGl2aXR5TmFtZSwKKyAgICAgICAgICAgIExvZ1NlcGFyYXRvciBsb2dTZXBhcmF0b3IpIHsKKyAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUoZmFsc2UgLyogY29tcGFyZVRhc2tBbmRTdGFja0JvdW5kcyAqLywKKyAgICAgICAgICAgICAgICBuZXcgV2FpdEZvclZhbGlkQWN0aXZpdHlTdGF0ZShhY3Rpdml0eU5hbWUpKTsKKyAgICAgICAgZmluYWwgUmVwb3J0ZWRTaXplcyBkZXRhaWxzID0gZ2V0TGFzdFJlcG9ydGVkU2l6ZXNGb3JBY3Rpdml0eShhY3Rpdml0eU5hbWUsIGxvZ1NlcGFyYXRvcik7CisgICAgICAgIGFzc2VydE5vdE51bGwoZGV0YWlscyk7CisgICAgICAgIHJldHVybiBkZXRhaWxzOworICAgIH0KKworICAgIHByaXZhdGUgUmVjdCBnZXREaXNwbGF5UmVjdChDb21wb25lbnROYW1lIGFjdGl2aXR5TmFtZSkgeworICAgICAgICBmaW5hbCBTdHJpbmcgd2luZG93TmFtZSA9IGdldFdpbmRvd05hbWUoYWN0aXZpdHlOYW1lKTsKKworICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShhY3Rpdml0eU5hbWUpOworICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRXaW5kb3coIlRlc3Qgd2luZG93IG11c3QgYmUgdGhlIGZyb250IHdpbmRvdy4iLCB3aW5kb3dOYW1lKTsKKworICAgICAgICBmaW5hbCBMaXN0PFdpbmRvd01hbmFnZXJTdGF0ZS5XaW5kb3dTdGF0ZT4gd2luZG93TGlzdCA9CisgICAgICAgICAgICAgICAgbUFtV21TdGF0ZS5nZXRXbVN0YXRlKCkuZ2V0TWF0Y2hpbmdWaXNpYmxlV2luZG93U3RhdGUod2luZG93TmFtZSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJTaG91bGQgaGF2ZSBleGFjdGx5IG9uZSB3aW5kb3cgc3RhdGUgZm9yIHRoZSBhY3Rpdml0eS4iLCAxLAorICAgICAgICAgICAgICAgIHdpbmRvd0xpc3Quc2l6ZSgpKTsKKworICAgICAgICBXaW5kb3dNYW5hZ2VyU3RhdGUuV2luZG93U3RhdGUgd2luZG93U3RhdGUgPSB3aW5kb3dMaXN0LmdldCgwKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiU2hvdWxkIGhhdmUgYSB2YWxpZCB3aW5kb3ciLCB3aW5kb3dTdGF0ZSk7CisKKyAgICAgICAgV2luZG93TWFuYWdlclN0YXRlLkRpc3BsYXkgZGlzcGxheSA9IG1BbVdtU3RhdGUuZ2V0V21TdGF0ZSgpCisgICAgICAgICAgICAgICAgLmdldERpc3BsYXkod2luZG93U3RhdGUuZ2V0RGlzcGxheUlkKCkpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJTaG91bGQgYmUgb24gYSBkaXNwbGF5IiwgZGlzcGxheSk7CisKKyAgICAgICAgcmV0dXJuIGRpc3BsYXkuZ2V0RGlzcGxheVJlY3QoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgd2FpdEZvckJyb2FkY2FzdEFjdGl2aXR5UmVhZHkoaW50IG9yaWVudGF0aW9uKSB7CisgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvckFjdGl2aXR5T3JpZW50YXRpb24oQlJPQURDQVNUX1JFQ0VJVkVSX0FDVElWSVRZLCBvcmllbnRhdGlvbik7CisgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvckFjdGl2aXR5U3RhdGUoQlJPQURDQVNUX1JFQ0VJVkVSX0FDVElWSVRZLCBTVEFURV9SRVNVTUVEKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGxhdW5jaGluZyBhbiBhY3Rpdml0eSB3aGljaCByZXF1ZXN0cyBzcGVjaWZpYyBVSSBtb2RlIGR1cmluZyBjcmVhdGlvbi4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMYXVuY2hXaXRoVWlNb2RlQ2hhbmdlKCkgeworICAgICAgICAvLyBMYXVuY2ggYWN0aXZpdHkgdGhhdCBjaGFuZ2VzIFVJIG1vZGUgYW5kIGhhbmRsZXMgdGhpcyBjb25maWd1cmF0aW9uIGNoYW5nZS4KKyAgICAgICAgbGF1bmNoQWN0aXZpdHkoTklHSFRfTU9ERV9BQ1RJVklUWSk7CisgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvckFjdGl2aXR5U3RhdGUoTklHSFRfTU9ERV9BQ1RJVklUWSwgU1RBVEVfUkVTVU1FRCk7CisKKyAgICAgICAgLy8gQ2hlY2sgaWYgYWN0aXZpdHkgaXMgbGF1bmNoZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoTklHSFRfTU9ERV9BQ1RJVklUWSwgdHJ1ZSAvKiB2aXNpYmxlICovKTsKKyAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkQWN0aXZpdHkoIkxhdW5jaGVkIGFjdGl2aXR5IHNob3VsZCBiZSBmb2N1c2VkIiwKKyAgICAgICAgICAgICAgICBOSUdIVF9NT0RFX0FDVElWSVRZKTsKKyAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRSZXN1bWVkQWN0aXZpdHkoIkxhdW5jaGVkIGFjdGl2aXR5IG11c3QgYmUgcmVzdW1lZCIsIE5JR0hUX01PREVfQUNUSVZJVFkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlNYW5hZ2VyQXNzaXN0YW50U3RhY2tUZXN0cy5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJBc3Npc3RhbnRTdGFja1Rlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdhMzNkYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlNYW5hZ2VyQXNzaXN0YW50U3RhY2tUZXN0cy5qYXZhCkBAIC0wLDAgKzEsNDIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLmFtOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLldpbmRvd0NvbmZpZ3VyYXRpb24uQUNUSVZJVFlfVFlQRV9BU1NJU1RBTlQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLldpbmRvd0NvbmZpZ3VyYXRpb24uQUNUSVZJVFlfVFlQRV9TVEFOREFSRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuV2luZG93Q29uZmlndXJhdGlvbi5XSU5ET1dJTkdfTU9ERV9GVUxMU0NSRUVOOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5XaW5kb3dDb25maWd1cmF0aW9uLldJTkRPV0lOR19NT0RFX1BJTk5FRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuV2luZG93Q29uZmlndXJhdGlvbi5XSU5ET1dJTkdfTU9ERV9TUExJVF9TQ1JFRU5fUFJJTUFSWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuV2luZG93Q29uZmlndXJhdGlvbi5XSU5ET1dJTkdfTU9ERV9TUExJVF9TQ1JFRU5fU0VDT05EQVJZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5XaW5kb3dDb25maWd1cmF0aW9uLldJTkRPV0lOR19NT0RFX1VOREVGSU5FRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQWN0aXZpdHlNYW5hZ2VyU3RhdGUuU1RBVEVfUkVTVU1FRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50TmFtZVV0aWxzLmdldEFjdGl2aXR5TmFtZTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5BTklNQVRJT05fVEVTVF9BQ1RJVklUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5BU1NJU1RBTlRfQUNUSVZJVFk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuQVNTSVNUQU5UX1ZPSUNFX0lOVEVSQUNUSU9OX1NFUlZJQ0U7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuQXNzaXN0YW50QWN0aXZpdHkuRVhUUkFfQVNTSVNUQU5UX0RJU1BMQVlfSUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuQXNzaXN0YW50QWN0aXZpdHkuRVhUUkFfQVNTSVNUQU5UX0VOVEVSX1BJUDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5Bc3Npc3RhbnRBY3Rpdml0eS5FWFRSQV9BU1NJU1RBTlRfRklOSVNIX1NFTEY7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuQXNzaXN0YW50QWN0aXZpdHkuRVhUUkFfQVNTSVNUQU5UX0xBVU5DSF9ORVdfVEFTSzsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5ET0NLRURfQUNUSVZJVFk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuTEFVTkNIX0FTU0lTVEFOVF9BQ1RJVklUWV9GUk9NX1NFU1NJT047CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuTEFVTkNIX0FTU0lTVEFOVF9BQ1RJVklUWV9JTlRPX1NUQUNLOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLkxhdW5jaEFzc2lzdGFudEFjdGl2aXR5SW50b0Fzc2lzdGFudFN0YWNrCisgICAgICAgIC5FWFRSQV9BU1NJU1RBTlRfSVNfVFJBTlNMVUNFTlQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuUElQX0FDVElWSVRZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLlBpcEFjdGl2aXR5LkVYVFJBX0VOVEVSX1BJUDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5URVNUX0FDVElWSVRZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLlRSQU5TTFVDRU5UX0FTU0lTVEFOVF9BQ1RJVklUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5UZXN0QWN0aXZpdHkuVEVTVF9BQ1RJVklUWV9BQ1RJT05fRklOSVNIX1NFTEY7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLlVpRGV2aWNlVXRpbHMucHJlc3NCYWNrQnV0dG9uOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuRGlzcGxheS5ERUZBVUxUX0RJU1BMQVk7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmhhc1NpemU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc3VtZS5hc3N1bWVUcnVlOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlByZXN1Ym1pdDsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOworaW1wb3J0IGFuZHJvaWQuc2VydmVyLmFtLnNldHRpbmdzLlNldHRpbmdzU2Vzc2lvbjsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuRmxha3lUZXN0OworCitpbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBCdWlsZC9JbnN0YWxsL1J1bjoKKyAqICAgICBhdGVzdCBDdHNBY3Rpdml0eU1hbmFnZXJEZXZpY2VUZXN0Q2FzZXM6QWN0aXZpdHlNYW5hZ2VyQXNzaXN0YW50U3RhY2tUZXN0cworICovCisvL0BQcmVzdWJtaXQgYi82NzcwNjY0MgorQEZsYWt5VGVzdChidWdJZCA9IDcxODc1NjMxKQorcHVibGljIGNsYXNzIEFjdGl2aXR5TWFuYWdlckFzc2lzdGFudFN0YWNrVGVzdHMgZXh0ZW5kcyBBY3Rpdml0eU1hbmFnZXJUZXN0QmFzZSB7CisKKyAgICBwcml2YXRlIGludCBtQXNzaXN0YW50RGlzcGxheUlkID0gREVGQVVMVF9ESVNQTEFZOworCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgdHJ5IChmaW5hbCBBc3Npc3RhbnRTZXNzaW9uIGFzc2lzdGFudFNlc3Npb24gPSBuZXcgQXNzaXN0YW50U2Vzc2lvbigpKSB7CisgICAgICAgICAgICBhc3Npc3RhbnRTZXNzaW9uLnNldFZvaWNlSW50ZXJhY3Rpb25TZXJ2aWNlKEFTU0lTVEFOVF9WT0lDRV9JTlRFUkFDVElPTl9TRVJWSUNFKTsKKyAgICAgICAgICAgIGxhdW5jaEFjdGl2aXR5Tm9XYWl0KExBVU5DSF9BU1NJU1RBTlRfQUNUSVZJVFlfSU5UT19TVEFDSyk7CisgICAgICAgICAgICB3YWl0Rm9yVmFsaWRTdGF0ZVdpdGhBY3Rpdml0eVR5cGUoQVNTSVNUQU5UX0FDVElWSVRZLCBBQ1RJVklUWV9UWVBFX0FTU0lTVEFOVCk7CisgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXJTdGF0ZS5BY3Rpdml0eVN0YWNrIGFzc2lzdGFudFN0YWNrID0KKyAgICAgICAgICAgICAgICAgICAgbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0U3RhY2tCeUFjdGl2aXR5VHlwZShBQ1RJVklUWV9UWVBFX0FTU0lTVEFOVCk7CisgICAgICAgICAgICBtQXNzaXN0YW50RGlzcGxheUlkID0gYXNzaXN0YW50U3RhY2subURpc3BsYXlJZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgQFByZXN1Ym1pdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMYXVuY2hpbmdBc3Npc3RhbnRBY3Rpdml0eUludG9Bc3Npc3RhbnRTdGFjaygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBFbmFibGUgdGhlIGFzc2lzdGFudCBhbmQgbGF1bmNoIGFuIGFzc2lzdGFudCBhY3Rpdml0eQorICAgICAgICB0cnkgKGZpbmFsIEFzc2lzdGFudFNlc3Npb24gYXNzaXN0YW50U2Vzc2lvbiA9IG5ldyBBc3Npc3RhbnRTZXNzaW9uKCkpIHsKKyAgICAgICAgICAgIGFzc2lzdGFudFNlc3Npb24uc2V0Vm9pY2VJbnRlcmFjdGlvblNlcnZpY2UoQVNTSVNUQU5UX1ZPSUNFX0lOVEVSQUNUSU9OX1NFUlZJQ0UpOworCisgICAgICAgICAgICBsYXVuY2hBY3Rpdml0eU5vV2FpdChMQVVOQ0hfQVNTSVNUQU5UX0FDVElWSVRZX0ZST01fU0VTU0lPTik7CisgICAgICAgICAgICB3YWl0Rm9yVmFsaWRTdGF0ZVdpdGhBY3Rpdml0eVR5cGUoQVNTSVNUQU5UX0FDVElWSVRZLCBBQ1RJVklUWV9UWVBFX0FTU0lTVEFOVCk7CisKKyAgICAgICAgICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBhY3Rpdml0eSBsYXVuY2hlZCBpbiB0aGUgZnVsbHNjcmVlbiBhc3Npc3RhbnQgc3RhY2sKKyAgICAgICAgICAgIGFzc2VydEFzc2lzdGFudFN0YWNrRXhpc3RzKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCBhc3Npc3RhbnQgc3RhY2sgdG8gYmUgZnVsbHNjcmVlbiIsCisgICAgICAgICAgICAgICAgICAgIG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFN0YWNrQnlBY3Rpdml0eVR5cGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNUSVZJVFlfVFlQRV9BU1NJU1RBTlQpLmlzRnVsbHNjcmVlbigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBGbGFreVRlc3QoYnVnSWQgPSA2OTU3Mzk0MCkKKyAgICBAUHJlc3VibWl0CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXNzaXN0YW50U3RhY2taT3JkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzdW1lVHJ1ZShhc3Npc3RhbnRSdW5zT25QcmltYXJ5RGlzcGxheSgpKTsKKyAgICAgICAgYXNzdW1lVHJ1ZShzdXBwb3J0c1BpcCgpKTsKKyAgICAgICAgYXNzdW1lVHJ1ZShzdXBwb3J0c1NwbGl0U2NyZWVuTXVsdGlXaW5kb3coKSk7CisKKyAgICAgICAgLy8gTGF1bmNoIGEgcGlubmVkIHN0YWNrIHRhc2sKKyAgICAgICAgbGF1bmNoQWN0aXZpdHkoUElQX0FDVElWSVRZLCBFWFRSQV9FTlRFUl9QSVAsICJ0cnVlIik7CisgICAgICAgIHdhaXRGb3JWYWxpZFN0YXRlV2l0aEFjdGl2aXR5VHlwZUFuZFdpbmRvd2luZ01vZGUoCisgICAgICAgICAgICAgICAgUElQX0FDVElWSVRZLCBBQ1RJVklUWV9UWVBFX1NUQU5EQVJELCBXSU5ET1dJTkdfTU9ERV9QSU5ORUQpOworICAgICAgICBtQW1XbVN0YXRlLmFzc2VydENvbnRhaW5zU3RhY2soIk11c3QgY29udGFpbiBwaW5uZWQgc3RhY2suIiwKKyAgICAgICAgICAgICAgICBXSU5ET1dJTkdfTU9ERV9QSU5ORUQsIEFDVElWSVRZX1RZUEVfU1RBTkRBUkQpOworCisgICAgICAgIC8vIERvY2sgYSB0YXNrCisgICAgICAgIGxhdW5jaEFjdGl2aXRpZXNJblNwbGl0U2NyZWVuKAorICAgICAgICAgICAgICAgIGdldExhdW5jaEFjdGl2aXR5QnVpbGRlcigpLnNldFRhcmdldEFjdGl2aXR5KERPQ0tFRF9BQ1RJVklUWSksCisgICAgICAgICAgICAgICAgZ2V0TGF1bmNoQWN0aXZpdHlCdWlsZGVyKCkuc2V0VGFyZ2V0QWN0aXZpdHkoVEVTVF9BQ1RJVklUWSkpOworICAgICAgICBtQW1XbVN0YXRlLmFzc2VydENvbnRhaW5zU3RhY2soIk11c3QgY29udGFpbiBmdWxsc2NyZWVuIHN0YWNrLiIsCisgICAgICAgICAgICAgICAgV0lORE9XSU5HX01PREVfU1BMSVRfU0NSRUVOX1NFQ09OREFSWSwgQUNUSVZJVFlfVFlQRV9TVEFOREFSRCk7CisgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Q29udGFpbnNTdGFjaygiTXVzdCBjb250YWluIGRvY2tlZCBzdGFjay4iLAorICAgICAgICAgICAgICAgIFdJTkRPV0lOR19NT0RFX1NQTElUX1NDUkVFTl9QUklNQVJZLCBBQ1RJVklUWV9UWVBFX1NUQU5EQVJEKTsKKworICAgICAgICAvLyBFbmFibGUgdGhlIGFzc2lzdGFudCBhbmQgbGF1bmNoIGFuIGFzc2lzdGFudCBhY3Rpdml0eSwgZW5zdXJlIGl0IGlzIG9uIHRvcAorICAgICAgICB0cnkgKGZpbmFsIEFzc2lzdGFudFNlc3Npb24gYXNzaXN0YW50U2Vzc2lvbiA9IG5ldyBBc3Npc3RhbnRTZXNzaW9uKCkpIHsKKyAgICAgICAgICAgIGFzc2lzdGFudFNlc3Npb24uc2V0Vm9pY2VJbnRlcmFjdGlvblNlcnZpY2UoQVNTSVNUQU5UX1ZPSUNFX0lOVEVSQUNUSU9OX1NFUlZJQ0UpOworCisgICAgICAgICAgICBsYXVuY2hBY3Rpdml0eU5vV2FpdChMQVVOQ0hfQVNTSVNUQU5UX0FDVElWSVRZX0ZST01fU0VTU0lPTik7CisgICAgICAgICAgICB3YWl0Rm9yVmFsaWRTdGF0ZVdpdGhBY3Rpdml0eVR5cGUoQVNTSVNUQU5UX0FDVElWSVRZLCBBQ1RJVklUWV9UWVBFX0FTU0lTVEFOVCk7CisgICAgICAgICAgICBhc3NlcnRBc3Npc3RhbnRTdGFja0V4aXN0cygpOworCisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZyb250U3RhY2soIlBpbm5lZCBzdGFjayBzaG91bGQgYmUgb24gdG9wLiIsCisgICAgICAgICAgICAgICAgICAgIFdJTkRPV0lOR19NT0RFX1BJTk5FRCwgQUNUSVZJVFlfVFlQRV9TVEFOREFSRCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRTdGFjaygiQXNzaXN0YW50IHN0YWNrIHNob3VsZCBiZSBmb2N1c2VkLiIsCisgICAgICAgICAgICAgICAgICAgIFdJTkRPV0lOR19NT0RFX1VOREVGSU5FRCwgQUNUSVZJVFlfVFlQRV9BU1NJU1RBTlQpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAUHJlc3VibWl0CisgICAgcHVibGljIHZvaWQgdGVzdEFzc2lzdGFudFN0YWNrTGF1bmNoTmV3VGFzaygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRBc3Npc3RhbnRTdGFja0NhbkxhdW5jaEFuZFJldHVybkZyb21OZXdUYXNrKFdJTkRPV0lOR19NT0RFX0ZVTExTQ1JFRU4pOworICAgIH0KKworICAgIEBUZXN0CisgICAgQFByZXN1Ym1pdAorICAgIEBJZ25vcmUoImIvNzcyNzIyNTMjY29tbWVudDEwIikKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXNzaXN0YW50U3RhY2tMYXVuY2hOZXdUYXNrV2l0aERvY2tlZFN0YWNrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc3VtZVRydWUoYXNzaXN0YW50UnVuc09uUHJpbWFyeURpc3BsYXkoKSk7CisgICAgICAgIGFzc3VtZVRydWUoc3VwcG9ydHNTcGxpdFNjcmVlbk11bHRpV2luZG93KCkpOworCisgICAgICAgIC8vIERvY2sgYSB0YXNrCisgICAgICAgIGxhdW5jaEFjdGl2aXRpZXNJblNwbGl0U2NyZWVuKAorICAgICAgICAgICAgICAgIGdldExhdW5jaEFjdGl2aXR5QnVpbGRlcigpLnNldFRhcmdldEFjdGl2aXR5KERPQ0tFRF9BQ1RJVklUWSksCisgICAgICAgICAgICAgICAgZ2V0TGF1bmNoQWN0aXZpdHlCdWlsZGVyKCkuc2V0VGFyZ2V0QWN0aXZpdHkoVEVTVF9BQ1RJVklUWSkpOworICAgICAgICBtQW1XbVN0YXRlLmFzc2VydENvbnRhaW5zU3RhY2soIk11c3QgY29udGFpbiBmdWxsc2NyZWVuIHN0YWNrLiIsCisgICAgICAgICAgICAgICAgV0lORE9XSU5HX01PREVfU1BMSVRfU0NSRUVOX1NFQ09OREFSWSwgQUNUSVZJVFlfVFlQRV9TVEFOREFSRCk7CisgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Q29udGFpbnNTdGFjaygiTXVzdCBjb250YWluIGRvY2tlZCBzdGFjay4iLAorICAgICAgICAgICAgICAgIFdJTkRPV0lOR19NT0RFX1NQTElUX1NDUkVFTl9QUklNQVJZLCBBQ1RJVklUWV9UWVBFX1NUQU5EQVJEKTsKKworICAgICAgICBhc3NlcnRBc3Npc3RhbnRTdGFja0NhbkxhdW5jaEFuZFJldHVybkZyb21OZXdUYXNrKFdJTkRPV0lOR19NT0RFX1NQTElUX1NDUkVFTl9TRUNPTkRBUlkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRBc3Npc3RhbnRTdGFja0NhbkxhdW5jaEFuZFJldHVybkZyb21OZXdUYXNrKGludCBleHBlY3RlZFdpbmRvd2luZ01vZGUpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gRW5hYmxlIHRoZSBhc3Npc3RhbnQgYW5kIGxhdW5jaCBhbiBhc3Npc3RhbnQgYWN0aXZpdHkgd2hpY2ggd2lsbCBsYXVuY2ggYSBuZXcgdGFzaworICAgICAgICB0cnkgKGZpbmFsIEFzc2lzdGFudFNlc3Npb24gYXNzaXN0YW50U2Vzc2lvbiA9IG5ldyBBc3Npc3RhbnRTZXNzaW9uKCkpIHsKKyAgICAgICAgICAgIGFzc2lzdGFudFNlc3Npb24uc2V0Vm9pY2VJbnRlcmFjdGlvblNlcnZpY2UoQVNTSVNUQU5UX1ZPSUNFX0lOVEVSQUNUSU9OX1NFUlZJQ0UpOworCisgICAgICAgICAgICBsYXVuY2hBY3Rpdml0eU9uRGlzcGxheU5vV2FpdChMQVVOQ0hfQVNTSVNUQU5UX0FDVElWSVRZX0lOVE9fU1RBQ0ssIG1Bc3Npc3RhbnREaXNwbGF5SWQsCisgICAgICAgICAgICAgICAgICAgIEVYVFJBX0FTU0lTVEFOVF9MQVVOQ0hfTkVXX1RBU0ssIGdldEFjdGl2aXR5TmFtZShURVNUX0FDVElWSVRZKSwKKyAgICAgICAgICAgICAgICAgICAgRVhUUkFfQVNTSVNUQU5UX0RJU1BMQVlfSUQsIEludGVnZXIudG9TdHJpbmcobUFzc2lzdGFudERpc3BsYXlJZCkpOworICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlIGZ1bGxzY3JlZW4gc3RhY2sgaXMgb24gdG9wIGFuZCB0aGUgdGVzdCBhY3Rpdml0eSBpcyBub3cgdmlzaWJsZQorICAgICAgICAgICAgd2FpdEZvclZhbGlkU3RhdGVXaXRoQWN0aXZpdHlUeXBlQW5kV2luZG93aW5nTW9kZSgKKyAgICAgICAgICAgICAgICAgICAgVEVTVF9BQ1RJVklUWSwgQUNUSVZJVFlfVFlQRV9TVEFOREFSRCwgZXhwZWN0ZWRXaW5kb3dpbmdNb2RlKTsKKyAgICAgICAgfQorCisgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZEFjdGl2aXR5KCJUZXN0QWN0aXZpdHkgc2hvdWxkIGJlIHJlc3VtZWQiLCBURVNUX0FDVElWSVRZKTsKKyAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGcm9udFN0YWNrKCJGdWxsc2NyZWVuIHN0YWNrIHNob3VsZCBiZSBvbiB0b3AuIiwKKyAgICAgICAgICAgICAgICBleHBlY3RlZFdpbmRvd2luZ01vZGUsIEFDVElWSVRZX1RZUEVfU1RBTkRBUkQpOworICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRTdGFjaygiRnVsbHNjcmVlbiBzdGFjayBzaG91bGQgYmUgZm9jdXNlZC4iLAorICAgICAgICAgICAgICAgIGV4cGVjdGVkV2luZG93aW5nTW9kZSwgQUNUSVZJVFlfVFlQRV9TVEFOREFSRCk7CisKKyAgICAgICAgLy8gTm93LCB0ZWxsIGl0IHRvIGZpbmlzaCBpdHNlbGYgYW5kIGVuc3VyZSB0aGF0IHRoZSBhc3Npc3RhbnQgc3RhY2sgaXMgYnJvdWdodCBiYWNrIGZvcndhcmQKKyAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZCgiYW0gYnJvYWRjYXN0IC1hICIgKyBURVNUX0FDVElWSVRZX0FDVElPTl9GSU5JU0hfU0VMRik7CisgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvckZvY3VzZWRTdGFjayhXSU5ET1dJTkdfTU9ERV9VTkRFRklORUQsIEFDVElWSVRZX1RZUEVfQVNTSVNUQU5UKTsKKyAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGcm9udFN0YWNrQWN0aXZpdHlUeXBlKAorICAgICAgICAgICAgICAgICJBc3Npc3RhbnQgc3RhY2sgc2hvdWxkIGJlIG9uIHRvcC4iLCBBQ1RJVklUWV9UWVBFX0FTU0lTVEFOVCk7CisgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZFN0YWNrKCJBc3Npc3RhbnQgc3RhY2sgc2hvdWxkIGJlIGZvY3VzZWQuIiwKKyAgICAgICAgICAgICAgICBXSU5ET1dJTkdfTU9ERV9VTkRFRklORUQsIEFDVElWSVRZX1RZUEVfQVNTSVNUQU5UKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBQcmVzdWJtaXQKKyAgICBARmxha3lUZXN0KGJ1Z0lkID0gNzE4NzU2MzEpCisgICAgcHVibGljIHZvaWQgdGVzdEFzc2lzdGFudFN0YWNrRmluaXNoVG9QcmV2aW91c0FwcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBMYXVuY2ggYW4gYXNzaXN0YW50IGFjdGl2aXR5IG9uIHRvcCBvZiBhbiBleGlzdGluZyBmdWxsc2NyZWVuIGFjdGl2aXR5LCBhbmQgZW5zdXJlIHRoYXQKKyAgICAgICAgLy8gdGhlIGZ1bGxzY3JlZW4gYWN0aXZpdHkgaXMgc3RpbGwgdmlzaWJsZSBhbmQgb24gdG9wIGFmdGVyIHRoZSBhc3Npc3RhbnQgYWN0aXZpdHkgZmluaXNoZXMKKyAgICAgICAgbGF1bmNoQWN0aXZpdHlPbkRpc3BsYXkoVEVTVF9BQ1RJVklUWSwgbUFzc2lzdGFudERpc3BsYXlJZCk7CisgICAgICAgIHRyeSAoZmluYWwgQXNzaXN0YW50U2Vzc2lvbiBhc3Npc3RhbnRTZXNzaW9uID0gbmV3IEFzc2lzdGFudFNlc3Npb24oKSkgeworICAgICAgICAgICAgYXNzaXN0YW50U2Vzc2lvbi5zZXRWb2ljZUludGVyYWN0aW9uU2VydmljZShBU1NJU1RBTlRfVk9JQ0VfSU5URVJBQ1RJT05fU0VSVklDRSk7CisKKyAgICAgICAgICAgIGxhdW5jaEFjdGl2aXR5Tm9XYWl0KExBVU5DSF9BU1NJU1RBTlRfQUNUSVZJVFlfSU5UT19TVEFDSywKKyAgICAgICAgICAgICAgICAgICAgRVhUUkFfQVNTSVNUQU5UX0ZJTklTSF9TRUxGLCAidHJ1ZSIpOworICAgICAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yKChhbVN0YXRlLCB3bVN0YXRlKSAtPiAhYW1TdGF0ZS5jb250YWluc0FjdGl2aXR5KEFTU0lTVEFOVF9BQ1RJVklUWSksCisgICAgICAgICAgICAgICAgICAgICJXYWl0aW5nIGZvciAiICsgZ2V0QWN0aXZpdHlOYW1lKEFTU0lTVEFOVF9BQ1RJVklUWSkgKyAiIGZpbmlzaGVkIik7CisgICAgICAgIH0KKyAgICAgICAgd2FpdEZvclZhbGlkU3RhdGVXaXRoQWN0aXZpdHlUeXBlQW5kV2luZG93aW5nTW9kZSgKKyAgICAgICAgICAgICAgICBURVNUX0FDVElWSVRZLCBBQ1RJVklUWV9UWVBFX1NUQU5EQVJELCBXSU5ET1dJTkdfTU9ERV9GVUxMU0NSRUVOKTsKKyAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yQWN0aXZpdHlTdGF0ZShURVNUX0FDVElWSVRZLCBTVEFURV9SRVNVTUVEKTsKKyAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkQWN0aXZpdHkoIlRlc3RBY3Rpdml0eSBzaG91bGQgYmUgcmVzdW1lZCIsIFRFU1RfQUNUSVZJVFkpOworICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZyb250U3RhY2soIkZ1bGxzY3JlZW4gc3RhY2sgc2hvdWxkIGJlIG9uIHRvcC4iLAorICAgICAgICAgICAgICAgIFdJTkRPV0lOR19NT0RFX0ZVTExTQ1JFRU4sIEFDVElWSVRZX1RZUEVfU1RBTkRBUkQpOworICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRTdGFjaygiRnVsbHNjcmVlbiBzdGFjayBzaG91bGQgYmUgZm9jdXNlZC4iLAorICAgICAgICAgICAgICAgIFdJTkRPV0lOR19NT0RFX0ZVTExTQ1JFRU4sIEFDVElWSVRZX1RZUEVfU1RBTkRBUkQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgQFByZXN1Ym1pdAorICAgIEBGbGFreVRlc3QoYnVnSWQgPSA3MTg3NTYzMSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzYWxsb3dFbnRlclBpUEZyb21Bc3Npc3RhbnRTdGFjaygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgKGZpbmFsIEFzc2lzdGFudFNlc3Npb24gYXNzaXN0YW50U2Vzc2lvbiA9IG5ldyBBc3Npc3RhbnRTZXNzaW9uKCkpIHsKKyAgICAgICAgICAgIGFzc2lzdGFudFNlc3Npb24uc2V0Vm9pY2VJbnRlcmFjdGlvblNlcnZpY2UoQVNTSVNUQU5UX1ZPSUNFX0lOVEVSQUNUSU9OX1NFUlZJQ0UpOworCisgICAgICAgICAgICBsYXVuY2hBY3Rpdml0eU5vV2FpdChMQVVOQ0hfQVNTSVNUQU5UX0FDVElWSVRZX0lOVE9fU1RBQ0ssCisgICAgICAgICAgICAgICAgICAgIEVYVFJBX0FTU0lTVEFOVF9FTlRFUl9QSVAsICJ0cnVlIik7CisgICAgICAgIH0KKyAgICAgICAgd2FpdEZvclZhbGlkU3RhdGVXaXRoQWN0aXZpdHlUeXBlKEFTU0lTVEFOVF9BQ1RJVklUWSwgQUNUSVZJVFlfVFlQRV9BU1NJU1RBTlQpOworICAgICAgICBtQW1XbVN0YXRlLmFzc2VydERvZXNOb3RDb250YWluU3RhY2soIk11c3Qgbm90IGNvbnRhaW4gcGlubmVkIHN0YWNrLiIsCisgICAgICAgICAgICAgICAgV0lORE9XSU5HX01PREVfUElOTkVELCBBQ1RJVklUWV9UWVBFX1NUQU5EQVJEKTsKKyAgICB9CisKKyAgICBARmxha3lUZXN0KGJ1Z0lkID0gNjk1NzM5NDApCisgICAgQFByZXN1Ym1pdAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRyYW5zbHVjZW50QXNzaXN0YW50QWN0aXZpdHlTdGFja1Zpc2liaWxpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IChmaW5hbCBBc3Npc3RhbnRTZXNzaW9uIGFzc2lzdGFudFNlc3Npb24gPSBuZXcgQXNzaXN0YW50U2Vzc2lvbigpKSB7CisgICAgICAgICAgICBhc3Npc3RhbnRTZXNzaW9uLnNldFZvaWNlSW50ZXJhY3Rpb25TZXJ2aWNlKEFTU0lTVEFOVF9WT0lDRV9JTlRFUkFDVElPTl9TRVJWSUNFKTsKKworICAgICAgICAgICAgLy8gR28gaG9tZSwgbGF1bmNoIHRoZSBhc3Npc3RhbnQgYW5kIGNoZWNrIHRvIHNlZSB0aGF0IGhvbWUgaXMgdmlzaWJsZQorICAgICAgICAgICAgcmVtb3ZlU3RhY2tzSW5XaW5kb3dpbmdNb2RlcyhXSU5ET1dJTkdfTU9ERV9GVUxMU0NSRUVOLAorICAgICAgICAgICAgICAgICAgICBXSU5ET1dJTkdfTU9ERV9TUExJVF9TQ1JFRU5fU0VDT05EQVJZKTsKKyAgICAgICAgICAgIGxhdW5jaEhvbWVBY3Rpdml0eSgpOworICAgICAgICAgICAgbGF1bmNoQWN0aXZpdHlOb1dhaXQoTEFVTkNIX0FTU0lTVEFOVF9BQ1RJVklUWV9JTlRPX1NUQUNLLAorICAgICAgICAgICAgICAgICAgICBFWFRSQV9BU1NJU1RBTlRfSVNfVFJBTlNMVUNFTlQsICJ0cnVlIik7CisgICAgICAgICAgICB3YWl0Rm9yVmFsaWRTdGF0ZVdpdGhBY3Rpdml0eVR5cGUoCisgICAgICAgICAgICAgICAgICAgIFRSQU5TTFVDRU5UX0FTU0lTVEFOVF9BQ1RJVklUWSwgQUNUSVZJVFlfVFlQRV9BU1NJU1RBTlQpOworICAgICAgICAgICAgYXNzZXJ0QXNzaXN0YW50U3RhY2tFeGlzdHMoKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvckhvbWVBY3Rpdml0eVZpc2libGUoKTsKKyAgICAgICAgICAgIGlmIChoYXNIb21lU2NyZWVuKCkpIHsKKyAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEhvbWVBY3Rpdml0eVZpc2libGUodHJ1ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIExhdW5jaCBhIGZ1bGxzY3JlZW4gYXBwIGFuZCB0aGVuIGxhdW5jaCB0aGUgYXNzaXN0YW50IGFuZCBjaGVjayB0byBzZWUgdGhhdCBpdCBpcworICAgICAgICAgICAgLy8gYWxzbyB2aXNpYmxlCisgICAgICAgICAgICByZW1vdmVTdGFja3NXaXRoQWN0aXZpdHlUeXBlcyhBQ1RJVklUWV9UWVBFX0FTU0lTVEFOVCk7CisgICAgICAgICAgICBsYXVuY2hBY3Rpdml0eU9uRGlzcGxheShURVNUX0FDVElWSVRZLCBtQXNzaXN0YW50RGlzcGxheUlkKTsKKyAgICAgICAgICAgIGxhdW5jaEFjdGl2aXR5Tm9XYWl0KExBVU5DSF9BU1NJU1RBTlRfQUNUSVZJVFlfSU5UT19TVEFDSywKKyAgICAgICAgICAgICAgICAgICAgRVhUUkFfQVNTSVNUQU5UX0lTX1RSQU5TTFVDRU5ULCAidHJ1ZSIpOworICAgICAgICAgICAgd2FpdEZvclZhbGlkU3RhdGVXaXRoQWN0aXZpdHlUeXBlKAorICAgICAgICAgICAgICAgICAgICBUUkFOU0xVQ0VOVF9BU1NJU1RBTlRfQUNUSVZJVFksIEFDVElWSVRZX1RZUEVfQVNTSVNUQU5UKTsKKyAgICAgICAgICAgIGFzc2VydEFzc2lzdGFudFN0YWNrRXhpc3RzKCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoVEVTVF9BQ1RJVklUWSwgdHJ1ZSk7CisKKyAgICAgICAgICAgIC8vIEdvIGhvbWUsIGxhdW5jaCBhc3Npc3RhbnQsIGxhdW5jaCBhcHAgaW50byBmdWxsc2NyZWVuIHdpdGggYWN0aXZpdHkgcHJlc2VudCwgYW5kIGdvCisgICAgICAgICAgICAvLyBiYWNrLkVuc3VyZSBob21lIGlzIHZpc2libGUuCisgICAgICAgICAgICByZW1vdmVTdGFja3NXaXRoQWN0aXZpdHlUeXBlcyhBQ1RJVklUWV9UWVBFX0FTU0lTVEFOVCk7CisgICAgICAgICAgICBsYXVuY2hIb21lQWN0aXZpdHkoKTsKKyAgICAgICAgICAgIGxhdW5jaEFjdGl2aXR5Tm9XYWl0KExBVU5DSF9BU1NJU1RBTlRfQUNUSVZJVFlfSU5UT19TVEFDSywKKyAgICAgICAgICAgICAgICAgICAgRVhUUkFfQVNTSVNUQU5UX0lTX1RSQU5TTFVDRU5ULCAidHJ1ZSIsCisgICAgICAgICAgICAgICAgICAgIEVYVFJBX0FTU0lTVEFOVF9MQVVOQ0hfTkVXX1RBU0ssIGdldEFjdGl2aXR5TmFtZShURVNUX0FDVElWSVRZKSk7CisgICAgICAgICAgICB3YWl0Rm9yVmFsaWRTdGF0ZVdpdGhBY3Rpdml0eVR5cGVBbmRXaW5kb3dpbmdNb2RlKAorICAgICAgICAgICAgICAgICAgICBURVNUX0FDVElWSVRZLCBBQ1RJVklUWV9UWVBFX1NUQU5EQVJELCBXSU5ET1dJTkdfTU9ERV9GVUxMU0NSRUVOKTsKKyAgICAgICAgICAgIGJvb2xlYW4gaXNUcmFuc2x1Y2VudCA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmlzQWN0aXZpdHlUcmFuc2x1Y2VudChURVNUX0FDVElWSVRZKTsKKyAgICAgICAgICAgIC8vIEhvbWUgc2hvdWxkIGJlIHZpc2libGUgaWYgdGhlIG9jY2x1ZGluZyBhY3Rpdml0eSBpcyB0cmFuc2x1Y2VudCwgZWxzZSBob21lIHNob3VsZG4ndAorICAgICAgICAgICAgLy8gYmUgdmlzaWJsZS4KKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0SG9tZUFjdGl2aXR5VmlzaWJsZShpc1RyYW5zbHVjZW50KTsKKyAgICAgICAgICAgIHByZXNzQmFja0J1dHRvbigpOworICAgICAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yRm9jdXNlZFN0YWNrKFdJTkRPV0lOR19NT0RFX1VOREVGSU5FRCwgQUNUSVZJVFlfVFlQRV9BU1NJU1RBTlQpOworICAgICAgICAgICAgYXNzZXJ0QXNzaXN0YW50U3RhY2tFeGlzdHMoKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvckhvbWVBY3Rpdml0eVZpc2libGUoKTsKKyAgICAgICAgICAgIGlmIChoYXNIb21lU2NyZWVuKCkpIHsKKyAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEhvbWVBY3Rpdml0eVZpc2libGUodHJ1ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIExhdW5jaCBhIGZ1bGxzY3JlZW4gYW5kIGRvY2tlZCBhcHAgYW5kIHRoZW4gbGF1bmNoIHRoZSBhc3Npc3RhbnQgYW5kIGNoZWNrIHRvIHNlZQorICAgICAgICAgICAgLy8gdGhhdCBpdAorICAgICAgICAgICAgLy8gaXMgYWxzbyB2aXNpYmxlCisgICAgICAgICAgICBpZiAoc3VwcG9ydHNTcGxpdFNjcmVlbk11bHRpV2luZG93KCkgJiYgIGFzc2lzdGFudFJ1bnNPblByaW1hcnlEaXNwbGF5KCkpIHsKKyAgICAgICAgICAgICAgICByZW1vdmVTdGFja3NXaXRoQWN0aXZpdHlUeXBlcyhBQ1RJVklUWV9UWVBFX0FTU0lTVEFOVCk7CisgICAgICAgICAgICAgICAgbGF1bmNoQWN0aXZpdGllc0luU3BsaXRTY3JlZW4oCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRMYXVuY2hBY3Rpdml0eUJ1aWxkZXIoKS5zZXRUYXJnZXRBY3Rpdml0eShET0NLRURfQUNUSVZJVFkpLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TGF1bmNoQWN0aXZpdHlCdWlsZGVyKCkuc2V0VGFyZ2V0QWN0aXZpdHkoVEVTVF9BQ1RJVklUWSkpOworICAgICAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Q29udGFpbnNTdGFjaygiTXVzdCBjb250YWluIGRvY2tlZCBzdGFjay4iLAorICAgICAgICAgICAgICAgICAgICAgICAgV0lORE9XSU5HX01PREVfU1BMSVRfU0NSRUVOX1BSSU1BUlksIEFDVElWSVRZX1RZUEVfU1RBTkRBUkQpOworICAgICAgICAgICAgICAgIGxhdW5jaEFjdGl2aXR5Tm9XYWl0KExBVU5DSF9BU1NJU1RBTlRfQUNUSVZJVFlfSU5UT19TVEFDSywKKyAgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBX0FTU0lTVEFOVF9JU19UUkFOU0xVQ0VOVCwgInRydWUiKTsKKyAgICAgICAgICAgICAgICB3YWl0Rm9yVmFsaWRTdGF0ZVdpdGhBY3Rpdml0eVR5cGUoCisgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU0xVQ0VOVF9BU1NJU1RBTlRfQUNUSVZJVFksIEFDVElWSVRZX1RZUEVfQVNTSVNUQU5UKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRBc3Npc3RhbnRTdGFja0V4aXN0cygpOworICAgICAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShET0NLRURfQUNUSVZJVFksIHRydWUpOworICAgICAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShURVNUX0FDVElWSVRZLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBGbGFreVRlc3QoYnVnSWQgPSA2OTIyOTQwMikKKyAgICBAVGVzdAorICAgIEBQcmVzdWJtaXQKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGF1bmNoSW50b1NhbWVUYXNrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSAoZmluYWwgQXNzaXN0YW50U2Vzc2lvbiBhc3Npc3RhbnRTZXNzaW9uID0gbmV3IEFzc2lzdGFudFNlc3Npb24oKSkgeworICAgICAgICAgICAgYXNzaXN0YW50U2Vzc2lvbi5zZXRWb2ljZUludGVyYWN0aW9uU2VydmljZShBU1NJU1RBTlRfVk9JQ0VfSU5URVJBQ1RJT05fU0VSVklDRSk7CisKKyAgICAgICAgICAgIC8vIExhdW5jaCB0aGUgYXNzaXN0YW50CisgICAgICAgICAgICBsYXVuY2hBY3Rpdml0eU9uRGlzcGxheU5vV2FpdChMQVVOQ0hfQVNTSVNUQU5UX0FDVElWSVRZX0ZST01fU0VTU0lPTiwKKyAgICAgICAgICAgICAgICAgICAgbUFzc2lzdGFudERpc3BsYXlJZCk7CisgICAgICAgICAgICB3YWl0Rm9yVmFsaWRTdGF0ZVdpdGhBY3Rpdml0eVR5cGUoQVNTSVNUQU5UX0FDVElWSVRZLCBBQ1RJVklUWV9UWVBFX0FTU0lTVEFOVCk7CisgICAgICAgICAgICBhc3NlcnRBc3Npc3RhbnRTdGFja0V4aXN0cygpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KEFTU0lTVEFOVF9BQ1RJVklUWSwgdHJ1ZSk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRTdGFjaygiRXhwZWN0ZWQgYXNzaXN0YW50IHN0YWNrIGZvY3VzZWQiLAorICAgICAgICAgICAgICAgICAgICBXSU5ET1dJTkdfTU9ERV9VTkRFRklORUQsIEFDVElWSVRZX1RZUEVfQVNTSVNUQU5UKTsKKyAgICAgICAgICAgIGZpbmFsIEFjdGl2aXR5TWFuYWdlclN0YXRlIGFtU3RhdGUgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoYW1TdGF0ZS5nZXRTdGFja0J5QWN0aXZpdHlUeXBlKEFDVElWSVRZX1RZUEVfQVNTSVNUQU5UKS5nZXRUYXNrcygpLAorICAgICAgICAgICAgICAgICAgICBoYXNTaXplKDEpKTsKKyAgICAgICAgICAgIGZpbmFsIGludCB0YXNrSWQgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRUYXNrQnlBY3Rpdml0eShBU1NJU1RBTlRfQUNUSVZJVFkpCisgICAgICAgICAgICAgICAgICAgIC5tVGFza0lkOworCisgICAgICAgICAgICAvLyBMYXVuY2ggYSBuZXcgZnVsbHNjcmVlbiBhY3Rpdml0eQorICAgICAgICAgICAgLy8gVXNpbmcgQW5pbWF0aW9uIFRlc3QgQWN0aXZpdHkgYmVjYXVzZSBpdCBpcyBvcGFxdWUgb24gYWxsIGRldmljZXMuCisgICAgICAgICAgICBsYXVuY2hBY3Rpdml0eU9uRGlzcGxheShBTklNQVRJT05fVEVTVF9BQ1RJVklUWSwgbUFzc2lzdGFudERpc3BsYXlJZCk7CisgICAgICAgICAgICAvLyBXYWl0IGZvciBhbmltYXRpb24gZmluaXNoZWQuCisgICAgICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JBY3Rpdml0eVN0YXRlKEFOSU1BVElPTl9URVNUX0FDVElWSVRZLCBTVEFURV9SRVNVTUVEKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShBU1NJU1RBTlRfQUNUSVZJVFksIGZhbHNlKTsKKworICAgICAgICAgICAgLy8gTGF1bmNoIHRoZSBhc3Npc3RhbnQgYWdhaW4gYW5kIGVuc3VyZSB0aGF0IGl0IGdvZXMgaW50byB0aGUgc2FtZSB0YXNrCisgICAgICAgICAgICBsYXVuY2hBY3Rpdml0eU9uRGlzcGxheU5vV2FpdChMQVVOQ0hfQVNTSVNUQU5UX0FDVElWSVRZX0ZST01fU0VTU0lPTiwKKyAgICAgICAgICAgICAgICAgICAgbUFzc2lzdGFudERpc3BsYXlJZCk7CisgICAgICAgICAgICB3YWl0Rm9yVmFsaWRTdGF0ZVdpdGhBY3Rpdml0eVR5cGUoQVNTSVNUQU5UX0FDVElWSVRZLCBBQ1RJVklUWV9UWVBFX0FTU0lTVEFOVCk7CisgICAgICAgICAgICBhc3NlcnRBc3Npc3RhbnRTdGFja0V4aXN0cygpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KEFTU0lTVEFOVF9BQ1RJVklUWSwgdHJ1ZSk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRTdGFjaygiRXhwZWN0ZWQgYXNzaXN0YW50IHN0YWNrIGZvY3VzZWQiLAorICAgICAgICAgICAgICAgICAgICBXSU5ET1dJTkdfTU9ERV9VTkRFRklORUQsIEFDVElWSVRZX1RZUEVfQVNTSVNUQU5UKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoYW1TdGF0ZS5nZXRTdGFja0J5QWN0aXZpdHlUeXBlKEFDVElWSVRZX1RZUEVfQVNTSVNUQU5UKS5nZXRUYXNrcygpLAorICAgICAgICAgICAgICAgICAgICBoYXNTaXplKDEpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0YXNrSWQsCisgICAgICAgICAgICAgICAgICAgIG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFRhc2tCeUFjdGl2aXR5KEFTU0lTVEFOVF9BQ1RJVklUWSkubVRhc2tJZCk7CisKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBpbm5lZFN0YWNrV2l0aEFzc2lzdGFudCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3N1bWVUcnVlKHN1cHBvcnRzUGlwKCkpOworICAgICAgICBhc3N1bWVUcnVlKHN1cHBvcnRzU3BsaXRTY3JlZW5NdWx0aVdpbmRvdygpKTsKKworICAgICAgICB0cnkgKGZpbmFsIEFzc2lzdGFudFNlc3Npb24gYXNzaXN0YW50U2Vzc2lvbiA9IG5ldyBBc3Npc3RhbnRTZXNzaW9uKCkpIHsKKyAgICAgICAgICAgIGFzc2lzdGFudFNlc3Npb24uc2V0Vm9pY2VJbnRlcmFjdGlvblNlcnZpY2UoQVNTSVNUQU5UX1ZPSUNFX0lOVEVSQUNUSU9OX1NFUlZJQ0UpOworCisgICAgICAgICAgICAvLyBMYXVuY2ggYSBmdWxsc2NyZWVuIGFjdGl2aXR5IGFuZCBhIFBJUCBhY3Rpdml0eSwgdGhlbiBsYXVuY2ggdGhlIGFzc2lzdGFudCwgYW5kCisgICAgICAgICAgICAvLyBlbnN1cmUgdGhhdCB0aGUgdGVzdCBhY3Rpdml0eSBpcyBzdGlsbCB2aXNpYmxlCisgICAgICAgICAgICBsYXVuY2hBY3Rpdml0eShURVNUX0FDVElWSVRZKTsKKyAgICAgICAgICAgIGxhdW5jaEFjdGl2aXR5KFBJUF9BQ1RJVklUWSwgRVhUUkFfRU5URVJfUElQLCAidHJ1ZSIpOworICAgICAgICAgICAgbGF1bmNoQWN0aXZpdHlOb1dhaXQoTEFVTkNIX0FTU0lTVEFOVF9BQ1RJVklUWV9JTlRPX1NUQUNLLAorICAgICAgICAgICAgICAgICAgICBFWFRSQV9BU1NJU1RBTlRfSVNfVFJBTlNMVUNFTlQsIFN0cmluZy52YWx1ZU9mKHRydWUpKTsKKyAgICAgICAgICAgIHdhaXRGb3JWYWxpZFN0YXRlV2l0aEFjdGl2aXR5VHlwZSgKKyAgICAgICAgICAgICAgICAgICAgVFJBTlNMVUNFTlRfQVNTSVNUQU5UX0FDVElWSVRZLCBBQ1RJVklUWV9UWVBFX0FTU0lTVEFOVCk7CisgICAgICAgICAgICBhc3NlcnRBc3Npc3RhbnRTdGFja0V4aXN0cygpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFRSQU5TTFVDRU5UX0FTU0lTVEFOVF9BQ1RJVklUWSwgdHJ1ZSk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoUElQX0FDVElWSVRZLCB0cnVlKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShURVNUX0FDVElWSVRZLCB0cnVlKTsKKworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdhaXRGb3JWYWxpZFN0YXRlV2l0aEFjdGl2aXR5VHlwZShDb21wb25lbnROYW1lIGFjdGl2aXR5TmFtZSwgaW50IGFjdGl2aXR5VHlwZSkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JWYWxpZFN0YXRlKG5ldyBXYWl0Rm9yVmFsaWRBY3Rpdml0eVN0YXRlLkJ1aWxkZXIoYWN0aXZpdHlOYW1lKQorICAgICAgICAgICAgICAgIC5zZXRBY3Rpdml0eVR5cGUoYWN0aXZpdHlUeXBlKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgd2FpdEZvclZhbGlkU3RhdGVXaXRoQWN0aXZpdHlUeXBlQW5kV2luZG93aW5nTW9kZShDb21wb25lbnROYW1lIGFjdGl2aXR5TmFtZSwKKyAgICAgICAgICAgIGludCBhY3Rpdml0eVR5cGUsIGludCB3aW5kb3dpbmdNb2RlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yVmFsaWRTdGF0ZShuZXcgV2FpdEZvclZhbGlkQWN0aXZpdHlTdGF0ZS5CdWlsZGVyKGFjdGl2aXR5TmFtZSkKKyAgICAgICAgICAgICAgICAuc2V0QWN0aXZpdHlUeXBlKGFjdGl2aXR5VHlwZSkKKyAgICAgICAgICAgICAgICAuc2V0V2luZG93aW5nTW9kZSh3aW5kb3dpbmdNb2RlKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBc3NlcnRzIHRoYXQgdGhlIGFzc2lzdGFudCBzdGFjayBleGlzdHMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydEFzc2lzdGFudFN0YWNrRXhpc3RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Q29udGFpbnNTdGFjaygiTXVzdCBjb250YWluIGFzc2lzdGFudCBzdGFjay4iLAorICAgICAgICAgICAgICAgIFdJTkRPV0lOR19NT0RFX1VOREVGSU5FRCwgQUNUSVZJVFlfVFlQRV9BU1NJU1RBTlQpOworICAgIH0KKworICAgIC8vIEFueSAyRCBBY3Rpdml0eSBpbiBWUiBtb2RlIGlzIHJ1biBvbiBhIHNwZWNpYWwgVlIgdmlydHVhbCBkaXNwbGF5LCBzbyBjaGVjayBpZiB0aGUgQXNzaXN0YW50CisgICAgLy8gaXMgZ29pbmcgdG8gcnVuIG9uIHRoZSBzYW1lIGRpc3BsYXkgYXMgb3RoZXIgdGFza3MuCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gYXNzaXN0YW50UnVuc09uUHJpbWFyeURpc3BsYXkoKSB7CisgICAgICAgIHJldHVybiBtQXNzaXN0YW50RGlzcGxheUlkID09IERFRkFVTFRfRElTUExBWTsKKyAgICB9CisKKyAgICAvKiogSGVscGVyIGNsYXNzIHRvIHNhdmUsIHNldCwgYW5kIHJlc3RvcmUKKyAgICAgKiB7QGxpbmsgU2V0dGluZ3MuU2VjdXJlI1ZPSUNFX0lOVEVSQUNUSU9OX1NFUlZJQ0V9IHN5c3RlbSBwcmVmZXJlbmNlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEFzc2lzdGFudFNlc3Npb24gZXh0ZW5kcyBTZXR0aW5nc1Nlc3Npb248U3RyaW5nPiB7CisgICAgICAgIEFzc2lzdGFudFNlc3Npb24oKSB7CisgICAgICAgICAgICBzdXBlcihTZXR0aW5ncy5TZWN1cmUuZ2V0VXJpRm9yKFNldHRpbmdzLlNlY3VyZS5WT0lDRV9JTlRFUkFDVElPTl9TRVJWSUNFKSwKKyAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlOjpnZXRTdHJpbmcsIFNldHRpbmdzLlNlY3VyZTo6cHV0U3RyaW5nKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc2V0Vm9pY2VJbnRlcmFjdGlvblNlcnZpY2UoQ29tcG9uZW50TmFtZSBhc3Npc3RhbnROYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHN1cGVyLnNldChnZXRBY3Rpdml0eU5hbWUoYXNzaXN0YW50TmFtZSkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJDb25maWdDaGFuZ2VUZXN0cy5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJDb25maWdDaGFuZ2VUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMjg3ZWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlckNvbmZpZ0NoYW5nZVRlc3RzLmphdmEKQEAgLTAsMCArMSwzMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLmFtOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkFjdGl2aXR5TWFuYWdlclN0YXRlLlNUQVRFX1JFU1VNRUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudE5hbWVVdGlscy5nZXRMb2dUYWc7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuRk9OVF9TQ0FMRV9BQ1RJVklUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5GT05UX1NDQUxFX05PX1JFTEFVTkNIX0FDVElWSVRZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLk5PX1JFTEFVTkNIX0FDVElWSVRZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLlJFU0laRUFCTEVfQUNUSVZJVFk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuVEVTVF9BQ1RJVklUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uU3RhdGVMb2dnZXIubG9nOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5TdGF0ZUxvZ2dlci5sb2dFOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuU3VyZmFjZS5ST1RBVElPTl8wOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuU3VyZmFjZS5ST1RBVElPTl8xODA7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5TdXJmYWNlLlJPVEFUSU9OXzI3MDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LlN1cmZhY2UuUk9UQVRJT05fOTA7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc3VtZS5hc3N1bWVGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc3VtZS5hc3N1bWVUcnVlOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlByZXN1Ym1pdDsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOworaW1wb3J0IGFuZHJvaWQuc2VydmVyLmFtLnNldHRpbmdzLlNldHRpbmdzU2Vzc2lvbjsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5GbGFreVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCisvKioKKyAqIEJ1aWxkL0luc3RhbGwvUnVuOgorICogICAgIGF0ZXN0IEN0c0FjdGl2aXR5TWFuYWdlckRldmljZVRlc3RDYXNlczpBY3Rpdml0eU1hbmFnZXJDb25maWdDaGFuZ2VUZXN0cworICovCitwdWJsaWMgY2xhc3MgQWN0aXZpdHlNYW5hZ2VyQ29uZmlnQ2hhbmdlVGVzdHMgZXh0ZW5kcyBBY3Rpdml0eU1hbmFnZXJUZXN0QmFzZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBFWFBFQ1RFRF9GT05UX1NJWkVfU1AgPSAxMC4wZjsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJvdGF0aW9uOTBSZWxhdW5jaCgpIHRocm93cyBFeGNlcHRpb257CisgICAgICAgIGFzc3VtZVRydWUoIlNraXBwaW5nIHRlc3Q6IG5vIHJvdGF0aW9uIHN1cHBvcnQiLCBzdXBwb3J0c1JvdGF0aW9uKCkpOworCisgICAgICAgIC8vIFNob3VsZCByZWxhdW5jaCBvbiBldmVyeSByb3RhdGlvbiBhbmQgcmVjZWl2ZSBubyBvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKCkKKyAgICAgICAgdGVzdFJvdGF0aW9uKFRFU1RfQUNUSVZJVFksIDEsIDEsIDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJvdGF0aW9uOTBOb1JlbGF1bmNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc3VtZVRydWUoIlNraXBwaW5nIHRlc3Q6IG5vIHJvdGF0aW9uIHN1cHBvcnQiLCBzdXBwb3J0c1JvdGF0aW9uKCkpOworCisgICAgICAgIC8vIFNob3VsZCByZWNlaXZlIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQoKSBvbiBldmVyeSByb3RhdGlvbiBhbmQgbm8gcmVsYXVuY2gKKyAgICAgICAgdGVzdFJvdGF0aW9uKE5PX1JFTEFVTkNIX0FDVElWSVRZLCAxLCAwLCAxKTsKKyAgICB9CisKKyAgICAvLyBUT0RPKGIvMTEwMzgyMDI4KTogRml4IHJlbGF1bmNoIHRlc3RpbmcgYW5kIHVzZSBhbiBhY3Rpdml0eSB0aGF0IGRvZXNuJ3QgaGFuZGxlIGNvbmZpZyBjaGFuZ2UKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSb3RhdGlvbjE4MFJlbGF1bmNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc3VtZVRydWUoIlNraXBwaW5nIHRlc3Q6IG5vIHJvdGF0aW9uIHN1cHBvcnQiLCBzdXBwb3J0c1JvdGF0aW9uKCkpOworICAgICAgICAvLyBUT0RPKGIvMTEwNTMzMjI2KTogRml4IHRlc3Qgb24gZGV2aWNlcyB3aXRoIGRpc3BsYXkgY3V0b3V0CisgICAgICAgIGFzc3VtZUZhbHNlKCJTa2lwcGluZyB0ZXN0OiBkaXNwbGF5IGN1dG91dCBwcmVzZW50LCBjYW4ndCBwcmVkaWN0IGV4YWN0IGxpZmVjeWNsZSIsCisgICAgICAgICAgICAgICAgaGFzRGlzcGxheUN1dG91dCgpKTsKKworICAgICAgICAvLyBTaG91bGQgcmVjZWl2ZSBhIHJlbGF1bmNoCisgICAgICAgIHRlc3RSb3RhdGlvbihURVNUX0FDVElWSVRZLCAyLCAwLCAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSb3RhdGlvbjE4ME5vUmVsYXVuY2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzdW1lVHJ1ZSgiU2tpcHBpbmcgdGVzdDogbm8gcm90YXRpb24gc3VwcG9ydCIsIHN1cHBvcnRzUm90YXRpb24oKSk7CisgICAgICAgIC8vIFRPRE8oYi8xMTA1MzMyMjYpOiBGaXggdGVzdCBvbiBkZXZpY2VzIHdpdGggZGlzcGxheSBjdXRvdXQKKyAgICAgICAgYXNzdW1lRmFsc2UoIlNraXBwaW5nIHRlc3Q6IGRpc3BsYXkgY3V0b3V0IHByZXNlbnQsIGNhbid0IHByZWRpY3QgZXhhY3QgbGlmZWN5Y2xlIiwKKyAgICAgICAgICAgICAgICBoYXNEaXNwbGF5Q3V0b3V0KCkpOworCisgICAgICAgIC8vIFNob3VsZCByZWNlaXZlIG5vdGhpbmcKKyAgICAgICAgdGVzdFJvdGF0aW9uKE5PX1JFTEFVTkNIX0FDVElWSVRZLCAyLCAwLCAwKTsKKyAgICB9CisKKyAgICBARmxha3lUZXN0KGJ1Z0lkID0gNzM3MDExODUpCisgICAgQFByZXN1Ym1pdAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENoYW5nZUZvbnRTY2FsZVJlbGF1bmNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFNob3VsZCByZWxhdW5jaCBhbmQgcmVjZWl2ZSBubyBvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKCkKKyAgICAgICAgdGVzdENoYW5nZUZvbnRTY2FsZShGT05UX1NDQUxFX0FDVElWSVRZLCB0cnVlIC8qIHJlbGF1bmNoICovKTsKKyAgICB9CisKKyAgICBARmxha3lUZXN0KGJ1Z0lkID0gNzM4MTI0NTEpCisgICAgQFByZXN1Ym1pdAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENoYW5nZUZvbnRTY2FsZU5vUmVsYXVuY2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gU2hvdWxkIHJlY2VpdmUgb25Db25maWd1cmF0aW9uQ2hhbmdlZCgpIGFuZCBubyByZWxhdW5jaAorICAgICAgICB0ZXN0Q2hhbmdlRm9udFNjYWxlKEZPTlRfU0NBTEVfTk9fUkVMQVVOQ0hfQUNUSVZJVFksIGZhbHNlIC8qIHJlbGF1bmNoICovKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGFjdGl2aXR5IGNvbmZpZ3VyYXRpb24gY2hhbmdlcyBmb3IgZGV2aWNlcyB3aXRoIGN1dG91dChzKS4gTGFuZHNjYXBlIGFuZAorICAgICAqIHJldmVyc2UtbGFuZHNjYXBlIHJvdGF0aW9ucyBzaG91bGQgcmVzdWx0IGluIHNhbWUgc2NyZWVuIHNwYWNlIGF2YWlsYWJsZSBmb3IgYXBwcy4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25maWdDaGFuZ2VXaGVuUm90YXRpbmdXaXRoQ3V0b3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc3VtZVRydWUoIlNraXBwaW5nIHRlc3Q6IG5vIHJvdGF0aW9uIHN1cHBvcnQiLCBzdXBwb3J0c1JvdGF0aW9uKCkpOworICAgICAgICBhc3N1bWVUcnVlKCJTa2lwcGluZyB0ZXN0OiBubyBkaXNwbGF5IGN1dG91dCIsIGhhc0Rpc3BsYXlDdXRvdXQoKSk7CisKKyAgICAgICAgLy8gU3RhcnQgYW4gYWN0aXZpdHkgdGhhdCBoYW5kbGVzIGNvbmZpZyBjaGFuZ2VzCisgICAgICAgIGxhdW5jaEFjdGl2aXR5KFJFU0laRUFCTEVfQUNUSVZJVFkpOworICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoUkVTSVpFQUJMRV9BQ1RJVklUWSwgdHJ1ZSAvKiB2aXNpYmxlICovKTsKKyAgICAgICAgZmluYWwgaW50IGRpc3BsYXlJZCA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldERpc3BsYXlCeUFjdGl2aXR5KFJFU0laRUFCTEVfQUNUSVZJVFkpOworCisgICAgICAgIC8vIDAgLSAxODAgcm90YXRpb24gb3IgMjcwIC0gOTAgcm90YXRpb24gc2hvdWxkIGhhdmUgc2FtZSBzY3JlZW4gc3BhY2UKKyAgICAgICAgYm9vbGVhbiBjb25maWdTYW1lMF8xODAgPSBmYWxzZSwgY29uZmlnU2FtZTI3MF85MCA9IGZhbHNlOworICAgICAgICBmaW5hbCBpbnRbXSBjdXRvdXRSb3RhdGlvbnMgPSB7IFJPVEFUSU9OXzE4MCwgUk9UQVRJT05fOTAsIFJPVEFUSU9OXzI3MCB9OworCisgICAgICAgIC8vIFJvdGF0ZSB0aGUgYWN0aXZpdHkgYW5kIGNoZWNrIHRoYXQgdGhlIG9yaWVudGF0aW9uIGRvZXNuJ3QgY2hhbmdlIGF0IGxlYXN0IG9uY2UKKyAgICAgICAgdHJ5IChmaW5hbCBSb3RhdGlvblNlc3Npb24gcm90YXRpb25TZXNzaW9uID0gbmV3IFJvdGF0aW9uU2Vzc2lvbigpKSB7CisgICAgICAgICAgICByb3RhdGlvblNlc3Npb24uc2V0KFJPVEFUSU9OXzApOworCisgICAgICAgICAgICBmaW5hbCBSZXBvcnRlZFNpemVzW10gc2l6ZXMgPSBuZXcgUmVwb3J0ZWRTaXplc1tjdXRvdXRSb3RhdGlvbnMubGVuZ3RoXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY3V0b3V0Um90YXRpb25zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHJvdGF0aW9uID0gY3V0b3V0Um90YXRpb25zW2ldOworICAgICAgICAgICAgICAgIGZpbmFsIExvZ1NlcGFyYXRvciBsb2dTZXBhcmF0b3IgPSBzZXBhcmF0ZUxvZ3MoKTsKKyAgICAgICAgICAgICAgICByb3RhdGlvblNlc3Npb24uc2V0KHJvdGF0aW9uKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbmV3RGV2aWNlUm90YXRpb24gPSBnZXREZXZpY2VSb3RhdGlvbihkaXNwbGF5SWQpOworICAgICAgICAgICAgICAgIGlmIChyb3RhdGlvbiAhPSBuZXdEZXZpY2VSb3RhdGlvbikgeworICAgICAgICAgICAgICAgICAgICBsb2coIlRoaXMgZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBsb2NrZWQgdXNlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAicm90YXRpb24gbW9kZS4gTm90IGNvbnRpbnVpbmcgdGhlIHJvdGF0aW9uIGNoZWNrcy4iKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gUmVjb3JkIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyBvbiByb3RhdGlvbnMgYmV0d2VlbiBvcHBvc2l0ZSBvcmllbnRhdGlvbnMKKyAgICAgICAgICAgICAgICBzaXplc1tpXSA9IGdldExhc3RSZXBvcnRlZFNpemVzRm9yQWN0aXZpdHkoUkVTSVpFQUJMRV9BQ1RJVklUWSwgbG9nU2VwYXJhdG9yKTsKKyAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZ1NhbWUwXzE4MCA9IHNpemVzW2ldID09IG51bGw7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpID09IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnU2FtZTI3MF85MCA9IHNpemVzW2ldID09IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhc3NlcnRUaGF0KCJBIGRldmljZSB3aXRoIGN1dG91dCBzaG91bGQgaGF2ZSBzYW1lIGF2YWlsYWJsZSBzY3JlZW4gc3BhY2UgaW4gIgorICAgICAgICAgICAgICAgICAgICArICJsYW5kc2NhcGUgYW5kIHJldmVyc2UtbGFuZHNjYXBlIiwgY29uZmlnU2FtZTBfMTgwIHx8IGNvbmZpZ1NhbWUyNzBfOTApOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RSb3RhdGlvbihDb21wb25lbnROYW1lIGFjdGl2aXR5TmFtZSwgaW50IHJvdGF0aW9uU3RlcCwgaW50IG51bVJlbGF1bmNoLAorICAgICAgICAgICAgaW50IG51bUNvbmZpZ0NoYW5nZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGxhdW5jaEFjdGl2aXR5KGFjdGl2aXR5TmFtZSk7CisKKyAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUoYWN0aXZpdHlOYW1lKTsKKworICAgICAgICBmaW5hbCBpbnQgaW5pdGlhbFJvdGF0aW9uID0gNCAtIHJvdGF0aW9uU3RlcDsKKyAgICAgICAgdHJ5IChmaW5hbCBSb3RhdGlvblNlc3Npb24gcm90YXRpb25TZXNzaW9uID0gbmV3IFJvdGF0aW9uU2Vzc2lvbigpKSB7CisgICAgICAgICAgICByb3RhdGlvblNlc3Npb24uc2V0KGluaXRpYWxSb3RhdGlvbik7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShhY3Rpdml0eU5hbWUpOworICAgICAgICAgICAgZmluYWwgaW50IGFjdHVhbFN0YWNrSWQgPQorICAgICAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRUYXNrQnlBY3Rpdml0eShhY3Rpdml0eU5hbWUpLm1TdGFja0lkOworICAgICAgICAgICAgZmluYWwgaW50IGRpc3BsYXlJZCA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFN0YWNrQnlJZChhY3R1YWxTdGFja0lkKS5tRGlzcGxheUlkOworICAgICAgICAgICAgZmluYWwgaW50IG5ld0RldmljZVJvdGF0aW9uID0gZ2V0RGV2aWNlUm90YXRpb24oZGlzcGxheUlkKTsKKyAgICAgICAgICAgIGlmIChuZXdEZXZpY2VSb3RhdGlvbiA9PSBJTlZBTElEX0RFVklDRV9ST1RBVElPTikgeworICAgICAgICAgICAgICAgIGxvZ0UoIkdvdCBhbiBpbnZhbGlkIGRldmljZSByb3RhdGlvbiB2YWx1ZS4gIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiQ29udGludWluZyB0aGUgdGVzdCBkZXNwaXRlIG9mIHRoYXQsIGJ1dCBpdCBpcyBsaWtlbHkgdG8gZmFpbC4iKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobmV3RGV2aWNlUm90YXRpb24gIT0gaW5pdGlhbFJvdGF0aW9uKSB7CisgICAgICAgICAgICAgICAgbG9nKCJUaGlzIGRldmljZSBkb2Vzbid0IHN1cHBvcnQgdXNlciByb3RhdGlvbiAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJtb2RlLiBOb3QgY29udGludWluZyB0aGUgcm90YXRpb24gY2hlY2tzLiIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpbnQgcm90YXRpb24gPSAwOyByb3RhdGlvbiA8IDQ7IHJvdGF0aW9uICs9IHJvdGF0aW9uU3RlcCkgeworICAgICAgICAgICAgICAgIGZpbmFsIExvZ1NlcGFyYXRvciBsb2dTZXBhcmF0b3IgPSBzZXBhcmF0ZUxvZ3MoKTsKKyAgICAgICAgICAgICAgICByb3RhdGlvblNlc3Npb24uc2V0KHJvdGF0aW9uKTsKKyAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShhY3Rpdml0eU5hbWUpOworICAgICAgICAgICAgICAgIGFzc2VydFJlbGF1bmNoT3JDb25maWdDaGFuZ2VkKGFjdGl2aXR5TmFtZSwgbnVtUmVsYXVuY2gsIG51bUNvbmZpZ0NoYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ1NlcGFyYXRvcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogSGVscGVyIGNsYXNzIHRvIHNhdmUsIHNldCwgYW5kIHJlc3RvcmUgZm9udF9zY2FsZSBwcmVmZXJlbmNlcy4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBGb250U2NhbGVTZXNzaW9uIGV4dGVuZHMgU2V0dGluZ3NTZXNzaW9uPEZsb2F0PiB7CisgICAgICAgIEZvbnRTY2FsZVNlc3Npb24oKSB7CisgICAgICAgICAgICBzdXBlcihTZXR0aW5ncy5TeXN0ZW0uZ2V0VXJpRm9yKFNldHRpbmdzLlN5c3RlbS5GT05UX1NDQUxFKSwKKyAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtOjpnZXRGbG9hdCwKKyAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtOjpwdXRGbG9hdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdENoYW5nZUZvbnRTY2FsZSgKKyAgICAgICAgICAgIENvbXBvbmVudE5hbWUgYWN0aXZpdHlOYW1lLCBib29sZWFuIHJlbGF1bmNoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IChmaW5hbCBGb250U2NhbGVTZXNzaW9uIGZvbnRTY2FsZVNlc3Npb24gPSBuZXcgRm9udFNjYWxlU2Vzc2lvbigpKSB7CisgICAgICAgICAgICBmb250U2NhbGVTZXNzaW9uLnNldCgxLjBmKTsKKyAgICAgICAgICAgIExvZ1NlcGFyYXRvciBsb2dTZXBhcmF0b3IgPSBzZXBhcmF0ZUxvZ3MoKTsKKyAgICAgICAgICAgIGxhdW5jaEFjdGl2aXR5KGFjdGl2aXR5TmFtZSk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShhY3Rpdml0eU5hbWUpOworCisgICAgICAgICAgICBmaW5hbCBpbnQgZGVuc2l0eURwaSA9IGdldEFjdGl2aXR5RGVuc2l0eURwaShhY3Rpdml0eU5hbWUsIGxvZ1NlcGFyYXRvcik7CisKKyAgICAgICAgICAgIGZvciAoZmxvYXQgZm9udFNjYWxlID0gMC44NWY7IGZvbnRTY2FsZSA8PSAxLjNmOyBmb250U2NhbGUgKz0gMC4xNWYpIHsKKyAgICAgICAgICAgICAgICBsb2dTZXBhcmF0b3IgPSBzZXBhcmF0ZUxvZ3MoKTsKKyAgICAgICAgICAgICAgICBmb250U2NhbGVTZXNzaW9uLnNldChmb250U2NhbGUpOworICAgICAgICAgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKGFjdGl2aXR5TmFtZSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0UmVsYXVuY2hPckNvbmZpZ0NoYW5nZWQoYWN0aXZpdHlOYW1lLCByZWxhdW5jaCA/IDEgOiAwLCByZWxhdW5jaCA/IDAgOiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgbG9nU2VwYXJhdG9yKTsKKworICAgICAgICAgICAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBkaXNwbGF5IG1ldHJpY3MgYXJlIHVwZGF0ZWQsIGFuZCB0aGVyZWZvcmUgdGhlIHRleHQgc2l6ZSBpcyBhbHNvCisgICAgICAgICAgICAgICAgLy8gdXBkYXRlZCBhY2NvcmRpbmdseS4KKyAgICAgICAgICAgICAgICBhc3NlcnRFeHBlY3RlZEZvbnRQaXhlbFNpemUoYWN0aXZpdHlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVkUGl4ZWxzVG9QaXhlbHMoRVhQRUNURURfRk9OVF9TSVpFX1NQLCBmb250U2NhbGUsIGRlbnNpdHlEcGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgbG9nU2VwYXJhdG9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdXBkYXRpbmcgYXBwbGljYXRpb24gaW5mbyB3aGVuIGFwcCBpcyBydW5uaW5nLiBBbiBhY3Rpdml0eSB3aXRoIG1hdGNoaW5nIHBhY2thZ2UgbmFtZQorICAgICAqIG11c3QgYmUgcmVjcmVhdGVkIGFuZCBpdHMgYXNzZXQgc2VxdWVuY2UgbnVtYmVyIG11c3QgYmUgaW5jcmVtZW50ZWQuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQXBwbGljYXRpb25JbmZvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIExvZ1NlcGFyYXRvciBmaXJzdExvZ1NlcGFyYXRvciA9IHNlcGFyYXRlTG9ncygpOworCisgICAgICAgIC8vIExhdW5jaCBhbiBhY3Rpdml0eSB0aGF0IHByaW50cyBhcHBsaWVkIGNvbmZpZy4KKyAgICAgICAgbGF1bmNoQWN0aXZpdHkoVEVTVF9BQ1RJVklUWSk7CisgICAgICAgIGZpbmFsIGludCBhc3NldFNlcSA9IHJlYWRBc3NldFNlcU51bWJlcihURVNUX0FDVElWSVRZLCBmaXJzdExvZ1NlcGFyYXRvcik7CisKKyAgICAgICAgZmluYWwgTG9nU2VwYXJhdG9yIGxvZ1NlcGFyYXRvciA9IHNlcGFyYXRlTG9ncygpOworICAgICAgICAvLyBVcGRhdGUgcGFja2FnZSBpbmZvLgorICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKCJhbSB1cGRhdGUtYXBwaW5mbyBhbGwgIiArIFRFU1RfQUNUSVZJVFkuZ2V0UGFja2FnZU5hbWUoKSk7CisgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvcldpdGhBbVN0YXRlKChhbVN0YXRlKSAtPiB7CisgICAgICAgICAgICAvLyBXYWl0IGZvciBhY3Rpdml0eSB0byBiZSByZXN1bWVkIGFuZCBhc3NldCBzZXEgbnVtYmVyIHRvIGJlIHVwZGF0ZWQuCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiByZWFkQXNzZXRTZXFOdW1iZXIoVEVTVF9BQ1RJVklUWSwgbG9nU2VwYXJhdG9yKSA9PSBhc3NldFNlcSArIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGFtU3RhdGUuaGFzQWN0aXZpdHlTdGF0ZShURVNUX0FDVElWSVRZLCBTVEFURV9SRVNVTUVEKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nRSgiRXJyb3Igd2FpdGluZyBmb3IgdmFsaWQgc3RhdGU6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9LCAiV2FpdGluZyBhc3NldCBzZXF1ZW5jZSBudW1iZXIgdG8gYmUgdXBkYXRlZCBhbmQgZm9yIGFjdGl2aXR5IHRvIGJlIHJlc3VtZWQuIik7CisKKyAgICAgICAgLy8gQ2hlY2sgaWYgYWN0aXZpdHkgaXMgcmVsYXVuY2hlZCBhbmQgYXNzZXQgc2VxIGlzIHVwZGF0ZWQuCisgICAgICAgIGFzc2VydFJlbGF1bmNoT3JDb25maWdDaGFuZ2VkKFRFU1RfQUNUSVZJVFksIDEgLyogbnVtUmVsYXVuY2ggKi8sCisgICAgICAgICAgICAgICAgMCAvKiBudW1Db25maWdDaGFuZ2UgKi8sIGxvZ1NlcGFyYXRvcik7CisgICAgICAgIGZpbmFsIGludCBuZXdBc3NldFNlcSA9IHJlYWRBc3NldFNlcU51bWJlcihURVNUX0FDVElWSVRZLCBsb2dTZXBhcmF0b3IpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkFzc2V0IHNlcXVlbmNlIG51bWJlciBtdXN0IGJlIGluY3JlbWVudGVkLiIsIGFzc2V0U2VxICsgMSwgbmV3QXNzZXRTZXEpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gc0NvbmZpZ3VyYXRpb25QYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKAorICAgICAgICAgICAgIiguKyk6IENvbmZpZ3VyYXRpb246IFxceyguKikgYXMuKFxcZCspKC4qKVxcfSIpOworCisgICAgLyoqIFJlYWQgYXNzZXQgc2VxdWVuY2UgbnVtYmVyIGluIGxhc3QgYXBwbGllZCBjb25maWd1cmF0aW9uIGZyb20gbG9ncy4gKi8KKyAgICBwcml2YXRlIGludCByZWFkQXNzZXRTZXFOdW1iZXIoQ29tcG9uZW50TmFtZSBhY3Rpdml0eU5hbWUsIExvZ1NlcGFyYXRvciBsb2dTZXBhcmF0b3IpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nW10gbGluZXMgPSBnZXREZXZpY2VMb2dzRm9yQ29tcG9uZW50cyhsb2dTZXBhcmF0b3IsIGdldExvZ1RhZyhhY3Rpdml0eU5hbWUpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IGxpbmVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbGluZSA9IGxpbmVzW2ldLnRyaW0oKTsKKyAgICAgICAgICAgIGZpbmFsIE1hdGNoZXIgbWF0Y2hlciA9IHNDb25maWd1cmF0aW9uUGF0dGVybi5tYXRjaGVyKGxpbmUpOworICAgICAgICAgICAgaWYgKG1hdGNoZXIubWF0Y2hlcygpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGFzc2V0U2VxTnVtYmVyID0gbWF0Y2hlci5ncm91cCgzKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gSW50ZWdlci52YWx1ZU9mKGFzc2V0U2VxTnVtYmVyKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUsIGFzc2V0IHNlcSBudW1iZXIgaXMgbm90IHByaW50ZWQgd2hlbiBub3Qgc2V0LgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLyBDYWxjdWxhdGUgdGhlIHNjYWxlZCBwaXhlbCBzaXplIGp1c3QgbGlrZSB0aGUgZGV2aWNlIGlzIHN1cHBvc2VkIHRvLgorICAgIHByaXZhdGUgc3RhdGljIGludCBzY2FsZWRQaXhlbHNUb1BpeGVscyhmbG9hdCBzcCwgZmxvYXQgZm9udFNjYWxlLCBpbnQgZGVuc2l0eURwaSkgeworICAgICAgICBmaW5hbCBpbnQgREVGQVVMVF9ERU5TSVRZID0gMTYwOworICAgICAgICBmbG9hdCBmID0gZGVuc2l0eURwaSAqICgxLjBmIC8gREVGQVVMVF9ERU5TSVRZKSAqIGZvbnRTY2FsZSAqIHNwOworICAgICAgICByZXR1cm4gKGludCkgKChmID49IDApID8gKGYgKyAwLjVmKSA6IChmIC0gMC41ZikpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFBhdHRlcm4gc0RldmljZURlbnNpdHlQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCJeKC4rKTogZm9udEFjdGl2aXR5RHBpPSguKykkIik7CisKKyAgICBwcml2YXRlIGludCBnZXRBY3Rpdml0eURlbnNpdHlEcGkoQ29tcG9uZW50TmFtZSBhY3Rpdml0eU5hbWUsIExvZ1NlcGFyYXRvciBsb2dTZXBhcmF0b3IpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nW10gbGluZXMgPSBnZXREZXZpY2VMb2dzRm9yQ29tcG9uZW50cyhsb2dTZXBhcmF0b3IsIGdldExvZ1RhZyhhY3Rpdml0eU5hbWUpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IGxpbmVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbGluZSA9IGxpbmVzW2ldLnRyaW0oKTsKKyAgICAgICAgICAgIGZpbmFsIE1hdGNoZXIgbWF0Y2hlciA9IHNEZXZpY2VEZW5zaXR5UGF0dGVybi5tYXRjaGVyKGxpbmUpOworICAgICAgICAgICAgaWYgKG1hdGNoZXIubWF0Y2hlcygpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQobWF0Y2hlci5ncm91cCgyKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZmFpbCgiTm8gZm9udEFjdGl2aXR5RHBpIHJlcG9ydGVkIGZyb20gYWN0aXZpdHkgIiArIGFjdGl2aXR5TmFtZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHNGb250U2l6ZVBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoIl4oLispOiBmb250UGl4ZWxTaXplPSguKykkIik7CisKKyAgICAvKiogUmVhZCB0aGUgZm9udCBzaXplIGluIHRoZSBsYXN0IGxvZyBsaW5lLiAqLworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRFeHBlY3RlZEZvbnRQaXhlbFNpemUoQ29tcG9uZW50TmFtZSBhY3Rpdml0eU5hbWUsIGludCBmb250UGl4ZWxTaXplLAorICAgICAgICAgICAgTG9nU2VwYXJhdG9yIGxvZ1NlcGFyYXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZ1tdIGxpbmVzID0gZ2V0RGV2aWNlTG9nc0ZvckNvbXBvbmVudHMobG9nU2VwYXJhdG9yLCBnZXRMb2dUYWcoYWN0aXZpdHlOYW1lKSk7CisgICAgICAgIGZvciAoaW50IGkgPSBsaW5lcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxpbmUgPSBsaW5lc1tpXS50cmltKCk7CisgICAgICAgICAgICBmaW5hbCBNYXRjaGVyIG1hdGNoZXIgPSBzRm9udFNpemVQYXR0ZXJuLm1hdGNoZXIobGluZSk7CisgICAgICAgICAgICBpZiAobWF0Y2hlci5tYXRjaGVzKCkpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIGZvbnQgcGl4ZWwgc2l6ZSBkb2VzIG5vdCBtYXRjaCIsIGZvbnRQaXhlbFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnBhcnNlSW50KG1hdGNoZXIuZ3JvdXAoMikpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZmFpbCgiTm8gZm9udFBpeGVsU2l6ZSByZXBvcnRlZCBmcm9tIGFjdGl2aXR5ICIgKyBhY3Rpdml0eU5hbWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlNYW5hZ2VyRGlzcGxheUtleWd1YXJkVGVzdHMuamF2YSBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlNYW5hZ2VyRGlzcGxheUtleWd1YXJkVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDBkOWJkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJEaXNwbGF5S2V5Z3VhcmRUZXN0cy5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW07CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5ESVNNSVNTX0tFWUdVQVJEX0FDVElWSVRZOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3N1bWUuYXNzdW1lVHJ1ZTsKKworaW1wb3J0IGFuZHJvaWQuc2VydmVyLmFtLkFjdGl2aXR5TWFuYWdlclN0YXRlLkFjdGl2aXR5RGlzcGxheTsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogRGlzcGxheSB0ZXN0cyB0aGF0IHJlcXVpcmUgYSBrZXlndWFyZC4KKyAqCisgKiA8cD5CdWlsZC9JbnN0YWxsL1J1bjoKKyAqICAgICBhdGVzdCBDdHNBY3Rpdml0eU1hbmFnZXJEZXZpY2VUZXN0Q2FzZXM6QWN0aXZpdHlNYW5hZ2VyRGlzcGxheUtleWd1YXJkVGVzdHMKKyAqLworcHVibGljIGNsYXNzIEFjdGl2aXR5TWFuYWdlckRpc3BsYXlLZXlndWFyZFRlc3RzIGV4dGVuZHMgQWN0aXZpdHlNYW5hZ2VyRGlzcGxheVRlc3RCYXNlIHsKKworICAgIEBCZWZvcmUKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworCisgICAgICAgIGFzc3VtZVRydWUoc3VwcG9ydHNNdWx0aURpc3BsYXkoKSk7CisgICAgICAgIGFzc3VtZVRydWUoc3VwcG9ydHNJbnNlY3VyZUxvY2soKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgd2hldGhlciBhIEZMQUdfRElTTUlTU19LRVlHVUFSRCBhY3Rpdml0eSBvbiBhIHNlY29uZGFyeSBkaXNwbGF5IGlzIHZpc2libGUgKGZvciBhbgorICAgICAqIGluc2VjdXJlIGtleWd1YXJkKS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REaXNtaXNzS2V5Z3VhcmRBY3Rpdml0eV9zZWNvbmRhcnlEaXNwbGF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSAoZmluYWwgTG9ja1NjcmVlblNlc3Npb24gbG9ja1NjcmVlblNlc3Npb24gPSBuZXcgTG9ja1NjcmVlblNlc3Npb24oKTsKKyAgICAgICAgICAgICBmaW5hbCBWaXJ0dWFsRGlzcGxheVNlc3Npb24gdmlydHVhbERpc3BsYXlTZXNzaW9uID0gbmV3IFZpcnR1YWxEaXNwbGF5U2Vzc2lvbigpKSB7CisgICAgICAgICAgICBmaW5hbCBBY3Rpdml0eURpc3BsYXkgbmV3RGlzcGxheSA9IHZpcnR1YWxEaXNwbGF5U2Vzc2lvbi5jcmVhdGVEaXNwbGF5KCk7CisKKyAgICAgICAgICAgIGxvY2tTY3JlZW5TZXNzaW9uLmdvdG9LZXlndWFyZCgpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRLZXlndWFyZFNob3dpbmdBbmROb3RPY2NsdWRlZCgpOworICAgICAgICAgICAgbGF1bmNoQWN0aXZpdHlPbkRpc3BsYXkoRElTTUlTU19LRVlHVUFSRF9BQ1RJVklUWSwgbmV3RGlzcGxheS5tSWQpOworICAgICAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yS2V5Z3VhcmRTaG93aW5nQW5kTm90T2NjbHVkZWQoKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0S2V5Z3VhcmRTaG93aW5nQW5kTm90T2NjbHVkZWQoKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShESVNNSVNTX0tFWUdVQVJEX0FDVElWSVRZLCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlNYW5hZ2VyRGlzcGxheUxvY2tlZEtleWd1YXJkVGVzdHMuamF2YSBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlNYW5hZ2VyRGlzcGxheUxvY2tlZEtleWd1YXJkVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGMyYjVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJEaXNwbGF5TG9ja2VkS2V5Z3VhcmRUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLmFtOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkFjdGl2aXR5TWFuYWdlclN0YXRlLlNUQVRFX1JFU1VNRUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkFjdGl2aXR5TWFuYWdlclN0YXRlLlNUQVRFX1NUT1BQRUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuRElTTUlTU19LRVlHVUFSRF9BQ1RJVklUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5TSE9XX1dIRU5fTE9DS0VEX0FDVElWSVRZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLlRFU1RfQUNUSVZJVFk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuVklSVFVBTF9ESVNQTEFZX0FDVElWSVRZOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3N1bWUuYXNzdW1lVHJ1ZTsKKworaW1wb3J0IGFuZHJvaWQuc2VydmVyLmFtLkFjdGl2aXR5TWFuYWdlclN0YXRlLkFjdGl2aXR5RGlzcGxheTsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogRGlzcGxheSB0ZXN0cyB0aGF0IHJlcXVpcmUgYSBsb2NrZWQga2V5Z3VhcmQuCisgKgorICogPHA+QnVpbGQvSW5zdGFsbC9SdW46CisgKiAgICAgYXRlc3QgQ3RzQWN0aXZpdHlNYW5hZ2VyRGV2aWNlVGVzdENhc2VzOkFjdGl2aXR5TWFuYWdlckRpc3BsYXlMb2NrZWRLZXlndWFyZFRlc3RzCisgKi8KK3B1YmxpYyBjbGFzcyBBY3Rpdml0eU1hbmFnZXJEaXNwbGF5TG9ja2VkS2V5Z3VhcmRUZXN0cyBleHRlbmRzIEFjdGl2aXR5TWFuYWdlckRpc3BsYXlUZXN0QmFzZSB7CisKKyAgICBAQmVmb3JlCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKworICAgICAgICBhc3N1bWVUcnVlKHN1cHBvcnRzTXVsdGlEaXNwbGF5KCkpOworICAgICAgICBhc3N1bWVUcnVlKHN1cHBvcnRzU2VjdXJlTG9jaygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoYXQgdmlydHVhbCBkaXNwbGF5IGNvbnRlbnQgaXMgaGlkZGVuIHdoZW4gZGV2aWNlIGlzIGxvY2tlZC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsRGlzcGxheUhpZGVzQ29udGVudFdoZW5Mb2NrZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IChmaW5hbCBWaXJ0dWFsRGlzcGxheVNlc3Npb24gdmlydHVhbERpc3BsYXlTZXNzaW9uID0gbmV3IFZpcnR1YWxEaXNwbGF5U2Vzc2lvbigpOworICAgICAgICAgICAgIGZpbmFsIExvY2tTY3JlZW5TZXNzaW9uIGxvY2tTY3JlZW5TZXNzaW9uID0gbmV3IExvY2tTY3JlZW5TZXNzaW9uKCkpIHsKKyAgICAgICAgICAgIGxvY2tTY3JlZW5TZXNzaW9uLnNldExvY2tDcmVkZW50aWFsKCk7CisKKyAgICAgICAgICAgIC8vIENyZWF0ZSBuZXcgdXN1YWwgdmlydHVhbCBkaXNwbGF5LgorICAgICAgICAgICAgZmluYWwgQWN0aXZpdHlEaXNwbGF5IG5ld0Rpc3BsYXkgPSB2aXJ0dWFsRGlzcGxheVNlc3Npb24uY3JlYXRlRGlzcGxheSgpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFZJUlRVQUxfRElTUExBWV9BQ1RJVklUWSwgdHJ1ZSAvKiB2aXNpYmxlICovKTsKKworICAgICAgICAgICAgLy8gTGF1bmNoIGFjdGl2aXR5IG9uIG5ldyBzZWNvbmRhcnkgZGlzcGxheS4KKyAgICAgICAgICAgIGxhdW5jaEFjdGl2aXR5T25EaXNwbGF5KFRFU1RfQUNUSVZJVFksIG5ld0Rpc3BsYXkubUlkKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShURVNUX0FDVElWSVRZLCB0cnVlIC8qIHZpc2libGUgKi8pOworCisgICAgICAgICAgICAvLyBMb2NrIHRoZSBkZXZpY2UuCisgICAgICAgICAgICBsb2NrU2NyZWVuU2Vzc2lvbi5nb3RvS2V5Z3VhcmQoKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvckFjdGl2aXR5U3RhdGUoVEVTVF9BQ1RJVklUWSwgU1RBVEVfU1RPUFBFRCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoVEVTVF9BQ1RJVklUWSwgZmFsc2UgLyogdmlzaWJsZSAqLyk7CisKKyAgICAgICAgICAgIC8vIFVubG9jayBhbmQgY2hlY2sgaWYgdmlzaWJpbGl0eSBpcyBiYWNrLgorICAgICAgICAgICAgbG9ja1NjcmVlblNlc3Npb24udW5sb2NrRGV2aWNlKCkKKyAgICAgICAgICAgICAgICAgICAgLmVudGVyQW5kQ29uZmlybUxvY2tDcmVkZW50aWFsKCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JLZXlndWFyZEdvbmUoKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvckFjdGl2aXR5U3RhdGUoVEVTVF9BQ1RJVklUWSwgU1RBVEVfUkVTVU1FRCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoVEVTVF9BQ1RJVklUWSwgdHJ1ZSAvKiB2aXNpYmxlICovKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHdoZXRoZXIgYSBGTEFHX0RJU01JU1NfS0VZR1VBUkQgYWN0aXZpdHkgb24gYSBzZWNvbmRhcnkgZGlzcGxheSBkaXNtaXNzZXMgdGhlIGtleWd1YXJkLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERpc21pc3NLZXlndWFyZF9zZWNvbmRhcnlEaXNwbGF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSAoZmluYWwgVmlydHVhbERpc3BsYXlTZXNzaW9uIHZpcnR1YWxEaXNwbGF5U2Vzc2lvbiA9IG5ldyBWaXJ0dWFsRGlzcGxheVNlc3Npb24oKTsKKyAgICAgICAgICAgICBmaW5hbCBMb2NrU2NyZWVuU2Vzc2lvbiBsb2NrU2NyZWVuU2Vzc2lvbiA9IG5ldyBMb2NrU2NyZWVuU2Vzc2lvbigpKSB7CisgICAgICAgICAgICBsb2NrU2NyZWVuU2Vzc2lvbi5zZXRMb2NrQ3JlZGVudGlhbCgpOworICAgICAgICAgICAgZmluYWwgQWN0aXZpdHlEaXNwbGF5IG5ld0Rpc3BsYXkgPSB2aXJ0dWFsRGlzcGxheVNlc3Npb24uY3JlYXRlRGlzcGxheSgpOworCisgICAgICAgICAgICBsb2NrU2NyZWVuU2Vzc2lvbi5nb3RvS2V5Z3VhcmQoKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0S2V5Z3VhcmRTaG93aW5nQW5kTm90T2NjbHVkZWQoKTsKKyAgICAgICAgICAgIGxhdW5jaEFjdGl2aXR5T25EaXNwbGF5KERJU01JU1NfS0VZR1VBUkRfQUNUSVZJVFksIG5ld0Rpc3BsYXkubUlkKTsKKyAgICAgICAgICAgIGxvY2tTY3JlZW5TZXNzaW9uLmVudGVyQW5kQ29uZmlybUxvY2tDcmVkZW50aWFsKCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JLZXlndWFyZEdvbmUoKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0S2V5Z3VhcmRHb25lKCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoRElTTUlTU19LRVlHVUFSRF9BQ1RJVklUWSwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REaXNtaXNzS2V5Z3VhcmRfd2hpbGVPY2NsdWRlZF9zZWNvbmRhcnlEaXNwbGF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSAoZmluYWwgVmlydHVhbERpc3BsYXlTZXNzaW9uIHZpcnR1YWxEaXNwbGF5U2Vzc2lvbiA9IG5ldyBWaXJ0dWFsRGlzcGxheVNlc3Npb24oKTsKKyAgICAgICAgICAgICBmaW5hbCBMb2NrU2NyZWVuU2Vzc2lvbiBsb2NrU2NyZWVuU2Vzc2lvbiA9IG5ldyBMb2NrU2NyZWVuU2Vzc2lvbigpKSB7CisgICAgICAgICAgICBsb2NrU2NyZWVuU2Vzc2lvbi5zZXRMb2NrQ3JlZGVudGlhbCgpOworICAgICAgICAgICAgZmluYWwgQWN0aXZpdHlEaXNwbGF5IG5ld0Rpc3BsYXkgPSB2aXJ0dWFsRGlzcGxheVNlc3Npb24uY3JlYXRlRGlzcGxheSgpOworCisgICAgICAgICAgICBsb2NrU2NyZWVuU2Vzc2lvbi5nb3RvS2V5Z3VhcmQoKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0S2V5Z3VhcmRTaG93aW5nQW5kTm90T2NjbHVkZWQoKTsKKyAgICAgICAgICAgIGxhdW5jaEFjdGl2aXR5KFNIT1dfV0hFTl9MT0NLRURfQUNUSVZJVFkpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUoU0hPV19XSEVOX0xPQ0tFRF9BQ1RJVklUWSk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoU0hPV19XSEVOX0xPQ0tFRF9BQ1RJVklUWSwgdHJ1ZSk7CisgICAgICAgICAgICBsYXVuY2hBY3Rpdml0eU9uRGlzcGxheShESVNNSVNTX0tFWUdVQVJEX0FDVElWSVRZLCBuZXdEaXNwbGF5Lm1JZCk7CisgICAgICAgICAgICBsb2NrU2NyZWVuU2Vzc2lvbi5lbnRlckFuZENvbmZpcm1Mb2NrQ3JlZGVudGlhbCgpOworICAgICAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yS2V5Z3VhcmRHb25lKCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEtleWd1YXJkR29uZSgpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUoRElTTUlTU19LRVlHVUFSRF9BQ1RJVklUWSk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoRElTTUlTU19LRVlHVUFSRF9BQ1RJVklUWSwgdHJ1ZSk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoU0hPV19XSEVOX0xPQ0tFRF9BQ1RJVklUWSwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlckRpc3BsYXlUZXN0QmFzZS5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJEaXNwbGF5VGVzdEJhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODJhZTJkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJEaXNwbGF5VGVzdEJhc2UuamF2YQpAQCAtMCwwICsxLDQ3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbTsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9BQ1RJVklUSUVTX09OX1NFQ09OREFSWV9ESVNQTEFZUzsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50TmFtZVV0aWxzLmdldEFjdGl2aXR5TmFtZTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5WSVJUVUFMX0RJU1BMQVlfQUNUSVZJVFk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuVmlydHVhbERpc3BsYXlBY3Rpdml0eS5DT01NQU5EX0NSRUFURV9ESVNQTEFZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLlZpcnR1YWxEaXNwbGF5QWN0aXZpdHkuQ09NTUFORF9ERVNUUk9ZX0RJU1BMQVk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuVmlydHVhbERpc3BsYXlBY3Rpdml0eS5DT01NQU5EX1JFU0laRV9ESVNQTEFZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLlZpcnR1YWxEaXNwbGF5QWN0aXZpdHkKKyAgICAgICAgLktFWV9DQU5fU0hPV19XSVRIX0lOU0VDVVJFX0tFWUdVQVJEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLlZpcnR1YWxEaXNwbGF5QWN0aXZpdHkuS0VZX0NPTU1BTkQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuVmlydHVhbERpc3BsYXlBY3Rpdml0eS5LRVlfQ09VTlQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuVmlydHVhbERpc3BsYXlBY3Rpdml0eS5LRVlfREVOU0lUWV9EUEk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuVmlydHVhbERpc3BsYXlBY3Rpdml0eS5LRVlfTEFVTkNIX1RBUkdFVF9DT01QT05FTlQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuVmlydHVhbERpc3BsYXlBY3Rpdml0eS5LRVlfUFVCTElDX0RJU1BMQVk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuVmlydHVhbERpc3BsYXlBY3Rpdml0eS5LRVlfUkVTSVpFX0RJU1BMQVk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuVmlydHVhbERpc3BsYXlBY3Rpdml0eS5WSVJUVUFMX0RJU1BMQVlfUFJFRklYOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5TdGF0ZUxvZ2dlci5sb2c7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLlN0YXRlTG9nZ2VyLmxvZ0Fsd2F5czsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LkRpc3BsYXkuREVGQVVMVF9ESVNQTEFZOworCitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5oYXNTaXplOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOworaW1wb3J0IGFuZHJvaWQuc2VydmVyLmFtLkFjdGl2aXR5TWFuYWdlclN0YXRlLkFjdGl2aXR5RGlzcGxheTsKK2ltcG9ydCBhbmRyb2lkLnNlcnZlci5hbS5zZXR0aW5ncy5TZXR0aW5nc1Nlc3Npb247CitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5Ob25OdWxsOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTnVsbGFibGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNpemU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKKworLyoqCisgKiBCYXNlIGNsYXNzIGZvciBBY3Rpdml0eU1hbmFnZXIgZGlzcGxheSB0ZXN0cy4KKyAqCisgKiBAc2VlIEFjdGl2aXR5TWFuYWdlckRpc3BsYXlUZXN0cworICogQHNlZSBBY3Rpdml0eU1hbmFnZXJEaXNwbGF5TG9ja2VkS2V5Z3VhcmRUZXN0cworICovCitjbGFzcyBBY3Rpdml0eU1hbmFnZXJEaXNwbGF5VGVzdEJhc2UgZXh0ZW5kcyBBY3Rpdml0eU1hbmFnZXJUZXN0QmFzZSB7CisKKyAgICBzdGF0aWMgZmluYWwgaW50IENVU1RPTV9ERU5TSVRZX0RQSSA9IDIyMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9ERU5TSVRZX0RQSSA9IC0xOworCisgICAgQWN0aXZpdHlEaXNwbGF5IGdldERpc3BsYXlTdGF0ZShMaXN0PEFjdGl2aXR5RGlzcGxheT4gZGlzcGxheXMsIGludCBkaXNwbGF5SWQpIHsKKyAgICAgICAgZm9yIChBY3Rpdml0eURpc3BsYXkgZGlzcGxheSA6IGRpc3BsYXlzKSB7CisgICAgICAgICAgICBpZiAoZGlzcGxheS5tSWQgPT0gZGlzcGxheUlkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRpc3BsYXk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqIFJldHVybiB0aGUgZGlzcGxheSBzdGF0ZSB3aXRoIHdpZHRoLCBoZWlnaHQsIGRwaS4gQWx3YXlzIG5vdCBkZWZhdWx0IGRpc3BsYXkuICovCisgICAgQWN0aXZpdHlEaXNwbGF5IGdldERpc3BsYXlTdGF0ZShMaXN0PEFjdGl2aXR5RGlzcGxheT4gZGlzcGxheXMsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgIGludCBkcGkpIHsKKyAgICAgICAgZm9yIChBY3Rpdml0eURpc3BsYXkgZGlzcGxheSA6IGRpc3BsYXlzKSB7CisgICAgICAgICAgICBpZiAoZGlzcGxheS5tSWQgPT0gREVGQVVMVF9ESVNQTEFZKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBDb25maWd1cmF0aW9uIGNvbmZpZyA9IGRpc3BsYXkubUZ1bGxDb25maWd1cmF0aW9uOworICAgICAgICAgICAgaWYgKGNvbmZpZy5kZW5zaXR5RHBpID09IGRwaSAmJiBjb25maWcuc2NyZWVuV2lkdGhEcCA9PSB3aWR0aAorICAgICAgICAgICAgICAgICAgICAmJiBjb25maWcuc2NyZWVuSGVpZ2h0RHAgPT0gaGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRpc3BsYXk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgTGlzdDxBY3Rpdml0eURpc3BsYXk+IGdldERpc3BsYXlzU3RhdGVzKCkgeworICAgICAgICBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5jb21wdXRlU3RhdGUoKTsKKyAgICAgICAgcmV0dXJuIG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldERpc3BsYXlzKCk7CisgICAgfQorCisgICAgLyoqIEZpbmQgdGhlIGRpc3BsYXkgdGhhdCB3YXMgbm90IG9yaWdpbmFsbHkgcmVwb3J0ZWQgaW4gb2xkRGlzcGxheXMgYW5kIGFkZGVkIGluIG5ld0Rpc3BsYXlzICovCisgICAgTGlzdDxBY3Rpdml0eURpc3BsYXk+IGZpbmROZXdEaXNwbGF5U3RhdGVzKExpc3Q8QWN0aXZpdHlEaXNwbGF5PiBvbGREaXNwbGF5cywKKyAgICAgICAgICAgIExpc3Q8QWN0aXZpdHlEaXNwbGF5PiBuZXdEaXNwbGF5cykgeworICAgICAgICBmaW5hbCBBcnJheUxpc3Q8QWN0aXZpdHlEaXNwbGF5PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgICAgICBmb3IgKEFjdGl2aXR5RGlzcGxheSBuZXdEaXNwbGF5IDogbmV3RGlzcGxheXMpIHsKKyAgICAgICAgICAgIGlmIChvbGREaXNwbGF5cy5zdHJlYW0oKS5ub25lTWF0Y2goZCAtPiBkLm1JZCA9PSBuZXdEaXNwbGF5Lm1JZCkpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkKG5ld0Rpc3BsYXkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgUmVwb3J0ZWREaXNwbGF5TWV0cmljcyB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXTV9TSVpFID0gIndtIHNpemUiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV01fREVOU0lUWSA9ICJ3bSBkZW5zaXR5IjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBQSFlTSUNBTF9TSVpFID0KKyAgICAgICAgICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoIlBoeXNpY2FsIHNpemU6IChcXGQrKXgoXFxkKykiKTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBPVkVSUklERV9TSVpFID0KKyAgICAgICAgICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoIk92ZXJyaWRlIHNpemU6IChcXGQrKXgoXFxkKykiKTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBQSFlTSUNBTF9ERU5TSVRZID0KKyAgICAgICAgICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoIlBoeXNpY2FsIGRlbnNpdHk6IChcXGQrKSIpOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIE9WRVJSSURFX0RFTlNJVFkgPQorICAgICAgICAgICAgICAgIFBhdHRlcm4uY29tcGlsZSgiT3ZlcnJpZGUgZGVuc2l0eTogKFxcZCspIik7CisKKyAgICAgICAgQE5vbk51bGwKKyAgICAgICAgZmluYWwgU2l6ZSBwaHlzaWNhbFNpemU7CisgICAgICAgIGZpbmFsIGludCBwaHlzaWNhbERlbnNpdHk7CisKKyAgICAgICAgQE51bGxhYmxlCisgICAgICAgIGZpbmFsIFNpemUgb3ZlcnJpZGVTaXplOworICAgICAgICBATnVsbGFibGUKKyAgICAgICAgZmluYWwgSW50ZWdlciBvdmVycmlkZURlbnNpdHk7CisKKyAgICAgICAgLyoqIEdldCBwaHlzaWNhbCBhbmQgb3ZlcnJpZGUgZGlzcGxheSBtZXRyaWNzIGZyb20gV00uICovCisgICAgICAgIHN0YXRpYyBSZXBvcnRlZERpc3BsYXlNZXRyaWNzIGdldERpc3BsYXlNZXRyaWNzKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXBvcnRlZERpc3BsYXlNZXRyaWNzKAorICAgICAgICAgICAgICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKFdNX1NJWkUpICsgZXhlY3V0ZVNoZWxsQ29tbWFuZChXTV9ERU5TSVRZKSk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHNldERpc3BsYXlNZXRyaWNzKGZpbmFsIFNpemUgc2l6ZSwgZmluYWwgaW50IGRlbnNpdHkpIHsKKyAgICAgICAgICAgIHNldFNpemUoc2l6ZSk7CisgICAgICAgICAgICBzZXREZW5zaXR5KGRlbnNpdHkpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCByZXN0b3JlRGlzcGxheU1ldHJpY3MoKSB7CisgICAgICAgICAgICBpZiAob3ZlcnJpZGVTaXplICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXRTaXplKG92ZXJyaWRlU2l6ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoV01fU0laRSArICIgcmVzZXQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvdmVycmlkZURlbnNpdHkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNldERlbnNpdHkob3ZlcnJpZGVEZW5zaXR5KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChXTV9ERU5TSVRZICsgIiByZXNldCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHNldFNpemUoZmluYWwgU2l6ZSBzaXplKSB7CisgICAgICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKFdNX1NJWkUgKyAiICIgKyBzaXplLmdldFdpZHRoKCkgKyAieCIgKyBzaXplLmdldEhlaWdodCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBzZXREZW5zaXR5KGZpbmFsIGludCBkZW5zaXR5KSB7CisgICAgICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKFdNX0RFTlNJVFkgKyAiICIgKyBkZW5zaXR5KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBHZXQgZGlzcGxheSBzaXplIHRoYXQgV00gb3BlcmF0ZXMgd2l0aC4gKi8KKyAgICAgICAgU2l6ZSBnZXRTaXplKCkgeworICAgICAgICAgICAgcmV0dXJuIG92ZXJyaWRlU2l6ZSAhPSBudWxsID8gb3ZlcnJpZGVTaXplIDogcGh5c2ljYWxTaXplOworICAgICAgICB9CisKKyAgICAgICAgLyoqIEdldCBkZW5zaXR5IHRoYXQgV00gb3BlcmF0ZXMgd2l0aC4gKi8KKyAgICAgICAgaW50IGdldERlbnNpdHkoKSB7CisgICAgICAgICAgICByZXR1cm4gb3ZlcnJpZGVEZW5zaXR5ICE9IG51bGwgPyBvdmVycmlkZURlbnNpdHkgOiBwaHlzaWNhbERlbnNpdHk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFJlcG9ydGVkRGlzcGxheU1ldHJpY3MoZmluYWwgU3RyaW5nIGxpbmVzKSB7CisgICAgICAgICAgICBNYXRjaGVyIG1hdGNoZXIgPSBQSFlTSUNBTF9TSVpFLm1hdGNoZXIobGluZXMpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiUGh5c2ljYWwgZGlzcGxheSBzaXplIG11c3QgYmUgcmVwb3J0ZWQiLCBtYXRjaGVyLmZpbmQoKSk7CisgICAgICAgICAgICBsb2cobWF0Y2hlci5ncm91cCgpKTsKKyAgICAgICAgICAgIHBoeXNpY2FsU2l6ZSA9IG5ldyBTaXplKAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnBhcnNlSW50KG1hdGNoZXIuZ3JvdXAoMSkpLCBJbnRlZ2VyLnBhcnNlSW50KG1hdGNoZXIuZ3JvdXAoMikpKTsKKworICAgICAgICAgICAgbWF0Y2hlciA9IFBIWVNJQ0FMX0RFTlNJVFkubWF0Y2hlcihsaW5lcyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJQaHlzaWNhbCBkaXNwbGF5IGRlbnNpdHkgbXVzdCBiZSByZXBvcnRlZCIsIG1hdGNoZXIuZmluZCgpKTsKKyAgICAgICAgICAgIGxvZyhtYXRjaGVyLmdyb3VwKCkpOworICAgICAgICAgICAgcGh5c2ljYWxEZW5zaXR5ID0gSW50ZWdlci5wYXJzZUludChtYXRjaGVyLmdyb3VwKDEpKTsKKworICAgICAgICAgICAgbWF0Y2hlciA9IE9WRVJSSURFX1NJWkUubWF0Y2hlcihsaW5lcyk7CisgICAgICAgICAgICBpZiAobWF0Y2hlci5maW5kKCkpIHsKKyAgICAgICAgICAgICAgICBsb2cobWF0Y2hlci5ncm91cCgpKTsKKyAgICAgICAgICAgICAgICBvdmVycmlkZVNpemUgPSBuZXcgU2l6ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIucGFyc2VJbnQobWF0Y2hlci5ncm91cCgxKSksIEludGVnZXIucGFyc2VJbnQobWF0Y2hlci5ncm91cCgyKSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvdmVycmlkZVNpemUgPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtYXRjaGVyID0gT1ZFUlJJREVfREVOU0lUWS5tYXRjaGVyKGxpbmVzKTsKKyAgICAgICAgICAgIGlmIChtYXRjaGVyLmZpbmQoKSkgeworICAgICAgICAgICAgICAgIGxvZyhtYXRjaGVyLmdyb3VwKCkpOworICAgICAgICAgICAgICAgIG92ZXJyaWRlRGVuc2l0eSA9IEludGVnZXIucGFyc2VJbnQobWF0Y2hlci5ncm91cCgxKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG92ZXJyaWRlRGVuc2l0eSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgY2xhc3MgVmlydHVhbERpc3BsYXlTZXNzaW9uIGltcGxlbWVudHMgQXV0b0Nsb3NlYWJsZSB7CisgICAgICAgIHByaXZhdGUgaW50IG1EZW5zaXR5RHBpID0gQ1VTVE9NX0RFTlNJVFlfRFBJOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUxhdW5jaEluU3BsaXRTY3JlZW4gPSBmYWxzZTsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1DYW5TaG93V2l0aEluc2VjdXJlS2V5Z3VhcmQgPSBmYWxzZTsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1QdWJsaWNEaXNwbGF5ID0gZmFsc2U7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtUmVzaXplRGlzcGxheSA9IHRydWU7CisgICAgICAgIHByaXZhdGUgQ29tcG9uZW50TmFtZSBtTGF1bmNoQWN0aXZpdHkgPSBudWxsOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbVNpbXVsYXRlRGlzcGxheSA9IGZhbHNlOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbU11c3RCZUNyZWF0ZWQgPSB0cnVlOworCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtVmlydHVhbERpc3BsYXlDcmVhdGVkID0gZmFsc2U7CisgICAgICAgIHByaXZhdGUgZmluYWwgT3ZlcmxheURpc3BsYXlEZXZpY2VzU2Vzc2lvbiBtT3ZlcmxheURpc3BsYXlEZXZpY2VTZXNzaW9uID0KKyAgICAgICAgICAgICAgICBuZXcgT3ZlcmxheURpc3BsYXlEZXZpY2VzU2Vzc2lvbigpOworCisgICAgICAgIFZpcnR1YWxEaXNwbGF5U2Vzc2lvbiBzZXREZW5zaXR5RHBpKGludCBkZW5zaXR5RHBpKSB7CisgICAgICAgICAgICBtRGVuc2l0eURwaSA9IGRlbnNpdHlEcGk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIFZpcnR1YWxEaXNwbGF5U2Vzc2lvbiBzZXRMYXVuY2hJblNwbGl0U2NyZWVuKGJvb2xlYW4gbGF1bmNoSW5TcGxpdFNjcmVlbikgeworICAgICAgICAgICAgbUxhdW5jaEluU3BsaXRTY3JlZW4gPSBsYXVuY2hJblNwbGl0U2NyZWVuOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBWaXJ0dWFsRGlzcGxheVNlc3Npb24gc2V0Q2FuU2hvd1dpdGhJbnNlY3VyZUtleWd1YXJkKGJvb2xlYW4gY2FuU2hvd1dpdGhJbnNlY3VyZUtleWd1YXJkKSB7CisgICAgICAgICAgICBtQ2FuU2hvd1dpdGhJbnNlY3VyZUtleWd1YXJkID0gY2FuU2hvd1dpdGhJbnNlY3VyZUtleWd1YXJkOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBWaXJ0dWFsRGlzcGxheVNlc3Npb24gc2V0UHVibGljRGlzcGxheShib29sZWFuIHB1YmxpY0Rpc3BsYXkpIHsKKyAgICAgICAgICAgIG1QdWJsaWNEaXNwbGF5ID0gcHVibGljRGlzcGxheTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgVmlydHVhbERpc3BsYXlTZXNzaW9uIHNldFJlc2l6ZURpc3BsYXkoYm9vbGVhbiByZXNpemVEaXNwbGF5KSB7CisgICAgICAgICAgICBtUmVzaXplRGlzcGxheSA9IHJlc2l6ZURpc3BsYXk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIFZpcnR1YWxEaXNwbGF5U2Vzc2lvbiBzZXRMYXVuY2hBY3Rpdml0eShDb21wb25lbnROYW1lIGxhdW5jaEFjdGl2aXR5KSB7CisgICAgICAgICAgICBtTGF1bmNoQWN0aXZpdHkgPSBsYXVuY2hBY3Rpdml0eTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgVmlydHVhbERpc3BsYXlTZXNzaW9uIHNldFNpbXVsYXRlRGlzcGxheShib29sZWFuIHNpbXVsYXRlRGlzcGxheSkgeworICAgICAgICAgICAgbVNpbXVsYXRlRGlzcGxheSA9IHNpbXVsYXRlRGlzcGxheTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgVmlydHVhbERpc3BsYXlTZXNzaW9uIHNldE11c3RCZUNyZWF0ZWQoYm9vbGVhbiBtdXN0QmVDcmVhdGVkKSB7CisgICAgICAgICAgICBtTXVzdEJlQ3JlYXRlZCA9IG11c3RCZUNyZWF0ZWQ7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIEBOdWxsYWJsZQorICAgICAgICBBY3Rpdml0eURpc3BsYXkgY3JlYXRlRGlzcGxheSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZURpc3BsYXlzKDEpLnN0cmVhbSgpLmZpbmRGaXJzdCgpLm9yRWxzZShudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIEBOb25OdWxsCisgICAgICAgIExpc3Q8QWN0aXZpdHlEaXNwbGF5PiBjcmVhdGVEaXNwbGF5cyhpbnQgY291bnQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgaWYgKG1TaW11bGF0ZURpc3BsYXkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2ltdWxhdGVEaXNwbGF5KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVWaXJ0dWFsRGlzcGxheXMoY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdm9pZCByZXNpemVEaXNwbGF5KCkgeworICAgICAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChnZXRBbVN0YXJ0Q21kKFZJUlRVQUxfRElTUExBWV9BQ1RJVklUWSkKKyAgICAgICAgICAgICAgICAgICAgKyAiIC1mIDB4MjAwMDAwMDAiICsgIiAtLWVzICIgKyBLRVlfQ09NTUFORCArICIgIiArIENPTU1BTkRfUkVTSVpFX0RJU1BMQVkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBtT3ZlcmxheURpc3BsYXlEZXZpY2VTZXNzaW9uLmNsb3NlKCk7CisgICAgICAgICAgICBpZiAobVZpcnR1YWxEaXNwbGF5Q3JlYXRlZCkgeworICAgICAgICAgICAgICAgIGRlc3Ryb3lWaXJ0dWFsRGlzcGxheXMoKTsKKyAgICAgICAgICAgICAgICBtVmlydHVhbERpc3BsYXlDcmVhdGVkID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2ltdWxhdGUgbmV3IGRpc3BsYXkuCisgICAgICAgICAqIDxwcmU+CisgICAgICAgICAqIDxjb2RlPm1EZW5zaXR5RHBpPC9jb2RlPiBwcm92aWRlIGN1c3RvbSBkZW5zaXR5IGZvciB0aGUgZGlzcGxheS4KKyAgICAgICAgICogPC9wcmU+CisgICAgICAgICAqIEByZXR1cm4ge0BsaW5rIEFjdGl2aXR5RGlzcGxheX0gb2YgbmV3bHkgY3JlYXRlZCBkaXNwbGF5LgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBMaXN0PEFjdGl2aXR5RGlzcGxheT4gc2ltdWxhdGVEaXNwbGF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBMaXN0PEFjdGl2aXR5RGlzcGxheT4gb3JpZ2luYWxEcyA9IGdldERpc3BsYXlzU3RhdGVzKCk7CisKKyAgICAgICAgICAgIC8vIENyZWF0ZSB2aXJ0dWFsIGRpc3BsYXkgd2l0aCBjdXN0b20gZGVuc2l0eSBkcGkuCisgICAgICAgICAgICBtT3ZlcmxheURpc3BsYXlEZXZpY2VTZXNzaW9uLnNldCgiMTAyNHg3NjgvIiArIG1EZW5zaXR5RHBpKTsKKworICAgICAgICAgICAgcmV0dXJuIGFzc2VydEFuZEdldE5ld0Rpc3BsYXlzKDEsIG9yaWdpbmFsRHMpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBuZXcgdmlydHVhbCBkaXNwbGF5LgorICAgICAgICAgKiA8cHJlPgorICAgICAgICAgKiA8Y29kZT5tRGVuc2l0eURwaTwvY29kZT4gcHJvdmlkZSBjdXN0b20gZGVuc2l0eSBmb3IgdGhlIGRpc3BsYXkuCisgICAgICAgICAqIDxjb2RlPm1MYXVuY2hJblNwbGl0U2NyZWVuPC9jb2RlPiBzdGFydCB7QGxpbmsgVmlydHVhbERpc3BsYXlBY3Rpdml0eX0gdG8gc2lkZSBmcm9tCisgICAgICAgICAqICAgICB7QGxpbmsgTGF1bmNoaW5nQWN0aXZpdHl9IG9uIHByaW1hcnkgZGlzcGxheS4KKyAgICAgICAgICogPGNvZGU+bUNhblNob3dXaXRoSW5zZWN1cmVLZXlndWFyZDwvY29kZT4gIGFsbG93IHNob3dpbmcgY29udGVudCB3aGVuIGRldmljZSBpcworICAgICAgICAgKiAgICAgc2hvd2luZyBhbiBpbnNlY3VyZSBrZXlndWFyZC4KKyAgICAgICAgICogPGNvZGU+bU11c3RCZUNyZWF0ZWQ8L2NvZGU+IHNob3VsZCBhc3NlcnQgaWYgdGhlIGRpc3BsYXkgd2FzIG9yIHdhc24ndCBjcmVhdGVkLgorICAgICAgICAgKiA8Y29kZT5tUHVibGljRGlzcGxheTwvY29kZT4gbWFrZSBkaXNwbGF5IHB1YmxpYy4KKyAgICAgICAgICogPGNvZGU+bVJlc2l6ZURpc3BsYXk8L2NvZGU+IHNob3VsZCByZXNpemUgZGlzcGxheSB3aGVuIHN1cmZhY2Ugc2l6ZSBjaGFuZ2VzLgorICAgICAgICAgKiA8Y29kZT5MYXVuY2hBY3Rpdml0eTwvY29kZT4gc2hvdWxkIGxhdW5jaCB0ZXN0IGFjdGl2aXR5IGltbWVkaWF0ZWx5IGFmdGVyIGRpc3BsYXkKKyAgICAgICAgICogICAgIGNyZWF0aW9uLgorICAgICAgICAgKiA8L3ByZT4KKyAgICAgICAgICogQHBhcmFtIGRpc3BsYXlDb3VudCBudW1iZXIgb2YgZGlzcGxheXMgdG8gYmUgY3JlYXRlZC4KKyAgICAgICAgICogQHJldHVybiBBIGxpc3Qgb2Yge0BsaW5rIEFjdGl2aXR5RGlzcGxheX0gdGhhdCByZXByZXNlbnQgbmV3bHkgY3JlYXRlZCBkaXNwbGF5cy4KKyAgICAgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgTGlzdDxBY3Rpdml0eURpc3BsYXk+IGNyZWF0ZVZpcnR1YWxEaXNwbGF5cyhpbnQgZGlzcGxheUNvdW50KSB7CisgICAgICAgICAgICAvLyBTdGFydCBhbiBhY3Rpdml0eSB0aGF0IGlzIGFibGUgdG8gY3JlYXRlIHZpcnR1YWwgZGlzcGxheXMuCisgICAgICAgICAgICBpZiAobUxhdW5jaEluU3BsaXRTY3JlZW4pIHsKKyAgICAgICAgICAgICAgICBnZXRMYXVuY2hBY3Rpdml0eUJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFRvU2lkZSh0cnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFRhcmdldEFjdGl2aXR5KFZJUlRVQUxfRElTUExBWV9BQ1RJVklUWSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5leGVjdXRlKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxhdW5jaEFjdGl2aXR5KFZJUlRVQUxfRElTUExBWV9BQ1RJVklUWSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShmYWxzZSAvKiBjb21wYXJlVGFza0FuZFN0YWNrQm91bmRzICovLAorICAgICAgICAgICAgICAgICAgICBuZXcgV2FpdEZvclZhbGlkQWN0aXZpdHlTdGF0ZShWSVJUVUFMX0RJU1BMQVlfQUNUSVZJVFkpKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShWSVJUVUFMX0RJU1BMQVlfQUNUSVZJVFksIHRydWUgLyogdmlzaWJsZSAqLyk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRBY3Rpdml0eSgiRm9jdXMgbXVzdCBiZSBvbiB2aXJ0dWFsIGRpc3BsYXkgaG9zdCBhY3Rpdml0eSIsCisgICAgICAgICAgICAgICAgICAgIFZJUlRVQUxfRElTUExBWV9BQ1RJVklUWSk7CisgICAgICAgICAgICBmaW5hbCBMaXN0PEFjdGl2aXR5RGlzcGxheT4gb3JpZ2luYWxEUyA9IGdldERpc3BsYXlzU3RhdGVzKCk7CisKKyAgICAgICAgICAgIC8vIENyZWF0ZSB2aXJ0dWFsIGRpc3BsYXkgd2l0aCBjdXN0b20gZGVuc2l0eSBkcGkuCisgICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGNyZWF0ZVZpcnR1YWxEaXNwbGF5Q29tbWFuZCA9IG5ldyBTdHJpbmdCdWlsZGVyKAorICAgICAgICAgICAgICAgICAgICBnZXRBbVN0YXJ0Q21kKFZJUlRVQUxfRElTUExBWV9BQ1RJVklUWSkpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIiAtZiAweDIwMDAwMDAwIikKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiIC0tZXMgIiArIEtFWV9DT01NQU5EICsgIiAiICsgQ09NTUFORF9DUkVBVEVfRElTUExBWSk7CisgICAgICAgICAgICBpZiAobURlbnNpdHlEcGkgIT0gSU5WQUxJRF9ERU5TSVRZX0RQSSkgeworICAgICAgICAgICAgICAgIGNyZWF0ZVZpcnR1YWxEaXNwbGF5Q29tbWFuZAorICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiIC0tZWkgIiArIEtFWV9ERU5TSVRZX0RQSSArICIgIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQobURlbnNpdHlEcGkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY3JlYXRlVmlydHVhbERpc3BsYXlDb21tYW5kLmFwcGVuZCgiIC0tZWkgIiArIEtFWV9DT1VOVCArICIgIikuYXBwZW5kKGRpc3BsYXlDb3VudCkKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiIC0tZXogIiArIEtFWV9DQU5fU0hPV19XSVRIX0lOU0VDVVJFX0tFWUdVQVJEICsgIiAiKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKG1DYW5TaG93V2l0aEluc2VjdXJlS2V5Z3VhcmQpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIiAtLWV6ICIgKyBLRVlfUFVCTElDX0RJU1BMQVkgKyAiICIpLmFwcGVuZChtUHVibGljRGlzcGxheSkKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiIC0tZXogIiArIEtFWV9SRVNJWkVfRElTUExBWSArICIgIikuYXBwZW5kKG1SZXNpemVEaXNwbGF5KTsKKyAgICAgICAgICAgIGlmIChtTGF1bmNoQWN0aXZpdHkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNyZWF0ZVZpcnR1YWxEaXNwbGF5Q29tbWFuZAorICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiIC0tZXMgIiArIEtFWV9MQVVOQ0hfVEFSR0VUX0NPTVBPTkVOVCArICIgIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoZ2V0QWN0aXZpdHlOYW1lKG1MYXVuY2hBY3Rpdml0eSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChjcmVhdGVWaXJ0dWFsRGlzcGxheUNvbW1hbmQudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBtVmlydHVhbERpc3BsYXlDcmVhdGVkID0gdHJ1ZTsKKworICAgICAgICAgICAgcmV0dXJuIGFzc2VydEFuZEdldE5ld0Rpc3BsYXlzKG1NdXN0QmVDcmVhdGVkID8gZGlzcGxheUNvdW50IDogLTEsIG9yaWdpbmFsRFMpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIERlc3Ryb3kgZXhpc3RpbmcgdmlydHVhbCBkaXNwbGF5LgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBkZXN0cm95VmlydHVhbERpc3BsYXlzKCkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGRlc3Ryb3lWaXJ0dWFsRGlzcGxheUNvbW1hbmQgPSBnZXRBbVN0YXJ0Q21kKFZJUlRVQUxfRElTUExBWV9BQ1RJVklUWSkKKyAgICAgICAgICAgICAgICAgICAgKyAiIC1mIDB4MjAwMDAwMDAiCisgICAgICAgICAgICAgICAgICAgICsgIiAtLWVzICIgKyBLRVlfQ09NTUFORCArICIgIiArIENPTU1BTkRfREVTVFJPWV9ESVNQTEFZOworICAgICAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChkZXN0cm95VmlydHVhbERpc3BsYXlDb21tYW5kKTsKKyAgICAgICAgICAgIHdhaXRGb3JEaXNwbGF5c0Rlc3Ryb3llZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHdhaXRGb3JEaXNwbGF5c0Rlc3Ryb3llZCgpIHsKKyAgICAgICAgICAgIGZvciAoaW50IHJldHJ5ID0gMTsgcmV0cnkgPD0gNTsgcmV0cnkrKykgeworICAgICAgICAgICAgICAgIGlmICghaXNIb3N0ZWRWaXJ0dWFsRGlzcGxheVByZXNlbnQoKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxvZ0Fsd2F5cygiV2FpdGluZyBmb3IgaG9zdGVkIGRpc3BsYXlzIGRlc3RydWN0aW9uLi4uIHJldHJ5PSIgKyByZXRyeSk7CisgICAgICAgICAgICAgICAgU3lzdGVtQ2xvY2suc2xlZXAoNTAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZhaWwoIldhaXRpbmcgZm9yIGhvc3RlZCBkaXNwbGF5cyBkZXN0cnVjdGlvbiBmYWlsZWQuIik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNIb3N0ZWRWaXJ0dWFsRGlzcGxheVByZXNlbnQoKSB7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZSh0cnVlKTsKKyAgICAgICAgICAgIHJldHVybiBtQW1XbVN0YXRlLmdldFdtU3RhdGUoKS5nZXREaXNwbGF5cygpLnN0cmVhbSgpLmFueU1hdGNoKAorICAgICAgICAgICAgICAgICAgICBkIC0+IGQuZ2V0TmFtZSgpICE9IG51bGwgJiYgZC5nZXROYW1lKCkuY29udGFpbnMoVklSVFVBTF9ESVNQTEFZX1BSRUZJWCkpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdhaXQgZm9yIGRlc2lyZWQgbnVtYmVyIG9mIGRpc3BsYXlzIHRvIGJlIGNyZWF0ZWQgYW5kIGdldCB0aGVpciBwcm9wZXJ0aWVzLgorICAgICAgICAgKiBAcGFyYW0gbmV3RGlzcGxheUNvdW50IGV4cGVjdGVkIGRpc3BsYXkgY291bnQsIC0xIGlmIGRpc3BsYXkgc2hvdWxkIG5vdCBiZSBjcmVhdGVkLgorICAgICAgICAgKiBAcGFyYW0gb3JpZ2luYWxEUyBkaXNwbGF5IHN0YXRlcyBiZWZvcmUgY3JlYXRpb24gb2YgbmV3IGRpc3BsYXkocykuCisgICAgICAgICAqIEByZXR1cm4gbGlzdCBvZiBuZXcgZGlzcGxheXMsIGVtcHR5IGxpc3QgaWYgbm8gbmV3IGRpc3BsYXkgaXMgY3JlYXRlZC4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgTGlzdDxBY3Rpdml0eURpc3BsYXk+IGFzc2VydEFuZEdldE5ld0Rpc3BsYXlzKGludCBuZXdEaXNwbGF5Q291bnQsCisgICAgICAgICAgICAgICAgTGlzdDxBY3Rpdml0eURpc3BsYXk+IG9yaWdpbmFsRFMpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBvcmlnaW5hbERpc3BsYXlDb3VudCA9IG9yaWdpbmFsRFMuc2l6ZSgpOworCisgICAgICAgICAgICAvLyBXYWl0IGZvciB0aGUgZGlzcGxheShzKSB0byBiZSBjcmVhdGVkIGFuZCBnZXQgY29uZmlndXJhdGlvbnMuCisgICAgICAgICAgICBmaW5hbCBMaXN0PEFjdGl2aXR5RGlzcGxheT4gZHMgPSBnZXREaXNwbGF5U3RhdGVBZnRlckNoYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxEaXNwbGF5Q291bnQgKyBuZXdEaXNwbGF5Q291bnQpOworICAgICAgICAgICAgaWYgKG5ld0Rpc3BsYXlDb3VudCAhPSAtMSkgeworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiTmV3IHZpcnR1YWwgZGlzcGxheShzKSBtdXN0IGJlIGNyZWF0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxEaXNwbGF5Q291bnQgKyBuZXdEaXNwbGF5Q291bnQsIGRzLnNpemUoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiTmV3IHZpcnR1YWwgZGlzcGxheSBtdXN0IG5vdCBiZSBjcmVhdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsRGlzcGxheUNvdW50LCBkcy5zaXplKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRmluZCB0aGUgbmV3bHkgYWRkZWQgZGlzcGxheShzKS4KKyAgICAgICAgICAgIGZpbmFsIExpc3Q8QWN0aXZpdHlEaXNwbGF5PiBuZXdEaXNwbGF5cyA9IGZpbmROZXdEaXNwbGF5U3RhdGVzKG9yaWdpbmFsRFMsIGRzKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoIk5ldyB2aXJ0dWFsIGRpc3BsYXkgbXVzdCBiZSBjcmVhdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgbmV3RGlzcGxheXMsIGhhc1NpemUobmV3RGlzcGxheUNvdW50KSk7CisKKyAgICAgICAgICAgIHJldHVybiBuZXdEaXNwbGF5czsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBIZWxwZXIgY2xhc3MgdG8gc2F2ZSwgc2V0LCBhbmQgcmVzdG9yZSBvdmVybGF5X2Rpc3BsYXlfZGV2aWNlcyBwcmVmZXJlbmNlLiAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE92ZXJsYXlEaXNwbGF5RGV2aWNlc1Nlc3Npb24gZXh0ZW5kcyBTZXR0aW5nc1Nlc3Npb248U3RyaW5nPiB7CisgICAgICAgIE92ZXJsYXlEaXNwbGF5RGV2aWNlc1Nlc3Npb24oKSB7CisgICAgICAgICAgICBzdXBlcihTZXR0aW5ncy5HbG9iYWwuZ2V0VXJpRm9yKFNldHRpbmdzLkdsb2JhbC5PVkVSTEFZX0RJU1BMQVlfREVWSUNFUyksCisgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLkdsb2JhbDo6Z2V0U3RyaW5nLAorICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5HbG9iYWw6OnB1dFN0cmluZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogV2FpdCBmb3IgcHJvdmlkZWQgbnVtYmVyIG9mIGRpc3BsYXlzIGFuZCByZXBvcnQgdGhlaXIgY29uZmlndXJhdGlvbnMuICovCisgICAgTGlzdDxBY3Rpdml0eURpc3BsYXk+IGdldERpc3BsYXlTdGF0ZUFmdGVyQ2hhbmdlKGludCBleHBlY3RlZERpc3BsYXlDb3VudCkgeworICAgICAgICBMaXN0PEFjdGl2aXR5RGlzcGxheT4gZHMgPSBnZXREaXNwbGF5c1N0YXRlcygpOworCisgICAgICAgIGludCByZXRyaWVzTGVmdCA9IDU7CisgICAgICAgIHdoaWxlICghYXJlRGlzcGxheXNWYWxpZChkcywgZXhwZWN0ZWREaXNwbGF5Q291bnQpICYmIHJldHJpZXNMZWZ0LS0gPiAwKSB7CisgICAgICAgICAgICBsb2coIioqKldhaXRpbmcgZm9yIHRoZSBjb3JyZWN0IG51bWJlciBvZiBkaXNwbGF5cy4uLiIpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nKGUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkcyA9IGdldERpc3BsYXlzU3RhdGVzKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZHM7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGFyZURpc3BsYXlzVmFsaWQoTGlzdDxBY3Rpdml0eURpc3BsYXk+IGRpc3BsYXlzLCBpbnQgZXhwZWN0ZWREaXNwbGF5Q291bnQpIHsKKyAgICAgICAgaWYgKGRpc3BsYXlzLnNpemUoKSAhPSBleHBlY3RlZERpc3BsYXlDb3VudCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZvciAoQWN0aXZpdHlEaXNwbGF5IGRpc3BsYXkgOiBkaXNwbGF5cykgeworICAgICAgICAgICAgaWYgKGRpc3BsYXkubU92ZXJyaWRlQ29uZmlndXJhdGlvbi5kZW5zaXR5RHBpID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqIENoZWNrcyBpZiB0aGUgZGV2aWNlIHN1cHBvcnRzIG11bHRpLWRpc3BsYXkuICovCisgICAgYm9vbGVhbiBzdXBwb3J0c011bHRpRGlzcGxheSgpIHsKKyAgICAgICAgcmV0dXJuIGhhc0RldmljZUZlYXR1cmUoRkVBVFVSRV9BQ1RJVklUSUVTX09OX1NFQ09OREFSWV9ESVNQTEFZUyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJEaXNwbGF5VGVzdHMuamF2YSBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlNYW5hZ2VyRGlzcGxheVRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJlZjhmZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlNYW5hZ2VyRGlzcGxheVRlc3RzLmphdmEKQEAgLTAsMCArMSwxNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW07CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50TmFtZVV0aWxzLmdldEFjdGl2aXR5TmFtZTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5URVNUX0FDVElWSVRZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuRGlzcGxheS5ERUZBVUxUX0RJU1BMQVk7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3N1bWUuYXNzdW1lRmFsc2U7CisKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUHJlc3VibWl0OworaW1wb3J0IGFuZHJvaWQuc2VydmVyLmFtLkFjdGl2aXR5TWFuYWdlclN0YXRlLkFjdGl2aXR5RGlzcGxheTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU2l6ZTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQnVpbGQvSW5zdGFsbC9SdW46CisgKiAgICAgYXRlc3QgQ3RzQWN0aXZpdHlNYW5hZ2VyRGV2aWNlVGVzdENhc2VzOkFjdGl2aXR5TWFuYWdlckRpc3BsYXlUZXN0cworICovCitwdWJsaWMgY2xhc3MgQWN0aXZpdHlNYW5hZ2VyRGlzcGxheVRlc3RzIGV4dGVuZHMgQWN0aXZpdHlNYW5hZ2VyRGlzcGxheVRlc3RCYXNlIHsKKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoYXQgdGhlIGdsb2JhbCBjb25maWd1cmF0aW9uIGlzIGVxdWFsIHRvIHRoZSBkZWZhdWx0IGRpc3BsYXkncyBvdmVycmlkZSBjb25maWd1cmF0aW9uLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHREaXNwbGF5T3ZlcnJpZGVDb25maWd1cmF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIExpc3Q8QWN0aXZpdHlEaXNwbGF5PiByZXBvcnRlZERpc3BsYXlzID0gZ2V0RGlzcGxheXNTdGF0ZXMoKTsKKyAgICAgICAgZmluYWwgQWN0aXZpdHlEaXNwbGF5IHByaW1hcnlEaXNwbGF5ID0gZ2V0RGlzcGxheVN0YXRlKHJlcG9ydGVkRGlzcGxheXMsIERFRkFVTFRfRElTUExBWSk7CisgICAgICAgIGFzc2VydEVxdWFscygiUHJpbWFyeSBkaXNwbGF5J3MgY29uZmlndXJhdGlvbiBzaG91bGQgYmUgZXF1YWwgdG8gZ2xvYmFsIGNvbmZpZ3VyYXRpb24uIiwKKyAgICAgICAgICAgICAgICBwcmltYXJ5RGlzcGxheS5tT3ZlcnJpZGVDb25maWd1cmF0aW9uLCBwcmltYXJ5RGlzcGxheS5tRnVsbENvbmZpZ3VyYXRpb24pOworICAgICAgICBhc3NlcnRFcXVhbHMoIlByaW1hcnkgZGlzcGxheSdzIGNvbmZpZ3VyYXRpb24gc2hvdWxkIGJlIGVxdWFsIHRvIGdsb2JhbCBjb25maWd1cmF0aW9uLiIsCisgICAgICAgICAgICAgICAgcHJpbWFyeURpc3BsYXkubU92ZXJyaWRlQ29uZmlndXJhdGlvbiwgcHJpbWFyeURpc3BsYXkubU1lcmdlZE92ZXJyaWRlQ29uZmlndXJhdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhhdCBzZWNvbmRhcnkgZGlzcGxheSBoYXMgb3ZlcnJpZGUgY29uZmlndXJhdGlvbiBzZXQuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlVmlydHVhbERpc3BsYXlXaXRoQ3VzdG9tQ29uZmlnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSAoZmluYWwgVmlydHVhbERpc3BsYXlTZXNzaW9uIHZpcnR1YWxEaXNwbGF5U2Vzc2lvbiA9IG5ldyBWaXJ0dWFsRGlzcGxheVNlc3Npb24oKSkgeworICAgICAgICAgICAgZmluYWwgQWN0aXZpdHlEaXNwbGF5IG5ld0Rpc3BsYXkgPSB2aXJ0dWFsRGlzcGxheVNlc3Npb24uY3JlYXRlRGlzcGxheSgpOworCisgICAgICAgICAgICAvLyBGaW5kIHRoZSBkZW5zaXR5IG9mIGNyZWF0ZWQgZGlzcGxheS4KKyAgICAgICAgICAgIGZpbmFsIGludCBuZXdEZW5zaXR5RHBpID0gbmV3RGlzcGxheS5tRnVsbENvbmZpZ3VyYXRpb24uZGVuc2l0eURwaTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhDVVNUT01fREVOU0lUWV9EUEksIG5ld0RlbnNpdHlEcGkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhhdCBsYXVuY2ggb24gc2Vjb25kYXJ5IGRpc3BsYXkgaXMgbm90IHBlcm1pdHRlZCBpZiBkZXZpY2UgaGFzIHRoZSBmZWF0dXJlIGRpc2FibGVkLgorICAgICAqIEFjdGl2aXRpZXMgcmVxdWVzdGVkIHRvIGJlIGxhdW5jaGVkIG9uIGEgc2Vjb25kYXJ5IGRpc3BsYXkgaW4gdGhpcyBjYXNlIHNob3VsZCBsYW5kIG9uIHRoZQorICAgICAqIGRlZmF1bHQgZGlzcGxheS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aURpc3BsYXlEaXNhYmxlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBPbmx5IGNoZWNrIGRldmljZXMgd2l0aCB0aGUgZmVhdHVyZSBkaXNhYmxlZC4KKyAgICAgICAgYXNzdW1lRmFsc2Uoc3VwcG9ydHNNdWx0aURpc3BsYXkoKSk7CisKKyAgICAgICAgdHJ5IChmaW5hbCBWaXJ0dWFsRGlzcGxheVNlc3Npb24gdmlydHVhbERpc3BsYXlTZXNzaW9uID0gbmV3IFZpcnR1YWxEaXNwbGF5U2Vzc2lvbigpKSB7CisgICAgICAgICAgICAvLyBDcmVhdGUgbmV3IHZpcnR1YWwgZGlzcGxheS4KKyAgICAgICAgICAgIGZpbmFsIEFjdGl2aXR5RGlzcGxheSBuZXdEaXNwbGF5ID0gdmlydHVhbERpc3BsYXlTZXNzaW9uLmNyZWF0ZURpc3BsYXkoKTsKKworICAgICAgICAgICAgLy8gTGF1bmNoIGFjdGl2aXR5IG9uIG5ldyBzZWNvbmRhcnkgZGlzcGxheS4KKyAgICAgICAgICAgIGxhdW5jaEFjdGl2aXR5T25EaXNwbGF5KFRFU1RfQUNUSVZJVFksIG5ld0Rpc3BsYXkubUlkKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKFRFU1RfQUNUSVZJVFkpOworCisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRBY3Rpdml0eSgiTGF1bmNoZWQgYWN0aXZpdHkgbXVzdCBiZSBmb2N1c2VkIiwKKyAgICAgICAgICAgICAgICAgICAgVEVTVF9BQ1RJVklUWSk7CisKKyAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgYWN0aXZpdHkgaXMgb24gdGhlIHJpZ2h0IGRpc3BsYXkuCisgICAgICAgICAgICBmaW5hbCBpbnQgZnJvbnRTdGFja0lkID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0RnJvbnRTdGFja0lkKERFRkFVTFRfRElTUExBWSk7CisgICAgICAgICAgICBmaW5hbCBBY3Rpdml0eU1hbmFnZXJTdGF0ZS5BY3Rpdml0eVN0YWNrIGZyb250U3RhY2sgPQorICAgICAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja0J5SWQoZnJvbnRTdGFja0lkKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiTGF1bmNoZWQgYWN0aXZpdHkgbXVzdCBiZSByZXN1bWVkIiwKKyAgICAgICAgICAgICAgICAgICAgZ2V0QWN0aXZpdHlOYW1lKFRFU1RfQUNUSVZJVFkpLCBmcm9udFN0YWNrLm1SZXN1bWVkQWN0aXZpdHkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJGcm9udCBzdGFjayBtdXN0IGJlIG9uIHRoZSBkZWZhdWx0IGRpc3BsYXkiLAorICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0RJU1BMQVksIGZyb250U3RhY2subURpc3BsYXlJZCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRTdGFjaygiRm9jdXMgbXVzdCBiZSBvbiB0aGUgZGVmYXVsdCBkaXNwbGF5IiwgZnJvbnRTdGFja0lkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZU11bHRpcGxlVmlydHVhbERpc3BsYXlzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIExpc3Q8QWN0aXZpdHlEaXNwbGF5PiBvcmlnaW5hbERzID0gZ2V0RGlzcGxheXNTdGF0ZXMoKTsKKyAgICAgICAgdHJ5IChmaW5hbCBWaXJ0dWFsRGlzcGxheVNlc3Npb24gdmlydHVhbERpc3BsYXlTZXNzaW9uID0gbmV3IFZpcnR1YWxEaXNwbGF5U2Vzc2lvbigpKSB7CisgICAgICAgICAgICAvLyBDcmVhdGUgbmV3IHZpcnR1YWwgZGlzcGxheXMKKyAgICAgICAgICAgIHZpcnR1YWxEaXNwbGF5U2Vzc2lvbi5jcmVhdGVEaXNwbGF5cygzKTsKKyAgICAgICAgICAgIGdldERpc3BsYXlTdGF0ZUFmdGVyQ2hhbmdlKG9yaWdpbmFsRHMuc2l6ZSgpICsgMyk7CisgICAgICAgIH0KKyAgICAgICAgZ2V0RGlzcGxheVN0YXRlQWZ0ZXJDaGFuZ2Uob3JpZ2luYWxEcy5zaXplKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhhdCBkaXNwbGF5IG92ZXJyaWRlcyBhcHBseSBjb3JyZWN0bHkgYW5kIHdvbid0IGJlIGFmZmVjdGVkIGJ5IGRpc3BsYXkgY2hhbmdlcy4KKyAgICAgKiBUaGlzIHNldHMgb3ZlcnJpZGVzIHRvIGRpc3BsYXkgc2l6ZSBhbmQgZGVuc2l0eSwgaW5pdGlhdGVzIGEgZGlzcGxheSBjaGFuZ2VkIGV2ZW50IGJ5IGxvY2tpbmcKKyAgICAgKiBhbmQgdW5sb2NraW5nIHRoZSBwaG9uZSBhbmQgdmVyaWZpZXMgdGhhdCBvdmVycmlkZXMgYXJlIGtlcHQuCisgICAgICovCisgICAgQFByZXN1Ym1pdAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZvcmNlRGlzcGxheU1ldHJpY3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbGF1bmNoSG9tZUFjdGl2aXR5KCk7CisKKyAgICAgICAgdHJ5IChmaW5hbCBEaXNwbGF5TWV0cmljc1Nlc3Npb24gZGlzcGxheU1ldHJpY3NTZXNzaW9uID0gbmV3IERpc3BsYXlNZXRyaWNzU2Vzc2lvbigpOworICAgICAgICAgICAgIGZpbmFsIExvY2tTY3JlZW5TZXNzaW9uIGxvY2tTY3JlZW5TZXNzaW9uID0gbmV3IExvY2tTY3JlZW5TZXNzaW9uKCkpIHsKKyAgICAgICAgICAgIC8vIFJlYWQgaW5pdGlhbCBzaXplcy4KKyAgICAgICAgICAgIGZpbmFsIFJlcG9ydGVkRGlzcGxheU1ldHJpY3Mgb3JpZ2luYWxEaXNwbGF5TWV0cmljcyA9CisgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlNZXRyaWNzU2Vzc2lvbi5nZXRJbml0aWFsRGlzcGxheU1ldHJpY3MoKTsKKworICAgICAgICAgICAgLy8gQXBwbHkgbmV3IG92ZXJyaWRlIHZhbHVlcyB0aGF0IGRvbid0IG1hdGNoIHRoZSBwaHlzaWNhbCBtZXRyaWNzLgorICAgICAgICAgICAgZmluYWwgU2l6ZSBvdmVycmlkZVNpemUgPSBuZXcgU2l6ZSgKKyAgICAgICAgICAgICAgICAgICAgKGludCkgKG9yaWdpbmFsRGlzcGxheU1ldHJpY3MucGh5c2ljYWxTaXplLmdldFdpZHRoKCkgKiAxLjUpLAorICAgICAgICAgICAgICAgICAgICAoaW50KSAob3JpZ2luYWxEaXNwbGF5TWV0cmljcy5waHlzaWNhbFNpemUuZ2V0SGVpZ2h0KCkgKiAxLjUpKTsKKyAgICAgICAgICAgIGZpbmFsIEludGVnZXIgb3ZlcnJpZGVEZW5zaXR5ID0gKGludCkgKG9yaWdpbmFsRGlzcGxheU1ldHJpY3MucGh5c2ljYWxEZW5zaXR5ICogMS4xKTsKKyAgICAgICAgICAgIGRpc3BsYXlNZXRyaWNzU2Vzc2lvbi5vdmVycmlkZURpc3BsYXlNZXRyaWNzKG92ZXJyaWRlU2l6ZSwgb3ZlcnJpZGVEZW5zaXR5KTsKKworICAgICAgICAgICAgLy8gQ2hlY2sgaWYgb3ZlcnJpZGVzIGFwcGxpZWQgY29ycmVjdGx5LgorICAgICAgICAgICAgUmVwb3J0ZWREaXNwbGF5TWV0cmljcyBkaXNwbGF5TWV0cmljcyA9IGRpc3BsYXlNZXRyaWNzU2Vzc2lvbi5nZXREaXNwbGF5TWV0cmljcygpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG92ZXJyaWRlU2l6ZSwgZGlzcGxheU1ldHJpY3Mub3ZlcnJpZGVTaXplKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhvdmVycmlkZURlbnNpdHksIGRpc3BsYXlNZXRyaWNzLm92ZXJyaWRlRGVuc2l0eSk7CisKKyAgICAgICAgICAgIC8vIExvY2sgYW5kIHVubG9jayBkZXZpY2UuIFRoaXMgd2lsbCBjYXVzZSBhIERJU1BMQVlfQ0hBTkdFRCBldmVudCB0byBiZSB0cmlnZ2VyZWQgYW5kCisgICAgICAgICAgICAvLyBtaWdodCB1cGRhdGUgdGhlIG1ldHJpY3MuCisgICAgICAgICAgICBsb2NrU2NyZWVuU2Vzc2lvbi5zbGVlcERldmljZSgpCisgICAgICAgICAgICAgICAgICAgIC53YWtlVXBEZXZpY2UoKQorICAgICAgICAgICAgICAgICAgICAudW5sb2NrRGV2aWNlKCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JIb21lQWN0aXZpdHlWaXNpYmxlKCk7CisKKyAgICAgICAgICAgIC8vIENoZWNrIGlmIG92ZXJyaWRlcyBhcmUgc3RpbGwgYXBwbGllZC4KKyAgICAgICAgICAgIGRpc3BsYXlNZXRyaWNzID0gZGlzcGxheU1ldHJpY3NTZXNzaW9uLmdldERpc3BsYXlNZXRyaWNzKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMob3ZlcnJpZGVTaXplLCBkaXNwbGF5TWV0cmljcy5vdmVycmlkZVNpemUpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG92ZXJyaWRlRGVuc2l0eSwgZGlzcGxheU1ldHJpY3Mub3ZlcnJpZGVEZW5zaXR5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIERpc3BsYXlNZXRyaWNzU2Vzc2lvbiBpbXBsZW1lbnRzIEF1dG9DbG9zZWFibGUgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgUmVwb3J0ZWREaXNwbGF5TWV0cmljcyBtSW5pdGlhbERpc3BsYXlNZXRyaWNzOworCisgICAgICAgIERpc3BsYXlNZXRyaWNzU2Vzc2lvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgbUluaXRpYWxEaXNwbGF5TWV0cmljcyA9IFJlcG9ydGVkRGlzcGxheU1ldHJpY3MuZ2V0RGlzcGxheU1ldHJpY3MoKTsKKyAgICAgICAgfQorCisgICAgICAgIFJlcG9ydGVkRGlzcGxheU1ldHJpY3MgZ2V0SW5pdGlhbERpc3BsYXlNZXRyaWNzKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Jbml0aWFsRGlzcGxheU1ldHJpY3M7CisgICAgICAgIH0KKworICAgICAgICBSZXBvcnRlZERpc3BsYXlNZXRyaWNzIGdldERpc3BsYXlNZXRyaWNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gUmVwb3J0ZWREaXNwbGF5TWV0cmljcy5nZXREaXNwbGF5TWV0cmljcygpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBvdmVycmlkZURpc3BsYXlNZXRyaWNzKGZpbmFsIFNpemUgc2l6ZSwgZmluYWwgaW50IGRlbnNpdHkpIHsKKyAgICAgICAgICAgIG1Jbml0aWFsRGlzcGxheU1ldHJpY3Muc2V0RGlzcGxheU1ldHJpY3Moc2l6ZSwgZGVuc2l0eSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIG1Jbml0aWFsRGlzcGxheU1ldHJpY3MucmVzdG9yZURpc3BsYXlNZXRyaWNzKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlckZyZWVmb3JtU3RhY2tUZXN0cy5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJGcmVlZm9ybVN0YWNrVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2IzOTg4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJGcmVlZm9ybVN0YWNrVGVzdHMuamF2YQpAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbTsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5XaW5kb3dDb25maWd1cmF0aW9uLkFDVElWSVRZX1RZUEVfU1RBTkRBUkQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLldpbmRvd0NvbmZpZ3VyYXRpb24uV0lORE9XSU5HX01PREVfRlJFRUZPUk07CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuRlJFRUZPUk1fQUNUSVZJVFk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuTk9OX1JFU0laRUFCTEVfQUNUSVZJVFk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuTk9fUkVMQVVOQ0hfQUNUSVZJVFk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuVEVTVF9BQ1RJVklUWTsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKK2ltcG9ydCBhbmRyb2lkLnNlcnZlci5hbS5BY3Rpdml0eU1hbmFnZXJTdGF0ZS5BY3Rpdml0eVN0YWNrOworaW1wb3J0IGFuZHJvaWQuc2VydmVyLmFtLkFjdGl2aXR5TWFuYWdlclN0YXRlLkFjdGl2aXR5VGFzazsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIEJ1aWxkL0luc3RhbGwvUnVuOgorICogICAgIGF0ZXN0IEN0c0FjdGl2aXR5TWFuYWdlckRldmljZVRlc3RDYXNlczpBY3Rpdml0eU1hbmFnZXJGcmVlZm9ybVN0YWNrVGVzdHMKKyAqLworcHVibGljIGNsYXNzIEFjdGl2aXR5TWFuYWdlckZyZWVmb3JtU3RhY2tUZXN0cyBleHRlbmRzIEFjdGl2aXR5TWFuYWdlclRlc3RCYXNlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBURVNUX1RBU0tfT0ZGU0VUID0gMjA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRFU1RfVEFTS19PRkZTRVRfMiA9IDEwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEVTVF9UQVNLX1NJWkVfMSA9IDkwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEVTVF9UQVNLX1NJWkVfMiA9IFRFU1RfVEFTS19TSVpFXzEgKiAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBURVNUX1RBU0tfU0laRV9EUF8xID0gMjIwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBURVNUX1RBU0tfU0laRV9EUF8yID0gVEVTVF9UQVNLX1NJWkVfRFBfMSAqIDI7CisKKyAgICAvLyBOT1RFOiBMYXVuY2hpbmcgdGhlIEZyZWVmb3JtQWN0aXZpdHkgd2lsbCBhdXRvbWF0aWNhbGx5IGxhdW5jaCB0aGUgVGVzdEFjdGl2aXR5CisgICAgLy8gd2l0aCBib3VuZHMgKDAsIDAsIDkwMCwgOTAwKQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RnJlZWZvcm1XaW5kb3dNYW5hZ2VtZW50U3VwcG9ydCgpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIGxhdW5jaEFjdGl2aXR5KEZSRUVGT1JNX0FDVElWSVRZLCBXSU5ET1dJTkdfTU9ERV9GUkVFRk9STSk7CisKKyAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUoRlJFRUZPUk1fQUNUSVZJVFksIFRFU1RfQUNUSVZJVFkpOworCisgICAgICAgIGlmICghc3VwcG9ydHNGcmVlZm9ybSgpKSB7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydERvZXNOb3RDb250YWluU3RhY2soIk11c3Qgbm90IGNvbnRhaW4gZnJlZWZvcm0gc3RhY2suIiwKKyAgICAgICAgICAgICAgICAgICAgV0lORE9XSU5HX01PREVfRlJFRUZPUk0sIEFDVElWSVRZX1RZUEVfU1RBTkRBUkQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGcm9udFN0YWNrKCJGcmVlZm9ybSBzdGFjayBtdXN0IGJlIHRoZSBmcm9udCBzdGFjay4iLAorICAgICAgICAgICAgICAgIFdJTkRPV0lOR19NT0RFX0ZSRUVGT1JNLCBBQ1RJVklUWV9UWVBFX1NUQU5EQVJEKTsKKyAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KEZSRUVGT1JNX0FDVElWSVRZLCB0cnVlKTsKKyAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFRFU1RfQUNUSVZJVFksIHRydWUpOworICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRBY3Rpdml0eSgKKyAgICAgICAgICAgICAgICBURVNUX0FDVElWSVRZICsgIiBtdXN0IGJlIGZvY3VzZWQgQWN0aXZpdHkiLCBURVNUX0FDVElWSVRZKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBSZWN0KDAsIDAsIFRFU1RfVEFTS19TSVpFXzEsIFRFU1RfVEFTS19TSVpFXzEpLAorICAgICAgICAgICAgICAgIG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFRhc2tCeUFjdGl2aXR5KFRFU1RfQUNUSVZJVFkpLmdldEJvdW5kcygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb25SZXNpemVhYmxlQWN0aXZpdHlIYXNGdWxsRGlzcGxheUJvdW5kcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBsYXVuY2hBY3Rpdml0eShOT05fUkVTSVpFQUJMRV9BQ1RJVklUWSwgV0lORE9XSU5HX01PREVfRlJFRUZPUk0pOworCisgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKE5PTl9SRVNJWkVBQkxFX0FDVElWSVRZKTsKKworICAgICAgICBmaW5hbCBBY3Rpdml0eVRhc2sgdGFzayA9CisgICAgICAgICAgICAgICAgbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0VGFza0J5QWN0aXZpdHkoTk9OX1JFU0laRUFCTEVfQUNUSVZJVFkpOworICAgICAgICBmaW5hbCBBY3Rpdml0eVN0YWNrIHN0YWNrID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0U3RhY2tCeUlkKHRhc2subVN0YWNrSWQpOworCisgICAgICAgIGlmICh0YXNrLmlzRnVsbHNjcmVlbigpKSB7CisgICAgICAgICAgICAvLyBJZiB0aGUgdGFzayBpcyBvbiB0aGUgZnVsbHNjcmVlbiBzdGFjaywgdGhlbiB3ZSBrbm93IHRoYXQgaXQgd2lsbCBoYXZlIGJvdW5kcyB0aGF0CisgICAgICAgICAgICAvLyBmaWxsIHRoZSBlbnRpcmUgZGlzcGxheS4KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHRoZSB0YXNrIGlzIG5vdCBvbiB0aGUgZnVsbHNjcmVlbiBzdGFjaywgdGhlbiBjb21wYXJlIHRoZSB0YXNrIGJvdW5kcyB0byB0aGUgZGlzcGxheQorICAgICAgICAvLyBib3VuZHMuCisgICAgICAgIGFzc2VydEVxdWFscyhtQW1XbVN0YXRlLmdldFdtU3RhdGUoKS5nZXREaXNwbGF5KHN0YWNrLm1EaXNwbGF5SWQpLmdldERpc3BsYXlSZWN0KCksCisgICAgICAgICAgICAgICAgdGFzay5nZXRCb3VuZHMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWN0aXZpdHlMaWZlQ3ljbGVPblJlc2l6ZUZyZWVmb3JtVGFzaygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBsYXVuY2hBY3Rpdml0eShURVNUX0FDVElWSVRZLCBXSU5ET1dJTkdfTU9ERV9GUkVFRk9STSk7CisgICAgICAgIGxhdW5jaEFjdGl2aXR5KE5PX1JFTEFVTkNIX0FDVElWSVRZLCBXSU5ET1dJTkdfTU9ERV9GUkVFRk9STSk7CisKKyAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUoVEVTVF9BQ1RJVklUWSwgTk9fUkVMQVVOQ0hfQUNUSVZJVFkpOworCisgICAgICAgIGlmICghc3VwcG9ydHNGcmVlZm9ybSgpKSB7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydERvZXNOb3RDb250YWluU3RhY2soIk11c3Qgbm90IGNvbnRhaW4gZnJlZWZvcm0gc3RhY2suIiwKKyAgICAgICAgICAgICAgICAgICAgV0lORE9XSU5HX01PREVfRlJFRUZPUk0sIEFDVElWSVRZX1RZUEVfU1RBTkRBUkQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgaW50IGRpc3BsYXlJZCA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFN0YW5kYXJkU3RhY2tCeVdpbmRvd2luZ01vZGUoCisgICAgICAgICAgICAgICAgV0lORE9XSU5HX01PREVfRlJFRUZPUk0pLm1EaXNwbGF5SWQ7CisgICAgICAgIGZpbmFsIGludCBkZW5zaXR5RHBpID0KKyAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLmdldFdtU3RhdGUoKS5nZXREaXNwbGF5KGRpc3BsYXlJZCkuZ2V0RHBpKCk7CisgICAgICAgIGZpbmFsIGludCB0ZXN0VGFza1NpemUxID0KKyAgICAgICAgICAgICAgICBBY3Rpdml0eUFuZFdpbmRvd01hbmFnZXJzU3RhdGUuZHBUb1B4KFRFU1RfVEFTS19TSVpFX0RQXzEsIGRlbnNpdHlEcGkpOworICAgICAgICBmaW5hbCBpbnQgdGVzdFRhc2tTaXplMiA9CisgICAgICAgICAgICAgICAgQWN0aXZpdHlBbmRXaW5kb3dNYW5hZ2Vyc1N0YXRlLmRwVG9QeChURVNUX1RBU0tfU0laRV9EUF8yLCBkZW5zaXR5RHBpKTsKKworICAgICAgICByZXNpemVBY3Rpdml0eVRhc2soVEVTVF9BQ1RJVklUWSwKKyAgICAgICAgICAgICAgICBURVNUX1RBU0tfT0ZGU0VULCBURVNUX1RBU0tfT0ZGU0VULAorICAgICAgICAgICAgICAgIFRFU1RfVEFTS19PRkZTRVQgKyB0ZXN0VGFza1NpemUxLCBURVNUX1RBU0tfT0ZGU0VUICsgdGVzdFRhc2tTaXplMik7CisgICAgICAgIHJlc2l6ZUFjdGl2aXR5VGFzayhOT19SRUxBVU5DSF9BQ1RJVklUWSwKKyAgICAgICAgICAgICAgICBURVNUX1RBU0tfT0ZGU0VUXzIsIFRFU1RfVEFTS19PRkZTRVRfMiwKKyAgICAgICAgICAgICAgICBURVNUX1RBU0tfT0ZGU0VUXzIgKyB0ZXN0VGFza1NpemUxLCBURVNUX1RBU0tfT0ZGU0VUXzIgKyB0ZXN0VGFza1NpemUyKTsKKworICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShuZXcgV2FpdEZvclZhbGlkQWN0aXZpdHlTdGF0ZS5CdWlsZGVyKFRFU1RfQUNUSVZJVFkpLmJ1aWxkKCksCisgICAgICAgICAgICAgICAgbmV3IFdhaXRGb3JWYWxpZEFjdGl2aXR5U3RhdGUuQnVpbGRlcihOT19SRUxBVU5DSF9BQ1RJVklUWSkuYnVpbGQoKSk7CisKKyAgICAgICAgZmluYWwgTG9nU2VwYXJhdG9yIGxvZ1NlcGFyYXRvciA9IHNlcGFyYXRlTG9ncygpOworICAgICAgICByZXNpemVBY3Rpdml0eVRhc2soVEVTVF9BQ1RJVklUWSwKKyAgICAgICAgICAgICAgICBURVNUX1RBU0tfT0ZGU0VULCBURVNUX1RBU0tfT0ZGU0VULAorICAgICAgICAgICAgICAgIFRFU1RfVEFTS19PRkZTRVQgKyB0ZXN0VGFza1NpemUyLCBURVNUX1RBU0tfT0ZGU0VUICsgdGVzdFRhc2tTaXplMSk7CisgICAgICAgIHJlc2l6ZUFjdGl2aXR5VGFzayhOT19SRUxBVU5DSF9BQ1RJVklUWSwKKyAgICAgICAgICAgICAgICBURVNUX1RBU0tfT0ZGU0VUXzIsIFRFU1RfVEFTS19PRkZTRVRfMiwKKyAgICAgICAgICAgICAgICBURVNUX1RBU0tfT0ZGU0VUXzIgKyB0ZXN0VGFza1NpemUyLCBURVNUX1RBU0tfT0ZGU0VUXzIgKyB0ZXN0VGFza1NpemUxKTsKKyAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUoVEVTVF9BQ1RJVklUWSwgTk9fUkVMQVVOQ0hfQUNUSVZJVFkpOworCisgICAgICAgIGFzc2VydEFjdGl2aXR5TGlmZWN5Y2xlKFRFU1RfQUNUSVZJVFksIHRydWUgLyogcmVsYXVuY2hlZCAqLywgbG9nU2VwYXJhdG9yKTsKKyAgICAgICAgYXNzZXJ0QWN0aXZpdHlMaWZlY3ljbGUoTk9fUkVMQVVOQ0hfQUNUSVZJVFksIGZhbHNlIC8qIHJlbGF1bmNoZWQgKi8sIGxvZ1NlcGFyYXRvcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJHZXRDb25maWdUZXN0cy5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJHZXRDb25maWdUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NzhlMTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlckdldENvbmZpZ1Rlc3RzLmphdmEKQEAgLTAsMCArMSwzODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLmFtOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0QXJyYXlFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuYXBwLktleWd1YXJkTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQubmFuby5EZXZpY2VDb25maWd1cmF0aW9uUHJvdG87CitpbXBvcnQgYW5kcm9pZC5jb250ZW50Lm5hbm8uR2xvYmFsQ29uZmlndXJhdGlvblByb3RvOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5uYW5vLkxvY2FsZVByb3RvOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5uYW5vLlJlc291cmNlc0NvbmZpZ3VyYXRpb25Qcm90bzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQ29uZmlndXJhdGlvbkluZm87CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkZlYXR1cmVJbmZvOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uU2hhcmVkTGlicmFyeUluZm87CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQ7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5kaXNwbGF5LkRpc3BsYXlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3BlbmdsLkdMRVMxMDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOworaW1wb3J0IGFuZHJvaWQub3MuTG9jYWxlTGlzdDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOworaW1wb3J0IGFuZHJvaWQudmlldy5EaXNwbGF5OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKKworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYubmFuby5JbnZhbGlkUHJvdG9jb2xCdWZmZXJOYW5vRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMMTA7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbmZpZzsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMQ29udGV4dDsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMRGlzcGxheTsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMU3VyZmFjZTsKKworcHVibGljIGNsYXNzIEFjdGl2aXR5TWFuYWdlckdldENvbmZpZ1Rlc3RzIHsKKyAgICBDb250ZXh0IG1Db250ZXh0OworICAgIEFjdGl2aXR5TWFuYWdlciBtQW07CisgICAgUGFja2FnZU1hbmFnZXIgbVBtOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1Db250ZXh0ID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VGFyZ2V0Q29udGV4dCgpOworICAgICAgICBtQW0gPSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKEFjdGl2aXR5TWFuYWdlci5jbGFzcyk7CisgICAgICAgIG1QbSA9IG1Db250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBieXRlW10gZXhlY3V0ZVNoZWxsQ29tbWFuZChTdHJpbmcgY21kKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBwZmQgPQorICAgICAgICAgICAgICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKS5nZXRVaUF1dG9tYXRpb24oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5leGVjdXRlU2hlbGxDb21tYW5kKGNtZCk7CisgICAgICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbNTEyXTsKKyAgICAgICAgICAgIGludCBieXRlc1JlYWQ7CisgICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IFBhcmNlbEZpbGVEZXNjcmlwdG9yLkF1dG9DbG9zZUlucHV0U3RyZWFtKHBmZCk7CisgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gc3Rkb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgd2hpbGUgKChieXRlc1JlYWQgPSBmaXMucmVhZChidWYpKSAhPSAtMSkgeworICAgICAgICAgICAgICAgIHN0ZG91dC53cml0ZShidWYsIDAsIGJ5dGVzUmVhZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaXMuY2xvc2UoKTsKKyAgICAgICAgICAgIHJldHVybiBzdGRvdXQudG9CeXRlQXJyYXkoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGFsbCBzdXBwb3J0ZWQgR0wgZXh0ZW5zaW9ucyBmb3IgYSBwcm92aWRlZCBFR0xDb25maWcgdG8gYSBzZXQgYnkgY3JlYXRpbmcgYW4gRUdMQ29udGV4dAorICAgICAqIGFuZCBFR0xTdXJmYWNlIGFuZCBxdWVyeWluZyBleHRlbnNpb25zLgorICAgICAqCisgICAgICogQHBhcmFtIGVnbCBBbiBFR0wgQVBJIG9iamVjdAorICAgICAqIEBwYXJhbSBkaXNwbGF5IEFuIEVHTERpc3BsYXkgdG8gY3JlYXRlIGEgY29udGV4dCBhbmQgc3VyZmFjZSB3aXRoCisgICAgICogQHBhcmFtIGNvbmZpZyBUaGUgRUdMQ29uZmlnIHRvIGdldCB0aGUgZXh0ZW5zaW9ucyBmb3IKKyAgICAgKiBAcGFyYW0gc3VyZmFjZVNpemUgZWdsQ3JlYXRlUGJ1ZmZlclN1cmZhY2UgZ2VuZXJpYyBwYXJhbWV0ZXJzCisgICAgICogQHBhcmFtIGNvbnRleHRBdHRyaWJzIGVnbENyZWF0ZUNvbnRleHQgZ2VuZXJpYyBwYXJhbWV0ZXJzCisgICAgICogQHBhcmFtIGdsRXh0ZW5zaW9ucyBBIFNldDxTdHJpbmc+IHRvIGFkZCBHTCBleHRlbnNpb25zIHRvCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRFeHRlbnNpb25zRm9yQ29uZmlnKAorICAgICAgICAgICAgRUdMMTAgZWdsLAorICAgICAgICAgICAgRUdMRGlzcGxheSBkaXNwbGF5LAorICAgICAgICAgICAgRUdMQ29uZmlnIGNvbmZpZywKKyAgICAgICAgICAgIGludFtdIHN1cmZhY2VTaXplLAorICAgICAgICAgICAgaW50W10gY29udGV4dEF0dHJpYnMsCisgICAgICAgICAgICBTZXQ8U3RyaW5nPiBnbEV4dGVuc2lvbnMpIHsKKyAgICAgICAgLy8gQ3JlYXRlIGEgY29udGV4dC4KKyAgICAgICAgRUdMQ29udGV4dCBjb250ZXh0ID0KKyAgICAgICAgICAgICAgICBlZ2wuZWdsQ3JlYXRlQ29udGV4dChkaXNwbGF5LCBjb25maWcsIEVHTDEwLkVHTF9OT19DT05URVhULCBjb250ZXh0QXR0cmlicyk7CisgICAgICAgIC8vIE5vLW9wIGlmIHdlIGNhbid0IGNyZWF0ZSBhIGNvbnRleHQuCisgICAgICAgIGlmIChjb250ZXh0ID09IEVHTDEwLkVHTF9OT19DT05URVhUKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBDcmVhdGUgYSBzdXJmYWNlLgorICAgICAgICBFR0xTdXJmYWNlIHN1cmZhY2UgPSBlZ2wuZWdsQ3JlYXRlUGJ1ZmZlclN1cmZhY2UoZGlzcGxheSwgY29uZmlnLCBzdXJmYWNlU2l6ZSk7CisgICAgICAgIGlmIChzdXJmYWNlID09IEVHTDEwLkVHTF9OT19TVVJGQUNFKSB7CisgICAgICAgICAgICBlZ2wuZWdsRGVzdHJveUNvbnRleHQoZGlzcGxheSwgY29udGV4dCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBVcGRhdGUgdGhlIGN1cnJlbnQgc3VyZmFjZSBhbmQgY29udGV4dC4KKyAgICAgICAgZWdsLmVnbE1ha2VDdXJyZW50KGRpc3BsYXksIHN1cmZhY2UsIHN1cmZhY2UsIGNvbnRleHQpOworCisgICAgICAgIC8vIEdldCB0aGUgbGlzdCBvZiBleHRlbnNpb25zLgorICAgICAgICBTdHJpbmcgZXh0ZW5zaW9uTGlzdCA9IEdMRVMxMC5nbEdldFN0cmluZyhHTEVTMTAuR0xfRVhURU5TSU9OUyk7CisgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoZXh0ZW5zaW9uTGlzdCkpIHsKKyAgICAgICAgICAgIC8vIFRoZSBsaXN0IG9mIGV4dGVuc2lvbnMgY29tZXMgZnJvbSB0aGUgZHJpdmVyIHNlcGFyYXRlZCBieSBzcGFjZXMuCisgICAgICAgICAgICAvLyBTcGxpdCB0aGVtIGFwYXJ0IGFuZCBhZGQgdGhlbSBpbnRvIGEgU2V0IGZvciBkZWR1cGluZyBwdXJwb3Nlcy4KKyAgICAgICAgICAgIGZvciAoU3RyaW5nIGV4dGVuc2lvbiA6IGV4dGVuc2lvbkxpc3Quc3BsaXQoIiAiKSkgeworICAgICAgICAgICAgICAgIGdsRXh0ZW5zaW9ucy5hZGQoZXh0ZW5zaW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFRlYXIgZG93biB0aGUgY29udGV4dCBhbmQgc3VyZmFjZSBmb3IgdGhpcyBjb25maWcuCisgICAgICAgIGVnbC5lZ2xNYWtlQ3VycmVudChkaXNwbGF5LCBFR0wxMC5FR0xfTk9fU1VSRkFDRSwgRUdMMTAuRUdMX05PX1NVUkZBQ0UsIEVHTDEwLkVHTF9OT19DT05URVhUKTsKKyAgICAgICAgZWdsLmVnbERlc3Ryb3lTdXJmYWNlKGRpc3BsYXksIHN1cmZhY2UpOworICAgICAgICBlZ2wuZWdsRGVzdHJveUNvbnRleHQoZGlzcGxheSwgY29udGV4dCk7CisgICAgfQorCisKKyAgICBTZXQ8U3RyaW5nPiBnZXRHbEV4dGVuc2lvbnNGcm9tRHJpdmVyKCkgeworICAgICAgICBTZXQ8U3RyaW5nPiBnbEV4dGVuc2lvbnMgPSBuZXcgSGFzaFNldDw+KCk7CisKKyAgICAgICAgLy8gR2V0IHRoZSBFR0wgaW1wbGVtZW50YXRpb24uCisgICAgICAgIEVHTDEwIGVnbCA9IChFR0wxMCkgRUdMQ29udGV4dC5nZXRFR0woKTsKKyAgICAgICAgaWYgKGVnbCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiV2FybmluZzogY291bGRuJ3QgZ2V0IEVHTCIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gR2V0IHRoZSBkZWZhdWx0IGRpc3BsYXkgYW5kIGluaXRpYWxpemUgaXQuCisgICAgICAgIEVHTERpc3BsYXkgZGlzcGxheSA9IGVnbC5lZ2xHZXREaXNwbGF5KEVHTDEwLkVHTF9ERUZBVUxUX0RJU1BMQVkpOworICAgICAgICBpbnRbXSB2ZXJzaW9uID0gbmV3IGludFsyXTsKKyAgICAgICAgZWdsLmVnbEluaXRpYWxpemUoZGlzcGxheSwgdmVyc2lvbik7CisKKyAgICAgICAgLy8gQ2FsbCBnZXRDb25maWdzKCkgaW4gb3JkZXIgdG8gZmluZCBvdXQgaG93IG1hbnkgdGhlcmUgYXJlLgorICAgICAgICBpbnRbXSBudW1Db25maWdzID0gbmV3IGludFsxXTsKKyAgICAgICAgaWYgKCFlZ2wuZWdsR2V0Q29uZmlncyhkaXNwbGF5LCBudWxsLCAwLCBudW1Db25maWdzKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIldhcm5pbmc6IGNvdWxkbid0IGdldCBFR0wgY29uZmlnIGNvdW50Iik7CisgICAgICAgIH0KKworICAgICAgICAvLyBBbGxvY2F0ZSBzcGFjZSBmb3IgYWxsIGNvbmZpZ3MgYW5kIGFzayBhZ2Fpbi4KKyAgICAgICAgRUdMQ29uZmlnW10gY29uZmlncyA9IG5ldyBFR0xDb25maWdbbnVtQ29uZmlnc1swXV07CisgICAgICAgIGlmICghZWdsLmVnbEdldENvbmZpZ3MoZGlzcGxheSwgY29uZmlncywgbnVtQ29uZmlnc1swXSwgbnVtQ29uZmlncykpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJXYXJuaW5nOiBjb3VsZG4ndCBnZXQgRUdMIGNvbmZpZ3MiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFsbG9jYXRlIHN1cmZhY2Ugc2l6ZSBwYXJhbWV0ZXJzIG91dHNpZGUgb2YgdGhlIG1haW4gbG9vcCB0byBjdXQgZG93bgorICAgICAgICAvLyBvbiBHQyB0aHJhc2hpbmcuICAxeDEgaXMgZW5vdWdoIHNpbmNlIHdlIGFyZSBvbmx5IHVzaW5nIGl0IHRvIGdldCBhdAorICAgICAgICAvLyB0aGUgbGlzdCBvZiBleHRlbnNpb25zLgorICAgICAgICBpbnRbXSBzdXJmYWNlU2l6ZSA9CisgICAgICAgICAgICAgICAgbmV3IGludFtdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9XSURUSCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9IRUlHSFQsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTk9ORQorICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgLy8gRm9yIHdoZW4gd2UgbmVlZCB0byBjcmVhdGUgYSBHTEVTMi4wIGNvbnRleHQuCisgICAgICAgIGZpbmFsIGludCBFR0xfQ09OVEVYVF9DTElFTlRfVkVSU0lPTiA9IDB4MzA5ODsKKyAgICAgICAgaW50W10gZ2xlczIgPSBuZXcgaW50W10ge0VHTF9DT05URVhUX0NMSUVOVF9WRVJTSU9OLCAyLCBFR0wxMC5FR0xfTk9ORX07CisKKyAgICAgICAgLy8gRm9yIGdldHRpbmcgcmV0dXJuIHZhbHVlcyBmcm9tIGVnbEdldENvbmZpZ0F0dHJpYgorICAgICAgICBpbnRbXSBhdHRyaWIgPSBuZXcgaW50WzFdOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ29uZmlnc1swXTsgaSsrKSB7CisgICAgICAgICAgICAvLyBHZXQgY2F2ZWF0IGZvciB0aGlzIGNvbmZpZyBpbiBvcmRlciB0byBza2lwIHNsb3cgKGkuZS4gc29mdHdhcmUpIGNvbmZpZ3MuCisgICAgICAgICAgICBlZ2wuZWdsR2V0Q29uZmlnQXR0cmliKGRpc3BsYXksIGNvbmZpZ3NbaV0sIEVHTDEwLkVHTF9DT05GSUdfQ0FWRUFULCBhdHRyaWIpOworICAgICAgICAgICAgaWYgKGF0dHJpYlswXSA9PSBFR0wxMC5FR0xfU0xPV19DT05GSUcpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSWYgdGhlIGNvbmZpZyBkb2VzIG5vdCBzdXBwb3J0IHBidWZmZXJzIHdlIGNhbm5vdCBkbyBhbiBlZ2xNYWtlQ3VycmVudAorICAgICAgICAgICAgLy8gb24gaXQgaW4gYWRkRXh0ZW5zaW9uc0ZvckNvbmZpZygpLCBzbyBza2lwIGl0IGhlcmUuIEF0dGVtcHRpbmcgdG8gbWFrZQorICAgICAgICAgICAgLy8gaXQgY3VycmVudCB3aXRoIGEgcGJ1ZmZlciB3aWxsIHJlc3VsdCBpbiBhbiBFR0xfQkFEX01BVENIIGVycm9yCisgICAgICAgICAgICBlZ2wuZWdsR2V0Q29uZmlnQXR0cmliKGRpc3BsYXksIGNvbmZpZ3NbaV0sIEVHTDEwLkVHTF9TVVJGQUNFX1RZUEUsIGF0dHJpYik7CisgICAgICAgICAgICBpZiAoKGF0dHJpYlswXSAmIEVHTDEwLkVHTF9QQlVGRkVSX0JJVCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBpbnQgRUdMX09QRU5HTF9FU19CSVQgPSAweDAwMDE7CisgICAgICAgICAgICBmaW5hbCBpbnQgRUdMX09QRU5HTF9FUzJfQklUID0gMHgwMDA0OworICAgICAgICAgICAgZWdsLmVnbEdldENvbmZpZ0F0dHJpYihkaXNwbGF5LCBjb25maWdzW2ldLCBFR0wxMC5FR0xfUkVOREVSQUJMRV9UWVBFLCBhdHRyaWIpOworICAgICAgICAgICAgaWYgKChhdHRyaWJbMF0gJiBFR0xfT1BFTkdMX0VTX0JJVCkgIT0gMCkgeworICAgICAgICAgICAgICAgIGFkZEV4dGVuc2lvbnNGb3JDb25maWcoZWdsLCBkaXNwbGF5LCBjb25maWdzW2ldLCBzdXJmYWNlU2l6ZSwgbnVsbCwgZ2xFeHRlbnNpb25zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoYXR0cmliWzBdICYgRUdMX09QRU5HTF9FUzJfQklUKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgYWRkRXh0ZW5zaW9uc0ZvckNvbmZpZyhlZ2wsIGRpc3BsYXksIGNvbmZpZ3NbaV0sIHN1cmZhY2VTaXplLCBnbGVzMiwgZ2xFeHRlbnNpb25zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlbGVhc2UgYWxsIEVHTCByZXNvdXJjZXMuCisgICAgICAgIGVnbC5lZ2xUZXJtaW5hdGUoZGlzcGxheSk7CisKKyAgICAgICAgcmV0dXJuIGdsRXh0ZW5zaW9uczsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tSZXNvdXJjZUNvbmZpZyhDb25maWd1cmF0aW9uIGNvbmZpZywgRGlzcGxheU1ldHJpY3MgbWV0cmljcywKKyAgICAgICAgICAgIFJlc291cmNlc0NvbmZpZ3VyYXRpb25Qcm90byByZXNDb25maWcpIHsKKyAgICAgICAgZmluYWwgaW50IHdpZHRoLCBoZWlnaHQ7CisgICAgICAgIGlmIChtZXRyaWNzLndpZHRoUGl4ZWxzID49IG1ldHJpY3MuaGVpZ2h0UGl4ZWxzKSB7CisgICAgICAgICAgICB3aWR0aCA9IG1ldHJpY3Mud2lkdGhQaXhlbHM7CisgICAgICAgICAgICBoZWlnaHQgPSBtZXRyaWNzLmhlaWdodFBpeGVsczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vbm9pbnNwZWN0aW9uIFN1c3BpY2lvdXNOYW1lQ29tYmluYXRpb24KKyAgICAgICAgICAgIHdpZHRoID0gbWV0cmljcy5oZWlnaHRQaXhlbHM7CisgICAgICAgICAgICAvL25vaW5zcGVjdGlvbiBTdXNwaWNpb3VzTmFtZUNvbWJpbmF0aW9uCisgICAgICAgICAgICBoZWlnaHQgPSBtZXRyaWNzLndpZHRoUGl4ZWxzOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCBTREsgdmVyc2lvbiBkb2VzIG5vdCBtYXRjaCIsCisgICAgICAgICAgICAgICAgQnVpbGQuVkVSU0lPTi5SRVNPVVJDRVNfU0RLX0lOVCwgcmVzQ29uZmlnLnNka1ZlcnNpb24pOworICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIHNjcmVlbiB3aWR0aCBweCBkb2VzIG5vdCBtYXRjaCIsCisgICAgICAgICAgICAgICAgd2lkdGgsIHJlc0NvbmZpZy5zY3JlZW5XaWR0aFB4KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCBzY3JlZW4gd2lkdGggcHggZG9lcyBub3QgbWF0Y2giLAorICAgICAgICAgICAgICAgIGhlaWdodCwgcmVzQ29uZmlnLnNjcmVlbkhlaWdodFB4KTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIGZvbnQgc2NhbGUgZG9lcyBub3QgbWF0Y2giLAorICAgICAgICAgICAgICAgIGNvbmZpZy5mb250U2NhbGUsIHJlc0NvbmZpZy5jb25maWd1cmF0aW9uLmZvbnRTY2FsZSwgRmxvYXQuTUlOX1ZBTFVFKjUpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIG1jYyBkb2VzIG5vdCBtYXRjaCIsCisgICAgICAgICAgICAgICAgY29uZmlnLm1jYywgcmVzQ29uZmlnLmNvbmZpZ3VyYXRpb24ubWNjKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCBtbmMgZG9lcyBub3QgbWF0Y2giLAorICAgICAgICAgICAgICAgIGNvbmZpZy5tbmMsIHJlc0NvbmZpZy5jb25maWd1cmF0aW9uLm1uYyk7CisgICAgICAgIExvY2FsZUxpc3QgbGxpc3QgPSBjb25maWcuZ2V0TG9jYWxlcygpOworICAgICAgICBMb2NhbGVQcm90b1tdIGxwcm90b3MgPSByZXNDb25maWcuY29uZmlndXJhdGlvbi5sb2NhbGVzOworICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIG51bWJlciBvZiBsb2NhbGVzIGRvZXMgbm90IG1hdGNoIiwKKyAgICAgICAgICAgICAgICBsbGlzdC5zaXplKCksIGxwcm90b3MubGVuZ3RoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsbGlzdC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCBsb2NhbGUgIyIgKyBpICsgIiBsYW5ndWFnZSBkb2VzIG5vdCBtYXRjaCIsCisgICAgICAgICAgICAgICAgICAgIGxsaXN0LmdldChpKS5nZXRMYW5ndWFnZSgpLCBscHJvdG9zW2ldLmxhbmd1YWdlKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiRXhwZWN0ZWQgbG9jYWxlICMiICsgaSArICIgY291bnRyeSBkb2VzIG5vdCBtYXRjaCIsCisgICAgICAgICAgICAgICAgICAgIGxsaXN0LmdldChpKS5nZXRDb3VudHJ5KCksIGxwcm90b3NbaV0uY291bnRyeSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIGxvY2FsZSAjIiArIGkgKyAiIHZhcmlhbnQgZG9lcyBub3QgbWF0Y2giLAorICAgICAgICAgICAgICAgICAgICBsbGlzdC5nZXQoaSkuZ2V0VmFyaWFudCgpLCBscHJvdG9zW2ldLnZhcmlhbnQpOworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscygiRXhwZWN0ZWQgc2NyZWVuIGxheW91dCBkb2VzIG5vdCBtYXRjaCIsCisgICAgICAgICAgICAgICAgY29uZmlnLnNjcmVlbkxheW91dCwgcmVzQ29uZmlnLmNvbmZpZ3VyYXRpb24uc2NyZWVuTGF5b3V0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCBjb2xvciBtb2RlIGRvZXMgbm90IG1hdGNoIiwKKyAgICAgICAgICAgICAgICBjb25maWcuY29sb3JNb2RlLCByZXNDb25maWcuY29uZmlndXJhdGlvbi5jb2xvck1vZGUpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIHRvdWNoc2NyZWVuIGRvZXMgbm90IG1hdGNoIiwKKyAgICAgICAgICAgICAgICBjb25maWcudG91Y2hzY3JlZW4sIHJlc0NvbmZpZy5jb25maWd1cmF0aW9uLnRvdWNoc2NyZWVuKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCBrZXlib2FyZCBkb2VzIG5vdCBtYXRjaCIsCisgICAgICAgICAgICAgICAgY29uZmlnLmtleWJvYXJkLCByZXNDb25maWcuY29uZmlndXJhdGlvbi5rZXlib2FyZCk7CisgICAgICAgIGFzc2VydEVxdWFscygiRXhwZWN0ZWQga2V5Ym9hcmQgaGlkZGVuIGRvZXMgbm90IG1hdGNoIiwKKyAgICAgICAgICAgICAgICBjb25maWcua2V5Ym9hcmRIaWRkZW4sIHJlc0NvbmZpZy5jb25maWd1cmF0aW9uLmtleWJvYXJkSGlkZGVuKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCBoYXJkIGtleWJvYXJkIGhpZGRlbiBkb2VzIG5vdCBtYXRjaCIsCisgICAgICAgICAgICAgICAgY29uZmlnLmhhcmRLZXlib2FyZEhpZGRlbiwgcmVzQ29uZmlnLmNvbmZpZ3VyYXRpb24uaGFyZEtleWJvYXJkSGlkZGVuKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCBuYXZpZ2F0aW9uIGRvZXMgbm90IG1hdGNoIiwKKyAgICAgICAgICAgICAgICBjb25maWcubmF2aWdhdGlvbiwgcmVzQ29uZmlnLmNvbmZpZ3VyYXRpb24ubmF2aWdhdGlvbik7CisgICAgICAgIGFzc2VydEVxdWFscygiRXhwZWN0ZWQgbmF2aWdhdGlvbiBoaWRkZW4gZG9lcyBub3QgbWF0Y2giLAorICAgICAgICAgICAgICAgIGNvbmZpZy5uYXZpZ2F0aW9uSGlkZGVuLCByZXNDb25maWcuY29uZmlndXJhdGlvbi5uYXZpZ2F0aW9uSGlkZGVuKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCBvcmllbnRhdGlvbiBkb2VzIG5vdCBtYXRjaCIsCisgICAgICAgICAgICAgICAgY29uZmlnLm9yaWVudGF0aW9uLCByZXNDb25maWcuY29uZmlndXJhdGlvbi5vcmllbnRhdGlvbik7CisgICAgICAgIGFzc2VydEVxdWFscygiRXhwZWN0ZWQgVUkgbW9kZSBkb2VzIG5vdCBtYXRjaCIsCisgICAgICAgICAgICAgICAgY29uZmlnLnVpTW9kZSwgcmVzQ29uZmlnLmNvbmZpZ3VyYXRpb24udWlNb2RlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCBzY3JlZW4gd2lkdGggZHAgZG9lcyBub3QgbWF0Y2giLAorICAgICAgICAgICAgICAgIGNvbmZpZy5zY3JlZW5XaWR0aERwLCByZXNDb25maWcuY29uZmlndXJhdGlvbi5zY3JlZW5XaWR0aERwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCBzY3JlZW4gaGlnaHQgZHAgZG9lcyBub3QgbWF0Y2giLAorICAgICAgICAgICAgICAgIGNvbmZpZy5zY3JlZW5IZWlnaHREcCwgcmVzQ29uZmlnLmNvbmZpZ3VyYXRpb24uc2NyZWVuSGVpZ2h0RHApOworICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIHNtYWxsZXN0IHNjcmVlbiB3aWR0aCBkcCBkb2VzIG5vdCBtYXRjaCIsCisgICAgICAgICAgICAgICAgY29uZmlnLnNtYWxsZXN0U2NyZWVuV2lkdGhEcCwgcmVzQ29uZmlnLmNvbmZpZ3VyYXRpb24uc21hbGxlc3RTY3JlZW5XaWR0aERwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCBkZW5zaXR5IGRwaSBkb2VzIG5vdCBtYXRjaCIsCisgICAgICAgICAgICAgICAgY29uZmlnLmRlbnNpdHlEcGksIHJlc0NvbmZpZy5jb25maWd1cmF0aW9uLmRlbnNpdHlEcGkpOworICAgICAgICAvLyBYWFggbm90IGNvbXBhcmluZyB3aW5kb3dDb25maWd1cmF0aW9uLCBzaW5jZSBieSBkZWZpbml0aW9uIHRoaXMgaXMgY29udGV4dHVhbC4KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tEZXZpY2VDb25maWcoRGlzcGxheU1hbmFnZXIgZG0sIERldmljZUNvbmZpZ3VyYXRpb25Qcm90byBkZXZpY2VDb25maWcpIHsKKyAgICAgICAgUG9pbnQgc3RhYmxlU2l6ZSA9IGRtLmdldFN0YWJsZURpc3BsYXlTaXplKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiRXhwZWN0ZWQgc3RhYmxlIHNjcmVlbiB3aWR0aCBkb2VzIG5vdCBtYXRjaCIsCisgICAgICAgICAgICAgICAgc3RhYmxlU2l6ZS54LCBkZXZpY2VDb25maWcuc3RhYmxlU2NyZWVuV2lkdGhQeCk7CisgICAgICAgIGFzc2VydEVxdWFscygiRXhwZWN0ZWQgc3RhYmxlIHNjcmVlbiBoZWlnaHQgZG9lcyBub3QgbWF0Y2giLAorICAgICAgICAgICAgICAgIHN0YWJsZVNpemUueSwgZGV2aWNlQ29uZmlnLnN0YWJsZVNjcmVlbkhlaWdodFB4KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCBzdGFibGUgc2NyZWVuIGRlbnNpdHkgZG9lcyBub3QgbWF0Y2giLAorICAgICAgICAgICAgICAgIERpc3BsYXlNZXRyaWNzLkRFTlNJVFlfREVWSUNFX1NUQUJMRSwgZGV2aWNlQ29uZmlnLnN0YWJsZURlbnNpdHlEcGkpOworCisgICAgICAgIGFzc2VydEVxdWFscygiRXhwZWN0ZWQgdG90YWwgUkFNIGRvZXMgbm90IG1hdGNoIiwKKyAgICAgICAgICAgICAgICBtQW0uZ2V0VG90YWxSYW0oKSwgZGV2aWNlQ29uZmlnLnRvdGFsUmFtKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCBsb3cgUkFNIGRvZXMgbm90IG1hdGNoIiwKKyAgICAgICAgICAgICAgICBtQW0uaXNMb3dSYW1EZXZpY2UoKSwgZGV2aWNlQ29uZmlnLmxvd1JhbSk7CisgICAgICAgIGFzc2VydEVxdWFscygiRXhwZWN0ZWQgbWF4IGNvcmVzIGRvZXMgbm90IG1hdGNoIiwKKyAgICAgICAgICAgICAgICBSdW50aW1lLmdldFJ1bnRpbWUoKS5hdmFpbGFibGVQcm9jZXNzb3JzKCksIGRldmljZUNvbmZpZy5tYXhDb3Jlcyk7CisgICAgICAgIEtleWd1YXJkTWFuYWdlciBrZ20gPSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKEtleWd1YXJkTWFuYWdlci5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiRXhwZWN0ZWQgaGFzIHNlY3VyZSBzY3JlZW4gbG9jayBkb2VzIG5vdCBtYXRjaCIsCisgICAgICAgICAgICAgICAga2dtLmlzRGV2aWNlU2VjdXJlKCksIGRldmljZUNvbmZpZy5oYXNTZWN1cmVTY3JlZW5Mb2NrKTsKKworICAgICAgICBDb25maWd1cmF0aW9uSW5mbyBjb25maWdJbmZvID0gbUFtLmdldERldmljZUNvbmZpZ3VyYXRpb25JbmZvKCk7CisgICAgICAgIGlmIChjb25maWdJbmZvLnJlcUdsRXNWZXJzaW9uICE9IENvbmZpZ3VyYXRpb25JbmZvLkdMX0VTX1ZFUlNJT05fVU5ERUZJTkVEKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIG9wZW5nbCB2ZXJzaW9uIGRvZXMgbm90IG1hdGNoIiwKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnSW5mby5yZXFHbEVzVmVyc2lvbiwgZGV2aWNlQ29uZmlnLm9wZW5nbFZlcnNpb24pOworICAgICAgICB9CisKKyAgICAgICAgU2V0PFN0cmluZz4gZ2xFeHRlbnNpb25zU2V0ID0gZ2V0R2xFeHRlbnNpb25zRnJvbURyaXZlcigpOworICAgICAgICBTdHJpbmdbXSBnbEV4dGVuc2lvbnMgPSBuZXcgU3RyaW5nW2dsRXh0ZW5zaW9uc1NldC5zaXplKCldOworICAgICAgICBnbEV4dGVuc2lvbnMgPSBnbEV4dGVuc2lvbnNTZXQudG9BcnJheShnbEV4dGVuc2lvbnMpOworICAgICAgICBBcnJheXMuc29ydChnbEV4dGVuc2lvbnMpOworICAgICAgICBhc3NlcnRBcnJheUVxdWFscygiRXhwZWN0ZWQgb3BlbmdsIGV4dGVuc2lvbnMgZG9lcyBub3QgbWF0Y2giLAorICAgICAgICAgICAgICAgIGdsRXh0ZW5zaW9ucywgZGV2aWNlQ29uZmlnLm9wZW5nbEV4dGVuc2lvbnMpOworCisgICAgICAgIExpc3Q8U2hhcmVkTGlicmFyeUluZm8+IHNsaWJzID0gbVBtLmdldFNoYXJlZExpYnJhcmllcygwKTsKKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydChzbGlicywgQ29tcGFyYXRvci5jb21wYXJpbmcoU2hhcmVkTGlicmFyeUluZm86OmdldE5hbWUpKTsKKyAgICAgICAgU3RyaW5nW10gc2xpYk5hbWVzID0gbmV3IFN0cmluZ1tzbGlicy5zaXplKCldOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNsaWJzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBzbGliTmFtZXNbaV0gPSBzbGlicy5nZXQoaSkuZ2V0TmFtZSgpOworICAgICAgICB9CisgICAgICAgIGFzc2VydEFycmF5RXF1YWxzKCJFeHBlY3RlZCBzaGFyZWQgbGlicmFyaWVzIGRvZXMgbm90IG1hdGNoIiwKKyAgICAgICAgICAgICAgICBzbGliTmFtZXMsIGRldmljZUNvbmZpZy5zaGFyZWRMaWJyYXJpZXMpOworCisgICAgICAgIEZlYXR1cmVJbmZvW10gZmVhdHVyZXMgPSBtUG0uZ2V0U3lzdGVtQXZhaWxhYmxlRmVhdHVyZXMoKTsKKyAgICAgICAgQXJyYXlzLnNvcnQoZmVhdHVyZXMsIChvMSwgbzIpIC0+IHsKKyAgICAgICAgICAgIGlmIChvMS5uYW1lID09IG8yLm5hbWUpIHJldHVybiAwOworICAgICAgICAgICAgaWYgKG8xLm5hbWUgPT0gbnVsbCkgcmV0dXJuIC0xOworICAgICAgICAgICAgaWYgKG8yLm5hbWUgPT0gbnVsbCkgcmV0dXJuIDE7CisgICAgICAgICAgICByZXR1cm4gbzEubmFtZS5jb21wYXJlVG8obzIubmFtZSk7CisgICAgICAgIH0pOworCisgICAgICAgIGludCBzaXplID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGZlYXR1cmVzW2ldLm5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNpemUrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBTdHJpbmdbXSBmZWF0dXJlTmFtZXMgPSBuZXcgU3RyaW5nW3NpemVdOworICAgICAgICBmb3IgKGludCBpID0gMCwgaiA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGZlYXR1cmVzW2ldLm5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZlYXR1cmVOYW1lc1tqXSA9IGZlYXR1cmVzW2ldLm5hbWU7CisgICAgICAgICAgICAgICAgaisrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFzc2VydEFycmF5RXF1YWxzKCJFeHBlY3RlZCBmZWF0dXJlcyBkb2VzIG5vdCBtYXRjaCIsCisgICAgICAgICAgICAgICAgZmVhdHVyZU5hbWVzLCBkZXZpY2VDb25maWcuZmVhdHVyZXMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERldmljZUNvbmZpZygpIHsKKyAgICAgICAgYnl0ZVtdIGR1bXAgPSBleGVjdXRlU2hlbGxDb21tYW5kKCJjbWQgYWN0aXZpdHkgZ2V0LWNvbmZpZyAtLXByb3RvIC0tZGV2aWNlIik7CisgICAgICAgIEdsb2JhbENvbmZpZ3VyYXRpb25Qcm90byBnbG9iYWxDb25maWc7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBnbG9iYWxDb25maWcgPSBHbG9iYWxDb25maWd1cmF0aW9uUHJvdG8ucGFyc2VGcm9tKGR1bXApOworICAgICAgICB9IGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJOYW5vRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRmFpbGVkIHRvIHBhcnNlIGdldC1jb25maWc6XG4iCisgICAgICAgICAgICAgICAgICAgICsgbmV3IFN0cmluZyhkdW1wLCBTdGFuZGFyZENoYXJzZXRzLlVURl84KSwgZXgpOworICAgICAgICB9CisKKyAgICAgICAgQ29uZmlndXJhdGlvbiBjb25maWcgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRDb25maWd1cmF0aW9uKCk7CisgICAgICAgIERpc3BsYXlNYW5hZ2VyIGRtID0gbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShEaXNwbGF5TWFuYWdlci5jbGFzcyk7CisgICAgICAgIERpc3BsYXkgZGlzcGxheSA9IGRtLmdldERpc3BsYXkoRGlzcGxheS5ERUZBVUxUX0RJU1BMQVkpOworICAgICAgICBEaXNwbGF5TWV0cmljcyBtZXRyaWNzID0gbmV3IERpc3BsYXlNZXRyaWNzKCk7CisgICAgICAgIGRpc3BsYXkuZ2V0TWV0cmljcyhtZXRyaWNzKTsKKworICAgICAgICBjaGVja1Jlc291cmNlQ29uZmlnKGNvbmZpZywgbWV0cmljcywgZ2xvYmFsQ29uZmlnLnJlc291cmNlcyk7CisgICAgICAgIGNoZWNrRGV2aWNlQ29uZmlnKGRtLCBnbG9iYWxDb25maWcuZGV2aWNlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlck1hbmlmZXN0TGF5b3V0VGVzdHMuamF2YSBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlNYW5hZ2VyTWFuaWZlc3RMYXlvdXRUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNWE0NDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlck1hbmlmZXN0TGF5b3V0VGVzdHMuamF2YQpAQCAtMCwwICsxLDIzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW07CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuV2luZG93Q29uZmlndXJhdGlvbi5XSU5ET1dJTkdfTU9ERV9GUkVFRk9STTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuV2luZG93Q29uZmlndXJhdGlvbi5XSU5ET1dJTkdfTU9ERV9TUExJVF9TQ1JFRU5fUFJJTUFSWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQWN0aXZpdHlBbmRXaW5kb3dNYW5hZ2Vyc1N0YXRlLmRwVG9QeDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50TmFtZVV0aWxzLmdldFdpbmRvd05hbWU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuQk9UVE9NX0xFRlRfTEFZT1VUX0FDVElWSVRZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLkJPVFRPTV9SSUdIVF9MQVlPVVRfQUNUSVZJVFk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuVEVTVF9BQ1RJVklUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5UT1BfTEVGVF9MQVlPVVRfQUNUSVZJVFk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuVE9QX1JJR0hUX0xBWU9VVF9BQ1RJVklUWTsKKworaW1wb3J0IHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMganVuaXQuZnJhbWV3b3JrLkFzc2VydC5hc3NlcnROb3ROdWxsOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3N1bWUuYXNzdW1lVHJ1ZTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKK2ltcG9ydCBhbmRyb2lkLnNlcnZlci5hbS5XaW5kb3dNYW5hZ2VyU3RhdGUuRGlzcGxheTsKK2ltcG9ydCBhbmRyb2lkLnNlcnZlci5hbS5XaW5kb3dNYW5hZ2VyU3RhdGUuV2luZG93U3RhdGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC51aWF1dG9tYXRvci5VaURldmljZTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKKy8qKgorICogQnVpbGQvSW5zdGFsbC9SdW46CisgKiAgICAgYXRlc3QgQ3RzQWN0aXZpdHlNYW5hZ2VyRGV2aWNlVGVzdENhc2VzOkFjdGl2aXR5TWFuYWdlck1hbmlmZXN0TGF5b3V0VGVzdHMKKyAqLworcHVibGljIGNsYXNzIEFjdGl2aXR5TWFuYWdlck1hbmlmZXN0TGF5b3V0VGVzdHMgZXh0ZW5kcyBBY3Rpdml0eU1hbmFnZXJUZXN0QmFzZSB7CisKKyAgICAvLyBUZXN0IHBhcmFtZXRlcnMKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9XSURUSF9EUCA9IDI0MDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9IRUlHSFRfRFAgPSAxNjA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgREVGQVVMVF9XSURUSF9GUkFDVElPTiA9IDAuNTBmOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IERFRkFVTFRfSEVJR0hUX0ZSQUNUSU9OID0gMC43MGY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1JTl9XSURUSF9EUCA9IDEwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUlOX0hFSUdIVF9EUCA9IDgwOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdSQVZJVFlfVkVSX0NFTlRFUiA9IDB4MDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdSQVZJVFlfVkVSX1RPUCAgICA9IDB4MDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdSQVZJVFlfVkVSX0JPVFRPTSA9IDB4MDQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdSQVZJVFlfSE9SX0NFTlRFUiA9IDB4MTA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdSQVZJVFlfSE9SX0xFRlQgICA9IDB4MjA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdSQVZJVFlfSE9SX1JJR0hUICA9IDB4NDA7CisKKyAgICBwcml2YXRlIERpc3BsYXkgbURpc3BsYXk7CisgICAgcHJpdmF0ZSBXaW5kb3dTdGF0ZSBtV2luZG93U3RhdGU7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHcmF2aXR5QW5kRGVmYXVsdFNpemVUb3BMZWZ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RMYXlvdXQoR1JBVklUWV9WRVJfVE9QLCBHUkFWSVRZX0hPUl9MRUZULCBmYWxzZSAvKmZyYWN0aW9uKi8pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdyYXZpdHlBbmREZWZhdWx0U2l6ZVRvcFJpZ2h0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RMYXlvdXQoR1JBVklUWV9WRVJfVE9QLCBHUkFWSVRZX0hPUl9SSUdIVCwgdHJ1ZSAvKmZyYWN0aW9uKi8pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdyYXZpdHlBbmREZWZhdWx0U2l6ZUJvdHRvbUxlZnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdExheW91dChHUkFWSVRZX1ZFUl9CT1RUT00sIEdSQVZJVFlfSE9SX0xFRlQsIHRydWUgLypmcmFjdGlvbiovKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHcmF2aXR5QW5kRGVmYXVsdFNpemVCb3R0b21SaWdodCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0TGF5b3V0KEdSQVZJVFlfVkVSX0JPVFRPTSwgR1JBVklUWV9IT1JfUklHSFQsIGZhbHNlIC8qZnJhY3Rpb24qLyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWluaW1hbFNpemVGcmVlZm9ybSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3N1bWVUcnVlKCJTa2lwcGluZyB0ZXN0OiBubyBmcmVlZm9ybSBzdXBwb3J0Iiwgc3VwcG9ydHNGcmVlZm9ybSgpKTsKKworICAgICAgICB0ZXN0TWluaW1hbFNpemUoV0lORE9XSU5HX01PREVfRlJFRUZPUk0pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1pbmltYWxTaXplRG9ja2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc3VtZVRydWUoIlNraXBwaW5nIHRlc3Q6IG5vIG11bHRpLXdpbmRvdyBzdXBwb3J0Iiwgc3VwcG9ydHNTcGxpdFNjcmVlbk11bHRpV2luZG93KCkpOworCisgICAgICAgIC8vIFdlIGFyZSBhbGxvd2VkIHRvIHNldCBkZXZpY2UgZGVuc2l0eSB0byBhbnl0aGluZyBkaWZmZXJlbnQgdGhhbiBkZWZhdWx0LAorICAgICAgICAvLyBob3dldmVyLCB0aGUgd2F5IHdlIHJlYWxpemUgaXMgdG8gc2V0IGEgbmV3IHByb3BlcnR5IHRvIG92ZXJsYXkgaXQsCisgICAgICAgIC8vIHNvIG1EaXNwbGF5LmdldERwaSgpIGNhbm5vdCBnZXQgb3VyIHJlYWwgZGVuc2l0eSwgbm93IHdlIHdpbGwgcnVuIGNvbW1hbmQKKyAgICAgICAgLy8gYXV0b21hdGljYWxseSBzd2l0Y2ggdG8gbmF0aXZlIGRlbnNpdHkgYmVmb3JlIHRoZSB0ZXN0IGV4Y2VjdXRlcyBhbmQgcmVzdG9yZSBsYXRlci4KKyAgICAgICAgVWlEZXZpY2UgdWlEZXZpY2UgPSBVaURldmljZS5nZXRJbnN0YW5jZShJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKSk7CisgICAgICAgIGludCBkZW5zaXR5ID0gMDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICBkZW5zaXR5ID0gcmVzZXREZW5zaXR5SWZOZWVkZWQodWlEZXZpY2UpOworCisgICAgICAgICAgICAgdGVzdE1pbmltYWxTaXplKFdJTkRPV0lOR19NT0RFX1NQTElUX1NDUkVFTl9QUklNQVJZKTsKKworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgIHJlc3RvcmVEZW5zaXR5SWZOZWVkZWQodWlEZXZpY2UsIGRlbnNpdHkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgcmVzZXREZW5zaXR5SWZOZWVkZWQoVWlEZXZpY2UgZGV2aWNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIG91dHB1dCA9IGRldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKCJ3bSBkZW5zaXR5Iik7CisgICAgICAgICBmaW5hbCBQYXR0ZXJuIHAgPSBQYXR0ZXJuLmNvbXBpbGUoIk92ZXJyaWRlIGRlbnNpdHk6IChcXGQrKSIpOworICAgICAgICAgZmluYWwgTWF0Y2hlciBtID0gcC5tYXRjaGVyKG91dHB1dCk7CisgICAgICAgICBpZiAobS5maW5kKCkpIHsKKyAgICAgICAgICAgICBkZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZCgid20gZGVuc2l0eSByZXNldCIpOworICAgICAgICAgICAgIGludCByZXN0b3JlRGVuc2l0eSA9IEludGVnZXIucGFyc2VJbnQobS5ncm91cCgxKSk7CisgICAgICAgICAgICAgcmV0dXJuIHJlc3RvcmVEZW5zaXR5OworICAgICAgICAgfQorICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZXN0b3JlRGVuc2l0eUlmTmVlZGVkKFVpRGV2aWNlIGRldmljZSwgaW50IHJlc3RvcmVEZW5zaXR5KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHJlc3RvcmVEZW5zaXR5ID4gMCkgeworICAgICAgICAgICAgZGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoIndtIGRlbnNpdHkgIiArIHJlc3RvcmVEZW5zaXR5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0TWluaW1hbFNpemUoaW50IHdpbmRvd2luZ01vZGUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBJc3N1ZSBjb21tYW5kIHRvIHJlc2l6ZSB0byA8MCwwLDEsMT4uIFdlIGV4cGVjdCB0aGUgc2l6ZSB0byBiZSBmbG9vcmVkIGF0CisgICAgICAgIC8vIE1JTl9XSURUSF9EUHhNSU5fSEVJR0hUX0RQLgorICAgICAgICBpZiAod2luZG93aW5nTW9kZSA9PSBXSU5ET1dJTkdfTU9ERV9GUkVFRk9STSkgeworICAgICAgICAgICAgbGF1bmNoQWN0aXZpdHkoQk9UVE9NX1JJR0hUX0xBWU9VVF9BQ1RJVklUWSwgV0lORE9XSU5HX01PREVfRlJFRUZPUk0pOworICAgICAgICAgICAgcmVzaXplQWN0aXZpdHlUYXNrKEJPVFRPTV9SSUdIVF9MQVlPVVRfQUNUSVZJVFksIDAsIDAsIDEsIDEpOworICAgICAgICB9IGVsc2UgeyAvLyBzdGFja0lkID09IERPQ0tFRF9TVEFDS19JRAorICAgICAgICAgICAgbGF1bmNoQWN0aXZpdGllc0luU3BsaXRTY3JlZW4oCisgICAgICAgICAgICAgICAgICAgIGdldExhdW5jaEFjdGl2aXR5QnVpbGRlcigpLnNldFRhcmdldEFjdGl2aXR5KEJPVFRPTV9SSUdIVF9MQVlPVVRfQUNUSVZJVFkpLAorICAgICAgICAgICAgICAgICAgICBnZXRMYXVuY2hBY3Rpdml0eUJ1aWxkZXIoKS5zZXRUYXJnZXRBY3Rpdml0eShURVNUX0FDVElWSVRZKSk7CisgICAgICAgICAgICByZXNpemVEb2NrZWRTdGFjaygxLCAxLCAxLCAxKTsKKyAgICAgICAgfQorICAgICAgICBnZXREaXNwbGF5QW5kV2luZG93U3RhdGUoQk9UVE9NX1JJR0hUX0xBWU9VVF9BQ1RJVklUWSwgZmFsc2UpOworCisgICAgICAgIGZpbmFsIGludCBtaW5XaWR0aCA9IGRwVG9QeChNSU5fV0lEVEhfRFAsIG1EaXNwbGF5LmdldERwaSgpKTsKKyAgICAgICAgZmluYWwgaW50IG1pbkhlaWdodCA9IGRwVG9QeChNSU5fSEVJR0hUX0RQLCBtRGlzcGxheS5nZXREcGkoKSk7CisgICAgICAgIGZpbmFsIFJlY3QgY29udGFpbmluZ1JlY3QgPSBtV2luZG93U3RhdGUuZ2V0Q29udGFpbmluZ0ZyYW1lKCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJNaW4gd2lkdGggaXMgaW5jb3JyZWN0IiwgbWluV2lkdGgsIGNvbnRhaW5pbmdSZWN0LndpZHRoKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIk1pbiBoZWlnaHQgaXMgaW5jb3JyZWN0IiwgbWluSGVpZ2h0LCBjb250YWluaW5nUmVjdC5oZWlnaHQoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RMYXlvdXQoCisgICAgICAgICAgICBpbnQgdkdyYXZpdHksIGludCBoR3Jhdml0eSwgYm9vbGVhbiBmcmFjdGlvbikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc3VtZVRydWUoIlNraXBwaW5nIHRlc3Q6IG5vIGZyZWVmb3JtIHN1cHBvcnQiLCBzdXBwb3J0c0ZyZWVmb3JtKCkpOworCisgICAgICAgIGZpbmFsIENvbXBvbmVudE5hbWUgYWN0aXZpdHlOYW1lOworICAgICAgICBpZiAodkdyYXZpdHkgPT0gR1JBVklUWV9WRVJfVE9QKSB7CisgICAgICAgICAgICBhY3Rpdml0eU5hbWUgPSAoaEdyYXZpdHkgPT0gR1JBVklUWV9IT1JfTEVGVCkgPyBUT1BfTEVGVF9MQVlPVVRfQUNUSVZJVFkKKyAgICAgICAgICAgICAgICAgICAgOiBUT1BfUklHSFRfTEFZT1VUX0FDVElWSVRZOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWN0aXZpdHlOYW1lID0gKGhHcmF2aXR5ID09IEdSQVZJVFlfSE9SX0xFRlQpID8gQk9UVE9NX0xFRlRfTEFZT1VUX0FDVElWSVRZCisgICAgICAgICAgICAgICAgICAgIDogQk9UVE9NX1JJR0hUX0xBWU9VVF9BQ1RJVklUWTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIExhdW5jaCBpbiBmcmVlZm9ybSBzdGFjaworICAgICAgICBsYXVuY2hBY3Rpdml0eShhY3Rpdml0eU5hbWUsIFdJTkRPV0lOR19NT0RFX0ZSRUVGT1JNKTsKKworICAgICAgICBnZXREaXNwbGF5QW5kV2luZG93U3RhdGUoYWN0aXZpdHlOYW1lLCB0cnVlKTsKKworICAgICAgICBmaW5hbCBSZWN0IGNvbnRhaW5pbmdSZWN0ID0gbVdpbmRvd1N0YXRlLmdldENvbnRhaW5pbmdGcmFtZSgpOworICAgICAgICBmaW5hbCBSZWN0IGFwcFJlY3QgPSBtRGlzcGxheS5nZXRBcHBSZWN0KCk7CisgICAgICAgIGZpbmFsIGludCBleHBlY3RlZFdpZHRoUHgsIGV4cGVjdGVkSGVpZ2h0UHg7CisgICAgICAgIC8vIEV2YWx1YXRlIHRoZSBleHBlY3RlZCB3aW5kb3cgc2l6ZSBpbiBweC4gSWYgd2UncmUgdXNpbmcgZnJhY3Rpb24gZGltZW5zaW9ucywKKyAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSBzaXplIGJhc2VkIG9uIHRoZSBhcHAgcmVjdCBzaXplLiBPdGhlcndpc2UsIGNvbnZlcnQgdGhlIGV4cGVjdGVkCisgICAgICAgIC8vIHNpemUgaW4gZHAgdG8gcHguCisgICAgICAgIGlmIChmcmFjdGlvbikgeworICAgICAgICAgICAgZXhwZWN0ZWRXaWR0aFB4ID0gKGludCkgKGFwcFJlY3Qud2lkdGgoKSAqIERFRkFVTFRfV0lEVEhfRlJBQ1RJT04pOworICAgICAgICAgICAgZXhwZWN0ZWRIZWlnaHRQeCA9IChpbnQpIChhcHBSZWN0LmhlaWdodCgpICogREVGQVVMVF9IRUlHSFRfRlJBQ1RJT04pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmluYWwgaW50IGRlbnNpdHlEcGkgPSBtRGlzcGxheS5nZXREcGkoKTsKKyAgICAgICAgICAgIGV4cGVjdGVkV2lkdGhQeCA9IGRwVG9QeChERUZBVUxUX1dJRFRIX0RQLCBkZW5zaXR5RHBpKTsKKyAgICAgICAgICAgIGV4cGVjdGVkSGVpZ2h0UHggPSBkcFRvUHgoREVGQVVMVF9IRUlHSFRfRFAsIGRlbnNpdHlEcGkpOworICAgICAgICB9CisKKyAgICAgICAgdmVyaWZ5RnJhbWVTaXplQW5kUG9zaXRpb24oCisgICAgICAgICAgICAgICAgdkdyYXZpdHksIGhHcmF2aXR5LCBleHBlY3RlZFdpZHRoUHgsIGV4cGVjdGVkSGVpZ2h0UHgsIGNvbnRhaW5pbmdSZWN0LCBhcHBSZWN0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZ2V0RGlzcGxheUFuZFdpbmRvd1N0YXRlKENvbXBvbmVudE5hbWUgYWN0aXZpdHlOYW1lLCBib29sZWFuIGNoZWNrRm9jdXMpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHdpbmRvd05hbWUgPSBnZXRXaW5kb3dOYW1lKGFjdGl2aXR5TmFtZSk7CisKKyAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUoYWN0aXZpdHlOYW1lKTsKKworICAgICAgICBpZiAoY2hlY2tGb2N1cykgeworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkV2luZG93KCJUZXN0IHdpbmRvdyBtdXN0IGJlIHRoZSBmcm9udCB3aW5kb3cuIiwgd2luZG93TmFtZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoYWN0aXZpdHlOYW1lLCB0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIExpc3Q8V2luZG93U3RhdGU+IHdpbmRvd0xpc3QgPQorICAgICAgICAgICAgICAgIG1BbVdtU3RhdGUuZ2V0V21TdGF0ZSgpLmdldE1hdGNoaW5nVmlzaWJsZVdpbmRvd1N0YXRlKHdpbmRvd05hbWUpOworCisgICAgICAgIGFzc2VydEVxdWFscygiU2hvdWxkIGhhdmUgZXhhY3RseSBvbmUgd2luZG93IHN0YXRlIGZvciB0aGUgYWN0aXZpdHkuIiwKKyAgICAgICAgICAgICAgICAxLCB3aW5kb3dMaXN0LnNpemUoKSk7CisKKyAgICAgICAgbVdpbmRvd1N0YXRlID0gd2luZG93TGlzdC5nZXQoMCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoIlNob3VsZCBoYXZlIGEgdmFsaWQgd2luZG93IiwgbVdpbmRvd1N0YXRlKTsKKworICAgICAgICBtRGlzcGxheSA9IG1BbVdtU3RhdGUuZ2V0V21TdGF0ZSgpLmdldERpc3BsYXkobVdpbmRvd1N0YXRlLmdldERpc3BsYXlJZCgpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiU2hvdWxkIGJlIG9uIGEgZGlzcGxheSIsIG1EaXNwbGF5KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5RnJhbWVTaXplQW5kUG9zaXRpb24oCisgICAgICAgICAgICBpbnQgdkdyYXZpdHksIGludCBoR3Jhdml0eSwgaW50IGV4cGVjdGVkV2lkdGhQeCwgaW50IGV4cGVjdGVkSGVpZ2h0UHgsCisgICAgICAgICAgICBSZWN0IGNvbnRhaW5pbmdGcmFtZSwgUmVjdCBwYXJlbnRGcmFtZSkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIldpZHRoIGlzIGluY29ycmVjdCIsIGV4cGVjdGVkV2lkdGhQeCwgY29udGFpbmluZ0ZyYW1lLndpZHRoKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkhlaWdodCBpcyBpbmNvcnJlY3QiLCBleHBlY3RlZEhlaWdodFB4LCBjb250YWluaW5nRnJhbWUuaGVpZ2h0KCkpOworCisgICAgICAgIGlmICh2R3Jhdml0eSA9PSBHUkFWSVRZX1ZFUl9UT1ApIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiU2hvdWxkIGJlIG9uIHRoZSB0b3AiLCBwYXJlbnRGcmFtZS50b3AsIGNvbnRhaW5pbmdGcmFtZS50b3ApOworICAgICAgICB9IGVsc2UgaWYgKHZHcmF2aXR5ID09IEdSQVZJVFlfVkVSX0JPVFRPTSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJTaG91bGQgYmUgb24gdGhlIGJvdHRvbSIsIHBhcmVudEZyYW1lLmJvdHRvbSwgY29udGFpbmluZ0ZyYW1lLmJvdHRvbSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaEdyYXZpdHkgPT0gR1JBVklUWV9IT1JfTEVGVCkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJTaG91bGQgYmUgb24gdGhlIGxlZnQiLCBwYXJlbnRGcmFtZS5sZWZ0LCBjb250YWluaW5nRnJhbWUubGVmdCk7CisgICAgICAgIH0gZWxzZSBpZiAoaEdyYXZpdHkgPT0gR1JBVklUWV9IT1JfUklHSFQpeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJTaG91bGQgYmUgb24gdGhlIHJpZ2h0IiwgcGFyZW50RnJhbWUucmlnaHQsIGNvbnRhaW5pbmdGcmFtZS5yaWdodCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlck11bHRpRGlzcGxheVRlc3RzLmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlck11bHRpRGlzcGxheVRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM0MmE1YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlNYW5hZ2VyTXVsdGlEaXNwbGF5VGVzdHMuamF2YQpAQCAtMCwwICsxLDE4NDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW07CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuV2luZG93Q29uZmlndXJhdGlvbi5BQ1RJVklUWV9UWVBFX1NUQU5EQVJEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5XaW5kb3dDb25maWd1cmF0aW9uLldJTkRPV0lOR19NT0RFX1NQTElUX1NDUkVFTl9QUklNQVJZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5XaW5kb3dDb25maWd1cmF0aW9uLldJTkRPV0lOR19NT0RFX1NQTElUX1NDUkVFTl9TRUNPTkRBUlk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkFjdGl2aXR5TGF1bmNoZXIuS0VZX0xBVU5DSF9BQ1RJVklUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQWN0aXZpdHlMYXVuY2hlci5LRVlfTkVXX1RBU0s7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkFjdGl2aXR5TGF1bmNoZXIuS0VZX1RBUkdFVF9DT01QT05FTlQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkFjdGl2aXR5TWFuYWdlckRpc3BsYXlUZXN0QmFzZS5SZXBvcnRlZERpc3BsYXlNZXRyaWNzLmdldERpc3BsYXlNZXRyaWNzOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5BY3Rpdml0eU1hbmFnZXJTdGF0ZS5TVEFURV9SRVNVTUVEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5BY3Rpdml0eU1hbmFnZXJTdGF0ZS5TVEFURV9TVE9QUEVEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnROYW1lVXRpbHMuZ2V0QWN0aXZpdHlOYW1lOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnROYW1lVXRpbHMuZ2V0V2luZG93TmFtZTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5BTFRfTEFVTkNISU5HX0FDVElWSVRZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLkJST0FEQ0FTVF9SRUNFSVZFUl9BQ1RJVklUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5Ccm9hZGNhc3RSZWNlaXZlckFjdGl2aXR5LkFDVElPTl9UUklHR0VSX0JST0FEQ0FTVDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5MQVVOQ0hJTkdfQUNUSVZJVFk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuTEFVTkNIX0JST0FEQ0FTVF9BQ1RJT047CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuTEFVTkNIX0JST0FEQ0FTVF9SRUNFSVZFUjsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5OT05fUkVTSVpFQUJMRV9BQ1RJVklUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5SRVNJWkVBQkxFX0FDVElWSVRZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLlNIT1dfV0hFTl9MT0NLRURfQVRUUl9BQ1RJVklUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5URVNUX0FDVElWSVRZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLlZJUlRVQUxfRElTUExBWV9BQ1RJVklUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uU3RhdGVMb2dnZXIubG9nQWx3YXlzOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5TdGF0ZUxvZ2dlci5sb2dFOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5VaURldmljZVV0aWxzLnByZXNzU2xlZXBCdXR0b247CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLlVpRGV2aWNlVXRpbHMucHJlc3NXYWtldXBCdXR0b247CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLnNlY29uZC5Db21wb25lbnRzLlNFQ09ORF9BQ1RJVklUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uc2Vjb25kLkNvbXBvbmVudHMuU0VDT05EX0xBVU5DSF9CUk9BRENBU1RfQUNUSU9OOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5zZWNvbmQuQ29tcG9uZW50cy5TRUNPTkRfTEFVTkNIX0JST0FEQ0FTVF9SRUNFSVZFUjsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uc2Vjb25kLkNvbXBvbmVudHMuU0VDT05EX05PX0VNQkVERElOR19BQ1RJVklUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0udGhpcmQuQ29tcG9uZW50cy5USElSRF9BQ1RJVklUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LkRpc3BsYXkuREVGQVVMVF9ESVNQTEFZOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3N1bWUuYXNzdW1lVHJ1ZTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlByZXN1Ym1pdDsKK2ltcG9ydCBhbmRyb2lkLnNlcnZlci5hbS5BY3Rpdml0eU1hbmFnZXJTdGF0ZS5BY3Rpdml0eURpc3BsYXk7CisKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5GbGFreVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKKy8qKgorICogQnVpbGQvSW5zdGFsbC9SdW46CisgKiAgICAgYXRlc3QgQ3RzQWN0aXZpdHlNYW5hZ2VyRGV2aWNlVGVzdENhc2VzOkFjdGl2aXR5TWFuYWdlck11bHRpRGlzcGxheVRlc3RzCisgKi8KK0BQcmVzdWJtaXQKK0BGbGFreVRlc3QoYnVnSWQgPSA3NzY1MjI2MSkKK3B1YmxpYyBjbGFzcyBBY3Rpdml0eU1hbmFnZXJNdWx0aURpc3BsYXlUZXN0cyBleHRlbmRzIEFjdGl2aXR5TWFuYWdlckRpc3BsYXlUZXN0QmFzZSB7CisKKyAgICAvLyBUT0RPKGIvNzAyNDcwNTgpOiBVc2Uge0BsaW5rIENvbnRleHQjc2VuZEJyb2FkY2FzdChJbnRlbnQpLgorICAgIC8vIFNoZWxsIGNvbW1hbmQgdG8gbGF1bmNoIGFjdGl2aXR5IHZpYSB7QGxpbmsgI0JST0FEQ0FTVF9SRUNFSVZFUl9BQ1RJVklUWX0uCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBVU5DSF9BQ1RJVklUWV9CUk9BRENBU1QgPSAiYW0gYnJvYWRjYXN0IC1hICIKKyAgICAgICAgICAgICsgQUNUSU9OX1RSSUdHRVJfQlJPQURDQVNUICsgIiAtLWV6ICIgKyBLRVlfTEFVTkNIX0FDVElWSVRZICsgIiB0cnVlIC0tZXogIgorICAgICAgICAgICAgKyBLRVlfTkVXX1RBU0sgKyAiIHRydWUgLS1lcyAiICsgS0VZX1RBUkdFVF9DT01QT05FTlQgKyAiICI7CisKKyAgICBAQmVmb3JlCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKworICAgICAgICBhc3N1bWVUcnVlKHN1cHBvcnRzTXVsdGlEaXNwbGF5KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIGxhdW5jaGluZyBhbiBhY3Rpdml0eSBvbiB2aXJ0dWFsIGRpc3BsYXkuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGF1bmNoQWN0aXZpdHlPblNlY29uZGFyeURpc3BsYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IChmaW5hbCBWaXJ0dWFsRGlzcGxheVNlc3Npb24gdmlydHVhbERpc3BsYXlTZXNzaW9uID0gbmV3IFZpcnR1YWxEaXNwbGF5U2Vzc2lvbigpKSB7CisgICAgICAgICAgICAvLyBDcmVhdGUgbmV3IHZpcnR1YWwgZGlzcGxheS4KKyAgICAgICAgICAgIGZpbmFsIEFjdGl2aXR5RGlzcGxheSBuZXdEaXNwbGF5ID0gdmlydHVhbERpc3BsYXlTZXNzaW9uLmNyZWF0ZURpc3BsYXkoKTsKKworICAgICAgICAgICAgLy8gTGF1bmNoIGFjdGl2aXR5IG9uIG5ldyBzZWNvbmRhcnkgZGlzcGxheS4KKyAgICAgICAgICAgIGZpbmFsIExvZ1NlcGFyYXRvciBsb2dTZXBhcmF0b3IgPSBzZXBhcmF0ZUxvZ3MoKTsKKyAgICAgICAgICAgIGxhdW5jaEFjdGl2aXR5T25EaXNwbGF5KFRFU1RfQUNUSVZJVFksIG5ld0Rpc3BsYXkubUlkKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKFRFU1RfQUNUSVZJVFkpOworCisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRBY3Rpdml0eSgKKyAgICAgICAgICAgICAgICAgICAgIkFjdGl2aXR5IGxhdW5jaGVkIG9uIHNlY29uZGFyeSBkaXNwbGF5IG11c3QgYmUgZm9jdXNlZCIsCisgICAgICAgICAgICAgICAgICAgIFRFU1RfQUNUSVZJVFkpOworCisgICAgICAgICAgICAvLyBDaGVjayB0aGF0IGFjdGl2aXR5IGlzIG9uIHRoZSByaWdodCBkaXNwbGF5LgorICAgICAgICAgICAgZmluYWwgaW50IGZyb250U3RhY2tJZCA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEZyb250U3RhY2tJZChuZXdEaXNwbGF5Lm1JZCk7CisgICAgICAgICAgICBmaW5hbCBBY3Rpdml0eU1hbmFnZXJTdGF0ZS5BY3Rpdml0eVN0YWNrIGZyb250U3RhY2sgPQorICAgICAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja0J5SWQoZnJvbnRTdGFja0lkKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiTGF1bmNoZWQgYWN0aXZpdHkgbXVzdCBiZSBvbiB0aGUgc2Vjb25kYXJ5IGRpc3BsYXkgYW5kIHJlc3VtZWQiLAorICAgICAgICAgICAgICAgICAgICBnZXRBY3Rpdml0eU5hbWUoVEVTVF9BQ1RJVklUWSksIGZyb250U3RhY2subVJlc3VtZWRBY3Rpdml0eSk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRTdGFjaygiRm9jdXMgbXVzdCBiZSBvbiBzZWNvbmRhcnkgZGlzcGxheSIsIGZyb250U3RhY2tJZCk7CisKKyAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgYWN0aXZpdHkgY29uZmlnIGNvcnJlc3BvbmRzIHRvIGRpc3BsYXkgY29uZmlnLgorICAgICAgICAgICAgZmluYWwgUmVwb3J0ZWRTaXplcyByZXBvcnRlZFNpemVzID0gZ2V0TGFzdFJlcG9ydGVkU2l6ZXNGb3JBY3Rpdml0eShURVNUX0FDVElWSVRZLAorICAgICAgICAgICAgICAgICAgICBsb2dTZXBhcmF0b3IpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJBY3Rpdml0eSBsYXVuY2hlZCBvbiBzZWNvbmRhcnkgZGlzcGxheSBtdXN0IGhhdmUgcHJvcGVyIGNvbmZpZ3VyYXRpb24iLAorICAgICAgICAgICAgICAgICAgICBDVVNUT01fREVOU0lUWV9EUEksIHJlcG9ydGVkU2l6ZXMuZGVuc2l0eURwaSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBsYXVuY2hpbmcgYW4gYWN0aXZpdHkgb24gcHJpbWFyeSBkaXNwbGF5IGV4cGxpY2l0bHkuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGF1bmNoQWN0aXZpdHlPblByaW1hcnlEaXNwbGF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIExhdW5jaCBhY3Rpdml0eSBvbiBwcmltYXJ5IGRpc3BsYXkgZXhwbGljaXRseS4KKyAgICAgICAgbGF1bmNoQWN0aXZpdHlPbkRpc3BsYXkoTEFVTkNISU5HX0FDVElWSVRZLCAwKTsKKyAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUoTEFVTkNISU5HX0FDVElWSVRZKTsKKworICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRBY3Rpdml0eSgiQWN0aXZpdHkgbGF1bmNoZWQgb24gcHJpbWFyeSBkaXNwbGF5IG11c3QgYmUgZm9jdXNlZCIsCisgICAgICAgICAgICAgICAgTEFVTkNISU5HX0FDVElWSVRZKTsKKworICAgICAgICAvLyBDaGVjayB0aGF0IGFjdGl2aXR5IGlzIG9uIHRoZSByaWdodCBkaXNwbGF5LgorICAgICAgICBpbnQgZnJvbnRTdGFja0lkID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0RnJvbnRTdGFja0lkKDAgLyogZGlzcGxheUlkICovKTsKKyAgICAgICAgQWN0aXZpdHlNYW5hZ2VyU3RhdGUuQWN0aXZpdHlTdGFjayBmcm9udFN0YWNrCisgICAgICAgICAgICAgICAgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja0J5SWQoZnJvbnRTdGFja0lkKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJMYXVuY2hlZCBhY3Rpdml0eSBtdXN0IGJlIG9uIHRoZSBwcmltYXJ5IGRpc3BsYXkgYW5kIHJlc3VtZWQiLAorICAgICAgICAgICAgICAgIGdldEFjdGl2aXR5TmFtZShMQVVOQ0hJTkdfQUNUSVZJVFkpLCBmcm9udFN0YWNrLm1SZXN1bWVkQWN0aXZpdHkpOworICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRTdGFjaygiRm9jdXMgbXVzdCBiZSBvbiBwcmltYXJ5IGRpc3BsYXkiLCBmcm9udFN0YWNrSWQpOworCisgICAgICAgIC8vIExhdW5jaCBhbm90aGVyIGFjdGl2aXR5IG9uIHByaW1hcnkgZGlzcGxheSB1c2luZyB0aGUgZmlyc3Qgb25lCisgICAgICAgIGdldExhdW5jaEFjdGl2aXR5QnVpbGRlcigpLnNldFRhcmdldEFjdGl2aXR5KFRFU1RfQUNUSVZJVFkpLnNldE5ld1Rhc2sodHJ1ZSkKKyAgICAgICAgICAgICAgICAuc2V0TXVsdGlwbGVUYXNrKHRydWUpLnNldERpc3BsYXlJZCgwKS5leGVjdXRlKCk7CisgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKFRFU1RfQUNUSVZJVFkpOworCisgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZEFjdGl2aXR5KCJBY3Rpdml0eSBsYXVuY2hlZCBvbiBwcmltYXJ5IGRpc3BsYXkgbXVzdCBiZSBmb2N1c2VkIiwKKyAgICAgICAgICAgICAgICBURVNUX0FDVElWSVRZKTsKKworICAgICAgICAvLyBDaGVjayB0aGF0IGFjdGl2aXR5IGlzIG9uIHRoZSByaWdodCBkaXNwbGF5LgorICAgICAgICBmcm9udFN0YWNrSWQgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRGcm9udFN0YWNrSWQoMCAvKiBkaXNwbGF5SWQgKi8pOworICAgICAgICBmcm9udFN0YWNrID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0U3RhY2tCeUlkKGZyb250U3RhY2tJZCk7CisgICAgICAgIGFzc2VydEVxdWFscygiTGF1bmNoZWQgYWN0aXZpdHkgbXVzdCBiZSBvbiB0aGUgcHJpbWFyeSBkaXNwbGF5IGFuZCByZXN1bWVkIiwKKyAgICAgICAgICAgICAgICBnZXRBY3Rpdml0eU5hbWUoVEVTVF9BQ1RJVklUWSksIGZyb250U3RhY2subVJlc3VtZWRBY3Rpdml0eSk7CisgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZFN0YWNrKCJGb2N1cyBtdXN0IGJlIG9uIHByaW1hcnkgZGlzcGxheSIsIGZyb250U3RhY2tJZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgbGF1bmNoaW5nIGEgbm9uLXJlc2l6ZWFibGUgYWN0aXZpdHkgb24gdmlydHVhbCBkaXNwbGF5LiBJdCBzaG91bGQgbGFuZCBvbiB0aGUKKyAgICAgKiBkZWZhdWx0IGRpc3BsYXkuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGF1bmNoTm9uUmVzaXplYWJsZUFjdGl2aXR5T25TZWNvbmRhcnlEaXNwbGF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSAoZmluYWwgVmlydHVhbERpc3BsYXlTZXNzaW9uIHZpcnR1YWxEaXNwbGF5U2Vzc2lvbiA9IG5ldyBWaXJ0dWFsRGlzcGxheVNlc3Npb24oKSkgeworICAgICAgICAgICAgLy8gQ3JlYXRlIG5ldyB2aXJ0dWFsIGRpc3BsYXkuCisgICAgICAgICAgICBmaW5hbCBBY3Rpdml0eURpc3BsYXkgbmV3RGlzcGxheSA9IHZpcnR1YWxEaXNwbGF5U2Vzc2lvbi5jcmVhdGVEaXNwbGF5KCk7CisKKyAgICAgICAgICAgIC8vIExhdW5jaCBhY3Rpdml0eSBvbiBuZXcgc2Vjb25kYXJ5IGRpc3BsYXkuCisgICAgICAgICAgICBsYXVuY2hBY3Rpdml0eU9uRGlzcGxheShOT05fUkVTSVpFQUJMRV9BQ1RJVklUWSwgbmV3RGlzcGxheS5tSWQpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUoTk9OX1JFU0laRUFCTEVfQUNUSVZJVFkpOworCisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRBY3Rpdml0eSgKKyAgICAgICAgICAgICAgICAgICAgIkFjdGl2aXR5IGxhdW5jaGVkIG9uIHNlY29uZGFyeSBkaXNwbGF5IG11c3QgYmUgZm9jdXNlZCIsCisgICAgICAgICAgICAgICAgICAgIE5PTl9SRVNJWkVBQkxFX0FDVElWSVRZKTsKKworICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCBhY3Rpdml0eSBpcyBvbiB0aGUgcmlnaHQgZGlzcGxheS4KKyAgICAgICAgICAgIGZpbmFsIGludCBmcm9udFN0YWNrSWQgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRGcm9udFN0YWNrSWQoREVGQVVMVF9ESVNQTEFZKTsKKyAgICAgICAgICAgIGZpbmFsIEFjdGl2aXR5TWFuYWdlclN0YXRlLkFjdGl2aXR5U3RhY2sgZnJvbnRTdGFjayA9CisgICAgICAgICAgICAgICAgICAgIG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFN0YWNrQnlJZChmcm9udFN0YWNrSWQpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJMYXVuY2hlZCBhY3Rpdml0eSBtdXN0IGJlIG9uIHRoZSBwcmltYXJ5IGRpc3BsYXkgYW5kIHJlc3VtZWQiLAorICAgICAgICAgICAgICAgICAgICBnZXRBY3Rpdml0eU5hbWUoTk9OX1JFU0laRUFCTEVfQUNUSVZJVFkpLAorICAgICAgICAgICAgICAgICAgICBmcm9udFN0YWNrLm1SZXN1bWVkQWN0aXZpdHkpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkU3RhY2soIkZvY3VzIG11c3QgYmUgb24gdGhlIHByaW1hcnkgZGlzcGxheSIsIGZyb250U3RhY2tJZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBsYXVuY2hpbmcgYSBub24tcmVzaXplYWJsZSBhY3Rpdml0eSBvbiB2aXJ0dWFsIGRpc3BsYXkgd2hpbGUgc3BsaXQtc2NyZWVuIGlzIGFjdGl2ZQorICAgICAqIG9uIHRoZSBwcmltYXJ5IGRpc3BsYXkuIEl0IHNob3VsZCBsYW5kIG9uIHRoZSBwcmltYXJ5IGRpc3BsYXkgYW5kIGRpc21pc3MgZG9ja2VkIHN0YWNrLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExhdW5jaE5vblJlc2l6ZWFibGVBY3Rpdml0eVdpdGhTcGxpdFNjcmVlbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3N1bWVUcnVlKHN1cHBvcnRzU3BsaXRTY3JlZW5NdWx0aVdpbmRvdygpKTsKKworICAgICAgICAvLyBTdGFydCBsYXVuY2hpbmcgYWN0aXZpdHkuCisgICAgICAgIGxhdW5jaEFjdGl2aXRpZXNJblNwbGl0U2NyZWVuKAorICAgICAgICAgICAgICAgIGdldExhdW5jaEFjdGl2aXR5QnVpbGRlcigpLnNldFRhcmdldEFjdGl2aXR5KExBVU5DSElOR19BQ1RJVklUWSksCisgICAgICAgICAgICAgICAgZ2V0TGF1bmNoQWN0aXZpdHlCdWlsZGVyKCkuc2V0VGFyZ2V0QWN0aXZpdHkoVEVTVF9BQ1RJVklUWSkpOworCisgICAgICAgIHRyeSAoZmluYWwgVmlydHVhbERpc3BsYXlTZXNzaW9uIHZpcnR1YWxEaXNwbGF5U2Vzc2lvbiA9IG5ldyBWaXJ0dWFsRGlzcGxheVNlc3Npb24oKSkgeworICAgICAgICAgICAgLy8gQ3JlYXRlIG5ldyB2aXJ0dWFsIGRpc3BsYXkuCisgICAgICAgICAgICBmaW5hbCBBY3Rpdml0eURpc3BsYXkgbmV3RGlzcGxheSA9IHZpcnR1YWxEaXNwbGF5U2Vzc2lvbi5zZXRMYXVuY2hJblNwbGl0U2NyZWVuKHRydWUpCisgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVEaXNwbGF5KCk7CisKKyAgICAgICAgICAgIC8vIExhdW5jaCBhY3Rpdml0eSBvbiBuZXcgc2Vjb25kYXJ5IGRpc3BsYXkuCisgICAgICAgICAgICBsYXVuY2hBY3Rpdml0eU9uRGlzcGxheShOT05fUkVTSVpFQUJMRV9BQ1RJVklUWSwgbmV3RGlzcGxheS5tSWQpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUoTk9OX1JFU0laRUFCTEVfQUNUSVZJVFkpOworCisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRBY3Rpdml0eSgKKyAgICAgICAgICAgICAgICAgICAgIkFjdGl2aXR5IGxhdW5jaGVkIG9uIHNlY29uZGFyeSBkaXNwbGF5IG11c3QgYmUgZm9jdXNlZCIsCisgICAgICAgICAgICAgICAgICAgIE5PTl9SRVNJWkVBQkxFX0FDVElWSVRZKTsKKworICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCBhY3Rpdml0eSBpcyBvbiB0aGUgcmlnaHQgZGlzcGxheS4KKyAgICAgICAgICAgIGZpbmFsIGludCBmcm9udFN0YWNrSWQgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRGcm9udFN0YWNrSWQoREVGQVVMVF9ESVNQTEFZKTsKKyAgICAgICAgICAgIGZpbmFsIEFjdGl2aXR5TWFuYWdlclN0YXRlLkFjdGl2aXR5U3RhY2sgZnJvbnRTdGFjayA9CisgICAgICAgICAgICAgICAgICAgIG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFN0YWNrQnlJZChmcm9udFN0YWNrSWQpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJMYXVuY2hlZCBhY3Rpdml0eSBtdXN0IGJlIG9uIHRoZSBwcmltYXJ5IGRpc3BsYXkgYW5kIHJlc3VtZWQiLAorICAgICAgICAgICAgICAgICAgICBnZXRBY3Rpdml0eU5hbWUoTk9OX1JFU0laRUFCTEVfQUNUSVZJVFkpLAorICAgICAgICAgICAgICAgICAgICBmcm9udFN0YWNrLm1SZXN1bWVkQWN0aXZpdHkpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkU3RhY2soIkZvY3VzIG11c3QgYmUgb24gdGhlIHByaW1hcnkgZGlzcGxheSIsIGZyb250U3RhY2tJZCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydERvZXNOb3RDb250YWluU3RhY2soIk11c3Qgbm90IGNvbnRhaW4gZG9ja2VkIHN0YWNrLiIsCisgICAgICAgICAgICAgICAgICAgIFdJTkRPV0lOR19NT0RFX1NQTElUX1NDUkVFTl9QUklNQVJZLCBBQ1RJVklUWV9UWVBFX1NUQU5EQVJEKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIG1vdmluZyBhIG5vbi1yZXNpemVhYmxlIGFjdGl2aXR5IHRvIGEgdmlydHVhbCBkaXNwbGF5LiBJdCBzaG91bGQgc3RheSBvbiB0aGUgZGVmYXVsdAorICAgICAqIGRpc3BsYXkgd2l0aCBubyBhY3Rpb24gcGVyZm9ybWVkLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1vdmVOb25SZXNpemVhYmxlQWN0aXZpdHlUb1NlY29uZGFyeURpc3BsYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IChmaW5hbCBWaXJ0dWFsRGlzcGxheVNlc3Npb24gdmlydHVhbERpc3BsYXlTZXNzaW9uID0gbmV3IFZpcnR1YWxEaXNwbGF5U2Vzc2lvbigpKSB7CisgICAgICAgICAgICAvLyBDcmVhdGUgbmV3IHZpcnR1YWwgZGlzcGxheS4KKyAgICAgICAgICAgIGZpbmFsIEFjdGl2aXR5RGlzcGxheSBuZXdEaXNwbGF5ID0gdmlydHVhbERpc3BsYXlTZXNzaW9uLmNyZWF0ZURpc3BsYXkoKTsKKyAgICAgICAgICAgIC8vIExhdW5jaCBhIG5vbi1yZXNpemVhYmxlIGFjdGl2aXR5IG9uIGEgcHJpbWFyeSBkaXNwbGF5LgorICAgICAgICAgICAgbGF1bmNoQWN0aXZpdHlJbk5ld1Rhc2soTk9OX1JFU0laRUFCTEVfQUNUSVZJVFkpOworICAgICAgICAgICAgLy8gTGF1bmNoIGEgcmVzaXplYWJsZSBhY3Rpdml0eSBvbiBuZXcgc2Vjb25kYXJ5IGRpc3BsYXkgdG8gY3JlYXRlIGEgbmV3IHN0YWNrIHRoZXJlLgorICAgICAgICAgICAgbGF1bmNoQWN0aXZpdHlPbkRpc3BsYXkoUkVTSVpFQUJMRV9BQ1RJVklUWSwgbmV3RGlzcGxheS5tSWQpOworICAgICAgICAgICAgZmluYWwgaW50IGV4dGVybmFsRnJvbnRTdGFja0lkID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkKKyAgICAgICAgICAgICAgICAgICAgLmdldEZyb250U3RhY2tJZChuZXdEaXNwbGF5Lm1JZCk7CisKKyAgICAgICAgICAgIC8vIFRyeSB0byBtb3ZlIHRoZSBub24tcmVzaXplYWJsZSBhY3Rpdml0eSB0byBuZXcgc2Vjb25kYXJ5IGRpc3BsYXkuCisgICAgICAgICAgICBtb3ZlQWN0aXZpdHlUb1N0YWNrKE5PTl9SRVNJWkVBQkxFX0FDVElWSVRZLCBleHRlcm5hbEZyb250U3RhY2tJZCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShOT05fUkVTSVpFQUJMRV9BQ1RJVklUWSk7CisKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZEFjdGl2aXR5KAorICAgICAgICAgICAgICAgICAgICAiQWN0aXZpdHkgbGF1bmNoZWQgb24gc2Vjb25kYXJ5IGRpc3BsYXkgbXVzdCBiZSBmb2N1c2VkIiwKKyAgICAgICAgICAgICAgICAgICAgUkVTSVpFQUJMRV9BQ1RJVklUWSk7CisKKyAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgYWN0aXZpdHkgaXMgaW4gdGhlIHNhbWUgc3RhY2sKKyAgICAgICAgICAgIGZpbmFsIGludCBkZWZhdWx0RnJvbnRTdGFja0lkID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0RnJvbnRTdGFja0lkKAorICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0RJU1BMQVkpOworICAgICAgICAgICAgZmluYWwgQWN0aXZpdHlNYW5hZ2VyU3RhdGUuQWN0aXZpdHlTdGFjayBkZWZhdWx0RnJvbnRTdGFjayA9CisgICAgICAgICAgICAgICAgICAgIG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFN0YWNrQnlJZChkZWZhdWx0RnJvbnRTdGFja0lkKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiTGF1bmNoZWQgYWN0aXZpdHkgbXVzdCBiZSBvbiB0aGUgcHJpbWFyeSBkaXNwbGF5IGFuZCByZXN1bWVkIiwKKyAgICAgICAgICAgICAgICAgICAgZ2V0QWN0aXZpdHlOYW1lKE5PTl9SRVNJWkVBQkxFX0FDVElWSVRZKSwKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEZyb250U3RhY2suZ2V0VG9wVGFzaygpLm1SZWFsQWN0aXZpdHkpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkU3RhY2soIkZvY3VzIG11c3QgcmVtYWluIG9uIHRoZSBzZWNvbmRhcnkgZGlzcGxheSIsCisgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsRnJvbnRTdGFja0lkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIGxhdW5jaGluZyBhIG5vbi1yZXNpemVhYmxlIGFjdGl2aXR5IG9uIHZpcnR1YWwgZGlzcGxheSBmcm9tIGFjdGl2aXR5IHRoZXJlLiBJdCBzaG91bGQKKyAgICAgKiBsYW5kIG9uIHRoZSBzZWNvbmRhcnkgZGlzcGxheSBiYXNlZCBvbiB0aGUgcmVzaXplYWJpbGl0eSBvZiB0aGUgcm9vdCBhY3Rpdml0eSBvZiB0aGUgdGFzay4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMYXVuY2hOb25SZXNpemVhYmxlQWN0aXZpdHlGcm9tU2Vjb25kYXJ5RGlzcGxheVNhbWVUYXNrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSAoZmluYWwgVmlydHVhbERpc3BsYXlTZXNzaW9uIHZpcnR1YWxEaXNwbGF5U2Vzc2lvbiA9IG5ldyBWaXJ0dWFsRGlzcGxheVNlc3Npb24oKSkgeworICAgICAgICAgICAgLy8gQ3JlYXRlIG5ldyBzaW11bGF0ZWQgZGlzcGxheS4KKyAgICAgICAgICAgIGZpbmFsIEFjdGl2aXR5RGlzcGxheSBuZXdEaXNwbGF5ID0gdmlydHVhbERpc3BsYXlTZXNzaW9uLnNldFNpbXVsYXRlRGlzcGxheSh0cnVlKQorICAgICAgICAgICAgICAgICAgICAuY3JlYXRlRGlzcGxheSgpOworCisgICAgICAgICAgICAvLyBMYXVuY2ggYWN0aXZpdHkgb24gbmV3IHNlY29uZGFyeSBkaXNwbGF5LgorICAgICAgICAgICAgbGF1bmNoQWN0aXZpdHlPbkRpc3BsYXkoQlJPQURDQVNUX1JFQ0VJVkVSX0FDVElWSVRZLCBuZXdEaXNwbGF5Lm1JZCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRBY3Rpdml0eSgKKyAgICAgICAgICAgICAgICAgICAgIkFjdGl2aXR5IGxhdW5jaGVkIG9uIHNlY29uZGFyeSBkaXNwbGF5IG11c3QgYmUgZm9jdXNlZCIsCisgICAgICAgICAgICAgICAgICAgIEJST0FEQ0FTVF9SRUNFSVZFUl9BQ1RJVklUWSk7CisKKyAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgbGF1bmNoaW5nIGFjdGl2aXR5IGlzIG9uIHRoZSBzZWNvbmRhcnkgZGlzcGxheS4KKyAgICAgICAgICAgIGludCBmcm9udFN0YWNrSWQgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRGcm9udFN0YWNrSWQobmV3RGlzcGxheS5tSWQpOworICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyU3RhdGUuQWN0aXZpdHlTdGFjayBmcm9udFN0YWNrID0KKyAgICAgICAgICAgICAgICAgICAgbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0U3RhY2tCeUlkKGZyb250U3RhY2tJZCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkxhdW5jaGVkIGFjdGl2aXR5IG11c3QgYmUgb24gdGhlIHNlY29uZGFyeSBkaXNwbGF5IGFuZCByZXN1bWVkIiwKKyAgICAgICAgICAgICAgICAgICAgZ2V0QWN0aXZpdHlOYW1lKEJST0FEQ0FTVF9SRUNFSVZFUl9BQ1RJVklUWSksCisgICAgICAgICAgICAgICAgICAgIGZyb250U3RhY2subVJlc3VtZWRBY3Rpdml0eSk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRTdGFjaygiRm9jdXMgbXVzdCBiZSBvbiB0aGUgc2Vjb25kYXJ5IGRpc3BsYXkiLCBmcm9udFN0YWNrSWQpOworCisgICAgICAgICAgICAvLyBMYXVuY2ggbm9uLXJlc2l6ZWFibGUgYWN0aXZpdHkgZnJvbSBzZWNvbmRhcnkgZGlzcGxheS4KKyAgICAgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoCisgICAgICAgICAgICAgICAgICAgIExBVU5DSF9BQ1RJVklUWV9CUk9BRENBU1QgKyBnZXRBY3Rpdml0eU5hbWUoTk9OX1JFU0laRUFCTEVfQUNUSVZJVFkpKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKE5PTl9SRVNJWkVBQkxFX0FDVElWSVRZKTsKKworICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCBub24tcmVzaXplYWJsZSBhY3Rpdml0eSBpcyBvbiB0aGUgc2Vjb25kYXJ5IGRpc3BsYXksIGJlY2F1c2Ugb2YgdGhlCisgICAgICAgICAgICAvLyByZXNpemVhYmxlIHJvb3Qgb2YgdGhlIHRhc2suCisgICAgICAgICAgICBmcm9udFN0YWNrSWQgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRGcm9udFN0YWNrSWQobmV3RGlzcGxheS5tSWQpOworICAgICAgICAgICAgZnJvbnRTdGFjayA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFN0YWNrQnlJZChmcm9udFN0YWNrSWQpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJMYXVuY2hlZCBhY3Rpdml0eSBtdXN0IGJlIG9uIHRoZSBwcmltYXJ5IGRpc3BsYXkgYW5kIHJlc3VtZWQiLAorICAgICAgICAgICAgICAgICAgICBnZXRBY3Rpdml0eU5hbWUoTk9OX1JFU0laRUFCTEVfQUNUSVZJVFkpLAorICAgICAgICAgICAgICAgICAgICBmcm9udFN0YWNrLm1SZXN1bWVkQWN0aXZpdHkpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkU3RhY2soIkZvY3VzIG11c3QgYmUgb24gdGhlIHByaW1hcnkgZGlzcGxheSIsIGZyb250U3RhY2tJZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBsYXVuY2hpbmcgYSBub24tcmVzaXplYWJsZSBhY3Rpdml0eSBvbiB2aXJ0dWFsIGRpc3BsYXkgZnJvbSBhY3Rpdml0eSB0aGVyZS4gSXQgc2hvdWxkCisgICAgICogbGFuZCBvbiBzb21lIGRpZmZlcmVudCBzdWl0YWJsZSBkaXNwbGF5ICh1c3VhbGx5IC0gb24gdGhlIGRlZmF1bHQgb25lKS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMYXVuY2hOb25SZXNpemVhYmxlQWN0aXZpdHlGcm9tU2Vjb25kYXJ5RGlzcGxheU5ld1Rhc2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IChmaW5hbCBWaXJ0dWFsRGlzcGxheVNlc3Npb24gdmlydHVhbERpc3BsYXlTZXNzaW9uID0gbmV3IFZpcnR1YWxEaXNwbGF5U2Vzc2lvbigpKSB7CisgICAgICAgICAgICAvLyBDcmVhdGUgbmV3IHZpcnR1YWwgZGlzcGxheS4KKyAgICAgICAgICAgIGZpbmFsIEFjdGl2aXR5RGlzcGxheSBuZXdEaXNwbGF5ID0gdmlydHVhbERpc3BsYXlTZXNzaW9uLmNyZWF0ZURpc3BsYXkoKTsKKworICAgICAgICAgICAgLy8gTGF1bmNoIGFjdGl2aXR5IG9uIG5ldyBzZWNvbmRhcnkgZGlzcGxheS4KKyAgICAgICAgICAgIGxhdW5jaEFjdGl2aXR5T25EaXNwbGF5KExBVU5DSElOR19BQ1RJVklUWSwgbmV3RGlzcGxheS5tSWQpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkQWN0aXZpdHkoCisgICAgICAgICAgICAgICAgICAgICJBY3Rpdml0eSBsYXVuY2hlZCBvbiBzZWNvbmRhcnkgZGlzcGxheSBtdXN0IGJlIGZvY3VzZWQiLAorICAgICAgICAgICAgICAgICAgICBMQVVOQ0hJTkdfQUNUSVZJVFkpOworCisgICAgICAgICAgICAvLyBDaGVjayB0aGF0IGxhdW5jaGluZyBhY3Rpdml0eSBpcyBvbiB0aGUgc2Vjb25kYXJ5IGRpc3BsYXkuCisgICAgICAgICAgICBpbnQgZnJvbnRTdGFja0lkID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0RnJvbnRTdGFja0lkKG5ld0Rpc3BsYXkubUlkKTsKKyAgICAgICAgICAgIEFjdGl2aXR5TWFuYWdlclN0YXRlLkFjdGl2aXR5U3RhY2sgZnJvbnRTdGFjayA9CisgICAgICAgICAgICAgICAgICAgIG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFN0YWNrQnlJZChmcm9udFN0YWNrSWQpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJMYXVuY2hlZCBhY3Rpdml0eSBtdXN0IGJlIG9uIHRoZSBzZWNvbmRhcnkgZGlzcGxheSBhbmQgcmVzdW1lZCIsCisgICAgICAgICAgICAgICAgICAgIGdldEFjdGl2aXR5TmFtZShMQVVOQ0hJTkdfQUNUSVZJVFkpLAorICAgICAgICAgICAgICAgICAgICBmcm9udFN0YWNrLm1SZXN1bWVkQWN0aXZpdHkpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkU3RhY2soIkZvY3VzIG11c3QgYmUgb24gdGhlIHNlY29uZGFyeSBkaXNwbGF5IiwgZnJvbnRTdGFja0lkKTsKKworICAgICAgICAgICAgLy8gTGF1bmNoIG5vbi1yZXNpemVhYmxlIGFjdGl2aXR5IGZyb20gc2Vjb25kYXJ5IGRpc3BsYXkuCisgICAgICAgICAgICBnZXRMYXVuY2hBY3Rpdml0eUJ1aWxkZXIoKS5zZXRUYXJnZXRBY3Rpdml0eShOT05fUkVTSVpFQUJMRV9BQ1RJVklUWSkKKyAgICAgICAgICAgICAgICAgICAgLnNldE5ld1Rhc2sodHJ1ZSkuc2V0TXVsdGlwbGVUYXNrKHRydWUpLmV4ZWN1dGUoKTsKKworICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCBub24tcmVzaXplYWJsZSBhY3Rpdml0eSBpcyBvbiB0aGUgcHJpbWFyeSBkaXNwbGF5LgorICAgICAgICAgICAgZnJvbnRTdGFja0lkID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0Rm9jdXNlZFN0YWNrSWQoKTsKKyAgICAgICAgICAgIGZyb250U3RhY2sgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja0J5SWQoZnJvbnRTdGFja0lkKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKCJMYXVuY2hlZCBhY3Rpdml0eSBtdXN0IGJlIG9uIGEgZGlmZmVyZW50IGRpc3BsYXkiLAorICAgICAgICAgICAgICAgICAgICBuZXdEaXNwbGF5Lm1JZCA9PSBmcm9udFN0YWNrLm1EaXNwbGF5SWQpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJMYXVuY2hlZCBhY3Rpdml0eSBtdXN0IGJlIHJlc3VtZWQiLAorICAgICAgICAgICAgICAgICAgICBnZXRBY3Rpdml0eU5hbWUoTk9OX1JFU0laRUFCTEVfQUNUSVZJVFkpLAorICAgICAgICAgICAgICAgICAgICBmcm9udFN0YWNrLm1SZXN1bWVkQWN0aXZpdHkpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkU3RhY2soIkZvY3VzIG11c3QgYmUgb24gYSBqdXN0IGxhdW5jaGVkIGFjdGl2aXR5IiwKKyAgICAgICAgICAgICAgICAgICAgZnJvbnRTdGFja0lkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIGxhdW5jaGluZyBhbiBhY3Rpdml0eSBvbiBhIHZpcnR1YWwgZGlzcGxheSB3aXRob3V0IHNwZWNpYWwgcGVybWlzc2lvbiBtdXN0IG5vdCBiZQorICAgICAqIGFsbG93ZWQuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGF1bmNoV2l0aG91dFBlcm1pc3Npb25PblZpcnR1YWxEaXNwbGF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSAoZmluYWwgVmlydHVhbERpc3BsYXlTZXNzaW9uIHZpcnR1YWxEaXNwbGF5U2Vzc2lvbiA9IG5ldyBWaXJ0dWFsRGlzcGxheVNlc3Npb24oKSkgeworICAgICAgICAgICAgLy8gQ3JlYXRlIG5ldyB2aXJ0dWFsIGRpc3BsYXkuCisgICAgICAgICAgICBmaW5hbCBBY3Rpdml0eURpc3BsYXkgbmV3RGlzcGxheSA9IHZpcnR1YWxEaXNwbGF5U2Vzc2lvbi5jcmVhdGVEaXNwbGF5KCk7CisKKyAgICAgICAgICAgIGZpbmFsIExvZ1NlcGFyYXRvciBsb2dTZXBhcmF0b3IgPSBzZXBhcmF0ZUxvZ3MoKTsKKworICAgICAgICAgICAgLy8gVHJ5IHRvIGxhdW5jaCBhbiBhY3Rpdml0eSBhbmQgY2hlY2sgaXQgc2VjdXJpdHkgZXhjZXB0aW9uIHdhcyB0cmlnZ2VyZWQuCisgICAgICAgICAgICBnZXRMYXVuY2hBY3Rpdml0eUJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAuc2V0VXNlQnJvYWRjYXN0UmVjZWl2ZXIoU0VDT05EX0xBVU5DSF9CUk9BRENBU1RfUkVDRUlWRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VDT05EX0xBVU5DSF9CUk9BRENBU1RfQUNUSU9OKQorICAgICAgICAgICAgICAgICAgICAuc2V0RGlzcGxheUlkKG5ld0Rpc3BsYXkubUlkKQorICAgICAgICAgICAgICAgICAgICAuc2V0VGFyZ2V0QWN0aXZpdHkoVEVTVF9BQ1RJVklUWSkKKyAgICAgICAgICAgICAgICAgICAgLmV4ZWN1dGUoKTsKKworICAgICAgICAgICAgYXNzZXJ0U2VjdXJpdHlFeGNlcHRpb24oIkFjdGl2aXR5TGF1bmNoZXIiLCBsb2dTZXBhcmF0b3IpOworCisgICAgICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShURVNUX0FDVElWSVRZKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKCJSZXN0cmljdGVkIGFjdGl2aXR5IG11c3Qgbm90IGJlIGxhdW5jaGVkIiwKKyAgICAgICAgICAgICAgICAgICAgbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuY29udGFpbnNBY3Rpdml0eShURVNUX0FDVElWSVRZKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBsYXVuY2hpbmcgYW4gYWN0aXZpdHkgb24gYSB2aXJ0dWFsIGRpc3BsYXkgd2l0aG91dCBzcGVjaWFsIHBlcm1pc3Npb24gbXVzdCBiZSBhbGxvd2VkCisgICAgICogZm9yIGFjdGl2aXRpZXMgd2l0aCBzYW1lIFVJRC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMYXVuY2hXaXRob3V0UGVybWlzc2lvbk9uVmlydHVhbERpc3BsYXlCeU93bmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSAoZmluYWwgVmlydHVhbERpc3BsYXlTZXNzaW9uIHZpcnR1YWxEaXNwbGF5U2Vzc2lvbiA9IG5ldyBWaXJ0dWFsRGlzcGxheVNlc3Npb24oKSkgeworICAgICAgICAgICAgLy8gQ3JlYXRlIG5ldyB2aXJ0dWFsIGRpc3BsYXkuCisgICAgICAgICAgICBmaW5hbCBBY3Rpdml0eURpc3BsYXkgbmV3RGlzcGxheSA9IHZpcnR1YWxEaXNwbGF5U2Vzc2lvbi5jcmVhdGVEaXNwbGF5KCk7CisKKyAgICAgICAgICAgIC8vIFRyeSB0byBsYXVuY2ggYW4gYWN0aXZpdHkgYW5kIGNoZWNrIGl0IHNlY3VyaXR5IGV4Y2VwdGlvbiB3YXMgdHJpZ2dlcmVkLgorICAgICAgICAgICAgZ2V0TGF1bmNoQWN0aXZpdHlCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgLnNldFVzZUJyb2FkY2FzdFJlY2VpdmVyKExBVU5DSF9CUk9BRENBU1RfUkVDRUlWRVIsIExBVU5DSF9CUk9BRENBU1RfQUNUSU9OKQorICAgICAgICAgICAgICAgICAgICAuc2V0RGlzcGxheUlkKG5ld0Rpc3BsYXkubUlkKQorICAgICAgICAgICAgICAgICAgICAuc2V0VGFyZ2V0QWN0aXZpdHkoVEVTVF9BQ1RJVklUWSkKKyAgICAgICAgICAgICAgICAgICAgLmV4ZWN1dGUoKTsKKworICAgICAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yVmFsaWRTdGF0ZShURVNUX0FDVElWSVRZKTsKKworICAgICAgICAgICAgZmluYWwgaW50IGV4dGVybmFsRm9jdXNlZFN0YWNrSWQgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRGb2N1c2VkU3RhY2tJZCgpOworICAgICAgICAgICAgZmluYWwgQWN0aXZpdHlNYW5hZ2VyU3RhdGUuQWN0aXZpdHlTdGFjayBmb2N1c2VkU3RhY2sgPQorICAgICAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja0J5SWQoZXh0ZXJuYWxGb2N1c2VkU3RhY2tJZCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkZvY3VzZWQgc3RhY2sgbXVzdCBiZSBvbiBzZWNvbmRhcnkgZGlzcGxheSIsIG5ld0Rpc3BsYXkubUlkLAorICAgICAgICAgICAgICAgICAgICBmb2N1c2VkU3RhY2subURpc3BsYXlJZCk7CisKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZEFjdGl2aXR5KCJGb2N1cyBtdXN0IGJlIG9uIG5ld2x5IGxhdW5jaGVkIGFwcCIsCisgICAgICAgICAgICAgICAgICAgIFRFU1RfQUNUSVZJVFkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJBY3Rpdml0eSBsYXVuY2hlZCBieSBvd25lciBtdXN0IGJlIG9uIGV4dGVybmFsIGRpc3BsYXkiLAorICAgICAgICAgICAgICAgICAgICBleHRlcm5hbEZvY3VzZWRTdGFja0lkLCBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRGb2N1c2VkU3RhY2tJZCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIGxhdW5jaGluZyBhbiBhY3Rpdml0eSBvbiB2aXJ0dWFsIGRpc3BsYXkgYW5kIHRoZW4gbGF1bmNoaW5nIGFub3RoZXIgYWN0aXZpdHkgdmlhIHNoZWxsCisgICAgICogY29tbWFuZCBhbmQgd2l0aG91dCBzcGVjaWZ5aW5nIHRoZSBkaXNwbGF5IGlkIC0gdGhlIHNlY29uZCBhY3Rpdml0eSBtdXN0IGFwcGVhciBvbiB0aGUKKyAgICAgKiBwcmltYXJ5IGRpc3BsYXkuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc2VxdWVudExhdW5jaEFjdGl2aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSAoZmluYWwgVmlydHVhbERpc3BsYXlTZXNzaW9uIHZpcnR1YWxEaXNwbGF5U2Vzc2lvbiA9IG5ldyBWaXJ0dWFsRGlzcGxheVNlc3Npb24oKSkgeworICAgICAgICAgICAgLy8gQ3JlYXRlIG5ldyB2aXJ0dWFsIGRpc3BsYXkuCisgICAgICAgICAgICBmaW5hbCBBY3Rpdml0eURpc3BsYXkgbmV3RGlzcGxheSA9IHZpcnR1YWxEaXNwbGF5U2Vzc2lvbi5jcmVhdGVEaXNwbGF5KCk7CisKKyAgICAgICAgICAgIC8vIExhdW5jaCBhY3Rpdml0eSBvbiBuZXcgc2Vjb25kYXJ5IGRpc3BsYXkuCisgICAgICAgICAgICBsYXVuY2hBY3Rpdml0eU9uRGlzcGxheShURVNUX0FDVElWSVRZLCBuZXdEaXNwbGF5Lm1JZCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShURVNUX0FDVElWSVRZKTsKKworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkQWN0aXZpdHkoCisgICAgICAgICAgICAgICAgICAgICJBY3Rpdml0eSBsYXVuY2hlZCBvbiBzZWNvbmRhcnkgZGlzcGxheSBtdXN0IGJlIGZvY3VzZWQiLAorICAgICAgICAgICAgICAgICAgICBURVNUX0FDVElWSVRZKTsKKworICAgICAgICAgICAgLy8gTGF1bmNoIHNlY29uZCBhY3Rpdml0eSB3aXRob3V0IHNwZWNpZnlpbmcgZGlzcGxheS4KKyAgICAgICAgICAgIGxhdW5jaEFjdGl2aXR5KExBVU5DSElOR19BQ1RJVklUWSk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShMQVVOQ0hJTkdfQUNUSVZJVFkpOworCisgICAgICAgICAgICAvLyBDaGVjayB0aGF0IGFjdGl2aXR5IGlzIGxhdW5jaGVkIGluIGZvY3VzZWQgc3RhY2sgb24gcHJpbWFyeSBkaXNwbGF5LgorICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkQWN0aXZpdHkoIkxhdW5jaGVkIGFjdGl2aXR5IG11c3QgYmUgZm9jdXNlZCIsCisgICAgICAgICAgICAgICAgICAgIExBVU5DSElOR19BQ1RJVklUWSk7CisgICAgICAgICAgICBmaW5hbCBpbnQgZnJvbnRTdGFja0lkID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0RnJvbnRTdGFja0lkKERFRkFVTFRfRElTUExBWSk7CisgICAgICAgICAgICBmaW5hbCBBY3Rpdml0eU1hbmFnZXJTdGF0ZS5BY3Rpdml0eVN0YWNrIGZyb250U3RhY2sgPQorICAgICAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja0J5SWQoZnJvbnRTdGFja0lkKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiTGF1bmNoZWQgYWN0aXZpdHkgbXVzdCBiZSByZXN1bWVkIGluIGZyb250IHN0YWNrIiwKKyAgICAgICAgICAgICAgICAgICAgZ2V0QWN0aXZpdHlOYW1lKExBVU5DSElOR19BQ1RJVklUWSksIGZyb250U3RhY2subVJlc3VtZWRBY3Rpdml0eSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkZyb250IHN0YWNrIG11c3QgYmUgb24gcHJpbWFyeSBkaXNwbGF5IiwKKyAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9ESVNQTEFZLCBmcm9udFN0YWNrLm1EaXNwbGF5SWQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgbGF1bmNoaW5nIGFuIGFjdGl2aXR5IG9uIHNpbXVsYXRlZCBkaXNwbGF5IGFuZCB0aGVuIGxhdW5jaGluZyBhbm90aGVyIGFjdGl2aXR5IGZyb20gdGhlCisgICAgICogZmlyc3Qgb25lIC0gaXQgbXVzdCBhcHBlYXIgb24gdGhlIHNlY29uZGFyeSBkaXNwbGF5LCBiZWNhdXNlIGl0IHdhcyBsYXVuY2hlZCBmcm9tIHRoZXJlLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbnNlcXVlbnRMYXVuY2hBY3Rpdml0eUZyb21TZWNvbmRhcnlEaXNwbGF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSAoZmluYWwgVmlydHVhbERpc3BsYXlTZXNzaW9uIHZpcnR1YWxEaXNwbGF5U2Vzc2lvbiA9IG5ldyBWaXJ0dWFsRGlzcGxheVNlc3Npb24oKSkgeworICAgICAgICAgICAgLy8gQ3JlYXRlIG5ldyBzaW11bGF0ZWQgZGlzcGxheS4KKyAgICAgICAgICAgIGZpbmFsIEFjdGl2aXR5RGlzcGxheSBuZXdEaXNwbGF5ID0gdmlydHVhbERpc3BsYXlTZXNzaW9uLnNldFNpbXVsYXRlRGlzcGxheSh0cnVlKQorICAgICAgICAgICAgICAgICAgICAuY3JlYXRlRGlzcGxheSgpOworCisgICAgICAgICAgICAvLyBMYXVuY2ggYWN0aXZpdHkgb24gbmV3IHNlY29uZGFyeSBkaXNwbGF5LgorICAgICAgICAgICAgbGF1bmNoQWN0aXZpdHlPbkRpc3BsYXkoTEFVTkNISU5HX0FDVElWSVRZLCBuZXdEaXNwbGF5Lm1JZCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShuZXcgV2FpdEZvclZhbGlkQWN0aXZpdHlTdGF0ZShMQVVOQ0hJTkdfQUNUSVZJVFkpKTsKKworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkQWN0aXZpdHkoCisgICAgICAgICAgICAgICAgICAgICJBY3Rpdml0eSBsYXVuY2hlZCBvbiBzZWNvbmRhcnkgZGlzcGxheSBtdXN0IGJlIHJlc3VtZWQiLAorICAgICAgICAgICAgICAgICAgICBMQVVOQ0hJTkdfQUNUSVZJVFkpOworCisgICAgICAgICAgICAvLyBMYXVuY2ggc2Vjb25kIGFjdGl2aXR5IGZyb20gYXBwIG9uIHNlY29uZGFyeSBkaXNwbGF5IHdpdGhvdXQgc3BlY2lmeWluZyBkaXNwbGF5IGlkLgorICAgICAgICAgICAgZ2V0TGF1bmNoQWN0aXZpdHlCdWlsZGVyKCkuc2V0VGFyZ2V0QWN0aXZpdHkoVEVTVF9BQ1RJVklUWSkuZXhlY3V0ZSgpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUoVEVTVF9BQ1RJVklUWSk7CisKKyAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgYWN0aXZpdHkgaXMgbGF1bmNoZWQgaW4gZm9jdXNlZCBzdGFjayBvbiBleHRlcm5hbCBkaXNwbGF5LgorICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkQWN0aXZpdHkoIkxhdW5jaGVkIGFjdGl2aXR5IG11c3QgYmUgZm9jdXNlZCIsCisgICAgICAgICAgICAgICAgICAgIFRFU1RfQUNUSVZJVFkpOworICAgICAgICAgICAgZmluYWwgaW50IGZyb250U3RhY2tJZCA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEZyb250U3RhY2tJZChuZXdEaXNwbGF5Lm1JZCk7CisgICAgICAgICAgICBmaW5hbCBBY3Rpdml0eU1hbmFnZXJTdGF0ZS5BY3Rpdml0eVN0YWNrIGZyb250U3RhY2sgPQorICAgICAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja0J5SWQoZnJvbnRTdGFja0lkKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiTGF1bmNoZWQgYWN0aXZpdHkgbXVzdCBiZSByZXN1bWVkIGluIGZyb250IHN0YWNrIiwKKyAgICAgICAgICAgICAgICAgICAgZ2V0QWN0aXZpdHlOYW1lKFRFU1RfQUNUSVZJVFkpLCBmcm9udFN0YWNrLm1SZXN1bWVkQWN0aXZpdHkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgbGF1bmNoaW5nIGFuIGFjdGl2aXR5IG9uIHZpcnR1YWwgZGlzcGxheSBhbmQgdGhlbiBsYXVuY2hpbmcgYW5vdGhlciBhY3Rpdml0eSBmcm9tIHRoZQorICAgICAqIGZpcnN0IG9uZSAtIGl0IG11c3QgYXBwZWFyIG9uIHRoZSBzZWNvbmRhcnkgZGlzcGxheSwgYmVjYXVzZSBpdCB3YXMgbGF1bmNoZWQgZnJvbSB0aGVyZS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zZXF1ZW50TGF1bmNoQWN0aXZpdHlGcm9tVmlydHVhbERpc3BsYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IChmaW5hbCBWaXJ0dWFsRGlzcGxheVNlc3Npb24gdmlydHVhbERpc3BsYXlTZXNzaW9uID0gbmV3IFZpcnR1YWxEaXNwbGF5U2Vzc2lvbigpKSB7CisgICAgICAgICAgICAvLyBDcmVhdGUgbmV3IHZpcnR1YWwgZGlzcGxheS4KKyAgICAgICAgICAgIGZpbmFsIEFjdGl2aXR5RGlzcGxheSBuZXdEaXNwbGF5ID0gdmlydHVhbERpc3BsYXlTZXNzaW9uLmNyZWF0ZURpc3BsYXkoKTsKKworICAgICAgICAgICAgLy8gTGF1bmNoIGFjdGl2aXR5IG9uIG5ldyBzZWNvbmRhcnkgZGlzcGxheS4KKyAgICAgICAgICAgIGxhdW5jaEFjdGl2aXR5T25EaXNwbGF5KExBVU5DSElOR19BQ1RJVklUWSwgbmV3RGlzcGxheS5tSWQpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUoTEFVTkNISU5HX0FDVElWSVRZKTsKKworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkQWN0aXZpdHkoCisgICAgICAgICAgICAgICAgICAgICJBY3Rpdml0eSBsYXVuY2hlZCBvbiBzZWNvbmRhcnkgZGlzcGxheSBtdXN0IGJlIHJlc3VtZWQiLAorICAgICAgICAgICAgICAgICAgICBMQVVOQ0hJTkdfQUNUSVZJVFkpOworCisgICAgICAgICAgICAvLyBMYXVuY2ggc2Vjb25kIGFjdGl2aXR5IGZyb20gYXBwIG9uIHNlY29uZGFyeSBkaXNwbGF5IHdpdGhvdXQgc3BlY2lmeWluZyBkaXNwbGF5IGlkLgorICAgICAgICAgICAgZ2V0TGF1bmNoQWN0aXZpdHlCdWlsZGVyKCkuc2V0VGFyZ2V0QWN0aXZpdHkoVEVTVF9BQ1RJVklUWSkuZXhlY3V0ZSgpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUoVEVTVF9BQ1RJVklUWSk7CisKKyAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgYWN0aXZpdHkgaXMgbGF1bmNoZWQgaW4gZm9jdXNlZCBzdGFjayBvbiBleHRlcm5hbCBkaXNwbGF5LgorICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkQWN0aXZpdHkoIkxhdW5jaGVkIGFjdGl2aXR5IG11c3QgYmUgZm9jdXNlZCIsCisgICAgICAgICAgICAgICAgICAgIFRFU1RfQUNUSVZJVFkpOworICAgICAgICAgICAgZmluYWwgaW50IGZyb250U3RhY2tJZCA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEZyb250U3RhY2tJZChuZXdEaXNwbGF5Lm1JZCk7CisgICAgICAgICAgICBmaW5hbCBBY3Rpdml0eU1hbmFnZXJTdGF0ZS5BY3Rpdml0eVN0YWNrIGZyb250U3RhY2sgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKQorICAgICAgICAgICAgICAgICAgICAuZ2V0U3RhY2tCeUlkKGZyb250U3RhY2tJZCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkxhdW5jaGVkIGFjdGl2aXR5IG11c3QgYmUgcmVzdW1lZCBpbiBmcm9udCBzdGFjayIsCisgICAgICAgICAgICAgICAgICAgIGdldEFjdGl2aXR5TmFtZShURVNUX0FDVElWSVRZKSwgZnJvbnRTdGFjay5tUmVzdW1lZEFjdGl2aXR5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIGxhdW5jaGluZyBhbiBhY3Rpdml0eSBvbiB2aXJ0dWFsIGRpc3BsYXkgYW5kIHRoZW4gbGF1bmNoaW5nIGFub3RoZXIgYWN0aXZpdHkgZnJvbSB0aGUKKyAgICAgKiBmaXJzdCBvbmUgd2l0aCBzcGVjaWZ5aW5nIHRoZSB0YXJnZXQgZGlzcGxheSAtIGl0IG11c3QgYXBwZWFyIG9uIHRoZSBzZWNvbmRhcnkgZGlzcGxheS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zZXF1ZW50TGF1bmNoQWN0aXZpdHlGcm9tVmlydHVhbERpc3BsYXlUb1RhcmdldERpc3BsYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IChmaW5hbCBWaXJ0dWFsRGlzcGxheVNlc3Npb24gdmlydHVhbERpc3BsYXlTZXNzaW9uID0gbmV3IFZpcnR1YWxEaXNwbGF5U2Vzc2lvbigpKSB7CisgICAgICAgICAgICAvLyBDcmVhdGUgbmV3IHZpcnR1YWwgZGlzcGxheS4KKyAgICAgICAgICAgIGZpbmFsIEFjdGl2aXR5RGlzcGxheSBuZXdEaXNwbGF5ID0gdmlydHVhbERpc3BsYXlTZXNzaW9uLmNyZWF0ZURpc3BsYXkoKTsKKworICAgICAgICAgICAgLy8gTGF1bmNoIGFjdGl2aXR5IG9uIG5ldyBzZWNvbmRhcnkgZGlzcGxheS4KKyAgICAgICAgICAgIGxhdW5jaEFjdGl2aXR5T25EaXNwbGF5KExBVU5DSElOR19BQ1RJVklUWSwgbmV3RGlzcGxheS5tSWQpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUoTEFVTkNISU5HX0FDVElWSVRZKTsKKworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkQWN0aXZpdHkoCisgICAgICAgICAgICAgICAgICAgICJBY3Rpdml0eSBsYXVuY2hlZCBvbiBzZWNvbmRhcnkgZGlzcGxheSBtdXN0IGJlIHJlc3VtZWQiLAorICAgICAgICAgICAgICAgICAgICBMQVVOQ0hJTkdfQUNUSVZJVFkpOworCisgICAgICAgICAgICAvLyBMYXVuY2ggc2Vjb25kIGFjdGl2aXR5IGZyb20gYXBwIG9uIHNlY29uZGFyeSBkaXNwbGF5IHNwZWNpZnlpbmcgc2FtZSBkaXNwbGF5IGlkLgorICAgICAgICAgICAgZ2V0TGF1bmNoQWN0aXZpdHlCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgLnNldFRhcmdldEFjdGl2aXR5KFNFQ09ORF9BQ1RJVklUWSkKKyAgICAgICAgICAgICAgICAgICAgLnNldERpc3BsYXlJZChuZXdEaXNwbGF5Lm1JZCkKKyAgICAgICAgICAgICAgICAgICAgLmV4ZWN1dGUoKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKFRFU1RfQUNUSVZJVFkpOworCisgICAgICAgICAgICAvLyBDaGVjayB0aGF0IGFjdGl2aXR5IGlzIGxhdW5jaGVkIGluIGZvY3VzZWQgc3RhY2sgb24gZXh0ZXJuYWwgZGlzcGxheS4KKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZEFjdGl2aXR5KCJMYXVuY2hlZCBhY3Rpdml0eSBtdXN0IGJlIGZvY3VzZWQiLCBTRUNPTkRfQUNUSVZJVFkpOworICAgICAgICAgICAgaW50IGZyb250U3RhY2tJZCA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEZyb250U3RhY2tJZChuZXdEaXNwbGF5Lm1JZCk7CisgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXJTdGF0ZS5BY3Rpdml0eVN0YWNrIGZyb250U3RhY2sgPQorICAgICAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja0J5SWQoZnJvbnRTdGFja0lkKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiTGF1bmNoZWQgYWN0aXZpdHkgbXVzdCBiZSByZXN1bWVkIGluIGZyb250IHN0YWNrIiwKKyAgICAgICAgICAgICAgICAgICAgZ2V0QWN0aXZpdHlOYW1lKFNFQ09ORF9BQ1RJVklUWSksIGZyb250U3RhY2subVJlc3VtZWRBY3Rpdml0eSk7CisKKyAgICAgICAgICAgIC8vIExhdW5jaCBvdGhlciBhY3Rpdml0eSB3aXRoIGRpZmZlcmVudCB1aWQgYW5kIGNoZWNrIGlmIGl0IGhhcyBsYXVuY2hlZCBzdWNjZXNzZnVsbHkuCisgICAgICAgICAgICBnZXRMYXVuY2hBY3Rpdml0eUJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAuc2V0VXNlQnJvYWRjYXN0UmVjZWl2ZXIoU0VDT05EX0xBVU5DSF9CUk9BRENBU1RfUkVDRUlWRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VDT05EX0xBVU5DSF9CUk9BRENBU1RfQUNUSU9OKQorICAgICAgICAgICAgICAgICAgICAuc2V0RGlzcGxheUlkKG5ld0Rpc3BsYXkubUlkKQorICAgICAgICAgICAgICAgICAgICAuc2V0VGFyZ2V0QWN0aXZpdHkoVEhJUkRfQUNUSVZJVFkpCisgICAgICAgICAgICAgICAgICAgIC5leGVjdXRlKCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JWYWxpZFN0YXRlKFRISVJEX0FDVElWSVRZKTsKKworICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCBhY3Rpdml0eSBpcyBsYXVuY2hlZCBpbiBmb2N1c2VkIHN0YWNrIG9uIGV4dGVybmFsIGRpc3BsYXkuCisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRBY3Rpdml0eSgiTGF1bmNoZWQgYWN0aXZpdHkgbXVzdCBiZSBmb2N1c2VkIiwgVEhJUkRfQUNUSVZJVFkpOworICAgICAgICAgICAgZnJvbnRTdGFja0lkID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0RnJvbnRTdGFja0lkKG5ld0Rpc3BsYXkubUlkKTsKKyAgICAgICAgICAgIGZyb250U3RhY2sgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja0J5SWQoZnJvbnRTdGFja0lkKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiTGF1bmNoZWQgYWN0aXZpdHkgbXVzdCBiZSByZXN1bWVkIGluIGZyb250IHN0YWNrIiwKKyAgICAgICAgICAgICAgICAgICAgZ2V0QWN0aXZpdHlOYW1lKFRISVJEX0FDVElWSVRZKSwgZnJvbnRTdGFjay5tUmVzdW1lZEFjdGl2aXR5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIGxhdW5jaGluZyBhbiBhY3Rpdml0eSBvbiB2aXJ0dWFsIGRpc3BsYXkgYW5kIHRoZW4gbGF1bmNoaW5nIGFub3RoZXIgYWN0aXZpdHkgdGhhdAorICAgICAqIGRvZXNuJ3QgYWxsb3cgZW1iZWRkaW5nIC0gaXQgc2hvdWxkIGZhaWwgd2l0aCBzZWN1cml0eSBleGNlcHRpb24uCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc2VxdWVudExhdW5jaEFjdGl2aXR5RnJvbVZpcnR1YWxEaXNwbGF5Tm9FbWJlZGRpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IChmaW5hbCBWaXJ0dWFsRGlzcGxheVNlc3Npb24gdmlydHVhbERpc3BsYXlTZXNzaW9uID0gbmV3IFZpcnR1YWxEaXNwbGF5U2Vzc2lvbigpKSB7CisgICAgICAgICAgICAvLyBDcmVhdGUgbmV3IHZpcnR1YWwgZGlzcGxheS4KKyAgICAgICAgICAgIGZpbmFsIEFjdGl2aXR5RGlzcGxheSBuZXdEaXNwbGF5ID0gdmlydHVhbERpc3BsYXlTZXNzaW9uLmNyZWF0ZURpc3BsYXkoKTsKKworICAgICAgICAgICAgLy8gTGF1bmNoIGFjdGl2aXR5IG9uIG5ldyBzZWNvbmRhcnkgZGlzcGxheS4KKyAgICAgICAgICAgIGxhdW5jaEFjdGl2aXR5T25EaXNwbGF5KExBVU5DSElOR19BQ1RJVklUWSwgbmV3RGlzcGxheS5tSWQpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUoTEFVTkNISU5HX0FDVElWSVRZKTsKKworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkQWN0aXZpdHkoCisgICAgICAgICAgICAgICAgICAgICJBY3Rpdml0eSBsYXVuY2hlZCBvbiBzZWNvbmRhcnkgZGlzcGxheSBtdXN0IGJlIHJlc3VtZWQiLAorICAgICAgICAgICAgICAgICAgICBMQVVOQ0hJTkdfQUNUSVZJVFkpOworCisgICAgICAgICAgICBmaW5hbCBMb2dTZXBhcmF0b3IgbG9nU2VwYXJhdG9yID0gc2VwYXJhdGVMb2dzKCk7CisKKyAgICAgICAgICAgIC8vIExhdW5jaCBzZWNvbmQgYWN0aXZpdHkgZnJvbSBhcHAgb24gc2Vjb25kYXJ5IGRpc3BsYXkgc3BlY2lmeWluZyBzYW1lIGRpc3BsYXkgaWQuCisgICAgICAgICAgICBnZXRMYXVuY2hBY3Rpdml0eUJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAuc2V0VGFyZ2V0QWN0aXZpdHkoU0VDT05EX05PX0VNQkVERElOR19BQ1RJVklUWSkKKyAgICAgICAgICAgICAgICAgICAgLnNldERpc3BsYXlJZChuZXdEaXNwbGF5Lm1JZCkKKyAgICAgICAgICAgICAgICAgICAgLmV4ZWN1dGUoKTsKKworICAgICAgICAgICAgYXNzZXJ0U2VjdXJpdHlFeGNlcHRpb24oIkFjdGl2aXR5TGF1bmNoZXIiLCBsb2dTZXBhcmF0b3IpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgbGF1bmNoaW5nIGFuIGFjdGl2aXR5IHRvIHNlY29uZGFyeSBkaXNwbGF5IGZyb20gYWN0aXZpdHkgb24gcHJpbWFyeSBkaXNwbGF5LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExhdW5jaEFjdGl2aXR5RnJvbUFwcFRvU2Vjb25kYXJ5RGlzcGxheSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBTdGFydCBsYXVuY2hpbmcgYWN0aXZpdHkuCisgICAgICAgIGxhdW5jaEFjdGl2aXR5KExBVU5DSElOR19BQ1RJVklUWSk7CisKKyAgICAgICAgdHJ5IChmaW5hbCBWaXJ0dWFsRGlzcGxheVNlc3Npb24gdmlydHVhbERpc3BsYXlTZXNzaW9uID0gbmV3IFZpcnR1YWxEaXNwbGF5U2Vzc2lvbigpKSB7CisgICAgICAgICAgICAvLyBDcmVhdGUgbmV3IHNpbXVsYXRlZCBkaXNwbGF5LgorICAgICAgICAgICAgZmluYWwgQWN0aXZpdHlEaXNwbGF5IG5ld0Rpc3BsYXkgPSB2aXJ0dWFsRGlzcGxheVNlc3Npb24uc2V0U2ltdWxhdGVEaXNwbGF5KHRydWUpCisgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVEaXNwbGF5KCk7CisKKyAgICAgICAgICAgIC8vIExhdW5jaCBhY3Rpdml0eSBvbiBzZWNvbmRhcnkgZGlzcGxheSBmcm9tIHRoZSBhcHAgb24gcHJpbWFyeSBkaXNwbGF5LgorICAgICAgICAgICAgZ2V0TGF1bmNoQWN0aXZpdHlCdWlsZGVyKCkuc2V0VGFyZ2V0QWN0aXZpdHkoVEVTVF9BQ1RJVklUWSkKKyAgICAgICAgICAgICAgICAgICAgLnNldERpc3BsYXlJZChuZXdEaXNwbGF5Lm1JZCkuZXhlY3V0ZSgpOworCisgICAgICAgICAgICAvLyBDaGVjayB0aGF0IGFjdGl2aXR5IGlzIGxhdW5jaGVkIG9uIGV4dGVybmFsIGRpc3BsYXkuCisgICAgICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShURVNUX0FDVElWSVRZKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZEFjdGl2aXR5KAorICAgICAgICAgICAgICAgICAgICAiQWN0aXZpdHkgbGF1bmNoZWQgb24gc2Vjb25kYXJ5IGRpc3BsYXkgbXVzdCBiZSBmb2N1c2VkIiwKKyAgICAgICAgICAgICAgICAgICAgVEVTVF9BQ1RJVklUWSk7CisgICAgICAgICAgICBmaW5hbCBpbnQgZnJvbnRTdGFja0lkID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0RnJvbnRTdGFja0lkKG5ld0Rpc3BsYXkubUlkKTsKKyAgICAgICAgICAgIGZpbmFsIEFjdGl2aXR5TWFuYWdlclN0YXRlLkFjdGl2aXR5U3RhY2sgZnJvbnRTdGFjayA9CisgICAgICAgICAgICAgICAgICAgIG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFN0YWNrQnlJZChmcm9udFN0YWNrSWQpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJMYXVuY2hlZCBhY3Rpdml0eSBtdXN0IGJlIHJlc3VtZWQgaW4gZnJvbnQgc3RhY2siLAorICAgICAgICAgICAgICAgICAgICBnZXRBY3Rpdml0eU5hbWUoVEVTVF9BQ1RJVklUWSksIGZyb250U3RhY2subVJlc3VtZWRBY3Rpdml0eSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBsYXVuY2hpbmcgYWN0aXZpdGllcyBvbiBzZWNvbmRhcnkgYW5kIHRoZW4gb24gcHJpbWFyeSBkaXNwbGF5IHRvIHNlZSBpZiB0aGUgc3RhY2sKKyAgICAgKiB2aXNpYmlsaXR5IGlzIG5vdCBhZmZlY3RlZC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMYXVuY2hBY3Rpdml0aWVzQWZmZWN0c1Zpc2liaWxpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gU3RhcnQgbGF1bmNoaW5nIGFjdGl2aXR5LgorICAgICAgICBsYXVuY2hBY3Rpdml0eShMQVVOQ0hJTkdfQUNUSVZJVFkpOworCisgICAgICAgIHRyeSAoZmluYWwgVmlydHVhbERpc3BsYXlTZXNzaW9uIHZpcnR1YWxEaXNwbGF5U2Vzc2lvbiA9IG5ldyBWaXJ0dWFsRGlzcGxheVNlc3Npb24oKSkgeworICAgICAgICAgICAgLy8gQ3JlYXRlIG5ldyB2aXJ0dWFsIGRpc3BsYXkuCisgICAgICAgICAgICBmaW5hbCBBY3Rpdml0eURpc3BsYXkgbmV3RGlzcGxheSA9IHZpcnR1YWxEaXNwbGF5U2Vzc2lvbi5jcmVhdGVEaXNwbGF5KCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoVklSVFVBTF9ESVNQTEFZX0FDVElWSVRZLCB0cnVlIC8qIHZpc2libGUgKi8pOworCisgICAgICAgICAgICAvLyBMYXVuY2ggYWN0aXZpdHkgb24gbmV3IHNlY29uZGFyeSBkaXNwbGF5LgorICAgICAgICAgICAgbGF1bmNoQWN0aXZpdHlPbkRpc3BsYXkoVEVTVF9BQ1RJVklUWSwgbmV3RGlzcGxheS5tSWQpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFRFU1RfQUNUSVZJVFksIHRydWUgLyogdmlzaWJsZSAqLyk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoVklSVFVBTF9ESVNQTEFZX0FDVElWSVRZLCB0cnVlIC8qIHZpc2libGUgKi8pOworCisgICAgICAgICAgICAvLyBMYXVuY2ggYWN0aXZpdHkgb24gcHJpbWFyeSBkaXNwbGF5IGFuZCBjaGVjayBpZiBpdCBkb2Vzbid0IGFmZmVjdCBhY3Rpdml0eSBvbgorICAgICAgICAgICAgLy8gc2Vjb25kYXJ5IGRpc3BsYXkuCisgICAgICAgICAgICBnZXRMYXVuY2hBY3Rpdml0eUJ1aWxkZXIoKS5zZXRUYXJnZXRBY3Rpdml0eShSRVNJWkVBQkxFX0FDVElWSVRZKS5leGVjdXRlKCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JWYWxpZFN0YXRlKFJFU0laRUFCTEVfQUNUSVZJVFkpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFRFU1RfQUNUSVZJVFksIHRydWUgLyogdmlzaWJsZSAqLyk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoUkVTSVpFQUJMRV9BQ1RJVklUWSwgdHJ1ZSAvKiB2aXNpYmxlICovKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhhdCBtb3ZlLXRhc2sgd29ya3Mgd2hlbiBtb3ZpbmcgYmV0d2VlbiBkaXNwbGF5cy4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNb3ZlVGFza0JldHdlZW5EaXNwbGF5cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgKGZpbmFsIFZpcnR1YWxEaXNwbGF5U2Vzc2lvbiB2aXJ0dWFsRGlzcGxheVNlc3Npb24gPSBuZXcgVmlydHVhbERpc3BsYXlTZXNzaW9uKCkpIHsKKyAgICAgICAgICAgIC8vIENyZWF0ZSBuZXcgdmlydHVhbCBkaXNwbGF5LgorICAgICAgICAgICAgZmluYWwgQWN0aXZpdHlEaXNwbGF5IG5ld0Rpc3BsYXkgPSB2aXJ0dWFsRGlzcGxheVNlc3Npb24uY3JlYXRlRGlzcGxheSgpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFZJUlRVQUxfRElTUExBWV9BQ1RJVklUWSwgdHJ1ZSAvKiB2aXNpYmxlICovKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZEFjdGl2aXR5KCJWaXJ0dWFsIGRpc3BsYXkgYWN0aXZpdHkgbXVzdCBiZSBmb2N1c2VkIiwKKyAgICAgICAgICAgICAgICAgICAgVklSVFVBTF9ESVNQTEFZX0FDVElWSVRZKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBkZWZhdWx0RGlzcGxheVN0YWNrSWQgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRGb2N1c2VkU3RhY2tJZCgpOworICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyU3RhdGUuQWN0aXZpdHlTdGFjayBmb2N1c2VkU3RhY2sgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja0J5SWQoCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHREaXNwbGF5U3RhY2tJZCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkZvY3VzIG11c3QgcmVtYWluIG9uIHByaW1hcnkgZGlzcGxheSIsCisgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfRElTUExBWSwgZm9jdXNlZFN0YWNrLm1EaXNwbGF5SWQpOworCisgICAgICAgICAgICAvLyBMYXVuY2ggYWN0aXZpdHkgb24gbmV3IHNlY29uZGFyeSBkaXNwbGF5LgorICAgICAgICAgICAgbGF1bmNoQWN0aXZpdHlPbkRpc3BsYXkoVEVTVF9BQ1RJVklUWSwgbmV3RGlzcGxheS5tSWQpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkQWN0aXZpdHkoIkZvY3VzIG11c3QgYmUgb24gc2Vjb25kYXJ5IGRpc3BsYXkiLAorICAgICAgICAgICAgICAgICAgICBURVNUX0FDVElWSVRZKTsKKyAgICAgICAgICAgIGludCBmb2N1c2VkU3RhY2tJZCA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEZvY3VzZWRTdGFja0lkKCk7CisgICAgICAgICAgICBmb2N1c2VkU3RhY2sgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja0J5SWQoZm9jdXNlZFN0YWNrSWQpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJGb2N1c2VkIHN0YWNrIG11c3QgYmUgb24gc2Vjb25kYXJ5IGRpc3BsYXkiLAorICAgICAgICAgICAgICAgICAgICBuZXdEaXNwbGF5Lm1JZCwgZm9jdXNlZFN0YWNrLm1EaXNwbGF5SWQpOworCisgICAgICAgICAgICAvLyBNb3ZlIGFjdGl2aXR5IGZyb20gc2Vjb25kYXJ5IGRpc3BsYXkgdG8gcHJpbWFyeS4KKyAgICAgICAgICAgIG1vdmVBY3Rpdml0eVRvU3RhY2soVEVTVF9BQ1RJVklUWSwgZGVmYXVsdERpc3BsYXlTdGFja0lkKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvckZvY3VzZWRTdGFjayhkZWZhdWx0RGlzcGxheVN0YWNrSWQpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkQWN0aXZpdHkoIkZvY3VzIG11c3QgYmUgb24gbW92ZWQgYWN0aXZpdHkiLCBURVNUX0FDVElWSVRZKTsKKyAgICAgICAgICAgIGZvY3VzZWRTdGFja0lkID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0Rm9jdXNlZFN0YWNrSWQoKTsKKyAgICAgICAgICAgIGZvY3VzZWRTdGFjayA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFN0YWNrQnlJZChmb2N1c2VkU3RhY2tJZCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkZvY3VzIG11c3QgcmV0dXJuIHRvIHByaW1hcnkgZGlzcGxheSIsCisgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfRElTUExBWSwgZm9jdXNlZFN0YWNrLm1EaXNwbGF5SWQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgbGF1bmNoaW5nIGFjdGl2aXRpZXMgb24gc2Vjb25kYXJ5IGRpc3BsYXkgYW5kIHRoZW4gcmVtb3ZpbmcgaXQgdG8gc2VlIGlmIHN0YWNrIGZvY3VzCisgICAgICogaXMgbW92ZWQgY29ycmVjdGx5LgorICAgICAqIFRoaXMgdmVyc2lvbiBsYXVuY2hlcyB2aXJ0dWFsIGRpc3BsYXkgY3JlYXRvciB0byBmdWxsc2NyZWVuIHN0YWNrIGluIHNwbGl0LXNjcmVlbi4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFja0ZvY3VzU3dpdGNoT25EaXNwbGF5UmVtb3ZlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3N1bWVUcnVlKHN1cHBvcnRzU3BsaXRTY3JlZW5NdWx0aVdpbmRvdygpKTsKKworICAgICAgICAvLyBTdGFydCBsYXVuY2hpbmcgYWN0aXZpdHkgaW50byBkb2NrZWQgc3RhY2suCisgICAgICAgIGxhdW5jaEFjdGl2aXRpZXNJblNwbGl0U2NyZWVuKAorICAgICAgICAgICAgICAgIGdldExhdW5jaEFjdGl2aXR5QnVpbGRlcigpLnNldFRhcmdldEFjdGl2aXR5KExBVU5DSElOR19BQ1RJVklUWSksCisgICAgICAgICAgICAgICAgZ2V0TGF1bmNoQWN0aXZpdHlCdWlsZGVyKCkuc2V0VGFyZ2V0QWN0aXZpdHkoVEVTVF9BQ1RJVklUWSkpOworICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoTEFVTkNISU5HX0FDVElWSVRZLCB0cnVlIC8qIHZpc2libGUgKi8pOworCisgICAgICAgIHRyeUNyZWF0aW5nQW5kUmVtb3ZpbmdEaXNwbGF5V2l0aEFjdGl2aXR5KHRydWUgLyogc3BsaXRTY3JlZW4gKi8sCisgICAgICAgICAgICAgICAgV0lORE9XSU5HX01PREVfU1BMSVRfU0NSRUVOX1NFQ09OREFSWSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgbGF1bmNoaW5nIGFjdGl2aXRpZXMgb24gc2Vjb25kYXJ5IGRpc3BsYXkgYW5kIHRoZW4gcmVtb3ZpbmcgaXQgdG8gc2VlIGlmIHN0YWNrIGZvY3VzCisgICAgICogaXMgbW92ZWQgY29ycmVjdGx5LgorICAgICAqIFRoaXMgdmVyc2lvbiBsYXVuY2hlcyB2aXJ0dWFsIGRpc3BsYXkgY3JlYXRvciB0byBkb2NrZWQgc3RhY2sgaW4gc3BsaXQtc2NyZWVuLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0YWNrRm9jdXNTd2l0Y2hPbkRpc3BsYXlSZW1vdmVkMigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3N1bWVUcnVlKHN1cHBvcnRzU3BsaXRTY3JlZW5NdWx0aVdpbmRvdygpKTsKKworICAgICAgICAvLyBTZXR1cCBzcGxpdC1zY3JlZW4uCisgICAgICAgIGxhdW5jaEFjdGl2aXRpZXNJblNwbGl0U2NyZWVuKAorICAgICAgICAgICAgICAgIGdldExhdW5jaEFjdGl2aXR5QnVpbGRlcigpLnNldFRhcmdldEFjdGl2aXR5KFRFU1RfQUNUSVZJVFkpLAorICAgICAgICAgICAgICAgIGdldExhdW5jaEFjdGl2aXR5QnVpbGRlcigpLnNldFRhcmdldEFjdGl2aXR5KExBVU5DSElOR19BQ1RJVklUWSkpOworICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoTEFVTkNISU5HX0FDVElWSVRZLCB0cnVlIC8qIHZpc2libGUgKi8pOworCisgICAgICAgIHRyeUNyZWF0aW5nQW5kUmVtb3ZpbmdEaXNwbGF5V2l0aEFjdGl2aXR5KHRydWUgLyogc3BsaXRTY3JlZW4gKi8sCisgICAgICAgICAgICAgICAgV0lORE9XSU5HX01PREVfU1BMSVRfU0NSRUVOX1NFQ09OREFSWSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgbGF1bmNoaW5nIGFjdGl2aXRpZXMgb24gc2Vjb25kYXJ5IGRpc3BsYXkgYW5kIHRoZW4gcmVtb3ZpbmcgaXQgdG8gc2VlIGlmIHN0YWNrIGZvY3VzCisgICAgICogaXMgbW92ZWQgY29ycmVjdGx5LgorICAgICAqIFRoaXMgdmVyc2lvbiB3b3JrcyB3aXRob3V0IHNwbGl0LXNjcmVlbi4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFja0ZvY3VzU3dpdGNoT25EaXNwbGF5UmVtb3ZlZDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gU3RhcnQgYW4gYWN0aXZpdHkgb24gZGVmYXVsdCBkaXNwbGF5IHRvIGRldGVybWluZSBkZWZhdWx0IHN0YWNrLgorICAgICAgICBsYXVuY2hBY3Rpdml0eShCUk9BRENBU1RfUkVDRUlWRVJfQUNUSVZJVFkpOworICAgICAgICBmaW5hbCBpbnQgZm9jdXNlZFN0YWNrV2luZG93aW5nTW9kZSA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEZyb250U3RhY2tXaW5kb3dpbmdNb2RlKAorICAgICAgICAgICAgICAgIERFRkFVTFRfRElTUExBWSk7CisgICAgICAgIC8vIEZpbmlzaCBwcm9iaW5nIGFjdGl2aXR5LgorICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKEZJTklTSF9BQ1RJVklUWV9CUk9BRENBU1QpOworCisgICAgICAgIHRyeUNyZWF0aW5nQW5kUmVtb3ZpbmdEaXNwbGF5V2l0aEFjdGl2aXR5KGZhbHNlIC8qIHNwbGl0U2NyZWVuICovLAorICAgICAgICAgICAgICAgIGZvY3VzZWRTdGFja1dpbmRvd2luZ01vZGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHZpcnR1YWwgZGlzcGxheSwgbGF1bmNoIGEgdGVzdCBhY3Rpdml0eSB0aGVyZSwgZGVzdHJveSB0aGUgZGlzcGxheSBhbmQgY2hlY2sgaWYgdGVzdAorICAgICAqIGFjdGl2aXR5IGlzIG1vdmVkIHRvIGEgc3RhY2sgb24gdGhlIGRlZmF1bHQgZGlzcGxheS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdHJ5Q3JlYXRpbmdBbmRSZW1vdmluZ0Rpc3BsYXlXaXRoQWN0aXZpdHkoYm9vbGVhbiBzcGxpdFNjcmVlbiwgaW50IHdpbmRvd2luZ01vZGUpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTG9nU2VwYXJhdG9yIGxvZ1NlcGFyYXRvcjsKKyAgICAgICAgdHJ5IChmaW5hbCBWaXJ0dWFsRGlzcGxheVNlc3Npb24gdmlydHVhbERpc3BsYXlTZXNzaW9uID0gbmV3IFZpcnR1YWxEaXNwbGF5U2Vzc2lvbigpKSB7CisgICAgICAgICAgICAvLyBDcmVhdGUgbmV3IHZpcnR1YWwgZGlzcGxheS4KKyAgICAgICAgICAgIGZpbmFsIEFjdGl2aXR5RGlzcGxheSBuZXdEaXNwbGF5ID0gdmlydHVhbERpc3BsYXlTZXNzaW9uCisgICAgICAgICAgICAgICAgICAgIC5zZXRQdWJsaWNEaXNwbGF5KHRydWUpCisgICAgICAgICAgICAgICAgICAgIC5zZXRMYXVuY2hJblNwbGl0U2NyZWVuKHNwbGl0U2NyZWVuKQorICAgICAgICAgICAgICAgICAgICAuY3JlYXRlRGlzcGxheSgpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFZJUlRVQUxfRElTUExBWV9BQ1RJVklUWSwgdHJ1ZSAvKiB2aXNpYmxlICovKTsKKyAgICAgICAgICAgIGlmIChzcGxpdFNjcmVlbikgeworICAgICAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShMQVVOQ0hJTkdfQUNUSVZJVFksIHRydWUgLyogdmlzaWJsZSAqLyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIExhdW5jaCBhY3Rpdml0eSBvbiBuZXcgc2Vjb25kYXJ5IGRpc3BsYXkuCisgICAgICAgICAgICBsYXVuY2hBY3Rpdml0eU9uRGlzcGxheShSRVNJWkVBQkxFX0FDVElWSVRZLCBuZXdEaXNwbGF5Lm1JZCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRBY3Rpdml0eSgiRm9jdXMgbXVzdCBiZSBvbiBzZWNvbmRhcnkgZGlzcGxheSIsCisgICAgICAgICAgICAgICAgICAgIFJFU0laRUFCTEVfQUNUSVZJVFkpOworICAgICAgICAgICAgZmluYWwgaW50IGZyb250U3RhY2tJZCA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEZyb250U3RhY2tJZChuZXdEaXNwbGF5Lm1JZCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRTdGFjaygiRm9jdXMgbXVzdCBiZSBvbiBzZWNvbmRhcnkgZGlzcGxheSIsIGZyb250U3RhY2tJZCk7CisKKyAgICAgICAgICAgIC8vIERlc3Ryb3kgdmlydHVhbCBkaXNwbGF5LgorICAgICAgICAgICAgbG9nU2VwYXJhdG9yID0gc2VwYXJhdGVMb2dzKCk7CisgICAgICAgIH0KKworICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZSh0cnVlKTsKKyAgICAgICAgYXNzZXJ0QWN0aXZpdHlMaWZlY3ljbGUoUkVTSVpFQUJMRV9BQ1RJVklUWSwgZmFsc2UgLyogcmVsYXVuY2hlZCAqLywgbG9nU2VwYXJhdG9yKTsKKyAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yVmFsaWRTdGF0ZShuZXcgV2FpdEZvclZhbGlkQWN0aXZpdHlTdGF0ZS5CdWlsZGVyKFJFU0laRUFCTEVfQUNUSVZJVFkpCisgICAgICAgICAgICAgICAgLnNldFdpbmRvd2luZ01vZGUod2luZG93aW5nTW9kZSkKKyAgICAgICAgICAgICAgICAuc2V0QWN0aXZpdHlUeXBlKEFDVElWSVRZX1RZUEVfU1RBTkRBUkQpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFNhbml0eSgpOworICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZhbGlkQm91bmRzKHRydWUgLyogY29tcGFyZVRhc2tBbmRTdGFja0JvdW5kcyAqLyk7CisKKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGZvY3VzIGlzIHN3aXRjaGVkIGJhY2sgdG8gcHJpbWFyeSBkaXNwbGF5LgorICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoUkVTSVpFQUJMRV9BQ1RJVklUWSwgdHJ1ZSAvKiB2aXNpYmxlICovKTsKKyAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkU3RhY2soCisgICAgICAgICAgICAgICAgIkRlZmF1bHQgc3RhY2sgb24gcHJpbWFyeSBkaXNwbGF5IG11c3QgYmUgZm9jdXNlZCBhZnRlciBkaXNwbGF5IHJlbW92ZWQiLAorICAgICAgICAgICAgICAgIHdpbmRvd2luZ01vZGUsIEFDVElWSVRZX1RZUEVfU1RBTkRBUkQpOworICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRBY3Rpdml0eSgKKyAgICAgICAgICAgICAgICAiRm9jdXMgbXVzdCBiZSBzd2l0Y2hlZCBiYWNrIHRvIGFjdGl2aXR5IG9uIHByaW1hcnkgZGlzcGxheSIsCisgICAgICAgICAgICAgICAgUkVTSVpFQUJMRV9BQ1RJVklUWSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgbGF1bmNoaW5nIGFjdGl2aXRpZXMgb24gc2Vjb25kYXJ5IGRpc3BsYXkgYW5kIHRoZW4gcmVtb3ZpbmcgaXQgdG8gc2VlIGlmIHN0YWNrIGZvY3VzCisgICAgICogaXMgbW92ZWQgY29ycmVjdGx5LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0YWNrRm9jdXNTd2l0Y2hPblN0YWNrRW1wdGllZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgKGZpbmFsIFZpcnR1YWxEaXNwbGF5U2Vzc2lvbiB2aXJ0dWFsRGlzcGxheVNlc3Npb24gPSBuZXcgVmlydHVhbERpc3BsYXlTZXNzaW9uKCk7CisgICAgICAgICAgICAgZmluYWwgTG9ja1NjcmVlblNlc3Npb24gbG9ja1NjcmVlblNlc3Npb24gPSBuZXcgTG9ja1NjcmVlblNlc3Npb24oKSkgeworICAgICAgICAgICAgLy8gQ3JlYXRlIG5ldyB2aXJ0dWFsIGRpc3BsYXkuCisgICAgICAgICAgICBmaW5hbCBBY3Rpdml0eURpc3BsYXkgbmV3RGlzcGxheSA9IHZpcnR1YWxEaXNwbGF5U2Vzc2lvbi5jcmVhdGVEaXNwbGF5KCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoVklSVFVBTF9ESVNQTEFZX0FDVElWSVRZLCB0cnVlIC8qIHZpc2libGUgKi8pOworICAgICAgICAgICAgZmluYWwgaW50IGZvY3VzZWRTdGFja0lkID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0RnJvbnRTdGFja0lkKERFRkFVTFRfRElTUExBWSk7CisKKyAgICAgICAgICAgIC8vIExhdW5jaCBhY3Rpdml0eSBvbiBuZXcgc2Vjb25kYXJ5IGRpc3BsYXkuCisgICAgICAgICAgICBsYXVuY2hBY3Rpdml0eU9uRGlzcGxheShCUk9BRENBU1RfUkVDRUlWRVJfQUNUSVZJVFksIG5ld0Rpc3BsYXkubUlkKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZEFjdGl2aXR5KCJGb2N1cyBtdXN0IGJlIG9uIHNlY29uZGFyeSBkaXNwbGF5IiwKKyAgICAgICAgICAgICAgICAgICAgQlJPQURDQVNUX1JFQ0VJVkVSX0FDVElWSVRZKTsKKworICAgICAgICAgICAgLy8gTG9jayB0aGUgZGV2aWNlLCBzbyB0aGF0IGFjdGl2aXR5IGNvbnRhaW5lcnMgd2lsbCBiZSBkZXRhY2hlZC4KKyAgICAgICAgICAgIGxvY2tTY3JlZW5TZXNzaW9uLnNsZWVwRGV2aWNlKCk7CisKKyAgICAgICAgICAgIC8vIEZpbmlzaCBhY3Rpdml0eSBvbiBzZWNvbmRhcnkgZGlzcGxheS4KKyAgICAgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoRklOSVNIX0FDVElWSVRZX0JST0FEQ0FTVCk7CisKKyAgICAgICAgICAgIC8vIFVubG9jayBhbmQgY2hlY2sgaWYgdGhlIGZvY3VzIGlzIHN3aXRjaGVkIGJhY2sgdG8gcHJpbWFyeSBkaXNwbGF5LgorICAgICAgICAgICAgbG9ja1NjcmVlblNlc3Npb24ud2FrZVVwRGV2aWNlKCkKKyAgICAgICAgICAgICAgICAgICAgLnVubG9ja0RldmljZSgpOworICAgICAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yRm9jdXNlZFN0YWNrKGZvY3VzZWRTdGFja0lkKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvclZhbGlkU3RhdGUoVklSVFVBTF9ESVNQTEFZX0FDVElWSVRZKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShWSVJUVUFMX0RJU1BMQVlfQUNUSVZJVFksIHRydWUgLyogdmlzaWJsZSAqLyk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRBY3Rpdml0eSgiRm9jdXMgbXVzdCBiZSBzd2l0Y2hlZCBiYWNrIHRvIHByaW1hcnkgZGlzcGxheSIsCisgICAgICAgICAgICAgICAgICAgIFZJUlRVQUxfRElTUExBWV9BQ1RJVklUWSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB0aGF0IGlucHV0IGV2ZW50cyBvbiB0aGUgcHJpbWFyeSBkaXNwbGF5IHRha2UgZm9jdXMgZnJvbSB0aGUgdmlydHVhbCBkaXNwbGF5LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0YWNrRm9jdXNTd2l0Y2hPblRvdWNoRXZlbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IChmaW5hbCBWaXJ0dWFsRGlzcGxheVNlc3Npb24gdmlydHVhbERpc3BsYXlTZXNzaW9uID0gbmV3IFZpcnR1YWxEaXNwbGF5U2Vzc2lvbigpKSB7CisgICAgICAgICAgICAvLyBDcmVhdGUgbmV3IHZpcnR1YWwgZGlzcGxheS4KKyAgICAgICAgICAgIGZpbmFsIEFjdGl2aXR5RGlzcGxheSBuZXdEaXNwbGF5ID0gdmlydHVhbERpc3BsYXlTZXNzaW9uLmNyZWF0ZURpc3BsYXkoKTsKKworICAgICAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUoVklSVFVBTF9ESVNQTEFZX0FDVElWSVRZKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZEFjdGl2aXR5KCJGb2N1cyBtdXN0IGJlIHN3aXRjaGVkIGJhY2sgdG8gcHJpbWFyeSBkaXNwbGF5IiwKKyAgICAgICAgICAgICAgICAgICAgVklSVFVBTF9ESVNQTEFZX0FDVElWSVRZKTsKKworICAgICAgICAgICAgbGF1bmNoQWN0aXZpdHlPbkRpc3BsYXkoVEVTVF9BQ1RJVklUWSwgbmV3RGlzcGxheS5tSWQpOworCisgICAgICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShURVNUX0FDVElWSVRZKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZEFjdGl2aXR5KAorICAgICAgICAgICAgICAgICAgICAiQWN0aXZpdHkgbGF1bmNoZWQgb24gc2Vjb25kYXJ5IGRpc3BsYXkgbXVzdCBiZSBmb2N1c2VkIiwKKyAgICAgICAgICAgICAgICAgICAgVEVTVF9BQ1RJVklUWSk7CisKKyAgICAgICAgICAgIGZpbmFsIFJlcG9ydGVkRGlzcGxheU1ldHJpY3MgZGlzcGxheU1ldHJpY3MgPSBnZXREaXNwbGF5TWV0cmljcygpOworICAgICAgICAgICAgZmluYWwgaW50IHdpZHRoID0gZGlzcGxheU1ldHJpY3MuZ2V0U2l6ZSgpLmdldFdpZHRoKCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gZGlzcGxheU1ldHJpY3MuZ2V0U2l6ZSgpLmdldEhlaWdodCgpOworICAgICAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZCgiaW5wdXQgdGFwICIgKyAod2lkdGggLyAyKSArICIgIiArIChoZWlnaHQgLyAyKSk7CisKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKFZJUlRVQUxfRElTUExBWV9BQ1RJVklUWSk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRBY3Rpdml0eSgiRm9jdXMgbXVzdCBiZSBzd2l0Y2hlZCBiYWNrIHRvIHByaW1hcnkgZGlzcGxheSIsCisgICAgICAgICAgICAgICAgICAgIFZJUlRVQUxfRElTUExBWV9BQ1RJVklUWSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogVGVzdCB0aGF0IHNoZWxsIGlzIGFsbG93ZWQgdG8gbGF1bmNoIG9uIHNlY29uZGFyeSBkaXNwbGF5cy4gKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQZXJtaXNzaW9uTGF1bmNoRnJvbVNoZWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSAoZmluYWwgVmlydHVhbERpc3BsYXlTZXNzaW9uIHZpcnR1YWxEaXNwbGF5U2Vzc2lvbiA9IG5ldyBWaXJ0dWFsRGlzcGxheVNlc3Npb24oKSkgeworICAgICAgICAgICAgLy8gQ3JlYXRlIG5ldyB2aXJ0dWFsIGRpc3BsYXkuCisgICAgICAgICAgICBmaW5hbCBBY3Rpdml0eURpc3BsYXkgbmV3RGlzcGxheSA9IHZpcnR1YWxEaXNwbGF5U2Vzc2lvbi5jcmVhdGVEaXNwbGF5KCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoVklSVFVBTF9ESVNQTEFZX0FDVElWSVRZLCB0cnVlIC8qIHZpc2libGUgKi8pOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkQWN0aXZpdHkoIlZpcnR1YWwgZGlzcGxheSBhY3Rpdml0eSBtdXN0IGJlIGZvY3VzZWQiLAorICAgICAgICAgICAgICAgICAgICBWSVJUVUFMX0RJU1BMQVlfQUNUSVZJVFkpOworICAgICAgICAgICAgZmluYWwgaW50IGRlZmF1bHREaXNwbGF5Rm9jdXNlZFN0YWNrSWQgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRGb2N1c2VkU3RhY2tJZCgpOworICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyU3RhdGUuQWN0aXZpdHlTdGFjayBmb2N1c2VkU3RhY2sgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja0J5SWQoCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHREaXNwbGF5Rm9jdXNlZFN0YWNrSWQpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJGb2N1cyBtdXN0IHJlbWFpbiBvbiBwcmltYXJ5IGRpc3BsYXkiLAorICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0RJU1BMQVksIGZvY3VzZWRTdGFjay5tRGlzcGxheUlkKTsKKworICAgICAgICAgICAgLy8gTGF1bmNoIGFjdGl2aXR5IG9uIG5ldyBzZWNvbmRhcnkgZGlzcGxheS4KKyAgICAgICAgICAgIGxhdW5jaEFjdGl2aXR5T25EaXNwbGF5KFRFU1RfQUNUSVZJVFksIG5ld0Rpc3BsYXkubUlkKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZEFjdGl2aXR5KCJGb2N1cyBtdXN0IGJlIG9uIHNlY29uZGFyeSBkaXNwbGF5IiwKKyAgICAgICAgICAgICAgICAgICAgVEVTVF9BQ1RJVklUWSk7CisgICAgICAgICAgICBmaW5hbCBpbnQgZXh0ZXJuYWxGb2N1c2VkU3RhY2tJZCA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEZvY3VzZWRTdGFja0lkKCk7CisgICAgICAgICAgICBmb2N1c2VkU3RhY2sgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja0J5SWQoZXh0ZXJuYWxGb2N1c2VkU3RhY2tJZCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkZvY3VzZWQgc3RhY2sgbXVzdCBiZSBvbiBzZWNvbmRhcnkgZGlzcGxheSIsIG5ld0Rpc3BsYXkubUlkLAorICAgICAgICAgICAgICAgICAgICBmb2N1c2VkU3RhY2subURpc3BsYXlJZCk7CisKKyAgICAgICAgICAgIC8vIExhdW5jaCBvdGhlciBhY3Rpdml0eSB3aXRoIGRpZmZlcmVudCB1aWQgYW5kIGNoZWNrIGl0IGlzIGxhdW5jaGVkIG9uIGR5bmFtaWMgc3RhY2sgb24KKyAgICAgICAgICAgIC8vIHNlY29uZGFyeSBkaXNwbGF5LgorICAgICAgICAgICAgZmluYWwgU3RyaW5nIHN0YXJ0Q21kID0gImFtIHN0YXJ0IC1uICIgKyBnZXRBY3Rpdml0eU5hbWUoU0VDT05EX0FDVElWSVRZKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAtLWRpc3BsYXkgIiArIG5ld0Rpc3BsYXkubUlkOworICAgICAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChzdGFydENtZCk7CisKKyAgICAgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvclZhbGlkU3RhdGUoU0VDT05EX0FDVElWSVRZKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZEFjdGl2aXR5KAorICAgICAgICAgICAgICAgICAgICAiRm9jdXMgbXVzdCBiZSBvbiBuZXdseSBsYXVuY2hlZCBhcHAiLCBTRUNPTkRfQUNUSVZJVFkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJBY3Rpdml0eSBsYXVuY2hlZCBieSBzeXN0ZW0gbXVzdCBiZSBvbiBleHRlcm5hbCBkaXNwbGF5IiwKKyAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWxGb2N1c2VkU3RhY2tJZCwgbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0Rm9jdXNlZFN0YWNrSWQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogVGVzdCB0aGF0IGxhdW5jaGluZyBmcm9tIGFwcCB0aGF0IGlzIG9uIGV4dGVybmFsIGRpc3BsYXkgaXMgYWxsb3dlZC4gKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQZXJtaXNzaW9uTGF1bmNoRnJvbUFwcE9uU2Vjb25kYXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSAoZmluYWwgVmlydHVhbERpc3BsYXlTZXNzaW9uIHZpcnR1YWxEaXNwbGF5U2Vzc2lvbiA9IG5ldyBWaXJ0dWFsRGlzcGxheVNlc3Npb24oKSkgeworICAgICAgICAgICAgLy8gQ3JlYXRlIG5ldyBzaW11bGF0ZWQgZGlzcGxheS4KKyAgICAgICAgICAgIGZpbmFsIEFjdGl2aXR5RGlzcGxheSBuZXdEaXNwbGF5ID0gdmlydHVhbERpc3BsYXlTZXNzaW9uLnNldFNpbXVsYXRlRGlzcGxheSh0cnVlKQorICAgICAgICAgICAgICAgICAgICAuY3JlYXRlRGlzcGxheSgpOworCisgICAgICAgICAgICAvLyBMYXVuY2ggYWN0aXZpdHkgd2l0aCBkaWZmZXJlbnQgdWlkIG9uIHNlY29uZGFyeSBkaXNwbGF5LgorICAgICAgICAgICAgZmluYWwgU3RyaW5nIHN0YXJ0Q21kID0gImFtIHN0YXJ0IC1uICIgKyBnZXRBY3Rpdml0eU5hbWUoU0VDT05EX0FDVElWSVRZKQorICAgICAgICAgICAgICAgICAgICArICIgLS1kaXNwbGF5ICIgKyBuZXdEaXNwbGF5Lm1JZDsKKyAgICAgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoc3RhcnRDbWQpOworCisgICAgICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JWYWxpZFN0YXRlKFNFQ09ORF9BQ1RJVklUWSk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRBY3Rpdml0eSgKKyAgICAgICAgICAgICAgICAgICAgIkZvY3VzIG11c3QgYmUgb24gbmV3bHkgbGF1bmNoZWQgYXBwIiwgU0VDT05EX0FDVElWSVRZKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBleHRlcm5hbEZvY3VzZWRTdGFja0lkID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0Rm9jdXNlZFN0YWNrSWQoKTsKKyAgICAgICAgICAgIEFjdGl2aXR5TWFuYWdlclN0YXRlLkFjdGl2aXR5U3RhY2sgZm9jdXNlZFN0YWNrID0KKyAgICAgICAgICAgICAgICAgICAgbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0U3RhY2tCeUlkKGV4dGVybmFsRm9jdXNlZFN0YWNrSWQpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJGb2N1c2VkIHN0YWNrIG11c3QgYmUgb24gc2Vjb25kYXJ5IGRpc3BsYXkiLCBuZXdEaXNwbGF5Lm1JZCwKKyAgICAgICAgICAgICAgICAgICAgZm9jdXNlZFN0YWNrLm1EaXNwbGF5SWQpOworCisgICAgICAgICAgICAvLyBMYXVuY2ggYW5vdGhlciBhY3Rpdml0eSB3aXRoIHRoaXJkIGRpZmZlcmVudCB1aWQgZnJvbSBhcHAgb24gc2Vjb25kYXJ5IGRpc3BsYXkgYW5kCisgICAgICAgICAgICAvLyBjaGVjayBpdCBpcyBsYXVuY2hlZCBvbiBzZWNvbmRhcnkgZGlzcGxheS4KKyAgICAgICAgICAgIGdldExhdW5jaEFjdGl2aXR5QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgIC5zZXRVc2VCcm9hZGNhc3RSZWNlaXZlcihTRUNPTkRfTEFVTkNIX0JST0FEQ0FTVF9SRUNFSVZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUNPTkRfTEFVTkNIX0JST0FEQ0FTVF9BQ1RJT04pCisgICAgICAgICAgICAgICAgICAgIC5zZXREaXNwbGF5SWQobmV3RGlzcGxheS5tSWQpCisgICAgICAgICAgICAgICAgICAgIC5zZXRUYXJnZXRBY3Rpdml0eShUSElSRF9BQ1RJVklUWSkKKyAgICAgICAgICAgICAgICAgICAgLmV4ZWN1dGUoKTsKKworICAgICAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yVmFsaWRTdGF0ZShUSElSRF9BQ1RJVklUWSk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRBY3Rpdml0eSgiRm9jdXMgbXVzdCBiZSBvbiBuZXdseSBsYXVuY2hlZCBhcHAiLCBUSElSRF9BQ1RJVklUWSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkFjdGl2aXR5IGxhdW5jaGVkIGJ5IGFwcCBvbiBzZWNvbmRhcnkgZGlzcGxheSBtdXN0IGJlIG9uIHRoYXQgZGlzcGxheSIsCisgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsRm9jdXNlZFN0YWNrSWQsIG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEZvY3VzZWRTdGFja0lkKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIFRlc3RzIHRoYXQgYW4gYWN0aXZpdHkgY2FuIGxhdW5jaCBhbiBhY3Rpdml0eSBmcm9tIGEgZGlmZmVyZW50IFVJRCBpbnRvIGl0cyBvd24gdGFzay4gKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQZXJtaXNzaW9uTGF1bmNoTXVsdGlVaWRUYXNrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSAoZmluYWwgVmlydHVhbERpc3BsYXlTZXNzaW9uIHZpcnR1YWxEaXNwbGF5U2Vzc2lvbiA9IG5ldyBWaXJ0dWFsRGlzcGxheVNlc3Npb24oKSkgeworICAgICAgICAgICAgZmluYWwgQWN0aXZpdHlEaXNwbGF5IG5ld0Rpc3BsYXkgPSB2aXJ0dWFsRGlzcGxheVNlc3Npb24uc2V0U2ltdWxhdGVEaXNwbGF5KHRydWUpCisgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVEaXNwbGF5KCk7CisKKyAgICAgICAgICAgIGxhdW5jaEFjdGl2aXR5T25EaXNwbGF5KExBVU5DSElOR19BQ1RJVklUWSwgbmV3RGlzcGxheS5tSWQpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUoTEFVTkNISU5HX0FDVElWSVRZKTsKKworICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgZmlyc3QgYWN0aXZpdHkgaXMgbGF1bmNoZWQgb250byB0aGUgc2Vjb25kYXJ5IGRpc3BsYXkKKyAgICAgICAgICAgIGZpbmFsIGludCBmcm9udFN0YWNrSWQgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRGcm9udFN0YWNrSWQobmV3RGlzcGxheS5tSWQpOworICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyU3RhdGUuQWN0aXZpdHlTdGFjayBmcm9udFN0YWNrID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0U3RhY2tCeUlkKAorICAgICAgICAgICAgICAgICAgICBmcm9udFN0YWNrSWQpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJBY3Rpdml0eSBsYXVuY2hlZCBvbiBzZWNvbmRhcnkgZGlzcGxheSBtdXN0IGJlIHJlc3VtZWQiLAorICAgICAgICAgICAgICAgICAgICBnZXRBY3Rpdml0eU5hbWUoTEFVTkNISU5HX0FDVElWSVRZKSwKKyAgICAgICAgICAgICAgICAgICAgZnJvbnRTdGFjay5tUmVzdW1lZEFjdGl2aXR5KTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZFN0YWNrKCJGb2N1cyBtdXN0IGJlIG9uIHNlY29uZGFyeSBkaXNwbGF5IiwgZnJvbnRTdGFja0lkKTsKKworICAgICAgICAgICAgLy8gTGF1bmNoIGFuIGFjdGl2aXR5IGZyb20gYSBkaWZmZXJlbnQgVUlEIGludG8gdGhlIGZpcnN0IGFjdGl2aXR5J3MgdGFzaworICAgICAgICAgICAgZ2V0TGF1bmNoQWN0aXZpdHlCdWlsZGVyKCkuc2V0VGFyZ2V0QWN0aXZpdHkoU0VDT05EX0FDVElWSVRZKS5leGVjdXRlKCk7CisKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZFN0YWNrKCJGb2N1cyBtdXN0IGJlIG9uIHNlY29uZGFyeSBkaXNwbGF5IiwgZnJvbnRTdGFja0lkKTsKKyAgICAgICAgICAgIGZyb250U3RhY2sgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja0J5SWQoZnJvbnRTdGFja0lkKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZEFjdGl2aXR5KAorICAgICAgICAgICAgICAgICAgICAiRm9jdXMgbXVzdCBiZSBvbiBuZXdseSBsYXVuY2hlZCBhcHAiLCBTRUNPTkRfQUNUSVZJVFkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJTZWNvbmRhcnkgZGlzcGxheSBtdXN0IGNvbnRhaW4gMSB0YXNrIiwgMSwgZnJvbnRTdGFjay5nZXRUYXNrcygpLnNpemUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoYXQgbGF1bmNoaW5nIGZyb20gZGlzcGxheSBvd25lciBpcyBhbGxvd2VkIGV2ZW4gd2hlbiB0aGUgdGhlIGRpc3BsYXkgb3duZXIKKyAgICAgKiBkb2Vzbid0IGhhdmUgYW55dGhpbmcgb24gdGhlIGRpc3BsYXkuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGVybWlzc2lvbkxhdW5jaEZyb21Pd25lcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgKGZpbmFsIFZpcnR1YWxEaXNwbGF5U2Vzc2lvbiB2aXJ0dWFsRGlzcGxheVNlc3Npb24gPSBuZXcgVmlydHVhbERpc3BsYXlTZXNzaW9uKCkpIHsKKyAgICAgICAgICAgIC8vIENyZWF0ZSBuZXcgdmlydHVhbCBkaXNwbGF5LgorICAgICAgICAgICAgZmluYWwgQWN0aXZpdHlEaXNwbGF5IG5ld0Rpc3BsYXkgPSB2aXJ0dWFsRGlzcGxheVNlc3Npb24uY3JlYXRlRGlzcGxheSgpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFZJUlRVQUxfRElTUExBWV9BQ1RJVklUWSwgdHJ1ZSAvKiB2aXNpYmxlICovKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZEFjdGl2aXR5KCJWaXJ0dWFsIGRpc3BsYXkgYWN0aXZpdHkgbXVzdCBiZSBmb2N1c2VkIiwKKyAgICAgICAgICAgICAgICAgICAgVklSVFVBTF9ESVNQTEFZX0FDVElWSVRZKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBkZWZhdWx0RGlzcGxheUZvY3VzZWRTdGFja0lkID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0Rm9jdXNlZFN0YWNrSWQoKTsKKyAgICAgICAgICAgIEFjdGl2aXR5TWFuYWdlclN0YXRlLkFjdGl2aXR5U3RhY2sgZm9jdXNlZFN0YWNrID0KKyAgICAgICAgICAgICAgICAgICAgbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0U3RhY2tCeUlkKGRlZmF1bHREaXNwbGF5Rm9jdXNlZFN0YWNrSWQpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJGb2N1cyBtdXN0IHJlbWFpbiBvbiBwcmltYXJ5IGRpc3BsYXkiLAorICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0RJU1BMQVksIGZvY3VzZWRTdGFjay5tRGlzcGxheUlkKTsKKworICAgICAgICAgICAgLy8gTGF1bmNoIG90aGVyIGFjdGl2aXR5IHdpdGggZGlmZmVyZW50IHVpZCBvbiBzZWNvbmRhcnkgZGlzcGxheS4KKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzdGFydENtZCA9ICJhbSBzdGFydCAtbiAiICsgZ2V0QWN0aXZpdHlOYW1lKFNFQ09ORF9BQ1RJVklUWSkKKyAgICAgICAgICAgICAgICAgICAgKyAiIC0tZGlzcGxheSAiICsgbmV3RGlzcGxheS5tSWQ7CisgICAgICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKHN0YXJ0Q21kKTsKKworICAgICAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yVmFsaWRTdGF0ZShTRUNPTkRfQUNUSVZJVFkpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkQWN0aXZpdHkoCisgICAgICAgICAgICAgICAgICAgICJGb2N1cyBtdXN0IGJlIG9uIG5ld2x5IGxhdW5jaGVkIGFwcCIsIFNFQ09ORF9BQ1RJVklUWSk7CisgICAgICAgICAgICBmaW5hbCBpbnQgZXh0ZXJuYWxGb2N1c2VkU3RhY2tJZCA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEZvY3VzZWRTdGFja0lkKCk7CisgICAgICAgICAgICBmb2N1c2VkU3RhY2sgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja0J5SWQoZXh0ZXJuYWxGb2N1c2VkU3RhY2tJZCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkZvY3VzZWQgc3RhY2sgbXVzdCBiZSBvbiBzZWNvbmRhcnkgZGlzcGxheSIsIG5ld0Rpc3BsYXkubUlkLAorICAgICAgICAgICAgICAgICAgICBmb2N1c2VkU3RhY2subURpc3BsYXlJZCk7CisKKyAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgb3duZXIgdWlkIGNhbiBsYXVuY2ggaXRzIG93biBhY3Rpdml0eSBvbiBzZWNvbmRhcnkgZGlzcGxheS4KKyAgICAgICAgICAgIGdldExhdW5jaEFjdGl2aXR5QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgIC5zZXRVc2VCcm9hZGNhc3RSZWNlaXZlcihMQVVOQ0hfQlJPQURDQVNUX1JFQ0VJVkVSLCBMQVVOQ0hfQlJPQURDQVNUX0FDVElPTikKKyAgICAgICAgICAgICAgICAgICAgLnNldE5ld1Rhc2sodHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgLnNldE11bHRpcGxlVGFzayh0cnVlKQorICAgICAgICAgICAgICAgICAgICAuc2V0RGlzcGxheUlkKG5ld0Rpc3BsYXkubUlkKQorICAgICAgICAgICAgICAgICAgICAuZXhlY3V0ZSgpOworCisgICAgICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JWYWxpZFN0YXRlKFRFU1RfQUNUSVZJVFkpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkQWN0aXZpdHkoIkZvY3VzIG11c3QgYmUgb24gbmV3bHkgbGF1bmNoZWQgYXBwIiwKKyAgICAgICAgICAgICAgICAgICAgVEVTVF9BQ1RJVklUWSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkFjdGl2aXR5IGxhdW5jaGVkIGJ5IG93bmVyIG11c3QgYmUgb24gZXh0ZXJuYWwgZGlzcGxheSIsCisgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsRm9jdXNlZFN0YWNrSWQsIG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEZvY3VzZWRTdGFja0lkKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0aGF0IGxhdW5jaGluZyBmcm9tIGFwcCB0aGF0IGlzIG5vdCBwcmVzZW50IG9uIGV4dGVybmFsIGRpc3BsYXkgYW5kIGRvZXNuJ3Qgb3duIGl0IHRvCisgICAgICogdGhhdCBleHRlcm5hbCBkaXNwbGF5IGlzIG5vdCBhbGxvd2VkLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBlcm1pc3Npb25MYXVuY2hGcm9tRGlmZmVyZW50QXBwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSAoZmluYWwgVmlydHVhbERpc3BsYXlTZXNzaW9uIHZpcnR1YWxEaXNwbGF5U2Vzc2lvbiA9IG5ldyBWaXJ0dWFsRGlzcGxheVNlc3Npb24oKSkgeworICAgICAgICAgICAgLy8gQ3JlYXRlIG5ldyB2aXJ0dWFsIGRpc3BsYXkuCisgICAgICAgICAgICBmaW5hbCBBY3Rpdml0eURpc3BsYXkgbmV3RGlzcGxheSA9IHZpcnR1YWxEaXNwbGF5U2Vzc2lvbi5jcmVhdGVEaXNwbGF5KCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoVklSVFVBTF9ESVNQTEFZX0FDVElWSVRZLCB0cnVlIC8qIHZpc2libGUgKi8pOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkQWN0aXZpdHkoIlZpcnR1YWwgZGlzcGxheSBhY3Rpdml0eSBtdXN0IGJlIGZvY3VzZWQiLAorICAgICAgICAgICAgICAgICAgICBWSVJUVUFMX0RJU1BMQVlfQUNUSVZJVFkpOworICAgICAgICAgICAgZmluYWwgaW50IGRlZmF1bHREaXNwbGF5Rm9jdXNlZFN0YWNrSWQgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRGb2N1c2VkU3RhY2tJZCgpOworICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyU3RhdGUuQWN0aXZpdHlTdGFjayBmb2N1c2VkU3RhY2sgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja0J5SWQoCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHREaXNwbGF5Rm9jdXNlZFN0YWNrSWQpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJGb2N1cyBtdXN0IHJlbWFpbiBvbiBwcmltYXJ5IGRpc3BsYXkiLAorICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0RJU1BMQVksIGZvY3VzZWRTdGFjay5tRGlzcGxheUlkKTsKKworICAgICAgICAgICAgLy8gTGF1bmNoIGFjdGl2aXR5IG9uIG5ldyBzZWNvbmRhcnkgZGlzcGxheS4KKyAgICAgICAgICAgIGxhdW5jaEFjdGl2aXR5T25EaXNwbGF5KFRFU1RfQUNUSVZJVFksIG5ld0Rpc3BsYXkubUlkKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZEFjdGl2aXR5KCJGb2N1cyBtdXN0IGJlIG9uIHNlY29uZGFyeSBkaXNwbGF5IiwKKyAgICAgICAgICAgICAgICAgICAgVEVTVF9BQ1RJVklUWSk7CisgICAgICAgICAgICBmaW5hbCBpbnQgZXh0ZXJuYWxGb2N1c2VkU3RhY2tJZCA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEZvY3VzZWRTdGFja0lkKCk7CisgICAgICAgICAgICBmb2N1c2VkU3RhY2sgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja0J5SWQoZXh0ZXJuYWxGb2N1c2VkU3RhY2tJZCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkZvY3VzZWQgc3RhY2sgbXVzdCBiZSBvbiBzZWNvbmRhcnkgZGlzcGxheSIsIG5ld0Rpc3BsYXkubUlkLAorICAgICAgICAgICAgICAgICAgICBmb2N1c2VkU3RhY2subURpc3BsYXlJZCk7CisKKyAgICAgICAgICAgIGZpbmFsIExvZ1NlcGFyYXRvciBsb2dTZXBhcmF0b3IgPSBzZXBhcmF0ZUxvZ3MoKTsKKworICAgICAgICAgICAgLy8gTGF1bmNoIG90aGVyIGFjdGl2aXR5IHdpdGggZGlmZmVyZW50IHVpZCBhbmQgY2hlY2sgc2VjdXJpdHkgZXhjZXB0aW9uIGlzIHRyaWdnZXJlZC4KKyAgICAgICAgICAgIGdldExhdW5jaEFjdGl2aXR5QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgIC5zZXRVc2VCcm9hZGNhc3RSZWNlaXZlcihTRUNPTkRfTEFVTkNIX0JST0FEQ0FTVF9SRUNFSVZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUNPTkRfTEFVTkNIX0JST0FEQ0FTVF9BQ1RJT04pCisgICAgICAgICAgICAgICAgICAgIC5zZXREaXNwbGF5SWQobmV3RGlzcGxheS5tSWQpCisgICAgICAgICAgICAgICAgICAgIC5zZXRUYXJnZXRBY3Rpdml0eShUSElSRF9BQ1RJVklUWSkKKyAgICAgICAgICAgICAgICAgICAgLmV4ZWN1dGUoKTsKKworICAgICAgICAgICAgYXNzZXJ0U2VjdXJpdHlFeGNlcHRpb24oIkFjdGl2aXR5TGF1bmNoZXIiLCBsb2dTZXBhcmF0b3IpOworCisgICAgICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JWYWxpZFN0YXRlKFRFU1RfQUNUSVZJVFkpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkQWN0aXZpdHkoIkZvY3VzIG11c3QgYmUgb24gZmlyc3QgYWN0aXZpdHkiLCBURVNUX0FDVElWSVRZKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiRm9jdXNlZCBzdGFjayBtdXN0IGJlIG9uIHNlY29uZGFyeSBkaXNwbGF5J3Mgc3RhY2siLAorICAgICAgICAgICAgICAgICAgICBleHRlcm5hbEZvY3VzZWRTdGFja0lkLCBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRGb2N1c2VkU3RhY2tJZCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRTZWN1cml0eUV4Y2VwdGlvbihTdHJpbmcgY29tcG9uZW50LCBMb2dTZXBhcmF0b3IgbG9nU2VwYXJhdG9yKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFBhdHRlcm4gcGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiLipTZWN1cml0eUV4Y2VwdGlvbiBsYXVuY2hpbmcgYWN0aXZpdHkuKiIpOworICAgICAgICBmb3IgKGludCByZXRyeSA9IDE7IHJldHJ5IDw9IDU7IHJldHJ5KyspIHsKKyAgICAgICAgICAgIFN0cmluZ1tdIGxvZ3MgPSBnZXREZXZpY2VMb2dzRm9yQ29tcG9uZW50cyhsb2dTZXBhcmF0b3IsIGNvbXBvbmVudCk7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBsaW5lIDogbG9ncykgeworICAgICAgICAgICAgICAgIE1hdGNoZXIgbSA9IHBhdHRlcm4ubWF0Y2hlcihsaW5lKTsKKyAgICAgICAgICAgICAgICBpZiAobS5tYXRjaGVzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvZ0Fsd2F5cygiKioqV2FpdGluZyBmb3IgU2VjdXJpdHlFeGNlcHRpb24gZm9yICIgKyBjb21wb25lbnQgKyAiIC4uLiByZXRyeT0iICsgcmV0cnkpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNTAwKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmYWlsKCJFeHBlY3RlZCBleGNlcHRpb24gZm9yICIgKyBjb21wb25lbnQgKyAiIG5vdCBmb3VuZCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhhdCBvbmx5IHByaXZhdGUgdmlydHVhbCBkaXNwbGF5IGNhbiBzaG93IGNvbnRlbnQgd2l0aCBpbnNlY3VyZSBrZXlndWFyZC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGbGFnU2hvd1dpdGhJbnNlY3VyZUtleWd1YXJkT25QdWJsaWNWaXJ0dWFsRGlzcGxheSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgKGZpbmFsIFZpcnR1YWxEaXNwbGF5U2Vzc2lvbiB2aXJ0dWFsRGlzcGxheVNlc3Npb24gPSBuZXcgVmlydHVhbERpc3BsYXlTZXNzaW9uKCkpIHsKKyAgICAgICAgICAgIC8vIFRyeSB0byBjcmVhdGUgbmV3IHNob3ctd2l0aC1pbnNlY3VyZS1rZXlndWFyZCBwdWJsaWMgdmlydHVhbCBkaXNwbGF5LgorICAgICAgICAgICAgZmluYWwgQWN0aXZpdHlEaXNwbGF5IG5ld0Rpc3BsYXkgPSB2aXJ0dWFsRGlzcGxheVNlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgLnNldFB1YmxpY0Rpc3BsYXkodHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgLnNldENhblNob3dXaXRoSW5zZWN1cmVLZXlndWFyZCh0cnVlKQorICAgICAgICAgICAgICAgICAgICAuc2V0TXVzdEJlQ3JlYXRlZChmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZURpc3BsYXkoKTsKKworICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgZGlzcGxheSBpcyBub3QgY3JlYXRlZC4KKyAgICAgICAgICAgIGFzc2VydE51bGwobmV3RGlzcGxheSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoYXQgYWxsIGFjdGl2aXRpZXMgdGhhdCB3ZXJlIG9uIHRoZSBwcml2YXRlIGRpc3BsYXkgYXJlIGRlc3Ryb3llZCBvbiBkaXNwbGF5IHJlbW92YWwuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGVudERlc3Ryb3lPbkRpc3BsYXlSZW1vdmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIExvZ1NlcGFyYXRvciBsb2dTZXBhcmF0b3I7CisgICAgICAgIHRyeSAoZmluYWwgVmlydHVhbERpc3BsYXlTZXNzaW9uIHZpcnR1YWxEaXNwbGF5U2Vzc2lvbiA9IG5ldyBWaXJ0dWFsRGlzcGxheVNlc3Npb24oKSkgeworICAgICAgICAgICAgLy8gQ3JlYXRlIG5ldyBwcml2YXRlIHZpcnR1YWwgZGlzcGxheS4KKyAgICAgICAgICAgIGZpbmFsIEFjdGl2aXR5RGlzcGxheSBuZXdEaXNwbGF5ID0gdmlydHVhbERpc3BsYXlTZXNzaW9uLmNyZWF0ZURpc3BsYXkoKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShWSVJUVUFMX0RJU1BMQVlfQUNUSVZJVFksIHRydWUgLyogdmlzaWJsZSAqLyk7CisKKyAgICAgICAgICAgIC8vIExhdW5jaCBhY3Rpdml0aWVzIG9uIG5ldyBzZWNvbmRhcnkgZGlzcGxheS4KKyAgICAgICAgICAgIGxhdW5jaEFjdGl2aXR5T25EaXNwbGF5KFRFU1RfQUNUSVZJVFksIG5ld0Rpc3BsYXkubUlkKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShURVNUX0FDVElWSVRZLCB0cnVlIC8qIHZpc2libGUgKi8pOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkQWN0aXZpdHkoIkxhdW5jaGVkIGFjdGl2aXR5IG11c3QgYmUgZm9jdXNlZCIsCisgICAgICAgICAgICAgICAgICAgIFRFU1RfQUNUSVZJVFkpOworICAgICAgICAgICAgbGF1bmNoQWN0aXZpdHlPbkRpc3BsYXkoUkVTSVpFQUJMRV9BQ1RJVklUWSwgbmV3RGlzcGxheS5tSWQpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFJFU0laRUFCTEVfQUNUSVZJVFksIHRydWUgLyogdmlzaWJsZSAqLyk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRBY3Rpdml0eSgiTGF1bmNoZWQgYWN0aXZpdHkgbXVzdCBiZSBmb2N1c2VkIiwKKyAgICAgICAgICAgICAgICAgICAgUkVTSVpFQUJMRV9BQ1RJVklUWSk7CisKKyAgICAgICAgICAgIC8vIERlc3Ryb3kgdGhlIGRpc3BsYXkgYW5kIGNoZWNrIGlmIGFjdGl2aXRpZXMgYXJlIHJlbW92ZWQgZnJvbSBzeXN0ZW0uCisgICAgICAgICAgICBsb2dTZXBhcmF0b3IgPSBzZXBhcmF0ZUxvZ3MoKTsKKyAgICAgICAgfQorCisgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvcldpdGhBbVN0YXRlKAorICAgICAgICAgICAgICAgIChzdGF0ZSkgLT4gIXN0YXRlLmNvbnRhaW5zQWN0aXZpdHkoVEVTVF9BQ1RJVklUWSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICFzdGF0ZS5jb250YWluc0FjdGl2aXR5KFJFU0laRUFCTEVfQUNUSVZJVFkpLAorICAgICAgICAgICAgICAgICJXYWl0aW5nIGZvciBhY3Rpdml0eSB0byBiZSByZW1vdmVkIik7CisgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvcldpdGhXbVN0YXRlKAorICAgICAgICAgICAgICAgIChzdGF0ZSkgLT4gIXN0YXRlLmNvbnRhaW5zV2luZG93KGdldFdpbmRvd05hbWUoVEVTVF9BQ1RJVklUWSkpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAhc3RhdGUuY29udGFpbnNXaW5kb3coZ2V0V2luZG93TmFtZShSRVNJWkVBQkxFX0FDVElWSVRZKSksCisgICAgICAgICAgICAgICAgIldhaXRpbmcgZm9yIGFjdGl2aXR5IHdpbmRvdyB0byBiZSBnb25lIik7CisKKyAgICAgICAgLy8gQ2hlY2sgQU0gc3RhdGUuCisgICAgICAgIGFzc2VydEZhbHNlKCJBY3Rpdml0eSBmcm9tIHJlbW92ZWQgZGlzcGxheSBtdXN0IGJlIGRlc3Ryb3llZCIsCisgICAgICAgICAgICAgICAgbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuY29udGFpbnNBY3Rpdml0eShURVNUX0FDVElWSVRZKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJBY3Rpdml0eSBmcm9tIHJlbW92ZWQgZGlzcGxheSBtdXN0IGJlIGRlc3Ryb3llZCIsCisgICAgICAgICAgICAgICAgbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuY29udGFpbnNBY3Rpdml0eShSRVNJWkVBQkxFX0FDVElWSVRZKSk7CisgICAgICAgIC8vIENoZWNrIFdNIHN0YXRlLgorICAgICAgICBhc3NlcnRGYWxzZSgiQWN0aXZpdHkgd2luZG93cyBmcm9tIHJlbW92ZWQgZGlzcGxheSBtdXN0IGJlIGRlc3Ryb3llZCIsCisgICAgICAgICAgICAgICAgbUFtV21TdGF0ZS5nZXRXbVN0YXRlKCkuY29udGFpbnNXaW5kb3coZ2V0V2luZG93TmFtZShURVNUX0FDVElWSVRZKSkpOworICAgICAgICBhc3NlcnRGYWxzZSgiQWN0aXZpdHkgd2luZG93cyBmcm9tIHJlbW92ZWQgZGlzcGxheSBtdXN0IGJlIGRlc3Ryb3llZCIsCisgICAgICAgICAgICAgICAgbUFtV21TdGF0ZS5nZXRXbVN0YXRlKCkuY29udGFpbnNXaW5kb3coZ2V0V2luZG93TmFtZShSRVNJWkVBQkxFX0FDVElWSVRZKSkpOworICAgICAgICAvLyBDaGVjayBhY3Rpdml0eSBsb2dzLgorICAgICAgICBhc3NlcnRBY3Rpdml0eURlc3Ryb3llZChURVNUX0FDVElWSVRZLCBsb2dTZXBhcmF0b3IpOworICAgICAgICBhc3NlcnRBY3Rpdml0eURlc3Ryb3llZChSRVNJWkVBQkxFX0FDVElWSVRZLCBsb2dTZXBhcmF0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhhdCB0aGUgdXBkYXRlIG9mIGRpc3BsYXkgbWV0cmljcyB1cGRhdGVzIGFsbCBpdHMgY29udGVudC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REaXNwbGF5UmVzaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSAoZmluYWwgVmlydHVhbERpc3BsYXlTZXNzaW9uIHZpcnR1YWxEaXNwbGF5U2Vzc2lvbiA9IG5ldyBWaXJ0dWFsRGlzcGxheVNlc3Npb24oKSkgeworICAgICAgICAgICAgLy8gQ3JlYXRlIG5ldyB2aXJ0dWFsIGRpc3BsYXkuCisgICAgICAgICAgICBmaW5hbCBBY3Rpdml0eURpc3BsYXkgbmV3RGlzcGxheSA9IHZpcnR1YWxEaXNwbGF5U2Vzc2lvbi5jcmVhdGVEaXNwbGF5KCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoVklSVFVBTF9ESVNQTEFZX0FDVElWSVRZLCB0cnVlIC8qIHZpc2libGUgKi8pOworCisgICAgICAgICAgICAvLyBMYXVuY2ggYSByZXNpemVhYmxlIGFjdGl2aXR5IG9uIG5ldyBzZWNvbmRhcnkgZGlzcGxheS4KKyAgICAgICAgICAgIGZpbmFsIExvZ1NlcGFyYXRvciBpbml0aWFsTG9nU2VwYXJhdG9yID0gc2VwYXJhdGVMb2dzKCk7CisgICAgICAgICAgICBsYXVuY2hBY3Rpdml0eU9uRGlzcGxheShSRVNJWkVBQkxFX0FDVElWSVRZLCBuZXdEaXNwbGF5Lm1JZCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoUkVTSVpFQUJMRV9BQ1RJVklUWSwgdHJ1ZSAvKiB2aXNpYmxlICovKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZEFjdGl2aXR5KCJMYXVuY2hlZCBhY3Rpdml0eSBtdXN0IGJlIGZvY3VzZWQiLAorICAgICAgICAgICAgICAgICAgICBSRVNJWkVBQkxFX0FDVElWSVRZKTsKKworICAgICAgICAgICAgLy8gR3JhYiByZXBvcnRlZCBzaXplcyBhbmQgY29tcHV0ZSBuZXcgd2l0aCBzbGlnaHQgc2l6ZSBjaGFuZ2UuCisgICAgICAgICAgICBmaW5hbCBSZXBvcnRlZFNpemVzIGluaXRpYWxTaXplID0gZ2V0TGFzdFJlcG9ydGVkU2l6ZXNGb3JBY3Rpdml0eSgKKyAgICAgICAgICAgICAgICAgICAgUkVTSVpFQUJMRV9BQ1RJVklUWSwgaW5pdGlhbExvZ1NlcGFyYXRvcik7CisKKyAgICAgICAgICAgIC8vIFJlc2l6ZSB0aGUgZGlzcGxheQorICAgICAgICAgICAgZmluYWwgTG9nU2VwYXJhdG9yIGxvZ1NlcGFyYXRvciA9IHNlcGFyYXRlTG9ncygpOworICAgICAgICAgICAgdmlydHVhbERpc3BsYXlTZXNzaW9uLnJlc2l6ZURpc3BsYXkoKTsKKworICAgICAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yV2l0aEFtU3RhdGUoYW1TdGF0ZSAtPiB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRDb25maWdDaGFuZ2VOdW1iZXIoUkVTSVpFQUJMRV9BQ1RJVklUWSwgbG9nU2VwYXJhdG9yKSA9PSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgYW1TdGF0ZS5oYXNBY3Rpdml0eVN0YXRlKFJFU0laRUFCTEVfQUNUSVZJVFksIFNUQVRFX1JFU1VNRUQpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZ0UoIkVycm9yIHdhaXRpbmcgZm9yIHZhbGlkIHN0YXRlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwgIldhaXQgZm9yIHRoZSBjb25maWd1cmF0aW9uIGNoYW5nZSB0byBoYXBwZW4gYW5kIGZvciBhY3Rpdml0eSB0byBiZSByZXN1bWVkLiIpOworCisgICAgICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShmYWxzZSAvKiBjb21wYXJlVGFza0FuZFN0YWNrQm91bmRzICovLAorICAgICAgICAgICAgICAgICAgICBuZXcgV2FpdEZvclZhbGlkQWN0aXZpdHlTdGF0ZShSRVNJWkVBQkxFX0FDVElWSVRZKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFdhaXRGb3JWYWxpZEFjdGl2aXR5U3RhdGUoVklSVFVBTF9ESVNQTEFZX0FDVElWSVRZKSk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoVklSVFVBTF9ESVNQTEFZX0FDVElWSVRZLCB0cnVlKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShSRVNJWkVBQkxFX0FDVElWSVRZLCB0cnVlKTsKKworICAgICAgICAgICAgLy8gQ2hlY2sgaWYgYWN0aXZpdHkgaW4gdmlydHVhbCBkaXNwbGF5IHdhcyByZXNpemVkIHByb3Blcmx5LgorICAgICAgICAgICAgYXNzZXJ0UmVsYXVuY2hPckNvbmZpZ0NoYW5nZWQoUkVTSVpFQUJMRV9BQ1RJVklUWSwgMCAvKiBudW1SZWxhdW5jaCAqLywKKyAgICAgICAgICAgICAgICAgICAgMSAvKiBudW1Db25maWdDaGFuZ2UgKi8sIGxvZ1NlcGFyYXRvcik7CisKKyAgICAgICAgICAgIGZpbmFsIFJlcG9ydGVkU2l6ZXMgdXBkYXRlZFNpemUgPSBnZXRMYXN0UmVwb3J0ZWRTaXplc0ZvckFjdGl2aXR5KAorICAgICAgICAgICAgICAgICAgICBSRVNJWkVBQkxFX0FDVElWSVRZLCBsb2dTZXBhcmF0b3IpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh1cGRhdGVkU2l6ZS53aWR0aERwIDw9IGluaXRpYWxTaXplLndpZHRoRHApOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh1cGRhdGVkU2l6ZS5oZWlnaHREcCA8PSBpbml0aWFsU2l6ZS5oZWlnaHREcCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHVwZGF0ZWRTaXplLmRpc3BsYXlXaWR0aCA9PSBpbml0aWFsU2l6ZS5kaXNwbGF5V2lkdGggLyAyKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUodXBkYXRlZFNpemUuZGlzcGxheUhlaWdodCA9PSBpbml0aWFsU2l6ZS5kaXNwbGF5SGVpZ2h0IC8gMik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogUmVhZCB0aGUgbnVtYmVyIG9mIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyBzZW50IHRvIGFjdGl2aXR5IGZyb20gbG9ncy4gKi8KKyAgICBwcml2YXRlIGludCByZWFkQ29uZmlnQ2hhbmdlTnVtYmVyKENvbXBvbmVudE5hbWUgYWN0aXZpdHlOYW1lLCBMb2dTZXBhcmF0b3IgbG9nU2VwYXJhdG9yKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiAobmV3IEFjdGl2aXR5TGlmZWN5Y2xlQ291bnRzKGFjdGl2aXR5TmFtZSwgbG9nU2VwYXJhdG9yKSkubUNvbmZpZ3VyYXRpb25DaGFuZ2VkQ291bnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhhdCB3aGVuIGFuIGFjdGl2aXR5IGlzIGxhdW5jaGVkIHdpdGggZGlzcGxheUlkIHNwZWNpZmllZCBhbmQgdGhlcmUgaXMgYW4gZXhpc3RpbmcKKyAgICAgKiBtYXRjaGluZyB0YXNrIG9uIHNvbWUgb3RoZXIgZGlzcGxheSAtIHRoYXQgdGFzayB3aWxsIG1vdmVkIHRvIHRoZSB0YXJnZXQgZGlzcGxheS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNb3ZlVG9EaXNwbGF5T25MYXVuY2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gTGF1bmNoIGFjdGl2aXR5IHdpdGggdW5pcXVlIGFmZmluaXR5LCBzbyBpdCB3aWxsIHRoZSBvbmx5IG9uZSBpbiBpdHMgdGFzay4KKyAgICAgICAgbGF1bmNoQWN0aXZpdHkoTEFVTkNISU5HX0FDVElWSVRZKTsKKworICAgICAgICB0cnkgKGZpbmFsIFZpcnR1YWxEaXNwbGF5U2Vzc2lvbiB2aXJ0dWFsRGlzcGxheVNlc3Npb24gPSBuZXcgVmlydHVhbERpc3BsYXlTZXNzaW9uKCkpIHsKKyAgICAgICAgICAgIC8vIENyZWF0ZSBuZXcgdmlydHVhbCBkaXNwbGF5LgorICAgICAgICAgICAgZmluYWwgQWN0aXZpdHlEaXNwbGF5IG5ld0Rpc3BsYXkgPSB2aXJ0dWFsRGlzcGxheVNlc3Npb24uY3JlYXRlRGlzcGxheSgpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFZJUlRVQUxfRElTUExBWV9BQ1RJVklUWSwgdHJ1ZSAvKiB2aXNpYmxlICovKTsKKyAgICAgICAgICAgIC8vIExhdW5jaCBzb21ldGhpbmcgdG8gdGhhdCBkaXNwbGF5IHNvIHRoYXQgYSBuZXcgc3RhY2sgaXMgY3JlYXRlZC4gV2UgbmVlZCB0aGlzIHRvIGJlCisgICAgICAgICAgICAvLyBhYmxlIHRvIGNvbXBhcmUgdGFzayBudW1iZXJzIGluIHN0YWNrcyBsYXRlci4KKyAgICAgICAgICAgIGxhdW5jaEFjdGl2aXR5T25EaXNwbGF5KFJFU0laRUFCTEVfQUNUSVZJVFksIG5ld0Rpc3BsYXkubUlkKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShSRVNJWkVBQkxFX0FDVElWSVRZLCB0cnVlIC8qIHZpc2libGUgKi8pOworCisgICAgICAgICAgICBmaW5hbCBpbnQgc3RhY2tOdW0gPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXREaXNwbGF5KERFRkFVTFRfRElTUExBWSkKKyAgICAgICAgICAgICAgICAgICAgLm1TdGFja3Muc2l6ZSgpOworICAgICAgICAgICAgZmluYWwgaW50IGZyb250U3RhY2tJZCA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEZyb250U3RhY2tJZChuZXdEaXNwbGF5Lm1JZCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgdGFza051bU9uU2Vjb25kYXJ5ID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0U3RhY2tCeUlkKGZyb250U3RhY2tJZCkKKyAgICAgICAgICAgICAgICAgICAgLmdldFRhc2tzKCkuc2l6ZSgpOworCisgICAgICAgICAgICAvLyBMYXVuY2ggYWN0aXZpdHkgb24gbmV3IHNlY29uZGFyeSBkaXNwbGF5LgorICAgICAgICAgICAgLy8gVXNpbmcgY3VzdG9tIGNvbW1hbmQgaGVyZSwgYmVjYXVzZSBub3JtYWxseSB3ZSBhZGQgZmxhZ3MKKyAgICAgICAgICAgIC8vIHtAbGluayBJbnRlbnQjRkxBR19BQ1RJVklUWV9ORVdfVEFTS30gYW5kIHtAbGluayBJbnRlbnQjRkxBR19BQ1RJVklUWV9NVUxUSVBMRV9UQVNLfQorICAgICAgICAgICAgLy8gd2hlbiBsYXVuY2hpbmcgb24gc29tZSBzcGVjaWZpYyBkaXNwbGF5LiBXZSBkb24ndCBkbyBpdCBoZXJlIGFzIHdlIHdhbnQgYW4gZXhpc3RpbmcKKyAgICAgICAgICAgIC8vIHRhc2sgdG8gYmUgdXNlZC4KKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsYXVuY2hDb21tYW5kID0gImFtIHN0YXJ0IC1uICIgKyBnZXRBY3Rpdml0eU5hbWUoTEFVTkNISU5HX0FDVElWSVRZKQorICAgICAgICAgICAgICAgICAgICArICIgLS1kaXNwbGF5ICIgKyBuZXdEaXNwbGF5Lm1JZDsKKyAgICAgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQobGF1bmNoQ29tbWFuZCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JBY3Rpdml0eVN0YXRlKExBVU5DSElOR19BQ1RJVklUWSwgU1RBVEVfUkVTVU1FRCk7CisKKyAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgYWN0aXZpdHkgaXMgYnJvdWdodCB0byBmcm9udC4KKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZEFjdGl2aXR5KCJFeGlzdGluZyB0YXNrIG11c3QgYmUgYnJvdWdodCB0byBmcm9udCIsCisgICAgICAgICAgICAgICAgICAgIExBVU5DSElOR19BQ1RJVklUWSk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFJlc3VtZWRBY3Rpdml0eSgiRXhpc3RpbmcgdGFzayBtdXN0IGJlIHJlc3VtZWQiLAorICAgICAgICAgICAgICAgICAgICBMQVVOQ0hJTkdfQUNUSVZJVFkpOworCisgICAgICAgICAgICAvLyBDaGVjayB0aGF0IGFjdGl2aXR5IGlzIG9uIHRoZSByaWdodCBkaXNwbGF5LgorICAgICAgICAgICAgZmluYWwgQWN0aXZpdHlNYW5hZ2VyU3RhdGUuQWN0aXZpdHlTdGFjayBmaXJzdEZyb250U3RhY2sgPQorICAgICAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja0J5SWQoZnJvbnRTdGFja0lkKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiQWN0aXZpdHkgbXVzdCBiZSBtb3ZlZCB0byB0aGUgc2Vjb25kYXJ5IGRpc3BsYXkiLAorICAgICAgICAgICAgICAgICAgICBnZXRBY3Rpdml0eU5hbWUoTEFVTkNISU5HX0FDVElWSVRZKSwgZmlyc3RGcm9udFN0YWNrLm1SZXN1bWVkQWN0aXZpdHkpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkU3RhY2soIkZvY3VzIG11c3QgYmUgb24gc2Vjb25kYXJ5IGRpc3BsYXkiLCBmcm9udFN0YWNrSWQpOworCisgICAgICAgICAgICAvLyBDaGVjayB0aGF0IHRhc2sgaGFzIG1vdmVkIGZyb20gcHJpbWFyeSBkaXNwbGF5IHRvIHNlY29uZGFyeS4KKyAgICAgICAgICAgIGZpbmFsIGludCBzdGFja051bUZpbmFsID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0RGlzcGxheShERUZBVUxUX0RJU1BMQVkpCisgICAgICAgICAgICAgICAgICAgIC5tU3RhY2tzLnNpemUoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiU3RhY2sgbnVtYmVyIGluIGRlZmF1bHQgc3RhY2sgbXVzdCBiZSBkZWNyZW1lbnRlZC4iLCBzdGFja051bSAtIDEsCisgICAgICAgICAgICAgICAgICAgIHN0YWNrTnVtRmluYWwpOworICAgICAgICAgICAgZmluYWwgaW50IHRhc2tOdW1GaW5hbE9uU2Vjb25kYXJ5ID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0U3RhY2tCeUlkKGZyb250U3RhY2tJZCkKKyAgICAgICAgICAgICAgICAgICAgLmdldFRhc2tzKCkuc2l6ZSgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUYXNrIG51bWJlciBpbiBzdGFjayBvbiBleHRlcm5hbCBkaXNwbGF5IG11c3QgYmUgaW5jcmVtZW50ZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgdGFza051bU9uU2Vjb25kYXJ5ICsgMSwgdGFza051bUZpbmFsT25TZWNvbmRhcnkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhhdCB3aGVuIGFuIGFjdGl2aXR5IGlzIGxhdW5jaGVkIHdpdGggZGlzcGxheUlkIHNwZWNpZmllZCBhbmQgdGhlcmUgaXMgYW4gZXhpc3RpbmcKKyAgICAgKiBtYXRjaGluZyB0YXNrIG9uIHNvbWUgb3RoZXIgZGlzcGxheSAtIHRoYXQgdGFzayB3aWxsIG1vdmVkIHRvIHRoZSB0YXJnZXQgZGlzcGxheS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNb3ZlVG9FbXB0eURpc3BsYXlPbkxhdW5jaCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBMYXVuY2ggYWN0aXZpdHkgd2l0aCB1bmlxdWUgYWZmaW5pdHksIHNvIGl0IHdpbGwgdGhlIG9ubHkgb25lIGluIGl0cyB0YXNrLgorICAgICAgICBsYXVuY2hBY3Rpdml0eShMQVVOQ0hJTkdfQUNUSVZJVFkpOworCisgICAgICAgIHRyeSAoZmluYWwgVmlydHVhbERpc3BsYXlTZXNzaW9uIHZpcnR1YWxEaXNwbGF5U2Vzc2lvbiA9IG5ldyBWaXJ0dWFsRGlzcGxheVNlc3Npb24oKSkgeworICAgICAgICAgICAgLy8gQ3JlYXRlIG5ldyB2aXJ0dWFsIGRpc3BsYXkuCisgICAgICAgICAgICBmaW5hbCBBY3Rpdml0eURpc3BsYXkgbmV3RGlzcGxheSA9IHZpcnR1YWxEaXNwbGF5U2Vzc2lvbi5jcmVhdGVEaXNwbGF5KCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoVklSVFVBTF9ESVNQTEFZX0FDVElWSVRZLCB0cnVlIC8qIHZpc2libGUgKi8pOworCisgICAgICAgICAgICBmaW5hbCBpbnQgc3RhY2tOdW0gPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXREaXNwbGF5KERFRkFVTFRfRElTUExBWSkubVN0YWNrcy5zaXplKCk7CisKKyAgICAgICAgICAgIC8vIExhdW5jaCBhY3Rpdml0eSBvbiBuZXcgc2Vjb25kYXJ5IGRpc3BsYXkuCisgICAgICAgICAgICAvLyBVc2luZyBjdXN0b20gY29tbWFuZCBoZXJlLCBiZWNhdXNlIG5vcm1hbGx5IHdlIGFkZCBmbGFncworICAgICAgICAgICAgLy8ge0BsaW5rIEludGVudCNGTEFHX0FDVElWSVRZX05FV19UQVNLfSBhbmQge0BsaW5rIEludGVudCNGTEFHX0FDVElWSVRZX01VTFRJUExFX1RBU0t9CisgICAgICAgICAgICAvLyB3aGVuIGxhdW5jaGluZyBvbiBzb21lIHNwZWNpZmljIGRpc3BsYXkuIFdlIGRvbid0IGRvIGl0IGhlcmUgYXMgd2Ugd2FudCBhbiBleGlzdGluZworICAgICAgICAgICAgLy8gdGFzayB0byBiZSB1c2VkLgorICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxhdW5jaENvbW1hbmQgPSAiYW0gc3RhcnQgLW4gIiArIGdldEFjdGl2aXR5TmFtZShMQVVOQ0hJTkdfQUNUSVZJVFkpCisgICAgICAgICAgICAgICAgICAgICsgIiAtLWRpc3BsYXkgIiArIG5ld0Rpc3BsYXkubUlkOworICAgICAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChsYXVuY2hDb21tYW5kKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvckFjdGl2aXR5U3RhdGUoTEFVTkNISU5HX0FDVElWSVRZLCBTVEFURV9SRVNVTUVEKTsKKworICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCBhY3Rpdml0eSBpcyBicm91Z2h0IHRvIGZyb250LgorICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkQWN0aXZpdHkoIkV4aXN0aW5nIHRhc2sgbXVzdCBiZSBicm91Z2h0IHRvIGZyb250IiwKKyAgICAgICAgICAgICAgICAgICAgTEFVTkNISU5HX0FDVElWSVRZKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0UmVzdW1lZEFjdGl2aXR5KCJFeGlzdGluZyB0YXNrIG11c3QgYmUgcmVzdW1lZCIsCisgICAgICAgICAgICAgICAgICAgIExBVU5DSElOR19BQ1RJVklUWSk7CisKKyAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgYWN0aXZpdHkgaXMgb24gdGhlIHJpZ2h0IGRpc3BsYXkuCisgICAgICAgICAgICBmaW5hbCBpbnQgZnJvbnRTdGFja0lkID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0RnJvbnRTdGFja0lkKG5ld0Rpc3BsYXkubUlkKTsKKyAgICAgICAgICAgIGZpbmFsIEFjdGl2aXR5TWFuYWdlclN0YXRlLkFjdGl2aXR5U3RhY2sgZmlyc3RGcm9udFN0YWNrID0KKyAgICAgICAgICAgICAgICAgICAgbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0U3RhY2tCeUlkKGZyb250U3RhY2tJZCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkFjdGl2aXR5IG11c3QgYmUgbW92ZWQgdG8gdGhlIHNlY29uZGFyeSBkaXNwbGF5IiwKKyAgICAgICAgICAgICAgICAgICAgZ2V0QWN0aXZpdHlOYW1lKExBVU5DSElOR19BQ1RJVklUWSksIGZpcnN0RnJvbnRTdGFjay5tUmVzdW1lZEFjdGl2aXR5KTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZFN0YWNrKCJGb2N1cyBtdXN0IGJlIG9uIHNlY29uZGFyeSBkaXNwbGF5IiwgZnJvbnRTdGFja0lkKTsKKworICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCB0YXNrIGhhcyBtb3ZlZCBmcm9tIHByaW1hcnkgZGlzcGxheSB0byBzZWNvbmRhcnkuCisgICAgICAgICAgICBmaW5hbCBpbnQgc3RhY2tOdW1GaW5hbCA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldERpc3BsYXkoREVGQVVMVF9ESVNQTEFZKQorICAgICAgICAgICAgICAgICAgICAubVN0YWNrcy5zaXplKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlN0YWNrIG51bWJlciBpbiBkZWZhdWx0IHN0YWNrIG11c3QgYmUgZGVjcmVtZW50ZWQuIiwgc3RhY2tOdW0gLSAxLAorICAgICAgICAgICAgICAgICAgICBzdGFja051bUZpbmFsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoYXQgd2hlbiBwcmltYXJ5IGRpc3BsYXkgaXMgcm90YXRlZCBzZWNvbmRhcnkgZGlzcGxheXMgYXJlIG5vdCBhZmZlY3RlZC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSb3RhdGlvbk5vdEFmZmVjdGluZ1NlY29uZGFyeVNjcmVlbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgKGZpbmFsIFZpcnR1YWxEaXNwbGF5U2Vzc2lvbiB2aXJ0dWFsRGlzcGxheVNlc3Npb24gPSBuZXcgVmlydHVhbERpc3BsYXlTZXNzaW9uKCkpIHsKKyAgICAgICAgICAgIC8vIENyZWF0ZSBuZXcgdmlydHVhbCBkaXNwbGF5LgorICAgICAgICAgICAgZmluYWwgQWN0aXZpdHlEaXNwbGF5IG5ld0Rpc3BsYXkgPSB2aXJ0dWFsRGlzcGxheVNlc3Npb24uc2V0UmVzaXplRGlzcGxheShmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZURpc3BsYXkoKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShWSVJUVUFMX0RJU1BMQVlfQUNUSVZJVFksIHRydWUgLyogdmlzaWJsZSAqLyk7CisKKyAgICAgICAgICAgIC8vIExhdW5jaCBhY3Rpdml0eSBvbiBuZXcgc2Vjb25kYXJ5IGRpc3BsYXkuCisgICAgICAgICAgICBMb2dTZXBhcmF0b3IgbG9nU2VwYXJhdG9yID0gc2VwYXJhdGVMb2dzKCk7CisgICAgICAgICAgICBsYXVuY2hBY3Rpdml0eU9uRGlzcGxheShSRVNJWkVBQkxFX0FDVElWSVRZLCBuZXdEaXNwbGF5Lm1JZCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRBY3Rpdml0eSgiRm9jdXMgbXVzdCBiZSBvbiBzZWNvbmRhcnkgZGlzcGxheSIsCisgICAgICAgICAgICAgICAgICAgIFJFU0laRUFCTEVfQUNUSVZJVFkpOworICAgICAgICAgICAgZmluYWwgUmVwb3J0ZWRTaXplcyBpbml0aWFsU2l6ZXMgPSBnZXRMYXN0UmVwb3J0ZWRTaXplc0ZvckFjdGl2aXR5KAorICAgICAgICAgICAgICAgICAgICBSRVNJWkVBQkxFX0FDVElWSVRZLCBsb2dTZXBhcmF0b3IpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiVGVzdCBhY3Rpdml0eSBtdXN0IGhhdmUgcmVwb3J0ZWQgaW5pdGlhbCBzaXplcyBvbiBsYXVuY2giLCBpbml0aWFsU2l6ZXMpOworCisgICAgICAgICAgICB0cnkgKGZpbmFsIFJvdGF0aW9uU2Vzc2lvbiByb3RhdGlvblNlc3Npb24gPSBuZXcgUm90YXRpb25TZXNzaW9uKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBSb3RhdGUgcHJpbWFyeSBkaXNwbGF5IGFuZCBjaGVjayB0aGF0IGFjdGl2aXR5IG9uIHNlY29uZGFyeSBkaXNwbGF5IGlzIG5vdAorICAgICAgICAgICAgICAgIC8vIGFmZmVjdGVkLgorCisgICAgICAgICAgICAgICAgcm90YXRlQW5kQ2hlY2tTYW1lU2l6ZXMocm90YXRpb25TZXNzaW9uLCBSRVNJWkVBQkxFX0FDVElWSVRZKTsKKworICAgICAgICAgICAgICAgIC8vIExhdW5jaCBhY3Rpdml0eSB0byBzZWNvbmRhcnkgZGlzcGxheSB3aGVuIHByaW1hcnkgb25lIGlzIHJvdGF0ZWQuCisgICAgICAgICAgICAgICAgZmluYWwgaW50IGluaXRpYWxSb3RhdGlvbiA9IG1BbVdtU3RhdGUuZ2V0V21TdGF0ZSgpLmdldFJvdGF0aW9uKCk7CisgICAgICAgICAgICAgICAgcm90YXRpb25TZXNzaW9uLnNldCgoaW5pdGlhbFJvdGF0aW9uICsgMSkgJSA0KTsKKworICAgICAgICAgICAgICAgIGxvZ1NlcGFyYXRvciA9IHNlcGFyYXRlTG9ncygpOworICAgICAgICAgICAgICAgIGxhdW5jaEFjdGl2aXR5T25EaXNwbGF5KFRFU1RfQUNUSVZJVFksIG5ld0Rpc3BsYXkubUlkKTsKKyAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JBY3Rpdml0eVN0YXRlKFRFU1RfQUNUSVZJVFksIFNUQVRFX1JFU1VNRUQpOworICAgICAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZEFjdGl2aXR5KCJGb2N1cyBtdXN0IGJlIG9uIHNlY29uZGFyeSBkaXNwbGF5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RfQUNUSVZJVFkpOworICAgICAgICAgICAgICAgIGZpbmFsIFJlcG9ydGVkU2l6ZXMgdGVzdEFjdGl2aXR5U2l6ZXMgPSBnZXRMYXN0UmVwb3J0ZWRTaXplc0ZvckFjdGl2aXR5KAorICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9BQ1RJVklUWSwgbG9nU2VwYXJhdG9yKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgICAgICAgICAiU2l6ZXMgb2Ygc2Vjb25kYXJ5IGRpc3BsYXkgbXVzdCBub3QgY2hhbmdlIGFmdGVyIHJvdGF0aW9uIG9mIHByaW1hcnkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJkaXNwbGF5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxTaXplcywgdGVzdEFjdGl2aXR5U2l6ZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJvdGF0ZUFuZENoZWNrU2FtZVNpemVzKAorICAgICAgICAgICAgUm90YXRpb25TZXNzaW9uIHJvdGF0aW9uU2Vzc2lvbiwgQ29tcG9uZW50TmFtZSBhY3Rpdml0eU5hbWUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmb3IgKGludCByb3RhdGlvbiA9IDM7IHJvdGF0aW9uID49IDA7IC0tcm90YXRpb24pIHsKKyAgICAgICAgICAgIGZpbmFsIExvZ1NlcGFyYXRvciBsb2dTZXBhcmF0b3IgPSBzZXBhcmF0ZUxvZ3MoKTsKKyAgICAgICAgICAgIHJvdGF0aW9uU2Vzc2lvbi5zZXQocm90YXRpb24pOworICAgICAgICAgICAgZmluYWwgUmVwb3J0ZWRTaXplcyByb3RhdGVkU2l6ZXMgPSBnZXRMYXN0UmVwb3J0ZWRTaXplc0ZvckFjdGl2aXR5KGFjdGl2aXR5TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgbG9nU2VwYXJhdG9yKTsKKyAgICAgICAgICAgIGFzc2VydE51bGwoIlNpemVzIG11c3Qgbm90IGNoYW5nZSBhZnRlciByb3RhdGlvbiIsIHJvdGF0ZWRTaXplcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB0aGF0IHRhc2sgYWZmaW5pdHkgZG9lcyBhZmZlY3Qgd2hhdCBkaXNwbGF5IGFuIGFjdGl2aXR5IGlzIGxhdW5jaGVkIG9uIGJ1dCB0aGF0CisgICAgICogbWF0Y2hpbmcgdGhlIHRhc2sgY29tcG9uZW50IHJvb3QgZG9lcy4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUYXNrTWF0Y2hBY3Jvc3NEaXNwbGF5cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgKGZpbmFsIFZpcnR1YWxEaXNwbGF5U2Vzc2lvbiB2aXJ0dWFsRGlzcGxheVNlc3Npb24gPSBuZXcgVmlydHVhbERpc3BsYXlTZXNzaW9uKCkpIHsKKyAgICAgICAgICAgIGZpbmFsIEFjdGl2aXR5RGlzcGxheSBuZXdEaXNwbGF5ID0gdmlydHVhbERpc3BsYXlTZXNzaW9uLmNyZWF0ZURpc3BsYXkoKTsKKworICAgICAgICAgICAgbGF1bmNoQWN0aXZpdHlPbkRpc3BsYXkoTEFVTkNISU5HX0FDVElWSVRZLCBuZXdEaXNwbGF5Lm1JZCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShMQVVOQ0hJTkdfQUNUSVZJVFkpOworCisgICAgICAgICAgICAvLyBDaGVjayB0aGF0IGFjdGl2aXR5IGlzIG9uIHRoZSBzZWNvbmRhcnkgZGlzcGxheS4KKyAgICAgICAgICAgIGZpbmFsIGludCBmcm9udFN0YWNrSWQgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRGcm9udFN0YWNrSWQobmV3RGlzcGxheS5tSWQpOworICAgICAgICAgICAgZmluYWwgQWN0aXZpdHlNYW5hZ2VyU3RhdGUuQWN0aXZpdHlTdGFjayBmaXJzdEZyb250U3RhY2sgPQorICAgICAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja0J5SWQoZnJvbnRTdGFja0lkKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiQWN0aXZpdHkgbGF1bmNoZWQgb24gc2Vjb25kYXJ5IGRpc3BsYXkgbXVzdCBiZSByZXN1bWVkIiwKKyAgICAgICAgICAgICAgICAgICAgZ2V0QWN0aXZpdHlOYW1lKExBVU5DSElOR19BQ1RJVklUWSksIGZpcnN0RnJvbnRTdGFjay5tUmVzdW1lZEFjdGl2aXR5KTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZFN0YWNrKCJGb2N1cyBtdXN0IGJlIG9uIHNlY29uZGFyeSBkaXNwbGF5IiwgZnJvbnRTdGFja0lkKTsKKworICAgICAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZCgiYW0gc3RhcnQgLW4gIiArIGdldEFjdGl2aXR5TmFtZShBTFRfTEFVTkNISU5HX0FDVElWSVRZKSk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JWYWxpZFN0YXRlKEFMVF9MQVVOQ0hJTkdfQUNUSVZJVFkpOworCisgICAgICAgICAgICAvLyBDaGVjayB0aGF0IHNlY29uZCBhY3Rpdml0eSBnZXRzIGxhdW5jaGVkIG9uIHRoZSBkZWZhdWx0IGRpc3BsYXkgZGVzcGl0ZQorICAgICAgICAgICAgLy8gdGhlIGFmZmluaXR5IG1hdGNoIG9uIHRoZSBzZWNvbmRhcnkgZGlzcGxheS4KKyAgICAgICAgICAgIGZpbmFsIGludCBkZWZhdWx0RGlzcGxheUZyb250U3RhY2tJZCA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEZyb250U3RhY2tJZCgKKyAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9ESVNQTEFZKTsKKyAgICAgICAgICAgIGZpbmFsIEFjdGl2aXR5TWFuYWdlclN0YXRlLkFjdGl2aXR5U3RhY2sgZGVmYXVsdERpc3BsYXlGcm9udFN0YWNrID0KKyAgICAgICAgICAgICAgICAgICAgbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0U3RhY2tCeUlkKGRlZmF1bHREaXNwbGF5RnJvbnRTdGFja0lkKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiQWN0aXZpdHkgbGF1bmNoZWQgb24gZGVmYXVsdCBkaXNwbGF5IG11c3QgYmUgcmVzdW1lZCIsCisgICAgICAgICAgICAgICAgICAgIGdldEFjdGl2aXR5TmFtZShBTFRfTEFVTkNISU5HX0FDVElWSVRZKSwKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdERpc3BsYXlGcm9udFN0YWNrLm1SZXN1bWVkQWN0aXZpdHkpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkU3RhY2soIkZvY3VzIG11c3QgYmUgb24gcHJpbWFyeSBkaXNwbGF5IiwKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdERpc3BsYXlGcm9udFN0YWNrSWQpOworCisgICAgICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKCJhbSBzdGFydCAtbiAiICsgZ2V0QWN0aXZpdHlOYW1lKExBVU5DSElOR19BQ1RJVklUWSkpOworICAgICAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yRm9jdXNlZFN0YWNrKGZyb250U3RhY2tJZCk7CisKKyAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgdGhlIHRoaXJkIGludGVudCBpcyByZWRpcmVjdGVkIHRvIHRoZSBmaXJzdCB0YXNrIGR1ZSB0byB0aGUgcm9vdAorICAgICAgICAgICAgLy8gY29tcG9uZW50IG1hdGNoIG9uIHRoZSBzZWNvbmRhcnkgZGlzcGxheS4KKyAgICAgICAgICAgIGZpbmFsIEFjdGl2aXR5TWFuYWdlclN0YXRlLkFjdGl2aXR5U3RhY2sgc2Vjb25kRnJvbnRTdGFjayA9CisgICAgICAgICAgICAgICAgICAgIG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFN0YWNrQnlJZChmcm9udFN0YWNrSWQpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJBY3Rpdml0eSBsYXVuY2hlZCBvbiBzZWNvbmRhcnkgZGlzcGxheSBtdXN0IGJlIHJlc3VtZWQiLAorICAgICAgICAgICAgICAgICAgICBnZXRBY3Rpdml0eU5hbWUoTEFVTkNISU5HX0FDVElWSVRZKSwgc2Vjb25kRnJvbnRTdGFjay5tUmVzdW1lZEFjdGl2aXR5KTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZFN0YWNrKCJGb2N1cyBtdXN0IGJlIG9uIHByaW1hcnkgZGlzcGxheSIsIGZyb250U3RhY2tJZCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkZvY3VzZWQgc3RhY2sgbXVzdCBvbmx5IGNvbnRhaW4gMSB0YXNrIiwKKyAgICAgICAgICAgICAgICAgICAgMSwgc2Vjb25kRnJvbnRTdGFjay5nZXRUYXNrcygpLnNpemUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkZvY3VzZWQgdGFzayBtdXN0IG9ubHkgY29udGFpbiAxIGFjdGl2aXR5IiwKKyAgICAgICAgICAgICAgICAgICAgMSwgc2Vjb25kRnJvbnRTdGFjay5nZXRUYXNrcygpLmdldCgwKS5tQWN0aXZpdGllcy5zaXplKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhhdCB0aGUgdGFzayBhZmZpbml0eSBzZWFyY2ggcmVzcGVjdHMgdGhlIGxhdW5jaCBkaXNwbGF5IGlkLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExhdW5jaERpc3BsYXlBZmZpbml0eU1hdGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSAoZmluYWwgVmlydHVhbERpc3BsYXlTZXNzaW9uIHZpcnR1YWxEaXNwbGF5U2Vzc2lvbiA9IG5ldyBWaXJ0dWFsRGlzcGxheVNlc3Npb24oKSkgeworICAgICAgICAgICAgZmluYWwgQWN0aXZpdHlEaXNwbGF5IG5ld0Rpc3BsYXkgPSB2aXJ0dWFsRGlzcGxheVNlc3Npb24uY3JlYXRlRGlzcGxheSgpOworCisgICAgICAgICAgICBsYXVuY2hBY3Rpdml0eU9uRGlzcGxheShMQVVOQ0hJTkdfQUNUSVZJVFksIG5ld0Rpc3BsYXkubUlkKTsKKworICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCBhY3Rpdml0eSBpcyBvbiB0aGUgc2Vjb25kYXJ5IGRpc3BsYXkuCisgICAgICAgICAgICBmaW5hbCBpbnQgZnJvbnRTdGFja0lkID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0RnJvbnRTdGFja0lkKG5ld0Rpc3BsYXkubUlkKTsKKyAgICAgICAgICAgIGZpbmFsIEFjdGl2aXR5TWFuYWdlclN0YXRlLkFjdGl2aXR5U3RhY2sgZmlyc3RGcm9udFN0YWNrID0KKyAgICAgICAgICAgICAgICAgICAgbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0U3RhY2tCeUlkKGZyb250U3RhY2tJZCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkFjdGl2aXR5IGxhdW5jaGVkIG9uIHNlY29uZGFyeSBkaXNwbGF5IG11c3QgYmUgcmVzdW1lZCIsCisgICAgICAgICAgICAgICAgICAgIGdldEFjdGl2aXR5TmFtZShMQVVOQ0hJTkdfQUNUSVZJVFkpLCBmaXJzdEZyb250U3RhY2subVJlc3VtZWRBY3Rpdml0eSk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRTdGFjaygiRm9jdXMgbXVzdCBiZSBvbiBzZWNvbmRhcnkgZGlzcGxheSIsIGZyb250U3RhY2tJZCk7CisKKyAgICAgICAgICAgIC8vIFdlIGRvbid0IHdhbnQgRkxBR19BQ1RJVklUWV9NVUxUSVBMRV9UQVNLLCBzbyB3ZSBjYW4ndCB1c2UgbGF1bmNoQWN0aXZpdHlPbkRpc3BsYXkKKyAgICAgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoImFtIHN0YXJ0IC1uICIgKyBnZXRBY3Rpdml0eU5hbWUoQUxUX0xBVU5DSElOR19BQ1RJVklUWSkKKyAgICAgICAgICAgICAgICAgICAgKyAiIC1mIDB4MTAwMDAwMDAiIC8vIEZMQUdfQUNUSVZJVFlfTkVXX1RBU0sKKyAgICAgICAgICAgICAgICAgICAgKyAiIC0tZGlzcGxheSAiICsgbmV3RGlzcGxheS5tSWQpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUoQUxUX0xBVU5DSElOR19BQ1RJVklUWSk7CisKKyAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgc2Vjb25kIGFjdGl2aXR5IGdldHMgbGF1bmNoZWQgaW50byB0aGUgYWZmaW5pdHkgbWF0Y2hpbmcKKyAgICAgICAgICAgIC8vIHRhc2sgb24gdGhlIHNlY29uZGFyeSBkaXNwbGF5CisgICAgICAgICAgICBmaW5hbCBpbnQgc2Vjb25kRnJvbnRTdGFja0lkID0KKyAgICAgICAgICAgICAgICAgICAgbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0RnJvbnRTdGFja0lkKG5ld0Rpc3BsYXkubUlkKTsKKyAgICAgICAgICAgIGZpbmFsIEFjdGl2aXR5TWFuYWdlclN0YXRlLkFjdGl2aXR5U3RhY2sgc2Vjb25kRnJvbnRTdGFjayA9CisgICAgICAgICAgICAgICAgICAgIG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFN0YWNrQnlJZChzZWNvbmRGcm9udFN0YWNrSWQpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJBY3Rpdml0eSBsYXVuY2hlZCBvbiBzZWNvbmRhcnkgZGlzcGxheSBtdXN0IGJlIHJlc3VtZWQiLAorICAgICAgICAgICAgICAgICAgICBnZXRBY3Rpdml0eU5hbWUoQUxUX0xBVU5DSElOR19BQ1RJVklUWSksCisgICAgICAgICAgICAgICAgICAgIHNlY29uZEZyb250U3RhY2subVJlc3VtZWRBY3Rpdml0eSk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRTdGFjaygiRm9jdXMgbXVzdCBiZSBvbiBzZWNvbmRhcnkgZGlzcGxheSIsCisgICAgICAgICAgICAgICAgICAgIHNlY29uZEZyb250U3RhY2tJZCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkZvY3VzZWQgc3RhY2sgbXVzdCBvbmx5IGNvbnRhaW4gMSB0YXNrIiwKKyAgICAgICAgICAgICAgICAgICAgMSwgc2Vjb25kRnJvbnRTdGFjay5nZXRUYXNrcygpLnNpemUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkZvY3VzZWQgdGFzayBtdXN0IGNvbnRhaW4gMiBhY3Rpdml0aWVzIiwKKyAgICAgICAgICAgICAgICAgICAgMiwgc2Vjb25kRnJvbnRTdGFjay5nZXRUYXNrcygpLmdldCgwKS5tQWN0aXZpdGllcy5zaXplKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhhbiBhIG5ldyB0YXNrIGxhdW5jaGVkIGJ5IGFuIGFjdGl2aXR5IHdpbGwgZW5kIHVwIG9uIHRoYXQgYWN0aXZpdHkncyBkaXNwbGF5CisgICAgICogZXZlbiBpZiB0aGUgZm9jdXNlZCBzdGFjayBpcyBub3Qgb24gdGhhdCBhY3Rpdml0eSdzIGRpc3BsYXkuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmV3VGFza1NhbWVEaXNwbGF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSAoZmluYWwgVmlydHVhbERpc3BsYXlTZXNzaW9uIHZpcnR1YWxEaXNwbGF5U2Vzc2lvbiA9IG5ldyBWaXJ0dWFsRGlzcGxheVNlc3Npb24oKSkgeworICAgICAgICAgICAgZmluYWwgQWN0aXZpdHlEaXNwbGF5IG5ld0Rpc3BsYXkgPSB2aXJ0dWFsRGlzcGxheVNlc3Npb24uc2V0U2ltdWxhdGVEaXNwbGF5KHRydWUpCisgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVEaXNwbGF5KCk7CisKKyAgICAgICAgICAgIGxhdW5jaEFjdGl2aXR5T25EaXNwbGF5KEJST0FEQ0FTVF9SRUNFSVZFUl9BQ1RJVklUWSwgbmV3RGlzcGxheS5tSWQpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUoQlJPQURDQVNUX1JFQ0VJVkVSX0FDVElWSVRZKTsKKworICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgZmlyc3QgYWN0aXZpdHkgaXMgbGF1bmNoZWQgb250byB0aGUgc2Vjb25kYXJ5IGRpc3BsYXkKKyAgICAgICAgICAgIGZpbmFsIGludCBmcm9udFN0YWNrSWQgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRGcm9udFN0YWNrSWQobmV3RGlzcGxheS5tSWQpOworICAgICAgICAgICAgZmluYWwgQWN0aXZpdHlNYW5hZ2VyU3RhdGUuQWN0aXZpdHlTdGFjayBmaXJzdEZyb250U3RhY2sgPQorICAgICAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja0J5SWQoZnJvbnRTdGFja0lkKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiQWN0aXZpdHkgbGF1bmNoZWQgb24gc2Vjb25kYXJ5IGRpc3BsYXkgbXVzdCBiZSByZXN1bWVkIiwKKyAgICAgICAgICAgICAgICAgICAgZ2V0QWN0aXZpdHlOYW1lKEJST0FEQ0FTVF9SRUNFSVZFUl9BQ1RJVklUWSksCisgICAgICAgICAgICAgICAgICAgIGZpcnN0RnJvbnRTdGFjay5tUmVzdW1lZEFjdGl2aXR5KTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZFN0YWNrKCJGb2N1cyBtdXN0IGJlIG9uIHNlY29uZGFyeSBkaXNwbGF5IiwgZnJvbnRTdGFja0lkKTsKKworICAgICAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZCgiYW0gc3RhcnQgLW4gIiArIGdldEFjdGl2aXR5TmFtZShURVNUX0FDVElWSVRZKSk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JWYWxpZFN0YXRlKFRFU1RfQUNUSVZJVFkpOworCisgICAgICAgICAgICAvLyBDaGVjayB0aGF0IHRoZSBzZWNvbmQgYWN0aXZpdHkgaXMgbGF1bmNoZWQgb24gdGhlIGRlZmF1bHQgZGlzcGxheQorICAgICAgICAgICAgZmluYWwgaW50IGZvY3VzZWRTdGFja0lkID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0Rm9jdXNlZFN0YWNrSWQoKTsKKyAgICAgICAgICAgIGZpbmFsIEFjdGl2aXR5TWFuYWdlclN0YXRlLkFjdGl2aXR5U3RhY2sgZm9jdXNlZFN0YWNrID0KKyAgICAgICAgICAgICAgICAgICAgbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0U3RhY2tCeUlkKGZvY3VzZWRTdGFja0lkKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiQWN0aXZpdHkgbGF1bmNoZWQgb24gZGVmYXVsdCBkaXNwbGF5IG11c3QgYmUgcmVzdW1lZCIsCisgICAgICAgICAgICAgICAgICAgIGdldEFjdGl2aXR5TmFtZShURVNUX0FDVElWSVRZKSwgZm9jdXNlZFN0YWNrLm1SZXN1bWVkQWN0aXZpdHkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJGb2N1cyBtdXN0IGJlIG9uIHByaW1hcnkgZGlzcGxheSIsCisgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfRElTUExBWSwgZm9jdXNlZFN0YWNrLm1EaXNwbGF5SWQpOworCisgICAgICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKExBVU5DSF9BQ1RJVklUWV9CUk9BRENBU1QgKyBnZXRBY3Rpdml0eU5hbWUoTEFVTkNISU5HX0FDVElWSVRZKSk7CisKKyAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgdGhlIHRoaXJkIGFjdGl2aXR5IGVuZHMgdXAgaW4gYSBuZXcgdGFzayBpbiB0aGUgc2FtZSBzdGFjayBhcyB0aGUKKyAgICAgICAgICAgIC8vIGZpcnN0IGFjdGl2aXR5CisgICAgICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JWYWxpZFN0YXRlKExBVU5DSElOR19BQ1RJVklUWSk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRTdGFjaygiRm9jdXMgbXVzdCBiZSBvbiBzZWNvbmRhcnkgZGlzcGxheSIsIGZyb250U3RhY2tJZCk7CisgICAgICAgICAgICBmaW5hbCBBY3Rpdml0eU1hbmFnZXJTdGF0ZS5BY3Rpdml0eVN0YWNrIHNlY29uZEZyb250U3RhY2sgPQorICAgICAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja0J5SWQoZnJvbnRTdGFja0lkKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiQWN0aXZpdHkgbXVzdCBiZSBsYXVuY2hlZCBvbiBzZWNvbmRhcnkgZGlzcGxheSIsCisgICAgICAgICAgICAgICAgICAgIGdldEFjdGl2aXR5TmFtZShMQVVOQ0hJTkdfQUNUSVZJVFkpLCBzZWNvbmRGcm9udFN0YWNrLm1SZXN1bWVkQWN0aXZpdHkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJTZWNvbmRhcnkgZGlzcGxheSBtdXN0IGNvbnRhaW4gMiB0YXNrcyIsCisgICAgICAgICAgICAgICAgICAgIDIsIHNlY29uZEZyb250U3RhY2suZ2V0VGFza3MoKS5zaXplKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhhbiBhbiBpbW1lZGlhdGUgbGF1bmNoIGFmdGVyIG5ldyBkaXNwbGF5IGNyZWF0aW9uIGlzIGhhbmRsZWQgY29ycmVjdGx5LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEltbWVkaWF0ZUxhdW5jaE9uTmV3RGlzcGxheSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgKGZpbmFsIFZpcnR1YWxEaXNwbGF5U2Vzc2lvbiB2aXJ0dWFsRGlzcGxheVNlc3Npb24gPSBuZXcgVmlydHVhbERpc3BsYXlTZXNzaW9uKCkpIHsKKyAgICAgICAgICAgIC8vIENyZWF0ZSBuZXcgdmlydHVhbCBkaXNwbGF5IGFuZCBpbW1lZGlhdGVseSBsYXVuY2ggYW4gYWN0aXZpdHkgb24gaXQuCisgICAgICAgICAgICBmaW5hbCBBY3Rpdml0eURpc3BsYXkgbmV3RGlzcGxheSA9IHZpcnR1YWxEaXNwbGF5U2Vzc2lvbgorICAgICAgICAgICAgICAgICAgICAuc2V0TGF1bmNoQWN0aXZpdHkoVEVTVF9BQ1RJVklUWSkKKyAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZURpc3BsYXkoKTsKKworICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCBhY3Rpdml0eSBpcyBsYXVuY2hlZCBhbmQgcGxhY2VkIGNvcnJlY3RseS4KKyAgICAgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvckFjdGl2aXR5U3RhdGUoVEVTVF9BQ1RJVklUWSwgU1RBVEVfUkVTVU1FRCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFJlc3VtZWRBY3Rpdml0eSgiVGVzdCBhY3Rpdml0eSBtdXN0IGJlIGxhdW5jaGVkIG9uIGEgbmV3IGRpc3BsYXkiLAorICAgICAgICAgICAgICAgICAgICBURVNUX0FDVElWSVRZKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBmcm9udFN0YWNrSWQgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRGcm9udFN0YWNrSWQobmV3RGlzcGxheS5tSWQpOworICAgICAgICAgICAgZmluYWwgQWN0aXZpdHlNYW5hZ2VyU3RhdGUuQWN0aXZpdHlTdGFjayBmaXJzdEZyb250U3RhY2sgPQorICAgICAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja0J5SWQoZnJvbnRTdGFja0lkKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiQWN0aXZpdHkgbGF1bmNoZWQgb24gc2Vjb25kYXJ5IGRpc3BsYXkgbXVzdCBiZSByZXN1bWVkIiwKKyAgICAgICAgICAgICAgICAgICAgZ2V0QWN0aXZpdHlOYW1lKFRFU1RfQUNUSVZJVFkpLCBmaXJzdEZyb250U3RhY2subVJlc3VtZWRBY3Rpdml0eSk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRTdGFjaygiRm9jdXMgbXVzdCBiZSBvbiBzZWNvbmRhcnkgZGlzcGxheSIsIGZyb250U3RhY2tJZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB0aGF0IHR1cm5pbmcgdGhlIHByaW1hcnkgZGlzcGxheSBvZmYgZG9lcyBub3QgYWZmZWN0IHRoZSBhY3Rpdml0eSBydW5uaW5nCisgICAgICogb24gYW4gZXh0ZXJuYWwgc2Vjb25kYXJ5IGRpc3BsYXkuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXh0ZXJuYWxEaXNwbGF5QWN0aXZpdHlUdXJuUHJpbWFyeU9mZigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBMYXVuY2ggc29tZXRoaW5nIG9uIHRoZSBwcmltYXJ5IGRpc3BsYXkgc28gd2Uga25vdyB0aGVyZSBpcyBhIHJlc3VtZWQgYWN0aXZpdHkgdGhlcmUKKyAgICAgICAgbGF1bmNoQWN0aXZpdHkoUkVTSVpFQUJMRV9BQ1RJVklUWSk7CisgICAgICAgIHdhaXRBbmRBc3NlcnRBY3Rpdml0eVJlc3VtZWQoUkVTSVpFQUJMRV9BQ1RJVklUWSwgREVGQVVMVF9ESVNQTEFZLAorICAgICAgICAgICAgICAgICJBY3Rpdml0eSBsYXVuY2hlZCBvbiBwcmltYXJ5IGRpc3BsYXkgbXVzdCBiZSByZXN1bWVkIik7CisKKyAgICAgICAgdHJ5IChmaW5hbCBFeHRlcm5hbERpc3BsYXlTZXNzaW9uIGV4dGVybmFsRGlzcGxheVNlc3Npb24gPSBuZXcgRXh0ZXJuYWxEaXNwbGF5U2Vzc2lvbigpOworICAgICAgICAgICAgIGZpbmFsIFByaW1hcnlEaXNwbGF5U3RhdGVTZXNzaW9uIGRpc3BsYXlTdGF0ZVNlc3Npb24gPQorICAgICAgICAgICAgICAgICAgICAgbmV3IFByaW1hcnlEaXNwbGF5U3RhdGVTZXNzaW9uKCkpIHsKKyAgICAgICAgICAgIGZpbmFsIEFjdGl2aXR5RGlzcGxheSBuZXdEaXNwbGF5ID0KKyAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWxEaXNwbGF5U2Vzc2lvbi5jcmVhdGVWaXJ0dWFsRGlzcGxheSh0cnVlIC8qIHNob3dDb250ZW50V2hlbkxvY2tlZCAqLyk7CisKKyAgICAgICAgICAgIGxhdW5jaEFjdGl2aXR5T25EaXNwbGF5KFRFU1RfQUNUSVZJVFksIG5ld0Rpc3BsYXkubUlkKTsKKworICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgYWN0aXZpdHkgaXMgbGF1bmNoZWQgb250byB0aGUgZXh0ZXJuYWwgZGlzcGxheQorICAgICAgICAgICAgd2FpdEFuZEFzc2VydEFjdGl2aXR5UmVzdW1lZChURVNUX0FDVElWSVRZLCBuZXdEaXNwbGF5Lm1JZCwKKyAgICAgICAgICAgICAgICAgICAgIkFjdGl2aXR5IGxhdW5jaGVkIG9uIGV4dGVybmFsIGRpc3BsYXkgbXVzdCBiZSByZXN1bWVkIik7CisKKyAgICAgICAgICAgIGZpbmFsIExvZ1NlcGFyYXRvciBsb2dTZXBhcmF0b3IgPSBzZXBhcmF0ZUxvZ3MoKTsKKworICAgICAgICAgICAgZGlzcGxheVN0YXRlU2Vzc2lvbi50dXJuU2NyZWVuT2ZmKCk7CisKKyAgICAgICAgICAgIC8vIFdhaXQgZm9yIHRoZSBmdWxsc2NyZWVuIHN0YWNrIHRvIHN0YXJ0IHNsZWVwaW5nLCBhbmQgdGhlbiBtYWtlIHN1cmUgdGhlCisgICAgICAgICAgICAvLyB0ZXN0IGFjdGl2aXR5IGlzIHN0aWxsIHJlc3VtZWQuCisgICAgICAgICAgICBpbnQgcmV0cnkgPSAwOworICAgICAgICAgICAgQWN0aXZpdHlMaWZlY3ljbGVDb3VudHMgbGlmZWN5Y2xlQ291bnRzOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGxpZmVjeWNsZUNvdW50cyA9IG5ldyBBY3Rpdml0eUxpZmVjeWNsZUNvdW50cyhSRVNJWkVBQkxFX0FDVElWSVRZLCBsb2dTZXBhcmF0b3IpOworICAgICAgICAgICAgICAgIGlmIChsaWZlY3ljbGVDb3VudHMubVN0b3BDb3VudCA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsb2dBbHdheXMoIioqKnRlc3RFeHRlcm5hbERpc3BsYXlBY3Rpdml0eVR1cm5QcmltYXJ5T2ZmLi4uIHJldHJ5PSIgKyByZXRyeSk7CisgICAgICAgICAgICAgICAgU3lzdGVtQ2xvY2suc2xlZXAoVGltZVVuaXQuU0VDT05EUy50b01pbGxpcygxKSk7CisgICAgICAgICAgICB9IHdoaWxlIChyZXRyeSsrIDwgNSk7CisKKyAgICAgICAgICAgIGlmIChsaWZlY3ljbGVDb3VudHMubVN0b3BDb3VudCAhPSAxKSB7CisgICAgICAgICAgICAgICAgZmFpbChSRVNJWkVBQkxFX0FDVElWSVRZICsgIiBoYXMgcmVjZWl2ZWQgIiArIGxpZmVjeWNsZUNvdW50cy5tU3RvcENvdW50CisgICAgICAgICAgICAgICAgICAgICAgICArICIgb25TdG9wKCkgY2FsbHMsIGV4cGVjdGluZyAxIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3YWl0QW5kQXNzZXJ0QWN0aXZpdHlSZXN1bWVkKFRFU1RfQUNUSVZJVFksIG5ld0Rpc3BsYXkubUlkLAorICAgICAgICAgICAgICAgICAgICAiQWN0aXZpdHkgbGF1bmNoZWQgb24gZXh0ZXJuYWwgZGlzcGxheSBtdXN0IGJlIHJlc3VtZWQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoYXQgYW4gYWN0aXZpdHkgY2FuIGJlIGxhdW5jaGVkIG9uIGEgc2Vjb25kYXJ5IGRpc3BsYXkgd2hpbGUgdGhlIHByaW1hcnkKKyAgICAgKiBkaXNwbGF5IGlzIG9mZi4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMYXVuY2hFeHRlcm5hbERpc3BsYXlBY3Rpdml0eVdoaWxlUHJpbWFyeU9mZigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBMYXVuY2ggc29tZXRoaW5nIG9uIHRoZSBwcmltYXJ5IGRpc3BsYXkgc28gd2Uga25vdyB0aGVyZSBpcyBhIHJlc3VtZWQgYWN0aXZpdHkgdGhlcmUKKyAgICAgICAgbGF1bmNoQWN0aXZpdHkoUkVTSVpFQUJMRV9BQ1RJVklUWSk7CisgICAgICAgIHdhaXRBbmRBc3NlcnRBY3Rpdml0eVJlc3VtZWQoUkVTSVpFQUJMRV9BQ1RJVklUWSwgREVGQVVMVF9ESVNQTEFZLAorICAgICAgICAgICAgICAgICJBY3Rpdml0eSBsYXVuY2hlZCBvbiBwcmltYXJ5IGRpc3BsYXkgbXVzdCBiZSByZXN1bWVkIik7CisKKyAgICAgICAgdHJ5IChmaW5hbCBQcmltYXJ5RGlzcGxheVN0YXRlU2Vzc2lvbiBkaXNwbGF5U3RhdGVTZXNzaW9uID0KKyAgICAgICAgICAgICAgICAgICAgIG5ldyBQcmltYXJ5RGlzcGxheVN0YXRlU2Vzc2lvbigpOworICAgICAgICAgICAgIGZpbmFsIEV4dGVybmFsRGlzcGxheVNlc3Npb24gZXh0ZXJuYWxEaXNwbGF5U2Vzc2lvbiA9IG5ldyBFeHRlcm5hbERpc3BsYXlTZXNzaW9uKCkpIHsKKyAgICAgICAgICAgIGRpc3BsYXlTdGF0ZVNlc3Npb24udHVyblNjcmVlbk9mZigpOworCisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlcmUgaXMgbm8gcmVzdW1lZCBhY3Rpdml0eSB3aGVuIHRoZSBwcmltYXJ5IGRpc3BsYXkgaXMgb2ZmCisgICAgICAgICAgICB3YWl0QW5kQXNzZXJ0QWN0aXZpdHlTdG9wcGVkKFJFU0laRUFCTEVfQUNUSVZJVFksCisgICAgICAgICAgICAgICAgICAgICJBY3Rpdml0eSBsYXVuY2hlZCBvbiBwcmltYXJ5IGRpc3BsYXkgbXVzdCBiZSBzdG9wcGVkIGFmdGVyIHR1cm5pbmcgb2ZmIik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgcmVzdW1lZCBhY3Rpdml0eSIsCisgICAgICAgICAgICAgICAgICAgIDAsIG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFJlc3VtZWRBY3Rpdml0aWVzQ291bnQoKSk7CisKKyAgICAgICAgICAgIGZpbmFsIEFjdGl2aXR5RGlzcGxheSBuZXdEaXNwbGF5ID0KKyAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWxEaXNwbGF5U2Vzc2lvbi5jcmVhdGVWaXJ0dWFsRGlzcGxheSh0cnVlIC8qIHNob3dDb250ZW50V2hlbkxvY2tlZCAqLyk7CisKKyAgICAgICAgICAgIGxhdW5jaEFjdGl2aXR5T25EaXNwbGF5KFRFU1RfQUNUSVZJVFksIG5ld0Rpc3BsYXkubUlkKTsKKworICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgdGVzdCBhY3Rpdml0eSBpcyByZXN1bWVkIG9uIHRoZSBleHRlcm5hbCBkaXNwbGF5CisgICAgICAgICAgICB3YWl0QW5kQXNzZXJ0QWN0aXZpdHlSZXN1bWVkKFRFU1RfQUNUSVZJVFksIG5ld0Rpc3BsYXkubUlkLAorICAgICAgICAgICAgICAgICAgICAiQWN0aXZpdHkgbGF1bmNoZWQgb24gZXh0ZXJuYWwgZGlzcGxheSBtdXN0IGJlIHJlc3VtZWQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoYXQgdHVybmluZyB0aGUgc2Vjb25kYXJ5IGRpc3BsYXkgb2ZmIHN0b3BzIGFjdGl2aXRpZXMgcnVubmluZyBvbiB0aGF0IGRpc3BsYXkuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXh0ZXJuYWxEaXNwbGF5VG9nZ2xlU3RhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IChmaW5hbCBFeHRlcm5hbERpc3BsYXlTZXNzaW9uIGV4dGVybmFsRGlzcGxheVNlc3Npb24gPSBuZXcgRXh0ZXJuYWxEaXNwbGF5U2Vzc2lvbigpKSB7CisgICAgICAgICAgICBmaW5hbCBBY3Rpdml0eURpc3BsYXkgbmV3RGlzcGxheSA9CisgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsRGlzcGxheVNlc3Npb24uY3JlYXRlVmlydHVhbERpc3BsYXkoZmFsc2UgLyogc2hvd0NvbnRlbnRXaGVuTG9ja2VkICovKTsKKworICAgICAgICAgICAgbGF1bmNoQWN0aXZpdHlPbkRpc3BsYXkoVEVTVF9BQ1RJVklUWSwgbmV3RGlzcGxheS5tSWQpOworCisgICAgICAgICAgICAvLyBDaGVjayB0aGF0IHRoZSB0ZXN0IGFjdGl2aXR5IGlzIHJlc3VtZWQgb24gdGhlIGV4dGVybmFsIGRpc3BsYXkKKyAgICAgICAgICAgIHdhaXRBbmRBc3NlcnRBY3Rpdml0eVJlc3VtZWQoVEVTVF9BQ1RJVklUWSwgbmV3RGlzcGxheS5tSWQsCisgICAgICAgICAgICAgICAgICAgICJBY3Rpdml0eSBsYXVuY2hlZCBvbiBleHRlcm5hbCBkaXNwbGF5IG11c3QgYmUgcmVzdW1lZCIpOworCisgICAgICAgICAgICBleHRlcm5hbERpc3BsYXlTZXNzaW9uLnR1cm5EaXNwbGF5T2ZmKCk7CisKKyAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgdHVybmluZyBvZmYgdGhlIGV4dGVybmFsIGRpc3BsYXkgc3RvcHMgdGhlIGFjdGl2aXR5CisgICAgICAgICAgICB3YWl0QW5kQXNzZXJ0QWN0aXZpdHlTdG9wcGVkKFRFU1RfQUNUSVZJVFksCisgICAgICAgICAgICAgICAgICAgICJBY3Rpdml0eSBsYXVuY2hlZCBvbiBleHRlcm5hbCBkaXNwbGF5IG11c3QgYmUgc3RvcHBlZCBhZnRlciB0dXJuaW5nIG9mZiIpOworCisgICAgICAgICAgICBleHRlcm5hbERpc3BsYXlTZXNzaW9uLnR1cm5EaXNwbGF5T24oKTsKKworICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCB0dXJuaW5nIG9uIHRoZSBleHRlcm5hbCBkaXNwbGF5IHJlc3VtZXMgdGhlIGFjdGl2aXR5CisgICAgICAgICAgICB3YWl0QW5kQXNzZXJ0QWN0aXZpdHlSZXN1bWVkKFRFU1RfQUNUSVZJVFksIG5ld0Rpc3BsYXkubUlkLAorICAgICAgICAgICAgICAgICAgICAiQWN0aXZpdHkgbGF1bmNoZWQgb24gZXh0ZXJuYWwgZGlzcGxheSBtdXN0IGJlIHJlc3VtZWQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoYXQgdGFwcGluZyBvbiB0aGUgcHJpbWFyeSBkaXNwbGF5IGFmdGVyIHNob3dpbmcgdGhlIGtleWd1YXJkIHJlc3VtZXMgdGhlCisgICAgICogYWN0aXZpdHkgb24gdGhlIHByaW1hcnkgZGlzcGxheS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFja0ZvY3VzU3dpdGNoT25Ub3VjaEV2ZW50QWZ0ZXJLZXlndWFyZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBMYXVuY2ggc29tZXRoaW5nIG9uIHRoZSBwcmltYXJ5IGRpc3BsYXkgc28gd2Uga25vdyB0aGVyZSBpcyBhIHJlc3VtZWQgYWN0aXZpdHkgdGhlcmUKKyAgICAgICAgbGF1bmNoQWN0aXZpdHkoUkVTSVpFQUJMRV9BQ1RJVklUWSk7CisgICAgICAgIHdhaXRBbmRBc3NlcnRBY3Rpdml0eVJlc3VtZWQoUkVTSVpFQUJMRV9BQ1RJVklUWSwgREVGQVVMVF9ESVNQTEFZLAorICAgICAgICAgICAgICAgICJBY3Rpdml0eSBsYXVuY2hlZCBvbiBwcmltYXJ5IGRpc3BsYXkgbXVzdCBiZSByZXN1bWVkIik7CisKKyAgICAgICAgdHJ5IChmaW5hbCBMb2NrU2NyZWVuU2Vzc2lvbiBsb2NrU2NyZWVuU2Vzc2lvbiA9IG5ldyBMb2NrU2NyZWVuU2Vzc2lvbigpOworICAgICAgICAgICAgIGZpbmFsIEV4dGVybmFsRGlzcGxheVNlc3Npb24gZXh0ZXJuYWxEaXNwbGF5U2Vzc2lvbiA9IG5ldyBFeHRlcm5hbERpc3BsYXlTZXNzaW9uKCkpIHsKKyAgICAgICAgICAgIGxvY2tTY3JlZW5TZXNzaW9uLnNsZWVwRGV2aWNlKCk7CisKKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGVyZSBpcyBubyByZXN1bWVkIGFjdGl2aXR5IHdoZW4gdGhlIHByaW1hcnkgZGlzcGxheSBpcyBvZmYKKyAgICAgICAgICAgIHdhaXRBbmRBc3NlcnRBY3Rpdml0eVN0b3BwZWQoUkVTSVpFQUJMRV9BQ1RJVklUWSwKKyAgICAgICAgICAgICAgICAgICAgIkFjdGl2aXR5IGxhdW5jaGVkIG9uIHByaW1hcnkgZGlzcGxheSBtdXN0IGJlIHN0b3BwZWQgYWZ0ZXIgdHVybmluZyBvZmYiKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCByZXN1bWVkIGFjdGl2aXR5IiwKKyAgICAgICAgICAgICAgICAgICAgMCwgbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0UmVzdW1lZEFjdGl2aXRpZXNDb3VudCgpKTsKKworICAgICAgICAgICAgZmluYWwgQWN0aXZpdHlEaXNwbGF5IG5ld0Rpc3BsYXkgPQorICAgICAgICAgICAgICAgICAgICBleHRlcm5hbERpc3BsYXlTZXNzaW9uLmNyZWF0ZVZpcnR1YWxEaXNwbGF5KHRydWUgLyogc2hvd0NvbnRlbnRXaGVuTG9ja2VkICovKTsKKworICAgICAgICAgICAgbGF1bmNoQWN0aXZpdHlPbkRpc3BsYXkoVEVTVF9BQ1RJVklUWSwgbmV3RGlzcGxheS5tSWQpOworCisgICAgICAgICAgICAvLyBDaGVjayB0aGF0IHRoZSB0ZXN0IGFjdGl2aXR5IGlzIHJlc3VtZWQgb24gdGhlIGV4dGVybmFsIGRpc3BsYXkKKyAgICAgICAgICAgIHdhaXRBbmRBc3NlcnRBY3Rpdml0eVJlc3VtZWQoVEVTVF9BQ1RJVklUWSwgbmV3RGlzcGxheS5tSWQsCisgICAgICAgICAgICAgICAgICAgICJBY3Rpdml0eSBsYXVuY2hlZCBvbiBleHRlcm5hbCBkaXNwbGF5IG11c3QgYmUgcmVzdW1lZCIpOworCisgICAgICAgICAgICAvLyBVbmxvY2sgdGhlIGRldmljZSBhbmQgdGFwIG9uIHRoZSBtaWRkbGUgb2YgdGhlIHByaW1hcnkgZGlzcGxheQorICAgICAgICAgICAgbG9ja1NjcmVlblNlc3Npb24ud2FrZVVwRGV2aWNlKCk7CisgICAgICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKCJ3bSBkaXNtaXNzLWtleWd1YXJkIik7CisgICAgICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JLZXlndWFyZEdvbmUoKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvclZhbGlkU3RhdGUoVEVTVF9BQ1RJVklUWSk7CisgICAgICAgICAgICBmaW5hbCBSZXBvcnRlZERpc3BsYXlNZXRyaWNzIGRpc3BsYXlNZXRyaWNzID0gZ2V0RGlzcGxheU1ldHJpY3MoKTsKKyAgICAgICAgICAgIGZpbmFsIGludCB3aWR0aCA9IGRpc3BsYXlNZXRyaWNzLmdldFNpemUoKS5nZXRXaWR0aCgpOworICAgICAgICAgICAgZmluYWwgaW50IGhlaWdodCA9IGRpc3BsYXlNZXRyaWNzLmdldFNpemUoKS5nZXRIZWlnaHQoKTsKKyAgICAgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoImlucHV0IHRhcCAiICsgKHdpZHRoIC8gMikgKyAiICIgKyAoaGVpZ2h0IC8gMikpOworCisgICAgICAgICAgICAvLyBDaGVjayB0aGF0IHRoZSBhY3Rpdml0eSBvbiB0aGUgcHJpbWFyeSBkaXNwbGF5IGlzIHJlc3VtZWQKKyAgICAgICAgICAgIHdhaXRBbmRBc3NlcnRBY3Rpdml0eVJlc3VtZWQoUkVTSVpFQUJMRV9BQ1RJVklUWSwgREVGQVVMVF9ESVNQTEFZLAorICAgICAgICAgICAgICAgICAgICAiQWN0aXZpdHkgbGF1bmNoZWQgb24gcHJpbWFyeSBkaXNwbGF5IG11c3QgYmUgcmVzdW1lZCIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIHJlc3VtZWQgYWN0aXZpdHkiLAorICAgICAgICAgICAgICAgICAgICAxLCBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRSZXN1bWVkQWN0aXZpdGllc0NvdW50KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdhaXRBbmRBc3NlcnRBY3Rpdml0eVJlc3VtZWQoCisgICAgICAgICAgICBDb21wb25lbnROYW1lIGFjdGl2aXR5TmFtZSwgaW50IGRpc3BsYXlJZCwgU3RyaW5nIG1lc3NhZ2UpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JBY3Rpdml0eVN0YXRlKGFjdGl2aXR5TmFtZSwgU1RBVEVfUkVTVU1FRCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgZ2V0QWN0aXZpdHlOYW1lKGFjdGl2aXR5TmFtZSksIG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFJlc3VtZWRBY3Rpdml0eSgpKTsKKyAgICAgICAgZmluYWwgaW50IGZyb250U3RhY2tJZCA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEZyb250U3RhY2tJZChkaXNwbGF5SWQpOworICAgICAgICBBY3Rpdml0eU1hbmFnZXJTdGF0ZS5BY3Rpdml0eVN0YWNrIGZpcnN0RnJvbnRTdGFjayA9CisgICAgICAgICAgICAgICAgbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0U3RhY2tCeUlkKGZyb250U3RhY2tJZCk7CisgICAgICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLAorICAgICAgICAgICAgICAgIGdldEFjdGl2aXR5TmFtZShhY3Rpdml0eU5hbWUpLCBmaXJzdEZyb250U3RhY2subVJlc3VtZWRBY3Rpdml0eSk7CisgICAgICAgIGFzc2VydFRydWUobWVzc2FnZSwKKyAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5oYXNBY3Rpdml0eVN0YXRlKGFjdGl2aXR5TmFtZSwgU1RBVEVfUkVTVU1FRCkpOworICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRTdGFjaygiRm9jdXMgbXVzdCBiZSBvbiBleHRlcm5hbCBkaXNwbGF5IiwgZnJvbnRTdGFja0lkKTsKKyAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KGFjdGl2aXR5TmFtZSwgdHJ1ZSAvKiB2aXNpYmxlICovKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgd2FpdEFuZEFzc2VydEFjdGl2aXR5U3RvcHBlZChDb21wb25lbnROYW1lIGFjdGl2aXR5TmFtZSwgU3RyaW5nIG1lc3NhZ2UpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yQWN0aXZpdHlTdGF0ZShhY3Rpdml0eU5hbWUsIFNUQVRFX1NUT1BQRUQpOworCisgICAgICAgIGFzc2VydFRydWUobWVzc2FnZSwgbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuaGFzQWN0aXZpdHlTdGF0ZShhY3Rpdml0eU5hbWUsCisgICAgICAgICAgICAgICAgU1RBVEVfU1RPUFBFRCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoYXQgc2hvd1doZW5Mb2NrZWQgd29ya3Mgb24gYSBzZWNvbmRhcnkgZGlzcGxheS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZWNvbmRhcnlEaXNwbGF5U2hvd1doZW5Mb2NrZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IChmaW5hbCBFeHRlcm5hbERpc3BsYXlTZXNzaW9uIGV4dGVybmFsRGlzcGxheVNlc3Npb24gPSBuZXcgRXh0ZXJuYWxEaXNwbGF5U2Vzc2lvbigpOworICAgICAgICAgICAgIGZpbmFsIExvY2tTY3JlZW5TZXNzaW9uIGxvY2tTY3JlZW5TZXNzaW9uID0gbmV3IExvY2tTY3JlZW5TZXNzaW9uKCkpIHsKKyAgICAgICAgICAgIGxvY2tTY3JlZW5TZXNzaW9uLnNldExvY2tDcmVkZW50aWFsKCk7CisKKyAgICAgICAgICAgIGxhdW5jaEFjdGl2aXR5KFRFU1RfQUNUSVZJVFkpOworCisgICAgICAgICAgICBmaW5hbCBBY3Rpdml0eURpc3BsYXkgbmV3RGlzcGxheSA9CisgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsRGlzcGxheVNlc3Npb24uY3JlYXRlVmlydHVhbERpc3BsYXkoZmFsc2UgLyogc2hvd0NvbnRlbnRXaGVuTG9ja2VkICovKTsKKyAgICAgICAgICAgIGxhdW5jaEFjdGl2aXR5T25EaXNwbGF5KFNIT1dfV0hFTl9MT0NLRURfQVRUUl9BQ1RJVklUWSwgbmV3RGlzcGxheS5tSWQpOworCisgICAgICAgICAgICBsb2NrU2NyZWVuU2Vzc2lvbi5nb3RvS2V5Z3VhcmQoKTsKKworICAgICAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yQWN0aXZpdHlTdGF0ZShURVNUX0FDVElWSVRZLCBTVEFURV9TVE9QUEVEKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvckFjdGl2aXR5U3RhdGUoU0hPV19XSEVOX0xPQ0tFRF9BVFRSX0FDVElWSVRZLCBTVEFURV9SRVNVTUVEKTsKKworICAgICAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUoU0hPV19XSEVOX0xPQ0tFRF9BVFRSX0FDVElWSVRZKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkV4cGVjdGVkIHJlc3VtZWQgYWN0aXZpdHkgb24gc2Vjb25kYXJ5IGRpc3BsYXkiLCBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKQorICAgICAgICAgICAgICAgICAgICAuaGFzQWN0aXZpdHlTdGF0ZShTSE9XX1dIRU5fTE9DS0VEX0FUVFJfQUNUSVZJVFksIFNUQVRFX1JFU1VNRUQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBBc3NlcnQgdGhhdCBjb21wb25lbnQgcmVjZWl2ZWQgb25Nb3ZlZFRvRGlzcGxheSBhbmQgb25Db25maWd1cmF0aW9uQ2hhbmdlZCBjYWxsYmFja3MuICovCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydE1vdmVkVG9EaXNwbGF5KENvbXBvbmVudE5hbWUgY29tcG9uZW50TmFtZSwgTG9nU2VwYXJhdG9yIGxvZ1NlcGFyYXRvcikKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBBY3Rpdml0eUxpZmVjeWNsZUNvdW50cyBsaWZlY3ljbGVDb3VudHMgPQorICAgICAgICAgICAgICAgIG5ldyBBY3Rpdml0eUxpZmVjeWNsZUNvdW50cyhjb21wb25lbnROYW1lLCBsb2dTZXBhcmF0b3IpOworICAgICAgICBpZiAobGlmZWN5Y2xlQ291bnRzLm1EZXN0cm95Q291bnQgIT0gMCkgeworICAgICAgICAgICAgZmFpbChjb21wb25lbnROYW1lICsgIiBoYXMgYmVlbiBkZXN0cm95ZWQgIiArIGxpZmVjeWNsZUNvdW50cy5tRGVzdHJveUNvdW50CisgICAgICAgICAgICAgICAgICAgICsgIiB0aW1lKHMpLCB3YXNuJ3QgZXhwZWN0aW5nIGFueSIpOworICAgICAgICB9IGVsc2UgaWYgKGxpZmVjeWNsZUNvdW50cy5tQ3JlYXRlQ291bnQgIT0gMCkgeworICAgICAgICAgICAgZmFpbChjb21wb25lbnROYW1lICsgIiBoYXMgYmVlbiAocmUpY3JlYXRlZCAiICsgbGlmZWN5Y2xlQ291bnRzLm1DcmVhdGVDb3VudAorICAgICAgICAgICAgICAgICAgICArICIgdGltZShzKSwgd2Fzbid0IGV4cGVjdGluZyBhbnkiKTsKKyAgICAgICAgfSBlbHNlIGlmIChsaWZlY3ljbGVDb3VudHMubUNvbmZpZ3VyYXRpb25DaGFuZ2VkQ291bnQgIT0gMSkgeworICAgICAgICAgICAgZmFpbChjb21wb25lbnROYW1lICsgIiBoYXMgcmVjZWl2ZWQgIgorICAgICAgICAgICAgICAgICAgICArIGxpZmVjeWNsZUNvdW50cy5tQ29uZmlndXJhdGlvbkNoYW5nZWRDb3VudAorICAgICAgICAgICAgICAgICAgICArICIgb25Db25maWd1cmF0aW9uQ2hhbmdlZCgpIGNhbGxzLCBleHBlY3RpbmcgIiArIDEpOworICAgICAgICB9IGVsc2UgaWYgKGxpZmVjeWNsZUNvdW50cy5tTW92ZWRUb0Rpc3BsYXlDb3VudCAhPSAxKSB7CisgICAgICAgICAgICBmYWlsKGNvbXBvbmVudE5hbWUgKyAiIGhhcyByZWNlaXZlZCAiCisgICAgICAgICAgICAgICAgICAgICsgbGlmZWN5Y2xlQ291bnRzLm1Nb3ZlZFRvRGlzcGxheUNvdW50CisgICAgICAgICAgICAgICAgICAgICsgIiBvbk1vdmVkVG9EaXNwbGF5KCkgY2FsbHMsIGV4cGVjdGluZyAiICsgMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIEV4dGVybmFsRGlzcGxheVNlc3Npb24gaW1wbGVtZW50cyBBdXRvQ2xvc2VhYmxlIHsKKworICAgICAgICBATnVsbGFibGUKKyAgICAgICAgcHJpdmF0ZSBWaXJ0dWFsRGlzcGxheUhlbHBlciBtRXh0ZXJuYWxEaXNwbGF5SGVscGVyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgcHJpdmF0ZSB2aXJ0dWFsIGRpc3BsYXkgd2l0aCB0aGUgZXh0ZXJuYWwgYW5kIHNob3cgd2l0aCBpbnNlY3VyZQorICAgICAgICAgKiBrZXlndWFyZCBmbGFncyBzZXQuCisgICAgICAgICAqLworICAgICAgICBBY3Rpdml0eURpc3BsYXkgY3JlYXRlVmlydHVhbERpc3BsYXkoYm9vbGVhbiBzaG93Q29udGVudFdoZW5Mb2NrZWQpCisgICAgICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBMaXN0PEFjdGl2aXR5RGlzcGxheT4gb3JpZ2luYWxEUyA9IGdldERpc3BsYXlzU3RhdGVzKCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgb3JpZ2luYWxEaXNwbGF5Q291bnQgPSBvcmlnaW5hbERTLnNpemUoKTsKKworICAgICAgICAgICAgbUV4dGVybmFsRGlzcGxheUhlbHBlciA9IG5ldyBWaXJ0dWFsRGlzcGxheUhlbHBlcigpOworICAgICAgICAgICAgbUV4dGVybmFsRGlzcGxheUhlbHBlci5jcmVhdGVBbmRXYWl0Rm9yRGlzcGxheShzaG93Q29udGVudFdoZW5Mb2NrZWQpOworCisgICAgICAgICAgICAvLyBXYWl0IGZvciB0aGUgdmlydHVhbCBkaXNwbGF5IHRvIGJlIGNyZWF0ZWQgYW5kIGdldCBjb25maWd1cmF0aW9ucy4KKyAgICAgICAgICAgIGZpbmFsIExpc3Q8QWN0aXZpdHlEaXNwbGF5PiBkcyA9IGdldERpc3BsYXlTdGF0ZUFmdGVyQ2hhbmdlKG9yaWdpbmFsRGlzcGxheUNvdW50ICsgMSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIk5ldyB2aXJ0dWFsIGRpc3BsYXkgbXVzdCBiZSBjcmVhdGVkIiwgb3JpZ2luYWxEaXNwbGF5Q291bnQgKyAxLAorICAgICAgICAgICAgICAgICAgICBkcy5zaXplKCkpOworCisgICAgICAgICAgICAvLyBGaW5kIHRoZSBuZXdseSBhZGRlZCBkaXNwbGF5LgorICAgICAgICAgICAgZmluYWwgTGlzdDxBY3Rpdml0eURpc3BsYXk+IG5ld0Rpc3BsYXlzID0gZmluZE5ld0Rpc3BsYXlTdGF0ZXMob3JpZ2luYWxEUywgZHMpOworICAgICAgICAgICAgcmV0dXJuIG5ld0Rpc3BsYXlzLmdldCgwKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgdHVybkRpc3BsYXlPZmYoKSB7CisgICAgICAgICAgICBpZiAobUV4dGVybmFsRGlzcGxheUhlbHBlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk5vIGV4dGVybmFsIGRpc3BsYXkgY3JlYXRlZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUV4dGVybmFsRGlzcGxheUhlbHBlci50dXJuRGlzcGxheU9mZigpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB0dXJuRGlzcGxheU9uKCkgeworICAgICAgICAgICAgaWYgKG1FeHRlcm5hbERpc3BsYXlIZWxwZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJObyBleHRlcm5hbCBkaXNwbGF5IGNyZWF0ZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1FeHRlcm5hbERpc3BsYXlIZWxwZXIudHVybkRpc3BsYXlPbigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAobUV4dGVybmFsRGlzcGxheUhlbHBlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUV4dGVybmFsRGlzcGxheUhlbHBlci5yZWxlYXNlRGlzcGxheSgpOworICAgICAgICAgICAgICAgIG1FeHRlcm5hbERpc3BsYXlIZWxwZXIgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJpbWFyeURpc3BsYXlTdGF0ZVNlc3Npb24gaW1wbGVtZW50cyBBdXRvQ2xvc2VhYmxlIHsKKworICAgICAgICB2b2lkIHR1cm5TY3JlZW5PZmYoKSB7CisgICAgICAgICAgICBzZXRQcmltYXJ5RGlzcGxheVN0YXRlKGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgc2V0UHJpbWFyeURpc3BsYXlTdGF0ZSh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBUdXJucyB0aGUgcHJpbWFyeSBkaXNwbGF5IG9uL29mZiBieSBwcmVzc2luZyB0aGUgcG93ZXIga2V5ICovCisgICAgICAgIHByaXZhdGUgdm9pZCBzZXRQcmltYXJ5RGlzcGxheVN0YXRlKGJvb2xlYW4gd2FudE9uKSB7CisgICAgICAgICAgICBpZiAod2FudE9uKSB7CisgICAgICAgICAgICAgICAgcHJlc3NXYWtldXBCdXR0b24oKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJlc3NTbGVlcEJ1dHRvbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVmlydHVhbERpc3BsYXlIZWxwZXIud2FpdEZvckRlZmF1bHREaXNwbGF5U3RhdGUod2FudE9uKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlNYW5hZ2VyUGlubmVkU3RhY2tUZXN0cy5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJQaW5uZWRTdGFja1Rlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYyZTEwMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlNYW5hZ2VyUGlubmVkU3RhY2tUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMTY4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbTsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXIuU3RhY2tJZC5JTlZBTElEX1NUQUNLX0lEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5XaW5kb3dDb25maWd1cmF0aW9uLkFDVElWSVRZX1RZUEVfSE9NRTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuV2luZG93Q29uZmlndXJhdGlvbi5BQ1RJVklUWV9UWVBFX1NUQU5EQVJEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5XaW5kb3dDb25maWd1cmF0aW9uLldJTkRPV0lOR19NT0RFX0ZVTExTQ1JFRU47CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLldpbmRvd0NvbmZpZ3VyYXRpb24uV0lORE9XSU5HX01PREVfUElOTkVEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5XaW5kb3dDb25maWd1cmF0aW9uLldJTkRPV0lOR19NT0RFX1VOREVGSU5FRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQWN0aXZpdHlNYW5hZ2VyU3RhdGUuU1RBVEVfUkVTVU1FRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQWN0aXZpdHlNYW5hZ2VyU3RhdGUuU1RBVEVfU1RPUFBFRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50TmFtZVV0aWxzLmdldEFjdGl2aXR5TmFtZTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50TmFtZVV0aWxzLmdldExvZ1RhZzsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50TmFtZVV0aWxzLmdldFdpbmRvd05hbWU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuQUxXQVlTX0ZPQ1VTQUJMRV9QSVBfQUNUSVZJVFk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuTEFVTkNISU5HX0FDVElWSVRZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLkxBVU5DSF9FTlRFUl9QSVBfQUNUSVZJVFk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuTEFVTkNIX0lOVE9fUElOTkVEX1NUQUNLX1BJUF9BQ1RJVklUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5OT05fUkVTSVpFQUJMRV9BQ1RJVklUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5OT19SRUxBVU5DSF9BQ1RJVklUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5QSVBfQUNUSVZJVFk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuUElQX0FDVElWSVRZMjsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5QSVBfQUNUSVZJVFlfV0lUSF9TQU1FX0FGRklOSVRZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLlBJUF9PTl9TVE9QX0FDVElWSVRZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLlBpcEFjdGl2aXR5LkFDVElPTl9FTlRFUl9QSVA7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuUGlwQWN0aXZpdHkuQUNUSU9OX0VYUEFORF9QSVA7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuUGlwQWN0aXZpdHkuQUNUSU9OX0ZJTklTSDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5QaXBBY3Rpdml0eS5BQ1RJT05fTU9WRV9UT19CQUNLOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLlBpcEFjdGl2aXR5LkFDVElPTl9TRVRfUkVRVUVTVEVEX09SSUVOVEFUSU9OOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLlBpcEFjdGl2aXR5LkVYVFJBX0FTU0VSVF9OT19PTl9TVE9QX0JFRk9SRV9QSVA7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuUGlwQWN0aXZpdHkuRVhUUkFfRU5URVJfUElQOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLlBpcEFjdGl2aXR5LkVYVFJBX0VOVEVSX1BJUF9BU1BFQ1RfUkFUSU9fREVOT01JTkFUT1I7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuUGlwQWN0aXZpdHkuRVhUUkFfRU5URVJfUElQX0FTUEVDVF9SQVRJT19OVU1FUkFUT1I7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuUGlwQWN0aXZpdHkuRVhUUkFfRU5URVJfUElQX09OX1BBVVNFOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLlBpcEFjdGl2aXR5LkVYVFJBX0ZJTklTSF9TRUxGX09OX1JFU1VNRTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5QaXBBY3Rpdml0eS5FWFRSQV9PTl9QQVVTRV9ERUxBWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5QaXBBY3Rpdml0eS5FWFRSQV9QSVBfT1JJRU5UQVRJT047CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuUGlwQWN0aXZpdHkuRVhUUkFfUkVFTlRFUl9QSVBfT05fRVhJVDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5QaXBBY3Rpdml0eS5FWFRSQV9TRVRfQVNQRUNUX1JBVElPX0RFTk9NSU5BVE9SOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLlBpcEFjdGl2aXR5LkVYVFJBX1NFVF9BU1BFQ1RfUkFUSU9fTlVNRVJBVE9SOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLlBpcEFjdGl2aXR5LkVYVFJBX1NFVF9BU1BFQ1RfUkFUSU9fV0lUSF9ERUxBWV9ERU5PTUlOQVRPUjsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5QaXBBY3Rpdml0eS5FWFRSQV9TRVRfQVNQRUNUX1JBVElPX1dJVEhfREVMQVlfTlVNRVJBVE9SOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLlBpcEFjdGl2aXR5LkVYVFJBX1NUQVJUX0FDVElWSVRZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLlBpcEFjdGl2aXR5LkVYVFJBX1RBUF9UT19GSU5JU0g7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuUkVTVU1FX1dISUxFX1BBVVNJTkdfQUNUSVZJVFk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuVEVTVF9BQ1RJVklUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5URVNUX0FDVElWSVRZX1dJVEhfU0FNRV9BRkZJTklUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5UUkFOU0xVQ0VOVF9URVNUX0FDVElWSVRZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLlRlc3RBY3Rpdml0eS5FWFRSQV9GSVhFRF9PUklFTlRBVElPTjsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5UZXN0QWN0aXZpdHkuVEVTVF9BQ1RJVklUWV9BQ1RJT05fRklOSVNIX1NFTEY7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLlVpRGV2aWNlVXRpbHMucHJlc3NXaW5kb3dCdXR0b247CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5EaXNwbGF5LkRFRkFVTFRfRElTUExBWTsKKworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMubGVzc1RoYW47CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzdW1lLmFzc3VtZVRydWU7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkNvbnRlbnRPYnNlcnZlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5QcmVzdWJtaXQ7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKK2ltcG9ydCBhbmRyb2lkLnNlcnZlci5hbS5BY3Rpdml0eU1hbmFnZXJTdGF0ZS5BY3Rpdml0eVN0YWNrOworaW1wb3J0IGFuZHJvaWQuc2VydmVyLmFtLkFjdGl2aXR5TWFuYWdlclN0YXRlLkFjdGl2aXR5VGFzazsKK2ltcG9ydCBhbmRyb2lkLnNlcnZlci5hbS5XaW5kb3dNYW5hZ2VyU3RhdGUuV2luZG93U3RhY2s7CitpbXBvcnQgYW5kcm9pZC5zZXJ2ZXIuYW0uc2V0dGluZ3MuU2V0dGluZ3NTZXNzaW9uOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNpemU7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5GbGFreVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKKy8qKgorICogQnVpbGQvSW5zdGFsbC9SdW46CisgKiBhdGVzdCBDdHNBY3Rpdml0eU1hbmFnZXJEZXZpY2VUZXN0Q2FzZXM6QWN0aXZpdHlNYW5hZ2VyUGlubmVkU3RhY2tUZXN0cworICovCitARmxha3lUZXN0KGJ1Z0lkID0gNzE3OTIzNjgpCitwdWJsaWMgY2xhc3MgQWN0aXZpdHlNYW5hZ2VyUGlubmVkU3RhY2tUZXN0cyBleHRlbmRzIEFjdGl2aXR5TWFuYWdlclRlc3RCYXNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gQWN0aXZpdHlNYW5hZ2VyUGlubmVkU3RhY2tUZXN0cy5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQX09QU19PUF9FTlRFUl9QSUNUVVJFX0lOX1BJQ1RVUkUgPSAiUElDVFVSRV9JTl9QSUNUVVJFIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVBQX09QU19NT0RFX0FMTE9XRUQgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBUFBfT1BTX01PREVfSUdOT1JFRCA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFQUF9PUFNfTU9ERV9FUlJPUkVEID0gMjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBST1RBVElPTl8wID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUk9UQVRJT05fOTAgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBST1RBVElPTl8xODAgPSAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBST1RBVElPTl8yNzAgPSAzOworCisgICAgLy8gQ29ycmVzcG9uZHMgdG8gQWN0aXZpdHlJbmZvLlNDUkVFTl9PUklFTlRBVElPTl9MQU5EU0NBUEUKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT1JJRU5UQVRJT05fTEFORFNDQVBFID0gMDsKKyAgICAvLyBDb3JyZXNwb25kcyB0byBBY3Rpdml0eUluZm8uU0NSRUVOX09SSUVOVEFUSU9OX1BPUlRSQUlUCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9SSUVOVEFUSU9OX1BPUlRSQUlUID0gMTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IEZMT0FUX0NPTVBBUkVfRVBTSUxPTiA9IDAuMDA1ZjsKKworICAgIC8vIENvcnJlc3BvbmRzIHRvIGNvbS5hbmRyb2lkLmludGVybmFsLlIuZGltZW4uY29uZmlnX3BpY3R1cmVJblBpY3R1cmVNaW5Bc3BlY3RSYXRpbworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNSU5fQVNQRUNUX1JBVElPX05VTUVSQVRPUiA9IDEwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUlOX0FTUEVDVF9SQVRJT19ERU5PTUlOQVRPUiA9IDIzOTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQkVMT1dfTUlOX0FTUEVDVF9SQVRJT19ERU5PTUlOQVRPUiA9IE1JTl9BU1BFQ1RfUkFUSU9fREVOT01JTkFUT1IgKyAxOworICAgIC8vIENvcnJlc3BvbmRzIHRvIGNvbS5hbmRyb2lkLmludGVybmFsLlIuZGltZW4uY29uZmlnX3BpY3R1cmVJblBpY3R1cmVNYXhBc3BlY3RSYXRpbworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfQVNQRUNUX1JBVElPX05VTUVSQVRPUiA9IDIzOTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0FTUEVDVF9SQVRJT19ERU5PTUlOQVRPUiA9IDEwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUJPVkVfTUFYX0FTUEVDVF9SQVRJT19OVU1FUkFUT1IgPSBNQVhfQVNQRUNUX1JBVElPX05VTUVSQVRPUiArIDE7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNaW5pbXVtRGV2aWNlU2l6ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3N1bWVUcnVlKHN1cHBvcnRzUGlwKCkpOworCisgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0RGV2aWNlRGVmYXVsdERpc3BsYXlTaXplKAorICAgICAgICAgICAgICAgICJEZXZpY2VzIHN1cHBvcnRpbmcgcGljdHVyZS1pbi1waWN0dXJlIG11c3QgYmUgbGFyZ2VyIHRoYW4gdGhlIGRlZmF1bHQgbWluaW11bSIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiB0YXNrIHNpemUiKTsKKyAgICB9CisKKyAgICBAUHJlc3VibWl0CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW50ZXJQaWN0dXJlSW5QaWN0dXJlTW9kZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBwaW5uZWRTdGFja1Rlc3RlcihnZXRBbVN0YXJ0Q21kKFBJUF9BQ1RJVklUWSwgRVhUUkFfRU5URVJfUElQLCAidHJ1ZSIpLAorICAgICAgICAgICAgICAgIFBJUF9BQ1RJVklUWSwgUElQX0FDVElWSVRZLCBmYWxzZSAvKiBtb3ZlVG9wVG9QaW5uZWRTdGFjayAqLywKKyAgICAgICAgICAgICAgICBmYWxzZSAvKiBpc0ZvY3VzYWJsZSAqLyk7CisgICAgfQorCisgICAgQEZsYWt5VGVzdChidWdJZCA9IDcxNDQ0NjI4KQorICAgIEBQcmVzdWJtaXQKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNb3ZlVG9wQWN0aXZpdHlUb1Bpbm5lZFN0YWNrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHBpbm5lZFN0YWNrVGVzdGVyKGdldEFtU3RhcnRDbWQoUElQX0FDVElWSVRZKSwgUElQX0FDVElWSVRZLCBQSVBfQUNUSVZJVFksCisgICAgICAgICAgICAgICAgdHJ1ZSAvKiBtb3ZlVG9wVG9QaW5uZWRTdGFjayAqLywgZmFsc2UgLyogaXNGb2N1c2FibGUgKi8pOworICAgIH0KKworICAgIC8vIFRoaXMgdGVzdCBpcyBibGFjay1saXN0ZWQgaW4gY3RzLWtub3duLWZhaWx1cmVzLnhtbCAoYi8zNTMxNDgzNSkuCisgICAgQElnbm9yZQorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFsd2F5c0ZvY3VzYWJsZVBpcEFjdGl2aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHBpbm5lZFN0YWNrVGVzdGVyKGdldEFtU3RhcnRDbWQoQUxXQVlTX0ZPQ1VTQUJMRV9QSVBfQUNUSVZJVFkpLAorICAgICAgICAgICAgICAgIEFMV0FZU19GT0NVU0FCTEVfUElQX0FDVElWSVRZLCBBTFdBWVNfRk9DVVNBQkxFX1BJUF9BQ1RJVklUWSwKKyAgICAgICAgICAgICAgICBmYWxzZSAvKiBtb3ZlVG9wVG9QaW5uZWRTdGFjayAqLywgdHJ1ZSAvKiBpc0ZvY3VzYWJsZSAqLyk7CisgICAgfQorCisgICAgLy8gVGhpcyB0ZXN0IGlzIGJsYWNrLWxpc3RlZCBpbiBjdHMta25vd24tZmFpbHVyZXMueG1sIChiLzM1MzE0ODM1KS4KKyAgICBASWdub3JlCisgICAgQFByZXN1Ym1pdAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExhdW5jaEludG9QaW5uZWRTdGFjaygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBwaW5uZWRTdGFja1Rlc3RlcihnZXRBbVN0YXJ0Q21kKExBVU5DSF9JTlRPX1BJTk5FRF9TVEFDS19QSVBfQUNUSVZJVFkpLAorICAgICAgICAgICAgICAgIExBVU5DSF9JTlRPX1BJTk5FRF9TVEFDS19QSVBfQUNUSVZJVFksIEFMV0FZU19GT0NVU0FCTEVfUElQX0FDVElWSVRZLAorICAgICAgICAgICAgICAgIGZhbHNlIC8qIG1vdmVUb3BUb1Bpbm5lZFN0YWNrICovLCB0cnVlIC8qIGlzRm9jdXNhYmxlICovKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb25UYXBwYWJsZVBpcEFjdGl2aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc3VtZVRydWUoc3VwcG9ydHNQaXAoKSk7CisKKyAgICAgICAgLy8gTGF1bmNoIHRoZSB0YXAtdG8tZmluaXNoIGFjdGl2aXR5IGF0IGEgc3BlY2lmaWMgcGxhY2UKKyAgICAgICAgbGF1bmNoQWN0aXZpdHkoUElQX0FDVElWSVRZLAorICAgICAgICAgICAgICAgIEVYVFJBX0VOVEVSX1BJUCwgInRydWUiLAorICAgICAgICAgICAgICAgIEVYVFJBX1RBUF9UT19GSU5JU0gsICJ0cnVlIik7CisgICAgICAgIC8vIFdhaXQgZm9yIGFuaW1hdGlvbiBjb21wbGV0ZSBzaW5jZSB3ZSBhcmUgdGFwcGluZyBvbiBzcGVjaWZpYyBib3VuZHMKKyAgICAgICAgd2FpdEZvckVudGVyUGlwQW5pbWF0aW9uQ29tcGxldGUoUElQX0FDVElWSVRZKTsKKyAgICAgICAgYXNzZXJ0UGlubmVkU3RhY2tFeGlzdHMoKTsKKworICAgICAgICAvLyBUYXAgdGhlIHNjcmVlbiBhdCBhIGtub3duIGxvY2F0aW9uIGluIHRoZSBwaW5uZWQgc3RhY2sgYm91bmRzLCBhbmQgZW5zdXJlIHRoYXQgaXQgaXMKKyAgICAgICAgLy8gbm90IHBhc3NlZCBkb3duIHRvIHRoZSB0b3AgdGFzaworICAgICAgICB0YXBUb0ZpbmlzaFBpcCgpOworICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShmYWxzZSAvKiBjb21wYXJlVGFza0FuZFN0YWNrQm91bmRzICovLAorICAgICAgICAgICAgICAgIG5ldyBXYWl0Rm9yVmFsaWRBY3Rpdml0eVN0YXRlKFBJUF9BQ1RJVklUWSkpOworICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoUElQX0FDVElWSVRZLCB0cnVlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQaW5uZWRTdGFja0RlZmF1bHRCb3VuZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzdW1lVHJ1ZShzdXBwb3J0c1BpcCgpKTsKKworICAgICAgICAvLyBMYXVuY2ggYSBQSVAgYWN0aXZpdHkKKyAgICAgICAgbGF1bmNoQWN0aXZpdHkoUElQX0FDVElWSVRZLCBFWFRSQV9FTlRFUl9QSVAsICJ0cnVlIik7CisgICAgICAgIC8vIFdhaXQgZm9yIGFuaW1hdGlvbiBjb21wbGV0ZSBzaW5jZSB3ZSBhcmUgY29tcGFyaW5nIGJvdW5kcworICAgICAgICB3YWl0Rm9yRW50ZXJQaXBBbmltYXRpb25Db21wbGV0ZShQSVBfQUNUSVZJVFkpOworCisgICAgICAgIHRyeSAoZmluYWwgUm90YXRpb25TZXNzaW9uIHJvdGF0aW9uU2Vzc2lvbiA9IG5ldyBSb3RhdGlvblNlc3Npb24oKSkgeworICAgICAgICAgICAgcm90YXRpb25TZXNzaW9uLnNldChST1RBVElPTl8wKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvcldpdGhXbVN0YXRlKCh3bVN0YXRlMSkgLT4geworICAgICAgICAgICAgICAgIFJlY3QgZGIgPSB3bVN0YXRlMS5nZXREZWZhdWx0UGlubmVkU3RhY2tCb3VuZHMoKTsKKyAgICAgICAgICAgICAgICBSZWN0IHNiID0gd21TdGF0ZTEuZ2V0U3RhYmxlQm91bmRzKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChkYi53aWR0aCgpID4gMCAmJiBkYi5oZWlnaHQoKSA+IDApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoc2IuY29udGFpbnMoZGIpKTsKKyAgICAgICAgICAgIH0sICJXYWl0aW5nIGZvciB2YWxpZCBib3VuZHMuLiIpOworICAgICAgICAgICAgV2luZG93TWFuYWdlclN0YXRlIHdtU3RhdGUgPSBtQW1XbVN0YXRlLmdldFdtU3RhdGUoKTsKKyAgICAgICAgICAgIHdtU3RhdGUuY29tcHV0ZVN0YXRlKCk7CisgICAgICAgICAgICBSZWN0IGRlZmF1bHRQaXBCb3VuZHMgPSB3bVN0YXRlLmdldERlZmF1bHRQaW5uZWRTdGFja0JvdW5kcygpOworICAgICAgICAgICAgUmVjdCBzdGFibGVCb3VuZHMgPSB3bVN0YXRlLmdldFN0YWJsZUJvdW5kcygpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShkZWZhdWx0UGlwQm91bmRzLndpZHRoKCkgPiAwICYmIGRlZmF1bHRQaXBCb3VuZHMuaGVpZ2h0KCkgPiAwKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoc3RhYmxlQm91bmRzLmNvbnRhaW5zKGRlZmF1bHRQaXBCb3VuZHMpKTsKKworICAgICAgICAgICAgcm90YXRpb25TZXNzaW9uLnNldChST1RBVElPTl85MCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JXaXRoV21TdGF0ZSgod21TdGF0ZTEpIC0+IHsKKyAgICAgICAgICAgICAgICBSZWN0IGRiID0gd21TdGF0ZTEuZ2V0RGVmYXVsdFBpbm5lZFN0YWNrQm91bmRzKCk7CisgICAgICAgICAgICAgICAgUmVjdCBzYiA9IHdtU3RhdGUxLmdldFN0YWJsZUJvdW5kcygpOworICAgICAgICAgICAgICAgIHJldHVybiAoZGIud2lkdGgoKSA+IDAgJiYgZGIuaGVpZ2h0KCkgPiAwKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKHNiLmNvbnRhaW5zKGRiKSk7CisgICAgICAgICAgICB9LCAiV2FpdGluZyBmb3IgdmFsaWQgYm91bmRzLi4uIik7CisgICAgICAgICAgICB3bVN0YXRlID0gbUFtV21TdGF0ZS5nZXRXbVN0YXRlKCk7CisgICAgICAgICAgICB3bVN0YXRlLmNvbXB1dGVTdGF0ZSgpOworICAgICAgICAgICAgZGVmYXVsdFBpcEJvdW5kcyA9IHdtU3RhdGUuZ2V0RGVmYXVsdFBpbm5lZFN0YWNrQm91bmRzKCk7CisgICAgICAgICAgICBzdGFibGVCb3VuZHMgPSB3bVN0YXRlLmdldFN0YWJsZUJvdW5kcygpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShkZWZhdWx0UGlwQm91bmRzLndpZHRoKCkgPiAwICYmIGRlZmF1bHRQaXBCb3VuZHMuaGVpZ2h0KCkgPiAwKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoc3RhYmxlQm91bmRzLmNvbnRhaW5zKGRlZmF1bHRQaXBCb3VuZHMpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBpbm5lZFN0YWNrTW92ZW1lbnRCb3VuZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzdW1lVHJ1ZShzdXBwb3J0c1BpcCgpKTsKKworICAgICAgICAvLyBMYXVuY2ggYSBQSVAgYWN0aXZpdHkKKyAgICAgICAgbGF1bmNoQWN0aXZpdHkoUElQX0FDVElWSVRZLCBFWFRSQV9FTlRFUl9QSVAsICJ0cnVlIik7CisgICAgICAgIC8vIFdhaXQgZm9yIGFuaW1hdGlvbiBjb21wbGV0ZSBzaW5jZSB3ZSBhcmUgY29tcGFyaW5nIGJvdW5kcworICAgICAgICB3YWl0Rm9yRW50ZXJQaXBBbmltYXRpb25Db21wbGV0ZShQSVBfQUNUSVZJVFkpOworCisgICAgICAgIHRyeSAoZmluYWwgUm90YXRpb25TZXNzaW9uIHJvdGF0aW9uU2Vzc2lvbiA9IG5ldyBSb3RhdGlvblNlc3Npb24oKSkgeworICAgICAgICAgICAgcm90YXRpb25TZXNzaW9uLnNldChST1RBVElPTl8wKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvcldpdGhXbVN0YXRlKCh3bVN0YXRlMSkgLT4geworICAgICAgICAgICAgICAgIFJlY3QgZGIgPSB3bVN0YXRlMS5nZXRQaW5uZWRTdGFja01vdmVtZW50Qm91bmRzKCk7CisgICAgICAgICAgICAgICAgUmVjdCBzYiA9IHdtU3RhdGUxLmdldFN0YWJsZUJvdW5kcygpOworICAgICAgICAgICAgICAgIHJldHVybiAoZGIud2lkdGgoKSA+IDAgJiYgZGIuaGVpZ2h0KCkgPiAwKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKHNiLmNvbnRhaW5zKGRiKSk7CisgICAgICAgICAgICB9LCAiV2FpdGluZyBmb3IgdmFsaWQgYm91bmRzLi4uIik7CisgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyU3RhdGUgd21TdGF0ZSA9IG1BbVdtU3RhdGUuZ2V0V21TdGF0ZSgpOworICAgICAgICAgICAgd21TdGF0ZS5jb21wdXRlU3RhdGUoKTsKKyAgICAgICAgICAgIFJlY3QgcGlwTW92ZW1lbnRCb3VuZHMgPSB3bVN0YXRlLmdldFBpbm5lZFN0YWNrTW92ZW1lbnRCb3VuZHMoKTsKKyAgICAgICAgICAgIFJlY3Qgc3RhYmxlQm91bmRzID0gd21TdGF0ZS5nZXRTdGFibGVCb3VuZHMoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocGlwTW92ZW1lbnRCb3VuZHMud2lkdGgoKSA+IDAgJiYgcGlwTW92ZW1lbnRCb3VuZHMuaGVpZ2h0KCkgPiAwKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoc3RhYmxlQm91bmRzLmNvbnRhaW5zKHBpcE1vdmVtZW50Qm91bmRzKSk7CisKKyAgICAgICAgICAgIHJvdGF0aW9uU2Vzc2lvbi5zZXQoUk9UQVRJT05fOTApOworICAgICAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yV2l0aFdtU3RhdGUoKHdtU3RhdGUxKSAtPiB7CisgICAgICAgICAgICAgICAgUmVjdCBkYiA9IHdtU3RhdGUxLmdldFBpbm5lZFN0YWNrTW92ZW1lbnRCb3VuZHMoKTsKKyAgICAgICAgICAgICAgICBSZWN0IHNiID0gd21TdGF0ZTEuZ2V0U3RhYmxlQm91bmRzKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChkYi53aWR0aCgpID4gMCAmJiBkYi5oZWlnaHQoKSA+IDApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoc2IuY29udGFpbnMoZGIpKTsKKyAgICAgICAgICAgIH0sICJXYWl0aW5nIGZvciB2YWxpZCBib3VuZHMuLi4iKTsKKyAgICAgICAgICAgIHdtU3RhdGUgPSBtQW1XbVN0YXRlLmdldFdtU3RhdGUoKTsKKyAgICAgICAgICAgIHdtU3RhdGUuY29tcHV0ZVN0YXRlKCk7CisgICAgICAgICAgICBwaXBNb3ZlbWVudEJvdW5kcyA9IHdtU3RhdGUuZ2V0UGlubmVkU3RhY2tNb3ZlbWVudEJvdW5kcygpOworICAgICAgICAgICAgc3RhYmxlQm91bmRzID0gd21TdGF0ZS5nZXRTdGFibGVCb3VuZHMoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocGlwTW92ZW1lbnRCb3VuZHMud2lkdGgoKSA+IDAgJiYgcGlwTW92ZW1lbnRCb3VuZHMuaGVpZ2h0KCkgPiAwKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoc3RhYmxlQm91bmRzLmNvbnRhaW5zKHBpcE1vdmVtZW50Qm91bmRzKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBGbGFreVRlc3QgLy8gVE9ETzogUmVpbnRyb2R1Y2UgdG8gcHJlc3VibWl0IG9uY2UgYi83MTUwODIzNCBpcyByZXNvbHZlZC4KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGlubmVkU3RhY2tPdXRPZkJvdW5kc0luc2V0c05vbk5lZ2F0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc3VtZVRydWUoc3VwcG9ydHNQaXAoKSk7CisKKyAgICAgICAgZmluYWwgV2luZG93TWFuYWdlclN0YXRlIHdtU3RhdGUgPSBtQW1XbVN0YXRlLmdldFdtU3RhdGUoKTsKKworICAgICAgICAvLyBMYXVuY2ggYW4gYWN0aXZpdHkgaW50byB0aGUgcGlubmVkIHN0YWNrCisgICAgICAgIGxhdW5jaEFjdGl2aXR5KFBJUF9BQ1RJVklUWSwgRVhUUkFfRU5URVJfUElQLCAidHJ1ZSIsCisgICAgICAgICAgICAgICAgRVhUUkFfVEFQX1RPX0ZJTklTSCwgInRydWUiKTsKKyAgICAgICAgLy8gV2FpdCBmb3IgYW5pbWF0aW9uIGNvbXBsZXRlIHNpbmNlIHdlIGFyZSBjb21wYXJpbmcgYm91bmRzCisgICAgICAgIHdhaXRGb3JFbnRlclBpcEFuaW1hdGlvbkNvbXBsZXRlKFBJUF9BQ1RJVklUWSk7CisKKyAgICAgICAgLy8gR2V0IHRoZSBkaXNwbGF5IGRpbWVuc2lvbnMKKyAgICAgICAgV2luZG93TWFuYWdlclN0YXRlLldpbmRvd1N0YXRlIHdpbmRvd1N0YXRlID0gZ2V0V2luZG93U3RhdGUoUElQX0FDVElWSVRZKTsKKyAgICAgICAgV2luZG93TWFuYWdlclN0YXRlLkRpc3BsYXkgZGlzcGxheSA9IHdtU3RhdGUuZ2V0RGlzcGxheSh3aW5kb3dTdGF0ZS5nZXREaXNwbGF5SWQoKSk7CisgICAgICAgIFJlY3QgZGlzcGxheVJlY3QgPSBkaXNwbGF5LmdldERpc3BsYXlSZWN0KCk7CisKKyAgICAgICAgLy8gTW92ZSB0aGUgcGlubmVkIHN0YWNrIG9mZnNjcmVlbgorICAgICAgICBmaW5hbCBpbnQgc3RhY2tJZCA9IGdldFBpbm5lZFN0YWNrKCkubVN0YWNrSWQ7CisgICAgICAgIGZpbmFsIGludCB0b3AgPSAwOworICAgICAgICBmaW5hbCBpbnQgbGVmdCA9IGRpc3BsYXlSZWN0LndpZHRoKCkgLSAyMDA7CisgICAgICAgIHJlc2l6ZVN0YWNrKHN0YWNrSWQsIGxlZnQsIHRvcCwgbGVmdCArIDUwMCwgdG9wICsgNTAwKTsKKworICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgc3VyZmFjZSBpbnNldHMgYXJlIG5vdCBuZWdhdGl2ZQorICAgICAgICB3aW5kb3dTdGF0ZSA9IGdldFdpbmRvd1N0YXRlKFBJUF9BQ1RJVklUWSk7CisgICAgICAgIFJlY3QgY29udGVudEluc2V0cyA9IHdpbmRvd1N0YXRlLmdldENvbnRlbnRJbnNldHMoKTsKKyAgICAgICAgaWYgKGNvbnRlbnRJbnNldHMgIT0gbnVsbCkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb250ZW50SW5zZXRzLmxlZnQgPj0gMCAmJiBjb250ZW50SW5zZXRzLnRvcCA+PSAwCisgICAgICAgICAgICAgICAgICAgICYmIGNvbnRlbnRJbnNldHMud2lkdGgoKSA+PSAwICYmIGNvbnRlbnRJbnNldHMuaGVpZ2h0KCkgPj0gMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQaW5uZWRTdGFja0luQm91bmRzQWZ0ZXJSb3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3N1bWVUcnVlKHN1cHBvcnRzUGlwKCkpOworCisgICAgICAgIC8vIExhdW5jaCBhbiBhY3Rpdml0eSBpbnRvIHRoZSBwaW5uZWQgc3RhY2sKKyAgICAgICAgbGF1bmNoQWN0aXZpdHkoUElQX0FDVElWSVRZLAorICAgICAgICAgICAgICAgIEVYVFJBX0VOVEVSX1BJUCwgInRydWUiLAorICAgICAgICAgICAgICAgIEVYVFJBX1RBUF9UT19GSU5JU0gsICJ0cnVlIik7CisgICAgICAgIC8vIFdhaXQgZm9yIGFuaW1hdGlvbiBjb21wbGV0ZSBzaW5jZSB3ZSBhcmUgY29tcGFyaW5nIGJvdW5kcworICAgICAgICB3YWl0Rm9yRW50ZXJQaXBBbmltYXRpb25Db21wbGV0ZShQSVBfQUNUSVZJVFkpOworCisgICAgICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBQSVAgc3RhY2sgaXMgZnVsbHkgdmlzaWJsZSBpbiBlYWNoIG9yaWVudGF0aW9uCisgICAgICAgIHRyeSAoZmluYWwgUm90YXRpb25TZXNzaW9uIHJvdGF0aW9uU2Vzc2lvbiA9IG5ldyBSb3RhdGlvblNlc3Npb24oKSkgeworICAgICAgICAgICAgcm90YXRpb25TZXNzaW9uLnNldChST1RBVElPTl8wKTsKKyAgICAgICAgICAgIGFzc2VydFBpbm5lZFN0YWNrQWN0aXZpdHlJc0luRGlzcGxheUJvdW5kcyhQSVBfQUNUSVZJVFkpOworICAgICAgICAgICAgcm90YXRpb25TZXNzaW9uLnNldChST1RBVElPTl85MCk7CisgICAgICAgICAgICBhc3NlcnRQaW5uZWRTdGFja0FjdGl2aXR5SXNJbkRpc3BsYXlCb3VuZHMoUElQX0FDVElWSVRZKTsKKyAgICAgICAgICAgIHJvdGF0aW9uU2Vzc2lvbi5zZXQoUk9UQVRJT05fMTgwKTsKKyAgICAgICAgICAgIGFzc2VydFBpbm5lZFN0YWNrQWN0aXZpdHlJc0luRGlzcGxheUJvdW5kcyhQSVBfQUNUSVZJVFkpOworICAgICAgICAgICAgcm90YXRpb25TZXNzaW9uLnNldChST1RBVElPTl8yNzApOworICAgICAgICAgICAgYXNzZXJ0UGlubmVkU3RhY2tBY3Rpdml0eUlzSW5EaXNwbGF5Qm91bmRzKFBJUF9BQ1RJVklUWSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbnRlclBpcFRvT3RoZXJPcmllbnRhdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3N1bWVUcnVlKHN1cHBvcnRzUGlwKCkpOworCisgICAgICAgIC8vIExhdW5jaCBhIHBvcnRyYWl0IG9ubHkgYXBwIG9uIHRoZSBmdWxsc2NyZWVuIHN0YWNrCisgICAgICAgIGxhdW5jaEFjdGl2aXR5KFRFU1RfQUNUSVZJVFksCisgICAgICAgICAgICAgICAgRVhUUkFfRklYRURfT1JJRU5UQVRJT04sIFN0cmluZy52YWx1ZU9mKE9SSUVOVEFUSU9OX1BPUlRSQUlUKSk7CisgICAgICAgIC8vIExhdW5jaCB0aGUgUGlQIGFjdGl2aXR5IGZpeGVkIGFzIGxhbmRzY2FwZQorICAgICAgICBsYXVuY2hBY3Rpdml0eShQSVBfQUNUSVZJVFksCisgICAgICAgICAgICAgICAgRVhUUkFfUElQX09SSUVOVEFUSU9OLCBTdHJpbmcudmFsdWVPZihPUklFTlRBVElPTl9MQU5EU0NBUEUpKTsKKyAgICAgICAgLy8gRW50ZXIgUGlQLCBhbmQgYXNzZXJ0IHRoYXQgdGhlIFBpUCBpcyB3aXRoaW4gYm91bmRzIG5vdyB0aGF0IHRoZSBkZXZpY2UgaXMgYmFjayBpbgorICAgICAgICAvLyBwb3J0cmFpdAorICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKCJhbSBicm9hZGNhc3QgLWEgIiArIEFDVElPTl9FTlRFUl9QSVApOworICAgICAgICAvLyBXYWl0IGZvciBhbmltYXRpb24gY29tcGxldGUgc2luY2Ugd2UgYXJlIGNvbXBhcmluZyBib3VuZHMKKyAgICAgICAgd2FpdEZvckVudGVyUGlwQW5pbWF0aW9uQ29tcGxldGUoUElQX0FDVElWSVRZKTsKKyAgICAgICAgYXNzZXJ0UGlubmVkU3RhY2tFeGlzdHMoKTsKKyAgICAgICAgYXNzZXJ0UGlubmVkU3RhY2tBY3Rpdml0eUlzSW5EaXNwbGF5Qm91bmRzKFBJUF9BQ1RJVklUWSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW50ZXJQaXBBc3BlY3RSYXRpb01pbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0RW50ZXJQaXBBc3BlY3RSYXRpbyhNSU5fQVNQRUNUX1JBVElPX05VTUVSQVRPUiwgTUlOX0FTUEVDVF9SQVRJT19ERU5PTUlOQVRPUik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW50ZXJQaXBBc3BlY3RSYXRpb01heCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0RW50ZXJQaXBBc3BlY3RSYXRpbyhNQVhfQVNQRUNUX1JBVElPX05VTUVSQVRPUiwgTUFYX0FTUEVDVF9SQVRJT19ERU5PTUlOQVRPUik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RFbnRlclBpcEFzcGVjdFJhdGlvKGludCBudW0sIGludCBkZW5vbSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc3VtZVRydWUoc3VwcG9ydHNQaXAoKSk7CisKKyAgICAgICAgbGF1bmNoQWN0aXZpdHkoUElQX0FDVElWSVRZLAorICAgICAgICAgICAgICAgIEVYVFJBX0VOVEVSX1BJUCwgInRydWUiLAorICAgICAgICAgICAgICAgIEVYVFJBX0VOVEVSX1BJUF9BU1BFQ1RfUkFUSU9fTlVNRVJBVE9SLCBJbnRlZ2VyLnRvU3RyaW5nKG51bSksCisgICAgICAgICAgICAgICAgRVhUUkFfRU5URVJfUElQX0FTUEVDVF9SQVRJT19ERU5PTUlOQVRPUiwgSW50ZWdlci50b1N0cmluZyhkZW5vbSkpOworICAgICAgICAvLyBXYWl0IGZvciBhbmltYXRpb24gY29tcGxldGUgc2luY2Ugd2UgYXJlIGNvbXBhcmluZyBhc3BlY3QgcmF0aW8KKyAgICAgICAgd2FpdEZvckVudGVyUGlwQW5pbWF0aW9uQ29tcGxldGUoUElQX0FDVElWSVRZKTsKKyAgICAgICAgYXNzZXJ0UGlubmVkU3RhY2tFeGlzdHMoKTsKKworICAgICAgICAvLyBBc3NlcnQgdGhhdCB3ZSBoYXZlIGVudGVyZWQgUElQIGFuZCB0aGF0IHRoZSBhc3BlY3QgcmF0aW8gaXMgY29ycmVjdAorICAgICAgICBSZWN0IHBpbm5lZFN0YWNrQm91bmRzID0gZ2V0UGlubmVkU3RhY2tCb3VuZHMoKTsKKyAgICAgICAgYXNzZXJ0RmxvYXRFcXVhbHMoKGZsb2F0KSBwaW5uZWRTdGFja0JvdW5kcy53aWR0aCgpIC8gcGlubmVkU3RhY2tCb3VuZHMuaGVpZ2h0KCksCisgICAgICAgICAgICAgICAgKGZsb2F0KSBudW0gLyBkZW5vbSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzaXplUGlwQXNwZWN0UmF0aW9NaW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdFJlc2l6ZVBpcEFzcGVjdFJhdGlvKE1JTl9BU1BFQ1RfUkFUSU9fTlVNRVJBVE9SLCBNSU5fQVNQRUNUX1JBVElPX0RFTk9NSU5BVE9SKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNpemVQaXBBc3BlY3RSYXRpb01heCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0UmVzaXplUGlwQXNwZWN0UmF0aW8oTUFYX0FTUEVDVF9SQVRJT19OVU1FUkFUT1IsIE1BWF9BU1BFQ1RfUkFUSU9fREVOT01JTkFUT1IpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0UmVzaXplUGlwQXNwZWN0UmF0aW8oaW50IG51bSwgaW50IGRlbm9tKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzdW1lVHJ1ZShzdXBwb3J0c1BpcCgpKTsKKworICAgICAgICBsYXVuY2hBY3Rpdml0eShQSVBfQUNUSVZJVFksCisgICAgICAgICAgICAgICAgRVhUUkFfRU5URVJfUElQLCAidHJ1ZSIsCisgICAgICAgICAgICAgICAgRVhUUkFfU0VUX0FTUEVDVF9SQVRJT19OVU1FUkFUT1IsIEludGVnZXIudG9TdHJpbmcobnVtKSwKKyAgICAgICAgICAgICAgICBFWFRSQV9TRVRfQVNQRUNUX1JBVElPX0RFTk9NSU5BVE9SLCBJbnRlZ2VyLnRvU3RyaW5nKGRlbm9tKSk7CisgICAgICAgIC8vIFdhaXQgZm9yIGFuaW1hdGlvbiBjb21wbGV0ZSBzaW5jZSB3ZSBhcmUgY29tcGFyaW5nIGFzcGVjdCByYXRpbworICAgICAgICB3YWl0Rm9yRW50ZXJQaXBBbmltYXRpb25Db21wbGV0ZShQSVBfQUNUSVZJVFkpOworICAgICAgICBhc3NlcnRQaW5uZWRTdGFja0V4aXN0cygpOworICAgICAgICB3YWl0Rm9yVmFsaWRBc3BlY3RSYXRpbyhudW0sIGRlbm9tKTsKKyAgICAgICAgUmVjdCBib3VuZHMgPSBnZXRQaW5uZWRTdGFja0JvdW5kcygpOworICAgICAgICBhc3NlcnRGbG9hdEVxdWFscygoZmxvYXQpIGJvdW5kcy53aWR0aCgpIC8gYm91bmRzLmhlaWdodCgpLCAoZmxvYXQpIG51bSAvIGRlbm9tKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbnRlclBpcEV4dHJlbWVBc3BlY3RSYXRpb01pbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0RW50ZXJQaXBFeHRyZW1lQXNwZWN0UmF0aW8oTUlOX0FTUEVDVF9SQVRJT19OVU1FUkFUT1IsCisgICAgICAgICAgICAgICAgQkVMT1dfTUlOX0FTUEVDVF9SQVRJT19ERU5PTUlOQVRPUik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW50ZXJQaXBFeHRyZW1lQXNwZWN0UmF0aW9NYXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdEVudGVyUGlwRXh0cmVtZUFzcGVjdFJhdGlvKEFCT1ZFX01BWF9BU1BFQ1RfUkFUSU9fTlVNRVJBVE9SLAorICAgICAgICAgICAgICAgIE1BWF9BU1BFQ1RfUkFUSU9fREVOT01JTkFUT1IpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0RW50ZXJQaXBFeHRyZW1lQXNwZWN0UmF0aW8oaW50IG51bSwgaW50IGRlbm9tKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzdW1lVHJ1ZShzdXBwb3J0c1BpcCgpKTsKKworICAgICAgICAvLyBBc3NlcnQgdGhhdCB3ZSBjb3VsZCBub3QgY3JlYXRlIGEgcGlubmVkIHN0YWNrIHdpdGggYW4gZXh0cmVtZSBhc3BlY3QgcmF0aW8KKyAgICAgICAgbGF1bmNoQWN0aXZpdHkoUElQX0FDVElWSVRZLAorICAgICAgICAgICAgICAgIEVYVFJBX0VOVEVSX1BJUCwgInRydWUiLAorICAgICAgICAgICAgICAgIEVYVFJBX0VOVEVSX1BJUF9BU1BFQ1RfUkFUSU9fTlVNRVJBVE9SLCBJbnRlZ2VyLnRvU3RyaW5nKG51bSksCisgICAgICAgICAgICAgICAgRVhUUkFfRU5URVJfUElQX0FTUEVDVF9SQVRJT19ERU5PTUlOQVRPUiwgSW50ZWdlci50b1N0cmluZyhkZW5vbSkpOworICAgICAgICBhc3NlcnRQaW5uZWRTdGFja0RvZXNOb3RFeGlzdCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNldFBpcEV4dHJlbWVBc3BlY3RSYXRpb01pbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0U2V0UGlwRXh0cmVtZUFzcGVjdFJhdGlvKE1JTl9BU1BFQ1RfUkFUSU9fTlVNRVJBVE9SLAorICAgICAgICAgICAgICAgIEJFTE9XX01JTl9BU1BFQ1RfUkFUSU9fREVOT01JTkFUT1IpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNldFBpcEV4dHJlbWVBc3BlY3RSYXRpb01heCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0U2V0UGlwRXh0cmVtZUFzcGVjdFJhdGlvKEFCT1ZFX01BWF9BU1BFQ1RfUkFUSU9fTlVNRVJBVE9SLAorICAgICAgICAgICAgICAgIE1BWF9BU1BFQ1RfUkFUSU9fREVOT01JTkFUT1IpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0U2V0UGlwRXh0cmVtZUFzcGVjdFJhdGlvKGludCBudW0sIGludCBkZW5vbSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc3VtZVRydWUoc3VwcG9ydHNQaXAoKSk7CisKKyAgICAgICAgLy8gVHJ5IHRvIHJlc2l6ZSB0aGUgYSBub3JtYWwgcGlubmVkIHN0YWNrIHRvIGFuIGV4dHJlbWUgYXNwZWN0IHJhdGlvIGFuZCBlbnN1cmUgdGhhdAorICAgICAgICAvLyBmYWlscyAodGhlIGFzcGVjdCByYXRpbyByZW1haW5zIHRoZSBzYW1lKQorICAgICAgICBsYXVuY2hBY3Rpdml0eShQSVBfQUNUSVZJVFksCisgICAgICAgICAgICAgICAgRVhUUkFfRU5URVJfUElQLCAidHJ1ZSIsCisgICAgICAgICAgICAgICAgRVhUUkFfRU5URVJfUElQX0FTUEVDVF9SQVRJT19OVU1FUkFUT1IsCisgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKE1BWF9BU1BFQ1RfUkFUSU9fTlVNRVJBVE9SKSwKKyAgICAgICAgICAgICAgICBFWFRSQV9FTlRFUl9QSVBfQVNQRUNUX1JBVElPX0RFTk9NSU5BVE9SLAorICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhNQVhfQVNQRUNUX1JBVElPX0RFTk9NSU5BVE9SKSwKKyAgICAgICAgICAgICAgICBFWFRSQV9TRVRfQVNQRUNUX1JBVElPX05VTUVSQVRPUiwgSW50ZWdlci50b1N0cmluZyhudW0pLAorICAgICAgICAgICAgICAgIEVYVFJBX1NFVF9BU1BFQ1RfUkFUSU9fREVOT01JTkFUT1IsIEludGVnZXIudG9TdHJpbmcoZGVub20pKTsKKyAgICAgICAgLy8gV2FpdCBmb3IgYW5pbWF0aW9uIGNvbXBsZXRlIHNpbmNlIHdlIGFyZSBjb21wYXJpbmcgYXNwZWN0IHJhdGlvCisgICAgICAgIHdhaXRGb3JFbnRlclBpcEFuaW1hdGlvbkNvbXBsZXRlKFBJUF9BQ1RJVklUWSk7CisgICAgICAgIGFzc2VydFBpbm5lZFN0YWNrRXhpc3RzKCk7CisgICAgICAgIFJlY3QgcGlubmVkU3RhY2tCb3VuZHMgPSBnZXRQaW5uZWRTdGFja0JvdW5kcygpOworICAgICAgICBhc3NlcnRGbG9hdEVxdWFscygoZmxvYXQpIHBpbm5lZFN0YWNrQm91bmRzLndpZHRoKCkgLyBwaW5uZWRTdGFja0JvdW5kcy5oZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAoZmxvYXQpIE1BWF9BU1BFQ1RfUkFUSU9fTlVNRVJBVE9SIC8gTUFYX0FTUEVDVF9SQVRJT19ERU5PTUlOQVRPUik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzYWxsb3dQaXBMYXVuY2hGcm9tU3RvcHBlZEFjdGl2aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc3VtZVRydWUoc3VwcG9ydHNQaXAoKSk7CisKKyAgICAgICAgLy8gTGF1bmNoIHRoZSBib3R0b20gcGlwIGFjdGl2aXR5IHdoaWNoIHdpbGwgbGF1bmNoIGEgbmV3IGFjdGl2aXR5IG9uIHRvcCBhbmQgYXR0ZW1wdCB0bworICAgICAgICAvLyBlbnRlciBwaXAgd2hlbiBpdCBpcyBzdG9wcGVkCisgICAgICAgIGxhdW5jaEFjdGl2aXR5KFBJUF9PTl9TVE9QX0FDVElWSVRZKTsKKworICAgICAgICAvLyBXYWl0IGZvciB0aGUgYm90dG9tIHBpcCBhY3Rpdml0eSB0byBiZSBzdG9wcGVkCisgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvckFjdGl2aXR5U3RhdGUoUElQX09OX1NUT1BfQUNUSVZJVFksIFNUQVRFX1NUT1BQRUQpOworCisgICAgICAgIC8vIEFzc2VydCB0aGF0IHRoZXJlIGlzIG5vIHBpbm5lZCBzdGFjayAodGhhdCBlbnRlclBpY3R1cmVJblBpY3R1cmUoKSBmYWlsZWQpCisgICAgICAgIGFzc2VydFBpbm5lZFN0YWNrRG9lc05vdEV4aXN0KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0b0VudGVyUGljdHVyZUluUGljdHVyZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3N1bWVUcnVlKHN1cHBvcnRzUGlwKCkpOworCisgICAgICAgIC8vIExhdW5jaCBhIHRlc3QgYWN0aXZpdHkgc28gdGhhdCB3ZSdyZSBub3Qgb3ZlciBob21lCisgICAgICAgIGxhdW5jaEFjdGl2aXR5KFRFU1RfQUNUSVZJVFkpOworCisgICAgICAgIC8vIExhdW5jaCB0aGUgUElQIGFjdGl2aXR5IG9uIHBhdXNlCisgICAgICAgIGxhdW5jaEFjdGl2aXR5KFBJUF9BQ1RJVklUWSwgRVhUUkFfRU5URVJfUElQX09OX1BBVVNFLCAidHJ1ZSIpOworICAgICAgICBhc3NlcnRQaW5uZWRTdGFja0RvZXNOb3RFeGlzdCgpOworCisgICAgICAgIC8vIEdvIGhvbWUgYW5kIGVuc3VyZSB0aGF0IHRoZXJlIGlzIGEgcGlubmVkIHN0YWNrCisgICAgICAgIGxhdW5jaEhvbWVBY3Rpdml0eSgpOworICAgICAgICB3YWl0Rm9yRW50ZXJQaXAoUElQX0FDVElWSVRZKTsKKyAgICAgICAgYXNzZXJ0UGlubmVkU3RhY2tFeGlzdHMoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvRW50ZXJQaWN0dXJlSW5QaWN0dXJlTGF1bmNoQWN0aXZpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzdW1lVHJ1ZShzdXBwb3J0c1BpcCgpKTsKKworICAgICAgICAvLyBMYXVuY2ggYSB0ZXN0IGFjdGl2aXR5IHNvIHRoYXQgd2UncmUgbm90IG92ZXIgaG9tZQorICAgICAgICBsYXVuY2hBY3Rpdml0eShURVNUX0FDVElWSVRZKTsKKworICAgICAgICAvLyBMYXVuY2ggdGhlIFBJUCBhY3Rpdml0eSBvbiBwYXVzZSwgYW5kIGhhdmUgaXQgc3RhcnQgYW5vdGhlciBhY3Rpdml0eSBvbgorICAgICAgICAvLyB0b3Agb2YgaXRzZWxmLiAgV2FpdCBmb3IgdGhlIG5ldyBhY3Rpdml0eSB0byBiZSB2aXNpYmxlIGFuZCBlbnN1cmUgdGhhdCB0aGUgcGlubmVkIHN0YWNrCisgICAgICAgIC8vIHdhcyBub3QgY3JlYXRlZCBpbiB0aGUgcHJvY2VzcworICAgICAgICBsYXVuY2hBY3Rpdml0eShQSVBfQUNUSVZJVFksCisgICAgICAgICAgICAgICAgRVhUUkFfRU5URVJfUElQX09OX1BBVVNFLCAidHJ1ZSIsCisgICAgICAgICAgICAgICAgRVhUUkFfU1RBUlRfQUNUSVZJVFksIGdldEFjdGl2aXR5TmFtZShOT05fUkVTSVpFQUJMRV9BQ1RJVklUWSkpOworICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShmYWxzZSAvKiBjb21wYXJlVGFza0FuZFN0YWNrQm91bmRzICovLAorICAgICAgICAgICAgICAgIG5ldyBXYWl0Rm9yVmFsaWRBY3Rpdml0eVN0YXRlKE5PTl9SRVNJWkVBQkxFX0FDVElWSVRZKSk7CisgICAgICAgIGFzc2VydFBpbm5lZFN0YWNrRG9lc05vdEV4aXN0KCk7CisKKyAgICAgICAgLy8gR28gaG9tZSB3aGlsZSB0aGUgcGlwIGFjdGl2aXR5IGlzIG9wZW4gYW5kIGVuc3VyZSB0aGUgcHJldmlvdXMgYWN0aXZpdHkgaXMgbm90IFBJUGVkCisgICAgICAgIGxhdW5jaEhvbWVBY3Rpdml0eSgpOworICAgICAgICBhc3NlcnRQaW5uZWRTdGFja0RvZXNOb3RFeGlzdCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEF1dG9FbnRlclBpY3R1cmVJblBpY3R1cmVGaW5pc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzdW1lVHJ1ZShzdXBwb3J0c1BpcCgpKTsKKworICAgICAgICAvLyBMYXVuY2ggYSB0ZXN0IGFjdGl2aXR5IHNvIHRoYXQgd2UncmUgbm90IG92ZXIgaG9tZQorICAgICAgICBsYXVuY2hBY3Rpdml0eShURVNUX0FDVElWSVRZKTsKKworICAgICAgICAvLyBMYXVuY2ggdGhlIFBJUCBhY3Rpdml0eSBvbiBwYXVzZSwgYW5kIHNldCBpdCB0byBmaW5pc2ggaXRzZWxmIGFmdGVyCisgICAgICAgIC8vIHNvbWUgcGVyaW9kLiAgV2FpdCBmb3IgdGhlIHByZXZpb3VzIGFjdGl2aXR5IHRvIGJlIHZpc2libGUsIGFuZCBlbnN1cmUgdGhhdCB0aGUgcGlubmVkCisgICAgICAgIC8vIHN0YWNrIHdhcyBub3QgY3JlYXRlZCBpbiB0aGUgcHJvY2VzcworICAgICAgICBsYXVuY2hBY3Rpdml0eShQSVBfQUNUSVZJVFksCisgICAgICAgICAgICAgICAgRVhUUkFfRU5URVJfUElQX09OX1BBVVNFLCAidHJ1ZSIsCisgICAgICAgICAgICAgICAgRVhUUkFfRklOSVNIX1NFTEZfT05fUkVTVU1FLCAidHJ1ZSIpOworICAgICAgICBhc3NlcnRQaW5uZWRTdGFja0RvZXNOb3RFeGlzdCgpOworICAgIH0KKworICAgIEBQcmVzdWJtaXQKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvRW50ZXJQaWN0dXJlSW5QaWN0dXJlQXNwZWN0UmF0aW8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzdW1lVHJ1ZShzdXBwb3J0c1BpcCgpKTsKKworICAgICAgICAvLyBMYXVuY2ggdGhlIFBJUCBhY3Rpdml0eSBvbiBwYXVzZSwgYW5kIHNldCB0aGUgYXNwZWN0IHJhdGlvCisgICAgICAgIGxhdW5jaEFjdGl2aXR5KFBJUF9BQ1RJVklUWSwKKyAgICAgICAgICAgICAgICBFWFRSQV9FTlRFUl9QSVBfT05fUEFVU0UsICJ0cnVlIiwKKyAgICAgICAgICAgICAgICBFWFRSQV9TRVRfQVNQRUNUX1JBVElPX05VTUVSQVRPUiwgSW50ZWdlci50b1N0cmluZyhNQVhfQVNQRUNUX1JBVElPX05VTUVSQVRPUiksCisgICAgICAgICAgICAgICAgRVhUUkFfU0VUX0FTUEVDVF9SQVRJT19ERU5PTUlOQVRPUiwgSW50ZWdlci50b1N0cmluZyhNQVhfQVNQRUNUX1JBVElPX0RFTk9NSU5BVE9SKSk7CisKKyAgICAgICAgLy8gR28gaG9tZSB3aGlsZSB0aGUgcGlwIGFjdGl2aXR5IGlzIG9wZW4gdG8gdHJpZ2dlciBhdXRvLVBJUAorICAgICAgICBsYXVuY2hIb21lQWN0aXZpdHkoKTsKKyAgICAgICAgLy8gV2FpdCBmb3IgYW5pbWF0aW9uIGNvbXBsZXRlIHNpbmNlIHdlIGFyZSBjb21wYXJpbmcgYXNwZWN0IHJhdGlvCisgICAgICAgIHdhaXRGb3JFbnRlclBpcEFuaW1hdGlvbkNvbXBsZXRlKFBJUF9BQ1RJVklUWSk7CisgICAgICAgIGFzc2VydFBpbm5lZFN0YWNrRXhpc3RzKCk7CisKKyAgICAgICAgd2FpdEZvclZhbGlkQXNwZWN0UmF0aW8oTUFYX0FTUEVDVF9SQVRJT19OVU1FUkFUT1IsIE1BWF9BU1BFQ1RfUkFUSU9fREVOT01JTkFUT1IpOworICAgICAgICBSZWN0IGJvdW5kcyA9IGdldFBpbm5lZFN0YWNrQm91bmRzKCk7CisgICAgICAgIGFzc2VydEZsb2F0RXF1YWxzKChmbG9hdCkgYm91bmRzLndpZHRoKCkgLyBib3VuZHMuaGVpZ2h0KCksCisgICAgICAgICAgICAgICAgKGZsb2F0KSBNQVhfQVNQRUNUX1JBVElPX05VTUVSQVRPUiAvIE1BWF9BU1BFQ1RfUkFUSU9fREVOT01JTkFUT1IpOworICAgIH0KKworICAgIEBQcmVzdWJtaXQKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvRW50ZXJQaWN0dXJlSW5QaWN0dXJlT3ZlclBpcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3N1bWVUcnVlKHN1cHBvcnRzUGlwKCkpOworCisgICAgICAgIC8vIExhdW5jaCBhbm90aGVyIFBJUCBhY3Rpdml0eQorICAgICAgICBsYXVuY2hBY3Rpdml0eShMQVVOQ0hfSU5UT19QSU5ORURfU1RBQ0tfUElQX0FDVElWSVRZKTsKKyAgICAgICAgd2FpdEZvckVudGVyUGlwKEFMV0FZU19GT0NVU0FCTEVfUElQX0FDVElWSVRZKTsKKyAgICAgICAgYXNzZXJ0UGlubmVkU3RhY2tFeGlzdHMoKTsKKworICAgICAgICAvLyBMYXVuY2ggdGhlIFBJUCBhY3Rpdml0eSBvbiBwYXVzZQorICAgICAgICBsYXVuY2hBY3Rpdml0eShQSVBfQUNUSVZJVFksIEVYVFJBX0VOVEVSX1BJUF9PTl9QQVVTRSwgInRydWUiKTsKKworICAgICAgICAvLyBHbyBob21lIHdoaWxlIHRoZSBQSVAgYWN0aXZpdHkgaXMgb3BlbiB0byB0cnkgdG8gdHJpZ2dlciBhdXRvLWVudGVyIFBJUAorICAgICAgICBsYXVuY2hIb21lQWN0aXZpdHkoKTsKKyAgICAgICAgYXNzZXJ0UGlubmVkU3RhY2tFeGlzdHMoKTsKKworICAgICAgICAvLyBFbnN1cmUgdGhhdCBhdXRvLWVudGVyIHBpcCBmYWlsZWQgYW5kIHRoYXQgdGhlIHJlc3VtZWQgYWN0aXZpdHkgaW4gdGhlIHBpbm5lZCBzdGFjayBpcworICAgICAgICAvLyBzdGlsbCB0aGUgZmlyc3QgYWN0aXZpdHkKKyAgICAgICAgZmluYWwgQWN0aXZpdHlTdGFjayBwaW5uZWRTdGFjayA9IGdldFBpbm5lZFN0YWNrKCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBwaW5uZWRTdGFjay5nZXRUYXNrcygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhnZXRBY3Rpdml0eU5hbWUoQUxXQVlTX0ZPQ1VTQUJMRV9QSVBfQUNUSVZJVFkpLAorICAgICAgICAgICAgICAgIHBpbm5lZFN0YWNrLmdldFRhc2tzKCkuZ2V0KDApLm1SZWFsQWN0aXZpdHkpOworICAgIH0KKworICAgIEBQcmVzdWJtaXQKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REaXNhbGxvd011bHRpcGxlVGFza3NJblBpbm5lZFN0YWNrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc3VtZVRydWUoc3VwcG9ydHNQaXAoKSk7CisKKyAgICAgICAgLy8gTGF1bmNoIGEgdGVzdCBhY3Rpdml0eSBzbyB0aGF0IHdlIGhhdmUgbXVsdGlwbGUgZnVsbHNjcmVlbiB0YXNrcworICAgICAgICBsYXVuY2hBY3Rpdml0eShURVNUX0FDVElWSVRZKTsKKworICAgICAgICAvLyBMYXVuY2ggZmlyc3QgUElQIGFjdGl2aXR5CisgICAgICAgIGxhdW5jaEFjdGl2aXR5KFBJUF9BQ1RJVklUWSwgRVhUUkFfRU5URVJfUElQLCAidHJ1ZSIpOworICAgICAgICB3YWl0Rm9yRW50ZXJQaXBBbmltYXRpb25Db21wbGV0ZShQSVBfQUNUSVZJVFkpOworCisgICAgICAgIC8vIExhdW5jaCBzZWNvbmQgUElQIGFjdGl2aXR5CisgICAgICAgIGxhdW5jaEFjdGl2aXR5KFBJUF9BQ1RJVklUWTIsIEVYVFJBX0VOVEVSX1BJUCwgInRydWUiKTsKKworICAgICAgICBmaW5hbCBBY3Rpdml0eVN0YWNrIHBpbm5lZFN0YWNrID0gZ2V0UGlubmVkU3RhY2soKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHBpbm5lZFN0YWNrLmdldFRhc2tzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5jb250YWluc0FjdGl2aXR5SW5XaW5kb3dpbmdNb2RlKAorICAgICAgICAgICAgICAgIFBJUF9BQ1RJVklUWTIsIFdJTkRPV0lOR19NT0RFX1BJTk5FRCkpOworICAgICAgICBhc3NlcnRUcnVlKG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmNvbnRhaW5zQWN0aXZpdHlJbldpbmRvd2luZ01vZGUoCisgICAgICAgICAgICAgICAgUElQX0FDVElWSVRZLCBXSU5ET1dJTkdfTU9ERV9GVUxMU0NSRUVOKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGlwVW5QaXBPdmVySG9tZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3N1bWVUcnVlKHN1cHBvcnRzUGlwKCkpOworCisgICAgICAgIC8vIEdvIGhvbWUKKyAgICAgICAgbGF1bmNoSG9tZUFjdGl2aXR5KCk7CisgICAgICAgIC8vIExhdW5jaCBhbiBhdXRvIHBpcCBhY3Rpdml0eQorICAgICAgICBsYXVuY2hBY3Rpdml0eShQSVBfQUNUSVZJVFksCisgICAgICAgICAgICAgICAgRVhUUkFfRU5URVJfUElQLCAidHJ1ZSIsCisgICAgICAgICAgICAgICAgRVhUUkFfUkVFTlRFUl9QSVBfT05fRVhJVCwgInRydWUiKTsKKyAgICAgICAgd2FpdEZvckVudGVyUGlwKFBJUF9BQ1RJVklUWSk7CisgICAgICAgIGFzc2VydFBpbm5lZFN0YWNrRXhpc3RzKCk7CisKKyAgICAgICAgLy8gUmVsYXVuY2ggdGhlIGFjdGl2aXR5IHRvIGZ1bGxzY3JlZW4gdG8gdHJpZ2dlciB0aGUgYWN0aXZpdHkgdG8gZXhpdCBhbmQgcmUtZW50ZXIgcGlwCisgICAgICAgIGxhdW5jaEFjdGl2aXR5KFBJUF9BQ1RJVklUWSk7CisgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvcldpdGhBbVN0YXRlKGFtU3RhdGUgLT4KKyAgICAgICAgICAgICAgICBhbVN0YXRlLmdldEZyb250U3RhY2tXaW5kb3dpbmdNb2RlKERFRkFVTFRfRElTUExBWSkgPT0gV0lORE9XSU5HX01PREVfRlVMTFNDUkVFTiwKKyAgICAgICAgICAgICAgICAiV2FpdGluZyBmb3IgUElQIHRvIGV4aXQgdG8gZnVsbHNjcmVlbiIpOworICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JXaXRoQW1TdGF0ZShhbVN0YXRlIC0+CisgICAgICAgICAgICAgICAgYW1TdGF0ZS5nZXRGcm9udFN0YWNrV2luZG93aW5nTW9kZShERUZBVUxUX0RJU1BMQVkpID09IFdJTkRPV0lOR19NT0RFX1BJTk5FRCwKKyAgICAgICAgICAgICAgICAiV2FpdGluZyB0byByZS1lbnRlciBQSVAiKTsKKyAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRIb21lQWN0aXZpdHlWaXNpYmxlKHRydWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBpcFVuUGlwT3ZlckFwcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3N1bWVUcnVlKHN1cHBvcnRzUGlwKCkpOworCisgICAgICAgIC8vIExhdW5jaCBhIHRlc3QgYWN0aXZpdHkgc28gdGhhdCB3ZSdyZSBub3Qgb3ZlciBob21lCisgICAgICAgIGxhdW5jaEFjdGl2aXR5KFRFU1RfQUNUSVZJVFkpOworCisgICAgICAgIC8vIExhdW5jaCBhbiBhdXRvIHBpcCBhY3Rpdml0eQorICAgICAgICBsYXVuY2hBY3Rpdml0eShQSVBfQUNUSVZJVFksIEVYVFJBX0VOVEVSX1BJUCwgInRydWUiKTsKKyAgICAgICAgd2FpdEZvckVudGVyUGlwKFBJUF9BQ1RJVklUWSk7CisgICAgICAgIGFzc2VydFBpbm5lZFN0YWNrRXhpc3RzKCk7CisKKyAgICAgICAgLy8gUmVsYXVuY2ggdGhlIGFjdGl2aXR5IHRvIGZ1bGxzY3JlZW4gdG8gdHJpZ2dlciB0aGUgYWN0aXZpdHkgdG8gZXhpdCBhbmQgcmUtZW50ZXIgcGlwCisgICAgICAgIGxhdW5jaEFjdGl2aXR5KFBJUF9BQ1RJVklUWSk7CisgICAgICAgIHdhaXRGb3JFeGl0UGlwVG9GdWxsc2NyZWVuKFBJUF9BQ1RJVklUWSk7CisgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoImFtIGJyb2FkY2FzdCAtYSAiICsgQUNUSU9OX0VOVEVSX1BJUCk7CisgICAgICAgIHdhaXRGb3JFbnRlclBpcEFuaW1hdGlvbkNvbXBsZXRlKFBJUF9BQ1RJVklUWSk7CisgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShURVNUX0FDVElWSVRZLCB0cnVlKTsKKyAgICB9CisKKyAgICBAUHJlc3VibWl0CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlUGlwV2l0aE5vRnVsbHNjcmVlblN0YWNrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc3VtZVRydWUoc3VwcG9ydHNQaXAoKSk7CisKKyAgICAgICAgLy8gTGF1bmNoIGEgcGlwIGFjdGl2aXR5CisgICAgICAgIGxhdW5jaEFjdGl2aXR5KFBJUF9BQ1RJVklUWSwgRVhUUkFfRU5URVJfUElQLCAidHJ1ZSIpOworICAgICAgICB3YWl0Rm9yRW50ZXJQaXAoUElQX0FDVElWSVRZKTsKKyAgICAgICAgYXNzZXJ0UGlubmVkU3RhY2tFeGlzdHMoKTsKKworICAgICAgICAvLyBSZW1vdmUgdGhlIHN0YWNrIGFuZCBlbnN1cmUgdGhhdCB0aGUgdGFzayBpcyBub3cgaW4gdGhlIGZ1bGxzY3JlZW4gc3RhY2sgKHdoZW4gbm8KKyAgICAgICAgLy8gZnVsbHNjcmVlbiBzdGFjayBleGlzdGVkIGJlZm9yZSkKKyAgICAgICAgcmVtb3ZlU3RhY2tzSW5XaW5kb3dpbmdNb2RlcyhXSU5ET1dJTkdfTU9ERV9QSU5ORUQpOworICAgICAgICBhc3NlcnRQaW5uZWRTdGFja1N0YXRlT25Nb3ZlVG9GdWxsc2NyZWVuKFBJUF9BQ1RJVklUWSwKKyAgICAgICAgICAgICAgICBXSU5ET1dJTkdfTU9ERV9VTkRFRklORUQsIEFDVElWSVRZX1RZUEVfSE9NRSk7CisgICAgfQorCisgICAgQFByZXN1Ym1pdAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZVBpcFdpdGhWaXNpYmxlRnVsbHNjcmVlblN0YWNrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc3VtZVRydWUoc3VwcG9ydHNQaXAoKSk7CisKKyAgICAgICAgLy8gTGF1bmNoIGEgZnVsbHNjcmVlbiBhY3Rpdml0eSwgYW5kIGEgcGlwIGFjdGl2aXR5IG92ZXIgdGhhdAorICAgICAgICBsYXVuY2hBY3Rpdml0eShURVNUX0FDVElWSVRZKTsKKyAgICAgICAgbGF1bmNoQWN0aXZpdHkoUElQX0FDVElWSVRZLCBFWFRSQV9FTlRFUl9QSVAsICJ0cnVlIik7CisgICAgICAgIHdhaXRGb3JFbnRlclBpcChQSVBfQUNUSVZJVFkpOworICAgICAgICBhc3NlcnRQaW5uZWRTdGFja0V4aXN0cygpOworCisgICAgICAgIC8vIFJlbW92ZSB0aGUgc3RhY2sgYW5kIGVuc3VyZSB0aGF0IHRoZSB0YXNrIGlzIHBsYWNlZCBpbiB0aGUgZnVsbHNjcmVlbiBzdGFjaywgYmVoaW5kIHRoZQorICAgICAgICAvLyB0b3AgZnVsbHNjcmVlbiBhY3Rpdml0eQorICAgICAgICByZW1vdmVTdGFja3NJbldpbmRvd2luZ01vZGVzKFdJTkRPV0lOR19NT0RFX1BJTk5FRCk7CisgICAgICAgIGFzc2VydFBpbm5lZFN0YWNrU3RhdGVPbk1vdmVUb0Z1bGxzY3JlZW4oUElQX0FDVElWSVRZLAorICAgICAgICAgICAgICAgIFdJTkRPV0lOR19NT0RFX0ZVTExTQ1JFRU4sIEFDVElWSVRZX1RZUEVfU1RBTkRBUkQpOworICAgIH0KKworICAgIEBGbGFreVRlc3QoYnVnSWQgPSA3MDc0NjA5OCkKKyAgICBAUHJlc3VibWl0CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlUGlwV2l0aEhpZGRlbkZ1bGxzY3JlZW5TdGFjaygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3N1bWVUcnVlKHN1cHBvcnRzUGlwKCkpOworCisgICAgICAgIC8vIExhdW5jaCBhIGZ1bGxzY3JlZW4gYWN0aXZpdHksIHJldHVybiBob21lIGFuZCB3aGlsZSB0aGUgZnVsbHNjcmVlbiBzdGFjayBpcyBoaWRkZW4sCisgICAgICAgIC8vIGxhdW5jaCBhIHBpcCBhY3Rpdml0eSBvdmVyIGhvbWUKKyAgICAgICAgbGF1bmNoQWN0aXZpdHkoVEVTVF9BQ1RJVklUWSk7CisgICAgICAgIGxhdW5jaEhvbWVBY3Rpdml0eSgpOworICAgICAgICBsYXVuY2hBY3Rpdml0eShQSVBfQUNUSVZJVFksIEVYVFJBX0VOVEVSX1BJUCwgInRydWUiKTsKKyAgICAgICAgd2FpdEZvckVudGVyUGlwKFBJUF9BQ1RJVklUWSk7CisgICAgICAgIGFzc2VydFBpbm5lZFN0YWNrRXhpc3RzKCk7CisKKyAgICAgICAgLy8gUmVtb3ZlIHRoZSBzdGFjayBhbmQgZW5zdXJlIHRoYXQgdGhlIHRhc2sgaXMgcGxhY2VkIG9uIHRvcCBvZiB0aGUgaGlkZGVuIGZ1bGxzY3JlZW4KKyAgICAgICAgLy8gc3RhY2ssIGJ1dCB0aGF0IHRoZSBob21lIHN0YWNrIGlzIHN0aWxsIGZvY3VzZWQKKyAgICAgICAgcmVtb3ZlU3RhY2tzSW5XaW5kb3dpbmdNb2RlcyhXSU5ET1dJTkdfTU9ERV9QSU5ORUQpOworICAgICAgICBhc3NlcnRQaW5uZWRTdGFja1N0YXRlT25Nb3ZlVG9GdWxsc2NyZWVuKFBJUF9BQ1RJVklUWSwKKyAgICAgICAgICAgICAgICBXSU5ET1dJTkdfTU9ERV9VTkRFRklORUQsIEFDVElWSVRZX1RZUEVfSE9NRSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TW92ZVBpcFRvQmFja1dpdGhOb0Z1bGxzY3JlZW5TdGFjaygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3N1bWVUcnVlKHN1cHBvcnRzUGlwKCkpOworCisgICAgICAgIC8vIFN0YXJ0IHdpdGggYSBjbGVhbiBzbGF0ZSwgcmVtb3ZlIGFsbCB0aGUgc3RhY2tzIGJ1dCBob21lCisgICAgICAgIHJlbW92ZVN0YWNrc1dpdGhBY3Rpdml0eVR5cGVzKEFMTF9BQ1RJVklUWV9UWVBFX0JVVF9IT01FKTsKKworICAgICAgICAvLyBMYXVuY2ggYSBwaXAgYWN0aXZpdHkKKyAgICAgICAgbGF1bmNoQWN0aXZpdHkoUElQX0FDVElWSVRZLCBFWFRSQV9FTlRFUl9QSVAsICJ0cnVlIik7CisgICAgICAgIHdhaXRGb3JFbnRlclBpcChQSVBfQUNUSVZJVFkpOworICAgICAgICBhc3NlcnRQaW5uZWRTdGFja0V4aXN0cygpOworCisgICAgICAgIC8vIFJlbW92ZSB0aGUgc3RhY2sgYW5kIGVuc3VyZSB0aGF0IHRoZSB0YXNrIGlzIG5vdyBpbiB0aGUgZnVsbHNjcmVlbiBzdGFjayAod2hlbiBubworICAgICAgICAvLyBmdWxsc2NyZWVuIHN0YWNrIGV4aXN0ZWQgYmVmb3JlKQorICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKCJhbSBicm9hZGNhc3QgLWEgIiArIEFDVElPTl9NT1ZFX1RPX0JBQ0spOworICAgICAgICBhc3NlcnRQaW5uZWRTdGFja1N0YXRlT25Nb3ZlVG9GdWxsc2NyZWVuKFBJUF9BQ1RJVklUWSwKKyAgICAgICAgICAgICAgICBXSU5ET1dJTkdfTU9ERV9VTkRFRklORUQsIEFDVElWSVRZX1RZUEVfSE9NRSk7CisgICAgfQorCisgICAgQEZsYWt5VGVzdChidWdJZCA9IDcwOTA2NDk5KQorICAgIEBQcmVzdWJtaXQKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNb3ZlUGlwVG9CYWNrV2l0aFZpc2libGVGdWxsc2NyZWVuU3RhY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzdW1lVHJ1ZShzdXBwb3J0c1BpcCgpKTsKKworICAgICAgICAvLyBMYXVuY2ggYSBmdWxsc2NyZWVuIGFjdGl2aXR5LCBhbmQgYSBwaXAgYWN0aXZpdHkgb3ZlciB0aGF0CisgICAgICAgIGxhdW5jaEFjdGl2aXR5KFRFU1RfQUNUSVZJVFkpOworICAgICAgICBsYXVuY2hBY3Rpdml0eShQSVBfQUNUSVZJVFksIEVYVFJBX0VOVEVSX1BJUCwgInRydWUiKTsKKyAgICAgICAgd2FpdEZvckVudGVyUGlwKFBJUF9BQ1RJVklUWSk7CisgICAgICAgIGFzc2VydFBpbm5lZFN0YWNrRXhpc3RzKCk7CisKKyAgICAgICAgLy8gUmVtb3ZlIHRoZSBzdGFjayBhbmQgZW5zdXJlIHRoYXQgdGhlIHRhc2sgaXMgcGxhY2VkIGluIHRoZSBmdWxsc2NyZWVuIHN0YWNrLCBiZWhpbmQgdGhlCisgICAgICAgIC8vIHRvcCBmdWxsc2NyZWVuIGFjdGl2aXR5CisgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoImFtIGJyb2FkY2FzdCAtYSAiICsgQUNUSU9OX01PVkVfVE9fQkFDSyk7CisgICAgICAgIGFzc2VydFBpbm5lZFN0YWNrU3RhdGVPbk1vdmVUb0Z1bGxzY3JlZW4oUElQX0FDVElWSVRZLAorICAgICAgICAgICAgICAgIFdJTkRPV0lOR19NT0RFX0ZVTExTQ1JFRU4sIEFDVElWSVRZX1RZUEVfU1RBTkRBUkQpOworICAgIH0KKworICAgIEBGbGFreVRlc3QoYnVnSWQgPSA3MDkwNjQ5OSkKKyAgICBAUHJlc3VibWl0CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TW92ZVBpcFRvQmFja1dpdGhIaWRkZW5GdWxsc2NyZWVuU3RhY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzdW1lVHJ1ZShzdXBwb3J0c1BpcCgpKTsKKworICAgICAgICAvLyBMYXVuY2ggYSBmdWxsc2NyZWVuIGFjdGl2aXR5LCByZXR1cm4gaG9tZSBhbmQgd2hpbGUgdGhlIGZ1bGxzY3JlZW4gc3RhY2sgaXMgaGlkZGVuLAorICAgICAgICAvLyBsYXVuY2ggYSBwaXAgYWN0aXZpdHkgb3ZlciBob21lCisgICAgICAgIGxhdW5jaEFjdGl2aXR5KFRFU1RfQUNUSVZJVFkpOworICAgICAgICBsYXVuY2hIb21lQWN0aXZpdHkoKTsKKyAgICAgICAgbGF1bmNoQWN0aXZpdHkoUElQX0FDVElWSVRZLCBFWFRSQV9FTlRFUl9QSVAsICJ0cnVlIik7CisgICAgICAgIHdhaXRGb3JFbnRlclBpcChQSVBfQUNUSVZJVFkpOworICAgICAgICBhc3NlcnRQaW5uZWRTdGFja0V4aXN0cygpOworCisgICAgICAgIC8vIFJlbW92ZSB0aGUgc3RhY2sgYW5kIGVuc3VyZSB0aGF0IHRoZSB0YXNrIGlzIHBsYWNlZCBvbiB0b3Agb2YgdGhlIGhpZGRlbiBmdWxsc2NyZWVuCisgICAgICAgIC8vIHN0YWNrLCBidXQgdGhhdCB0aGUgaG9tZSBzdGFjayBpcyBzdGlsbCBmb2N1c2VkCisgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoImFtIGJyb2FkY2FzdCAtYSAiICsgQUNUSU9OX01PVkVfVE9fQkFDSyk7CisgICAgICAgIGFzc2VydFBpbm5lZFN0YWNrU3RhdGVPbk1vdmVUb0Z1bGxzY3JlZW4oCisgICAgICAgICAgICAgICAgUElQX0FDVElWSVRZLCBXSU5ET1dJTkdfTU9ERV9VTkRFRklORUQsIEFDVElWSVRZX1RZUEVfSE9NRSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGlubmVkU3RhY2tBbHdheXNPblRvcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3N1bWVUcnVlKHN1cHBvcnRzUGlwKCkpOworCisgICAgICAgIC8vIExhdW5jaCBhY3Rpdml0eSBpbnRvIHBpbm5lZCBzdGFjayBhbmQgYXNzZXJ0IGl0J3Mgb24gdG9wLgorICAgICAgICBsYXVuY2hBY3Rpdml0eShQSVBfQUNUSVZJVFksIEVYVFJBX0VOVEVSX1BJUCwgInRydWUiKTsKKyAgICAgICAgd2FpdEZvckVudGVyUGlwKFBJUF9BQ1RJVklUWSk7CisgICAgICAgIGFzc2VydFBpbm5lZFN0YWNrRXhpc3RzKCk7CisgICAgICAgIGFzc2VydFBpbm5lZFN0YWNrSXNPblRvcCgpOworCisgICAgICAgIC8vIExhdW5jaCBhbm90aGVyIGFjdGl2aXR5IGluIGZ1bGxzY3JlZW4gc3RhY2sgYW5kIGNoZWNrIHRoYXQgcGlubmVkIHN0YWNrIGlzIHN0aWxsIG9uIHRvcC4KKyAgICAgICAgbGF1bmNoQWN0aXZpdHkoVEVTVF9BQ1RJVklUWSk7CisgICAgICAgIGFzc2VydFBpbm5lZFN0YWNrRXhpc3RzKCk7CisgICAgICAgIGFzc2VydFBpbm5lZFN0YWNrSXNPblRvcCgpOworCisgICAgICAgIC8vIExhdW5jaCBob21lIGFuZCBjaGVjayB0aGF0IHBpbm5lZCBzdGFjayBpcyBzdGlsbCBvbiB0b3AuCisgICAgICAgIGxhdW5jaEhvbWVBY3Rpdml0eSgpOworICAgICAgICBhc3NlcnRQaW5uZWRTdGFja0V4aXN0cygpOworICAgICAgICBhc3NlcnRQaW5uZWRTdGFja0lzT25Ub3AoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBPcHNEZW55UGlwT25QYXVzZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3N1bWVUcnVlKHN1cHBvcnRzUGlwKCkpOworCisgICAgICAgIHRyeSAoZmluYWwgQXBwT3BzU2Vzc2lvbiBhcHBPcHNTZXNzaW9uID0gbmV3IEFwcE9wc1Nlc3Npb24oUElQX0FDVElWSVRZKSkgeworICAgICAgICAgICAgLy8gRGlzYWJsZSBlbnRlci1waXAgYW5kIHRyeSB0byBlbnRlciBwaXAKKyAgICAgICAgICAgIGFwcE9wc1Nlc3Npb24uc2V0T3BUb01vZGUoQVBQX09QU19PUF9FTlRFUl9QSUNUVVJFX0lOX1BJQ1RVUkUsIEFQUF9PUFNfTU9ERV9JR05PUkVEKTsKKworICAgICAgICAgICAgLy8gTGF1bmNoIHRoZSBQSVAgYWN0aXZpdHkgb24gcGF1c2UKKyAgICAgICAgICAgIGxhdW5jaEFjdGl2aXR5KFBJUF9BQ1RJVklUWSwgRVhUUkFfRU5URVJfUElQLCAidHJ1ZSIpOworICAgICAgICAgICAgYXNzZXJ0UGlubmVkU3RhY2tEb2VzTm90RXhpc3QoKTsKKworICAgICAgICAgICAgLy8gR28gaG9tZSBhbmQgZW5zdXJlIHRoYXQgdGhlcmUgaXMgbm8gcGlubmVkIHN0YWNrCisgICAgICAgICAgICBsYXVuY2hIb21lQWN0aXZpdHkoKTsKKyAgICAgICAgICAgIGFzc2VydFBpbm5lZFN0YWNrRG9lc05vdEV4aXN0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbnRlclBpcEZyb21UYXNrV2l0aE11bHRpcGxlQWN0aXZpdGllcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3N1bWVUcnVlKHN1cHBvcnRzUGlwKCkpOworCisgICAgICAgIC8vIFRyeSB0byBlbnRlciBwaWN0dXJlLWluLXBpY3R1cmUgZnJvbSBhbiBhY3Rpdml0eSB0aGF0IGhhcyBtb3JlIHRoYW4gb25lIGFjdGl2aXR5IGluIHRoZQorICAgICAgICAvLyB0YXNrIGFuZCBlbnN1cmUgdGhhdCBpdCB3b3JrcworICAgICAgICBsYXVuY2hBY3Rpdml0eShMQVVOQ0hfRU5URVJfUElQX0FDVElWSVRZKTsKKyAgICAgICAgd2FpdEZvckVudGVyUGlwKFBJUF9BQ1RJVklUWSk7CisgICAgICAgIGFzc2VydFBpbm5lZFN0YWNrRXhpc3RzKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW50ZXJQaXBXaXRoUmVzdW1lV2hpbGVQYXVzaW5nQWN0aXZpdHlOb1N0b3AoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzdW1lVHJ1ZShzdXBwb3J0c1BpcCgpKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBMYXVuY2ggdGhlIHJlc3VtZVdoaWxlUGF1c2luZyBhY3Rpdml0eSBhbmQgZW5zdXJlIHRoYXQgdGhlIFBpUCBhY3Rpdml0eSBkaWQgbm90IGdldAorICAgICAgICAgKiBzdG9wcGVkIGFuZCBhY3R1YWxseSB3ZW50IGludG8gdGhlIHBpbm5lZCBzdGFjay4KKyAgICAgICAgICoKKyAgICAgICAgICogTm90ZSB0aGF0IHRoaXMgaXMgYSB3b3JrYXJvdW5kIGJlY2F1c2UgdG8gdHJpZ2dlciB0aGUgcGF0aCB0aGF0IHdlIHdhbnQgdG8gaGFwcGVuIGluCisgICAgICAgICAqIGFjdGl2aXR5IG1hbmFnZXIsIHdlIG5lZWQgdG8gYWRkIHRoZSBsZWF2aW5nIGFjdGl2aXR5IHRvIHRoZSBzdG9wcGluZyBzdGF0ZSwgd2hpY2ggb25seQorICAgICAgICAgKiBoYXBwZW5zIHdoZW4gYSBoaWRkZW4gc3RhY2sgaXMgYnJvdWdodCBmb3J3YXJkLiBOb3JtYWxseSwgdGhpcyBoYXBwZW5zIHdoZW4geW91IGdvIGhvbWUsCisgICAgICAgICAqIGJ1dCBzaW5jZSB3ZSBjYW4ndCBsYXVuY2ggaW50byB0aGUgaG9tZSBzdGFjayBkaXJlY3RseSwgd2UgaGF2ZSBhIHdvcmthcm91bmQuCisgICAgICAgICAqCisgICAgICAgICAqIDEpIExhdW5jaCBhbiBhY3Rpdml0eSBpbiBhIG5ldyBkeW5hbWljIHN0YWNrCisgICAgICAgICAqIDIpIFJlc2l6ZSB0aGUgZHluYW1pYyBzdGFjayB0byBub24tZnVsbHNjcmVlbiBib3VuZHMKKyAgICAgICAgICogMykgU3RhcnQgdGhlIFBpUCBhY3Rpdml0eSB0aGF0IHdpbGwgZW50ZXIgcGljdHVyZS1pbi1waWN0dXJlIHdoZW4gcGF1c2VkIGluIHRoZQorICAgICAgICAgKiAgICBmdWxsc2NyZWVuIHN0YWNrCisgICAgICAgICAqIDQpIEJyaW5nIHRoZSBhY3Rpdml0eSBpbiB0aGUgZHluYW1pYyBzdGFjayBmb3J3YXJkIHRvIHRyaWdnZXIgUGlQCisgICAgICAgICAqLworICAgICAgICBpbnQgc3RhY2tJZCA9IGxhdW5jaEFjdGl2aXR5SW5OZXdEeW5hbWljU3RhY2soUkVTVU1FX1dISUxFX1BBVVNJTkdfQUNUSVZJVFkpOworICAgICAgICByZXNpemVTdGFjayhzdGFja0lkLCAwLCAwLCA1MDAsIDUwMCk7CisgICAgICAgIC8vIExhdW5jaCBhbiBhY3Rpdml0eSB0aGF0IHdpbGwgZW50ZXIgUGlQIHdoZW4gaXQgaXMgcGF1c2VkIHdpdGggYSBkZWxheSB0aGF0IGlzIGxvbmcgZW5vdWdoCisgICAgICAgIC8vIGZvciB0aGUgbmV4dCByZXN1bWVXaGlsZVBhdXNpbmcgYWN0aXZpdHkgdG8gZmluaXNoIHJlc3VtaW5nLCBidXQgc2xvdyBlbm91Z2ggdG8gbm90CisgICAgICAgIC8vIHRyaWdnZXIgdGhlIGN1cnJlbnQgc3lzdGVtIHBhdXNlIHRpbWVvdXQgKGN1cnJlbnRseSA1MDBtcykKKyAgICAgICAgbGF1bmNoQWN0aXZpdHkoUElQX0FDVElWSVRZLCBXSU5ET1dJTkdfTU9ERV9GVUxMU0NSRUVOLAorICAgICAgICAgICAgICAgIEVYVFJBX0VOVEVSX1BJUF9PTl9QQVVTRSwgInRydWUiLAorICAgICAgICAgICAgICAgIEVYVFJBX09OX1BBVVNFX0RFTEFZLCAiMzUwIiwKKyAgICAgICAgICAgICAgICBFWFRSQV9BU1NFUlRfTk9fT05fU1RPUF9CRUZPUkVfUElQLCAidHJ1ZSIpOworICAgICAgICBsYXVuY2hBY3Rpdml0eShSRVNVTUVfV0hJTEVfUEFVU0lOR19BQ1RJVklUWSk7CisgICAgICAgIGFzc2VydFBpbm5lZFN0YWNrRXhpc3RzKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzYWxsb3dFbnRlclBpcEFjdGl2aXR5TG9ja2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc3VtZVRydWUoc3VwcG9ydHNQaXAoKSk7CisKKyAgICAgICAgbGF1bmNoQWN0aXZpdHkoUElQX0FDVElWSVRZLCBFWFRSQV9FTlRFUl9QSVBfT05fUEFVU0UsICJ0cnVlIik7CisgICAgICAgIEFjdGl2aXR5VGFzayB0YXNrID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0U3RhbmRhcmRTdGFja0J5V2luZG93aW5nTW9kZSgKKyAgICAgICAgICAgICAgICBXSU5ET1dJTkdfTU9ERV9GVUxMU0NSRUVOKS5nZXRUb3BUYXNrKCk7CisKKyAgICAgICAgLy8gTG9jayB0aGUgdGFzayBhbmQgZW5zdXJlIHRoYXQgd2UgY2FuJ3QgZW50ZXIgcGljdHVyZS1pbi1waWN0dXJlIGJvdGggZXhwbGljaXRseSBhbmQKKyAgICAgICAgLy8gd2hlbiBwYXVzZWQKKyAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZCgiYW0gdGFzayBsb2NrICIgKyB0YXNrLm1UYXNrSWQpOworICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKCJhbSBicm9hZGNhc3QgLWEgIiArIEFDVElPTl9FTlRFUl9QSVApOworICAgICAgICB3YWl0Rm9yRW50ZXJQaXAoUElQX0FDVElWSVRZKTsKKyAgICAgICAgYXNzZXJ0UGlubmVkU3RhY2tEb2VzTm90RXhpc3QoKTsKKyAgICAgICAgbGF1bmNoSG9tZUFjdGl2aXR5KCk7CisgICAgICAgIGFzc2VydFBpbm5lZFN0YWNrRG9lc05vdEV4aXN0KCk7CisgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoImFtIHRhc2sgbG9jayBzdG9wIik7CisgICAgfQorCisgICAgQEZsYWt5VGVzdChidWdJZCA9IDcwMzI4NTI0KQorICAgIEBQcmVzdWJtaXQKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25maWd1cmF0aW9uQ2hhbmdlT3JkZXJEdXJpbmdUcmFuc2l0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc3VtZVRydWUoc3VwcG9ydHNQaXAoKSk7CisKKyAgICAgICAgLy8gTGF1bmNoIGEgUGlQIGFjdGl2aXR5IGFuZCBlbnN1cmUgY29uZmlndXJhdGlvbiBjaGFuZ2Ugb25seSBoYXBwZW5lZCBvbmNlLCBhbmQgdGhhdCB0aGUKKyAgICAgICAgLy8gY29uZmlndXJhdGlvbiBjaGFuZ2UgaGFwcGVuZWQgYWZ0ZXIgdGhlIHBpY3R1cmUtaW4tcGljdHVyZSBhbmQgbXVsdGktd2luZG93IGNhbGxiYWNrcworICAgICAgICBsYXVuY2hBY3Rpdml0eShQSVBfQUNUSVZJVFkpOworICAgICAgICBMb2dTZXBhcmF0b3IgbG9nU2VwYXJhdG9yID0gc2VwYXJhdGVMb2dzKCk7CisgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoImFtIGJyb2FkY2FzdCAtYSAiICsgQUNUSU9OX0VOVEVSX1BJUCk7CisgICAgICAgIHdhaXRGb3JFbnRlclBpcChQSVBfQUNUSVZJVFkpOworICAgICAgICBhc3NlcnRQaW5uZWRTdGFja0V4aXN0cygpOworICAgICAgICB3YWl0Rm9yVmFsaWRQaWN0dXJlSW5QaWN0dXJlQ2FsbGJhY2tzKFBJUF9BQ1RJVklUWSwgbG9nU2VwYXJhdG9yKTsKKyAgICAgICAgYXNzZXJ0VmFsaWRQaWN0dXJlSW5QaWN0dXJlQ2FsbGJhY2tPcmRlcihQSVBfQUNUSVZJVFksIGxvZ1NlcGFyYXRvcik7CisKKyAgICAgICAgLy8gVHJpZ2dlciBpdCB0byBnbyBiYWNrIHRvIGZ1bGxzY3JlZW4gYW5kIGVuc3VyZSB0aGF0IG9ubHkgdHJpZ2dlcmVkIG9uZSBjb25maWd1cmF0aW9uCisgICAgICAgIC8vIGNoYW5nZSBhcyB3ZWxsCisgICAgICAgIGxvZ1NlcGFyYXRvciA9IHNlcGFyYXRlTG9ncygpOworICAgICAgICBsYXVuY2hBY3Rpdml0eShQSVBfQUNUSVZJVFkpOworICAgICAgICB3YWl0Rm9yVmFsaWRQaWN0dXJlSW5QaWN0dXJlQ2FsbGJhY2tzKFBJUF9BQ1RJVklUWSwgbG9nU2VwYXJhdG9yKTsKKyAgICAgICAgYXNzZXJ0VmFsaWRQaWN0dXJlSW5QaWN0dXJlQ2FsbGJhY2tPcmRlcihQSVBfQUNUSVZJVFksIGxvZ1NlcGFyYXRvcik7CisgICAgfQorCisgICAgLyoqIEhlbHBlciBjbGFzcyB0byBzYXZlLCBzZXQsIGFuZCByZXN0b3JlIHRyYW5zaXRpb25fYW5pbWF0aW9uX3NjYWxlIHByZWZlcmVuY2VzLiAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRyYW5zaXRpb25BbmltYXRpb25TY2FsZVNlc3Npb24gZXh0ZW5kcyBTZXR0aW5nc1Nlc3Npb248RmxvYXQ+IHsKKyAgICAgICAgVHJhbnNpdGlvbkFuaW1hdGlvblNjYWxlU2Vzc2lvbigpIHsKKyAgICAgICAgICAgIHN1cGVyKFNldHRpbmdzLkdsb2JhbC5nZXRVcmlGb3IoU2V0dGluZ3MuR2xvYmFsLlRSQU5TSVRJT05fQU5JTUFUSU9OX1NDQUxFKSwKKyAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuR2xvYmFsOjpnZXRGbG9hdCwKKyAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuR2xvYmFsOjpwdXRGbG9hdCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIC8vIFdhaXQgZm9yIHRoZSByZXN0b3JlZCBzZXR0aW5nIHRvIGFwcGx5IGJlZm9yZSB3ZSBjb250aW51ZSBvbiB3aXRoIHRoZSBuZXh0IHRlc3QKKyAgICAgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIHdhaXRMb2NrID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworICAgICAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0ID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0VGFyZ2V0Q29udGV4dCgpOworICAgICAgICAgICAgY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihtVXJpLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENvbnRlbnRPYnNlcnZlcihuZXcgSGFuZGxlcihMb29wZXIuZ2V0TWFpbkxvb3BlcigpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNoYW5nZShib29sZWFuIHNlbGZDaGFuZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0TG9jay5jb3VudERvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBzdXBlci5jbG9zZSgpOworICAgICAgICAgICAgaWYgKCF3YWl0TG9jay5hd2FpdCgyLCBUaW1lVW5pdC5TRUNPTkRTKSkgeworICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIlRyYW5zaXRpb25BbmltYXRpb25TY2FsZVNlc3Npb24gdmFsdWUgbm90IHJlc3RvcmVkIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbnRlclBpcEludGVycnVwdGVkQ2FsbGJhY2tzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc3VtZVRydWUoc3VwcG9ydHNQaXAoKSk7CisKKyAgICAgICAgdHJ5IChmaW5hbCBUcmFuc2l0aW9uQW5pbWF0aW9uU2NhbGVTZXNzaW9uIHRyYW5zaXRpb25BbmltYXRpb25TY2FsZVNlc3Npb24gPQorICAgICAgICAgICAgICAgIG5ldyBUcmFuc2l0aW9uQW5pbWF0aW9uU2NhbGVTZXNzaW9uKCkpIHsKKyAgICAgICAgICAgIC8vIFNsb3cgZG93biB0aGUgdHJhbnNpdGlvbiBhbmltYXRpb25zIGZvciB0aGlzIHRlc3QKKyAgICAgICAgICAgIHRyYW5zaXRpb25BbmltYXRpb25TY2FsZVNlc3Npb24uc2V0KDIwZik7CisKKyAgICAgICAgICAgIC8vIExhdW5jaCBhIFBpUCBhY3Rpdml0eQorICAgICAgICAgICAgbGF1bmNoQWN0aXZpdHkoUElQX0FDVElWSVRZLCBFWFRSQV9FTlRFUl9QSVAsICJ0cnVlIik7CisgICAgICAgICAgICAvLyBXYWl0IHVudGlsIHRoZSBQaVAgYWN0aXZpdHkgaGFzIG1vdmVkIGludG8gdGhlIHBpbm5lZCBzdGFjayAoaGFwcGVucyBiZWZvcmUgdGhlCisgICAgICAgICAgICAvLyB0cmFuc2l0aW9uIGhhcyBzdGFydGVkKQorICAgICAgICAgICAgd2FpdEZvckVudGVyUGlwKFBJUF9BQ1RJVklUWSk7CisgICAgICAgICAgICBhc3NlcnRQaW5uZWRTdGFja0V4aXN0cygpOworCisgICAgICAgICAgICAvLyBSZWxhdW5jaCB0aGUgUGlQIGFjdGl2aXR5IGJhY2sgaW50byBmdWxsc2NyZWVuCisgICAgICAgICAgICBMb2dTZXBhcmF0b3IgbG9nU2VwYXJhdG9yID0gc2VwYXJhdGVMb2dzKCk7CisgICAgICAgICAgICBsYXVuY2hBY3Rpdml0eShQSVBfQUNUSVZJVFkpOworICAgICAgICAgICAgLy8gV2FpdCB1bnRpbCB0aGUgUGlQIGFjdGl2aXR5IGlzIHJlcGFyZW50ZWQgaW50byB0aGUgZnVsbHNjcmVlbiBzdGFjayAoaGFwcGVucyBhZnRlcgorICAgICAgICAgICAgLy8gdGhlIHRyYW5zaXRpb24gaGFzIGZpbmlzaGVkKQorICAgICAgICAgICAgd2FpdEZvckV4aXRQaXBUb0Z1bGxzY3JlZW4oUElQX0FDVElWSVRZKTsKKworICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgd2UgZ2V0IHRoZSBjYWxsYmFja3MgaW5kaWNhdGluZyB0aGF0IFBpUC9NVyBtb2RlIHdhcyBjYW5jZWxsZWQsIGJ1dCBubworICAgICAgICAgICAgLy8gY29uZmlndXJhdGlvbiBjaGFuZ2UgKHNpbmNlIG5vbmUgd2FzIHNlbnQpCisgICAgICAgICAgICBmaW5hbCBBY3Rpdml0eUxpZmVjeWNsZUNvdW50cyBsaWZlY3ljbGVDb3VudHMgPSBuZXcgQWN0aXZpdHlMaWZlY3ljbGVDb3VudHMoCisgICAgICAgICAgICAgICAgICAgIFBJUF9BQ1RJVklUWSwgbG9nU2VwYXJhdG9yKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygib25Db25maWd1cmF0aW9uQ2hhbmdlZCIsIDAsIGxpZmVjeWNsZUNvdW50cy5tQ29uZmlndXJhdGlvbkNoYW5nZWRDb3VudCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIm9uUGljdHVyZUluUGljdHVyZU1vZGVDaGFuZ2VkIiwgMSwKKyAgICAgICAgICAgICAgICAgICAgbGlmZWN5Y2xlQ291bnRzLm1QaWN0dXJlSW5QaWN0dXJlTW9kZUNoYW5nZWRDb3VudCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIm9uTXVsdGlXaW5kb3dNb2RlQ2hhbmdlZCIsIDEsCisgICAgICAgICAgICAgICAgICAgIGxpZmVjeWNsZUNvdW50cy5tTXVsdGlXaW5kb3dNb2RlQ2hhbmdlZENvdW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBGbGFreVRlc3QoYnVnSWQgPSA3MTU2NDc2OSkKKyAgICBAUHJlc3VibWl0CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RvcEJlZm9yZU11bHRpV2luZG93Q2FsbGJhY2tzT25EaXNtaXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc3VtZVRydWUoc3VwcG9ydHNQaXAoKSk7CisKKyAgICAgICAgLy8gTGF1bmNoIGEgUGlQIGFjdGl2aXR5CisgICAgICAgIGxhdW5jaEFjdGl2aXR5KFBJUF9BQ1RJVklUWSwgRVhUUkFfRU5URVJfUElQLCAidHJ1ZSIpOworICAgICAgICB3YWl0Rm9yRW50ZXJQaXAoUElQX0FDVElWSVRZKTsKKyAgICAgICAgYXNzZXJ0UGlubmVkU3RhY2tFeGlzdHMoKTsKKworICAgICAgICAvLyBEaXNtaXNzIGl0CisgICAgICAgIExvZ1NlcGFyYXRvciBsb2dTZXBhcmF0b3IgPSBzZXBhcmF0ZUxvZ3MoKTsKKyAgICAgICAgcmVtb3ZlU3RhY2tzSW5XaW5kb3dpbmdNb2RlcyhXSU5ET1dJTkdfTU9ERV9QSU5ORUQpOworICAgICAgICB3YWl0Rm9yRXhpdFBpcFRvRnVsbHNjcmVlbihQSVBfQUNUSVZJVFkpOworCisgICAgICAgIC8vIENvbmZpcm0gdGhhdCB3ZSBnZXQgc3RvcCBiZWZvcmUgdGhlIG11bHRpLXdpbmRvdyBhbmQgcGljdHVyZS1pbi1waWN0dXJlIG1vZGUgY2hhbmdlCisgICAgICAgIC8vIGNhbGxiYWNrcworICAgICAgICBmaW5hbCBBY3Rpdml0eUxpZmVjeWNsZUNvdW50cyBsaWZlY3ljbGVDb3VudHMgPSBuZXcgQWN0aXZpdHlMaWZlY3ljbGVDb3VudHMoUElQX0FDVElWSVRZLAorICAgICAgICAgICAgICAgIGxvZ1NlcGFyYXRvcik7CisgICAgICAgIGFzc2VydEVxdWFscygib25TdG9wIiwgMSwgbGlmZWN5Y2xlQ291bnRzLm1TdG9wQ291bnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm9uUGljdHVyZUluUGljdHVyZU1vZGVDaGFuZ2VkIiwgMSwKKyAgICAgICAgICAgICAgICBsaWZlY3ljbGVDb3VudHMubVBpY3R1cmVJblBpY3R1cmVNb2RlQ2hhbmdlZENvdW50KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJvbk11bHRpV2luZG93TW9kZUNoYW5nZWQiLCAxLCBsaWZlY3ljbGVDb3VudHMubU11bHRpV2luZG93TW9kZUNoYW5nZWRDb3VudCk7CisgICAgICAgIGZpbmFsIGludCBsYXN0U3RvcExpbmUgPSBsaWZlY3ljbGVDb3VudHMubUxhc3RTdG9wTGluZUluZGV4OworICAgICAgICBmaW5hbCBpbnQgbGFzdFBpcExpbmUgPSBsaWZlY3ljbGVDb3VudHMubUxhc3RQaWN0dXJlSW5QaWN0dXJlTW9kZUNoYW5nZWRMaW5lSW5kZXg7CisgICAgICAgIGZpbmFsIGludCBsYXN0TXdMaW5lID0gbGlmZWN5Y2xlQ291bnRzLm1MYXN0TXVsdGlXaW5kb3dNb2RlQ2hhbmdlZExpbmVJbmRleDsKKyAgICAgICAgYXNzZXJ0VGhhdCgib25TdG9wIHNob3VsZCBiZSBiZWZvcmUgb25QaWN0dXJlSW5QaWN0dXJlTW9kZUNoYW5nZWQiLAorICAgICAgICAgICAgICAgIGxhc3RTdG9wTGluZSwgbGVzc1RoYW4obGFzdFBpcExpbmUpKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgib25QaWN0dXJlSW5QaWN0dXJlTW9kZUNoYW5nZWQgc2hvdWxkIGJlIGJlZm9yZSBvbk11bHRpV2luZG93TW9kZUNoYW5nZWQiLAorICAgICAgICAgICAgICAgIGxhc3RQaXBMaW5lLCBsZXNzVGhhbihsYXN0TXdMaW5lKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJldmVudFNldEFzcGVjdFJhdGlvV2hpbGVFeHBhbmRpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzdW1lVHJ1ZShzdXBwb3J0c1BpcCgpKTsKKworICAgICAgICAvLyBMYXVuY2ggdGhlIFBpUCBhY3Rpdml0eQorICAgICAgICBsYXVuY2hBY3Rpdml0eShQSVBfQUNUSVZJVFksIEVYVFJBX0VOVEVSX1BJUCwgInRydWUiKTsKKyAgICAgICAgd2FpdEZvckVudGVyUGlwKFBJUF9BQ1RJVklUWSk7CisKKyAgICAgICAgLy8gVHJpZ2dlciBpdCB0byBnbyBiYWNrIHRvIGZ1bGxzY3JlZW4gYW5kIHRyeSB0byBzZXQgdGhlIGFzcGVjdCByYXRpbywgYW5kIGVuc3VyZSB0aGF0IHRoZQorICAgICAgICAvLyBjYWxsIHRvIHNldCB0aGUgYXNwZWN0IHJhdGlvIGRpZCBub3QgcHJldmVudCB0aGUgUGlQIGZyb20gcmV0dXJuaW5nIHRvIGZ1bGxzY3JlZW4KKyAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZCgiYW0gYnJvYWRjYXN0IC1hICIgKyBBQ1RJT05fRVhQQU5EX1BJUAorICAgICAgICAgICAgICAgICsgIiAtZSAiICsgRVhUUkFfU0VUX0FTUEVDVF9SQVRJT19XSVRIX0RFTEFZX05VTUVSQVRPUiArICIgMTIzNDU2Nzg5IgorICAgICAgICAgICAgICAgICsgIiAtZSAiICsgRVhUUkFfU0VUX0FTUEVDVF9SQVRJT19XSVRIX0RFTEFZX0RFTk9NSU5BVE9SICsgIiAxMDAwMDAwMDAiKTsKKyAgICAgICAgd2FpdEZvckV4aXRQaXBUb0Z1bGxzY3JlZW4oUElQX0FDVElWSVRZKTsKKyAgICAgICAgYXNzZXJ0UGlubmVkU3RhY2tEb2VzTm90RXhpc3QoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRSZXF1ZXN0ZWRPcmllbnRhdGlvbldoaWxlUGlubmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc3VtZVRydWUoc3VwcG9ydHNQaXAoKSk7CisKKyAgICAgICAgLy8gTGF1bmNoIHRoZSBQaVAgYWN0aXZpdHkgZml4ZWQgYXMgcG9ydHJhaXQsIGFuZCBlbnRlciBwaWN0dXJlLWluLXBpY3R1cmUKKyAgICAgICAgbGF1bmNoQWN0aXZpdHkoUElQX0FDVElWSVRZLAorICAgICAgICAgICAgICAgIEVYVFJBX1BJUF9PUklFTlRBVElPTiwgU3RyaW5nLnZhbHVlT2YoT1JJRU5UQVRJT05fUE9SVFJBSVQpLAorICAgICAgICAgICAgICAgIEVYVFJBX0VOVEVSX1BJUCwgInRydWUiKTsKKyAgICAgICAgd2FpdEZvckVudGVyUGlwKFBJUF9BQ1RJVklUWSk7CisgICAgICAgIGFzc2VydFBpbm5lZFN0YWNrRXhpc3RzKCk7CisKKyAgICAgICAgLy8gUmVxdWVzdCB0aGF0IHRoZSBvcmllbnRhdGlvbiBpcyBzZXQgdG8gbGFuZHNjYXBlCisgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoImFtIGJyb2FkY2FzdCAtYSAiCisgICAgICAgICAgICAgICAgKyBBQ1RJT05fU0VUX1JFUVVFU1RFRF9PUklFTlRBVElPTiArICIgLWUgIgorICAgICAgICAgICAgICAgICsgRVhUUkFfUElQX09SSUVOVEFUSU9OICsgIiAiCisgICAgICAgICAgICAgICAgKyBTdHJpbmcudmFsdWVPZihPUklFTlRBVElPTl9MQU5EU0NBUEUpKTsKKworICAgICAgICAvLyBMYXVuY2ggdGhlIGFjdGl2aXR5IGJhY2sgaW50byBmdWxsc2NyZWVuIGFuZCBlbnN1cmUgdGhhdCBpdCBpcyBub3cgaW4gbGFuZHNjYXBlCisgICAgICAgIGxhdW5jaEFjdGl2aXR5KFBJUF9BQ1RJVklUWSk7CisgICAgICAgIHdhaXRGb3JFeGl0UGlwVG9GdWxsc2NyZWVuKFBJUF9BQ1RJVklUWSk7CisgICAgICAgIGFzc2VydFBpbm5lZFN0YWNrRG9lc05vdEV4aXN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhPUklFTlRBVElPTl9MQU5EU0NBUEUsIG1BbVdtU3RhdGUuZ2V0V21TdGF0ZSgpLmdldExhc3RPcmllbnRhdGlvbigpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXaW5kb3dCdXR0b25FbnRlcnNQaXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzdW1lVHJ1ZShzdXBwb3J0c1BpcCgpKTsKKyAgICAgICAgYXNzdW1lVHJ1ZSghbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuaXNIb21lUmVjZW50c0NvbXBvbmVudCgpKTsKKworICAgICAgICAvLyBMYXVuY2ggdGhlIFBpUCBhY3Rpdml0eSB0cmlnZ2VyIHRoZSB3aW5kb3cgYnV0dG9uLCBlbnN1cmUgdGhhdCB3ZSBoYXZlIGVudGVyZWQgUGlQCisgICAgICAgIGxhdW5jaEFjdGl2aXR5KFBJUF9BQ1RJVklUWSk7CisgICAgICAgIHByZXNzV2luZG93QnV0dG9uKCk7CisgICAgICAgIHdhaXRGb3JFbnRlclBpcChQSVBfQUNUSVZJVFkpOworICAgICAgICBhc3NlcnRQaW5uZWRTdGFja0V4aXN0cygpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZpbmlzaFBpcEFjdGl2aXR5V2l0aFRhc2tPdmVybGF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc3VtZVRydWUoc3VwcG9ydHNQaXAoKSk7CisKKyAgICAgICAgLy8gTGF1bmNoIFBpUCBhY3Rpdml0eQorICAgICAgICBsYXVuY2hBY3Rpdml0eShQSVBfQUNUSVZJVFksIEVYVFJBX0VOVEVSX1BJUCwgInRydWUiKTsKKyAgICAgICAgd2FpdEZvckVudGVyUGlwKFBJUF9BQ1RJVklUWSk7CisgICAgICAgIGFzc2VydFBpbm5lZFN0YWNrRXhpc3RzKCk7CisgICAgICAgIGludCB0YXNrSWQgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFuZGFyZFN0YWNrQnlXaW5kb3dpbmdNb2RlKAorICAgICAgICAgICAgICAgIFdJTkRPV0lOR19NT0RFX1BJTk5FRCkuZ2V0VG9wVGFzaygpLm1UYXNrSWQ7CisKKyAgICAgICAgLy8gRW5zdXJlIHRoYXQgd2UgZG9uJ3QgYW55IGFueSBvdGhlciBvdmVybGF5cyBhcyBhIHJlc3VsdCBvZiBsYXVuY2hpbmcgaW50byBQSVAKKyAgICAgICAgbGF1bmNoSG9tZUFjdGl2aXR5KCk7CisKKyAgICAgICAgLy8gTGF1bmNoIHRhc2sgb3ZlcmxheSBhY3Rpdml0eSBpbnRvIFBpUCBhY3Rpdml0eSB0YXNrCisgICAgICAgIGxhdW5jaFBpbm5lZEFjdGl2aXR5QXNUYXNrT3ZlcmxheShUUkFOU0xVQ0VOVF9URVNUX0FDVElWSVRZLCB0YXNrSWQpOworCisgICAgICAgIC8vIEZpbmlzaCB0aGUgUGlQIGFjdGl2aXR5IGFuZCBlbnN1cmUgdGhhdCB0aGVyZSBpcyBubyBwaW5uZWQgc3RhY2sKKyAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZCgiYW0gYnJvYWRjYXN0IC1hICIgKyBBQ1RJT05fRklOSVNIKTsKKyAgICAgICAgd2FpdEZvclBpbm5lZFN0YWNrUmVtb3ZlZCgpOworICAgICAgICBhc3NlcnRQaW5uZWRTdGFja0RvZXNOb3RFeGlzdCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vUmVzdW1lQWZ0ZXJUYXNrT3ZlcmxheUZpbmlzaGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc3VtZVRydWUoc3VwcG9ydHNQaXAoKSk7CisKKyAgICAgICAgLy8gTGF1bmNoIFBpUCBhY3Rpdml0eQorICAgICAgICBsYXVuY2hBY3Rpdml0eShQSVBfQUNUSVZJVFksIEVYVFJBX0VOVEVSX1BJUCwgInRydWUiKTsKKyAgICAgICAgd2FpdEZvckVudGVyUGlwKFBJUF9BQ1RJVklUWSk7CisgICAgICAgIGFzc2VydFBpbm5lZFN0YWNrRXhpc3RzKCk7CisgICAgICAgIEFjdGl2aXR5U3RhY2sgc3RhY2sgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFuZGFyZFN0YWNrQnlXaW5kb3dpbmdNb2RlKAorICAgICAgICAgICAgICAgIFdJTkRPV0lOR19NT0RFX1BJTk5FRCk7CisgICAgICAgIGludCBzdGFja0lkID0gc3RhY2subVN0YWNrSWQ7CisgICAgICAgIGludCB0YXNrSWQgPSBzdGFjay5nZXRUb3BUYXNrKCkubVRhc2tJZDsKKworICAgICAgICAvLyBMYXVuY2ggdGFzayBvdmVybGF5IGFjdGl2aXR5IGludG8gUGlQIGFjdGl2aXR5IHRhc2sKKyAgICAgICAgbGF1bmNoUGlubmVkQWN0aXZpdHlBc1Rhc2tPdmVybGF5KFRSQU5TTFVDRU5UX1RFU1RfQUNUSVZJVFksIHRhc2tJZCk7CisKKyAgICAgICAgLy8gRmluaXNoIHRoZSB0YXNrIG92ZXJsYXkgYWN0aXZpdHkgd2hpbGUgYW5pbWF0aW5nIGFuZCBlbnN1cmUgdGhhdCB0aGUgUGlQIGFjdGl2aXR5IG5ldmVyCisgICAgICAgIC8vIGdvdCByZXN1bWVkCisgICAgICAgIExvZ1NlcGFyYXRvciBsb2dTZXBhcmF0b3IgPSBzZXBhcmF0ZUxvZ3MoKTsKKyAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZCgiYW0gc3RhY2sgcmVzaXplLWFuaW1hdGVkICIgKyBzdGFja0lkICsgIiAyMCAyMCA1MDAgNTAwIik7CisgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoImFtIGJyb2FkY2FzdCAtYSAiICsgVEVTVF9BQ1RJVklUWV9BQ1RJT05fRklOSVNIX1NFTEYpOworICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3IoKGFtU3RhdGUsIHdtU3RhdGUpIC0+CisgICAgICAgICAgICAgICAgICAgICAgICAhYW1TdGF0ZS5jb250YWluc0FjdGl2aXR5KFRSQU5TTFVDRU5UX1RFU1RfQUNUSVZJVFkpLAorICAgICAgICAgICAgICAgICJXYWl0aW5nIGZvciB0ZXN0IGFjdGl2aXR5IHRvIGZpbmlzaC4uLiIpOworICAgICAgICBmaW5hbCBBY3Rpdml0eUxpZmVjeWNsZUNvdW50cyBsaWZlY3ljbGVDb3VudHMgPSBuZXcgQWN0aXZpdHlMaWZlY3ljbGVDb3VudHMoUElQX0FDVElWSVRZLAorICAgICAgICAgICAgICAgIGxvZ1NlcGFyYXRvcik7CisgICAgICAgIGFzc2VydEVxdWFscygib25SZXN1bWUiLCAwLCBsaWZlY3ljbGVDb3VudHMubVJlc3VtZUNvdW50KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJvblBhdXNlIiwgMCwgbGlmZWN5Y2xlQ291bnRzLm1QYXVzZUNvdW50KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQaW5uZWRTdGFja1dpdGhEb2NrZWRTdGFjaygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3N1bWVUcnVlKHN1cHBvcnRzUGlwKCkpOworICAgICAgICBhc3N1bWVUcnVlKHN1cHBvcnRzU3BsaXRTY3JlZW5NdWx0aVdpbmRvdygpKTsKKworICAgICAgICBsYXVuY2hBY3Rpdml0eShQSVBfQUNUSVZJVFksIEVYVFJBX0VOVEVSX1BJUCwgInRydWUiKTsKKyAgICAgICAgd2FpdEZvckVudGVyUGlwKFBJUF9BQ1RJVklUWSk7CisgICAgICAgIGxhdW5jaEFjdGl2aXRpZXNJblNwbGl0U2NyZWVuKAorICAgICAgICAgICAgICAgIGdldExhdW5jaEFjdGl2aXR5QnVpbGRlcigpLnNldFRhcmdldEFjdGl2aXR5KExBVU5DSElOR19BQ1RJVklUWSksCisgICAgICAgICAgICAgICAgZ2V0TGF1bmNoQWN0aXZpdHlCdWlsZGVyKCkuc2V0VGFyZ2V0QWN0aXZpdHkoVEVTVF9BQ1RJVklUWSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRSYW5kb21EYXRhKHRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0TXVsdGlwbGVUYXNrKGZhbHNlKQorICAgICAgICApOworICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoUElQX0FDVElWSVRZLCB0cnVlKTsKKyAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KExBVU5DSElOR19BQ1RJVklUWSwgdHJ1ZSk7CisgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShURVNUX0FDVElWSVRZLCB0cnVlKTsKKworICAgICAgICAvLyBMYXVuY2ggdGhlIGFjdGl2aXRpZXMgYWdhaW4gdG8gdGFrZSBmb2N1cyBhbmQgbWFrZSBzdXJlIG5vdGhpbmcgaXMgaGlkZGVuCisgICAgICAgIGxhdW5jaEFjdGl2aXRpZXNJblNwbGl0U2NyZWVuKAorICAgICAgICAgICAgICAgIGdldExhdW5jaEFjdGl2aXR5QnVpbGRlcigpLnNldFRhcmdldEFjdGl2aXR5KExBVU5DSElOR19BQ1RJVklUWSksCisgICAgICAgICAgICAgICAgZ2V0TGF1bmNoQWN0aXZpdHlCdWlsZGVyKCkuc2V0VGFyZ2V0QWN0aXZpdHkoVEVTVF9BQ1RJVklUWSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRSYW5kb21EYXRhKHRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0TXVsdGlwbGVUYXNrKGZhbHNlKQorICAgICAgICApOworICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoTEFVTkNISU5HX0FDVElWSVRZLCB0cnVlKTsKKyAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFRFU1RfQUNUSVZJVFksIHRydWUpOworCisgICAgICAgIC8vIEdvIHRvIHJlY2VudHMgdG8gbWFrZSBzdXJlIHRoYXQgZnVsbHNjcmVlbiBzdGFjayBpcyBpbnZpc2libGUKKyAgICAgICAgLy8gU29tZSBkZXZpY2VzIGRvIG5vdCBzdXBwb3J0IHJlY2VudHMgb3IgaW1wbGVtZW50IGl0IGRpZmZlcmVudGx5IChpbnN0ZWFkIG9mIHVzaW5nIGEKKyAgICAgICAgLy8gc2VwYXJhdGUgc3RhY2sgaWQgb3IgYXMgYW4gYWN0aXZpdHkpLCBmb3IgdGhvc2UgY2FzZXMgdGhlIHZpc2liaWxpdHkgYXNzZXJ0cyB3aWxsIGJlCisgICAgICAgIC8vIGlnbm9yZWQKKyAgICAgICAgcHJlc3NBcHBTd2l0Y2hCdXR0b25BbmRXYWl0Rm9yUmVjZW50cygpOworICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoTEFVTkNISU5HX0FDVElWSVRZLCB0cnVlKTsKKyAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFRFU1RfQUNUSVZJVFksIGZhbHNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMYXVuY2hUYXNrQnlDb21wb25lbnRNYXRjaE11bHRpcGxlVGFza3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzdW1lVHJ1ZShzdXBwb3J0c1BpcCgpKTsKKworICAgICAgICAvLyBMYXVuY2ggYSBmdWxsc2NyZWVuIGFjdGl2aXR5IHdoaWNoIHdpbGwgbGF1bmNoIGEgUGlQIGFjdGl2aXR5IGluIGEgbmV3IHRhc2sgd2l0aCB0aGUgc2FtZQorICAgICAgICAvLyBhZmZpbml0eQorICAgICAgICBsYXVuY2hBY3Rpdml0eShURVNUX0FDVElWSVRZX1dJVEhfU0FNRV9BRkZJTklUWSk7CisgICAgICAgIGxhdW5jaEFjdGl2aXR5KFBJUF9BQ1RJVklUWV9XSVRIX1NBTUVfQUZGSU5JVFkpOworICAgICAgICBhc3NlcnRQaW5uZWRTdGFja0V4aXN0cygpOworCisgICAgICAgIC8vIExhdW5jaCB0aGUgcm9vdCBhY3Rpdml0eSBhZ2Fpbi4uLgorICAgICAgICBpbnQgcm9vdEFjdGl2aXR5VGFza0lkID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0VGFza0J5QWN0aXZpdHkoCisgICAgICAgICAgICAgICAgVEVTVF9BQ1RJVklUWV9XSVRIX1NBTUVfQUZGSU5JVFkpLm1UYXNrSWQ7CisgICAgICAgIGxhdW5jaEhvbWVBY3Rpdml0eSgpOworICAgICAgICBsYXVuY2hBY3Rpdml0eShURVNUX0FDVElWSVRZX1dJVEhfU0FNRV9BRkZJTklUWSk7CisKKyAgICAgICAgLy8gLi4uYW5kIGVuc3VyZSB0aGF0IHRoZSByb290IGFjdGl2aXR5IHRhc2sgaXMgZm91bmQgYW5kIHJldXNlZCwgYW5kIHRoYXQgdGhlIHBpbm5lZCBzdGFjaworICAgICAgICAvLyBpcyB1bmFmZmVjdGVkCisgICAgICAgIGFzc2VydFBpbm5lZFN0YWNrRXhpc3RzKCk7CisgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZEFjdGl2aXR5KCJFeHBlY3RlZCByb290IGFjdGl2aXR5IGZvY3VzZWQiLAorICAgICAgICAgICAgICAgIFRFU1RfQUNUSVZJVFlfV0lUSF9TQU1FX0FGRklOSVRZKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJvb3RBY3Rpdml0eVRhc2tJZCwgbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0VGFza0J5QWN0aXZpdHkoCisgICAgICAgICAgICAgICAgVEVTVF9BQ1RJVklUWV9XSVRIX1NBTUVfQUZGSU5JVFkpLm1UYXNrSWQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExhdW5jaFRhc2tCeUFmZmluaXR5TWF0Y2hNdWx0aXBsZVRhc2tzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc3VtZVRydWUoc3VwcG9ydHNQaXAoKSk7CisKKyAgICAgICAgLy8gTGF1bmNoIGEgZnVsbHNjcmVlbiBhY3Rpdml0eSB3aGljaCB3aWxsIGxhdW5jaCBhIFBpUCBhY3Rpdml0eSBpbiBhIG5ldyB0YXNrIHdpdGggdGhlIHNhbWUKKyAgICAgICAgLy8gYWZmaW5pdHksIGFuZCBhbHNvIGxhdW5jaCBhbm90aGVyIGFjdGl2aXR5IGluIHRoZSBzYW1lIHRhc2ssIHdoaWxlIGZpbmlzaGluZyBpdHNlbGYuIEFzCisgICAgICAgIC8vIGEgcmVzdWx0LCB0aGUgdGFzayB3aWxsIG5vdCBoYXZlIGEgY29tcG9uZW50IG1hdGNoaW5nIHRoZSBzYW1lIGFjdGl2aXR5IGFzIHdoYXQgaXQgd2FzCisgICAgICAgIC8vIHN0YXJ0ZWQgd2l0aAorICAgICAgICBsYXVuY2hBY3Rpdml0eShURVNUX0FDVElWSVRZX1dJVEhfU0FNRV9BRkZJTklUWSwKKyAgICAgICAgICAgICAgICBFWFRSQV9TVEFSVF9BQ1RJVklUWSwgZ2V0QWN0aXZpdHlOYW1lKFRFU1RfQUNUSVZJVFkpLAorICAgICAgICAgICAgICAgIEVYVFJBX0ZJTklTSF9TRUxGX09OX1JFU1VNRSwgInRydWUiKTsKKyAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yVmFsaWRTdGF0ZShuZXcgV2FpdEZvclZhbGlkQWN0aXZpdHlTdGF0ZS5CdWlsZGVyKFRFU1RfQUNUSVZJVFkpCisgICAgICAgICAgICAgICAgLnNldFdpbmRvd2luZ01vZGUoV0lORE9XSU5HX01PREVfRlVMTFNDUkVFTikKKyAgICAgICAgICAgICAgICAuc2V0QWN0aXZpdHlUeXBlKEFDVElWSVRZX1RZUEVfU1RBTkRBUkQpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICBsYXVuY2hBY3Rpdml0eShQSVBfQUNUSVZJVFlfV0lUSF9TQU1FX0FGRklOSVRZKTsKKyAgICAgICAgd2FpdEZvckVudGVyUGlwKFBJUF9BQ1RJVklUWV9XSVRIX1NBTUVfQUZGSU5JVFkpOworICAgICAgICBhc3NlcnRQaW5uZWRTdGFja0V4aXN0cygpOworCisgICAgICAgIC8vIExhdW5jaCB0aGUgcm9vdCBhY3Rpdml0eSBhZ2Fpbi4uLgorICAgICAgICBpbnQgcm9vdEFjdGl2aXR5VGFza0lkID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0VGFza0J5QWN0aXZpdHkoCisgICAgICAgICAgICAgICAgVEVTVF9BQ1RJVklUWSkubVRhc2tJZDsKKyAgICAgICAgbGF1bmNoSG9tZUFjdGl2aXR5KCk7CisgICAgICAgIGxhdW5jaEFjdGl2aXR5KFRFU1RfQUNUSVZJVFlfV0lUSF9TQU1FX0FGRklOSVRZKTsKKworICAgICAgICAvLyAuLi5hbmQgZW5zdXJlIHRoYXQgZXZlbiB3aGlsZSBtYXRjaGluZyBwdXJlbHkgYnkgdGFzayBhZmZpbml0eSwgdGhlIHJvb3QgYWN0aXZpdHkgdGFzayBpcworICAgICAgICAvLyBmb3VuZCBhbmQgcmV1c2VkLCBhbmQgdGhhdCB0aGUgcGlubmVkIHN0YWNrIGlzIHVuYWZmZWN0ZWQKKyAgICAgICAgYXNzZXJ0UGlubmVkU3RhY2tFeGlzdHMoKTsKKyAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkQWN0aXZpdHkoIkV4cGVjdGVkIHJvb3QgYWN0aXZpdHkgZm9jdXNlZCIsIFRFU1RfQUNUSVZJVFkpOworICAgICAgICBhc3NlcnRFcXVhbHMocm9vdEFjdGl2aXR5VGFza0lkLCBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRUYXNrQnlBY3Rpdml0eSgKKyAgICAgICAgICAgICAgICBURVNUX0FDVElWSVRZKS5tVGFza0lkKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMYXVuY2hUYXNrQnlBZmZpbml0eU1hdGNoU2luZ2xlVGFzaygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3N1bWVUcnVlKHN1cHBvcnRzUGlwKCkpOworCisgICAgICAgIC8vIExhdW5jaCBhbiBhY3Rpdml0eSBpbnRvIHRoZSBwaW5uZWQgc3RhY2sgd2l0aCBhIGZpeGVkIGFmZmluaXR5CisgICAgICAgIGxhdW5jaEFjdGl2aXR5KFRFU1RfQUNUSVZJVFlfV0lUSF9TQU1FX0FGRklOSVRZLAorICAgICAgICAgICAgICAgIEVYVFJBX0VOVEVSX1BJUCwgInRydWUiLAorICAgICAgICAgICAgICAgIEVYVFJBX1NUQVJUX0FDVElWSVRZLCBnZXRBY3Rpdml0eU5hbWUoUElQX0FDVElWSVRZKSwKKyAgICAgICAgICAgICAgICBFWFRSQV9GSU5JU0hfU0VMRl9PTl9SRVNVTUUsICJ0cnVlIik7CisgICAgICAgIHdhaXRGb3JFbnRlclBpcChURVNUX0FDVElWSVRZX1dJVEhfU0FNRV9BRkZJTklUWSk7CisgICAgICAgIGFzc2VydFBpbm5lZFN0YWNrRXhpc3RzKCk7CisKKyAgICAgICAgLy8gTGF1bmNoIHRoZSByb290IGFjdGl2aXR5IGFnYWluLCBvZiB0aGUgbWF0Y2hpbmcgdGFzayBhbmQgZW5zdXJlIHRoYXQgd2UgZXhwYW5kIHRvCisgICAgICAgIC8vIGZ1bGxzY3JlZW4KKyAgICAgICAgaW50IGFjdGl2aXR5VGFza0lkID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0VGFza0J5QWN0aXZpdHkoUElQX0FDVElWSVRZKS5tVGFza0lkOworICAgICAgICBsYXVuY2hIb21lQWN0aXZpdHkoKTsKKyAgICAgICAgbGF1bmNoQWN0aXZpdHkoVEVTVF9BQ1RJVklUWV9XSVRIX1NBTUVfQUZGSU5JVFkpOworICAgICAgICB3YWl0Rm9yRXhpdFBpcFRvRnVsbHNjcmVlbihURVNUX0FDVElWSVRZX1dJVEhfU0FNRV9BRkZJTklUWSk7CisgICAgICAgIGFzc2VydFBpbm5lZFN0YWNrRG9lc05vdEV4aXN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhhY3Rpdml0eVRhc2tJZCwgbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0VGFza0J5QWN0aXZpdHkoCisgICAgICAgICAgICAgICAgUElQX0FDVElWSVRZKS5tVGFza0lkKTsKKyAgICB9CisKKyAgICAvKiogVGVzdCB0aGF0IHJlcG9ydGVkIGRpc3BsYXkgc2l6ZSBjb3JyZXNwb25kcyB0byBmdWxsc2NyZWVuIGFmdGVyIGV4aXRpbmcgUGlQLiAqLworICAgIEBGbGFreVRlc3QKKyAgICBAUHJlc3VibWl0CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzcGxheU1ldHJpY3NQaW5VbnBpbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3N1bWVUcnVlKHN1cHBvcnRzUGlwKCkpOworCisgICAgICAgIExvZ1NlcGFyYXRvciBsb2dTZXBhcmF0b3IgPSBzZXBhcmF0ZUxvZ3MoKTsKKyAgICAgICAgbGF1bmNoQWN0aXZpdHkoVEVTVF9BQ1RJVklUWSk7CisgICAgICAgIGZpbmFsIGludCBkZWZhdWx0V2luZG93aW5nTW9kZSA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpCisgICAgICAgICAgICAgICAgLmdldFRhc2tCeUFjdGl2aXR5KFRFU1RfQUNUSVZJVFkpLmdldFdpbmRvd2luZ01vZGUoKTsKKyAgICAgICAgZmluYWwgUmVwb3J0ZWRTaXplcyBpbml0aWFsU2l6ZXMgPSBnZXRMYXN0UmVwb3J0ZWRTaXplc0ZvckFjdGl2aXR5KFRFU1RfQUNUSVZJVFksCisgICAgICAgICAgICAgICAgbG9nU2VwYXJhdG9yKTsKKyAgICAgICAgZmluYWwgUmVjdCBpbml0aWFsQXBwQm91bmRzID0gcmVhZEFwcEJvdW5kcyhURVNUX0FDVElWSVRZLCBsb2dTZXBhcmF0b3IpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJNdXN0IHJlcG9ydCBkaXNwbGF5IGRpbWVuc2lvbnMiLCBpbml0aWFsU2l6ZXMpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJNdXN0IHJlcG9ydCBhcHAgYm91bmRzIiwgaW5pdGlhbEFwcEJvdW5kcyk7CisKKyAgICAgICAgbG9nU2VwYXJhdG9yID0gc2VwYXJhdGVMb2dzKCk7CisgICAgICAgIGxhdW5jaEFjdGl2aXR5KFBJUF9BQ1RJVklUWSwgRVhUUkFfRU5URVJfUElQLCAidHJ1ZSIpOworICAgICAgICAvLyBXYWl0IGZvciBhbmltYXRpb24gY29tcGxldGUgc2luY2Ugd2UgYXJlIGNvbXBhcmluZyBib3VuZHMKKyAgICAgICAgd2FpdEZvckVudGVyUGlwQW5pbWF0aW9uQ29tcGxldGUoUElQX0FDVElWSVRZKTsKKyAgICAgICAgZmluYWwgUmVwb3J0ZWRTaXplcyBwaW5uZWRTaXplcyA9IGdldExhc3RSZXBvcnRlZFNpemVzRm9yQWN0aXZpdHkoUElQX0FDVElWSVRZLAorICAgICAgICAgICAgICAgIGxvZ1NlcGFyYXRvcik7CisgICAgICAgIGZpbmFsIFJlY3QgcGlubmVkQXBwQm91bmRzID0gcmVhZEFwcEJvdW5kcyhQSVBfQUNUSVZJVFksIGxvZ1NlcGFyYXRvcik7CisgICAgICAgIGFzc2VydE5vdEVxdWFscygiUmVwb3J0ZWQgZGlzcGxheSBzaXplIHdoZW4gcGlubmVkIG11c3QgYmUgZGlmZmVyZW50IGZyb20gZGVmYXVsdCIsCisgICAgICAgICAgICAgICAgaW5pdGlhbFNpemVzLCBwaW5uZWRTaXplcyk7CisgICAgICAgIGZpbmFsIFNpemUgaW5pdGlhbEFwcFNpemUgPSBuZXcgU2l6ZShpbml0aWFsQXBwQm91bmRzLndpZHRoKCksIGluaXRpYWxBcHBCb3VuZHMuaGVpZ2h0KCkpOworICAgICAgICBmaW5hbCBTaXplIHBpbm5lZEFwcFNpemUgPSBuZXcgU2l6ZShwaW5uZWRBcHBCb3VuZHMud2lkdGgoKSwgcGlubmVkQXBwQm91bmRzLmhlaWdodCgpKTsKKyAgICAgICAgYXNzZXJ0Tm90RXF1YWxzKCJSZXBvcnRlZCBhcHAgc2l6ZSB3aGVuIHBpbm5lZCBtdXN0IGJlIGRpZmZlcmVudCBmcm9tIGRlZmF1bHQiLAorICAgICAgICAgICAgICAgIGluaXRpYWxBcHBTaXplLCBwaW5uZWRBcHBTaXplKTsKKworICAgICAgICBsb2dTZXBhcmF0b3IgPSBzZXBhcmF0ZUxvZ3MoKTsKKyAgICAgICAgbGF1bmNoQWN0aXZpdHkoUElQX0FDVElWSVRZLCBkZWZhdWx0V2luZG93aW5nTW9kZSk7CisgICAgICAgIGZpbmFsIFJlcG9ydGVkU2l6ZXMgZmluYWxTaXplcyA9IGdldExhc3RSZXBvcnRlZFNpemVzRm9yQWN0aXZpdHkoUElQX0FDVElWSVRZLAorICAgICAgICAgICAgICAgIGxvZ1NlcGFyYXRvcik7CisgICAgICAgIGZpbmFsIFJlY3QgZmluYWxBcHBCb3VuZHMgPSByZWFkQXBwQm91bmRzKFBJUF9BQ1RJVklUWSwgbG9nU2VwYXJhdG9yKTsKKyAgICAgICAgZmluYWwgU2l6ZSBmaW5hbEFwcFNpemUgPSBuZXcgU2l6ZShmaW5hbEFwcEJvdW5kcy53aWR0aCgpLCBmaW5hbEFwcEJvdW5kcy5oZWlnaHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiTXVzdCByZXBvcnQgZGVmYXVsdCBzaXplIGFmdGVyIGV4aXRpbmcgUGlQIiwgaW5pdGlhbFNpemVzLCBmaW5hbFNpemVzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJNdXN0IHJlcG9ydCBkZWZhdWx0IGFwcCBzaXplIGFmdGVyIGV4aXRpbmcgUGlQIiwgaW5pdGlhbEFwcFNpemUsCisgICAgICAgICAgICAgICAgZmluYWxBcHBTaXplKTsKKyAgICB9CisKKyAgICBAUHJlc3VibWl0CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW50ZXJQaWN0dXJlSW5QaWN0dXJlU2F2ZVBvc2l0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc3VtZVRydWUoc3VwcG9ydHNQaXAoKSk7CisKKyAgICAgICAgLy8gRW5zdXJlIHdlIGhhdmUgc3RhdGljIHNoZWxmIG9mZnNldCBieSBydW5uaW5nIHRoaXMgdGVzdCBvdmVyIGEgbm9uLWhvbWUgYWN0aXZpdHkKKyAgICAgICAgbGF1bmNoQWN0aXZpdHkoTk9fUkVMQVVOQ0hfQUNUSVZJVFkpOworICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JBY3Rpdml0eVN0YXRlKG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEhvbWVBY3Rpdml0eU5hbWUoKSwKKyAgICAgICAgICAgICAgICBTVEFURV9TVE9QUEVEKTsKKworICAgICAgICAvLyBMYXVuY2ggUGlQIGFjdGl2aXR5IHdpdGggYXV0by1lbnRlciBQaVAsIHNhdmUgdGhlIGRlZmF1bHQgcG9zaXRpb24gb2YgdGhlIFBpUAorICAgICAgICAvLyAod2hpbGUgdGhlIFBpUCBpcyBzdGlsbCBhbmltYXRpbmcgc2xlZXApCisgICAgICAgIGxhdW5jaEFjdGl2aXR5KFBJUF9BQ1RJVklUWSwgRVhUUkFfRU5URVJfUElQLCAidHJ1ZSIpOworICAgICAgICAvLyBXYWl0IGZvciBhbmltYXRpb24gY29tcGxldGUgc2luY2Ugd2UgYXJlIGNvbXBhcmluZyBib3VuZHMKKyAgICAgICAgd2FpdEZvckVudGVyUGlwQW5pbWF0aW9uQ29tcGxldGUoUElQX0FDVElWSVRZKTsKKyAgICAgICAgYXNzZXJ0UGlubmVkU3RhY2tFeGlzdHMoKTsKKworICAgICAgICAvLyBNb3ZlIHRoZSBQaVAgdG8gYSBuZXcgcG9zaXRpb24gb24gc2NyZWVuCisgICAgICAgIGZpbmFsIFJlY3QgaW5pdGlhbEJvdW5kcyA9IG5ldyBSZWN0KCk7CisgICAgICAgIGZpbmFsIFJlY3Qgb2Zmc2V0Qm91bmRzID0gbmV3IFJlY3QoKTsKKyAgICAgICAgb2Zmc2V0UGlwV2l0aGluTW92ZW1lbnRCb3VuZHMoMTAwIC8qIG9mZnNldFkgKi8sIGluaXRpYWxCb3VuZHMsIG9mZnNldEJvdW5kcyk7CisKKyAgICAgICAgLy8gRXhwYW5kIHRoZSBQaVAgYmFjayB0byBmdWxsc2NyZWVuIGFuZCBiYWNrIGludG8gUGlQIGFuZCBlbnN1cmUgdGhhdCBpdCBpcyBpbiB0aGUgc2FtZQorICAgICAgICAvLyBwb3NpdGlvbiBhcyBiZWZvcmUgd2UgZXhwYW5kZWQgKGFuZCB0aGF0IHRoZSBkZWZhdWx0IGJvdW5kcyByZWZsZWN0IHRoYXQpCisgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoImFtIGJyb2FkY2FzdCAtYSAiICsgQUNUSU9OX0VYUEFORF9QSVApOworICAgICAgICB3YWl0Rm9yRXhpdFBpcFRvRnVsbHNjcmVlbihQSVBfQUNUSVZJVFkpOworICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKCJhbSBicm9hZGNhc3QgLWEgIiArIEFDVElPTl9FTlRFUl9QSVApOworICAgICAgICB3YWl0Rm9yRW50ZXJQaXBBbmltYXRpb25Db21wbGV0ZShQSVBfQUNUSVZJVFkpOworICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZSh0cnVlKTsKKyAgICAgICAgLy8gRHVlIHRvIHJvdW5kaW5nIGluIGhvdyB3ZSBzYXZlIGFuZCBhcHBseSB0aGUgc25hcCBmcmFjdGlvbiB3ZSBtYXkgYmUgYSBwaXhlbCBvZmYsIHNvIGp1c3QKKyAgICAgICAgLy8gYWNjb3VudCBmb3IgdGhhdCBpbiB0aGlzIGNoZWNrCisgICAgICAgIG9mZnNldEJvdW5kcy5pbnNldCgtMSwgLTEpOworICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCBvZmZzZXRCb3VuZHM9IiArIG9mZnNldEJvdW5kcyArICIgdG8gY29udGFpbiBib3VuZHM9IgorICAgICAgICAgICAgICAgICsgZ2V0UGlubmVkU3RhY2tCb3VuZHMoKSwgb2Zmc2V0Qm91bmRzLmNvbnRhaW5zKGdldFBpbm5lZFN0YWNrQm91bmRzKCkpKTsKKworICAgICAgICAvLyBFeHBhbmQgdGhlIFBpUCwgdGhlbiBsYXVuY2ggYW4gYWN0aXZpdHkgaW4gYSBuZXcgdGFzaywgYW5kIGVuc3VyZSB0aGF0IHRoZSBQaVAgZ29lcyBiYWNrCisgICAgICAgIC8vIHRvIHRoZSBkZWZhdWx0IHBvc2l0aW9uIChhbmQgbm90IHRoZSBzYXZlZCBwb3NpdGlvbikgdGhlIG5leHQgdGltZSBpdCBpcyBsYXVuY2hlZAorICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKCJhbSBicm9hZGNhc3QgLWEgIiArIEFDVElPTl9FWFBBTkRfUElQKTsKKyAgICAgICAgd2FpdEZvckV4aXRQaXBUb0Z1bGxzY3JlZW4oUElQX0FDVElWSVRZKTsKKyAgICAgICAgbGF1bmNoQWN0aXZpdHkoVEVTVF9BQ1RJVklUWSk7CisgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoImFtIGJyb2FkY2FzdCAtYSAiICsgVEVTVF9BQ1RJVklUWV9BQ1RJT05fRklOSVNIX1NFTEYpOworICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JBY3Rpdml0eVN0YXRlKFBJUF9BQ1RJVklUWSwgU1RBVEVfUkVTVU1FRCk7CisgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvckFwcFRyYW5zaXRpb25JZGxlKCk7CisgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoImFtIGJyb2FkY2FzdCAtYSAiICsgQUNUSU9OX0VOVEVSX1BJUCk7CisgICAgICAgIHdhaXRGb3JFbnRlclBpcEFuaW1hdGlvbkNvbXBsZXRlKFBJUF9BQ1RJVklUWSk7CisgICAgICAgIGFzc2VydFBpbm5lZFN0YWNrRXhpc3RzKCk7CisgICAgICAgIGFzc2VydFRydWUoIkV4cGVjdGVkIGluaXRpYWxCb3VuZHM9IiArIGluaXRpYWxCb3VuZHMgKyAiIHRvIGVxdWFsIGJvdW5kcz0iCisgICAgICAgICAgICAgICAgKyBnZXRQaW5uZWRTdGFja0JvdW5kcygpLCBpbml0aWFsQm91bmRzLmVxdWFscyhnZXRQaW5uZWRTdGFja0JvdW5kcygpKSk7CisgICAgfQorCisgICAgQFByZXN1Ym1pdAorICAgIEBUZXN0CisgICAgQEZsYWt5VGVzdChidWdJZCA9IDcxNzkyMzY4KQorICAgIHB1YmxpYyB2b2lkIHRlc3RFbnRlclBpY3R1cmVJblBpY3R1cmVEaXNjYXJkU2F2ZWRQb3NpdGlvbk9uRmluaXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc3VtZVRydWUoc3VwcG9ydHNQaXAoKSk7CisKKyAgICAgICAgLy8gRW5zdXJlIHdlIGhhdmUgc3RhdGljIHNoZWxmIG9mZnNldCBieSBydW5uaW5nIHRoaXMgdGVzdCBvdmVyIGEgbm9uLWhvbWUgYWN0aXZpdHkKKyAgICAgICAgbGF1bmNoQWN0aXZpdHkoTk9fUkVMQVVOQ0hfQUNUSVZJVFkpOworICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JBY3Rpdml0eVN0YXRlKG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEhvbWVBY3Rpdml0eU5hbWUoKSwKKyAgICAgICAgICAgICAgICBTVEFURV9TVE9QUEVEKTsKKworICAgICAgICAvLyBMYXVuY2ggUGlQIGFjdGl2aXR5IHdpdGggYXV0by1lbnRlciBQaVAsIHNhdmUgdGhlIGRlZmF1bHQgcG9zaXRpb24gb2YgdGhlIFBpUAorICAgICAgICAvLyAod2hpbGUgdGhlIFBpUCBpcyBzdGlsbCBhbmltYXRpbmcgc2xlZXApCisgICAgICAgIGxhdW5jaEFjdGl2aXR5KFBJUF9BQ1RJVklUWSwgRVhUUkFfRU5URVJfUElQLCAidHJ1ZSIpOworICAgICAgICAvLyBXYWl0IGZvciBhbmltYXRpb24gY29tcGxldGUgc2luY2Ugd2UgYXJlIGNvbXBhcmluZyBib3VuZHMKKyAgICAgICAgd2FpdEZvckVudGVyUGlwQW5pbWF0aW9uQ29tcGxldGUoUElQX0FDVElWSVRZKTsKKyAgICAgICAgYXNzZXJ0UGlubmVkU3RhY2tFeGlzdHMoKTsKKworICAgICAgICAvLyBNb3ZlIHRoZSBQaVAgdG8gYSBuZXcgcG9zaXRpb24gb24gc2NyZWVuCisgICAgICAgIGZpbmFsIFJlY3QgaW5pdGlhbEJvdW5kcyA9IG5ldyBSZWN0KCk7CisgICAgICAgIGZpbmFsIFJlY3Qgb2Zmc2V0Qm91bmRzID0gbmV3IFJlY3QoKTsKKyAgICAgICAgb2Zmc2V0UGlwV2l0aGluTW92ZW1lbnRCb3VuZHMoMTAwIC8qIG9mZnNldFkgKi8sIGluaXRpYWxCb3VuZHMsIG9mZnNldEJvdW5kcyk7CisKKyAgICAgICAgLy8gRmluaXNoIHRoZSBhY3Rpdml0eQorICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKCJhbSBicm9hZGNhc3QgLWEgIiArIEFDVElPTl9GSU5JU0gpOworICAgICAgICB3YWl0Rm9yUGlubmVkU3RhY2tSZW1vdmVkKCk7CisgICAgICAgIGFzc2VydFBpbm5lZFN0YWNrRG9lc05vdEV4aXN0KCk7CisKKyAgICAgICAgLy8gRW5zdXJlIHRoYXQgc3RhcnRpbmcgdGhlIHNhbWUgUGlQIGFjdGl2aXR5IGFmdGVyIGl0IGZpbmlzaGVkIHdpbGwgZ28gdG8gdGhlIGRlZmF1bHQKKyAgICAgICAgLy8gYm91bmRzCisgICAgICAgIGxhdW5jaEFjdGl2aXR5KFBJUF9BQ1RJVklUWSwgRVhUUkFfRU5URVJfUElQLCAidHJ1ZSIpOworICAgICAgICB3YWl0Rm9yRW50ZXJQaXBBbmltYXRpb25Db21wbGV0ZShQSVBfQUNUSVZJVFkpOworICAgICAgICBhc3NlcnRQaW5uZWRTdGFja0V4aXN0cygpOworICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCBpbml0aWFsQm91bmRzPSIgKyBpbml0aWFsQm91bmRzICsgIiB0byBlcXVhbCBib3VuZHM9IgorICAgICAgICAgICAgICAgICsgZ2V0UGlubmVkU3RhY2tCb3VuZHMoKSwgaW5pdGlhbEJvdW5kcy5lcXVhbHMoZ2V0UGlubmVkU3RhY2tCb3VuZHMoKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE9mZnNldHMgdGhlIFBpUCBpbiBhIGRpcmVjdGlvbiBieSB7QHBhcmFtIG9mZnNldFl9IHN1Y2ggdGhhdCBpdCBpcyBzdGlsbCB3aXRoaW4gdGhlIG1vdmVtZW50CisgICAgICogYm91bmRzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBvZmZzZXRQaXBXaXRoaW5Nb3ZlbWVudEJvdW5kcyhpbnQgb2Zmc2V0WSwgUmVjdCBpbml0aWFsQm91bmRzT3V0LAorICAgICAgICAgICAgUmVjdCBvZmZzZXRCb3VuZHNPdXQpIHsKKyAgICAgICAgZmluYWwgQWN0aXZpdHlTdGFjayBzdGFjayA9IGdldFBpbm5lZFN0YWNrKCk7CisgICAgICAgIGZpbmFsIFJlY3QgZGlzcGxheVJlY3QgPSBtQW1XbVN0YXRlLmdldFdtU3RhdGUoKS5nZXREaXNwbGF5KHN0YWNrLm1EaXNwbGF5SWQpCisgICAgICAgICAgICAgICAgLmdldERpc3BsYXlSZWN0KCk7CisgICAgICAgIGluaXRpYWxCb3VuZHNPdXQuc2V0KGdldFBpbm5lZFN0YWNrQm91bmRzKCkpOworICAgICAgICBvZmZzZXRCb3VuZHNPdXQuc2V0KGluaXRpYWxCb3VuZHNPdXQpOworICAgICAgICBpZiAoaW5pdGlhbEJvdW5kc091dC50b3AgPCBkaXNwbGF5UmVjdC5jZW50ZXJZKCkpIHsKKyAgICAgICAgICAgIC8vIElmIHRoZSBkZWZhdWx0IGdyYXZpdHkgaXMgdG9wLWFsaWduZWQsIG9mZnNldCBkb3duIGluc3RlYWQgb2YgdXAKKyAgICAgICAgICAgIG9mZnNldEJvdW5kc091dC5vZmZzZXQoMCwgb2Zmc2V0WSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvZmZzZXRCb3VuZHNPdXQub2Zmc2V0KDAsIC1vZmZzZXRZKTsKKyAgICAgICAgfQorICAgICAgICByZXNpemVTdGFjayhzdGFjay5tU3RhY2tJZCwgb2Zmc2V0Qm91bmRzT3V0LmxlZnQsIG9mZnNldEJvdW5kc091dC50b3AsCisgICAgICAgICAgICAgICAgb2Zmc2V0Qm91bmRzT3V0LnJpZ2h0LCBvZmZzZXRCb3VuZHNPdXQuYm90dG9tKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHNBcHBCb3VuZHNQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKAorICAgICAgICAgICAgIiguKyltQXBwQm91bmRzPVJlY3RcXCgoXFxkKyksIChcXGQrKSAtIChcXGQrKSwgKFxcZCspXFwpKC4qKSIpOworCisgICAgLyoqIFJlYWQgYXBwIGJvdW5kcyBpbiBsYXN0IGFwcGxpZWQgY29uZmlndXJhdGlvbiBmcm9tIGxvZ3MuICovCisgICAgcHJpdmF0ZSBSZWN0IHJlYWRBcHBCb3VuZHMoQ29tcG9uZW50TmFtZSBhY3Rpdml0eU5hbWUsIExvZ1NlcGFyYXRvciBsb2dTZXBhcmF0b3IpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nW10gbGluZXMgPSBnZXREZXZpY2VMb2dzRm9yQ29tcG9uZW50cyhsb2dTZXBhcmF0b3IsIGdldExvZ1RhZyhhY3Rpdml0eU5hbWUpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IGxpbmVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbGluZSA9IGxpbmVzW2ldLnRyaW0oKTsKKyAgICAgICAgICAgIGZpbmFsIE1hdGNoZXIgbWF0Y2hlciA9IHNBcHBCb3VuZHNQYXR0ZXJuLm1hdGNoZXIobGluZSk7CisgICAgICAgICAgICBpZiAobWF0Y2hlci5tYXRjaGVzKCkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbGVmdCA9IEludGVnZXIucGFyc2VJbnQobWF0Y2hlci5ncm91cCgyKSk7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHRvcCA9IEludGVnZXIucGFyc2VJbnQobWF0Y2hlci5ncm91cCgzKSk7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHJpZ2h0ID0gSW50ZWdlci5wYXJzZUludChtYXRjaGVyLmdyb3VwKDQpKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgYm90dG9tID0gSW50ZWdlci5wYXJzZUludChtYXRjaGVyLmdyb3VwKDUpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlY3QobGVmdCwgdG9wLCByaWdodCAtIGxlZnQsIGJvdHRvbSAtIHRvcCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGFmdGVyIHRoZSBnaXZlbiB7QHBhcmFtIGFjdGl2aXR5TmFtZX0gaGFzIGJlZW4gbW92ZWQgdG8gdGhlIGZ1bGxzY3JlZW4gc3RhY2suIEVuc3VyZXMKKyAgICAgKiB0aGF0IHRoZSBzdGFjayBtYXRjaGluZyB0aGUge0BwYXJhbSB3aW5kb3dpbmdNb2RlfSBhbmQge0BwYXJhbSBhY3Rpdml0eVR5cGV9IGlzIGZvY3VzZWQsIGFuZAorICAgICAqIGNoZWNrcyB0aGUgdG9wIGFuZC9vciBib3R0b20gdGFza3MgaW4gdGhlIGZ1bGxzY3JlZW4gc3RhY2sgaWYKKyAgICAgKiB7QHBhcmFtIGV4cGVjdFRvcFRhc2tIYXNBY3Rpdml0eX0gb3Ige0BwYXJhbSBleHBlY3RCb3R0b21UYXNrSGFzQWN0aXZpdHl9IGFyZSBzZXQKKyAgICAgKiByZXNwZWN0aXZlbHkuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFBpbm5lZFN0YWNrU3RhdGVPbk1vdmVUb0Z1bGxzY3JlZW4oQ29tcG9uZW50TmFtZSBhY3Rpdml0eU5hbWUsCisgICAgICAgICAgICBpbnQgd2luZG93aW5nTW9kZSwgaW50IGFjdGl2aXR5VHlwZSkgeworICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JGb2N1c2VkU3RhY2sod2luZG93aW5nTW9kZSwgYWN0aXZpdHlUeXBlKTsKKyAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkU3RhY2soIldyb25nIGZvY3VzZWQgc3RhY2siLCB3aW5kb3dpbmdNb2RlLCBhY3Rpdml0eVR5cGUpOworICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JBY3Rpdml0eVN0YXRlKGFjdGl2aXR5TmFtZSwgU1RBVEVfU1RPUFBFRCk7CisgICAgICAgIGFzc2VydFRydWUobUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuaGFzQWN0aXZpdHlTdGF0ZShhY3Rpdml0eU5hbWUsIFNUQVRFX1NUT1BQRUQpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5jb250YWluc0FjdGl2aXR5SW5XaW5kb3dpbmdNb2RlKAorICAgICAgICAgICAgICAgIGFjdGl2aXR5TmFtZSwgV0lORE9XSU5HX01PREVfRlVMTFNDUkVFTikpOworICAgICAgICBhc3NlcnRQaW5uZWRTdGFja0RvZXNOb3RFeGlzdCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFzc2VydHMgdGhhdCB0aGUgcGlubmVkIHN0YWNrIGJvdW5kcyBkb2VzIG5vdCBpbnRlcnNlY3Qgd2l0aCB0aGUgSU1FIGJvdW5kcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0UGlubmVkU3RhY2tEb2VzTm90SW50ZXJzZWN0SU1FKCkgeworICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgSU1FIGlzIHZpc2libGUKKyAgICAgICAgV2luZG93TWFuYWdlclN0YXRlIHdtU3RhdGUgPSBtQW1XbVN0YXRlLmdldFdtU3RhdGUoKTsKKyAgICAgICAgd21TdGF0ZS5jb21wdXRlU3RhdGUoKTsKKyAgICAgICAgV2luZG93TWFuYWdlclN0YXRlLldpbmRvd1N0YXRlIGltZVdpblN0YXRlID0gd21TdGF0ZS5nZXRJbnB1dE1ldGhvZFdpbmRvd1N0YXRlKCk7CisgICAgICAgIGFzc2VydFRydWUoaW1lV2luU3RhdGUgIT0gbnVsbCk7CisKKyAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlIFBJUCBtb3ZlbWVudCBpcyBjb25zdHJhaW5lZCBieSB0aGUgZGlzcGxheSBib3VuZHMgaW50ZXJzZWN0aW5nIHRoZQorICAgICAgICAvLyBub24tSU1FIGJvdW5kcworICAgICAgICBSZWN0IGltZUNvbnRlbnRGcmFtZSA9IGltZVdpblN0YXRlLmdldENvbnRlbnRGcmFtZSgpOworICAgICAgICBSZWN0IGltZUNvbnRlbnRJbnNldHMgPSBpbWVXaW5TdGF0ZS5nZXRHaXZlbkNvbnRlbnRJbnNldHMoKTsKKyAgICAgICAgUmVjdCBpbWVCb3VuZHMgPSBuZXcgUmVjdChpbWVDb250ZW50RnJhbWUubGVmdCArIGltZUNvbnRlbnRJbnNldHMubGVmdCwKKyAgICAgICAgICAgICAgICBpbWVDb250ZW50RnJhbWUudG9wICsgaW1lQ29udGVudEluc2V0cy50b3AsCisgICAgICAgICAgICAgICAgaW1lQ29udGVudEZyYW1lLnJpZ2h0IC0gaW1lQ29udGVudEluc2V0cy53aWR0aCgpLAorICAgICAgICAgICAgICAgIGltZUNvbnRlbnRGcmFtZS5ib3R0b20gLSBpbWVDb250ZW50SW5zZXRzLmhlaWdodCgpKTsKKyAgICAgICAgd21TdGF0ZS5jb21wdXRlU3RhdGUoKTsKKyAgICAgICAgUmVjdCBwaXBNb3ZlbWVudEJvdW5kcyA9IHdtU3RhdGUuZ2V0UGlubmVkU3RhY2tNb3ZlbWVudEJvdW5kcygpOworICAgICAgICBhc3NlcnRUcnVlKCFSZWN0LmludGVyc2VjdHMocGlwTW92ZW1lbnRCb3VuZHMsIGltZUJvdW5kcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFzc2VydHMgdGhhdCB0aGUgcGlubmVkIHN0YWNrIGJvdW5kcyBpcyBjb250YWluZWQgaW4gdGhlIGRpc3BsYXkgYm91bmRzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRQaW5uZWRTdGFja0FjdGl2aXR5SXNJbkRpc3BsYXlCb3VuZHMoQ29tcG9uZW50TmFtZSBhY3Rpdml0eU5hbWUpIHsKKyAgICAgICAgZmluYWwgV2luZG93TWFuYWdlclN0YXRlLldpbmRvd1N0YXRlIHdpbmRvd1N0YXRlID0gZ2V0V2luZG93U3RhdGUoYWN0aXZpdHlOYW1lKTsKKyAgICAgICAgZmluYWwgV2luZG93TWFuYWdlclN0YXRlLkRpc3BsYXkgZGlzcGxheSA9IG1BbVdtU3RhdGUuZ2V0V21TdGF0ZSgpLmdldERpc3BsYXkoCisgICAgICAgICAgICAgICAgd2luZG93U3RhdGUuZ2V0RGlzcGxheUlkKCkpOworICAgICAgICBmaW5hbCBSZWN0IGRpc3BsYXlSZWN0ID0gZGlzcGxheS5nZXREaXNwbGF5UmVjdCgpOworICAgICAgICBmaW5hbCBSZWN0IHBpbm5lZFN0YWNrQm91bmRzID0gZ2V0UGlubmVkU3RhY2tCb3VuZHMoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkaXNwbGF5UmVjdC5jb250YWlucyhwaW5uZWRTdGFja0JvdW5kcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFzc2VydHMgdGhhdCB0aGUgcGlubmVkIHN0YWNrIGV4aXN0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0UGlubmVkU3RhY2tFeGlzdHMoKSB7CisgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Q29udGFpbnNTdGFjaygiTXVzdCBjb250YWluIHBpbm5lZCBzdGFjay4iLCBXSU5ET1dJTkdfTU9ERV9QSU5ORUQsCisgICAgICAgICAgICAgICAgQUNUSVZJVFlfVFlQRV9TVEFOREFSRCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNzZXJ0cyB0aGF0IHRoZSBwaW5uZWQgc3RhY2sgZG9lcyBub3QgZXhpc3QuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFBpbm5lZFN0YWNrRG9lc05vdEV4aXN0KCkgeworICAgICAgICBtQW1XbVN0YXRlLmFzc2VydERvZXNOb3RDb250YWluU3RhY2soIk11c3Qgbm90IGNvbnRhaW4gcGlubmVkIHN0YWNrLiIsCisgICAgICAgICAgICAgICAgV0lORE9XSU5HX01PREVfUElOTkVELCBBQ1RJVklUWV9UWVBFX1NUQU5EQVJEKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBc3NlcnRzIHRoYXQgdGhlIHBpbm5lZCBzdGFjayBpcyB0aGUgZnJvbnQgc3RhY2suCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFBpbm5lZFN0YWNrSXNPblRvcCgpIHsKKyAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGcm9udFN0YWNrKCJQaW5uZWQgc3RhY2sgbXVzdCBhbHdheXMgYmUgb24gdG9wLiIsCisgICAgICAgICAgICAgICAgV0lORE9XSU5HX01PREVfUElOTkVELCBBQ1RJVklUWV9UWVBFX1NUQU5EQVJEKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBc3NlcnRzIHRoYXQgdGhlIGFjdGl2aXR5IHJlY2VpdmVkIGV4YWN0bHkgb25lIG9mIGVhY2ggb2YgdGhlIGNhbGxiYWNrcyB3aGVuIGVudGVyaW5nIGFuZAorICAgICAqIGV4aXRpbmcgcGljdHVyZS1pbi1waWN0dXJlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRWYWxpZFBpY3R1cmVJblBpY3R1cmVDYWxsYmFja09yZGVyKAorICAgICAgICAgICAgQ29tcG9uZW50TmFtZSBhY3Rpdml0eU5hbWUsIExvZ1NlcGFyYXRvciBsb2dTZXBhcmF0b3IpIHsKKyAgICAgICAgZmluYWwgQWN0aXZpdHlMaWZlY3ljbGVDb3VudHMgbGlmZWN5Y2xlQ291bnRzID0gbmV3IEFjdGl2aXR5TGlmZWN5Y2xlQ291bnRzKGFjdGl2aXR5TmFtZSwKKyAgICAgICAgICAgICAgICBsb2dTZXBhcmF0b3IpOworCisgICAgICAgIGFzc2VydEVxdWFscyhnZXRBY3Rpdml0eU5hbWUoYWN0aXZpdHlOYW1lKSArICIgb25Db25maWd1cmF0aW9uQ2hhbmdlZCgpIiwKKyAgICAgICAgICAgICAgICAxLCBsaWZlY3ljbGVDb3VudHMubUNvbmZpZ3VyYXRpb25DaGFuZ2VkQ291bnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0QWN0aXZpdHlOYW1lKGFjdGl2aXR5TmFtZSkgKyAiIG9uUGljdHVyZUluUGljdHVyZU1vZGVDaGFuZ2VkKCkiLAorICAgICAgICAgICAgICAgIDEsIGxpZmVjeWNsZUNvdW50cy5tUGljdHVyZUluUGljdHVyZU1vZGVDaGFuZ2VkQ291bnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0QWN0aXZpdHlOYW1lKGFjdGl2aXR5TmFtZSkgKyAiIG9uTXVsdGlXaW5kb3dNb2RlQ2hhbmdlZCIsCisgICAgICAgICAgICAgICAgMSwgbGlmZWN5Y2xlQ291bnRzLm1NdWx0aVdpbmRvd01vZGVDaGFuZ2VkQ291bnQpOworICAgICAgICBpbnQgbGFzdFBpcExpbmUgPSBsaWZlY3ljbGVDb3VudHMubUxhc3RQaWN0dXJlSW5QaWN0dXJlTW9kZUNoYW5nZWRMaW5lSW5kZXg7CisgICAgICAgIGludCBsYXN0TXdMaW5lID0gbGlmZWN5Y2xlQ291bnRzLm1MYXN0TXVsdGlXaW5kb3dNb2RlQ2hhbmdlZExpbmVJbmRleDsKKyAgICAgICAgaW50IGxhc3RDb25maWdMaW5lID0gbGlmZWN5Y2xlQ291bnRzLm1MYXN0Q29uZmlndXJhdGlvbkNoYW5nZWRMaW5lSW5kZXg7CisgICAgICAgIGFzc2VydFRoYXQoIm9uUGljdHVyZUluUGljdHVyZU1vZGVDaGFuZ2VkIHNob3VsZCBiZSBiZWZvcmUgb25NdWx0aVdpbmRvd01vZGVDaGFuZ2VkIiwKKyAgICAgICAgICAgICAgICBsYXN0UGlwTGluZSwgbGVzc1RoYW4obGFzdE13TGluZSkpOworICAgICAgICBhc3NlcnRUaGF0KCJvbk11bHRpV2luZG93TW9kZUNoYW5nZWQgc2hvdWxkIGJlIGJlZm9yZSBvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkIiwKKyAgICAgICAgICAgICAgICBsYXN0TXdMaW5lLCBsZXNzVGhhbihsYXN0Q29uZmlnTGluZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdhaXRzIHVudGlsIHRoZSBnaXZlbiBhY3Rpdml0eSBoYXMgZW50ZXJlZCBwaWN0dXJlLWluLXBpY3R1cmUgbW9kZSAoYWxsb3dpbmcgZm9yIHRoZQorICAgICAqIHN1YnNlcXVlbnQgYW5pbWF0aW9uIHRvIHN0YXJ0KS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgd2FpdEZvckVudGVyUGlwKENvbXBvbmVudE5hbWUgYWN0aXZpdHlOYW1lKSB7CisgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvclZhbGlkU3RhdGUobmV3IFdhaXRGb3JWYWxpZEFjdGl2aXR5U3RhdGUuQnVpbGRlcihhY3Rpdml0eU5hbWUpCisgICAgICAgICAgICAgICAgLnNldFdpbmRvd2luZ01vZGUoV0lORE9XSU5HX01PREVfUElOTkVEKQorICAgICAgICAgICAgICAgIC5zZXRBY3Rpdml0eVR5cGUoQUNUSVZJVFlfVFlQRV9TVEFOREFSRCkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2FpdHMgdW50aWwgdGhlIHBpY3R1cmUtaW4tcGljdHVyZSBhbmltYXRpb24gaGFzIGZpbmlzaGVkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB3YWl0Rm9yRW50ZXJQaXBBbmltYXRpb25Db21wbGV0ZShDb21wb25lbnROYW1lIGFjdGl2aXR5TmFtZSkgeworICAgICAgICB3YWl0Rm9yRW50ZXJQaXAoYWN0aXZpdHlOYW1lKTsKKyAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yKChhbVN0YXRlLCB3bVN0YXRlKSAtPiB7CisgICAgICAgICAgICAgICAgV2luZG93U3RhY2sgc3RhY2sgPSB3bVN0YXRlLmdldFN0YW5kYXJkU3RhY2tCeVdpbmRvd2luZ01vZGUoV0lORE9XSU5HX01PREVfUElOTkVEKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhY2sgIT0gbnVsbCAmJiAhc3RhY2subUFuaW1hdGluZ0JvdW5kczsKKyAgICAgICAgICAgIH0sICJXYWl0aW5nIGZvciBwaW5uZWQgc3RhY2sgYm91bmRzIGFuaW1hdGlvbiB0byBmaW5pc2giKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXYWl0cyB1bnRpbCB0aGUgcGlubmVkIHN0YWNrIGhhcyBiZWVuIHJlbW92ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHdhaXRGb3JQaW5uZWRTdGFja1JlbW92ZWQoKSB7CisgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvcigoYW1TdGF0ZSwgd21TdGF0ZSkgLT4geworICAgICAgICAgICAgcmV0dXJuICFhbVN0YXRlLmNvbnRhaW5zU3RhY2soV0lORE9XSU5HX01PREVfUElOTkVELCBBQ1RJVklUWV9UWVBFX1NUQU5EQVJEKQorICAgICAgICAgICAgICAgICAgICAmJiAhd21TdGF0ZS5jb250YWluc1N0YWNrKFdJTkRPV0lOR19NT0RFX1BJTk5FRCwgQUNUSVZJVFlfVFlQRV9TVEFOREFSRCk7CisgICAgICAgIH0sICJXYWl0aW5nIGZvciBwaW5uZWQgc3RhY2sgdG8gYmUgcmVtb3ZlZC4uLiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdhaXRzIHVudGlsIHRoZSBwaWN0dXJlLWluLXBpY3R1cmUgYW5pbWF0aW9uIHRvIGZ1bGxzY3JlZW4gaGFzIGZpbmlzaGVkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB3YWl0Rm9yRXhpdFBpcFRvRnVsbHNjcmVlbihDb21wb25lbnROYW1lIGFjdGl2aXR5TmFtZSkgeworICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JWYWxpZFN0YXRlKG5ldyBXYWl0Rm9yVmFsaWRBY3Rpdml0eVN0YXRlLkJ1aWxkZXIoYWN0aXZpdHlOYW1lKQorICAgICAgICAgICAgICAgIC5zZXRXaW5kb3dpbmdNb2RlKFdJTkRPV0lOR19NT0RFX0ZVTExTQ1JFRU4pCisgICAgICAgICAgICAgICAgLnNldEFjdGl2aXR5VHlwZShBQ1RJVklUWV9UWVBFX1NUQU5EQVJEKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXYWl0cyB1bnRpbCB0aGUgZXhwZWN0ZWQgcGljdHVyZS1pbi1waWN0dXJlIGNhbGxiYWNrcyBoYXZlIGJlZW4gbWFkZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgd2FpdEZvclZhbGlkUGljdHVyZUluUGljdHVyZUNhbGxiYWNrcyhDb21wb25lbnROYW1lIGFjdGl2aXR5TmFtZSwKKyAgICAgICAgICAgIExvZ1NlcGFyYXRvciBsb2dTZXBhcmF0b3IpIHsKKyAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yKChhbVN0YXRlLCB3bVN0YXRlKSAtPiB7CisgICAgICAgICAgICBmaW5hbCBBY3Rpdml0eUxpZmVjeWNsZUNvdW50cyBsaWZlY3ljbGVDb3VudHMgPSBuZXcgQWN0aXZpdHlMaWZlY3ljbGVDb3VudHMoCisgICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5TmFtZSwgbG9nU2VwYXJhdG9yKTsKKyAgICAgICAgICAgIHJldHVybiBsaWZlY3ljbGVDb3VudHMubUNvbmZpZ3VyYXRpb25DaGFuZ2VkQ291bnQgPT0gMSAmJgorICAgICAgICAgICAgICAgICAgICBsaWZlY3ljbGVDb3VudHMubVBpY3R1cmVJblBpY3R1cmVNb2RlQ2hhbmdlZENvdW50ID09IDEgJiYKKyAgICAgICAgICAgICAgICAgICAgbGlmZWN5Y2xlQ291bnRzLm1NdWx0aVdpbmRvd01vZGVDaGFuZ2VkQ291bnQgPT0gMTsKKyAgICAgICAgfSwgIldhaXRpbmcgZm9yIHBpY3R1cmUtaW4tcGljdHVyZSBhY3Rpdml0eSBjYWxsYmFja3MuLi4iKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgd2FpdEZvclZhbGlkQXNwZWN0UmF0aW8oaW50IG51bSwgaW50IGRlbm9tKSB7CisgICAgICAgIC8vIEhhY2t5LCBidXQgd2UgbmVlZCB0byB3YWl0IGZvciB0aGUgYXV0by1lbnRlciBwaWN0dXJlLWluLXBpY3R1cmUgYW5pbWF0aW9uIHRvIGNvbXBsZXRlCisgICAgICAgIC8vIGFuZCBiZWZvcmUgd2UgY2FuIGNoZWNrIHRoZSBwaW5uZWQgc3RhY2sgYm91bmRzCisgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvcldpdGhBbVN0YXRlKChzdGF0ZSkgLT4geworICAgICAgICAgICAgUmVjdCBib3VuZHMgPSBzdGF0ZS5nZXRTdGFuZGFyZFN0YWNrQnlXaW5kb3dpbmdNb2RlKFdJTkRPV0lOR19NT0RFX1BJTk5FRCkuZ2V0Qm91bmRzKCk7CisgICAgICAgICAgICByZXR1cm4gZmxvYXRFcXVhbHMoKGZsb2F0KSBib3VuZHMud2lkdGgoKSAvIGJvdW5kcy5oZWlnaHQoKSwgKGZsb2F0KSBudW0gLyBkZW5vbSk7CisgICAgICAgIH0sICJ3YWl0Rm9yVmFsaWRBc3BlY3RSYXRpbyIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHdpbmRvdyBzdGF0ZSBmb3IgdGhlIGdpdmVuIHtAcGFyYW0gYWN0aXZpdHlOYW1lfSdzIHdpbmRvdy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFdpbmRvd01hbmFnZXJTdGF0ZS5XaW5kb3dTdGF0ZSBnZXRXaW5kb3dTdGF0ZShDb21wb25lbnROYW1lIGFjdGl2aXR5TmFtZSkgeworICAgICAgICBTdHJpbmcgd2luZG93TmFtZSA9IGdldFdpbmRvd05hbWUoYWN0aXZpdHlOYW1lKTsKKyAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUoYWN0aXZpdHlOYW1lKTsKKyAgICAgICAgZmluYWwgTGlzdDxXaW5kb3dNYW5hZ2VyU3RhdGUuV2luZG93U3RhdGU+IHRlbXBXaW5kb3dMaXN0ID0KKyAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLmdldFdtU3RhdGUoKS5nZXRNYXRjaGluZ1Zpc2libGVXaW5kb3dTdGF0ZSh3aW5kb3dOYW1lKTsKKyAgICAgICAgcmV0dXJuIHRlbXBXaW5kb3dMaXN0LmdldCgwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHBpbm5lZCBzdGFjay4KKyAgICAgKi8KKyAgICBwcml2YXRlIEFjdGl2aXR5U3RhY2sgZ2V0UGlubmVkU3RhY2soKSB7CisgICAgICAgIHJldHVybiBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFuZGFyZFN0YWNrQnlXaW5kb3dpbmdNb2RlKFdJTkRPV0lOR19NT0RFX1BJTk5FRCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgY3VycmVudCBwaW5uZWQgc3RhY2sgYm91bmRzLgorICAgICAqLworICAgIHByaXZhdGUgUmVjdCBnZXRQaW5uZWRTdGFja0JvdW5kcygpIHsKKyAgICAgICAgcmV0dXJuIGdldFBpbm5lZFN0YWNrKCkuZ2V0Qm91bmRzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGFyZXMgdHdvIGZsb2F0cyB3aXRoIGEgY29tbW9uIGVwc2lsb24uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydEZsb2F0RXF1YWxzKGZsb2F0IGFjdHVhbCwgZmxvYXQgZXhwZWN0ZWQpIHsKKyAgICAgICAgaWYgKCFmbG9hdEVxdWFscyhhY3R1YWwsIGV4cGVjdGVkKSkgeworICAgICAgICAgICAgZmFpbChleHBlY3RlZCArICIgbm90IGVxdWFsIHRvICIgKyBhY3R1YWwpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGZsb2F0RXF1YWxzKGZsb2F0IGEsIGZsb2F0IGIpIHsKKyAgICAgICAgcmV0dXJuIE1hdGguYWJzKGEgLSBiKSA8IEZMT0FUX0NPTVBBUkVfRVBTSUxPTjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmlnZ2VycyBhIHRhcCBvdmVyIHRoZSBwaW5uZWQgc3RhY2sgYm91bmRzIHRvIHRyaWdnZXIgdGhlIFBJUCB0byBjbG9zZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdGFwVG9GaW5pc2hQaXAoKSB7CisgICAgICAgIFJlY3QgcGlubmVkU3RhY2tCb3VuZHMgPSBnZXRQaW5uZWRTdGFja0JvdW5kcygpOworICAgICAgICBpbnQgdGFwWCA9IHBpbm5lZFN0YWNrQm91bmRzLmxlZnQgKyBwaW5uZWRTdGFja0JvdW5kcy53aWR0aCgpIC0gMTAwOworICAgICAgICBpbnQgdGFwWSA9IHBpbm5lZFN0YWNrQm91bmRzLnRvcCArIHBpbm5lZFN0YWNrQm91bmRzLmhlaWdodCgpIC0gMTAwOworICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKFN0cmluZy5mb3JtYXQoImlucHV0IHRhcCAlZCAlZCIsIHRhcFgsIHRhcFkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMYXVuY2hlcyB0aGUgZ2l2ZW4ge0BwYXJhbSBhY3Rpdml0eU5hbWV9IGludG8gdGhlIHtAcGFyYW0gdGFza0lkfSBhcyBhIHRhc2sgb3ZlcmxheS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgbGF1bmNoUGlubmVkQWN0aXZpdHlBc1Rhc2tPdmVybGF5KENvbXBvbmVudE5hbWUgYWN0aXZpdHlOYW1lLCBpbnQgdGFza0lkKSB7CisgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoZ2V0QW1TdGFydENtZChhY3Rpdml0eU5hbWUpICsgIiAtLXRhc2sgIiArIHRhc2tJZCArICIgLS10YXNrLW92ZXJsYXkiKTsKKworICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JWYWxpZFN0YXRlKG5ldyBXYWl0Rm9yVmFsaWRBY3Rpdml0eVN0YXRlLkJ1aWxkZXIoYWN0aXZpdHlOYW1lKQorICAgICAgICAgICAgICAgIC5zZXRXaW5kb3dpbmdNb2RlKFdJTkRPV0lOR19NT0RFX1BJTk5FRCkKKyAgICAgICAgICAgICAgICAuc2V0QWN0aXZpdHlUeXBlKEFDVElWSVRZX1RZUEVfU1RBTkRBUkQpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEFwcE9wc1Nlc3Npb24gaW1wbGVtZW50cyBBdXRvQ2xvc2VhYmxlIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtUGFja2FnZU5hbWU7CisKKyAgICAgICAgQXBwT3BzU2Vzc2lvbihDb21wb25lbnROYW1lIGFjdGl2aXR5TmFtZSkgeworICAgICAgICAgICAgbVBhY2thZ2VOYW1lID0gYWN0aXZpdHlOYW1lLmdldFBhY2thZ2VOYW1lKCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHNldE9wVG9Nb2RlKFN0cmluZyBvcCwgaW50IG1vZGUpIHsKKyAgICAgICAgICAgIHNldEFwcE9wc09wVG9Nb2RlKG1QYWNrYWdlTmFtZSwgb3AsIG1vZGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgICAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZCgiYXBwb3BzIHJlc2V0ICIgKyBtUGFja2FnZU5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgYW4gYXBwLW9wcyBvcCBmb3IgYSBnaXZlbiBwYWNrYWdlIHRvIGEgZ2l2ZW4gbW9kZS4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgdm9pZCBzZXRBcHBPcHNPcFRvTW9kZShTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBvcCwgaW50IG1vZGUpIHsKKyAgICAgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoU3RyaW5nLmZvcm1hdCgiYXBwb3BzIHNldCAlcyAlcyAlZCIsIHBhY2thZ2VOYW1lLCBvcCwgbW9kZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVE9ETzogSW1wcm92ZSB0ZXN0cyBjaGVjayB0byBhY3R1YWxseSBjaGVjayB0aGF0IGFwcHMgYXJlIG5vdCBpbnRlcmFjdGl2ZSBpbnN0ZWFkIG9mIGNoZWNraW5nCisgICAgICogICAgICAgaWYgdGhlIHN0YWNrIGlzIGZvY3VzZWQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBpbm5lZFN0YWNrVGVzdGVyKFN0cmluZyBzdGFydEFjdGl2aXR5Q21kLCBDb21wb25lbnROYW1lIHN0YXJ0QWN0aXZpdHksCisgICAgICAgICAgICBDb21wb25lbnROYW1lIHRvcEFjdGl2aXR5TmFtZSwgYm9vbGVhbiBtb3ZlVG9wVG9QaW5uZWRTdGFjaywgYm9vbGVhbiBpc0ZvY3VzYWJsZSkgeworICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKHN0YXJ0QWN0aXZpdHlDbWQpOworICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JWYWxpZFN0YXRlKHN0YXJ0QWN0aXZpdHkpOworCisgICAgICAgIGlmIChtb3ZlVG9wVG9QaW5uZWRTdGFjaykgeworICAgICAgICAgICAgZmluYWwgaW50IHN0YWNrSWQgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja0lkQnlBY3Rpdml0eSh0b3BBY3Rpdml0eU5hbWUpOworCisgICAgICAgICAgICBhc3NlcnROb3RFcXVhbHMoc3RhY2tJZCwgSU5WQUxJRF9TVEFDS19JRCk7CisgICAgICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKGdldE1vdmVUb1Bpbm5lZFN0YWNrQ29tbWFuZChzdGFja0lkKSk7CisgICAgICAgIH0KKworICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JWYWxpZFN0YXRlKG5ldyBXYWl0Rm9yVmFsaWRBY3Rpdml0eVN0YXRlLkJ1aWxkZXIodG9wQWN0aXZpdHlOYW1lKQorICAgICAgICAgICAgICAgIC5zZXRXaW5kb3dpbmdNb2RlKFdJTkRPV0lOR19NT0RFX1BJTk5FRCkKKyAgICAgICAgICAgICAgICAuc2V0QWN0aXZpdHlUeXBlKEFDVElWSVRZX1RZUEVfU1RBTkRBUkQpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZSh0cnVlKTsKKworICAgICAgICBpZiAoc3VwcG9ydHNQaXAoKSkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHdpbmRvd05hbWUgPSBnZXRXaW5kb3dOYW1lKHRvcEFjdGl2aXR5TmFtZSk7CisgICAgICAgICAgICBhc3NlcnRQaW5uZWRTdGFja0V4aXN0cygpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGcm9udFN0YWNrKCJQaW5uZWQgc3RhY2sgbXVzdCBiZSB0aGUgZnJvbnQgc3RhY2suIiwKKyAgICAgICAgICAgICAgICAgICAgV0lORE9XSU5HX01PREVfUElOTkVELCBBQ1RJVklUWV9UWVBFX1NUQU5EQVJEKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eSh0b3BBY3Rpdml0eU5hbWUsIHRydWUpOworCisgICAgICAgICAgICBpZiAoaXNGb2N1c2FibGUpIHsKKyAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRTdGFjaygiUGlubmVkIHN0YWNrIG11c3QgYmUgdGhlIGZvY3VzZWQgc3RhY2suIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdJTkRPV0lOR19NT0RFX1BJTk5FRCwgQUNUSVZJVFlfVFlQRV9TVEFOREFSRCk7CisgICAgICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkQWN0aXZpdHkoCisgICAgICAgICAgICAgICAgICAgICAgICAiUGlubmVkIGFjdGl2aXR5IG11c3QgYmUgZm9jdXNlZCBhY3Rpdml0eS4iLCB0b3BBY3Rpdml0eU5hbWUpOworICAgICAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZFdpbmRvdygKKyAgICAgICAgICAgICAgICAgICAgICAgICJQaW5uZWQgd2luZG93IG11c3QgYmUgZm9jdXNlZCB3aW5kb3cuIiwgd2luZG93TmFtZSk7CisgICAgICAgICAgICAgICAgLy8gTm90IGNoZWNraW5nIGZvciByZXN1bWVkIHN0YXRlIGhlcmUgYmVjYXVzZSBQaVAgb3ZlcmxheSBjYW4gYmUgbGF1bmNoZWQgb24gdG9wCisgICAgICAgICAgICAgICAgLy8gaW4gZGlmZmVyZW50IHRhc2sgYnkgU3lzdGVtVUkuCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIERvbid0IGFzc2VydCB0aGF0IHRoZSBzdGFjayBpcyBub3QgZm9jdXNlZCBhcyBhIGZvY3VzYWJsZSBQaVAgb3ZlcmxheSBjYW4gYmUKKyAgICAgICAgICAgICAgICAvLyBsYXVuY2hlZCBvbiB0b3AgYXMgYSB0YXNrIG92ZXJsYXkgYnkgU3lzdGVtVUkuCisgICAgICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnROb3RGb2N1c2VkQWN0aXZpdHkoCisgICAgICAgICAgICAgICAgICAgICAgICAiUGlubmVkIGFjdGl2aXR5IGNhbid0IGJlIHRoZSBmb2N1c2VkIGFjdGl2aXR5LiIsIHRvcEFjdGl2aXR5TmFtZSk7CisgICAgICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnROb3RSZXN1bWVkQWN0aXZpdHkoCisgICAgICAgICAgICAgICAgICAgICAgICAiUGlubmVkIGFjdGl2aXR5IGNhbid0IGJlIHRoZSByZXN1bWVkIGFjdGl2aXR5LiIsIHRvcEFjdGl2aXR5TmFtZSk7CisgICAgICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnROb3RGb2N1c2VkV2luZG93KAorICAgICAgICAgICAgICAgICAgICAgICAgIlBpbm5lZCB3aW5kb3cgY2FuJ3QgYmUgZm9jdXNlZCB3aW5kb3cuIiwgd2luZG93TmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydERvZXNOb3RDb250YWluU3RhY2soIk11c3Qgbm90IGNvbnRhaW4gcGlubmVkIHN0YWNrLiIsCisgICAgICAgICAgICAgICAgICAgIFdJTkRPV0lOR19NT0RFX1BJTk5FRCwgQUNUSVZJVFlfVFlQRV9TVEFOREFSRCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlclJlcGxhY2VXaW5kb3dUZXN0cy5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJSZXBsYWNlV2luZG93VGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjBlYmQwNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlNYW5hZ2VyUmVwbGFjZVdpbmRvd1Rlc3RzLmphdmEKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLmFtOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLldpbmRvd0NvbmZpZ3VyYXRpb24uV0lORE9XSU5HX01PREVfU1BMSVRfU0NSRUVOX1BSSU1BUlk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudE5hbWVVdGlscy5nZXRXaW5kb3dOYW1lOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLk5PX1JFTEFVTkNIX0FDVElWSVRZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLlNMT1dfQ1JFQVRFX0FDVElWSVRZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5TdGF0ZUxvZ2dlci5sb2c7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3N1bWUuYXNzdW1lVHJ1ZTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKKy8qKgorICogQnVpbGQvSW5zdGFsbC9SdW46CisgKiAgICAgYXRlc3QgQ3RzQWN0aXZpdHlNYW5hZ2VyRGV2aWNlVGVzdENhc2VzOkFjdGl2aXR5TWFuYWdlclJlcGxhY2VXaW5kb3dUZXN0cworICovCitwdWJsaWMgY2xhc3MgQWN0aXZpdHlNYW5hZ2VyUmVwbGFjZVdpbmRvd1Rlc3RzIGV4dGVuZHMgQWN0aXZpdHlNYW5hZ2VyVGVzdEJhc2UgeworCisgICAgQEJlZm9yZQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisKKyAgICAgICAgYXNzdW1lVHJ1ZSgiU2tpcHBpbmcgdGVzdDogbm8gbXVsdGktd2luZG93IHN1cHBvcnQiLCBzdXBwb3J0c1NwbGl0U2NyZWVuTXVsdGlXaW5kb3coKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZVdpbmRvd19Eb2NrX1JlbGF1bmNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RSZXBsYWNlV2luZG93X0RvY2sodHJ1ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZVdpbmRvd19Eb2NrX05vUmVsYXVuY2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdFJlcGxhY2VXaW5kb3dfRG9jayhmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RSZXBsYWNlV2luZG93X0RvY2soYm9vbGVhbiByZWxhdW5jaCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIENvbXBvbmVudE5hbWUgYWN0aXZpdHlOYW1lID0gcmVsYXVuY2ggPyBTTE9XX0NSRUFURV9BQ1RJVklUWSA6IE5PX1JFTEFVTkNIX0FDVElWSVRZOworICAgICAgICBmaW5hbCBTdHJpbmcgd2luZG93TmFtZSA9IGdldFdpbmRvd05hbWUoYWN0aXZpdHlOYW1lKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGFtU3RhcnRDbWQgPSBnZXRBbVN0YXJ0Q21kKGFjdGl2aXR5TmFtZSk7CisKKyAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChhbVN0YXJ0Q21kKTsKKworICAgICAgICAvLyBTbGVlcCAyIHNlY29uZHMsIHRoZW4gY2hlY2sgaWYgdGhlIHdpbmRvdyBpcyBzdGFydGVkIHByb3Blcmx5LiBTbG93Q3JlYXRlQWN0aXZpdHkKKyAgICAgICAgLy8gd2lsbCBkbyBhIHNsZWVwIGluc2lkZSBpdHMgb25DcmVhdGUoKSB0byBzaW11bGF0ZSBhIHNsb3ctc3RhcnRpbmcgYXBwLiBTbyBpbnN0ZWFkIG9mCisgICAgICAgIC8vIHJlbHlpbmcgb24gV2luZG93TWFuYWdlclN0YXRlJ3MgcmV0cnlpbmcgbWVjaGFuaXNtLCB3ZSBkbyBhbiBleHBsaWNpdCBzbGVlcCB0byBhdm9pZAorICAgICAgICAvLyBleGNlc3Mgc3Bld3MgZnJvbSBXaW5kb3dNYW5hZ2VyU3RhdGUuCisgICAgICAgIGlmIChyZWxhdW5jaCkgeworICAgICAgICAgICAgU3lzdGVtQ2xvY2suc2xlZXAoVGltZVVuaXQuU0VDT05EUy50b01pbGxpcygyKSk7CisgICAgICAgIH0KKworICAgICAgICBsb2coIj09PT09PT09PT1CZWZvcmUgRG9ja2luZz09PT09PT09Iik7CisgICAgICAgIGZpbmFsIFN0cmluZyBvbGRUb2tlbiA9IGdldFdpbmRvd1Rva2VuKHdpbmRvd05hbWUsIGFjdGl2aXR5TmFtZSk7CisKKyAgICAgICAgLy8gTW92ZSB0byBkb2NrZWQgc3RhY2sKKyAgICAgICAgc2V0QWN0aXZpdHlUYXNrV2luZG93aW5nTW9kZShhY3Rpdml0eU5hbWUsIFdJTkRPV0lOR19NT0RFX1NQTElUX1NDUkVFTl9QUklNQVJZKTsKKworICAgICAgICAvLyBTbGVlcCA1IHNlY29uZHMsIHRoZW4gY2hlY2sgaWYgdGhlIHdpbmRvdyBpcyByZXBsYWNlZCBwcm9wZXJseS4KKyAgICAgICAgU3lzdGVtQ2xvY2suc2xlZXAoVGltZVVuaXQuU0VDT05EUy50b01pbGxpcyg1KSk7CisKKyAgICAgICAgbG9nKCI9PT09PT09PT09QWZ0ZXIgRG9ja2luZz09PT09PT09Iik7CisgICAgICAgIGZpbmFsIFN0cmluZyBuZXdUb2tlbiA9IGdldFdpbmRvd1Rva2VuKHdpbmRvd05hbWUsIGFjdGl2aXR5TmFtZSk7CisKKyAgICAgICAgLy8gRm9yIGJvdGggcmVsYXVuY2ggYW5kIG5vdCByZWxhdW5jaCBjYXNlLCB3ZSdkIGxpa2UgdGhlIHdpbmRvdyB0byBiZSBrZXB0LgorICAgICAgICBhc3NlcnRFcXVhbHMoIldpbmRvdyByZXBsYWNlZCB3aGlsZSBkb2NraW5nLiIsIG9sZFRva2VuLCBuZXdUb2tlbik7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0V2luZG93VG9rZW4oU3RyaW5nIHdpbmRvd05hbWUsIENvbXBvbmVudE5hbWUgYWN0aXZpdHlOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUoYWN0aXZpdHlOYW1lKTsKKworICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoYWN0aXZpdHlOYW1lLCB0cnVlKTsKKworICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gd2luZG93VG9rZW5zID0KKyAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLmdldFdtU3RhdGUoKS5nZXRNYXRjaGluZ1dpbmRvd1Rva2Vucyh3aW5kb3dOYW1lKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIlNob3VsZCBoYXZlIGV4YWN0bHkgb25lIHdpbmRvdyBmb3IgdGhlIGFjdGl2aXR5LiIsCisgICAgICAgICAgICAgICAgMSwgd2luZG93VG9rZW5zLnNpemUoKSk7CisKKyAgICAgICAgcmV0dXJuIHdpbmRvd1Rva2Vucy5nZXQoMCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJSb2J1c3RuZXNzVGVzdHMuamF2YSBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlNYW5hZ2VyUm9idXN0bmVzc1Rlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhjNDA0OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlNYW5hZ2VyUm9idXN0bmVzc1Rlc3RzLmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbTsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLlJFQ1VSU0lWRV9BQ1RJVklUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5URVNUX0FDVElWSVRZOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogQnVpbGQvSW5zdGFsbC9SdW46CisgKiAgICAgYXRlc3QgQ3RzQWN0aXZpdHlNYW5hZ2VyRGV2aWNlVGVzdENhc2VzOkFjdGl2aXR5TWFuYWdlclJvYnVzdG5lc3NUZXN0cworICovCitwdWJsaWMgY2xhc3MgQWN0aXZpdHlNYW5hZ2VyUm9idXN0bmVzc1Rlc3RzIGV4dGVuZHMgQWN0aXZpdHlNYW5hZ2VyVGVzdEJhc2UgeworCisgICAgLyoqCisgICAgICogVGVzdHMgbGF1bmNoaW5nIGFuIGFjdGl2aXR5IHRoYXQgbGF1bmNoZXMgaXRzZWxmIHJlY3Vyc2l2ZWx5IGxpbWl0ZWQgbnVtYmVyIG9mIHRpbWVzLgorICAgICAqIFRoaXMgaXMgYSBsb25nIHRlc3QsIHNvIHNob3VsZG4ndCBiZSBwYXJ0IG9mIHByZXN1Ym1pdC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMYXVuY2hBY3Rpdml0eVJlY3Vyc2l2ZWx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGdldExhdW5jaEFjdGl2aXR5QnVpbGRlcigpLnNldFVzZUluc3RydW1lbnRhdGlvbigpCisgICAgICAgICAgICAgICAgLnNldFRhcmdldEFjdGl2aXR5KFJFQ1VSU0lWRV9BQ1RJVklUWSkuZXhlY3V0ZSgpOworCisgICAgICAgIGZvciAoaW50IHJldHJ5ID0gMTsgcmV0cnkgPD0gMTA7IHJldHJ5KyspIHsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKFRFU1RfQUNUSVZJVFkpOworICAgICAgICAgICAgaWYgKG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmlzQWN0aXZpdHlWaXNpYmxlKFRFU1RfQUNUSVZJVFkpKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yVmFsaWRTdGF0ZShURVNUX0FDVElWSVRZKTsKKyAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFRFU1RfQUNUSVZJVFksIHRydWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlNYW5hZ2VyU3BsaXRTY3JlZW5UZXN0cy5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJTcGxpdFNjcmVlblRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU1ZDg2NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlNYW5hZ2VyU3BsaXRTY3JlZW5UZXN0cy5qYXZhCkBAIC0wLDAgKzEsNjk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbTsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXIuU1BMSVRfU0NSRUVOX0NSRUFURV9NT0RFX0JPVFRPTV9PUl9SSUdIVDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyLlNQTElUX1NDUkVFTl9DUkVBVEVfTU9ERV9UT1BfT1JfTEVGVDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuV2luZG93Q29uZmlndXJhdGlvbi5BQ1RJVklUWV9UWVBFX0hPTUU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLldpbmRvd0NvbmZpZ3VyYXRpb24uQUNUSVZJVFlfVFlQRV9SRUNFTlRTOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5XaW5kb3dDb25maWd1cmF0aW9uLkFDVElWSVRZX1RZUEVfU1RBTkRBUkQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLldpbmRvd0NvbmZpZ3VyYXRpb24uV0lORE9XSU5HX01PREVfRlVMTFNDUkVFTjsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuV2luZG93Q29uZmlndXJhdGlvbi5XSU5ET1dJTkdfTU9ERV9GVUxMU0NSRUVOX09SX1NQTElUX1NDUkVFTl9TRUNPTkRBUlk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLldpbmRvd0NvbmZpZ3VyYXRpb24uV0lORE9XSU5HX01PREVfU1BMSVRfU0NSRUVOX1BSSU1BUlk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLldpbmRvd0NvbmZpZ3VyYXRpb24uV0lORE9XSU5HX01PREVfU1BMSVRfU0NSRUVOX1NFQ09OREFSWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuV2luZG93Q29uZmlndXJhdGlvbi5XSU5ET1dJTkdfTU9ERV9VTkRFRklORUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuRE9DS0VEX0FDVElWSVRZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLkxBVU5DSElOR19BQ1RJVklUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5OT05fUkVTSVpFQUJMRV9BQ1RJVklUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5OT19SRUxBVU5DSF9BQ1RJVklUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5SRVNJWkVBQkxFX0FDVElWSVRZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLlNJTkdMRV9JTlNUQU5DRV9BQ1RJVklUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5TSU5HTEVfVEFTS19BQ1RJVklUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5URVNUX0FDVElWSVRZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLlRlc3RBY3Rpdml0eS5URVNUX0FDVElWSVRZX0FDVElPTl9GSU5JU0hfU0VMRjsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uVWlEZXZpY2VVdGlscy5wcmVzc0hvbWVCdXR0b247CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLldpbmRvd01hbmFnZXJTdGF0ZS5UUkFOU0lUX1dBTExQQVBFUl9PUEVOOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuU3VyZmFjZS5ST1RBVElPTl8wOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuU3VyZmFjZS5ST1RBVElPTl8xODA7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5TdXJmYWNlLlJPVEFUSU9OXzI3MDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LlN1cmZhY2UuUk9UQVRJT05fOTA7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmxlc3NUaGFuOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3RFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3N1bWUuYXNzdW1lVHJ1ZTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUHJlc3VibWl0OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLkZsYWt5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogQnVpbGQvSW5zdGFsbC9SdW46CisgKiAgICAgYXRlc3QgQ3RzQWN0aXZpdHlNYW5hZ2VyRGV2aWNlVGVzdENhc2VzOkFjdGl2aXR5TWFuYWdlclNwbGl0U2NyZWVuVGVzdHMKKyAqLworcHVibGljIGNsYXNzIEFjdGl2aXR5TWFuYWdlclNwbGl0U2NyZWVuVGVzdHMgZXh0ZW5kcyBBY3Rpdml0eU1hbmFnZXJUZXN0QmFzZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEFTS19TSVpFID0gNjAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFDS19TSVpFID0gMzAwOworCisgICAgcHJpdmF0ZSBib29sZWFuIG1Jc0hvbWVSZWNlbnRzQ29tcG9uZW50OworCisgICAgQEJlZm9yZQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisKKyAgICAgICAgbUlzSG9tZVJlY2VudHNDb21wb25lbnQgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5pc0hvbWVSZWNlbnRzQ29tcG9uZW50KCk7CisKKyAgICAgICAgYXNzdW1lVHJ1ZSgiU2tpcHBpbmcgdGVzdDogbm8gc3BsaXQgbXVsdGktd2luZG93IHN1cHBvcnQiLAorICAgICAgICAgICAgICAgIHN1cHBvcnRzU3BsaXRTY3JlZW5NdWx0aVdpbmRvdygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNaW5pbXVtRGV2aWNlU2l6ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtQW1XbVN0YXRlLmFzc2VydERldmljZURlZmF1bHREaXNwbGF5U2l6ZSgKKyAgICAgICAgICAgICAgICAiRGV2aWNlcyBzdXBwb3J0aW5nIG11bHRpLXdpbmRvdyBtdXN0IGJlIGxhcmdlciB0aGFuIHRoZSBkZWZhdWx0IG1pbmltdW0iCisgICAgICAgICAgICAgICAgICAgICAgICArICIgdGFzayBzaXplIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAUHJlc3VibWl0CisgICAgQEZsYWt5VGVzdChidWdJZCA9IDcxNzkyMzkzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFja0xpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbGF1bmNoQWN0aXZpdHkoVEVTVF9BQ1RJVklUWSk7CisgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKFRFU1RfQUNUSVZJVFkpOworICAgICAgICBtQW1XbVN0YXRlLmFzc2VydENvbnRhaW5zU3RhY2soIk11c3QgY29udGFpbiBob21lIHN0YWNrLiIsCisgICAgICAgICAgICAgICAgV0lORE9XSU5HX01PREVfVU5ERUZJTkVELCBBQ1RJVklUWV9UWVBFX0hPTUUpOworICAgICAgICBtQW1XbVN0YXRlLmFzc2VydENvbnRhaW5zU3RhY2soIk11c3QgY29udGFpbiBmdWxsc2NyZWVuIHN0YWNrLiIsCisgICAgICAgICAgICAgICAgV0lORE9XSU5HX01PREVfRlVMTFNDUkVFTiwgQUNUSVZJVFlfVFlQRV9TVEFOREFSRCk7CisgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0RG9lc05vdENvbnRhaW5TdGFjaygiTXVzdCBub3QgY29udGFpbiBkb2NrZWQgc3RhY2suIiwKKyAgICAgICAgICAgICAgICBXSU5ET1dJTkdfTU9ERV9TUExJVF9TQ1JFRU5fUFJJTUFSWSwgQUNUSVZJVFlfVFlQRV9TVEFOREFSRCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAUHJlc3VibWl0CisgICAgcHVibGljIHZvaWQgdGVzdERvY2tBY3Rpdml0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBsYXVuY2hBY3Rpdml0eUluU3BsaXRTY3JlZW5XaXRoUmVjZW50cyhURVNUX0FDVElWSVRZKTsKKyAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRDb250YWluc1N0YWNrKCJNdXN0IGNvbnRhaW4gaG9tZSBzdGFjay4iLAorICAgICAgICAgICAgICAgIFdJTkRPV0lOR19NT0RFX1VOREVGSU5FRCwgQUNUSVZJVFlfVFlQRV9IT01FKTsKKyAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRDb250YWluc1N0YWNrKCJNdXN0IGNvbnRhaW4gZG9ja2VkIHN0YWNrLiIsCisgICAgICAgICAgICAgICAgV0lORE9XSU5HX01PREVfU1BMSVRfU0NSRUVOX1BSSU1BUlksIEFDVElWSVRZX1RZUEVfU1RBTkRBUkQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgQFByZXN1Ym1pdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb25SZXNpemVhYmxlTm90RG9ja2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGxhdW5jaEFjdGl2aXR5SW5TcGxpdFNjcmVlbldpdGhSZWNlbnRzKE5PTl9SRVNJWkVBQkxFX0FDVElWSVRZKTsKKworICAgICAgICBtQW1XbVN0YXRlLmFzc2VydENvbnRhaW5zU3RhY2soIk11c3QgY29udGFpbiBob21lIHN0YWNrLiIsCisgICAgICAgICAgICAgICAgV0lORE9XSU5HX01PREVfVU5ERUZJTkVELCBBQ1RJVklUWV9UWVBFX0hPTUUpOworICAgICAgICBtQW1XbVN0YXRlLmFzc2VydERvZXNOb3RDb250YWluU3RhY2soIk11c3Qgbm90IGNvbnRhaW4gZG9ja2VkIHN0YWNrLiIsCisgICAgICAgICAgICAgICAgV0lORE9XSU5HX01PREVfU1BMSVRfU0NSRUVOX1BSSU1BUlksIEFDVElWSVRZX1RZUEVfU1RBTkRBUkQpOworICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZyb250U3RhY2soIkZ1bGxzY3JlZW4gc3RhY2sgbXVzdCBiZSBmcm9udCBzdGFjay4iLAorICAgICAgICAgICAgICAgIFdJTkRPV0lOR19NT0RFX0ZVTExTQ1JFRU4sIEFDVElWSVRZX1RZUEVfU1RBTkRBUkQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgQFByZXN1Ym1pdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMYXVuY2hUb1NpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbGF1bmNoQWN0aXZpdGllc0luU3BsaXRTY3JlZW4oCisgICAgICAgICAgICAgICAgZ2V0TGF1bmNoQWN0aXZpdHlCdWlsZGVyKCkuc2V0VGFyZ2V0QWN0aXZpdHkoTEFVTkNISU5HX0FDVElWSVRZKSwKKyAgICAgICAgICAgICAgICBnZXRMYXVuY2hBY3Rpdml0eUJ1aWxkZXIoKS5zZXRUYXJnZXRBY3Rpdml0eShURVNUX0FDVElWSVRZKSk7CisgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Q29udGFpbnNTdGFjaygiTXVzdCBjb250YWluIGZ1bGxzY3JlZW4gc3RhY2suIiwKKyAgICAgICAgICAgICAgICBXSU5ET1dJTkdfTU9ERV9TUExJVF9TQ1JFRU5fU0VDT05EQVJZLCBBQ1RJVklUWV9UWVBFX1NUQU5EQVJEKTsKKyAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRDb250YWluc1N0YWNrKCJNdXN0IGNvbnRhaW4gZG9ja2VkIHN0YWNrLiIsCisgICAgICAgICAgICAgICAgV0lORE9XSU5HX01PREVfU1BMSVRfU0NSRUVOX1BSSU1BUlksIEFDVElWSVRZX1RZUEVfU1RBTkRBUkQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgQFByZXN1Ym1pdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMYXVuY2hUb1NpZGVNdWx0aVdpbmRvd0NhbGxiYWNrcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBMYXVuY2ggdHdvIGFjdGl2aXRpZXMgaW4gc3BsaXQtc2NyZWVuIG1vZGUuCisgICAgICAgIGxhdW5jaEFjdGl2aXRpZXNJblNwbGl0U2NyZWVuKAorICAgICAgICAgICAgICAgIGdldExhdW5jaEFjdGl2aXR5QnVpbGRlcigpLnNldFRhcmdldEFjdGl2aXR5KExBVU5DSElOR19BQ1RJVklUWSksCisgICAgICAgICAgICAgICAgZ2V0TGF1bmNoQWN0aXZpdHlCdWlsZGVyKCkuc2V0VGFyZ2V0QWN0aXZpdHkoVEVTVF9BQ1RJVklUWSkpOworICAgICAgICBtQW1XbVN0YXRlLmFzc2VydENvbnRhaW5zU3RhY2soIk11c3QgY29udGFpbiBmdWxsc2NyZWVuIHN0YWNrLiIsCisgICAgICAgICAgICAgICAgV0lORE9XSU5HX01PREVfU1BMSVRfU0NSRUVOX1NFQ09OREFSWSwgQUNUSVZJVFlfVFlQRV9TVEFOREFSRCk7CisgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Q29udGFpbnNTdGFjaygiTXVzdCBjb250YWluIGRvY2tlZCBzdGFjay4iLAorICAgICAgICAgICAgICAgIFdJTkRPV0lOR19NT0RFX1NQTElUX1NDUkVFTl9QUklNQVJZLCBBQ1RJVklUWV9UWVBFX1NUQU5EQVJEKTsKKworICAgICAgICAvLyBFeGl0IHNwbGl0LXNjcmVlbiBtb2RlIGFuZCBlbnN1cmUgd2Ugb25seSBnZXQgMSBtdWx0aS13aW5kb3cgbW9kZSBjaGFuZ2VkIGNhbGxiYWNrLgorICAgICAgICBmaW5hbCBMb2dTZXBhcmF0b3IgbG9nU2VwYXJhdG9yID0gc2VwYXJhdGVMb2dzKCk7CisgICAgICAgIHJlbW92ZVN0YWNrc0luV2luZG93aW5nTW9kZXMoV0lORE9XSU5HX01PREVfU1BMSVRfU0NSRUVOX1BSSU1BUlkpOworICAgICAgICBmaW5hbCBBY3Rpdml0eUxpZmVjeWNsZUNvdW50cyBsaWZlY3ljbGVDb3VudHMgPSB3YWl0Rm9yT25NdWx0aVdpbmRvd01vZGVDaGFuZ2VkKAorICAgICAgICAgICAgICAgIFRFU1RfQUNUSVZJVFksIGxvZ1NlcGFyYXRvcik7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBsaWZlY3ljbGVDb3VudHMubU11bHRpV2luZG93TW9kZUNoYW5nZWRDb3VudCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAUHJlc3VibWl0CisgICAgQEZsYWt5VGVzdChidWdJZCA9IDcyOTU2Mjg0KQorICAgIHB1YmxpYyB2b2lkIHRlc3ROb1VzZXJMZWF2ZUhpbnRPbk11bHRpV2luZG93TW9kZUNoYW5nZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbGF1bmNoQWN0aXZpdHkoVEVTVF9BQ1RJVklUWSwgV0lORE9XSU5HX01PREVfRlVMTFNDUkVFTik7CisKKyAgICAgICAgLy8gTW92ZSB0byBkb2NrZWQgc3RhY2suCisgICAgICAgIExvZ1NlcGFyYXRvciBsb2dTZXBhcmF0b3IgPSBzZXBhcmF0ZUxvZ3MoKTsKKyAgICAgICAgc2V0QWN0aXZpdHlUYXNrV2luZG93aW5nTW9kZShURVNUX0FDVElWSVRZLCBXSU5ET1dJTkdfTU9ERV9TUExJVF9TQ1JFRU5fUFJJTUFSWSk7CisgICAgICAgIEFjdGl2aXR5TGlmZWN5Y2xlQ291bnRzIGxpZmVjeWNsZUNvdW50cyA9IHdhaXRGb3JPbk11bHRpV2luZG93TW9kZUNoYW5nZWQoCisgICAgICAgICAgICAgICAgVEVTVF9BQ1RJVklUWSwgbG9nU2VwYXJhdG9yKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJtTXVsdGlXaW5kb3dNb2RlQ2hhbmdlZENvdW50IiwKKyAgICAgICAgICAgICAgICAxLCBsaWZlY3ljbGVDb3VudHMubU11bHRpV2luZG93TW9kZUNoYW5nZWRDb3VudCk7CisgICAgICAgIGFzc2VydEVxdWFscygibVVzZXJMZWF2ZUhpbnRDb3VudCIsIDAsIGxpZmVjeWNsZUNvdW50cy5tVXNlckxlYXZlSGludENvdW50KTsKKworICAgICAgICAvLyBNYWtlIHN1cmUgZG9ja2VkIHN0YWNrIGlzIGZvY3VzZWQuIFRoaXMgd2F5IHdoZW4gd2UgZGlzbWlzcyBpdCBsYXRlciBmdWxsc2NyZWVuIHN0YWNrCisgICAgICAgIC8vIHdpbGwgY29tZSB1cC4KKyAgICAgICAgbGF1bmNoQWN0aXZpdHkoVEVTVF9BQ1RJVklUWSwgV0lORE9XSU5HX01PREVfU1BMSVRfU0NSRUVOX1BSSU1BUlkpOworCisgICAgICAgIC8vIE1vdmUgYWN0aXZpdHkgYmFjayB0byBmdWxsc2NyZWVuIHN0YWNrLgorICAgICAgICBsb2dTZXBhcmF0b3IgPSBzZXBhcmF0ZUxvZ3MoKTsKKyAgICAgICAgc2V0QWN0aXZpdHlUYXNrV2luZG93aW5nTW9kZShURVNUX0FDVElWSVRZLCBXSU5ET1dJTkdfTU9ERV9GVUxMU0NSRUVOKTsKKyAgICAgICAgbGlmZWN5Y2xlQ291bnRzID0gd2FpdEZvck9uTXVsdGlXaW5kb3dNb2RlQ2hhbmdlZChURVNUX0FDVElWSVRZLCBsb2dTZXBhcmF0b3IpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm1NdWx0aVdpbmRvd01vZGVDaGFuZ2VkQ291bnQiLAorICAgICAgICAgICAgICAgIDEsIGxpZmVjeWNsZUNvdW50cy5tTXVsdGlXaW5kb3dNb2RlQ2hhbmdlZENvdW50KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJtVXNlckxlYXZlSGludENvdW50IiwgMCwgbGlmZWN5Y2xlQ291bnRzLm1Vc2VyTGVhdmVIaW50Q291bnQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgQFByZXN1Ym1pdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMYXVuY2hUb1NpZGVBbmRCcmluZ1RvRnJvbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbGF1bmNoQWN0aXZpdGllc0luU3BsaXRTY3JlZW4oCisgICAgICAgICAgICAgICAgZ2V0TGF1bmNoQWN0aXZpdHlCdWlsZGVyKCkuc2V0VGFyZ2V0QWN0aXZpdHkoTEFVTkNISU5HX0FDVElWSVRZKSwKKyAgICAgICAgICAgICAgICBnZXRMYXVuY2hBY3Rpdml0eUJ1aWxkZXIoKS5zZXRUYXJnZXRBY3Rpdml0eShURVNUX0FDVElWSVRZKSk7CisKKyAgICAgICAgaW50IHRhc2tOdW1iZXJJbml0aWFsID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0U3RhbmRhcmRUYXNrQ291bnRCeVdpbmRvd2luZ01vZGUoCisgICAgICAgICAgICAgICAgV0lORE9XSU5HX01PREVfU1BMSVRfU0NSRUVOX1NFQ09OREFSWSk7CisgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZEFjdGl2aXR5KCJMYXVuY2hlZCB0byBzaWRlIGFjdGl2aXR5IG11c3QgYmUgaW4gZnJvbnQuIiwKKyAgICAgICAgICAgICAgICBURVNUX0FDVElWSVRZKTsKKworICAgICAgICAvLyBMYXVuY2ggYW5vdGhlciBhY3Rpdml0eSB0byBzaWRlIHRvIGNvdmVyIGZpcnN0IG9uZS4KKyAgICAgICAgbGF1bmNoQWN0aXZpdHkoTk9fUkVMQVVOQ0hfQUNUSVZJVFksIFdJTkRPV0lOR19NT0RFX0ZVTExTQ1JFRU5fT1JfU1BMSVRfU0NSRUVOX1NFQ09OREFSWSk7CisgICAgICAgIGludCB0YXNrTnVtYmVyQ292ZXJlZCA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFN0YW5kYXJkVGFza0NvdW50QnlXaW5kb3dpbmdNb2RlKAorICAgICAgICAgICAgICAgIFdJTkRPV0lOR19NT0RFX1NQTElUX1NDUkVFTl9TRUNPTkRBUlkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkZ1bGxzY3JlZW4gc3RhY2sgbXVzdCBoYXZlIG9uZSB0YXNrIGFkZGVkLiIsCisgICAgICAgICAgICAgICAgdGFza051bWJlckluaXRpYWwgKyAxLCB0YXNrTnVtYmVyQ292ZXJlZCk7CisgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZEFjdGl2aXR5KCJMYXVuY2hlZCB0byBzaWRlIGNvdmVyaW5nIGFjdGl2aXR5IG11c3QgYmUgaW4gZnJvbnQuIiwKKyAgICAgICAgICAgICAgICBOT19SRUxBVU5DSF9BQ1RJVklUWSk7CisKKyAgICAgICAgLy8gTGF1bmNoIGFjdGl2aXR5IHRoYXQgd2FzIGZpcnN0IGxhdW5jaGVkIHRvIHNpZGUuIEl0IHNob3VsZCBiZSBicm91Z2h0IHRvIGZyb250LgorICAgICAgICBnZXRMYXVuY2hBY3Rpdml0eUJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRUYXJnZXRBY3Rpdml0eShURVNUX0FDVElWSVRZKQorICAgICAgICAgICAgICAgIC5zZXRUb1NpZGUodHJ1ZSkKKyAgICAgICAgICAgICAgICAuc2V0V2FpdEZvckxhdW5jaGVkKHRydWUpCisgICAgICAgICAgICAgICAgLmV4ZWN1dGUoKTsKKyAgICAgICAgaW50IHRhc2tOdW1iZXJGaW5hbCA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFN0YW5kYXJkVGFza0NvdW50QnlXaW5kb3dpbmdNb2RlKAorICAgICAgICAgICAgICAgIFdJTkRPV0lOR19NT0RFX1NQTElUX1NDUkVFTl9TRUNPTkRBUlkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlRhc2sgbnVtYmVyIGluIGZ1bGxzY3JlZW4gc3RhY2sgbXVzdCByZW1haW4gdGhlIHNhbWUuIiwKKyAgICAgICAgICAgICAgICB0YXNrTnVtYmVyQ292ZXJlZCwgdGFza051bWJlckZpbmFsKTsKKyAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkQWN0aXZpdHkoIkxhdW5jaGVkIHRvIHNpZGUgY292ZXJpbmcgYWN0aXZpdHkgbXVzdCBiZSBpbiBmcm9udC4iLAorICAgICAgICAgICAgICAgIFRFU1RfQUNUSVZJVFkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgQFByZXN1Ym1pdAorICAgIEBGbGFreVRlc3QoYnVnSWQgPSA3MTc5MjM5MykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGF1bmNoVG9TaWRlTXVsdGlwbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbGF1bmNoQWN0aXZpdGllc0luU3BsaXRTY3JlZW4oCisgICAgICAgICAgICAgICAgZ2V0TGF1bmNoQWN0aXZpdHlCdWlsZGVyKCkuc2V0VGFyZ2V0QWN0aXZpdHkoTEFVTkNISU5HX0FDVElWSVRZKSwKKyAgICAgICAgICAgICAgICBnZXRMYXVuY2hBY3Rpdml0eUJ1aWxkZXIoKS5zZXRUYXJnZXRBY3Rpdml0eShURVNUX0FDVElWSVRZKSk7CisKKyAgICAgICAgaW50IHRhc2tOdW1iZXJJbml0aWFsID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0U3RhbmRhcmRUYXNrQ291bnRCeVdpbmRvd2luZ01vZGUoCisgICAgICAgICAgICAgICAgV0lORE9XSU5HX01PREVfU1BMSVRfU0NSRUVOX1NFQ09OREFSWSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoIkxhdW5jaGVkIHRvIHNpZGUgYWN0aXZpdHkgbXVzdCBiZSBpbiBmdWxsc2NyZWVuIHN0YWNrLiIsCisgICAgICAgICAgICAgICAgbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0VGFza0J5QWN0aXZpdHkoCisgICAgICAgICAgICAgICAgICAgICAgICBURVNUX0FDVElWSVRZLCBXSU5ET1dJTkdfTU9ERV9TUExJVF9TQ1JFRU5fU0VDT05EQVJZKSk7CisKKyAgICAgICAgLy8gVHJ5IHRvIGxhdW5jaCB0byBzaWRlIHNhbWUgYWN0aXZpdHkgYWdhaW4uCisgICAgICAgIGdldExhdW5jaEFjdGl2aXR5QnVpbGRlcigpLnNldFRvU2lkZSh0cnVlKS5leGVjdXRlKCk7CisgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKFRFU1RfQUNUSVZJVFksIExBVU5DSElOR19BQ1RJVklUWSk7CisgICAgICAgIGludCB0YXNrTnVtYmVyRmluYWwgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFuZGFyZFRhc2tDb3VudEJ5V2luZG93aW5nTW9kZSgKKyAgICAgICAgICAgICAgICBXSU5ET1dJTkdfTU9ERV9TUExJVF9TQ1JFRU5fU0VDT05EQVJZKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUYXNrIG51bWJlciBtdXN0bid0IGNoYW5nZS4iLCB0YXNrTnVtYmVySW5pdGlhbCwgdGFza051bWJlckZpbmFsKTsKKyAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkQWN0aXZpdHkoIkxhdW5jaGVkIHRvIHNpZGUgYWN0aXZpdHkgbXVzdCByZW1haW4gaW4gZnJvbnQuIiwKKyAgICAgICAgICAgICAgICBURVNUX0FDVElWSVRZKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiTGF1bmNoZWQgdG8gc2lkZSBhY3Rpdml0eSBtdXN0IHJlbWFpbiBpbiBmdWxsc2NyZWVuIHN0YWNrLiIsCisgICAgICAgICAgICAgICAgbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0VGFza0J5QWN0aXZpdHkoCisgICAgICAgICAgICAgICAgICAgICAgICBURVNUX0FDVElWSVRZLCBXSU5ET1dJTkdfTU9ERV9TUExJVF9TQ1JFRU5fU0VDT05EQVJZKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAUHJlc3VibWl0CisgICAgQEZsYWt5VGVzdChidWdJZCA9IDczODA4ODE1KQorICAgIHB1YmxpYyB2b2lkIHRlc3RMYXVuY2hUb1NpZGVTaW5nbGVJbnN0YW5jZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBsYXVuY2hUYXJnZXRUb1NpZGUoU0lOR0xFX0lOU1RBTkNFX0FDVElWSVRZLCBmYWxzZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGF1bmNoVG9TaWRlU2luZ2xlVGFzaygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBsYXVuY2hUYXJnZXRUb1NpZGUoU0lOR0xFX1RBU0tfQUNUSVZJVFksIGZhbHNlKTsKKyAgICB9CisKKyAgICBAUHJlc3VibWl0CisgICAgQEZsYWt5VGVzdChidWdJZCA9IDcxNzkyMzkzKQorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExhdW5jaFRvU2lkZU11bHRpcGxlV2l0aERpZmZlcmVudEludGVudCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBsYXVuY2hUYXJnZXRUb1NpZGUoVEVTVF9BQ1RJVklUWSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGxhdW5jaFRhcmdldFRvU2lkZShDb21wb25lbnROYW1lIHRhcmdldEFjdGl2aXR5TmFtZSwKKyAgICAgICAgICAgIGJvb2xlYW4gdGFza0NvdW50TXVzdEluY3JlbWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIExhdW5jaCBpbiBmdWxsc2NyZWVuIGZpcnN0CisgICAgICAgIGdldExhdW5jaEFjdGl2aXR5QnVpbGRlcigpLnNldFRhcmdldEFjdGl2aXR5KExBVU5DSElOR19BQ1RJVklUWSkKKyAgICAgICAgICAgICAgICAuc2V0VXNlSW5zdHJ1bWVudGF0aW9uKCkKKyAgICAgICAgICAgICAgICAuc2V0V2FpdEZvckxhdW5jaGVkKHRydWUpCisgICAgICAgICAgICAgICAgLmV4ZWN1dGUoKTsKKworICAgICAgICAvLyBNb3ZlIHRvIHNwbGl0LXNjcmVlbiBwcmltYXJ5CisgICAgICAgIGZpbmFsIGludCB0YXNrSWQgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRUYXNrQnlBY3Rpdml0eShMQVVOQ0hJTkdfQUNUSVZJVFkpLm1UYXNrSWQ7CisgICAgICAgIG1vdmVUYXNrVG9QcmltYXJ5U3BsaXRTY3JlZW4odGFza0lkLCB0cnVlIC8qIGxhdW5jaFNpZGVBY3Rpdml0eUlmTmVlZGVkICovKTsKKworICAgICAgICAvLyBMYXVuY2ggdGFyZ2V0IHRvIHNpZGUKKyAgICAgICAgZmluYWwgTGF1bmNoQWN0aXZpdHlCdWlsZGVyIHRhcmdldEFjdGl2aXR5TGF1bmNoZXIgPSBnZXRMYXVuY2hBY3Rpdml0eUJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRUYXJnZXRBY3Rpdml0eSh0YXJnZXRBY3Rpdml0eU5hbWUpCisgICAgICAgICAgICAgICAgLnNldFRvU2lkZSh0cnVlKQorICAgICAgICAgICAgICAgIC5zZXRSYW5kb21EYXRhKHRydWUpCisgICAgICAgICAgICAgICAgLnNldE11bHRpcGxlVGFzayhmYWxzZSk7CisgICAgICAgIHRhcmdldEFjdGl2aXR5TGF1bmNoZXIuZXhlY3V0ZSgpOworCisgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKHRhcmdldEFjdGl2aXR5TmFtZSwgTEFVTkNISU5HX0FDVElWSVRZKTsKKyAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRDb250YWluc1N0YWNrKCJNdXN0IGNvbnRhaW4gc2Vjb25kYXJ5IHN0YWNrLiIsCisgICAgICAgICAgICAgICAgV0lORE9XSU5HX01PREVfU1BMSVRfU0NSRUVOX1NFQ09OREFSWSwgQUNUSVZJVFlfVFlQRV9TVEFOREFSRCk7CisgICAgICAgIGludCB0YXNrTnVtYmVySW5pdGlhbCA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFN0YW5kYXJkVGFza0NvdW50QnlXaW5kb3dpbmdNb2RlKAorICAgICAgICAgICAgICAgIFdJTkRPV0lOR19NT0RFX1NQTElUX1NDUkVFTl9TRUNPTkRBUlkpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJMYXVuY2hlZCB0byBzaWRlIGFjdGl2aXR5IG11c3QgYmUgaW4gZnVsbHNjcmVlbiBzdGFjay4iLAorICAgICAgICAgICAgICAgIG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFRhc2tCeUFjdGl2aXR5KAorICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0QWN0aXZpdHlOYW1lLCBXSU5ET1dJTkdfTU9ERV9TUExJVF9TQ1JFRU5fU0VDT05EQVJZKSk7CisKKyAgICAgICAgLy8gVHJ5IHRvIGxhdW5jaCB0byBzaWRlIHNhbWUgYWN0aXZpdHkgYWdhaW4gd2l0aCBkaWZmZXJlbnQgZGF0YS4KKyAgICAgICAgdGFyZ2V0QWN0aXZpdHlMYXVuY2hlci5leGVjdXRlKCk7CisgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKHRhcmdldEFjdGl2aXR5TmFtZSwgTEFVTkNISU5HX0FDVElWSVRZKTsKKyAgICAgICAgaW50IHRhc2tOdW1iZXJTZWNvbmRMYXVuY2ggPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFuZGFyZFRhc2tDb3VudEJ5V2luZG93aW5nTW9kZSgKKyAgICAgICAgICAgICAgICBXSU5ET1dJTkdfTU9ERV9TUExJVF9TQ1JFRU5fU0VDT05EQVJZKTsKKyAgICAgICAgaWYgKHRhc2tDb3VudE11c3RJbmNyZW1lbnQpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGFzayBudW1iZXIgbXVzdCBiZSBpbmNyZW1lbnRlZC4iLCB0YXNrTnVtYmVySW5pdGlhbCArIDEsCisgICAgICAgICAgICAgICAgICAgIHRhc2tOdW1iZXJTZWNvbmRMYXVuY2gpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUYXNrIG51bWJlciBtdXN0IG5vdCBjaGFuZ2UuIiwgdGFza051bWJlckluaXRpYWwsCisgICAgICAgICAgICAgICAgICAgIHRhc2tOdW1iZXJTZWNvbmRMYXVuY2gpOworICAgICAgICB9CisgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZEFjdGl2aXR5KCJMYXVuY2hlZCB0byBzaWRlIGFjdGl2aXR5IG11c3QgYmUgaW4gZnJvbnQuIiwKKyAgICAgICAgICAgICAgICB0YXJnZXRBY3Rpdml0eU5hbWUpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJMYXVuY2hlZCB0byBzaWRlIGFjdGl2aXR5IG11c3QgYmUgbGF1bmNoZWQgaW4gZnVsbHNjcmVlbiBzdGFjay4iLAorICAgICAgICAgICAgICAgIG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFRhc2tCeUFjdGl2aXR5KAorICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0QWN0aXZpdHlOYW1lLCBXSU5ET1dJTkdfTU9ERV9TUExJVF9TQ1JFRU5fU0VDT05EQVJZKSk7CisKKyAgICAgICAgLy8gVHJ5IHRvIGxhdW5jaCB0byBzaWRlIHNhbWUgYWN0aXZpdHkgYWdhaW4gd2l0aCBkaWZmZXJlbnQgcmFuZG9tIGRhdGEuIE5vdGUgdGhhdCBudWxsCisgICAgICAgIC8vIGNhbm5vdCBiZSB1c2VkIGhlcmUsIHNpbmNlIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiBUZXN0QWN0aXZpdHkgaXMgbGF1bmNoZWQgd2l0aCBubyBkYXRhCisgICAgICAgIC8vIGluIG9yZGVyIHRvIGxhdW5jaCBpbnRvIHNwbGl0IHNjcmVlbi4KKyAgICAgICAgdGFyZ2V0QWN0aXZpdHlMYXVuY2hlci5leGVjdXRlKCk7CisgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKHRhcmdldEFjdGl2aXR5TmFtZSwgTEFVTkNISU5HX0FDVElWSVRZKTsKKyAgICAgICAgaW50IHRhc2tOdW1iZXJGaW5hbCA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFN0YW5kYXJkVGFza0NvdW50QnlXaW5kb3dpbmdNb2RlKAorICAgICAgICAgICAgICAgIFdJTkRPV0lOR19NT0RFX1NQTElUX1NDUkVFTl9TRUNPTkRBUlkpOworICAgICAgICBpZiAodGFza0NvdW50TXVzdEluY3JlbWVudCkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUYXNrIG51bWJlciBtdXN0IGJlIGluY3JlbWVudGVkLiIsIHRhc2tOdW1iZXJTZWNvbmRMYXVuY2ggKyAxLAorICAgICAgICAgICAgICAgICAgICB0YXNrTnVtYmVyRmluYWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUYXNrIG51bWJlciBtdXN0IG5vdCBjaGFuZ2UuIiwgdGFza051bWJlclNlY29uZExhdW5jaCwKKyAgICAgICAgICAgICAgICAgICAgdGFza051bWJlckZpbmFsKTsKKyAgICAgICAgfQorICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRBY3Rpdml0eSgiTGF1bmNoZWQgdG8gc2lkZSBhY3Rpdml0eSBtdXN0IGJlIGluIGZyb250LiIsCisgICAgICAgICAgICAgICAgdGFyZ2V0QWN0aXZpdHlOYW1lKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiTGF1bmNoZWQgdG8gc2lkZSBhY3Rpdml0eSBtdXN0IGJlIGxhdW5jaGVkIGluIGZ1bGxzY3JlZW4gc3RhY2suIiwKKyAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRUYXNrQnlBY3Rpdml0eSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEFjdGl2aXR5TmFtZSwgV0lORE9XSU5HX01PREVfU1BMSVRfU0NSRUVOX1NFQ09OREFSWSkpOworICAgIH0KKworICAgIEBQcmVzdWJtaXQKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMYXVuY2hUb1NpZGVNdWx0aXBsZVdpdGhGbGFnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGxhdW5jaEFjdGl2aXRpZXNJblNwbGl0U2NyZWVuKAorICAgICAgICAgICAgICAgIGdldExhdW5jaEFjdGl2aXR5QnVpbGRlcigpLnNldFRhcmdldEFjdGl2aXR5KExBVU5DSElOR19BQ1RJVklUWSksCisgICAgICAgICAgICAgICAgZ2V0TGF1bmNoQWN0aXZpdHlCdWlsZGVyKCkuc2V0VGFyZ2V0QWN0aXZpdHkoVEVTVF9BQ1RJVklUWSkpOworICAgICAgICBpbnQgdGFza051bWJlckluaXRpYWwgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFuZGFyZFRhc2tDb3VudEJ5V2luZG93aW5nTW9kZSgKKyAgICAgICAgICAgICAgICBXSU5ET1dJTkdfTU9ERV9TUExJVF9TQ1JFRU5fU0VDT05EQVJZKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiTGF1bmNoZWQgdG8gc2lkZSBhY3Rpdml0eSBtdXN0IGJlIGluIGZ1bGxzY3JlZW4gc3RhY2suIiwKKyAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRUYXNrQnlBY3Rpdml0eSgKKyAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RfQUNUSVZJVFksIFdJTkRPV0lOR19NT0RFX1NQTElUX1NDUkVFTl9TRUNPTkRBUlkpKTsKKworICAgICAgICAvLyBUcnkgdG8gbGF1bmNoIHRvIHNpZGUgc2FtZSBhY3Rpdml0eSBhZ2FpbiwgYnV0IHdpdGggSW50ZW50I0ZMQUdfQUNUSVZJVFlfTVVMVElQTEVfVEFTSy4KKyAgICAgICAgZ2V0TGF1bmNoQWN0aXZpdHlCdWlsZGVyKCkuc2V0VG9TaWRlKHRydWUpLnNldE11bHRpcGxlVGFzayh0cnVlKS5leGVjdXRlKCk7CisgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKExBVU5DSElOR19BQ1RJVklUWSwgVEVTVF9BQ1RJVklUWSk7CisgICAgICAgIGludCB0YXNrTnVtYmVyRmluYWwgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFuZGFyZFRhc2tDb3VudEJ5V2luZG93aW5nTW9kZSgKKyAgICAgICAgICAgICAgICBXSU5ET1dJTkdfTU9ERV9TUExJVF9TQ1JFRU5fU0VDT05EQVJZKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUYXNrIG51bWJlciBtdXN0IGJlIGluY3JlbWVudGVkLiIsIHRhc2tOdW1iZXJJbml0aWFsICsgMSwKKyAgICAgICAgICAgICAgICB0YXNrTnVtYmVyRmluYWwpOworICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRBY3Rpdml0eSgiTGF1bmNoZWQgdG8gc2lkZSBhY3Rpdml0eSBtdXN0IGJlIGluIGZyb250LiIsCisgICAgICAgICAgICAgICAgVEVTVF9BQ1RJVklUWSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoIkxhdW5jaGVkIHRvIHNpZGUgYWN0aXZpdHkgbXVzdCByZW1haW4gaW4gZnVsbHNjcmVlbiBzdGFjay4iLAorICAgICAgICAgICAgICAgIG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFRhc2tCeUFjdGl2aXR5KAorICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9BQ1RJVklUWSwgV0lORE9XSU5HX01PREVfU1BMSVRfU0NSRUVOX1NFQ09OREFSWSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJvdGF0aW9uV2hlbkRvY2tlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBsYXVuY2hBY3Rpdml0aWVzSW5TcGxpdFNjcmVlbigKKyAgICAgICAgICAgICAgICBnZXRMYXVuY2hBY3Rpdml0eUJ1aWxkZXIoKS5zZXRUYXJnZXRBY3Rpdml0eShMQVVOQ0hJTkdfQUNUSVZJVFkpLAorICAgICAgICAgICAgICAgIGdldExhdW5jaEFjdGl2aXR5QnVpbGRlcigpLnNldFRhcmdldEFjdGl2aXR5KFRFU1RfQUNUSVZJVFkpKTsKKyAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRDb250YWluc1N0YWNrKCJNdXN0IGNvbnRhaW4gZnVsbHNjcmVlbiBzdGFjay4iLAorICAgICAgICAgICAgICAgIFdJTkRPV0lOR19NT0RFX1NQTElUX1NDUkVFTl9TRUNPTkRBUlksIEFDVElWSVRZX1RZUEVfU1RBTkRBUkQpOworICAgICAgICBtQW1XbVN0YXRlLmFzc2VydENvbnRhaW5zU3RhY2soIk11c3QgY29udGFpbiBkb2NrZWQgc3RhY2suIiwKKyAgICAgICAgICAgICAgICBXSU5ET1dJTkdfTU9ERV9TUExJVF9TQ1JFRU5fUFJJTUFSWSwgQUNUSVZJVFlfVFlQRV9TVEFOREFSRCk7CisKKyAgICAgICAgLy8gUm90YXRlIGRldmljZSBzaW5nbGUgc3RlcHMgKDkwwrApIDAtMS0yLTMuCisgICAgICAgIC8vIEVhY2ggdGltZSB3ZSBjb21wdXRlIHRoZSBzdGF0ZSB3ZSBpbXBsaWNpdGx5IGFzc2VydCB2YWxpZCBib3VuZHMuCisgICAgICAgIHRyeSAoZmluYWwgUm90YXRpb25TZXNzaW9uIHJvdGF0aW9uU2Vzc2lvbiA9IG5ldyBSb3RhdGlvblNlc3Npb24oKSkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICAgICAgICByb3RhdGlvblNlc3Npb24uc2V0KGkpOworICAgICAgICAgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKExBVU5DSElOR19BQ1RJVklUWSwgVEVTVF9BQ1RJVklUWSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBEb3VibGUgc3RlcHMgKDE4MMKwKSBXZSBlbmRlZCB0aGUgc2luZ2xlIHN0ZXAgYXQgMy4gU28sIHdlIGp1bXAgZGlyZWN0bHkgdG8gMSBmb3IKKyAgICAgICAgICAgIC8vIGRvdWJsZSBzdGVwLiBTbywgd2UgYXJlIHRlc3RpbmcgMy0xLTMgZm9yIG9uZSBzaWRlIGFuZCAwLTItMCBmb3IgdGhlIG90aGVyIHNpZGUuCisgICAgICAgICAgICByb3RhdGlvblNlc3Npb24uc2V0KFJPVEFUSU9OXzkwKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKExBVU5DSElOR19BQ1RJVklUWSwgVEVTVF9BQ1RJVklUWSk7CisgICAgICAgICAgICByb3RhdGlvblNlc3Npb24uc2V0KFJPVEFUSU9OXzI3MCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShMQVVOQ0hJTkdfQUNUSVZJVFksIFRFU1RfQUNUSVZJVFkpOworICAgICAgICAgICAgcm90YXRpb25TZXNzaW9uLnNldChST1RBVElPTl8wKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKExBVU5DSElOR19BQ1RJVklUWSwgVEVTVF9BQ1RJVklUWSk7CisgICAgICAgICAgICByb3RhdGlvblNlc3Npb24uc2V0KFJPVEFUSU9OXzE4MCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShMQVVOQ0hJTkdfQUNUSVZJVFksIFRFU1RfQUNUSVZJVFkpOworICAgICAgICAgICAgcm90YXRpb25TZXNzaW9uLnNldChST1RBVElPTl8wKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKExBVU5DSElOR19BQ1RJVklUWSwgVEVTVF9BQ1RJVklUWSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBQcmVzdWJtaXQKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Um90YXRpb25XaGVuRG9ja2VkV2hpbGVMb2NrZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbGF1bmNoQWN0aXZpdGllc0luU3BsaXRTY3JlZW4oCisgICAgICAgICAgICAgICAgZ2V0TGF1bmNoQWN0aXZpdHlCdWlsZGVyKCkuc2V0VGFyZ2V0QWN0aXZpdHkoTEFVTkNISU5HX0FDVElWSVRZKSwKKyAgICAgICAgICAgICAgICBnZXRMYXVuY2hBY3Rpdml0eUJ1aWxkZXIoKS5zZXRUYXJnZXRBY3Rpdml0eShURVNUX0FDVElWSVRZKSk7CisgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0U2FuaXR5KCk7CisgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Q29udGFpbnNTdGFjaygiTXVzdCBjb250YWluIGZ1bGxzY3JlZW4gc3RhY2suIiwKKyAgICAgICAgICAgICAgICBXSU5ET1dJTkdfTU9ERV9TUExJVF9TQ1JFRU5fU0VDT05EQVJZLCBBQ1RJVklUWV9UWVBFX1NUQU5EQVJEKTsKKyAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRDb250YWluc1N0YWNrKCJNdXN0IGNvbnRhaW4gZG9ja2VkIHN0YWNrLiIsCisgICAgICAgICAgICAgICAgV0lORE9XSU5HX01PREVfU1BMSVRfU0NSRUVOX1BSSU1BUlksIEFDVElWSVRZX1RZUEVfU1RBTkRBUkQpOworCisgICAgICAgIHRyeSAoZmluYWwgUm90YXRpb25TZXNzaW9uIHJvdGF0aW9uU2Vzc2lvbiA9IG5ldyBSb3RhdGlvblNlc3Npb24oKTsKKyAgICAgICAgICAgICBmaW5hbCBMb2NrU2NyZWVuU2Vzc2lvbiBsb2NrU2NyZWVuU2Vzc2lvbiA9IG5ldyBMb2NrU2NyZWVuU2Vzc2lvbigpKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgICAgIGxvY2tTY3JlZW5TZXNzaW9uLnNsZWVwRGV2aWNlKCk7CisgICAgICAgICAgICAgICAgcm90YXRpb25TZXNzaW9uLnNldChpKTsKKyAgICAgICAgICAgICAgICBsb2NrU2NyZWVuU2Vzc2lvbi53YWtlVXBEZXZpY2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnVubG9ja0RldmljZSgpOworICAgICAgICAgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKExBVU5DSElOR19BQ1RJVklUWSwgVEVTVF9BQ1RJVklUWSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNaW5pbWl6ZWRGcm9tRWFjaERvY2tlZFNpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IChmaW5hbCBSb3RhdGlvblNlc3Npb24gcm90YXRpb25TZXNzaW9uID0gbmV3IFJvdGF0aW9uU2Vzc2lvbigpKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICAgICAgICAgIHJvdGF0aW9uU2Vzc2lvbi5zZXQoaSk7CisgICAgICAgICAgICAgICAgbGF1bmNoQWN0aXZpdHlJbkRvY2tTdGFja0FuZE1pbmltaXplKFRFU1RfQUNUSVZJVFkpOworICAgICAgICAgICAgICAgIGlmICghbUFtV21TdGF0ZS5pc1NjcmVlblBvcnRyYWl0KCkgJiYgaXNUYWJsZXQoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBUZXN0IG1pbmltaXplIHRvIHRoZSByaWdodCBvbmx5IG9uIHRhYmxldHMgaW4gbGFuZHNjYXBlCisgICAgICAgICAgICAgICAgICAgIHJlbW92ZVN0YWNrc1dpdGhBY3Rpdml0eVR5cGVzKEFMTF9BQ1RJVklUWV9UWVBFX0JVVF9IT01FKTsKKyAgICAgICAgICAgICAgICAgICAgbGF1bmNoQWN0aXZpdHlJbkRvY2tTdGFja0FuZE1pbmltaXplKFRFU1RfQUNUSVZJVFksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BMSVRfU0NSRUVOX0NSRUFURV9NT0RFX0JPVFRPTV9PUl9SSUdIVCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlbW92ZVN0YWNrc1dpdGhBY3Rpdml0eVR5cGVzKEFMTF9BQ1RJVklUWV9UWVBFX0JVVF9IT01FKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgQFByZXN1Ym1pdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSb3RhdGlvbldoaWxlRG9ja01pbmltaXplZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBsYXVuY2hBY3Rpdml0eUluRG9ja1N0YWNrQW5kTWluaW1pemUoVEVTVF9BQ1RJVklUWSk7CisKKyAgICAgICAgLy8gUm90YXRlIGRldmljZSBzaW5nbGUgc3RlcHMgKDkwwrApIDAtMS0yLTMuCisgICAgICAgIC8vIEVhY2ggdGltZSB3ZSBjb21wdXRlIHRoZSBzdGF0ZSB3ZSBpbXBsaWNpdGx5IGFzc2VydCB2YWxpZCBib3VuZHMgaW4gbWluaW1pemVkIG1vZGUuCisgICAgICAgIHRyeSAoZmluYWwgUm90YXRpb25TZXNzaW9uIHJvdGF0aW9uU2Vzc2lvbiA9IG5ldyBSb3RhdGlvblNlc3Npb24oKSkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICAgICAgICByb3RhdGlvblNlc3Npb24uc2V0KGkpOworICAgICAgICAgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKFRFU1RfQUNUSVZJVFkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBEb3VibGUgc3RlcHMgKDE4MMKwKSBXZSBlbmRlZCB0aGUgc2luZ2xlIHN0ZXAgYXQgMy4gU28sIHdlIGp1bXAgZGlyZWN0bHkgdG8gMSBmb3IKKyAgICAgICAgICAgIC8vIGRvdWJsZSBzdGVwLiBTbywgd2UgYXJlIHRlc3RpbmcgMy0xLTMgZm9yIG9uZSBzaWRlIGFuZCAwLTItMCBmb3IgdGhlIG90aGVyIHNpZGUgaW4KKyAgICAgICAgICAgIC8vIG1pbmltaXplZCBtb2RlLgorICAgICAgICAgICAgcm90YXRpb25TZXNzaW9uLnNldChST1RBVElPTl85MCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShURVNUX0FDVElWSVRZKTsKKyAgICAgICAgICAgIHJvdGF0aW9uU2Vzc2lvbi5zZXQoUk9UQVRJT05fMjcwKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKFRFU1RfQUNUSVZJVFkpOworICAgICAgICAgICAgcm90YXRpb25TZXNzaW9uLnNldChST1RBVElPTl8wKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKFRFU1RfQUNUSVZJVFkpOworICAgICAgICAgICAgcm90YXRpb25TZXNzaW9uLnNldChST1RBVElPTl8xODApOworICAgICAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUoVEVTVF9BQ1RJVklUWSk7CisgICAgICAgICAgICByb3RhdGlvblNlc3Npb24uc2V0KFJPVEFUSU9OXzApOworICAgICAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUoVEVTVF9BQ1RJVklUWSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNaW5pbWl6ZUFuZFVubWluaW1pemVUaGVuR29pbmdIb21lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFJvdGF0ZSB0aGUgc2NyZWVuIHRvIGNoZWNrIHRoYXQgbWluaW1pemUsIHVubWluaW1pemUsIGRpc21pc3MgdGhlIGRvY2tlZCBzdGFjayBhbmQgdGhlbgorICAgICAgICAvLyBnb2luZyBob21lIGhhcyB0aGUgY29ycmVjdCBhcHAgdHJhbnNpdGlvbgorICAgICAgICB0cnkgKGZpbmFsIFJvdGF0aW9uU2Vzc2lvbiByb3RhdGlvblNlc3Npb24gPSBuZXcgUm90YXRpb25TZXNzaW9uKCkpIHsKKyAgICAgICAgICAgIGZvciAoaW50IHJvdGF0aW9uID0gUk9UQVRJT05fMDsgcm90YXRpb24gPD0gUk9UQVRJT05fMjcwOyByb3RhdGlvbisrKSB7CisgICAgICAgICAgICAgICAgcm90YXRpb25TZXNzaW9uLnNldChyb3RhdGlvbik7CisgICAgICAgICAgICAgICAgbGF1bmNoQWN0aXZpdHlJbkRvY2tTdGFja0FuZE1pbmltaXplKERPQ0tFRF9BQ1RJVklUWSk7CisKKyAgICAgICAgICAgICAgICBpZiAobUlzSG9tZVJlY2VudHNDb21wb25lbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgbGF1bmNoQWN0aXZpdHkoVEVTVF9BQ1RJVklUWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5ET1dJTkdfTU9ERV9GVUxMU0NSRUVOX09SX1NQTElUX1NDUkVFTl9TRUNPTkRBUlkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFVubWluaW1pemUgdGhlIGRvY2tlZCBzdGFjaworICAgICAgICAgICAgICAgICAgICBwcmVzc0FwcFN3aXRjaEJ1dHRvbkFuZFdhaXRGb3JSZWNlbnRzKCk7CisgICAgICAgICAgICAgICAgICAgIHdhaXRGb3JEb2NrTm90TWluaW1pemVkKCk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydERvY2tOb3RNaW5pbWl6ZWQoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBEaXNtaXNzIHRoZSBkb2NrIHN0YWNrCisgICAgICAgICAgICAgICAgc2V0QWN0aXZpdHlUYXNrV2luZG93aW5nTW9kZShET0NLRURfQUNUSVZJVFksCisgICAgICAgICAgICAgICAgICAgICAgICBXSU5ET1dJTkdfTU9ERV9GVUxMU0NSRUVOX09SX1NQTElUX1NDUkVFTl9TRUNPTkRBUlkpOworICAgICAgICAgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKERPQ0tFRF9BQ1RJVklUWSk7CisKKyAgICAgICAgICAgICAgICAvLyBHbyBob21lIGFuZCBjaGVjayB0aGUgYXBwIHRyYW5zaXRpb24KKyAgICAgICAgICAgICAgICBhc3NlcnROb3RFcXVhbHMoCisgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU0lUX1dBTExQQVBFUl9PUEVOLCBtQW1XbVN0YXRlLmdldFdtU3RhdGUoKS5nZXRMYXN0VHJhbnNpdGlvbigpKTsKKyAgICAgICAgICAgICAgICBwcmVzc0hvbWVCdXR0b24oKTsKKyAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JIb21lQWN0aXZpdHlWaXNpYmxlKCk7CisgICAgICAgICAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yQXBwVHJhbnNpdGlvbklkbGUoKTsKKworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhUUkFOU0lUX1dBTExQQVBFUl9PUEVOLCBtQW1XbVN0YXRlLmdldFdtU3RhdGUoKS5nZXRMYXN0VHJhbnNpdGlvbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBGbGFreVRlc3QoYnVnSWQgPSA3MzgxMzAzNCkKKyAgICBAVGVzdAorICAgIEBQcmVzdWJtaXQKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmluaXNoRG9ja0FjdGl2aXR5V2hpbGVNaW5pbWl6ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbGF1bmNoQWN0aXZpdHlJbkRvY2tTdGFja0FuZE1pbmltaXplKFRFU1RfQUNUSVZJVFkpOworCisgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoImFtIGJyb2FkY2FzdCAtYSAiICsgVEVTVF9BQ1RJVklUWV9BQ1RJT05fRklOSVNIX1NFTEYpOworICAgICAgICB3YWl0Rm9yRG9ja05vdE1pbmltaXplZCgpOworICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoVEVTVF9BQ1RJVklUWSwgZmFsc2UpOworICAgICAgICBhc3NlcnREb2NrTm90TWluaW1pemVkKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAUHJlc3VibWl0CisgICAgcHVibGljIHZvaWQgdGVzdERvY2tlZFN0YWNrVG9NaW5pbWl6ZVdoZW5VbmxvY2tlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBsYXVuY2hBY3Rpdml0eUluU3BsaXRTY3JlZW5XaXRoUmVjZW50cyhURVNUX0FDVElWSVRZKTsKKyAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUoVEVTVF9BQ1RJVklUWSk7CisgICAgICAgIHRyeSAoZmluYWwgTG9ja1NjcmVlblNlc3Npb24gbG9ja1NjcmVlblNlc3Npb24gPSBuZXcgTG9ja1NjcmVlblNlc3Npb24oKSkgeworICAgICAgICAgICAgbG9ja1NjcmVlblNlc3Npb24uc2xlZXBEZXZpY2UoKQorICAgICAgICAgICAgICAgICAgICAud2FrZVVwRGV2aWNlKCkKKyAgICAgICAgICAgICAgICAgICAgLnVubG9ja0RldmljZSgpOworICAgICAgICAgICAgcHJlc3NIb21lQnV0dG9uKCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JIb21lQWN0aXZpdHlWaXNpYmxlKCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShURVNUX0FDVElWSVRZKTsKKyAgICAgICAgICAgIGFzc2VydERvY2tNaW5pbWl6ZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1pbmltaXplZFN0YXRlV2hlblVubG9ja2VkQW5kVW5NaW5pbWl6ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbGF1bmNoQWN0aXZpdHlJbkRvY2tTdGFja0FuZE1pbmltaXplKFRFU1RfQUNUSVZJVFkpOworCisgICAgICAgIHRyeSAoZmluYWwgTG9ja1NjcmVlblNlc3Npb24gbG9ja1NjcmVlblNlc3Npb24gPSBuZXcgTG9ja1NjcmVlblNlc3Npb24oKSkgeworICAgICAgICAgICAgbG9ja1NjcmVlblNlc3Npb24uc2xlZXBEZXZpY2UoKQorICAgICAgICAgICAgICAgICAgICAud2FrZVVwRGV2aWNlKCkKKyAgICAgICAgICAgICAgICAgICAgLnVubG9ja0RldmljZSgpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUoVEVTVF9BQ1RJVklUWSk7CisKKyAgICAgICAgICAgIC8vIFVubWluaW1pemVkIGJhY2sgdG8gc3BsaXRzY3JlZW4KKyAgICAgICAgICAgIGlmIChtSXNIb21lUmVjZW50c0NvbXBvbmVudCkgeworICAgICAgICAgICAgICAgIGxhdW5jaEFjdGl2aXR5KFJFU0laRUFCTEVfQUNUSVZJVFksCisgICAgICAgICAgICAgICAgICAgICAgICBXSU5ET1dJTkdfTU9ERV9GVUxMU0NSRUVOX09SX1NQTElUX1NDUkVFTl9TRUNPTkRBUlkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcmVzc0FwcFN3aXRjaEJ1dHRvbkFuZFdhaXRGb3JSZWNlbnRzKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShURVNUX0FDVElWSVRZKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgQFByZXN1Ym1pdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNpemVEb2NrZWRTdGFjaygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBsYXVuY2hBY3Rpdml0aWVzSW5TcGxpdFNjcmVlbigKKyAgICAgICAgICAgICAgICBnZXRMYXVuY2hBY3Rpdml0eUJ1aWxkZXIoKS5zZXRUYXJnZXRBY3Rpdml0eShET0NLRURfQUNUSVZJVFkpLAorICAgICAgICAgICAgICAgIGdldExhdW5jaEFjdGl2aXR5QnVpbGRlcigpLnNldFRhcmdldEFjdGl2aXR5KFRFU1RfQUNUSVZJVFkpKTsKKyAgICAgICAgcmVzaXplRG9ja2VkU3RhY2soU1RBQ0tfU0laRSwgU1RBQ0tfU0laRSwgVEFTS19TSVpFLCBUQVNLX1NJWkUpOworICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShmYWxzZSAvKiBjb21wYXJlVGFza0FuZFN0YWNrQm91bmRzICovLAorICAgICAgICAgICAgICAgIG5ldyBXYWl0Rm9yVmFsaWRBY3Rpdml0eVN0YXRlKFRFU1RfQUNUSVZJVFkpLAorICAgICAgICAgICAgICAgIG5ldyBXYWl0Rm9yVmFsaWRBY3Rpdml0eVN0YXRlKERPQ0tFRF9BQ1RJVklUWSkpOworICAgICAgICBtQW1XbVN0YXRlLmFzc2VydENvbnRhaW5zU3RhY2soIk11c3QgY29udGFpbiBzZWNvbmRhcnkgc3BsaXQtc2NyZWVuIHN0YWNrLiIsCisgICAgICAgICAgICAgICAgV0lORE9XSU5HX01PREVfU1BMSVRfU0NSRUVOX1NFQ09OREFSWSwgQUNUSVZJVFlfVFlQRV9TVEFOREFSRCk7CisgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Q29udGFpbnNTdGFjaygiTXVzdCBjb250YWluIHByaW1hcnkgc3BsaXQtc2NyZWVuIHN0YWNrLiIsCisgICAgICAgICAgICAgICAgV0lORE9XSU5HX01PREVfU1BMSVRfU0NSRUVOX1BSSU1BUlksIEFDVElWSVRZX1RZUEVfU1RBTkRBUkQpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IFJlY3QoMCwgMCwgU1RBQ0tfU0laRSwgU1RBQ0tfU0laRSksCisgICAgICAgICAgICAgICAgbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0U3RhbmRhcmRTdGFja0J5V2luZG93aW5nTW9kZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIFdJTkRPV0lOR19NT0RFX1NQTElUX1NDUkVFTl9QUklNQVJZKS5nZXRCb3VuZHMoKSk7CisgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0RG9ja2VkVGFza0JvdW5kcyhUQVNLX1NJWkUsIFRBU0tfU0laRSwgRE9DS0VEX0FDVElWSVRZKTsKKyAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KERPQ0tFRF9BQ1RJVklUWSwgdHJ1ZSk7CisgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShURVNUX0FDVElWSVRZLCB0cnVlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBY3Rpdml0eUxpZmVDeWNsZU9uUmVzaXplRG9ja2VkU3RhY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbGF1bmNoQWN0aXZpdHkoVEVTVF9BQ1RJVklUWSk7CisgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKFRFU1RfQUNUSVZJVFkpOworICAgICAgICBmaW5hbCBSZWN0IGZ1bGxTY3JlZW5Cb3VuZHMgPSBtQW1XbVN0YXRlLmdldFdtU3RhdGUoKS5nZXRTdGFuZGFyZFN0YWNrQnlXaW5kb3dpbmdNb2RlKAorICAgICAgICAgICAgICAgIFdJTkRPV0lOR19NT0RFX0ZVTExTQ1JFRU4pLmdldEJvdW5kcygpOworCisgICAgICAgIHNldEFjdGl2aXR5VGFza1dpbmRvd2luZ01vZGUoVEVTVF9BQ1RJVklUWSwgV0lORE9XSU5HX01PREVfU1BMSVRfU0NSRUVOX1BSSU1BUlkpOworICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShURVNUX0FDVElWSVRZKTsKKyAgICAgICAgbGF1bmNoQWN0aXZpdHkoTk9fUkVMQVVOQ0hfQUNUSVZJVFksIFdJTkRPV0lOR19NT0RFX0ZVTExTQ1JFRU5fT1JfU1BMSVRfU0NSRUVOX1NFQ09OREFSWSk7CisKKyAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUoVEVTVF9BQ1RJVklUWSwgTk9fUkVMQVVOQ0hfQUNUSVZJVFkpOworICAgICAgICBmaW5hbCBSZWN0IGluaXRpYWxEb2NrQm91bmRzID0gbUFtV21TdGF0ZS5nZXRXbVN0YXRlKCkuZ2V0U3RhbmRhcmRTdGFja0J5V2luZG93aW5nTW9kZSgKKyAgICAgICAgICAgICAgICBXSU5ET1dJTkdfTU9ERV9TUExJVF9TQ1JFRU5fUFJJTUFSWSkgLmdldEJvdW5kcygpOworCisgICAgICAgIGZpbmFsIExvZ1NlcGFyYXRvciBsb2dTZXBhcmF0b3IgPSBzZXBhcmF0ZUxvZ3MoKTsKKworICAgICAgICBSZWN0IG5ld0JvdW5kcyA9IGNvbXB1dGVOZXdEb2NrQm91bmRzKGZ1bGxTY3JlZW5Cb3VuZHMsIGluaXRpYWxEb2NrQm91bmRzLCB0cnVlKTsKKyAgICAgICAgcmVzaXplRG9ja2VkU3RhY2soCisgICAgICAgICAgICAgICAgbmV3Qm91bmRzLndpZHRoKCksIG5ld0JvdW5kcy5oZWlnaHQoKSwgbmV3Qm91bmRzLndpZHRoKCksIG5ld0JvdW5kcy5oZWlnaHQoKSk7CisgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKFRFU1RfQUNUSVZJVFksIE5PX1JFTEFVTkNIX0FDVElWSVRZKTsKKworICAgICAgICAvLyBXZSByZXNpemUgdHdpY2UgdG8gbWFrZSBzdXJlIHdlIGNyb3NzIGFuIG9yaWVudGF0aW9uIGNoYW5nZSB0aHJlc2hvbGQgZm9yIGJvdGgKKyAgICAgICAgLy8gYWN0aXZpdGllcy4KKyAgICAgICAgbmV3Qm91bmRzID0gY29tcHV0ZU5ld0RvY2tCb3VuZHMoZnVsbFNjcmVlbkJvdW5kcywgaW5pdGlhbERvY2tCb3VuZHMsIGZhbHNlKTsKKyAgICAgICAgcmVzaXplRG9ja2VkU3RhY2soCisgICAgICAgICAgICAgICAgbmV3Qm91bmRzLndpZHRoKCksIG5ld0JvdW5kcy5oZWlnaHQoKSwgbmV3Qm91bmRzLndpZHRoKCksIG5ld0JvdW5kcy5oZWlnaHQoKSk7CisgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKFRFU1RfQUNUSVZJVFksIE5PX1JFTEFVTkNIX0FDVElWSVRZKTsKKyAgICAgICAgYXNzZXJ0QWN0aXZpdHlMaWZlY3ljbGUoVEVTVF9BQ1RJVklUWSwgdHJ1ZSAvKiByZWxhdW5jaGVkICovLCBsb2dTZXBhcmF0b3IpOworICAgICAgICBhc3NlcnRBY3Rpdml0eUxpZmVjeWNsZShOT19SRUxBVU5DSF9BQ1RJVklUWSwgZmFsc2UgLyogcmVsYXVuY2hlZCAqLywgbG9nU2VwYXJhdG9yKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFJlY3QgY29tcHV0ZU5ld0RvY2tCb3VuZHMoCisgICAgICAgICAgICBSZWN0IGZ1bGxzY3JlZW5Cb3VuZHMsIFJlY3QgZG9ja0JvdW5kcywgYm9vbGVhbiByZWR1Y2VTaXplKSB7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaW5MYW5kc2NhcGUgPSBmdWxsc2NyZWVuQm91bmRzLndpZHRoKCkgPiBkb2NrQm91bmRzLndpZHRoKCk7CisgICAgICAgIC8vIFdlIGFyZSBlaXRoZXIgaW5jcmVhc2luZyBzaXplIG9yIHJlZHVjaW5nIGl0LgorICAgICAgICBmaW5hbCBmbG9hdCBzaXplQ2hhbmdlRmFjdG9yID0gcmVkdWNlU2l6ZSA/IDAuNWYgOiAxLjVmOworICAgICAgICBmaW5hbCBSZWN0IG5ld0JvdW5kcyA9IG5ldyBSZWN0KGRvY2tCb3VuZHMpOworICAgICAgICBpZiAoaW5MYW5kc2NhcGUpIHsKKyAgICAgICAgICAgIC8vIEluIGxhbmRzY2FwZSB3ZSBjaGFuZ2UgdGhlIHdpZHRoLgorICAgICAgICAgICAgbmV3Qm91bmRzLnJpZ2h0ID0gKGludCkgKG5ld0JvdW5kcy5sZWZ0ICsgKG5ld0JvdW5kcy53aWR0aCgpICogc2l6ZUNoYW5nZUZhY3RvcikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gSW4gcG9ydHJhaXQgd2UgY2hhbmdlIHRoZSBoZWlnaHQKKyAgICAgICAgICAgIG5ld0JvdW5kcy5ib3R0b20gPSAoaW50KSAobmV3Qm91bmRzLnRvcCArIChuZXdCb3VuZHMuaGVpZ2h0KCkgKiBzaXplQ2hhbmdlRmFjdG9yKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3Qm91bmRzOworICAgIH0KKworICAgIEBUZXN0CisgICAgQFByZXN1Ym1pdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFja0xpc3RPcmRlckxhdW5jaERvY2tlZEFjdGl2aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc3VtZVRydWUoIW1Jc0hvbWVSZWNlbnRzQ29tcG9uZW50KTsKKworICAgICAgICBsYXVuY2hBY3Rpdml0eUluU3BsaXRTY3JlZW5XaXRoUmVjZW50cyhURVNUX0FDVElWSVRZKTsKKworICAgICAgICBmaW5hbCBpbnQgaG9tZVN0YWNrSW5kZXggPSBtQW1XbVN0YXRlLmdldFN0YWNrSW5kZXhCeUFjdGl2aXR5VHlwZShBQ1RJVklUWV9UWVBFX0hPTUUpOworICAgICAgICBmaW5hbCBpbnQgcmVjZW50c1N0YWNrSW5kZXggPSBtQW1XbVN0YXRlLmdldFN0YWNrSW5kZXhCeUFjdGl2aXR5VHlwZShBQ1RJVklUWV9UWVBFX1JFQ0VOVFMpOworICAgICAgICBhc3NlcnRUaGF0KCJSZWNlbnRzIHN0YWNrIHNob3VsZCBiZSBvbiB0b3Agb2YgaG9tZSBzdGFjayIsCisgICAgICAgICAgICAgICAgcmVjZW50c1N0YWNrSW5kZXgsIGxlc3NUaGFuKGhvbWVTdGFja0luZGV4KSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAUHJlc3VibWl0CisgICAgcHVibGljIHZvaWQgdGVzdFN0YWNrTGlzdE9yZGVyT25TcGxpdFNjcmVlbkRpc21pc3NlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBsYXVuY2hBY3Rpdml0aWVzSW5TcGxpdFNjcmVlbigKKyAgICAgICAgICAgICAgICBnZXRMYXVuY2hBY3Rpdml0eUJ1aWxkZXIoKS5zZXRUYXJnZXRBY3Rpdml0eShET0NLRURfQUNUSVZJVFkpLAorICAgICAgICAgICAgICAgIGdldExhdW5jaEFjdGl2aXR5QnVpbGRlcigpLnNldFRhcmdldEFjdGl2aXR5KFRFU1RfQUNUSVZJVFkpKTsKKworICAgICAgICBzZXRBY3Rpdml0eVRhc2tXaW5kb3dpbmdNb2RlKERPQ0tFRF9BQ1RJVklUWSwgV0lORE9XSU5HX01PREVfRlVMTFNDUkVFTik7CisgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKG5ldyBXYWl0Rm9yVmFsaWRBY3Rpdml0eVN0YXRlLkJ1aWxkZXIoRE9DS0VEX0FDVElWSVRZKQorICAgICAgICAgICAgICAgIC5zZXRXaW5kb3dpbmdNb2RlKFdJTkRPV0lOR19NT0RFX0ZVTExTQ1JFRU4pCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGZpbmFsIGludCBob21lU3RhY2tJbmRleCA9IG1BbVdtU3RhdGUuZ2V0U3RhY2tJbmRleEJ5QWN0aXZpdHlUeXBlKEFDVElWSVRZX1RZUEVfSE9NRSk7CisgICAgICAgIGZpbmFsIGludCBwcmV2U3BsaXRTY3JlZW5QcmltYXJ5SW5kZXggPQorICAgICAgICAgICAgICAgIG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFN0YWNrSW5kZXhCeUFjdGl2aXR5KERPQ0tFRF9BQ1RJVklUWSk7CisgICAgICAgIGZpbmFsIGludCBwcmV2U3BsaXRTY3JlZW5TZWNvbmRhcnlJbmRleCA9CisgICAgICAgICAgICAgICAgbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0U3RhY2tJbmRleEJ5QWN0aXZpdHkoVEVTVF9BQ1RJVklUWSk7CisKKyAgICAgICAgZmluYWwgaW50IGV4cGVjdGVkSG9tZVN0YWNrSW5kZXggPQorICAgICAgICAgICAgICAgIChwcmV2U3BsaXRTY3JlZW5QcmltYXJ5SW5kZXggPiBwcmV2U3BsaXRTY3JlZW5TZWNvbmRhcnlJbmRleAorICAgICAgICAgICAgICAgICAgICAgICAgPyBwcmV2U3BsaXRTY3JlZW5QcmltYXJ5SW5kZXggOiBwcmV2U3BsaXRTY3JlZW5TZWNvbmRhcnlJbmRleCkgLSAxOworICAgICAgICBhc3NlcnRFcXVhbHMoIkhvbWUgc3RhY2sgbmVlZHMgdG8gYmUgZGlyZWN0bHkgYmVoaW5kIHRoZSB0b3Agc3RhY2siLAorICAgICAgICAgICAgICAgIGV4cGVjdGVkSG9tZVN0YWNrSW5kZXgsIGhvbWVTdGFja0luZGV4KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbGF1bmNoQWN0aXZpdHlJbkRvY2tTdGFja0FuZE1pbmltaXplKENvbXBvbmVudE5hbWUgYWN0aXZpdHlOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbGF1bmNoQWN0aXZpdHlJbkRvY2tTdGFja0FuZE1pbmltaXplKGFjdGl2aXR5TmFtZSwgU1BMSVRfU0NSRUVOX0NSRUFURV9NT0RFX1RPUF9PUl9MRUZUKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbGF1bmNoQWN0aXZpdHlJbkRvY2tTdGFja0FuZE1pbmltaXplKENvbXBvbmVudE5hbWUgYWN0aXZpdHlOYW1lLCBpbnQgY3JlYXRlTW9kZSkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBsYXVuY2hBY3Rpdml0eUluU3BsaXRTY3JlZW5XaXRoUmVjZW50cyhhY3Rpdml0eU5hbWUsIGNyZWF0ZU1vZGUpOworICAgICAgICBwcmVzc0hvbWVCdXR0b24oKTsKKyAgICAgICAgd2FpdEZvckFuZEFzc2VydERvY2tNaW5pbWl6ZWQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0RG9ja01pbmltaXplZCgpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtQW1XbVN0YXRlLmdldFdtU3RhdGUoKS5pc0RvY2tlZFN0YWNrTWluaW1pemVkKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB3YWl0Rm9yQW5kQXNzZXJ0RG9ja01pbmltaXplZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB3YWl0Rm9yRG9ja01pbmltaXplZCgpOworICAgICAgICBhc3NlcnREb2NrTWluaW1pemVkKCk7CisgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKFRFU1RfQUNUSVZJVFkpOworICAgICAgICBtQW1XbVN0YXRlLmFzc2VydENvbnRhaW5zU3RhY2soIk11c3QgY29udGFpbiBkb2NrZWQgc3RhY2suIiwKKyAgICAgICAgICAgICAgICBXSU5ET1dJTkdfTU9ERV9TUExJVF9TQ1JFRU5fUFJJTUFSWSwgQUNUSVZJVFlfVFlQRV9TVEFOREFSRCk7CisgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZFN0YWNrKCJIb21lIGFjdGl2aXR5IHNob3VsZCBiZSBmb2N1c2VkIGluIG1pbmltaXplZCBtb2RlIiwKKyAgICAgICAgICAgICAgICBXSU5ET1dJTkdfTU9ERV9VTkRFRklORUQsIEFDVElWSVRZX1RZUEVfSE9NRSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydERvY2tOb3RNaW5pbWl6ZWQoKSB7CisgICAgICAgIGFzc2VydEZhbHNlKG1BbVdtU3RhdGUuZ2V0V21TdGF0ZSgpLmlzRG9ja2VkU3RhY2tNaW5pbWl6ZWQoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdhaXRGb3JEb2NrTWluaW1pemVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvcldpdGhXbVN0YXRlKHN0YXRlIC0+IHN0YXRlLmlzRG9ja2VkU3RhY2tNaW5pbWl6ZWQoKSwKKyAgICAgICAgICAgICAgICAiKioqV2FpdGluZyBmb3IgRG9jayBzdGFjayB0byBiZSBtaW5pbWl6ZWQiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgd2FpdEZvckRvY2tOb3RNaW5pbWl6ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yV2l0aFdtU3RhdGUoc3RhdGUgLT4gIXN0YXRlLmlzRG9ja2VkU3RhY2tNaW5pbWl6ZWQoKSwKKyAgICAgICAgICAgICAgICAiKioqV2FpdGluZyBmb3IgRG9jayBzdGFjayB0byBub3QgYmUgbWluaW1pemVkIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJUcmFuc2l0aW9uU2VsZWN0aW9uVGVzdHMuamF2YSBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlNYW5hZ2VyVHJhbnNpdGlvblNlbGVjdGlvblRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI2ZWVlYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlNYW5hZ2VyVHJhbnNpdGlvblNlbGVjdGlvblRlc3RzLmphdmEKQEAgLTAsMCArMSwzMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLmFtOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuQk9UVE9NX0FDVElWSVRZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLkJvdHRvbUFjdGl2aXR5LkVYVFJBX0JPVFRPTV9XQUxMUEFQRVI7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuQm90dG9tQWN0aXZpdHkuRVhUUkFfU1RPUF9ERUxBWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5UT1BfQUNUSVZJVFk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuVFJBTlNMVUNFTlRfVE9QX0FDVElWSVRZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLlRvcEFjdGl2aXR5LkVYVFJBX0ZJTklTSF9ERUxBWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5Ub3BBY3Rpdml0eS5FWFRSQV9UT1BfV0FMTFBBUEVSOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5XaW5kb3dNYW5hZ2VyU3RhdGUuVFJBTlNJVF9BQ1RJVklUWV9DTE9TRTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uV2luZG93TWFuYWdlclN0YXRlLlRSQU5TSVRfQUNUSVZJVFlfT1BFTjsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uV2luZG93TWFuYWdlclN0YXRlLlRSQU5TSVRfVEFTS19DTE9TRTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uV2luZG93TWFuYWdlclN0YXRlLlRSQU5TSVRfVEFTS19PUEVOOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5XaW5kb3dNYW5hZ2VyU3RhdGUuVFJBTlNJVF9UUkFOU0xVQ0VOVF9BQ1RJVklUWV9DTE9TRTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uV2luZG93TWFuYWdlclN0YXRlLlRSQU5TSVRfV0FMTFBBUEVSX0NMT1NFOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5XaW5kb3dNYW5hZ2VyU3RhdGUuVFJBTlNJVF9XQUxMUEFQRVJfSU5UUkFfQ0xPU0U7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLldpbmRvd01hbmFnZXJTdGF0ZS5UUkFOU0lUX1dBTExQQVBFUl9JTlRSQV9PUEVOOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5XaW5kb3dNYW5hZ2VyU3RhdGUuVFJBTlNJVF9XQUxMUEFQRVJfT1BFTjsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlByZXN1Ym1pdDsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5GbGFreVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzdW1lOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogVGhpcyB0ZXN0IHRlc3RzIHRoZSB0cmFuc2l0aW9uIHR5cGUgc2VsZWN0aW9uIGxvZ2ljIGluIEFjdGl2aXR5TWFuYWdlci9XaW5kb3dNYW5hZ2VyLgorICogQm90dG9tQWN0aXZpdHkgaXMgc3RhcnRlZCBmaXJzdCwgdGhlbiBUb3BBY3Rpdml0eSwgYW5kIHdlIGNoZWNrIHRoZSB0cmFuc2l0aW9uIHR5cGUgdGhhdCB0aGUKKyAqIHN5c3RlbSBzZWxlY3RzIHdoZW4gVG9wQWN0aXZpdHkgZW50ZXJzIG9yIGV4aXRzIHVuZGVyIHZhcmlvdXMgc2V0dXBzLgorICoKKyAqIE5vdGUgdGhhdCB3ZSBvbmx5IHJlcXVpcmUgdGhlIGNvcnJlY3QgdHJhbnNpdGlvbiB0eXBlIHRvIGJlIHJlcG9ydGVkIChlZy4gVFJBTlNJVF9BQ1RJVklUWV9PUEVOLAorICogVFJBTlNJVF9UQVNLX0NMT1NFLCBUUkFOU0lUX1dBTExQQVBFUl9PUEVOLCBldGMuKS4gVGhlIGV4YWN0IGFuaW1hdGlvbiBpcyB1bnNwZWNpZmllZCBhbmQgY2FuIGJlCisgKiBvdmVycmlkZGVuLgorICoKKyAqIDxwPkJ1aWxkL0luc3RhbGwvUnVuOgorICogICAgIGF0ZXN0IEN0c0FjdGl2aXR5TWFuYWdlckRldmljZVRlc3RDYXNlczpBY3Rpdml0eU1hbmFnZXJUcmFuc2l0aW9uU2VsZWN0aW9uVGVzdHMKKyAqLworQFByZXN1Ym1pdAorQEZsYWt5VGVzdChidWdJZCA9IDcxNzkyMzMzKQorcHVibGljIGNsYXNzIEFjdGl2aXR5TWFuYWdlclRyYW5zaXRpb25TZWxlY3Rpb25UZXN0cyBleHRlbmRzIEFjdGl2aXR5TWFuYWdlclRlc3RCYXNlIHsKKworICAgIEBPdmVycmlkZQorICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworCisgICAgICAgIC8vIFRyYW5zaXRpb24gc2VsZWN0aW9uIHRlc3RzIGFyZSBjdXJyZW50bHkgZGlzYWJsZWQgb24gV2VhciBiZWNhdXNlCisgICAgICAgIC8vIGNvbmZpZ193aW5kb3dTd2lwZVRvRGlzbWlzcyBpcyBzZXQgdG8gdHJ1ZSwgd2hpY2ggYnJlYWtzIGFsbCBraW5kcyBvZiBhc3N1bXB0aW9ucyBpbiB0aGUKKyAgICAgICAgLy8gdHJhbnNpdGlvbiBzZWxlY3Rpb24gbG9naWMuCisgICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKCFpc1dhdGNoKCkpOworICAgIH0KKworICAgIC8vIFRlc3QgYWN0aXZpdHkgb3Blbi9jbG9zZSB1bmRlciBub3JtYWwgdGltaW5nCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3BlbkFjdGl2aXR5X05laXRoZXJXYWxscGFwZXIoKSB7CisgICAgICAgIHRlc3RPcGVuQWN0aXZpdHkoZmFsc2UgLypib3R0b21XYWxscGFwZXIqLywgZmFsc2UgLyp0b3BXYWxscGFwZXIqLywKKyAgICAgICAgICAgICAgICBmYWxzZSAvKnNsb3dTdG9wKi8sIFRSQU5TSVRfQUNUSVZJVFlfT1BFTik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc2VBY3Rpdml0eV9OZWl0aGVyV2FsbHBhcGVyKCkgeworICAgICAgICB0ZXN0Q2xvc2VBY3Rpdml0eShmYWxzZSAvKmJvdHRvbVdhbGxwYXBlciovLCBmYWxzZSAvKnRvcFdhbGxwYXBlciovLAorICAgICAgICAgICAgICAgIGZhbHNlIC8qc2xvd1N0b3AqLywgVFJBTlNJVF9BQ1RJVklUWV9DTE9TRSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3BlbkFjdGl2aXR5X0JvdHRvbVdhbGxwYXBlcigpIHsKKyAgICAgICAgdGVzdE9wZW5BY3Rpdml0eSh0cnVlIC8qYm90dG9tV2FsbHBhcGVyKi8sIGZhbHNlIC8qdG9wV2FsbHBhcGVyKi8sCisgICAgICAgICAgICAgICAgZmFsc2UgLypzbG93U3RvcCovLCBUUkFOU0lUX1dBTExQQVBFUl9DTE9TRSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc2VBY3Rpdml0eV9Cb3R0b21XYWxscGFwZXIoKSB7CisgICAgICAgIHRlc3RDbG9zZUFjdGl2aXR5KHRydWUgLypib3R0b21XYWxscGFwZXIqLywgZmFsc2UgLyp0b3BXYWxscGFwZXIqLywKKyAgICAgICAgICAgICAgICBmYWxzZSAvKnNsb3dTdG9wKi8sIFRSQU5TSVRfV0FMTFBBUEVSX09QRU4pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9wZW5BY3Rpdml0eV9Cb3RoV2FsbHBhcGVyKCkgeworICAgICAgICB0ZXN0T3BlbkFjdGl2aXR5KHRydWUgLypib3R0b21XYWxscGFwZXIqLywgdHJ1ZSAvKnRvcFdhbGxwYXBlciovLAorICAgICAgICAgICAgICAgIGZhbHNlIC8qc2xvd1N0b3AqLywgVFJBTlNJVF9XQUxMUEFQRVJfSU5UUkFfT1BFTik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc2VBY3Rpdml0eV9Cb3RoV2FsbHBhcGVyKCkgeworICAgICAgICB0ZXN0Q2xvc2VBY3Rpdml0eSh0cnVlIC8qYm90dG9tV2FsbHBhcGVyKi8sIHRydWUgLyp0b3BXYWxscGFwZXIqLywKKyAgICAgICAgICAgICAgICBmYWxzZSAvKnNsb3dTdG9wKi8sIFRSQU5TSVRfV0FMTFBBUEVSX0lOVFJBX0NMT1NFKTsKKyAgICB9CisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCisKKyAgICAvLyBUZXN0IHRhc2sgb3Blbi9jbG9zZSB1bmRlciBub3JtYWwgdGltaW5nCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3BlblRhc2tfTmVpdGhlcldhbGxwYXBlcigpIHsKKyAgICAgICAgdGVzdE9wZW5UYXNrKGZhbHNlIC8qYm90dG9tV2FsbHBhcGVyKi8sIGZhbHNlIC8qdG9wV2FsbHBhcGVyKi8sCisgICAgICAgICAgICAgICAgZmFsc2UgLypzbG93U3RvcCovLCBUUkFOU0lUX1RBU0tfT1BFTik7CisgICAgfQorCisgICAgQEZsYWt5VGVzdChidWdJZCA9IDcxNzkyMzMzKQorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENsb3NlVGFza19OZWl0aGVyV2FsbHBhcGVyKCkgeworICAgICAgICB0ZXN0Q2xvc2VUYXNrKGZhbHNlIC8qYm90dG9tV2FsbHBhcGVyKi8sIGZhbHNlIC8qdG9wV2FsbHBhcGVyKi8sCisgICAgICAgICAgICAgICAgZmFsc2UgLypzbG93U3RvcCovLCBUUkFOU0lUX1RBU0tfQ0xPU0UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9wZW5UYXNrX0JvdHRvbVdhbGxwYXBlcigpIHsKKyAgICAgICAgdGVzdE9wZW5UYXNrKHRydWUgLypib3R0b21XYWxscGFwZXIqLywgZmFsc2UgLyp0b3BXYWxscGFwZXIqLywKKyAgICAgICAgICAgICAgICBmYWxzZSAvKnNsb3dTdG9wKi8sIFRSQU5TSVRfV0FMTFBBUEVSX0NMT1NFKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9zZVRhc2tfQm90dG9tV2FsbHBhcGVyKCkgeworICAgICAgICB0ZXN0Q2xvc2VUYXNrKHRydWUgLypib3R0b21XYWxscGFwZXIqLywgZmFsc2UgLyp0b3BXYWxscGFwZXIqLywKKyAgICAgICAgICAgICAgICBmYWxzZSAvKnNsb3dTdG9wKi8sIFRSQU5TSVRfV0FMTFBBUEVSX09QRU4pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9wZW5UYXNrX0JvdGhXYWxscGFwZXIoKSB7CisgICAgICAgIHRlc3RPcGVuVGFzayh0cnVlIC8qYm90dG9tV2FsbHBhcGVyKi8sIHRydWUgLyp0b3BXYWxscGFwZXIqLywKKyAgICAgICAgICAgICAgICBmYWxzZSAvKnNsb3dTdG9wKi8sIFRSQU5TSVRfV0FMTFBBUEVSX0lOVFJBX09QRU4pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENsb3NlVGFza19Cb3RoV2FsbHBhcGVyKCkgeworICAgICAgICB0ZXN0Q2xvc2VUYXNrKHRydWUgLypib3R0b21XYWxscGFwZXIqLywgdHJ1ZSAvKnRvcFdhbGxwYXBlciovLAorICAgICAgICAgICAgICAgIGZhbHNlIC8qc2xvd1N0b3AqLywgVFJBTlNJVF9XQUxMUEFQRVJfSU5UUkFfQ0xPU0UpOworICAgIH0KKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KKworICAgIC8vIFRlc3QgYWN0aXZpdHkgY2xvc2UgLS0gYm90dG9tIGFjdGl2aXR5IHNsb3cgaW4gc3RvcHBpbmcKKyAgICAvLyBUaGVzZSBzaW11bGF0ZSB0aGUgY2FzZSB3aGVyZSB0aGUgYm90dG9tIGFjdGl2aXR5IGlzIHJlc3VtZWQKKyAgICAvLyBiZWZvcmUgQU0gcmVjZWl2ZXMgaXRzIGFjdGl2aXRpeVN0b3BwZWQKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9zZUFjdGl2aXR5X05laXRoZXJXYWxscGFwZXJfU2xvd1N0b3AoKSB7CisgICAgICAgIHRlc3RDbG9zZUFjdGl2aXR5KGZhbHNlIC8qYm90dG9tV2FsbHBhcGVyKi8sIGZhbHNlIC8qdG9wV2FsbHBhcGVyKi8sCisgICAgICAgICAgICAgICAgdHJ1ZSAvKnNsb3dTdG9wKi8sIFRSQU5TSVRfQUNUSVZJVFlfQ0xPU0UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENsb3NlQWN0aXZpdHlfQm90dG9tV2FsbHBhcGVyX1Nsb3dTdG9wKCkgeworICAgICAgICB0ZXN0Q2xvc2VBY3Rpdml0eSh0cnVlIC8qYm90dG9tV2FsbHBhcGVyKi8sIGZhbHNlIC8qdG9wV2FsbHBhcGVyKi8sCisgICAgICAgICAgICAgICAgdHJ1ZSAvKnNsb3dTdG9wKi8sIFRSQU5TSVRfV0FMTFBBUEVSX09QRU4pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENsb3NlQWN0aXZpdHlfQm90aFdhbGxwYXBlcl9TbG93U3RvcCgpIHsKKyAgICAgICAgdGVzdENsb3NlQWN0aXZpdHkodHJ1ZSAvKmJvdHRvbVdhbGxwYXBlciovLCB0cnVlIC8qdG9wV2FsbHBhcGVyKi8sCisgICAgICAgICAgICAgICAgdHJ1ZSAvKnNsb3dTdG9wKi8sIFRSQU5TSVRfV0FMTFBBUEVSX0lOVFJBX0NMT1NFKTsKKyAgICB9CisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCisKKyAgICAvLyBUZXN0IHRhc2sgY2xvc2UgLS0gYm90dG9tIHRhc2sgdG9wIGFjdGl2aXR5IHNsb3cgaW4gc3RvcHBpbmcKKyAgICAvLyBUaGVzZSBzaW11bGF0ZSB0aGUgY2FzZSB3aGVyZSB0aGUgYm90dG9tIGFjdGl2aXR5IGlzIHJlc3VtZWQKKyAgICAvLyBiZWZvcmUgQU0gcmVjZWl2ZXMgaXRzIGFjdGl2aXRpeVN0b3BwZWQKKyAgICBARmxha3lUZXN0KGJ1Z0lkID0gNzE3OTIzMzMpCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc2VUYXNrX05laXRoZXJXYWxscGFwZXJfU2xvd1N0b3AoKSB7CisgICAgICAgIHRlc3RDbG9zZVRhc2soZmFsc2UgLypib3R0b21XYWxscGFwZXIqLywgZmFsc2UgLyp0b3BXYWxscGFwZXIqLywKKyAgICAgICAgICAgICAgICB0cnVlIC8qc2xvd1N0b3AqLywgVFJBTlNJVF9UQVNLX0NMT1NFKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9zZVRhc2tfQm90dG9tV2FsbHBhcGVyX1Nsb3dTdG9wKCkgeworICAgICAgICB0ZXN0Q2xvc2VUYXNrKHRydWUgLypib3R0b21XYWxscGFwZXIqLywgZmFsc2UgLyp0b3BXYWxscGFwZXIqLywKKyAgICAgICAgICAgICAgICB0cnVlIC8qc2xvd1N0b3AqLywgVFJBTlNJVF9XQUxMUEFQRVJfT1BFTik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc2VUYXNrX0JvdGhXYWxscGFwZXJfU2xvd1N0b3AoKSB7CisgICAgICAgIHRlc3RDbG9zZVRhc2sodHJ1ZSAvKmJvdHRvbVdhbGxwYXBlciovLCB0cnVlIC8qdG9wV2FsbHBhcGVyKi8sCisgICAgICAgICAgICAgICAgdHJ1ZSAvKnNsb3dTdG9wKi8sIFRSQU5TSVRfV0FMTFBBUEVSX0lOVFJBX0NMT1NFKTsKKyAgICB9CisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCisKKyAgICAvLy8gVGVzdCBjbG9zaW5nIG9mIHRyYW5zbHVjZW50IGFjdGl2aXR5L3Rhc2sKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9zZUFjdGl2aXR5X05laXRoZXJXYWxscGFwZXJfVHJhbnNsdWNlbnQoKSB7CisgICAgICAgIHRlc3RDbG9zZUFjdGl2aXR5VHJhbnNsdWNlbnQoZmFsc2UgLypib3R0b21XYWxscGFwZXIqLywgZmFsc2UgLyp0b3BXYWxscGFwZXIqLywKKyAgICAgICAgICAgICAgICBUUkFOU0lUX1RSQU5TTFVDRU5UX0FDVElWSVRZX0NMT1NFKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9zZUFjdGl2aXR5X0JvdHRvbVdhbGxwYXBlcl9UcmFuc2x1Y2VudCgpIHsKKyAgICAgICAgdGVzdENsb3NlQWN0aXZpdHlUcmFuc2x1Y2VudCh0cnVlIC8qYm90dG9tV2FsbHBhcGVyKi8sIGZhbHNlIC8qdG9wV2FsbHBhcGVyKi8sCisgICAgICAgICAgICAgICAgVFJBTlNJVF9UUkFOU0xVQ0VOVF9BQ1RJVklUWV9DTE9TRSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc2VBY3Rpdml0eV9Cb3RoV2FsbHBhcGVyX1RyYW5zbHVjZW50KCkgeworICAgICAgICB0ZXN0Q2xvc2VBY3Rpdml0eVRyYW5zbHVjZW50KHRydWUgLypib3R0b21XYWxscGFwZXIqLywgdHJ1ZSAvKnRvcFdhbGxwYXBlciovLAorICAgICAgICAgICAgICAgIFRSQU5TSVRfVFJBTlNMVUNFTlRfQUNUSVZJVFlfQ0xPU0UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENsb3NlVGFza19OZWl0aGVyV2FsbHBhcGVyX1RyYW5zbHVjZW50KCkgeworICAgICAgICB0ZXN0Q2xvc2VUYXNrVHJhbnNsdWNlbnQoZmFsc2UgLypib3R0b21XYWxscGFwZXIqLywgZmFsc2UgLyp0b3BXYWxscGFwZXIqLywKKyAgICAgICAgICAgICAgICBUUkFOU0lUX1RSQU5TTFVDRU5UX0FDVElWSVRZX0NMT1NFKTsKKyAgICB9CisKKyAgICBARmxha3lUZXN0KGJ1Z0lkID0gNzE3OTIzMzMpCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc2VUYXNrX0JvdHRvbVdhbGxwYXBlcl9UcmFuc2x1Y2VudCgpIHsKKyAgICAgICAgdGVzdENsb3NlVGFza1RyYW5zbHVjZW50KHRydWUgLypib3R0b21XYWxscGFwZXIqLywgZmFsc2UgLyp0b3BXYWxscGFwZXIqLywKKyAgICAgICAgICAgICAgICBUUkFOU0lUX1RSQU5TTFVDRU5UX0FDVElWSVRZX0NMT1NFKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9zZVRhc2tfQm90aFdhbGxwYXBlcl9UcmFuc2x1Y2VudCgpIHsKKyAgICAgICAgdGVzdENsb3NlVGFza1RyYW5zbHVjZW50KHRydWUgLypib3R0b21XYWxscGFwZXIqLywgdHJ1ZSAvKnRvcFdhbGxwYXBlciovLAorICAgICAgICAgICAgICAgIFRSQU5TSVRfVFJBTlNMVUNFTlRfQUNUSVZJVFlfQ0xPU0UpOworICAgIH0KKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0T3BlbkFjdGl2aXR5KGJvb2xlYW4gYm90dG9tV2FsbHBhcGVyLAorICAgICAgICAgICAgYm9vbGVhbiB0b3BXYWxscGFwZXIsIGJvb2xlYW4gc2xvd1N0b3AsIFN0cmluZyBleHBlY3RlZFRyYW5zaXQpIHsKKyAgICAgICAgdGVzdFRyYW5zaXRpb25TZWxlY3Rpb24odHJ1ZSAvKnRlc3RPcGVuKi8sIGZhbHNlIC8qdGVzdE5ld1Rhc2sqLywKKyAgICAgICAgICAgICAgICBib3R0b21XYWxscGFwZXIsIHRvcFdhbGxwYXBlciwgZmFsc2UgLyp0b3BUcmFuc2x1Y2VudCovLCBzbG93U3RvcCwgZXhwZWN0ZWRUcmFuc2l0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdENsb3NlQWN0aXZpdHkoYm9vbGVhbiBib3R0b21XYWxscGFwZXIsCisgICAgICAgICAgICBib29sZWFuIHRvcFdhbGxwYXBlciwgYm9vbGVhbiBzbG93U3RvcCwgU3RyaW5nIGV4cGVjdGVkVHJhbnNpdCkgeworICAgICAgICB0ZXN0VHJhbnNpdGlvblNlbGVjdGlvbihmYWxzZSAvKnRlc3RPcGVuKi8sIGZhbHNlIC8qdGVzdE5ld1Rhc2sqLywKKyAgICAgICAgICAgICAgICBib3R0b21XYWxscGFwZXIsIHRvcFdhbGxwYXBlciwgZmFsc2UgLyp0b3BUcmFuc2x1Y2VudCovLCBzbG93U3RvcCwgZXhwZWN0ZWRUcmFuc2l0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdE9wZW5UYXNrKGJvb2xlYW4gYm90dG9tV2FsbHBhcGVyLAorICAgICAgICAgICAgYm9vbGVhbiB0b3BXYWxscGFwZXIsIGJvb2xlYW4gc2xvd1N0b3AsIFN0cmluZyBleHBlY3RlZFRyYW5zaXQpIHsKKyAgICAgICAgdGVzdFRyYW5zaXRpb25TZWxlY3Rpb24odHJ1ZSAvKnRlc3RPcGVuKi8sIHRydWUgLyp0ZXN0TmV3VGFzayovLAorICAgICAgICAgICAgICAgIGJvdHRvbVdhbGxwYXBlciwgdG9wV2FsbHBhcGVyLCBmYWxzZSAvKnRvcFRyYW5zbHVjZW50Ki8sIHNsb3dTdG9wLCBleHBlY3RlZFRyYW5zaXQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0Q2xvc2VUYXNrKGJvb2xlYW4gYm90dG9tV2FsbHBhcGVyLAorICAgICAgICAgICAgYm9vbGVhbiB0b3BXYWxscGFwZXIsIGJvb2xlYW4gc2xvd1N0b3AsIFN0cmluZyBleHBlY3RlZFRyYW5zaXQpIHsKKyAgICAgICAgdGVzdFRyYW5zaXRpb25TZWxlY3Rpb24oZmFsc2UgLyp0ZXN0T3BlbiovLCB0cnVlIC8qdGVzdE5ld1Rhc2sqLywKKyAgICAgICAgICAgICAgICBib3R0b21XYWxscGFwZXIsIHRvcFdhbGxwYXBlciwgZmFsc2UgLyp0b3BUcmFuc2x1Y2VudCovLCBzbG93U3RvcCwgZXhwZWN0ZWRUcmFuc2l0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdENsb3NlQWN0aXZpdHlUcmFuc2x1Y2VudChib29sZWFuIGJvdHRvbVdhbGxwYXBlciwKKyAgICAgICAgICAgIGJvb2xlYW4gdG9wV2FsbHBhcGVyLCBTdHJpbmcgZXhwZWN0ZWRUcmFuc2l0KSB7CisgICAgICAgIHRlc3RUcmFuc2l0aW9uU2VsZWN0aW9uKGZhbHNlIC8qdGVzdE9wZW4qLywgZmFsc2UgLyp0ZXN0TmV3VGFzayovLAorICAgICAgICAgICAgICAgIGJvdHRvbVdhbGxwYXBlciwgdG9wV2FsbHBhcGVyLCB0cnVlIC8qdG9wVHJhbnNsdWNlbnQqLywKKyAgICAgICAgICAgICAgICBmYWxzZSAvKnNsb3dTdG9wKi8sIGV4cGVjdGVkVHJhbnNpdCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RDbG9zZVRhc2tUcmFuc2x1Y2VudChib29sZWFuIGJvdHRvbVdhbGxwYXBlciwKKyAgICAgICAgICAgIGJvb2xlYW4gdG9wV2FsbHBhcGVyLCBTdHJpbmcgZXhwZWN0ZWRUcmFuc2l0KSB7CisgICAgICAgIHRlc3RUcmFuc2l0aW9uU2VsZWN0aW9uKGZhbHNlIC8qdGVzdE9wZW4qLywgdHJ1ZSAvKnRlc3ROZXdUYXNrKi8sCisgICAgICAgICAgICAgICAgYm90dG9tV2FsbHBhcGVyLCB0b3BXYWxscGFwZXIsIHRydWUgLyp0b3BUcmFuc2x1Y2VudCovLAorICAgICAgICAgICAgICAgIGZhbHNlIC8qc2xvd1N0b3AqLywgZXhwZWN0ZWRUcmFuc2l0KTsKKyAgICB9CisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCisKKyAgICBwcml2YXRlIHZvaWQgdGVzdFRyYW5zaXRpb25TZWxlY3Rpb24oCisgICAgICAgICAgICBib29sZWFuIHRlc3RPcGVuLCBib29sZWFuIHRlc3ROZXdUYXNrLAorICAgICAgICAgICAgYm9vbGVhbiBib3R0b21XYWxscGFwZXIsIGJvb2xlYW4gdG9wV2FsbHBhcGVyLCBib29sZWFuIHRvcFRyYW5zbHVjZW50LAorICAgICAgICAgICAgYm9vbGVhbiB0ZXN0U2xvd1N0b3AsIFN0cmluZyBleHBlY3RlZFRyYW5zaXQpIHsKKyAgICAgICAgU3RyaW5nIGJvdHRvbVN0YXJ0Q21kID0gZ2V0QW1TdGFydENtZChCT1RUT01fQUNUSVZJVFkpOworICAgICAgICBpZiAoYm90dG9tV2FsbHBhcGVyKSB7CisgICAgICAgICAgICBib3R0b21TdGFydENtZCArPSAiIC0tZXogIiArIEVYVFJBX0JPVFRPTV9XQUxMUEFQRVIgKyAiIHRydWUiOworICAgICAgICB9CisgICAgICAgIGlmICh0ZXN0U2xvd1N0b3ApIHsKKyAgICAgICAgICAgIGJvdHRvbVN0YXJ0Q21kICs9ICIgLS1laSAiICsgRVhUUkFfU1RPUF9ERUxBWSArICIgMzAwMCI7CisgICAgICAgIH0KKyAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChib3R0b21TdGFydENtZCk7CisKKyAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUoQk9UVE9NX0FDVElWSVRZKTsKKworICAgICAgICBmaW5hbCBDb21wb25lbnROYW1lIHRvcEFjdGl2aXR5ID0gdG9wVHJhbnNsdWNlbnQgPyBUUkFOU0xVQ0VOVF9UT1BfQUNUSVZJVFkgOiBUT1BfQUNUSVZJVFk7CisgICAgICAgIFN0cmluZyB0b3BTdGFydENtZCA9IGdldEFtU3RhcnRDbWQodG9wQWN0aXZpdHkpOworICAgICAgICBpZiAodGVzdE5ld1Rhc2spIHsKKyAgICAgICAgICAgIHRvcFN0YXJ0Q21kICs9ICIgLWYgMHgxODAwMDAwMCI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRvcFdhbGxwYXBlcikgeworICAgICAgICAgICAgdG9wU3RhcnRDbWQgKz0gIiAtLWV6ICIgKyBFWFRSQV9UT1BfV0FMTFBBUEVSICsgIiB0cnVlIjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXRlc3RPcGVuKSB7CisgICAgICAgICAgICB0b3BTdGFydENtZCArPSAiIC0tZWkgIiArIEVYVFJBX0ZJTklTSF9ERUxBWSArICIgMTAwMCI7CisgICAgICAgIH0KKyAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZCh0b3BTdGFydENtZCk7CisKKyAgICAgICAgU3lzdGVtQ2xvY2suc2xlZXAoNTAwMCk7CisgICAgICAgIGlmICh0ZXN0T3BlbikgeworICAgICAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUodG9wQWN0aXZpdHkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUoQk9UVE9NX0FDVElWSVRZKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydEVxdWFscygiUGlja2VkIHdyb25nIHRyYW5zaXRpb24iLCBleHBlY3RlZFRyYW5zaXQsCisgICAgICAgICAgICAgICAgbUFtV21TdGF0ZS5nZXRXbVN0YXRlKCkuZ2V0TGFzdFRyYW5zaXRpb24oKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJWckRpc3BsYXlUZXN0cy5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJWckRpc3BsYXlUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiY2RhYmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlclZyRGlzcGxheVRlc3RzLmphdmEKQEAgLTAsMCArMSwyNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW07CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50TmFtZVV0aWxzLmdldEFjdGl2aXR5TmFtZTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5BTFRfTEFVTkNISU5HX0FDVElWSVRZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLkxBVU5DSElOR19BQ1RJVklUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5SRVNJWkVBQkxFX0FDVElWSVRZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLlZSX1RFU1RfQUNUSVZJVFk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5EaXNwbGF5LkRFRkFVTFRfRElTUExBWTsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzdW1lLmFzc3VtZUZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzdW1lLmFzc3VtZVRydWU7CisKK2ltcG9ydCBhbmRyb2lkLnNlcnZlci5hbS5BY3Rpdml0eU1hbmFnZXJTdGF0ZS5BY3Rpdml0eURpc3BsYXk7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQnVpbGQvSW5zdGFsbC9SdW46CisgKiAgICAgYXRlc3QgQ3RzQWN0aXZpdHlNYW5hZ2VyRGV2aWNlVGVzdENhc2VzOkFjdGl2aXR5TWFuYWdlclZyRGlzcGxheVRlc3RzCisgKi8KK3B1YmxpYyBjbGFzcyBBY3Rpdml0eU1hbmFnZXJWckRpc3BsYXlUZXN0cyBleHRlbmRzIEFjdGl2aXR5TWFuYWdlckRpc3BsYXlUZXN0QmFzZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZSX1ZJUlRVQUxfRElTUExBWV9XSURUSCA9IDcwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVlJfVklSVFVBTF9ESVNQTEFZX0hFSUdIVCA9IDkwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVlJfVklSVFVBTF9ESVNQTEFZX0RQSSA9IDMyMDsKKworCisgICAgQEJlZm9yZQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisKKyAgICAgICAgYXNzdW1lVHJ1ZShzdXBwb3J0c1ZyTW9kZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWck1vZGVTZXNzaW9uIGlzIHVzZWQgdG8gZW5hYmxlIG9yIGRpc2FibGUgcGVyc2lzdGVudCB2ciBtb2RlIGFuZCB0aGUgdnIgdmlydHVhbCBkaXNwbGF5LiBGb3IKKyAgICAgKiBzdGFuZGFsb25lIHZyIGRldmljZXMsIFZyTW9kZVNlc3Npb24gaGFzIG5vIGVmZmVjdCwgYmVjYXVzZSB0aGUgZGV2aWNlIGlzIGFscmVhZHkgaW4KKyAgICAgKiBwZXJzaXN0ZW50IHZyIG1vZGUgd2hlbmV2ZXIgaXQncyBvbiwgYW5kIHR1cm5pbmcgb2ZmIHBlcnNpc3RlbnQgdnIgbW9kZSBvbiBhIHN0YW5kYWxvbmUgdnIKKyAgICAgKiBkZXZpY2UgcHV0cyB0aGUgZGV2aWNlIGluIGEgYmFkIHN0YXRlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFZyTW9kZVNlc3Npb24gaW1wbGVtZW50cyBBdXRvQ2xvc2VhYmxlIHsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGFwcGx5VnJNb2RlQ2hhbmdlcyA9ICFBY3Rpdml0eU1hbmFnZXJUZXN0QmFzZS5pc1VpTW9kZUxvY2tlZFRvVnJIZWFkc2V0KCk7CisKKyAgICAgICAgdm9pZCBlbmFibGVQZXJzaXN0ZW50VnJNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAoIWFwcGx5VnJNb2RlQ2hhbmdlcykgeyByZXR1cm47IH0KKyAgICAgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoInNldHByb3AgdnJfdmlydHVhbGRpc3BsYXkgdHJ1ZSIpOworICAgICAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZCgidnIgc2V0LXBlcnNpc3RlbnQtdnItbW9kZS1lbmFibGVkIHRydWUiKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgaWYgKCFhcHBseVZyTW9kZUNoYW5nZXMpIHsgcmV0dXJuOyB9CisgICAgICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKCJ2ciBzZXQtcGVyc2lzdGVudC12ci1tb2RlLWVuYWJsZWQgZmFsc2UiKTsKKyAgICAgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoInNldHByb3AgdnJfdmlydHVhbGRpc3BsYXkgZmFsc2UiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoYXQgYW55IG5ldyBhY3Rpdml0eSBsYXVuY2ggaW4gVnIgbW9kZSBpcyBpbiBWciBkaXNwbGF5LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFZyQWN0aXZpdHlMYXVuY2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzdW1lVHJ1ZShzdXBwb3J0c011bHRpRGlzcGxheSgpKTsKKworICAgICAgICB0cnkgKGZpbmFsIFZyTW9kZVNlc3Npb24gdnJNb2RlU2Vzc2lvbiA9IG5ldyBWck1vZGVTZXNzaW9uKCkpIHsKKyAgICAgICAgICAgIC8vIFB1dCB0aGUgZGV2aWNlIGluIHBlcnNpc3RlbnQgdnIgbW9kZS4KKyAgICAgICAgICAgIHZyTW9kZVNlc3Npb24uZW5hYmxlUGVyc2lzdGVudFZyTW9kZSgpOworCisgICAgICAgICAgICAvLyBMYXVuY2ggdGhlIFZSIGFjdGl2aXR5LgorICAgICAgICAgICAgbGF1bmNoQWN0aXZpdHkoVlJfVEVTVF9BQ1RJVklUWSk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShWUl9URVNUX0FDVElWSVRZKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShWUl9URVNUX0FDVElWSVRZLCB0cnVlIC8qIHZpc2libGUgKi8pOworCisgICAgICAgICAgICAvLyBMYXVuY2ggdGhlIG5vbi1WUiAyRCBhY3Rpdml0eSBhbmQgY2hlY2sgd2hlcmUgaXQgZW5kcyB1cC4KKyAgICAgICAgICAgIGxhdW5jaEFjdGl2aXR5KExBVU5DSElOR19BQ1RJVklUWSk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShMQVVOQ0hJTkdfQUNUSVZJVFkpOworCisgICAgICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgc3Vic2VxdWVudCBhY3Rpdml0eSBpcyB2aXNpYmxlCisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoTEFVTkNISU5HX0FDVElWSVRZLCB0cnVlIC8qIHZpc2libGUgKi8pOworCisgICAgICAgICAgICAvLyBDaGVjayB0aGF0IGFjdGl2aXR5IGlzIGxhdW5jaGVkIGluIGZvY3VzZWQgc3RhY2sgb24gcHJpbWFyeSBkaXNwbGF5LgorICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRGb2N1c2VkQWN0aXZpdHkoIkxhdW5jaGVkIGFjdGl2aXR5IG11c3QgYmUgZm9jdXNlZCIsCisgICAgICAgICAgICAgICAgICAgIExBVU5DSElOR19BQ1RJVklUWSk7CisgICAgICAgICAgICBmaW5hbCBpbnQgZm9jdXNlZFN0YWNrSWQgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRGb2N1c2VkU3RhY2tJZCgpOworICAgICAgICAgICAgZmluYWwgQWN0aXZpdHlNYW5hZ2VyU3RhdGUuQWN0aXZpdHlTdGFjayBmb2N1c2VkU3RhY2sKKyAgICAgICAgICAgICAgICAgICAgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja0J5SWQoZm9jdXNlZFN0YWNrSWQpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJMYXVuY2hlZCBhY3Rpdml0eSBtdXN0IGJlIHJlc3VtZWQgaW4gZm9jdXNlZCBzdGFjayIsCisgICAgICAgICAgICAgICAgICAgIGdldEFjdGl2aXR5TmFtZShMQVVOQ0hJTkdfQUNUSVZJVFkpLCBmb2N1c2VkU3RhY2subVJlc3VtZWRBY3Rpdml0eSk7CisKKyAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBsYXVuY2ggYWN0aXZpdHkgaXMgaW4gVnIgdmlydHVhbCBkaXNwbGF5IGlkLgorICAgICAgICAgICAgZmluYWwgTGlzdDxBY3Rpdml0eURpc3BsYXk+IHJlcG9ydGVkRGlzcGxheXMgPSBnZXREaXNwbGF5c1N0YXRlcygpOworICAgICAgICAgICAgZmluYWwgQWN0aXZpdHlEaXNwbGF5IHZyRGlzcGxheSA9IGdldERpc3BsYXlTdGF0ZShyZXBvcnRlZERpc3BsYXlzLAorICAgICAgICAgICAgICAgICAgICBWUl9WSVJUVUFMX0RJU1BMQVlfV0lEVEgsIFZSX1ZJUlRVQUxfRElTUExBWV9IRUlHSFQsIFZSX1ZJUlRVQUxfRElTUExBWV9EUEkpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiVnIgbW9kZSBzaG91bGQgaGF2ZSBhIHZpcnR1YWwgZGlzcGxheSIsIHZyRGlzcGxheSk7CisKKyAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBmb2N1c2VkIGFjdGl2aXR5IGlzIG9uIHRoaXMgdmlydHVhbCBzdGFjay4KKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiTGF1bmNoIGluIFZyIG1vZGUgc2hvdWxkIGJlIGluIHZpcnR1YWwgc3RhY2siLCB2ckRpc3BsYXkubUlkLAorICAgICAgICAgICAgICAgICAgICBmb2N1c2VkU3RhY2subURpc3BsYXlJZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB0aGF0IGFueSBhY3Rpdml0eSBhbHJlYWR5IHByZXNlbnQgaXMgcmUtbGF1bmNoZWQgaW4gVnIgZGlzcGxheSBpbiB2ciBtb2RlLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFZyQWN0aXZpdHlSZUxhdW5jaCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3N1bWVUcnVlKHN1cHBvcnRzTXVsdGlEaXNwbGF5KCkpOworCisgICAgICAgIC8vIExhdW5jaCBhIDJEIGFjdGl2aXR5LgorICAgICAgICBsYXVuY2hBY3Rpdml0eShMQVVOQ0hJTkdfQUNUSVZJVFkpOworCisgICAgICAgIHRyeSAoZmluYWwgVnJNb2RlU2Vzc2lvbiB2ck1vZGVTZXNzaW9uID0gbmV3IFZyTW9kZVNlc3Npb24oKSkgeworICAgICAgICAgICAgLy8gUHV0IHRoZSBkZXZpY2UgaW4gcGVyc2lzdGVudCB2ciBtb2RlLgorICAgICAgICAgICAgdnJNb2RlU2Vzc2lvbi5lbmFibGVQZXJzaXN0ZW50VnJNb2RlKCk7CisKKyAgICAgICAgICAgIC8vIExhdW5jaCB0aGUgVlIgYWN0aXZpdHkuCisgICAgICAgICAgICBsYXVuY2hBY3Rpdml0eShWUl9URVNUX0FDVElWSVRZKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKFZSX1RFU1RfQUNUSVZJVFkpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFZSX1RFU1RfQUNUSVZJVFksIHRydWUgLyogdmlzaWJsZSAqLyk7CisKKyAgICAgICAgICAgIC8vIFJlLWxhdW5jaCB0aGUgbm9uLVZSIDJEIGFjdGl2aXR5IGFuZCBjaGVjayB3aGVyZSBpdCBlbmRzIHVwLgorICAgICAgICAgICAgbGF1bmNoQWN0aXZpdHkoTEFVTkNISU5HX0FDVElWSVRZKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKExBVU5DSElOR19BQ1RJVklUWSk7CisKKyAgICAgICAgICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBzdWJzZXF1ZW50IGFjdGl2aXR5IGlzIHZpc2libGUKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShMQVVOQ0hJTkdfQUNUSVZJVFksIHRydWUgLyogdmlzaWJsZSAqLyk7CisKKyAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgYWN0aXZpdHkgaXMgbGF1bmNoZWQgaW4gZm9jdXNlZCBzdGFjayBvbiBwcmltYXJ5IGRpc3BsYXkuCisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRBY3Rpdml0eSgiTGF1bmNoZWQgYWN0aXZpdHkgbXVzdCBiZSBmb2N1c2VkIiwKKyAgICAgICAgICAgICAgICAgICAgTEFVTkNISU5HX0FDVElWSVRZKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBmb2N1c2VkU3RhY2tJZCA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEZvY3VzZWRTdGFja0lkKCk7CisgICAgICAgICAgICBmaW5hbCBBY3Rpdml0eU1hbmFnZXJTdGF0ZS5BY3Rpdml0eVN0YWNrIGZvY3VzZWRTdGFjaworICAgICAgICAgICAgICAgICAgICA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFN0YWNrQnlJZChmb2N1c2VkU3RhY2tJZCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkxhdW5jaGVkIGFjdGl2aXR5IG11c3QgYmUgcmVzdW1lZCBpbiBmb2N1c2VkIHN0YWNrIiwKKyAgICAgICAgICAgICAgICAgICAgZ2V0QWN0aXZpdHlOYW1lKExBVU5DSElOR19BQ1RJVklUWSksIGZvY3VzZWRTdGFjay5tUmVzdW1lZEFjdGl2aXR5KTsKKworICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGxhdW5jaCBhY3Rpdml0eSBpcyBpbiBWciB2aXJ0dWFsIGRpc3BsYXkgaWQuCisgICAgICAgICAgICBmaW5hbCBMaXN0PEFjdGl2aXR5RGlzcGxheT4gcmVwb3J0ZWREaXNwbGF5cyA9IGdldERpc3BsYXlzU3RhdGVzKCk7CisgICAgICAgICAgICBmaW5hbCBBY3Rpdml0eURpc3BsYXkgdnJEaXNwbGF5ID0gZ2V0RGlzcGxheVN0YXRlKHJlcG9ydGVkRGlzcGxheXMsCisgICAgICAgICAgICAgICAgICAgIFZSX1ZJUlRVQUxfRElTUExBWV9XSURUSCwgVlJfVklSVFVBTF9ESVNQTEFZX0hFSUdIVCwgVlJfVklSVFVBTF9ESVNQTEFZX0RQSSk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJWciBtb2RlIHNob3VsZCBoYXZlIGEgdmlydHVhbCBkaXNwbGF5IiwgdnJEaXNwbGF5KTsKKworICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGZvY3VzZWQgYWN0aXZpdHkgaXMgb24gdGhpcyB2aXJ0dWFsIHN0YWNrLgorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJMYXVuY2ggaW4gVnIgbW9kZSBzaG91bGQgYmUgaW4gdmlydHVhbCBzdGFjayIsIHZyRGlzcGxheS5tSWQsCisgICAgICAgICAgICAgICAgICAgIGZvY3VzZWRTdGFjay5tRGlzcGxheUlkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoYXQgYW55IG5ldyBhY3Rpdml0eSBsYXVuY2ggcG9zdCBWciBtb2RlIGlzIGluIHRoZSBtYWluIGRpc3BsYXkuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWN0aXZpdHlMYXVuY2hQb3N0VnIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzdW1lVHJ1ZShzdXBwb3J0c011bHRpRGlzcGxheSgpKTsKKyAgICAgICAgLy8gVGhpcyB0ZXN0IGRvZXNuJ3QgYXBwbHkgdG8gYSBzdGFuZGFsb25lIHZyIGRldmljZSwgc2luY2UgdnIgaXMgYWx3YXlzIGVuYWJsZWQsIGFuZAorICAgICAgICAvLyB0aGVyZSBpcyBubyAicG9zdCB2ciIgYmVoYXZpb3IgdG8gdmVyaWZ5LgorICAgICAgICBhc3N1bWVGYWxzZShpc1VpTW9kZUxvY2tlZFRvVnJIZWFkc2V0KCkpOworCisgICAgICAgIHRyeSAoZmluYWwgVnJNb2RlU2Vzc2lvbiB2ck1vZGVTZXNzaW9uID0gbmV3IFZyTW9kZVNlc3Npb24oKSkgeworICAgICAgICAgICAgLy8gUHV0IHRoZSBkZXZpY2UgaW4gcGVyc2lzdGVudCB2ciBtb2RlLgorICAgICAgICAgICAgdnJNb2RlU2Vzc2lvbi5lbmFibGVQZXJzaXN0ZW50VnJNb2RlKCk7CisKKyAgICAgICAgICAgIC8vIExhdW5jaCB0aGUgVlIgYWN0aXZpdHkuCisgICAgICAgICAgICBsYXVuY2hBY3Rpdml0eShWUl9URVNUX0FDVElWSVRZKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKFZSX1RFU1RfQUNUSVZJVFkpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFZSX1RFU1RfQUNUSVZJVFksIHRydWUgLyogdmlzaWJsZSAqLyk7CisKKyAgICAgICAgICAgIC8vIExhdW5jaCB0aGUgbm9uLVZSIDJEIGFjdGl2aXR5IGFuZCBjaGVjayB3aGVyZSBpdCBlbmRzIHVwLgorICAgICAgICAgICAgbGF1bmNoQWN0aXZpdHkoQUxUX0xBVU5DSElOR19BQ1RJVklUWSk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShBTFRfTEFVTkNISU5HX0FDVElWSVRZKTsKKworICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlIHN1YnNlcXVlbnQgYWN0aXZpdHkgaXMgdmlzaWJsZQorICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KEFMVF9MQVVOQ0hJTkdfQUNUSVZJVFksIHRydWUgLyogdmlzaWJsZSAqLyk7CisKKyAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgYWN0aXZpdHkgaXMgbGF1bmNoZWQgaW4gZm9jdXNlZCBzdGFjayBvbiBwcmltYXJ5IGRpc3BsYXkuCisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEZvY3VzZWRBY3Rpdml0eSgiTGF1bmNoZWQgYWN0aXZpdHkgbXVzdCBiZSBmb2N1c2VkIiwKKyAgICAgICAgICAgICAgICAgICAgQUxUX0xBVU5DSElOR19BQ1RJVklUWSk7CisgICAgICAgICAgICBmaW5hbCBpbnQgZm9jdXNlZFN0YWNrSWQgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRGb2N1c2VkU3RhY2tJZCgpOworICAgICAgICAgICAgZmluYWwgQWN0aXZpdHlNYW5hZ2VyU3RhdGUuQWN0aXZpdHlTdGFjayBmb2N1c2VkU3RhY2sKKyAgICAgICAgICAgICAgICAgICAgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja0J5SWQoZm9jdXNlZFN0YWNrSWQpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJMYXVuY2hlZCBhY3Rpdml0eSBtdXN0IGJlIHJlc3VtZWQgaW4gZm9jdXNlZCBzdGFjayIsCisgICAgICAgICAgICAgICAgICAgIGdldEFjdGl2aXR5TmFtZShBTFRfTEFVTkNISU5HX0FDVElWSVRZKSwKKyAgICAgICAgICAgICAgICAgICAgZm9jdXNlZFN0YWNrLm1SZXN1bWVkQWN0aXZpdHkpOworCisgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgbGF1bmNoIGFjdGl2aXR5IGlzIGluIFZyIHZpcnR1YWwgZGlzcGxheSBpZC4KKyAgICAgICAgICAgIGZpbmFsIExpc3Q8QWN0aXZpdHlEaXNwbGF5PiByZXBvcnRlZERpc3BsYXlzID0gZ2V0RGlzcGxheXNTdGF0ZXMoKTsKKyAgICAgICAgICAgIGZpbmFsIEFjdGl2aXR5RGlzcGxheSB2ckRpc3BsYXkgPSBnZXREaXNwbGF5U3RhdGUocmVwb3J0ZWREaXNwbGF5cywKKyAgICAgICAgICAgICAgICAgICAgVlJfVklSVFVBTF9ESVNQTEFZX1dJRFRILCBWUl9WSVJUVUFMX0RJU1BMQVlfSEVJR0hULAorICAgICAgICAgICAgICAgICAgICBWUl9WSVJUVUFMX0RJU1BMQVlfRFBJKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIlZyIG1vZGUgc2hvdWxkIGhhdmUgYSB2aXJ0dWFsIGRpc3BsYXkiLCB2ckRpc3BsYXkpOworCisgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgZm9jdXNlZCBhY3Rpdml0eSBpcyBvbiB0aGlzIHZpcnR1YWwgc3RhY2suCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkxhdW5jaCBpbiBWciBtb2RlIHNob3VsZCBiZSBpbiB2aXJ0dWFsIHN0YWNrIiwgdnJEaXNwbGF5Lm1JZCwKKyAgICAgICAgICAgICAgICAgICAgZm9jdXNlZFN0YWNrLm1EaXNwbGF5SWQpOworCisgICAgICAgIH0KKworICAgICAgICAvLyBUaGVyZSBpc24ndCBhIGRpcmVjdCBsYXVuY2ggb2YgYWN0aXZpdHkgd2hpY2ggY2FuIHRha2UgYW4gdXNlciBvdXQgb2YgcGVyc2lzdGVudCBWUiBtb2RlLgorICAgICAgICAvLyBUaGlzIHNsZWVwIGlzIHRvIGFjY291bnQgZm9yIHRoYXQgZGVsYXkgYW5kIGxldCBkZXZpY2Ugc2V0dGxlIG9uY2UgaXQgY29tZXMgb3V0IG9mIFZSCisgICAgICAgIC8vIG1vZGUuCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMjAwMCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gTGF1bmNoIHRoZSBub24tVlIgMkQgYWN0aXZpdHkgYW5kIGNoZWNrIHdoZXJlIGl0IGVuZHMgdXAuCisgICAgICAgIGxhdW5jaEFjdGl2aXR5KFJFU0laRUFCTEVfQUNUSVZJVFkpOworICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShSRVNJWkVBQkxFX0FDVElWSVRZKTsKKworICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgc3Vic2VxdWVudCBhY3Rpdml0eSBpcyB2aXNpYmxlCisgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShSRVNJWkVBQkxFX0FDVElWSVRZLCB0cnVlIC8qIHZpc2libGUgKi8pOworCisgICAgICAgIC8vIENoZWNrIHRoYXQgYWN0aXZpdHkgaXMgbGF1bmNoZWQgaW4gZm9jdXNlZCBzdGFjayBvbiBwcmltYXJ5IGRpc3BsYXkuCisgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Rm9jdXNlZEFjdGl2aXR5KCJMYXVuY2hlZCBhY3Rpdml0eSBtdXN0IGJlIGZvY3VzZWQiLCBSRVNJWkVBQkxFX0FDVElWSVRZKTsKKyAgICAgICAgZmluYWwgaW50IGZyb250U3RhY2tJZCA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEZyb250U3RhY2tJZChERUZBVUxUX0RJU1BMQVkpOworICAgICAgICBmaW5hbCBBY3Rpdml0eU1hbmFnZXJTdGF0ZS5BY3Rpdml0eVN0YWNrIGZyb250U3RhY2sKKyAgICAgICAgICAgICAgICA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFN0YWNrQnlJZChmcm9udFN0YWNrSWQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkxhdW5jaGVkIGFjdGl2aXR5IG11c3QgYmUgcmVzdW1lZCBpbiBmcm9udCBzdGFjayIsCisgICAgICAgICAgICAgICAgZ2V0QWN0aXZpdHlOYW1lKFJFU0laRUFCTEVfQUNUSVZJVFkpLCBmcm9udFN0YWNrLm1SZXN1bWVkQWN0aXZpdHkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkZyb250IHN0YWNrIG11c3QgYmUgb24gcHJpbWFyeSBkaXNwbGF5IiwKKyAgICAgICAgICAgICAgICBERUZBVUxUX0RJU1BMQVksIGZyb250U3RhY2subURpc3BsYXlJZCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9BbmltYXRpb25CYWNrZ3JvdW5kVGVzdHMuamF2YSBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vQW5pbWF0aW9uQmFja2dyb3VuZFRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAyMmM4NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vQW5pbWF0aW9uQmFja2dyb3VuZFRlc3RzLmphdmEKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW07CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuV2luZG93Q29uZmlndXJhdGlvbi5XSU5ET1dJTkdfTU9ERV9GUkVFRk9STTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuV2luZG93Q29uZmlndXJhdGlvbi5XSU5ET1dJTkdfTU9ERV9GVUxMU0NSRUVOOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLkFOSU1BVElPTl9URVNUX0FDVElWSVRZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLkxBVU5DSElOR19BQ1RJVklUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LkRpc3BsYXkuREVGQVVMVF9ESVNQTEFZOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc3VtZS5hc3N1bWVGYWxzZTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuc2VydmVyLmFtLldpbmRvd01hbmFnZXJTdGF0ZS5EaXNwbGF5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogQnVpbGQvSW5zdGFsbC9SdW46CisgKiAgICAgYXRlc3QgQ3RzQWN0aXZpdHlNYW5hZ2VyRGV2aWNlVGVzdENhc2VzOkFuaW1hdGlvbkJhY2tncm91bmRUZXN0cworICovCitwdWJsaWMgY2xhc3MgQW5pbWF0aW9uQmFja2dyb3VuZFRlc3RzIGV4dGVuZHMgQWN0aXZpdHlNYW5hZ2VyVGVzdEJhc2UgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QW5pbWF0aW9uQmFja2dyb3VuZF9kdXJpbmdBbmltYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbGF1bmNoQWN0aXZpdHlPbkRpc3BsYXkoTEFVTkNISU5HX0FDVElWSVRZLCBERUZBVUxUX0RJU1BMQVkpOworICAgICAgICBnZXRMYXVuY2hBY3Rpdml0eUJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRUYXJnZXRBY3Rpdml0eShBTklNQVRJT05fVEVTVF9BQ1RJVklUWSkKKyAgICAgICAgICAgICAgICAuc2V0V2FpdEZvckxhdW5jaGVkKGZhbHNlKQorICAgICAgICAgICAgICAgIC5leGVjdXRlKCk7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHdlJ3JlIHRlc3RpbmcgYW4gYWN0aXZpdHkgdGhhdCBydW5zIG9uIGZ1bGxzY3JlZW4gZGlzcGxheS4gVGhpcyBhbmltYXRpb24gQVBJCisgICAgICAgIC8vIGRvZXNuJ3QgbWFrZSBtdWNoIHNlbnNlIGluIGZyZWVmb3JtIGRpc3BsYXlzLgorICAgICAgICBhc3N1bWVBY3Rpdml0eU5vdEluRnJlZWZvcm1EaXNwbGF5KEFOSU1BVElPTl9URVNUX0FDVElWSVRZKTsKKworICAgICAgICAvLyBNYWtlIHN1cmUgd2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgdGhlIGFuaW1hdGlvbi4KKyAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yV2l0aFdtU3RhdGUoc3RhdGUgLT4gc3RhdGUKKyAgICAgICAgICAgICAgICAuZ2V0U3RhbmRhcmRTdGFja0J5V2luZG93aW5nTW9kZShXSU5ET1dJTkdfTU9ERV9GVUxMU0NSRUVOKQorICAgICAgICAgICAgICAgICAgICAgICAgLmlzV2luZG93QW5pbWF0aW9uQmFja2dyb3VuZFN1cmZhY2VTaG93aW5nKCksCisgICAgICAgICAgICAgICAgIioqKldhaXRpbmcgZm9yIGFuaW1hdGlvbiBiYWNrZ3JvdW5kIHNob3dpbmciKTsKKworICAgICAgICBhc3NlcnRUcnVlKCJ3aW5kb3cgYW5pbWF0aW9uIGJhY2tncm91bmQgbmVlZHMgdG8gYmUgc2hvd2luZyIsIG1BbVdtU3RhdGUuZ2V0V21TdGF0ZSgpCisgICAgICAgICAgICAgICAgLmdldFN0YW5kYXJkU3RhY2tCeVdpbmRvd2luZ01vZGUoV0lORE9XSU5HX01PREVfRlVMTFNDUkVFTikKKyAgICAgICAgICAgICAgICAuaXNXaW5kb3dBbmltYXRpb25CYWNrZ3JvdW5kU3VyZmFjZVNob3dpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QW5pbWF0aW9uQmFja2dyb3VuZF9nb25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGxhdW5jaEFjdGl2aXR5T25EaXNwbGF5KExBVU5DSElOR19BQ1RJVklUWSwgREVGQVVMVF9ESVNQTEFZKTsKKyAgICAgICAgZ2V0TGF1bmNoQWN0aXZpdHlCdWlsZGVyKCkuc2V0VGFyZ2V0QWN0aXZpdHkoQU5JTUFUSU9OX1RFU1RfQUNUSVZJVFkpLmV4ZWN1dGUoKTsKKyAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUoQU5JTUFUSU9OX1RFU1RfQUNUSVZJVFkpOworICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JBcHBUcmFuc2l0aW9uSWRsZSgpOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSdyZSB0ZXN0aW5nIGFuIGFjdGl2aXR5IHRoYXQgcnVucyBvbiBmdWxsc2NyZWVuIGRpc3BsYXkuIFRoaXMgYW5pbWF0aW9uIEFQSQorICAgICAgICAvLyBkb2Vzbid0IG1ha2UgbXVjaCBzZW5zZSBpbiBmcmVlZm9ybSBkaXNwbGF5cy4KKyAgICAgICAgYXNzdW1lQWN0aXZpdHlOb3RJbkZyZWVmb3JtRGlzcGxheShBTklNQVRJT05fVEVTVF9BQ1RJVklUWSk7CisKKyAgICAgICAgYXNzZXJ0RmFsc2UoIndpbmRvdyBhbmltYXRpb24gYmFja2dyb3VuZCBuZWVkcyB0byBiZSBnb25lIiwgbUFtV21TdGF0ZS5nZXRXbVN0YXRlKCkKKyAgICAgICAgICAgICAgICAuZ2V0U3RhbmRhcmRTdGFja0J5V2luZG93aW5nTW9kZShXSU5ET1dJTkdfTU9ERV9GVUxMU0NSRUVOKQorICAgICAgICAgICAgICAgIC5pc1dpbmRvd0FuaW1hdGlvbkJhY2tncm91bmRTdXJmYWNlU2hvd2luZygpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzdW1lQWN0aXZpdHlOb3RJbkZyZWVmb3JtRGlzcGxheShDb21wb25lbnROYW1lIGFjdGl2aXR5KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yVmFsaWRTdGF0ZShhY3Rpdml0eSk7CisgICAgICAgIGZpbmFsIGludCBkaXNwbGF5SWQgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXREaXNwbGF5QnlBY3Rpdml0eShhY3Rpdml0eSk7CisgICAgICAgIGZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG1BbVdtU3RhdGUuZ2V0V21TdGF0ZSgpLmdldERpc3BsYXkoZGlzcGxheUlkKTsKKyAgICAgICAgYXNzdW1lRmFsc2UoIkFuaW1hdGlvbiB0ZXN0IGFjdGl2aXR5IGlzIGluIGZyZWVmb3JtIGRpc3BsYXkuIEl0IG1heSBub3QgcnVuICIKKyAgICAgICAgICAgICAgICArICJjcm9zcy10YXNrIGFuaW1hdGlvbnMuIiwgZGlzcGxheS5nZXRXaW5kb3dpbmdNb2RlKCkgPT0gV0lORE9XSU5HX01PREVfRlJFRUZPUk0pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vQXNwZWN0UmF0aW9UZXN0cy5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9Bc3BlY3RSYXRpb1Rlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM4YWQyOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vQXNwZWN0UmF0aW9UZXN0cy5qYXZhCkBAIC0wLDAgKzEsMTY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLmFtOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5Db250ZXh0LldJTkRPV19TRVJWSUNFOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9XQVRDSDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUHJlc3VibWl0OworaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuRGlzcGxheTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuUG9sbGluZ0NoZWNrOworCitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworCisvKioKKyAqIEJ1aWxkL0luc3RhbGwvUnVuOgorICogICAgIGF0ZXN0IEN0c0FjdGl2aXR5TWFuYWdlckRldmljZVRlc3RDYXNlczpBc3BlY3RSYXRpb1Rlc3RzCisgKi8KK0BSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCitAUHJlc3VibWl0CitwdWJsaWMgY2xhc3MgQXNwZWN0UmF0aW9UZXN0cyBleHRlbmRzIEFzcGVjdFJhdGlvVGVzdHNCYXNlIHsKKworICAgIC8vIFRoZSBtYXguIGFzcGVjdCByYXRpbyB0aGUgdGVzdCBhY3Rpdml0aWVzIGFyZSB1c2luZy4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBNQVhfQVNQRUNUX1JBVElPID0gMS4wZjsKKworICAgIC8vIFRoZSBtaW5pbXVtIHN1cHBvcnRlZCBkZXZpY2UgYXNwZWN0IHJhdGlvLgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IE1JTl9ERVZJQ0VfQVNQRUNUX1JBVElPID0gMS4zMzNmOworCisgICAgLy8gVGhlIG1pbmltdW0gc3VwcG9ydGVkIGRldmljZSBhc3BlY3QgcmF0aW8gZm9yIHdhdGNoZXMuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgTUlOX1dBVENIX0RFVklDRV9BU1BFQ1RfUkFUSU8gPSAxLjBmOworCisgICAgLy8gVGVzdCB0YXJnZXQgYWN0aXZpdHkgdGhhdCBoYXMgbWF4QXNwZWN0UmF0aW89InRydWUiIGFuZCByZXNpemVhYmxlQWN0aXZpdHk9ImZhbHNlIi4KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1heEFzcGVjdFJhdGlvQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgfQorCisgICAgLy8gVGVzdCB0YXJnZXQgYWN0aXZpdHkgdGhhdCBoYXMgbWF4QXNwZWN0UmF0aW89IjEuMCIgYW5kIHJlc2l6ZWFibGVBY3Rpdml0eT0idHJ1ZSIuCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNYXhBc3BlY3RSYXRpb1Jlc2l6ZWFibGVBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICB9CisKKyAgICAvLyBUZXN0IHRhcmdldCBhY3Rpdml0eSB0aGF0IGhhcyBubyBtYXhBc3BlY3RSYXRpbyBkZWZpbmVkIGFuZCByZXNpemVhYmxlQWN0aXZpdHk9ImZhbHNlIi4KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1heEFzcGVjdFJhdGlvVW5zZXRBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICB9CisKKyAgICAvLyBUZXN0IHRhcmdldCBhY3Rpdml0eSB0aGF0IGhhcyBtYXhBc3BlY3RSYXRpbyBkZWZpbmVkIGFzCisgICAgLy8gICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5tYXhfYXNwZWN0IiBhbmRyb2lkOnZhbHVlPSIxLjAiIC8+CisgICAgLy8gYW5kIHJlc2l6ZWFibGVBY3Rpdml0eT0iZmFsc2UiLgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWV0YURhdGFNYXhBc3BlY3RSYXRpb0FjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIH0KKworICAgIEBSdWxlCisgICAgcHVibGljIEFjdGl2aXR5VGVzdFJ1bGU8TWF4QXNwZWN0UmF0aW9BY3Rpdml0eT4gbU1heEFzcGVjdFJhdGlvQWN0aXZpdHkgPQorICAgICAgICAgICAgbmV3IEFjdGl2aXR5VGVzdFJ1bGU8PihNYXhBc3BlY3RSYXRpb0FjdGl2aXR5LmNsYXNzLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBpbml0aWFsVG91Y2hNb2RlICovLCBmYWxzZSAvKiBsYXVuY2hBY3Rpdml0eSAqLyk7CisKKyAgICBAUnVsZQorICAgIHB1YmxpYyBBY3Rpdml0eVRlc3RSdWxlPE1heEFzcGVjdFJhdGlvUmVzaXplYWJsZUFjdGl2aXR5PiBtTWF4QXNwZWN0UmF0aW9SZXNpemVhYmxlQWN0aXZpdHkgPQorICAgICAgICAgICAgbmV3IEFjdGl2aXR5VGVzdFJ1bGU8PihNYXhBc3BlY3RSYXRpb1Jlc2l6ZWFibGVBY3Rpdml0eS5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogaW5pdGlhbFRvdWNoTW9kZSAqLywgZmFsc2UgLyogbGF1bmNoQWN0aXZpdHkgKi8pOworCisgICAgQFJ1bGUKKyAgICBwdWJsaWMgQWN0aXZpdHlUZXN0UnVsZTxNZXRhRGF0YU1heEFzcGVjdFJhdGlvQWN0aXZpdHk+IG1NZXRhRGF0YU1heEFzcGVjdFJhdGlvQWN0aXZpdHkgPQorICAgICAgICAgICAgbmV3IEFjdGl2aXR5VGVzdFJ1bGU8PihNZXRhRGF0YU1heEFzcGVjdFJhdGlvQWN0aXZpdHkuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGluaXRpYWxUb3VjaE1vZGUgKi8sIGZhbHNlIC8qIGxhdW5jaEFjdGl2aXR5ICovKTsKKworICAgIEBSdWxlCisgICAgcHVibGljIEFjdGl2aXR5VGVzdFJ1bGU8TWF4QXNwZWN0UmF0aW9VbnNldEFjdGl2aXR5PiBtTWF4QXNwZWN0UmF0aW9VbnNldEFjdGl2aXR5ID0KKyAgICAgICAgICAgIG5ldyBBY3Rpdml0eVRlc3RSdWxlPD4oTWF4QXNwZWN0UmF0aW9VbnNldEFjdGl2aXR5LmNsYXNzLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBpbml0aWFsVG91Y2hNb2RlICovLCBmYWxzZSAvKiBsYXVuY2hBY3Rpdml0eSAqLyk7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REZXZpY2VBc3BlY3RSYXRpbygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBDb250ZXh0IGNvbnRleHQgPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKS5nZXRDb250ZXh0KCk7CisgICAgICAgIGZpbmFsIFdpbmRvd01hbmFnZXIgd20gPSAoV2luZG93TWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKFdJTkRPV19TRVJWSUNFKTsKKyAgICAgICAgZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gd20uZ2V0RGVmYXVsdERpc3BsYXkoKTsKKyAgICAgICAgZmluYWwgRGlzcGxheU1ldHJpY3MgbWV0cmljcyA9IG5ldyBEaXNwbGF5TWV0cmljcygpOworICAgICAgICBkaXNwbGF5LmdldFJlYWxNZXRyaWNzKG1ldHJpY3MpOworCisgICAgICAgIGZsb2F0IGxvbmdTaWRlID0gTWF0aC5tYXgobWV0cmljcy53aWR0aFBpeGVscywgbWV0cmljcy5oZWlnaHRQaXhlbHMpOworICAgICAgICBmbG9hdCBzaG9ydFNpZGUgPSBNYXRoLm1pbihtZXRyaWNzLndpZHRoUGl4ZWxzLCBtZXRyaWNzLmhlaWdodFBpeGVscyk7CisgICAgICAgIGZsb2F0IGRldmljZUFzcGVjdFJhdGlvID0gbG9uZ1NpZGUgLyBzaG9ydFNpZGU7CisgICAgICAgIGZsb2F0IGV4cGVjdGVkTWluQXNwZWN0UmF0aW8gPSBjb250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCkuaGFzU3lzdGVtRmVhdHVyZShGRUFUVVJFX1dBVENIKQorICAgICAgICAgICAgICAgID8gTUlOX1dBVENIX0RFVklDRV9BU1BFQ1RfUkFUSU8gOiBNSU5fREVWSUNFX0FTUEVDVF9SQVRJTzsKKworICAgICAgICBpZiAoZGV2aWNlQXNwZWN0UmF0aW8gPCBleHBlY3RlZE1pbkFzcGVjdFJhdGlvKSB7CisgICAgICAgICAgICBmYWlsKCJkZXZpY2VBc3BlY3RSYXRpbz0iICsgZGV2aWNlQXNwZWN0UmF0aW8KKyAgICAgICAgICAgICAgICAgICAgKyAiIGlzIGxlc3MgdGhhbiBleHBlY3RlZE1pbkFzcGVjdFJhdGlvPSIgKyBleHBlY3RlZE1pbkFzcGVjdFJhdGlvKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1heEFzcGVjdFJhdGlvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJ1bkFzcGVjdFJhdGlvVGVzdChtTWF4QXNwZWN0UmF0aW9BY3Rpdml0eSwgYWN0dWFsIC0+IHsKKyAgICAgICAgICAgIGlmIChNQVhfQVNQRUNUX1JBVElPID49IGFjdHVhbCkgcmV0dXJuOworICAgICAgICAgICAgZmFpbCgiYWN0dWFsPSIgKyBhY3R1YWwgKyAiIGlzIGdyZWF0ZXIgdGhhbiBleHBlY3RlZD0iICsgTUFYX0FTUEVDVF9SQVRJTyk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1ldGFEYXRhTWF4QXNwZWN0UmF0aW8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcnVuQXNwZWN0UmF0aW9UZXN0KG1NZXRhRGF0YU1heEFzcGVjdFJhdGlvQWN0aXZpdHksIGFjdHVhbCAtPiB7CisgICAgICAgICAgICBpZiAoTUFYX0FTUEVDVF9SQVRJTyA+PSBhY3R1YWwpIHJldHVybjsKKyAgICAgICAgICAgIGZhaWwoImFjdHVhbD0iICsgYWN0dWFsICsgIiBpcyBncmVhdGVyIHRoYW4gZXhwZWN0ZWQ9IiArIE1BWF9BU1BFQ1RfUkFUSU8pOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYXhBc3BlY3RSYXRpb1Jlc2l6ZWFibGVBY3Rpdml0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBDb250ZXh0IGNvbnRleHQgPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKS5nZXRDb250ZXh0KCk7CisgICAgICAgIGZpbmFsIGZsb2F0IGV4cGVjdGVkID0gZ2V0QXNwZWN0UmF0aW8oY29udGV4dCk7CisgICAgICAgIGZpbmFsIEFjdGl2aXR5IHRlc3RBY3Rpdml0eSA9IGxhdW5jaEFjdGl2aXR5KG1NYXhBc3BlY3RSYXRpb1Jlc2l6ZWFibGVBY3Rpdml0eSk7CisgICAgICAgIFBvbGxpbmdDaGVjay53YWl0Rm9yKHRlc3RBY3Rpdml0eTo6aGFzV2luZG93Rm9jdXMpOworCisgICAgICAgIERpc3BsYXkgdGVzdERpc3BsYXkgPSB0ZXN0QWN0aXZpdHkuZmluZFZpZXdCeUlkKGFuZHJvaWQuUi5pZC5jb250ZW50KS5nZXREaXNwbGF5KCk7CisKKyAgICAgICAgLy8gVE9ETyhiLzY5OTgyNDM0KTogRml4IERpc3BsYXlNYW5hZ2VyIE5QRSB3aGVuIGdldHRpbmcgZGlzcGxheSBmcm9tIEluc3RydW1lbnRhdGlvbgorICAgICAgICAvLyBjb250ZXh0LCB0aGVuIGNhbiB1c2UgRGlzcGxheU1hbmFnZXIgdG8gZ2V0IHRoZSBhc3BlY3QgcmF0aW8gb2YgdGhlIGNvcnJlY3QgZGlzcGxheS4KKyAgICAgICAgaWYgKHRlc3REaXNwbGF5LmdldERpc3BsYXlJZCgpICE9IERpc3BsYXkuREVGQVVMVF9ESVNQTEFZKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBTaW5jZSB0aGlzIGFjdGl2aXR5IGlzIHJlc2l6ZWFibGUsIGl0cyBhc3BlY3QgcmF0aW8gc2hvdWxkbid0IGJlIGxlc3MgdGhhbiB0aGUgZGV2aWNlJ3MKKyAgICAgICAgcnVuVGVzdCh0ZXN0QWN0aXZpdHksIGFjdHVhbCAtPiB7CisgICAgICAgICAgICBpZiAoYXNwZWN0UmF0aW9FcXVhbChleHBlY3RlZCwgYWN0dWFsKSB8fCBleHBlY3RlZCA8IGFjdHVhbCkgcmV0dXJuOworICAgICAgICAgICAgZmFpbCgiYWN0dWFsPSIgKyBhY3R1YWwgKyAiIGlzIGxlc3MgdGhhbiBleHBlY3RlZD0iICsgZXhwZWN0ZWQpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYXhBc3BlY3RSYXRpb1Vuc2V0QWN0aXZpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0ID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0Q29udGV4dCgpOworICAgICAgICBmaW5hbCBmbG9hdCBleHBlY3RlZCA9IGdldEFzcGVjdFJhdGlvKGNvbnRleHQpOworCisgICAgICAgIC8vIFNpbmNlIHRoaXMgYWN0aXZpdHkgZGlkbid0IHNldCBhbiBhc3BlY3QgcmF0aW8sIGl0cyBhc3BlY3QgcmF0aW8gc2hvdWxkbid0IGJlIGxlc3MgdGhhbgorICAgICAgICAvLyB0aGUgZGV2aWNlJ3MKKyAgICAgICAgcnVuQXNwZWN0UmF0aW9UZXN0KG1NYXhBc3BlY3RSYXRpb1Vuc2V0QWN0aXZpdHksIGFjdHVhbCAtPiB7CisgICAgICAgICAgICBpZiAoYXNwZWN0UmF0aW9FcXVhbChleHBlY3RlZCwgYWN0dWFsKSB8fCBleHBlY3RlZCA8IGFjdHVhbCkgcmV0dXJuOworICAgICAgICAgICAgZmFpbCgiYWN0dWFsPSIgKyBhY3R1YWwgKyAiIGlzIGxlc3MgdGhhbiBleHBlY3RlZD0iICsgZXhwZWN0ZWQpOworICAgICAgICB9KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0FzcGVjdFJhdGlvVGVzdHNCYXNlLmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0FzcGVjdFJhdGlvVGVzdHNCYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMyYzJjYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vQXNwZWN0UmF0aW9UZXN0c0Jhc2UuamF2YQpAQCAtMCwwICsxLDkzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLmFtOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb2ludDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuRGlzcGxheTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CisKK2NsYXNzIEFzcGVjdFJhdGlvVGVzdHNCYXNlIHsKKyAgICAvLyBUaGUgZGVsdGEgYWxsb3dlZCB3aGVuIGNvbXBhcmluZyB0d28gZmxvYXRzIGZvciBlcXVhbGl0eS4gV2UgY29uc2lkZXIgdGhlbSBlcXVhbCBpZiB0aGV5IGFyZQorICAgIC8vIHdpdGhpbiB0d28gc2lnbmlmaWNhbnQgZGlnaXRzIG9mIGVhY2ggb3RoZXIuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgRkxPQVRfRVFVQUxJVFlfREVMVEEgPSAuMDFmOworCisgICAgaW50ZXJmYWNlIEFzc2VydEFzcGVjdFJhdGlvQ2FsbGJhY2sgeworICAgICAgICB2b2lkIGFzc2VydEFzcGVjdFJhdGlvKGZsb2F0IGFjdHVhbCk7CisgICAgfQorCisgICAgdm9pZCBydW5Bc3BlY3RSYXRpb1Rlc3QoZmluYWwgQWN0aXZpdHlUZXN0UnVsZSBhY3Rpdml0eVJ1bGUsCisgICAgICAgICAgICBmaW5hbCBBc3NlcnRBc3BlY3RSYXRpb0NhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIGZpbmFsIEFjdGl2aXR5IGFjdGl2aXR5ID0gbGF1bmNoQWN0aXZpdHkoYWN0aXZpdHlSdWxlKTsKKyAgICAgICAgcnVuVGVzdChhY3Rpdml0eSwgY2FsbGJhY2spOworICAgICAgICBmaW5pc2hBY3Rpdml0eShhY3Rpdml0eVJ1bGUpOworCisgICAgICAgIC8vIFRPRE8oYi8zNTgxMDUxMyk6IEFsbCB0aGlzIHJvdGF0aW9uIHN0dWZmIGRvZXNuJ3QgcmVhbGx5IHdvcmsgeWV0LiBOZWVkIHRvIG1ha2Ugc3VyZQorICAgICAgICAvLyBjb250ZXh0IGlzIHVwZGF0ZWQgY29ycmVjdGx5IGhlcmUuIEFsc28sIHdoYXQgZG9lcyBpdCBtZWFuIHRvIGJlIGhvbGRpbmcgYSByZWZlcmVuY2UgdG8KKyAgICAgICAgLy8gdGhpcyBhY3Rpdml0eSBpZiBjaGFuZ2luZyB0aGUgb3JpZW50YXRpb24gd2lsbCBjYXVzZSBhIHJlbGF1bmNoPworLy8gICAgICAgIGFjdGl2aXR5LnNldFJlcXVlc3RlZE9yaWVudGF0aW9uKFNDUkVFTl9PUklFTlRBVElPTl9MQU5EU0NBUEUpOworLy8gICAgICAgIHdhaXRGb3JJZGxlKCk7CisvLyAgICAgICAgY2FsbGJhY2suYXNzZXJ0QXNwZWN0UmF0aW8oZ2V0QXNwZWN0UmF0aW8oYWN0aXZpdHkpKTsKKy8vCisvLyAgICAgICAgYWN0aXZpdHkuc2V0UmVxdWVzdGVkT3JpZW50YXRpb24oU0NSRUVOX09SSUVOVEFUSU9OX1BPUlRSQUlUKTsKKy8vICAgICAgICB3YWl0Rm9ySWRsZSgpOworLy8gICAgICAgIGNhbGxiYWNrLmFzc2VydEFzcGVjdFJhdGlvKGdldEFzcGVjdFJhdGlvKGFjdGl2aXR5KSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgcnVuVGVzdChBY3Rpdml0eSBhY3Rpdml0eSwgQXNzZXJ0QXNwZWN0UmF0aW9DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICBjYWxsYmFjay5hc3NlcnRBc3BlY3RSYXRpbyhnZXRBc3BlY3RSYXRpbyhhY3Rpdml0eSkpOworICAgIH0KKworICAgICBzdGF0aWMgZmxvYXQgZ2V0QXNwZWN0UmF0aW8oQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGZpbmFsIERpc3BsYXkgZGlzcGxheSA9CisgICAgICAgICAgICAgICAgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKFdpbmRvd01hbmFnZXIuY2xhc3MpLmdldERlZmF1bHREaXNwbGF5KCk7CisgICAgICAgIGZpbmFsIFBvaW50IHNpemUgPSBuZXcgUG9pbnQoKTsKKyAgICAgICAgZGlzcGxheS5nZXRTaXplKHNpemUpOworICAgICAgICBmaW5hbCBmbG9hdCBsb25nU2lkZSA9IE1hdGgubWF4KHNpemUueCwgc2l6ZS55KTsKKyAgICAgICAgZmluYWwgZmxvYXQgc2hvcnRTaWRlID0gTWF0aC5taW4oc2l6ZS54LCBzaXplLnkpOworICAgICAgICByZXR1cm4gbG9uZ1NpZGUgLyBzaG9ydFNpZGU7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEFjdGl2aXR5IGxhdW5jaEFjdGl2aXR5KGZpbmFsIEFjdGl2aXR5VGVzdFJ1bGUgYWN0aXZpdHlSdWxlKSB7CisgICAgICAgIGZpbmFsIEFjdGl2aXR5IGFjdGl2aXR5ID0gYWN0aXZpdHlSdWxlLmxhdW5jaEFjdGl2aXR5KG51bGwpOworICAgICAgICB3YWl0Rm9ySWRsZSgpOworICAgICAgICByZXR1cm4gYWN0aXZpdHk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGZpbmlzaEFjdGl2aXR5KEFjdGl2aXR5VGVzdFJ1bGUgYWN0aXZpdHlSdWxlKSB7CisgICAgICAgIGZpbmFsIEFjdGl2aXR5IGFjdGl2aXR5ID0gYWN0aXZpdHlSdWxlLmdldEFjdGl2aXR5KCk7CisgICAgICAgIGlmIChhY3Rpdml0eSAhPSBudWxsKSB7CisgICAgICAgICAgICBhY3Rpdml0eS5maW5pc2goKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgd2FpdEZvcklkbGUoKSB7CisgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLndhaXRGb3JJZGxlU3luYygpOworICAgIH0KKworICAgIHN0YXRpYyBib29sZWFuIGFzcGVjdFJhdGlvRXF1YWwoZmxvYXQgYSwgZmxvYXQgYikgeworICAgICAgICByZXR1cm4gTWF0aC5hYnMoYSAtIGIpIDwgRkxPQVRfRVFVQUxJVFlfREVMVEE7CisgICAgfQorCisgICAgc3RhdGljIGJvb2xlYW4gYXNwZWN0UmF0aW9MZXNzVGhhbkVxdWFsKGZsb2F0IGEsIGZsb2F0IGIpIHsKKyAgICAgICAgcmV0dXJuIGEgPCBiIHx8IGFzcGVjdFJhdGlvRXF1YWwoYSwgYik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9EZXByZWNhdGVkVGFyZ2V0U2RrVGVzdC5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9EZXByZWNhdGVkVGFyZ2V0U2RrVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNGNmNGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0RlcHJlY2F0ZWRUYXJnZXRTZGtUZXN0LmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW07CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uVWlEZXZpY2VVdGlscy5wcmVzc0JhY2tCdXR0b247CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLmRlcHJlY2F0ZWRzZGsuQ29tcG9uZW50cy5NQUlOX0FDVElWSVRZOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKKy8qKgorICogRW5zdXJlIHRoYXQgY29tcGF0aWJpbGl0eSBkaWFsb2cgaXMgc2hvd24gd2hlbiBsYXVuY2hpbmcgYW4gYXBwbGljYXRpb24KKyAqIHRhcmdldGluZyBhIGRlcHJlY2F0ZWQgdmVyc2lvbiBvZiBTREsuCisgKiA8cD5CdWlsZC9JbnN0YWxsL1J1bjoKKyAqICAgICBhdGVzdCBDdHNBY3Rpdml0eU1hbmFnZXJEZXZpY2VUZXN0Q2FzZXM6RGVwcmVjYXRlZFRhcmdldFNka1Rlc3QKKyAqLworQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBEZXByZWNhdGVkVGFyZ2V0U2RrVGVzdCBleHRlbmRzIEFjdGl2aXR5TWFuYWdlclRlc3RCYXNlIHsKKworICAgIC8qKiBAc2VlIGNvbS5hbmRyb2lkLnNlcnZlci5hbS5EZXByZWNhdGVkVGFyZ2V0U2RrVmVyc2lvbkRpYWxvZyAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERVBSRUNBVEVEX1RBUkdFVF9TREtfVkVSU0lPTl9ESUFMT0cgPQorICAgICAgICAgICAgIkRlcHJlY2F0ZWRUYXJnZXRTZGtWZXJzaW9uRGlhbG9nIjsKKworICAgIEBBZnRlcgorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisKKyAgICAgICAgLy8gRW5zdXJlIGFwcCBwcm9jZXNzIGlzIHN0b3BwZWQuCisgICAgICAgIHN0b3BUZXN0UGFja2FnZShNQUlOX0FDVElWSVRZKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wYXRpYmlsaXR5RGlhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIExhdW5jaCB0YXJnZXQgYXBwLgorICAgICAgICBsYXVuY2hBY3Rpdml0eShNQUlOX0FDVElWSVRZKTsKKyAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRBY3Rpdml0eURpc3BsYXllZChNQUlOX0FDVElWSVRZKTsKKyAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRXaW5kb3dEaXNwbGF5ZWQoREVQUkVDQVRFRF9UQVJHRVRfU0RLX1ZFUlNJT05fRElBTE9HKTsKKworICAgICAgICAvLyBHbyBiYWNrIHRvIGRpc21pc3MgdGhlIHdhcm5pbmcgZGlhbG9nLgorICAgICAgICBwcmVzc0JhY2tCdXR0b24oKTsKKworICAgICAgICAvLyBHbyBiYWNrIGFnYWluIHRvIGZvcm1hbGx5IHN0b3AgdGhlIGFwcC4gSWYgd2UganVzdCBraWxsIHRoZSBwcm9jZXNzLCBpdCdsbCBhdHRlbXB0IHRvCisgICAgICAgIC8vIHJlc3VtZSByYXRoZXIgdGhhbiBzdGFydGluZyBmcm9tIHNjcmF0Y2ggKGFzIGZhciBhcyBBY3Rpdml0eVN0YWNrIGlzIGNvbmNlcm5lZCkgYW5kIGl0CisgICAgICAgIC8vIHdvbid0IGludm9rZSB0aGUgd2FybmluZyBkaWFsb2cuCisgICAgICAgIHByZXNzQmFja0J1dHRvbigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vRGlzcGxheVNpemVUZXN0LmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0Rpc3BsYXlTaXplVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzY2VhYmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0Rpc3BsYXlTaXplVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbTsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50LkZMQUdfQUNUSVZJVFlfU0lOR0xFX1RPUDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50TmFtZVV0aWxzLmdldEFjdGl2aXR5TmFtZTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5URVNUX0FDVElWSVRZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5VaURldmljZVV0aWxzLnByZXNzQmFja0J1dHRvbjsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uZGlzcGxheXNpemUuQ29tcG9uZW50cy5TTUFMTEVTVF9XSURUSF9BQ1RJVklUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uZGlzcGxheXNpemUuQ29tcG9uZW50cy5TbWFsbGVzdFdpZHRoQWN0aXZpdHkKKyAgICAgICAgLkVYVFJBX0xBVU5DSF9BTk9USEVSX0FDVElWSVRZOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogRW5zdXJlIHRoYXQgY29tcGF0aWJpbGl0eSBkaWFsb2cgaXMgc2hvd24gd2hlbiBsYXVuY2hpbmcgYW4gYXBwbGljYXRpb24gd2l0aAorICogYW4gdW5zdXBwb3J0ZWQgc21hbGxlc3Qgd2lkdGguCisgKgorICogPHA+QnVpbGQvSW5zdGFsbC9SdW46CisgKiAgICAgYXRlc3QgQ3RzQWN0aXZpdHlNYW5hZ2VyRGV2aWNlVGVzdENhc2VzOkRpc3BsYXlTaXplVGVzdAorICovCitwdWJsaWMgY2xhc3MgRGlzcGxheVNpemVUZXN0IGV4dGVuZHMgQWN0aXZpdHlNYW5hZ2VyVGVzdEJhc2UgeworCisgICAgLyoqIEBzZWUgY29tLmFuZHJvaWQuc2VydmVyLmFtLlVuc3VwcG9ydGVkRGlzcGxheVNpemVEaWFsb2cgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5TVVBQT1JURURfRElTUExBWV9TSVpFX0RJQUxPR19OQU1FID0KKyAgICAgICAgICAgICJVbnN1cHBvcnRlZERpc3BsYXlTaXplRGlhbG9nIjsKKworICAgIEBBZnRlcgorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisKKyAgICAgICAgLy8gRW5zdXJlIGFwcCBwcm9jZXNzIGlzIHN0b3BwZWQuCisgICAgICAgIHN0b3BUZXN0UGFja2FnZShTTUFMTEVTVF9XSURUSF9BQ1RJVklUWSk7CisgICAgICAgIHN0b3BUZXN0UGFja2FnZShURVNUX0FDVElWSVRZKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wYXRpYmlsaXR5RGlhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIExhdW5jaCBzb21lIG90aGVyIGFwcCAobm90IHRvIHBlcmZvcm0gZGVuc2l0eSBjaGFuZ2Ugb24gbGF1bmNoZXIpLgorICAgICAgICBsYXVuY2hBY3Rpdml0eShURVNUX0FDVElWSVRZKTsKKyAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRBY3Rpdml0eURpc3BsYXllZChURVNUX0FDVElWSVRZKTsKKworICAgICAgICB0cnkgKGZpbmFsIFNjcmVlbkRlbnNpdHlTZXNzaW9uIHNjcmVlbkRlbnNpdHlTZXNzaW9uID0gbmV3IFNjcmVlbkRlbnNpdHlTZXNzaW9uKCkpIHsKKyAgICAgICAgICAgIHNjcmVlbkRlbnNpdHlTZXNzaW9uLnNldFVuc3VwcG9ydGVkRGVuc2l0eSgpOworCisgICAgICAgICAgICAvLyBMYXVuY2ggdGFyZ2V0IGFwcC4KKyAgICAgICAgICAgIGxhdW5jaEFjdGl2aXR5KFNNQUxMRVNUX1dJRFRIX0FDVElWSVRZKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0QWN0aXZpdHlEaXNwbGF5ZWQoU01BTExFU1RfV0lEVEhfQUNUSVZJVFkpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRXaW5kb3dEaXNwbGF5ZWQoVU5TVVBQT1JURURfRElTUExBWV9TSVpFX0RJQUxPR19OQU1FKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbXBhdGliaWxpdHlEaWFsb2dXaGVuRm9jdXNlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBsYXVuY2hBY3Rpdml0eShTTUFMTEVTVF9XSURUSF9BQ1RJVklUWSk7CisgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0QWN0aXZpdHlEaXNwbGF5ZWQoU01BTExFU1RfV0lEVEhfQUNUSVZJVFkpOworCisgICAgICAgIHRyeSAoZmluYWwgU2NyZWVuRGVuc2l0eVNlc3Npb24gc2NyZWVuRGVuc2l0eVNlc3Npb24gPSBuZXcgU2NyZWVuRGVuc2l0eVNlc3Npb24oKSkgeworICAgICAgICAgICAgc2NyZWVuRGVuc2l0eVNlc3Npb24uc2V0VW5zdXBwb3J0ZWREZW5zaXR5KCk7CisKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0V2luZG93RGlzcGxheWVkKFVOU1VQUE9SVEVEX0RJU1BMQVlfU0laRV9ESUFMT0dfTkFNRSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wYXRpYmlsaXR5RGlhbG9nQWZ0ZXJSZXR1cm4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gTGF1bmNoIHRhcmdldCBhcHAuCisgICAgICAgIGxhdW5jaEFjdGl2aXR5KFNNQUxMRVNUX1dJRFRIX0FDVElWSVRZKTsKKyAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRBY3Rpdml0eURpc3BsYXllZChTTUFMTEVTVF9XSURUSF9BQ1RJVklUWSk7CisgICAgICAgIC8vIExhdW5jaCBhbm90aGVyIGFjdGl2aXR5LgorICAgICAgICBmaW5hbCBTdHJpbmcgc3RhcnRBY3Rpdml0eU9uVG9wID0gU3RyaW5nLmZvcm1hdCgiJXMgLWYgMHgleCAtLWVzICVzICVzIiwKKyAgICAgICAgICAgICAgICBnZXRBbVN0YXJ0Q21kKFNNQUxMRVNUX1dJRFRIX0FDVElWSVRZKSwgRkxBR19BQ1RJVklUWV9TSU5HTEVfVE9QLAorICAgICAgICAgICAgICAgIEVYVFJBX0xBVU5DSF9BTk9USEVSX0FDVElWSVRZLCBnZXRBY3Rpdml0eU5hbWUoVEVTVF9BQ1RJVklUWSkpOworICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKHN0YXJ0QWN0aXZpdHlPblRvcCk7CisgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0QWN0aXZpdHlEaXNwbGF5ZWQoVEVTVF9BQ1RJVklUWSk7CisgICAgICAgIGZpbmFsIExvZ1NlcGFyYXRvciBsb2dTZXBhcmF0b3IgPSBzZXBhcmF0ZUxvZ3MoKTsKKworICAgICAgICB0cnkgKGZpbmFsIFNjcmVlbkRlbnNpdHlTZXNzaW9uIHNjcmVlbkRlbnNpdHlTZXNzaW9uID0gbmV3IFNjcmVlbkRlbnNpdHlTZXNzaW9uKCkpIHsKKyAgICAgICAgICAgIHNjcmVlbkRlbnNpdHlTZXNzaW9uLnNldFVuc3VwcG9ydGVkRGVuc2l0eSgpOworCisgICAgICAgICAgICBhc3NlcnRBY3Rpdml0eUxpZmVjeWNsZShURVNUX0FDVElWSVRZLCB0cnVlIC8qIHJlbGF1bmNoZWQgKi8sIGxvZ1NlcGFyYXRvcik7CisgICAgICAgICAgICBwcmVzc0JhY2tCdXR0b24oKTsKKworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRBY3Rpdml0eURpc3BsYXllZChTTUFMTEVTVF9XSURUSF9BQ1RJVklUWSk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFdpbmRvd0Rpc3BsYXllZChVTlNVUFBPUlRFRF9ESVNQTEFZX1NJWkVfRElBTE9HX05BTUUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2NyZWVuRGVuc2l0eVNlc3Npb24gaW1wbGVtZW50cyBBdXRvQ2xvc2VhYmxlIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFTlNJVFlfUFJPUF9ERVZJQ0UgPSAicm8uc2YubGNkX2RlbnNpdHkiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVOU0lUWV9QUk9QX0VNVUxBVE9SID0gInFlbXUuc2YubGNkX2RlbnNpdHkiOworCisgICAgICAgIHZvaWQgc2V0VW5zdXBwb3J0ZWREZW5zaXR5KCkgeworICAgICAgICAgICAgLy8gU2V0IGRldmljZSB0byAwLjg1IHpvb20uIEl0IGRvZXNuJ3QgbWF0dGVyIHRoYXQgd2UncmUgem9vbWluZyBvdXQKKyAgICAgICAgICAgIC8vIHNpbmNlIHRoZSBmZWF0dXJlIHZlcmlmaWVzIHRoYXQgd2UncmUgaW4gYSBub24tZGVmYXVsdCBkZW5zaXR5LgorICAgICAgICAgICAgZmluYWwgaW50IHN0YWJsZURlbnNpdHkgPSBnZXRTdGFibGVEZW5zaXR5KCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgdGFyZ2V0RGVuc2l0eSA9IChpbnQpIChzdGFibGVEZW5zaXR5ICogMC44NSk7CisgICAgICAgICAgICBzZXREZW5zaXR5KHRhcmdldERlbnNpdHkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXNldERlbnNpdHkoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW50IGdldFN0YWJsZURlbnNpdHkoKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZGVuc2l0eVByb3A7CisgICAgICAgICAgICBpZiAoQnVpbGQuSVNfRU1VTEFUT1IpIHsKKyAgICAgICAgICAgICAgICBkZW5zaXR5UHJvcCA9IERFTlNJVFlfUFJPUF9FTVVMQVRPUjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGVuc2l0eVByb3AgPSBERU5TSVRZX1BST1BfREVWSUNFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gSW50ZWdlci5wYXJzZUludChleGVjdXRlU2hlbGxDb21tYW5kKCJnZXRwcm9wICIgKyBkZW5zaXR5UHJvcCkudHJpbSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBzZXREZW5zaXR5KGludCB0YXJnZXREZW5zaXR5KSB7CisgICAgICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKCJ3bSBkZW5zaXR5ICIgKyB0YXJnZXREZW5zaXR5KTsKKworICAgICAgICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGRlbnNpdHkgaXMgY2hhbmdlZC4KKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBvdXRwdXQgPSBleGVjdXRlU2hlbGxDb21tYW5kKCJ3bSBkZW5zaXR5Iik7CisgICAgICAgICAgICBmaW5hbCBib29sZWFuIHN1Y2Nlc3MgPSBvdXRwdXQuY29udGFpbnMoIk92ZXJyaWRlIGRlbnNpdHk6ICIgKyB0YXJnZXREZW5zaXR5KTsKKworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIHNldCBkZW5zaXR5IHRvICIgKyB0YXJnZXREZW5zaXR5LCBzdWNjZXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCByZXNldERlbnNpdHkoKSB7CisgICAgICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKCJ3bSBkZW5zaXR5IHJlc2V0Iik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0tleWd1YXJkTG9ja2VkVGVzdHMuamF2YSBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vS2V5Z3VhcmRMb2NrZWRUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhOTljYzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0tleWd1YXJkTG9ja2VkVGVzdHMuamF2YQpAQCAtMCwwICsxLDI4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbTsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5XaW5kb3dDb25maWd1cmF0aW9uLkFDVElWSVRZX1RZUEVfU1RBTkRBUkQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLldpbmRvd0NvbmZpZ3VyYXRpb24uV0lORE9XSU5HX01PREVfUElOTkVEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLkJyb2FkY2FzdFJlY2VpdmVyQWN0aXZpdHkuQUNUSU9OX1RSSUdHRVJfQlJPQURDQVNUOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLkJyb2FkY2FzdFJlY2VpdmVyQWN0aXZpdHkuRVhUUkFfRElTTUlTU19LRVlHVUFSRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5ESVNNSVNTX0tFWUdVQVJEX0FDVElWSVRZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLkRJU01JU1NfS0VZR1VBUkRfTUVUSE9EX0FDVElWSVRZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLlBJUF9BQ1RJVklUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5QaXBBY3Rpdml0eS5BQ1RJT05fRU5URVJfUElQOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLlBpcEFjdGl2aXR5LkVYVFJBX0VOVEVSX1BJUDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5QaXBBY3Rpdml0eS5FWFRSQV9TSE9XX09WRVJfS0VZR1VBUkQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuU0hPV19XSEVOX0xPQ0tFRF9BQ1RJVklUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5UVVJOX1NDUkVFTl9PTl9BVFRSX0RJU01JU1NfS0VZR1VBUkRfQUNUSVZJVFk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLlVpRGV2aWNlVXRpbHMucHJlc3NCYWNrQnV0dG9uOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc3VtZS5hc3N1bWVUcnVlOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIEJ1aWxkL0luc3RhbGwvUnVuOgorICogICAgIGF0ZXN0IEN0c0FjdGl2aXR5TWFuYWdlckRldmljZVRlc3RDYXNlczpLZXlndWFyZExvY2tlZFRlc3RzCisgKi8KK3B1YmxpYyBjbGFzcyBLZXlndWFyZExvY2tlZFRlc3RzIGV4dGVuZHMgS2V5Z3VhcmRUZXN0QmFzZSB7CisKKyAgICAvLyBUT0RPKGIvNzAyNDcwNTgpOiBVc2Uge0BsaW5rIENvbnRleHQjc2VuZEJyb2FkY2FzdChJbnRlbnQpLgorICAgIC8vIFNoZWxsIGNvbW1hbmQgdG8gZGlzbWlzcyBrZXlndWFyZCB2aWEge0BsaW5rICNCUk9BRENBU1RfUkVDRUlWRVJfQUNUSVZJVFl9LgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESVNNSVNTX0tFWUdVQVJEX0JST0FEQ0FTVCA9ICJhbSBicm9hZGNhc3QgLWEgIgorICAgICAgICAgICAgKyBBQ1RJT05fVFJJR0dFUl9CUk9BRENBU1QgKyAiIC0tZXogIiArIEVYVFJBX0RJU01JU1NfS0VZR1VBUkQgKyAiIHRydWUiOworCisgICAgQEJlZm9yZQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgIGFzc3VtZVRydWUoc3VwcG9ydHNTZWN1cmVMb2NrKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvY2tBbmRVbmxvY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IChmaW5hbCBMb2NrU2NyZWVuU2Vzc2lvbiBsb2NrU2NyZWVuU2Vzc2lvbiA9IG5ldyBMb2NrU2NyZWVuU2Vzc2lvbigpKSB7CisgICAgICAgICAgICBsb2NrU2NyZWVuU2Vzc2lvbi5zZXRMb2NrQ3JlZGVudGlhbCgpCisgICAgICAgICAgICAgICAgICAgIC5nb3RvS2V5Z3VhcmQoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobUtleWd1YXJkTWFuYWdlci5pc0tleWd1YXJkTG9ja2VkKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtS2V5Z3VhcmRNYW5hZ2VyLmlzRGV2aWNlTG9ja2VkKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtS2V5Z3VhcmRNYW5hZ2VyLmlzRGV2aWNlU2VjdXJlKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtS2V5Z3VhcmRNYW5hZ2VyLmlzS2V5Z3VhcmRTZWN1cmUoKSk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEtleWd1YXJkU2hvd2luZ0FuZE5vdE9jY2x1ZGVkKCk7CisgICAgICAgICAgICBsb2NrU2NyZWVuU2Vzc2lvbi51bmxvY2tEZXZpY2UoKQorICAgICAgICAgICAgICAgICAgICAuZW50ZXJBbmRDb25maXJtTG9ja0NyZWRlbnRpYWwoKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvcktleWd1YXJkR29uZSgpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRLZXlndWFyZEdvbmUoKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKG1LZXlndWFyZE1hbmFnZXIuaXNEZXZpY2VMb2NrZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShtS2V5Z3VhcmRNYW5hZ2VyLmlzS2V5Z3VhcmRMb2NrZWQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REaXNtaXNzS2V5Z3VhcmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IChmaW5hbCBMb2NrU2NyZWVuU2Vzc2lvbiBsb2NrU2NyZWVuU2Vzc2lvbiA9IG5ldyBMb2NrU2NyZWVuU2Vzc2lvbigpKSB7CisgICAgICAgICAgICBsb2NrU2NyZWVuU2Vzc2lvbi5zZXRMb2NrQ3JlZGVudGlhbCgpCisgICAgICAgICAgICAgICAgICAgIC5nb3RvS2V5Z3VhcmQoKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0S2V5Z3VhcmRTaG93aW5nQW5kTm90T2NjbHVkZWQoKTsKKyAgICAgICAgICAgIGxhdW5jaEFjdGl2aXR5KERJU01JU1NfS0VZR1VBUkRfQUNUSVZJVFkpOworICAgICAgICAgICAgbG9ja1NjcmVlblNlc3Npb24uZW50ZXJBbmRDb25maXJtTG9ja0NyZWRlbnRpYWwoKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvcktleWd1YXJkR29uZSgpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRLZXlndWFyZEdvbmUoKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShESVNNSVNTX0tFWUdVQVJEX0FDVElWSVRZLCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERpc21pc3NLZXlndWFyZF93aGlsZU9jY2x1ZGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSAoZmluYWwgTG9ja1NjcmVlblNlc3Npb24gbG9ja1NjcmVlblNlc3Npb24gPSBuZXcgTG9ja1NjcmVlblNlc3Npb24oKSkgeworICAgICAgICAgICAgbG9ja1NjcmVlblNlc3Npb24uc2V0TG9ja0NyZWRlbnRpYWwoKQorICAgICAgICAgICAgICAgICAgICAuZ290b0tleWd1YXJkKCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEtleWd1YXJkU2hvd2luZ0FuZE5vdE9jY2x1ZGVkKCk7CisgICAgICAgICAgICBsYXVuY2hBY3Rpdml0eShTSE9XX1dIRU5fTE9DS0VEX0FDVElWSVRZKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKFNIT1dfV0hFTl9MT0NLRURfQUNUSVZJVFkpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFNIT1dfV0hFTl9MT0NLRURfQUNUSVZJVFksIHRydWUpOworICAgICAgICAgICAgbGF1bmNoQWN0aXZpdHkoRElTTUlTU19LRVlHVUFSRF9BQ1RJVklUWSk7CisgICAgICAgICAgICBsb2NrU2NyZWVuU2Vzc2lvbi5lbnRlckFuZENvbmZpcm1Mb2NrQ3JlZGVudGlhbCgpOworICAgICAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yS2V5Z3VhcmRHb25lKCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEtleWd1YXJkR29uZSgpOworICAgICAgICAgICAgYm9vbGVhbiBpc0Rpc21pc3NUcmFuc2x1Y2VudCA9CisgICAgICAgICAgICAgICAgICAgIG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmlzQWN0aXZpdHlUcmFuc2x1Y2VudChESVNNSVNTX0tFWUdVQVJEX0FDVElWSVRZKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShESVNNSVNTX0tFWUdVQVJEX0FDVElWSVRZLCB0cnVlKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShTSE9XX1dIRU5fTE9DS0VEX0FDVElWSVRZLCBpc0Rpc21pc3NUcmFuc2x1Y2VudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REaXNtaXNzS2V5Z3VhcmRfZnJvbVNob3dXaGVuTG9ja2VkX25vdEFsbG93ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IChmaW5hbCBMb2NrU2NyZWVuU2Vzc2lvbiBsb2NrU2NyZWVuU2Vzc2lvbiA9IG5ldyBMb2NrU2NyZWVuU2Vzc2lvbigpKSB7CisgICAgICAgICAgICBsb2NrU2NyZWVuU2Vzc2lvbi5zZXRMb2NrQ3JlZGVudGlhbCgpCisgICAgICAgICAgICAgICAgICAgIC5nb3RvS2V5Z3VhcmQoKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0S2V5Z3VhcmRTaG93aW5nQW5kTm90T2NjbHVkZWQoKTsKKyAgICAgICAgICAgIGxhdW5jaEFjdGl2aXR5KFNIT1dfV0hFTl9MT0NLRURfQUNUSVZJVFkpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUoU0hPV19XSEVOX0xPQ0tFRF9BQ1RJVklUWSk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoU0hPV19XSEVOX0xPQ0tFRF9BQ1RJVklUWSwgdHJ1ZSk7CisgICAgICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKERJU01JU1NfS0VZR1VBUkRfQlJPQURDQVNUKTsKKyAgICAgICAgICAgIGxvY2tTY3JlZW5TZXNzaW9uLmVudGVyQW5kQ29uZmlybUxvY2tDcmVkZW50aWFsKCk7CisKKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBzdGF5IG9uIEtleWd1YXJkLgorICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRLZXlndWFyZFNob3dpbmdBbmRPY2NsdWRlZCgpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFNIT1dfV0hFTl9MT0NLRURfQUNUSVZJVFksIHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzbWlzc0tleWd1YXJkQWN0aXZpdHlfbWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSAoZmluYWwgTG9ja1NjcmVlblNlc3Npb24gbG9ja1NjcmVlblNlc3Npb24gPSBuZXcgTG9ja1NjcmVlblNlc3Npb24oKSkgeworICAgICAgICAgICAgbG9ja1NjcmVlblNlc3Npb24uc2V0TG9ja0NyZWRlbnRpYWwoKTsKKyAgICAgICAgICAgIGZpbmFsIExvZ1NlcGFyYXRvciBsb2dTZXBhcmF0b3IgPSBzZXBhcmF0ZUxvZ3MoKTsKKyAgICAgICAgICAgIGxvY2tTY3JlZW5TZXNzaW9uLmdvdG9LZXlndWFyZCgpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUodHJ1ZSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEtleWd1YXJkQ29udHJvbGxlclN0YXRlKCkua2V5Z3VhcmRTaG93aW5nKTsKKyAgICAgICAgICAgIGxhdW5jaEFjdGl2aXR5KERJU01JU1NfS0VZR1VBUkRfTUVUSE9EX0FDVElWSVRZKTsKKyAgICAgICAgICAgIGxvY2tTY3JlZW5TZXNzaW9uLmVudGVyQW5kQ29uZmlybUxvY2tDcmVkZW50aWFsKCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JLZXlndWFyZEdvbmUoKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKERJU01JU1NfS0VZR1VBUkRfTUVUSE9EX0FDVElWSVRZKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShESVNNSVNTX0tFWUdVQVJEX01FVEhPRF9BQ1RJVklUWSwgdHJ1ZSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRLZXlndWFyZENvbnRyb2xsZXJTdGF0ZSgpLmtleWd1YXJkU2hvd2luZyk7CisgICAgICAgICAgICBhc3NlcnRPbkRpc21pc3NTdWNjZWVkZWRJbkxvZ2NhdChsb2dTZXBhcmF0b3IpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzbWlzc0tleWd1YXJkQWN0aXZpdHlfbWV0aG9kX2NhbmNlbGxlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgKGZpbmFsIExvY2tTY3JlZW5TZXNzaW9uIGxvY2tTY3JlZW5TZXNzaW9uID0gbmV3IExvY2tTY3JlZW5TZXNzaW9uKCkpIHsKKyAgICAgICAgICAgIGxvY2tTY3JlZW5TZXNzaW9uLnNldExvY2tDcmVkZW50aWFsKCk7CisgICAgICAgICAgICBmaW5hbCBMb2dTZXBhcmF0b3IgbG9nU2VwYXJhdG9yID0gc2VwYXJhdGVMb2dzKCk7CisgICAgICAgICAgICBsb2NrU2NyZWVuU2Vzc2lvbi5nb3RvS2V5Z3VhcmQoKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKHRydWUpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRLZXlndWFyZENvbnRyb2xsZXJTdGF0ZSgpLmtleWd1YXJkU2hvd2luZyk7CisgICAgICAgICAgICBsYXVuY2hBY3Rpdml0eShESVNNSVNTX0tFWUdVQVJEX01FVEhPRF9BQ1RJVklUWSk7CisgICAgICAgICAgICBwcmVzc0JhY2tCdXR0b24oKTsKKyAgICAgICAgICAgIGFzc2VydE9uRGlzbWlzc0NhbmNlbGxlZEluTG9nY2F0KGxvZ1NlcGFyYXRvcik7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZSh0cnVlKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShESVNNSVNTX0tFWUdVQVJEX01FVEhPRF9BQ1RJVklUWSwgZmFsc2UpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRLZXlndWFyZENvbnRyb2xsZXJTdGF0ZSgpLmtleWd1YXJkU2hvd2luZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REaXNtaXNzS2V5Z3VhcmRBdHRyQWN0aXZpdHlfbWV0aG9kX3R1cm5TY3JlZW5Pbl93aXRoU2VjdXJlS2V5Z3VhcmQoKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSAoZmluYWwgTG9ja1NjcmVlblNlc3Npb24gbG9ja1NjcmVlblNlc3Npb24gPSBuZXcgTG9ja1NjcmVlblNlc3Npb24oKSkgeworICAgICAgICAgICAgbG9ja1NjcmVlblNlc3Npb24uc2V0TG9ja0NyZWRlbnRpYWwoKS5zbGVlcERldmljZSgpOworCisgICAgICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZSh0cnVlKTsKKyAgICAgICAgICAgIGlmICghaXNXYXRjaCgpKSB7CisgICAgICAgICAgICAgICAgLy8gT24gUCB3YXRjaGVzLCBrZXlndWFyZCB3aW5kb3dzIGFyZSBvbmx5IHNob3duIHdoaWxlIGluIGludGVyYWN0aXZlIHRvIGFsbG93CisgICAgICAgICAgICAgICAgLy8gU3lzVUkgaW1wbGVtZW50YXRpb24gdG8gc2hvdyBpbiBhbWJpZW50IG1vZGUuCisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRLZXlndWFyZENvbnRyb2xsZXJTdGF0ZSgpLmtleWd1YXJkU2hvd2luZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsYXVuY2hBY3Rpdml0eShUVVJOX1NDUkVFTl9PTl9BVFRSX0RJU01JU1NfS0VZR1VBUkRfQUNUSVZJVFkpOworICAgICAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yS2V5Z3VhcmRTaG93aW5nQW5kTm90T2NjbHVkZWQoKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShUVVJOX1NDUkVFTl9PTl9BVFRSX0RJU01JU1NfS0VZR1VBUkRfQUNUSVZJVFksIGZhbHNlKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0S2V5Z3VhcmRDb250cm9sbGVyU3RhdGUoKS5rZXlndWFyZFNob3dpbmcpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpc0Rpc3BsYXlPbigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVudGVyUGlwT3ZlcktleWd1YXJkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc3VtZVRydWUoc3VwcG9ydHNQaXAoKSk7CisKKyAgICAgICAgdHJ5IChmaW5hbCBMb2NrU2NyZWVuU2Vzc2lvbiBsb2NrU2NyZWVuU2Vzc2lvbiA9IG5ldyBMb2NrU2NyZWVuU2Vzc2lvbigpKSB7CisgICAgICAgICAgICBsb2NrU2NyZWVuU2Vzc2lvbi5zZXRMb2NrQ3JlZGVudGlhbCgpOworCisgICAgICAgICAgICAvLyBTaG93IHRoZSBQaVAgYWN0aXZpdHkgaW4gZnVsbHNjcmVlbgorICAgICAgICAgICAgbGF1bmNoQWN0aXZpdHkoUElQX0FDVElWSVRZLCBFWFRSQV9TSE9XX09WRVJfS0VZR1VBUkQsICJ0cnVlIik7CisKKyAgICAgICAgICAgIC8vIEdvIHRvIHRoZSBsb2Nrc2NyZWVuCisgICAgICAgICAgICBsb2NrU2NyZWVuU2Vzc2lvbi5nb3RvS2V5Z3VhcmQoKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvcktleWd1YXJkU2hvd2luZ0FuZE9jY2x1ZGVkKCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEtleWd1YXJkU2hvd2luZ0FuZE9jY2x1ZGVkKCk7CisKKyAgICAgICAgICAgIC8vIFJlcXVlc3QgdGhhdCB0aGUgUGlQIGFjdGl2aXR5IGVudGVyIHBpY3R1cmUtaW4tcGljdHVyZSBtb2RlIChlbnN1cmUgaXQgZG9lcyBub3QpCisgICAgICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKCJhbSBicm9hZGNhc3QgLWEgIiArIEFDVElPTl9FTlRFUl9QSVApOworICAgICAgICAgICAgd2FpdEZvckVudGVyUGlwKFBJUF9BQ1RJVklUWSk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydERvZXNOb3RDb250YWluU3RhY2soIk11c3Qgbm90IGNvbnRhaW4gcGlubmVkIHN0YWNrLiIsCisgICAgICAgICAgICAgICAgICAgIFdJTkRPV0lOR19NT0RFX1BJTk5FRCwgQUNUSVZJVFlfVFlQRV9TVEFOREFSRCk7CisKKyAgICAgICAgICAgIC8vIEVudGVyIHRoZSBjcmVkZW50aWFscyBhbmQgZW5zdXJlIHRoYXQgdGhlIGFjdGl2aXR5IGFjdHVhbGx5IGVudGVyZWQgcGljdHVyZS1pbgorICAgICAgICAgICAgLy8gLXBpY3R1cmUKKyAgICAgICAgICAgIGxvY2tTY3JlZW5TZXNzaW9uLmVudGVyQW5kQ29uZmlybUxvY2tDcmVkZW50aWFsKCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JLZXlndWFyZEdvbmUoKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0S2V5Z3VhcmRHb25lKCk7CisgICAgICAgICAgICB3YWl0Rm9yRW50ZXJQaXAoUElQX0FDVElWSVRZKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Q29udGFpbnNTdGFjaygiTXVzdCBjb250YWluIHBpbm5lZCBzdGFjay4iLCBXSU5ET1dJTkdfTU9ERV9QSU5ORUQsCisgICAgICAgICAgICAgICAgICAgIEFDVElWSVRZX1RZUEVfU1RBTkRBUkQpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2hvd1doZW5Mb2NrZWRBY3Rpdml0eUFuZFBpcEFjdGl2aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc3VtZVRydWUoc3VwcG9ydHNQaXAoKSk7CisKKyAgICAgICAgdHJ5IChmaW5hbCBMb2NrU2NyZWVuU2Vzc2lvbiBsb2NrU2NyZWVuU2Vzc2lvbiA9IG5ldyBMb2NrU2NyZWVuU2Vzc2lvbigpKSB7CisgICAgICAgICAgICBsb2NrU2NyZWVuU2Vzc2lvbi5zZXRMb2NrQ3JlZGVudGlhbCgpOworCisgICAgICAgICAgICAvLyBTaG93IGFuIGFjdGl2aXR5IGluIFBJUAorICAgICAgICAgICAgbGF1bmNoQWN0aXZpdHkoUElQX0FDVElWSVRZLCBFWFRSQV9FTlRFUl9QSVAsICJ0cnVlIik7CisgICAgICAgICAgICB3YWl0Rm9yRW50ZXJQaXAoUElQX0FDVElWSVRZKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0Q29udGFpbnNTdGFjaygiTXVzdCBjb250YWluIHBpbm5lZCBzdGFjay4iLCBXSU5ET1dJTkdfTU9ERV9QSU5ORUQsCisgICAgICAgICAgICAgICAgICAgIEFDVElWSVRZX1RZUEVfU1RBTkRBUkQpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFBJUF9BQ1RJVklUWSwgdHJ1ZSk7CisKKyAgICAgICAgICAgIC8vIFNob3cgYW4gYWN0aXZpdHkgdGhhdCB3aWxsIGtlZXAgYWJvdmUgdGhlIGtleWd1YXJkCisgICAgICAgICAgICBsYXVuY2hBY3Rpdml0eShTSE9XX1dIRU5fTE9DS0VEX0FDVElWSVRZKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKFNIT1dfV0hFTl9MT0NLRURfQUNUSVZJVFkpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFNIT1dfV0hFTl9MT0NLRURfQUNUSVZJVFksIHRydWUpOworCisgICAgICAgICAgICAvLyBMb2NrIHRoZSBzY3JlZW4gYW5kIGVuc3VyZSB0aGF0IHRoZSBmdWxsc2NyZWVuIGFjdGl2aXR5IHNob3dpbmcgb3ZlciB0aGUgbG9ja3NjcmVlbgorICAgICAgICAgICAgLy8gaXMgdmlzaWJsZSwgYnV0IG5vdCB0aGUgUGlQIGFjdGl2aXR5CisgICAgICAgICAgICBsb2NrU2NyZWVuU2Vzc2lvbi5nb3RvS2V5Z3VhcmQoKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKHRydWUpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRLZXlndWFyZFNob3dpbmdBbmRPY2NsdWRlZCgpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFNIT1dfV0hFTl9MT0NLRURfQUNUSVZJVFksIHRydWUpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFBJUF9BQ1RJVklUWSwgZmFsc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2hvd1doZW5Mb2NrZWRQaXBBY3Rpdml0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3N1bWVUcnVlKHN1cHBvcnRzUGlwKCkpOworCisgICAgICAgIHRyeSAoZmluYWwgTG9ja1NjcmVlblNlc3Npb24gbG9ja1NjcmVlblNlc3Npb24gPSBuZXcgTG9ja1NjcmVlblNlc3Npb24oKSkgeworICAgICAgICAgICAgbG9ja1NjcmVlblNlc3Npb24uc2V0TG9ja0NyZWRlbnRpYWwoKTsKKworICAgICAgICAgICAgLy8gU2hvdyBhbiBhY3Rpdml0eSBpbiBQSVAKKyAgICAgICAgICAgIGxhdW5jaEFjdGl2aXR5KFBJUF9BQ1RJVklUWSwgRVhUUkFfRU5URVJfUElQLCAidHJ1ZSIsCisgICAgICAgICAgICAgICAgICAgIEVYVFJBX1NIT1dfT1ZFUl9LRVlHVUFSRCwgInRydWUiKTsKKyAgICAgICAgICAgIHdhaXRGb3JFbnRlclBpcChQSVBfQUNUSVZJVFkpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRDb250YWluc1N0YWNrKCJNdXN0IGNvbnRhaW4gcGlubmVkIHN0YWNrLiIsIFdJTkRPV0lOR19NT0RFX1BJTk5FRCwKKyAgICAgICAgICAgICAgICAgICAgQUNUSVZJVFlfVFlQRV9TVEFOREFSRCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoUElQX0FDVElWSVRZLCB0cnVlKTsKKworICAgICAgICAgICAgLy8gTG9jayB0aGUgc2NyZWVuIGFuZCBlbnN1cmUgdGhlIFBpUCBhY3Rpdml0eSBpcyBub3QgdmlzaWJsZSBvbiB0aGUgbG9ja3NjcmVlbiBldmVuCisgICAgICAgICAgICAvLyB0aG91Z2ggaXQncyBtYXJrZWQgYXMgc2hvd2luZyBvdmVyIHRoZSBsb2Nrc2NyZWVuIGl0c2VsZgorICAgICAgICAgICAgbG9ja1NjcmVlblNlc3Npb24uZ290b0tleWd1YXJkKCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEtleWd1YXJkU2hvd2luZ0FuZE5vdE9jY2x1ZGVkKCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoUElQX0FDVElWSVRZLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXYWl0cyB1bnRpbCB0aGUgZ2l2ZW4gYWN0aXZpdHkgaGFzIGVudGVyZWQgcGljdHVyZS1pbi1waWN0dXJlIG1vZGUgKGFsbG93aW5nIGZvciB0aGUKKyAgICAgKiBzdWJzZXF1ZW50IGFuaW1hdGlvbiB0byBzdGFydCkuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHdhaXRGb3JFbnRlclBpcChDb21wb25lbnROYW1lIGFjdGl2aXR5TmFtZSkgeworICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JWYWxpZFN0YXRlKG5ldyBXYWl0Rm9yVmFsaWRBY3Rpdml0eVN0YXRlLkJ1aWxkZXIoYWN0aXZpdHlOYW1lKQorICAgICAgICAgICAgICAgIC5zZXRXaW5kb3dpbmdNb2RlKFdJTkRPV0lOR19NT0RFX1BJTk5FRCkKKyAgICAgICAgICAgICAgICAuc2V0QWN0aXZpdHlUeXBlKEFDVElWSVRZX1RZUEVfU1RBTkRBUkQpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vS2V5Z3VhcmRUZXN0QmFzZS5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9LZXlndWFyZFRlc3RCYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI5MWViOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vS2V5Z3VhcmRUZXN0QmFzZS5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW07CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5LZXlndWFyZERpc21pc3NMb2dnZXJDYWxsYmFjay5FTlRSWV9PTl9ESVNNSVNTX0NBTkNFTExFRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5LZXlndWFyZERpc21pc3NMb2dnZXJDYWxsYmFjay5FTlRSWV9PTl9ESVNNSVNTX0VSUk9SOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLktleWd1YXJkRGlzbWlzc0xvZ2dlckNhbGxiYWNrLkVOVFJZX09OX0RJU01JU1NfU1VDQ0VFREVEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLktleWd1YXJkRGlzbWlzc0xvZ2dlckNhbGxiYWNrLktFWUdVQVJEX0RJU01JU1NfTE9HX1RBRzsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uU3RhdGVMb2dnZXIubG9nOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5TdGF0ZUxvZ2dlci5sb2dBbHdheXM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCitpbXBvcnQgYW5kcm9pZC5hcHAuS2V5Z3VhcmRNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CisKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKKworY2xhc3MgS2V5Z3VhcmRUZXN0QmFzZSBleHRlbmRzIEFjdGl2aXR5TWFuYWdlclRlc3RCYXNlIHsKKworICAgIEtleWd1YXJkTWFuYWdlciBtS2V5Z3VhcmRNYW5hZ2VyOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgbUtleWd1YXJkTWFuYWdlciA9IG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoS2V5Z3VhcmRNYW5hZ2VyLmNsYXNzKTsKKyAgICB9CisKKyAgICB2b2lkIGFzc2VydE9uRGlzbWlzc1N1Y2NlZWRlZEluTG9nY2F0KExvZ1NlcGFyYXRvciBsb2dTZXBhcmF0b3IpIHsKKyAgICAgICAgYXNzZXJ0SW5Mb2djYXQoS0VZR1VBUkRfRElTTUlTU19MT0dfVEFHLCBFTlRSWV9PTl9ESVNNSVNTX1NVQ0NFRURFRCwgbG9nU2VwYXJhdG9yKTsKKyAgICB9CisKKyAgICB2b2lkIGFzc2VydE9uRGlzbWlzc0NhbmNlbGxlZEluTG9nY2F0KExvZ1NlcGFyYXRvciBsb2dTZXBhcmF0b3IpIHsKKyAgICAgICAgYXNzZXJ0SW5Mb2djYXQoS0VZR1VBUkRfRElTTUlTU19MT0dfVEFHLCBFTlRSWV9PTl9ESVNNSVNTX0NBTkNFTExFRCwgbG9nU2VwYXJhdG9yKTsKKyAgICB9CisKKyAgICB2b2lkIGFzc2VydE9uRGlzbWlzc0Vycm9ySW5Mb2djYXQoTG9nU2VwYXJhdG9yIGxvZ1NlcGFyYXRvcikgeworICAgICAgICBhc3NlcnRJbkxvZ2NhdChLRVlHVUFSRF9ESVNNSVNTX0xPR19UQUcsIEVOVFJZX09OX0RJU01JU1NfRVJST1IsIGxvZ1NlcGFyYXRvcik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydEluTG9nY2F0KFN0cmluZyBsb2dUYWcsIFN0cmluZyBlbnRyeSwgTG9nU2VwYXJhdG9yIGxvZ1NlcGFyYXRvcikgeworICAgICAgICBmaW5hbCBQYXR0ZXJuIHBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoIiguKykiICsgZW50cnkpOworICAgICAgICBmb3IgKGludCByZXRyeSA9IDE7IHJldHJ5IDw9IDU7IHJldHJ5KyspIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIGxpbmVzID0gZ2V0RGV2aWNlTG9nc0ZvckNvbXBvbmVudHMobG9nU2VwYXJhdG9yLCBsb2dUYWcpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IGxpbmVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxpbmUgPSBsaW5lc1tpXS50cmltKCk7CisgICAgICAgICAgICAgICAgbG9nKGxpbmUpOworICAgICAgICAgICAgICAgIE1hdGNoZXIgbWF0Y2hlciA9IHBhdHRlcm4ubWF0Y2hlcihsaW5lKTsKKyAgICAgICAgICAgICAgICBpZiAobWF0Y2hlci5tYXRjaGVzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvZ0Fsd2F5cygiV2FpdGluZyBmb3IgIiArIGVudHJ5ICsgIi4uLiByZXRyeT0iICsgcmV0cnkpOworICAgICAgICAgICAgU3lzdGVtQ2xvY2suc2xlZXAoNTAwKTsKKyAgICAgICAgfQorICAgICAgICBmYWlsKCJXYWl0aW5nIGZvciAiICsgZW50cnkgKyAiIGZhaWxlZCIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vS2V5Z3VhcmRUZXN0cy5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9LZXlndWFyZFRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmYzZDFlYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vS2V5Z3VhcmRUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMzg3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLmFtOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLldpbmRvd0NvbmZpZ3VyYXRpb24uQUNUSVZJVFlfVFlQRV9TVEFOREFSRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuV2luZG93Q29uZmlndXJhdGlvbi5XSU5ET1dJTkdfTU9ERV9TUExJVF9TQ1JFRU5fUFJJTUFSWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50TmFtZVV0aWxzLmdldFdpbmRvd05hbWU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuQlJPQURDQVNUX1JFQ0VJVkVSX0FDVElWSVRZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLkJyb2FkY2FzdFJlY2VpdmVyQWN0aXZpdHkuQUNUSU9OX1RSSUdHRVJfQlJPQURDQVNUOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLkJyb2FkY2FzdFJlY2VpdmVyQWN0aXZpdHkuRVhUUkFfRElTTUlTU19LRVlHVUFSRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5Ccm9hZGNhc3RSZWNlaXZlckFjdGl2aXR5LkVYVFJBX0RJU01JU1NfS0VZR1VBUkRfTUVUSE9EOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLkJyb2FkY2FzdFJlY2VpdmVyQWN0aXZpdHkuRVhUUkFfRklOSVNIX0JST0FEQ0FTVDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5ESVNNSVNTX0tFWUdVQVJEX0FDVElWSVRZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLkRJU01JU1NfS0VZR1VBUkRfTUVUSE9EX0FDVElWSVRZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLktFWUdVQVJEX0xPQ0tfQUNUSVZJVFk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuTEFVTkNISU5HX0FDVElWSVRZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLlNIT1dfV0hFTl9MT0NLRURfQUNUSVZJVFk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuU0hPV19XSEVOX0xPQ0tFRF9BVFRSX0FDVElWSVRZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLlNIT1dfV0hFTl9MT0NLRURfRElBTE9HX0FDVElWSVRZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLlNIT1dfV0hFTl9MT0NLRURfVFJBTlNMVUNFTlRfQUNUSVZJVFk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuU0hPV19XSEVOX0xPQ0tFRF9XSVRIX0RJQUxPR19BQ1RJVklUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5URVNUX0FDVElWSVRZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLlRVUk5fU0NSRUVOX09OX0FUVFJfRElTTUlTU19LRVlHVUFSRF9BQ1RJVklUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5UVVJOX1NDUkVFTl9PTl9ESVNNSVNTX0tFWUdVQVJEX0FDVElWSVRZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5VaURldmljZVV0aWxzLnByZXNzQmFja0J1dHRvbjsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uVWlEZXZpY2VVdGlscy5wcmVzc0hvbWVCdXR0b247CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5TdXJmYWNlLlJPVEFUSU9OXzkwOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9XQUxMUEFQRVI7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3N1bWUuYXNzdW1lVHJ1ZTsKKworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5QcmVzdWJtaXQ7CitpbXBvcnQgYW5kcm9pZC5zZXJ2ZXIuYW0uV2luZG93TWFuYWdlclN0YXRlLldpbmRvd1N0YXRlOworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBCdWlsZC9JbnN0YWxsL1J1bjoKKyAqICAgICBhdGVzdCBDdHNBY3Rpdml0eU1hbmFnZXJEZXZpY2VUZXN0Q2FzZXM6S2V5Z3VhcmRUZXN0cworICovCitwdWJsaWMgY2xhc3MgS2V5Z3VhcmRUZXN0cyBleHRlbmRzIEtleWd1YXJkVGVzdEJhc2UgeworCisgICAgLy8gVE9ETyhiLzcwMjQ3MDU4KTogVXNlIHtAbGluayBDb250ZXh0I3NlbmRCcm9hZGNhc3QoSW50ZW50KS4KKyAgICAvLyBTaGVsbCBjb21tYW5kIHRvIGRpc21pc3Mga2V5Z3VhcmQgdmlhIHtAbGluayAjQlJPQURDQVNUX1JFQ0VJVkVSX0FDVElWSVRZfS4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTTUlTU19LRVlHVUFSRF9CUk9BRENBU1QgPSAiYW0gYnJvYWRjYXN0IC1hICIKKyAgICAgICAgICAgICsgQUNUSU9OX1RSSUdHRVJfQlJPQURDQVNUICsgIiAtLWV6ICIgKyBFWFRSQV9ESVNNSVNTX0tFWUdVQVJEICsgIiB0cnVlIjsKKyAgICAvLyBTaGVsbCBjb21tYW5kIHRvIGRpc21pc3Mga2V5Z3VhcmQgdmlhIHtAbGluayAjQlJPQURDQVNUX1JFQ0VJVkVSX0FDVElWSVRZfSBtZXRob2QuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERJU01JU1NfS0VZR1VBUkRfTUVUSE9EX0JST0FEQ0FTVCA9ICJhbSBicm9hZGNhc3QgLWEgIgorICAgICAgICAgICAgKyBBQ1RJT05fVFJJR0dFUl9CUk9BRENBU1QgKyAiIC0tZXogIiArIEVYVFJBX0RJU01JU1NfS0VZR1VBUkRfTUVUSE9EICsgIiB0cnVlIjsKKworICAgIEBCZWZvcmUKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworCisgICAgICAgIGFzc3VtZVRydWUoc3VwcG9ydHNJbnNlY3VyZUxvY2soKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGlzVWlNb2RlTG9ja2VkVG9WckhlYWRzZXQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5Z3VhcmRIaWRlc0FjdGl2aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSAoZmluYWwgTG9ja1NjcmVlblNlc3Npb24gbG9ja1NjcmVlblNlc3Npb24gPSBuZXcgTG9ja1NjcmVlblNlc3Npb24oKSkgeworICAgICAgICAgICAgbGF1bmNoQWN0aXZpdHkoVEVTVF9BQ1RJVklUWSk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShURVNUX0FDVElWSVRZKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShURVNUX0FDVElWSVRZLCB0cnVlKTsKKyAgICAgICAgICAgIGxvY2tTY3JlZW5TZXNzaW9uLmdvdG9LZXlndWFyZCgpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUodHJ1ZSk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEtleWd1YXJkU2hvd2luZ0FuZE5vdE9jY2x1ZGVkKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKG1LZXlndWFyZE1hbmFnZXIuaXNLZXlndWFyZExvY2tlZCgpKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShURVNUX0FDVElWSVRZLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RmFsc2UobUtleWd1YXJkTWFuYWdlci5pc0tleWd1YXJkTG9ja2VkKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNob3dXaGVuTG9ja2VkQWN0aXZpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IChmaW5hbCBMb2NrU2NyZWVuU2Vzc2lvbiBsb2NrU2NyZWVuU2Vzc2lvbiA9IG5ldyBMb2NrU2NyZWVuU2Vzc2lvbigpKSB7CisgICAgICAgICAgICBsYXVuY2hBY3Rpdml0eShTSE9XX1dIRU5fTE9DS0VEX0FDVElWSVRZKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKFNIT1dfV0hFTl9MT0NLRURfQUNUSVZJVFkpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFNIT1dfV0hFTl9MT0NLRURfQUNUSVZJVFksIHRydWUpOworICAgICAgICAgICAgbG9ja1NjcmVlblNlc3Npb24uZ290b0tleWd1YXJkKCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZSh0cnVlKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShTSE9XX1dIRU5fTE9DS0VEX0FDVElWSVRZLCB0cnVlKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0S2V5Z3VhcmRTaG93aW5nQW5kT2NjbHVkZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHdoZXRoZXIgZGlhbG9ncyBmcm9tIFNIT1dfV0hFTl9MT0NLRUQgYWN0aXZpdGllcyBhcmUgYWxzbyB2aXNpYmxlIGlmIEtleWd1YXJkIGlzCisgICAgICogc2hvd2luZy4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaG93V2hlbkxvY2tlZEFjdGl2aXR5X3dpdGhEaWFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IChmaW5hbCBMb2NrU2NyZWVuU2Vzc2lvbiBsb2NrU2NyZWVuU2Vzc2lvbiA9IG5ldyBMb2NrU2NyZWVuU2Vzc2lvbigpKSB7CisgICAgICAgICAgICBsYXVuY2hBY3Rpdml0eShTSE9XX1dIRU5fTE9DS0VEX1dJVEhfRElBTE9HX0FDVElWSVRZKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKFNIT1dfV0hFTl9MT0NLRURfV0lUSF9ESUFMT0dfQUNUSVZJVFkpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFNIT1dfV0hFTl9MT0NLRURfV0lUSF9ESUFMT0dfQUNUSVZJVFksIHRydWUpOworICAgICAgICAgICAgbG9ja1NjcmVlblNlc3Npb24uZ290b0tleWd1YXJkKCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZSh0cnVlKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShTSE9XX1dIRU5fTE9DS0VEX1dJVEhfRElBTE9HX0FDVElWSVRZLCB0cnVlKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobUFtV21TdGF0ZS5nZXRXbVN0YXRlKCkuYWxsV2luZG93c1Zpc2libGUoCisgICAgICAgICAgICAgICAgICAgIGdldFdpbmRvd05hbWUoU0hPV19XSEVOX0xPQ0tFRF9XSVRIX0RJQUxPR19BQ1RJVklUWSkpKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0S2V5Z3VhcmRTaG93aW5nQW5kT2NjbHVkZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHdoZXRoZXIgbXVsdGlwbGUgU0hPV19XSEVOX0xPQ0tFRCBhY3Rpdml0aWVzIGFyZSBzaG93biBpZiB0aGUgdG9wbW9zdCBpcyB0cmFuc2x1Y2VudC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZVNob3dXaGVuTG9ja2VkQWN0aXZpdGllcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgKGZpbmFsIExvY2tTY3JlZW5TZXNzaW9uIGxvY2tTY3JlZW5TZXNzaW9uID0gbmV3IExvY2tTY3JlZW5TZXNzaW9uKCkpIHsKKyAgICAgICAgICAgIGxhdW5jaEFjdGl2aXR5KFNIT1dfV0hFTl9MT0NLRURfQUNUSVZJVFkpOworICAgICAgICAgICAgbGF1bmNoQWN0aXZpdHkoU0hPV19XSEVOX0xPQ0tFRF9UUkFOU0xVQ0VOVF9BQ1RJVklUWSk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShTSE9XX1dIRU5fTE9DS0VEX0FDVElWSVRZLAorICAgICAgICAgICAgICAgICAgICBTSE9XX1dIRU5fTE9DS0VEX1RSQU5TTFVDRU5UX0FDVElWSVRZKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShTSE9XX1dIRU5fTE9DS0VEX0FDVElWSVRZLCB0cnVlKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShTSE9XX1dIRU5fTE9DS0VEX1RSQU5TTFVDRU5UX0FDVElWSVRZLCB0cnVlKTsKKyAgICAgICAgICAgIGxvY2tTY3JlZW5TZXNzaW9uLmdvdG9LZXlndWFyZCgpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUodHJ1ZSk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoU0hPV19XSEVOX0xPQ0tFRF9BQ1RJVklUWSwgdHJ1ZSk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoU0hPV19XSEVOX0xPQ0tFRF9UUkFOU0xVQ0VOVF9BQ1RJVklUWSwgdHJ1ZSk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEtleWd1YXJkU2hvd2luZ0FuZE9jY2x1ZGVkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB3ZSBoYXZlIGEgdHJhbnNsdWNlbnQgU0hPV19XSEVOX0xPQ0tFRF9BQ1RJVklUWSwgdGhlIHdhbGxwYXBlciBzaG91bGQgYWxzbyBiZSBzaG93aW5nLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRyYW5zbHVjZW50U2hvd1doZW5Mb2NrZWRBY3Rpdml0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgKGZpbmFsIExvY2tTY3JlZW5TZXNzaW9uIGxvY2tTY3JlZW5TZXNzaW9uID0gbmV3IExvY2tTY3JlZW5TZXNzaW9uKCkpIHsKKyAgICAgICAgICAgIGxhdW5jaEFjdGl2aXR5KFNIT1dfV0hFTl9MT0NLRURfVFJBTlNMVUNFTlRfQUNUSVZJVFkpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUoU0hPV19XSEVOX0xPQ0tFRF9UUkFOU0xVQ0VOVF9BQ1RJVklUWSk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoU0hPV19XSEVOX0xPQ0tFRF9UUkFOU0xVQ0VOVF9BQ1RJVklUWSwgdHJ1ZSk7CisgICAgICAgICAgICBsb2NrU2NyZWVuU2Vzc2lvbi5nb3RvS2V5Z3VhcmQoKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKHRydWUpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFNIT1dfV0hFTl9MT0NLRURfVFJBTlNMVUNFTlRfQUNUSVZJVFksIHRydWUpOworICAgICAgICAgICAgYXNzZXJ0V2FsbHBhcGVyU2hvd2luZygpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRLZXlndWFyZFNob3dpbmdBbmRPY2NsdWRlZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgd2UgaGF2ZSBhIHRyYW5zbHVjZW50IFNIT1dfV0hFTl9MT0NLRUQgYWN0aXZpdHksIHRoZSBhY3Rpdml0eSBiZWhpbmQgc2hvdWxkIG5vdCBiZSBzaG93bi4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUcmFuc2x1Y2VudERvZXNudFJldmVhbEJlaGluZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgKGZpbmFsIExvY2tTY3JlZW5TZXNzaW9uIGxvY2tTY3JlZW5TZXNzaW9uID0gbmV3IExvY2tTY3JlZW5TZXNzaW9uKCkpIHsKKyAgICAgICAgICAgIGxhdW5jaEFjdGl2aXR5KFRFU1RfQUNUSVZJVFkpOworICAgICAgICAgICAgbGF1bmNoQWN0aXZpdHkoU0hPV19XSEVOX0xPQ0tFRF9UUkFOU0xVQ0VOVF9BQ1RJVklUWSk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShURVNUX0FDVElWSVRZLCBTSE9XX1dIRU5fTE9DS0VEX1RSQU5TTFVDRU5UX0FDVElWSVRZKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShURVNUX0FDVElWSVRZLCB0cnVlKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShTSE9XX1dIRU5fTE9DS0VEX1RSQU5TTFVDRU5UX0FDVElWSVRZLCB0cnVlKTsKKyAgICAgICAgICAgIGxvY2tTY3JlZW5TZXNzaW9uLmdvdG9LZXlndWFyZCgpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUodHJ1ZSk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoU0hPV19XSEVOX0xPQ0tFRF9UUkFOU0xVQ0VOVF9BQ1RJVklUWSwgdHJ1ZSk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoVEVTVF9BQ1RJVklUWSwgZmFsc2UpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRLZXlndWFyZFNob3dpbmdBbmRPY2NsdWRlZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlhbG9nU2hvd1doZW5Mb2NrZWRBY3Rpdml0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgKGZpbmFsIExvY2tTY3JlZW5TZXNzaW9uIGxvY2tTY3JlZW5TZXNzaW9uID0gbmV3IExvY2tTY3JlZW5TZXNzaW9uKCkpIHsKKyAgICAgICAgICAgIGxhdW5jaEFjdGl2aXR5KFNIT1dfV0hFTl9MT0NLRURfRElBTE9HX0FDVElWSVRZKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKFNIT1dfV0hFTl9MT0NLRURfRElBTE9HX0FDVElWSVRZKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShTSE9XX1dIRU5fTE9DS0VEX0RJQUxPR19BQ1RJVklUWSwgdHJ1ZSk7CisgICAgICAgICAgICBsb2NrU2NyZWVuU2Vzc2lvbi5nb3RvS2V5Z3VhcmQoKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKHRydWUpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFNIT1dfV0hFTl9MT0NLRURfRElBTE9HX0FDVElWSVRZLCB0cnVlKTsKKyAgICAgICAgICAgIGFzc2VydFdhbGxwYXBlclNob3dpbmcoKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0S2V5Z3VhcmRTaG93aW5nQW5kT2NjbHVkZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhhdCBzaG93V2hlbkxvY2tlZCBhY3Rpdml0eSBpcyBmdWxsc2NyZWVuIHdoZW4gc2hvd24gb3ZlciBrZXlndWFyZAorICAgICAqLworICAgIEBUZXN0CisgICAgQFByZXN1Ym1pdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaG93V2hlbkxvY2tlZEFjdGl2aXR5V2hpbGVTcGxpdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3N1bWVUcnVlKHN1cHBvcnRzU3BsaXRTY3JlZW5NdWx0aVdpbmRvdygpKTsKKworICAgICAgICB0cnkgKGZpbmFsIExvY2tTY3JlZW5TZXNzaW9uIGxvY2tTY3JlZW5TZXNzaW9uID0gbmV3IExvY2tTY3JlZW5TZXNzaW9uKCkpIHsKKyAgICAgICAgICAgIGxhdW5jaEFjdGl2aXRpZXNJblNwbGl0U2NyZWVuKAorICAgICAgICAgICAgICAgICAgICBnZXRMYXVuY2hBY3Rpdml0eUJ1aWxkZXIoKS5zZXRUYXJnZXRBY3Rpdml0eShMQVVOQ0hJTkdfQUNUSVZJVFkpLAorICAgICAgICAgICAgICAgICAgICBnZXRMYXVuY2hBY3Rpdml0eUJ1aWxkZXIoKS5zZXRUYXJnZXRBY3Rpdml0eShTSE9XX1dIRU5fTE9DS0VEX0FDVElWSVRZKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRSYW5kb21EYXRhKHRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldE11bHRpcGxlVGFzayhmYWxzZSkKKyAgICAgICAgICAgICk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoU0hPV19XSEVOX0xPQ0tFRF9BQ1RJVklUWSwgdHJ1ZSk7CisgICAgICAgICAgICBsb2NrU2NyZWVuU2Vzc2lvbi5nb3RvS2V5Z3VhcmQoKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKFNIT1dfV0hFTl9MT0NLRURfQUNUSVZJVFkpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFNIT1dfV0hFTl9MT0NLRURfQUNUSVZJVFksIHRydWUpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRLZXlndWFyZFNob3dpbmdBbmRPY2NsdWRlZCgpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnREb2VzTm90Q29udGFpblN0YWNrKCJBY3Rpdml0eSBtdXN0IGJlIGZ1bGwgc2NyZWVuLiIsCisgICAgICAgICAgICAgICAgICAgIFdJTkRPV0lOR19NT0RFX1NQTElUX1NDUkVFTl9QUklNQVJZLCBBQ1RJVklUWV9UWVBFX1NUQU5EQVJEKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHdoZXRoZXIgYSBGTEFHX0RJU01JU1NfS0VZR1VBUkQgYWN0aXZpdHkgb2NjbHVkZXMgS2V5Z3VhcmQuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzbWlzc0tleWd1YXJkQWN0aXZpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IChmaW5hbCBMb2NrU2NyZWVuU2Vzc2lvbiBsb2NrU2NyZWVuU2Vzc2lvbiA9IG5ldyBMb2NrU2NyZWVuU2Vzc2lvbigpKSB7CisgICAgICAgICAgICBsb2NrU2NyZWVuU2Vzc2lvbi5nb3RvS2V5Z3VhcmQoKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKHRydWUpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRLZXlndWFyZENvbnRyb2xsZXJTdGF0ZSgpLmtleWd1YXJkU2hvd2luZyk7CisgICAgICAgICAgICBsYXVuY2hBY3Rpdml0eShESVNNSVNTX0tFWUdVQVJEX0FDVElWSVRZKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvcktleWd1YXJkU2hvd2luZ0FuZE9jY2x1ZGVkKCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShESVNNSVNTX0tFWUdVQVJEX0FDVElWSVRZKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShESVNNSVNTX0tFWUdVQVJEX0FDVElWSVRZLCB0cnVlKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0S2V5Z3VhcmRTaG93aW5nQW5kT2NjbHVkZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERpc21pc3NLZXlndWFyZEFjdGl2aXR5X21ldGhvZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgKGZpbmFsIExvY2tTY3JlZW5TZXNzaW9uIGxvY2tTY3JlZW5TZXNzaW9uID0gbmV3IExvY2tTY3JlZW5TZXNzaW9uKCkpIHsKKyAgICAgICAgICAgIGZpbmFsIExvZ1NlcGFyYXRvciBsb2dTZXBhcmF0b3IgPSBzZXBhcmF0ZUxvZ3MoKTsKKyAgICAgICAgICAgIGxvY2tTY3JlZW5TZXNzaW9uLmdvdG9LZXlndWFyZCgpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUodHJ1ZSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEtleWd1YXJkQ29udHJvbGxlclN0YXRlKCkua2V5Z3VhcmRTaG93aW5nKTsKKyAgICAgICAgICAgIGxhdW5jaEFjdGl2aXR5KERJU01JU1NfS0VZR1VBUkRfTUVUSE9EX0FDVElWSVRZKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvcktleWd1YXJkR29uZSgpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUoRElTTUlTU19LRVlHVUFSRF9NRVRIT0RfQUNUSVZJVFkpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KERJU01JU1NfS0VZR1VBUkRfTUVUSE9EX0FDVElWSVRZLCB0cnVlKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEtleWd1YXJkQ29udHJvbGxlclN0YXRlKCkua2V5Z3VhcmRTaG93aW5nKTsKKyAgICAgICAgICAgIGFzc2VydE9uRGlzbWlzc1N1Y2NlZWRlZEluTG9nY2F0KGxvZ1NlcGFyYXRvcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REaXNtaXNzS2V5Z3VhcmRBY3Rpdml0eV9tZXRob2Rfbm90VG9wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSAoZmluYWwgTG9ja1NjcmVlblNlc3Npb24gbG9ja1NjcmVlblNlc3Npb24gPSBuZXcgTG9ja1NjcmVlblNlc3Npb24oKSkgeworICAgICAgICAgICAgZmluYWwgTG9nU2VwYXJhdG9yIGxvZ1NlcGFyYXRvciA9IHNlcGFyYXRlTG9ncygpOworICAgICAgICAgICAgbG9ja1NjcmVlblNlc3Npb24uZ290b0tleWd1YXJkKCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZSh0cnVlKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0S2V5Z3VhcmRDb250cm9sbGVyU3RhdGUoKS5rZXlndWFyZFNob3dpbmcpOworICAgICAgICAgICAgbGF1bmNoQWN0aXZpdHkoQlJPQURDQVNUX1JFQ0VJVkVSX0FDVElWSVRZKTsKKyAgICAgICAgICAgIGxhdW5jaEFjdGl2aXR5KFRFU1RfQUNUSVZJVFkpOworICAgICAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChESVNNSVNTX0tFWUdVQVJEX01FVEhPRF9CUk9BRENBU1QpOworICAgICAgICAgICAgYXNzZXJ0T25EaXNtaXNzRXJyb3JJbkxvZ2NhdChsb2dTZXBhcmF0b3IpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzbWlzc0tleWd1YXJkQWN0aXZpdHlfbWV0aG9kX3R1cm5TY3JlZW5PbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgKGZpbmFsIExvY2tTY3JlZW5TZXNzaW9uIGxvY2tTY3JlZW5TZXNzaW9uID0gbmV3IExvY2tTY3JlZW5TZXNzaW9uKCkpIHsKKyAgICAgICAgICAgIGZpbmFsIExvZ1NlcGFyYXRvciBsb2dTZXBhcmF0b3IgPSBzZXBhcmF0ZUxvZ3MoKTsKKyAgICAgICAgICAgIGxvY2tTY3JlZW5TZXNzaW9uLnNsZWVwRGV2aWNlKCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZSh0cnVlKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0S2V5Z3VhcmRDb250cm9sbGVyU3RhdGUoKS5rZXlndWFyZFNob3dpbmcpOworICAgICAgICAgICAgbGF1bmNoQWN0aXZpdHkoVFVSTl9TQ1JFRU5fT05fRElTTUlTU19LRVlHVUFSRF9BQ1RJVklUWSk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JLZXlndWFyZEdvbmUoKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKFRVUk5fU0NSRUVOX09OX0RJU01JU1NfS0VZR1VBUkRfQUNUSVZJVFkpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFRVUk5fU0NSRUVOX09OX0RJU01JU1NfS0VZR1VBUkRfQUNUSVZJVFksIHRydWUpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UobUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0S2V5Z3VhcmRDb250cm9sbGVyU3RhdGUoKS5rZXlndWFyZFNob3dpbmcpOworICAgICAgICAgICAgYXNzZXJ0T25EaXNtaXNzU3VjY2VlZGVkSW5Mb2djYXQobG9nU2VwYXJhdG9yKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoaXNEaXNwbGF5T24oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REaXNtaXNzS2V5Z3VhcmRfZnJvbVNob3dXaGVuTG9ja2VkX25vdEFsbG93ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IChmaW5hbCBMb2NrU2NyZWVuU2Vzc2lvbiBsb2NrU2NyZWVuU2Vzc2lvbiA9IG5ldyBMb2NrU2NyZWVuU2Vzc2lvbigpKSB7CisgICAgICAgICAgICBsb2NrU2NyZWVuU2Vzc2lvbi5nb3RvS2V5Z3VhcmQoKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0S2V5Z3VhcmRTaG93aW5nQW5kTm90T2NjbHVkZWQoKTsKKyAgICAgICAgICAgIGxhdW5jaEFjdGl2aXR5KFNIT1dfV0hFTl9MT0NLRURfQUNUSVZJVFkpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUoU0hPV19XSEVOX0xPQ0tFRF9BQ1RJVklUWSk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoU0hPV19XSEVOX0xPQ0tFRF9BQ1RJVklUWSwgdHJ1ZSk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEtleWd1YXJkU2hvd2luZ0FuZE9jY2x1ZGVkKCk7CisgICAgICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKERJU01JU1NfS0VZR1VBUkRfQlJPQURDQVNUKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0S2V5Z3VhcmRTaG93aW5nQW5kT2NjbHVkZWQoKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShTSE9XX1dIRU5fTE9DS0VEX0FDVElWSVRZLCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEtleWd1YXJkTG9jaygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgKGZpbmFsIExvY2tTY3JlZW5TZXNzaW9uIGxvY2tTY3JlZW5TZXNzaW9uID0gbmV3IExvY2tTY3JlZW5TZXNzaW9uKCkpIHsKKyAgICAgICAgICAgIGxvY2tTY3JlZW5TZXNzaW9uLmdvdG9LZXlndWFyZCgpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRLZXlndWFyZFNob3dpbmdBbmROb3RPY2NsdWRlZCgpOworICAgICAgICAgICAgbGF1bmNoQWN0aXZpdHkoS0VZR1VBUkRfTE9DS19BQ1RJVklUWSk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShLRVlHVUFSRF9MT0NLX0FDVElWSVRZKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShLRVlHVUFSRF9MT0NLX0FDVElWSVRZLCB0cnVlKTsKKyAgICAgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoRklOSVNIX0FDVElWSVRZX0JST0FEQ0FTVCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JLZXlndWFyZFNob3dpbmdBbmROb3RPY2NsdWRlZCgpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRLZXlndWFyZFNob3dpbmdBbmROb3RPY2NsdWRlZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VW5vY2NsdWRlUm90YXRpb25DaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBHbyBob21lIG5vdyB0byBtYWtlIHN1cmUgSG9tZSBpcyBiZWhpbmQgS2V5Z3VhcmQuCisgICAgICAgIHByZXNzSG9tZUJ1dHRvbigpOworICAgICAgICB0cnkgKGZpbmFsIExvY2tTY3JlZW5TZXNzaW9uIGxvY2tTY3JlZW5TZXNzaW9uID0gbmV3IExvY2tTY3JlZW5TZXNzaW9uKCk7CisgICAgICAgICAgICAgZmluYWwgUm90YXRpb25TZXNzaW9uIHJvdGF0aW9uU2Vzc2lvbiA9IG5ldyBSb3RhdGlvblNlc3Npb24oKSkgeworICAgICAgICAgICAgbG9ja1NjcmVlblNlc3Npb24uZ290b0tleWd1YXJkKCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEtleWd1YXJkU2hvd2luZ0FuZE5vdE9jY2x1ZGVkKCk7CisgICAgICAgICAgICBsYXVuY2hBY3Rpdml0eShTSE9XX1dIRU5fTE9DS0VEX0FDVElWSVRZKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKFNIT1dfV0hFTl9MT0NLRURfQUNUSVZJVFkpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFNIT1dfV0hFTl9MT0NLRURfQUNUSVZJVFksIHRydWUpOworCisgICAgICAgICAgICByb3RhdGlvblNlc3Npb24uc2V0KFJPVEFUSU9OXzkwKTsKKyAgICAgICAgICAgIHByZXNzQmFja0J1dHRvbigpOworICAgICAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yS2V5Z3VhcmRTaG93aW5nQW5kTm90T2NjbHVkZWQoKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvckRpc3BsYXlVbmZyb3plbigpOworICAgICAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yQXBwVHJhbnNpdGlvbklkbGUoKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0U2FuaXR5KCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydEhvbWVBY3Rpdml0eVZpc2libGUoZmFsc2UpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRLZXlndWFyZFNob3dpbmdBbmROb3RPY2NsdWRlZCgpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRWaXNpYmlsaXR5KFNIT1dfV0hFTl9MT0NLRURfQUNUSVZJVFksIGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRXYWxscGFwZXJTaG93aW5nKCkgeworICAgICAgICBXaW5kb3dTdGF0ZSB3YWxscGFwZXIgPQorICAgICAgICAgICAgICAgIG1BbVdtU3RhdGUuZ2V0V21TdGF0ZSgpLmZpbmRGaXJzdFdpbmRvd1dpdGhUeXBlKFRZUEVfV0FMTFBBUEVSKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh3YWxscGFwZXIpOworICAgICAgICBhc3NlcnRUcnVlKHdhbGxwYXBlci5pc1Nob3duKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERpc21pc3NLZXlndWFyZEF0dHJBY3Rpdml0eV9tZXRob2RfdHVyblNjcmVlbk9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSAoZmluYWwgTG9ja1NjcmVlblNlc3Npb24gbG9ja1NjcmVlblNlc3Npb24gPSBuZXcgTG9ja1NjcmVlblNlc3Npb24oKSkgeworICAgICAgICAgICAgbG9ja1NjcmVlblNlc3Npb24uc2xlZXBEZXZpY2UoKTsKKworICAgICAgICAgICAgZmluYWwgTG9nU2VwYXJhdG9yIGxvZ1NlcGFyYXRvciA9IHNlcGFyYXRlTG9ncygpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUodHJ1ZSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldEtleWd1YXJkQ29udHJvbGxlclN0YXRlKCkua2V5Z3VhcmRTaG93aW5nKTsKKyAgICAgICAgICAgIGxhdW5jaEFjdGl2aXR5KFRVUk5fU0NSRUVOX09OX0FUVFJfRElTTUlTU19LRVlHVUFSRF9BQ1RJVklUWSk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JLZXlndWFyZEdvbmUoKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShUVVJOX1NDUkVFTl9PTl9BVFRSX0RJU01JU1NfS0VZR1VBUkRfQUNUSVZJVFksIHRydWUpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UobUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0S2V5Z3VhcmRDb250cm9sbGVyU3RhdGUoKS5rZXlndWFyZFNob3dpbmcpOworICAgICAgICAgICAgYXNzZXJ0T25EaXNtaXNzU3VjY2VlZGVkSW5Mb2djYXQobG9nU2VwYXJhdG9yKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoaXNEaXNwbGF5T24oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTY3JlZW5PZmZXaGlsZU9jY2x1ZGVkU3RvcHNBY3Rpdml0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgKGZpbmFsIExvY2tTY3JlZW5TZXNzaW9uIGxvY2tTY3JlZW5TZXNzaW9uID0gbmV3IExvY2tTY3JlZW5TZXNzaW9uKCkpIHsKKyAgICAgICAgICAgIGZpbmFsIExvZ1NlcGFyYXRvciBsb2dTZXBhcmF0b3IgPSBzZXBhcmF0ZUxvZ3MoKTsKKyAgICAgICAgICAgIGxvY2tTY3JlZW5TZXNzaW9uLmdvdG9LZXlndWFyZCgpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRLZXlndWFyZFNob3dpbmdBbmROb3RPY2NsdWRlZCgpOworICAgICAgICAgICAgbGF1bmNoQWN0aXZpdHkoU0hPV19XSEVOX0xPQ0tFRF9BVFRSX0FDVElWSVRZKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKFNIT1dfV0hFTl9MT0NLRURfQVRUUl9BQ1RJVklUWSk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFZpc2liaWxpdHkoU0hPV19XSEVOX0xPQ0tFRF9BVFRSX0FDVElWSVRZLCB0cnVlKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0S2V5Z3VhcmRTaG93aW5nQW5kT2NjbHVkZWQoKTsKKyAgICAgICAgICAgIGxvY2tTY3JlZW5TZXNzaW9uLnNsZWVwRGV2aWNlKCk7CisgICAgICAgICAgICBhc3NlcnRTaW5nbGVMYXVuY2hBbmRTdG9wKFNIT1dfV0hFTl9MT0NLRURfQVRUUl9BQ1RJVklUWSwgbG9nU2VwYXJhdG9yKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNjcmVlbk9mZkNhdXNlc1NpbmdsZVN0b3AoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IChmaW5hbCBMb2NrU2NyZWVuU2Vzc2lvbiBsb2NrU2NyZWVuU2Vzc2lvbiA9IG5ldyBMb2NrU2NyZWVuU2Vzc2lvbigpKSB7CisgICAgICAgICAgICBmaW5hbCBMb2dTZXBhcmF0b3IgbG9nU2VwYXJhdG9yID0gc2VwYXJhdGVMb2dzKCk7CisgICAgICAgICAgICBsYXVuY2hBY3Rpdml0eShURVNUX0FDVElWSVRZKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShURVNUX0FDVElWSVRZLCB0cnVlKTsKKyAgICAgICAgICAgIGxvY2tTY3JlZW5TZXNzaW9uLnNsZWVwRGV2aWNlKCk7CisgICAgICAgICAgICBhc3NlcnRTaW5nbGVMYXVuY2hBbmRTdG9wKFRFU1RfQUNUSVZJVFksIGxvZ1NlcGFyYXRvcik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0tleWd1YXJkVHJhbnNpdGlvblRlc3RzLmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0tleWd1YXJkVHJhbnNpdGlvblRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA1MTIxYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vS2V5Z3VhcmRUcmFuc2l0aW9uVGVzdHMuamF2YQpAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbTsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLlNIT1dfV0hFTl9MT0NLRURfQUNUSVZJVFk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuU0hPV19XSEVOX0xPQ0tFRF9BVFRSX0FDVElWSVRZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLlNIT1dfV0hFTl9MT0NLRURfQVRUUl9SRU1PVkVfQVRUUl9BQ1RJVklUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5TSE9XX1dIRU5fTE9DS0VEX1dJVEhfRElBTE9HX0FDVElWSVRZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLlRFU1RfQUNUSVZJVFk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuV0FMTFBBUEFFUl9BQ1RJVklUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uV2luZG93TWFuYWdlclN0YXRlLlRSQU5TSVRfQUNUSVZJVFlfT1BFTjsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uV2luZG93TWFuYWdlclN0YXRlLlRSQU5TSVRfS0VZR1VBUkRfR09JTkdfQVdBWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uV2luZG93TWFuYWdlclN0YXRlLlRSQU5TSVRfS0VZR1VBUkRfR09JTkdfQVdBWV9PTl9XQUxMUEFQRVI7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLldpbmRvd01hbmFnZXJTdGF0ZS5UUkFOU0lUX0tFWUdVQVJEX09DQ0xVREU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLldpbmRvd01hbmFnZXJTdGF0ZS5UUkFOU0lUX0tFWUdVQVJEX1VOT0NDTFVERTsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc3VtZS5hc3N1bWVGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc3VtZS5hc3N1bWVUcnVlOworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBCdWlsZC9JbnN0YWxsL1J1bjoKKyAqICAgICBhdGVzdCBDdHNBY3Rpdml0eU1hbmFnZXJEZXZpY2VUZXN0Q2FzZXM6S2V5Z3VhcmRUcmFuc2l0aW9uVGVzdHMKKyAqLworcHVibGljIGNsYXNzIEtleWd1YXJkVHJhbnNpdGlvblRlc3RzIGV4dGVuZHMgQWN0aXZpdHlNYW5hZ2VyVGVzdEJhc2UgeworCisgICAgQEJlZm9yZQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisKKyAgICAgICAgYXNzdW1lVHJ1ZShzdXBwb3J0c0luc2VjdXJlTG9jaygpKTsKKyAgICAgICAgYXNzdW1lRmFsc2UoaXNVaU1vZGVMb2NrZWRUb1ZySGVhZHNldCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVbmxvY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IChmaW5hbCBMb2NrU2NyZWVuU2Vzc2lvbiBsb2NrU2NyZWVuU2Vzc2lvbiA9IG5ldyBMb2NrU2NyZWVuU2Vzc2lvbigpKSB7CisgICAgICAgICAgICBsYXVuY2hBY3Rpdml0eShURVNUX0FDVElWSVRZKTsKKyAgICAgICAgICAgIGxvY2tTY3JlZW5TZXNzaW9uLmdvdG9LZXlndWFyZCgpCisgICAgICAgICAgICAgICAgICAgIC51bmxvY2tEZXZpY2UoKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKFRFU1RfQUNUSVZJVFkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJQaWNrZWQgd3JvbmcgdHJhbnNpdGlvbiIsIFRSQU5TSVRfS0VZR1VBUkRfR09JTkdfQVdBWSwKKyAgICAgICAgICAgICAgICAgICAgbUFtV21TdGF0ZS5nZXRXbVN0YXRlKCkuZ2V0TGFzdFRyYW5zaXRpb24oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVbmxvY2tXYWxscGFwZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IChmaW5hbCBMb2NrU2NyZWVuU2Vzc2lvbiBsb2NrU2NyZWVuU2Vzc2lvbiA9IG5ldyBMb2NrU2NyZWVuU2Vzc2lvbigpKSB7CisgICAgICAgICAgICBsYXVuY2hBY3Rpdml0eShXQUxMUEFQQUVSX0FDVElWSVRZKTsKKyAgICAgICAgICAgIGxvY2tTY3JlZW5TZXNzaW9uLmdvdG9LZXlndWFyZCgpCisgICAgICAgICAgICAgICAgICAgIC51bmxvY2tEZXZpY2UoKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKFdBTExQQVBBRVJfQUNUSVZJVFkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJQaWNrZWQgd3JvbmcgdHJhbnNpdGlvbiIsIFRSQU5TSVRfS0VZR1VBUkRfR09JTkdfQVdBWV9PTl9XQUxMUEFQRVIsCisgICAgICAgICAgICAgICAgICAgIG1BbVdtU3RhdGUuZ2V0V21TdGF0ZSgpLmdldExhc3RUcmFuc2l0aW9uKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T2NjbHVkZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgKGZpbmFsIExvY2tTY3JlZW5TZXNzaW9uIGxvY2tTY3JlZW5TZXNzaW9uID0gbmV3IExvY2tTY3JlZW5TZXNzaW9uKCkpIHsKKyAgICAgICAgICAgIGxvY2tTY3JlZW5TZXNzaW9uLmdvdG9LZXlndWFyZCgpOworICAgICAgICAgICAgbGF1bmNoQWN0aXZpdHkoU0hPV19XSEVOX0xPQ0tFRF9BQ1RJVklUWSk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShTSE9XX1dIRU5fTE9DS0VEX0FDVElWSVRZKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiUGlja2VkIHdyb25nIHRyYW5zaXRpb24iLCBUUkFOU0lUX0tFWUdVQVJEX09DQ0xVREUsCisgICAgICAgICAgICAgICAgICAgIG1BbVdtU3RhdGUuZ2V0V21TdGF0ZSgpLmdldExhc3RUcmFuc2l0aW9uKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VW5vY2NsdWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSAoZmluYWwgTG9ja1NjcmVlblNlc3Npb24gbG9ja1NjcmVlblNlc3Npb24gPSBuZXcgTG9ja1NjcmVlblNlc3Npb24oKSkgeworICAgICAgICAgICAgbG9ja1NjcmVlblNlc3Npb24uZ290b0tleWd1YXJkKCk7CisgICAgICAgICAgICBsYXVuY2hBY3Rpdml0eShTSE9XX1dIRU5fTE9DS0VEX0FDVElWSVRZKTsKKyAgICAgICAgICAgIGxhdW5jaEFjdGl2aXR5KFRFU1RfQUNUSVZJVFkpOworICAgICAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yS2V5Z3VhcmRTaG93aW5nQW5kTm90T2NjbHVkZWQoKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKHRydWUpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJQaWNrZWQgd3JvbmcgdHJhbnNpdGlvbiIsIFRSQU5TSVRfS0VZR1VBUkRfVU5PQ0NMVURFLAorICAgICAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLmdldFdtU3RhdGUoKS5nZXRMYXN0VHJhbnNpdGlvbigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5ld0FjdGl2aXR5RHVyaW5nT2NjbHVkZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IChmaW5hbCBMb2NrU2NyZWVuU2Vzc2lvbiBsb2NrU2NyZWVuU2Vzc2lvbiA9IG5ldyBMb2NrU2NyZWVuU2Vzc2lvbigpKSB7CisgICAgICAgICAgICBsYXVuY2hBY3Rpdml0eShTSE9XX1dIRU5fTE9DS0VEX0FDVElWSVRZKTsKKyAgICAgICAgICAgIGxvY2tTY3JlZW5TZXNzaW9uLmdvdG9LZXlndWFyZCgpOworICAgICAgICAgICAgbGF1bmNoQWN0aXZpdHkoU0hPV19XSEVOX0xPQ0tFRF9XSVRIX0RJQUxPR19BQ1RJVklUWSk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShTSE9XX1dIRU5fTE9DS0VEX1dJVEhfRElBTE9HX0FDVElWSVRZKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiUGlja2VkIHdyb25nIHRyYW5zaXRpb24iLCBUUkFOU0lUX0FDVElWSVRZX09QRU4sCisgICAgICAgICAgICAgICAgICAgIG1BbVdtU3RhdGUuZ2V0V21TdGF0ZSgpLmdldExhc3RUcmFuc2l0aW9uKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T2NjbHVkZU1hbmlmZXN0QXR0cigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgKGZpbmFsIExvY2tTY3JlZW5TZXNzaW9uIGxvY2tTY3JlZW5TZXNzaW9uID0gbmV3IExvY2tTY3JlZW5TZXNzaW9uKCkpIHsKKyAgICAgICAgICAgIGxvY2tTY3JlZW5TZXNzaW9uLmdvdG9LZXlndWFyZCgpOworICAgICAgICAgICAgZmluYWwgTG9nU2VwYXJhdG9yIGxvZ1NlcGFyYXRvciA9IHNlcGFyYXRlTG9ncygpOworICAgICAgICAgICAgbGF1bmNoQWN0aXZpdHkoU0hPV19XSEVOX0xPQ0tFRF9BVFRSX0FDVElWSVRZKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKFNIT1dfV0hFTl9MT0NLRURfQVRUUl9BQ1RJVklUWSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlBpY2tlZCB3cm9uZyB0cmFuc2l0aW9uIiwgVFJBTlNJVF9LRVlHVUFSRF9PQ0NMVURFLAorICAgICAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLmdldFdtU3RhdGUoKS5nZXRMYXN0VHJhbnNpdGlvbigpKTsKKyAgICAgICAgICAgIGFzc2VydFNpbmdsZUxhdW5jaChTSE9XX1dIRU5fTE9DS0VEX0FUVFJfQUNUSVZJVFksIGxvZ1NlcGFyYXRvcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPY2NsdWRlQXR0clJlbW92ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgKGZpbmFsIExvY2tTY3JlZW5TZXNzaW9uIGxvY2tTY3JlZW5TZXNzaW9uID0gbmV3IExvY2tTY3JlZW5TZXNzaW9uKCkpIHsKKyAgICAgICAgICAgIGxvY2tTY3JlZW5TZXNzaW9uLmdvdG9LZXlndWFyZCgpOworICAgICAgICAgICAgTG9nU2VwYXJhdG9yIGxvZ1NlcGFyYXRvciA9IHNlcGFyYXRlTG9ncygpOworICAgICAgICAgICAgbGF1bmNoQWN0aXZpdHkoU0hPV19XSEVOX0xPQ0tFRF9BVFRSX1JFTU9WRV9BVFRSX0FDVElWSVRZKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKFNIT1dfV0hFTl9MT0NLRURfQVRUUl9SRU1PVkVfQVRUUl9BQ1RJVklUWSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlBpY2tlZCB3cm9uZyB0cmFuc2l0aW9uIiwgVFJBTlNJVF9LRVlHVUFSRF9PQ0NMVURFLAorICAgICAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLmdldFdtU3RhdGUoKS5nZXRMYXN0VHJhbnNpdGlvbigpKTsKKyAgICAgICAgICAgIGFzc2VydFNpbmdsZUxhdW5jaChTSE9XX1dIRU5fTE9DS0VEX0FUVFJfUkVNT1ZFX0FUVFJfQUNUSVZJVFksIGxvZ1NlcGFyYXRvcik7CisKKyAgICAgICAgICAgIGxvY2tTY3JlZW5TZXNzaW9uLmdvdG9LZXlndWFyZCgpOworICAgICAgICAgICAgbG9nU2VwYXJhdG9yID0gc2VwYXJhdGVMb2dzKCk7CisgICAgICAgICAgICBsYXVuY2hBY3Rpdml0eShTSE9XX1dIRU5fTE9DS0VEX0FUVFJfUkVNT1ZFX0FUVFJfQUNUSVZJVFkpOworICAgICAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUoU0hPV19XSEVOX0xPQ0tFRF9BVFRSX1JFTU9WRV9BVFRSX0FDVElWSVRZKTsKKyAgICAgICAgICAgIGFzc2VydFNpbmdsZVN0YXJ0QW5kU3RvcChTSE9XX1dIRU5fTE9DS0VEX0FUVFJfUkVNT1ZFX0FUVFJfQUNUSVZJVFksIGxvZ1NlcGFyYXRvcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROZXdBY3Rpdml0eUR1cmluZ09jY2x1ZGVkV2l0aEF0dHIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IChmaW5hbCBMb2NrU2NyZWVuU2Vzc2lvbiBsb2NrU2NyZWVuU2Vzc2lvbiA9IG5ldyBMb2NrU2NyZWVuU2Vzc2lvbigpKSB7CisgICAgICAgICAgICBsYXVuY2hBY3Rpdml0eShTSE9XX1dIRU5fTE9DS0VEX0FUVFJfQUNUSVZJVFkpOworICAgICAgICAgICAgbG9ja1NjcmVlblNlc3Npb24uZ290b0tleWd1YXJkKCk7CisgICAgICAgICAgICBsYXVuY2hBY3Rpdml0eShTSE9XX1dIRU5fTE9DS0VEX1dJVEhfRElBTE9HX0FDVElWSVRZKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKFNIT1dfV0hFTl9MT0NLRURfV0lUSF9ESUFMT0dfQUNUSVZJVFkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJQaWNrZWQgd3JvbmcgdHJhbnNpdGlvbiIsIFRSQU5TSVRfQUNUSVZJVFlfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgbUFtV21TdGF0ZS5nZXRXbVN0YXRlKCkuZ2V0TGFzdFRyYW5zaXRpb24oKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1ByZXJlbGVhc2VTZGtUZXN0LmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1ByZXJlbGVhc2VTZGtUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU2YzRjYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vUHJlcmVsZWFzZVNka1Rlc3QuamF2YQpAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbTsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5VaURldmljZVV0aWxzLnByZXNzQmFja0J1dHRvbjsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0ucHJlcmVsZWFzZS5Db21wb25lbnRzLk1BSU5fQUNUSVZJVFk7CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBFbnN1cmUgdGhhdCBjb21wYXRpYmlsaXR5IGRpYWxvZyBpcyBzaG93biB3aGVuIGxhdW5jaGluZyBhbiBhcHBsaWNhdGlvbiBidWlsdAorICogYWdhaW5zdCBhIHByZXJlbGVhc2UgU0RLLgorICogPHA+QnVpbGQvSW5zdGFsbC9SdW46CisgKiAgICAgYXRlc3QgQ3RzQWN0aXZpdHlNYW5hZ2VyRGV2aWNlVGVzdENhc2VzOlByZXJlbGVhc2VTZGtUZXN0CisgKi8KK3B1YmxpYyBjbGFzcyBQcmVyZWxlYXNlU2RrVGVzdCBleHRlbmRzIEFjdGl2aXR5TWFuYWdlclRlc3RCYXNlIHsKKworICAgIC8qKiBAc2VlIGNvbS5hbmRyb2lkLnNlcnZlci5hbS5VbnN1cHBvcnRlZENvbXBpbGVTZGtEaWFsb2cgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5TVVBQT1JURURfQ09NUElMRV9TREtfRElBTE9HID0gIlVuc3VwcG9ydGVkQ29tcGlsZVNka0RpYWxvZyI7CisKKyAgICBAQmVmb3JlCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgbUFtLmFsd2F5c1Nob3dVbnN1cHBvcnRlZENvbXBpbGVTZGtXYXJuaW5nKE1BSU5fQUNUSVZJVFkpOworICAgIH0KKworICAgIEBBZnRlcgorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisKKyAgICAgICAgLy8gRW5zdXJlIGFwcCBwcm9jZXNzIGlzIHN0b3BwZWQuCisgICAgICAgIHN0b3BUZXN0UGFja2FnZShNQUlOX0FDVElWSVRZKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wYXRpYmlsaXR5RGlhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIExhdW5jaCB0YXJnZXQgYXBwLgorICAgICAgICBsYXVuY2hBY3Rpdml0eShNQUlOX0FDVElWSVRZKTsKKyAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRBY3Rpdml0eURpc3BsYXllZChNQUlOX0FDVElWSVRZKTsKKyAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRXaW5kb3dEaXNwbGF5ZWQoVU5TVVBQT1JURURfQ09NUElMRV9TREtfRElBTE9HKTsKKworICAgICAgICAvLyBHbyBiYWNrIHRvIGRpc21pc3MgdGhlIHdhcm5pbmcgZGlhbG9nLgorICAgICAgICBwcmVzc0JhY2tCdXR0b24oKTsKKworICAgICAgICAvLyBHbyBiYWNrIGFnYWluIHRvIGZvcm1hbGx5IHN0b3AgdGhlIGFwcC4gSWYgd2UganVzdCBraWxsIHRoZSBwcm9jZXNzLCBpdCdsbCBhdHRlbXB0IHRvCisgICAgICAgIC8vIHJlc3VtZSByYXRoZXIgdGhhbiBzdGFydGluZyBmcm9tIHNjcmF0Y2ggKGFzIGZhciBhcyBBY3Rpdml0eVN0YWNrIGlzIGNvbmNlcm5lZCkgYW5kIGl0CisgICAgICAgIC8vIHdvbid0IGludm9rZSB0aGUgd2FybmluZyBkaWFsb2cuCisgICAgICAgIHByZXNzQmFja0J1dHRvbigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vU3BsYXNoc2NyZWVuVGVzdHMuamF2YSBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vU3BsYXNoc2NyZWVuVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWQ3ZTk1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9TcGxhc2hzY3JlZW5UZXN0cy5qYXZhCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW07CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5TUExBU0hTQ1JFRU5fQUNUSVZJVFk7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmxlc3NUaGFuOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIEJ1aWxkL0luc3RhbGwvUnVuOgorICogICAgIGF0ZXN0IEN0c0FjdGl2aXR5TWFuYWdlckRldmljZVRlc3RDYXNlczpTcGxhc2hzY3JlZW5UZXN0cworICovCitwdWJsaWMgY2xhc3MgU3BsYXNoc2NyZWVuVGVzdHMgZXh0ZW5kcyBBY3Rpdml0eU1hbmFnZXJUZXN0QmFzZSB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTcGxhc2hzY3JlZW5Db250ZW50KCkgeworICAgICAgICBsYXVuY2hBY3Rpdml0eU5vV2FpdChTUExBU0hTQ1JFRU5fQUNUSVZJVFkpOworICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JBcHBUcmFuc2l0aW9uSWRsZSgpOworICAgICAgICBtQW1XbVN0YXRlLmdldFdtU3RhdGUoKS5nZXRTdGFibGVCb3VuZHMoKTsKKyAgICAgICAgZmluYWwgQml0bWFwIGltYWdlID0gdGFrZVNjcmVlbnNob3QoKTsKKyAgICAgICAgLy8gVXNlIHJhdGlvcyB0byBmbGV4aWJseSBhY2NvbW9kYXRlIGNpcmN1bGFyIG9yIG5vdCBxdWl0ZSByZWN0YW5ndWxhciBkaXNwbGF5cworICAgICAgICAvLyBOb3RlOiBDb2xvci5CTEFDSyBpcyB0aGUgcGl4ZWwgY29sb3Igb3V0c2lkZSBvZiB0aGUgZGlzcGxheSByZWdpb24KKyAgICAgICAgYXNzZXJ0Q29sb3JzKGltYWdlLCBtQW1XbVN0YXRlLmdldFdtU3RhdGUoKS5nZXRTdGFibGVCb3VuZHMoKSwKKyAgICAgICAgICAgIENvbG9yLlJFRCwgMC41MGYsIENvbG9yLkJMQUNLLCAwLjAyZik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydENvbG9ycyhCaXRtYXAgaW1nLCBSZWN0IGJvdW5kcywgaW50IHByaW1hcnlDb2xvciwKKyAgICAgICAgZmxvYXQgZXhwZWN0ZWRQcmltYXJ5UmF0aW8sIGludCBzZWNvbmRhcnlDb2xvciwgZmxvYXQgYWNjZXB0YWJsZVdyb25nUmF0aW8pIHsKKworICAgICAgICBpbnQgcHJpbWFyeVBpeGVscyA9IDA7CisgICAgICAgIGludCBzZWNvbmRhcnlQaXhlbHMgPSAwOworICAgICAgICBpbnQgd3JvbmdQaXhlbHMgPSAwOworICAgICAgICBmb3IgKGludCB4ID0gYm91bmRzLmxlZnQ7IHggPCBib3VuZHMucmlnaHQ7IHgrKykgeworICAgICAgICAgICAgZm9yIChpbnQgeSA9IGJvdW5kcy50b3A7IHkgPCBib3VuZHMuYm90dG9tOyB5KyspIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUaGF0KHgsIGxlc3NUaGFuKGltZy5nZXRXaWR0aCgpKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VGhhdCh5LCBsZXNzVGhhbihpbWcuZ2V0SGVpZ2h0KCkpKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY29sb3IgPSBpbWcuZ2V0UGl4ZWwoeCwgeSk7CisgICAgICAgICAgICAgICAgaWYgKHByaW1hcnlDb2xvciA9PSBjb2xvcikgeworICAgICAgICAgICAgICAgICAgICBwcmltYXJ5UGl4ZWxzKys7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWNvbmRhcnlDb2xvciA9PSBjb2xvcikgeworICAgICAgICAgICAgICAgICAgICBzZWNvbmRhcnlQaXhlbHMrKzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB3cm9uZ1BpeGVscysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGludCB0b3RhbFBpeGVscyA9IGJvdW5kcy53aWR0aCgpICogYm91bmRzLmhlaWdodCgpOworICAgICAgICBmaW5hbCBmbG9hdCBwcmltYXJ5UmF0aW8gPSAoZmxvYXQpIHByaW1hcnlQaXhlbHMgLyB0b3RhbFBpeGVsczsKKyAgICAgICAgaWYgKHByaW1hcnlSYXRpbyA8IGV4cGVjdGVkUHJpbWFyeVJhdGlvKSB7CisgICAgICAgICAgICBmYWlsKCJMZXNzIHRoYW4gIiArIChleHBlY3RlZFByaW1hcnlSYXRpbyAqIDEwMC4wZikKKyAgICAgICAgICAgICAgICAgICAgKyAiJSBvZiBwaXhlbHMgaGF2ZSBub24tcHJpbWFyeSBjb2xvciBwcmltYXJ5UGl4ZWxzPSIgKyBwcmltYXJ5UGl4ZWxzCisgICAgICAgICAgICAgICAgICAgICsgIiBzZWNvbmRhcnlQaXhlbHM9IiArIHNlY29uZGFyeVBpeGVscyArICIgd3JvbmdQaXhlbHM9IiArIHdyb25nUGl4ZWxzKTsKKyAgICAgICAgfQorICAgICAgICAvLyBTb21lIHBpeGVscyBtaWdodCBiZSBjb3ZlcmVkIGJ5IHNjcmVlbiBzaGFwZSBkZWNvcmF0aW9ucywgbGlrZSByb3VuZGVkIGNvcm5lcnMuCisgICAgICAgIC8vIE9uIGNpcmN1bGFyIGRpc3BsYXlzLCB0aGVyZSBpcyBhbiBhbnRpYWxpYXNlZCBlZGdlLgorICAgICAgICBmaW5hbCBmbG9hdCB3cm9uZ1JhdGlvID0gKGZsb2F0KSB3cm9uZ1BpeGVscyAvIHRvdGFsUGl4ZWxzOworICAgICAgICBpZiAod3JvbmdSYXRpbyA+IGFjY2VwdGFibGVXcm9uZ1JhdGlvKSB7CisgICAgICAgICAgICBmYWlsKCJNb3JlIHRoYW4gIiArIChhY2NlcHRhYmxlV3JvbmdSYXRpbyAqIDEwMC4wZikKKyAgICAgICAgICAgICAgICAgICAgKyAiJSBvZiBwaXhlbHMgaGF2ZSB3cm9uZyBjb2xvciBwcmltYXJ5UGl4ZWxzPSIgKyBwcmltYXJ5UGl4ZWxzCisgICAgICAgICAgICAgICAgICAgICsgIiBzZWNvbmRhcnlQaXhlbHM9IiArIHNlY29uZGFyeVBpeGVscyArICIgd3JvbmdQaXhlbHM9IiArIHdyb25nUGl4ZWxzKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vU3RhcnRBY3Rpdml0eVRlc3RzLmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1N0YXJ0QWN0aXZpdHlUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMmJkYmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1N0YXJ0QWN0aXZpdHlUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLmFtOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuVEVTVF9BQ1RJVklUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uYXBwMjcuQ29tcG9uZW50cy5TREtfMjdfTEFVTkNISU5HX0FDVElWSVRZOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUHJlc3VibWl0OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLkZsYWt5VGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKKworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIEJ1aWxkL0luc3RhbGwvUnVuOgorICogICAgIGF0ZXN0IEN0c0FjdGl2aXR5TWFuYWdlckRldmljZVRlc3RDYXNlczpTdGFydEFjdGl2aXR5VGVzdHMKKyAqLworQFByZXN1Ym1pdAorQEZsYWt5VGVzdAorcHVibGljIGNsYXNzIFN0YXJ0QWN0aXZpdHlUZXN0cyBleHRlbmRzIEFjdGl2aXR5TWFuYWdlclRlc3RCYXNlIHsKKworICAgIEBSdWxlCisgICAgcHVibGljIGZpbmFsIEFjdGl2aXR5VGVzdFJ1bGU8VGVzdEFjdGl2aXR5Mj4gbVRlc3RBY3Rpdml0eTJSdWxlID0KKyAgICAgICAgICAgIG5ldyBBY3Rpdml0eVRlc3RSdWxlPD4oVGVzdEFjdGl2aXR5Mi5jbGFzcyk7CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmVzIHtAbGluayBBY3Rpdml0eX0gY2FuIG9ubHkgYmUgbGF1bmNoZWQgZnJvbSBhbiB7QGxpbmsgQWN0aXZpdHl9CisgICAgICoge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0fS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFydEFjdGl2aXR5Q29udGV4dHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gTGF1bmNoIEFjdGl2aXR5IGZyb20gYXBwbGljYXRpb24gY29udGV4dC4KKyAgICAgICAgZ2V0TGF1bmNoQWN0aXZpdHlCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0VGFyZ2V0QWN0aXZpdHkoVEVTVF9BQ1RJVklUWSkKKyAgICAgICAgICAgICAgICAuc2V0VXNlQXBwbGljYXRpb25Db250ZXh0KHRydWUpCisgICAgICAgICAgICAgICAgLnNldFN1cHByZXNzRXhjZXB0aW9ucyh0cnVlKQorICAgICAgICAgICAgICAgIC5leGVjdXRlKCk7CisKKyAgICAgICAgLy8gTGF1bmNoIHNlY29uZCBBY3Rpdml0eSBmcm9tIEFjdGl2aXR5IENvbnRleHQgdG8gZW5zdXJlIHByZXZpb3VzIEFjdGl2aXR5IGhhcyBsYXVuY2hlZC4KKyAgICAgICAgZmluYWwgQWN0aXZpdHkgdGVzdEFjdGl2aXR5MiA9IG1UZXN0QWN0aXZpdHkyUnVsZS5sYXVuY2hBY3Rpdml0eShudWxsKTsKKworICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZSh0ZXN0QWN0aXZpdHkyLmdldENvbXBvbmVudE5hbWUoKSk7CisKKyAgICAgICAgLy8gVmVyaWZ5IEFjdGl2aXR5IHdhcyBub3Qgc3RhcnRlZC4KKyAgICAgICAgYXNzZXJ0RmFsc2UobUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuY29udGFpbnNBY3Rpdml0eShURVNUX0FDVElWSVRZKSk7CisgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0UmVzdW1lZEFjdGl2aXR5KAorICAgICAgICAgICAgICAgICJBY3Rpdml0eSBsYXVuY2hlZCBmcm9tIGFjdGl2aXR5IGNvbnRleHQgc2hvdWxkIGJlIHByZXNlbnQiLAorICAgICAgICAgICAgICAgIHRlc3RBY3Rpdml0eTIuZ2V0Q29tcG9uZW50TmFtZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmVzIHlvdSBjYW4gc3RhcnQgYW4ge0BsaW5rIEFjdGl2aXR5fSBmcm9tIGEgbm9uIHtAbGluayBBY3Rpdml0eX0KKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRleHR9IHdpdGggdGhlIHtAY29kZSBGTEFHX0FDVElWSVRZX05FV19UQVNLfS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFydEFjdGl2aXR5TmV3VGFzaygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBMYXVuY2ggQWN0aXZpdHkgZnJvbSBhcHBsaWNhdGlvbiBjb250ZXh0LgorICAgICAgICBnZXRMYXVuY2hBY3Rpdml0eUJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRUYXJnZXRBY3Rpdml0eShURVNUX0FDVElWSVRZKQorICAgICAgICAgICAgICAgIC5zZXRVc2VBcHBsaWNhdGlvbkNvbnRleHQodHJ1ZSkKKyAgICAgICAgICAgICAgICAuc2V0U3VwcHJlc3NFeGNlcHRpb25zKHRydWUpCisgICAgICAgICAgICAgICAgLnNldE5ld1Rhc2sodHJ1ZSkKKyAgICAgICAgICAgICAgICAuZXhlY3V0ZSgpOworCisgICAgICAgIG1BbVdtU3RhdGUuY29tcHV0ZVN0YXRlKFRFU1RfQUNUSVZJVFkpOworICAgICAgICBtQW1XbVN0YXRlLmFzc2VydFJlc3VtZWRBY3Rpdml0eSgiVGVzdCBBY3Rpdml0eSBzaG91bGQgYmUgc3RhcnRlZCB3aXRoIG5ldyB0YXNrIGZsYWciLAorICAgICAgICAgICAgICAgIFRFU1RfQUNUSVZJVFkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuc3VyZXMgeW91IGNhbiBzdGFydCBhbiB7QGxpbmsgQWN0aXZpdHl9IGZyb20gYSBub24ge0BsaW5rIEFjdGl2aXR5fQorICAgICAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dH0gd2hlbiB0aGUgdGFyZ2V0IHNkayBpcyBiZXR3ZWVuIE4gYW5kIE8gTXIxLgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGVnYWN5U3RhcnRBY3Rpdml0eUZyb21Ob25BY3Rpdml0eUNvbnRleHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZ2V0TGF1bmNoQWN0aXZpdHlCdWlsZGVyKCkuc2V0VGFyZ2V0QWN0aXZpdHkoVEVTVF9BQ1RJVklUWSkKKyAgICAgICAgICAgICAgICAuc2V0TGF1bmNoaW5nQWN0aXZpdHkoU0RLXzI3X0xBVU5DSElOR19BQ1RJVklUWSkKKyAgICAgICAgICAgICAgICAuc2V0VXNlQXBwbGljYXRpb25Db250ZXh0KHRydWUpCisgICAgICAgICAgICAgICAgLmV4ZWN1dGUoKTsKKworICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShURVNUX0FDVElWSVRZKTsKKyAgICAgICAgbUFtV21TdGF0ZS5hc3NlcnRSZXN1bWVkQWN0aXZpdHkoIlRlc3QgQWN0aXZpdHkgc2hvdWxkIGJlIHJlc3VtZWQgd2l0aG91dCBvbGRlciBzZGsiLAorICAgICAgICAgICAgICAgIFRFU1RfQUNUSVZJVFkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdEFjdGl2aXR5MiBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1ZpcnR1YWxEaXNwbGF5SGVscGVyLmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1ZpcnR1YWxEaXNwbGF5SGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE1ZTY1MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vVmlydHVhbERpc3BsYXlIZWxwZXIuamF2YQpAQCAtMCwwICsxLDE2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbTsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmhhcmR3YXJlLmRpc3BsYXkuRGlzcGxheU1hbmFnZXIuVklSVFVBTF9ESVNQTEFZX0ZMQUdfT1dOX0NPTlRFTlRfT05MWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5oYXJkd2FyZS5kaXNwbGF5LkRpc3BsYXlNYW5hZ2VyLlZJUlRVQUxfRElTUExBWV9GTEFHX1BSRVNFTlRBVElPTjsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uU3RhdGVMb2dnZXIubG9nQWx3YXlzOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb247CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QaXhlbEZvcm1hdDsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmRpc3BsYXkuRGlzcGxheU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5kaXNwbGF5LlZpcnR1YWxEaXNwbGF5OworaW1wb3J0IGFuZHJvaWQubWVkaWEuSW1hZ2VSZWFkZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuRGlzcGxheTsKKworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTnVsbGFibGU7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlN5c3RlbVV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKKy8qKgorICogSGVscGVyIGNsYXNzIHRvIGNyZWF0ZSB2aXJ0dWFsIGRpc3BsYXkuCisgKi8KK2NsYXNzIFZpcnR1YWxEaXNwbGF5SGVscGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWSVJUVUFMX0RJU1BMQVlfTkFNRSA9ICJDdHNWaXJ0dWFsRGlzcGxheSI7CisgICAgLyoqIFNlZSB7QGxpbmsgRGlzcGxheU1hbmFnZXIjVklSVFVBTF9ESVNQTEFZX0ZMQUdfQ0FOX1NIT1dfV0lUSF9JTlNFQ1VSRV9LRVlHVUFSRH0uICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZJUlRVQUxfRElTUExBWV9GTEFHX0NBTl9TSE9XX1dJVEhfSU5TRUNVUkVfS0VZR1VBUkQgPSAxIDw8IDU7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIERJU1BMQVlfREVWSUNFX1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoCisgICAgICAgICAgICAiLipEaXNwbGF5RGV2aWNlSW5mb1xce1wiKFteXCJdKylcIjouKiwgc3RhdGUgKFxcUyspLC4qXFx9LioiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIERFRkFVTFRfRElTUExBWV9QQVRURVJOID0gUGF0dGVybi5jb21waWxlKAorICAgICAgICAgICAgIihtRGlzcGxheUlkPSIgKyBEaXNwbGF5LkRFRkFVTFRfRElTUExBWSArICIpKFtcXHNcXFNdKj8pKG1QcmltYXJ5RGlzcGxheURldmljZT0pKC4qKSIpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERU5TSVRZID0gMTYwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIRUlHSFQgPSA0ODA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdJRFRIID0gODAwOworCisgICAgcHJpdmF0ZSBJbWFnZVJlYWRlciBtUmVhZGVyOworICAgIHByaXZhdGUgVmlydHVhbERpc3BsYXkgbVZpcnR1YWxEaXNwbGF5OworICAgIHByaXZhdGUgYm9vbGVhbiBtQ3JlYXRlZDsKKworICAgIHZvaWQgY3JlYXRlQW5kV2FpdEZvckRpc3BsYXkoYm9vbGVhbiByZXF1ZXN0U2hvd1doZW5Mb2NrZWQpIHsKKyAgICAgICAgY3JlYXRlVmlydHVhbERpc3BsYXkocmVxdWVzdFNob3dXaGVuTG9ja2VkKTsKKyAgICAgICAgd2FpdEZvckRpc3BsYXlTdGF0ZShmYWxzZSAvKiBkZWZhdWx0ICovLCB0cnVlIC8qIG9uICovKTsKKyAgICAgICAgbUNyZWF0ZWQgPSB0cnVlOworICAgIH0KKworICAgIHZvaWQgdHVybkRpc3BsYXlPZmYoKSB7CisgICAgICAgIG1WaXJ0dWFsRGlzcGxheS5zZXRTdXJmYWNlKG51bGwpOworICAgICAgICB3YWl0Rm9yRGlzcGxheVN0YXRlKGZhbHNlIC8qIGRlZmF1bHQgKi8sIGZhbHNlIC8qIG9uICovKTsKKyAgICB9CisKKyAgICB2b2lkIHR1cm5EaXNwbGF5T24oKSB7CisgICAgICAgIG1WaXJ0dWFsRGlzcGxheS5zZXRTdXJmYWNlKG1SZWFkZXIuZ2V0U3VyZmFjZSgpKTsKKyAgICAgICAgd2FpdEZvckRpc3BsYXlTdGF0ZShmYWxzZSAvKiBkZWZhdWx0ICovLCB0cnVlIC8qIG9uICovKTsKKyAgICB9CisKKyAgICB2b2lkIHJlbGVhc2VEaXNwbGF5KCkgeworICAgICAgICBpZiAobUNyZWF0ZWQpIHsKKyAgICAgICAgICAgIG1WaXJ0dWFsRGlzcGxheS5yZWxlYXNlKCk7CisgICAgICAgICAgICBtUmVhZGVyLmNsb3NlKCk7CisgICAgICAgICAgICB3YWl0Rm9yRGlzcGxheUNvbmRpdGlvbihmYWxzZSAvKiBkZWZhdWx0RGlzcGxheSAqLywgT2JqZWN0czo6aXNOdWxsLAorICAgICAgICAgICAgICAgICAgICAiV2FpdGluZyBmb3IgdmlydHVhbCBkaXNwbGF5IGRlc3Ryb3kiKTsKKyAgICAgICAgfQorICAgICAgICBtQ3JlYXRlZCA9IGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjcmVhdGVWaXJ0dWFsRGlzcGxheShib29sZWFuIHJlcXVlc3RTaG93V2hlbkxvY2tlZCkgeworICAgICAgICBtUmVhZGVyID0gSW1hZ2VSZWFkZXIubmV3SW5zdGFuY2UoV0lEVEgsIEhFSUdIVCwgUGl4ZWxGb3JtYXQuUkdCQV84ODg4LCAyKTsKKworICAgICAgICBmaW5hbCBEaXNwbGF5TWFuYWdlciBkaXNwbGF5TWFuYWdlciA9IGdldENvbnRleHQoKS5nZXRTeXN0ZW1TZXJ2aWNlKERpc3BsYXlNYW5hZ2VyLmNsYXNzKTsKKworICAgICAgICBpbnQgZmxhZ3MgPSBWSVJUVUFMX0RJU1BMQVlfRkxBR19QUkVTRU5UQVRJT04gfCBWSVJUVUFMX0RJU1BMQVlfRkxBR19PV05fQ09OVEVOVF9PTkxZOworICAgICAgICBpZiAocmVxdWVzdFNob3dXaGVuTG9ja2VkKSB7CisgICAgICAgICAgICBmbGFncyB8PSBWSVJUVUFMX0RJU1BMQVlfRkxBR19DQU5fU0hPV19XSVRIX0lOU0VDVVJFX0tFWUdVQVJEOworICAgICAgICB9CisgICAgICAgIG1WaXJ0dWFsRGlzcGxheSA9IGRpc3BsYXlNYW5hZ2VyLmNyZWF0ZVZpcnR1YWxEaXNwbGF5KAorICAgICAgICAgICAgICAgIFZJUlRVQUxfRElTUExBWV9OQU1FLCBXSURUSCwgSEVJR0hULCBERU5TSVRZLCBtUmVhZGVyLmdldFN1cmZhY2UoKSwgZmxhZ3MpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIHdhaXRGb3JEZWZhdWx0RGlzcGxheVN0YXRlKGJvb2xlYW4gd2FudE9uKSB7CisgICAgICAgIHdhaXRGb3JEaXNwbGF5U3RhdGUodHJ1ZSAvKiBkZWZhdWx0ICovLCB3YW50T24pOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgd2FpdEZvckRpc3BsYXlTdGF0ZShib29sZWFuIGRlZmF1bHREaXNwbGF5LCBib29sZWFuIHdhbnRPbikgeworICAgICAgICB3YWl0Rm9yRGlzcGxheUNvbmRpdGlvbihkZWZhdWx0RGlzcGxheSwgc3RhdGUgLT4gc3RhdGUgIT0gbnVsbCAmJiBzdGF0ZSA9PSB3YW50T24sCisgICAgICAgICAgICAgICAgIldhaXRpbmcgZm9yICIgKyAoZGVmYXVsdERpc3BsYXkgPyAiZGVmYXVsdCIgOiAidmlydHVhbCIpICsgIiBkaXNwbGF5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgKHdhbnRPbiA/ICJvbiIgOiAib2ZmIikpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgd2FpdEZvckRpc3BsYXlDb25kaXRpb24oYm9vbGVhbiBkZWZhdWx0RGlzcGxheSwKKyAgICAgICAgICAgIFByZWRpY2F0ZTxCb29sZWFuPiBjb25kaXRpb24sIFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIGZvciAoaW50IHJldHJ5ID0gMTsgcmV0cnkgPD0gMTA7IHJldHJ5KyspIHsKKyAgICAgICAgICAgIGlmIChjb25kaXRpb24udGVzdChnZXREaXNwbGF5U3RhdGUoZGVmYXVsdERpc3BsYXkpKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvZ0Fsd2F5cyhtZXNzYWdlICsgIi4uLiByZXRyeT0iICsgcmV0cnkpOworICAgICAgICAgICAgU3lzdGVtQ2xvY2suc2xlZXAoNTAwKTsKKyAgICAgICAgfQorICAgICAgICBmYWlsKG1lc3NhZ2UgKyAiIGZhaWxlZCIpOworICAgIH0KKworICAgIEBOdWxsYWJsZQorICAgIHByaXZhdGUgc3RhdGljIEJvb2xlYW4gZ2V0RGlzcGxheVN0YXRlKGJvb2xlYW4gZGVmYXVsdERpc3BsYXkpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGR1bXAgPSBleGVjdXRlU2hlbGxDb21tYW5kKCJkdW1wc3lzIGRpc3BsYXkiKTsKKyAgICAgICAgU3RyaW5nIGRlZmF1bHREaXNwbGF5TmFtZSA9IG51bGw7CisgICAgICAgIC8vIEZpbmRzIHRoZSBjb3JyZXNwb25kaW5nIHBoeXNpY2FsIGRpc3BsYXkgYW1vbmcgY3VycmVudCBtdWx0aXBsZSBkZWZhdWx0IGxvZ2ljYWwgZGlzcGxheXMKKyAgICAgICAgLy8gYW5kIHJlYWQgdGhlIHByb3BlciBkaXNwbGF5IHN0YXRlLgorICAgICAgICBpZiAoZGVmYXVsdERpc3BsYXkpIHsKKyAgICAgICAgICAgIGZpbmFsIE1hdGNoZXIgbWF0Y2hlciA9IERFRkFVTFRfRElTUExBWV9QQVRURVJOLm1hdGNoZXIoZHVtcCk7CisgICAgICAgICAgICBpZiAobWF0Y2hlci5maW5kKCkpIHsKKyAgICAgICAgICAgICAgICBkZWZhdWx0RGlzcGxheU5hbWUgPSBtYXRjaGVyLmdyb3VwKDQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGRlZmF1bHREaXNwbGF5TmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgU3RyaW5nIGRpc3BsYXlOYW1lID0gZGVmYXVsdERpc3BsYXkgPyBkZWZhdWx0RGlzcGxheU5hbWUgOiBWSVJUVUFMX0RJU1BMQVlfTkFNRTsKKyAgICAgICAgZmluYWwgUHJlZGljYXRlPE1hdGNoZXI+IGRpc3BsYXlOYW1lTWF0Y2hlciA9IG0gLT4gbS5ncm91cCgxKS5lcXVhbHMoZGlzcGxheU5hbWUpOworICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBsaW5lIDogZHVtcC5zcGxpdCgiXFxuIikpIHsKKyAgICAgICAgICAgIGZpbmFsIE1hdGNoZXIgbWF0Y2hlciA9IERJU1BMQVlfREVWSUNFX1BBVFRFUk4ubWF0Y2hlcihsaW5lKTsKKyAgICAgICAgICAgIGlmIChtYXRjaGVyLm1hdGNoZXMoKSAmJiBkaXNwbGF5TmFtZU1hdGNoZXIudGVzdChtYXRjaGVyKSkgeworICAgICAgICAgICAgICAgIHJldHVybiAiT04iLmVxdWFscyhtYXRjaGVyLmdyb3VwKDIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZXhlY3V0ZVNoZWxsQ29tbWFuZChTdHJpbmcgY29tbWFuZCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIFN5c3RlbVV0aWwucnVuU2hlbGxDb21tYW5kKGdldEluc3RydW1lbnRhdGlvbigpLCBjb21tYW5kKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy9idWJibGUgaXQgdXAKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9saWZlY3ljbGUvQWN0aXZpdHlMaWZlY3ljbGVDbGllbnRUZXN0QmFzZS5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9saWZlY3ljbGUvQWN0aXZpdHlMaWZlY3ljbGVDbGllbnRUZXN0QmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5YzBkMmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2FtL2xpZmVjeWNsZS9BY3Rpdml0eUxpZmVjeWNsZUNsaWVudFRlc3RCYXNlLmphdmEKQEAgLTAsMCArMSwyNTcgQEAKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW0ubGlmZWN5Y2xlOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLlN0YXRlTG9nZ2VyLmxvZzsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0ubGlmZWN5Y2xlLkxpZmVjeWNsZUxvZy5BY3Rpdml0eUNhbGxiYWNrLk9OX0FDVElWSVRZX1JFU1VMVDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0ubGlmZWN5Y2xlLkxpZmVjeWNsZUxvZy5BY3Rpdml0eUNhbGxiYWNrCisgICAgICAgIC5PTl9NVUxUSV9XSU5ET1dfTU9ERV9DSEFOR0VEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5saWZlY3ljbGUuTGlmZWN5Y2xlTG9nLkFjdGl2aXR5Q2FsbGJhY2suT05fTkVXX0lOVEVOVDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0ubGlmZWN5Y2xlLkxpZmVjeWNsZUxvZy5BY3Rpdml0eUNhbGxiYWNrLk9OX1BBVVNFOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5saWZlY3ljbGUuTGlmZWN5Y2xlTG9nLkFjdGl2aXR5Q2FsbGJhY2suT05fUE9TVF9DUkVBVEU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLmxpZmVjeWNsZS5MaWZlY3ljbGVMb2cuQWN0aXZpdHlDYWxsYmFjay5PTl9TVE9QOworCitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkFjdGl2aXR5SW5mbzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQuc2VydmVyLmFtLkFjdGl2aXR5TWFuYWdlclRlc3RCYXNlOworaW1wb3J0IGFuZHJvaWQuc2VydmVyLmFtLmxpZmVjeWNsZS5MaWZlY3ljbGVMb2cuQWN0aXZpdHlDYWxsYmFjazsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLmxpZmVjeWNsZS5BY3Rpdml0eUxpZmVjeWNsZU1vbml0b3I7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIubGlmZWN5Y2xlLkFjdGl2aXR5TGlmZWN5Y2xlTW9uaXRvclJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWQudXRpbC5QYWlyOworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqIEJhc2UgY2xhc3MgZm9yIGRldmljZS1zaWRlIHRlc3RzIHRoYXQgdmVyaWZ5IGNvcnJlY3QgYWN0aXZpdHkgbGlmZWN5Y2xlIHRyYW5zaXRpb25zLiAqLworcHVibGljIGNsYXNzIEFjdGl2aXR5TGlmZWN5Y2xlQ2xpZW50VGVzdEJhc2UgZXh0ZW5kcyBBY3Rpdml0eU1hbmFnZXJUZXN0QmFzZSB7CisKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1JFQ1JFQVRFID0gInJlY3JlYXRlIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0ZJTklTSF9JTl9PTl9SRVNVTUUgPSAiZmluaXNoX2luX29uX3Jlc3VtZSI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9GSU5JU0hfQUZURVJfUkVTVU1FID0gImZpbmlzaF9hZnRlcl9yZXN1bWUiOworCisgICAgc3RhdGljIGZpbmFsIENvbXBvbmVudE5hbWUgQ0FMTEJBQ0tfVFJBQ0tJTkdfQUNUSVZJVFkgPQorICAgICAgICAgICAgZ2V0Q29tcG9uZW50TmFtZShDYWxsYmFja1RyYWNraW5nQWN0aXZpdHkuY2xhc3MpOworCisgICAgc3RhdGljIGZpbmFsIENvbXBvbmVudE5hbWUgQ09ORklHX0NIQU5HRV9IQU5ETElOR19BQ1RJVklUWSA9CisgICAgICAgICAgICBnZXRDb21wb25lbnROYW1lKENvbmZpZ0NoYW5nZUhhbmRsaW5nQWN0aXZpdHkuY2xhc3MpOworCisgICAgZmluYWwgQWN0aXZpdHlUZXN0UnVsZSBtRmlyc3RBY3Rpdml0eVRlc3RSdWxlID0gbmV3IEFjdGl2aXR5VGVzdFJ1bGUoRmlyc3RBY3Rpdml0eS5jbGFzcywKKyAgICAgICAgICAgIHRydWUgLyogaW5pdGlhbFRvdWNoTW9kZSAqLywgZmFsc2UgLyogbGF1bmNoQWN0aXZpdHkgKi8pOworCisgICAgZmluYWwgQWN0aXZpdHlUZXN0UnVsZSBtU2Vjb25kQWN0aXZpdHlUZXN0UnVsZSA9IG5ldyBBY3Rpdml0eVRlc3RSdWxlKFNlY29uZEFjdGl2aXR5LmNsYXNzLAorICAgICAgICAgICAgdHJ1ZSAvKiBpbml0aWFsVG91Y2hNb2RlICovLCBmYWxzZSAvKiBsYXVuY2hBY3Rpdml0eSAqLyk7CisKKyAgICBmaW5hbCBBY3Rpdml0eVRlc3RSdWxlIG1UcmFuc2x1Y2VudEFjdGl2aXR5VGVzdFJ1bGUgPSBuZXcgQWN0aXZpdHlUZXN0UnVsZSgKKyAgICAgICAgICAgIFRyYW5zbHVjZW50QWN0aXZpdHkuY2xhc3MsIHRydWUgLyogaW5pdGlhbFRvdWNoTW9kZSAqLywgZmFsc2UgLyogbGF1bmNoQWN0aXZpdHkgKi8pOworCisgICAgZmluYWwgQWN0aXZpdHlUZXN0UnVsZSBtU2Vjb25kVHJhbnNsdWNlbnRBY3Rpdml0eVRlc3RSdWxlID0gbmV3IEFjdGl2aXR5VGVzdFJ1bGUoCisgICAgICAgICAgICBTZWNvbmRUcmFuc2x1Y2VudEFjdGl2aXR5LmNsYXNzLCB0cnVlIC8qIGluaXRpYWxUb3VjaE1vZGUgKi8sCisgICAgICAgICAgICBmYWxzZSAvKiBsYXVuY2hBY3Rpdml0eSAqLyk7CisKKyAgICBmaW5hbCBBY3Rpdml0eVRlc3RSdWxlIG1MYXVuY2hGb3JSZXN1bHRBY3Rpdml0eVRlc3RSdWxlID0gbmV3IEFjdGl2aXR5VGVzdFJ1bGUoCisgICAgICAgICAgICBMYXVuY2hGb3JSZXN1bHRBY3Rpdml0eS5jbGFzcywgdHJ1ZSAvKiBpbml0aWFsVG91Y2hNb2RlICovLCBmYWxzZSAvKiBsYXVuY2hBY3Rpdml0eSAqLyk7CisKKyAgICBmaW5hbCBBY3Rpdml0eVRlc3RSdWxlIG1DYWxsYmFja1RyYWNraW5nQWN0aXZpdHlUZXN0UnVsZSA9IG5ldyBBY3Rpdml0eVRlc3RSdWxlKAorICAgICAgICAgICAgQ2FsbGJhY2tUcmFja2luZ0FjdGl2aXR5LmNsYXNzLCB0cnVlIC8qIGluaXRpYWxUb3VjaE1vZGUgKi8sCisgICAgICAgICAgICBmYWxzZSAvKiBsYXVuY2hBY3Rpdml0eSAqLyk7CisKKyAgICBmaW5hbCBBY3Rpdml0eVRlc3RSdWxlIG1TaW5nbGVUb3BBY3Rpdml0eVRlc3RSdWxlID0gbmV3IEFjdGl2aXR5VGVzdFJ1bGUoCisgICAgICAgICAgICBTaW5nbGVUb3BBY3Rpdml0eS5jbGFzcywgdHJ1ZSAvKiBpbml0aWFsVG91Y2hNb2RlICovLCBmYWxzZSAvKiBsYXVuY2hBY3Rpdml0eSAqLyk7CisKKyAgICBmaW5hbCBBY3Rpdml0eVRlc3RSdWxlIG1Db25maWdDaGFuZ2VIYW5kbGluZ0FjdGl2aXR5VGVzdFJ1bGUgPSBuZXcgQWN0aXZpdHlUZXN0UnVsZSgKKyAgICAgICAgICAgIENvbmZpZ0NoYW5nZUhhbmRsaW5nQWN0aXZpdHkuY2xhc3MsIHRydWUgLyogaW5pdGlhbFRvdWNoTW9kZSAqLywKKyAgICAgICAgICAgIGZhbHNlIC8qIGxhdW5jaEFjdGl2aXR5ICovKTsKKworICAgIHByaXZhdGUgZmluYWwgQWN0aXZpdHlMaWZlY3ljbGVNb25pdG9yIG1MaWZlY3ljbGVNb25pdG9yID0gQWN0aXZpdHlMaWZlY3ljbGVNb25pdG9yUmVnaXN0cnkKKyAgICAgICAgICAgIC5nZXRJbnN0YW5jZSgpOworICAgIHByaXZhdGUgc3RhdGljIExpZmVjeWNsZUxvZyBtTGlmZWN5Y2xlTG9nOworICAgIHByaXZhdGUgTGlmZWN5Y2xlVHJhY2tlciBtTGlmZWN5Y2xlVHJhY2tlcjsKKworICAgIEBCZWZvcmUKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICAvLyBMb2cgdHJhbnNpdGlvbnMgZm9yIGFsbCBhY3Rpdml0aWVzIHRoYXQgYmVsb25nIHRvIHRoaXMgYXBwLgorICAgICAgICBtTGlmZWN5Y2xlTG9nID0gbmV3IExpZmVjeWNsZUxvZygpOworICAgICAgICBtTGlmZWN5Y2xlTW9uaXRvci5hZGRMaWZlY3ljbGVDYWxsYmFjayhtTGlmZWN5Y2xlTG9nKTsKKworICAgICAgICAvLyBUcmFjayB0cmFuc2l0aW9ucyBhbmQgYWxsb3cgd2FpdGluZyBmb3IgcGVuZGluZyBhY3Rpdml0eSBzdGF0ZXMuCisgICAgICAgIG1MaWZlY3ljbGVUcmFja2VyID0gbmV3IExpZmVjeWNsZVRyYWNrZXIobUxpZmVjeWNsZUxvZyk7CisgICAgICAgIG1MaWZlY3ljbGVNb25pdG9yLmFkZExpZmVjeWNsZUNhbGxiYWNrKG1MaWZlY3ljbGVUcmFja2VyKTsKKyAgICB9CisKKyAgICBAQWZ0ZXIKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtTGlmZWN5Y2xlTW9uaXRvci5yZW1vdmVMaWZlY3ljbGVDYWxsYmFjayhtTGlmZWN5Y2xlTG9nKTsKKyAgICAgICAgbUxpZmVjeWNsZU1vbml0b3IucmVtb3ZlTGlmZWN5Y2xlQ2FsbGJhY2sobUxpZmVjeWNsZVRyYWNrZXIpOworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworICAgIC8qKiBMYXVuY2ggYW4gYWN0aXZpdHkgZ2l2ZW4gYSBjbGFzcy4gKi8KKyAgICBwcm90ZWN0ZWQgQWN0aXZpdHkgbGF1bmNoQWN0aXZpdHkoQ2xhc3M8PyBleHRlbmRzIEFjdGl2aXR5PiBhY3Rpdml0eUNsYXNzKSB7CisgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldFRhcmdldENvbnRleHQoKSwgYWN0aXZpdHlDbGFzcyk7CisgICAgICAgIHJldHVybiBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKS5zdGFydEFjdGl2aXR5U3luYyhpbnRlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJsb2NraW5nIGNhbGwgdGhhdCB3aWxsIHdhaXQgZm9yIGFjdGl2aXRpZXMgdG8gcmVhY2ggZXhwZWN0ZWQgc3RhdGVzIHdpdGggdGltZW91dC4KKyAgICAgKi8KKyAgICBAU2FmZVZhcmFyZ3MKKyAgICBmaW5hbCB2b2lkIHdhaXRBbmRBc3NlcnRBY3Rpdml0eVN0YXRlcyhQYWlyPEFjdGl2aXR5LCBBY3Rpdml0eUNhbGxiYWNrPi4uLiBhY3Rpdml0eUNhbGxiYWNrcykgeworICAgICAgICBsb2coIlN0YXJ0IHdhaXRBbmRBc3NlcnRBY3Rpdml0eUNhbGxiYWNrcyIpOworICAgICAgICBtTGlmZWN5Y2xlVHJhY2tlci53YWl0QW5kQXNzZXJ0QWN0aXZpdHlTdGF0ZXMoYWN0aXZpdHlDYWxsYmFja3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJsb2NraW5nIGNhbGwgdGhhdCB3aWxsIHdhaXQgZm9yIGFjdGl2aXRpZXMgdG8gcGVyZm9ybSB0aGUgZXhwZWN0ZWQgc2VxdWVuY2Ugb2YgdHJhbnNpdGlvbnMuCisgICAgICogQHNlZSBMaWZlY3ljbGVUcmFja2VyI3dhaXRGb3JBY3Rpdml0eVRyYW5zaXRpb25zKENsYXNzLCBMaXN0KQorICAgICAqLworICAgIGZpbmFsIHZvaWQgd2FpdEZvckFjdGl2aXR5VHJhbnNpdGlvbnMoQ2xhc3M8PyBleHRlbmRzIEFjdGl2aXR5PiBhY3Rpdml0eUNsYXNzLAorICAgICAgICAgICAgTGlzdDxBY3Rpdml0eUNhbGxiYWNrPiBleHBlY3RlZFRyYW5zaXRpb25zKSB7CisgICAgICAgIGxvZygiU3RhcnQgd2FpdEFuZEFzc2VydEFjdGl2aXR5VHJhbnNpdGlvbiIpOworICAgICAgICBtTGlmZWN5Y2xlVHJhY2tlci53YWl0Rm9yQWN0aXZpdHlUcmFuc2l0aW9ucyhhY3Rpdml0eUNsYXNzLCBleHBlY3RlZFRyYW5zaXRpb25zKTsKKyAgICB9CisKKyAgICBMaWZlY3ljbGVMb2cgZ2V0TGlmZWN5Y2xlTG9nKCkgeworICAgICAgICByZXR1cm4gbUxpZmVjeWNsZUxvZzsKKyAgICB9CisKKyAgICBzdGF0aWMgUGFpcjxBY3Rpdml0eSwgQWN0aXZpdHlDYWxsYmFjaz4gc3RhdGUoQWN0aXZpdHkgYWN0aXZpdHksIEFjdGl2aXR5Q2FsbGJhY2sgc3RhZ2UpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBQYWlyPD4oYWN0aXZpdHksIHN0YWdlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgcGFpciBvZiB0aGUgYWN0aXZpdHkgYW5kIHRoZSBzdGF0ZSBpdCBzaG91bGQgYmUgaW4gYmFzZWQgb24gdGhlIGNvbmZpZ3VyYXRpb24gb2YKKyAgICAgKiBvY2NsdWRpbmdBY3Rpdml0eS4KKyAgICAgKi8KKyAgICBzdGF0aWMgUGFpcjxBY3Rpdml0eSwgQWN0aXZpdHlDYWxsYmFjaz4gb2NjbHVkZWRBY3Rpdml0eVN0YXRlKAorICAgICAgICAgICAgQWN0aXZpdHkgYWN0aXZpdHksIEFjdGl2aXR5IG9jY2x1ZGluZ0FjdGl2aXR5KSB7CisgICAgICAgIHJldHVybiBvY2NsdWRlZEFjdGl2aXR5U3RhdGUoYWN0aXZpdHksIGlzVHJhbnNsdWNlbnQob2NjbHVkaW5nQWN0aXZpdHkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgcGFpciBvZiB0aGUgYWN0aXZpdHkgYW5kIHRoZSBzdGF0ZSBpdCBzaG91bGQgYmUgaW4gYmFzZWQgb24KKyAgICAgKiBvY2NsdWRpbmdBY3Rpdml0eUlzVHJhbnNsdWNlbnQuCisgICAgICovCisgICAgc3RhdGljIFBhaXI8QWN0aXZpdHksIEFjdGl2aXR5Q2FsbGJhY2s+IG9jY2x1ZGVkQWN0aXZpdHlTdGF0ZSgKKyAgICAgICAgICAgIEFjdGl2aXR5IGFjdGl2aXR5LCBib29sZWFuIG9jY2x1ZGluZ0FjdGl2aXR5SXNUcmFuc2x1Y2VudCkgeworICAgICAgICAvLyBBY3Rpdml0aWVzIGJlaGluZCBhIHRyYW5zbHVjZW50IGFjdGl2aXR5IHNob3VsZCBiZSBpbiB0aGUgcGF1c2VkIHN0YXRlIHNpbmNlIHRoZXkgYXJlCisgICAgICAgIC8vIHN0aWxsIHZpc2libGUuIE90aGVyd2lzZSwgdGhleSBzaG91bGQgYmUgaW4gdGhlIHN0b3BwZWQgc3RhdGUuCisgICAgICAgIHJldHVybiBuZXcgUGFpcjw+KGFjdGl2aXR5LCBvY2NsdWRlZEFjdGl2aXR5U3RhdGUob2NjbHVkaW5nQWN0aXZpdHlJc1RyYW5zbHVjZW50KSk7CisgICAgfQorCisgICAgc3RhdGljIEFjdGl2aXR5Q2FsbGJhY2sgb2NjbHVkZWRBY3Rpdml0eVN0YXRlKGJvb2xlYW4gb2NjbHVkaW5nQWN0aXZpdHlJc1RyYW5zbHVjZW50KSB7CisgICAgICAgIHJldHVybiBvY2NsdWRpbmdBY3Rpdml0eUlzVHJhbnNsdWNlbnQgPyBPTl9QQVVTRSA6IE9OX1NUT1A7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgdHJ1ZSBpZiB0aGUgaW5wdXQgYWN0aXZpdHkgaXMgdHJhbnNsdWNlbnQuICovCisgICAgc3RhdGljIGJvb2xlYW4gaXNUcmFuc2x1Y2VudChBY3Rpdml0eSBhY3Rpdml0eSkgeworICAgICAgICByZXR1cm4gQWN0aXZpdHlJbmZvLmlzVHJhbnNsdWNlbnRPckZsb2F0aW5nKGFjdGl2aXR5LmdldFdpbmRvdygpLmdldFdpbmRvd1N0eWxlKCkpOworICAgIH0KKworICAgIC8vIFRlc3QgYWN0aXZpdHkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZpcnN0QWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgfQorCisgICAgLy8gVGVzdCBhY3Rpdml0eQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2Vjb25kQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgfQorCisgICAgLy8gVHJhbnNsdWNlbnQgdGVzdCBhY3Rpdml0eQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVHJhbnNsdWNlbnRBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICB9CisKKyAgICAvLyBUcmFuc2x1Y2VudCB0ZXN0IGFjdGl2aXR5CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTZWNvbmRUcmFuc2x1Y2VudEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEJhc2UgYWN0aXZpdHkgdGhhdCByZWNvcmRzIGNhbGxiYWNrcyBvdGhlciB0aGVuIG1haW4gbGlmZWN5Y2xlIHRyYW5zaXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2FsbGJhY2tUcmFja2luZ0FjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25BY3Rpdml0eVJlc3VsdChpbnQgcmVxdWVzdENvZGUsIGludCByZXN1bHRDb2RlLCBJbnRlbnQgZGF0YSkgeworICAgICAgICAgICAgc3VwZXIub25BY3Rpdml0eVJlc3VsdChyZXF1ZXN0Q29kZSwgcmVzdWx0Q29kZSwgZGF0YSk7CisgICAgICAgICAgICBtTGlmZWN5Y2xlTG9nLm9uQWN0aXZpdHlDYWxsYmFjayh0aGlzLCBPTl9BQ1RJVklUWV9SRVNVTFQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uUG9zdENyZWF0ZShATnVsbGFibGUgQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICAgICAgc3VwZXIub25Qb3N0Q3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgICAgICBtTGlmZWN5Y2xlTG9nLm9uQWN0aXZpdHlDYWxsYmFjayh0aGlzLCBPTl9QT1NUX0NSRUFURSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25OZXdJbnRlbnQoSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgc3VwZXIub25OZXdJbnRlbnQoaW50ZW50KTsKKyAgICAgICAgICAgIG1MaWZlY3ljbGVMb2cub25BY3Rpdml0eUNhbGxiYWNrKHRoaXMsIE9OX05FV19JTlRFTlQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uTXVsdGlXaW5kb3dNb2RlQ2hhbmdlZChib29sZWFuIGlzSW5NdWx0aVdpbmRvd01vZGUsIENvbmZpZ3VyYXRpb24gbmV3Q29uZmlnKSB7CisgICAgICAgICAgICBtTGlmZWN5Y2xlTG9nLm9uQWN0aXZpdHlDYWxsYmFjayh0aGlzLCBPTl9NVUxUSV9XSU5ET1dfTU9ERV9DSEFOR0VEKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgYWN0aXZpdHkgdGhhdCBsYXVuY2hlcyB7QGxpbmsgUmVzdWx0QWN0aXZpdHl9IGZvciByZXN1bHQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBMYXVuY2hGb3JSZXN1bHRBY3Rpdml0eSBleHRlbmRzIENhbGxiYWNrVHJhY2tpbmdBY3Rpdml0eSB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgICAgICBzdGFydEZvclJlc3VsdCgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0Rm9yUmVzdWx0KCkgeworICAgICAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQodGhpcywgUmVzdWx0QWN0aXZpdHkuY2xhc3MpOworICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhcyhnZXRJbnRlbnQoKSk7CisgICAgICAgICAgICBzdGFydEFjdGl2aXR5Rm9yUmVzdWx0KGludGVudCwgMSAvKiByZXF1ZXN0Q29kZSAqLyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogVGVzdCBhY3Rpdml0eSB0aGF0IGlzIHN0YXJ0ZWQgZm9yIHJlc3VsdCBhbmQgZmluaXNoZXMgaXRzZWxmIGluIE9OX1JFU1VNRS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc3VsdEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7CisgICAgICAgICAgICBzdXBlci5vblJlc3VtZSgpOworICAgICAgICAgICAgc2V0UmVzdWx0KFJFU1VMVF9PSyk7CisgICAgICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gZ2V0SW50ZW50KCk7CisgICAgICAgICAgICBpZiAoaW50ZW50LmdldEJvb2xlYW5FeHRyYShFWFRSQV9GSU5JU0hfSU5fT05fUkVTVU1FLCBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICBmaW5pc2goKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaW50ZW50LmdldEJvb2xlYW5FeHRyYShFWFRSQV9GSU5JU0hfQUZURVJfUkVTVU1FLCBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICBuZXcgSGFuZGxlcigpLnBvc3REZWxheWVkKCgpIC0+IGZpbmlzaCgpLCAyMDAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBUZXN0IGFjdGl2aXR5IHRoYXQgY2FuIGNhbGwge0BsaW5rIEFjdGl2aXR5I3JlY3JlYXRlKCl9IGlmIHJlcXVlc3RlZCBpbiBhIG5ldyBpbnRlbnQuICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTaW5nbGVUb3BBY3Rpdml0eSBleHRlbmRzIENhbGxiYWNrVHJhY2tpbmdBY3Rpdml0eSB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uTmV3SW50ZW50KEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uTmV3SW50ZW50KGludGVudCk7CisgICAgICAgICAgICBpZiAoaW50ZW50ICE9IG51bGwgJiYgaW50ZW50LmdldEJvb2xlYW5FeHRyYShFWFRSQV9SRUNSRUFURSwgZmFsc2UpKSB7CisgICAgICAgICAgICAgICAgcmVjcmVhdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIENvbmZpZyBjaGFuZ2UgaGFuZGxpbmcgYWN0aXZpdHkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbmZpZ0NoYW5nZUhhbmRsaW5nQWN0aXZpdHkgZXh0ZW5kcyBDYWxsYmFja1RyYWNraW5nQWN0aXZpdHkgeworICAgIH0KKworICAgIHN0YXRpYyBDb21wb25lbnROYW1lIGdldENvbXBvbmVudE5hbWUoQ2xhc3M8PyBleHRlbmRzIEFjdGl2aXR5PiBhY3Rpdml0eSkgeworICAgICAgICByZXR1cm4gbmV3IENvbXBvbmVudE5hbWUoSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpLCBhY3Rpdml0eSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9saWZlY3ljbGUvQWN0aXZpdHlMaWZlY3ljbGVLZXlndWFyZFRlc3RzLmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2FtL2xpZmVjeWNsZS9BY3Rpdml0eUxpZmVjeWNsZUtleWd1YXJkVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjZhYmU5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9saWZlY3ljbGUvQWN0aXZpdHlMaWZlY3ljbGVLZXlndWFyZFRlc3RzLmphdmEKQEAgLTAsMCArMSwzOCBAQAorcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbS5saWZlY3ljbGU7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0ubGlmZWN5Y2xlLkxpZmVjeWNsZUxvZy5BY3Rpdml0eUNhbGxiYWNrLk9OX1NUT1A7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5QcmVzdWJtaXQ7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworCisvKioKKyAqIEJ1aWxkL0luc3RhbGwvUnVuOgorICogICAgIGF0ZXN0IEN0c0FjdGl2aXR5TWFuYWdlckRldmljZVRlc3RDYXNlczpBY3Rpdml0eUxpZmVjeWNsZUtleWd1YXJkVGVzdHMKKyAqLworQE1lZGl1bVRlc3QKK0BSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCitAUHJlc3VibWl0CitwdWJsaWMgY2xhc3MgQWN0aXZpdHlMaWZlY3ljbGVLZXlndWFyZFRlc3RzIGV4dGVuZHMgQWN0aXZpdHlMaWZlY3ljbGVDbGllbnRUZXN0QmFzZSB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGVMYXVuY2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFzdXBwb3J0c1NlY3VyZUxvY2soKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRyeSAoZmluYWwgTG9ja1NjcmVlblNlc3Npb24gbG9ja1NjcmVlblNlc3Npb24gPSBuZXcgTG9ja1NjcmVlblNlc3Npb24oKSkgeworICAgICAgICAgICAgbG9ja1NjcmVlblNlc3Npb24uc2V0TG9ja0NyZWRlbnRpYWwoKS5nb3RvS2V5Z3VhcmQoKTsKKworICAgICAgICAgICAgZmluYWwgQWN0aXZpdHkgYWN0aXZpdHkgPSBtRmlyc3RBY3Rpdml0eVRlc3RSdWxlLmxhdW5jaEFjdGl2aXR5KG5ldyBJbnRlbnQoKSk7CisgICAgICAgICAgICB3YWl0QW5kQXNzZXJ0QWN0aXZpdHlTdGF0ZXMoc3RhdGUoYWN0aXZpdHksIE9OX1NUT1ApKTsKKworICAgICAgICAgICAgTGlmZWN5Y2xlVmVyaWZpZXIuYXNzZXJ0TGF1bmNoQW5kU3RvcFNlcXVlbmNlKEZpcnN0QWN0aXZpdHkuY2xhc3MsIGdldExpZmVjeWNsZUxvZygpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vbGlmZWN5Y2xlL0FjdGl2aXR5TGlmZWN5Y2xlVGVzdHMuamF2YSBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vbGlmZWN5Y2xlL0FjdGl2aXR5TGlmZWN5Y2xlVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTYxZWNhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9saWZlY3ljbGUvQWN0aXZpdHlMaWZlY3ljbGVUZXN0cy5qYXZhCkBAIC0wLDAgKzEsODI0IEBACitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLmFtLmxpZmVjeWNsZTsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5XaW5kb3dDb25maWd1cmF0aW9uLldJTkRPV0lOR19NT0RFX0ZVTExTQ1JFRU47CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLldpbmRvd0NvbmZpZ3VyYXRpb24uV0lORE9XSU5HX01PREVfU1BMSVRfU0NSRUVOX1BSSU1BUlk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkFjdGl2aXR5TWFuYWdlclN0YXRlLlNUQVRFX1BBVVNFRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQWN0aXZpdHlNYW5hZ2VyU3RhdGUuU1RBVEVfU1RPUFBFRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uVWlEZXZpY2VVdGlscy5wcmVzc0JhY2tCdXR0b247CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLmxpZmVjeWNsZS5MaWZlY3ljbGVMb2cuQWN0aXZpdHlDYWxsYmFjay5PTl9BQ1RJVklUWV9SRVNVTFQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLmxpZmVjeWNsZS5MaWZlY3ljbGVMb2cuQWN0aXZpdHlDYWxsYmFjay5PTl9DUkVBVEU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLmxpZmVjeWNsZS5MaWZlY3ljbGVMb2cuQWN0aXZpdHlDYWxsYmFjay5PTl9ERVNUUk9ZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5saWZlY3ljbGUuTGlmZWN5Y2xlTG9nLkFjdGl2aXR5Q2FsbGJhY2sKKyAgICAgICAgLk9OX01VTFRJX1dJTkRPV19NT0RFX0NIQU5HRUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLmxpZmVjeWNsZS5MaWZlY3ljbGVMb2cuQWN0aXZpdHlDYWxsYmFjay5PTl9ORVdfSU5URU5UOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5saWZlY3ljbGUuTGlmZWN5Y2xlTG9nLkFjdGl2aXR5Q2FsbGJhY2suT05fUEFVU0U7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLmxpZmVjeWNsZS5MaWZlY3ljbGVMb2cuQWN0aXZpdHlDYWxsYmFjay5PTl9QT1NUX0NSRUFURTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0ubGlmZWN5Y2xlLkxpZmVjeWNsZUxvZy5BY3Rpdml0eUNhbGxiYWNrLk9OX1JFU1RBUlQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLmxpZmVjeWNsZS5MaWZlY3ljbGVMb2cuQWN0aXZpdHlDYWxsYmFjay5PTl9SRVNVTUU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLmxpZmVjeWNsZS5MaWZlY3ljbGVMb2cuQWN0aXZpdHlDYWxsYmFjay5PTl9TVEFSVDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0ubGlmZWN5Y2xlLkxpZmVjeWNsZUxvZy5BY3Rpdml0eUNhbGxiYWNrLk9OX1NUT1A7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLmxpZmVjeWNsZS5MaWZlY3ljbGVMb2cuQWN0aXZpdHlDYWxsYmFjay5QUkVfT05fQ1JFQVRFOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuU3VyZmFjZS5ST1RBVElPTl8wOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuU3VyZmFjZS5ST1RBVElPTl8xODA7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5TdXJmYWNlLlJPVEFUSU9OXzI3MDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LlN1cmZhY2UuUk9UQVRJT05fOTA7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb24uQWN0aXZpdHlNb25pdG9yOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkFjdGl2aXR5SW5mbzsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUHJlc3VibWl0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLkZsYWt5VGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5BbVV0aWxzOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBCdWlsZC9JbnN0YWxsL1J1bjoKKyAqICAgICBhdGVzdCBDdHNBY3Rpdml0eU1hbmFnZXJEZXZpY2VUZXN0Q2FzZXM6QWN0aXZpdHlMaWZlY3ljbGVUZXN0cworICovCitATWVkaXVtVGVzdAorQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKK0BQcmVzdWJtaXQKK0BGbGFreVRlc3QoYnVnSWQgPSA3NzY1MjI2MSkKK3B1YmxpYyBjbGFzcyBBY3Rpdml0eUxpZmVjeWNsZVRlc3RzIGV4dGVuZHMgQWN0aXZpdHlMaWZlY3ljbGVDbGllbnRUZXN0QmFzZSB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGVMYXVuY2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQWN0aXZpdHkgYWN0aXZpdHkgPSBtRmlyc3RBY3Rpdml0eVRlc3RSdWxlLmxhdW5jaEFjdGl2aXR5KG5ldyBJbnRlbnQoKSk7CisgICAgICAgIHdhaXRBbmRBc3NlcnRBY3Rpdml0eVN0YXRlcyhzdGF0ZShhY3Rpdml0eSwgT05fUkVTVU1FKSk7CisKKyAgICAgICAgTGlmZWN5Y2xlVmVyaWZpZXIuYXNzZXJ0TGF1bmNoU2VxdWVuY2UoRmlyc3RBY3Rpdml0eS5jbGFzcywgZ2V0TGlmZWN5Y2xlTG9nKCksCisgICAgICAgICAgICAgICAgZmFsc2UgLyogaW5jbHVkZUNhbGxiYWNrcyAqLyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGF1bmNoT25Ub3AoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQWN0aXZpdHkgZmlyc3RBY3Rpdml0eSA9IG1GaXJzdEFjdGl2aXR5VGVzdFJ1bGUubGF1bmNoQWN0aXZpdHkobmV3IEludGVudCgpKTsKKyAgICAgICAgd2FpdEFuZEFzc2VydEFjdGl2aXR5U3RhdGVzKHN0YXRlKGZpcnN0QWN0aXZpdHksIE9OX1JFU1VNRSkpOworCisgICAgICAgIGdldExpZmVjeWNsZUxvZygpLmNsZWFyKCk7CisgICAgICAgIGZpbmFsIEFjdGl2aXR5IHNlY29uZEFjdGl2aXR5ID0gbVNlY29uZEFjdGl2aXR5VGVzdFJ1bGUubGF1bmNoQWN0aXZpdHkobmV3IEludGVudCgpKTsKKyAgICAgICAgd2FpdEFuZEFzc2VydEFjdGl2aXR5U3RhdGVzKG9jY2x1ZGVkQWN0aXZpdHlTdGF0ZShmaXJzdEFjdGl2aXR5LCBzZWNvbmRBY3Rpdml0eSksCisgICAgICAgICAgICAgICAgc3RhdGUoc2Vjb25kQWN0aXZpdHksIE9OX1JFU1VNRSkpOworCisgICAgICAgIExpZmVjeWNsZVZlcmlmaWVyLmFzc2VydExhdW5jaFNlcXVlbmNlKFNlY29uZEFjdGl2aXR5LmNsYXNzLCBGaXJzdEFjdGl2aXR5LmNsYXNzLAorICAgICAgICAgICAgICAgIGdldExpZmVjeWNsZUxvZygpLCBpc1RyYW5zbHVjZW50KHNlY29uZEFjdGl2aXR5KSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGF1bmNoQW5kRGVzdHJveSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBBY3Rpdml0eSBhY3Rpdml0eSA9IG1GaXJzdEFjdGl2aXR5VGVzdFJ1bGUubGF1bmNoQWN0aXZpdHkobmV3IEludGVudCgpKTsKKworICAgICAgICBhY3Rpdml0eS5maW5pc2goKTsKKyAgICAgICAgd2FpdEFuZEFzc2VydEFjdGl2aXR5U3RhdGVzKHN0YXRlKGFjdGl2aXR5LCBPTl9ERVNUUk9ZKSk7CisKKyAgICAgICAgTGlmZWN5Y2xlVmVyaWZpZXIuYXNzZXJ0TGF1bmNoQW5kRGVzdHJveVNlcXVlbmNlKEZpcnN0QWN0aXZpdHkuY2xhc3MsIGdldExpZmVjeWNsZUxvZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWxhdW5jaFJlc3VtZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQWN0aXZpdHkgYWN0aXZpdHkgPSBtRmlyc3RBY3Rpdml0eVRlc3RSdWxlLmxhdW5jaEFjdGl2aXR5KG5ldyBJbnRlbnQoKSk7CisgICAgICAgIHdhaXRBbmRBc3NlcnRBY3Rpdml0eVN0YXRlcyhzdGF0ZShhY3Rpdml0eSwgT05fUkVTVU1FKSk7CisKKyAgICAgICAgZ2V0TGlmZWN5Y2xlTG9nKCkuY2xlYXIoKTsKKyAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkucnVuT25NYWluU3luYyhhY3Rpdml0eTo6cmVjcmVhdGUpOworICAgICAgICB3YWl0QW5kQXNzZXJ0QWN0aXZpdHlTdGF0ZXMoc3RhdGUoYWN0aXZpdHksIE9OX1JFU1VNRSkpOworCisgICAgICAgIExpZmVjeWNsZVZlcmlmaWVyLmFzc2VydFJlbGF1bmNoU2VxdWVuY2UoRmlyc3RBY3Rpdml0eS5jbGFzcywgZ2V0TGlmZWN5Y2xlTG9nKCksIE9OX1JFU1VNRSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVsYXVuY2hQYXVzZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQWN0aXZpdHkgcGF1c2VkQWN0aXZpdHkgPSBtRmlyc3RBY3Rpdml0eVRlc3RSdWxlLmxhdW5jaEFjdGl2aXR5KG5ldyBJbnRlbnQoKSk7CisgICAgICAgIGZpbmFsIEFjdGl2aXR5IHRvcFRyYW5zbHVjZW50QWN0aXZpdHkgPQorICAgICAgICAgICAgICAgIG1UcmFuc2x1Y2VudEFjdGl2aXR5VGVzdFJ1bGUubGF1bmNoQWN0aXZpdHkobmV3IEludGVudCgpKTsKKworICAgICAgICB3YWl0QW5kQXNzZXJ0QWN0aXZpdHlTdGF0ZXMoc3RhdGUocGF1c2VkQWN0aXZpdHksIE9OX1BBVVNFKSwKKyAgICAgICAgICAgICAgICBzdGF0ZSh0b3BUcmFuc2x1Y2VudEFjdGl2aXR5LCBPTl9SRVNVTUUpKTsKKworICAgICAgICBnZXRMaWZlY3ljbGVMb2coKS5jbGVhcigpOworICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKS5ydW5Pbk1haW5TeW5jKHBhdXNlZEFjdGl2aXR5OjpyZWNyZWF0ZSk7CisgICAgICAgIHdhaXRBbmRBc3NlcnRBY3Rpdml0eVN0YXRlcyhzdGF0ZShwYXVzZWRBY3Rpdml0eSwgT05fUEFVU0UpKTsKKworICAgICAgICBMaWZlY3ljbGVWZXJpZmllci5hc3NlcnRSZWxhdW5jaFNlcXVlbmNlKEZpcnN0QWN0aXZpdHkuY2xhc3MsIGdldExpZmVjeWNsZUxvZygpLCBPTl9QQVVTRSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVsYXVuY2hTdG9wcGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEFjdGl2aXR5IHN0b3BwZWRBY3Rpdml0eSA9IG1GaXJzdEFjdGl2aXR5VGVzdFJ1bGUubGF1bmNoQWN0aXZpdHkobmV3IEludGVudCgpKTsKKyAgICAgICAgZmluYWwgQWN0aXZpdHkgdG9wQWN0aXZpdHkgPSBtU2Vjb25kQWN0aXZpdHlUZXN0UnVsZS5sYXVuY2hBY3Rpdml0eShuZXcgSW50ZW50KCkpOworCisgICAgICAgIHdhaXRBbmRBc3NlcnRBY3Rpdml0eVN0YXRlcygKKyAgICAgICAgICAgICAgICBvY2NsdWRlZEFjdGl2aXR5U3RhdGUoc3RvcHBlZEFjdGl2aXR5LCB0b3BBY3Rpdml0eSksIHN0YXRlKHRvcEFjdGl2aXR5LCBPTl9SRVNVTUUpKTsKKworICAgICAgICBnZXRMaWZlY3ljbGVMb2coKS5jbGVhcigpOworICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKS5ydW5Pbk1haW5TeW5jKHN0b3BwZWRBY3Rpdml0eTo6cmVjcmVhdGUpOworICAgICAgICB3YWl0QW5kQXNzZXJ0QWN0aXZpdHlTdGF0ZXMob2NjbHVkZWRBY3Rpdml0eVN0YXRlKHN0b3BwZWRBY3Rpdml0eSwgdG9wQWN0aXZpdHkpKTsKKworICAgICAgICBMaWZlY3ljbGVWZXJpZmllci5hc3NlcnRSZWxhdW5jaFNlcXVlbmNlKEZpcnN0QWN0aXZpdHkuY2xhc3MsIGdldExpZmVjeWNsZUxvZygpLAorICAgICAgICAgICAgICAgIG9jY2x1ZGVkQWN0aXZpdHlTdGF0ZShpc1RyYW5zbHVjZW50KHRvcEFjdGl2aXR5KSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlbGF1bmNoQ29uZmlndXJhdGlvbkNoYW5nZWRXaGlsZUJlY29taW5nVmlzaWJsZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIXN1cHBvcnRzUm90YXRpb24oKSkgeworICAgICAgICAgICAgLy8gU2tpcCByb3RhdGlvbiB0ZXN0IGlmIGRldmljZSBkb2Vzbid0IHN1cHBvcnQgaXQuCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBBY3Rpdml0eSBiZWNvbWluZ1Zpc2libGVBY3Rpdml0eSA9CisgICAgICAgICAgICAgICAgbUZpcnN0QWN0aXZpdHlUZXN0UnVsZS5sYXVuY2hBY3Rpdml0eShuZXcgSW50ZW50KCkpOworICAgICAgICBmaW5hbCBBY3Rpdml0eSB0cmFuc2x1Y2VudEFjdGl2aXR5ID0KKyAgICAgICAgICAgICAgICBtVHJhbnNsdWNlbnRBY3Rpdml0eVRlc3RSdWxlLmxhdW5jaEFjdGl2aXR5KG5ldyBJbnRlbnQoKSk7CisgICAgICAgIGZpbmFsIEFjdGl2aXR5IHRvcE9wYXF1ZUFjdGl2aXR5ID0gbVNlY29uZEFjdGl2aXR5VGVzdFJ1bGUubGF1bmNoQWN0aXZpdHkobmV3IEludGVudCgpKTsKKworICAgICAgICB3YWl0QW5kQXNzZXJ0QWN0aXZpdHlTdGF0ZXMoCisgICAgICAgICAgICAgICAgb2NjbHVkZWRBY3Rpdml0eVN0YXRlKGJlY29taW5nVmlzaWJsZUFjdGl2aXR5LCB0b3BPcGFxdWVBY3Rpdml0eSksCisgICAgICAgICAgICAgICAgb2NjbHVkZWRBY3Rpdml0eVN0YXRlKHRyYW5zbHVjZW50QWN0aXZpdHksIHRvcE9wYXF1ZUFjdGl2aXR5KSwKKyAgICAgICAgICAgICAgICBzdGF0ZSh0b3BPcGFxdWVBY3Rpdml0eSwgT05fUkVTVU1FKSk7CisKKyAgICAgICAgdHJ5IChmaW5hbCBSb3RhdGlvblNlc3Npb24gcm90YXRpb25TZXNzaW9uID0gbmV3IFJvdGF0aW9uU2Vzc2lvbigpKSB7CisgICAgICAgICAgICBpZiAoIXN1cHBvcnRzTG9ja2VkVXNlclJvdGF0aW9uKAorICAgICAgICAgICAgICAgICAgICByb3RhdGlvblNlc3Npb24sIHRyYW5zbHVjZW50QWN0aXZpdHkuZ2V0RGlzcGxheSgpLmdldERpc3BsYXlJZCgpKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZ2V0TGlmZWN5Y2xlTG9nKCkuY2xlYXIoKTsKKworICAgICAgICAgICAgZmluYWwgaW50IGN1cnJlbnQgPSByb3RhdGlvblNlc3Npb24uZ2V0KCk7CisgICAgICAgICAgICAvLyBTZXQgbmV3IHJvdGF0aW9uIHRvIGNhdXNlIGEgY29uZmlndXJhdGlvbiBjaGFuZ2UuCisgICAgICAgICAgICBzd2l0Y2ggKGN1cnJlbnQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFJPVEFUSU9OXzA6CisgICAgICAgICAgICAgICAgY2FzZSBST1RBVElPTl8xODA6CisgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uU2Vzc2lvbi5zZXQoUk9UQVRJT05fOTApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFJPVEFUSU9OXzkwOgorICAgICAgICAgICAgICAgIGNhc2UgUk9UQVRJT05fMjcwOgorICAgICAgICAgICAgICAgICAgICByb3RhdGlvblNlc3Npb24uc2V0KFJPVEFUSU9OXzApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBmYWlsKCJVbmtub3duIHJvdGF0aW9uOiIgKyBjdXJyZW50KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQXNzZXJ0IHRoYXQgdGhlIHRvcCBhY3Rpdml0eSB3YXMgcmVsYXVuY2hlZC4KKyAgICAgICAgICAgIHdhaXRBbmRBc3NlcnRBY3Rpdml0eVN0YXRlcyhzdGF0ZSh0b3BPcGFxdWVBY3Rpdml0eSwgT05fUkVTVU1FKSk7CisgICAgICAgICAgICBMaWZlY3ljbGVWZXJpZmllci5hc3NlcnRSZWxhdW5jaFNlcXVlbmNlKAorICAgICAgICAgICAgICAgICAgICBTZWNvbmRBY3Rpdml0eS5jbGFzcywgZ2V0TGlmZWN5Y2xlTG9nKCksIE9OX1JFU1VNRSk7CisKKyAgICAgICAgICAgIC8vIEZpbmlzaCB0aGUgdG9wIGFjdGl2aXR5CisgICAgICAgICAgICBnZXRMaWZlY3ljbGVMb2coKS5jbGVhcigpOworICAgICAgICAgICAgbVNlY29uZEFjdGl2aXR5VGVzdFJ1bGUuZmluaXNoQWN0aXZpdHkoKTsKKworICAgICAgICAgICAgLy8gQXNzZXJ0IHRoYXQgdGhlIHRyYW5zbHVjZW50IGFjdGl2aXR5IGFuZCB0aGUgYWN0aXZpdHkgdmlzaWJsZSBiZWhpbmQgaXQgd2VyZQorICAgICAgICAgICAgLy8gcmVsYXVuY2hlZC4KKyAgICAgICAgICAgIHdhaXRBbmRBc3NlcnRBY3Rpdml0eVN0YXRlcyhzdGF0ZShiZWNvbWluZ1Zpc2libGVBY3Rpdml0eSwgT05fUEFVU0UpLAorICAgICAgICAgICAgICAgICAgICBzdGF0ZSh0cmFuc2x1Y2VudEFjdGl2aXR5LCBPTl9SRVNVTUUpKTsKKworICAgICAgICAgICAgTGlmZWN5Y2xlVmVyaWZpZXIuYXNzZXJ0U2VxdWVuY2UoRmlyc3RBY3Rpdml0eS5jbGFzcywgZ2V0TGlmZWN5Y2xlTG9nKCksCisgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoT05fREVTVFJPWSwgUFJFX09OX0NSRUFURSwgT05fQ1JFQVRFLCBPTl9TVEFSVCwgT05fUkVTVU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9OX1BBVVNFKSwgImJlY29taW5nVmlzaWJsZVBhdXNlZCIpOworICAgICAgICAgICAgLy8gVE9ETyhiLzc3OTc0Nzk0KTogTmV3IGludGVudCBoYW5kbGluZyBzZXF1ZW5jZSBzaG91bGQgYWx3YXlzIGJlIHRoZSBzYW1lLgorICAgICAgICAgICAgLy8gSXQgaXMgcG9zc2libGUgdG8gZ2V0IGFuIGV4dHJhIHBhdXNlIGFuZCByZXN1bWUgbm93LgorICAgICAgICAgICAgZmluYWwgTGlzdDxMaWZlY3ljbGVMb2cuQWN0aXZpdHlDYWxsYmFjaz4gZXhwZWN0ZWRTZXF1ZW5jZSA9CisgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoT05fREVTVFJPWSwgUFJFX09OX0NSRUFURSwgT05fQ1JFQVRFLCBPTl9TVEFSVCwgT05fUkVTVU1FKTsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8TGlmZWN5Y2xlTG9nLkFjdGl2aXR5Q2FsbGJhY2s+IGV4dHJhQ3ljbGVTZXF1ZW5jZSA9CisgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoT05fREVTVFJPWSwgUFJFX09OX0NSRUFURSwgT05fQ1JFQVRFLCBPTl9TVEFSVCwgT05fUkVTVU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9OX1BBVVNFLCBPTl9SRVNVTUUpOworICAgICAgICAgICAgTGlmZWN5Y2xlVmVyaWZpZXIuYXNzZXJ0U2VxdWVuY2VNYXRjaGVzT25lT2YoVHJhbnNsdWNlbnRBY3Rpdml0eS5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgZ2V0TGlmZWN5Y2xlTG9nKCksCisgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoZXhwZWN0ZWRTZXF1ZW5jZSwgZXh0cmFDeWNsZVNlcXVlbmNlKSwKKyAgICAgICAgICAgICAgICAgICAgImJlY29taW5nVmlzaWJsZVJlc3VtZWQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBhdXNlZFdpdGhUcmFuc2x1Y2VudE9uVG9wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIExhdW5jaCBmdWxsc2NyZWVuIGFjdGl2aXR5CisgICAgICAgIGZpbmFsIEFjdGl2aXR5IGZpcnN0QWN0aXZpdHkgPQorICAgICAgICAgICAgICAgIG1GaXJzdEFjdGl2aXR5VGVzdFJ1bGUubGF1bmNoQWN0aXZpdHkobmV3IEludGVudCgpKTsKKworICAgICAgICAvLyBMYXVuY2ggdHJhbnNsdWNlbnQgYWN0aXZpdHkgb24gdG9wCisgICAgICAgIG1UcmFuc2x1Y2VudEFjdGl2aXR5VGVzdFJ1bGUubGF1bmNoQWN0aXZpdHkobmV3IEludGVudCgpKTsKKworICAgICAgICAvLyBMYXVuY2ggYW5vdGhlciB0cmFuc2x1Y2VudCBhY3Rpdml0eSBvbiB0b3AgdG8gbWFrZSBzdXJlIHRoZSBmdWxsc2NyZWVuIGFjdGl2aXR5CisgICAgICAgIC8vIHRyYW5zaXRpb25zIHRvIGZpbmFsIHN0YXRlCisgICAgICAgIGZpbmFsIEFjdGl2aXR5IHNlY29uZFRyYW5zbHVjZW50QWN0aXZpdHkgPQorICAgICAgICAgICAgICAgIG1TZWNvbmRUcmFuc2x1Y2VudEFjdGl2aXR5VGVzdFJ1bGUubGF1bmNoQWN0aXZpdHkobmV3IEludGVudCgpKTsKKworICAgICAgICAvLyBXYWl0IGZvciB0aGUgc2Vjb25kIHRyYW5zbHVjZW50IGFjdGl2aXR5IHRvIGJlY29tZSByZXN1bWVkLgorICAgICAgICB3YWl0QW5kQXNzZXJ0QWN0aXZpdHlTdGF0ZXMoc3RhdGUoc2Vjb25kVHJhbnNsdWNlbnRBY3Rpdml0eSwgT05fUkVTVU1FKSwKKyAgICAgICAgICAgICAgICBzdGF0ZShmaXJzdEFjdGl2aXR5LCBPTl9QQVVTRSkpOworCisgICAgICAgIC8vIEFzc2VydCB0aGF0IHRoZSBmdWxsc2NyZWVuIGFjdGl2aXR5IHdhcyBub3Qgc3RvcHBlZCBhbmQgaXMgaW4gdGhlIHBhdXNlZCBzdGF0ZS4KKyAgICAgICAgTGlmZWN5Y2xlVmVyaWZpZXIuYXNzZXJ0TGF1bmNoQW5kUGF1c2VTZXF1ZW5jZShGaXJzdEFjdGl2aXR5LmNsYXNzLCBnZXRMaWZlY3ljbGVMb2coKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGF1c2VkV2hlblJldHVybmluZ1dpdGhUcmFuc2x1Y2VudE9uVG9wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIExhdW5jaCBmdWxsc2NyZWVuIGFjdGl2aXR5CisgICAgICAgIGZpbmFsIEFjdGl2aXR5IGZpcnN0QWN0aXZpdHkgPQorICAgICAgICAgICAgICAgIG1GaXJzdEFjdGl2aXR5VGVzdFJ1bGUubGF1bmNoQWN0aXZpdHkobmV3IEludGVudCgpKTsKKworICAgICAgICAvLyBMYXVuY2ggdHJhbnNsdWNlbnQgYWN0aXZpdHkKKyAgICAgICAgZmluYWwgQWN0aXZpdHkgdHJhbnNsdWNlbnRBY3Rpdml0eSA9CisgICAgICAgICAgICAgICAgbVRyYW5zbHVjZW50QWN0aXZpdHlUZXN0UnVsZS5sYXVuY2hBY3Rpdml0eShuZXcgSW50ZW50KCkpOworCisgICAgICAgIC8vIExhdW5jaCBhbm90aGVyIGZ1bGxzY3JlZW4gYWN0aXZpdHkKKyAgICAgICAgZmluYWwgQWN0aXZpdHkgc2Vjb25kQWN0aXZpdHkgPQorICAgICAgICAgICAgICAgIG1TZWNvbmRBY3Rpdml0eVRlc3RSdWxlLmxhdW5jaEFjdGl2aXR5KG5ldyBJbnRlbnQoKSk7CisKKyAgICAgICAgLy8gV2FpdCBmb3IgdG9wIGFjdGl2aXR5IHRvIHJlc3VtZQorICAgICAgICB3YWl0QW5kQXNzZXJ0QWN0aXZpdHlTdGF0ZXMoc3RhdGUoc2Vjb25kQWN0aXZpdHksIE9OX1JFU1VNRSksCisgICAgICAgICAgICAgICAgb2NjbHVkZWRBY3Rpdml0eVN0YXRlKHRyYW5zbHVjZW50QWN0aXZpdHksIHNlY29uZEFjdGl2aXR5KSwKKyAgICAgICAgICAgICAgICBvY2NsdWRlZEFjdGl2aXR5U3RhdGUoZmlyc3RBY3Rpdml0eSwgc2Vjb25kQWN0aXZpdHkpKTsKKworICAgICAgICBnZXRMaWZlY3ljbGVMb2coKS5jbGVhcigpOworCisgICAgICAgIGZpbmFsIGJvb2xlYW4gc2Vjb25kQWN0aXZpdHlJc1RyYW5zbHVjZW50ID0gQWN0aXZpdHlJbmZvLmlzVHJhbnNsdWNlbnRPckZsb2F0aW5nKAorICAgICAgICAgICAgICAgIHNlY29uZEFjdGl2aXR5LmdldFdpbmRvdygpLmdldFdpbmRvd1N0eWxlKCkpOworCisgICAgICAgIC8vIEZpbmlzaCB0b3AgYWN0aXZpdHkKKyAgICAgICAgbVNlY29uZEFjdGl2aXR5VGVzdFJ1bGUuZmluaXNoQWN0aXZpdHkoKTsKKworICAgICAgICBpZiAoc2Vjb25kQWN0aXZpdHlJc1RyYW5zbHVjZW50KSB7CisgICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2Ugd2UgZG9uJ3QgZXhwZWN0IHRoZSBzdGF0ZSBvZiB0aGUgZmlyc3RBY3Rpdml0eSB0byBjaGFuZ2Ugc2luY2UgaXQgaXMKKyAgICAgICAgICAgIC8vIGFscmVhZHkgaW4gdGhlIHZpc2libGUgcGF1c2VkIHN0YXRlLiBTbywgd2UganVzdCB2ZXJpZnkgdGhhdCB0cmFuc2x1Y2VudEFjdGl2aXR5CisgICAgICAgICAgICAvLyB0cmFuc2l0aW9ucyB0byByZXN1bWVkIHN0YXRlLgorICAgICAgICAgICAgd2FpdEFuZEFzc2VydEFjdGl2aXR5U3RhdGVzKHN0YXRlKHRyYW5zbHVjZW50QWN0aXZpdHksIE9OX1JFU1VNRSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gV2FpdCBmb3IgdHJhbnNsdWNlbnQgYWN0aXZpdHkgdG8gcmVzdW1lCisgICAgICAgICAgICB3YWl0QW5kQXNzZXJ0QWN0aXZpdHlTdGF0ZXMoc3RhdGUodHJhbnNsdWNlbnRBY3Rpdml0eSwgT05fUkVTVU1FKSwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUoZmlyc3RBY3Rpdml0eSwgT05fU1RBUlQpKTsKKworICAgICAgICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGZpcnN0IGFjdGl2aXR5IHdhcyByZXN0YXJ0ZWQKKyAgICAgICAgICAgIExpZmVjeWNsZVZlcmlmaWVyLmFzc2VydFJlc3RhcnRTZXF1ZW5jZShGaXJzdEFjdGl2aXR5LmNsYXNzLCBnZXRMaWZlY3ljbGVMb2coKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXVzZWRXaGVuUmVjcmVhdGVkRnJvbUluTm9uRm9jdXNlZFN0YWNrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghc3VwcG9ydHNTcGxpdFNjcmVlbk11bHRpV2luZG93KCkpIHsKKyAgICAgICAgICAgIC8vIFNraXBwaW5nIHRlc3Q6IG5vIHNwbGl0IG11bHRpLXdpbmRvdyBzdXBwb3J0CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBMYXVuY2ggZmlyc3QgYWN0aXZpdHkKKyAgICAgICAgZmluYWwgQWN0aXZpdHkgZmlyc3RBY3Rpdml0eSA9CisgICAgICAgICAgICAgICAgbUZpcnN0QWN0aXZpdHlUZXN0UnVsZS5sYXVuY2hBY3Rpdml0eShuZXcgSW50ZW50KCkpOworCisgICAgICAgIC8vIExhdW5jaCBzZWNvbmQgYWN0aXZpdHkgdG8gc3RvcCBmaXJzdAorICAgICAgICBmaW5hbCBBY3Rpdml0eSBzZWNvbmRBY3Rpdml0eSA9CisgICAgICAgICAgICAgICAgbVNlY29uZEFjdGl2aXR5VGVzdFJ1bGUubGF1bmNoQWN0aXZpdHkobmV3IEludGVudCgpKTsKKworICAgICAgICAvLyBXYWl0IGZvciBzZWNvbmQgYWN0aXZpdHkgdG8gcmVzdW1lLiBXZSBtdXN0IGFsc28gd2FpdCBmb3IgdGhlIGZpcnN0IGFjdGl2aXR5IHRvIHN0b3AKKyAgICAgICAgLy8gc28gdGhhdCB0aGlzIGV2ZW50IGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgbG9ncy4KKyAgICAgICAgd2FpdEFuZEFzc2VydEFjdGl2aXR5U3RhdGVzKHN0YXRlKHNlY29uZEFjdGl2aXR5LCBPTl9SRVNVTUUpLAorICAgICAgICAgICAgICAgIHN0YXRlKGZpcnN0QWN0aXZpdHksIE9OX1NUT1ApKTsKKworICAgICAgICAvLyBFbnRlciBzcGxpdCBzY3JlZW4KKyAgICAgICAgbW92ZVRhc2tUb1ByaW1hcnlTcGxpdFNjcmVlbihzZWNvbmRBY3Rpdml0eS5nZXRUYXNrSWQoKSk7CisKKyAgICAgICAgLy8gQ0xlYXIgbG9ncyBzbyB3ZSBjYW4gY2FwdHVyZSBqdXN0IHRoZSBkZXN0cm95IHNlcXVlbmNlCisgICAgICAgIGdldExpZmVjeWNsZUxvZygpLmNsZWFyKCk7CisKKyAgICAgICAgLy8gU3RhcnQgYW4gYWN0aXZpdHkgaW4gc2VwYXJhdGUgdGFzayAod2lsbCBiZSBwbGFjZWQgaW4gc2Vjb25kYXJ5IHN0YWNrKQorICAgICAgICBnZXRMYXVuY2hBY3Rpdml0eUJ1aWxkZXIoKS5leGVjdXRlKCk7CisKKyAgICAgICAgLy8gRmluaXNoIHRvcCBhY3Rpdml0eQorICAgICAgICBzZWNvbmRBY3Rpdml0eS5maW5pc2goKTsKKworICAgICAgICB3YWl0QW5kQXNzZXJ0QWN0aXZpdHlTdGF0ZXMoc3RhdGUoZmlyc3RBY3Rpdml0eSwgT05fUEFVU0UpKTsKKworICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgZmlyc3QgYWN0aXZpdHkgd2FzIHJlY3JlYXRlZCB0byBwYXVzZSBhcyBpdCB3YXMgY3JlYXRlZCBiZWZvcmUKKyAgICAgICAgLy8gd2luZG93aW5nIG1vZGUgd2FzIHN3aXRjaGVkCisgICAgICAgIExpZmVjeWNsZVZlcmlmaWVyLmFzc2VydFJlY3JlYXRlQW5kUGF1c2VTZXF1ZW5jZShGaXJzdEFjdGl2aXR5LmNsYXNzLCBnZXRMaWZlY3ljbGVMb2coKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzdWx0SW5Ob25Gb2N1c2VkU3RhY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFzdXBwb3J0c1NwbGl0U2NyZWVuTXVsdGlXaW5kb3coKSkgeworICAgICAgICAgICAgLy8gU2tpcHBpbmcgdGVzdDogbm8gc3BsaXQgbXVsdGktd2luZG93IHN1cHBvcnQKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIExhdW5jaCBmaXJzdCBhY3Rpdml0eQorICAgICAgICBmaW5hbCBBY3Rpdml0eSBjYWxsYmFja1RyYWNraW5nQWN0aXZpdHkgPQorICAgICAgICAgICAgICAgIG1DYWxsYmFja1RyYWNraW5nQWN0aXZpdHlUZXN0UnVsZS5sYXVuY2hBY3Rpdml0eShuZXcgSW50ZW50KCkpOworCisgICAgICAgIC8vIFdhaXQgZm9yIGZpcnN0IGFjdGl2aXR5IHRvIHJlc3VtZQorICAgICAgICB3YWl0QW5kQXNzZXJ0QWN0aXZpdHlTdGF0ZXMoc3RhdGUoY2FsbGJhY2tUcmFja2luZ0FjdGl2aXR5LCBPTl9SRVNVTUUpKTsKKworICAgICAgICAvLyBFbnRlciBzcGxpdCBzY3JlZW4KKyAgICAgICAgbW92ZVRhc2tUb1ByaW1hcnlTcGxpdFNjcmVlbihjYWxsYmFja1RyYWNraW5nQWN0aXZpdHkuZ2V0VGFza0lkKCksCisgICAgICAgICAgICAgICAgdHJ1ZSAvKiBsYXVuY2hTaWRlQWN0aXZpdHlJZk5lZWRlZCAqLyk7CisKKyAgICAgICAgLy8gTGF1bmNoIHNlY29uZCBhY3Rpdml0eSB0byBwYXVzZSBmaXJzdAorICAgICAgICAvLyBDcmVhdGUgYW4gQWN0aXZpdHlNb25pdG9yIHRoYXQgY2F0Y2ggQ2hpbGRBY3Rpdml0eSBhbmQgcmV0dXJuIG1vY2sgQWN0aXZpdHlSZXN1bHQ6CisgICAgICAgIEFjdGl2aXR5TW9uaXRvciBhY3Rpdml0eU1vbml0b3IgPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKQorICAgICAgICAgICAgICAgIC5hZGRNb25pdG9yKFNlY29uZEFjdGl2aXR5LmNsYXNzLmdldE5hbWUoKSwgbnVsbCAvKiBhY3Rpdml0eVJlc3VsdCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGJsb2NrICovKTsKKworICAgICAgICBjYWxsYmFja1RyYWNraW5nQWN0aXZpdHkuc3RhcnRBY3Rpdml0eUZvclJlc3VsdCgKKyAgICAgICAgICAgICAgICBuZXcgSW50ZW50KGNhbGxiYWNrVHJhY2tpbmdBY3Rpdml0eSwgU2Vjb25kQWN0aXZpdHkuY2xhc3MpLCAxIC8qIHJlcXVlc3RDb2RlICovKTsKKworICAgICAgICAvLyBXYWl0IGZvciB0aGUgQWN0aXZpdHlNb25pdG9yIHRvIGJlIGhpdAorICAgICAgICBmaW5hbCBBY3Rpdml0eSBzZWNvbmRBY3Rpdml0eSA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpCisgICAgICAgICAgICAgICAgLndhaXRGb3JNb25pdG9yV2l0aFRpbWVvdXQoYWN0aXZpdHlNb25pdG9yLCA1ICogMTAwMCk7CisKKyAgICAgICAgLy8gV2FpdCBmb3Igc2Vjb25kIGFjdGl2aXR5IHRvIHJlc3VtZQorICAgICAgICBhc3NlcnROb3ROdWxsKCJTZWNvbmQgYWN0aXZpdHkgc2hvdWxkIGJlIHN0YXJ0ZWQiLCBzZWNvbmRBY3Rpdml0eSk7CisgICAgICAgIHdhaXRBbmRBc3NlcnRBY3Rpdml0eVN0YXRlcyhzdGF0ZShzZWNvbmRBY3Rpdml0eSwgT05fUkVTVU1FKSk7CisKKyAgICAgICAgLy8gU3RhcnQgYW4gYWN0aXZpdHkgaW4gc2VwYXJhdGUgdGFzayAod2lsbCBiZSBwbGFjZWQgaW4gc2Vjb25kYXJ5IHN0YWNrKQorICAgICAgICBnZXRMYXVuY2hBY3Rpdml0eUJ1aWxkZXIoKS5leGVjdXRlKCk7CisKKyAgICAgICAgd2FpdEFuZEFzc2VydEFjdGl2aXR5U3RhdGVzKHN0YXRlKHNlY29uZEFjdGl2aXR5LCBPTl9QQVVTRSkpOworICAgICAgICB3YWl0QW5kQXNzZXJ0QWN0aXZpdHlTdGF0ZXMoc3RhdGUoY2FsbGJhY2tUcmFja2luZ0FjdGl2aXR5LCBPTl9TVE9QKSk7CisKKyAgICAgICAgLy8gRmluaXNoIHRvcCBhY3Rpdml0eSBhbmQgdmVyaWZ5IHRoYXQgYWN0aXZpdHkgYmVsb3cgYmVjYW1lIGZvY3VzZWQuCisgICAgICAgIGdldExpZmVjeWNsZUxvZygpLmNsZWFyKCk7CisgICAgICAgIHNlY29uZEFjdGl2aXR5LnNldFJlc3VsdChBY3Rpdml0eS5SRVNVTFRfT0spOworICAgICAgICBzZWNvbmRBY3Rpdml0eS5maW5pc2goKTsKKworICAgICAgICB3YWl0QW5kQXNzZXJ0QWN0aXZpdHlTdGF0ZXMoc3RhdGUoY2FsbGJhY2tUcmFja2luZ0FjdGl2aXR5LCBPTl9TVEFSVCkpOworICAgICAgICBMaWZlY3ljbGVWZXJpZmllci5hc3NlcnRSZXN0YXJ0U2VxdWVuY2UoQ2FsbGJhY2tUcmFja2luZ0FjdGl2aXR5LmNsYXNzLCBnZXRMaWZlY3ljbGVMb2coKSk7CisKKyAgICAgICAgLy8gQnJpbmcgdGhlIGZpcnN0IGFjdGl2aXR5IHRvIGZyb250IHRvIHZlcmlmeSB0aGF0IGl0IHJlY2VpdmVzIHRoZSByZXN1bHQuCisgICAgICAgIGdldExpZmVjeWNsZUxvZygpLmNsZWFyKCk7CisgICAgICAgIGZpbmFsIEludGVudCBzaW5nbGVUb3BJbnRlbnQgPSBuZXcgSW50ZW50KEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldFRhcmdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICBDYWxsYmFja1RyYWNraW5nQWN0aXZpdHkuY2xhc3MpOworICAgICAgICBzaW5nbGVUb3BJbnRlbnQuc2V0RmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfU0lOR0xFX1RPUCB8IEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLKTsKKyAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0VGFyZ2V0Q29udGV4dCgpLnN0YXJ0QWN0aXZpdHkoc2luZ2xlVG9wSW50ZW50KTsKKworICAgICAgICB3YWl0QW5kQXNzZXJ0QWN0aXZpdHlTdGF0ZXMoc3RhdGUoY2FsbGJhY2tUcmFja2luZ0FjdGl2aXR5LCBPTl9SRVNVTUUpKTsKKyAgICAgICAgTGlmZWN5Y2xlVmVyaWZpZXIuYXNzZXJ0U2VxdWVuY2UoQ2FsbGJhY2tUcmFja2luZ0FjdGl2aXR5LmNsYXNzLCBnZXRMaWZlY3ljbGVMb2coKSwKKyAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KE9OX0FDVElWSVRZX1JFU1VMVCwgT05fTkVXX0lOVEVOVCwgT05fUkVTVU1FKSwgImJyaW5nIHRvIGZyb250Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGF1c2VkV2hlblJlc3RhcnRlZEZyb21Jbk5vbkZvY3VzZWRTdGFjaygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIXN1cHBvcnRzU3BsaXRTY3JlZW5NdWx0aVdpbmRvdygpKSB7CisgICAgICAgICAgICAvLyBTa2lwcGluZyB0ZXN0OiBubyBzcGxpdCBtdWx0aS13aW5kb3cgc3VwcG9ydAorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gTGF1bmNoIGZpcnN0IGFjdGl2aXR5CisgICAgICAgIGZpbmFsIEFjdGl2aXR5IGZpcnN0QWN0aXZpdHkgPQorICAgICAgICAgICAgICAgIG1GaXJzdEFjdGl2aXR5VGVzdFJ1bGUubGF1bmNoQWN0aXZpdHkobmV3IEludGVudCgpKTsKKworICAgICAgICAvLyBXYWl0IGZvciBmaXJzdCBhY3Rpdml0eSB0byByZXN1bWUKKyAgICAgICAgd2FpdEFuZEFzc2VydEFjdGl2aXR5U3RhdGVzKHN0YXRlKGZpcnN0QWN0aXZpdHksIE9OX1JFU1VNRSkpOworCisgICAgICAgIC8vIEVudGVyIHNwbGl0IHNjcmVlbgorICAgICAgICBtb3ZlVGFza1RvUHJpbWFyeVNwbGl0U2NyZWVuKGZpcnN0QWN0aXZpdHkuZ2V0VGFza0lkKCksCisgICAgICAgICAgICAgICAgdHJ1ZSAvKiBsYXVuY2hTaWRlQWN0aXZpdHlJZk5lZWRlZCAqLyk7CisKKyAgICAgICAgLy8gTGF1bmNoIHNlY29uZCBhY3Rpdml0eSB0byBwYXVzZSBmaXJzdAorICAgICAgICBmaW5hbCBBY3Rpdml0eSBzZWNvbmRBY3Rpdml0eSA9CisgICAgICAgICAgICAgICAgbVNlY29uZEFjdGl2aXR5VGVzdFJ1bGUubGF1bmNoQWN0aXZpdHkobmV3IEludGVudCgpKTsKKworICAgICAgICAvLyBXYWl0IGZvciBzZWNvbmQgYWN0aXZpdHkgdG8gcmVzdW1lCisgICAgICAgIHdhaXRBbmRBc3NlcnRBY3Rpdml0eVN0YXRlcyhzdGF0ZShzZWNvbmRBY3Rpdml0eSwgT05fUkVTVU1FKSk7CisKKyAgICAgICAgLy8gU3RhcnQgYW4gYWN0aXZpdHkgaW4gc2VwYXJhdGUgdGFzayAod2lsbCBiZSBwbGFjZWQgaW4gc2Vjb25kYXJ5IHN0YWNrKQorICAgICAgICBnZXRMYXVuY2hBY3Rpdml0eUJ1aWxkZXIoKS5leGVjdXRlKCk7CisKKyAgICAgICAgd2FpdEFuZEFzc2VydEFjdGl2aXR5U3RhdGVzKHN0YXRlKHNlY29uZEFjdGl2aXR5LCBPTl9QQVVTRSkpOworICAgICAgICB3YWl0QW5kQXNzZXJ0QWN0aXZpdHlTdGF0ZXMoc3RhdGUoZmlyc3RBY3Rpdml0eSwgT05fU1RPUCkpOworICAgICAgICBnZXRMaWZlY3ljbGVMb2coKS5jbGVhcigpOworCisgICAgICAgIC8vIEZpbmlzaCB0b3AgYWN0aXZpdHkKKyAgICAgICAgc2Vjb25kQWN0aXZpdHkuZmluaXNoKCk7CisKKyAgICAgICAgd2FpdEFuZEFzc2VydEFjdGl2aXR5U3RhdGVzKHN0YXRlKGZpcnN0QWN0aXZpdHksIE9OX1BBVVNFKSk7CisKKyAgICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGZpcnN0IGFjdGl2aXR5IHdhcyByZXN0YXJ0ZWQgdG8gcGF1c2UgYXMgaXQgd2FzIGJyb3VnaHQgYmFjayBhZnRlcgorICAgICAgICAvLyB3aW5kb3dpbmcgbW9kZSB3YXMgc3dpdGNoZWQKKyAgICAgICAgTGlmZWN5Y2xlVmVyaWZpZXIuYXNzZXJ0UmVzdGFydEFuZFBhdXNlU2VxdWVuY2UoRmlyc3RBY3Rpdml0eS5jbGFzcywgZ2V0TGlmZWN5Y2xlTG9nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9uQWN0aXZpdHlSZXN1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKEVYVFJBX0ZJTklTSF9JTl9PTl9SRVNVTUUsIHRydWUpOworICAgICAgICBtTGF1bmNoRm9yUmVzdWx0QWN0aXZpdHlUZXN0UnVsZS5sYXVuY2hBY3Rpdml0eShpbnRlbnQpOworCisgICAgICAgIGZpbmFsIExpc3Q8TGlmZWN5Y2xlTG9nLkFjdGl2aXR5Q2FsbGJhY2s+IGV4cGVjdGVkU2VxdWVuY2UgPQorICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoUFJFX09OX0NSRUFURSwgT05fQ1JFQVRFLCBPTl9TVEFSVCwgT05fUE9TVF9DUkVBVEUsIE9OX1JFU1VNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9OX1BBVVNFLCBPTl9BQ1RJVklUWV9SRVNVTFQsIE9OX1JFU1VNRSk7CisgICAgICAgIHdhaXRGb3JBY3Rpdml0eVRyYW5zaXRpb25zKExhdW5jaEZvclJlc3VsdEFjdGl2aXR5LmNsYXNzLCBleHBlY3RlZFNlcXVlbmNlKTsKKworICAgICAgICAvLyBUT0RPKGIvNzkyMTgwMjMpOiBGaXJzdCBhY3Rpdml0eSBtaWdodCBhbHNvIGJlIHN0b3BwZWQgYmVmb3JlIGdldHRpbmcgcmVzdWx0LgorICAgICAgICBmaW5hbCBMaXN0PExpZmVjeWNsZUxvZy5BY3Rpdml0eUNhbGxiYWNrPiBzZXF1ZW5jZVdpdGhTdG9wID0KKyAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KFBSRV9PTl9DUkVBVEUsIE9OX0NSRUFURSwgT05fU1RBUlQsIE9OX1BPU1RfQ1JFQVRFLCBPTl9SRVNVTUUsCisgICAgICAgICAgICAgICAgICAgICAgICBPTl9QQVVTRSwgT05fU1RPUCwgT05fQUNUSVZJVFlfUkVTVUxULCBPTl9SRVNUQVJULCBPTl9TVEFSVCwgT05fUkVTVU1FKTsKKyAgICAgICAgTGlmZWN5Y2xlVmVyaWZpZXIuYXNzZXJ0U2VxdWVuY2VNYXRjaGVzT25lT2YoTGF1bmNoRm9yUmVzdWx0QWN0aXZpdHkuY2xhc3MsCisgICAgICAgICAgICAgICAgZ2V0TGlmZWN5Y2xlTG9nKCksIEFycmF5cy5hc0xpc3QoZXhwZWN0ZWRTZXF1ZW5jZSwgc2VxdWVuY2VXaXRoU3RvcCksCisgICAgICAgICAgICAgICAgImFjdGl2aXR5UmVzdWx0Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25BY3Rpdml0eVJlc3VsdEFmdGVyU3RvcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoRVhUUkFfRklOSVNIX0FGVEVSX1JFU1VNRSwgdHJ1ZSk7CisgICAgICAgIG1MYXVuY2hGb3JSZXN1bHRBY3Rpdml0eVRlc3RSdWxlLmxhdW5jaEFjdGl2aXR5KGludGVudCk7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNUcmFuc2x1Y2VudCA9IGlzVHJhbnNsdWNlbnQobUxhdW5jaEZvclJlc3VsdEFjdGl2aXR5VGVzdFJ1bGUuZ2V0QWN0aXZpdHkoKSk7CisKKyAgICAgICAgZmluYWwgTGlzdDxMaWZlY3ljbGVMb2cuQWN0aXZpdHlDYWxsYmFjaz4gZXhwZWN0ZWRTZXF1ZW5jZTsKKyAgICAgICAgaWYgKGlzVHJhbnNsdWNlbnQpIHsKKyAgICAgICAgICAgIGV4cGVjdGVkU2VxdWVuY2UgPSBBcnJheXMuYXNMaXN0KFBSRV9PTl9DUkVBVEUsIE9OX0NSRUFURSwgT05fU1RBUlQsIE9OX1BPU1RfQ1JFQVRFLAorICAgICAgICAgICAgICAgICAgICBPTl9SRVNVTUUsIE9OX1BBVVNFLCBPTl9BQ1RJVklUWV9SRVNVTFQsIE9OX1JFU1VNRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBleHBlY3RlZFNlcXVlbmNlID0gQXJyYXlzLmFzTGlzdChQUkVfT05fQ1JFQVRFLCBPTl9DUkVBVEUsIE9OX1NUQVJULCBPTl9QT1NUX0NSRUFURSwKKyAgICAgICAgICAgICAgICAgICAgT05fUkVTVU1FLCBPTl9QQVVTRSwgT05fU1RPUCwgT05fQUNUSVZJVFlfUkVTVUxULCBPTl9SRVNUQVJULCBPTl9TVEFSVCwKKyAgICAgICAgICAgICAgICAgICAgT05fUkVTVU1FKTsKKyAgICAgICAgfQorICAgICAgICB3YWl0Rm9yQWN0aXZpdHlUcmFuc2l0aW9ucyhMYXVuY2hGb3JSZXN1bHRBY3Rpdml0eS5jbGFzcywgZXhwZWN0ZWRTZXF1ZW5jZSk7CisKKyAgICAgICAgTGlmZWN5Y2xlVmVyaWZpZXIuYXNzZXJ0U2VxdWVuY2UoTGF1bmNoRm9yUmVzdWx0QWN0aXZpdHkuY2xhc3MsCisgICAgICAgICAgICAgICAgZ2V0TGlmZWN5Y2xlTG9nKCksIGV4cGVjdGVkU2VxdWVuY2UsICJhY3Rpdml0eVJlc3VsdCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9uUG9zdENyZWF0ZUFmdGVyQ3JlYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEFjdGl2aXR5IGNhbGxiYWNrVHJhY2tpbmdBY3Rpdml0eSA9CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrVHJhY2tpbmdBY3Rpdml0eVRlc3RSdWxlLmxhdW5jaEFjdGl2aXR5KG5ldyBJbnRlbnQoKSk7CisKKyAgICAgICAgd2FpdEFuZEFzc2VydEFjdGl2aXR5U3RhdGVzKHN0YXRlKGNhbGxiYWNrVHJhY2tpbmdBY3Rpdml0eSwgT05fUkVTVU1FKSk7CisKKyAgICAgICAgTGlmZWN5Y2xlVmVyaWZpZXIuYXNzZXJ0U2VxdWVuY2UoQ2FsbGJhY2tUcmFja2luZ0FjdGl2aXR5LmNsYXNzLAorICAgICAgICAgICAgICAgIGdldExpZmVjeWNsZUxvZygpLAorICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoUFJFX09OX0NSRUFURSwgT05fQ1JFQVRFLCBPTl9TVEFSVCwgT05fUE9TVF9DUkVBVEUsIE9OX1JFU1VNRSksCisgICAgICAgICAgICAgICAgImNyZWF0ZSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9uUG9zdENyZWF0ZUFmdGVyUmVjcmVhdGVJbk9uUmVzdW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIExhdW5jaCBhY3Rpdml0eQorICAgICAgICBmaW5hbCBBY3Rpdml0eSB0cmFja2luZ0FjdGl2aXR5ID0KKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2tUcmFja2luZ0FjdGl2aXR5VGVzdFJ1bGUubGF1bmNoQWN0aXZpdHkobmV3IEludGVudCgpKTsKKworICAgICAgICAvLyBXYWl0IGZvciBhY3Rpdml0eSB0byByZXN1bWUKKyAgICAgICAgd2FpdEFuZEFzc2VydEFjdGl2aXR5U3RhdGVzKHN0YXRlKHRyYWNraW5nQWN0aXZpdHksIE9OX1JFU1VNRSkpOworCisgICAgICAgIC8vIENhbGwgInJlY3JlYXRlIiBhbmQgYXNzZXJ0IHNlcXVlbmNlCisgICAgICAgIGdldExpZmVjeWNsZUxvZygpLmNsZWFyKCk7CisgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLnJ1bk9uTWFpblN5bmModHJhY2tpbmdBY3Rpdml0eTo6cmVjcmVhdGUpOworICAgICAgICB3YWl0QW5kQXNzZXJ0QWN0aXZpdHlTdGF0ZXMoc3RhdGUodHJhY2tpbmdBY3Rpdml0eSwgT05fUkVTVU1FKSk7CisKKyAgICAgICAgTGlmZWN5Y2xlVmVyaWZpZXIuYXNzZXJ0U2VxdWVuY2UoQ2FsbGJhY2tUcmFja2luZ0FjdGl2aXR5LmNsYXNzLAorICAgICAgICAgICAgICAgIGdldExpZmVjeWNsZUxvZygpLAorICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoT05fUEFVU0UsIE9OX1NUT1AsIE9OX0RFU1RST1ksIFBSRV9PTl9DUkVBVEUsIE9OX0NSRUFURSwgT05fU1RBUlQsCisgICAgICAgICAgICAgICAgICAgICAgICBPTl9QT1NUX0NSRUFURSwgT05fUkVTVU1FKSwKKyAgICAgICAgICAgICAgICAicmVjcmVhdGUiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPblBvc3RDcmVhdGVBZnRlclJlY3JlYXRlSW5PblBhdXNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIExhdW5jaCBhY3Rpdml0eQorICAgICAgICBmaW5hbCBBY3Rpdml0eSB0cmFja2luZ0FjdGl2aXR5ID0KKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2tUcmFja2luZ0FjdGl2aXR5VGVzdFJ1bGUubGF1bmNoQWN0aXZpdHkobmV3IEludGVudCgpKTsKKworICAgICAgICAvLyBXYWl0IGZvciBhY3Rpdml0eSB0byByZXN1bWUKKyAgICAgICAgd2FpdEFuZEFzc2VydEFjdGl2aXR5U3RhdGVzKHN0YXRlKHRyYWNraW5nQWN0aXZpdHksIE9OX1JFU1VNRSkpOworCisgICAgICAgIC8vIExhdW5jaCB0cmFuc2x1Y2VudCBhY3Rpdml0eSwgd2hpY2ggd2lsbCBtYWtlIHRoZSBmaXJzdCBvbmUgcGF1c2VkLgorICAgICAgICBtVHJhbnNsdWNlbnRBY3Rpdml0eVRlc3RSdWxlLmxhdW5jaEFjdGl2aXR5KG5ldyBJbnRlbnQoKSk7CisKKyAgICAgICAgLy8gV2FpdCBmb3IgZmlyc3QgYWN0aXZpdHkgdG8gYmVjb21lIHBhdXNlZAorICAgICAgICB3YWl0QW5kQXNzZXJ0QWN0aXZpdHlTdGF0ZXMoc3RhdGUodHJhY2tpbmdBY3Rpdml0eSwgT05fUEFVU0UpKTsKKworICAgICAgICAvLyBDYWxsICJyZWNyZWF0ZSIgYW5kIGFzc2VydCBzZXF1ZW5jZQorICAgICAgICBnZXRMaWZlY3ljbGVMb2coKS5jbGVhcigpOworICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKS5ydW5Pbk1haW5TeW5jKHRyYWNraW5nQWN0aXZpdHk6OnJlY3JlYXRlKTsKKyAgICAgICAgd2FpdEFuZEFzc2VydEFjdGl2aXR5U3RhdGVzKHN0YXRlKHRyYWNraW5nQWN0aXZpdHksIE9OX1BBVVNFKSk7CisKKyAgICAgICAgTGlmZWN5Y2xlVmVyaWZpZXIuYXNzZXJ0U2VxdWVuY2UoQ2FsbGJhY2tUcmFja2luZ0FjdGl2aXR5LmNsYXNzLAorICAgICAgICAgICAgICAgIGdldExpZmVjeWNsZUxvZygpLAorICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoT05fU1RPUCwgT05fREVTVFJPWSwgUFJFX09OX0NSRUFURSwgT05fQ1JFQVRFLCBPTl9TVEFSVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9OX1BPU1RfQ1JFQVRFLCBPTl9SRVNVTUUsIE9OX1BBVVNFKSwKKyAgICAgICAgICAgICAgICAicmVjcmVhdGUiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPblBvc3RDcmVhdGVBZnRlclJlY3JlYXRlSW5PblN0b3AoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gTGF1bmNoIGZpcnN0IGFjdGl2aXR5CisgICAgICAgIGZpbmFsIEFjdGl2aXR5IHRyYWNraW5nQWN0aXZpdHkgPQorICAgICAgICAgICAgICAgIG1DYWxsYmFja1RyYWNraW5nQWN0aXZpdHlUZXN0UnVsZS5sYXVuY2hBY3Rpdml0eShuZXcgSW50ZW50KCkpOworCisgICAgICAgIC8vIFdhaXQgZm9yIGFjdGl2aXR5IHRvIHJlc3VtZQorICAgICAgICB3YWl0QW5kQXNzZXJ0QWN0aXZpdHlTdGF0ZXMoc3RhdGUodHJhY2tpbmdBY3Rpdml0eSwgT05fUkVTVU1FKSk7CisKKyAgICAgICAgLy8gTGF1bmNoIHNlY29uZCBhY3Rpdml0eSB0byBjb3ZlciBhbmQgc3RvcCBmaXJzdAorICAgICAgICBmaW5hbCBBY3Rpdml0eSBzZWNvbmRBY3Rpdml0eSA9CisgICAgICAgICAgICAgICAgbVNlY29uZEFjdGl2aXR5VGVzdFJ1bGUubGF1bmNoQWN0aXZpdHkobmV3IEludGVudCgpKTsKKworICAgICAgICAvLyBXYWl0IGZvciBzZWNvbmQgYWN0aXZpdHkgdG8gYmVjb21lIHJlc3VtZWQKKyAgICAgICAgd2FpdEFuZEFzc2VydEFjdGl2aXR5U3RhdGVzKHN0YXRlKHNlY29uZEFjdGl2aXR5LCBPTl9SRVNVTUUpKTsKKworICAgICAgICAvLyBXYWl0IGZvciBmaXJzdCBhY3Rpdml0eSB0byBiZWNvbWUgc3RvcHBlZAorICAgICAgICB3YWl0QW5kQXNzZXJ0QWN0aXZpdHlTdGF0ZXMob2NjbHVkZWRBY3Rpdml0eVN0YXRlKHRyYWNraW5nQWN0aXZpdHksIHNlY29uZEFjdGl2aXR5KSk7CisKKyAgICAgICAgLy8gQ2FsbCAicmVjcmVhdGUiIGFuZCBhc3NlcnQgc2VxdWVuY2UKKyAgICAgICAgZ2V0TGlmZWN5Y2xlTG9nKCkuY2xlYXIoKTsKKyAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkucnVuT25NYWluU3luYyh0cmFja2luZ0FjdGl2aXR5OjpyZWNyZWF0ZSk7CisgICAgICAgIHdhaXRBbmRBc3NlcnRBY3Rpdml0eVN0YXRlcyhvY2NsdWRlZEFjdGl2aXR5U3RhdGUodHJhY2tpbmdBY3Rpdml0eSwgc2Vjb25kQWN0aXZpdHkpKTsKKworICAgICAgICBmaW5hbCBMaXN0PExpZmVjeWNsZUxvZy5BY3Rpdml0eUNhbGxiYWNrPiBjYWxsYmFja3M7CisgICAgICAgIGlmIChpc1RyYW5zbHVjZW50KHNlY29uZEFjdGl2aXR5KSkgeworICAgICAgICAgICAgY2FsbGJhY2tzID0gQXJyYXlzLmFzTGlzdChPTl9TVE9QLCBPTl9ERVNUUk9ZLCBQUkVfT05fQ1JFQVRFLCBPTl9DUkVBVEUsIE9OX1NUQVJULAorICAgICAgICAgICAgICAgICAgICBPTl9QT1NUX0NSRUFURSwgT05fUkVTVU1FLCBPTl9QQVVTRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjYWxsYmFja3MgPSBBcnJheXMuYXNMaXN0KE9OX0RFU1RST1ksIFBSRV9PTl9DUkVBVEUsIE9OX0NSRUFURSwgT05fU1RBUlQsCisgICAgICAgICAgICAgICAgICAgIE9OX1BPU1RfQ1JFQVRFLCBPTl9SRVNVTUUsIE9OX1BBVVNFLCBPTl9TVE9QKTsKKyAgICAgICAgfQorCisgICAgICAgIExpZmVjeWNsZVZlcmlmaWVyLmFzc2VydFNlcXVlbmNlKAorICAgICAgICAgICAgICAgIENhbGxiYWNrVHJhY2tpbmdBY3Rpdml0eS5jbGFzcywgZ2V0TGlmZWN5Y2xlTG9nKCksIGNhbGxiYWNrcywgInJlY3JlYXRlIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGZvbGxvd2luZyB0ZXN0IGVuc3VyZXMgYW4gYWN0aXZpdHkgaXMgYnJvdWdodCBiYWNrIGlmIGl0cyBwcm9jZXNzIGlzIGVuZGVkIGluIHRoZQorICAgICAqIGJhY2tncm91bmQuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzdG9yZUZyb21LaWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIExhdW5jaEFjdGl2aXR5QnVpbGRlciBidWlsZGVyID0gZ2V0TGF1bmNoQWN0aXZpdHlCdWlsZGVyKCk7CisgICAgICAgIGZpbmFsIENvbXBvbmVudE5hbWUgdGFyZ2V0QWN0aXZpdHkgPSBidWlsZGVyLmdldFRhcmdldEFjdGl2aXR5KCk7CisKKyAgICAgICAgLy8gTGF1bmNoIGFjdGl2aXR5IHdob3NlIHByb2Nlc3Mgd2lsbCBiZSBraWxsZWQKKyAgICAgICAgYnVpbGRlci5leGVjdXRlKCk7CisKKyAgICAgICAgLy8gU3RhcnQgYWN0aXZpdHkgaW4gYW5vdGhlciBwcm9jZXNzIHRvIHB1dCBvcmlnaW5hbCBhY3Rpdml0eSBpbiBiYWNrZ3JvdW5kLgorICAgICAgICBtRmlyc3RBY3Rpdml0eVRlc3RSdWxlLmxhdW5jaEFjdGl2aXR5KG5ldyBJbnRlbnQoKSk7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNUcmFuc2x1Y2VudCA9IGlzVHJhbnNsdWNlbnQobUZpcnN0QWN0aXZpdHlUZXN0UnVsZS5nZXRBY3Rpdml0eSgpKTsKKyAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yQWN0aXZpdHlTdGF0ZSgKKyAgICAgICAgICAgICAgICB0YXJnZXRBY3Rpdml0eSwgaXNUcmFuc2x1Y2VudCA/IFNUQVRFX1BBVVNFRCA6IFNUQVRFX1NUT1BQRUQpOworCisgICAgICAgIC8vIE9ubHkgdHJ5IHRvIGtpbGwgdGFyZ2V0QWN0aXZpdHkgaWYgdGhlIHRvcCBhY3Rpdml0eSBpc24ndCB0cmFuc2x1Y2VudC4gSWYgdGhlIHRvcAorICAgICAgICAvLyBhY3Rpdml0eSBpcyB0cmFuc2x1Y2VudCB0aGVuIHRhcmdldEFjdGl2aXR5IHdpbGwgYmUgdmlzaWJsZSwgc28gdGhlIHByb2Nlc3Mgd2lsbCBiZQorICAgICAgICAvLyBzdGFydGVkIGFnYWluIHJlYWxseSBxdWlja2x5LgorICAgICAgICBpZiAoIWlzVHJhbnNsdWNlbnQpIHsKKyAgICAgICAgICAgIC8vIEtpbGwgZmlyc3QgYWN0aXZpdHkKKyAgICAgICAgICAgIEFtVXRpbHMucnVuS2lsbCh0YXJnZXRBY3Rpdml0eS5nZXRQYWNrYWdlTmFtZSgpLCB0cnVlIC8qIHdhaXQgKi8pOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmV0dXJuIGJhY2sgdG8gZmlyc3QgYWN0aXZpdHkKKyAgICAgICAgcHJlc3NCYWNrQnV0dG9uKCk7CisKKyAgICAgICAgLy8gVmVyaWZ5IGFjdGl2aXR5IGlzIHJlc3VtZWQKKyAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yVmFsaWRTdGF0ZSh0YXJnZXRBY3Rpdml0eSk7CisgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0UmVzdW1lZEFjdGl2aXR5KCJPcmlnaW5hbGx5IGxhdW5jaGVkIGFjdGl2aXR5IHNob3VsZCBiZSByZXN1bWVkIiwKKyAgICAgICAgICAgICAgICB0YXJnZXRBY3Rpdml0eSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHRoYXQgcmVjcmVhdGUgcmVxdWVzdCBmcm9tIGFuIGFjdGl2aXR5IGlzIGV4ZWN1dGVkIGltbWVkaWF0ZWx5LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvY2FsUmVjcmVhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gTGF1bmNoIHRoZSBhY3Rpdml0eSB0aGF0IHdpbGwgcmVjcmVhdGUgaXRzZWxmCisgICAgICAgIEFjdGl2aXR5IHJlY3JlYXRpbmdBY3Rpdml0eSA9IG1TaW5nbGVUb3BBY3Rpdml0eVRlc3RSdWxlLmxhdW5jaEFjdGl2aXR5KG5ldyBJbnRlbnQoKSk7CisKKyAgICAgICAgLy8gTGF1bmNoIHNlY29uZCBhY3Rpdml0eSB0byBjb3ZlciBhbmQgc3RvcCBmaXJzdAorICAgICAgICBmaW5hbCBMYXVuY2hBY3Rpdml0eUJ1aWxkZXIgbGF1bmNoQWN0aXZpdHlCdWlsZGVyID0gZ2V0TGF1bmNoQWN0aXZpdHlCdWlsZGVyKCk7CisgICAgICAgIGxhdW5jaEFjdGl2aXR5QnVpbGRlci5zZXROZXdUYXNrKHRydWUpLnNldE11bHRpcGxlVGFzayh0cnVlKS5leGVjdXRlKCk7CisKKyAgICAgICAgLy8gV2FpdCBmb3IgZmlyc3QgYWN0aXZpdHkgdG8gYmVjb21lIHN0b3BwZWQKKyAgICAgICAgd2FpdEFuZEFzc2VydEFjdGl2aXR5U3RhdGVzKG9jY2x1ZGVkQWN0aXZpdHlTdGF0ZShyZWNyZWF0aW5nQWN0aXZpdHksCisgICAgICAgICAgICAgICAgbGF1bmNoQWN0aXZpdHlCdWlsZGVyLmlzVGFyZ2V0QWN0aXZpdHlUcmFuc2x1Y2VudCgpKSk7CisKKyAgICAgICAgLy8gTGF1bmNoIHRoZSBhY3Rpdml0eSBhZ2FpbiB0byByZWNyZWF0ZQorICAgICAgICBnZXRMaWZlY3ljbGVMb2coKS5jbGVhcigpOworICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgU2luZ2xlVG9wQWN0aXZpdHkuY2xhc3MpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoRVhUUkFfUkVDUkVBVEUsIHRydWUpOworICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOworICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRUYXJnZXRDb250ZXh0KCkuc3RhcnRBY3Rpdml0eShpbnRlbnQpOworCisgICAgICAgIC8vIFdhaXQgZm9yIGFjdGl2aXR5IHRvIHJlbGF1bmNoIGFuZCByZXN1bWUKKyAgICAgICAgZmluYWwgTGlzdDxMaWZlY3ljbGVMb2cuQWN0aXZpdHlDYWxsYmFjaz4gZXhwZWN0ZWRSZWxhdW5jaFNlcXVlbmNlOworICAgICAgICBpZiAobGF1bmNoQWN0aXZpdHlCdWlsZGVyLmlzVGFyZ2V0QWN0aXZpdHlUcmFuc2x1Y2VudCgpKSB7CisgICAgICAgICAgICBleHBlY3RlZFJlbGF1bmNoU2VxdWVuY2UgPSBBcnJheXMuYXNMaXN0KE9OX05FV19JTlRFTlQsIE9OX1JFU1VNRSwgT05fUEFVU0UsIE9OX1NUT1AsCisgICAgICAgICAgICAgICAgICAgIE9OX0RFU1RST1ksIFBSRV9PTl9DUkVBVEUsIE9OX0NSRUFURSwgT05fU1RBUlQsIE9OX1BPU1RfQ1JFQVRFLCBPTl9SRVNVTUUsCisgICAgICAgICAgICAgICAgICAgIE9OX1BBVVNFLCBPTl9SRVNVTUUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZXhwZWN0ZWRSZWxhdW5jaFNlcXVlbmNlID0gQXJyYXlzLmFzTGlzdChPTl9ORVdfSU5URU5ULCBPTl9SRVNUQVJULCBPTl9TVEFSVCwgT05fUkVTVU1FLAorICAgICAgICAgICAgICAgICAgICBPTl9QQVVTRSwgT05fU1RPUCwgT05fREVTVFJPWSwgUFJFX09OX0NSRUFURSwgT05fQ1JFQVRFLCBPTl9TVEFSVCwKKyAgICAgICAgICAgICAgICAgICAgT05fUE9TVF9DUkVBVEUsIE9OX1JFU1VNRSk7CisgICAgICAgIH0KKworICAgICAgICB3YWl0Rm9yQWN0aXZpdHlUcmFuc2l0aW9ucyhTaW5nbGVUb3BBY3Rpdml0eS5jbGFzcywgZXhwZWN0ZWRSZWxhdW5jaFNlcXVlbmNlKTsKKyAgICAgICAgTGlmZWN5Y2xlVmVyaWZpZXIuYXNzZXJ0U2VxdWVuY2UoU2luZ2xlVG9wQWN0aXZpdHkuY2xhc3MsIGdldExpZmVjeWNsZUxvZygpLAorICAgICAgICAgICAgICAgIGV4cGVjdGVkUmVsYXVuY2hTZXF1ZW5jZSwgInJlY3JlYXRlIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25OZXdJbnRlbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gTGF1bmNoIGEgc2luZ2xlVG9wIGFjdGl2aXR5CisgICAgICAgIGZpbmFsIEFjdGl2aXR5IHNpbmdsZVRvcEFjdGl2aXR5ID0KKyAgICAgICAgICAgICAgICBtU2luZ2xlVG9wQWN0aXZpdHlUZXN0UnVsZS5sYXVuY2hBY3Rpdml0eShuZXcgSW50ZW50KCkpOworCisgICAgICAgIC8vIFdhaXQgZm9yIHRoZSBhY3Rpdml0eSB0byByZXN1bWUKKyAgICAgICAgd2FpdEFuZEFzc2VydEFjdGl2aXR5U3RhdGVzKHN0YXRlKHNpbmdsZVRvcEFjdGl2aXR5LCBPTl9SRVNVTUUpKTsKKyAgICAgICAgTGlmZWN5Y2xlVmVyaWZpZXIuYXNzZXJ0TGF1bmNoU2VxdWVuY2UoU2luZ2xlVG9wQWN0aXZpdHkuY2xhc3MsIGdldExpZmVjeWNsZUxvZygpLAorICAgICAgICAgICAgICAgIHRydWUgLyogaW5jbHVkZUNhbGxiYWNrcyAqLyk7CisKKyAgICAgICAgLy8gVHJ5IHRvIGxhdW5jaCBhZ2FpbgorICAgICAgICBnZXRMaWZlY3ljbGVMb2coKS5jbGVhcigpOworICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgU2luZ2xlVG9wQWN0aXZpdHkuY2xhc3MpOworICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOworICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRUYXJnZXRDb250ZXh0KCkuc3RhcnRBY3Rpdml0eShpbnRlbnQpOworCisgICAgICAgIC8vIFdhaXQgZm9yIHRoZSBhY3Rpdml0eSB0byByZXN1bWUgYWdhaW4KKyAgICAgICAgd2FpdEFuZEFzc2VydEFjdGl2aXR5U3RhdGVzKHN0YXRlKHNpbmdsZVRvcEFjdGl2aXR5LCBPTl9SRVNVTUUpKTsKKworICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgZmlyc3QgYWN0aXZpdHkgd2FzIHBhdXNlZCwgbmV3IGludGVudCB3YXMgZGVsaXZlcmVkIGFuZCByZXN1bWVkIGFnYWluCisgICAgICAgIExpZmVjeWNsZVZlcmlmaWVyLmFzc2VydFNlcXVlbmNlKFNpbmdsZVRvcEFjdGl2aXR5LmNsYXNzLCBnZXRMaWZlY3ljbGVMb2coKSwKKyAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KE9OX1BBVVNFLCBPTl9ORVdfSU5URU5ULCBPTl9SRVNVTUUpLCAibmV3SW50ZW50Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25OZXdJbnRlbnRGcm9tSGlkZGVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIExhdW5jaCBhIHNpbmdsZVRvcCBhY3Rpdml0eQorICAgICAgICBmaW5hbCBBY3Rpdml0eSBzaW5nbGVUb3BBY3Rpdml0eSA9CisgICAgICAgICAgICAgICAgbVNpbmdsZVRvcEFjdGl2aXR5VGVzdFJ1bGUubGF1bmNoQWN0aXZpdHkobmV3IEludGVudCgpKTsKKworICAgICAgICAvLyBXYWl0IGZvciB0aGUgYWN0aXZpdHkgdG8gcmVzdW1lCisgICAgICAgIHdhaXRBbmRBc3NlcnRBY3Rpdml0eVN0YXRlcyhzdGF0ZShzaW5nbGVUb3BBY3Rpdml0eSwgT05fUkVTVU1FKSk7CisgICAgICAgIExpZmVjeWNsZVZlcmlmaWVyLmFzc2VydExhdW5jaFNlcXVlbmNlKFNpbmdsZVRvcEFjdGl2aXR5LmNsYXNzLCBnZXRMaWZlY3ljbGVMb2coKSwKKyAgICAgICAgICAgICAgICB0cnVlIC8qIGluY2x1ZGVDYWxsYmFja3MgKi8pOworCisgICAgICAgIC8vIExhdW5jaCBzb21ldGhpbmcgb24gdG9wCisgICAgICAgIGZpbmFsIEludGVudCBuZXdUYXNrSW50ZW50ID0gbmV3IEludGVudCgpOworICAgICAgICBuZXdUYXNrSW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLIHwgSW50ZW50LkZMQUdfQUNUSVZJVFlfTVVMVElQTEVfVEFTSyk7CisgICAgICAgIGZpbmFsIEFjdGl2aXR5IHNlY29uZEFjdGl2aXR5ID0gbVNlY29uZEFjdGl2aXR5VGVzdFJ1bGUubGF1bmNoQWN0aXZpdHkobmV3VGFza0ludGVudCk7CisKKyAgICAgICAgLy8gV2FpdCBmb3IgdGhlIGFjdGl2aXR5IHRvIHJlc3VtZQorICAgICAgICB3YWl0QW5kQXNzZXJ0QWN0aXZpdHlTdGF0ZXMoc3RhdGUoc2Vjb25kQWN0aXZpdHksIE9OX1JFU1VNRSkpOworICAgICAgICB3YWl0QW5kQXNzZXJ0QWN0aXZpdHlTdGF0ZXMob2NjbHVkZWRBY3Rpdml0eVN0YXRlKHNpbmdsZVRvcEFjdGl2aXR5LCBzZWNvbmRBY3Rpdml0eSkpOworCisgICAgICAgIC8vIFRyeSB0byBsYXVuY2ggYWdhaW4KKyAgICAgICAgZ2V0TGlmZWN5Y2xlTG9nKCkuY2xlYXIoKTsKKyAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgIFNpbmdsZVRvcEFjdGl2aXR5LmNsYXNzKTsKKyAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLKTsKKyAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0VGFyZ2V0Q29udGV4dCgpLnN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKKworICAgICAgICAvLyBXYWl0IGZvciB0aGUgYWN0aXZpdHkgdG8gcmVzdW1lIGFnYWluCisgICAgICAgIHdhaXRBbmRBc3NlcnRBY3Rpdml0eVN0YXRlcyhzdGF0ZShzaW5nbGVUb3BBY3Rpdml0eSwgT05fUkVTVU1FKSk7CisKKyAgICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGZpcnN0IGFjdGl2aXR5IHdhcyByZXN0YXJ0ZWQsIG5ldyBpbnRlbnQgd2FzIGRlbGl2ZXJlZCBhbmQgcmVzdW1lZCBhZ2FpbgorICAgICAgICBmaW5hbCBMaXN0PExpZmVjeWNsZUxvZy5BY3Rpdml0eUNhbGxiYWNrPiBleHBlY3RlZFNlcXVlbmNlOworICAgICAgICBmaW5hbCBMaXN0PExpZmVjeWNsZUxvZy5BY3Rpdml0eUNhbGxiYWNrPiBvdGhlclNlcXVlbmNlOworICAgICAgICBpZiAoaXNUcmFuc2x1Y2VudChzaW5nbGVUb3BBY3Rpdml0eSkpIHsKKyAgICAgICAgICAgIGV4cGVjdGVkU2VxdWVuY2UgPSBBcnJheXMuYXNMaXN0KE9OX05FV19JTlRFTlQsIE9OX1JFU1VNRSwgT05fUEFVU0UsIE9OX1JFU1VNRSk7CisgICAgICAgICAgICBvdGhlclNlcXVlbmNlID0gQXJyYXlzLmFzTGlzdChPTl9SRVNUQVJULCBPTl9TVEFSVCwgT05fTkVXX0lOVEVOVCwgT05fUkVTVU1FKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGV4cGVjdGVkU2VxdWVuY2UgPSBBcnJheXMuYXNMaXN0KE9OX05FV19JTlRFTlQsIE9OX1JFU1RBUlQsIE9OX1NUQVJULCBPTl9SRVNVTUUpOworICAgICAgICAgICAgb3RoZXJTZXF1ZW5jZSA9IEFycmF5cy5hc0xpc3QoT05fUkVTVEFSVCwgT05fU1RBUlQsIE9OX05FV19JTlRFTlQsIE9OX1JFU1VNRSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gVE9ETyhiLzY1MjM2NDU2KTogVGhpcyBzaG91bGQgYWx3YXlzIGJlIE9OX1JFU1RBUlQsIE9OX1NUQVJULCBPTl9ORVdfSU5URU5ULCBPTl9SRVNVTUUKKyAgICAgICAgTGlmZWN5Y2xlVmVyaWZpZXIuYXNzZXJ0U2VxdWVuY2VNYXRjaGVzT25lT2YoU2luZ2xlVG9wQWN0aXZpdHkuY2xhc3MsIGdldExpZmVjeWNsZUxvZygpLAorICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoZXhwZWN0ZWRTZXF1ZW5jZSwgb3RoZXJTZXF1ZW5jZSksICJuZXdJbnRlbnQiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPbk5ld0ludGVudEZyb21QYXVzZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gTGF1bmNoIGEgc2luZ2xlVG9wIGFjdGl2aXR5CisgICAgICAgIGZpbmFsIEFjdGl2aXR5IHNpbmdsZVRvcEFjdGl2aXR5ID0KKyAgICAgICAgICAgICAgICBtU2luZ2xlVG9wQWN0aXZpdHlUZXN0UnVsZS5sYXVuY2hBY3Rpdml0eShuZXcgSW50ZW50KCkpOworCisgICAgICAgIC8vIFdhaXQgZm9yIHRoZSBhY3Rpdml0eSB0byByZXN1bWUKKyAgICAgICAgd2FpdEFuZEFzc2VydEFjdGl2aXR5U3RhdGVzKHN0YXRlKHNpbmdsZVRvcEFjdGl2aXR5LCBPTl9SRVNVTUUpKTsKKyAgICAgICAgTGlmZWN5Y2xlVmVyaWZpZXIuYXNzZXJ0TGF1bmNoU2VxdWVuY2UoU2luZ2xlVG9wQWN0aXZpdHkuY2xhc3MsIGdldExpZmVjeWNsZUxvZygpLAorICAgICAgICAgICAgICAgIHRydWUgLyogaW5jbHVkZUNhbGxiYWNrcyAqLyk7CisKKyAgICAgICAgLy8gTGF1bmNoIHRyYW5zbHVjZW50IGFjdGl2aXR5LCB3aGljaCB3aWxsIG1ha2UgdGhlIGZpcnN0IG9uZSBwYXVzZWQuCisgICAgICAgIG1UcmFuc2x1Y2VudEFjdGl2aXR5VGVzdFJ1bGUubGF1bmNoQWN0aXZpdHkobmV3IEludGVudCgpKTsKKworICAgICAgICAvLyBXYWl0IGZvciB0aGUgYWN0aXZpdHkgdG8gcGF1c2UKKyAgICAgICAgd2FpdEFuZEFzc2VydEFjdGl2aXR5U3RhdGVzKHN0YXRlKHNpbmdsZVRvcEFjdGl2aXR5LCBPTl9QQVVTRSkpOworCisgICAgICAgIC8vIFRyeSB0byBsYXVuY2ggYWdhaW4KKyAgICAgICAgZ2V0TGlmZWN5Y2xlTG9nKCkuY2xlYXIoKTsKKyAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgIFNpbmdsZVRvcEFjdGl2aXR5LmNsYXNzKTsKKyAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLIHwgSW50ZW50LkZMQUdfQUNUSVZJVFlfQ0xFQVJfVE9QKTsKKyAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0VGFyZ2V0Q29udGV4dCgpLnN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKKworICAgICAgICAvLyBXYWl0IGZvciB0aGUgYWN0aXZpdHkgdG8gcmVzdW1lIGFnYWluCisgICAgICAgIC8vIFRPRE8oYi83Nzk3NDc5NCk6IE5ldyBpbnRlbnQgaGFuZGxpbmcgc2VxdWVuY2Ugc2hvdWxkIGFsd2F5cyBiZSB0aGUgc2FtZS4KKyAgICAgICAgLy8gSXQgaXMgcG9zc2libGUgdG8gZ2V0IGFuIGV4dHJhIHBhdXNlIGFuZCByZXN1bWUgbm93LgorICAgICAgICBmaW5hbCBMaXN0PExpZmVjeWNsZUxvZy5BY3Rpdml0eUNhbGxiYWNrPiBleHRyYVBhdXNlU2VxdWVuY2UgPQorICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoT05fTkVXX0lOVEVOVCwgT05fUkVTVU1FLCBPTl9QQVVTRSwgT05fUkVTVU1FKTsKKyAgICAgICAgd2FpdEZvckFjdGl2aXR5VHJhbnNpdGlvbnMoU2luZ2xlVG9wQWN0aXZpdHkuY2xhc3MsIGV4dHJhUGF1c2VTZXF1ZW5jZSk7CisKKyAgICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIG5ldyBpbnRlbnQgd2FzIGRlbGl2ZXJlZCBhbmQgcmVzdW1lZCBhZ2FpbgorICAgICAgICBmaW5hbCBMaXN0PExpZmVjeWNsZUxvZy5BY3Rpdml0eUNhbGxiYWNrPiBleHBlY3RlZFNlcXVlbmNlID0KKyAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KE9OX05FV19JTlRFTlQsIE9OX1JFU1VNRSk7CisgICAgICAgIExpZmVjeWNsZVZlcmlmaWVyLmFzc2VydFNlcXVlbmNlTWF0Y2hlc09uZU9mKFNpbmdsZVRvcEFjdGl2aXR5LmNsYXNzLCBnZXRMaWZlY3ljbGVMb2coKSwKKyAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KGV4cGVjdGVkU2VxdWVuY2UsIGV4dHJhUGF1c2VTZXF1ZW5jZSksICJuZXdJbnRlbnQiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMaWZlY3ljbGVPbk1vdmVUb0Zyb21TcGxpdFNjcmVlblJlbGF1bmNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghc3VwcG9ydHNTcGxpdFNjcmVlbk11bHRpV2luZG93KCkpIHsKKyAgICAgICAgICAgIC8vIFNraXBwaW5nIHRlc3Q6IG5vIHNwbGl0IG11bHRpLXdpbmRvdyBzdXBwb3J0CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBMYXVuY2ggYSBzaW5nbGVUb3AgYWN0aXZpdHkKKyAgICAgICAgZmluYWwgQWN0aXZpdHkgdGVzdEFjdGl2aXR5ID0KKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2tUcmFja2luZ0FjdGl2aXR5VGVzdFJ1bGUubGF1bmNoQWN0aXZpdHkobmV3IEludGVudCgpKTsKKworICAgICAgICAvLyBXYWl0IGZvciB0aGUgYWN0aXZpdHkgdG8gcmVzdW1lCisgICAgICAgIHdhaXRBbmRBc3NlcnRBY3Rpdml0eVN0YXRlcyhzdGF0ZSh0ZXN0QWN0aXZpdHksIE9OX1JFU1VNRSkpOworICAgICAgICBMaWZlY3ljbGVWZXJpZmllci5hc3NlcnRMYXVuY2hTZXF1ZW5jZShDYWxsYmFja1RyYWNraW5nQWN0aXZpdHkuY2xhc3MsIGdldExpZmVjeWNsZUxvZygpLAorICAgICAgICAgICAgICAgIHRydWUgLyogaW5jbHVkZUNhbGxiYWNrcyAqLyk7CisKKyAgICAgICAgLy8gRW50ZXIgc3BsaXQgc2NyZWVuCisgICAgICAgIGdldExpZmVjeWNsZUxvZygpLmNsZWFyKCk7CisgICAgICAgIHNldEFjdGl2aXR5VGFza1dpbmRvd2luZ01vZGUoQ0FMTEJBQ0tfVFJBQ0tJTkdfQUNUSVZJVFksCisgICAgICAgICAgICAgICAgV0lORE9XSU5HX01PREVfU1BMSVRfU0NSRUVOX1BSSU1BUlkpOworCisgICAgICAgIC8vIFdhaXQgZm9yIHRoZSBhY3Rpdml0eSB0byBwYXVzZQorICAgICAgICBmaW5hbCBMaXN0PExpZmVjeWNsZUxvZy5BY3Rpdml0eUNhbGxiYWNrPiBleHBlY3RlZEVudGVyU2VxdWVuY2UgPQorICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoT05fUEFVU0UsIE9OX1NUT1AsIE9OX0RFU1RST1ksIFBSRV9PTl9DUkVBVEUsIE9OX0NSRUFURSwgT05fU1RBUlQsCisgICAgICAgICAgICAgICAgICAgICAgICBPTl9QT1NUX0NSRUFURSwgT05fUkVTVU1FLCBPTl9NVUxUSV9XSU5ET1dfTU9ERV9DSEFOR0VELCBPTl9QQVVTRSk7CisgICAgICAgIHdhaXRGb3JBY3Rpdml0eVRyYW5zaXRpb25zKENhbGxiYWNrVHJhY2tpbmdBY3Rpdml0eS5jbGFzcywgZXhwZWN0ZWRFbnRlclNlcXVlbmNlKTsKKworICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgYWN0aXZpdHkgd2FzIHJlbGF1bmNoZWQgYW5kIHJlY2VpdmVkIG11bHRpLXdpbmRvdyBtb2RlIGNoYW5nZQorICAgICAgICBMaWZlY3ljbGVWZXJpZmllci5hc3NlcnRTZXF1ZW5jZShDYWxsYmFja1RyYWNraW5nQWN0aXZpdHkuY2xhc3MsIGdldExpZmVjeWNsZUxvZygpLAorICAgICAgICAgICAgICAgIGV4cGVjdGVkRW50ZXJTZXF1ZW5jZSwgIm1vdmVUb1NwbGl0U2NyZWVuIik7CisKKyAgICAgICAgLy8gRXhpdCBzcGxpdC1zY3JlZW4KKyAgICAgICAgZ2V0TGlmZWN5Y2xlTG9nKCkuY2xlYXIoKTsKKyAgICAgICAgc2V0QWN0aXZpdHlUYXNrV2luZG93aW5nTW9kZShDQUxMQkFDS19UUkFDS0lOR19BQ1RJVklUWSwgV0lORE9XSU5HX01PREVfRlVMTFNDUkVFTik7CisKKyAgICAgICAgLy8gV2FpdCBmb3IgdGhlIGFjdGl2aXR5IHRvIHJlc3VtZQorICAgICAgICBmaW5hbCBMaXN0PExpZmVjeWNsZUxvZy5BY3Rpdml0eUNhbGxiYWNrPiBleHBlY3RlZEV4aXRTZXF1ZW5jZSA9CisgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChPTl9TVE9QLCBPTl9ERVNUUk9ZLCBQUkVfT05fQ1JFQVRFLCBPTl9DUkVBVEUsIE9OX1NUQVJULAorICAgICAgICAgICAgICAgICAgICAgICAgT05fUE9TVF9DUkVBVEUsIE9OX1JFU1VNRSwgT05fUEFVU0UsIE9OX01VTFRJX1dJTkRPV19NT0RFX0NIQU5HRUQsCisgICAgICAgICAgICAgICAgICAgICAgICBPTl9SRVNVTUUpOworICAgICAgICB3YWl0Rm9yQWN0aXZpdHlUcmFuc2l0aW9ucyhDYWxsYmFja1RyYWNraW5nQWN0aXZpdHkuY2xhc3MsIGV4cGVjdGVkRXhpdFNlcXVlbmNlKTsKKworICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgYWN0aXZpdHkgd2FzIHJlbGF1bmNoZWQgYW5kIHJlY2VpdmVkIG11bHRpLXdpbmRvdyBtb2RlIGNoYW5nZQorICAgICAgICBMaWZlY3ljbGVWZXJpZmllci5hc3NlcnRTZXF1ZW5jZShDYWxsYmFja1RyYWNraW5nQWN0aXZpdHkuY2xhc3MsIGdldExpZmVjeWNsZUxvZygpLAorICAgICAgICAgICAgICAgIGV4cGVjdGVkRXhpdFNlcXVlbmNlLCAibW92ZUZyb21TcGxpdFNjcmVlbiIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExpZmVjeWNsZU9uTW92ZVRvRnJvbVNwbGl0U2NyZWVuTm9SZWxhdW5jaCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIXN1cHBvcnRzU3BsaXRTY3JlZW5NdWx0aVdpbmRvdygpKSB7CisgICAgICAgICAgICAvLyBTa2lwcGluZyB0ZXN0OiBubyBzcGxpdCBtdWx0aS13aW5kb3cgc3VwcG9ydAorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gTGF1bmNoIGEgc2luZ2xlVG9wIGFjdGl2aXR5CisgICAgICAgIGZpbmFsIEFjdGl2aXR5IHRlc3RBY3Rpdml0eSA9CisgICAgICAgICAgICAgICAgbUNvbmZpZ0NoYW5nZUhhbmRsaW5nQWN0aXZpdHlUZXN0UnVsZS5sYXVuY2hBY3Rpdml0eShuZXcgSW50ZW50KCkpOworCisgICAgICAgIC8vIFdhaXQgZm9yIHRoZSBhY3Rpdml0eSB0byByZXN1bWUKKyAgICAgICAgd2FpdEFuZEFzc2VydEFjdGl2aXR5U3RhdGVzKHN0YXRlKHRlc3RBY3Rpdml0eSwgT05fUkVTVU1FKSk7CisgICAgICAgIExpZmVjeWNsZVZlcmlmaWVyLmFzc2VydExhdW5jaFNlcXVlbmNlKENvbmZpZ0NoYW5nZUhhbmRsaW5nQWN0aXZpdHkuY2xhc3MsCisgICAgICAgICAgICAgICAgZ2V0TGlmZWN5Y2xlTG9nKCksIHRydWUgLyogaW5jbHVkZUNhbGxiYWNrcyAqLyk7CisKKyAgICAgICAgLy8gRW50ZXIgc3BsaXQgc2NyZWVuCisgICAgICAgIGdldExpZmVjeWNsZUxvZygpLmNsZWFyKCk7CisgICAgICAgIHNldEFjdGl2aXR5VGFza1dpbmRvd2luZ01vZGUoQ09ORklHX0NIQU5HRV9IQU5ETElOR19BQ1RJVklUWSwKKyAgICAgICAgICAgICAgICBXSU5ET1dJTkdfTU9ERV9TUExJVF9TQ1JFRU5fUFJJTUFSWSk7CisKKyAgICAgICAgLy8gV2FpdCBmb3IgdGhlIGFjdGl2aXR5IHRvIHBhdXNlCisgICAgICAgIHdhaXRBbmRBc3NlcnRBY3Rpdml0eVN0YXRlcyhzdGF0ZSh0ZXN0QWN0aXZpdHksIE9OX1BBVVNFKSk7CisKKyAgICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGFjdGl2aXR5IHdhcyByZWxhdW5jaGVkIGFuZCByZWNlaXZlZCBtdWx0aS13aW5kb3cgbW9kZSBjaGFuZ2UKKyAgICAgICAgTGlmZWN5Y2xlVmVyaWZpZXIuYXNzZXJ0U2VxdWVuY2UoQ29uZmlnQ2hhbmdlSGFuZGxpbmdBY3Rpdml0eS5jbGFzcywgZ2V0TGlmZWN5Y2xlTG9nKCksCisgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChPTl9NVUxUSV9XSU5ET1dfTU9ERV9DSEFOR0VELCBPTl9QQVVTRSksICJtb3ZlVG9TcGxpdFNjcmVlbiIpOworCisgICAgICAgIC8vIEV4aXQgc3BsaXQtc2NyZWVuCisgICAgICAgIGdldExpZmVjeWNsZUxvZygpLmNsZWFyKCk7CisgICAgICAgIHNldEFjdGl2aXR5VGFza1dpbmRvd2luZ01vZGUoQ09ORklHX0NIQU5HRV9IQU5ETElOR19BQ1RJVklUWSwgV0lORE9XSU5HX01PREVfRlVMTFNDUkVFTik7CisKKyAgICAgICAgLy8gV2FpdCBmb3IgdGhlIGFjdGl2aXR5IHRvIHJlc3VtZQorICAgICAgICB3YWl0QW5kQXNzZXJ0QWN0aXZpdHlTdGF0ZXMoc3RhdGUodGVzdEFjdGl2aXR5LCBPTl9SRVNVTUUpKTsKKworICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgYWN0aXZpdHkgd2FzIHJlbGF1bmNoZWQgYW5kIHJlY2VpdmVkIG11bHRpLXdpbmRvdyBtb2RlIGNoYW5nZQorICAgICAgICBMaWZlY3ljbGVWZXJpZmllci5hc3NlcnRTZXF1ZW5jZShDb25maWdDaGFuZ2VIYW5kbGluZ0FjdGl2aXR5LmNsYXNzLCBnZXRMaWZlY3ljbGVMb2coKSwKKyAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KE9OX01VTFRJX1dJTkRPV19NT0RFX0NIQU5HRUQsIE9OX1JFU1VNRSksICJtb3ZlRnJvbVNwbGl0U2NyZWVuIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9saWZlY3ljbGUvQWN0aXZpdHlTdGFydGVyVGVzdHMuamF2YSBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vbGlmZWN5Y2xlL0FjdGl2aXR5U3RhcnRlclRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQzOTc1NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vbGlmZWN5Y2xlL0FjdGl2aXR5U3RhcnRlclRlc3RzLmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbS5saWZlY3ljbGU7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuc2VydmVyLmFtLmxpZmVjeWNsZS5BY3Rpdml0eUxpZmVjeWNsZUNsaWVudFRlc3RCYXNlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkFjdGl2aXR5TWFuYWdlclN0YXRlLlNUQVRFX1JFU1VNRUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLmxpZmVjeWNsZS5MaWZlY3ljbGVMb2cuQWN0aXZpdHlDYWxsYmFjay5PTl9SRVNVTUU7CisKKy8qKgorICogQnVpbGQvSW5zdGFsbC9SdW46CisgKiAgICAgYXRlc3QgQ3RzQWN0aXZpdHlNYW5hZ2VyRGV2aWNlVGVzdENhc2VzOkFjdGl2aXR5U3RhcnRlclRlc3RzCisgKi8KK3B1YmxpYyBjbGFzcyBBY3Rpdml0eVN0YXJ0ZXJUZXN0cyBleHRlbmRzIEFjdGl2aXR5TGlmZWN5Y2xlQ2xpZW50VGVzdEJhc2UgeworICAgIC8qKgorICAgICAqIEVuc3VyZXMgdGhhdCB0aGUgZm9sbG93aW5nIGxhdW5jaCBmbGFnIGNvbWJpbmF0aW9uIHdvcmtzIHdoZW4gc3RhcnRpbmcgYW4gYWN0aXZpdHkgd2hpY2ggaXMKKyAgICAgKiBhbHJlYWR5IHJ1bm5pbmc6CisgICAgICogLSB7QGNvZGUgRkxBR19BQ1RJVklUWV9DTEVBUl9UT1B9CisgICAgICogLSB7QGNvZGUgRkxBR19BQ1RJVklUWV9SRVNFVF9UQVNLX0lGX05FRURFRH0KKyAgICAgKiAtIHtAY29kZSBGTEFHX0FDVElWSVRZX05FV19UQVNLfQorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENsZWFyVG9wTmV3VGFza1Jlc2V0VGFzaygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBTdGFydCBhY3Rpdml0eSBub3JtYWxseQorICAgICAgICBmaW5hbCBBY3Rpdml0eSBpbml0aWFsQWN0aXZpdHkgPSBtRmlyc3RBY3Rpdml0eVRlc3RSdWxlLmxhdW5jaEFjdGl2aXR5KG5ldyBJbnRlbnQoKSk7CisgICAgICAgIHdhaXRBbmRBc3NlcnRBY3Rpdml0eVN0YXRlcyhzdGF0ZShpbml0aWFsQWN0aXZpdHksIE9OX1JFU1VNRSkpOworCisgICAgICAgIC8vIE5hdmlnYXRlIGhvbWUKKyAgICAgICAgbGF1bmNoSG9tZUFjdGl2aXR5KCk7CisKKyAgICAgICAgLy8gU3RhcnQgYWN0aXZpdHkgYWdhaW4gd2l0aCBmbGFncyBpbiBxdWVzdGlvbi4gVmVyaWZ5IGFjdGl2aXR5IGlzIHJlc3VtZWQuCisgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KCkuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfQ0xFQVJfVE9QCisgICAgICAgICAgICAgICAgfCBJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSworICAgICAgICAgICAgICAgIHwgSW50ZW50LkZMQUdfQUNUSVZJVFlfUkVTRVRfVEFTS19JRl9ORUVERUQpOworICAgICAgICBmaW5hbCBBY3Rpdml0eSBzZWNvbmRMYXVuY2hBY3Rpdml0eSA9IG1GaXJzdEFjdGl2aXR5VGVzdFJ1bGUubGF1bmNoQWN0aXZpdHkoaW50ZW50KTsKKyAgICAgICAgd2FpdEFuZEFzc2VydEFjdGl2aXR5U3RhdGVzKHN0YXRlKHNlY29uZExhdW5jaEFjdGl2aXR5LCBPTl9SRVNVTUUpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2FtL2xpZmVjeWNsZS9MaWZlY3ljbGVMb2cuamF2YSBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vbGlmZWN5Y2xlL0xpZmVjeWNsZUxvZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4N2ExMmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2FtL2xpZmVjeWNsZS9MaWZlY3ljbGVMb2cuamF2YQpAQCAtMCwwICsxLDExMCBAQAorcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbS5saWZlY3ljbGU7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uU3RhdGVMb2dnZXIubG9nOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWR4LnRlc3QucnVubmVyLmxpZmVjeWNsZS5TdGFnZS5DUkVBVEVEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkeC50ZXN0LnJ1bm5lci5saWZlY3ljbGUuU3RhZ2UuREVTVFJPWUVEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkeC50ZXN0LnJ1bm5lci5saWZlY3ljbGUuU3RhZ2UuUEFVU0VEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkeC50ZXN0LnJ1bm5lci5saWZlY3ljbGUuU3RhZ2UuUFJFX09OX0NSRUFURTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZHgudGVzdC5ydW5uZXIubGlmZWN5Y2xlLlN0YWdlLlJFU1VNRUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWR4LnRlc3QucnVubmVyLmxpZmVjeWNsZS5TdGFnZS5TVEFSVEVEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkeC50ZXN0LnJ1bm5lci5saWZlY3ljbGUuU3RhZ2UuU1RPUFBFRDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQudXRpbC5QYWlyOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIubGlmZWN5Y2xlLkFjdGl2aXR5TGlmZWN5Y2xlQ2FsbGJhY2s7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIubGlmZWN5Y2xlLlN0YWdlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBVc2VkIGFzIGEgc2hhcmVkIGxvZyBzdG9yYWdlIG9mIGFjdGl2aXR5IGxpZmVjeWNsZSB0cmFuc2l0aW9ucy4gTWV0aG9kcyBtdXN0IGJlIHN5bmNocm9uaXplZCB0bworICogcHJldmVudCBjb25jdXJyZW50IG1vZGlmaWNhdGlvbiBvZiB0aGUgbG9nIHN0b3JlLgorICovCitjbGFzcyBMaWZlY3ljbGVMb2cgaW1wbGVtZW50cyBBY3Rpdml0eUxpZmVjeWNsZUNhbGxiYWNrIHsKKworICAgIGVudW0gQWN0aXZpdHlDYWxsYmFjayB7CisgICAgICAgIFBSRV9PTl9DUkVBVEUsCisgICAgICAgIE9OX0NSRUFURSwKKyAgICAgICAgT05fU1RBUlQsCisgICAgICAgIE9OX1JFU1VNRSwKKyAgICAgICAgT05fUEFVU0UsCisgICAgICAgIE9OX1NUT1AsCisgICAgICAgIE9OX1JFU1RBUlQsCisgICAgICAgIE9OX0RFU1RST1ksCisgICAgICAgIE9OX0FDVElWSVRZX1JFU1VMVCwKKyAgICAgICAgT05fUE9TVF9DUkVBVEUsCisgICAgICAgIE9OX05FV19JTlRFTlQsCisgICAgICAgIE9OX01VTFRJX1dJTkRPV19NT0RFX0NIQU5HRUQKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2cgZm9yIGVuY291bnRlcmVkIGFjdGl2aXR5IGNhbGxiYWNrcy4gTm90ZSB0aGF0IG1ldGhvZHMgYWNjZXNzaW5nIG9yIG1vZGlmeWluZyB0aGlzCisgICAgICogbGlzdCBzaG91bGQgYmUgc3luY2hyb25pemVkIGFzIGl0IGNhbiBiZSBhY2Nlc3NlZCBmcm9tIGRpZmZlcmVudCB0aHJlYWRzLgorICAgICAqLworICAgIHByaXZhdGUgTGlzdDxQYWlyPFN0cmluZywgQWN0aXZpdHlDYWxsYmFjaz4+IG1Mb2cgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgIC8qKiBDbGVhciB0aGUgZW50aXJlIHRyYW5zaXRpb24gbG9nLiAqLworICAgIHN5bmNocm9uaXplZCB2b2lkIGNsZWFyKCkgeworICAgICAgICBtTG9nLmNsZWFyKCk7CisgICAgfQorCisgICAgLyoqIEFkZCB0cmFuc2l0aW9uIG9mIGFuIGFjdGl2aXR5IHRvIHRoZSBsb2cuICovCisgICAgQE92ZXJyaWRlCisgICAgc3luY2hyb25pemVkIHB1YmxpYyB2b2lkIG9uQWN0aXZpdHlMaWZlY3ljbGVDaGFuZ2VkKEFjdGl2aXR5IGFjdGl2aXR5LCBTdGFnZSBzdGFnZSkgeworICAgICAgICBmaW5hbCBTdHJpbmcgYWN0aXZpdHlOYW1lID0gYWN0aXZpdHkuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCk7CisgICAgICAgIGxvZygiQWN0aXZpdHkgIiArIGFjdGl2aXR5TmFtZSArICIgbW92ZWQgdG8gc3RhZ2UgIiArIHN0YWdlKTsKKyAgICAgICAgbUxvZy5hZGQobmV3IFBhaXI8PihhY3Rpdml0eU5hbWUsIHN0YWdlVG9DYWxsYmFjayhzdGFnZSkpKTsKKyAgICB9CisKKyAgICAvKiogQWRkIGFjdGl2aXR5IGNhbGxiYWNrIHRvIHRoZSBsb2cuICovCisgICAgc3luY2hyb25pemVkIHB1YmxpYyB2b2lkIG9uQWN0aXZpdHlDYWxsYmFjayhBY3Rpdml0eSBhY3Rpdml0eSwgQWN0aXZpdHlDYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICBmaW5hbCBTdHJpbmcgYWN0aXZpdHlOYW1lID0gYWN0aXZpdHkuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCk7CisgICAgICAgIGxvZygiQWN0aXZpdHkgIiArIGFjdGl2aXR5TmFtZSArICIgZ290IGEgY2FsbGJhY2sgIiArIGNhbGxiYWNrKTsKKyAgICAgICAgbUxvZy5hZGQobmV3IFBhaXI8PihhY3Rpdml0eU5hbWUsIGNhbGxiYWNrKSk7CisgICAgfQorCisgICAgLyoqIEdldCBsb2dzIGZvciBhbGwgcmVjb3JkZWQgdHJhbnNpdGlvbnMuICovCisgICAgc3luY2hyb25pemVkIExpc3Q8UGFpcjxTdHJpbmcsIEFjdGl2aXR5Q2FsbGJhY2s+PiBnZXRMb2coKSB7CisgICAgICAgIC8vIFdyYXAgaW4gYSBuZXcgbGlzdCB0byBwcmV2ZW50IGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uCisgICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PD4obUxvZyk7CisgICAgfQorCisgICAgLyoqIEdldCB0cmFuc2l0aW9uIGxvZ3MgZm9yIHRoZSBzcGVjaWZpZWQgYWN0aXZpdHkuICovCisgICAgc3luY2hyb25pemVkIExpc3Q8QWN0aXZpdHlDYWxsYmFjaz4gZ2V0QWN0aXZpdHlMb2coQ2xhc3M8PyBleHRlbmRzIEFjdGl2aXR5PiBhY3Rpdml0eUNsYXNzKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBhY3Rpdml0eU5hbWUgPSBhY3Rpdml0eUNsYXNzLmdldENhbm9uaWNhbE5hbWUoKTsKKyAgICAgICAgbG9nKCJMb29raW5nIHVwIGxvZyBmb3IgYWN0aXZpdHk6ICIgKyBhY3Rpdml0eU5hbWUpOworICAgICAgICBmaW5hbCBMaXN0PEFjdGl2aXR5Q2FsbGJhY2s+IGFjdGl2aXR5TG9nID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGZvciAoUGFpcjxTdHJpbmcsIEFjdGl2aXR5Q2FsbGJhY2s+IHRyYW5zaXRpb24gOiBtTG9nKSB7CisgICAgICAgICAgICBpZiAodHJhbnNpdGlvbi5maXJzdC5lcXVhbHMoYWN0aXZpdHlOYW1lKSkgeworICAgICAgICAgICAgICAgIGFjdGl2aXR5TG9nLmFkZCh0cmFuc2l0aW9uLnNlY29uZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFjdGl2aXR5TG9nOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEFjdGl2aXR5Q2FsbGJhY2sgc3RhZ2VUb0NhbGxiYWNrKFN0YWdlIHN0YWdlKSB7CisgICAgICAgIHN3aXRjaCAoc3RhZ2UpIHsKKyAgICAgICAgICAgIGNhc2UgUFJFX09OX0NSRUFURToKKyAgICAgICAgICAgICAgICByZXR1cm4gQWN0aXZpdHlDYWxsYmFjay5QUkVfT05fQ1JFQVRFOworICAgICAgICAgICAgY2FzZSBDUkVBVEVEOgorICAgICAgICAgICAgICAgIHJldHVybiBBY3Rpdml0eUNhbGxiYWNrLk9OX0NSRUFURTsKKyAgICAgICAgICAgIGNhc2UgU1RBUlRFRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gQWN0aXZpdHlDYWxsYmFjay5PTl9TVEFSVDsKKyAgICAgICAgICAgIGNhc2UgUkVTVU1FRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gQWN0aXZpdHlDYWxsYmFjay5PTl9SRVNVTUU7CisgICAgICAgICAgICBjYXNlIFBBVVNFRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gQWN0aXZpdHlDYWxsYmFjay5PTl9QQVVTRTsKKyAgICAgICAgICAgIGNhc2UgU1RPUFBFRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gQWN0aXZpdHlDYWxsYmFjay5PTl9TVE9QOworICAgICAgICAgICAgY2FzZSBSRVNUQVJURUQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFjdGl2aXR5Q2FsbGJhY2suT05fUkVTVEFSVDsKKyAgICAgICAgICAgIGNhc2UgREVTVFJPWUVEOgorICAgICAgICAgICAgICAgIHJldHVybiBBY3Rpdml0eUNhbGxiYWNrLk9OX0RFU1RST1k7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuc3VwcG9ydGVkIHN0YWdlOiAiICsgc3RhZ2UpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9saWZlY3ljbGUvTGlmZWN5Y2xlVHJhY2tlci5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9saWZlY3ljbGUvTGlmZWN5Y2xlVHJhY2tlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5YTcyNzEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2FtL2xpZmVjeWNsZS9MaWZlY3ljbGVUcmFja2VyLmphdmEKQEAgLTAsMCArMSw5MiBAQAorcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbS5saWZlY3ljbGU7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5zZXJ2ZXIuYW0ubGlmZWN5Y2xlLkxpZmVjeWNsZUxvZy5BY3Rpdml0eUNhbGxiYWNrOworaW1wb3J0IGFuZHJvaWQudXRpbC5QYWlyOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIubGlmZWN5Y2xlLkFjdGl2aXR5TGlmZWN5Y2xlQ2FsbGJhY2s7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIubGlmZWN5Y2xlLlN0YWdlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQm9vbGVhblN1cHBsaWVyOworCisvKioKKyAqIEdldHMgbm90aWZpZWQgYWJvdXQgYWN0aXZpdHkgbGlmZWN5Y2xlIHVwZGF0ZXMgYW5kIHByb3ZpZGVzIGJsb2NraW5nIG1lY2hhbmlzbSB0byB3YWl0IHVudGlsCisgKiBleHBlY3RlZCBhY3Rpdml0eSBzdGF0ZXMgYXJlIHJlYWNoZWQuCisgKi8KK3B1YmxpYyBjbGFzcyBMaWZlY3ljbGVUcmFja2VyIGltcGxlbWVudHMgQWN0aXZpdHlMaWZlY3ljbGVDYWxsYmFjayB7CisKKyAgICBwcml2YXRlIExpZmVjeWNsZUxvZyBtTGlmZWN5Y2xlTG9nOworCisgICAgTGlmZWN5Y2xlVHJhY2tlcihMaWZlY3ljbGVMb2cgbGlmZWN5Y2xlTG9nKSB7CisgICAgICAgIG1MaWZlY3ljbGVMb2cgPSBsaWZlY3ljbGVMb2c7CisgICAgfQorCisgICAgdm9pZCB3YWl0QW5kQXNzZXJ0QWN0aXZpdHlTdGF0ZXMoUGFpcjxBY3Rpdml0eSwgQWN0aXZpdHlDYWxsYmFjaz5bXSBhY3Rpdml0eUNhbGxiYWNrcykgeworICAgICAgICBmaW5hbCBib29sZWFuIHdhaXRSZXN1bHQgPSB3YWl0Rm9yQ29uZGl0aW9uV2l0aFRpbWVvdXQoCisgICAgICAgICAgICAgICAgKCkgLT4gcGVuZGluZ0NhbGxiYWNrcyhhY3Rpdml0eUNhbGxiYWNrcykuaXNFbXB0eSgpLCA1ICogMTAwMCk7CisKKyAgICAgICAgaWYgKCF3YWl0UmVzdWx0KSB7CisgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBsaWZlY3ljbGUgc3RhdGVzIG5vdCBhY2hpZXZlZDogIiArIHBlbmRpbmdDYWxsYmFja3MoYWN0aXZpdHlDYWxsYmFja3MpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFdhaXRzIGZvciBhIHNwZWNpZmljIHNlcXVlbmNlIG9mIGV2ZW50cyB0byBoYXBwZW4uCisgICAgICogV2hlbiB0aGVyZSBpcyBhIHBvc3NpYmlsaXR5IG9mIHNvbWUgbGlmZWN5Y2xlIHN0YXRlIGhhcHBlbmluZyBtb3JlIHRoYW4gb25jZSBpbiBhIHNlcXVlbmNlLAorICAgICAqIGl0IGlzIGJldHRlciB0byB1c2UgdGhpcyBtZXRob2QgaW5zdGVhZCBvZiB7QGxpbmsgI3dhaXRBbmRBc3NlcnRBY3Rpdml0eVN0YXRlcyhQYWlyW10pfS4KKyAgICAgKiBPdGhlcndpc2Ugd2UgbWlnaHQgc3RvcCB0cmFja2luZyB0b28gZWFybHkuCisgICAgICovCisgICAgdm9pZCB3YWl0Rm9yQWN0aXZpdHlUcmFuc2l0aW9ucyhDbGFzczw/IGV4dGVuZHMgQWN0aXZpdHk+IGFjdGl2aXR5Q2xhc3MsCisgICAgICAgICAgICBMaXN0PEFjdGl2aXR5Q2FsbGJhY2s+IGV4cGVjdGVkVHJhbnNpdGlvbnMpIHsKKyAgICAgICAgd2FpdEZvckNvbmRpdGlvbldpdGhUaW1lb3V0KAorICAgICAgICAgICAgICAgICgpIC0+IG1MaWZlY3ljbGVMb2cuZ2V0QWN0aXZpdHlMb2coYWN0aXZpdHlDbGFzcykuZXF1YWxzKGV4cGVjdGVkVHJhbnNpdGlvbnMpLAorICAgICAgICAgICAgICAgIDUgKiAxMDAwKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBzeW5jaHJvbml6ZWQgcHVibGljIHZvaWQgb25BY3Rpdml0eUxpZmVjeWNsZUNoYW5nZWQoQWN0aXZpdHkgYWN0aXZpdHksIFN0YWdlIHN0YWdlKSB7CisgICAgICAgIG5vdGlmeSgpOworICAgIH0KKworICAgIC8qKiBHZXQgYSBsaXN0IG9mIGFjdGl2aXR5IHN0YXRlcyB0aGF0IHdlcmUgbm90IHJlYWNoZWQgeWV0LiAqLworICAgIHByaXZhdGUgTGlzdDxQYWlyPEFjdGl2aXR5LCBBY3Rpdml0eUNhbGxiYWNrPj4gcGVuZGluZ0NhbGxiYWNrcyhQYWlyPEFjdGl2aXR5LAorICAgICAgICAgICAgQWN0aXZpdHlDYWxsYmFjaz5bXSBhY3Rpdml0eUNhbGxiYWNrcykgeworICAgICAgICBmaW5hbCBMaXN0PFBhaXI8QWN0aXZpdHksIEFjdGl2aXR5Q2FsbGJhY2s+PiBub3RSZWFjaGVkQWN0aXZpdHlDYWxsYmFja3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgICAgICBmb3IgKFBhaXI8QWN0aXZpdHksIEFjdGl2aXR5Q2FsbGJhY2s+IGFjdGl2aXR5Q2FsbGJhY2sgOiBhY3Rpdml0eUNhbGxiYWNrcykgeworICAgICAgICAgICAgZmluYWwgQWN0aXZpdHkgYWN0aXZpdHkgPSBhY3Rpdml0eUNhbGxiYWNrLmZpcnN0OworICAgICAgICAgICAgZmluYWwgTGlzdDxBY3Rpdml0eUNhbGxiYWNrPiB0cmFuc2l0aW9uTGlzdCA9CisgICAgICAgICAgICAgICAgICAgIG1MaWZlY3ljbGVMb2cuZ2V0QWN0aXZpdHlMb2coYWN0aXZpdHkuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICBpZiAodHJhbnNpdGlvbkxpc3QuaXNFbXB0eSgpCisgICAgICAgICAgICAgICAgICAgIHx8IHRyYW5zaXRpb25MaXN0LmdldCh0cmFuc2l0aW9uTGlzdC5zaXplKCkgLSAxKSAhPSBhY3Rpdml0eUNhbGxiYWNrLnNlY29uZCkgeworICAgICAgICAgICAgICAgIC8vIFRoZSBhY3Rpdml0eSBlaXRoZXIgaGFzbid0IGdvdCBhbnkgc3RhdGUgdHJhbnNpdGlvbnMgeWV0IG9yIHRoZSBjdXJyZW50IHN0YXRlIGlzCisgICAgICAgICAgICAgICAgLy8gbm90IHRoZSBvbmUgd2UgZXhwZWN0LgorICAgICAgICAgICAgICAgIG5vdFJlYWNoZWRBY3Rpdml0eUNhbGxiYWNrcy5hZGQoYWN0aXZpdHlDYWxsYmFjayk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5vdFJlYWNoZWRBY3Rpdml0eUNhbGxiYWNrczsKKyAgICB9CisKKyAgICAvKiogQmxvY2tpbmcgY2FsbCB0byB3YWl0IGZvciBhIGNvbmRpdGlvbiB0byBiZWNvbWUgdHJ1ZSB3aXRoIG1heCB0aW1lb3V0LiAqLworICAgIHN5bmNocm9uaXplZCBwcml2YXRlIGJvb2xlYW4gd2FpdEZvckNvbmRpdGlvbldpdGhUaW1lb3V0KEJvb2xlYW5TdXBwbGllciB3YWl0Q29uZGl0aW9uLAorICAgICAgICAgICAgbG9uZyB0aW1lb3V0TXMpIHsKKyAgICAgICAgZmluYWwgbG9uZyB0aW1lb3V0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyB0aW1lb3V0TXM7CisgICAgICAgIHdoaWxlICghd2FpdENvbmRpdGlvbi5nZXRBc0Jvb2xlYW4oKSkgeworICAgICAgICAgICAgZmluYWwgbG9uZyB3YWl0TXMgPSB0aW1lb3V0IC0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICBpZiAod2FpdE1zIDw9IDApIHsKKyAgICAgICAgICAgICAgICAvLyBUaW1lb3V0IGV4cGlyZWQuCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB3YWl0KHRpbWVvdXRNcyk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gV2VpcmQsIGxldCdzIHJldHJ5LgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vbGlmZWN5Y2xlL0xpZmVjeWNsZVZlcmlmaWVyLmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2FtL2xpZmVjeWNsZS9MaWZlY3ljbGVWZXJpZmllci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjODc0MzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL2FtL2xpZmVjeWNsZS9MaWZlY3ljbGVWZXJpZmllci5qYXZhCkBAIC0wLDAgKzEsMTk3IEBACitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLmFtLmxpZmVjeWNsZTsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5TdGF0ZUxvZ2dlci5sb2c7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLmxpZmVjeWNsZS5MaWZlY3ljbGVMb2cuQWN0aXZpdHlDYWxsYmFjay5PTl9DUkVBVEU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLmxpZmVjeWNsZS5MaWZlY3ljbGVMb2cuQWN0aXZpdHlDYWxsYmFjay5PTl9ERVNUUk9ZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5saWZlY3ljbGUuTGlmZWN5Y2xlTG9nLkFjdGl2aXR5Q2FsbGJhY2suT05fUEFVU0U7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLmxpZmVjeWNsZS5MaWZlY3ljbGVMb2cuQWN0aXZpdHlDYWxsYmFjay5PTl9QT1NUX0NSRUFURTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0ubGlmZWN5Y2xlLkxpZmVjeWNsZUxvZy5BY3Rpdml0eUNhbGxiYWNrLk9OX1JFU1RBUlQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLmxpZmVjeWNsZS5MaWZlY3ljbGVMb2cuQWN0aXZpdHlDYWxsYmFjay5PTl9SRVNVTUU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLmxpZmVjeWNsZS5MaWZlY3ljbGVMb2cuQWN0aXZpdHlDYWxsYmFjay5PTl9TVEFSVDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0ubGlmZWN5Y2xlLkxpZmVjeWNsZUxvZy5BY3Rpdml0eUNhbGxiYWNrLk9OX1NUT1A7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLmxpZmVjeWNsZS5MaWZlY3ljbGVMb2cuQWN0aXZpdHlDYWxsYmFjay5QUkVfT05fQ1JFQVRFOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLnNlcnZlci5hbS5saWZlY3ljbGUuTGlmZWN5Y2xlTG9nLkFjdGl2aXR5Q2FsbGJhY2s7CitpbXBvcnQgYW5kcm9pZC51dGlsLlBhaXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKiogVXRpbCBjbGFzcyB0aGF0IHZlcmlmaWVzIGNvcnJlY3QgYWN0aXZpdHkgc3RhdGUgdHJhbnNpdGlvbiBzZXF1ZW5jZXMuICovCitjbGFzcyBMaWZlY3ljbGVWZXJpZmllciB7CisKKyAgICBzdGF0aWMgdm9pZCBhc3NlcnRMYXVuY2hTZXF1ZW5jZShDbGFzczw/IGV4dGVuZHMgQWN0aXZpdHk+IGFjdGl2aXR5Q2xhc3MsCisgICAgICAgICAgICBMaWZlY3ljbGVMb2cgbGlmZWN5Y2xlTG9nLCBib29sZWFuIGluY2x1ZGVDYWxsYmFja3MpIHsKKyAgICAgICAgZmluYWwgTGlzdDxBY3Rpdml0eUNhbGxiYWNrPiBvYnNlcnZlZFRyYW5zaXRpb25zID0KKyAgICAgICAgICAgICAgICBsaWZlY3ljbGVMb2cuZ2V0QWN0aXZpdHlMb2coYWN0aXZpdHlDbGFzcyk7CisgICAgICAgIGxvZygiT2JzZXJ2ZWQgc2VxdWVuY2U6ICIgKyBvYnNlcnZlZFRyYW5zaXRpb25zKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGVycm9yTWVzc2FnZSA9IGVycm9yRHVyaW5nVHJhbnNpdGlvbihhY3Rpdml0eUNsYXNzLCAibGF1bmNoIik7CisKKyAgICAgICAgZmluYWwgTGlzdDxBY3Rpdml0eUNhbGxiYWNrPiBleHBlY3RlZFRyYW5zaXRpb25zID0gaW5jbHVkZUNhbGxiYWNrcworICAgICAgICAgICAgICAgID8gQXJyYXlzLmFzTGlzdChQUkVfT05fQ1JFQVRFLCBPTl9DUkVBVEUsIE9OX1NUQVJULCBPTl9QT1NUX0NSRUFURSwgT05fUkVTVU1FKQorICAgICAgICAgICAgICAgIDogQXJyYXlzLmFzTGlzdChQUkVfT05fQ1JFQVRFLCBPTl9DUkVBVEUsIE9OX1NUQVJULCBPTl9SRVNVTUUpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXJyb3JNZXNzYWdlLCBleHBlY3RlZFRyYW5zaXRpb25zLCBvYnNlcnZlZFRyYW5zaXRpb25zKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBhc3NlcnRMYXVuY2hTZXF1ZW5jZShDbGFzczw/IGV4dGVuZHMgQWN0aXZpdHk+IGxhdW5jaGluZ0FjdGl2aXR5LAorICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIEFjdGl2aXR5PiBleGlzdGluZ0FjdGl2aXR5LCBMaWZlY3ljbGVMb2cgbGlmZWN5Y2xlTG9nLAorICAgICAgICAgICAgYm9vbGVhbiBsYXVuY2hpbmdJc1RyYW5zbHVjZW50KSB7CisgICAgICAgIGZpbmFsIExpc3Q8UGFpcjxTdHJpbmcsIEFjdGl2aXR5Q2FsbGJhY2s+PiBvYnNlcnZlZFRyYW5zaXRpb25zID0gbGlmZWN5Y2xlTG9nLmdldExvZygpOworICAgICAgICBsb2coIk9ic2VydmVkIHNlcXVlbmNlOiAiICsgb2JzZXJ2ZWRUcmFuc2l0aW9ucyk7CisgICAgICAgIGZpbmFsIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBlcnJvckR1cmluZ1RyYW5zaXRpb24obGF1bmNoaW5nQWN0aXZpdHksICJsYXVuY2giKTsKKworICAgICAgICBmaW5hbCBMaXN0PFBhaXI8U3RyaW5nLCBBY3Rpdml0eUNhbGxiYWNrPj4gZXhwZWN0ZWRUcmFuc2l0aW9uczsKKyAgICAgICAgaWYgKGxhdW5jaGluZ0lzVHJhbnNsdWNlbnQpIHsKKyAgICAgICAgICAgIGV4cGVjdGVkVHJhbnNpdGlvbnMgPSBBcnJheXMuYXNMaXN0KAorICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uKGV4aXN0aW5nQWN0aXZpdHksIE9OX1BBVVNFKSwKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbihsYXVuY2hpbmdBY3Rpdml0eSwgUFJFX09OX0NSRUFURSksCisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb24obGF1bmNoaW5nQWN0aXZpdHksIE9OX0NSRUFURSksCisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb24obGF1bmNoaW5nQWN0aXZpdHksIE9OX1NUQVJUKSwKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbihsYXVuY2hpbmdBY3Rpdml0eSwgT05fUkVTVU1FKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBleHBlY3RlZFRyYW5zaXRpb25zID0gQXJyYXlzLmFzTGlzdCgKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbihleGlzdGluZ0FjdGl2aXR5LCBPTl9QQVVTRSksCisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb24obGF1bmNoaW5nQWN0aXZpdHksIFBSRV9PTl9DUkVBVEUpLAorICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uKGxhdW5jaGluZ0FjdGl2aXR5LCBPTl9DUkVBVEUpLAorICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uKGxhdW5jaGluZ0FjdGl2aXR5LCBPTl9TVEFSVCksCisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb24obGF1bmNoaW5nQWN0aXZpdHksIE9OX1JFU1VNRSksCisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb24oZXhpc3RpbmdBY3Rpdml0eSwgT05fU1RPUCkpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGVycm9yTWVzc2FnZSwgZXhwZWN0ZWRUcmFuc2l0aW9ucywgb2JzZXJ2ZWRUcmFuc2l0aW9ucyk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgYXNzZXJ0TGF1bmNoQW5kU3RvcFNlcXVlbmNlKENsYXNzPD8gZXh0ZW5kcyBBY3Rpdml0eT4gYWN0aXZpdHlDbGFzcywKKyAgICAgICAgICAgIExpZmVjeWNsZUxvZyBsaWZlY3ljbGVMb2cpIHsKKyAgICAgICAgZmluYWwgTGlzdDxBY3Rpdml0eUNhbGxiYWNrPiBvYnNlcnZlZFRyYW5zaXRpb25zID0KKyAgICAgICAgICAgICAgICBsaWZlY3ljbGVMb2cuZ2V0QWN0aXZpdHlMb2coYWN0aXZpdHlDbGFzcyk7CisgICAgICAgIGxvZygiT2JzZXJ2ZWQgc2VxdWVuY2U6ICIgKyBvYnNlcnZlZFRyYW5zaXRpb25zKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGVycm9yTWVzc2FnZSA9IGVycm9yRHVyaW5nVHJhbnNpdGlvbihhY3Rpdml0eUNsYXNzLCAibGF1bmNoIGFuZCBzdG9wIik7CisKKyAgICAgICAgZmluYWwgTGlzdDxBY3Rpdml0eUNhbGxiYWNrPiBleHBlY3RlZFRyYW5zaXRpb25zID0KKyAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KFBSRV9PTl9DUkVBVEUsIE9OX0NSRUFURSwgT05fU1RBUlQsIE9OX1JFU1VNRSwgT05fUEFVU0UsIE9OX1NUT1ApOworICAgICAgICBhc3NlcnRFcXVhbHMoZXJyb3JNZXNzYWdlLCBleHBlY3RlZFRyYW5zaXRpb25zLCBvYnNlcnZlZFRyYW5zaXRpb25zKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBhc3NlcnRMYXVuY2hBbmRQYXVzZVNlcXVlbmNlKENsYXNzPD8gZXh0ZW5kcyBBY3Rpdml0eT4gYWN0aXZpdHlDbGFzcywKKyAgICAgICAgICAgIExpZmVjeWNsZUxvZyBsaWZlY3ljbGVMb2cpIHsKKyAgICAgICAgZmluYWwgTGlzdDxBY3Rpdml0eUNhbGxiYWNrPiBvYnNlcnZlZFRyYW5zaXRpb25zID0KKyAgICAgICAgICAgICAgICBsaWZlY3ljbGVMb2cuZ2V0QWN0aXZpdHlMb2coYWN0aXZpdHlDbGFzcyk7CisgICAgICAgIGxvZygiT2JzZXJ2ZWQgc2VxdWVuY2U6ICIgKyBvYnNlcnZlZFRyYW5zaXRpb25zKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGVycm9yTWVzc2FnZSA9IGVycm9yRHVyaW5nVHJhbnNpdGlvbihhY3Rpdml0eUNsYXNzLCAibGF1bmNoIGFuZCBwYXVzZSIpOworCisgICAgICAgIGZpbmFsIExpc3Q8QWN0aXZpdHlDYWxsYmFjaz4gZXhwZWN0ZWRUcmFuc2l0aW9ucyA9CisgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChQUkVfT05fQ1JFQVRFLCBPTl9DUkVBVEUsIE9OX1NUQVJULCBPTl9SRVNVTUUsIE9OX1BBVVNFKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGVycm9yTWVzc2FnZSwgZXhwZWN0ZWRUcmFuc2l0aW9ucywgb2JzZXJ2ZWRUcmFuc2l0aW9ucyk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgYXNzZXJ0UmVzdGFydFNlcXVlbmNlKENsYXNzPD8gZXh0ZW5kcyBBY3Rpdml0eT4gYWN0aXZpdHlDbGFzcywKKyAgICAgICAgICAgIExpZmVjeWNsZUxvZyBsaWZlY3ljbGVMb2cpIHsKKyAgICAgICAgZmluYWwgTGlzdDxBY3Rpdml0eUNhbGxiYWNrPiBvYnNlcnZlZFRyYW5zaXRpb25zID0KKyAgICAgICAgICAgICAgICBsaWZlY3ljbGVMb2cuZ2V0QWN0aXZpdHlMb2coYWN0aXZpdHlDbGFzcyk7CisgICAgICAgIGxvZygiT2JzZXJ2ZWQgc2VxdWVuY2U6ICIgKyBvYnNlcnZlZFRyYW5zaXRpb25zKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGVycm9yTWVzc2FnZSA9IGVycm9yRHVyaW5nVHJhbnNpdGlvbihhY3Rpdml0eUNsYXNzLCAicmVzdGFydCIpOworCisgICAgICAgIGZpbmFsIExpc3Q8QWN0aXZpdHlDYWxsYmFjaz4gZXhwZWN0ZWRUcmFuc2l0aW9ucyA9CisgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChPTl9SRVNUQVJULCBPTl9TVEFSVCk7CisgICAgICAgIGFzc2VydEVxdWFscyhlcnJvck1lc3NhZ2UsIGV4cGVjdGVkVHJhbnNpdGlvbnMsIG9ic2VydmVkVHJhbnNpdGlvbnMpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIGFzc2VydFJlc3RhcnRBbmRQYXVzZVNlcXVlbmNlKENsYXNzPD8gZXh0ZW5kcyBBY3Rpdml0eT4gYWN0aXZpdHlDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaWZlY3ljbGVMb2cgbGlmZWN5Y2xlTG9nKSB7CisgICAgICAgIGZpbmFsIExpc3Q8QWN0aXZpdHlDYWxsYmFjaz4gb2JzZXJ2ZWRUcmFuc2l0aW9ucyA9CisgICAgICAgICAgICAgICAgbGlmZWN5Y2xlTG9nLmdldEFjdGl2aXR5TG9nKGFjdGl2aXR5Q2xhc3MpOworICAgICAgICBsb2coIk9ic2VydmVkIHNlcXVlbmNlOiAiICsgb2JzZXJ2ZWRUcmFuc2l0aW9ucyk7CisgICAgICAgIGZpbmFsIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBlcnJvckR1cmluZ1RyYW5zaXRpb24oYWN0aXZpdHlDbGFzcywgInJlc3RhcnQgYW5kIHBhdXNlIik7CisKKyAgICAgICAgZmluYWwgTGlzdDxBY3Rpdml0eUNhbGxiYWNrPiBleHBlY3RlZFRyYW5zaXRpb25zID0KKyAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KE9OX1JFU1RBUlQsIE9OX1NUQVJULCBPTl9SRVNVTUUsIE9OX1BBVVNFKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGVycm9yTWVzc2FnZSwgZXhwZWN0ZWRUcmFuc2l0aW9ucywgb2JzZXJ2ZWRUcmFuc2l0aW9ucyk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgYXNzZXJ0UmVjcmVhdGVBbmRQYXVzZVNlcXVlbmNlKENsYXNzPD8gZXh0ZW5kcyBBY3Rpdml0eT4gYWN0aXZpdHlDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaWZlY3ljbGVMb2cgbGlmZWN5Y2xlTG9nKSB7CisgICAgICAgIGZpbmFsIExpc3Q8QWN0aXZpdHlDYWxsYmFjaz4gb2JzZXJ2ZWRUcmFuc2l0aW9ucyA9CisgICAgICAgICAgICAgICAgbGlmZWN5Y2xlTG9nLmdldEFjdGl2aXR5TG9nKGFjdGl2aXR5Q2xhc3MpOworICAgICAgICBsb2coIk9ic2VydmVkIHNlcXVlbmNlOiAiICsgb2JzZXJ2ZWRUcmFuc2l0aW9ucyk7CisgICAgICAgIGZpbmFsIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBlcnJvckR1cmluZ1RyYW5zaXRpb24oYWN0aXZpdHlDbGFzcywgInJlY3JlYXRlQSAgYW5kIHBhdXNlIik7CisKKyAgICAgICAgZmluYWwgTGlzdDxBY3Rpdml0eUNhbGxiYWNrPiBleHBlY3RlZFRyYW5zaXRpb25zID0KKyAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KE9OX0RFU1RST1ksIFBSRV9PTl9DUkVBVEUsIE9OX0NSRUFURSwgT05fU1RBUlQsIE9OX1JFU1VNRSwgT05fUEFVU0UpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXJyb3JNZXNzYWdlLCBleHBlY3RlZFRyYW5zaXRpb25zLCBvYnNlcnZlZFRyYW5zaXRpb25zKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBhc3NlcnRMYXVuY2hBbmREZXN0cm95U2VxdWVuY2UoQ2xhc3M8PyBleHRlbmRzIEFjdGl2aXR5PiBhY3Rpdml0eUNsYXNzLAorICAgICAgICAgICAgTGlmZWN5Y2xlTG9nIGxpZmVjeWNsZUxvZykgeworICAgICAgICBmaW5hbCBMaXN0PEFjdGl2aXR5Q2FsbGJhY2s+IG9ic2VydmVkVHJhbnNpdGlvbnMgPQorICAgICAgICAgICAgICAgIGxpZmVjeWNsZUxvZy5nZXRBY3Rpdml0eUxvZyhhY3Rpdml0eUNsYXNzKTsKKyAgICAgICAgbG9nKCJPYnNlcnZlZCBzZXF1ZW5jZTogIiArIG9ic2VydmVkVHJhbnNpdGlvbnMpOworICAgICAgICBmaW5hbCBTdHJpbmcgZXJyb3JNZXNzYWdlID0gZXJyb3JEdXJpbmdUcmFuc2l0aW9uKGFjdGl2aXR5Q2xhc3MsICJsYXVuY2ggYW5kIGRlc3Ryb3kiKTsKKworICAgICAgICBmaW5hbCBMaXN0PEFjdGl2aXR5Q2FsbGJhY2s+IGV4cGVjdGVkVHJhbnNpdGlvbnMgPSBBcnJheXMuYXNMaXN0KFBSRV9PTl9DUkVBVEUsIE9OX0NSRUFURSwKKyAgICAgICAgICAgICAgICBPTl9TVEFSVCwgT05fUkVTVU1FLCBPTl9QQVVTRSwgT05fU1RPUCwgT05fREVTVFJPWSk7CisgICAgICAgIGFzc2VydEVxdWFscyhlcnJvck1lc3NhZ2UsIGV4cGVjdGVkVHJhbnNpdGlvbnMsIG9ic2VydmVkVHJhbnNpdGlvbnMpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIGFzc2VydFJlbGF1bmNoU2VxdWVuY2UoQ2xhc3M8PyBleHRlbmRzIEFjdGl2aXR5PiBhY3Rpdml0eUNsYXNzLAorICAgICAgICAgICAgTGlmZWN5Y2xlTG9nIGxpZmVjeWNsZUxvZywgQWN0aXZpdHlDYWxsYmFjayBzdGFydFN0YXRlKSB7CisgICAgICAgIGZpbmFsIExpc3Q8QWN0aXZpdHlDYWxsYmFjaz4gZXhwZWN0ZWRUcmFuc2l0aW9uczsKKyAgICAgICAgaWYgKHN0YXJ0U3RhdGUgPT0gT05fUEFVU0UpIHsKKyAgICAgICAgICAgIGV4cGVjdGVkVHJhbnNpdGlvbnMgPSBBcnJheXMuYXNMaXN0KAorICAgICAgICAgICAgICAgICAgICBPTl9TVE9QLCBPTl9ERVNUUk9ZLCBQUkVfT05fQ1JFQVRFLCBPTl9DUkVBVEUsIE9OX1NUQVJULCBPTl9SRVNVTUUsIE9OX1BBVVNFKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdGFydFN0YXRlID09IE9OX1NUT1ApIHsKKyAgICAgICAgICAgIGV4cGVjdGVkVHJhbnNpdGlvbnMgPSBBcnJheXMuYXNMaXN0KAorICAgICAgICAgICAgICAgICAgICBPTl9ERVNUUk9ZLCBQUkVfT05fQ1JFQVRFLCBPTl9DUkVBVEUsIE9OX1NUQVJULCBPTl9SRVNVTUUsIE9OX1BBVVNFLCBPTl9TVE9QKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGV4cGVjdGVkVHJhbnNpdGlvbnMgPSBBcnJheXMuYXNMaXN0KAorICAgICAgICAgICAgICAgICAgICBPTl9QQVVTRSwgT05fU1RPUCwgT05fREVTVFJPWSwgUFJFX09OX0NSRUFURSwgT05fQ1JFQVRFLCBPTl9TVEFSVCwgT05fUkVTVU1FKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRTZXF1ZW5jZShhY3Rpdml0eUNsYXNzLCBsaWZlY3ljbGVMb2csIGV4cGVjdGVkVHJhbnNpdGlvbnMsICJyZWxhdW5jaCIpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIGFzc2VydFNlcXVlbmNlKENsYXNzPD8gZXh0ZW5kcyBBY3Rpdml0eT4gYWN0aXZpdHlDbGFzcywgTGlmZWN5Y2xlTG9nIGxpZmVjeWNsZUxvZywKKyAgICAgICAgICAgIExpc3Q8QWN0aXZpdHlDYWxsYmFjaz4gZXhwZWN0ZWRUcmFuc2l0aW9ucywgU3RyaW5nIHRyYW5zaXRpb24pIHsKKyAgICAgICAgZmluYWwgTGlzdDxBY3Rpdml0eUNhbGxiYWNrPiBvYnNlcnZlZFRyYW5zaXRpb25zID0KKyAgICAgICAgICAgICAgICBsaWZlY3ljbGVMb2cuZ2V0QWN0aXZpdHlMb2coYWN0aXZpdHlDbGFzcyk7CisgICAgICAgIGxvZygiT2JzZXJ2ZWQgc2VxdWVuY2U6ICIgKyBvYnNlcnZlZFRyYW5zaXRpb25zKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGVycm9yTWVzc2FnZSA9IGVycm9yRHVyaW5nVHJhbnNpdGlvbihhY3Rpdml0eUNsYXNzLCB0cmFuc2l0aW9uKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoZXJyb3JNZXNzYWdlLCBleHBlY3RlZFRyYW5zaXRpb25zLCBvYnNlcnZlZFRyYW5zaXRpb25zKTsKKyAgICB9CisKKyAgICAvKiogQXNzZXJ0IHRoYXQgYSBsaWZlY3ljbGUgc2VxdWVuY2UgbWF0Y2hlcyBvbmUgb2YgdGhlIHBvc3NpYmxlIHZhcmlhbnRzLiAqLworICAgIHN0YXRpYyB2b2lkIGFzc2VydFNlcXVlbmNlTWF0Y2hlc09uZU9mKENsYXNzPD8gZXh0ZW5kcyBBY3Rpdml0eT4gYWN0aXZpdHlDbGFzcywKKyAgICAgICAgICAgIExpZmVjeWNsZUxvZyBsaWZlY3ljbGVMb2csIExpc3Q8TGlzdDxBY3Rpdml0eUNhbGxiYWNrPj4gZXhwZWN0ZWRUcmFuc2l0aW9ucywKKyAgICAgICAgICAgIFN0cmluZyB0cmFuc2l0aW9uKSB7CisgICAgICAgIGZpbmFsIExpc3Q8QWN0aXZpdHlDYWxsYmFjaz4gb2JzZXJ2ZWRUcmFuc2l0aW9ucyA9CisgICAgICAgICAgICAgICAgbGlmZWN5Y2xlTG9nLmdldEFjdGl2aXR5TG9nKGFjdGl2aXR5Q2xhc3MpOworICAgICAgICBsb2coIk9ic2VydmVkIHNlcXVlbmNlOiAiICsgb2JzZXJ2ZWRUcmFuc2l0aW9ucyk7CisgICAgICAgIGZpbmFsIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBlcnJvckR1cmluZ1RyYW5zaXRpb24oYWN0aXZpdHlDbGFzcywgdHJhbnNpdGlvbik7CisKKyAgICAgICAgYm9vbGVhbiBvbmVPZkV4cGVjdGVkU2VxdWVuY2VzT2JzZXJ2ZWQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChMaXN0PEFjdGl2aXR5Q2FsbGJhY2s+IHRyYW5zaXRpb25WYXJpYW50IDogZXhwZWN0ZWRUcmFuc2l0aW9ucykgeworICAgICAgICAgICAgaWYgKHRyYW5zaXRpb25WYXJpYW50LmVxdWFscyhvYnNlcnZlZFRyYW5zaXRpb25zKSkgeworICAgICAgICAgICAgICAgIG9uZU9mRXhwZWN0ZWRTZXF1ZW5jZXNPYnNlcnZlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZShlcnJvck1lc3NhZ2UgKyAiXG5PYnNlcnZlZCB0cmFuc2l0aW9uczogIiArIG9ic2VydmVkVHJhbnNpdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIlxuRXhwZWN0ZWQgb25lIG9mOiAiICsgZXhwZWN0ZWRUcmFuc2l0aW9ucywKKyAgICAgICAgICAgICAgICBvbmVPZkV4cGVjdGVkU2VxdWVuY2VzT2JzZXJ2ZWQpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFBhaXI8U3RyaW5nLCBBY3Rpdml0eUNhbGxiYWNrPiB0cmFuc2l0aW9uKAorICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIEFjdGl2aXR5PiBhY3Rpdml0eUNsYXNzLCBBY3Rpdml0eUNhbGxiYWNrIHN0YXRlKSB7CisgICAgICAgIHJldHVybiBuZXcgUGFpcjw+KGFjdGl2aXR5Q2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLCBzdGF0ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGVycm9yRHVyaW5nVHJhbnNpdGlvbihDbGFzczw/IGV4dGVuZHMgQWN0aXZpdHk+IGFjdGl2aXR5Q2xhc3MsCisgICAgICAgICAgICBTdHJpbmcgdHJhbnNpdGlvbikgeworICAgICAgICByZXR1cm4gIkZhaWxlZCB2ZXJpZmljYXRpb24gZHVyaW5nIG1vdmluZyBhY3Rpdml0eTogIiArIGFjdGl2aXR5Q2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgICAgICAgICAgICAgICAgKyAiIHRocm91Z2ggdHJhbnNpdGlvbjogIiArIHRyYW5zaXRpb247CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3Rlc3RzZGsyNS9BbmRyb2lkLm1rIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3Rlc3RzZGsyNS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMWMyYTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvdGVzdHNkazI1L0FuZHJvaWQubWsKQEAgLTAsMCArMSwzNCBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMgb3B0aW9uYWwKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0FjdGl2aXR5TWFuYWdlckRldmljZVNkazI1VGVzdENhc2VzCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykgXAorICAgIC4uL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9Bc3BlY3RSYXRpb1Rlc3RzQmFzZS5qYXZhCisKK0xPQ0FMX1NES19WRVJTSU9OIDo9IDI1CisKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCisgICAgYW5kcm9pZHgudGVzdC5ydWxlcworCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworCitpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvdGVzdHNkazI1L0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvdGVzdHNkazI1L0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQzZTUzOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci90ZXN0c2RrMjUvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDM2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iYW5kcm9pZC5zZXJ2ZXIuY3RzLmFtLnRlc3RzZGsyNSI+CisKKyAgICA8dXNlcy1zZGsgYW5kcm9pZDp0YXJnZXRTZGtWZXJzaW9uPSIyNSIgLz4KKworICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJDdHNBY3Rpdml0eU1hbmFnZXJEZXZpY2VTZGsyNVRlc3RDYXNlcyI+CisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgorCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnNlcnZlci5hbS5Bc3BlY3RSYXRpb1NkazI1VGVzdHMkU2RrMjVNYXhBc3BlY3RSYXRpb0FjdGl2aXR5IgorICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iU2RrMjVNYXhBc3BlY3RSYXRpb0FjdGl2aXR5IgorICAgICAgICAgICAgYW5kcm9pZDpyZXNpemVhYmxlQWN0aXZpdHk9ImZhbHNlIiAvPgorICAgIDwvYXBwbGljYXRpb24+CisKKyAgICA8aW5zdHJ1bWVudGF0aW9uCisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuc2VydmVyLmN0cy5hbS50ZXN0c2RrMjUiIC8+CisKKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvdGVzdHNkazI1L0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci90ZXN0c2RrMjUvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYmVjOWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvdGVzdHNkazI1L0FuZHJvaWRUZXN0LnhtbApAQCAtMCwwICsxLDI5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgQWN0aXZpdHlNYW5hZ2VyIFNESyAyNSBjb21wYXRpYmlsaXR5IHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CisgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJmcmFtZXdvcmsiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGFyZ2V0cHJlcC5Mb2NhdGlvbkNoZWNrIiAvPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJDdHNBY3Rpdml0eU1hbmFnZXJEZXZpY2VTZGsyNVRlc3RDYXNlcy5hcGsiIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkFuZHJvaWRKVW5pdFRlc3QiPgorICAgICAgICA8b3B0aW9uIG5hbWU9InBhY2thZ2UiIHZhbHVlPSJhbmRyb2lkLnNlcnZlci5jdHMuYW0udGVzdHNkazI1IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjFtIiAvPgorICAgIDwvdGVzdD4KKzwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci90ZXN0c2RrMjUvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0FzcGVjdFJhdGlvU2RrMjVUZXN0cy5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3Rlc3RzZGsyNS9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vQXNwZWN0UmF0aW9TZGsyNVRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q2YmQ0OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci90ZXN0c2RrMjUvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0FzcGVjdFJhdGlvU2RrMjVUZXN0cy5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW07CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlByZXN1Ym1pdDsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKKy8qKgorICogQnVpbGQ6IG1tbWEgLWozMiBjdHMvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyCisgKiBSdW46IGN0cy90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvdXRpbC9ydW4tdGVzdCBDdHNBY3Rpdml0eU1hbmFnZXJEZXZpY2VTZGsyNVRlc3RDYXNlcyBhbmRyb2lkLnNlcnZlci5hbS5Bc3BlY3RSYXRpb1NkazI1VGVzdHMKKyAqLworQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKK0BQcmVzdWJtaXQKK3B1YmxpYyBjbGFzcyBBc3BlY3RSYXRpb1NkazI1VGVzdHMgZXh0ZW5kcyBBc3BlY3RSYXRpb1Rlc3RzQmFzZSB7CisKKyAgICAvLyBNYXggc3VwcG9ydGVkIGFzcGVjdCByYXRpbyBmb3IgcHJlLU8gYXBwcy4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBNQVhfUFJFX09fQVNQRUNUX1JBVElPID0gMS44NmY7CisKKyAgICAvLyBUZXN0IHRhcmdldCBhY3Rpdml0eSB0aGF0IGhhcyB0YXJnZXRTZGs9IjI1IiBhbmQgcmVzaXplYWJsZUFjdGl2aXR5PSJmYWxzZSIuCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTZGsyNU1heEFzcGVjdFJhdGlvQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgfQorCisgICAgQFJ1bGUKKyAgICBwdWJsaWMgQWN0aXZpdHlUZXN0UnVsZTxTZGsyNU1heEFzcGVjdFJhdGlvQWN0aXZpdHk+IG1TZGsyNU1heEFzcGVjdFJhdGlvQWN0aXZpdHkgPQorICAgICAgICAgICAgbmV3IEFjdGl2aXR5VGVzdFJ1bGU8PihTZGsyNU1heEFzcGVjdFJhdGlvQWN0aXZpdHkuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGluaXRpYWxUb3VjaE1vZGUgKi8sIGZhbHNlIC8qIGxhdW5jaEFjdGl2aXR5ICovKTsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1heEFzcGVjdFJhdGlvUHJlT0FjdGl2aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJ1bkFzcGVjdFJhdGlvVGVzdChtU2RrMjVNYXhBc3BlY3RSYXRpb0FjdGl2aXR5LCBhY3R1YWwgLT4geworICAgICAgICAgICAgaWYgKGFzcGVjdFJhdGlvTGVzc1RoYW5FcXVhbChhY3R1YWwsIE1BWF9QUkVfT19BU1BFQ1RfUkFUSU8pKSByZXR1cm47CisgICAgICAgICAgICBmYWlsKCJhY3R1YWw9IiArIGFjdHVhbCArICIgaXMgZ3JlYXRlciB0aGFuIGV4cGVjdGVkPSIgKyBNQVhfUFJFX09fQVNQRUNUX1JBVElPKTsKKyAgICAgICAgfSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3RyYW5zbHVjZW50YXBwL0FuZHJvaWQubWsgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvdHJhbnNsdWNlbnRhcHAvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzMzMDZjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3RyYW5zbHVjZW50YXBwL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzNSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCisjIERvbid0IGluY2x1ZGUgdGhpcyBwYWNrYWdlIGluIGFueSB0YXJnZXQuCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY3RzLWFtLWFwcC1iYXNlCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpIFwKKyAgICAkKGNhbGwgYWxsLW5hbWVkLWZpbGVzLXVuZGVyLENvbXBvbmVudHMuamF2YSwuLi90cmFuc2x1Y2VudGFwcHNkazI2KSBcCisKK0xPQ0FMX1NES19WRVJTSU9OIDo9IHRlc3RfY3VycmVudAorCisjIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0CitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzRGV2aWNlVHJhbnNsdWNlbnRUZXN0QXBwCisKK2luY2x1ZGUgJChCVUlMRF9DVFNfU1VQUE9SVF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3RyYW5zbHVjZW50YXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvdHJhbnNsdWNlbnRhcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lZGY3MTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3RyYW5zbHVjZW50YXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwzMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAgfiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICB+CisgIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICB+CisgIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgfgorICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJhbmRyb2lkLnNlcnZlci5hbS50cmFuc2x1Y2VudGFwcCI+CisKKyAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpsYWJlbD0iQ3RzVHJhbnNsdWNlbnRBcHAiPgorICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iLlRyYW5zbHVjZW50TGFuZHNjYXBlQWN0aXZpdHkiCisgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpzY3JlZW5PcmllbnRhdGlvbj0ibGFuZHNjYXBlIgorICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuVHJhbnNsdWNlbnQuTm9UaXRsZUJhciI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgPC9hcHBsaWNhdGlvbj4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvdHJhbnNsdWNlbnRhcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL3RyYW5zbHVjZW50YXBwL0NvbXBvbmVudHMuamF2YSBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci90cmFuc2x1Y2VudGFwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vdHJhbnNsdWNlbnRhcHAvQ29tcG9uZW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3Y2Y1MmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvdHJhbnNsdWNlbnRhcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL3RyYW5zbHVjZW50YXBwL0NvbXBvbmVudHMuamF2YQpAQCAtMCwwICsxLDI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbS50cmFuc2x1Y2VudGFwcDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuc2VydmVyLmFtLmNvbXBvbmVudC5Db21wb25lbnRzQmFzZTsKKworcHVibGljIGNsYXNzIENvbXBvbmVudHMgZXh0ZW5kcyBDb21wb25lbnRzQmFzZSB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBvbmVudE5hbWUgVFJBTlNMVUNFTlRfTEFORFNDQVBFX0FDVElWSVRZID0KKyAgICAgICAgICAgIGNvbXBvbmVudChDb21wb25lbnRzLmNsYXNzLCAiVHJhbnNsdWNlbnRMYW5kc2NhcGVBY3Rpdml0eSIpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3RyYW5zbHVjZW50YXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS90cmFuc2x1Y2VudGFwcC9UcmFuc2x1Y2VudExhbmRzY2FwZUFjdGl2aXR5LmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvdHJhbnNsdWNlbnRhcHAvc3JjL2FuZHJvaWQvc2VydmVyL2FtL3RyYW5zbHVjZW50YXBwL1RyYW5zbHVjZW50TGFuZHNjYXBlQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDhkZTRlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3RyYW5zbHVjZW50YXBwL3NyYy9hbmRyb2lkL3NlcnZlci9hbS90cmFuc2x1Y2VudGFwcC9UcmFuc2x1Y2VudExhbmRzY2FwZUFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbS50cmFuc2x1Y2VudGFwcDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworCitwdWJsaWMgY2xhc3MgVHJhbnNsdWNlbnRMYW5kc2NhcGVBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci90cmFuc2x1Y2VudGFwcHNkazI2L0FuZHJvaWQubWsgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvdHJhbnNsdWNlbnRhcHBzZGsyNi9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZDZjNWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvdHJhbnNsdWNlbnRhcHBzZGsyNi9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzUgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworIyBEb24ndCBpbmNsdWRlIHRoaXMgcGFja2FnZSBpbiBhbnkgdGFyZ2V0LgorTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKKworTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGN0cy1hbS1hcHAtYmFzZQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKSBcCisgICAgJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCAuLi90cmFuc2x1Y2VudGFwcC9zcmMpIFwKKworTE9DQUxfU0RLX1ZFUlNJT04gOj0gMjYKKworIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0RldmljZVRyYW5zbHVjZW50VGVzdEFwcDI2CisKK2luY2x1ZGUgJChCVUlMRF9DVFNfU1VQUE9SVF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3RyYW5zbHVjZW50YXBwc2RrMjYvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci90cmFuc2x1Y2VudGFwcHNkazI2L0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzVjODZjYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci90cmFuc2x1Y2VudGFwcHNkazI2L0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwzMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAgfiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICB+CisgIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICB+CisgIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgfgorICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJhbmRyb2lkLnNlcnZlci5hbS50cmFuc2x1Y2VudGFwcDI2Ij4KKworICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJDdHNUcmFuc2x1Y2VudEFwcDI2Ij4KKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc2VydmVyLmFtLnRyYW5zbHVjZW50YXBwLlRyYW5zbHVjZW50TGFuZHNjYXBlQWN0aXZpdHkiCisgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpzY3JlZW5PcmllbnRhdGlvbj0ibGFuZHNjYXBlIgorICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuVHJhbnNsdWNlbnQuTm9UaXRsZUJhciI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgPC9hcHBsaWNhdGlvbj4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvdHJhbnNsdWNlbnRhcHBzZGsyNi9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vdHJhbnNsdWNlbnRhcHAyNi9Db21wb25lbnRzLmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvdHJhbnNsdWNlbnRhcHBzZGsyNi9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vdHJhbnNsdWNlbnRhcHAyNi9Db21wb25lbnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZkMDljNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci90cmFuc2x1Y2VudGFwcHNkazI2L3NyYy9hbmRyb2lkL3NlcnZlci9hbS90cmFuc2x1Y2VudGFwcDI2L0NvbXBvbmVudHMuamF2YQpAQCAtMCwwICsxLDI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbS50cmFuc2x1Y2VudGFwcDI2OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5zZXJ2ZXIuYW0uY29tcG9uZW50LkNvbXBvbmVudHNCYXNlOworCitwdWJsaWMgY2xhc3MgQ29tcG9uZW50cyBleHRlbmRzIENvbXBvbmVudHNCYXNlIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcG9uZW50TmFtZSBTREsyNl9UUkFOU0xVQ0VOVF9MQU5EU0NBUEVfQUNUSVZJVFkgPSBjb21wb25lbnQoCisgICAgICAgICAgICBDb21wb25lbnRzLmNsYXNzLAorICAgICAgICAgICAgImFuZHJvaWQuc2VydmVyLmFtLnRyYW5zbHVjZW50YXBwLlRyYW5zbHVjZW50TGFuZHNjYXBlQWN0aXZpdHkiKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci91dGlsL0FuZHJvaWQubWsgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvdXRpbC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZDM0MTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvdXRpbC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzggQEAKKyMgQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMgb3B0aW9uYWwKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykgXAorICAgICQoY2FsbCBhbGwtbmFtZWQtZmlsZXMtdW5kZXIsQ29tcG9uZW50cy5qYXZhLCAuLi9hcHApIFwKKyAgICAkKGNhbGwgYWxsLW5hbWVkLWZpbGVzLXVuZGVyLENvbXBvbmVudHNCYXNlLmphdmEsIC4uL2FwcF9iYXNlKQorCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAorICAgIHBsYXRmb3JtcHJvdG9zbmFubyBcCisgICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgXAorICAgIGFuZHJvaWR4LnRlc3QucnVsZXMgXAorICAgIGhhbWNyZXN0LWxpYnJhcnkKKworTE9DQUxfTU9EVUxFIDo9IGN0cy1hbXdtLXV0aWwKKworTE9DQUxfU0RLX1ZFUlNJT04gOj0gdGVzdF9jdXJyZW50CisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfSkFWQV9MSUJSQVJZKQorCitpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci91dGlsL3J1bi10ZXN0IGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3V0aWwvcnVuLXRlc3QKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGhvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL3V0aWwvcnVuLXRlc3QKcmVuYW1lIHRvIHRlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci91dGlsL3J1bi10ZXN0CmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvdXRpbC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlBbmRXaW5kb3dNYW5hZ2Vyc1N0YXRlLmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvdXRpbC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlBbmRXaW5kb3dNYW5hZ2Vyc1N0YXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUwM2Y5OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci91dGlsL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eUFuZFdpbmRvd01hbmFnZXJzU3RhdGUuamF2YQpAQCAtMCwwICsxLDg5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbTsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXIuU3RhY2tJZC5JTlZBTElEX1NUQUNLX0lEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5XaW5kb3dDb25maWd1cmF0aW9uLkFDVElWSVRZX1RZUEVfVU5ERUZJTkVEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5XaW5kb3dDb25maWd1cmF0aW9uLldJTkRPV0lOR19NT0RFX0ZSRUVGT1JNOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5XaW5kb3dDb25maWd1cmF0aW9uLldJTkRPV0lOR19NT0RFX1BJTk5FRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuV2luZG93Q29uZmlndXJhdGlvbi5XSU5ET1dJTkdfTU9ERV9TUExJVF9TQ1JFRU5fUFJJTUFSWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuV2luZG93Q29uZmlndXJhdGlvbi5XSU5ET1dJTkdfTU9ERV9VTkRFRklORUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm8uUkVTSVpFX01PREVfUkVTSVpFQUJMRTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50TmFtZVV0aWxzLmdldEFjdGl2aXR5TmFtZTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50TmFtZVV0aWxzLmdldFdpbmRvd05hbWU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLlN0YXRlTG9nZ2VyLmxvZzsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uU3RhdGVMb2dnZXIubG9nQWx3YXlzOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5TdGF0ZUxvZ2dlci5sb2dFOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3MuREVOU0lUWV9ERUZBVUxUOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuRGlzcGxheS5ERUZBVUxUX0RJU1BMQVk7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmdyZWF0ZXJUaGFuOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMubGVzc1RoYW47CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnNlcnZlci5hbS5BY3Rpdml0eU1hbmFnZXJTdGF0ZS5BY3Rpdml0eVN0YWNrOworaW1wb3J0IGFuZHJvaWQuc2VydmVyLmFtLkFjdGl2aXR5TWFuYWdlclN0YXRlLkFjdGl2aXR5VGFzazsKK2ltcG9ydCBhbmRyb2lkLnNlcnZlci5hbS5XaW5kb3dNYW5hZ2VyU3RhdGUuRGlzcGxheTsKK2ltcG9ydCBhbmRyb2lkLnNlcnZlci5hbS5XaW5kb3dNYW5hZ2VyU3RhdGUuV2luZG93U3RhY2s7CitpbXBvcnQgYW5kcm9pZC5zZXJ2ZXIuYW0uV2luZG93TWFuYWdlclN0YXRlLldpbmRvd1N0YXRlOworaW1wb3J0IGFuZHJvaWQuc2VydmVyLmFtLldpbmRvd01hbmFnZXJTdGF0ZS5XaW5kb3dUYXNrOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQmlQcmVkaWNhdGU7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkJvb2xlYW5TdXBwbGllcjsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworLyoqCisgKiBDb21iaW5lZCBzdGF0ZSBvZiB0aGUgYWN0aXZpdHkgbWFuYWdlciBhbmQgd2luZG93IG1hbmFnZXIuCisgKi8KK3B1YmxpYyBjbGFzcyBBY3Rpdml0eUFuZFdpbmRvd01hbmFnZXJzU3RhdGUgeworCisgICAgLy8gRGVmYXVsdCBtaW5pbWFsIHNpemUgb2YgcmVzaXphYmxlIHRhc2ssIHVzZWQgaWYgbm9uZSBpcyBzZXQgZXhwbGljaXRseS4KKyAgICAvLyBNdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoICdkZWZhdWx0X21pbmltYWxfc2l6ZV9yZXNpemFibGVfdGFzaycgZGltZW4gZnJvbSBmcmFtZXdvcmtzL2Jhc2UuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfUkVTSVpBQkxFX1RBU0tfU0laRV9EUCA9IDIyMDsKKworICAgIC8vIERlZmF1bHQgbWluaW1hbCBzaXplIG9mIGEgcmVzaXphYmxlIFBpUCB0YXNrLCB1c2VkIGlmIG5vbmUgaXMgc2V0IGV4cGxpY2l0bHkuCisgICAgLy8gTXVzdCBiZSBrZXB0IGluIHN5bmMgd2l0aCAnZGVmYXVsdF9taW5pbWFsX3NpemVfcGlwX3Jlc2l6YWJsZV90YXNrJyBkaW1lbiBmcm9tCisgICAgLy8gZnJhbWV3b3Jrcy9iYXNlLgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1BJUF9SRVNJWkFCTEVfVEFTS19TSVpFX0RQID0gMTA4OworCisgICAgcHJpdmF0ZSBmaW5hbCBBY3Rpdml0eU1hbmFnZXJTdGF0ZSBtQW1TdGF0ZSA9IG5ldyBBY3Rpdml0eU1hbmFnZXJTdGF0ZSgpOworICAgIHByaXZhdGUgZmluYWwgV2luZG93TWFuYWdlclN0YXRlIG1XbVN0YXRlID0gbmV3IFdpbmRvd01hbmFnZXJTdGF0ZSgpOworCisgICAgLyoqCisgICAgICogQ29tcHV0ZSBBTSBhbmQgV00gc3RhdGUgb2YgZGV2aWNlLCBjaGVjayBzYW5pdHkgYW5kIGJvdW5kcy4KKyAgICAgKiBXTSBzdGF0ZSB3aWxsIGluY2x1ZGUgb25seSB2aXNpYmxlIHdpbmRvd3MsIHN0YWNrIGFuZCB0YXNrIGJvdW5kcyB3aWxsIGJlIGNvbXBhcmVkLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbXBvbmVudE5hbWVzIGFycmF5IG9mIGFjdGl2aXR5IG5hbWVzIHRvIHdhaXQgZm9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvbXB1dGVTdGF0ZShDb21wb25lbnROYW1lLi4uIGNvbXBvbmVudE5hbWVzKSB7CisgICAgICAgIHdhaXRGb3JWYWxpZFN0YXRlKHRydWUgLyogY29tcGFyZVRhc2tBbmRTdGFja0JvdW5kcyAqLywKKyAgICAgICAgICAgICAgICBBcnJheXMuc3RyZWFtKGNvbXBvbmVudE5hbWVzKQorICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChXYWl0Rm9yVmFsaWRBY3Rpdml0eVN0YXRlOjpuZXcpCisgICAgICAgICAgICAgICAgICAgICAgICAudG9BcnJheShXYWl0Rm9yVmFsaWRBY3Rpdml0eVN0YXRlW106Om5ldykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXB1dGUgQU0gYW5kIFdNIHN0YXRlIG9mIGRldmljZSwgY2hlY2sgc2FuaXR5IGFuZCBib3VuZHMuCisgICAgICogV00gc3RhdGUgd2lsbCBpbmNsdWRlIG9ubHkgdmlzaWJsZSB3aW5kb3dzLCBzdGFjayBhbmQgdGFzayBib3VuZHMgd2lsbCBiZSBjb21wYXJlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3YWl0Rm9yQWN0aXZpdGllc1Zpc2libGUgYXJyYXkgb2YgYWN0aXZpdHkgbmFtZXMgdG8gd2FpdCBmb3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY29tcHV0ZVN0YXRlKFdhaXRGb3JWYWxpZEFjdGl2aXR5U3RhdGUuLi4gd2FpdEZvckFjdGl2aXRpZXNWaXNpYmxlKSB7CisgICAgICAgIHdhaXRGb3JWYWxpZFN0YXRlKHRydWUgLyogY29tcGFyZVRhc2tBbmRTdGFja0JvdW5kcyAqLywgd2FpdEZvckFjdGl2aXRpZXNWaXNpYmxlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wdXRlIEFNIGFuZCBXTSBzdGF0ZSBvZiBkZXZpY2UsIGNoZWNrIHNhbml0eSBhbmQgYm91bmRzLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbXBhcmVUYXNrQW5kU3RhY2tCb3VuZHMgcGFzcyAndHJ1ZScgaWYgc3RhY2sgYW5kIHRhc2sgYm91bmRzIHNob3VsZCBiZSBjb21wYXJlZCwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmFsc2UnIG90aGVyd2lzZS4KKyAgICAgKiBAcGFyYW0gd2FpdEZvckFjdGl2aXRpZXNWaXNpYmxlICBhcnJheSBvZiBhY3Rpdml0eSBzdGF0ZXMgdG8gd2FpdCBmb3IuCisgICAgICovCisgICAgdm9pZCBjb21wdXRlU3RhdGUoYm9vbGVhbiBjb21wYXJlVGFza0FuZFN0YWNrQm91bmRzLAorICAgICAgICAgICAgV2FpdEZvclZhbGlkQWN0aXZpdHlTdGF0ZS4uLiB3YWl0Rm9yQWN0aXZpdGllc1Zpc2libGUpIHsKKyAgICAgICAgd2FpdEZvclZhbGlkU3RhdGUoY29tcGFyZVRhc2tBbmRTdGFja0JvdW5kcywgd2FpdEZvckFjdGl2aXRpZXNWaXNpYmxlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXYWl0IGZvciB0aGUgYWN0aXZpdGllcyB0byBhcHBlYXIgYW5kIGZvciB2YWxpZCBzdGF0ZSBpbiBBTSBhbmQgV00uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWN0aXZpdHlOYW1lcyBuYW1lIGxpc3Qgb2YgYWN0aXZpdGllcyB0byB3YWl0IGZvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3YWl0Rm9yVmFsaWRTdGF0ZShDb21wb25lbnROYW1lLi4uIGFjdGl2aXR5TmFtZXMpIHsKKyAgICAgICAgd2FpdEZvclZhbGlkU3RhdGUoZmFsc2UgLyogY29tcGFyZVRhc2tBbmRTdGFja0JvdW5kcyAqLywKKyAgICAgICAgICAgICAgICBBcnJheXMuc3RyZWFtKGFjdGl2aXR5TmFtZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAubWFwKFdhaXRGb3JWYWxpZEFjdGl2aXR5U3RhdGU6Om5ldykKKyAgICAgICAgICAgICAgICAgICAgICAgIC50b0FycmF5KFdhaXRGb3JWYWxpZEFjdGl2aXR5U3RhdGVbXTo6bmV3KSk7CisKKyAgICB9CisKKyAgICAvKiogV2FpdCBmb3IgdGhlIGFjdGl2aXR5IHRvIGFwcGVhciBhbmQgZm9yIHZhbGlkIHN0YXRlIGluIEFNIGFuZCBXTS4gKi8KKyAgICB2b2lkIHdhaXRGb3JWYWxpZFN0YXRlKFdhaXRGb3JWYWxpZEFjdGl2aXR5U3RhdGUuLi4gd2FpdEZvckFjdGl2aXR5VmlzaWJsZSkgeworICAgICAgICB3YWl0Rm9yVmFsaWRTdGF0ZShmYWxzZSAvKiBjb21wYXJlVGFza0FuZFN0YWNrQm91bmRzICovLCB3YWl0Rm9yQWN0aXZpdHlWaXNpYmxlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXYWl0IGZvciB0aGUgYWN0aXZpdGllcyB0byBhcHBlYXIgaW4gcHJvcGVyIHN0YWNrcyBhbmQgZm9yIHZhbGlkIHN0YXRlIGluIEFNIGFuZCBXTS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb21wYXJlVGFza0FuZFN0YWNrQm91bmRzIGZsYWcgaW5kaWNhdGluZyBpZiB3ZSBzaG91bGQgY29tcGFyZSB0YXNrIGFuZCBzdGFjayBib3VuZHMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgZXF1YWxpdHkuCisgICAgICogQHBhcmFtIHdhaXRGb3JBY3Rpdml0aWVzVmlzaWJsZSAgYXJyYXkgb2YgYWN0aXZpdHkgc3RhdGVzIHRvIHdhaXQgZm9yLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB3YWl0Rm9yVmFsaWRTdGF0ZShib29sZWFuIGNvbXBhcmVUYXNrQW5kU3RhY2tCb3VuZHMsCisgICAgICAgICAgICBXYWl0Rm9yVmFsaWRBY3Rpdml0eVN0YXRlLi4uIHdhaXRGb3JBY3Rpdml0aWVzVmlzaWJsZSkgeworICAgICAgICBmb3IgKGludCByZXRyeSA9IDE7IHJldHJ5IDw9IDU7IHJldHJ5KyspIHsKKyAgICAgICAgICAgIC8vIFRPRE86IEdldCBzdGF0ZSBvZiBBTSBhbmQgV00gYXQgdGhlIHNhbWUgdGltZSB0byBhdm9pZCBtaXNtYXRjaGVzIGNhdXNlZCBieQorICAgICAgICAgICAgLy8gcmVxdWVzdGluZyBkdW1wIGluIHNvbWUgaW50ZXJtZWRpYXRlIHN0YXRlLgorICAgICAgICAgICAgbUFtU3RhdGUuY29tcHV0ZVN0YXRlKCk7CisgICAgICAgICAgICBtV21TdGF0ZS5jb21wdXRlU3RhdGUoKTsKKyAgICAgICAgICAgIGlmIChzaG91bGRXYWl0Rm9yU2FuaXR5Q2hlY2soY29tcGFyZVRhc2tBbmRTdGFja0JvdW5kcykKKyAgICAgICAgICAgICAgICAgICAgfHwgc2hvdWxkV2FpdEZvclZhbGlkU3RhY2tzKGNvbXBhcmVUYXNrQW5kU3RhY2tCb3VuZHMpCisgICAgICAgICAgICAgICAgICAgIHx8IHNob3VsZFdhaXRGb3JBY3Rpdml0aWVzKHdhaXRGb3JBY3Rpdml0aWVzVmlzaWJsZSkKKyAgICAgICAgICAgICAgICAgICAgfHwgc2hvdWxkV2FpdEZvcldpbmRvd3MoKSkgeworICAgICAgICAgICAgICAgIGxvZ0Fsd2F5cygiKioqV2FpdGluZyBmb3IgdmFsaWQgc3RhY2tzIGFuZCBhY3Rpdml0aWVzIHN0YXRlcy4uLiByZXRyeT0iICsgcmV0cnkpOworICAgICAgICAgICAgICAgIFN5c3RlbUNsb2NrLnNsZWVwKDEwMDApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbG9nRSgiKioqV2FpdGluZyBmb3Igc3RhdGVzIGZhaWxlZDogIiArIEFycmF5cy50b1N0cmluZyh3YWl0Rm9yQWN0aXZpdGllc1Zpc2libGUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmVzIGFsbCBleGl0aW5nIHdpbmRvd3MgaGF2ZSBiZWVuIHJlbW92ZWQuCisgICAgICovCisgICAgdm9pZCB3YWl0Rm9yQWxsRXhpdGluZ1dpbmRvd3MoKSB7CisgICAgICAgIExpc3Q8V2luZG93U3RhdGU+IGV4aXRpbmdXaW5kb3dzID0gbnVsbDsKKyAgICAgICAgZm9yIChpbnQgcmV0cnkgPSAxOyByZXRyeSA8PSA1OyByZXRyeSsrKSB7CisgICAgICAgICAgICBtV21TdGF0ZS5jb21wdXRlU3RhdGUoKTsKKyAgICAgICAgICAgIGV4aXRpbmdXaW5kb3dzID0gbVdtU3RhdGUuZ2V0RXhpdGluZ1dpbmRvd3MoKTsKKyAgICAgICAgICAgIGlmIChleGl0aW5nV2luZG93cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2dBbHdheXMoIioqKldhaXRpbmcgZm9yIGFsbCBleGl0aW5nIHdpbmRvd3MgaGF2ZSBiZWVuIHJlbW92ZWQuLi4gcmV0cnk9IiArIHJldHJ5KTsKKyAgICAgICAgICAgIFN5c3RlbUNsb2NrLnNsZWVwKDEwMDApOworICAgICAgICB9CisgICAgICAgIGZhaWwoIkFsbCBleGl0aW5nIHdpbmRvd3MgaGF2ZSBiZWVuIHJlbW92ZWQsIGFjdHVhbD0iICsgZXhpdGluZ1dpbmRvd3Muc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAubWFwKFdpbmRvd1N0YXRlOjpnZXROYW1lKQorICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygiLCIpKSk7CisgICAgfQorCisgICAgdm9pZCB3YWl0Rm9yQWxsU3RvcHBlZEFjdGl2aXRpZXMoKSB7CisgICAgICAgIGZvciAoaW50IHJldHJ5ID0gMTsgcmV0cnkgPD0gNTsgcmV0cnkrKykgeworICAgICAgICAgICAgbUFtU3RhdGUuY29tcHV0ZVN0YXRlKCk7CisgICAgICAgICAgICBpZiAoIW1BbVN0YXRlLmNvbnRhaW5zU3RhcnRlZEFjdGl2aXRpZXMoKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvZ0Fsd2F5cygiKioqV2FpdGluZyBmb3IgYWxsIHN0YXJ0ZWQgYWN0aXZpdGllcyBoYXZlIGJlZW4gcmVtb3ZlZC4uLiByZXRyeT0iICsgcmV0cnkpOworICAgICAgICAgICAgU3lzdGVtQ2xvY2suc2xlZXAoMTUwMCk7CisgICAgICAgIH0KKyAgICAgICAgZmFpbCgiQWxsIHN0YXJ0ZWQgYWN0aXZpdGllcyBoYXZlIGJlZW4gcmVtb3ZlZCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXB1dGUgQU0gYW5kIFdNIHN0YXRlIG9mIGRldmljZSwgd2FpdCBmb3IgdGhlIGFjdGl2aXR5IHJlY29yZHMgdG8gYmUgYWRkZWQsIGFuZAorICAgICAqIHdhaXQgZm9yIGRlYnVnZ2VyIHdpbmRvdyB0byBzaG93IHVwLgorICAgICAqCisgICAgICogVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4gc3RhcnRpbmcgd2l0aCAtRCAoZGVidWdnZXIpIG9wdGlvbiwgd2hlcmUgd2UgcG9wIHVwIHRoZQorICAgICAqIHdhaXRpbmctZm9yLWRlYnVnZ2VyIHdpbmRvdywgYnV0IHJlYWwgYWN0aXZpdHkgd2luZG93IHdvbid0IHNob3cgdXAgc2luY2Ugd2UncmUgd2FpdGluZworICAgICAqIGZvciBkZWJ1Z2dlci4KKyAgICAgKi8KKyAgICB2b2lkIHdhaXRGb3JEZWJ1Z2dlcldpbmRvd1Zpc2libGUoQ29tcG9uZW50TmFtZSBhY3Rpdml0eU5hbWUpIHsKKyAgICAgICAgZm9yIChpbnQgcmV0cnkgPSAxOyByZXRyeSA8PSA1OyByZXRyeSsrKSB7CisgICAgICAgICAgICBtQW1TdGF0ZS5jb21wdXRlU3RhdGUoKTsKKyAgICAgICAgICAgIG1XbVN0YXRlLmNvbXB1dGVTdGF0ZSgpOworICAgICAgICAgICAgaWYgKHNob3VsZFdhaXRGb3JEZWJ1Z2dlcldpbmRvdyhhY3Rpdml0eU5hbWUpCisgICAgICAgICAgICAgICAgICAgIHx8IHNob3VsZFdhaXRGb3JBY3Rpdml0eVJlY29yZHMoYWN0aXZpdHlOYW1lKSkgeworICAgICAgICAgICAgICAgIGxvZ0Fsd2F5cygiKioqV2FpdGluZyBmb3IgZGVidWdnZXIgd2luZG93Li4uIHJldHJ5PSIgKyByZXRyeSk7CisgICAgICAgICAgICAgICAgU3lzdGVtQ2xvY2suc2xlZXAoMTAwMCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBsb2dFKCIqKipXYWl0aW5nIGZvciBkZWJ1Z2dlciB3aW5kb3cgZmFpbGVkIik7CisgICAgfQorCisgICAgYm9vbGVhbiB3YWl0Rm9ySG9tZUFjdGl2aXR5VmlzaWJsZSgpIHsKKyAgICAgICAgQ29tcG9uZW50TmFtZSBob21lQWN0aXZpdHkgPSBtQW1TdGF0ZS5nZXRIb21lQWN0aXZpdHlOYW1lKCk7CisgICAgICAgIC8vIFNvbWV0aW1lcyB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBiZWZvcmUgd2Uga25vdyB3aGF0IEhvbWUgQWN0aXZpdHkgaXMKKyAgICAgICAgaWYgKGhvbWVBY3Rpdml0eSA9PSBudWxsKSB7CisgICAgICAgICAgICBsb2dBbHdheXMoIkNvbXB1dGluZyBzdGF0ZSB0byBkZXRlcm1pbmUgSG9tZSBBY3Rpdml0eSIpOworICAgICAgICAgICAgY29tcHV0ZVN0YXRlKHRydWUpOworICAgICAgICAgICAgaG9tZUFjdGl2aXR5ID0gbUFtU3RhdGUuZ2V0SG9tZUFjdGl2aXR5TmFtZSgpOworICAgICAgICB9CisgICAgICAgIGFzc2VydE5vdE51bGwoImhvbWVBY3Rpdml0eSBzaG91bGQgbm90IGJlIG51bGwiLCBob21lQWN0aXZpdHkpOworICAgICAgICB3YWl0Rm9yVmFsaWRTdGF0ZShob21lQWN0aXZpdHkpOworICAgICAgICByZXR1cm4gbUFtU3RhdGUuaXNIb21lQWN0aXZpdHlWaXNpYmxlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0cnVlIGlmIHJlY2VudHMgYWN0aXZpdHkgaXMgdmlzaWJsZS4gRGV2aWNlcyB3aXRob3V0IHJlY2VudHMgd2lsbCByZXR1cm4gZmFsc2UKKyAgICAgKi8KKyAgICBib29sZWFuIHdhaXRGb3JSZWNlbnRzQWN0aXZpdHlWaXNpYmxlKCkgeworICAgICAgICBpZiAobUFtU3RhdGUuaXNIb21lUmVjZW50c0NvbXBvbmVudCgpKSB7CisgICAgICAgICAgICByZXR1cm4gd2FpdEZvckhvbWVBY3Rpdml0eVZpc2libGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHdhaXRGb3JXaXRoQW1TdGF0ZShBY3Rpdml0eU1hbmFnZXJTdGF0ZTo6aXNSZWNlbnRzQWN0aXZpdHlWaXNpYmxlLAorICAgICAgICAgICAgICAgICIqKipXYWl0aW5nIGZvciByZWNlbnRzIGFjdGl2aXR5IHRvIGJlIHZpc2libGUuLi4iKTsKKyAgICAgICAgcmV0dXJuIG1BbVN0YXRlLmlzUmVjZW50c0FjdGl2aXR5VmlzaWJsZSgpOworICAgIH0KKworICAgIHZvaWQgd2FpdEZvcktleWd1YXJkU2hvd2luZ0FuZE5vdE9jY2x1ZGVkKCkgeworICAgICAgICB3YWl0Rm9yV2l0aEFtU3RhdGUoc3RhdGUgLT4gc3RhdGUuZ2V0S2V5Z3VhcmRDb250cm9sbGVyU3RhdGUoKS5rZXlndWFyZFNob3dpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICFzdGF0ZS5nZXRLZXlndWFyZENvbnRyb2xsZXJTdGF0ZSgpLmtleWd1YXJkT2NjbHVkZWQsCisgICAgICAgICAgICAgICAgIioqKldhaXRpbmcgZm9yIEtleWd1YXJkIHNob3dpbmcuLi4iKTsKKyAgICB9CisKKyAgICB2b2lkIHdhaXRGb3JLZXlndWFyZFNob3dpbmdBbmRPY2NsdWRlZCgpIHsKKyAgICAgICAgd2FpdEZvcldpdGhBbVN0YXRlKHN0YXRlIC0+IHN0YXRlLmdldEtleWd1YXJkQ29udHJvbGxlclN0YXRlKCkua2V5Z3VhcmRTaG93aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBzdGF0ZS5nZXRLZXlndWFyZENvbnRyb2xsZXJTdGF0ZSgpLmtleWd1YXJkT2NjbHVkZWQsCisgICAgICAgICAgICAgICAgIioqKldhaXRpbmcgZm9yIEtleWd1YXJkIHNob3dpbmcgYW5kIG9jY2x1ZGVkLi4uIik7CisgICAgfQorCisgICAgdm9pZCB3YWl0Rm9yS2V5Z3VhcmRHb25lKCkgeworICAgICAgICB3YWl0Rm9yV2l0aEFtU3RhdGUoc3RhdGUgLT4gIXN0YXRlLmdldEtleWd1YXJkQ29udHJvbGxlclN0YXRlKCkua2V5Z3VhcmRTaG93aW5nLAorICAgICAgICAgICAgICAgICIqKipXYWl0aW5nIGZvciBLZXlndWFyZCBnb25lLi4uIik7CisgICAgfQorCisgICAgLyoqIFdhaXQgZm9yIHNwZWNpZmljIHJvdGF0aW9uIGZvciB0aGUgZGVmYXVsdCBkaXNwbGF5LiBWYWx1ZXMgYXJlIFN1cmZhY2UjUm90YXRpb24gKi8KKyAgICB2b2lkIHdhaXRGb3JSb3RhdGlvbihpbnQgcm90YXRpb24pIHsKKyAgICAgICAgd2FpdEZvcldpdGhXbVN0YXRlKHN0YXRlIC0+IHN0YXRlLmdldFJvdGF0aW9uKCkgPT0gcm90YXRpb24sCisgICAgICAgICAgICAgICAgIioqKldhaXRpbmcgZm9yIFJvdGF0aW9uOiAiICsgcm90YXRpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdhaXQgZm9yIHNwZWNpZmljIG9yaWVudGF0aW9uIGZvciB0aGUgZGVmYXVsdCBkaXNwbGF5LgorICAgICAqIFZhbHVlcyBhcmUgQWN0aXZpdHlJbmZvLlNjcmVlbk9yaWVudGF0aW9uCisgICAgICovCisgICAgdm9pZCB3YWl0Rm9yTGFzdE9yaWVudGF0aW9uKGludCBvcmllbnRhdGlvbikgeworICAgICAgICB3YWl0Rm9yV2l0aFdtU3RhdGUoc3RhdGUgLT4gc3RhdGUuZ2V0TGFzdE9yaWVudGF0aW9uKCkgPT0gb3JpZW50YXRpb24sCisgICAgICAgICAgICAgICAgIioqKldhaXRpbmcgZm9yIExhc3RPcmllbnRhdGlvbjogIiArIG9yaWVudGF0aW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXYWl0IGZvciBvcmllbnRhdGlvbiBmb3IgdGhlIEFjdGl2aXR5CisgICAgICovCisgICAgdm9pZCB3YWl0Rm9yQWN0aXZpdHlPcmllbnRhdGlvbihDb21wb25lbnROYW1lIGFjdGl2aXR5TmFtZSwgaW50IG9yaWVudGF0aW9uKSB7CisgICAgICAgIHdhaXRGb3JXaXRoQW1TdGF0ZShhbVN0YXRlIC0+IHsKKyAgICAgICAgICAgIGZpbmFsIEFjdGl2aXR5VGFzayB0YXNrID0gYW1TdGF0ZS5nZXRUYXNrQnlBY3Rpdml0eShhY3Rpdml0eU5hbWUpOworICAgICAgICAgICAgaWYgKHRhc2sgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0YXNrLm1GdWxsQ29uZmlndXJhdGlvbi5vcmllbnRhdGlvbiA9PSBvcmllbnRhdGlvbjsKKyAgICAgICAgfSwgIioqKldhaXRpbmcgZm9yIEFjdGl2aXR5IG9yaWVudGF0aW9uOiAiICsgb3JpZW50YXRpb24pOworICAgIH0KKworICAgIHZvaWQgd2FpdEZvckRpc3BsYXlVbmZyb3plbigpIHsKKyAgICAgICAgd2FpdEZvcldpdGhXbVN0YXRlKHN0YXRlIC0+ICFzdGF0ZS5pc0Rpc3BsYXlGcm96ZW4oKSwKKyAgICAgICAgICAgICAgICAiKioqV2FpdGluZyBmb3IgRGlzcGxheSB1bmZyb3plbiIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdhaXRGb3JBY3Rpdml0eVN0YXRlKENvbXBvbmVudE5hbWUgYWN0aXZpdHlOYW1lLCBTdHJpbmcgYWN0aXZpdHlTdGF0ZSkgeworICAgICAgICB3YWl0Rm9yV2l0aEFtU3RhdGUoc3RhdGUgLT4gc3RhdGUuaGFzQWN0aXZpdHlTdGF0ZShhY3Rpdml0eU5hbWUsIGFjdGl2aXR5U3RhdGUpLAorICAgICAgICAgICAgICAgICIqKipXYWl0aW5nIGZvciBBY3Rpdml0eSBTdGF0ZTogIiArIGFjdGl2aXR5U3RhdGUpOworICAgIH0KKworICAgIEBEZXByZWNhdGVkCisgICAgdm9pZCB3YWl0Rm9yRm9jdXNlZFN0YWNrKGludCBzdGFja0lkKSB7CisgICAgICAgIHdhaXRGb3JXaXRoQW1TdGF0ZShzdGF0ZSAtPiBzdGF0ZS5nZXRGb2N1c2VkU3RhY2tJZCgpID09IHN0YWNrSWQsCisgICAgICAgICAgICAgICAgIioqKldhaXRpbmcgZm9yIGZvY3VzZWQgc3RhY2suLi4iKTsKKyAgICB9CisKKyAgICB2b2lkIHdhaXRGb3JGb2N1c2VkU3RhY2soaW50IHdpbmRvd2luZ01vZGUsIGludCBhY3Rpdml0eVR5cGUpIHsKKyAgICAgICAgd2FpdEZvcldpdGhBbVN0YXRlKHN0YXRlIC0+CisgICAgICAgICAgICAgICAgICAgICAgICAoYWN0aXZpdHlUeXBlID09IEFDVElWSVRZX1RZUEVfVU5ERUZJTkVECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHN0YXRlLmdldEZvY3VzZWRTdGFja0FjdGl2aXR5VHlwZSgpID09IGFjdGl2aXR5VHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICh3aW5kb3dpbmdNb2RlID09IFdJTkRPV0lOR19NT0RFX1VOREVGSU5FRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBzdGF0ZS5nZXRGb2N1c2VkU3RhY2tXaW5kb3dpbmdNb2RlKCkgPT0gd2luZG93aW5nTW9kZSksCisgICAgICAgICAgICAgICAgIioqKldhaXRpbmcgZm9yIGZvY3VzZWQgc3RhY2suLi4iKTsKKyAgICB9CisKKyAgICB2b2lkIHdhaXRGb3JBcHBUcmFuc2l0aW9uSWRsZSgpIHsKKyAgICAgICAgd2FpdEZvcldpdGhXbVN0YXRlKAorICAgICAgICAgICAgICAgIHN0YXRlIC0+IFdpbmRvd01hbmFnZXJTdGF0ZS5BUFBfU1RBVEVfSURMRS5lcXVhbHMoc3RhdGUuZ2V0QXBwVHJhbnNpdGlvblN0YXRlKCkpLAorICAgICAgICAgICAgICAgICIqKipXYWl0aW5nIGZvciBhcHAgdHJhbnNpdGlvbiBpZGxlLi4uIik7CisgICAgfQorCisgICAgdm9pZCB3YWl0Rm9yV2l0aEFtU3RhdGUoUHJlZGljYXRlPEFjdGl2aXR5TWFuYWdlclN0YXRlPiB3YWl0Q29uZGl0aW9uLCBTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICB3YWl0Rm9yKChhbVN0YXRlLCB3bVN0YXRlKSAtPiB3YWl0Q29uZGl0aW9uLnRlc3QoYW1TdGF0ZSksIG1lc3NhZ2UpOworICAgIH0KKworICAgIHZvaWQgd2FpdEZvcldpdGhXbVN0YXRlKFByZWRpY2F0ZTxXaW5kb3dNYW5hZ2VyU3RhdGU+IHdhaXRDb25kaXRpb24sIFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIHdhaXRGb3IoKGFtU3RhdGUsIHdtU3RhdGUpIC0+IHdhaXRDb25kaXRpb24udGVzdCh3bVN0YXRlKSwgbWVzc2FnZSk7CisgICAgfQorCisgICAgdm9pZCB3YWl0Rm9yKAorICAgICAgICAgICAgQmlQcmVkaWNhdGU8QWN0aXZpdHlNYW5hZ2VyU3RhdGUsIFdpbmRvd01hbmFnZXJTdGF0ZT4gd2FpdENvbmRpdGlvbiwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgd2FpdEZvcihtZXNzYWdlLCAoKSAtPiB7CisgICAgICAgICAgICBtQW1TdGF0ZS5jb21wdXRlU3RhdGUoKTsKKyAgICAgICAgICAgIG1XbVN0YXRlLmNvbXB1dGVTdGF0ZSgpOworICAgICAgICAgICAgcmV0dXJuIHdhaXRDb25kaXRpb24udGVzdChtQW1TdGF0ZSwgbVdtU3RhdGUpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICB2b2lkIHdhaXRGb3IoU3RyaW5nIG1lc3NhZ2UsIEJvb2xlYW5TdXBwbGllciB3YWl0Q29uZGl0aW9uKSB7CisgICAgICAgIGZvciAoaW50IHJldHJ5ID0gMTsgcmV0cnkgPD0gNTsgcmV0cnkrKykgeworICAgICAgICAgICAgaWYgKHdhaXRDb25kaXRpb24uZ2V0QXNCb29sZWFuKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2dBbHdheXMobWVzc2FnZSArICIgcmV0cnk9IiArIHJldHJ5KTsKKyAgICAgICAgICAgIFN5c3RlbUNsb2NrLnNsZWVwKDEwMDApOworICAgICAgICB9CisgICAgICAgIGxvZ0UobWVzc2FnZSArICIgZmFpbGVkIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0cnVlIGlmIHNob3VsZCB3YWl0IGZvciB2YWxpZCBzdGFja3Mgc3RhdGUuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHNob3VsZFdhaXRGb3JWYWxpZFN0YWNrcyhib29sZWFuIGNvbXBhcmVUYXNrQW5kU3RhY2tCb3VuZHMpIHsKKyAgICAgICAgaWYgKCF0YXNrTGlzdHNJbkFtQW5kV21BcmVFcXVhbCgpKSB7CisgICAgICAgICAgICAvLyBXZSB3YW50IHRvIHdhaXQgZm9yIGVxdWFsIHRhc2sgbGlzdHMgaW4gQU0gYW5kIFdNIGluIGNhc2Ugd2UgY2F1Z2h0IHRoZW0gaW4gdGhlCisgICAgICAgICAgICAvLyBtaWRkbGUgb2Ygc29tZSBzdGF0ZSBjaGFuZ2Ugb3BlcmF0aW9ucy4KKyAgICAgICAgICAgIGxvZ0Fsd2F5cygiKioqdGFza0xpc3RzSW5BbUFuZFdtQXJlRXF1YWw9ZmFsc2UiKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmICghc3RhY2tCb3VuZHNJbkFNQW5kV01BcmVFcXVhbCgpKSB7CisgICAgICAgICAgICAvLyBXZSB3YW50IHRvIHdhaXQgYSBsaXR0bGUgZm9yIHRoZSBzdGFja3MgaW4gQU0gYW5kIFdNIHRvIGhhdmUgZXF1YWwgYm91bmRzIGFzIHRoZXJlCisgICAgICAgICAgICAvLyBtaWdodCBiZSBhIHRyYW5zaXRpb24gYW5pbWF0aW9uIG9uZ29pbmcgd2hlbiB3ZSBnb3QgdGhlIHN0YXRlcyBmcm9tIFdNIEFNIHNlcGFyYXRlbHkuCisgICAgICAgICAgICBsb2dBbHdheXMoIioqKnN0YWNrQm91bmRzSW5BTUFuZFdNQXJlRXF1YWw9ZmFsc2UiKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBUZW1wb3JhcnkgZml4IHRvIGF2b2lkIGNhdGNoaW5nIGludGVybWVkaWF0ZSBzdGF0ZSB3aXRoIGRpZmZlcmVudCB0YXNrIGJvdW5kcyBpbiBBTQorICAgICAgICAgICAgLy8gYW5kIFdNLgorICAgICAgICAgICAgYXNzZXJ0VmFsaWRCb3VuZHMoY29tcGFyZVRhc2tBbmRTdGFja0JvdW5kcyk7CisgICAgICAgIH0gY2F0Y2ggKEFzc2VydGlvbkVycm9yIGUpIHsKKyAgICAgICAgICAgIGxvZ0Fsd2F5cygiKioqdGFza0JvdW5kc0luQU1BbmRXTUFyZUVxdWFsPWZhbHNlIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGZpbmFsIGludCBzdGFja0NvdW50ID0gbUFtU3RhdGUuZ2V0U3RhY2tDb3VudCgpOworICAgICAgICBpZiAoc3RhY2tDb3VudCA9PSAwKSB7CisgICAgICAgICAgICBsb2dBbHdheXMoIioqKnN0YWNrQ291bnQ9IiArIHN0YWNrQ291bnQpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgaW50IHJlc3VtZWRBY3Rpdml0aWVzQ291bnQgPSBtQW1TdGF0ZS5nZXRSZXN1bWVkQWN0aXZpdGllc0NvdW50KCk7CisgICAgICAgIGlmICghbUFtU3RhdGUuZ2V0S2V5Z3VhcmRDb250cm9sbGVyU3RhdGUoKS5rZXlndWFyZFNob3dpbmcgJiYgcmVzdW1lZEFjdGl2aXRpZXNDb3VudCAhPSAxKSB7CisgICAgICAgICAgICBsb2dBbHdheXMoIioqKnJlc3VtZWRBY3Rpdml0aWVzQ291bnQ9IiArIHJlc3VtZWRBY3Rpdml0aWVzQ291bnQpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1BbVN0YXRlLmdldEZvY3VzZWRBY3Rpdml0eSgpID09IG51bGwpIHsKKyAgICAgICAgICAgIGxvZ0Fsd2F5cygiKioqZm9jdXNlZEFjdGl2aXR5PW51bGwiKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgc2hvdWxkIHdhaXQgZm9yIHNvbWUgYWN0aXZpdGllcyB0byBiZWNvbWUgdmlzaWJsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gc2hvdWxkV2FpdEZvckFjdGl2aXRpZXMoV2FpdEZvclZhbGlkQWN0aXZpdHlTdGF0ZS4uLiB3YWl0Rm9yQWN0aXZpdGllc1Zpc2libGUpIHsKKyAgICAgICAgaWYgKHdhaXRGb3JBY3Rpdml0aWVzVmlzaWJsZSA9PSBudWxsIHx8IHdhaXRGb3JBY3Rpdml0aWVzVmlzaWJsZS5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIC8vIElmIHRoZSBjYWxsZXIgaXMgaW50ZXJlc3RlZCBpbiB1cyB3YWl0aW5nIGZvciBzb21lIHBhcnRpY3VsYXIgYWN0aXZpdHkgd2luZG93cyB0byBiZQorICAgICAgICAvLyB2aXNpYmxlIGJlZm9yZSBjb21wdXRlIHRoZSBzdGF0ZS4gQ2hlY2sgZm9yIHRoZSB2aXNpYmlsaXR5IG9mIHRob3NlIGFjdGl2aXR5IHdpbmRvd3MKKyAgICAgICAgLy8gYW5kIGZvciBwbGFjaW5nIHRoZW0gaW4gY29ycmVjdCBzdGFja3MgKGlmIHJlcXVlc3RlZCkuCisgICAgICAgIGJvb2xlYW4gYWxsQWN0aXZpdHlXaW5kb3dzVmlzaWJsZSA9IHRydWU7CisgICAgICAgIGJvb2xlYW4gdGFza3NJbkNvcnJlY3RTdGFja3MgPSB0cnVlOworICAgICAgICBmb3IgKGZpbmFsIFdhaXRGb3JWYWxpZEFjdGl2aXR5U3RhdGUgc3RhdGUgOiB3YWl0Rm9yQWN0aXZpdGllc1Zpc2libGUpIHsKKyAgICAgICAgICAgIGZpbmFsIENvbXBvbmVudE5hbWUgYWN0aXZpdHlOYW1lID0gc3RhdGUuYWN0aXZpdHlOYW1lOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHdpbmRvd05hbWUgPSBzdGF0ZS53aW5kb3dOYW1lOworICAgICAgICAgICAgZmluYWwgaW50IHN0YWNrSWQgPSBzdGF0ZS5zdGFja0lkOworICAgICAgICAgICAgZmluYWwgaW50IHdpbmRvd2luZ01vZGUgPSBzdGF0ZS53aW5kb3dpbmdNb2RlOworICAgICAgICAgICAgZmluYWwgaW50IGFjdGl2aXR5VHlwZSA9IHN0YXRlLmFjdGl2aXR5VHlwZTsKKworICAgICAgICAgICAgZmluYWwgTGlzdDxXaW5kb3dTdGF0ZT4gbWF0Y2hpbmdXaW5kb3dTdGF0ZXMgPQorICAgICAgICAgICAgICAgICAgICBtV21TdGF0ZS5nZXRNYXRjaGluZ1Zpc2libGVXaW5kb3dTdGF0ZSh3aW5kb3dOYW1lKTsKKyAgICAgICAgICAgIGJvb2xlYW4gYWN0aXZpdHlXaW5kb3dWaXNpYmxlID0gIW1hdGNoaW5nV2luZG93U3RhdGVzLmlzRW1wdHkoKTsKKyAgICAgICAgICAgIGlmICghYWN0aXZpdHlXaW5kb3dWaXNpYmxlKSB7CisgICAgICAgICAgICAgICAgbG9nQWx3YXlzKCJBY3Rpdml0eSB3aW5kb3cgbm90IHZpc2libGU6ICIgKyB3aW5kb3dOYW1lKTsKKyAgICAgICAgICAgICAgICBhbGxBY3Rpdml0eVdpbmRvd3NWaXNpYmxlID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGl2aXR5TmFtZSAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICYmICFtQW1TdGF0ZS5pc0FjdGl2aXR5VmlzaWJsZShhY3Rpdml0eU5hbWUpKSB7CisgICAgICAgICAgICAgICAgbG9nQWx3YXlzKCJBY3Rpdml0eSBub3QgdmlzaWJsZTogIiArIGdldEFjdGl2aXR5TmFtZShhY3Rpdml0eU5hbWUpKTsKKyAgICAgICAgICAgICAgICBhbGxBY3Rpdml0eVdpbmRvd3NWaXNpYmxlID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHdpbmRvdyBpcyBhbHJlYWR5IHRoZSBjb3JyZWN0IHN0YXRlIHJlcXVlc3RlZCBieSB0ZXN0LgorICAgICAgICAgICAgICAgIGJvb2xlYW4gd2luZG93SW5Db3JyZWN0U3RhdGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBmb3IgKFdpbmRvd1N0YXRlIHdzIDogbWF0Y2hpbmdXaW5kb3dTdGF0ZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrSWQgIT0gSU5WQUxJRF9TVEFDS19JRCAmJiB3cy5nZXRTdGFja0lkKCkgIT0gc3RhY2tJZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvd2luZ01vZGUgIT0gV0lORE9XSU5HX01PREVfVU5ERUZJTkVECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgd3MuZ2V0V2luZG93aW5nTW9kZSgpICE9IHdpbmRvd2luZ01vZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpdml0eVR5cGUgIT0gQUNUSVZJVFlfVFlQRV9VTkRFRklORUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB3cy5nZXRBY3Rpdml0eVR5cGUoKSAhPSBhY3Rpdml0eVR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHdpbmRvd0luQ29ycmVjdFN0YXRlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3dJbkNvcnJlY3RTdGF0ZSkgeworICAgICAgICAgICAgICAgICAgICBsb2dBbHdheXMoIldpbmRvdyBpbiBpbmNvcnJlY3Qgc3RhY2s6ICIgKyBzdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIHRhc2tzSW5Db3JyZWN0U3RhY2tzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAhYWxsQWN0aXZpdHlXaW5kb3dzVmlzaWJsZSB8fCAhdGFza3NJbkNvcnJlY3RTdGFja3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0cnVlIGlmIHNob3VsZCB3YWl0IHZhbGlkIHdpbmRvd3Mgc3RhdGUuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHNob3VsZFdhaXRGb3JXaW5kb3dzKCkgeworICAgICAgICBpZiAobVdtU3RhdGUuZ2V0RnJvbnRXaW5kb3coKSA9PSBudWxsKSB7CisgICAgICAgICAgICBsb2dBbHdheXMoIioqKmZyb250V2luZG93PW51bGwiKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChtV21TdGF0ZS5nZXRGb2N1c2VkV2luZG93KCkgPT0gbnVsbCkgeworICAgICAgICAgICAgbG9nQWx3YXlzKCIqKipmb2N1c2VkV2luZG93PW51bGwiKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChtV21TdGF0ZS5nZXRGb2N1c2VkQXBwKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgbG9nQWx3YXlzKCIqKipmb2N1c2VkQXBwPW51bGwiKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBzaG91bGRXYWl0Rm9yRGVidWdnZXJXaW5kb3coQ29tcG9uZW50TmFtZSBhY3Rpdml0eU5hbWUpIHsKKyAgICAgICAgTGlzdDxXaW5kb3dTdGF0ZT4gbWF0Y2hpbmdXaW5kb3dTdGF0ZXMgPQorICAgICAgICAgICAgICAgIG1XbVN0YXRlLmdldE1hdGNoaW5nVmlzaWJsZVdpbmRvd1N0YXRlKGFjdGl2aXR5TmFtZS5nZXRQYWNrYWdlTmFtZSgpKTsKKyAgICAgICAgZm9yIChXaW5kb3dTdGF0ZSB3cyA6IG1hdGNoaW5nV2luZG93U3RhdGVzKSB7CisgICAgICAgICAgICBpZiAod3MuaXNEZWJ1Z2dlcldpbmRvdygpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGxvZ0Fsd2F5cygiRGVidWdnZXIgd2luZG93IG5vdCBhdmFpbGFibGUgeWV0Iik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBzaG91bGRXYWl0Rm9yQWN0aXZpdHlSZWNvcmRzKENvbXBvbmVudE5hbWUuLi4gYWN0aXZpdHlOYW1lcykgeworICAgICAgICAvLyBDaGVjayBpZiB0aGUgYWN0aXZpdHkgcmVjb3JkcyB3ZSdyZSBsb29raW5nIGZvciBpcyBhbHJlYWR5IGFkZGVkLgorICAgICAgICBmb3IgKGZpbmFsIENvbXBvbmVudE5hbWUgYWN0aXZpdHlOYW1lIDogYWN0aXZpdHlOYW1lcykgeworICAgICAgICAgICAgaWYgKCFtQW1TdGF0ZS5pc0FjdGl2aXR5VmlzaWJsZShhY3Rpdml0eU5hbWUpKSB7CisgICAgICAgICAgICAgICAgbG9nQWx3YXlzKCJBY3Rpdml0eVJlY29yZCAiICsgZ2V0QWN0aXZpdHlOYW1lKGFjdGl2aXR5TmFtZSkgKyAiIG5vdCB2aXNpYmxlIHlldCIpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gc2hvdWxkV2FpdEZvclNhbml0eUNoZWNrKGJvb2xlYW4gY29tcGFyZVRhc2tBbmRTdGFja0JvdW5kcykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0U2FuaXR5KCk7CisgICAgICAgICAgICBhc3NlcnRWYWxpZEJvdW5kcyhjb21wYXJlVGFza0FuZFN0YWNrQm91bmRzKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGxvZ0Fsd2F5cygiV2FpdGluZyBmb3Igc2FuaXR5IGNoZWNrOiAiICsgdC50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBBY3Rpdml0eU1hbmFnZXJTdGF0ZSBnZXRBbVN0YXRlKCkgeworICAgICAgICByZXR1cm4gbUFtU3RhdGU7CisgICAgfQorCisgICAgcHVibGljIFdpbmRvd01hbmFnZXJTdGF0ZSBnZXRXbVN0YXRlKCkgeworICAgICAgICByZXR1cm4gbVdtU3RhdGU7CisgICAgfQorCisgICAgdm9pZCBhc3NlcnRTYW5pdHkoKSB7CisgICAgICAgIGFzc2VydFRoYXQoIk11c3QgaGF2ZSBzdGFja3MiLCBtQW1TdGF0ZS5nZXRTdGFja0NvdW50KCksIGdyZWF0ZXJUaGFuKDApKTsKKyAgICAgICAgaWYgKCFtQW1TdGF0ZS5nZXRLZXlndWFyZENvbnRyb2xsZXJTdGF0ZSgpLmtleWd1YXJkU2hvd2luZykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGVyZSBzaG91bGQgYmUgb25lIGFuZCBvbmx5IG9uZSByZXN1bWVkIGFjdGl2aXR5IGluIHRoZSBzeXN0ZW0uIiwKKyAgICAgICAgICAgICAgICAgICAgMSwgbUFtU3RhdGUuZ2V0UmVzdW1lZEFjdGl2aXRpZXNDb3VudCgpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnROb3ROdWxsKCJNdXN0IGhhdmUgZm9jdXMgYWN0aXZpdHkuIiwgbUFtU3RhdGUuZ2V0Rm9jdXNlZEFjdGl2aXR5KCkpOworCisgICAgICAgIGZvciAoQWN0aXZpdHlTdGFjayBhU3RhY2sgOiBtQW1TdGF0ZS5nZXRTdGFja3MoKSkgeworICAgICAgICAgICAgZmluYWwgaW50IHN0YWNrSWQgPSBhU3RhY2subVN0YWNrSWQ7CisgICAgICAgICAgICBmb3IgKEFjdGl2aXR5VGFzayBhVGFzayA6IGFTdGFjay5nZXRUYXNrcygpKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJTdGFjayBjYW4gb25seSBjb250YWluIGl0cyBvd24gdGFza3MiLCBzdGFja0lkLCBhVGFzay5tU3RhY2tJZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnROb3ROdWxsKCJNdXN0IGhhdmUgZnJvbnQgd2luZG93LiIsIG1XbVN0YXRlLmdldEZyb250V2luZG93KCkpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJNdXN0IGhhdmUgZm9jdXNlZCB3aW5kb3cuIiwgbVdtU3RhdGUuZ2V0Rm9jdXNlZFdpbmRvdygpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiTXVzdCBoYXZlIGFwcC4iLCBtV21TdGF0ZS5nZXRGb2N1c2VkQXBwKCkpOworICAgIH0KKworICAgIHZvaWQgYXNzZXJ0Q29udGFpbnNTdGFjayhTdHJpbmcgbXNnLCBpbnQgd2luZG93aW5nTW9kZSwgaW50IGFjdGl2aXR5VHlwZSkgeworICAgICAgICBhc3NlcnRUcnVlKG1zZywgbUFtU3RhdGUuY29udGFpbnNTdGFjayh3aW5kb3dpbmdNb2RlLCBhY3Rpdml0eVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtc2csIG1XbVN0YXRlLmNvbnRhaW5zU3RhY2sod2luZG93aW5nTW9kZSwgYWN0aXZpdHlUeXBlKSk7CisgICAgfQorCisgICAgdm9pZCBhc3NlcnREb2VzTm90Q29udGFpblN0YWNrKFN0cmluZyBtc2csIGludCB3aW5kb3dpbmdNb2RlLCBpbnQgYWN0aXZpdHlUeXBlKSB7CisgICAgICAgIGFzc2VydEZhbHNlKG1zZywgbUFtU3RhdGUuY29udGFpbnNTdGFjayh3aW5kb3dpbmdNb2RlLCBhY3Rpdml0eVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobXNnLCBtV21TdGF0ZS5jb250YWluc1N0YWNrKHdpbmRvd2luZ01vZGUsIGFjdGl2aXR5VHlwZSkpOworICAgIH0KKworICAgIHZvaWQgYXNzZXJ0RnJvbnRTdGFjayhTdHJpbmcgbXNnLCBpbnQgc3RhY2tJZCkgeworICAgICAgICBhc3NlcnRFcXVhbHMobXNnLCBzdGFja0lkLCBtQW1TdGF0ZS5nZXRGcm9udFN0YWNrSWQoREVGQVVMVF9ESVNQTEFZKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtc2csIHN0YWNrSWQsIG1XbVN0YXRlLmdldEZyb250U3RhY2tJZChERUZBVUxUX0RJU1BMQVkpKTsKKyAgICB9CisKKyAgICB2b2lkIGFzc2VydEZyb250U3RhY2soU3RyaW5nIG1zZywgaW50IHdpbmRvd2luZ01vZGUsIGludCBhY3Rpdml0eVR5cGUpIHsKKyAgICAgICAgaWYgKHdpbmRvd2luZ01vZGUgIT0gV0lORE9XSU5HX01PREVfVU5ERUZJTkVEKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobXNnLCB3aW5kb3dpbmdNb2RlLAorICAgICAgICAgICAgICAgICAgICBtQW1TdGF0ZS5nZXRGcm9udFN0YWNrV2luZG93aW5nTW9kZShERUZBVUxUX0RJU1BMQVkpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYWN0aXZpdHlUeXBlICE9IEFDVElWSVRZX1RZUEVfVU5ERUZJTkVEKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobXNnLCBhY3Rpdml0eVR5cGUsIG1BbVN0YXRlLmdldEZyb250U3RhY2tBY3Rpdml0eVR5cGUoREVGQVVMVF9ESVNQTEFZKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGFzc2VydEZyb250U3RhY2tBY3Rpdml0eVR5cGUoU3RyaW5nIG1zZywgaW50IGFjdGl2aXR5VHlwZSkgeworICAgICAgICBhc3NlcnRFcXVhbHMobXNnLCBhY3Rpdml0eVR5cGUsIG1BbVN0YXRlLmdldEZyb250U3RhY2tBY3Rpdml0eVR5cGUoREVGQVVMVF9ESVNQTEFZKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtc2csIGFjdGl2aXR5VHlwZSwgbVdtU3RhdGUuZ2V0RnJvbnRTdGFja0FjdGl2aXR5VHlwZShERUZBVUxUX0RJU1BMQVkpKTsKKyAgICB9CisKKyAgICBARGVwcmVjYXRlZAorICAgIHZvaWQgYXNzZXJ0Rm9jdXNlZFN0YWNrKFN0cmluZyBtc2csIGludCBzdGFja0lkKSB7CisgICAgICAgIGFzc2VydEVxdWFscyhtc2csIHN0YWNrSWQsIG1BbVN0YXRlLmdldEZvY3VzZWRTdGFja0lkKCkpOworICAgIH0KKworICAgIHZvaWQgYXNzZXJ0Rm9jdXNlZFN0YWNrKFN0cmluZyBtc2csIGludCB3aW5kb3dpbmdNb2RlLCBpbnQgYWN0aXZpdHlUeXBlKSB7CisgICAgICAgIGlmICh3aW5kb3dpbmdNb2RlICE9IFdJTkRPV0lOR19NT0RFX1VOREVGSU5FRCkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG1zZywgd2luZG93aW5nTW9kZSwgbUFtU3RhdGUuZ2V0Rm9jdXNlZFN0YWNrV2luZG93aW5nTW9kZSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYWN0aXZpdHlUeXBlICE9IEFDVElWSVRZX1RZUEVfVU5ERUZJTkVEKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobXNnLCBhY3Rpdml0eVR5cGUsIG1BbVN0YXRlLmdldEZvY3VzZWRTdGFja0FjdGl2aXR5VHlwZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgYXNzZXJ0Rm9jdXNlZEFjdGl2aXR5KGZpbmFsIFN0cmluZyBtc2csIGZpbmFsIENvbXBvbmVudE5hbWUgYWN0aXZpdHlOYW1lKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBhY3Rpdml0eUNvbXBvbmVudE5hbWUgPSBnZXRBY3Rpdml0eU5hbWUoYWN0aXZpdHlOYW1lKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1zZywgYWN0aXZpdHlDb21wb25lbnROYW1lLCBtQW1TdGF0ZS5nZXRGb2N1c2VkQWN0aXZpdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtc2csIGFjdGl2aXR5Q29tcG9uZW50TmFtZSwgbVdtU3RhdGUuZ2V0Rm9jdXNlZEFwcCgpKTsKKyAgICB9CisKKyAgICB2b2lkIGFzc2VydE5vdEZvY3VzZWRBY3Rpdml0eShTdHJpbmcgbXNnLCBDb21wb25lbnROYW1lIGFjdGl2aXR5TmFtZSkgeworICAgICAgICBhc3NlcnROb3RFcXVhbHMobXNnLCBtQW1TdGF0ZS5nZXRGb2N1c2VkQWN0aXZpdHkoKSwgZ2V0QWN0aXZpdHlOYW1lKGFjdGl2aXR5TmFtZSkpOworICAgICAgICBhc3NlcnROb3RFcXVhbHMobXNnLCBtV21TdGF0ZS5nZXRGb2N1c2VkQXBwKCksIGdldEFjdGl2aXR5TmFtZShhY3Rpdml0eU5hbWUpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhc3NlcnRSZXN1bWVkQWN0aXZpdHkoZmluYWwgU3RyaW5nIG1zZywgZmluYWwgQ29tcG9uZW50TmFtZSBhY3Rpdml0eU5hbWUpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1zZywgZ2V0QWN0aXZpdHlOYW1lKGFjdGl2aXR5TmFtZSksIG1BbVN0YXRlLmdldFJlc3VtZWRBY3Rpdml0eSgpKTsKKyAgICB9CisKKyAgICB2b2lkIGFzc2VydE5vdFJlc3VtZWRBY3Rpdml0eShTdHJpbmcgbXNnLCBDb21wb25lbnROYW1lIGFjdGl2aXR5TmFtZSkgeworICAgICAgICBhc3NlcnROb3RFcXVhbHMobXNnLCBtQW1TdGF0ZS5nZXRSZXN1bWVkQWN0aXZpdHkoKSwgZ2V0QWN0aXZpdHlOYW1lKGFjdGl2aXR5TmFtZSkpOworICAgIH0KKworICAgIHZvaWQgYXNzZXJ0Rm9jdXNlZFdpbmRvdyhTdHJpbmcgbXNnLCBTdHJpbmcgd2luZG93TmFtZSkgeworICAgICAgICBhc3NlcnRFcXVhbHMobXNnLCB3aW5kb3dOYW1lLCBtV21TdGF0ZS5nZXRGb2N1c2VkV2luZG93KCkpOworICAgIH0KKworICAgIHZvaWQgYXNzZXJ0Tm90Rm9jdXNlZFdpbmRvdyhTdHJpbmcgbXNnLCBTdHJpbmcgd2luZG93TmFtZSkgeworICAgICAgICBhc3NlcnROb3RFcXVhbHMobXNnLCBtV21TdGF0ZS5nZXRGb2N1c2VkV2luZG93KCksIHdpbmRvd05hbWUpOworICAgIH0KKworICAgIHZvaWQgYXNzZXJ0RnJvbnRXaW5kb3coU3RyaW5nIG1zZywgU3RyaW5nIHdpbmRvd05hbWUpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1zZywgd2luZG93TmFtZSwgbVdtU3RhdGUuZ2V0RnJvbnRXaW5kb3coKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXNzZXJ0VmlzaWJpbGl0eShmaW5hbCBDb21wb25lbnROYW1lIGFjdGl2aXR5TmFtZSwgZmluYWwgYm9vbGVhbiB2aXNpYmxlKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyB3aW5kb3dOYW1lID0gZ2V0V2luZG93TmFtZShhY3Rpdml0eU5hbWUpOworICAgICAgICBmaW5hbCBib29sZWFuIGFjdGl2aXR5VmlzaWJsZSA9IG1BbVN0YXRlLmlzQWN0aXZpdHlWaXNpYmxlKGFjdGl2aXR5TmFtZSk7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gd2luZG93VmlzaWJsZSA9IG1XbVN0YXRlLmlzV2luZG93VmlzaWJsZSh3aW5kb3dOYW1lKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIkFjdGl2aXR5PSIgKyBnZXRBY3Rpdml0eU5hbWUoYWN0aXZpdHlOYW1lKSArICIgbXVzdCIgKyAodmlzaWJsZSA/ICIiIDogIiBOT1QiKQorICAgICAgICAgICAgICAgICsgIiBiZSB2aXNpYmxlLiIsIHZpc2libGUsIGFjdGl2aXR5VmlzaWJsZSk7CisgICAgICAgIGFzc2VydEVxdWFscygiV2luZG93PSIgKyB3aW5kb3dOYW1lICsgIiBtdXN0IiArICh2aXNpYmxlID8gIiIgOiAiIE5PVCIpICsgIiBiZSB2aXNpYmxlLiIsCisgICAgICAgICAgICAgICAgdmlzaWJsZSwgd2luZG93VmlzaWJsZSk7CisgICAgfQorCisgICAgdm9pZCBhc3NlcnRIb21lQWN0aXZpdHlWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgeworICAgICAgICBmaW5hbCBDb21wb25lbnROYW1lIGhvbWVBY3Rpdml0eSA9IG1BbVN0YXRlLmdldEhvbWVBY3Rpdml0eU5hbWUoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChob21lQWN0aXZpdHkpOworICAgICAgICBhc3NlcnRWaXNpYmlsaXR5KGhvbWVBY3Rpdml0eSwgdmlzaWJsZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNzZXJ0cyB0aGF0IHRoZSBkZXZpY2UgZGVmYXVsdCBkaXNwbGF5IG1pbmltaW0gd2lkdGggaXMgbGFyZ2VyIHRoYW4gdGhlIG1pbmltdW0gdGFzayB3aWR0aC4KKyAgICAgKi8KKyAgICB2b2lkIGFzc2VydERldmljZURlZmF1bHREaXNwbGF5U2l6ZShTdHJpbmcgZXJyb3JNZXNzYWdlKSB7CisgICAgICAgIGNvbXB1dGVTdGF0ZSh0cnVlKTsKKyAgICAgICAgZmluYWwgaW50IG1pblRhc2tTaXplUHggPSBkZWZhdWx0TWluaW1hbFRhc2tTaXplKERFRkFVTFRfRElTUExBWSk7CisgICAgICAgIGZpbmFsIERpc3BsYXkgZGlzcGxheSA9IGdldFdtU3RhdGUoKS5nZXREaXNwbGF5KERFRkFVTFRfRElTUExBWSk7CisgICAgICAgIGZpbmFsIFJlY3QgZGlzcGxheVJlY3QgPSBkaXNwbGF5LmdldERpc3BsYXlSZWN0KCk7CisgICAgICAgIGlmIChNYXRoLm1pbihkaXNwbGF5UmVjdC53aWR0aCgpLCBkaXNwbGF5UmVjdC5oZWlnaHQoKSkgPCBtaW5UYXNrU2l6ZVB4KSB7CisgICAgICAgICAgICBmYWlsKGVycm9yTWVzc2FnZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhc3NlcnRLZXlndWFyZFNob3dpbmdBbmRPY2NsdWRlZCgpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiS2V5Z3VhcmQgaXMgc2hvd2luZyIsCisgICAgICAgICAgICAgICAgZ2V0QW1TdGF0ZSgpLmdldEtleWd1YXJkQ29udHJvbGxlclN0YXRlKCkua2V5Z3VhcmRTaG93aW5nKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiS2V5Z3VhcmQgaXMgb2NjbHVkZWQiLAorICAgICAgICAgICAgICAgIGdldEFtU3RhdGUoKS5nZXRLZXlndWFyZENvbnRyb2xsZXJTdGF0ZSgpLmtleWd1YXJkT2NjbHVkZWQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFzc2VydEtleWd1YXJkU2hvd2luZ0FuZE5vdE9jY2x1ZGVkKCkgeworICAgICAgICBhc3NlcnRUcnVlKCJLZXlndWFyZCBpcyBzaG93aW5nIiwKKyAgICAgICAgICAgICAgICBnZXRBbVN0YXRlKCkuZ2V0S2V5Z3VhcmRDb250cm9sbGVyU3RhdGUoKS5rZXlndWFyZFNob3dpbmcpOworICAgICAgICBhc3NlcnRGYWxzZSgiS2V5Z3VhcmQgaXMgbm90IG9jY2x1ZGVkIiwKKyAgICAgICAgICAgICAgICBnZXRBbVN0YXRlKCkuZ2V0S2V5Z3VhcmRDb250cm9sbGVyU3RhdGUoKS5rZXlndWFyZE9jY2x1ZGVkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhc3NlcnRLZXlndWFyZEdvbmUoKSB7CisgICAgICAgIGFzc2VydEZhbHNlKCJLZXlndWFyZCBpcyBub3Qgc2hvd24iLAorICAgICAgICAgICAgICAgIGdldEFtU3RhdGUoKS5nZXRLZXlndWFyZENvbnRyb2xsZXJTdGF0ZSgpLmtleWd1YXJkU2hvd2luZyk7CisgICAgfQorCisgICAgYm9vbGVhbiB0YXNrTGlzdHNJbkFtQW5kV21BcmVFcXVhbCgpIHsKKyAgICAgICAgZm9yIChBY3Rpdml0eVN0YWNrIGFTdGFjayA6IG1BbVN0YXRlLmdldFN0YWNrcygpKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgc3RhY2tJZCA9IGFTdGFjay5tU3RhY2tJZDsKKyAgICAgICAgICAgIGZpbmFsIFdpbmRvd1N0YWNrIHdTdGFjayA9IG1XbVN0YXRlLmdldFN0YWNrKHN0YWNrSWQpOworICAgICAgICAgICAgaWYgKHdTdGFjayA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbG9nKCJXYWl0aW5nIGZvciBzdGFjayBzZXR1cCBpbiBXTSwgc3RhY2tJZD0iICsgc3RhY2tJZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKEFjdGl2aXR5VGFzayBhVGFzayA6IGFTdGFjay5nZXRUYXNrcygpKSB7CisgICAgICAgICAgICAgICAgaWYgKHdTdGFjay5nZXRUYXNrKGFUYXNrLm1UYXNrSWQpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJUYXNrIGlzIGluIEFNIGJ1dCBub3QgaW4gV00sIHdhaXRpbmcgZm9yIGl0IHRvIHNldHRsZSwgdGFza0lkPSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGFUYXNrLm1UYXNrSWQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKFdpbmRvd1Rhc2sgd1Rhc2sgOiB3U3RhY2subVRhc2tzKSB7CisgICAgICAgICAgICAgICAgaWYgKGFTdGFjay5nZXRUYXNrKHdUYXNrLm1UYXNrSWQpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJUYXNrIGlzIGluIFdNIGJ1dCBub3QgaW4gQU0sIHdhaXRpbmcgZm9yIGl0IHRvIHNldHRsZSwgdGFza0lkPSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHdUYXNrLm1UYXNrSWQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKiBHZXQgdGhlIHN0YWNrIHBvc2l0aW9uIG9uIGl0cyBkaXNwbGF5LiAqLworICAgIGludCBnZXRTdGFja0luZGV4QnlBY3Rpdml0eVR5cGUoaW50IGFjdGl2aXR5VHlwZSkgeworICAgICAgICBpbnQgd21TdGFja0luZGV4ID0gbVdtU3RhdGUuZ2V0U3RhY2tJbmRleEJ5QWN0aXZpdHlUeXBlKGFjdGl2aXR5VHlwZSk7CisgICAgICAgIGludCBhbVN0YWNrSW5kZXggPSBtQW1TdGF0ZS5nZXRTdGFja0luZGV4QnlBY3Rpdml0eVR5cGUoYWN0aXZpdHlUeXBlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJXaW5kb3cgYW5kIGFjdGl2aXR5IG1hbmFnZXIgbXVzdCBoYXZlIHRoZSBzYW1lIHN0YWNrIHBvc2l0aW9uIGluZGV4IiwKKyAgICAgICAgICAgICAgICBhbVN0YWNrSW5kZXgsIHdtU3RhY2tJbmRleCk7CisgICAgICAgIHJldHVybiB3bVN0YWNrSW5kZXg7CisgICAgfQorCisgICAgYm9vbGVhbiBzdGFja0JvdW5kc0luQU1BbmRXTUFyZUVxdWFsKCkgeworICAgICAgICBmb3IgKEFjdGl2aXR5U3RhY2sgYVN0YWNrIDogbUFtU3RhdGUuZ2V0U3RhY2tzKCkpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBzdGFja0lkID0gYVN0YWNrLm1TdGFja0lkOworICAgICAgICAgICAgZmluYWwgV2luZG93U3RhY2sgd1N0YWNrID0gbVdtU3RhdGUuZ2V0U3RhY2soc3RhY2tJZCk7CisgICAgICAgICAgICBpZiAoYVN0YWNrLmlzRnVsbHNjcmVlbigpICE9IHdTdGFjay5pc0Z1bGxzY3JlZW4oKSkgeworICAgICAgICAgICAgICAgIGxvZygiV2FpdGluZyBmb3IgY29ycmVjdCBmdWxsc2NyZWVuIHN0YXRlLCBzdGFja0lkPSIgKyBzdGFja0lkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIFJlY3QgYVN0YWNrQm91bmRzID0gYVN0YWNrLmdldEJvdW5kcygpOworICAgICAgICAgICAgZmluYWwgUmVjdCB3U3RhY2tCb3VuZHMgPSB3U3RhY2suZ2V0Qm91bmRzKCk7CisKKyAgICAgICAgICAgIGlmIChhU3RhY2suaXNGdWxsc2NyZWVuKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoYVN0YWNrQm91bmRzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJXYWl0aW5nIGZvciBjb3JyZWN0IHN0YWNrIHN0YXRlIGluIEFNLCBzdGFja0lkPSIgKyBzdGFja0lkKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIU9iamVjdHMuZXF1YWxzKGFTdGFja0JvdW5kcywgd1N0YWNrQm91bmRzKSkgeworICAgICAgICAgICAgICAgIC8vIElmIHN0YWNrIGlzIG5vdCBmdWxsc2NyZWVuIC0gY29tcGFyaW5nIGJvdW5kcy4gTm90IGRvaW5nIGl0IGFsd2F5cyBiZWNhdXNlCisgICAgICAgICAgICAgICAgLy8gZm9yIGZ1bGxzY3JlZW4gc3RhY2sgYm91bmRzIGluIFdNIGNhbiBiZSBlaXRoZXIgbnVsbCBvciBlcXVhbCB0byBkaXNwbGF5IHNpemUuCisgICAgICAgICAgICAgICAgbG9nKCJXYWl0aW5nIGZvciBzdGFjayBib3VuZCBlcXVhbGl0eSBpbiBBTSBhbmQgV00sIHN0YWNrSWQ9IiArIHN0YWNrSWQpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIHRhc2sgYm91bmRzIHdoZW4gZG9ja2VkIHRvIHRvcC9sZWZ0LgorICAgICAqLworICAgIHZvaWQgYXNzZXJ0RG9ja2VkVGFza0JvdW5kcyhpbnQgdGFza1dpZHRoLCBpbnQgdGFza0hlaWdodCwgQ29tcG9uZW50TmFtZSBhY3Rpdml0eU5hbWUpIHsKKyAgICAgICAgLy8gVGFzayBzaXplIGNhbiBiZSBhZmZlY3RlZCBieSBkZWZhdWx0IG1pbmltYWwgc2l6ZS4KKyAgICAgICAgaW50IGRlZmF1bHRNaW5pbWFsVGFza1NpemUgPSBkZWZhdWx0TWluaW1hbFRhc2tTaXplKAorICAgICAgICAgICAgICAgIG1BbVN0YXRlLmdldFN0YW5kYXJkU3RhY2tCeVdpbmRvd2luZ01vZGUoCisgICAgICAgICAgICAgICAgICAgICAgICBXSU5ET1dJTkdfTU9ERV9TUExJVF9TQ1JFRU5fUFJJTUFSWSkubURpc3BsYXlJZCk7CisgICAgICAgIGludCB0YXJnZXRXaWR0aCA9IE1hdGgubWF4KHRhc2tXaWR0aCwgZGVmYXVsdE1pbmltYWxUYXNrU2l6ZSk7CisgICAgICAgIGludCB0YXJnZXRIZWlnaHQgPSBNYXRoLm1heCh0YXNrSGVpZ2h0LCBkZWZhdWx0TWluaW1hbFRhc2tTaXplKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IFJlY3QoMCwgMCwgdGFyZ2V0V2lkdGgsIHRhcmdldEhlaWdodCksCisgICAgICAgICAgICAgICAgbUFtU3RhdGUuZ2V0VGFza0J5QWN0aXZpdHkoYWN0aXZpdHlOYW1lKS5nZXRCb3VuZHMoKSk7CisgICAgfQorCisgICAgdm9pZCBhc3NlcnRWYWxpZEJvdW5kcyhib29sZWFuIGNvbXBhcmVUYXNrQW5kU3RhY2tCb3VuZHMpIHsKKyAgICAgICAgLy8gQ3ljbGUgdGhyb3VnaCB0aGUgc3RhY2tzIGFuZCB0YXNrcyB0byBmaWd1cmUgb3V0IGlmIHRoZSBob21lIHN0YWNrIGlzIHJlc2l6YWJsZQorICAgICAgICBmaW5hbCBBY3Rpdml0eVRhc2sgaG9tZVRhc2sgPSBtQW1TdGF0ZS5nZXRIb21lVGFzaygpOworICAgICAgICBmaW5hbCBib29sZWFuIGhvbWVTdGFja0lzUmVzaXphYmxlID0gaG9tZVRhc2sgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIGhvbWVUYXNrLmdldFJlc2l6ZU1vZGUoKSA9PSBSRVNJWkVfTU9ERV9SRVNJWkVBQkxFOworCisgICAgICAgIGZvciAoQWN0aXZpdHlTdGFjayBhU3RhY2sgOiBtQW1TdGF0ZS5nZXRTdGFja3MoKSkgeworICAgICAgICAgICAgZmluYWwgaW50IHN0YWNrSWQgPSBhU3RhY2subVN0YWNrSWQ7CisgICAgICAgICAgICBmaW5hbCBXaW5kb3dTdGFjayB3U3RhY2sgPSBtV21TdGF0ZS5nZXRTdGFjayhzdGFja0lkKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoInN0YWNrSWQ9IiArIHN0YWNrSWQgKyAiIGluIEFNIGJ1dCBub3QgaW4gV00/Iiwgd1N0YWNrKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJTdGFjayBmdWxsc2NyZWVuIHN0YXRlIGluIEFNIGFuZCBXTSBtdXN0IGJlIGVxdWFsIHN0YWNrSWQ9IiArIHN0YWNrSWQsCisgICAgICAgICAgICAgICAgICAgIGFTdGFjay5pc0Z1bGxzY3JlZW4oKSwgd1N0YWNrLmlzRnVsbHNjcmVlbigpKTsKKworICAgICAgICAgICAgZmluYWwgUmVjdCBhU3RhY2tCb3VuZHMgPSBhU3RhY2suZ2V0Qm91bmRzKCk7CisgICAgICAgICAgICBmaW5hbCBSZWN0IHdTdGFja0JvdW5kcyA9IHdTdGFjay5nZXRCb3VuZHMoKTsKKworICAgICAgICAgICAgaWYgKGFTdGFjay5pc0Z1bGxzY3JlZW4oKSkgeworICAgICAgICAgICAgICAgIGFzc2VydE51bGwoIlN0YWNrIGJvdW5kcyBpbiBBTSBtdXN0IGJlIG51bGwgc3RhY2tJZD0iICsgc3RhY2tJZCwgYVN0YWNrQm91bmRzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJTdGFjayBib3VuZHMgaW4gQU0gYW5kIFdNIG11c3QgYmUgZXF1YWwgc3RhY2tJZD0iICsgc3RhY2tJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFTdGFja0JvdW5kcywgd1N0YWNrQm91bmRzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChBY3Rpdml0eVRhc2sgYVRhc2sgOiBhU3RhY2suZ2V0VGFza3MoKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCB0YXNrSWQgPSBhVGFzay5tVGFza0lkOworICAgICAgICAgICAgICAgIGZpbmFsIFdpbmRvd1Rhc2sgd1Rhc2sgPSB3U3RhY2suZ2V0VGFzayh0YXNrSWQpOworICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoCisgICAgICAgICAgICAgICAgICAgICAgICAidGFza0lkPSIgKyB0YXNrSWQgKyAiIGluIEFNIGJ1dCBub3QgaW4gV00/IHN0YWNrSWQ9IiArIHN0YWNrSWQsIHdUYXNrKTsKKworICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYVRhc2tJc0Z1bGxzY3JlZW4gPSBhVGFzay5pc0Z1bGxzY3JlZW4oKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHdUYXNrSXNGdWxsc2NyZWVuID0gd1Rhc2suaXNGdWxsc2NyZWVuKCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUYXNrIGZ1bGxzY3JlZW4gc3RhdGUgaW4gQU0gYW5kIFdNIG11c3QgYmUgZXF1YWwgdGFza0lkPSIgKyB0YXNrSWQKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgc3RhY2tJZD0iICsgc3RhY2tJZCwgYVRhc2tJc0Z1bGxzY3JlZW4sIHdUYXNrSXNGdWxsc2NyZWVuKTsKKworICAgICAgICAgICAgICAgIGZpbmFsIFJlY3QgYVRhc2tCb3VuZHMgPSBhVGFzay5nZXRCb3VuZHMoKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBSZWN0IHdUYXNrQm91bmRzID0gd1Rhc2suZ2V0Qm91bmRzKCk7CisKKyAgICAgICAgICAgICAgICBpZiAoYVRhc2tJc0Z1bGxzY3JlZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0TnVsbCgiVGFzayBib3VuZHMgaW4gQU0gbXVzdCBiZSBudWxsIGZvciBmdWxsc2NyZWVuIHRhc2tJZD0iICsgdGFza0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFUYXNrQm91bmRzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFob21lU3RhY2tJc1Jlc2l6YWJsZSAmJiBtV21TdGF0ZS5pc0RvY2tlZFN0YWNrTWluaW1pemVkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICFpc1NjcmVlblBvcnRyYWl0KGFTdGFjay5tRGlzcGxheUlkKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIG1pbmltaXplZCB1c2luZyBub24tcmVzaXphYmxlIGxhdW5jaGVyIGluIGxhbmRzY2FwZSBtb2RlLCBpdCB3aWxsIG1vdmUKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRhc2sgb2Zmc2NyZWVuIGluIHRoZSBuZWdhdGl2ZSB4IGRpcmVjdGlvbiB1bmxpa2UgcG9ydHJhaXQgdGhhdCBjcm9wcy4KKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHggdmFsdWUgaW4gdGhlIHRhc2sgYm91bmRzIHdpbGwgbm90IG1hdGNoIHRoZSBzdGFjayBib3VuZHMgc2luY2UgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgdGhlIHRhc2sgd2FzIG1vdmVkLgorICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRhc2sgYm91bmRzIGluIEFNIGFuZCBXTSBtdXN0IG1hdGNoIHdpZHRoIHRhc2tJZD0iICsgdGFza0lkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHN0YWNrSWQiICsgc3RhY2tJZCwgYVRhc2tCb3VuZHMud2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3VGFza0JvdW5kcy53aWR0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUYXNrIGJvdW5kcyBpbiBBTSBhbmQgV00gbXVzdCBtYXRjaCBoZWlnaHQgdGFza0lkPSIgKyB0YXNrSWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgc3RhY2tJZCIgKyBzdGFja0lkLCBhVGFza0JvdW5kcy5oZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3VGFza0JvdW5kcy5oZWlnaHQoKSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGFzayBib3VuZHMgbXVzdCBtYXRjaCBzdGFjayBib3VuZHMgeSB0YXNrSWQ9IiArIHRhc2tJZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBzdGFja0lkIiArIHN0YWNrSWQsIGFUYXNrQm91bmRzLnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3VGFza0JvdW5kcy50b3ApOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRhc2sgYW5kIHN0YWNrIGJvdW5kcyBtdXN0IG1hdGNoIHdpZHRoIHRhc2tJZD0iICsgdGFza0lkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHN0YWNrSWQiICsgc3RhY2tJZCwgYVN0YWNrQm91bmRzLndpZHRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd1Rhc2tCb3VuZHMud2lkdGgoKSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGFzayBhbmQgc3RhY2sgYm91bmRzIG11c3QgbWF0Y2ggaGVpZ2h0IHRhc2tJZD0iICsgdGFza0lkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHN0YWNrSWQiICsgc3RhY2tJZCwgYVN0YWNrQm91bmRzLmhlaWdodCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdUYXNrQm91bmRzLmhlaWdodCgpKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUYXNrIGFuZCBzdGFjayBib3VuZHMgbXVzdCBtYXRjaCB5IHRhc2tJZD0iICsgdGFza0lkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHN0YWNrSWQiICsgc3RhY2tJZCwgYVN0YWNrQm91bmRzLnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3VGFza0JvdW5kcy50b3ApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGFzayBib3VuZHMgaW4gQU0gYW5kIFdNIG11c3QgYmUgZXF1YWwgdGFza0lkPSIgKyB0YXNrSWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHN0YWNrSWQ9IiArIHN0YWNrSWQsIGFUYXNrQm91bmRzLCB3VGFza0JvdW5kcyk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBhcmVUYXNrQW5kU3RhY2tCb3VuZHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBhU3RhY2suZ2V0V2luZG93aW5nTW9kZSgpICE9IFdJTkRPV0lOR19NT0RFX0ZSRUVGT1JNKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYVRhc2tNaW5XaWR0aCA9IGFUYXNrLmdldE1pbldpZHRoKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYVRhc2tNaW5IZWlnaHQgPSBhVGFzay5nZXRNaW5IZWlnaHQoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFUYXNrTWluV2lkdGggPT0gLTEgfHwgYVRhc2tNaW5IZWlnaHQgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNaW5pbWFsIGRpbWVuc2lvbihzKSBub3Qgc2V0IGZvciB0YXNrIC0gaXQgc2hvdWxkIGJlIHVzaW5nIGRlZmF1bHRzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWZhdWx0TWluaW1hbFNpemUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVN0YWNrLmdldFdpbmRvd2luZ01vZGUoKSA9PSBXSU5ET1dJTkdfTU9ERV9QSU5ORUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZGVmYXVsdE1pbmltYWxQaW5uZWRUYXNrU2l6ZShhU3RhY2subURpc3BsYXlJZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZGVmYXVsdE1pbmltYWxUYXNrU2l6ZShhU3RhY2subURpc3BsYXlJZCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYVRhc2tNaW5XaWR0aCA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVGFza01pbldpZHRoID0gZGVmYXVsdE1pbmltYWxTaXplOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYVRhc2tNaW5IZWlnaHQgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVRhc2tNaW5IZWlnaHQgPSBkZWZhdWx0TWluaW1hbFNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYVN0YWNrQm91bmRzLndpZHRoKCkgPj0gYVRhc2tNaW5XaWR0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBhU3RhY2tCb3VuZHMuaGVpZ2h0KCkgPj0gYVRhc2tNaW5IZWlnaHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgYVN0YWNrLmdldFdpbmRvd2luZ01vZGUoKSA9PSBXSU5ET1dJTkdfTU9ERV9QSU5ORUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCb3VuZHMgYXJlIG5vdCBzbWFsbGVyIHRoZW4gbWluaW1hbCBwb3NzaWJsZSwgc28gc3RhY2sgYW5kIHRhc2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBib3VuZHMgbXVzdCBiZSBlcXVhbC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRhc2sgYm91bmRzIG11c3QgYmUgZXF1YWwgdG8gc3RhY2sgYm91bmRzIHRhc2tJZD0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRhc2tJZCArICIsIHN0YWNrSWQ9IiArIHN0YWNrSWQsIGFTdGFja0JvdW5kcywgd1Rhc2tCb3VuZHMpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhU3RhY2suZ2V0V2luZG93aW5nTW9kZSgpID09IFdJTkRPV0lOR19NT0RFX1NQTElUX1NDUkVFTl9QUklNQVJZCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGhvbWVTdGFja0lzUmVzaXphYmxlICYmIG1XbVN0YXRlLmlzRG9ja2VkU3RhY2tNaW5pbWl6ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBvcnRyYWl0IGlmIHRoZSBkaXNwbGF5IGhlaWdodCBpcyBsYXJnZXIgdGhhbiB0aGUgd2lkdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNTY3JlZW5Qb3J0cmFpdChhU3RhY2subURpc3BsYXlJZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUYXNrIHdpZHRoIG11c3QgYmUgZXF1YWwgdG8gc3RhY2sgd2lkdGggdGFza0lkPSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdGFza0lkICsgIiwgc3RhY2tJZD0iICsgc3RhY2tJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhU3RhY2tCb3VuZHMud2lkdGgoKSwgd1Rhc2tCb3VuZHMud2lkdGgoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFRoYXQoIlRhc2sgaGVpZ2h0IG11c3QgYmUgZ3JlYXRlciB0aGFuIHN0YWNrIGhlaWdodCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJ0YXNrSWQ9IiArIHRhc2tJZCArICIsIHN0YWNrSWQ9IiArIHN0YWNrSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVN0YWNrQm91bmRzLmhlaWdodCgpLCBsZXNzVGhhbih3VGFza0JvdW5kcy5oZWlnaHQoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRhc2sgYW5kIHN0YWNrIHggcG9zaXRpb24gbXVzdCBiZSBlcXVhbCB0YXNrSWQ9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0YXNrSWQgKyAiLCBzdGFja0lkPSIgKyBzdGFja0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdUYXNrQm91bmRzLmxlZnQsIHdTdGFja0JvdW5kcy5sZWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRUaGF0KCJUYXNrIHdpZHRoIG11c3QgYmUgZ3JlYXRlciB0aGFuIHN0YWNrIHdpZHRoIHRhc2tJZD0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRhc2tJZCArICIsIHN0YWNrSWQ9IiArIHN0YWNrSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVN0YWNrQm91bmRzLndpZHRoKCksIGxlc3NUaGFuKHdUYXNrQm91bmRzLndpZHRoKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUYXNrIGhlaWdodCBtdXN0IGJlIGVxdWFsIHRvIHN0YWNrIGhlaWdodCB0YXNrSWQ9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0YXNrSWQgKyAiLCBzdGFja0lkPSIgKyBzdGFja0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFTdGFja0JvdW5kcy5oZWlnaHQoKSwgd1Rhc2tCb3VuZHMuaGVpZ2h0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRhc2sgYW5kIHN0YWNrIHkgcG9zaXRpb24gbXVzdCBiZSBlcXVhbCB0YXNrSWQ9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0YXNrSWQgKyAiLCBzdGFja0lkPSIgKyBzdGFja0lkLCB3VGFza0JvdW5kcy50b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd1N0YWNrQm91bmRzLnRvcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNaW5pbWFsIGRpbWVuc2lvbnMgYWZmZWN0IHRhc2sgc2l6ZSwgc28gYm91bmRzIG9mIHRhc2sgYW5kIHN0YWNrIG11c3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZSBkaWZmZXJlbnQgLSB3aWxsIGNvbXBhcmUgZGltZW5zaW9ucyBpbnN0ZWFkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0YXJnZXRXaWR0aCA9IE1hdGgubWF4KGFUYXNrTWluV2lkdGgsIGFTdGFja0JvdW5kcy53aWR0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRhc2sgd2lkdGggbXVzdCBiZSBzZXQgYWNjb3JkaW5nIHRvIG1pbmltYWwgd2lkdGgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB0YXNrSWQ9IiArIHRhc2tJZCArICIsIHN0YWNrSWQ9IiArIHN0YWNrSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRXaWR0aCwgd1Rhc2tCb3VuZHMud2lkdGgoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRhcmdldEhlaWdodCA9IE1hdGgubWF4KGFUYXNrTWluSGVpZ2h0LCBhU3RhY2tCb3VuZHMuaGVpZ2h0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGFzayBoZWlnaHQgbXVzdCBiZSBzZXQgYWNjb3JkaW5nIHRvIG1pbmltYWwgaGVpZ2h0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgdGFza0lkPSIgKyB0YXNrSWQgKyAiLCBzdGFja0lkPSIgKyBzdGFja0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0SGVpZ2h0LCB3VGFza0JvdW5kcy5oZWlnaHQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhc3NlcnRBY3Rpdml0eURpc3BsYXllZChmaW5hbCBDb21wb25lbnROYW1lIGFjdGl2aXR5TmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydFdpbmRvd0Rpc3BsYXllZChnZXRXaW5kb3dOYW1lKGFjdGl2aXR5TmFtZSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFzc2VydFdpbmRvd0Rpc3BsYXllZChmaW5hbCBTdHJpbmcgd2luZG93TmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHdhaXRGb3JWYWxpZFN0YXRlKFdhaXRGb3JWYWxpZEFjdGl2aXR5U3RhdGUuZm9yV2luZG93KHdpbmRvd05hbWUpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh3aW5kb3dOYW1lICsgImlzIHZpc2libGUiLCBnZXRXbVN0YXRlKCkuaXNXaW5kb3dWaXNpYmxlKHdpbmRvd05hbWUpKTsKKyAgICB9CisKKyAgICBib29sZWFuIGlzU2NyZWVuUG9ydHJhaXQoKSB7CisgICAgICAgIGZpbmFsIGludCBkaXNwbGF5SWQgPSBtQW1TdGF0ZS5nZXRTdGFuZGFyZFN0YWNrQnlXaW5kb3dpbmdNb2RlKAorICAgICAgICAgICAgV0lORE9XSU5HX01PREVfU1BMSVRfU0NSRUVOX1BSSU1BUlkpLm1EaXNwbGF5SWQ7CisgICAgICAgIHJldHVybiBpc1NjcmVlblBvcnRyYWl0KGRpc3BsYXlJZCk7CisgICAgfQorCisgICAgYm9vbGVhbiBpc1NjcmVlblBvcnRyYWl0KGludCBkaXNwbGF5SWQpIHsKKyAgICAgICAgZmluYWwgUmVjdCBkaXNwbGF5UmVjdCA9IG1XbVN0YXRlLmdldERpc3BsYXkoZGlzcGxheUlkKS5nZXREaXNwbGF5UmVjdCgpOworICAgICAgICByZXR1cm4gZGlzcGxheVJlY3QuaGVpZ2h0KCkgPiBkaXNwbGF5UmVjdC53aWR0aCgpOworICAgIH0KKworICAgIHN0YXRpYyBpbnQgZHBUb1B4KGZsb2F0IGRwLCBpbnQgZGVuc2l0eURwaSkgeworICAgICAgICByZXR1cm4gKGludCkgKGRwICogZGVuc2l0eURwaSAvIERFTlNJVFlfREVGQVVMVCArIDAuNWYpOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGRlZmF1bHRNaW5pbWFsVGFza1NpemUoaW50IGRpc3BsYXlJZCkgeworICAgICAgICByZXR1cm4gZHBUb1B4KERFRkFVTFRfUkVTSVpBQkxFX1RBU0tfU0laRV9EUCwgbVdtU3RhdGUuZ2V0RGlzcGxheShkaXNwbGF5SWQpLmdldERwaSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBkZWZhdWx0TWluaW1hbFBpbm5lZFRhc2tTaXplKGludCBkaXNwbGF5SWQpIHsKKyAgICAgICAgcmV0dXJuIGRwVG9QeChERUZBVUxUX1BJUF9SRVNJWkFCTEVfVEFTS19TSVpFX0RQLCBtV21TdGF0ZS5nZXREaXNwbGF5KGRpc3BsYXlJZCkuZ2V0RHBpKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci91dGlsL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eUxhdW5jaGVyLmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvdXRpbC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlMYXVuY2hlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NDJkYmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvdXRpbC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlMYXVuY2hlci5qYXZhCkBAIC0wLDAgKzEsMTY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLmFtOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5JbnRlbnQuRkxBR19BQ1RJVklUWV9MQVVOQ0hfQURKQUNFTlQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5JbnRlbnQuRkxBR19BQ1RJVklUWV9NVUxUSVBMRV9UQVNLOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0s7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5JbnRlbnQuRkxBR19BQ1RJVklUWV9SRU9SREVSX1RPX0ZST05UOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLlRFU1RfQUNUSVZJVFk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU9wdGlvbnM7CitpbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKy8qKiBVdGlsaXR5IGNsYXNzIHdoaWNoIGNvbnRhaW5zIGNvbW1vbiBjb2RlIGZvciBsYXVuY2hpbmcgYWN0aXZpdGllcy4gKi8KK3B1YmxpYyBjbGFzcyBBY3Rpdml0eUxhdW5jaGVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gQWN0aXZpdHlMYXVuY2hlci5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7CisKKyAgICAvKiogS2V5IGZvciBib29sZWFuIGV4dHJhLCBpbmRpY2F0ZXMgd2hldGhlciBpdCBzaG91bGQgbGF1bmNoIGFuIGFjdGl2aXR5LiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9MQVVOQ0hfQUNUSVZJVFkgPSAibGF1bmNoX2FjdGl2aXR5IjsKKyAgICAvKioKKyAgICAgKiBLZXkgZm9yIGJvb2xlYW4gZXh0cmEsIGluZGljYXRlcyB3aGV0aGVyIGl0IHRoZSBhY3Rpdml0eSBzaG91bGQgYmUgbGF1bmNoZWQgdG8gc2lkZSBpbgorICAgICAqIHNwbGl0LXNjcmVlbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTEFVTkNIX1RPX1NJREUgPSAibGF1bmNoX3RvX3RoZV9zaWRlIjsKKyAgICAvKioKKyAgICAgKiBLZXkgZm9yIGJvb2xlYW4gZXh0cmEsIGluZGljYXRlcyBpZiBsYXVuY2ggaW50ZW50IHNob3VsZCBpbmNsdWRlIHJhbmRvbSBkYXRhIHRvIGJlIGRpZmZlcmVudAorICAgICAqIGZyb20gb3RoZXIgbGF1bmNoIGludGVudHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1JBTkRPTV9EQVRBID0gInJhbmRvbV9kYXRhIjsKKyAgICAvKioKKyAgICAgKiBLZXkgZm9yIGJvb2xlYW4gZXh0cmEsIGluZGljYXRlcyBpZiBsYXVuY2ggaW50ZW50IHNob3VsZCBoYXZlCisgICAgICoge0BsaW5rIEludGVudCNGTEFHX0FDVElWSVRZX05FV19UQVNLfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTkVXX1RBU0sgPSAibmV3X3Rhc2siOworICAgIC8qKgorICAgICAqIEtleSBmb3IgYm9vbGVhbiBleHRyYSwgaW5kaWNhdGVzIGlmIGxhdW5jaCBpbnRlbnQgc2hvdWxkIGhhdmUKKyAgICAgKiB7QGxpbmsgSW50ZW50I0ZMQUdfQUNUSVZJVFlfTVVMVElQTEVfVEFTS30uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX01VTFRJUExFX1RBU0sgPSAibXVsdGlwbGVfdGFzayI7CisgICAgLyoqCisgICAgICogS2V5IGZvciBib29sZWFuIGV4dHJhLCBpbmRpY2F0ZXMgaWYgbGF1bmNoIGludGVudCBzaG91bGQgaGF2ZQorICAgICAqIHtAbGluayBJbnRlbnQjRkxBR19BQ1RJVklUWV9SRU9SREVSX1RPX0ZST05UfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUkVPUkRFUl9UT19GUk9OVCA9ICJyZW9yZGVyX3RvX2Zyb250IjsKKyAgICAvKioKKyAgICAgKiBLZXkgZm9yIHN0cmluZyBleHRyYSB3aXRoIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0YXJnZXQgY29tcG9uZW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9UQVJHRVRfQ09NUE9ORU5UID0gInRhcmdldF9jb21wb25lbnQiOworICAgIC8qKgorICAgICAqIEtleSBmb3IgaW50IGV4dHJhIHdpdGggdGFyZ2V0IGRpc3BsYXkgaWQgd2hlcmUgdGhlIGFjdGl2aXR5IHNob3VsZCBiZSBsYXVuY2hlZC4gQWRkaW5nIHRoaXMKKyAgICAgKiBhdXRvbWF0aWNhbGx5IGFwcGxpZXMge0BsaW5rIEludGVudCNGTEFHX0FDVElWSVRZX05FV19UQVNLfSBhbmQKKyAgICAgKiB7QGxpbmsgSW50ZW50I0ZMQUdfQUNUSVZJVFlfTVVMVElQTEVfVEFTS30gdG8gdGhlIGludGVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRElTUExBWV9JRCA9ICJkaXNwbGF5X2lkIjsKKyAgICAvKioKKyAgICAgKiBLZXkgZm9yIGJvb2xlYW4gZXh0cmEsIGluZGljYXRlcyBpZiBsYXVuY2ggc2hvdWxkIGJlIGRvbmUgZnJvbSBhcHBsaWNhdGlvbiBjb250ZXh0IG9mIHRoZSBvbmUKKyAgICAgKiBwYXNzZWQgaW4ge0BsaW5rICNsYXVuY2hBY3Rpdml0eUZyb21FeHRyYXMoQ29udGV4dCwgQnVuZGxlKX0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1VTRV9BUFBMSUNBVElPTl9DT05URVhUID0gInVzZV9hcHBsaWNhdGlvbl9jb250ZXh0IjsKKyAgICAvKioKKyAgICAgKiBLZXkgZm9yIGJvb2xlYW4gZXh0cmEsIGluZGljYXRlcyBpZiBpbnN0cnVtZW50YXRpb24gY29udGV4dCB3aWxsIGJlIHVzZWQgZm9yIGxhdW5jaC4gVGhpcworICAgICAqIG1lYW5zIHRoYXQge0BsaW5rIFBlbmRpbmdJbnRlbnR9IHNob3VsZCBiZSB1c2VkIGluc3RlYWQgb2YgYSByZWd1bGFyIG9uZSwgYmVjYXVzZSBhcHBsaWNhdGlvbgorICAgICAqIHN3aXRjaCB3aWxsIG5vdCBiZSBhbGxvd2VkIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVVNFX0lOU1RSVU1FTlRBVElPTiA9ICJ1c2VfaW5zdHJ1bWVudGF0aW9uIjsKKyAgICAvKioKKyAgICAgKiBLZXkgZm9yIGJvb2xlYW4gZXh0cmEsIGluZGljYXRlcyBpZiBhbnkgZXhjZXB0aW9ucyB0aHJvd24gZHVyaW5nIGxhdW5jaCBvdGhlciB0aGVuCisgICAgICoge0BsaW5rIFNlY3VyaXR5RXhjZXB0aW9ufSBzaG91bGQgYmUgc3VwcHJlc3NlZC4gQSB7QGxpbmsgU2VjdXJpdHlFeGNlcHRpb259IGlzIG5ldmVyIHRocm93biwKKyAgICAgKiBpdCdzIGFsd2F5cyB3cml0dGVuIHRvIGxvZ3MuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NVUFBSRVNTX0VYQ0VQVElPTlMgPSAic3VwcHJlc3NfZXhjZXB0aW9ucyI7CisKKworICAgIC8qKiBQZXJmb3JtIGFuIGFjdGl2aXR5IGxhdW5jaCBjb25maWd1cmVkIGJ5IHByb3ZpZGVkIGV4dHJhcy4gKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbGF1bmNoQWN0aXZpdHlGcm9tRXh0cmFzKGZpbmFsIENvbnRleHQgY29udGV4dCwgQnVuZGxlIGV4dHJhcykgeworICAgICAgICBpZiAoZXh0cmFzID09IG51bGwgfHwgIWV4dHJhcy5nZXRCb29sZWFuKEtFWV9MQVVOQ0hfQUNUSVZJVFkpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBMb2cuaShUQUcsICJsYXVuY2hBY3Rpdml0eUZyb21FeHRyYXM6IGV4dHJhcz0iICsgZXh0cmFzKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgdGFyZ2V0Q29tcG9uZW50ID0gZXh0cmFzLmdldFN0cmluZyhLRVlfVEFSR0VUX0NPTVBPTkVOVCk7CisgICAgICAgIGZpbmFsIEludGVudCBuZXdJbnRlbnQgPSBuZXcgSW50ZW50KCkuc2V0Q29tcG9uZW50KFRleHRVdGlscy5pc0VtcHR5KHRhcmdldENvbXBvbmVudCkKKyAgICAgICAgICAgICAgICA/IFRFU1RfQUNUSVZJVFkgOiBDb21wb25lbnROYW1lLnVuZmxhdHRlbkZyb21TdHJpbmcodGFyZ2V0Q29tcG9uZW50KSk7CisKKyAgICAgICAgaWYgKGV4dHJhcy5nZXRCb29sZWFuKEtFWV9MQVVOQ0hfVE9fU0lERSkpIHsKKyAgICAgICAgICAgIG5ld0ludGVudC5hZGRGbGFncyhGTEFHX0FDVElWSVRZX05FV19UQVNLIHwgRkxBR19BQ1RJVklUWV9MQVVOQ0hfQURKQUNFTlQpOworICAgICAgICAgICAgaWYgKGV4dHJhcy5nZXRCb29sZWFuKEtFWV9SQU5ET01fREFUQSkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBVcmkgZGF0YSA9IG5ldyBVcmkuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAucGF0aChTdHJpbmcudmFsdWVPZihTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICBuZXdJbnRlbnQuc2V0RGF0YShkYXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZXh0cmFzLmdldEJvb2xlYW4oS0VZX01VTFRJUExFX1RBU0spKSB7CisgICAgICAgICAgICBuZXdJbnRlbnQuYWRkRmxhZ3MoRkxBR19BQ1RJVklUWV9NVUxUSVBMRV9UQVNLKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXh0cmFzLmdldEJvb2xlYW4oS0VZX05FV19UQVNLKSkgeworICAgICAgICAgICAgbmV3SW50ZW50LmFkZEZsYWdzKEZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGV4dHJhcy5nZXRCb29sZWFuKEtFWV9SRU9SREVSX1RPX0ZST05UKSkgeworICAgICAgICAgICAgbmV3SW50ZW50LmFkZEZsYWdzKEZMQUdfQUNUSVZJVFlfUkVPUkRFUl9UT19GUk9OVCk7CisgICAgICAgIH0KKworICAgICAgICBBY3Rpdml0eU9wdGlvbnMgb3B0aW9ucyA9IG51bGw7CisgICAgICAgIGZpbmFsIGludCBkaXNwbGF5SWQgPSBleHRyYXMuZ2V0SW50KEtFWV9ESVNQTEFZX0lELCAtMSk7CisgICAgICAgIGlmIChkaXNwbGF5SWQgIT0gLTEpIHsKKyAgICAgICAgICAgIG9wdGlvbnMgPSBBY3Rpdml0eU9wdGlvbnMubWFrZUJhc2ljKCk7CisgICAgICAgICAgICBvcHRpb25zLnNldExhdW5jaERpc3BsYXlJZChkaXNwbGF5SWQpOworICAgICAgICAgICAgbmV3SW50ZW50LmFkZEZsYWdzKEZMQUdfQUNUSVZJVFlfTkVXX1RBU0sgfCBGTEFHX0FDVElWSVRZX01VTFRJUExFX1RBU0spOworICAgICAgICB9CisgICAgICAgIGZpbmFsIEJ1bmRsZSBvcHRpb25zQnVuZGxlID0gb3B0aW9ucyAhPSBudWxsID8gb3B0aW9ucy50b0J1bmRsZSgpIDogbnVsbDsKKworICAgICAgICBmaW5hbCBDb250ZXh0IGxhdW5jaENvbnRleHQgPSBleHRyYXMuZ2V0Qm9vbGVhbihLRVlfVVNFX0FQUExJQ0FUSU9OX0NPTlRFWFQpID8KKyAgICAgICAgICAgICAgICBjb250ZXh0LmdldEFwcGxpY2F0aW9uQ29udGV4dCgpIDogY29udGV4dDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGV4dHJhcy5nZXRCb29sZWFuKEtFWV9VU0VfSU5TVFJVTUVOVEFUSU9OKSkgeworICAgICAgICAgICAgICAgIC8vIFVzaW5nIFBlbmRpbmdJbnRlbnQgZm9yIEluc3RydW1lbnRhdGlvbiBsYXVuY2hlcywgYmVjYXVzZSBvdGhlcndpc2Ugd2Ugd29uJ3QKKyAgICAgICAgICAgICAgICAvLyBiZSBhbGxvd2VkIHRvIHN3aXRjaCB0aGUgY3VycmVudCBhY3Rpdml0eSB3aXRoIG91cnMgd2l0aCBkaWZmZXJlbnQgdWlkLgorICAgICAgICAgICAgICAgIC8vIGFuZHJvaWQucGVybWlzc2lvbi5TVE9QX0FQUF9TV0lUQ0hFUyBpcyBuZWVkZWQgdG8gZG8gdGhpcyBkaXJlY3RseS4KKyAgICAgICAgICAgICAgICBmaW5hbCBQZW5kaW5nSW50ZW50IHBlbmRpbmdJbnRlbnQgPSBQZW5kaW5nSW50ZW50LmdldEFjdGl2aXR5KGxhdW5jaENvbnRleHQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdJbnRlbnQsIDAsIG9wdGlvbnNCdW5kbGUpOworICAgICAgICAgICAgICAgIHBlbmRpbmdJbnRlbnQuc2VuZCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsYXVuY2hDb250ZXh0LnN0YXJ0QWN0aXZpdHkobmV3SW50ZW50LCBvcHRpb25zQnVuZGxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiU2VjdXJpdHlFeGNlcHRpb24gbGF1bmNoaW5nIGFjdGl2aXR5Iik7CisgICAgICAgIH0gY2F0Y2ggKFBlbmRpbmdJbnRlbnQuQ2FuY2VsZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaWYgKGV4dHJhcy5nZXRCb29sZWFuKEtFWV9TVVBQUkVTU19FWENFUFRJT05TKSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkV4Y2VwdGlvbiBsYXVuY2hpbmcgYWN0aXZpdHkgd2l0aCBwZW5kaW5nIGludGVudCIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExvZy5lKFRBRywgIlNlY3VyaXR5RXhjZXB0aW9uIGxhdW5jaGluZyBhY3Rpdml0eSIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaWYgKGV4dHJhcy5nZXRCb29sZWFuKEtFWV9TVVBQUkVTU19FWENFUFRJT05TKSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkV4Y2VwdGlvbiBsYXVuY2hpbmcgYWN0aXZpdHkiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci91dGlsL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJTdGF0ZS5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3V0aWwvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlclN0YXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFlY2Q0ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci91dGlsL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJTdGF0ZS5qYXZhCkBAIC0wLDAgKzEsNzI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLmFtOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlci5TdGFja0lkLklOVkFMSURfU1RBQ0tfSUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLldpbmRvd0NvbmZpZ3VyYXRpb24uQUNUSVZJVFlfVFlQRV9IT01FOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5XaW5kb3dDb25maWd1cmF0aW9uLkFDVElWSVRZX1RZUEVfUkVDRU5UUzsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuV2luZG93Q29uZmlndXJhdGlvbi5BQ1RJVklUWV9UWVBFX1NUQU5EQVJEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5XaW5kb3dDb25maWd1cmF0aW9uLkFDVElWSVRZX1RZUEVfVU5ERUZJTkVEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5XaW5kb3dDb25maWd1cmF0aW9uLldJTkRPV0lOR19NT0RFX1VOREVGSU5FRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50TmFtZVV0aWxzLmdldEFjdGl2aXR5TmFtZTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uUHJvdG9FeHRyYWN0b3JzLmV4dHJhY3Q7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLlN0YXRlTG9nZ2VyLmxvZzsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uU3RhdGVMb2dnZXIubG9nRTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworCitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLmFtLm5hbm8uQWN0aXZpdHlEaXNwbGF5UHJvdG87CitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLmFtLm5hbm8uQWN0aXZpdHlNYW5hZ2VyU2VydmljZUR1bXBBY3Rpdml0aWVzUHJvdG87CitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLmFtLm5hbm8uQWN0aXZpdHlSZWNvcmRQcm90bzsKK2ltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIuYW0ubmFuby5BY3Rpdml0eVN0YWNrUHJvdG87CitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLmFtLm5hbm8uQWN0aXZpdHlTdGFja1N1cGVydmlzb3JQcm90bzsKK2ltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIuYW0ubmFuby5LZXlndWFyZENvbnRyb2xsZXJQcm90bzsKK2ltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIuYW0ubmFuby5UYXNrUmVjb3JkUHJvdG87CitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLndtLm5hbm8uQ29uZmlndXJhdGlvbkNvbnRhaW5lclByb3RvOworCitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkludmFsaWRQcm90b2NvbEJ1ZmZlck5hbm9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgQWN0aXZpdHlNYW5hZ2VyU3RhdGUgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRFVNUF9NT0RFX0FDVElWSVRJRVMgPSAwOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVEVfUkVTVU1FRCA9ICJSRVNVTUVEIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFURV9QQVVTRUQgPSAiUEFVU0VEIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFURV9TVE9QUEVEID0gIlNUT1BQRUQiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRFX0RFU1RST1lFRCA9ICJERVNUUk9ZRUQiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERVTVBTWVNfQUNUSVZJVFlfQUNUSVZJVElFUyA9ICJkdW1wc3lzIGFjdGl2aXR5IC0tcHJvdG8gYWN0aXZpdGllcyI7CisKKyAgICAvLyBEaXNwbGF5cyBpbiB6LW9yZGVyIHdpdGggdGhlIHRvcCBtb3N0IGF0IHRoZSBmcm9udCBvZiB0aGUgbGlzdCwgc3RhcnRpbmcgd2l0aCBwcmltYXJ5LgorICAgIHByaXZhdGUgZmluYWwgTGlzdDxBY3Rpdml0eURpc3BsYXk+IG1EaXNwbGF5cyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgIC8vIFN0YWNrcyBpbiB6LW9yZGVyIHdpdGggdGhlIHRvcCBtb3N0IGF0IHRoZSBmcm9udCBvZiB0aGUgbGlzdCwgc3RhcnRpbmcgd2l0aCBwcmltYXJ5IGRpc3BsYXkuCisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PEFjdGl2aXR5U3RhY2s+IG1TdGFja3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICBwcml2YXRlIEtleWd1YXJkQ29udHJvbGxlclN0YXRlIG1LZXlndWFyZENvbnRyb2xsZXJTdGF0ZTsKKyAgICBwcml2YXRlIGludCBtRm9jdXNlZFN0YWNrSWQgPSAtMTsKKyAgICBwcml2YXRlIEJvb2xlYW4gbUlzSG9tZVJlY2VudHNDb21wb25lbnQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgbVJlc3VtZWRBY3Rpdml0eVJlY29yZCA9IG51bGw7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFN0cmluZz4gbVJlc3VtZWRBY3Rpdml0aWVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICB2b2lkIGNvbXB1dGVTdGF0ZSgpIHsKKyAgICAgICAgY29tcHV0ZVN0YXRlKERVTVBfTU9ERV9BQ1RJVklUSUVTKTsKKyAgICB9CisKKyAgICB2b2lkIGNvbXB1dGVTdGF0ZShpbnQgZHVtcE1vZGUpIHsKKyAgICAgICAgLy8gSXQgaXMgcG9zc2libGUgdGhlIHN5c3RlbSBpcyBpbiB0aGUgbWlkZGxlIG9mIHRyYW5zaXRpb24gdG8gdGhlIHJpZ2h0IHN0YXRlIHdoZW4gd2UgZ2V0CisgICAgICAgIC8vIHRoZSBkdW1wLiBXZSB0cnkgYSBmZXcgdGltZXMgdG8gZ2V0IHRoZSBpbmZvcm1hdGlvbiB3ZSBuZWVkIGJlZm9yZSBnaXZpbmcgdXAuCisgICAgICAgIGludCByZXRyaWVzTGVmdCA9IDM7CisgICAgICAgIGJvb2xlYW4gcmV0cnkgPSBmYWxzZTsKKyAgICAgICAgYnl0ZVtdIGR1bXAgPSBudWxsOworCisgICAgICAgIGxvZygiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7CisgICAgICAgIGxvZygiICAgICBBY3Rpdml0eU1hbmFnZXJTdGF0ZSAgICAgIik7CisgICAgICAgIGxvZygiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7CisKKyAgICAgICAgZG8geworICAgICAgICAgICAgaWYgKHJldHJ5KSB7CisgICAgICAgICAgICAgICAgbG9nKCIqKipJbmNvbXBsZXRlIEFNIHN0YXRlLiBSZXRyeWluZy4uLiIpOworICAgICAgICAgICAgICAgIC8vIFdhaXQgaGFsZiBhIHNlY29uZCBiZXR3ZWVuIHJldHJpZXMgZm9yIGFjdGl2aXR5IG1hbmFnZXIgdG8gZmluaXNoIHRyYW5zaXRpb25pbmcuCisgICAgICAgICAgICAgICAgU3lzdGVtQ2xvY2suc2xlZXAoNTAwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIGR1bXBzeXNDbWQgPSAiIjsKKyAgICAgICAgICAgIHN3aXRjaCAoZHVtcE1vZGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIERVTVBfTU9ERV9BQ1RJVklUSUVTOgorICAgICAgICAgICAgICAgICAgICBkdW1wc3lzQ21kID0gRFVNUFNZU19BQ1RJVklUWV9BQ1RJVklUSUVTOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZHVtcCA9IGV4ZWN1dGVTaGVsbENvbW1hbmQoZHVtcHN5c0NtZCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHBhcnNlU3lzRHVtcFByb3RvKGR1bXApOworICAgICAgICAgICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyTmFub0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJGYWlsZWQgdG8gcGFyc2UgZHVtcHN5czpcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgbmV3IFN0cmluZyhkdW1wLCBTdGFuZGFyZENoYXJzZXRzLlVURl84KSwgZXgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXRyeSA9IG1TdGFja3MuaXNFbXB0eSgpIHx8IG1Gb2N1c2VkU3RhY2tJZCA9PSAtMSB8fCAobVJlc3VtZWRBY3Rpdml0eVJlY29yZCA9PSBudWxsCisgICAgICAgICAgICAgICAgICAgIHx8IG1SZXN1bWVkQWN0aXZpdGllcy5pc0VtcHR5KCkpICYmICFtS2V5Z3VhcmRDb250cm9sbGVyU3RhdGUua2V5Z3VhcmRTaG93aW5nOworICAgICAgICB9IHdoaWxlIChyZXRyeSAmJiByZXRyaWVzTGVmdC0tID4gMCk7CisKKyAgICAgICAgaWYgKG1TdGFja3MuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBsb2dFKCJObyBzdGFja3MgZm91bmQuLi4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUZvY3VzZWRTdGFja0lkID09IC0xKSB7CisgICAgICAgICAgICBsb2dFKCJObyBmb2N1c2VkIHN0YWNrIGZvdW5kLi4uIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1SZXN1bWVkQWN0aXZpdHlSZWNvcmQgPT0gbnVsbCkgeworICAgICAgICAgICAgbG9nRSgiTm8gZm9jdXNlZCBhY3Rpdml0eSBmb3VuZC4uLiIpOworICAgICAgICB9CisgICAgICAgIGlmIChtUmVzdW1lZEFjdGl2aXRpZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBsb2dFKCJObyByZXN1bWVkIGFjdGl2aXRpZXMgZm91bmQuLi4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYnl0ZVtdIGV4ZWN1dGVTaGVsbENvbW1hbmQoU3RyaW5nIGNtZCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgcGZkID0KKyAgICAgICAgICAgICAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VWlBdXRvbWF0aW9uKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXhlY3V0ZVNoZWxsQ29tbWFuZChjbWQpOworICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzUxMl07CisgICAgICAgICAgICBpbnQgYnl0ZXNSZWFkOworICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG5ldyBQYXJjZWxGaWxlRGVzY3JpcHRvci5BdXRvQ2xvc2VJbnB1dFN0cmVhbShwZmQpOworICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHN0ZG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIHdoaWxlICgoYnl0ZXNSZWFkID0gZmlzLnJlYWQoYnVmKSkgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBzdGRvdXQud3JpdGUoYnVmLCAwLCBieXRlc1JlYWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmlzLmNsb3NlKCk7CisgICAgICAgICAgICByZXR1cm4gc3Rkb3V0LnRvQnl0ZUFycmF5KCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlU3lzRHVtcFByb3RvKGJ5dGVbXSBzeXNEdW1wKSB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyTmFub0V4Y2VwdGlvbiB7CisgICAgICAgIHJlc2V0KCk7CisKKyAgICAgICAgQWN0aXZpdHlTdGFja1N1cGVydmlzb3JQcm90byBzdGF0ZSA9IEFjdGl2aXR5TWFuYWdlclNlcnZpY2VEdW1wQWN0aXZpdGllc1Byb3RvLnBhcnNlRnJvbShzeXNEdW1wKQorICAgICAgICAgICAgICAgIC5hY3Rpdml0eVN0YWNrU3VwZXJ2aXNvcjsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0ZS5kaXNwbGF5cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgQWN0aXZpdHlEaXNwbGF5UHJvdG8gYWN0aXZpdHlEaXNwbGF5ID0gc3RhdGUuZGlzcGxheXNbaV07CisgICAgICAgICAgICBtRGlzcGxheXMuYWRkKG5ldyBBY3Rpdml0eURpc3BsYXkoYWN0aXZpdHlEaXNwbGF5LCB0aGlzKSk7CisgICAgICAgIH0KKyAgICAgICAgbUtleWd1YXJkQ29udHJvbGxlclN0YXRlID0gbmV3IEtleWd1YXJkQ29udHJvbGxlclN0YXRlKHN0YXRlLmtleWd1YXJkQ29udHJvbGxlcik7CisgICAgICAgIG1Gb2N1c2VkU3RhY2tJZCA9IHN0YXRlLmZvY3VzZWRTdGFja0lkOworICAgICAgICBpZiAoc3RhdGUucmVzdW1lZEFjdGl2aXR5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1SZXN1bWVkQWN0aXZpdHlSZWNvcmQgPSBzdGF0ZS5yZXN1bWVkQWN0aXZpdHkudGl0bGU7CisgICAgICAgIH0KKyAgICAgICAgbUlzSG9tZVJlY2VudHNDb21wb25lbnQgPSBuZXcgQm9vbGVhbihzdGF0ZS5pc0hvbWVSZWNlbnRzQ29tcG9uZW50KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVzZXQoKSB7CisgICAgICAgIG1EaXNwbGF5cy5jbGVhcigpOworICAgICAgICBtU3RhY2tzLmNsZWFyKCk7CisgICAgICAgIG1Gb2N1c2VkU3RhY2tJZCA9IC0xOworICAgICAgICBtUmVzdW1lZEFjdGl2aXR5UmVjb3JkID0gbnVsbDsKKyAgICAgICAgbVJlc3VtZWRBY3Rpdml0aWVzLmNsZWFyKCk7CisgICAgICAgIG1LZXlndWFyZENvbnRyb2xsZXJTdGF0ZSA9IG51bGw7CisgICAgICAgIG1Jc0hvbWVSZWNlbnRzQ29tcG9uZW50ID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFdoZXRoZXIgdGhlIGhvbWUgYWN0aXZpdHkgaXMgdGhlIHJlY2VudHMgY29tcG9uZW50LgorICAgICAqLworICAgIGJvb2xlYW4gaXNIb21lUmVjZW50c0NvbXBvbmVudCgpIHsKKyAgICAgICAgaWYgKG1Jc0hvbWVSZWNlbnRzQ29tcG9uZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgIGNvbXB1dGVTdGF0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtSXNIb21lUmVjZW50c0NvbXBvbmVudDsKKyAgICB9CisKKyAgICBBY3Rpdml0eURpc3BsYXkgZ2V0RGlzcGxheShpbnQgZGlzcGxheUlkKSB7CisgICAgICAgIGZvciAoQWN0aXZpdHlEaXNwbGF5IGRpc3BsYXkgOiBtRGlzcGxheXMpIHsKKyAgICAgICAgICAgIGlmIChkaXNwbGF5Lm1JZCA9PSBkaXNwbGF5SWQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGlzcGxheTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBpbnQgZ2V0RnJvbnRTdGFja0lkKGludCBkaXNwbGF5SWQpIHsKKyAgICAgICAgcmV0dXJuIGdldERpc3BsYXkoZGlzcGxheUlkKS5tU3RhY2tzLmdldCgwKS5tU3RhY2tJZDsKKyAgICB9CisKKyAgICBpbnQgZ2V0RnJvbnRTdGFja0FjdGl2aXR5VHlwZShpbnQgZGlzcGxheUlkKSB7CisgICAgICAgIHJldHVybiBnZXREaXNwbGF5KGRpc3BsYXlJZCkubVN0YWNrcy5nZXQoMCkuZ2V0QWN0aXZpdHlUeXBlKCk7CisgICAgfQorCisgICAgaW50IGdldEZyb250U3RhY2tXaW5kb3dpbmdNb2RlKGludCBkaXNwbGF5SWQpIHsKKyAgICAgICAgcmV0dXJuIGdldERpc3BsYXkoZGlzcGxheUlkKS5tU3RhY2tzLmdldCgwKS5nZXRXaW5kb3dpbmdNb2RlKCk7CisgICAgfQorCisgICAgaW50IGdldEZvY3VzZWRTdGFja0lkKCkgeworICAgICAgICByZXR1cm4gbUZvY3VzZWRTdGFja0lkOworICAgIH0KKworICAgIGludCBnZXRGb2N1c2VkU3RhY2tBY3Rpdml0eVR5cGUoKSB7CisgICAgICAgIGZpbmFsIEFjdGl2aXR5U3RhY2sgc3RhY2sgPSBnZXRTdGFja0J5SWQobUZvY3VzZWRTdGFja0lkKTsKKyAgICAgICAgcmV0dXJuIHN0YWNrICE9IG51bGwgPyBzdGFjay5nZXRBY3Rpdml0eVR5cGUoKSA6IEFDVElWSVRZX1RZUEVfVU5ERUZJTkVEOworICAgIH0KKworICAgIGludCBnZXRGb2N1c2VkU3RhY2tXaW5kb3dpbmdNb2RlKCkgeworICAgICAgICBmaW5hbCBBY3Rpdml0eVN0YWNrIHN0YWNrID0gZ2V0U3RhY2tCeUlkKG1Gb2N1c2VkU3RhY2tJZCk7CisgICAgICAgIHJldHVybiBzdGFjayAhPSBudWxsID8gc3RhY2suZ2V0V2luZG93aW5nTW9kZSgpIDogV0lORE9XSU5HX01PREVfVU5ERUZJTkVEOworICAgIH0KKworICAgIFN0cmluZyBnZXRGb2N1c2VkQWN0aXZpdHkoKSB7CisgICAgICAgIHJldHVybiBtUmVzdW1lZEFjdGl2aXR5UmVjb3JkOworICAgIH0KKworICAgIFN0cmluZyBnZXRSZXN1bWVkQWN0aXZpdHkoKSB7CisgICAgICAgIHJldHVybiBtUmVzdW1lZEFjdGl2aXRpZXMuZ2V0KDApOworICAgIH0KKworICAgIGludCBnZXRSZXN1bWVkQWN0aXZpdGllc0NvdW50KCkgeworICAgICAgICByZXR1cm4gbVJlc3VtZWRBY3Rpdml0aWVzLnNpemUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgS2V5Z3VhcmRDb250cm9sbGVyU3RhdGUgZ2V0S2V5Z3VhcmRDb250cm9sbGVyU3RhdGUoKSB7CisgICAgICAgIHJldHVybiBtS2V5Z3VhcmRDb250cm9sbGVyU3RhdGU7CisgICAgfQorCisgICAgYm9vbGVhbiBjb250YWluc1N0YWNrKGludCBzdGFja0lkKSB7CisgICAgICAgIHJldHVybiBnZXRTdGFja0J5SWQoc3RhY2tJZCkgIT0gbnVsbDsKKyAgICB9CisKKyAgICBib29sZWFuIGNvbnRhaW5zU3RhY2soaW50IHdpbmRvd2luZ01vZGUsIGludCBhY3Rpdml0eVR5cGUpIHsKKyAgICAgICAgZm9yIChBY3Rpdml0eVN0YWNrIHN0YWNrIDogbVN0YWNrcykgeworICAgICAgICAgICAgaWYgKGFjdGl2aXR5VHlwZSAhPSBBQ1RJVklUWV9UWVBFX1VOREVGSU5FRAorICAgICAgICAgICAgICAgICAgICAmJiBhY3Rpdml0eVR5cGUgIT0gc3RhY2suZ2V0QWN0aXZpdHlUeXBlKCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh3aW5kb3dpbmdNb2RlICE9IFdJTkRPV0lOR19NT0RFX1VOREVGSU5FRAorICAgICAgICAgICAgICAgICAgICAmJiB3aW5kb3dpbmdNb2RlICE9IHN0YWNrLmdldFdpbmRvd2luZ01vZGUoKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEFjdGl2aXR5U3RhY2sgZ2V0U3RhY2tCeUlkKGludCBzdGFja0lkKSB7CisgICAgICAgIGZvciAoQWN0aXZpdHlTdGFjayBzdGFjayA6IG1TdGFja3MpIHsKKyAgICAgICAgICAgIGlmIChzdGFja0lkID09IHN0YWNrLm1TdGFja0lkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YWNrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEFjdGl2aXR5U3RhY2sgZ2V0U3RhY2tCeUFjdGl2aXR5VHlwZShpbnQgYWN0aXZpdHlUeXBlKSB7CisgICAgICAgIGZvciAoQWN0aXZpdHlTdGFjayBzdGFjayA6IG1TdGFja3MpIHsKKyAgICAgICAgICAgIGlmIChhY3Rpdml0eVR5cGUgPT0gc3RhY2suZ2V0QWN0aXZpdHlUeXBlKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhY2s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQWN0aXZpdHlTdGFjayBnZXRTdGFuZGFyZFN0YWNrQnlXaW5kb3dpbmdNb2RlKGludCB3aW5kb3dpbmdNb2RlKSB7CisgICAgICAgIGZvciAoQWN0aXZpdHlTdGFjayBzdGFjayA6IG1TdGFja3MpIHsKKyAgICAgICAgICAgIGlmIChzdGFjay5nZXRBY3Rpdml0eVR5cGUoKSAhPSBBQ1RJVklUWV9UWVBFX1NUQU5EQVJEKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhY2suZ2V0V2luZG93aW5nTW9kZSgpID09IHdpbmRvd2luZ01vZGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhY2s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgaW50IGdldFN0YW5kYXJkVGFza0NvdW50QnlXaW5kb3dpbmdNb2RlKGludCB3aW5kb3dpbmdNb2RlKSB7CisgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgIGZvciAoQWN0aXZpdHlTdGFjayBzdGFjayA6IG1TdGFja3MpIHsKKyAgICAgICAgICAgIGlmIChzdGFjay5nZXRBY3Rpdml0eVR5cGUoKSAhPSBBQ1RJVklUWV9UWVBFX1NUQU5EQVJEKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhY2suZ2V0V2luZG93aW5nTW9kZSgpID09IHdpbmRvd2luZ01vZGUpIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBzdGFjay5tVGFza3Muc2l6ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBjb3VudDsKKyAgICB9CisKKyAgICAvKiogR2V0IHRoZSBzdGFjayBwb3NpdGlvbiBvbiBpdHMgZGlzcGxheS4gKi8KKyAgICBpbnQgZ2V0U3RhY2tJbmRleEJ5QWN0aXZpdHlUeXBlKGludCBhY3Rpdml0eVR5cGUpIHsKKyAgICAgICAgZm9yIChBY3Rpdml0eURpc3BsYXkgZGlzcGxheSA6IG1EaXNwbGF5cykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaXNwbGF5Lm1TdGFja3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoYWN0aXZpdHlUeXBlID09IGRpc3BsYXkubVN0YWNrcy5nZXQoaSkuZ2V0QWN0aXZpdHlUeXBlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiogR2V0IHRoZSBzdGFjayBwb3NpdGlvbiBvbiBpdHMgZGlzcGxheS4gKi8KKyAgICBpbnQgZ2V0U3RhY2tJbmRleEJ5QWN0aXZpdHkoQ29tcG9uZW50TmFtZSBhY3Rpdml0eU5hbWUpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGZ1bGxOYW1lID0gZ2V0QWN0aXZpdHlOYW1lKGFjdGl2aXR5TmFtZSk7CisKKyAgICAgICAgZm9yIChBY3Rpdml0eURpc3BsYXkgZGlzcGxheSA6IG1EaXNwbGF5cykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IGRpc3BsYXkubVN0YWNrcy5zaXplKCkgLSAxOyBpID49IDA7IC0taSkgeworICAgICAgICAgICAgICAgIGZpbmFsIEFjdGl2aXR5U3RhY2sgc3RhY2sgPSBkaXNwbGF5Lm1TdGFja3MuZ2V0KGkpOworICAgICAgICAgICAgICAgIGZvciAoQWN0aXZpdHlUYXNrIHRhc2sgOiBzdGFjay5tVGFza3MpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChBY3Rpdml0eSBhY3Rpdml0eSA6IHRhc2subUFjdGl2aXRpZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpdml0eS5uYW1lLmVxdWFscyhmdWxsTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyoqIEdldCBkaXNwbGF5IGlkIGJ5IGFjdGl2aXR5IG9uIGl0LiAqLworICAgIGludCBnZXREaXNwbGF5QnlBY3Rpdml0eShDb21wb25lbnROYW1lIGFjdGl2aXR5Q29tcG9uZW50KSB7CisgICAgICAgIGZpbmFsIEFjdGl2aXR5TWFuYWdlclN0YXRlLkFjdGl2aXR5VGFzayB0YXNrID0gZ2V0VGFza0J5QWN0aXZpdHkoYWN0aXZpdHlDb21wb25lbnQpOworICAgICAgICBpZiAodGFzayA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdldFN0YWNrQnlJZCh0YXNrLm1TdGFja0lkKS5tRGlzcGxheUlkOworICAgIH0KKworICAgIExpc3Q8QWN0aXZpdHlEaXNwbGF5PiBnZXREaXNwbGF5cygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8PihtRGlzcGxheXMpOworICAgIH0KKworICAgIExpc3Q8QWN0aXZpdHlTdGFjaz4gZ2V0U3RhY2tzKCkgeworICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDw+KG1TdGFja3MpOworICAgIH0KKworICAgIGludCBnZXRTdGFja0NvdW50KCkgeworICAgICAgICByZXR1cm4gbVN0YWNrcy5zaXplKCk7CisgICAgfQorCisgICAgYm9vbGVhbiBjb250YWluc0FjdGl2aXR5KENvbXBvbmVudE5hbWUgYWN0aXZpdHlOYW1lKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBmdWxsTmFtZSA9IGdldEFjdGl2aXR5TmFtZShhY3Rpdml0eU5hbWUpOworICAgICAgICBmb3IgKEFjdGl2aXR5U3RhY2sgc3RhY2sgOiBtU3RhY2tzKSB7CisgICAgICAgICAgICBmb3IgKEFjdGl2aXR5VGFzayB0YXNrIDogc3RhY2subVRhc2tzKSB7CisgICAgICAgICAgICAgICAgZm9yIChBY3Rpdml0eSBhY3Rpdml0eSA6IHRhc2subUFjdGl2aXRpZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGl2aXR5Lm5hbWUuZXF1YWxzKGZ1bGxOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2xlYW4gY29udGFpbnNBY3Rpdml0eUluV2luZG93aW5nTW9kZShDb21wb25lbnROYW1lIGFjdGl2aXR5TmFtZSwgaW50IHdpbmRvd2luZ01vZGUpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGZ1bGxOYW1lID0gZ2V0QWN0aXZpdHlOYW1lKGFjdGl2aXR5TmFtZSk7CisgICAgICAgIGZvciAoQWN0aXZpdHlTdGFjayBzdGFjayA6IG1TdGFja3MpIHsKKyAgICAgICAgICAgIGZvciAoQWN0aXZpdHlUYXNrIHRhc2sgOiBzdGFjay5tVGFza3MpIHsKKyAgICAgICAgICAgICAgICBmb3IgKEFjdGl2aXR5IGFjdGl2aXR5IDogdGFzay5tQWN0aXZpdGllcykgeworICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZpdHkubmFtZS5lcXVhbHMoZnVsbE5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgYWN0aXZpdHkuZ2V0V2luZG93aW5nTW9kZSgpID09IHdpbmRvd2luZ01vZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sZWFuIGlzQWN0aXZpdHlWaXNpYmxlKENvbXBvbmVudE5hbWUgYWN0aXZpdHlOYW1lKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBmdWxsTmFtZSA9IGdldEFjdGl2aXR5TmFtZShhY3Rpdml0eU5hbWUpOworICAgICAgICBmb3IgKEFjdGl2aXR5U3RhY2sgc3RhY2sgOiBtU3RhY2tzKSB7CisgICAgICAgICAgICBmb3IgKEFjdGl2aXR5VGFzayB0YXNrIDogc3RhY2subVRhc2tzKSB7CisgICAgICAgICAgICAgICAgZm9yIChBY3Rpdml0eSBhY3Rpdml0eSA6IHRhc2subUFjdGl2aXRpZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGl2aXR5Lm5hbWUuZXF1YWxzKGZ1bGxOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjdGl2aXR5LnZpc2libGU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2xlYW4gaXNBY3Rpdml0eVRyYW5zbHVjZW50KENvbXBvbmVudE5hbWUgYWN0aXZpdHlOYW1lKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBmdWxsTmFtZSA9IGdldEFjdGl2aXR5TmFtZShhY3Rpdml0eU5hbWUpOworICAgICAgICBmb3IgKEFjdGl2aXR5U3RhY2sgc3RhY2sgOiBtU3RhY2tzKSB7CisgICAgICAgICAgICBmb3IgKEFjdGl2aXR5VGFzayB0YXNrIDogc3RhY2subVRhc2tzKSB7CisgICAgICAgICAgICAgICAgZm9yIChBY3Rpdml0eSBhY3Rpdml0eSA6IHRhc2subUFjdGl2aXRpZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGl2aXR5Lm5hbWUuZXF1YWxzKGZ1bGxOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjdGl2aXR5LnRyYW5zbHVjZW50OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sZWFuIGlzQmVoaW5kT3BhcXVlQWN0aXZpdGllcyhDb21wb25lbnROYW1lIGFjdGl2aXR5TmFtZSkgeworICAgICAgICBmaW5hbCBTdHJpbmcgZnVsbE5hbWUgPSBnZXRBY3Rpdml0eU5hbWUoYWN0aXZpdHlOYW1lKTsKKyAgICAgICAgZm9yIChBY3Rpdml0eVN0YWNrIHN0YWNrIDogbVN0YWNrcykgeworICAgICAgICAgICAgZm9yIChBY3Rpdml0eVRhc2sgdGFzayA6IHN0YWNrLm1UYXNrcykgeworICAgICAgICAgICAgICAgIGZvciAoQWN0aXZpdHkgYWN0aXZpdHkgOiB0YXNrLm1BY3Rpdml0aWVzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpdml0eS5uYW1lLmVxdWFscyhmdWxsTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIWFjdGl2aXR5LnRyYW5zbHVjZW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sZWFuIGNvbnRhaW5zU3RhcnRlZEFjdGl2aXRpZXMoKSB7CisgICAgICAgIGZvciAoQWN0aXZpdHlTdGFjayBzdGFjayA6IG1TdGFja3MpIHsKKyAgICAgICAgICAgIGZvciAoQWN0aXZpdHlUYXNrIHRhc2sgOiBzdGFjay5tVGFza3MpIHsKKyAgICAgICAgICAgICAgICBmb3IgKEFjdGl2aXR5IGFjdGl2aXR5IDogdGFzay5tQWN0aXZpdGllcykgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWFjdGl2aXR5LnN0YXRlLmVxdWFscyhTVEFURV9TVE9QUEVEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICFhY3Rpdml0eS5zdGF0ZS5lcXVhbHMoU1RBVEVfREVTVFJPWUVEKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2xlYW4gaGFzQWN0aXZpdHlTdGF0ZShDb21wb25lbnROYW1lIGFjdGl2aXR5TmFtZSwgU3RyaW5nIGFjdGl2aXR5U3RhdGUpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGZ1bGxOYW1lID0gZ2V0QWN0aXZpdHlOYW1lKGFjdGl2aXR5TmFtZSk7CisgICAgICAgIGZvciAoQWN0aXZpdHlTdGFjayBzdGFjayA6IG1TdGFja3MpIHsKKyAgICAgICAgICAgIGZvciAoQWN0aXZpdHlUYXNrIHRhc2sgOiBzdGFjay5tVGFza3MpIHsKKyAgICAgICAgICAgICAgICBmb3IgKEFjdGl2aXR5IGFjdGl2aXR5IDogdGFzay5tQWN0aXZpdGllcykgeworICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZpdHkubmFtZS5lcXVhbHMoZnVsbE5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWN0aXZpdHkuc3RhdGUuZXF1YWxzKGFjdGl2aXR5U3RhdGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbnQgZ2V0QWN0aXZpdHlQcm9jSWQoQ29tcG9uZW50TmFtZSBhY3Rpdml0eU5hbWUpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGZ1bGxOYW1lID0gZ2V0QWN0aXZpdHlOYW1lKGFjdGl2aXR5TmFtZSk7CisgICAgICAgIGZvciAoQWN0aXZpdHlTdGFjayBzdGFjayA6IG1TdGFja3MpIHsKKyAgICAgICAgICAgIGZvciAoQWN0aXZpdHlUYXNrIHRhc2sgOiBzdGFjay5tVGFza3MpIHsKKyAgICAgICAgICAgICAgICBmb3IgKEFjdGl2aXR5IGFjdGl2aXR5IDogdGFzay5tQWN0aXZpdGllcykgeworICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZpdHkubmFtZS5lcXVhbHMoZnVsbE5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWN0aXZpdHkucHJvY0lkOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBib29sZWFuIGlzSG9tZUFjdGl2aXR5VmlzaWJsZSgpIHsKKyAgICAgICAgZmluYWwgQWN0aXZpdHkgaG9tZUFjdGl2aXR5ID0gZ2V0SG9tZUFjdGl2aXR5KCk7CisgICAgICAgIHJldHVybiBob21lQWN0aXZpdHkgIT0gbnVsbCAmJiBob21lQWN0aXZpdHkudmlzaWJsZTsKKyAgICB9CisKKyAgICBib29sZWFuIGlzUmVjZW50c0FjdGl2aXR5VmlzaWJsZSgpIHsKKyAgICAgICAgZmluYWwgQWN0aXZpdHkgcmVjZW50c0FjdGl2aXR5ID0gZ2V0UmVjZW50c0FjdGl2aXR5KCk7CisgICAgICAgIHJldHVybiByZWNlbnRzQWN0aXZpdHkgIT0gbnVsbCAmJiByZWNlbnRzQWN0aXZpdHkudmlzaWJsZTsKKyAgICB9CisKKyAgICBDb21wb25lbnROYW1lIGdldEhvbWVBY3Rpdml0eU5hbWUoKSB7CisgICAgICAgIEFjdGl2aXR5IGFjdGl2aXR5ID0gZ2V0SG9tZUFjdGl2aXR5KCk7CisgICAgICAgIGlmIChhY3Rpdml0eSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQ29tcG9uZW50TmFtZS51bmZsYXR0ZW5Gcm9tU3RyaW5nKGFjdGl2aXR5Lm5hbWUpOworICAgIH0KKworICAgIEFjdGl2aXR5VGFzayBnZXRIb21lVGFzaygpIHsKKyAgICAgICAgZmluYWwgQWN0aXZpdHlTdGFjayBob21lU3RhY2sgPSBnZXRTdGFja0J5QWN0aXZpdHlUeXBlKEFDVElWSVRZX1RZUEVfSE9NRSk7CisgICAgICAgIGlmIChob21lU3RhY2sgIT0gbnVsbCAmJiAhaG9tZVN0YWNrLm1UYXNrcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBob21lU3RhY2subVRhc2tzLmdldCgwKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIEFjdGl2aXR5VGFzayBnZXRSZWNlbnRzVGFzaygpIHsKKyAgICAgICAgZmluYWwgQWN0aXZpdHlTdGFjayByZWNlbnRzU3RhY2sgPSBnZXRTdGFja0J5QWN0aXZpdHlUeXBlKEFDVElWSVRZX1RZUEVfUkVDRU5UUyk7CisgICAgICAgIGlmIChyZWNlbnRzU3RhY2sgIT0gbnVsbCAmJiAhcmVjZW50c1N0YWNrLm1UYXNrcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiByZWNlbnRzU3RhY2subVRhc2tzLmdldCgwKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIEFjdGl2aXR5IGdldEhvbWVBY3Rpdml0eSgpIHsKKyAgICAgICAgZmluYWwgQWN0aXZpdHlUYXNrIGhvbWVUYXNrID0gZ2V0SG9tZVRhc2soKTsKKyAgICAgICAgcmV0dXJuIGhvbWVUYXNrICE9IG51bGwgPyBob21lVGFzay5tQWN0aXZpdGllcy5nZXQoaG9tZVRhc2subUFjdGl2aXRpZXMuc2l6ZSgpIC0gMSkgOiBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgQWN0aXZpdHkgZ2V0UmVjZW50c0FjdGl2aXR5KCkgeworICAgICAgICBmaW5hbCBBY3Rpdml0eVRhc2sgcmVjZW50c1Rhc2sgPSBnZXRSZWNlbnRzVGFzaygpOworICAgICAgICByZXR1cm4gcmVjZW50c1Rhc2sgIT0gbnVsbCA/IHJlY2VudHNUYXNrLm1BY3Rpdml0aWVzLmdldChyZWNlbnRzVGFzay5tQWN0aXZpdGllcy5zaXplKCkgLSAxKQorICAgICAgICAgICAgICAgIDogbnVsbDsKKyAgICB9CisKKyAgICBpbnQgZ2V0U3RhY2tJZEJ5QWN0aXZpdHkoQ29tcG9uZW50TmFtZSBhY3Rpdml0eU5hbWUpIHsKKyAgICAgICAgZmluYWwgQWN0aXZpdHlUYXNrIHRhc2sgPSBnZXRUYXNrQnlBY3Rpdml0eShhY3Rpdml0eU5hbWUpOworICAgICAgICByZXR1cm4gICh0YXNrID09IG51bGwpID8gSU5WQUxJRF9TVEFDS19JRCA6IHRhc2subVN0YWNrSWQ7CisgICAgfQorCisgICAgQWN0aXZpdHlUYXNrIGdldFRhc2tCeUFjdGl2aXR5KENvbXBvbmVudE5hbWUgYWN0aXZpdHlOYW1lKSB7CisgICAgICAgIHJldHVybiBnZXRUYXNrQnlBY3Rpdml0eUludGVybmFsKGdldEFjdGl2aXR5TmFtZShhY3Rpdml0eU5hbWUpLCBXSU5ET1dJTkdfTU9ERV9VTkRFRklORUQpOworICAgIH0KKworICAgIEFjdGl2aXR5VGFzayBnZXRUYXNrQnlBY3Rpdml0eShDb21wb25lbnROYW1lIGFjdGl2aXR5TmFtZSwgaW50IHdpbmRvd2luZ01vZGUpIHsKKyAgICAgICAgcmV0dXJuIGdldFRhc2tCeUFjdGl2aXR5SW50ZXJuYWwoZ2V0QWN0aXZpdHlOYW1lKGFjdGl2aXR5TmFtZSksIHdpbmRvd2luZ01vZGUpOworICAgIH0KKworICAgIHByaXZhdGUgQWN0aXZpdHlUYXNrIGdldFRhc2tCeUFjdGl2aXR5SW50ZXJuYWwoU3RyaW5nIGZ1bGxOYW1lLCBpbnQgd2luZG93aW5nTW9kZSkgeworICAgICAgICBmb3IgKEFjdGl2aXR5U3RhY2sgc3RhY2sgOiBtU3RhY2tzKSB7CisgICAgICAgICAgICBpZiAod2luZG93aW5nTW9kZSA9PSBXSU5ET1dJTkdfTU9ERV9VTkRFRklORUQKKyAgICAgICAgICAgICAgICAgICAgfHwgd2luZG93aW5nTW9kZSA9PSBzdGFjay5nZXRXaW5kb3dpbmdNb2RlKCkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKEFjdGl2aXR5VGFzayB0YXNrIDogc3RhY2subVRhc2tzKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoQWN0aXZpdHkgYWN0aXZpdHkgOiB0YXNrLm1BY3Rpdml0aWVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZpdHkubmFtZS5lcXVhbHMoZnVsbE5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhc2s7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIEFjdGl2aXR5RGlzcGxheSBleHRlbmRzIEFjdGl2aXR5Q29udGFpbmVyIHsKKworICAgICAgICBpbnQgbUlkOworICAgICAgICBBcnJheUxpc3Q8QWN0aXZpdHlTdGFjaz4gbVN0YWNrcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgICAgIEFjdGl2aXR5RGlzcGxheShBY3Rpdml0eURpc3BsYXlQcm90byBwcm90bywgQWN0aXZpdHlNYW5hZ2VyU3RhdGUgYW1TdGF0ZSkgeworICAgICAgICAgICAgc3VwZXIocHJvdG8uY29uZmlndXJhdGlvbkNvbnRhaW5lcik7CisgICAgICAgICAgICBtSWQgPSBwcm90by5pZDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdG8uc3RhY2tzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgQWN0aXZpdHlTdGFjayBhY3Rpdml0eVN0YWNrID0gbmV3IEFjdGl2aXR5U3RhY2socHJvdG8uc3RhY2tzW2ldKTsKKyAgICAgICAgICAgICAgICBtU3RhY2tzLmFkZChhY3Rpdml0eVN0YWNrKTsKKyAgICAgICAgICAgICAgICAvLyBBbHNvIHVwZGF0ZSBhY3Rpdml0eSBtYW5hZ2VyIHN0YXRlCisgICAgICAgICAgICAgICAgYW1TdGF0ZS5tU3RhY2tzLmFkZChhY3Rpdml0eVN0YWNrKTsKKyAgICAgICAgICAgICAgICBpZiAoYWN0aXZpdHlTdGFjay5tUmVzdW1lZEFjdGl2aXR5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYW1TdGF0ZS5tUmVzdW1lZEFjdGl2aXRpZXMuYWRkKGFjdGl2aXR5U3RhY2subVJlc3VtZWRBY3Rpdml0eSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIEFjdGl2aXR5U3RhY2sgZXh0ZW5kcyBBY3Rpdml0eUNvbnRhaW5lciB7CisKKyAgICAgICAgaW50IG1EaXNwbGF5SWQ7CisgICAgICAgIGludCBtU3RhY2tJZDsKKyAgICAgICAgU3RyaW5nIG1SZXN1bWVkQWN0aXZpdHk7CisgICAgICAgIEFycmF5TGlzdDxBY3Rpdml0eVRhc2s+IG1UYXNrcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgICAgIEFjdGl2aXR5U3RhY2soQWN0aXZpdHlTdGFja1Byb3RvIHByb3RvKSB7CisgICAgICAgICAgICBzdXBlcihwcm90by5jb25maWd1cmF0aW9uQ29udGFpbmVyKTsKKyAgICAgICAgICAgIG1TdGFja0lkID0gcHJvdG8uaWQ7CisgICAgICAgICAgICBtRGlzcGxheUlkID0gcHJvdG8uZGlzcGxheUlkOworICAgICAgICAgICAgbUJvdW5kcyA9IGV4dHJhY3QocHJvdG8uYm91bmRzKTsKKyAgICAgICAgICAgIG1GdWxsc2NyZWVuID0gcHJvdG8uZnVsbHNjcmVlbjsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdG8udGFza3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBtVGFza3MuYWRkKG5ldyBBY3Rpdml0eVRhc2socHJvdG8udGFza3NbaV0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwcm90by5yZXN1bWVkQWN0aXZpdHkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1SZXN1bWVkQWN0aXZpdHkgPSBwcm90by5yZXN1bWVkQWN0aXZpdHkudGl0bGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiB0aGUgYm90dG9tIHRhc2sgaW4gdGhlIHN0YWNrLgorICAgICAgICAgKi8KKyAgICAgICAgQWN0aXZpdHlUYXNrIGdldEJvdHRvbVRhc2soKSB7CisgICAgICAgICAgICBpZiAoIW1UYXNrcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBOT1RFOiBVbmxpa2UgdGhlIEFjdGl2aXR5TWFuYWdlciBpbnRlcm5hbHMsIHdlIGR1bXAgdGhlIHN0YXRlIGZyb20gdG9wIHRvIGJvdHRvbSwKKyAgICAgICAgICAgICAgICAvLyAgICAgICBzbyB0aGUgaW5kaWNlcyBhcmUgaW52ZXJ0ZWQKKyAgICAgICAgICAgICAgICByZXR1cm4gbVRhc2tzLmdldChtVGFza3Muc2l6ZSgpIC0gMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIHRoZSB0b3AgdGFzayBpbiB0aGUgc3RhY2suCisgICAgICAgICAqLworICAgICAgICBBY3Rpdml0eVRhc2sgZ2V0VG9wVGFzaygpIHsKKyAgICAgICAgICAgIGlmICghbVRhc2tzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIC8vIE5PVEU6IFVubGlrZSB0aGUgQWN0aXZpdHlNYW5hZ2VyIGludGVybmFscywgd2UgZHVtcCB0aGUgc3RhdGUgZnJvbSB0b3AgdG8gYm90dG9tLAorICAgICAgICAgICAgICAgIC8vICAgICAgIHNvIHRoZSBpbmRpY2VzIGFyZSBpbnZlcnRlZAorICAgICAgICAgICAgICAgIHJldHVybiBtVGFza3MuZ2V0KDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBMaXN0PEFjdGl2aXR5VGFzaz4gZ2V0VGFza3MoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDw+KG1UYXNrcyk7CisgICAgICAgIH0KKworICAgICAgICBBY3Rpdml0eVRhc2sgZ2V0VGFzayhpbnQgdGFza0lkKSB7CisgICAgICAgICAgICBmb3IgKEFjdGl2aXR5VGFzayB0YXNrIDogbVRhc2tzKSB7CisgICAgICAgICAgICAgICAgaWYgKHRhc2tJZCA9PSB0YXNrLm1UYXNrSWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhc2s7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgQWN0aXZpdHlUYXNrIGV4dGVuZHMgQWN0aXZpdHlDb250YWluZXIgeworCisgICAgICAgIGludCBtVGFza0lkOworICAgICAgICBpbnQgbVN0YWNrSWQ7CisgICAgICAgIFJlY3QgbUxhc3ROb25GdWxsc2NyZWVuQm91bmRzOworICAgICAgICBTdHJpbmcgbVJlYWxBY3Rpdml0eTsKKyAgICAgICAgU3RyaW5nIG1PcmlnQWN0aXZpdHk7CisgICAgICAgIEFycmF5TGlzdDxBY3Rpdml0eT4gbUFjdGl2aXRpZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgaW50IG1UYXNrVHlwZSA9IC0xOworICAgICAgICBwcml2YXRlIGludCBtUmVzaXplTW9kZTsKKworICAgICAgICBBY3Rpdml0eVRhc2soVGFza1JlY29yZFByb3RvIHByb3RvKSB7CisgICAgICAgICAgICBzdXBlcihwcm90by5jb25maWd1cmF0aW9uQ29udGFpbmVyKTsKKyAgICAgICAgICAgIG1UYXNrSWQgPSBwcm90by5pZDsKKyAgICAgICAgICAgIG1TdGFja0lkID0gcHJvdG8uc3RhY2tJZDsKKyAgICAgICAgICAgIG1MYXN0Tm9uRnVsbHNjcmVlbkJvdW5kcyA9IGV4dHJhY3QocHJvdG8ubGFzdE5vbkZ1bGxzY3JlZW5Cb3VuZHMpOworICAgICAgICAgICAgbVJlYWxBY3Rpdml0eSA9IHByb3RvLnJlYWxBY3Rpdml0eTsKKyAgICAgICAgICAgIG1PcmlnQWN0aXZpdHkgPSBwcm90by5vcmlnQWN0aXZpdHk7CisgICAgICAgICAgICBtVGFza1R5cGUgPSBwcm90by5hY3Rpdml0eVR5cGU7CisgICAgICAgICAgICBtUmVzaXplTW9kZSA9IHByb3RvLnJlc2l6ZU1vZGU7CisgICAgICAgICAgICBtRnVsbHNjcmVlbiA9IHByb3RvLmZ1bGxzY3JlZW47CisgICAgICAgICAgICBtQm91bmRzID0gZXh0cmFjdChwcm90by5ib3VuZHMpOworICAgICAgICAgICAgbU1pbldpZHRoID0gcHJvdG8ubWluV2lkdGg7CisgICAgICAgICAgICBtTWluSGVpZ2h0ID0gcHJvdG8ubWluSGVpZ2h0OworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7ICBpIDwgcHJvdG8uYWN0aXZpdGllcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIG1BY3Rpdml0aWVzLmFkZChuZXcgQWN0aXZpdHkocHJvdG8uYWN0aXZpdGllc1tpXSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRSZXNpemVNb2RlKCkgeworICAgICAgICAgICAgcmV0dXJuIG1SZXNpemVNb2RlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gd2hldGhlciB0aGlzIHRhc2sgY29udGFpbnMgdGhlIGdpdmVuIGFjdGl2aXR5LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNBY3Rpdml0eShTdHJpbmcgYWN0aXZpdHlOYW1lKSB7CisgICAgICAgICAgICBmb3IgKEFjdGl2aXR5IGFjdGl2aXR5IDogbUFjdGl2aXRpZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoYWN0aXZpdHkubmFtZS5lcXVhbHMoYWN0aXZpdHlOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHlDb250YWluZXIgeworCisgICAgICAgIFN0cmluZyBuYW1lOworICAgICAgICBTdHJpbmcgc3RhdGU7CisgICAgICAgIGJvb2xlYW4gdmlzaWJsZTsKKyAgICAgICAgYm9vbGVhbiBmcm9udE9mVGFzazsKKyAgICAgICAgaW50IHByb2NJZCA9IC0xOworICAgICAgICBwdWJsaWMgYm9vbGVhbiB0cmFuc2x1Y2VudDsKKworICAgICAgICBBY3Rpdml0eShBY3Rpdml0eVJlY29yZFByb3RvIHByb3RvKSB7CisgICAgICAgICAgICBzdXBlcihwcm90by5jb25maWd1cmF0aW9uQ29udGFpbmVyKTsKKyAgICAgICAgICAgIG5hbWUgPSBwcm90by5pZGVudGlmaWVyLnRpdGxlOworICAgICAgICAgICAgc3RhdGUgPSBwcm90by5zdGF0ZTsKKyAgICAgICAgICAgIHZpc2libGUgPSBwcm90by52aXNpYmxlOworICAgICAgICAgICAgZnJvbnRPZlRhc2sgPSBwcm90by5mcm9udE9mVGFzazsKKyAgICAgICAgICAgIGlmIChwcm90by5wcm9jSWQgIT0gMCkgeworICAgICAgICAgICAgICAgIHByb2NJZCA9IHByb3RvLnByb2NJZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyYW5zbHVjZW50ID0gcHJvdG8udHJhbnNsdWNlbnQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQWN0aXZpdHlDb250YWluZXIgZXh0ZW5kcyBXaW5kb3dNYW5hZ2VyU3RhdGUuQ29uZmlndXJhdGlvbkNvbnRhaW5lciB7CisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIG1GdWxsc2NyZWVuOworICAgICAgICBwcm90ZWN0ZWQgUmVjdCBtQm91bmRzOworICAgICAgICBwcm90ZWN0ZWQgaW50IG1NaW5XaWR0aCA9IC0xOworICAgICAgICBwcm90ZWN0ZWQgaW50IG1NaW5IZWlnaHQgPSAtMTsKKworICAgICAgICBBY3Rpdml0eUNvbnRhaW5lcihDb25maWd1cmF0aW9uQ29udGFpbmVyUHJvdG8gcHJvdG8pIHsKKyAgICAgICAgICAgIHN1cGVyKHByb3RvKTsKKyAgICAgICAgfQorCisgICAgICAgIFJlY3QgZ2V0Qm91bmRzKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Cb3VuZHM7CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGlzRnVsbHNjcmVlbigpIHsKKyAgICAgICAgICAgIHJldHVybiBtRnVsbHNjcmVlbjsKKyAgICAgICAgfQorCisgICAgICAgIGludCBnZXRNaW5XaWR0aCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTWluV2lkdGg7CisgICAgICAgIH0KKworICAgICAgICBpbnQgZ2V0TWluSGVpZ2h0KCkgeworICAgICAgICAgICAgcmV0dXJuIG1NaW5IZWlnaHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgS2V5Z3VhcmRDb250cm9sbGVyU3RhdGUgeworCisgICAgICAgIGJvb2xlYW4ga2V5Z3VhcmRTaG93aW5nID0gZmFsc2U7CisgICAgICAgIGJvb2xlYW4ga2V5Z3VhcmRPY2NsdWRlZCA9IGZhbHNlOworCisgICAgICAgIEtleWd1YXJkQ29udHJvbGxlclN0YXRlKEtleWd1YXJkQ29udHJvbGxlclByb3RvIHByb3RvKSB7CisgICAgICAgICAgICBpZiAocHJvdG8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGtleWd1YXJkU2hvd2luZyA9IHByb3RvLmtleWd1YXJkU2hvd2luZzsKKyAgICAgICAgICAgICAgICBrZXlndWFyZE9jY2x1ZGVkID0gcHJvdG8ua2V5Z3VhcmRPY2NsdWRlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci91dGlsL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJUZXN0QmFzZS5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3V0aWwvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlclRlc3RCYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVhMzgyNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci91dGlsL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJUZXN0QmFzZS5qYXZhCkBAIC0wLDAgKzEsMTYxMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbTsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXIuU1BMSVRfU0NSRUVOX0NSRUFURV9NT0RFX1RPUF9PUl9MRUZUOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXIuU3RhY2tJZC5JTlZBTElEX1NUQUNLX0lEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5XaW5kb3dDb25maWd1cmF0aW9uLkFDVElWSVRZX1RZUEVfQVNTSVNUQU5UOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5XaW5kb3dDb25maWd1cmF0aW9uLkFDVElWSVRZX1RZUEVfUkVDRU5UUzsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuV2luZG93Q29uZmlndXJhdGlvbi5BQ1RJVklUWV9UWVBFX1NUQU5EQVJEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5XaW5kb3dDb25maWd1cmF0aW9uLkFDVElWSVRZX1RZUEVfVU5ERUZJTkVEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5XaW5kb3dDb25maWd1cmF0aW9uLldJTkRPV0lOR19NT0RFX1NQTElUX1NDUkVFTl9QUklNQVJZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50LkZMQUdfQUNUSVZJVFlfTVVMVElQTEVfVEFTSzsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LkludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9BVVRPTU9USVZFOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9FTUJFRERFRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfRlJFRUZPUk1fV0lORE9XX01BTkFHRU1FTlQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5GRUFUVVJFX0xFQU5CQUNLOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9QSUNUVVJFX0lOX1BJQ1RVUkU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5GRUFUVVJFX1NDUkVFTl9MQU5EU0NBUEU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5GRUFUVVJFX1NDUkVFTl9QT1JUUkFJVDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfVlJfTU9ERV9ISUdIX1BFUkZPUk1BTkNFOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9XQVRDSDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQWN0aXZpdHlMYXVuY2hlci5LRVlfRElTUExBWV9JRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQWN0aXZpdHlMYXVuY2hlci5LRVlfTEFVTkNIX0FDVElWSVRZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5BY3Rpdml0eUxhdW5jaGVyLktFWV9MQVVOQ0hfVE9fU0lERTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQWN0aXZpdHlMYXVuY2hlci5LRVlfTVVMVElQTEVfVEFTSzsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQWN0aXZpdHlMYXVuY2hlci5LRVlfTkVXX1RBU0s7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkFjdGl2aXR5TGF1bmNoZXIuS0VZX1JBTkRPTV9EQVRBOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5BY3Rpdml0eUxhdW5jaGVyLktFWV9SRU9SREVSX1RPX0ZST05UOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5BY3Rpdml0eUxhdW5jaGVyLktFWV9TVVBQUkVTU19FWENFUFRJT05TOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5BY3Rpdml0eUxhdW5jaGVyLktFWV9UQVJHRVRfQ09NUE9ORU5UOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5BY3Rpdml0eUxhdW5jaGVyLktFWV9VU0VfQVBQTElDQVRJT05fQ09OVEVYVDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQWN0aXZpdHlMYXVuY2hlci5LRVlfVVNFX0lOU1RSVU1FTlRBVElPTjsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQWN0aXZpdHlMYXVuY2hlci5sYXVuY2hBY3Rpdml0eUZyb21FeHRyYXM7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkFjdGl2aXR5TWFuYWdlclN0YXRlLlNUQVRFX1JFU1VNRUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudE5hbWVVdGlscy5nZXRBY3Rpdml0eU5hbWU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudE5hbWVVdGlscy5nZXRMb2dUYWc7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuQlJPQURDQVNUX1JFQ0VJVkVSX0FDVElWSVRZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLkJyb2FkY2FzdFJlY2VpdmVyQWN0aXZpdHkuQUNUSU9OX1RSSUdHRVJfQlJPQURDQVNUOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnRzLkJyb2FkY2FzdFJlY2VpdmVyQWN0aXZpdHkuRVhUUkFfRklOSVNIX0JST0FEQ0FTVDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50cy5MQVVOQ0hJTkdfQUNUSVZJVFk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudHMuVEVTVF9BQ1RJVklUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uU3RhdGVMb2dnZXIubG9nOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5TdGF0ZUxvZ2dlci5sb2dBbHdheXM7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLlN0YXRlTG9nZ2VyLmxvZ0U7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLlVpRGV2aWNlVXRpbHMucHJlc3NBcHBTd2l0Y2hCdXR0b247CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLlVpRGV2aWNlVXRpbHMucHJlc3NCYWNrQnV0dG9uOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5VaURldmljZVV0aWxzLnByZXNzRW50ZXJCdXR0b247CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLlVpRGV2aWNlVXRpbHMucHJlc3NIb21lQnV0dG9uOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5VaURldmljZVV0aWxzLnByZXNzU2xlZXBCdXR0b247CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLlVpRGV2aWNlVXRpbHMucHJlc3NVbmxvY2tCdXR0b247CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLlVpRGV2aWNlVXRpbHMucHJlc3NXYWtldXBCdXR0b247CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLlVpRGV2aWNlVXRpbHMud2FpdEZvckRldmljZUlkbGU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5EaXNwbGF5LkRFRkFVTFRfRElTUExBWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LkRpc3BsYXkuSU5WQUxJRF9ESVNQTEFZOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKK2ltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKK2ltcG9ydCBhbmRyb2lkLnNlcnZlci5hbS5zZXR0aW5ncy5TZXR0aW5nc1Nlc3Npb247CisKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk5vbk51bGw7CitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5OdWxsYWJsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworCitpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5TeXN0ZW1VdGlsOworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLlRlc3RSdWxlOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuRGVzY3JpcHRpb247CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMubW9kZWwuU3RhdGVtZW50OworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5JbnRlZ2VyLnRvSGV4U3RyaW5nOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uSW50U3RyZWFtOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWN0aXZpdHlNYW5hZ2VyVGVzdEJhc2UgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gUFJFVEVORF9ERVZJQ0VfU1VQUE9SVFNfUElQID0gZmFsc2U7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBQUkVURU5EX0RFVklDRV9TVVBQT1JUU19GUkVFRk9STSA9IGZhbHNlOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfU0VQQVJBVE9SID0gIkxPR19TRVBBUkFUT1IiOworCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBBTExfQUNUSVZJVFlfVFlQRV9CVVRfSE9NRSA9IHsKKyAgICAgICAgICAgIEFDVElWSVRZX1RZUEVfU1RBTkRBUkQsIEFDVElWSVRZX1RZUEVfQVNTSVNUQU5ULCBBQ1RJVklUWV9UWVBFX1JFQ0VOVFMsCisgICAgICAgICAgICBBQ1RJVklUWV9UWVBFX1VOREVGSU5FRAorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19JRF9QUkVGSVggPSAidGFza0lkIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTV9TVEFDS19MSVNUID0gImFtIHN0YWNrIGxpc3QiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFNX0ZPUkNFX1NUT1BfVEVTVF9QQUNLQUdFID0gImFtIGZvcmNlLXN0b3AgYW5kcm9pZC5zZXJ2ZXIuYW0iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTV9GT1JDRV9TVE9QX1NFQ09ORF9URVNUX1BBQ0tBR0UKKyAgICAgICAgICAgID0gImFtIGZvcmNlLXN0b3AgYW5kcm9pZC5zZXJ2ZXIuYW0uc2Vjb25kIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU1fRk9SQ0VfU1RPUF9USElSRF9URVNUX1BBQ0tBR0UKKyAgICAgICAgICAgID0gImFtIGZvcmNlLXN0b3AgYW5kcm9pZC5zZXJ2ZXIuYW0udGhpcmQiOworCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU1fU1RBUlRfSE9NRV9BQ1RJVklUWV9DT01NQU5EID0KKyAgICAgICAgICAgICJhbSBzdGFydCAtYSBhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiAtYyBhbmRyb2lkLmludGVudC5jYXRlZ29yeS5IT01FIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTV9NT1ZFX1RPUF9BQ1RJVklUWV9UT19QSU5ORURfU1RBQ0tfQ09NTUFORF9GT1JNQVQgPQorICAgICAgICAgICAgImFtIHN0YWNrIG1vdmUtdG9wLWFjdGl2aXR5LXRvLXBpbm5lZC1zdGFjayAlMWQgMCAwIDUwMCA1MDAiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFNX1JFU0laRV9ET0NLRURfU1RBQ0sgPSAiYW0gc3RhY2sgcmVzaXplLWRvY2tlZC1zdGFjayAiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTV9SRVNJWkVfU1RBQ0sgPSAiYW0gc3RhY2sgcmVzaXplICI7CisKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEFNX01PVkVfVEFTSyA9ICJhbSBzdGFjayBtb3ZlLXRhc2sgIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTV9OT19IT01FX1NDUkVFTiA9ICJhbSBuby1ob21lLXNjcmVlbiI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DS19DUkVERU5USUFMID0gIjEyMzQiOworCisgICAgLy8gVE9ETyhiLzcwMjQ3MDU4KTogVXNlIHtAbGluayBDb250ZXh0I3NlbmRCcm9hZGNhc3QoSW50ZW50KS4KKyAgICAvLyBTaGVsbCBjb21tYW5kIHRvIGZpbmlzaCB7QGxpbmsgI0JST0FEQ0FTVF9SRUNFSVZFUl9BQ1RJVklUWX0uCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBGSU5JU0hfQUNUSVZJVFlfQlJPQURDQVNUID0gImFtIGJyb2FkY2FzdCAtYSAiCisgICAgICAgICAgICArIEFDVElPTl9UUklHR0VSX0JST0FEQ0FTVCArICIgLS1leiAiICsgRVhUUkFfRklOSVNIX0JST0FEQ0FTVCArICIgdHJ1ZSI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVUlfTU9ERV9UWVBFX01BU0sgPSAweDBmOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVSV9NT0RFX1RZUEVfVlJfSEVBRFNFVCA9IDB4MDc7CisKKyAgICBwcml2YXRlIHN0YXRpYyBCb29sZWFuIHNIYXNIb21lU2NyZWVuID0gbnVsbDsKKworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfREVWSUNFX1JPVEFUSU9OID0gLTE7CisKKyAgICBwcm90ZWN0ZWQgQ29udGV4dCBtQ29udGV4dDsKKyAgICBwcm90ZWN0ZWQgQWN0aXZpdHlNYW5hZ2VyIG1BbTsKKworICAgIEBSdWxlCisgICAgcHVibGljIGZpbmFsIEFjdGl2aXR5VGVzdFJ1bGU8U2lkZUFjdGl2aXR5PiBtU2lkZUFjdGl2aXR5UnVsZSA9CisgICAgICAgICAgICBuZXcgQWN0aXZpdHlUZXN0UnVsZTw+KFNpZGVBY3Rpdml0eS5jbGFzcywgdHJ1ZSAvKiBpbml0aWFsVG91Y2hNb2RlICovLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBsYXVuY2hBY3Rpdml0eSAqLyk7CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBhbSBjb21tYW5kIHRvIHN0YXJ0IHRoZSBnaXZlbiBhY3Rpdml0eSB3aXRoIHRoZSBmb2xsb3dpbmcgZXh0cmEga2V5L3ZhbHVlIHBhaXJzLgorICAgICAqICAgICAgICAge0BwYXJhbSBrZXlWYWx1ZVBhaXJzfSBtdXN0IGJlIGEgbGlzdCBvZiBhcmd1bWVudHMgZGVmaW5pbmcgZWFjaCBrZXkvdmFsdWUgZXh0cmEuCisgICAgICovCisgICAgLy8gVE9ETzogTWFrZSB0aGlzIG1vcmUgZ2VuZXJpYywgZm9yIGluc3RhbmNlIGFjY2VwdGluZyBmbGFncyBvciBleHRyYXMgb2Ygb3RoZXIgdHlwZXMuCisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0QW1TdGFydENtZChmaW5hbCBDb21wb25lbnROYW1lIGFjdGl2aXR5TmFtZSwKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZy4uLiBrZXlWYWx1ZVBhaXJzKSB7CisgICAgICAgIHJldHVybiBnZXRBbVN0YXJ0Q21kSW50ZXJuYWwoZ2V0QWN0aXZpdHlOYW1lKGFjdGl2aXR5TmFtZSksIGtleVZhbHVlUGFpcnMpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRBbVN0YXJ0Q21kSW50ZXJuYWwoZmluYWwgU3RyaW5nIGFjdGl2aXR5TmFtZSwKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZy4uLiBrZXlWYWx1ZVBhaXJzKSB7CisgICAgICAgIHJldHVybiBhcHBlbmRLZXlWYWx1ZVBhaXJzKAorICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdCdWlsZGVyKCJhbSBzdGFydCAtbiAiKS5hcHBlbmQoYWN0aXZpdHlOYW1lKSwKKyAgICAgICAgICAgICAgICBrZXlWYWx1ZVBhaXJzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYXBwZW5kS2V5VmFsdWVQYWlycygKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgY21kLCBmaW5hbCBTdHJpbmcuLi4ga2V5VmFsdWVQYWlycykgeworICAgICAgICBpZiAoa2V5VmFsdWVQYWlycy5sZW5ndGggJSAyICE9IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJrZXlWYWx1ZVBhaXJzIG11c3QgYmUgcGFpcnMgb2Yga2V5L3ZhbHVlIGFyZ3VtZW50cyIpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2V5VmFsdWVQYWlycy5sZW5ndGg7IGkgKz0gMikgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGtleSA9IGtleVZhbHVlUGFpcnNbaV07CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWUgPSBrZXlWYWx1ZVBhaXJzW2kgKyAxXTsKKyAgICAgICAgICAgIGNtZC5hcHBlbmQoIiAtLWVzICIpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoa2V5KQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIgIikKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCh2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNtZC50b1N0cmluZygpOworICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldEFtU3RhcnRDbWQoZmluYWwgQ29tcG9uZW50TmFtZSBhY3Rpdml0eU5hbWUsIGZpbmFsIGludCBkaXNwbGF5SWQsCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcuLi4ga2V5VmFsdWVQYWlyKSB7CisgICAgICAgIHJldHVybiBnZXRBbVN0YXJ0Q21kSW50ZXJuYWwoZ2V0QWN0aXZpdHlOYW1lKGFjdGl2aXR5TmFtZSksIGRpc3BsYXlJZCwga2V5VmFsdWVQYWlyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0QW1TdGFydENtZEludGVybmFsKGZpbmFsIFN0cmluZyBhY3Rpdml0eU5hbWUsIGZpbmFsIGludCBkaXNwbGF5SWQsCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcuLi4ga2V5VmFsdWVQYWlycykgeworICAgICAgICByZXR1cm4gYXBwZW5kS2V5VmFsdWVQYWlycygKKyAgICAgICAgICAgICAgICBuZXcgU3RyaW5nQnVpbGRlcigiYW0gc3RhcnQgLW4gIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoYWN0aXZpdHlOYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiIC1mIDB4IikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQodG9IZXhTdHJpbmcoRkxBR19BQ1RJVklUWV9ORVdfVEFTSyB8IEZMQUdfQUNUSVZJVFlfTVVMVElQTEVfVEFTSykpCisgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIgLS1kaXNwbGF5ICIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGRpc3BsYXlJZCksCisgICAgICAgICAgICAgICAga2V5VmFsdWVQYWlycyk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0QW1TdGFydENtZEluTmV3VGFzayhmaW5hbCBDb21wb25lbnROYW1lIGFjdGl2aXR5TmFtZSkgeworICAgICAgICByZXR1cm4gImFtIHN0YXJ0IC1uICIgKyBnZXRBY3Rpdml0eU5hbWUoYWN0aXZpdHlOYW1lKSArICIgLWYgMHgxODAwMDAwMCI7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0QW1TdGFydENtZE92ZXJIb21lKGZpbmFsIENvbXBvbmVudE5hbWUgYWN0aXZpdHlOYW1lKSB7CisgICAgICAgIHJldHVybiAiYW0gc3RhcnQgLS1hY3Rpdml0eS10YXNrLW9uLWhvbWUgLW4gIiArIGdldEFjdGl2aXR5TmFtZShhY3Rpdml0eU5hbWUpOworICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldE1vdmVUb1Bpbm5lZFN0YWNrQ29tbWFuZChpbnQgc3RhY2tJZCkgeworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdChBTV9NT1ZFX1RPUF9BQ1RJVklUWV9UT19QSU5ORURfU1RBQ0tfQ09NTUFORF9GT1JNQVQsIHN0YWNrSWQpOworICAgIH0KKworICAgIHByb3RlY3RlZCBBY3Rpdml0eUFuZFdpbmRvd01hbmFnZXJzU3RhdGUgbUFtV21TdGF0ZSA9IG5ldyBBY3Rpdml0eUFuZFdpbmRvd01hbmFnZXJzU3RhdGUoKTsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtQ29udGV4dCA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKTsKKyAgICAgICAgbUFtID0gbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShBY3Rpdml0eU1hbmFnZXIuY2xhc3MpOworCisgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLmdldFVpQXV0b21hdGlvbigpLmdyYW50UnVudGltZVBlcm1pc3Npb24oCisgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSwgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLk1BTkFHRV9BQ1RJVklUWV9TVEFDS1MpOworICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKS5nZXRVaUF1dG9tYXRpb24oKS5ncmFudFJ1bnRpbWVQZXJtaXNzaW9uKAorICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCksIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5BQ1RJVklUWV9FTUJFRERJTkcpOworCisgICAgICAgIHByZXNzV2FrZXVwQnV0dG9uKCk7CisgICAgICAgIHByZXNzVW5sb2NrQnV0dG9uKCk7CisgICAgICAgIC8vIFVzaW5nIGxhdW5jaEhvbWVBY3Rpdml0eSB0byByZXBsYWNlIHByZXNzSG9tZUJ1dHRvbiBoZXJlLgorICAgICAgICAvLyBwcmVzc0hvbWVCdXR0b24gd2lsbCB0cmlnZ2VyIEFNUy5zdG9wQXBwU3dpdGNoZXMsIGlmIHdlIHVzaW5nIGluc3RydW1lbnRhdGlvbiB0byBsYXVuY2gKKyAgICAgICAgLy8gdGVzdCBhY3Rpdml0eSwgdGhlbiB0aGUgYWN0aXZpdHkgd291bGQgYmUgbGF1bmNoZWQgYWZ0ZXIgNSBzZWNvbmRzLCB3aGljaCBtYXkgY2F1c2Ugc29tZQorICAgICAgICAvLyB0ZXN0cyBmYWlsZWQuCisgICAgICAgIGxhdW5jaEhvbWVBY3Rpdml0eSgpOworICAgICAgICByZW1vdmVTdGFja3NXaXRoQWN0aXZpdHlUeXBlcyhBTExfQUNUSVZJVFlfVFlQRV9CVVRfSE9NRSk7CisgICAgfQorCisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gU3luY2hyb25vdXMgZXhlY3V0aW9uIG9mIHJlbW92ZVN0YWNrc1dpdGhBY3Rpdml0eVR5cGVzKCkgZW5zdXJlcyB0aGF0IGFsbCBhY3Rpdml0aWVzIGJ1dAorICAgICAgICAvLyBob21lIGFyZSBjbGVhbmVkIHVwIGZyb20gdGhlIHN0YWNrIGF0IHRoZSBlbmQgb2YgZWFjaCB0ZXN0LiBBbSBmb3JjZSBzdG9wIHNoZWxsIGNvbW1hbmRzCisgICAgICAgIC8vIG1pZ2h0IGJlIGFzeW5jaHJvbm91cyBhbmQgY291bGQgaW50ZXJydXB0IHRoZSBzdGFjayBjbGVhbnVwIHByb2Nlc3MgaWYgZXhlY3V0ZWQgZmlyc3QuCisgICAgICAgIHJlbW92ZVN0YWNrc1dpdGhBY3Rpdml0eVR5cGVzKEFMTF9BQ1RJVklUWV9UWVBFX0JVVF9IT01FKTsKKyAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChBTV9GT1JDRV9TVE9QX1RFU1RfUEFDS0FHRSk7CisgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoQU1fRk9SQ0VfU1RPUF9TRUNPTkRfVEVTVF9QQUNLQUdFKTsKKyAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChBTV9GT1JDRV9TVE9QX1RISVJEX1RFU1RfUEFDS0FHRSk7CisgICAgICAgIGxhdW5jaEhvbWVBY3Rpdml0eSgpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHJlbW92ZVN0YWNrc1dpdGhBY3Rpdml0eVR5cGVzKGludC4uLiBhY3Rpdml0eVR5cGVzKSB7CisgICAgICAgIG1BbS5yZW1vdmVTdGFja3NXaXRoQWN0aXZpdHlUeXBlcyhhY3Rpdml0eVR5cGVzKTsKKyAgICAgICAgd2FpdEZvcklkbGUoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVTdGFja3NJbldpbmRvd2luZ01vZGVzKGludC4uLiB3aW5kb3dpbmdNb2RlcykgeworICAgICAgICBtQW0ucmVtb3ZlU3RhY2tzSW5XaW5kb3dpbmdNb2Rlcyh3aW5kb3dpbmdNb2Rlcyk7CisgICAgICAgIHdhaXRGb3JJZGxlKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZXhlY3V0ZVNoZWxsQ29tbWFuZChTdHJpbmcgY29tbWFuZCkgeworICAgICAgICBsb2coIlNoZWxsIGNvbW1hbmQ6ICIgKyBjb21tYW5kKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBTeXN0ZW1VdGlsCisgICAgICAgICAgICAgICAgICAgIC5ydW5TaGVsbENvbW1hbmQoSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCksIGNvbW1hbmQpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvL2J1YmJsZSBpdCB1cAorICAgICAgICAgICAgbG9nRSgiRXJyb3IgcnVubmluZyBzaGVsbCBjb21tYW5kOiAiICsgY29tbWFuZCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBCaXRtYXAgdGFrZVNjcmVlbnNob3QoKSB7CisgICAgICAgIHJldHVybiBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKS5nZXRVaUF1dG9tYXRpb24oKS50YWtlU2NyZWVuc2hvdCgpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGxhdW5jaEFjdGl2aXR5KGZpbmFsIENvbXBvbmVudE5hbWUgYWN0aXZpdHlOYW1lLCBmaW5hbCBTdHJpbmcuLi4ga2V5VmFsdWVQYWlycykgeworICAgICAgICBsYXVuY2hBY3Rpdml0eU5vV2FpdChhY3Rpdml0eU5hbWUsIGtleVZhbHVlUGFpcnMpOworICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JWYWxpZFN0YXRlKGFjdGl2aXR5TmFtZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgbGF1bmNoQWN0aXZpdHlOb1dhaXQoZmluYWwgQ29tcG9uZW50TmFtZSBhY3Rpdml0eU5hbWUsCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcuLi4ga2V5VmFsdWVQYWlycykgeworICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKGdldEFtU3RhcnRDbWQoYWN0aXZpdHlOYW1lLCBrZXlWYWx1ZVBhaXJzKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgbGF1bmNoQWN0aXZpdHlJbk5ld1Rhc2soZmluYWwgQ29tcG9uZW50TmFtZSBhY3Rpdml0eU5hbWUpIHsKKyAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChnZXRBbVN0YXJ0Q21kSW5OZXdUYXNrKGFjdGl2aXR5TmFtZSkpOworICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JWYWxpZFN0YXRlKGFjdGl2aXR5TmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnRzIGFuIGFjdGl2aXR5IGluIGEgbmV3IHN0YWNrLgorICAgICAqIEByZXR1cm4gdGhlIHN0YWNrIGlkIG9mIHRoZSBuZXdseSBjcmVhdGVkIHN0YWNrLgorICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgcHJvdGVjdGVkIGludCBsYXVuY2hBY3Rpdml0eUluTmV3RHluYW1pY1N0YWNrKENvbXBvbmVudE5hbWUgYWN0aXZpdHlOYW1lKSB7CisgICAgICAgIEhhc2hTZXQ8SW50ZWdlcj4gc3RhY2tJZHMgPSBnZXRTdGFja0lkcygpOworICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKCJhbSBzdGFjayBzdGFydCAiICsgREVGQVVMVF9ESVNQTEFZICsgIiAiCisgICAgICAgICAgICAgICAgKyBnZXRBY3Rpdml0eU5hbWUoYWN0aXZpdHlOYW1lKSk7CisgICAgICAgIEhhc2hTZXQ8SW50ZWdlcj4gbmV3U3RhY2tJZHMgPSBnZXRTdGFja0lkcygpOworICAgICAgICBuZXdTdGFja0lkcy5yZW1vdmVBbGwoc3RhY2tJZHMpOworICAgICAgICBpZiAobmV3U3RhY2tJZHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9TVEFDS19JRDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUobmV3U3RhY2tJZHMuc2l6ZSgpID09IDEpOworICAgICAgICAgICAgcmV0dXJuIG5ld1N0YWNrSWRzLml0ZXJhdG9yKCkubmV4dCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB3YWl0Rm9ySWRsZSgpIHsKKyAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkud2FpdEZvcklkbGVTeW5jKCk7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgdGhlIHNldCBvZiBzdGFjayBpZHMuICovCisgICAgcHJpdmF0ZSBIYXNoU2V0PEludGVnZXI+IGdldFN0YWNrSWRzKCkgeworICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZSh0cnVlKTsKKyAgICAgICAgZmluYWwgTGlzdDxBY3Rpdml0eU1hbmFnZXJTdGF0ZS5BY3Rpdml0eVN0YWNrPiBzdGFja3MgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRTdGFja3MoKTsKKyAgICAgICAgZmluYWwgSGFzaFNldDxJbnRlZ2VyPiBzdGFja0lkcyA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgZm9yIChBY3Rpdml0eU1hbmFnZXJTdGF0ZS5BY3Rpdml0eVN0YWNrIHMgOiBzdGFja3MpIHsKKyAgICAgICAgICAgIHN0YWNrSWRzLmFkZChzLm1TdGFja0lkKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhY2tJZHM7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgbGF1bmNoSG9tZUFjdGl2aXR5KCkgeworICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKEFNX1NUQVJUX0hPTUVfQUNUSVZJVFlfQ09NTUFORCk7CisgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvckhvbWVBY3Rpdml0eVZpc2libGUoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBsYXVuY2hBY3Rpdml0eShDb21wb25lbnROYW1lIGFjdGl2aXR5TmFtZSwgaW50IHdpbmRvd2luZ01vZGUsCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcuLi4ga2V5VmFsdWVQYWlycykgeworICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKGdldEFtU3RhcnRDbWQoYWN0aXZpdHlOYW1lLCBrZXlWYWx1ZVBhaXJzKQorICAgICAgICAgICAgICAgICsgIiAtLXdpbmRvd2luZ01vZGUgIiArIHdpbmRvd2luZ01vZGUpOworICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JWYWxpZFN0YXRlKG5ldyBXYWl0Rm9yVmFsaWRBY3Rpdml0eVN0YXRlLkJ1aWxkZXIoYWN0aXZpdHlOYW1lKQorICAgICAgICAgICAgICAgIC5zZXRXaW5kb3dpbmdNb2RlKHdpbmRvd2luZ01vZGUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGxhdW5jaEFjdGl2aXR5T25EaXNwbGF5KENvbXBvbmVudE5hbWUgYWN0aXZpdHlOYW1lLCBpbnQgZGlzcGxheUlkLAorICAgICAgICAgICAgU3RyaW5nLi4uIGtleVZhbHVlUGFpcnMpIHsKKyAgICAgICAgbGF1bmNoQWN0aXZpdHlPbkRpc3BsYXlOb1dhaXQoYWN0aXZpdHlOYW1lLCBkaXNwbGF5SWQsIGtleVZhbHVlUGFpcnMpOworICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JWYWxpZFN0YXRlKGFjdGl2aXR5TmFtZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgbGF1bmNoQWN0aXZpdHlPbkRpc3BsYXlOb1dhaXQoQ29tcG9uZW50TmFtZSBhY3Rpdml0eU5hbWUsIGludCBkaXNwbGF5SWQsCisgICAgICAgICAgICBTdHJpbmcuLi4ga2V5VmFsdWVQYWlycykgeworICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKGdldEFtU3RhcnRDbWQoYWN0aXZpdHlOYW1lLCBkaXNwbGF5SWQsIGtleVZhbHVlUGFpcnMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMYXVuY2hlcyB7QHBhcmFtICBhY3Rpdml0eU5hbWV9IGludG8gc3BsaXQtc2NyZWVuIHByaW1hcnkgd2luZG93aW5nIG1vZGUgYW5kIGFsc28gbWFrZXMKKyAgICAgKiB0aGUgcmVjZW50cyBhY3Rpdml0eSB2aXNpYmxlIHRvIHRoZSBzaWRlIG9mIGl0LgorICAgICAqIE5PVEU6IFJlY2VudHMgdmlldyBtYXkgYmUgY29tYmluZWQgd2l0aCBob21lIHNjcmVlbiBvbiBzb21lIGRldmljZXMsIHNvIHVzaW5nIHRoaXMgdG8gd2FpdAorICAgICAqIGZvciBSZWNlbnRzIG9ubHkgbWFrZXMgc2Vuc2Ugd2hlbiB7QGxpbmsgQWN0aXZpdHlNYW5hZ2VyU3RhdGUjaXNIb21lUmVjZW50c0NvbXBvbmVudCgpfSBpcworICAgICAqIHtAY29kZSBmYWxzZX0uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgbGF1bmNoQWN0aXZpdHlJblNwbGl0U2NyZWVuV2l0aFJlY2VudHMoQ29tcG9uZW50TmFtZSBhY3Rpdml0eU5hbWUpIHsKKyAgICAgICAgbGF1bmNoQWN0aXZpdHlJblNwbGl0U2NyZWVuV2l0aFJlY2VudHMoYWN0aXZpdHlOYW1lLCBTUExJVF9TQ1JFRU5fQ1JFQVRFX01PREVfVE9QX09SX0xFRlQpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGxhdW5jaEFjdGl2aXR5SW5TcGxpdFNjcmVlbldpdGhSZWNlbnRzKENvbXBvbmVudE5hbWUgYWN0aXZpdHlOYW1lLAorICAgICAgICAgICAgaW50IGNyZWF0ZU1vZGUpIHsKKyAgICAgICAgbGF1bmNoQWN0aXZpdHkoYWN0aXZpdHlOYW1lKTsKKyAgICAgICAgZmluYWwgaW50IHRhc2tJZCA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFRhc2tCeUFjdGl2aXR5KGFjdGl2aXR5TmFtZSkubVRhc2tJZDsKKyAgICAgICAgbUFtLnNldFRhc2tXaW5kb3dpbmdNb2RlU3BsaXRTY3JlZW5QcmltYXJ5KHRhc2tJZCwgY3JlYXRlTW9kZSwgdHJ1ZSAvKiBvblRvcCAqLywKKyAgICAgICAgICAgICAgICBmYWxzZSAvKiBhbmltYXRlICovLCBudWxsIC8qIGluaXRpYWxCb3VuZHMgKi8sIHRydWUgLyogc2hvd1JlY2VudHMgKi8pOworCisgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvclZhbGlkU3RhdGUoCisgICAgICAgICAgICAgICAgbmV3IFdhaXRGb3JWYWxpZEFjdGl2aXR5U3RhdGUuQnVpbGRlcihhY3Rpdml0eU5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0V2luZG93aW5nTW9kZShXSU5ET1dJTkdfTU9ERV9TUExJVF9TQ1JFRU5fUFJJTUFSWSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRBY3Rpdml0eVR5cGUoQUNUSVZJVFlfVFlQRV9TVEFOREFSRCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yUmVjZW50c0FjdGl2aXR5VmlzaWJsZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1vdmVUYXNrVG9QcmltYXJ5U3BsaXRTY3JlZW4oaW50IHRhc2tJZCkgeworICAgICAgICBtb3ZlVGFza1RvUHJpbWFyeVNwbGl0U2NyZWVuKHRhc2tJZCwgZmFsc2UgLyogbGF1bmNoU2lkZUFjdGl2aXR5SWZOZWVkZWQgKi8pOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1vdmVzIHRoZSBkZXZpY2UgaW50byBzcGxpdC1zY3JlZW4gd2l0aCB0aGUgc3BlY2lmaWVkIHRhc2sgaW50byB0aGUgcHJpbWFyeSBzdGFjay4KKyAgICAgKiBAcGFyYW0gdGFza0lkICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGlkIG9mIHRoZSB0YXNrIHRvIG1vdmUgaW50byB0aGUgcHJpbWFyeSBzdGFjay4KKyAgICAgKiBAcGFyYW0gbGF1bmNoU2lkZUFjdGl2aXR5SWZOZWVkZWQgICAgV2hldGhlciBhIHBsYWNlaG9sZGVyIGFjdGl2aXR5IHNob3VsZCBiZSBsYXVuY2hlZCBpZiBubworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlbnRzIGFjdGl2aXR5IGlzIGF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBtb3ZlVGFza1RvUHJpbWFyeVNwbGl0U2NyZWVuKGludCB0YXNrSWQsIGJvb2xlYW4gbGF1bmNoU2lkZUFjdGl2aXR5SWZOZWVkZWQpIHsKKyAgICAgICAgbUFtLnNldFRhc2tXaW5kb3dpbmdNb2RlU3BsaXRTY3JlZW5QcmltYXJ5KHRhc2tJZCwgU1BMSVRfU0NSRUVOX0NSRUFURV9NT0RFX1RPUF9PUl9MRUZULAorICAgICAgICAgICAgICAgIHRydWUgLyogb25Ub3AgKi8sIGZhbHNlIC8qIGFuaW1hdGUgKi8sIG51bGwgLyogaW5pdGlhbEJvdW5kcyAqLywKKyAgICAgICAgICAgICAgICB0cnVlIC8qIHNob3dSZWNlbnRzICovKTsKKyAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yUmVjZW50c0FjdGl2aXR5VmlzaWJsZSgpOworCisgICAgICAgIGlmIChtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5pc0hvbWVSZWNlbnRzQ29tcG9uZW50KCkgJiYgbGF1bmNoU2lkZUFjdGl2aXR5SWZOZWVkZWQpIHsKKyAgICAgICAgICAgIC8vIExhdW5jaCBQbGFjZWhvbGRlciBSZWNlbnRzCisgICAgICAgICAgICBmaW5hbCBBY3Rpdml0eSByZWNlbnRzQWN0aXZpdHkgPSBtU2lkZUFjdGl2aXR5UnVsZS5sYXVuY2hBY3Rpdml0eShuZXcgSW50ZW50KCkpOworICAgICAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yQWN0aXZpdHlTdGF0ZShyZWNlbnRzQWN0aXZpdHkuZ2V0Q29tcG9uZW50TmFtZSgpLCBTVEFURV9SRVNVTUVEKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIExhdW5jaGVzIHtAcGFyYW0gcHJpbWFyeUFjdGl2aXR5fSBpbnRvIHNwbGl0LXNjcmVlbiBwcmltYXJ5IHdpbmRvd2luZyBtb2RlCisgICAgICogYW5kIHtAcGFyYW0gc2Vjb25kYXJ5QWN0aXZpdHl9IHRvIHRoZSBzaWRlIGluIHNwbGl0LXNjcmVlbiBzZWNvbmRhcnkgd2luZG93aW5nIG1vZGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgbGF1bmNoQWN0aXZpdGllc0luU3BsaXRTY3JlZW4oTGF1bmNoQWN0aXZpdHlCdWlsZGVyIHByaW1hcnlBY3Rpdml0eSwKKyAgICAgICAgICAgIExhdW5jaEFjdGl2aXR5QnVpbGRlciBzZWNvbmRhcnlBY3Rpdml0eSkgeworICAgICAgICAvLyBMYXVuY2ggc3BsaXQtc2NyZWVuIHByaW1hcnkuCisgICAgICAgIHByaW1hcnlBY3Rpdml0eQorICAgICAgICAgICAgICAgIC5zZXRVc2VJbnN0cnVtZW50YXRpb24oKQorICAgICAgICAgICAgICAgIC5zZXRXYWl0Rm9yTGF1bmNoZWQodHJ1ZSkKKyAgICAgICAgICAgICAgICAuZXhlY3V0ZSgpOworCisgICAgICAgIGZpbmFsIGludCB0YXNrSWQgPSBtQW1XbVN0YXRlLmdldEFtU3RhdGUoKS5nZXRUYXNrQnlBY3Rpdml0eSgKKyAgICAgICAgICAgICAgICBwcmltYXJ5QWN0aXZpdHkubVRhcmdldEFjdGl2aXR5KS5tVGFza0lkOworICAgICAgICBtb3ZlVGFza1RvUHJpbWFyeVNwbGl0U2NyZWVuKHRhc2tJZCk7CisKKyAgICAgICAgLy8gTGF1bmNoIHNwbGl0LXNjcmVlbiBzZWNvbmRhcnkKKyAgICAgICAgLy8gUmVjZW50cyBiZWNvbWUgZm9jdXNlZCwgc28gd2UgY2FuIGp1c3QgbGF1bmNoIG5ldyB0YXNrIGluIGZvY3VzZWQgc3RhY2sKKyAgICAgICAgc2Vjb25kYXJ5QWN0aXZpdHkKKyAgICAgICAgICAgICAgICAuc2V0VXNlSW5zdHJ1bWVudGF0aW9uKCkKKyAgICAgICAgICAgICAgICAuc2V0V2FpdEZvckxhdW5jaGVkKHRydWUpCisgICAgICAgICAgICAgICAgLnNldE5ld1Rhc2sodHJ1ZSkKKyAgICAgICAgICAgICAgICAuc2V0TXVsdGlwbGVUYXNrKHRydWUpCisgICAgICAgICAgICAgICAgLmV4ZWN1dGUoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRBY3Rpdml0eVRhc2tXaW5kb3dpbmdNb2RlKENvbXBvbmVudE5hbWUgYWN0aXZpdHlOYW1lLCBpbnQgd2luZG93aW5nTW9kZSkgeworICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShhY3Rpdml0eU5hbWUpOworICAgICAgICBmaW5hbCBpbnQgdGFza0lkID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0VGFza0J5QWN0aXZpdHkoYWN0aXZpdHlOYW1lKS5tVGFza0lkOworICAgICAgICBtQW0uc2V0VGFza1dpbmRvd2luZ01vZGUodGFza0lkLCB3aW5kb3dpbmdNb2RlLCB0cnVlIC8qIHRvVG9wICovKTsKKyAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yVmFsaWRTdGF0ZShuZXcgV2FpdEZvclZhbGlkQWN0aXZpdHlTdGF0ZS5CdWlsZGVyKGFjdGl2aXR5TmFtZSkKKyAgICAgICAgICAgICAgICAuc2V0QWN0aXZpdHlUeXBlKEFDVElWSVRZX1RZUEVfU1RBTkRBUkQpCisgICAgICAgICAgICAgICAgLnNldFdpbmRvd2luZ01vZGUod2luZG93aW5nTW9kZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgbW92ZUFjdGl2aXR5VG9TdGFjayhDb21wb25lbnROYW1lIGFjdGl2aXR5TmFtZSwgaW50IHN0YWNrSWQpIHsKKyAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUoYWN0aXZpdHlOYW1lKTsKKyAgICAgICAgZmluYWwgaW50IHRhc2tJZCA9IG1BbVdtU3RhdGUuZ2V0QW1TdGF0ZSgpLmdldFRhc2tCeUFjdGl2aXR5KGFjdGl2aXR5TmFtZSkubVRhc2tJZDsKKyAgICAgICAgZmluYWwgU3RyaW5nIGNtZCA9IEFNX01PVkVfVEFTSyArIHRhc2tJZCArICIgIiArIHN0YWNrSWQgKyAiIHRydWUiOworICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKGNtZCk7CisKKyAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yVmFsaWRTdGF0ZShuZXcgV2FpdEZvclZhbGlkQWN0aXZpdHlTdGF0ZS5CdWlsZGVyKGFjdGl2aXR5TmFtZSkKKyAgICAgICAgICAgICAgICAuc2V0U3RhY2tJZChzdGFja0lkKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCByZXNpemVBY3Rpdml0eVRhc2soCisgICAgICAgICAgICBDb21wb25lbnROYW1lIGFjdGl2aXR5TmFtZSwgaW50IGxlZnQsIGludCB0b3AsIGludCByaWdodCwgaW50IGJvdHRvbSkgeworICAgICAgICBtQW1XbVN0YXRlLmNvbXB1dGVTdGF0ZShhY3Rpdml0eU5hbWUpOworICAgICAgICBmaW5hbCBpbnQgdGFza0lkID0gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuZ2V0VGFza0J5QWN0aXZpdHkoYWN0aXZpdHlOYW1lKS5tVGFza0lkOworICAgICAgICBmaW5hbCBTdHJpbmcgY21kID0gImFtIHRhc2sgcmVzaXplICIKKyAgICAgICAgICAgICAgICArIHRhc2tJZCArICIgIiArIGxlZnQgKyAiICIgKyB0b3AgKyAiICIgKyByaWdodCArICIgIiArIGJvdHRvbTsKKyAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChjbWQpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHJlc2l6ZURvY2tlZFN0YWNrKAorICAgICAgICAgICAgaW50IHN0YWNrV2lkdGgsIGludCBzdGFja0hlaWdodCwgaW50IHRhc2tXaWR0aCwgaW50IHRhc2tIZWlnaHQpIHsKKyAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChBTV9SRVNJWkVfRE9DS0VEX1NUQUNLCisgICAgICAgICAgICAgICAgKyAiMCAwICIgKyBzdGFja1dpZHRoICsgIiAiICsgc3RhY2tIZWlnaHQKKyAgICAgICAgICAgICAgICArICIgMCAwICIgKyB0YXNrV2lkdGggKyAiICIgKyB0YXNrSGVpZ2h0KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCByZXNpemVTdGFjayhpbnQgc3RhY2tJZCwgaW50IHN0YWNrTGVmdCwgaW50IHN0YWNrVG9wLCBpbnQgc3RhY2tXaWR0aCwKKyAgICAgICAgICAgIGludCBzdGFja0hlaWdodCkgeworICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKEFNX1JFU0laRV9TVEFDSyArIFN0cmluZy5mb3JtYXQoIiVkICVkICVkICVkICVkIiwgc3RhY2tJZCwgc3RhY2tMZWZ0LAorICAgICAgICAgICAgICAgIHN0YWNrVG9wLCBzdGFja1dpZHRoLCBzdGFja0hlaWdodCkpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHByZXNzQXBwU3dpdGNoQnV0dG9uQW5kV2FpdEZvclJlY2VudHMoKSB7CisgICAgICAgIHByZXNzQXBwU3dpdGNoQnV0dG9uKCk7CisgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvclJlY2VudHNBY3Rpdml0eVZpc2libGUoKTsKKyAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yQXBwVHJhbnNpdGlvbklkbGUoKTsKKyAgICB9CisKKyAgICAvLyBVdGlsaXR5IG1ldGhvZCBmb3IgZGVidWdnaW5nLCBub3QgdXNlZCBkaXJlY3RseSBoZXJlLCBidXQgdXNlZnVsLCBzbyBrZXB0IGFyb3VuZC4KKyAgICBwcm90ZWN0ZWQgdm9pZCBwcmludFN0YWNrc0FuZFRhc2tzKCkgeworICAgICAgICBTdHJpbmcgb3V0cHV0ID0gZXhlY3V0ZVNoZWxsQ29tbWFuZChBTV9TVEFDS19MSVNUKTsKKyAgICAgICAgZm9yIChTdHJpbmcgbGluZSA6IG91dHB1dC5zcGxpdCgiXFxuIikpIHsKKyAgICAgICAgICAgIGxvZyhsaW5lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIHN1cHBvcnRzVnJNb2RlKCkgeworICAgICAgICByZXR1cm4gaGFzRGV2aWNlRmVhdHVyZShGRUFUVVJFX1ZSX01PREVfSElHSF9QRVJGT1JNQU5DRSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3VwcG9ydHNQaXAoKSB7CisgICAgICAgIHJldHVybiBoYXNEZXZpY2VGZWF0dXJlKEZFQVRVUkVfUElDVFVSRV9JTl9QSUNUVVJFKQorICAgICAgICAgICAgICAgIHx8IFBSRVRFTkRfREVWSUNFX1NVUFBPUlRTX1BJUDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0c0ZyZWVmb3JtKCkgeworICAgICAgICByZXR1cm4gaGFzRGV2aWNlRmVhdHVyZShGRUFUVVJFX0ZSRUVGT1JNX1dJTkRPV19NQU5BR0VNRU5UKQorICAgICAgICAgICAgICAgIHx8IFBSRVRFTkRfREVWSUNFX1NVUFBPUlRTX0ZSRUVGT1JNOworICAgIH0KKworICAgIC8qKiBXaGV0aGVyIG9yIG5vdCB0aGUgZGV2aWNlIHBpbi9wYXR0ZXJuL3Bhc3N3b3JkIGxvY2suICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3VwcG9ydHNTZWN1cmVMb2NrKCkgeworICAgICAgICByZXR1cm4gIWhhc0RldmljZUZlYXR1cmUoRkVBVFVSRV9MRUFOQkFDSykKKyAgICAgICAgICAgICAgICAmJiAhaGFzRGV2aWNlRmVhdHVyZShGRUFUVVJFX0VNQkVEREVEKTsKKyAgICB9CisKKyAgICAvKiogV2hldGhlciBvciBub3QgdGhlIGRldmljZSBzdXBwb3J0cyAic3dpcGUiIGxvY2suICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3VwcG9ydHNJbnNlY3VyZUxvY2soKSB7CisgICAgICAgIHJldHVybiAhaGFzRGV2aWNlRmVhdHVyZShGRUFUVVJFX0xFQU5CQUNLKQorICAgICAgICAgICAgICAgICYmICFoYXNEZXZpY2VGZWF0dXJlKEZFQVRVUkVfV0FUQ0gpCisgICAgICAgICAgICAgICAgJiYgIWhhc0RldmljZUZlYXR1cmUoRkVBVFVSRV9FTUJFRERFRCkKKyAgICAgICAgICAgICAgICAmJiAhaGFzRGV2aWNlRmVhdHVyZShGRUFUVVJFX0FVVE9NT1RJVkUpOworICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIGlzV2F0Y2goKSB7CisgICAgICAgIHJldHVybiBoYXNEZXZpY2VGZWF0dXJlKEZFQVRVUkVfV0FUQ0gpOworICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIGlzVGFibGV0KCkgeworICAgICAgICAvLyBMYXJnZXIgdGhhbiBhcHByb3ggNyIgdGFibGV0cworICAgICAgICByZXR1cm4gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0Q29uZmlndXJhdGlvbigpLnNtYWxsZXN0U2NyZWVuV2lkdGhEcCA+PSA2MDA7CisgICAgfQorCisgICAgLy8gVE9ETzogU3dpdGNoIHRvIHVzaW5nIGEgZmVhdHVyZSBmbGFnLCB3aGVuIGF2YWlsYWJsZS4KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNVaU1vZGVMb2NrZWRUb1ZySGVhZHNldCgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIG91dHB1dCA9IHJ1bkNvbW1hbmRBbmRQcmludE91dHB1dCgiZHVtcHN5cyB1aW1vZGUiKTsKKworICAgICAgICBJbnRlZ2VyIGN1clVpTW9kZSA9IG51bGw7CisgICAgICAgIEJvb2xlYW4gdWlNb2RlTG9ja2VkID0gbnVsbDsKKyAgICAgICAgZm9yIChTdHJpbmcgbGluZSA6IG91dHB1dC5zcGxpdCgiXFxuIikpIHsKKyAgICAgICAgICAgIGxpbmUgPSBsaW5lLnRyaW0oKTsKKyAgICAgICAgICAgIE1hdGNoZXIgbWF0Y2hlciA9IHNDdXJyZW50VWlNb2RlUGF0dGVybi5tYXRjaGVyKGxpbmUpOworICAgICAgICAgICAgaWYgKG1hdGNoZXIuZmluZCgpKSB7CisgICAgICAgICAgICAgICAgY3VyVWlNb2RlID0gSW50ZWdlci5wYXJzZUludChtYXRjaGVyLmdyb3VwKDEpLCAxNik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaGVyID0gc1VpTW9kZUxvY2tlZFBhdHRlcm4ubWF0Y2hlcihsaW5lKTsKKyAgICAgICAgICAgIGlmIChtYXRjaGVyLmZpbmQoKSkgeworICAgICAgICAgICAgICAgIHVpTW9kZUxvY2tlZCA9IG1hdGNoZXIuZ3JvdXAoMSkuZXF1YWxzKCJ0cnVlIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIHVpTW9kZUxvY2tlZFRvVnJIZWFkc2V0ID0gKGN1clVpTW9kZSAhPSBudWxsKSAmJiAodWlNb2RlTG9ja2VkICE9IG51bGwpCisgICAgICAgICAgICAgICAgJiYgKChjdXJVaU1vZGUgJiBVSV9NT0RFX1RZUEVfTUFTSykgPT0gVUlfTU9ERV9UWVBFX1ZSX0hFQURTRVQpICYmIHVpTW9kZUxvY2tlZDsKKworICAgICAgICBpZiAodWlNb2RlTG9ja2VkVG9WckhlYWRzZXQpIHsKKyAgICAgICAgICAgIGxvZygiVUkgbW9kZSBpcyBsb2NrZWQgdG8gVlIgaGVhZHNldCIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHVpTW9kZUxvY2tlZFRvVnJIZWFkc2V0OworICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIHN1cHBvcnRzU3BsaXRTY3JlZW5NdWx0aVdpbmRvdygpIHsKKyAgICAgICAgcmV0dXJuIEFjdGl2aXR5TWFuYWdlci5zdXBwb3J0c1NwbGl0U2NyZWVuTXVsdGlXaW5kb3cobUNvbnRleHQpOworICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIGhhc0hvbWVTY3JlZW4oKSB7CisgICAgICAgIGlmIChzSGFzSG9tZVNjcmVlbiA9PSBudWxsKSB7CisgICAgICAgICAgICBzSGFzSG9tZVNjcmVlbiA9ICFleGVjdXRlU2hlbGxDb21tYW5kKEFNX05PX0hPTUVfU0NSRUVOKS5zdGFydHNXaXRoKCJ0cnVlIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNIYXNIb21lU2NyZWVuOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJvdGF0aW9uIHN1cHBvcnQgaXMgaW5kaWNhdGVkIGJ5IGV4cGxpY2l0bHkgaGF2aW5nIGJvdGggbGFuZHNjYXBlIGFuZCBwb3J0cmFpdAorICAgICAqIGZlYXR1cmVzIG9yIG5vdCBsaXN0aW5nIGVpdGhlciBhdCBhbGwuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3VwcG9ydHNSb3RhdGlvbigpIHsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBzdXBwb3J0c0xhbmRzY2FwZSA9IGhhc0RldmljZUZlYXR1cmUoRkVBVFVSRV9TQ1JFRU5fTEFORFNDQVBFKTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBzdXBwb3J0c1BvcnRyYWl0ID0gaGFzRGV2aWNlRmVhdHVyZShGRUFUVVJFX1NDUkVFTl9QT1JUUkFJVCk7CisgICAgICAgIHJldHVybiAoc3VwcG9ydHNMYW5kc2NhcGUgJiYgc3VwcG9ydHNQb3J0cmFpdCkKKyAgICAgICAgICAgICAgICB8fCAoIXN1cHBvcnRzTGFuZHNjYXBlICYmICFzdXBwb3J0c1BvcnRyYWl0KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNEZXZpY2VGZWF0dXJlKGZpbmFsIFN0cmluZyByZXF1aXJlZEZlYXR1cmUpIHsKKyAgICAgICAgcmV0dXJuIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKQorICAgICAgICAgICAgICAgIC5nZXRQYWNrYWdlTWFuYWdlcigpCisgICAgICAgICAgICAgICAgLmhhc1N5c3RlbUZlYXR1cmUocmVxdWlyZWRGZWF0dXJlKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0Rpc3BsYXlPbigpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIG91dHB1dCA9IGV4ZWN1dGVTaGVsbENvbW1hbmQoImR1bXBzeXMgcG93ZXIiKTsKKyAgICAgICAgZmluYWwgTWF0Y2hlciBtYXRjaGVyID0gc0Rpc3BsYXlTdGF0ZVBhdHRlcm4ubWF0Y2hlcihvdXRwdXQpOworICAgICAgICBpZiAobWF0Y2hlci5maW5kKCkpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzdGF0ZSA9IG1hdGNoZXIuZ3JvdXAoMSk7CisgICAgICAgICAgICBsb2coInBvd2VyIHN0YXRlPSIgKyBzdGF0ZSk7CisgICAgICAgICAgICByZXR1cm4gIk9OIi5lcXVhbHMoc3RhdGUpOworICAgICAgICB9CisgICAgICAgIGxvZ0Fsd2F5cygicG93ZXIgc3RhdGUgOigiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgQFJ1bGUgY2xhc3MgdGhhdCBkaXNhYmxlcyBzY3JlZW4gZG96ZSBzZXR0aW5ncyBiZWZvcmUgZWFjaCB0ZXN0IG1ldGhvZCBydW5uaW5nIGFuZAorICAgICAqIHJlc3RvcmluZyB0byBpbml0aWFsIHZhbHVlcyBhZnRlciB0ZXN0IG1ldGhvZCBmaW5pc2hlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIERpc2FibGVTY3JlZW5Eb3plUnVsZSBpbXBsZW1lbnRzIFRlc3RSdWxlIHsKKworICAgICAgICAvKiogQ29waWVkIGZyb20gYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5TZWN1cmUgc2luY2UgdGhlc2Uga2V5cyBhcmUgaGlkZW4uICovCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERPWkVfU0VUVElOR1MgPSB7CisgICAgICAgICAgICAgICAgImRvemVfZW5hYmxlZCIsCisgICAgICAgICAgICAgICAgImRvemVfYWx3YXlzX29uIiwKKyAgICAgICAgICAgICAgICAiZG96ZV9wdWxzZV9vbl9waWNrX3VwIiwKKyAgICAgICAgICAgICAgICAiZG96ZV9wdWxzZV9vbl9sb25nX3ByZXNzIiwKKyAgICAgICAgICAgICAgICAiZG96ZV9wdWxzZV9vbl9kb3VibGVfdGFwIgorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGdldChTdHJpbmcga2V5KSB7CisgICAgICAgICAgICByZXR1cm4gZXhlY3V0ZVNoZWxsQ29tbWFuZCgic2V0dGluZ3MgZ2V0IHNlY3VyZSAiICsga2V5KS50cmltKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgcHV0KFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZCgic2V0dGluZ3MgcHV0IHNlY3VyZSAiICsga2V5ICsgIiAiICsgdmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdGF0ZW1lbnQgYXBwbHkoZmluYWwgU3RhdGVtZW50IGJhc2UsIGZpbmFsIERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0YXRlbWVudCgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBldmFsdWF0ZSgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IGluaXRpYWxWYWx1ZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgICAgICAgICAgICAgIEFycmF5cy5zdHJlYW0oRE9aRV9TRVRUSU5HUykuZm9yRWFjaChrIC0+IGluaXRpYWxWYWx1ZXMucHV0KGssIGdldChrKSkpOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLnN0cmVhbShET1pFX1NFVFRJTkdTKS5mb3JFYWNoKGsgLT4gcHV0KGssICIwIikpOworICAgICAgICAgICAgICAgICAgICAgICAgYmFzZS5ldmFsdWF0ZSgpOworICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLnN0cmVhbShET1pFX1NFVFRJTkdTKS5mb3JFYWNoKGsgLT4gcHV0KGssIGluaXRpYWxWYWx1ZXMuZ2V0KGspKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIGNsYXNzIExvY2tTY3JlZW5TZXNzaW9uIGltcGxlbWVudHMgQXV0b0Nsb3NlYWJsZSB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKKworICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbUlzTG9ja0Rpc2FibGVkOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUxvY2tDcmVkZW50aWFsU2V0OworCisgICAgICAgIHB1YmxpYyBMb2NrU2NyZWVuU2Vzc2lvbigpIHsKKyAgICAgICAgICAgIG1Jc0xvY2tEaXNhYmxlZCA9IGlzTG9ja0Rpc2FibGVkKCk7CisgICAgICAgICAgICBtTG9ja0NyZWRlbnRpYWxTZXQgPSBmYWxzZTsKKyAgICAgICAgICAgIC8vIEVuYWJsZSBsb2NrIHNjcmVlbiAoc3dpcGUpIGJ5IGRlZmF1bHQuCisgICAgICAgICAgICBzZXRMb2NrRGlzYWJsZWQoZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIExvY2tTY3JlZW5TZXNzaW9uIHNldExvY2tDcmVkZW50aWFsKCkgeworICAgICAgICAgICAgbUxvY2tDcmVkZW50aWFsU2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgIHJ1bkNvbW1hbmRBbmRQcmludE91dHB1dCgibG9ja3NldHRpbmdzIHNldC1waW4gIiArIExPQ0tfQ1JFREVOVElBTCk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBMb2NrU2NyZWVuU2Vzc2lvbiBlbnRlckFuZENvbmZpcm1Mb2NrQ3JlZGVudGlhbCgpIHsKKyAgICAgICAgICAgIHdhaXRGb3JEZXZpY2VJZGxlKDMwMDApOworCisgICAgICAgICAgICBydW5Db21tYW5kQW5kUHJpbnRPdXRwdXQoImlucHV0IHRleHQgIiArIExPQ0tfQ1JFREVOVElBTCk7CisgICAgICAgICAgICBwcmVzc0VudGVyQnV0dG9uKCk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCByZW1vdmVMb2NrQ3JlZGVudGlhbCgpIHsKKyAgICAgICAgICAgIHJ1bkNvbW1hbmRBbmRQcmludE91dHB1dCgibG9ja3NldHRpbmdzIGNsZWFyIC0tb2xkICIgKyBMT0NLX0NSRURFTlRJQUwpOworICAgICAgICAgICAgbUxvY2tDcmVkZW50aWFsU2V0ID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBMb2NrU2NyZWVuU2Vzc2lvbiBkaXNhYmxlTG9ja1NjcmVlbigpIHsKKyAgICAgICAgICAgIHNldExvY2tEaXNhYmxlZCh0cnVlKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgTG9ja1NjcmVlblNlc3Npb24gc2xlZXBEZXZpY2UoKSB7CisgICAgICAgICAgICBwcmVzc1NsZWVwQnV0dG9uKCk7CisgICAgICAgICAgICAvLyBOb3QgYWxsIGRldmljZSB2YXJpYW50cyBsb2NrIHdoZW4gd2UgZ28gdG8gc2xlZXAsIHNvIHdlIG5lZWQgdG8gZXhwbGljaXRseSBsb2NrIHRoZQorICAgICAgICAgICAgLy8gZGV2aWNlLiBOb3RlIHRoYXQgcHJlc3NTbGVlcEJ1dHRvbigpIGFib3ZlIGlzIHJlZHVuZGFudCBiZWNhdXNlIHRoZSBhY3Rpb24gYWxzbworICAgICAgICAgICAgLy8gcHV0cyB0aGUgZGV2aWNlIHRvIHNsZWVwLCBidXQga2VwdCBhcm91bmQgZm9yIGNsYXJpdHkuCisgICAgICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKS5nZXRVaUF1dG9tYXRpb24oKS5wZXJmb3JtR2xvYmFsQWN0aW9uKAorICAgICAgICAgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5U2VydmljZS5HTE9CQUxfQUNUSU9OX0xPQ0tfU0NSRUVOKTsKKyAgICAgICAgICAgIGZvciAoaW50IHJldHJ5ID0gMTsgaXNEaXNwbGF5T24oKSAmJiByZXRyeSA8PSA1OyByZXRyeSsrKSB7CisgICAgICAgICAgICAgICAgbG9nQWx3YXlzKCIqKipXYWl0aW5nIGZvciBkaXNwbGF5IHRvIHR1cm4gb2ZmLi4uIHJldHJ5PSIgKyByZXRyeSk7CisgICAgICAgICAgICAgICAgU3lzdGVtQ2xvY2suc2xlZXAoVGltZVVuaXQuU0VDT05EUy50b01pbGxpcygxKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIExvY2tTY3JlZW5TZXNzaW9uIHdha2VVcERldmljZSgpIHsKKyAgICAgICAgICAgIHByZXNzV2FrZXVwQnV0dG9uKCk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIExvY2tTY3JlZW5TZXNzaW9uIHVubG9ja0RldmljZSgpIHsKKyAgICAgICAgICAgIHByZXNzVW5sb2NrQnV0dG9uKCk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBMb2NrU2NyZWVuU2Vzc2lvbiBnb3RvS2V5Z3VhcmQoKSB7CisgICAgICAgICAgICBpZiAoREVCVUcgJiYgaXNMb2NrRGlzYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIGxvZ0UoIkxvY2tTY3JlZW5TZXNzaW9uLmdvdG9LZXlndWFyZCgpIGlzIGNhbGxlZCB3aXRob3V0IGxvY2sgZW5hYmxlZC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNsZWVwRGV2aWNlKCk7CisgICAgICAgICAgICB3YWtlVXBEZXZpY2UoKTsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvcktleWd1YXJkU2hvd2luZ0FuZE5vdE9jY2x1ZGVkKCk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgc2V0TG9ja0Rpc2FibGVkKG1Jc0xvY2tEaXNhYmxlZCk7CisgICAgICAgICAgICBpZiAobUxvY2tDcmVkZW50aWFsU2V0KSB7CisgICAgICAgICAgICAgICAgcmVtb3ZlTG9ja0NyZWRlbnRpYWwoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRGlzbWlzcyBhY3RpdmUga2V5Z3VhcmQgYWZ0ZXIgY3JlZGVudGlhbCBpcyBjbGVhcmVkLCBzbyBrZXlndWFyZCBkb2Vzbid0IGFzayBmb3IKKyAgICAgICAgICAgIC8vIHRoZSBzdGFsZSBjcmVkZW50aWFsLgorICAgICAgICAgICAgcHJlc3NCYWNrQnV0dG9uKCk7CisgICAgICAgICAgICBzbGVlcERldmljZSgpOworICAgICAgICAgICAgd2FrZVVwRGV2aWNlKCk7CisgICAgICAgICAgICB1bmxvY2tEZXZpY2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGxvY2sgc2NyZWVuIGlzIGRpc2FibGVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGxvY2sgc2NyZWVuIGlzIGRpc2FibGVkLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNMb2NrRGlzYWJsZWQoKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaXNMb2NrRGlzYWJsZWQgPSBydW5Db21tYW5kQW5kUHJpbnRPdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICJsb2Nrc2V0dGluZ3MgZ2V0LWRpc2FibGVkIikudHJpbSgpOworICAgICAgICAgICAgcmV0dXJuICEibnVsbCIuZXF1YWxzKGlzTG9ja0Rpc2FibGVkKSAmJiBCb29sZWFuLnBhcnNlQm9vbGVhbihpc0xvY2tEaXNhYmxlZCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogRGlzYWJsZSB0aGUgbG9jayBzY3JlZW4uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBsb2NrRGlzYWJsZWQgdHJ1ZSBpZiBzaG91bGQgZGlzYWJsZSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgc2V0TG9ja0Rpc2FibGVkKGJvb2xlYW4gbG9ja0Rpc2FibGVkKSB7CisgICAgICAgICAgICBydW5Db21tYW5kQW5kUHJpbnRPdXRwdXQoImxvY2tzZXR0aW5ncyBzZXQtZGlzYWJsZWQgIiArIGxvY2tEaXNhYmxlZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogSGVscGVyIGNsYXNzIHRvIHNhdmUsIHNldCAmIHdhaXQsIGFuZCByZXN0b3JlIHJvdGF0aW9uIHJlbGF0ZWQgcHJlZmVyZW5jZXMuICovCisgICAgcHJvdGVjdGVkIGNsYXNzIFJvdGF0aW9uU2Vzc2lvbiBleHRlbmRzIFNldHRpbmdzU2Vzc2lvbjxJbnRlZ2VyPiB7CisgICAgICAgIHByaXZhdGUgZmluYWwgU2V0dGluZ3NTZXNzaW9uPEludGVnZXI+IG1Vc2VyUm90YXRpb247CisKKyAgICAgICAgcHVibGljIFJvdGF0aW9uU2Vzc2lvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgLy8gU2F2ZSBhY2NlbGVyb21ldGVyX3JvdGF0aW9uIHByZWZlcmVuY2UuCisgICAgICAgICAgICBzdXBlcihTZXR0aW5ncy5TeXN0ZW0uZ2V0VXJpRm9yKFNldHRpbmdzLlN5c3RlbS5BQ0NFTEVST01FVEVSX1JPVEFUSU9OKSwKKyAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtOjpnZXRJbnQsIFNldHRpbmdzLlN5c3RlbTo6cHV0SW50KTsKKyAgICAgICAgICAgIG1Vc2VyUm90YXRpb24gPSBuZXcgU2V0dGluZ3NTZXNzaW9uPD4oCisgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5nZXRVcmlGb3IoU2V0dGluZ3MuU3lzdGVtLlVTRVJfUk9UQVRJT04pLAorICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW06OmdldEludCwgU2V0dGluZ3MuU3lzdGVtOjpwdXRJbnQpOworICAgICAgICAgICAgLy8gRGlzYWJsZSBhY2NlbGVyb21ldGVyX3JvdGF0aW9uLgorICAgICAgICAgICAgc3VwZXIuc2V0KDApOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldChATm9uTnVsbCBJbnRlZ2VyIHZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIG1Vc2VyUm90YXRpb24uc2V0KHZhbHVlKTsKKyAgICAgICAgICAgIC8vIFdhaXQgZm9yIHNldHRsaW5nIHJvdGF0aW9uLgorICAgICAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yUm90YXRpb24odmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBtVXNlclJvdGF0aW9uLmNsb3NlKCk7CisgICAgICAgICAgICAvLyBSZXN0b3JlIGFjY2VsZXJvbWV0ZXJfcm90YXRpb24gcHJlZmVyZW5jZS4KKyAgICAgICAgICAgIHN1cGVyLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHRlc3QgZGV2aWNlIHJlc3BlY3RzIHNldHRpbmdzIG9mIGxvY2tlZCB1c2VyIHJvdGF0aW9uIG1vZGUuCisgICAgICoKKyAgICAgKiBUaGUgbWV0aG9kIHNldHMgdGhlIGxvY2tlZCB1c2VyIHJvdGF0aW9uIHNldHRpbmdzIHRvIHRoZSByb3RhdGlvbiB0aGF0IHJvdGF0ZXMgdGhlIGRpc3BsYXkgYnkKKyAgICAgKiAxODAgZGVncmVlcyBhbmQgY2hlY2tzIGlmIHRoZSBhY3R1YWwgZGlzcGxheSByb3RhdGlvbiBjaGFuZ2VzIGFmdGVyIHRoYXQuCisgICAgICoKKyAgICAgKiBUaGlzIGlzIGEgbmVjZXNzYXJ5IGFzc3VtcHRpb24gY2hlY2sgYmVmb3JlIGxldmVyYWdpbmcgdXNlciByb3RhdGlvbiBtb2RlIHRvIGZvcmNlIGRpc3BsYXkKKyAgICAgKiByb3RhdGlvbiwgYmVjYXVzZSB0aGVyZSBpcyBubyByZXF1aXJlbWVudCB0aGF0IGFuIEFuZHJvaWQgZGV2aWNlIHRoYXQgc3VwcG9ydHMgYm90aAorICAgICAqIG9yaWVudGF0aW9ucyBuZWVkcyB0byBzdXBwb3J0IHVzZXIgcm90YXRpb24gbW9kZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXNzaW9uIHRoZSByb3RhdGlvbiBzZXNzaW9uIHVzZWQgdG8gc2V0IHVzZXIgcm90YXRpb24KKyAgICAgKiBAcGFyYW0gZGlzcGxheUlkIHRoZSBkaXNwbGF5IElEIHRvIGNoZWNrIHJvdGF0aW9uIGFnYWluc3QKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0ZXN0IGRldmljZSByZXNwZWN0cyBzZXR0aW5ncyBvZiBsb2NrZWQgdXNlciByb3RhdGlvbiBtb2RlOworICAgICAqICAgICAge0Bjb2RlIGZhbHNlfSBpZiBub3QuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3VwcG9ydHNMb2NrZWRVc2VyUm90YXRpb24oUm90YXRpb25TZXNzaW9uIHNlc3Npb24sIGludCBkaXNwbGF5SWQpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgaW50IG9yaWdSb3RhdGlvbiA9IGdldERldmljZVJvdGF0aW9uKGRpc3BsYXlJZCk7CisgICAgICAgIC8vIFVzZSB0aGUgc2FtZSBvcmllbnRhdGlvbiBhcyB0YXJnZXQgcm90YXRpb24gdG8gYXZvaWQgYWZmZWN0IG9mIGFwcC1yZXF1ZXN0ZWQgb3JpZW50YXRpb24uCisgICAgICAgIGZpbmFsIGludCB0YXJnZXRSb3RhdGlvbiA9IChvcmlnUm90YXRpb24gKyAyKSAlIDQ7CisgICAgICAgIHNlc3Npb24uc2V0KHRhcmdldFJvdGF0aW9uKTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiByZXN1bHQgPSAoZ2V0RGV2aWNlUm90YXRpb24oZGlzcGxheUlkKSA9PSB0YXJnZXRSb3RhdGlvbik7CisgICAgICAgIHNlc3Npb24uc2V0KG9yaWdSb3RhdGlvbik7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGludCBnZXREZXZpY2VSb3RhdGlvbihpbnQgZGlzcGxheUlkKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBkaXNwbGF5cyA9IHJ1bkNvbW1hbmRBbmRQcmludE91dHB1dCgiZHVtcHN5cyBkaXNwbGF5IGRpc3BsYXlzIikudHJpbSgpOworICAgICAgICBQYXR0ZXJuIHBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoCisgICAgICAgICAgICAgICAgIihtRGlzcGxheUlkPSIgKyBkaXNwbGF5SWQgKyAiKShbXFxzXFxTXSo/KShtT3ZlcnJpZGVEaXNwbGF5SW5mbykoLiopIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiKHJvdGF0aW9uKShcXHMrKShcXGQrKSIpOworICAgICAgICBNYXRjaGVyIG1hdGNoZXIgPSBwYXR0ZXJuLm1hdGNoZXIoZGlzcGxheXMpOworICAgICAgICBpZiAobWF0Y2hlci5maW5kKCkpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtYXRjaCA9IG1hdGNoZXIuZ3JvdXAoNyk7CisgICAgICAgICAgICByZXR1cm4gSW50ZWdlci5wYXJzZUludChtYXRjaCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gSU5WQUxJRF9ERVZJQ0VfUk9UQVRJT047CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgcnVuQ29tbWFuZEFuZFByaW50T3V0cHV0KFN0cmluZyBjb21tYW5kKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBvdXRwdXQgPSBleGVjdXRlU2hlbGxDb21tYW5kKGNvbW1hbmQpOworICAgICAgICBsb2cob3V0cHV0KTsKKyAgICAgICAgcmV0dXJuIG91dHB1dDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIExvZ1NlcGFyYXRvciB7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1VbmlxdWVTdHJpbmc7CisKKyAgICAgICAgcHJpdmF0ZSBMb2dTZXBhcmF0b3IoKSB7CisgICAgICAgICAgICBtVW5pcXVlU3RyaW5nID0gVVVJRC5yYW5kb21VVUlEKCkudG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIG1VbmlxdWVTdHJpbmc7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnNlcnRzIGEgbG9nIHNlcGFyYXRvciBzbyB3ZSBjYW4gYWx3YXlzIGZpbmQgdGhlIHN0YXJ0aW5nIHBvaW50IGZyb20gd2hlcmUgdG8gZXZhbHVhdGUKKyAgICAgKiBmb2xsb3dpbmcgbG9ncy4KKyAgICAgKiBAcmV0dXJuIFVuaXF1ZSBsb2cgc2VwYXJhdG9yLgorICAgICAqLworICAgIHByb3RlY3RlZCBMb2dTZXBhcmF0b3Igc2VwYXJhdGVMb2dzKCkgeworICAgICAgICBmaW5hbCBMb2dTZXBhcmF0b3IgbG9nU2VwYXJhdG9yID0gbmV3IExvZ1NlcGFyYXRvcigpOworICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKCJsb2cgLXQgIiArIExPR19TRVBBUkFUT1IgKyAiICIgKyBsb2dTZXBhcmF0b3IpOworICAgICAgICByZXR1cm4gbG9nU2VwYXJhdG9yOworICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nW10gZ2V0RGV2aWNlTG9nc0ZvckNvbXBvbmVudHMoCisgICAgICAgICAgICBMb2dTZXBhcmF0b3IgbG9nU2VwYXJhdG9yLCBTdHJpbmcuLi4gbG9nVGFncykgeworICAgICAgICBTdHJpbmcgZmlsdGVycyA9IExPR19TRVBBUkFUT1IgKyAiOkkgIjsKKyAgICAgICAgZm9yIChTdHJpbmcgY29tcG9uZW50IDogbG9nVGFncykgeworICAgICAgICAgICAgZmlsdGVycyArPSBjb21wb25lbnQgKyAiOkkgIjsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBTdHJpbmdbXSByZXN1bHQgPSBleGVjdXRlU2hlbGxDb21tYW5kKCJsb2djYXQgLXYgYnJpZWYgLWQgIiArIGZpbHRlcnMgKyAiICo6UyIpCisgICAgICAgICAgICAgICAgLnNwbGl0KCJcXG4iKTsKKyAgICAgICAgaWYgKGxvZ1NlcGFyYXRvciA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgd2Ugb25seSBjaGVjayBsb2dzIGFmdGVyIHRoZSBzZXBhcmF0b3IuCisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgYm9vbGVhbiBsb29raW5nRm9yU2VwYXJhdG9yID0gdHJ1ZTsKKyAgICAgICAgd2hpbGUgKGkgPCByZXN1bHQubGVuZ3RoICYmIGxvb2tpbmdGb3JTZXBhcmF0b3IpIHsKKyAgICAgICAgICAgIGlmIChyZXN1bHRbaV0uY29udGFpbnMobG9nU2VwYXJhdG9yLnRvU3RyaW5nKCkpKSB7CisgICAgICAgICAgICAgICAgbG9va2luZ0ZvclNlcGFyYXRvciA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFN0cmluZ1tdIGZpbHRlcmVkUmVzdWx0ID0gbmV3IFN0cmluZ1tyZXN1bHQubGVuZ3RoIC0gaV07CisgICAgICAgIGZvciAoaW50IGN1clBvcyA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBjdXJQb3MrKywgaSsrKSB7CisgICAgICAgICAgICBmaWx0ZXJlZFJlc3VsdFtjdXJQb3NdID0gcmVzdWx0W2ldOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmaWx0ZXJlZFJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCYXNlIGhlbHBlciBjbGFzcyBmb3IgcmV0cnlpbmcgdmFsaWRhdG9yIHN1Y2Nlc3MuCisgICAgICovCisgICAgcHJpdmF0ZSBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgUmV0cnlWYWxpZGF0b3IgeworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVRSWV9MSU1JVCA9IDU7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgUkVUUllfSU5URVJWQUwgPSBUaW1lVW5pdC5TRUNPTkRTLnRvTWlsbGlzKDEpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIEVycm9yIHN0cmluZyBpZiB2YWxpZGF0aW9uIGlzIGZhaWxlZCwgbnVsbCBpZiBldmVyeXRoaW5nIGlzIGZpbmUuCisgICAgICAgICAqKi8KKyAgICAgICAgQE51bGxhYmxlCisgICAgICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgdmFsaWRhdGUoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogRXhlY3V0ZXMge0BsaW5rICN2YWxpZGF0ZSgpfS4gUmV0cmllcyB7QGxpbmsgI1JFVFJZX0xJTUlUfSB0aW1lcyB3aXRoCisgICAgICAgICAqIHtAbGluayAjUkVUUllfSU5URVJWQUx9IGludGVydmFsLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gd2FpdGluZ01lc3NhZ2UgbG9nZ2luZyBtZXNzYWdlIHdoaWxlIHdhaXRpbmcgdmFsaWRhdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgYXNzZXJ0VmFsaWRhdG9yKFN0cmluZyB3YWl0aW5nTWVzc2FnZSkgeworICAgICAgICAgICAgU3RyaW5nIHJlc3VsdFN0cmluZyA9IG51bGw7CisgICAgICAgICAgICBmb3IgKGludCByZXRyeSA9IDE7IHJldHJ5IDw9IFJFVFJZX0xJTUlUOyByZXRyeSsrKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0U3RyaW5nID0gdmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0U3RyaW5nID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsb2dBbHdheXMod2FpdGluZ01lc3NhZ2UgKyAiOiAiICsgcmVzdWx0U3RyaW5nKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW1DbG9jay5zbGVlcChSRVRSWV9JTlRFUlZBTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmYWlsKHJlc3VsdFN0cmluZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBY3Rpdml0eUxpZmVjeWNsZUNvdW50c1ZhbGlkYXRvciBleHRlbmRzIFJldHJ5VmFsaWRhdG9yIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb21wb25lbnROYW1lIG1BY3Rpdml0eU5hbWU7CisgICAgICAgIHByaXZhdGUgZmluYWwgTG9nU2VwYXJhdG9yIG1Mb2dTZXBhcmF0b3I7CisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1DcmVhdGVDb3VudDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVN0YXJ0Q291bnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1SZXN1bWVDb3VudDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVBhdXNlQ291bnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1TdG9wQ291bnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1EZXN0cm95Q291bnQ7CisKKyAgICAgICAgQWN0aXZpdHlMaWZlY3ljbGVDb3VudHNWYWxpZGF0b3IoQ29tcG9uZW50TmFtZSBhY3Rpdml0eU5hbWUsIExvZ1NlcGFyYXRvciBsb2dTZXBhcmF0b3IsCisgICAgICAgICAgICAgICAgaW50IGNyZWF0ZUNvdW50LCBpbnQgc3RhcnRDb3VudCwgaW50IHJlc3VtZUNvdW50LCBpbnQgcGF1c2VDb3VudCwgaW50IHN0b3BDb3VudCwKKyAgICAgICAgICAgICAgICBpbnQgZGVzdHJveUNvdW50KSB7CisgICAgICAgICAgICBtQWN0aXZpdHlOYW1lID0gYWN0aXZpdHlOYW1lOworICAgICAgICAgICAgbUxvZ1NlcGFyYXRvciA9IGxvZ1NlcGFyYXRvcjsKKyAgICAgICAgICAgIG1DcmVhdGVDb3VudCA9IGNyZWF0ZUNvdW50OworICAgICAgICAgICAgbVN0YXJ0Q291bnQgPSBzdGFydENvdW50OworICAgICAgICAgICAgbVJlc3VtZUNvdW50ID0gcmVzdW1lQ291bnQ7CisgICAgICAgICAgICBtUGF1c2VDb3VudCA9IHBhdXNlQ291bnQ7CisgICAgICAgICAgICBtU3RvcENvdW50ID0gc3RvcENvdW50OworICAgICAgICAgICAgbURlc3Ryb3lDb3VudCA9IGRlc3Ryb3lDb3VudDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBATnVsbGFibGUKKyAgICAgICAgcHJvdGVjdGVkIFN0cmluZyB2YWxpZGF0ZSgpIHsKKyAgICAgICAgICAgIGZpbmFsIEFjdGl2aXR5TGlmZWN5Y2xlQ291bnRzIGxpZmVjeWNsZUNvdW50cyA9IG5ldyBBY3Rpdml0eUxpZmVjeWNsZUNvdW50cygKKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2aXR5TmFtZSwgbUxvZ1NlcGFyYXRvcik7CisgICAgICAgICAgICBpZiAobGlmZWN5Y2xlQ291bnRzLm1DcmVhdGVDb3VudCA9PSBtQ3JlYXRlQ291bnQKKyAgICAgICAgICAgICAgICAgICAgJiYgbGlmZWN5Y2xlQ291bnRzLm1TdGFydENvdW50ID09IG1TdGFydENvdW50CisgICAgICAgICAgICAgICAgICAgICYmIGxpZmVjeWNsZUNvdW50cy5tUmVzdW1lQ291bnQgPT0gbVJlc3VtZUNvdW50CisgICAgICAgICAgICAgICAgICAgICYmIGxpZmVjeWNsZUNvdW50cy5tUGF1c2VDb3VudCA9PSBtUGF1c2VDb3VudAorICAgICAgICAgICAgICAgICAgICAmJiBsaWZlY3ljbGVDb3VudHMubVN0b3BDb3VudCA9PSBtU3RvcENvdW50CisgICAgICAgICAgICAgICAgICAgICYmIGxpZmVjeWNsZUNvdW50cy5tRGVzdHJveUNvdW50ID09IG1EZXN0cm95Q291bnQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBleHBlY3RlZCA9IEludFN0cmVhbS5vZihtQ3JlYXRlQ291bnQsIG1TdG9wQ291bnQsIG1SZXN1bWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgbVBhdXNlQ291bnQsIG1TdG9wQ291bnQsIG1EZXN0cm95Q291bnQpCisgICAgICAgICAgICAgICAgICAgIC5tYXBUb09iaihJbnRlZ2VyOjp0b1N0cmluZykKKyAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy5qb2luaW5nKCIvIikpOworICAgICAgICAgICAgcmV0dXJuIGdldEFjdGl2aXR5TmFtZShtQWN0aXZpdHlOYW1lKSArICIgbGlmZWN5Y2xlIGNvdW50IG1pc21hdGNoZWQ6IgorICAgICAgICAgICAgICAgICAgICArICIgZXhwZWN0ZWQ9IiArIGV4cGVjdGVkCisgICAgICAgICAgICAgICAgICAgICsgIiBhY3R1YWw9IiArIGxpZmVjeWNsZUNvdW50cy5jb3VudGVycygpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBhc3NlcnRBY3Rpdml0eUxpZmVjeWNsZShDb21wb25lbnROYW1lIGFjdGl2aXR5TmFtZSwgYm9vbGVhbiByZWxhdW5jaGVkLAorICAgICAgICAgICAgTG9nU2VwYXJhdG9yIGxvZ1NlcGFyYXRvcikgeworICAgICAgICBuZXcgUmV0cnlWYWxpZGF0b3IoKSB7CisKKyAgICAgICAgICAgIEBOdWxsYWJsZQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIHZhbGlkYXRlKCkgeworICAgICAgICAgICAgICAgIGZpbmFsIEFjdGl2aXR5TGlmZWN5Y2xlQ291bnRzIGxpZmVjeWNsZUNvdW50cyA9CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWN0aXZpdHlMaWZlY3ljbGVDb3VudHMoYWN0aXZpdHlOYW1lLCBsb2dTZXBhcmF0b3IpOworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsb2dUYWcgPSBnZXRMb2dUYWcoYWN0aXZpdHlOYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAocmVsYXVuY2hlZCkgeworICAgICAgICAgICAgICAgICAgICBpZiAobGlmZWN5Y2xlQ291bnRzLm1EZXN0cm95Q291bnQgPCAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9nVGFnICsgIiBtdXN0IGhhdmUgYmVlbiBkZXN0cm95ZWQuIG1EZXN0cm95Q291bnQ9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGxpZmVjeWNsZUNvdW50cy5tRGVzdHJveUNvdW50OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChsaWZlY3ljbGVDb3VudHMubUNyZWF0ZUNvdW50IDwgMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvZ1RhZyArICIgbXVzdCBoYXZlIGJlZW4gKHJlKWNyZWF0ZWQuIG1DcmVhdGVDb3VudD0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbGlmZWN5Y2xlQ291bnRzLm1DcmVhdGVDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxpZmVjeWNsZUNvdW50cy5tRGVzdHJveUNvdW50ID4gMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9nVGFnICsgIiBtdXN0ICpOT1QqIGhhdmUgYmVlbiBkZXN0cm95ZWQuIG1EZXN0cm95Q291bnQ9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbGlmZWN5Y2xlQ291bnRzLm1EZXN0cm95Q291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChsaWZlY3ljbGVDb3VudHMubUNyZWF0ZUNvdW50ID4gMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9nVGFnICsgIiBtdXN0ICpOT1QqIGhhdmUgYmVlbiAocmUpY3JlYXRlZC4gbUNyZWF0ZUNvdW50PSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGxpZmVjeWNsZUNvdW50cy5tQ3JlYXRlQ291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChsaWZlY3ljbGVDb3VudHMubUNvbmZpZ3VyYXRpb25DaGFuZ2VkQ291bnQgPCAxKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2dUYWcgKyAiIG11c3QgaGF2ZSByZWNlaXZlZCBjb25maWd1cmF0aW9uIGNoYW5nZWQuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJtQ29uZmlndXJhdGlvbkNoYW5nZWRDb3VudD0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBsaWZlY3ljbGVDb3VudHMubUNvbmZpZ3VyYXRpb25DaGFuZ2VkQ291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9LmFzc2VydFZhbGlkYXRvcigiKioqV2FpdGluZyBmb3IgdmFsaWQgbGlmZWN5Y2xlIHN0YXRlIik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0UmVsYXVuY2hPckNvbmZpZ0NoYW5nZWQoQ29tcG9uZW50TmFtZSBhY3Rpdml0eU5hbWUsIGludCBudW1SZWxhdW5jaCwKKyAgICAgICAgICAgIGludCBudW1Db25maWdDaGFuZ2UsIExvZ1NlcGFyYXRvciBsb2dTZXBhcmF0b3IpIHsKKyAgICAgICAgbmV3IFJldHJ5VmFsaWRhdG9yKCkgeworCisgICAgICAgICAgICBATnVsbGFibGUKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIFN0cmluZyB2YWxpZGF0ZSgpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBBY3Rpdml0eUxpZmVjeWNsZUNvdW50cyBsaWZlY3ljbGVDb3VudHMgPQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGl2aXR5TGlmZWN5Y2xlQ291bnRzKGFjdGl2aXR5TmFtZSwgbG9nU2VwYXJhdG9yKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbG9nVGFnID0gZ2V0TG9nVGFnKGFjdGl2aXR5TmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKGxpZmVjeWNsZUNvdW50cy5tRGVzdHJveUNvdW50ICE9IG51bVJlbGF1bmNoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2dUYWcgKyAiIGhhcyBiZWVuIGRlc3Ryb3llZCAiICsgbGlmZWN5Y2xlQ291bnRzLm1EZXN0cm95Q291bnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgdGltZShzKSwgZXhwZWN0aW5nICIgKyBudW1SZWxhdW5jaDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxpZmVjeWNsZUNvdW50cy5tQ3JlYXRlQ291bnQgIT0gbnVtUmVsYXVuY2gpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvZ1RhZyArICIgaGFzIGJlZW4gKHJlKWNyZWF0ZWQgIiArIGxpZmVjeWNsZUNvdW50cy5tQ3JlYXRlQ291bnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgdGltZShzKSwgZXhwZWN0aW5nICIgKyBudW1SZWxhdW5jaDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxpZmVjeWNsZUNvdW50cy5tQ29uZmlndXJhdGlvbkNoYW5nZWRDb3VudCAhPSBudW1Db25maWdDaGFuZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvZ1RhZyArICIgaGFzIHJlY2VpdmVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGxpZmVjeWNsZUNvdW50cy5tQ29uZmlndXJhdGlvbkNoYW5nZWRDb3VudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKCkgY2FsbHMsIGV4cGVjdGluZyAiICsgbnVtQ29uZmlnQ2hhbmdlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfS5hc3NlcnRWYWxpZGF0b3IoIioqKldhaXRpbmcgZm9yIHJlbGF1bmNoIG9yIGNvbmZpZyBjaGFuZ2VkIik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0QWN0aXZpdHlEZXN0cm95ZWQoQ29tcG9uZW50TmFtZSBhY3Rpdml0eU5hbWUsIExvZ1NlcGFyYXRvciBsb2dTZXBhcmF0b3IpIHsKKyAgICAgICAgbmV3IFJldHJ5VmFsaWRhdG9yKCkgeworCisgICAgICAgICAgICBATnVsbGFibGUKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIFN0cmluZyB2YWxpZGF0ZSgpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBBY3Rpdml0eUxpZmVjeWNsZUNvdW50cyBsaWZlY3ljbGVDb3VudHMgPQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGl2aXR5TGlmZWN5Y2xlQ291bnRzKGFjdGl2aXR5TmFtZSwgbG9nU2VwYXJhdG9yKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbG9nVGFnID0gZ2V0TG9nVGFnKGFjdGl2aXR5TmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKGxpZmVjeWNsZUNvdW50cy5tRGVzdHJveUNvdW50ICE9IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvZ1RhZyArICIgaGFzIGJlZW4gZGVzdHJveWVkICIgKyBsaWZlY3ljbGVDb3VudHMubURlc3Ryb3lDb3VudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB0aW1lKHMpLCBleHBlY3Rpbmcgc2luZ2xlIGRlc3RydWN0aW9uLiI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChsaWZlY3ljbGVDb3VudHMubUNyZWF0ZUNvdW50ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvZ1RhZyArICIgaGFzIGJlZW4gKHJlKWNyZWF0ZWQgIiArIGxpZmVjeWNsZUNvdW50cy5tQ3JlYXRlQ291bnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgdGltZShzKSwgbm90IGV4cGVjdGluZyBhbnkuIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxpZmVjeWNsZUNvdW50cy5tQ29uZmlndXJhdGlvbkNoYW5nZWRDb3VudCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2dUYWcgKyAiIGhhcyByZWNlaXZlZCAiICsgbGlmZWN5Y2xlQ291bnRzLm1Db25maWd1cmF0aW9uQ2hhbmdlZENvdW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQoKSBjYWxscywgbm90IGV4cGVjdGluZyBhbnkuIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0uYXNzZXJ0VmFsaWRhdG9yKCIqKipXYWl0aW5nIGZvciBhY3Rpdml0eSBkZXN0cm95ZWQiKTsKKyAgICB9CisKKyAgICB2b2lkIGFzc2VydExpZmVjeWNsZUNvdW50cyhDb21wb25lbnROYW1lIGFjdGl2aXR5TmFtZSwgTG9nU2VwYXJhdG9yIGxvZ1NlcGFyYXRvciwKKyAgICAgICAgICAgIGludCBjcmVhdGVDb3VudCwgaW50IHN0YXJ0Q291bnQsIGludCByZXN1bWVDb3VudCwgaW50IHBhdXNlQ291bnQsIGludCBzdG9wQ291bnQsCisgICAgICAgICAgICBpbnQgZGVzdHJveUNvdW50LCBpbnQgY29uZmlndXJhdGlvbkNoYW5nZUNvdW50KSB7CisgICAgICAgIG5ldyBSZXRyeVZhbGlkYXRvcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIFN0cmluZyB2YWxpZGF0ZSgpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBBY3Rpdml0eUxpZmVjeWNsZUNvdW50cyBsaWZlY3ljbGVDb3VudHMgPQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGl2aXR5TGlmZWN5Y2xlQ291bnRzKGFjdGl2aXR5TmFtZSwgbG9nU2VwYXJhdG9yKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbG9nVGFnID0gZ2V0TG9nVGFnKGFjdGl2aXR5TmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKGNyZWF0ZUNvdW50ICE9IGxpZmVjeWNsZUNvdW50cy5tQ3JlYXRlQ291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvZ1RhZyArICIgaGFzIGJlZW4gY3JlYXRlZCAiICsgbGlmZWN5Y2xlQ291bnRzLm1DcmVhdGVDb3VudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB0aW1lKHMpLCBleHBlY3RpbmcgIiArIGNyZWF0ZUNvdW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc3RhcnRDb3VudCAhPSBsaWZlY3ljbGVDb3VudHMubVN0YXJ0Q291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvZ1RhZyArICIgaGFzIGJlZW4gc3RhcnRlZCAiICsgbGlmZWN5Y2xlQ291bnRzLm1TdGFydENvdW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHRpbWUocyksIGV4cGVjdGluZyAiICsgc3RhcnRDb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHJlc3VtZUNvdW50ICE9IGxpZmVjeWNsZUNvdW50cy5tUmVzdW1lQ291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvZ1RhZyArICIgaGFzIGJlZW4gcmVzdW1lZCAiICsgbGlmZWN5Y2xlQ291bnRzLm1SZXN1bWVDb3VudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB0aW1lKHMpLCBleHBlY3RpbmcgIiArIHJlc3VtZUNvdW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocGF1c2VDb3VudCAhPSBsaWZlY3ljbGVDb3VudHMubVBhdXNlQ291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvZ1RhZyArICIgaGFzIGJlZW4gcGF1c2VkICIgKyBsaWZlY3ljbGVDb3VudHMubVBhdXNlQ291bnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgdGltZShzKSwgZXhwZWN0aW5nICIgKyBwYXVzZUNvdW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc3RvcENvdW50ICE9IGxpZmVjeWNsZUNvdW50cy5tU3RvcENvdW50KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2dUYWcgKyAiIGhhcyBiZWVuIHN0b3BwZWQgIiArIGxpZmVjeWNsZUNvdW50cy5tU3RvcENvdW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHRpbWUocyksIGV4cGVjdGluZyAiICsgc3RvcENvdW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZGVzdHJveUNvdW50ICE9IGxpZmVjeWNsZUNvdW50cy5tRGVzdHJveUNvdW50KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2dUYWcgKyAiIGhhcyBiZWVuIGRlc3Ryb3llZCAiICsgbGlmZWN5Y2xlQ291bnRzLm1EZXN0cm95Q291bnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgdGltZShzKSwgZXhwZWN0aW5nICIgKyBkZXN0cm95Q291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uQ2hhbmdlQ291bnQgIT0gbGlmZWN5Y2xlQ291bnRzLm1Db25maWd1cmF0aW9uQ2hhbmdlZENvdW50KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2dUYWcgKyAiIGhhcyByZWNlaXZlZCBjb25maWcgY2hhbmdlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBsaWZlY3ljbGVDb3VudHMubUNvbmZpZ3VyYXRpb25DaGFuZ2VkQ291bnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgdGltZShzKSwgZXhwZWN0aW5nICIgKyBjb25maWd1cmF0aW9uQ2hhbmdlQ291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9LmFzc2VydFZhbGlkYXRvcigiKioqV2FpdGluZyBmb3IgYWN0aXZpdHkgbGlmZWN5Y2xlIGNvdW50cyIpOworICAgIH0KKworICAgIHZvaWQgYXNzZXJ0U2luZ2xlTGF1bmNoKENvbXBvbmVudE5hbWUgYWN0aXZpdHlOYW1lLCBMb2dTZXBhcmF0b3IgbG9nU2VwYXJhdG9yKSB7CisgICAgICAgIG5ldyBBY3Rpdml0eUxpZmVjeWNsZUNvdW50c1ZhbGlkYXRvcihhY3Rpdml0eU5hbWUsIGxvZ1NlcGFyYXRvciwgMSAvKiBjcmVhdGVDb3VudCAqLywKKyAgICAgICAgICAgICAgICAxIC8qIHN0YXJ0Q291bnQgKi8sIDEgLyogcmVzdW1lQ291bnQgKi8sIDAgLyogcGF1c2VDb3VudCAqLywgMCAvKiBzdG9wQ291bnQgKi8sCisgICAgICAgICAgICAgICAgMCAvKiBkZXN0cm95Q291bnQgKi8pCisgICAgICAgICAgICAgICAgLmFzc2VydFZhbGlkYXRvcigiKioqV2FpdGluZyBmb3IgYWN0aXZpdHkgY3JlYXRlLCBzdGFydCwgYW5kIHJlc3VtZSIpOworICAgIH0KKworICAgIHZvaWQgYXNzZXJ0U2luZ2xlTGF1bmNoQW5kU3RvcChDb21wb25lbnROYW1lIGFjdGl2aXR5TmFtZSwgTG9nU2VwYXJhdG9yIGxvZ1NlcGFyYXRvcikgeworICAgICAgICBuZXcgQWN0aXZpdHlMaWZlY3ljbGVDb3VudHNWYWxpZGF0b3IoYWN0aXZpdHlOYW1lLCBsb2dTZXBhcmF0b3IsIDEgLyogY3JlYXRlQ291bnQgKi8sCisgICAgICAgICAgICAgICAgMSAvKiBzdGFydENvdW50ICovLCAxIC8qIHJlc3VtZUNvdW50ICovLCAxIC8qIHBhdXNlQ291bnQgKi8sIDEgLyogc3RvcENvdW50ICovLAorICAgICAgICAgICAgICAgIDAgLyogZGVzdHJveUNvdW50ICovKQorICAgICAgICAgICAgICAgIC5hc3NlcnRWYWxpZGF0b3IoIioqKldhaXRpbmcgZm9yIGFjdGl2aXR5IGNyZWF0ZSwgc3RhcnQsIHJlc3VtZSwgcGF1c2UsIGFuZCBzdG9wIik7CisgICAgfQorCisgICAgdm9pZCBhc3NlcnRTaW5nbGVTdGFydEFuZFN0b3AoQ29tcG9uZW50TmFtZSBhY3Rpdml0eU5hbWUsIExvZ1NlcGFyYXRvciBsb2dTZXBhcmF0b3IpIHsKKyAgICAgICAgbmV3IEFjdGl2aXR5TGlmZWN5Y2xlQ291bnRzVmFsaWRhdG9yKGFjdGl2aXR5TmFtZSwgbG9nU2VwYXJhdG9yLCAwIC8qIGNyZWF0ZUNvdW50ICovLAorICAgICAgICAgICAgICAgIDEgLyogc3RhcnRDb3VudCAqLywgMSAvKiByZXN1bWVDb3VudCAqLywgMSAvKiBwYXVzZUNvdW50ICovLCAxIC8qIHN0b3BDb3VudCAqLywKKyAgICAgICAgICAgICAgICAwIC8qIGRlc3Ryb3lDb3VudCAqLykKKyAgICAgICAgICAgICAgICAuYXNzZXJ0VmFsaWRhdG9yKCIqKipXYWl0aW5nIGZvciBhY3Rpdml0eSBzdGFydCwgcmVzdW1lLCBwYXVzZSwgYW5kIHN0b3AiKTsKKyAgICB9CisKKyAgICB2b2lkIGFzc2VydFNpbmdsZVN0YXJ0KENvbXBvbmVudE5hbWUgYWN0aXZpdHlOYW1lLCBMb2dTZXBhcmF0b3IgbG9nU2VwYXJhdG9yKSB7CisgICAgICAgIG5ldyBBY3Rpdml0eUxpZmVjeWNsZUNvdW50c1ZhbGlkYXRvcihhY3Rpdml0eU5hbWUsIGxvZ1NlcGFyYXRvciwgMCAvKiBjcmVhdGVDb3VudCAqLywKKyAgICAgICAgICAgICAgICAxIC8qIHN0YXJ0Q291bnQgKi8sIDEgLyogcmVzdW1lQ291bnQgKi8sIDAgLyogcGF1c2VDb3VudCAqLywgMCAvKiBzdG9wQ291bnQgKi8sCisgICAgICAgICAgICAgICAgMCAvKiBkZXN0cm95Q291bnQgKi8pCisgICAgICAgICAgICAgICAgLmFzc2VydFZhbGlkYXRvcigiKioqV2FpdGluZyBmb3IgYWN0aXZpdHkgc3RhcnQgYW5kIHJlc3VtZSIpOworICAgIH0KKworICAgIC8vIFRPRE86IE5vdyB0aGF0IG91ciB0ZXN0IGFyZSBkZXZpY2Ugc2lkZSwgd2UgY2FuIGNvbnZlcnQgdGhlc2UgdG8gYSBtb3JlIGRpcmVjdCBjb21tdW5pY2F0aW9uCisgICAgLy8gY2hhbm5lbCB2cy4gZGVwZW5kaW5nIG9uIGxvZ3MuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBzQ3JlYXRlUGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiKC4rKTogb25DcmVhdGUiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHNTdGFydFBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoIiguKyk6IG9uU3RhcnQiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHNSZXN1bWVQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCIoLispOiBvblJlc3VtZSIpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gc1BhdXNlUGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiKC4rKTogb25QYXVzZSIpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gc0NvbmZpZ3VyYXRpb25DaGFuZ2VkUGF0dGVybiA9CisgICAgICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoIiguKyk6IG9uQ29uZmlndXJhdGlvbkNoYW5nZWQiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHNNb3ZlZFRvRGlzcGxheVBhdHRlcm4gPQorICAgICAgICAgICAgUGF0dGVybi5jb21waWxlKCIoLispOiBvbk1vdmVkVG9EaXNwbGF5Iik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBzU3RvcFBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoIiguKyk6IG9uU3RvcCIpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gc0Rlc3Ryb3lQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCIoLispOiBvbkRlc3Ryb3kiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHNNdWx0aVdpbmRvd01vZGVDaGFuZ2VkUGF0dGVybiA9CisgICAgICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoIiguKyk6IG9uTXVsdGlXaW5kb3dNb2RlQ2hhbmdlZCIpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gc1BpY3R1cmVJblBpY3R1cmVNb2RlQ2hhbmdlZFBhdHRlcm4gPQorICAgICAgICAgICAgUGF0dGVybi5jb21waWxlKCIoLispOiBvblBpY3R1cmVJblBpY3R1cmVNb2RlQ2hhbmdlZCIpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gc1VzZXJMZWF2ZUhpbnRQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCIoLispOiBvblVzZXJMZWF2ZUhpbnQiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHNOZXdDb25maWdQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKAorICAgICAgICAgICAgIiguKyk6IGNvbmZpZyBzaXplPVxcKChcXGQrKSwoXFxkKylcXCkgZGlzcGxheVNpemU9XFwoKFxcZCspLChcXGQrKVxcKSIKKyAgICAgICAgICAgICsgIiBtZXRyaWNzU2l6ZT1cXCgoXFxkKyksKFxcZCspXFwpIHNtYWxsZXN0U2NyZWVuV2lkdGg9KFxcZCspIGRlbnNpdHlEcGk9KFxcZCspIgorICAgICAgICAgICAgKyAiIG9yaWVudGF0aW9uPShcXGQrKSIpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gc0Rpc3BsYXlDdXRvdXRQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKAorICAgICAgICAgICAgIiguKyk6IGN1dG91dD0odHJ1ZXxmYWxzZSkiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHNEaXNwbGF5U3RhdGVQYXR0ZXJuID0KKyAgICAgICAgICAgIFBhdHRlcm4uY29tcGlsZSgiRGlzcGxheSBQb3dlcjogc3RhdGU9KC4rKSIpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gc0N1cnJlbnRVaU1vZGVQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCJtQ3VyVWlNb2RlPTB4KFxcZCspIik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBzVWlNb2RlTG9ja2VkUGF0dGVybiA9CisgICAgICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoIm1VaU1vZGVMb2NrZWQ9KHRydWV8ZmFsc2UpIik7CisKKyAgICBzdGF0aWMgY2xhc3MgUmVwb3J0ZWRTaXplcyB7CisgICAgICAgIGludCB3aWR0aERwOworICAgICAgICBpbnQgaGVpZ2h0RHA7CisgICAgICAgIGludCBkaXNwbGF5V2lkdGg7CisgICAgICAgIGludCBkaXNwbGF5SGVpZ2h0OworICAgICAgICBpbnQgbWV0cmljc1dpZHRoOworICAgICAgICBpbnQgbWV0cmljc0hlaWdodDsKKyAgICAgICAgaW50IHNtYWxsZXN0V2lkdGhEcDsKKyAgICAgICAgaW50IGRlbnNpdHlEcGk7CisgICAgICAgIGludCBvcmllbnRhdGlvbjsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiUmVwb3J0ZWRTaXplczoge3dpZHRoRHA9IiArIHdpZHRoRHAgKyAiIGhlaWdodERwPSIgKyBoZWlnaHREcAorICAgICAgICAgICAgICAgICAgICArICIgZGlzcGxheVdpZHRoPSIgKyBkaXNwbGF5V2lkdGggKyAiIGRpc3BsYXlIZWlnaHQ9IiArIGRpc3BsYXlIZWlnaHQKKyAgICAgICAgICAgICAgICAgICAgKyAiIG1ldHJpY3NXaWR0aD0iICsgbWV0cmljc1dpZHRoICsgIiBtZXRyaWNzSGVpZ2h0PSIgKyBtZXRyaWNzSGVpZ2h0CisgICAgICAgICAgICAgICAgICAgICsgIiBzbWFsbGVzdFdpZHRoRHA9IiArIHNtYWxsZXN0V2lkdGhEcCArICIgZGVuc2l0eURwaT0iICsgZGVuc2l0eURwaQorICAgICAgICAgICAgICAgICAgICArICIgb3JpZW50YXRpb249IiArIG9yaWVudGF0aW9uICsgIn0iOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgICAgICBpZiAoIHRoaXMgPT0gb2JqICkgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBpZiAoICEob2JqIGluc3RhbmNlb2YgUmVwb3J0ZWRTaXplcykgKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBSZXBvcnRlZFNpemVzIHRoYXQgPSAoUmVwb3J0ZWRTaXplcykgb2JqOworICAgICAgICAgICAgcmV0dXJuIHdpZHRoRHAgPT0gdGhhdC53aWR0aERwCisgICAgICAgICAgICAgICAgICAgICYmIGhlaWdodERwID09IHRoYXQuaGVpZ2h0RHAKKyAgICAgICAgICAgICAgICAgICAgJiYgZGlzcGxheVdpZHRoID09IHRoYXQuZGlzcGxheVdpZHRoCisgICAgICAgICAgICAgICAgICAgICYmIGRpc3BsYXlIZWlnaHQgPT0gdGhhdC5kaXNwbGF5SGVpZ2h0CisgICAgICAgICAgICAgICAgICAgICYmIG1ldHJpY3NXaWR0aCA9PSB0aGF0Lm1ldHJpY3NXaWR0aAorICAgICAgICAgICAgICAgICAgICAmJiBtZXRyaWNzSGVpZ2h0ID09IHRoYXQubWV0cmljc0hlaWdodAorICAgICAgICAgICAgICAgICAgICAmJiBzbWFsbGVzdFdpZHRoRHAgPT0gdGhhdC5zbWFsbGVzdFdpZHRoRHAKKyAgICAgICAgICAgICAgICAgICAgJiYgZGVuc2l0eURwaSA9PSB0aGF0LmRlbnNpdHlEcGkKKyAgICAgICAgICAgICAgICAgICAgJiYgb3JpZW50YXRpb24gPT0gdGhhdC5vcmllbnRhdGlvbjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBOdWxsYWJsZQorICAgIFJlcG9ydGVkU2l6ZXMgZ2V0TGFzdFJlcG9ydGVkU2l6ZXNGb3JBY3Rpdml0eSgKKyAgICAgICAgICAgIENvbXBvbmVudE5hbWUgYWN0aXZpdHlOYW1lLCBMb2dTZXBhcmF0b3IgbG9nU2VwYXJhdG9yKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBsb2dUYWcgPSBnZXRMb2dUYWcoYWN0aXZpdHlOYW1lKTsKKyAgICAgICAgZm9yIChpbnQgcmV0cnkgPSAxOyByZXRyeSA8PSA1OyByZXRyeSsrICkgeworICAgICAgICAgICAgZmluYWwgUmVwb3J0ZWRTaXplcyByZXN1bHQgPSByZWFkTGFzdFJlcG9ydGVkU2l6ZXMobG9nU2VwYXJhdG9yLCBsb2dUYWcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvZ0Fsd2F5cygiKioqV2FpdGluZyBmb3Igc2l6ZXMgdG8gYmUgcmVwb3J0ZWQuLi4gcmV0cnk9IiArIHJldHJ5KTsKKyAgICAgICAgICAgIFN5c3RlbUNsb2NrLnNsZWVwKDEwMDApOworICAgICAgICB9CisgICAgICAgIGxvZ0UoIioqKldhaXRpbmcgZm9yIGFjdGl2aXR5IHNpemUgZmFpbGVkOiBhY3Rpdml0eU5hbWU9IiArIGxvZ1RhZyk7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgUmVwb3J0ZWRTaXplcyByZWFkTGFzdFJlcG9ydGVkU2l6ZXMoTG9nU2VwYXJhdG9yIGxvZ1NlcGFyYXRvciwgU3RyaW5nIGxvZ1RhZykgeworICAgICAgICBmaW5hbCBTdHJpbmdbXSBsaW5lcyA9IGdldERldmljZUxvZ3NGb3JDb21wb25lbnRzKGxvZ1NlcGFyYXRvciwgbG9nVGFnKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IGxpbmVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbGluZSA9IGxpbmVzW2ldLnRyaW0oKTsKKyAgICAgICAgICAgIGZpbmFsIE1hdGNoZXIgbWF0Y2hlciA9IHNOZXdDb25maWdQYXR0ZXJuLm1hdGNoZXIobGluZSk7CisgICAgICAgICAgICBpZiAobWF0Y2hlci5tYXRjaGVzKCkpIHsKKyAgICAgICAgICAgICAgICBSZXBvcnRlZFNpemVzIGRldGFpbHMgPSBuZXcgUmVwb3J0ZWRTaXplcygpOworICAgICAgICAgICAgICAgIGRldGFpbHMud2lkdGhEcCA9IEludGVnZXIucGFyc2VJbnQobWF0Y2hlci5ncm91cCgyKSk7CisgICAgICAgICAgICAgICAgZGV0YWlscy5oZWlnaHREcCA9IEludGVnZXIucGFyc2VJbnQobWF0Y2hlci5ncm91cCgzKSk7CisgICAgICAgICAgICAgICAgZGV0YWlscy5kaXNwbGF5V2lkdGggPSBJbnRlZ2VyLnBhcnNlSW50KG1hdGNoZXIuZ3JvdXAoNCkpOworICAgICAgICAgICAgICAgIGRldGFpbHMuZGlzcGxheUhlaWdodCA9IEludGVnZXIucGFyc2VJbnQobWF0Y2hlci5ncm91cCg1KSk7CisgICAgICAgICAgICAgICAgZGV0YWlscy5tZXRyaWNzV2lkdGggPSBJbnRlZ2VyLnBhcnNlSW50KG1hdGNoZXIuZ3JvdXAoNikpOworICAgICAgICAgICAgICAgIGRldGFpbHMubWV0cmljc0hlaWdodCA9IEludGVnZXIucGFyc2VJbnQobWF0Y2hlci5ncm91cCg3KSk7CisgICAgICAgICAgICAgICAgZGV0YWlscy5zbWFsbGVzdFdpZHRoRHAgPSBJbnRlZ2VyLnBhcnNlSW50KG1hdGNoZXIuZ3JvdXAoOCkpOworICAgICAgICAgICAgICAgIGRldGFpbHMuZGVuc2l0eURwaSA9IEludGVnZXIucGFyc2VJbnQobWF0Y2hlci5ncm91cCg5KSk7CisgICAgICAgICAgICAgICAgZGV0YWlscy5vcmllbnRhdGlvbiA9IEludGVnZXIucGFyc2VJbnQobWF0Y2hlci5ncm91cCgxMCkpOworICAgICAgICAgICAgICAgIHJldHVybiBkZXRhaWxzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKiBDaGVjayBpZiBhIGRldmljZSBoYXMgZGlzcGxheSBjdXRvdXQuICovCisgICAgYm9vbGVhbiBoYXNEaXNwbGF5Q3V0b3V0KCkgeworICAgICAgICAvLyBMYXVuY2ggYW4gYWN0aXZpdHkgdG8gcmVwb3J0IGN1dG91dCBzdGF0ZQorICAgICAgICBmaW5hbCBMb2dTZXBhcmF0b3IgbG9nU2VwYXJhdG9yID0gc2VwYXJhdGVMb2dzKCk7CisgICAgICAgIGxhdW5jaEFjdGl2aXR5KEJST0FEQ0FTVF9SRUNFSVZFUl9BQ1RJVklUWSk7CisKKyAgICAgICAgLy8gUmVhZCB0aGUgbG9ncyB0byBjaGVjayBpZiBjdXRvdXQgaXMgcHJlc2VudAorICAgICAgICBmaW5hbCBCb29sZWFuIGRpc3BsYXlDdXRvdXRQcmVzZW50ID0KKyAgICAgICAgICAgICAgICBnZXRDdXRvdXRTdGF0ZUZvckFjdGl2aXR5KEJST0FEQ0FTVF9SRUNFSVZFUl9BQ1RJVklUWSwgbG9nU2VwYXJhdG9yKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiVGhlIGFjdGl2aXR5IHNob3VsZCByZXBvcnQgY3V0b3V0IHN0YXRlIiwgZGlzcGxheUN1dG91dFByZXNlbnQpOworCisgICAgICAgIC8vIEZpbmlzaCBhY3Rpdml0eQorICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKEZJTklTSF9BQ1RJVklUWV9CUk9BRENBU1QpOworICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JXaXRoQW1TdGF0ZSgKKyAgICAgICAgICAgICAgICAoc3RhdGUpIC0+ICFzdGF0ZS5jb250YWluc0FjdGl2aXR5KEJST0FEQ0FTVF9SRUNFSVZFUl9BQ1RJVklUWSksCisgICAgICAgICAgICAgICAgIldhaXRpbmcgZm9yIGFjdGl2aXR5IHRvIGJlIHJlbW92ZWQiKTsKKworICAgICAgICByZXR1cm4gZGlzcGxheUN1dG91dFByZXNlbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2FpdCBmb3IgYWN0aXZpdHkgdG8gcmVwb3J0IGN1dG91dCBzdGF0ZSBpbiBsb2dzIGFuZCByZXR1cm4gaXQuIFdpbGwgcmV0dXJuIHtAY29kZSBudWxsfQorICAgICAqIGFmdGVyIHRpbWVvdXQuCisgICAgICovCisgICAgQE51bGxhYmxlCisgICAgcHJpdmF0ZSBCb29sZWFuIGdldEN1dG91dFN0YXRlRm9yQWN0aXZpdHkoQ29tcG9uZW50TmFtZSBhY3Rpdml0eU5hbWUsCisgICAgICAgICAgICBMb2dTZXBhcmF0b3IgbG9nU2VwYXJhdG9yKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBsb2dUYWcgPSBnZXRMb2dUYWcoYWN0aXZpdHlOYW1lKTsKKyAgICAgICAgZm9yIChpbnQgcmV0cnkgPSAxOyByZXRyeSA8PSA1OyByZXRyeSsrICkgeworICAgICAgICAgICAgZmluYWwgQm9vbGVhbiByZXN1bHQgPSByZWFkTGFzdFJlcG9ydGVkQ3V0b3V0U3RhdGUobG9nU2VwYXJhdG9yLCBsb2dUYWcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvZ0Fsd2F5cygiKioqV2FpdGluZyBmb3IgY3V0b3V0IHN0YXRlIHRvIGJlIHJlcG9ydGVkLi4uIHJldHJ5PSIgKyByZXRyeSk7CisgICAgICAgICAgICBTeXN0ZW1DbG9jay5zbGVlcCgxMDAwKTsKKyAgICAgICAgfQorICAgICAgICBsb2dFKCIqKipXYWl0aW5nIGZvciBhY3Rpdml0eSBjdXRvdXQgc3RhdGUgZmFpbGVkOiBhY3Rpdml0eU5hbWU9IiArIGxvZ1RhZyk7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKiBSZWFkIGRpc3BsYXkgY3V0b3V0IHN0YXRlIGZyb20gZGV2aWNlIGxvZ3MuICovCisgICAgcHJpdmF0ZSBCb29sZWFuIHJlYWRMYXN0UmVwb3J0ZWRDdXRvdXRTdGF0ZShMb2dTZXBhcmF0b3IgbG9nU2VwYXJhdG9yLCBTdHJpbmcgbG9nVGFnKSB7CisgICAgICAgIGZpbmFsIFN0cmluZ1tdIGxpbmVzID0gZ2V0RGV2aWNlTG9nc0ZvckNvbXBvbmVudHMobG9nU2VwYXJhdG9yLCBsb2dUYWcpOworICAgICAgICBmb3IgKGludCBpID0gbGluZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsaW5lID0gbGluZXNbaV0udHJpbSgpOworICAgICAgICAgICAgZmluYWwgTWF0Y2hlciBtYXRjaGVyID0gc0Rpc3BsYXlDdXRvdXRQYXR0ZXJuLm1hdGNoZXIobGluZSk7CisgICAgICAgICAgICBpZiAobWF0Y2hlci5tYXRjaGVzKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gInRydWUiLmVxdWFscyhtYXRjaGVyLmdyb3VwKDIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKiogV2FpdHMgZm9yIGF0IGxlYXN0IG9uZSBvbk11bHRpV2luZG93TW9kZUNoYW5nZWQgZXZlbnQuICovCisgICAgQWN0aXZpdHlMaWZlY3ljbGVDb3VudHMgd2FpdEZvck9uTXVsdGlXaW5kb3dNb2RlQ2hhbmdlZChDb21wb25lbnROYW1lIGFjdGl2aXR5TmFtZSwKKyAgICAgICAgICAgIExvZ1NlcGFyYXRvciBsb2dTZXBhcmF0b3IpIHsKKyAgICAgICAgaW50IHJldHJ5ID0gMTsKKyAgICAgICAgQWN0aXZpdHlMaWZlY3ljbGVDb3VudHMgcmVzdWx0OworICAgICAgICBkbyB7CisgICAgICAgICAgICByZXN1bHQgPSBuZXcgQWN0aXZpdHlMaWZlY3ljbGVDb3VudHMoYWN0aXZpdHlOYW1lLCBsb2dTZXBhcmF0b3IpOworICAgICAgICAgICAgaWYgKHJlc3VsdC5tTXVsdGlXaW5kb3dNb2RlQ2hhbmdlZENvdW50ID49IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9nQWx3YXlzKCIqKip3YWl0Rm9yT25NdWx0aVdpbmRvd01vZGVDaGFuZ2VkLi4uIHJldHJ5PSIgKyByZXRyeSk7CisgICAgICAgICAgICBTeXN0ZW1DbG9jay5zbGVlcChUaW1lVW5pdC5TRUNPTkRTLnRvTWlsbGlzKDEpKTsKKyAgICAgICAgfSB3aGlsZSAocmV0cnkrKyA8PSA1KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvLyBUT0RPOiBOb3cgdGhhdCBvdXIgdGVzdCBhcmUgZGV2aWNlIHNpZGUsIHdlIGNhbiBjb252ZXJ0IHRoZXNlIHRvIGEgbW9yZSBkaXJlY3QgY29tbXVuaWNhdGlvbgorICAgIC8vIGNoYW5uZWwgdnMuIGRlcGVuZGluZyBvbiBsb2dzLgorICAgIHN0YXRpYyBjbGFzcyBBY3Rpdml0eUxpZmVjeWNsZUNvdW50cyB7CisgICAgICAgIGludCBtQ3JlYXRlQ291bnQ7CisgICAgICAgIGludCBtU3RhcnRDb3VudDsKKyAgICAgICAgaW50IG1SZXN1bWVDb3VudDsKKyAgICAgICAgaW50IG1Db25maWd1cmF0aW9uQ2hhbmdlZENvdW50OworICAgICAgICBpbnQgbUxhc3RDb25maWd1cmF0aW9uQ2hhbmdlZExpbmVJbmRleDsKKyAgICAgICAgaW50IG1Nb3ZlZFRvRGlzcGxheUNvdW50OworICAgICAgICBpbnQgbU11bHRpV2luZG93TW9kZUNoYW5nZWRDb3VudDsKKyAgICAgICAgaW50IG1MYXN0TXVsdGlXaW5kb3dNb2RlQ2hhbmdlZExpbmVJbmRleDsKKyAgICAgICAgaW50IG1QaWN0dXJlSW5QaWN0dXJlTW9kZUNoYW5nZWRDb3VudDsKKyAgICAgICAgaW50IG1MYXN0UGljdHVyZUluUGljdHVyZU1vZGVDaGFuZ2VkTGluZUluZGV4OworICAgICAgICBpbnQgbVVzZXJMZWF2ZUhpbnRDb3VudDsKKyAgICAgICAgaW50IG1QYXVzZUNvdW50OworICAgICAgICBpbnQgbVN0b3BDb3VudDsKKyAgICAgICAgaW50IG1MYXN0U3RvcExpbmVJbmRleDsKKyAgICAgICAgaW50IG1EZXN0cm95Q291bnQ7CisKKyAgICAgICAgQWN0aXZpdHlMaWZlY3ljbGVDb3VudHMoQ29tcG9uZW50TmFtZSBjb21wb25lbnROYW1lLCBMb2dTZXBhcmF0b3IgbG9nU2VwYXJhdG9yKSB7CisgICAgICAgICAgICBpbnQgbGluZUluZGV4ID0gMDsKKyAgICAgICAgICAgIHdhaXRGb3JJZGxlKCk7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBsaW5lIDogZ2V0RGV2aWNlTG9nc0ZvckNvbXBvbmVudHMobG9nU2VwYXJhdG9yLCBnZXRMb2dUYWcoY29tcG9uZW50TmFtZSkpKSB7CisgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUudHJpbSgpOworICAgICAgICAgICAgICAgIGxpbmVJbmRleCsrOworCisgICAgICAgICAgICAgICAgTWF0Y2hlciBtYXRjaGVyID0gc0NyZWF0ZVBhdHRlcm4ubWF0Y2hlcihsaW5lKTsKKyAgICAgICAgICAgICAgICBpZiAobWF0Y2hlci5tYXRjaGVzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNyZWF0ZUNvdW50Kys7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1hdGNoZXIgPSBzU3RhcnRQYXR0ZXJuLm1hdGNoZXIobGluZSk7CisgICAgICAgICAgICAgICAgaWYgKG1hdGNoZXIubWF0Y2hlcygpKSB7CisgICAgICAgICAgICAgICAgICAgIG1TdGFydENvdW50Kys7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1hdGNoZXIgPSBzUmVzdW1lUGF0dGVybi5tYXRjaGVyKGxpbmUpOworICAgICAgICAgICAgICAgIGlmIChtYXRjaGVyLm1hdGNoZXMoKSkgeworICAgICAgICAgICAgICAgICAgICBtUmVzdW1lQ291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbWF0Y2hlciA9IHNDb25maWd1cmF0aW9uQ2hhbmdlZFBhdHRlcm4ubWF0Y2hlcihsaW5lKTsKKyAgICAgICAgICAgICAgICBpZiAobWF0Y2hlci5tYXRjaGVzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNvbmZpZ3VyYXRpb25DaGFuZ2VkQ291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgbUxhc3RDb25maWd1cmF0aW9uQ2hhbmdlZExpbmVJbmRleCA9IGxpbmVJbmRleDsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbWF0Y2hlciA9IHNNb3ZlZFRvRGlzcGxheVBhdHRlcm4ubWF0Y2hlcihsaW5lKTsKKyAgICAgICAgICAgICAgICBpZiAobWF0Y2hlci5tYXRjaGVzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbU1vdmVkVG9EaXNwbGF5Q291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbWF0Y2hlciA9IHNNdWx0aVdpbmRvd01vZGVDaGFuZ2VkUGF0dGVybi5tYXRjaGVyKGxpbmUpOworICAgICAgICAgICAgICAgIGlmIChtYXRjaGVyLm1hdGNoZXMoKSkgeworICAgICAgICAgICAgICAgICAgICBtTXVsdGlXaW5kb3dNb2RlQ2hhbmdlZENvdW50Kys7CisgICAgICAgICAgICAgICAgICAgIG1MYXN0TXVsdGlXaW5kb3dNb2RlQ2hhbmdlZExpbmVJbmRleCA9IGxpbmVJbmRleDsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbWF0Y2hlciA9IHNQaWN0dXJlSW5QaWN0dXJlTW9kZUNoYW5nZWRQYXR0ZXJuLm1hdGNoZXIobGluZSk7CisgICAgICAgICAgICAgICAgaWYgKG1hdGNoZXIubWF0Y2hlcygpKSB7CisgICAgICAgICAgICAgICAgICAgIG1QaWN0dXJlSW5QaWN0dXJlTW9kZUNoYW5nZWRDb3VudCsrOworICAgICAgICAgICAgICAgICAgICBtTGFzdFBpY3R1cmVJblBpY3R1cmVNb2RlQ2hhbmdlZExpbmVJbmRleCA9IGxpbmVJbmRleDsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbWF0Y2hlciA9IHNVc2VyTGVhdmVIaW50UGF0dGVybi5tYXRjaGVyKGxpbmUpOworICAgICAgICAgICAgICAgIGlmIChtYXRjaGVyLm1hdGNoZXMoKSkgeworICAgICAgICAgICAgICAgICAgICBtVXNlckxlYXZlSGludENvdW50Kys7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1hdGNoZXIgPSBzUGF1c2VQYXR0ZXJuLm1hdGNoZXIobGluZSk7CisgICAgICAgICAgICAgICAgaWYgKG1hdGNoZXIubWF0Y2hlcygpKSB7CisgICAgICAgICAgICAgICAgICAgIG1QYXVzZUNvdW50Kys7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1hdGNoZXIgPSBzU3RvcFBhdHRlcm4ubWF0Y2hlcihsaW5lKTsKKyAgICAgICAgICAgICAgICBpZiAobWF0Y2hlci5tYXRjaGVzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbVN0b3BDb3VudCsrOworICAgICAgICAgICAgICAgICAgICBtTGFzdFN0b3BMaW5lSW5kZXggPSBsaW5lSW5kZXg7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1hdGNoZXIgPSBzRGVzdHJveVBhdHRlcm4ubWF0Y2hlcihsaW5lKTsKKyAgICAgICAgICAgICAgICBpZiAobWF0Y2hlci5tYXRjaGVzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbURlc3Ryb3lDb3VudCsrOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgY291bnRlcnMoKSB7CisgICAgICAgICAgICByZXR1cm4gSW50U3RyZWFtLm9mKG1DcmVhdGVDb3VudCwgbVN0YXJ0Q291bnQsIG1SZXN1bWVDb3VudCwgbVBhdXNlQ291bnQsIG1TdG9wQ291bnQsCisgICAgICAgICAgICAgICAgICAgIG1EZXN0cm95Q291bnQpCisgICAgICAgICAgICAgICAgICAgIC5tYXBUb09iaihJbnRlZ2VyOjp0b1N0cmluZykKKyAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy5qb2luaW5nKCIvIikpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc3RvcFRlc3RQYWNrYWdlKGZpbmFsIENvbXBvbmVudE5hbWUgYWN0aXZpdHlOYW1lKSB7CisgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoImFtIGZvcmNlLXN0b3AgIiArIGFjdGl2aXR5TmFtZS5nZXRQYWNrYWdlTmFtZSgpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgTGF1bmNoQWN0aXZpdHlCdWlsZGVyIGdldExhdW5jaEFjdGl2aXR5QnVpbGRlcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBMYXVuY2hBY3Rpdml0eUJ1aWxkZXIobUFtV21TdGF0ZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBMYXVuY2hBY3Rpdml0eUJ1aWxkZXIgeworICAgICAgICBwcml2YXRlIGZpbmFsIEFjdGl2aXR5QW5kV2luZG93TWFuYWdlcnNTdGF0ZSBtQW1XbVN0YXRlOworCisgICAgICAgIC8vIFRoZSBhY3Rpdml0eSB0byBiZSBsYXVuY2hlZAorICAgICAgICBwcml2YXRlIENvbXBvbmVudE5hbWUgbVRhcmdldEFjdGl2aXR5ID0gVEVTVF9BQ1RJVklUWTsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1Vc2VBcHBsaWNhdGlvbkNvbnRleHQ7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtVG9TaWRlOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbVJhbmRvbURhdGE7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtTmV3VGFzazsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1NdWx0aXBsZVRhc2s7CisgICAgICAgIHByaXZhdGUgaW50IG1EaXNwbGF5SWQgPSBJTlZBTElEX0RJU1BMQVk7CisgICAgICAgIC8vIEEgcHJveHkgYWN0aXZpdHkgdGhhdCBsYXVuY2hlcyBvdGhlciBhY3Rpdml0aWVzIGluY2x1ZGluZyBtVGFyZ2V0QWN0aXZpdHlOYW1lCisgICAgICAgIHByaXZhdGUgQ29tcG9uZW50TmFtZSBtTGF1bmNoaW5nQWN0aXZpdHkgPSBMQVVOQ0hJTkdfQUNUSVZJVFk7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtUmVvcmRlclRvRnJvbnQ7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtV2FpdEZvckxhdW5jaGVkOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbVN1cHByZXNzRXhjZXB0aW9uczsKKyAgICAgICAgLy8gVXNlIG9mIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGluZGljYXRlcyB0aGF0IGEgYnJvYWRjYXN0IHJlY2VpdmVyIHNob3VsZCBiZSB1c2VkIGluc3RlYWQKKyAgICAgICAgLy8gb2YgYSBsYXVuY2hpbmcgYWN0aXZpdHk7CisgICAgICAgIHByaXZhdGUgQ29tcG9uZW50TmFtZSBtQnJvYWRjYXN0UmVjZWl2ZXI7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1Ccm9hZGNhc3RSZWNlaXZlckFjdGlvbjsKKworICAgICAgICBwcml2YXRlIGVudW0gTGF1bmNoZXJUeXBlIHsKKyAgICAgICAgICAgIElOU1RSVU1FTlRBVElPTiwgTEFVTkNISU5HX0FDVElWSVRZLCBCUk9BRENBU1RfUkVDRUlWRVIKKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIExhdW5jaGVyVHlwZSBtTGF1bmNoZXJUeXBlID0gTGF1bmNoZXJUeXBlLkxBVU5DSElOR19BQ1RJVklUWTsKKworICAgICAgICBwdWJsaWMgTGF1bmNoQWN0aXZpdHlCdWlsZGVyKEFjdGl2aXR5QW5kV2luZG93TWFuYWdlcnNTdGF0ZSBhbVdtU3RhdGUpIHsKKyAgICAgICAgICAgIG1BbVdtU3RhdGUgPSBhbVdtU3RhdGU7CisgICAgICAgICAgICBtV2FpdEZvckxhdW5jaGVkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBMYXVuY2hBY3Rpdml0eUJ1aWxkZXIgc2V0VG9TaWRlKGJvb2xlYW4gdG9TaWRlKSB7CisgICAgICAgICAgICBtVG9TaWRlID0gdG9TaWRlOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTGF1bmNoQWN0aXZpdHlCdWlsZGVyIHNldFJhbmRvbURhdGEoYm9vbGVhbiByYW5kb21EYXRhKSB7CisgICAgICAgICAgICBtUmFuZG9tRGF0YSA9IHJhbmRvbURhdGE7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBMYXVuY2hBY3Rpdml0eUJ1aWxkZXIgc2V0TmV3VGFzayhib29sZWFuIG5ld1Rhc2spIHsKKyAgICAgICAgICAgIG1OZXdUYXNrID0gbmV3VGFzazsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIExhdW5jaEFjdGl2aXR5QnVpbGRlciBzZXRNdWx0aXBsZVRhc2soYm9vbGVhbiBtdWx0aXBsZVRhc2spIHsKKyAgICAgICAgICAgIG1NdWx0aXBsZVRhc2sgPSBtdWx0aXBsZVRhc2s7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBMYXVuY2hBY3Rpdml0eUJ1aWxkZXIgc2V0UmVvcmRlclRvRnJvbnQoYm9vbGVhbiByZW9yZGVyVG9Gcm9udCkgeworICAgICAgICAgICAgbVJlb3JkZXJUb0Zyb250ID0gcmVvcmRlclRvRnJvbnQ7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBMYXVuY2hBY3Rpdml0eUJ1aWxkZXIgc2V0VXNlQXBwbGljYXRpb25Db250ZXh0KGJvb2xlYW4gdXNlQXBwbGljYXRpb25Db250ZXh0KSB7CisgICAgICAgICAgICBtVXNlQXBwbGljYXRpb25Db250ZXh0ID0gdXNlQXBwbGljYXRpb25Db250ZXh0OworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ29tcG9uZW50TmFtZSBnZXRUYXJnZXRBY3Rpdml0eSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtVGFyZ2V0QWN0aXZpdHk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1RhcmdldEFjdGl2aXR5VHJhbnNsdWNlbnQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUFtV21TdGF0ZS5nZXRBbVN0YXRlKCkuaXNBY3Rpdml0eVRyYW5zbHVjZW50KG1UYXJnZXRBY3Rpdml0eSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTGF1bmNoQWN0aXZpdHlCdWlsZGVyIHNldFRhcmdldEFjdGl2aXR5KENvbXBvbmVudE5hbWUgdGFyZ2V0QWN0aXZpdHkpIHsKKyAgICAgICAgICAgIG1UYXJnZXRBY3Rpdml0eSA9IHRhcmdldEFjdGl2aXR5OworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTGF1bmNoQWN0aXZpdHlCdWlsZGVyIHNldERpc3BsYXlJZChpbnQgaWQpIHsKKyAgICAgICAgICAgIG1EaXNwbGF5SWQgPSBpZDsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIExhdW5jaEFjdGl2aXR5QnVpbGRlciBzZXRMYXVuY2hpbmdBY3Rpdml0eShDb21wb25lbnROYW1lIGxhdW5jaGluZ0FjdGl2aXR5KSB7CisgICAgICAgICAgICBtTGF1bmNoaW5nQWN0aXZpdHkgPSBsYXVuY2hpbmdBY3Rpdml0eTsKKyAgICAgICAgICAgIG1MYXVuY2hlclR5cGUgPSBMYXVuY2hlclR5cGUuTEFVTkNISU5HX0FDVElWSVRZOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTGF1bmNoQWN0aXZpdHlCdWlsZGVyIHNldFdhaXRGb3JMYXVuY2hlZChib29sZWFuIHNob3VsZFdhaXQpIHsKKyAgICAgICAgICAgIG1XYWl0Rm9yTGF1bmNoZWQgPSBzaG91bGRXYWl0OworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKiogVXNlIGJyb2FkY2FzdCByZWNlaXZlciBhcyBhIGxhdW5jaHBhZCBmb3IgYWN0aXZpdGllcy4gKi8KKyAgICAgICAgcHVibGljIExhdW5jaEFjdGl2aXR5QnVpbGRlciBzZXRVc2VCcm9hZGNhc3RSZWNlaXZlcihmaW5hbCBDb21wb25lbnROYW1lIGJyb2FkY2FzdFJlY2VpdmVyLAorICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBicm9hZGNhc3RBY3Rpb24pIHsKKyAgICAgICAgICAgIG1Ccm9hZGNhc3RSZWNlaXZlciA9IGJyb2FkY2FzdFJlY2VpdmVyOworICAgICAgICAgICAgbUJyb2FkY2FzdFJlY2VpdmVyQWN0aW9uID0gYnJvYWRjYXN0QWN0aW9uOworICAgICAgICAgICAgbUxhdW5jaGVyVHlwZSA9IExhdW5jaGVyVHlwZS5CUk9BRENBU1RfUkVDRUlWRVI7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBVc2Uge0BsaW5rIGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbn0gYXMgYSBsYXVuY2hwYWQgZm9yIGFjdGl2aXRpZXMuICovCisgICAgICAgIHB1YmxpYyBMYXVuY2hBY3Rpdml0eUJ1aWxkZXIgc2V0VXNlSW5zdHJ1bWVudGF0aW9uKCkgeworICAgICAgICAgICAgbUxhdW5jaGVyVHlwZSA9IExhdW5jaGVyVHlwZS5JTlNUUlVNRU5UQVRJT047CisgICAgICAgICAgICAvLyBDYWxsaW5nIHN0YXJ0QWN0aXZpdHkoKSBmcm9tIG91dHNpZGUgb2YgYW4gQWN0aXZpdHkgY29udGV4dCByZXF1aXJlcyB0aGUKKyAgICAgICAgICAgIC8vIEZMQUdfQUNUSVZJVFlfTkVXX1RBU0sgZmxhZy4KKyAgICAgICAgICAgIHNldE5ld1Rhc2sodHJ1ZSk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBMYXVuY2hBY3Rpdml0eUJ1aWxkZXIgc2V0U3VwcHJlc3NFeGNlcHRpb25zKGJvb2xlYW4gc3VwcHJlc3MpIHsKKyAgICAgICAgICAgIG1TdXBwcmVzc0V4Y2VwdGlvbnMgPSBzdXBwcmVzczsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKKyAgICAgICAgICAgIHN3aXRjaCAobUxhdW5jaGVyVHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgSU5TVFJVTUVOVEFUSU9OOgorICAgICAgICAgICAgICAgICAgICBsYXVuY2hVc2luZ0luc3RydW1lbnRhdGlvbigpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIExBVU5DSElOR19BQ1RJVklUWToKKyAgICAgICAgICAgICAgICBjYXNlIEJST0FEQ0FTVF9SRUNFSVZFUjoKKyAgICAgICAgICAgICAgICAgICAgbGF1bmNoVXNpbmdTaGVsbENvbW1hbmQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1XYWl0Rm9yTGF1bmNoZWQpIHsKKyAgICAgICAgICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JWYWxpZFN0YXRlKG1UYXJnZXRBY3Rpdml0eSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiogTGF1bmNoIGFuIGFjdGl2aXR5IHVzaW5nIGluc3RydW1lbnRhdGlvbi4gKi8KKyAgICAgICAgcHJpdmF0ZSB2b2lkIGxhdW5jaFVzaW5nSW5zdHJ1bWVudGF0aW9uKCkgeworICAgICAgICAgICAgZmluYWwgQnVuZGxlIGIgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgICAgICBiLnB1dEJvb2xlYW4oS0VZX1VTRV9JTlNUUlVNRU5UQVRJT04sIHRydWUpOworICAgICAgICAgICAgYi5wdXRCb29sZWFuKEtFWV9MQVVOQ0hfQUNUSVZJVFksIHRydWUpOworICAgICAgICAgICAgYi5wdXRCb29sZWFuKEtFWV9MQVVOQ0hfVE9fU0lERSwgbVRvU2lkZSk7CisgICAgICAgICAgICBiLnB1dEJvb2xlYW4oS0VZX1JBTkRPTV9EQVRBLCBtUmFuZG9tRGF0YSk7CisgICAgICAgICAgICBiLnB1dEJvb2xlYW4oS0VZX05FV19UQVNLLCBtTmV3VGFzayk7CisgICAgICAgICAgICBiLnB1dEJvb2xlYW4oS0VZX01VTFRJUExFX1RBU0ssIG1NdWx0aXBsZVRhc2spOworICAgICAgICAgICAgYi5wdXRCb29sZWFuKEtFWV9SRU9SREVSX1RPX0ZST05ULCBtUmVvcmRlclRvRnJvbnQpOworICAgICAgICAgICAgYi5wdXRJbnQoS0VZX0RJU1BMQVlfSUQsIG1EaXNwbGF5SWQpOworICAgICAgICAgICAgYi5wdXRCb29sZWFuKEtFWV9VU0VfQVBQTElDQVRJT05fQ09OVEVYVCwgbVVzZUFwcGxpY2F0aW9uQ29udGV4dCk7CisgICAgICAgICAgICBiLnB1dFN0cmluZyhLRVlfVEFSR0VUX0NPTVBPTkVOVCwgZ2V0QWN0aXZpdHlOYW1lKG1UYXJnZXRBY3Rpdml0eSkpOworICAgICAgICAgICAgYi5wdXRCb29sZWFuKEtFWV9TVVBQUkVTU19FWENFUFRJT05TLCBtU3VwcHJlc3NFeGNlcHRpb25zKTsKKyAgICAgICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKTsKKyAgICAgICAgICAgIGxhdW5jaEFjdGl2aXR5RnJvbUV4dHJhcyhjb250ZXh0LCBiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBCdWlsZCBhbmQgZXhlY3V0ZSBhIHNoZWxsIGNvbW1hbmQgdG8gbGF1bmNoIGFuIGFjdGl2aXR5LiAqLworICAgICAgICBwcml2YXRlIHZvaWQgbGF1bmNoVXNpbmdTaGVsbENvbW1hbmQoKSB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGNvbW1hbmRCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIGlmIChtQnJvYWRjYXN0UmVjZWl2ZXIgIT0gbnVsbCAmJiBtQnJvYWRjYXN0UmVjZWl2ZXJBY3Rpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIFVzZSBicm9hZGNhc3QgcmVjZWl2ZXIgdG8gbGF1bmNoIHRoZSB0YXJnZXQuCisgICAgICAgICAgICAgICAgY29tbWFuZEJ1aWxkZXIuYXBwZW5kKCJhbSBicm9hZGNhc3QgLWEgIikuYXBwZW5kKG1Ccm9hZGNhc3RSZWNlaXZlckFjdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIiAtcCAiKS5hcHBlbmQobUJyb2FkY2FzdFJlY2VpdmVyLmdldFBhY2thZ2VOYW1lKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmNsdWRlIHN0b3BwZWQgcGFja2FnZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIiAtZiAweDAwMDAwMDIwIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFVzZSBsYXVuY2hpbmcgYWN0aXZpdHkgdG8gbGF1bmNoIHRoZSB0YXJnZXQuCisgICAgICAgICAgICAgICAgY29tbWFuZEJ1aWxkZXIuYXBwZW5kKGdldEFtU3RhcnRDbWQobUxhdW5jaGluZ0FjdGl2aXR5KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIiAtZiAweDIwMDAwMDIwIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEFkZCBhIGZsYWcgdG8gZW5zdXJlIHdlIGFjdHVhbGx5IG1lYW4gdG8gbGF1bmNoIGFuIGFjdGl2aXR5LgorICAgICAgICAgICAgY29tbWFuZEJ1aWxkZXIuYXBwZW5kKCIgLS1leiAiICsgS0VZX0xBVU5DSF9BQ1RJVklUWSArICIgdHJ1ZSIpOworCisgICAgICAgICAgICBpZiAobVRvU2lkZSkgeworICAgICAgICAgICAgICAgIGNvbW1hbmRCdWlsZGVyLmFwcGVuZCgiIC0tZXogIiArIEtFWV9MQVVOQ0hfVE9fU0lERSArICIgdHJ1ZSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1SYW5kb21EYXRhKSB7CisgICAgICAgICAgICAgICAgY29tbWFuZEJ1aWxkZXIuYXBwZW5kKCIgLS1leiAiICsgS0VZX1JBTkRPTV9EQVRBICsgIiB0cnVlIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobU5ld1Rhc2spIHsKKyAgICAgICAgICAgICAgICBjb21tYW5kQnVpbGRlci5hcHBlbmQoIiAtLWV6ICIgKyBLRVlfTkVXX1RBU0sgKyAiIHRydWUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtTXVsdGlwbGVUYXNrKSB7CisgICAgICAgICAgICAgICAgY29tbWFuZEJ1aWxkZXIuYXBwZW5kKCIgLS1leiAiICsgS0VZX01VTFRJUExFX1RBU0sgKyAiIHRydWUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtUmVvcmRlclRvRnJvbnQpIHsKKyAgICAgICAgICAgICAgICBjb21tYW5kQnVpbGRlci5hcHBlbmQoIiAtLWV6ICIgKyBLRVlfUkVPUkRFUl9UT19GUk9OVCArICIgdHJ1ZSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1EaXNwbGF5SWQgIT0gSU5WQUxJRF9ESVNQTEFZKSB7CisgICAgICAgICAgICAgICAgY29tbWFuZEJ1aWxkZXIuYXBwZW5kKCIgLS1laSAiICsgS0VZX0RJU1BMQVlfSUQgKyAiICIpLmFwcGVuZChtRGlzcGxheUlkKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1Vc2VBcHBsaWNhdGlvbkNvbnRleHQpIHsKKyAgICAgICAgICAgICAgICBjb21tYW5kQnVpbGRlci5hcHBlbmQoIiAtLWV6ICIgKyBLRVlfVVNFX0FQUExJQ0FUSU9OX0NPTlRFWFQgKyAiIHRydWUiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1UYXJnZXRBY3Rpdml0eSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8ge0BsaW5rIEFjdGl2aXR5TGF1bmNoZXJ9IHBhcnNlcyB0aGlzIGV4dHJhIHN0cmluZyBieQorICAgICAgICAgICAgICAgIC8vIHtAbGluayBDb21wb25lbnROYW1lI3VuZmxhdHRlbkZyb21TdHJpbmcoU3RyaW5nKX0uCisgICAgICAgICAgICAgICAgY29tbWFuZEJ1aWxkZXIuYXBwZW5kKCIgLS1lcyAiICsgS0VZX1RBUkdFVF9DT01QT05FTlQgKyAiICIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGdldEFjdGl2aXR5TmFtZShtVGFyZ2V0QWN0aXZpdHkpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1TdXBwcmVzc0V4Y2VwdGlvbnMpIHsKKyAgICAgICAgICAgICAgICBjb21tYW5kQnVpbGRlci5hcHBlbmQoIiAtLWV6ICIgKyBLRVlfU1VQUFJFU1NfRVhDRVBUSU9OUyArICIgdHJ1ZSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChjb21tYW5kQnVpbGRlci50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEFjdGl2aXR5IHVzZWQgaW4gcGxhY2Ugb2YgcmVjZW50cyB3aGVuIGhvbWUgaXMgdGhlIHJlY2VudHMgY29tcG9uZW50LgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2lkZUFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci91dGlsL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9Db21wb25lbnROYW1lVXRpbHMuamF2YSBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci91dGlsL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9Db21wb25lbnROYW1lVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjY5ZjdkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3V0aWwvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0NvbXBvbmVudE5hbWVVdGlscy5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLmFtOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CisKK3B1YmxpYyBjbGFzcyBDb21wb25lbnROYW1lVXRpbHMgeworCisgICAgLyoqCisgICAgICogR2V0IGNvbXBvbmVudCdzIGFjdGl2aXR5IG5hbWUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBhY3Rpdml0eSBuYW1lIG9mIHtAY29kZSBjb21wb25lbnROYW1lfSwgc3VjaCBhcyAiY29udGV4dFBhY2thZ2UvLlNpbXBsZUNsYXNzTmFtZSIKKyAgICAgKiAgICAgb3IgImNvbnRleHRQYWNrYWdlL0Z1bGx5Q2xhc3NOYW1lIi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBY3Rpdml0eU5hbWUoQ29tcG9uZW50TmFtZSBjb21wb25lbnROYW1lKSB7CisgICAgICAgIHJldHVybiBjb21wb25lbnROYW1lLmZsYXR0ZW5Ub1Nob3J0U3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGNvbXBvbmVudCdzIHdpbmRvdyBtYW5lLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgd2luZG93IG5hbWUgb2Yge0Bjb2RlIGNvbXBvbmVudE5hbWV9LCBzdWNoIHRoYXQgImNvbnRleHRQYWNrYWdlL0Z1bGx5Q2xhc3NOYW1lIi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRXaW5kb3dOYW1lKENvbXBvbmVudE5hbWUgY29tcG9uZW50TmFtZSkgeworICAgICAgICByZXR1cm4gY29tcG9uZW50TmFtZS5mbGF0dGVuVG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgY29tcG9uZW50J3Mgc2ltcGxlIGNsYXNzIG5hbWUgc3VpdGFibGUgZm9yIGxvZ2dpbmcgdGFnLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgc2ltcGxlIGNsYXNzIG5hbWUgb2Yge0Bjb2RlIGNvbXBvbmVudE5hbWV9IHRoYXQgaGFzIG5vICcuJy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRMb2dUYWcoQ29tcG9uZW50TmFtZSBjb21wb25lbnROYW1lKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBjbGFzc05hbWUgPSBjb21wb25lbnROYW1lLmdldENsYXNzTmFtZSgpOworICAgICAgICBmaW5hbCBpbnQgcG9zID0gY2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJyk7CisgICAgICAgIHJldHVybiBwb3MgPj0gMCA/IGNsYXNzTmFtZS5zdWJzdHJpbmcocG9zICsgMSkgOiBjbGFzc05hbWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3V0aWwvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1Byb3RvRXh0cmFjdG9ycy5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3V0aWwvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1Byb3RvRXh0cmFjdG9ycy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MGZjNjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvdXRpbC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vUHJvdG9FeHRyYWN0b3JzLmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLldpbmRvd0NvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC5hcHAubmFuby5XaW5kb3dDb25maWd1cmF0aW9uUHJvdG87CitpbXBvcnQgYW5kcm9pZC5jb250ZW50Lm5hbm8uQ29uZmlndXJhdGlvblByb3RvOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5uYW5vLlJlY3RQcm90bzsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIGZvciBleHRyYWN0aW5nIHNvbWUgY29tbW9uIGZyYW1ld29yayBvYmplY3QgZnJvbSBuYW5vIHByb3RvIG9iamVjdHMuCisgKiBOb3JtYWxseSB0aGUgZXh0cmFjdG9ycyB3aWxsIGJlIGluIHRoZSBmcmFtZXdvcmsgb2JqZWN0IGNsYXNzLCBidXQgd2UgZG9uJ3Qgd2FudCB0aGUgZnJhbWV3b3JrIHRvCisgKiBkZXBlbmQgb24gbmFubyBwcm90byBkdWUgdG8gc2l6ZSBjb3N0LgorICogVE9ETzogVGhpcyBjbGFzcyBzaG91bGQgcHJvYmFibHkgYmUgaW4gZnJhbWV3b3Jrcy9iYXNlL2xpYiBwcm9qZWN0IHNvIGl0IGNhbiBiZSB1c2VkCisgKiBvdXRzaWRlIG9mIENUUy4KKyAqLworcHVibGljIGNsYXNzIFByb3RvRXh0cmFjdG9ycyB7CisgICAgcHVibGljIHN0YXRpYyBDb25maWd1cmF0aW9uIGV4dHJhY3QoQ29uZmlndXJhdGlvblByb3RvIHByb3RvKSB7CisgICAgICAgIGZpbmFsIENvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgaWYgKHByb3RvID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBjb25maWc7CisgICAgICAgIH0KKyAgICAgICAgY29uZmlnLndpbmRvd0NvbmZpZ3VyYXRpb24uc2V0VG8oZXh0cmFjdChwcm90by53aW5kb3dDb25maWd1cmF0aW9uKSk7CisgICAgICAgIGNvbmZpZy5kZW5zaXR5RHBpID0gcHJvdG8uZGVuc2l0eURwaTsKKyAgICAgICAgY29uZmlnLm9yaWVudGF0aW9uID0gcHJvdG8ub3JpZW50YXRpb247CisgICAgICAgIGNvbmZpZy5zY3JlZW5IZWlnaHREcCA9IHByb3RvLnNjcmVlbkhlaWdodERwOworICAgICAgICBjb25maWcuc2NyZWVuV2lkdGhEcCA9IHByb3RvLnNjcmVlbldpZHRoRHA7CisgICAgICAgIGNvbmZpZy5zbWFsbGVzdFNjcmVlbldpZHRoRHAgPSBwcm90by5zbWFsbGVzdFNjcmVlbldpZHRoRHA7CisgICAgICAgIGNvbmZpZy5zY3JlZW5MYXlvdXQgPSBwcm90by5zY3JlZW5MYXlvdXQ7CisgICAgICAgIGNvbmZpZy51aU1vZGUgPSBwcm90by51aU1vZGU7CisgICAgICAgIHJldHVybiBjb25maWc7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBXaW5kb3dDb25maWd1cmF0aW9uIGV4dHJhY3QoV2luZG93Q29uZmlndXJhdGlvblByb3RvIHByb3RvKSB7CisgICAgICAgIGZpbmFsIFdpbmRvd0NvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IFdpbmRvd0NvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgaWYgKHByb3RvID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBjb25maWc7CisgICAgICAgIH0KKyAgICAgICAgY29uZmlnLnNldEFwcEJvdW5kcyhleHRyYWN0KHByb3RvLmFwcEJvdW5kcykpOworICAgICAgICBjb25maWcuc2V0V2luZG93aW5nTW9kZShwcm90by53aW5kb3dpbmdNb2RlKTsKKyAgICAgICAgY29uZmlnLnNldEFjdGl2aXR5VHlwZShwcm90by5hY3Rpdml0eVR5cGUpOworICAgICAgICByZXR1cm4gY29uZmlnOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUmVjdCBleHRyYWN0KFJlY3RQcm90byBwcm90bykgeworICAgICAgICBpZiAocHJvdG8gPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBSZWN0KHByb3RvLmxlZnQsIHByb3RvLnRvcCwgcHJvdG8ucmlnaHQsIHByb3RvLmJvdHRvbSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3V0aWwvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1N0YXRlTG9nZ2VyLmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvdXRpbC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vU3RhdGVMb2dnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjg0OGJmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3V0aWwvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1N0YXRlTG9nZ2VyLmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbTsKKworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKy8qKgorICogVXRpbCBjbGFzcyB0byBwZXJmb3JtIHNpbXBsZSBzdGF0ZSBsb2dnaW5nLgorICovCitwdWJsaWMgY2xhc3MgU3RhdGVMb2dnZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBUQUcgPSAiQU1XTSI7CisKKyAgICAvKioKKyAgICAgKiBTaW1wbGUgaW5mby1sZXZlbCBsb2dnaW5nIGdhdGVkIGJ5IHtAbGluayAjREVCVUd9IGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBsb2dUZXh0KSB7CisgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgTG9nLmkoVEFHLCBsb2dUZXh0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2dBbHdheXMoU3RyaW5nIGxvZ1RleHQpIHsKKyAgICAgICAgTG9nLmkoVEFHLCBsb2dUZXh0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nRShTdHJpbmcgbG9nVGV4dCkgeworICAgICAgICBMb2cuZShUQUcsIGxvZ1RleHQpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFKFN0cmluZyBsb2dUZXh0LCBUaHJvd2FibGUgZSkgeworICAgICAgICBMb2cuZShUQUcsIGxvZ1RleHQsIGUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci91dGlsL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9VaURldmljZVV0aWxzLmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvdXRpbC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vVWlEZXZpY2VVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmOTliMGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvdXRpbC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vVWlEZXZpY2VVdGlscy5qYXZhCkBAIC0wLDAgKzEsMTM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbTsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5TdGF0ZUxvZ2dlci5sb2dFOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuS2V5RXZlbnQuS0VZQ09ERV9BUFBfU1dJVENIOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuS2V5RXZlbnQuS0VZQ09ERV9NRU5VOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuS2V5RXZlbnQuS0VZQ09ERV9TTEVFUDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LktleUV2ZW50LktFWUNPREVfV0FLRVVQOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuS2V5RXZlbnQuS0VZQ09ERV9XSU5ET1c7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0OworCitpbXBvcnQgYW5kcm9pZC5hcHAuS2V5Z3VhcmRNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5Qb3dlck1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC51aWF1dG9tYXRvci5VaURldmljZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CisKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQm9vbGVhblN1cHBsaWVyOworCisvKioKKyAqIEhlbHBlciBjbGFzcyB0byBpbnRlcmFjdCB3aXRoIHtAbGluayBVaURldmljZX0uCisgKgorICogQWxsIHJlZmVyZW5jZXMgdG8ge0BsaW5rIFVpRGV2aWNlfSBhbmQge0BsaW5rIEtleUV2ZW50fSBzaG91bGQgYmUgaGVyZSBmb3IgZWFzeSBkZWJ1Z2dpbmcuCisgKi8KK3B1YmxpYyBjbGFzcyBVaURldmljZVV0aWxzIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiVWlEZXZpY2VVdGlscyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOworCisgICAgc3RhdGljIHZvaWQgd2FpdEZvckRldmljZUlkbGUobG9uZyB0aW1lb3V0KSB7CisgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAid2FpdEZvckRldmljZUlkbGU6IHRpbWVvdXQ9IiArIHRpbWVvdXQpOworICAgICAgICBnZXREZXZpY2UoKS53YWl0Rm9ySWRsZSh0aW1lb3V0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd2FrZVVwRGV2aWNlKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAid2FrZVVwRGV2aWNlIik7CisgICAgICAgIGdldERldmljZSgpLndha2VVcCgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkcmFnUG9pbnRlcihQb2ludCBmcm9tLCBQb2ludCB0bywgaW50IHN0ZXBzKSB7CisgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAiZHJhZ1BvaW50ZXI6IGZyb209IiArIGZyb20gKyAiIHRvPSIgKyB0byArICIgc3RlcHM9IiArIHN0ZXBzKTsKKyAgICAgICAgZ2V0RGV2aWNlKCkuZHJhZyhmcm9tLngsIGZyb20ueSwgdG8ueCwgdG8ueSwgc3RlcHMpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIHByZXNzRW50ZXJCdXR0b24oKSB7CisgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAicHJlc3NFbnRlckJ1dHRvbiIpOworICAgICAgICBnZXREZXZpY2UoKS5wcmVzc0VudGVyKCk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgcHJlc3NIb21lQnV0dG9uKCkgeworICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgInByZXNzSG9tZUJ1dHRvbiIpOworICAgICAgICBnZXREZXZpY2UoKS5wcmVzc0hvbWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJlc3NCYWNrQnV0dG9uKCkgeworICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgInByZXNzQmFja0J1dHRvbiIpOworICAgICAgICBnZXREZXZpY2UoKS5wcmVzc0JhY2soKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJlc3NNZW51QnV0dG9uKCkgeworICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgInByZXNzTWVudUJ1dHRvbiIpOworICAgICAgICBnZXREZXZpY2UoKS5wcmVzc01lbnUoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBwcmVzc1NsZWVwQnV0dG9uKCkgeworICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgInByZXNzU2xlZXBCdXR0b24iKTsKKyAgICAgICAgZmluYWwgUG93ZXJNYW5hZ2VyIHBtID0gZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoUG93ZXJNYW5hZ2VyLmNsYXNzKTsKKyAgICAgICAgcmV0cnlQcmVzc0tleUNvZGUoS0VZQ09ERV9TTEVFUCwgKCkgLT4gcG0gIT0gbnVsbCAmJiAhcG0uaXNJbnRlcmFjdGl2ZSgpLAorICAgICAgICAgICAgICAgICIqKipXYWl0aW5nIGZvciBkZXZpY2Ugc2xlZXAuLi4iKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBwcmVzc1dha2V1cEJ1dHRvbigpIHsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJwcmVzc1dha2V1cEJ1dHRvbiIpOworICAgICAgICBmaW5hbCBQb3dlck1hbmFnZXIgcG0gPSBnZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShQb3dlck1hbmFnZXIuY2xhc3MpOworICAgICAgICByZXRyeVByZXNzS2V5Q29kZShLRVlDT0RFX1dBS0VVUCwgKCkgLT4gcG0gIT0gbnVsbCAmJiBwbS5pc0ludGVyYWN0aXZlKCksCisgICAgICAgICAgICAgICAgIioqKldhaXRpbmcgZm9yIGRldmljZSB3YWtldXAuLi4iKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBwcmVzc1VubG9ja0J1dHRvbigpIHsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJwcmVzc1VubG9ja0J1dHRvbiIpOworICAgICAgICBmaW5hbCBLZXlndWFyZE1hbmFnZXIga2dtID0gZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoS2V5Z3VhcmRNYW5hZ2VyLmNsYXNzKTsKKyAgICAgICAgcmV0cnlQcmVzc0tleUNvZGUoS0VZQ09ERV9NRU5VLCAoKSAtPiBrZ20gIT0gbnVsbCAmJiAha2dtLmlzS2V5Z3VhcmRMb2NrZWQoKSwKKyAgICAgICAgICAgICAgICAiKioqV2FpdGluZyBmb3IgZGV2aWNlIHVubG9jay4uLiIpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIHByZXNzV2luZG93QnV0dG9uKCkgeworICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgInByZXNzV2luZG93QnV0dG9uIik7CisgICAgICAgIHByZXNzS2V5Q29kZShLRVlDT0RFX1dJTkRPVyk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgcHJlc3NBcHBTd2l0Y2hCdXR0b24oKSB7CisgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAicHJlc3NBcHBTd2l0Y2hCdXR0b24iKTsKKyAgICAgICAgcHJlc3NLZXlDb2RlKEtFWUNPREVfQVBQX1NXSVRDSCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCByZXRyeVByZXNzS2V5Q29kZShpbnQga2V5Q29kZSwgQm9vbGVhblN1cHBsaWVyIHdhaXRGb3IsIFN0cmluZyBtc2cpIHsKKyAgICAgICAgaW50IHJldHJ5ID0gMTsKKyAgICAgICAgZG8geworICAgICAgICAgICAgcHJlc3NLZXlDb2RlKGtleUNvZGUpOworICAgICAgICAgICAgaWYgKHdhaXRGb3IuZ2V0QXNCb29sZWFuKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBMb2cuZChUQUcsIG1zZyArICIgcmV0cnk9IiArIHJldHJ5KTsKKyAgICAgICAgICAgIFN5c3RlbUNsb2NrLnNsZWVwKDUwKTsKKyAgICAgICAgfSB3aGlsZSAocmV0cnkrKyA8IDUpOworICAgICAgICBpZiAoIXdhaXRGb3IuZ2V0QXNCb29sZWFuKCkpIHsKKyAgICAgICAgICAgIGxvZ0UobXNnICsgIiBGQUlMRUQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJlc3NLZXlDb2RlKGludCBrZXlDb2RlKSB7CisgICAgICAgIGdldERldmljZSgpLnByZXNzS2V5Q29kZShrZXlDb2RlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBVaURldmljZSBnZXREZXZpY2UoKSB7CisgICAgICAgIHJldHVybiBVaURldmljZS5nZXRJbnN0YW5jZShJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3V0aWwvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1dhaXRGb3JWYWxpZEFjdGl2aXR5U3RhdGUuamF2YSBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci91dGlsL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9XYWl0Rm9yVmFsaWRBY3Rpdml0eVN0YXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE5YjM1MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci91dGlsL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9XYWl0Rm9yVmFsaWRBY3Rpdml0eVN0YXRlLmphdmEKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW07CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyLlN0YWNrSWQuSU5WQUxJRF9TVEFDS19JRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuV2luZG93Q29uZmlndXJhdGlvbi5BQ1RJVklUWV9UWVBFX0FTU0lTVEFOVDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuV2luZG93Q29uZmlndXJhdGlvbi5BQ1RJVklUWV9UWVBFX0hPTUU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLldpbmRvd0NvbmZpZ3VyYXRpb24uQUNUSVZJVFlfVFlQRV9SRUNFTlRTOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5XaW5kb3dDb25maWd1cmF0aW9uLkFDVElWSVRZX1RZUEVfU1RBTkRBUkQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLldpbmRvd0NvbmZpZ3VyYXRpb24uQUNUSVZJVFlfVFlQRV9VTkRFRklORUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLldpbmRvd0NvbmZpZ3VyYXRpb24uV0lORE9XSU5HX01PREVfRlJFRUZPUk07CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLldpbmRvd0NvbmZpZ3VyYXRpb24uV0lORE9XSU5HX01PREVfRlVMTFNDUkVFTjsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuV2luZG93Q29uZmlndXJhdGlvbi5XSU5ET1dJTkdfTU9ERV9QSU5ORUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLldpbmRvd0NvbmZpZ3VyYXRpb24uV0lORE9XSU5HX01PREVfU1BMSVRfU0NSRUVOX1BSSU1BUlk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLldpbmRvd0NvbmZpZ3VyYXRpb24uV0lORE9XSU5HX01PREVfU1BMSVRfU0NSRUVOX1NFQ09OREFSWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuV2luZG93Q29uZmlndXJhdGlvbi5XSU5ET1dJTkdfTU9ERV9VTkRFRklORUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudE5hbWVVdGlscy5nZXRBY3Rpdml0eU5hbWU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudE5hbWVVdGlscy5nZXRXaW5kb3dOYW1lOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5OdWxsYWJsZTsKKworcHVibGljIGNsYXNzIFdhaXRGb3JWYWxpZEFjdGl2aXR5U3RhdGUgeworICAgIEBOdWxsYWJsZQorICAgIHB1YmxpYyBmaW5hbCBDb21wb25lbnROYW1lIGFjdGl2aXR5TmFtZTsKKyAgICBATnVsbGFibGUKKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIHdpbmRvd05hbWU7CisgICAgcHVibGljIGZpbmFsIGludCBzdGFja0lkOworICAgIHB1YmxpYyBmaW5hbCBpbnQgd2luZG93aW5nTW9kZTsKKyAgICBwdWJsaWMgZmluYWwgaW50IGFjdGl2aXR5VHlwZTsKKworICAgIHB1YmxpYyBzdGF0aWMgV2FpdEZvclZhbGlkQWN0aXZpdHlTdGF0ZSBmb3JXaW5kb3coZmluYWwgU3RyaW5nIHdpbmRvd05hbWUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuc2V0V2luZG93TmFtZSh3aW5kb3dOYW1lKS5idWlsZCgpOworICAgIH0KKworICAgIHB1YmxpYyBXYWl0Rm9yVmFsaWRBY3Rpdml0eVN0YXRlKGZpbmFsIENvbXBvbmVudE5hbWUgYWN0aXZpdHlOYW1lKSB7CisgICAgICAgIHRoaXMuYWN0aXZpdHlOYW1lID0gYWN0aXZpdHlOYW1lOworICAgICAgICB0aGlzLndpbmRvd05hbWUgPSBnZXRXaW5kb3dOYW1lKGFjdGl2aXR5TmFtZSk7CisgICAgICAgIHRoaXMuc3RhY2tJZCA9IElOVkFMSURfU1RBQ0tfSUQ7CisgICAgICAgIHRoaXMud2luZG93aW5nTW9kZSA9IFdJTkRPV0lOR19NT0RFX1VOREVGSU5FRDsKKyAgICAgICAgdGhpcy5hY3Rpdml0eVR5cGUgPSBBQ1RJVklUWV9UWVBFX1VOREVGSU5FRDsKKyAgICB9CisKKyAgICBwcml2YXRlIFdhaXRGb3JWYWxpZEFjdGl2aXR5U3RhdGUoZmluYWwgQnVpbGRlciBidWlsZGVyKSB7CisgICAgICAgIHRoaXMuYWN0aXZpdHlOYW1lID0gYnVpbGRlci5tQWN0aXZpdHlOYW1lOworICAgICAgICB0aGlzLndpbmRvd05hbWUgPSBidWlsZGVyLm1XaW5kb3dOYW1lOworICAgICAgICB0aGlzLnN0YWNrSWQgPSBidWlsZGVyLm1TdGFja0lkOworICAgICAgICB0aGlzLndpbmRvd2luZ01vZGUgPSBidWlsZGVyLm1XaW5kb3dpbmdNb2RlOworICAgICAgICB0aGlzLmFjdGl2aXR5VHlwZSA9IGJ1aWxkZXIubUFjdGl2aXR5VHlwZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoIndhaXQ6Iik7CisgICAgICAgIGlmIChhY3Rpdml0eU5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIgYWN0aXZpdHk9IikuYXBwZW5kKGdldEFjdGl2aXR5TmFtZShhY3Rpdml0eU5hbWUpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYWN0aXZpdHlUeXBlICE9IEFDVElWSVRZX1RZUEVfVU5ERUZJTkVEKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiB0eXBlPSIpLmFwcGVuZChhY3Rpdml0eVR5cGVOYW1lKGFjdGl2aXR5VHlwZSkpOworICAgICAgICB9CisgICAgICAgIGlmICh3aW5kb3dOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIHdpbmRvdz0iKS5hcHBlbmQod2luZG93TmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHdpbmRvd2luZ01vZGUgIT0gV0lORE9XSU5HX01PREVfVU5ERUZJTkVEKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiBtb2RlPSIpLmFwcGVuZCh3aW5kb3dpbmdNb2RlTmFtZSh3aW5kb3dpbmdNb2RlKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0YWNrSWQgIT0gSU5WQUxJRF9TVEFDS19JRCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIgc3RhY2s9IikuYXBwZW5kKHN0YWNrSWQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB3aW5kb3dpbmdNb2RlTmFtZShpbnQgd2luZG93aW5nTW9kZSkgeworICAgICAgICBzd2l0Y2ggKHdpbmRvd2luZ01vZGUpIHsKKyAgICAgICAgICAgIGNhc2UgV0lORE9XSU5HX01PREVfVU5ERUZJTkVEOiByZXR1cm4gIlVOREVGSU5FRCI7CisgICAgICAgICAgICBjYXNlIFdJTkRPV0lOR19NT0RFX0ZVTExTQ1JFRU46IHJldHVybiAiRlVMTFNDUkVFTiI7CisgICAgICAgICAgICBjYXNlIFdJTkRPV0lOR19NT0RFX1BJTk5FRDogcmV0dXJuICJQSU5ORUQiOworICAgICAgICAgICAgY2FzZSBXSU5ET1dJTkdfTU9ERV9TUExJVF9TQ1JFRU5fUFJJTUFSWTogcmV0dXJuICJTUExJVF9TQ1JFRU5fUFJJTUFSWSI7CisgICAgICAgICAgICBjYXNlIFdJTkRPV0lOR19NT0RFX1NQTElUX1NDUkVFTl9TRUNPTkRBUlk6IHJldHVybiAiU1BMSVRfU0NSRUVOX1NFQ09OREFSWSI7CisgICAgICAgICAgICBjYXNlIFdJTkRPV0lOR19NT0RFX0ZSRUVGT1JNOiByZXR1cm4gIkZSRUVGT1JNIjsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBXSU5ET1dJTkdfTU9ERV86ICIgKyB3aW5kb3dpbmdNb2RlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBhY3Rpdml0eVR5cGVOYW1lKGludCBhY3Rpdml0eVR5cGUpIHsKKyAgICAgICAgc3dpdGNoIChhY3Rpdml0eVR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgQUNUSVZJVFlfVFlQRV9VTkRFRklORUQ6IHJldHVybiAiVU5ERUZJTkVEIjsKKyAgICAgICAgICAgIGNhc2UgQUNUSVZJVFlfVFlQRV9TVEFOREFSRDogcmV0dXJuICJTVEFOREFSRCI7CisgICAgICAgICAgICBjYXNlIEFDVElWSVRZX1RZUEVfSE9NRTogcmV0dXJuICJIT01FIjsKKyAgICAgICAgICAgIGNhc2UgQUNUSVZJVFlfVFlQRV9SRUNFTlRTOiByZXR1cm4gIlJFQ0VOVFMiOworICAgICAgICAgICAgY2FzZSBBQ1RJVklUWV9UWVBFX0FTU0lTVEFOVDogcmV0dXJuICJBU1NJU1RBTlQiOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIEFDVElWSVRZX1RZUEVfOiAiICsgYWN0aXZpdHlUeXBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlciB7CisgICAgICAgIEBOdWxsYWJsZQorICAgICAgICBwcml2YXRlIENvbXBvbmVudE5hbWUgbUFjdGl2aXR5TmFtZSA9IG51bGw7CisgICAgICAgIEBOdWxsYWJsZQorICAgICAgICBwcml2YXRlIFN0cmluZyBtV2luZG93TmFtZSA9IG51bGw7CisgICAgICAgIHByaXZhdGUgaW50IG1TdGFja0lkID0gSU5WQUxJRF9TVEFDS19JRDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVdpbmRvd2luZ01vZGUgPSBXSU5ET1dJTkdfTU9ERV9VTkRFRklORUQ7CisgICAgICAgIHByaXZhdGUgaW50IG1BY3Rpdml0eVR5cGUgPSBBQ1RJVklUWV9UWVBFX1VOREVGSU5FRDsKKworICAgICAgICBwcml2YXRlIEJ1aWxkZXIoKSB7fQorCisgICAgICAgIHB1YmxpYyBCdWlsZGVyKGZpbmFsIENvbXBvbmVudE5hbWUgYWN0aXZpdHlOYW1lKSB7CisgICAgICAgICAgICBtQWN0aXZpdHlOYW1lID0gYWN0aXZpdHlOYW1lOworICAgICAgICAgICAgbVdpbmRvd05hbWUgPSBnZXRXaW5kb3dOYW1lKGFjdGl2aXR5TmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIEJ1aWxkZXIgc2V0V2luZG93TmFtZShTdHJpbmcgd2luZG93TmFtZSkgeworICAgICAgICAgICAgbVdpbmRvd05hbWUgPSB3aW5kb3dOYW1lOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRTdGFja0lkKGludCBzdGFja0lkKSB7CisgICAgICAgICAgICBtU3RhY2tJZCA9IHN0YWNrSWQ7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFdpbmRvd2luZ01vZGUoaW50IHdpbmRvd2luZ01vZGUpIHsKKyAgICAgICAgICAgIG1XaW5kb3dpbmdNb2RlID0gd2luZG93aW5nTW9kZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0QWN0aXZpdHlUeXBlKGludCBhY3Rpdml0eVR5cGUpIHsKKyAgICAgICAgICAgIG1BY3Rpdml0eVR5cGUgPSBhY3Rpdml0eVR5cGU7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBXYWl0Rm9yVmFsaWRBY3Rpdml0eVN0YXRlIGJ1aWxkKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBXYWl0Rm9yVmFsaWRBY3Rpdml0eVN0YXRlKHRoaXMpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3V0aWwvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1dpbmRvd01hbmFnZXJTdGF0ZS5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2UvYWN0aXZpdHltYW5hZ2VyL3V0aWwvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1dpbmRvd01hbmFnZXJTdGF0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NmZjMTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvdXRpbC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vV2luZG93TWFuYWdlclN0YXRlLmphdmEKQEAgLTAsMCArMSw5MjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW07CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuV2luZG93Q29uZmlndXJhdGlvbi5BQ1RJVklUWV9UWVBFX1NUQU5EQVJEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5XaW5kb3dDb25maWd1cmF0aW9uLkFDVElWSVRZX1RZUEVfVU5ERUZJTkVEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5XaW5kb3dDb25maWd1cmF0aW9uLldJTkRPV0lOR19NT0RFX1VOREVGSU5FRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uUHJvdG9FeHRyYWN0b3JzLmV4dHJhY3Q7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLlN0YXRlTG9nZ2VyLmxvZzsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uU3RhdGVMb2dnZXIubG9nRTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LkRpc3BsYXkuREVGQVVMVF9ESVNQTEFZOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQudmlldy5uYW5vLkRpc3BsYXlJbmZvUHJvdG87CisKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk5vbk51bGw7CitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5OdWxsYWJsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworCitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLndtLm5hbm8uQXBwVHJhbnNpdGlvblByb3RvOworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci53bS5uYW5vLkFwcFdpbmRvd1Rva2VuUHJvdG87CitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLndtLm5hbm8uQ29uZmlndXJhdGlvbkNvbnRhaW5lclByb3RvOworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci53bS5uYW5vLkRpc3BsYXlGcmFtZXNQcm90bzsKK2ltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIud20ubmFuby5EaXNwbGF5UHJvdG87CitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLndtLm5hbm8uSWRlbnRpZmllclByb3RvOworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci53bS5uYW5vLlBpbm5lZFN0YWNrQ29udHJvbGxlclByb3RvOworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci53bS5uYW5vLlN0YWNrUHJvdG87CitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLndtLm5hbm8uVGFza1Byb3RvOworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci53bS5uYW5vLldpbmRvd0NvbnRhaW5lclByb3RvOworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci53bS5uYW5vLldpbmRvd01hbmFnZXJTZXJ2aWNlRHVtcFByb3RvOworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci53bS5uYW5vLldpbmRvd1N0YXRlQW5pbWF0b3JQcm90bzsKK2ltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIud20ubmFuby5XaW5kb3dTdGF0ZVByb3RvOworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci53bS5uYW5vLldpbmRvd1N1cmZhY2VDb250cm9sbGVyUHJvdG87CitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLndtLm5hbm8uV2luZG93VG9rZW5Qcm90bzsKKworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYubmFuby5JbnZhbGlkUHJvdG9jb2xCdWZmZXJOYW5vRXhjZXB0aW9uOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07CisKK3B1YmxpYyBjbGFzcyBXaW5kb3dNYW5hZ2VyU3RhdGUgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQU5TSVRfQUNUSVZJVFlfT1BFTiA9ICJUUkFOU0lUX0FDVElWSVRZX09QRU4iOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQU5TSVRfQUNUSVZJVFlfQ0xPU0UgPSAiVFJBTlNJVF9BQ1RJVklUWV9DTE9TRSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBTlNJVF9UQVNLX09QRU4gPSAiVFJBTlNJVF9UQVNLX09QRU4iOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQU5TSVRfVEFTS19DTE9TRSA9ICJUUkFOU0lUX1RBU0tfQ0xPU0UiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBTlNJVF9XQUxMUEFQRVJfT1BFTiA9ICJUUkFOU0lUX1dBTExQQVBFUl9PUEVOIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFOU0lUX1dBTExQQVBFUl9DTE9TRSA9ICJUUkFOU0lUX1dBTExQQVBFUl9DTE9TRSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBTlNJVF9XQUxMUEFQRVJfSU5UUkFfT1BFTiA9ICJUUkFOU0lUX1dBTExQQVBFUl9JTlRSQV9PUEVOIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFOU0lUX1dBTExQQVBFUl9JTlRSQV9DTE9TRSA9ICJUUkFOU0lUX1dBTExQQVBFUl9JTlRSQV9DTE9TRSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFOU0lUX0tFWUdVQVJEX0dPSU5HX0FXQVkgPSAiVFJBTlNJVF9LRVlHVUFSRF9HT0lOR19BV0FZIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFOU0lUX0tFWUdVQVJEX0dPSU5HX0FXQVlfT05fV0FMTFBBUEVSID0KKyAgICAgICAgICAgICJUUkFOU0lUX0tFWUdVQVJEX0dPSU5HX0FXQVlfT05fV0FMTFBBUEVSIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFOU0lUX0tFWUdVQVJEX09DQ0xVREUgPSAiVFJBTlNJVF9LRVlHVUFSRF9PQ0NMVURFIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFOU0lUX0tFWUdVQVJEX1VOT0NDTFVERSA9ICJUUkFOU0lUX0tFWUdVQVJEX1VOT0NDTFVERSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBTlNJVF9UUkFOU0xVQ0VOVF9BQ1RJVklUWV9PUEVOID0KKyAgICAgICAgICAgICJUUkFOU0lUX1RSQU5TTFVDRU5UX0FDVElWSVRZX09QRU4iOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQU5TSVRfVFJBTlNMVUNFTlRfQUNUSVZJVFlfQ0xPU0UgPQorICAgICAgICAgICAgIlRSQU5TSVRfVFJBTlNMVUNFTlRfQUNUSVZJVFlfQ0xPU0UiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQX1NUQVRFX0lETEUgPSAiQVBQX1NUQVRFX0lETEUiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERVTVBTWVNfV0lORE9XID0gImR1bXBzeXMgd2luZG93IC1hIC0tcHJvdG8iOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVJUSU5HX1dJTkRPV19QUkVGSVggPSAiU3RhcnRpbmcgIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVCVUdHRVJfV0lORE9XX1BSRUZJWCA9ICJXYWl0aW5nIEZvciBEZWJ1Z2dlcjogIjsKKworICAgIC8vIFdpbmRvd3MgaW4gei1vcmRlciB3aXRoIHRoZSB0b3AgbW9zdCBhdCB0aGUgZnJvbnQgb2YgdGhlIGxpc3QuCisgICAgcHJpdmF0ZSBMaXN0PFdpbmRvd1N0YXRlPiBtV2luZG93U3RhdGVzID0gbmV3IEFycmF5TGlzdCgpOworICAgIC8vIFN0YWNrcyBpbiB6LW9yZGVyIHdpdGggdGhlIHRvcCBtb3N0IGF0IHRoZSBmcm9udCBvZiB0aGUgbGlzdCwgc3RhcnRpbmcgd2l0aCBwcmltYXJ5IGRpc3BsYXkuCisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFdpbmRvd1N0YWNrPiBtU3RhY2tzID0gbmV3IEFycmF5TGlzdCgpOworICAgIC8vIFN0YWNrcyBvbiBhbGwgYXR0YWNoZWQgZGlzcGxheXMsIGluIHotb3JkZXIgd2l0aCB0aGUgdG9wIG1vc3QgYXQgdGhlIGZyb250IG9mIHRoZSBsaXN0LgorICAgIHByaXZhdGUgZmluYWwgTWFwPEludGVnZXIsIExpc3Q8V2luZG93U3RhY2s+PiBtRGlzcGxheVN0YWNrcworICAgICAgICAgICAgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgcHJpdmF0ZSBMaXN0PERpc3BsYXk+IG1EaXNwbGF5cyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICBwcml2YXRlIFN0cmluZyBtRm9jdXNlZFdpbmRvdyA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgbUZvY3VzZWRBcHAgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nIG1MYXN0VHJhbnNpdGlvbiA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgbUFwcFRyYW5zaXRpb25TdGF0ZSA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgbUlucHV0TWV0aG9kV2luZG93QXBwVG9rZW4gPSBudWxsOworICAgIHByaXZhdGUgUmVjdCBtRGVmYXVsdFBpbm5lZFN0YWNrQm91bmRzID0gbmV3IFJlY3QoKTsKKyAgICBwcml2YXRlIFJlY3QgbVBpbm5lZFN0YWNrTW92ZW1lbnRCb3VuZHMgPSBuZXcgUmVjdCgpOworICAgIHByaXZhdGUgZmluYWwgTGlua2VkTGlzdDxTdHJpbmc+IG1TeXNEdW1wID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICBwcml2YXRlIGludCBtUm90YXRpb247CisgICAgcHJpdmF0ZSBpbnQgbUxhc3RPcmllbnRhdGlvbjsKKyAgICBwcml2YXRlIGJvb2xlYW4gbURpc3BsYXlGcm96ZW47CisgICAgcHJpdmF0ZSBib29sZWFuIG1Jc0RvY2tlZFN0YWNrTWluaW1pemVkOworCisgICAgcHVibGljIHZvaWQgY29tcHV0ZVN0YXRlKCkgeworICAgICAgICAvLyBJdCBpcyBwb3NzaWJsZSB0aGUgc3lzdGVtIGlzIGluIHRoZSBtaWRkbGUgb2YgdHJhbnNpdGlvbiB0byB0aGUgcmlnaHQgc3RhdGUgd2hlbiB3ZSBnZXQKKyAgICAgICAgLy8gdGhlIGR1bXAuIFdlIHRyeSBhIGZldyB0aW1lcyB0byBnZXQgdGhlIGluZm9ybWF0aW9uIHdlIG5lZWQgYmVmb3JlIGdpdmluZyB1cC4KKyAgICAgICAgaW50IHJldHJpZXNMZWZ0ID0gMzsKKyAgICAgICAgYm9vbGVhbiByZXRyeSA9IGZhbHNlOworICAgICAgICBieXRlW10gZHVtcCA9IG51bGw7CisKKyAgICAgICAgbG9nKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKKyAgICAgICAgbG9nKCIgICAgICBXaW5kb3dNYW5hZ2VyU3RhdGUgICAgICAiKTsKKyAgICAgICAgbG9nKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKKyAgICAgICAgZG8geworICAgICAgICAgICAgaWYgKHJldHJ5KSB7CisgICAgICAgICAgICAgICAgbG9nKCIqKipJbmNvbXBsZXRlIFdNIHN0YXRlLiBSZXRyeWluZy4uLiIpOworICAgICAgICAgICAgICAgIC8vIFdhaXQgaGFsZiBhIHNlY29uZCBiZXR3ZWVuIHJldHJpZXMgZm9yIHdpbmRvdyBtYW5hZ2VyIHRvIGZpbmlzaCB0cmFuc2l0aW9uaW5nLi4uCisgICAgICAgICAgICAgICAgU3lzdGVtQ2xvY2suc2xlZXAoNTAwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZHVtcCA9IGV4ZWN1dGVTaGVsbENvbW1hbmQoRFVNUFNZU19XSU5ET1cpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBwYXJzZVN5c0R1bXBQcm90byhkdW1wKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlck5hbm9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRmFpbGVkIHRvIHBhcnNlIGR1bXBzeXM6XG4iCisgICAgICAgICAgICAgICAgICAgICAgICArIG5ldyBTdHJpbmcoZHVtcCwgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCksIGV4KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0cnkgPSBtV2luZG93U3RhdGVzLmlzRW1wdHkoKSB8fCBtRm9jdXNlZEFwcCA9PSBudWxsOworICAgICAgICB9IHdoaWxlIChyZXRyeSAmJiByZXRyaWVzTGVmdC0tID4gMCk7CisKKyAgICAgICAgaWYgKG1XaW5kb3dTdGF0ZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBsb2dFKCJObyBXaW5kb3dzIGZvdW5kLi4uIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Gb2N1c2VkV2luZG93ID09IG51bGwpIHsKKyAgICAgICAgICAgIGxvZ0UoIk5vIEZvY3VzZWQgV2luZG93Li4uIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Gb2N1c2VkQXBwID09IG51bGwpIHsKKyAgICAgICAgICAgIGxvZ0UoIk5vIEZvY3VzZWQgQXBwLi4uIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGJ5dGVbXSBleGVjdXRlU2hlbGxDb21tYW5kKFN0cmluZyBjbWQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHBmZCA9CisgICAgICAgICAgICAgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLmdldFVpQXV0b21hdGlvbigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmV4ZWN1dGVTaGVsbENvbW1hbmQoY21kKTsKKyAgICAgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVs1MTJdOworICAgICAgICAgICAgaW50IGJ5dGVzUmVhZDsKKyAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgUGFyY2VsRmlsZURlc2NyaXB0b3IuQXV0b0Nsb3NlSW5wdXRTdHJlYW0ocGZkKTsKKyAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBzdGRvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICB3aGlsZSAoKGJ5dGVzUmVhZCA9IGZpcy5yZWFkKGJ1ZikpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgc3Rkb3V0LndyaXRlKGJ1ZiwgMCwgYnl0ZXNSZWFkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpcy5jbG9zZSgpOworICAgICAgICAgICAgcmV0dXJuIHN0ZG91dC50b0J5dGVBcnJheSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlU3lzRHVtcFByb3RvKGJ5dGVbXSBzeXNEdW1wKSB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyTmFub0V4Y2VwdGlvbiB7CisgICAgICAgIHJlc2V0KCk7CisgICAgICAgIFdpbmRvd01hbmFnZXJTZXJ2aWNlRHVtcFByb3RvIHN0YXRlID0gV2luZG93TWFuYWdlclNlcnZpY2VEdW1wUHJvdG8ucGFyc2VGcm9tKHN5c0R1bXApOworICAgICAgICBMaXN0PFdpbmRvd1N0YXRlPiBhbGxXaW5kb3dzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIE1hcDxTdHJpbmcsIFdpbmRvd1N0YXRlPiB3aW5kb3dNYXAgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIGlmIChzdGF0ZS5mb2N1c2VkV2luZG93ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Gb2N1c2VkV2luZG93ID0gc3RhdGUuZm9jdXNlZFdpbmRvdy50aXRsZTsKKyAgICAgICAgfQorICAgICAgICBtRm9jdXNlZEFwcCA9IHN0YXRlLmZvY3VzZWRBcHA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RhdGUucm9vdFdpbmRvd0NvbnRhaW5lci5kaXNwbGF5cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgRGlzcGxheVByb3RvIGRpc3BsYXlQcm90byA9IHN0YXRlLnJvb3RXaW5kb3dDb250YWluZXIuZGlzcGxheXNbaV07CisgICAgICAgICAgICBmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheShkaXNwbGF5UHJvdG8pOworICAgICAgICAgICAgbURpc3BsYXlzLmFkZChkaXNwbGF5KTsKKyAgICAgICAgICAgIGFsbFdpbmRvd3MuYWRkQWxsKGRpc3BsYXkuZ2V0V2luZG93cygpKTsKKyAgICAgICAgICAgIExpc3Q8V2luZG93U3RhY2s+IHN0YWNrcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBkaXNwbGF5UHJvdG8uc3RhY2tzLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgU3RhY2tQcm90byBzdGFja1Byb3RvID0gZGlzcGxheVByb3RvLnN0YWNrc1tqXTsKKyAgICAgICAgICAgICAgICBmaW5hbCBXaW5kb3dTdGFjayBzdGFjayA9IG5ldyBXaW5kb3dTdGFjayhzdGFja1Byb3RvKTsKKyAgICAgICAgICAgICAgICBtU3RhY2tzLmFkZChzdGFjayk7CisgICAgICAgICAgICAgICAgc3RhY2tzLmFkZChzdGFjayk7CisgICAgICAgICAgICAgICAgYWxsV2luZG93cy5hZGRBbGwoc3RhY2suZ2V0V2luZG93cygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1EaXNwbGF5U3RhY2tzLnB1dChkaXNwbGF5Lm1EaXNwbGF5SWQsIHN0YWNrcyk7CisKKyAgICAgICAgICAgIC8vIHVzZSBwcm9wZXJ0aWVzIGZyb20gdGhlIGRlZmF1bHQgZGlzcGxheSBvbmx5CisgICAgICAgICAgICBpZiAoZGlzcGxheS5nZXREaXNwbGF5SWQoKSA9PSBERUZBVUxUX0RJU1BMQVkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlzcGxheVByb3RvLmRvY2tlZFN0YWNrRGl2aWRlckNvbnRyb2xsZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtSXNEb2NrZWRTdGFja01pbmltaXplZCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheVByb3RvLmRvY2tlZFN0YWNrRGl2aWRlckNvbnRyb2xsZXIubWluaW1pemVkRG9jazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgUGlubmVkU3RhY2tDb250cm9sbGVyUHJvdG8gcGlubmVkU3RhY2tQcm90byA9IGRpc3BsYXlQcm90by5waW5uZWRTdGFja0NvbnRyb2xsZXI7CisgICAgICAgICAgICAgICAgaWYgKHBpbm5lZFN0YWNrUHJvdG8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtRGVmYXVsdFBpbm5lZFN0YWNrQm91bmRzID0gZXh0cmFjdChwaW5uZWRTdGFja1Byb3RvLmRlZmF1bHRCb3VuZHMpOworICAgICAgICAgICAgICAgICAgICBtUGlubmVkU3RhY2tNb3ZlbWVudEJvdW5kcyA9IGV4dHJhY3QocGlubmVkU3RhY2tQcm90by5tb3ZlbWVudEJvdW5kcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoV2luZG93U3RhdGUgdyA6IGFsbFdpbmRvd3MpIHsKKyAgICAgICAgICAgIHdpbmRvd01hcC5wdXQody5nZXRUb2tlbigpLCB3KTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0YXRlLnJvb3RXaW5kb3dDb250YWluZXIud2luZG93cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgSWRlbnRpZmllclByb3RvIGlkZW50aWZpZXJQcm90byA9IHN0YXRlLnJvb3RXaW5kb3dDb250YWluZXIud2luZG93c1tpXTsKKyAgICAgICAgICAgIFN0cmluZyBoYXNoX2NvZGUgPSBJbnRlZ2VyLnRvSGV4U3RyaW5nKGlkZW50aWZpZXJQcm90by5oYXNoQ29kZSk7CisgICAgICAgICAgICBtV2luZG93U3RhdGVzLmFkZCh3aW5kb3dNYXAuZ2V0KGhhc2hfY29kZSkpOworICAgICAgICB9CisgICAgICAgIGlmIChzdGF0ZS5pbnB1dE1ldGhvZFdpbmRvdyAhPSBudWxsKSB7CisgICAgICAgICAgICBtSW5wdXRNZXRob2RXaW5kb3dBcHBUb2tlbiA9IEludGVnZXIudG9IZXhTdHJpbmcoc3RhdGUuaW5wdXRNZXRob2RXaW5kb3cuaGFzaENvZGUpOworICAgICAgICB9CisgICAgICAgIG1EaXNwbGF5RnJvemVuID0gc3RhdGUuZGlzcGxheUZyb3plbjsKKyAgICAgICAgbVJvdGF0aW9uID0gc3RhdGUucm90YXRpb247CisgICAgICAgIG1MYXN0T3JpZW50YXRpb24gPSBzdGF0ZS5sYXN0T3JpZW50YXRpb247CisgICAgICAgIEFwcFRyYW5zaXRpb25Qcm90byBhcHBUcmFuc2l0aW9uUHJvdG8gPSBzdGF0ZS5hcHBUcmFuc2l0aW9uOworICAgICAgICBpbnQgYXBwU3RhdGUgPSAwOworICAgICAgICBpbnQgbGFzdFRyYW5zaXRpb24gPSAwOworICAgICAgICBpZiAoYXBwVHJhbnNpdGlvblByb3RvICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFwcFN0YXRlID0gYXBwVHJhbnNpdGlvblByb3RvLmFwcFRyYW5zaXRpb25TdGF0ZTsKKyAgICAgICAgICAgIGxhc3RUcmFuc2l0aW9uID0gYXBwVHJhbnNpdGlvblByb3RvLmxhc3RVc2VkQXBwVHJhbnNpdGlvbjsKKyAgICAgICAgfQorICAgICAgICBtQXBwVHJhbnNpdGlvblN0YXRlID0gYXBwU3RhdGVUb1N0cmluZyhhcHBTdGF0ZSk7CisgICAgICAgIG1MYXN0VHJhbnNpdGlvbiA9IGFwcFRyYW5zaXRpb25Ub1N0cmluZyhsYXN0VHJhbnNpdGlvbik7CisgICAgfQorCisgICAgc3RhdGljIFN0cmluZyBhcHBTdGF0ZVRvU3RyaW5nKGludCBhcHBTdGF0ZSkgeworICAgICAgICBzd2l0Y2ggKGFwcFN0YXRlKSB7CisgICAgICAgICAgICBjYXNlIEFwcFRyYW5zaXRpb25Qcm90by5BUFBfU1RBVEVfSURMRToKKyAgICAgICAgICAgICAgICByZXR1cm4gIkFQUF9TVEFURV9JRExFIjsKKyAgICAgICAgICAgIGNhc2UgQXBwVHJhbnNpdGlvblByb3RvLkFQUF9TVEFURV9SRUFEWToKKyAgICAgICAgICAgICAgICByZXR1cm4gIkFQUF9TVEFURV9SRUFEWSI7CisgICAgICAgICAgICBjYXNlIEFwcFRyYW5zaXRpb25Qcm90by5BUFBfU1RBVEVfUlVOTklORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gIkFQUF9TVEFURV9SVU5OSU5HIjsKKyAgICAgICAgICAgIGNhc2UgQXBwVHJhbnNpdGlvblByb3RvLkFQUF9TVEFURV9USU1FT1VUOgorICAgICAgICAgICAgICAgIHJldHVybiAiQVBQX1NUQVRFX1RJTUVPVVQiOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBmYWlsKCJJbnZhbGlkIEFwcFRyYW5zaXRpb25TdGF0ZSIpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIFN0cmluZyBhcHBUcmFuc2l0aW9uVG9TdHJpbmcoaW50IHRyYW5zaXRpb24pIHsKKyAgICAgICAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgICAgICAgICBjYXNlIEFwcFRyYW5zaXRpb25Qcm90by5UUkFOU0lUX1VOU0VUOiB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJUUkFOU0lUX1VOU0VUIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQXBwVHJhbnNpdGlvblByb3RvLlRSQU5TSVRfTk9ORTogeworICAgICAgICAgICAgICAgIHJldHVybiAiVFJBTlNJVF9OT05FIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQXBwVHJhbnNpdGlvblByb3RvLlRSQU5TSVRfQUNUSVZJVFlfT1BFTjogeworICAgICAgICAgICAgICAgIHJldHVybiBUUkFOU0lUX0FDVElWSVRZX09QRU47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEFwcFRyYW5zaXRpb25Qcm90by5UUkFOU0lUX0FDVElWSVRZX0NMT1NFOiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRSQU5TSVRfQUNUSVZJVFlfQ0xPU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEFwcFRyYW5zaXRpb25Qcm90by5UUkFOU0lUX1RBU0tfT1BFTjogeworICAgICAgICAgICAgICAgIHJldHVybiBUUkFOU0lUX1RBU0tfT1BFTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQXBwVHJhbnNpdGlvblByb3RvLlRSQU5TSVRfVEFTS19DTE9TRTogeworICAgICAgICAgICAgICAgIHJldHVybiBUUkFOU0lUX1RBU0tfQ0xPU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEFwcFRyYW5zaXRpb25Qcm90by5UUkFOU0lUX1RBU0tfVE9fRlJPTlQ6IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIlRSQU5TSVRfVEFTS19UT19GUk9OVCI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEFwcFRyYW5zaXRpb25Qcm90by5UUkFOU0lUX1RBU0tfVE9fQkFDSzogeworICAgICAgICAgICAgICAgIHJldHVybiAiVFJBTlNJVF9UQVNLX1RPX0JBQ0siOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBBcHBUcmFuc2l0aW9uUHJvdG8uVFJBTlNJVF9XQUxMUEFQRVJfQ0xPU0U6IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVFJBTlNJVF9XQUxMUEFQRVJfQ0xPU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEFwcFRyYW5zaXRpb25Qcm90by5UUkFOU0lUX1dBTExQQVBFUl9PUEVOOiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRSQU5TSVRfV0FMTFBBUEVSX09QRU47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEFwcFRyYW5zaXRpb25Qcm90by5UUkFOU0lUX1dBTExQQVBFUl9JTlRSQV9PUEVOOiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRSQU5TSVRfV0FMTFBBUEVSX0lOVFJBX09QRU47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEFwcFRyYW5zaXRpb25Qcm90by5UUkFOU0lUX1dBTExQQVBFUl9JTlRSQV9DTE9TRTogeworICAgICAgICAgICAgICAgIHJldHVybiBUUkFOU0lUX1dBTExQQVBFUl9JTlRSQV9DTE9TRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQXBwVHJhbnNpdGlvblByb3RvLlRSQU5TSVRfVEFTS19PUEVOX0JFSElORDogeworICAgICAgICAgICAgICAgIHJldHVybiAiVFJBTlNJVF9UQVNLX09QRU5fQkVISU5EIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQXBwVHJhbnNpdGlvblByb3RvLlRSQU5TSVRfQUNUSVZJVFlfUkVMQVVOQ0g6IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIlRSQU5TSVRfQUNUSVZJVFlfUkVMQVVOQ0giOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBBcHBUcmFuc2l0aW9uUHJvdG8uVFJBTlNJVF9ET0NLX1RBU0tfRlJPTV9SRUNFTlRTOiB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJUUkFOU0lUX0RPQ0tfVEFTS19GUk9NX1JFQ0VOVFMiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBBcHBUcmFuc2l0aW9uUHJvdG8uVFJBTlNJVF9LRVlHVUFSRF9HT0lOR19BV0FZOiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRSQU5TSVRfS0VZR1VBUkRfR09JTkdfQVdBWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQXBwVHJhbnNpdGlvblByb3RvLlRSQU5TSVRfS0VZR1VBUkRfR09JTkdfQVdBWV9PTl9XQUxMUEFQRVI6IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVFJBTlNJVF9LRVlHVUFSRF9HT0lOR19BV0FZX09OX1dBTExQQVBFUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQXBwVHJhbnNpdGlvblByb3RvLlRSQU5TSVRfS0VZR1VBUkRfT0NDTFVERTogeworICAgICAgICAgICAgICAgIHJldHVybiBUUkFOU0lUX0tFWUdVQVJEX09DQ0xVREU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEFwcFRyYW5zaXRpb25Qcm90by5UUkFOU0lUX0tFWUdVQVJEX1VOT0NDTFVERTogeworICAgICAgICAgICAgICAgIHJldHVybiBUUkFOU0lUX0tFWUdVQVJEX1VOT0NDTFVERTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQXBwVHJhbnNpdGlvblByb3RvLlRSQU5TSVRfVFJBTlNMVUNFTlRfQUNUSVZJVFlfT1BFTjogeworICAgICAgICAgICAgICAgIHJldHVybiBUUkFOU0lUX1RSQU5TTFVDRU5UX0FDVElWSVRZX09QRU47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEFwcFRyYW5zaXRpb25Qcm90by5UUkFOU0lUX1RSQU5TTFVDRU5UX0FDVElWSVRZX0NMT1NFOiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRSQU5TSVRfVFJBTlNMVUNFTlRfQUNUSVZJVFlfQ0xPU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICAgICAgZmFpbCgiSW52YWxpZCBsYXN0VXNlZEFwcFRyYW5zaXRpb24iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIExpc3Q8U3RyaW5nPiBnZXRNYXRjaGluZ1dpbmRvd1Rva2VucyhmaW5hbCBTdHJpbmcgd2luZG93TmFtZSkgeworICAgICAgICByZXR1cm4gZ2V0TWF0Y2hpbmdXaW5kb3dzKHdzIC0+IHdpbmRvd05hbWUuZXF1YWxzKHdzLmdldE5hbWUoKSkpCisgICAgICAgICAgICAgICAgLm1hcChXaW5kb3dTdGF0ZTo6Z2V0VG9rZW4pCisgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8V2luZG93U3RhdGU+IGdldE1hdGNoaW5nVmlzaWJsZVdpbmRvd1N0YXRlKGZpbmFsIFN0cmluZyB3aW5kb3dOYW1lKSB7CisgICAgICAgIHJldHVybiBnZXRNYXRjaGluZ1dpbmRvd3Mod3MgLT4gd3MuaXNTaG93bigpICYmIHdpbmRvd05hbWUuZXF1YWxzKHdzLmdldE5hbWUoKSkpCisgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgfQorCisgICAgTGlzdDxXaW5kb3dTdGF0ZT4gZ2V0RXhpdGluZ1dpbmRvd3MoKSB7CisgICAgICAgIHJldHVybiBnZXRNYXRjaGluZ1dpbmRvd3MoV2luZG93U3RhdGU6OmlzRXhpdGluZ1dpbmRvdykKKyAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmVhbTxXaW5kb3dTdGF0ZT4gZ2V0TWF0Y2hpbmdXaW5kb3dzKFByZWRpY2F0ZTxXaW5kb3dTdGF0ZT4gY29uZGl0aW9uKSB7CisgICAgICAgIHJldHVybiBtV2luZG93U3RhdGVzLnN0cmVhbSgpLmZpbHRlcihjb25kaXRpb24pOworICAgIH0KKworICAgIEBOdWxsYWJsZQorICAgIHB1YmxpYyBXaW5kb3dTdGF0ZSBnZXRXaW5kb3dCeVBhY2thZ2VOYW1lKFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHdpbmRvd1R5cGUpIHsKKyAgICAgICAgZmluYWwgTGlzdDxXaW5kb3dTdGF0ZT4gd2luZG93TGlzdCA9IGdldFdpbmRvd3NCeVBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lLCB3aW5kb3dUeXBlKTsKKyAgICAgICAgcmV0dXJuIHdpbmRvd0xpc3QuaXNFbXB0eSgpID8gbnVsbCA6IHdpbmRvd0xpc3QuZ2V0KDApOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PFdpbmRvd1N0YXRlPiBnZXRXaW5kb3dzQnlQYWNrYWdlTmFtZShTdHJpbmcgcGFja2FnZU5hbWUsIGludC4uLiByZXN0cmljdFRvVHlwZXMpIHsKKyAgICAgICAgcmV0dXJuIGdldE1hdGNoaW5nV2luZG93cyh3cyAtPgorICAgICAgICAgICAgICAgICh3cy5nZXROYW1lKCkuZXF1YWxzKHBhY2thZ2VOYW1lKSB8fCB3cy5nZXROYW1lKCkuc3RhcnRzV2l0aChwYWNrYWdlTmFtZSArICIvIikpCisgICAgICAgICAgICAgICAgJiYgQXJyYXlzLnN0cmVhbShyZXN0cmljdFRvVHlwZXMpLmFueU1hdGNoKHR5cGUgLT4gdHlwZSA9PSB3cy5nZXRUeXBlKCkpKQorICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgIH0KKworICAgIFdpbmRvd1N0YXRlIGdldFdpbmRvd1N0YXRlRm9yQXBwVG9rZW4oU3RyaW5nIGFwcFRva2VuKSB7CisgICAgICAgIHJldHVybiBnZXRNYXRjaGluZ1dpbmRvd3Mod3MgLT4gd3MuZ2V0VG9rZW4oKS5lcXVhbHMoYXBwVG9rZW4pKQorICAgICAgICAgICAgICAgIC5maW5kRmlyc3QoKQorICAgICAgICAgICAgICAgIC5vckVsc2UobnVsbCk7CisgICAgfQorCisgICAgRGlzcGxheSBnZXREaXNwbGF5KGludCBkaXNwbGF5SWQpIHsKKyAgICAgICAgZm9yIChEaXNwbGF5IGRpc3BsYXkgOiBtRGlzcGxheXMpIHsKKyAgICAgICAgICAgIGlmIChkaXNwbGF5SWQgPT0gZGlzcGxheS5nZXREaXNwbGF5SWQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBkaXNwbGF5OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIExpc3Q8RGlzcGxheT4gZ2V0RGlzcGxheXMoKSB7CisgICAgICAgIHJldHVybiBtRGlzcGxheXM7CisgICAgfQorCisgICAgU3RyaW5nIGdldEZyb250V2luZG93KCkgeworICAgICAgICBpZiAobVdpbmRvd1N0YXRlcyA9PSBudWxsIHx8IG1XaW5kb3dTdGF0ZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbVdpbmRvd1N0YXRlcy5nZXQoMCkuZ2V0TmFtZSgpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9jdXNlZFdpbmRvdygpIHsKKyAgICAgICAgcmV0dXJuIG1Gb2N1c2VkV2luZG93OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9jdXNlZEFwcCgpIHsKKyAgICAgICAgcmV0dXJuIG1Gb2N1c2VkQXBwOworICAgIH0KKworICAgIFN0cmluZyBnZXRMYXN0VHJhbnNpdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG1MYXN0VHJhbnNpdGlvbjsKKyAgICB9CisKKyAgICBTdHJpbmcgZ2V0QXBwVHJhbnNpdGlvblN0YXRlKCkgeworICAgICAgICByZXR1cm4gbUFwcFRyYW5zaXRpb25TdGF0ZTsKKyAgICB9CisKKyAgICBpbnQgZ2V0RnJvbnRTdGFja0lkKGludCBkaXNwbGF5SWQpIHsKKyAgICAgICAgcmV0dXJuIG1EaXNwbGF5U3RhY2tzLmdldChkaXNwbGF5SWQpLmdldCgwKS5tU3RhY2tJZDsKKyAgICB9CisKKyAgICBpbnQgZ2V0RnJvbnRTdGFja0FjdGl2aXR5VHlwZShpbnQgZGlzcGxheUlkKSB7CisgICAgICAgIHJldHVybiBtRGlzcGxheVN0YWNrcy5nZXQoZGlzcGxheUlkKS5nZXQoMCkuZ2V0QWN0aXZpdHlUeXBlKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRSb3RhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG1Sb3RhdGlvbjsKKyAgICB9CisKKyAgICBpbnQgZ2V0TGFzdE9yaWVudGF0aW9uKCkgeworICAgICAgICByZXR1cm4gbUxhc3RPcmllbnRhdGlvbjsKKyAgICB9CisKKyAgICBib29sZWFuIGNvbnRhaW5zU3RhY2soaW50IHN0YWNrSWQpIHsKKyAgICAgICAgZm9yIChXaW5kb3dTdGFjayBzdGFjayA6IG1TdGFja3MpIHsKKyAgICAgICAgICAgIGlmIChzdGFja0lkID09IHN0YWNrLm1TdGFja0lkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2xlYW4gY29udGFpbnNTdGFjayhpbnQgd2luZG93aW5nTW9kZSwgaW50IGFjdGl2aXR5VHlwZSkgeworICAgICAgICBmb3IgKFdpbmRvd1N0YWNrIHN0YWNrIDogbVN0YWNrcykgeworICAgICAgICAgICAgaWYgKGFjdGl2aXR5VHlwZSAhPSBBQ1RJVklUWV9UWVBFX1VOREVGSU5FRAorICAgICAgICAgICAgICAgICAgICAmJiBhY3Rpdml0eVR5cGUgIT0gc3RhY2suZ2V0QWN0aXZpdHlUeXBlKCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh3aW5kb3dpbmdNb2RlICE9IFdJTkRPV0lOR19NT0RFX1VOREVGSU5FRAorICAgICAgICAgICAgICAgICAgICAmJiB3aW5kb3dpbmdNb2RlICE9IHN0YWNrLmdldFdpbmRvd2luZ01vZGUoKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIGlmIHRoZXJlIGV4aXN0cyBhIHdpbmRvdyByZWNvcmQgd2l0aCBtYXRjaGluZyB3aW5kb3dOYW1lLgorICAgICAqLworICAgIGJvb2xlYW4gY29udGFpbnNXaW5kb3coU3RyaW5nIHdpbmRvd05hbWUpIHsKKyAgICAgICAgZm9yIChXaW5kb3dTdGF0ZSB3aW5kb3cgOiBtV2luZG93U3RhdGVzKSB7CisgICAgICAgICAgICBpZiAod2luZG93LmdldE5hbWUoKS5lcXVhbHMod2luZG93TmFtZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgYXQgbGVhc3Qgb25lIHdpbmRvdyB3aGljaCBtYXRjaGVzIHByb3ZpZGVkIHdpbmRvdyBuYW1lIGlzIHZpc2libGUuCisgICAgICovCisgICAgYm9vbGVhbiBpc1dpbmRvd1Zpc2libGUoU3RyaW5nIHdpbmRvd05hbWUpIHsKKyAgICAgICAgZm9yIChXaW5kb3dTdGF0ZSB3aW5kb3cgOiBtV2luZG93U3RhdGVzKSB7CisgICAgICAgICAgICBpZiAod2luZG93LmdldE5hbWUoKS5lcXVhbHMod2luZG93TmFtZSkpIHsKKyAgICAgICAgICAgICAgICBpZiAod2luZG93LmlzU2hvd24oKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2xlYW4gYWxsV2luZG93c1Zpc2libGUoU3RyaW5nIHdpbmRvd05hbWUpIHsKKyAgICAgICAgYm9vbGVhbiBhbGxWaXNpYmxlID0gZmFsc2U7CisgICAgICAgIGZvciAoV2luZG93U3RhdGUgd2luZG93IDogbVdpbmRvd1N0YXRlcykgeworICAgICAgICAgICAgaWYgKHdpbmRvdy5nZXROYW1lKCkuZXF1YWxzKHdpbmRvd05hbWUpKSB7CisgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuaXNTaG93bigpKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZygiW1ZJU0lCTEVdIG5vdCB2aXNpYmxlIiArIHdpbmRvd05hbWUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxvZygiW1ZJU0lCTEVdIHZpc2libGUiICsgd2luZG93TmFtZSk7CisgICAgICAgICAgICAgICAgYWxsVmlzaWJsZSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFsbFZpc2libGU7CisgICAgfQorCisgICAgV2luZG93U3RhY2sgZ2V0U3RhY2soaW50IHN0YWNrSWQpIHsKKyAgICAgICAgZm9yIChXaW5kb3dTdGFjayBzdGFjayA6IG1TdGFja3MpIHsKKyAgICAgICAgICAgIGlmIChzdGFja0lkID09IHN0YWNrLm1TdGFja0lkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YWNrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIFdpbmRvd1N0YWNrIGdldFN0YW5kYXJkU3RhY2tCeVdpbmRvd2luZ01vZGUoaW50IHdpbmRvd2luZ01vZGUpIHsKKyAgICAgICAgZm9yIChXaW5kb3dTdGFjayBzdGFjayA6IG1TdGFja3MpIHsKKyAgICAgICAgICAgIGlmIChzdGFjay5nZXRBY3Rpdml0eVR5cGUoKSAhPSBBQ1RJVklUWV9UWVBFX1NUQU5EQVJEKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhY2suZ2V0V2luZG93aW5nTW9kZSgpID09IHdpbmRvd2luZ01vZGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhY2s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqIEdldCB0aGUgc3RhY2sgcG9zaXRpb24gb24gaXRzIGRpc3BsYXkuICovCisgICAgaW50IGdldFN0YWNrSW5kZXhCeUFjdGl2aXR5VHlwZShpbnQgYWN0aXZpdHlUeXBlKSB7CisgICAgICAgIGZvciAoSW50ZWdlciBkaXNwbGF5SWQgOiBtRGlzcGxheVN0YWNrcy5rZXlTZXQoKSkgeworICAgICAgICAgICAgTGlzdDxXaW5kb3dTdGFjaz4gc3RhY2tzID0gbURpc3BsYXlTdGFja3MuZ2V0KGRpc3BsYXlJZCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0YWNrcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChhY3Rpdml0eVR5cGUgPT0gc3RhY2tzLmdldChpKS5nZXRBY3Rpdml0eVR5cGUoKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIFdpbmRvd1N0YXRlIGdldElucHV0TWV0aG9kV2luZG93U3RhdGUoKSB7CisgICAgICAgIHJldHVybiBnZXRXaW5kb3dTdGF0ZUZvckFwcFRva2VuKG1JbnB1dE1ldGhvZFdpbmRvd0FwcFRva2VuKTsKKyAgICB9CisKKyAgICBSZWN0IGdldFN0YWJsZUJvdW5kcygpIHsKKyAgICAgICAgcmV0dXJuIGdldERpc3BsYXkoREVGQVVMVF9ESVNQTEFZKS5tU3RhYmxlQm91bmRzOworICAgIH0KKworICAgIFJlY3QgZ2V0RGVmYXVsdFBpbm5lZFN0YWNrQm91bmRzKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlY3QobURlZmF1bHRQaW5uZWRTdGFja0JvdW5kcyk7CisgICAgfQorCisgICAgUmVjdCBnZXRQaW5uZWRTdGFja01vdmVtZW50Qm91bmRzKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlY3QobVBpbm5lZFN0YWNrTW92ZW1lbnRCb3VuZHMpOworICAgIH0KKworICAgIFdpbmRvd1N0YXRlIGZpbmRGaXJzdFdpbmRvd1dpdGhUeXBlKGludCB0eXBlKSB7CisgICAgICAgIGZvciAoV2luZG93U3RhdGUgd2luZG93IDogbVdpbmRvd1N0YXRlcykgeworICAgICAgICAgICAgaWYgKHdpbmRvdy5nZXRUeXBlKCkgPT0gdHlwZSkgeworICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3c7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNEaXNwbGF5RnJvemVuKCkgeworICAgICAgICByZXR1cm4gbURpc3BsYXlGcm96ZW47CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNEb2NrZWRTdGFja01pbmltaXplZCgpIHsKKyAgICAgICAgcmV0dXJuIG1Jc0RvY2tlZFN0YWNrTWluaW1pemVkOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0Wk9yZGVyKFdpbmRvd1N0YXRlIHcpIHsKKyAgICAgICAgcmV0dXJuIG1XaW5kb3dTdGF0ZXMuc2l6ZSgpIC0gbVdpbmRvd1N0YXRlcy5pbmRleE9mKHcpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZXNldCgpIHsKKyAgICAgICAgbVN5c0R1bXAuY2xlYXIoKTsKKyAgICAgICAgbVN0YWNrcy5jbGVhcigpOworICAgICAgICBtRGlzcGxheXMuY2xlYXIoKTsKKyAgICAgICAgbVdpbmRvd1N0YXRlcy5jbGVhcigpOworICAgICAgICBtRGlzcGxheVN0YWNrcy5jbGVhcigpOworICAgICAgICBtRm9jdXNlZFdpbmRvdyA9IG51bGw7CisgICAgICAgIG1Gb2N1c2VkQXBwID0gbnVsbDsKKyAgICAgICAgbUxhc3RUcmFuc2l0aW9uID0gbnVsbDsKKyAgICAgICAgbUlucHV0TWV0aG9kV2luZG93QXBwVG9rZW4gPSBudWxsOworICAgICAgICBtSXNEb2NrZWRTdGFja01pbmltaXplZCA9IGZhbHNlOworICAgICAgICBtRGVmYXVsdFBpbm5lZFN0YWNrQm91bmRzLnNldEVtcHR5KCk7CisgICAgICAgIG1QaW5uZWRTdGFja01vdmVtZW50Qm91bmRzLnNldEVtcHR5KCk7CisgICAgICAgIG1Sb3RhdGlvbiA9IDA7CisgICAgICAgIG1MYXN0T3JpZW50YXRpb24gPSAwOworICAgICAgICBtRGlzcGxheUZyb3plbiA9IGZhbHNlOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBXaW5kb3dTdGFjayBleHRlbmRzIFdpbmRvd0NvbnRhaW5lciB7CisKKyAgICAgICAgaW50IG1TdGFja0lkOworICAgICAgICBBcnJheUxpc3Q8V2luZG93VGFzaz4gbVRhc2tzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGJvb2xlYW4gbVdpbmRvd0FuaW1hdGlvbkJhY2tncm91bmRTdXJmYWNlU2hvd2luZzsKKyAgICAgICAgYm9vbGVhbiBtQW5pbWF0aW5nQm91bmRzOworCisgICAgICAgIFdpbmRvd1N0YWNrKFN0YWNrUHJvdG8gcHJvdG8pIHsKKyAgICAgICAgICAgIHN1cGVyKHByb3RvLndpbmRvd0NvbnRhaW5lcik7CisgICAgICAgICAgICBtU3RhY2tJZCA9IHByb3RvLmlkOworICAgICAgICAgICAgbUZ1bGxzY3JlZW4gPSBwcm90by5maWxsc1BhcmVudDsKKyAgICAgICAgICAgIG1Cb3VuZHMgPSBleHRyYWN0KHByb3RvLmJvdW5kcyk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3RvLnRhc2tzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgVGFza1Byb3RvIHRhc2tQcm90byA9IHByb3RvLnRhc2tzW2ldOworICAgICAgICAgICAgICAgIFdpbmRvd1Rhc2sgdGFzayA9IG5ldyBXaW5kb3dUYXNrKHRhc2tQcm90byk7CisgICAgICAgICAgICAgICAgbVRhc2tzLmFkZCh0YXNrKTsKKyAgICAgICAgICAgICAgICBtU3ViV2luZG93cy5hZGRBbGwodGFzay5nZXRXaW5kb3dzKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVdpbmRvd0FuaW1hdGlvbkJhY2tncm91bmRTdXJmYWNlU2hvd2luZyA9IHByb3RvLmFuaW1hdGlvbkJhY2tncm91bmRTdXJmYWNlSXNEaW1taW5nOworICAgICAgICAgICAgbUFuaW1hdGluZ0JvdW5kcyA9IHByb3RvLmFuaW1hdGluZ0JvdW5kczsKKyAgICAgICAgfQorCisgICAgICAgIFdpbmRvd1Rhc2sgZ2V0VGFzayhpbnQgdGFza0lkKSB7CisgICAgICAgICAgICBmb3IgKFdpbmRvd1Rhc2sgdGFzayA6IG1UYXNrcykgeworICAgICAgICAgICAgICAgIGlmICh0YXNrSWQgPT0gdGFzay5tVGFza0lkKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXNrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBpc1dpbmRvd0FuaW1hdGlvbkJhY2tncm91bmRTdXJmYWNlU2hvd2luZygpIHsKKyAgICAgICAgICAgIHJldHVybiBtV2luZG93QW5pbWF0aW9uQmFja2dyb3VuZFN1cmZhY2VTaG93aW5nOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIFdpbmRvd1Rhc2sgZXh0ZW5kcyBXaW5kb3dDb250YWluZXIgeworCisgICAgICAgIGludCBtVGFza0lkOworICAgICAgICBSZWN0IG1UZW1wSW5zZXRCb3VuZHM7CisgICAgICAgIExpc3Q8U3RyaW5nPiBtQXBwVG9rZW5zID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICAgICAgV2luZG93VGFzayhUYXNrUHJvdG8gcHJvdG8pIHsKKyAgICAgICAgICAgIHN1cGVyKHByb3RvLndpbmRvd0NvbnRhaW5lcik7CisgICAgICAgICAgICBtVGFza0lkID0gcHJvdG8uaWQ7CisgICAgICAgICAgICBtRnVsbHNjcmVlbiA9IHByb3RvLmZpbGxzUGFyZW50OworICAgICAgICAgICAgbUJvdW5kcyA9IGV4dHJhY3QocHJvdG8uYm91bmRzKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdG8uYXBwV2luZG93VG9rZW5zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgQXBwV2luZG93VG9rZW5Qcm90byBhcHBXaW5kb3dUb2tlblByb3RvID0gcHJvdG8uYXBwV2luZG93VG9rZW5zW2ldOworICAgICAgICAgICAgICAgIG1BcHBUb2tlbnMuYWRkKGFwcFdpbmRvd1Rva2VuUHJvdG8ubmFtZSk7CisgICAgICAgICAgICAgICAgV2luZG93VG9rZW5Qcm90byB3aW5kb3dUb2tlblByb3RvID0gYXBwV2luZG93VG9rZW5Qcm90by53aW5kb3dUb2tlbjsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHdpbmRvd1Rva2VuUHJvdG8ud2luZG93cy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgICAgICBXaW5kb3dTdGF0ZVByb3RvIHdpbmRvd1Byb3RvID0gd2luZG93VG9rZW5Qcm90by53aW5kb3dzW2pdOworICAgICAgICAgICAgICAgICAgICBXaW5kb3dTdGF0ZSB3aW5kb3cgPSBuZXcgV2luZG93U3RhdGUod2luZG93UHJvdG8pOworICAgICAgICAgICAgICAgICAgICBtU3ViV2luZG93cy5hZGQod2luZG93KTsKKyAgICAgICAgICAgICAgICAgICAgbVN1YldpbmRvd3MuYWRkQWxsKHdpbmRvdy5nZXRXaW5kb3dzKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1UZW1wSW5zZXRCb3VuZHMgPSBleHRyYWN0KHByb3RvLnRlbXBJbnNldEJvdW5kcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgQ29uZmlndXJhdGlvbkNvbnRhaW5lciB7CisgICAgICAgIGZpbmFsIENvbmZpZ3VyYXRpb24gbU92ZXJyaWRlQ29uZmlndXJhdGlvbiA9IG5ldyBDb25maWd1cmF0aW9uKCk7CisgICAgICAgIGZpbmFsIENvbmZpZ3VyYXRpb24gbUZ1bGxDb25maWd1cmF0aW9uID0gbmV3IENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgZmluYWwgQ29uZmlndXJhdGlvbiBtTWVyZ2VkT3ZlcnJpZGVDb25maWd1cmF0aW9uID0gbmV3IENvbmZpZ3VyYXRpb24oKTsKKworICAgICAgICBDb25maWd1cmF0aW9uQ29udGFpbmVyKENvbmZpZ3VyYXRpb25Db250YWluZXJQcm90byBwcm90bykgeworICAgICAgICAgICAgaWYgKHByb3RvID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtT3ZlcnJpZGVDb25maWd1cmF0aW9uLnNldFRvKGV4dHJhY3QocHJvdG8ub3ZlcnJpZGVDb25maWd1cmF0aW9uKSk7CisgICAgICAgICAgICBtRnVsbENvbmZpZ3VyYXRpb24uc2V0VG8oZXh0cmFjdChwcm90by5mdWxsQ29uZmlndXJhdGlvbikpOworICAgICAgICAgICAgbU1lcmdlZE92ZXJyaWRlQ29uZmlndXJhdGlvbi5zZXRUbyhleHRyYWN0KHByb3RvLm1lcmdlZE92ZXJyaWRlQ29uZmlndXJhdGlvbikpOworICAgICAgICB9CisKKyAgICAgICAgaW50IGdldFdpbmRvd2luZ01vZGUoKSB7CisgICAgICAgICAgICBpZiAobUZ1bGxDb25maWd1cmF0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gV0lORE9XSU5HX01PREVfVU5ERUZJTkVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG1GdWxsQ29uZmlndXJhdGlvbi53aW5kb3dDb25maWd1cmF0aW9uLmdldFdpbmRvd2luZ01vZGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBnZXRBY3Rpdml0eVR5cGUoKSB7CisgICAgICAgICAgICBpZiAobUZ1bGxDb25maWd1cmF0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQUNUSVZJVFlfVFlQRV9VTkRFRklORUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbUZ1bGxDb25maWd1cmF0aW9uLndpbmRvd0NvbmZpZ3VyYXRpb24uZ2V0QWN0aXZpdHlUeXBlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgV2luZG93Q29udGFpbmVyIGV4dGVuZHMgQ29uZmlndXJhdGlvbkNvbnRhaW5lciB7CisKKyAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gbUZ1bGxzY3JlZW47CisgICAgICAgIHByb3RlY3RlZCBSZWN0IG1Cb3VuZHM7CisgICAgICAgIHByb3RlY3RlZCBpbnQgbU9yaWVudGF0aW9uOworICAgICAgICBwcm90ZWN0ZWQgTGlzdDxXaW5kb3dTdGF0ZT4gbVN1YldpbmRvd3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgICAgICBXaW5kb3dDb250YWluZXIoV2luZG93Q29udGFpbmVyUHJvdG8gcHJvdG8pIHsKKyAgICAgICAgICAgIHN1cGVyKHByb3RvLmNvbmZpZ3VyYXRpb25Db250YWluZXIpOworICAgICAgICAgICAgbU9yaWVudGF0aW9uID0gcHJvdG8ub3JpZW50YXRpb247CisgICAgICAgIH0KKworICAgICAgICBSZWN0IGdldEJvdW5kcygpIHsKKyAgICAgICAgICAgIHJldHVybiBtQm91bmRzOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBpc0Z1bGxzY3JlZW4oKSB7CisgICAgICAgICAgICByZXR1cm4gbUZ1bGxzY3JlZW47CisgICAgICAgIH0KKworICAgICAgICBMaXN0PFdpbmRvd1N0YXRlPiBnZXRXaW5kb3dzKCkgeworICAgICAgICAgICAgcmV0dXJuIG1TdWJXaW5kb3dzOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIERpc3BsYXkgZXh0ZW5kcyBXaW5kb3dDb250YWluZXIgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1EaXNwbGF5SWQ7CisgICAgICAgIHByaXZhdGUgUmVjdCBtRGlzcGxheVJlY3QgPSBuZXcgUmVjdCgpOworICAgICAgICBwcml2YXRlIFJlY3QgbUFwcFJlY3QgPSBuZXcgUmVjdCgpOworICAgICAgICBwcml2YXRlIGludCBtRHBpOworICAgICAgICBwcml2YXRlIFJlY3QgbVN0YWJsZUJvdW5kczsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbU5hbWU7CisKKyAgICAgICAgcHVibGljIERpc3BsYXkoRGlzcGxheVByb3RvIHByb3RvKSB7CisgICAgICAgICAgICBzdXBlcihwcm90by53aW5kb3dDb250YWluZXIpOworICAgICAgICAgICAgbURpc3BsYXlJZCA9IHByb3RvLmlkOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm90by5hYm92ZUFwcFdpbmRvd3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBhZGRXaW5kb3dzRnJvbVRva2VuUHJvdG8ocHJvdG8uYWJvdmVBcHBXaW5kb3dzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdG8uYmVsb3dBcHBXaW5kb3dzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgYWRkV2luZG93c0Zyb21Ub2tlblByb3RvKHByb3RvLmJlbG93QXBwV2luZG93c1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3RvLmltZVdpbmRvd3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBhZGRXaW5kb3dzRnJvbVRva2VuUHJvdG8ocHJvdG8uaW1lV2luZG93c1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRHBpID0gcHJvdG8uZHBpOworICAgICAgICAgICAgRGlzcGxheUluZm9Qcm90byBpbmZvUHJvdG8gPSBwcm90by5kaXNwbGF5SW5mbzsKKyAgICAgICAgICAgIGlmIChpbmZvUHJvdG8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1EaXNwbGF5UmVjdC5zZXQoMCwgMCwgaW5mb1Byb3RvLmxvZ2ljYWxXaWR0aCwgaW5mb1Byb3RvLmxvZ2ljYWxIZWlnaHQpOworICAgICAgICAgICAgICAgIG1BcHBSZWN0LnNldCgwLCAwLCBpbmZvUHJvdG8uYXBwV2lkdGgsIGluZm9Qcm90by5hcHBIZWlnaHQpOworICAgICAgICAgICAgICAgIG1OYW1lID0gaW5mb1Byb3RvLm5hbWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBEaXNwbGF5RnJhbWVzUHJvdG8gZGlzcGxheUZyYW1lc1Byb3RvID0gcHJvdG8uZGlzcGxheUZyYW1lczsKKyAgICAgICAgICAgIGlmIChkaXNwbGF5RnJhbWVzUHJvdG8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1TdGFibGVCb3VuZHMgPSBleHRyYWN0KGRpc3BsYXlGcmFtZXNQcm90by5zdGFibGVCb3VuZHMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGFkZFdpbmRvd3NGcm9tVG9rZW5Qcm90byhXaW5kb3dUb2tlblByb3RvIHByb3RvKSB7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHByb3RvLndpbmRvd3MubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICBXaW5kb3dTdGF0ZVByb3RvIHdpbmRvd1Byb3RvID0gcHJvdG8ud2luZG93c1tqXTsKKyAgICAgICAgICAgICAgICBXaW5kb3dTdGF0ZSBjaGlsZFdpbmRvdyA9IG5ldyBXaW5kb3dTdGF0ZSh3aW5kb3dQcm90byk7CisgICAgICAgICAgICAgICAgbVN1YldpbmRvd3MuYWRkKGNoaWxkV2luZG93KTsKKyAgICAgICAgICAgICAgICBtU3ViV2luZG93cy5hZGRBbGwoY2hpbGRXaW5kb3cuZ2V0V2luZG93cygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGludCBnZXREaXNwbGF5SWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbURpc3BsYXlJZDsKKyAgICAgICAgfQorCisgICAgICAgIGludCBnZXREcGkoKSB7CisgICAgICAgICAgICByZXR1cm4gbURwaTsKKyAgICAgICAgfQorCisgICAgICAgIFJlY3QgZ2V0RGlzcGxheVJlY3QoKSB7CisgICAgICAgICAgICByZXR1cm4gbURpc3BsYXlSZWN0OworICAgICAgICB9CisKKyAgICAgICAgUmVjdCBnZXRBcHBSZWN0KCkgeworICAgICAgICAgICAgcmV0dXJuIG1BcHBSZWN0OworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbU5hbWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiRGlzcGxheSAjIiArIG1EaXNwbGF5SWQgKyAiOiBuYW1lPSIgKyBtTmFtZSArICIgbURpc3BsYXlSZWN0PSIgKyBtRGlzcGxheVJlY3QKKyAgICAgICAgICAgICAgICAgICAgKyAiIG1BcHBSZWN0PSIgKyBtQXBwUmVjdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgV2luZG93U3RhdGUgZXh0ZW5kcyBXaW5kb3dDb250YWluZXIgeworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXSU5ET1dfVFlQRV9OT1JNQUwgPSAwOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0lORE9XX1RZUEVfU1RBUlRJTkcgPSAxOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0lORE9XX1RZUEVfRVhJVElORyA9IDI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXSU5ET1dfVFlQRV9ERUJVR0dFUiA9IDM7CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbU5hbWU7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1BcHBUb2tlbjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVdpbmRvd1R5cGU7CisgICAgICAgIHByaXZhdGUgaW50IG1UeXBlID0gMDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbURpc3BsYXlJZDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVN0YWNrSWQ7CisgICAgICAgIHByaXZhdGUgaW50IG1MYXllcjsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1TaG93bjsKKyAgICAgICAgcHJpdmF0ZSBSZWN0IG1Db250YWluaW5nRnJhbWUgPSBuZXcgUmVjdCgpOworICAgICAgICBwcml2YXRlIFJlY3QgbVBhcmVudEZyYW1lID0gbmV3IFJlY3QoKTsKKyAgICAgICAgcHJpdmF0ZSBSZWN0IG1Db250ZW50RnJhbWUgPSBuZXcgUmVjdCgpOworICAgICAgICBwcml2YXRlIFJlY3QgbUZyYW1lID0gbmV3IFJlY3QoKTsKKyAgICAgICAgcHJpdmF0ZSBSZWN0IG1TdXJmYWNlSW5zZXRzID0gbmV3IFJlY3QoKTsKKyAgICAgICAgcHJpdmF0ZSBSZWN0IG1Db250ZW50SW5zZXRzID0gbmV3IFJlY3QoKTsKKyAgICAgICAgcHJpdmF0ZSBSZWN0IG1HaXZlbkNvbnRlbnRJbnNldHMgPSBuZXcgUmVjdCgpOworICAgICAgICBwcml2YXRlIFJlY3QgbUNyb3AgPSBuZXcgUmVjdCgpOworCisgICAgICAgIFdpbmRvd1N0YXRlKFdpbmRvd1N0YXRlUHJvdG8gcHJvdG8pIHsKKyAgICAgICAgICAgIHN1cGVyKHByb3RvLndpbmRvd0NvbnRhaW5lcik7CisgICAgICAgICAgICBJZGVudGlmaWVyUHJvdG8gaWRlbnRpZmllclByb3RvID0gcHJvdG8uaWRlbnRpZmllcjsKKyAgICAgICAgICAgIG1OYW1lID0gaWRlbnRpZmllclByb3RvLnRpdGxlOworICAgICAgICAgICAgbUFwcFRva2VuID0gSW50ZWdlci50b0hleFN0cmluZyhpZGVudGlmaWVyUHJvdG8uaGFzaENvZGUpOworICAgICAgICAgICAgbURpc3BsYXlJZCA9IHByb3RvLmRpc3BsYXlJZDsKKyAgICAgICAgICAgIG1TdGFja0lkID0gcHJvdG8uc3RhY2tJZDsKKyAgICAgICAgICAgIGlmIChwcm90by5hdHRyaWJ1dGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtVHlwZSA9IHByb3RvLmF0dHJpYnV0ZXMudHlwZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFdpbmRvd1N0YXRlQW5pbWF0b3JQcm90byBhbmltYXRvclByb3RvID0gcHJvdG8uYW5pbWF0b3I7CisgICAgICAgICAgICBpZiAoYW5pbWF0b3JQcm90byAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGFuaW1hdG9yUHJvdG8uc3VyZmFjZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIFdpbmRvd1N1cmZhY2VDb250cm9sbGVyUHJvdG8gc3VyZmFjZVByb3RvID0gYW5pbWF0b3JQcm90by5zdXJmYWNlOworICAgICAgICAgICAgICAgICAgICBtU2hvd24gPSBzdXJmYWNlUHJvdG8uc2hvd247CisgICAgICAgICAgICAgICAgICAgIG1MYXllciA9IHN1cmZhY2VQcm90by5sYXllcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUNyb3AgPSBleHRyYWN0KGFuaW1hdG9yUHJvdG8ubGFzdENsaXBSZWN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1HaXZlbkNvbnRlbnRJbnNldHMgPSBleHRyYWN0KHByb3RvLmdpdmVuQ29udGVudEluc2V0cyk7CisgICAgICAgICAgICBtRnJhbWUgPSBleHRyYWN0KHByb3RvLmZyYW1lKTsKKyAgICAgICAgICAgIG1Db250YWluaW5nRnJhbWUgPSBleHRyYWN0KHByb3RvLmNvbnRhaW5pbmdGcmFtZSk7CisgICAgICAgICAgICBtUGFyZW50RnJhbWUgPSBleHRyYWN0KHByb3RvLnBhcmVudEZyYW1lKTsKKyAgICAgICAgICAgIG1Db250ZW50RnJhbWUgPSBleHRyYWN0KHByb3RvLmNvbnRlbnRGcmFtZSk7CisgICAgICAgICAgICBtQ29udGVudEluc2V0cyA9IGV4dHJhY3QocHJvdG8uY29udGVudEluc2V0cyk7CisgICAgICAgICAgICBtU3VyZmFjZUluc2V0cyA9IGV4dHJhY3QocHJvdG8uc3VyZmFjZUluc2V0cyk7CisgICAgICAgICAgICBpZiAobU5hbWUuc3RhcnRzV2l0aChTVEFSVElOR19XSU5ET1dfUFJFRklYKSkgeworICAgICAgICAgICAgICAgIG1XaW5kb3dUeXBlID0gV0lORE9XX1RZUEVfU1RBUlRJTkc7CisgICAgICAgICAgICAgICAgLy8gRXhpc3RpbmcgY29kZSBkZXBlbmRzIG9uIHRoZSBwcmVmaXggYmVpbmcgcmVtb3ZlZAorICAgICAgICAgICAgICAgIG1OYW1lID0gbU5hbWUuc3Vic3RyaW5nKFNUQVJUSU5HX1dJTkRPV19QUkVGSVgubGVuZ3RoKCkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChwcm90by5hbmltYXRpbmdFeGl0KSB7CisgICAgICAgICAgICAgICAgbVdpbmRvd1R5cGUgPSBXSU5ET1dfVFlQRV9FWElUSU5HOworICAgICAgICAgICAgfSBlbHNlIGlmIChtTmFtZS5zdGFydHNXaXRoKERFQlVHR0VSX1dJTkRPV19QUkVGSVgpKSB7CisgICAgICAgICAgICAgICAgbVdpbmRvd1R5cGUgPSBXSU5ET1dfVFlQRV9TVEFSVElORzsKKyAgICAgICAgICAgICAgICBtTmFtZSA9IG1OYW1lLnN1YnN0cmluZyhERUJVR0dFUl9XSU5ET1dfUFJFRklYLmxlbmd0aCgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVdpbmRvd1R5cGUgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm90by5jaGlsZFdpbmRvd3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBXaW5kb3dTdGF0ZVByb3RvIGNoaWxkUHJvdG8gPSBwcm90by5jaGlsZFdpbmRvd3NbaV07CisgICAgICAgICAgICAgICAgV2luZG93U3RhdGUgY2hpbGRXaW5kb3cgPSBuZXcgV2luZG93U3RhdGUoY2hpbGRQcm90byk7CisgICAgICAgICAgICAgICAgbVN1YldpbmRvd3MuYWRkKGNoaWxkV2luZG93KTsKKyAgICAgICAgICAgICAgICBtU3ViV2luZG93cy5hZGRBbGwoY2hpbGRXaW5kb3cuZ2V0V2luZG93cygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBOb25OdWxsCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBnZXRUb2tlbigpIHsKKyAgICAgICAgICAgIHJldHVybiBtQXBwVG9rZW47CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGlzU3RhcnRpbmdXaW5kb3coKSB7CisgICAgICAgICAgICByZXR1cm4gbVdpbmRvd1R5cGUgPT0gV0lORE9XX1RZUEVfU1RBUlRJTkc7CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGlzRXhpdGluZ1dpbmRvdygpIHsKKyAgICAgICAgICAgIHJldHVybiBtV2luZG93VHlwZSA9PSBXSU5ET1dfVFlQRV9FWElUSU5HOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBpc0RlYnVnZ2VyV2luZG93KCkgeworICAgICAgICAgICAgcmV0dXJuIG1XaW5kb3dUeXBlID09IFdJTkRPV19UWVBFX0RFQlVHR0VSOworICAgICAgICB9CisKKyAgICAgICAgaW50IGdldERpc3BsYXlJZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtRGlzcGxheUlkOworICAgICAgICB9CisKKyAgICAgICAgaW50IGdldFN0YWNrSWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbVN0YWNrSWQ7CisgICAgICAgIH0KKworICAgICAgICBSZWN0IGdldENvbnRhaW5pbmdGcmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ29udGFpbmluZ0ZyYW1lOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFJlY3QgZ2V0RnJhbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbUZyYW1lOworICAgICAgICB9CisKKyAgICAgICAgUmVjdCBnZXRTdXJmYWNlSW5zZXRzKCkgeworICAgICAgICAgICAgcmV0dXJuIG1TdXJmYWNlSW5zZXRzOworICAgICAgICB9CisKKyAgICAgICAgUmVjdCBnZXRDb250ZW50SW5zZXRzKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Db250ZW50SW5zZXRzOworICAgICAgICB9CisKKyAgICAgICAgUmVjdCBnZXRHaXZlbkNvbnRlbnRJbnNldHMoKSB7CisgICAgICAgICAgICByZXR1cm4gbUdpdmVuQ29udGVudEluc2V0czsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBSZWN0IGdldENvbnRlbnRGcmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ29udGVudEZyYW1lOworICAgICAgICB9CisKKyAgICAgICAgUmVjdCBnZXRQYXJlbnRGcmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtUGFyZW50RnJhbWU7CisgICAgICAgIH0KKworICAgICAgICBSZWN0IGdldENyb3AoKSB7CisgICAgICAgICAgICByZXR1cm4gbUNyb3A7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1Nob3duKCkgeworICAgICAgICAgICAgcmV0dXJuIG1TaG93bjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtVHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGdldFdpbmRvd1R5cGVTdWZmaXgoaW50IHdpbmRvd1R5cGUpIHsKKyAgICAgICAgICAgIHN3aXRjaCAod2luZG93VHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgV0lORE9XX1RZUEVfU1RBUlRJTkc6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiIFNUQVJUSU5HIjsKKyAgICAgICAgICAgICAgICBjYXNlIFdJTkRPV19UWVBFX0VYSVRJTkc6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiIEVYSVRJTkciOworICAgICAgICAgICAgICAgIGNhc2UgV0lORE9XX1RZUEVfREVCVUdHRVI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiIERFQlVHR0VSIjsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJXaW5kb3dTdGF0ZTogeyIgKyBtQXBwVG9rZW4gKyAiICIgKyBtTmFtZQorICAgICAgICAgICAgICAgICAgICArIGdldFdpbmRvd1R5cGVTdWZmaXgobVdpbmRvd1R5cGUpICsgIn0iICsgIiB0eXBlPSIgKyBtVHlwZQorICAgICAgICAgICAgICAgICAgICArICIgY2Y9IiArIG1Db250YWluaW5nRnJhbWUgKyAiIHBmPSIgKyBtUGFyZW50RnJhbWU7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvdXRpbC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vc2V0dGluZ3MvU2V0dGluZ3NTZXNzaW9uLmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS9hY3Rpdml0eW1hbmFnZXIvdXRpbC9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vc2V0dGluZ3MvU2V0dGluZ3NTZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM2YTMyYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci91dGlsL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9zZXR0aW5ncy9TZXR0aW5nc1Nlc3Npb24uamF2YQpAQCAtMCwwICsxLDE2NSBAQAorcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbS5zZXR0aW5nczsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU2V0dGluZ05vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk5vbk51bGw7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogSGVscGVyIGNsYXNzIHRvIHNhdmUsIHNldCwgYW5kIHJlc3RvcmUgZ2xvYmFsIHN5c3RlbS1sZXZlbCBwcmVmZXJlbmNlcy4KKyAqIDxwPgorICogVG8gdXNlIHRoaXMgY2xhc3MsIHRlc3RpbmcgQVBLIG11c3QgYmUgc2VsZi1pbnN0cnVtZW50ZWQgYW5kIGhhdmUKKyAqIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jV1JJVEVfU0VDVVJFX1NFVFRJTkdTfS4KKyAqIDxwPgorICogQSB0ZXN0IHRoYXQgY2hhbmdlcyBzeXN0ZW0tbGV2ZWwgcHJlZmVyZW5jZXMgY2FuIGJlIHdyaXR0ZW4gZWFzaWx5IGFuZCByZWxpYWJseS4KKyAqIDxwcmU+CisgKiBzdGF0aWMgY2xhc3MgUHJlZlNlc3Npb24gZXh0ZW5kcyBTZXR0aW5nc1Nlc3Npb248U3RyaW5nPiB7CisgKiAgICAgUHJlZlNlc3Npb24oKSB7CisgKiAgICAgICAgIHN1cGVyKGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU2VjdXJlLmdldFVyaUZvcigKKyAqICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlNlY3VyZS5QUkVGRVJFTkNFX0tFWSksCisgKiAgICAgICAgICAgICAgIGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU2VjdXJlOjpnZXRTdHJpbmcsCisgKiAgICAgICAgICAgICAgIGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU2VjdXJlOjpwdXRTdHJpbmcpOworICogICAgIH0KKyAqIH0KKyAqCisgKiBAVGVzdAorICogcHVibGljIHZvaWQgZG9UZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgKiAgICAgdHJ5IChmaW5hbCBQcmVmU2Vzc2lvbiBwcmVmU2Vzc2lvbiA9IG5ldyBQcmVmU2Vzc2lvbigpKSB7CisgKiAgICAgICAgIHByZWZTZXNzaW9uLnNldCgidmFsdWUgMSIpOworICogICAgICAgICBkb1Rlc3QxKCk7CisgKiAgICAgICAgIHByZWZTZXNzaW9uLnNldCgidmFsdWUgMiIpOworICogICAgICAgICBkb1Rlc3QyKCk7CisgKiAgICAgfQorICogfQorICogPC9wcmU+CisgKi8KK3B1YmxpYyBjbGFzcyBTZXR0aW5nc1Nlc3Npb248VD4gaW1wbGVtZW50cyBBdXRvQ2xvc2VhYmxlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gU2V0dGluZ3NTZXNzaW9uLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7CisKKyAgICBARnVuY3Rpb25hbEludGVyZmFjZQorICAgIHB1YmxpYyBpbnRlcmZhY2UgU2V0dGluZ3NHZXR0ZXI8VD4geworICAgICAgICBUIGdldChDb250ZW50UmVzb2x2ZXIgY3IsIFN0cmluZyBrZXkpIHRocm93cyBTZXR0aW5nTm90Rm91bmRFeGNlcHRpb247CisgICAgfQorCisgICAgQEZ1bmN0aW9uYWxJbnRlcmZhY2UKKyAgICBwdWJsaWMgaW50ZXJmYWNlIFNldHRpbmdzU2V0dGVyPFQ+IHsKKyAgICAgICAgdm9pZCBzZXQoQ29udGVudFJlc29sdmVyIGNyLCBTdHJpbmcga2V5LCBUIHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUbyBkZWJ1ZyB0byBkZXRlY3QgbmVzdGVkIHNlc3Npb25zIGZvciB0aGUgc2FtZSBrZXkuIEVuYWJsZWQgd2hlbiB7QGxpbmsgI0RFQlVHfSBpcyB0cnVlLgorICAgICAqIE5vdGUgdGhhdCBuZXN0ZWQgc2Vzc2lvbnMgY2FuIGJlIG1lcmdlZCBpbnRvIG9uZSBzZXNzaW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNlc3Npb25Db3VudGVycyBzU2Vzc2lvbkNvdW50ZXJzID0gbmV3IFNlc3Npb25Db3VudGVycygpOworCisgICAgcHJvdGVjdGVkIGZpbmFsIFVyaSBtVXJpOworICAgIHByaXZhdGUgZmluYWwgU2V0dGluZ3NHZXR0ZXI8VD4gbUdldHRlcjsKKyAgICBwcml2YXRlIGZpbmFsIFNldHRpbmdzU2V0dGVyPFQ+IG1TZXR0ZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1IYXNJbml0aWFsVmFsdWU7CisgICAgcHJpdmF0ZSBmaW5hbCBUIG1Jbml0aWFsVmFsdWU7CisKKyAgICBwdWJsaWMgU2V0dGluZ3NTZXNzaW9uKGZpbmFsIFVyaSB1cmksIGZpbmFsIFNldHRpbmdzR2V0dGVyPFQ+IGdldHRlciwKKyAgICAgICAgICAgIGZpbmFsIFNldHRpbmdzU2V0dGVyPFQ+IHNldHRlcikgeworICAgICAgICBtVXJpID0gdXJpOworICAgICAgICBtR2V0dGVyID0gZ2V0dGVyOworICAgICAgICBtU2V0dGVyID0gc2V0dGVyOworICAgICAgICBUIGluaXRpYWxWYWx1ZTsKKyAgICAgICAgYm9vbGVhbiBoYXNJbml0aWFsVmFsdWU7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbml0aWFsVmFsdWUgPSBnZXQodXJpLCBnZXR0ZXIpOworICAgICAgICAgICAgaGFzSW5pdGlhbFZhbHVlID0gdHJ1ZTsKKyAgICAgICAgfSBjYXRjaCAoU2V0dGluZ05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGluaXRpYWxWYWx1ZSA9IG51bGw7CisgICAgICAgICAgICBoYXNJbml0aWFsVmFsdWUgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBtSW5pdGlhbFZhbHVlID0gaW5pdGlhbFZhbHVlOworICAgICAgICBtSGFzSW5pdGlhbFZhbHVlID0gaGFzSW5pdGlhbFZhbHVlOworICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgInN0YXJ0OiB1cmk9IiArIHVyaQorICAgICAgICAgICAgICAgICAgICArIChtSGFzSW5pdGlhbFZhbHVlID8gIiB2YWx1ZT0iICsgbUluaXRpYWxWYWx1ZSA6ICIgdW5kZWZpbmVkIikpOworICAgICAgICAgICAgc1Nlc3Npb25Db3VudGVycy5vcGVuKHVyaSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXQoZmluYWwgQE5vbk51bGwgVCB2YWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHB1dChtVXJpLCBtU2V0dGVyLCB2YWx1ZSk7CisgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgTG9nLmkoVEFHLCAiICBzZXQ6IHVyaT0iICsgbVVyaSArICIgdmFsdWU9IiArIHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBUIGdldCgpIHRocm93cyBTZXR0aW5nTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2V0KG1VcmksIG1HZXR0ZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChtSGFzSW5pdGlhbFZhbHVlKSB7CisgICAgICAgICAgICBwdXQobVVyaSwgbVNldHRlciwgbUluaXRpYWxWYWx1ZSk7CisgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJjbG9zZTogdXJpPSIgKyBtVXJpICsgIiB2YWx1ZT0iICsgbUluaXRpYWxWYWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGRlbGV0ZShtVXJpKTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiY2xvc2U6IHVyaT0iICsgbVVyaSArICIgZGVsZXRlZCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2FuJ3QgZGVsZXRlIHNldHRpbmdzICIgKyBtVXJpLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIHNTZXNzaW9uQ291bnRlcnMuY2xvc2UobVVyaSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyA8VD4gdm9pZCBwdXQoZmluYWwgVXJpIHVyaSwgZmluYWwgU2V0dGluZ3NTZXR0ZXI8VD4gc2V0dGVyLCBUIHZhbHVlKQorICAgICAgICAgICAgdGhyb3dzIFNldHRpbmdOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIHNldHRlci5zZXQoZ2V0Q29udGVudFJlc29sdmVyKCksIHVyaS5nZXRMYXN0UGF0aFNlZ21lbnQoKSwgdmFsdWUpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIDxUPiBUIGdldChmaW5hbCBVcmkgdXJpLCBmaW5hbCBTZXR0aW5nc0dldHRlcjxUPiBnZXR0ZXIpCisgICAgICAgICAgICB0aHJvd3MgU2V0dGluZ05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdldHRlci5nZXQoZ2V0Q29udGVudFJlc29sdmVyKCksIHVyaS5nZXRMYXN0UGF0aFNlZ21lbnQoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBkZWxldGUoZmluYWwgVXJpIHVyaSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgIGdldENvbnRlbnRSZXNvbHZlcigpLmRlbGV0ZSh1cmksIG51bGwsIG51bGwpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIENvbnRlbnRSZXNvbHZlciBnZXRDb250ZW50UmVzb2x2ZXIoKSB7CisgICAgICAgIHJldHVybiBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRUYXJnZXRDb250ZXh0KCkuZ2V0Q29udGVudFJlc29sdmVyKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2Vzc2lvbkNvdW50ZXJzIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBNYXA8VXJpLCBJbnRlZ2VyPiBtT3BlblNlc3Npb25zID0gbmV3IEhhc2hNYXA8PigpOworCisgICAgICAgIHZvaWQgb3BlbihmaW5hbCBVcmkgdXJpKSB7CisgICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIGNvdW50ID0gbU9wZW5TZXNzaW9ucy5nZXQodXJpKTsKKyAgICAgICAgICAgIGlmIChjb3VudCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbU9wZW5TZXNzaW9ucy5wdXQodXJpLCAxKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtT3BlblNlc3Npb25zLnB1dCh1cmksIGNvdW50ICsgMSk7CisgICAgICAgICAgICBMb2cudyhUQUcsICJPcGVuIG5lc3RlZCBzZXNzaW9uIGZvciAiICsgdXJpLCBuZXcgVGhyb3dhYmxlKCkpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBjbG9zZShmaW5hbCBVcmkgdXJpKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtT3BlblNlc3Npb25zLmdldCh1cmkpOworICAgICAgICAgICAgaWYgKGNvdW50ID09IDEpIHsKKyAgICAgICAgICAgICAgICBtT3BlblNlc3Npb25zLnJlbW92ZSh1cmkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1PcGVuU2Vzc2lvbnMucHV0KHVyaSwgY291bnQgLSAxKTsKKyAgICAgICAgICAgIExvZy53KFRBRywgIkNsb3NlIG5lc3RlZCBzZXNzaW9uIGZvciAiICsgdXJpLCBuZXcgVGhyb3dhYmxlKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2Uvd2luZG93bWFuYWdlci9BbmRyb2lkLm1rIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2Uvd2luZG93bWFuYWdlci9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZTAwMmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS93aW5kb3dtYW5hZ2VyL0FuZHJvaWQubWsKQEAgLTAsMCArMSw0NiBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzIG9wdGlvbmFsCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpIFwKKyAgICAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIGFsZXJ0d2luZG93c2VydmljZS9zcmMpIFwKKyAgICAkKGNhbGwgYWxsLW5hbWVkLWZpbGVzLXVuZGVyLENvbXBvbmVudHMuamF2YSwgYWxlcnR3aW5kb3dhcHApIFwKKyAgICAkKGNhbGwgYWxsLW5hbWVkLWZpbGVzLXVuZGVyLENvbXBvbmVudHMuamF2YSwgYWxlcnR3aW5kb3dhcHBzZGsyNSkKKworTE9DQUxfUkVTT1VSQ0VfRElSIDo9ICQoTE9DQUxfUEFUSCkvcmVzCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNXaW5kb3dNYW5hZ2VyRGV2aWNlVGVzdENhc2VzCisKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIuc3R1YnMKKworTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKKyAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBcCisgICAgYW5kcm9pZHgudGVzdC5ydWxlcyBoYW1jcmVzdC1saWJyYXJ5IFwKKyAgICBwbGF0Zm9ybS10ZXN0LWFubm90YXRpb25zIFwKKyAgICBjdHMtYW13bS11dGlsCisKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzIGN0c19pbnN0YW50CisKK0xPQ0FMX1NES19WRVJTSU9OIDo9IHRlc3RfY3VycmVudAorCitpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCisKK2luY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL3dpbmRvd21hbmFnZXIvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL3dpbmRvd21hbmFnZXIvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWZmMGY0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2Uvd2luZG93bWFuYWdlci9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsNDkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgICBwYWNrYWdlPSJhbmRyb2lkLnNlcnZlci5jdHMud20iCisgICAgICAgICAgYW5kcm9pZDp0YXJnZXRTYW5kYm94VmVyc2lvbj0iMiI+CisKKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLk1BTkFHRV9BQ1RJVklUWV9TVEFDS1MiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5BQ1RJVklUWV9FTUJFRERJTkciIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5QQUNLQUdFX1VTQUdFX1NUQVRTIiAvPgorCisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFiZWw9IkN0c1dpbmRvd01hbmFnZXJEZXZpY2VUZXN0Q2FzZXMiPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIvPgorCisgICAgICAgIDxzZXJ2aWNlCisgICAgICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc2VydmVyLndtLlRlc3RMb2dTZXJ2aWNlIgorICAgICAgICAgICAgYW5kcm9pZDplbmFibGVkPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSI+CisgICAgICAgIDwvc2VydmljZT4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnNlcnZlci53bS5BbGVydFdpbmRvd3NBcHBPcHNUZXN0c0FjdGl2aXR5Ii8+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc2VydmVyLndtLkRpYWxvZ0ZyYW1lVGVzdEFjdGl2aXR5IiAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnNlcnZlci53bS5EaXNwbGF5Q3V0b3V0VGVzdHMkVGVzdEFjdGl2aXR5IiAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnNlcnZlci53bS5Mb2NhdGlvbk9uU2NyZWVuVGVzdHMkVGVzdEFjdGl2aXR5IgorICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQHN0eWxlL25vX3N0YXJ0aW5nX3dpbmRvdyIgLz4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zZXJ2ZXIud20uTG9jYXRpb25JbldpbmRvd1Rlc3RzJFRlc3RBY3Rpdml0eSIgLz4KKworICAgIDwvYXBwbGljYXRpb24+CisKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLnNlcnZlci5jdHMud20iCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgdGVzdHMgb2YgV2luZG93TWFuYWdlciI+CisgICAgPC9pbnN0cnVtZW50YXRpb24+CisKKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS93aW5kb3dtYW5hZ2VyL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL3dpbmRvd21hbmFnZXIvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzN2FkYTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS93aW5kb3dtYW5hZ2VyL0FuZHJvaWRUZXN0LnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIFdpbmRvd01hbmFnZXIgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KKyAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImZyYW1ld29yayIvPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRhcmdldHByZXAuTG9jYXRpb25DaGVjayIvPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c1dpbmRvd01hbmFnZXJEZXZpY2VUZXN0Q2FzZXMuYXBrIi8+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJDdHNEcmFnQW5kRHJvcFNvdXJjZUFwcC5hcGsiLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0RyYWdBbmREcm9wVGFyZ2V0QXBwLmFwayIvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzRGV2aWNlQWxlcnRXaW5kb3dUZXN0QXBwLmFwayIvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzQWxlcnRXaW5kb3dTZXJ2aWNlLmFwayIvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDwhLS0gU29tZSBvbGRlciBhcGsgY2Fubm90IGJlIGluc3RhbGxlZCBhcyBpbnN0YW50LCBzbyB3ZSBmb3JjZSB0aGVtIGZ1bGwgbW9kZSAtLT4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIi8+CisgICAgICAgIDxvcHRpb24gbmFtZT0iZm9yY2UtaW5zdGFsbC1tb2RlIiB2YWx1ZT0iRlVMTCIvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzRHJhZ0FuZERyb3BUYXJnZXRBcHBTZGsyMy5hcGsiLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0RldmljZUFsZXJ0V2luZG93VGVzdEFwcFNkazI1LmFwayIvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5BbmRyb2lkSlVuaXRUZXN0Ij4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwYWNrYWdlIiB2YWx1ZT0iYW5kcm9pZC5zZXJ2ZXIuY3RzLndtIi8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVudGltZS1oaW50IiB2YWx1ZT0iOG0iLz4KKyAgICA8L3Rlc3Q+CisKKzwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL3dpbmRvd21hbmFnZXIvYWxlcnR3aW5kb3dhcHAvQW5kcm9pZC5tayBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL3dpbmRvd21hbmFnZXIvYWxlcnR3aW5kb3dhcHAvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjRiZjhlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2Uvd2luZG93bWFuYWdlci9hbGVydHdpbmRvd2FwcC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzUgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworIyBEb24ndCBpbmNsdWRlIHRoaXMgcGFja2FnZSBpbiBhbnkgdGFyZ2V0LgorTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKKworTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGN0cy1hbS1hcHAtYmFzZQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKSBcCisgICAgJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCAuLi9hbGVydHdpbmRvd2FwcHNkazI1L3NyYykgXAorCitMT0NBTF9TREtfVkVSU0lPTiA6PSB0ZXN0X2N1cnJlbnQKKworIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMgY3RzX2luc3RhbnQKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0RldmljZUFsZXJ0V2luZG93VGVzdEFwcAorCitpbmNsdWRlICQoQlVJTERfQ1RTX1NVUFBPUlRfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL3dpbmRvd21hbmFnZXIvYWxlcnR3aW5kb3dhcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL3dpbmRvd21hbmFnZXIvYWxlcnR3aW5kb3dhcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wMDI2OGRhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2Uvd2luZG93bWFuYWdlci9hbGVydHdpbmRvd2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgICB4bWxuczphbmRyb2lkcHJ2PSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcHJ2L3Jlcy9hbmRyb2lkIgorICAgICAgICAgIHBhY2thZ2U9ImFuZHJvaWQuc2VydmVyLndtLmFsZXJ0d2luZG93YXBwIgorICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0U2FuZGJveFZlcnNpb249IjIiPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uU1lTVEVNX0FMRVJUX1dJTkRPVyIgLz4KKworICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJDdHNBbGVydFdpbmRvdyI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5BbGVydFdpbmRvd1Rlc3RBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiIGFuZHJvaWQ6d2luZG93U29mdElucHV0TW9kZT0ic3RhdGVBbHdheXNWaXNpYmxlIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIi8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgPC9hcHBsaWNhdGlvbj4KKzwvbWFuaWZlc3Q+CisKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL3dpbmRvd21hbmFnZXIvYWxlcnR3aW5kb3dhcHAvc3JjL2FuZHJvaWQvc2VydmVyL3dtL2FsZXJ0d2luZG93YXBwL0FsZXJ0V2luZG93VGVzdEFjdGl2aXR5LmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS93aW5kb3dtYW5hZ2VyL2FsZXJ0d2luZG93YXBwL3NyYy9hbmRyb2lkL3NlcnZlci93bS9hbGVydHdpbmRvd2FwcC9BbGVydFdpbmRvd1Rlc3RBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxODVkZDYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS93aW5kb3dtYW5hZ2VyL2FsZXJ0d2luZG93YXBwL3NyYy9hbmRyb2lkL3NlcnZlci93bS9hbGVydHdpbmRvd2FwcC9BbGVydFdpbmRvd1Rlc3RBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIud20uYWxlcnR3aW5kb3dhcHA7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnNlcnZlci53bS5hbGVydHdpbmRvd2FwcHNkazI1LkFsZXJ0V2luZG93VGVzdEJhc2VBY3Rpdml0eTsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9BUFBMSUNBVElPTl9PVkVSTEFZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9QSE9ORTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlRZUEVfUFJJT1JJVFlfUEhPTkU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5UWVBFX1NZU1RFTV9BTEVSVDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlRZUEVfU1lTVEVNX0VSUk9SOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9TWVNURU1fT1ZFUkxBWTsKKworcHVibGljIGNsYXNzIEFsZXJ0V2luZG93VGVzdEFjdGl2aXR5IGV4dGVuZHMgQWxlcnRXaW5kb3dUZXN0QmFzZUFjdGl2aXR5IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBBTEVSVF9XSU5ET1dfVFlQRVMgPSB7CisgICAgICAgICAgICBUWVBFX1BIT05FLAorICAgICAgICAgICAgVFlQRV9QUklPUklUWV9QSE9ORSwKKyAgICAgICAgICAgIFRZUEVfU1lTVEVNX0FMRVJULAorICAgICAgICAgICAgVFlQRV9TWVNURU1fRVJST1IsCisgICAgICAgICAgICBUWVBFX1NZU1RFTV9PVkVSTEFZLAorICAgICAgICAgICAgVFlQRV9BUFBMSUNBVElPTl9PVkVSTEFZCisgICAgfTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKKyAgICAgICAgY3JlYXRlQWxsQWxlcnRXaW5kb3dzKGdldFBhY2thZ2VOYW1lKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBpbnRbXSBnZXRBbGVydFdpbmRvd1R5cGVzKCkgeworICAgICAgICByZXR1cm4gQUxFUlRfV0lORE9XX1RZUEVTOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL3dpbmRvd21hbmFnZXIvYWxlcnR3aW5kb3dhcHAvc3JjL2FuZHJvaWQvc2VydmVyL3dtL2FsZXJ0d2luZG93YXBwL0NvbXBvbmVudHMuamF2YSBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL3dpbmRvd21hbmFnZXIvYWxlcnR3aW5kb3dhcHAvc3JjL2FuZHJvaWQvc2VydmVyL3dtL2FsZXJ0d2luZG93YXBwL0NvbXBvbmVudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDE4NjNiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2Uvd2luZG93bWFuYWdlci9hbGVydHdpbmRvd2FwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvd20vYWxlcnR3aW5kb3dhcHAvQ29tcG9uZW50cy5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLndtLmFsZXJ0d2luZG93YXBwOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5zZXJ2ZXIuYW0uY29tcG9uZW50LkNvbXBvbmVudHNCYXNlOworCitwdWJsaWMgY2xhc3MgQ29tcG9uZW50cyBleHRlbmRzIENvbXBvbmVudHNCYXNlIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcG9uZW50TmFtZSBBTEVSVF9XSU5ET1dfVEVTVF9BQ1RJVklUWSA9CisgICAgICAgICAgICBjb21wb25lbnQoQ29tcG9uZW50cy5jbGFzcywgIkFsZXJ0V2luZG93VGVzdEFjdGl2aXR5Iik7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS93aW5kb3dtYW5hZ2VyL2FsZXJ0d2luZG93YXBwc2RrMjUvQW5kcm9pZC5tayBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL3dpbmRvd21hbmFnZXIvYWxlcnR3aW5kb3dhcHBzZGsyNS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZDkwMmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS93aW5kb3dtYW5hZ2VyL2FsZXJ0d2luZG93YXBwc2RrMjUvQW5kcm9pZC5tawpAQCAtMCwwICsxLDM0IEBACisjIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKKyMgRG9uJ3QgaW5jbHVkZSB0aGlzIHBhY2thZ2UgaW4gYW55IHRhcmdldC4KK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCisKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjdHMtYW0tYXBwLWJhc2UKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykgXAorCitMT0NBTF9TREtfVkVSU0lPTiA6PSAyNQorCisjIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0CitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cyBjdHNfaW5zdGFudAorCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzRGV2aWNlQWxlcnRXaW5kb3dUZXN0QXBwU2RrMjUKKworaW5jbHVkZSAkKEJVSUxEX0NUU19TVVBQT1JUX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS93aW5kb3dtYW5hZ2VyL2FsZXJ0d2luZG93YXBwc2RrMjUvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL3dpbmRvd21hbmFnZXIvYWxlcnR3aW5kb3dhcHBzZGsyNS9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBhYzFjOTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS93aW5kb3dtYW5hZ2VyL2FsZXJ0d2luZG93YXBwc2RrMjUvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDMyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICB+IENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgIH4KKyAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIH4KKyAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICB+CisgIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgIC0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICAgIHBhY2thZ2U9ImFuZHJvaWQuc2VydmVyLndtLmFsZXJ0d2luZG93YXBwc2RrMjUiPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uU1lTVEVNX0FMRVJUX1dJTkRPVyIgLz4KKworICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJDdHNBbGVydFdpbmRvd1NkazI1Ij4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLkFsZXJ0V2luZG93VGVzdEFjdGl2aXR5U2RrMjUiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIiBhbmRyb2lkOndpbmRvd1NvZnRJbnB1dE1vZGU9InN0YXRlQWx3YXlzVmlzaWJsZSI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgIDwvYXBwbGljYXRpb24+Cis8L21hbmlmZXN0PgorCmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS93aW5kb3dtYW5hZ2VyL2FsZXJ0d2luZG93YXBwc2RrMjUvc3JjL2FuZHJvaWQvc2VydmVyL3dtL2FsZXJ0d2luZG93YXBwc2RrMjUvQWxlcnRXaW5kb3dUZXN0QWN0aXZpdHlTZGsyNS5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2Uvd2luZG93bWFuYWdlci9hbGVydHdpbmRvd2FwcHNkazI1L3NyYy9hbmRyb2lkL3NlcnZlci93bS9hbGVydHdpbmRvd2FwcHNkazI1L0FsZXJ0V2luZG93VGVzdEFjdGl2aXR5U2RrMjUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzA1N2YxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2Uvd2luZG93bWFuYWdlci9hbGVydHdpbmRvd2FwcHNkazI1L3NyYy9hbmRyb2lkL3NlcnZlci93bS9hbGVydHdpbmRvd2FwcHNkazI1L0FsZXJ0V2luZG93VGVzdEFjdGl2aXR5U2RrMjUuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLndtLmFsZXJ0d2luZG93YXBwc2RrMjU7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9QSE9ORTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlRZUEVfUFJJT1JJVFlfUEhPTkU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5UWVBFX1NZU1RFTV9BTEVSVDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlRZUEVfU1lTVEVNX0VSUk9SOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9TWVNURU1fT1ZFUkxBWTsKKworcHVibGljIGNsYXNzIEFsZXJ0V2luZG93VGVzdEFjdGl2aXR5U2RrMjUgZXh0ZW5kcyBBbGVydFdpbmRvd1Rlc3RCYXNlQWN0aXZpdHkgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIEFMRVJUX1dJTkRPV19UWVBFUyA9IHsKKyAgICAgICAgICAgIFRZUEVfUEhPTkUsCisgICAgICAgICAgICBUWVBFX1BSSU9SSVRZX1BIT05FLAorICAgICAgICAgICAgVFlQRV9TWVNURU1fQUxFUlQsCisgICAgICAgICAgICBUWVBFX1NZU1RFTV9FUlJPUiwKKyAgICAgICAgICAgIFRZUEVfU1lTVEVNX09WRVJMQVkKKyAgICB9OworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOworICAgICAgICBjcmVhdGVBbGxBbGVydFdpbmRvd3MoZ2V0UGFja2FnZU5hbWUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGludFtdIGdldEFsZXJ0V2luZG93VHlwZXMoKSB7CisgICAgICAgIHJldHVybiBBTEVSVF9XSU5ET1dfVFlQRVM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2Uvd2luZG93bWFuYWdlci9hbGVydHdpbmRvd2FwcHNkazI1L3NyYy9hbmRyb2lkL3NlcnZlci93bS9hbGVydHdpbmRvd2FwcHNkazI1L0FsZXJ0V2luZG93VGVzdEJhc2VBY3Rpdml0eS5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2Uvd2luZG93bWFuYWdlci9hbGVydHdpbmRvd2FwcHNkazI1L3NyYy9hbmRyb2lkL3NlcnZlci93bS9hbGVydHdpbmRvd2FwcHNkazI1L0FsZXJ0V2luZG93VGVzdEJhc2VBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMWI4ODYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS93aW5kb3dtYW5hZ2VyL2FsZXJ0d2luZG93YXBwc2RrMjUvc3JjL2FuZHJvaWQvc2VydmVyL3dtL2FsZXJ0d2luZG93YXBwc2RrMjUvQWxlcnRXaW5kb3dUZXN0QmFzZUFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci53bS5hbGVydHdpbmRvd2FwcHNkazI1OworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvaW50OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LkdyYXZpdHkuTEVGVDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LkdyYXZpdHkuVE9QOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfRk9DVVNBQkxFOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfVE9VQ0hBQkxFOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19XQVRDSF9PVVRTSURFX1RPVUNIOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWxlcnRXaW5kb3dUZXN0QmFzZUFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQWxsQWxlcnRXaW5kb3dzKFN0cmluZyB3aW5kb3dOYW1lKSB7CisgICAgICAgIGZpbmFsIGludFtdIGFsZXJ0V2luZG93VHlwZXMgPSBnZXRBbGVydFdpbmRvd1R5cGVzKCk7CisgICAgICAgIGZvciAoaW50IHR5cGUgOiBhbGVydFdpbmRvd1R5cGVzKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNyZWF0ZUFsZXJ0V2luZG93KHR5cGUsIHdpbmRvd05hbWUpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZSgiQWxlcnRXaW5kb3dUZXN0QmFzZUFjdGl2aXR5IiwgIkNhbid0IGNyZWF0ZSB0eXBlPSIgKyB0eXBlLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUFsZXJ0V2luZG93KGludCB0eXBlKSB7CisgICAgICAgIGNyZWF0ZUFsZXJ0V2luZG93KHR5cGUsIGdldFBhY2thZ2VOYW1lKCkpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUFsZXJ0V2luZG93KGludCB0eXBlLCBTdHJpbmcgd2luZG93TmFtZSkgeworICAgICAgICBpZiAoIWlzU3lzdGVtQWxlcnRXaW5kb3dUeXBlKHR5cGUpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJXZWxsLi4ueW91IGFyZSBub3QgYW4gYWxlcnQgd2luZG93IHR5cGU9IiArIHR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgUG9pbnQgc2l6ZSA9IG5ldyBQb2ludCgpOworICAgICAgICBmaW5hbCBXaW5kb3dNYW5hZ2VyIHdtID0gZ2V0U3lzdGVtU2VydmljZShXaW5kb3dNYW5hZ2VyLmNsYXNzKTsKKyAgICAgICAgd20uZ2V0RGVmYXVsdERpc3BsYXkoKS5nZXRTaXplKHNpemUpOworCisgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIHBhcmFtcyA9IG5ldyBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcygKKyAgICAgICAgICAgICAgICB0eXBlLCBGTEFHX05PVF9GT0NVU0FCTEUgfCBGTEFHX1dBVENIX09VVFNJREVfVE9VQ0ggfCBGTEFHX05PVF9UT1VDSEFCTEUpOworICAgICAgICBwYXJhbXMud2lkdGggPSBzaXplLnggLyAzOworICAgICAgICBwYXJhbXMuaGVpZ2h0ID0gc2l6ZS55IC8gMzsKKyAgICAgICAgcGFyYW1zLmdyYXZpdHkgPSBUT1AgfCBMRUZUOworICAgICAgICBwYXJhbXMuc2V0VGl0bGUod2luZG93TmFtZSk7CisKKyAgICAgICAgZmluYWwgVGV4dFZpZXcgdmlldyA9IG5ldyBUZXh0Vmlldyh0aGlzKTsKKyAgICAgICAgdmlldy5zZXRUZXh0KHdpbmRvd05hbWUgKyAiICAgdHlwZT0iICsgdHlwZSk7CisgICAgICAgIHZpZXcuc2V0QmFja2dyb3VuZENvbG9yKENvbG9yLlJFRCk7CisgICAgICAgIHdtLmFkZFZpZXcodmlldywgcGFyYW1zKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNTeXN0ZW1BbGVydFdpbmRvd1R5cGUoaW50IHR5cGUpIHsKKyAgICAgICAgZmluYWwgaW50W10gYWxlcnRXaW5kb3dUeXBlcyA9IGdldEFsZXJ0V2luZG93VHlwZXMoKTsKKyAgICAgICAgZm9yIChpbnQgY3VycmVudCA6IGFsZXJ0V2luZG93VHlwZXMpIHsKKyAgICAgICAgICAgIGlmIChjdXJyZW50ID09IHR5cGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IGludFtdIGdldEFsZXJ0V2luZG93VHlwZXMoKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL3dpbmRvd21hbmFnZXIvYWxlcnR3aW5kb3dhcHBzZGsyNS9zcmMvYW5kcm9pZC9zZXJ2ZXIvd20vYWxlcnR3aW5kb3dhcHBzZGsyNS9Db21wb25lbnRzLmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS93aW5kb3dtYW5hZ2VyL2FsZXJ0d2luZG93YXBwc2RrMjUvc3JjL2FuZHJvaWQvc2VydmVyL3dtL2FsZXJ0d2luZG93YXBwc2RrMjUvQ29tcG9uZW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MDU2NmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS93aW5kb3dtYW5hZ2VyL2FsZXJ0d2luZG93YXBwc2RrMjUvc3JjL2FuZHJvaWQvc2VydmVyL3dtL2FsZXJ0d2luZG93YXBwc2RrMjUvQ29tcG9uZW50cy5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLndtLmFsZXJ0d2luZG93YXBwc2RrMjU7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLnNlcnZlci5hbS5jb21wb25lbnQuQ29tcG9uZW50c0Jhc2U7CisKK3B1YmxpYyBjbGFzcyBDb21wb25lbnRzIGV4dGVuZHMgQ29tcG9uZW50c0Jhc2UgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wb25lbnROYW1lIFNESzI1X0FMRVJUX1dJTkRPV19URVNUX0FDVElWSVRZID0KKyAgICAgICAgICAgIGNvbXBvbmVudChDb21wb25lbnRzLmNsYXNzLCAiQWxlcnRXaW5kb3dUZXN0QWN0aXZpdHlTZGsyNSIpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2Uvd2luZG93bWFuYWdlci9hbGVydHdpbmRvd3NlcnZpY2UvQW5kcm9pZC5tayBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL3dpbmRvd21hbmFnZXIvYWxlcnR3aW5kb3dzZXJ2aWNlL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk3NWFjZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL3dpbmRvd21hbmFnZXIvYWxlcnR3aW5kb3dzZXJ2aWNlL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzNyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAorICAgIGN0cy1hbS1hcHAtYmFzZSBcCisgICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgXAorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKSBcCisKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0FsZXJ0V2luZG93U2VydmljZQorCisjIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0CitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cyBjdHNfaW5zdGFudAorCitMT0NBTF9ERVhfUFJFT1BUIDo9IGZhbHNlCisKK2luY2x1ZGUgJChCVUlMRF9DVFNfU1VQUE9SVF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2Uvd2luZG93bWFuYWdlci9hbGVydHdpbmRvd3NlcnZpY2UvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL3dpbmRvd21hbmFnZXIvYWxlcnR3aW5kb3dzZXJ2aWNlL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgxNjRiNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL3dpbmRvd21hbmFnZXIvYWxlcnR3aW5kb3dzZXJ2aWNlL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAgfiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICB+CisgIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICB+CisgIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgfgorICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICAtLT4KKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgcGFja2FnZT0iYW5kcm9pZC5zZXJ2ZXIud20uYWxlcnR3aW5kb3dzZXJ2aWNlIgorICAgICAgIGFuZHJvaWQ6dGFyZ2V0U2FuZGJveFZlcnNpb249IjIiPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uU1lTVEVNX0FMRVJUX1dJTkRPVyIgLz4KKworICAgIDxhcHBsaWNhdGlvbj4KKyAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CisKKyAgICAgICAgPHNlcnZpY2UgYW5kcm9pZDpuYW1lPSIuQWxlcnRXaW5kb3dTZXJ2aWNlIgorICAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIi8+CisgICAgPC9hcHBsaWNhdGlvbj4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS93aW5kb3dtYW5hZ2VyL2FsZXJ0d2luZG93c2VydmljZS9zcmMvYW5kcm9pZC9zZXJ2ZXIvd20vYWxlcnR3aW5kb3dzZXJ2aWNlL0FsZXJ0V2luZG93U2VydmljZS5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2Uvd2luZG93bWFuYWdlci9hbGVydHdpbmRvd3NlcnZpY2Uvc3JjL2FuZHJvaWQvc2VydmVyL3dtL2FsZXJ0d2luZG93c2VydmljZS9BbGVydFdpbmRvd1NlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjg0ZmZmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2Uvd2luZG93bWFuYWdlci9hbGVydHdpbmRvd3NlcnZpY2Uvc3JjL2FuZHJvaWQvc2VydmVyL3dtL2FsZXJ0d2luZG93c2VydmljZS9BbGVydFdpbmRvd1NlcnZpY2UuamF2YQpAQCAtMCwwICsxLDE0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci53bS5hbGVydHdpbmRvd3NlcnZpY2U7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5Db2xvci5CTFVFOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuR3Jhdml0eS5MRUZUOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuR3Jhdml0eS5UT1A7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX05PVF9GT0NVU0FCTEU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX05PVF9UT1VDSEFCTEU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX1dBVENIX09VVFNJREVfVE9VQ0g7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5UWVBFX0FQUExJQ0FUSU9OX09WRVJMQVk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5TZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb2ludDsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NlbmdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CisKKy8qKiBTZXJ2aWNlIGZvciBjcmVhdGluZyBhbmQgbWFuYWdpbmcgYWxlcnQgd2luZG93cy4gKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBBbGVydFdpbmRvd1NlcnZpY2UgZXh0ZW5kcyBTZXJ2aWNlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQWxlcnRXaW5kb3dTZXJ2aWNlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9NRVNTRU5HRVIgPSAibWVzc2VuZ2VyIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19BRERfQUxFUlRfV0lORE9XID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfUkVNT1ZFX0FMRVJUX1dJTkRPVyA9IDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1JFTU9WRV9BTExfQUxFUlRfV0lORE9XUyA9IDM7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfT05fQUxFUlRfV0lORE9XX0FEREVEID0gNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfT05fQUxFUlRfV0lORE9XX1JFTU9WRUQgPSA1OworCisgICAgcHJpdmF0ZSBMaW5rZWRMaXN0PFZpZXc+IG1BbGVydFdpbmRvd3MgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisKKyAgICBwcml2YXRlIE1lc3NlbmdlciBtT3V0Z29pbmdNZXNzZW5nZXIgPSBudWxsOworICAgIHByaXZhdGUgZmluYWwgTWVzc2VuZ2VyIG1JbmNvbWluZ01lc3NlbmdlciA9IG5ldyBNZXNzZW5nZXIobmV3IEluY29taW5nSGFuZGxlcigpKTsKKworICAgIHByaXZhdGUgY2xhc3MgSW5jb21pbmdIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfQUREX0FMRVJUX1dJTkRPVzoKKyAgICAgICAgICAgICAgICAgICAgYWRkQWxlcnRXaW5kb3coKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfUkVNT1ZFX0FMRVJUX1dJTkRPVzoKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQWxlcnRXaW5kb3coKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfUkVNT1ZFX0FMTF9BTEVSVF9XSU5ET1dTOgorICAgICAgICAgICAgICAgICAgICByZW1vdmVBbGxBbGVydFdpbmRvd3MoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgc3VwZXIuaGFuZGxlTWVzc2FnZShtc2cpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFkZEFsZXJ0V2luZG93KCkgeworICAgICAgICBmaW5hbCBQb2ludCBzaXplID0gbmV3IFBvaW50KCk7CisgICAgICAgIGZpbmFsIFdpbmRvd01hbmFnZXIgd20gPSBnZXRTeXN0ZW1TZXJ2aWNlKFdpbmRvd01hbmFnZXIuY2xhc3MpOworICAgICAgICB3bS5nZXREZWZhdWx0RGlzcGxheSgpLmdldFNpemUoc2l6ZSk7CisKKyAgICAgICAgZmluYWwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgcGFyYW1zID0gbmV3IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zKAorICAgICAgICAgICAgICAgIFRZUEVfQVBQTElDQVRJT05fT1ZFUkxBWSwKKyAgICAgICAgICAgICAgICBGTEFHX05PVF9GT0NVU0FCTEUgfCBGTEFHX1dBVENIX09VVFNJREVfVE9VQ0ggfCBGTEFHX05PVF9UT1VDSEFCTEUpOworICAgICAgICBwYXJhbXMud2lkdGggPSBzaXplLnggLyAzOworICAgICAgICBwYXJhbXMuaGVpZ2h0ID0gc2l6ZS55IC8gMzsKKyAgICAgICAgcGFyYW1zLmdyYXZpdHkgPSBUT1AgfCBMRUZUOworCisgICAgICAgIGZpbmFsIFRleHRWaWV3IHZpZXcgPSBuZXcgVGV4dFZpZXcodGhpcyk7CisgICAgICAgIHZpZXcuc2V0VGV4dCgiQWxlcnRXaW5kb3dTZXJ2aWNlIiArIG1BbGVydFdpbmRvd3Muc2l6ZSgpKTsKKyAgICAgICAgdmlldy5zZXRCYWNrZ3JvdW5kQ29sb3IoQkxVRSk7CisgICAgICAgIHdtLmFkZFZpZXcodmlldywgcGFyYW1zKTsKKyAgICAgICAgbUFsZXJ0V2luZG93cy5hZGQodmlldyk7CisKKyAgICAgICAgaWYgKERFQlVHKSBMb2cuZShUQUcsICJhZGRBbGVydFdpbmRvdyAiICsgbUFsZXJ0V2luZG93cy5zaXplKCkpOworICAgICAgICBpZiAobU91dGdvaW5nTWVzc2VuZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbU91dGdvaW5nTWVzc2VuZ2VyLnNlbmQoTWVzc2FnZS5vYnRhaW4obnVsbCwgTVNHX09OX0FMRVJUX1dJTkRPV19BRERFRCkpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlbW92ZUFsZXJ0V2luZG93KCkgeworICAgICAgICBpZiAobUFsZXJ0V2luZG93cy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFdpbmRvd01hbmFnZXIgd20gPSBnZXRTeXN0ZW1TZXJ2aWNlKFdpbmRvd01hbmFnZXIuY2xhc3MpOworICAgICAgICB3bS5yZW1vdmVWaWV3KG1BbGVydFdpbmRvd3MucG9wKCkpOworCisgICAgICAgIGlmIChERUJVRykgTG9nLmUoVEFHLCAicmVtb3ZlQWxlcnRXaW5kb3cgIiArIG1BbGVydFdpbmRvd3Muc2l6ZSgpKTsKKyAgICAgICAgaWYgKG1PdXRnb2luZ01lc3NlbmdlciAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1PdXRnb2luZ01lc3Nlbmdlci5zZW5kKE1lc3NhZ2Uub2J0YWluKG51bGwsIE1TR19PTl9BTEVSVF9XSU5ET1dfUkVNT1ZFRCkpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlbW92ZUFsbEFsZXJ0V2luZG93cygpIHsKKyAgICAgICAgd2hpbGUgKG1BbGVydFdpbmRvd3Muc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgcmVtb3ZlQWxlcnRXaW5kb3coKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJQmluZGVyIG9uQmluZChJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIGlmIChERUJVRykgTG9nLmUoVEFHLCAib25CaW5kIik7CisgICAgICAgIG1PdXRnb2luZ01lc3NlbmdlciA9IGludGVudC5nZXRQYXJjZWxhYmxlRXh0cmEoRVhUUkFfTUVTU0VOR0VSKTsKKyAgICAgICAgcmV0dXJuIG1JbmNvbWluZ01lc3Nlbmdlci5nZXRCaW5kZXIoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvblVuYmluZChJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIGlmIChERUJVRykgTG9nLmUoVEFHLCAib25VbmJpbmQiKTsKKyAgICAgICAgcmVtb3ZlQWxsQWxlcnRXaW5kb3dzKCk7CisgICAgICAgIHJldHVybiBzdXBlci5vblVuYmluZChpbnRlbnQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL3dpbmRvd21hbmFnZXIvYWxlcnR3aW5kb3dzZXJ2aWNlL3NyYy9hbmRyb2lkL3NlcnZlci93bS9hbGVydHdpbmRvd3NlcnZpY2UvQ29tcG9uZW50cy5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2Uvd2luZG93bWFuYWdlci9hbGVydHdpbmRvd3NlcnZpY2Uvc3JjL2FuZHJvaWQvc2VydmVyL3dtL2FsZXJ0d2luZG93c2VydmljZS9Db21wb25lbnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZlNzRhNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL3dpbmRvd21hbmFnZXIvYWxlcnR3aW5kb3dzZXJ2aWNlL3NyYy9hbmRyb2lkL3NlcnZlci93bS9hbGVydHdpbmRvd3NlcnZpY2UvQ29tcG9uZW50cy5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLndtLmFsZXJ0d2luZG93c2VydmljZTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuc2VydmVyLmFtLmNvbXBvbmVudC5Db21wb25lbnRzQmFzZTsKKworcHVibGljIGNsYXNzIENvbXBvbmVudHMgZXh0ZW5kcyBDb21wb25lbnRzQmFzZSB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBvbmVudE5hbWUgQUxFUlRfV0lORE9XX1NFUlZJQ0UgPQorICAgICAgICAgICAgY29tcG9uZW50KENvbXBvbmVudHMuY2xhc3MsICJBbGVydFdpbmRvd1NlcnZpY2UiKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL3dpbmRvd21hbmFnZXIvZG5kc291cmNlYXBwL0FuZHJvaWQubWsgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS93aW5kb3dtYW5hZ2VyL2RuZHNvdXJjZWFwcC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMWE3ZTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS93aW5kb3dtYW5hZ2VyL2RuZHNvdXJjZWFwcC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzIgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworIyBEb24ndCBpbmNsdWRlIHRoaXMgcGFja2FnZSBpbiBhbnkgdGFyZ2V0LgorTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKSBcCisgICAgLi4vc3JjL2FuZHJvaWQvc2VydmVyL3dtL1Rlc3RMb2dDbGllbnQuamF2YQorCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CisKKyMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzIGN0c19pbnN0YW50CisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNEcmFnQW5kRHJvcFNvdXJjZUFwcAorCitpbmNsdWRlICQoQlVJTERfQ1RTX1NVUFBPUlRfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL3dpbmRvd21hbmFnZXIvZG5kc291cmNlYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS93aW5kb3dtYW5hZ2VyL2RuZHNvdXJjZWFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNDQ5ODEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS93aW5kb3dtYW5hZ2VyL2RuZHNvdXJjZWFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIHBhY2thZ2U9ImFuZHJvaWQuc2VydmVyLndtLmRuZHNvdXJjZWFwcCIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRTYW5kYm94VmVyc2lvbj0iMiI+CisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFiZWw9IkN0c0RuRFNvdXJjZSI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc2VydmVyLndtLmRuZHNvdXJjZWFwcC5EcmFnU291cmNlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29uZmlnQ2hhbmdlcz0ib3JpZW50YXRpb258c2NyZWVuU2l6ZXxzbWFsbGVzdFNjcmVlblNpemV8c2NyZWVuTGF5b3V0Ij4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIi8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPHByb3ZpZGVyIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zZXJ2ZXIud20uZG5kc291cmNlYXBwLkRyYWdTb3VyY2VDb250ZW50UHJvdmlkZXIiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmF1dGhvcml0aWVzPSJhbmRyb2lkLnNlcnZlci53bS5kbmRzb3VyY2UuY29udGVudHByb3ZpZGVyIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmFudFVyaVBlcm1pc3Npb25zPSJ0cnVlIi8+CisgICAgPC9hcHBsaWNhdGlvbj4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci93aW5kb3dtYW5hZ2VyL2RuZHNvdXJjZWFwcC9yZXMvbGF5b3V0L3NvdXJjZV9hY3Rpdml0eS54bWwgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS93aW5kb3dtYW5hZ2VyL2RuZHNvdXJjZWFwcC9yZXMvbGF5b3V0L3NvdXJjZV9hY3Rpdml0eS54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGhvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL3dpbmRvd21hbmFnZXIvZG5kc291cmNlYXBwL3Jlcy9sYXlvdXQvc291cmNlX2FjdGl2aXR5LnhtbApyZW5hbWUgdG8gdGVzdHMvZnJhbWV3b3JrL2Jhc2Uvd2luZG93bWFuYWdlci9kbmRzb3VyY2VhcHAvcmVzL2xheW91dC9zb3VyY2VfYWN0aXZpdHkueG1sCmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS93aW5kb3dtYW5hZ2VyL2RuZHNvdXJjZWFwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvd20vZG5kc291cmNlYXBwL0RyYWdTb3VyY2UuamF2YSBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL3dpbmRvd21hbmFnZXIvZG5kc291cmNlYXBwL3NyYy9hbmRyb2lkL3NlcnZlci93bS9kbmRzb3VyY2VhcHAvRHJhZ1NvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljN2VkN2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS93aW5kb3dtYW5hZ2VyL2RuZHNvdXJjZWFwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvd20vZG5kc291cmNlYXBwL0RyYWdTb3VyY2UuamF2YQpAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIud20uZG5kc291cmNlYXBwOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNsaXBEYXRhOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5DbGlwRGVzY3JpcHRpb247CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkZpbGVVcmlFeHBvc2VkRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuUGVyc2lzdGFibGVCdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5zZXJ2ZXIud20uVGVzdExvZ0NsaWVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKK3B1YmxpYyBjbGFzcyBEcmFnU291cmNlIGV4dGVuZHMgQWN0aXZpdHl7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9LRVlfU1RBUlRfRFJBRyA9ICJTVEFSVF9EUkFHIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVUxUX0tFWV9ERVRBSUxTID0gIkRFVEFJTFMiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRfT0sgPSAiT0siOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRfRVhDRVBUSU9OID0gIkV4Y2VwdGlvbiI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJX1BSRUZJWCA9CisgICAgICAgICAgICAiY29udGVudDovLyIgKyBEcmFnU291cmNlQ29udGVudFByb3ZpZGVyLkFVVEhPUklUWSArICIvZGF0YSI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFHSUNfVkFMVUUgPSAiNDIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVElNRU9VVF9DQU5DRUwgPSAxNTA7CisKKyAgICBwcml2YXRlIFRleHRWaWV3IG1UZXh0VmlldzsKKyAgICBwcml2YXRlIFRlc3RMb2dDbGllbnQgbUxvZ0NsaWVudDsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBtTG9nQ2xpZW50ID0gbmV3IFRlc3RMb2dDbGllbnQodGhpcywgZ2V0SW50ZW50KCkuZ2V0U3RyaW5nRXh0cmEoImxvZ3RhZyIpKTsKKworICAgICAgICBWaWV3IHZpZXcgPSBnZXRMYXlvdXRJbmZsYXRlcigpLmluZmxhdGUoUi5sYXlvdXQuc291cmNlX2FjdGl2aXR5LCBudWxsKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcodmlldyk7CisKKyAgICAgICAgZmluYWwgVXJpIHBsYWluVXJpID0gVXJpLnBhcnNlKFVSSV9QUkVGSVggKyAiLyIgKyBNQUdJQ19WQUxVRSk7CisKKyAgICAgICAgc2V0VXBEcmFnU291cmNlKCJkaXNhbGxvd19nbG9iYWwiLCBwbGFpblVyaSwgMCk7CisgICAgICAgIHNldFVwRHJhZ1NvdXJjZSgiY2FuY2VsX3Nvb24iLCBwbGFpblVyaSwgVmlldy5EUkFHX0ZMQUdfR0xPQkFMKTsKKworICAgICAgICBzZXRVcERyYWdTb3VyY2UoImdyYW50X25vbmUiLCBwbGFpblVyaSwgVmlldy5EUkFHX0ZMQUdfR0xPQkFMKTsKKyAgICAgICAgc2V0VXBEcmFnU291cmNlKCJncmFudF9yZWFkIiwgcGxhaW5VcmksCisgICAgICAgICAgICAgICAgVmlldy5EUkFHX0ZMQUdfR0xPQkFMIHwgVmlldy5EUkFHX0ZMQUdfR0xPQkFMX1VSSV9SRUFEKTsKKyAgICAgICAgc2V0VXBEcmFnU291cmNlKCJncmFudF93cml0ZSIsIHBsYWluVXJpLAorICAgICAgICAgICAgICAgIFZpZXcuRFJBR19GTEFHX0dMT0JBTCB8IFZpZXcuRFJBR19GTEFHX0dMT0JBTF9VUklfV1JJVEUpOworICAgICAgICBzZXRVcERyYWdTb3VyY2UoImdyYW50X3JlYWRfcGVyc2lzdGFibGUiLCBwbGFpblVyaSwKKyAgICAgICAgICAgICAgICBWaWV3LkRSQUdfRkxBR19HTE9CQUwgfCBWaWV3LkRSQUdfRkxBR19HTE9CQUxfVVJJX1JFQUQgfAorICAgICAgICAgICAgICAgICAgICAgICAgVmlldy5EUkFHX0ZMQUdfR0xPQkFMX1BFUlNJU1RBQkxFX1VSSV9QRVJNSVNTSU9OKTsKKworICAgICAgICBmaW5hbCBVcmkgcHJlZml4VXJpID0gVXJpLnBhcnNlKFVSSV9QUkVGSVgpOworCisgICAgICAgIHNldFVwRHJhZ1NvdXJjZSgiZ3JhbnRfcmVhZF9wcmVmaXgiLCBwcmVmaXhVcmksCisgICAgICAgICAgICAgICAgVmlldy5EUkFHX0ZMQUdfR0xPQkFMIHwgVmlldy5EUkFHX0ZMQUdfR0xPQkFMX1VSSV9SRUFEIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcuRFJBR19GTEFHX0dMT0JBTF9QUkVGSVhfVVJJX1BFUk1JU1NJT04pOworICAgICAgICBzZXRVcERyYWdTb3VyY2UoImdyYW50X3JlYWRfbm9wcmVmaXgiLCBwcmVmaXhVcmksCisgICAgICAgICAgICAgICAgVmlldy5EUkFHX0ZMQUdfR0xPQkFMIHwgVmlldy5EUkFHX0ZMQUdfR0xPQkFMX1VSSV9SRUFEKTsKKworICAgICAgICBmaW5hbCBVcmkgZmlsZVVyaSA9IFVyaS5mcm9tRmlsZShuZXcgRmlsZSgiL3NkY2FyZC9zYW1wbGUuanBnIikpOworCisgICAgICAgIHNldFVwRHJhZ1NvdXJjZSgiZmlsZV9sb2NhbCIsIGZpbGVVcmksIDApOworICAgICAgICBzZXRVcERyYWdTb3VyY2UoImZpbGVfZ2xvYmFsIiwgZmlsZVVyaSwgVmlldy5EUkFHX0ZMQUdfR0xPQkFMKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0VXBEcmFnU291cmNlKFN0cmluZyBtb2RlLCBmaW5hbCBVcmkgdXJpLCBmaW5hbCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgaWYgKCFtb2RlLmVxdWFscyhnZXRJbnRlbnQoKS5nZXRTdHJpbmdFeHRyYSgibW9kZSIpKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1UZXh0VmlldyA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuZHJhZ19zb3VyY2UpOworICAgICAgICBtVGV4dFZpZXcuc2V0VGV4dChtb2RlKTsKKyAgICAgICAgbVRleHRWaWV3LnNldE9uVG91Y2hMaXN0ZW5lcihuZXcgVmlldy5PblRvdWNoTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2goVmlldyB2LCBNb3Rpb25FdmVudCBldmVudCkgeworICAgICAgICAgICAgICAgIGlmIChldmVudC5nZXRBY3Rpb24oKSAhPSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsaXBEZXNjcmlwdGlvbiBjbGlwRGVzY3JpcHRpb24gPSBuZXcgQ2xpcERlc2NyaXB0aW9uKCIiLCBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaXBEZXNjcmlwdGlvbi5NSU1FVFlQRV9URVhUX1VSSUxJU1QgfSk7CisgICAgICAgICAgICAgICAgICAgIFBlcnNpc3RhYmxlQnVuZGxlIGV4dHJhcyA9IG5ldyBQZXJzaXN0YWJsZUJ1bmRsZSgxKTsKKyAgICAgICAgICAgICAgICAgICAgZXh0cmFzLnB1dFN0cmluZygiZXh0cmFLZXkiLCAiZXh0cmFWYWx1ZSIpOworICAgICAgICAgICAgICAgICAgICBjbGlwRGVzY3JpcHRpb24uc2V0RXh0cmFzKGV4dHJhcyk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsaXBEYXRhIGNsaXBEYXRhID0gbmV3IENsaXBEYXRhKGNsaXBEZXNjcmlwdGlvbiwgbmV3IENsaXBEYXRhLkl0ZW0odXJpKSk7CisgICAgICAgICAgICAgICAgICAgIHYuc3RhcnREcmFnQW5kRHJvcCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVmlldy5EcmFnU2hhZG93QnVpbGRlcih2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgbG9nUmVzdWx0KFJFU1VMVF9LRVlfU1RBUlRfRFJBRywgUkVTVUxUX09LKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChGaWxlVXJpRXhwb3NlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZ1Jlc3VsdChSRVNVTFRfS0VZX0RFVEFJTFMsIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgbG9nUmVzdWx0KFJFU1VMVF9LRVlfU1RBUlRfRFJBRywgUkVTVUxUX0VYQ0VQVElPTik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtb2RlLmVxdWFscygiY2FuY2VsX3Nvb24iKSkgeworICAgICAgICAgICAgICAgICAgICBuZXcgSGFuZGxlcigpLnBvc3REZWxheWVkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYuY2FuY2VsRHJhZ0FuZERyb3AoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSwgVElNRU9VVF9DQU5DRUwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGxvZ1Jlc3VsdChTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgbUxvZ0NsaWVudC5yZWNvcmQoa2V5LCB2YWx1ZSk7CisgICAgICAgIG1UZXh0Vmlldy5zZXRUZXh0KG1UZXh0Vmlldy5nZXRUZXh0KCkgKyAiXG4iICsga2V5ICsgIj0iICsgdmFsdWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL3dpbmRvd21hbmFnZXIvZG5kc291cmNlYXBwL3NyYy9hbmRyb2lkL3NlcnZlci93bS9kbmRzb3VyY2VhcHAvRHJhZ1NvdXJjZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2Uvd2luZG93bWFuYWdlci9kbmRzb3VyY2VhcHAvc3JjL2FuZHJvaWQvc2VydmVyL3dtL2RuZHNvdXJjZWFwcC9EcmFnU291cmNlQ29udGVudFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVjMWU1OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL3dpbmRvd21hbmFnZXIvZG5kc291cmNlYXBwL3NyYy9hbmRyb2lkL3NlcnZlci93bS9kbmRzb3VyY2VhcHAvRHJhZ1NvdXJjZUNvbnRlbnRQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLndtLmRuZHNvdXJjZWFwcDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LlVyaU1hdGNoZXI7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworCitwdWJsaWMgY2xhc3MgRHJhZ1NvdXJjZUNvbnRlbnRQcm92aWRlciBleHRlbmRzIENvbnRlbnRQcm92aWRlciB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIT1JJVFkgPSAiYW5kcm9pZC5zZXJ2ZXIud20uZG5kc291cmNlLmNvbnRlbnRwcm92aWRlciI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVcmlNYXRjaGVyIHNNYXRjaGVyID0gbmV3IFVyaU1hdGNoZXIoVXJpTWF0Y2hlci5OT19NQVRDSCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVVJJX0RBVEEgPSAxOworCisgICAgc3RhdGljIHsKKyAgICAgICAgc01hdGNoZXIuYWRkVVJJKEFVVEhPUklUWSwgImRhdGEvIyIsIFVSSV9EQVRBKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDdXJzb3IgcXVlcnkoVXJpIHVyaSwgU3RyaW5nW10gcHJvamVjdGlvbiwgU3RyaW5nIHNlbGVjdGlvbiwgU3RyaW5nW10gc2VsZWN0aW9uQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzb3J0T3JkZXIpIHsKKyAgICAgICAgc3dpdGNoIChzTWF0Y2hlci5tYXRjaCh1cmkpKSB7CisgICAgICAgICAgICBjYXNlIFVSSV9EQVRBOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRHJhZ1NvdXJjZUN1cnNvcih1cmkuZ2V0TGFzdFBhdGhTZWdtZW50KCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZShVcmkgdXJpKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBVcmkgaW5zZXJ0KFVyaSB1cmksIENvbnRlbnRWYWx1ZXMgdmFsdWVzKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZGVsZXRlKFVyaSB1cmksIFN0cmluZyBzZWxlY3Rpb24sIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCB1cGRhdGUoVXJpIHVyaSwgQ29udGVudFZhbHVlcyB2YWx1ZXMsIFN0cmluZyBzZWxlY3Rpb24sIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2Uvd2luZG93bWFuYWdlci9kbmRzb3VyY2VhcHAvc3JjL2FuZHJvaWQvc2VydmVyL3dtL2RuZHNvdXJjZWFwcC9EcmFnU291cmNlQ3Vyc29yLmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS93aW5kb3dtYW5hZ2VyL2RuZHNvdXJjZWFwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvd20vZG5kc291cmNlYXBwL0RyYWdTb3VyY2VDdXJzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Njg4NDJmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2Uvd2luZG93bWFuYWdlci9kbmRzb3VyY2VhcHAvc3JjL2FuZHJvaWQvc2VydmVyL3dtL2RuZHNvdXJjZWFwcC9EcmFnU291cmNlQ3Vyc29yLmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIud20uZG5kc291cmNlYXBwOworCitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5BYnN0cmFjdEN1cnNvcjsKKworcHVibGljIGNsYXNzIERyYWdTb3VyY2VDdXJzb3IgZXh0ZW5kcyBBYnN0cmFjdEN1cnNvciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9LRVkgPSAia2V5IjsKKworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1WYWx1ZTsKKworICAgIHB1YmxpYyBEcmFnU291cmNlQ3Vyc29yKFN0cmluZyB2YWx1ZSkgeworICAgICAgICBtVmFsdWUgPSB2YWx1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldENvdW50KCkgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q29sdW1uTmFtZXMoKSB7CisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10ge0NPTFVNTl9LRVl9OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKGludCBjb2x1bW4pIHsKKyAgICAgICAgaWYgKGdldFBvc2l0aW9uKCkgIT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW5jb3JyZWN0IHBvc2l0aW9uOiAiICsgZ2V0UG9zaXRpb24oKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbHVtbiAhPSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbmNvcnJlY3QgY29sdW1uOiAiICsgY29sdW1uKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbVZhbHVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBzaG9ydCBnZXRTaG9ydChpbnQgY29sdW1uKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0SW50KGludCBjb2x1bW4pIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgZ2V0TG9uZyhpbnQgY29sdW1uKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBmbG9hdCBnZXRGbG9hdChpbnQgY29sdW1uKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBkb3VibGUgZ2V0RG91YmxlKGludCBjb2x1bW4pIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNOdWxsKGludCBjb2x1bW4pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL3dpbmRvd21hbmFnZXIvZG5kdGFyZ2V0YXBwL0FuZHJvaWQubWsgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS93aW5kb3dtYW5hZ2VyL2RuZHRhcmdldGFwcC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2MWEwZWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS93aW5kb3dtYW5hZ2VyL2RuZHRhcmdldGFwcC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzIgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworIyBEb24ndCBpbmNsdWRlIHRoaXMgcGFja2FnZSBpbiBhbnkgdGFyZ2V0LgorTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKSBcCisgICAgLi4vc3JjL2FuZHJvaWQvc2VydmVyL3dtL1Rlc3RMb2dDbGllbnQuamF2YQorCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CisKKyMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzIGN0c19pbnN0YW50CisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNEcmFnQW5kRHJvcFRhcmdldEFwcAorCitpbmNsdWRlICQoQlVJTERfQ1RTX1NVUFBPUlRfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL3dpbmRvd21hbmFnZXIvZG5kdGFyZ2V0YXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS93aW5kb3dtYW5hZ2VyL2RuZHRhcmdldGFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNTBiNzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS93aW5kb3dtYW5hZ2VyL2RuZHRhcmdldGFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIHBhY2thZ2U9ImFuZHJvaWQuc2VydmVyLndtLmRuZHRhcmdldGFwcCIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRTYW5kYm94VmVyc2lvbj0iMiI+CisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFiZWw9IkN0c0RuRFRhcmdldCI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc2VydmVyLndtLmRuZHRhcmdldGFwcC5Ecm9wVGFyZ2V0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29uZmlnQ2hhbmdlcz0ib3JpZW50YXRpb258c2NyZWVuU2l6ZXxzbWFsbGVzdFNjcmVlblNpemV8c2NyZWVuTGF5b3V0Ij4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIi8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgPC9hcHBsaWNhdGlvbj4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci93aW5kb3dtYW5hZ2VyL2RuZHRhcmdldGFwcC9yZXMvbGF5b3V0L3RhcmdldF9hY3Rpdml0eS54bWwgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS93aW5kb3dtYW5hZ2VyL2RuZHRhcmdldGFwcC9yZXMvbGF5b3V0L3RhcmdldF9hY3Rpdml0eS54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGhvc3RzaWRldGVzdHMvc2VydmljZXMvYWN0aXZpdHlhbmR3aW5kb3dtYW5hZ2VyL3dpbmRvd21hbmFnZXIvZG5kdGFyZ2V0YXBwL3Jlcy9sYXlvdXQvdGFyZ2V0X2FjdGl2aXR5LnhtbApyZW5hbWUgdG8gdGVzdHMvZnJhbWV3b3JrL2Jhc2Uvd2luZG93bWFuYWdlci9kbmR0YXJnZXRhcHAvcmVzL2xheW91dC90YXJnZXRfYWN0aXZpdHkueG1sCmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS93aW5kb3dtYW5hZ2VyL2RuZHRhcmdldGFwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvd20vZG5kdGFyZ2V0YXBwL0Ryb3BUYXJnZXQuamF2YSBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL3dpbmRvd21hbmFnZXIvZG5kdGFyZ2V0YXBwL3NyYy9hbmRyb2lkL3NlcnZlci93bS9kbmR0YXJnZXRhcHAvRHJvcFRhcmdldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MDBlZjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS93aW5kb3dtYW5hZ2VyL2RuZHRhcmdldGFwcC9zcmMvYW5kcm9pZC9zZXJ2ZXIvd20vZG5kdGFyZ2V0YXBwL0Ryb3BUYXJnZXQuamF2YQpAQCAtMCwwICsxLDMwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIud20uZG5kdGFyZ2V0YXBwOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNsaXBEYXRhOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5DbGlwRGVzY3JpcHRpb247CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuUGVyc2lzdGFibGVCdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5zZXJ2ZXIud20uVGVzdExvZ0NsaWVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuRHJhZ0FuZERyb3BQZXJtaXNzaW9uczsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuRHJhZ0V2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCitwdWJsaWMgY2xhc3MgRHJvcFRhcmdldCBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVUxUX0tFWV9EUkFHX1NUQVJURUQgPSAiRFJBR19TVEFSVEVEIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVUxUX0tFWV9EUkFHX0VOREVEID0gIkRSQUdfRU5ERUQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRfS0VZX0VYVFJBUyA9ICJFWFRSQVMiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRfS0VZX0RST1BfUkVTVUxUID0gIkRST1AiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRfS0VZX0RFVEFJTFMgPSAiREVUQUlMUyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9LRVlfQUNDRVNTX0FGVEVSID0gIkFGVEVSIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVUxUX0tFWV9BQ0NFU1NfQkVGT1JFID0gIkJFRk9SRSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9LRVlfQ0xJUF9EQVRBX0VSUk9SID0gIkNMSVBfREFUQV9FUlJPUiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9LRVlfQ0xJUF9ERVNDUl9FUlJPUiA9ICJDTElQX0RFU0NSX0VSUk9SIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVUxUX0tFWV9MT0NBTF9TVEFURV9FUlJPUiA9ICJMT0NBTF9TVEFURV9FUlJPUiI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRfT0sgPSAiT0siOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9FWENFUFRJT04gPSAiRXhjZXB0aW9uIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRfTUlTU0lORyA9ICJNSVNTSU5HIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRfTEVBS0lORyA9ICJMRUFLSU5HIjsKKworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1BR0lDX1ZBTFVFID0gIjQyIjsKKworICAgIHByaXZhdGUgVGV4dFZpZXcgbVRleHRWaWV3OworICAgIHByaXZhdGUgVGVzdExvZ0NsaWVudCBtTG9nQ2xpZW50OworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIG1Mb2dDbGllbnQgPSBuZXcgVGVzdExvZ0NsaWVudCh0aGlzLCBnZXRJbnRlbnQoKS5nZXRTdHJpbmdFeHRyYSgibG9ndGFnIikpOworCisgICAgICAgIFZpZXcgdmlldyA9IGdldExheW91dEluZmxhdGVyKCkuaW5mbGF0ZShSLmxheW91dC50YXJnZXRfYWN0aXZpdHksIG51bGwpOworICAgICAgICBzZXRDb250ZW50Vmlldyh2aWV3KTsKKworICAgICAgICBzZXRVcERyb3BUYXJnZXQoInJlcXVlc3Rfbm9uZSIsIG5ldyBPbkRyYWdVcmlSZWFkTGlzdGVuZXIoZmFsc2UpKTsKKyAgICAgICAgc2V0VXBEcm9wVGFyZ2V0KCJyZXF1ZXN0X3JlYWQiLCBuZXcgT25EcmFnVXJpUmVhZExpc3RlbmVyKCkpOworICAgICAgICBzZXRVcERyb3BUYXJnZXQoInJlcXVlc3Rfd3JpdGUiLCBuZXcgT25EcmFnVXJpV3JpdGVMaXN0ZW5lcigpKTsKKyAgICAgICAgc2V0VXBEcm9wVGFyZ2V0KCJyZXF1ZXN0X3JlYWRfbmVzdGVkIiwgbmV3IE9uRHJhZ1VyaVJlYWRQcmVmaXhMaXN0ZW5lcigpKTsKKyAgICAgICAgc2V0VXBEcm9wVGFyZ2V0KCJyZXF1ZXN0X3Rha2VfcGVyc2lzdGFibGUiLCBuZXcgT25EcmFnVXJpVGFrZVBlcnNpc3RhYmxlTGlzdGVuZXIoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldFVwRHJvcFRhcmdldChTdHJpbmcgbW9kZSwgT25EcmFnVXJpTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgaWYgKCFtb2RlLmVxdWFscyhnZXRJbnRlbnQoKS5nZXRTdHJpbmdFeHRyYSgibW9kZSIpKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1UZXh0VmlldyA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC5kcmFnX3RhcmdldCk7CisgICAgICAgIG1UZXh0Vmlldy5zZXRUZXh0KG1vZGUpOworICAgICAgICBtVGV4dFZpZXcuc2V0T25EcmFnTGlzdGVuZXIobGlzdGVuZXIpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGNoZWNrRXh0cmFWYWx1ZShEcmFnRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgUGVyc2lzdGFibGVCdW5kbGUgZXh0cmFzID0gZXZlbnQuZ2V0Q2xpcERlc2NyaXB0aW9uKCkuZ2V0RXh0cmFzKCk7CisgICAgICAgIGlmIChleHRyYXMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuICJOdWxsIjsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZSA9IGV4dHJhcy5nZXRTdHJpbmcoImV4dHJhS2V5Iik7CisgICAgICAgIGlmICgiZXh0cmFWYWx1ZSIuZXF1YWxzKHZhbHVlKSkgeworICAgICAgICAgICAgcmV0dXJuIFJFU1VMVF9PSzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGxvZ1Jlc3VsdChTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgbUxvZ0NsaWVudC5yZWNvcmQoa2V5LCB2YWx1ZSk7CisgICAgICAgIG1UZXh0Vmlldy5zZXRUZXh0KG1UZXh0Vmlldy5nZXRUZXh0KCkgKyAiXG4iICsga2V5ICsgIj0iICsgdmFsdWUpOworICAgIH0KKworICAgIHByaXZhdGUgYWJzdHJhY3QgY2xhc3MgT25EcmFnVXJpTGlzdGVuZXIgaW1wbGVtZW50cyBWaWV3Lk9uRHJhZ0xpc3RlbmVyIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHJlcXVlc3RQZXJtaXNzaW9uczsKKworICAgICAgICBwdWJsaWMgT25EcmFnVXJpTGlzdGVuZXIoYm9vbGVhbiByZXF1ZXN0UGVybWlzc2lvbnMpIHsKKyAgICAgICAgICAgIHRoaXMucmVxdWVzdFBlcm1pc3Npb25zID0gcmVxdWVzdFBlcm1pc3Npb25zOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uRHJhZyhWaWV3IHYsIERyYWdFdmVudCBldmVudCkgeworICAgICAgICAgICAgY2hlY2tEcmFnRXZlbnQoZXZlbnQpOworCisgICAgICAgICAgICBzd2l0Y2ggKGV2ZW50LmdldEFjdGlvbigpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBEcmFnRXZlbnQuQUNUSU9OX0RSQUdfU1RBUlRFRDoKKyAgICAgICAgICAgICAgICAgICAgbG9nUmVzdWx0KFJFU1VMVF9LRVlfRFJBR19TVEFSVEVELCBSRVNVTFRfT0spOworICAgICAgICAgICAgICAgICAgICBsb2dSZXN1bHQoUkVTVUxUX0tFWV9FWFRSQVMsIGNoZWNrRXh0cmFWYWx1ZShldmVudCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAgICAgICAgIGNhc2UgRHJhZ0V2ZW50LkFDVElPTl9EUkFHX0VOVEVSRUQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgICAgICAgICAgY2FzZSBEcmFnRXZlbnQuQUNUSU9OX0RSQUdfTE9DQVRJT046CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgICAgICAgICAgY2FzZSBEcmFnRXZlbnQuQUNUSU9OX0RSQUdfRVhJVEVEOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAgICAgICAgIGNhc2UgRHJhZ0V2ZW50LkFDVElPTl9EUk9QOgorICAgICAgICAgICAgICAgICAgICAvLyBUcnkgYWNjZXNzaW5nIHRoZSBVcmkgd2l0aG91dCB0aGUgcGVybWlzc2lvbnMgZ3JhbnQuCisgICAgICAgICAgICAgICAgICAgIGFjY2Vzc0NvbnRlbnQoZXZlbnQsIFJFU1VMVF9LRVlfQUNDRVNTX0JFRk9SRSwgZmFsc2UpOworCisgICAgICAgICAgICAgICAgICAgIC8vIFRyeSBhY2Nlc3NpbmcgdGhlIFVyaSB3aXRoIHRoZSBwZXJtaXNzaW9uIGdyYW50IChpZiByZXF1aXJlZCk7CisgICAgICAgICAgICAgICAgICAgIGFjY2Vzc0NvbnRlbnQoZXZlbnQsIFJFU1VMVF9LRVlfRFJPUF9SRVNVTFQsIHJlcXVlc3RQZXJtaXNzaW9ucyk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gVHJ5IGFjY2Vzc2luZyB0aGUgVXJpIGFmdGVyIHRoZSBwZXJtaXNzaW9ucyBoYXZlIGJlZW4gcmVsZWFzZWQuCisgICAgICAgICAgICAgICAgICAgIGFjY2Vzc0NvbnRlbnQoZXZlbnQsIFJFU1VMVF9LRVlfQUNDRVNTX0FGVEVSLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgICAgICAgICAgY2FzZSBEcmFnRXZlbnQuQUNUSU9OX0RSQUdfRU5ERUQ6CisgICAgICAgICAgICAgICAgICAgIGxvZ1Jlc3VsdChSRVNVTFRfS0VZX0RSQUdfRU5ERUQsIFJFU1VMVF9PSyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGFjY2Vzc0NvbnRlbnQoRHJhZ0V2ZW50IGV2ZW50LCBTdHJpbmcgcmVzdWx0S2V5LCBib29sZWFuIHJlcXVlc3RQZXJtaXNzaW9ucykgeworICAgICAgICAgICAgU3RyaW5nIHJlc3VsdDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gcHJvY2Vzc0Ryb3AoZXZlbnQsIHJlcXVlc3RQZXJtaXNzaW9ucyk7CisgICAgICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gUkVTVUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0S2V5LmVxdWFscyhSRVNVTFRfS0VZX0RST1BfUkVTVUxUKSkgeworICAgICAgICAgICAgICAgICAgICBsb2dSZXN1bHQoUkVTVUxUX0tFWV9ERVRBSUxTLCBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9nUmVzdWx0KHJlc3VsdEtleSwgcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgU3RyaW5nIHByb2Nlc3NEcm9wKERyYWdFdmVudCBldmVudCwgYm9vbGVhbiByZXF1ZXN0UGVybWlzc2lvbnMpIHsKKyAgICAgICAgICAgIGZpbmFsIENsaXBEYXRhIGNsaXBEYXRhID0gZXZlbnQuZ2V0Q2xpcERhdGEoKTsKKyAgICAgICAgICAgIGlmIChjbGlwRGF0YSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJOdWxsIENsaXBEYXRhIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjbGlwRGF0YS5nZXRJdGVtQ291bnQoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJFbXB0eSBDbGlwRGF0YSI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDbGlwRGF0YS5JdGVtIGl0ZW0gPSBjbGlwRGF0YS5nZXRJdGVtQXQoMCk7CisgICAgICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJOdWxsIENsaXBEYXRhLkl0ZW0iOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVXJpIHVyaSA9IGl0ZW0uZ2V0VXJpKCk7CisgICAgICAgICAgICBpZiAodXJpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIk51bGwgVXJpIjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgRHJhZ0FuZERyb3BQZXJtaXNzaW9ucyBwZXJtaXNzaW9ucyA9IG51bGw7CisgICAgICAgICAgICBpZiAocmVxdWVzdFBlcm1pc3Npb25zKSB7CisgICAgICAgICAgICAgICAgcGVybWlzc2lvbnMgPSByZXF1ZXN0RHJhZ0FuZERyb3BQZXJtaXNzaW9ucyhldmVudCk7CisgICAgICAgICAgICAgICAgaWYgKHBlcm1pc3Npb25zID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJOdWxsIERyYWdBbmREcm9wUGVybWlzc2lvbnMiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcHJvY2Vzc1VyaSh1cmkpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpZiAocGVybWlzc2lvbnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9ucy5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYWJzdHJhY3QgcHJvdGVjdGVkIFN0cmluZyBwcm9jZXNzVXJpKFVyaSB1cmkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja0RyYWdFdmVudChEcmFnRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgZmluYWwgaW50IGFjdGlvbiA9IGV2ZW50LmdldEFjdGlvbigpOworCisgICAgICAgIC8vIENsaXBEYXRhIHNob3VsZCBiZSBhdmFpbGFibGUgZm9yIEFDVElPTl9EUk9QIG9ubHkuCisgICAgICAgIGZpbmFsIENsaXBEYXRhIGNsaXBEYXRhID0gZXZlbnQuZ2V0Q2xpcERhdGEoKTsKKyAgICAgICAgaWYgKGFjdGlvbiA9PSBEcmFnRXZlbnQuQUNUSU9OX0RST1ApIHsKKyAgICAgICAgICAgIGlmIChjbGlwRGF0YSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbG9nUmVzdWx0KFJFU1VMVF9LRVlfQ0xJUF9EQVRBX0VSUk9SLCBSRVNVTFRfTUlTU0lORyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoY2xpcERhdGEgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGxvZ1Jlc3VsdChSRVNVTFRfS0VZX0NMSVBfREFUQV9FUlJPUiwgUkVTVUxUX0xFQUtJTkcgKyBhY3Rpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gQ2xpcERlc2NyaXB0aW9uIHNob3VsZCBiZSBhbHdheXMgYXZhaWxhYmxlIGV4Y2VwdCBmb3IgQUNUSU9OX0RSQUdfRU5ERUQuCisgICAgICAgIGZpbmFsIENsaXBEZXNjcmlwdGlvbiBjbGlwRGVzY3JpcHRpb24gPSBldmVudC5nZXRDbGlwRGVzY3JpcHRpb24oKTsKKyAgICAgICAgaWYgKGFjdGlvbiAhPSBEcmFnRXZlbnQuQUNUSU9OX0RSQUdfRU5ERUQpIHsKKyAgICAgICAgICAgIGlmIChjbGlwRGVzY3JpcHRpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGxvZ1Jlc3VsdChSRVNVTFRfS0VZX0NMSVBfREVTQ1JfRVJST1IsIFJFU1VMVF9NSVNTSU5HICsgYWN0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChjbGlwRGVzY3JpcHRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGxvZ1Jlc3VsdChSRVNVTFRfS0VZX0NMSVBfREVTQ1JfRVJST1IsIFJFU1VMVF9MRUFLSU5HKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIExvY2FsIHN0YXRlIHNob3VsZCBiZSBhbHdheXMgbnVsbCBmb3IgY3Jvc3MtYXBwIGRyYWdzLgorICAgICAgICBmaW5hbCBPYmplY3QgbG9jYWxTdGF0ZSA9IGV2ZW50LmdldExvY2FsU3RhdGUoKTsKKyAgICAgICAgaWYgKGxvY2FsU3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbG9nUmVzdWx0KFJFU1VMVF9LRVlfTE9DQUxfU1RBVEVfRVJST1IsIFJFU1VMVF9MRUFLSU5HICsgYWN0aW9uKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgT25EcmFnVXJpUmVhZExpc3RlbmVyIGV4dGVuZHMgT25EcmFnVXJpTGlzdGVuZXIgeworICAgICAgICBPbkRyYWdVcmlSZWFkTGlzdGVuZXIoYm9vbGVhbiByZXF1ZXN0UGVybWlzc2lvbnMpIHsKKyAgICAgICAgICAgIHN1cGVyKHJlcXVlc3RQZXJtaXNzaW9ucyk7CisgICAgICAgIH0KKworICAgICAgICBPbkRyYWdVcmlSZWFkTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBzdXBlcih0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgcHJvY2Vzc1VyaShVcmkgdXJpKSB7CisgICAgICAgICAgICByZXR1cm4gY2hlY2tRdWVyeVJlc3VsdCh1cmksIE1BR0lDX1ZBTFVFKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgY2hlY2tRdWVyeVJlc3VsdChVcmkgdXJpLCBTdHJpbmcgZXhwZWN0ZWRWYWx1ZSkgeworICAgICAgICAgICAgQ3Vyc29yIGN1cnNvciA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGN1cnNvciA9IGdldENvbnRlbnRSZXNvbHZlcigpLnF1ZXJ5KHVyaSwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICAgICAgaWYgKGN1cnNvciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiTnVsbCBDdXJzb3IiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjdXJzb3IubW92ZVRvUG9zaXRpb24oMCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gY3Vyc29yLmdldFN0cmluZygwKTsKKyAgICAgICAgICAgICAgICBpZiAoIWV4cGVjdGVkVmFsdWUuZXF1YWxzKHZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gIldyb25nIHZhbHVlOiAiICsgdmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBSRVNVTFRfT0s7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlmIChjdXJzb3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjdXJzb3IuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIE9uRHJhZ1VyaVdyaXRlTGlzdGVuZXIgZXh0ZW5kcyBPbkRyYWdVcmlMaXN0ZW5lciB7CisgICAgICAgIE9uRHJhZ1VyaVdyaXRlTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBzdXBlcih0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgcHJvY2Vzc1VyaShVcmkgdXJpKSB7CisgICAgICAgICAgICBDb250ZW50VmFsdWVzIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7CisgICAgICAgICAgICB2YWx1ZXMucHV0KCJrZXkiLCAxMDApOworICAgICAgICAgICAgZ2V0Q29udGVudFJlc29sdmVyKCkudXBkYXRlKHVyaSwgdmFsdWVzLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIHJldHVybiBSRVNVTFRfT0s7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIE9uRHJhZ1VyaVJlYWRQcmVmaXhMaXN0ZW5lciBleHRlbmRzIE9uRHJhZ1VyaVJlYWRMaXN0ZW5lciB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIHByb2Nlc3NVcmkoVXJpIHVyaSkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdDEgPSBxdWVyeVByZWZpeGVkKHVyaSwgIjEiKTsKKyAgICAgICAgICAgIGlmICghcmVzdWx0MS5lcXVhbHMoUkVTVUxUX09LKSkgeworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdDIgPSBxdWVyeVByZWZpeGVkKHVyaSwgIjIiKTsKKyAgICAgICAgICAgIGlmICghcmVzdWx0Mi5lcXVhbHMoUkVTVUxUX09LKSkgeworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHF1ZXJ5UHJlZml4ZWQodXJpLCAiMyIpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcXVlcnlQcmVmaXhlZChVcmkgdXJpLCBTdHJpbmcgc2VsZWN0b3IpIHsKKyAgICAgICAgICAgIGZpbmFsIFVyaSBwcmVmaXhlZFVyaSA9IFVyaS5wYXJzZSh1cmkudG9TdHJpbmcoKSArICIvIiArIHNlbGVjdG9yKTsKKyAgICAgICAgICAgIHJldHVybiBjaGVja1F1ZXJ5UmVzdWx0KHByZWZpeGVkVXJpLCBzZWxlY3Rvcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIE9uRHJhZ1VyaVRha2VQZXJzaXN0YWJsZUxpc3RlbmVyIGV4dGVuZHMgT25EcmFnVXJpTGlzdGVuZXIgeworICAgICAgICBPbkRyYWdVcmlUYWtlUGVyc2lzdGFibGVMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHN1cGVyKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgcHJvY2Vzc1VyaShVcmkgdXJpKSB7CisgICAgICAgICAgICBnZXRDb250ZW50UmVzb2x2ZXIoKS50YWtlUGVyc2lzdGFibGVVcmlQZXJtaXNzaW9uKAorICAgICAgICAgICAgICAgICAgICB1cmksIFZpZXcuRFJBR19GTEFHX0dMT0JBTF9VUklfUkVBRCk7CisgICAgICAgICAgICBnZXRDb250ZW50UmVzb2x2ZXIoKS5yZWxlYXNlUGVyc2lzdGFibGVVcmlQZXJtaXNzaW9uKAorICAgICAgICAgICAgICAgICAgICB1cmksIFZpZXcuRFJBR19GTEFHX0dMT0JBTF9VUklfUkVBRCk7CisgICAgICAgICAgICByZXR1cm4gUkVTVUxUX09LOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2Uvd2luZG93bWFuYWdlci9kbmR0YXJnZXRhcHBzZGsyMy9BbmRyb2lkLm1rIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2Uvd2luZG93bWFuYWdlci9kbmR0YXJnZXRhcHBzZGsyMy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYTc2ZmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS93aW5kb3dtYW5hZ2VyL2RuZHRhcmdldGFwcHNkazIzL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMiBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCisjIERvbid0IGluY2x1ZGUgdGhpcyBwYWNrYWdlIGluIGFueSB0YXJnZXQuCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpIFwKKyAgICAuLi9zcmMvYW5kcm9pZC9zZXJ2ZXIvd20vVGVzdExvZ0NsaWVudC5qYXZhCisKK0xPQ0FMX1NES19WRVJTSU9OIDo9IDIzCisKKyMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzIGN0c19pbnN0YW50CisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNEcmFnQW5kRHJvcFRhcmdldEFwcFNkazIzCisKK2luY2x1ZGUgJChCVUlMRF9DVFNfU1VQUE9SVF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2Uvd2luZG93bWFuYWdlci9kbmR0YXJnZXRhcHBzZGsyMy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2Uvd2luZG93bWFuYWdlci9kbmR0YXJnZXRhcHBzZGsyMy9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMGE1NDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS93aW5kb3dtYW5hZ2VyL2RuZHRhcmdldGFwcHNkazIzL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwyNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgcGFja2FnZT0iYW5kcm9pZC5zZXJ2ZXIud20uZG5kdGFyZ2V0YXBwc2RrMjMiPgorICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJDdHNEbkRUYXJnZXQiPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnNlcnZlci53bS5kbmR0YXJnZXRhcHBzZGsyMy5Ecm9wVGFyZ2V0Ij4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIi8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgPC9hcHBsaWNhdGlvbj4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci93aW5kb3dtYW5hZ2VyL2RuZHRhcmdldGFwcHNkazIzL3Jlcy9sYXlvdXQvdGFyZ2V0X2FjdGl2aXR5LnhtbCBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL3dpbmRvd21hbmFnZXIvZG5kdGFyZ2V0YXBwc2RrMjMvcmVzL2xheW91dC90YXJnZXRfYWN0aXZpdHkueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBob3N0c2lkZXRlc3RzL3NlcnZpY2VzL2FjdGl2aXR5YW5kd2luZG93bWFuYWdlci93aW5kb3dtYW5hZ2VyL2RuZHRhcmdldGFwcHNkazIzL3Jlcy9sYXlvdXQvdGFyZ2V0X2FjdGl2aXR5LnhtbApyZW5hbWUgdG8gdGVzdHMvZnJhbWV3b3JrL2Jhc2Uvd2luZG93bWFuYWdlci9kbmR0YXJnZXRhcHBzZGsyMy9yZXMvbGF5b3V0L3RhcmdldF9hY3Rpdml0eS54bWwKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL3dpbmRvd21hbmFnZXIvZG5kdGFyZ2V0YXBwc2RrMjMvc3JjL2FuZHJvaWQvc2VydmVyL3dtL2RuZHRhcmdldGFwcHNkazIzL0Ryb3BUYXJnZXQuamF2YSBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL3dpbmRvd21hbmFnZXIvZG5kdGFyZ2V0YXBwc2RrMjMvc3JjL2FuZHJvaWQvc2VydmVyL3dtL2RuZHRhcmdldGFwcHNkazIzL0Ryb3BUYXJnZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2E4NjU5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2Uvd2luZG93bWFuYWdlci9kbmR0YXJnZXRhcHBzZGsyMy9zcmMvYW5kcm9pZC9zZXJ2ZXIvd20vZG5kdGFyZ2V0YXBwc2RrMjMvRHJvcFRhcmdldC5qYXZhCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLndtLmRuZHRhcmdldGFwcHNkazIzOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5zZXJ2ZXIud20uVGVzdExvZ0NsaWVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuRHJhZ0V2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCisvKioKKyAqIFRoaXMgYXBwbGljYXRpb24gaXMgY29tcGlsZWQgYWdhaW5zdCBTREsgMjMgYW5kIHVzZWQgdG8gdmVyaWZ5IHRoYXQgYXBwcyB0YXJnZXRpbmcgU0RLIDIzIGFuZAorICogYmVsb3cgZG8gbm90IHJlY2VpdmUgZ2xvYmFsIGRyYWdzLgorICovCitwdWJsaWMgY2xhc3MgRHJvcFRhcmdldCBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVUxUX0tFWV9EUkFHX1NUQVJURUQgPSAiRFJBR19TVEFSVEVEIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVUxUX0tFWV9EUk9QX1JFU1VMVCA9ICJEUk9QIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9PSyA9ICJPSyI7CisKKyAgICBwcml2YXRlIFRleHRWaWV3IG1UZXh0VmlldzsKKyAgICBwcml2YXRlIFRlc3RMb2dDbGllbnQgbUxvZ0NsaWVudDsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBWaWV3IHZpZXcgPSBnZXRMYXlvdXRJbmZsYXRlcigpLmluZmxhdGUoUi5sYXlvdXQudGFyZ2V0X2FjdGl2aXR5LCBudWxsKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcodmlldyk7CisKKyAgICAgICAgbVRleHRWaWV3ID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5kcmFnX3RhcmdldCk7CisgICAgICAgIG1UZXh0Vmlldy5zZXRPbkRyYWdMaXN0ZW5lcihuZXcgT25EcmFnTGlzdGVuZXIoKSk7CisKKyAgICAgICAgbUxvZ0NsaWVudCA9IG5ldyBUZXN0TG9nQ2xpZW50KHRoaXMsIGdldEludGVudCgpLmdldFN0cmluZ0V4dHJhKCJsb2d0YWciKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGxvZ1Jlc3VsdChTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgbUxvZ0NsaWVudC5yZWNvcmQoa2V5LCB2YWx1ZSk7CisgICAgICAgIG1UZXh0Vmlldy5zZXRUZXh0KGtleSArICI9IiArIHZhbHVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIE9uRHJhZ0xpc3RlbmVyIGltcGxlbWVudHMgVmlldy5PbkRyYWdMaXN0ZW5lciB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkRyYWcoVmlldyB2LCBEcmFnRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQuZ2V0QWN0aW9uKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIERyYWdFdmVudC5BQ1RJT05fRFJBR19TVEFSVEVEOgorICAgICAgICAgICAgICAgICAgICBsb2dSZXN1bHQoUkVTVUxUX0tFWV9EUkFHX1NUQVJURUQsIFJFU1VMVF9PSyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgICAgICAgICAgY2FzZSBEcmFnRXZlbnQuQUNUSU9OX0RSQUdfRU5URVJFRDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgICAgICAgICBjYXNlIERyYWdFdmVudC5BQ1RJT05fRFJBR19MT0NBVElPTjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgICAgICAgICBjYXNlIERyYWdFdmVudC5BQ1RJT05fRFJBR19FWElURUQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgICAgICAgICAgY2FzZSBEcmFnRXZlbnQuQUNUSU9OX0RST1A6CisgICAgICAgICAgICAgICAgICAgIGxvZ1Jlc3VsdChSRVNVTFRfS0VZX0RST1BfUkVTVUxULCBSRVNVTFRfT0spOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAgICAgICAgIGNhc2UgRHJhZ0V2ZW50LkFDVElPTl9EUkFHX0VOREVEOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL3dpbmRvd21hbmFnZXIvcmVzL3ZhbHVlcy9zdHlsZXMueG1sIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2Uvd2luZG93bWFuYWdlci9yZXMvdmFsdWVzL3N0eWxlcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU1OWQxNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL3dpbmRvd21hbmFnZXIvcmVzL3ZhbHVlcy9zdHlsZXMueG1sCkBAIC0wLDAgKzEsMjEgQEAKKzwhLS0KKyAgfiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICB+CisgIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICB+CisgIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgfgorICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAgLS0+CisKKzxyZXNvdXJjZXM+CisgICAgPHN0eWxlIG5hbWU9Im5vX3N0YXJ0aW5nX3dpbmRvdyIgcGFyZW50PSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5EZXZpY2VEZWZhdWx0Ij4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dEaXNhYmxlUHJldmlldyI+dHJ1ZTwvaXRlbT4KKyAgICA8L3N0eWxlPgorPC9yZXNvdXJjZXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2Uvd2luZG93bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvd20vQWxlcnRXaW5kb3dzQXBwT3BzVGVzdHMuamF2YSBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL3dpbmRvd21hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL3dtL0FsZXJ0V2luZG93c0FwcE9wc1Rlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUwZTI3MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL3dpbmRvd21hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL3dtL0FsZXJ0V2luZG93c0FwcE9wc1Rlc3RzLmphdmEKQEAgLTAsMCArMSwxNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIud207CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuQXBwT3BzTWFuYWdlci5NT0RFX0FMTE9XRUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLkFwcE9wc01hbmFnZXIuTU9ERV9FUlJPUkVEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5BcHBPcHNNYW5hZ2VyLk9QU1RSX1NZU1RFTV9BTEVSVF9XSU5ET1c7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLkFwcE9wc01hbmFnZXIuT1BfU1lTVEVNX0FMRVJUX1dJTkRPVzsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Bcmd1bWVudE1hdGNoZXJzLmFueUJvb2xlYW47CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLkFyZ3VtZW50TWF0Y2hlcnMuYW55SW50OworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Bcmd1bWVudE1hdGNoZXJzLmFueVN0cmluZzsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uQXJndW1lbnRNYXRjaGVycy5lcTsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5tb2NrOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnJlc2V0OworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnRpbWVvdXQ7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8udmVyaWZ5OworCitpbXBvcnQgYW5kcm9pZC5hcHAuQXBwT3BzTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlByZXN1Ym1pdDsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLkZsYWt5VGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5BcHBPcHNVdGlsczsKKworaW1wb3J0IG9yZy5qdW5pdC5BZnRlckNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCisvKioKKyAqIFRlc3Qgd2hldGhlciBzeXN0ZW0gYWxlcnQgd2luZG93IHByb3Blcmx5IGludGVyYWN0cyB3aXRoIGFwcCBvcHMuCisgKgorICogQnVpbGQvSW5zdGFsbC9SdW46IGF0ZXN0IEN0c1dpbmRvd01hbmFnZXJEZXZpY2VUZXN0Q2FzZXM6QWxlcnRXaW5kb3dzQXBwT3BzVGVzdHMKKyAqLworQFByZXN1Ym1pdAorQEZsYWt5VGVzdChkZXRhaWwgPSAiQ2FuIGJlIHByb21vdGVkIHRvIHByZS1zdWJtaXQgb25jZSBjb25maXJtZWQgc3RhYmxlLiIpCitAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIEFsZXJ0V2luZG93c0FwcE9wc1Rlc3RzIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEFQUF9PUF9DSEFOR0VfVElNRU9VVF9NSUxMSVMgPSBUaW1lVW5pdC5TRUNPTkRTLnRvTWlsbGlzKDIpOworCisgICAgQFJ1bGUKKyAgICBwdWJsaWMgZmluYWwgQWN0aXZpdHlUZXN0UnVsZTxBbGVydFdpbmRvd3NBcHBPcHNUZXN0c0FjdGl2aXR5PiBtQWN0aXZpdHlSdWxlID0KKyAgICAgICAgICAgIG5ldyBBY3Rpdml0eVRlc3RSdWxlPD4oQWxlcnRXaW5kb3dzQXBwT3BzVGVzdHNBY3Rpdml0eS5jbGFzcyk7CisKKyAgICBAQmVmb3JlQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZ3JhbnRTeXN0ZW1BbGVydFdpbmRvd0FjY2VzcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEFwcE9wc1V0aWxzLnNldE9wTW9kZShnZXRDb250ZXh0KCkuZ2V0UGFja2FnZU5hbWUoKSwKKyAgICAgICAgICAgICAgICBPUFNUUl9TWVNURU1fQUxFUlRfV0lORE9XLCBNT0RFX0FMTE9XRUQpOworICAgIH0KKworICAgIEBBZnRlckNsYXNzCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHJldm9rZVN5c3RlbUFsZXJ0V2luZG93QWNjZXNzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQXBwT3BzVXRpbHMuc2V0T3BNb2RlKGdldENvbnRleHQoKS5nZXRQYWNrYWdlTmFtZSgpLAorICAgICAgICAgICAgICAgIE9QU1RSX1NZU1RFTV9BTEVSVF9XSU5ET1csIE1PREVfRVJST1JFRCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3lzdGVtQWxlcnRXaW5kb3dBcHBPcHNJbml0aWFsbHlBbGxvd2VkKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgcGFja2FnZU5hbWUgPSBnZXRDb250ZXh0KCkuZ2V0UGFja2FnZU5hbWUoKTsKKyAgICAgICAgZmluYWwgaW50IHVpZCA9IFByb2Nlc3MubXlVaWQoKTsKKworICAgICAgICBmaW5hbCBBcHBPcHNNYW5hZ2VyIGFwcE9wc01hbmFnZXIgPSBnZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShBcHBPcHNNYW5hZ2VyLmNsYXNzKTsKKyAgICAgICAgZmluYWwgQXBwT3BzTWFuYWdlci5Pbk9wQWN0aXZlQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyID0gbW9jaygKKyAgICAgICAgICAgICAgICBBcHBPcHNNYW5hZ2VyLk9uT3BBY3RpdmVDaGFuZ2VkTGlzdGVuZXIuY2xhc3MpOworCisgICAgICAgIC8vIExhdW5jaCBvdXIgYWN0aXZpdHkuCisgICAgICAgIGZpbmFsIEFsZXJ0V2luZG93c0FwcE9wc1Rlc3RzQWN0aXZpdHkgYWN0aXZpdHkgPSBtQWN0aXZpdHlSdWxlLmdldEFjdGl2aXR5KCk7CisKKyAgICAgICAgLy8gU3RhcnQgd2F0Y2hpbmcgZm9yIGFwcCBvcAorICAgICAgICBhcHBPcHNNYW5hZ2VyLnN0YXJ0V2F0Y2hpbmdBY3RpdmUobmV3IGludFtdIHtPUF9TWVNURU1fQUxFUlRfV0lORE9XfSwgbGlzdGVuZXIpOworCisgICAgICAgIC8vIEFzc2VydCB0aGUgYXBwIG9wIGlzIG5vdCBzdGFydGVkCisgICAgICAgIGFzc2VydEZhbHNlKGFwcE9wc01hbmFnZXIuaXNPcGVyYXRpb25BY3RpdmUoT1BfU1lTVEVNX0FMRVJUX1dJTkRPVywgdWlkLCBwYWNrYWdlTmFtZSkpOworCisKKyAgICAgICAgLy8gU2hvdyBhIHN5c3RlbSBhbGVydCB3aW5kb3cuCisgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLnJ1bk9uTWFpblN5bmMoCisgICAgICAgICAgICAgICAgYWN0aXZpdHk6OnNob3dTeXN0ZW1BbGVydFdpbmRvdyk7CisKKyAgICAgICAgLy8gVGhlIGFwcCBvcCBzaG91bGQgc3RhcnQKKyAgICAgICAgdmVyaWZ5KGxpc3RlbmVyLCB0aW1lb3V0KEFQUF9PUF9DSEFOR0VfVElNRU9VVF9NSUxMSVMpCisgICAgICAgICAgICAgICAgLm9ubHkoKSkub25PcEFjdGl2ZUNoYW5nZWQoZXEoT1BfU1lTVEVNX0FMRVJUX1dJTkRPVyksCisgICAgICAgICAgICAgICAgZXEodWlkKSwgZXEocGFja2FnZU5hbWUpLCBlcSh0cnVlKSk7CisKKyAgICAgICAgLy8gVGhlIGFwcCBvcCBzaG91bGQgYmUgcmVwb3J0ZWQgYXMgc3RhcnRlZAorICAgICAgICBhc3NlcnRUcnVlKGFwcE9wc01hbmFnZXIuaXNPcGVyYXRpb25BY3RpdmUoT1BfU1lTVEVNX0FMRVJUX1dJTkRPVywKKyAgICAgICAgICAgICAgICB1aWQsIHBhY2thZ2VOYW1lKSk7CisKKworICAgICAgICAvLyBTdGFydCB3aXRoIGEgY2xlYW4gc2xhdGUKKyAgICAgICAgcmVzZXQobGlzdGVuZXIpOworCisgICAgICAgIC8vIEhpZGUgYSBzeXN0ZW0gYWxlcnQgd2luZG93LgorICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKS5ydW5Pbk1haW5TeW5jKAorICAgICAgICAgICAgICAgIGFjdGl2aXR5OjpoaWRlU3lzdGVtQWxlcnRXaW5kb3cpOworCisgICAgICAgIC8vIFRoZSBhcHAgb3Agc2hvdWxkIGZpbmlzaAorICAgICAgICB2ZXJpZnkobGlzdGVuZXIsIHRpbWVvdXQoQVBQX09QX0NIQU5HRV9USU1FT1VUX01JTExJUykKKyAgICAgICAgICAgICAgICAub25seSgpKS5vbk9wQWN0aXZlQ2hhbmdlZChlcShPUF9TWVNURU1fQUxFUlRfV0lORE9XKSwKKyAgICAgICAgICAgICAgICBlcSh1aWQpLCBlcShwYWNrYWdlTmFtZSksIGVxKGZhbHNlKSk7CisKKyAgICAgICAgLy8gVGhlIGFwcCBvcCBzaG91bGQgYmUgcmVwb3J0ZWQgYXMgZmluaXNoZWQKKyAgICAgICAgYXNzZXJ0RmFsc2UoYXBwT3BzTWFuYWdlci5pc09wZXJhdGlvbkFjdGl2ZShPUF9TWVNURU1fQUxFUlRfV0lORE9XLCB1aWQsIHBhY2thZ2VOYW1lKSk7CisKKworICAgICAgICAvLyBTdGFydCB3aXRoIGEgY2xlYW4gc2xhdGUKKyAgICAgICAgcmVzZXQobGlzdGVuZXIpOworCisgICAgICAgIC8vIFN0b3Agd2F0Y2hpbmcgZm9yIGFwcCBvcAorICAgICAgICBhcHBPcHNNYW5hZ2VyLnN0b3BXYXRjaGluZ0FjdGl2ZShsaXN0ZW5lcik7CisKKyAgICAgICAgLy8gU2hvdyBhIHN5c3RlbSBhbGVydCB3aW5kb3cKKyAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkucnVuT25NYWluU3luYygKKyAgICAgICAgICAgICAgICBhY3Rpdml0eTo6c2hvd1N5c3RlbUFsZXJ0V2luZG93KTsKKworICAgICAgICAvLyBObyBvdGhlciBjYWxsYmFja3MgZXhwZWN0ZWQKKyAgICAgICAgdmVyaWZ5KGxpc3RlbmVyLCB0aW1lb3V0KEFQUF9PUF9DSEFOR0VfVElNRU9VVF9NSUxMSVMpLnRpbWVzKDApKQorICAgICAgICAgICAgICAgIC5vbk9wQWN0aXZlQ2hhbmdlZChlcShPUF9TWVNURU1fQUxFUlRfV0lORE9XKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFueUludCgpLCBhbnlTdHJpbmcoKSwgYW55Qm9vbGVhbigpKTsKKworICAgICAgICAvLyBUaGUgYXBwIG9wIHNob3VsZCBiZSByZXBvcnRlZCBhcyBzdGFydGVkCisgICAgICAgIGFzc2VydFRydWUoYXBwT3BzTWFuYWdlci5pc09wZXJhdGlvbkFjdGl2ZShPUF9TWVNURU1fQUxFUlRfV0lORE9XLCB1aWQsIHBhY2thZ2VOYW1lKSk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL3dpbmRvd21hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL3dtL0FsZXJ0V2luZG93c0FwcE9wc1Rlc3RzQWN0aXZpdHkuamF2YSBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL3dpbmRvd21hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL3dtL0FsZXJ0V2luZG93c0FwcE9wc1Rlc3RzQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTlkZWNjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2Uvd2luZG93bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvd20vQWxlcnRXaW5kb3dzQXBwT3BzVGVzdHNBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIud207CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9BUFBMSUNBVElPTl9PVkVSTEFZOworCitwdWJsaWMgY2xhc3MgQWxlcnRXaW5kb3dzQXBwT3BzVGVzdHNBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBwcml2YXRlIFZpZXcgbUNvbnRlbnQ7CisKKyAgICBwdWJsaWMgdm9pZCBzaG93U3lzdGVtQWxlcnRXaW5kb3coKSB7CisgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIHBhcmFtcyA9IG5ldyBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcygKKyAgICAgICAgICAgICAgICBUWVBFX0FQUExJQ0FUSU9OX09WRVJMQVkpOworICAgICAgICBwYXJhbXMud2lkdGggPSBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQ7CisgICAgICAgIHBhcmFtcy5oZWlnaHQgPSBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQ7CisgICAgICAgIG1Db250ZW50ID0gbmV3IFZpZXcodGhpcyk7CisgICAgICAgIGdldFdpbmRvd01hbmFnZXIoKS5hZGRWaWV3KG1Db250ZW50LCBwYXJhbXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGhpZGVTeXN0ZW1BbGVydFdpbmRvdygpIHsKKyAgICAgICAgZ2V0V2luZG93TWFuYWdlcigpLnJlbW92ZVZpZXcobUNvbnRlbnQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL3dpbmRvd21hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL3dtL0FsZXJ0V2luZG93c0ltcG9ydGFuY2VUZXN0cy5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2Uvd2luZG93bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvd20vQWxlcnRXaW5kb3dzSW1wb3J0YW5jZVRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc0NDJkZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL3dpbmRvd21hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL3dtL0FsZXJ0V2luZG93c0ltcG9ydGFuY2VUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMjYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLndtOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlci5SdW5uaW5nQXBwUHJvY2Vzc0luZm8uSU1QT1JUQU5DRV9QRVJDRVBUSUJMRTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyLlJ1bm5pbmdBcHBQcm9jZXNzSW5mby5JTVBPUlRBTkNFX1BFUkNFUFRJQkxFX1BSRV8yNjsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyLlJ1bm5pbmdBcHBQcm9jZXNzSW5mby5JTVBPUlRBTkNFX1ZJU0lCTEU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5Db250ZXh0LkJJTkRfQUxMT1dfT09NX01BTkFHRU1FTlQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5Db250ZXh0LkJJTkRfQVVUT19DUkVBVEU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5Db250ZXh0LkJJTkRfTk9UX0ZPUkVHUk9VTkQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLndtLmFsZXJ0d2luZG93YXBwc2RrMjUuQ29tcG9uZW50cy5TREsyNV9BTEVSVF9XSU5ET1dfVEVTVF9BQ1RJVklUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIud20uYWxlcnR3aW5kb3dzZXJ2aWNlLkNvbXBvbmVudHMuQUxFUlRfV0lORE9XX1NFUlZJQ0U7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2VydmljZUNvbm5lY3Rpb247CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2VuZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5QcmVzdWJtaXQ7CitpbXBvcnQgYW5kcm9pZC5zZXJ2ZXIud20uYWxlcnR3aW5kb3dzZXJ2aWNlLkFsZXJ0V2luZG93U2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5TeXN0ZW1VdGlsOworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlRvSW50RnVuY3Rpb247CisKKy8qKgorICogQnVpbGQvSW5zdGFsbC9SdW46CisgKiAgICAgYXRlc3QgQ3RzV2luZG93TWFuYWdlckRldmljZVRlc3RDYXNlczpBbGVydFdpbmRvd3NJbXBvcnRhbmNlVGVzdHMKKyAqLworQFByZXN1Ym1pdAorQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKK3B1YmxpYyBmaW5hbCBjbGFzcyBBbGVydFdpbmRvd3NJbXBvcnRhbmNlVGVzdHMgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJBbGVydFdpbmRvd3NUZXN0cyI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBXQUlUX1RJTUVfTVMgPSAyICogMTAwMDsKKworICAgIHByaXZhdGUgTWVzc2VuZ2VyIG1TZXJ2aWNlOworICAgIHByaXZhdGUgU3RyaW5nIG1TZXJ2aWNlUGFja2FnZU5hbWU7CisKKyAgICBwcml2YXRlIEFjdGl2aXR5TWFuYWdlciBtQW07CisgICAgcHJpdmF0ZSBBY3Rpdml0eU1hbmFnZXIgbUFtMjU7IC8vIEFjdGl2aXR5TWFuYWdlciBjcmVhdGVkIGZvciBhbiBTREsgMjUgYXBwIGNvbnRleHQuCisKKyAgICBwcml2YXRlIGZpbmFsIE1lc3NlbmdlciBtTWVzc2VuZ2VyID0gbmV3IE1lc3NlbmdlcihuZXcgSW5jb21pbmdIYW5kbGVyKExvb3Blci5nZXRNYWluTG9vcGVyKCkpKTsKKyAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtQWRkZWRMb2NrID0gbmV3IE9iamVjdCgpOworICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1SZW1vdmVMb2NrID0gbmV3IE9iamVjdCgpOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChERUJVRykgTG9nLmUoVEFHLCAic2V0VXAiKTsKKyAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0ID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0VGFyZ2V0Q29udGV4dCgpOworCisgICAgICAgIG1BbSA9IGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShBY3Rpdml0eU1hbmFnZXIuY2xhc3MpOworICAgICAgICBtQW0yNSA9IGNvbnRleHQuY3JlYXRlUGFja2FnZUNvbnRleHQoU0RLMjVfQUxFUlRfV0lORE9XX1RFU1RfQUNUSVZJVFkuZ2V0UGFja2FnZU5hbWUoKSwgMCkKKyAgICAgICAgICAgICAgICAuZ2V0U3lzdGVtU2VydmljZShBY3Rpdml0eU1hbmFnZXIuY2xhc3MpOworCisgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KCkKKyAgICAgICAgICAgICAgICAuc2V0Q29tcG9uZW50KEFMRVJUX1dJTkRPV19TRVJWSUNFKQorICAgICAgICAgICAgICAgIC5wdXRFeHRyYShBbGVydFdpbmRvd1NlcnZpY2UuRVhUUkFfTUVTU0VOR0VSLCBtTWVzc2VuZ2VyKTsKKyAgICAgICAgLy8gTmVlZHMgdG8gYmUgYm90aCBCSU5EX05PVF9GT1JFR1JPVU5EIGFuZCBCSU5EX0FMTE9XX09PTV9NQU5BR0VNRU5UIHRvIGF2b2lkIHRoZSBiaW5kaW5nCisgICAgICAgIC8vIHRvIHRoaXMgaW5zdHJ1bWVudGF0aW9uIHRlc3QgZnJvbSBpbmNyZWFzaW5nIGl0cyBpbXBvcnRhbmNlLgorICAgICAgICBjb250ZXh0LmJpbmRTZXJ2aWNlKGludGVudCwgbUNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgQklORF9BVVRPX0NSRUFURSB8IEJJTkRfTk9UX0ZPUkVHUk9VTkQgfCBCSU5EX0FMTE9XX09PTV9NQU5BR0VNRU5UKTsKKyAgICAgICAgc3luY2hyb25pemVkIChtQ29ubmVjdGlvbikgeworICAgICAgICAgICAgLy8gV2FpdCBmb3IgYWxlcnQgd2luZG93IHNlcnZpY2UgdG8gYmUgY29ubmVjdGlvbiBiZWZvcmUgcHJvY2Vzc2luZy4KKyAgICAgICAgICAgIG1Db25uZWN0aW9uLndhaXQoV0FJVF9USU1FX01TKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChERUJVRykgTG9nLmUoVEFHLCAidGVhckRvd24iKTsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1TZXJ2aWNlLnNlbmQoTWVzc2FnZS5vYnRhaW4obnVsbCwgQWxlcnRXaW5kb3dTZXJ2aWNlLk1TR19SRU1PVkVfQUxMX0FMRVJUX1dJTkRPV1MpKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBDb250ZXh0IGNvbnRleHQgPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRUYXJnZXRDb250ZXh0KCk7CisgICAgICAgIGNvbnRleHQudW5iaW5kU2VydmljZShtQ29ubmVjdGlvbik7CisgICAgICAgIG1BbSA9IG51bGw7CisgICAgICAgIG1BbTI1ID0gbnVsbDsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBBcHBNb2RlRnVsbChyZWFzb24gPSAiVXNlcyBhcHBzIHRhcmdldGluZyBvbGRlciBTREsiKQorICAgIHB1YmxpYyB2b2lkIHRlc3RBbGVydFdpbmRvd09vbUFkaigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBBbGVydCB3aW5kb3dzIGFyZSBhbHdheXMgaGlkZGVuIHdoZW4gcnVubmluZyBpbiBWUi4KKyAgICAgICAgaWYgKGlzUnVubmluZ0luVlIoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHNldEFsZXJ0V2luZG93UGVybWlzc2lvbih0cnVlIC8qIGFsbG93ICovKTsKKworICAgICAgICBhc3NlcnRQYWNrYWdlSW1wb3J0YW5jZShJTVBPUlRBTkNFX1BFUkNFUFRJQkxFLCBJTVBPUlRBTkNFX1BFUkNFUFRJQkxFX1BSRV8yNik7CisKKyAgICAgICAgLy8gVE9ETyBBTS5nZXRVaWRJbXBvcnRhbmNlKCkgc29tZXRpbWVzIHJldHVybiBhIGRpZmZlcmVudCB2YWx1ZSBmcm9tIHdoYXQKKyAgICAgICAgLy8gZ2V0UGFja2FnZUltcG9ydGFuY2UoKSByZXR1cm5zLi4uIGIvMzc5NTA0NzIKKyAgICAgICAgLy8gYXNzZXJ0VWlkSW1wb3J0YW5jZShJTVBPUlRBTkNFX1BFUkNFUFRJQkxFLCBJTVBPUlRBTkNFX1BFUkNFUFRJQkxFX1BSRV8yNik7CisKKyAgICAgICAgYWRkQWxlcnRXaW5kb3coKTsKKyAgICAgICAgLy8gUHJvY2VzcyBpbXBvcnRhbmNlIHNob3VsZCBiZSBpbmNyZWFzZWQgdG8gdmlzaWJsZSB3aGVuIHRoZSBzZXJ2aWNlIGhhcyBhbiBhbGVydCB3aW5kb3cuCisgICAgICAgIGFzc2VydFBhY2thZ2VJbXBvcnRhbmNlKElNUE9SVEFOQ0VfVklTSUJMRSwgSU1QT1JUQU5DRV9WSVNJQkxFKTsKKworICAgICAgICBhZGRBbGVydFdpbmRvdygpOworICAgICAgICBhc3NlcnRQYWNrYWdlSW1wb3J0YW5jZShJTVBPUlRBTkNFX1ZJU0lCTEUsIElNUE9SVEFOQ0VfVklTSUJMRSk7CisKKyAgICAgICAgc2V0QWxlcnRXaW5kb3dQZXJtaXNzaW9uKGZhbHNlIC8qIGFsbG93ICovKTsKKyAgICAgICAgLy8gUHJvY2VzcyBpbXBvcnRhbmNlIHNob3VsZCBubyBsb25nZXIgYmUgdmlzaWJsZSBzaW5jZSBpdHMgYWxlcnQgd2luZG93cyBhcmUgbm90IGFsbG93ZWQgdG8KKyAgICAgICAgLy8gYmUgdmlzaWJsZS4KKyAgICAgICAgYXNzZXJ0UGFja2FnZUltcG9ydGFuY2UoSU1QT1JUQU5DRV9QRVJDRVBUSUJMRSwgSU1QT1JUQU5DRV9QRVJDRVBUSUJMRV9QUkVfMjYpOworCisgICAgICAgIHNldEFsZXJ0V2luZG93UGVybWlzc2lvbih0cnVlIC8qIGFsbG93ICovKTsKKyAgICAgICAgLy8gVGhleSBjYW4gc2hvdyBhZ2FpbiBzbyBpbXBvcnRhbmNlIHNob3VsZCBiZSB2aXNpYmxlIGFnYWluLgorICAgICAgICBhc3NlcnRQYWNrYWdlSW1wb3J0YW5jZShJTVBPUlRBTkNFX1ZJU0lCTEUsIElNUE9SVEFOQ0VfVklTSUJMRSk7CisKKyAgICAgICAgcmVtb3ZlQWxlcnRXaW5kb3coKTsKKyAgICAgICAgYXNzZXJ0UGFja2FnZUltcG9ydGFuY2UoSU1QT1JUQU5DRV9WSVNJQkxFLCBJTVBPUlRBTkNFX1ZJU0lCTEUpOworCisgICAgICAgIHJlbW92ZUFsZXJ0V2luZG93KCk7CisgICAgICAgIC8vIFByb2Nlc3MgaW1wb3J0YW5jZSBzaG91bGQgbm8gbG9uZ2VyIGJlIHZpc2libGUgd2hlbiB0aGUgc2VydmljZSBubyBsb25nZXIgYXMgYWxlcnQKKyAgICAgICAgLy8gd2luZG93cy4KKyAgICAgICAgYXNzZXJ0UGFja2FnZUltcG9ydGFuY2UoSU1QT1JUQU5DRV9QRVJDRVBUSUJMRSwgSU1QT1JUQU5DRV9QRVJDRVBUSUJMRV9QUkVfMjYpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhZGRBbGVydFdpbmRvdygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtU2VydmljZS5zZW5kKE1lc3NhZ2Uub2J0YWluKG51bGwsIEFsZXJ0V2luZG93U2VydmljZS5NU0dfQUREX0FMRVJUX1dJTkRPVykpOworICAgICAgICBzeW5jaHJvbml6ZWQgKG1BZGRlZExvY2spIHsKKyAgICAgICAgICAgIC8vIFdhaXQgZm9yIHdpbmRvdyBhZGRpdGlvbiBjb25maXJtYXRpb24gYmVmb3JlIHByb2NlZWRpbmcuCisgICAgICAgICAgICBtQWRkZWRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZW1vdmVBbGVydFdpbmRvdygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtU2VydmljZS5zZW5kKE1lc3NhZ2Uub2J0YWluKG51bGwsIEFsZXJ0V2luZG93U2VydmljZS5NU0dfUkVNT1ZFX0FMRVJUX1dJTkRPVykpOworICAgICAgICBzeW5jaHJvbml6ZWQgKG1SZW1vdmVMb2NrKSB7CisgICAgICAgICAgICAvLyBXYWl0IGZvciB3aW5kb3cgcmVtb3ZhbCBjb25maXJtYXRpb24gYmVmb3JlIHByb2NlZWRpbmcuCisgICAgICAgICAgICBtUmVtb3ZlTG9jay53YWl0KFdBSVRfVElNRV9NUyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0QWxlcnRXaW5kb3dQZXJtaXNzaW9uKGJvb2xlYW4gYWxsb3cpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgY21kID0gImFwcG9wcyBzZXQgIiArIG1TZXJ2aWNlUGFja2FnZU5hbWUKKyAgICAgICAgICAgICAgICArICIgYW5kcm9pZDpzeXN0ZW1fYWxlcnRfd2luZG93ICIgKyAoYWxsb3cgPyAiYWxsb3ciIDogImRlbnkiKTsKKyAgICAgICAgU3lzdGVtVXRpbC5ydW5TaGVsbENvbW1hbmQoSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCksIGNtZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydEltcG9ydGFuY2UoVG9JbnRGdW5jdGlvbjxBY3Rpdml0eU1hbmFnZXI+IGFwaUNhbGxlciwKKyAgICAgICAgICAgIGludCBleHBlY3RlZEZvck8sIGludCBleHBlY3RlZEZvclByZU8pIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBsb25nIFRJTUVPVVQgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSArIFRpbWVVbml0LlNFQ09ORFMudG9NaWxsaXMoMzApOworICAgICAgICBpbnQgYWN0dWFsOworCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIC8vIFRPRE86IFdlIHNob3VsZCB0cnkgdG8gdXNlIEFjdGl2aXR5TWFuYWdlclRlc3QuVWlkSW1wb3J0YW5jZUxpc3RlbmVyIGhlcmUgdG8gbGlzdGVuCisgICAgICAgICAgICAvLyBmb3IgY2hhbmdlcyBpbiB0aGUgdWlkIGltcG9ydGFuY2UuIEhvd2V2ZXIsIHRoZSB3YXkgaXQgaXMgY3VycmVudGx5IHN0cnVjdHVyZWQKKyAgICAgICAgICAgIC8vIGRvZXNuJ3QgcmVhbGx5IHdvcmsgZm9yIHRoaXMgdXNlIGNhc2UgcmlnaHQgbm93Li4uCisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNTAwKTsKKyAgICAgICAgICAgIGFjdHVhbCA9IGFwaUNhbGxlci5hcHBseUFzSW50KG1BbSk7CisgICAgICAgIH0gd2hpbGUgKGFjdHVhbCAhPSBleHBlY3RlZEZvck8gJiYgKFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpIDwgVElNRU9VVCkpOworCisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZEZvck8sIGFjdHVhbCk7CisKKyAgICAgICAgLy8gQ2hlY2sgdGhlIHJlc3VsdCBmb3IgcHJlLU8gYXBwcy4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkRm9yUHJlTywgYXBpQ2FsbGVyLmFwcGx5QXNJbnQobUFtMjUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYWtlIHN1cmUge0BsaW5rIEFjdGl2aXR5TWFuYWdlciNnZXRQYWNrYWdlSW1wb3J0YW5jZX0gcmV0dXJucyB0aGUgZXhwZWN0ZWQgdmFsdWUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFBhY2thZ2VJbXBvcnRhbmNlKGludCBleHBlY3RlZEZvck8sIGludCBleHBlY3RlZEZvclByZU8pIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRJbXBvcnRhbmNlKGFtIC0+IGFtLmdldFBhY2thZ2VJbXBvcnRhbmNlKG1TZXJ2aWNlUGFja2FnZU5hbWUpLAorICAgICAgICAgICAgICAgIGV4cGVjdGVkRm9yTywgZXhwZWN0ZWRGb3JQcmVPKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIFNlcnZpY2VDb25uZWN0aW9uIG1Db25uZWN0aW9uID0gbmV3IFNlcnZpY2VDb25uZWN0aW9uKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKENvbXBvbmVudE5hbWUgbmFtZSwgSUJpbmRlciBzZXJ2aWNlKSB7CisgICAgICAgICAgICBpZiAoREVCVUcpIExvZy5lKFRBRywgIm9uU2VydmljZUNvbm5lY3RlZCIpOworICAgICAgICAgICAgbVNlcnZpY2UgPSBuZXcgTWVzc2VuZ2VyKHNlcnZpY2UpOworICAgICAgICAgICAgbVNlcnZpY2VQYWNrYWdlTmFtZSA9IG5hbWUuZ2V0UGFja2FnZU5hbWUoKTsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUNvbm5lY3Rpb24pIHsKKyAgICAgICAgICAgICAgICBub3RpZnlBbGwoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VEaXNjb25uZWN0ZWQoQ29tcG9uZW50TmFtZSBuYW1lKSB7CisgICAgICAgICAgICBpZiAoREVCVUcpIExvZy5lKFRBRywgIm9uU2VydmljZURpc2Nvbm5lY3RlZCIpOworICAgICAgICAgICAgbVNlcnZpY2UgPSBudWxsOworICAgICAgICAgICAgbVNlcnZpY2VQYWNrYWdlTmFtZSA9IG51bGw7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBjbGFzcyBJbmNvbWluZ0hhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyIHsKKworICAgICAgICBJbmNvbWluZ0hhbmRsZXIoTG9vcGVyIGxvb3BlcikgeworICAgICAgICAgICAgc3VwZXIobG9vcGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBBbGVydFdpbmRvd1NlcnZpY2UuTVNHX09OX0FMRVJUX1dJTkRPV19BRERFRDoKKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtQWRkZWRMb2NrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy5lKFRBRywgIk1TR19PTl9BTEVSVF9XSU5ET1dfQURERUQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BZGRlZExvY2subm90aWZ5QWxsKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBBbGVydFdpbmRvd1NlcnZpY2UuTVNHX09OX0FMRVJUX1dJTkRPV19SRU1PVkVEOgorICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1SZW1vdmVMb2NrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy5lKFRBRywgIk1TR19PTl9BTEVSVF9XSU5ET1dfUkVNT1ZFRCIpOworICAgICAgICAgICAgICAgICAgICAgICAgbVJlbW92ZUxvY2subm90aWZ5QWxsKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgc3VwZXIuaGFuZGxlTWVzc2FnZShtc2cpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzUnVubmluZ0luVlIoKSB7CisgICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldFRhcmdldENvbnRleHQoKTsKKyAgICAgICAgaWYgKChjb250ZXh0LmdldFJlc291cmNlcygpLmdldENvbmZpZ3VyYXRpb24oKS51aU1vZGUgJiBDb25maWd1cmF0aW9uLlVJX01PREVfVFlQRV9NQVNLKQorICAgICAgICAgICAgID09IENvbmZpZ3VyYXRpb24uVUlfTU9ERV9UWVBFX1ZSX0hFQURTRVQpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS93aW5kb3dtYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci93bS9BbGVydFdpbmRvd3NUZXN0cy5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2Uvd2luZG93bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvd20vQWxlcnRXaW5kb3dzVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWI3YzE5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2Uvd2luZG93bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvd20vQWxlcnRXaW5kb3dzVGVzdHMuamF2YQpAQCAtMCwwICsxLDIyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci53bTsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5BcHBPcHNNYW5hZ2VyLk1PREVfQUxMT1dFRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuQXBwT3BzTWFuYWdlci5NT0RFX0VSUk9SRUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLkFwcE9wc01hbmFnZXIuT1BTVFJfU1lTVEVNX0FMRVJUX1dJTkRPVzsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIud20uYWxlcnR3aW5kb3dhcHAuQ29tcG9uZW50cy5BTEVSVF9XSU5ET1dfVEVTVF9BQ1RJVklUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIud20uYWxlcnR3aW5kb3dhcHBzZGsyNS5Db21wb25lbnRzLlNESzI1X0FMRVJUX1dJTkRPV19URVNUX0FDVElWSVRZOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5QcmVzdWJtaXQ7CitpbXBvcnQgYW5kcm9pZC5zZXJ2ZXIuYW0uQWN0aXZpdHlNYW5hZ2VyVGVzdEJhc2U7CitpbXBvcnQgYW5kcm9pZC5zZXJ2ZXIuYW0uV2FpdEZvclZhbGlkQWN0aXZpdHlTdGF0ZTsKK2ltcG9ydCBhbmRyb2lkLnNlcnZlci5hbS5XaW5kb3dNYW5hZ2VyU3RhdGU7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkFwcE9wc1V0aWxzOworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBCdWlsZC9JbnN0YWxsL1J1bjoKKyAqICAgICBhdGVzdCBDdHNXaW5kb3dNYW5hZ2VyRGV2aWNlVGVzdENhc2VzOkFsZXJ0V2luZG93c1Rlc3RzCisgKi8KK0BQcmVzdWJtaXQKK0BBcHBNb2RlRnVsbChyZWFzb24gPSAiUmVxdWlyZXMgYW5kcm9pZC5wZXJtaXNzaW9uLk1BTkFHRV9BQ1RJVklUWV9TVEFDS1MiKQorcHVibGljIGNsYXNzIEFsZXJ0V2luZG93c1Rlc3RzIGV4dGVuZHMgQWN0aXZpdHlNYW5hZ2VyVGVzdEJhc2UgeworCisgICAgLy8gRnJvbSBXaW5kb3dNYW5hZ2VyLmphdmEKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9CQVNFX0FQUExJQ0FUSU9OICAgICAgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGSVJTVF9TWVNURU1fV0lORE9XICAgICAgICA9IDIwMDA7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9QSE9ORSAgICAgICAgICAgICAgICAgPSBGSVJTVF9TWVNURU1fV0lORE9XICsgMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9TWVNURU1fQUxFUlQgICAgICAgICAgPSBGSVJTVF9TWVNURU1fV0lORE9XICsgMzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9TWVNURU1fT1ZFUkxBWSAgICAgICAgPSBGSVJTVF9TWVNURU1fV0lORE9XICsgNjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9QUklPUklUWV9QSE9ORSAgICAgICAgPSBGSVJTVF9TWVNURU1fV0lORE9XICsgNzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9TWVNURU1fRVJST1IgICAgICAgICAgPSBGSVJTVF9TWVNURU1fV0lORE9XICsgMTA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRZUEVfQVBQTElDQVRJT05fT1ZFUkxBWSAgID0gRklSU1RfU1lTVEVNX1dJTkRPVyArIDM4OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRZUEVfU1RBVFVTX0JBUiAgICAgICAgICAgID0gRklSU1RfU1lTVEVNX1dJTkRPVzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9JTlBVVF9NRVRIT0QgICAgICAgICAgPSBGSVJTVF9TWVNURU1fV0lORE9XICsgMTE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRZUEVfTkFWSUdBVElPTl9CQVIgICAgICAgID0gRklSU1RfU1lTVEVNX1dJTkRPVyArIDE5OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gQUxFUlRfV0lORE9XX1RZUEVTID0geworICAgICAgICAgICAgVFlQRV9QSE9ORSwKKyAgICAgICAgICAgIFRZUEVfUFJJT1JJVFlfUEhPTkUsCisgICAgICAgICAgICBUWVBFX1NZU1RFTV9BTEVSVCwKKyAgICAgICAgICAgIFRZUEVfU1lTVEVNX0VSUk9SLAorICAgICAgICAgICAgVFlQRV9TWVNURU1fT1ZFUkxBWSwKKyAgICAgICAgICAgIFRZUEVfQVBQTElDQVRJT05fT1ZFUkxBWQorICAgIH07CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gU1lTVEVNX1dJTkRPV19UWVBFUyA9IHsKKyAgICAgICAgICAgIFRZUEVfU1RBVFVTX0JBUiwKKyAgICAgICAgICAgIFRZUEVfSU5QVVRfTUVUSE9ELAorICAgICAgICAgICAgVFlQRV9OQVZJR0FUSU9OX0JBUgorICAgIH07CisKKyAgICBAQmVmb3JlCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgcmVzZXRQZXJtaXNzaW9uU3RhdGUoQUxFUlRfV0lORE9XX1RFU1RfQUNUSVZJVFkpOworICAgICAgICByZXNldFBlcm1pc3Npb25TdGF0ZShTREsyNV9BTEVSVF9XSU5ET1dfVEVTVF9BQ1RJVklUWSk7CisgICAgfQorCisgICAgQEFmdGVyCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICAgICAgcmVzZXRQZXJtaXNzaW9uU3RhdGUoQUxFUlRfV0lORE9XX1RFU1RfQUNUSVZJVFkpOworICAgICAgICByZXNldFBlcm1pc3Npb25TdGF0ZShTREsyNV9BTEVSVF9XSU5ET1dfVEVTVF9BQ1RJVklUWSk7CisgICAgICAgIHN0b3BUZXN0UGFja2FnZShBTEVSVF9XSU5ET1dfVEVTVF9BQ1RJVklUWSk7CisgICAgICAgIHN0b3BUZXN0UGFja2FnZShTREsyNV9BTEVSVF9XSU5ET1dfVEVTVF9BQ1RJVklUWSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWxlcnRXaW5kb3dBbGxvd2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJ1bkFsZXJ0V2luZG93VGVzdChBTEVSVF9XSU5ET1dfVEVTVF9BQ1RJVklUWSwgdHJ1ZSAvKiBoYXNBbGVydFdpbmRvd1Blcm1pc3Npb24gKi8sCisgICAgICAgICAgICAgICAgdHJ1ZSAvKiBhdExlYXN0TyAqLyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWxlcnRXaW5kb3dEaXNhbGxvd2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJ1bkFsZXJ0V2luZG93VGVzdChBTEVSVF9XSU5ET1dfVEVTVF9BQ1RJVklUWSwgZmFsc2UgLyogaGFzQWxlcnRXaW5kb3dQZXJtaXNzaW9uICovLAorICAgICAgICAgICAgICAgIHRydWUgLyogYXRMZWFzdE8gKi8pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFsZXJ0V2luZG93QWxsb3dlZFNkazI1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJ1bkFsZXJ0V2luZG93VGVzdChTREsyNV9BTEVSVF9XSU5ET1dfVEVTVF9BQ1RJVklUWSwgdHJ1ZSAvKiBoYXNBbGVydFdpbmRvd1Blcm1pc3Npb24gKi8sCisgICAgICAgICAgICAgICAgZmFsc2UgLyogYXRMZWFzdE8gKi8pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFsZXJ0V2luZG93RGlzYWxsb3dlZFNkazI1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJ1bkFsZXJ0V2luZG93VGVzdChTREsyNV9BTEVSVF9XSU5ET1dfVEVTVF9BQ1RJVklUWSwgZmFsc2UgLyogaGFzQWxlcnRXaW5kb3dQZXJtaXNzaW9uICovLAorICAgICAgICAgICAgICAgIGZhbHNlIC8qIGF0TGVhc3RPICovKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcnVuQWxlcnRXaW5kb3dUZXN0KGZpbmFsIENvbXBvbmVudE5hbWUgYWN0aXZpdHlOYW1lLAorICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBoYXNBbGVydFdpbmRvd1Blcm1pc3Npb24sIGZpbmFsIGJvb2xlYW4gYXRMZWFzdE8pIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzZXRBbGVydFdpbmRvd1Blcm1pc3Npb24oYWN0aXZpdHlOYW1lLCBoYXNBbGVydFdpbmRvd1Blcm1pc3Npb24pOworCisgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoZ2V0QW1TdGFydENtZChhY3Rpdml0eU5hbWUpKTsKKyAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUobmV3IFdhaXRGb3JWYWxpZEFjdGl2aXR5U3RhdGUoYWN0aXZpdHlOYW1lKSk7CisgICAgICAgIG1BbVdtU3RhdGUuYXNzZXJ0VmlzaWJpbGl0eShhY3Rpdml0eU5hbWUsIHRydWUpOworCisgICAgICAgIGFzc2VydEFsZXJ0V2luZG93cyhhY3Rpdml0eU5hbWUsIGhhc0FsZXJ0V2luZG93UGVybWlzc2lvbiwgYXRMZWFzdE8pOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBhbGxXaW5kb3dzSGlkZGVuKExpc3Q8V2luZG93TWFuYWdlclN0YXRlLldpbmRvd1N0YXRlPiB3aW5kb3dzKSB7CisgICAgICAgIGZvciAoV2luZG93TWFuYWdlclN0YXRlLldpbmRvd1N0YXRlIHdzIDogd2luZG93cykgeworICAgICAgICAgICAgaWYgKHdzLmlzU2hvd24oKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0QWxlcnRXaW5kb3dzKGZpbmFsIENvbXBvbmVudE5hbWUgYWN0aXZpdHlOYW1lLAorICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBoYXNBbGVydFdpbmRvd1Blcm1pc3Npb24sIGZpbmFsIGJvb2xlYW4gYXRMZWFzdE8pIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgcGFja2FnZU5hbWUgPSBhY3Rpdml0eU5hbWUuZ2V0UGFja2FnZU5hbWUoKTsKKyAgICAgICAgZmluYWwgV2luZG93TWFuYWdlclN0YXRlIHdtU3RhdGUgPSBtQW1XbVN0YXRlLmdldFdtU3RhdGUoKTsKKworICAgICAgICBmaW5hbCBMaXN0PFdpbmRvd01hbmFnZXJTdGF0ZS5XaW5kb3dTdGF0ZT4gYWxlcnRXaW5kb3dzID0KKyAgICAgICAgICAgICAgICB3bVN0YXRlLmdldFdpbmRvd3NCeVBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lLCBBTEVSVF9XSU5ET1dfVFlQRVMpOworCisgICAgICAgIGlmICghaGFzQWxlcnRXaW5kb3dQZXJtaXNzaW9uKSB7CisgICAgICAgICAgICAvLyBXaGVuIHJ1bm5pbmcgaW4gVlIgTW9kZSwgYW4gQXBwIE9wIHJlc3RyaWN0aW9uIGlzCisgICAgICAgICAgICAvLyBpbiBwbGFjZSBmb3IgU1lTVEVNX0FMRVJUX1dJTkRPVywgd2hpY2ggYWxsb3dzIHRoZSB3aW5kb3cKKyAgICAgICAgICAgIC8vIHRvIGJlIGNyZWF0ZWQsIGJ1dCB3aWxsIGJlIGhpZGRlbiBpbnN0ZWFkLgorICAgICAgICAgICAgaWYgKGlzVWlNb2RlTG9ja2VkVG9WckhlYWRzZXQoKSkgeworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIlNob3VsZCBub3QgYmUgZW1wdHkgYWxlcnRXaW5kb3dzPSIgKyBhbGVydFdpbmRvd3MsCisgICAgICAgICAgICAgICAgICAgICAgICAhYWxlcnRXaW5kb3dzLmlzRW1wdHkoKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQWxsIGFsZXJ0IHdpbmRvd3Mgc2hvdWxkIGJlIGhpZGRlbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBhbGxXaW5kb3dzSGlkZGVuKGFsZXJ0V2luZG93cykpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJTaG91bGQgYmUgZW1wdHkgYWxlcnRXaW5kb3dzPSIgKyBhbGVydFdpbmRvd3MsCisgICAgICAgICAgICAgICAgICAgICAgICBhbGVydFdpbmRvd3MuaXNFbXB0eSgpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKEFwcE9wc1V0aWxzLnJlamVjdGVkT3BlcmF0aW9uTG9nZ2VkKHBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgT1BTVFJfU1lTVEVNX0FMRVJUX1dJTkRPVykpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChhdExlYXN0TykgeworICAgICAgICAgICAgLy8gQXNzZXJ0IHRoYXQgb25seSBUWVBFX0FQUExJQ0FUSU9OX09WRVJMQVkgd2FzIGNyZWF0ZWQuCisgICAgICAgICAgICBmb3IgKFdpbmRvd01hbmFnZXJTdGF0ZS5XaW5kb3dTdGF0ZSB3aW4gOiBhbGVydFdpbmRvd3MpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJDYW4ndCBjcmVhdGUgd2luPSIgKyB3aW4gKyAiIG9uIFNESyBPIG9yIGdyZWF0ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgd2luLmdldFR5cGUoKSA9PSBUWVBFX0FQUExJQ0FUSU9OX09WRVJMQVkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZmluYWwgV2luZG93TWFuYWdlclN0YXRlLldpbmRvd1N0YXRlIG1haW5BcHBXaW5kb3cgPQorICAgICAgICAgICAgICAgIHdtU3RhdGUuZ2V0V2luZG93QnlQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSwgVFlQRV9CQVNFX0FQUExJQ0FUSU9OKTsKKworICAgICAgICBhc3NlcnROb3ROdWxsKG1haW5BcHBXaW5kb3cpOworCisgICAgICAgIGZpbmFsIFdpbmRvd01hbmFnZXJTdGF0ZS5XaW5kb3dTdGF0ZSBsb3dlc3RBbGVydFdpbmRvdyA9IGFsZXJ0V2luZG93cy5nZXQoMCk7CisgICAgICAgIGZpbmFsIFdpbmRvd01hbmFnZXJTdGF0ZS5XaW5kb3dTdGF0ZSBoaWdoZXN0QWxlcnRXaW5kb3cgPQorICAgICAgICAgICAgICAgIGFsZXJ0V2luZG93cy5nZXQoYWxlcnRXaW5kb3dzLnNpemUoKSAtIDEpOworCisgICAgICAgIC8vIEFzc2VydCB0aGF0IHRoZSBhbGVydCB3aW5kb3dzIGhhdmUgaGlnaGVyIHotb3JkZXIgdGhhbiB0aGUgbWFpbiBhcHAgd2luZG93CisgICAgICAgIGFzc2VydFRydWUoImxvd2VzdEFsZXJ0V2luZG93PSIgKyBsb3dlc3RBbGVydFdpbmRvdyArICIgbGVzcyB0aGFuIG1haW5BcHBXaW5kb3c9IgorICAgICAgICAgICAgICAgICsgbWFpbkFwcFdpbmRvdywKKyAgICAgICAgICAgICAgICB3bVN0YXRlLmdldFpPcmRlcihsb3dlc3RBbGVydFdpbmRvdykgPiB3bVN0YXRlLmdldFpPcmRlcihtYWluQXBwV2luZG93KSk7CisKKyAgICAgICAgLy8gQXNzZXJ0IHRoYXQgbGVnYWN5IGFsZXJ0IHdpbmRvd3MgaGF2ZSBhIGxvd2VyIHotb3JkZXIgdGhhbiB0aGUgbmV3IGFsZXJ0IHdpbmRvdyBsYXllci4KKyAgICAgICAgZmluYWwgV2luZG93TWFuYWdlclN0YXRlLldpbmRvd1N0YXRlIGFwcE92ZXJsYXlXaW5kb3cgPQorICAgICAgICAgICAgICAgIHdtU3RhdGUuZ2V0V2luZG93QnlQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSwgVFlQRV9BUFBMSUNBVElPTl9PVkVSTEFZKTsKKyAgICAgICAgaWYgKGFwcE92ZXJsYXlXaW5kb3cgIT0gbnVsbCAmJiBoaWdoZXN0QWxlcnRXaW5kb3cgIT0gYXBwT3ZlcmxheVdpbmRvdykgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiaGlnaGVzdEFsZXJ0V2luZG93PSIgKyBoaWdoZXN0QWxlcnRXaW5kb3cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZ3JlYXRlciB0aGFuIGFwcE92ZXJsYXlXaW5kb3c9IiArIGFwcE92ZXJsYXlXaW5kb3csCisgICAgICAgICAgICAgICAgICAgIHdtU3RhdGUuZ2V0Wk9yZGVyKGhpZ2hlc3RBbGVydFdpbmRvdykgPCB3bVN0YXRlLmdldFpPcmRlcihhcHBPdmVybGF5V2luZG93KSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBBc3NlcnQgdGhhdCBhbGVydCB3aW5kb3dzIGFyZSBiZWxvdyBrZXkgc3lzdGVtIHdpbmRvd3MuCisgICAgICAgIGZpbmFsIExpc3Q8V2luZG93TWFuYWdlclN0YXRlLldpbmRvd1N0YXRlPiBzeXN0ZW1XaW5kb3dzID0KKyAgICAgICAgICAgICAgICB3bVN0YXRlLmdldFdpbmRvd3NCeVBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lLCBTWVNURU1fV0lORE9XX1RZUEVTKTsKKyAgICAgICAgaWYgKCFzeXN0ZW1XaW5kb3dzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgZmluYWwgV2luZG93TWFuYWdlclN0YXRlLldpbmRvd1N0YXRlIGxvd2VzdFN5c3RlbVdpbmRvdyA9IGFsZXJ0V2luZG93cy5nZXQoMCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJoaWdoZXN0QWxlcnRXaW5kb3c9IiArIGhpZ2hlc3RBbGVydFdpbmRvdworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBncmVhdGVyIHRoYW4gbG93ZXN0U3lzdGVtV2luZG93PSIgKyBsb3dlc3RTeXN0ZW1XaW5kb3csCisgICAgICAgICAgICAgICAgICAgIHdtU3RhdGUuZ2V0Wk9yZGVyKGhpZ2hlc3RBbGVydFdpbmRvdykgPCB3bVN0YXRlLmdldFpPcmRlcihsb3dlc3RTeXN0ZW1XaW5kb3cpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKEFwcE9wc1V0aWxzLmFsbG93ZWRPcGVyYXRpb25Mb2dnZWQocGFja2FnZU5hbWUsIE9QU1RSX1NZU1RFTV9BTEVSVF9XSU5ET1cpKTsKKyAgICB9CisKKyAgICAvLyBSZXNldHMgdGhlIHBlcm1pc3Npb24gc3RhdGVzIGZvciBhIHBhY2thZ2UgdG8gdGhlIHN5c3RlbSBkZWZhdWx0cy4KKyAgICAvLyBBbHNvIGNsZWFycyB0aGUgYXBwIG9wZXJhdGlvbiBsb2dzIGZvciB0aGlzIHBhY2thZ2UsIHJlcXVpcmVkIHRvIHRlc3QgdGhhdCBkaXNwbGF5aW5nCisgICAgLy8gdGhlIGFsZXJ0IHdpbmRvdyBnZXRzIGxvZ2dlZC4KKyAgICBwcml2YXRlIHZvaWQgcmVzZXRQZXJtaXNzaW9uU3RhdGUoQ29tcG9uZW50TmFtZSBhY3Rpdml0eU5hbWUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBBcHBPcHNVdGlscy5yZXNldChhY3Rpdml0eU5hbWUuZ2V0UGFja2FnZU5hbWUoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldEFsZXJ0V2luZG93UGVybWlzc2lvbihmaW5hbCBDb21wb25lbnROYW1lIGFjdGl2aXR5TmFtZSwgZmluYWwgYm9vbGVhbiBhbGxvdykKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbnQgbW9kZSA9IGFsbG93ID8gTU9ERV9BTExPV0VEIDogTU9ERV9FUlJPUkVEOworICAgICAgICBBcHBPcHNVdGlscy5zZXRPcE1vZGUoYWN0aXZpdHlOYW1lLmdldFBhY2thZ2VOYW1lKCksIE9QU1RSX1NZU1RFTV9BTEVSVF9XSU5ET1csIG1vZGUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL3dpbmRvd21hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL3dtL0Nyb3NzQXBwRHJhZ0FuZERyb3BUZXN0cy5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2Uvd2luZG93bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvd20vQ3Jvc3NBcHBEcmFnQW5kRHJvcFRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI5ZGNhMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL3dpbmRvd21hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL3dtL0Nyb3NzQXBwRHJhZ0FuZERyb3BUZXN0cy5qYXZhCkBAIC0wLDAgKzEsNTM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci53bTsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5XaW5kb3dDb25maWd1cmF0aW9uLldJTkRPV0lOR19NT0RFX0ZSRUVGT1JNOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5XaW5kb3dDb25maWd1cmF0aW9uLldJTkRPV0lOR19NT0RFX0ZVTExTQ1JFRU5fT1JfU1BMSVRfU0NSRUVOX1NFQ09OREFSWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuV2luZG93Q29uZmlndXJhdGlvbi5XSU5ET1dJTkdfTU9ERV9QSU5ORUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLldpbmRvd0NvbmZpZ3VyYXRpb24uV0lORE9XSU5HX01PREVfU1BMSVRfU0NSRUVOX1BSSU1BUlk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5GRUFUVVJFX0ZSRUVGT1JNX1dJTkRPV19NQU5BR0VNRU5UOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5BY3Rpdml0eU1hbmFnZXJUZXN0QmFzZS5leGVjdXRlU2hlbGxDb21tYW5kOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5TdGF0ZUxvZ2dlci5sb2c7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLlVpRGV2aWNlVXRpbHMuZHJhZ1BvaW50ZXI7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLlVpRGV2aWNlVXRpbHMucHJlc3NNZW51QnV0dG9uOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5VaURldmljZVV0aWxzLndha2VVcERldmljZTsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc3VtZS5hc3N1bWVUcnVlOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQ7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5kaXNwbGF5LkRpc3BsYXlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5QcmVzdWJtaXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuRGlzcGxheTsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKKy8qKgorICogQnVpbGQ6IG1tbWEgLWozMiBjdHMvdGVzdHMvZnJhbWV3b3JrL2Jhc2UKKyAqIFJ1bjogY3RzL3Rlc3RzL2ZyYW1ld29yay9iYXNlL2FjdGl2aXR5bWFuYWdlci91dGlsL3J1bi10ZXN0IEN0c1dpbmRvd01hbmFnZXJEZXZpY2VUZXN0Q2FzZXMgYW5kcm9pZC5zZXJ2ZXIud20uQ3Jvc3NBcHBEcmFnQW5kRHJvcFRlc3RzCisgKi8KK0BQcmVzdWJtaXQKK0BBcHBNb2RlRnVsbChyZWFzb24gPSAiUmVxdWlyZXMgYW5kcm9pZC5wZXJtaXNzaW9uLk1BTkFHRV9BQ1RJVklUWV9TVEFDS1MiKQorcHVibGljIGNsYXNzIENyb3NzQXBwRHJhZ0FuZERyb3BUZXN0cyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJDcm9zc0FwcERyYWdBbmREcm9wIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTV9GT1JDRV9TVE9QID0gImFtIGZvcmNlLXN0b3AgIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU1fTU9WRV9UQVNLID0gImFtIHN0YWNrIG1vdmUtdGFzayAiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTV9SRVNJWkVfVEFTSyA9ICJhbSB0YXNrIHJlc2l6ZSAiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTV9SRU1PVkVfU1RBQ0sgPSAiYW0gc3RhY2sgcmVtb3ZlICI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFNX1NUQVJUX04gPSAiYW0gc3RhcnQgLW4gIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU1fU1RBQ0tfTElTVCA9ICJhbSBzdGFjayBsaXN0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19JRF9QUkVGSVggPSAidGFza0lkIjsKKworICAgIC8vIFJlZ2V4IHBhdHRlcm4gdG8gbWF0Y2ggYWRiIHNoZWxsIGFtIHN0YWNrIGxpc3Qgb3V0cHV0IG9mIHRoZSBmb3JtOgorICAgIC8vIHRhc2tJZD08VEFTS19JRD46IDxjb21wb25lbnROYW1lPiBib3VuZHM9W0xFRlQsVE9QXVtSSUdIVCxCT1RUT01dCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfUkVHRVhfUEFUVEVSTl9TVFJJTkcgPQorICAgICAgICAgICAgInRhc2tJZD1bMC05XSs6ICVzIGJvdW5kcz1cXFtbMC05XSssWzAtOV0rXFxdXFxbWzAtOV0rLFswLTldK1xcXSI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1dJUEVfU1RFUFMgPSAxMDA7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09VUkNFX1BBQ0tBR0VfTkFNRSA9ICJhbmRyb2lkLnNlcnZlci53bS5kbmRzb3VyY2VhcHAiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfUEFDS0FHRV9OQU1FID0gImFuZHJvaWQuc2VydmVyLndtLmRuZHRhcmdldGFwcCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF8yM19QQUNLQUdFX05BTUUgPSAiYW5kcm9pZC5zZXJ2ZXIud20uZG5kdGFyZ2V0YXBwc2RrMjMiOworCisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09VUkNFX0FDVElWSVRZX05BTUUgPSAiRHJhZ1NvdXJjZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9BQ1RJVklUWV9OQU1FID0gIkRyb3BUYXJnZXQiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfR0xPQkFMID0gImZpbGVfZ2xvYmFsIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9MT0NBTCA9ICJmaWxlX2xvY2FsIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUxMT1dfR0xPQkFMID0gImRpc2FsbG93X2dsb2JhbCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBTkNFTF9TT09OID0gImNhbmNlbF9zb29uIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JBTlRfTk9ORSA9ICJncmFudF9ub25lIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JBTlRfUkVBRCA9ICJncmFudF9yZWFkIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JBTlRfV1JJVEUgPSAiZ3JhbnRfd3JpdGUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHUkFOVF9SRUFEX1BSRUZJWCA9ICJncmFudF9yZWFkX3ByZWZpeCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdSQU5UX1JFQURfTk9QUkVGSVggPSAiZ3JhbnRfcmVhZF9ub3ByZWZpeCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdSQU5UX1JFQURfUEVSU0lTVEFCTEUgPSAiZ3JhbnRfcmVhZF9wZXJzaXN0YWJsZSI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVRVUVTVF9OT05FID0gInJlcXVlc3Rfbm9uZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVFU1RfUkVBRCA9ICJyZXF1ZXN0X3JlYWQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVRVNUX1JFQURfTkVTVEVEID0gInJlcXVlc3RfcmVhZF9uZXN0ZWQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVRVNUX1RBS0VfUEVSU0lTVEFCTEUgPSAicmVxdWVzdF90YWtlX3BlcnNpc3RhYmxlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVRVUVTVF9XUklURSA9ICJyZXF1ZXN0X3dyaXRlIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTT1VSQ0VfTE9HX1RBRyA9ICJEcmFnU291cmNlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX0xPR19UQUcgPSAiRHJvcFRhcmdldCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVUxUX0tFWV9TVEFSVF9EUkFHID0gIlNUQVJUX0RSQUciOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRfS0VZX0RSQUdfU1RBUlRFRCA9ICJEUkFHX1NUQVJURUQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRfS0VZX0RSQUdfRU5ERUQgPSAiRFJBR19FTkRFRCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9LRVlfRVhUUkFTID0gIkVYVFJBUyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9LRVlfRFJPUF9SRVNVTFQgPSAiRFJPUCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9LRVlfQUNDRVNTX0JFRk9SRSA9ICJCRUZPUkUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRfS0VZX0FDQ0VTU19BRlRFUiA9ICJBRlRFUiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9LRVlfQ0xJUF9EQVRBX0VSUk9SID0gIkNMSVBfREFUQV9FUlJPUiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9LRVlfQ0xJUF9ERVNDUl9FUlJPUiA9ICJDTElQX0RFU0NSX0VSUk9SIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVUxUX0tFWV9MT0NBTF9TVEFURV9FUlJPUiA9ICJMT0NBTF9TVEFURV9FUlJPUiI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVUxUX01JU1NJTkcgPSAiTWlzc2luZyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9PSyA9ICJPSyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9FWENFUFRJT04gPSAiRXhjZXB0aW9uIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVUxUX05VTExfRFJPUF9QRVJNSVNTSU9OUyA9ICJOdWxsIERyYWdBbmREcm9wUGVybWlzc2lvbnMiOworCisgICAgcHJvdGVjdGVkIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJvdGVjdGVkIEFjdGl2aXR5TWFuYWdlciBtQW07CisgICAgcHJvdGVjdGVkIERpc3BsYXlNYW5hZ2VyIG1EbTsKKworICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBtU291cmNlUmVzdWx0czsKKyAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gbVRhcmdldFJlc3VsdHM7CisKKyAgICBwcml2YXRlIFN0cmluZyBtU291cmNlUGFja2FnZU5hbWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgbVRhcmdldFBhY2thZ2VOYW1lOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbVNlc3Npb25JZDsKKyAgICBwcml2YXRlIFN0cmluZyBtU291cmNlTG9nVGFnOworICAgIHByaXZhdGUgU3RyaW5nIG1UYXJnZXRMb2dUYWc7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzdW1lVHJ1ZShzdXBwb3J0c0RyYWdBbmREcm9wKCkpOworCisgICAgICAgIC8vIFVzZSB1cHRpbWUgaW4gc2Vjb25kcyBhcyB1bmlxdWUgdGVzdCBpbnZvY2F0aW9uIGlkLgorICAgICAgICBtU2Vzc2lvbklkID0gTG9uZy50b1N0cmluZyhTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSAvIDEwMDApOworICAgICAgICBtU291cmNlTG9nVGFnID0gU09VUkNFX0xPR19UQUcgKyBtU2Vzc2lvbklkOworICAgICAgICBtVGFyZ2V0TG9nVGFnID0gVEFSR0VUX0xPR19UQUcgKyBtU2Vzc2lvbklkOworCisgICAgICAgIG1Db250ZXh0ID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpOworICAgICAgICBtQW0gPSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKEFjdGl2aXR5TWFuYWdlci5jbGFzcyk7CisgICAgICAgIG1EbSA9IG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoRGlzcGxheU1hbmFnZXIuY2xhc3MpOworCisgICAgICAgIG1Tb3VyY2VQYWNrYWdlTmFtZSA9IFNPVVJDRV9QQUNLQUdFX05BTUU7CisgICAgICAgIG1UYXJnZXRQYWNrYWdlTmFtZSA9IFRBUkdFVF9QQUNLQUdFX05BTUU7CisgICAgICAgIGNsZWFudXBTdGF0ZSgpOworICAgIH0KKworICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghc3VwcG9ydHNEcmFnQW5kRHJvcCgpKSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChBTV9GT1JDRV9TVE9QICsgbVNvdXJjZVBhY2thZ2VOYW1lKTsKKyAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChBTV9GT1JDRV9TVE9QICsgbVRhcmdldFBhY2thZ2VOYW1lKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2xlYXJMb2dzKCkgeworICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKCJsb2djYXQgLWMiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRTdGFydENvbW1hbmQoU3RyaW5nIGNvbXBvbmVudE5hbWUsIFN0cmluZyBtb2RlRXh0cmEsIFN0cmluZyBsb2d0YWcpIHsKKyAgICAgICAgcmV0dXJuIEFNX1NUQVJUX04gKyBjb21wb25lbnROYW1lICsgIiAtZSBtb2RlICIgKyBtb2RlRXh0cmEgKyAiIC1lIGxvZ3RhZyAiICsgbG9ndGFnOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldE1vdmVUYXNrQ29tbWFuZChpbnQgdGFza0lkLCBpbnQgc3RhY2tJZCkgeworICAgICAgICByZXR1cm4gQU1fTU9WRV9UQVNLICsgdGFza0lkICsgIiAiICsgc3RhY2tJZCArICIgdHJ1ZSI7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UmVzaXplVGFza0NvbW1hbmQoaW50IHRhc2tJZCwgUG9pbnQgdG9wTGVmdCwgUG9pbnQgYm90dG9tUmlnaHQpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIEFNX1JFU0laRV9UQVNLICsgdGFza0lkICsgIiAiICsgdG9wTGVmdC54ICsgIiAiICsgdG9wTGVmdC55ICsgIiAiICsgYm90dG9tUmlnaHQueAorICAgICAgICAgICAgICAgICsgIiAiICsgYm90dG9tUmlnaHQueTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRDb21wb25lbnROYW1lKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGFjdGl2aXR5TmFtZSkgeworICAgICAgICByZXR1cm4gcGFja2FnZU5hbWUgKyAiLyIgKyBwYWNrYWdlTmFtZSArICIuIiArIGFjdGl2aXR5TmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYWtlIHN1cmUgdGhhdCB0aGUgc3BlY2lhbCBhY3Rpdml0eSBzdGFja3MgYXJlIHJlbW92ZWQgYW5kIHRoZSBBY3Rpdml0eU1hbmFnZXIvV2luZG93TWFuYWdlcgorICAgICAqIGlzIGluIGEgZ29vZCBzdGF0ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY2xlYW51cFN0YXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoQU1fRk9SQ0VfU1RPUCArIFNPVVJDRV9QQUNLQUdFX05BTUUpOworICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKEFNX0ZPUkNFX1NUT1AgKyBUQVJHRVRfUEFDS0FHRV9OQU1FKTsKKyAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChBTV9GT1JDRV9TVE9QICsgVEFSR0VUXzIzX1BBQ0tBR0VfTkFNRSk7CisgICAgICAgIHVubG9ja0RldmljZSgpOworICAgICAgICBjbGVhckxvZ3MoKTsKKworICAgICAgICAvLyBSZW1vdmUgc3BlY2lhbCBzdGFja3MuCisgICAgICAgIG1BbS5yZW1vdmVTdGFja3NJbldpbmRvd2luZ01vZGVzKG5ldyBpbnRbXSB7CisgICAgICAgICAgICAgICAgV0lORE9XSU5HX01PREVfUElOTkVELAorICAgICAgICAgICAgICAgIFdJTkRPV0lOR19NT0RFX1NQTElUX1NDUkVFTl9QUklNQVJZLAorICAgICAgICAgICAgICAgIFdJTkRPV0lOR19NT0RFX0ZSRUVGT1JNCisgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBsYXVuY2hEb2NrZWRBY3Rpdml0eShTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBhY3Rpdml0eU5hbWUsIFN0cmluZyBtb2RlLAorICAgICAgICAgICAgU3RyaW5nIGxvZ3RhZykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGNsZWFyTG9ncygpOworICAgICAgICBmaW5hbCBTdHJpbmcgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWUocGFja2FnZU5hbWUsIGFjdGl2aXR5TmFtZSk7CisgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoZ2V0U3RhcnRDb21tYW5kKGNvbXBvbmVudE5hbWUsIG1vZGUsIGxvZ3RhZykgKyAiIC0td2luZG93aW5nTW9kZSAiCisgICAgICAgICAgICAgICAgKyBXSU5ET1dJTkdfTU9ERV9TUExJVF9TQ1JFRU5fUFJJTUFSWSk7CisgICAgICAgIHdhaXRGb3JSZXN1bWUocGFja2FnZU5hbWUsIGFjdGl2aXR5TmFtZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGxhdW5jaEZ1bGxzY3JlZW5BY3Rpdml0eShTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBhY3Rpdml0eU5hbWUsIFN0cmluZyBtb2RlLAorICAgICAgICAgICAgU3RyaW5nIGxvZ3RhZykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGNsZWFyTG9ncygpOworICAgICAgICBmaW5hbCBTdHJpbmcgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWUocGFja2FnZU5hbWUsIGFjdGl2aXR5TmFtZSk7CisgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoZ2V0U3RhcnRDb21tYW5kKGNvbXBvbmVudE5hbWUsIG1vZGUsIGxvZ3RhZykgKyAiIC0td2luZG93aW5nTW9kZSAiCisgICAgICAgICAgICAgICAgKyBXSU5ET1dJTkdfTU9ERV9GVUxMU0NSRUVOX09SX1NQTElUX1NDUkVFTl9TRUNPTkRBUlkpOworICAgICAgICB3YWl0Rm9yUmVzdW1lKHBhY2thZ2VOYW1lLCBhY3Rpdml0eU5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBkaXNwbGF5U2l6ZSBzaXplIG9mIHRoZSBkaXNwbGF5CisgICAgICogQHBhcmFtIGxlZnRTaWRlIHtAY29kZSB0cnVlfSB0byBsYXVuY2ggdGhlIGFwcCB0YWtpbmcgdXAgdGhlIGxlZnQgaGFsZiBvZiB0aGUgZGlzcGxheSwKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gdG8gbGF1bmNoIHRoZSBhcHAgdGFraW5nIHVwIHRoZSByaWdodCBoYWxmIG9mIHRoZSBkaXNwbGF5LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBsYXVuY2hGcmVlZm9ybUFjdGl2aXR5KFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGFjdGl2aXR5TmFtZSwgU3RyaW5nIG1vZGUsCisgICAgICAgICAgICBTdHJpbmcgbG9ndGFnLCBQb2ludCBkaXNwbGF5U2l6ZSwgYm9vbGVhbiBsZWZ0U2lkZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGNsZWFyTG9ncygpOworICAgICAgICBmaW5hbCBTdHJpbmcgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWUocGFja2FnZU5hbWUsIGFjdGl2aXR5TmFtZSk7CisgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoZ2V0U3RhcnRDb21tYW5kKGNvbXBvbmVudE5hbWUsIG1vZGUsIGxvZ3RhZykgKyAiIC0td2luZG93aW5nTW9kZSAiCisgICAgICAgICAgICAgICAgKyBXSU5ET1dJTkdfTU9ERV9GUkVFRk9STSk7CisgICAgICAgIHdhaXRGb3JSZXN1bWUocGFja2FnZU5hbWUsIGFjdGl2aXR5TmFtZSk7CisgICAgICAgIFBvaW50IHRvcExlZnQgPSBuZXcgUG9pbnQobGVmdFNpZGUgPyAwIDogZGlzcGxheVNpemUueCAvIDIsIDApOworICAgICAgICBQb2ludCBib3R0b21SaWdodCA9IG5ldyBQb2ludChsZWZ0U2lkZSA/IGRpc3BsYXlTaXplLnggLyAyIDogZGlzcGxheVNpemUueCwgZGlzcGxheVNpemUueSk7CisgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoZ2V0UmVzaXplVGFza0NvbW1hbmQoZ2V0QWN0aXZpdHlUYXNrSWQoY29tcG9uZW50TmFtZSksIHRvcExlZnQsCisgICAgICAgICAgICAgICAgYm90dG9tUmlnaHQpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgd2FpdEZvclJlc3VtZShTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBhY3Rpdml0eU5hbWUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgZnVsbEFjdGl2aXR5TmFtZSA9IHBhY2thZ2VOYW1lICsgIi4iICsgYWN0aXZpdHlOYW1lOworICAgICAgICBpbnQgcmV0cnlDb3VudCA9IDM7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcCg1MDApOworICAgICAgICAgICAgU3RyaW5nIGxvZ3MgPSBleGVjdXRlU2hlbGxDb21tYW5kKCJsb2djYXQgLWQgLWIgZXZlbnRzIik7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBsaW5lIDogbG9ncy5zcGxpdCgiXFxuIikpIHsKKyAgICAgICAgICAgICAgICBpZiAobGluZS5jb250YWlucygiYW1fb25fcmVzdW1lX2NhbGxlZCIpICYmIGxpbmUuY29udGFpbnMoZnVsbEFjdGl2aXR5TmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAocmV0cnlDb3VudC0tID4gMCk7CisKKyAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbihmdWxsQWN0aXZpdHlOYW1lICsgIiBoYXMgZmFpbGVkIHRvIHN0YXJ0Iik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluamVjdElucHV0KFBvaW50IGZyb20sIFBvaW50IHRvLCBpbnQgc3RlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkcmFnUG9pbnRlcihmcm9tLCB0bywgc3RlcHMpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGZpbmRUYXNrSW5mbyhTdHJpbmcgbmFtZSkgeworICAgICAgICBmaW5hbCBTdHJpbmcgb3V0cHV0ID0gZXhlY3V0ZVNoZWxsQ29tbWFuZChBTV9TVEFDS19MSVNUKTsKKyAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgYnVpbGRlci5hcHBlbmQoIkZpbmRpbmcgdGFzayBpbmZvIGZvciB0YXNrOiAiKTsKKyAgICAgICAgYnVpbGRlci5hcHBlbmQobmFtZSk7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJcblBhcnNpbmcgYWRiIHNoZWxsIGFtIG91dHB1dDogIik7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKG91dHB1dCk7CisgICAgICAgIGxvZyhidWlsZGVyLnRvU3RyaW5nKCkpOworICAgICAgICBmaW5hbCBQYXR0ZXJuIHBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoU3RyaW5nLmZvcm1hdChUQVNLX1JFR0VYX1BBVFRFUk5fU1RSSU5HLCBuYW1lKSk7CisgICAgICAgIGZvciAoU3RyaW5nIGxpbmUgOiBvdXRwdXQuc3BsaXQoIlxcbiIpKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdHJ1bmNhdGVkTGluZTsKKyAgICAgICAgICAgIC8vIE9ubHkgbG9vayBmb3IgdGhlIGFjdGl2aXR5IG5hbWUgYmVmb3JlIHRoZSAidG9wQWN0aXZpdHkiIHN0cmluZy4KKyAgICAgICAgICAgIGZpbmFsIGludCBwb3MgPSBsaW5lLmluZGV4T2YoInRvcEFjdGl2aXR5Iik7CisgICAgICAgICAgICBpZiAocG9zID4gMCkgeworICAgICAgICAgICAgICAgIHRydW5jYXRlZExpbmUgPSBsaW5lLnN1YnN0cmluZygwLCBwb3MpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0cnVuY2F0ZWRMaW5lID0gbGluZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwYXR0ZXJuLm1hdGNoZXIodHJ1bmNhdGVkTGluZSkuZmluZCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydW5jYXRlZExpbmU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICIiOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBnZXRXaW5kb3dCb3VuZHMoU3RyaW5nIG5hbWUsIFBvaW50IGZyb20sIFBvaW50IHRvKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHRhc2tJbmZvID0gZmluZFRhc2tJbmZvKG5hbWUpOworICAgICAgICBmaW5hbCBTdHJpbmdbXSBzZWN0aW9ucyA9IHRhc2tJbmZvLnNwbGl0KCJcXFsiKTsKKyAgICAgICAgaWYgKHNlY3Rpb25zLmxlbmd0aCA+IDIpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcGFyc2VQb2ludChzZWN0aW9uc1sxXSwgZnJvbSk7CisgICAgICAgICAgICAgICAgcGFyc2VQb2ludChzZWN0aW9uc1syXSwgdG8pOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGdldEFjdGl2aXR5VGFza0lkKFN0cmluZyBuYW1lKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyB0YXNrSW5mbyA9IGZpbmRUYXNrSW5mbyhuYW1lKTsKKyAgICAgICAgZm9yIChTdHJpbmcgd29yZCA6IHRhc2tJbmZvLnNwbGl0KCJcXHMrIikpIHsKKyAgICAgICAgICAgIGlmICh3b3JkLnN0YXJ0c1dpdGgoVEFTS19JRF9QUkVGSVgpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHdpdGhDb2xvbiA9IHdvcmQuc3BsaXQoIj0iKVsxXTsKKyAgICAgICAgICAgICAgICByZXR1cm4gSW50ZWdlci5wYXJzZUludCh3aXRoQ29sb24uc3Vic3RyaW5nKDAsIHdpdGhDb2xvbi5sZW5ndGgoKSAtIDEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcHJpdmF0ZSBQb2ludCBnZXREaXNwbGF5U2l6ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBQb2ludCBkaXNwbGF5U2l6ZSA9IG5ldyBQb2ludCgpOworICAgICAgICBtRG0uZ2V0RGlzcGxheShEaXNwbGF5LkRFRkFVTFRfRElTUExBWSkuZ2V0UmVhbFNpemUoZGlzcGxheVNpemUpOworICAgICAgICByZXR1cm4gZGlzcGxheVNpemU7CisgICAgfQorCisgICAgcHJpdmF0ZSBQb2ludCBnZXRXaW5kb3dDZW50ZXIoU3RyaW5nIG5hbWUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBQb2ludCBwMSA9IG5ldyBQb2ludCgpOworICAgICAgICBQb2ludCBwMiA9IG5ldyBQb2ludCgpOworICAgICAgICBpZiAoZ2V0V2luZG93Qm91bmRzKG5hbWUsIHAxLCBwMikpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUG9pbnQoKHAxLnggKyBwMi54KSAvIDIsIChwMS55ICsgcDIueSkgLyAyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcGFyc2VQb2ludChTdHJpbmcgc3RyaW5nLCBQb2ludCBwb2ludCkgeworICAgICAgICBmaW5hbCBTdHJpbmdbXSBwYXJ0cyA9IHN0cmluZy5zcGxpdCgiWyx8XFxdXSIpOworICAgICAgICBwb2ludC54ID0gSW50ZWdlci5wYXJzZUludChwYXJ0c1swXSk7CisgICAgICAgIHBvaW50LnkgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnRzWzFdKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdW5sb2NrRGV2aWNlKCkgeworICAgICAgICAvLyBXYWtlIHVwIHRoZSBkZXZpY2UsIGlmIG5lY2Vzc2FyeS4KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdha2VVcERldmljZSgpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gVW5sb2NrIHRoZSBzY3JlZW4uCisgICAgICAgIHByZXNzTWVudUJ1dHRvbigpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnREcm9wUmVzdWx0KFN0cmluZyBzb3VyY2VNb2RlLCBTdHJpbmcgdGFyZ2V0TW9kZSwgU3RyaW5nIGV4cGVjdGVkRHJvcFJlc3VsdCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnREcmFnQW5kRHJvcFJlc3VsdHMoc291cmNlTW9kZSwgdGFyZ2V0TW9kZSwgUkVTVUxUX09LLCBleHBlY3RlZERyb3BSZXN1bHQsIFJFU1VMVF9PSyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydE5vR2xvYmFsRHJhZ0V2ZW50cyhTdHJpbmcgc291cmNlTW9kZSwgU3RyaW5nIGV4cGVjdGVkU3RhcnREcmFnUmVzdWx0KQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydERyYWdBbmREcm9wUmVzdWx0cygKKyAgICAgICAgICAgICAgICBzb3VyY2VNb2RlLCBSRVFVRVNUX05PTkUsIGV4cGVjdGVkU3RhcnREcmFnUmVzdWx0LCBSRVNVTFRfTUlTU0lORywgUkVTVUxUX01JU1NJTkcpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnREcmFnQW5kRHJvcFJlc3VsdHMoU3RyaW5nIHNvdXJjZU1vZGUsIFN0cmluZyB0YXJnZXRNb2RlLAorICAgICAgICAgICAgU3RyaW5nIGV4cGVjdGVkU3RhcnREcmFnUmVzdWx0LCBTdHJpbmcgZXhwZWN0ZWREcm9wUmVzdWx0LAorICAgICAgICAgICAgU3RyaW5nIGV4cGVjdGVkTGlzdGVuZXJSZXN1bHRzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTG9nLmUoVEFHLCAic2Vzc2lvbjogIiArIG1TZXNzaW9uSWQgKyAiLCBzb3VyY2U6ICIgKyBzb3VyY2VNb2RlCisgICAgICAgICAgICAgICAgKyAiLCB0YXJnZXQ6ICIgKyB0YXJnZXRNb2RlKTsKKworICAgICAgICBpZiAoc3VwcG9ydHNTcGxpdFNjcmVlbk11bHRpV2luZG93KCkpIHsKKyAgICAgICAgICAgIGxhdW5jaERvY2tlZEFjdGl2aXR5KAorICAgICAgICAgICAgICAgICAgICBtU291cmNlUGFja2FnZU5hbWUsIFNPVVJDRV9BQ1RJVklUWV9OQU1FLCBzb3VyY2VNb2RlLCBtU291cmNlTG9nVGFnKTsKKyAgICAgICAgICAgIGxhdW5jaEZ1bGxzY3JlZW5BY3Rpdml0eSgKKyAgICAgICAgICAgICAgICAgICAgbVRhcmdldFBhY2thZ2VOYW1lLCBUQVJHRVRfQUNUSVZJVFlfTkFNRSwgdGFyZ2V0TW9kZSwgbVRhcmdldExvZ1RhZyk7CisgICAgICAgIH0gZWxzZSBpZiAoc3VwcG9ydHNGcmVlZm9ybU11bHRpV2luZG93KCkpIHsKKyAgICAgICAgICAgIC8vIEZhbGxiYWNrIHRvIHRyeSB0byBsYXVuY2ggdHdvIGZyZWVmb3JtIHdpbmRvd3Mgc2lkZSBieSBzaWRlLgorICAgICAgICAgICAgUG9pbnQgZGlzcGxheVNpemUgPSBnZXREaXNwbGF5U2l6ZSgpOworICAgICAgICAgICAgbGF1bmNoRnJlZWZvcm1BY3Rpdml0eSgKKyAgICAgICAgICAgICAgICAgICAgbVNvdXJjZVBhY2thZ2VOYW1lLCBTT1VSQ0VfQUNUSVZJVFlfTkFNRSwgc291cmNlTW9kZSwgbVNvdXJjZUxvZ1RhZywKKyAgICAgICAgICAgICAgICAgICAgZGlzcGxheVNpemUsIHRydWUgLyogbGVmdFNpZGUgKi8pOworICAgICAgICAgICAgbGF1bmNoRnJlZWZvcm1BY3Rpdml0eSgKKyAgICAgICAgICAgICAgICAgICAgbVRhcmdldFBhY2thZ2VOYW1lLCBUQVJHRVRfQUNUSVZJVFlfTkFNRSwgdGFyZ2V0TW9kZSwgbVRhcmdldExvZ1RhZywKKyAgICAgICAgICAgICAgICAgICAgZGlzcGxheVNpemUsIGZhbHNlIC8qIGxlZnRTaWRlICovKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFBvaW50IHAxID0gZ2V0V2luZG93Q2VudGVyKGdldENvbXBvbmVudE5hbWUobVNvdXJjZVBhY2thZ2VOYW1lLCBTT1VSQ0VfQUNUSVZJVFlfTkFNRSkpOworICAgICAgICBhc3NlcnROb3ROdWxsKHAxKTsKKyAgICAgICAgUG9pbnQgcDIgPSBnZXRXaW5kb3dDZW50ZXIoZ2V0Q29tcG9uZW50TmFtZShtVGFyZ2V0UGFja2FnZU5hbWUsIFRBUkdFVF9BQ1RJVklUWV9OQU1FKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwocDIpOworCisgICAgICAgIFRlc3RMb2dTZXJ2aWNlLnJlZ2lzdGVyQ2xpZW50KG1Tb3VyY2VMb2dUYWcsIFJFU1VMVF9LRVlfU1RBUlRfRFJBRyk7CisgICAgICAgIFRlc3RMb2dTZXJ2aWNlLnJlZ2lzdGVyQ2xpZW50KG1UYXJnZXRMb2dUYWcsIFJFU1VMVF9LRVlfRFJBR19FTkRFRCk7CisKKyAgICAgICAgaW5qZWN0SW5wdXQocDEsIHAyLCBTV0lQRV9TVEVQUyk7CisKKyAgICAgICAgbVNvdXJjZVJlc3VsdHMgPSBUZXN0TG9nU2VydmljZS5nZXRSZXN1bHRzRm9yQ2xpZW50KG1Tb3VyY2VMb2dUYWcsIDEwMDApOworICAgICAgICBhc3NlcnRTb3VyY2VSZXN1bHQoUkVTVUxUX0tFWV9TVEFSVF9EUkFHLCBleHBlY3RlZFN0YXJ0RHJhZ1Jlc3VsdCk7CisKKyAgICAgICAgbVRhcmdldFJlc3VsdHMgPSBUZXN0TG9nU2VydmljZS5nZXRSZXN1bHRzRm9yQ2xpZW50KG1UYXJnZXRMb2dUYWcsIDEwMDApOworICAgICAgICBhc3NlcnRUYXJnZXRSZXN1bHQoUkVTVUxUX0tFWV9EUk9QX1JFU1VMVCwgZXhwZWN0ZWREcm9wUmVzdWx0KTsKKyAgICAgICAgaWYgKCFSRVNVTFRfTUlTU0lORy5lcXVhbHMoZXhwZWN0ZWREcm9wUmVzdWx0KSkgeworICAgICAgICAgICAgYXNzZXJ0VGFyZ2V0UmVzdWx0KFJFU1VMVF9LRVlfQUNDRVNTX0JFRk9SRSwgUkVTVUxUX0VYQ0VQVElPTik7CisgICAgICAgICAgICBhc3NlcnRUYXJnZXRSZXN1bHQoUkVTVUxUX0tFWV9BQ0NFU1NfQUZURVIsIFJFU1VMVF9FWENFUFRJT04pOworICAgICAgICB9CisgICAgICAgIGFzc2VydExpc3RlbmVyUmVzdWx0cyhleHBlY3RlZExpc3RlbmVyUmVzdWx0cyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydExpc3RlbmVyUmVzdWx0cyhTdHJpbmcgZXhwZWN0ZWRSZXN1bHQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRUYXJnZXRSZXN1bHQoUkVTVUxUX0tFWV9EUkFHX1NUQVJURUQsIGV4cGVjdGVkUmVzdWx0KTsKKyAgICAgICAgYXNzZXJ0VGFyZ2V0UmVzdWx0KFJFU1VMVF9LRVlfRFJBR19FTkRFRCwgZXhwZWN0ZWRSZXN1bHQpOworICAgICAgICBhc3NlcnRUYXJnZXRSZXN1bHQoUkVTVUxUX0tFWV9FWFRSQVMsIGV4cGVjdGVkUmVzdWx0KTsKKworICAgICAgICBhc3NlcnRUYXJnZXRSZXN1bHQoUkVTVUxUX0tFWV9DTElQX0RBVEFfRVJST1IsIFJFU1VMVF9NSVNTSU5HKTsKKyAgICAgICAgYXNzZXJ0VGFyZ2V0UmVzdWx0KFJFU1VMVF9LRVlfQ0xJUF9ERVNDUl9FUlJPUiwgUkVTVUxUX01JU1NJTkcpOworICAgICAgICBhc3NlcnRUYXJnZXRSZXN1bHQoUkVTVUxUX0tFWV9MT0NBTF9TVEFURV9FUlJPUiwgUkVTVUxUX01JU1NJTkcpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRTb3VyY2VSZXN1bHQoU3RyaW5nIHJlc3VsdEtleSwgU3RyaW5nIGV4cGVjdGVkUmVzdWx0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0UmVzdWx0KG1Tb3VyY2VSZXN1bHRzLCByZXN1bHRLZXksIGV4cGVjdGVkUmVzdWx0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0VGFyZ2V0UmVzdWx0KFN0cmluZyByZXN1bHRLZXksIFN0cmluZyBleHBlY3RlZFJlc3VsdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydFJlc3VsdChtVGFyZ2V0UmVzdWx0cywgcmVzdWx0S2V5LCBleHBlY3RlZFJlc3VsdCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFJlc3VsdChNYXA8U3RyaW5nLCBTdHJpbmc+IHJlc3VsdHMsIFN0cmluZyByZXN1bHRLZXksIFN0cmluZyBleHBlY3RlZFJlc3VsdCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoUkVTVUxUX01JU1NJTkcuZXF1YWxzKGV4cGVjdGVkUmVzdWx0KSkgeworICAgICAgICAgICAgaWYgKHJlc3VsdHMuY29udGFpbnNLZXkocmVzdWx0S2V5KSkgeworICAgICAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgIiArIHJlc3VsdEtleSArICI9IiArIHJlc3VsdHMuZ2V0KHJlc3VsdEtleSkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiTWlzc2luZyAiICsgcmVzdWx0S2V5LCByZXN1bHRzLmNvbnRhaW5zS2V5KHJlc3VsdEtleSkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdEtleSArICIgcmVzdWx0IG1pc21hdGNoLCIsIGV4cGVjdGVkUmVzdWx0LAorICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmdldChyZXN1bHRLZXkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gc3VwcG9ydHNEcmFnQW5kRHJvcCgpIHsKKyAgICAgICAgcmV0dXJuIEFjdGl2aXR5TWFuYWdlci5zdXBwb3J0c011bHRpV2luZG93KEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzdXBwb3J0c1NwbGl0U2NyZWVuTXVsdGlXaW5kb3coKSB7CisgICAgICAgIHJldHVybiBBY3Rpdml0eU1hbmFnZXIuc3VwcG9ydHNTcGxpdFNjcmVlbk11bHRpV2luZG93KEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzdXBwb3J0c0ZyZWVmb3JtTXVsdGlXaW5kb3coKSB7CisgICAgICAgIHJldHVybiBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCkKKyAgICAgICAgICAgICAgICAuZ2V0UGFja2FnZU1hbmFnZXIoKQorICAgICAgICAgICAgICAgIC5oYXNTeXN0ZW1GZWF0dXJlKEZFQVRVUkVfRlJFRUZPUk1fV0lORE9XX01BTkFHRU1FTlQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENhbmNlbFNvb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RHJvcFJlc3VsdChDQU5DRUxfU09PTiwgUkVRVUVTVF9OT05FLCBSRVNVTFRfTUlTU0lORyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzYWxsb3dHbG9iYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0Tm9HbG9iYWxEcmFnRXZlbnRzKERJU0FMTE9XX0dMT0JBTCwgUkVTVUxUX09LKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REaXNhbGxvd0dsb2JhbEJlbG93U2RrMjQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbVRhcmdldFBhY2thZ2VOYW1lID0gVEFSR0VUXzIzX1BBQ0tBR0VfTkFNRTsKKyAgICAgICAgYXNzZXJ0Tm9HbG9iYWxEcmFnRXZlbnRzKEdSQU5UX05PTkUsIFJFU1VMVF9PSyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZVVyaUxvY2FsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydE5vR2xvYmFsRHJhZ0V2ZW50cyhGSUxFX0xPQ0FMLCBSRVNVTFRfT0spOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZpbGVVcmlHbG9iYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0Tm9HbG9iYWxEcmFnRXZlbnRzKEZJTEVfR0xPQkFMLCBSRVNVTFRfRVhDRVBUSU9OKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHcmFudE5vbmVSZXF1ZXN0Tm9uZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnREcm9wUmVzdWx0KEdSQU5UX05PTkUsIFJFUVVFU1RfTk9ORSwgUkVTVUxUX0VYQ0VQVElPTik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R3JhbnROb25lUmVxdWVzdFJlYWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RHJvcFJlc3VsdChHUkFOVF9OT05FLCBSRVFVRVNUX1JFQUQsIFJFU1VMVF9OVUxMX0RST1BfUEVSTUlTU0lPTlMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdyYW50Tm9uZVJlcXVlc3RXcml0ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnREcm9wUmVzdWx0KEdSQU5UX05PTkUsIFJFUVVFU1RfV1JJVEUsIFJFU1VMVF9OVUxMX0RST1BfUEVSTUlTU0lPTlMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdyYW50UmVhZFJlcXVlc3ROb25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydERyb3BSZXN1bHQoR1JBTlRfUkVBRCwgUkVRVUVTVF9OT05FLCBSRVNVTFRfRVhDRVBUSU9OKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHcmFudFJlYWRSZXF1ZXN0UmVhZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnREcm9wUmVzdWx0KEdSQU5UX1JFQUQsIFJFUVVFU1RfUkVBRCwgUkVTVUxUX09LKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHcmFudFJlYWRSZXF1ZXN0V3JpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RHJvcFJlc3VsdChHUkFOVF9SRUFELCBSRVFVRVNUX1dSSVRFLCBSRVNVTFRfRVhDRVBUSU9OKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHcmFudFJlYWROb1ByZWZpeFJlcXVlc3RSZWFkTmVzdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydERyb3BSZXN1bHQoR1JBTlRfUkVBRF9OT1BSRUZJWCwgUkVRVUVTVF9SRUFEX05FU1RFRCwgUkVTVUxUX0VYQ0VQVElPTik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R3JhbnRSZWFkUHJlZml4UmVxdWVzdFJlYWROZXN0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RHJvcFJlc3VsdChHUkFOVF9SRUFEX1BSRUZJWCwgUkVRVUVTVF9SRUFEX05FU1RFRCwgUkVTVUxUX09LKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHcmFudFBlcnNpc3RhYmxlUmVxdWVzdFRha2VQZXJzaXN0YWJsZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnREcm9wUmVzdWx0KEdSQU5UX1JFQURfUEVSU0lTVEFCTEUsIFJFUVVFU1RfVEFLRV9QRVJTSVNUQUJMRSwgUkVTVUxUX09LKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHcmFudFJlYWRSZXF1ZXN0VGFrZVBlcnNpc3RhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydERyb3BSZXN1bHQoR1JBTlRfUkVBRCwgUkVRVUVTVF9UQUtFX1BFUlNJU1RBQkxFLCBSRVNVTFRfRVhDRVBUSU9OKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHcmFudFdyaXRlUmVxdWVzdE5vbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RHJvcFJlc3VsdChHUkFOVF9XUklURSwgUkVRVUVTVF9OT05FLCBSRVNVTFRfRVhDRVBUSU9OKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHcmFudFdyaXRlUmVxdWVzdFJlYWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RHJvcFJlc3VsdChHUkFOVF9XUklURSwgUkVRVUVTVF9SRUFELCBSRVNVTFRfRVhDRVBUSU9OKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHcmFudFdyaXRlUmVxdWVzdFdyaXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydERyb3BSZXN1bHQoR1JBTlRfV1JJVEUsIFJFUVVFU1RfV1JJVEUsIFJFU1VMVF9PSyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2Uvd2luZG93bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvd20vRGlhbG9nRnJhbWVUZXN0QWN0aXZpdHkuamF2YSBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL3dpbmRvd21hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL3dtL0RpYWxvZ0ZyYW1lVGVzdEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQzYjA2ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL3dpbmRvd21hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL3dtL0RpYWxvZ0ZyYW1lVGVzdEFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwyMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLndtOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5WaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTEFZT1VUX0lOX09WRVJTQ0FOOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19MQVlPVVRfSU5fU0NSRUVOOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19MQVlPVVRfTk9fTElNSVRTOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfRk9DVVNBQkxFOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2c7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtczsKKworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKKworLy8gVE9ETzogTWFrZSB0aGlzIGFuIGlubmVyIGNsYXNzIG9mIHtAbGluayBEaWFsb2dGcmFtZVRlc3R9LgorcHVibGljIGNsYXNzIERpYWxvZ0ZyYW1lVGVzdEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBESUFMT0dfV0lORE9XX05BTUUgPSAiVGVzdERpYWxvZyI7CisKKyAgICAvLyBUT0RPOiBQYXNzaW5nIGxheW91dCBwYXJhbWV0ZXJzIGZvciB7QGxpbmsgRGlhbG9nfSBpbiBleHRyYSBvZiB7QGxpbmsgSW50ZW50fSBpbnN0ZWFkIG9mCisgICAgLy8gdXNpbmcgdGVzdCBjYXNlIG5hbWUuCisgICAgLy8gRXh0cmEga2V5IGZvciB0ZXN0IGNhc2UgbmFtZS4KKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1RFU1RfQ0FTRSA9ICJ0ZXN0LWNhc2UiOworICAgIC8vIFZhbHVlIGNvbnN0YW50cyBmb3Ige0BsaW5rICNFWFRSQV9URVNUX0NBU0V9LgorICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9FWFBMSUNJVF9QT1NJVElPTl9NQVRDSF9QQVJFTlQgPSAiRXhwbGljaXRQb3NpdGlvbk1hdGNoUGFyZW50IjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfRVhQTElDSVRfUE9TSVRJT05fTUFUQ0hfUEFSRU5UX05PX0xJTUlUUyA9CisgICAgICAgICAgICAiRXhwbGljaXRQb3NpdGlvbk1hdGNoUGFyZW50Tm9MaW1pdHMiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9FWFBMSUNJVF9TSVpFID0gIkV4cGxpY2l0U2l6ZSI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0VYUExJQ0lUX1NJWkVfQk9UVE9NX1JJR0hUX0dSQVZJVFkgPQorICAgICAgICAgICAgIkV4cGxpY2l0U2l6ZUJvdHRvbVJpZ2h0R3Jhdml0eSI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0VYUExJQ0lUX1NJWkVfVE9QX0xFRlRfR1JBVklUWSA9ICJFeHBsaWNpdFNpemVUb3BMZWZ0R3Jhdml0eSI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX01BVENIX1BBUkVOVCA9ICJNYXRjaFBhcmVudCI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX01BVENIX1BBUkVOVF9MQVlPVVRfSU5fT1ZFUlNDQU4gPSAiTWF0Y2hQYXJlbnRMYXlvdXRJbk92ZXJzY2FuIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfTk9fRk9DVVMgPSAiTm9Gb2N1cyI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX09WRVJfU0laRURfRElNRU5TSU9OUyA9ICJPdmVyc2l6ZWREaW1lbnNpb25zIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfT1ZFUl9TSVpFRF9ESU1FTlNJT05TX05PX0xJTUlUUyA9ICJPdmVyc2l6ZWREaW1lbnNpb25zTm9MaW1pdHMiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9XSVRIX01BUkdJTlMgPSAiV2l0aE1hcmdpbnMiOworCisgICAgcHJpdmF0ZSBBbGVydERpYWxvZyBtRGlhbG9nOworICAgIGludCBtU2l6ZTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uU3RvcCgpIHsKKyAgICAgICAgc3VwZXIub25TdG9wKCk7CisgICAgICAgIG1EaWFsb2cuZGlzbWlzcygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgeworICAgICAgICBzdXBlci5vblJlc3VtZSgpOworICAgICAgICBzZXR1cFRlc3QoZ2V0SW50ZW50KCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXR1cFRlc3QoSW50ZW50IGludGVudCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgdGVzdENhc2UgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoRVhUUkFfVEVTVF9DQVNFKTsKKyAgICAgICAgbVNpemUgPSBnZXRTaXplKCk7CisgICAgICAgIHN3aXRjaCAodGVzdENhc2UpIHsKKyAgICAgICAgICAgIGNhc2UgVEVTVF9NQVRDSF9QQVJFTlQ6CisgICAgICAgICAgICAgICAgdGVzdE1hdGNoUGFyZW50KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFRFU1RfTUFUQ0hfUEFSRU5UX0xBWU9VVF9JTl9PVkVSU0NBTjoKKyAgICAgICAgICAgICAgICB0ZXN0TWF0Y2hQYXJlbnRMYXlvdXRJbk92ZXJzY2FuKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFRFU1RfRVhQTElDSVRfU0laRToKKyAgICAgICAgICAgICAgICB0ZXN0RXhwbGljaXRTaXplKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFRFU1RfRVhQTElDSVRfU0laRV9UT1BfTEVGVF9HUkFWSVRZOgorICAgICAgICAgICAgICAgIHRlc3RFeHBsaWNpdFNpemVUb3BMZWZ0R3Jhdml0eSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBURVNUX0VYUExJQ0lUX1NJWkVfQk9UVE9NX1JJR0hUX0dSQVZJVFk6CisgICAgICAgICAgICAgICAgdGVzdEV4cGxpY2l0U2l6ZUJvdHRvbVJpZ2h0R3Jhdml0eSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBURVNUX09WRVJfU0laRURfRElNRU5TSU9OUzoKKyAgICAgICAgICAgICAgICB0ZXN0T3ZlcnNpemVkRGltZW5zaW9ucygpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBURVNUX09WRVJfU0laRURfRElNRU5TSU9OU19OT19MSU1JVFM6CisgICAgICAgICAgICAgICAgdGVzdE92ZXJzaXplZERpbWVuc2lvbnNOb0xpbWl0cygpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBURVNUX0VYUExJQ0lUX1BPU0lUSU9OX01BVENIX1BBUkVOVDoKKyAgICAgICAgICAgICAgICB0ZXN0RXhwbGljaXRQb3NpdGlvbk1hdGNoUGFyZW50KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFRFU1RfRVhQTElDSVRfUE9TSVRJT05fTUFUQ0hfUEFSRU5UX05PX0xJTUlUUzoKKyAgICAgICAgICAgICAgICB0ZXN0RXhwbGljaXRQb3NpdGlvbk1hdGNoUGFyZW50Tm9MaW1pdHMoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVEVTVF9OT19GT0NVUzoKKyAgICAgICAgICAgICAgICB0ZXN0Tm9Gb2N1cygpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBURVNUX1dJVEhfTUFSR0lOUzoKKyAgICAgICAgICAgICAgICB0ZXN0V2l0aE1hcmdpbnMoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZG9MYXlvdXRQYXJhbVRlc3QoQ29uc3VtZXI8TGF5b3V0UGFyYW1zPiBzZXRVcCkgeworICAgICAgICBtRGlhbG9nID0gbmV3IEFsZXJ0RGlhbG9nLkJ1aWxkZXIodGhpcykuY3JlYXRlKCk7CisKKyAgICAgICAgbURpYWxvZy5zZXRNZXNzYWdlKCJUZXN0aW5nIGlzIGZ1biEiKTsKKyAgICAgICAgbURpYWxvZy5zZXRUaXRsZShESUFMT0dfV0lORE9XX05BTUUpOworICAgICAgICBtRGlhbG9nLmNyZWF0ZSgpOworCisgICAgICAgIFdpbmRvdyB3ID0gbURpYWxvZy5nZXRXaW5kb3coKTsKKyAgICAgICAgZmluYWwgTGF5b3V0UGFyYW1zIHBhcmFtcyA9IHcuZ2V0QXR0cmlidXRlcygpOworICAgICAgICBzZXRVcC5hY2NlcHQocGFyYW1zKTsKKyAgICAgICAgdy5zZXRBdHRyaWJ1dGVzKHBhcmFtcyk7CisKKyAgICAgICAgbURpYWxvZy5zaG93KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RNYXRjaFBhcmVudCgpIHsKKyAgICAgICAgZG9MYXlvdXRQYXJhbVRlc3QocGFyYW1zIC0+IHsKKyAgICAgICAgICAgIHBhcmFtcy53aWR0aCA9IE1BVENIX1BBUkVOVDsKKyAgICAgICAgICAgIHBhcmFtcy5oZWlnaHQgPSBNQVRDSF9QQVJFTlQ7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0TWF0Y2hQYXJlbnRMYXlvdXRJbk92ZXJzY2FuKCkgeworICAgICAgICBkb0xheW91dFBhcmFtVGVzdChwYXJhbXMgLT4geworICAgICAgICAgICAgcGFyYW1zLndpZHRoID0gTUFUQ0hfUEFSRU5UOworICAgICAgICAgICAgcGFyYW1zLmhlaWdodCA9IE1BVENIX1BBUkVOVDsKKyAgICAgICAgICAgIHBhcmFtcy5mbGFncyB8PSBGTEFHX0xBWU9VVF9JTl9TQ1JFRU47CisgICAgICAgICAgICBwYXJhbXMuZmxhZ3MgfD0gRkxBR19MQVlPVVRfSU5fT1ZFUlNDQU47CisgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0RXhwbGljaXRTaXplKCkgeworICAgICAgICBkb0xheW91dFBhcmFtVGVzdChwYXJhbXMgLT4geworICAgICAgICAgICAgcGFyYW1zLndpZHRoID0gbVNpemU7CisgICAgICAgICAgICBwYXJhbXMuaGVpZ2h0ID0gbVNpemU7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0RXhwbGljaXRTaXplVG9wTGVmdEdyYXZpdHkoKSB7CisgICAgICAgIGRvTGF5b3V0UGFyYW1UZXN0KHBhcmFtcyAtPiB7CisgICAgICAgICAgICBwYXJhbXMud2lkdGggPSBtU2l6ZTsKKyAgICAgICAgICAgIHBhcmFtcy5oZWlnaHQgPSBtU2l6ZTsKKyAgICAgICAgICAgIHBhcmFtcy5ncmF2aXR5ID0gR3Jhdml0eS5UT1AgfCBHcmF2aXR5LkxFRlQ7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0RXhwbGljaXRTaXplQm90dG9tUmlnaHRHcmF2aXR5KCkgeworICAgICAgICBkb0xheW91dFBhcmFtVGVzdChwYXJhbXMgLT4geworICAgICAgICAgICAgcGFyYW1zLndpZHRoID0gbVNpemU7CisgICAgICAgICAgICBwYXJhbXMuaGVpZ2h0ID0gbVNpemU7CisgICAgICAgICAgICBwYXJhbXMuZ3Jhdml0eSA9IEdyYXZpdHkuQk9UVE9NIHwgR3Jhdml0eS5SSUdIVDsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RPdmVyc2l6ZWREaW1lbnNpb25zKCkgeworICAgICAgICBkb0xheW91dFBhcmFtVGVzdChwYXJhbXMgLT4geworICAgICAgICAgICAgcGFyYW1zLndpZHRoID0gMTAwMDAwOworICAgICAgICAgICAgcGFyYW1zLmhlaWdodCA9IDEwMDAwMDsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RPdmVyc2l6ZWREaW1lbnNpb25zTm9MaW1pdHMoKSB7CisgICAgICAgIGRvTGF5b3V0UGFyYW1UZXN0KHBhcmFtcyAtPiB7CisgICAgICAgICAgICBwYXJhbXMud2lkdGggPSA1MDAwOworICAgICAgICAgICAgcGFyYW1zLmhlaWdodCA9IDUwMDA7CisgICAgICAgICAgICBwYXJhbXMuZmxhZ3MgfD0gRkxBR19MQVlPVVRfTk9fTElNSVRTOworICAgICAgICAgICAgcGFyYW1zLmdyYXZpdHkgPSBHcmF2aXR5LkxFRlQgfCBHcmF2aXR5LlRPUDsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RFeHBsaWNpdFBvc2l0aW9uTWF0Y2hQYXJlbnQoKSB7CisgICAgICAgIGRvTGF5b3V0UGFyYW1UZXN0KHBhcmFtcyAtPiB7CisgICAgICAgICAgICBwYXJhbXMud2lkdGggPSBNQVRDSF9QQVJFTlQ7CisgICAgICAgICAgICBwYXJhbXMuaGVpZ2h0ID0gTUFUQ0hfUEFSRU5UOworICAgICAgICAgICAgcGFyYW1zLnggPSAxMDA7CisgICAgICAgICAgICBwYXJhbXMueSA9IDEwMDsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RFeHBsaWNpdFBvc2l0aW9uTWF0Y2hQYXJlbnROb0xpbWl0cygpIHsKKyAgICAgICAgZG9MYXlvdXRQYXJhbVRlc3QocGFyYW1zIC0+IHsKKyAgICAgICAgICAgIHBhcmFtcy53aWR0aCA9IE1BVENIX1BBUkVOVDsKKyAgICAgICAgICAgIHBhcmFtcy5oZWlnaHQgPSBNQVRDSF9QQVJFTlQ7CisgICAgICAgICAgICBwYXJhbXMuZ3Jhdml0eSA9IEdyYXZpdHkuTEVGVCB8IEdyYXZpdHkuVE9QOworICAgICAgICAgICAgcGFyYW1zLmZsYWdzIHw9IEZMQUdfTEFZT1VUX05PX0xJTUlUUzsKKyAgICAgICAgICAgIHBhcmFtcy54ID0gMTAwOworICAgICAgICAgICAgcGFyYW1zLnkgPSAxMDA7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0Tm9Gb2N1cygpIHsKKyAgICAgICAgZG9MYXlvdXRQYXJhbVRlc3QocGFyYW1zIC0+IHBhcmFtcy5mbGFncyB8PSBGTEFHX05PVF9GT0NVU0FCTEUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0V2l0aE1hcmdpbnMoKSB7CisgICAgICAgIGRvTGF5b3V0UGFyYW1UZXN0KHBhcmFtcyAtPiB7CisgICAgICAgICAgICBwYXJhbXMuZ3Jhdml0eSA9IEdyYXZpdHkuTEVGVCB8IEdyYXZpdHkuVE9QOworICAgICAgICAgICAgcGFyYW1zLmhvcml6b250YWxNYXJnaW4gPSAuMjVmOworICAgICAgICAgICAgcGFyYW1zLnZlcnRpY2FsTWFyZ2luID0gLjM1ZjsKKyAgICAgICAgICAgIHBhcmFtcy53aWR0aCA9IG1TaXplOworICAgICAgICAgICAgcGFyYW1zLmhlaWdodCA9IG1TaXplOworICAgICAgICAgICAgcGFyYW1zLnggPSAwOworICAgICAgICAgICAgcGFyYW1zLnkgPSAwOworICAgICAgICB9KTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBpbnQgZ2V0U2l6ZSgpIHsKKyAgICAgICAgZmxvYXQgZGVuc2l0eSA9IGdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCkuZGVuc2l0eTsKKyAgICAgICAgcmV0dXJuIChpbnQpKDE0NiAqIGRlbnNpdHkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZyYW1ld29yay9iYXNlL3dpbmRvd21hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL3dtL0RpYWxvZ0ZyYW1lVGVzdHMuamF2YSBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL3dpbmRvd21hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL3dtL0RpYWxvZ0ZyYW1lVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGViNTkwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2Uvd2luZG93bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvd20vRGlhbG9nRnJhbWVUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMjcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci53bTsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5Db21wb25lbnROYW1lVXRpbHMuZ2V0V2luZG93TmFtZTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIud20uRGlhbG9nRnJhbWVUZXN0QWN0aXZpdHkuRElBTE9HX1dJTkRPV19OQU1FOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci53bS5EaWFsb2dGcmFtZVRlc3RBY3Rpdml0eS5URVNUX0VYUExJQ0lUX1BPU0lUSU9OX01BVENIX1BBUkVOVDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIud20uRGlhbG9nRnJhbWVUZXN0QWN0aXZpdHkuVEVTVF9FWFBMSUNJVF9QT1NJVElPTl9NQVRDSF9QQVJFTlRfTk9fTElNSVRTOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci53bS5EaWFsb2dGcmFtZVRlc3RBY3Rpdml0eS5URVNUX0VYUExJQ0lUX1NJWkU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLndtLkRpYWxvZ0ZyYW1lVGVzdEFjdGl2aXR5LlRFU1RfRVhQTElDSVRfU0laRV9CT1RUT01fUklHSFRfR1JBVklUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIud20uRGlhbG9nRnJhbWVUZXN0QWN0aXZpdHkuVEVTVF9FWFBMSUNJVF9TSVpFX1RPUF9MRUZUX0dSQVZJVFk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLndtLkRpYWxvZ0ZyYW1lVGVzdEFjdGl2aXR5LlRFU1RfTUFUQ0hfUEFSRU5UOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci53bS5EaWFsb2dGcmFtZVRlc3RBY3Rpdml0eS5URVNUX01BVENIX1BBUkVOVF9MQVlPVVRfSU5fT1ZFUlNDQU47CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLndtLkRpYWxvZ0ZyYW1lVGVzdEFjdGl2aXR5LlRFU1RfTk9fRk9DVVM7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLndtLkRpYWxvZ0ZyYW1lVGVzdEFjdGl2aXR5LlRFU1RfT1ZFUl9TSVpFRF9ESU1FTlNJT05TOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci53bS5EaWFsb2dGcmFtZVRlc3RBY3Rpdml0eS5URVNUX09WRVJfU0laRURfRElNRU5TSU9OU19OT19MSU1JVFM7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLndtLkRpYWxvZ0ZyYW1lVGVzdEFjdGl2aXR5LlRFU1RfV0lUSF9NQVJHSU5TOworCitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5ncmVhdGVyVGhhbjsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOworaW1wb3J0IGFuZHJvaWQuc2VydmVyLmFtLldhaXRGb3JWYWxpZEFjdGl2aXR5U3RhdGU7CitpbXBvcnQgYW5kcm9pZC5zZXJ2ZXIuYW0uV2luZG93TWFuYWdlclN0YXRlOworaW1wb3J0IGFuZHJvaWQuc2VydmVyLmFtLldpbmRvd01hbmFnZXJTdGF0ZS5XaW5kb3dTdGF0ZTsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CisKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBCdWlsZC9JbnN0YWxsL1J1bjoKKyAqICAgICBhdGVzdCBDdHNXaW5kb3dNYW5hZ2VyRGV2aWNlVGVzdENhc2VzOkRpYWxvZ0ZyYW1lVGVzdHMKKyAqCisgKiBUT0RPOiBDb25zb2xpZGF0ZSB0aGlzIGNsYXNzIHdpdGgge0BsaW5rIFBhcmVudENoaWxkVGVzdEJhc2V9LgorICovCitAQXBwTW9kZUZ1bGwocmVhc29uID0gIlJlcXVpcmVzIGFuZHJvaWQucGVybWlzc2lvbi5NQU5BR0VfQUNUSVZJVFlfU1RBQ0tTIikKK3B1YmxpYyBjbGFzcyBEaWFsb2dGcmFtZVRlc3RzIGV4dGVuZHMgUGFyZW50Q2hpbGRUZXN0QmFzZTxEaWFsb2dGcmFtZVRlc3RBY3Rpdml0eT4geworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tcG9uZW50TmFtZSBESUFMT0dfRlJBTUVfVEVTVF9BQ1RJVklUWSA9IG5ldyBDb21wb25lbnROYW1lKAorICAgICAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpLCBEaWFsb2dGcmFtZVRlc3RBY3Rpdml0eS5jbGFzcyk7CisKKyAgICBAUnVsZQorICAgIHB1YmxpYyBmaW5hbCBBY3Rpdml0eVRlc3RSdWxlPERpYWxvZ0ZyYW1lVGVzdEFjdGl2aXR5PiBtRGlhbG9nVGVzdEFjdGl2aXR5ID0KKyAgICAgICAgICAgIG5ldyBBY3Rpdml0eVRlc3RSdWxlPD4oRGlhbG9nRnJhbWVUZXN0QWN0aXZpdHkuY2xhc3MsIGZhbHNlIC8qIGluaXRpYWxUT3VjaE1vZGUgKi8sCisgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGxhdW5jaEFjdGl2aXR5ICovKTsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICB9CisgICAgICAgIG1TaXplID0gZ2V0U2l6ZSgpOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBDb21wb25lbnROYW1lIGFjdGl2aXR5TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIERJQUxPR19GUkFNRV9URVNUX0FDVElWSVRZOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEFjdGl2aXR5VGVzdFJ1bGU8RGlhbG9nRnJhbWVUZXN0QWN0aXZpdHk+IGFjdGl2aXR5UnVsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1EaWFsb2dUZXN0QWN0aXZpdHk7CisgICAgfQorCisgICAgcHJpdmF0ZSBXaW5kb3dTdGF0ZSBnZXRTaW5nbGVXaW5kb3coZmluYWwgU3RyaW5nIHdpbmRvd05hbWUpIHsKKyAgICAgICAgZmluYWwgTGlzdDxXaW5kb3dTdGF0ZT4gd2luZG93TGlzdCA9CisgICAgICAgICAgICAgICAgbUFtV21TdGF0ZS5nZXRXbVN0YXRlKCkuZ2V0TWF0Y2hpbmdWaXNpYmxlV2luZG93U3RhdGUod2luZG93TmFtZSk7CisgICAgICAgIGFzc2VydFRoYXQod2luZG93TGlzdC5zaXplKCksIGdyZWF0ZXJUaGFuKDApKTsKKyAgICAgICAgcmV0dXJuIHdpbmRvd0xpc3QuZ2V0KDApOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHZvaWQgZG9TaW5nbGVUZXN0KFBhcmVudENoaWxkVGVzdCB0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbUFtV21TdGF0ZS5jb21wdXRlU3RhdGUoV2FpdEZvclZhbGlkQWN0aXZpdHlTdGF0ZS5mb3JXaW5kb3coRElBTE9HX1dJTkRPV19OQU1FKSk7CisgICAgICAgIFdpbmRvd1N0YXRlIGRpYWxvZyA9IGdldFNpbmdsZVdpbmRvdyhESUFMT0dfV0lORE9XX05BTUUpOworICAgICAgICBXaW5kb3dTdGF0ZSBwYXJlbnQgPSBnZXRTaW5nbGVXaW5kb3coZ2V0V2luZG93TmFtZShhY3Rpdml0eU5hbWUoKSkpOworCisgICAgICAgIHQuZG9UZXN0KHBhcmVudCwgZGlhbG9nKTsKKyAgICB9CisKKyAgICAvLyBXaXRoIFdpZHRoIGFuZCBIZWlnaHQgYXMgTUFUQ0hfUEFSRU5UIHdlIHNob3VsZCBmaWxsCisgICAgLy8gdGhlIHNhbWUgY29udGVudCBmcmFtZSBhcyB0aGUgbWFpbiBhY3Rpdml0eSB3aW5kb3cKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYXRjaFBhcmVudERpYWxvZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkb1BhcmVudENoaWxkVGVzdChURVNUX01BVENIX1BBUkVOVCwgKHBhcmVudCwgZGlhbG9nKSAtPgorICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhwYXJlbnQuZ2V0Q29udGVudEZyYW1lKCksIGRpYWxvZy5nZXRGcmFtZSgpKQorICAgICAgICApOworICAgIH0KKworICAgIC8vIElmIHdlIGhhdmUgTEFZT1VUX0lOX1NDUkVFTiBhbmQgTEFZT1VUX0lOX09WRVJTQ0FOIHdpdGggTUFUQ0hfUEFSRU5ULAorICAgIC8vIHdlIHdpbGwgbm90IGJlIGNvbnN0cmFpbmVkIHRvIHRoZSBpbnNldHMgYW5kIHNvIHdlIHdpbGwgYmUgdGhlIHNhbWUgc2l6ZQorICAgIC8vIGFzIHRoZSBtYWluIHdpbmRvdyBtYWluIGZyYW1lLgorICAgIC8vIFRPRE86IGIvODAyNjI0OTYKKyAgICAvLyBMQVlPVVRfSU5fT1ZFUlNDQU4gaXNuJ3QgYWxsb3dpbmcgd2luZG93cyB0byBleHRlbmQgaW4gdG8gY3V0b3V0cy4gV2Ugd2lsbCBoYXZlCisgICAgLy8gdG8gcmV2aXNpdCB3aGV0aGVyIHRvIG1vZGlmeSB0aGUgYmVoYXZpb3IsIG9yIHRoaXMgdGVzdC4KKyAgICBASWdub3JlCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWF0Y2hQYXJlbnREaWFsb2dMYXlvdXRJbk92ZXJzY2FuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGRvUGFyZW50Q2hpbGRUZXN0KFRFU1RfTUFUQ0hfUEFSRU5UX0xBWU9VVF9JTl9PVkVSU0NBTiwgKHBhcmVudCwgZGlhbG9nKSAtPgorICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhwYXJlbnQuZ2V0RnJhbWUoKSwgZGlhbG9nLmdldEZyYW1lKCkpCisgICAgICAgICk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGV4cGxpY2l0RGltZW5zaW9uID0gMjAwOworICAgIHByaXZhdGUgaW50IG1TaXplID0gZXhwbGljaXREaW1lbnNpb247CisKKyAgICAvLyBUaGUgZGVmYXVsdCBncmF2aXR5IGZvciBkaWFsb2dzIHNob3VsZCBjZW50ZXIgdGhlbS4KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFeHBsaWNpdFNpemVEZWZhdWx0R3Jhdml0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkb1BhcmVudENoaWxkVGVzdChURVNUX0VYUExJQ0lUX1NJWkUsIChwYXJlbnQsIGRpYWxvZykgLT4geworICAgICAgICAgICAgUmVjdCBjb250ZW50RnJhbWUgPSBwYXJlbnQuZ2V0Q29udGVudEZyYW1lKCk7CisgICAgICAgICAgICBSZWN0IGV4cGVjdGVkRnJhbWUgPSBuZXcgUmVjdCgKKyAgICAgICAgICAgICAgICAgICAgY29udGVudEZyYW1lLmxlZnQgKyAoY29udGVudEZyYW1lLndpZHRoKCkgLSBtU2l6ZSkgLyAyLAorICAgICAgICAgICAgICAgICAgICBjb250ZW50RnJhbWUudG9wICsgKGNvbnRlbnRGcmFtZS5oZWlnaHQoKSAtIG1TaXplKSAvIDIsCisgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRGcmFtZS5sZWZ0ICsgKGNvbnRlbnRGcmFtZS53aWR0aCgpICsgbVNpemUpIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgY29udGVudEZyYW1lLnRvcCArIChjb250ZW50RnJhbWUuaGVpZ2h0KCkgKyBtU2l6ZSkgLyAyKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZEZyYW1lLCBkaWFsb2cuZ2V0RnJhbWUoKSk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEV4cGxpY2l0U2l6ZVRvcExlZnRHcmF2aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGRvUGFyZW50Q2hpbGRUZXN0KFRFU1RfRVhQTElDSVRfU0laRV9UT1BfTEVGVF9HUkFWSVRZLCAocGFyZW50LCBkaWFsb2cpIC0+IHsKKyAgICAgICAgICAgIFJlY3QgY29udGVudEZyYW1lID0gcGFyZW50LmdldENvbnRlbnRGcmFtZSgpOworICAgICAgICAgICAgUmVjdCBleHBlY3RlZEZyYW1lID0gbmV3IFJlY3QoCisgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRGcmFtZS5sZWZ0LAorICAgICAgICAgICAgICAgICAgICBjb250ZW50RnJhbWUudG9wLAorICAgICAgICAgICAgICAgICAgICBjb250ZW50RnJhbWUubGVmdCArIG1TaXplLAorICAgICAgICAgICAgICAgICAgICBjb250ZW50RnJhbWUudG9wICsgbVNpemUpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkRnJhbWUsIGRpYWxvZy5nZXRGcmFtZSgpKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhwbGljaXRTaXplQm90dG9tUmlnaHRHcmF2aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGRvUGFyZW50Q2hpbGRUZXN0KFRFU1RfRVhQTElDSVRfU0laRV9CT1RUT01fUklHSFRfR1JBVklUWSwgKHBhcmVudCwgZGlhbG9nKSAtPiB7CisgICAgICAgICAgICBSZWN0IGNvbnRlbnRGcmFtZSA9IHBhcmVudC5nZXRDb250ZW50RnJhbWUoKTsKKyAgICAgICAgICAgIFJlY3QgZXhwZWN0ZWRGcmFtZSA9IG5ldyBSZWN0KAorICAgICAgICAgICAgICAgICAgICBjb250ZW50RnJhbWUubGVmdCArIGNvbnRlbnRGcmFtZS53aWR0aCgpIC0gbVNpemUsCisgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRGcmFtZS50b3AgKyBjb250ZW50RnJhbWUuaGVpZ2h0KCkgLSBtU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgY29udGVudEZyYW1lLmxlZnQgKyBjb250ZW50RnJhbWUud2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgY29udGVudEZyYW1lLnRvcCArIGNvbnRlbnRGcmFtZS5oZWlnaHQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRGcmFtZSwgZGlhbG9nLmdldEZyYW1lKCkpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICAvLyBUT0RPKGIvMzAxMjczNzMpOiBDb21tZW50ZWQgb3V0IGZvciBub3cgYmVjYXVzZSBpdCBkb2Vzbid0IHdvcmsuIFdlIGVuZCB1cCBpbnNldHRpbmcgdGhlCisgICAgLy8gZGVjb3Igb24gdGhlIGJvdHRvbS4gSSB0aGluayB0aGlzIGlzIGEgYnVnIHByb2JhYmx5IGluIHRoZSBkZWZhdWx0IGRpYWxvZyBmbGFnczoKKyAgICBASWdub3JlCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3ZlcnNpemVkRGltZW5zaW9ucygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkb1BhcmVudENoaWxkVGVzdChURVNUX09WRVJfU0laRURfRElNRU5TSU9OUywgKHBhcmVudCwgZGlhbG9nKSAtPgorICAgICAgICAgICAgICAgIC8vIFdpdGggdGhlIGRlZmF1bHQgZmxhZ3Mgb3ZlcnNpemUgc2hvdWxkIHJlc3VsdCBpbiBjbGlwcGluZyB0bworICAgICAgICAgICAgICAgIC8vIHBhcmVudCBmcmFtZS4KKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMocGFyZW50LmdldENvbnRlbnRGcmFtZSgpLCBkaWFsb2cuZ2V0RnJhbWUoKSkKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICAvLyBUT0RPKGIvNjM5OTM4NjMpIDogRGlzYWJsZWQgcGVuZGluZyBwdWJsaWMgQVBJIHRvIGZldGNoIG1heGltdW0gc3VyZmFjZSBzaXplLgorICAgIHN0YXRpYyBmaW5hbCBpbnQgb3ZlcnNpemVkRGltZW5zaW9uID0gNTAwMDsKKyAgICAvLyBXaXRoIEZMQUdfTEFZT1VUX05PX0xJTUlUUyAgd2Ugc2hvdWxkIGdldCB0aGUgc2l6ZSB3ZSByZXF1ZXN0LCBldmVuIGlmIGl0cyBtdWNoIGxhcmdlciB0aGFuCisgICAgLy8gdGhlIHNjcmVlbi4KKyAgICBASWdub3JlCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3ZlcnNpemVkRGltZW5zaW9uc05vTGltaXRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFRPRE8oYi8zNjg5MDk3OCk6IFdlIG9ubHkgcnVuIHRoaXMgaW4gZnVsbHNjcmVlbiBiZWNhdXNlIG9mIHRoZQorICAgICAgICAvLyB1bmNsZWFyIHN0YXR1cyBvZiBOT19MSU1JVFMgZm9yIG5vbi1jaGlsZCBzdXJmYWNlcyBpbiBNVyBtb2RlcworICAgICAgICBkb0Z1bGxzY3JlZW5UZXN0KFRFU1RfT1ZFUl9TSVpFRF9ESU1FTlNJT05TX05PX0xJTUlUUywgKHBhcmVudCwgZGlhbG9nKSAtPiB7CisgICAgICAgICAgICBSZWN0IGNvbnRlbnRGcmFtZSA9IHBhcmVudC5nZXRDb250ZW50RnJhbWUoKTsKKyAgICAgICAgICAgIFJlY3QgZXhwZWN0ZWRGcmFtZSA9IG5ldyBSZWN0KGNvbnRlbnRGcmFtZS5sZWZ0LCBjb250ZW50RnJhbWUudG9wLAorICAgICAgICAgICAgICAgICAgICBjb250ZW50RnJhbWUubGVmdCArIG92ZXJzaXplZERpbWVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgY29udGVudEZyYW1lLnRvcCArIG92ZXJzaXplZERpbWVuc2lvbik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRGcmFtZSwgZGlhbG9nLmdldEZyYW1lKCkpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICAvLyBJZiB3ZSByZXF1ZXN0IHRoZSBNQVRDSF9QQVJFTlQgYW5kIGEgbm9uLXplcm8gcG9zaXRpb24sIHdlIHdvdWxkbid0IGJlCisgICAgLy8gYWJsZSB0byBmaXQgYWxsIG9mIG91ciBjb250ZW50LCBzbyB3ZSBzaG91bGQgYmUgYWRqdXN0ZWQgdG8ganVzdCBmaXQgdGhlCisgICAgLy8gY29udGVudCBmcmFtZS4KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFeHBsaWNpdFBvc2l0aW9uTWF0Y2hQYXJlbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZG9QYXJlbnRDaGlsZFRlc3QoVEVTVF9FWFBMSUNJVF9QT1NJVElPTl9NQVRDSF9QQVJFTlQsIChwYXJlbnQsIGRpYWxvZykgLT4KKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMocGFyZW50LmdldENvbnRlbnRGcmFtZSgpLCBkaWFsb2cuZ2V0RnJhbWUoKSkKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICAvLyBVbmxlc3Mgd2UgcGFzcyBOT19MSU1JVFMgaW4gd2hpY2ggY2FzZSBvdXIgcmVxdWVzdGVkIHBvc2l0aW9uIHNob3VsZAorICAgIC8vIGJlIGhvbm9yZWQuCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhwbGljaXRQb3NpdGlvbk1hdGNoUGFyZW50Tm9MaW1pdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgaW50IGV4cGxpY2l0UG9zaXRpb24gPSAxMDA7CisgICAgICAgIGRvUGFyZW50Q2hpbGRUZXN0KFRFU1RfRVhQTElDSVRfUE9TSVRJT05fTUFUQ0hfUEFSRU5UX05PX0xJTUlUUywgKHBhcmVudCwgZGlhbG9nKSAtPiB7CisgICAgICAgICAgICBSZWN0IGNvbnRlbnRGcmFtZSA9IHBhcmVudC5nZXRDb250ZW50RnJhbWUoKTsKKyAgICAgICAgICAgIFJlY3QgZXhwZWN0ZWRGcmFtZSA9IG5ldyBSZWN0KGNvbnRlbnRGcmFtZSk7CisgICAgICAgICAgICBleHBlY3RlZEZyYW1lLm9mZnNldChleHBsaWNpdFBvc2l0aW9uLCBleHBsaWNpdFBvc2l0aW9uKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZEZyYW1lLCBkaWFsb2cuZ2V0RnJhbWUoKSk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIC8vIFdlIHJ1biB0aGUgdHdvIGZvY3VzIHRlc3RzIGZ1bGxzY3JlZW4gb25seSBiZWNhdXNlIHN3aXRjaGluZyB0byB0aGUKKyAgICAvLyBkb2NrZWQgc3RhY2sgd2lsbCBzdHJpcCBhd2F5IGZvY3VzIGZyb20gdGhlIHRhc2sgYW55d2F5LgorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERpYWxvZ1JlY2VpdmVzRm9jdXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZG9GdWxsc2NyZWVuVGVzdChURVNUX01BVENIX1BBUkVOVCwgKHBhcmVudCwgZGlhbG9nKSAtPgorICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhkaWFsb2cuZ2V0TmFtZSgpLCBtQW1XbVN0YXRlLmdldFdtU3RhdGUoKS5nZXRGb2N1c2VkV2luZG93KCkpCisgICAgICAgICk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9Gb2N1c0RpYWxvZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkb0Z1bGxzY3JlZW5UZXN0KFRFU1RfTk9fRk9DVVMsIChwYXJlbnQsIGRpYWxvZykgLT4KKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMocGFyZW50LmdldE5hbWUoKSwgbUFtV21TdGF0ZS5nZXRXbVN0YXRlKCkuZ2V0Rm9jdXNlZFdpbmRvdygpKQorICAgICAgICApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1hcmdpbnNBcmVQZXJjZW50YWdlc09mQ29udGVudEZyYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZsb2F0IGhvcml6b250YWxNYXJnaW4gPSAuMjVmOworICAgICAgICBmbG9hdCB2ZXJ0aWNhbE1hcmdpbiA9IC4zNWY7CisgICAgICAgIGRvUGFyZW50Q2hpbGRUZXN0KFRFU1RfV0lUSF9NQVJHSU5TLCAocGFyZW50LCBkaWFsb2cpIC0+IHsKKyAgICAgICAgICAgIFJlY3QgZnJhbWUgPSBwYXJlbnQuZ2V0Q29udGVudEZyYW1lKCk7CisgICAgICAgICAgICBSZWN0IGV4cGVjdGVkRnJhbWUgPSBuZXcgUmVjdCgKKyAgICAgICAgICAgICAgICAgICAgKGludCkgKGhvcml6b250YWxNYXJnaW4gKiBmcmFtZS53aWR0aCgpICsgZnJhbWUubGVmdCksCisgICAgICAgICAgICAgICAgICAgIChpbnQpICh2ZXJ0aWNhbE1hcmdpbiAqIGZyYW1lLmhlaWdodCgpICsgZnJhbWUudG9wKSwKKyAgICAgICAgICAgICAgICAgICAgKGludCkgKGhvcml6b250YWxNYXJnaW4gKiBmcmFtZS53aWR0aCgpICsgZnJhbWUubGVmdCkgKyBtU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgKGludCkgKHZlcnRpY2FsTWFyZ2luICogZnJhbWUuaGVpZ2h0KCkgKyBmcmFtZS50b3ApICsgbVNpemUpOyAgICAgICAgICAgIAorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkRnJhbWUsIGRpYWxvZy5nZXRGcmFtZSgpKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlhbG9nUGxhY2VkQWJvdmVQYXJlbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgV2luZG93TWFuYWdlclN0YXRlIHdtU3RhdGUgPSBtQW1XbVN0YXRlLmdldFdtU3RhdGUoKTsKKyAgICAgICAgZG9QYXJlbnRDaGlsZFRlc3QoVEVTVF9NQVRDSF9QQVJFTlQsIChwYXJlbnQsIGRpYWxvZykgLT4KKyAgICAgICAgICAgICAgICAvLyBOb3Qgb25seSBzaG91bGQgdGhlIGRpYWxvZyBiZSBoaWdoZXIsIGJ1dCBpdCBzaG91bGQgYmUgbGVhdmUgbXVsdGlwbGUgbGF5ZXJzIG9mCisgICAgICAgICAgICAgICAgLy8gc3BhY2UgaW4gYmV0d2VlbiBmb3IgRGltTGF5ZXJzLCBldGMuLi4KKyAgICAgICAgICAgICAgICBhc3NlcnRUaGF0KHdtU3RhdGUuZ2V0Wk9yZGVyKGRpYWxvZyksIGdyZWF0ZXJUaGFuKHdtU3RhdGUuZ2V0Wk9yZGVyKHBhcmVudCkpKQorICAgICAgICApOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIGludCBnZXRTaXplKCkgeworICAgICAgICBmbG9hdCBkZW5zaXR5ID0KKyAgICAgICAgICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0RGlzcGxheU1ldHJpY3MoKS5kZW5zaXR5OworICAgICAgICByZXR1cm4gKGludCkoMTQ2ICogZGVuc2l0eSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2Uvd2luZG93bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvd20vRGlzcGxheUN1dG91dFRlc3RzLmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS93aW5kb3dtYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci93bS9EaXNwbGF5Q3V0b3V0VGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmYzZTMzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2Uvd2luZG93bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvd20vRGlzcGxheUN1dG91dFRlc3RzLmphdmEKQEAgLTAsMCArMSwzMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIud207CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIud20uRGlzcGxheUN1dG91dFRlc3RzLlRlc3RBY3Rpdml0eS5FWFRSQV9DVVRPVVRfTU9ERTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIud20uRGlzcGxheUN1dG91dFRlc3RzLlRlc3REZWYuV2hpY2guRElTUEFUQ0hFRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIud20uRGlzcGxheUN1dG91dFRlc3RzLlRlc3REZWYuV2hpY2guUk9PVDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LlZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuTEFZT1VUX0lOX0RJU1BMQVlfQ1VUT1VUX01PREVfREVGQVVMVDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkxBWU9VVF9JTl9ESVNQTEFZX0NVVE9VVF9NT0RFX05FVkVSOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuTEFZT1VUX0lOX0RJU1BMQVlfQ1VUT1VUX01PREVfU0hPUlRfRURHRVM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmV2ZXJ5SXRlbTsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmdyZWF0ZXJUaGFuOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuZ3JlYXRlclRoYW5PckVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5oYXNJdGVtOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuaGFzU2l6ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMubGVzc1RoYW5PckVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5ub3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5ub3ROdWxsVmFsdWU7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5udWxsVmFsdWU7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5QcmVzdWJtaXQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LkRpc3BsYXlDdXRvdXQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dJbnNldHM7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlBvbGxpbmdDaGVjazsKKworaW1wb3J0IG9yZy5oYW1jcmVzdC5DdXN0b21UeXBlU2FmZU1hdGNoZXI7CitpbXBvcnQgb3JnLmhhbWNyZXN0LkZlYXR1cmVNYXRjaGVyOworaW1wb3J0IG9yZy5oYW1jcmVzdC5NYXRjaGVyOworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLkVycm9yQ29sbGVjdG9yOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCisvKioKKyAqIEJ1aWxkL0luc3RhbGwvUnVuOgorICogICAgIGF0ZXN0IEN0c1dpbmRvd01hbmFnZXJEZXZpY2VUZXN0Q2FzZXM6RGlzcGxheUN1dG91dFRlc3RzCisgKi8KK0BSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCitAUHJlc3VibWl0CitwdWJsaWMgY2xhc3MgRGlzcGxheUN1dG91dFRlc3RzIHsKKworICAgIEBSdWxlCisgICAgcHVibGljIGZpbmFsIEVycm9yQ29sbGVjdG9yIG1FcnJvckNvbGxlY3RvciA9IG5ldyBFcnJvckNvbGxlY3RvcigpOworCisgICAgQFJ1bGUKKyAgICBwdWJsaWMgZmluYWwgQWN0aXZpdHlUZXN0UnVsZTxUZXN0QWN0aXZpdHk+IG1EaXNwbGF5Q3V0b3V0QWN0aXZpdHkgPQorICAgICAgICAgICAgbmV3IEFjdGl2aXR5VGVzdFJ1bGU8PihUZXN0QWN0aXZpdHkuY2xhc3MsIGZhbHNlIC8qIGluaXRpYWxUb3VjaE1vZGUgKi8sCisgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGxhdW5jaEFjdGl2aXR5ICovKTsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERpc3BsYXlDdXRvdXRfZGVmYXVsdF9wb3J0cmFpdCgpIHsKKyAgICAgICAgcnVuVGVzdChMQVlPVVRfSU5fRElTUExBWV9DVVRPVVRfTU9ERV9ERUZBVUxULCAoYWN0aXZpdHksIGluc2V0cywgZGlzcGxheUN1dG91dCwgd2hpY2gpIC0+IHsKKyAgICAgICAgICAgIGlmIChkaXNwbGF5Q3V0b3V0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAod2hpY2ggPT0gUk9PVCkgeworICAgICAgICAgICAgICAgIGFzc2VydFRoYXQoImN1dG91dCBtdXN0IGJlIGNvbnRhaW5lZCB3aXRoaW4gc3lzdGVtIGJhcnMgaW4gZGVmYXVsdCBtb2RlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVJbnNldHMoZGlzcGxheUN1dG91dCksIGluc2V0c0xlc3NUaGFuT3JFcXVhbFRvKHN0YWJsZUluc2V0cyhpbnNldHMpKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHdoaWNoID09IERJU1BBVENIRUQpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUaGF0KCJtdXN0IG5vdCBkaXBhdGNoIHRvIGhpZXJhcmNoeSBpbiBkZWZhdWx0IG1vZGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUN1dG91dCwgbnVsbFZhbHVlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REaXNwbGF5Q3V0b3V0X2xhbmRzY2FwZSgpIHsKKyAgICAgICAgLy8gVE9ETyBhZGQgbGFuZHNjYXBlIHZhcmlhbnRzCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzcGxheUN1dG91dF9zaG9ydEVkZ2VzX3BvcnRyYWl0KCkgeworICAgICAgICBydW5UZXN0KExBWU9VVF9JTl9ESVNQTEFZX0NVVE9VVF9NT0RFX1NIT1JUX0VER0VTLCAoYSwgaW5zZXRzLCBkaXNwbGF5Q3V0b3V0LCB3aGljaCkgLT4geworICAgICAgICAgICAgLy8gY29tbW9uIGFzc2VydGlvbnMgaW4gcnVuVGVzdCBhcmUgZW5vdWdoLgorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REaXNwbGF5Q3V0b3V0X25ldmVyX3BvcnRyYWl0KCkgeworICAgICAgICBydW5UZXN0KExBWU9VVF9JTl9ESVNQTEFZX0NVVE9VVF9NT0RFX05FVkVSLCAoYSwgaW5zZXRzLCBkaXNwbGF5Q3V0b3V0LCB3aGljaCkgLT4geworICAgICAgICAgICAgYXNzZXJ0VGhhdCgibXVzdCBub3QgbGF5b3V0IGluIGN1dG91dCBhcmVhIGluIG5ldmVyIG1vZGUiLCBkaXNwbGF5Q3V0b3V0LCBudWxsVmFsdWUoKSk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBydW5UZXN0KGludCBjdXRvdXRNb2RlLCBUZXN0RGVmIHRlc3QpIHsKKyAgICAgICAgZmluYWwgVGVzdEFjdGl2aXR5IGFjdGl2aXR5ID0gbGF1bmNoQW5kV2FpdChtRGlzcGxheUN1dG91dEFjdGl2aXR5LAorICAgICAgICAgICAgICAgIGN1dG91dE1vZGUpOworCisgICAgICAgIFdpbmRvd0luc2V0cyBpbnNldHMgPSBnZXRPbk1haW5TeW5jKGFjdGl2aXR5OjpnZXRSb290SW5zZXRzKTsKKyAgICAgICAgV2luZG93SW5zZXRzIGRpc3BhdGNoZWRJbnNldHMgPSBnZXRPbk1haW5TeW5jKGFjdGl2aXR5OjpnZXREaXNwYXRjaGVkSW5zZXRzKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRoYXQoInRlc3Qgc2V0dXAgZmFpbGVkLCBubyBpbnNldHMgYXQgcm9vdCIsIGluc2V0cywgbm90TnVsbFZhbHVlKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VGhhdCgidGVzdCBzZXR1cCBmYWlsZWQsIG5vIGluc2V0cyBkaXNwYXRjaGVkIiwKKyAgICAgICAgICAgICAgICBkaXNwYXRjaGVkSW5zZXRzLCBub3ROdWxsVmFsdWUoKSk7CisKKyAgICAgICAgZmluYWwgRGlzcGxheUN1dG91dCBkaXNwbGF5Q3V0b3V0ID0gaW5zZXRzLmdldERpc3BsYXlDdXRvdXQoKTsKKyAgICAgICAgZmluYWwgRGlzcGxheUN1dG91dCBkaXNwYXRjaGVkRGlzcGxheUN1dG91dCA9IGRpc3BhdGNoZWRJbnNldHMuZ2V0RGlzcGxheUN1dG91dCgpOworCisgICAgICAgIGlmIChkaXNwbGF5Q3V0b3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvbW1vbkFzc2VydHMoYWN0aXZpdHksIGluc2V0cywgZGlzcGxheUN1dG91dCk7CisgICAgICAgIH0KKyAgICAgICAgdGVzdC5ydW4oYWN0aXZpdHksIGluc2V0cywgZGlzcGxheUN1dG91dCwgUk9PVCk7CisKKyAgICAgICAgaWYgKGRpc3BhdGNoZWREaXNwbGF5Q3V0b3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvbW1vbkFzc2VydHMoYWN0aXZpdHksIGRpc3BhdGNoZWRJbnNldHMsIGRpc3BhdGNoZWREaXNwbGF5Q3V0b3V0KTsKKyAgICAgICAgfQorICAgICAgICB0ZXN0LnJ1bihhY3Rpdml0eSwgZGlzcGF0Y2hlZEluc2V0cywgZGlzcGF0Y2hlZERpc3BsYXlDdXRvdXQsIERJU1BBVENIRUQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjb21tb25Bc3NlcnRzKFRlc3RBY3Rpdml0eSBhY3Rpdml0eSwgV2luZG93SW5zZXRzIGluc2V0cywgRGlzcGxheUN1dG91dCBjdXRvdXQpIHsKKyAgICAgICAgYXNzZXJ0U2FmZUluc2V0c1ZhbGlkKGN1dG91dCk7CisgICAgICAgIGFzc2VydFRoYXQoInN5c3RlbVdpbmRvd0luc2V0cyAoYWxzbyBrbm93biBhcyBjb250ZW50IGluc2V0cykgbXVzdCBiZSBhdCBsZWFzdCBhcyBsYXJnZSBhcyAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJjdXRvdXQgc2FmZSBpbnNldHMiLAorICAgICAgICAgICAgICAgIHNhZmVJbnNldHMoY3V0b3V0KSwgaW5zZXRzTGVzc1RoYW5PckVxdWFsVG8oc3lzdGVtV2luZG93SW5zZXRzKGluc2V0cykpKTsKKyAgICAgICAgYXNzZXJ0T25seVNob3J0RWRnZUhhc0luc2V0cyhhY3Rpdml0eSwgY3V0b3V0KTsKKyAgICAgICAgYXNzZXJ0Q3V0b3V0c0FyZVdpdGhpblNhZmVJbnNldHMoYWN0aXZpdHksIGN1dG91dCk7CisgICAgICAgIGFzc2VydEJvdW5kc0FyZU5vbkVtcHR5KGN1dG91dCk7CisgICAgICAgIGFzc2VydEF0TW9zdE9uZUN1dG91dFBlckVkZ2UoYWN0aXZpdHksIGN1dG91dCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFNhZmVJbnNldHNWYWxpZChEaXNwbGF5Q3V0b3V0IGRpc3BsYXlDdXRvdXQpIHsKKyAgICAgICAgLy9ub2luc3BlY3Rpb24gdW5jaGVja2VkCisgICAgICAgIGFzc2VydFRoYXQoImFsbCBzYWZlIGluc2V0cyBtdXN0IGJlIG5vbi1uZWdhdGl2ZSIsIHNhZmVJbnNldHMoZGlzcGxheUN1dG91dCksCisgICAgICAgICAgICAgICAgaW5zZXRWYWx1ZXMoZXZlcnlJdGVtKChNYXRjaGVyKWdyZWF0ZXJUaGFuT3JFcXVhbFRvKDApKSkpOworICAgICAgICBhc3NlcnRUaGF0KCJhdCBsZWFzdCBvbmUgc2FmZSBpbnNldCBtdXN0IGJlIHBvc2l0aXZlLCIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBvdGhlcndpc2UgV2luZG93SW5zZXRzLmdldERpc3BsYXlDdXRvdXQoKSkgbXVzdCByZXR1cm4gbnVsbCIsCisgICAgICAgICAgICAgICAgc2FmZUluc2V0cyhkaXNwbGF5Q3V0b3V0KSwgaW5zZXRWYWx1ZXMoaGFzSXRlbShncmVhdGVyVGhhbigwKSkpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0Q3V0b3V0c0FyZVdpdGhpblNhZmVJbnNldHMoVGVzdEFjdGl2aXR5IGEsIERpc3BsYXlDdXRvdXQgY3V0b3V0KSB7CisgICAgICAgIGZpbmFsIFJlY3Qgc2FmZVJlY3QgPSBnZXRTYWZlUmVjdChhLCBjdXRvdXQpOworCisgICAgICAgIGFzc2VydFRoYXQoInNhZmUgaW5zZXRzIG11c3Qgbm90IGNvdmVyIHRoZSBlbnRpcmUgc2NyZWVuIiwgc2FmZVJlY3QuaXNFbXB0eSgpLCBpcyhmYWxzZSkpOworICAgICAgICBmb3IgKFJlY3QgYm91bmRpbmdSZWN0IDogY3V0b3V0LmdldEJvdW5kaW5nUmVjdHMoKSkgeworICAgICAgICAgICAgYXNzZXJ0VGhhdCgiYm91bmRpbmdSZWN0cyBtdXN0IG5vdCBleHRlbmQgYmV5b25kIHNhZmVJbnNldHMiLAorICAgICAgICAgICAgICAgICAgICBib3VuZGluZ1JlY3QsIG5vdChpbnRlcnNlY3RzV2l0aChzYWZlUmVjdCkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRBdE1vc3RPbmVDdXRvdXRQZXJFZGdlKFRlc3RBY3Rpdml0eSBhLCBEaXNwbGF5Q3V0b3V0IGN1dG91dCkgeworICAgICAgICBmaW5hbCBSZWN0IHNhZmVSZWN0ID0gZ2V0U2FmZVJlY3QoYSwgY3V0b3V0KTsKKworICAgICAgICBhc3NlcnRUaGF0KCJtdXN0IG5vdCBoYXZlIG1vcmUgdGhhbiBvbmUgbGVmdCBjdXRvdXQiLAorICAgICAgICAgICAgICAgIGJvdW5kc1dpdGgoY3V0b3V0LCAocikgLT4gci5yaWdodCA8PSBzYWZlUmVjdC5sZWZ0KSwgaGFzU2l6ZShsZXNzVGhhbk9yRXF1YWxUbygxKSkpOworICAgICAgICBhc3NlcnRUaGF0KCJtdXN0IG5vdCBoYXZlIG1vcmUgdGhhbiBvbmUgdG9wIGN1dG91dCIsCisgICAgICAgICAgICAgICAgYm91bmRzV2l0aChjdXRvdXQsIChyKSAtPiByLmJvdHRvbSA8PSBzYWZlUmVjdC50b3ApLCBoYXNTaXplKGxlc3NUaGFuT3JFcXVhbFRvKDEpKSk7CisgICAgICAgIGFzc2VydFRoYXQoIm11c3Qgbm90IGhhdmUgbW9yZSB0aGFuIG9uZSByaWdodCBjdXRvdXQiLAorICAgICAgICAgICAgICAgIGJvdW5kc1dpdGgoY3V0b3V0LCAocikgLT4gci5sZWZ0ID49IHNhZmVSZWN0LnJpZ2h0KSwgaGFzU2l6ZShsZXNzVGhhbk9yRXF1YWxUbygxKSkpOworICAgICAgICBhc3NlcnRUaGF0KCJtdXN0IG5vdCBoYXZlIG1vcmUgdGhhbiBvbmUgYm90dG9tIGN1dG91dCIsCisgICAgICAgICAgICAgICAgYm91bmRzV2l0aChjdXRvdXQsIChyKSAtPiByLnRvcCA+PSBzYWZlUmVjdC5ib3R0b20pLCBoYXNTaXplKGxlc3NUaGFuT3JFcXVhbFRvKDEpKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydEJvdW5kc0FyZU5vbkVtcHR5KERpc3BsYXlDdXRvdXQgY3V0b3V0KSB7CisgICAgICAgIGZvciAoUmVjdCBib3VuZGluZ1JlY3QgOiBjdXRvdXQuZ2V0Qm91bmRpbmdSZWN0cygpKSB7CisgICAgICAgICAgICBhc3NlcnRUaGF0KCJyZWN0IGluIGJvdW5kaW5nUmVjdHMgbXVzdCBub3QgYmUgZW1wdHkiLAorICAgICAgICAgICAgICAgICAgICBib3VuZGluZ1JlY3QuaXNFbXB0eSgpLCBpcyhmYWxzZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydE9ubHlTaG9ydEVkZ2VIYXNJbnNldHMoVGVzdEFjdGl2aXR5IGFjdGl2aXR5LAorICAgICAgICAgICAgRGlzcGxheUN1dG91dCBkaXNwbGF5Q3V0b3V0KSB7CisgICAgICAgIGZpbmFsIFBvaW50IGRpc3BsYXlTaXplID0gbmV3IFBvaW50KCk7CisgICAgICAgIHJ1bk9uTWFpblN5bmMoKCkgLT4gYWN0aXZpdHkuZ2V0RGVjb3JWaWV3KCkuZ2V0RGlzcGxheSgpLmdldFJlYWxTaXplKGRpc3BsYXlTaXplKSk7CisgICAgICAgIGlmIChkaXNwbGF5U2l6ZS55ID4gZGlzcGxheVNpemUueCkgeyAgLy8gUG9ydHJhaXQgZGlzcGxheQorICAgICAgICAgICAgYXNzZXJ0VGhhdCgibGVmdCBlZGdlIGhhcyBhIGN1dG91dCBkZXNwaXRlIGJlaW5nIGxvbmcgZWRnZSIsCisgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlDdXRvdXQuZ2V0U2FmZUluc2V0TGVmdCgpLCBpcygwKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KCJyaWdodCBlZGdlIGhhcyBhIGN1dG91dCBkZXNwaXRlIGJlaW5nIGxvbmcgZWRnZSIsCisgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlDdXRvdXQuZ2V0U2FmZUluc2V0UmlnaHQoKSwgaXMoMCkpOworICAgICAgICB9CisgICAgICAgIGlmIChkaXNwbGF5U2l6ZS55IDwgZGlzcGxheVNpemUueCkgeyAgLy8gTGFuZHNjYXBlIGRpc3BsYXkKKyAgICAgICAgICAgIGFzc2VydFRoYXQoInRvcCBlZGdlIGhhcyBhIGN1dG91dCBkZXNwaXRlIGJlaW5nIGxvbmcgZWRnZSIsCisgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlDdXRvdXQuZ2V0U2FmZUluc2V0VG9wKCksIGlzKDApKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoImJvdHRvbSBlZGdlIGhhcyBhIGN1dG91dCBkZXNwaXRlIGJlaW5nIGxvbmcgZWRnZSIsCisgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlDdXRvdXQuZ2V0U2FmZUluc2V0Qm90dG9tKCksIGlzKDApKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgTGlzdDxSZWN0PiBib3VuZHNXaXRoKERpc3BsYXlDdXRvdXQgY3V0b3V0LCBQcmVkaWNhdGU8UmVjdD4gcHJlZGljYXRlKSB7CisgICAgICAgIHJldHVybiBjdXRvdXQuZ2V0Qm91bmRpbmdSZWN0cygpLnN0cmVhbSgpLmZpbHRlcihwcmVkaWNhdGUpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgfQorCisKKyAgICBwcml2YXRlIHN0YXRpYyBSZWN0IHNhZmVJbnNldHMoRGlzcGxheUN1dG91dCBkaXNwbGF5Q3V0b3V0KSB7CisgICAgICAgIHJldHVybiBuZXcgUmVjdChkaXNwbGF5Q3V0b3V0LmdldFNhZmVJbnNldExlZnQoKSwgZGlzcGxheUN1dG91dC5nZXRTYWZlSW5zZXRUb3AoKSwKKyAgICAgICAgICAgICAgICBkaXNwbGF5Q3V0b3V0LmdldFNhZmVJbnNldFJpZ2h0KCksIGRpc3BsYXlDdXRvdXQuZ2V0U2FmZUluc2V0Qm90dG9tKCkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFJlY3Qgc3lzdGVtV2luZG93SW5zZXRzKFdpbmRvd0luc2V0cyBpbnNldHMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZWN0KGluc2V0cy5nZXRTeXN0ZW1XaW5kb3dJbnNldExlZnQoKSwgaW5zZXRzLmdldFN5c3RlbVdpbmRvd0luc2V0VG9wKCksCisgICAgICAgICAgICAgICAgaW5zZXRzLmdldFN5c3RlbVdpbmRvd0luc2V0UmlnaHQoKSwgaW5zZXRzLmdldFN5c3RlbVdpbmRvd0luc2V0Qm90dG9tKCkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFJlY3Qgc3RhYmxlSW5zZXRzKFdpbmRvd0luc2V0cyBpbnNldHMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZWN0KGluc2V0cy5nZXRTdGFibGVJbnNldExlZnQoKSwgaW5zZXRzLmdldFN0YWJsZUluc2V0VG9wKCksCisgICAgICAgICAgICAgICAgaW5zZXRzLmdldFN0YWJsZUluc2V0UmlnaHQoKSwgaW5zZXRzLmdldFN0YWJsZUluc2V0Qm90dG9tKCkpOworICAgIH0KKworICAgIHByaXZhdGUgUmVjdCBnZXRTYWZlUmVjdChUZXN0QWN0aXZpdHkgYSwgRGlzcGxheUN1dG91dCBjdXRvdXQpIHsKKyAgICAgICAgZmluYWwgUmVjdCBzYWZlUmVjdCA9IHNhZmVJbnNldHMoY3V0b3V0KTsKKyAgICAgICAgc2FmZVJlY3QuYm90dG9tID0gZ2V0T25NYWluU3luYygoKSAtPiBhLmdldERlY29yVmlldygpLmdldEhlaWdodCgpKSAtIHNhZmVSZWN0LmJvdHRvbTsKKyAgICAgICAgc2FmZVJlY3QucmlnaHQgPSBnZXRPbk1haW5TeW5jKCgpIC0+IGEuZ2V0RGVjb3JWaWV3KCkuZ2V0V2lkdGgoKSkgLSBzYWZlUmVjdC5yaWdodDsKKyAgICAgICAgcmV0dXJuIHNhZmVSZWN0OworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIE1hdGNoZXI8UmVjdD4gaW5zZXRzTGVzc1RoYW5PckVxdWFsVG8oUmVjdCBtYXgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDdXN0b21UeXBlU2FmZU1hdGNoZXI8UmVjdD4oIm11c3QgYmUgc21hbGxlciBvbiBlYWNoIHNpZGUgdGhhbiAiICsgbWF4KSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBib29sZWFuIG1hdGNoZXNTYWZlbHkoUmVjdCBhY3R1YWwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWN0dWFsLmxlZnQgPD0gbWF4LmxlZnQgJiYgYWN0dWFsLnRvcCA8PSBtYXgudG9wCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBhY3R1YWwucmlnaHQgPD0gbWF4LnJpZ2h0ICYmIGFjdHVhbC5ib3R0b20gPD0gbWF4LmJvdHRvbTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBNYXRjaGVyPFJlY3Q+IGludGVyc2VjdHNXaXRoKFJlY3Qgc2FmZVJlY3QpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDdXN0b21UeXBlU2FmZU1hdGNoZXI8UmVjdD4oImludGVyc2VjdHMgd2l0aCAiICsgc2FmZVJlY3QpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gbWF0Y2hlc1NhZmVseShSZWN0IGl0ZW0pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVjdC5pbnRlcnNlY3RzKHNhZmVSZWN0LCBpdGVtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBNYXRjaGVyPFJlY3Q+IGluc2V0VmFsdWVzKE1hdGNoZXI8SXRlcmFibGU8PyBzdXBlciBJbnRlZ2VyPj4gdmFsdWVzTWF0Y2hlcikgeworICAgICAgICByZXR1cm4gbmV3IEZlYXR1cmVNYXRjaGVyPFJlY3QsIEl0ZXJhYmxlPEludGVnZXI+Pih2YWx1ZXNNYXRjaGVyLCAiaW5zZXQgdmFsdWVzIiwKKyAgICAgICAgICAgICAgICAiaW5zZXQgdmFsdWVzIikgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgSXRlcmFibGU8SW50ZWdlcj4gZmVhdHVyZVZhbHVlT2YoUmVjdCBhY3R1YWwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChhY3R1YWwubGVmdCwgYWN0dWFsLnRvcCwgYWN0dWFsLnJpZ2h0LCBhY3R1YWwuYm90dG9tKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBwcml2YXRlIDxUPiB2b2lkIGFzc2VydFRoYXQoU3RyaW5nIHJlYXNvbiwgVCBhY3R1YWwsIE1hdGNoZXI8PyBzdXBlciBUPiBtYXRjaGVyKSB7CisgICAgICAgIG1FcnJvckNvbGxlY3Rvci5jaGVja1RoYXQocmVhc29uLCBhY3R1YWwsIG1hdGNoZXIpOworICAgIH0KKworICAgIHByaXZhdGUgPFI+IFIgZ2V0T25NYWluU3luYyhTdXBwbGllcjxSPiBmKSB7CisgICAgICAgIGZpbmFsIE9iamVjdFtdIHJlc3VsdCA9IG5ldyBPYmplY3RbMV07CisgICAgICAgIHJ1bk9uTWFpblN5bmMoKCkgLT4gcmVzdWx0WzBdID0gZi5nZXQoKSk7CisgICAgICAgIC8vbm9pbnNwZWN0aW9uIHVuY2hlY2tlZAorICAgICAgICByZXR1cm4gKFIpIHJlc3VsdFswXTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcnVuT25NYWluU3luYyhSdW5uYWJsZSBydW5uYWJsZSkgeworICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKS5ydW5Pbk1haW5TeW5jKHJ1bm5hYmxlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIDxUIGV4dGVuZHMgQWN0aXZpdHk+IFQgbGF1bmNoQW5kV2FpdChBY3Rpdml0eVRlc3RSdWxlPFQ+IHJ1bGUsIGludCBjdXRvdXRNb2RlKSB7CisgICAgICAgIGZpbmFsIFQgYWN0aXZpdHkgPSBydWxlLmxhdW5jaEFjdGl2aXR5KAorICAgICAgICAgICAgICAgIG5ldyBJbnRlbnQoKS5wdXRFeHRyYShFWFRSQV9DVVRPVVRfTU9ERSwgY3V0b3V0TW9kZSkpOworICAgICAgICBQb2xsaW5nQ2hlY2sud2FpdEZvcihhY3Rpdml0eTo6aGFzV2luZG93Rm9jdXMpOworICAgICAgICByZXR1cm4gYWN0aXZpdHk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0QWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9DVVRPVVRfTU9ERSA9ICJleHRyYS5jdXRvdXRfbW9kZSI7CisgICAgICAgIHByaXZhdGUgV2luZG93SW5zZXRzIG1EaXNwYXRjaGVkSW5zZXRzOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICAgICAgZ2V0V2luZG93KCkucmVxdWVzdEZlYXR1cmUoV2luZG93LkZFQVRVUkVfTk9fVElUTEUpOworICAgICAgICAgICAgaWYgKGdldEludGVudCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBnZXRXaW5kb3coKS5nZXRBdHRyaWJ1dGVzKCkubGF5b3V0SW5EaXNwbGF5Q3V0b3V0TW9kZSA9IGdldEludGVudCgpLmdldEludEV4dHJhKAorICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFfQ1VUT1VUX01PREUsIExBWU9VVF9JTl9ESVNQTEFZX0NVVE9VVF9NT0RFX0RFRkFVTFQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVmlldyB2aWV3ID0gbmV3IFZpZXcodGhpcyk7CisgICAgICAgICAgICB2aWV3LnNldExheW91dFBhcmFtcyhuZXcgVmlld0dyb3VwLkxheW91dFBhcmFtcyhNQVRDSF9QQVJFTlQsIE1BVENIX1BBUkVOVCkpOworICAgICAgICAgICAgdmlldy5zZXRTeXN0ZW1VaVZpc2liaWxpdHkoVmlldy5TWVNURU1fVUlfRkxBR19MQVlPVVRfRlVMTFNDUkVFTgorICAgICAgICAgICAgICAgICAgICB8IFZpZXcuU1lTVEVNX1VJX0ZMQUdfTEFZT1VUX0hJREVfTkFWSUdBVElPTik7CisgICAgICAgICAgICB2aWV3LnNldE9uQXBwbHlXaW5kb3dJbnNldHNMaXN0ZW5lcigodiwgaW5zZXRzKSAtPiBtRGlzcGF0Y2hlZEluc2V0cyA9IGluc2V0cyk7CisgICAgICAgICAgICBzZXRDb250ZW50Vmlldyh2aWV3KTsKKyAgICAgICAgfQorCisgICAgICAgIFZpZXcgZ2V0RGVjb3JWaWV3KCkgeworICAgICAgICAgICAgcmV0dXJuIGdldFdpbmRvdygpLmdldERlY29yVmlldygpOworICAgICAgICB9CisKKyAgICAgICAgV2luZG93SW5zZXRzIGdldFJvb3RJbnNldHMoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0V2luZG93KCkuZ2V0RGVjb3JWaWV3KCkuZ2V0Um9vdFdpbmRvd0luc2V0cygpOworICAgICAgICB9CisKKyAgICAgICAgV2luZG93SW5zZXRzIGdldERpc3BhdGNoZWRJbnNldHMoKSB7CisgICAgICAgICAgICByZXR1cm4gbURpc3BhdGNoZWRJbnNldHM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnRlcmZhY2UgVGVzdERlZiB7CisgICAgICAgIHZvaWQgcnVuKFRlc3RBY3Rpdml0eSBhLCBXaW5kb3dJbnNldHMgaW5zZXRzLCBEaXNwbGF5Q3V0b3V0IGN1dG91dCwgV2hpY2ggd2hpY2hJbnNldHMpOworCisgICAgICAgIGVudW0gV2hpY2ggeworICAgICAgICAgICAgRElTUEFUQ0hFRCwgUk9PVAorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2Uvd2luZG93bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvd20vTG9jYXRpb25JbldpbmRvd1Rlc3RzLmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS93aW5kb3dtYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci93bS9Mb2NhdGlvbkluV2luZG93VGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmE4NDc0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2Uvd2luZG93bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvd20vTG9jYXRpb25JbldpbmRvd1Rlc3RzLmphdmEKQEAgLTAsMCArMSwyMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLndtOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLndtLkxvY2F0aW9uT25TY3JlZW5UZXN0cy5UZXN0QWN0aXZpdHkuRVhUUkFfTEFZT1VUX1BBUkFNUzsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LlZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19MQVlPVVRfSU5TRVRfREVDT1I7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0xBWU9VVF9JTl9TQ1JFRU47CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5MQVlPVVRfSU5fRElTUExBWV9DVVRPVVRfTU9ERV9ORVZFUjsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkxBWU9VVF9JTl9ESVNQTEFZX0NVVE9VVF9NT0RFX1NIT1JUX0VER0VTOworCitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5pczsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QaXhlbEZvcm1hdDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvaW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5QcmVzdWJtaXQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtczsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLkZsYWt5VGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlBvbGxpbmdDaGVjazsKKworaW1wb3J0IG9yZy5oYW1jcmVzdC5NYXRjaGVyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLkVycm9yQ29sbGVjdG9yOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKKworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKKworQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKK0BTbWFsbFRlc3QKK0BQcmVzdWJtaXQKK0BGbGFreVRlc3QoZGV0YWlsID0gInVudGlsIHByb3ZlbiBub24tZmxha3kiKQorcHVibGljIGNsYXNzIExvY2F0aW9uSW5XaW5kb3dUZXN0cyB7CisKKyAgICBAUnVsZQorICAgIHB1YmxpYyBmaW5hbCBFcnJvckNvbGxlY3RvciBtRXJyb3JDb2xsZWN0b3IgPSBuZXcgRXJyb3JDb2xsZWN0b3IoKTsKKworICAgIEBSdWxlCisgICAgcHVibGljIGZpbmFsIEFjdGl2aXR5VGVzdFJ1bGU8VGVzdEFjdGl2aXR5PiBtQWN0aXZpdHkgPQorICAgICAgICAgICAgbmV3IEFjdGl2aXR5VGVzdFJ1bGU8PihUZXN0QWN0aXZpdHkuY2xhc3MsIGZhbHNlIC8qIGluaXRpYWxUb3VjaE1vZGUgKi8sCisgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGxhdW5jaEFjdGl2aXR5ICovKTsKKworICAgIHByaXZhdGUgTGF5b3V0UGFyYW1zIG1MYXlvdXRQYXJhbXM7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIG1MYXlvdXRQYXJhbXMgPSBuZXcgTGF5b3V0UGFyYW1zKE1BVENIX1BBUkVOVCwgTUFUQ0hfUEFSRU5ULCBMYXlvdXRQYXJhbXMuVFlQRV9BUFBMSUNBVElPTiwKKyAgICAgICAgICAgICAgICBMYXlvdXRQYXJhbXMuRkxBR19MQVlPVVRfSU5fU0NSRUVOIHwgTGF5b3V0UGFyYW1zLkZMQUdfTEFZT1VUX0lOU0VUX0RFQ09SLAorICAgICAgICAgICAgICAgIFBpeGVsRm9ybWF0LlRSQU5TTFVDRU5UKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMb2NhdGlvbkluV2luZG93X2FwcFdpbmRvdygpIHsKKyAgICAgICAgcnVuVGVzdChtTGF5b3V0UGFyYW1zKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMb2NhdGlvbkluV2luZG93X2FwcFdpbmRvd19mdWxsc2NyZWVuKCkgeworICAgICAgICBtTGF5b3V0UGFyYW1zLmZsYWdzIHw9IExheW91dFBhcmFtcy5GTEFHX0ZVTExTQ1JFRU47CisgICAgICAgIHJ1blRlc3QobUxheW91dFBhcmFtcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9jYXRpb25JbldpbmRvd19mbG9hdGluZ1dpbmRvdygpIHsKKyAgICAgICAgbUxheW91dFBhcmFtcy5oZWlnaHQgPSAxMDA7CisgICAgICAgIG1MYXlvdXRQYXJhbXMud2lkdGggPSAxMDA7CisgICAgICAgIG1MYXlvdXRQYXJhbXMuZ3Jhdml0eSA9IEdyYXZpdHkuQ0VOVEVSOworICAgICAgICBtTGF5b3V0UGFyYW1zLmZsYWdzICY9IH4oRkxBR19MQVlPVVRfSU5fU0NSRUVOIHwgRkxBR19MQVlPVVRfSU5TRVRfREVDT1IpOworICAgICAgICBydW5UZXN0KG1MYXlvdXRQYXJhbXMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvY2F0aW9uSW5XaW5kb3dfYXBwV2luZG93X2Rpc3BsYXlDdXRvdXROZXZlcigpIHsKKyAgICAgICAgbUxheW91dFBhcmFtcy5sYXlvdXRJbkRpc3BsYXlDdXRvdXRNb2RlID0gTEFZT1VUX0lOX0RJU1BMQVlfQ1VUT1VUX01PREVfTkVWRVI7CisgICAgICAgIHJ1blRlc3QobUxheW91dFBhcmFtcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9jYXRpb25JbldpbmRvd19hcHBXaW5kb3dfZGlzcGxheUN1dG91dFNob3J0RWRnZXMoKSB7CisgICAgICAgIG1MYXlvdXRQYXJhbXMubGF5b3V0SW5EaXNwbGF5Q3V0b3V0TW9kZSA9IExBWU9VVF9JTl9ESVNQTEFZX0NVVE9VVF9NT0RFX1NIT1JUX0VER0VTOworICAgICAgICBydW5UZXN0KG1MYXlvdXRQYXJhbXMpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBydW5UZXN0KExheW91dFBhcmFtcyBscCkgeworICAgICAgICBmaW5hbCBUZXN0QWN0aXZpdHkgYWN0aXZpdHkgPSBsYXVuY2hBbmRXYWl0KG1BY3Rpdml0eSwgbHApOworICAgICAgICBQb2xsaW5nQ2hlY2sud2FpdEZvcigoKSAtPiBnZXRPbk1haW5TeW5jKGFjdGl2aXR5Ojppc0VudGVyQW5pbWF0aW9uQ29tcGxldGUpKTsKKworICAgICAgICBydW5Pbk1haW5TeW5jKCgpIC0+IHsKKyAgICAgICAgICAgIGFzc2VydFRoYXRWaWV3R2V0TG9jYXRpb25JbldpbmRvd0lzQ29ycmVjdChhY3Rpdml0eS5tVmlldyk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRUaGF0Vmlld0dldExvY2F0aW9uSW5XaW5kb3dJc0NvcnJlY3QoVmlldyB2KSB7CisgICAgICAgIGZpbmFsIGZsb2F0W10gZXhwZWN0ZWQgPSBuZXcgZmxvYXRbXSB7MCwgMH07CisKKyAgICAgICAgdi5nZXRNYXRyaXgoKS5tYXBQb2ludHMoZXhwZWN0ZWQpOworICAgICAgICBleHBlY3RlZFswXSArPSB2LmdldExlZnQoKTsKKyAgICAgICAgZXhwZWN0ZWRbMV0gKz0gdi5nZXRUb3AoKTsKKworICAgICAgICBmaW5hbCBWaWV3IHBhcmVudCA9IChWaWV3KXYuZ2V0UGFyZW50KCk7CisgICAgICAgIGV4cGVjdGVkWzBdIC09IHBhcmVudC5nZXRTY3JvbGxYKCk7CisgICAgICAgIGV4cGVjdGVkWzFdIC09IHBhcmVudC5nZXRTY3JvbGxZKCk7CisKKyAgICAgICAgZmluYWwgUG9pbnQgcGFyZW50TG9jYXRpb24gPSBsb2NhdGlvbkluV2luZG93QXNQb2ludChwYXJlbnQpOworICAgICAgICBleHBlY3RlZFswXSArPSBwYXJlbnRMb2NhdGlvbi54OworICAgICAgICBleHBlY3RlZFsxXSArPSBwYXJlbnRMb2NhdGlvbi55OworCisgICAgICAgIFBvaW50IGFjdHVhbCA9IGxvY2F0aW9uSW5XaW5kb3dBc1BvaW50KHYpOworCisgICAgICAgIGFzc2VydFRoYXQoImdldExvY2F0aW9uSW5XaW5kb3cgcmV0dXJuZWQgd3JvbmcgbG9jYXRpb24iLAorICAgICAgICAgICAgICAgIGFjdHVhbCwgaXMobmV3IFBvaW50KChpbnQpIGV4cGVjdGVkWzBdLCAoaW50KSBleHBlY3RlZFsxXSkpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFBvaW50IGxvY2F0aW9uSW5XaW5kb3dBc1BvaW50KFZpZXcgdikgeworICAgICAgICBmaW5hbCBpbnRbXSBvdXQgPSBuZXcgaW50WzJdOworICAgICAgICB2LmdldExvY2F0aW9uSW5XaW5kb3cob3V0KTsKKyAgICAgICAgcmV0dXJuIG5ldyBQb2ludChvdXRbMF0sIG91dFsxXSk7CisgICAgfQorCisgICAgcHJpdmF0ZSA8VD4gdm9pZCBhc3NlcnRUaGF0KFN0cmluZyByZWFzb24sIFQgYWN0dWFsLCBNYXRjaGVyPD8gc3VwZXIgVD4gbWF0Y2hlcikgeworICAgICAgICBtRXJyb3JDb2xsZWN0b3IuY2hlY2tUaGF0KHJlYXNvbiwgYWN0dWFsLCBtYXRjaGVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIDxSPiBSIGdldE9uTWFpblN5bmMoU3VwcGxpZXI8Uj4gZikgeworICAgICAgICBmaW5hbCBPYmplY3RbXSByZXN1bHQgPSBuZXcgT2JqZWN0WzFdOworICAgICAgICBydW5Pbk1haW5TeW5jKCgpIC0+IHJlc3VsdFswXSA9IGYuZ2V0KCkpOworICAgICAgICAvL25vaW5zcGVjdGlvbiB1bmNoZWNrZWQKKyAgICAgICAgcmV0dXJuIChSKSByZXN1bHRbMF07CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJ1bk9uTWFpblN5bmMoUnVubmFibGUgcnVubmFibGUpIHsKKyAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkucnVuT25NYWluU3luYyhydW5uYWJsZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSA8VCBleHRlbmRzIEFjdGl2aXR5PiBUIGxhdW5jaEFuZFdhaXQoQWN0aXZpdHlUZXN0UnVsZTxUPiBydWxlLAorICAgICAgICAgICAgTGF5b3V0UGFyYW1zIGxwKSB7CisgICAgICAgIGZpbmFsIFQgYWN0aXZpdHkgPSBydWxlLmxhdW5jaEFjdGl2aXR5KAorICAgICAgICAgICAgICAgIG5ldyBJbnRlbnQoKS5wdXRFeHRyYShFWFRSQV9MQVlPVVRfUEFSQU1TLCBscCkpOworICAgICAgICBQb2xsaW5nQ2hlY2sud2FpdEZvcihhY3Rpdml0eTo6aGFzV2luZG93Rm9jdXMpOworICAgICAgICByZXR1cm4gYWN0aXZpdHk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0QWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9MQVlPVVRfUEFSQU1TID0gImV4dHJhLmxheW91dF9wYXJhbXMiOworICAgICAgICBwcml2YXRlIFZpZXcgbVZpZXc7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtRW50ZXJBbmltYXRpb25Db21wbGV0ZTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgICAgIGdldFdpbmRvdygpLnJlcXVlc3RGZWF0dXJlKFdpbmRvdy5GRUFUVVJFX05PX1RJVExFKTsKKworICAgICAgICAgICAgRnJhbWVMYXlvdXQgZnJhbWUgPSBuZXcgRnJhbWVMYXlvdXQodGhpcyk7CisgICAgICAgICAgICBmcmFtZS5zZXRMYXlvdXRQYXJhbXMobmV3IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMoTUFUQ0hfUEFSRU5ULCBNQVRDSF9QQVJFTlQpKTsKKyAgICAgICAgICAgIGZyYW1lLnNldFBhZGRpbmcoMSwgMiwgMywgNCk7CisgICAgICAgICAgICBzZXRDb250ZW50VmlldyhmcmFtZSk7CisKKyAgICAgICAgICAgIG1WaWV3ID0gbmV3IFZpZXcodGhpcyk7CisgICAgICAgICAgICBmaW5hbCBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMgbHAgPSBuZXcgRnJhbWVMYXlvdXQuTGF5b3V0UGFyYW1zKDEsIDEpOworICAgICAgICAgICAgbHAubGVmdE1hcmdpbiA9IDY7CisgICAgICAgICAgICBscC50b3BNYXJnaW4gPSA3OworICAgICAgICAgICAgZnJhbWUuYWRkVmlldyhtVmlldywgbHApOworICAgICAgICAgICAgbVZpZXcuc2V0VHJhbnNsYXRpb25YKDgpOworICAgICAgICAgICAgbVZpZXcuc2V0VHJhbnNsYXRpb25ZKDkpOworICAgICAgICAgICAgbVZpZXcuc2V0U2Nyb2xsWCgxMCk7CisgICAgICAgICAgICBtVmlldy5zZXRTY3JvbGxZKDExKTsKKyAgICAgICAgICAgIGZyYW1lLnNldFNjcm9sbFgoMTIpOworICAgICAgICAgICAgZnJhbWUuc2V0U2Nyb2xsWSgxMyk7CisKKyAgICAgICAgICAgIGlmIChnZXRJbnRlbnQoKSAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICYmIGdldEludGVudCgpLmdldFBhcmNlbGFibGVFeHRyYShFWFRSQV9MQVlPVVRfUEFSQU1TKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZ2V0V2luZG93KCkuc2V0QXR0cmlidXRlcyhnZXRJbnRlbnQoKS5nZXRQYXJjZWxhYmxlRXh0cmEoRVhUUkFfTEFZT1VUX1BBUkFNUykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNFbnRlckFuaW1hdGlvbkNvbXBsZXRlKCkgeworICAgICAgICAgICAgcmV0dXJuIG1FbnRlckFuaW1hdGlvbkNvbXBsZXRlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRW50ZXJBbmltYXRpb25Db21wbGV0ZSgpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uRW50ZXJBbmltYXRpb25Db21wbGV0ZSgpOworICAgICAgICAgICAgbUVudGVyQW5pbWF0aW9uQ29tcGxldGUgPSB0cnVlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2Uvd2luZG93bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvd20vTG9jYXRpb25PblNjcmVlblRlc3RzLmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS93aW5kb3dtYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci93bS9Mb2NhdGlvbk9uU2NyZWVuVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTU1MmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2Uvd2luZG93bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvd20vTG9jYXRpb25PblNjcmVlblRlc3RzLmphdmEKQEAgLTAsMCArMSwyNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmVyLndtOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLndtLkxvY2F0aW9uT25TY3JlZW5UZXN0cy5UZXN0QWN0aXZpdHkuQ09MT1JfVE9MRVJBTkNFOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci53bS5Mb2NhdGlvbk9uU2NyZWVuVGVzdHMuVGVzdEFjdGl2aXR5LkVYVFJBX0xBWU9VVF9QQVJBTVM7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLndtLkxvY2F0aW9uT25TY3JlZW5UZXN0cy5UZXN0QWN0aXZpdHkuVEVTVF9DT0xPUl8xOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci53bS5Mb2NhdGlvbk9uU2NyZWVuVGVzdHMuVGVzdEFjdGl2aXR5LlRFU1RfQ09MT1JfMjsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LlZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19MQVlPVVRfSU5TRVRfREVDT1I7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0xBWU9VVF9JTl9TQ1JFRU47CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5MQVlPVVRfSU5fRElTUExBWV9DVVRPVVRfTU9ERV9ORVZFUjsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkxBWU9VVF9JTl9ESVNQTEFZX0NVVE9VVF9NT0RFX1NIT1JUX0VER0VTOworCitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5pczsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGl4ZWxGb3JtYXQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb2ludDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUHJlc3VibWl0OworaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvdzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXM7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5GbGFreVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5CaXRtYXBVdGlsczsKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlBvbGxpbmdDaGVjazsKKworaW1wb3J0IG9yZy5oYW1jcmVzdC5NYXRjaGVyOworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuRXJyb3JDb2xsZWN0b3I7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworCitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOworCitAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQorQFNtYWxsVGVzdAorQFByZXN1Ym1pdAorQEZsYWt5VGVzdChkZXRhaWwgPSAidW50aWwgcHJvdmVuIG5vbi1mbGFreSIpCitwdWJsaWMgY2xhc3MgTG9jYXRpb25PblNjcmVlblRlc3RzIHsKKworICAgIEBSdWxlCisgICAgcHVibGljIGZpbmFsIEVycm9yQ29sbGVjdG9yIG1FcnJvckNvbGxlY3RvciA9IG5ldyBFcnJvckNvbGxlY3RvcigpOworCisgICAgQFJ1bGUKKyAgICBwdWJsaWMgZmluYWwgQWN0aXZpdHlUZXN0UnVsZTxUZXN0QWN0aXZpdHk+IG1EaXNwbGF5Q3V0b3V0QWN0aXZpdHkgPQorICAgICAgICAgICAgbmV3IEFjdGl2aXR5VGVzdFJ1bGU8PihUZXN0QWN0aXZpdHkuY2xhc3MsIGZhbHNlIC8qIGluaXRpYWxUb3VjaE1vZGUgKi8sCisgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGxhdW5jaEFjdGl2aXR5ICovKTsKKworICAgIHByaXZhdGUgTGF5b3V0UGFyYW1zIG1MYXlvdXRQYXJhbXM7CisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBtQ29udGV4dCA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKTsKKyAgICAgICAgbUxheW91dFBhcmFtcyA9IG5ldyBMYXlvdXRQYXJhbXMoTUFUQ0hfUEFSRU5ULCBNQVRDSF9QQVJFTlQsIExheW91dFBhcmFtcy5UWVBFX0FQUExJQ0FUSU9OLAorICAgICAgICAgICAgICAgIExheW91dFBhcmFtcy5GTEFHX0xBWU9VVF9JTl9TQ1JFRU4gfCBMYXlvdXRQYXJhbXMuRkxBR19MQVlPVVRfSU5TRVRfREVDT1IsCisgICAgICAgICAgICAgICAgUGl4ZWxGb3JtYXQuVFJBTlNMVUNFTlQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvY2F0aW9uT25EaXNwbGF5X2FwcFdpbmRvdygpIHsKKyAgICAgICAgcnVuVGVzdChtTGF5b3V0UGFyYW1zKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMb2NhdGlvbk9uRGlzcGxheV9hcHBXaW5kb3dfZnVsbHNjcmVlbigpIHsKKyAgICAgICAgbUxheW91dFBhcmFtcy5mbGFncyB8PSBMYXlvdXRQYXJhbXMuRkxBR19GVUxMU0NSRUVOOworICAgICAgICBydW5UZXN0KG1MYXlvdXRQYXJhbXMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvY2F0aW9uT25EaXNwbGF5X2Zsb2F0aW5nV2luZG93KCkgeworICAgICAgICBtTGF5b3V0UGFyYW1zLmhlaWdodCA9IDUwOworICAgICAgICBtTGF5b3V0UGFyYW1zLndpZHRoID0gNTA7CisgICAgICAgIG1MYXlvdXRQYXJhbXMuZ3Jhdml0eSA9IEdyYXZpdHkuQ0VOVEVSOworICAgICAgICBtTGF5b3V0UGFyYW1zLmZsYWdzICY9IH4oRkxBR19MQVlPVVRfSU5fU0NSRUVOIHwgRkxBR19MQVlPVVRfSU5TRVRfREVDT1IpOworICAgICAgICBydW5UZXN0KG1MYXlvdXRQYXJhbXMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvY2F0aW9uT25EaXNwbGF5X2FwcFdpbmRvd19kaXNwbGF5Q3V0b3V0TmV2ZXIoKSB7CisgICAgICAgIG1MYXlvdXRQYXJhbXMubGF5b3V0SW5EaXNwbGF5Q3V0b3V0TW9kZSA9IExBWU9VVF9JTl9ESVNQTEFZX0NVVE9VVF9NT0RFX05FVkVSOworICAgICAgICBydW5UZXN0KG1MYXlvdXRQYXJhbXMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvY2F0aW9uT25EaXNwbGF5X2FwcFdpbmRvd19kaXNwbGF5Q3V0b3V0U2hvcnRFZGdlcygpIHsKKyAgICAgICAgbUxheW91dFBhcmFtcy5sYXlvdXRJbkRpc3BsYXlDdXRvdXRNb2RlID0gTEFZT1VUX0lOX0RJU1BMQVlfQ1VUT1VUX01PREVfU0hPUlRfRURHRVM7CisgICAgICAgIHJ1blRlc3QobUxheW91dFBhcmFtcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJ1blRlc3QoTGF5b3V0UGFyYW1zIGxwKSB7CisgICAgICAgIGZpbmFsIFRlc3RBY3Rpdml0eSBhY3Rpdml0eSA9IGxhdW5jaEFuZFdhaXQobURpc3BsYXlDdXRvdXRBY3Rpdml0eSwgbHApOworICAgICAgICBQb2xsaW5nQ2hlY2sud2FpdEZvcigoKSAtPiBnZXRPbk1haW5TeW5jKGFjdGl2aXR5Ojppc0VudGVyQW5pbWF0aW9uQ29tcGxldGUpKTsKKworICAgICAgICBQb2ludCBhY3R1YWwgPSBnZXRPbk1haW5TeW5jKGFjdGl2aXR5OjpnZXRWaWV3TG9jYXRpb25PblNjcmVlbik7CisgICAgICAgIFBvaW50IGV4cGVjdGVkID0gZmluZFRlc3RDb2xvcnNJblNjcmVlbnNob3QoYWN0dWFsKTsKKworICAgICAgICBhc3NlcnRUaGF0KCJWaWV3LmxvY2F0aW9uT25TY3JlZW4gcmV0dXJuZWQgaW5jb3JyZWN0IHZhbHVlIiwgYWN0dWFsLCBpcyhleHBlY3RlZCkpOworICAgIH0KKworICAgIHByaXZhdGUgPFQ+IHZvaWQgYXNzZXJ0VGhhdChTdHJpbmcgcmVhc29uLCBUIGFjdHVhbCwgTWF0Y2hlcjw/IHN1cGVyIFQ+IG1hdGNoZXIpIHsKKyAgICAgICAgbUVycm9yQ29sbGVjdG9yLmNoZWNrVGhhdChyZWFzb24sIGFjdHVhbCwgbWF0Y2hlcik7CisgICAgfQorCisgICAgcHJpdmF0ZSA8Uj4gUiBnZXRPbk1haW5TeW5jKFN1cHBsaWVyPFI+IGYpIHsKKyAgICAgICAgZmluYWwgT2JqZWN0W10gcmVzdWx0ID0gbmV3IE9iamVjdFsxXTsKKyAgICAgICAgcnVuT25NYWluU3luYygoKSAtPiByZXN1bHRbMF0gPSBmLmdldCgpKTsKKyAgICAgICAgLy9ub2luc3BlY3Rpb24gdW5jaGVja2VkCisgICAgICAgIHJldHVybiAoUikgcmVzdWx0WzBdOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBydW5Pbk1haW5TeW5jKFJ1bm5hYmxlIHJ1bm5hYmxlKSB7CisgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLnJ1bk9uTWFpblN5bmMocnVubmFibGUpOworICAgIH0KKworICAgIHByaXZhdGUgPFQgZXh0ZW5kcyBBY3Rpdml0eT4gVCBsYXVuY2hBbmRXYWl0KEFjdGl2aXR5VGVzdFJ1bGU8VD4gcnVsZSwKKyAgICAgICAgICAgIExheW91dFBhcmFtcyBscCkgeworICAgICAgICBmaW5hbCBUIGFjdGl2aXR5ID0gcnVsZS5sYXVuY2hBY3Rpdml0eSgKKyAgICAgICAgICAgICAgICBuZXcgSW50ZW50KCkucHV0RXh0cmEoRVhUUkFfTEFZT1VUX1BBUkFNUywgbHApKTsKKyAgICAgICAgUG9sbGluZ0NoZWNrLndhaXRGb3IoYWN0aXZpdHk6Omhhc1dpbmRvd0ZvY3VzKTsKKyAgICAgICAgcmV0dXJuIGFjdGl2aXR5OworICAgIH0KKworICAgIHByaXZhdGUgUG9pbnQgZmluZFRlc3RDb2xvcnNJblNjcmVlbnNob3QoUG9pbnQgZ3Vlc3MpIHsKKyAgICAgICAgZmluYWwgQml0bWFwIHNjcmVlbnNob3QgPQorICAgICAgICAgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLmdldFVpQXV0b21hdGlvbigpLnRha2VTY3JlZW5zaG90KCk7CisKKyAgICAgICAgLy8gV2UgaGF2ZSBhIGdvb2QgZ3Vlc3MgZnJvbSBsb2NhdGlvbk9uU2NyZWVuIC0gY2hlY2sgdGhlcmUgZmlyc3QgdG8gYXZvaWQgaGF2aW5nIHRvIGdvIG92ZXIKKyAgICAgICAgLy8gdGhlIGVudGlyZSBiaXRtYXAuIEFsc28gaW5jcmVhc2VzIHJvYnVzdG5lc3MgaW4gdGhlIGV4dHJlbWVseSB1bmxpa2VseSBjYXNlIHRoYXQgdGhvc2UKKyAgICAgICAgLy8gY29sb3JzIGFyZSB2aXNpYmxlIGVsc2V3aGVyZS4KKyAgICAgICAgaWYgKGlzVGVzdENvbG9ycyhzY3JlZW5zaG90LCBndWVzcy54LCBndWVzcy55KSkgeworICAgICAgICAgICAgcmV0dXJuIGd1ZXNzOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBzY3JlZW5zaG90LmdldEhlaWdodCgpOyB5KyspIHsKKyAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgc2NyZWVuc2hvdC5nZXRXaWR0aCgpIC0gMTsgeCsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzVGVzdENvbG9ycyhzY3JlZW5zaG90LCB4LCB5KSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBvaW50KHgsIHkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgcGF0aCA9IG1Db250ZXh0LmdldEV4dGVybmFsRmlsZXNEaXIobnVsbCkuZ2V0UGF0aCgpOworICAgICAgICBTdHJpbmcgZmlsZSA9ICJsb2NhdGlvbl9vbl9zY3JlZW5fZmFpbHVyZS5wbmciOworICAgICAgICBCaXRtYXBVdGlscy5zYXZlQml0bWFwKHNjcmVlbnNob3QsIHBhdGgsIGZpbGUpOworICAgICAgICBBc3NlcnQuZmFpbCgiTm8gbWF0Y2ggZm91bmQgZm9yIFRFU1RfQ09MT1JfMSBhbmQgVEVTVF9DT0xPUl8yIHBpeGVscy4gQ2hlY2sgIgorICAgICAgICAgICAgICAgICsgcGF0aCArICIvIiArIGZpbGUpOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNUZXN0Q29sb3JzKEJpdG1hcCBzY3JlZW5zaG90LCBpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgcmV0dXJuIHNhbWVDb2xvcldpdGhpblRvbGVyYW5jZShzY3JlZW5zaG90LmdldFBpeGVsKHgsIHkpLCBURVNUX0NPTE9SXzEpCisgICAgICAgICAgICAgICAgJiYgc2FtZUNvbG9yV2l0aGluVG9sZXJhbmNlKHNjcmVlbnNob3QuZ2V0UGl4ZWwoeCArIDEsIHkpLCBURVNUX0NPTE9SXzIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0d28gY29sb3JzIGFyZSBjb25zaWRlcmVkIHRoZSBzYW1lLgorICAgICAqCisgICAgICogU29tZSB0b2xlcmFuY2UgaXMgYWxsb3dlZCB0byBjb21wZW5zYXRlIGZvciBlcnJvcnMgaW50cm9kdWNlZCB3aGVuIHNjcmVlbnNob3RzIGFyZSBzY2FsZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzYW1lQ29sb3JXaXRoaW5Ub2xlcmFuY2UoaW50IHBpeGVsQ29sb3IsIGludCB0ZXN0Q29sb3IpIHsKKyAgICAgICAgZmluYWwgQ29sb3IgcENvbG9yID0gQ29sb3IudmFsdWVPZihwaXhlbENvbG9yKTsKKyAgICAgICAgZmluYWwgQ29sb3IgdENvbG9yID0gQ29sb3IudmFsdWVPZih0ZXN0Q29sb3IpOworICAgICAgICByZXR1cm4gcENvbG9yLmFscGhhKCkgPT0gdENvbG9yLmFscGhhKCkKKyAgICAgICAgICAgICAgICAmJiBNYXRoLmFicyhwQ29sb3IucmVkKCkgLSB0Q29sb3IucmVkKCkpIDw9IENPTE9SX1RPTEVSQU5DRQorICAgICAgICAgICAgICAgICYmIE1hdGguYWJzKHBDb2xvci5ibHVlKCkgLSB0Q29sb3IuYmx1ZSgpKSA8PSBDT0xPUl9UT0xFUkFOQ0UKKyAgICAgICAgICAgICAgICAmJiBNYXRoLmFicyhwQ29sb3IuZ3JlZW4oKSAtIHRDb2xvci5ncmVlbigpKSA8PSBDT0xPUl9UT0xFUkFOQ0U7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0QWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBURVNUX0NPTE9SXzEgPSAweGZmMTIzNDU2OworICAgICAgICBzdGF0aWMgZmluYWwgaW50IFRFU1RfQ09MT1JfMiA9IDB4ZmZmZWRjYmE7CisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1JfVE9MRVJBTkNFID0gNDsKKyAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9MQVlPVVRfUEFSQU1TID0gImV4dHJhLmxheW91dF9wYXJhbXMiOworICAgICAgICBwcml2YXRlIFZpZXcgbVZpZXc7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtRW50ZXJBbmltYXRpb25Db21wbGV0ZTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgICAgIGdldFdpbmRvdygpLnJlcXVlc3RGZWF0dXJlKFdpbmRvdy5GRUFUVVJFX05PX1RJVExFKTsKKworICAgICAgICAgICAgRnJhbWVMYXlvdXQgZnJhbWUgPSBuZXcgRnJhbWVMYXlvdXQodGhpcyk7CisgICAgICAgICAgICBmcmFtZS5zZXRMYXlvdXRQYXJhbXMobmV3IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMoTUFUQ0hfUEFSRU5ULCBNQVRDSF9QQVJFTlQpKTsKKyAgICAgICAgICAgIHNldENvbnRlbnRWaWV3KGZyYW1lKTsKKworICAgICAgICAgICAgbVZpZXcgPSBuZXcgVGVzdFZpZXcodGhpcyk7CisgICAgICAgICAgICBmcmFtZS5hZGRWaWV3KG1WaWV3LCBuZXcgRnJhbWVMYXlvdXQuTGF5b3V0UGFyYW1zKDIsIDEsIEdyYXZpdHkuQ0VOVEVSKSk7CisKKyAgICAgICAgICAgIGlmIChnZXRJbnRlbnQoKSAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICYmIGdldEludGVudCgpLmdldFBhcmNlbGFibGVFeHRyYShFWFRSQV9MQVlPVVRfUEFSQU1TKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZ2V0V2luZG93KCkuc2V0QXR0cmlidXRlcyhnZXRJbnRlbnQoKS5nZXRQYXJjZWxhYmxlRXh0cmEoRVhUUkFfTEFZT1VUX1BBUkFNUykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFBvaW50IGdldFZpZXdMb2NhdGlvbk9uU2NyZWVuKCkgeworICAgICAgICAgICAgZmluYWwgaW50W10gbG9jYXRpb24gPSBuZXcgaW50WzJdOworICAgICAgICAgICAgbVZpZXcuZ2V0TG9jYXRpb25PblNjcmVlbihsb2NhdGlvbik7CisgICAgICAgICAgICByZXR1cm4gbmV3IFBvaW50KGxvY2F0aW9uWzBdLCBsb2NhdGlvblsxXSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0VudGVyQW5pbWF0aW9uQ29tcGxldGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbUVudGVyQW5pbWF0aW9uQ29tcGxldGU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25FbnRlckFuaW1hdGlvbkNvbXBsZXRlKCkgeworICAgICAgICAgICAgc3VwZXIub25FbnRlckFuaW1hdGlvbkNvbXBsZXRlKCk7CisgICAgICAgICAgICBtRW50ZXJBbmltYXRpb25Db21wbGV0ZSA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUZXN0VmlldyBleHRlbmRzIFZpZXcgeworICAgICAgICBwcml2YXRlIFBhaW50IG1QYWludCA9IG5ldyBQYWludCgpOworCisgICAgICAgIHB1YmxpYyBUZXN0VmlldyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKKworICAgICAgICAgICAgbVBhaW50LnNldENvbG9yKFRFU1RfQ09MT1JfMSk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMCwgMCwgMSwgMSwgbVBhaW50KTsKKyAgICAgICAgICAgIG1QYWludC5zZXRDb2xvcihURVNUX0NPTE9SXzIpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDEsIDAsIDIsIDEsIG1QYWludCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS93aW5kb3dtYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci93bS9QYXJlbnRDaGlsZFRlc3RCYXNlLmphdmEgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS93aW5kb3dtYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci93bS9QYXJlbnRDaGlsZFRlc3RCYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNjYzljZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZyYW1ld29yay9iYXNlL3dpbmRvd21hbmFnZXIvc3JjL2FuZHJvaWQvc2VydmVyL3dtL1BhcmVudENoaWxkVGVzdEJhc2UuamF2YQpAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci53bTsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5XaW5kb3dDb25maWd1cmF0aW9uLldJTkRPV0lOR19NT0RFX1NQTElUX1NDUkVFTl9QUklNQVJZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5TdGF0ZUxvZ2dlci5sb2c7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLndtLkRpYWxvZ0ZyYW1lVGVzdEFjdGl2aXR5LkVYVFJBX1RFU1RfQ0FTRTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5zZXJ2ZXIuYW0uQWN0aXZpdHlNYW5hZ2VyVGVzdEJhc2U7CitpbXBvcnQgYW5kcm9pZC5zZXJ2ZXIuYW0uV2luZG93TWFuYWdlclN0YXRlLldpbmRvd1N0YXRlOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CisKK2Fic3RyYWN0IGNsYXNzIFBhcmVudENoaWxkVGVzdEJhc2U8VCBleHRlbmRzIEFjdGl2aXR5PiBleHRlbmRzIEFjdGl2aXR5TWFuYWdlclRlc3RCYXNlIHsKKworICAgIGludGVyZmFjZSBQYXJlbnRDaGlsZFRlc3QgeworICAgICAgICB2b2lkIGRvVGVzdChXaW5kb3dTdGF0ZSBwYXJlbnQsIFdpbmRvd1N0YXRlIGNoaWxkKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc3RhcnRUZXN0Q2FzZShTdHJpbmcgdGVzdENhc2UpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpCisgICAgICAgICAgICAgICAgLnB1dEV4dHJhKEVYVFJBX1RFU1RfQ0FTRSwgdGVzdENhc2UpOworICAgICAgICBhY3Rpdml0eVJ1bGUoKS5sYXVuY2hBY3Rpdml0eShpbnRlbnQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzdGFydFRlc3RDYXNlRG9ja2VkKFN0cmluZyB0ZXN0Q2FzZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN0YXJ0VGVzdENhc2UodGVzdENhc2UpOworICAgICAgICBzZXRBY3Rpdml0eVRhc2tXaW5kb3dpbmdNb2RlKGFjdGl2aXR5TmFtZSgpLCBXSU5ET1dJTkdfTU9ERV9TUExJVF9TQ1JFRU5fUFJJTUFSWSk7CisgICAgfQorCisgICAgYWJzdHJhY3QgQ29tcG9uZW50TmFtZSBhY3Rpdml0eU5hbWUoKTsKKyAgICBhYnN0cmFjdCBBY3Rpdml0eVRlc3RSdWxlPFQ+IGFjdGl2aXR5UnVsZSgpOworCisgICAgYWJzdHJhY3Qgdm9pZCBkb1NpbmdsZVRlc3QoUGFyZW50Q2hpbGRUZXN0IHQpIHRocm93cyBFeGNlcHRpb247CisKKyAgICB2b2lkIGRvRnVsbHNjcmVlblRlc3QoU3RyaW5nIHRlc3RDYXNlLCBQYXJlbnRDaGlsZFRlc3QgdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGxvZygiUnVubmluZyB0ZXN0IGZ1bGxzY3JlZW4iKTsKKyAgICAgICAgc3RhcnRUZXN0Q2FzZSh0ZXN0Q2FzZSk7CisgICAgICAgIGRvU2luZ2xlVGVzdCh0KTsKKyAgICAgICAgYWN0aXZpdHlSdWxlKCkuZmluaXNoQWN0aXZpdHkoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZG9Eb2NrZWRUZXN0KFN0cmluZyB0ZXN0Q2FzZSwgUGFyZW50Q2hpbGRUZXN0IHQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBsb2coIlJ1bm5pbmcgdGVzdCBkb2NrZWQiKTsKKyAgICAgICAgaWYgKCFzdXBwb3J0c1NwbGl0U2NyZWVuTXVsdGlXaW5kb3coKSkgeworICAgICAgICAgICAgbG9nKCJTa2lwcGluZyB0ZXN0OiBubyBzcGxpdCBtdWx0aS13aW5kb3cgc3VwcG9ydCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHN0YXJ0VGVzdENhc2VEb2NrZWQodGVzdENhc2UpOworICAgICAgICBkb1NpbmdsZVRlc3QodCk7CisgICAgICAgIGFjdGl2aXR5UnVsZSgpLmZpbmlzaEFjdGl2aXR5KCk7CisgICAgfQorCisgICAgdm9pZCBkb1BhcmVudENoaWxkVGVzdChTdHJpbmcgdGVzdENhc2UsIFBhcmVudENoaWxkVGVzdCB0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZG9GdWxsc2NyZWVuVGVzdCh0ZXN0Q2FzZSwgdCk7CisgICAgICAgIGRvRG9ja2VkVGVzdCh0ZXN0Q2FzZSwgdCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnJhbWV3b3JrL2Jhc2Uvd2luZG93bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvd20vVGVzdExvZ0NsaWVudC5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2Uvd2luZG93bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvd20vVGVzdExvZ0NsaWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNWVmMDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mcmFtZXdvcmsvYmFzZS93aW5kb3dtYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci93bS9UZXN0TG9nQ2xpZW50LmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIud207CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworCisvKioKKyAqIEEgY2xhc3MgdGhhdCBzZW5kcyBsb2cgZGF0YSB0byB7QGxpbmsgVGVzdExvZ1NlcnZpY2V9LgorICovCitwdWJsaWMgY2xhc3MgVGVzdExvZ0NsaWVudCB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9MT0dfVEFHID0gImxvZ3RhZyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfS0VZID0gImtleSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfVkFMVUUgPSAidmFsdWUiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfTE9HR0VSX1BBQ0tBR0VfTkFNRSA9ICJhbmRyb2lkLnNlcnZlci5jdHMud20iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0xPR0dFUl9TRVJWSUNFX05BTUUgPSAiYW5kcm9pZC5zZXJ2ZXIud20uVGVzdExvZ1NlcnZpY2UiOworCisgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Mb2dUYWc7CisKKyAgICBwdWJsaWMgVGVzdExvZ0NsaWVudChDb250ZXh0IGNvbnRleHQsIFN0cmluZyBsb2d0YWcpIHsKKyAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICBtTG9nVGFnID0gbG9ndGFnOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlY29yZChTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoKTsKKyAgICAgICAgaW50ZW50LnNldENvbXBvbmVudCgKKyAgICAgICAgICAgICAgICBuZXcgQ29tcG9uZW50TmFtZShURVNUX0xPR0dFUl9QQUNLQUdFX05BTUUsIFRFU1RfTE9HR0VSX1NFUlZJQ0VfTkFNRSkpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoRVhUUkFfTE9HX1RBRywgbUxvZ1RhZyk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShFWFRSQV9LRVksIGtleSk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShFWFRSQV9WQUxVRSwgdmFsdWUpOworICAgICAgICBtQ29udGV4dC5zdGFydFNlcnZpY2UoaW50ZW50KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9mcmFtZXdvcmsvYmFzZS93aW5kb3dtYW5hZ2VyL3NyYy9hbmRyb2lkL3NlcnZlci93bS9UZXN0TG9nU2VydmljZS5qYXZhIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2Uvd2luZG93bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvd20vVGVzdExvZ1NlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmQ1MDk5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnJhbWV3b3JrL2Jhc2Uvd2luZG93bWFuYWdlci9zcmMvYW5kcm9pZC9zZXJ2ZXIvd20vVGVzdExvZ1NlcnZpY2UuamF2YQpAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIud207CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5TZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworLyoqCisgKiAgQSBzZXJ2aWNlIGNvbGxlY3RpbmcgZGF0YSBmcm9tIG90aGVyIGFwcHMgdXNlZCBieSBhIHRlc3QuCisgKgorICogIFVzZSB7QGxpbmsgVGVzdExvZ0NsaWVudH0gdG8gc2VuZCBkYXRhIHRvIHRoaXMgc2VydmljZS4KKyAqLworcHVibGljIGNsYXNzIFRlc3RMb2dTZXJ2aWNlIGV4dGVuZHMgU2VydmljZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJUZXN0TG9nU2VydmljZSI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgbUxvY2sgPSBuZXcgT2JqZWN0KCk7CisKKyAgICBzdGF0aWMgY2xhc3MgQ2xpZW50Q2hhbm5lbCB7CisgICAgICAgIGZpbmFsIFN0cmluZyBtU3RvcEtleTsKKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbUxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IG1SZXN1bHRzID0gbmV3IEhhc2hNYXA8PigpOworCisgICAgICAgIENsaWVudENoYW5uZWwoU3RyaW5nIHN0b3BLZXkpIHsKKyAgICAgICAgICAgIG1TdG9wS2V5ID0gc3RvcEtleTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIENsaWVudENoYW5uZWw+IG1DaGFubmVscyA9IG5ldyBIYXNoTWFwPD4oKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJQmluZGVyIG9uQmluZChJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgb25TdGFydENvbW1hbmQoSW50ZW50IGludGVudCwgaW50IGZsYWdzLCBpbnQgc3RhcnRJZCkgeworICAgICAgICByZWNvcmQoaW50ZW50LmdldFN0cmluZ0V4dHJhKFRlc3RMb2dDbGllbnQuRVhUUkFfTE9HX1RBRyksCisgICAgICAgICAgICAgICAgaW50ZW50LmdldFN0cmluZ0V4dHJhKFRlc3RMb2dDbGllbnQuRVhUUkFfS0VZKSwKKyAgICAgICAgICAgICAgICBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoVGVzdExvZ0NsaWVudC5FWFRSQV9WQUxVRSkpOworICAgICAgICByZXR1cm4gU1RBUlRfTk9UX1NUSUNLWTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmVwYXJlIHRvIHJlY2VpdmUgcmVzdWx0cyBmcm9tIGEgY2xpZW50IHdpdGggYSBzcGVjaWZpZWQgdGFnLgorICAgICAqCisgICAgICogQHBhcmFtIGxvZ3RhZyBVbmlxdWUgdGFnIGZvciB0aGUgY2xpZW50LgorICAgICAqIEBwYXJhbSBzdG9wS2V5IFRoZSBrZXkgdGhhdCBzaWduYWxzIHRoYXQgdGhlIGNsaWVudCBoYXMgY29tcGxldGVkIGFsbCByZXF1aXJlZCBhY3Rpb25zLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlckNsaWVudChTdHJpbmcgbG9ndGFnLCBTdHJpbmcgc3RvcEtleSkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBpZiAobUNoYW5uZWxzLmNvbnRhaW5zS2V5KGxvZ3RhZykpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGxvZ3RhZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ2hhbm5lbHMucHV0KGxvZ3RhZywgbmV3IENsaWVudENoYW5uZWwoc3RvcEtleSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogV2FpdCBmb3IgdGhlIGNsaWVudCB0byBjb21wbGV0ZSBhbGwgcmVxdWlyZWQgYWN0aW9ucyBhbmQgcmV0dXJuIHRoZSByZXN1bHRzLgorICAgICAqCisgICAgICogQHBhcmFtIGxvZ3RhZyBVbmlxdWUgdGFnIGZvciB0aGUgY2xpZW50LgorICAgICAqIEBwYXJhbSB0aW1lb3V0TXMgTGF0Y2ggdGltZW91dCBpbiBtcy4KKyAgICAgKiBAcmV0dXJuIFRoZSBtYXAgb2YgcmVzdWx0cyBmcm9tIHRoZSBjbGllbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0UmVzdWx0c0ZvckNsaWVudChTdHJpbmcgbG9ndGFnLCBpbnQgdGltZW91dE1zKSB7CisgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcmVzdWx0ID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBDb3VudERvd25MYXRjaCBsYXRjaDsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgaWYgKCFtQ2hhbm5lbHMuY29udGFpbnNLZXkobG9ndGFnKSkgeworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsYXRjaCA9IG1DaGFubmVscy5nZXQobG9ndGFnKS5tTGF0Y2g7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxhdGNoLmF3YWl0KHRpbWVvdXRNcywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgIH0KKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IGUgOiBtQ2hhbm5lbHMuZ2V0KGxvZ3RhZykubVJlc3VsdHMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgICAgIHJlc3VsdC5wdXQoZS5nZXRLZXkoKSwgZS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVjb3JkKFN0cmluZyBsb2d0YWcsIFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBpZiAoIW1DaGFubmVscy5jb250YWluc0tleShsb2d0YWcpKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiVW5leHBlY3RlZCBsb2d0YWc6ICIgKyBsb2d0YWcpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENsaWVudENoYW5uZWwgY2hhbm5lbCA9IG1DaGFubmVscy5nZXQobG9ndGFnKTsKKyAgICAgICAgICAgIGNoYW5uZWwubVJlc3VsdHMucHV0KGtleSwgdmFsdWUpOworICAgICAgICAgICAgaWYgKGtleS5lcXVhbHMoY2hhbm5lbC5tU3RvcEtleSkpIHsKKyAgICAgICAgICAgICAgICBjaGFubmVsLm1MYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2lucHV0bWV0aG9kL0FuZHJvaWQubWsgYi90ZXN0cy9pbnB1dG1ldGhvZC9BbmRyb2lkLm1rCmluZGV4IDBjMWVkNWYuLjEzMTU4NDQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2lucHV0bWV0aG9kL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvaW5wdXRtZXRob2QvQW5kcm9pZC5tawpAQCAtMjIsMjEgKzIyLDI4IEBACiBMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQogCiAjIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0Ci1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMgY3RzX2luc3RhbnQKIAogTE9DQUxfTVVMVElMSUIgOj0gYm90aAogCi1MT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzCiAKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCi0gICAgYW5kcm9pZC1zdXBwb3J0LXRlc3QgXAotICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwgXAotICAgIGN0c3Rlc3RydW5uZXIKKyAgICBhbmRyb2lkeC50ZXN0LnJ1bGVzIFwKKyAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBcCisgICAgY3RzdGVzdHJ1bm5lci1heHQgXAorICAgIEN0c01vY2tJbnB1dE1ldGhvZAogCi1MT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKSBcCisgICAgJChjYWxsIGFsbC1JYWlkbC1maWxlcy11bmRlciwgc3JjKQorCitMT0NBTF9BSURMX0lOQ0xVREVTICs9ICQoTE9DQUxfUEFUSCkvc3JjCiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNJbnB1dE1ldGhvZFRlc3RDYXNlcwogCitMT0NBTF9TREtfVkVSU0lPTiA6PSB0ZXN0X2N1cnJlbnQKKwogaW5jbHVkZSAkKEJVSUxEX0NUU19QQUNLQUdFKQogCiBpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCmRpZmYgLS1naXQgYS90ZXN0cy9pbnB1dG1ldGhvZC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvaW5wdXRtZXRob2QvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCAxMWYwMDhkLi42N2YxOThjIDEwMDY0NAotLS0gYS90ZXN0cy9pbnB1dG1ldGhvZC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL2lucHV0bWV0aG9kL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTE2LDcgKzE2LDggQEAKIC0tPgogCiA8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHBhY2thZ2U9ImFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5jdHMiPgorICAgIHBhY2thZ2U9ImFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5jdHMiCisgICAgYW5kcm9pZDp0YXJnZXRTYW5kYm94VmVyc2lvbj0iMiI+CiAKICAgICA8YXBwbGljYXRpb24KICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ3RzSW5wdXRNZXRob2RUZXN0Q2FzZXMiCkBAIC0zNCwxMCArMzUsNTQgQEAKICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KICAgICAgICAgPC9hY3Rpdml0eT4KIAorICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLmN0cy51dGlsLlRlc3RBY3Rpdml0eSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IlRlc3RBY3Rpdml0eSI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuRlJBTUVXT1JLX0lOU1RSVU1FTlRBVElPTl9URVNUIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuY3RzLnV0aWwuU3RhdGVJbml0aWFsaXplQWN0aXZpdHkiCisgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJTdGF0ZUluaXRpYWxpemVBY3Rpdml0eSI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuRlJBTUVXT1JLX0lOU1RSVU1FTlRBVElPTl9URVNUIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDwhLS0gSW4gb3JkZXIgdG8gdGVzdCB0eXBpY2FsIHVzZSBjYXNlcywgbGV0IHRoaXMgTW9ja0lNRSBydW4gaW4gYSBzZXBhcmF0ZSBwcm9jZXNzIC0tPgorICAgICAgICA8IS0tCisgICAgICAgICAgVE9ETzogTW92ZSB0aGlzIHNldmljZSBkZWZpbml0aW9uIGludG8gTW9ja0lNRSBwYWNrYWdlIGFuZCBsZXQgdGhlIGJ1aWxkIHN5c3RlbSB0byBtZXJnZQorICAgICAgICAgIG1hbmlmZXN0cyBvbmNlIHNvb25nIHN1cHBvcnRzIHRvIGJ1aWxkIGFhciBwYWNrYWdlLgorICAgICAgICAtLT4KKyAgICAgICAgPHNlcnZpY2UKKyAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuY3RzLm1vY2tpbWUuTW9ja0ltZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Ik1vY2sgSU1FIgorICAgICAgICAgICAgYW5kcm9pZDpwZXJtaXNzaW9uPSJhbmRyb2lkLnBlcm1pc3Npb24uQklORF9JTlBVVF9NRVRIT0QiCisgICAgICAgICAgICBhbmRyb2lkOnByb2Nlc3M9Ijptb2NraW1lIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnZpZXcuSW5wdXRNZXRob2QiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgICAgICA8bWV0YS1kYXRhCisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnZpZXcuaW0iCisgICAgICAgICAgICAgICAgYW5kcm9pZDpyZXNvdXJjZT0iQHhtbC9tZXRob2QiIC8+CisgICAgICAgIDwvc2VydmljZT4KKworICAgICAgICA8IS0tCisgICAgICAgICAgSW4gb3JkZXIgdG8gdGVzdCB3aW5kb3ctZm9jdXMtc3RlYWxpbmcgZnJvbSBvdGhlciBwcm9jZXNzLCBsZXQgdGhpcyBzZXJ2aWNlIHJ1biBpbiBhCisgICAgICAgICAgc2VwYXJhdGUgcHJvY2Vzcy4gLS0+CisgICAgICAgIDxzZXJ2aWNlIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLmN0cy51dGlsLldpbmRvd0ZvY3VzU3RlYWxlclNlcnZpY2UiCisgICAgICAgICAgICBhbmRyb2lkOnByb2Nlc3M9Ijpmb2N1c3N0ZWFsZXIiCisgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJmYWxzZSI+CisgICAgICAgIDwvc2VydmljZT4KKwogICAgIDwvYXBwbGljYXRpb24+CiAKICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBvZiBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLmN0cyI+CiAgICAgICAgIDxtZXRhLWRhdGEKZGlmZiAtLWdpdCBhL3Rlc3RzL2lucHV0bWV0aG9kL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL2lucHV0bWV0aG9kL0FuZHJvaWRUZXN0LnhtbAppbmRleCBiNjk2YTUyLi5mNzQ5MDY1IDEwMDY0NAotLS0gYS90ZXN0cy9pbnB1dG1ldGhvZC9BbmRyb2lkVGVzdC54bWwKKysrIGIvdGVzdHMvaW5wdXRtZXRob2QvQW5kcm9pZFRlc3QueG1sCkBAIC0xNiwxMSArMTYsMjIgQEAKIC0tPgogCiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgSW5wdXRNZXRob2QgdGVzdCBjYXNlcyI+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJmcmFtZXdvcmsiIC8+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KKyAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImlucHV0bWV0aG9kIiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDwhLS0KKyAgICAgICAgICAgIFRPRE8oeXVrYXdhKTogY29tZSB1cCB3aXRoIGEgcHJvcGVyIHdheSB0byB0YWtlIGNhcmUgb2YgZGV2aWNlcyB0aGF0IGRvIG5vdCBzdXBwb3J0CisgICAgICAgICAgICBpbnN0YWxsYWJsZSBJTUVzLiAgSWRlYWxseSB0YXJnZXRfcHJlcGFyZXIgc2hvdWxkIGhhdmUgYW4gb3B0aW9uIHRvIGFubm90YXRlIHJlcXVpcmVkCisgICAgICAgICAgICBmZWF0dXJlcywgZS5nLiBhbmRyb2lkLnNvZnR3YXJlLmlucHV0X21ldGhvZHMgc28gdGhhdCB3ZSBjYW4gY29uZGl0aW9uYWxseSBpbnN0YWxsIEFQS3MKKyAgICAgICAgICAgIGJhc2VkIG9uIHRoZSBmZWF0dXJlIHN1cHBvcnRlZCBpbiB0aGUgdGFyZ2V0IGRldmljZS4KKyAgICAgICAgLS0+CiAgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJDdHNJbnB1dE1ldGhvZFRlc3RDYXNlcy5hcGsiIC8+CiAgICAgPC90YXJnZXRfcHJlcGFyZXI+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5SdW5Db21tYW5kVGFyZ2V0UHJlcGFyZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bi1jb21tYW5kIiB2YWx1ZT0iY21kIGlucHV0X21ldGhvZCBzZXQtYmluZC1pbnN0YW50LXNlcnZpY2UtYWxsb3dlZCB0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlYXJkb3duLWNvbW1hbmQiIHZhbHVlPSJjbWQgaW5wdXRfbWV0aG9kIHNldC1iaW5kLWluc3RhbnQtc2VydmljZS1hbGxvd2VkIGZhbHNlIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgogICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5BbmRyb2lkSlVuaXRUZXN0IiA+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icGFja2FnZSIgdmFsdWU9ImFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5jdHMiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icnVudGltZS1oaW50IiB2YWx1ZT0iMW0wcyIgLz4KZGlmZiAtLWdpdCBhL3Rlc3RzL2lucHV0bWV0aG9kL21vY2tpbWUvQW5kcm9pZC5tayBiL3Rlc3RzL2lucHV0bWV0aG9kL21vY2tpbWUvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjY1YjM0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW5wdXRtZXRob2QvbW9ja2ltZS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzAgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFIDo9IEN0c01vY2tJbnB1dE1ldGhvZAorTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKKworTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBqdW5pdAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKKyAgIGFuZHJvaWR4LmFubm90YXRpb25fYW5ub3RhdGlvbiBcCisgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dAorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0pBVkFfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2lucHV0bWV0aG9kL21vY2tpbWUvc3JjL2NvbS9hbmRyb2lkL2N0cy9tb2NraW1lL0ltZUNvbW1hbmQuamF2YSBiL3Rlc3RzL2lucHV0bWV0aG9kL21vY2tpbWUvc3JjL2NvbS9hbmRyb2lkL2N0cy9tb2NraW1lL0ltZUNvbW1hbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDU1OWI2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW5wdXRtZXRob2QvbW9ja2ltZS9zcmMvY29tL2FuZHJvaWQvY3RzL21vY2tpbWUvSW1lQ29tbWFuZC5qYXZhCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5tb2NraW1lOworCitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5Ob25OdWxsOworCitwdWJsaWMgZmluYWwgY2xhc3MgSW1lQ29tbWFuZCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9LRVkgPSAibmFtZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0tFWSA9ICJpZCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERJU1BBVENIX1RPX01BSU5fVEhSRUFEX0tFWSA9ICJkaXNwYXRjaFRvTWFpblRocmVhZCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0tFWSA9ICJleHRyYSI7CisKKyAgICBATm9uTnVsbAorICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1OYW1lOworICAgIHByaXZhdGUgZmluYWwgbG9uZyBtSWQ7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1EaXNwYXRjaFRvTWFpblRocmVhZDsKKyAgICBATm9uTnVsbAorICAgIHByaXZhdGUgZmluYWwgQnVuZGxlIG1FeHRyYXM7CisKKyAgICBJbWVDb21tYW5kKEBOb25OdWxsIFN0cmluZyBuYW1lLCBsb25nIGlkLCBib29sZWFuIGRpc3BhdGNoVG9NYWluVGhyZWFkLAorICAgICAgICAgICAgQE5vbk51bGwgQnVuZGxlIGV4dHJhcykgeworICAgICAgICBtTmFtZSA9IG5hbWU7CisgICAgICAgIG1JZCA9IGlkOworICAgICAgICBtRGlzcGF0Y2hUb01haW5UaHJlYWQgPSBkaXNwYXRjaFRvTWFpblRocmVhZDsKKyAgICAgICAgbUV4dHJhcyA9IGV4dHJhczsKKyAgICB9CisKKyAgICBwcml2YXRlIEltZUNvbW1hbmQoQE5vbk51bGwgQnVuZGxlIGJ1bmRsZSkgeworICAgICAgICBtTmFtZSA9IGJ1bmRsZS5nZXRTdHJpbmcoTkFNRV9LRVkpOworICAgICAgICBtSWQgPSBidW5kbGUuZ2V0TG9uZyhJRF9LRVkpOworICAgICAgICBtRGlzcGF0Y2hUb01haW5UaHJlYWQgPSBidW5kbGUuZ2V0Qm9vbGVhbihESVNQQVRDSF9UT19NQUlOX1RIUkVBRF9LRVkpOworICAgICAgICBtRXh0cmFzID0gYnVuZGxlLmdldFBhcmNlbGFibGUoRVhUUkFfS0VZKTsKKyAgICB9CisKKyAgICBzdGF0aWMgSW1lQ29tbWFuZCBmcm9tQnVuZGxlKEBOb25OdWxsIEJ1bmRsZSBidW5kbGUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJbWVDb21tYW5kKGJ1bmRsZSk7CisgICAgfQorCisgICAgQnVuZGxlIHRvQnVuZGxlKCkgeworICAgICAgICBmaW5hbCBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOworICAgICAgICBidW5kbGUucHV0U3RyaW5nKE5BTUVfS0VZLCBtTmFtZSk7CisgICAgICAgIGJ1bmRsZS5wdXRMb25nKElEX0tFWSwgbUlkKTsKKyAgICAgICAgYnVuZGxlLnB1dEJvb2xlYW4oRElTUEFUQ0hfVE9fTUFJTl9USFJFQURfS0VZLCBtRGlzcGF0Y2hUb01haW5UaHJlYWQpOworICAgICAgICBidW5kbGUucHV0UGFyY2VsYWJsZShFWFRSQV9LRVksIG1FeHRyYXMpOworICAgICAgICByZXR1cm4gYnVuZGxlOworICAgIH0KKworICAgIEBOb25OdWxsCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbU5hbWU7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0SWQoKSB7CisgICAgICAgIHJldHVybiBtSWQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gc2hvdWxkRGlzcGF0Y2hUb01haW5UaHJlYWQoKSB7CisgICAgICAgIHJldHVybiBtRGlzcGF0Y2hUb01haW5UaHJlYWQ7CisgICAgfQorCisgICAgQE5vbk51bGwKKyAgICBwdWJsaWMgQnVuZGxlIGdldEV4dHJhcygpIHsKKyAgICAgICAgcmV0dXJuIG1FeHRyYXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW5wdXRtZXRob2QvbW9ja2ltZS9zcmMvY29tL2FuZHJvaWQvY3RzL21vY2tpbWUvSW1lRXZlbnQuamF2YSBiL3Rlc3RzL2lucHV0bWV0aG9kL21vY2tpbWUvc3JjL2NvbS9hbmRyb2lkL2N0cy9tb2NraW1lL0ltZUV2ZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ3MzJhMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2lucHV0bWV0aG9kL21vY2tpbWUvc3JjL2NvbS9hbmRyb2lkL2N0cy9tb2NraW1lL0ltZUV2ZW50LmphdmEKQEAgLTAsMCArMSwyOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5tb2NraW1lOworCitpbXBvcnQgYW5kcm9pZC5pbnB1dG1ldGhvZHNlcnZpY2UuQWJzdHJhY3RJbnB1dE1ldGhvZFNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5Ob25OdWxsOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTnVsbGFibGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKKy8qKgorICogQW4gaW1tdXRhYmxlIG9iamVjdCB0aGF0IHN0b3JlcyBldmVudCBoYXBwZW5lZCBpbiB0aGUge0BsaW5rIE1vY2tJbWV9LgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgSW1lRXZlbnQgeworCisgICAgcHJpdmF0ZSBlbnVtIFJldHVyblR5cGUgeworICAgICAgICBOdWxsLAorICAgICAgICBLbm93blVuc3VwcG9ydGVkVHlwZSwKKyAgICAgICAgQm9vbGVhbiwKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBSZXR1cm5UeXBlIGdldFJldHVyblR5cGVGcm9tT2JqZWN0KEBOdWxsYWJsZSBPYmplY3Qgb2JqZWN0KSB7CisgICAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIFJldHVyblR5cGUuTnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgQWJzdHJhY3RJbnB1dE1ldGhvZFNlcnZpY2UuQWJzdHJhY3RJbnB1dE1ldGhvZEltcGwpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXR1cm5UeXBlLktub3duVW5zdXBwb3J0ZWRUeXBlOworICAgICAgICB9CisgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBWaWV3KSB7CisgICAgICAgICAgICByZXR1cm4gUmV0dXJuVHlwZS5Lbm93blVuc3VwcG9ydGVkVHlwZTsKKyAgICAgICAgfQorICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgQm9vbGVhbikgeworICAgICAgICAgICAgcmV0dXJuIFJldHVyblR5cGUuQm9vbGVhbjsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlVuc3VwcG9ydGVkIHJldHVybiB0eXBlPSIgKyBvYmplY3QpOworICAgIH0KKworICAgIEltZUV2ZW50KEBOb25OdWxsIFN0cmluZyBldmVudE5hbWUsIGludCBuZXN0TGV2ZWwsIEBOb25OdWxsIFN0cmluZyB0aHJlYWROYW1lLCBpbnQgdGhyZWFkSWQsCisgICAgICAgICAgICBib29sZWFuIGlzTWFpblRocmVhZCwgbG9uZyBlbnRlclRpbWVzdGFtcCwgbG9uZyBleGl0VGltZXN0YW1wLCBsb25nIGVudGVyV2FsbFRpbWUsCisgICAgICAgICAgICBsb25nIGV4aXRXYWxsVGltZSwgQE5vbk51bGwgSW1lU3RhdGUgZW50ZXJTdGF0ZSwgQE51bGxhYmxlIEltZVN0YXRlIGV4aXRTdGF0ZSwKKyAgICAgICAgICAgIEBOb25OdWxsIEJ1bmRsZSBhcmd1bWVudHMsIEBOdWxsYWJsZSBPYmplY3QgcmV0dXJuVmFsdWUpIHsKKyAgICAgICAgdGhpcyhldmVudE5hbWUsIG5lc3RMZXZlbCwgdGhyZWFkTmFtZSwgdGhyZWFkSWQsIGlzTWFpblRocmVhZCwgZW50ZXJUaW1lc3RhbXAsCisgICAgICAgICAgICAgICAgZXhpdFRpbWVzdGFtcCwgZW50ZXJXYWxsVGltZSwgZXhpdFdhbGxUaW1lLCBlbnRlclN0YXRlLCBleGl0U3RhdGUsIGFyZ3VtZW50cywKKyAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSwgZ2V0UmV0dXJuVHlwZUZyb21PYmplY3QocmV0dXJuVmFsdWUpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEltZUV2ZW50KEBOb25OdWxsIFN0cmluZyBldmVudE5hbWUsIGludCBuZXN0TGV2ZWwsIEBOb25OdWxsIFN0cmluZyB0aHJlYWROYW1lLAorICAgICAgICAgICAgaW50IHRocmVhZElkLCBib29sZWFuIGlzTWFpblRocmVhZCwgbG9uZyBlbnRlclRpbWVzdGFtcCwgbG9uZyBleGl0VGltZXN0YW1wLAorICAgICAgICAgICAgbG9uZyBlbnRlcldhbGxUaW1lLCBsb25nIGV4aXRXYWxsVGltZSwgQE5vbk51bGwgSW1lU3RhdGUgZW50ZXJTdGF0ZSwKKyAgICAgICAgICAgIEBOdWxsYWJsZSBJbWVTdGF0ZSBleGl0U3RhdGUsIEBOb25OdWxsIEJ1bmRsZSBhcmd1bWVudHMsIEBOdWxsYWJsZSBPYmplY3QgcmV0dXJuVmFsdWUsCisgICAgICAgICAgICBATm9uTnVsbCBSZXR1cm5UeXBlIHJldHVyblR5cGUpIHsKKyAgICAgICAgbUV2ZW50TmFtZSA9IGV2ZW50TmFtZTsKKyAgICAgICAgbU5lc3RMZXZlbCA9IG5lc3RMZXZlbDsKKyAgICAgICAgbVRocmVhZE5hbWUgPSB0aHJlYWROYW1lOworICAgICAgICBtVGhyZWFkSWQgPSB0aHJlYWRJZDsKKyAgICAgICAgbUlzTWFpblRocmVhZCA9IGlzTWFpblRocmVhZDsKKyAgICAgICAgbUVudGVyVGltZXN0YW1wID0gZW50ZXJUaW1lc3RhbXA7CisgICAgICAgIG1FeGl0VGltZXN0YW1wID0gZXhpdFRpbWVzdGFtcDsKKyAgICAgICAgbUVudGVyV2FsbFRpbWUgPSBlbnRlcldhbGxUaW1lOworICAgICAgICBtRXhpdFdhbGxUaW1lID0gZXhpdFdhbGxUaW1lOworICAgICAgICBtRW50ZXJTdGF0ZSA9IGVudGVyU3RhdGU7CisgICAgICAgIG1FeGl0U3RhdGUgPSBleGl0U3RhdGU7CisgICAgICAgIG1Bcmd1bWVudHMgPSBhcmd1bWVudHM7CisgICAgICAgIG1SZXR1cm5WYWx1ZSA9IHJldHVyblZhbHVlOworICAgICAgICBtUmV0dXJuVHlwZSA9IHJldHVyblR5cGU7CisgICAgfQorCisgICAgQE5vbk51bGwKKyAgICBCdW5kbGUgdG9CdW5kbGUoKSB7CisgICAgICAgIGZpbmFsIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoIm1FdmVudE5hbWUiLCBtRXZlbnROYW1lKTsKKyAgICAgICAgYnVuZGxlLnB1dEludCgibU5lc3RMZXZlbCIsIG1OZXN0TGV2ZWwpOworICAgICAgICBidW5kbGUucHV0U3RyaW5nKCJtVGhyZWFkTmFtZSIsIG1UaHJlYWROYW1lKTsKKyAgICAgICAgYnVuZGxlLnB1dEludCgibVRocmVhZElkIiwgbVRocmVhZElkKTsKKyAgICAgICAgYnVuZGxlLnB1dEJvb2xlYW4oIm1Jc01haW5UaHJlYWQiLCBtSXNNYWluVGhyZWFkKTsKKyAgICAgICAgYnVuZGxlLnB1dExvbmcoIm1FbnRlclRpbWVzdGFtcCIsIG1FbnRlclRpbWVzdGFtcCk7CisgICAgICAgIGJ1bmRsZS5wdXRMb25nKCJtRXhpdFRpbWVzdGFtcCIsIG1FeGl0VGltZXN0YW1wKTsKKyAgICAgICAgYnVuZGxlLnB1dExvbmcoIm1FbnRlcldhbGxUaW1lIiwgbUVudGVyV2FsbFRpbWUpOworICAgICAgICBidW5kbGUucHV0TG9uZygibUV4aXRXYWxsVGltZSIsIG1FeGl0V2FsbFRpbWUpOworICAgICAgICBidW5kbGUucHV0QnVuZGxlKCJtRW50ZXJTdGF0ZSIsIG1FbnRlclN0YXRlLnRvQnVuZGxlKCkpOworICAgICAgICBidW5kbGUucHV0QnVuZGxlKCJtRXhpdFN0YXRlIiwgbUV4aXRTdGF0ZSAhPSBudWxsID8gbUV4aXRTdGF0ZS50b0J1bmRsZSgpIDogbnVsbCk7CisgICAgICAgIGJ1bmRsZS5wdXRCdW5kbGUoIm1Bcmd1bWVudHMiLCBtQXJndW1lbnRzKTsKKyAgICAgICAgYnVuZGxlLnB1dFN0cmluZygibVJldHVyblR5cGUiLCBtUmV0dXJuVHlwZS5uYW1lKCkpOworICAgICAgICBzd2l0Y2ggKG1SZXR1cm5UeXBlKSB7CisgICAgICAgICAgICBjYXNlIE51bGw6CisgICAgICAgICAgICBjYXNlIEtub3duVW5zdXBwb3J0ZWRUeXBlOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCb29sZWFuOgorICAgICAgICAgICAgICAgIGJ1bmRsZS5wdXRCb29sZWFuKCJtUmV0dXJuVmFsdWUiLCBnZXRSZXR1cm5Cb29sZWFuVmFsdWUoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgdHlwZT0iICsgbVJldHVyblR5cGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidW5kbGU7CisgICAgfQorCisgICAgQE5vbk51bGwKKyAgICBzdGF0aWMgSW1lRXZlbnQgZnJvbUJ1bmRsZShATm9uTnVsbCBCdW5kbGUgYnVuZGxlKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBldmVudE5hbWUgPSBidW5kbGUuZ2V0U3RyaW5nKCJtRXZlbnROYW1lIik7CisgICAgICAgIGZpbmFsIGludCBuZXN0TGV2ZWwgPSBidW5kbGUuZ2V0SW50KCJtTmVzdExldmVsIik7CisgICAgICAgIGZpbmFsIFN0cmluZyB0aHJlYWROYW1lID0gYnVuZGxlLmdldFN0cmluZygibVRocmVhZE5hbWUiKTsKKyAgICAgICAgZmluYWwgaW50IHRocmVhZElkID0gYnVuZGxlLmdldEludCgibVRocmVhZElkIik7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNNYWluVGhyZWFkID0gYnVuZGxlLmdldEJvb2xlYW4oIm1Jc01haW5UaHJlYWQiKTsKKyAgICAgICAgZmluYWwgbG9uZyBlbnRlclRpbWVzdGFtcCA9IGJ1bmRsZS5nZXRMb25nKCJtRW50ZXJUaW1lc3RhbXAiKTsKKyAgICAgICAgZmluYWwgbG9uZyBleGl0VGltZXN0YW1wID0gYnVuZGxlLmdldExvbmcoIm1FeGl0VGltZXN0YW1wIik7CisgICAgICAgIGZpbmFsIGxvbmcgZW50ZXJXYWxsVGltZSA9IGJ1bmRsZS5nZXRMb25nKCJtRW50ZXJXYWxsVGltZSIpOworICAgICAgICBmaW5hbCBsb25nIGV4aXRXYWxsVGltZSA9IGJ1bmRsZS5nZXRMb25nKCJtRXhpdFdhbGxUaW1lIik7CisgICAgICAgIGZpbmFsIEltZVN0YXRlIGVudGVyU3RhdGUgPSBJbWVTdGF0ZS5mcm9tQnVuZGxlKGJ1bmRsZS5nZXRCdW5kbGUoIm1FbnRlclN0YXRlIikpOworICAgICAgICBmaW5hbCBJbWVTdGF0ZSBleGl0U3RhdGUgPSBJbWVTdGF0ZS5mcm9tQnVuZGxlKGJ1bmRsZS5nZXRCdW5kbGUoIm1FeGl0U3RhdGUiKSk7CisgICAgICAgIGZpbmFsIEJ1bmRsZSBhcmd1bWVudHMgPSBidW5kbGUuZ2V0QnVuZGxlKCJtQXJndW1lbnRzIik7CisgICAgICAgIGZpbmFsIE9iamVjdCByZXN1bHQ7CisgICAgICAgIGZpbmFsIFJldHVyblR5cGUgcmV0dXJuVHlwZSA9IFJldHVyblR5cGUudmFsdWVPZihidW5kbGUuZ2V0U3RyaW5nKCJtUmV0dXJuVHlwZSIpKTsKKyAgICAgICAgc3dpdGNoIChyZXR1cm5UeXBlKSB7CisgICAgICAgICAgICBjYXNlIE51bGw6CisgICAgICAgICAgICBjYXNlIEtub3duVW5zdXBwb3J0ZWRUeXBlOgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IG51bGw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJvb2xlYW46CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gYnVuZGxlLmdldEJvb2xlYW4oIm1SZXR1cm5WYWx1ZSIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlVuc3VwcG9ydGVkIHR5cGU9IiArIHJldHVyblR5cGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgSW1lRXZlbnQoZXZlbnROYW1lLCBuZXN0TGV2ZWwsIHRocmVhZE5hbWUsCisgICAgICAgICAgICAgICAgdGhyZWFkSWQsIGlzTWFpblRocmVhZCwgZW50ZXJUaW1lc3RhbXAsIGV4aXRUaW1lc3RhbXAsIGVudGVyV2FsbFRpbWUsIGV4aXRXYWxsVGltZSwKKyAgICAgICAgICAgICAgICBlbnRlclN0YXRlLCBleGl0U3RhdGUsIGFyZ3VtZW50cywgcmVzdWx0LCByZXR1cm5UeXBlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHRoYXQgcmVwcmVzZW50cyB0aGUgdHlwZSBvZiB0aGlzIGV2ZW50LgorICAgICAqCisgICAgICogPHA+RXhhbXBsZXM6ICZxdW90O29uQ3JlYXRlJnF1b3Q7LCAmcXVvdDtvblN0YXJ0SW5wdXQmcXVvdDssIC4uLjwvcD4KKyAgICAgKgorICAgICAqIDxwPlRPRE86IFVzZSBlbnVtIHR5cGUgb3Igc29tZXRoaW5nIGxpa2UgdGhhdCBpbnN0ZWFkIG9mIHJhdyBTdHJpbmcgdHlwZS48L3A+CisgICAgICogQHJldHVybiBBIHN0cmluZyB0aGF0IHJlcHJlc2VudHMgdGhlIHR5cGUgb2YgdGhpcyBldmVudC4KKyAgICAgKi8KKyAgICBATm9uTnVsbAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXZlbnROYW1lKCkgeworICAgICAgICByZXR1cm4gbUV2ZW50TmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuZXN0IGxldmVsIG9mIHRoaXMgZXZlbnQuCisgICAgICoKKyAgICAgKiA8cD5Gb3IgaW5zdGFuY2UsIHdoZW4gJnF1b3Q7c2hvd1NvZnRJbnB1dCZxdW90OyBpbnRlcm5hbGx5IGNhbGxzCisgICAgICogJnF1b3Q7b25TdGFydElucHV0VmlldyZxdW90OywgdGhlIGV2ZW50IGZvciAmcXVvdDtvblN0YXJ0SW5wdXRWaWV3JnF1b3Q7IGhhcyAxIGxldmVsIGhpZ2hlcgorICAgICAqIG5lc3QgbGV2ZWwgdGhhbiAmcXVvdDtzaG93U29mdElucHV0JnF1b3Q7LjwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE5lc3RMZXZlbCgpIHsKKyAgICAgICAgcmV0dXJuIG1OZXN0TGV2ZWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBOYW1lIG9mIHRoZSB0aHJlYWQsIHdoZXJlIHRoZSBldmVudCB3YXMgY29uc3VtZWQuCisgICAgICovCisgICAgQE5vbk51bGwKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRocmVhZE5hbWUoKSB7CisgICAgICAgIHJldHVybiBtVGhyZWFkTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRocmVhZCBJRCAoVElEKSBvZiB0aGUgdGhyZWFkLCB3aGVyZSB0aGUgZXZlbnQgd2FzIGNvbnN1bWVkLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0VGhyZWFkSWQoKSB7CisgICAgICAgIHJldHVybiBtVGhyZWFkSWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGV2ZW50IHdhcyBiZWluZyBjb25zdW1lZCBpbiB0aGUgbWFpbiB0aHJlYWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNNYWluVGhyZWFkKCkgeworICAgICAgICByZXR1cm4gbUlzTWFpblRocmVhZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIE1vbm90b25pYyB0aW1lIG1lYXN1cmVkIGJ5IHtAbGluayBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrI2VsYXBzZWRSZWFsdGltZU5hbm9zKCl9IHdoZW4KKyAgICAgKiAgICAgICAgIHRoZSBjb3JyZXNwb25kaW5nIGV2ZW50IGhhbmRsZXIgd2FzIGNhbGxlZCBiYWNrLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldEVudGVyVGltZXN0YW1wKCkgeworICAgICAgICByZXR1cm4gbUVudGVyVGltZXN0YW1wOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gTW9ub3RvbmljIHRpbWUgbWVhc3VyZWQgYnkge0BsaW5rIGFuZHJvaWQub3MuU3lzdGVtQ2xvY2sjZWxhcHNlZFJlYWx0aW1lTmFub3MoKX0gd2hlbgorICAgICAqICAgICAgICAgdGhlIGNvcnJlc3BvbmRpbmcgZXZlbnQgaGFuZGxlciBmaW5pc2hlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRFeGl0VGltZXN0YW1wKCkgeworICAgICAgICByZXR1cm4gbUV4aXRUaW1lc3RhbXA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBXYWxsLWNsb2NrIHRpbWUgbWVhc3VyZWQgYnkge0BsaW5rIFN5c3RlbSNjdXJyZW50VGltZU1pbGxpcygpfSB3aGVuIHRoZSBjb3JyZXNwb25kaW5nCisgICAgICogICAgICAgICBldmVudCBoYW5kbGVyIHdhcyBjYWxsZWQgYmFjay4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRFbnRlcldhbGxUaW1lKCkgeworICAgICAgICByZXR1cm4gbUVudGVyV2FsbFRpbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBXYWxsLWNsb2NrIHRpbWUgbWVhc3VyZWQgYnkge0BsaW5rIFN5c3RlbSNjdXJyZW50VGltZU1pbGxpcygpfSB3aGVuIHRoZSBjb3JyZXNwb25kaW5nCisgICAgICogICAgICAgICBldmVudCBoYW5kbGVyIGZpbmlzaGVkLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldEV4aXRXYWxsVGltZSgpIHsKKyAgICAgICAgcmV0dXJuIG1FeGl0V2FsbFRpbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBJTUUgc3RhdGUgc25hcHNob3QgdGFrZW4gd2hlbiB0aGUgY29ycmVzcG9uZGluZyBldmVudCBoYW5kbGVyIHdhcyBjYWxsZWQgYmFjay4KKyAgICAgKi8KKyAgICBATm9uTnVsbAorICAgIHB1YmxpYyBJbWVTdGF0ZSBnZXRFbnRlclN0YXRlKCkgeworICAgICAgICByZXR1cm4gbUVudGVyU3RhdGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBJTUUgc3RhdGUgc25hcHNob3QgdGFrZW4gd2hlbiB0aGUgY29ycmVzcG9uZGluZyBldmVudCBoYW5kbGVyIGZpbmlzaGVkLgorICAgICAqLworICAgIEBOdWxsYWJsZQorICAgIHB1YmxpYyBJbWVTdGF0ZSBnZXRFeGl0U3RhdGUoKSB7CisgICAgICAgIHJldHVybiBtRXhpdFN0YXRlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4ge0BsaW5rIEJ1bmRsZX0gdGhhdCBzdG9yZXMgcGFyYW1ldGVycyBwYXNzZWQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZXZlbnQgaGFuZGxlci4KKyAgICAgKi8KKyAgICBATm9uTnVsbAorICAgIHB1YmxpYyBCdW5kbGUgZ2V0QXJndW1lbnRzKCkgeworICAgICAgICByZXR1cm4gbUFyZ3VtZW50czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHJlc3VsdCB2YWx1ZSBvZiB0aGlzIGV2ZW50LgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIHJldHVybiB2YWx1ZSBpcyB7QGNvZGUgbnVsbH0KKyAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiBpZiB0aGUgcmV0dXJuIHZhbHVlIGlzIG5vbi17QGNvZGUgbnVsbH0gb2JqZWN0IHRoYXQgaXMgZGlmZmVyZW50CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB7QGxpbmsgQm9vbGVhbn0KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRSZXR1cm5Cb29sZWFuVmFsdWUoKSB7CisgICAgICAgIGlmIChtUmV0dXJuVHlwZSA9PSBSZXR1cm5UeXBlLk51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGlmIChtUmV0dXJuVHlwZSAhPSBSZXR1cm5UeXBlLkJvb2xlYW4pIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKEJvb2xlYW4pIG1SZXR1cm5WYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgZXZlbnQgaXMgaXNzdWVkIHdoZW4gdGhlIGV2ZW50IHN0YXJ0cywgbm90IHdoZW4gdGhlIGV2ZW50CisgICAgICogZmluaXNoZXMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNFbnRlckV2ZW50KCkgeworICAgICAgICByZXR1cm4gbUV4aXRTdGF0ZSA9PSBudWxsOworICAgIH0KKworICAgIEBOb25OdWxsCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUV2ZW50TmFtZTsKKyAgICBwcml2YXRlIGZpbmFsIGludCBtTmVzdExldmVsOworICAgIEBOb25OdWxsCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVRocmVhZE5hbWU7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVRocmVhZElkOworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtSXNNYWluVGhyZWFkOworICAgIHByaXZhdGUgZmluYWwgbG9uZyBtRW50ZXJUaW1lc3RhbXA7CisgICAgcHJpdmF0ZSBmaW5hbCBsb25nIG1FeGl0VGltZXN0YW1wOworICAgIHByaXZhdGUgZmluYWwgbG9uZyBtRW50ZXJXYWxsVGltZTsKKyAgICBwcml2YXRlIGZpbmFsIGxvbmcgbUV4aXRXYWxsVGltZTsKKyAgICBATm9uTnVsbAorICAgIHByaXZhdGUgZmluYWwgSW1lU3RhdGUgbUVudGVyU3RhdGU7CisgICAgQE51bGxhYmxlCisgICAgcHJpdmF0ZSBmaW5hbCBJbWVTdGF0ZSBtRXhpdFN0YXRlOworICAgIEBOb25OdWxsCisgICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGUgbUFyZ3VtZW50czsKKyAgICBATnVsbGFibGUKKyAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtUmV0dXJuVmFsdWU7CisgICAgQE5vbk51bGwKKyAgICBwcml2YXRlIGZpbmFsIFJldHVyblR5cGUgbVJldHVyblR5cGU7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnB1dG1ldGhvZC9tb2NraW1lL3NyYy9jb20vYW5kcm9pZC9jdHMvbW9ja2ltZS9JbWVFdmVudFN0cmVhbS5qYXZhIGIvdGVzdHMvaW5wdXRtZXRob2QvbW9ja2ltZS9zcmMvY29tL2FuZHJvaWQvY3RzL21vY2tpbWUvSW1lRXZlbnRTdHJlYW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWQxNzgyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW5wdXRtZXRob2QvbW9ja2ltZS9zcmMvY29tL2FuZHJvaWQvY3RzL21vY2tpbWUvSW1lRXZlbnRTdHJlYW0uamF2YQpAQCAtMCwwICsxLDI1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY3RzLm1vY2tpbWU7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLkludFJhbmdlOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTm9uTnVsbDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuRWRpdG9ySW5mbzsKKworaW1wb3J0IGphdmEudGltZS5JbnN0YW50OworaW1wb3J0IGphdmEudGltZS5ab25lSWQ7CitpbXBvcnQgamF2YS50aW1lLmZvcm1hdC5EYXRlVGltZUZvcm1hdHRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKKworLyoqCisgKiBBIHV0aWxpdHkgY2xhc3MgdGhhdCBwcm92aWRlcyBiYXNpYyBxdWVyeSBvcGVyYXRpb25zIGFuZCB3YWl0IHByaW1pdGl2ZXMgZm9yIGEgc2VyaWVzIG9mCisgKiB7QGxpbmsgSW1lRXZlbnR9IHNlbnQgZnJvbSB0aGUge0BsaW5rIE1vY2tJbWV9LgorICoKKyAqIDxwPkFsbCBwdWJsaWMgbWV0aG9kcyBhcmUgbm90IHRocmVhZC1zYWZlLjwvcD4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEltZUV2ZW50U3RyZWFtIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT05HX0xPTkdfU1BBQ0VTID0gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgRGF0ZVRpbWVGb3JtYXR0ZXIgc1NpbXBsZURhdGVUaW1lRm9ybWF0dGVyID0KKyAgICAgICAgICAgIERhdGVUaW1lRm9ybWF0dGVyLm9mUGF0dGVybigiTU0tZGQgSEg6bW06c3MuU1NTIikud2l0aFpvbmUoWm9uZUlkLnN5c3RlbURlZmF1bHQoKSk7CisKKyAgICBATm9uTnVsbAorICAgIHByaXZhdGUgZmluYWwgU3VwcGxpZXI8SW1lRXZlbnRBcnJheT4gbUV2ZW50U3VwcGxpZXI7CisgICAgcHJpdmF0ZSBpbnQgbUN1cnJlbnRQb3NpdGlvbjsKKworICAgIEltZUV2ZW50U3RyZWFtKEBOb25OdWxsIFN1cHBsaWVyPEltZUV2ZW50QXJyYXk+IHN1cHBsaWVyKSB7CisgICAgICAgIHRoaXMoc3VwcGxpZXIsIDAgLyogcG9zaXRpb24gKi8pOworICAgIH0KKworICAgIHByaXZhdGUgSW1lRXZlbnRTdHJlYW0oQE5vbk51bGwgU3VwcGxpZXI8SW1lRXZlbnRBcnJheT4gc3VwcGxpZXIsIGludCBwb3NpdGlvbikgeworICAgICAgICBtRXZlbnRTdXBwbGllciA9IHN1cHBsaWVyOworICAgICAgICBtQ3VycmVudFBvc2l0aW9uID0gcG9zaXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgY29weSB0aGF0IHN0YXJ0cyBmcm9tIHRoZSBzYW1lIGV2ZW50IHBvc2l0aW9uIG9mIHRoaXMgc3RyZWFtLiBPbmNlIGEgY29weSBpcyBjcmVhdGVkCisgICAgICogZnVydGhlciBldmVudCBwb3NpdGlvbiBjaGFuZ2Ugb24gdGhpcyBzdHJlYW0gd2lsbCBub3QgYWZmZWN0IHRoZSBjb3B5LgorICAgICAqCisgICAgICogQHJldHVybiBBIG5ldyBjb3B5IG9mIHRoaXMgc3RyZWFtCisgICAgICovCisgICAgcHVibGljIEltZUV2ZW50U3RyZWFtIGNvcHkoKSB7CisgICAgICAgIHJldHVybiBuZXcgSW1lRXZlbnRTdHJlYW0obUV2ZW50U3VwcGxpZXIsIG1DdXJyZW50UG9zaXRpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkdmFuY2VzIHRoZSBjdXJyZW50IGV2ZW50IHBvc2l0aW9uIGJ5IHNraXBwaW5nIGV2ZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsZW5ndGggbnVtYmVyIG9mIGV2ZW50cyB0byBiZSBza2lwcGVkCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24ge0Bjb2RlIGxlbmd0aH0gaXMgbmVnYXRpdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBza2lwKEBJbnRSYW5nZShmcm9tID0gMCkgaW50IGxlbmd0aCkgeworICAgICAgICBpZiAobGVuZ3RoIDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibGVuZ3RoIGNhbm5vdCBiZSBuZWdhdGl2ZTogIiArIGxlbmd0aCk7CisgICAgICAgIH0KKyAgICAgICAgbUN1cnJlbnRQb3NpdGlvbiArPSBsZW5ndGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWR2YW5jZXMgdGhlIGN1cnJlbnQgZXZlbnQgcG9zaXRpb24gdG8gdGhlIG5leHQgdG8gdGhlIGxhc3QgcG9zaXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2tpcEFsbCgpIHsKKyAgICAgICAgbUN1cnJlbnRQb3NpdGlvbiA9IG1FdmVudFN1cHBsaWVyLmdldCgpLm1MZW5ndGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCB0aGUgZmlyc3QgZXZlbnQgdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBjb25kaXRpb24gZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbi4KKyAgICAgKgorICAgICAqIDxwPklmIHRoZXJlIGlzIHN1Y2ggYW4gZXZlbnQsIHRoaXMgbWV0aG9kIHJldHVybnMgc3VjaCBhbiBldmVudCB3aXRob3V0IG1vdmluZyB0aGUgY3VycmVudAorICAgICAqIGV2ZW50IHBvc2l0aW9uLjwvcD4KKyAgICAgKgorICAgICAqIDxwPklmIHRoZXJlIGlzIHN1Y2ggYW4gZXZlbnQsIHRoaXMgbWV0aG9kIHJldHVybnMge0BsaW5rIE9wdGlvbmFsI2VtcHR5KCl9IHdpdGhvdXQgbW92aW5nIHRoZQorICAgICAqIGN1cnJlbnQgZXZlbnQgcG9zaXRpb24uPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGNvbmRpdGlvbiB0aGUgZXZlbnQgY29uZGl0aW9uIHRvIGJlIG1hdGNoZWQKKyAgICAgKiBAcmV0dXJuIHtAbGluayBPcHRpb25hbCNlbXB0eSgpfSBpZiB0aGVyZSBpcyBubyBzdWNoIGFuIGV2ZW50LiBPdGhlcndpc2UgdGhlIG1hdGNoZWQgZXZlbnQgaXMKKyAgICAgKiAgICAgICAgIHJldHVybmVkCisgICAgICovCisgICAgQE5vbk51bGwKKyAgICBwdWJsaWMgT3B0aW9uYWw8SW1lRXZlbnQ+IGZpbmRGaXJzdChQcmVkaWNhdGU8SW1lRXZlbnQ+IGNvbmRpdGlvbikgeworICAgICAgICBmaW5hbCBJbWVFdmVudEFycmF5IGxhdGVzdCA9IG1FdmVudFN1cHBsaWVyLmdldCgpOworICAgICAgICBpbnQgaW5kZXggPSBtQ3VycmVudFBvc2l0aW9uOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgaWYgKGluZGV4ID49IGxhdGVzdC5tTGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY29uZGl0aW9uLnRlc3QobGF0ZXN0Lm1BcnJheVtpbmRleF0pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKGxhdGVzdC5tQXJyYXlbaW5kZXhdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsraW5kZXg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIHRoZSBmaXJzdCBldmVudCB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIGNvbmRpdGlvbiBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uLgorICAgICAqCisgICAgICogPHA+SWYgdGhlcmUgaXMgc3VjaCBhbiBldmVudCwgdGhpcyBtZXRob2QgcmV0dXJucyBzdWNoIGFuIGV2ZW50IGFuZCBzZXQgdGhlIGN1cnJlbnQgZXZlbnQKKyAgICAgKiBwb3NpdGlvbiB0byB0aGF0IGV2ZW50LjwvcD4KKyAgICAgKgorICAgICAqIDxwPklmIHRoZXJlIGlzIHN1Y2ggYW4gZXZlbnQsIHRoaXMgbWV0aG9kIHJldHVybnMge0BsaW5rIE9wdGlvbmFsI2VtcHR5KCl9IHdpdGhvdXQgbW92aW5nIHRoZQorICAgICAqIGN1cnJlbnQgZXZlbnQgcG9zaXRpb24uPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGNvbmRpdGlvbiB0aGUgZXZlbnQgY29uZGl0aW9uIHRvIGJlIG1hdGNoZWQKKyAgICAgKiBAcmV0dXJuIHtAbGluayBPcHRpb25hbCNlbXB0eSgpfSBpZiB0aGVyZSBpcyBubyBzdWNoIGFuIGV2ZW50LiBPdGhlcndpc2UgdGhlIG1hdGNoZWQgZXZlbnQgaXMKKyAgICAgKiAgICAgICAgIHJldHVybmVkCisgICAgICovCisgICAgQE5vbk51bGwKKyAgICBwdWJsaWMgT3B0aW9uYWw8SW1lRXZlbnQ+IHNlZWtUb0ZpcnN0KFByZWRpY2F0ZTxJbWVFdmVudD4gY29uZGl0aW9uKSB7CisgICAgICAgIGZpbmFsIEltZUV2ZW50QXJyYXkgbGF0ZXN0ID0gbUV2ZW50U3VwcGxpZXIuZ2V0KCk7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpZiAobUN1cnJlbnRQb3NpdGlvbiA+PSBsYXRlc3QubUxlbmd0aCkgeworICAgICAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNvbmRpdGlvbi50ZXN0KGxhdGVzdC5tQXJyYXlbbUN1cnJlbnRQb3NpdGlvbl0pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKGxhdGVzdC5tQXJyYXlbbUN1cnJlbnRQb3NpdGlvbl0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKyttQ3VycmVudFBvc2l0aW9uOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBkdW1wRXZlbnQoQE5vbk51bGwgU3RyaW5nQnVpbGRlciBzYiwgQE5vbk51bGwgSW1lRXZlbnQgZXZlbnQsCisgICAgICAgICAgICBib29sZWFuIGZ1c2VkKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBpbmRlbnRhdGlvbiA9IGdldFdoaXRlU3BhY2VzKGV2ZW50LmdldE5lc3RMZXZlbCgpICogMiArIDIpOworICAgICAgICBmaW5hbCBsb25nIHdhbGxUaW1lID0KKyAgICAgICAgICAgICAgICBmdXNlZCA/IGV2ZW50LmdldEVudGVyV2FsbFRpbWUoKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5pc0VudGVyRXZlbnQoKSA/IGV2ZW50LmdldEVudGVyV2FsbFRpbWUoKSA6IGV2ZW50LmdldEV4aXRXYWxsVGltZSgpOworICAgICAgICBzYi5hcHBlbmQoc1NpbXBsZURhdGVUaW1lRm9ybWF0dGVyLmZvcm1hdChJbnN0YW50Lm9mRXBvY2hNaWxsaSh3YWxsVGltZSkpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoIiAgIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKFN0cmluZy5mb3JtYXQoIiU1ZCIsIGV2ZW50LmdldFRocmVhZElkKCkpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoaW5kZW50YXRpb24pOworICAgICAgICBzYi5hcHBlbmQoZnVzZWQgPyAiIiA6IGV2ZW50LmlzRW50ZXJFdmVudCgpID8gIlsiIDogIl0iKTsKKyAgICAgICAgaWYgKGZ1c2VkIHx8IGV2ZW50LmlzRW50ZXJFdmVudCgpKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoZXZlbnQuZ2V0RXZlbnROYW1lKCkpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoJzonKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIgYXJncz0iKTsKKyAgICAgICAgICAgIGR1bXBCdW5kbGUoc2IsIGV2ZW50LmdldEFyZ3VtZW50cygpKTsKKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoJ1xuJyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBEZWJ1ZyBpbmZvIGFzIGEge0BsaW5rIFN0cmluZ30uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBkdW1wKCkgeworICAgICAgICBmaW5hbCBJbWVFdmVudEFycmF5IGxhdGVzdCA9IG1FdmVudFN1cHBsaWVyLmdldCgpOworICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgc2IuYXBwZW5kKCJJbWVFdmVudFN0cmVhbTpcbiIpOworICAgICAgICBzYi5hcHBlbmQoIiAgbGF0ZXN0OiBhcnJheVsiKS5hcHBlbmQobGF0ZXN0Lm1BcnJheS5sZW5ndGgpLmFwcGVuZCgiXSArIHtcbiIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxhdGVzdC5tTGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIC8vIFRvIGNvbXByZXNzIHRoZSBkdW1wIG1lc3NhZ2UsIGlmIHRoZSBjdXJyZW50IGV2ZW50IGlzIGFuIGVudGVyIGV2ZW50IGFuZCB0aGUgbmV4dAorICAgICAgICAgICAgLy8gb25lIGlzIGEgY29ycmVzcG9uZGluZyBleGl0IGV2ZW50LCB3ZSB1bmlmeSB0aGUgb3V0cHV0LgorICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBmdXNlZCA9IGFyZUVudGVyRXhpdFBhaXJlZE1lc3NhZ2VzKGxhdGVzdCwgaSk7CisgICAgICAgICAgICBpZiAoaSA9PSBtQ3VycmVudFBvc2l0aW9uIHx8IChmdXNlZCAmJiAoKGkgKyAxKSA9PSBtQ3VycmVudFBvc2l0aW9uKSkpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiAgPT09PT09PT0gQ3VycmVudFBvc2l0aW9uID09PT09PT09ICBcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZHVtcEV2ZW50KHNiLCBsYXRlc3QubUFycmF5W2Z1c2VkID8gKytpIDogaV0sIGZ1c2VkKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUN1cnJlbnRQb3NpdGlvbiA+PSBsYXRlc3QubUxlbmd0aCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIgID09PT09PT09IEN1cnJlbnRQb3NpdGlvbiA9PT09PT09PSAgXG4iKTsKKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoIn1cbiIpOworICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gYXJyYXkgZXZlbnQgYXJyYXkgdG8gYmUgY2hlY2tlZAorICAgICAqIEBwYXJhbSBpIGluZGV4IHRvIGJlIGNoZWNrZWQKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB7QGNvZGUgYXJyYXkubUFycmF5W2ldfSBhbmQge0Bjb2RlIGFycmF5Lm1BcnJheVtpICsgMV19IGFyZSB0d28KKyAgICAgKiAgICAgICAgIHBhaXJlZCBldmVudHMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBhcmVFbnRlckV4aXRQYWlyZWRNZXNzYWdlcyhATm9uTnVsbCBJbWVFdmVudEFycmF5IGFycmF5LAorICAgICAgICAgICAgQEludFJhbmdlKGZyb20gPSAwKSBpbnQgaSkgeworICAgICAgICByZXR1cm4gYXJyYXkubUFycmF5W2ldICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiBhcnJheS5tQXJyYXlbaV0uaXNFbnRlckV2ZW50KCkKKyAgICAgICAgICAgICAgICAmJiAoaSArIDEpIDwgYXJyYXkubUxlbmd0aAorICAgICAgICAgICAgICAgICYmIGFycmF5Lm1BcnJheVtpICsgMV0gIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIGFycmF5Lm1BcnJheVtpXS5nZXRFdmVudE5hbWUoKS5lcXVhbHMoYXJyYXkubUFycmF5W2kgKyAxXS5nZXRFdmVudE5hbWUoKSkKKyAgICAgICAgICAgICAgICAmJiBhcnJheS5tQXJyYXlbaV0uZ2V0RW50ZXJUaW1lc3RhbXAoKSA9PSBhcnJheS5tQXJyYXlbaSArIDFdLmdldEVudGVyVGltZXN0YW1wKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGxlbmd0aCBsZW5ndGggb2YgdGhlIHJlcXVlc3RlZCB3aGl0ZSBzcGFjZSBzdHJpbmcKKyAgICAgKiBAcmV0dXJuIHtAbGluayBTdHJpbmd9IG9iamVjdCB3aG9zZSBsZW5ndGggaXMge0Bjb2RlIGxlbmd0aH0KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0V2hpdGVTcGFjZXMoQEludFJhbmdlKGZyb20gPSAwKSBmaW5hbCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIGlmIChsZW5ndGggPCBMT05HX0xPTkdfU1BBQ0VTLmxlbmd0aCgpKSB7CisgICAgICAgICAgICByZXR1cm4gTE9OR19MT05HX1NQQUNFUy5zdWJzdHJpbmcoMCwgbGVuZ3RoKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBjaGFyW10gaW5kZW50YXRpb25DaGFycyA9IG5ldyBjaGFyW2xlbmd0aF07CisgICAgICAgIEFycmF5cy5maWxsKGluZGVudGF0aW9uQ2hhcnMsICcgJyk7CisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGluZGVudGF0aW9uQ2hhcnMpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZHVtcEJ1bmRsZShATm9uTnVsbCBTdHJpbmdCdWlsZGVyIHNiLCBATm9uTnVsbCBCdW5kbGUgYnVuZGxlKSB7CisgICAgICAgIHNiLmFwcGVuZCgneycpOworICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgZm9yIChTdHJpbmcga2V5IDogYnVuZGxlLmtleVNldCgpKSB7CisgICAgICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJyAnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIE9iamVjdCBvYmplY3QgPSBidW5kbGUuZ2V0KGtleSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoa2V5KTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgnPScpOworICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVkaXRvckluZm8pIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBFZGl0b3JJbmZvIGluZm8gPSAoRWRpdG9ySW5mbykgb2JqZWN0OworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiRWRpdG9ySW5mb3twYWNrYWdlTmFtZT0iKS5hcHBlbmQoaW5mby5wYWNrYWdlTmFtZSk7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgZmllbGRJZD0iKS5hcHBlbmQoaW5mby5maWVsZElkKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiBoaW50VGV4dD0iKS5hcHBlbmQoaW5mby5oaW50VGV4dCk7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgcHJpdmF0ZUltZU9wdGlvbnM9IikuYXBwZW5kKGluZm8ucHJpdmF0ZUltZU9wdGlvbnMpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgifSIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQob2JqZWN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoJ30nKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgSW1lRXZlbnRBcnJheSB7CisgICAgICAgIEBOb25OdWxsCisgICAgICAgIHB1YmxpYyBmaW5hbCBJbWVFdmVudFtdIG1BcnJheTsKKyAgICAgICAgcHVibGljIGZpbmFsIGludCBtTGVuZ3RoOworICAgICAgICBJbWVFdmVudEFycmF5KEltZUV2ZW50W10gYXJyYXksIGludCBsZW5ndGgpIHsKKyAgICAgICAgICAgIG1BcnJheSA9IGFycmF5OworICAgICAgICAgICAgbUxlbmd0aCA9IGxlbmd0aDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2lucHV0bWV0aG9kL21vY2tpbWUvc3JjL2NvbS9hbmRyb2lkL2N0cy9tb2NraW1lL0ltZUV2ZW50U3RyZWFtVGVzdFV0aWxzLmphdmEgYi90ZXN0cy9pbnB1dG1ldGhvZC9tb2NraW1lL3NyYy9jb20vYW5kcm9pZC9jdHMvbW9ja2ltZS9JbWVFdmVudFN0cmVhbVRlc3RVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MTU5YWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnB1dG1ldGhvZC9tb2NraW1lL3NyYy9jb20vYW5kcm9pZC9jdHMvbW9ja2ltZS9JbWVFdmVudFN0cmVhbVRlc3RVdGlscy5qYXZhCkBAIC0wLDAgKzEsMzEyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5jdHMubW9ja2ltZTsKKworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5Ob25OdWxsOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CitpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLkVkaXRvckluZm87CitpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0QmluZGluZzsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lb3V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU7CisKKy8qKgorICogQSBzZXQgb2YgdXRpbGl0eSBtZXRob2RzIHRvIGF2b2lkIGJvaWxlcnBsYXRlIGNvZGUgd2hlbiB3cml0aW5nIGVuZC10by1lbmQgdGVzdHMuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBJbWVFdmVudFN0cmVhbVRlc3RVdGlscyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBUSU1FX1NMSUNFID0gNTA7ICAvLyBtc2VjCisKKyAgICAvKioKKyAgICAgKiBDYW5ub3QgYmUgaW5zdGFudGlhdGVkCisgICAgICovCisgICAgcHJpdmF0ZSBJbWVFdmVudFN0cmVhbVRlc3RVdGlscygpIHt9CisKKyAgICAvKioKKyAgICAgKiBCZWhhdmlvciBtb2RlIG9mIHtAbGluayAjZXhwZWN0RXZlbnQoSW1lRXZlbnRTdHJlYW0sIFByZWRpY2F0ZSwgRXZlbnRGaWx0ZXJNb2RlLCBsb25nKX0KKyAgICAgKi8KKyAgICBwdWJsaWMgZW51bSBFdmVudEZpbHRlck1vZGUgeworICAgICAgICAvKioKKyAgICAgICAgICogQWxsIHtAbGluayBJbWVFdmVudH0gZXZlbnRzIHNob3VsZCBiZSBjaGVja2VkCisgICAgICAgICAqLworICAgICAgICBDSEVDS19BTEwsCisgICAgICAgIC8qKgorICAgICAgICAgKiBPbmx5IGV2ZW50cyB0aGF0IHJldHVybiB7QGNvZGUgdHJ1ZX0gZnJvbSB7QGxpbmsgSW1lRXZlbnQjaXNFbnRlckV2ZW50KCl9IHNob3VsZCBiZQorICAgICAgICAgKiBjaGVja2VkCisgICAgICAgICAqLworICAgICAgICBDSEVDS19FTlRFUl9FVkVOVF9PTkxZLAorICAgICAgICAvKioKKyAgICAgICAgICogT25seSBldmVudHMgdGhhdCByZXR1cm4ge0Bjb2RlIGZhbHNlfSBmcm9tIHtAbGluayBJbWVFdmVudCNpc0VudGVyRXZlbnQoKX0gc2hvdWxkIGJlCisgICAgICAgICAqIGNoZWNrZWQKKyAgICAgICAgICovCisgICAgICAgIENIRUNLX0VYSVRfRVZFTlRfT05MWSwKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXYWl0IHVudGlsIGFuIGV2ZW50IHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4ge0Bjb2RlIGNvbmRpdGlvbn0gaXMgZm91bmQgaW4gdGhlIHN0cmVhbS4KKyAgICAgKgorICAgICAqIDxwPldoZW4gdGhpcyBtZXRob2Qgc3VjY2VlZHMgdG8gZmluZCBhbiBldmVudCB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIHtAY29kZSBjb25kaXRpb259LCB0aGUKKyAgICAgKiBzdHJlYW0gcG9zaXRpb24gd2lsbCBiZSBzZXQgdG8gdGhlIG5leHQgdG8gdGhlIGZvdW5kIG9iamVjdCB0aGVuIHRoZSBldmVudCBmb3VuZCBpcyByZXR1cm5lZC4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiA8cD5Gb3IgY29udmVuaWVuY2UsIHRoaXMgbWV0aG9kIGF1dG9tYXRpY2FsbHkgZmlsdGVyIG91dCBleGl0IGV2ZW50cyAoZXZlbnRzIHRoYXQgcmV0dXJuCisgICAgICoge0Bjb2RlIGZhbHNlfSBmcm9tIHtAbGluayBJbWVFdmVudCNpc0VudGVyRXZlbnQoKX0uPC9wPgorICAgICAqCisgICAgICogPHA+VE9ETzogQ29uc2lkZXIgcmVuYW1pbmcgdGhpcyB0byB7QGNvZGUgZXhwZWN0RXZlbnRFbnRlcn0gb3Igc29tZXRoaW5nIGxpa2UgdGhhdC48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyZWFtIHtAbGluayBJbWVFdmVudFN0cmVhbX0gdG8gYmUgY2hlY2tlZC4KKyAgICAgKiBAcGFyYW0gY29uZGl0aW9uIHRoZSBldmVudCBjb25kaXRpb24gdG8gYmUgbWF0Y2hlZAorICAgICAqIEBwYXJhbSB0aW1lb3V0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmQKKyAgICAgKiBAcmV0dXJuIHtAbGluayBJbWVFdmVudH0gZm91bmQKKyAgICAgKiBAdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24gd2hlbiB0aGUgbm8gZXZlbnQgaXMgbWF0Y2hlZCB0byB0aGUgZ2l2ZW4gY29uZGl0aW9uIHdpdGhpbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB7QGNvZGUgdGltZW91dH0KKyAgICAgKi8KKyAgICBATm9uTnVsbAorICAgIHB1YmxpYyBzdGF0aWMgSW1lRXZlbnQgZXhwZWN0RXZlbnQoQE5vbk51bGwgSW1lRXZlbnRTdHJlYW0gc3RyZWFtLAorICAgICAgICAgICAgQE5vbk51bGwgUHJlZGljYXRlPEltZUV2ZW50PiBjb25kaXRpb24sIGxvbmcgdGltZW91dCkgdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZXhwZWN0RXZlbnQoc3RyZWFtLCBjb25kaXRpb24sIEV2ZW50RmlsdGVyTW9kZS5DSEVDS19FTlRFUl9FVkVOVF9PTkxZLCB0aW1lb3V0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXYWl0IHVudGlsIGFuIGV2ZW50IHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4ge0Bjb2RlIGNvbmRpdGlvbn0gaXMgZm91bmQgaW4gdGhlIHN0cmVhbS4KKyAgICAgKgorICAgICAqIDxwPldoZW4gdGhpcyBtZXRob2Qgc3VjY2VlZHMgdG8gZmluZCBhbiBldmVudCB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIHtAY29kZSBjb25kaXRpb259LCB0aGUKKyAgICAgKiBzdHJlYW0gcG9zaXRpb24gd2lsbCBiZSBzZXQgdG8gdGhlIG5leHQgdG8gdGhlIGZvdW5kIG9iamVjdCB0aGVuIHRoZSBldmVudCBmb3VuZCBpcyByZXR1cm5lZC4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyZWFtIHtAbGluayBJbWVFdmVudFN0cmVhbX0gdG8gYmUgY2hlY2tlZC4KKyAgICAgKiBAcGFyYW0gY29uZGl0aW9uIHRoZSBldmVudCBjb25kaXRpb24gdG8gYmUgbWF0Y2hlZAorICAgICAqIEBwYXJhbSBmaWx0ZXJNb2RlIGNvbnRyb2xzIGhvdyBldmVudHMgYXJlIGZpbHRlcmVkIG91dAorICAgICAqIEBwYXJhbSB0aW1lb3V0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmQKKyAgICAgKiBAcmV0dXJuIHtAbGluayBJbWVFdmVudH0gZm91bmQKKyAgICAgKiBAdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24gd2hlbiB0aGUgbm8gZXZlbnQgaXMgbWF0Y2hlZCB0byB0aGUgZ2l2ZW4gY29uZGl0aW9uIHdpdGhpbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB7QGNvZGUgdGltZW91dH0KKyAgICAgKi8KKyAgICBATm9uTnVsbAorICAgIHB1YmxpYyBzdGF0aWMgSW1lRXZlbnQgZXhwZWN0RXZlbnQoQE5vbk51bGwgSW1lRXZlbnRTdHJlYW0gc3RyZWFtLAorICAgICAgICAgICAgQE5vbk51bGwgUHJlZGljYXRlPEltZUV2ZW50PiBjb25kaXRpb24sIEV2ZW50RmlsdGVyTW9kZSBmaWx0ZXJNb2RlLCBsb25nIHRpbWVvdXQpCisgICAgICAgICAgICB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBPcHRpb25hbDxJbWVFdmVudD4gcmVzdWx0OworICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICBpZiAodGltZW91dCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRpbWVvdXRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV2ZW50IG5vdCBmb3VuZCB3aXRoaW4gdGhlIHRpbWVvdXQ6ICIgKyBzdHJlYW0uZHVtcCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmluYWwgUHJlZGljYXRlPEltZUV2ZW50PiBjb21iaW5lZENvbmRpdGlvbjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGZpbHRlck1vZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDSEVDS19BTEw6CisgICAgICAgICAgICAgICAgICAgICAgICBjb21iaW5lZENvbmRpdGlvbiA9IGNvbmRpdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIENIRUNLX0VOVEVSX0VWRU5UX09OTFk6CisgICAgICAgICAgICAgICAgICAgICAgICBjb21iaW5lZENvbmRpdGlvbiA9IGV2ZW50IC0+IGV2ZW50LmlzRW50ZXJFdmVudCgpICYmIGNvbmRpdGlvbi50ZXN0KGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIENIRUNLX0VYSVRfRVZFTlRfT05MWToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbWJpbmVkQ29uZGl0aW9uID0gZXZlbnQgLT4gIWV2ZW50LmlzRW50ZXJFdmVudCgpICYmIGNvbmRpdGlvbi50ZXN0KGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBmaWx0ZXJNb2RlICIgKyBmaWx0ZXJNb2RlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gc3RyZWFtLnNlZWtUb0ZpcnN0KGNvbWJpbmVkQ29uZGl0aW9uKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoVElNRV9TTElDRSk7CisgICAgICAgICAgICAgICAgdGltZW91dCAtPSBUSU1FX1NMSUNFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgSW1lRXZlbnQgZXZlbnQgPSByZXN1bHQuZ2V0KCk7CisgICAgICAgICAgICBpZiAoZXZlbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiZm91bmQgZXZlbnQgaXMgbnVsbDogIiArIHN0cmVhbS5kdW1wKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RyZWFtLnNraXAoMSk7CisgICAgICAgICAgICByZXR1cm4gZXZlbnQ7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJleHBlY3RFdmVudCBmYWlsZWQ6ICIgKyBzdHJlYW0uZHVtcCgpLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyBpZiB7QHBhcmFtIGV2ZW50TmFtZX0gaGFzIG9jY3VycmVkIG9uIHRoZSBFZGl0VGV4dChvciBUZXh0Vmlldykgb2YgdGhlIGN1cnJlbnQKKyAgICAgKiBhY3Rpdml0eS4KKyAgICAgKiBAcGFyYW0gZXZlbnROYW1lIGV2ZW50IG5hbWUgdG8gY2hlY2sKKyAgICAgKiBAcGFyYW0gbWFya2VyIFRlc3QgbWFya2VyIHNldCB0byB7QGxpbmsgYW5kcm9pZC53aWRnZXQuRWRpdFRleHQjc2V0UHJpdmF0ZUltZU9wdGlvbnMoU3RyaW5nKX0KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgZXZlbnQgb2NjdXJyZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBQcmVkaWNhdGU8SW1lRXZlbnQ+IGVkaXRvck1hdGNoZXIoCisgICAgICAgIEBOb25OdWxsIFN0cmluZyBldmVudE5hbWUsIEBOb25OdWxsIFN0cmluZyBtYXJrZXIpIHsKKyAgICAgICAgcmV0dXJuIGV2ZW50IC0+IHsKKyAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmVxdWFscyhldmVudE5hbWUsIGV2ZW50LmdldEV2ZW50TmFtZSgpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIEVkaXRvckluZm8gZWRpdG9ySW5mbyA9IGV2ZW50LmdldEFyZ3VtZW50cygpLmdldFBhcmNlbGFibGUoImVkaXRvckluZm8iKTsKKyAgICAgICAgICAgIHJldHVybiBUZXh0VXRpbHMuZXF1YWxzKG1hcmtlciwgZWRpdG9ySW5mby5wcml2YXRlSW1lT3B0aW9ucyk7CisgICAgICAgIH07CisgICAgfQorCisgICAgLyoqCisgICAgICogV2FpdCB1bnRpbCBhbiBldmVudCB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIGNvbW1hbmQgaXMgY29uc3VtZWQgYnkgdGhlIHtAbGluayBNb2NrSW1lfS4KKyAgICAgKgorICAgICAqIDxwPkZvciBjb252ZW5pZW5jZSwgdGhpcyBtZXRob2QgYXV0b21hdGljYWxseSBmaWx0ZXIgb3V0IGVudGVyIGV2ZW50cyAoZXZlbnRzIHRoYXQgcmV0dXJuCisgICAgICoge0Bjb2RlIHRydWV9IGZyb20ge0BsaW5rIEltZUV2ZW50I2lzRW50ZXJFdmVudCgpfS48L3A+CisgICAgICoKKyAgICAgKiA8cD5UT0RPOiBDb25zaWRlciByZW5hbWluZyB0aGlzIHRvIHtAY29kZSBleHBlY3RDb21tYW5kQ29uc3VtZWR9IG9yIHNvbWV0aGluZyBsaWtlIHRoYXQuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmVhbSB7QGxpbmsgSW1lRXZlbnRTdHJlYW19IHRvIGJlIGNoZWNrZWQuCisgICAgICogQHBhcmFtIGNvbW1hbmQge0BsaW5rIEltZUNvbW1hbmR9IHRvIGJlIHdhaXRlZCBmb3IuCisgICAgICogQHBhcmFtIHRpbWVvdXQgdGltZW91dCBpbiBtaWxsaXNlY29uZAorICAgICAqIEByZXR1cm4ge0BsaW5rIEltZUV2ZW50fSBmb3VuZAorICAgICAqIEB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiB3aGVuIHRoZSBubyBldmVudCBpcyBtYXRjaGVkIHRvIHRoZSBnaXZlbiBjb25kaXRpb24gd2l0aGluCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHtAY29kZSB0aW1lb3V0fQorICAgICAqLworICAgIEBOb25OdWxsCisgICAgcHVibGljIHN0YXRpYyBJbWVFdmVudCBleHBlY3RDb21tYW5kKEBOb25OdWxsIEltZUV2ZW50U3RyZWFtIHN0cmVhbSwKKyAgICAgICAgICAgIEBOb25OdWxsIEltZUNvbW1hbmQgY29tbWFuZCwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFByZWRpY2F0ZTxJbWVFdmVudD4gcHJlZGljYXRlID0gZXZlbnQgLT4geworICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuZXF1YWxzKCJvbkhhbmRsZUNvbW1hbmQiLCBldmVudC5nZXRFdmVudE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBJbWVDb21tYW5kIGV2ZW50Q29tbWFuZCA9CisgICAgICAgICAgICAgICAgICAgIEltZUNvbW1hbmQuZnJvbUJ1bmRsZShldmVudC5nZXRBcmd1bWVudHMoKS5nZXRCdW5kbGUoImNvbW1hbmQiKSk7CisgICAgICAgICAgICByZXR1cm4gZXZlbnRDb21tYW5kLmdldElkKCkgPT0gY29tbWFuZC5nZXRJZCgpOworICAgICAgICB9OworICAgICAgICByZXR1cm4gZXhwZWN0RXZlbnQoc3RyZWFtLCBwcmVkaWNhdGUsIEV2ZW50RmlsdGVyTW9kZS5DSEVDS19FWElUX0VWRU5UX09OTFksIHRpbWVvdXQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFzc2VydCB0aGF0IGFuIGV2ZW50IHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4ge0Bjb2RlIGNvbmRpdGlvbn0gd2lsbCBubyBiZSBmb3VuZCBpbiB0aGUgc3RyZWFtCisgICAgICogd2l0aGluIHRoZSBnaXZlbiB7QGNvZGUgdGltZW91dH0uCisgICAgICoKKyAgICAgKiA8cD5XaGVuIHRoaXMgbWV0aG9kIHN1Y2NlZWRzLCB0aGUgc3RyZWFtIHBvc2l0aW9uIHdpbGwgbm90IGNoYW5nZS48L3A+CisgICAgICoKKyAgICAgKiA8cD5Gb3IgY29udmVuaWVuY2UsIHRoaXMgbWV0aG9kIGF1dG9tYXRpY2FsbHkgZmlsdGVyIG91dCBleGl0IGV2ZW50cyAoZXZlbnRzIHRoYXQgcmV0dXJuCisgICAgICoge0Bjb2RlIGZhbHNlfSBmcm9tIHtAbGluayBJbWVFdmVudCNpc0VudGVyRXZlbnQoKX0uPC9wPgorICAgICAqCisgICAgICogPHA+VE9ETzogQ29uc2lkZXIgcmVuYW1pbmcgdGhpcyB0byB7QGNvZGUgbm90RXhwZWN0RXZlbnRFbnRlcn0gb3Igc29tZXRoaW5nIGxpa2UgdGhhdC48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyZWFtIHtAbGluayBJbWVFdmVudFN0cmVhbX0gdG8gYmUgY2hlY2tlZC4KKyAgICAgKiBAcGFyYW0gY29uZGl0aW9uIHRoZSBldmVudCBjb25kaXRpb24gdG8gYmUgbWF0Y2hlZAorICAgICAqIEBwYXJhbSB0aW1lb3V0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmQKKyAgICAgKiBAdGhyb3dzIEFzc2VydGlvbkVycm9yIGlmIHN1Y2ggYW4gZXZlbnQgaXMgZm91bmQgd2l0aGluIHRoZSBnaXZlbiB7QGNvZGUgdGltZW91dH0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbm90RXhwZWN0RXZlbnQoQE5vbk51bGwgSW1lRXZlbnRTdHJlYW0gc3RyZWFtLAorICAgICAgICAgICAgQE5vbk51bGwgUHJlZGljYXRlPEltZUV2ZW50PiBjb25kaXRpb24sIGxvbmcgdGltZW91dCkgeworICAgICAgICBub3RFeHBlY3RFdmVudChzdHJlYW0sIGNvbmRpdGlvbiwgRXZlbnRGaWx0ZXJNb2RlLkNIRUNLX0VOVEVSX0VWRU5UX09OTFksIHRpbWVvdXQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFzc2VydCB0aGF0IGFuIGV2ZW50IHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4ge0Bjb2RlIGNvbmRpdGlvbn0gd2lsbCBubyBiZSBmb3VuZCBpbiB0aGUgc3RyZWFtCisgICAgICogd2l0aGluIHRoZSBnaXZlbiB7QGNvZGUgdGltZW91dH0uCisgICAgICoKKyAgICAgKiA8cD5XaGVuIHRoaXMgbWV0aG9kIHN1Y2NlZWRzLCB0aGUgc3RyZWFtIHBvc2l0aW9uIHdpbGwgbm90IGNoYW5nZS48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyZWFtIHtAbGluayBJbWVFdmVudFN0cmVhbX0gdG8gYmUgY2hlY2tlZC4KKyAgICAgKiBAcGFyYW0gY29uZGl0aW9uIHRoZSBldmVudCBjb25kaXRpb24gdG8gYmUgbWF0Y2hlZAorICAgICAqIEBwYXJhbSBmaWx0ZXJNb2RlIGNvbnRyb2xzIGhvdyBldmVudHMgYXJlIGZpbHRlcmVkIG91dAorICAgICAqIEBwYXJhbSB0aW1lb3V0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmQKKyAgICAgKiBAdGhyb3dzIEFzc2VydGlvbkVycm9yIGlmIHN1Y2ggYW4gZXZlbnQgaXMgZm91bmQgd2l0aGluIHRoZSBnaXZlbiB7QGNvZGUgdGltZW91dH0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbm90RXhwZWN0RXZlbnQoQE5vbk51bGwgSW1lRXZlbnRTdHJlYW0gc3RyZWFtLAorICAgICAgICAgICAgQE5vbk51bGwgUHJlZGljYXRlPEltZUV2ZW50PiBjb25kaXRpb24sIEV2ZW50RmlsdGVyTW9kZSBmaWx0ZXJNb2RlLCBsb25nIHRpbWVvdXQpIHsKKyAgICAgICAgZmluYWwgUHJlZGljYXRlPEltZUV2ZW50PiBjb21iaW5lZENvbmRpdGlvbjsKKyAgICAgICAgc3dpdGNoIChmaWx0ZXJNb2RlKSB7CisgICAgICAgICAgICBjYXNlIENIRUNLX0FMTDoKKyAgICAgICAgICAgICAgICBjb21iaW5lZENvbmRpdGlvbiA9IGNvbmRpdGlvbjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ0hFQ0tfRU5URVJfRVZFTlRfT05MWToKKyAgICAgICAgICAgICAgICBjb21iaW5lZENvbmRpdGlvbiA9IGV2ZW50IC0+IGV2ZW50LmlzRW50ZXJFdmVudCgpICYmIGNvbmRpdGlvbi50ZXN0KGV2ZW50KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ0hFQ0tfRVhJVF9FVkVOVF9PTkxZOgorICAgICAgICAgICAgICAgIGNvbWJpbmVkQ29uZGl0aW9uID0gZXZlbnQgLT4gIWV2ZW50LmlzRW50ZXJFdmVudCgpICYmIGNvbmRpdGlvbi50ZXN0KGV2ZW50KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBmaWx0ZXJNb2RlICIgKyBmaWx0ZXJNb2RlKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICBpZiAodGltZW91dCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc3RyZWFtLmZpbmRGaXJzdChjb21iaW5lZENvbmRpdGlvbikuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJub3RFeHBlY3RFdmVudCBmYWlsZWQ6ICIgKyBzdHJlYW0uZHVtcCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFRJTUVfU0xJQ0UpOworICAgICAgICAgICAgICAgIHRpbWVvdXQgLT0gVElNRV9TTElDRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIm5vdEV4cGVjdEV2ZW50IGZhaWxlZDogIiArIHN0cmVhbS5kdW1wKCksIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIHtAbGluayAjZXhwZWN0RXZlbnQoSW1lRXZlbnRTdHJlYW0sIFByZWRpY2F0ZSwgbG9uZyl9IHRvIHdhaXQgZm9yCisgICAgICoge0BsaW5rIGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dE1ldGhvZCNiaW5kSW5wdXQoSW5wdXRCaW5kaW5nKX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyZWFtIHtAbGluayBJbWVFdmVudFN0cmVhbX0gdG8gYmUgY2hlY2tlZC4KKyAgICAgKiBAcGFyYW0gdGFyZ2V0UHJvY2Vzc1BpZCBQSUQgdG8gYmUgbWF0Y2hlZCB0byB7QGxpbmsgSW5wdXRCaW5kaW5nI2dldFBpZCgpfQorICAgICAqIEBwYXJhbSB0aW1lb3V0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmQKKyAgICAgKiBAdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24gd2hlbiAiYmluZElucHV0IiBpcyBub3QgY2FsbGVkIHdpdGhpbiB7QGNvZGUgdGltZW91dH0gbXNlYworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBleHBlY3RCaW5kSW5wdXQoQE5vbk51bGwgSW1lRXZlbnRTdHJlYW0gc3RyZWFtLCBpbnQgdGFyZ2V0UHJvY2Vzc1BpZCwKKyAgICAgICAgICAgIGxvbmcgdGltZW91dCkgdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24geworICAgICAgICBleHBlY3RFdmVudChzdHJlYW0sIGV2ZW50IC0+IHsKKyAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmVxdWFscygiYmluZElucHV0IiwgZXZlbnQuZ2V0RXZlbnROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgSW5wdXRCaW5kaW5nIGJpbmRpbmcgPSBldmVudC5nZXRBcmd1bWVudHMoKS5nZXRQYXJjZWxhYmxlKCJiaW5kaW5nIik7CisgICAgICAgICAgICByZXR1cm4gYmluZGluZy5nZXRQaWQoKSA9PSB0YXJnZXRQcm9jZXNzUGlkOworICAgICAgICB9LCBFdmVudEZpbHRlck1vZGUuQ0hFQ0tfRVhJVF9FVkVOVF9PTkxZLCAgdGltZW91dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2FpdHMgdW50aWwge0Bjb2RlIE1vY2tJbWV9IGRvZXMgbm90IHNlbmQge0Bjb2RlICJvbklucHV0Vmlld0xheW91dENoYW5nZWQifSBldmVudAorICAgICAqIGZvciBhIGNlcnRhaW4gcGVyaW9kIG9mIHRpbWUgKHtAY29kZSBzdGFibGVUaHJlc2hvbGRUaW1lfSBtc2VjKS4KKyAgICAgKgorICAgICAqIDxwPldoZW4gdGhpcyByZXR1cm5zIG5vbi1udWxsIHtAbGluayBJbWVMYXlvdXRJbmZvfSwgdGhlIHN0cmVhbSBwb3NpdGlvbiB3aWxsIGJlIHNldCB0bworICAgICAqIHRoZSBuZXh0IGV2ZW50IG9mIHRoZSByZXR1cm5lZCBsYXlvdXQgZXZlbnQuICBPdGhlcndpc2UgdGhpcyBtZXRob2QgZG9lcyBub3QgY2hhbmdlIHN0cmVhbQorICAgICAqIHBvc2l0aW9uLjwvcD4KKyAgICAgKiBAcGFyYW0gc3RyZWFtIHtAbGluayBJbWVFdmVudFN0cmVhbX0gdG8gYmUgY2hlY2tlZC4KKyAgICAgKiBAcGFyYW0gc3RhYmxlVGhyZXNob2xkVGltZSB0aHJlc2hvbGQgdGltZSB0byBjb25zaWRlciB0aGF0IHtAbGluayBNb2NrSW1lfSdzIGxheW91dCBpcworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWJsZSwgaW4gbWlsbGlzZWNvbmQKKyAgICAgKiBAcmV0dXJuIGxhc3Qge0BsaW5rIEltZUxheW91dEluZm99IGlmIHtAbGluayBNb2NrSW1lfSBzZW50IG9uZSBvciBtb3JlCisgICAgICogICAgICAgICB7QGNvZGUgIm9uSW5wdXRWaWV3TGF5b3V0Q2hhbmdlZCJ9IGV2ZW50LiAgT3RoZXJ3aXNlIHtAY29kZSBudWxsfQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgSW1lTGF5b3V0SW5mbyB3YWl0Rm9ySW5wdXRWaWV3TGF5b3V0U3RhYmxlKEBOb25OdWxsIEltZUV2ZW50U3RyZWFtIHN0cmVhbSwKKyAgICAgICAgICAgIGxvbmcgc3RhYmxlVGhyZXNob2xkVGltZSkgeworICAgICAgICBJbWVMYXlvdXRJbmZvIGxhc3RMYXlvdXQgPSBudWxsOworICAgICAgICBmaW5hbCBQcmVkaWNhdGU8SW1lRXZlbnQ+IGxheW91dEZpbHRlciA9IGV2ZW50IC0+CisgICAgICAgICAgICAgICAgIWV2ZW50LmlzRW50ZXJFdmVudCgpICYmIGV2ZW50LmdldEV2ZW50TmFtZSgpLmVxdWFscygib25JbnB1dFZpZXdMYXlvdXRDaGFuZ2VkIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsb25nIGRlYWRsaW5lID0gU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCkgKyBzdGFibGVUaHJlc2hvbGRUaW1lOworICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICBpZiAoZGVhZGxpbmUgPCBTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGFzdExheW91dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmluYWwgT3B0aW9uYWw8SW1lRXZlbnQ+IGV2ZW50ID0gc3RyZWFtLnNlZWtUb0ZpcnN0KGxheW91dEZpbHRlcik7CisgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFJlbWVtYmVyIHRoZSBsYXN0IGV2ZW50IGFuZCBleHRlbmQgdGhlIGRlYWRsaW5lIGFnYWluLgorICAgICAgICAgICAgICAgICAgICBsYXN0TGF5b3V0ID0gSW1lTGF5b3V0SW5mby5yZWFkRnJvbUJ1bmRsZShldmVudC5nZXQoKS5nZXRBcmd1bWVudHMoKSk7CisgICAgICAgICAgICAgICAgICAgIGRlYWRsaW5lID0gU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCkgKyBzdGFibGVUaHJlc2hvbGRUaW1lOworICAgICAgICAgICAgICAgICAgICBzdHJlYW0uc2tpcCgxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFRJTUVfU0xJQ0UpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigibm90RXhwZWN0RXZlbnQgZmFpbGVkOiAiICsgc3RyZWFtLmR1bXAoKSwgZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnB1dG1ldGhvZC9tb2NraW1lL3NyYy9jb20vYW5kcm9pZC9jdHMvbW9ja2ltZS9JbWVMYXlvdXRJbmZvLmphdmEgYi90ZXN0cy9pbnB1dG1ldGhvZC9tb2NraW1lL3NyYy9jb20vYW5kcm9pZC9jdHMvbW9ja2ltZS9JbWVMYXlvdXRJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZlZDQ0OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2lucHV0bWV0aG9kL21vY2tpbWUvc3JjL2NvbS9hbmRyb2lkL2N0cy9tb2NraW1lL0ltZUxheW91dEluZm8uamF2YQpAQCAtMCwwICsxLDE5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY3RzLm1vY2tpbWU7CisKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvaW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk5vbk51bGw7CitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5OdWxsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuRGlzcGxheTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93SW5zZXRzOworCisvKioKKyAqIEEgY29sbGVjdGlvbiBvZiBsYXlvdXQtcmVsYXRlZCBpbmZvcm1hdGlvbiB3aGVuCisgKiB7QGxpbmsgVmlldy5PbkxheW91dENoYW5nZUxpc3RlbmVyI29uTGF5b3V0Q2hhbmdlKFZpZXcsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50KX0KKyAqIGlzIGNhbGxlZCBiYWNrIGZvciB0aGUgaW5wdXQgdmlldyAodGhlIHZpZXcgcmV0dXJuZWQgZnJvbSB7QGxpbmsgTW9ja0ltZSNvbkNyZWF0ZUlucHV0VmlldygpfSkuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBJbWVMYXlvdXRJbmZvIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfTEFZT1VUX0tFWSA9ICJuZXdMYXlvdXQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPTERfTEFZT1VUX0tFWSA9ICJvbGRMYXlvdXQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWSUVXX09SSUdJTl9PTl9TQ1JFRU5fS0VZID0gInZpZXdPcmlnaW5PblNjcmVlbiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERJU1BMQVlfU0laRV9LRVkgPSAiZGlzcGxheVNpemUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTWVNURU1fV0lORE9XX0lOU0VUX0tFWSA9ICJzeXN0ZW1XaW5kb3dJbnNldCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQUJMRV9JTlNFVF9LRVkgPSAic3RhYmxlSW5zZXQiOworCisgICAgQE5vbk51bGwKKyAgICBwcml2YXRlIGZpbmFsIFJlY3QgbU5ld0xheW91dDsKKyAgICBATm9uTnVsbAorICAgIHByaXZhdGUgZmluYWwgUmVjdCBtT2xkTGF5b3V0OworICAgIEBOdWxsYWJsZQorICAgIHByaXZhdGUgUG9pbnQgbVZpZXdPcmlnaW5PblNjcmVlbjsKKyAgICBATnVsbGFibGUKKyAgICBwcml2YXRlIFBvaW50IG1EaXNwbGF5U2l6ZTsKKyAgICBATnVsbGFibGUKKyAgICBwcml2YXRlIFJlY3QgbVN5c3RlbVdpbmRvd0luc2V0OworICAgIEBOdWxsYWJsZQorICAgIHByaXZhdGUgUmVjdCBtU3RhYmxlSW5zZXQ7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBib3VuZGluZyBib3ggb2YgdGhlIHtAbGluayBWaWV3fSBwYXNzZWQgdG8KKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5pbnB1dG1ldGhvZHNlcnZpY2UuSW5wdXRNZXRob2RTZXJ2aWNlI29uQ3JlYXRlSW5wdXRWaWV3KCl9IGluIHNjcmVlbgorICAgICAqIGNvb3JkaW5hdGVzLgorICAgICAqCisgICAgICogPHA+Q3VycmVudGx5IHRoaXMgbWV0aG9kIGFzc3VtZXMgdGhhdCBubyB7QGxpbmsgVmlld30gaW4gdGhlIGhpZXJhcmNoeSB1c2VzCisgICAgICogdHJhbnNmb3JtYXRpb25zIHN1Y2ggYXMge0BsaW5rIFZpZXcjc2V0Um90YXRpb24oZmxvYXQpfS48L3A+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIFJlZ2lvbiBpbiBzY3JlZW4gY29vcmRpbmF0ZXMuCisgICAgICovCisgICAgQE51bGxhYmxlCisgICAgcHVibGljIFJlY3QgZ2V0SW5wdXRWaWV3Qm91bmRzSW5TY3JlZW4oKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVjdCgKKyAgICAgICAgICAgICAgICBtVmlld09yaWdpbk9uU2NyZWVuLngsIG1WaWV3T3JpZ2luT25TY3JlZW4ueSwKKyAgICAgICAgICAgICAgICBtVmlld09yaWdpbk9uU2NyZWVuLnggKyBtTmV3TGF5b3V0LndpZHRoKCksCisgICAgICAgICAgICAgICAgbVZpZXdPcmlnaW5PblNjcmVlbi55ICsgbU5ld0xheW91dC5oZWlnaHQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2NyZWVuIGFyZWEgaW4gc2NyZWVuIGNvb3JkaW5hdGVzIHRoYXQgZG9lcyBub3Qgb3ZlcmxhcCB3aXRoIHRoZSBzeXN0ZW0KKyAgICAgKiB3aW5kb3cgaW5zZXQsIHdoaWNoIHJlcHJlc2VudHMgdGhlIGFyZWEgb2YgYSBmdWxsLXNjcmVlbiB3aW5kb3cgdGhhdCBpcyBwYXJ0aWFsbHkgb3IKKyAgICAgKiBmdWxseSBvYnNjdXJlZCBieSB0aGUgc3RhdHVzIGJhciwgbmF2aWdhdGlvbiBiYXIsIElNRSBvciBvdGhlciBzeXN0ZW0gd2luZG93cy4KKyAgICAgKgorICAgICAqIDxwPk1heSByZXR1cm4ge0Bjb2RlIG51bGx9IHdoZW4gdGhpcyBpbmZvcm1hdGlvbiBpcyBub3QgeWV0IHJlYWR5LjwvcD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gUmVnaW9uIGluIHNjcmVlbiBjb29yZGluYXRlcy4ge0Bjb2RlIG51bGx9IHdoZW4gaXQgaXMgbm90IGF2YWlsYWJsZQorICAgICAqCisgICAgICogQHNlZSBXaW5kb3dJbnNldHMjaGFzU3lzdGVtV2luZG93SW5zZXRzKCkKKyAgICAgKiBAc2VlIFdpbmRvd0luc2V0cyNnZXRTeXN0ZW1XaW5kb3dJbnNldEJvdHRvbSgpCisgICAgICogQHNlZSBXaW5kb3dJbnNldHMjZ2V0U3lzdGVtV2luZG93SW5zZXRMZWZ0KCkKKyAgICAgKiBAc2VlIFdpbmRvd0luc2V0cyNnZXRTeXN0ZW1XaW5kb3dJbnNldFJpZ2h0KCkKKyAgICAgKiBAc2VlIFdpbmRvd0luc2V0cyNnZXRTeXN0ZW1XaW5kb3dJbnNldFRvcCgpCisgICAgICovCisgICAgQE51bGxhYmxlCisgICAgcHVibGljIFJlY3QgZ2V0U2NyZWVuUmVjdFdpdGhvdXRTeXN0ZW1XaW5kb3dJbnNldCgpIHsKKyAgICAgICAgaWYgKG1EaXNwbGF5U2l6ZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAobVN5c3RlbVdpbmRvd0luc2V0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVjdCgwLCAwLCBtRGlzcGxheVNpemUueCwgbURpc3BsYXlTaXplLnkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgUmVjdChtU3lzdGVtV2luZG93SW5zZXQubGVmdCwgbVN5c3RlbVdpbmRvd0luc2V0LnRvcCwKKyAgICAgICAgICAgICAgICBtRGlzcGxheVNpemUueCAtIG1TeXN0ZW1XaW5kb3dJbnNldC5yaWdodCwKKyAgICAgICAgICAgICAgICBtRGlzcGxheVNpemUueSAtIG1TeXN0ZW1XaW5kb3dJbnNldC5ib3R0b20pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNjcmVlbiBhcmVhIGluIHNjcmVlbiBjb29yZGluYXRlcyB0aGF0IGRvZXMgbm90IG92ZXJsYXAgd2l0aCB0aGUgc3RhYmxlCisgICAgICogaW5zZXQsIHdoaWNoIHJlcHJlc2VudHMgdGhlIGFyZWEgb2YgYSBmdWxsLXNjcmVlbiB3aW5kb3cgdGhhdCA8Yj5tYXk8L2I+IGJlIHBhcnRpYWxseSBvcgorICAgICAqIGZ1bGx5IG9ic2N1cmVkIGJ5IHRoZSBzeXN0ZW0gVUkgZWxlbWVudHMuCisgICAgICoKKyAgICAgKiA8cD5NYXkgcmV0dXJuIHtAY29kZSBudWxsfSB3aGVuIHRoaXMgaW5mb3JtYXRpb24gaXMgbm90IHlldCByZWFkeS48L3A+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIFJlZ2lvbiBpbiBzY3JlZW4gY29vcmRpbmF0ZXMuIHtAY29kZSBudWxsfSB3aGVuIGl0IGlzIG5vdCBhdmFpbGFibGUKKyAgICAgKgorICAgICAqIEBzZWUgV2luZG93SW5zZXRzI2hhc1N0YWJsZUluc2V0cygpCisgICAgICogQHNlZSBXaW5kb3dJbnNldHMjZ2V0U3RhYmxlSW5zZXRCb3R0b20oKQorICAgICAqIEBzZWUgV2luZG93SW5zZXRzI2dldFN0YWJsZUluc2V0TGVmdCgpCisgICAgICogQHNlZSBXaW5kb3dJbnNldHMjZ2V0U3RhYmxlSW5zZXRSaWdodCgpCisgICAgICogQHNlZSBXaW5kb3dJbnNldHMjZ2V0U3RhYmxlSW5zZXRUb3AoKQorICAgICAqLworICAgIEBOdWxsYWJsZQorICAgIHB1YmxpYyBSZWN0IGdldFNjcmVlblJlY3RXaXRob3V0U3RhYmxlSW5zZXQoKSB7CisgICAgICAgIGlmIChtRGlzcGxheVNpemUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1TdGFibGVJbnNldCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlY3QoMCwgMCwgbURpc3BsYXlTaXplLngsIG1EaXNwbGF5U2l6ZS55KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IFJlY3QobVN0YWJsZUluc2V0LmxlZnQsIG1TdGFibGVJbnNldC50b3AsCisgICAgICAgICAgICAgICAgbURpc3BsYXlTaXplLnggLSBtU3RhYmxlSW5zZXQucmlnaHQsCisgICAgICAgICAgICAgICAgbURpc3BsYXlTaXplLnkgLSBtU3RhYmxlSW5zZXQuYm90dG9tKTsKKyAgICB9CisKKyAgICBJbWVMYXlvdXRJbmZvKEBOb25OdWxsIFJlY3QgbmV3TGF5b3V0LCBATm9uTnVsbCBSZWN0IG9sZExheW91dCwKKyAgICAgICAgICAgIEBOb25OdWxsIFBvaW50IHZpZXdPcmlnaW5PblNjcmVlbiwgQE51bGxhYmxlIFBvaW50IGRpc3BsYXlTaXplLAorICAgICAgICAgICAgQE51bGxhYmxlIFJlY3Qgc3lzdGVtV2luZG93SW5zZXQsIEBOdWxsYWJsZSBSZWN0IHN0YWJsZUluc2V0KSB7CisgICAgICAgIG1OZXdMYXlvdXQgPSBuZXcgUmVjdChuZXdMYXlvdXQpOworICAgICAgICBtT2xkTGF5b3V0ID0gbmV3IFJlY3Qob2xkTGF5b3V0KTsKKyAgICAgICAgbVZpZXdPcmlnaW5PblNjcmVlbiA9IG5ldyBQb2ludCh2aWV3T3JpZ2luT25TY3JlZW4pOworICAgICAgICBtRGlzcGxheVNpemUgPSBuZXcgUG9pbnQoZGlzcGxheVNpemUpOworICAgICAgICBtU3lzdGVtV2luZG93SW5zZXQgPSBzeXN0ZW1XaW5kb3dJbnNldDsKKyAgICAgICAgbVN0YWJsZUluc2V0ID0gc3RhYmxlSW5zZXQ7CisgICAgfQorCisgICAgdm9pZCB3cml0ZVRvQnVuZGxlKEBOb25OdWxsIEJ1bmRsZSBidW5kbGUpIHsKKyAgICAgICAgYnVuZGxlLnB1dFBhcmNlbGFibGUoTkVXX0xBWU9VVF9LRVksIG1OZXdMYXlvdXQpOworICAgICAgICBidW5kbGUucHV0UGFyY2VsYWJsZShPTERfTEFZT1VUX0tFWSwgbU9sZExheW91dCk7CisgICAgICAgIGJ1bmRsZS5wdXRQYXJjZWxhYmxlKFZJRVdfT1JJR0lOX09OX1NDUkVFTl9LRVksIG1WaWV3T3JpZ2luT25TY3JlZW4pOworICAgICAgICBidW5kbGUucHV0UGFyY2VsYWJsZShESVNQTEFZX1NJWkVfS0VZLCBtRGlzcGxheVNpemUpOworICAgICAgICBidW5kbGUucHV0UGFyY2VsYWJsZShTWVNURU1fV0lORE9XX0lOU0VUX0tFWSwgbVN5c3RlbVdpbmRvd0luc2V0KTsKKyAgICAgICAgYnVuZGxlLnB1dFBhcmNlbGFibGUoU1RBQkxFX0lOU0VUX0tFWSwgbVN0YWJsZUluc2V0KTsKKyAgICB9CisKKyAgICBzdGF0aWMgSW1lTGF5b3V0SW5mbyByZWFkRnJvbUJ1bmRsZShATm9uTnVsbCBCdW5kbGUgYnVuZGxlKSB7CisgICAgICAgIGZpbmFsIFJlY3QgbmV3TGF5b3V0ID0gYnVuZGxlLmdldFBhcmNlbGFibGUoTkVXX0xBWU9VVF9LRVkpOworICAgICAgICBmaW5hbCBSZWN0IG9sZExheW91dCA9IGJ1bmRsZS5nZXRQYXJjZWxhYmxlKE9MRF9MQVlPVVRfS0VZKTsKKyAgICAgICAgZmluYWwgUG9pbnQgdmlld09yaWdpbiA9IGJ1bmRsZS5nZXRQYXJjZWxhYmxlKFZJRVdfT1JJR0lOX09OX1NDUkVFTl9LRVkpOworICAgICAgICBmaW5hbCBQb2ludCBkaXNwbGF5U2l6ZSA9IGJ1bmRsZS5nZXRQYXJjZWxhYmxlKERJU1BMQVlfU0laRV9LRVkpOworICAgICAgICBmaW5hbCBSZWN0IHN5c3RlbVdpbmRvd0luc2V0ID0gYnVuZGxlLmdldFBhcmNlbGFibGUoU1lTVEVNX1dJTkRPV19JTlNFVF9LRVkpOworICAgICAgICBmaW5hbCBSZWN0IHN0YWJsZUluc2V0ID0gYnVuZGxlLmdldFBhcmNlbGFibGUoU1RBQkxFX0lOU0VUX0tFWSk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBJbWVMYXlvdXRJbmZvKG5ld0xheW91dCwgb2xkTGF5b3V0LCB2aWV3T3JpZ2luLCBkaXNwbGF5U2l6ZSwgc3lzdGVtV2luZG93SW5zZXQsCisgICAgICAgICAgICAgICAgc3RhYmxlSW5zZXQpOworICAgIH0KKworICAgIHN0YXRpYyBJbWVMYXlvdXRJbmZvIGZyb21MYXlvdXRMaXN0ZW5lckNhbGxiYWNrKFZpZXcgdiwgaW50IGxlZnQsIGludCB0b3AsIGludCByaWdodCwKKyAgICAgICAgICAgIGludCBib3R0b20sIGludCBvbGRMZWZ0LCBpbnQgb2xkVG9wLCBpbnQgb2xkUmlnaHQsIGludCBvbGRCb3R0b20pIHsKKyAgICAgICAgZmluYWwgUmVjdCBuZXdMYXlvdXQgPSBuZXcgUmVjdChsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOworICAgICAgICBmaW5hbCBSZWN0IG9sZExheW91dCA9IG5ldyBSZWN0KG9sZExlZnQsIG9sZFRvcCwgb2xkUmlnaHQsIG9sZEJvdHRvbSk7CisgICAgICAgIGZpbmFsIGludFtdIHZpZXdPcmlnaW5BcnJheSA9IG5ldyBpbnRbMl07CisgICAgICAgIHYuZ2V0TG9jYXRpb25PblNjcmVlbih2aWV3T3JpZ2luQXJyYXkpOworICAgICAgICBmaW5hbCBQb2ludCB2aWV3T3JpZ2luID0gbmV3IFBvaW50KHZpZXdPcmlnaW5BcnJheVswXSwgdmlld09yaWdpbkFycmF5WzFdKTsKKyAgICAgICAgZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gdi5nZXREaXNwbGF5KCk7CisgICAgICAgIGZpbmFsIFBvaW50IGRpc3BsYXlTaXplOworICAgICAgICBpZiAoZGlzcGxheSAhPSBudWxsKSB7CisgICAgICAgICAgICBkaXNwbGF5U2l6ZSA9IG5ldyBQb2ludCgpOworICAgICAgICAgICAgZGlzcGxheS5nZXRSZWFsU2l6ZShkaXNwbGF5U2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkaXNwbGF5U2l6ZSA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgV2luZG93SW5zZXRzIHdpbmRvd0luc2V0cyA9IHYuZ2V0Um9vdFdpbmRvd0luc2V0cygpOworICAgICAgICBmaW5hbCBSZWN0IHN5c3RlbVdpbmRvd0luc2V0OworICAgICAgICBpZiAod2luZG93SW5zZXRzICE9IG51bGwgJiYgd2luZG93SW5zZXRzLmhhc1N5c3RlbVdpbmRvd0luc2V0cygpKSB7CisgICAgICAgICAgICBzeXN0ZW1XaW5kb3dJbnNldCA9IG5ldyBSZWN0KAorICAgICAgICAgICAgICAgICAgICB3aW5kb3dJbnNldHMuZ2V0U3lzdGVtV2luZG93SW5zZXRMZWZ0KCksIHdpbmRvd0luc2V0cy5nZXRTeXN0ZW1XaW5kb3dJbnNldFRvcCgpLAorICAgICAgICAgICAgICAgICAgICB3aW5kb3dJbnNldHMuZ2V0U3lzdGVtV2luZG93SW5zZXRSaWdodCgpLAorICAgICAgICAgICAgICAgICAgICB3aW5kb3dJbnNldHMuZ2V0U3lzdGVtV2luZG93SW5zZXRCb3R0b20oKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzeXN0ZW1XaW5kb3dJbnNldCA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgUmVjdCBzdGFibGVJbnNldDsKKyAgICAgICAgaWYgKHdpbmRvd0luc2V0cyAhPSBudWxsICYmIHdpbmRvd0luc2V0cy5oYXNTdGFibGVJbnNldHMoKSkgeworICAgICAgICAgICAgc3RhYmxlSW5zZXQgPSBuZXcgUmVjdCgKKyAgICAgICAgICAgICAgICAgICAgd2luZG93SW5zZXRzLmdldFN0YWJsZUluc2V0TGVmdCgpLCB3aW5kb3dJbnNldHMuZ2V0U3RhYmxlSW5zZXRUb3AoKSwKKyAgICAgICAgICAgICAgICAgICAgd2luZG93SW5zZXRzLmdldFN0YWJsZUluc2V0UmlnaHQoKSwgd2luZG93SW5zZXRzLmdldFN0YWJsZUluc2V0Qm90dG9tKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhYmxlSW5zZXQgPSBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgSW1lTGF5b3V0SW5mbyhuZXdMYXlvdXQsIG9sZExheW91dCwgdmlld09yaWdpbiwgZGlzcGxheVNpemUsIHN5c3RlbVdpbmRvd0luc2V0LAorICAgICAgICAgICAgICAgIHN0YWJsZUluc2V0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnB1dG1ldGhvZC9tb2NraW1lL3NyYy9jb20vYW5kcm9pZC9jdHMvbW9ja2ltZS9JbWVTZXR0aW5ncy5qYXZhIGIvdGVzdHMvaW5wdXRtZXRob2QvbW9ja2ltZS9zcmMvY29tL2FuZHJvaWQvY3RzL21vY2tpbWUvSW1lU2V0dGluZ3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzY5YTJmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW5wdXRtZXRob2QvbW9ja2ltZS9zcmMvY29tL2FuZHJvaWQvY3RzL21vY2tpbWUvSW1lU2V0dGluZ3MuamF2YQpAQCAtMCwwICsxLDIwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY3RzLm1vY2tpbWU7CisKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBlcnNpc3RhYmxlQnVuZGxlOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uQ29sb3JJbnQ7CitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5Ob25OdWxsOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTnVsbGFibGU7CisKKy8qKgorICogQW4gaW1tdXRhYmxlIGRhdGEgc3RvcmUgdG8gY29udHJvbCB0aGUgYmVoYXZpb3Igb2Yge0BsaW5rIE1vY2tJbWV9LgorICovCitwdWJsaWMgY2xhc3MgSW1lU2V0dGluZ3MgeworCisgICAgQE5vbk51bGwKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtRXZlbnRDYWxsYmFja0FjdGlvbk5hbWU7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFDS0dST1VORF9DT0xPUl9LRVkgPSAiQmFja2dyb3VuZENvbG9yIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFWSUdBVElPTl9CQVJfQ09MT1JfS0VZID0gIk5hdmlnYXRpb25CYXJDb2xvciI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOUFVUX1ZJRVdfSEVJR0hUX1dJVEhPVVRfU1lTVEVNX1dJTkRPV19JTlNFVCA9CisgICAgICAgICAgICAiSW5wdXRWaWV3SGVpZ2h0V2l0aG91dFN5c3RlbVdpbmRvd0luc2V0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0lORE9XX0ZMQUdTID0gIldpbmRvd0ZsYWdzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0lORE9XX0ZMQUdTX01BU0sgPSAiV2luZG93RmxhZ3NNYXNrIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlVMTFNDUkVFTl9NT0RFX0FMTE9XRUQgPSAiRnVsbHNjcmVlbk1vZGVBbGxvd2VkIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5QVVRfVklFV19TWVNURU1fVUlfVklTSUJJTElUWSA9ICJJbnB1dFZpZXdTeXN0ZW1VaVZpc2liaWxpdHkiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIQVJEX0tFWUJPQVJEX0NPTkZJR1VSQVRJT05fQkVIQVZJT1JfQUxMT1dFRCA9CisgICAgICAgICAgICAiSGFyZEtleWJvYXJkQ29uZmlndXJhdGlvbkJlaGF2aW9yQWxsb3dlZCI7CisKKyAgICBATm9uTnVsbAorICAgIHByaXZhdGUgZmluYWwgUGVyc2lzdGFibGVCdW5kbGUgbUJ1bmRsZTsKKworICAgIEltZVNldHRpbmdzKEBOb25OdWxsIFBhcmNlbCBwYXJjZWwpIHsKKyAgICAgICAgbUV2ZW50Q2FsbGJhY2tBY3Rpb25OYW1lID0gcGFyY2VsLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgbUJ1bmRsZSA9IHBhcmNlbC5yZWFkUGVyc2lzdGFibGVCdW5kbGUoKTsKKyAgICB9CisKKyAgICBATnVsbGFibGUKKyAgICBTdHJpbmcgZ2V0RXZlbnRDYWxsYmFja0FjdGlvbk5hbWUoKSB7CisgICAgICAgIHJldHVybiBtRXZlbnRDYWxsYmFja0FjdGlvbk5hbWU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZnVsbHNjcmVlbk1vZGVBbGxvd2VkKGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7CisgICAgICAgIHJldHVybiBtQnVuZGxlLmdldEJvb2xlYW4oRlVMTFNDUkVFTl9NT0RFX0FMTE9XRUQsIGRlZmF1bHRWYWx1ZSk7CisgICAgfQorCisgICAgQENvbG9ySW50CisgICAgcHVibGljIGludCBnZXRCYWNrZ3JvdW5kQ29sb3IoQENvbG9ySW50IGludCBkZWZhdWx0Q29sb3IpIHsKKyAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0SW50KEJBQ0tHUk9VTkRfQ09MT1JfS0VZLCBkZWZhdWx0Q29sb3IpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc05hdmlnYXRpb25CYXJDb2xvcigpIHsKKyAgICAgICAgcmV0dXJuIG1CdW5kbGUua2V5U2V0KCkuY29udGFpbnMoTkFWSUdBVElPTl9CQVJfQ09MT1JfS0VZKTsKKyAgICB9CisKKyAgICBAQ29sb3JJbnQKKyAgICBwdWJsaWMgaW50IGdldE5hdmlnYXRpb25CYXJDb2xvcigpIHsKKyAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0SW50KE5BVklHQVRJT05fQkFSX0NPTE9SX0tFWSk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRJbnB1dFZpZXdIZWlnaHRXaXRob3V0U3lzdGVtV2luZG93SW5zZXQoaW50IGRlZmF1bHRIZWlnaHQpIHsKKyAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0SW50KElOUFVUX1ZJRVdfSEVJR0hUX1dJVEhPVVRfU1lTVEVNX1dJTkRPV19JTlNFVCwgZGVmYXVsdEhlaWdodCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRXaW5kb3dGbGFncyhpbnQgZGVmYXVsdEZsYWdzKSB7CisgICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludChXSU5ET1dfRkxBR1MsIGRlZmF1bHRGbGFncyk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRXaW5kb3dGbGFnc01hc2soaW50IGRlZmF1bHRGbGFncykgeworICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRJbnQoV0lORE9XX0ZMQUdTX01BU0ssIGRlZmF1bHRGbGFncyk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRJbnB1dFZpZXdTeXN0ZW1VaVZpc2liaWxpdHkoaW50IGRlZmF1bHRGbGFncykgeworICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRJbnQoSU5QVVRfVklFV19TWVNURU1fVUlfVklTSUJJTElUWSwgZGVmYXVsdEZsYWdzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRIYXJkS2V5Ym9hcmRDb25maWd1cmF0aW9uQmVoYXZpb3JBbGxvd2VkKGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7CisgICAgICAgIHJldHVybiBtQnVuZGxlLmdldEJvb2xlYW4oSEFSRF9LRVlCT0FSRF9DT05GSUdVUkFUSU9OX0JFSEFWSU9SX0FMTE9XRUQsIGRlZmF1bHRWYWx1ZSk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgd3JpdGVUb1BhcmNlbChATm9uTnVsbCBQYXJjZWwgcGFyY2VsLCBATm9uTnVsbCBTdHJpbmcgZXZlbnRDYWxsYmFja0FjdGlvbk5hbWUsCisgICAgICAgICAgICBATnVsbGFibGUgQnVpbGRlciBidWlsZGVyKSB7CisgICAgICAgIHBhcmNlbC53cml0ZVN0cmluZyhldmVudENhbGxiYWNrQWN0aW9uTmFtZSk7CisgICAgICAgIGlmIChidWlsZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHBhcmNlbC53cml0ZVBlcnNpc3RhYmxlQnVuZGxlKGJ1aWxkZXIubUJ1bmRsZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwYXJjZWwud3JpdGVQZXJzaXN0YWJsZUJ1bmRsZShQZXJzaXN0YWJsZUJ1bmRsZS5FTVBUWSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgYnVpbGRlciBjbGFzcyBmb3Ige0BsaW5rIEltZVNldHRpbmdzfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXIgeworICAgICAgICBwcml2YXRlIGZpbmFsIFBlcnNpc3RhYmxlQnVuZGxlIG1CdW5kbGUgPSBuZXcgUGVyc2lzdGFibGVCdW5kbGUoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29udHJvbHMgd2hldGhlciBmdWxsc2NyZWVuIG1vZGUgaXMgYWxsb3dlZCBvciBub3QuCisgICAgICAgICAqCisgICAgICAgICAqIDxwPkJ5IGRlZmF1bHQsIGZ1bGxzY3JlZW4gbW9kZSBpcyBub3QgYWxsb3dlZCBpbiB7QGxpbmsgTW9ja0ltZX0uPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYWxsb3dlZCB7QGNvZGUgdHJ1ZX0gaWYgZnVsbHNjcmVlbiBtb2RlIGlzIGFsbG93ZWQKKyAgICAgICAgICogQHNlZSBNb2NrSW1lI29uRXZhbHVhdGVGdWxsc2NyZWVuTW9kZSgpCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRGdWxsc2NyZWVuTW9kZUFsbG93ZWQoYm9vbGVhbiBhbGxvd2VkKSB7CisgICAgICAgICAgICBtQnVuZGxlLnB1dEJvb2xlYW4oRlVMTFNDUkVFTl9NT0RFX0FMTE9XRUQsIGFsbG93ZWQpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUge0BsaW5rIE1vY2tJbWV9LgorICAgICAgICAgKiBAcGFyYW0gY29sb3IgYmFja2dyb3VuZCBjb2xvciB0byBiZSB1c2VkCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRCYWNrZ3JvdW5kQ29sb3IoQENvbG9ySW50IGludCBjb2xvcikgeworICAgICAgICAgICAgbUJ1bmRsZS5wdXRJbnQoQkFDS0dST1VORF9DT0xPUl9LRVksIGNvbG9yKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdGhlIGNvbG9yIHRvIGJlIHBhc3NlZCB0byB7QGxpbmsgYW5kcm9pZC52aWV3LldpbmRvdyNzZXROYXZpZ2F0aW9uQmFyQ29sb3IoaW50KX0uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjb2xvciBjb2xvciB0byBiZSBwYXNzZWQgdG8ge0BsaW5rIGFuZHJvaWQudmlldy5XaW5kb3cjc2V0TmF2aWdhdGlvbkJhckNvbG9yKGludCl9CisgICAgICAgICAqIEBzZWUgYW5kcm9pZC52aWV3LlZpZXcKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldE5hdmlnYXRpb25CYXJDb2xvcihAQ29sb3JJbnQgaW50IGNvbG9yKSB7CisgICAgICAgICAgICBtQnVuZGxlLnB1dEludChOQVZJR0FUSU9OX0JBUl9DT0xPUl9LRVksIGNvbG9yKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdGhlIGlucHV0IHZpZXcgaGVpZ2h0IG1lYXN1cmVkIGZyb20gdGhlIGJvdHRvbSBzeXN0ZW0gd2luZG93IGluc2V0LgorICAgICAgICAgKiBAcGFyYW0gaGVpZ2h0IGhlaWdodCBvZiB0aGUgc29mdCBpbnB1dCB2aWV3LiBUaGlzIGRvZXMgbm90IGluY2x1ZGUgdGhlIHN5c3RlbSB3aW5kb3cKKyAgICAgICAgICogICAgICAgICAgICAgICBpbnNldCBzdWNoIGFzIG5hdmlnYXRpb24gYmFyCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRJbnB1dFZpZXdIZWlnaHRXaXRob3V0U3lzdGVtV2luZG93SW5zZXQoaW50IGhlaWdodCkgeworICAgICAgICAgICAgbUJ1bmRsZS5wdXRJbnQoSU5QVVRfVklFV19IRUlHSFRfV0lUSE9VVF9TWVNURU1fV0lORE9XX0lOU0VULCBoZWlnaHQpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB3aW5kb3cgZmxhZ3MgdG8gYmUgc3BlY2lmaWVkIHRvIHtAbGluayBhbmRyb2lkLnZpZXcuV2luZG93I3NldEZsYWdzKGludCwgaW50KX0gb2YKKyAgICAgICAgICogdGhlIG1haW4ge0BsaW5rIE1vY2tJbWV9IHdpbmRvdy4KKyAgICAgICAgICoKKyAgICAgICAgICogPHA+V2hlbiB7QGxpbmsgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zI0ZMQUdfTEFZT1VUX0lOX09WRVJTQ0FOfSBpcyBzZXQsCisgICAgICAgICAqIHtAbGluayBNb2NrSW1lfSB0cmllcyB0byByZW5kZXIgdGhlIG5hdmlnYXRpb24gYmFyIGJ5IGl0c2VsZi48L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBmbGFncyBmbGFncyB0byBiZSBzcGVjaWZpZWQKKyAgICAgICAgICogQHBhcmFtIGZsYWdzTWFzayBtYXNrIGJpdHMgdGhhdCBzcGVjaWZ5IHdoYXQgYml0cyBuZWVkIHRvIGJlIGNsZWFyZWQgYmVmb3JlIHNldHRpbmcKKyAgICAgICAgICogICAgICAgICAgICAgICAgICB7QGNvZGUgZmxhZ3N9CisgICAgICAgICAqIEBzZWUgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFdpbmRvd0ZsYWdzKGludCBmbGFncywgaW50IGZsYWdzTWFzaykgeworICAgICAgICAgICAgbUJ1bmRsZS5wdXRJbnQoV0lORE9XX0ZMQUdTLCBmbGFncyk7CisgICAgICAgICAgICBtQnVuZGxlLnB1dEludChXSU5ET1dfRkxBR1NfTUFTSywgZmxhZ3NNYXNrKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgZmxhZ3MgdG8gYmUgc3BlY2lmaWVkIHRvIHtAbGluayBhbmRyb2lkLnZpZXcuVmlldyNzZXRTeXN0ZW1VaVZpc2liaWxpdHkoaW50KX0gb2YKKyAgICAgICAgICogdGhlIG1haW4gc29mdCBpbnB1dCB2aWV3ICh0aGUgcmV0dXJuZWQgdmlldyBmcm9tIHtAbGluayBNb2NrSW1lI29uQ3JlYXRlSW5wdXRWaWV3KCl9KS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHZpc2liaWxpdHlGbGFncyBmbGFncyB0byBiZSBzcGVjaWZpZWQKKyAgICAgICAgICogQHNlZSBhbmRyb2lkLnZpZXcuVmlldworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0SW5wdXRWaWV3U3lzdGVtVWlWaXNpYmlsaXR5KGludCB2aXNpYmlsaXR5RmxhZ3MpIHsKKyAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KElOUFVUX1ZJRVdfU1lTVEVNX1VJX1ZJU0lCSUxJVFksIHZpc2liaWxpdHlGbGFncyk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb250cm9scyB3aGV0aGVyIHtAbGluayBNb2NrSW1lfSBpcyBhbGxvd2VkIHRvIGNoYW5nZSB0aGUgYmVoYXZpb3IgYmFzZWQgb24KKyAgICAgICAgICoge0BsaW5rIGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbiNrZXlib2FyZH0gYW5kCisgICAgICAgICAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb24jaGFyZEtleWJvYXJkSGlkZGVufS4KKyAgICAgICAgICoKKyAgICAgICAgICogPHA+TWV0aG9kcyBpbiB7QGxpbmsgYW5kcm9pZC5pbnB1dG1ldGhvZHNlcnZpY2UuSW5wdXRNZXRob2RTZXJ2aWNlfSBzdWNoIGFzCisgICAgICAgICAqIHtAbGluayBhbmRyb2lkLmlucHV0bWV0aG9kc2VydmljZS5JbnB1dE1ldGhvZFNlcnZpY2Ujb25FdmFsdWF0ZUlucHV0Vmlld1Nob3duKCl9IGFuZAorICAgICAgICAgKiB7QGxpbmsgYW5kcm9pZC5pbnB1dG1ldGhvZHNlcnZpY2UuSW5wdXRNZXRob2RTZXJ2aWNlI29uU2hvd0lucHV0UmVxdWVzdGVkKGludCwgYm9vbGVhbil9CisgICAgICAgICAqIGNoYW5nZSB0aGVpciBiZWhhdmlvcnMgd2hlbiBhIGhhcmR3YXJlIGtleWJvYXJkIGlzIGF0dGFjaGVkLiAgVGhpcyBpcyBjb25mdXNpbmcgd2hlbgorICAgICAgICAgKiB3cml0aW5nIHRlc3RzIHNvIGJ5IGRlZmF1bHQge0BsaW5rIE1vY2tJbWV9IHRyaWVzIHRvIGNhbmNlbCB0aG9zZSBiZWhhdmlvcnMuICBUaGlzCisgICAgICAgICAqIHNldHRpbmdzIHJlLWVuYWJsZXMgc3VjaCBhIGJlaGF2aW9yLjwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFsbG93ZWQge0Bjb2RlIHRydWV9IHdoZW4ge0BsaW5rIE1vY2tJbWV9IGlzIGFsbG93ZWQgdG8gY2hhbmdlIHRoZSBiZWhhdmlvciB3aGVuCisgICAgICAgICAqICAgICAgICAgICAgICAgIGEgaGFyZHdhcmUga2V5Ym9hcmQgaXMgYXR0YWNoZWQKKyAgICAgICAgICoKKyAgICAgICAgICogQHNlZSBhbmRyb2lkLmlucHV0bWV0aG9kc2VydmljZS5JbnB1dE1ldGhvZFNlcnZpY2Ujb25FdmFsdWF0ZUlucHV0Vmlld1Nob3duKCkKKyAgICAgICAgICogQHNlZSBhbmRyb2lkLmlucHV0bWV0aG9kc2VydmljZS5JbnB1dE1ldGhvZFNlcnZpY2Ujb25TaG93SW5wdXRSZXF1ZXN0ZWQoaW50LCBib29sZWFuKQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0SGFyZEtleWJvYXJkQ29uZmlndXJhdGlvbkJlaGF2aW9yQWxsb3dlZChib29sZWFuIGFsbG93ZWQpIHsKKyAgICAgICAgICAgIG1CdW5kbGUucHV0Qm9vbGVhbihIQVJEX0tFWUJPQVJEX0NPTkZJR1VSQVRJT05fQkVIQVZJT1JfQUxMT1dFRCwgYWxsb3dlZCk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2lucHV0bWV0aG9kL21vY2tpbWUvc3JjL2NvbS9hbmRyb2lkL2N0cy9tb2NraW1lL0ltZVN0YXRlLmphdmEgYi90ZXN0cy9pbnB1dG1ldGhvZC9tb2NraW1lL3NyYy9jb20vYW5kcm9pZC9jdHMvbW9ja2ltZS9JbWVTdGF0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMzliYWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnB1dG1ldGhvZC9tb2NraW1lL3NyYy9jb20vYW5kcm9pZC9jdHMvbW9ja2ltZS9JbWVTdGF0ZS5qYXZhCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5tb2NraW1lOworCitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5Ob25OdWxsOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTnVsbGFibGU7CisKKy8qKgorICogQW4gaW1tdXRhYmxlIG9iamVjdCB0aGF0IHN0b3JlcyBzZXZlcmFsIHJ1bnRpbWUgc3RhdGUgb2Yge0BsaW5rIE1vY2tJbWV9LgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgSW1lU3RhdGUgeworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtSGFzSW5wdXRCaW5kaW5nOworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtSGFzRHVtbXlJbnB1dENvbm5lY3Rpb247CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB7QGxpbmsgTW9ja0ltZSNnZXRDdXJyZW50SW5wdXRCaW5kaW5nKCl9IHJldHVybmVkIG5vbi1udWxsCisgICAgICogICAgICAgICB7QGxpbmsgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0QmluZGluZ30gd2hlbiB0aGlzIHNuYXBzaG90IHdhcyB0YWtlbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNJbnB1dEJpbmRpbmcoKSB7CisgICAgICAgIHJldHVybiBtSGFzSW5wdXRCaW5kaW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHtAbGluayBNb2NrSW1lI2dldEN1cnJlbnRJbnB1dENvbm5lY3Rpb24oKX0gcmV0dXJuZWQgbm9uLWR1bW15CisgICAgICogICAgICAgICB7QGxpbmsgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0Q29ubmVjdGlvbn0gd2hlbiB0aGlzIHNuYXBzaG90IHdhcyB0YWtlbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNEdW1teUlucHV0Q29ubmVjdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG1IYXNEdW1teUlucHV0Q29ubmVjdGlvbjsKKyAgICB9CisKKyAgICBJbWVTdGF0ZShib29sZWFuIGhhc0lucHV0QmluZGluZywgYm9vbGVhbiBoYXNEdW1teUlucHV0Q29ubmVjdGlvbikgeworICAgICAgICBtSGFzSW5wdXRCaW5kaW5nID0gaGFzSW5wdXRCaW5kaW5nOworICAgICAgICBtSGFzRHVtbXlJbnB1dENvbm5lY3Rpb24gPSBoYXNEdW1teUlucHV0Q29ubmVjdGlvbjsKKyAgICB9CisKKyAgICBATm9uTnVsbAorICAgIEJ1bmRsZSB0b0J1bmRsZSgpIHsKKyAgICAgICAgZmluYWwgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgYnVuZGxlLnB1dEJvb2xlYW4oIm1IYXNJbnB1dEJpbmRpbmciLCBtSGFzSW5wdXRCaW5kaW5nKTsKKyAgICAgICAgYnVuZGxlLnB1dEJvb2xlYW4oIm1IYXNEdW1teUlucHV0Q29ubmVjdGlvbiIsIG1IYXNEdW1teUlucHV0Q29ubmVjdGlvbik7CisgICAgICAgIHJldHVybiBidW5kbGU7CisgICAgfQorCisgICAgQE51bGxhYmxlCisgICAgc3RhdGljIEltZVN0YXRlIGZyb21CdW5kbGUoQE51bGxhYmxlIEJ1bmRsZSBidW5kbGUpIHsKKyAgICAgICAgaWYgKGJ1bmRsZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBib29sZWFuIGhhc0lucHV0QmluZGluZyA9IGJ1bmRsZS5nZXRCb29sZWFuKCJtSGFzSW5wdXRCaW5kaW5nIik7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaGFzRHVtbXlJbnB1dENvbm5lY3Rpb24gPSBidW5kbGUuZ2V0Qm9vbGVhbigibUhhc0R1bW15SW5wdXRDb25uZWN0aW9uIik7CisgICAgICAgIHJldHVybiBuZXcgSW1lU3RhdGUoaGFzSW5wdXRCaW5kaW5nLCBoYXNEdW1teUlucHV0Q29ubmVjdGlvbik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW5wdXRtZXRob2QvbW9ja2ltZS9zcmMvY29tL2FuZHJvaWQvY3RzL21vY2tpbWUvTW9ja0ltZS5qYXZhIGIvdGVzdHMvaW5wdXRtZXRob2QvbW9ja2ltZS9zcmMvY29tL2FuZHJvaWQvY3RzL21vY2tpbWUvTW9ja0ltZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzYTk0NDYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnB1dG1ldGhvZC9tb2NraW1lL3NyYy9jb20vYW5kcm9pZC9jdHMvbW9ja2ltZS9Nb2NrSW1lLmphdmEKQEAgLTAsMCArMSw2OTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5tb2NraW1lOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0RSQVdTX1NZU1RFTV9CQVJfQkFDS0dST1VORFM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY3RzLm1vY2tpbWUuTW9ja0ltZVNlc3Npb24uTU9DS19JTUVfU0VUVElOR1NfRklMRTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQuaW5wdXRtZXRob2RzZXJ2aWNlLklucHV0TWV0aG9kU2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7CitpbXBvcnQgYW5kcm9pZC5vcy5SZXN1bHRSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uQW55VGhyZWFkOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uQ2FsbFN1cGVyOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTm9uTnVsbDsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uV29ya2VyVGhyZWFkOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvdzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93SW5zZXRzOworaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5FZGl0b3JJbmZvOworaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dEJpbmRpbmc7CitpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0TWV0aG9kOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5SZWxhdGl2ZUxheW91dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljUmVmZXJlbmNlOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Cb29sZWFuU3VwcGxpZXI7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKKworLyoqCisgKiBNb2NrIElNRSBmb3IgZW5kLXRvLWVuZCB0ZXN0cy4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE1vY2tJbWUgZXh0ZW5kcyBJbnB1dE1ldGhvZFNlcnZpY2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNb2NrSW1lIjsKKworICAgIHN0YXRpYyBDb21wb25lbnROYW1lIGdldENvbXBvbmVudE5hbWUoQE5vbk51bGwgU3RyaW5nIHBhY2thZ2VOYW1lKSB7CisgICAgICAgIHJldHVybiBuZXcgQ29tcG9uZW50TmFtZShwYWNrYWdlTmFtZSwgTW9ja0ltZS5jbGFzcy5nZXROYW1lKCkpOworICAgIH0KKworICAgIHN0YXRpYyBTdHJpbmcgZ2V0SW1lSWQoQE5vbk51bGwgU3RyaW5nIHBhY2thZ2VOYW1lKSB7CisgICAgICAgIHJldHVybiBuZXcgQ29tcG9uZW50TmFtZShwYWNrYWdlTmFtZSwgTW9ja0ltZS5jbGFzcy5nZXROYW1lKCkpLmZsYXR0ZW5Ub1Nob3J0U3RyaW5nKCk7CisgICAgfQorCisgICAgc3RhdGljIFN0cmluZyBnZXRDb21tYW5kQWN0aW9uTmFtZShATm9uTnVsbCBTdHJpbmcgZXZlbnRBY3Rpb25OYW1lKSB7CisgICAgICAgIHJldHVybiBldmVudEFjdGlvbk5hbWUgKyAiLmNvbW1hbmQiOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgSGFuZGxlclRocmVhZCBtSGFuZGxlclRocmVhZCA9IG5ldyBIYW5kbGVyVGhyZWFkKCJDb21tYW5kUmVjZWl2ZXIiKTsKKworICAgIHByaXZhdGUgZmluYWwgSGFuZGxlciBtTWFpbkhhbmRsZXIgPSBuZXcgSGFuZGxlcigpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgQ29tbWFuZFJlY2VpdmVyIGV4dGVuZHMgQnJvYWRjYXN0UmVjZWl2ZXIgeworICAgICAgICBATm9uTnVsbAorICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQWN0aW9uTmFtZTsKKyAgICAgICAgQE5vbk51bGwKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb25zdW1lcjxJbWVDb21tYW5kPiBtT25SZWNlaXZlQ29tbWFuZDsKKworICAgICAgICBDb21tYW5kUmVjZWl2ZXIoQE5vbk51bGwgU3RyaW5nIGFjdGlvbk5hbWUsCisgICAgICAgICAgICAgICAgQE5vbk51bGwgQ29uc3VtZXI8SW1lQ29tbWFuZD4gb25SZWNlaXZlQ29tbWFuZCkgeworICAgICAgICAgICAgbUFjdGlvbk5hbWUgPSBhY3Rpb25OYW1lOworICAgICAgICAgICAgbU9uUmVjZWl2ZUNvbW1hbmQgPSBvblJlY2VpdmVDb21tYW5kOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuZXF1YWxzKG1BY3Rpb25OYW1lLCBpbnRlbnQuZ2V0QWN0aW9uKCkpKSB7CisgICAgICAgICAgICAgICAgbU9uUmVjZWl2ZUNvbW1hbmQuYWNjZXB0KEltZUNvbW1hbmQuZnJvbUJ1bmRsZShpbnRlbnQuZ2V0RXh0cmFzKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBXb3JrZXJUaHJlYWQKKyAgICBwcml2YXRlIHZvaWQgb25SZWNlaXZlQ29tbWFuZChATm9uTnVsbCBJbWVDb21tYW5kIGNvbW1hbmQpIHsKKyAgICAgICAgZ2V0VHJhY2VyKCkub25SZWNlaXZlQ29tbWFuZChjb21tYW5kLCAoKSAtPiB7CisgICAgICAgICAgICBpZiAoY29tbWFuZC5zaG91bGREaXNwYXRjaFRvTWFpblRocmVhZCgpKSB7CisgICAgICAgICAgICAgICAgbU1haW5IYW5kbGVyLnBvc3QoKCkgLT4gb25IYW5kbGVDb21tYW5kKGNvbW1hbmQpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb25IYW5kbGVDb21tYW5kKGNvbW1hbmQpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAQW55VGhyZWFkCisgICAgcHJpdmF0ZSB2b2lkIG9uSGFuZGxlQ29tbWFuZChATm9uTnVsbCBJbWVDb21tYW5kIGNvbW1hbmQpIHsKKyAgICAgICAgZ2V0VHJhY2VyKCkub25IYW5kbGVDb21tYW5kKGNvbW1hbmQsICgpIC0+IHsKKyAgICAgICAgICAgIGlmIChjb21tYW5kLnNob3VsZERpc3BhdGNoVG9NYWluVGhyZWFkKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoTG9vcGVyLm15TG9vcGVyKCkgIT0gTG9vcGVyLmdldE1haW5Mb29wZXIoKSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJjb21tYW5kICIgKyBjb21tYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHNob3VsZCBiZSBoYW5kbGVkIG9uIHRoZSBtYWluIHRocmVhZCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvbW1hbmQuZ2V0TmFtZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgImNvbW1pdFRleHQiOiB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDaGFyU2VxdWVuY2UgdGV4dCA9IGNvbW1hbmQuZ2V0RXh0cmFzKCkuZ2V0U3RyaW5nKCJ0ZXh0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbmV3Q3Vyc29yUG9zaXRpb24gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLmdldEV4dHJhcygpLmdldEludCgibmV3Q3Vyc29yUG9zaXRpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldEN1cnJlbnRJbnB1dENvbm5lY3Rpb24oKS5jb21taXRUZXh0KHRleHQsIG5ld0N1cnNvclBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhc2UgInNldEJhY2tEaXNwb3NpdGlvbiI6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBiYWNrRGlzcG9zaXRpb24gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLmdldEV4dHJhcygpLmdldEludCgiYmFja0Rpc3Bvc2l0aW9uIik7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRCYWNrRGlzcG9zaXRpb24oYmFja0Rpc3Bvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhc2UgInJlcXVlc3RIaWRlU2VsZiI6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBmbGFncyA9IGNvbW1hbmQuZ2V0RXh0cmFzKCkuZ2V0SW50KCJmbGFncyIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEhpZGVTZWxmKGZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhc2UgInJlcXVlc3RTaG93U2VsZiI6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBmbGFncyA9IGNvbW1hbmQuZ2V0RXh0cmFzKCkuZ2V0SW50KCJmbGFncyIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFNob3dTZWxmKGZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBATnVsbGFibGUKKyAgICBwcml2YXRlIENvbW1hbmRSZWNlaXZlciBtQ29tbWFuZFJlY2VpdmVyOworCisgICAgQE51bGxhYmxlCisgICAgcHJpdmF0ZSBJbWVTZXR0aW5ncyBtU2V0dGluZ3M7CisKKyAgICBwcml2YXRlIGZpbmFsIEF0b21pY1JlZmVyZW5jZTxTdHJpbmc+IG1JbWVFdmVudEFjdGlvbk5hbWUgPSBuZXcgQXRvbWljUmVmZXJlbmNlPD4oKTsKKworICAgIEBOdWxsYWJsZQorICAgIFN0cmluZyBnZXRJbWVFdmVudEFjdGlvbk5hbWUoKSB7CisgICAgICAgIHJldHVybiBtSW1lRXZlbnRBY3Rpb25OYW1lLmdldCgpOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgTW9ja0lucHV0TWV0aG9kSW1wbCBleHRlbmRzIElucHV0TWV0aG9kSW1wbCB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzaG93U29mdElucHV0KGludCBmbGFncywgUmVzdWx0UmVjZWl2ZXIgcmVzdWx0UmVjZWl2ZXIpIHsKKyAgICAgICAgICAgIGdldFRyYWNlcigpLnNob3dTb2Z0SW5wdXQoZmxhZ3MsIHJlc3VsdFJlY2VpdmVyLAorICAgICAgICAgICAgICAgICAgICAoKSAtPiBzdXBlci5zaG93U29mdElucHV0KGZsYWdzLCByZXN1bHRSZWNlaXZlcikpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGhpZGVTb2Z0SW5wdXQoaW50IGZsYWdzLCBSZXN1bHRSZWNlaXZlciByZXN1bHRSZWNlaXZlcikgeworICAgICAgICAgICAgZ2V0VHJhY2VyKCkuaGlkZVNvZnRJbnB1dChmbGFncywgcmVzdWx0UmVjZWl2ZXIsCisgICAgICAgICAgICAgICAgICAgICgpIC0+IHN1cGVyLmhpZGVTb2Z0SW5wdXQoZmxhZ3MsIHJlc3VsdFJlY2VpdmVyKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgYXR0YWNoVG9rZW4oSUJpbmRlciB0b2tlbikgeworICAgICAgICAgICAgZ2V0VHJhY2VyKCkuYXR0YWNoVG9rZW4odG9rZW4sICgpIC0+IHN1cGVyLmF0dGFjaFRva2VuKHRva2VuKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgYmluZElucHV0KElucHV0QmluZGluZyBiaW5kaW5nKSB7CisgICAgICAgICAgICBnZXRUcmFjZXIoKS5iaW5kSW5wdXQoYmluZGluZywgKCkgLT4gc3VwZXIuYmluZElucHV0KGJpbmRpbmcpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB1bmJpbmRJbnB1dCgpIHsKKyAgICAgICAgICAgIGdldFRyYWNlcigpLnVuYmluZElucHV0KCgpIC0+IHN1cGVyLnVuYmluZElucHV0KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE51bGxhYmxlCisgICAgcHJpdmF0ZSBJbWVTZXR0aW5ncyByZWFkU2V0dGluZ3MoKSB7CisgICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBvcGVuRmlsZUlucHV0KE1PQ0tfSU1FX1NFVFRJTkdTX0ZJTEUpKSB7CisgICAgICAgICAgICBQYXJjZWwgcGFyY2VsID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcGFyY2VsID0gUGFyY2VsLm9idGFpbigpOworICAgICAgICAgICAgICAgIGZpbmFsIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVs0MDk2XTsKKyAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbnVtUmVhZCA9IGlzLnJlYWQoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG51bVJlYWQgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcGFyY2VsLnVubWFyc2hhbGwoYnVmZmVyLCAwLCBudW1SZWFkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGFyY2VsLnNldERhdGFQb3NpdGlvbigwKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEltZVNldHRpbmdzKHBhcmNlbCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlmIChwYXJjZWwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBwYXJjZWwucmVjeWNsZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKCkgeworICAgICAgICAvLyBJbml0aWFsaXplIG1pbmltdW0gc2V0dGluZ3MgdG8gc2VuZCBldmVudHMgaW4gVHJhY2VyI29uQ3JlYXRlKCkuCisgICAgICAgIG1TZXR0aW5ncyA9IHJlYWRTZXR0aW5ncygpOworICAgICAgICBpZiAobVNldHRpbmdzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlNldHRpbmdzIGZpbGUgaXMgbm90IGZvdW5kLiAiCisgICAgICAgICAgICAgICAgICAgICsgIk1ha2Ugc3VyZSBNb2NrSW1lU2Vzc2lvbi5jcmVhdGUoKSBpcyB1c2VkIHRvIGxhdW5jaCBNb2NrIElNRS4iKTsKKyAgICAgICAgfQorICAgICAgICBtSW1lRXZlbnRBY3Rpb25OYW1lLnNldChtU2V0dGluZ3MuZ2V0RXZlbnRDYWxsYmFja0FjdGlvbk5hbWUoKSk7CisKKyAgICAgICAgZ2V0VHJhY2VyKCkub25DcmVhdGUoKCkgLT4geworICAgICAgICAgICAgc3VwZXIub25DcmVhdGUoKTsKKyAgICAgICAgICAgIG1IYW5kbGVyVGhyZWFkLnN0YXJ0KCk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYWN0aW9uTmFtZSA9IGdldENvbW1hbmRBY3Rpb25OYW1lKG1TZXR0aW5ncy5nZXRFdmVudENhbGxiYWNrQWN0aW9uTmFtZSgpKTsKKyAgICAgICAgICAgIG1Db21tYW5kUmVjZWl2ZXIgPSBuZXcgQ29tbWFuZFJlY2VpdmVyKGFjdGlvbk5hbWUsIHRoaXM6Om9uUmVjZWl2ZUNvbW1hbmQpOworICAgICAgICAgICAgcmVnaXN0ZXJSZWNlaXZlcihtQ29tbWFuZFJlY2VpdmVyLAorICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZW50RmlsdGVyKGFjdGlvbk5hbWUpLCBudWxsIC8qIGJyb2FkY2FzdFBlcm1pc3Npb24gKi8sCisgICAgICAgICAgICAgICAgICAgIG5ldyBIYW5kbGVyKG1IYW5kbGVyVGhyZWFkLmdldExvb3BlcigpKSk7CisKKyAgICAgICAgICAgIGZpbmFsIGludCB3aW5kb3dGbGFncyA9IG1TZXR0aW5ncy5nZXRXaW5kb3dGbGFncygwKTsKKyAgICAgICAgICAgIGZpbmFsIGludCB3aW5kb3dGbGFnc01hc2sgPSBtU2V0dGluZ3MuZ2V0V2luZG93RmxhZ3NNYXNrKDApOworICAgICAgICAgICAgaWYgKHdpbmRvd0ZsYWdzICE9IDAgfHwgd2luZG93RmxhZ3NNYXNrICE9IDApIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcHJldkZsYWdzID0gZ2V0V2luZG93KCkuZ2V0V2luZG93KCkuZ2V0QXR0cmlidXRlcygpLmZsYWdzOworICAgICAgICAgICAgICAgIGdldFdpbmRvdygpLmdldFdpbmRvdygpLnNldEZsYWdzKHdpbmRvd0ZsYWdzLCB3aW5kb3dGbGFnc01hc2spOworICAgICAgICAgICAgICAgIC8vIEZvciBzb21lIHJlYXNvbnMsIHNlZW1zIHRoYXQgd2UgbmVlZCB0byBwb3N0IGFub3RoZXIgcmVxdWVzdExheW91dCgpIHdoZW4KKyAgICAgICAgICAgICAgICAvLyBGTEFHX0RSQVdTX1NZU1RFTV9CQVJfQkFDS0dST1VORFMgYml0IGlzIGNoYW5nZWQuCisgICAgICAgICAgICAgICAgLy8gVE9ETzogSW52ZXN0aWdhdGUgdGhlIHJlYXNvbi4KKyAgICAgICAgICAgICAgICBpZiAoKHdpbmRvd0ZsYWdzTWFzayAmIEZMQUdfRFJBV1NfU1lTVEVNX0JBUl9CQUNLR1JPVU5EUykgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGhhZEZsYWcgPSAocHJldkZsYWdzICYgRkxBR19EUkFXU19TWVNURU1fQkFSX0JBQ0tHUk9VTkRTKSAhPSAwOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGhhc0ZsYWcgPSAod2luZG93RmxhZ3MgJiBGTEFHX0RSQVdTX1NZU1RFTV9CQVJfQkFDS0dST1VORFMpICE9IDA7CisgICAgICAgICAgICAgICAgICAgIGlmIChoYWRGbGFnICE9IGhhc0ZsYWcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFZpZXcgZGVjb3JWaWV3ID0gZ2V0V2luZG93KCkuZ2V0V2luZG93KCkuZ2V0RGVjb3JWaWV3KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWNvclZpZXcucG9zdCgoKSAtPiBkZWNvclZpZXcucmVxdWVzdExheW91dCgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1TZXR0aW5ncy5oYXNOYXZpZ2F0aW9uQmFyQ29sb3IoKSkgeworICAgICAgICAgICAgICAgIGdldFdpbmRvdygpLmdldFdpbmRvdygpLnNldE5hdmlnYXRpb25CYXJDb2xvcihtU2V0dGluZ3MuZ2V0TmF2aWdhdGlvbkJhckNvbG9yKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNvbmZpZ3VyZVdpbmRvdyhXaW5kb3cgd2luLCBib29sZWFuIGlzRnVsbHNjcmVlbiwgYm9vbGVhbiBpc0NhbmRpZGF0ZXNPbmx5KSB7CisgICAgICAgIGdldFRyYWNlcigpLm9uQ29uZmlndXJlV2luZG93KHdpbiwgaXNGdWxsc2NyZWVuLCBpc0NhbmRpZGF0ZXNPbmx5LAorICAgICAgICAgICAgICAgICgpIC0+IHN1cGVyLm9uQ29uZmlndXJlV2luZG93KHdpbiwgaXNGdWxsc2NyZWVuLCBpc0NhbmRpZGF0ZXNPbmx5KSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25FdmFsdWF0ZUZ1bGxzY3JlZW5Nb2RlKCkgeworICAgICAgICByZXR1cm4gZ2V0VHJhY2VyKCkub25FdmFsdWF0ZUZ1bGxzY3JlZW5Nb2RlKCgpIC0+CisgICAgICAgICAgICAgICAgbVNldHRpbmdzLmZ1bGxzY3JlZW5Nb2RlQWxsb3dlZChmYWxzZSkgJiYgc3VwZXIub25FdmFsdWF0ZUZ1bGxzY3JlZW5Nb2RlKCkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEtleWJvYXJkTGF5b3V0VmlldyBleHRlbmRzIExpbmVhckxheW91dCB7CisgICAgICAgIEBOb25OdWxsCisgICAgICAgIHByaXZhdGUgZmluYWwgSW1lU2V0dGluZ3MgbVNldHRpbmdzOworICAgICAgICBATm9uTnVsbAorICAgICAgICBwcml2YXRlIGZpbmFsIFZpZXcuT25MYXlvdXRDaGFuZ2VMaXN0ZW5lciBtTGF5b3V0TGlzdGVuZXI7CisKKyAgICAgICAgS2V5Ym9hcmRMYXlvdXRWaWV3KENvbnRleHQgY29udGV4dCwgQE5vbk51bGwgSW1lU2V0dGluZ3MgaW1lU2V0dGluZ3MsCisgICAgICAgICAgICAgICAgQE51bGxhYmxlIENvbnN1bWVyPEltZUxheW91dEluZm8+IG9uSW5wdXRWaWV3TGF5b3V0Q2hhbmdlZENhbGxiYWNrKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKKworICAgICAgICAgICAgbVNldHRpbmdzID0gaW1lU2V0dGluZ3M7CisKKyAgICAgICAgICAgIHNldE9yaWVudGF0aW9uKFZFUlRJQ0FMKTsKKworICAgICAgICAgICAgZmluYWwgaW50IGRlZmF1bHRCYWNrZ3JvdW5kQ29sb3IgPQorICAgICAgICAgICAgICAgICAgICBnZXRSZXNvdXJjZXMoKS5nZXRDb2xvcihhbmRyb2lkLlIuY29sb3IuaG9sb19vcmFuZ2VfZGFyaywgbnVsbCk7CisgICAgICAgICAgICBzZXRCYWNrZ3JvdW5kQ29sb3IobVNldHRpbmdzLmdldEJhY2tncm91bmRDb2xvcihkZWZhdWx0QmFja2dyb3VuZENvbG9yKSk7CisKKyAgICAgICAgICAgIGZpbmFsIGludCBtYWluU3BhY2VySGVpZ2h0ID0gbVNldHRpbmdzLmdldElucHV0Vmlld0hlaWdodFdpdGhvdXRTeXN0ZW1XaW5kb3dJbnNldCgKKyAgICAgICAgICAgICAgICAgICAgTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCk7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmluYWwgUmVsYXRpdmVMYXlvdXQgbGF5b3V0ID0gbmV3IFJlbGF0aXZlTGF5b3V0KGdldENvbnRleHQoKSk7CisgICAgICAgICAgICAgICAgZmluYWwgVGV4dFZpZXcgdGV4dFZpZXcgPSBuZXcgVGV4dFZpZXcoZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBSZWxhdGl2ZUxheW91dC5MYXlvdXRQYXJhbXMgcGFyYW1zID0gbmV3IFJlbGF0aXZlTGF5b3V0LkxheW91dFBhcmFtcygKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlbGF0aXZlTGF5b3V0LkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICBSZWxhdGl2ZUxheW91dC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMuYWRkUnVsZShSZWxhdGl2ZUxheW91dC5DRU5URVJfSU5fUEFSRU5ULCBSZWxhdGl2ZUxheW91dC5UUlVFKTsKKyAgICAgICAgICAgICAgICB0ZXh0Vmlldy5zZXRMYXlvdXRQYXJhbXMocGFyYW1zKTsKKyAgICAgICAgICAgICAgICB0ZXh0Vmlldy5zZXRUZXh0U2l6ZShUeXBlZFZhbHVlLkNPTVBMRVhfVU5JVF9TUCwgMjApOworICAgICAgICAgICAgICAgIHRleHRWaWV3LnNldEdyYXZpdHkoR3Jhdml0eS5DRU5URVIpOworICAgICAgICAgICAgICAgIHRleHRWaWV3LnNldFRleHQoZ2V0SW1lSWQoZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VOYW1lKCkpKTsKKyAgICAgICAgICAgICAgICBsYXlvdXQuYWRkVmlldyh0ZXh0Vmlldyk7CisgICAgICAgICAgICAgICAgYWRkVmlldyhsYXlvdXQsIExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsIG1haW5TcGFjZXJIZWlnaHQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBpbnQgc3lzdGVtVWlWaXNpYmlsaXR5ID0gbVNldHRpbmdzLmdldElucHV0Vmlld1N5c3RlbVVpVmlzaWJpbGl0eSgwKTsKKyAgICAgICAgICAgIGlmIChzeXN0ZW1VaVZpc2liaWxpdHkgIT0gMCkgeworICAgICAgICAgICAgICAgIHNldFN5c3RlbVVpVmlzaWJpbGl0eShzeXN0ZW1VaVZpc2liaWxpdHkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtTGF5b3V0TGlzdGVuZXIgPSAoVmlldyB2LCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHJpZ2h0LCBpbnQgYm90dG9tLCBpbnQgb2xkTGVmdCwKKyAgICAgICAgICAgICAgICAgICAgaW50IG9sZFRvcCwgaW50IG9sZFJpZ2h0LCBpbnQgb2xkQm90dG9tKSAtPgorICAgICAgICAgICAgICAgICAgICBvbklucHV0Vmlld0xheW91dENoYW5nZWRDYWxsYmFjay5hY2NlcHQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1lTGF5b3V0SW5mby5mcm9tTGF5b3V0TGlzdGVuZXJDYWxsYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgb2xkTGVmdCwgb2xkVG9wLCBvbGRSaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZEJvdHRvbSkpOworICAgICAgICAgICAgdGhpcy5hZGRPbkxheW91dENoYW5nZUxpc3RlbmVyKG1MYXlvdXRMaXN0ZW5lcik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgdXBkYXRlQm90dG9tUGFkZGluZ0lmTmVjZXNzYXJ5KGludCBuZXdQYWRkaW5nQm90dG9tKSB7CisgICAgICAgICAgICBpZiAoZ2V0UGFkZGluZ0JvdHRvbSgpICE9IG5ld1BhZGRpbmdCb3R0b20pIHsKKyAgICAgICAgICAgICAgICBzZXRQYWRkaW5nKGdldFBhZGRpbmdMZWZ0KCksIGdldFBhZGRpbmdUb3AoKSwgZ2V0UGFkZGluZ1JpZ2h0KCksIG5ld1BhZGRpbmdCb3R0b20pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBXaW5kb3dJbnNldHMgb25BcHBseVdpbmRvd0luc2V0cyhXaW5kb3dJbnNldHMgaW5zZXRzKSB7CisgICAgICAgICAgICBpZiAoaW5zZXRzLmlzQ29uc3VtZWQoKQorICAgICAgICAgICAgICAgICAgICB8fCAoZ2V0U3lzdGVtVWlWaXNpYmlsaXR5KCkgJiBTWVNURU1fVUlfRkxBR19MQVlPVVRfSElERV9OQVZJR0FUSU9OKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlIHdlIGFyZSBub3QgaW50ZXJlc3RlZCBpbiBjb25zdW1pbmcgTmF2QmFyIHJlZ2lvbi4KKyAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgYm90dG9tIHBhZGRpbmcgaXMgZW1wdHkuCisgICAgICAgICAgICAgICAgdXBkYXRlQm90dG9tUGFkZGluZ0lmTmVjZXNzYXJ5KDApOworICAgICAgICAgICAgICAgIHJldHVybiBpbnNldHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEluIHNvbWUgY2FzZXMgdGhlIGJvdHRvbSBzeXN0ZW0gd2luZG93IGluc2V0IGlzIG5vdCBhIG5hdmlnYXRpb24gYmFyLiBXZWFyIGRldmljZXMKKyAgICAgICAgICAgIC8vIHRoYXQgaGF2ZSBib3R0b20gY2hpbiBhcmUgZXhhbXBsZXMuICBGb3Igbm93LCBhc3N1bWUgdGhhdCBpdCdzIGEgbmF2aWdhdGlvbiBiYXIgaWYgaXQKKyAgICAgICAgICAgIC8vIGhhcyB0aGUgc2FtZSBoZWlnaHQgYXMgdGhlIHJvb3Qgd2luZG93J3Mgc3RhYmxlIGJvdHRvbSBpbnNldC4KKyAgICAgICAgICAgIGZpbmFsIFdpbmRvd0luc2V0cyByb290V2luZG93SW5zZXRzID0gZ2V0Um9vdFdpbmRvd0luc2V0cygpOworICAgICAgICAgICAgaWYgKHJvb3RXaW5kb3dJbnNldHMgIT0gbnVsbCAmJiAocm9vdFdpbmRvd0luc2V0cy5nZXRTdGFibGVJbnNldEJvdHRvbSgpCisgICAgICAgICAgICAgICAgICAgICE9IGluc2V0cy5nZXRTeXN0ZW1XaW5kb3dJbnNldEJvdHRvbSgpKSkgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgcHJvYmFibHkgbm90IGEgTmF2QmFyLgorICAgICAgICAgICAgICAgIHVwZGF0ZUJvdHRvbVBhZGRpbmdJZk5lY2Vzc2FyeSgwKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5zZXRzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBpbnQgcG9zc2libGVOYXZCYXJIZWlnaHQgPSBpbnNldHMuZ2V0U3lzdGVtV2luZG93SW5zZXRCb3R0b20oKTsKKyAgICAgICAgICAgIHVwZGF0ZUJvdHRvbVBhZGRpbmdJZk5lY2Vzc2FyeShwb3NzaWJsZU5hdkJhckhlaWdodCk7CisgICAgICAgICAgICByZXR1cm4gcG9zc2libGVOYXZCYXJIZWlnaHQgPD0gMAorICAgICAgICAgICAgICAgICAgICA/IGluc2V0cworICAgICAgICAgICAgICAgICAgICA6IGluc2V0cy5yZXBsYWNlU3lzdGVtV2luZG93SW5zZXRzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2V0cy5nZXRTeXN0ZW1XaW5kb3dJbnNldExlZnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNldHMuZ2V0U3lzdGVtV2luZG93SW5zZXRUb3AoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNldHMuZ2V0U3lzdGVtV2luZG93SW5zZXRSaWdodCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogYm90dG9tICovKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uRGV0YWNoZWRGcm9tV2luZG93KCk7CisgICAgICAgICAgICByZW1vdmVPbkxheW91dENoYW5nZUxpc3RlbmVyKG1MYXlvdXRMaXN0ZW5lcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgb25JbnB1dFZpZXdMYXlvdXRDaGFuZ2VkKEBOb25OdWxsIEltZUxheW91dEluZm8gbGF5b3V0SW5mbykgeworICAgICAgICBnZXRUcmFjZXIoKS5vbklucHV0Vmlld0xheW91dENoYW5nZWQobGF5b3V0SW5mbywgKCkgLT4geyB9KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVmlldyBvbkNyZWF0ZUlucHV0VmlldygpIHsKKyAgICAgICAgcmV0dXJuIGdldFRyYWNlcigpLm9uQ3JlYXRlSW5wdXRWaWV3KCgpIC0+CisgICAgICAgICAgICAgICAgbmV3IEtleWJvYXJkTGF5b3V0Vmlldyh0aGlzLCBtU2V0dGluZ3MsIHRoaXM6Om9uSW5wdXRWaWV3TGF5b3V0Q2hhbmdlZCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRJbnB1dChFZGl0b3JJbmZvIGVkaXRvckluZm8sIGJvb2xlYW4gcmVzdGFydGluZykgeworICAgICAgICBnZXRUcmFjZXIoKS5vblN0YXJ0SW5wdXQoZWRpdG9ySW5mbywgcmVzdGFydGluZywKKyAgICAgICAgICAgICAgICAoKSAtPiBzdXBlci5vblN0YXJ0SW5wdXQoZWRpdG9ySW5mbywgcmVzdGFydGluZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRJbnB1dFZpZXcoRWRpdG9ySW5mbyBlZGl0b3JJbmZvLCBib29sZWFuIHJlc3RhcnRpbmcpIHsKKyAgICAgICAgZ2V0VHJhY2VyKCkub25TdGFydElucHV0VmlldyhlZGl0b3JJbmZvLCByZXN0YXJ0aW5nLAorICAgICAgICAgICAgICAgICgpIC0+IHN1cGVyLm9uU3RhcnRJbnB1dFZpZXcoZWRpdG9ySW5mbywgcmVzdGFydGluZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRmluaXNoSW5wdXRWaWV3KGJvb2xlYW4gZmluaXNoaW5nSW5wdXQpIHsKKyAgICAgICAgZ2V0VHJhY2VyKCkub25GaW5pc2hJbnB1dFZpZXcoZmluaXNoaW5nSW5wdXQsCisgICAgICAgICAgICAgICAgKCkgLT4gc3VwZXIub25GaW5pc2hJbnB1dFZpZXcoZmluaXNoaW5nSW5wdXQpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkZpbmlzaElucHV0KCkgeworICAgICAgICBnZXRUcmFjZXIoKS5vbkZpbmlzaElucHV0KCgpIC0+IHN1cGVyLm9uRmluaXNoSW5wdXQoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25LZXlEb3duKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgeworICAgICAgICByZXR1cm4gZ2V0VHJhY2VyKCkub25LZXlEb3duKGtleUNvZGUsIGV2ZW50LCAoKSAtPiBzdXBlci5vbktleURvd24oa2V5Q29kZSwgZXZlbnQpKTsKKyAgICB9CisKKyAgICBAQ2FsbFN1cGVyCisgICAgcHVibGljIGJvb2xlYW4gb25FdmFsdWF0ZUlucHV0Vmlld1Nob3duKCkgeworICAgICAgICByZXR1cm4gZ2V0VHJhY2VyKCkub25FdmFsdWF0ZUlucHV0Vmlld1Nob3duKCgpIC0+IHsKKyAgICAgICAgICAgIC8vIG9uU2hvd0lucHV0UmVxdWVzdGVkKCkgaXMgaW5kZWVkIEBDYWxsU3VwZXIgc28gd2UgYWx3YXlzIGNhbGwgdGhpcywgZXZlbiB3aGVuIHRoZQorICAgICAgICAgICAgLy8gcmVzdWx0IGlzIGlnbm9yZWQuCisgICAgICAgICAgICBmaW5hbCBib29sZWFuIG9yaWdpbmFsUmVzdWx0ID0gc3VwZXIub25FdmFsdWF0ZUlucHV0Vmlld1Nob3duKCk7CisgICAgICAgICAgICBpZiAoIW1TZXR0aW5ncy5nZXRIYXJkS2V5Ym9hcmRDb25maWd1cmF0aW9uQmVoYXZpb3JBbGxvd2VkKGZhbHNlKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIENvbmZpZ3VyYXRpb24gY29uZmlnID0gZ2V0UmVzb3VyY2VzKCkuZ2V0Q29uZmlndXJhdGlvbigpOworICAgICAgICAgICAgICAgIGlmIChjb25maWcua2V5Ym9hcmQgIT0gQ29uZmlndXJhdGlvbi5LRVlCT0FSRF9OT0tFWVMKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGNvbmZpZy5oYXJkS2V5Ym9hcmRIaWRkZW4gIT0gQ29uZmlndXJhdGlvbi5IQVJES0VZQk9BUkRISURERU5fWUVTKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIE92ZXJyaWRlIHRoZSBiZWhhdmlvciBvZiBJbnB1dE1ldGhvZFNlcnZpY2Ujb25FdmFsdWF0ZUlucHV0Vmlld1Nob3duKCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsUmVzdWx0OworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvblNob3dJbnB1dFJlcXVlc3RlZChpbnQgZmxhZ3MsIGJvb2xlYW4gY29uZmlnQ2hhbmdlKSB7CisgICAgICAgIHJldHVybiBnZXRUcmFjZXIoKS5vblNob3dJbnB1dFJlcXVlc3RlZChmbGFncywgY29uZmlnQ2hhbmdlLCAoKSAtPiB7CisgICAgICAgICAgICAvLyBvblNob3dJbnB1dFJlcXVlc3RlZCgpIGlzIG5vdCBtYXJrZWQgd2l0aCBAQ2FsbFN1cGVyLCBidXQganVzdCBpbiBjYXNlLgorICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBvcmlnaW5hbFJlc3VsdCA9IHN1cGVyLm9uU2hvd0lucHV0UmVxdWVzdGVkKGZsYWdzLCBjb25maWdDaGFuZ2UpOworICAgICAgICAgICAgaWYgKCFtU2V0dGluZ3MuZ2V0SGFyZEtleWJvYXJkQ29uZmlndXJhdGlvbkJlaGF2aW9yQWxsb3dlZChmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoKGZsYWdzICYgSW5wdXRNZXRob2QuU0hPV19FWFBMSUNJVCkgPT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZ2V0UmVzb3VyY2VzKCkuZ2V0Q29uZmlndXJhdGlvbigpLmtleWJvYXJkCisgICAgICAgICAgICAgICAgICAgICAgICAhPSBDb25maWd1cmF0aW9uLktFWUJPQVJEX05PS0VZUykgeworICAgICAgICAgICAgICAgICAgICAvLyBPdmVycmlkZSB0aGUgYmVoYXZpb3Igb2YgSW5wdXRNZXRob2RTZXJ2aWNlI29uU2hvd0lucHV0UmVxdWVzdGVkKCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsUmVzdWx0OworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3koKSB7CisgICAgICAgIGdldFRyYWNlcigpLm9uRGVzdHJveSgoKSAtPiB7CisgICAgICAgICAgICBzdXBlci5vbkRlc3Ryb3koKTsKKyAgICAgICAgICAgIHVucmVnaXN0ZXJSZWNlaXZlcihtQ29tbWFuZFJlY2VpdmVyKTsKKyAgICAgICAgICAgIG1IYW5kbGVyVGhyZWFkLnF1aXRTYWZlbHkoKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFic3RyYWN0SW5wdXRNZXRob2RJbXBsIG9uQ3JlYXRlSW5wdXRNZXRob2RJbnRlcmZhY2UoKSB7CisgICAgICAgIHJldHVybiBnZXRUcmFjZXIoKS5vbkNyZWF0ZUlucHV0TWV0aG9kSW50ZXJmYWNlKCgpIC0+IG5ldyBNb2NrSW5wdXRNZXRob2RJbXBsKCkpOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgVGhyZWFkTG9jYWw8VHJhY2VyPiBtVGhyZWFkTG9jYWxUcmFjZXIgPSBuZXcgVGhyZWFkTG9jYWw8PigpOworCisgICAgcHJpdmF0ZSBUcmFjZXIgZ2V0VHJhY2VyKCkgeworICAgICAgICBUcmFjZXIgdHJhY2VyID0gbVRocmVhZExvY2FsVHJhY2VyLmdldCgpOworICAgICAgICBpZiAodHJhY2VyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRyYWNlciA9IG5ldyBUcmFjZXIodGhpcyk7CisgICAgICAgICAgICBtVGhyZWFkTG9jYWxUcmFjZXIuc2V0KHRyYWNlcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRyYWNlcjsKKyAgICB9CisKKyAgICBATm9uTnVsbAorICAgIHByaXZhdGUgSW1lU3RhdGUgZ2V0U3RhdGUoKSB7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaGFzSW5wdXRCaW5kaW5nID0gZ2V0Q3VycmVudElucHV0QmluZGluZygpICE9IG51bGw7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaGFzRHVtbXlJbnB1dENvbm5lY3Rpb25Db25uZWN0aW9uID0KKyAgICAgICAgICAgICAgICAhaGFzSW5wdXRCaW5kaW5nCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBnZXRDdXJyZW50SW5wdXRDb25uZWN0aW9uKCkgPT0gZ2V0Q3VycmVudElucHV0QmluZGluZygpLmdldENvbm5lY3Rpb24oKTsKKyAgICAgICAgcmV0dXJuIG5ldyBJbWVTdGF0ZShoYXNJbnB1dEJpbmRpbmcsIGhhc0R1bW15SW5wdXRDb25uZWN0aW9uQ29ubmVjdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXZlbnQgdHJhY2luZyBoZWxwZXIgY2xhc3MgZm9yIHtAbGluayBNb2NrSW1lfS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBUcmFjZXIgeworCisgICAgICAgIEBOb25OdWxsCisgICAgICAgIHByaXZhdGUgZmluYWwgTW9ja0ltZSBtSW1lOworCisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1UaHJlYWRJZCA9IFByb2Nlc3MubXlUaWQoKTsKKworICAgICAgICBATm9uTnVsbAorICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtVGhyZWFkTmFtZSA9CisgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkgIT0gbnVsbCA/IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpIDogIiI7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Jc01haW5UaHJlYWQgPQorICAgICAgICAgICAgICAgIExvb3Blci5nZXRNYWluTG9vcGVyKCkuZ2V0VGhyZWFkKCkgPT0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKKworICAgICAgICBwcml2YXRlIGludCBtTmVzdExldmVsID0gMDsKKworICAgICAgICBwcml2YXRlIFN0cmluZyBtSW1lRXZlbnRBY3Rpb25OYW1lOworCisgICAgICAgIFRyYWNlcihATm9uTnVsbCBNb2NrSW1lIG1vY2tJbWUpIHsKKyAgICAgICAgICAgIG1JbWUgPSBtb2NrSW1lOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHNlbmRFdmVudEludGVybmFsKEBOb25OdWxsIEltZUV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOworICAgICAgICAgICAgaW50ZW50LnNldFBhY2thZ2UobUltZS5nZXRQYWNrYWdlTmFtZSgpKTsKKyAgICAgICAgICAgIGlmIChtSW1lRXZlbnRBY3Rpb25OYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtSW1lRXZlbnRBY3Rpb25OYW1lID0gbUltZS5nZXRJbWVFdmVudEFjdGlvbk5hbWUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtSW1lRXZlbnRBY3Rpb25OYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJUcmFjZXIgY2Fubm90IGJlIHVzZWQgYmVmb3JlIG9uQ3JlYXRlKCkiKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnRlbnQuc2V0QWN0aW9uKG1JbWVFdmVudEFjdGlvbk5hbWUpOworICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhcyhldmVudC50b0J1bmRsZSgpKTsKKyAgICAgICAgICAgIG1JbWUuc2VuZEJyb2FkY2FzdChpbnRlbnQpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHJlY29yZEV2ZW50SW50ZXJuYWwoQE5vbk51bGwgU3RyaW5nIGV2ZW50TmFtZSwgQE5vbk51bGwgUnVubmFibGUgcnVubmFibGUpIHsKKyAgICAgICAgICAgIHJlY29yZEV2ZW50SW50ZXJuYWwoZXZlbnROYW1lLCBydW5uYWJsZSwgbmV3IEJ1bmRsZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCByZWNvcmRFdmVudEludGVybmFsKEBOb25OdWxsIFN0cmluZyBldmVudE5hbWUsIEBOb25OdWxsIFJ1bm5hYmxlIHJ1bm5hYmxlLAorICAgICAgICAgICAgICAgIEBOb25OdWxsIEJ1bmRsZSBhcmd1bWVudHMpIHsKKyAgICAgICAgICAgIHJlY29yZEV2ZW50SW50ZXJuYWwoZXZlbnROYW1lLCAoKSAtPiB7CisgICAgICAgICAgICAgICAgcnVubmFibGUucnVuKCk7IHJldHVybiBudWxsOworICAgICAgICAgICAgfSwgYXJndW1lbnRzKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgPFQ+IFQgcmVjb3JkRXZlbnRJbnRlcm5hbChATm9uTnVsbCBTdHJpbmcgZXZlbnROYW1lLAorICAgICAgICAgICAgICAgIEBOb25OdWxsIFN1cHBsaWVyPFQ+IHN1cHBsaWVyKSB7CisgICAgICAgICAgICByZXR1cm4gcmVjb3JkRXZlbnRJbnRlcm5hbChldmVudE5hbWUsIHN1cHBsaWVyLCBuZXcgQnVuZGxlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSA8VD4gVCByZWNvcmRFdmVudEludGVybmFsKEBOb25OdWxsIFN0cmluZyBldmVudE5hbWUsCisgICAgICAgICAgICAgICAgQE5vbk51bGwgU3VwcGxpZXI8VD4gc3VwcGxpZXIsIEBOb25OdWxsIEJ1bmRsZSBhcmd1bWVudHMpIHsKKyAgICAgICAgICAgIGZpbmFsIEltZVN0YXRlIGVudGVyU3RhdGUgPSBtSW1lLmdldFN0YXRlKCk7CisgICAgICAgICAgICBmaW5hbCBsb25nIGVudGVyVGltZXN0YW1wID0gU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lTmFub3MoKTsKKyAgICAgICAgICAgIGZpbmFsIGxvbmcgZW50ZXJXYWxsVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgZmluYWwgaW50IG5lc3RMZXZlbCA9IG1OZXN0TGV2ZWw7CisgICAgICAgICAgICAvLyBTZW5kIGVudGVyIGV2ZW50CisgICAgICAgICAgICBzZW5kRXZlbnRJbnRlcm5hbChuZXcgSW1lRXZlbnQoZXZlbnROYW1lLCBuZXN0TGV2ZWwsIG1UaHJlYWROYW1lLAorICAgICAgICAgICAgICAgICAgICBtVGhyZWFkSWQsIG1Jc01haW5UaHJlYWQsIGVudGVyVGltZXN0YW1wLCAwLCBlbnRlcldhbGxUaW1lLAorICAgICAgICAgICAgICAgICAgICAwLCBlbnRlclN0YXRlLCBudWxsLCBhcmd1bWVudHMsIG51bGwpKTsKKyAgICAgICAgICAgICsrbU5lc3RMZXZlbDsKKyAgICAgICAgICAgIFQgcmVzdWx0OworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBzdXBwbGllci5nZXQoKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgLS1tTmVzdExldmVsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgbG9uZyBleGl0VGltZXN0YW1wID0gU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lTmFub3MoKTsKKyAgICAgICAgICAgIGZpbmFsIGxvbmcgZXhpdFdhbGxUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICBmaW5hbCBJbWVTdGF0ZSBleGl0U3RhdGUgPSBtSW1lLmdldFN0YXRlKCk7CisgICAgICAgICAgICAvLyBTZW5kIGV4aXQgZXZlbnQKKyAgICAgICAgICAgIHNlbmRFdmVudEludGVybmFsKG5ldyBJbWVFdmVudChldmVudE5hbWUsIG5lc3RMZXZlbCwgbVRocmVhZE5hbWUsCisgICAgICAgICAgICAgICAgICAgIG1UaHJlYWRJZCwgbUlzTWFpblRocmVhZCwgZW50ZXJUaW1lc3RhbXAsIGV4aXRUaW1lc3RhbXAsIGVudGVyV2FsbFRpbWUsCisgICAgICAgICAgICAgICAgICAgIGV4aXRXYWxsVGltZSwgZW50ZXJTdGF0ZSwgZXhpdFN0YXRlLCBhcmd1bWVudHMsIHJlc3VsdCkpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEBOb25OdWxsIFJ1bm5hYmxlIHJ1bm5hYmxlKSB7CisgICAgICAgICAgICByZWNvcmRFdmVudEludGVybmFsKCJvbkNyZWF0ZSIsIHJ1bm5hYmxlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ29uZmlndXJlV2luZG93KFdpbmRvdyB3aW4sIGJvb2xlYW4gaXNGdWxsc2NyZWVuLAorICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNDYW5kaWRhdGVzT25seSwgQE5vbk51bGwgUnVubmFibGUgcnVubmFibGUpIHsKKyAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBhcmd1bWVudHMgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgICAgICBhcmd1bWVudHMucHV0Qm9vbGVhbigiaXNGdWxsc2NyZWVuIiwgaXNGdWxsc2NyZWVuKTsKKyAgICAgICAgICAgIGFyZ3VtZW50cy5wdXRCb29sZWFuKCJpc0NhbmRpZGF0ZXNPbmx5IiwgaXNDYW5kaWRhdGVzT25seSk7CisgICAgICAgICAgICByZWNvcmRFdmVudEludGVybmFsKCJvbkNvbmZpZ3VyZVdpbmRvdyIsIHJ1bm5hYmxlLCBhcmd1bWVudHMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25FdmFsdWF0ZUZ1bGxzY3JlZW5Nb2RlKEBOb25OdWxsIEJvb2xlYW5TdXBwbGllciBzdXBwbGllcikgeworICAgICAgICAgICAgcmV0dXJuIHJlY29yZEV2ZW50SW50ZXJuYWwoIm9uRXZhbHVhdGVGdWxsc2NyZWVuTW9kZSIsIHN1cHBsaWVyOjpnZXRBc0Jvb2xlYW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25FdmFsdWF0ZUlucHV0Vmlld1Nob3duKEBOb25OdWxsIEJvb2xlYW5TdXBwbGllciBzdXBwbGllcikgeworICAgICAgICAgICAgcmV0dXJuIHJlY29yZEV2ZW50SW50ZXJuYWwoIm9uRXZhbHVhdGVJbnB1dFZpZXdTaG93biIsIHN1cHBsaWVyOjpnZXRBc0Jvb2xlYW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFZpZXcgb25DcmVhdGVJbnB1dFZpZXcoQE5vbk51bGwgU3VwcGxpZXI8Vmlldz4gc3VwcGxpZXIpIHsKKyAgICAgICAgICAgIHJldHVybiByZWNvcmRFdmVudEludGVybmFsKCJvbkNyZWF0ZUlucHV0VmlldyIsIHN1cHBsaWVyKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRJbnB1dChFZGl0b3JJbmZvIGVkaXRvckluZm8sIGJvb2xlYW4gcmVzdGFydGluZywKKyAgICAgICAgICAgICAgICBATm9uTnVsbCBSdW5uYWJsZSBydW5uYWJsZSkgeworICAgICAgICAgICAgZmluYWwgQnVuZGxlIGFyZ3VtZW50cyA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgICAgIGFyZ3VtZW50cy5wdXRQYXJjZWxhYmxlKCJlZGl0b3JJbmZvIiwgZWRpdG9ySW5mbyk7CisgICAgICAgICAgICBhcmd1bWVudHMucHV0Qm9vbGVhbigicmVzdGFydGluZyIsIHJlc3RhcnRpbmcpOworICAgICAgICAgICAgcmVjb3JkRXZlbnRJbnRlcm5hbCgib25TdGFydElucHV0IiwgcnVubmFibGUsIGFyZ3VtZW50cyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0SW5wdXRWaWV3KEVkaXRvckluZm8gZWRpdG9ySW5mbywgYm9vbGVhbiByZXN0YXJ0aW5nLAorICAgICAgICAgICAgICAgIEBOb25OdWxsIFJ1bm5hYmxlIHJ1bm5hYmxlKSB7CisgICAgICAgICAgICBmaW5hbCBCdW5kbGUgYXJndW1lbnRzID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgYXJndW1lbnRzLnB1dFBhcmNlbGFibGUoImVkaXRvckluZm8iLCBlZGl0b3JJbmZvKTsKKyAgICAgICAgICAgIGFyZ3VtZW50cy5wdXRCb29sZWFuKCJyZXN0YXJ0aW5nIiwgcmVzdGFydGluZyk7CisgICAgICAgICAgICByZWNvcmRFdmVudEludGVybmFsKCJvblN0YXJ0SW5wdXRWaWV3IiwgcnVubmFibGUsIGFyZ3VtZW50cyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkZpbmlzaElucHV0Vmlldyhib29sZWFuIGZpbmlzaGluZ0lucHV0LCBATm9uTnVsbCBSdW5uYWJsZSBydW5uYWJsZSkgeworICAgICAgICAgICAgZmluYWwgQnVuZGxlIGFyZ3VtZW50cyA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgICAgIGFyZ3VtZW50cy5wdXRCb29sZWFuKCJmaW5pc2hpbmdJbnB1dCIsIGZpbmlzaGluZ0lucHV0KTsKKyAgICAgICAgICAgIHJlY29yZEV2ZW50SW50ZXJuYWwoIm9uRmluaXNoSW5wdXRWaWV3IiwgcnVubmFibGUsIGFyZ3VtZW50cyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkZpbmlzaElucHV0KEBOb25OdWxsIFJ1bm5hYmxlIHJ1bm5hYmxlKSB7CisgICAgICAgICAgICByZWNvcmRFdmVudEludGVybmFsKCJvbkZpbmlzaElucHV0IiwgcnVubmFibGUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25LZXlEb3duKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCwgQE5vbk51bGwgQm9vbGVhblN1cHBsaWVyIHN1cHBsaWVyKSB7CisgICAgICAgICAgICBmaW5hbCBCdW5kbGUgYXJndW1lbnRzID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgYXJndW1lbnRzLnB1dEludCgia2V5Q29kZSIsIGtleUNvZGUpOworICAgICAgICAgICAgYXJndW1lbnRzLnB1dFBhcmNlbGFibGUoImV2ZW50IiwgZXZlbnQpOworICAgICAgICAgICAgcmV0dXJuIHJlY29yZEV2ZW50SW50ZXJuYWwoIm9uS2V5RG93biIsIHN1cHBsaWVyOjpnZXRBc0Jvb2xlYW4sIGFyZ3VtZW50cyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBvblNob3dJbnB1dFJlcXVlc3RlZChpbnQgZmxhZ3MsIGJvb2xlYW4gY29uZmlnQ2hhbmdlLAorICAgICAgICAgICAgICAgIEBOb25OdWxsIEJvb2xlYW5TdXBwbGllciBzdXBwbGllcikgeworICAgICAgICAgICAgZmluYWwgQnVuZGxlIGFyZ3VtZW50cyA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgICAgIGFyZ3VtZW50cy5wdXRJbnQoImZsYWdzIiwgZmxhZ3MpOworICAgICAgICAgICAgYXJndW1lbnRzLnB1dEJvb2xlYW4oImNvbmZpZ0NoYW5nZSIsIGNvbmZpZ0NoYW5nZSk7CisgICAgICAgICAgICByZXR1cm4gcmVjb3JkRXZlbnRJbnRlcm5hbCgib25TaG93SW5wdXRSZXF1ZXN0ZWQiLCBzdXBwbGllcjo6Z2V0QXNCb29sZWFuLCBhcmd1bWVudHMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25EZXN0cm95KEBOb25OdWxsIFJ1bm5hYmxlIHJ1bm5hYmxlKSB7CisgICAgICAgICAgICByZWNvcmRFdmVudEludGVybmFsKCJvbkRlc3Ryb3kiLCBydW5uYWJsZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhdHRhY2hUb2tlbihJQmluZGVyIHRva2VuLCBATm9uTnVsbCBSdW5uYWJsZSBydW5uYWJsZSkgeworICAgICAgICAgICAgZmluYWwgQnVuZGxlIGFyZ3VtZW50cyA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgICAgIGFyZ3VtZW50cy5wdXRCaW5kZXIoInRva2VuIiwgdG9rZW4pOworICAgICAgICAgICAgcmVjb3JkRXZlbnRJbnRlcm5hbCgiYXR0YWNoVG9rZW4iLCBydW5uYWJsZSwgYXJndW1lbnRzKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGJpbmRJbnB1dChJbnB1dEJpbmRpbmcgYmluZGluZywgQE5vbk51bGwgUnVubmFibGUgcnVubmFibGUpIHsKKyAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBhcmd1bWVudHMgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgICAgICBhcmd1bWVudHMucHV0UGFyY2VsYWJsZSgiYmluZGluZyIsIGJpbmRpbmcpOworICAgICAgICAgICAgcmVjb3JkRXZlbnRJbnRlcm5hbCgiYmluZElucHV0IiwgcnVubmFibGUsIGFyZ3VtZW50cyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB1bmJpbmRJbnB1dChATm9uTnVsbCBSdW5uYWJsZSBydW5uYWJsZSkgeworICAgICAgICAgICAgcmVjb3JkRXZlbnRJbnRlcm5hbCgidW5iaW5kSW5wdXQiLCBydW5uYWJsZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzaG93U29mdElucHV0KGludCBmbGFncywgUmVzdWx0UmVjZWl2ZXIgcmVzdWx0UmVjZWl2ZXIsCisgICAgICAgICAgICAgICAgQE5vbk51bGwgUnVubmFibGUgcnVubmFibGUpIHsKKyAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBhcmd1bWVudHMgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgICAgICBhcmd1bWVudHMucHV0SW50KCJmbGFncyIsIGZsYWdzKTsKKyAgICAgICAgICAgIGFyZ3VtZW50cy5wdXRQYXJjZWxhYmxlKCJyZXN1bHRSZWNlaXZlciIsIHJlc3VsdFJlY2VpdmVyKTsKKyAgICAgICAgICAgIHJlY29yZEV2ZW50SW50ZXJuYWwoInNob3dTb2Z0SW5wdXQiLCBydW5uYWJsZSwgYXJndW1lbnRzKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGhpZGVTb2Z0SW5wdXQoaW50IGZsYWdzLCBSZXN1bHRSZWNlaXZlciByZXN1bHRSZWNlaXZlciwKKyAgICAgICAgICAgICAgICBATm9uTnVsbCBSdW5uYWJsZSBydW5uYWJsZSkgeworICAgICAgICAgICAgZmluYWwgQnVuZGxlIGFyZ3VtZW50cyA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgICAgIGFyZ3VtZW50cy5wdXRJbnQoImZsYWdzIiwgZmxhZ3MpOworICAgICAgICAgICAgYXJndW1lbnRzLnB1dFBhcmNlbGFibGUoInJlc3VsdFJlY2VpdmVyIiwgcmVzdWx0UmVjZWl2ZXIpOworICAgICAgICAgICAgcmVjb3JkRXZlbnRJbnRlcm5hbCgiaGlkZVNvZnRJbnB1dCIsIHJ1bm5hYmxlLCBhcmd1bWVudHMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEFic3RyYWN0SW5wdXRNZXRob2RJbXBsIG9uQ3JlYXRlSW5wdXRNZXRob2RJbnRlcmZhY2UoCisgICAgICAgICAgICAgICAgQE5vbk51bGwgU3VwcGxpZXI8QWJzdHJhY3RJbnB1dE1ldGhvZEltcGw+IHN1cHBsaWVyKSB7CisgICAgICAgICAgICByZXR1cm4gcmVjb3JkRXZlbnRJbnRlcm5hbCgib25DcmVhdGVJbnB1dE1ldGhvZEludGVyZmFjZSIsIHN1cHBsaWVyKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZUNvbW1hbmQoCisgICAgICAgICAgICAgICAgQE5vbk51bGwgSW1lQ29tbWFuZCBjb21tYW5kLCBATm9uTnVsbCBSdW5uYWJsZSBydW5uYWJsZSkgeworICAgICAgICAgICAgZmluYWwgQnVuZGxlIGFyZ3VtZW50cyA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgICAgIGFyZ3VtZW50cy5wdXRCdW5kbGUoImNvbW1hbmQiLCBjb21tYW5kLnRvQnVuZGxlKCkpOworICAgICAgICAgICAgcmVjb3JkRXZlbnRJbnRlcm5hbCgib25SZWNlaXZlQ29tbWFuZCIsIHJ1bm5hYmxlLCBhcmd1bWVudHMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25IYW5kbGVDb21tYW5kKAorICAgICAgICAgICAgICAgIEBOb25OdWxsIEltZUNvbW1hbmQgY29tbWFuZCwgQE5vbk51bGwgUnVubmFibGUgcnVubmFibGUpIHsKKyAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBhcmd1bWVudHMgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgICAgICBhcmd1bWVudHMucHV0QnVuZGxlKCJjb21tYW5kIiwgY29tbWFuZC50b0J1bmRsZSgpKTsKKyAgICAgICAgICAgIHJlY29yZEV2ZW50SW50ZXJuYWwoIm9uSGFuZGxlQ29tbWFuZCIsIHJ1bm5hYmxlLCBhcmd1bWVudHMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25JbnB1dFZpZXdMYXlvdXRDaGFuZ2VkKEBOb25OdWxsIEltZUxheW91dEluZm8gaW1lTGF5b3V0SW5mbywKKyAgICAgICAgICAgICAgICBATm9uTnVsbCBSdW5uYWJsZSBydW5uYWJsZSkgeworICAgICAgICAgICAgZmluYWwgQnVuZGxlIGFyZ3VtZW50cyA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgICAgIGltZUxheW91dEluZm8ud3JpdGVUb0J1bmRsZShhcmd1bWVudHMpOworICAgICAgICAgICAgcmVjb3JkRXZlbnRJbnRlcm5hbCgib25JbnB1dFZpZXdMYXlvdXRDaGFuZ2VkIiwgcnVubmFibGUsIGFyZ3VtZW50cyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnB1dG1ldGhvZC9tb2NraW1lL3NyYy9jb20vYW5kcm9pZC9jdHMvbW9ja2ltZS9Nb2NrSW1lU2Vzc2lvbi5qYXZhIGIvdGVzdHMvaW5wdXRtZXRob2QvbW9ja2ltZS9zcmMvY29tL2FuZHJvaWQvY3RzL21vY2tpbWUvTW9ja0ltZVNlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mjc2NWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW5wdXRtZXRob2QvbW9ja2ltZS9zcmMvY29tL2FuZHJvaWQvY3RzL21vY2tpbWUvTW9ja0ltZVNlc3Npb24uamF2YQpAQCAtMCwwICsxLDM0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY3RzLm1vY2tpbWU7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LkNvbnRleHQuTU9ERV9QUklWQVRFOworCitpbXBvcnQgYW5kcm9pZC5hcHAuVWlBdXRvbWF0aW9uOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlclRocmVhZDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLkd1YXJkZWRCeTsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk5vbk51bGw7CitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5OdWxsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dE1ldGhvZE1hbmFnZXI7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlBvbGxpbmdDaGVjazsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKKy8qKgorICogUmVwcmVzZW50cyBhbiBhY3RpdmUgTW9jayBJTUUgc2Vzc2lvbiwgd2hpY2ggcHJvdmlkZXMgYmFzaWMgcHJpbWl0aXZlcyB0byB3cml0ZSBlbmQtdG8tZW5kIHRlc3RzCisgKiBmb3IgSU1FIEFQSXMuCisgKgorICogPHA+VG8gdXNlIHtAbGluayBNb2NrSW1lfSB2aWEge0BsaW5rIE1vY2tJbWVTZXNzaW9ufSwgeW91IG5lZWQgdG8gPC9wPgorICogPHA+UHVibGljIG1ldGhvZHMgYXJlIG5vdCB0aHJlYWQtc2FmZS48L3A+CisgKi8KK3B1YmxpYyBjbGFzcyBNb2NrSW1lU2Vzc2lvbiBpbXBsZW1lbnRzIEF1dG9DbG9zZWFibGUgeworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1JbWVFdmVudEFjdGlvbk5hbWUgPQorICAgICAgICAgICAgImNvbS5hbmRyb2lkLmN0cy5tb2NraW1lLmFjdGlvbi5JTUVfRVZFTlQuIiArIFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZU5hbm9zKCk7CisKKyAgICAvKiogU2V0dGluZyBmaWxlIG5hbWUgdG8gc3RvcmUgaW5pdGlhbGl6YXRpb24gc2V0dGluZ3MgZm9yIHtAbGluayBNb2NrSW1lfS4gKi8KKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE1PQ0tfSU1FX1NFVFRJTkdTX0ZJTEUgPSAibW9ja2ltZXNldHRpbmdzLmRhdGEiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBUSU1FT1VUID0gVGltZVVuaXQuU0VDT05EUy50b01pbGxpcygxMCk7CisKKyAgICBATm9uTnVsbAorICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKKyAgICBATm9uTnVsbAorICAgIHByaXZhdGUgZmluYWwgVWlBdXRvbWF0aW9uIG1VaUF1dG9tYXRpb247CisKKyAgICBwcml2YXRlIGZpbmFsIEhhbmRsZXJUaHJlYWQgbUhhbmRsZXJUaHJlYWQgPSBuZXcgSGFuZGxlclRocmVhZCgiRXZlbnRSZWNlaXZlciIpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgRXZlbnRTdG9yZSB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTklUSUFMX0FSUkFZX1NJWkUgPSAzMjsKKworICAgICAgICBATm9uTnVsbAorICAgICAgICBwdWJsaWMgZmluYWwgSW1lRXZlbnRbXSBtQXJyYXk7CisgICAgICAgIHB1YmxpYyBpbnQgbUxlbmd0aDsKKworICAgICAgICBFdmVudFN0b3JlKCkgeworICAgICAgICAgICAgbUFycmF5ID0gbmV3IEltZUV2ZW50W0lOSVRJQUxfQVJSQVlfU0laRV07CisgICAgICAgICAgICBtTGVuZ3RoID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIEV2ZW50U3RvcmUoRXZlbnRTdG9yZSBzcmMsIGludCBuZXdMZW5ndGgpIHsKKyAgICAgICAgICAgIG1BcnJheSA9IG5ldyBJbWVFdmVudFtuZXdMZW5ndGhdOworICAgICAgICAgICAgbUxlbmd0aCA9IHNyYy5tTGVuZ3RoOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShzcmMubUFycmF5LCAwLCBtQXJyYXksIDAsIHNyYy5tTGVuZ3RoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBFdmVudFN0b3JlIGFkZChJbWVFdmVudCBldmVudCkgeworICAgICAgICAgICAgaWYgKG1MZW5ndGggKyAxIDw9IG1BcnJheS5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBtQXJyYXlbbUxlbmd0aF0gPSBldmVudDsKKyAgICAgICAgICAgICAgICArK21MZW5ndGg7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXZlbnRTdG9yZSh0aGlzLCBtTGVuZ3RoICogMikuYWRkKGV2ZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJbWVFdmVudFN0cmVhbS5JbWVFdmVudEFycmF5IHRha2VTbmFwc2hvdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSW1lRXZlbnRTdHJlYW0uSW1lRXZlbnRBcnJheShtQXJyYXksIG1MZW5ndGgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgTW9ja0ltZUV2ZW50UmVjZWl2ZXIgZXh0ZW5kcyBCcm9hZGNhc3RSZWNlaXZlciB7CisgICAgICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOworCisgICAgICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKKyAgICAgICAgQE5vbk51bGwKKyAgICAgICAgcHJpdmF0ZSBFdmVudFN0b3JlIG1DdXJyZW50RXZlbnRTdG9yZSA9IG5ldyBFdmVudFN0b3JlKCk7CisKKyAgICAgICAgQE5vbk51bGwKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUFjdGlvbk5hbWU7CisKKyAgICAgICAgTW9ja0ltZUV2ZW50UmVjZWl2ZXIoQE5vbk51bGwgU3RyaW5nIGFjdGlvbk5hbWUpIHsKKyAgICAgICAgICAgIG1BY3Rpb25OYW1lID0gYWN0aW9uTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmVxdWFscyhtQWN0aW9uTmFtZSwgaW50ZW50LmdldEFjdGlvbigpKSkgeworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRFdmVudFN0b3JlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudEV2ZW50U3RvcmUuYWRkKEltZUV2ZW50LmZyb21CdW5kbGUoaW50ZW50LmdldEV4dHJhcygpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEltZUV2ZW50U3RyZWFtLkltZUV2ZW50QXJyYXkgdGFrZUV2ZW50U25hcHNob3QoKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1DdXJyZW50RXZlbnRTdG9yZS50YWtlU25hcHNob3QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBwcml2YXRlIGZpbmFsIE1vY2tJbWVFdmVudFJlY2VpdmVyIG1FdmVudFJlY2VpdmVyID0KKyAgICAgICAgICAgIG5ldyBNb2NrSW1lRXZlbnRSZWNlaXZlcihtSW1lRXZlbnRBY3Rpb25OYW1lKTsKKworICAgIHByaXZhdGUgZmluYWwgSW1lRXZlbnRTdHJlYW0gbUV2ZW50U3RyZWFtID0KKyAgICAgICAgICAgIG5ldyBJbWVFdmVudFN0cmVhbShtRXZlbnRSZWNlaXZlcjo6dGFrZUV2ZW50U25hcHNob3QpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGV4ZWN1dGVTaGVsbENvbW1hbmQoCisgICAgICAgICAgICBATm9uTnVsbCBVaUF1dG9tYXRpb24gdWlBdXRvbWF0aW9uLCBATm9uTnVsbCBTdHJpbmcgY29tbWFuZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IChQYXJjZWxGaWxlRGVzY3JpcHRvci5BdXRvQ2xvc2VJbnB1dFN0cmVhbSBpbiA9CisgICAgICAgICAgICAgICAgICAgICBuZXcgUGFyY2VsRmlsZURlc2NyaXB0b3IuQXV0b0Nsb3NlSW5wdXRTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpQXV0b21hdGlvbi5leGVjdXRlU2hlbGxDb21tYW5kKGNvbW1hbmQpKSkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBmaW5hbCBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbNDA5Nl07CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBudW1SZWFkID0gaW4ucmVhZChidWZmZXIpOworICAgICAgICAgICAgICAgIGlmIChudW1SZWFkIDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNiLmFwcGVuZChuZXcgU3RyaW5nKGJ1ZmZlciwgMCwgbnVtUmVhZCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBATnVsbGFibGUKKyAgICBwcml2YXRlIFN0cmluZyBnZXRDdXJyZW50SW5wdXRNZXRob2RJZCgpIHsKKyAgICAgICAgLy8gVE9ETzogUmVwbGFjZSB0aGlzIHdpdGggSU1NI2dldEN1cnJlbnRJbnB1dE1ldGhvZElkRm9yVGVzdGluZygpCisgICAgICAgIHJldHVybiBTZXR0aW5ncy5TZWN1cmUuZ2V0U3RyaW5nKG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5ERUZBVUxUX0lOUFVUX01FVEhPRCk7CisgICAgfQorCisgICAgQE51bGxhYmxlCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZU1vY2tJbWVTZXR0aW5ncyhATm9uTnVsbCBDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICBATm9uTnVsbCBTdHJpbmcgaW1lRXZlbnRBY3Rpb25OYW1lLAorICAgICAgICAgICAgQE51bGxhYmxlIEltZVNldHRpbmdzLkJ1aWxkZXIgaW1lU2V0dGluZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBjb250ZXh0LmRlbGV0ZUZpbGUoTU9DS19JTUVfU0VUVElOR1NfRklMRSk7CisgICAgICAgIHRyeSAoT3V0cHV0U3RyZWFtIG9zID0gY29udGV4dC5vcGVuRmlsZU91dHB1dChNT0NLX0lNRV9TRVRUSU5HU19GSUxFLCBNT0RFX1BSSVZBVEUpKSB7CisgICAgICAgICAgICBQYXJjZWwgcGFyY2VsID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcGFyY2VsID0gUGFyY2VsLm9idGFpbigpOworICAgICAgICAgICAgICAgIEltZVNldHRpbmdzLndyaXRlVG9QYXJjZWwocGFyY2VsLCBpbWVFdmVudEFjdGlvbk5hbWUsIGltZVNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICBvcy53cml0ZShwYXJjZWwubWFyc2hhbGwoKSk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlmIChwYXJjZWwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBwYXJjZWwucmVjeWNsZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9zLmZsdXNoKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIENvbXBvbmVudE5hbWUgZ2V0TW9ja0ltZUNvbXBvbmVudE5hbWUoKSB7CisgICAgICAgIHJldHVybiBNb2NrSW1lLmdldENvbXBvbmVudE5hbWUobUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TW9ja0ltZUlkKCkgeworICAgICAgICByZXR1cm4gTW9ja0ltZS5nZXRJbWVJZChtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIE1vY2tJbWVTZXNzaW9uKEBOb25OdWxsIENvbnRleHQgY29udGV4dCwgQE5vbk51bGwgVWlBdXRvbWF0aW9uIHVpQXV0b21hdGlvbikgeworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIG1VaUF1dG9tYXRpb24gPSB1aUF1dG9tYXRpb247CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoQE51bGxhYmxlIEltZVNldHRpbmdzLkJ1aWxkZXIgaW1lU2V0dGluZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBNb2NrSU1FIGlzIG5vdCBzZWxlY3RlZC4KKyAgICAgICAgaWYgKG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoSW5wdXRNZXRob2RNYW5hZ2VyLmNsYXNzKQorICAgICAgICAgICAgICAgIC5nZXRJbnB1dE1ldGhvZExpc3QoKQorICAgICAgICAgICAgICAgIC5zdHJlYW0oKQorICAgICAgICAgICAgICAgIC5hbnlNYXRjaChpbmZvIC0+IGdldE1vY2tJbWVDb21wb25lbnROYW1lKCkuZXF1YWxzKGluZm8uZ2V0Q29tcG9uZW50KCkpKSkgeworICAgICAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChtVWlBdXRvbWF0aW9uLCAiaW1lIHJlc2V0Iik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoSW5wdXRNZXRob2RNYW5hZ2VyLmNsYXNzKQorICAgICAgICAgICAgICAgIC5nZXRFbmFibGVkSW5wdXRNZXRob2RMaXN0KCkKKyAgICAgICAgICAgICAgICAuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAuYW55TWF0Y2goaW5mbyAtPiBnZXRNb2NrSW1lQ29tcG9uZW50TmFtZSgpLmVxdWFscyhpbmZvLmdldENvbXBvbmVudCgpKSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHdyaXRlTW9ja0ltZVNldHRpbmdzKG1Db250ZXh0LCBtSW1lRXZlbnRBY3Rpb25OYW1lLCBpbWVTZXR0aW5ncyk7CisKKyAgICAgICAgbUhhbmRsZXJUaHJlYWQuc3RhcnQoKTsKKyAgICAgICAgbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtRXZlbnRSZWNlaXZlciwKKyAgICAgICAgICAgICAgICBuZXcgSW50ZW50RmlsdGVyKG1JbWVFdmVudEFjdGlvbk5hbWUpLCBudWxsIC8qIGJyb2FkY2FzdFBlcm1pc3Npb24gKi8sCisgICAgICAgICAgICAgICAgbmV3IEhhbmRsZXIobUhhbmRsZXJUaHJlYWQuZ2V0TG9vcGVyKCkpKTsKKworICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKG1VaUF1dG9tYXRpb24sICJpbWUgZW5hYmxlICIgKyBnZXRNb2NrSW1lSWQoKSk7CisgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQobVVpQXV0b21hdGlvbiwgImltZSBzZXQgIiArIGdldE1vY2tJbWVJZCgpKTsKKworICAgICAgICBQb2xsaW5nQ2hlY2suY2hlY2soIk1ha2Ugc3VyZSB0aGF0IE1vY2tJTUUgYmVjb21lcyBhdmFpbGFibGUiLCBUSU1FT1VULAorICAgICAgICAgICAgICAgICgpIC0+IGdldE1vY2tJbWVJZCgpLmVxdWFscyhnZXRDdXJyZW50SW5wdXRNZXRob2RJZCgpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBNb2NrIElNRSBzZXNzaW9uLiBEdXJpbmcgdGhpcyBzZXNzaW9uLCB5b3UgY2FuIHJlY2VpdmUgdmFyaW91cyBldmVudHMgZnJvbQorICAgICAqIHtAbGluayBNb2NrSW1lfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IHtAbGluayBDb250ZXh0fSB0byBiZSB1c2VkIHRvIHJlY2VpdmUgaW50ZXItcHJvY2VzcyBldmVudHMgZnJvbSB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICB7QGxpbmsgTW9ja0ltZX0gKGUuZy4gdmlhIHtAbGluayBCcm9hZGNhc3RSZWNlaXZlcn0KKyAgICAgKiBAcGFyYW0gdWlBdXRvbWF0aW9uIHtAbGluayBVaUF1dG9tYXRpb259IG9iamVjdCB0byBjaGFuZ2UgdGhlIGRldmljZSBzdGF0ZSB0aGF0IGFyZSB0eXBpY2FsbHkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIGd1YXJkZWQgYnkgcGVybWlzc2lvbnMuCisgICAgICogQHBhcmFtIGltZVNldHRpbmdzIEtleS12YWx1ZSBwYWlycyB0byBiZSBwYXNzZWQgdG8gdGhlIHtAbGluayBNb2NrSW1lfS4KKyAgICAgKiBAcmV0dXJuIEEgc2Vzc2lvbiBvYmplY3QsIHdpdGggd2hpY2ggeW91IGNhbiByZXRyaWV2ZSBldmVudCBsb2dzIGZyb20gdGhlIHtAbGluayBNb2NrSW1lfSBhbmQKKyAgICAgKiAgICAgICAgIGNhbiBjbGVhbiB1cCB0aGUgc2Vzc2lvbi4KKyAgICAgKi8KKyAgICBATm9uTnVsbAorICAgIHB1YmxpYyBzdGF0aWMgTW9ja0ltZVNlc3Npb24gY3JlYXRlKAorICAgICAgICAgICAgQE5vbk51bGwgQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgQE5vbk51bGwgVWlBdXRvbWF0aW9uIHVpQXV0b21hdGlvbiwKKyAgICAgICAgICAgIEBOdWxsYWJsZSBJbWVTZXR0aW5ncy5CdWlsZGVyIGltZVNldHRpbmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgTW9ja0ltZVNlc3Npb24gY2xpZW50ID0gbmV3IE1vY2tJbWVTZXNzaW9uKGNvbnRleHQsIHVpQXV0b21hdGlvbik7CisgICAgICAgIGNsaWVudC5pbml0aWFsaXplKGltZVNldHRpbmdzKTsKKyAgICAgICAgcmV0dXJuIGNsaWVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHtAbGluayBJbWVFdmVudFN0cmVhbX0gb2JqZWN0IHRoYXQgc3RvcmVzIGV2ZW50cyBzZW50IGZyb20ge0BsaW5rIE1vY2tJbWV9IHNpbmNlIHRoZQorICAgICAqICAgICAgICAgc2Vzc2lvbiBpcyBjcmVhdGVkLgorICAgICAqLworICAgIHB1YmxpYyBJbWVFdmVudFN0cmVhbSBvcGVuRXZlbnRTdHJlYW0oKSB7CisgICAgICAgIHJldHVybiBtRXZlbnRTdHJlYW0uY29weSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlcyB0aGUgYWN0aXZlIHNlc3Npb24gYW5kIGRlLXNlbGVjdHMge0BsaW5rIE1vY2tJbWV9LiBDdXJyZW50bHkgd2hpY2ggSU1FIHdpbGwgYmUKKyAgICAgKiBzZWxlY3RlZCBuZXh0IGlzIHVwIHRvIHRoZSBzeXN0ZW0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChtVWlBdXRvbWF0aW9uLCAiaW1lIHJlc2V0Iik7CisKKyAgICAgICAgUG9sbGluZ0NoZWNrLmNoZWNrKCJNYWtlIHN1cmUgdGhhdCBNb2NrSU1FIGJlY29tZXMgdW5hdmFpbGFibGUiLCBUSU1FT1VULCAoKSAtPgorICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoSW5wdXRNZXRob2RNYW5hZ2VyLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgLmdldEVuYWJsZWRJbnB1dE1ldGhvZExpc3QoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAgICAgICAubm9uZU1hdGNoKGluZm8gLT4gZ2V0TW9ja0ltZUNvbXBvbmVudE5hbWUoKS5lcXVhbHMoaW5mby5nZXRDb21wb25lbnQoKSkpKTsKKworICAgICAgICBtQ29udGV4dC51bnJlZ2lzdGVyUmVjZWl2ZXIobUV2ZW50UmVjZWl2ZXIpOworICAgICAgICBtSGFuZGxlclRocmVhZC5xdWl0U2FmZWx5KCk7CisgICAgICAgIG1Db250ZXh0LmRlbGV0ZUZpbGUoTU9DS19JTUVfU0VUVElOR1NfRklMRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTGV0cyB7QGxpbmsgTW9ja0ltZX0gdG8gY2FsbAorICAgICAqIHtAbGluayBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRDb25uZWN0aW9uI2NvbW1pdFRleHQoQ2hhclNlcXVlbmNlLCBpbnQpfSB3aXRoIHRoZSBnaXZlbgorICAgICAqIHBhcmFtZXRlcnMuCisgICAgICoKKyAgICAgKiA8cD5UaGlzIHRyaWdnZXJzIHtAY29kZSBnZXRDdXJyZW50SW5wdXRDb25uZWN0aW9uKCkuY29tbWl0VGV4dCh0ZXh0LCBuZXdDdXJzb3JQb3NpdGlvbil9LjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXh0IHRvIGJlIHBhc3NlZCBhcyB0aGUge0Bjb2RlIHRleHR9IHBhcmFtZXRlcgorICAgICAqIEBwYXJhbSBuZXdDdXJzb3JQb3NpdGlvbiB0byBiZSBwYXNzZWQgYXMgdGhlIHtAY29kZSBuZXdDdXJzb3JQb3NpdGlvbn0gcGFyYW1ldGVyCisgICAgICogQHJldHVybiB7QGxpbmsgSW1lQ29tbWFuZH0gb2JqZWN0IHRoYXQgY2FuIGJlIHBhc3NlZCB0bworICAgICAqICAgICAgICAge0BsaW5rIEltZUV2ZW50U3RyZWFtVGVzdFV0aWxzI2V4cGVjdENvbW1hbmQoSW1lRXZlbnRTdHJlYW0sIEltZUNvbW1hbmQsIGxvbmcpfSB0bworICAgICAqICAgICAgICAgd2FpdCB1bnRpbCB0aGlzIGV2ZW50IGlzIGhhbmRsZWQgYnkge0BsaW5rIE1vY2tJbWV9CisgICAgICovCisgICAgQE5vbk51bGwKKyAgICBwdWJsaWMgSW1lQ29tbWFuZCBjYWxsQ29tbWl0VGV4dChATm9uTnVsbCBDaGFyU2VxdWVuY2UgdGV4dCwgaW50IG5ld0N1cnNvclBvc2l0aW9uKSB7CisgICAgICAgIGZpbmFsIEJ1bmRsZSBwYXJhbXMgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgIHBhcmFtcy5wdXRDaGFyU2VxdWVuY2UoInRleHQiLCB0ZXh0KTsKKyAgICAgICAgcGFyYW1zLnB1dEludCgibmV3Q3Vyc29yUG9zaXRpb24iLCBuZXdDdXJzb3JQb3NpdGlvbik7CisgICAgICAgIGZpbmFsIEltZUNvbW1hbmQgY29tbWFuZCA9IG5ldyBJbWVDb21tYW5kKAorICAgICAgICAgICAgICAgICJjb21taXRUZXh0IiwgU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lTmFub3MoKSwgdHJ1ZSwgcGFyYW1zKTsKKyAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoKTsKKyAgICAgICAgaW50ZW50LnNldFBhY2thZ2UobUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSk7CisgICAgICAgIGludGVudC5zZXRBY3Rpb24oTW9ja0ltZS5nZXRDb21tYW5kQWN0aW9uTmFtZShtSW1lRXZlbnRBY3Rpb25OYW1lKSk7CisgICAgICAgIGludGVudC5wdXRFeHRyYXMoY29tbWFuZC50b0J1bmRsZSgpKTsKKyAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChpbnRlbnQpOworICAgICAgICByZXR1cm4gY29tbWFuZDsKKyAgICB9CisKKyAgICBATm9uTnVsbAorICAgIHB1YmxpYyBJbWVDb21tYW5kIGNhbGxTZXRCYWNrRGlzcG9zaXRpb24oaW50IGJhY2tEaXNwb3NpdGlvbikgeworICAgICAgICBmaW5hbCBCdW5kbGUgcGFyYW1zID0gbmV3IEJ1bmRsZSgpOworICAgICAgICBwYXJhbXMucHV0SW50KCJiYWNrRGlzcG9zaXRpb24iLCBiYWNrRGlzcG9zaXRpb24pOworICAgICAgICBmaW5hbCBJbWVDb21tYW5kIGNvbW1hbmQgPSBuZXcgSW1lQ29tbWFuZCgKKyAgICAgICAgICAgICAgICAic2V0QmFja0Rpc3Bvc2l0aW9uIiwgU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lTmFub3MoKSwgdHJ1ZSwgcGFyYW1zKTsKKyAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoKTsKKyAgICAgICAgaW50ZW50LnNldFBhY2thZ2UobUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSk7CisgICAgICAgIGludGVudC5zZXRBY3Rpb24oTW9ja0ltZS5nZXRDb21tYW5kQWN0aW9uTmFtZShtSW1lRXZlbnRBY3Rpb25OYW1lKSk7CisgICAgICAgIGludGVudC5wdXRFeHRyYXMoY29tbWFuZC50b0J1bmRsZSgpKTsKKyAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChpbnRlbnQpOworICAgICAgICByZXR1cm4gY29tbWFuZDsKKyAgICB9CisKKyAgICBATm9uTnVsbAorICAgIHB1YmxpYyBJbWVDb21tYW5kIGNhbGxSZXF1ZXN0SGlkZVNlbGYoaW50IGZsYWdzKSB7CisgICAgICAgIGZpbmFsIEJ1bmRsZSBwYXJhbXMgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgIHBhcmFtcy5wdXRJbnQoImZsYWdzIiwgZmxhZ3MpOworICAgICAgICBmaW5hbCBJbWVDb21tYW5kIGNvbW1hbmQgPSBuZXcgSW1lQ29tbWFuZCgKKyAgICAgICAgICAgICAgICAicmVxdWVzdEhpZGVTZWxmIiwgU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lTmFub3MoKSwgdHJ1ZSwgcGFyYW1zKTsKKyAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoKTsKKyAgICAgICAgaW50ZW50LnNldFBhY2thZ2UobUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSk7CisgICAgICAgIGludGVudC5zZXRBY3Rpb24oTW9ja0ltZS5nZXRDb21tYW5kQWN0aW9uTmFtZShtSW1lRXZlbnRBY3Rpb25OYW1lKSk7CisgICAgICAgIGludGVudC5wdXRFeHRyYXMoY29tbWFuZC50b0J1bmRsZSgpKTsKKyAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChpbnRlbnQpOworICAgICAgICByZXR1cm4gY29tbWFuZDsKKyAgICB9CisKKyAgICBATm9uTnVsbAorICAgIHB1YmxpYyBJbWVDb21tYW5kIGNhbGxSZXF1ZXN0U2hvd1NlbGYoaW50IGZsYWdzKSB7CisgICAgICAgIGZpbmFsIEJ1bmRsZSBwYXJhbXMgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgIHBhcmFtcy5wdXRJbnQoImZsYWdzIiwgZmxhZ3MpOworICAgICAgICBmaW5hbCBJbWVDb21tYW5kIGNvbW1hbmQgPSBuZXcgSW1lQ29tbWFuZCgKKyAgICAgICAgICAgICAgICAicmVxdWVzdFNob3dTZWxmIiwgU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lTmFub3MoKSwgdHJ1ZSwgcGFyYW1zKTsKKyAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoKTsKKyAgICAgICAgaW50ZW50LnNldFBhY2thZ2UobUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSk7CisgICAgICAgIGludGVudC5zZXRBY3Rpb24oTW9ja0ltZS5nZXRDb21tYW5kQWN0aW9uTmFtZShtSW1lRXZlbnRBY3Rpb25OYW1lKSk7CisgICAgICAgIGludGVudC5wdXRFeHRyYXMoY29tbWFuZC50b0J1bmRsZSgpKTsKKyAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChpbnRlbnQpOworICAgICAgICByZXR1cm4gY29tbWFuZDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnB1dG1ldGhvZC9yZXMveG1sL21ldGhvZC54bWwgYi90ZXN0cy9pbnB1dG1ldGhvZC9yZXMveG1sL21ldGhvZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI2NmZiYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2lucHV0bWV0aG9kL3Jlcy94bWwvbWV0aG9kLnhtbApAQCAtMCwwICsxLDE5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8aW5wdXQtbWV0aG9kIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+Cis8L2lucHV0LW1ldGhvZD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2lucHV0bWV0aG9kL3NyYy9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvY3RzL0Jhc2VJbnB1dENvbm5lY3Rpb25UZXN0LmphdmEgYi90ZXN0cy9pbnB1dG1ldGhvZC9zcmMvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL2N0cy9CYXNlSW5wdXRDb25uZWN0aW9uVGVzdC5qYXZhCmluZGV4IGQ1YWNlMmUuLjhkOTg5MGQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2lucHV0bWV0aG9kL3NyYy9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvY3RzL0Jhc2VJbnB1dENvbm5lY3Rpb25UZXN0LmphdmEKKysrIGIvdGVzdHMvaW5wdXRtZXRob2Qvc3JjL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9jdHMvQmFzZUlucHV0Q29ubmVjdGlvblRlc3QuamF2YQpAQCAtMjIsODggKzIyLDYyIEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCi1pbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5DbGlwRGVzY3JpcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LkVkaXRhYmxlOwogaW1wb3J0IGFuZHJvaWQudGV4dC5TZWxlY3Rpb247CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZTsKIGltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nOworaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmVkOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LktleUNoYXJhY3Rlck1hcDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvdzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuQmFzZUlucHV0Q29ubmVjdGlvbjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuQ29tcGxldGlvbkluZm87CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLkV4dHJhY3RlZFRleHRSZXF1ZXN0OwogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dENvbnRlbnRJbmZvOwogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dE1ldGhvZE1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLmN0cy5SOwogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5jdHMudXRpbC5JbnB1dENvbm5lY3Rpb25UZXN0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRWRpdFRleHQ7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlBvbGxpbmdDaGVjazsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiAKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIAogQE1lZGl1bVRlc3QKIEBSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCiBwdWJsaWMgY2xhc3MgQmFzZUlucHV0Q29ubmVjdGlvblRlc3QgewotICAgIC8qKiBFeHRlbmRlZCB0aW1lb3V0IGluIGNhc2UgdGhlIHN5c3RlbSBpcyBzbHVnZ2lzaCAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgV0lORE9XX0ZPQ1VTX1RJTUVPVVQgPSAxMDAwMDsKIAotICAgIHByaXZhdGUgSW5zdHJ1bWVudGF0aW9uIG1JbnN0cnVtZW50YXRpb247Ci0gICAgcHJpdmF0ZSBJbnB1dE1ldGhvZEN0c0FjdGl2aXR5IG1BY3Rpdml0eTsKLSAgICBwcml2YXRlIFdpbmRvdyBtV2luZG93OwotICAgIHByaXZhdGUgRWRpdFRleHQgbVZpZXc7Ci0gICAgcHJpdmF0ZSBCYXNlSW5wdXRDb25uZWN0aW9uIG1Db25uZWN0aW9uOwotCi0gICAgQFJ1bGUKLSAgICBwdWJsaWMgQWN0aXZpdHlUZXN0UnVsZTxJbnB1dE1ldGhvZEN0c0FjdGl2aXR5PiBtQWN0aXZpdHlSdWxlID0KLSAgICAgICAgICAgIG5ldyBBY3Rpdml0eVRlc3RSdWxlPD4oSW5wdXRNZXRob2RDdHNBY3Rpdml0eS5jbGFzcyk7Ci0KLSAgICBAQmVmb3JlCi0gICAgcHVibGljIHZvaWQgc2V0dXAoKSB7Ci0gICAgICAgIG1JbnN0cnVtZW50YXRpb24gPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKTsKLSAgICAgICAgbUFjdGl2aXR5ID0gbUFjdGl2aXR5UnVsZS5nZXRBY3Rpdml0eSgpOwotICAgICAgICBQb2xsaW5nQ2hlY2sud2FpdEZvcihXSU5ET1dfRk9DVVNfVElNRU9VVCwgbUFjdGl2aXR5OjpoYXNXaW5kb3dGb2N1cyk7Ci0gICAgICAgIG1XaW5kb3cgPSBtQWN0aXZpdHkuZ2V0V2luZG93KCk7Ci0gICAgICAgIG1WaWV3ID0gKEVkaXRUZXh0KSBtV2luZG93LmZpbmRWaWV3QnlJZChSLmlkLmVudHJ5KTsKLSAgICAgICAgbUNvbm5lY3Rpb24gPSBuZXcgQmFzZUlucHV0Q29ubmVjdGlvbihtVmlldywgdHJ1ZSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgQmFzZUlucHV0Q29ubmVjdGlvbiBjcmVhdGVCYXNlSW5wdXRDb25uZWN0aW9uKCkgeworICAgICAgICBmaW5hbCBWaWV3IHZpZXcgPSBuZXcgVmlldyhJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRUYXJnZXRDb250ZXh0KCkpOworICAgICAgICByZXR1cm4gbmV3IEJhc2VJbnB1dENvbm5lY3Rpb24odmlldywgdHJ1ZSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE1ldGhvZHMoKSB7CiAgICAgICAgIC8vIFRoZXNlIG1ldGhvZHMgYXJlIGRlZmF1bHQgdG8gcmV0dXJuIGZpeGVkIHJlc3VsdC4KKyAgICAgICAgZmluYWwgQmFzZUlucHV0Q29ubmVjdGlvbiBjb25uZWN0aW9uID0gY3JlYXRlQmFzZUlucHV0Q29ubmVjdGlvbigpOwogCi0gICAgICAgIGFzc2VydEZhbHNlKG1Db25uZWN0aW9uLmJlZ2luQmF0Y2hFZGl0KCkpOwotICAgICAgICBhc3NlcnRGYWxzZShtQ29ubmVjdGlvbi5lbmRCYXRjaEVkaXQoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGNvbm5lY3Rpb24uYmVnaW5CYXRjaEVkaXQoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGNvbm5lY3Rpb24uZW5kQmF0Y2hFZGl0KCkpOwogCiAgICAgICAgIC8vIG9ubHkgZml0IGZvciB0ZXN0IGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgY29tbWl0Q29tcGxldGlvbi4KICAgICAgICAgaW50IGNvbXBsZXRpb25JZCA9IDE7CiAgICAgICAgIFN0cmluZyBjb21wbGV0aW9uU3RyaW5nID0gImNvbW1pdENvbXBsZXRpb24gdGVzdCI7Ci0gICAgICAgIGFzc2VydEZhbHNlKG1Db25uZWN0aW9uLmNvbW1pdENvbXBsZXRpb24obmV3IENvbXBsZXRpb25JbmZvKGNvbXBsZXRpb25JZCwKKyAgICAgICAgYXNzZXJ0RmFsc2UoY29ubmVjdGlvbi5jb21taXRDb21wbGV0aW9uKG5ldyBDb21wbGV0aW9uSW5mbyhjb21wbGV0aW9uSWQsCiAgICAgICAgICAgICAgICAgMCwgY29tcGxldGlvblN0cmluZykpKTsKIAotICAgICAgICBhc3NlcnROdWxsKG1Db25uZWN0aW9uLmdldEV4dHJhY3RlZFRleHQobmV3IEV4dHJhY3RlZFRleHRSZXF1ZXN0KCksIDApKTsKKyAgICAgICAgYXNzZXJ0TnVsbChjb25uZWN0aW9uLmdldEV4dHJhY3RlZFRleHQobmV3IEV4dHJhY3RlZFRleHRSZXF1ZXN0KCksIDApKTsKIAogICAgICAgICAvLyBvbmx5IGZpdCBmb3IgdGVzdCBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHBlcmZvcm1FZGl0b3JBY3Rpb24uCiAgICAgICAgIGludCBhY3Rpb25Db2RlID0gMTsKICAgICAgICAgaW50IGFjdGlvbklkID0gMjsKICAgICAgICAgU3RyaW5nIGFjdGlvbiA9ICJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiI7Ci0gICAgICAgIGFzc2VydFRydWUobUNvbm5lY3Rpb24ucGVyZm9ybUVkaXRvckFjdGlvbihhY3Rpb25Db2RlKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKG1Db25uZWN0aW9uLnBlcmZvcm1Db250ZXh0TWVudUFjdGlvbihhY3Rpb25JZCkpOwotICAgICAgICBhc3NlcnRGYWxzZShtQ29ubmVjdGlvbi5wZXJmb3JtUHJpdmF0ZUNvbW1hbmQoYWN0aW9uLCBuZXcgQnVuZGxlKCkpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb25uZWN0aW9uLnBlcmZvcm1FZGl0b3JBY3Rpb24oYWN0aW9uQ29kZSkpOworICAgICAgICBhc3NlcnRGYWxzZShjb25uZWN0aW9uLnBlcmZvcm1Db250ZXh0TWVudUFjdGlvbihhY3Rpb25JZCkpOworICAgICAgICBhc3NlcnRGYWxzZShjb25uZWN0aW9uLnBlcmZvcm1Qcml2YXRlQ29tbWFuZChhY3Rpb24sIG5ldyBCdW5kbGUoKSkpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0xMjMsMTI0ICs5Nyw3NiBAQAogICAgICAqIGNsZWFyTWV0YUtleVN0YXRlczogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB1c2VzCiAgICAgICogICAgICAgICAgICAgIE1ldGFLZXlLZXlMaXN0ZW5lciNjbGVhck1ldGFLZXlTdGF0ZShsb25nLCBpbnQpIHRvIGNsZWFyIHRoZSBzdGF0ZS4KICAgICAgKiAgICAgICAgICAgICAgQnVnSWQ6MTczODUxMQotICAgICAqIGNvbW1pdFRleHQ6IDEuIERlZmF1bHQgaW1wbGVtZW50YXRpb24gcmVwbGFjZXMgYW55IGV4aXN0aW5nIGNvbXBvc2luZyB0ZXh0IHdpdGggdGhlIGdpdmVuCi0gICAgICogICAgICAgICAgICAgICAgdGV4dC4KLSAgICAgKiAgICAgICAgICAgICAyLiBJbiBhZGRpdGlvbiwgb25seSBpZiBkdW1teSBtb2RlLCBhIGtleSBldmVudCBpcyBzZW50IGZvciB0aGUgbmV3IHRleHQgYW5kIHRoZQotICAgICAqICAgICAgICAgICAgICAgIGN1cnJlbnQgZWRpdGFibGUgYnVmZmVyIGNsZWFyZWQuCisgICAgICogY29tbWl0VGV4dDogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXBsYWNlcyBhbnkgZXhpc3RpbmcgY29tcG9zaW5nIHRleHQgd2l0aCB0aGUgZ2l2ZW4KKyAgICAgKiAgICAgICAgICAgICB0ZXh0LgogICAgICAqIGRlbGV0ZVN1cnJvdW5kaW5nVGV4dDogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcGVyZm9ybXMgdGhlIGRlbGV0aW9uIGFyb3VuZCB0aGUgY3VycmVudAogICAgICAqICAgICAgICAgICAgICBzZWxlY3Rpb24gcG9zaXRpb24gb2YgdGhlIGVkaXRhYmxlIHRleHQuCi0gICAgICogZ2V0Q3Vyc29yQ2Fwc01vZGU6IDEuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHVzZXMgVGV4dFV0aWxzLmdldENhcHNNb2RlIHRvIGdldCB0aGUKKyAgICAgKiBnZXRDdXJzb3JDYXBzTW9kZTogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdXNlcyBUZXh0VXRpbHMuZ2V0Q2Fwc01vZGUgdG8gZ2V0IHRoZQogICAgICAqICAgICAgICAgICAgICAgICAgY3Vyc29yIGNhcHMgbW9kZSBmb3IgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIHBvc2l0aW9uIGluIHRoZSBlZGl0YWJsZSB0ZXh0LgogICAgICAqICAgICAgICAgICAgICAgICAgVGV4dFV0aWxzLmdldENhcHNNb2RlIGlzIHRlc3RlZCBmdWxseSBpbiBUZXh0VXRpbHNUZXN0I3Rlc3RHZXRDYXBzTW9kZS4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgMi4gSW4gZHVtbXkgbW9kZSBpbiB3aGljaCBjYXNlIDAgaXMgYWx3YXlzIHJldHVybmVkLgogICAgICAqIGdldFRleHRCZWZvcmVDdXJzb3IsIGdldFRleHRBZnRlckN1cnNvcjogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcGVyZm9ybXMgdGhlIGRlbGV0aW9uCiAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGFyb3VuZCB0aGUgY3VycmVudCBzZWxlY3Rpb24gcG9zaXRpb24gb2YgdGhlIGVkaXRhYmxlIHRleHQuCiAgICAgICogc2V0U2VsZWN0aW9uOiBjaGFuZ2VzIHRoZSBzZWxlY3Rpb24gcG9zaXRpb24gaW4gdGhlIGN1cnJlbnQgZWRpdGFibGUgdGV4dC4KICAgICAgKi8KICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RPcFRleHRNZXRob2RzKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgcHVibGljIHZvaWQgdGVzdE9wVGV4dE1ldGhvZHMoKSB7CisgICAgICAgIGZpbmFsIEJhc2VJbnB1dENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IGNyZWF0ZUJhc2VJbnB1dENvbm5lY3Rpb24oKTsKKwogICAgICAgICAvLyByZXR1cm4gaXMgYW4gZGVmYXVsdCBFZGl0YWJsZSBpbnN0YW5jZSB3aXRoIGVtcHR5IHNvdXJjZQotICAgICAgICBmaW5hbCBFZGl0YWJsZSB0ZXh0ID0gbUNvbm5lY3Rpb24uZ2V0RWRpdGFibGUoKTsKKyAgICAgICAgZmluYWwgRWRpdGFibGUgdGV4dCA9IGNvbm5lY3Rpb24uZ2V0RWRpdGFibGUoKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbCh0ZXh0KTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHRleHQubGVuZ3RoKCkpOwogCiAgICAgICAgIC8vIFRlc3QgY29tbWl0VGV4dCwgbm90IGR1bW15IG1vZGUKICAgICAgICAgQ2hhclNlcXVlbmNlIHN0ciA9ICJUZXN0Q29tbWl0ICI7CiAgICAgICAgIEVkaXRhYmxlIGlucHV0VGV4dCA9IEVkaXRhYmxlLkZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5uZXdFZGl0YWJsZShzdHIpOwotICAgICAgICBtQ29ubmVjdGlvbi5jb21taXRUZXh0KGlucHV0VGV4dCwgaW5wdXRUZXh0Lmxlbmd0aCgpKTsKLSAgICAgICAgZmluYWwgRWRpdGFibGUgdGV4dDIgPSBtQ29ubmVjdGlvbi5nZXRFZGl0YWJsZSgpOworICAgICAgICBjb25uZWN0aW9uLmNvbW1pdFRleHQoaW5wdXRUZXh0LCBpbnB1dFRleHQubGVuZ3RoKCkpOworICAgICAgICBmaW5hbCBFZGl0YWJsZSB0ZXh0MiA9IGNvbm5lY3Rpb24uZ2V0RWRpdGFibGUoKTsKICAgICAgICAgaW50IHN0ckxlbmd0aCA9IHN0ci5sZW5ndGgoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKHN0ckxlbmd0aCwgdGV4dDIubGVuZ3RoKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoc3RyLnRvU3RyaW5nKCksIHRleHQyLnRvU3RyaW5nKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoVGV4dFV0aWxzLkNBUF9NT0RFX1dPUkRTLAotICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uLmdldEN1cnNvckNhcHNNb2RlKFRleHRVdGlscy5DQVBfTU9ERV9XT1JEUykpOworICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uZ2V0Q3Vyc29yQ2Fwc01vZGUoVGV4dFV0aWxzLkNBUF9NT0RFX1dPUkRTKSk7CiAgICAgICAgIGludCBvZmZMZW5ndGggPSAzOwogICAgICAgICBDaGFyU2VxdWVuY2UgZXhwZWN0ZWQgPSBzdHIuc3ViU2VxdWVuY2Uoc3RyTGVuZ3RoIC0gb2ZmTGVuZ3RoLCBzdHJMZW5ndGgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQudG9TdHJpbmcoKSwgbUNvbm5lY3Rpb24uZ2V0VGV4dEJlZm9yZUN1cnNvcihvZmZMZW5ndGgsCisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZC50b1N0cmluZygpLCBjb25uZWN0aW9uLmdldFRleHRCZWZvcmVDdXJzb3Iob2ZmTGVuZ3RoLAogICAgICAgICAgICAgICAgIEJhc2VJbnB1dENvbm5lY3Rpb24uR0VUX1RFWFRfV0lUSF9TVFlMRVMpLnRvU3RyaW5nKCkpOwotICAgICAgICBtQ29ubmVjdGlvbi5zZXRTZWxlY3Rpb24oMCwgMCk7CisgICAgICAgIGNvbm5lY3Rpb24uc2V0U2VsZWN0aW9uKDAsIDApOwogICAgICAgICBleHBlY3RlZCA9IHN0ci5zdWJTZXF1ZW5jZSgwLCBvZmZMZW5ndGgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQudG9TdHJpbmcoKSwgbUNvbm5lY3Rpb24uZ2V0VGV4dEFmdGVyQ3Vyc29yKG9mZkxlbmd0aCwKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLnRvU3RyaW5nKCksIGNvbm5lY3Rpb24uZ2V0VGV4dEFmdGVyQ3Vyc29yKG9mZkxlbmd0aCwKICAgICAgICAgICAgICAgICBCYXNlSW5wdXRDb25uZWN0aW9uLkdFVF9URVhUX1dJVEhfU1RZTEVTKS50b1N0cmluZygpKTsKIAotICAgICAgICBtQWN0aXZpdHlSdWxlLnJ1bk9uVWlUaHJlYWQoKCkgLT4gewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtVmlldy5yZXF1ZXN0Rm9jdXMoKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1WaWV3LmlzRm9jdXNlZCgpKTsKLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gZHVtbXkgbW9kZQotICAgICAgICBCYXNlSW5wdXRDb25uZWN0aW9uIGR1bW15Q29ubmVjdGlvbiA9IG5ldyBCYXNlSW5wdXRDb25uZWN0aW9uKG1WaWV3LCBmYWxzZSk7Ci0gICAgICAgIGR1bW15Q29ubmVjdGlvbi5jb21taXRUZXh0KGlucHV0VGV4dCwgaW5wdXRUZXh0Lmxlbmd0aCgpKTsKLSAgICAgICAgUG9sbGluZ0NoZWNrLndhaXRGb3IoKCkgLT4gdGV4dDIudG9TdHJpbmcoKS5lcXVhbHMobVZpZXcuZ2V0VGV4dCgpLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGR1bW15Q29ubmVjdGlvbi5nZXRDdXJzb3JDYXBzTW9kZShUZXh0VXRpbHMuQ0FQX01PREVfV09SRFMpKTsKLQogICAgICAgICAvLyBUZXN0IGRlbGV0ZVN1cnJvdW5kaW5nVGV4dAogICAgICAgICBpbnQgZW5kID0gdGV4dDIubGVuZ3RoKCk7Ci0gICAgICAgIG1Db25uZWN0aW9uLnNldFNlbGVjdGlvbihlbmQsIGVuZCk7CisgICAgICAgIGNvbm5lY3Rpb24uc2V0U2VsZWN0aW9uKGVuZCwgZW5kKTsKICAgICAgICAgLy8gRGVsZXRlIHRoZSBlbmRpbmcgc3BhY2UKLSAgICAgICAgYXNzZXJ0VHJ1ZShtQ29ubmVjdGlvbi5kZWxldGVTdXJyb3VuZGluZ1RleHQoMSwgMikpOwotICAgICAgICBFZGl0YWJsZSB0ZXh0MyA9IG1Db25uZWN0aW9uLmdldEVkaXRhYmxlKCk7CisgICAgICAgIGFzc2VydFRydWUoY29ubmVjdGlvbi5kZWxldGVTdXJyb3VuZGluZ1RleHQoMSwgMikpOworICAgICAgICBFZGl0YWJsZSB0ZXh0MyA9IGNvbm5lY3Rpb24uZ2V0RWRpdGFibGUoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKHN0ckxlbmd0aCAtIDEsIHRleHQzLmxlbmd0aCgpKTsKICAgICAgICAgU3RyaW5nIGV4cGVjdGVkRGVsU3RyaW5nID0gIlRlc3RDb21taXQiOwogICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWREZWxTdHJpbmcsIHRleHQzLnRvU3RyaW5nKCkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIGZpbmlzaENvbXBvc2luZ1RleHQ6IDEuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJlbW92ZXMgdGhlIGNvbXBvc2luZyBzdGF0ZSBmcm9tIHRoZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgZWRpdGFibGUgdGV4dC4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAyLiBJbiBhZGRpdGlvbiwgb25seSBpZiBkdW1teSBtb2RlLCBhIGtleSBldmVudCBpcyBzZW50IGZvciB0aGUgbmV3Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCBhbmQgdGhlIGN1cnJlbnQgZWRpdGFibGUgYnVmZmVyIGNsZWFyZWQuCisgICAgICogZmluaXNoQ29tcG9zaW5nVGV4dDogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmVtb3ZlcyB0aGUgY29tcG9zaW5nIHN0YXRlIGZyb20gdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBlZGl0YWJsZSB0ZXh0LgogICAgICAqIHNldENvbXBvc2luZ1RleHQ6IFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHBsYWNlcyB0aGUgZ2l2ZW4gdGV4dCBpbnRvIHRoZSBlZGl0YWJsZSwKICAgICAgKiAgICAgICAgICAgICAgICAgIHJlcGxhY2luZyBhbnkgZXhpc3RpbmcgY29tcG9zaW5nIHRleHQKICAgICAgKi8KICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RGaW5pc2hDb21wb3NpbmdUZXh0KCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgcHVibGljIHZvaWQgdGVzdEZpbmlzaENvbXBvc2luZ1RleHQoKSB7CisgICAgICAgIGZpbmFsIEJhc2VJbnB1dENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IGNyZWF0ZUJhc2VJbnB1dENvbm5lY3Rpb24oKTsKICAgICAgICAgQ2hhclNlcXVlbmNlIHN0ciA9ICJUZXN0RmluaXNoIjsKICAgICAgICAgRWRpdGFibGUgaW5wdXRUZXh0ID0gRWRpdGFibGUuRmFjdG9yeS5nZXRJbnN0YW5jZSgpLm5ld0VkaXRhYmxlKHN0cik7Ci0gICAgICAgIG1Db25uZWN0aW9uLmNvbW1pdFRleHQoaW5wdXRUZXh0LCBpbnB1dFRleHQubGVuZ3RoKCkpOwotICAgICAgICBmaW5hbCBFZGl0YWJsZSB0ZXh0ID0gbUNvbm5lY3Rpb24uZ2V0RWRpdGFibGUoKTsKKyAgICAgICAgY29ubmVjdGlvbi5jb21taXRUZXh0KGlucHV0VGV4dCwgaW5wdXRUZXh0Lmxlbmd0aCgpKTsKKyAgICAgICAgZmluYWwgRWRpdGFibGUgdGV4dCA9IGNvbm5lY3Rpb24uZ2V0RWRpdGFibGUoKTsKICAgICAgICAgLy8gVGVzdCBmaW5pc2hDb21wb3NpbmdUZXh0LCBub3QgZHVtbXkgbW9kZQogICAgICAgICBCYXNlSW5wdXRDb25uZWN0aW9uLnNldENvbXBvc2luZ1NwYW5zKHRleHQpOwogICAgICAgICBhc3NlcnRUcnVlKEJhc2VJbnB1dENvbm5lY3Rpb24uZ2V0Q29tcG9zaW5nU3BhblN0YXJ0KHRleHQpID4gLTEpOwogICAgICAgICBhc3NlcnRUcnVlKEJhc2VJbnB1dENvbm5lY3Rpb24uZ2V0Q29tcG9zaW5nU3BhbkVuZCh0ZXh0KSA+IC0xKTsKLSAgICAgICAgbUNvbm5lY3Rpb24uZmluaXNoQ29tcG9zaW5nVGV4dCgpOworICAgICAgICBjb25uZWN0aW9uLmZpbmlzaENvbXBvc2luZ1RleHQoKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShCYXNlSW5wdXRDb25uZWN0aW9uLmdldENvbXBvc2luZ1NwYW5TdGFydCh0ZXh0KSA9PSAtMSk7CiAgICAgICAgIGFzc2VydFRydWUoQmFzZUlucHV0Q29ubmVjdGlvbi5nZXRDb21wb3NpbmdTcGFuRW5kKHRleHQpID09IC0xKTsKLQotICAgICAgICBtQWN0aXZpdHlSdWxlLnJ1bk9uVWlUaHJlYWQoKCkgLT4gewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtVmlldy5yZXF1ZXN0Rm9jdXMoKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1WaWV3LmlzRm9jdXNlZCgpKTsKLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gZHVtbXkgbW9kZQotICAgICAgICBCYXNlSW5wdXRDb25uZWN0aW9uIGR1bW15Q29ubmVjdGlvbiA9IG5ldyBCYXNlSW5wdXRDb25uZWN0aW9uKG1WaWV3LCBmYWxzZSk7Ci0gICAgICAgIGR1bW15Q29ubmVjdGlvbi5zZXRDb21wb3NpbmdUZXh0KHN0ciwgc3RyLmxlbmd0aCgpKTsKLSAgICAgICAgZHVtbXlDb25uZWN0aW9uLmZpbmlzaENvbXBvc2luZ1RleHQoKTsKLSAgICAgICAgUG9sbGluZ0NoZWNrLndhaXRGb3IoKCkgLT4gdGV4dC50b1N0cmluZygpLmVxdWFscyhtVmlldy5nZXRUZXh0KCkudG9TdHJpbmcoKSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb3ZpZGVzIHN0YW5kYXJkIGltcGxlbWVudGF0aW9uIGZvciBzZW5kaW5nIGEga2V5IGV2ZW50IHRvIHRoZSB3aW5kb3cKLSAgICAgKiBhdHRhY2hlZCB0byB0aGUgaW5wdXQgY29ubmVjdGlvbidzIHZpZXcKLSAgICAgKi8KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kS2V5RXZlbnQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgbUFjdGl2aXR5UnVsZS5ydW5PblVpVGhyZWFkKCgpIC0+IHsKLSAgICAgICAgICAgIGFzc2VydFRydWUobVZpZXcucmVxdWVzdEZvY3VzKCkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtVmlldy5pc0ZvY3VzZWQoKSk7Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8vIDEyLWtleSBzdXBwb3J0Ci0gICAgICAgIEtleUNoYXJhY3Rlck1hcCBrZXltYXAgPSBLZXlDaGFyYWN0ZXJNYXAubG9hZChLZXlDaGFyYWN0ZXJNYXAuVklSVFVBTF9LRVlCT0FSRCk7Ci0gICAgICAgIGlmIChrZXltYXAuZ2V0S2V5Ym9hcmRUeXBlKCkgPT0gS2V5Q2hhcmFjdGVyTWFwLk5VTUVSSUMpIHsKLSAgICAgICAgICAgIC8vICdRJyBpbiBjYXNlIG9mIDEyLWtleShOVU1FUklDKSBrZXlib2FyZAotICAgICAgICAgICAgbUNvbm5lY3Rpb24uc2VuZEtleUV2ZW50KG5ldyBLZXlFdmVudChLZXlFdmVudC5BQ1RJT05fRE9XTiwgS2V5RXZlbnQuS0VZQ09ERV83KSk7Ci0gICAgICAgICAgICBtQ29ubmVjdGlvbi5zZW5kS2V5RXZlbnQobmV3IEtleUV2ZW50KEtleUV2ZW50LkFDVElPTl9ET1dOLCBLZXlFdmVudC5LRVlDT0RFXzcpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1JbnN0cnVtZW50YXRpb24uc2VuZFN0cmluZ1N5bmMoInEiKTsKLSAgICAgICAgICAgIG1JbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7Ci0gICAgICAgIH0KLSAgICAgICAgUG9sbGluZ0NoZWNrLndhaXRGb3IoKCkgLT4gInEiLmVxdWFscyhtVmlldy5nZXRUZXh0KCkudG9TdHJpbmcoKSkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjQ4LDMxICsxNzQsMzIgQEAKICAgICAgKi8KICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBvcnRGdWxsc2NyZWVuTW9kZSgpIHsKLSAgICAgICAgSW5wdXRNZXRob2RNYW5hZ2VyIGltTWFuYWdlciA9IChJbnB1dE1ldGhvZE1hbmFnZXIpIG1JbnN0cnVtZW50YXRpb24uZ2V0VGFyZ2V0Q29udGV4dCgpCi0gICAgICAgICAgICAgICAgLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5JTlBVVF9NRVRIT0RfU0VSVklDRSk7Ci0gICAgICAgIG1Db25uZWN0aW9uLnJlcG9ydEZ1bGxzY3JlZW5Nb2RlKGZhbHNlKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoaW1NYW5hZ2VyLmlzRnVsbHNjcmVlbk1vZGUoKSk7Ci0gICAgICAgIG1Db25uZWN0aW9uLnJlcG9ydEZ1bGxzY3JlZW5Nb2RlKHRydWUpOworICAgICAgICBmaW5hbCBJbnB1dE1ldGhvZE1hbmFnZXIgaW1tID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkKKyAgICAgICAgICAgICAgICAuZ2V0VGFyZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoSW5wdXRNZXRob2RNYW5hZ2VyLmNsYXNzKTsKKyAgICAgICAgZmluYWwgQmFzZUlucHV0Q29ubmVjdGlvbiBjb25uZWN0aW9uID0gY3JlYXRlQmFzZUlucHV0Q29ubmVjdGlvbigpOworICAgICAgICBjb25uZWN0aW9uLnJlcG9ydEZ1bGxzY3JlZW5Nb2RlKGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoaW1tLmlzRnVsbHNjcmVlbk1vZGUoKSk7CisgICAgICAgIGNvbm5lY3Rpb24ucmVwb3J0RnVsbHNjcmVlbk1vZGUodHJ1ZSk7CiAgICAgICAgIC8vIE9ubHkgSU1FcyBhcmUgYWxsb3dlZCB0byByZXBvcnQgZnVsbC1zY3JlZW4gbW9kZS4gIENhbGxpbmcgdGhpcyBtZXRob2QgZnJvbSB0aGUKICAgICAgICAgLy8gYXBwbGljYXRpb24gc2hvdWxkIGhhdmUgbm8gZWZmZWN0LgotICAgICAgICBhc3NlcnRGYWxzZShpbU1hbmFnZXIuaXNGdWxsc2NyZWVuTW9kZSgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoaW1tLmlzRnVsbHNjcmVlbk1vZGUoKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQW4gdXRpbGl0eSBtZXRob2QgdG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBCYXNlSW5wdXRDb25uZWN0aW9ufSBpbiBkdW1teSBtb2RlIHdpdGgKLSAgICAgKiBhbiBpbml0aWFsIHRleHQgYW5kIHNlbGVjdGlvbiByYW5nZS4KLSAgICAgKiBAcGFyYW0gdmlldyB0aGUge0BsaW5rIFZpZXd9IHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUge0BsaW5rIEJhc2VJbnB1dENvbm5lY3Rpb259LgorICAgICAqIEFuIHV0aWxpdHkgbWV0aG9kIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgQmFzZUlucHV0Q29ubmVjdGlvbn0gaW4gdGhlIGZ1bGwgZWRpdG9yCisgICAgICogbW9kZSB3aXRoIGFuIGluaXRpYWwgdGV4dCBhbmQgc2VsZWN0aW9uIHJhbmdlLgorICAgICAqCiAgICAgICogQHBhcmFtIHNvdXJjZSB0aGUgaW5pdGlhbCB0ZXh0LgotICAgICAqIEByZXR1cm4ge0BsaW5rIEJhc2VJbnB1dENvbm5lY3Rpb259IGluc3RhbnRpYXRlZCBpbiBkdW1teSBtb2RlIHdpdGgge0Bjb2RlIHNvdXJjZX0gYW5kCi0gICAgICogc2VsZWN0aW9uIHJhbmdlIGZyb20ge0Bjb2RlIHNlbGVjdGlvblN0YXJ0fSB0byB7QGNvZGUgc2VsZWN0aW9uRW5kfQorICAgICAqIEByZXR1cm4ge0BsaW5rIEJhc2VJbnB1dENvbm5lY3Rpb259IGluc3RhbnRpYXRlZCBpbiB0aGUgZnVsbCBlZGl0b3IgbW9kZSB3aXRoIHtAY29kZSBzb3VyY2V9CisgICAgICogICAgICAgICBhbmQgc2VsZWN0aW9uIHJhbmdlIGZyb20ge0Bjb2RlIHNlbGVjdGlvblN0YXJ0fSB0byB7QGNvZGUgc2VsZWN0aW9uRW5kfQogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIEJhc2VJbnB1dENvbm5lY3Rpb24gY3JlYXRlRHVtbXlDb25uZWN0aW9uV2l0aFNlbGVjdGlvbigKLSAgICAgICAgICAgIGZpbmFsIFZpZXcgdmlldywgZmluYWwgQ2hhclNlcXVlbmNlIHNvdXJjZSkgeworICAgIHByaXZhdGUgc3RhdGljIEJhc2VJbnB1dENvbm5lY3Rpb24gY3JlYXRlQ29ubmVjdGlvbldpdGhTZWxlY3Rpb24oQ2hhclNlcXVlbmNlIHNvdXJjZSkgewogICAgICAgICBmaW5hbCBpbnQgc2VsZWN0aW9uU3RhcnQgPSBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uU3RhcnQoc291cmNlKTsKICAgICAgICAgZmluYWwgaW50IHNlbGVjdGlvbkVuZCA9IFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQoc291cmNlKTsKICAgICAgICAgZmluYWwgRWRpdGFibGUgZWRpdGFibGUgPSBFZGl0YWJsZS5GYWN0b3J5LmdldEluc3RhbmNlKCkubmV3RWRpdGFibGUoc291cmNlKTsKICAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihlZGl0YWJsZSwgc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCk7Ci0gICAgICAgIHJldHVybiBuZXcgQmFzZUlucHV0Q29ubmVjdGlvbih2aWV3LCBmYWxzZSkgeworICAgICAgICBmaW5hbCBWaWV3IHZpZXcgPSBuZXcgVmlldyhJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRUYXJnZXRDb250ZXh0KCkpOworICAgICAgICByZXR1cm4gbmV3IEJhc2VJbnB1dENvbm5lY3Rpb24odmlldywgdHJ1ZSkgewogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgRWRpdGFibGUgZ2V0RWRpdGFibGUoKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGVkaXRhYmxlOwpAQCAtMjgwLDEwICsyMDcsMTAgQEAKICAgICAgICAgfTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgdmVyaWZ5RGVsZXRlU3Vycm91bmRpbmdUZXh0TWFpbihmaW5hbCBTdHJpbmcgaW5pdGlhbFN0YXRlLAorICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdmVyaWZ5RGVsZXRlU3Vycm91bmRpbmdUZXh0TWFpbihmaW5hbCBTdHJpbmcgaW5pdGlhbFN0YXRlLAogICAgICAgICAgICAgZmluYWwgaW50IGRlbGV0ZUJlZm9yZSwgZmluYWwgaW50IGRlbGV0ZUFmdGVyLCBmaW5hbCBTdHJpbmcgZXhwZWN0ZWRTdGF0ZSkgewogICAgICAgICBmaW5hbCBDaGFyU2VxdWVuY2Ugc291cmNlID0gSW5wdXRDb25uZWN0aW9uVGVzdFV0aWxzLmZvcm1hdFN0cmluZyhpbml0aWFsU3RhdGUpOwotICAgICAgICBmaW5hbCBCYXNlSW5wdXRDb25uZWN0aW9uIGljID0gY3JlYXRlRHVtbXlDb25uZWN0aW9uV2l0aFNlbGVjdGlvbihtVmlldywgc291cmNlKTsKKyAgICAgICAgZmluYWwgQmFzZUlucHV0Q29ubmVjdGlvbiBpYyA9IGNyZWF0ZUNvbm5lY3Rpb25XaXRoU2VsZWN0aW9uKHNvdXJjZSk7CiAgICAgICAgIGljLmRlbGV0ZVN1cnJvdW5kaW5nVGV4dChkZWxldGVCZWZvcmUsIGRlbGV0ZUFmdGVyKTsKIAogICAgICAgICBmaW5hbCBDaGFyU2VxdWVuY2UgZXhwZWN0ZWRTdHJpbmcgPSBJbnB1dENvbm5lY3Rpb25UZXN0VXRpbHMuZm9ybWF0U3RyaW5nKGV4cGVjdGVkU3RhdGUpOwpAQCAtMzE4LDcgKzI0NSw3IEBACiAgICAgICogVGVzdHMge0BsaW5rIEJhc2VJbnB1dENvbm5lY3Rpb24jZGVsZXRlU3Vycm91bmRpbmdUZXh0KGludCwgaW50KX0gY29tcHJlaGVuc2l2ZWx5LgogICAgICAqLwogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdERlbGV0ZVN1cnJvdW5kaW5nVGV4dCgpIHRocm93cyBUaHJvd2FibGUgeworICAgIHB1YmxpYyB2b2lkIHRlc3REZWxldGVTdXJyb3VuZGluZ1RleHQoKSB7CiAgICAgICAgIHZlcmlmeURlbGV0ZVN1cnJvdW5kaW5nVGV4dE1haW4oIjAxMltdMzQ1Njc4OSIsIDAsIDAsICIwMTJbXTM0NTY3ODkiKTsKICAgICAgICAgdmVyaWZ5RGVsZXRlU3Vycm91bmRpbmdUZXh0TWFpbigiMDEyW10zNDU2Nzg5IiwgLTEsIC0xLCAiMDEyW10zNDU2Nzg5Iik7CiAgICAgICAgIHZlcmlmeURlbGV0ZVN1cnJvdW5kaW5nVGV4dE1haW4oIjAxMltdMzQ1Njc4OSIsIDEsIDIsICIwMVtdNTY3ODkiKTsKQEAgLTM1OCwxMSArMjg1LDEwIEBACiAgICAgICAgIHZlcmlmeURlbGV0ZVN1cnJvdW5kaW5nVGV4dE1haW4oIjAxMltdPj41Njc4OSIsIDAsIDMsICIwMTJbXTY3ODkiKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgdmVyaWZ5RGVsZXRlU3Vycm91bmRpbmdUZXh0SW5Db2RlUG9pbnRzTWFpbihmaW5hbCBTdHJpbmcgaW5pdGlhbFN0YXRlLAotICAgICAgICAgICAgZmluYWwgaW50IGRlbGV0ZUJlZm9yZUluQ29kZVBvaW50cywgZmluYWwgaW50IGRlbGV0ZUFmdGVySW5Db2RlUG9pbnRzLAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdGVkU3RhdGUpIHsKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZlcmlmeURlbGV0ZVN1cnJvdW5kaW5nVGV4dEluQ29kZVBvaW50c01haW4oU3RyaW5nIGluaXRpYWxTdGF0ZSwKKyAgICAgICAgICAgIGludCBkZWxldGVCZWZvcmVJbkNvZGVQb2ludHMsIGludCBkZWxldGVBZnRlckluQ29kZVBvaW50cywgU3RyaW5nIGV4cGVjdGVkU3RhdGUpIHsKICAgICAgICAgZmluYWwgQ2hhclNlcXVlbmNlIHNvdXJjZSA9IElucHV0Q29ubmVjdGlvblRlc3RVdGlscy5mb3JtYXRTdHJpbmcoaW5pdGlhbFN0YXRlKTsKLSAgICAgICAgZmluYWwgQmFzZUlucHV0Q29ubmVjdGlvbiBpYyA9IGNyZWF0ZUR1bW15Q29ubmVjdGlvbldpdGhTZWxlY3Rpb24obVZpZXcsIHNvdXJjZSk7CisgICAgICAgIGZpbmFsIEJhc2VJbnB1dENvbm5lY3Rpb24gaWMgPSBjcmVhdGVDb25uZWN0aW9uV2l0aFNlbGVjdGlvbihzb3VyY2UpOwogICAgICAgICBpYy5kZWxldGVTdXJyb3VuZGluZ1RleHRJbkNvZGVQb2ludHMoZGVsZXRlQmVmb3JlSW5Db2RlUG9pbnRzLCBkZWxldGVBZnRlckluQ29kZVBvaW50cyk7CiAKICAgICAgICAgZmluYWwgQ2hhclNlcXVlbmNlIGV4cGVjdGVkU3RyaW5nID0gSW5wdXRDb25uZWN0aW9uVGVzdFV0aWxzLmZvcm1hdFN0cmluZyhleHBlY3RlZFN0YXRlKTsKQEAgLTM5OSw3ICszMjUsNyBAQAogICAgICAqIGNvbXByZWhlbnNpdmVseS4KICAgICAgKi8KICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3REZWxldGVTdXJyb3VuZGluZ1RleHRJbkNvZGVQb2ludHMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlU3Vycm91bmRpbmdUZXh0SW5Db2RlUG9pbnRzKCkgewogICAgICAgICB2ZXJpZnlEZWxldGVTdXJyb3VuZGluZ1RleHRJbkNvZGVQb2ludHNNYWluKCIwMTJbXTM0NTY3ODkiLCAwLCAwLCAiMDEyW10zNDU2Nzg5Iik7CiAgICAgICAgIHZlcmlmeURlbGV0ZVN1cnJvdW5kaW5nVGV4dEluQ29kZVBvaW50c01haW4oIjAxMltdMzQ1Njc4OSIsIC0xLCAtMSwgIjAxMltdMzQ1Njc4OSIpOwogICAgICAgICB2ZXJpZnlEZWxldGVTdXJyb3VuZGluZ1RleHRJbkNvZGVQb2ludHNNYWluKCIwMTJbXTM0NTY3ODkiLCAxLCAyLCAiMDFbXTU2Nzg5Iik7CkBAIC00OTEsMzIgKzQxNyw1MCBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc2VDb25uZWN0aW9uKCkgeworICAgICAgICBmaW5hbCBCYXNlSW5wdXRDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSBjcmVhdGVCYXNlSW5wdXRDb25uZWN0aW9uKCk7CisKICAgICAgICAgZmluYWwgQ2hhclNlcXVlbmNlIHNvdXJjZSA9ICIwMTIzNDU2Nzg5IjsKLSAgICAgICAgbUNvbm5lY3Rpb24uY29tbWl0VGV4dChzb3VyY2UsIHNvdXJjZS5sZW5ndGgoKSk7Ci0gICAgICAgIGZpbmFsIEVkaXRhYmxlIHRleHQgPSBtQ29ubmVjdGlvbi5nZXRFZGl0YWJsZSgpOwotICAgICAgICBCYXNlSW5wdXRDb25uZWN0aW9uLnNldENvbXBvc2luZ1NwYW5zKHRleHQsIDIsIDUpOworICAgICAgICBjb25uZWN0aW9uLmNvbW1pdFRleHQoc291cmNlLCBzb3VyY2UubGVuZ3RoKCkpOworICAgICAgICBjb25uZWN0aW9uLnNldENvbXBvc2luZ1JlZ2lvbigyLCA1KTsKKyAgICAgICAgZmluYWwgRWRpdGFibGUgdGV4dCA9IGNvbm5lY3Rpb24uZ2V0RWRpdGFibGUoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIEJhc2VJbnB1dENvbm5lY3Rpb24uZ2V0Q29tcG9zaW5nU3BhblN0YXJ0KHRleHQpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDUsIEJhc2VJbnB1dENvbm5lY3Rpb24uZ2V0Q29tcG9zaW5nU3BhbkVuZCh0ZXh0KSk7CiAKICAgICAgICAgLy8gQmFzZUlucHV0Q29ubmVjdGlvbiNjbG9zZUNvbm5lY3Rpb24oKSBtdXN0IGNsZWFyIHRoZSBvbi1nb2luZyBjb21wb3NpdGlvbi4KLSAgICAgICAgbUNvbm5lY3Rpb24uY2xvc2VDb25uZWN0aW9uKCk7CisgICAgICAgIGNvbm5lY3Rpb24uY2xvc2VDb25uZWN0aW9uKCk7CiAgICAgICAgIGFzc2VydEVxdWFscygtMSwgQmFzZUlucHV0Q29ubmVjdGlvbi5nZXRDb21wb3NpbmdTcGFuU3RhcnQodGV4dCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIEJhc2VJbnB1dENvbm5lY3Rpb24uZ2V0Q29tcG9zaW5nU3BhbkVuZCh0ZXh0KSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SGFuZGxlcigpIHsKKyAgICAgICAgZmluYWwgQmFzZUlucHV0Q29ubmVjdGlvbiBjb25uZWN0aW9uID0gY3JlYXRlQmFzZUlucHV0Q29ubmVjdGlvbigpOworCiAgICAgICAgIC8vIEJhc2VJbnB1dENvbm5lY3Rpb24gbXVzdCBub3QgaW1wbGVtZW50IGdldEhhbmRsZXIoKS4KLSAgICAgICAgYXNzZXJ0TnVsbChtQ29ubmVjdGlvbi5nZXRIYW5kbGVyKCkpOworICAgICAgICBhc3NlcnROdWxsKGNvbm5lY3Rpb24uZ2V0SGFuZGxlcigpKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RDb21taXRDb250ZW50KCkgeworICAgICAgICBmaW5hbCBCYXNlSW5wdXRDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSBjcmVhdGVCYXNlSW5wdXRDb25uZWN0aW9uKCk7CisKICAgICAgICAgZmluYWwgSW5wdXRDb250ZW50SW5mbyBpbnB1dENvbnRlbnRJbmZvID0gbmV3IElucHV0Q29udGVudEluZm8oCiAgICAgICAgICAgICAgICAgVXJpLnBhcnNlKCJjb250ZW50Oi8vY29tLmV4YW1wbGUvcGF0aCIpLAogICAgICAgICAgICAgICAgIG5ldyBDbGlwRGVzY3JpcHRpb24oInNhbXBsZSBjb250ZW50IiwgbmV3IFN0cmluZ1tdeyJpbWFnZS9wbmcifSksCiAgICAgICAgICAgICAgICAgVXJpLnBhcnNlKCJodHRwczovL2V4YW1wbGUuY29tIikpOwogICAgICAgICAvLyBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzaG91bGQgZG8gbm90aGluZyBhbmQganVzdCByZXR1cm4gZmFsc2UuCi0gICAgICAgIGFzc2VydEZhbHNlKG1Db25uZWN0aW9uLmNvbW1pdENvbnRlbnQoaW5wdXRDb250ZW50SW5mbywgMCAvKiBmbGFncyAqLywgbnVsbCAvKiBvcHRzICovKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGNvbm5lY3Rpb24uY29tbWl0Q29udGVudChpbnB1dENvbnRlbnRJbmZvLCAwIC8qIGZsYWdzICovLCBudWxsIC8qIG9wdHMgKi8pKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTZWxlY3RlZFRleHRfd3JvbmdTZWxlY3Rpb24oKSB7CisgICAgICAgIGZpbmFsIEJhc2VJbnB1dENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IGNyZWF0ZUJhc2VJbnB1dENvbm5lY3Rpb24oKTsKKyAgICAgICAgRWRpdGFibGUgZWRpdGFibGUgPSBjb25uZWN0aW9uLmdldEVkaXRhYmxlKCk7CisgICAgICAgIGVkaXRhYmxlLmFwcGVuZCgiaGVsbG8iKTsKKyAgICAgICAgZWRpdGFibGUuc2V0U3BhbihTZWxlY3Rpb24uU0VMRUNUSU9OX1NUQVJULCA0LCA0LCBTcGFubmVkLlNQQU5fUE9JTlRfUE9JTlQpOworICAgICAgICBlZGl0YWJsZS5yZW1vdmVTcGFuKFNlbGVjdGlvbi5TRUxFQ1RJT05fRU5EKTsKKworICAgICAgICAvLyBTaG91bGQgbm90IGNyYXNoLgorICAgICAgICBjb25uZWN0aW9uLmdldFNlbGVjdGVkVGV4dCgwKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnB1dG1ldGhvZC9zcmMvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL2N0cy9Db21wbGV0aW9uSW5mb1Rlc3QuamF2YSBiL3Rlc3RzL2lucHV0bWV0aG9kL3NyYy9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvY3RzL0NvbXBsZXRpb25JbmZvVGVzdC5qYXZhCmluZGV4IDlhOGQyMDYuLjdjZTFlOTkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2lucHV0bWV0aG9kL3NyYy9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvY3RzL0NvbXBsZXRpb25JbmZvVGVzdC5qYXZhCisrKyBiL3Rlc3RzL2lucHV0bWV0aG9kL3NyYy9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvY3RzL0NvbXBsZXRpb25JbmZvVGVzdC5qYXZhCkBAIC0yMCwxMCArMjAsMTEgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwogCiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLkNvbXBsZXRpb25JbmZvOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCmRpZmYgLS1naXQgYS90ZXN0cy9pbnB1dG1ldGhvZC9zcmMvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL2N0cy9FZGl0b3JJbmZvVGVzdC5qYXZhIGIvdGVzdHMvaW5wdXRtZXRob2Qvc3JjL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9jdHMvRWRpdG9ySW5mb1Rlc3QuamF2YQppbmRleCAxNTU3NTExLi41YTU3NDRmIDEwMDY0NAotLS0gYS90ZXN0cy9pbnB1dG1ldGhvZC9zcmMvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL2N0cy9FZGl0b3JJbmZvVGVzdC5qYXZhCisrKyBiL3Rlc3RzL2lucHV0bWV0aG9kL3NyYy9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvY3RzL0VkaXRvckluZm9UZXN0LmphdmEKQEAgLTI2LDEzICsyNiwxNCBAQAogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuTG9jYWxlTGlzdDsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnRlc3QuTW9yZUFzc2VydHM7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuUHJpbnRlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuRWRpdG9ySW5mbzsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvaW5wdXRtZXRob2Qvc3JjL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9jdHMvRXh0cmFjdGVkVGV4dFJlcXVlc3RUZXN0LmphdmEgYi90ZXN0cy9pbnB1dG1ldGhvZC9zcmMvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL2N0cy9FeHRyYWN0ZWRUZXh0UmVxdWVzdFRlc3QuamF2YQppbmRleCAzZTEyNTc5Li5kY2UxMGRlIDEwMDY0NAotLS0gYS90ZXN0cy9pbnB1dG1ldGhvZC9zcmMvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL2N0cy9FeHRyYWN0ZWRUZXh0UmVxdWVzdFRlc3QuamF2YQorKysgYi90ZXN0cy9pbnB1dG1ldGhvZC9zcmMvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL2N0cy9FeHRyYWN0ZWRUZXh0UmVxdWVzdFRlc3QuamF2YQpAQCAtMTksMTAgKzE5LDExIEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogCiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLkV4dHJhY3RlZFRleHRSZXF1ZXN0OwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCmRpZmYgLS1naXQgYS90ZXN0cy9pbnB1dG1ldGhvZC9zcmMvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL2N0cy9FeHRyYWN0ZWRUZXh0VGVzdC5qYXZhIGIvdGVzdHMvaW5wdXRtZXRob2Qvc3JjL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9jdHMvRXh0cmFjdGVkVGV4dFRlc3QuamF2YQppbmRleCA0MWUzZWZhLi4yMjJlMDZlIDEwMDY0NAotLS0gYS90ZXN0cy9pbnB1dG1ldGhvZC9zcmMvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL2N0cy9FeHRyYWN0ZWRUZXh0VGVzdC5qYXZhCisrKyBiL3Rlc3RzL2lucHV0bWV0aG9kL3NyYy9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvY3RzL0V4dHJhY3RlZFRleHRUZXN0LmphdmEKQEAgLTE4LDExICsxOCwxNyBAQAogCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogCitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5UeXBlZmFjZTsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKK2ltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlOworaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmdCdWlsZGVyOworaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmVkOworaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5TdHlsZVNwYW47CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLkV4dHJhY3RlZFRleHQ7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKQEAgLTM4LDYgKzQ0LDkgQEAKICAgICAgICAgZXh0cmFjdGVkVGV4dC5zdGFydE9mZnNldCA9IDE7CiAgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0ID0gInRlc3QiOwogICAgICAgICBleHRyYWN0ZWRUZXh0LnRleHQgPSB0ZXh0OworICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIGhpbnQgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcigiaGludCIpOworICAgICAgICBoaW50LnNldFNwYW4obmV3IFN0eWxlU3BhbihUeXBlZmFjZS5CT0xEKSwgMSwgMywgU3Bhbm5lZC5TUEFOX0lOQ0xVU0lWRV9JTkNMVVNJVkUpOworICAgICAgICBleHRyYWN0ZWRUZXh0LmhpbnQgPSBoaW50OwogICAgICAgICBQYXJjZWwgcCA9IFBhcmNlbC5vYnRhaW4oKTsKICAgICAgICAgZXh0cmFjdGVkVGV4dC53cml0ZVRvUGFyY2VsKHAsIDApOwogICAgICAgICBwLnNldERhdGFQb3NpdGlvbigwKTsKQEAgLTQ5LDcgKzU4LDEyIEBACiAgICAgICAgIGFzc2VydEVxdWFscyhleHRyYWN0ZWRUZXh0LnBhcnRpYWxTdGFydE9mZnNldCwgdGFyZ2V0LnBhcnRpYWxTdGFydE9mZnNldCk7CiAgICAgICAgIGFzc2VydEVxdWFscyhleHRyYWN0ZWRUZXh0LnBhcnRpYWxFbmRPZmZzZXQsIHRhcmdldC5wYXJ0aWFsRW5kT2Zmc2V0KTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4dHJhY3RlZFRleHQudGV4dC50b1N0cmluZygpLCB0YXJnZXQudGV4dC50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4dHJhY3RlZFRleHQuaGludC50b1N0cmluZygpLCB0YXJnZXQuaGludC50b1N0cmluZygpKTsKKyAgICAgICAgZmluYWwgU3Bhbm5hYmxlIGhpbnRUZXh0ID0gKFNwYW5uYWJsZSkgZXh0cmFjdGVkVGV4dC5oaW50OworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgaGludFRleHQuZ2V0U3BhbnMoMCwgaGludFRleHQubGVuZ3RoKCksIFN0eWxlU3Bhbi5jbGFzcykubGVuZ3RoKTsKIAogICAgICAgICBhc3NlcnRFcXVhbHMoMCwgZXh0cmFjdGVkVGV4dC5kZXNjcmliZUNvbnRlbnRzKCkpOworCisgICAgICAgIHAucmVjeWNsZSgpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2lucHV0bWV0aG9kL3NyYy9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvY3RzL0ZvY3VzSGFuZGxpbmdUZXN0LmphdmEgYi90ZXN0cy9pbnB1dG1ldGhvZC9zcmMvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL2N0cy9Gb2N1c0hhbmRsaW5nVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYzY4NDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnB1dG1ldGhvZC9zcmMvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL2N0cy9Gb2N1c0hhbmRsaW5nVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDE3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuY3RzOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5TT0ZUX0lOUFVUX1NUQVRFX0FMV0FZU19WSVNJQkxFOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuY3RzLnV0aWwuVGVzdFV0aWxzLnJ1bk9uTWFpblN5bmM7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQud2lkZ2V0LlBvcHVwV2luZG93LklOUFVUX01FVEhPRF9OT1RfTkVFREVEOworCitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmN0cy5tb2NraW1lLkltZUV2ZW50U3RyZWFtVGVzdFV0aWxzLmVkaXRvck1hdGNoZXI7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmN0cy5tb2NraW1lLkltZUV2ZW50U3RyZWFtVGVzdFV0aWxzLmV4cGVjdEJpbmRJbnB1dDsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY3RzLm1vY2tpbWUuSW1lRXZlbnRTdHJlYW1UZXN0VXRpbHMuZXhwZWN0Q29tbWFuZDsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY3RzLm1vY2tpbWUuSW1lRXZlbnRTdHJlYW1UZXN0VXRpbHMuZXhwZWN0RXZlbnQ7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmN0cy5tb2NraW1lLkltZUV2ZW50U3RyZWFtVGVzdFV0aWxzLm5vdEV4cGVjdEV2ZW50OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb247CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuRWRpdG9ySW5mbzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5jdHMudXRpbC5FbmRUb0VuZEltZVRlc3RCYXNlOworaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5jdHMudXRpbC5UZXN0QWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLmN0cy51dGlsLlRlc3RVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuY3RzLnV0aWwuV2luZG93Rm9jdXNTdGVhbGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkVkaXRUZXh0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5Qb3B1cFdpbmRvdzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ3RzVG91Y2hVdGlsczsKK2ltcG9ydCBjb20uYW5kcm9pZC5jdHMubW9ja2ltZS5JbWVDb21tYW5kOworaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy5tb2NraW1lLkltZUV2ZW50OworaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy5tb2NraW1lLkltZUV2ZW50U3RyZWFtOworaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy5tb2NraW1lLkltZVNldHRpbmdzOworaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy5tb2NraW1lLk1vY2tJbWVTZXNzaW9uOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY1JlZmVyZW5jZTsKKworQE1lZGl1bVRlc3QKK0BSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgRm9jdXNIYW5kbGluZ1Rlc3QgZXh0ZW5kcyBFbmRUb0VuZEltZVRlc3RCYXNlIHsKKyAgICBzdGF0aWMgZmluYWwgbG9uZyBUSU1FT1VUID0gVGltZVVuaXQuU0VDT05EUy50b01pbGxpcyg1KTsKKyAgICBzdGF0aWMgZmluYWwgbG9uZyBOT1RfRVhQRUNUX1RJTUVPVVQgPSBUaW1lVW5pdC5TRUNPTkRTLnRvTWlsbGlzKDEpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfTUFSS0VSX1BSRUZJWCA9CisgICAgICAgICJhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuY3RzLkZvY3VzSGFuZGxpbmdUZXN0IjsKKworICAgIHB1YmxpYyBFZGl0VGV4dCBsYXVuY2hUZXN0QWN0aXZpdHkoU3RyaW5nIG1hcmtlcikgeworICAgICAgICBmaW5hbCBBdG9taWNSZWZlcmVuY2U8RWRpdFRleHQ+IGVkaXRUZXh0UmVmID0gbmV3IEF0b21pY1JlZmVyZW5jZTw+KCk7CisgICAgICAgIFRlc3RBY3Rpdml0eS5zdGFydFN5bmMoYWN0aXZpdHktPiB7CisgICAgICAgICAgICBmaW5hbCBMaW5lYXJMYXlvdXQgbGF5b3V0ID0gbmV3IExpbmVhckxheW91dChhY3Rpdml0eSk7CisgICAgICAgICAgICBsYXlvdXQuc2V0T3JpZW50YXRpb24oTGluZWFyTGF5b3V0LlZFUlRJQ0FMKTsKKworICAgICAgICAgICAgZmluYWwgRWRpdFRleHQgZWRpdFRleHQgPSBuZXcgRWRpdFRleHQoYWN0aXZpdHkpOworICAgICAgICAgICAgZWRpdFRleHQuc2V0UHJpdmF0ZUltZU9wdGlvbnMobWFya2VyKTsKKyAgICAgICAgICAgIGVkaXRUZXh0LnNldEhpbnQoImVkaXRUZXh0Iik7CisgICAgICAgICAgICBlZGl0VGV4dC5yZXF1ZXN0Rm9jdXMoKTsKKyAgICAgICAgICAgIGVkaXRUZXh0UmVmLnNldChlZGl0VGV4dCk7CisKKyAgICAgICAgICAgIGxheW91dC5hZGRWaWV3KGVkaXRUZXh0KTsKKyAgICAgICAgICAgIHJldHVybiBsYXlvdXQ7CisgICAgICAgIH0pOworICAgICAgICByZXR1cm4gZWRpdFRleHRSZWYuZ2V0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFRlc3RNYXJrZXIoKSB7CisgICAgICAgIHJldHVybiBURVNUX01BUktFUl9QUkVGSVggKyAiLyIgICsgU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lTmFub3MoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPblN0YXJ0SW5wdXRDYWxsZWRPbmNlSW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSAoTW9ja0ltZVNlc3Npb24gaW1lU2Vzc2lvbiA9IE1vY2tJbWVTZXNzaW9uLmNyZWF0ZSgKKyAgICAgICAgICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VWlBdXRvbWF0aW9uKCksCisgICAgICAgICAgICAgICAgbmV3IEltZVNldHRpbmdzLkJ1aWxkZXIoKSkpIHsKKyAgICAgICAgICAgIGZpbmFsIEltZUV2ZW50U3RyZWFtIHN0cmVhbSA9IGltZVNlc3Npb24ub3BlbkV2ZW50U3RyZWFtKCk7CisKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtYXJrZXIgPSBnZXRUZXN0TWFya2VyKCk7CisgICAgICAgICAgICBmaW5hbCBFZGl0VGV4dCBlZGl0VGV4dCA9IGxhdW5jaFRlc3RBY3Rpdml0eShtYXJrZXIpOworCisgICAgICAgICAgICAvLyBXYWl0IHVudGlsIHRoZSBNb2NrSW1lIGdldHMgYm91bmQgdG8gdGhlIFRlc3RBY3Rpdml0eS4KKyAgICAgICAgICAgIGV4cGVjdEJpbmRJbnB1dChzdHJlYW0sIFByb2Nlc3MubXlQaWQoKSwgVElNRU9VVCk7CisKKyAgICAgICAgICAgIC8vIEVtdWxhdGUgdGFwIGV2ZW50CisgICAgICAgICAgICBDdHNUb3VjaFV0aWxzLmVtdWxhdGVUYXBPblZpZXdDZW50ZXIoCisgICAgICAgICAgICAgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLCBlZGl0VGV4dCk7CisKKyAgICAgICAgICAgIC8vIFdhaXQgdW50aWwgIm9uU3RhcnRJbnB1dCIgZ2V0cyBjYWxsZWQgZm9yIHRoZSBFZGl0VGV4dC4KKyAgICAgICAgICAgIGZpbmFsIEltZUV2ZW50IG9uU3RhcnQgPQorICAgICAgICAgICAgICAgICAgICBleHBlY3RFdmVudChzdHJlYW0sIGVkaXRvck1hdGNoZXIoIm9uU3RhcnRJbnB1dCIsIG1hcmtlciksIFRJTUVPVVQpOworCisgICAgICAgICAgICBhc3NlcnRGYWxzZShzdHJlYW0uZHVtcCgpLCBvblN0YXJ0LmdldEVudGVyU3RhdGUoKS5oYXNEdW1teUlucHV0Q29ubmVjdGlvbigpKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKHN0cmVhbS5kdW1wKCksIG9uU3RhcnQuZ2V0QXJndW1lbnRzKCkuZ2V0Qm9vbGVhbigicmVzdGFydGluZyIpKTsKKworICAgICAgICAgICAgLy8gVGhlcmUgc2hvdWxkbid0IGJlIG9uU3RhcnRJbnB1dCBhbnkgbW9yZS4KKyAgICAgICAgICAgIG5vdEV4cGVjdEV2ZW50KHN0cmVhbSwgZWRpdG9yTWF0Y2hlcigib25TdGFydElucHV0IiwgbWFya2VyKSwgTk9UX0VYUEVDVF9USU1FT1VUKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNvZnRJbnB1dFN0YXRlQWx3YXlzVmlzaWJsZVdpdGhvdXRGb2N1c2VkRWRpdG9yVmlldygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgKE1vY2tJbWVTZXNzaW9uIGltZVNlc3Npb24gPSBNb2NrSW1lU2Vzc2lvbi5jcmVhdGUoCisgICAgICAgICAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLmdldFVpQXV0b21hdGlvbigpLAorICAgICAgICAgICAgICAgIG5ldyBJbWVTZXR0aW5ncy5CdWlsZGVyKCkpKSB7CisgICAgICAgICAgICBmaW5hbCBJbWVFdmVudFN0cmVhbSBzdHJlYW0gPSBpbWVTZXNzaW9uLm9wZW5FdmVudFN0cmVhbSgpOworCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWFya2VyID0gZ2V0VGVzdE1hcmtlcigpOworICAgICAgICAgICAgZmluYWwgVGVzdEFjdGl2aXR5IHRlc3RBY3Rpdml0eSA9IFRlc3RBY3Rpdml0eS5zdGFydFN5bmMoYWN0aXZpdHkgLT4geworICAgICAgICAgICAgICAgIGZpbmFsIExpbmVhckxheW91dCBsYXlvdXQgPSBuZXcgTGluZWFyTGF5b3V0KGFjdGl2aXR5KTsKKyAgICAgICAgICAgICAgICBsYXlvdXQuc2V0T3JpZW50YXRpb24oTGluZWFyTGF5b3V0LlZFUlRJQ0FMKTsKKworICAgICAgICAgICAgICAgIGZpbmFsIFRleHRWaWV3IHRleHRWaWV3ID0gbmV3IFRleHRWaWV3KGFjdGl2aXR5KSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkNoZWNrSXNUZXh0RWRpdG9yKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICB0ZXh0Vmlldy5zZXRUZXh0KCJ0ZXh0VmlldyIpOworICAgICAgICAgICAgICAgIHRleHRWaWV3LnNldFByaXZhdGVJbWVPcHRpb25zKG1hcmtlcik7CisgICAgICAgICAgICAgICAgdGV4dFZpZXcucmVxdWVzdEZvY3VzKCk7CisKKyAgICAgICAgICAgICAgICBhY3Rpdml0eS5nZXRXaW5kb3coKS5zZXRTb2Z0SW5wdXRNb2RlKFNPRlRfSU5QVVRfU1RBVEVfQUxXQVlTX1ZJU0lCTEUpOworICAgICAgICAgICAgICAgIGxheW91dC5hZGRWaWV3KHRleHRWaWV3KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGF5b3V0OworICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIGlmICh0ZXN0QWN0aXZpdHkuZ2V0QXBwbGljYXRpb25JbmZvKCkudGFyZ2V0U2RrVmVyc2lvbiA+PSBCdWlsZC5WRVJTSU9OX0NPREVTLlApIHsKKyAgICAgICAgICAgICAgICAvLyBJbnB1dCBzaG91bGRuJ3Qgc3RhcnQKKyAgICAgICAgICAgICAgICBub3RFeHBlY3RFdmVudChzdHJlYW0sIGVkaXRvck1hdGNoZXIoIm9uU3RhcnRJbnB1dCIsIG1hcmtlciksIFRJTUVPVVQpOworICAgICAgICAgICAgICAgIC8vIFRoZXJlIHNob3VsZG4ndCBiZSBvblN0YXJ0SW5wdXQgYmVjYXVzZSB0aGUgZm9jdXNlZCB2aWV3IGlzIG5vdCBhbiBlZGl0b3IuCisgICAgICAgICAgICAgICAgbm90RXhwZWN0RXZlbnQoc3RyZWFtLCBldmVudCAtPiAic2hvd1NvZnRJbnB1dCIuZXF1YWxzKGV2ZW50LmdldEV2ZW50TmFtZSgpKSwgVElNRU9VVCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFdhaXQgdW50aWwgdGhlIE1vY2tJbWUgZ2V0cyBib3VuZCB0byB0aGUgVGVzdEFjdGl2aXR5LgorICAgICAgICAgICAgICAgIGV4cGVjdEJpbmRJbnB1dChzdHJlYW0sIFByb2Nlc3MubXlQaWQoKSwgVElNRU9VVCk7CisgICAgICAgICAgICAgICAgLy8gRm9yIGFwcHMgdGhhdCB0YXJnZXQgcHJlLVAgZGV2aWNlcywgb25TdGFydElucHV0KCkgc2hvdWxkIGJlIGNhbGxlZC4KKyAgICAgICAgICAgICAgICBleHBlY3RFdmVudChzdHJlYW0sIGV2ZW50IC0+ICJzaG93U29mdElucHV0Ii5lcXVhbHMoZXZlbnQuZ2V0RXZlbnROYW1lKCkpLCBUSU1FT1VUKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVkaXRvclN0YXJ0c0lucHV0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSAoTW9ja0ltZVNlc3Npb24gaW1lU2Vzc2lvbiA9IE1vY2tJbWVTZXNzaW9uLmNyZWF0ZSgKKyAgICAgICAgICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VWlBdXRvbWF0aW9uKCksCisgICAgICAgICAgICAgICAgbmV3IEltZVNldHRpbmdzLkJ1aWxkZXIoKSkpIHsKKyAgICAgICAgICAgIGZpbmFsIEltZUV2ZW50U3RyZWFtIHN0cmVhbSA9IGltZVNlc3Npb24ub3BlbkV2ZW50U3RyZWFtKCk7CisKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtYXJrZXIgPSBnZXRUZXN0TWFya2VyKCk7CisgICAgICAgICAgICBUZXN0QWN0aXZpdHkuc3RhcnRTeW5jKGFjdGl2aXR5IC0+IHsKKyAgICAgICAgICAgICAgICBmaW5hbCBMaW5lYXJMYXlvdXQgbGF5b3V0ID0gbmV3IExpbmVhckxheW91dChhY3Rpdml0eSk7CisgICAgICAgICAgICAgICAgbGF5b3V0LnNldE9yaWVudGF0aW9uKExpbmVhckxheW91dC5WRVJUSUNBTCk7CisKKyAgICAgICAgICAgICAgICBmaW5hbCBFZGl0VGV4dCBlZGl0VGV4dCA9IG5ldyBFZGl0VGV4dChhY3Rpdml0eSk7CisgICAgICAgICAgICAgICAgZWRpdFRleHQuc2V0UHJpdmF0ZUltZU9wdGlvbnMobWFya2VyKTsKKyAgICAgICAgICAgICAgICBlZGl0VGV4dC5zZXRUZXh0KCJFZGl0YWJsZSIpOworICAgICAgICAgICAgICAgIGVkaXRUZXh0LnJlcXVlc3RGb2N1cygpOworICAgICAgICAgICAgICAgIGxheW91dC5hZGRWaWV3KGVkaXRUZXh0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGF5b3V0OworICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIC8vIElucHV0IHNob3VsZCBzdGFydAorICAgICAgICAgICAgZXhwZWN0RXZlbnQoc3RyZWFtLCBlZGl0b3JNYXRjaGVyKCJvblN0YXJ0SW5wdXQiLCBtYXJrZXIpLCBUSU1FT1VUKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNvZnRJbnB1dFN0YXRlQWx3YXlzVmlzaWJsZUZvY3VzZWRFZGl0b3JWaWV3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSAoTW9ja0ltZVNlc3Npb24gaW1lU2Vzc2lvbiA9IE1vY2tJbWVTZXNzaW9uLmNyZWF0ZSgKKyAgICAgICAgICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VWlBdXRvbWF0aW9uKCksCisgICAgICAgICAgICAgICAgbmV3IEltZVNldHRpbmdzLkJ1aWxkZXIoKSkpIHsKKyAgICAgICAgICAgIGZpbmFsIEltZUV2ZW50U3RyZWFtIHN0cmVhbSA9IGltZVNlc3Npb24ub3BlbkV2ZW50U3RyZWFtKCk7CisKKyAgICAgICAgICAgIFRlc3RBY3Rpdml0eS5zdGFydFN5bmMoYWN0aXZpdHkgLT4geworICAgICAgICAgICAgICAgIGZpbmFsIExpbmVhckxheW91dCBsYXlvdXQgPSBuZXcgTGluZWFyTGF5b3V0KGFjdGl2aXR5KTsKKyAgICAgICAgICAgICAgICBsYXlvdXQuc2V0T3JpZW50YXRpb24oTGluZWFyTGF5b3V0LlZFUlRJQ0FMKTsKKworICAgICAgICAgICAgICAgIGZpbmFsIEVkaXRUZXh0IGVkaXRUZXh0ID0gbmV3IEVkaXRUZXh0KGFjdGl2aXR5KTsKKyAgICAgICAgICAgICAgICBlZGl0VGV4dC5zZXRUZXh0KCJlZGl0VGV4dCIpOworICAgICAgICAgICAgICAgIGVkaXRUZXh0LnJlcXVlc3RGb2N1cygpOworCisgICAgICAgICAgICAgICAgYWN0aXZpdHkuZ2V0V2luZG93KCkuc2V0U29mdElucHV0TW9kZShTT0ZUX0lOUFVUX1NUQVRFX0FMV0FZU19WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICBsYXlvdXQuYWRkVmlldyhlZGl0VGV4dCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxheW91dDsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAvLyBXYWl0IHVudGlsIHRoZSBNb2NrSW1lIGdldHMgYm91bmQgdG8gdGhlIFRlc3RBY3Rpdml0eS4KKyAgICAgICAgICAgIGV4cGVjdEJpbmRJbnB1dChzdHJlYW0sIFByb2Nlc3MubXlQaWQoKSwgVElNRU9VVCk7CisKKyAgICAgICAgICAgIGV4cGVjdEV2ZW50KHN0cmVhbSwgZXZlbnQgLT4gInNob3dTb2Z0SW5wdXQiLmVxdWFscyhldmVudC5nZXRFdmVudE5hbWUoKSksIFRJTUVPVVQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFrZXMgc3VyZSB0aGF0IGFuIGV4aXN0aW5nIHtAbGluayBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRDb25uZWN0aW9ufSB3aWxsIG5vdCBiZQorICAgICAqIGludmFsaWRhdGVkIGJ5IHNob3dpbmcgYSBmb2N1c2FibGUge0BsaW5rIFBvcHVwV2luZG93fSB3aXRoCisgICAgICoge0BsaW5rIFBvcHVwV2luZG93I0lOUFVUX01FVEhPRF9OT1RfTkVFREVEfS4KKyAgICAgKgorICAgICAqIDxwPklmIHtAbGluayBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMjRkxBR19BTFRfRk9DVVNBQkxFX0lNfSBpcyBzZXQgYW5kCisgICAgICoge0BsaW5rIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyNGTEFHX05PVF9GT0NVU0FCTEV9IGlzIG5vdCBzZXQgdG8gYQorICAgICAqIHtAbGluayBhbmRyb2lkLnZpZXcuV2luZG93fSwgc2hvd2luZyB0aGF0IHdpbmRvdyBtdXN0IG5vdCBpbnZhbGlkYXRlIGFuIGV4aXN0aW5nIHZhbGlkCisgICAgICoge0BsaW5rIGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dENvbm5lY3Rpb259LjwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zI21heVVzZUlucHV0TWV0aG9kKGludCkKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGb2N1c2FibGVXaW5kb3dEb2VzTm90SW52YWxpZGF0ZUV4aXN0aW5nSW5wdXRDb25uZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEluc3RydW1lbnRhdGlvbiBpbnN0cnVtZW50YXRpb24gPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKTsKKyAgICAgICAgdHJ5IChNb2NrSW1lU2Vzc2lvbiBpbWVTZXNzaW9uID0gTW9ja0ltZVNlc3Npb24uY3JlYXRlKAorICAgICAgICAgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICBpbnN0cnVtZW50YXRpb24uZ2V0VWlBdXRvbWF0aW9uKCksCisgICAgICAgICAgICAgICAgbmV3IEltZVNldHRpbmdzLkJ1aWxkZXIoKSkpIHsKKyAgICAgICAgICAgIGZpbmFsIEltZUV2ZW50U3RyZWFtIHN0cmVhbSA9IGltZVNlc3Npb24ub3BlbkV2ZW50U3RyZWFtKCk7CisKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtYXJrZXIgPSBnZXRUZXN0TWFya2VyKCk7CisgICAgICAgICAgICBmaW5hbCBFZGl0VGV4dCBlZGl0VGV4dCA9IGxhdW5jaFRlc3RBY3Rpdml0eShtYXJrZXIpOworICAgICAgICAgICAgaW5zdHJ1bWVudGF0aW9uLnJ1bk9uTWFpblN5bmMoKCkgLT4gZWRpdFRleHQucmVxdWVzdEZvY3VzKCkpOworCisgICAgICAgICAgICAvLyBXYWl0IHVudGlsIHRoZSBNb2NrSW1lIGdldHMgYm91bmQgdG8gdGhlIFRlc3RBY3Rpdml0eS4KKyAgICAgICAgICAgIGV4cGVjdEJpbmRJbnB1dChzdHJlYW0sIFByb2Nlc3MubXlQaWQoKSwgVElNRU9VVCk7CisKKyAgICAgICAgICAgIGV4cGVjdEV2ZW50KHN0cmVhbSwgZWRpdG9yTWF0Y2hlcigib25TdGFydElucHV0IiwgbWFya2VyKSwgVElNRU9VVCk7CisKKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IElucHV0Q29ubmVjdGlvbiNjb21taXRUZXh0KCkgd29ya3MuCisgICAgICAgICAgICBmaW5hbCBJbWVDb21tYW5kIGNvbW1pdDEgPSBpbWVTZXNzaW9uLmNhbGxDb21taXRUZXh0KCJ0ZXN0IGNvbW1pdCIsIDEpOworICAgICAgICAgICAgZXhwZWN0Q29tbWFuZChzdHJlYW0sIGNvbW1pdDEsIFRJTUVPVVQpOworICAgICAgICAgICAgVGVzdFV0aWxzLndhaXRPbk1haW5VbnRpbCgKKyAgICAgICAgICAgICAgICAgICAgKCkgLT4gVGV4dFV0aWxzLmVxdWFscyhlZGl0VGV4dC5nZXRUZXh0KCksICJ0ZXN0IGNvbW1pdCIpLCBUSU1FT1VUKTsKKyAgICAgICAgICAgIGluc3RydW1lbnRhdGlvbi5ydW5Pbk1haW5TeW5jKCgpIC0+IGVkaXRUZXh0LnNldFRleHQoIiIpKTsKKworICAgICAgICAgICAgLy8gQ3JlYXRlIGEgcG9wdXAgd2luZG93IHRoYXQgY2Fubm90IGJlIHRoZSBJTUUgdGFyZ2V0LgorICAgICAgICAgICAgZmluYWwgUG9wdXBXaW5kb3cgcG9wdXBXaW5kb3cgPSBUZXN0VXRpbHMuZ2V0T25NYWluU3luYygoKSAtPiB7CisgICAgICAgICAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0ID0gaW5zdHJ1bWVudGF0aW9uLmdldFRhcmdldENvbnRleHQoKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBQb3B1cFdpbmRvdyBwb3B1cCA9IG5ldyBQb3B1cFdpbmRvdyhjb250ZXh0KTsKKyAgICAgICAgICAgICAgICBwb3B1cC5zZXRGb2N1c2FibGUodHJ1ZSk7CisgICAgICAgICAgICAgICAgcG9wdXAuc2V0SW5wdXRNZXRob2RNb2RlKElOUFVUX01FVEhPRF9OT1RfTkVFREVEKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBUZXh0VmlldyB0ZXh0VmlldyA9IG5ldyBUZXh0Vmlldyhjb250ZXh0KTsKKyAgICAgICAgICAgICAgICB0ZXh0Vmlldy5zZXRUZXh0KCJUZXN0IFRleHQiKTsKKyAgICAgICAgICAgICAgICBwb3B1cC5zZXRDb250ZW50Vmlldyh0ZXh0Vmlldyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBvcHVwOworICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIC8vIFNob3cgdGhlIHBvcHVwIHdpbmRvdy4KKyAgICAgICAgICAgIGluc3RydW1lbnRhdGlvbi5ydW5Pbk1haW5TeW5jKCgpIC0+IHBvcHVwV2luZG93LnNob3dBc0Ryb3BEb3duKGVkaXRUZXh0KSk7CisgICAgICAgICAgICBpbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7CisKKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBFZGl0VGV4dCBubyBsb25nZXIgaGFzIHdpbmRvdy1mb2N1cworICAgICAgICAgICAgVGVzdFV0aWxzLndhaXRPbk1haW5VbnRpbCgoKSAtPiAhZWRpdFRleHQuaGFzV2luZG93Rm9jdXMoKSwgVElNRU9VVCk7CisKKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IElucHV0Q29ubmVjdGlvbiNjb21taXRUZXh0KCkgd29ya3MuCisgICAgICAgICAgICBmaW5hbCBJbWVDb21tYW5kIGNvbW1pdDIgPSBpbWVTZXNzaW9uLmNhbGxDb21taXRUZXh0KCJIZWxsbyEiLCAxKTsKKyAgICAgICAgICAgIGV4cGVjdENvbW1hbmQoc3RyZWFtLCBjb21taXQyLCBUSU1FT1VUKTsKKyAgICAgICAgICAgIFRlc3RVdGlscy53YWl0T25NYWluVW50aWwoCisgICAgICAgICAgICAgICAgICAgICgpIC0+IFRleHRVdGlscy5lcXVhbHMoZWRpdFRleHQuZ2V0VGV4dCgpLCAiSGVsbG8hIiksIFRJTUVPVVQpOworICAgICAgICAgICAgaW5zdHJ1bWVudGF0aW9uLnJ1bk9uTWFpblN5bmMoKCkgLT4gZWRpdFRleHQuc2V0VGV4dCgiIikpOworCisgICAgICAgICAgICBzdHJlYW0uc2tpcEFsbCgpOworCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWFya2VyMiA9IGdldFRlc3RNYXJrZXIoKTsKKyAgICAgICAgICAgIC8vIENhbGwgSW5wdXRNZXRob2RNYW5hZ2VyI3Jlc3RhcnRJbnB1dCgpCisgICAgICAgICAgICBpbnN0cnVtZW50YXRpb24ucnVuT25NYWluU3luYygoKSAtPiB7CisgICAgICAgICAgICAgICAgZWRpdFRleHQuc2V0UHJpdmF0ZUltZU9wdGlvbnMobWFya2VyMik7CisgICAgICAgICAgICAgICAgZWRpdFRleHQuZ2V0Q29udGV4dCgpCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U3lzdGVtU2VydmljZShJbnB1dE1ldGhvZE1hbmFnZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAucmVzdGFydElucHV0KGVkaXRUZXh0KTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBvblN0YXJ0SW5wdXQoKSBpcyBjYWxsZWQgd2l0aCByZXN0YXJ0aW5nID09IHRydWUuCisgICAgICAgICAgICBleHBlY3RFdmVudChzdHJlYW0sIGV2ZW50IC0+IHsKKyAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5lcXVhbHMoIm9uU3RhcnRJbnB1dCIsIGV2ZW50LmdldEV2ZW50TmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghZXZlbnQuZ2V0QXJndW1lbnRzKCkuZ2V0Qm9vbGVhbigicmVzdGFydGluZyIpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmluYWwgRWRpdG9ySW5mbyBlZGl0b3JJbmZvID0gZXZlbnQuZ2V0QXJndW1lbnRzKCkuZ2V0UGFyY2VsYWJsZSgiZWRpdG9ySW5mbyIpOworICAgICAgICAgICAgICAgIHJldHVybiBUZXh0VXRpbHMuZXF1YWxzKG1hcmtlcjIsIGVkaXRvckluZm8ucHJpdmF0ZUltZU9wdGlvbnMpOworICAgICAgICAgICAgfSwgVElNRU9VVCk7CisKKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IElucHV0Q29ubmVjdGlvbiNjb21taXRUZXh0KCkgd29ya3MuCisgICAgICAgICAgICBmaW5hbCBJbWVDb21tYW5kIGNvbW1pdDMgPSBpbWVTZXNzaW9uLmNhbGxDb21taXRUZXh0KCJXb3JsZCEiLCAxKTsKKyAgICAgICAgICAgIGV4cGVjdENvbW1hbmQoc3RyZWFtLCBjb21taXQzLCBUSU1FT1VUKTsKKyAgICAgICAgICAgIFRlc3RVdGlscy53YWl0T25NYWluVW50aWwoCisgICAgICAgICAgICAgICAgICAgICgpIC0+IFRleHRVdGlscy5lcXVhbHMoZWRpdFRleHQuZ2V0VGV4dCgpLCAiV29ybGQhIiksIFRJTUVPVVQpOworICAgICAgICAgICAgaW5zdHJ1bWVudGF0aW9uLnJ1bk9uTWFpblN5bmMoKCkgLT4gZWRpdFRleHQuc2V0VGV4dCgiIikpOworCisgICAgICAgICAgICAvLyBEaXNtaXNzIHRoZSBwb3B1cCB3aW5kb3cuCisgICAgICAgICAgICBpbnN0cnVtZW50YXRpb24ucnVuT25NYWluU3luYygoKSAtPiBwb3B1cFdpbmRvdy5kaXNtaXNzKCkpOworICAgICAgICAgICAgaW5zdHJ1bWVudGF0aW9uLndhaXRGb3JJZGxlU3luYygpOworCisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgRWRpdFRleHQgbm93IGhhcyB3aW5kb3ctZm9jdXMgYWdhaW4uCisgICAgICAgICAgICBUZXN0VXRpbHMud2FpdE9uTWFpblVudGlsKCgpIC0+IGVkaXRUZXh0Lmhhc1dpbmRvd0ZvY3VzKCksIFRJTUVPVVQpOworCisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBJbnB1dENvbm5lY3Rpb24jY29tbWl0VGV4dCgpIHdvcmtzLgorICAgICAgICAgICAgZmluYWwgSW1lQ29tbWFuZCBjb21taXQ0ID0gaW1lU2Vzc2lvbi5jYWxsQ29tbWl0VGV4dCgiRG9uZSEiLCAxKTsKKyAgICAgICAgICAgIGV4cGVjdENvbW1hbmQoc3RyZWFtLCBjb21taXQ0LCBUSU1FT1VUKTsKKyAgICAgICAgICAgIFRlc3RVdGlscy53YWl0T25NYWluVW50aWwoCisgICAgICAgICAgICAgICAgICAgICgpIC0+IFRleHRVdGlscy5lcXVhbHMoZWRpdFRleHQuZ2V0VGV4dCgpLCAiRG9uZSEiKSwgVElNRU9VVCk7CisgICAgICAgICAgICBpbnN0cnVtZW50YXRpb24ucnVuT25NYWluU3luYygoKSAtPiBlZGl0VGV4dC5zZXRUZXh0KCIiKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGNhc2UgZm9yIEJ1ZyA3MDYyOTEwMi4KKyAgICAgKgorICAgICAqIHtAbGluayBJbnB1dE1ldGhvZE1hbmFnZXIjcmVzdGFydElucHV0KFZpZXcpfSBjYW4gYmUgY2FsbGVkIGV2ZW4gd2hlbiBhbm90aGVyIHByb2Nlc3MKKyAgICAgKiB0ZW1wb3JhcmlseSBvd25zIGZvY3VzZWQgd2luZG93LiB7QGxpbmsgSW5wdXRNZXRob2RNYW5hZ2VyfSBzaG91bGQgY29udGludWUgdG8gd29yayBhZnRlcgorICAgICAqIHRoZSBJTUUgdGFyZ2V0IGFwcGxpY2F0aW9uIGdhaW5zIHdpbmRvdyBmb2N1cyBhZ2Fpbi4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXN0YXJ0SW5wdXRXaGlsZU90aGVyUHJvY2Vzc0hhc1dpbmRvd0ZvY3VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEluc3RydW1lbnRhdGlvbiBpbnN0cnVtZW50YXRpb24gPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKTsKKyAgICAgICAgdHJ5IChNb2NrSW1lU2Vzc2lvbiBpbWVTZXNzaW9uID0gTW9ja0ltZVNlc3Npb24uY3JlYXRlKAorICAgICAgICAgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICBpbnN0cnVtZW50YXRpb24uZ2V0VWlBdXRvbWF0aW9uKCksCisgICAgICAgICAgICAgICAgbmV3IEltZVNldHRpbmdzLkJ1aWxkZXIoKSkpIHsKKyAgICAgICAgICAgIGZpbmFsIEltZUV2ZW50U3RyZWFtIHN0cmVhbSA9IGltZVNlc3Npb24ub3BlbkV2ZW50U3RyZWFtKCk7CisKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtYXJrZXIgPSBnZXRUZXN0TWFya2VyKCk7CisgICAgICAgICAgICBmaW5hbCBFZGl0VGV4dCBlZGl0VGV4dCA9IGxhdW5jaFRlc3RBY3Rpdml0eShtYXJrZXIpOworICAgICAgICAgICAgaW5zdHJ1bWVudGF0aW9uLnJ1bk9uTWFpblN5bmMoKCkgLT4gZWRpdFRleHQucmVxdWVzdEZvY3VzKCkpOworCisgICAgICAgICAgICAvLyBXYWl0IHVudGlsIHRoZSBNb2NrSW1lIGdldHMgYm91bmQgdG8gdGhlIFRlc3RBY3Rpdml0eS4KKyAgICAgICAgICAgIGV4cGVjdEJpbmRJbnB1dChzdHJlYW0sIFByb2Nlc3MubXlQaWQoKSwgVElNRU9VVCk7CisKKyAgICAgICAgICAgIGV4cGVjdEV2ZW50KHN0cmVhbSwgZWRpdG9yTWF0Y2hlcigib25TdGFydElucHV0IiwgbWFya2VyKSwgVElNRU9VVCk7CisKKyAgICAgICAgICAgIC8vIEdldCBhcHAgd2luZG93IHRva2VuCisgICAgICAgICAgICBmaW5hbCBJQmluZGVyIGFwcFdpbmRvd1Rva2VuID0gVGVzdFV0aWxzLmdldE9uTWFpblN5bmMoCisgICAgICAgICAgICAgICAgICAgICgpIC0+IGVkaXRUZXh0LmdldEFwcGxpY2F0aW9uV2luZG93VG9rZW4oKSk7CisKKyAgICAgICAgICAgIHRyeSAoV2luZG93Rm9jdXNTdGVhbGVyIGZvY3VzU3RlYWxlciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgV2luZG93Rm9jdXNTdGVhbGVyLmNvbm5lY3QoaW5zdHJ1bWVudGF0aW9uLmdldFRhcmdldENvbnRleHQoKSwgVElNRU9VVCkpIHsKKworICAgICAgICAgICAgICAgIGZvY3VzU3RlYWxlci5zdGVhbFdpbmRvd0ZvY3VzKGFwcFdpbmRvd1Rva2VuLCBUSU1FT1VUKTsKKworICAgICAgICAgICAgICAgIC8vIFdhaXQgdW50aWwgdGhlIGVkaXQgdGV4dCBsb3NlcyB3aW5kb3cgZm9jdXMuCisgICAgICAgICAgICAgICAgVGVzdFV0aWxzLndhaXRPbk1haW5VbnRpbCgoKSAtPiAhZWRpdFRleHQuaGFzV2luZG93Rm9jdXMoKSwgVElNRU9VVCk7CisKKyAgICAgICAgICAgICAgICAvLyBDYWxsIElucHV0TWV0aG9kTWFuYWdlciNyZXN0YXJ0SW5wdXQoKQorICAgICAgICAgICAgICAgIGluc3RydW1lbnRhdGlvbi5ydW5Pbk1haW5TeW5jKCgpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgZWRpdFRleHQuZ2V0Q29udGV4dCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFN5c3RlbVNlcnZpY2UoSW5wdXRNZXRob2RNYW5hZ2VyLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXN0YXJ0SW5wdXQoZWRpdFRleHQpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBXYWl0IHVudGlsIHRoZSBlZGl0IHRleHQgZ2FpbnMgd2luZG93IGZvY3VzIGFnYWluLgorICAgICAgICAgICAgVGVzdFV0aWxzLndhaXRPbk1haW5VbnRpbCgoKSAtPiBlZGl0VGV4dC5oYXNXaW5kb3dGb2N1cygpLCBUSU1FT1VUKTsKKworICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgSW5wdXRDb25uZWN0aW9uI2NvbW1pdFRleHQoKSBzdGlsbCB3b3Jrcy4KKyAgICAgICAgICAgIGZpbmFsIEltZUNvbW1hbmQgY29tbWFuZCA9IGltZVNlc3Npb24uY2FsbENvbW1pdFRleHQoInRlc3QgY29tbWl0IiwgMSk7CisgICAgICAgICAgICBleHBlY3RDb21tYW5kKHN0cmVhbSwgY29tbWFuZCwgVElNRU9VVCk7CisKKyAgICAgICAgICAgIFRlc3RVdGlscy53YWl0T25NYWluVW50aWwoCisgICAgICAgICAgICAgICAgICAgICgpIC0+IFRleHRVdGlscy5lcXVhbHMoZWRpdFRleHQuZ2V0VGV4dCgpLCAidGVzdCBjb21taXQiKSwgVElNRU9VVCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHtAbGluayBFZGl0VGV4dCNzZXRTaG93U29mdElucHV0T25Gb2N1cyhib29sZWFuKX0uCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0U2hvd0lucHV0T25Gb2N1cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgKE1vY2tJbWVTZXNzaW9uIGltZVNlc3Npb24gPSBNb2NrSW1lU2Vzc2lvbi5jcmVhdGUoCisgICAgICAgICAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLmdldFVpQXV0b21hdGlvbigpLAorICAgICAgICAgICAgICAgIG5ldyBJbWVTZXR0aW5ncy5CdWlsZGVyKCkpKSB7CisgICAgICAgICAgICBmaW5hbCBJbWVFdmVudFN0cmVhbSBzdHJlYW0gPSBpbWVTZXNzaW9uLm9wZW5FdmVudFN0cmVhbSgpOworCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWFya2VyID0gZ2V0VGVzdE1hcmtlcigpOworICAgICAgICAgICAgZmluYWwgRWRpdFRleHQgZWRpdFRleHQgPSBsYXVuY2hUZXN0QWN0aXZpdHkobWFya2VyKTsKKyAgICAgICAgICAgIHJ1bk9uTWFpblN5bmMoKCkgLT4gZWRpdFRleHQuc2V0U2hvd1NvZnRJbnB1dE9uRm9jdXMoZmFsc2UpKTsKKworICAgICAgICAgICAgLy8gV2FpdCB1bnRpbCAib25TdGFydElucHV0IiBnZXRzIGNhbGxlZCBmb3IgdGhlIEVkaXRUZXh0LgorICAgICAgICAgICAgZXhwZWN0RXZlbnQoc3RyZWFtLCBlZGl0b3JNYXRjaGVyKCJvblN0YXJ0SW5wdXQiLCBtYXJrZXIpLCBUSU1FT1VUKTsKKworICAgICAgICAgICAgLy8gRW11bGF0ZSB0YXAgZXZlbnQKKyAgICAgICAgICAgIEN0c1RvdWNoVXRpbHMuZW11bGF0ZVRhcE9uVmlld0NlbnRlcigKKyAgICAgICAgICAgICAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCksIGVkaXRUZXh0KTsKKworICAgICAgICAgICAgLy8gInNob3dTb2Z0SW5wdXQiIG11c3Qgbm90IGhhcHBlbiB3aGVuIHNldFNob3dTb2Z0SW5wdXRPbkZvY3VzKGZhbHNlKSBpcyBjYWxsZWQuCisgICAgICAgICAgICBub3RFeHBlY3RFdmVudChzdHJlYW0sIGV2ZW50IC0+ICJzaG93U29mdElucHV0Ii5lcXVhbHMoZXZlbnQuZ2V0RXZlbnROYW1lKCkpLAorICAgICAgICAgICAgICAgICAgICBOT1RfRVhQRUNUX1RJTUVPVVQpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW5wdXRtZXRob2Qvc3JjL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9jdHMvSW5wdXRCaW5kaW5nVGVzdC5qYXZhIGIvdGVzdHMvaW5wdXRtZXRob2Qvc3JjL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9jdHMvSW5wdXRCaW5kaW5nVGVzdC5qYXZhCmluZGV4IGZhYWZmM2QuLmEyZjA0MWMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2lucHV0bWV0aG9kL3NyYy9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvY3RzL0lucHV0QmluZGluZ1Rlc3QuamF2YQorKysgYi90ZXN0cy9pbnB1dG1ldGhvZC9zcmMvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL2N0cy9JbnB1dEJpbmRpbmdUZXN0LmphdmEKQEAgLTIyLDEzICsyMiwxNCBAQAogCiBpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLkJhc2VJbnB1dENvbm5lY3Rpb247CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0QmluZGluZzsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCkBAIC01OSw1ICs2MCw3IEBACiAgICAgICAgIGFzc2VydEVxdWFscyh1aWQsIHRhcmdldC5nZXRVaWQoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhwaWQsIHRhcmdldC5nZXRQaWQoKSk7CiAgICAgICAgIGFzc2VydFNhbWUoYmluZGVyLCB0YXJnZXQuZ2V0Q29ubmVjdGlvblRva2VuKCkpOworCisgICAgICAgIHAucmVjeWNsZSgpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2lucHV0bWV0aG9kL3NyYy9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvY3RzL0lucHV0Q29ubmVjdGlvbldyYXBwZXJUZXN0LmphdmEgYi90ZXN0cy9pbnB1dG1ldGhvZC9zcmMvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL2N0cy9JbnB1dENvbm5lY3Rpb25XcmFwcGVyVGVzdC5qYXZhCmluZGV4IDcxYWJhY2MuLmM5NDk3OTMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2lucHV0bWV0aG9kL3NyYy9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvY3RzL0lucHV0Q29ubmVjdGlvbldyYXBwZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvaW5wdXRtZXRob2Qvc3JjL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9jdHMvSW5wdXRDb25uZWN0aW9uV3JhcHBlclRlc3QuamF2YQpAQCAtMzMsOCArMzMsNiBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5DbGlwRGVzY3JpcHRpb247CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5Db21wbGV0aW9uSW5mbzsKQEAgLTQ1LDYgKzQzLDkgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRDb25uZWN0aW9uV3JhcHBlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRDb250ZW50SW5mbzsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIGltcG9ydCBvcmcubW9ja2l0by5Bcmd1bWVudENhcHRvcjsKZGlmZiAtLWdpdCBhL3Rlc3RzL2lucHV0bWV0aG9kL3NyYy9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvY3RzL0lucHV0Q29udGVudEluZm9UZXN0LmphdmEgYi90ZXN0cy9pbnB1dG1ldGhvZC9zcmMvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL2N0cy9JbnB1dENvbnRlbnRJbmZvVGVzdC5qYXZhCmluZGV4IDc3N2I2ZDguLjVhNGIyNGYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2lucHV0bWV0aG9kL3NyYy9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvY3RzL0lucHV0Q29udGVudEluZm9UZXN0LmphdmEKKysrIGIvdGVzdHMvaW5wdXRtZXRob2Qvc3JjL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9jdHMvSW5wdXRDb250ZW50SW5mb1Rlc3QuamF2YQpAQCAtMjIsMTAgKzIyLDExIEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNsaXBEZXNjcmlwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0Q29udGVudEluZm87CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL2lucHV0bWV0aG9kL3NyYy9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvY3RzL0lucHV0TWV0aG9kQ3RzQWN0aXZpdHkuamF2YSBiL3Rlc3RzL2lucHV0bWV0aG9kL3NyYy9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvY3RzL0lucHV0TWV0aG9kQ3RzQWN0aXZpdHkuamF2YQppbmRleCA5NTAxZDQ0Li4zMDllYmU4IDEwMDY0NAotLS0gYS90ZXN0cy9pbnB1dG1ldGhvZC9zcmMvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL2N0cy9JbnB1dE1ldGhvZEN0c0FjdGl2aXR5LmphdmEKKysrIGIvdGVzdHMvaW5wdXRtZXRob2Qvc3JjL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9jdHMvSW5wdXRNZXRob2RDdHNBY3Rpdml0eS5qYXZhCkBAIC0xOCw3ICsxOCw2IEBACiAKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuY3RzLlI7CiAKIHB1YmxpYyBjbGFzcyBJbnB1dE1ldGhvZEN0c0FjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgewogICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW5wdXRtZXRob2Qvc3JjL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9jdHMvSW5wdXRNZXRob2RJbmZvVGVzdC5qYXZhIGIvdGVzdHMvaW5wdXRtZXRob2Qvc3JjL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9jdHMvSW5wdXRNZXRob2RJbmZvVGVzdC5qYXZhCmluZGV4IDJiNWQ3ZWQuLmU1ODU5MDYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2lucHV0bWV0aG9kL3NyYy9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvY3RzL0lucHV0TWV0aG9kSW5mb1Rlc3QuamF2YQorKysgYi90ZXN0cy9pbnB1dG1ldGhvZC9zcmMvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL2N0cy9JbnB1dE1ldGhvZEluZm9UZXN0LmphdmEKQEAgLTMxLDEyICszMSw4IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5SZXNvbHZlSW5mbzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uU2VydmljZUluZm87Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5QcmludGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dE1ldGhvZDsKQEAgLTQ0LDYgKzQwLDEwIEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0TWV0aG9kTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RTdWJ0eXBlOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKQEAgLTUzLDggKzUzLDYgQEAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogQFNtYWxsVGVzdApAQCAtNzIsOCArNzAsOCBAQAogICAgIHByaXZhdGUgaW50IG1TdWJ0eXBlSWNvblJlc0lkOwogICAgIHByaXZhdGUgU3RyaW5nIG1TdWJ0eXBlTG9jYWxlOwogICAgIHByaXZhdGUgU3RyaW5nIG1TdWJ0eXBlTW9kZTsKLSAgICBwcml2YXRlIFN0cmluZyBtU3VidHlwZUV4dHJhVmFsdWVfa2V5OwotICAgIHByaXZhdGUgU3RyaW5nIG1TdWJ0eXBlRXh0cmFWYWx1ZV92YWx1ZTsKKyAgICBwcml2YXRlIFN0cmluZyBtU3VidHlwZUV4dHJhVmFsdWVLZXk7CisgICAgcHJpdmF0ZSBTdHJpbmcgbVN1YnR5cGVFeHRyYVZhbHVlVmFsdWU7CiAgICAgcHJpdmF0ZSBTdHJpbmcgbVN1YnR5cGVFeHRyYVZhbHVlOwogICAgIHByaXZhdGUgYm9vbGVhbiBtU3VidHlwZUlzQXV4aWxpYXJ5OwogICAgIHByaXZhdGUgYm9vbGVhbiBtU3VidHlwZU92ZXJyaWRlc0ltcGxpY2l0bHlFbmFibGVkU3VidHlwZTsKQEAgLTkzLDkgKzkxLDkgQEAKICAgICAgICAgbVN1YnR5cGVJY29uUmVzSWQgPSAwOwogICAgICAgICBtU3VidHlwZUxvY2FsZSA9ICJlbl9VUyI7CiAgICAgICAgIG1TdWJ0eXBlTW9kZSA9ICJrZXlib2FyZCI7Ci0gICAgICAgIG1TdWJ0eXBlRXh0cmFWYWx1ZV9rZXkgPSAia2V5MSI7Ci0gICAgICAgIG1TdWJ0eXBlRXh0cmFWYWx1ZV92YWx1ZSA9ICJ2YWx1ZTEiOwotICAgICAgICBtU3VidHlwZUV4dHJhVmFsdWUgPSAidGFnLCIgKyBtU3VidHlwZUV4dHJhVmFsdWVfa2V5ICsgIj0iICsgbVN1YnR5cGVFeHRyYVZhbHVlX3ZhbHVlOworICAgICAgICBtU3VidHlwZUV4dHJhVmFsdWVLZXkgPSAia2V5MSI7CisgICAgICAgIG1TdWJ0eXBlRXh0cmFWYWx1ZVZhbHVlID0gInZhbHVlMSI7CisgICAgICAgIG1TdWJ0eXBlRXh0cmFWYWx1ZSA9ICJ0YWcsIiArIG1TdWJ0eXBlRXh0cmFWYWx1ZUtleSArICI9IiArIG1TdWJ0eXBlRXh0cmFWYWx1ZVZhbHVlOwogICAgICAgICBtU3VidHlwZUlzQXV4aWxpYXJ5ID0gZmFsc2U7CiAgICAgICAgIG1TdWJ0eXBlT3ZlcnJpZGVzSW1wbGljaXRseUVuYWJsZWRTdWJ0eXBlID0gZmFsc2U7CiAgICAgICAgIG1TdWJ0eXBlSWQgPSA5OTsKQEAgLTEzMiw5ICsxMzAsOSBAQAogICAgICAgICBhc3NlcnRFcXVhbHMobVN1YnR5cGVMb2NhbGUsIG1JbnB1dE1ldGhvZFN1YnR5cGUuZ2V0TG9jYWxlKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMobVN1YnR5cGVNb2RlLCBtSW5wdXRNZXRob2RTdWJ0eXBlLmdldE1vZGUoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhtU3VidHlwZUV4dHJhVmFsdWUsIG1JbnB1dE1ldGhvZFN1YnR5cGUuZ2V0RXh0cmFWYWx1ZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShtSW5wdXRNZXRob2RTdWJ0eXBlLmNvbnRhaW5zRXh0cmFWYWx1ZUtleShtU3VidHlwZUV4dHJhVmFsdWVfa2V5KSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhtU3VidHlwZUV4dHJhVmFsdWVfdmFsdWUsCi0gICAgICAgICAgICAgICAgbUlucHV0TWV0aG9kU3VidHlwZS5nZXRFeHRyYVZhbHVlT2YobVN1YnR5cGVFeHRyYVZhbHVlX2tleSkpOworICAgICAgICBhc3NlcnRUcnVlKG1JbnB1dE1ldGhvZFN1YnR5cGUuY29udGFpbnNFeHRyYVZhbHVlS2V5KG1TdWJ0eXBlRXh0cmFWYWx1ZUtleSkpOworICAgICAgICBhc3NlcnRFcXVhbHMobVN1YnR5cGVFeHRyYVZhbHVlVmFsdWUsCisgICAgICAgICAgICAgICAgbUlucHV0TWV0aG9kU3VidHlwZS5nZXRFeHRyYVZhbHVlT2YobVN1YnR5cGVFeHRyYVZhbHVlS2V5KSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhtU3VidHlwZUlzQXV4aWxpYXJ5LCBtSW5wdXRNZXRob2RTdWJ0eXBlLmlzQXV4aWxpYXJ5KCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMobVN1YnR5cGVPdmVycmlkZXNJbXBsaWNpdGx5RW5hYmxlZFN1YnR5cGUsCiAgICAgICAgICAgICAgICAgbUlucHV0TWV0aG9kU3VidHlwZS5vdmVycmlkZXNJbXBsaWNpdGx5RW5hYmxlZFN1YnR5cGUoKSk7CkBAIC0yMTEsMTEgKzIwOSwxMSBAQAogICAgICAgICBmaW5hbCBJbnB1dE1ldGhvZFN1YnR5cGUgc3VidHlwZSA9IElucHV0TWV0aG9kU3VidHlwZS5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwocCk7CiAgICAgICAgIHAucmVjeWNsZSgpOwogCi0gICAgICAgIGFzc2VydEVxdWFscyhtSW5wdXRNZXRob2RTdWJ0eXBlLmNvbnRhaW5zRXh0cmFWYWx1ZUtleShtU3VidHlwZUV4dHJhVmFsdWVfa2V5KSwKLSAgICAgICAgICAgICAgICBzdWJ0eXBlLmNvbnRhaW5zRXh0cmFWYWx1ZUtleShtU3VidHlwZUV4dHJhVmFsdWVfa2V5KSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtSW5wdXRNZXRob2RTdWJ0eXBlLmNvbnRhaW5zRXh0cmFWYWx1ZUtleShtU3VidHlwZUV4dHJhVmFsdWVLZXkpLAorICAgICAgICAgICAgICAgIHN1YnR5cGUuY29udGFpbnNFeHRyYVZhbHVlS2V5KG1TdWJ0eXBlRXh0cmFWYWx1ZUtleSkpOwogICAgICAgICBhc3NlcnRFcXVhbHMobUlucHV0TWV0aG9kU3VidHlwZS5nZXRFeHRyYVZhbHVlKCksIHN1YnR5cGUuZ2V0RXh0cmFWYWx1ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG1JbnB1dE1ldGhvZFN1YnR5cGUuZ2V0RXh0cmFWYWx1ZU9mKG1TdWJ0eXBlRXh0cmFWYWx1ZV9rZXkpLAotICAgICAgICAgICAgICAgIHN1YnR5cGUuZ2V0RXh0cmFWYWx1ZU9mKG1TdWJ0eXBlRXh0cmFWYWx1ZV9rZXkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1JbnB1dE1ldGhvZFN1YnR5cGUuZ2V0RXh0cmFWYWx1ZU9mKG1TdWJ0eXBlRXh0cmFWYWx1ZUtleSksCisgICAgICAgICAgICAgICAgc3VidHlwZS5nZXRFeHRyYVZhbHVlT2YobVN1YnR5cGVFeHRyYVZhbHVlS2V5KSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhtSW5wdXRNZXRob2RTdWJ0eXBlLmdldEljb25SZXNJZCgpLCBzdWJ0eXBlLmdldEljb25SZXNJZCgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKG1JbnB1dE1ldGhvZFN1YnR5cGUuZ2V0TG9jYWxlKCksIHN1YnR5cGUuZ2V0TG9jYWxlKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMobUlucHV0TWV0aG9kU3VidHlwZS5nZXRNb2RlKCksIHN1YnR5cGUuZ2V0TW9kZSgpKTsKQEAgLTI0NiwxMSArMjQ0LDExIEBACiAgICAgICAgICAgICBpZiAoc2VydmljZUluZm8gPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChzZXJ2aWNlSW5mby5hcHBsaWNhdGlvbkluZm8uZmxhZ3MgJiBBcHBsaWNhdGlvbkluZm8uRkxBR19TWVNURU0pICE9Ci0gICAgICAgICAgICAgICAgICAgIEFwcGxpY2F0aW9uSW5mby5GTEFHX1NZU1RFTSkgeworICAgICAgICAgICAgaWYgKChzZXJ2aWNlSW5mby5hcHBsaWNhdGlvbkluZm8uZmxhZ3MgJiBBcHBsaWNhdGlvbkluZm8uRkxBR19TWVNURU0pCisgICAgICAgICAgICAgICAgICAgICE9IEFwcGxpY2F0aW9uSW5mby5GTEFHX1NZU1RFTSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNlcnZpY2VJbmZvLmVuY3J5cHRpb25Bd2FyZSkgeworICAgICAgICAgICAgaWYgKHNlcnZpY2VJbmZvLmRpcmVjdEJvb3RBd2FyZSkgewogICAgICAgICAgICAgICAgIGhhc0VuY3J5cHRpb25Bd2FyZUlucHV0TWV0aG9kID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2lucHV0bWV0aG9kL3NyYy9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvY3RzL0lucHV0TWV0aG9kTWFuYWdlclRlc3QuamF2YSBiL3Rlc3RzL2lucHV0bWV0aG9kL3NyYy9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvY3RzL0lucHV0TWV0aG9kTWFuYWdlclRlc3QuamF2YQppbmRleCAxNmVhYWQwLi42MjQ5ZTk5IDEwMDY0NAotLS0gYS90ZXN0cy9pbnB1dG1ldGhvZC9zcmMvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL2N0cy9JbnB1dE1ldGhvZE1hbmFnZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvaW5wdXRtZXRob2Qvc3JjL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9jdHMvSW5wdXRNZXRob2RNYW5hZ2VyVGVzdC5qYXZhCkBAIC0xNiwxMjEgKzE2LDE4MSBAQAogCiBwYWNrYWdlIGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5jdHM7CiAKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LkludGVudC5BQ1RJT05fQ0xPU0VfU1lTVEVNX0RJQUxPR1M7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5JbnRlbnQuRkxBR19SRUNFSVZFUl9GT1JFR1JPVU5EOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuY3RzLnV0aWwuVGVzdFV0aWxzLndhaXRPbk1haW5VbnRpbDsKKwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwogCiBpbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuUmVzdWx0UmVjZWl2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvdzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuQmFzZUlucHV0Q29ubmVjdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5FZGl0b3JJbmZvOworaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dENvbm5lY3Rpb247CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0TWV0aG9kSW5mbzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5jdHMuUjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RTdWJ0eXBlOworaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5jdHMudXRpbC5UZXN0QWN0aXZpdHk7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuRWRpdFRleHQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dC5MYXlvdXRQYXJhbXM7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlBvbGxpbmdDaGVjazsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk5vbk51bGw7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogCi1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY1JlZmVyZW5jZTsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiAKIEBNZWRpdW1UZXN0CiBAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQogcHVibGljIGNsYXNzIElucHV0TWV0aG9kTWFuYWdlclRlc3QgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVElNRU9VVCA9IFRpbWVVbml0LlNFQ09ORFMudG9NaWxsaXMoNSk7CiAgICAgcHJpdmF0ZSBJbnN0cnVtZW50YXRpb24gbUluc3RydW1lbnRhdGlvbjsKLSAgICBwcml2YXRlIElucHV0TWV0aG9kQ3RzQWN0aXZpdHkgbUFjdGl2aXR5OwotCi0gICAgQFJ1bGUKLSAgICBwdWJsaWMgQWN0aXZpdHlUZXN0UnVsZTxJbnB1dE1ldGhvZEN0c0FjdGl2aXR5PiBtQWN0aXZpdHlSdWxlID0KLSAgICAgICAgICAgIG5ldyBBY3Rpdml0eVRlc3RSdWxlPD4oSW5wdXRNZXRob2RDdHNBY3Rpdml0eS5jbGFzcyk7CisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgSW5wdXRNZXRob2RNYW5hZ2VyIG1JbU1hbmFnZXI7CiAKICAgICBAQmVmb3JlCiAgICAgcHVibGljIHZvaWQgc2V0dXAoKSB7CiAgICAgICAgIG1JbnN0cnVtZW50YXRpb24gPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKTsKLSAgICAgICAgbUFjdGl2aXR5ID0gbUFjdGl2aXR5UnVsZS5nZXRBY3Rpdml0eSgpOwotICAgIH0KLQotICAgIEBBZnRlcgotICAgIHB1YmxpYyB2b2lkIHRlYXJkb3duKCkgewotICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLnNlbmRLZXlEb3duVXBTeW5jKEtleUV2ZW50LktFWUNPREVfQkFDSyk7CisgICAgICAgIG1Db250ZXh0ID0gbUluc3RydW1lbnRhdGlvbi5nZXRUYXJnZXRDb250ZXh0KCk7CisgICAgICAgIG1JbU1hbmFnZXIgPSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKElucHV0TWV0aG9kTWFuYWdlci5jbGFzcyk7CiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5wdXRNZXRob2RNYW5hZ2VyKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIGlmICghbUFjdGl2aXR5LmdldFBhY2thZ2VNYW5hZ2VyKCkuaGFzU3lzdGVtRmVhdHVyZSgKLSAgICAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlci5GRUFUVVJFX0lOUFVUX01FVEhPRFMpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNBY3RpdmUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgZmluYWwgQXRvbWljUmVmZXJlbmNlPEVkaXRUZXh0PiBmb2N1c2VkRWRpdFRleHRSZWYgPSBuZXcgQXRvbWljUmVmZXJlbmNlPD4oKTsKKyAgICAgICAgZmluYWwgQXRvbWljUmVmZXJlbmNlPEVkaXRUZXh0PiBub25Gb2N1c2VkRWRpdFRleHRSZWYgPSBuZXcgQXRvbWljUmVmZXJlbmNlPD4oKTsKKyAgICAgICAgVGVzdEFjdGl2aXR5LnN0YXJ0U3luYyhhY3Rpdml0eSAtPiB7CisgICAgICAgICAgICBmaW5hbCBMaW5lYXJMYXlvdXQgbGF5b3V0ID0gbmV3IExpbmVhckxheW91dChhY3Rpdml0eSk7CisgICAgICAgICAgICBsYXlvdXQuc2V0T3JpZW50YXRpb24oTGluZWFyTGF5b3V0LlZFUlRJQ0FMKTsKIAotICAgICAgICBXaW5kb3cgd2luZG93ID0gbUFjdGl2aXR5LmdldFdpbmRvdygpOwotICAgICAgICBmaW5hbCBFZGl0VGV4dCB2aWV3ID0gKEVkaXRUZXh0KSB3aW5kb3cuZmluZFZpZXdCeUlkKFIuaWQuZW50cnkpOworICAgICAgICAgICAgZmluYWwgRWRpdFRleHQgZm9jdXNlZEVkaXRUZXh0ID0gbmV3IEVkaXRUZXh0KGFjdGl2aXR5KTsKKyAgICAgICAgICAgIGxheW91dC5hZGRWaWV3KGZvY3VzZWRFZGl0VGV4dCk7CisgICAgICAgICAgICBmb2N1c2VkRWRpdFRleHRSZWYuc2V0KGZvY3VzZWRFZGl0VGV4dCk7CisgICAgICAgICAgICBmb2N1c2VkRWRpdFRleHQucmVxdWVzdEZvY3VzKCk7CiAKLSAgICAgICAgUG9sbGluZ0NoZWNrLndhaXRGb3IoMTAwMCwgdmlldzo6aGFzV2luZG93Rm9jdXMpOworICAgICAgICAgICAgZmluYWwgRWRpdFRleHQgbm9uRm9jdXNlZEVkaXRUZXh0ID0gbmV3IEVkaXRUZXh0KGFjdGl2aXR5KTsKKyAgICAgICAgICAgIGxheW91dC5hZGRWaWV3KG5vbkZvY3VzZWRFZGl0VGV4dCk7CisgICAgICAgICAgICBub25Gb2N1c2VkRWRpdFRleHRSZWYuc2V0KG5vbkZvY3VzZWRFZGl0VGV4dCk7CiAKLSAgICAgICAgbUFjdGl2aXR5UnVsZS5ydW5PblVpVGhyZWFkKHZpZXc6OnJlcXVlc3RGb2N1cyk7Ci0gICAgICAgIG1JbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7Ci0gICAgICAgIGFzc2VydFRydWUodmlldy5pc0ZvY3VzZWQoKSk7Ci0KLSAgICAgICAgQmFzZUlucHV0Q29ubmVjdGlvbiBjb25uZWN0aW9uID0gbmV3IEJhc2VJbnB1dENvbm5lY3Rpb24odmlldywgZmFsc2UpOwotICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBtSW5zdHJ1bWVudGF0aW9uLmdldFRhcmdldENvbnRleHQoKTsKLSAgICAgICAgZmluYWwgSW5wdXRNZXRob2RNYW5hZ2VyIGltTWFuYWdlciA9IChJbnB1dE1ldGhvZE1hbmFnZXIpIGNvbnRleHQKLSAgICAgICAgICAgICAgICAuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LklOUFVUX01FVEhPRF9TRVJWSUNFKTsKLQotICAgICAgICBQb2xsaW5nQ2hlY2sud2FpdEZvcihpbU1hbmFnZXI6OmlzQWN0aXZlKTsKLQotICAgICAgICBhc3NlcnRUcnVlKGltTWFuYWdlci5pc0FjY2VwdGluZ1RleHQoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoaW1NYW5hZ2VyLmlzQWN0aXZlKHZpZXcpKTsKLQotICAgICAgICBhc3NlcnRGYWxzZShpbU1hbmFnZXIuaXNGdWxsc2NyZWVuTW9kZSgpKTsKLSAgICAgICAgY29ubmVjdGlvbi5yZXBvcnRGdWxsc2NyZWVuTW9kZSh0cnVlKTsKLSAgICAgICAgLy8gT25seSBJTUVzIGFyZSBhbGxvd2VkIHRvIHJlcG9ydCBmdWxsLXNjcmVlbiBtb2RlLiAgQ2FsbGluZyB0aGlzIG1ldGhvZCBmcm9tIHRoZQotICAgICAgICAvLyBhcHBsaWNhdGlvbiBzaG91bGQgaGF2ZSBubyBlZmZlY3QuCi0gICAgICAgIGFzc2VydEZhbHNlKGltTWFuYWdlci5pc0Z1bGxzY3JlZW5Nb2RlKCkpOwotCi0gICAgICAgIG1BY3Rpdml0eVJ1bGUucnVuT25VaVRocmVhZCgoKSAtPiB7Ci0gICAgICAgICAgICBJQmluZGVyIHRva2VuID0gdmlldy5nZXRXaW5kb3dUb2tlbigpOwotCi0gICAgICAgICAgICAvLyBTaG93IGFuZCBoaWRlIGlucHV0IG1ldGhvZC4KLSAgICAgICAgICAgIGFzc2VydFRydWUoaW1NYW5hZ2VyLnNob3dTb2Z0SW5wdXQodmlldywgSW5wdXRNZXRob2RNYW5hZ2VyLlNIT1dfSU1QTElDSVQpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoaW1NYW5hZ2VyLmhpZGVTb2Z0SW5wdXRGcm9tV2luZG93KHRva2VuLCAwKSk7Ci0KLSAgICAgICAgICAgIEhhbmRsZXIgaGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7Ci0gICAgICAgICAgICBSZXN1bHRSZWNlaXZlciByZWNlaXZlciA9IG5ldyBSZXN1bHRSZWNlaXZlcihoYW5kbGVyKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoaW1NYW5hZ2VyLnNob3dTb2Z0SW5wdXQodmlldywgMCwgcmVjZWl2ZXIpKTsKLSAgICAgICAgICAgIHJlY2VpdmVyID0gbmV3IFJlc3VsdFJlY2VpdmVyKGhhbmRsZXIpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpbU1hbmFnZXIuaGlkZVNvZnRJbnB1dEZyb21XaW5kb3codG9rZW4sIDAsIHJlY2VpdmVyKSk7Ci0KLSAgICAgICAgICAgIGltTWFuYWdlci5zaG93U29mdElucHV0RnJvbUlucHV0TWV0aG9kKHRva2VuLCBJbnB1dE1ldGhvZE1hbmFnZXIuU0hPV19GT1JDRUQpOwotICAgICAgICAgICAgaW1NYW5hZ2VyLmhpZGVTb2Z0SW5wdXRGcm9tSW5wdXRNZXRob2QodG9rZW4sIElucHV0TWV0aG9kTWFuYWdlci5ISURFX05PVF9BTFdBWVMpOwotCi0gICAgICAgICAgICAvLyBzdGF0dXM6IGhpZGUgdG8gc2hvdyB0byBoaWRlCi0gICAgICAgICAgICBpbU1hbmFnZXIudG9nZ2xlU29mdElucHV0RnJvbVdpbmRvdyh0b2tlbiwgMCwgSW5wdXRNZXRob2RNYW5hZ2VyLkhJREVfTk9UX0FMV0FZUyk7Ci0gICAgICAgICAgICBpbU1hbmFnZXIudG9nZ2xlU29mdElucHV0RnJvbVdpbmRvdyh0b2tlbiwgMCwgSW5wdXRNZXRob2RNYW5hZ2VyLkhJREVfTk9UX0FMV0FZUyk7Ci0KLSAgICAgICAgICAgIExpc3Q8SW5wdXRNZXRob2RJbmZvPiBlbmFibGVkSW1MaXN0ID0gaW1NYW5hZ2VyLmdldEVuYWJsZWRJbnB1dE1ldGhvZExpc3QoKTsKLSAgICAgICAgICAgIGlmIChlbmFibGVkSW1MaXN0ICE9IG51bGwgJiYgZW5hYmxlZEltTGlzdC5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgaW1NYW5hZ2VyLnNldElucHV0TWV0aG9kKHRva2VuLCBlbmFibGVkSW1MaXN0LmdldCgwKS5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICAvLyBjYW5ub3QgdGVzdCB3aGV0aGVyIHNldHRpbmcgd2FzIHN1Y2Nlc3NmdWwKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTGlzdDxJbnB1dE1ldGhvZEluZm8+IGltTGlzdCA9IGltTWFuYWdlci5nZXRJbnB1dE1ldGhvZExpc3QoKTsKLSAgICAgICAgICAgIGlmIChpbUxpc3QgIT0gbnVsbCAmJiBlbmFibGVkSW1MaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGltTGlzdC5zaXplKCkgPj0gZW5hYmxlZEltTGlzdC5zaXplKCkpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGxheW91dDsKICAgICAgICAgfSk7Ci0gICAgICAgIG1JbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7CisgICAgICAgIHdhaXRPbk1haW5VbnRpbCgoKSAtPiBtSW1NYW5hZ2VyLmlzQWN0aXZlKCksIFRJTUVPVVQpOworICAgICAgICBhc3NlcnRUcnVlKG1JbU1hbmFnZXIuaXNBY2NlcHRpbmdUZXh0KCkpOworICAgICAgICBhc3NlcnRUcnVlKG1JbU1hbmFnZXIuaXNBY3RpdmUoZm9jdXNlZEVkaXRUZXh0UmVmLmdldCgpKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1JbU1hbmFnZXIuaXNBY3RpdmUobm9uRm9jdXNlZEVkaXRUZXh0UmVmLmdldCgpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNBY2NlcHRpbmdUZXh0KCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGZpbmFsIEF0b21pY1JlZmVyZW5jZTxFZGl0VGV4dD4gZm9jdXNlZEZha2VFZGl0VGV4dFJlZiA9IG5ldyBBdG9taWNSZWZlcmVuY2U8PigpOworICAgICAgICBUZXN0QWN0aXZpdHkuc3RhcnRTeW5jKGFjdGl2aXR5IC0+IHsKKyAgICAgICAgICAgIGZpbmFsIExpbmVhckxheW91dCBsYXlvdXQgPSBuZXcgTGluZWFyTGF5b3V0KGFjdGl2aXR5KTsKKyAgICAgICAgICAgIGxheW91dC5zZXRPcmllbnRhdGlvbihMaW5lYXJMYXlvdXQuVkVSVElDQUwpOworCisgICAgICAgICAgICBmaW5hbCBFZGl0VGV4dCBmb2N1c2VkRmFrZUVkaXRUZXh0ID0gbmV3IEVkaXRUZXh0KGFjdGl2aXR5KSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIElucHV0Q29ubmVjdGlvbiBvbkNyZWF0ZUlucHV0Q29ubmVjdGlvbihFZGl0b3JJbmZvIGluZm8pIHsKKyAgICAgICAgICAgICAgICAgICAgc3VwZXIub25DcmVhdGVJbnB1dENvbm5lY3Rpb24oaW5mbyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBsYXlvdXQuYWRkVmlldyhmb2N1c2VkRmFrZUVkaXRUZXh0KTsKKyAgICAgICAgICAgIGZvY3VzZWRGYWtlRWRpdFRleHRSZWYuc2V0KGZvY3VzZWRGYWtlRWRpdFRleHQpOworICAgICAgICAgICAgZm9jdXNlZEZha2VFZGl0VGV4dC5yZXF1ZXN0Rm9jdXMoKTsKKyAgICAgICAgICAgIHJldHVybiBsYXlvdXQ7CisgICAgICAgIH0pOworICAgICAgICB3YWl0T25NYWluVW50aWwoKCkgLT4gbUltTWFuYWdlci5pc0FjdGl2ZSgpLCBUSU1FT1VUKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtSW1NYW5hZ2VyLmlzQWN0aXZlKGZvY3VzZWRGYWtlRWRpdFRleHRSZWYuZ2V0KCkpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIklucHV0TWV0aG9kTWFuYWdlciNpc0FjY2VwdGluZ1RleHQoKSBtdXN0IHJldHVybiBmYWxzZSAiCisgICAgICAgICAgICAgICAgKyAiaWYgdGFyZ2V0IFZpZXcgcmV0dXJucyBudWxsIGZyb20gb25DcmVhdGVJbnB1dENvbm5lY3Rpb24oKS4iLAorICAgICAgICAgICAgICAgIG1JbU1hbmFnZXIuaXNBY2NlcHRpbmdUZXh0KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldElucHV0TWV0aG9kTGlzdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBMaXN0PElucHV0TWV0aG9kSW5mbz4gZW5hYmxlZEltZXMgPSBtSW1NYW5hZ2VyLmdldEVuYWJsZWRJbnB1dE1ldGhvZExpc3QoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChlbmFibGVkSW1lcyk7CisgICAgICAgIGZpbmFsIExpc3Q8SW5wdXRNZXRob2RJbmZvPiBpbWVzID0gbUltTWFuYWdlci5nZXRJbnB1dE1ldGhvZExpc3QoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChpbWVzKTsKKworICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBJTU0jZ2V0RW5hYmxlZElucHV0TWV0aG9kTGlzdCgpIGlzIGEgc3Vic2V0IG9mIElNTSNnZXRJbnB1dE1ldGhvZExpc3QoKS4KKyAgICAgICAgLy8gVE9ETzogQ29uc2lkZXIgbW92aW5nIHRoaXMgdG8gaG9zdHNpZGUgdGVzdCB0byB0ZXN0IG1vcmUgcmVhbGlzdGljIGFuZCB1c2VmdWwgc2NlbmFyaW8uCisgICAgICAgIGlmICghaW1lcy5jb250YWluc0FsbChlbmFibGVkSW1lcykpIHsKKyAgICAgICAgICAgIGZhaWwoIkVuYWJsZWQgSU1FcyBtdXN0IGJlIGEgc3Vic2V0IG9mIGFsbCB0aGUgSU1Fcy5cbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiYWxsPSIgKyBkdW1wSW5wdXRNZXRob2RJbmZvTGlzdChpbWVzKSArICJcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiZW5hYmxlZD0iICsgZHVtcElucHV0TWV0aG9kSW5mb0xpc3QoZW5hYmxlZEltZXMpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBkdW1wSW5wdXRNZXRob2RJbmZvTGlzdChATm9uTnVsbCBMaXN0PElucHV0TWV0aG9kSW5mbz4gaW1pTGlzdCkgeworICAgICAgICByZXR1cm4gIlsiICsgaW1pTGlzdC5zdHJlYW0oKS5tYXAoaW1pIC0+IHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgZmluYWwgaW50IHN1YnR5cGVDb3VudCA9IGltaS5nZXRTdWJ0eXBlQ291bnQoKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiSW5wdXRNZXRob2RJbmZve2lkPSIpLmFwcGVuZChpbWkuZ2V0SWQoKSkKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiLCBzdWJ0eXBlQ291bnQ9IikuYXBwZW5kKHN1YnR5cGVDb3VudCkKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiLCBzdWJ0eXBlcz1bIik7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1YnR5cGVDb3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiwiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmluYWwgSW5wdXRNZXRob2RTdWJ0eXBlIHN1YnR5cGUgPSBpbWkuZ2V0U3VidHlwZUF0KGkpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgie2lkPTB4IikuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcoc3VidHlwZS5oYXNoQ29kZSgpKSk7CisgICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShzdWJ0eXBlLmdldE1vZGUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIsbW9kZT0iKS5hcHBlbmQoc3VidHlwZS5nZXRNb2RlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHN1YnR5cGUuZ2V0TG9jYWxlKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLGxvY2FsZT0iKS5hcHBlbmQoc3VidHlwZS5nZXRMb2NhbGUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoc3VidHlwZS5nZXRMYW5ndWFnZVRhZygpKSkgeworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIixsYW5ndWFnZVRhZz0iKS5hcHBlbmQoc3VidHlwZS5nZXRMYW5ndWFnZVRhZygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJ9Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgICAgICB9KS5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygiLCAiKSkgKyAiXSI7CisgICAgfQorCisgICAgQEFwcE1vZGVGdWxsKHJlYXNvbiA9ICJJbnN0YW50IGFwcHMgY2Fubm90IHJlbHkgb24gQUNUSU9OX0NMT1NFX1NZU1RFTV9ESUFMT0dTIikKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaG93SW5wdXRNZXRob2RQaWNrZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgVGVzdEFjdGl2aXR5LnN0YXJ0U3luYyhhY3Rpdml0eSAtPiB7CisgICAgICAgICAgICBmaW5hbCBWaWV3IHZpZXcgPSBuZXcgVmlldyhhY3Rpdml0eSk7CisgICAgICAgICAgICB2aWV3LnNldExheW91dFBhcmFtcyhuZXcgTGF5b3V0UGFyYW1zKAorICAgICAgICAgICAgICAgICAgICBMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULCBMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSk7CisgICAgICAgICAgICByZXR1cm4gdmlldzsKKyAgICAgICAgfSk7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgSW5wdXRNZXRob2RQaWNrZXIgaXMgbm90IHNob3duIGluIHRoZSBpbml0aWFsIHN0YXRlLgorICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0KAorICAgICAgICAgICAgICAgIG5ldyBJbnRlbnQoQUNUSU9OX0NMT1NFX1NZU1RFTV9ESUFMT0dTKS5zZXRGbGFncyhGTEFHX1JFQ0VJVkVSX0ZPUkVHUk9VTkQpKTsKKyAgICAgICAgd2FpdE9uTWFpblVudGlsKCgpIC0+ICFtSW1NYW5hZ2VyLmlzSW5wdXRNZXRob2RQaWNrZXJTaG93bigpLCBUSU1FT1VULAorICAgICAgICAgICAgICAgICJJbnB1dE1ldGhvZCBwaWNrZXIgc2hvdWxkIGJlIGNsb3NlZCIpOworCisgICAgICAgIC8vIFRlc3QgSW5wdXRNZXRob2RNYW5hZ2VyI3Nob3dJbnB1dE1ldGhvZFBpY2tlcigpIHdvcmtzIGFzIGV4cGVjdGVkLgorICAgICAgICBtSW1NYW5hZ2VyLnNob3dJbnB1dE1ldGhvZFBpY2tlcigpOworICAgICAgICB3YWl0T25NYWluVW50aWwoKCkgLT4gbUltTWFuYWdlci5pc0lucHV0TWV0aG9kUGlja2VyU2hvd24oKSwgVElNRU9VVCwKKyAgICAgICAgICAgICAgICAiSW5wdXRNZXRob2QgcGlja2VyIHNob3VsZCBiZSBzaG93biIpOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IElucHV0TWV0aG9kUGlja2VyIGNhbiBiZSBjbG9zZWQgd2l0aCBBQ1RJT05fQ0xPU0VfU1lTVEVNX0RJQUxPR1MKKyAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdCgKKyAgICAgICAgICAgICAgICBuZXcgSW50ZW50KEFDVElPTl9DTE9TRV9TWVNURU1fRElBTE9HUykuc2V0RmxhZ3MoRkxBR19SRUNFSVZFUl9GT1JFR1JPVU5EKSk7CisgICAgICAgIHdhaXRPbk1haW5VbnRpbCgoKSAtPiAhbUltTWFuYWdlci5pc0lucHV0TWV0aG9kUGlja2VyU2hvd24oKSwgVElNRU9VVCwKKyAgICAgICAgICAgICAgICAiSW5wdXRNZXRob2QgcGlja2VyIHNob3VsZCBiZSBjbG9zZWQiKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnB1dG1ldGhvZC9zcmMvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL2N0cy9JbnB1dE1ldGhvZFNlcnZpY2VUZXN0LmphdmEgYi90ZXN0cy9pbnB1dG1ldGhvZC9zcmMvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL2N0cy9JbnB1dE1ldGhvZFNlcnZpY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY0ZmVjMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2lucHV0bWV0aG9kL3NyYy9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvY3RzL0lucHV0TWV0aG9kU2VydmljZVRlc3QuamF2YQpAQCAtMCwwICsxLDE4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLmN0czsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuU09GVF9JTlBVVF9TVEFURV9BTFdBWVNfSElEREVOOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuU09GVF9JTlBVVF9TVEFURV9BTFdBWVNfVklTSUJMRTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLmN0cy51dGlsLlRlc3RVdGlscy5nZXRPbk1haW5TeW5jOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuY3RzLnV0aWwuVGVzdFV0aWxzLndhaXRPbk1haW5VbnRpbDsKKworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jdHMubW9ja2ltZS5JbWVFdmVudFN0cmVhbVRlc3RVdGlscy5FdmVudEZpbHRlck1vZGUuQ0hFQ0tfRVhJVF9FVkVOVF9PTkxZOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jdHMubW9ja2ltZS5JbWVFdmVudFN0cmVhbVRlc3RVdGlscy5leHBlY3RDb21tYW5kOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jdHMubW9ja2ltZS5JbWVFdmVudFN0cmVhbVRlc3RVdGlscy5leHBlY3RFdmVudDsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY3RzLm1vY2tpbWUuSW1lRXZlbnRTdHJlYW1UZXN0VXRpbHMubm90RXhwZWN0RXZlbnQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmlucHV0bWV0aG9kc2VydmljZS5JbnB1dE1ldGhvZFNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLmN0cy51dGlsLkVuZFRvRW5kSW1lVGVzdEJhc2U7CitpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLmN0cy51dGlsLlRlc3RBY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5FZGl0VGV4dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jdHMubW9ja2ltZS5JbWVDb21tYW5kOworaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy5tb2NraW1lLkltZUV2ZW50OworaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy5tb2NraW1lLkltZUV2ZW50U3RyZWFtOworaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy5tb2NraW1lLkltZVNldHRpbmdzOworaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy5tb2NraW1lLk1vY2tJbWVTZXNzaW9uOworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lb3V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU7CisKKy8qKgorICogVGVzdHMgZm9yIHtAbGluayBJbnB1dE1ldGhvZFNlcnZpY2V9IG1ldGhvZHMuCisgKi8KK0BNZWRpdW1UZXN0CitAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIElucHV0TWV0aG9kU2VydmljZVRlc3QgZXh0ZW5kcyBFbmRUb0VuZEltZVRlc3RCYXNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFRJTUVPVVQgPSBUaW1lVW5pdC5TRUNPTkRTLnRvTWlsbGlzKDUpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgRVhQRUNURURfVElNRU9VVCA9IFRpbWVVbml0LlNFQ09ORFMudG9NaWxsaXMoMik7CisKKyAgICBwcml2YXRlIEluc3RydW1lbnRhdGlvbiBtSW5zdHJ1bWVudGF0aW9uOworCisgICAgcHJpdmF0ZSBzdGF0aWMgUHJlZGljYXRlPEltZUV2ZW50PiBiYWNrS2V5RG93bk1hdGNoZXIoYm9vbGVhbiBleHBlY3RlZFJldHVyblZhbHVlKSB7CisgICAgICAgIHJldHVybiBldmVudCAtPiB7CisgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5lcXVhbHMoIm9uS2V5RG93biIsIGV2ZW50LmdldEV2ZW50TmFtZSgpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIGludCBrZXlDb2RlID0gZXZlbnQuZ2V0QXJndW1lbnRzKCkuZ2V0SW50KCJrZXlDb2RlIik7CisgICAgICAgICAgICBpZiAoa2V5Q29kZSAhPSBLZXlFdmVudC5LRVlDT0RFX0JBQ0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZXZlbnQuZ2V0UmV0dXJuQm9vbGVhblZhbHVlKCkgPT0gZXhwZWN0ZWRSZXR1cm5WYWx1ZTsKKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0dXAoKSB7CisgICAgICAgIG1JbnN0cnVtZW50YXRpb24gPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFRlc3RBY3Rpdml0eSBjcmVhdGVUZXN0QWN0aXZpdHkoZmluYWwgaW50IHdpbmRvd0ZsYWdzKSB7CisgICAgICAgIHJldHVybiBUZXN0QWN0aXZpdHkuc3RhcnRTeW5jKGFjdGl2aXR5IC0+IHsKKyAgICAgICAgICAgIGZpbmFsIExpbmVhckxheW91dCBsYXlvdXQgPSBuZXcgTGluZWFyTGF5b3V0KGFjdGl2aXR5KTsKKyAgICAgICAgICAgIGxheW91dC5zZXRPcmllbnRhdGlvbihMaW5lYXJMYXlvdXQuVkVSVElDQUwpOworCisgICAgICAgICAgICBmaW5hbCBFZGl0VGV4dCBlZGl0VGV4dCA9IG5ldyBFZGl0VGV4dChhY3Rpdml0eSk7CisgICAgICAgICAgICBlZGl0VGV4dC5zZXRUZXh0KCJFZGl0YWJsZSIpOworICAgICAgICAgICAgbGF5b3V0LmFkZFZpZXcoZWRpdFRleHQpOworICAgICAgICAgICAgZWRpdFRleHQucmVxdWVzdEZvY3VzKCk7CisKKyAgICAgICAgICAgIGFjdGl2aXR5LmdldFdpbmRvdygpLnNldFNvZnRJbnB1dE1vZGUod2luZG93RmxhZ3MpOworICAgICAgICAgICAgcmV0dXJuIGxheW91dDsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUltZUNvbnN1bWVzQmFja0J1dHRvbihpbnQgYmFja0Rpc3Bvc2l0aW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IChNb2NrSW1lU2Vzc2lvbiBpbWVTZXNzaW9uID0gTW9ja0ltZVNlc3Npb24uY3JlYXRlKAorICAgICAgICAgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKS5nZXRVaUF1dG9tYXRpb24oKSwKKyAgICAgICAgICAgICAgICBuZXcgSW1lU2V0dGluZ3MuQnVpbGRlcigpKSkgeworICAgICAgICAgICAgZmluYWwgSW1lRXZlbnRTdHJlYW0gc3RyZWFtID0gaW1lU2Vzc2lvbi5vcGVuRXZlbnRTdHJlYW0oKTsKKworICAgICAgICAgICAgZmluYWwgVGVzdEFjdGl2aXR5IHRlc3RBY3Rpdml0eSA9IGNyZWF0ZVRlc3RBY3Rpdml0eShTT0ZUX0lOUFVUX1NUQVRFX0FMV0FZU19WSVNJQkxFKTsKKyAgICAgICAgICAgIGV4cGVjdEV2ZW50KHN0cmVhbSwgZXZlbnQgLT4gIm9uU3RhcnRJbnB1dFZpZXciLmVxdWFscyhldmVudC5nZXRFdmVudE5hbWUoKSksIFRJTUVPVVQpOworCisgICAgICAgICAgICBmaW5hbCBJbWVDb21tYW5kIGNvbW1hbmQgPSBpbWVTZXNzaW9uLmNhbGxTZXRCYWNrRGlzcG9zaXRpb24oYmFja0Rpc3Bvc2l0aW9uKTsKKyAgICAgICAgICAgIGV4cGVjdENvbW1hbmQoc3RyZWFtLCBjb21tYW5kLCBUSU1FT1VUKTsKKworICAgICAgICAgICAgdGVzdEFjdGl2aXR5LnNldElnbm9yZUJhY2tLZXkodHJ1ZSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwKKyAgICAgICAgICAgICAgICAgICAgKGxvbmcpIGdldE9uTWFpblN5bmMoKCkgLT4gdGVzdEFjdGl2aXR5LmdldE9uQmFja1ByZXNzZWRDYWxsQ291bnQoKSkpOworICAgICAgICAgICAgbUluc3RydW1lbnRhdGlvbi5zZW5kS2V5RG93blVwU3luYyhLZXlFdmVudC5LRVlDT0RFX0JBQ0spOworCisgICAgICAgICAgICBleHBlY3RFdmVudChzdHJlYW0sIGJhY2tLZXlEb3duTWF0Y2hlcih0cnVlKSwgQ0hFQ0tfRVhJVF9FVkVOVF9PTkxZLCBUSU1FT1VUKTsKKworICAgICAgICAgICAgLy8gTWFrZSBzdXJlIFRlc3RBY3Rpdml0eSNvbkJhY2tQcmVzc2VkKCkgaXMgTk9UIGNhbGxlZC4KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgd2FpdE9uTWFpblVudGlsKCgpIC0+IHRlc3RBY3Rpdml0eS5nZXRPbkJhY2tQcmVzc2VkQ2FsbENvdW50KCkgPiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgRVhQRUNURURfVElNRU9VVCk7CisgICAgICAgICAgICAgICAgZmFpbCgiQWN0aXZpdHkjb25CYWNrUHJlc3NlZCgpIHNob3VsZCBub3QgYmUgY2FsbGVkIik7CisgICAgICAgICAgICB9IGNhdGNoIChUaW1lb3V0RXhjZXB0aW9uIGUpeworICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgZmluZS4gIFdlIGFjdHVhbGx5IGV4cGVjdCB0aW1lb3V0LgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0QmFja0Rpc3Bvc2l0aW9uRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB2ZXJpZnlJbWVDb25zdW1lc0JhY2tCdXR0b24oSW5wdXRNZXRob2RTZXJ2aWNlLkJBQ0tfRElTUE9TSVRJT05fREVGQVVMVCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0QmFja0Rpc3Bvc2l0aW9uV2lsbE5vdERpc21pc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdmVyaWZ5SW1lQ29uc3VtZXNCYWNrQnV0dG9uKElucHV0TWV0aG9kU2VydmljZS5CQUNLX0RJU1BPU0lUSU9OX1dJTExfTk9UX0RJU01JU1MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNldEJhY2tEaXNwb3NpdGlvbldpbGxEaXNtaXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHZlcmlmeUltZUNvbnN1bWVzQmFja0J1dHRvbihJbnB1dE1ldGhvZFNlcnZpY2UuQkFDS19ESVNQT1NJVElPTl9XSUxMX0RJU01JU1MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNldEJhY2tEaXNwb3NpdGlvbkFkanVzdE5vdGhpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdmVyaWZ5SW1lQ29uc3VtZXNCYWNrQnV0dG9uKElucHV0TWV0aG9kU2VydmljZS5CQUNLX0RJU1BPU0lUSU9OX0FESlVTVF9OT1RISU5HKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1ZXN0SGlkZVNlbGYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IChNb2NrSW1lU2Vzc2lvbiBpbWVTZXNzaW9uID0gTW9ja0ltZVNlc3Npb24uY3JlYXRlKAorICAgICAgICAgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKS5nZXRVaUF1dG9tYXRpb24oKSwKKyAgICAgICAgICAgICAgICBuZXcgSW1lU2V0dGluZ3MuQnVpbGRlcigpKSkgeworICAgICAgICAgICAgZmluYWwgSW1lRXZlbnRTdHJlYW0gc3RyZWFtID0gaW1lU2Vzc2lvbi5vcGVuRXZlbnRTdHJlYW0oKTsKKworICAgICAgICAgICAgY3JlYXRlVGVzdEFjdGl2aXR5KFNPRlRfSU5QVVRfU1RBVEVfQUxXQVlTX1ZJU0lCTEUpOworICAgICAgICAgICAgZXhwZWN0RXZlbnQoc3RyZWFtLCBldmVudCAtPiAib25TdGFydElucHV0VmlldyIuZXF1YWxzKGV2ZW50LmdldEV2ZW50TmFtZSgpKSwgVElNRU9VVCk7CisKKyAgICAgICAgICAgIGltZVNlc3Npb24uY2FsbFJlcXVlc3RIaWRlU2VsZigwKTsKKyAgICAgICAgICAgIGV4cGVjdEV2ZW50KHN0cmVhbSwgZXZlbnQgLT4gImhpZGVTb2Z0SW5wdXQiLmVxdWFscyhldmVudC5nZXRFdmVudE5hbWUoKSksIFRJTUVPVVQpOworICAgICAgICAgICAgZXhwZWN0RXZlbnQoc3RyZWFtLCBldmVudCAtPiAib25GaW5pc2hJbnB1dFZpZXciLmVxdWFscyhldmVudC5nZXRFdmVudE5hbWUoKSksIFRJTUVPVVQpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWVzdFNob3dTZWxmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSAoTW9ja0ltZVNlc3Npb24gaW1lU2Vzc2lvbiA9IE1vY2tJbWVTZXNzaW9uLmNyZWF0ZSgKKyAgICAgICAgICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VWlBdXRvbWF0aW9uKCksCisgICAgICAgICAgICAgICAgbmV3IEltZVNldHRpbmdzLkJ1aWxkZXIoKSkpIHsKKyAgICAgICAgICAgIGZpbmFsIEltZUV2ZW50U3RyZWFtIHN0cmVhbSA9IGltZVNlc3Npb24ub3BlbkV2ZW50U3RyZWFtKCk7CisKKyAgICAgICAgICAgIGNyZWF0ZVRlc3RBY3Rpdml0eShTT0ZUX0lOUFVUX1NUQVRFX0FMV0FZU19ISURERU4pOworICAgICAgICAgICAgbm90RXhwZWN0RXZlbnQoCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwgZXZlbnQgLT4gIm9uU3RhcnRJbnB1dFZpZXciLmVxdWFscyhldmVudC5nZXRFdmVudE5hbWUoKSksIFRJTUVPVVQpOworCisgICAgICAgICAgICBpbWVTZXNzaW9uLmNhbGxSZXF1ZXN0U2hvd1NlbGYoMCk7CisgICAgICAgICAgICBleHBlY3RFdmVudChzdHJlYW0sIGV2ZW50IC0+ICJzaG93U29mdElucHV0Ii5lcXVhbHMoZXZlbnQuZ2V0RXZlbnROYW1lKCkpLCBUSU1FT1VUKTsKKyAgICAgICAgICAgIGV4cGVjdEV2ZW50KHN0cmVhbSwgZXZlbnQgLT4gIm9uU3RhcnRJbnB1dFZpZXciLmVxdWFscyhldmVudC5nZXRFdmVudE5hbWUoKSksIFRJTUVPVVQpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW5wdXRtZXRob2Qvc3JjL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9jdHMvS2V5Ym9hcmRUZXN0LmphdmEgYi90ZXN0cy9pbnB1dG1ldGhvZC9zcmMvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL2N0cy9LZXlib2FyZFRlc3QuamF2YQppbmRleCAzZjYxMDkzLi44MmM1OTYwIDEwMDY0NAotLS0gYS90ZXN0cy9pbnB1dG1ldGhvZC9zcmMvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL2N0cy9LZXlib2FyZFRlc3QuamF2YQorKysgYi90ZXN0cy9pbnB1dG1ldGhvZC9zcmMvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL2N0cy9LZXlib2FyZFRlc3QuamF2YQpAQCAtMjIsMTAgKzIyLDEwIEBACiAKIGltcG9ydCBhbmRyb2lkLmlucHV0bWV0aG9kc2VydmljZS5LZXlib2FyZDsKIGltcG9ydCBhbmRyb2lkLmlucHV0bWV0aG9kc2VydmljZS5LZXlib2FyZC5LZXk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLmN0cy5SOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiAKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CmRpZmYgLS1naXQgYS90ZXN0cy9pbnB1dG1ldGhvZC9zcmMvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL2N0cy9LZXlib2FyZFZpc2liaWxpdHlDb250cm9sVGVzdC5qYXZhIGIvdGVzdHMvaW5wdXRtZXRob2Qvc3JjL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9jdHMvS2V5Ym9hcmRWaXNpYmlsaXR5Q29udHJvbFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTViNjk1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW5wdXRtZXRob2Qvc3JjL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9jdHMvS2V5Ym9hcmRWaXNpYmlsaXR5Q29udHJvbFRlc3QuamF2YQpAQCAtMCwwICsxLDIzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLmN0czsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuY3RzLnV0aWwuVGVzdFV0aWxzLmdldE9uTWFpblN5bmM7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5jdHMudXRpbC5UZXN0VXRpbHMucnVuT25NYWluU3luYzsKKworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jdHMubW9ja2ltZS5JbWVFdmVudFN0cmVhbVRlc3RVdGlscy5leHBlY3RFdmVudDsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY3RzLm1vY2tpbWUuSW1lRXZlbnRTdHJlYW1UZXN0VXRpbHMubm90RXhwZWN0RXZlbnQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworaW1wb3J0IGFuZHJvaWQudXRpbC5QYWlyOworaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5FZGl0b3JJbmZvOworaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dE1ldGhvZDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5jdHMudXRpbC5FbmRUb0VuZEltZVRlc3RCYXNlOworaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5jdHMudXRpbC5UZXN0QWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRWRpdFRleHQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OworCitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5Ob25OdWxsOworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy5tb2NraW1lLkltZUV2ZW50OworaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy5tb2NraW1lLkltZUV2ZW50U3RyZWFtOworaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy5tb2NraW1lLkltZVNldHRpbmdzOworaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy5tb2NraW1lLk1vY2tJbWVTZXNzaW9uOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY1JlZmVyZW5jZTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlOworCitATWVkaXVtVGVzdAorQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBLZXlib2FyZFZpc2liaWxpdHlDb250cm9sVGVzdCBleHRlbmRzIEVuZFRvRW5kSW1lVGVzdEJhc2UgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVElNRU9VVCA9IFRpbWVVbml0LlNFQ09ORFMudG9NaWxsaXMoNSk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9NQVJLRVJfUFJFRklYID0KKyAgICAgICAgICAgICJhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuY3RzLktleWJvYXJkVmlzaWJpbGl0eUNvbnRyb2xUZXN0IjsKKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRUZXN0TWFya2VyKCkgeworICAgICAgICByZXR1cm4gVEVTVF9NQVJLRVJfUFJFRklYICsgIi8iICArIFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZU5hbm9zKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgUHJlZGljYXRlPEltZUV2ZW50PiBlZGl0b3JNYXRjaGVyKAorICAgICAgICAgICAgQE5vbk51bGwgU3RyaW5nIGV2ZW50TmFtZSwgQE5vbk51bGwgU3RyaW5nIG1hcmtlcikgeworICAgICAgICByZXR1cm4gZXZlbnQgLT4geworICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuZXF1YWxzKGV2ZW50TmFtZSwgZXZlbnQuZ2V0RXZlbnROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgRWRpdG9ySW5mbyBlZGl0b3JJbmZvID0gZXZlbnQuZ2V0QXJndW1lbnRzKCkuZ2V0UGFyY2VsYWJsZSgiZWRpdG9ySW5mbyIpOworICAgICAgICAgICAgcmV0dXJuIFRleHRVdGlscy5lcXVhbHMobWFya2VyLCBlZGl0b3JJbmZvLnByaXZhdGVJbWVPcHRpb25zKTsKKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBQcmVkaWNhdGU8SW1lRXZlbnQ+IHNob3dTb2Z0SW5wdXRNYXRjaGVyKGludCByZXF1aXJlZEZsYWdzKSB7CisgICAgICAgIHJldHVybiBldmVudCAtPiB7CisgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5lcXVhbHMoInNob3dTb2Z0SW5wdXQiLCBldmVudC5nZXRFdmVudE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBpbnQgZmxhZ3MgPSBldmVudC5nZXRBcmd1bWVudHMoKS5nZXRJbnQoImZsYWdzIik7CisgICAgICAgICAgICByZXR1cm4gKGZsYWdzICYgcmVxdWlyZWRGbGFncykgPT0gcmVxdWlyZWRGbGFnczsKKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBQcmVkaWNhdGU8SW1lRXZlbnQ+IGhpZGVTb2Z0SW5wdXRNYXRjaGVyKCkgeworICAgICAgICByZXR1cm4gZXZlbnQgLT4gVGV4dFV0aWxzLmVxdWFscygiaGlkZVNvZnRJbnB1dCIsIGV2ZW50LmdldEV2ZW50TmFtZSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBQcmVkaWNhdGU8SW1lRXZlbnQ+IG9uRmluaXNoSW5wdXRWaWV3TWF0Y2hlcihib29sZWFuIGV4cGVjdGVkRmluaXNoaW5nSW5wdXQpIHsKKyAgICAgICAgcmV0dXJuIGV2ZW50IC0+IHsKKyAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmVxdWFscygib25GaW5pc2hJbnB1dFZpZXciLCBldmVudC5nZXRFdmVudE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBib29sZWFuIGZpbmlzaGluZ0lucHV0ID0gZXZlbnQuZ2V0QXJndW1lbnRzKCkuZ2V0Qm9vbGVhbigiZmluaXNoaW5nSW5wdXQiKTsKKyAgICAgICAgICAgIHJldHVybiBmaW5pc2hpbmdJbnB1dCA9PSBleHBlY3RlZEZpbmlzaGluZ0lucHV0OworICAgICAgICB9OworICAgIH0KKworICAgIHByaXZhdGUgUGFpcjxFZGl0VGV4dCwgRWRpdFRleHQ+IGxhdW5jaFRlc3RBY3Rpdml0eShATm9uTnVsbCBTdHJpbmcgZm9jdXNlZE1hcmtlciwKKyAgICAgICAgICAgIEBOb25OdWxsIFN0cmluZyBub25Gb2N1c2VkTWFya2VyKSB7CisgICAgICAgIGZpbmFsIEF0b21pY1JlZmVyZW5jZTxFZGl0VGV4dD4gZm9jdXNlZEVkaXRUZXh0UmVmID0gbmV3IEF0b21pY1JlZmVyZW5jZTw+KCk7CisgICAgICAgIGZpbmFsIEF0b21pY1JlZmVyZW5jZTxFZGl0VGV4dD4gbm9uRm9jdXNlZEVkaXRUZXh0UmVmID0gbmV3IEF0b21pY1JlZmVyZW5jZTw+KCk7CisgICAgICAgIFRlc3RBY3Rpdml0eS5zdGFydFN5bmMoYWN0aXZpdHkgLT4geworICAgICAgICAgICAgZmluYWwgTGluZWFyTGF5b3V0IGxheW91dCA9IG5ldyBMaW5lYXJMYXlvdXQoYWN0aXZpdHkpOworICAgICAgICAgICAgbGF5b3V0LnNldE9yaWVudGF0aW9uKExpbmVhckxheW91dC5WRVJUSUNBTCk7CisKKyAgICAgICAgICAgIGZpbmFsIEVkaXRUZXh0IGZvY3VzZWRFZGl0VGV4dCA9IG5ldyBFZGl0VGV4dChhY3Rpdml0eSk7CisgICAgICAgICAgICBmb2N1c2VkRWRpdFRleHQuc2V0SGludCgiZm9jdXNlZCBlZGl0VGV4dCIpOworICAgICAgICAgICAgZm9jdXNlZEVkaXRUZXh0LnNldFByaXZhdGVJbWVPcHRpb25zKGZvY3VzZWRNYXJrZXIpOworICAgICAgICAgICAgZm9jdXNlZEVkaXRUZXh0LnJlcXVlc3RGb2N1cygpOworICAgICAgICAgICAgZm9jdXNlZEVkaXRUZXh0UmVmLnNldChmb2N1c2VkRWRpdFRleHQpOworICAgICAgICAgICAgbGF5b3V0LmFkZFZpZXcoZm9jdXNlZEVkaXRUZXh0KTsKKworICAgICAgICAgICAgZmluYWwgRWRpdFRleHQgbm9uRm9jdXNlZEVkaXRUZXh0ID0gbmV3IEVkaXRUZXh0KGFjdGl2aXR5KTsKKyAgICAgICAgICAgIG5vbkZvY3VzZWRFZGl0VGV4dC5zZXRQcml2YXRlSW1lT3B0aW9ucyhub25Gb2N1c2VkTWFya2VyKTsKKyAgICAgICAgICAgIG5vbkZvY3VzZWRFZGl0VGV4dC5zZXRIaW50KCJ0YXJnZXQgZWRpdFRleHQiKTsKKyAgICAgICAgICAgIG5vbkZvY3VzZWRFZGl0VGV4dFJlZi5zZXQobm9uRm9jdXNlZEVkaXRUZXh0KTsKKyAgICAgICAgICAgIGxheW91dC5hZGRWaWV3KG5vbkZvY3VzZWRFZGl0VGV4dCk7CisgICAgICAgICAgICByZXR1cm4gbGF5b3V0OworICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIG5ldyBQYWlyPD4oZm9jdXNlZEVkaXRUZXh0UmVmLmdldCgpLCBub25Gb2N1c2VkRWRpdFRleHRSZWYuZ2V0KCkpOworICAgIH0KKworICAgIHByaXZhdGUgRWRpdFRleHQgbGF1bmNoVGVzdEFjdGl2aXR5KEBOb25OdWxsIFN0cmluZyBtYXJrZXIpIHsKKyAgICAgICAgcmV0dXJuIGxhdW5jaFRlc3RBY3Rpdml0eShtYXJrZXIsIGdldFRlc3RNYXJrZXIoKSkuZmlyc3Q7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmFzaWNTaG93SGlkZVNvZnRJbnB1dCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBJbnB1dE1ldGhvZE1hbmFnZXIgaW1tID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkKKyAgICAgICAgICAgICAgICAuZ2V0VGFyZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoSW5wdXRNZXRob2RNYW5hZ2VyLmNsYXNzKTsKKworICAgICAgICB0cnkgKE1vY2tJbWVTZXNzaW9uIGltZVNlc3Npb24gPSBNb2NrSW1lU2Vzc2lvbi5jcmVhdGUoCisgICAgICAgICAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLmdldFVpQXV0b21hdGlvbigpLAorICAgICAgICAgICAgICAgIG5ldyBJbWVTZXR0aW5ncy5CdWlsZGVyKCkpKSB7CisgICAgICAgICAgICBmaW5hbCBJbWVFdmVudFN0cmVhbSBzdHJlYW0gPSBpbWVTZXNzaW9uLm9wZW5FdmVudFN0cmVhbSgpOworCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWFya2VyID0gZ2V0VGVzdE1hcmtlcigpOworICAgICAgICAgICAgZmluYWwgRWRpdFRleHQgZWRpdFRleHQgPSBsYXVuY2hUZXN0QWN0aXZpdHkobWFya2VyKTsKKworICAgICAgICAgICAgZXhwZWN0RXZlbnQoc3RyZWFtLCBlZGl0b3JNYXRjaGVyKCJvblN0YXJ0SW5wdXQiLCBtYXJrZXIpLCBUSU1FT1VUKTsKKyAgICAgICAgICAgIG5vdEV4cGVjdEV2ZW50KHN0cmVhbSwgZWRpdG9yTWF0Y2hlcigib25TdGFydElucHV0VmlldyIsIG1hcmtlciksIFRJTUVPVVQpOworCisgICAgICAgICAgICBhc3NlcnRUcnVlKCJpc0FjdGl2ZSgpIG11c3QgcmV0dXJuIHRydWUgaWYgdGhlIFZpZXcgaGFzIElNRSBmb2N1cyIsCisgICAgICAgICAgICAgICAgICAgIGdldE9uTWFpblN5bmMoKCkgLT4gaW1tLmlzQWN0aXZlKGVkaXRUZXh0KSkpOworCisgICAgICAgICAgICAvLyBUZXN0IHNob3dTb2Z0SW5wdXQoKSBmbG93CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJzaG93U29mdElucHV0IG11c3Qgc3VjY2VzcyBpZiB0aGUgVmlldyBoYXMgSU1FIGZvY3VzIiwKKyAgICAgICAgICAgICAgICAgICAgZ2V0T25NYWluU3luYygoKSAtPiBpbW0uc2hvd1NvZnRJbnB1dChlZGl0VGV4dCwgMCkpKTsKKworICAgICAgICAgICAgZXhwZWN0RXZlbnQoc3RyZWFtLCBzaG93U29mdElucHV0TWF0Y2hlcihJbnB1dE1ldGhvZC5TSE9XX0VYUExJQ0lUKSwgVElNRU9VVCk7CisgICAgICAgICAgICBleHBlY3RFdmVudChzdHJlYW0sIGVkaXRvck1hdGNoZXIoIm9uU3RhcnRJbnB1dFZpZXciLCBtYXJrZXIpLCBUSU1FT1VUKTsKKworICAgICAgICAgICAgLy8gVGVzdCBoaWRlU29mdElucHV0RnJvbVdpbmRvdygpIGZsb3cKKyAgICAgICAgICAgIGFzc2VydFRydWUoImhpZGVTb2Z0SW5wdXRGcm9tV2luZG93IG11c3Qgc3VjY2VzcyBpZiB0aGUgVmlldyBoYXMgSU1FIGZvY3VzIiwKKyAgICAgICAgICAgICAgICAgICAgZ2V0T25NYWluU3luYygoKSAtPiBpbW0uaGlkZVNvZnRJbnB1dEZyb21XaW5kb3coZWRpdFRleHQuZ2V0V2luZG93VG9rZW4oKSwgMCkpKTsKKworICAgICAgICAgICAgZXhwZWN0RXZlbnQoc3RyZWFtLCBoaWRlU29mdElucHV0TWF0Y2hlcigpLCBUSU1FT1VUKTsKKyAgICAgICAgICAgIGV4cGVjdEV2ZW50KHN0cmVhbSwgb25GaW5pc2hJbnB1dFZpZXdNYXRjaGVyKGZhbHNlKSwgVElNRU9VVCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaG93SGlkZVNvZnRJbnB1dFNob3VsZEJlSWdub3JlZE9uTm9uRm9jdXNlZFZpZXcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgSW5wdXRNZXRob2RNYW5hZ2VyIGltbSA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpCisgICAgICAgICAgICAgICAgLmdldFRhcmdldENvbnRleHQoKS5nZXRTeXN0ZW1TZXJ2aWNlKElucHV0TWV0aG9kTWFuYWdlci5jbGFzcyk7CisKKyAgICAgICAgdHJ5IChNb2NrSW1lU2Vzc2lvbiBpbWVTZXNzaW9uID0gTW9ja0ltZVNlc3Npb24uY3JlYXRlKAorICAgICAgICAgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKS5nZXRVaUF1dG9tYXRpb24oKSwKKyAgICAgICAgICAgICAgICBuZXcgSW1lU2V0dGluZ3MuQnVpbGRlcigpKSkgeworICAgICAgICAgICAgZmluYWwgSW1lRXZlbnRTdHJlYW0gc3RyZWFtID0gaW1lU2Vzc2lvbi5vcGVuRXZlbnRTdHJlYW0oKTsKKworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZvY3VzZWRNYXJrZXIgPSBnZXRUZXN0TWFya2VyKCk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbm9uRm9jdXNlZE1hcmtlciA9IGdldFRlc3RNYXJrZXIoKTsKKyAgICAgICAgICAgIGZpbmFsIFBhaXI8RWRpdFRleHQsIEVkaXRUZXh0PiBlZGl0VGV4dFBhaXIgPQorICAgICAgICAgICAgICAgICAgICBsYXVuY2hUZXN0QWN0aXZpdHkoZm9jdXNlZE1hcmtlciwgbm9uRm9jdXNlZE1hcmtlcik7CisgICAgICAgICAgICBmaW5hbCBFZGl0VGV4dCBub25Gb2N1c2VkRWRpdFRleHQgPSBlZGl0VGV4dFBhaXIuc2Vjb25kOworCisgICAgICAgICAgICBleHBlY3RFdmVudChzdHJlYW0sIGVkaXRvck1hdGNoZXIoIm9uU3RhcnRJbnB1dCIsIGZvY3VzZWRNYXJrZXIpLCBUSU1FT1VUKTsKKworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoImlzQWN0aXZlKCkgbXVzdCByZXR1cm4gZmFsc2UgaWYgdGhlIFZpZXcgZG9lcyBub3QgaGF2ZSBJTUUgZm9jdXMiLAorICAgICAgICAgICAgICAgICAgICBnZXRPbk1haW5TeW5jKCgpIC0+IGltbS5pc0FjdGl2ZShub25Gb2N1c2VkRWRpdFRleHQpKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZSgic2hvd1NvZnRJbnB1dCBtdXN0IGZhaWwgaWYgdGhlIFZpZXcgZG9lcyBub3QgaGF2ZSBJTUUgZm9jdXMiLAorICAgICAgICAgICAgICAgICAgICBnZXRPbk1haW5TeW5jKCgpIC0+IGltbS5zaG93U29mdElucHV0KG5vbkZvY3VzZWRFZGl0VGV4dCwgMCkpKTsKKyAgICAgICAgICAgIG5vdEV4cGVjdEV2ZW50KHN0cmVhbSwgc2hvd1NvZnRJbnB1dE1hdGNoZXIoSW5wdXRNZXRob2QuU0hPV19FWFBMSUNJVCksIFRJTUVPVVQpOworCisgICAgICAgICAgICBhc3NlcnRGYWxzZSgiaGlkZVNvZnRJbnB1dEZyb21XaW5kb3cgbXVzdCBmYWlsIGlmIHRoZSBWaWV3IGRvZXMgbm90IGhhdmUgSU1FIGZvY3VzIiwKKyAgICAgICAgICAgICAgICAgICAgZ2V0T25NYWluU3luYygoKSAtPiBpbW0uaGlkZVNvZnRJbnB1dEZyb21XaW5kb3coCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uRm9jdXNlZEVkaXRUZXh0LmdldFdpbmRvd1Rva2VuKCksIDApKSk7CisgICAgICAgICAgICBub3RFeHBlY3RFdmVudChzdHJlYW0sIGhpZGVTb2Z0SW5wdXRNYXRjaGVyKCksIFRJTUVPVVQpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9nZ2xlU29mdElucHV0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIElucHV0TWV0aG9kTWFuYWdlciBpbW0gPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKQorICAgICAgICAgICAgICAgIC5nZXRUYXJnZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShJbnB1dE1ldGhvZE1hbmFnZXIuY2xhc3MpOworCisgICAgICAgIHRyeSAoTW9ja0ltZVNlc3Npb24gaW1lU2Vzc2lvbiA9IE1vY2tJbWVTZXNzaW9uLmNyZWF0ZSgKKyAgICAgICAgICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VWlBdXRvbWF0aW9uKCksCisgICAgICAgICAgICAgICAgbmV3IEltZVNldHRpbmdzLkJ1aWxkZXIoKSkpIHsKKyAgICAgICAgICAgIGZpbmFsIEltZUV2ZW50U3RyZWFtIHN0cmVhbSA9IGltZVNlc3Npb24ub3BlbkV2ZW50U3RyZWFtKCk7CisKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtYXJrZXIgPSBnZXRUZXN0TWFya2VyKCk7CisgICAgICAgICAgICBmaW5hbCBFZGl0VGV4dCBlZGl0VGV4dCA9IGxhdW5jaFRlc3RBY3Rpdml0eShtYXJrZXIpOworCisgICAgICAgICAgICBleHBlY3RFdmVudChzdHJlYW0sIGVkaXRvck1hdGNoZXIoIm9uU3RhcnRJbnB1dCIsIG1hcmtlciksIFRJTUVPVVQpOworICAgICAgICAgICAgbm90RXhwZWN0RXZlbnQoc3RyZWFtLCBlZGl0b3JNYXRjaGVyKCJvblN0YXJ0SW5wdXRWaWV3IiwgbWFya2VyKSwgVElNRU9VVCk7CisKKyAgICAgICAgICAgIC8vIFRlc3QgdG9nZ2xlU29mdElucHV0RnJvbVdpbmRvdygpIGZsb3cKKyAgICAgICAgICAgIHJ1bk9uTWFpblN5bmMoKCkgLT4gaW1tLnRvZ2dsZVNvZnRJbnB1dEZyb21XaW5kb3coZWRpdFRleHQuZ2V0V2luZG93VG9rZW4oKSwgMCwgMCkpOworCisgICAgICAgICAgICBleHBlY3RFdmVudChzdHJlYW0uY29weSgpLCBzaG93U29mdElucHV0TWF0Y2hlcihJbnB1dE1ldGhvZC5TSE9XX0VYUExJQ0lUKSwgVElNRU9VVCk7CisgICAgICAgICAgICBleHBlY3RFdmVudChzdHJlYW0uY29weSgpLCBlZGl0b3JNYXRjaGVyKCJvblN0YXJ0SW5wdXRWaWV3IiwgbWFya2VyKSwgVElNRU9VVCk7CisKKyAgICAgICAgICAgIC8vIENhbGxpbmcgdG9nZ2xlU29mdElucHV0RnJvbVdpbmRvdygpIG11c3QgaGlkZSB0aGUgSU1FLgorICAgICAgICAgICAgcnVuT25NYWluU3luYygoKSAtPiBpbW0udG9nZ2xlU29mdElucHV0RnJvbVdpbmRvdyhlZGl0VGV4dC5nZXRXaW5kb3dUb2tlbigpLCAwLCAwKSk7CisKKyAgICAgICAgICAgIGV4cGVjdEV2ZW50KHN0cmVhbSwgaGlkZVNvZnRJbnB1dE1hdGNoZXIoKSwgVElNRU9VVCk7CisgICAgICAgICAgICBleHBlY3RFdmVudChzdHJlYW0sIG9uRmluaXNoSW5wdXRWaWV3TWF0Y2hlcihmYWxzZSksIFRJTUVPVVQpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW5wdXRtZXRob2Qvc3JjL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9jdHMvTmF2aWdhdGlvbkJhckNvbG9yVGVzdC5qYXZhIGIvdGVzdHMvaW5wdXRtZXRob2Qvc3JjL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9jdHMvTmF2aWdhdGlvbkJhckNvbG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZjc3MzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnB1dG1ldGhvZC9zcmMvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL2N0cy9OYXZpZ2F0aW9uQmFyQ29sb3JUZXN0LmphdmEKQEAgLTAsMCArMSwzNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5jdHM7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LlZpZXcuU1lTVEVNX1VJX0ZMQUdfTElHSFRfTkFWSUdBVElPTl9CQVI7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0FMVF9GT0NVU0FCTEVfSU07CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0RJTV9CRUhJTkQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0RSQVdTX1NZU1RFTV9CQVJfQkFDS0dST1VORFM7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX05PVF9GT0NVU0FCTEU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5jdHMudXRpbC5MaWdodE5hdmlnYXRpb25CYXJWZXJpZmllci5leHBlY3RMaWdodE5hdmlnYXRpb25CYXJOb3RTdXBwb3J0ZWQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5jdHMudXRpbC5MaWdodE5hdmlnYXRpb25CYXJWZXJpZmllci5leHBlY3RMaWdodE5hdmlnYXRpb25CYXJTdXBwb3J0ZWQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5jdHMudXRpbC5OYXZpZ2F0aW9uQmFyQ29sb3JWZXJpZmllci5leHBlY3ROYXZpZ2F0aW9uQmFyQ29sb3JOb3RTdXBwb3J0ZWQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5jdHMudXRpbC5OYXZpZ2F0aW9uQmFyQ29sb3JWZXJpZmllci5leHBlY3ROYXZpZ2F0aW9uQmFyQ29sb3JTdXBwb3J0ZWQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5jdHMudXRpbC5UZXN0VXRpbHMuZ2V0T25NYWluU3luYzsKKworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jdHMubW9ja2ltZS5JbWVFdmVudFN0cmVhbVRlc3RVdGlscy5leHBlY3RCaW5kSW5wdXQ7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmN0cy5tb2NraW1lLkltZUV2ZW50U3RyZWFtVGVzdFV0aWxzLmV4cGVjdEV2ZW50OworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jdHMubW9ja2ltZS5JbWVFdmVudFN0cmVhbVRlc3RVdGlscy53YWl0Rm9ySW5wdXRWaWV3TGF5b3V0U3RhYmxlOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc3VtZS5hc3N1bWVUcnVlOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2c7CitpbXBvcnQgYW5kcm9pZC5hcHAuVWlBdXRvbWF0aW9uOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3I7CitpbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuRWRpdG9ySW5mbzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuY3RzLnV0aWwuRW5kVG9FbmRJbWVUZXN0QmFzZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuY3RzLnV0aWwuSW1lQXdhcmVFZGl0VGV4dDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuY3RzLnV0aWwuTmF2aWdhdGlvbkJhckluZm87CitpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLmN0cy51dGlsLlRlc3RBY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLkNvbG9ySW50OworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTm9uTnVsbDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jdHMubW9ja2ltZS5JbWVFdmVudFN0cmVhbTsKK2ltcG9ydCBjb20uYW5kcm9pZC5jdHMubW9ja2ltZS5JbWVMYXlvdXRJbmZvOworaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy5tb2NraW1lLkltZVNldHRpbmdzOworaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy5tb2NraW1lLk1vY2tJbWVTZXNzaW9uOworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK0BNZWRpdW1UZXN0CitAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIE5hdmlnYXRpb25CYXJDb2xvclRlc3QgZXh0ZW5kcyBFbmRUb0VuZEltZVRlc3RCYXNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFRJTUVPVVQgPSBUaW1lVW5pdC5TRUNPTkRTLnRvTWlsbGlzKDUpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgTEFZT1VUX1NUQUJMRV9USFJFU0hPTEQgPSBUaW1lVW5pdC5TRUNPTkRTLnRvTWlsbGlzKDMpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfTUFSS0VSID0gImFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5jdHMuTmF2aWdhdGlvbkJhckNvbG9yVGVzdCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHVwZGF0ZVN5c3RlbVVpVmlzaWJpbGl0eShATm9uTnVsbCBWaWV3IHZpZXcsIGludCBmbGFncywgaW50IG1hc2spIHsKKyAgICAgICAgZmluYWwgaW50IGN1cnJlbnRGbGFncyA9IHZpZXcuZ2V0U3lzdGVtVWlWaXNpYmlsaXR5KCk7CisgICAgICAgIGZpbmFsIGludCBuZXdGbGFncyA9IChjdXJyZW50RmxhZ3MgJiB+bWFzaykgfCAoZmxhZ3MgJiBtYXNrKTsKKyAgICAgICAgaWYgKGN1cnJlbnRGbGFncyAhPSBuZXdGbGFncykgeworICAgICAgICAgICAgdmlldy5zZXRTeXN0ZW1VaVZpc2liaWxpdHkobmV3RmxhZ3MpOworICAgICAgICB9CisgICAgfQorCisgICAgQEJlZm9yZUNsYXNzCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGluaXRpYWxpemVOYXZpZ2F0aW9uQmFySW5mbygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBOYXZpZ2F0aW9uQmFySW5mbyBpcyBpbml0aWFsaXplZCBiZWZvcmUKKyAgICAgICAgLy8gRW5kVG9FbmRJbWVUZXN0QmFzZSNzaG93U3RhdGVJbml0aWFsaXplQWN0aXZpdHkoKS4KKyAgICAgICAgTmF2aWdhdGlvbkJhckluZm8uZ2V0SW5zdGFuY2UoKTsKKyAgICB9CisKKyAgICAvLyBUT0RPKGIvMzc1MDIwNjYpOiBNZXJnZSB0aGlzIGJhY2sgdG8gaW5pdGlhbGl6ZU5hdmlnYXRpb25CYXJJbmZvKCkgb25jZSBiLzM3NTAyMDY2IGlzIGZpeGVkLgorICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBjaGVja05hdmlnYXRpb25CYXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzdW1lVHJ1ZSgiVGhpcyB0ZXN0IGRvZXMgbm90IG1ha2Ugc2Vuc2UgaWYgdGhlcmUgaXMgbm8gbmF2aWdhdGlvbiBiYXIiLAorICAgICAgICAgICAgICAgIE5hdmlnYXRpb25CYXJJbmZvLmdldEluc3RhbmNlKCkuaGFzQm90dG9tTmF2aWdhdGlvbkJhcigpKTsKKworICAgICAgICBhc3N1bWVUcnVlKCJUaGlzIHRlc3QgZG9lcyBub3QgbWFrZSBzZW5zZSBpZiBjdXN0b20gbmF2aWdhdGlvbiBiYXIgY29sb3IgaXMgbm90IHN1cHBvcnRlZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBldmVuIGZvciB0eXBpY2FsIEFjdGl2aXR5IiwKKyAgICAgICAgICAgICAgICBOYXZpZ2F0aW9uQmFySW5mby5nZXRJbnN0YW5jZSgpLnN1cHBvcnRzTmF2aWdhdGlvbkJhckNvbG9yKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgdGVzdCBzY2VuYXJpb3MgcmVnYXJkaW5nIGhvdyBhIHtAbGluayBhbmRyb2lkLnZpZXcuV2luZG93fSB0aGF0IGhhcworICAgICAqIHtAbGluayBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMjRkxBR19ESU1fQkVISU5EfSBpbnRlcmFjdHMgd2l0aCBhIGRpZmZlcmVudAorICAgICAqIHtAbGluayBhbmRyb2lkLnZpZXcuV2luZG93fSB0aGF0IGhhcworICAgICAqIHtAbGluayBhbmRyb2lkLnZpZXcuVmlldyNTWVNURU1fVUlfRkxBR19MSUdIVF9OQVZJR0FUSU9OX0JBUn0uCisgICAgICovCisgICAgcHJpdmF0ZSBlbnVtIERpbW1pbmdUZXN0TW9kZSB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBObyB7QGxpbmsgQWxlcnREaWFsb2d9IGlzIHNob3duIHdoZW4gdGVzdGluZy4KKyAgICAgICAgICovCisgICAgICAgIE5PX0RJTU1JTkdfRElBTE9HLAorICAgICAgICAvKioKKyAgICAgICAgICogQW4ge0BsaW5rIEFsZXJ0RGlhbG9nfSB0aGF0IGhhcyBkaW1taW5nIGVmZmVjdCBpcyBzaG93biBhYm92ZSB0aGUgSU1FIHdpbmRvdy4KKyAgICAgICAgICovCisgICAgICAgIERJTU1JTkdfRElBTE9HX0FCT1ZFX0lNRSwKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIHtAbGluayBBbGVydERpYWxvZ30gdGhhdCBoYXMgZGltbWluZyBlZmZlY3QgaXMgc2hvd24gYmVoaW5kIHRoZSBJTUUgd2luZG93LgorICAgICAgICAgKi8KKyAgICAgICAgRElNTUlOR19ESUFMT0dfQkVISU5EX0lNRSwKKyAgICB9CisKKyAgICBATm9uTnVsbAorICAgIHB1YmxpYyBUZXN0QWN0aXZpdHkgbGF1bmNoVGVzdEFjdGl2aXR5KEBDb2xvckludCBpbnQgbmF2aWdhdGlvbkJhckNvbG9yLAorICAgICAgICAgICAgYm9vbGVhbiBsaWdodE5hdmlnYXRpb25CYXIsIEBOb25OdWxsIERpbW1pbmdUZXN0TW9kZSBkaW1taW5nVGVzdE1vZGUpIHsKKyAgICAgICAgcmV0dXJuIFRlc3RBY3Rpdml0eS5zdGFydFN5bmMoYWN0aXZpdHkgLT4geworICAgICAgICAgICAgZmluYWwgVmlldyBjb250ZW50VmlldzsKKyAgICAgICAgICAgIHN3aXRjaCAoZGltbWluZ1Rlc3RNb2RlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBOT19ESU1NSU5HX0RJQUxPRzoKKyAgICAgICAgICAgICAgICBjYXNlIERJTU1JTkdfRElBTE9HX0FCT1ZFX0lNRTogeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaW5lYXJMYXlvdXQgbGF5b3V0ID0gbmV3IExpbmVhckxheW91dChhY3Rpdml0eSk7CisgICAgICAgICAgICAgICAgICAgIGxheW91dC5zZXRPcmllbnRhdGlvbihMaW5lYXJMYXlvdXQuVkVSVElDQUwpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBJbWVBd2FyZUVkaXRUZXh0IGVkaXRUZXh0ID0gbmV3IEltZUF3YXJlRWRpdFRleHQoYWN0aXZpdHkpOworICAgICAgICAgICAgICAgICAgICBlZGl0VGV4dC5zZXRQcml2YXRlSW1lT3B0aW9ucyhURVNUX01BUktFUik7CisgICAgICAgICAgICAgICAgICAgIGVkaXRUZXh0LnNldEhpbnQoImVkaXRUZXh0Iik7CisgICAgICAgICAgICAgICAgICAgIGVkaXRUZXh0LnJlcXVlc3RGb2N1cygpOworICAgICAgICAgICAgICAgICAgICBlZGl0VGV4dC5zY2hlZHVsZVNob3dTb2Z0SW5wdXQoKTsKKyAgICAgICAgICAgICAgICAgICAgbGF5b3V0LmFkZFZpZXcoZWRpdFRleHQpOworICAgICAgICAgICAgICAgICAgICBjb250ZW50VmlldyA9IGxheW91dDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgRElNTUlOR19ESUFMT0dfQkVISU5EX0lNRTogeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IHZpZXcgPSBuZXcgVmlldyhhY3Rpdml0eSk7CisgICAgICAgICAgICAgICAgICAgIHZpZXcuc2V0TGF5b3V0UGFyYW1zKG5ldyBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRWaWV3ID0gdmlldzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInVua25vd24gbW9kZT0iICsgZGltbWluZ1Rlc3RNb2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFjdGl2aXR5LmdldFdpbmRvdygpLnNldE5hdmlnYXRpb25CYXJDb2xvcihuYXZpZ2F0aW9uQmFyQ29sb3IpOworICAgICAgICAgICAgdXBkYXRlU3lzdGVtVWlWaXNpYmlsaXR5KGNvbnRlbnRWaWV3LAorICAgICAgICAgICAgICAgICAgICBsaWdodE5hdmlnYXRpb25CYXIgPyBTWVNURU1fVUlfRkxBR19MSUdIVF9OQVZJR0FUSU9OX0JBUiA6IDAsCisgICAgICAgICAgICAgICAgICAgIFNZU1RFTV9VSV9GTEFHX0xJR0hUX05BVklHQVRJT05fQkFSKTsKKyAgICAgICAgICAgIHJldHVybiBjb250ZW50VmlldzsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBBdXRvQ2xvc2VhYmxlIHNob3dEaWFsb2dJZk5lY2Vzc2FyeSgKKyAgICAgICAgICAgIEBOb25OdWxsIEFjdGl2aXR5IGFjdGl2aXR5LCBATm9uTnVsbCBEaW1taW5nVGVzdE1vZGUgZGltbWluZ1Rlc3RNb2RlKSB7CisgICAgICAgIHN3aXRjaCAoZGltbWluZ1Rlc3RNb2RlKSB7CisgICAgICAgICAgICBjYXNlIE5PX0RJTU1JTkdfRElBTE9HOgorICAgICAgICAgICAgICAgIC8vIERpYWxvZyBpcyBub3QgbmVjZXNzYXJ5LgorICAgICAgICAgICAgICAgIHJldHVybiAoKSAtPiB7IH07CisgICAgICAgICAgICBjYXNlIERJTU1JTkdfRElBTE9HX0FCT1ZFX0lNRTogeworICAgICAgICAgICAgICAgIGZpbmFsIEFsZXJ0RGlhbG9nIGFsZXJ0RGlhbG9nID0gZ2V0T25NYWluU3luYygoKSAtPiB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFRleHRWaWV3IHRleHRWaWV3ID0gbmV3IFRleHRWaWV3KGFjdGl2aXR5KTsKKyAgICAgICAgICAgICAgICAgICAgdGV4dFZpZXcuc2V0VGV4dCgiRHVtbXkiKTsKKyAgICAgICAgICAgICAgICAgICAgdGV4dFZpZXcucmVxdWVzdEZvY3VzKCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFsZXJ0RGlhbG9nIGRpYWxvZyA9IG5ldyBBbGVydERpYWxvZy5CdWlsZGVyKGFjdGl2aXR5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRWaWV3KHRleHRWaWV3KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgZGlhbG9nLmdldFdpbmRvdygpLnNldEZsYWdzKEZMQUdfRElNX0JFSElORCB8IEZMQUdfQUxUX0ZPQ1VTQUJMRV9JTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTEFHX0RJTV9CRUhJTkQgfCBGTEFHX05PVF9GT0NVU0FCTEUgfCBGTEFHX0FMVF9GT0NVU0FCTEVfSU0pOworICAgICAgICAgICAgICAgICAgICBkaWFsb2cuc2hvdygpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGlhbG9nOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIC8vIE5vdGU6IERpYWxvZyNkaXNtaXNzKCkgaXMgYSB0aHJlYWQgc2FmZSBtZXRob2Qgc28gd2UgZG9uJ3QgbmVlZCB0byBjYWxsIHRoaXMgZnJvbQorICAgICAgICAgICAgICAgIC8vIHRoZSBVSSB0aHJlYWQuCisgICAgICAgICAgICAgICAgcmV0dXJuICgpIC0+IGFsZXJ0RGlhbG9nLmRpc21pc3MoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgRElNTUlOR19ESUFMT0dfQkVISU5EX0lNRTogeworICAgICAgICAgICAgICAgIGZpbmFsIEFsZXJ0RGlhbG9nIGFsZXJ0RGlhbG9nID0gZ2V0T25NYWluU3luYygoKSAtPiB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIEltZUF3YXJlRWRpdFRleHQgZWRpdFRleHQgPSBuZXcgSW1lQXdhcmVFZGl0VGV4dChhY3Rpdml0eSk7CisgICAgICAgICAgICAgICAgICAgIGVkaXRUZXh0LnNldFByaXZhdGVJbWVPcHRpb25zKFRFU1RfTUFSS0VSKTsKKyAgICAgICAgICAgICAgICAgICAgZWRpdFRleHQuc2V0SGludCgiZWRpdFRleHQiKTsKKyAgICAgICAgICAgICAgICAgICAgZWRpdFRleHQucmVxdWVzdEZvY3VzKCk7CisgICAgICAgICAgICAgICAgICAgIGVkaXRUZXh0LnNjaGVkdWxlU2hvd1NvZnRJbnB1dCgpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBBbGVydERpYWxvZyBkaWFsb2cgPSBuZXcgQWxlcnREaWFsb2cuQnVpbGRlcihhY3Rpdml0eSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0VmlldyhlZGl0VGV4dCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlKCk7CisgICAgICAgICAgICAgICAgICAgIGRpYWxvZy5nZXRXaW5kb3coKS5zZXRGbGFncyhGTEFHX0RJTV9CRUhJTkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkxBR19ESU1fQkVISU5EIHwgRkxBR19OT1RfRk9DVVNBQkxFIHwgRkxBR19BTFRfRk9DVVNBQkxFX0lNKTsKKyAgICAgICAgICAgICAgICAgICAgZGlhbG9nLnNob3coKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRpYWxvZzsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAvLyBOb3RlOiBEaWFsb2cjZGlzbWlzcygpIGlzIGEgdGhyZWFkIHNhZmUgbWV0aG9kIHNvIHdlIGRvbid0IG5lZWQgdG8gY2FsbCB0aGlzIGZyb20KKyAgICAgICAgICAgICAgICAvLyB0aGUgVUkgdGhyZWFkLgorICAgICAgICAgICAgICAgIHJldHVybiAoKSAtPiBhbGVydERpYWxvZy5kaXNtaXNzKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInVua25vd24gbW9kZT0iICsgZGltbWluZ1Rlc3RNb2RlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBOb25OdWxsCisgICAgcHJpdmF0ZSBJbWVTZXR0aW5ncy5CdWlsZGVyIGltZVNldHRpbmdGb3JTb2xpZE5hdmlnYXRpb25CYXIoQENvbG9ySW50IGludCBuYXZpZ2F0aW9uQmFyQ29sb3IsCisgICAgICAgICAgICBib29sZWFuIGxpZ2h0TmF2aWdhdGlvbkJhcikgeworICAgICAgICBmaW5hbCBJbWVTZXR0aW5ncy5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgSW1lU2V0dGluZ3MuQnVpbGRlcigpOworICAgICAgICBidWlsZGVyLnNldE5hdmlnYXRpb25CYXJDb2xvcihuYXZpZ2F0aW9uQmFyQ29sb3IpOworICAgICAgICBpZiAobGlnaHROYXZpZ2F0aW9uQmFyKSB7CisgICAgICAgICAgICBidWlsZGVyLnNldElucHV0Vmlld1N5c3RlbVVpVmlzaWJpbGl0eShTWVNURU1fVUlfRkxBR19MSUdIVF9OQVZJR0FUSU9OX0JBUik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1aWxkZXI7CisgICAgfQorCisgICAgQE5vbk51bGwKKyAgICBwcml2YXRlIEltZVNldHRpbmdzLkJ1aWxkZXIgaW1lU2V0dGluZ0ZvckZsb2F0aW5nSW1lKEBDb2xvckludCBpbnQgbmF2aWdhdGlvbkJhckNvbG9yLAorICAgICAgICAgICAgYm9vbGVhbiBsaWdodE5hdmlnYXRpb25CYXIpIHsKKyAgICAgICAgZmluYWwgSW1lU2V0dGluZ3MuQnVpbGRlciBidWlsZGVyID0gbmV3IEltZVNldHRpbmdzLkJ1aWxkZXIoKTsKKyAgICAgICAgYnVpbGRlci5zZXRXaW5kb3dGbGFncygwLCBGTEFHX0RSQVdTX1NZU1RFTV9CQVJfQkFDS0dST1VORFMpOworICAgICAgICAvLyBBcyBkb2N1bWVudGVkLCBXaW5kb3cjc2V0TmF2aWdhdGlvbkJhckNvbG9yKCkgaXMgYWN0dWFsbHkgaWdub3JlZCB3aGVuIHRoZSBJTUUgd2luZG93CisgICAgICAgIC8vIGRvZXMgbm90IGhhdmUgRkxBR19EUkFXU19TWVNURU1fQkFSX0JBQ0tHUk9VTkRTLiAgV2UgYXJlIGNhbGxpbmcgc2V0TmF2aWdhdGlvbkJhckNvbG9yKCkKKyAgICAgICAgLy8gdG8gZW5zdXJlIGl0LgorICAgICAgICBidWlsZGVyLnNldE5hdmlnYXRpb25CYXJDb2xvcihuYXZpZ2F0aW9uQmFyQ29sb3IpOworICAgICAgICBpZiAobGlnaHROYXZpZ2F0aW9uQmFyKSB7CisgICAgICAgICAgICAvLyBBcyBkb2N1bWVudGVkLCBTWVNURU1fVUlfRkxBR19MSUdIVF9OQVZJR0FUSU9OX0JBUiBpcyBhY3R1YWxseSBpZ25vcmVkIHdoZW4gdGhlIElNRQorICAgICAgICAgICAgLy8gd2luZG93IGRvZXMgbm90IGhhdmUgRkxBR19EUkFXU19TWVNURU1fQkFSX0JBQ0tHUk9VTkRTLiAgV2Ugc2V0IHRoaXMgZmxhZyBqdXN0IHRvCisgICAgICAgICAgICAvLyBlbnN1cmUgaXQuCisgICAgICAgICAgICBidWlsZGVyLnNldElucHV0Vmlld1N5c3RlbVVpVmlzaWJpbGl0eShTWVNURU1fVUlfRkxBR19MSUdIVF9OQVZJR0FUSU9OX0JBUik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1aWxkZXI7CisgICAgfQorCisgICAgQE5vbk51bGwKKyAgICBwcml2YXRlIEJpdG1hcCBnZXROYXZpZ2F0aW9uQmFyQml0bWFwKEBOb25OdWxsIEltZVNldHRpbmdzLkJ1aWxkZXIgYnVpbGRlciwKKyAgICAgICAgICAgIEBDb2xvckludCBpbnQgYXBwTmF2aWdhdGlvbkJhckNvbG9yLCBib29sZWFuIGFwcExpZ2h0TmF2aWdhdGlvbkJhciwKKyAgICAgICAgICAgIGludCBuYXZpZ2F0aW9uQmFySGVpZ2h0LCBATm9uTnVsbCBEaW1taW5nVGVzdE1vZGUgZGltbWluZ1Rlc3RNb2RlKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFVpQXV0b21hdGlvbiB1aUF1dG9tYXRpb24gPQorICAgICAgICAgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLmdldFVpQXV0b21hdGlvbigpOworICAgICAgICB0cnkgKE1vY2tJbWVTZXNzaW9uIGltZVNlc3Npb24gPSBNb2NrSW1lU2Vzc2lvbi5jcmVhdGUoCisgICAgICAgICAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpLCB1aUF1dG9tYXRpb24sIGJ1aWxkZXIpKSB7CisgICAgICAgICAgICBmaW5hbCBJbWVFdmVudFN0cmVhbSBzdHJlYW0gPSBpbWVTZXNzaW9uLm9wZW5FdmVudFN0cmVhbSgpOworCisgICAgICAgICAgICBmaW5hbCBUZXN0QWN0aXZpdHkgYWN0aXZpdHkgPSBsYXVuY2hUZXN0QWN0aXZpdHkoCisgICAgICAgICAgICAgICAgICAgIGFwcE5hdmlnYXRpb25CYXJDb2xvciwgYXBwTGlnaHROYXZpZ2F0aW9uQmFyLCBkaW1taW5nVGVzdE1vZGUpOworCisgICAgICAgICAgICAvLyBTaG93IEFsZXJ0RGlhbG9nIGlmIG5lY2Vzc2FyeSwgYmFzZWQgb24gdGhlIGRpbW1pbmcgdGVzdCBtb2RlLgorICAgICAgICAgICAgdHJ5IChBdXRvQ2xvc2VhYmxlIGRpYWxvZ0Nsb3NlciA9IHNob3dEaWFsb2dJZk5lY2Vzc2FyeSgKKyAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHksIGRpbW1pbmdUZXN0TW9kZSkpIHsKKyAgICAgICAgICAgICAgICAvLyBXYWl0IHVudGlsIHRoZSBNb2NrSW1lIGdldHMgYm91bmQgdG8gdGhlIFRlc3RBY3Rpdml0eS4KKyAgICAgICAgICAgICAgICBleHBlY3RCaW5kSW5wdXQoc3RyZWFtLCBQcm9jZXNzLm15UGlkKCksIFRJTUVPVVQpOworCisgICAgICAgICAgICAgICAgLy8gV2FpdCB1bnRpbCAib25TdGFydElucHV0IiBnZXRzIGNhbGxlZCBmb3IgdGhlIEVkaXRUZXh0LgorICAgICAgICAgICAgICAgIGV4cGVjdEV2ZW50KHN0cmVhbSwgZXZlbnQgLT4geworICAgICAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5lcXVhbHMoIm9uU3RhcnRJbnB1dFZpZXciLCBldmVudC5nZXRFdmVudE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmaW5hbCBFZGl0b3JJbmZvIGVkaXRvckluZm8gPSBldmVudC5nZXRBcmd1bWVudHMoKS5nZXRQYXJjZWxhYmxlKCJlZGl0b3JJbmZvIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUZXh0VXRpbHMuZXF1YWxzKFRFU1RfTUFSS0VSLCBlZGl0b3JJbmZvLnByaXZhdGVJbWVPcHRpb25zKTsKKyAgICAgICAgICAgICAgICB9LCBUSU1FT1VUKTsKKworICAgICAgICAgICAgICAgIC8vIFdhaXQgdW50aWwgTW9ja0ltZSdzIGxheW91dCBiZWNvbWVzIHN0YWJsZS4KKyAgICAgICAgICAgICAgICBmaW5hbCBJbWVMYXlvdXRJbmZvIGxhc3RMYXlvdXQgPQorICAgICAgICAgICAgICAgICAgICAgICAgd2FpdEZvcklucHV0Vmlld0xheW91dFN0YWJsZShzdHJlYW0sIExBWU9VVF9TVEFCTEVfVEhSRVNIT0xEKTsKKyAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGxhc3RMYXlvdXQpOworCisgICAgICAgICAgICAgICAgZmluYWwgQml0bWFwIGJpdG1hcCA9IHVpQXV0b21hdGlvbi50YWtlU2NyZWVuc2hvdCgpOworICAgICAgICAgICAgICAgIHJldHVybiBCaXRtYXAuY3JlYXRlQml0bWFwKGJpdG1hcCwgMCwgYml0bWFwLmdldEhlaWdodCgpIC0gbmF2aWdhdGlvbkJhckhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpdG1hcC5nZXRXaWR0aCgpLCBuYXZpZ2F0aW9uQmFySGVpZ2h0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNldE5hdmlnYXRpb25CYXJDb2xvcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBOYXZpZ2F0aW9uQmFySW5mbyBpbmZvID0gTmF2aWdhdGlvbkJhckluZm8uZ2V0SW5zdGFuY2UoKTsKKworICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBXaW5kb3cjc2V0TmF2aWdhdGlvbkJhckNvbG9yKCkgd29ya3MgZm9yIElNRXMuCisgICAgICAgIGV4cGVjdE5hdmlnYXRpb25CYXJDb2xvclN1cHBvcnRlZChjb2xvciAtPgorICAgICAgICAgICAgICAgIGdldE5hdmlnYXRpb25CYXJCaXRtYXAoaW1lU2V0dGluZ0ZvclNvbGlkTmF2aWdhdGlvbkJhcihjb2xvciwgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3IuQkxBQ0ssIGZhbHNlLCBpbmZvLmdldEJvdHRvbU5hdmlnYXRpb25CZXJIZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERpbW1pbmdUZXN0TW9kZS5OT19ESU1NSU5HX0RJQUxPRykpOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IElNRSdzIG5hdmlnYXRpb24gYmFyIGNhbiBiZSB0cmFuc3BhcmVudAorICAgICAgICBleHBlY3ROYXZpZ2F0aW9uQmFyQ29sb3JTdXBwb3J0ZWQoY29sb3IgLT4KKyAgICAgICAgICAgICAgICBnZXROYXZpZ2F0aW9uQmFyQml0bWFwKGltZVNldHRpbmdGb3JTb2xpZE5hdmlnYXRpb25CYXIoQ29sb3IuVFJBTlNQQVJFTlQsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yLCBmYWxzZSwgaW5mby5nZXRCb3R0b21OYXZpZ2F0aW9uQmVySGVpZ2h0KCksCisgICAgICAgICAgICAgICAgICAgICAgICBEaW1taW5nVGVzdE1vZGUuTk9fRElNTUlOR19ESUFMT0cpKTsKKworICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBXaW5kb3cjc2V0TmF2aWdhdGlvbkJhckNvbG9yKCkgaXMgaWdub3JlZCB3aGVuCisgICAgICAgIC8vIEZMQUdfRFJBV1NfU1lTVEVNX0JBUl9CQUNLR1JPVU5EUyBpcyB1bnNldAorICAgICAgICBleHBlY3ROYXZpZ2F0aW9uQmFyQ29sb3JOb3RTdXBwb3J0ZWQoY29sb3IgLT4KKyAgICAgICAgICAgICAgICBnZXROYXZpZ2F0aW9uQmFyQml0bWFwKGltZVNldHRpbmdGb3JGbG9hdGluZ0ltZShjb2xvciwgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3IuQkxBQ0ssIGZhbHNlLCBpbmZvLmdldEJvdHRvbU5hdmlnYXRpb25CZXJIZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERpbW1pbmdUZXN0TW9kZS5OT19ESU1NSU5HX0RJQUxPRykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExpZ2h0TmF2aWdhdGlvbkJhcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBOYXZpZ2F0aW9uQmFySW5mbyBpbmZvID0gTmF2aWdhdGlvbkJhckluZm8uZ2V0SW5zdGFuY2UoKTsKKworICAgICAgICBhc3N1bWVUcnVlKCJUaGlzIHRlc3QgZG9lcyBub3QgbWFrZSBzZW5zZSBpZiBsaWdodCBuYXZpZ2F0aW9uIGJhciBpcyBub3Qgc3VwcG9ydGVkIgorICAgICAgICAgICAgICAgICsgIiBldmVuIGZvciB0eXBpY2FsIEFjdGl2aXR5IiwgaW5mby5zdXBwb3J0c0xpZ2h0TmF2aWdhdGlvbkJhcigpKTsKKworICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBTWVNURU1fVUlfRkxBR19MSUdIVF9OQVZJR0FUSU9OX0JBUiB3b3JrcyBmb3IgSU1FcyAoQnVnIDY5MDAyNDY3KS4KKyAgICAgICAgZXhwZWN0TGlnaHROYXZpZ2F0aW9uQmFyU3VwcG9ydGVkKChjb2xvciwgbGlnaHRNb2RlKSAtPgorICAgICAgICAgICAgICAgIGdldE5hdmlnYXRpb25CYXJCaXRtYXAoaW1lU2V0dGluZ0ZvclNvbGlkTmF2aWdhdGlvbkJhcihjb2xvciwgbGlnaHRNb2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yLkJMQUNLLCBmYWxzZSwgaW5mby5nZXRCb3R0b21OYXZpZ2F0aW9uQmVySGVpZ2h0KCksCisgICAgICAgICAgICAgICAgICAgICAgICBEaW1taW5nVGVzdE1vZGUuTk9fRElNTUlOR19ESUFMT0cpKTsKKworICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBJTUVzIGNhbiBvcHQtb3V0IG5hdmlnYXRpb24gYmFyIGN1c3RvbSByZW5kZXJpbmcsIGluY2x1ZGluZworICAgICAgICAvLyBTWVNURU1fVUlfRkxBR19MSUdIVF9OQVZJR0FUSU9OX0JBUiwgYnkgdW4tc2V0dGluZyBGTEFHX0RSQVdTX1NZU1RFTV9CQVJfQkFDS0dST1VORFMgZmxhZworICAgICAgICAvLyBzbyB0aGF0IGl0IGNhbiBiZSBjb250cm9sbGVkIGJ5IHRoZSB0YXJnZXQgYXBwbGljYXRpb24gaW5zdGVhZCAoQnVnIDY5MTExMjA4KS4KKyAgICAgICAgZXhwZWN0TGlnaHROYXZpZ2F0aW9uQmFyU3VwcG9ydGVkKChjb2xvciwgbGlnaHRNb2RlKSAtPgorICAgICAgICAgICAgICAgIGdldE5hdmlnYXRpb25CYXJCaXRtYXAoaW1lU2V0dGluZ0ZvckZsb2F0aW5nSW1lKENvbG9yLkJMQUNLLCBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciwgbGlnaHRNb2RlLCBpbmZvLmdldEJvdHRvbU5hdmlnYXRpb25CZXJIZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERpbW1pbmdUZXN0TW9kZS5OT19ESU1NSU5HX0RJQUxPRykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERpbW1pbmdXaW5kb3coKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgTmF2aWdhdGlvbkJhckluZm8gaW5mbyA9IE5hdmlnYXRpb25CYXJJbmZvLmdldEluc3RhbmNlKCk7CisKKyAgICAgICAgYXNzdW1lVHJ1ZSgiVGhpcyB0ZXN0IGRvZXMgbm90IG1ha2Ugc2Vuc2UgaWYgZGltbWluZyB3aW5kb3dzIGRvIG5vdCBhZmZlY3QgbGlnaHQgIgorICAgICAgICAgICAgICAgICsgIiBsaWdodCBuYXZpZ2F0aW9uIGJhciBmb3IgdHlwaWNhbCBBY3Rpdml0aWVzIiwKKyAgICAgICAgICAgICAgICBpbmZvLnN1cHBvcnRzRGltbWluZ1dpbmRvd0xpZ2h0TmF2aWdhdGlvbkJhck92ZXJyaWRlKCkpOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IFNZU1RFTV9VSV9GTEFHX0xJR0hUX05BVklHQVRJT05fQkFSIHdvcmtzIGZvciBJTUVzLCBldmVuIGlmIGEgZGltbWluZworICAgICAgICAvLyB3aW5kb3cgaXMgc2hvd24gYmVoaW5kIHRoZSBJTUUgd2luZG93LgorICAgICAgICBleHBlY3RMaWdodE5hdmlnYXRpb25CYXJTdXBwb3J0ZWQoKGNvbG9yLCBsaWdodE1vZGUpIC0+CisgICAgICAgICAgICAgICAgZ2V0TmF2aWdhdGlvbkJhckJpdG1hcChpbWVTZXR0aW5nRm9yU29saWROYXZpZ2F0aW9uQmFyKGNvbG9yLCBsaWdodE1vZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3IuQkxBQ0ssIGZhbHNlLCBpbmZvLmdldEJvdHRvbU5hdmlnYXRpb25CZXJIZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERpbW1pbmdUZXN0TW9kZS5ESU1NSU5HX0RJQUxPR19CRUhJTkRfSU1FKSk7CisKKyAgICAgICAgLy8gSWYgYSBkaW1taW5nIHdpbmRvdyBpcyBzaG93biBhYm92ZSB0aGUgSU1FIHdpbmRvdywgSU1FIHdpbmRvdydzCisgICAgICAgIC8vIFNZU1RFTV9VSV9GTEFHX0xJR0hUX05BVklHQVRJT05fQkFSIHNob3VsZCBiZSBjYW5jZWxlZC4KKyAgICAgICAgZXhwZWN0TGlnaHROYXZpZ2F0aW9uQmFyTm90U3VwcG9ydGVkKChjb2xvciwgbGlnaHRNb2RlKSAtPgorICAgICAgICAgICAgICAgIGdldE5hdmlnYXRpb25CYXJCaXRtYXAoaW1lU2V0dGluZ0ZvclNvbGlkTmF2aWdhdGlvbkJhcihjb2xvciwgbGlnaHRNb2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yLkJMQUNLLCBmYWxzZSwgaW5mby5nZXRCb3R0b21OYXZpZ2F0aW9uQmVySGVpZ2h0KCksCisgICAgICAgICAgICAgICAgICAgICAgICBEaW1taW5nVGVzdE1vZGUuRElNTUlOR19ESUFMT0dfQUJPVkVfSU1FKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW5wdXRtZXRob2Qvc3JjL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9jdHMvT25TY3JlZW5Qb3NpdGlvblRlc3QuamF2YSBiL3Rlc3RzL2lucHV0bWV0aG9kL3NyYy9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvY3RzL09uU2NyZWVuUG9zaXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc2YTBjNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2lucHV0bWV0aG9kL3NyYy9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvY3RzL09uU2NyZWVuUG9zaXRpb25UZXN0LmphdmEKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5jdHM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY3RzLm1vY2tpbWUuSW1lRXZlbnRTdHJlYW1UZXN0VXRpbHMuZXhwZWN0QmluZElucHV0OworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jdHMubW9ja2ltZS5JbWVFdmVudFN0cmVhbVRlc3RVdGlscy5leHBlY3RFdmVudDsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY3RzLm1vY2tpbWUuSW1lRXZlbnRTdHJlYW1UZXN0VXRpbHMud2FpdEZvcklucHV0Vmlld0xheW91dFN0YWJsZTsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CitpbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CitpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLkVkaXRvckluZm87CitpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLmN0cy51dGlsLkVuZFRvRW5kSW1lVGVzdEJhc2U7CitpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLmN0cy51dGlsLlRlc3RBY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5FZGl0VGV4dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkN0c1RvdWNoVXRpbHM7CitpbXBvcnQgY29tLmFuZHJvaWQuY3RzLm1vY2tpbWUuSW1lRXZlbnRTdHJlYW07CitpbXBvcnQgY29tLmFuZHJvaWQuY3RzLm1vY2tpbWUuSW1lTGF5b3V0SW5mbzsKK2ltcG9ydCBjb20uYW5kcm9pZC5jdHMubW9ja2ltZS5JbWVTZXR0aW5nczsKK2ltcG9ydCBjb20uYW5kcm9pZC5jdHMubW9ja2ltZS5Nb2NrSW1lU2Vzc2lvbjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2U7CisKK0BNZWRpdW1UZXN0CitAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIE9uU2NyZWVuUG9zaXRpb25UZXN0IGV4dGVuZHMgRW5kVG9FbmRJbWVUZXN0QmFzZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBUSU1FT1VUID0gVGltZVVuaXQuU0VDT05EUy50b01pbGxpcyg1KTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIExBWU9VVF9TVEFCTEVfVEhSRVNIT0xEID0gVGltZVVuaXQuU0VDT05EUy50b01pbGxpcygzKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX01BUktFUiA9ICJhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuY3RzLk9uU2NyZWVuUG9zaXRpb25UZXN0IjsKKworICAgIHB1YmxpYyBFZGl0VGV4dCBsYXVuY2hUZXN0QWN0aXZpdHkoKSB7CisgICAgICAgIGZpbmFsIEF0b21pY1JlZmVyZW5jZTxFZGl0VGV4dD4gZWRpdFRleHRSZWYgPSBuZXcgQXRvbWljUmVmZXJlbmNlPD4oKTsKKyAgICAgICAgVGVzdEFjdGl2aXR5LnN0YXJ0U3luYyhhY3Rpdml0eSAtPiB7CisgICAgICAgICAgICBmaW5hbCBMaW5lYXJMYXlvdXQgbGF5b3V0ID0gbmV3IExpbmVhckxheW91dChhY3Rpdml0eSk7CisgICAgICAgICAgICBsYXlvdXQuc2V0T3JpZW50YXRpb24oTGluZWFyTGF5b3V0LlZFUlRJQ0FMKTsKKworICAgICAgICAgICAgZmluYWwgRWRpdFRleHQgZWRpdFRleHQgPSBuZXcgRWRpdFRleHQoYWN0aXZpdHkpOworICAgICAgICAgICAgZWRpdFRleHQuc2V0UHJpdmF0ZUltZU9wdGlvbnMoVEVTVF9NQVJLRVIpOworICAgICAgICAgICAgZWRpdFRleHQuc2V0SGludCgiZWRpdFRleHQiKTsKKyAgICAgICAgICAgIGVkaXRUZXh0LnJlcXVlc3RGb2N1cygpOworICAgICAgICAgICAgZWRpdFRleHRSZWYuc2V0KGVkaXRUZXh0KTsKKworICAgICAgICAgICAgbGF5b3V0LmFkZFZpZXcoZWRpdFRleHQpOworICAgICAgICAgICAgcmV0dXJuIGxheW91dDsKKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBlZGl0VGV4dFJlZi5nZXQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVhQRUNURURfS0VZQk9BUkRfSEVJR0hUID0gMTAwOworCisgICAgLyoqCisgICAgICogUmVncmVzc2lvbiB0ZXN0IGZvciBCdWcgMzMzMDgwNjUuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW1lSXNOb3RCZWhpbmROYXZCYXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IChNb2NrSW1lU2Vzc2lvbiBpbWVTZXNzaW9uID0gTW9ja0ltZVNlc3Npb24uY3JlYXRlKAorICAgICAgICAgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKS5nZXRVaUF1dG9tYXRpb24oKSwKKyAgICAgICAgICAgICAgICBuZXcgSW1lU2V0dGluZ3MuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0SW5wdXRWaWV3SGVpZ2h0V2l0aG91dFN5c3RlbVdpbmRvd0luc2V0KEVYUEVDVEVEX0tFWUJPQVJEX0hFSUdIVCkpKSB7CisgICAgICAgICAgICBmaW5hbCBJbWVFdmVudFN0cmVhbSBzdHJlYW0gPSBpbWVTZXNzaW9uLm9wZW5FdmVudFN0cmVhbSgpOworCisgICAgICAgICAgICBmaW5hbCBFZGl0VGV4dCBlZGl0VGV4dCA9IGxhdW5jaFRlc3RBY3Rpdml0eSgpOworCisgICAgICAgICAgICAvLyBXYWl0IHVudGlsIHRoZSBNb2NrSW1lIGdldHMgYm91bmQgdG8gdGhlIFRlc3RBY3Rpdml0eS4KKyAgICAgICAgICAgIGV4cGVjdEJpbmRJbnB1dChzdHJlYW0sIFByb2Nlc3MubXlQaWQoKSwgVElNRU9VVCk7CisKKyAgICAgICAgICAgIC8vIEVtdWxhdGUgdGFwIGV2ZW50CisgICAgICAgICAgICBDdHNUb3VjaFV0aWxzLmVtdWxhdGVUYXBPblZpZXdDZW50ZXIoCisgICAgICAgICAgICAgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLCBlZGl0VGV4dCk7CisKKyAgICAgICAgICAgIC8vIFdhaXQgdW50aWwgIm9uU3RhcnRJbnB1dCIgZ2V0cyBjYWxsZWQgZm9yIHRoZSBFZGl0VGV4dC4KKyAgICAgICAgICAgIGV4cGVjdEV2ZW50KHN0cmVhbSwgZXZlbnQgLT4geworICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmVxdWFscygib25TdGFydElucHV0VmlldyIsIGV2ZW50LmdldEV2ZW50TmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbmFsIEVkaXRvckluZm8gZWRpdG9ySW5mbyA9IGV2ZW50LmdldEFyZ3VtZW50cygpLmdldFBhcmNlbGFibGUoImVkaXRvckluZm8iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGV4dFV0aWxzLmVxdWFscyhURVNUX01BUktFUiwgZWRpdG9ySW5mby5wcml2YXRlSW1lT3B0aW9ucyk7CisgICAgICAgICAgICB9LCBUSU1FT1VUKTsKKworICAgICAgICAgICAgLy8gV2FpdCB1bnRpbCBNb2NrSW1lJ3MgbGF5b3V0IGJlY29tZXMgc3RhYmxlLgorICAgICAgICAgICAgZmluYWwgSW1lTGF5b3V0SW5mbyBsYXN0TGF5b3V0ID0KKyAgICAgICAgICAgICAgICAgICAgd2FpdEZvcklucHV0Vmlld0xheW91dFN0YWJsZShzdHJlYW0sIExBWU9VVF9TVEFCTEVfVEhSRVNIT0xEKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwobGFzdExheW91dCk7CisKKyAgICAgICAgICAgIC8vIFdlIGNvbnNpZGVyIHRoYXQgdGhlIHNjcmVlblJlY3RXaXRob3V0TmF2QmFyIGlzIGEgdW5pb24gb2YgdGhvc2UgdHdvIHJlY3RzLgorICAgICAgICAgICAgLy8gU2VlIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyBmb3IgZGV0YWlscy4KKyAgICAgICAgICAgIC8vICAtIERlY29yVmlldyNnZXRDb2xvclZpZXdUb3BJbnNldChpbnQsIGludCkKKyAgICAgICAgICAgIC8vICAtIERlY29yVmlldyNnZXRDb2xvclZpZXdCb3R0b21JbnNldChpbnQsIGludCkKKyAgICAgICAgICAgIC8vICAtIERlY29yVmlldyNnZXRDb2xvclZpZXdSaWdodEluc2V0KGludCwgaW50KQorICAgICAgICAgICAgLy8gIC0gRGVjb3JWaWV3I2dldENvbG9yVmlld0xlZnRJbnNldChpbnQsIGludCkKKyAgICAgICAgICAgIGZpbmFsIFJlY3Qgc2NyZWVuUmVjdFdpdGhvdXROYXZCYXIgPSBsYXN0TGF5b3V0LmdldFNjcmVlblJlY3RXaXRob3V0U3RhYmxlSW5zZXQoKTsKKyAgICAgICAgICAgIHNjcmVlblJlY3RXaXRob3V0TmF2QmFyLnVuaW9uKGxhc3RMYXlvdXQuZ2V0U2NyZWVuUmVjdFdpdGhvdXRTeXN0ZW1XaW5kb3dJbnNldCgpKTsKKworICAgICAgICAgICAgZmluYWwgUmVjdCBrZXlib2FyZFZpZXdCb3VuZHMgPSBsYXN0TGF5b3V0LmdldElucHV0Vmlld0JvdW5kc0luU2NyZWVuKCk7CisgICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCB0aGUgYWJvdmUgcmVnaW9uIG11c3QgY29udGFpbiB0aGUga2V5Ym9hcmQgdmlldyByZWdpb24uCisgICAgICAgICAgICBhc3NlcnRUcnVlKCJzY3JlZW5SZWN0V2l0aG91dE5hdkJhcigiICsgc2NyZWVuUmVjdFdpdGhvdXROYXZCYXIgKyAiKSBtdXN0IgorICAgICAgICAgICAgICAgICAgICArICIgY29udGFpbiBrZXlib2FyZFZpZXdCb3VuZHMoIiArIGtleWJvYXJkVmlld0JvdW5kcyArICIpIiwKKyAgICAgICAgICAgICAgICAgICAgc2NyZWVuUmVjdFdpdGhvdXROYXZCYXIuY29udGFpbnMoa2V5Ym9hcmRWaWV3Qm91bmRzKSk7CisKKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBrZXlib2FyZCBoZWlnaHQgaXMgZXhwZWN0ZWQuICBIZXJlIHdlIGFzc3VtZSB0aGF0IHRoZSBleHBlY3RlZAorICAgICAgICAgICAgLy8gaGVpZ2h0IGlzIHNtYWxsIGVub3VnaCBmb3IgYWxsIHRoZSBBbmRyb2lkLWJhc2VkIGRldmljZXMgdG8gc2hvdy4KKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhFWFBFQ1RFRF9LRVlCT0FSRF9IRUlHSFQsCisgICAgICAgICAgICAgICAgICAgIGxhc3RMYXlvdXQuZ2V0SW5wdXRWaWV3Qm91bmRzSW5TY3JlZW4oKS5oZWlnaHQoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnB1dG1ldGhvZC9zcmMvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL2N0cy9TZWFyY2hWaWV3VGVzdC5qYXZhIGIvdGVzdHMvaW5wdXRtZXRob2Qvc3JjL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9jdHMvU2VhcmNoVmlld1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjBjZTIxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW5wdXRtZXRob2Qvc3JjL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9jdHMvU2VhcmNoVmlld1Rlc3QuamF2YQpAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLmN0czsKKworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jdHMubW9ja2ltZS5JbWVFdmVudFN0cmVhbVRlc3RVdGlscy5FdmVudEZpbHRlck1vZGUuQ0hFQ0tfRVhJVF9FVkVOVF9PTkxZOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jdHMubW9ja2ltZS5JbWVFdmVudFN0cmVhbVRlc3RVdGlscy5leHBlY3RCaW5kSW5wdXQ7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmN0cy5tb2NraW1lLkltZUV2ZW50U3RyZWFtVGVzdFV0aWxzLmV4cGVjdEV2ZW50OworCitpbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOworaW1wb3J0IGFuZHJvaWQudGV4dC5JbnB1dFR5cGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLkVkaXRvckluZm87CitpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLmN0cy51dGlsLkVuZFRvRW5kSW1lVGVzdEJhc2U7CitpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLmN0cy51dGlsLlRlc3RBY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5FZGl0VGV4dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU2VhcmNoVmlldzsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ3RzVG91Y2hVdGlsczsKK2ltcG9ydCBjb20uYW5kcm9pZC5jdHMubW9ja2ltZS5JbWVFdmVudFN0cmVhbTsKK2ltcG9ydCBjb20uYW5kcm9pZC5jdHMubW9ja2ltZS5JbWVTZXR0aW5nczsKK2ltcG9ydCBjb20uYW5kcm9pZC5jdHMubW9ja2ltZS5Nb2NrSW1lU2Vzc2lvbjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2U7CisKK0BNZWRpdW1UZXN0CitAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIFNlYXJjaFZpZXdUZXN0IGV4dGVuZHMgRW5kVG9FbmRJbWVUZXN0QmFzZSB7CisgICAgc3RhdGljIGZpbmFsIGxvbmcgVElNRU9VVCA9IFRpbWVVbml0LlNFQ09ORFMudG9NaWxsaXMoNSk7CisKKyAgICBwdWJsaWMgU2VhcmNoVmlldyBsYXVuY2hUZXN0QWN0aXZpdHkoKSB7CisgICAgICAgIGZpbmFsIEF0b21pY1JlZmVyZW5jZTxTZWFyY2hWaWV3PiBzZWFyY2hWaWV3UmVmID0gbmV3IEF0b21pY1JlZmVyZW5jZTw+KCk7CisgICAgICAgIFRlc3RBY3Rpdml0eS5zdGFydFN5bmMoYWN0aXZpdHkgLT4geworICAgICAgICAgICAgZmluYWwgTGluZWFyTGF5b3V0IGxheW91dCA9IG5ldyBMaW5lYXJMYXlvdXQoYWN0aXZpdHkpOworICAgICAgICAgICAgbGF5b3V0LnNldE9yaWVudGF0aW9uKExpbmVhckxheW91dC5WRVJUSUNBTCk7CisKKyAgICAgICAgICAgIGZpbmFsIEVkaXRUZXh0IGluaXRpYWxGb2N1c2VkRWRpdFRleHQgPSBuZXcgRWRpdFRleHQoYWN0aXZpdHkpOworICAgICAgICAgICAgaW5pdGlhbEZvY3VzZWRFZGl0VGV4dC5zZXRIaW50KCJpbml0aWFsRm9jdXNlZFRleHRWaWV3Iik7CisKKyAgICAgICAgICAgIGZpbmFsIFNlYXJjaFZpZXcgc2VhcmNoVmlldyA9IG5ldyBTZWFyY2hWaWV3KGFjdGl2aXR5KTsKKyAgICAgICAgICAgIHNlYXJjaFZpZXdSZWYuc2V0KHNlYXJjaFZpZXcpOworCisgICAgICAgICAgICBzZWFyY2hWaWV3LnNldFF1ZXJ5SGludCgiaGludCIpOworICAgICAgICAgICAgc2VhcmNoVmlldy5zZXRJY29uaWZpZWRCeURlZmF1bHQoZmFsc2UpOworICAgICAgICAgICAgc2VhcmNoVmlldy5zZXRJbnB1dFR5cGUoSW5wdXRUeXBlLlRZUEVfVEVYVF9GTEFHX0NBUF9TRU5URU5DRVMpOworICAgICAgICAgICAgc2VhcmNoVmlldy5zZXRJbWVPcHRpb25zKEVkaXRvckluZm8uSU1FX0FDVElPTl9ET05FKTsKKworICAgICAgICAgICAgbGF5b3V0LmFkZFZpZXcoaW5pdGlhbEZvY3VzZWRFZGl0VGV4dCk7CisgICAgICAgICAgICBsYXlvdXQuYWRkVmlldyhzZWFyY2hWaWV3KTsKKyAgICAgICAgICAgIHJldHVybiBsYXlvdXQ7CisgICAgICAgIH0pOworICAgICAgICByZXR1cm4gc2VhcmNoVmlld1JlZi5nZXQoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUYXBUaGVuU2V0UXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IChNb2NrSW1lU2Vzc2lvbiBpbWVTZXNzaW9uID0gTW9ja0ltZVNlc3Npb24uY3JlYXRlKAorICAgICAgICAgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKS5nZXRVaUF1dG9tYXRpb24oKSwKKyAgICAgICAgICAgICAgICBuZXcgSW1lU2V0dGluZ3MuQnVpbGRlcigpKSkgeworICAgICAgICAgICAgZmluYWwgSW1lRXZlbnRTdHJlYW0gc3RyZWFtID0gaW1lU2Vzc2lvbi5vcGVuRXZlbnRTdHJlYW0oKTsKKworICAgICAgICAgICAgZmluYWwgU2VhcmNoVmlldyBzZWFyY2hWaWV3ID0gbGF1bmNoVGVzdEFjdGl2aXR5KCk7CisKKyAgICAgICAgICAgIC8vIEVtdWxhdGUgdGFwIGV2ZW50IG9uIFNlYXJjaFZpZXcKKyAgICAgICAgICAgIEN0c1RvdWNoVXRpbHMuZW11bGF0ZVRhcE9uVmlld0NlbnRlcigKKyAgICAgICAgICAgICAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCksIHNlYXJjaFZpZXcpOworCisgICAgICAgICAgICAvLyBFeHBlY3QgaW5wdXQgdG8gYmluZCBzaW5jZSBFZGl0VGV4dCBpcyBmb2N1c2VkLgorICAgICAgICAgICAgZXhwZWN0QmluZElucHV0KHN0cmVhbSwgUHJvY2Vzcy5teVBpZCgpLCBUSU1FT1VUKTsKKworICAgICAgICAgICAgLy8gV2FpdCB1bnRpbCAic2hvd1NvZnRJbnB1dCIgZ2V0cyBjYWxsZWQgd2l0aCBhIHJlYWwgSW5wdXRDb25uZWN0aW9uCisgICAgICAgICAgICBleHBlY3RFdmVudChzdHJlYW0sIGV2ZW50IC0+CisgICAgICAgICAgICAgICAgICAgICJzaG93U29mdElucHV0Ii5lcXVhbHMoZXZlbnQuZ2V0RXZlbnROYW1lKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIWV2ZW50LmdldEV4aXRTdGF0ZSgpLmhhc0R1bW15SW5wdXRDb25uZWN0aW9uKCksCisgICAgICAgICAgICAgICAgICAgIENIRUNLX0VYSVRfRVZFTlRfT05MWSwgVElNRU9VVCk7CisKKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0ICJzZXRRdWVyeSIgdHJpZ2dlcnMgImhpZGVTb2Z0SW5wdXQiIGluIHRoZSBJTUUgc2lkZS4KKyAgICAgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLnJ1bk9uTWFpblN5bmMoCisgICAgICAgICAgICAgICAgICAgICgpIC0+IHNlYXJjaFZpZXcuc2V0UXVlcnkoInRlc3QiLCB0cnVlIC8qIHN1Ym1pdCAqLykpOworICAgICAgICAgICAgZXhwZWN0RXZlbnQoc3RyZWFtLCBldmVudCAtPiAiaGlkZVNvZnRJbnB1dCIuZXF1YWxzKGV2ZW50LmdldEV2ZW50TmFtZSgpKSwgVElNRU9VVCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnB1dG1ldGhvZC9zcmMvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL2N0cy91dGlsL0VuZFRvRW5kSW1lVGVzdEJhc2UuamF2YSBiL3Rlc3RzL2lucHV0bWV0aG9kL3NyYy9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvY3RzL3V0aWwvRW5kVG9FbmRJbWVUZXN0QmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmZmI4MTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnB1dG1ldGhvZC9zcmMvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL2N0cy91dGlsL0VuZFRvRW5kSW1lVGVzdEJhc2UuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuY3RzLnV0aWw7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc3VtZS5hc3N1bWVUcnVlOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKKworcHVibGljIGNsYXNzIEVuZFRvRW5kSW1lVGVzdEJhc2UgeworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzaG93U3RhdGVJbml0aWFsaXplQWN0aXZpdHkoKSB7CisgICAgICAgIC8vIFRPRE8oYi8zNzUwMjA2Nik6IE1vdmUgdGhpcyBiYWNrIHRvIEBCZWZvcmVDbGFzcyBvbmNlIGIvMzc1MDIwNjYgaXMgZml4ZWQuCisgICAgICAgIGFzc3VtZVRydWUoIk1vY2tJbWUgY2Fubm90IGJlIHVzZWQgZm9yIGRldmljZXMgdGhhdCBkbyBub3Qgc3VwcG9ydCBpbnN0YWxsYWJsZSBJTUVzIiwKKyAgICAgICAgICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCkuZ2V0UGFja2FnZU1hbmFnZXIoKS5oYXNTeXN0ZW1GZWF0dXJlKAorICAgICAgICAgICAgICAgICAgICAgICAgUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9JTlBVVF9NRVRIT0RTKSk7CisKKyAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoKQorICAgICAgICAgICAgICAgIC5zZXRBY3Rpb24oSW50ZW50LkFDVElPTl9NQUlOKQorICAgICAgICAgICAgICAgIC5zZXRDbGFzcyhJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRUYXJnZXRDb250ZXh0KCksIFN0YXRlSW5pdGlhbGl6ZUFjdGl2aXR5LmNsYXNzKQorICAgICAgICAgICAgICAgIC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSykKKyAgICAgICAgICAgICAgICAuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTk9fQU5JTUFUSU9OKQorICAgICAgICAgICAgICAgIC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9DTEVBUl9UQVNLKTsKKyAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkuc3RhcnRBY3Rpdml0eVN5bmMoaW50ZW50KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnB1dG1ldGhvZC9zcmMvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL2N0cy91dGlsL0lXaW5kb3dGb2N1c1N0ZWFsZXIuYWlkbCBiL3Rlc3RzL2lucHV0bWV0aG9kL3NyYy9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvY3RzL3V0aWwvSVdpbmRvd0ZvY3VzU3RlYWxlci5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2MWY5NzdmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW5wdXRtZXRob2Qvc3JjL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9jdHMvdXRpbC9JV2luZG93Rm9jdXNTdGVhbGVyLmFpZGwKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLmN0cy51dGlsOworCitpbXBvcnQgYW5kcm9pZC5vcy5SZXN1bHRSZWNlaXZlcjsKKworaW50ZXJmYWNlIElXaW5kb3dGb2N1c1N0ZWFsZXIgeworICAgIHZvaWQgc3RlYWxXaW5kb3dGb2N1cyhpbiBJQmluZGVyIHBhcmVudEFwcFdpbmRvd1Rva2VuLCBpbiBSZXN1bHRSZWNlaXZlciByZXN1bHRSZWNlaXZlcik7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnB1dG1ldGhvZC9zcmMvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL2N0cy91dGlsL0ltZUF3YXJlRWRpdFRleHQuamF2YSBiL3Rlc3RzL2lucHV0bWV0aG9kL3NyYy9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvY3RzL3V0aWwvSW1lQXdhcmVFZGl0VGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0OGU3NTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnB1dG1ldGhvZC9zcmMvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL2N0cy91dGlsL0ltZUF3YXJlRWRpdFRleHQuamF2YQpAQCAtMCwwICsxLDkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuY3RzLnV0aWw7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5FZGl0b3JJbmZvOworaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dENvbm5lY3Rpb247CitpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0TWV0aG9kTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5FZGl0VGV4dDsKKworcHVibGljIGNsYXNzIEltZUF3YXJlRWRpdFRleHQgZXh0ZW5kcyBFZGl0VGV4dCB7CisgICAgcHJpdmF0ZSBib29sZWFuIG1IYXNQZW5kaW5nU2hvd1NvZnRJbnB1dFJlcXVlc3Q7CisgICAgZmluYWwgUnVubmFibGUgbVJ1blNob3dTb2Z0SW5wdXRJZk5lY2Vzc2FyeSA9ICgpIC0+IHNob3dTb2Z0SW5wdXRJZk5lY2Vzc2FyeSgpOworCisgICAgcHVibGljIEltZUF3YXJlRWRpdFRleHQoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBJbWVBd2FyZUVkaXRUZXh0KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSW1lQXdhcmVFZGl0VGV4dChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0cikgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGVBdHRyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSW1lQXdhcmVFZGl0VGV4dChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwKKyAgICAgICAgICAgIGludCBkZWZTdHlsZVJlcykgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGVBdHRyLCBkZWZTdHlsZVJlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJhY2sgYnkgdGhlIHN5c3RlbSB3aGVuIHRoZSBzeXN0ZW0gaXMgYWJvdXQgdG8gZXN0YWJsaXNoIGEgY29ubmVjdGlvbgorICAgICAqIHRvIHRoZSBjdXJyZW50IGlucHV0IG1ldGhvZC4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgaXMgYSBnb29kIGFuZCByZWxpYWJsZSBzaWduYWwgdG8gc2NoZWR1bGUgYSBwZW5kaW5nIHRhc2sgdG8gY2FsbAorICAgICAqIHtAbGluayBJbnB1dE1ldGhvZE1hbmFnZXIjc2hvd1NvZnRJbnB1dChWaWV3LCBpbnQpfS48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gZWRpdG9ySW5mbyBjb250ZXh0IGFib3V0IHRoZSB0ZXh0IGlucHV0IGZpZWxkLgorICAgICAqIEByZXR1cm4ge0BsaW5rIElucHV0Q29ubmVjdGlvbn0gdG8gYmUgcGFzc2VkIHRvIHRoZSBpbnB1dCBtZXRob2QuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElucHV0Q29ubmVjdGlvbiBvbkNyZWF0ZUlucHV0Q29ubmVjdGlvbihFZGl0b3JJbmZvIGVkaXRvckluZm8pIHsKKyAgICAgICAgZmluYWwgSW5wdXRDb25uZWN0aW9uIGljID0gc3VwZXIub25DcmVhdGVJbnB1dENvbm5lY3Rpb24oZWRpdG9ySW5mbyk7CisgICAgICAgIGlmIChtSGFzUGVuZGluZ1Nob3dTb2Z0SW5wdXRSZXF1ZXN0KSB7CisgICAgICAgICAgICByZW1vdmVDYWxsYmFja3MobVJ1blNob3dTb2Z0SW5wdXRJZk5lY2Vzc2FyeSk7CisgICAgICAgICAgICBwb3N0KG1SdW5TaG93U29mdElucHV0SWZOZWNlc3NhcnkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBpYzsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2hvd1NvZnRJbnB1dElmTmVjZXNzYXJ5KCkgeworICAgICAgICBpZiAobUhhc1BlbmRpbmdTaG93U29mdElucHV0UmVxdWVzdCkgeworICAgICAgICAgICAgZmluYWwgSW5wdXRNZXRob2RNYW5hZ2VyIGltbSA9CisgICAgICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5nZXRTeXN0ZW1TZXJ2aWNlKElucHV0TWV0aG9kTWFuYWdlci5jbGFzcyk7CisgICAgICAgICAgICBpbW0uc2hvd1NvZnRJbnB1dCh0aGlzLCAwKTsKKyAgICAgICAgICAgIG1IYXNQZW5kaW5nU2hvd1NvZnRJbnB1dFJlcXVlc3QgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNjaGVkdWxlU2hvd1NvZnRJbnB1dCgpIHsKKyAgICAgICAgZmluYWwgSW5wdXRNZXRob2RNYW5hZ2VyIGltbSA9IGdldENvbnRleHQoKS5nZXRTeXN0ZW1TZXJ2aWNlKElucHV0TWV0aG9kTWFuYWdlci5jbGFzcyk7CisgICAgICAgIGlmIChpbW0uaXNBY3RpdmUodGhpcykpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgbWVhbnMgdGhhdCBJbWVBd2FyZUVkaXRUZXh0IGlzIGFscmVhZHkgY29ubmVjdGVkIHRvIHRoZSBJTUUuCisgICAgICAgICAgICAvLyBJbnB1dE1ldGhvZE1hbmFnZXIjc2hvd1NvZnRJbnB1dCgpIGlzIGd1YXJhbnRlZWQgdG8gcGFzcyBjbGllbnQtc2lkZSBmb2N1cyBjaGVjay4KKyAgICAgICAgICAgIG1IYXNQZW5kaW5nU2hvd1NvZnRJbnB1dFJlcXVlc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIHJlbW92ZUNhbGxiYWNrcyhtUnVuU2hvd1NvZnRJbnB1dElmTmVjZXNzYXJ5KTsKKyAgICAgICAgICAgIGltbS5zaG93U29mdElucHV0KHRoaXMsIDApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gT3RoZXJ3aXNlLCBJbnB1dE1ldGhvZE1hbmFnZXIjc2hvd1NvZnRJbnB1dCgpIHNob3VsZCBiZSBkZWZlcnJlZCBhZnRlcgorICAgICAgICAvLyBvbkNyZWF0ZUlucHV0Q29ubmVjdGlvbigpLgorICAgICAgICBtSGFzUGVuZGluZ1Nob3dTb2Z0SW5wdXRSZXF1ZXN0ID0gdHJ1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnB1dG1ldGhvZC9zcmMvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL2N0cy91dGlsL0lucHV0Q29ubmVjdGlvblRlc3RVdGlscy5qYXZhIGIvdGVzdHMvaW5wdXRtZXRob2Qvc3JjL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9jdHMvdXRpbC9JbnB1dENvbm5lY3Rpb25UZXN0VXRpbHMuamF2YQppbmRleCAzNzM1YzMzLi5mYTZmYTllIDEwMDY0NAotLS0gYS90ZXN0cy9pbnB1dG1ldGhvZC9zcmMvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL2N0cy91dGlsL0lucHV0Q29ubmVjdGlvblRlc3RVdGlscy5qYXZhCisrKyBiL3Rlc3RzL2lucHV0bWV0aG9kL3NyYy9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvY3RzL3V0aWwvSW5wdXRDb25uZWN0aW9uVGVzdFV0aWxzLmphdmEKQEAgLTIxLDYgKzIxLDggQEAKIAogcHVibGljIGZpbmFsIGNsYXNzIElucHV0Q29ubmVjdGlvblRlc3RVdGlscyB7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVTFGNDI3ID0gIlx1RDgzRFx1REMyNyI7CisKICAgICAvKioKICAgICAgKiBBIHV0aWxpdHkgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgdGVzdCBzdHJpbmcgZm9yIGlucHV0IG1ldGhvZCBBUElzLiAgVGhlcmUgYXJlIHNldmVyYWwKICAgICAgKiBwcmUtZGVmaW5lZCBtZXRhIGNoYXJhY3RlcnMgdGhhdCBhcmUgdXNlZnVsIGZvciB1bml0IHRlc3RzLgpAQCAtNDEsNyArNDMsNiBAQAogICAgICAqIEByZXR1cm4gQSB7QGxpbmsgQ2hhclNlcXVlbmNlfSBvYmplY3Qgd2l0aCB0ZXh0IHNlbGVjdGlvbiBzcGVjaWZpZWQgYnkgdGhlIG1ldGEgY2hhcmFjdGVycy4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIENoYXJTZXF1ZW5jZSBmb3JtYXRTdHJpbmcoZmluYWwgU3RyaW5nIGZvcm1hdFN0cmluZykgewotICAgICAgICBmaW5hbCBTdHJpbmcgVTFGNDI3ID0gIlx1RDgzRFx1REMyNyI7CiAgICAgICAgIGZpbmFsIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKCk7CiAgICAgICAgIGludCBzZWxlY3Rpb25TdGFydCA9IC0xOwogICAgICAgICBpbnQgc2VsZWN0aW9uRW5kID0gLTE7CmRpZmYgLS1naXQgYS90ZXN0cy9pbnB1dG1ldGhvZC9zcmMvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL2N0cy91dGlsL0xpZ2h0TmF2aWdhdGlvbkJhclZlcmlmaWVyLmphdmEgYi90ZXN0cy9pbnB1dG1ldGhvZC9zcmMvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL2N0cy91dGlsL0xpZ2h0TmF2aWdhdGlvbkJhclZlcmlmaWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBlODA5YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2lucHV0bWV0aG9kL3NyYy9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvY3RzL3V0aWwvTGlnaHROYXZpZ2F0aW9uQmFyVmVyaWZpZXIuamF2YQpAQCAtMCwwICsxLDIwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLmN0cy51dGlsOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLkNvbG9ySW50OworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTm9uTnVsbDsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VJbnRBcnJheTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsRG91YmxlOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKKworLyoqCisgKiBBIHV0aWxpdHkgY2xhc3MgdG8gZXZhbHVhdGUgaWYge0BsaW5rIGFuZHJvaWQudmlldy5WaWV3I1NZU1RFTV9VSV9GTEFHX0xJR0hUX05BVklHQVRJT05fQkFSfSBpcworICogc3VwcG9ydGVkIG9uIHRoZSBkZXZpY2Ugb3Igbm90LgorICovCitwdWJsaWMgY2xhc3MgTGlnaHROYXZpZ2F0aW9uQmFyVmVyaWZpZXIgeworCisgICAgLyoqIFRoaXMgdmFsdWUgYWN0dWFsbHkgZG9lcyBub3QgaGF2ZSBzdHJvbmcgcmF0aW9uYWxlLiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IExJR0hUX05BVkJBUl9TVVBQT1JURURfVEhSRVNIT0xEID0gMjAuMGY7CisKKyAgICAvKiogVGhpcyB2YWx1ZSBhY3R1YWxseSBkb2VzIG5vdCBoYXZlIHN0cm9uZyByYXRpb25hbGUuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgTElHSFRfTkFWQkFSX05PVF9TVVBQT1JURURfVEhSRVNIT0xEID0gNS4wZjsKKworICAgIEBGdW5jdGlvbmFsSW50ZXJmYWNlCisgICAgcHVibGljIGludGVyZmFjZSBTY3JlZW5zaG90U3VwcGxpZXIgeworICAgICAgICBATm9uTnVsbAorICAgICAgICBCaXRtYXAgdGFrZVNjcmVlbnNob3QoQENvbG9ySW50IGludCBuYXZpZ2F0aW9uQmFyQ29sb3IsIGJvb2xlYW4gbGlnaHRNb2RlKSB0aHJvd3MgRXhjZXB0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBlbnVtIFJlc3VsdFR5cGUgeworICAgICAgICAvKioKKyAgICAgICAgICoge0BsaW5rIGFuZHJvaWQudmlldy5WaWV3I1NZU1RFTV9VSV9GTEFHX0xJR0hUX05BVklHQVRJT05fQkFSfSBzZWVtcyB0byBiZSBub3Qgc3VwcG9ydGVkLgorICAgICAgICAgKi8KKyAgICAgICAgTk9UX1NVUFBPUlRFRCwKKyAgICAgICAgLyoqCisgICAgICAgICAqIHtAbGluayBhbmRyb2lkLnZpZXcuVmlldyNTWVNURU1fVUlfRkxBR19MSUdIVF9OQVZJR0FUSU9OX0JBUn0gc2VlbXMgdG8gYmUgc3VwcG9ydGVkLgorICAgICAgICAgKi8KKyAgICAgICAgU1VQUE9SVEVELAorICAgICAgICAvKioKKyAgICAgICAgICogTm90IHN1cmUgaWYge0BsaW5rIGFuZHJvaWQudmlldy5WaWV3I1NZU1RFTV9VSV9GTEFHX0xJR0hUX05BVklHQVRJT05fQkFSfSBpcyBzdXBwb3J0ZWQuCisgICAgICAgICAqLworICAgICAgICBVTktOT1dOLAorICAgIH0KKworICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXN1bHQgeworICAgICAgICBATm9uTnVsbAorICAgICAgICBwdWJsaWMgZmluYWwgUmVzdWx0VHlwZSBtUmVzdWx0OworICAgICAgICBATm9uTnVsbAorICAgICAgICBwdWJsaWMgZmluYWwgU3VwcGxpZXI8U3RyaW5nPiBtQXNzZXJ0aW9uTWVzc2FnZVByb3ZpZGVyOworCisgICAgICAgIFJlc3VsdChATm9uTnVsbCBSZXN1bHRUeXBlIHJlc3VsdCwKKyAgICAgICAgICAgICAgICBATnVsbGFibGUgU3VwcGxpZXI8U3RyaW5nPiBhc3NlcnRpb25NZXNzYWdlUHJvdmlkZXIpIHsKKyAgICAgICAgICAgIG1SZXN1bHQgPSByZXN1bHQ7CisgICAgICAgICAgICBtQXNzZXJ0aW9uTWVzc2FnZVByb3ZpZGVyID0gYXNzZXJ0aW9uTWVzc2FnZVByb3ZpZGVyOworICAgICAgICB9CisKKyAgICAgICAgQE5vbk51bGwKKyAgICAgICAgcHVibGljIFJlc3VsdFR5cGUgZ2V0UmVzdWx0KCkgeworICAgICAgICAgICAgcmV0dXJuIG1SZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBATm9uTnVsbAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEFzc2VydGlvbk1lc3NhZ2UoKSB7CisgICAgICAgICAgICByZXR1cm4gbUFzc2VydGlvbk1lc3NhZ2VQcm92aWRlci5nZXQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFzc2VydHMgdGhhdCB7QGxpbmsgYW5kcm9pZC52aWV3LlZpZXcjU1lTVEVNX1VJX0ZMQUdfTElHSFRfTkFWSUdBVElPTl9CQVJ9IGlzIHN1cHBvcnRlZCBvbgorICAgICAqIHRoaXMgZGV2aWNlLgorICAgICAqCisgICAgICogQHBhcmFtIHNjcmVlbnNob3RTdXBwbGllciBjYWxsYmFjayB0byBwcm92aWRlIHtAbGluayBCaXRtYXB9IG9mIHRoZSBuYXZpZ2F0aW9uIGJhciByZWdpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZXhwZWN0TGlnaHROYXZpZ2F0aW9uQmFyU3VwcG9ydGVkKAorICAgICAgICAgICAgQE5vbk51bGwgU2NyZWVuc2hvdFN1cHBsaWVyIHNjcmVlbnNob3RTdXBwbGllcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3VsdCByZXN1bHQgPSB2ZXJpZnkoc2NyZWVuc2hvdFN1cHBsaWVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRBc3NlcnRpb25NZXNzYWdlKCksIFJlc3VsdFR5cGUuU1VQUE9SVEVELCByZXN1bHQuZ2V0UmVzdWx0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFzc2VydHMgdGhhdCB7QGxpbmsgYW5kcm9pZC52aWV3LlZpZXcjU1lTVEVNX1VJX0ZMQUdfTElHSFRfTkFWSUdBVElPTl9CQVJ9IGlzIG5vdCBzdXBwb3J0ZWQKKyAgICAgKiBvbiB0aGlzIGRldmljZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzY3JlZW5zaG90U3VwcGxpZXIgY2FsbGJhY2sgdG8gcHJvdmlkZSB7QGxpbmsgQml0bWFwfSBvZiB0aGUgbmF2aWdhdGlvbiBiYXIgcmVnaW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGV4cGVjdExpZ2h0TmF2aWdhdGlvbkJhck5vdFN1cHBvcnRlZCgKKyAgICAgICAgICAgIEBOb25OdWxsIFNjcmVlbnNob3RTdXBwbGllciBzY3JlZW5zaG90U3VwcGxpZXIpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXN1bHQgcmVzdWx0ID0gdmVyaWZ5KHNjcmVlbnNob3RTdXBwbGllcik7CisgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0QXNzZXJ0aW9uTWVzc2FnZSgpLCBSZXN1bHRUeXBlLk5PVF9TVVBQT1JURUQsIHJlc3VsdC5nZXRSZXN1bHQoKSk7CisgICAgfQorCisgICAgQEZ1bmN0aW9uYWxJbnRlcmZhY2UKKyAgICBwcml2YXRlIGludGVyZmFjZSBDb2xvck9wZXJhdG9yIHsKKyAgICAgICAgaW50IG9wZXJhdGUoQENvbG9ySW50IGludCBjb2xvcjEsIEBDb2xvckludCBpbnQgY29sb3IyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnRbXSBvcGVyYXRlQ29sb3JBcnJheXMoQE5vbk51bGwgaW50W10gcGl4ZWxzMSwgQE5vbk51bGwgaW50W10gcGl4ZWxzMiwKKyAgICAgICAgICAgIEBOb25OdWxsIENvbG9yT3BlcmF0b3Igb3BlcmF0b3IpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHBpeGVsczEubGVuZ3RoLCBwaXhlbHMyLmxlbmd0aCk7CisgICAgICAgIGZpbmFsIGludCBudW1QaXhlbHMgPSBwaXhlbHMxLmxlbmd0aDsKKyAgICAgICAgZmluYWwgaW50W10gcmVzdWx0ID0gbmV3IGludFtudW1QaXhlbHNdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVBpeGVsczsgKytpKSB7CisgICAgICAgICAgICByZXN1bHRbaV0gPSBvcGVyYXRvci5vcGVyYXRlKHBpeGVsczFbaV0sIHBpeGVsczJbaV0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQE5vbk51bGwKKyAgICBwcml2YXRlIHN0YXRpYyBpbnRbXSBnZXRQaXhlbHMoQE5vbk51bGwgQml0bWFwIGJpdG1hcCkgeworICAgICAgICBmaW5hbCBpbnQgd2lkdGggPSBiaXRtYXAuZ2V0V2lkdGgoKTsKKyAgICAgICAgZmluYWwgaW50IGhlaWdodCA9IGJpdG1hcC5nZXRIZWlnaHQoKTsKKyAgICAgICAgZmluYWwgaW50W10gcGl4ZWxzID0gbmV3IGludFt3aWR0aCAqIGhlaWdodF07CisgICAgICAgIGJpdG1hcC5nZXRQaXhlbHMocGl4ZWxzLCAwIC8qIG9mZnNldCAqLywgd2lkdGggLyogc3RyaWRlICovLCAwIC8qIHggKi8sIDAgLyogeSAqLywKKyAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgcmV0dXJuIHBpeGVsczsKKyAgICB9CisKKyAgICBATm9uTnVsbAorICAgIHN0YXRpYyBSZXN1bHQgdmVyaWZ5KAorICAgICAgICAgICAgQE5vbk51bGwgU2NyZWVuc2hvdFN1cHBsaWVyIHNjcmVlbnNob3RTdXBwbGllcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIGludFtdIGRhcmtOYXZCYXJQaXhlbHMgPSBnZXRQaXhlbHMoCisgICAgICAgICAgICAgICAgc2NyZWVuc2hvdFN1cHBsaWVyLnRha2VTY3JlZW5zaG90KENvbG9yLkJMQUNLLCBmYWxzZSkpOworICAgICAgICBmaW5hbCBpbnRbXSBsaWdodE5hdkJhclBpeGVscyA9IGdldFBpeGVscygKKyAgICAgICAgICAgICAgICBzY3JlZW5zaG90U3VwcGxpZXIudGFrZVNjcmVlbnNob3QoQ29sb3IuQkxBQ0ssIHRydWUpKTsKKworICAgICAgICBpZiAoZGFya05hdkJhclBpeGVscy5sZW5ndGggIT0gbGlnaHROYXZCYXJQaXhlbHMubGVuZ3RoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJQaXhlbCBjb3VudCBtaXNtYXRjaC4iCisgICAgICAgICAgICAgICAgICAgICsgIiBkYXJrPSIgKyBkYXJrTmF2QmFyUGl4ZWxzLmxlbmd0aCArICIgbGlnaHQ9IiArIGxpZ2h0TmF2QmFyUGl4ZWxzLmxlbmd0aCk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBpbnRbXVtdIGNoYW5uZWxEaWZmcyA9IG5ldyBpbnRbXVtdIHsKKyAgICAgICAgICAgICAgICBvcGVyYXRlQ29sb3JBcnJheXMoZGFya05hdkJhclBpeGVscywgbGlnaHROYXZCYXJQaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAoZGFyaywgbGlnaHQpIC0+IENvbG9yLnJlZChkYXJrKSAtIENvbG9yLnJlZChsaWdodCkpLAorICAgICAgICAgICAgICAgIG9wZXJhdGVDb2xvckFycmF5cyhkYXJrTmF2QmFyUGl4ZWxzLCBsaWdodE5hdkJhclBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgIChkYXJrLCBsaWdodCkgLT4gQ29sb3IuZ3JlZW4oZGFyaykgLSBDb2xvci5ncmVlbihsaWdodCkpLAorICAgICAgICAgICAgICAgIG9wZXJhdGVDb2xvckFycmF5cyhkYXJrTmF2QmFyUGl4ZWxzLCBsaWdodE5hdkJhclBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgIChkYXJrLCBsaWdodCkgLT4gQ29sb3IuYmx1ZShkYXJrKSAtIENvbG9yLmJsdWUobGlnaHQpKSwKKyAgICAgICAgfTsKKworICAgICAgICBpZiAoQXJyYXlzLnN0cmVhbShjaGFubmVsRGlmZnMpLmFsbE1hdGNoKAorICAgICAgICAgICAgICAgIGRpZmZzIC0+IEFycmF5cy5zdHJlYW0oZGlmZnMpLmFsbE1hdGNoKGRpZmYgLT4gZGlmZiA9PSAwKSkpIHsKKyAgICAgICAgICAgIC8vIEV4YWN0bHkgdGhlIHNhbWUgaW1hZ2UuICBTYWZlIHRvIGNvbmNsdWRlIHRoYXQgbGlnaHQgbmF2aWdhdGlvbiBiYXIgaXMgbm90IHN1cHBvcnRlZC4KKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVzdWx0KFJlc3VsdFR5cGUuTk9UX1NVUFBPUlRFRCwgKCkgLT4gZHVtcERpZmZTdHJlYW1zKGNoYW5uZWxEaWZmcykpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKEFycmF5cy5zdHJlYW0oY2hhbm5lbERpZmZzKS5hbnlNYXRjaChkaWZmcyAtPiB7CisgICAgICAgICAgICBmaW5hbCBPcHRpb25hbERvdWJsZSBhdmVyYWdlID0gQXJyYXlzLnN0cmVhbShkaWZmcykuZmlsdGVyKGRpZmYgLT4gZGlmZiAhPSAwKS5hdmVyYWdlKCk7CisgICAgICAgICAgICByZXR1cm4gYXZlcmFnZS5pc1ByZXNlbnQoKSAmJiBhdmVyYWdlLmdldEFzRG91YmxlKCkgPiBMSUdIVF9OQVZCQVJfU1VQUE9SVEVEX1RIUkVTSE9MRDsKKyAgICAgICAgfSkpIHsKKyAgICAgICAgICAgIC8vIElmIGRhcmtOYXZCYXJQaXhlbHMgaGF2ZSBicmlnaHRlciBwaXhlbHMgaW4gYXQgbGVhc3Qgb25lIGNvbG9yIGNoYW5uZWwKKyAgICAgICAgICAgIC8vIChyZWQsIGdyZWVuLCBibHVlKSwgd2UgY29uc2lkZXIgdGhhdCBpdCBpcyBiZWNhdXNlIGxpZ2h0IG5hdmlnYXRpb24gYmFyIHRha2VzIGVmZmVjdC4KKyAgICAgICAgICAgIC8vIEtlZXAgaW4gbWluZCB0aGF0IHdpdGggU1lTVEVNX1VJX0ZMQUdfTElHSFRfTkFWSUdBVElPTl9CQVIgbmF2aWdhdGlvbiBiYXIgYnV0dG9ucworICAgICAgICAgICAgLy8gYXJlIGV4cGVjdGVkIHRvIGJlY29tZSBkYXJrZXIuICBTbyBpZiBldmVyeXRoaW5nIHdvcmtzIGZpbmUsIGRhcmtOYXZCYXJQaXhlbHMgc2hvdWxkCisgICAgICAgICAgICAvLyBoYXZlIGJyaWdodGVyIHBpeGVscy4KKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVzdWx0KFJlc3VsdFR5cGUuU1VQUE9SVEVELCAoKSAtPiBkdW1wRGlmZlN0cmVhbXMoY2hhbm5lbERpZmZzKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoQXJyYXlzLnN0cmVhbShjaGFubmVsRGlmZnMpLmFsbE1hdGNoKGRpZmZzIC0+IHsKKyAgICAgICAgICAgIGZpbmFsIE9wdGlvbmFsRG91YmxlIGF2ZXJhZ2UgPSBBcnJheXMuc3RyZWFtKGRpZmZzKS5maWx0ZXIoZGlmZiAtPiBkaWZmICE9IDApLmF2ZXJhZ2UoKTsKKyAgICAgICAgICAgIHJldHVybiBhdmVyYWdlLmlzUHJlc2VudCgpCisgICAgICAgICAgICAgICAgICAgICYmIE1hdGguYWJzKGF2ZXJhZ2UuZ2V0QXNEb3VibGUoKSkgPCBMSUdIVF9OQVZCQVJfTk9UX1NVUFBPUlRFRF9USFJFU0hPTEQ7CisgICAgICAgIH0pKSB7CisgICAgICAgICAgICAvLyBJZiBhbGwgY29sb3IgY2hhbm5lbHMgKHJlZCwgZ3JlZW4sIGJsdWUpIGhhdmUgZGlmZnMgbGVzcyB0aGFuIGEgY2VydGFpbiB0aHJlc2hvbGQsCisgICAgICAgICAgICAvLyBjb25zaWRlciBsaWdodCBuYXZpZ2F0aW9uIGJhciBpcyBub3Qgc3VwcG9ydGVkLiAgRm9yIGluc3RhbmNlLCBzb21lIGRldmljZXMgbWF5CisgICAgICAgICAgICAvLyBpbnRlbnRpb25hbGx5IGFkZCBzb21lIGZsdWN0dWF0aW9ucyB0byB0aGUgbmF2aWdhdGlvbiBiYXIgYnV0dG9uIGNvbG9ycy9wb3NpdGlvbnMuCisgICAgICAgICAgICByZXR1cm4gbmV3IFJlc3VsdChSZXN1bHRUeXBlLk5PVF9TVVBQT1JURUQsICgpIC0+IGR1bXBEaWZmU3RyZWFtcyhjaGFubmVsRGlmZnMpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXcgUmVzdWx0KFJlc3VsdFR5cGUuVU5LTk9XTiwgKCkgLT4gZHVtcERpZmZTdHJlYW1zKGNoYW5uZWxEaWZmcykpOworICAgIH0KKworICAgIEBOb25OdWxsCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGR1bXBEaWZmU3RyZWFtcyhATm9uTnVsbCBpbnRbXVtdIGRpZmZTdHJlYW1zKSB7CisgICAgICAgIGZpbmFsIFN0cmluZ1tdIGNoYW5uZWxOYW1lcyA9IHsicmVkIiwgImdyZWVuIiwgImJsdWUifTsKKyAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIHNiLmFwcGVuZCgiZGlmZiBoaXN0b2dyYW06ICIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpZmZTdHJlYW1zLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBpZiAoaSAhPSAwKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgaW50W10gY2hhbm5lbCA9IGRpZmZTdHJlYW1zW2ldOworICAgICAgICAgICAgZmluYWwgU3BhcnNlSW50QXJyYXkgaGlzdG9ncmFtID0gbmV3IFNwYXJzZUludEFycmF5KCk7CisgICAgICAgICAgICBBcnJheXMuc3RyZWFtKGNoYW5uZWwpLnNvcnRlZCgpLmZvckVhY2hPcmRlcmVkKAorICAgICAgICAgICAgICAgICAgICBkaWZmIC0+IGhpc3RvZ3JhbS5wdXQoZGlmZiwgaGlzdG9ncmFtLmdldChkaWZmLCAwKSArIDEpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChjaGFubmVsTmFtZXNbaV0pLmFwcGVuZCgiOiAiKS5hcHBlbmQoaGlzdG9ncmFtKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnB1dG1ldGhvZC9zcmMvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL2N0cy91dGlsL05hdmlnYXRpb25CYXJDb2xvclZlcmlmaWVyLmphdmEgYi90ZXN0cy9pbnB1dG1ldGhvZC9zcmMvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL2N0cy91dGlsL05hdmlnYXRpb25CYXJDb2xvclZlcmlmaWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTljMzZhZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2lucHV0bWV0aG9kL3NyYy9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvY3RzL3V0aWwvTmF2aWdhdGlvbkJhckNvbG9yVmVyaWZpZXIuamF2YQpAQCAtMCwwICsxLDE3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLmN0cy51dGlsOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uQ29sb3JJbnQ7CitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5Ob25OdWxsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworLyoqCisgKiBBIHV0aWxpdHkgY2xhc3MgdG8gZXZhbHVhdGUgaWYge0BsaW5rIGFuZHJvaWQudmlldy5XaW5kb3cjc2V0TmF2aWdhdGlvbkJhckNvbG9yKGludCl9IGlzCisgKiBzdXBwb3J0ZWQgb24gdGhlIGRldmljZSBvciBub3QuCisgKi8KK3B1YmxpYyBjbGFzcyBOYXZpZ2F0aW9uQmFyQ29sb3JWZXJpZmllciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBTY3JlZW5TaG90IHsKKyAgICAgICAgQENvbG9ySW50CisgICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgbUJhY2tncm91bmRDb2xvcjsKKyAgICAgICAgQE5vbk51bGwKKyAgICAgICAgcHVibGljIGZpbmFsIGludFtdIG1QaXhlbHM7CisKKyAgICAgICAgU2NyZWVuU2hvdChAQ29sb3JJbnQgaW50IGJhY2tncm91bmRDb2xvciwgQE5vbk51bGwgQml0bWFwIGJpdG1hcCkgeworICAgICAgICAgICAgbUJhY2tncm91bmRDb2xvciA9IGJhY2tncm91bmRDb2xvcjsKKyAgICAgICAgICAgIGZpbmFsIGludCB3aWR0aCA9IGJpdG1hcC5nZXRXaWR0aCgpOworICAgICAgICAgICAgZmluYWwgaW50IGhlaWdodCA9IGJpdG1hcC5nZXRIZWlnaHQoKTsKKyAgICAgICAgICAgIG1QaXhlbHMgPSBuZXcgaW50W3dpZHRoICogaGVpZ2h0XTsKKyAgICAgICAgICAgIGJpdG1hcC5nZXRQaXhlbHMobVBpeGVscywgMCAvKiBvZmZzZXQgKi8sIHdpZHRoIC8qIHN0cmlkZSAqLywgMCAvKiB4ICovLCAwIC8qIHkgKi8sCisgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGVudW0gUmVzdWx0VHlwZSB7CisgICAgICAgIC8qKgorICAgICAgICAgKiB7QGxpbmsgYW5kcm9pZC52aWV3LldpbmRvdyNzZXROYXZpZ2F0aW9uQmFyQ29sb3IoaW50KX0gc2VlbXMgdG8gYmUgbm90IHN1cHBvcnRlZC4KKyAgICAgICAgICovCisgICAgICAgIE5PVF9TVVBQT1JURUQsCisgICAgICAgIC8qKgorICAgICAgICAgKiB7QGxpbmsgYW5kcm9pZC52aWV3LldpbmRvdyNzZXROYXZpZ2F0aW9uQmFyQ29sb3IoaW50KX0gc2VlbXMgdG8gYmUgc3VwcG9ydGVkLgorICAgICAgICAgKi8KKyAgICAgICAgU1VQUE9SVEVELAorICAgIH0KKworICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXN1bHQgeworICAgICAgICBATm9uTnVsbAorICAgICAgICBwdWJsaWMgZmluYWwgUmVzdWx0VHlwZSBtUmVzdWx0OworICAgICAgICBATm9uTnVsbAorICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIG1Bc3NlcnRpb25NZXNzYWdlOworCisgICAgICAgIFJlc3VsdChATm9uTnVsbCBSZXN1bHRUeXBlIHJlc3VsdCwgQE5vbk51bGwgU3RyaW5nIGFzc2VydGlvbk1lc3NhZ2UpIHsKKyAgICAgICAgICAgIG1SZXN1bHQgPSByZXN1bHQ7CisgICAgICAgICAgICBtQXNzZXJ0aW9uTWVzc2FnZSA9IGFzc2VydGlvbk1lc3NhZ2U7CisgICAgICAgIH0KKworICAgICAgICBATm9uTnVsbAorICAgICAgICBwdWJsaWMgUmVzdWx0VHlwZSBnZXRSZXN1bHQoKSB7CisgICAgICAgICAgICByZXR1cm4gbVJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIEBOb25OdWxsCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXNzZXJ0aW9uTWVzc2FnZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtQXNzZXJ0aW9uTWVzc2FnZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBGdW5jdGlvbmFsSW50ZXJmYWNlCisgICAgcHVibGljIGludGVyZmFjZSBTY3JlZW5zaG90U3VwcGxpZXIgeworICAgICAgICBATm9uTnVsbAorICAgICAgICBCaXRtYXAgdGFrZVNjcmVlbnNob3QoQENvbG9ySW50IGludCBuYXZpZ2F0aW9uQmFyQ29sb3IpIHRocm93cyBFeGNlcHRpb247CisgICAgfQorCisgICAgQE5vbk51bGwKKyAgICBzdGF0aWMgUmVzdWx0IHZlcmlmeShATm9uTnVsbCBTY3JlZW5zaG90U3VwcGxpZXIgc2NyZWVuc2hvdFN1cHBsaWVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQXJyYXlMaXN0PFNjcmVlblNob3Q+IHNjcmVlblNob3RzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGZpbmFsIGludFtdIGNvbG9ycyA9IG5ldyBpbnRbXXtDb2xvci5SRUQsIENvbG9yLkdSRUVOLCBDb2xvci5CTFVFfTsKKyAgICAgICAgZm9yIChpbnQgY29sb3IgOiBjb2xvcnMpIHsKKyAgICAgICAgICAgIHNjcmVlblNob3RzLmFkZChuZXcgU2NyZWVuU2hvdChjb2xvciwgc2NyZWVuc2hvdFN1cHBsaWVyLnRha2VTY3JlZW5zaG90KGNvbG9yKSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2ZXJpZnlJbnRlcm5hbChzY3JlZW5TaG90cyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNzZXJ0cyB0aGF0IHtAbGluayBhbmRyb2lkLnZpZXcuV2luZG93I3NldE5hdmlnYXRpb25CYXJDb2xvcihpbnQpfSBpcyBzdXBwb3J0ZWQgb24gdGhpcworICAgICAqIGRldmljZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzY3JlZW5zaG90U3VwcGxpZXIgY2FsbGJhY2sgdG8gcHJvdmlkZSB7QGxpbmsgQml0bWFwfSBvZiB0aGUgbmF2aWdhdGlvbiBiYXIgcmVnaW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGV4cGVjdE5hdmlnYXRpb25CYXJDb2xvclN1cHBvcnRlZCgKKyAgICAgICAgICAgIEBOb25OdWxsIFNjcmVlbnNob3RTdXBwbGllciBzY3JlZW5zaG90U3VwcGxpZXIpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXN1bHQgcmVzdWx0ID0gdmVyaWZ5KHNjcmVlbnNob3RTdXBwbGllcik7CisgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0QXNzZXJ0aW9uTWVzc2FnZSgpLCBSZXN1bHRUeXBlLlNVUFBPUlRFRCwgcmVzdWx0LmdldFJlc3VsdCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBc3NlcnRzIHRoYXQge0BsaW5rIGFuZHJvaWQudmlldy5XaW5kb3cjc2V0TmF2aWdhdGlvbkJhckNvbG9yKGludCl9IGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcworICAgICAqIGRldmljZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzY3JlZW5zaG90U3VwcGxpZXIgY2FsbGJhY2sgdG8gcHJvdmlkZSB7QGxpbmsgQml0bWFwfSBvZiB0aGUgbmF2aWdhdGlvbiBiYXIgcmVnaW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGV4cGVjdE5hdmlnYXRpb25CYXJDb2xvck5vdFN1cHBvcnRlZCgKKyAgICAgICAgICAgIEBOb25OdWxsIFNjcmVlbnNob3RTdXBwbGllciBzY3JlZW5zaG90U3VwcGxpZXIpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXN1bHQgcmVzdWx0ID0gdmVyaWZ5KHNjcmVlbnNob3RTdXBwbGllcik7CisgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0QXNzZXJ0aW9uTWVzc2FnZSgpLCBSZXN1bHRUeXBlLk5PVF9TVVBQT1JURUQsIHJlc3VsdC5nZXRSZXN1bHQoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgUmVzdWx0IHZlcmlmeUludGVybmFsKEBOb25OdWxsIEFycmF5TGlzdDxTY3JlZW5TaG90PiBzY3JlZW5TaG90cykgeworICAgICAgICBmaW5hbCBpbnQgbnVtU2NyZWVuU2hvdHMgPSBzY3JlZW5TaG90cy5zaXplKCk7CisgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICAgICAgIlRoaXMgYWxnb3JpdGhtIHJlcXVpcmVzIGF0IGxlYXN0IDMgc2NyZWVuIHNob3RzLiBzaXplPSIgKyBudW1TY3JlZW5TaG90cywKKyAgICAgICAgICAgICAgICBudW1TY3JlZW5TaG90cyA+PSAzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJBbGwgc2NyZWVuc2hvdHMgbXVzdCBoYXZlIGRpZmZlcmVudCBiYWNrZ3JvdW5kIGNvbG9ycyIsCisgICAgICAgICAgICAgICAgbnVtU2NyZWVuU2hvdHMsCisgICAgICAgICAgICAgICAgc2NyZWVuU2hvdHMuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5tYXBUb0ludChzY3JlZW5TaG90IC0+IHNjcmVlblNob3QubUJhY2tncm91bmRDb2xvcikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5kaXN0aW5jdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAuY291bnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiQWxsIHNjcmVlbnNob3RzIG11c3QgaGF2ZSB0aGUgc2FtZSBwaXhlbCBjb3VudCIsCisgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICBzY3JlZW5TaG90cy5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgICAgLm1hcFRvSW50KHNjcmVlblNob3QgLT4gc2NyZWVuU2hvdC5tUGl4ZWxzLmxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5kaXN0aW5jdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAuY291bnQoKSk7CisKKyAgICAgICAgbG9uZyBudW1Db21wbGV0ZWx5Rml4ZWRDb2xvclBpeGVscyA9IDA7CisgICAgICAgIGxvbmcgbnVtQ29sb3JDaGFuZ2VkQXNSZXF1ZXN0ZWRQaXhlbHMgPSAwOworICAgICAgICBmaW5hbCBpbnQgbnVtUGl4ZWxzID0gc2NyZWVuU2hvdHMuZ2V0KDApLm1QaXhlbHMubGVuZ3RoOworICAgICAgICBmb3IgKGludCBwaXhlbEluZGV4ID0gMDsgcGl4ZWxJbmRleCA8IG51bVBpeGVsczsgKytwaXhlbEluZGV4KSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgaSA9IHBpeGVsSW5kZXg7CisgICAgICAgICAgICBmaW5hbCBsb25nIG51bUZvdW5kQ29sb3JzID0gc2NyZWVuU2hvdHMuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAgICAgLm1hcFRvSW50KHNjcmVlblNob3QgLT4gc2NyZWVuU2hvdC5tUGl4ZWxzW2ldKQorICAgICAgICAgICAgICAgICAgICAuZGlzdGluY3QoKQorICAgICAgICAgICAgICAgICAgICAuY291bnQoKTsKKyAgICAgICAgICAgIGlmIChudW1Gb3VuZENvbG9ycyA9PSAxKSB7CisgICAgICAgICAgICAgICAgbnVtQ29tcGxldGVseUZpeGVkQ29sb3JQaXhlbHMrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIGxvbmcgbWF0Y2hpbmdTY29yZSA9ICBzY3JlZW5TaG90cy5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKHNjcmVlblNob3QgLT4gc2NyZWVuU2hvdC5tUGl4ZWxzW2ldID09IHNjcmVlblNob3QubUJhY2tncm91bmRDb2xvcikKKyAgICAgICAgICAgICAgICAgICAgLmNvdW50KCk7CisgICAgICAgICAgICBpZiAobWF0Y2hpbmdTY29yZSA9PSBudW1TY3JlZW5TaG90cykgeworICAgICAgICAgICAgICAgIG51bUNvbG9yQ2hhbmdlZEFzUmVxdWVzdGVkUGl4ZWxzKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgU3RyaW5nIGFzc2VydGlvbk1lc3NhZ2UgPSAibnVtUGl4ZWxzPSIgKyBudW1QaXhlbHMKKyAgICAgICAgICAgICAgICArICIgbnVtQ29sb3JDaGFuZ2VkQXNSZXF1ZXN0ZWRQaXhlbHM9IiArIG51bUNvbG9yQ2hhbmdlZEFzUmVxdWVzdGVkUGl4ZWxzCisgICAgICAgICAgICAgICAgKyAiIG51bUNvbXBsZXRlbHlGaXhlZENvbG9yUGl4ZWxzPSIgKyBudW1Db21wbGV0ZWx5Rml4ZWRDb2xvclBpeGVsczsKKworICAgICAgICAvLyBPSywgZXZlbiAxIHBpeGVsIGlzIGVub3VnaC4KKyAgICAgICAgaWYgKG51bUNvbG9yQ2hhbmdlZEFzUmVxdWVzdGVkUGl4ZWxzID4gMCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHQoUmVzdWx0VHlwZS5TVVBQT1JURUQsIGFzc2VydGlvbk1lc3NhZ2UpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHQoUmVzdWx0VHlwZS5OT1RfU1VQUE9SVEVELCBhc3NlcnRpb25NZXNzYWdlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnB1dG1ldGhvZC9zcmMvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL2N0cy91dGlsL05hdmlnYXRpb25CYXJJbmZvLmphdmEgYi90ZXN0cy9pbnB1dG1ldGhvZC9zcmMvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL2N0cy91dGlsL05hdmlnYXRpb25CYXJJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEwYWIwYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2lucHV0bWV0aG9kL3NyYy9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvY3RzL3V0aWwvTmF2aWdhdGlvbkJhckluZm8uamF2YQpAQCAtMCwwICsxLDI0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLmN0cy51dGlsOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0RJTV9CRUhJTkQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5jdHMudXRpbC5UZXN0VXRpbHMuZ2V0T25NYWluU3luYzsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nOworaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OworaW1wb3J0IGFuZHJvaWQudXRpbC5TaXplOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd0luc2V0czsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uQ29sb3JJbnQ7CitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5Ob25OdWxsOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTnVsbGFibGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2U7CisKKy8qKgorICogQSB1dGlsaXR5IGNsYXNzIHRvIHdyaXRlIHRlc3RzIHRoYXQgZGVwZW5kIG9uIHNvbWUgY2FwYWJpbGl0aWVzIHJlbGF0ZWQgdG8gbmF2aWdhdGlvbiBiYXIuCisgKi8KK3B1YmxpYyBjbGFzcyBOYXZpZ2F0aW9uQmFySW5mbyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBCRUZPUkVfU0NSRUVOU0hPVF9XQUlUID0gVGltZVVuaXQuU0VDT05EUy50b01pbGxpcygxKTsKKworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtSGFzQm90dG9tTmF2aWdhdGlvbkJhcjsKKyAgICBwcml2YXRlIGZpbmFsIGludCBtQm90dG9tTmF2aWdhdGlvbkJlckhlaWdodDsKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbVN1cHBvcnRzTmF2aWdhdGlvbkJhckNvbG9yOworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtU3VwcG9ydHNMaWdodE5hdmlnYXRpb25CYXI7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1TdXBwb3J0c0RpbW1pbmdXaW5kb3dMaWdodE5hdmlnYXRpb25CYXJPdmVycmlkZTsKKworICAgIHByaXZhdGUgTmF2aWdhdGlvbkJhckluZm8oYm9vbGVhbiBoYXNCb3R0b21OYXZpZ2F0aW9uQmFyLCBpbnQgYm90dG9tTmF2aWdhdGlvbkJlckhlaWdodCwKKyAgICAgICAgICAgIGJvb2xlYW4gc3VwcG9ydHNOYXZpZ2F0aW9uQmFyQ29sb3IsIGJvb2xlYW4gc3VwcG9ydHNMaWdodE5hdmlnYXRpb25CYXIsCisgICAgICAgICAgICBib29sZWFuIHN1cHBvcnRzRGltbWluZ1dpbmRvd0xpZ2h0TmF2aWdhdGlvbkJhck92ZXJyaWRlKSB7CisgICAgICAgIG1IYXNCb3R0b21OYXZpZ2F0aW9uQmFyID0gaGFzQm90dG9tTmF2aWdhdGlvbkJhcjsKKyAgICAgICAgbUJvdHRvbU5hdmlnYXRpb25CZXJIZWlnaHQgPSBib3R0b21OYXZpZ2F0aW9uQmVySGVpZ2h0OworICAgICAgICBtU3VwcG9ydHNOYXZpZ2F0aW9uQmFyQ29sb3IgPSBzdXBwb3J0c05hdmlnYXRpb25CYXJDb2xvcjsKKyAgICAgICAgbVN1cHBvcnRzTGlnaHROYXZpZ2F0aW9uQmFyID0gc3VwcG9ydHNMaWdodE5hdmlnYXRpb25CYXI7CisgICAgICAgIG1TdXBwb3J0c0RpbW1pbmdXaW5kb3dMaWdodE5hdmlnYXRpb25CYXJPdmVycmlkZSA9CisgICAgICAgICAgICAgICAgc3VwcG9ydHNEaW1taW5nV2luZG93TGlnaHROYXZpZ2F0aW9uQmFyT3ZlcnJpZGU7CisgICAgfQorCisgICAgQE51bGxhYmxlCisgICAgcHJpdmF0ZSBzdGF0aWMgTmF2aWdhdGlvbkJhckluZm8gc0luc3RhbmNlOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHtAbGluayBOYXZpZ2F0aW9uQmFySW5mb30gaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiA8cD5BcyBhIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbnMsIHRoaXMgbWV0aG9kIGludGVybmFsbHkgY2FjaGVzIHRoZSBwcmV2aW91cyByZXN1bHQgYW5kCisgICAgICogcmV0dXJucyB0aGUgc2FtZSByZXN1bHQgaWYgdGhpcyBnZXRzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy48L3A+CisgICAgICoKKyAgICAgKiA8cD5Ob3RlOiBUaGUgY2FsbGVyIHNob3VsZCBiZSBhd2FyZSB0aGF0IHRoaXMgbWV0aG9kIG1heSBsYXVuY2gge0BsaW5rIFRlc3RBY3Rpdml0eX0KKyAgICAgKiBpbnRlcm5hbGx5LjwvcD4KKyAgICAgKgorICAgICAqIEByZXR1cm4ge0BsaW5rIE5hdmlnYXRpb25CYXJJbmZvfSBvYnRhaW5lZCB3aXRoIHtAbGluayBUZXN0QWN0aXZpdHl9LgorICAgICAqLworICAgIEBOb25OdWxsCisgICAgcHVibGljIHN0YXRpYyBOYXZpZ2F0aW9uQmFySW5mbyBnZXRJbnN0YW5jZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoc0luc3RhbmNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBzSW5zdGFuY2U7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBpbnQgYWN0dWFsQm90dG9tSW5zZXQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbmFsIEF0b21pY1JlZmVyZW5jZTxWaWV3PiB2aWV3UmVmID0gbmV3IEF0b21pY1JlZmVyZW5jZTw+KCk7CisgICAgICAgICAgICBUZXN0QWN0aXZpdHkuc3RhcnRTeW5jKGFjdGl2aXR5IC0+IHsKKyAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IHZpZXcgPSBuZXcgVmlldyhhY3Rpdml0eSk7CisgICAgICAgICAgICAgICAgdmlldy5zZXRMYXlvdXRQYXJhbXMobmV3IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMoCisgICAgICAgICAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpKTsKKyAgICAgICAgICAgICAgICB2aWV3UmVmLnNldCh2aWV3KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdmlldzsKKyAgICAgICAgICAgIH0sIEludGVudC5GTEFHX0FDVElWSVRZX05PX0FOSU1BVElPTik7CisKKyAgICAgICAgICAgIGZpbmFsIFZpZXcgdmlldyA9IHZpZXdSZWYuZ2V0KCk7CisKKyAgICAgICAgICAgIGZpbmFsIFdpbmRvd0luc2V0cyB3aW5kb3dJbnNldHMgPSBnZXRPbk1haW5TeW5jKCgpIC0+IHZpZXcuZ2V0Um9vdFdpbmRvd0luc2V0cygpKTsKKyAgICAgICAgICAgIGlmICghd2luZG93SW5zZXRzLmhhc1N0YWJsZUluc2V0cygpIHx8IHdpbmRvd0luc2V0cy5nZXRTdGFibGVJbnNldEJvdHRvbSgpIDw9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE5hdmlnYXRpb25CYXJJbmZvKGZhbHNlLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIFNpemUgZGlzcGxheVNpemUgPSBnZXRPbk1haW5TeW5jKCgpIC0+IHsKKyAgICAgICAgICAgICAgICBmaW5hbCBQb2ludCBzaXplID0gbmV3IFBvaW50KCk7CisgICAgICAgICAgICAgICAgdmlldy5nZXREaXNwbGF5KCkuZ2V0UmVhbFNpemUoc2l6ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTaXplKHNpemUueCwgc2l6ZS55KTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICBmaW5hbCBSZWN0IHZpZXdCb3VuZHNPblNjcmVlbiA9IGdldE9uTWFpblN5bmMoKCkgLT4geworICAgICAgICAgICAgICAgIGZpbmFsIGludFtdIHh5ID0gbmV3IGludFsyXTsKKyAgICAgICAgICAgICAgICB2aWV3LmdldExvY2F0aW9uT25TY3JlZW4oeHkpOworICAgICAgICAgICAgICAgIGZpbmFsIGludCB4ID0geHlbMF07CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHkgPSB4eVsxXTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlY3QoeCwgeSwgeCArIHZpZXcuZ2V0V2lkdGgoKSwgeSArIHZpZXcuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBhY3R1YWxCb3R0b21JbnNldCA9IGRpc3BsYXlTaXplLmdldEhlaWdodCgpIC0gdmlld0JvdW5kc09uU2NyZWVuLmJvdHRvbTsKKyAgICAgICAgICAgIGlmIChhY3R1YWxCb3R0b21JbnNldCAhPSB3aW5kb3dJbnNldHMuZ2V0U3RhYmxlSW5zZXRCb3R0b20oKSkgeworICAgICAgICAgICAgICAgIHNJbnN0YW5jZSA9IG5ldyBOYXZpZ2F0aW9uQmFySW5mbyhmYWxzZSwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNJbnN0YW5jZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGJvb2xlYW4gY29sb3JTdXBwb3J0ZWQgPSBOYXZpZ2F0aW9uQmFyQ29sb3JWZXJpZmllci52ZXJpZnkoCisgICAgICAgICAgICAgICAgY29sb3IgLT4gZ2V0Qm90dG9tTmF2aWdhdGlvbkJhckJpdG1hcEZvckFjdGl2aXR5KAorICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IsIGZhbHNlIC8qIGxpZ2h0TmF2aWdhdGlvbkJhciAqLywgYWN0dWFsQm90dG9tSW5zZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBzaG93RGltbWluZ0RpYWxvZyAqLykpLmdldFJlc3VsdCgpCisgICAgICAgICAgICAgICAgPT0gTmF2aWdhdGlvbkJhckNvbG9yVmVyaWZpZXIuUmVzdWx0VHlwZS5TVVBQT1JURUQ7CisKKyAgICAgICAgZmluYWwgYm9vbGVhbiBsaWdodE1vZGVTdXBwb3J0ZWQgPSBMaWdodE5hdmlnYXRpb25CYXJWZXJpZmllci52ZXJpZnkoCisgICAgICAgICAgICAgICAgKGNvbG9yLCBsaWdodE5hdmlnYXRpb25CYXIpIC0+IGdldEJvdHRvbU5hdmlnYXRpb25CYXJCaXRtYXBGb3JBY3Rpdml0eSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yLCBsaWdodE5hdmlnYXRpb25CYXIsIGFjdHVhbEJvdHRvbUluc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogc2hvd0RpbW1pbmdEaWFsb2cgKi8pKS5nZXRSZXN1bHQoKQorICAgICAgICAgICAgICAgID09IExpZ2h0TmF2aWdhdGlvbkJhclZlcmlmaWVyLlJlc3VsdFR5cGUuU1VQUE9SVEVEOworCisgICAgICAgIGZpbmFsIGJvb2xlYW4gZGltbWluZ1N1cHBvcnRlZCA9IGxpZ2h0TW9kZVN1cHBvcnRlZCAmJiBMaWdodE5hdmlnYXRpb25CYXJWZXJpZmllci52ZXJpZnkoCisgICAgICAgICAgICAgICAgKGNvbG9yLCBsaWdodE5hdmlnYXRpb25CYXIpIC0+IGdldEJvdHRvbU5hdmlnYXRpb25CYXJCaXRtYXBGb3JBY3Rpdml0eSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yLCBsaWdodE5hdmlnYXRpb25CYXIsIGFjdHVhbEJvdHRvbUluc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBzaG93RGltbWluZ0RpYWxvZyAqLykpLmdldFJlc3VsdCgpCisgICAgICAgICAgICAgICAgPT0gTGlnaHROYXZpZ2F0aW9uQmFyVmVyaWZpZXIuUmVzdWx0VHlwZS5OT1RfU1VQUE9SVEVEOworCisgICAgICAgIHNJbnN0YW5jZSA9IG5ldyBOYXZpZ2F0aW9uQmFySW5mbygKKyAgICAgICAgICAgICAgICB0cnVlLCBhY3R1YWxCb3R0b21JbnNldCwgY29sb3JTdXBwb3J0ZWQsIGxpZ2h0TW9kZVN1cHBvcnRlZCwgZGltbWluZ1N1cHBvcnRlZCk7CisgICAgICAgIHJldHVybiBzSW5zdGFuY2U7CisgICAgfQorCisgICAgQE5vbk51bGwKKyAgICBwcml2YXRlIHN0YXRpYyBCaXRtYXAgZ2V0Qm90dG9tTmF2aWdhdGlvbkJhckJpdG1hcEZvckFjdGl2aXR5KAorICAgICAgICAgICAgQENvbG9ySW50IGludCBuYXZpZ2F0aW9uQmFyQ29sb3IsIGJvb2xlYW4gbGlnaHROYXZpZ2F0aW9uQmFyLAorICAgICAgICAgICAgaW50IGJvdHRvbU5hdmlnYXRpb25CYXJIZWlnaHQsIGJvb2xlYW4gc2hvd0RpbW1pbmdEaWFsb2cpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBJbnN0cnVtZW50YXRpb24gaW5zdHJ1bWVudGF0aW9uID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCk7CisKKworICAgICAgICBmaW5hbCBUZXN0QWN0aXZpdHkgdGVzdEFjdGl2aXR5ID0gVGVzdEFjdGl2aXR5LnN0YXJ0U3luYyhhY3Rpdml0eSAtPiB7CisgICAgICAgICAgICBmaW5hbCBWaWV3IHZpZXcgPSBuZXcgVmlldyhhY3Rpdml0eSk7CisgICAgICAgICAgICBhY3Rpdml0eS5nZXRXaW5kb3coKS5zZXROYXZpZ2F0aW9uQmFyQ29sb3IobmF2aWdhdGlvbkJhckNvbG9yKTsKKworICAgICAgICAgICAgLy8gU2V0L3Vuc2V0IFNZU1RFTV9VSV9GTEFHX0xJR0hUX05BVklHQVRJT05fQkFSIGlmIG5lY2Vzc2FyeS4KKyAgICAgICAgICAgIGZpbmFsIGludCBjdXJyZW50VmlzID0gdmlldy5nZXRTeXN0ZW1VaVZpc2liaWxpdHkoKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBuZXdWaXMgPSAoY3VycmVudFZpcyAmIH5WaWV3LlNZU1RFTV9VSV9GTEFHX0xJR0hUX05BVklHQVRJT05fQkFSKQorICAgICAgICAgICAgICAgICAgICB8IChsaWdodE5hdmlnYXRpb25CYXIgPyBWaWV3LlNZU1RFTV9VSV9GTEFHX0xJR0hUX05BVklHQVRJT05fQkFSIDogMCk7CisgICAgICAgICAgICBpZiAoY3VycmVudFZpcyAhPSBuZXdWaXMpIHsKKyAgICAgICAgICAgICAgICB2aWV3LnNldFN5c3RlbVVpVmlzaWJpbGl0eShuZXdWaXMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2aWV3LnNldExheW91dFBhcmFtcyhuZXcgVmlld0dyb3VwLkxheW91dFBhcmFtcygKKyAgICAgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSk7CisgICAgICAgICAgICByZXR1cm4gdmlldzsKKyAgICAgICAgfSk7CisgICAgICAgIGluc3RydW1lbnRhdGlvbi53YWl0Rm9ySWRsZVN5bmMoKTsKKworICAgICAgICBmaW5hbCBBbGVydERpYWxvZyBkaWFsb2c7CisgICAgICAgIGlmIChzaG93RGltbWluZ0RpYWxvZykgeworICAgICAgICAgICAgZGlhbG9nID0gZ2V0T25NYWluU3luYygoKSAtPiB7CisgICAgICAgICAgICAgICAgZmluYWwgVGV4dFZpZXcgdGV4dFZpZXcgPSBuZXcgVGV4dFZpZXcodGVzdEFjdGl2aXR5KTsKKyAgICAgICAgICAgICAgICB0ZXh0Vmlldy5zZXRUZXh0KCJEaW1taW5nIFdpbmRvdyIpOworICAgICAgICAgICAgICAgIGZpbmFsIEFsZXJ0RGlhbG9nIGFsZXJ0RGlhbG9nID0gbmV3IEFsZXJ0RGlhbG9nLkJ1aWxkZXIodGVzdEFjdGl2aXR5KQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFZpZXcodGV4dFZpZXcpCisgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlKCk7CisgICAgICAgICAgICAgICAgYWxlcnREaWFsb2cuZ2V0V2luZG93KCkuc2V0RmxhZ3MoRkxBR19ESU1fQkVISU5ELCBGTEFHX0RJTV9CRUhJTkQpOworICAgICAgICAgICAgICAgIGFsZXJ0RGlhbG9nLnNob3coKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWxlcnREaWFsb2c7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRpYWxvZyA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBUaHJlYWQuc2xlZXAoQkVGT1JFX1NDUkVFTlNIT1RfV0FJVCk7CisKKyAgICAgICAgZmluYWwgQml0bWFwIGZ1bGxCaXRtYXAgPSBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRVaUF1dG9tYXRpb24oKS50YWtlU2NyZWVuc2hvdCgpOworICAgICAgICBmaW5hbCBCaXRtYXAgYm90dG9tTmF2QmFyQml0bWFwID0gQml0bWFwLmNyZWF0ZUJpdG1hcChmdWxsQml0bWFwLCAwLAorICAgICAgICAgICAgICAgIGZ1bGxCaXRtYXAuZ2V0SGVpZ2h0KCkgLSBib3R0b21OYXZpZ2F0aW9uQmFySGVpZ2h0LCBmdWxsQml0bWFwLmdldFdpZHRoKCksCisgICAgICAgICAgICAgICAgYm90dG9tTmF2aWdhdGlvbkJhckhlaWdodCk7CisgICAgICAgIGlmIChkaWFsb2cgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gRGlhbG9nI2Rpc21pc3MoKSBpcyBhIHRocmVhZCBzYWZlIG1ldGhvZCBzbyB3ZSBkb24ndCBuZWVkIHRvIGNhbGwgdGhpcyBmcm9tIHRoZSBVSQorICAgICAgICAgICAgLy8gdGhyZWFkLgorICAgICAgICAgICAgZGlhbG9nLmRpc21pc3MoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYm90dG9tTmF2QmFyQml0bWFwOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgZGV2aWNlIHNlZW1zIHRvIGhhdmUgYm90dG9tIG5hdmlnYXRpb24gYmFyLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc0JvdHRvbU5hdmlnYXRpb25CYXIoKSB7CisgICAgICAgIHJldHVybiBtSGFzQm90dG9tTmF2aWdhdGlvbkJhcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIGhlaWdodCBvZiB0aGUgYm90dG9tIG5hdmlnYXRpb24gYmFyLiBWYWxpZCBvbmx5IHdoZW4KKyAgICAgKiAgICAgICAgIHtAbGluayAjaGFzQm90dG9tTmF2aWdhdGlvbkJhcigpfSByZXR1cm5zIHtAY29kZSB0cnVlfQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0Qm90dG9tTmF2aWdhdGlvbkJlckhlaWdodCgpIHsKKyAgICAgICAgcmV0dXJuIG1Cb3R0b21OYXZpZ2F0aW9uQmVySGVpZ2h0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHtAbGluayBhbmRyb2lkLnZpZXcuV2luZG93I3NldE5hdmlnYXRpb25CYXJDb2xvcihpbnQpfSBzZWVtIHRvIHRha2UKKyAgICAgKiAgICAgICAgIGVmZmVjdCBvbiB0aGlzIGRldmljZS4gVmFsaWQgb25seSB3aGVuIHtAbGluayAjaGFzQm90dG9tTmF2aWdhdGlvbkJhcigpfSByZXR1cm5zCisgICAgICogICAgICAgICB7QGNvZGUgdHJ1ZX0KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c05hdmlnYXRpb25CYXJDb2xvcigpIHsKKyAgICAgICAgcmV0dXJuIG1TdXBwb3J0c05hdmlnYXRpb25CYXJDb2xvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB7QGxpbmsgYW5kcm9pZC52aWV3LlZpZXcjU1lTVEVNX1VJX0ZMQUdfTElHSFRfTkFWSUdBVElPTl9CQVJ9IHNlZW0gdG8KKyAgICAgKiAgICAgICAgIHRha2UgZWZmZWN0IG9uIHRoaXMgZGV2aWNlLiBWYWxpZCBvbmx5IHdoZW4ge0BsaW5rICNoYXNCb3R0b21OYXZpZ2F0aW9uQmFyKCl9IHJldHVybnMKKyAgICAgKiAgICAgICAgIHtAY29kZSB0cnVlfQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzTGlnaHROYXZpZ2F0aW9uQmFyKCkgeworICAgICAgICByZXR1cm4gbVN1cHBvcnRzTGlnaHROYXZpZ2F0aW9uQmFyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHtAbGluayBhbmRyb2lkLnZpZXcuVmlldyNTWVNURU1fVUlfRkxBR19MSUdIVF9OQVZJR0FUSU9OX0JBUn0gd2lsbCBiZQorICAgICAqICAgICAgICAgY2FuY2VsZWQgd2hlbiBhIHtAbGluayBhbmRyb2lkLnZpZXcuV2luZG93fSB3aXRoCisgICAgICogICAgICAgICB7QGxpbmsgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zI0ZMQUdfRElNX0JFSElORH0gaXMgc2hvd24uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNEaW1taW5nV2luZG93TGlnaHROYXZpZ2F0aW9uQmFyT3ZlcnJpZGUoKSB7CisgICAgICAgIHJldHVybiBtU3VwcG9ydHNEaW1taW5nV2luZG93TGlnaHROYXZpZ2F0aW9uQmFyT3ZlcnJpZGU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW5wdXRtZXRob2Qvc3JjL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9jdHMvdXRpbC9TdGF0ZUluaXRpYWxpemVBY3Rpdml0eS5qYXZhIGIvdGVzdHMvaW5wdXRtZXRob2Qvc3JjL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9jdHMvdXRpbC9TdGF0ZUluaXRpYWxpemVBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0Y2M5NWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnB1dG1ldGhvZC9zcmMvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL2N0cy91dGlsL1N0YXRlSW5pdGlhbGl6ZUFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLmN0cy51dGlsOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5TT0ZUX0lOUFVUX1NUQVRFX0FMV0FZU19ISURERU47CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CisKKy8qKgorICogQSBub3Age0BsaW5rIEFjdGl2aXR5fSB0byBtYWtlIHN1cmUgdGhhdCB0aGUgdGVzdCBzdGFydHMgZnJvbSBhIGRldGVybWluaXN0aWMgc3RhdGUuCisgKgorICogPHA+Q3VycmVudGx5IHRoaXMge0BsaW5rIEFjdGl2aXR5fSBtYWtlcyBzdXJlIHRoZSBmb2xsb3dpbmcgdGhpbmdzPC9wPgorICogPGxpPgorICogICAgIDx1bD5IaWRlIHRoZSBzb2Z0d2FyZSBrZXlib2FyZCB3aXRoCisgKiAgICAge0BsaW5rIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyNTT0ZUX0lOUFVUX1NUQVRFX0FMV0FZU19ISURERU59PC91bD4KKyAqICAgICA8dWw+TWFrZSBzdXJlIHRoYXQgdGhlIG5hdmlnYXRpb24gYmFyIChpZiBzdXBwb3J0ZWQpIGlzIHJlbmRlcmVkIHdpdGgge0BsaW5rIENvbG9yI0JMQUNLfS4KKyAqICAgICA8L3VsPgorICogPC9saT4KKyAqLworcHVibGljIGNsYXNzIFN0YXRlSW5pdGlhbGl6ZUFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBidW5kbGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoYnVuZGxlKTsKKyAgICAgICAgZmluYWwgVmlldyB2aWV3ID0gbmV3IFZpZXcodGhpcyk7CisgICAgICAgIHZpZXcuc2V0QmFja2dyb3VuZENvbG9yKENvbG9yLldISVRFKTsKKyAgICAgICAgdmlldy5zZXRMYXlvdXRQYXJhbXMobmV3IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMoVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsCisgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpKTsKKworICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBJTUUgaXMgaGlkZGVuIGluIHRoZSBpbml0aWFsIHN0YXRlCisgICAgICAgIGdldFdpbmRvdygpLnNldFNvZnRJbnB1dE1vZGUoU09GVF9JTlBVVF9TVEFURV9BTFdBWVNfSElEREVOKTsKKworICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBuYXZpZ2F0aW9uIGJhciBpcyByZW5kZXJlZCB3aXRoIGJsYWNrIChpZiBzdXBwb3J0ZWQpLgorICAgICAgICBnZXRXaW5kb3coKS5zZXROYXZpZ2F0aW9uQmFyQ29sb3IoQ29sb3IuQkxBQ0spOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KHZpZXcpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2lucHV0bWV0aG9kL3NyYy9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvY3RzL3V0aWwvVGVzdEFjdGl2aXR5LmphdmEgYi90ZXN0cy9pbnB1dG1ldGhvZC9zcmMvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL2N0cy91dGlsL1Rlc3RBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmOGNlNjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnB1dG1ldGhvZC9zcmMvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL2N0cy91dGlsL1Rlc3RBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMTU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuY3RzLnV0aWw7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlNPRlRfSU5QVVRfU1RBVEVfVU5DSEFOR0VEOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOworCitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5BbnlUaHJlYWQ7CitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5Ob25OdWxsOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uVWlUaHJlYWQ7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2U7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworCitwdWJsaWMgZmluYWwgY2xhc3MgVGVzdEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXRvbWljUmVmZXJlbmNlPEZ1bmN0aW9uPFRlc3RBY3Rpdml0eSwgVmlldz4+IHNJbml0aWFsaXplciA9CisgICAgICAgICAgICBuZXcgQXRvbWljUmVmZXJlbmNlPD4oKTsKKworICAgIHByaXZhdGUgRnVuY3Rpb248VGVzdEFjdGl2aXR5LCBWaWV3PiBtSW5pdGlhbGl6ZXIgPSBudWxsOworCisgICAgcHJpdmF0ZSBBdG9taWNCb29sZWFuIG1JZ25vcmVCYWNrS2V5ID0gbmV3IEF0b21pY0Jvb2xlYW4oKTsKKworICAgIHByaXZhdGUgbG9uZyBtT25CYWNrUHJlc3NlZENhbGxDb3VudDsKKworICAgIC8qKgorICAgICAqIENvbnRyb2xzIGhvdyB7QGxpbmsgI29uQmFja1ByZXNzZWQoKX0gYmVoYXZlcy4KKyAgICAgKgorICAgICAqIDxwPlRPRE86IFVzZSB7QGxpbmsgYW5kcm9pZC5hcHAuQXBwQ29tcG9uZW50RmFjdG9yeX0gaW5zdGVhZCB0byBjdXN0b21pc2UgdGhlIGJlaGF2aW9yIG9mCisgICAgICoge0BsaW5rIFRlc3RBY3Rpdml0eX0uPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGlnbm9yZSB7QGNvZGUgdHJ1ZX0gd2hlbiB7QGxpbmsgVGVzdEFjdGl2aXR5fSBzaG91bGQgZG8gbm90aGluZyB3aGVuCisgICAgICogICAgICAgICAgICAgICB7QGxpbmsgI29uQmFja1ByZXNzZWQoKX0gaXMgY2FsbGVkCisgICAgICovCisgICAgQEFueVRocmVhZAorICAgIHB1YmxpYyB2b2lkIHNldElnbm9yZUJhY2tLZXkoYm9vbGVhbiBpZ25vcmUpIHsKKyAgICAgICAgbUlnbm9yZUJhY2tLZXkuc2V0KGlnbm9yZSk7CisgICAgfQorCisgICAgQFVpVGhyZWFkCisgICAgcHVibGljIGxvbmcgZ2V0T25CYWNrUHJlc3NlZENhbGxDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIG1PbkJhY2tQcmVzc2VkQ2FsbENvdW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIGlmIChtSW5pdGlhbGl6ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbUluaXRpYWxpemVyID0gc0luaXRpYWxpemVyLmdldCgpOworICAgICAgICB9CisgICAgICAgIC8vIEN1cnJlbnRseSBTT0ZUX0lOUFVUX1NUQVRFX1VOU1BFQ0lGSUVEIGlzbid0IGFwcHJvcHJpYXRlIGZvciBDVFMgdGVzdCBiZWNhdXNlIHRoZXJlIGlzIG5vCisgICAgICAgIC8vIGNsZWFyIHNwZWMgYWJvdXQgaG93IGl0IGJlaGF2ZXMuICBJbiBvcmRlciB0byBtYWtlIG91ciB0ZXN0cyBkZXRlcm1pbmlzdGljLCBjdXJyZW50bHkgd2UKKyAgICAgICAgLy8gbXVzdCB1c2UgU09GVF9JTlBVVF9TVEFURV9VTkNIQU5HRUQuCisgICAgICAgIC8vIFRPRE8oQnVnIDc3MTUyNzI3KTogUmVtb3ZlIHRoZSBmb2xsb3dpbmcgY29kZSBvbmNlIHdlIGRlZmluZSBob3cKKyAgICAgICAgLy8gU09GVF9JTlBVVF9TVEFURV9VTlNQRUNJRklFRCBhY3R1YWxseSBiZWhhdmVzLgorICAgICAgICBzZXRTb2Z0SW5wdXRTdGF0ZShTT0ZUX0lOUFVUX1NUQVRFX1VOQ0hBTkdFRCk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KG1Jbml0aWFsaXplci5hcHBseSh0aGlzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQmFja1ByZXNzZWQoKSB7CisgICAgICAgICsrbU9uQmFja1ByZXNzZWRDYWxsQ291bnQ7CisgICAgICAgIGlmIChtSWdub3JlQmFja0tleS5nZXQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHN1cGVyLm9uQmFja1ByZXNzZWQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMYXVuY2hlcyB7QGxpbmsgVGVzdEFjdGl2aXR5fSB3aXRoIHRoZSBnaXZlbiBpbml0aWFsaXphdGlvbiBsb2dpYyBmb3IgY29udGVudCB2aWV3LgorICAgICAqCisgICAgICogPHA+QXMgbG9uZyBhcyB5b3UgYXJlIHVzaW5nIHtAbGluayBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXJ9LCB0aGUgdGVzdAorICAgICAqIHJ1bm5lciBhdXRvbWF0aWNhbGx5IGNhbGxzIHtAbGluayBBY3Rpdml0eSNmaW5pc2goKX0gZm9yIHRoZSB7QGxpbmsgQWN0aXZpdHl9IGxhdW5jaGVkIHdoZW4KKyAgICAgKiB0aGUgdGVzdCBmaW5pc2hlZC4gIFlvdSBkbyBub3QgbmVlZCB0byBleHBsaWNpdGx5IGNhbGwge0BsaW5rIEFjdGl2aXR5I2ZpbmlzaCgpfS48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gYWN0aXZpdHlJbml0aWFsaXplciBpbml0aWFsaXplciB0byBzdXBwbHkge0BsaW5rIFZpZXd9IHRvIGJlIHBhc3NlZCB0bworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAge0BsaW5rIEFjdGl2aXR5I3NldENvbnRlbnRWaWV3KFZpZXcpfQorICAgICAqIEByZXR1cm4ge0BsaW5rIFRlc3RBY3Rpdml0eX0gbGF1bmNoZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RBY3Rpdml0eSBzdGFydFN5bmMoCisgICAgICAgICAgICBATm9uTnVsbCBGdW5jdGlvbjxUZXN0QWN0aXZpdHksIFZpZXc+IGFjdGl2aXR5SW5pdGlhbGl6ZXIpIHsKKyAgICAgICAgcmV0dXJuIHN0YXJ0U3luYyhhY3Rpdml0eUluaXRpYWxpemVyLCAwIC8qIG5vQW5pbWF0aW9uICovKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMYXVuY2hlcyB7QGxpbmsgVGVzdEFjdGl2aXR5fSB3aXRoIHRoZSBnaXZlbiBpbml0aWFsaXphdGlvbiBsb2dpYyBmb3IgY29udGVudCB2aWV3LgorICAgICAqCisgICAgICogPHA+QXMgbG9uZyBhcyB5b3UgYXJlIHVzaW5nIHtAbGluayBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXJ9LCB0aGUgdGVzdAorICAgICAqIHJ1bm5lciBhdXRvbWF0aWNhbGx5IGNhbGxzIHtAbGluayBBY3Rpdml0eSNmaW5pc2goKX0gZm9yIHRoZSB7QGxpbmsgQWN0aXZpdHl9IGxhdW5jaGVkIHdoZW4KKyAgICAgKiB0aGUgdGVzdCBmaW5pc2hlZC4gIFlvdSBkbyBub3QgbmVlZCB0byBleHBsaWNpdGx5IGNhbGwge0BsaW5rIEFjdGl2aXR5I2ZpbmlzaCgpfS48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gYWN0aXZpdHlJbml0aWFsaXplciBpbml0aWFsaXplciB0byBzdXBwbHkge0BsaW5rIFZpZXd9IHRvIGJlIHBhc3NlZCB0bworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAge0BsaW5rIEFjdGl2aXR5I3NldENvbnRlbnRWaWV3KFZpZXcpfQorICAgICAqIEBwYXJhbSBhZGRpdGlvbmFsRmxhZ3MgZmxhZ3MgdG8gYmUgc2V0IHRvIHtAbGluayBJbnRlbnQjc2V0RmxhZ3MoaW50KX0KKyAgICAgKiBAcmV0dXJuIHtAbGluayBUZXN0QWN0aXZpdHl9IGxhdW5jaGVkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBUZXN0QWN0aXZpdHkgc3RhcnRTeW5jKAorICAgICAgICAgICAgQE5vbk51bGwgRnVuY3Rpb248VGVzdEFjdGl2aXR5LCBWaWV3PiBhY3Rpdml0eUluaXRpYWxpemVyLAorICAgICAgICAgICAgaW50IGFkZGl0aW9uYWxGbGFncykgeworICAgICAgICBzSW5pdGlhbGl6ZXIuc2V0KGFjdGl2aXR5SW5pdGlhbGl6ZXIpOworICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpCisgICAgICAgICAgICAgICAgLnNldEFjdGlvbihJbnRlbnQuQUNUSU9OX01BSU4pCisgICAgICAgICAgICAgICAgLnNldENsYXNzKEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKSwgVGVzdEFjdGl2aXR5LmNsYXNzKQorICAgICAgICAgICAgICAgIC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSykKKyAgICAgICAgICAgICAgICAuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfQ0xFQVJfVEFTSykKKyAgICAgICAgICAgICAgICAuYWRkRmxhZ3MoYWRkaXRpb25hbEZsYWdzKTsKKyAgICAgICAgcmV0dXJuIChUZXN0QWN0aXZpdHkpIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5CisgICAgICAgICAgICAgICAgLmdldEluc3RydW1lbnRhdGlvbigpLnN0YXJ0QWN0aXZpdHlTeW5jKGludGVudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXBkYXRlcyB7QGxpbmsgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMjc29mdElucHV0TW9kZX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmV3U3RhdGUgT25lIG9mIHtAbGluayBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyNTT0ZUX0lOUFVUX1NUQVRFX1VOU1BFQ0lGSUVEfSwKKyAgICAgKiAgICAgICAgICAgICAgICAge0BsaW5rIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zI1NPRlRfSU5QVVRfU1RBVEVfVU5DSEFOR0VEfSwKKyAgICAgKiAgICAgICAgICAgICAgICAge0BsaW5rIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zI1NPRlRfSU5QVVRfU1RBVEVfSElEREVOfSwKKyAgICAgKiAgICAgICAgICAgICAgICAge0BsaW5rIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zI1NPRlRfSU5QVVRfU1RBVEVfQUxXQVlTX0hJRERFTn0sCisgICAgICogICAgICAgICAgICAgICAgIHtAbGluayBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyNTT0ZUX0lOUFVUX1NUQVRFX1ZJU0lCTEV9LAorICAgICAqICAgICAgICAgICAgICAgICB7QGxpbmsgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMjU09GVF9JTlBVVF9TVEFURV9BTFdBWVNfVklTSUJMRX0KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0U29mdElucHV0U3RhdGUoaW50IG5ld1N0YXRlKSB7CisgICAgICAgIGZpbmFsIFdpbmRvdyB3aW5kb3cgPSBnZXRXaW5kb3coKTsKKyAgICAgICAgZmluYWwgaW50IGN1cnJlbnRTb2Z0SW5wdXRNb2RlID0gd2luZG93LmdldEF0dHJpYnV0ZXMoKS5zb2Z0SW5wdXRNb2RlOworICAgICAgICBmaW5hbCBpbnQgbmV3U29mdElucHV0TW9kZSA9CisgICAgICAgICAgICAgICAgKGN1cnJlbnRTb2Z0SW5wdXRNb2RlICYgfldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlNPRlRfSU5QVVRfTUFTS19TVEFURSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgbmV3U3RhdGU7CisgICAgICAgIHdpbmRvdy5zZXRTb2Z0SW5wdXRNb2RlKG5ld1NvZnRJbnB1dE1vZGUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2lucHV0bWV0aG9kL3NyYy9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvY3RzL3V0aWwvVGVzdFV0aWxzLmphdmEgYi90ZXN0cy9pbnB1dG1ldGhvZC9zcmMvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL2N0cy91dGlsL1Rlc3RVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZmNkYmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnB1dG1ldGhvZC9zcmMvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL2N0cy91dGlsL1Rlc3RVdGlscy5qYXZhCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuY3RzLnV0aWw7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb247CisKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk5vbk51bGw7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVvdXRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY1JlZmVyZW5jZTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQm9vbGVhblN1cHBsaWVyOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKKworcHVibGljIGZpbmFsIGNsYXNzIFRlc3RVdGlscyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBUSU1FX1NMSUNFID0gMTAwOyAgLy8gbXNlYworCisgICAgLyoqCisgICAgICogRXhlY3V0ZXMgYSBjYWxsIG9uIHRoZSBhcHBsaWNhdGlvbidzIG1haW4gdGhyZWFkLCBibG9ja2luZyB1bnRpbCBpdCBpcyBjb21wbGV0ZS4KKyAgICAgKgorICAgICAqIDxwPkEgc2ltcGxlIHdyYXBwZXIgZm9yIHtAbGluayBJbnN0cnVtZW50YXRpb24jcnVuT25NYWluU3luYyhSdW5uYWJsZSl9LjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YXNrIHRhc2sgdG8gYmUgY2FsbGVkIG9uIHRoZSBVSSB0aHJlYWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcnVuT25NYWluU3luYyhATm9uTnVsbCBSdW5uYWJsZSB0YXNrKSB7CisgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLnJ1bk9uTWFpblN5bmModGFzayk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIGEgdmFsdWUgdGhhdCBuZWVkcyB0byBiZSBvYnRhaW5lZCBvbiB0aGUgbWFpbiB0aHJlYWQuCisgICAgICoKKyAgICAgKiA8cD5BIHNpbXBsZSB1dGlsaXR5IG1ldGhvZCB0aGF0IGhlbHBzIHRvIHJldHVybiBhbiBvYmplY3QgZnJvbSB0aGUgVUkgdGhyZWFkLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdXBwbGllciBjYWxsYmFjayB0byBiZSBjYWxsZWQgb24gdGhlIFVJIHRocmVhZCB0byByZXR1cm4gYSB2YWx1ZQorICAgICAqIEBwYXJhbSA8VD4gVHlwZSBvZiB0aGUgdmFsdWUgdG8gYmUgcmV0dXJuZWQKKyAgICAgKiBAcmV0dXJuIFZhbHVlIHJldHVybmVkIGZyb20ge0Bjb2RlIHN1cHBsaWVyfQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFQgZ2V0T25NYWluU3luYyhATm9uTnVsbCBTdXBwbGllcjxUPiBzdXBwbGllcikgeworICAgICAgICBmaW5hbCBBdG9taWNSZWZlcmVuY2U8VD4gcmVzdWx0ID0gbmV3IEF0b21pY1JlZmVyZW5jZTw+KCk7CisgICAgICAgIGZpbmFsIEluc3RydW1lbnRhdGlvbiBpbnN0cnVtZW50YXRpb24gPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKTsKKyAgICAgICAgaW5zdHJ1bWVudGF0aW9uLnJ1bk9uTWFpblN5bmMoKCkgLT4gcmVzdWx0LnNldChzdXBwbGllci5nZXQoKSkpOworICAgICAgICByZXR1cm4gcmVzdWx0LmdldCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERvZXMgcG9sbGluZyBsb29wIG9uIHRoZSBVSSB0aHJlYWQgdG8gd2FpdCB1bnRpbCB0aGUgZ2l2ZW4gY29uZGl0aW9uIGlzIG1ldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25kaXRpb24gQ29uZGl0aW9uIHRvIGJlIHNhdGlzZmllZC4gVGhpcyBpcyBndWFyYW50ZWVkIHRvIHJ1biBvbiB0aGUgVUkgdGhyZWFkLgorICAgICAqIEBwYXJhbSB0aW1lb3V0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmQKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSBtZXNzYWdlIHRvIGRpc3BsYXkgd2hlbiB0aW1lb3V0IG9jY3Vycy4KKyAgICAgKiBAdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24gd2hlbiB0aGUgbm8gZXZlbnQgaXMgbWF0Y2hlZCB0byB0aGUgZ2l2ZW4gY29uZGl0aW9uIHdpdGhpbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB7QGNvZGUgdGltZW91dH0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd2FpdE9uTWFpblVudGlsKAorICAgICAgICAgICAgQE5vbk51bGwgQm9vbGVhblN1cHBsaWVyIGNvbmRpdGlvbiwgbG9uZyB0aW1lb3V0LCBTdHJpbmcgbWVzc2FnZSkKKyAgICAgICAgICAgIHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQXRvbWljQm9vbGVhbiByZXN1bHQgPSBuZXcgQXRvbWljQm9vbGVhbigpOworCisgICAgICAgIGZpbmFsIEluc3RydW1lbnRhdGlvbiBpbnN0cnVtZW50YXRpb24gPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKTsKKyAgICAgICAgd2hpbGUgKCFyZXN1bHQuZ2V0KCkpIHsKKyAgICAgICAgICAgIGlmICh0aW1lb3V0IDwgMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUaW1lb3V0RXhjZXB0aW9uKG1lc3NhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5zdHJ1bWVudGF0aW9uLnJ1bk9uTWFpblN5bmMoKCkgLT4geworICAgICAgICAgICAgICAgIGlmIChjb25kaXRpb24uZ2V0QXNCb29sZWFuKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNldCh0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFRJTUVfU0xJQ0UpOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aW1lb3V0IC09IFRJTUVfU0xJQ0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEb2VzIHBvbGxpbmcgbG9vcCBvbiB0aGUgVUkgdGhyZWFkIHRvIHdhaXQgdW50aWwgdGhlIGdpdmVuIGNvbmRpdGlvbiBpcyBtZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29uZGl0aW9uIENvbmRpdGlvbiB0byBiZSBzYXRpc2ZpZWQuIFRoaXMgaXMgZ3VhcmFudGVlZCB0byBydW4gb24gdGhlIFVJIHRocmVhZC4KKyAgICAgKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kCisgICAgICogQHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIHdoZW4gdGhlIG5vIGV2ZW50IGlzIG1hdGNoZWQgdG8gdGhlIGdpdmVuIGNvbmRpdGlvbiB3aXRoaW4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAge0Bjb2RlIHRpbWVvdXR9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHdhaXRPbk1haW5VbnRpbChATm9uTnVsbCBCb29sZWFuU3VwcGxpZXIgY29uZGl0aW9uLCBsb25nIHRpbWVvdXQpCisgICAgICAgICAgICB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiB7CisgICAgICAgIHdhaXRPbk1haW5VbnRpbChjb25kaXRpb24sIHRpbWVvdXQsICIiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnB1dG1ldGhvZC9zcmMvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL2N0cy91dGlsL1dpbmRvd0ZvY3VzU3RlYWxlci5qYXZhIGIvdGVzdHMvaW5wdXRtZXRob2Qvc3JjL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9jdHMvdXRpbC9XaW5kb3dGb2N1c1N0ZWFsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTY0OGQxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW5wdXRtZXRob2Qvc3JjL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9jdHMvdXRpbC9XaW5kb3dGb2N1c1N0ZWFsZXIuamF2YQpAQCAtMCwwICsxLDE0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLmN0cy51dGlsOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2VydmljZUNvbm5lY3Rpb247CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuUmVzdWx0UmVjZWl2ZXI7CitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5Ob25OdWxsOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQXJyYXlCbG9ja2luZ1F1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkJsb2NraW5nUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZW91dEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKKworLyoqCisgKiBIZWxwZXIgY2xhc3MgdG8gdHJpZ2dlciB0aGUgc2l0dWF0aW9uIHdoZXJlIHdpbmRvdyBpbiBhIGRpZmZlcmVudCBwcm9jZXNzIGdhaW5zIGZvY3VzLgorICovCitwdWJsaWMgY2xhc3MgV2luZG93Rm9jdXNTdGVhbGVyIGltcGxlbWVudHMgQXV0b0Nsb3NlYWJsZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBNeVJlc3VsdFJlY2VpdmVyIGV4dGVuZHMgUmVzdWx0UmVjZWl2ZXIgeworICAgICAgICBmaW5hbCBCbG9ja2luZ1F1ZXVlPEludGVnZXI+IG1RdWV1ZSA9IG5ldyBBcnJheUJsb2NraW5nUXVldWU8PigxKTsKKworICAgICAgICBNeVJlc3VsdFJlY2VpdmVyKCkgeworICAgICAgICAgICAgc3VwZXIobnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25SZWNlaXZlUmVzdWx0KGludCByZXN1bHRDb2RlLCBCdW5kbGUgcmVzdWx0RGF0YSkgeworICAgICAgICAgICAgbVF1ZXVlLmFkZChyZXN1bHRDb2RlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHdhaXRSZXN1bHQobG9uZyB0aW1lb3V0KSB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBPYmplY3QgcmVzdWx0OworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBtUXVldWUucG9sbCh0aW1lb3V0LCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVGltZW91dEV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE5vbk51bGwKKyAgICBwcml2YXRlIGZpbmFsIElXaW5kb3dGb2N1c1N0ZWFsZXIgbVNlcnZpY2U7CisgICAgQE5vbk51bGwKKyAgICBwcml2YXRlIGZpbmFsIFJ1bm5hYmxlIG1DbG9zZXI7CisKKyAgICAvKioKKyAgICAgKiBMZXQgYSB3aW5kb3cgaW4gYSBkaWZmZXJlbnQgcHJvY2VzcyBnYWluIHRoZSB3aW5kb3cgZm9jdXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50QXBwV2luZG93VG9rZW4gVG9rZW4gcmV0dXJuZWQgZnJvbQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7QGxpbmsgYW5kcm9pZC52aWV3LlZpZXcjZ2V0QXBwbGljYXRpb25XaW5kb3dUb2tlbigpfQorICAgICAqIEBwYXJhbSB0aW1lb3V0ICAgICAgICAgICAgICB0aW1lb3V0IGluIG1pbGxpc2Vjb25kCisgICAgICogQHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIHdoZW4gZmFpbGVkIHRvIGhhdmUgdGhlIHdpbmRvdyBmb2N1c2VkIHdpdGhpbiB7QGNvZGUgdGltZW91dH0KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGVhbFdpbmRvd0ZvY3VzKElCaW5kZXIgcGFyZW50QXBwV2luZG93VG9rZW4sIGxvbmcgdGltZW91dCkKKyAgICAgICAgICAgIHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgTXlSZXN1bHRSZWNlaXZlciByZXN1bHRSZWNlaXZlciA9IG5ldyBNeVJlc3VsdFJlY2VpdmVyKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtU2VydmljZS5zdGVhbFdpbmRvd0ZvY3VzKHBhcmVudEFwcFdpbmRvd1Rva2VuLCByZXN1bHRSZWNlaXZlcik7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgICAgIHJlc3VsdFJlY2VpdmVyLndhaXRSZXN1bHQodGltZW91dCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBXaW5kb3dGb2N1c1N0ZWFsZXIoQE5vbk51bGwgSVdpbmRvd0ZvY3VzU3RlYWxlciBzZXJ2aWNlLCBATm9uTnVsbCBSdW5uYWJsZSBjbG9zZXIpIHsKKyAgICAgICAgbVNlcnZpY2UgPSBzZXJ2aWNlOworICAgICAgICBtQ2xvc2VyID0gY2xvc2VyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVzdGFibGlzaGVzIGEgY29ubmVjdGlvbiB0byB0aGUgc2VydmljZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IHtAbGluayBDb250ZXh0fSB0byB3aGljaCB7QGxpbmsgV2luZG93Rm9jdXNTdGVhbGVyU2VydmljZX0gYmVsb25ncworICAgICAqIEBwYXJhbSB0aW1lb3V0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmQKKyAgICAgKiBAdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24gd2hlbiBmYWlsZWQgdG8gZXN0YWJsaXNoIHRoZSBjb25uZWN0aW9uIHdpdGhpbiB7QGNvZGUgdGltZW91dH0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFdpbmRvd0ZvY3VzU3RlYWxlciBjb25uZWN0KENvbnRleHQgY29udGV4dCwgbG9uZyB0aW1lb3V0KQorICAgICAgICAgICAgdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBCbG9ja2luZ1F1ZXVlPElXaW5kb3dGb2N1c1N0ZWFsZXI+IHF1ZXVlID0gbmV3IEFycmF5QmxvY2tpbmdRdWV1ZTw+KDEpOworCisgICAgICAgIGZpbmFsIFNlcnZpY2VDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSBuZXcgU2VydmljZUNvbm5lY3Rpb24oKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VDb25uZWN0ZWQoQ29tcG9uZW50TmFtZSBjbGFzc05hbWUsIElCaW5kZXIgc2VydmljZSkgeworICAgICAgICAgICAgICAgIHF1ZXVlLmFkZChJV2luZG93Rm9jdXNTdGVhbGVyLlN0dWIuYXNJbnRlcmZhY2Uoc2VydmljZSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VEaXNjb25uZWN0ZWQoQ29tcG9uZW50TmFtZSBjbGFzc05hbWUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOworICAgICAgICBpbnRlbnQuc2V0Q2xhc3MoY29udGV4dCwgV2luZG93Rm9jdXNTdGVhbGVyU2VydmljZS5jbGFzcyk7CisgICAgICAgIGNvbnRleHQuYmluZFNlcnZpY2UoaW50ZW50LCBjb25uZWN0aW9uLCBDb250ZXh0LkJJTkRfQVVUT19DUkVBVEUpOworCisgICAgICAgIGZpbmFsIElXaW5kb3dGb2N1c1N0ZWFsZXIgZm9jdXNTdGVhbGVyOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZm9jdXNTdGVhbGVyID0gcXVldWUucG9sbCh0aW1lb3V0LCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZvY3VzU3RlYWxlciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVGltZW91dEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgQXRvbWljQm9vbGVhbiBjbG9zZWQgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7CisgICAgICAgIHJldHVybiBuZXcgV2luZG93Rm9jdXNTdGVhbGVyKGZvY3VzU3RlYWxlciwgKCkgLT4geworICAgICAgICAgICAgaWYgKGNsb3NlZC5jb21wYXJlQW5kU2V0KGZhbHNlLCB0cnVlKSkgeworICAgICAgICAgICAgICAgIGNvbnRleHQudW5iaW5kU2VydmljZShjb25uZWN0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlcyB0aGUgdGVtcG9yYXJ5IHdpbmRvdyBhbmQgY2xlYW4gdXAgZXZlcnl0aGluZy4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtQ2xvc2VyLnJ1bigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2lucHV0bWV0aG9kL3NyYy9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvY3RzL3V0aWwvV2luZG93Rm9jdXNTdGVhbGVyU2VydmljZS5qYXZhIGIvdGVzdHMvaW5wdXRtZXRob2Qvc3JjL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9jdHMvdXRpbC9XaW5kb3dGb2N1c1N0ZWFsZXJTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRiOGI3NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2lucHV0bWV0aG9kL3NyYy9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvY3RzL3V0aWwvV2luZG93Rm9jdXNTdGVhbGVyU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuY3RzLnV0aWw7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5TZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBpeGVsRm9ybWF0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQ29sb3JEcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOworaW1wb3J0IGFuZHJvaWQub3MuUmVzdWx0UmVjZWl2ZXI7CitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5CaW5kZXJUaHJlYWQ7CitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5NYWluVGhyZWFkOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTnVsbGFibGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBXaW5kb3dGb2N1c1N0ZWFsZXJTZXJ2aWNlIGV4dGVuZHMgU2VydmljZSB7CisKKyAgICBATnVsbGFibGUKKyAgICBwcml2YXRlIFRleHRWaWV3IG1DdXN0b21WaWV3OworCisgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBCaW5kZXJTZXJ2aWNlIGV4dGVuZHMgSVdpbmRvd0ZvY3VzU3RlYWxlci5TdHViIHsKKyAgICAgICAgQEJpbmRlclRocmVhZAorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc3RlYWxXaW5kb3dGb2N1cyhJQmluZGVyIHBhcmVudEFwcFdpbmRvd1Rva2VuLCBSZXN1bHRSZWNlaXZlciByZXN1bHRSZWNlaXZlcikgeworICAgICAgICAgICAgbU1haW5IYW5kbGVyLnBvc3QoKCkgLT4gaGFuZGxlU3RlYWxXaW5kb3dGb2N1cyhwYXJlbnRBcHBXaW5kb3dUb2tlbiwgcmVzdWx0UmVjZWl2ZXIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgSGFuZGxlciBtTWFpbkhhbmRsZXIgPSBuZXcgSGFuZGxlcihMb29wZXIuZ2V0TWFpbkxvb3BlcigpKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJQmluZGVyIG9uQmluZChJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIHJldHVybiBuZXcgQmluZGVyU2VydmljZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uVW5iaW5kKEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgaGFuZGxlUmVzZXQoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBNYWluVGhyZWFkCisgICAgcHVibGljIHZvaWQgaGFuZGxlU3RlYWxXaW5kb3dGb2N1cygKKyAgICAgICAgICAgIElCaW5kZXIgcGFyZW50QXBwV2luZG93VG9rZW4sIFJlc3VsdFJlY2VpdmVyIHJlc3VsdFJlY2VpdmVyKSB7CisgICAgICAgIGhhbmRsZVJlc2V0KCk7CisKKyAgICAgICAgbUN1c3RvbVZpZXcgPSBuZXcgVGV4dFZpZXcodGhpcykgeworICAgICAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1XaW5kb3dJbml0aWFsbHlGb2N1c2VkID0gZmFsc2U7CisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbldpbmRvd0ZvY3VzQ2hhbmdlZChib29sZWFuIGhhc1dpbmRvd0ZvY3VzKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtV2luZG93SW5pdGlhbGx5Rm9jdXNlZCAmJiBoYXNXaW5kb3dGb2N1cykgeworICAgICAgICAgICAgICAgICAgICBtV2luZG93SW5pdGlhbGx5Rm9jdXNlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFJlY2VpdmVyLnNlbmQoMCwgbnVsbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBtQ3VzdG9tVmlldy5zZXRUZXh0KCJQb3B1cCIpOworICAgICAgICBtQ3VzdG9tVmlldy5zZXRCYWNrZ3JvdW5kKG5ldyBDb2xvckRyYXdhYmxlKENvbG9yLkNZQU4pKTsKKyAgICAgICAgbUN1c3RvbVZpZXcuc2V0RWxldmF0aW9uKDAuNWYpOworCisgICAgICAgIFdpbmRvd01hbmFnZXIgbVdtID0gZ2V0U3lzdGVtU2VydmljZShXaW5kb3dNYW5hZ2VyLmNsYXNzKTsKKyAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgcGFyYW1zID0gbmV3IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zKAorICAgICAgICAgICAgICAgIDE1MCwgMTUwLCAxMCwgMTAsCisgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9BUFBMSUNBVElPTl9QQU5FTCwKKyAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0FMVF9GT0NVU0FCTEVfSU0KKyAgICAgICAgICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfVE9VQ0hfTU9EQUwsCisgICAgICAgICAgICAgICAgUGl4ZWxGb3JtYXQuT1BBUVVFKTsKKyAgICAgICAgcGFyYW1zLnBhY2thZ2VOYW1lID0gZ2V0UGFja2FnZU5hbWUoKTsKKyAgICAgICAgcGFyYW1zLnRva2VuID0gcGFyZW50QXBwV2luZG93VG9rZW47CisKKyAgICAgICAgbVdtLmFkZFZpZXcobUN1c3RvbVZpZXcsIHBhcmFtcyk7CisgICAgfQorCisgICAgQE1haW5UaHJlYWQKKyAgICBwdWJsaWMgdm9pZCBoYW5kbGVSZXNldCgpIHsKKyAgICAgICAgaWYgKG1DdXN0b21WaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGdldFN5c3RlbVNlcnZpY2UoV2luZG93TWFuYWdlci5jbGFzcykucmVtb3ZlVmlldyhtQ3VzdG9tVmlldyk7CisgICAgICAgICAgICBtQ3VzdG9tVmlldyA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBATWFpblRocmVhZAorICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveSgpIHsKKyAgICAgICAgc3VwZXIub25EZXN0cm95KCk7CisgICAgICAgIGhhbmRsZVJlc2V0KCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9qYW5rL0FuZHJvaWQubWsgYi90ZXN0cy9qYW5rL0FuZHJvaWQubWsKaW5kZXggMTY5NTRmMi4uMmNlNGE5OCAxMDA2NDQKLS0tIGEvdGVzdHMvamFuay9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL2phbmsvQW5kcm9pZC5tawpAQCAtMjMsMTYgKzIzLDE4IEBACiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNKYW5rRGV2aWNlVGVzdENhc2VzCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CiAKICMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKIExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiAKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCi0gICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbCBcCi0gICAgY3RzdGVzdHJ1bm5lciBcCisgICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgXAorICAgIGN0c3Rlc3RydW5uZXItYXh0IFwKICAgICB1Yi11aWF1dG9tYXRvciBcCi0gICAgdWItamFua3Rlc3RoZWxwZXIgXAotICAgIGp1bml0IFwKLSAgICBsZWdhY3ktYW5kcm9pZC10ZXN0CisgICAgYW5kcm9pZHgudGVzdC5qYW5rdGVzdGhlbHBlciBcCisgICAganVuaXQKKworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LmJhc2Uuc3R1YnMKIAogaW5jbHVkZSAkKEJVSUxEX0NUU19QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvdGVzdHMvamFuay9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvamFuay9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGY3YjMyMzIuLmZhZWVkYWIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2phbmsvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy9qYW5rL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTI0LDcgKzI0LDcgQEAKICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIi8+CiAgIDwvYXBwbGljYXRpb24+CiAKLSAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmphbmsuY3RzIgogICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkphbmsgdGVzdHMiPgogICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0ibGlzdGVuZXIiCmRpZmYgLS1naXQgYS90ZXN0cy9qYW5rL3NyYy9hbmRyb2lkL2phbmsvY3RzL0N0c0phbmtUZXN0QmFzZS5qYXZhIGIvdGVzdHMvamFuay9zcmMvYW5kcm9pZC9qYW5rL2N0cy9DdHNKYW5rVGVzdEJhc2UuamF2YQppbmRleCA2MDE1NzI2Li44NWNmNzAwIDEwMDY0NAotLS0gYS90ZXN0cy9qYW5rL3NyYy9hbmRyb2lkL2phbmsvY3RzL0N0c0phbmtUZXN0QmFzZS5qYXZhCisrKyBiL3Rlc3RzL2phbmsvc3JjL2FuZHJvaWQvamFuay9jdHMvQ3RzSmFua1Rlc3RCYXNlLmphdmEKQEAgLTE3LDEwICsxNywxMSBAQAogcGFja2FnZSBhbmRyb2lkLmphbmsuY3RzOwogCiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuamFuay5KYW5rVGVzdEJhc2U7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuamFuay5XaW5kb3dDb250ZW50RnJhbWVTdGF0c01vbml0b3I7CiBpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QudWlhdXRvbWF0b3IuVWlEZXZpY2U7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmphbmsuSmFua1Rlc3RCYXNlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QuamFuay5XaW5kb3dDb250ZW50RnJhbWVTdGF0c01vbml0b3I7CisKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkRldmljZVJlcG9ydExvZzsKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlJlc3VsdFR5cGU7CiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5SZXN1bHRVbml0OwpkaWZmIC0tZ2l0IGEvdGVzdHMvamFuay9zcmMvYW5kcm9pZC9qYW5rL2N0cy91aS9DdHNEZXZpY2VKYW5rVWkuamF2YSBiL3Rlc3RzL2phbmsvc3JjL2FuZHJvaWQvamFuay9jdHMvdWkvQ3RzRGV2aWNlSmFua1VpLmphdmEKaW5kZXggMmUzODlkNy4uMzU1NjVkNyAxMDA2NDQKLS0tIGEvdGVzdHMvamFuay9zcmMvYW5kcm9pZC9qYW5rL2N0cy91aS9DdHNEZXZpY2VKYW5rVWkuamF2YQorKysgYi90ZXN0cy9qYW5rL3NyYy9hbmRyb2lkL2phbmsvY3RzL3VpL0N0c0RldmljZUphbmtVaS5qYXZhCkBAIC0xOCwxMyArMTgsMTQgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuamFuay5jdHMuQ3RzSmFua1Rlc3RCYXNlOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuamFuay5KYW5rVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5qYW5rLldpbmRvd0NvbnRlbnRGcmFtZVN0YXRzTW9uaXRvcjsKIGltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC51aWF1dG9tYXRvci5CeTsKIGltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC51aWF1dG9tYXRvci5EaXJlY3Rpb247CiBpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QudWlhdXRvbWF0b3IuVW50aWw7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmphbmsuSmFua1Rlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5qYW5rLldpbmRvd0NvbnRlbnRGcmFtZVN0YXRzTW9uaXRvcjsKKwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiAKIHB1YmxpYyBjbGFzcyBDdHNEZXZpY2VKYW5rVWkgZXh0ZW5kcyBDdHNKYW5rVGVzdEJhc2UgewpkaWZmIC0tZ2l0IGEvdGVzdHMvamR3cC9BbmRyb2lkLm1rIGIvdGVzdHMvamR3cC9BbmRyb2lkLm1rCmluZGV4IGRlYmY0MWMuLmEzN2VmZjAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2pkd3AvQW5kcm9pZC5taworKysgYi90ZXN0cy9qZHdwL0FuZHJvaWQubWsKQEAgLTI2LDYgKzI2LDkgQEAKICMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKIExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiAKK0xPQ0FMX0RFWF9QUkVPUFQgOj0gZmFsc2UKK0xPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKKwogaW5jbHVkZSAkKEJVSUxEX0pBVkFfTElCUkFSWSkKIAogaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQpkaWZmIC0tZ2l0IGEvdGVzdHMvamR3cC9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy9qZHdwL0FuZHJvaWRUZXN0LnhtbAppbmRleCA3MmQyNmIxLi40NjJlZDM0IDEwMDY0NAotLS0gYS90ZXN0cy9qZHdwL0FuZHJvaWRUZXN0LnhtbAorKysgYi90ZXN0cy9qZHdwL0FuZHJvaWRUZXN0LnhtbApAQCAtMTQsNiArMTQsNyBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIEpEV1AgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImFydCIgLz4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlJ1bkNvbW1hbmRUYXJnZXRQcmVwYXJlciI+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icnVuLWNvbW1hbmQiIHZhbHVlPSJta2RpciAtcCAvZGF0YS9sb2NhbC90bXAvY3RzamR3cC9qYXZhLmlvLnRtcGRpciIgLz4KQEAgLTM1LDggKzM2LDEyIEBACiAgICAgICAgIDxvcHRpb24gbmFtZT0iZGFsdmlrLWFyZyIgdmFsdWU9Ii1EanBkYS5zZXR0aW5ncy52ZXJib3NlPWZhbHNlIiAvPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImRhbHZpay1hcmciIHZhbHVlPSItRGpwZGEuc2V0dGluZ3MudGltZW91dD0xMDAwMCIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJkYWx2aWstYXJnIiB2YWx1ZT0iLURqcGRhLnNldHRpbmdzLndhaXRpbmdUaW1lPTEwMDAwIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9ImRhbHZpay1hcmciIHZhbHVlPSItRGpwZGEuc2V0dGluZ3MuZGVidWdnZWVKYXZhUGF0aD0nZGFsdmlrdm18I0FCSSN8IC1YWGxpYjpsaWJhcnQuc28gLVhjb21waWxlci1vcHRpb24gLS1kZWJ1Z2dhYmxlIC1YdXNlaml0OnRydWUnIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImRhbHZpay1hcmctYWRiY29ubmVjdGlvbiIgdmFsdWU9Ii1EanBkYS5zZXR0aW5ncy5kZWJ1Z2dlZUFnZW50QXJndW1lbnQ9LWFnZW50cGF0aDoiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0iZGFsdmlrLWFyZy1hZGJjb25uZWN0aW9uIiB2YWx1ZT0iLURqcGRhLnNldHRpbmdzLmRlYnVnZ2VlQWdlbnROYW1lPWxpYmpkd3Auc28iIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0iZGFsdmlrLWFyZy1hZGJjb25uZWN0aW9uIiB2YWx1ZT0iLURqcGRhLnNldHRpbmdzLmRlYnVnZ2VlSmF2YVBhdGg9J2RhbHZpa3ZtfCNBQkkjfCAtWFhsaWI6bGliYXJ0LnNvIC1YcGx1Z2luOmxpYm9wZW5qZGtqdm10aS5zbyAtWGNvbXBpbGVyLW9wdGlvbiAtLWRlYnVnZ2FibGUgLVh1c2VqaXQ6dHJ1ZSciIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0iZGFsdmlrLWFyZy1pbnRlcm5hbCIgdmFsdWU9Ii1EanBkYS5zZXR0aW5ncy5kZWJ1Z2dlZUphdmFQYXRoPSdkYWx2aWt2bXwjQUJJI3wgLVhqZHdwUHJvdmlkZXI6aW50ZXJuYWwgLVhYbGliOmxpYmFydC5zbyAtWGNvbXBpbGVyLW9wdGlvbiAtLWRlYnVnZ2FibGUgLVh1c2VqaXQ6dHJ1ZSciIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0ia25vd24tZmFpbHVyZXMiIHZhbHVlPSIvZXhwZWN0YXRpb25zL2pkd3Ata25vd24tZmFpbHVyZXMudHh0IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9Imtub3duLWZhaWx1cmVzLWFkYmNvbm5lY3Rpb24iIHZhbHVlPSIvZXhwZWN0YXRpb25zL2V4dGVybmFsX29qX2xpYmpkd3BfYXJ0X2ZhaWx1cmVzLnR4dCIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJydW50aW1lLWhpbnQiIHZhbHVlPSIxNm0iIC8+CiAKICAgICAgICAgPCEtLSBUZW1wb3Jhcnkgd29yayBhcm91bmQgdG8gYXZvaWQgcnVubmluZyBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlLiAtLT4KZGlmZiAtLWdpdCBhL3Rlc3RzL2pkd3AvcnVubmVyL2RldmljZS1zaWRlL0FuZHJvaWQubWsgYi90ZXN0cy9qZHdwL3J1bm5lci9kZXZpY2Utc2lkZS9BbmRyb2lkLm1rCmluZGV4IGZhN2IyOTQuLjliZmU0MTggMTAwNjQ0Ci0tLSBhL3Rlc3RzL2pkd3AvcnVubmVyL2RldmljZS1zaWRlL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvamR3cC9ydW5uZXIvZGV2aWNlLXNpZGUvQW5kcm9pZC5tawpAQCAtMjQsNyArMjQsNyBAQAogCiBMT0NBTF9QUk9HVUFSRF9FTkFCTEVEIDo9IGRpc2FibGVkCiAKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsIGp1bml0CitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0ganVuaXQKIAogIyBkb24ndCBpbmNsdWRlIHRoZXNlIHBhY2thZ2VzIGluIGFueSB0YXJnZXQKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCmRpZmYgLS1naXQgYS90ZXN0cy9qZHdwL3J1bm5lci9kZXZpY2Utc2lkZS9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9kYWx2aWsvRGFsdmlrVGVzdFJ1bm5lci5qYXZhIGIvdGVzdHMvamR3cC9ydW5uZXIvZGV2aWNlLXNpZGUvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvZGFsdmlrL0RhbHZpa1Rlc3RSdW5uZXIuamF2YQppbmRleCA2NWU4M2FlLi45OWRhYWMxIDEwMDY0NAotLS0gYS90ZXN0cy9qZHdwL3J1bm5lci9kZXZpY2Utc2lkZS9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9kYWx2aWsvRGFsdmlrVGVzdFJ1bm5lci5qYXZhCisrKyBiL3Rlc3RzL2pkd3AvcnVubmVyL2RldmljZS1zaWRlL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2RhbHZpay9EYWx2aWtUZXN0UnVubmVyLmphdmEKQEAgLTE2LDggKzE2LDYgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmRhbHZpazsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuVGVzdFN1aXRlRmlsdGVyOwotCiBpbXBvcnQgZGFsdmlrLnN5c3RlbS5EZXhGaWxlOwogaW1wb3J0IGRhbHZpay5zeXN0ZW0uUGF0aENsYXNzTG9hZGVyOwogCkBAIC01OCw0NSArNTYsNjQgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlVOTkVSX0pBUiA9ICJjdHMtZGFsdmlrLWRldmljZS10ZXN0LXJ1bm5lci5qYXIiOwogCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBDb25maWcgY29uZmlnOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29uZmlnID0gY3JlYXRlQ29uZmlnKGFyZ3MpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgLy8gU2ltdWxhdGUgb25lIGZhaWxlZCB0ZXN0LgorICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJzdGFydC1ydW46MSIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJzdGFydC10ZXN0OkZhaWxlZENvbmZpZ0NyZWF0aW9uIik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImZhaWx1cmU6IiArIERhbHZpa1Rlc3RMaXN0ZW5lci5zdHJpbmdpZnkodCkpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJlbmQtcnVuOjEiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHQpOworICAgICAgICB9CisgICAgICAgIHJ1bihjb25maWcpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIENvbmZpZyBjcmVhdGVDb25maWcoU3RyaW5nW10gYXJncykgewogICAgICAgICBTdHJpbmcgYWJpTmFtZSA9IG51bGw7Ci0gICAgICAgIFNldDxTdHJpbmc+IGluY2x1ZGVzID0gbmV3IEhhc2hTZXQ8PigpOwotICAgICAgICBTZXQ8U3RyaW5nPiBleGNsdWRlcyA9IG5ldyBIYXNoU2V0PD4oKTsKLSAgICAgICAgYm9vbGVhbiBjb2xsZWN0VGVzdHNPbmx5ID0gZmFsc2U7CisgICAgICAgIENvbmZpZyBjb25maWcgPSBuZXcgQ29uZmlnKCk7CiAKICAgICAgICAgZm9yIChTdHJpbmcgYXJnIDogYXJncykgewogICAgICAgICAgICAgaWYgKGFyZy5zdGFydHNXaXRoKEFCSSkpIHsKICAgICAgICAgICAgICAgICBhYmlOYW1lID0gYXJnLnN1YnN0cmluZyhBQkkubGVuZ3RoKCkpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChhcmcuc3RhcnRzV2l0aChJTkNMVURFKSkgewogICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGluY2x1ZGUgOiBhcmcuc3Vic3RyaW5nKElOQ0xVREUubGVuZ3RoKCkpLnNwbGl0KCIsIikpIHsKLSAgICAgICAgICAgICAgICAgICAgaW5jbHVkZXMuYWRkKGluY2x1ZGUpOworICAgICAgICAgICAgICAgICAgICBjb25maWcuaW5jbHVkZXMuYWRkKGluY2x1ZGUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnLnN0YXJ0c1dpdGgoRVhDTFVERSkpIHsKICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBleGNsdWRlIDogYXJnLnN1YnN0cmluZyhFWENMVURFLmxlbmd0aCgpKS5zcGxpdCgiLCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVzLmFkZChleGNsdWRlKTsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLmV4Y2x1ZGVzLmFkZChleGNsdWRlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZy5zdGFydHNXaXRoKElOQ0xVREVfRklMRSkpIHsKLSAgICAgICAgICAgICAgICBsb2FkRmlsdGVycyhhcmcuc3Vic3RyaW5nKElOQ0xVREVfRklMRS5sZW5ndGgoKSksIGluY2x1ZGVzKTsKKyAgICAgICAgICAgICAgICBsb2FkRmlsdGVycyhhcmcuc3Vic3RyaW5nKElOQ0xVREVfRklMRS5sZW5ndGgoKSksIGNvbmZpZy5pbmNsdWRlcyk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZy5zdGFydHNXaXRoKEVYQ0xVREVfRklMRSkpIHsKLSAgICAgICAgICAgICAgICBsb2FkRmlsdGVycyhhcmcuc3Vic3RyaW5nKEVYQ0xVREVfRklMRS5sZW5ndGgoKSksIGV4Y2x1ZGVzKTsKKyAgICAgICAgICAgICAgICBsb2FkRmlsdGVycyhhcmcuc3Vic3RyaW5nKEVYQ0xVREVfRklMRS5sZW5ndGgoKSksIGNvbmZpZy5leGNsdWRlcyk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKENPTExFQ1RfVEVTVFNfT05MWS5lcXVhbHMoYXJnKSkgewotICAgICAgICAgICAgICAgIGNvbGxlY3RUZXN0c09ubHkgPSB0cnVlOworICAgICAgICAgICAgICAgIGNvbmZpZy5jb2xsZWN0VGVzdHNPbmx5ID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIFRlc3RMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBEYWx2aWtUZXN0TGlzdGVuZXIoKTsKICAgICAgICAgU3RyaW5nW10gY2xhc3NQYXRoSXRlbXMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuY2xhc3MucGF0aCIpLnNwbGl0KEZpbGUucGF0aFNlcGFyYXRvcik7CiAgICAgICAgIExpc3Q8Q2xhc3M8Pz4+IGNsYXNzZXMgPSBnZXRDbGFzc2VzKGNsYXNzUGF0aEl0ZW1zLCBhYmlOYW1lKTsKLSAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gVGVzdFN1aXRlRmlsdGVyLmNyZWF0ZVN1aXRlKGNsYXNzZXMsIGluY2x1ZGVzLCBleGNsdWRlcyk7Ci0gICAgICAgIGludCBjb3VudCA9IHN1aXRlLmNvdW50VGVzdENhc2VzKCk7CisgICAgICAgIGNvbmZpZy5zdWl0ZSA9IG5ldyBGaWx0ZXJhYmxlVGVzdFN1aXRlKGNsYXNzZXMsIGNvbmZpZy5pbmNsdWRlcywgY29uZmlnLmV4Y2x1ZGVzKTsKKworICAgICAgICByZXR1cm4gY29uZmlnOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcnVuKENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgVGVzdExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IERhbHZpa1Rlc3RMaXN0ZW5lcigpOworCisgICAgICAgIGludCBjb3VudCA9IGNvbmZpZy5zdWl0ZS5jb3VudFRlc3RDYXNlcygpOwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oU3RyaW5nLmZvcm1hdCgic3RhcnQtcnVuOiVkIiwgY291bnQpKTsKICAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogCi0gICAgICAgIGlmIChjb2xsZWN0VGVzdHNPbmx5KSB7IC8vIG9ubHkgc2ltdWxhdGUgcnVubmluZy9wYXNzaW5nIHRoZSB0ZXN0cyB3aXRoIHRoZSBsaXN0ZW5lcgotICAgICAgICAgICAgY29sbGVjdFRlc3RzKHN1aXRlLCBsaXN0ZW5lciwgaW5jbHVkZXMsIGV4Y2x1ZGVzKTsKKyAgICAgICAgaWYgKGNvbmZpZy5jb2xsZWN0VGVzdHNPbmx5KSB7IC8vIG9ubHkgc2ltdWxhdGUgcnVubmluZy9wYXNzaW5nIHRoZSB0ZXN0cyB3aXRoIHRoZSBsaXN0ZW5lcgorICAgICAgICAgICAgY29sbGVjdFRlc3RzKGNvbmZpZy5zdWl0ZSwgbGlzdGVuZXIsIGNvbmZpZy5pbmNsdWRlcywgY29uZmlnLmV4Y2x1ZGVzKTsKICAgICAgICAgfSBlbHNlIHsgLy8gcnVuIHRoZSB0ZXN0cwogICAgICAgICAgICAgVGVzdFJlc3VsdCByZXN1bHQgPSBuZXcgVGVzdFJlc3VsdCgpOwogICAgICAgICAgICAgcmVzdWx0LmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgICAgIHN1aXRlLnJ1bihyZXN1bHQpOworICAgICAgICAgICAgY29uZmlnLnN1aXRlLnJ1bihyZXN1bHQpOwogICAgICAgICB9CiAKICAgICAgICAgbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKQEAgLTE4NSw2ICsyMDIsOCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFcnJvciB8IElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihqYXIsIGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBjbGFzc2VzOwpAQCAtMjEyLDggKzIzMSwxMiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCFoYXNQdWJsaWNUZXN0TWV0aG9kcyhjbHMpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoIWhhc1B1YmxpY1Rlc3RNZXRob2RzKGNscykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBleGMpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGNscy50b1N0cmluZygpLCBleGMpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gVE9ETzogQWRkIGp1bml0NCBzdXBwb3J0IGhlcmUKQEAgLTI4NCw4ICszMDcsMTA3IEBACiAgICAgICAgICAgICByZXR1cm4gY2xhc3NOYW1lOwogICAgICAgICB9CiAKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgc3RyaW5naWZ5KFRocm93YWJsZSBlcnJvcikgeworICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBzdHJpbmdpZnkoVGhyb3dhYmxlIGVycm9yKSB7CiAgICAgICAgICAgICByZXR1cm4gQXJyYXlzLnRvU3RyaW5nKGVycm9yLmdldFN0YWNrVHJhY2UoKSkucmVwbGFjZUFsbCgiXG4iLCAiICIpOwogICAgICAgICB9CiAgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29uZmlnIHsKKyAgICAgICAgU2V0PFN0cmluZz4gaW5jbHVkZXMgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgICAgIFNldDxTdHJpbmc+IGV4Y2x1ZGVzID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICBib29sZWFuIGNvbGxlY3RUZXN0c09ubHkgPSBmYWxzZTsKKyAgICAgICAgVGVzdFN1aXRlIHN1aXRlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEge0BsaW5rIFRlc3RTdWl0ZX0gdGhhdCBjYW4gZmlsdGVyIHdoaWNoIHRlc3RzIHJ1biwgZ2l2ZW4gdGhlIGluY2x1ZGUgYW5kIGV4Y2x1ZGUgZmlsdGVycy4KKyAgICAgKgorICAgICAqIFRoaXMgaGFkIHRvIGJlIHByaXZhdGUgaW5uZXIgY2xhc3MgYmVjYXVzZSB0aGUgdGVzdCBydW5uZXIgd291bGQgZmluZCBpdCBhbmQgdGhpbmsgaXQgd2FzIGEKKyAgICAgKiBzdWl0ZSBvZiB0ZXN0cywgYnV0IGl0IGhhcyBubyB0ZXN0cyBpbiBpdCwgY2F1c2luZyBhIGNyYXNoLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEZpbHRlcmFibGVUZXN0U3VpdGUgZXh0ZW5kcyBUZXN0U3VpdGUgeworCisgICAgICAgIHByaXZhdGUgU2V0PFN0cmluZz4gbUluY2x1ZGVzOworICAgICAgICBwcml2YXRlIFNldDxTdHJpbmc+IG1FeGNsdWRlczsKKworICAgICAgICBwdWJsaWMgRmlsdGVyYWJsZVRlc3RTdWl0ZShMaXN0PENsYXNzPD8+PiBjbGFzc2VzLCBTZXQ8U3RyaW5nPiBpbmNsdWRlcywKKyAgICAgICAgICAgICAgICBTZXQ8U3RyaW5nPiBleGNsdWRlcykgeworICAgICAgICAgICAgc3VwZXIoY2xhc3Nlcy50b0FycmF5KG5ldyBDbGFzczw/PltjbGFzc2VzLnNpemUoKV0pKTsKKyAgICAgICAgICAgIG1JbmNsdWRlcyA9IGluY2x1ZGVzOworICAgICAgICAgICAgbUV4Y2x1ZGVzID0gZXhjbHVkZXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgY291bnRUZXN0Q2FzZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gY291bnRUZXN0cyh0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW50IGNvdW50VGVzdHMoVGVzdCB0ZXN0KSB7CisgICAgICAgICAgICBpZiAodGVzdCBpbnN0YW5jZW9mIFRlc3RTdWl0ZSkgeworICAgICAgICAgICAgICAgIC8vIElmIHRoZSB0ZXN0IGlzIGEgc3VpdGUgaXQgY291bGQgY29udGFpbiBtdWx0aXBsZSB0ZXN0cywgdGhlc2UgbmVlZCB0byBiZSBzcGxpdAorICAgICAgICAgICAgICAgIC8vIG91dCBpbnRvIHNlcGFyYXRlIHRlc3RzIHNvIHRoZXkgY2FuIGJlIGZpbHRlcmVkCisgICAgICAgICAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gKFRlc3RTdWl0ZSkgdGVzdDsKKyAgICAgICAgICAgICAgICBFbnVtZXJhdGlvbjxUZXN0PiBlbnVtZXJhdG9yID0gc3VpdGUudGVzdHMoKTsKKyAgICAgICAgICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChlbnVtZXJhdG9yLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGNvdW50VGVzdHMoZW51bWVyYXRvci5uZXh0RWxlbWVudCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvdW50OworICAgICAgICAgICAgfSBlbHNlIGlmIChzaG91bGRSdW4odGVzdCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBydW5UZXN0KFRlc3QgdGVzdCwgVGVzdFJlc3VsdCByZXN1bHQpIHsKKyAgICAgICAgICAgIHJ1blRlc3RzKHRlc3QsIHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgcnVuVGVzdHMoVGVzdCB0ZXN0LCBUZXN0UmVzdWx0IHJlc3VsdCkgeworICAgICAgICAgICAgaWYgKHRlc3QgaW5zdGFuY2VvZiBUZXN0U3VpdGUpIHsKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgdGVzdCBpcyBhIHN1aXRlIGl0IGNvdWxkIGNvbnRhaW4gbXVsdGlwbGUgdGVzdHMsIHRoZXNlIG5lZWQgdG8gYmUgc3BsaXQKKyAgICAgICAgICAgICAgICAvLyBvdXQgaW50byBzZXBhcmF0ZSB0ZXN0cyBzbyB0aGV5IGNhbiBiZSBmaWx0ZXJlZAorICAgICAgICAgICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IChUZXN0U3VpdGUpIHRlc3Q7CisgICAgICAgICAgICAgICAgRW51bWVyYXRpb248VGVzdD4gZW51bWVyYXRvciA9IHN1aXRlLnRlc3RzKCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKGVudW1lcmF0b3IuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcnVuVGVzdHMoZW51bWVyYXRvci5uZXh0RWxlbWVudCgpLCByZXN1bHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hvdWxkUnVuKHRlc3QpKSB7CisgICAgICAgICAgICAgICAgdGVzdC5ydW4ocmVzdWx0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBzaG91bGRSdW4oVGVzdCB0ZXN0KSB7CisgICAgICAgICAgICBTdHJpbmcgZnVsbE5hbWUgPSB0ZXN0LnRvU3RyaW5nKCk7CisgICAgICAgICAgICBTdHJpbmdbXSBwYXJ0cyA9IGZ1bGxOYW1lLnNwbGl0KCJbXFwoXFwpXSIpOworICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IHBhcnRzWzFdOworICAgICAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSBTdHJpbmcuZm9ybWF0KCIlcyMlcyIsIGNsYXNzTmFtZSwgcGFydHNbMF0pOworICAgICAgICAgICAgaW50IGluZGV4ID0gY2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJyk7CisgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBpbmRleCA8IDAgPyAiIiA6IGNsYXNzTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOworCisgICAgICAgICAgICBpZiAobUV4Y2x1ZGVzLmNvbnRhaW5zKHBhY2thZ2VOYW1lKSkgeworICAgICAgICAgICAgICAgIC8vIFNraXAgcGFja2FnZSBiZWNhdXNlIGl0IHdhcyBleGNsdWRlZAorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtRXhjbHVkZXMuY29udGFpbnMoY2xhc3NOYW1lKSkgeworICAgICAgICAgICAgICAgIC8vIFNraXAgY2xhc3MgYmVjYXVzZSBpdCB3YXMgZXhjbHVkZWQKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUV4Y2x1ZGVzLmNvbnRhaW5zKG1ldGhvZE5hbWUpKSB7CisgICAgICAgICAgICAgICAgLy8gU2tpcCBtZXRob2QgYmVjYXVzZSBpdCB3YXMgZXhjbHVkZWQKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbUluY2x1ZGVzLmlzRW1wdHkoKQorICAgICAgICAgICAgICAgICAgICB8fCBtSW5jbHVkZXMuY29udGFpbnMobWV0aG9kTmFtZSkKKyAgICAgICAgICAgICAgICAgICAgfHwgbUluY2x1ZGVzLmNvbnRhaW5zKGNsYXNzTmFtZSkKKyAgICAgICAgICAgICAgICAgICAgfHwgbUluY2x1ZGVzLmNvbnRhaW5zKHBhY2thZ2VOYW1lKTsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2pkd3AvcnVubmVyL2hvc3Qtc2lkZS9yZXNvdXJjZXMvZXhwZWN0YXRpb25zL2V4dGVybmFsX29qX2xpYmpkd3BfYXJ0X2ZhaWx1cmVzLnR4dCBiL3Rlc3RzL2pkd3AvcnVubmVyL2hvc3Qtc2lkZS9yZXNvdXJjZXMvZXhwZWN0YXRpb25zL2V4dGVybmFsX29qX2xpYmpkd3BfYXJ0X2ZhaWx1cmVzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWNmMDUwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvamR3cC9ydW5uZXIvaG9zdC1zaWRlL3Jlc291cmNlcy9leHBlY3RhdGlvbnMvZXh0ZXJuYWxfb2pfbGliamR3cF9hcnRfZmFpbHVyZXMudHh0CkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBUaGlzIGZpbGUgY29udGFpbnMgZXhwZWN0YXRpb25zIGZvciBKRFdQIHRlc3RzIHJ1biBvbiBDVFMgdXNpbmcgbGliamR3cC4KKyAqCisgKiBUaGlzIGZpbGUgc2hvdWxkIGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBmaWxlIG9mIHRoZSBzYW1lIG5hbWUgaW4gYXJ0L3Rvb2xzLy4KKyAqLworWworeworICBkZXNjcmlwdGlvbjogIlRlc3QgZmFpbHMgZHVlIHRvIHVuZXhwZWN0ZWRseSBnZXR0aW5nIHRoZSB0aHJlYWQtZ3JvdXBzIG9mIHpvbWJpZSB0aHJlYWRzIiwKKyAgcmVzdWx0OiBFWEVDX0ZBSUxFRCwKKyAgYnVnOiA2NjkwNjQxNCwKKyAgbmFtZTogIm9yZy5hcGFjaGUuaGFybW9ueS5qcGRhLnRlc3RzLmpkd3AuVGhyZWFkUmVmZXJlbmNlLlRocmVhZEdyb3VwMDAyVGVzdCN0ZXN0VGhyZWFkR3JvdXAwMDIiCit9LAoreworICBkZXNjcmlwdGlvbjogIlRoaXMgdGVzdCBpcyBpbmNvcnJlY3Qgc2luY2UgaXQgYmxpbmRseSByZXF1ZXN0cyBsb2NhbCB2YXJpYWJsZXMgd2l0aG91dCBjaGVja2luZyB0aGVpciBzbG90IG51bWJlcnMuIiwKKyAgcmVzdWx0OiBFWEVDX0ZBSUxFRCwKKyAgYnVnOiA3NDAyODUyOCwKKyAgbmFtZTogIm9yZy5hcGFjaGUuaGFybW9ueS5qcGRhLnRlc3RzLmpkd3AuRXZlbnRzLkJyZWFrcG9pbnQwMDNUZXN0I3Rlc3RCcmVha1BvaW50SW5GcmFtZXdvcmtDb2RlIgorfSwKK3sKKyAgZGVzY3JpcHRpb246ICJUZXN0IGZhaWxzIGR1ZSB0byBzdGF0aWMgdmFsdWVzIG5vdCBiZWluZyBzZXQgY29ycmVjdGx5LiIsCisgIHJlc3VsdDogRVhFQ19GQUlMRUQsCisgIGJ1ZzogNjY5MDU4OTQsCisgIG5hbWU6ICJvcmcuYXBhY2hlLmhhcm1vbnkuanBkYS50ZXN0cy5qZHdwLlJlZmVyZW5jZVR5cGUuR2V0VmFsdWVzMDA2VGVzdCN0ZXN0R2V0VmFsdWVzMDA2IgorfSwKK3sKKyAgZGVzY3JpcHRpb246ICJUZXN0cyB0aGF0IGZhaWwgb24gYm90aCBBUlQgYW5kIFJJLiBUaGVzZSB0ZXN0cyBhcmUgbGlrZWx5IGluY29ycmVjdCIsCisgIHJlc3VsdDogRVhFQ19GQUlMRUQsCisgIGJ1ZzogNjY5MDY3MzQsCisgIG5hbWVzOiBbICJvcmcuYXBhY2hlLmhhcm1vbnkuanBkYS50ZXN0cy5qZHdwLkFycmF5UmVmZXJlbmNlLlNldFZhbHVlczAwM1Rlc3QjdGVzdFNldFZhbHVlczAwM19JbnZhbGlkSW5kZXgiLAorICAgICAgICAgICAib3JnLmFwYWNoZS5oYXJtb255LmpwZGEudGVzdHMuamR3cC5DbGFzc1R5cGUuSW52b2tlTWV0aG9kMDAyVGVzdCN0ZXN0SW52b2tlTWV0aG9kX3dyb25nX2FyZ3VtZW50X3R5cGVzIiwKKyAgICAgICAgICAgIm9yZy5hcGFjaGUuaGFybW9ueS5qcGRhLnRlc3RzLmpkd3AuQ2xhc3NUeXBlLkludm9rZU1ldGhvZFRlc3QjdGVzdEludm9rZU1ldGhvZDAwMiIsCisgICAgICAgICAgICJvcmcuYXBhY2hlLmhhcm1vbnkuanBkYS50ZXN0cy5qZHdwLkNsYXNzVHlwZS5JbnZva2VNZXRob2RUZXN0I3Rlc3RJbnZva2VNZXRob2QwMDMiLAorICAgICAgICAgICAib3JnLmFwYWNoZS5oYXJtb255LmpwZGEudGVzdHMuamR3cC5DbGFzc1R5cGUuTmV3SW5zdGFuY2VUZXN0I3Rlc3ROZXdJbnN0YW5jZTAwMiIsCisgICAgICAgICAgICJvcmcuYXBhY2hlLmhhcm1vbnkuanBkYS50ZXN0cy5qZHdwLkNsYXNzVHlwZS5TZXRWYWx1ZXMwMDJUZXN0I3Rlc3RTZXRWYWx1ZXMwMDIiLAorICAgICAgICAgICAib3JnLmFwYWNoZS5oYXJtb255LmpwZGEudGVzdHMuamR3cC5FdmVudHMuQ2xhc3NQcmVwYXJlMDAyVGVzdCN0ZXN0Q2xhc3NQcmVwYXJlQ2F1c2VkQnlEZWJ1Z2dlciIsCisgICAgICAgICAgICJvcmcuYXBhY2hlLmhhcm1vbnkuanBkYS50ZXN0cy5qZHdwLkV2ZW50cy5FeGNlcHRpb25DYXVnaHRUZXN0I3Rlc3RFeGNlcHRpb25FdmVudF9UaHJvd0xvY2F0aW9uX0Zyb21OYXRpdmUiLAorICAgICAgICAgICAib3JnLmFwYWNoZS5oYXJtb255LmpwZGEudGVzdHMuamR3cC5PYmplY3RSZWZlcmVuY2UuRGlzYWJsZUNvbGxlY3Rpb25UZXN0I3Rlc3REaXNhYmxlQ29sbGVjdGlvbl9udWxsIiwKKyAgICAgICAgICAgIm9yZy5hcGFjaGUuaGFybW9ueS5qcGRhLnRlc3RzLmpkd3AuT2JqZWN0UmVmZXJlbmNlLkVuYWJsZUNvbGxlY3Rpb25UZXN0I3Rlc3RFbmFibGVDb2xsZWN0aW9uX2ludmFsaWQiLAorICAgICAgICAgICAib3JnLmFwYWNoZS5oYXJtb255LmpwZGEudGVzdHMuamR3cC5PYmplY3RSZWZlcmVuY2UuRW5hYmxlQ29sbGVjdGlvblRlc3QjdGVzdEVuYWJsZUNvbGxlY3Rpb25fbnVsbCIsCisgICAgICAgICAgICJvcmcuYXBhY2hlLmhhcm1vbnkuanBkYS50ZXN0cy5qZHdwLk9iamVjdFJlZmVyZW5jZS5HZXRWYWx1ZXMwMDJUZXN0I3Rlc3RHZXRWYWx1ZXMwMDIiLAorICAgICAgICAgICAib3JnLmFwYWNoZS5oYXJtb255LmpwZGEudGVzdHMuamR3cC5PYmplY3RSZWZlcmVuY2UuU2V0VmFsdWVzMDAzVGVzdCN0ZXN0U2V0VmFsdWVzMDAzIiwKKyAgICAgICAgICAgIm9yZy5hcGFjaGUuaGFybW9ueS5qcGRhLnRlc3RzLmpkd3AuT2JqZWN0UmVmZXJlbmNlLlNldFZhbHVlc1Rlc3QjdGVzdFNldFZhbHVlczAwMSIsCisgICAgICAgICAgICJvcmcuYXBhY2hlLmhhcm1vbnkuanBkYS50ZXN0cy5qZHdwLlJlZmVyZW5jZVR5cGUuRmllbGRzV2l0aEdlbmVyaWNUZXN0I3Rlc3RGaWVsZHNXaXRoR2VuZXJpYzAwMSIsCisgICAgICAgICAgICJvcmcuYXBhY2hlLmhhcm1vbnkuanBkYS50ZXN0cy5qZHdwLlJlZmVyZW5jZVR5cGUuR2V0VmFsdWVzMDAyVGVzdCN0ZXN0R2V0VmFsdWVzMDAyIiwKKyAgICAgICAgICAgIm9yZy5hcGFjaGUuaGFybW9ueS5qcGRhLnRlc3RzLmpkd3AuUmVmZXJlbmNlVHlwZS5HZXRWYWx1ZXMwMDRUZXN0I3Rlc3RHZXRWYWx1ZXMwMDQiLAorICAgICAgICAgICAib3JnLmFwYWNoZS5oYXJtb255LmpwZGEudGVzdHMuamR3cC5TdHJpbmdSZWZlcmVuY2UuVmFsdWVUZXN0I3Rlc3RTdHJpbmdSZWZlcmVuY2VWYWx1ZVRlc3QwMDFfTnVsbFN0cmluZyIsCisgICAgICAgICAgICJvcmcuYXBhY2hlLmhhcm1vbnkuanBkYS50ZXN0cy5qZHdwLlRocmVhZEdyb3VwUmVmZXJlbmNlLkNoaWxkcmVuVGVzdCN0ZXN0Q2hpbGRyZW5fTnVsbE9iamVjdCIsCisgICAgICAgICAgICJvcmcuYXBhY2hlLmhhcm1vbnkuanBkYS50ZXN0cy5qZHdwLlRocmVhZEdyb3VwUmVmZXJlbmNlLk5hbWVUZXN0I3Rlc3ROYW1lMDAxX051bGxPYmplY3QiLAorICAgICAgICAgICAib3JnLmFwYWNoZS5oYXJtb255LmpwZGEudGVzdHMuamR3cC5UaHJlYWRHcm91cFJlZmVyZW5jZS5QYXJlbnRUZXN0I3Rlc3RQYXJlbnRfTnVsbE9iamVjdCIsCisgICAgICAgICAgICJvcmcuYXBhY2hlLmhhcm1vbnkuanBkYS50ZXN0cy5qZHdwLlZpcnR1YWxNYWNoaW5lLkNhcGFiaWxpdGllc05ld1Rlc3QjdGVzdENhcGFiaWxpdGllc05ldzAwMSIgXQorfQorXQpkaWZmIC0tZ2l0IGEvdGVzdHMvamR3cC9ydW5uZXIvaG9zdC1zaWRlL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L3Rlc3R0eXBlL0RhbHZpa1Rlc3QuamF2YSBiL3Rlc3RzL2pkd3AvcnVubmVyL2hvc3Qtc2lkZS9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS90ZXN0dHlwZS9EYWx2aWtUZXN0LmphdmEKaW5kZXggYzMyMTk5MC4uMzI0ZGY0MCAxMDA2NDQKLS0tIGEvdGVzdHMvamR3cC9ydW5uZXIvaG9zdC1zaWRlL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L3Rlc3R0eXBlL0RhbHZpa1Rlc3QuamF2YQorKysgYi90ZXN0cy9qZHdwL3J1bm5lci9ob3N0LXNpZGUvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvdGVzdHR5cGUvRGFsdmlrVGVzdC5qYXZhCkBAIC0yMSwxMyArMjEsMTQgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5kZG1saWIuTG9nOwogaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi5Mb2cuTG9nTGV2ZWw7CiBpbXBvcnQgY29tLmFuZHJvaWQuZGRtbGliLk11bHRpTGluZVJlY2VpdmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmRkbWxpYi50ZXN0cnVubmVyLlRlc3RJZGVudGlmaWVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmJ1aWxkLklCdWlsZEluZm87CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuY29uZmlnLk9wdGlvbjsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5jb25maWcuT3B0aW9uQ29waWVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5EZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb247CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQuZGV2aWNlLklUZXN0RGV2aWNlOworaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmxvZy5Mb2dVdGlsLkNMb2c7CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQucmVzdWx0LklUZXN0SW52b2NhdGlvbkxpc3RlbmVyOworaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnJlc3VsdC5UZXN0RGVzY3JpcHRpb247CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSUFiaTsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JQWJpUmVjZWl2ZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSUJ1aWxkUmVjZWl2ZXI7CkBAIC00MSwyMCArNDIsMTYgQEAKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC51dGlsLkFiaVV0aWxzOwogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnV0aWwuQXJyYXlVdGlsOwogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnV0aWwuRmlsZVV0aWw7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudXRpbC5UaW1lVmFsOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3BsaXR0ZXI7CiAKLWltcG9ydCB2b2dhci5FeHBlY3RhdGlvblN0b3JlOwotaW1wb3J0IHZvZ2FyLk1vZGVJZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlNwbGl0dGVyOwogCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlbmFtZUZpbHRlcjsKIGltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlbmFtZUZpbHRlcjsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKQEAgLTYyLDYgKzU5LDkgQEAKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogCitpbXBvcnQgdm9nYXIuRXhwZWN0YXRpb25TdG9yZTsKK2ltcG9ydCB2b2dhci5Nb2RlSWQ7CisKIC8qKgogICogQSB3cmFwcGVyIHRvIHJ1biB0ZXN0cyBhZ2FpbnN0IERhbHZpay4KICAqLwpAQCAtMTE0LDYgKzExNCw5IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEVORF9URVNUID0gImVuZC10ZXN0IjsKICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgRkFJTFVSRSA9ICJmYWlsdXJlIjsKIAorICAgIC8vIElmIHdlIGFyZSBydW5uaW5nIHdpdGggYWRiY29ubmVjdGlvbiBqZHdwIHByb3ZpZGVyIChoZW5jZSBhIGxpYmpkd3AgYWdlbnQpLgorICAgIHByaXZhdGUgYm9vbGVhbiBtSXNBZGJDb25uZWN0aW9uID0gdHJ1ZTsKKwogICAgIEBPcHRpb24obmFtZSA9ICJydW4tbmFtZSIsIGRlc2NyaXB0aW9uID0gIlRoZSBuYW1lIHRvIHVzZSB3aGVuIHJlcG9ydGluZyByZXN1bHRzIikKICAgICBwcml2YXRlIFN0cmluZyBtUnVuTmFtZTsKIApAQCAtMTIzLDYgKzEyNiwxNiBAQAogICAgIEBPcHRpb24obmFtZSA9ICJkYWx2aWstYXJnIiwgZGVzY3JpcHRpb24gPSAiSG9sZHMgYXJndW1lbnRzIHRvIHBhc3MgdG8gRGFsdmlrIikKICAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtRGFsdmlrQXJncyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCisgICAgQE9wdGlvbihuYW1lID0gImRhbHZpay1hcmctYWRiY29ubmVjdGlvbiIsCisgICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICJIb2xkcyBhcmd1bWVudHMgdG8gcGFzcyB0byBEYWx2aWsgd2hlbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImRhbHZpay52bS5qZHdwLXByb3ZpZGVyID09IGFkYmNvbm5lY3Rpb24gb3IgZGVmYXVsdCBvciBpcyBlbXB0eSIpCisgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbURhbHZpa0FyZ3NBZGJjb25uZWN0aW9uID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICBAT3B0aW9uKG5hbWUgPSAiZGFsdmlrLWFyZy1pbnRlcm5hbCIsCisgICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICJIb2xkcyBhcmd1bWVudHMgdG8gcGFzcyB0byBEYWx2aWsgb25seSB3aGVuICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAiZGFsdmlrLnZtLmpkd3AtcHJvdmlkZXIgPT0gaW50ZXJuYWwiKQorICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1EYWx2aWtBcmdzSW50ZXJuYWwgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwogICAgIEBPcHRpb24obmFtZSA9ICJydW5uZXItYXJnIiwKICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gIkhvbGRzIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBkZXZpY2Utc2lkZSB0ZXN0IHJ1bm5lciIpCiAgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbVJ1bm5lckFyZ3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKQEAgLTE1MCw2ICsxNjMsMTMgQEAKICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgaGludCBhYm91dCB0aGUgdGVzdCdzIHJ1bnRpbWUuIikKICAgICBwcml2YXRlIGxvbmcgbVJ1bnRpbWVIaW50ID0gNjAwMDA7Ly8gMSBtaW51dGUKIAorICAgIEBPcHRpb24obmFtZSA9ICJrbm93bi1mYWlsdXJlcy1hZGJjb25uZWN0aW9uIiwKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gIkNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGZpbGVzIHNwZWNpZnlpbmcga25vd24tZmFpbHVyZXMgdG8gYmUgc2tpcHBlZCIpCisgICAgcHJpdmF0ZSBTdHJpbmcgbUtub3duRmFpbHVyZXNBZGJjb25uZWN0aW9uOworICAgIEBPcHRpb24obmFtZSA9ICJrbm93bi1mYWlsdXJlcy1pbnRlcm5hbCIsCisgICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICJDb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBmaWxlcyBzcGVjaWZ5aW5nIGtub3duLWZhaWx1cmVzIHRvIGJlIHNraXBwZWQiKQorICAgIHByaXZhdGUgU3RyaW5nIG1Lbm93bkZhaWx1cmVzSW50ZXJuYWw7CisKICAgICBAT3B0aW9uKG5hbWUgPSAia25vd24tZmFpbHVyZXMiLAogICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAiQ29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgZmlsZXMgc3BlY2lmeWluZyBrbm93bi1mYWlsdXJlcyB0byBiZSBza2lwcGVkIikKICAgICBwcml2YXRlIFN0cmluZyBtS25vd25GYWlsdXJlczsKQEAgLTI3NCw2ICsyOTQsMTcgQEAKICAgICAgICAgbUNvbGxlY3RUZXN0c09ubHkgPSBzaG91bGRDb2xsZWN0VGVzdDsKICAgICB9CiAKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQWRiY29ubmVjdGlvbihJVGVzdERldmljZSBkZXZpY2UpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgcHJvdmlkZXIgPSBkZXZpY2UuZ2V0UHJvcGVydHkoImRhbHZpay52bS5qZHdwLXByb3ZpZGVyIik7CisgICAgICAgIGlmIChwcm92aWRlciA9PSBudWxsIHx8IHByb3ZpZGVyLmVxdWFscygiZGVmYXVsdCIpIHx8IHByb3ZpZGVyLmVxdWFscygiYWRiY29ubmVjdGlvbiIpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChwcm92aWRlci5lcXVhbHMoImludGVybmFsIikpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmtub3duIGRhbHZpay52bS5qZHdwLXByb3ZpZGVyID0gIiArIHByb3ZpZGVyKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qKgogICAgICAqIHtAaW5oZXJpdERvY30KICAgICAgKi8KQEAgLTI4MSw2ICszMTIsNyBAQAogICAgIHB1YmxpYyB2b2lkIHJ1bihmaW5hbCBJVGVzdEludm9jYXRpb25MaXN0ZW5lciBsaXN0ZW5lcikgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZyBhYmlOYW1lID0gbUFiaS5nZXROYW1lKCk7CiAgICAgICAgIFN0cmluZyBiaXRuZXNzID0gQWJpVXRpbHMuZ2V0Qml0bmVzcyhhYmlOYW1lKTsKKyAgICAgICAgbUlzQWRiQ29ubmVjdGlvbiA9IGlzQWRiY29ubmVjdGlvbihnZXREZXZpY2UoKSk7CiAKICAgICAgICAgRmlsZSB0bXBFeGNsdWRlRmlsZSA9IG51bGw7CiAgICAgICAgIFN0cmluZyBleGNsdWRlRmlsZSA9ICIiOwpAQCAtMjkwLDYgKzMyMiw3IEBACiAgICAgICAgICAgICBpZiAoIW1EZXZpY2UucHVzaEZpbGUodG1wRXhjbHVkZUZpbGUsIEVYQ0xVREVfRklMRSkpIHsKICAgICAgICAgICAgICAgICBMb2cubG9nQW5kRGlzcGxheShMb2dMZXZlbC5FUlJPUiwgVEFHLCAiQ291bGRuJ3QgcHVzaCBmaWxlOiAiICsgdG1wRXhjbHVkZUZpbGUpOwogICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBDTG9nLmQoImV4Y2x1ZGUtZmlsdGVyLWZpbGU6ICVzIiwgc2FmZVJlYWRDb250ZW50RnJvbUZpbGUodG1wRXhjbHVkZUZpbGUpKTsKICAgICAgICAgICAgICAgICAvLyBJZiBzdWNlc3NmdWxseSBwdXNoZWQgdGhlbiBhZGQgaXQgYXMgYSBmaWx0ZXIuCiAgICAgICAgICAgICAgICAgZXhjbHVkZUZpbGUgPSBTdHJpbmcuZm9ybWF0KCItLWV4Y2x1ZGUtZmlsdGVyLWZpbGU9JXMiLCBFWENMVURFX0ZJTEUpOwogICAgICAgICAgICAgfQpAQCAtMzA5LDExICszNDIsMTkgQEAKICAgICAgICAgICAgIGlmICghbURldmljZS5wdXNoRmlsZShtSW5jbHVkZVRlc3RGaWxlLCBJTkNMVURFX0ZJTEUpKSB7CiAgICAgICAgICAgICAgICAgTG9nLmxvZ0FuZERpc3BsYXkoTG9nTGV2ZWwuRVJST1IsIFRBRywgIkNvdWxkbid0IHB1c2ggZmlsZTogIiArIHBhdGgpOwogICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBDTG9nLmQoImluY2x1ZGUtZmlsdGVyLWZpbGU6ICVzIiwgc2FmZVJlYWRDb250ZW50RnJvbUZpbGUobUluY2x1ZGVUZXN0RmlsZSkpOwogICAgICAgICAgICAgICAgIC8vIElmIHN1Y2Vzc2Z1bGx5IHB1c2hlZCB0aGVuIGFkZCBpdCBhcyBhIGZpbHRlci4KICAgICAgICAgICAgICAgICBpbmNsdWRlRmlsZSA9IFN0cmluZy5mb3JtYXQoIi0taW5jbHVkZS1maWx0ZXItZmlsZT0lcyIsIElOQ0xVREVfRklMRSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBpZiAobUlzQWRiQ29ubmVjdGlvbikgeworICAgICAgICAgICAgTG9nLmxvZ0FuZERpc3BsYXkoTG9nTGV2ZWwuSU5GTywgVEFHLCAiUnVubmluZyB3aXRoIEFEQkNvbm5lY3Rpb24vbGliamR3cCBhZ2VudCIpOworICAgICAgICAgICAgbURhbHZpa0FyZ3MuYWRkQWxsKG1EYWx2aWtBcmdzQWRiY29ubmVjdGlvbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMb2cubG9nQW5kRGlzcGxheShMb2dMZXZlbC5JTkZPLCBUQUcsICJSdW5uaW5nIHdpdGggaW50ZXJuYWwgamR3cCBpbXBsZW1lbnRhdGlvbiIpOworICAgICAgICAgICAgbURhbHZpa0FyZ3MuYWRkQWxsKG1EYWx2aWtBcmdzSW50ZXJuYWwpOworICAgICAgICB9CiAKICAgICAgICAgLy8gQ3JlYXRlIGNvbW1hbmQKICAgICAgICAgbURhbHZpa0FyZ3MuYWRkKCItRHVzZXIubmFtZT1zaGVsbCIpOwpAQCAtMzQ1LDcgKzM4Niw3IEBACiAgICAgICAgICAgICAgICAgZGFsdmlrQXJncywgYWJpTmFtZSwgcnVubmVyQXJncywKICAgICAgICAgICAgICAgICBpbmNsdWRlRmlsdGVycywgZXhjbHVkZUZpbHRlcnMsIGluY2x1ZGVGaWxlLCBleGNsdWRlRmlsZSwgY29sbGVjdFRlc3RzT25seVN0cmluZyk7CiAgICAgICAgIElTaGVsbE91dHB1dFJlY2VpdmVyIHJlY2VpdmVyID0gbmV3IE11bHRpTGluZVJlY2VpdmVyKCkgewotICAgICAgICAgICAgcHJpdmF0ZSBUZXN0SWRlbnRpZmllciB0ZXN0OworICAgICAgICAgICAgcHJpdmF0ZSBUZXN0RGVzY3JpcHRpb24gdGVzdDsKIAogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGxlZCgpIHsKQEAgLTM2MCwzMyArNDAxLDMxIEBACiAgICAgICAgICAgICAgICAgICAgIGlmICh0YWcuZXF1YWxzKFNUQVJUX1JVTikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLnRlc3RSdW5TdGFydGVkKG1SdW5OYW1lLCBJbnRlZ2VyLnBhcnNlSW50KHBhcnRzWzFdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBMb2cubG9nQW5kRGlzcGxheShMb2dMZXZlbC5JTkZPLCBUQUcsIGNvbW1hbmQpOwotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmxvZ0FuZERpc3BsYXkoTG9nTGV2ZWwuSU5GTywgVEFHLCBsaW5lKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0YWcuZXF1YWxzKEVORF9SVU4pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci50ZXN0UnVuRW5kZWQoSW50ZWdlci5wYXJzZUludChwYXJ0c1sxXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLjxTdHJpbmcsIFN0cmluZz5lbXB0eU1hcCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5sb2dBbmREaXNwbGF5KExvZ0xldmVsLklORk8sIFRBRywgbGluZSk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGFnLmVxdWFscyhTVEFSVF9URVNUKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGVzdCA9IGdldFRlc3RJZGVudGlmaWVyKHBhcnRzWzFdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlc3QgPSBnZXRUZXN0RGVzY3JpcHRpb24ocGFydHNbMV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIudGVzdFN0YXJ0ZWQodGVzdCk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGFnLmVxdWFscyhGQUlMVVJFKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIudGVzdEZhaWxlZCh0ZXN0LCBwYXJ0c1sxXSk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGFnLmVxdWFscyhFTkRfVEVTVCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLnRlc3RFbmRlZChnZXRUZXN0SWRlbnRpZmllcihwYXJ0c1sxXSksCisgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci50ZXN0RW5kZWQoZ2V0VGVzdERlc2NyaXB0aW9uKHBhcnRzWzFdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuPFN0cmluZywgU3RyaW5nPmVtcHR5TWFwKCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmxvZ0FuZERpc3BsYXkoTG9nTGV2ZWwuSU5GTywgVEFHLCBsaW5lKTsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBBbHdheXMgbG9nIHRoZSBvdXRwdXQgZm9yIGRlYnVnZ2luZworICAgICAgICAgICAgICAgICAgICBDTG9nLmQobGluZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBwcml2YXRlIFRlc3RJZGVudGlmaWVyIGdldFRlc3RJZGVudGlmaWVyKFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICBwcml2YXRlIFRlc3REZXNjcmlwdGlvbiBnZXRUZXN0RGVzY3JpcHRpb24oU3RyaW5nIG5hbWUpIHsKICAgICAgICAgICAgICAgICBTdHJpbmdbXSBwYXJ0cyA9IG5hbWUuc3BsaXQoIiMiKTsKICAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gcGFydHNbMF07CiAgICAgICAgICAgICAgICAgU3RyaW5nIHRlc3ROYW1lID0gIiI7CiAgICAgICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgICAgICAgICAgdGVzdE5hbWUgPSBwYXJ0c1sxXTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXN0SWRlbnRpZmllcihjbGFzc05hbWUsIHRlc3ROYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRlc3REZXNjcmlwdGlvbihjbGFzc05hbWUsIHRlc3ROYW1lKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICB9OwpAQCAtNDE1LDEwICs0NTQsMTggQEAKICAgICAgICAgICAgICAgICAgICAgRXhwZWN0YXRpb25TdG9yZS5wYXJzZShleHBlY3RhdGlvbkZpbGVzLCBNb2RlSWQuREVWSUNFKTsKICAgICAgICAgICAgIC8vIGNyZWF0ZSBleHBlY3RhdGlvbiBzdG9yZSBmcm9tIGV4cGVjdGF0aW9uIGZpbGVzIGZvdW5kIGluIG1vZHVsZSByZXNvdXJjZXMgZGlyCiAgICAgICAgICAgICBFeHBlY3RhdGlvblN0b3JlIHJlc291cmNlU3RvcmUgPSBudWxsOworICAgICAgICAgICAgU2V0PFN0cmluZz4ga25vd25GYWlsdXJlc0ZpbGVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgICAgICAgICAgU3BsaXR0ZXIgc3BsaXR0ZXIgPSBTcGxpdHRlci5vbignLCcpLnRyaW1SZXN1bHRzKCk7CiAgICAgICAgICAgICBpZiAobUtub3duRmFpbHVyZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFNwbGl0dGVyIHNwbGl0dGVyID0gU3BsaXR0ZXIub24oJywnKS50cmltUmVzdWx0cygpOwotICAgICAgICAgICAgICAgIFNldDxTdHJpbmc+IGtub3duRmFpbHVyZXNGaWxlcyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgSGFzaFNldDw+KHNwbGl0dGVyLnNwbGl0VG9MaXN0KG1Lbm93bkZhaWx1cmVzKSk7CisgICAgICAgICAgICAgICAga25vd25GYWlsdXJlc0ZpbGVzLmFkZEFsbChzcGxpdHRlci5zcGxpdFRvTGlzdChtS25vd25GYWlsdXJlcykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1Jc0FkYkNvbm5lY3Rpb24gJiYgbUtub3duRmFpbHVyZXNBZGJjb25uZWN0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBrbm93bkZhaWx1cmVzRmlsZXMuYWRkQWxsKHNwbGl0dGVyLnNwbGl0VG9MaXN0KG1Lbm93bkZhaWx1cmVzQWRiY29ubmVjdGlvbikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFtSXNBZGJDb25uZWN0aW9uICYmIG1Lbm93bkZhaWx1cmVzSW50ZXJuYWwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGtub3duRmFpbHVyZXNGaWxlcy5hZGRBbGwoc3BsaXR0ZXIuc3BsaXRUb0xpc3QobUtub3duRmFpbHVyZXNJbnRlcm5hbCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGtub3duRmFpbHVyZXNGaWxlcy5zaXplKCkgIT0gMCkgewogICAgICAgICAgICAgICAgIHJlc291cmNlU3RvcmUgPSBFeHBlY3RhdGlvblN0b3JlLnBhcnNlUmVzb3VyY2VzKAogICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2xhc3MoKSwga25vd25GYWlsdXJlc0ZpbGVzLCBNb2RlSWQuREVWSUNFKTsKICAgICAgICAgICAgIH0KQEAgLTUxNSw0ICs1NjIsMTMgQEAKICAgICAgICAgICAgIHJldHVybiBuYW1lLnN0YXJ0c1dpdGgobU5hbWUpICYmIG5hbWUuZW5kc1dpdGgoRVhQRUNUQVRJT05TX0VYVCk7CiAgICAgICAgIH0KICAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBzYWZlUmVhZENvbnRlbnRGcm9tRmlsZShGaWxlIGZpbGUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBGaWxlVXRpbC5yZWFkU3RyaW5nRnJvbUZpbGUoZmlsZSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIENMb2cuZShlKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGVhbmJhY2tqYW5rL0FuZHJvaWQubWsgYi90ZXN0cy9sZWFuYmFja2phbmsvQW5kcm9pZC5tawppbmRleCBlYzExNGYzLi45ZjliYThjIDEwMDY0NAotLS0gYS90ZXN0cy9sZWFuYmFja2phbmsvQW5kcm9pZC5taworKysgYi90ZXN0cy9sZWFuYmFja2phbmsvQW5kcm9pZC5tawpAQCAtMjQsMTkgKzI0LDE4IEBACiAgICAgICAgIC4vYXBwL3NyYy9hbmRyb2lkL2xlYW5iYWNramFuay9hcHAvSW50ZW50S2V5cy5qYXZhCiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNMZWFuYmFja0phbmtUZXN0Q2FzZXMKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKIAogIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAogTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKIAogTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKLSAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsIFwKLSAgICBjdHN0ZXN0cnVubmVyIFwKKyAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBcCisgICAgY3RzdGVzdHJ1bm5lci1heHQgXAogICAgIHViLXVpYXV0b21hdG9yIFwKLSAgICB1Yi1qYW5rdGVzdGhlbHBlciBcCi0gICAgYW5kcm9pZC1zdXBwb3J0LXYxNy1sZWFuYmFjayBcCi0gICAgYW5kcm9pZC1zdXBwb3J0LXY3LXJlY3ljbGVydmlldyBcCi0gICAgYW5kcm9pZC1zdXBwb3J0LXY0IFwKLSAgICBsZWdhY3ktYW5kcm9pZC10ZXN0CisgICAgYW5kcm9pZHgudGVzdC5qYW5rdGVzdGhlbHBlcgorCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicwogCiBpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCiAKZGlmZiAtLWdpdCBhL3Rlc3RzL2xlYW5iYWNramFuay9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvbGVhbmJhY2tqYW5rL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggMzVhMmUyZS4uMmIxZjFhNiAxMDA2NDQKLS0tIGEvdGVzdHMvbGVhbmJhY2tqYW5rL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvbGVhbmJhY2tqYW5rL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTI1LDcgKzI1LDcgQEAKICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIi8+CiAgIDwvYXBwbGljYXRpb24+CiAKLSAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmxlYW5iYWNramFuay5jdHMiCiAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iTGVhbmJhY2tKYW5rIHRlc3RzIj4KICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9Imxpc3RlbmVyIgpkaWZmIC0tZ2l0IGEvdGVzdHMvbGVhbmJhY2tqYW5rL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL2xlYW5iYWNramFuay9BbmRyb2lkVGVzdC54bWwKaW5kZXggMzE1MDRiNi4uZDk0MTMyNSAxMDA2NDQKLS0tIGEvdGVzdHMvbGVhbmJhY2tqYW5rL0FuZHJvaWRUZXN0LnhtbAorKysgYi90ZXN0cy9sZWFuYmFja2phbmsvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgTGVhbmJhY2tKYW5rIHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJ0diIgLz4KICAgICA8b3B0aW9uIG5hbWU9Im5vdC1zaGFyZGFibGUiIHZhbHVlPSJ0cnVlIiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgpkaWZmIC0tZ2l0IGEvdGVzdHMvbGVhbmJhY2tqYW5rL2FwcC9BbmRyb2lkLm1rIGIvdGVzdHMvbGVhbmJhY2tqYW5rL2FwcC9BbmRyb2lkLm1rCmluZGV4IDNmYzY4NWQuLjA2ZjJhZTkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2xlYW5iYWNramFuay9hcHAvQW5kcm9pZC5taworKysgYi90ZXN0cy9sZWFuYmFja2phbmsvYXBwL0FuZHJvaWQubWsKQEAgLTIzLDI5ICsyMywyNiBAQAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzTGVhbmJhY2tKYW5rQXBwCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CiAKICMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKIExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiAKLUxPQ0FMX1JFU09VUkNFX0RJUiA6PSBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3Mvc3VwcG9ydC92MTcvbGVhbmJhY2svcmVzIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9zdXBwb3J0L3Y3L3JlY3ljbGVydmlldy9yZXMgXAotICAgICQoTE9DQUxfUEFUSCkvcmVzCitMT0NBTF9VU0VfQUFQVDIgOj0gdHJ1ZQorCitMT0NBTF9SRVNPVVJDRV9ESVIgOj0gJChMT0NBTF9QQVRIKS9yZXMKIAogTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKLSAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsIFwKLSAgICBjdHN0ZXN0cnVubmVyIFwKKyAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBcCisgICAgY3RzdGVzdHJ1bm5lci1heHQgXAogICAgIHViLXVpYXV0b21hdG9yIFwKLSAgICB1Yi1qYW5rdGVzdGhlbHBlciBcCi0gICAgYW5kcm9pZC1zdXBwb3J0LXY0IFwKLSAgICBhbmRyb2lkLXN1cHBvcnQtdjctcmVjeWNsZXJ2aWV3IFwKLSAgICBhbmRyb2lkLXN1cHBvcnQtdjE3LWxlYW5iYWNrIFwKKyAgICBhbmRyb2lkeC50ZXN0Lmphbmt0ZXN0aGVscGVyIFwKICAgICBnbGlkZQogCi1MT0NBTF9BQVBUX0ZMQUdTIDo9IFwKLSAgICAgICAgLS1hdXRvLWFkZC1vdmVybGF5IFwKLSAgICAgICAgLS1leHRyYS1wYWNrYWdlcyBhbmRyb2lkLnN1cHBvcnQudjE3LmxlYW5iYWNrIFwKLSAgICAgICAgLS1leHRyYS1wYWNrYWdlcyBhbmRyb2lkLnN1cHBvcnQudjcucmVjeWNsZXJ2aWV3CitMT0NBTF9TVEFUSUNfQU5EUk9JRF9MSUJSQVJJRVMgOj0gXAorICAgIGFuZHJvaWR4LmxlZ2FjeV9sZWdhY3ktc3VwcG9ydC12NCBcCisgICAgYW5kcm9pZHgucmVjeWNsZXJ2aWV3X3JlY3ljbGVydmlldyBcCisgICAgYW5kcm9pZHgubGVhbmJhY2tfbGVhbmJhY2sKIAogTE9DQUxfUFJPR1VBUkRfRkxBR19GSUxFUyA6PSBwcm9ndWFyZC5mbGFncwogCmRpZmYgLS1naXQgYS90ZXN0cy9sZWFuYmFja2phbmsvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9sZWFuYmFja2phbmsvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggMWUxZmYzYi4uMWVhM2YzZiAxMDA2NDQKLS0tIGEvdGVzdHMvbGVhbmJhY2tqYW5rL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL2xlYW5iYWNramFuay9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtNDAsNiArNDAsOCBAQAogICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2FwcF9uYW1lIgogICAgICAgICBhbmRyb2lkOmxvZ289IkBkcmF3YWJsZS92aWRlb3NfYnlfZ29vZ2xlX2Jhbm5lciIKICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQHN0eWxlL1RoZW1lLkV4YW1wbGUuTGVhbmJhY2siID4KKyAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CisKICAgICAgICAgPGFjdGl2aXR5CiAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9Ii51aS5NYWluQWN0aXZpdHkiCiAgICAgICAgICAgICBhbmRyb2lkOmljb249IkBkcmF3YWJsZS92aWRlb3NfYnlfZ29vZ2xlX2Jhbm5lciIKZGlmZiAtLWdpdCBhL3Rlc3RzL2xlYW5iYWNramFuay9hcHAvcmVzL2xheW91dC9pY29uX2hlYWRlcl9pdGVtLnhtbCBiL3Rlc3RzL2xlYW5iYWNramFuay9hcHAvcmVzL2xheW91dC9pY29uX2hlYWRlcl9pdGVtLnhtbAppbmRleCA1ODY4ODFkLi5jZTQ5NDJkIDEwMDY0NAotLS0gYS90ZXN0cy9sZWFuYmFja2phbmsvYXBwL3Jlcy9sYXlvdXQvaWNvbl9oZWFkZXJfaXRlbS54bWwKKysrIGIvdGVzdHMvbGVhbmJhY2tqYW5rL2FwcC9yZXMvbGF5b3V0L2ljb25faGVhZGVyX2l0ZW0ueG1sCkBAIC0xNCw5ICsxNCwxMSBAQAogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGFuZHJvaWQuc3VwcG9ydC52MTcubGVhbmJhY2sud2lkZ2V0Lk5vbk92ZXJsYXBwaW5nTGluZWFyTGF5b3V0Cis8YW5kcm9pZHgubGVhbmJhY2sud2lkZ2V0Lk5vbk92ZXJsYXBwaW5nTGluZWFyTGF5b3V0CiAgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgogICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgYW5kcm9pZDpmb2N1c2FibGU9InRydWUiCisgICAgYW5kcm9pZDpmb2N1c2FibGVJblRvdWNoTW9kZT0idHJ1ZSIKICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgogICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ij4KIApAQCAtMzAsNCArMzIsNCBAQAogICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjZkcCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiIC8+Ci08L2FuZHJvaWQuc3VwcG9ydC52MTcubGVhbmJhY2sud2lkZ2V0Lk5vbk92ZXJsYXBwaW5nTGluZWFyTGF5b3V0PgorPC9hbmRyb2lkeC5sZWFuYmFjay53aWRnZXQuTm9uT3ZlcmxhcHBpbmdMaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS90ZXN0cy9sZWFuYmFja2phbmsvYXBwL3Jlcy9sYXlvdXQvbW92aWVfY2FyZC54bWwgYi90ZXN0cy9sZWFuYmFja2phbmsvYXBwL3Jlcy9sYXlvdXQvbW92aWVfY2FyZC54bWwKaW5kZXggYzYzODQxZC4uYWNiNWQ2NyAxMDA2NDQKLS0tIGEvdGVzdHMvbGVhbmJhY2tqYW5rL2FwcC9yZXMvbGF5b3V0L21vdmllX2NhcmQueG1sCisrKyBiL3Rlc3RzL2xlYW5iYWNramFuay9hcHAvcmVzL2xheW91dC9tb3ZpZV9jYXJkLnhtbApAQCAtMSw2ICsxLDYgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+CiAKLTxhbmRyb2lkLnN1cHBvcnQudjE3LmxlYW5iYWNrLndpZGdldC5Ob25PdmVybGFwcGluZ0xpbmVhckxheW91dAorPGFuZHJvaWR4LmxlYW5iYWNrLndpZGdldC5Ob25PdmVybGFwcGluZ0xpbmVhckxheW91dAogICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCiAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgpAQCAtMjAsNCArMjAsNCBAQAogICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxMGRwIgogICAgICAgIGFuZHJvaWQ6cGFkZGluZ0JvdHRvbT0iMTBkcCIKICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIxMGRwIiAvPgotPC9hbmRyb2lkLnN1cHBvcnQudjE3LmxlYW5iYWNrLndpZGdldC5Ob25PdmVybGFwcGluZ0xpbmVhckxheW91dD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8L2FuZHJvaWR4LmxlYW5iYWNrLndpZGdldC5Ob25PdmVybGFwcGluZ0xpbmVhckxheW91dD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9sZWFuYmFja2phbmsvYXBwL3NyYy9hbmRyb2lkL2xlYW5iYWNramFuay9hcHAvcHJlc2VudGVyL0NhcmRQcmVzZW50ZXIuamF2YSBiL3Rlc3RzL2xlYW5iYWNramFuay9hcHAvc3JjL2FuZHJvaWQvbGVhbmJhY2tqYW5rL2FwcC9wcmVzZW50ZXIvQ2FyZFByZXNlbnRlci5qYXZhCmluZGV4IDRlNmI1NWQuLjFkYmY1YzAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2xlYW5iYWNramFuay9hcHAvc3JjL2FuZHJvaWQvbGVhbmJhY2tqYW5rL2FwcC9wcmVzZW50ZXIvQ2FyZFByZXNlbnRlci5qYXZhCisrKyBiL3Rlc3RzL2xlYW5iYWNramFuay9hcHAvc3JjL2FuZHJvaWQvbGVhbmJhY2tqYW5rL2FwcC9wcmVzZW50ZXIvQ2FyZFByZXNlbnRlci5qYXZhCkBAIC0xOCw4ICsxOCw4IEBACiAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjE3LmxlYW5iYWNrLndpZGdldC5JbWFnZUNhcmRWaWV3OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52MTcubGVhbmJhY2sud2lkZ2V0LlByZXNlbnRlcjsKK2ltcG9ydCBhbmRyb2lkeC5sZWFuYmFjay53aWRnZXQuSW1hZ2VDYXJkVmlldzsKK2ltcG9ydCBhbmRyb2lkeC5sZWFuYmFjay53aWRnZXQuUHJlc2VudGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CiAKIGltcG9ydCBjb20uYnVtcHRlY2guZ2xpZGUuR2xpZGU7CmRpZmYgLS1naXQgYS90ZXN0cy9sZWFuYmFja2phbmsvYXBwL3NyYy9hbmRyb2lkL2xlYW5iYWNramFuay9hcHAvcHJlc2VudGVyL0ljb25IZWFkZXJJdGVtUHJlc2VudGVyLmphdmEgYi90ZXN0cy9sZWFuYmFja2phbmsvYXBwL3NyYy9hbmRyb2lkL2xlYW5iYWNramFuay9hcHAvcHJlc2VudGVyL0ljb25IZWFkZXJJdGVtUHJlc2VudGVyLmphdmEKaW5kZXggMzJkYWUzNS4uNTEzMWM2MyAxMDA2NDQKLS0tIGEvdGVzdHMvbGVhbmJhY2tqYW5rL2FwcC9zcmMvYW5kcm9pZC9sZWFuYmFja2phbmsvYXBwL3ByZXNlbnRlci9JY29uSGVhZGVySXRlbVByZXNlbnRlci5qYXZhCisrKyBiL3Rlc3RzL2xlYW5iYWNramFuay9hcHAvc3JjL2FuZHJvaWQvbGVhbmJhY2tqYW5rL2FwcC9wcmVzZW50ZXIvSWNvbkhlYWRlckl0ZW1QcmVzZW50ZXIuamF2YQpAQCAtMTgsMTAgKzE4LDEwIEBACiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52MTcubGVhbmJhY2sud2lkZ2V0LkhlYWRlckl0ZW07Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnYxNy5sZWFuYmFjay53aWRnZXQuTGlzdFJvdzsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjE3LmxlYW5iYWNrLndpZGdldC5QcmVzZW50ZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnYxNy5sZWFuYmFjay53aWRnZXQuUm93SGVhZGVyUHJlc2VudGVyOworaW1wb3J0IGFuZHJvaWR4LmxlYW5iYWNrLndpZGdldC5IZWFkZXJJdGVtOworaW1wb3J0IGFuZHJvaWR4LmxlYW5iYWNrLndpZGdldC5MaXN0Um93OworaW1wb3J0IGFuZHJvaWR4LmxlYW5iYWNrLndpZGdldC5QcmVzZW50ZXI7CitpbXBvcnQgYW5kcm9pZHgubGVhbmJhY2sud2lkZ2V0LlJvd0hlYWRlclByZXNlbnRlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKZGlmZiAtLWdpdCBhL3Rlc3RzL2xlYW5iYWNramFuay9hcHAvc3JjL2FuZHJvaWQvbGVhbmJhY2tqYW5rL2FwcC91aS9NYWluRnJhZ21lbnQuamF2YSBiL3Rlc3RzL2xlYW5iYWNramFuay9hcHAvc3JjL2FuZHJvaWQvbGVhbmJhY2tqYW5rL2FwcC91aS9NYWluRnJhZ21lbnQuamF2YQppbmRleCBlZTA0OTI0Li4zMDQ3YWVlIDEwMDY0NAotLS0gYS90ZXN0cy9sZWFuYmFja2phbmsvYXBwL3NyYy9hbmRyb2lkL2xlYW5iYWNramFuay9hcHAvdWkvTWFpbkZyYWdtZW50LmphdmEKKysrIGIvdGVzdHMvbGVhbmJhY2tqYW5rL2FwcC9zcmMvYW5kcm9pZC9sZWFuYmFja2phbmsvYXBwL3VpL01haW5GcmFnbWVudC5qYXZhCkBAIC0yNSwxNSArMjUsMTUgQEAKIGltcG9ydCBhbmRyb2lkLmxlYW5iYWNramFuay5hcHAucHJlc2VudGVyLkljb25IZWFkZXJJdGVtUHJlc2VudGVyOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjE3LmxlYW5iYWNrLmFwcC5CYWNrZ3JvdW5kTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjE3LmxlYW5iYWNrLmFwcC5Ccm93c2VGcmFnbWVudDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjE3LmxlYW5iYWNrLndpZGdldC5BcnJheU9iamVjdEFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnYxNy5sZWFuYmFjay53aWRnZXQuSGVhZGVySXRlbTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjE3LmxlYW5iYWNrLndpZGdldC5MaXN0Um93OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52MTcubGVhbmJhY2sud2lkZ2V0Lkxpc3RSb3dQcmVzZW50ZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnYxNy5sZWFuYmFjay53aWRnZXQuUHJlc2VudGVyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52MTcubGVhbmJhY2sud2lkZ2V0LlByZXNlbnRlclNlbGVjdG9yOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52MTcubGVhbmJhY2sud2lkZ2V0LlNoYWRvd092ZXJsYXlIZWxwZXI7CitpbXBvcnQgYW5kcm9pZHgubGVhbmJhY2suYXBwLkJhY2tncm91bmRNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWR4LmxlYW5iYWNrLmFwcC5Ccm93c2VGcmFnbWVudDsKK2ltcG9ydCBhbmRyb2lkeC5sZWFuYmFjay53aWRnZXQuQXJyYXlPYmplY3RBZGFwdGVyOworaW1wb3J0IGFuZHJvaWR4LmxlYW5iYWNrLndpZGdldC5IZWFkZXJJdGVtOworaW1wb3J0IGFuZHJvaWR4LmxlYW5iYWNrLndpZGdldC5MaXN0Um93OworaW1wb3J0IGFuZHJvaWR4LmxlYW5iYWNrLndpZGdldC5MaXN0Um93UHJlc2VudGVyOworaW1wb3J0IGFuZHJvaWR4LmxlYW5iYWNrLndpZGdldC5QcmVzZW50ZXI7CitpbXBvcnQgYW5kcm9pZHgubGVhbmJhY2sud2lkZ2V0LlByZXNlbnRlclNlbGVjdG9yOworaW1wb3J0IGFuZHJvaWR4LmxlYW5iYWNrLndpZGdldC5TaGFkb3dPdmVybGF5SGVscGVyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvbGVhbmJhY2tqYW5rL3NyYy9hbmRyb2lkL2xlYW5iYWNramFuay9jdHMvQ3RzRGV2aWNlTGVhbmJhY2suamF2YSBiL3Rlc3RzL2xlYW5iYWNramFuay9zcmMvYW5kcm9pZC9sZWFuYmFja2phbmsvY3RzL0N0c0RldmljZUxlYW5iYWNrLmphdmEKaW5kZXggZGVkOWVhMS4uNDdhZTFlZCAxMDA2NDQKLS0tIGEvdGVzdHMvbGVhbmJhY2tqYW5rL3NyYy9hbmRyb2lkL2xlYW5iYWNramFuay9jdHMvQ3RzRGV2aWNlTGVhbmJhY2suamF2YQorKysgYi90ZXN0cy9sZWFuYmFja2phbmsvc3JjL2FuZHJvaWQvbGVhbmJhY2tqYW5rL2N0cy9DdHNEZXZpY2VMZWFuYmFjay5qYXZhCkBAIC0xOSwxMiArMTksMTIgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5sZWFuYmFja2phbmsuYXBwLkludGVudEtleXM7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5qYW5rLkdmeE1vbml0b3I7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuamFuay5KYW5rVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5qYW5rLldpbmRvd0NvbnRlbnRGcmFtZVN0YXRzTW9uaXRvcjsKIGltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC51aWF1dG9tYXRvci5CeTsKIGltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC51aWF1dG9tYXRvci5VbnRpbDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5qYW5rLkdmeE1vbml0b3I7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5qYW5rLkphbmtUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuamFuay5XaW5kb3dDb250ZW50RnJhbWVTdGF0c01vbml0b3I7CiAKIHB1YmxpYyBjbGFzcyBDdHNEZXZpY2VMZWFuYmFjayBleHRlbmRzIEN0c0phbmtUZXN0QmFzZSB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJDdHNEZXZpY2VMZWFuYmFjayI7CkBAIC0zMiw3ICszMiw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBXQUlUX1RJTUVPVVQgPSA1ICogTUlMTElTX1BFUl9TRUNPTkQ7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNDUk9MTF9DT1VOVCA9IDEwMDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0NST0xMX0lOVEVSVkFMX01JTExJUyA9IDIwMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFJFX1NDUk9MTF9ERUxBWV9NSUxMSVMgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUkVfU0NST0xMX0RFTEFZX01JTExJUyA9IDUwMDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFJFX1NDUk9MTF9JRExFX1RJTUUgPSAyICogTUlMTElTX1BFUl9TRUNPTkQ7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNBTVBMSU5HX0RVUkFUSU9OX1NFQ09ORFMgPSAyOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTQU1QTElOR19EVVJBVElPTl9NSUxMSVMgPQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGVhbmJhY2tqYW5rL3NyYy9hbmRyb2lkL2xlYW5iYWNramFuay9jdHMvQ3RzSmFua1Rlc3RCYXNlLmphdmEgYi90ZXN0cy9sZWFuYmFja2phbmsvc3JjL2FuZHJvaWQvbGVhbmJhY2tqYW5rL2N0cy9DdHNKYW5rVGVzdEJhc2UuamF2YQppbmRleCA0NzQ5ZmUzLi43MjVjMDE1IDEwMDY0NAotLS0gYS90ZXN0cy9sZWFuYmFja2phbmsvc3JjL2FuZHJvaWQvbGVhbmJhY2tqYW5rL2N0cy9DdHNKYW5rVGVzdEJhc2UuamF2YQorKysgYi90ZXN0cy9sZWFuYmFja2phbmsvc3JjL2FuZHJvaWQvbGVhbmJhY2tqYW5rL2N0cy9DdHNKYW5rVGVzdEJhc2UuamF2YQpAQCAtMTcsMTEgKzE3LDEyIEBACiBwYWNrYWdlIGFuZHJvaWQubGVhbmJhY2tqYW5rLmN0czsKIAogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmphbmsuR2Z4TW9uaXRvcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5qYW5rLkphbmtUZXN0QmFzZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5qYW5rLldpbmRvd0NvbnRlbnRGcmFtZVN0YXRzTW9uaXRvcjsKIGltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC51aWF1dG9tYXRvci5VaURldmljZTsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuamFuay5HZnhNb25pdG9yOworaW1wb3J0IGFuZHJvaWR4LnRlc3QuamFuay5KYW5rVGVzdEJhc2U7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5qYW5rLldpbmRvd0NvbnRlbnRGcmFtZVN0YXRzTW9uaXRvcjsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuRGV2aWNlUmVwb3J0TG9nOwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuUmVzdWx0VHlwZTsKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlJlc3VsdFVuaXQ7CmRpZmYgLS1naXQgYS90ZXN0cy9saWJjb3JlL2phdmF1dGlsY29sbGVjdGlvbnMvQW5kcm9pZC5tayBiL3Rlc3RzL2xpYmNvcmUvamF2YXV0aWxjb2xsZWN0aW9ucy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmJjZWY1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL2xpYmNvcmUvamF2YXV0aWxjb2xsZWN0aW9ucy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfUFJFQlVJTFRfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKLSAgICBndWF2YS0yMC4wLXByZWJ1aWx0OmxpYnMvZ3VhdmEtMjAuMC5qYXIgXAotICAgIGd1YXZhLXRlc3RsaWItMjAuMC1wcmVidWlsdDpsaWJzL2d1YXZhLXRlc3RsaWItMjAuMC5qYXIKLWluY2x1ZGUgJChCVUlMRF9NVUxUSV9QUkVCVUlMVCkKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCi0gICAgY3RzdGVzdHJ1bm5lciBcCi0gICAgZ3VhdmEtMjAuMC1wcmVidWlsdCBcCi0gICAgZ3VhdmEtdGVzdGxpYi0yMC4wLXByZWJ1aWx0Ci1MT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCi1MT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzTGliY29yZUphdmFVdGlsQ29sbGVjdGlvbnNUZXN0Q2FzZXMKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCi0KLWluY2x1ZGUgJChCVUlMRF9DVFNfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYmNvcmUvamF2YXV0aWxjb2xsZWN0aW9ucy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvbGliY29yZS9qYXZhdXRpbGNvbGxlY3Rpb25zL0FuZHJvaWRNYW5pZmVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZThjZWUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvbGliY29yZS9qYXZhdXRpbGNvbGxlY3Rpb25zL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLQotICB+IENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gIH4KLSAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCi0gIC0tPgotCi08bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICAgIHBhY2thZ2U9ImxpYmNvcmUuamF2YS51dGlsLmNvbGxlY3Rpb250ZXN0cyI+Ci0KLSAgICA8IS0tIEFuZHJvaWRKVW5pdFJ1bm5lciBuZWVkcyBhIGxhcmdlSGVhcCB0byBjb2xsZWN0IHRoZSB+IDI0MGsgdGVzdCBtZXRob2RzIHRvIHJ1bi4gLS0+Ci0gICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFyZ2VIZWFwPSJ0cnVlIj4KLSAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiLz4KLSAgICA8L2FwcGxpY2F0aW9uPgotCi0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCi0gICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImxpYmNvcmUuamF2YS51dGlsLmNvbGxlY3Rpb250ZXN0cyIKLSAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IlRlc3RzIGZvciBDb2xsZWN0aW9uIGltcGxlbWVudGF0aW9ucyBpbiBqYXZhLnV0aWwiPgotICAgIDwvaW5zdHJ1bWVudGF0aW9uPgotCi08L21hbmlmZXN0PgotCmRpZmYgLS1naXQgYS90ZXN0cy9saWJjb3JlL2phdmF1dGlsY29sbGVjdGlvbnMvQW5kcm9pZFRlc3QueG1sIGIvdGVzdHMvbGliY29yZS9qYXZhdXRpbGNvbGxlY3Rpb25zL0FuZHJvaWRUZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzViZTI4OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9saWJjb3JlL2phdmF1dGlsY29sbGVjdGlvbnMvQW5kcm9pZFRlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBMaWJjb3JlIGphdmEudXRpbCBDb2xsZWN0aW9uIHRlc3QgY2FzZXMiPgotICAgIDxvcHRpb24gbmFtZT0ibm90LXNoYXJkYWJsZSIgdmFsdWU9InRydWUiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJsaWJjb3JlIiAvPgotICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgotICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJDdHNMaWJjb3JlSmF2YVV0aWxDb2xsZWN0aW9uc1Rlc3RDYXNlcy5hcGsiIC8+Ci0gICAgPC90YXJnZXRfcHJlcGFyZXI+Ci0gICAgPCEtLQotICAgIE5vdGVzIGFzIG9mIE5vdmVtYmVyIDIwMTY6Ci0KLSAgICAxLikgV2hlbiB0aGUgcnVubmVyIGNvbGxlY3RzIHRoZSBzZXQgb2YgdGVzdHMgdG8gcnVuLCBpdAotICAgIChhKSBhdHRlbXB0cyB0byBkaXJlY3RseSBydW4gVGVzdENhc2Ugc3ViY2xhc3NlcyBmcm9tIGd1YXZhLXRlc3RsaWIsIHdoaWNoIHRoZXkgZG9uJ3Qgc3VwcG9ydCwKLSAgICAoYikgZG9lc24ndCBmaW5kIGNsYXNzZXMgd2l0aCBzdWl0ZSgpIG1ldGhvZHMuCi0gICAgKGMpIHJ1bnMgb3V0IG9mIG1lbW9yeSBpZiBhdHRlbXB0aW5nIHRvIHJ1biBhbGwgb2YgdGhlID4gMjIwayB0ZXN0cyBpbiBhIHNpbmdsZSBnbwotICAgIEJyZWFraW5nIHRoZSB0ZXN0cyBkb3duIGludG8gY2h1bmtzIG9mIH4gNDAtNTBrIHRlc3RzIGVhY2gsIGFuZCBleHBsaWNpdGx5IHNwZWNpZnlpbmcgdGhlCi0gICAgc3VpdGVzIHRvIHJ1biwgc29sdmVzIHRoZXNlIHByb2JsZW1zLgotCi0gICAgMi4pIER1ZSB0byBodHRwOi8vYi8zMzA2ODExMCB0aGUgY2xhc3NlcyB3aXRoIHRoZSBzdWl0ZSgpIG1ldGhvZHMgKGluIHRoZSAic3VpdGUiIHN1Yi1wYWNrYWdlKQotICAgIG5lZWQgdG8gZXh0ZW5kIFRlc3RTdWl0ZSwgd2hpY2ggbWVhbnMgdGhhdCB0aGV5IG5lZWQgdG8gZGVsZWdhdGUgdG8gc2VwYXJhdGUgY2xhc3NlcyAoaW4gdGhlCi0gICAgICJ0ZXN0cyIgc3ViLXBhY2thZ2UpIHRoYXQgZXh0ZW5kIGNsYXNzZXMgZnJvbSBndWF2YS10ZXN0bGliLgotICAgIC0tPgotICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5BbmRyb2lkSlVuaXRUZXN0IiA+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0icGFja2FnZSIgdmFsdWU9ImxpYmNvcmUuamF2YS51dGlsLmNvbGxlY3Rpb250ZXN0cyIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGFzcyIgdmFsdWU9ImxpYmNvcmUuamF2YS51dGlsLnN1aXRlLkNvbmN1cnJlbnRTa2lwTGlzdE1hcE5hdHVyYWxTdWl0ZSIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJydW50aW1lLWhpbnQiIHZhbHVlPSIxMG0iIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC10aW1lb3V0IiB2YWx1ZT0iMTIwMDAwMCIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJzaGVsbC10aW1lb3V0IiB2YWx1ZT0iMTQwMDAwMCIgLz4KLSAgICA8L3Rlc3Q+Ci0gICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkFuZHJvaWRKVW5pdFRlc3QiID4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJwYWNrYWdlIiB2YWx1ZT0ibGliY29yZS5qYXZhLnV0aWwuY29sbGVjdGlvbnRlc3RzIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9ImNsYXNzIiB2YWx1ZT0ibGliY29yZS5qYXZhLnV0aWwuc3VpdGUuQ29uY3VycmVudFNraXBMaXN0TWFwV2l0aENvbXBhcmF0b3JTdWl0ZSIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJydW50aW1lLWhpbnQiIHZhbHVlPSIxMG0iIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC10aW1lb3V0IiB2YWx1ZT0iMTIwMDAwMCIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJzaGVsbC10aW1lb3V0IiB2YWx1ZT0iMTQwMDAwMCIgLz4KLSAgICA8L3Rlc3Q+Ci0gICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkFuZHJvaWRKVW5pdFRlc3QiID4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJwYWNrYWdlIiB2YWx1ZT0ibGliY29yZS5qYXZhLnV0aWwuY29sbGVjdGlvbnRlc3RzIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9ImNsYXNzIiB2YWx1ZT0ibGliY29yZS5qYXZhLnV0aWwuc3VpdGUuVHJlZU1hcE5hdHVyYWxTdWl0ZSIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJydW50aW1lLWhpbnQiIHZhbHVlPSIxMG0iIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC10aW1lb3V0IiB2YWx1ZT0iMTIwMDAwMCIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJzaGVsbC10aW1lb3V0IiB2YWx1ZT0iMTQwMDAwMCIgLz4KLSAgICA8L3Rlc3Q+Ci0gICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkFuZHJvaWRKVW5pdFRlc3QiID4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJwYWNrYWdlIiB2YWx1ZT0ibGliY29yZS5qYXZhLnV0aWwuY29sbGVjdGlvbnRlc3RzIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9ImNsYXNzIiB2YWx1ZT0ibGliY29yZS5qYXZhLnV0aWwuc3VpdGUuVHJlZU1hcFdpdGhDb21wYXJhdG9yU3VpdGUiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0icnVudGltZS1oaW50IiB2YWx1ZT0iMTBtIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtdGltZW91dCIgdmFsdWU9IjEyMDAwMDAiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ic2hlbGwtdGltZW91dCIgdmFsdWU9IjE0MDAwMDAiIC8+Ci0gICAgPC90ZXN0PgotICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5BbmRyb2lkSlVuaXRUZXN0IiA+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0icGFja2FnZSIgdmFsdWU9ImxpYmNvcmUuamF2YS51dGlsLmNvbGxlY3Rpb250ZXN0cyIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGFzcyIgdmFsdWU9ImxpYmNvcmUuamF2YS51dGlsLnN1aXRlLk90aGVyQ29sbGVjdGlvbnNTdWl0ZSIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJydW50aW1lLWhpbnQiIHZhbHVlPSI4bSIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXRpbWVvdXQiIHZhbHVlPSIxMjAwMDAwIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9InNoZWxsLXRpbWVvdXQiIHZhbHVlPSIxNDAwMDAwIiAvPgotICAgIDwvdGVzdD4KLTwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYmNvcmUvamF2YXV0aWxjb2xsZWN0aW9ucy9saWJzL2d1YXZhLTIwLjAuamFyIGIvdGVzdHMvbGliY29yZS9qYXZhdXRpbGNvbGxlY3Rpb25zL2xpYnMvZ3VhdmEtMjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMjc3MmYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvbGliY29yZS9qYXZhdXRpbGNvbGxlY3Rpb25zL2xpYnMvZ3VhdmEtMjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9saWJjb3JlL2phdmF1dGlsY29sbGVjdGlvbnMvbGlicy9ndWF2YS10ZXN0bGliLTIwLjAuamFyIGIvdGVzdHMvbGliY29yZS9qYXZhdXRpbGNvbGxlY3Rpb25zL2xpYnMvZ3VhdmEtdGVzdGxpYi0yMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRkOGQ5MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9saWJjb3JlL2phdmF1dGlsY29sbGVjdGlvbnMvbGlicy9ndWF2YS10ZXN0bGliLTIwLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvbGliY29yZS9qYXZhdXRpbGNvbGxlY3Rpb25zL3NyYy9saWJjb3JlL2phdmEvdXRpbC9zdWl0ZS9Db25jdXJyZW50U2tpcExpc3RNYXBOYXR1cmFsU3VpdGUuamF2YSBiL3Rlc3RzL2xpYmNvcmUvamF2YXV0aWxjb2xsZWN0aW9ucy9zcmMvbGliY29yZS9qYXZhL3V0aWwvc3VpdGUvQ29uY3VycmVudFNraXBMaXN0TWFwTmF0dXJhbFN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMjE5MGIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvbGliY29yZS9qYXZhdXRpbGNvbGxlY3Rpb25zL3NyYy9saWJjb3JlL2phdmEvdXRpbC9zdWl0ZS9Db25jdXJyZW50U2tpcExpc3RNYXBOYXR1cmFsU3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotcGFja2FnZSBsaWJjb3JlLmphdmEudXRpbC5zdWl0ZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBsaWJjb3JlLmphdmEudXRpbC50ZXN0cy5BbmRyb2lkVGVzdHNGb3JNYXBzSW5KYXZhVXRpbDsKLWltcG9ydCBsaWJjb3JlLmphdmEudXRpbC50ZXN0cy5BbmRyb2lkVGVzdHNGb3JNYXBzSW5KYXZhVXRpbC5NYXBzVG9UZXN0OwotCi1wdWJsaWMgY2xhc3MgQ29uY3VycmVudFNraXBMaXN0TWFwTmF0dXJhbFN1aXRlIGV4dGVuZHMgVGVzdFN1aXRlIHsKLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQW5kcm9pZFRlc3RzRm9yTWFwc0luSmF2YVV0aWwoTWFwc1RvVGVzdC5DT05DVVJSRU5UX1NLSVBfTElTVF9NQVBfTkFUVVJBTCkKLSAgICAgICAgICAgICAgICAuYWxsVGVzdHMoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9saWJjb3JlL2phdmF1dGlsY29sbGVjdGlvbnMvc3JjL2xpYmNvcmUvamF2YS91dGlsL3N1aXRlL0NvbmN1cnJlbnRTa2lwTGlzdE1hcFdpdGhDb21wYXJhdG9yU3VpdGUuamF2YSBiL3Rlc3RzL2xpYmNvcmUvamF2YXV0aWxjb2xsZWN0aW9ucy9zcmMvbGliY29yZS9qYXZhL3V0aWwvc3VpdGUvQ29uY3VycmVudFNraXBMaXN0TWFwV2l0aENvbXBhcmF0b3JTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzhlNzIxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL2xpYmNvcmUvamF2YXV0aWxjb2xsZWN0aW9ucy9zcmMvbGliY29yZS9qYXZhL3V0aWwvc3VpdGUvQ29uY3VycmVudFNraXBMaXN0TWFwV2l0aENvbXBhcmF0b3JTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi1wYWNrYWdlIGxpYmNvcmUuamF2YS51dGlsLnN1aXRlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IGxpYmNvcmUuamF2YS51dGlsLnRlc3RzLkFuZHJvaWRUZXN0c0Zvck1hcHNJbkphdmFVdGlsOwotaW1wb3J0IGxpYmNvcmUuamF2YS51dGlsLnRlc3RzLkFuZHJvaWRUZXN0c0Zvck1hcHNJbkphdmFVdGlsLk1hcHNUb1Rlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBDb25jdXJyZW50U2tpcExpc3RNYXBXaXRoQ29tcGFyYXRvclN1aXRlIGV4dGVuZHMgVGVzdFN1aXRlIHsKLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQW5kcm9pZFRlc3RzRm9yTWFwc0luSmF2YVV0aWwoCi0gICAgICAgICAgICAgICAgTWFwc1RvVGVzdC5DT05DVVJSRU5UX1NLSVBfTElTVF9NQVBfV0lUSF9DT01QQVJBVE9SKS5hbGxUZXN0cygpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGliY29yZS9qYXZhdXRpbGNvbGxlY3Rpb25zL3NyYy9saWJjb3JlL2phdmEvdXRpbC9zdWl0ZS9PdGhlckNvbGxlY3Rpb25zU3VpdGUuamF2YSBiL3Rlc3RzL2xpYmNvcmUvamF2YXV0aWxjb2xsZWN0aW9ucy9zcmMvbGliY29yZS9qYXZhL3V0aWwvc3VpdGUvT3RoZXJDb2xsZWN0aW9uc1N1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhZjQ1ZjQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvbGliY29yZS9qYXZhdXRpbGNvbGxlY3Rpb25zL3NyYy9saWJjb3JlL2phdmEvdXRpbC9zdWl0ZS9PdGhlckNvbGxlY3Rpb25zU3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotcGFja2FnZSBsaWJjb3JlLmphdmEudXRpbC5zdWl0ZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBsaWJjb3JlLmphdmEudXRpbC50ZXN0cy5BbmRyb2lkVGVzdHNGb3JMaXN0c0luSmF2YVV0aWw7Ci1pbXBvcnQgbGliY29yZS5qYXZhLnV0aWwudGVzdHMuQW5kcm9pZFRlc3RzRm9yTWFwc0luSmF2YVV0aWw7Ci1pbXBvcnQgbGliY29yZS5qYXZhLnV0aWwudGVzdHMuQW5kcm9pZFRlc3RzRm9yTWFwc0luSmF2YVV0aWwuTWFwc1RvVGVzdDsKLWltcG9ydCBsaWJjb3JlLmphdmEudXRpbC50ZXN0cy5BbmRyb2lkVGVzdHNGb3JRdWV1ZXNJbkphdmFVdGlsOwotaW1wb3J0IGxpYmNvcmUuamF2YS51dGlsLnRlc3RzLkFuZHJvaWRUZXN0c0ZvclNldHNJbkphdmFVdGlsOwotCi0vKioKLSAqIEEgc3VpdGUgb2YgYWxsIGd1YXZhLXRlc3RsaWIgQ29sbGVjdGlvbiB0ZXN0cyBub3QgY292ZXJlZCBieSB0aGUgb3RoZXIgc3VpdGVzIGluIHRoaXMKLSAqIHBhY2thZ2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBPdGhlckNvbGxlY3Rpb25zU3VpdGUgZXh0ZW5kcyBUZXN0U3VpdGUgewotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgVGVzdFN1aXRlIHJlc3VsdCA9IG5ldyBUZXN0U3VpdGUoKTsKLSAgICAgICAgcmVzdWx0LmFkZFRlc3QobmV3IEFuZHJvaWRUZXN0c0Zvckxpc3RzSW5KYXZhVXRpbCgpLmFsbFRlc3RzKCkpOwotICAgICAgICByZXN1bHQuYWRkVGVzdChuZXcgQW5kcm9pZFRlc3RzRm9yTWFwc0luSmF2YVV0aWwoTWFwc1RvVGVzdC5PVEhFUikuYWxsVGVzdHMoKSk7Ci0gICAgICAgIHJlc3VsdC5hZGRUZXN0KG5ldyBBbmRyb2lkVGVzdHNGb3JRdWV1ZXNJbkphdmFVdGlsKCkuYWxsVGVzdHMoKSk7Ci0gICAgICAgIHJlc3VsdC5hZGRUZXN0KG5ldyBBbmRyb2lkVGVzdHNGb3JTZXRzSW5KYXZhVXRpbCgpLmFsbFRlc3RzKCkpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYmNvcmUvamF2YXV0aWxjb2xsZWN0aW9ucy9zcmMvbGliY29yZS9qYXZhL3V0aWwvc3VpdGUvVHJlZU1hcE5hdHVyYWxTdWl0ZS5qYXZhIGIvdGVzdHMvbGliY29yZS9qYXZhdXRpbGNvbGxlY3Rpb25zL3NyYy9saWJjb3JlL2phdmEvdXRpbC9zdWl0ZS9UcmVlTWFwTmF0dXJhbFN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4YTc2MjQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvbGliY29yZS9qYXZhdXRpbGNvbGxlY3Rpb25zL3NyYy9saWJjb3JlL2phdmEvdXRpbC9zdWl0ZS9UcmVlTWFwTmF0dXJhbFN1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLXBhY2thZ2UgbGliY29yZS5qYXZhLnV0aWwuc3VpdGU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgbGliY29yZS5qYXZhLnV0aWwudGVzdHMuQW5kcm9pZFRlc3RzRm9yTWFwc0luSmF2YVV0aWw7Ci1pbXBvcnQgbGliY29yZS5qYXZhLnV0aWwudGVzdHMuQW5kcm9pZFRlc3RzRm9yTWFwc0luSmF2YVV0aWwuTWFwc1RvVGVzdDsKLQotcHVibGljIGNsYXNzIFRyZWVNYXBOYXR1cmFsU3VpdGUgZXh0ZW5kcyBUZXN0U3VpdGUgewotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBBbmRyb2lkVGVzdHNGb3JNYXBzSW5KYXZhVXRpbChNYXBzVG9UZXN0LlRSRUVfTUFQX05BVFVSQUwpLmFsbFRlc3RzKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGliY29yZS9qYXZhdXRpbGNvbGxlY3Rpb25zL3NyYy9saWJjb3JlL2phdmEvdXRpbC9zdWl0ZS9UcmVlTWFwV2l0aENvbXBhcmF0b3JTdWl0ZS5qYXZhIGIvdGVzdHMvbGliY29yZS9qYXZhdXRpbGNvbGxlY3Rpb25zL3NyYy9saWJjb3JlL2phdmEvdXRpbC9zdWl0ZS9UcmVlTWFwV2l0aENvbXBhcmF0b3JTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTZmZDZmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL2xpYmNvcmUvamF2YXV0aWxjb2xsZWN0aW9ucy9zcmMvbGliY29yZS9qYXZhL3V0aWwvc3VpdGUvVHJlZU1hcFdpdGhDb21wYXJhdG9yU3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotcGFja2FnZSBsaWJjb3JlLmphdmEudXRpbC5zdWl0ZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBsaWJjb3JlLmphdmEudXRpbC50ZXN0cy5BbmRyb2lkVGVzdHNGb3JNYXBzSW5KYXZhVXRpbDsKLWltcG9ydCBsaWJjb3JlLmphdmEudXRpbC50ZXN0cy5BbmRyb2lkVGVzdHNGb3JNYXBzSW5KYXZhVXRpbC5NYXBzVG9UZXN0OwotCi1wdWJsaWMgY2xhc3MgVHJlZU1hcFdpdGhDb21wYXJhdG9yU3VpdGUgZXh0ZW5kcyBUZXN0U3VpdGUgewotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBBbmRyb2lkVGVzdHNGb3JNYXBzSW5KYXZhVXRpbChNYXBzVG9UZXN0LlRSRUVfTUFQX1dJVEhfQ09NUEFSQVRPUikuYWxsVGVzdHMoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9saWJjb3JlL2phdmF1dGlsY29sbGVjdGlvbnMvc3JjL2xpYmNvcmUvamF2YS91dGlsL3Rlc3RzL0FuZHJvaWRUZXN0c0Zvckxpc3RzSW5KYXZhVXRpbC5qYXZhIGIvdGVzdHMvbGliY29yZS9qYXZhdXRpbGNvbGxlY3Rpb25zL3NyYy9saWJjb3JlL2phdmEvdXRpbC90ZXN0cy9BbmRyb2lkVGVzdHNGb3JMaXN0c0luSmF2YVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ5MTc3Yy4uMDAwMDAwMAotLS0gYS90ZXN0cy9saWJjb3JlL2phdmF1dGlsY29sbGVjdGlvbnMvc3JjL2xpYmNvcmUvamF2YS91dGlsL3Rlc3RzL0FuZHJvaWRUZXN0c0Zvckxpc3RzSW5KYXZhVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi1wYWNrYWdlIGxpYmNvcmUuamF2YS51dGlsLnRlc3RzOwotCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC50ZXN0aW5nLlRlc3RzRm9yTGlzdHNJbkphdmFVdGlsOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QudGVzdGluZy50ZXN0ZXJzLkNvbGxlY3Rpb25Ub0FycmF5VGVzdGVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi0vKioKLSAqIEd1YXZhLXRlc3RsaWIgdGVzdHMgZm9yIHtAY29kZSBMaXN0fSBpbXBsZW1lbnRhdGlvbnMgZnJvbSB7QGNvZGUgamF2YS51dGlsfS4KLSAqLwotcHVibGljIGNsYXNzIEFuZHJvaWRUZXN0c0Zvckxpc3RzSW5KYXZhVXRpbCBleHRlbmRzIFRlc3RzRm9yTGlzdHNJbkphdmFVdGlsIHsKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQ29sbGVjdGlvbjxNZXRob2Q+IHN1cHByZXNzRm9yQXJyYXlzQXNMaXN0KCkgewotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uKAotICAgICAgICAgICAgICAgIC8vIGh0dHA6Ly9iLzMwODI5NDIxCi0gICAgICAgICAgICAgICAgQ29sbGVjdGlvblRvQXJyYXlUZXN0ZXIuZ2V0VG9BcnJheUlzUGxhaW5PYmplY3RBcnJheU1ldGhvZCgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9saWJjb3JlL2phdmF1dGlsY29sbGVjdGlvbnMvc3JjL2xpYmNvcmUvamF2YS91dGlsL3Rlc3RzL0FuZHJvaWRUZXN0c0Zvck1hcHNJbkphdmFVdGlsLmphdmEgYi90ZXN0cy9saWJjb3JlL2phdmF1dGlsY29sbGVjdGlvbnMvc3JjL2xpYmNvcmUvamF2YS91dGlsL3Rlc3RzL0FuZHJvaWRUZXN0c0Zvck1hcHNJbkphdmFVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExZjBhZmUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvbGliY29yZS9qYXZhdXRpbGNvbGxlY3Rpb25zL3NyYy9saWJjb3JlL2phdmEvdXRpbC90ZXN0cy9BbmRyb2lkVGVzdHNGb3JNYXBzSW5KYXZhVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi1wYWNrYWdlIGxpYmNvcmUuamF2YS51dGlsLnRlc3RzOwotCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC50ZXN0aW5nLlRlc3RzRm9yTWFwc0luSmF2YVV0aWw7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC50ZXN0aW5nLnRlc3RlcnMuQ29sbGVjdGlvbkFkZEFsbFRlc3RlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LnRlc3RpbmcudGVzdGVycy5Db2xsZWN0aW9uQWRkVGVzdGVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOwotCi0vKioKLSAqIEd1YXZhLXRlc3RsaWIgdGVzdHMgZm9yIHtAbGluayBNYXBzVG9UZXN0fSB0aGF0IHdlcmUgc3BlY2lmaWVkIGFzIGEKLSAqIGNvbnN0cnVjdG9yIGFyZ3VtZW50LgotICovCi1wdWJsaWMgY2xhc3MgQW5kcm9pZFRlc3RzRm9yTWFwc0luSmF2YVV0aWwgZXh0ZW5kcyBUZXN0c0Zvck1hcHNJbkphdmFVdGlsIHsKLSAgICBwdWJsaWMgZW51bSBNYXBzVG9UZXN0IHsKLSAgICAgICAgLyoqIEFsbCBNYXBzIG90aGVyIHRoYW4gdGhvc2UgYmVsb3cuICovCi0gICAgICAgIE9USEVSLAotICAgICAgICAvKiogVHJlZU1hbyB3aXRoIG5hdHVyYWwgb3JkZXJpbmcuICovCi0gICAgICAgIFRSRUVfTUFQX05BVFVSQUwsCi0gICAgICAgIC8qKiBUcmVlTWFwIHdpdGggYSBDb21wYXJhdG9yLiAqLwotICAgICAgICBUUkVFX01BUF9XSVRIX0NPTVBBUkFUT1IsCi0gICAgICAgIC8qKiBDb25jdXJyZW50U0tpcExpc3RNYXAgd2l0aCBuYXR1cmFsIG9yZGVyaW5nLiAqLwotICAgICAgICBDT05DVVJSRU5UX1NLSVBfTElTVF9NQVBfTkFUVVJBTCwKLSAgICAgICAgLyoqIENvbmN1cnJlbnRTS2lwTGlzdE1hcCB3aXRoIGEgQ29tcGFyYXRvci4gKi8KLSAgICAgICAgQ09OQ1VSUkVOVF9TS0lQX0xJU1RfTUFQX1dJVEhfQ09NUEFSQVRPUgotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgTWFwc1RvVGVzdCBtYXBzVG9UZXN0OwotCi0gICAgcHVibGljIEFuZHJvaWRUZXN0c0Zvck1hcHNJbkphdmFVdGlsKE1hcHNUb1Rlc3QgbWFwc1RvVGVzdCkgewotICAgICAgICB0aGlzLm1hcHNUb1Rlc3QgPSBPYmplY3RzLnJlcXVpcmVOb25OdWxsKG1hcHNUb1Rlc3QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRlc3RzIGZvciB0aGUge0BsaW5rIE1hcHNUb1Rlc3R9IGZyb20ge0Bjb2RlIGphdmEudXRpbH0uCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIFRlc3QgYWxsVGVzdHMoKSB7Ci0gICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoImphdmEudXRpbCBNYXBzOiAiICsgbWFwc1RvVGVzdCk7Ci0gICAgICAgIHN3aXRjaCAobWFwc1RvVGVzdCkgewotICAgICAgICAgICAgY2FzZSBPVEhFUjoKLSAgICAgICAgICAgICAgICBzdWl0ZS5hZGRUZXN0KHRlc3RzRm9yQ2hlY2tlZE1hcCgpKTsKLSAgICAgICAgICAgICAgICBzdWl0ZS5hZGRUZXN0KHRlc3RzRm9yQ2hlY2tlZFNvcnRlZE1hcCgpKTsKLSAgICAgICAgICAgICAgICBzdWl0ZS5hZGRUZXN0KHRlc3RzRm9yRW1wdHlNYXAoKSk7Ci0gICAgICAgICAgICAgICAgc3VpdGUuYWRkVGVzdCh0ZXN0c0ZvclNpbmdsZXRvbk1hcCgpKTsKLSAgICAgICAgICAgICAgICBzdWl0ZS5hZGRUZXN0KHRlc3RzRm9ySGFzaE1hcCgpKTsKLSAgICAgICAgICAgICAgICBzdWl0ZS5hZGRUZXN0KHRlc3RzRm9yTGlua2VkSGFzaE1hcCgpKTsKLSAgICAgICAgICAgICAgICBzdWl0ZS5hZGRUZXN0KHRlc3RzRm9yRW51bU1hcCgpKTsKLSAgICAgICAgICAgICAgICBzdWl0ZS5hZGRUZXN0KHRlc3RzRm9yQ29uY3VycmVudEhhc2hNYXAoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFRSRUVfTUFQX05BVFVSQUw6Ci0gICAgICAgICAgICAgICAgc3VpdGUuYWRkVGVzdCh0ZXN0c0ZvclRyZWVNYXBOYXR1cmFsKCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBUUkVFX01BUF9XSVRIX0NPTVBBUkFUT1I6Ci0gICAgICAgICAgICAgICAgc3VpdGUuYWRkVGVzdCh0ZXN0c0ZvclRyZWVNYXBXaXRoQ29tcGFyYXRvcigpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ09OQ1VSUkVOVF9TS0lQX0xJU1RfTUFQX05BVFVSQUw6Ci0gICAgICAgICAgICAgICAgc3VpdGUuYWRkVGVzdCh0ZXN0c0ZvckNvbmN1cnJlbnRTa2lwTGlzdE1hcE5hdHVyYWwoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENPTkNVUlJFTlRfU0tJUF9MSVNUX01BUF9XSVRIX0NPTVBBUkFUT1I6Ci0gICAgICAgICAgICAgICAgc3VpdGUuYWRkVGVzdCh0ZXN0c0ZvckNvbmN1cnJlbnRTa2lwTGlzdE1hcFdpdGhDb21wYXJhdG9yKCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIHBhcnQ6ICIgKyBtYXBzVG9UZXN0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGZpbmFsIENvbGxlY3Rpb248TWV0aG9kPiBzdXBwcmVzc0ZvckNvbmN1cnJlbnRIYXNoTWFwKCkgewotICAgICAgICAvLyBodHRwOi8vYi8zMDg1MzI0MQotICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdCgKLSAgICAgICAgICAgICAgICBDb2xsZWN0aW9uQWRkQWxsVGVzdGVyLmdldEFkZEFsbFVuc3VwcG9ydGVkTm9uZVByZXNlbnRNZXRob2QoKSwKLSAgICAgICAgICAgICAgICBDb2xsZWN0aW9uQWRkQWxsVGVzdGVyLmdldEFkZEFsbFVuc3VwcG9ydGVkU29tZVByZXNlbnRNZXRob2QoKSwKLSAgICAgICAgICAgICAgICBDb2xsZWN0aW9uQWRkVGVzdGVyLmdldEFkZFVuc3VwcG9ydGVkTm90UHJlc2VudE1ldGhvZCgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9saWJjb3JlL2phdmF1dGlsY29sbGVjdGlvbnMvc3JjL2xpYmNvcmUvamF2YS91dGlsL3Rlc3RzL0FuZHJvaWRUZXN0c0ZvclF1ZXVlc0luSmF2YVV0aWwuamF2YSBiL3Rlc3RzL2xpYmNvcmUvamF2YXV0aWxjb2xsZWN0aW9ucy9zcmMvbGliY29yZS9qYXZhL3V0aWwvdGVzdHMvQW5kcm9pZFRlc3RzRm9yUXVldWVzSW5KYXZhVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmYwZWIzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL2xpYmNvcmUvamF2YXV0aWxjb2xsZWN0aW9ucy9zcmMvbGliY29yZS9qYXZhL3V0aWwvdGVzdHMvQW5kcm9pZFRlc3RzRm9yUXVldWVzSW5KYXZhVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi1wYWNrYWdlIGxpYmNvcmUuamF2YS51dGlsLnRlc3RzOwotCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC50ZXN0aW5nLk1pbmltYWxDb2xsZWN0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QudGVzdGluZy5RdWV1ZVRlc3RTdWl0ZUJ1aWxkZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC50ZXN0aW5nLlRlc3RTdHJpbmdRdWV1ZUdlbmVyYXRvcjsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LnRlc3RpbmcuVGVzdHNGb3JMaXN0c0luSmF2YVV0aWw7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC50ZXN0aW5nLlRlc3RzRm9yUXVldWVzSW5KYXZhVXRpbDsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LnRlc3RpbmcuZmVhdHVyZXMuQ29sbGVjdGlvbkZlYXR1cmU7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC50ZXN0aW5nLmZlYXR1cmVzLkNvbGxlY3Rpb25TaXplOwotCi1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlF1ZXVlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotCi0vKioKLSAqIEd1YXZhLXRlc3RsaWIgdGVzdHMgZm9yIHtAY29kZSBRdWV1ZX0gaW1wbGVtZW50YXRpb25zIGZyb20ge0Bjb2RlIGphdmEudXRpbH0uCi0gKi8KLXB1YmxpYyBjbGFzcyBBbmRyb2lkVGVzdHNGb3JRdWV1ZXNJbkphdmFVdGlsIGV4dGVuZHMgVGVzdHNGb3JRdWV1ZXNJbkphdmFVdGlsIHsKLQotICAgIC8qKgotICAgICAqIE92ZXJyaWRlIGFuZCBjb3B5IHRoZSBzdXBlciBjbGFzcydzIGltcGxlbWVudGF0aW9uIGluIG9yZGVyIHRvIGNoYW5nZSB0aGUgbmFtZSB0byBlbnN1cmUKLSAgICAgKiB0aGF0IGNyZWF0ZWQgdGVzdHMgYXJlIHVuaXF1ZSBhbmQgZG8gbm90IGNsYXNoIHdpdGggdGhvc2UgY3JlYXRlZCBieQotICAgICAqIHtAbGluayBUZXN0c0Zvckxpc3RzSW5KYXZhVXRpbCN0ZXN0c0ZvckxpbmtlZExpc3QoKX0sIHNlZSBidWcgNjI0Mzg2MjkuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFRlc3QgdGVzdHNGb3JMaW5rZWRMaXN0KCkgewotICAgICAgICByZXR1cm4gUXVldWVUZXN0U3VpdGVCdWlsZGVyLnVzaW5nKAotICAgICAgICAgICAgICAgIG5ldyBUZXN0U3RyaW5nUXVldWVHZW5lcmF0b3IoKSB7Ci0gICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgUXVldWU8U3RyaW5nPiBjcmVhdGUoU3RyaW5nW10gZWxlbWVudHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KE1pbmltYWxDb2xsZWN0aW9uLm9mKGVsZW1lbnRzKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KQotICAgICAgICAgICAgICAgIC5uYW1lZCgiTGlua2VkTGlzdCBhcyBRdWV1ZSIpCi0gICAgICAgICAgICAgICAgLndpdGhGZWF0dXJlcygKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25GZWF0dXJlLkdFTkVSQUxfUFVSUE9TRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25GZWF0dXJlLkFMTE9XU19OVUxMX1ZBTFVFUywKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25GZWF0dXJlLktOT1dOX09SREVSLAotICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvblNpemUuQU5ZKQotICAgICAgICAgICAgICAgIC5za2lwQ29sbGVjdGlvblRlc3RzKCkgLy8gYWxyZWFkeSBjb3ZlcmVkIGluIFRlc3RzRm9yTGlzdHNJbkphdmFVdGlsCi0gICAgICAgICAgICAgICAgLnN1cHByZXNzaW5nKHN1cHByZXNzRm9yTGlua2VkTGlzdCgpKQotICAgICAgICAgICAgICAgIC5jcmVhdGVUZXN0U3VpdGUoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9saWJjb3JlL2phdmF1dGlsY29sbGVjdGlvbnMvc3JjL2xpYmNvcmUvamF2YS91dGlsL3Rlc3RzL0FuZHJvaWRUZXN0c0ZvclNldHNJbkphdmFVdGlsLmphdmEgYi90ZXN0cy9saWJjb3JlL2phdmF1dGlsY29sbGVjdGlvbnMvc3JjL2xpYmNvcmUvamF2YS91dGlsL3Rlc3RzL0FuZHJvaWRUZXN0c0ZvclNldHNJbkphdmFVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ZTQxZjQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvbGliY29yZS9qYXZhdXRpbGNvbGxlY3Rpb25zL3NyYy9saWJjb3JlL2phdmEvdXRpbC90ZXN0cy9BbmRyb2lkVGVzdHNGb3JTZXRzSW5KYXZhVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi1wYWNrYWdlIGxpYmNvcmUuamF2YS51dGlsLnRlc3RzOwotCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC50ZXN0aW5nLlRlc3RzRm9yU2V0c0luSmF2YVV0aWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLQotLyoqCi0gKiBHdWF2YS10ZXN0bGliIHRlc3RzIGZvciB7QGNvZGUgU2V0fSBpbXBsZW1lbnRhdGlvbnMgZnJvbSB7QGNvZGUgamF2YS51dGlsfS4KLSAqLwotcHVibGljIGNsYXNzIEFuZHJvaWRUZXN0c0ZvclNldHNJbkphdmFVdGlsIGV4dGVuZHMgVGVzdHNGb3JTZXRzSW5KYXZhVXRpbCB7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9saWJjb3JlL2pzcjE2Ni9BbmRyb2lkLm1rIGIvdGVzdHMvbGliY29yZS9qc3IxNjYvQW5kcm9pZC5tawppbmRleCA5ZTExODE1Li4zY2IyYmZhIDEwMDY0NAotLS0gYS90ZXN0cy9saWJjb3JlL2pzcjE2Ni9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL2xpYmNvcmUvanNyMTY2L0FuZHJvaWQubWsKQEAgLTE3LDkgKzE3LDEwIEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0xpYmNvcmVKc3IxNjZUZXN0Q2FzZXMKK0xPQ0FMX1BSSVZBVEVfUExBVEZPUk1fQVBJUyA6PSB0cnVlCiAKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCi0gICAgY3RzLWNvcmUtdGVzdC1ydW5uZXIgXAorICAgIGN0cy1jb3JlLXRlc3QtcnVubmVyLWF4dCBcCiAgICAganNyMTY2LXRlc3RzCiAKICMgRG9uJ3QgaW5jbHVkZSB0aGlzIHBhY2thZ2UgaW4gYW55IHRhcmdldApkaWZmIC0tZ2l0IGEvdGVzdHMvbGliY29yZS9qc3IxNjYvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL2xpYmNvcmUvanNyMTY2L0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggYmFhZTQ4OC4uZTE1ZjY2MiAxMDA2NDQKLS0tIGEvdGVzdHMvbGliY29yZS9qc3IxNjYvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy9saWJjb3JlL2pzcjE2Ni9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yMCw4ICsyMCwxMSBAQAogICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KICAgICA8L2FwcGxpY2F0aW9uPgogCi0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5saWJjb3JlLmN0cy5qc3IxNjYiCi0gICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgTGliY29yZSBKU1IxNjYgdGVzdCBjYXNlcyIgLz4KKyAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyBMaWJjb3JlIEpTUjE2NiB0ZXN0IGNhc2VzIj4KKyAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9Imxpc3RlbmVyIgorICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmFsdWU9ImNvbS5hbmRyb2lkLmN0cy5ydW5uZXIuQ3RzVGVzdFJ1bkxpc3RlbmVyIiAvPgorICAgIDwvaW5zdHJ1bWVudGF0aW9uPgogCiA8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvbGliY29yZS9qc3IxNjYvQW5kcm9pZFRlc3QueG1sIGIvdGVzdHMvbGliY29yZS9qc3IxNjYvQW5kcm9pZFRlc3QueG1sCmluZGV4IDJhM2U1ZDIuLjlkMmNmY2YgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2xpYmNvcmUvanNyMTY2L0FuZHJvaWRUZXN0LnhtbAorKysgYi90ZXN0cy9saWJjb3JlL2pzcjE2Ni9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBMaWJjb3JlIEpTUjE2NiB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0ibGliY29yZSIgLz4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlJ1bkNvbW1hbmRUYXJnZXRQcmVwYXJlciI+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icnVuLWNvbW1hbmQiIHZhbHVlPSJta2RpciAtcCAvZGF0YS9sb2NhbC90bXAvY3RzbGliY29yZS9qYXZhLmlvLnRtcGRpciIgLz4KQEAgLTI3LDEzICsyOCwxMiBAQAogICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgogICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LnRlc3R0eXBlLkxpYmNvcmVUZXN0IiA+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icGFja2FnZSIgdmFsdWU9ImFuZHJvaWQubGliY29yZS5jdHMuanNyMTY2IiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9Imluc3RydW1lbnRhdGlvbi1hcmciIGtleT0ibGlzdGVuZXIiCi0gICAgICAgICAgICAgICAgdmFsdWU9ImNvbS5hbmRyb2lkLmN0cy5ydW5uZXIuQ3RzVGVzdFJ1bkxpc3RlbmVyIiAvPgogICAgICAgICA8b3B0aW9uIG5hbWU9Imluc3RydW1lbnRhdGlvbi1hcmciIGtleT0iZmlsdGVyIgogICAgICAgICAgICAgICAgIHZhbHVlPSJjb20uYW5kcm9pZC5jdHMuY29yZS5ydW5uZXIuRXhwZWN0YXRpb25CYXNlZEZpbHRlciIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJjb3JlLWV4cGVjdGF0aW9uIiB2YWx1ZT0iL2tub3duZmFpbHVyZXMudHh0IiAvPgogICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjEwbSIvPgogICAgICAgICA8IS0tIDIweCBkZWZhdWx0IHRpbWVvdXQgb2YgNjAwc2VjIC0tPgogICAgICAgICA8b3B0aW9uIG5hbWU9InNoZWxsLXRpbWVvdXQiIHZhbHVlPSIxMjAwMDAwMCIvPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImhpZGRlbi1hcGktY2hlY2tzIiB2YWx1ZT0iZmFsc2UiLz4KICAgICA8L3Rlc3Q+CiA8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9saWJjb3JlL2x1bmkvQW5kcm9pZC5tayBiL3Rlc3RzL2xpYmNvcmUvbHVuaS9BbmRyb2lkLm1rCmluZGV4IDgxYjQ0ZDMuLmEyYTZhMjQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2xpYmNvcmUvbHVuaS9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL2xpYmNvcmUvbHVuaS9BbmRyb2lkLm1rCkBAIC0xNywxMiArMTcsMTMgQEAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzTGliY29yZVRlc3RDYXNlcworTE9DQUxfUFJJVkFURV9QTEFURk9STV9BUElTIDo9IHRydWUKIAogTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKICAgICBhcGFjaGUtaGFybW9ueS10ZXN0cyBcCiAgICAgY29uc2NyeXB0LXRlc3RzIFwKICAgICBjb3JlLXRlc3RzIFwKLSAgICBjdHMtY29yZS10ZXN0LXJ1bm5lciBcCisgICAgY3RzLWNvcmUtdGVzdC1ydW5uZXItYXh0IFwKICAgICBtb2NraXRvLXRhcmdldC1taW51cy1qdW5pdDQgXAogICAgIHRpbWVfem9uZV9kaXN0cm8tdGVzdHMgXAogICAgIHRpbWVfem9uZV9kaXN0cm9faW5zdGFsbGVyLXRlc3RzCkBAIC0zNyw2ICszOCwxMCBAQAogTE9DQUxfSkFDS19GTEFHUyA6PSAtLW11bHRpLWRleCBuYXRpdmUKIExPQ0FMX0RYX0ZMQUdTIDo9IC0tbXVsdGktZGV4CiAKKyMgRXhjbHVkZSBhcGFjaGUgaGFybW9ueSB0ZXN0cyBmcm9tIGNvdmVyYWdlIGluc3RydW1lbnRhdGlvbiwgc2luY2UgaXQgYnJlYWtzCisjIHRoZSB0ZXN0cyBvZiByZWZsZWN0aW9uIEFQSXMgYnkgYWRkaW5nIGZpZWxkcyBhbmQgbWV0aG9kcyB0byB0aGUgdGVzdCBjbGFzc2VzLgorTE9DQUxfSkFDS19DT1ZFUkFHRV9FWENMVURFX0ZJTFRFUiA6PSBvcmcuYXBhY2hlLmhhcm1vbnkudGVzdHMuKgorCiBMT0NBTF9QUk9HVUFSRF9FTkFCTEVEIDo9IGRpc2FibGVkCiAjIEtlZXAgTUVUQS1JTkYvIHJlc291cmNlcyBmcm9tIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUy4gaHR0cDovL2IvNjIzNDE2NzcKIExPQ0FMX0RPTlRfREVMRVRFX0pBUl9NRVRBX0lORiA6PSB0cnVlCmRpZmYgLS1naXQgYS90ZXN0cy9saWJjb3JlL2x1bmkvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL2xpYmNvcmUvbHVuaS9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDAzODliZTYuLmIxZDVjODcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2xpYmNvcmUvbHVuaS9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL2xpYmNvcmUvbHVuaS9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0xNywxMiArMTcsMTUgQEAKIAogPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIgcGFja2FnZT0iYW5kcm9pZC5saWJjb3JlLmN0cyI+CiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5JTlRFUk5FVCIgLz4KLSAgICA8YXBwbGljYXRpb24+CisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6dXNlc0NsZWFydGV4dFRyYWZmaWM9InRydWUiPgogICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KICAgICA8L2FwcGxpY2F0aW9uPgogCi0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5saWJjb3JlLmN0cyIKLSAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyBMaWJjb3JlIHRlc3QgY2FzZXMiIC8+CisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgTGliY29yZSB0ZXN0IGNhc2VzIj4KKyAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9Imxpc3RlbmVyIgorICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmFsdWU9ImNvbS5hbmRyb2lkLmN0cy5ydW5uZXIuQ3RzVGVzdFJ1bkxpc3RlbmVyIiAvPgorICAgIDwvaW5zdHJ1bWVudGF0aW9uPgogCiA8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvbGliY29yZS9sdW5pL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL2xpYmNvcmUvbHVuaS9BbmRyb2lkVGVzdC54bWwKaW5kZXggYThjNDE0Mi4uNmRlM2RmNSAxMDA2NDQKLS0tIGEvdGVzdHMvbGliY29yZS9sdW5pL0FuZHJvaWRUZXN0LnhtbAorKysgYi90ZXN0cy9saWJjb3JlL2x1bmkvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgTGliY29yZSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0ibGliY29yZSIgLz4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlJ1bkNvbW1hbmRUYXJnZXRQcmVwYXJlciI+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icnVuLWNvbW1hbmQiIHZhbHVlPSJta2RpciAtcCAvZGF0YS9sb2NhbC90bXAvY3RzbGliY29yZS9qYXZhLmlvLnRtcGRpciIgLz4KQEAgLTI3LDEzICsyOCwxMiBAQAogICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgogICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LnRlc3R0eXBlLkxpYmNvcmVUZXN0IiA+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icGFja2FnZSIgdmFsdWU9ImFuZHJvaWQubGliY29yZS5jdHMiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iaW5zdHJ1bWVudGF0aW9uLWFyZyIga2V5PSJsaXN0ZW5lciIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iY29tLmFuZHJvaWQuY3RzLnJ1bm5lci5DdHNUZXN0UnVuTGlzdGVuZXIiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0iaW5zdHJ1bWVudGF0aW9uLWFyZyIga2V5PSJmaWx0ZXIiCiAgICAgICAgICAgICAgICAgdmFsdWU9ImNvbS5hbmRyb2lkLmN0cy5jb3JlLnJ1bm5lci5FeHBlY3RhdGlvbkJhc2VkRmlsdGVyIiAvPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNvcmUtZXhwZWN0YXRpb24iIHZhbHVlPSIva25vd25mYWlsdXJlcy50eHQiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icnVudGltZS1oaW50IiB2YWx1ZT0iNDVtIi8+CiAgICAgICAgIDwhLS0gMjB4IGRlZmF1bHQgdGltZW91dCBvZiA2MDBzZWMgLS0+CiAgICAgICAgIDxvcHRpb24gbmFtZT0ic2hlbGwtdGltZW91dCIgdmFsdWU9IjEyMDAwMDAwIi8+CisgICAgICAgIDxvcHRpb24gbmFtZT0iaGlkZGVuLWFwaS1jaGVja3MiIHZhbHVlPSJmYWxzZSIvPgogICAgIDwvdGVzdD4KIDwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYmNvcmUvb2psdW5pL0FuZHJvaWQubWsgYi90ZXN0cy9saWJjb3JlL29qbHVuaS9BbmRyb2lkLm1rCmluZGV4IGJlNzA5YmUuLjgzNTQ2MTUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2xpYmNvcmUvb2psdW5pL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvbGliY29yZS9vamx1bmkvQW5kcm9pZC5tawpAQCAtMTcsMTAgKzE3LDE1IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0xpYmNvcmVPalRlc3RDYXNlcworTE9DQUxfUFJJVkFURV9QTEFURk9STV9BUElTIDo9IHRydWUKIAogTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKICAgICBjb3JlLW9qdGVzdHMtcHVibGljCiAKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IHRlc3RuZworCitMT0NBTF9EWF9GTEFHUyA6PSAtLWNvcmUtbGlicmFyeQorCiAjIERvbid0IGluY2x1ZGUgdGhpcyBwYWNrYWdlIGluIGFueSB0YXJnZXQKIExPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCiAKZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYmNvcmUvb2psdW5pL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9saWJjb3JlL29qbHVuaS9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGMwMTBhMzIuLmIzOTA2OTggMTAwNjQ0Ci0tLSBhL3Rlc3RzL2xpYmNvcmUvb2psdW5pL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvbGliY29yZS9vamx1bmkvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMTksOCArMTksMTEgQEAKICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLklOVEVSTkVUIiAvPgogCiAgICAgPCEtLSBpbXBvcnRhbnQ6IGluc3RydW1lbnQgYW5vdGhlciBwYWNrYWdlIHdoaWNoIGFjdHVhbGx5IGNvbnRhaW5zIEFKVVIgLS0+Ci0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5saWJjb3JlLnJ1bm5lciIKLSAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyBMaWJjb3JlIE9KIHRlc3QgY2FzZXMiIC8+CisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgTGliY29yZSBPSiB0ZXN0IGNhc2VzIj4KKyAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9Imxpc3RlbmVyIgorICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmFsdWU9ImNvbS5hbmRyb2lkLmN0cy5ydW5uZXIuQ3RzVGVzdFJ1bkxpc3RlbmVyIiAvPgorICAgIDwvaW5zdHJ1bWVudGF0aW9uPgogCiA8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvbGliY29yZS9vamx1bmkvQW5kcm9pZFRlc3QueG1sIGIvdGVzdHMvbGliY29yZS9vamx1bmkvQW5kcm9pZFRlc3QueG1sCmluZGV4IDFjZWJkNGUuLjU4OWQ0MzEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2xpYmNvcmUvb2psdW5pL0FuZHJvaWRUZXN0LnhtbAorKysgYi90ZXN0cy9saWJjb3JlL29qbHVuaS9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBMaWJjb3JlIE9KIHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJsaWJjb3JlIiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuUnVuQ29tbWFuZFRhcmdldFByZXBhcmVyIj4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJydW4tY29tbWFuZCIgdmFsdWU9Im1rZGlyIC1wIC9kYXRhL2xvY2FsL3RtcC9jdHNsaWJjb3JlL2phdmEuaW8udG1wZGlyIiAvPgpAQCAtMjIsNyArMjMsNyBAQAogICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+Ci0gICAgICAgIDwhLS0gdGhpcyBoYXMgdGhlIENvcmVUZXN0UnVubmVyIHdoaWNoIG5lZWRzIHRvIGJlIGluIGEgc2VwYXJhdGUgQVBLIC0tPgorICAgICAgICA8IS0tIHRoaXMgaGFzIHRoZSBBSlVSIHdoaWNoIG5lZWRzIHRvIGJlIGluIGEgc2VwYXJhdGUgQVBLIC0tPgogICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzTGliY29yZVRlc3RSdW5uZXIuYXBrIiAvPgogICAgICAgICA8IS0tIHRoaXMgaGFzIGp1c3QgdGhlIGluc3RydW1lbnRhdGlvbiB3aGljaCBhY3RzIGFzIHRoZSB0ZXN0cyB3ZSB3YW50IHRvIHJ1biAtLT4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0xpYmNvcmVPalRlc3RDYXNlcy5hcGsiIC8+CkBAIC0zMSwxMyArMzIsMTIgQEAKICAgICAgICAgPG9wdGlvbiBuYW1lPSJwYWNrYWdlIiB2YWx1ZT0iYW5kcm9pZC5saWJjb3JlLmN0cy5vaiIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJpbnN0cnVtZW50YXRpb24tYXJnIiBrZXk9InJ1bm5lckJ1aWxkZXIiCiAgICAgICAgICAgICAgICAgdmFsdWU9ImNvbS5hbmRyb2lkLmN0cy5jb3JlLnJ1bm5lci5zdXBwb3J0LlRlc3ROZ1J1bm5lckJ1aWxkZXIiLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJpbnN0cnVtZW50YXRpb24tYXJnIiBrZXk9Imxpc3RlbmVyIgotICAgICAgICAgICAgICAgIHZhbHVlPSJjb20uYW5kcm9pZC5jdHMucnVubmVyLkN0c1Rlc3RSdW5MaXN0ZW5lciIvPgogICAgICAgICA8b3B0aW9uIG5hbWU9Imluc3RydW1lbnRhdGlvbi1hcmciIGtleT0iZmlsdGVyIgogICAgICAgICAgICAgICAgIHZhbHVlPSJjb20uYW5kcm9pZC5jdHMuY29yZS5ydW5uZXIuRXhwZWN0YXRpb25CYXNlZEZpbHRlciIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJjb3JlLWV4cGVjdGF0aW9uIiB2YWx1ZT0iL2tub3duZmFpbHVyZXMudHh0IiAvPgogICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjM1bSIvPgogICAgICAgICA8IS0tIDIweCBkZWZhdWx0IHRpbWVvdXQgb2YgNjAwc2VjIC0tPgogICAgICAgICA8b3B0aW9uIG5hbWU9InNoZWxsLXRpbWVvdXQiIHZhbHVlPSIxMjAwMDAwMCIvPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImhpZGRlbi1hcGktY2hlY2tzIiB2YWx1ZT0iZmFsc2UiLz4KICAgICA8L3Rlc3Q+CiA8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9saWJjb3JlL29raHR0cC9BbmRyb2lkLm1rIGIvdGVzdHMvbGliY29yZS9va2h0dHAvQW5kcm9pZC5tawppbmRleCA5MWU5ZWY1Li5lYjA2MWRhIDEwMDY0NAotLS0gYS90ZXN0cy9saWJjb3JlL29raHR0cC9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL2xpYmNvcmUvb2todHRwL0FuZHJvaWQubWsKQEAgLTE3LDEwICsxNywxMSBAQAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNMaWJjb3JlT2tIdHRwVGVzdENhc2VzCitMT0NBTF9QUklWQVRFX1BMQVRGT1JNX0FQSVMgOj0gdHJ1ZQogCiBMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAotICAgIGJvdW5jeWNhc3RsZS1ub2phcmphciBcCi0gICAgY3RzLWNvcmUtdGVzdC1ydW5uZXIgXAorICAgIGJvdW5jeWNhc3RsZS11bmJ1bmRsZWQgXAorICAgIGN0cy1jb3JlLXRlc3QtcnVubmVyLWF4dCBcCiAgICAgb2todHRwLW5vamFyamFyIFwKICAgICBva2h0dHAtdGVzdHMtbm9qYXJqYXIKIApkaWZmIC0tZ2l0IGEvdGVzdHMvbGliY29yZS9va2h0dHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL2xpYmNvcmUvb2todHRwL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggMTUxZmRhOS4uNTM5NmQ4ZSAxMDA2NDQKLS0tIGEvdGVzdHMvbGliY29yZS9va2h0dHAvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy9saWJjb3JlL29raHR0cC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0xNywxMiArMTcsMTUgQEAKIAogPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIgcGFja2FnZT0iYW5kcm9pZC5saWJjb3JlLmN0cy5va2h0dHAiPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uSU5URVJORVQiIC8+Ci0gICAgPGFwcGxpY2F0aW9uPgorICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOnVzZXNDbGVhcnRleHRUcmFmZmljPSJ0cnVlIj4KICAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CiAgICAgPC9hcHBsaWNhdGlvbj4KIAotICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQubGliY29yZS5jdHMub2todHRwIgotICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIExpYmNvcmUgT2tIdHRwIHRlc3QgY2FzZXMiIC8+CisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgTGliY29yZSBPa0h0dHAgdGVzdCBjYXNlcyI+CisgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJsaXN0ZW5lciIKKyAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZhbHVlPSJjb20uYW5kcm9pZC5jdHMucnVubmVyLkN0c1Rlc3RSdW5MaXN0ZW5lciIgLz4KKyAgICA8L2luc3RydW1lbnRhdGlvbj4KIAogPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYmNvcmUvb2todHRwL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL2xpYmNvcmUvb2todHRwL0FuZHJvaWRUZXN0LnhtbAppbmRleCA0ZTc5YjgwLi4xODY1ZmE1IDEwMDY0NAotLS0gYS90ZXN0cy9saWJjb3JlL29raHR0cC9BbmRyb2lkVGVzdC54bWwKKysrIGIvdGVzdHMvbGliY29yZS9va2h0dHAvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgTGliY29yZSBPa0h0dHAgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImxpYmNvcmUiIC8+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5SdW5Db21tYW5kVGFyZ2V0UHJlcGFyZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bi1jb21tYW5kIiB2YWx1ZT0ibWtkaXIgLXAgL2RhdGEvbG9jYWwvdG1wL2N0c2xpYmNvcmUvamF2YS5pby50bXBkaXIiIC8+CkBAIC0yNywxMyArMjgsMTIgQEAKICAgICA8L3RhcmdldF9wcmVwYXJlcj4KICAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS50ZXN0dHlwZS5MaWJjb3JlVGVzdCIgPgogICAgICAgICA8b3B0aW9uIG5hbWU9InBhY2thZ2UiIHZhbHVlPSJhbmRyb2lkLmxpYmNvcmUuY3RzLm9raHR0cCIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJpbnN0cnVtZW50YXRpb24tYXJnIiBrZXk9Imxpc3RlbmVyIgotICAgICAgICAgICAgICAgIHZhbHVlPSJjb20uYW5kcm9pZC5jdHMucnVubmVyLkN0c1Rlc3RSdW5MaXN0ZW5lciIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJpbnN0cnVtZW50YXRpb24tYXJnIiBrZXk9ImZpbHRlciIKICAgICAgICAgICAgICAgICB2YWx1ZT0iY29tLmFuZHJvaWQuY3RzLmNvcmUucnVubmVyLkV4cGVjdGF0aW9uQmFzZWRGaWx0ZXIiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0iY29yZS1leHBlY3RhdGlvbiIgdmFsdWU9Ii9rbm93bmZhaWx1cmVzLnR4dCIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJydW50aW1lLWhpbnQiIHZhbHVlPSIxNW0iLz4KICAgICAgICAgPCEtLSAyMHggZGVmYXVsdCB0aW1lb3V0IG9mIDYwMHNlYyAtLT4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJzaGVsbC10aW1lb3V0IiB2YWx1ZT0iMTIwMDAwMDAiLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJoaWRkZW4tYXBpLWNoZWNrcyIgdmFsdWU9ImZhbHNlIi8+CiAgICAgPC90ZXN0PgogPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvbGliY29yZS9ydW5uZXIvQW5kcm9pZC5tayBiL3Rlc3RzL2xpYmNvcmUvcnVubmVyL0FuZHJvaWQubWsKaW5kZXggNmVmM2MwMy4uMDkzNzc5YiAxMDA2NDQKLS0tIGEvdGVzdHMvbGliY29yZS9ydW5uZXIvQW5kcm9pZC5taworKysgYi90ZXN0cy9saWJjb3JlL3J1bm5lci9BbmRyb2lkLm1rCkBAIC0xNyw5ICsxNywxMCBAQAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNMaWJjb3JlVGVzdFJ1bm5lcgorTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAogCiBMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAotICAgIGN0cy1jb3JlLXRlc3QtcnVubmVyCisgICAgY3RzLWNvcmUtdGVzdC1ydW5uZXItYXh0CiAKICMgRG9uJ3QgaW5jbHVkZSB0aGlzIHBhY2thZ2UgaW4gYW55IHRhcmdldAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYmNvcmUvd3ljaGVwcm9vZi1iYy9BbmRyb2lkLm1rIGIvdGVzdHMvbGliY29yZS93eWNoZXByb29mLWJjL0FuZHJvaWQubWsKaW5kZXggODAxZmVhYy4uYTQzZThiNCAxMDA2NDQKLS0tIGEvdGVzdHMvbGliY29yZS93eWNoZXByb29mLWJjL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvbGliY29yZS93eWNoZXByb29mLWJjL0FuZHJvaWQubWsKQEAgLTE3LDkgKzE3LDEwIEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0xpYmNvcmVXeWNoZXByb29mQkNUZXN0Q2FzZXMKK0xPQ0FMX1BSSVZBVEVfUExBVEZPUk1fQVBJUyA6PSB0cnVlCiAKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCi0gICAgY3RzLWNvcmUtdGVzdC1ydW5uZXIgXAorICAgIGN0cy1jb3JlLXRlc3QtcnVubmVyLWF4dCBcCiAgICAgd3ljaGVwcm9vZgogCiBMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBib3VuY3ljYXN0bGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYmNvcmUvd3ljaGVwcm9vZi1iYy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvbGliY29yZS93eWNoZXByb29mLWJjL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggMTVjNWZkNS4uYjYyYzYyZSAxMDA2NDQKLS0tIGEvdGVzdHMvbGliY29yZS93eWNoZXByb29mLWJjL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvbGliY29yZS93eWNoZXByb29mLWJjL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTIxLDggKzIxLDExIEBACiAgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgogICAgIDwvYXBwbGljYXRpb24+CiAKLSAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmxpYmNvcmUuY3RzLnd5Y2hlcHJvb2YuYm91bmN5Y2FzdGxlIgotICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIExpYmNvcmUgV3ljaGVwcm9vZiBCb3VuY3kgQ2FzdGxlIHRlc3QgY2FzZXMiIC8+CisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgTGliY29yZSBXeWNoZXByb29mIEJvdW5jeSBDYXN0bGUgdGVzdCBjYXNlcyI+CisgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJsaXN0ZW5lciIKKyAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZhbHVlPSJjb20uYW5kcm9pZC5jdHMucnVubmVyLkN0c1Rlc3RSdW5MaXN0ZW5lciIgLz4KKyAgICA8L2luc3RydW1lbnRhdGlvbj4KIAogPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYmNvcmUvd3ljaGVwcm9vZi1iYy9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy9saWJjb3JlL3d5Y2hlcHJvb2YtYmMvQW5kcm9pZFRlc3QueG1sCmluZGV4IDA4MjM4Y2UuLjhlNDU1YmYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2xpYmNvcmUvd3ljaGVwcm9vZi1iYy9BbmRyb2lkVGVzdC54bWwKKysrIGIvdGVzdHMvbGliY29yZS93eWNoZXByb29mLWJjL0FuZHJvaWRUZXN0LnhtbApAQCAtMTQsNiArMTQsNyBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIExpYmNvcmUgV3ljaGVwcm9vZiBCb3VuY3kgQ2FzdGxlIHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJsaWJjb3JlIiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CkBAIC0yNiwxMiArMjcsMTAgQEAKICAgICAgICAgICAgICBjb250ZXh0IG9mIG9uZSBvZiB0aGUgc3VpdGVzLCBzbyB3ZSBoYXZlIHRvIGxpbWl0IHRoZSB0ZXN0CiAgICAgICAgICAgICAgaW5mcmFzdHJ1Y3R1cmUgdG8gb25seSBydW5uaW5nIHRoZSB0ZXN0IHN1aXRlcy4gLS0+CiAgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1wYWNrYWdlIiB2YWx1ZT0iYW5kcm9pZC5saWJjb3JlLmN0cy53eWNoZXByb29mIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9Imluc3RydW1lbnRhdGlvbi1hcmciIGtleT0ibGlzdGVuZXIiCi0gICAgICAgICAgICAgICAgdmFsdWU9ImNvbS5hbmRyb2lkLmN0cy5ydW5uZXIuQ3RzVGVzdFJ1bkxpc3RlbmVyIiAvPgogICAgICAgICA8b3B0aW9uIG5hbWU9Imluc3RydW1lbnRhdGlvbi1hcmciIGtleT0iZmlsdGVyIgogICAgICAgICAgICAgICAgIHZhbHVlPSJjb20uYW5kcm9pZC5jdHMuY29yZS5ydW5uZXIuRXhwZWN0YXRpb25CYXNlZEZpbHRlciIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJjb3JlLWV4cGVjdGF0aW9uIiB2YWx1ZT0iL2tub3duZmFpbHVyZXMudHh0IiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjEwbSIvPgotICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtdGltZW91dCIgdmFsdWU9IjYwMDAwMCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJydW50aW1lLWhpbnQiIHZhbHVlPSIxNm0iLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXRpbWVvdXQiIHZhbHVlPSIzNjAwMDAwIiAvPgogICAgIDwvdGVzdD4KIDwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYmNvcmUvd3ljaGVwcm9vZi9BbmRyb2lkLm1rIGIvdGVzdHMvbGliY29yZS93eWNoZXByb29mL0FuZHJvaWQubWsKaW5kZXggNjUyZTM2Yy4uZDU4NjZmMSAxMDA2NDQKLS0tIGEvdGVzdHMvbGliY29yZS93eWNoZXByb29mL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvbGliY29yZS93eWNoZXByb29mL0FuZHJvaWQubWsKQEAgLTE3LDkgKzE3LDEwIEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0xpYmNvcmVXeWNoZXByb29mQ29uc2NyeXB0VGVzdENhc2VzCitMT0NBTF9QUklWQVRFX1BMQVRGT1JNX0FQSVMgOj0gdHJ1ZQogCiBMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAotICAgIGN0cy1jb3JlLXRlc3QtcnVubmVyIFwKKyAgICBjdHMtY29yZS10ZXN0LXJ1bm5lci1heHQgXAogICAgIHd5Y2hlcHJvb2YKIAogTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gY29uc2NyeXB0CmRpZmYgLS1naXQgYS90ZXN0cy9saWJjb3JlL3d5Y2hlcHJvb2YvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL2xpYmNvcmUvd3ljaGVwcm9vZi9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDc2NWM2NzcuLjljMGEzODQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2xpYmNvcmUvd3ljaGVwcm9vZi9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL2xpYmNvcmUvd3ljaGVwcm9vZi9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yMSw4ICsyMSwxMSBAQAogICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KICAgICA8L2FwcGxpY2F0aW9uPgogCi0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5saWJjb3JlLmN0cy53eWNoZXByb29mLmNvbnNjcnlwdCIKLSAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyBMaWJjb3JlIFd5Y2hlcHJvb2YgQ29uc2NyeXB0IHRlc3QgY2FzZXMiIC8+CisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgTGliY29yZSBXeWNoZXByb29mIENvbnNjcnlwdCB0ZXN0IGNhc2VzIj4KKyAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9Imxpc3RlbmVyIgorICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmFsdWU9ImNvbS5hbmRyb2lkLmN0cy5ydW5uZXIuQ3RzVGVzdFJ1bkxpc3RlbmVyIiAvPgorICAgIDwvaW5zdHJ1bWVudGF0aW9uPgogCiA8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvbGliY29yZS93eWNoZXByb29mL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL2xpYmNvcmUvd3ljaGVwcm9vZi9BbmRyb2lkVGVzdC54bWwKaW5kZXggYjU4NzRmZC4uMmExZjJiNSAxMDA2NDQKLS0tIGEvdGVzdHMvbGliY29yZS93eWNoZXByb29mL0FuZHJvaWRUZXN0LnhtbAorKysgYi90ZXN0cy9saWJjb3JlL3d5Y2hlcHJvb2YvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgTGliY29yZSBXeWNoZXByb29mIENvbnNjcnlwdCB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0ibGliY29yZSIgLz4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgpAQCAtMjYsOCArMjcsNiBAQAogICAgICAgICAgICAgIGNvbnRleHQgb2Ygb25lIG9mIHRoZSBzdWl0ZXMsIHNvIHdlIGhhdmUgdG8gbGltaXQgdGhlIHRlc3QKICAgICAgICAgICAgICBpbmZyYXN0cnVjdHVyZSB0byBvbmx5IHJ1bm5pbmcgdGhlIHRlc3Qgc3VpdGVzLiAtLT4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXBhY2thZ2UiIHZhbHVlPSJhbmRyb2lkLmxpYmNvcmUuY3RzLnd5Y2hlcHJvb2YiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iaW5zdHJ1bWVudGF0aW9uLWFyZyIga2V5PSJsaXN0ZW5lciIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iY29tLmFuZHJvaWQuY3RzLnJ1bm5lci5DdHNUZXN0UnVuTGlzdGVuZXIiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0iaW5zdHJ1bWVudGF0aW9uLWFyZyIga2V5PSJmaWx0ZXIiCiAgICAgICAgICAgICAgICAgdmFsdWU9ImNvbS5hbmRyb2lkLmN0cy5jb3JlLnJ1bm5lci5FeHBlY3RhdGlvbkJhc2VkRmlsdGVyIiAvPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNvcmUtZXhwZWN0YXRpb24iIHZhbHVlPSIva25vd25mYWlsdXJlcy50eHQiIC8+CmRpZmYgLS1naXQgYS90ZXN0cy9tb2NraW5nL0FuZHJvaWQubWsgYi90ZXN0cy9tb2NraW5nL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ1NGY2MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21vY2tpbmcvQW5kcm9pZC5tawpAQCAtMCwwICsxLDM4IEBACisjIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IFwKKyAgICB0ZXN0cworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gXAorICAgIGFuZHJvaWQudGVzdC5ydW5uZXIuc3R1YnMKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA9IFwKKyAgICBtb2NraXRvLXRhcmdldCBcCisgICAgYW5kcm9pZHgudGVzdC5ydWxlcyBcCisgICAgY3RzdGVzdHJ1bm5lci1heHQKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBcCisgICAgICAgICAgICAuLi8uLi8uLi9leHRlcm5hbC9kZXhtYWtlci9kZXhtYWtlci1tb2NraXRvLXRlc3RzL3NyYy9hbmRyb2lkVGVzdC9qYXZhKQorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBcCisgICAgY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gXAorICAgIEN0c01vY2tpbmdUZXN0Q2FzZXMKK0xPQ0FMX1NES19WRVJTSU9OIDo9IFwKKyAgICBjdXJyZW50CitpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCisKK2luY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL3Rlc3RzL21vY2tpbmcvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL21vY2tpbmcvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGY5ZTAwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbW9ja2luZy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgIH4gQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICB+CisgIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICB+CisgIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgfgorICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAgLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iYW5kcm9pZC5tb2NraW5nLmN0cyI+CisKKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkRJU0FCTEVfS0VZR1VBUkQiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9FWFRFUk5BTF9TVE9SQUdFIiAvPgorICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmRlYnVnZ2FibGU9ImZhbHNlIj4KKyAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CisgICAgPC9hcHBsaWNhdGlvbj4KKworICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQubW9ja2luZy5jdHMiCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgdGVzdHMgZm9yIG1vY2tpdG8gbW9ja2luZyI+CisgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJsaXN0ZW5lciIKKyAgICAgICAgICAgIGFuZHJvaWQ6dmFsdWU9ImNvbS5hbmRyb2lkLmN0cy5ydW5uZXIuQ3RzVGVzdFJ1bkxpc3RlbmVyIiAvPgorICAgIDwvaW5zdHJ1bWVudGF0aW9uPgorCis8L21hbmlmZXN0PgorCmRpZmYgLS1naXQgYS90ZXN0cy9tb2NraW5nL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL21vY2tpbmcvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNTM5MzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tb2NraW5nL0FuZHJvaWRUZXN0LnhtbApAQCAtMCwwICsxLDMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICB+IENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAgfgorICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgfgorICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIH4KKyAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgIC0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgTW9ja2l0byBtb2NraW5nIHRlc3QgY2FzZXMiPgorICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KKyAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9Im1vY2tpbmciIC8+CisKKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzTW9ja2luZ1Rlc3RDYXNlcy5hcGsiIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisKKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuQW5kcm9pZEpVbml0VGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9InBhY2thZ2UiIHZhbHVlPSJhbmRyb2lkLm1vY2tpbmcuY3RzIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjVzIiAvPgorICAgIDwvdGVzdD4KKzwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL21vY2tpbmcvZGVidWdnYWJsZS9BbmRyb2lkLm1rIGIvdGVzdHMvbW9ja2luZy9kZWJ1Z2dhYmxlL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRmYjJhMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21vY2tpbmcvZGVidWdnYWJsZS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzYgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gXAorICAgIHRlc3RzCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBcCisgICAgYW5kcm9pZC50ZXN0LnJ1bm5lci5zdHVicworTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTID0gXAorICAgIG1vY2tpdG8tdGFyZ2V0IFwKKyAgICBhbmRyb2lkeC50ZXN0LnJ1bGVzIFwKKyAgICBjdHN0ZXN0cnVubmVyLWF4dAorTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIFwKKyAgICAgICAgICAgIC4uLy4uLy4uLy4uL2V4dGVybmFsL2RleG1ha2VyL2RleG1ha2VyLW1vY2tpdG8tdGVzdHMvc3JjL2FuZHJvaWRUZXN0L2phdmEpCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IFwKKyAgICBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBcCisgICAgQ3RzTW9ja2luZ0RlYnVnZ2FibGVUZXN0Q2FzZXMKK0xPQ0FMX1NES19WRVJTSU9OIDo9IFwKKyAgICBjdXJyZW50CitpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS90ZXN0cy9tb2NraW5nL2RlYnVnZ2FibGUvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL21vY2tpbmcvZGVidWdnYWJsZS9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjYTVhZjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tb2NraW5nL2RlYnVnZ2FibGUvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDM1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICB+IENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAgfgorICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgfgorICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIH4KKyAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgIC0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImFuZHJvaWQubW9ja2luZy5jdHMuZGVidWdnYWJsZSI+CisKKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkRJU0FCTEVfS0VZR1VBUkQiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9FWFRFUk5BTF9TVE9SQUdFIiAvPgorICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmRlYnVnZ2FibGU9InRydWUiPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5tb2NraW5nLmN0cy5kZWJ1Z2dhYmxlIgorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIGZvciBtb2NraXRvIG1vY2tpbmcgKHdoaWxlIGRlYnVnZ2FibGUpIj4KKyAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9Imxpc3RlbmVyIgorICAgICAgICAgICAgYW5kcm9pZDp2YWx1ZT0iY29tLmFuZHJvaWQuY3RzLnJ1bm5lci5DdHNUZXN0UnVuTGlzdGVuZXIiIC8+CisgICAgPC9pbnN0cnVtZW50YXRpb24+CisKKzwvbWFuaWZlc3Q+CisKZGlmZiAtLWdpdCBhL3Rlc3RzL21vY2tpbmcvZGVidWdnYWJsZS9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy9tb2NraW5nL2RlYnVnZ2FibGUvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNWRlNDYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tb2NraW5nL2RlYnVnZ2FibGUvQW5kcm9pZFRlc3QueG1sCkBAIC0wLDAgKzEsMzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgIH4gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICB+CisgIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICB+CisgIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgfgorICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAgLS0+CisKKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIE1vY2tpdG8gbW9ja2luZyAod2hpbGUgZGVidWdnYWJsZSkgdGVzdCBjYXNlcyI+CisgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgorICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0ibW9ja2luZyIgLz4KKworICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJDdHNNb2NraW5nRGVidWdnYWJsZVRlc3RDYXNlcy5hcGsiIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisKKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuQW5kcm9pZEpVbml0VGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9InBhY2thZ2UiIHZhbHVlPSJhbmRyb2lkLm1vY2tpbmcuY3RzLmRlYnVnZ2FibGUiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVudGltZS1oaW50IiB2YWx1ZT0iNXMiIC8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvbW9ja2luZy9pbmxpbmUvQW5kcm9pZC5tayBiL3Rlc3RzL21vY2tpbmcvaW5saW5lL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM5OTM4NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21vY2tpbmcvaW5saW5lL0FuZHJvaWQubWsKQEAgLTAsMCArMSw0MiBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBcCisgICAgdGVzdHMKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IFwKKyAgICBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgPSBcCisgICAgbW9ja2l0by10YXJnZXQtaW5saW5lIFwKKyAgICBhbmRyb2lkeC50ZXN0LnJ1bGVzIFwKKyAgICBjdHN0ZXN0cnVubmVyLWF4dAorTE9DQUxfTVVMVElMSUIgOj0gXAorICAgIGJvdGgKK0xPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJkZXhtYWtlcmp2bXRpYWdlbnQgXAorICAgIGxpYm11bHRpcGxlanZtdGlhZ2VudHNpbnRlcmZlcmVuY2VhZ2VudAorTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIFwKKyAgICAgICAgICAgIC4uLy4uLy4uLy4uL2V4dGVybmFsL2RleG1ha2VyL2RleG1ha2VyLW1vY2tpdG8taW5saW5lLXRlc3RzL3NyYy9hbmRyb2lkVGVzdC9qYXZhKQorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBcCisgICAgY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gXAorICAgIEN0c0lubGluZU1vY2tpbmdUZXN0Q2FzZXMKK0xPQ0FMX1NES19WRVJTSU9OIDo9IFwKKyAgICBjdXJyZW50CitpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCisKZGlmZiAtLWdpdCBhL3Rlc3RzL21vY2tpbmcvaW5saW5lL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9tb2NraW5nL2lubGluZS9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYjQwODUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tb2NraW5nL2lubGluZS9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgIH4gQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICB+CisgIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICB+CisgIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgfgorICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAgLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iYW5kcm9pZC5pbmxpbmUubW9ja2luZy5jdHMiPgorCisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5ESVNBQkxFX0tFWUdVQVJEIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uV1JJVEVfRVhURVJOQUxfU1RPUkFHRSIgLz4KKyAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpkZWJ1Z2dhYmxlPSJ0cnVlIj4KKyAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CisgICAgPC9hcHBsaWNhdGlvbj4KKworICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuaW5saW5lLm1vY2tpbmcuY3RzIgorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIGZvciBtb2NraXRvIGlubGluZSBtb2NraW5nIj4KKyAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9Imxpc3RlbmVyIgorICAgICAgICAgICAgYW5kcm9pZDp2YWx1ZT0iY29tLmFuZHJvaWQuY3RzLnJ1bm5lci5DdHNUZXN0UnVuTGlzdGVuZXIiIC8+CisgICAgPC9pbnN0cnVtZW50YXRpb24+CisKKzwvbWFuaWZlc3Q+CisKZGlmZiAtLWdpdCBhL3Rlc3RzL21vY2tpbmcvaW5saW5lL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL21vY2tpbmcvaW5saW5lL0FuZHJvaWRUZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTU4ZGNiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbW9ja2luZy9pbmxpbmUvQW5kcm9pZFRlc3QueG1sCkBAIC0wLDAgKzEsMzQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgIH4gQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICB+CisgIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICB+CisgIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgfgorICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAgLS0+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBNb2NraXRvIGlubGluZSBtb2NraW5nIHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CisgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJtb2NraW5nIiAvPgorCisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0lubGluZU1vY2tpbmdUZXN0Q2FzZXMuYXBrIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorCisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkFuZHJvaWRKVW5pdFRlc3QiID4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwYWNrYWdlIiB2YWx1ZT0iYW5kcm9pZC5pbmxpbmUubW9ja2luZy5jdHMiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVudGltZS1oaW50IiB2YWx1ZT0iMzBzIiAvPgorICAgIDwvdGVzdD4KKworICAgIDwhLS0gQ29udHJvbGxlciB0aGF0IHdpbGwgc2tpcCB0aGUgbW9kdWxlIGlmIGEgbmF0aXZlIGJyaWRnZSBzaXR1YXRpb24gaXMgZGV0ZWN0ZWQgLS0+CisgICAgPCEtLSBGb3IgZXhhbXBsZTogbW9kdWxlIHdhbnRzIHRvIHJ1biBhcm0zMiBhbmQgZGV2aWNlIGlzIHg4NiAtLT4KKyAgICA8b2JqZWN0IHR5cGU9Im1vZHVsZV9jb250cm9sbGVyIiBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuc3VpdGUubW9kdWxlLk5hdGl2ZUJyaWRnZU1vZHVsZUNvbnRyb2xsZXIiIC8+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9uZXRsZWdhY3kyMi5hcGkvQW5kcm9pZC5tayBiL3Rlc3RzL25ldGxlZ2FjeTIyLmFwaS9BbmRyb2lkLm1rCmluZGV4IDg2Mzk1MTQuLjdmZTI1MWEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL25ldGxlZ2FjeTIyLmFwaS9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL25ldGxlZ2FjeTIyLmFwaS9BbmRyb2lkLm1rCkBAIC0yNyw3ICsyNyw3IEBACiAKIExPQ0FMX1NES19WRVJTSU9OIDo9IDIyCiAKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjdHN0ZXN0cnVubmVyIGxlZ2FjeS1hbmRyb2lkLXRlc3QKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjdHN0ZXN0cnVubmVyLWF4dAogCiAjIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0CiBMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cwpkaWZmIC0tZ2l0IGEvdGVzdHMvbmV0bGVnYWN5MjIuYXBpL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9uZXRsZWdhY3kyMi5hcGkvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBlOTAwY2ViLi5hOTQxMWNjIDEwMDY0NAotLS0gYS90ZXN0cy9uZXRsZWdhY3kyMi5hcGkvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy9uZXRsZWdhY3kyMi5hcGkvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjksNyArMjksNyBAQAogICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KICAgICA8L2FwcGxpY2F0aW9uPgogCi0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5uZXRsZWdhY3kyMi5hcGkuY3RzIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIG9mIGxlZ2FjeSBhbmRyb2lkLm5ldCBBUElzIGFzIG9mIEFQSSAyMiI+CiAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJsaXN0ZW5lciIKZGlmZiAtLWdpdCBhL3Rlc3RzL25ldGxlZ2FjeTIyLnBlcm1pc3Npb24vQW5kcm9pZC5tayBiL3Rlc3RzL25ldGxlZ2FjeTIyLnBlcm1pc3Npb24vQW5kcm9pZC5tawppbmRleCAyNjJlNjAwLi5mOWFlOGZlIDEwMDY0NAotLS0gYS90ZXN0cy9uZXRsZWdhY3kyMi5wZXJtaXNzaW9uL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvbmV0bGVnYWN5MjIucGVybWlzc2lvbi9BbmRyb2lkLm1rCkBAIC0yNyw3ICsyNyw3IEBACiAKIExPQ0FMX1NES19WRVJTSU9OIDo9IDIyCiAKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjdHN0ZXN0cnVubmVyIGxlZ2FjeS1hbmRyb2lkLXRlc3QKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjdHN0ZXN0cnVubmVyLWF4dAogCiAjIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0CiBMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cwpkaWZmIC0tZ2l0IGEvdGVzdHMvbmV0bGVnYWN5MjIucGVybWlzc2lvbi9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvbmV0bGVnYWN5MjIucGVybWlzc2lvbi9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGFmMjJiNDcuLjE0YzQwZTUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL25ldGxlZ2FjeTIyLnBlcm1pc3Npb24vQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy9uZXRsZWdhY3kyMi5wZXJtaXNzaW9uL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTE5LDYgKzE5LDcgQEAKICAgICBwYWNrYWdlPSJhbmRyb2lkLm5ldGxlZ2FjeTIyLnBlcm1pc3Npb24uY3RzIj4KIAogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uSU5KRUNUX0VWRU5UUyIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLklOVEVSTkVUIiAvPgogICAgIDxhcHBsaWNhdGlvbj4KICAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5jdHMuUGVybWlzc2lvblN0dWJBY3Rpdml0eSIKQEAgLTQwLDcgKzQxLDcgQEAKICAgICAgICAgcGFja2FnZS4gVGhhdCBydW5uZXIgY2Fubm90IGJlIGFkZGVkIHRvIHRoaXMgcGFja2FnZSBlaXRoZXIsIHNpbmNlIGl0CiAgICAgICAgIHJlbGllcyBvbiBoaWRkZW4gQVBJcy4KICAgICAtLT4KLSAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLm5ldGxlZ2FjeTIyLnBlcm1pc3Npb24uY3RzIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIG9mIGxlZ2FjeSBhbmRyb2lkLm5ldCBwZXJtaXNzaW9ucyBhcyBvZiBBUEkgMjIiPgogICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0ibGlzdGVuZXIiCmRpZmYgLS1naXQgYS90ZXN0cy9uZXRsZWdhY3kyMi5wZXJtaXNzaW9uL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL25ldGxlZ2FjeTIyLnBlcm1pc3Npb24vQW5kcm9pZFRlc3QueG1sCmluZGV4IGRiNmYyOTQuLjgzOTgzYTcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL25ldGxlZ2FjeTIyLnBlcm1pc3Npb24vQW5kcm9pZFRlc3QueG1sCisrKyBiL3Rlc3RzL25ldGxlZ2FjeTIyLnBlcm1pc3Npb24vQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgTGVnYWN5IGFuZHJvaWQubmV0IFBlcm1pc3Npb24gdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9Im5ldHdvcmtpbmciIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJub3Qtc2hhcmRhYmxlIiB2YWx1ZT0idHJ1ZSIgLz4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KZGlmZiAtLWdpdCBhL3Rlc3RzL25ldGxlZ2FjeTIyLnBlcm1pc3Npb24vc3JjL2FuZHJvaWQvbmV0L2N0cy9sZWdhY3kvYXBpMjIvcGVybWlzc2lvbi9RdGFndWlkUGVybWlzc2lvblRlc3QuamF2YSBiL3Rlc3RzL25ldGxlZ2FjeTIyLnBlcm1pc3Npb24vc3JjL2FuZHJvaWQvbmV0L2N0cy9sZWdhY3kvYXBpMjIvcGVybWlzc2lvbi9RdGFndWlkUGVybWlzc2lvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDBkYmEyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbmV0bGVnYWN5MjIucGVybWlzc2lvbi9zcmMvYW5kcm9pZC9uZXQvY3RzL2xlZ2FjeS9hcGkyMi9wZXJtaXNzaW9uL1F0YWd1aWRQZXJtaXNzaW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTI1IEBACitwYWNrYWdlIGFuZHJvaWQubmV0LmN0cy5sZWdhY3kuYXBpMjIucGVybWlzc2lvbjsKKworaW1wb3J0IGFuZHJvaWQubmV0LlRyYWZmaWNTdGF0czsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0LlNlcnZlclNvY2tldDsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7CisKK3B1YmxpYyBjbGFzcyBRdGFndWlkUGVybWlzc2lvblRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFFUQUdVSURfU1RBVFNfRklMRSA9ICIvcHJvYy9uZXQveHRfcXRhZ3VpZC9zdGF0cyI7CisKKyAgICBATWVkaXVtVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REZXZRdGFndWlkU2FuZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZSgiL2Rldi94dF9xdGFndWlkIik7CisgICAgICAgIGFzc2VydFRydWUoZi5jYW5SZWFkKCkpOworICAgICAgICBhc3NlcnRGYWxzZShmLmNhbldyaXRlKCkpOworICAgICAgICBhc3NlcnRGYWxzZShmLmNhbkV4ZWN1dGUoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFjY2Vzc1ByaXZhdGVUcmFmZmljU3RhdHMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGZpbmFsIGludCBvd25BcHBVaWQgPSBnZXRDb250ZXh0KCkuZ2V0QXBwbGljYXRpb25JbmZvKCkudWlkOworICAgICAgICB0cnkgeworICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgcXRhZ3VpZFJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihRVEFHVUlEX1NUQVRTX0ZJTEUpKTsKKyAgICAgICAgICAgIFN0cmluZyBsaW5lOworICAgICAgICAgICAgLy8gU2tpcCB0aGUgaGVhZGVyIGxpbmU7CisgICAgICAgICAgICBxdGFndWlkUmVhZGVyLnJlYWRMaW5lKCk7CisgICAgICAgICAgICB3aGlsZSAoKGxpbmUgPSBxdGFndWlkUmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdG9rZW5zW10gPSBsaW5lLnNwbGl0KCIgIik7CisgICAgICAgICAgICAgICAgLy8gR28gdGhyb3VnaCBhbGwgdGhlIGVudHJpZXMgd2UgZmluZCB0aGUgcXRhZ3VpZCBzdGF0cyBhbmQgZmFpbCBpZiB3ZSBmaW5kIGEgc3RhdHMKKyAgICAgICAgICAgICAgICAvLyB3aXRoIGRpZmZlcmVudCB1aWQuCisgICAgICAgICAgICAgICAgaWYgKHRva2Vucy5sZW5ndGggPiAzICYmICF0b2tlbnNbM10uZXF1YWxzKFN0cmluZy52YWx1ZU9mKG93bkFwcFVpZCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGZhaWwoIk90aGVyIGFwcHMgZGV0YWlsZWQgdHJhZmZpYyBzdGF0cyBsZWFrZWQsIHNlbGYgdWlkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgKyBTdHJpbmcudmFsdWVPZihvd25BcHBVaWQpICsgIiBmaW5kIHVpZDogIiArIHRva2Vuc1szXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcXRhZ3VpZFJlYWRlci5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiV2FzIG5vdCBhYmxlIHRvIGFjY2VzcyBxdGFndWlkL3N0YXRzOiAiICsgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWNjZXNzT3duVHJhZmZpY1N0YXRzKGxvbmcgZXhwZWN0ZWRUeEJ5dGVzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGZpbmFsIGludCBvd25BcHBVaWQgPSBnZXRDb250ZXh0KCkuZ2V0QXBwbGljYXRpb25JbmZvKCkudWlkOworCisgICAgICAgIGxvbmcgdG90YWxUeEJ5dGVzID0gMDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHF0YWd1aWRSZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoUVRBR1VJRF9TVEFUU19GSUxFKSk7CisgICAgICAgICAgICBTdHJpbmcgbGluZTsKKyAgICAgICAgICAgIHdoaWxlICgobGluZSA9IHF0YWd1aWRSZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN0cmluZyB0b2tlbnNbXSA9IGxpbmUuc3BsaXQoIiAiKTsKKyAgICAgICAgICAgICAgICBpZiAodG9rZW5zLmxlbmd0aCA+IDMgJiYgdG9rZW5zWzNdLmVxdWFscyhTdHJpbmcudmFsdWVPZihvd25BcHBVaWQpKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGUgdG90YWwgc3RhdHMgb2YgdGhpcyB1aWQgaXMgbGFyZ2VyIHRoZW4gMU1CCisgICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbnNbMl0uZXF1YWxzKCIweDAiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxUeEJ5dGVzICs9IEludGVnZXIucGFyc2VJbnQodG9rZW5zWzddKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHF0YWd1aWRSZWFkZXIuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIldhcyBub3QgYWJsZSB0byBhY2Nlc3MgcXRhZ3VpZC9zdGF0czogIiArIGUpOworICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUodG90YWxUeEJ5dGVzICsgIiBleHBlY3RlZCB0byBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8iCisgICAgICAgICAgICArIGV4cGVjdGVkVHhCeXRlcyArICJieXRlcyIsIHRvdGFsVHhCeXRlcyA+PSBleHBlY3RlZFR4Qnl0ZXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NPd25RdGFndWlkVHJhZmZpY1N0YXRzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBUcmFuc2ZlciAxTUIgb2YgZGF0YSBhY3Jvc3MgYW4gZXhwbGljaXRseSBsb2NhbGhvc3Qgc29ja2V0LgorICAgICAgICBmaW5hbCBpbnQgYnl0ZUNvdW50ID0gMTAyNDsKKyAgICAgICAgZmluYWwgaW50IHBhY2tldENvdW50ID0gMTAyNDsKKworICAgICAgICBmaW5hbCBTZXJ2ZXJTb2NrZXQgc2VydmVyID0gbmV3IFNlcnZlclNvY2tldCgwKTsKKyAgICAgICAgbmV3IFRocmVhZCgiQ3JlYXRlUHJpdmF0ZURhdGFUZXN0LmNyZWF0ZVRyYWZmaWNTdGF0c1dpdGhUYWdzIikgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgU29ja2V0IHNvY2tldCA9IG5ldyBTb2NrZXQoImxvY2FsaG9zdCIsIHNlcnZlci5nZXRMb2NhbFBvcnQoKSk7CisgICAgICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGVhY2ggd3JpdGUoKStmbHVzaCgpIHR1cm5zIGludG8gYSBwYWNrZXQ6CisgICAgICAgICAgICAgICAgICAgIC8vIGRpc2FibGUgTmFnbGUuCisgICAgICAgICAgICAgICAgICAgIHNvY2tldC5zZXRUY3BOb0RlbGF5KHRydWUpOworICAgICAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3V0ID0gc29ja2V0LmdldE91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbYnl0ZUNvdW50XTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWNrZXRDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBUcmFmZmljU3RhdHMuc2V0VGhyZWFkU3RhdHNUYWcoaSAlIDEwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRyYWZmaWNTdGF0cy50YWdTb2NrZXQoc29ja2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZShidWYpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmZsdXNoKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3V0LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIHNvY2tldC5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoImlvIGV4Y2VwdGlvbiIgKyBlLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9LnN0YXJ0KCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFNvY2tldCBzb2NrZXQgPSBzZXJ2ZXIuYWNjZXB0KCk7CisgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IHNvY2tldC5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW2J5dGVDb3VudF07CisgICAgICAgICAgICBpbnQgcmVhZCA9IDA7CisgICAgICAgICAgICB3aGlsZSAocmVhZCA8IGJ5dGVDb3VudCAqIHBhY2tldENvdW50KSB7CisgICAgICAgICAgICAgICAgaW50IG4gPSBpbi5yZWFkKGJ1Zik7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVW5leHBlY3RlZCBFT0YiLCBuID4gMCk7CisgICAgICAgICAgICAgICAgcmVhZCArPSBuOworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgc2VydmVyLmNsb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICBhY2Nlc3NPd25UcmFmZmljU3RhdHMoYnl0ZUNvdW50ICogcGFja2V0Q291bnQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL29wZW5nbHBlcmYyL0FuZHJvaWQubWsgYi90ZXN0cy9vcGVuZ2xwZXJmMi9BbmRyb2lkLm1rCmluZGV4IDRmNDAyY2EuLjgzMzUzNDAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL29wZW5nbHBlcmYyL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvb3BlbmdscGVyZjIvQW5kcm9pZC5tawpAQCAtMjEsNyArMjEsNyBAQAogIyBJbmNsdWRlIGJvdGggdGhlIDMyIGFuZCA2NCBiaXQgdmVyc2lvbnMKIExPQ0FMX01VTFRJTElCIDo9IGJvdGgKIAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwgY3RzdGVzdHJ1bm5lcgorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0IGN0c3Rlc3RydW5uZXItYXh0CiAKIExPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmN0c29wZW5nbF9qbmkKIApkaWZmIC0tZ2l0IGEvdGVzdHMvb3BlbmdscGVyZjIvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL29wZW5nbHBlcmYyL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggYjEwNTFhNGQuLmYyM2U0MTEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL29wZW5nbHBlcmYyL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvb3BlbmdscGVyZjIvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtNDYsNyArNDYsNyBAQAogICAgIDwvYXBwbGljYXRpb24+CiAKICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Ik9wZW5HTCBFUyBCZW5jaG1hcmsiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5vcGVuZ2wyLmN0cyIgLz4KIApkaWZmIC0tZ2l0IGEvdGVzdHMvb3BlbmdscGVyZjIvQW5kcm9pZFRlc3QueG1sIGIvdGVzdHMvb3BlbmdscGVyZjIvQW5kcm9pZFRlc3QueG1sCmluZGV4IDVkOGY5ZDEuLjRhYzA0NTUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL29wZW5nbHBlcmYyL0FuZHJvaWRUZXN0LnhtbAorKysgYi90ZXN0cy9vcGVuZ2xwZXJmMi9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBPcGVuR0wgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImdyYXBoaWNzIiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CmRpZmYgLS1naXQgYS90ZXN0cy9vcGVuZ2xwZXJmMi9qbmkvQW5kcm9pZC5tayBiL3Rlc3RzL29wZW5nbHBlcmYyL2puaS9BbmRyb2lkLm1rCmluZGV4IDE3NDM3NWQuLjI4M2JjMTggMTAwNjQ0Ci0tLSBhL3Rlc3RzL29wZW5nbHBlcmYyL2puaS9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL29wZW5nbHBlcmYyL2puaS9BbmRyb2lkLm1rCkBAIC0yMSw3ICsyMSw3IEBACiAjIE5lZWRlZCBpbiBvcmRlciB0byB1c2UgZmVuY2VzIGZvciBzeW5jaHJvbml6YXRpb24KIExPQ0FMX0NGTEFHUyArPSAtREVHTF9FR0xFWFRfUFJPVE9UWVBFUyAtZnVuc2lnbmVkLWNoYXIKIAotTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tdW51c2VkLXBhcmFtZXRlcgorTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXJyb3IgLVduby11bnVzZWQtcGFyYW1ldGVyCiAKICMgR2V0IGFsbCBjcHAgZmlsZXMgYnV0IG5vdCBoaWRkZW4gZmlsZXMKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLXN1YmRpci1jcHAtZmlsZXMpCkBAIC0zMCwxMCArMzAsNyBAQAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYkVHTCBsaWJHTEVTdjIgbGliYW5kcm9pZCBsaWJsb2cKIAotTE9DQUxfQ1hYX1NUTCA6PSBsaWJjKytfc3RhdGljCi0KLSMgVE9ETyAoZGltaXRyeSk6IHJlcGxhY2UgTE9DQUxfQ1hYX1NUTCB3aXRoIExPQ0FMX1NES19WRVJTSU9OK0xPQ0FMX05ES19TVExfVkFSSUFOVAotIyBMT0NBTF9TREtfVkVSU0lPTiA6PSAyMwotIyBMT0NBTF9OREtfU1RMX1ZBUklBTlQgOj0gYysrX3N0YXRpYworTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorTE9DQUxfTkRLX1NUTF9WQVJJQU5UIDo9IGMrK19zdGF0aWMKIAogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3BlbmdscGVyZjIvdGVzdC9BbmRyb2lkLm1rIGIvdGVzdHMvb3BlbmdscGVyZjIvdGVzdC9BbmRyb2lkLm1rCmluZGV4IGE5ZWM1NTguLjAxMDNlM2YgMTAwNjQ0Ci0tLSBhL3Rlc3RzL29wZW5nbHBlcmYyL3Rlc3QvQW5kcm9pZC5taworKysgYi90ZXN0cy9vcGVuZ2xwZXJmMi90ZXN0L0FuZHJvaWQubWsKQEAgLTE4LDYgKzE4LDcgQEAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLXN1YmRpci1jcHAtZmlsZXMpCiBMT0NBTF9TUkNfRklMRVMgKz0gLi4vam5pL2dyYXBoaWNzL01hdHJpeC5jcHAKIAorTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IKIExPQ0FMX0NfSU5DTFVERVMgKz0gJChMT0NBTF9QQVRIKS8uLi9qbmkvZ3JhcGhpY3MvCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYmxvZwogTE9DQUxfTERGTEFHUzo9IC1nIC1scHRocmVhZApkaWZmIC0tZ2l0IGEvdGVzdHMvcGRmL0FuZHJvaWQubWsgYi90ZXN0cy9wZGYvQW5kcm9pZC5tawppbmRleCAyYjMwMWFmLi40OWVmZDAzIDEwMDY0NAotLS0gYS90ZXN0cy9wZGYvQW5kcm9pZC5taworKysgYi90ZXN0cy9wZGYvQW5kcm9pZC5tawpAQCAtMjAsMjEgKzIwLDIwIEBACiAKIExPQ0FMX01VTFRJTElCIDo9IGJvdGgKIAotTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lcgorTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lci5zdHVicwogCiBMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgKz0gXAotICAgIGFuZHJvaWQtc3VwcG9ydC10ZXN0IFwKKyAgICBhbmRyb2lkeC50ZXN0LnJ1bGVzIFwKICAgICBtb2NraXRvLXRhcmdldC1taW51cy1qdW5pdDQgXAotICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwgXAotICAgIGN0c3Rlc3RydW5uZXIgXAotICAgIGFuZHJvaWQtc3VwcG9ydC1hbm5vdGF0aW9ucyBcCi0gICAganVuaXQgXAotICAgIGxlZ2FjeS1hbmRyb2lkLXRlc3QKKyAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBcCisgICAgY3RzdGVzdHJ1bm5lci1heHQgXAorICAgIGFuZHJvaWR4LmFubm90YXRpb25fYW5ub3RhdGlvbiBcCisgICAganVuaXQKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogCiAjIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0Ci1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMgY3RzX2luc3RhbnQKIAogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c1BkZlRlc3RDYXNlcwogCmRpZmYgLS1naXQgYS90ZXN0cy9wZGYvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL3BkZi9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDQ5NWI1ZGEuLjJkNjVmMWMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3BkZi9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL3BkZi9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0xNiw3ICsxNiw4IEBACiAgLS0+CiAKIDxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgcGFja2FnZT0iYW5kcm9pZC5ncmFwaGljcy5wZGYuY3RzIj4KKyAgICBwYWNrYWdlPSJhbmRyb2lkLmdyYXBoaWNzLnBkZi5jdHMiCisgICAgYW5kcm9pZDp0YXJnZXRTYW5kYm94VmVyc2lvbj0iMiI+CiAKICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkRJU0FCTEVfS0VZR1VBUkQiIC8+CiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9FWFRFUk5BTF9TVE9SQUdFIiAvPgpAQCAtMjQsNyArMjUsNyBAQAogICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KICAgICA8L2FwcGxpY2F0aW9uPgogCi0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5ncmFwaGljcy5wZGYuY3RzIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIG9mIGFuZHJvaWQuZ3JhcGhpY3MucGRmIj4KICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9Imxpc3RlbmVyIgpkaWZmIC0tZ2l0IGEvdGVzdHMvcGRmL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL3BkZi9BbmRyb2lkVGVzdC54bWwKaW5kZXggYWI4ODcyNi4uYTQwMmUxMCAxMDA2NDQKLS0tIGEvdGVzdHMvcGRmL0FuZHJvaWRUZXN0LnhtbAorKysgYi90ZXN0cy9wZGYvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw4ICsxNCwxMSBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIFBkZiB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0ibm90LXNoYXJkYWJsZSIgdmFsdWU9InRydWUiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJmcmFtZXdvcmsiIC8+CisKKyAgICA8IS0tIFByaW50aW5nIGlzIGEgbGFyZ2UgdXNlciBvZiBQREYsIGhlbmNlIHJ1biB0aGUgdGVzdHMgaW4gdGhlIHNhbWUgY29tcG9uZW50IC0tPgorICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0icHJpbnQiIC8+CiAKICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgpkaWZmIC0tZ2l0IGEvdGVzdHMvcGRmL3Jlcy9yYXcvcHJvdGVjdGVkX3BkZi5wZGYgYi90ZXN0cy9wZGYvcmVzL3Jhdy9wcm90ZWN0ZWRfcGRmLnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDA5MmI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGRmL3Jlcy9yYXcvcHJvdGVjdGVkX3BkZi5wZGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvcGRmL3NyYy9hbmRyb2lkL2dyYXBoaWNzL3BkZi9jdHMvUGRmRG9jdW1lbnRUZXN0LmphdmEgYi90ZXN0cy9wZGYvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvcGRmL2N0cy9QZGZEb2N1bWVudFRlc3QuamF2YQppbmRleCBlY2JiNmQyLi5kNjE5YTk2IDEwMDY0NAotLS0gYS90ZXN0cy9wZGYvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvcGRmL2N0cy9QZGZEb2N1bWVudFRlc3QuamF2YQorKysgYi90ZXN0cy9wZGYvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvcGRmL2N0cy9QZGZEb2N1bWVudFRlc3QuamF2YQpAQCAtMjUsMTAgKzI1LDExIEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5wZGYuUGRmRG9jdW1lbnQ7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5wZGYuUGRmUmVuZGVyZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5Ob25OdWxsOworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3BkZi9zcmMvYW5kcm9pZC9ncmFwaGljcy9wZGYvY3RzL1BkZlJlbmRlcmVyVGVzdC5qYXZhIGIvdGVzdHMvcGRmL3NyYy9hbmRyb2lkL2dyYXBoaWNzL3BkZi9jdHMvUGRmUmVuZGVyZXJUZXN0LmphdmEKaW5kZXggMmYwMTU4ZS4uYWVhYmZiZiAxMDA2NDQKLS0tIGEvdGVzdHMvcGRmL3NyYy9hbmRyb2lkL2dyYXBoaWNzL3BkZi9jdHMvUGRmUmVuZGVyZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvcGRmL3NyYy9hbmRyb2lkL2dyYXBoaWNzL3BkZi9jdHMvUGRmUmVuZGVyZXJUZXN0LmphdmEKQEAgLTM0LDE3ICszNCwxNiBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3I7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5NYXRyaXg7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MucGRmLmN0cy5SOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MucGRmLlBkZlJlbmRlcmVyOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MucGRmLlBkZlJlbmRlcmVyLlBhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MucGRmLmN0cy5SOworCitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5Ob25OdWxsOworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuSWdub3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApAQCAtNjIsNiArNjEsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBNV9QT1JUUkFJVF9QUklOVFNDQUxJTkdfTk9ORSA9CiAgICAgICAgICAgICBSLnJhdy5hNV9wb3J0cmFpdF9yZ2JiXzFfNl9wcmludHNjYWxpbmdfbm9uZTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFdPX1BBR0VTID0gUi5yYXcudHdvX3BhZ2VzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUk9URUNURURfUERGID0gUi5yYXcucHJvdGVjdGVkX3BkZjsKIAogICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKIApAQCAtNzYsMTIgKzc2LDI4IEBACiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBASWdub3JlKCJNYWtlcyBhbGwgc3Vic2VxdWVudCB0ZXN0cyBmYWlsIikKICAgICBwdWJsaWMgdm9pZCBjb25zdHJ1Y3RSZW5kZXJlckZyb21Ob25QREYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gT3BlbiBqcGcgYXMgaWYgaXQgd2FzIGEgUERGCi0gICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkub3BlblJhd1Jlc291cmNlRmQoUi5yYXcudGVzdGltYWdlKQotICAgICAgICAgICAgICAgIC5nZXRQYXJjZWxGaWxlRGVzY3JpcHRvcigpOwotICAgICAgICB2ZXJpZnlFeGNlcHRpb24oKCkgLT4gbmV3IFBkZlJlbmRlcmVyKGZkKSwgSU9FeGNlcHRpb24uY2xhc3MpOworICAgICAgICB2ZXJpZnlFeGNlcHRpb24oKCkgLT4gY3JlYXRlUmVuZGVyZXIoUi5yYXcudGVzdGltYWdlLCBtQ29udGV4dCksIElPRXhjZXB0aW9uLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGNvbnN0cnVjdFJlbmRlcmVyRnJvbVByb3RlY3RlZFBERigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB2ZXJpZnlFeGNlcHRpb24oKCkgLT4gY3JlYXRlUmVuZGVyZXIoUFJPVEVDVEVEX1BERiwgbUNvbnRleHQpLCBTZWN1cml0eUV4Y2VwdGlvbi5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZW5kZXJlclJlY292ZXJzQWZ0ZXJGYWlsdXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIENyZWF0ZSByZW5kZXJlZCB0byBwcmV2ZW50IGxpYiBmcm9tIGJlaW5nIHVubG9hZGVkCisgICAgICAgIFBkZlJlbmRlcmVyIGZpcnN0UmVuZGVyZXIgPSBjcmVhdGVSZW5kZXJlcihBNF9QT1JUUkFJVCwgbUNvbnRleHQpOworCisgICAgICAgIHZlcmlmeUV4Y2VwdGlvbigoKSAtPiBjcmVhdGVSZW5kZXJlcihQUk9URUNURURfUERGLCBtQ29udGV4dCksIFNlY3VyaXR5RXhjZXB0aW9uLmNsYXNzKTsKKworICAgICAgICAvLyBXZSBjYW4gY3JlYXRlIG5ldyByZW5kZXJlcnMgYWZ0ZXIgd2UgZmFpbGVkIHRvIGNyZWF0ZSBvbmUKKyAgICAgICAgUGRmUmVuZGVyZXIgcmVuZGVyZXIgPSBjcmVhdGVSZW5kZXJlcihUV09fUEFHRVMsIG1Db250ZXh0KTsKKyAgICAgICAgcmVuZGVyZXIuY2xvc2UoKTsKKworICAgICAgICBmaXJzdFJlbmRlcmVyLmNsb3NlKCk7CiAgICAgfQogCiAgICAgQFRlc3QKZGlmZiAtLWdpdCBhL3Rlc3RzL3BkZi9zcmMvYW5kcm9pZC9ncmFwaGljcy9wZGYvY3RzL1BkZlJlbmRlcmVyVHJhbnNmb3JtVGVzdC5qYXZhIGIvdGVzdHMvcGRmL3NyYy9hbmRyb2lkL2dyYXBoaWNzL3BkZi9jdHMvUGRmUmVuZGVyZXJUcmFuc2Zvcm1UZXN0LmphdmEKaW5kZXggNGYxODZlYS4uMDcwMGQ3NCAxMDA2NDQKLS0tIGEvdGVzdHMvcGRmL3NyYy9hbmRyb2lkL2dyYXBoaWNzL3BkZi9jdHMvUGRmUmVuZGVyZXJUcmFuc2Zvcm1UZXN0LmphdmEKKysrIGIvdGVzdHMvcGRmL3NyYy9hbmRyb2lkL2dyYXBoaWNzL3BkZi9jdHMvUGRmUmVuZGVyZXJUcmFuc2Zvcm1UZXN0LmphdmEKQEAgLTI2LDEwICsyNiwxMSBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLnBkZi5QZGZSZW5kZXJlcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLnBkZi5QZGZSZW5kZXJlci5QYWdlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk51bGxhYmxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLlJhd1JlczsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKKworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTnVsbGFibGU7CitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5SYXdSZXM7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwogCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3BkZi9zcmMvYW5kcm9pZC9ncmFwaGljcy9wZGYvY3RzL1V0aWxzLmphdmEgYi90ZXN0cy9wZGYvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvcGRmL2N0cy9VdGlscy5qYXZhCmluZGV4IDRkNDNlMDkuLjg2NTY0NzggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3BkZi9zcmMvYW5kcm9pZC9ncmFwaGljcy9wZGYvY3RzL1V0aWxzLmphdmEKKysrIGIvdGVzdHMvcGRmL3NyYy9hbmRyb2lkL2dyYXBoaWNzL3BkZi9jdHMvVXRpbHMuamF2YQpAQCAtMjUsMTAgKzI1LDEwIEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MucGRmLlBkZlJlbmRlcmVyOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3I7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uRmxvYXRSYW5nZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk51bGxhYmxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLlJhd1JlczsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLkZsb2F0UmFuZ2U7CitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5Ob25OdWxsOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTnVsbGFibGU7CitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5SYXdSZXM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkFycmF5TWFwOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZldHRvL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL3BlcmZldHRvL0FuZHJvaWRUZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjVhZjZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZmV0dG8vQW5kcm9pZFRlc3QueG1sCkBAIC0wLDAgKzEsMzQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IS0tIFRoZSBBbmRyb2lkLm1rIGZpbGUgdGhhdCBkZWZpbmVzIHRoZXNlIHRhcmdldCBsaXZlcyBpbiAvZXh0ZXJuYWwvcGVyZmV0dG8vY3RzIC0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIFBlcmZldHRvIHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c1BlcmZldHRvUHJvZHVjZXJBcHAuYXBrIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRhcmdldHByZXAuRmlsZVB1c2hlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cCIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9IkN0c1BlcmZldHRvVGVzdENhc2VzLT4vZGF0YS9sb2NhbC90bXAvQ3RzUGVyZmV0dG9UZXN0Q2FzZXMiIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkdUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZGV2aWNlLXBhdGgiIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibW9kdWxlLW5hbWUiIHZhbHVlPSJDdHNQZXJmZXR0b1Rlc3RDYXNlcyIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJydW50aW1lLWhpbnQiIHZhbHVlPSIwbTVzIiAvPgorICAgICAgICA8IS0tIHRlc3QtdGltZW91dCB1bml0IGlzIG1zLCB2YWx1ZSA9IDEwIHNlY29uZHMgLS0+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtdGltZW91dCIgdmFsdWU9IjEwMDAwIiAvPgorICAgIDwvdGVzdD4KKzwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL3NhbXBsZS9BbmRyb2lkLm1rIGIvdGVzdHMvc2FtcGxlL0FuZHJvaWQubWsKaW5kZXggZjZkODc2MC4uOWQ1Njg1MCAxMDA3NTUKLS0tIGEvdGVzdHMvc2FtcGxlL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvc2FtcGxlL0FuZHJvaWQubWsKQEAgLTI2LDE3ICsyNiwxOCBAQAogTE9DQUxfUFJPR1VBUkRfRU5BQkxFRCA6PSBkaXNhYmxlZAogCiBMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAotICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwgXAotICAgIGFuZHJvaWQtc3VwcG9ydC10ZXN0IFwKLSAgICBsZWdhY3ktYW5kcm9pZC10ZXN0CisgICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgXAorICAgIGFuZHJvaWR4LnRlc3QucnVsZXMKKworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lci5zdHVicyBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicwogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKICMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cyBjdHNfaW5zdGFudAogCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzU2FtcGxlRGV2aWNlVGVzdENhc2VzCiAKIExPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKIAotaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCitpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS90ZXN0cy9zYW1wbGUvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL3NhbXBsZS9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDEwODMyMWYuLmFkZWIwNTAgMTAwNzU1Ci0tLSBhL3Rlc3RzL3NhbXBsZS9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL3NhbXBsZS9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0xNiw3ICsxNiw4IEBACiAgLS0+CiAKIDxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgcGFja2FnZT0iYW5kcm9pZC5zYW1wbGUuY3RzIj4KKyAgICBwYWNrYWdlPSJhbmRyb2lkLnNhbXBsZS5jdHMiCisgICAgYW5kcm9pZDp0YXJnZXRTYW5kYm94VmVyc2lvbj0iMiI+CiAKICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0VYVEVSTkFMX1NUT1JBR0UiIC8+CiAgICAgPGFwcGxpY2F0aW9uPgpAQCAtMzEsNyArMzIsNyBAQAogCiAgICAgPCEtLSAgc2VsZi1pbnN0cnVtZW50aW5nIHRlc3QgcGFja2FnZS4gLS0+CiAgICAgPGluc3RydW1lbnRhdGlvbgotICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgc2FtcGxlIHRlc3RzIgogICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuc2FtcGxlLmN0cyIgPgogICAgIDwvaW5zdHJ1bWVudGF0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvc2FtcGxlL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL3NhbXBsZS9BbmRyb2lkVGVzdC54bWwKaW5kZXggYzhkMTk0OS4uOGE3ZDJkOSAxMDA2NDQKLS0tIGEvdGVzdHMvc2FtcGxlL0FuZHJvaWRUZXN0LnhtbAorKysgYi90ZXN0cy9zYW1wbGUvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgU2FtcGxlIHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJtaXNjIiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CmRpZmYgLS1naXQgYS90ZXN0cy9zYW1wbGUvc3JjL2FuZHJvaWQvc2FtcGxlL2N0cy9TYW1wbGVKVW5pdDREZXZpY2VUZXN0LmphdmEgYi90ZXN0cy9zYW1wbGUvc3JjL2FuZHJvaWQvc2FtcGxlL2N0cy9TYW1wbGVKVW5pdDREZXZpY2VUZXN0LmphdmEKaW5kZXggYzg4NjNiMy4uM2FhMGNiMCAxMDA3NTUKLS0tIGEvdGVzdHMvc2FtcGxlL3NyYy9hbmRyb2lkL3NhbXBsZS9jdHMvU2FtcGxlSlVuaXQ0RGV2aWNlVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3NhbXBsZS9zcmMvYW5kcm9pZC9zYW1wbGUvY3RzL1NhbXBsZUpVbml0NERldmljZVRlc3QuamF2YQpAQCAtMTUsMTkgKzE1LDE1IEBACiAgKi8KIHBhY2thZ2UgYW5kcm9pZC5zYW1wbGUuY3RzOwogCitpbXBvcnQgYW5kcm9pZC5zYW1wbGUuU2FtcGxlRGV2aWNlQWN0aXZpdHk7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKLWltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKLWltcG9ydCBhbmRyb2lkLnNhbXBsZS5TYW1wbGVEZXZpY2VBY3Rpdml0eTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIAogLyoqCiAgKiBBIHNpbXBsZSBjb21wYXRpYmlsaXR5IHRlc3Qgd2hpY2ggdGVzdHMgdGhlIFNoYXJlZFByZWZlcmVuY2VzIEFQSS4KZGlmZiAtLWdpdCBhL3Rlc3RzL3NlY3VyaXR5L0FuZHJvaWQubWsgYi90ZXN0cy9zZWN1cml0eS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFlY2MwNzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zZWN1cml0eS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjYgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworIyBEb24ndCBpbmNsdWRlIHRoaXMgcGFja2FnZSBpbiBhbnkgdGFyZ2V0LgorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGJvdW5jeWNhc3RsZSBib3VuY3ljYXN0bGUtYmNwa2l4IGd1YXZhCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCitMT0NBTF9NT0RVTEUgOj0gY3RzLXNlY3VyaXR5LXRlc3Qtc3VwcG9ydC1saWJyYXJ5CisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfSkFWQV9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMva2V5c3RvcmUvc3JjL2FuZHJvaWQva2V5c3RvcmUvY3RzL0FzbjFVdGlscy5qYXZhIGIvdGVzdHMvc2VjdXJpdHkvc3JjL2FuZHJvaWQva2V5c3RvcmUvY3RzL0FzbjFVdGlscy5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy90ZXN0cy9rZXlzdG9yZS9zcmMvYW5kcm9pZC9rZXlzdG9yZS9jdHMvQXNuMVV0aWxzLmphdmEKcmVuYW1lIHRvIHRlc3RzL3NlY3VyaXR5L3NyYy9hbmRyb2lkL2tleXN0b3JlL2N0cy9Bc24xVXRpbHMuamF2YQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMva2V5c3RvcmUvc3JjL2FuZHJvaWQva2V5c3RvcmUvY3RzL0F0dGVzdGF0aW9uLmphdmEgYi90ZXN0cy9zZWN1cml0eS9zcmMvYW5kcm9pZC9rZXlzdG9yZS9jdHMvQXR0ZXN0YXRpb24uamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvdGVzdHMva2V5c3RvcmUvc3JjL2FuZHJvaWQva2V5c3RvcmUvY3RzL0F0dGVzdGF0aW9uLmphdmEKcmVuYW1lIHRvIHRlc3RzL3NlY3VyaXR5L3NyYy9hbmRyb2lkL2tleXN0b3JlL2N0cy9BdHRlc3RhdGlvbi5qYXZhCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9rZXlzdG9yZS9zcmMvYW5kcm9pZC9rZXlzdG9yZS9jdHMvQXR0ZXN0YXRpb25BcHBsaWNhdGlvbklkLmphdmEgYi90ZXN0cy9zZWN1cml0eS9zcmMvYW5kcm9pZC9rZXlzdG9yZS9jdHMvQXR0ZXN0YXRpb25BcHBsaWNhdGlvbklkLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL3Rlc3RzL2tleXN0b3JlL3NyYy9hbmRyb2lkL2tleXN0b3JlL2N0cy9BdHRlc3RhdGlvbkFwcGxpY2F0aW9uSWQuamF2YQpyZW5hbWUgdG8gdGVzdHMvc2VjdXJpdHkvc3JjL2FuZHJvaWQva2V5c3RvcmUvY3RzL0F0dGVzdGF0aW9uQXBwbGljYXRpb25JZC5qYXZhCmRpZmYgLS1naXQgYS90ZXN0cy9zZWN1cml0eS9zcmMvYW5kcm9pZC9rZXlzdG9yZS9jdHMvQXR0ZXN0YXRpb25QYWNrYWdlSW5mby5qYXZhIGIvdGVzdHMvc2VjdXJpdHkvc3JjL2FuZHJvaWQva2V5c3RvcmUvY3RzL0F0dGVzdGF0aW9uUGFja2FnZUluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzNlMmJkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc2VjdXJpdHkvc3JjL2FuZHJvaWQva2V5c3RvcmUvY3RzL0F0dGVzdGF0aW9uUGFja2FnZUluZm8uamF2YQpAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQKKyAqIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZQorICogaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzCisgKiBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisgKiB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQua2V5c3RvcmUuY3RzOworCitpbXBvcnQgY29tLmFuZHJvaWQub3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFFbmNvZGFibGU7CitpbXBvcnQgY29tLmFuZHJvaWQub3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZTsKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb247CisKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBBdHRlc3RhdGlvblBhY2thZ2VJbmZvIGltcGxlbWVudHMgamF2YS5sYW5nLkNvbXBhcmFibGU8QXR0ZXN0YXRpb25QYWNrYWdlSW5mbz4geworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQQUNLQUdFX05BTUVfSU5ERVggPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWRVJTSU9OX0lOREVYID0gMTsKKworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHBhY2thZ2VOYW1lOworICAgIHByaXZhdGUgZmluYWwgbG9uZyB2ZXJzaW9uOworCisgICAgcHVibGljIEF0dGVzdGF0aW9uUGFja2FnZUluZm8oU3RyaW5nIHBhY2thZ2VOYW1lLCBsb25nIHZlcnNpb24pIHsKKyAgICAgICAgdGhpcy5wYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lOworICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOworICAgIH0KKworICAgIHB1YmxpYyBBdHRlc3RhdGlvblBhY2thZ2VJbmZvKEFTTjFFbmNvZGFibGUgYXNuMUVuY29kYWJsZSkgdGhyb3dzIENlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICghKGFzbjFFbmNvZGFibGUgaW5zdGFuY2VvZiBBU04xU2VxdWVuY2UpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgc2VxdWVuY2UgZm9yIEF0dGVzdGF0aW9uUGFja2FnZUluZm8sIGZvdW5kICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGFzbjFFbmNvZGFibGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICB9CisKKyAgICAgICAgQVNOMVNlcXVlbmNlIHNlcXVlbmNlID0gKEFTTjFTZXF1ZW5jZSkgYXNuMUVuY29kYWJsZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBhY2thZ2VOYW1lID0gQXNuMVV0aWxzLmdldFN0cmluZ0Zyb21Bc24xT2N0ZXRTdHJlYW1Bc3N1bWluZ1VURjgoCisgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlLmdldE9iamVjdEF0KFBBQ0tBR0VfTkFNRV9JTkRFWCkpOworICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJDb252ZXJ0aW5nIG9jdGV0IHN0cmVhbSB0byBTdHJpbmcgdHJpZ2dlcmVkIGFuIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICBlKTsKKyAgICAgICAgfQorICAgICAgICB2ZXJzaW9uID0gQXNuMVV0aWxzLmdldExvbmdGcm9tQXNuMShzZXF1ZW5jZS5nZXRPYmplY3RBdChWRVJTSU9OX0lOREVYKSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHBhY2thZ2VOYW1lOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldFZlcnNpb24oKSB7CisgICAgICAgIHJldHVybiB2ZXJzaW9uOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nQnVpbGRlcigpLmFwcGVuZCgiUGFja2FnZSBuYW1lOiAiKS5hcHBlbmQoZ2V0UGFja2FnZU5hbWUoKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJcblZlcnNpb246ICIgKyBnZXRWZXJzaW9uKCkpLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBjb21wYXJlVG8oQXR0ZXN0YXRpb25QYWNrYWdlSW5mbyBvdGhlcikgeworICAgICAgICBpbnQgcmVzID0gcGFja2FnZU5hbWUuY29tcGFyZVRvKG90aGVyLnBhY2thZ2VOYW1lKTsKKyAgICAgICAgaWYgKHJlcyAhPSAwKSByZXR1cm4gcmVzOworICAgICAgICByZXMgPSBMb25nLmNvbXBhcmUodmVyc2lvbiwgb3RoZXIudmVyc2lvbik7CisgICAgICAgIGlmIChyZXMgIT0gMCkgcmV0dXJuIHJlczsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgcmV0dXJuIChvIGluc3RhbmNlb2YgQXR0ZXN0YXRpb25QYWNrYWdlSW5mbykKKyAgICAgICAgICAgICAgICAmJiAoMCA9PSBjb21wYXJlVG8oKEF0dGVzdGF0aW9uUGFja2FnZUluZm8pIG8pKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zZWN1cml0eS9zcmMvYW5kcm9pZC9rZXlzdG9yZS9jdHMvQXV0aG9yaXphdGlvbkxpc3QuamF2YSBiL3Rlc3RzL3NlY3VyaXR5L3NyYy9hbmRyb2lkL2tleXN0b3JlL2N0cy9BdXRob3JpemF0aW9uTGlzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ODQ5ZjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zZWN1cml0eS9zcmMvYW5kcm9pZC9rZXlzdG9yZS9jdHMvQXV0aG9yaXphdGlvbkxpc3QuamF2YQpAQCAtMCwwICsxLDczMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5rZXlzdG9yZS5jdHM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5GdW5jdGlvbnMuZm9yTWFwOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkNvbGxlY3Rpb25zMi50cmFuc2Zvcm07CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkpvaW5lcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworCitpbXBvcnQgYW5kcm9pZC5zZWN1cml0eS5rZXlzdG9yZS5LZXlQcm9wZXJ0aWVzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZTsKK2ltcG9ydCBjb20uYW5kcm9pZC5vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVByaW1pdGl2ZTsKK2ltcG9ydCBjb20uYW5kcm9pZC5vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlOworaW1wb3J0IGNvbS5hbmRyb2lkLm9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2VQYXJzZXI7CitpbXBvcnQgY29tLmFuZHJvaWQub3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFUYWdnZWRPYmplY3Q7CitpbXBvcnQgY29tLmFuZHJvaWQub3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFJbnB1dFN0cmVhbTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworcHVibGljIGNsYXNzIEF1dGhvcml6YXRpb25MaXN0IHsKKyAgICAvLyBBbGdvcml0aG0gdmFsdWVzLgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtNX0FMR09SSVRITV9SU0EgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtNX0FMR09SSVRITV9FQyA9IDM7CisKKyAgICAvLyBFQyBDdXJ2ZXMKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLTV9FQ19DVVJWRV9QMjI0ID0gMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLTV9FQ19DVVJWRV9QMjU2ID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLTV9FQ19DVVJWRV9QMzg0ID0gMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLTV9FQ19DVVJWRV9QNTIxID0gMzsKKworICAgIC8vIFBhZGRpbmcgbW9kZXMuCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS01fUEFEX05PTkUgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtNX1BBRF9SU0FfT0FFUCA9IDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS01fUEFEX1JTQV9QU1MgPSAzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtNX1BBRF9SU0FfUEtDUzFfMV81X0VOQ1JZUFQgPSA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtNX1BBRF9SU0FfUEtDUzFfMV81X1NJR04gPSA1OworCisgICAgLy8gRGlnZXN0IG1vZGVzLgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtNX0RJR0VTVF9OT05FID0gMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLTV9ESUdFU1RfTUQ1ID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLTV9ESUdFU1RfU0hBMSA9IDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS01fRElHRVNUX1NIQV8yXzIyNCA9IDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS01fRElHRVNUX1NIQV8yXzI1NiA9IDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS01fRElHRVNUX1NIQV8yXzM4NCA9IDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS01fRElHRVNUX1NIQV8yXzUxMiA9IDY7CisKKyAgICAvLyBLZXkgb3JpZ2lucy4KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLTV9PUklHSU5fR0VORVJBVEVEID0gMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLTV9PUklHSU5fSU1QT1JURUQgPSAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtNX09SSUdJTl9VTktOT1dOID0gMzsKKworICAgIC8vIE9wZXJhdGlvbiBQdXJwb3Nlcy4KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLTV9QVVJQT1NFX0VOQ1JZUFQgPSAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtNX1BVUlBPU0VfREVDUllQVCA9IDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS01fUFVSUE9TRV9TSUdOID0gMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLTV9QVVJQT1NFX1ZFUklGWSA9IDM7CisKKyAgICAvLyBVc2VyIGF1dGhlbnRpY2F0b3JzLgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhXX0FVVEhfUEFTU1dPUkQgPSAxIDw8IDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSFdfQVVUSF9GSU5HRVJQUklOVCA9IDEgPDwgMTsKKworICAgIC8vIEtleW1hc3RlciB0YWcgY2xhc3NlcworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBLTV9FTlVNID0gMSA8PCAyODsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgS01fRU5VTV9SRVAgPSAyIDw8IDI4OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBLTV9VSU5UID0gMyA8PCAyODsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgS01fVUxPTkcgPSA1IDw8IDI4OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBLTV9EQVRFID0gNiA8PCAyODsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgS01fQk9PTCA9IDcgPDwgMjg7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEtNX0JZVEVTID0gOSA8PCAyODsKKworICAgIC8vIFRhZyBjbGFzcyByZW1vdmFsIG1hc2sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgS0VZTUFTVEVSX1RBR19UWVBFX01BU0sgPSAweDBGRkZGRkZGOworCisgICAgLy8gS2V5bWFzdGVyIHRhZ3MKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgS01fVEFHX1BVUlBPU0UgPSBLTV9FTlVNX1JFUCB8IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEtNX1RBR19BTEdPUklUSE0gPSBLTV9FTlVNIHwgMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgS01fVEFHX0tFWV9TSVpFID0gS01fVUlOVCB8IDM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEtNX1RBR19ESUdFU1QgPSBLTV9FTlVNX1JFUCB8IDU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEtNX1RBR19QQURESU5HID0gS01fRU5VTV9SRVAgfCA2OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBLTV9UQUdfRUNfQ1VSVkUgPSBLTV9FTlVNIHwgMTA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEtNX1RBR19SU0FfUFVCTElDX0VYUE9ORU5UID0gS01fVUxPTkcgfCAyMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEtNX1RBR19ST0xMQkFDS19SRVNJU1RBTkNFID0gS01fQk9PTCB8IDMwMzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgS01fVEFHX0FDVElWRV9EQVRFVElNRSA9IEtNX0RBVEUgfCA0MDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEtNX1RBR19PUklHSU5BVElPTl9FWFBJUkVfREFURVRJTUUgPSBLTV9EQVRFIHwgNDAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBLTV9UQUdfVVNBR0VfRVhQSVJFX0RBVEVUSU1FID0gS01fREFURSB8IDQwMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgS01fVEFHX05PX0FVVEhfUkVRVUlSRUQgPSBLTV9CT09MIHwgNTAzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBLTV9UQUdfVVNFUl9BVVRIX1RZUEUgPSBLTV9FTlVNIHwgNTA0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBLTV9UQUdfQVVUSF9USU1FT1VUID0gS01fVUlOVCB8IDUwNTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgS01fVEFHX0FMTE9XX1dISUxFX09OX0JPRFkgPSBLTV9CT09MIHwgNTA2OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBLTV9UQUdfVFJVU1RFRF9VU0VSX1BSRVNFTkNFX1JFUVVJUkVEID0gS01fQk9PTCB8IDUwNzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgS01fVEFHX1RSVVNURURfQ09ORklSTUFUSU9OX1JFUVVJUkVEID0gS01fQk9PTCB8IDUwODsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgS01fVEFHX1VOTE9DS0VEX0RFVklDRV9SRVFVSVJFRCA9IEtNX0JPT0wgfCA1MDk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEtNX1RBR19BTExfQVBQTElDQVRJT05TID0gS01fQk9PTCB8IDYwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgS01fVEFHX0NSRUFUSU9OX0RBVEVUSU1FID0gS01fREFURSB8IDcwMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgS01fVEFHX09SSUdJTiA9IEtNX0VOVU0gfCA3MDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEtNX1RBR19ST0xMQkFDS19SRVNJU1RBTlQgPSBLTV9CT09MIHwgNzAzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBLTV9UQUdfUk9PVF9PRl9UUlVTVCA9IEtNX0JZVEVTIHwgNzA0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBLTV9UQUdfT1NfVkVSU0lPTiA9IEtNX1VJTlQgfCA3MDU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEtNX1RBR19PU19QQVRDSExFVkVMID0gS01fVUlOVCB8IDcwNjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgS01fVEFHX0FUVEVTVEFUSU9OX0FQUExJQ0FUSU9OX0lEID0gS01fQllURVMgfCA3MDk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEtNX1RBR19BVFRFU1RBVElPTl9JRF9CUkFORCA9IEtNX0JZVEVTIHwgNzEwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBLTV9UQUdfQVRURVNUQVRJT05fSURfREVWSUNFID0gS01fQllURVMgfCA3MTE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEtNX1RBR19BVFRFU1RBVElPTl9JRF9QUk9EVUNUID0gS01fQllURVMgfCA3MTI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEtNX1RBR19BVFRFU1RBVElPTl9JRF9TRVJJQUwgPSBLTV9CWVRFUyB8IDcxMzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgS01fVEFHX0FUVEVTVEFUSU9OX0lEX0lNRUkgPSBLTV9CWVRFUyB8IDcxNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgS01fVEFHX0FUVEVTVEFUSU9OX0lEX01FSUQgPSBLTV9CWVRFUyB8IDcxNTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgS01fVEFHX0FUVEVTVEFUSU9OX0lEX01BTlVGQUNUVVJFUiA9IEtNX0JZVEVTIHwgNzE2OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBLTV9UQUdfQVRURVNUQVRJT05fSURfTU9ERUwgPSBLTV9CWVRFUyB8IDcxNzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgS01fVEFHX1ZFTkRPUl9QQVRDSExFVkVMID0gS01fVUlOVCB8IDcxODsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgS01fVEFHX0JPT1RfUEFUQ0hMRVZFTCA9IEtNX1VJTlQgfCA3MTk7CisKKyAgICAvLyBNYXAgZm9yIGNvbnZlcnRpbmcgcGFkZGluZyB2YWx1ZXMgdG8gc3RyaW5ncworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEltbXV0YWJsZU1hcDxJbnRlZ2VyLCBTdHJpbmc+IHBhZGRpbmdNYXAgPSBJbW11dGFibGVNYXAKKyAgICAgICAgICAgIC48SW50ZWdlciwgU3RyaW5nPiBidWlsZGVyKCkKKyAgICAgICAgICAgIC5wdXQoS01fUEFEX05PTkUsICJOT05FIikKKyAgICAgICAgICAgIC5wdXQoS01fUEFEX1JTQV9PQUVQLCAiT0FFUCIpCisgICAgICAgICAgICAucHV0KEtNX1BBRF9SU0FfUFNTLCAiUFNTIikKKyAgICAgICAgICAgIC5wdXQoS01fUEFEX1JTQV9QS0NTMV8xXzVfRU5DUllQVCwgIlBLQ1MxIEVOQ1JZUFQiKQorICAgICAgICAgICAgLnB1dChLTV9QQURfUlNBX1BLQ1MxXzFfNV9TSUdOLCAiUEtDUzEgU0lHTiIpCisgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgIC8vIE1hcCBmb3IgY29udmVydGluZyBkaWdlc3QgdmFsdWVzIHRvIHN0cmluZ3MKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJbW11dGFibGVNYXA8SW50ZWdlciwgU3RyaW5nPiBkaWdlc3RNYXAgPSBJbW11dGFibGVNYXAKKyAgICAgICAgICAgIC48SW50ZWdlciwgU3RyaW5nPiBidWlsZGVyKCkKKyAgICAgICAgICAgIC5wdXQoS01fRElHRVNUX05PTkUsICJOT05FIikKKyAgICAgICAgICAgIC5wdXQoS01fRElHRVNUX01ENSwgIk1ENSIpCisgICAgICAgICAgICAucHV0KEtNX0RJR0VTVF9TSEExLCAiU0hBMSIpCisgICAgICAgICAgICAucHV0KEtNX0RJR0VTVF9TSEFfMl8yMjQsICJTSEEyMjQiKQorICAgICAgICAgICAgLnB1dChLTV9ESUdFU1RfU0hBXzJfMjU2LCAiU0hBMjU2IikKKyAgICAgICAgICAgIC5wdXQoS01fRElHRVNUX1NIQV8yXzM4NCwgIlNIQTM4NCIpCisgICAgICAgICAgICAucHV0KEtNX0RJR0VTVF9TSEFfMl81MTIsICJTSEE1MTIiKQorICAgICAgICAgICAgLmJ1aWxkKCk7CisKKyAgICAvLyBNYXAgZm9yIGNvbnZlcnRpbmcgcHVycG9zZSB2YWx1ZXMgdG8gc3RyaW5ncworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEltbXV0YWJsZU1hcDxJbnRlZ2VyLCBTdHJpbmc+IHB1cnBvc2VNYXAgPSBJbW11dGFibGVNYXAKKyAgICAgICAgICAgIC48SW50ZWdlciwgU3RyaW5nPiBidWlsZGVyKCkKKyAgICAgICAgICAgIC5wdXQoS01fUFVSUE9TRV9ERUNSWVBULCAiREVDUllQVCIpCisgICAgICAgICAgICAucHV0KEtNX1BVUlBPU0VfRU5DUllQVCwgIkVOQ1JZUFQiKQorICAgICAgICAgICAgLnB1dChLTV9QVVJQT1NFX1NJR04sICJTSUdOIikKKyAgICAgICAgICAgIC5wdXQoS01fUFVSUE9TRV9WRVJJRlksICJWRVJJRlkiKQorICAgICAgICAgICAgLmJ1aWxkKCk7CisKKyAgICBwcml2YXRlIFNldDxJbnRlZ2VyPiBwdXJwb3NlczsKKyAgICBwcml2YXRlIEludGVnZXIgYWxnb3JpdGhtOworICAgIHByaXZhdGUgSW50ZWdlciBrZXlTaXplOworICAgIHByaXZhdGUgU2V0PEludGVnZXI+IGRpZ2VzdHM7CisgICAgcHJpdmF0ZSBTZXQ8SW50ZWdlcj4gcGFkZGluZ01vZGVzOworICAgIHByaXZhdGUgSW50ZWdlciBlY0N1cnZlOworICAgIHByaXZhdGUgTG9uZyByc2FQdWJsaWNFeHBvbmVudDsKKyAgICBwcml2YXRlIERhdGUgYWN0aXZlRGF0ZVRpbWU7CisgICAgcHJpdmF0ZSBEYXRlIG9yaWdpbmF0aW9uRXhwaXJlRGF0ZVRpbWU7CisgICAgcHJpdmF0ZSBEYXRlIHVzYWdlRXhwaXJlRGF0ZVRpbWU7CisgICAgcHJpdmF0ZSBib29sZWFuIG5vQXV0aFJlcXVpcmVkOworICAgIHByaXZhdGUgSW50ZWdlciB1c2VyQXV0aFR5cGU7CisgICAgcHJpdmF0ZSBJbnRlZ2VyIGF1dGhUaW1lb3V0OworICAgIHByaXZhdGUgYm9vbGVhbiBhbGxvd1doaWxlT25Cb2R5OworICAgIHByaXZhdGUgYm9vbGVhbiBhbGxBcHBsaWNhdGlvbnM7CisgICAgcHJpdmF0ZSBieXRlW10gYXBwbGljYXRpb25JZDsKKyAgICBwcml2YXRlIERhdGUgY3JlYXRpb25EYXRlVGltZTsKKyAgICBwcml2YXRlIEludGVnZXIgb3JpZ2luOworICAgIHByaXZhdGUgYm9vbGVhbiByb2xsYmFja1Jlc2lzdGFudDsKKyAgICBwcml2YXRlIGJvb2xlYW4gcm9sbGJhY2tSZXNpc3RhbmNlOworICAgIHByaXZhdGUgUm9vdE9mVHJ1c3Qgcm9vdE9mVHJ1c3Q7CisgICAgcHJpdmF0ZSBJbnRlZ2VyIG9zVmVyc2lvbjsKKyAgICBwcml2YXRlIEludGVnZXIgb3NQYXRjaExldmVsOworICAgIHByaXZhdGUgSW50ZWdlciB2ZW5kb3JQYXRjaExldmVsOworICAgIHByaXZhdGUgSW50ZWdlciBib290UGF0Y2hMZXZlbDsKKyAgICBwcml2YXRlIEF0dGVzdGF0aW9uQXBwbGljYXRpb25JZCBhdHRlc3RhdGlvbkFwcGxpY2F0aW9uSWQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgYnJhbmQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgZGV2aWNlOworICAgIHByaXZhdGUgU3RyaW5nIHNlcmlhbE51bWJlcjsKKyAgICBwcml2YXRlIFN0cmluZyBpbWVpOworICAgIHByaXZhdGUgU3RyaW5nIG1laWQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgcHJvZHVjdDsKKyAgICBwcml2YXRlIFN0cmluZyBtYW51ZmFjdHVyZXI7CisgICAgcHJpdmF0ZSBTdHJpbmcgbW9kZWw7CisgICAgcHJpdmF0ZSBib29sZWFuIHVzZXJQcmVzZW5jZVJlcXVpcmVkOworICAgIHByaXZhdGUgYm9vbGVhbiBjb25maXJtYXRpb25SZXF1aXJlZDsKKworICAgIHB1YmxpYyBBdXRob3JpemF0aW9uTGlzdChBU04xRW5jb2RhYmxlIHNlcXVlbmNlKSB0aHJvd3MgQ2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCEoc2VxdWVuY2UgaW5zdGFuY2VvZiBBU04xU2VxdWVuY2UpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uKCJFeHBlY3RlZCBzZXF1ZW5jZSBmb3IgYXV0aG9yaXphdGlvbiBsaXN0LCBmb3VuZCAiCisgICAgICAgICAgICAgICAgICAgICsgc2VxdWVuY2UuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICB9CisKKyAgICAgICAgQVNOMVNlcXVlbmNlUGFyc2VyIHBhcnNlciA9ICgoQVNOMVNlcXVlbmNlKSBzZXF1ZW5jZSkucGFyc2VyKCk7CisgICAgICAgIEFTTjFUYWdnZWRPYmplY3QgZW50cnkgPSBwYXJzZUFzbjFUYWdnZWRPYmplY3QocGFyc2VyKTsKKyAgICAgICAgZm9yICg7IGVudHJ5ICE9IG51bGw7IGVudHJ5ID0gcGFyc2VBc24xVGFnZ2VkT2JqZWN0KHBhcnNlcikpIHsKKyAgICAgICAgICAgIGludCB0YWcgPSBlbnRyeS5nZXRUYWdObygpOworICAgICAgICAgICAgQVNOMVByaW1pdGl2ZSB2YWx1ZSA9IGVudHJ5LmdldE9iamVjdCgpOworICAgICAgICAgICAgTG9nLmkoIkF0dGVzdGF0aW9uIiwgIlBhcnNpbmcgdGFnOiBbIiArIHRhZyArICJdLCB2YWx1ZTogWyIgKyB2YWx1ZSArICJdIik7CisgICAgICAgICAgICBzd2l0Y2ggKHRhZykgeworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb24oIlVua25vd24gdGFnICIgKyB0YWcgKyAiIGZvdW5kIik7CisKKyAgICAgICAgICAgICAgICBjYXNlIEtNX1RBR19QVVJQT1NFICYgS0VZTUFTVEVSX1RBR19UWVBFX01BU0s6CisgICAgICAgICAgICAgICAgICAgIHB1cnBvc2VzID0gQXNuMVV0aWxzLmdldEludGVnZXJzRnJvbUFzbjFTZXQodmFsdWUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEtNX1RBR19BTEdPUklUSE0gJiBLRVlNQVNURVJfVEFHX1RZUEVfTUFTSzoKKyAgICAgICAgICAgICAgICAgICAgYWxnb3JpdGhtID0gQXNuMVV0aWxzLmdldEludGVnZXJGcm9tQXNuMSh2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgS01fVEFHX0tFWV9TSVpFICYgS0VZTUFTVEVSX1RBR19UWVBFX01BU0s6CisgICAgICAgICAgICAgICAgICAgIGtleVNpemUgPSBBc24xVXRpbHMuZ2V0SW50ZWdlckZyb21Bc24xKHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmkoIkF0dGVzdGF0aW9uIiwgIkZvdW5kIEtFWSBTSVpFLCB2YWx1ZTogIiArIGtleVNpemUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEtNX1RBR19ESUdFU1QgJiBLRVlNQVNURVJfVEFHX1RZUEVfTUFTSzoKKyAgICAgICAgICAgICAgICAgICAgZGlnZXN0cyA9IEFzbjFVdGlscy5nZXRJbnRlZ2Vyc0Zyb21Bc24xU2V0KHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBLTV9UQUdfUEFERElORyAmIEtFWU1BU1RFUl9UQUdfVFlQRV9NQVNLOgorICAgICAgICAgICAgICAgICAgICBwYWRkaW5nTW9kZXMgPSBBc24xVXRpbHMuZ2V0SW50ZWdlcnNGcm9tQXNuMVNldCh2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgS01fVEFHX1JTQV9QVUJMSUNfRVhQT05FTlQgJiBLRVlNQVNURVJfVEFHX1RZUEVfTUFTSzoKKyAgICAgICAgICAgICAgICAgICAgcnNhUHVibGljRXhwb25lbnQgPSBBc24xVXRpbHMuZ2V0TG9uZ0Zyb21Bc24xKHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBLTV9UQUdfTk9fQVVUSF9SRVFVSVJFRCAmIEtFWU1BU1RFUl9UQUdfVFlQRV9NQVNLOgorICAgICAgICAgICAgICAgICAgICBub0F1dGhSZXF1aXJlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgS01fVEFHX0NSRUFUSU9OX0RBVEVUSU1FICYgS0VZTUFTVEVSX1RBR19UWVBFX01BU0s6CisgICAgICAgICAgICAgICAgICAgIGNyZWF0aW9uRGF0ZVRpbWUgPSBBc24xVXRpbHMuZ2V0RGF0ZUZyb21Bc24xKHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBLTV9UQUdfT1JJR0lOICYgS0VZTUFTVEVSX1RBR19UWVBFX01BU0s6CisgICAgICAgICAgICAgICAgICAgIG9yaWdpbiA9IEFzbjFVdGlscy5nZXRJbnRlZ2VyRnJvbUFzbjEodmFsdWUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEtNX1RBR19PU19WRVJTSU9OICYgS0VZTUFTVEVSX1RBR19UWVBFX01BU0s6CisgICAgICAgICAgICAgICAgICAgIG9zVmVyc2lvbiA9IEFzbjFVdGlscy5nZXRJbnRlZ2VyRnJvbUFzbjEodmFsdWUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEtNX1RBR19PU19QQVRDSExFVkVMICYgS0VZTUFTVEVSX1RBR19UWVBFX01BU0s6CisgICAgICAgICAgICAgICAgICAgIG9zUGF0Y2hMZXZlbCA9IEFzbjFVdGlscy5nZXRJbnRlZ2VyRnJvbUFzbjEodmFsdWUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEtNX1RBR19WRU5ET1JfUEFUQ0hMRVZFTCAmIEtFWU1BU1RFUl9UQUdfVFlQRV9NQVNLOgorICAgICAgICAgICAgICAgICAgICB2ZW5kb3JQYXRjaExldmVsID0gQXNuMVV0aWxzLmdldEludGVnZXJGcm9tQXNuMSh2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgS01fVEFHX0JPT1RfUEFUQ0hMRVZFTCAmIEtFWU1BU1RFUl9UQUdfVFlQRV9NQVNLOgorICAgICAgICAgICAgICAgICAgICBib290UGF0Y2hMZXZlbCA9IEFzbjFVdGlscy5nZXRJbnRlZ2VyRnJvbUFzbjEodmFsdWUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEtNX1RBR19BQ1RJVkVfREFURVRJTUUgJiBLRVlNQVNURVJfVEFHX1RZUEVfTUFTSzoKKyAgICAgICAgICAgICAgICAgICAgYWN0aXZlRGF0ZVRpbWUgPSBBc24xVXRpbHMuZ2V0RGF0ZUZyb21Bc24xKHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBLTV9UQUdfT1JJR0lOQVRJT05fRVhQSVJFX0RBVEVUSU1FICYgS0VZTUFTVEVSX1RBR19UWVBFX01BU0s6CisgICAgICAgICAgICAgICAgICAgIG9yaWdpbmF0aW9uRXhwaXJlRGF0ZVRpbWUgPSBBc24xVXRpbHMuZ2V0RGF0ZUZyb21Bc24xKHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBLTV9UQUdfVVNBR0VfRVhQSVJFX0RBVEVUSU1FICYgS0VZTUFTVEVSX1RBR19UWVBFX01BU0s6CisgICAgICAgICAgICAgICAgICAgIHVzYWdlRXhwaXJlRGF0ZVRpbWUgPSBBc24xVXRpbHMuZ2V0RGF0ZUZyb21Bc24xKHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBLTV9UQUdfUk9MTEJBQ0tfUkVTSVNUQU5UICYgS0VZTUFTVEVSX1RBR19UWVBFX01BU0s6CisgICAgICAgICAgICAgICAgICAgIHJvbGxiYWNrUmVzaXN0YW50ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBLTV9UQUdfUk9MTEJBQ0tfUkVTSVNUQU5DRSAmIEtFWU1BU1RFUl9UQUdfVFlQRV9NQVNLOgorICAgICAgICAgICAgICAgICAgICByb2xsYmFja1Jlc2lzdGFuY2UgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEtNX1RBR19BVVRIX1RJTUVPVVQgJiBLRVlNQVNURVJfVEFHX1RZUEVfTUFTSzoKKyAgICAgICAgICAgICAgICAgICAgYXV0aFRpbWVvdXQgPSBBc24xVXRpbHMuZ2V0SW50ZWdlckZyb21Bc24xKHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBLTV9UQUdfQUxMT1dfV0hJTEVfT05fQk9EWSAmIEtFWU1BU1RFUl9UQUdfVFlQRV9NQVNLOgorICAgICAgICAgICAgICAgICAgICBhbGxvd1doaWxlT25Cb2R5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBLTV9UQUdfRUNfQ1VSVkUgJiBLRVlNQVNURVJfVEFHX1RZUEVfTUFTSzoKKyAgICAgICAgICAgICAgICAgICAgZWNDdXJ2ZSA9IEFzbjFVdGlscy5nZXRJbnRlZ2VyRnJvbUFzbjEodmFsdWUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEtNX1RBR19VU0VSX0FVVEhfVFlQRSAmIEtFWU1BU1RFUl9UQUdfVFlQRV9NQVNLOgorICAgICAgICAgICAgICAgICAgICB1c2VyQXV0aFR5cGUgPSBBc24xVXRpbHMuZ2V0SW50ZWdlckZyb21Bc24xKHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBLTV9UQUdfUk9PVF9PRl9UUlVTVCAmIEtFWU1BU1RFUl9UQUdfVFlQRV9NQVNLOgorICAgICAgICAgICAgICAgICAgICByb290T2ZUcnVzdCA9IG5ldyBSb290T2ZUcnVzdCh2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgS01fVEFHX0FUVEVTVEFUSU9OX0FQUExJQ0FUSU9OX0lEICYgS0VZTUFTVEVSX1RBR19UWVBFX01BU0s6CisgICAgICAgICAgICAgICAgICAgIGF0dGVzdGF0aW9uQXBwbGljYXRpb25JZCA9IG5ldyBBdHRlc3RhdGlvbkFwcGxpY2F0aW9uSWQoQXNuMVV0aWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEFzbjFFbmNvZGFibGVGcm9tQnl0ZXMoQXNuMVV0aWxzLmdldEJ5dGVBcnJheUZyb21Bc24xKHZhbHVlKSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEtNX1RBR19BVFRFU1RBVElPTl9JRF9CUkFORCAmIEtFWU1BU1RFUl9UQUdfVFlQRV9NQVNLOgorICAgICAgICAgICAgICAgICAgICBicmFuZCA9IGdldFN0cmluZ0Zyb21Bc24xVmFsdWUodmFsdWUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEtNX1RBR19BVFRFU1RBVElPTl9JRF9ERVZJQ0UgJiBLRVlNQVNURVJfVEFHX1RZUEVfTUFTSzoKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlID0gZ2V0U3RyaW5nRnJvbUFzbjFWYWx1ZSh2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgS01fVEFHX0FUVEVTVEFUSU9OX0lEX1BST0RVQ1QgJiBLRVlNQVNURVJfVEFHX1RZUEVfTUFTSzoKKyAgICAgICAgICAgICAgICAgICAgcHJvZHVjdCA9IGdldFN0cmluZ0Zyb21Bc24xVmFsdWUodmFsdWUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEtNX1RBR19BVFRFU1RBVElPTl9JRF9TRVJJQUwgJiBLRVlNQVNURVJfVEFHX1RZUEVfTUFTSzoKKyAgICAgICAgICAgICAgICAgICAgc2VyaWFsTnVtYmVyID0gZ2V0U3RyaW5nRnJvbUFzbjFWYWx1ZSh2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgS01fVEFHX0FUVEVTVEFUSU9OX0lEX0lNRUkgJiBLRVlNQVNURVJfVEFHX1RZUEVfTUFTSzoKKyAgICAgICAgICAgICAgICAgICAgaW1laSA9IGdldFN0cmluZ0Zyb21Bc24xVmFsdWUodmFsdWUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEtNX1RBR19BVFRFU1RBVElPTl9JRF9NRUlEICYgS0VZTUFTVEVSX1RBR19UWVBFX01BU0s6CisgICAgICAgICAgICAgICAgICAgIG1laWQgPSBnZXRTdHJpbmdGcm9tQXNuMVZhbHVlKHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBLTV9UQUdfQVRURVNUQVRJT05fSURfTUFOVUZBQ1RVUkVSICYgS0VZTUFTVEVSX1RBR19UWVBFX01BU0s6CisgICAgICAgICAgICAgICAgICAgIG1hbnVmYWN0dXJlciA9IGdldFN0cmluZ0Zyb21Bc24xVmFsdWUodmFsdWUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEtNX1RBR19BVFRFU1RBVElPTl9JRF9NT0RFTCAmIEtFWU1BU1RFUl9UQUdfVFlQRV9NQVNLOgorICAgICAgICAgICAgICAgICAgICBtb2RlbCA9IGdldFN0cmluZ0Zyb21Bc24xVmFsdWUodmFsdWUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEtNX1RBR19BTExfQVBQTElDQVRJT05TICYgS0VZTUFTVEVSX1RBR19UWVBFX01BU0s6CisgICAgICAgICAgICAgICAgICAgIGFsbEFwcGxpY2F0aW9ucyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgS01fVEFHX1RSVVNURURfVVNFUl9QUkVTRU5DRV9SRVFVSVJFRCAmIEtFWU1BU1RFUl9UQUdfVFlQRV9NQVNLOgorICAgICAgICAgICAgICAgICAgICB1c2VyUHJlc2VuY2VSZXF1aXJlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgS01fVEFHX1RSVVNURURfQ09ORklSTUFUSU9OX1JFUVVJUkVEICYgS0VZTUFTVEVSX1RBR19UWVBFX01BU0s6CisgICAgICAgICAgICAgICAgICAgIGNvbmZpcm1hdGlvblJlcXVpcmVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGFsZ29yaXRobVRvU3RyaW5nKGludCBhbGdvcml0aG0pIHsKKyAgICAgICAgc3dpdGNoIChhbGdvcml0aG0pIHsKKyAgICAgICAgICAgIGNhc2UgS01fQUxHT1JJVEhNX1JTQToKKyAgICAgICAgICAgICAgICByZXR1cm4gIlJTQSI7CisgICAgICAgICAgICBjYXNlIEtNX0FMR09SSVRITV9FQzoKKyAgICAgICAgICAgICAgICByZXR1cm4gIkVDRFNBIjsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJVbmtub3duIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhZGRpbmdNb2Rlc1RvU3RyaW5nKGZpbmFsIFNldDxJbnRlZ2VyPiBwYWRkaW5nTW9kZXMpIHsKKyAgICAgICAgcmV0dXJuIGpvaW5TdHJpbmdzKHRyYW5zZm9ybShwYWRkaW5nTW9kZXMsIGZvck1hcChwYWRkaW5nTWFwLCAiVW5rbm93biIpKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcGFkZGluZ01vZGVUb1N0cmluZyhpbnQgcGFkZGluZ01vZGUpIHsKKyAgICAgICAgcmV0dXJuIGZvck1hcChwYWRkaW5nTWFwLCAiVW5rbm93biIpLmFwcGx5KHBhZGRpbmdNb2RlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBkaWdlc3RzVG9TdHJpbmcoU2V0PEludGVnZXI+IGRpZ2VzdHMpIHsKKyAgICAgICAgcmV0dXJuIGpvaW5TdHJpbmdzKHRyYW5zZm9ybShkaWdlc3RzLCBmb3JNYXAoZGlnZXN0TWFwLCAiVW5rbm93biIpKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZGlnZXN0VG9TdHJpbmcoaW50IGRpZ2VzdCkgeworICAgICAgICByZXR1cm4gZm9yTWFwKGRpZ2VzdE1hcCwgIlVua25vd24iKS5hcHBseShkaWdlc3QpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1cnBvc2VzVG9TdHJpbmcoU2V0PEludGVnZXI+IHB1cnBvc2VzKSB7CisgICAgICAgIHJldHVybiBqb2luU3RyaW5ncyh0cmFuc2Zvcm0ocHVycG9zZXMsIGZvck1hcChwdXJwb3NlTWFwLCAiVW5rbm93biIpKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdXNlckF1dGhUeXBlVG9TdHJpbmcoaW50IHVzZXJBdXRoVHlwZSkgeworICAgICAgICBMaXN0PFN0cmluZz4gdHlwZXMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICAgICAgaWYgKCh1c2VyQXV0aFR5cGUgJiBIV19BVVRIX0ZJTkdFUlBSSU5UKSAhPSAwKQorICAgICAgICAgICAgdHlwZXMuYWRkKCJGaW5nZXJwcmludCIpOworICAgICAgICBpZiAoKHVzZXJBdXRoVHlwZSAmIEhXX0FVVEhfUEFTU1dPUkQpICE9IDApCisgICAgICAgICAgICB0eXBlcy5hZGQoIlBhc3N3b3JkIik7CisgICAgICAgIHJldHVybiBqb2luU3RyaW5ncyh0eXBlcyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgb3JpZ2luVG9TdHJpbmcoaW50IG9yaWdpbikgeworICAgICAgICBzd2l0Y2ggKG9yaWdpbikgeworICAgICAgICAgICAgY2FzZSBLTV9PUklHSU5fR0VORVJBVEVEOgorICAgICAgICAgICAgICAgIHJldHVybiAiR2VuZXJhdGVkIjsKKyAgICAgICAgICAgIGNhc2UgS01fT1JJR0lOX0lNUE9SVEVEOgorICAgICAgICAgICAgICAgIHJldHVybiAiSW1wb3J0ZWQiOworICAgICAgICAgICAgY2FzZSBLTV9PUklHSU5fVU5LTk9XTjoKKyAgICAgICAgICAgICAgICByZXR1cm4gIlVua25vd24gKEtNMCkiOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIlVua25vd24iOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGpvaW5TdHJpbmdzKENvbGxlY3Rpb248U3RyaW5nPiBjb2xsZWN0aW9uKSB7CisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLmFwcGVuZCgiWyIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChKb2luZXIub24oIiwgIikuam9pbihjb2xsZWN0aW9uKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJdIikKKyAgICAgICAgICAgICAgICAudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZm9ybWF0RGF0ZShEYXRlIGRhdGUpIHsKKyAgICAgICAgcmV0dXJuIERhdGVGb3JtYXQuZ2V0RGF0ZVRpbWVJbnN0YW5jZSgpLmZvcm1hdChkYXRlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBBU04xVGFnZ2VkT2JqZWN0IHBhcnNlQXNuMVRhZ2dlZE9iamVjdChBU04xU2VxdWVuY2VQYXJzZXIgcGFyc2VyKQorICAgICAgICAgICAgdGhyb3dzIENlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbiB7CisgICAgICAgIEFTTjFFbmNvZGFibGUgYXNuMUVuY29kYWJsZSA9IHBhcnNlQXNuMUVuY29kYWJsZShwYXJzZXIpOworICAgICAgICBpZiAoYXNuMUVuY29kYWJsZSA9PSBudWxsIHx8IGFzbjFFbmNvZGFibGUgaW5zdGFuY2VvZiBBU04xVGFnZ2VkT2JqZWN0KSB7CisgICAgICAgICAgICByZXR1cm4gKEFTTjFUYWdnZWRPYmplY3QpIGFzbjFFbmNvZGFibGU7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IENlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgdGFnZ2VkIG9iamVjdCwgZm91bmQgIiArIGFzbjFFbmNvZGFibGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEFTTjFFbmNvZGFibGUgcGFyc2VBc24xRW5jb2RhYmxlKEFTTjFTZXF1ZW5jZVBhcnNlciBwYXJzZXIpCisgICAgICAgICAgICB0aHJvd3MgQ2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBwYXJzZXIucmVhZE9iamVjdCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uKCJGYWlsZWQgdG8gcGFyc2UgQVNOMSBzZXF1ZW5jZSIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFNldDxJbnRlZ2VyPiBnZXRQdXJwb3NlcygpIHsKKyAgICAgICAgcmV0dXJuIHB1cnBvc2VzOworICAgIH0KKworICAgIHB1YmxpYyBJbnRlZ2VyIGdldEFsZ29yaXRobSgpIHsKKyAgICAgICAgcmV0dXJuIGFsZ29yaXRobTsKKyAgICB9CisKKyAgICBwdWJsaWMgSW50ZWdlciBnZXRLZXlTaXplKCkgeworICAgICAgICByZXR1cm4ga2V5U2l6ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2V0PEludGVnZXI+IGdldERpZ2VzdHMoKSB7CisgICAgICAgIHJldHVybiBkaWdlc3RzOworICAgIH0KKworICAgIHB1YmxpYyBTZXQ8SW50ZWdlcj4gZ2V0UGFkZGluZ01vZGVzKCkgeworICAgICAgICByZXR1cm4gcGFkZGluZ01vZGVzOworICAgIH0KKworICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRQYWRkaW5nTW9kZXNBc1N0cmluZ3MoKSB0aHJvd3MgQ2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHBhZGRpbmdNb2RlcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gSW1tdXRhYmxlU2V0Lm9mKCk7CisgICAgICAgIH0KKworICAgICAgICBJbW11dGFibGVTZXQuQnVpbGRlcjxTdHJpbmc+IGJ1aWxkZXIgPSBJbW11dGFibGVTZXQuYnVpbGRlcigpOworICAgICAgICBmb3IgKGludCBwYWRkaW5nTW9kZSA6IHBhZGRpbmdNb2RlcykgeworICAgICAgICAgICAgc3dpdGNoIChwYWRkaW5nTW9kZSkgeworICAgICAgICAgICAgICAgIGNhc2UgS01fUEFEX05PTkU6CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkKEtleVByb3BlcnRpZXMuRU5DUllQVElPTl9QQURESU5HX05PTkUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEtNX1BBRF9SU0FfT0FFUDoKKyAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hZGQoS2V5UHJvcGVydGllcy5FTkNSWVBUSU9OX1BBRERJTkdfUlNBX09BRVApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEtNX1BBRF9SU0FfUEtDUzFfMV81X0VOQ1JZUFQ6CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkKEtleVByb3BlcnRpZXMuRU5DUllQVElPTl9QQURESU5HX1JTQV9QS0NTMSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgS01fUEFEX1JTQV9QS0NTMV8xXzVfU0lHTjoKKyAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hZGQoS2V5UHJvcGVydGllcy5TSUdOQVRVUkVfUEFERElOR19SU0FfUEtDUzEpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEtNX1BBRF9SU0FfUFNTOgorICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFkZChLZXlQcm9wZXJ0aWVzLlNJR05BVFVSRV9QQURESU5HX1JTQV9QU1MpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uKCJJbnZhbGlkIHBhZGRpbmcgbW9kZSAiICsgcGFkZGluZ01vZGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBidWlsZGVyLmJ1aWxkKCk7CisgICAgfQorCisgICAgcHVibGljIEludGVnZXIgZ2V0RWNDdXJ2ZSgpIHsKKyAgICAgICAgcmV0dXJuIGVjQ3VydmU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBlY0N1cnZlQXNTdHJpbmcoKSB7CisgICAgICAgIGlmIChlY0N1cnZlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gIk5VTEwiOworCisgICAgICAgIHN3aXRjaCAoZWNDdXJ2ZSkgeworICAgICAgICAgICAgY2FzZSBLTV9FQ19DVVJWRV9QMjI0OgorICAgICAgICAgICAgICAgIHJldHVybiAic2VjcDIyNHIxIjsKKyAgICAgICAgICAgIGNhc2UgS01fRUNfQ1VSVkVfUDI1NjoKKyAgICAgICAgICAgICAgICByZXR1cm4gInNlY3AyNTZyMSI7CisgICAgICAgICAgICBjYXNlIEtNX0VDX0NVUlZFX1AzODQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJzZWNwMzg0cjEiOworICAgICAgICAgICAgY2FzZSBLTV9FQ19DVVJWRV9QNTIxOgorICAgICAgICAgICAgICAgIHJldHVybiAic2VjcDUyMXIxIjsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJ1bmtub3duIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBMb25nIGdldFJzYVB1YmxpY0V4cG9uZW50KCkgeworICAgICAgICByZXR1cm4gcnNhUHVibGljRXhwb25lbnQ7CisgICAgfQorCisgICAgcHVibGljIERhdGUgZ2V0QWN0aXZlRGF0ZVRpbWUoKSB7CisgICAgICAgIHJldHVybiBhY3RpdmVEYXRlVGltZTsKKyAgICB9CisKKyAgICBwdWJsaWMgRGF0ZSBnZXRPcmlnaW5hdGlvbkV4cGlyZURhdGVUaW1lKCkgeworICAgICAgICByZXR1cm4gb3JpZ2luYXRpb25FeHBpcmVEYXRlVGltZTsKKyAgICB9CisKKyAgICBwdWJsaWMgRGF0ZSBnZXRVc2FnZUV4cGlyZURhdGVUaW1lKCkgeworICAgICAgICByZXR1cm4gdXNhZ2VFeHBpcmVEYXRlVGltZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc05vQXV0aFJlcXVpcmVkKCkgeworICAgICAgICByZXR1cm4gbm9BdXRoUmVxdWlyZWQ7CisgICAgfQorCisgICAgcHVibGljIEludGVnZXIgZ2V0VXNlckF1dGhUeXBlKCkgeworICAgICAgICByZXR1cm4gdXNlckF1dGhUeXBlOworICAgIH0KKworICAgIHB1YmxpYyBJbnRlZ2VyIGdldEF1dGhUaW1lb3V0KCkgeworICAgICAgICByZXR1cm4gYXV0aFRpbWVvdXQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNBbGxvd1doaWxlT25Cb2R5KCkgeworICAgICAgICByZXR1cm4gYWxsb3dXaGlsZU9uQm9keTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FsbEFwcGxpY2F0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIGFsbEFwcGxpY2F0aW9uczsKKyAgICB9CisKKyAgICBwdWJsaWMgYnl0ZVtdIGdldEFwcGxpY2F0aW9uSWQoKSB7CisgICAgICAgIHJldHVybiBhcHBsaWNhdGlvbklkOworICAgIH0KKworICAgIHB1YmxpYyBEYXRlIGdldENyZWF0aW9uRGF0ZVRpbWUoKSB7CisgICAgICAgIHJldHVybiBjcmVhdGlvbkRhdGVUaW1lOworICAgIH0KKworICAgIHB1YmxpYyBJbnRlZ2VyIGdldE9yaWdpbigpIHsKKyAgICAgICAgcmV0dXJuIG9yaWdpbjsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JvbGxiYWNrUmVzaXN0YW50KCkgeworICAgICAgICByZXR1cm4gcm9sbGJhY2tSZXNpc3RhbnQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNSb2xsYmFja1Jlc2lzdGFuY2UoKSB7CisgICAgICAgIHJldHVybiByb2xsYmFja1Jlc2lzdGFuY2U7CisgICAgfQorCisgICAgcHVibGljIFJvb3RPZlRydXN0IGdldFJvb3RPZlRydXN0KCkgeworICAgICAgICByZXR1cm4gcm9vdE9mVHJ1c3Q7CisgICAgfQorCisgICAgcHVibGljIEludGVnZXIgZ2V0T3NWZXJzaW9uKCkgeworICAgICAgICByZXR1cm4gb3NWZXJzaW9uOworICAgIH0KKworICAgIHB1YmxpYyBJbnRlZ2VyIGdldE9zUGF0Y2hMZXZlbCgpIHsKKyAgICAgICAgcmV0dXJuIG9zUGF0Y2hMZXZlbDsKKyAgICB9CisKKyAgICBwdWJsaWMgSW50ZWdlciBnZXRWZW5kb3JQYXRjaExldmVsKCkgeworICAgICAgICByZXR1cm4gdmVuZG9yUGF0Y2hMZXZlbDsKKyAgICB9CisKKyAgICBwdWJsaWMgSW50ZWdlciBnZXRCb290UGF0Y2hMZXZlbCgpIHsKKyAgICAgICAgcmV0dXJuIGJvb3RQYXRjaExldmVsOworICAgIH0KKworICAgIHB1YmxpYyBBdHRlc3RhdGlvbkFwcGxpY2F0aW9uSWQgZ2V0QXR0ZXN0YXRpb25BcHBsaWNhdGlvbklkKCkgeworICAgICAgICByZXR1cm4gYXR0ZXN0YXRpb25BcHBsaWNhdGlvbklkOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QnJhbmQoKSB7CisgICAgICAgIHJldHVybiBicmFuZDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldERldmljZSgpIHsKKyAgICAgICAgcmV0dXJuIGRldmljZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlcmlhbE51bWJlcigpIHsKKyAgICAgICAgcmV0dXJuIHNlcmlhbE51bWJlcjsKKyAgICB9OworCisgICAgcHVibGljIFN0cmluZyBnZXRJbWVpKCkgeworICAgICAgICByZXR1cm4gaW1laTsKKyAgICB9OworCisgICAgcHVibGljIFN0cmluZyBnZXRNZWlkKCkgeworICAgICAgICByZXR1cm4gbWVpZDsKKyAgICB9OworCisgICAgcHVibGljIFN0cmluZyBnZXRQcm9kdWN0KCkgeworICAgICAgICByZXR1cm4gcHJvZHVjdDsKKyAgICB9OworCisgICAgcHVibGljIFN0cmluZyBnZXRNYW51ZmFjdHVyZXIoKSB7CisgICAgICAgIHJldHVybiBtYW51ZmFjdHVyZXI7CisgICAgfTsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TW9kZWwoKSB7CisgICAgICAgIHJldHVybiBtb2RlbDsKKyAgICB9OworCisgICAgcHVibGljIGJvb2xlYW4gaXNVc2VyUHJlc2VuY2VSZXF1aXJlZCgpIHsKKyAgICAgICAgcmV0dXJuIHVzZXJQcmVzZW5jZVJlcXVpcmVkOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzQ29uZmlybWF0aW9uUmVxdWlyZWQoKSB7CisgICAgICAgIHJldHVybiBjb25maXJtYXRpb25SZXF1aXJlZDsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRTdHJpbmdGcm9tQXNuMVZhbHVlKEFTTjFQcmltaXRpdmUgdmFsdWUpIHRocm93cyBDZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIEFzbjFVdGlscy5nZXRTdHJpbmdGcm9tQXNuMU9jdGV0U3RyZWFtQXNzdW1pbmdVVEY4KHZhbHVlKTsKKyAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uKCJFcnJvciBwYXJzaW5nIEFTTi4xIHZhbHVlIiwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHMgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCisgICAgICAgIGlmIChhbGdvcml0aG0gIT0gbnVsbCkgeworICAgICAgICAgICAgcy5hcHBlbmQoIlxuQWxnb3JpdGhtOiAiKS5hcHBlbmQoYWxnb3JpdGhtVG9TdHJpbmcoYWxnb3JpdGhtKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoa2V5U2l6ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBzLmFwcGVuZCgiXG5LZXlTaXplOiAiKS5hcHBlbmQoa2V5U2l6ZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocHVycG9zZXMgIT0gbnVsbCAmJiAhcHVycG9zZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBzLmFwcGVuZCgiXG5QdXJwb3NlczogIikuYXBwZW5kKHB1cnBvc2VzVG9TdHJpbmcocHVycG9zZXMpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkaWdlc3RzICE9IG51bGwgJiYgIWRpZ2VzdHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBzLmFwcGVuZCgiXG5EaWdlc3RzOiAiKS5hcHBlbmQoZGlnZXN0c1RvU3RyaW5nKGRpZ2VzdHMpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwYWRkaW5nTW9kZXMgIT0gbnVsbCAmJiAhcGFkZGluZ01vZGVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcy5hcHBlbmQoIlxuUGFkZGluZyBtb2RlczogIikuYXBwZW5kKHBhZGRpbmdNb2Rlc1RvU3RyaW5nKHBhZGRpbmdNb2RlcykpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVjQ3VydmUgIT0gbnVsbCkgeworICAgICAgICAgICAgcy5hcHBlbmQoIlxuRUMgQ3VydmU6ICIpLmFwcGVuZChlY0N1cnZlQXNTdHJpbmcoKSk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgbGFiZWwgPSAiXG5SU0EgZXhwb25lbnQ6ICI7CisgICAgICAgIGlmIChyc2FQdWJsaWNFeHBvbmVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBzLmFwcGVuZChsYWJlbCkuYXBwZW5kKHJzYVB1YmxpY0V4cG9uZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhY3RpdmVEYXRlVGltZSAhPSBudWxsKSB7CisgICAgICAgICAgICBzLmFwcGVuZCgiXG5BY3RpdmU6ICIpLmFwcGVuZChmb3JtYXREYXRlKGFjdGl2ZURhdGVUaW1lKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAob3JpZ2luYXRpb25FeHBpcmVEYXRlVGltZSAhPSBudWxsKSB7CisgICAgICAgICAgICBzLmFwcGVuZCgiXG5PcmlnaW5hdGlvbiBleHBpcmU6ICIpLmFwcGVuZChmb3JtYXREYXRlKG9yaWdpbmF0aW9uRXhwaXJlRGF0ZVRpbWUpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh1c2FnZUV4cGlyZURhdGVUaW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgIHMuYXBwZW5kKCJcblVzYWdlIGV4cGlyZTogIikuYXBwZW5kKGZvcm1hdERhdGUodXNhZ2VFeHBpcmVEYXRlVGltZSkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFub0F1dGhSZXF1aXJlZCAmJiB1c2VyQXV0aFR5cGUgIT0gbnVsbCkgeworICAgICAgICAgICAgcy5hcHBlbmQoIlxuQXV0aCB0eXBlczogIikuYXBwZW5kKHVzZXJBdXRoVHlwZVRvU3RyaW5nKHVzZXJBdXRoVHlwZSkpOworICAgICAgICAgICAgaWYgKGF1dGhUaW1lb3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzLmFwcGVuZCgiXG5BdXRoIHRpbWVvdXQ6ICIpLmFwcGVuZChhdXRoVGltZW91dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoYXBwbGljYXRpb25JZCAhPSBudWxsKSB7CisgICAgICAgICAgICBzLmFwcGVuZCgiXG5BcHBsaWNhdGlvbiBJRDogIikuYXBwZW5kKG5ldyBTdHJpbmcoYXBwbGljYXRpb25JZCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNyZWF0aW9uRGF0ZVRpbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgcy5hcHBlbmQoIlxuQ3JlYXRlZDogIikuYXBwZW5kKGZvcm1hdERhdGUoY3JlYXRpb25EYXRlVGltZSkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG9yaWdpbiAhPSBudWxsKSB7CisgICAgICAgICAgICBzLmFwcGVuZCgiXG5PcmlnaW46ICIpLmFwcGVuZChvcmlnaW5Ub1N0cmluZyhvcmlnaW4pKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyb2xsYmFja1Jlc2lzdGFudCkgeworICAgICAgICAgICAgcy5hcHBlbmQoIlxuUm9sbGJhY2sgcmVzaXN0YW50OiB0cnVlIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAocm9sbGJhY2tSZXNpc3RhbmNlKSB7CisgICAgICAgICAgICBzLmFwcGVuZCgiXG5Sb2xsYmFjayByZXNpc3RhbmNlOiB0cnVlIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAocm9vdE9mVHJ1c3QgIT0gbnVsbCkgeworICAgICAgICAgICAgcy5hcHBlbmQoIlxuUm9vdCBvZiBUcnVzdDpcbiIpOworICAgICAgICAgICAgcy5hcHBlbmQocm9vdE9mVHJ1c3QpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG9zVmVyc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBzLmFwcGVuZCgiXG5PUyBWZXJzaW9uOiAiKS5hcHBlbmQob3NWZXJzaW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvc1BhdGNoTGV2ZWwgIT0gbnVsbCkgeworICAgICAgICAgICAgcy5hcHBlbmQoIlxuT1MgUGF0Y2hsZXZlbDogIikuYXBwZW5kKG9zUGF0Y2hMZXZlbCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAodmVuZG9yUGF0Y2hMZXZlbCAhPSBudWxsKSB7CisgICAgICAgICAgICBzLmFwcGVuZCgiXG5WZW5kb3IgUGF0Y2hsZXZlbDogIikuYXBwZW5kKHZlbmRvclBhdGNoTGV2ZWwpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGJvb3RQYXRjaExldmVsICE9IG51bGwpIHsKKyAgICAgICAgICAgIHMuYXBwZW5kKCJcbkJvb3QgUGF0Y2hsZXZlbDogIikuYXBwZW5kKGJvb3RQYXRjaExldmVsKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhdHRlc3RhdGlvbkFwcGxpY2F0aW9uSWQgIT0gbnVsbCkgeworICAgICAgICAgICAgcy5hcHBlbmQoIlxuQXR0ZXN0YXRpb24gQXBwbGljYXRpb24gSWQ6IikuYXBwZW5kKGF0dGVzdGF0aW9uQXBwbGljYXRpb25JZCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAodXNlclByZXNlbmNlUmVxdWlyZWQpIHsKKyAgICAgICAgICAgIHMuYXBwZW5kKCJcblVzZXIgcHJlc2VuY2UgcmVxdWlyZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb25maXJtYXRpb25SZXF1aXJlZCkgeworICAgICAgICAgICAgcy5hcHBlbmQoIlxuQ29uZmlybWF0aW9uIHJlcXVpcmVkIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYnJhbmQgIT0gbnVsbCkgeworICAgICAgICAgICAgcy5hcHBlbmQoIlxuQnJhbmQ6ICIpLmFwcGVuZChicmFuZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRldmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICBzLmFwcGVuZCgiXG5EZXZpY2UgdHlwZTogIikuYXBwZW5kKGRldmljZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHMudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zZWN1cml0eS9zcmMvYW5kcm9pZC9rZXlzdG9yZS9jdHMvQ2VydGlmaWNhdGVVdGlscy5qYXZhIGIvdGVzdHMvc2VjdXJpdHkvc3JjL2FuZHJvaWQva2V5c3RvcmUvY3RzL0NlcnRpZmljYXRlVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGU5MzZlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc2VjdXJpdHkvc3JjL2FuZHJvaWQva2V5c3RvcmUvY3RzL0NlcnRpZmljYXRlVXRpbHMuamF2YQpAQCAtMCwwICsxLDgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmtleXN0b3JlLmN0czsKKworaW1wb3J0IGNvbS5hbmRyb2lkLm9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTAwLlg1MDBOYW1lOworaW1wb3J0IGNvbS5hbmRyb2lkLm9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LlN1YmplY3RQdWJsaWNLZXlJbmZvOworaW1wb3J0IGNvbS5hbmRyb2lkLm9yZy5ib3VuY3ljYXN0bGUuY2VydC5YNTA5Q2VydGlmaWNhdGVIb2xkZXI7CitpbXBvcnQgY29tLmFuZHJvaWQub3JnLmJvdW5jeWNhc3RsZS5jZXJ0Llg1MDl2M0NlcnRpZmljYXRlQnVpbGRlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5vcmcuYm91bmN5Y2FzdGxlLm9wZXJhdG9yLmpjYWpjZS5KY2FDb250ZW50U2lnbmVyQnVpbGRlcjsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5UGFpcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVGYWN0b3J5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGU7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC54NTAwLlg1MDBQcmluY2lwYWw7CisKK3B1YmxpYyBjbGFzcyBDZXJ0aWZpY2F0ZVV0aWxzIHsKKyAgICAvKiogQ3JlYXRlcyBhIHNlbGYtc2lnbmVkIFguNTA5IGNlcnRpZmljYXRlLCBnaXZlbiBhIGtleSBwYWlyLCBzdWJqZWN0IGFuZCBpc3N1ZXIuICovCisgICAgcHVibGljIHN0YXRpYyBYNTA5Q2VydGlmaWNhdGUgY3JlYXRlQ2VydGlmaWNhdGUoCisgICAgICAgICAgICBLZXlQYWlyIGtleVBhaXIsIFg1MDBQcmluY2lwYWwgc3ViamVjdCwgWDUwMFByaW5jaXBhbCBpc3N1ZXIpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBNYWtlIHRoZSBjZXJ0aWZpY2F0ZSB2YWxpZCBmb3IgdHdvIGRheXMuCisgICAgICAgIGxvbmcgbWlsbGlzUGVyRGF5ID0gMjQgKiA2MCAqIDYwICogMTAwMDsKKyAgICAgICAgbG9uZyBub3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgRGF0ZSBzdGFydCA9IG5ldyBEYXRlKG5vdyAtIG1pbGxpc1BlckRheSk7CisgICAgICAgIERhdGUgZW5kID0gbmV3IERhdGUobm93ICsgbWlsbGlzUGVyRGF5KTsKKworICAgICAgICAvLyBBc3NpZ24gYSByYW5kb20gc2VyaWFsIG51bWJlci4KKyAgICAgICAgYnl0ZVtdIHNlcmlhbEJ5dGVzID0gbmV3IGJ5dGVbMTZdOworICAgICAgICBuZXcgU2VjdXJlUmFuZG9tKCkubmV4dEJ5dGVzKHNlcmlhbEJ5dGVzKTsKKyAgICAgICAgQmlnSW50ZWdlciBzZXJpYWxOdW1iZXIgPSBuZXcgQmlnSW50ZWdlcigxLCBzZXJpYWxCeXRlcyk7CisKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBjZXJ0aWZpY2F0ZSBidWlsZGVyCisgICAgICAgIFg1MDl2M0NlcnRpZmljYXRlQnVpbGRlciB4NTA5Y2cgPQorICAgICAgICAgICAgICAgIG5ldyBYNTA5djNDZXJ0aWZpY2F0ZUJ1aWxkZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBYNTAwTmFtZS5nZXRJbnN0YW5jZShpc3N1ZXIuZ2V0RW5jb2RlZCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgWDUwME5hbWUuZ2V0SW5zdGFuY2Uoc3ViamVjdC5nZXRFbmNvZGVkKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgU3ViamVjdFB1YmxpY0tleUluZm8uZ2V0SW5zdGFuY2Uoa2V5UGFpci5nZXRQdWJsaWMoKS5nZXRFbmNvZGVkKCkpKTsKKworICAgICAgICAvLyBDaG9vc2UgYSBzaWduYXR1cmUgYWxnb3JpdGhtIG1hdGNoaW5nIHRoZSBrZXkgZm9ybWF0LgorICAgICAgICBTdHJpbmcga2V5QWxnb3JpdGhtID0ga2V5UGFpci5nZXRQcml2YXRlKCkuZ2V0QWxnb3JpdGhtKCk7CisgICAgICAgIFN0cmluZyBzaWduYXR1cmVBbGdvcml0aG07CisgICAgICAgIGlmIChrZXlBbGdvcml0aG0uZXF1YWxzKCJSU0EiKSkgeworICAgICAgICAgICAgc2lnbmF0dXJlQWxnb3JpdGhtID0gIlNIQTI1NndpdGhSU0EiOworICAgICAgICB9IGVsc2UgaWYgKGtleUFsZ29yaXRobS5lcXVhbHMoIkVDIikpIHsKKyAgICAgICAgICAgIHNpZ25hdHVyZUFsZ29yaXRobSA9ICJTSEEyNTZ3aXRoRUNEU0EiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBrZXkgYWxnb3JpdGhtICIgKyBrZXlBbGdvcml0aG0pOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2lnbiB0aGUgY2VydGlmaWNhdGUgYW5kIGdlbmVyYXRlIGl0LgorICAgICAgICBYNTA5Q2VydGlmaWNhdGVIb2xkZXIgeDUwOWhvbGRlciA9CisgICAgICAgICAgICAgICAgeDUwOWNnLmJ1aWxkKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEpjYUNvbnRlbnRTaWduZXJCdWlsZGVyKHNpZ25hdHVyZUFsZ29yaXRobSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKGtleVBhaXIuZ2V0UHJpdmF0ZSgpKSk7CisgICAgICAgIENlcnRpZmljYXRlRmFjdG9yeSBjZXJ0RmFjdG9yeSA9IENlcnRpZmljYXRlRmFjdG9yeS5nZXRJbnN0YW5jZSgiWC41MDkiKTsKKyAgICAgICAgWDUwOUNlcnRpZmljYXRlIHg1MDljID0KKyAgICAgICAgICAgICAgICAoWDUwOUNlcnRpZmljYXRlKQorICAgICAgICAgICAgICAgICAgICAgICAgY2VydEZhY3RvcnkuZ2VuZXJhdGVDZXJ0aWZpY2F0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHg1MDlob2xkZXIuZ2V0RW5jb2RlZCgpKSk7CisgICAgICAgIHJldHVybiB4NTA5YzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9rZXlzdG9yZS9zcmMvYW5kcm9pZC9rZXlzdG9yZS9jdHMvUm9vdE9mVHJ1c3QuamF2YSBiL3Rlc3RzL3NlY3VyaXR5L3NyYy9hbmRyb2lkL2tleXN0b3JlL2N0cy9Sb290T2ZUcnVzdC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy90ZXN0cy9rZXlzdG9yZS9zcmMvYW5kcm9pZC9rZXlzdG9yZS9jdHMvUm9vdE9mVHJ1c3QuamF2YQpyZW5hbWUgdG8gdGVzdHMvc2VjdXJpdHkvc3JjL2FuZHJvaWQva2V5c3RvcmUvY3RzL1Jvb3RPZlRydXN0LmphdmEKZGlmZiAtLWdpdCBhL3Rlc3RzL3NlbnNvci9BbmRyb2lkLm1rIGIvdGVzdHMvc2Vuc29yL0FuZHJvaWQubWsKaW5kZXggZGNmOTAxNS4uNGNlZWEwZiAxMDA2NDQKLS0tIGEvdGVzdHMvc2Vuc29yL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvc2Vuc29yL0FuZHJvaWQubWsKQEAgLTI1LDkgKzI1LDkgQEAKIAogTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKIAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dAogCi1MT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBwbGF0Zm9ybS10ZXN0LWFubm90YXRpb25zCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBwbGF0Zm9ybS10ZXN0LWFubm90YXRpb25zIGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCiAKIExPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKIApAQCAtNzksOCArNzksOCBAQAogTE9DQUxfTVVMVElMSUIgOj0gYm90aAogCiBMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAotICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwgXAotICAgIGN0c3Rlc3RydW5uZXIgXAorICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0IFwKKyAgICBjdHN0ZXN0cnVubmVyLWF4dCBcCiAgICAgY3RzLXNlbnNvcnMtdGVzdHMgXAogCiBMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdHMtc2Vuc29ycy1uZGstam5pCkBAIC04OSw3ICs4OSw3IEBACiAKIExPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKIAotTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lcgorTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lci5zdHVicyBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicwogCiBMT0NBTF9OREtfU1RMX1ZBUklBTlQgOj0gYysrX3NoYXJlZAogCmRpZmYgLS1naXQgYS90ZXN0cy9zZW5zb3IvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL3NlbnNvci9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDBjMzNlMGQuLjQ4YWZlOWMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3NlbnNvci9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL3NlbnNvci9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yNyw3ICsyNyw3IEBACiAKICAgICA8L2FwcGxpY2F0aW9uPgogCi0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5oYXJkd2FyZS5zZW5zb3IuY3RzIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHNlbnNvciB0ZXN0cyI+CiAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJsaXN0ZW5lciIKZGlmZiAtLWdpdCBhL3Rlc3RzL3NlbnNvci9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy9zZW5zb3IvQW5kcm9pZFRlc3QueG1sCmluZGV4IDNlZmY2NGMuLjZiNzBlOWMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3NlbnNvci9BbmRyb2lkVGVzdC54bWwKKysrIGIvdGVzdHMvc2Vuc29yL0FuZHJvaWRUZXN0LnhtbApAQCAtMTQsOCArMTQsMTMgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBTZW5zb3IgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImxvY2F0aW9uIiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRhcmdldHByZXAuTG9jYXRpb25DaGVjayIgLz4KKyAgICA8IS0tIFN3aXRjaCB0byBydW4gdGVzdCBpbiB1c2VyIDAgLS0+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5Td2l0Y2hVc2VyVGFyZ2V0UHJlcGFyZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9InVzZXItdHlwZSIgdmFsdWU9InN5c3RlbSIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgogICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzU2Vuc29yVGVzdENhc2VzLmFwayIgLz4KZGlmZiAtLWdpdCBhL3Rlc3RzL3NlbnNvci9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jdHMvU2Vuc29yQmF0Y2hpbmdUZXN0cy5qYXZhIGIvdGVzdHMvc2Vuc29yL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2N0cy9TZW5zb3JCYXRjaGluZ1Rlc3RzLmphdmEKaW5kZXggMjU1MTJlYy4uMWIyYjI1YyAxMDA2NDQKLS0tIGEvdGVzdHMvc2Vuc29yL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2N0cy9TZW5zb3JCYXRjaGluZ1Rlc3RzLmphdmEKKysrIGIvdGVzdHMvc2Vuc29yL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2N0cy9TZW5zb3JCYXRjaGluZ1Rlc3RzLmphdmEKQEAgLTI1LDggKzI1LDYgQEAKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmN0cy5oZWxwZXJzLnNlbnNvcnZlcmlmaWNhdGlvbi5FdmVudEJhc2ljVmVyaWZpY2F0aW9uOwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY3RzLmhlbHBlcnMuc2Vuc29ydmVyaWZpY2F0aW9uLklTZW5zb3JWZXJpZmljYXRpb247CiAKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNkZFRlc3Q7Ci0KIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKIAogLyoqCkBAIC01NywxMiArNTUsMTAgQEAKICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQkFUQ0hJTkdfUEFERElOR19USU1FX1MgPSAoaW50KSBNYXRoLmNlaWwoQkFUQ0hJTkdfUEVSSU9EICogMC4xZiArIDIpOwogCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuMy9DLTEtMyIpCiAgICAgcHVibGljIHZvaWQgdGVzdEFjY2VsZXJvbWV0ZXJfZmFzdGVzdF9iYXRjaGluZygpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBydW5CYXRjaGluZ1NlbnNvclRlc3QoU2Vuc29yLlRZUEVfQUNDRUxFUk9NRVRFUiwgUkFURV9GQVNURVNULCBCQVRDSElOR19QRVJJT0QpOwogICAgIH0KIAotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjMvQy0xLTMiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RBY2NlbGVyb21ldGVyXzUwaHpfYmF0Y2hpbmcoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgcnVuQmF0Y2hpbmdTZW5zb3JUZXN0KFNlbnNvci5UWVBFX0FDQ0VMRVJPTUVURVIsIFJBVEVfNTBIWiwgQkFUQ0hJTkdfUEVSSU9EKTsKICAgICB9CkBAIC05OSwxMiArOTUsMTAgQEAKICAgICAgICAgcnVuRmx1c2hTZW5zb3JUZXN0KFNlbnNvci5UWVBFX0FDQ0VMRVJPTUVURVJfVU5DQUxJQlJBVEVELCBSQVRFXzUwSFosIEJBVENISU5HX1BFUklPRCk7CiAgICAgfQogCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuMy9DLTEtMyIpCiAgICAgcHVibGljIHZvaWQgdGVzdE1hZ25ldGljRmllbGRfZmFzdGVzdF9iYXRjaGluZygpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBydW5CYXRjaGluZ1NlbnNvclRlc3QoU2Vuc29yLlRZUEVfTUFHTkVUSUNfRklFTEQsIFJBVEVfRkFTVEVTVCwgQkFUQ0hJTkdfUEVSSU9EKTsKICAgICB9CiAKLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iNy4zL0MtMS0zIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0TWFnbmV0aWNGaWVsZF81MGh6X2JhdGNoaW5nKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIHJ1bkJhdGNoaW5nU2Vuc29yVGVzdChTZW5zb3IuVFlQRV9NQUdORVRJQ19GSUVMRCwgUkFURV81MEhaLCBCQVRDSElOR19QRVJJT0QpOwogICAgIH0KQEAgLTEzNywxMiArMTMxLDEwIEBACiAgICAgICAgIHJ1bkZsdXNoU2Vuc29yVGVzdChTZW5zb3IuVFlQRV9PUklFTlRBVElPTiwgUkFURV81MEhaLCBCQVRDSElOR19QRVJJT0QpOwogICAgIH0KIAotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjMvQy0xLTMiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RHeXJvc2NvcGVfZmFzdGVzdF9iYXRjaGluZygpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBydW5CYXRjaGluZ1NlbnNvclRlc3QoU2Vuc29yLlRZUEVfR1lST1NDT1BFLCBSQVRFX0ZBU1RFU1QsIEJBVENISU5HX1BFUklPRCk7CiAgICAgfQogCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuMy9DLTEtMyIpCiAgICAgcHVibGljIHZvaWQgdGVzdEd5cm9zY29wZV81MGh6X2JhdGNoaW5nKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIHJ1bkJhdGNoaW5nU2Vuc29yVGVzdChTZW5zb3IuVFlQRV9HWVJPU0NPUEUsIFJBVEVfNTBIWiwgQkFUQ0hJTkdfUEVSSU9EKTsKICAgICB9CkBAIC0xNTUsMTIgKzE0NywxMCBAQAogICAgICAgICBydW5GbHVzaFNlbnNvclRlc3QoU2Vuc29yLlRZUEVfR1lST1NDT1BFLCBSQVRFXzUwSFosIEJBVENISU5HX1BFUklPRCk7CiAgICAgfQogCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuMy9DLTEtMyIpCiAgICAgcHVibGljIHZvaWQgdGVzdFByZXNzdXJlX2Zhc3Rlc3RfYmF0Y2hpbmcoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgcnVuQmF0Y2hpbmdTZW5zb3JUZXN0KFNlbnNvci5UWVBFX1BSRVNTVVJFLCBSQVRFX0ZBU1RFU1QsIEJBVENISU5HX1BFUklPRCk7CiAgICAgfQogCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuMy9DLTEtMyIpCiAgICAgcHVibGljIHZvaWQgdGVzdFByZXNzdXJlXzUwaHpfYmF0Y2hpbmcoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgcnVuQmF0Y2hpbmdTZW5zb3JUZXN0KFNlbnNvci5UWVBFX1BSRVNTVVJFLCBSQVRFXzUwSFosIEJBVENISU5HX1BFUklPRCk7CiAgICAgfQpAQCAtMTczLDEyICsxNjMsMTAgQEAKICAgICAgICAgcnVuRmx1c2hTZW5zb3JUZXN0KFNlbnNvci5UWVBFX1BSRVNTVVJFLCBSQVRFXzUwSFosIEJBVENISU5HX1BFUklPRCk7CiAgICAgfQogCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuMy9DLTEtMyIpCiAgICAgcHVibGljIHZvaWQgdGVzdEdyYXZpdHlfZmFzdGVzdF9iYXRjaGluZygpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBydW5CYXRjaGluZ1NlbnNvclRlc3QoU2Vuc29yLlRZUEVfR1JBVklUWSwgUkFURV9GQVNURVNULCBCQVRDSElOR19QRVJJT0QpOwogICAgIH0KIAotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjMvQy0xLTMiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RHcmF2aXR5XzUwaHpfYmF0Y2hpbmcoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgcnVuQmF0Y2hpbmdTZW5zb3JUZXN0KFNlbnNvci5UWVBFX0dSQVZJVFksIFJBVEVfNTBIWiwgQkFUQ0hJTkdfUEVSSU9EKTsKICAgICB9CkBAIC0xOTEsMTIgKzE3OSwxMCBAQAogICAgICAgICBydW5GbHVzaFNlbnNvclRlc3QoU2Vuc29yLlRZUEVfR1JBVklUWSwgUkFURV81MEhaLCBCQVRDSElOR19QRVJJT0QpOwogICAgIH0KIAotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjMvQy0xLTMiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RSb3RhdGlvblZlY3Rvcl9mYXN0ZXN0X2JhdGNoaW5nKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIHJ1bkJhdGNoaW5nU2Vuc29yVGVzdChTZW5zb3IuVFlQRV9ST1RBVElPTl9WRUNUT1IsIFJBVEVfRkFTVEVTVCwgQkFUQ0hJTkdfUEVSSU9EKTsKICAgICB9CiAKLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iNy4zL0MtMS0zIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0Um90YXRpb25WZWN0b3JfNTBoel9iYXRjaGluZygpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBydW5CYXRjaGluZ1NlbnNvclRlc3QoU2Vuc29yLlRZUEVfUk9UQVRJT05fVkVDVE9SLCBSQVRFXzUwSFosIEJBVENISU5HX1BFUklPRCk7CiAgICAgfQpAQCAtMjI1LDEyICsyMTEsMTAgQEAKICAgICAgICAgcnVuRmx1c2hTZW5zb3JUZXN0KFNlbnNvci5UWVBFX01BR05FVElDX0ZJRUxEX1VOQ0FMSUJSQVRFRCwgUkFURV81MEhaLCBCQVRDSElOR19QRVJJT0QpOwogICAgIH0KIAotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjMvQy0xLTMiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RHYW1lUm90YXRpb25WZWN0b3JfZmFzdGVzdF9iYXRjaGluZygpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBydW5CYXRjaGluZ1NlbnNvclRlc3QoU2Vuc29yLlRZUEVfR0FNRV9ST1RBVElPTl9WRUNUT1IsIFJBVEVfRkFTVEVTVCwgQkFUQ0hJTkdfUEVSSU9EKTsKICAgICB9CiAKLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iNy4zL0MtMS0zIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2FtZVJvdGF0aW9uVmVjdG9yXzUwaHpfYmF0Y2hpbmcoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgcnVuQmF0Y2hpbmdTZW5zb3JUZXN0KFNlbnNvci5UWVBFX0dBTUVfUk9UQVRJT05fVkVDVE9SLCBSQVRFXzUwSFosIEJBVENISU5HX1BFUklPRCk7CiAgICAgfQpAQCAtMjU5LDEyICsyNDMsMTAgQEAKICAgICAgICAgcnVuRmx1c2hTZW5zb3JUZXN0KFNlbnNvci5UWVBFX0dZUk9TQ09QRV9VTkNBTElCUkFURUQsIFJBVEVfNTBIWiwgQkFUQ0hJTkdfUEVSSU9EKTsKICAgICB9CiAKLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iNy4zL0MtMS0zIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0TGluZWFyQWNjZWxlcmF0aW9uX2Zhc3Rlc3RfYmF0Y2hpbmcoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgcnVuQmF0Y2hpbmdTZW5zb3JUZXN0KFNlbnNvci5UWVBFX0xJTkVBUl9BQ0NFTEVSQVRJT04sIFJBVEVfRkFTVEVTVCwgQkFUQ0hJTkdfUEVSSU9EKTsKICAgICB9CiAKLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iNy4zL0MtMS0zIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0TGluZWFyQWNjZWxlcmF0aW9uXzUwaHpfYmF0Y2hpbmcoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgcnVuQmF0Y2hpbmdTZW5zb3JUZXN0KFNlbnNvci5UWVBFX0xJTkVBUl9BQ0NFTEVSQVRJT04sIFJBVEVfNTBIWiwgQkFUQ0hJTkdfUEVSSU9EKTsKICAgICB9CmRpZmYgLS1naXQgYS90ZXN0cy9zZW5zb3Ivc3JjL2FuZHJvaWQvaGFyZHdhcmUvY3RzL1NlbnNvckRpcmVjdFJlcG9ydFRlc3QuamF2YSBiL3Rlc3RzL3NlbnNvci9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jdHMvU2Vuc29yRGlyZWN0UmVwb3J0VGVzdC5qYXZhCmluZGV4IDhmNjVjNTQuLjc3ODUyZjEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3NlbnNvci9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jdHMvU2Vuc29yRGlyZWN0UmVwb3J0VGVzdC5qYXZhCisrKyBiL3Rlc3RzL3NlbnNvci9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jdHMvU2Vuc29yRGlyZWN0UmVwb3J0VGVzdC5qYXZhCkBAIC0zMSw4ICszMSw2IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DZGRUZXN0OwotCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLlVuY2hlY2tlZElPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CkBAIC0yMDYsNyArMjA0LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgKG1IYXJkd2FyZUJ1ZmZlciAhPSBudWxsICYmIG1IYXJkd2FyZUJ1ZmZlclNlY29uZGFyeSAhPSBudWxsKSk7CiAgICAgfQogCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuMy45L0MtMy0xLEMtMy0yIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWNjZWxlcm9tZXRlckFzaG1lbU5vcm1hbCgpIHsKICAgICAgICAgcnVuU2Vuc29yRGlyZWN0UmVwb3J0VGVzdCgKICAgICAgICAgICAgICAgICBTZW5zb3IuVFlQRV9BQ0NFTEVST01FVEVSLApAQCAtMjE0LDcgKzIxMSw2IEBACiAgICAgICAgICAgICAgICAgU2Vuc29yRGlyZWN0Q2hhbm5lbC5SQVRFX05PUk1BTCk7CiAgICAgfQogCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuMy45L0MtMy0xLEMtMy0yIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0R3lyb3Njb3BlQXNobWVtTm9ybWFsKCkgewogICAgICAgICBydW5TZW5zb3JEaXJlY3RSZXBvcnRUZXN0KAogICAgICAgICAgICAgICAgIFNlbnNvci5UWVBFX0dZUk9TQ09QRSwKQEAgLTIyMiw3ICsyMTgsNiBAQAogICAgICAgICAgICAgICAgIFNlbnNvckRpcmVjdENoYW5uZWwuUkFURV9OT1JNQUwpOwogICAgIH0KIAotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjMuOS9DLTMtMSxDLTMtMiIpCiAgICAgcHVibGljIHZvaWQgdGVzdE1hZ25ldGljRmllbGRBc2htZW1Ob3JtYWwoKSB7CiAgICAgICAgIHJ1blNlbnNvckRpcmVjdFJlcG9ydFRlc3QoCiAgICAgICAgICAgICAgICAgU2Vuc29yLlRZUEVfTUFHTkVUSUNfRklFTEQsCkBAIC0yMzAsNyArMjI1LDYgQEAKICAgICAgICAgICAgICAgICBTZW5zb3JEaXJlY3RDaGFubmVsLlJBVEVfTk9STUFMKTsKICAgICB9CiAKLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iNy4zLjkvQy0zLTEsQy0zLTIiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RBY2NlbGVyb21ldGVyQXNobWVtRmFzdCgpIHsKICAgICAgICAgcnVuU2Vuc29yRGlyZWN0UmVwb3J0VGVzdCgKICAgICAgICAgICAgICAgICBTZW5zb3IuVFlQRV9BQ0NFTEVST01FVEVSLApAQCAtMjM5LDcgKzIzMyw2IEBACiAKICAgICB9CiAKLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iNy4zLjkvQy0zLTEsQy0zLTIiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RHeXJvc2NvcGVBc2htZW1GYXN0KCkgewogICAgICAgICBydW5TZW5zb3JEaXJlY3RSZXBvcnRUZXN0KAogICAgICAgICAgICAgICAgIFNlbnNvci5UWVBFX0dZUk9TQ09QRSwKQEAgLTI0Nyw3ICsyNDAsNiBAQAogICAgICAgICAgICAgICAgIFNlbnNvckRpcmVjdENoYW5uZWwuUkFURV9GQVNUKTsKICAgICB9CiAKLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iNy4zLjkvQy0zLTEsQy0zLTIiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RNYWduZXRpY0ZpZWxkQXNobWVtRmFzdCgpIHsKICAgICAgICAgcnVuU2Vuc29yRGlyZWN0UmVwb3J0VGVzdCgKICAgICAgICAgICAgICAgICBTZW5zb3IuVFlQRV9NQUdORVRJQ19GSUVMRCwKQEAgLTI1NSw3ICsyNDcsNiBAQAogICAgICAgICAgICAgICAgIFNlbnNvckRpcmVjdENoYW5uZWwuUkFURV9GQVNUKTsKICAgICB9CiAKLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iNy4zLjkvQy0zLTEsQy0zLTIiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RBY2NlbGVyb21ldGVyQXNobWVtVmVyeUZhc3QoKSB7CiAgICAgICAgIHJ1blNlbnNvckRpcmVjdFJlcG9ydFRlc3QoCiAgICAgICAgICAgICAgICAgU2Vuc29yLlRZUEVfQUNDRUxFUk9NRVRFUiwKQEAgLTI2NCw3ICsyNTUsNiBAQAogCiAgICAgfQogCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuMy45L0MtMy0xLEMtMy0yIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0R3lyb3Njb3BlQXNobWVtVmVyeUZhc3QoKSB7CiAgICAgICAgIHJ1blNlbnNvckRpcmVjdFJlcG9ydFRlc3QoCiAgICAgICAgICAgICAgICAgU2Vuc29yLlRZUEVfR1lST1NDT1BFLApAQCAtMjcyLDcgKzI2Miw2IEBACiAgICAgICAgICAgICAgICAgU2Vuc29yRGlyZWN0Q2hhbm5lbC5SQVRFX1ZFUllfRkFTVCk7CiAgICAgfQogCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuMy45L0MtMy0xLEMtMy0yIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0TWFnbmV0aWNGaWVsZEFzaG1lbVZlcnlGYXN0KCkgewogICAgICAgICBydW5TZW5zb3JEaXJlY3RSZXBvcnRUZXN0KAogICAgICAgICAgICAgICAgIFNlbnNvci5UWVBFX01BR05FVElDX0ZJRUxELApAQCAtMjgwLDcgKzI2OSw2IEBACiAgICAgICAgICAgICAgICAgU2Vuc29yRGlyZWN0Q2hhbm5lbC5SQVRFX1ZFUllfRkFTVCk7CiAgICAgfQogCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuMy45L0MtMy0xLEMtMy0yIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWNjZWxlcm9tZXRlckhhcmR3YXJlQnVmZmVyTm9ybWFsKCkgewogICAgICAgICBydW5TZW5zb3JEaXJlY3RSZXBvcnRUZXN0KAogICAgICAgICAgICAgICAgIFNlbnNvci5UWVBFX0FDQ0VMRVJPTUVURVIsCkBAIC0yODgsNyArMjc2LDYgQEAKICAgICAgICAgICAgICAgICBTZW5zb3JEaXJlY3RDaGFubmVsLlJBVEVfTk9STUFMKTsKICAgICB9CiAKLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iNy4zLjkvQy0zLTEsQy0zLTIiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RHeXJvc2NvcGVIYXJkd2FyZUJ1ZmZlck5vcm1hbCgpIHsKICAgICAgICAgcnVuU2Vuc29yRGlyZWN0UmVwb3J0VGVzdCgKICAgICAgICAgICAgICAgICBTZW5zb3IuVFlQRV9HWVJPU0NPUEUsCkBAIC0yOTYsNyArMjgzLDYgQEAKICAgICAgICAgICAgICAgICBTZW5zb3JEaXJlY3RDaGFubmVsLlJBVEVfTk9STUFMKTsKICAgICB9CiAKLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iNy4zLjkvQy0zLTEsQy0zLTIiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RNYWduZXRpY0ZpZWxkSGFyZHdhcmVCdWZmZXJOb3JtYWwoKSB7CiAgICAgICAgIHJ1blNlbnNvckRpcmVjdFJlcG9ydFRlc3QoCiAgICAgICAgICAgICAgICAgU2Vuc29yLlRZUEVfTUFHTkVUSUNfRklFTEQsCkBAIC0zMDQsNyArMjkwLDYgQEAKICAgICAgICAgICAgICAgICBTZW5zb3JEaXJlY3RDaGFubmVsLlJBVEVfTk9STUFMKTsKICAgICB9CiAKLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iNy4zLjkvQy0zLTEsQy0zLTIiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RBY2NlbGVyb21ldGVySGFyZHdhcmVCdWZmZXJGYXN0KCkgewogICAgICAgICBydW5TZW5zb3JEaXJlY3RSZXBvcnRUZXN0KAogICAgICAgICAgICAgICAgIFNlbnNvci5UWVBFX0FDQ0VMRVJPTUVURVIsCkBAIC0zMTIsNyArMjk3LDYgQEAKICAgICAgICAgICAgICAgICBTZW5zb3JEaXJlY3RDaGFubmVsLlJBVEVfRkFTVCk7CiAgICAgfQogCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuMy45L0MtMy0xLEMtMy0yIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0R3lyb3Njb3BlSGFyZHdhcmVCdWZmZXJGYXN0KCkgewogICAgICAgICBydW5TZW5zb3JEaXJlY3RSZXBvcnRUZXN0KAogICAgICAgICAgICAgICAgIFNlbnNvci5UWVBFX0dZUk9TQ09QRSwKQEAgLTMyMCw3ICszMDQsNiBAQAogICAgICAgICAgICAgICAgIFNlbnNvckRpcmVjdENoYW5uZWwuUkFURV9GQVNUKTsKICAgICB9CiAKLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iNy4zLjkvQy0zLTEsQy0zLTIiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RNYWduZXRpY0ZpZWxkSGFyZHdhcmVCdWZmZXJGYXN0KCkgewogICAgICAgICBydW5TZW5zb3JEaXJlY3RSZXBvcnRUZXN0KAogICAgICAgICAgICAgICAgIFNlbnNvci5UWVBFX01BR05FVElDX0ZJRUxELApAQCAtMzI4LDcgKzMxMSw2IEBACiAgICAgICAgICAgICAgICAgU2Vuc29yRGlyZWN0Q2hhbm5lbC5SQVRFX0ZBU1QpOwogICAgIH0KIAotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjMuOS9DLTMtMSxDLTMtMiIpCiAgICAgcHVibGljIHZvaWQgdGVzdEFjY2VsZXJvbWV0ZXJIYXJkd2FyZUJ1ZmZlclZlcnlGYXN0KCkgewogICAgICAgICBydW5TZW5zb3JEaXJlY3RSZXBvcnRUZXN0KAogICAgICAgICAgICAgICAgIFNlbnNvci5UWVBFX0FDQ0VMRVJPTUVURVIsCkBAIC0zMzYsNyArMzE4LDYgQEAKICAgICAgICAgICAgICAgICBTZW5zb3JEaXJlY3RDaGFubmVsLlJBVEVfVkVSWV9GQVNUKTsKICAgICB9CiAKLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iNy4zLjkvQy0zLTEsQy0zLTIiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RHeXJvc2NvcGVIYXJkd2FyZUJ1ZmZlclZlcnlGYXN0KCkgewogICAgICAgICBydW5TZW5zb3JEaXJlY3RSZXBvcnRUZXN0KAogICAgICAgICAgICAgICAgIFNlbnNvci5UWVBFX0dZUk9TQ09QRSwKQEAgLTM0NCw3ICszMjUsNiBAQAogICAgICAgICAgICAgICAgIFNlbnNvckRpcmVjdENoYW5uZWwuUkFURV9WRVJZX0ZBU1QpOwogICAgIH0KIAotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjMuOS9DLTMtMSxDLTMtMiIpCiAgICAgcHVibGljIHZvaWQgdGVzdE1hZ25ldGljRmllbGRIYXJkd2FyZUJ1ZmZlclZlcnlGYXN0KCkgewogICAgICAgICBydW5TZW5zb3JEaXJlY3RSZXBvcnRUZXN0KAogICAgICAgICAgICAgICAgIFNlbnNvci5UWVBFX01BR05FVElDX0ZJRUxELApkaWZmIC0tZ2l0IGEvdGVzdHMvc2Vuc29yL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2N0cy9TZW5zb3JQYXJhbWV0ZXJSYW5nZVRlc3QuamF2YSBiL3Rlc3RzL3NlbnNvci9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jdHMvU2Vuc29yUGFyYW1ldGVyUmFuZ2VUZXN0LmphdmEKaW5kZXggZmU4NDA4Zi4uYzFjOWZhYiAxMDA2NDQKLS0tIGEvdGVzdHMvc2Vuc29yL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2N0cy9TZW5zb3JQYXJhbWV0ZXJSYW5nZVRlc3QuamF2YQorKysgYi90ZXN0cy9zZW5zb3Ivc3JjL2FuZHJvaWQvaGFyZHdhcmUvY3RzL1NlbnNvclBhcmFtZXRlclJhbmdlVGVzdC5qYXZhCkBAIC0yMyw4ICsyMyw2IEBACiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jdHMuaGVscGVycy5TZW5zb3JDdHNIZWxwZXI7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ2RkVGVzdDsKLQogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CkBAIC03NywzOCArNzUsMzQgQEAKICAgICAgICAgbVZyTW9kZUhpZ2hQZXJmb3JtYW5jZSA9IHBtLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9WUl9NT0RFX0hJR0hfUEVSRk9STUFOQ0UpOwogICAgIH0KIAotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjMuOS9DLTItMSw3LjMvQy0xLTEiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RBY2NlbGVyb21ldGVyUmFuZ2UoKSB7CiAgICAgICAgIGNoZWNrU2Vuc29yUmFuZ2VBbmRGcmVxdWVuY3koCi0gICAgICAgICAgICAgICAgbVNlbnNvck1hbmFnZXIuZ2V0RGVmYXVsdFNlbnNvcihTZW5zb3IuVFlQRV9BQ0NFTEVST01FVEVSKSwKKyAgICAgICAgICAgICAgICBTZW5zb3IuVFlQRV9BQ0NFTEVST01FVEVSLAogICAgICAgICAgICAgICAgIEFDQ0VMRVJPTUVURVJfTUFYX1JBTkdFLAogICAgICAgICAgICAgICAgIEFDQ0VMRVJPTUVURVJfTUlOX0ZSRVFVRU5DWSwKICAgICAgICAgICAgICAgICBBQ0NFTEVST01FVEVSX01BWF9GUkVRVUVOQ1kpOwotICB9CisgICAgfQogCi0gICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iNy4zLjkvQy0yLTMsNy4zL0MtMS0xIikKLSAgcHVibGljIHZvaWQgdGVzdEd5cm9zY29wZVJhbmdlKCkgeworICAgIHB1YmxpYyB2b2lkIHRlc3RHeXJvc2NvcGVSYW5nZSgpIHsKICAgICAgICAgY2hlY2tTZW5zb3JSYW5nZUFuZEZyZXF1ZW5jeSgKLSAgICAgICAgICAgICAgICBtU2Vuc29yTWFuYWdlci5nZXREZWZhdWx0U2Vuc29yKFNlbnNvci5UWVBFX0dZUk9TQ09QRSksCisgICAgICAgICAgICAgICAgU2Vuc29yLlRZUEVfR1lST1NDT1BFLAogICAgICAgICAgICAgICAgIEdZUk9fTUFYX1JBTkdFLAogICAgICAgICAgICAgICAgIEdZUk9fTUlOX0ZSRVFVRU5DWSwKICAgICAgICAgICAgICAgICBHWVJPX01BWF9GUkVRVUVOQ1kpOwotICB9CisgICAgfQogCi0gICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iNy4zLjkvQy0yLTUsNy4zL0MtMS0xIikKLSAgIHB1YmxpYyB2b2lkIHRlc3RNYWduZXRvbWV0ZXJSYW5nZSgpIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFnbmV0b21ldGVyUmFuZ2UoKSB7CiAgICAgICAgIGNoZWNrU2Vuc29yUmFuZ2VBbmRGcmVxdWVuY3koCi0gICAgICAgICAgICAgICAgbVNlbnNvck1hbmFnZXIuZ2V0RGVmYXVsdFNlbnNvcihTZW5zb3IuVFlQRV9NQUdORVRJQ19GSUVMRCksCisgICAgICAgICAgICAgICAgU2Vuc29yLlRZUEVfTUFHTkVUSUNfRklFTEQsCiAgICAgICAgICAgICAgICAgTUFHTkVUT01FVEVSX01BWF9SQU5HRSwKICAgICAgICAgICAgICAgICBNQUdORVRPTUVURVJfTUlOX0ZSRVFVRU5DWSwKICAgICAgICAgICAgICAgICBNQUdORVRPTUVURVJfTUFYX0ZSRVFVRU5DWSk7CiAgICAgfQogCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuMy45L0MtMi03LDcuMy9DLTEtMSIpCiAgICAgcHVibGljIHZvaWQgdGVzdFByZXNzdXJlUmFuZ2UoKSB7CiAgICAgICAgIGlmIChtSGFzSGlmaVNlbnNvcnMpIHsKICAgICAgICAgICAgIGNoZWNrU2Vuc29yUmFuZ2VBbmRGcmVxdWVuY3koCi0gICAgICAgICAgICAgICAgICAgIG1TZW5zb3JNYW5hZ2VyLmdldERlZmF1bHRTZW5zb3IoU2Vuc29yLlRZUEVfUFJFU1NVUkUpLAorICAgICAgICAgICAgICAgICAgICBTZW5zb3IuVFlQRV9QUkVTU1VSRSwKICAgICAgICAgICAgICAgICAgICAgUFJFU1NVUkVfTUFYX1JBTkdFLAogICAgICAgICAgICAgICAgICAgICBQUkVTU1VSRV9NSU5fRlJFUVVFTkNZLAogICAgICAgICAgICAgICAgICAgICBQUkVTU1VSRV9NQVhfRlJFUVVFTkNZKTsKQEAgLTExNiw4ICsxMTAsMTQgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgY2hlY2tTZW5zb3JSYW5nZUFuZEZyZXF1ZW5jeSgKLSAgICAgICAgICBTZW5zb3Igc2Vuc29yLCBkb3VibGUgbWF4UmFuZ2UsIGRvdWJsZSBtaW5GcmVxdWVuY3ksIGRvdWJsZSBtYXhGcmVxdWVuY3kpIHsKKyAgICAgICAgICBpbnQgc2Vuc29yVHlwZSwgZG91YmxlIG1heFJhbmdlLCBkb3VibGUgbWluRnJlcXVlbmN5LCBkb3VibGUgbWF4RnJlcXVlbmN5KSB7CiAgICAgICAgIGlmICghbUhhc0hpZmlTZW5zb3JzICYmICFtVnJNb2RlSGlnaFBlcmZvcm1hbmNlKSByZXR1cm47CisKKyAgICAgICAgU2Vuc29yIHNlbnNvciA9IG1TZW5zb3JNYW5hZ2VyLmdldERlZmF1bHRTZW5zb3Ioc2Vuc29yVHlwZSk7CisgICAgICAgIGlmIChzZW5zb3IgPT0gbnVsbCkgeworICAgICAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCJNdXN0IHN1cHBvcnQgc2Vuc29yIHR5cGUgJWQiLCBzZW5zb3JUeXBlKSk7CisgICAgICAgIH0KKwogICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoIiVzIFJhbmdlIGFjdHVhbD0lLjJmIGV4cGVjdGVkPSUuMmYgJXMiLAogICAgICAgICAgICAgICAgICAgICBzZW5zb3IuZ2V0TmFtZSgpLCBzZW5zb3IuZ2V0TWF4aW11bVJhbmdlKCksIG1heFJhbmdlLAogICAgICAgICAgICAgICAgICAgICBTZW5zb3JDdHNIZWxwZXIuZ2V0VW5pdHNGb3JTZW5zb3Ioc2Vuc29yKSksCkBAIC0xMzUsMTMgKzEzNSwxMSBAQAogICAgICAgICAgICAgICAgIG1heEZyZXF1ZW5jeSAtIDAuMSk7CiAgICAgfQogCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuMy45L0MtMi0xIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWNjZWxlcm9tZXRlckZpZm9MZW5ndGgoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgaWYgKCFtSGFzSGlmaVNlbnNvcnMpIHJldHVybjsKICAgICAgICAgY2hlY2tNaW5GaWZvTGVuZ3RoKFNlbnNvci5UWVBFX0FDQ0VMRVJPTUVURVIsIEFDQ0VMRVJPTUVURVJfTUlOX0ZJRk9fTEVOR1RIKTsKICAgICB9CiAKLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iNy4zLjkvQy0yLTYiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RVbmNhbE1hZ25ldG9tZXRlckZpZm9MZW5ndGgoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgaWYgKCFtSGFzSGlmaVNlbnNvcnMpIHJldHVybjsKICAgICAgICAgY2hlY2tNaW5GaWZvTGVuZ3RoKApAQCAtMTQ5LDI1ICsxNDcsMjEgQEAKICAgICAgICAgICAgICAgICBVTkNBTF9NQUdORVRPTUVURVJfTUlOX0ZJRk9fTEVOR1RIKTsKICAgICB9CiAKLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iNy4zLjkvQy0yLTciKQogICAgIHB1YmxpYyB2b2lkIHRlc3RQcmVzc3VyZUZpZm9MZW5ndGgoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgaWYgKCFtSGFzSGlmaVNlbnNvcnMpIHJldHVybjsKICAgICAgICAgY2hlY2tNaW5GaWZvTGVuZ3RoKFNlbnNvci5UWVBFX1BSRVNTVVJFLCBQUkVTU1VSRV9NSU5fRklGT19MRU5HVEgpOwogICAgIH0KIAotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjMuOS9DLTItOCIpCiAgICAgcHVibGljIHZvaWQgdGVzdEdhbWVSb3RhdGlvblZlY3RvckZpZm9MZW5ndGgoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgaWYgKCFtSGFzSGlmaVNlbnNvcnMpIHJldHVybjsKICAgICAgICAgY2hlY2tNaW5GaWZvTGVuZ3RoKFNlbnNvci5UWVBFX0dBTUVfUk9UQVRJT05fVkVDVE9SLCBHQU1FX1JPVEFUSU9OX1ZFQ1RPUl9NSU5fRklGT19MRU5HVEgpOwogICAgIH0KIAotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjMuOS9DLTItMTciKQogICAgIHB1YmxpYyB2b2lkIHRlc3RQcm94aW1pdHlGaWZvTGVuZ3RoKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIGlmICghbUhhc0hpZmlTZW5zb3JzKSByZXR1cm47CiAgICAgICAgIGNoZWNrTWluRmlmb0xlbmd0aChTZW5zb3IuVFlQRV9QUk9YSU1JVFksIFBST1hJTUlUWV9TRU5TT1JfTUlOX0ZJRk9fTEVOR1RIKTsKICAgICB9CiAKLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iNy4zLjkvQy0yLTEwIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0U3RlcERldGVjdG9yRmlmb0xlbmd0aCgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBpZiAoIW1IYXNIaWZpU2Vuc29ycykgcmV0dXJuOwogICAgICAgICBjaGVja01pbkZpZm9MZW5ndGgoU2Vuc29yLlRZUEVfU1RFUF9ERVRFQ1RPUiwgU1RFUF9ERVRFQ1RPUl9NSU5fRklGT19MRU5HVEgpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvc2Vuc29yL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2N0cy9TZW5zb3JTdXBwb3J0VGVzdC5qYXZhIGIvdGVzdHMvc2Vuc29yL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2N0cy9TZW5zb3JTdXBwb3J0VGVzdC5qYXZhCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggMDllNDcxMS4uNjNjZGE4YgotLS0gYS90ZXN0cy9zZW5zb3Ivc3JjL2FuZHJvaWQvaGFyZHdhcmUvY3RzL1NlbnNvclN1cHBvcnRUZXN0LmphdmEKKysrIGIvdGVzdHMvc2Vuc29yL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2N0cy9TZW5zb3JTdXBwb3J0VGVzdC5qYXZhCkBAIC0xOCw4ICsxOCwxNCBAQAogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvcjsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvckRpcmVjdENoYW5uZWw7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3JNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlByb3BlcnR5VXRpbDsKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNkZFRlc3Q7CiAKIC8qKgogICogQ2hlY2tzIGlmIEhpZmkgc2Vuc29ycyAgb3IgVlIgSGlnaCBwZXJmb3JtYW5jZSBtb2RlIHNlbnNvcnMKQEAgLTM4LDYgKzQ0LDcgQEAKICAgICBwcml2YXRlIFNlbnNvck1hbmFnZXIgbVNlbnNvck1hbmFnZXI7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1BcmVIaWZpU2Vuc29yc1N1cHBvcnRlZDsKICAgICBwcml2YXRlIGJvb2xlYW4gbVZySGlnaFBlcmZvcm1hbmNlTW9kZVN1cHBvcnRlZDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzVnJIZWFkc2V0OwogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CkBAIC00NSwyOCArNTIsNDIgQEAKICAgICAgICAgLy8gVGVzdHMgd2lsbCBvbmx5IHJ1biBpZiBlaXRoZXIgSElGSV9TRU5TT1JTIG9yIFZSIGhpZ2ggcGVyZm9ybWFuY2UgbW9kZSBpcyBzdXBwb3J0ZWQuCiAgICAgICAgIG1BcmVIaWZpU2Vuc29yc1N1cHBvcnRlZCA9IHBtLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9ISUZJX1NFTlNPUlMpOwogICAgICAgICBtVnJIaWdoUGVyZm9ybWFuY2VNb2RlU3VwcG9ydGVkID0gcG0uaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX1ZSX01PREVfSElHSF9QRVJGT1JNQU5DRSk7CisgICAgICAgIG1Jc1ZySGVhZHNldCA9IChnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0Q29uZmlndXJhdGlvbigpLnVpTW9kZQorICAgICAgICAgICAgJiBDb25maWd1cmF0aW9uLlVJX01PREVfVFlQRV9NQVNLKSA9PSBDb25maWd1cmF0aW9uLlVJX01PREVfVFlQRV9WUl9IRUFEU0VUOwogICAgICAgICBpZiAobUFyZUhpZmlTZW5zb3JzU3VwcG9ydGVkIHx8IG1WckhpZ2hQZXJmb3JtYW5jZU1vZGVTdXBwb3J0ZWQpIHsKICAgICAgICAgICAgIG1TZW5zb3JNYW5hZ2VyID0KICAgICAgICAgICAgICAgICAgICAgKFNlbnNvck1hbmFnZXIpIGdldENvbnRleHQoKS5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuU0VOU09SX1NFUlZJQ0UpOwogICAgICAgICB9CiAgICAgfQogCisgICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuOS4yL0MtMS0xOSxDLTEtMjAiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RTdXBwb3J0c0FjY2VsZXJvbWV0ZXIoKSB7CiAgICAgICAgIGNoZWNrU3VwcG9ydHNTZW5zb3IoU2Vuc29yLlRZUEVfQUNDRUxFUk9NRVRFUik7CiAgICAgfQogCisgICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuOS4yL0MtMS0xOSxDLTEtMjAiKQorICAgIHB1YmxpYyB2b2lkIHRlc3RTdXBwb3J0c0FjY2VsZXJvbWV0ZXJVbmNhbGlicmF0ZWQoKSB7IAorICAgICAgICBpZiAoUHJvcGVydHlVdGlsLmdldEZpcnN0QXBpTGV2ZWwoKSA+PSBCdWlsZC5WRVJTSU9OX0NPREVTLk8pIHsKKyAgICAgICAgICAgIGNoZWNrU3VwcG9ydHNTZW5zb3IoU2Vuc29yLlRZUEVfQUNDRUxFUk9NRVRFUl9VTkNBTElCUkFURUQpOworICAgICAgICB9CisgICAgfQorCisgICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuOS4yL0MtMS0xOSxDLTEtMjAiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RTdXBwb3J0c0d5cm9zY29wZSgpIHsKICAgICAgICAgY2hlY2tTdXBwb3J0c1NlbnNvcihTZW5zb3IuVFlQRV9HWVJPU0NPUEUpOwogICAgIH0KIAorICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjkuMi9DLTEtMTksQy0xLTIwIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0U3VwcG9ydHNHeXJvc2NvcGVVbmNhbGlicmF0ZWQoKSB7CiAgICAgICAgIGNoZWNrU3VwcG9ydHNTZW5zb3IoU2Vuc29yLlRZUEVfR1lST1NDT1BFX1VOQ0FMSUJSQVRFRCk7CiAgICAgfQogCisgICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuOS4yL0MtMS0xOSxDLTEtMjAiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RTdXBwb3J0c0dlb01hZ25ldGljRmllbGQoKSB7CiAgICAgICAgIGNoZWNrU3VwcG9ydHNTZW5zb3IoU2Vuc29yLlRZUEVfTUFHTkVUSUNfRklFTEQpOwogICAgIH0KIAorICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjkuMi9DLTEtMTksQy0xLTIwIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0U3VwcG9ydHNNYWduZXRpY0ZpZWxkVW5jYWxpYnJhdGVkKCkgewogICAgICAgICBjaGVja1N1cHBvcnRzU2Vuc29yKFNlbnNvci5UWVBFX01BR05FVElDX0ZJRUxEX1VOQ0FMSUJSQVRFRCk7CiAgICAgfQpAQCAtOTcsOSArMTE4LDEyIEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBib29sZWFuIHNlbnNvclJlcXVpcmVkRm9yVnJIaWdoUGVyZm9ybWFuY2VNb2RlKGludCBzZW5zb3JUeXBlKSB7Ci0gICAgICAgIGlmIChzZW5zb3JUeXBlID09IFNlbnNvci5UWVBFX01BR05FVElDX0ZJRUxEIHx8CisgICAgICAgIGlmIChzZW5zb3JUeXBlID09IFNlbnNvci5UWVBFX0FDQ0VMRVJPTUVURVIgfHwKKyAgICAgICAgICAgIHNlbnNvclR5cGUgPT0gU2Vuc29yLlRZUEVfQUNDRUxFUk9NRVRFUl9VTkNBTElCUkFURUQgfHwKICAgICAgICAgICAgIHNlbnNvclR5cGUgPT0gU2Vuc29yLlRZUEVfR1lST1NDT1BFIHx8Ci0gICAgICAgICAgICBzZW5zb3JUeXBlID09IFNlbnNvci5UWVBFX0FDQ0VMRVJPTUVURVIpIHsKKyAgICAgICAgICAgIHNlbnNvclR5cGUgPT0gU2Vuc29yLlRZUEVfR1lST1NDT1BFX1VOQ0FMSUJSQVRFRCB8fAorICAgICAgICAgICAgc2Vuc29yVHlwZSA9PSBTZW5zb3IuVFlQRV9NQUdORVRJQ19GSUVMRCB8fAorICAgICAgICAgICAgc2Vuc29yVHlwZSA9PSBTZW5zb3IuVFlQRV9NQUdORVRJQ19GSUVMRF9VTkNBTElCUkFURUQpIHsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTA3LDEwICsxMzEsMTQgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgY2hlY2tTdXBwb3J0c1NlbnNvcihpbnQgc2Vuc29yVHlwZSkgewotICAgICAgICBpZiAobUFyZUhpZmlTZW5zb3JzU3VwcG9ydGVkIHx8Ci0gICAgICAgICAgICAobVZySGlnaFBlcmZvcm1hbmNlTW9kZVN1cHBvcnRlZCAmJgotICAgICAgICAgICAgIHNlbnNvclJlcXVpcmVkRm9yVnJIaWdoUGVyZm9ybWFuY2VNb2RlKHNlbnNvclR5cGUpKSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtU2Vuc29yTWFuYWdlci5nZXREZWZhdWx0U2Vuc29yKHNlbnNvclR5cGUpICE9IG51bGwpOworICAgICAgICBib29sZWFuIGlzVnJTZW5zb3IgPSBtVnJIaWdoUGVyZm9ybWFuY2VNb2RlU3VwcG9ydGVkICYmCisgICAgICAgICAgICBzZW5zb3JSZXF1aXJlZEZvclZySGlnaFBlcmZvcm1hbmNlTW9kZShzZW5zb3JUeXBlKTsKKyAgICAgICAgaWYgKG1BcmVIaWZpU2Vuc29yc1N1cHBvcnRlZCB8fCBpc1ZyU2Vuc29yKSB7CisgICAgICAgICAgICBTZW5zb3Igc2Vuc29yID0gbVNlbnNvck1hbmFnZXIuZ2V0RGVmYXVsdFNlbnNvcihzZW5zb3JUeXBlKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoc2Vuc29yICE9IG51bGwpOworICAgICAgICAgICAgaWYgKGlzVnJTZW5zb3IgJiYgbUlzVnJIZWFkc2V0KSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzZW5zb3IuaXNEaXJlY3RDaGFubmVsVHlwZVN1cHBvcnRlZChTZW5zb3JEaXJlY3RDaGFubmVsLlRZUEVfSEFSRFdBUkVfQlVGRkVSKSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9zZW5zb3Ivc3JjL2FuZHJvaWQvaGFyZHdhcmUvY3RzL1NlbnNvclRlc3QuamF2YSBiL3Rlc3RzL3NlbnNvci9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jdHMvU2Vuc29yVGVzdC5qYXZhCmluZGV4IGY2MmJiN2EuLmYxM2RkMzggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3NlbnNvci9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jdHMvU2Vuc29yVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3NlbnNvci9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jdHMvU2Vuc29yVGVzdC5qYXZhCkBAIC0xNiw4ICsxNiw2IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5oYXJkd2FyZS5jdHM7CiAKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuU2Vuc29yOwpAQCAtMzUsNiArMzMsNyBAQAogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY3RzLmhlbHBlcnMuVGVzdFNlbnNvck1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jdHMuaGVscGVycy5zZW5zb3JvcGVyYXRpb25zLlBhcmFsbGVsU2Vuc29yT3BlcmF0aW9uOwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY3RzLmhlbHBlcnMuc2Vuc29yb3BlcmF0aW9ucy5UZXN0U2Vuc29yT3BlcmF0aW9uOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY3RzLmhlbHBlcnMuc2Vuc29ydmVyaWZpY2F0aW9uLkNvbnRpbnVvdXNFdmVudFNhbml0aXplZFZlcmlmaWNhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmN0cy5oZWxwZXJzLnNlbnNvcnZlcmlmaWNhdGlvbi5FdmVudEdhcFZlcmlmaWNhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmN0cy5oZWxwZXJzLnNlbnNvcnZlcmlmaWNhdGlvbi5FdmVudE9yZGVyaW5nVmVyaWZpY2F0aW9uOwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY3RzLmhlbHBlcnMuc2Vuc29ydmVyaWZpY2F0aW9uLkV2ZW50VGltZXN0YW1wU3luY2hyb25pemF0aW9uVmVyaWZpY2F0aW9uOwpAQCAtNDUsMTEgKzQ0LDE1IEBACiBpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlByZXN1Ym1pdDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DZGRUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CiAKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlN5c3RlbVV0aWw7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5SYW5kb207CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiAKQEAgLTExNyw3ICsxMjAsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuMy9DLTAtMSw3LjMuMS9DLTEtMiw3LjMuMi9DLTEtMSIpCiAgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2Vuc29yT3BlcmF0aW9ucygpIHsKICAgICAgICAgLy8gQmVjYXVzZSB3ZSBjYW4ndCBrbm93IGV2ZXJ5IHNlbnNvcnMgdW5pdCBkZXRhaWxzLCBzbyB3ZSBjYW4ndCBhc3NlcnQKQEAgLTI2Myw3ICsyNjUsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuMy9DLTAtMyIpCiAgICAgcHVibGljIHZvaWQgdGVzdFJlcXVlc3RUcmlnZ2VyV2l0aE5vblRyaWdnZXJTZW5zb3IoKSB7CiAgICAgICAgIG1UcmlnZ2VyU2Vuc29yID0gbVNlbnNvck1hbmFnZXIuZ2V0RGVmYXVsdFNlbnNvcihTZW5zb3IuVFlQRV9BQ0NFTEVST01FVEVSKTsKICAgICAgICAgaWYgKG1UcmlnZ2VyU2Vuc29yID09IG51bGwpIHsKQEAgLTI3NCw3ICsyNzUsNiBAQAogICAgICAgICBhc3NlcnRGYWxzZShyZXN1bHQpOwogICAgIH0KIAotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjMvQy0wLTMiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RDYW5jZWxUcmlnZ2VyV2l0aE5vblRyaWdnZXJTZW5zb3IoKSB7CiAgICAgICAgIG1UcmlnZ2VyU2Vuc29yID0gbVNlbnNvck1hbmFnZXIuZ2V0RGVmYXVsdFNlbnNvcihTZW5zb3IuVFlQRV9BQ0NFTEVST01FVEVSKTsKICAgICAgICAgaWYgKG1UcmlnZ2VyU2Vuc29yID09IG51bGwpIHsKQEAgLTI4NSw3ICsyODUsNiBAQAogICAgICAgICBhc3NlcnRGYWxzZShyZXN1bHQpOwogICAgIH0KIAotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjMvQy0wLTMiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RSZWdpc3RlcldpdGhUcmlnZ2VyU2Vuc29yKCkgewogICAgICAgICBTZW5zb3Igc2Vuc29yID0gbVNlbnNvck1hbmFnZXIuZ2V0RGVmYXVsdFNlbnNvcihTZW5zb3IuVFlQRV9TSUdOSUZJQ0FOVF9NT1RJT04pOwogICAgICAgICBpZiAoc2Vuc29yID09IG51bGwpIHsKQEAgLTMxMywxNCArMzEyLDYwIEBACiAgICAgICAgIGFzc2VydEZhbHNlKHJlc3VsdCk7CiAgICAgfQogCi0gICAgLy8gVE9ETzogcmVtb3ZlIHdoZW4gcGFyYW1ldGl6ZWQgdGVzdHMgYXJlIHN1cHBvcnRlZCBhbmQgRXZlbnRUaW1lc3RhbXBTeW5jaHJvbml6YXRpb24KKyAgICAvKioKKyAgICAgKiBWZXJpZmllcyB0aGF0IGlmIHRoZSBVSUQgaXMgaWRsZSB0aGUgY29udGludW91cyBldmVudHMgYXJlIGJlaW5nIHJlcG9ydGVkCisgICAgICogYnV0IHNhbml0aXplZCAtIGFsbCBldmVudHMgYXJlIHRoZSBzYW1lIGFzIHRoZSBmaXJzdCBvbmUgZGVsaXZlcmVkIGV4Y2VwdAorICAgICAqIGZvciB0aGVpciB0aW1lc3RhbXBzLiBGcm9tIHRoZSBwb2ludCBvZiB2aWV3IG9mIGFuIGlkbGUgYXBwIHRoZXNlIGV2ZW50cyBhcmUKKyAgICAgKiBiZWluZyBwcm9wZXJseSBnZW5lcmF0ZWQgYnV0IHRoZSBzZW5zb3IgcmVhZGluZyBkb2VzIG5vdCBjaGFuZ2UgLSBwcml2YWN5LgorICAgICAqLworICAgIC8vIFRPRE86IHJlbW92ZSB3aGVuIHBhcmFtZXRyaXplZCB0ZXN0cyBhcmUgc3VwcG9ydGVkIGFuZCBFdmVudFRpbWVzdGFtcFN5bmNocm9uaXphdGlvbgorICAgIHB1YmxpYyB2b2lkIHRlc3RTYW5pdGl6ZWRDb250aW51b3VzRXZlbnRzVWlkSWRsZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBBcnJheUxpc3Q8VGhyb3dhYmxlPiBlcnJvcnNGb3VuZCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBmb3IgKFNlbnNvciBzZW5zb3IgOiBtQW5kcm9pZFNlbnNvckxpc3QpIHsKKyAgICAgICAgICAgIC8vIElmIHRoZSBVSUQgaXMgYWN0aXZlIG5vIHNhbml0aXphdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkCisgICAgICAgICAgICB2ZXJpZnlMb25nQWN0aXZhdGlvbihzZW5zb3IsIDAgLyogbWF4UmVwb3J0TGF0ZW5jeVVzICovLAorICAgICAgICAgICAgICAgICAgICA1IC8qIGR1cmF0aW9uICovLCBUaW1lVW5pdC5TRUNPTkRTLCAiY29udGludW91cyBldmVudCIsCisgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIHNhbml0aXplZCAqLywgZXJyb3JzRm91bmQpOworICAgICAgICAgICAgdmVyaWZ5TG9uZ0FjdGl2YXRpb24oc2Vuc29yLCAoaW50KSBUaW1lVW5pdC5TRUNPTkRTLnRvTWljcm9zKDEwKSwKKyAgICAgICAgICAgICAgICAgICAgNSAvKiBkdXJhdGlvbiAqLywgVGltZVVuaXQuU0VDT05EUywgImNvbnRpbnVvdXMgZXZlbnQiLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBzYW5pdGl6ZWQgKi8sIGVycm9yc0ZvdW5kKTsKKworICAgICAgICAgICAgLy8gSWYgdGhlIFVJRCBpcyBpZGxlIHNhbml0aXphdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkCisgICAgICAgICAgICBtYWtlTXlQYWNrYWdlSWRsZSgpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB2ZXJpZnlMb25nQWN0aXZhdGlvbihzZW5zb3IsIDAgLyogbWF4UmVwb3J0TGF0ZW5jeVVzICovLAorICAgICAgICAgICAgICAgICAgICAgICAgNSAvKiBkdXJhdGlvbiAqLywgVGltZVVuaXQuU0VDT05EUywgImNvbnRpbnVvdXMgZXZlbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBzYW5pdGl6ZWQgKi8sIGVycm9yc0ZvdW5kKTsKKyAgICAgICAgICAgICAgICB2ZXJpZnlMb25nQWN0aXZhdGlvbihzZW5zb3IsIChpbnQpIFRpbWVVbml0LlNFQ09ORFMudG9NaWNyb3MoMTApLAorICAgICAgICAgICAgICAgICAgICAgICAgNSAvKiBkdXJhdGlvbiAqLywgVGltZVVuaXQuU0VDT05EUywgImNvbnRpbnVvdXMgZXZlbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBzYW5pdGl6ZWQgKi8sIGVycm9yc0ZvdW5kKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgbWFrZU15UGFja2FnZUFjdGl2ZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJZiB0aGUgVUlEIGlzIGFjdGl2ZSBubyBzYW5pdGl6YXRpb24gc2hvdWxkIGJlIHBlcmZvcm1lZAorICAgICAgICAgICAgdmVyaWZ5TG9uZ0FjdGl2YXRpb24oc2Vuc29yLCAwIC8qIG1heFJlcG9ydExhdGVuY3lVcyAqLywKKyAgICAgICAgICAgICAgICAgICAgNSAvKiBkdXJhdGlvbiAqLywgVGltZVVuaXQuU0VDT05EUywgImNvbnRpbnVvdXMgZXZlbnQiLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBzYW5pdGl6ZWQgKi8sIGVycm9yc0ZvdW5kKTsKKyAgICAgICAgICAgIHZlcmlmeUxvbmdBY3RpdmF0aW9uKHNlbnNvciwgKGludCkgVGltZVVuaXQuU0VDT05EUy50b01pY3JvcygxMCksCisgICAgICAgICAgICAgICAgICAgIDUgLyogZHVyYXRpb24gKi8sIFRpbWVVbml0LlNFQ09ORFMsICJjb250aW51b3VzIGV2ZW50IiwKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogc2FuaXRpemVkICovLCBlcnJvcnNGb3VuZCk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0T25FcnJvcnMoZXJyb3JzRm91bmQpOworICAgIH0KKworICAgIC8vIFRPRE86IHJlbW92ZSB3aGVuIHBhcmFtZXRyaXplZCB0ZXN0cyBhcmUgc3VwcG9ydGVkIGFuZCBFdmVudFRpbWVzdGFtcFN5bmNocm9uaXphdGlvbgogICAgIC8vICAgICAgIHZlcmlmaWNhdGlvbiBpcyBhZGRlZCB0byBkZWZhdWx0IHZlcmlmaWNhdGlvbnMKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2Vuc29yVGltZVN0YW1wcygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBBcnJheUxpc3Q8VGhyb3dhYmxlPiBlcnJvcnNGb3VuZCA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgICBmb3IgKFNlbnNvciBzZW5zb3IgOiBtQW5kcm9pZFNlbnNvckxpc3QpIHsKICAgICAgICAgICAgIC8vIHRlc3QgYm90aCBjb250aW51b3VzIGFuZCBiYXRjaGluZyBtb2RlIHNlbnNvcnMKLSAgICAgICAgICAgIHZlcmlmeUxvbmdBY3RpdmF0aW9uKHNlbnNvciwgMCAvKiBtYXhSZXBvcnRMYXRlbmN5VXMgKi8sIGVycm9yc0ZvdW5kKTsKLSAgICAgICAgICAgIHZlcmlmeUxvbmdBY3RpdmF0aW9uKHNlbnNvciwgKGludCkgVGltZVVuaXQuU0VDT05EUy50b01pY3JvcygxMCksIGVycm9yc0ZvdW5kKTsKKyAgICAgICAgICAgIHZlcmlmeUxvbmdBY3RpdmF0aW9uKHNlbnNvciwgMCAvKiBtYXhSZXBvcnRMYXRlbmN5VXMgKi8sCisgICAgICAgICAgICAgICAgICAgIDIwIC8qIGR1cmF0aW9uICovLCBUaW1lVW5pdC5TRUNPTkRTLCAidGltZXN0YW1wIiwgZmFsc2UKKyAgICAgICAgICAgICAgICAgICAgLyogc2FuaXRpemVkICovLCBlcnJvcnNGb3VuZCk7CisgICAgICAgICAgICB2ZXJpZnlMb25nQWN0aXZhdGlvbihzZW5zb3IsIChpbnQpIFRpbWVVbml0LlNFQ09ORFMudG9NaWNyb3MoMTApLAorICAgICAgICAgICAgICAgICAgICAyMCAvKiBkdXJhdGlvbiAqLywgVGltZVVuaXQuU0VDT05EUywgInRpbWVzdGFtcCIsCisgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIHNhbml0aXplZCAqLywgZXJyb3JzRm91bmQpOwogICAgICAgICB9CiAgICAgICAgIGFzc2VydE9uRXJyb3JzKGVycm9yc0ZvdW5kKTsKICAgICB9CkBAIC0zMzAsNyArMzc1LDI0IEBACiAgICAgICAgIFNlbnNvckN0c0hlbHBlci5zbGVlcCgzLCBUaW1lVW5pdC5TRUNPTkRTKTsKICAgICAgICAgQXJyYXlMaXN0PFRocm93YWJsZT4gZXJyb3JzRm91bmQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICAgZm9yIChTZW5zb3Igc2Vuc29yIDogbUFuZHJvaWRTZW5zb3JMaXN0KSB7Ci0gICAgICAgICAgICB2ZXJpZnlSZWdpc3Rlckxpc3RlbmVyQ2FsbEZsdXNoKHNlbnNvciwgbnVsbCAvKiBoYW5kbGVyICovLCBlcnJvcnNGb3VuZCk7CisgICAgICAgICAgICB2ZXJpZnlSZWdpc3Rlckxpc3RlbmVyQ2FsbEZsdXNoKHNlbnNvciwgbnVsbCAvKiBoYW5kbGVyICovLCBlcnJvcnNGb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogZmx1c2hXaGlsZUlkbGUgKi8pOworICAgICAgICB9CisgICAgICAgIGFzc2VydE9uRXJyb3JzKGVycm9yc0ZvdW5kKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWZXJpZmllcyB0aGF0IGlmIHRoZSBVSUQgaXMgaWRsZSBmbHVzaCBldmVudHMgYXJlIHJlcG9ydGVkLiBTaW5jZQorICAgICAqIHRoZXNlIGV2ZW50cyBoYXZlIG5vIHBheWxvYWQgd2l0aCBwcml2YXRlIGRhdGEgdGhleSBhcmUgd29ya2luZyBhcworICAgICAqIGZvciBhIG5vbi1pZGxlIFVJRC4KKyAgICAgKi8KKyAgICAvLyBUT0RPOiByZW1vdmUgd2hlbiBwYXJhbWV0aXplZCB0ZXN0cyBhcmUgc3VwcG9ydGVkIGFuZCBFdmVudFRpbWVzdGFtcFN5bmNocm9uaXphdGlvbgorICAgIHB1YmxpYyB2b2lkIHRlc3RCYXRjaEFuZEZsdXNoVWlkSWRsZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTZW5zb3JDdHNIZWxwZXIuc2xlZXAoMywgVGltZVVuaXQuU0VDT05EUyk7CisgICAgICAgIEFycmF5TGlzdDxUaHJvd2FibGU+IGVycm9yc0ZvdW5kID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGZvciAoU2Vuc29yIHNlbnNvciA6IG1BbmRyb2lkU2Vuc29yTGlzdCkgeworICAgICAgICAgICAgdmVyaWZ5UmVnaXN0ZXJMaXN0ZW5lckNhbGxGbHVzaChzZW5zb3IsIG51bGwgLyogaGFuZGxlciAqLywgZXJyb3JzRm91bmQsCisgICAgICAgICAgICAgICAgICAgIHRydWUgLyogZmx1c2hXaGlsZUlkbGUgKi8pOwogICAgICAgICB9CiAgICAgICAgIGFzc2VydE9uRXJyb3JzKGVycm9yc0ZvdW5kKTsKICAgICB9CkBAIC00MzIsNyArNDk0LDggQEAKICAgICAgICAgICAgICAgICAgICAgc2hvdWxkRW11bGF0ZVNlbnNvclVuZGVyTG9hZCgpLAogICAgICAgICAgICAgICAgICAgICBTZW5zb3JNYW5hZ2VyLlNFTlNPUl9ERUxBWV9GQVNURVNULAogICAgICAgICAgICAgICAgICAgICBtYXhSZXBvcnRMYXRlbmN5VXMpOwotICAgICAgICAgICAgRmx1c2hFeGVjdXRvciBleGVjdXRvciA9IG5ldyBGbHVzaEV4ZWN1dG9yKGVudmlyb25tZW50LCA1MDAgLyogZXZlbnRDb3VudCAqLyk7CisgICAgICAgICAgICBGbHVzaEV4ZWN1dG9yIGV4ZWN1dG9yID0gbmV3IEZsdXNoRXhlY3V0b3IoZW52aXJvbm1lbnQsIDUwMCAvKiBldmVudENvdW50ICovLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBmbHVzaFdoaWxlSWRsZSAqLyk7CiAgICAgICAgICAgICBwYXJhbGxlbFNlbnNvck9wZXJhdGlvbi5hZGQobmV3IFRlc3RTZW5zb3JPcGVyYXRpb24oZW52aXJvbm1lbnQsIGV4ZWN1dG9yKSk7CiAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChzZW5zb3IuZ2V0TmFtZSgpKS5hcHBlbmQoIiwgIik7CiAgICAgICAgIH0KQEAgLTQ4NSwxMSArNTQ4LDE1IEBACiAKICAgICAvKioKICAgICAgKiBWZXJpZmllcyB0aGF0IGEgY29udGludW91cyBzZW5zb3IgcHJvZHVjZXMgZXZlbnRzIHRoYXQgaGF2ZSB0aW1lc3RhbXBzIHN5bmNocm9uaXplZCB3aXRoCi0gICAgICoge0BsaW5rIFN5c3RlbUNsb2NrI2VsYXBzZWRSZWFsdGltZU5hbm9zKCl9LgorICAgICAqIHtAbGluayBTeXN0ZW1DbG9jayNlbGFwc2VkUmVhbHRpbWVOYW5vcygpfSBhbmQgdGhhdCB0aGUgZXZlbnRzIGFyZSBzYW5pdGl6ZWQvbm9uLXNhbml0aXplZC4KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgdmVyaWZ5TG9uZ0FjdGl2YXRpb24oCiAgICAgICAgICAgICBTZW5zb3Igc2Vuc29yLAogICAgICAgICAgICAgaW50IG1heFJlcG9ydExhdGVuY3lVcywKKyAgICAgICAgICAgIGxvbmcgZHVyYXRpb24sCisgICAgICAgICAgICBUaW1lVW5pdCBkdXJhdGlvblRpbWVVbml0LAorICAgICAgICAgICAgU3RyaW5nIHRlc3RUeXBlLAorICAgICAgICAgICAgYm9vbGVhbiBzYW5pdGl6ZWQsCiAgICAgICAgICAgICBBcnJheUxpc3Q8VGhyb3dhYmxlPiBlcnJvcnNGb3VuZCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKHNlbnNvci5nZXRSZXBvcnRpbmdNb2RlKCkgIT0gU2Vuc29yLlJFUE9SVElOR19NT0RFX0NPTlRJTlVPVVMpIHsKICAgICAgICAgICAgIHJldHVybjsKQEAgLTUwMiwxNCArNTY5LDIwIEBACiAgICAgICAgICAgICAgICAgICAgIHNob3VsZEVtdWxhdGVTZW5zb3JVbmRlckxvYWQoKSwKICAgICAgICAgICAgICAgICAgICAgU2Vuc29yTWFuYWdlci5TRU5TT1JfREVMQVlfRkFTVEVTVCwKICAgICAgICAgICAgICAgICAgICAgbWF4UmVwb3J0TGF0ZW5jeVVzKTsKLSAgICAgICAgICAgIFRlc3RTZW5zb3JPcGVyYXRpb24gb3BlcmF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgVGVzdFNlbnNvck9wZXJhdGlvbi5jcmVhdGVPcGVyYXRpb24oZW52aXJvbm1lbnQsIDIwLCBUaW1lVW5pdC5TRUNPTkRTKTsKLSAgICAgICAgICAgIG9wZXJhdGlvbi5hZGRWZXJpZmljYXRpb24oRXZlbnRHYXBWZXJpZmljYXRpb24uZ2V0RGVmYXVsdChlbnZpcm9ubWVudCkpOwotICAgICAgICAgICAgb3BlcmF0aW9uLmFkZFZlcmlmaWNhdGlvbihFdmVudE9yZGVyaW5nVmVyaWZpY2F0aW9uLmdldERlZmF1bHQoZW52aXJvbm1lbnQpKTsKLSAgICAgICAgICAgIG9wZXJhdGlvbi5hZGRWZXJpZmljYXRpb24oCi0gICAgICAgICAgICAgICAgICAgIEV2ZW50VGltZXN0YW1wU3luY2hyb25pemF0aW9uVmVyaWZpY2F0aW9uLmdldERlZmF1bHQoZW52aXJvbm1lbnQpKTsKLQotICAgICAgICAgICAgTG9nLmkoVEFHLCAiUnVubmluZyB0aW1lc3RhbXAgdGVzdCBvbjogIiArIHNlbnNvci5nZXROYW1lKCkpOworICAgICAgICAgICAgVGVzdFNlbnNvck9wZXJhdGlvbiBvcGVyYXRpb24gPSBUZXN0U2Vuc29yT3BlcmF0aW9uLmNyZWF0ZU9wZXJhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQsIGR1cmF0aW9uLCBkdXJhdGlvblRpbWVVbml0KTsKKyAgICAgICAgICAgIGlmIChzYW5pdGl6ZWQpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBsb25nIHZlcmlmaWNhdGlvbkRlbGF5TmFubyA9IFRpbWVVbml0Lk5BTk9TRUNPTkRTLmNvbnZlcnQoCisgICAgICAgICAgICAgICAgICAgICAgICBtYXhSZXBvcnRMYXRlbmN5VXMsIFRpbWVVbml0Lk1JQ1JPU0VDT05EUykgKiAyOworICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5hZGRWZXJpZmljYXRpb24oQ29udGludW91c0V2ZW50U2FuaXRpemVkVmVyaWZpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RGVmYXVsdChlbnZpcm9ubWVudCwgdmVyaWZpY2F0aW9uRGVsYXlOYW5vKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5hZGRWZXJpZmljYXRpb24oRXZlbnRHYXBWZXJpZmljYXRpb24uZ2V0RGVmYXVsdChlbnZpcm9ubWVudCkpOworICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5hZGRWZXJpZmljYXRpb24oRXZlbnRPcmRlcmluZ1ZlcmlmaWNhdGlvbi5nZXREZWZhdWx0KGVudmlyb25tZW50KSk7CisgICAgICAgICAgICAgICAgb3BlcmF0aW9uLmFkZFZlcmlmaWNhdGlvbihFdmVudFRpbWVzdGFtcFN5bmNocm9uaXphdGlvblZlcmlmaWNhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgLmdldERlZmF1bHQoZW52aXJvbm1lbnQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExvZy5pKFRBRywgIlJ1bm5pbmcgIiArIHRlc3RUeXBlICsgIiB0ZXN0IG9uOiAiICsgc2Vuc29yLmdldE5hbWUoKSk7CiAgICAgICAgICAgICBvcGVyYXRpb24uZXhlY3V0ZShnZXRDdXJyZW50VGVzdE5vZGUoKSk7CiAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIC8vIHByb3BhZ2F0ZSBzbyB0aGUgdGVzdCBjYW4gc3RvcApAQCAtNTI4LDcgKzYwMSw4IEBACiAgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeVJlZ2lzdGVyTGlzdGVuZXJDYWxsRmx1c2goCiAgICAgICAgICAgICBTZW5zb3Igc2Vuc29yLAogICAgICAgICAgICAgSGFuZGxlciBoYW5kbGVyLAotICAgICAgICAgICAgQXJyYXlMaXN0PFRocm93YWJsZT4gZXJyb3JzRm91bmQpCisgICAgICAgICAgICBBcnJheUxpc3Q8VGhyb3dhYmxlPiBlcnJvcnNGb3VuZCwKKyAgICAgICAgICAgIGJvb2xlYW4gZmx1c2hXaGlsZUlkbGUpCiAgICAgICAgICAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewogICAgICAgICBpZiAoc2Vuc29yLmdldFJlcG9ydGluZ01vZGUoKSA9PSBTZW5zb3IuUkVQT1JUSU5HX01PREVfT05FX1NIT1QpIHsKICAgICAgICAgICAgIHJldHVybjsKQEAgLTU0MSw3ICs2MTUsOCBAQAogICAgICAgICAgICAgICAgICAgICBzaG91bGRFbXVsYXRlU2Vuc29yVW5kZXJMb2FkKCksCiAgICAgICAgICAgICAgICAgICAgIFNlbnNvck1hbmFnZXIuU0VOU09SX0RFTEFZX0ZBU1RFU1QsCiAgICAgICAgICAgICAgICAgICAgIChpbnQpIFRpbWVVbml0LlNFQ09ORFMudG9NaWNyb3MoMTApKTsKLSAgICAgICAgICAgIEZsdXNoRXhlY3V0b3IgZXhlY3V0b3IgPSBuZXcgRmx1c2hFeGVjdXRvcihlbnZpcm9ubWVudCwgNTAwIC8qIGV2ZW50Q291bnQgKi8pOworICAgICAgICAgICAgRmx1c2hFeGVjdXRvciBleGVjdXRvciA9IG5ldyBGbHVzaEV4ZWN1dG9yKGVudmlyb25tZW50LCA1MDAgLyogZXZlbnRDb3VudCAqLywKKyAgICAgICAgICAgICAgICAgICAgZmx1c2hXaGlsZUlkbGUpOwogICAgICAgICAgICAgVGVzdFNlbnNvck9wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgVGVzdFNlbnNvck9wZXJhdGlvbihlbnZpcm9ubWVudCwgZXhlY3V0b3IsIGhhbmRsZXIpOwogCiAgICAgICAgICAgICBMb2cuaShUQUcsICJSdW5uaW5nIGZsdXNoIHRlc3Qgb246ICIgKyBzZW5zb3IuZ2V0TmFtZSgpKTsKQEAgLTU2NSw2ICs2NDAsMTggQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgc3RhdGljIHZvaWQgbWFrZU15UGFja2FnZUFjdGl2ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBjb21tYW5kID0gImNtZCBzZW5zb3JzZXJ2aWNlIHJlc2V0LXVpZC1zdGF0ZSAiCisgICAgICAgICAgICAgICAgKyAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0VGFyZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VOYW1lKCk7CisgICAgICAgIFN5c3RlbVV0aWwucnVuU2hlbGxDb21tYW5kKEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLCBjb21tYW5kKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbWFrZU15UGFja2FnZUlkbGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgY29tbWFuZCA9ICJjbWQgc2Vuc29yc2VydmljZSBzZXQtdWlkLXN0YXRlICIKKyAgICAgICAgICAgICAgICArIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldFRhcmdldENvbnRleHQoKS5nZXRQYWNrYWdlTmFtZSgpICsgIiBpZGxlIjsKKyAgICAgICAgU3lzdGVtVXRpbC5ydW5TaGVsbENvbW1hbmQoSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCksIGNvbW1hbmQpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIEEgZGVsZWdhdGUgdGhhdCBkcml2ZXMgdGhlIGV4ZWN1dGlvbiBvZiBCYXRjaC9GbHVzaCB0ZXN0cy4KICAgICAgKiBJdCBwZXJmb3JtcyBzZXZlcmFsIG9wZXJhdGlvbnMgaW4gb3JkZXI6CkBAIC01NzgsMTAgKzY2NSwxMyBAQAogICAgIHByaXZhdGUgY2xhc3MgRmx1c2hFeGVjdXRvciBpbXBsZW1lbnRzIFRlc3RTZW5zb3JPcGVyYXRpb24uRXhlY3V0b3IgewogICAgICAgICBwcml2YXRlIGZpbmFsIFRlc3RTZW5zb3JFbnZpcm9ubWVudCBtRW52aXJvbm1lbnQ7CiAgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1FdmVudENvdW50OworICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbUZsdXNoV2hpbGVJZGxlOwogCi0gICAgICAgIHB1YmxpYyBGbHVzaEV4ZWN1dG9yKFRlc3RTZW5zb3JFbnZpcm9ubWVudCBlbnZpcm9ubWVudCwgaW50IGV2ZW50Q291bnQpIHsKKyAgICAgICAgcHVibGljIEZsdXNoRXhlY3V0b3IoVGVzdFNlbnNvckVudmlyb25tZW50IGVudmlyb25tZW50LCBpbnQgZXZlbnRDb3VudCwKKyAgICAgICAgICAgICAgICBib29sZWFuIGZsdXNoV2hpbGVJZGxlKSB7CiAgICAgICAgICAgICBtRW52aXJvbm1lbnQgPSBlbnZpcm9ubWVudDsKICAgICAgICAgICAgIG1FdmVudENvdW50ID0gZXZlbnRDb3VudDsKKyAgICAgICAgICAgIG1GbHVzaFdoaWxlSWRsZSA9IGZsdXNoV2hpbGVJZGxlOwogICAgICAgICB9CiAKICAgICAgICAgLyoqCkBAIC01OTQsMTcgKzY4NCwyMyBAQAogICAgICAgICAgKi8KICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoVGVzdFNlbnNvck1hbmFnZXIgc2Vuc29yTWFuYWdlciwgVGVzdFNlbnNvckV2ZW50TGlzdGVuZXIgbGlzdGVuZXIpCi0gICAgICAgICAgICAgICAgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgICAgIGludCBzZW5zb3JSZXBvcnRpbmdNb2RlID0gbUVudmlyb25tZW50LmdldFNlbnNvcigpLmdldFJlcG9ydGluZ01vZGUoKTsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgQ291bnREb3duTGF0Y2ggZXZlbnRMYXRjaCA9IHNlbnNvck1hbmFnZXIucmVnaXN0ZXJMaXN0ZW5lcihsaXN0ZW5lciwgbUV2ZW50Q291bnQpOwogICAgICAgICAgICAgICAgIGlmIChzZW5zb3JSZXBvcnRpbmdNb2RlID09IFNlbnNvci5SRVBPUlRJTkdfTU9ERV9DT05USU5VT1VTKSB7CiAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLndhaXRGb3JFdmVudHMoZXZlbnRMYXRjaCwgbUV2ZW50Q291bnQsIHRydWUpOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobUZsdXNoV2hpbGVJZGxlKSB7CisgICAgICAgICAgICAgICAgICAgIG1ha2VNeVBhY2thZ2VJZGxlKCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIENvdW50RG93bkxhdGNoIGZsdXNoTGF0Y2ggPSBzZW5zb3JNYW5hZ2VyLnJlcXVlc3RGbHVzaCgpOwogICAgICAgICAgICAgICAgIGxpc3RlbmVyLndhaXRGb3JGbHVzaENvbXBsZXRlKGZsdXNoTGF0Y2gsIHRydWUpOwogICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICBzZW5zb3JNYW5hZ2VyLnVucmVnaXN0ZXJMaXN0ZW5lcigpOworICAgICAgICAgICAgICAgIGlmIChtRmx1c2hXaGlsZUlkbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbWFrZU15UGFja2FnZUFjdGl2ZSgpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3NlbnNvci9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jdHMvU2luZ2xlU2Vuc29yVGVzdHMuamF2YSBiL3Rlc3RzL3NlbnNvci9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jdHMvU2luZ2xlU2Vuc29yVGVzdHMuamF2YQppbmRleCAxN2Y3M2M2Li5hNjI2OTU3IDEwMDY0NAotLS0gYS90ZXN0cy9zZW5zb3Ivc3JjL2FuZHJvaWQvaGFyZHdhcmUvY3RzL1NpbmdsZVNlbnNvclRlc3RzLmphdmEKKysrIGIvdGVzdHMvc2Vuc29yL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2N0cy9TaW5nbGVTZW5zb3JUZXN0cy5qYXZhCkBAIC0yNSw4ICsyNSw2IEBACiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jdHMuaGVscGVycy5zZW5zb3JvcGVyYXRpb25zLlRlc3RTZW5zb3JPcGVyYXRpb247CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DZGRUZXN0OwotCiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwpAQCAtMTUyLDcgKzE1MCw2IEBACiAgICAgICAgIHJ1blNlbnNvclRlc3QoU2Vuc29yLlRZUEVfQUNDRUxFUk9NRVRFUiwgUkFURV8xMDBIWik7CiAgICAgfQogCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuMy4xL0MtMS0xLEMtMS0yLEMtMS0zLEMtMS02LDcuMy9DLTEtNyIpCiAgICAgcHVibGljIHZvaWQgdGVzdEFjY2VsZXJvbWV0ZXJfNTBoeigpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBydW5TZW5zb3JUZXN0KFNlbnNvci5UWVBFX0FDQ0VMRVJPTUVURVIsIFJBVEVfNTBIWik7CiAgICAgfQpAQCAtMjM3LDE3ICsyMzQsMTQgQEAKICAgICAgICAgcnVuU2Vuc29yVGVzdChTZW5zb3IuVFlQRV9NQUdORVRJQ19GSUVMRCwgUkFURV8xNUhaKTsKICAgICB9CiAKLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iNy4zLjIvQy0xLTEsQy0xLTIsQy0xLTMsQy0xLTksNy4zL0MtMS03IikKICAgICBwdWJsaWMgdm9pZCB0ZXN0TWFnbmV0aWNGaWVsZF8xMGh6KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIHJ1blNlbnNvclRlc3QoU2Vuc29yLlRZUEVfTUFHTkVUSUNfRklFTEQsIFJBVEVfMTBIWik7CiAgICAgfQogCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuMy4yL0MtMS0xLEMtMS0zLDcuMy9DLTEtMiIpCiAgICAgcHVibGljIHZvaWQgdGVzdE1hZ25ldGljRmllbGRfNWh6KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIHJ1blNlbnNvclRlc3QoU2Vuc29yLlRZUEVfTUFHTkVUSUNfRklFTEQsIFJBVEVfNUhaKTsKICAgICB9CiAKLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iNy4zLjIvQy0xLTEsQy0xLTMsNy4zL0MtMS0yLDcuMy9DLTEtNyIpCiAgICAgcHVibGljIHZvaWQgdGVzdE1hZ25ldGljRmllbGRfMWh6KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIHJ1blNlbnNvclRlc3QoU2Vuc29yLlRZUEVfTUFHTkVUSUNfRklFTEQsIFJBVEVfMUhaKTsKICAgICB9CkBAIC0zMDgsNyArMzAyLDYgQEAKICAgICAgICAgcnVuU2Vuc29yVGVzdChTZW5zb3IuVFlQRV9HWVJPU0NPUEUsIFJBVEVfMTAwSFopOwogICAgIH0KIAotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjMuNC9DLTEtMSxDLTEtNyw3LjMvQy0xLTciKQogICAgIHB1YmxpYyB2b2lkIHRlc3RHeXJvc2NvcGVfNTBoeigpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBydW5TZW5zb3JUZXN0KFNlbnNvci5UWVBFX0dZUk9TQ09QRSwgUkFURV81MEhaKTsKICAgICB9CkBAIC0zMjksNyArMzIyLDYgQEAKICAgICAgICAgcnVuU2Vuc29yVGVzdChTZW5zb3IuVFlQRV9HWVJPU0NPUEUsIFJBVEVfNUhaKTsKICAgICB9CiAKLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iNy4zLjQvQy0xLTIsQy0xLTcsNy4zL0MtMS03IikKICAgICBwdWJsaWMgdm9pZCB0ZXN0R3lyb3Njb3BlXzFoeigpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBydW5TZW5zb3JUZXN0KFNlbnNvci5UWVBFX0dZUk9TQ09QRSwgUkFURV8xSFopOwogICAgIH0KQEAgLTM2Miw3ICszNTQsNiBAQAogICAgICAgICBydW5TZW5zb3JUZXN0KFNlbnNvci5UWVBFX1BSRVNTVVJFLCBSQVRFXzEwSFopOwogICAgIH0KIAotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjMuNS9DLTEtMSxDLTEtMiw3LjMvQy0xLTcsQy0xLTIiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RQcmVzc3VyZV81aHooKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgcnVuU2Vuc29yVGVzdChTZW5zb3IuVFlQRV9QUkVTU1VSRSwgUkFURV81SFopOwogICAgIH0KQEAgLTM3MSw3ICszNjIsNiBAQAogICAgICAgICBydW5TZW5zb3JUZXN0KFNlbnNvci5UWVBFX1BSRVNTVVJFLCBSQVRFXzFIWik7CiAgICAgfQogCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuMy4xL0MtMy0xIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0R3Jhdml0eV9mYXN0ZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIHJ1blNlbnNvclRlc3QoU2Vuc29yLlRZUEVfR1JBVklUWSwgU2Vuc29yTWFuYWdlci5TRU5TT1JfREVMQVlfRkFTVEVTVCk7CiAgICAgfQpAQCAtMzg4LDMyICszNzgsMjYgQEAKICAgICAgICAgcnVuU2Vuc29yVGVzdChTZW5zb3IuVFlQRV9HUkFWSVRZLCBSQVRFXzUwSFopOwogICAgIH0KIAotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjMuMS9DLTMtMSIpCiAgICAgcHVibGljIHZvaWQgdGVzdEdyYXZpdHlfMjVoeigpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBydW5TZW5zb3JUZXN0KFNlbnNvci5UWVBFX0dSQVZJVFksIFJBVEVfMjVIWik7CiAgICAgfQogCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuMy4xL0MtMy0xIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0R3Jhdml0eV8xNWh6KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIHJ1blNlbnNvclRlc3QoU2Vuc29yLlRZUEVfR1JBVklUWSwgUkFURV8xNUhaKTsKICAgICB9CiAKLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iNy4zLjEvQy0zLTEiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RHcmF2aXR5XzEwaHooKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgcnVuU2Vuc29yVGVzdChTZW5zb3IuVFlQRV9HUkFWSVRZLCBSQVRFXzEwSFopOwogICAgIH0KIAotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjMuMS9DLTMtMSIpCiAgICAgcHVibGljIHZvaWQgdGVzdEdyYXZpdHlfNWh6KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIHJ1blNlbnNvclRlc3QoU2Vuc29yLlRZUEVfR1JBVklUWSwgUkFURV81SFopOwogICAgIH0KIAotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjMuMS9DLTMtMSIpCiAgICAgcHVibGljIHZvaWQgdGVzdEdyYXZpdHlfMWh6KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIHJ1blNlbnNvclRlc3QoU2Vuc29yLlRZUEVfR1JBVklUWSwgUkFURV8xSFopOwogICAgIH0KIAotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjMuMS9DLTQtMSw3LjMuMi9DLTItMSIpCiAgICAgcHVibGljIHZvaWQgdGVzdFJvdGF0aW9uVmVjdG9yX2Zhc3Rlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgcnVuU2Vuc29yVGVzdChTZW5zb3IuVFlQRV9ST1RBVElPTl9WRUNUT1IsIFNlbnNvck1hbmFnZXIuU0VOU09SX0RFTEFZX0ZBU1RFU1QpOwogICAgIH0KQEAgLTQyNiw3ICs0MTAsNiBAQAogICAgICAgICBydW5TZW5zb3JUZXN0KFNlbnNvci5UWVBFX1JPVEFUSU9OX1ZFQ1RPUiwgUkFURV8xMDBIWik7CiAgICAgfQogCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuMy4xL0MtNC0xIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0Um90YXRpb25WZWN0b3JfNTBoeigpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBydW5TZW5zb3JUZXN0KFNlbnNvci5UWVBFX1JPVEFUSU9OX1ZFQ1RPUiwgUkFURV81MEhaKTsKICAgICB9CkBAIC00MzksMTcgKzQyMiwxNCBAQAogICAgICAgICBydW5TZW5zb3JUZXN0KFNlbnNvci5UWVBFX1JPVEFUSU9OX1ZFQ1RPUiwgUkFURV8xNUhaKTsKICAgICB9CiAKLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iNy4zLjEvQy00LTEsNy4zLjIvQy0yLTEiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RSb3RhdGlvblZlY3Rvcl8xMGh6KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIHJ1blNlbnNvclRlc3QoU2Vuc29yLlRZUEVfUk9UQVRJT05fVkVDVE9SLCBSQVRFXzEwSFopOwogICAgIH0KIAotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjMuMS9DLTQtMSw3LjMuMi9DLTItMSIpCiAgICAgcHVibGljIHZvaWQgdGVzdFJvdGF0aW9uVmVjdG9yXzVoeigpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBydW5TZW5zb3JUZXN0KFNlbnNvci5UWVBFX1JPVEFUSU9OX1ZFQ1RPUiwgUkFURV81SFopOwogICAgIH0KIAotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjMuMS9DLTQtMSw3LjMuMi9DLTItMSIpCiAgICAgcHVibGljIHZvaWQgdGVzdFJvdGF0aW9uVmVjdG9yXzFoeigpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBydW5TZW5zb3JUZXN0KFNlbnNvci5UWVBFX1JPVEFUSU9OX1ZFQ1RPUiwgUkFURV8xSFopOwogICAgIH0KQEAgLTUxOCwxNyArNDk4LDE0IEBACiAgICAgICAgIHJ1blNlbnNvclRlc3QoU2Vuc29yLlRZUEVfR0FNRV9ST1RBVElPTl9WRUNUT1IsIFJBVEVfMTBIWik7CiAgICAgfQogCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuMy9DLTItMSIpCiAgICAgcHVibGljIHZvaWQgdGVzdEdhbWVSb3RhdGlvblZlY3Rvcl81aHooKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgcnVuU2Vuc29yVGVzdChTZW5zb3IuVFlQRV9HQU1FX1JPVEFUSU9OX1ZFQ1RPUiwgUkFURV81SFopOwogICAgIH0KIAotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjMvQy0yLTEiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RHYW1lUm90YXRpb25WZWN0b3JfMWh6KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIHJ1blNlbnNvclRlc3QoU2Vuc29yLlRZUEVfR0FNRV9ST1RBVElPTl9WRUNUT1IsIFJBVEVfMUhaKTsKICAgICB9CiAKLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iNy4zL0MtMi0xIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0R3lyb3Njb3BlVW5jYWxpYnJhdGVkX2Zhc3Rlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgcnVuU2Vuc29yVGVzdChTZW5zb3IuVFlQRV9HWVJPU0NPUEVfVU5DQUxJQlJBVEVELCBTZW5zb3JNYW5hZ2VyLlNFTlNPUl9ERUxBWV9GQVNURVNUKTsKICAgICB9CkBAIC01NDEsNyArNTE4LDYgQEAKICAgICAgICAgcnVuU2Vuc29yVGVzdChTZW5zb3IuVFlQRV9HWVJPU0NPUEVfVU5DQUxJQlJBVEVELCBSQVRFXzEwMEhaKTsKICAgICB9CiAKLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iNy4zL0MtMi0xIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0R3lyb3Njb3BlVW5jYWxpYnJhdGVkXzUwaHooKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgcnVuU2Vuc29yVGVzdChTZW5zb3IuVFlQRV9HWVJPU0NPUEVfVU5DQUxJQlJBVEVELCBSQVRFXzUwSFopOwogICAgIH0KQEAgLTU1NCwxNyArNTMwLDE0IEBACiAgICAgICAgIHJ1blNlbnNvclRlc3QoU2Vuc29yLlRZUEVfR1lST1NDT1BFX1VOQ0FMSUJSQVRFRCwgUkFURV8xNUhaKTsKICAgICB9CiAKLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iNy4zL0MtMi0xIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0R3lyb3Njb3BlVW5jYWxpYnJhdGVkXzEwaHooKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgcnVuU2Vuc29yVGVzdChTZW5zb3IuVFlQRV9HWVJPU0NPUEVfVU5DQUxJQlJBVEVELCBSQVRFXzEwSFopOwogICAgIH0KIAotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjMvQy0yLTEiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RHeXJvc2NvcGVVbmNhbGlicmF0ZWRfNWh6KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIHJ1blNlbnNvclRlc3QoU2Vuc29yLlRZUEVfR1lST1NDT1BFX1VOQ0FMSUJSQVRFRCwgUkFURV81SFopOwogICAgIH0KIAotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjMvQy0yLTEiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RHeXJvc2NvcGVVbmNhbGlicmF0ZWRfMWh6KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIHJ1blNlbnNvclRlc3QoU2Vuc29yLlRZUEVfR1lST1NDT1BFX1VOQ0FMSUJSQVRFRCwgUkFURV8xSFopOwogICAgIH0KQEAgLTU4MSwzMiArNTU0LDI2IEBACiAgICAgICAgIHJ1blNlbnNvclRlc3QoU2Vuc29yLlRZUEVfTElORUFSX0FDQ0VMRVJBVElPTiwgUkFURV8xMDBIWik7CiAgICAgfQogCi0gICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjMuMS9DLTMtMSIpCiAgICAgcHVibGljIHZvaWQgdGVzdExpbmVhckFjY2VsZXJhdGlvbl81MGh6KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIHJ1blNlbnNvclRlc3QoU2Vuc29yLlRZUEVfTElORUFSX0FDQ0VMRVJBVElPTiwgUkFURV81MEhaKTsKICAgICB9CiAKLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iNy4zLjEvQy0zLTEiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RMaW5lYXJBY2NlbGVyYXRpb25fMjVoeigpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBydW5TZW5zb3JUZXN0KFNlbnNvci5UWVBFX0xJTkVBUl9BQ0NFTEVSQVRJT04sIFJBVEVfMjVIWik7CiAgICAgfQogCi0gICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjMuMS9DLTMtMSIpCiAgICAgcHVibGljIHZvaWQgdGVzdExpbmVhckFjY2VsZXJhdGlvbl8xNWh6KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIHJ1blNlbnNvclRlc3QoU2Vuc29yLlRZUEVfTElORUFSX0FDQ0VMRVJBVElPTiwgUkFURV8xNUhaKTsKICAgICB9CiAKLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iNy4zLjEvQy0zLTEiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RMaW5lYXJBY2NlbGVyYXRpb25fMTBoeigpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBydW5TZW5zb3JUZXN0KFNlbnNvci5UWVBFX0xJTkVBUl9BQ0NFTEVSQVRJT04sIFJBVEVfMTBIWik7CiAgICAgfQogCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuMy4xL0MtMy0xIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0TGluZWFyQWNjZWxlcmF0aW9uXzVoeigpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBydW5TZW5zb3JUZXN0KFNlbnNvci5UWVBFX0xJTkVBUl9BQ0NFTEVSQVRJT04sIFJBVEVfNUhaKTsKICAgICB9CiAKLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iNy4zLjEvQy0zLTEiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RMaW5lYXJBY2NlbGVyYXRpb25fMWh6KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIHJ1blNlbnNvclRlc3QoU2Vuc29yLlRZUEVfTElORUFSX0FDQ0VMRVJBVElPTiwgUkFURV8xSFopOwogICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3NlbnNvci9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jdHMvaGVscGVycy9TZW5zb3JDdHNIZWxwZXIuamF2YSBiL3Rlc3RzL3NlbnNvci9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jdHMvaGVscGVycy9TZW5zb3JDdHNIZWxwZXIuamF2YQppbmRleCBiYmUyMDA2Li4xZWRmNjE3IDEwMDY0NAotLS0gYS90ZXN0cy9zZW5zb3Ivc3JjL2FuZHJvaWQvaGFyZHdhcmUvY3RzL2hlbHBlcnMvU2Vuc29yQ3RzSGVscGVyLmphdmEKKysrIGIvdGVzdHMvc2Vuc29yL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2N0cy9oZWxwZXJzL1NlbnNvckN0c0hlbHBlci5qYXZhCkBAIC0xNiw2ICsxNiw3IEBACiBwYWNrYWdlIGFuZHJvaWQuaGFyZHdhcmUuY3RzLmhlbHBlcnM7CiAKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC0yNTUsNyArMjU2LDcgQEAKICAgICAgKiBAcmV0dXJuIEEge0BsaW5rIEZpbGV9IHJlcHJlc2VudGluZyBhIHJvb3QgZGlyZWN0b3J5IHRvIHN0b3JlIHNlbnNvciB0ZXN0cyBkYXRhLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgRmlsZSBnZXRTZW5zb3JUZXN0RGF0YURpcmVjdG9yeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgZGF0YURpcmVjdG9yeSA9IG5ldyBGaWxlKFN5c3RlbS5nZXRlbnYoIkVYVEVSTkFMX1NUT1JBR0UiKSwgInNlbnNvclRlc3RzLyIpOworICAgICAgICBGaWxlIGRhdGFEaXJlY3RvcnkgPSBuZXcgRmlsZShFbnZpcm9ubWVudC5nZXRFeHRlcm5hbFN0b3JhZ2VEaXJlY3RvcnkoKSwgInNlbnNvclRlc3RzLyIpOwogICAgICAgICByZXR1cm4gY3JlYXRlRGlyZWN0b3J5U3RydWN0dXJlKGRhdGFEaXJlY3RvcnkpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvdGVzdHMvc2Vuc29yL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2N0cy9oZWxwZXJzL1NlbnNvclN0YXRzLmphdmEgYi90ZXN0cy9zZW5zb3Ivc3JjL2FuZHJvaWQvaGFyZHdhcmUvY3RzL2hlbHBlcnMvU2Vuc29yU3RhdHMuamF2YQppbmRleCAzODkyMzY2Li5iMDhiNTlmIDEwMDY0NAotLS0gYS90ZXN0cy9zZW5zb3Ivc3JjL2FuZHJvaWQvaGFyZHdhcmUvY3RzL2hlbHBlcnMvU2Vuc29yU3RhdHMuamF2YQorKysgYi90ZXN0cy9zZW5zb3Ivc3JjL2FuZHJvaWQvaGFyZHdhcmUvY3RzL2hlbHBlcnMvU2Vuc29yU3RhdHMuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogCiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3I7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jdHMuaGVscGVycy5zZW5zb3JvcGVyYXRpb25zLlNlbnNvck9wZXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwpAQCAtMzgsNiArMzksNyBAQAogICogdG9nZXRoZXIgc28gdGhhdCB0aGV5IGZvcm0gYSB0cmVlLgogICovCiBwdWJsaWMgY2xhc3MgU2Vuc29yU3RhdHMgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU2Vuc29yU3RhdHMiOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFTElNSVRFUiA9ICJfXyI7CiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUiA9ICJlcnJvciI7CkBAIC01Niw2ICs1OCw3IEBACiAgICAgICAgICAgICAiZXZlbnRfdGltZV93cm9uZ19jbG9ja3NvdXJjZV9wb3NpdGlvbnMiOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVWRU5UX0NPVU5UX0tFWSA9ICJldmVudF9jb3VudCI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZFTlRfQ09VTlRfRVhQRUNURURfS0VZID0gImV2ZW50X2NvdW50X2V4cGVjdGVkIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVkVOVF9OT1RfU0FOSVRJWkVEX0tFWSA9ICJldmVudF9ub3Rfc2FuaXRpemVkIjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVkVOVF9MT0dfRklMRU5BTUUgPSAiZXZlbnRfbG9nX2ZpbGVuYW1lIjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXUk9OR19TRU5TT1JfS0VZID0gIndyb25nX3NlbnNvcl9vYnNlcnZlZCI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlJFUVVFTkNZX0tFWSA9ICJmcmVxdWVuY3kiOwpAQCAtMTQzLDE5ICsxNDYsMzUgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qIENoZWNrcyBpZiBleHRlcm5hbCBzdG9yYWdlIGlzIGF2YWlsYWJsZSBmb3IgcmVhZCBhbmQgd3JpdGUgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNFeHRlcm5hbFN0b3JhZ2VXcml0YWJsZSgpIHsKKyAgICAgICAgU3RyaW5nIHN0YXRlID0gRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlU3RhdGUoKTsKKyAgICAgICAgcmV0dXJuIEVudmlyb25tZW50Lk1FRElBX01PVU5URUQuZXF1YWxzKHN0YXRlKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBVdGlsaXR5IG1ldGhvZCB0byBsb2cgdGhlIHN0YXRzIHRvIGEgZmlsZS4gV2lsbCBvdmVyd3JpdGUgdGhlIGZpbGUgaWYgaXQgYWxyZWFkeSBleGlzdHMuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgbG9nVG9GaWxlKFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZSBzdGF0c0RpcmVjdG9yeSA9IFNlbnNvckN0c0hlbHBlci5nZXRTZW5zb3JUZXN0RGF0YURpcmVjdG9yeSgic3RhdHMvIik7Ci0gICAgICAgIEZpbGUgbG9nRmlsZSA9IG5ldyBGaWxlKHN0YXRzRGlyZWN0b3J5LCBmaWxlTmFtZSk7Ci0gICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gZmxhdHRlbmVkID0gZmxhdHRlbigpOwotICAgICAgICBGaWxlV3JpdGVyIGZpbGVXcml0ZXIgPSBuZXcgRmlsZVdyaXRlcihsb2dGaWxlLCBmYWxzZSAvKiBhcHBlbmQgKi8pOwotICAgICAgICB0cnkgKEJ1ZmZlcmVkV3JpdGVyIHdyaXRlciA9IG5ldyBCdWZmZXJlZFdyaXRlcihmaWxlV3JpdGVyKSkgewotICAgICAgICAgICAgZm9yIChTdHJpbmcga2V5IDogZ2V0U29ydGVkS2V5cyhmbGF0dGVuZWQpKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gZmxhdHRlbmVkLmdldChrZXkpOwotICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZShTdHJpbmcuZm9ybWF0KCIlczogJXNcbiIsIGtleSwgZ2V0VmFsdWVTdHJpbmcodmFsdWUpKSk7CisgICAgcHVibGljIHZvaWQgbG9nVG9GaWxlKFN0cmluZyBmaWxlTmFtZSkgeworICAgICAgICBpZiAoIWlzRXh0ZXJuYWxTdG9yYWdlV3JpdGFibGUoKSkgeworICAgICAgICAgICAgTG9nLncoVEFHLAorICAgICAgICAgICAgICAgICJFeHRlcm5hbCBzdG9yYWdlIHVuYXZhaWxhYmxlLCBza2lwcGluZyBsb2cgdG8gZmlsZTogIiArIGZpbGVOYW1lKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBGaWxlIHN0YXRzRGlyZWN0b3J5ID0gU2Vuc29yQ3RzSGVscGVyLmdldFNlbnNvclRlc3REYXRhRGlyZWN0b3J5KCJzdGF0cy8iKTsKKyAgICAgICAgICAgIEZpbGUgbG9nRmlsZSA9IG5ldyBGaWxlKHN0YXRzRGlyZWN0b3J5LCBmaWxlTmFtZSk7CisgICAgICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IGZsYXR0ZW5lZCA9IGZsYXR0ZW4oKTsKKyAgICAgICAgICAgIEZpbGVXcml0ZXIgZmlsZVdyaXRlciA9IG5ldyBGaWxlV3JpdGVyKGxvZ0ZpbGUsIGZhbHNlIC8qIGFwcGVuZCAqLyk7CisgICAgICAgICAgICB0cnkgKEJ1ZmZlcmVkV3JpdGVyIHdyaXRlciA9IG5ldyBCdWZmZXJlZFdyaXRlcihmaWxlV3JpdGVyKSkgeworICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGtleSA6IGdldFNvcnRlZEtleXMoZmxhdHRlbmVkKSkgeworICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBmbGF0dGVuZWQuZ2V0KGtleSk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZShTdHJpbmcuZm9ybWF0KCIlczogJXNcbiIsIGtleSwgZ2V0VmFsdWVTdHJpbmcodmFsdWUpKSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIlVuYWJsZSB0byB3cml0ZSB0byBmaWxlOiAiICsgZmlsZU5hbWUsIGUpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS90ZXN0cy9zZW5zb3Ivc3JjL2FuZHJvaWQvaGFyZHdhcmUvY3RzL2hlbHBlcnMvVGVzdFNlbnNvckVudmlyb25tZW50LmphdmEgYi90ZXN0cy9zZW5zb3Ivc3JjL2FuZHJvaWQvaGFyZHdhcmUvY3RzL2hlbHBlcnMvVGVzdFNlbnNvckVudmlyb25tZW50LmphdmEKaW5kZXggNmVmNzkzOC4uMjYxZDMyNyAxMDA2NDQKLS0tIGEvdGVzdHMvc2Vuc29yL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2N0cy9oZWxwZXJzL1Rlc3RTZW5zb3JFbnZpcm9ubWVudC5qYXZhCisrKyBiL3Rlc3RzL3NlbnNvci9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jdHMvaGVscGVycy9UZXN0U2Vuc29yRW52aXJvbm1lbnQuamF2YQpAQCAtMjI4LDcgKzIyOCw3IEBACiAgICAgICAgICAgICBib29sZWFuIGlzRGV2aWNlU3VzcGVuZFRlc3QpIHsKICAgICAgICAgdGhpcyhjb250ZXh0LCBzZW5zb3IsIHNlbnNvck1pZ2h0SGF2ZU1vcmVMaXN0ZW5lcnMsCiAgICAgICAgICAgICAgICAgc2FtcGxpbmdQZXJpb2RVcywgbWF4UmVwb3J0TGF0ZW5jeVVzLAotICAgICAgICAgICAgICAgIGZhbHNlIC8qIGlzRGV2aWNlU3VzcGVuZFRlc3QgKi8sCisgICAgICAgICAgICAgICAgaXNEZXZpY2VTdXNwZW5kVGVzdCwKICAgICAgICAgICAgICAgICBmYWxzZSAvKiBpc0ludGVncmF0aW9uVGVzdCAqLyk7CiAgICAgfQogCmRpZmYgLS1naXQgYS90ZXN0cy9zZW5zb3Ivc3JjL2FuZHJvaWQvaGFyZHdhcmUvY3RzL2hlbHBlcnMvc2Vuc29yb3BlcmF0aW9ucy9BbGFybU9wZXJhdGlvbi5qYXZhIGIvdGVzdHMvc2Vuc29yL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2N0cy9oZWxwZXJzL3NlbnNvcm9wZXJhdGlvbnMvQWxhcm1PcGVyYXRpb24uamF2YQppbmRleCA0MzZhN2NmLi43YzliZTlmIDEwMDY0NAotLS0gYS90ZXN0cy9zZW5zb3Ivc3JjL2FuZHJvaWQvaGFyZHdhcmUvY3RzL2hlbHBlcnMvc2Vuc29yb3BlcmF0aW9ucy9BbGFybU9wZXJhdGlvbi5qYXZhCisrKyBiL3Rlc3RzL3NlbnNvci9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jdHMvaGVscGVycy9zZW5zb3JvcGVyYXRpb25zL0FsYXJtT3BlcmF0aW9uLmphdmEKQEAgLTc2LDcgKzc2LDcgQEAKICAgICAgKiB7QGluaGVyaXREb2N9CiAgICAgICovCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZShJU2Vuc29yVGVzdE5vZGUgcGFyZW50KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoSVNlbnNvclRlc3ROb2RlIHBhcmVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFN0YXJ0IGFsYXJtCiAgICAgICAgIEludGVudEZpbHRlciBpbnRlbnRGaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKEFDVElPTik7CiAgICAgICAgIEJyb2FkY2FzdFJlY2VpdmVyIHJlY2VpdmVyID0gbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgewpkaWZmIC0tZ2l0IGEvdGVzdHMvc2Vuc29yL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2N0cy9oZWxwZXJzL3NlbnNvcm9wZXJhdGlvbnMvRGVsYXlTZW5zb3JPcGVyYXRpb24uamF2YSBiL3Rlc3RzL3NlbnNvci9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jdHMvaGVscGVycy9zZW5zb3JvcGVyYXRpb25zL0RlbGF5U2Vuc29yT3BlcmF0aW9uLmphdmEKaW5kZXggOGM1MjIyMi4uNzQxZGQ2MyAxMDA2NDQKLS0tIGEvdGVzdHMvc2Vuc29yL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2N0cy9oZWxwZXJzL3NlbnNvcm9wZXJhdGlvbnMvRGVsYXlTZW5zb3JPcGVyYXRpb24uamF2YQorKysgYi90ZXN0cy9zZW5zb3Ivc3JjL2FuZHJvaWQvaGFyZHdhcmUvY3RzL2hlbHBlcnMvc2Vuc29yb3BlcmF0aW9ucy9EZWxheVNlbnNvck9wZXJhdGlvbi5qYXZhCkBAIC00OCw3ICs0OCw3IEBACiAgICAgICoge0Bpbmhlcml0RG9jfQogICAgICAqLwogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoSVNlbnNvclRlc3ROb2RlIHBhcmVudCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKElTZW5zb3JUZXN0Tm9kZSBwYXJlbnQpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBTZW5zb3JDdHNIZWxwZXIuc2xlZXAobURlbGF5LCBtVGltZVVuaXQpOwogICAgICAgICBtT3BlcmF0aW9uLmV4ZWN1dGUoYXNUZXN0Tm9kZShwYXJlbnQpKTsKICAgICB9CmRpZmYgLS1naXQgYS90ZXN0cy9zZW5zb3Ivc3JjL2FuZHJvaWQvaGFyZHdhcmUvY3RzL2hlbHBlcnMvc2Vuc29yb3BlcmF0aW9ucy9SZXBlYXRpbmdTZW5zb3JPcGVyYXRpb24uamF2YSBiL3Rlc3RzL3NlbnNvci9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jdHMvaGVscGVycy9zZW5zb3JvcGVyYXRpb25zL1JlcGVhdGluZ1NlbnNvck9wZXJhdGlvbi5qYXZhCmluZGV4IDViMzMzYjguLjhhY2ZhN2UgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3NlbnNvci9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jdHMvaGVscGVycy9zZW5zb3JvcGVyYXRpb25zL1JlcGVhdGluZ1NlbnNvck9wZXJhdGlvbi5qYXZhCisrKyBiL3Rlc3RzL3NlbnNvci9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jdHMvaGVscGVycy9zZW5zb3JvcGVyYXRpb25zL1JlcGVhdGluZ1NlbnNvck9wZXJhdGlvbi5qYXZhCkBAIC00OSw3ICs0OSw3IEBACiAgICAgICogb25lIGl0ZXJhdGlvbnMsIGl0IGlzIHRocm93biBhbmQgYWxsIHN1YnNlcXVlbnQgaXRlcmF0aW9ucyB3aWxsIG5vdCBydW4uCiAgICAgICovCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZShJU2Vuc29yVGVzdE5vZGUgcGFyZW50KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoSVNlbnNvclRlc3ROb2RlIHBhcmVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIElTZW5zb3JUZXN0Tm9kZSBjdXJyZW50Tm9kZSA9IGFzVGVzdE5vZGUocGFyZW50KTsKICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG1JdGVyYXRpb25zOyArK2kpIHsKICAgICAgICAgICAgIFNlbnNvck9wZXJhdGlvbiBvcGVyYXRpb24gPSBtT3BlcmF0aW9uLmNsb25lKCk7CmRpZmYgLS1naXQgYS90ZXN0cy9zZW5zb3Ivc3JjL2FuZHJvaWQvaGFyZHdhcmUvY3RzL2hlbHBlcnMvc2Vuc29yb3BlcmF0aW9ucy9TZW5zb3JPcGVyYXRpb24uamF2YSBiL3Rlc3RzL3NlbnNvci9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jdHMvaGVscGVycy9zZW5zb3JvcGVyYXRpb25zL1NlbnNvck9wZXJhdGlvbi5qYXZhCmluZGV4IDY2NjA0ZDMuLmZjMTIzODIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3NlbnNvci9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jdHMvaGVscGVycy9zZW5zb3JvcGVyYXRpb25zL1NlbnNvck9wZXJhdGlvbi5qYXZhCisrKyBiL3Rlc3RzL3NlbnNvci9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jdHMvaGVscGVycy9zZW5zb3JvcGVyYXRpb25zL1NlbnNvck9wZXJhdGlvbi5qYXZhCkBAIC02Miw3ICs2Miw3IEBACiAgICAgICogLSBjbGVhbmluZyB1cCBvbiB7QGxpbmsgSW50ZXJydXB0ZWRFeGNlcHRpb259CiAgICAgICogLSBwcm9wYWdhdGluZyB0aGUgZXhjZXB0aW9uIGRvd24gdGhlIHN0YWNrCiAgICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgZXhlY3V0ZShJU2Vuc29yVGVzdE5vZGUgcGFyZW50KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb247CisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgZXhlY3V0ZShJU2Vuc29yVGVzdE5vZGUgcGFyZW50KSB0aHJvd3MgRXhjZXB0aW9uOwogCiAgICAgLyoqCiAgICAgICogQHJldHVybiBUaGUgY2xvbmVkIHtAbGluayBTZW5zb3JPcGVyYXRpb259LgpkaWZmIC0tZ2l0IGEvdGVzdHMvc2Vuc29yL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2N0cy9oZWxwZXJzL3NlbnNvcm9wZXJhdGlvbnMvU2Vuc29yT3BlcmF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvc2Vuc29yL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2N0cy9oZWxwZXJzL3NlbnNvcm9wZXJhdGlvbnMvU2Vuc29yT3BlcmF0aW9uVGVzdC5qYXZhCmluZGV4IGFiZmE2OTIuLjU2OGIwMTUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3NlbnNvci9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jdHMvaGVscGVycy9zZW5zb3JvcGVyYXRpb25zL1NlbnNvck9wZXJhdGlvblRlc3QuamF2YQorKysgYi90ZXN0cy9zZW5zb3Ivc3JjL2FuZHJvaWQvaGFyZHdhcmUvY3RzL2hlbHBlcnMvc2Vuc29yb3BlcmF0aW9ucy9TZW5zb3JPcGVyYXRpb25UZXN0LmphdmEKQEAgLTQ0LDcgKzQ0LDcgQEAKICAgICAgKiBUZXN0IHRoYXQgdGhlIHtAbGluayBGYWtlU2Vuc29yT3BlcmF0aW9ufSBmdW5jdGlvbnMgY29ycmVjdGx5LiBPdGhlciB0ZXN0cyBpbiB0aGlzIGNsYXNzCiAgICAgICogcmVseSBvbiB0aGlzIG9wZXJhdGlvbi4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmFrZVNlbnNvck9wZXJhdGlvbigpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdEZha2VTZW5zb3JPcGVyYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgaW50IG9wRHVyYXRpb25NcyA9IDEwMDsKIAogICAgICAgICBTZW5zb3JPcGVyYXRpb24gb3AgPSBuZXcgRmFrZVNlbnNvck9wZXJhdGlvbihvcER1cmF0aW9uTXMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CkBAIC02OSw3ICs2OSw3IEBACiAgICAgLyoqCiAgICAgICogVGVzdCB0aGF0IHRoZSB7QGxpbmsgRGVsYXlTZW5zb3JPcGVyYXRpb259IGZ1bmN0aW9ucyBjb3JyZWN0bHkuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdERlbGF5U2Vuc29yT3BlcmF0aW9uKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVsYXlTZW5zb3JPcGVyYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgaW50IG9wRHVyYXRpb25NcyA9IDUwMDsKICAgICAgICAgZmluYWwgaW50IHN1Yk9wRHVyYXRpb25NcyA9IDEwMDsKIApAQCAtODYsNyArODYsNyBAQAogICAgIC8qKgogICAgICAqIFRlc3QgdGhhdCB0aGUge0BsaW5rIFBhcmFsbGVsU2Vuc29yT3BlcmF0aW9ufSBmdW5jdGlvbnMgY29ycmVjdGx5LgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJhbGxlbFNlbnNvck9wZXJhdGlvbigpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdFBhcmFsbGVsU2Vuc29yT3BlcmF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIGludCBzdWJPcENvdW50ID0gMTAwOwogICAgICAgICBmaW5hbCBpbnQgc3ViT3BEdXJhdGlvbk1zID0gNTAwOwogCkBAIC0xMjcsNyArMTI3LDcgQEAKICAgICAgKiBUZXN0IHRoYXQgdGhlIHtAbGluayBQYXJhbGxlbFNlbnNvck9wZXJhdGlvbn0gZnVuY3Rpb25zIGNvcnJlY3RseSBpZiB0aGVyZSBpcyBhIGZhaWx1cmUgaW4KICAgICAgKiBhIGNoaWxkIG9wZXJhdGlvbi4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyYWxsZWxTZW5zb3JPcGVyYXRpb25fZmFpbCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdFBhcmFsbGVsU2Vuc29yT3BlcmF0aW9uX2ZhaWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgaW50IHN1Yk9wQ291bnQgPSAxMDA7CiAKICAgICAgICAgUGFyYWxsZWxTZW5zb3JPcGVyYXRpb24gb3AgPSBuZXcgUGFyYWxsZWxTZW5zb3JPcGVyYXRpb24oKTsKQEAgLTE2Nyw3ICsxNjcsNyBAQAogICAgICAqIFRlc3QgdGhhdCB0aGUge0BsaW5rIFBhcmFsbGVsU2Vuc29yT3BlcmF0aW9ufSBmdW5jdGlvbnMgY29ycmVjdGx5IGlmIGEgY2hpbGQgZXhjZWVkcyB0aGUKICAgICAgKiB0aW1lb3V0LgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJhbGxlbFNlbnNvck9wZXJhdGlvbl90aW1lb3V0KCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyYWxsZWxTZW5zb3JPcGVyYXRpb25fdGltZW91dCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBmaW5hbCBpbnQgc3ViT3BDb3VudCA9IDEwMDsKIAogICAgICAgICBQYXJhbGxlbFNlbnNvck9wZXJhdGlvbiBvcCA9IG5ldyBQYXJhbGxlbFNlbnNvck9wZXJhdGlvbigxLCBUaW1lVW5pdC5TRUNPTkRTKTsKQEAgLTIwMSw3ICsyMDEsNyBAQAogICAgIC8qKgogICAgICAqIFRlc3QgdGhhdCB0aGUge0BsaW5rIFJlcGVhdGluZ1NlbnNvck9wZXJhdGlvbn0gZnVuY3Rpb25zIGNvcnJlY3RseS4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwZWF0aW5nU2Vuc29yT3BlcmF0aW9uKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwZWF0aW5nU2Vuc29yT3BlcmF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIGludCBpdGVyYXRpb25zID0gMTA7CiAgICAgICAgIGZpbmFsIGludCBzdWJPcER1cmF0aW9uTXMgPSAxMDA7CiAKQEAgLTIyOCw3ICsyMjgsNyBAQAogICAgICAqIFRlc3QgdGhhdCB0aGUge0BsaW5rIFJlcGVhdGluZ1NlbnNvck9wZXJhdGlvbn0gZnVuY3Rpb25zIGNvcnJlY3RseSBpZiB0aGVyZSBpcyBhIGZhaWx1cmUgaW4KICAgICAgKiBhIGNoaWxkIG9wZXJhdGlvbi4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwZWF0aW5nU2Vuc29yT3BlcmF0aW9uX2ZhaWwoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBlYXRpbmdTZW5zb3JPcGVyYXRpb25fZmFpbCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBmaW5hbCBpbnQgaXRlcmF0aW9ucyA9IDEwMDsKICAgICAgICAgZmluYWwgaW50IGZhaWxDb3VudCA9IDc1OwogCkBAIC0yODYsNyArMjg2LDcgQEAKICAgICAvKioKICAgICAgKiBUZXN0IHRoYXQgdGhlIHtAbGluayBTZXF1ZW50aWFsU2Vuc29yT3BlcmF0aW9ufSBmdW5jdGlvbnMgY29ycmVjdGx5LgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXF1ZW50aWFsU2Vuc29yT3BlcmF0aW9uKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VxdWVudGlhbFNlbnNvck9wZXJhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBmaW5hbCBpbnQgc3ViT3BDb3VudCA9IDEwOwogICAgICAgICBmaW5hbCBpbnQgc3ViT3BEdXJhdGlvbk1zID0gMTAwOwogCkBAIC0zMTcsNyArMzE3LDcgQEAKICAgICAgKiBUZXN0IHRoYXQgdGhlIHtAbGluayBTZXF1ZW50aWFsU2Vuc29yT3BlcmF0aW9ufSBmdW5jdGlvbnMgY29ycmVjdGx5IGlmIHRoZXJlIGlzIGEgZmFpbHVyZSBpbgogICAgICAqIGEgY2hpbGQgb3BlcmF0aW9uLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXF1ZW50aWFsU2Vuc29yT3BlcmF0aW9uX2ZhaWwoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3RTZXF1ZW50aWFsU2Vuc29yT3BlcmF0aW9uX2ZhaWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgaW50IHN1Yk9wQ291bnQgPSAxMDA7CiAgICAgICAgIGZpbmFsIGludCBmYWlsQ291bnQgPSA3NTsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvc2Vuc29yL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2N0cy9oZWxwZXJzL3NlbnNvcm9wZXJhdGlvbnMvU2VxdWVudGlhbFNlbnNvck9wZXJhdGlvbi5qYXZhIGIvdGVzdHMvc2Vuc29yL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2N0cy9oZWxwZXJzL3NlbnNvcm9wZXJhdGlvbnMvU2VxdWVudGlhbFNlbnNvck9wZXJhdGlvbi5qYXZhCmluZGV4IDg0N2MwZjIuLjczZWU2OGMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3NlbnNvci9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jdHMvaGVscGVycy9zZW5zb3JvcGVyYXRpb25zL1NlcXVlbnRpYWxTZW5zb3JPcGVyYXRpb24uamF2YQorKysgYi90ZXN0cy9zZW5zb3Ivc3JjL2FuZHJvaWQvaGFyZHdhcmUvY3RzL2hlbHBlcnMvc2Vuc29yb3BlcmF0aW9ucy9TZXF1ZW50aWFsU2Vuc29yT3BlcmF0aW9uLmphdmEKQEAgLTQ4LDcgKzQ4LDcgQEAKICAgICAgKiBpbiBvbmUgb3BlcmF0aW9uLCBpdCBpcyB0aHJvd24gYW5kIGFsbCBzdWJzZXF1ZW50IG9wZXJhdGlvbnMgd2lsbCBub3QgcnVuLgogICAgICAqLwogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoSVNlbnNvclRlc3ROb2RlIHBhcmVudCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKElTZW5zb3JUZXN0Tm9kZSBwYXJlbnQpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBJU2Vuc29yVGVzdE5vZGUgY3VycmVudE5vZGUgPSBhc1Rlc3ROb2RlKHBhcmVudCk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU9wZXJhdGlvbnMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIFNlbnNvck9wZXJhdGlvbiBvcGVyYXRpb24gPSBtT3BlcmF0aW9ucy5nZXQoaSk7CmRpZmYgLS1naXQgYS90ZXN0cy9zZW5zb3Ivc3JjL2FuZHJvaWQvaGFyZHdhcmUvY3RzL2hlbHBlcnMvc2Vuc29yb3BlcmF0aW9ucy9UZXN0U2Vuc29yT3BlcmF0aW9uLmphdmEgYi90ZXN0cy9zZW5zb3Ivc3JjL2FuZHJvaWQvaGFyZHdhcmUvY3RzL2hlbHBlcnMvc2Vuc29yb3BlcmF0aW9ucy9UZXN0U2Vuc29yT3BlcmF0aW9uLmphdmEKaW5kZXggYWQyMDg0ZC4uODc4YmI0MiAxMDA2NDQKLS0tIGEvdGVzdHMvc2Vuc29yL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2N0cy9oZWxwZXJzL3NlbnNvcm9wZXJhdGlvbnMvVGVzdFNlbnNvck9wZXJhdGlvbi5qYXZhCisrKyBiL3Rlc3RzL3NlbnNvci9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jdHMvaGVscGVycy9zZW5zb3JvcGVyYXRpb25zL1Rlc3RTZW5zb3JPcGVyYXRpb24uamF2YQpAQCAtNzYsNyArNzYsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBpbnRlcmZhY2UgRXhlY3V0b3IgewogICAgICAgICB2b2lkIGV4ZWN1dGUoVGVzdFNlbnNvck1hbmFnZXIgc2Vuc29yTWFuYWdlciwgVGVzdFNlbnNvckV2ZW50TGlzdGVuZXIgbGlzdGVuZXIpCi0gICAgICAgICAgICAgICAgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uOworICAgICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb247CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMjQsNyArMTI0LDcgQEAKICAgICAgKiBDb2xsZWN0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGV2ZW50cyBmcm9tIHRoZSBzZW5zb3IgYW5kIHJ1biBhbGwgZW5hYmxlZCB2ZXJpZmljYXRpb25zLgogICAgICAqLwogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoSVNlbnNvclRlc3ROb2RlIHBhcmVudCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKElTZW5zb3JUZXN0Tm9kZSBwYXJlbnQpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBnZXRTdGF0cygpLmFkZFZhbHVlKCJzZW5zb3JfbmFtZSIsIG1FbnZpcm9ubWVudC5nZXRTZW5zb3IoKS5nZXROYW1lKCkpOwogICAgICAgICBUZXN0U2Vuc29yRXZlbnRMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0U2Vuc29yRXZlbnRMaXN0ZW5lcihtRW52aXJvbm1lbnQsIG1IYW5kbGVyKTsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvc2Vuc29yL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2N0cy9oZWxwZXJzL3NlbnNvcm9wZXJhdGlvbnMvV2FrZUxvY2tPcGVyYXRpb24uamF2YSBiL3Rlc3RzL3NlbnNvci9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jdHMvaGVscGVycy9zZW5zb3JvcGVyYXRpb25zL1dha2VMb2NrT3BlcmF0aW9uLmphdmEKaW5kZXggOWYwM2YzMS4uMGFlNTI4OSAxMDA2NDQKLS0tIGEvdGVzdHMvc2Vuc29yL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2N0cy9oZWxwZXJzL3NlbnNvcm9wZXJhdGlvbnMvV2FrZUxvY2tPcGVyYXRpb24uamF2YQorKysgYi90ZXN0cy9zZW5zb3Ivc3JjL2FuZHJvaWQvaGFyZHdhcmUvY3RzL2hlbHBlcnMvc2Vuc29yb3BlcmF0aW9ucy9XYWtlTG9ja09wZXJhdGlvbi5qYXZhCkBAIC02MCw3ICs2MCw3IEBACiAgICAgICoge0Bpbmhlcml0RG9jfQogICAgICAqLwogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoSVNlbnNvclRlc3ROb2RlIHBhcmVudCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKElTZW5zb3JUZXN0Tm9kZSBwYXJlbnQpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBQb3dlck1hbmFnZXIgcG0gPSAoUG93ZXJNYW5hZ2VyKSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuUE9XRVJfU0VSVklDRSk7CiAgICAgICAgIFdha2VMb2NrIHdha2VMb2NrID0gcG0ubmV3V2FrZUxvY2sobVdha2VMb2NrRmxhZ3MsIFRBRyk7CiAgICAgICAgIHdha2VMb2NrLmFjcXVpcmUoKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL3NlbnNvci9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jdHMvaGVscGVycy9zZW5zb3J2ZXJpZmljYXRpb24vQ29udGludW91c0V2ZW50U2FuaXRpemVkVmVyaWZpY2F0aW9uLmphdmEgYi90ZXN0cy9zZW5zb3Ivc3JjL2FuZHJvaWQvaGFyZHdhcmUvY3RzL2hlbHBlcnMvc2Vuc29ydmVyaWZpY2F0aW9uL0NvbnRpbnVvdXNFdmVudFNhbml0aXplZFZlcmlmaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NjljOTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zZW5zb3Ivc3JjL2FuZHJvaWQvaGFyZHdhcmUvY3RzL2hlbHBlcnMvc2Vuc29ydmVyaWZpY2F0aW9uL0NvbnRpbnVvdXNFdmVudFNhbml0aXplZFZlcmlmaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmhhcmR3YXJlLmN0cy5oZWxwZXJzLnNlbnNvcnZlcmlmaWNhdGlvbjsKKworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuU2Vuc29yOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY3RzLmhlbHBlcnMuU2Vuc29yU3RhdHM7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jdHMuaGVscGVycy5UZXN0U2Vuc29yRW52aXJvbm1lbnQ7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jdHMuaGVscGVycy5UZXN0U2Vuc29yRXZlbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEEge0BsaW5rIElTZW5zb3JWZXJpZmljYXRpb259IHdoaWNoIHZlcmlmaWVzIHRoYXQgY29udGludW91cyBldmVudHMgYXJlIHNhbml0aXplZAorICogd2hlbiB0aGUgVUlEIGlzIGlkbGUuIEluIHRoaXMgY2FzZSBubyBldmVudHMgc2hvdWxkIGJlIGZpcmVkLiBXZSBleHBlY3QgdG8gcmVjZWl2ZQorICogZXZlbnRzIGFuZCBzdG9wIHJlY2VpdmluZyBzaW5jZSBzb21lIGV2ZW50cyBtYXkgaGF2ZSBiZWVuIGNhY2hlZCBhbHJlYWR5LgorICovCitwdWJsaWMgY2xhc3MgQ29udGludW91c0V2ZW50U2FuaXRpemVkVmVyaWZpY2F0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZW5zb3JWZXJpZmljYXRpb24geworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBU1NFRF9LRVkgPSAiY29udGludW91c19ldmVudF9zYW5pdGl6YXRpb25fcGFzc2VkIjsKKworICAgIC8vIE51bWJlciBvZiBpbmRpY2VzIHRvIHByaW50IGluIGFzc2VydCBtZXNzYWdlIGJlZm9yZSB0cnVuY2F0aW5nCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRSVU5DQVRFX01FU1NBR0VfTEVOR1RIID0gMzsKKworICAgIHByaXZhdGUgZmluYWwgTGlzdDxUZXN0U2Vuc29yRXZlbnQ+IG1Ob25TYW5pdGl6ZWRFdmVudHMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisKKyAgICBwcml2YXRlIGZpbmFsIGxvbmcgbVZlcmlmaWNhdGlvblN0YXJ0VGltZU5hbm87CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGRlZmF1bHQge0BsaW5rIENvbnRpbnVvdXNFdmVudFNhbml0aXplZFZlcmlmaWNhdGlvbn0gZm9yIGEgc2Vuc29yLgorICAgICAqCisgICAgICogQHBhcmFtIGVudmlyb25tZW50IHRoZSB0ZXN0IGVudmlyb25tZW50CisgICAgICogQHBhcmFtIHZlcmlmaWNhdGlvbkRlbGF5TmFubyBBZnRlciB3aGF0IGRlbGF5IHRvIGV4cGVjdCBubyBldmVudHMgKG5hbm9zZWNvbmRzKS4KKyAgICAgKiBAcmV0dXJuIHRoZSB2ZXJpZmljYXRpb24gb3IgbnVsbCBpZiB0aGUgdmVyaWZpY2F0aW9uIGRvZXMgbm90IGFwcGx5IHRvIHRoZSBzZW5zb3IuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDb250aW51b3VzRXZlbnRTYW5pdGl6ZWRWZXJpZmljYXRpb24gZ2V0RGVmYXVsdCgKKyAgICAgICAgICAgIFRlc3RTZW5zb3JFbnZpcm9ubWVudCBlbnZpcm9ubWVudCwgbG9uZyB2ZXJpZmljYXRpb25EZWxheU5hbm8pIHsKKyAgICAgICAgZmluYWwgaW50IHJlcG9ydGluZ01vZGUgPSBlbnZpcm9ubWVudC5nZXRTZW5zb3IoKS5nZXRSZXBvcnRpbmdNb2RlKCk7CisgICAgICAgIGlmIChyZXBvcnRpbmdNb2RlID09IFNlbnNvci5SRVBPUlRJTkdfTU9ERV9DT05USU5VT1VTKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IENvbnRpbnVvdXNFdmVudFNhbml0aXplZFZlcmlmaWNhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lTmFub3MoKSArIHZlcmlmaWNhdGlvbkRlbGF5TmFubyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBDb250aW51b3VzRXZlbnRTYW5pdGl6ZWRWZXJpZmljYXRpb24obG9uZyB2ZXJpZmljYXRpb25EZWxheU5hbm8pIHsKKyAgICAgICAgbVZlcmlmaWNhdGlvblN0YXJ0VGltZU5hbm8gPSB2ZXJpZmljYXRpb25EZWxheU5hbm87CisgICAgfQorCisgICAgLyoqCisgICAgICogVmVyaWZ5IHRoYXQgdGhlIGV2ZW50cyBhcmUgc2FuaXRpemVkLiBBZGQge0B2YWx1ZSAjUEFTU0VEX0tFWX0gYW5kCisgICAgICoge0B2YWx1ZSBTZW5zb3JTdGF0cyNFVkVOVF9OT1RfU0FOSVRJWkVEX0tFWX0ga2V5cyB0byB7QGxpbmsgU2Vuc29yU3RhdHN9LgorICAgICAqCisgICAgICogQHRocm93cyBBc3NlcnRpb25FcnJvciBpZiB0aGUgdmVyaWZpY2F0aW9uIGZhaWxlZC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoVGVzdFNlbnNvckVudmlyb25tZW50IGVudmlyb25tZW50LCBTZW5zb3JTdGF0cyBzdGF0cykgeworICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtTm9uU2FuaXRpemVkRXZlbnRzLnNpemUoKTsKKyAgICAgICAgaWYgKGNvdW50ID4gMCkgeworICAgICAgICAgICAgc3RhdHMuYWRkVmFsdWUoUEFTU0VEX0tFWSwgZmFsc2UpOworICAgICAgICAgICAgc3RhdHMuYWRkVmFsdWUoU2Vuc29yU3RhdHMuRVZFTlRfTk9UX1NBTklUSVpFRF9LRVksIG1Ob25TYW5pdGl6ZWRFdmVudHMpOworCisgICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChtTm9uU2FuaXRpemVkRXZlbnRzKS5hcHBlbmQoIiBub24tc2FuaXRpemVkIGV2ZW50czogIik7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTWF0aC5taW4oY291bnQsIFRSVU5DQVRFX01FU1NBR0VfTEVOR1RIKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgZmluYWwgVGVzdFNlbnNvckV2ZW50IGV2ZW50ID0gbU5vblNhbml0aXplZEV2ZW50cy5nZXQoaSk7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKFN0cmluZy5mb3JtYXQoInNlbnNvcjolcyIsIGV2ZW50LnNlbnNvci5nZXROYW1lKCkpKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiYWNjdXJhY3k6JWQiLCBldmVudC5hY2N1cmFjeSkpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChTdHJpbmcuZm9ybWF0KCJ2YWx1ZXM6JXMiLCBBcnJheXMudG9TdHJpbmcoZXZlbnQudmFsdWVzKSkpOworCisgICAgICAgICAgICAgICAgaWYgKGNvdW50ID4gVFJVTkNBVEVfTUVTU0FHRV9MRU5HVEgpIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGNvdW50IC0gVFJVTkNBVEVfTUVTU0FHRV9MRU5HVEgpLmFwcGVuZCgiIG1vcmUiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBEZWxldGUgdGhlIHRyYWlsaW5nICI7ICIKKyAgICAgICAgICAgICAgICAgICAgc2IuZGVsZXRlKHNiLmxlbmd0aCgpIC0gMiwgc2IubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFzc2VydC5mYWlsKHNiLnRvU3RyaW5nKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHMuYWRkVmFsdWUoUEFTU0VEX0tFWSwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ29udGludW91c0V2ZW50U2FuaXRpemVkVmVyaWZpY2F0aW9uIGNsb25lKCkgeworICAgICAgICByZXR1cm4gbmV3IENvbnRpbnVvdXNFdmVudFNhbml0aXplZFZlcmlmaWNhdGlvbihtVmVyaWZpY2F0aW9uU3RhcnRUaW1lTmFubyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgYWRkU2Vuc29yRXZlbnRJbnRlcm5hbChUZXN0U2Vuc29yRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgTG9nLmkoIk9QQUxBIiwgImV2ZW50IHRpbWU6ICIgKyBldmVudC50aW1lc3RhbXAgKyAiIHZlcmlmIHN0YXJ0OiIgKyBtVmVyaWZpY2F0aW9uU3RhcnRUaW1lTmFubyk7CisgICAgICAgIGlmIChldmVudC5yZWNlaXZlZFRpbWVzdGFtcCA+IG1WZXJpZmljYXRpb25TdGFydFRpbWVOYW5vKSB7CisgICAgICAgICAgICBtTm9uU2FuaXRpemVkRXZlbnRzLmFkZChldmVudCk7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvc2Vuc29yL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2N0cy9oZWxwZXJzL3NlbnNvcnZlcmlmaWNhdGlvbi9NZWFuVmVyaWZpY2F0aW9uLmphdmEgYi90ZXN0cy9zZW5zb3Ivc3JjL2FuZHJvaWQvaGFyZHdhcmUvY3RzL2hlbHBlcnMvc2Vuc29ydmVyaWZpY2F0aW9uL01lYW5WZXJpZmljYXRpb24uamF2YQppbmRleCAxNzg4MmQ3Li43YTQ4YmE4IDEwMDY0NAotLS0gYS90ZXN0cy9zZW5zb3Ivc3JjL2FuZHJvaWQvaGFyZHdhcmUvY3RzL2hlbHBlcnMvc2Vuc29ydmVyaWZpY2F0aW9uL01lYW5WZXJpZmljYXRpb24uamF2YQorKysgYi90ZXN0cy9zZW5zb3Ivc3JjL2FuZHJvaWQvaGFyZHdhcmUvY3RzL2hlbHBlcnMvc2Vuc29ydmVyaWZpY2F0aW9uL01lYW5WZXJpZmljYXRpb24uamF2YQpAQCAtMjMsNiArMjMsNyBAQAogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY3RzLmhlbHBlcnMuU2Vuc29yQ3RzSGVscGVyOwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY3RzLmhlbHBlcnMuU2Vuc29yU3RhdHM7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jdHMuaGVscGVycy5UZXN0U2Vuc29yRW52aXJvbm1lbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwogCiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKQEAgLTY1LDEzICs2NiwyMyBAQAogICAgICAqIEByZXR1cm4gdGhlIHZlcmlmaWNhdGlvbiBvciBudWxsIGlmIHRoZSB2ZXJpZmljYXRpb24gZG9lcyBub3QgYXBwbHkgdG8gdGhlIHNlbnNvci4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIE1lYW5WZXJpZmljYXRpb24gZ2V0RGVmYXVsdChUZXN0U2Vuc29yRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIHsKKworICAgICAgICBNYXA8SW50ZWdlciwgRXhwZWN0ZWRWYWx1ZXNBbmRUaHJlc2hvbGRzPiBjdXJyZW50RGVmYXVsdHMgPQorICAgICAgICAgICAgICAgIG5ldyBIYXNoTWFwPEludGVnZXIsIEV4cGVjdGVkVmFsdWVzQW5kVGhyZXNob2xkcz4oREVGQVVMVFMpOworCisgICAgICAgIC8vIEZvciBhdXRvbW90aXZlIGZsYWcsIGFkZCBjYXIgZGVmYXVsdCB0ZXN0cy4KKyAgICAgICAgaWYoZW52aXJvbm1lbnQuZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VNYW5hZ2VyKCkuaGFzU3lzdGVtRmVhdHVyZSgKKyAgICAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlci5GRUFUVVJFX0FVVE9NT1RJVkUpKSB7CisgICAgICAgICAgICBhZGRDYXJEZWZhdWx0VGVzdHMoY3VycmVudERlZmF1bHRzKTsKKyAgICAgICAgfQorCiAgICAgICAgIGludCBzZW5zb3JUeXBlID0gZW52aXJvbm1lbnQuZ2V0U2Vuc29yKCkuZ2V0VHlwZSgpOwotICAgICAgICBpZiAoIURFRkFVTFRTLmNvbnRhaW5zS2V5KHNlbnNvclR5cGUpKSB7CisgICAgICAgIGlmICghY3VycmVudERlZmF1bHRzLmNvbnRhaW5zS2V5KHNlbnNvclR5cGUpKSB7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQotICAgICAgICBmbG9hdFtdIGV4cGVjdGVkID0gREVGQVVMVFMuZ2V0KHNlbnNvclR5cGUpLm1FeHBlY3RlZFZhbHVlczsKLSAgICAgICAgZmxvYXRbXSB1cHBlclRocmVzaG9sZHMgPSBERUZBVUxUUy5nZXQoc2Vuc29yVHlwZSkubVVwcGVyVGhyZXNob2xkczsKLSAgICAgICAgZmxvYXRbXSBsb3dlclRocmVzaG9sZHMgPSBERUZBVUxUUy5nZXQoc2Vuc29yVHlwZSkubUxvd2VyVGhyZXNob2xkczsKKyAgICAgICAgZmxvYXRbXSBleHBlY3RlZCA9IGN1cnJlbnREZWZhdWx0cy5nZXQoc2Vuc29yVHlwZSkubUV4cGVjdGVkVmFsdWVzOworICAgICAgICBmbG9hdFtdIHVwcGVyVGhyZXNob2xkcyA9IGN1cnJlbnREZWZhdWx0cy5nZXQoc2Vuc29yVHlwZSkubVVwcGVyVGhyZXNob2xkczsKKyAgICAgICAgZmxvYXRbXSBsb3dlclRocmVzaG9sZHMgPSBjdXJyZW50RGVmYXVsdHMuZ2V0KHNlbnNvclR5cGUpLm1Mb3dlclRocmVzaG9sZHM7CiAgICAgICAgIHJldHVybiBuZXcgTWVhblZlcmlmaWNhdGlvbihleHBlY3RlZCwgdXBwZXJUaHJlc2hvbGRzLCBsb3dlclRocmVzaG9sZHMpOwogICAgIH0KIApAQCAtMTg2LDYgKzE5NywyMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbG9hdC5NQVhfVkFMVUV9KSk7CiAgICAgfQogCisgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZENhckRlZmF1bHRUZXN0cyhNYXA8SW50ZWdlciwgRXhwZWN0ZWRWYWx1ZXNBbmRUaHJlc2hvbGRzPiBkZWZhdWx0cykgeworICAgICAgICAvLyBTZW5zb3JzIHRoYXQgYXJlIGJlaW5nIHRlc3RlZCBmb3IgbWVhbiB2ZXJpZmljYXRpb24gZm9yIHRoZSBjYXIuCisgICAgICAgIC8vIEFjY2VsZXJvbWV0ZXIgYXhlcyBzaG91bGQgYmUgYWxpZ25lZCB0byBjYXIgYXhlczogWCByaWdodCwgWSBmb3J3YXJkLCBaIHVwLgorICAgICAgICAvLyBSZWZlciBmb3IgY2FyIGF4ZXM6IGh0dHBzOi8vc291cmNlLmFuZHJvaWQuY29tL2RldmljZXMvc2Vuc29ycy9zZW5zb3ItdHlwZXMKKyAgICAgICAgLy8gVmVyaWZ5aW5nIFogYXhpcyBpcyBHcmF2aXR5LCBYIGFuZCBZIGlzIHplcm8gYXMgY2FyIGlzIGV4cGVjdGVkIHRvIGJlIHN0YXRpb25hcnkuCisgICAgICAgIC8vIFRvbGVyYW5jZSBzZXQgdG8gMS45NSBhcyB1c2VkIGluIENUUyBWZXJpZmllciB0ZXN0cy4KKyAgICAgICAgZGVmYXVsdHMucHV0KFNlbnNvci5UWVBFX0FDQ0VMRVJPTUVURVIsCisgICAgICAgICAgICAgICAgbmV3IEV4cGVjdGVkVmFsdWVzQW5kVGhyZXNob2xkcygKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBmbG9hdFtdezAuMGYsIDAuMGYsIFNlbnNvck1hbmFnZXIuU1RBTkRBUkRfR1JBVklUWX0sCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgZmxvYXRbXXsxLjk1ZiwgMS45NWYsIDEuOTVmfSAvKiBtIC8gc14yICovLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGZsb2F0W117MS45NWYsIDEuOTVmLCAxLjk1Zn0gLyogbSAvIHNeMiAqLykpOworICAgIH0KKwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEV4cGVjdGVkVmFsdWVzQW5kVGhyZXNob2xkcyB7CiAgICAgICAgIHByaXZhdGUgZmxvYXRbXSBtRXhwZWN0ZWRWYWx1ZXM7CiAgICAgICAgIHByaXZhdGUgZmxvYXRbXSBtVXBwZXJUaHJlc2hvbGRzOwpkaWZmIC0tZ2l0IGEvdGVzdHMvc2lnbmF0dXJlL0FuZHJvaWQubWsgYi90ZXN0cy9zaWduYXR1cmUvQW5kcm9pZC5tawppbmRleCBmZWM0N2I2Li44NGQ3Y2VjIDEwMDY0NAotLS0gYS90ZXN0cy9zaWduYXR1cmUvQW5kcm9pZC5taworKysgYi90ZXN0cy9zaWduYXR1cmUvQW5kcm9pZC5tawpAQCAtMjQsNiArMjQsOCBAQAogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKK0xPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmN0c19kZXhjaGVja2VyCisKIExPQ0FMX01PRFVMRSA6PSBjdHMtc2lnbmF0dXJlLWNvbW1vbgogCiBMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CkBAIC0zNiw3ICszOCw3IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogIyBUaGVzZSBmaWxlcyBhcmUgZm9yIGRldmljZS1zaWRlIG9ubHksIHNvIGZpbHRlci1vdXQgZm9yIGhvc3QgbGlicmFyeQotTE9DQUxfREVWSUNFX09OTFlfU09VUkNFUyA6PSAlL0N1cnJlbnRBcGkuamF2YSAlL0FwaURvY3VtZW50UGFyc2VyLmphdmEKK0xPQ0FMX0RFVklDRV9PTkxZX1NPVVJDRVMgOj0gJS9DdXJyZW50QXBpLmphdmEgJS9BcGlEb2N1bWVudFBhcnNlci5qYXZhICUvRGV4TWVtYmVyQ2hlY2tlci5qYXZhCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGZpbHRlci1vdXQgJChMT0NBTF9ERVZJQ0VfT05MWV9TT1VSQ0VTKSwgJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpKQogCmRpZmYgLS1naXQgYS90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL0FuZHJvaWQubWsgYi90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL0FuZHJvaWQubWsKaW5kZXggMDEzY2M0ZC4uMjcyYmYxYiAxMDA2NDQKLS0tIGEvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svQW5kcm9pZC5tawpAQCAtMjIsMTcgKzIyLDQ4IEBACiAjIGRvbid0IGluY2x1ZGUgdGhpcyBwYWNrYWdlIGluIGFueSB0YXJnZXQKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCiAKLUxPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYy9qYXZhKQogCiBMT0NBTF9NT0RVTEUgOj0gY3RzLWFwaS1zaWduYXR1cmUtdGVzdAogCi1MT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CitMT0NBTF9TREtfVkVSU0lPTiA6PSB0ZXN0X2N1cnJlbnQKIAogTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKICAgICBjdHMtc2lnbmF0dXJlLWNvbW1vbiBcCi0gICAgcmVwYWNrYWdlZC1sZWdhY3ktdGVzdCBcCisgICAgcmVwYWNrYWdlZC5hbmRyb2lkLnRlc3QuYmFzZSBcCiAgICAgcmVwYWNrYWdlZC5hbmRyb2lkLnRlc3QucnVubmVyIFwKIAogaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19KQVZBX0xJQlJBUlkpCiAKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IGxpYmNsYXNzZGVzY3JpcHRvcnMKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9TUkNfRklMRVMgOj0gc3JjL2puaS9jbGFzc2Rlc2NyaXB0b3JzLmNwcAorTE9DQUxfSEVBREVSX0xJQlJBUklFUyA6PSBqbmlfaGVhZGVycyBsaWJvcGVuamRranZtdGlfaGVhZGVycworTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorTE9DQUxfTkRLX1NUTF9WQVJJQU5UIDo9IGMrK19zdGF0aWMKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKworIyBoaWRkZW4gQVBJIGxpc3RzCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IGN0cy1oaWRkZW4tYXBpLWJsYWNrbGlzdAorTE9DQUxfTU9EVUxFX1NURU0gOj0gYmxhY2tsaXN0LmFwaQorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfTU9EVUxFX1BBVEggPSAkKFRBUkdFVF9PVVRfREFUQV9FVEMpCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvYmFzZV9ydWxlcy5taworJChldmFsICQoY2FsbCBjb3B5LW9uZS1maWxlLCQoSU5URVJOQUxfUExBVEZPUk1fSElEREVOQVBJX0JMQUNLTElTVCksJChMT0NBTF9CVUlMVF9NT0RVTEUpKSkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gY3RzLWhpZGRlbi1hcGktZGFyay1ncmV5bGlzdAorTE9DQUxfTU9EVUxFX1NURU0gOj0gZGFya19ncmV5bGlzdC5hcGkKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX01PRFVMRV9QQVRIID0gJChUQVJHRVRfT1VUX0RBVEFfRVRDKQorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK2luY2x1ZGUgJChCVUlMRF9TWVNURU0pL2Jhc2VfcnVsZXMubWsKKyQoZXZhbCAkKGNhbGwgY29weS1vbmUtZmlsZSwkKElOVEVSTkFMX1BMQVRGT1JNX0hJRERFTkFQSV9EQVJLX0dSRVlMSVNUKSwkKExPQ0FMX0JVSUxUX01PRFVMRSkpKQorCisKIGluY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svYW5kcm9pZC10ZXN0LWJhc2UtMjctYXBpL0FuZHJvaWQubWsgYi90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL2FuZHJvaWQtdGVzdC1iYXNlLTI3LWFwaS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZGNiMTJjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9hbmRyb2lkLXRlc3QtYmFzZS0yNy1hcGkvQW5kcm9pZC5tawpAQCAtMCwwICsxLDI0IEBACisjIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzQW5kcm9pZFRlc3RCYXNlMjdBcGlTaWduYXR1cmVUZXN0Q2FzZXMKKworTE9DQUxfU0lHTkFUVVJFX0FQSV9GSUxFUyA6PSBcCisgICAgYW5kcm9pZC10ZXN0LWJhc2UtY3VycmVudC5hcGkgXAorCitpbmNsdWRlICQoTE9DQUxfUEFUSCkvLi4vYnVpbGRfc2lnbmF0dXJlX2Fway5tawpkaWZmIC0tZ2l0IGEvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9hbmRyb2lkLXRlc3QtYmFzZS0yNy1hcGkvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svYW5kcm9pZC10ZXN0LWJhc2UtMjctYXBpL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc3ZTkxMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svYW5kcm9pZC10ZXN0LWJhc2UtMjctYXBpL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwzMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICAgIHBhY2thZ2U9ImFuZHJvaWQuc2lnbmF0dXJlLmN0cy5hcGkuYW5kcm9pZF90ZXN0X2Jhc2VfMjciPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVBRF9FWFRFUk5BTF9TVE9SQUdFIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVBRF9QSE9ORV9TVEFURSIvPgorCisgICAgPHVzZXMtc2RrIGFuZHJvaWQ6bWluU2RrVmVyc2lvbj0iMjUiIGFuZHJvaWQ6dGFyZ2V0U2RrVmVyc2lvbj0iMjciLz4KKworICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmRlYnVnZ2FibGU9InRydWUiLz4KKworICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJyZXBhY2thZ2VkLmFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIgorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLnNpZ25hdHVyZS5jdHMuYXBpLmFuZHJvaWRfdGVzdF9iYXNlXzI3IgorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQW5kcm9pZCBUZXN0IEJhc2UgMjcgQVBJIFNpZ25hdHVyZSBUZXN0Ii8+CisKKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL2FuZHJvaWQtdGVzdC1iYXNlLTI3LWFwaS9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL2FuZHJvaWQtdGVzdC1iYXNlLTI3LWFwaS9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYwNzk4MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svYW5kcm9pZC10ZXN0LWJhc2UtMjctYXBpL0FuZHJvaWRUZXN0LnhtbApAQCAtMCwwICsxLDM3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIEFuZHJvaWQgVGVzdCBCYXNlIDI3IEFQSSBTaWduYXR1cmUgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KKyAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9InN5c3RlbXMiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5SdW5Db21tYW5kVGFyZ2V0UHJlcGFyZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bi1jb21tYW5kIiB2YWx1ZT0ibWtkaXIgLXAgL2RhdGEvbG9jYWwvdG1wL3NpZ25hdHVyZS10ZXN0IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlYXJkb3duLWNvbW1hbmQiIHZhbHVlPSJybSAtcmYgL2RhdGEvbG9jYWwvdG1wL3NpZ25hdHVyZS10ZXN0IiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRhcmdldHByZXAuRmlsZVB1c2hlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9ImFuZHJvaWQtdGVzdC1iYXNlLWN1cnJlbnQuYXBpLT4vZGF0YS9sb2NhbC90bXAvc2lnbmF0dXJlLXRlc3QvYW5kcm9pZC10ZXN0LWJhc2UtY3VycmVudC5hcGkiIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0FuZHJvaWRUZXN0QmFzZTI3QXBpU2lnbmF0dXJlVGVzdENhc2VzLmFwayIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuQW5kcm9pZEpVbml0VGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9InBhY2thZ2UiIHZhbHVlPSJhbmRyb2lkLnNpZ25hdHVyZS5jdHMuYXBpLmFuZHJvaWRfdGVzdF9iYXNlXzI3IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bm5lciIgdmFsdWU9InJlcGFja2FnZWQuYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xhc3MiIHZhbHVlPSJhbmRyb2lkLnNpZ25hdHVyZS5jdHMuYXBpLlNpZ25hdHVyZVRlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0iaW5zdHJ1bWVudGF0aW9uLWFyZyIga2V5PSJleHBlY3RlZC1hcGktZmlsZXMiIHZhbHVlPSJhbmRyb2lkLXRlc3QtYmFzZS1jdXJyZW50LmFwaSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJydW50aW1lLWhpbnQiIHZhbHVlPSI1cyIgLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL2FuZHJvaWQtdGVzdC1tb2NrLWN1cnJlbnQtYXBpL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL2FuZHJvaWQtdGVzdC1tb2NrLWN1cnJlbnQtYXBpL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggNWM4ODUyMS4uZjBmYzhlMSAxMDA2NDQKLS0tIGEvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9hbmRyb2lkLXRlc3QtbW9jay1jdXJyZW50LWFwaS9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svYW5kcm9pZC10ZXN0LW1vY2stY3VycmVudC1hcGkvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjAsNyArMjAsNyBAQAogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVBRF9FWFRFUk5BTF9TVE9SQUdFIiAvPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVBRF9QSE9ORV9TVEFURSIvPgogCi0gICAgPGFwcGxpY2F0aW9uPgorICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmRlYnVnZ2FibGU9InRydWUiPgogICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0Lm1vY2siLz4KICAgICA8L2FwcGxpY2F0aW9uPgogCmRpZmYgLS1naXQgYS90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL2FuZHJvaWQtdGVzdC1tb2NrLWN1cnJlbnQtYXBpL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svYW5kcm9pZC10ZXN0LW1vY2stY3VycmVudC1hcGkvQW5kcm9pZFRlc3QueG1sCmluZGV4IDE2YjI5YTguLmM1ZWNkYmQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svYW5kcm9pZC10ZXN0LW1vY2stY3VycmVudC1hcGkvQW5kcm9pZFRlc3QueG1sCisrKyBiL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svYW5kcm9pZC10ZXN0LW1vY2stY3VycmVudC1hcGkvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgQW5kcm9pZCBUZXN0IE1vY2sgQ3VycmVudCBBUEkgU2lnbmF0dXJlIHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJzeXN0ZW1zIiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuUnVuQ29tbWFuZFRhcmdldFByZXBhcmVyIj4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJydW4tY29tbWFuZCIgdmFsdWU9Im1rZGlyIC1wIC9kYXRhL2xvY2FsL3RtcC9zaWduYXR1cmUtdGVzdCIgLz4KQEAgLTI5LDYgKzMwLDcgQEAKICAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuQW5kcm9pZEpVbml0VGVzdCIgPgogICAgICAgICA8b3B0aW9uIG5hbWU9InBhY2thZ2UiIHZhbHVlPSJhbmRyb2lkLnNpZ25hdHVyZS5jdHMuYXBpLmFuZHJvaWRfdGVzdF9tb2NrX2N1cnJlbnQiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icnVubmVyIiB2YWx1ZT0icmVwYWNrYWdlZC5hbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGFzcyIgdmFsdWU9ImFuZHJvaWQuc2lnbmF0dXJlLmN0cy5hcGkuU2lnbmF0dXJlVGVzdCIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJpbnN0cnVtZW50YXRpb24tYXJnIiBrZXk9ImV4cGVjdGVkLWFwaS1maWxlcyIgdmFsdWU9ImFuZHJvaWQtdGVzdC1tb2NrLWN1cnJlbnQuYXBpIiAvPgogICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjVzIiAvPgogICAgIDwvdGVzdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svYW5kcm9pZC10ZXN0LXJ1bm5lci1jdXJyZW50LWFwaS9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9hbmRyb2lkLXRlc3QtcnVubmVyLWN1cnJlbnQtYXBpL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggNjFkZTUwMS4uZjgxNjY1ZSAxMDA2NDQKLS0tIGEvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9hbmRyb2lkLXRlc3QtcnVubmVyLWN1cnJlbnQtYXBpL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9hbmRyb2lkLXRlc3QtcnVubmVyLWN1cnJlbnQtYXBpL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTIwLDcgKzIwLDcgQEAKICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfRVhURVJOQUxfU1RPUkFHRSIgLz4KICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfUEhPTkVfU1RBVEUiLz4KIAotICAgIDxhcHBsaWNhdGlvbj4KKyAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpkZWJ1Z2dhYmxlPSJ0cnVlIj4KICAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiLz4KICAgICA8L2FwcGxpY2F0aW9uPgogCmRpZmYgLS1naXQgYS90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL2FuZHJvaWQtdGVzdC1ydW5uZXItY3VycmVudC1hcGkvQW5kcm9pZFRlc3QueG1sIGIvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9hbmRyb2lkLXRlc3QtcnVubmVyLWN1cnJlbnQtYXBpL0FuZHJvaWRUZXN0LnhtbAppbmRleCBlY2Y3MDU1Li41M2JlZDMzIDEwMDY0NAotLS0gYS90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL2FuZHJvaWQtdGVzdC1ydW5uZXItY3VycmVudC1hcGkvQW5kcm9pZFRlc3QueG1sCisrKyBiL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svYW5kcm9pZC10ZXN0LXJ1bm5lci1jdXJyZW50LWFwaS9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBBbmRyb2lkIFRlc3QgUnVubmVyIEN1cnJlbnQgQVBJIFNpZ25hdHVyZSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0ic3lzdGVtcyIgLz4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlJ1bkNvbW1hbmRUYXJnZXRQcmVwYXJlciI+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icnVuLWNvbW1hbmQiIHZhbHVlPSJta2RpciAtcCAvZGF0YS9sb2NhbC90bXAvc2lnbmF0dXJlLXRlc3QiIC8+CkBAIC0zMiw2ICszMyw3IEBACiAgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkFuZHJvaWRKVW5pdFRlc3QiID4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJwYWNrYWdlIiB2YWx1ZT0iYW5kcm9pZC5zaWduYXR1cmUuY3RzLmFwaS5hbmRyb2lkX3Rlc3RfcnVubmVyX2N1cnJlbnQiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icnVubmVyIiB2YWx1ZT0icmVwYWNrYWdlZC5hbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGFzcyIgdmFsdWU9ImFuZHJvaWQuc2lnbmF0dXJlLmN0cy5hcGkuU2lnbmF0dXJlVGVzdCIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJpbnN0cnVtZW50YXRpb24tYXJnIiBrZXk9ImV4cGVjdGVkLWFwaS1maWxlcyIgdmFsdWU9ImFuZHJvaWQtdGVzdC1tb2NrLWN1cnJlbnQuYXBpLGFuZHJvaWQtdGVzdC1ydW5uZXItY3VycmVudC5hcGkiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icnVudGltZS1oaW50IiB2YWx1ZT0iNXMiIC8+CiAgICAgPC90ZXN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9hcGFjaGUtaHR0cC1sZWdhY3ktMjctYXBpL0FuZHJvaWQubWsgYi90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL2FwYWNoZS1odHRwLWxlZ2FjeS0yNy1hcGkvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjIxNjFhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9hcGFjaGUtaHR0cC1sZWdhY3ktMjctYXBpL0FuZHJvaWQubWsKQEAgLTAsMCArMSwyNSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0FwYWNoZUh0dHBMZWdhY3kyN0FwaVNpZ25hdHVyZVRlc3RDYXNlcworCitMT0NBTF9TSUdOQVRVUkVfQVBJX0ZJTEVTIDo9IFwKKyAgICBjdXJyZW50LmFwaSBcCisgICAgYXBhY2hlLWh0dHAtbGVnYWN5LW1pbnVzLWN1cnJlbnQuYXBpIFwKKworaW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uL2J1aWxkX3NpZ25hdHVyZV9hcGsubWsKZGlmZiAtLWdpdCBhL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svYXBhY2hlLWh0dHAtbGVnYWN5LTI3LWFwaS9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9hcGFjaGUtaHR0cC1sZWdhY3ktMjctYXBpL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU2OWY1MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svYXBhY2hlLWh0dHAtbGVnYWN5LTI3LWFwaS9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgICBwYWNrYWdlPSJhbmRyb2lkLnNpZ25hdHVyZS5jdHMuYXBpLmFwYWNoZV9odHRwX2xlZ2FjeV8yNyI+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX0VYVEVSTkFMX1NUT1JBR0UiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX1BIT05FX1NUQVRFIi8+CisKKyAgICA8dXNlcy1zZGsgYW5kcm9pZDptaW5TZGtWZXJzaW9uPSIyMiIgYW5kcm9pZDp0YXJnZXRTZGtWZXJzaW9uPSIyNyIvPgorCisgICAgPGFwcGxpY2F0aW9uLz4KKworICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJyZXBhY2thZ2VkLmFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIgorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLnNpZ25hdHVyZS5jdHMuYXBpLmFwYWNoZV9odHRwX2xlZ2FjeV8yNyIKKyAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkFwYWNoZSBIdHRwIExlZ2FjeSAyNyBBUEkgU2lnbmF0dXJlIFRlc3QiLz4KKworPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svYXBhY2hlLWh0dHAtbGVnYWN5LTI3LWFwaS9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL2FwYWNoZS1odHRwLWxlZ2FjeS0yNy1hcGkvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYmM5MGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL2FwYWNoZS1odHRwLWxlZ2FjeS0yNy1hcGkvQW5kcm9pZFRlc3QueG1sCkBAIC0wLDAgKzEsNDEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgQXBhY2hlIEh0dHAgTGVnYWN5IDI3IEFQSSBTaWduYXR1cmUgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KKyAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9InN5c3RlbXMiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5SdW5Db21tYW5kVGFyZ2V0UHJlcGFyZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bi1jb21tYW5kIiB2YWx1ZT0ibWtkaXIgLXAgL2RhdGEvbG9jYWwvdG1wL3NpZ25hdHVyZS10ZXN0IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlYXJkb3duLWNvbW1hbmQiIHZhbHVlPSJybSAtcmYgL2RhdGEvbG9jYWwvdG1wL3NpZ25hdHVyZS10ZXN0IiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRhcmdldHByZXAuRmlsZVB1c2hlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9ImN1cnJlbnQuYXBpLT4vZGF0YS9sb2NhbC90bXAvc2lnbmF0dXJlLXRlc3QvY3VycmVudC5hcGkiIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGFyZ2V0cHJlcC5GaWxlUHVzaGVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iYXBhY2hlLWh0dHAtbGVnYWN5LW1pbnVzLWN1cnJlbnQuYXBpLT4vZGF0YS9sb2NhbC90bXAvc2lnbmF0dXJlLXRlc3QvYXBhY2hlLWh0dHAtbGVnYWN5LW1pbnVzLWN1cnJlbnQuYXBpIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJDdHNBcGFjaGVIdHRwTGVnYWN5MjdBcGlTaWduYXR1cmVUZXN0Q2FzZXMuYXBrIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5BbmRyb2lkSlVuaXRUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0icGFja2FnZSIgdmFsdWU9ImFuZHJvaWQuc2lnbmF0dXJlLmN0cy5hcGkuYXBhY2hlX2h0dHBfbGVnYWN5XzI3IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bm5lciIgdmFsdWU9InJlcGFja2FnZWQuYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xhc3MiIHZhbHVlPSJhbmRyb2lkLnNpZ25hdHVyZS5jdHMuYXBpLlNpZ25hdHVyZVRlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0iaW5zdHJ1bWVudGF0aW9uLWFyZyIga2V5PSJiYXNlLWFwaS1maWxlcyIgdmFsdWU9ImN1cnJlbnQuYXBpIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9Imluc3RydW1lbnRhdGlvbi1hcmciIGtleT0iZXhwZWN0ZWQtYXBpLWZpbGVzIiB2YWx1ZT0iYXBhY2hlLWh0dHAtbGVnYWN5LW1pbnVzLWN1cnJlbnQuYXBpIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjVzIiAvPgorICAgIDwvdGVzdD4KKzwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svYXBhY2hlLWh0dHAtbGVnYWN5LWN1cnJlbnQtYXBpL0FuZHJvaWQubWsgYi90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL2FwYWNoZS1odHRwLWxlZ2FjeS1jdXJyZW50LWFwaS9BbmRyb2lkLm1rCmluZGV4IGRmNjkwMDQuLmIzODI2OTggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svYXBhY2hlLWh0dHAtbGVnYWN5LWN1cnJlbnQtYXBpL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9hcGFjaGUtaHR0cC1sZWdhY3ktY3VycmVudC1hcGkvQW5kcm9pZC5tawpAQCAtMTksNiArMTksNiBAQAogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0FwYWNoZUh0dHBMZWdhY3lDdXJyZW50QXBpU2lnbmF0dXJlVGVzdENhc2VzCiAKIExPQ0FMX1NJR05BVFVSRV9BUElfRklMRVMgOj0gXAotICAgIGFwYWNoZS1odHRwLWxlZ2FjeS1jdXJyZW50LmFwaSBcCisgICAgYXBhY2hlLWh0dHAtbGVnYWN5LW1pbnVzLWN1cnJlbnQuYXBpIFwKIAogaW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uL2J1aWxkX3NpZ25hdHVyZV9hcGsubWsKZGlmZiAtLWdpdCBhL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svYXBhY2hlLWh0dHAtbGVnYWN5LWN1cnJlbnQtYXBpL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL2FwYWNoZS1odHRwLWxlZ2FjeS1jdXJyZW50LWFwaS9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGVhZjExOGIuLmYwZmI3ZDggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svYXBhY2hlLWh0dHAtbGVnYWN5LWN1cnJlbnQtYXBpL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9hcGFjaGUtaHR0cC1sZWdhY3ktY3VycmVudC1hcGkvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjAsNyArMjAsNyBAQAogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVBRF9FWFRFUk5BTF9TVE9SQUdFIiAvPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVBRF9QSE9ORV9TVEFURSIvPgogCi0gICAgPGFwcGxpY2F0aW9uLz4KKyAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpkZWJ1Z2dhYmxlPSJ0cnVlIi8+CiAKICAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0icmVwYWNrYWdlZC5hbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5zaWduYXR1cmUuY3RzLmFwaS5hcGFjaGVfaHR0cF9sZWdhY3lfY3VycmVudCIKZGlmZiAtLWdpdCBhL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svYXBhY2hlLWh0dHAtbGVnYWN5LWN1cnJlbnQtYXBpL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svYXBhY2hlLWh0dHAtbGVnYWN5LWN1cnJlbnQtYXBpL0FuZHJvaWRUZXN0LnhtbAppbmRleCBhNWU2OWE5Li40MThjODgxIDEwMDY0NAotLS0gYS90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL2FwYWNoZS1odHRwLWxlZ2FjeS1jdXJyZW50LWFwaS9BbmRyb2lkVGVzdC54bWwKKysrIGIvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9hcGFjaGUtaHR0cC1sZWdhY3ktY3VycmVudC1hcGkvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCwxMyArMTQsMTQgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBBcGFjaGUgSHR0cCBMZWdhY3kgQ3VycmVudCBBUEkgU2lnbmF0dXJlIHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJzeXN0ZW1zIiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuUnVuQ29tbWFuZFRhcmdldFByZXBhcmVyIj4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJydW4tY29tbWFuZCIgdmFsdWU9Im1rZGlyIC1wIC9kYXRhL2xvY2FsL3RtcC9zaWduYXR1cmUtdGVzdCIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZWFyZG93bi1jb21tYW5kIiB2YWx1ZT0icm0gLXJmIC9kYXRhL2xvY2FsL3RtcC9zaWduYXR1cmUtdGVzdCIgLz4KICAgICA8L3RhcmdldF9wcmVwYXJlcj4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50YXJnZXRwcmVwLkZpbGVQdXNoZXIiPgotICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJhcGFjaGUtaHR0cC1sZWdhY3ktY3VycmVudC5hcGktPi9kYXRhL2xvY2FsL3RtcC9zaWduYXR1cmUtdGVzdC9hcGFjaGUtaHR0cC1sZWdhY3ktY3VycmVudC5hcGkiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9ImFwYWNoZS1odHRwLWxlZ2FjeS1taW51cy1jdXJyZW50LmFwaS0+L2RhdGEvbG9jYWwvdG1wL3NpZ25hdHVyZS10ZXN0L2FwYWNoZS1odHRwLWxlZ2FjeS1taW51cy1jdXJyZW50LmFwaSIgLz4KICAgICA8L3RhcmdldF9wcmVwYXJlcj4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgpAQCAtMjksNyArMzAsOCBAQAogICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5BbmRyb2lkSlVuaXRUZXN0IiA+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icGFja2FnZSIgdmFsdWU9ImFuZHJvaWQuc2lnbmF0dXJlLmN0cy5hcGkuYXBhY2hlX2h0dHBfbGVnYWN5X2N1cnJlbnQiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icnVubmVyIiB2YWx1ZT0icmVwYWNrYWdlZC5hbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJpbnN0cnVtZW50YXRpb24tYXJnIiBrZXk9ImV4cGVjdGVkLWFwaS1maWxlcyIgdmFsdWU9ImFwYWNoZS1odHRwLWxlZ2FjeS1jdXJyZW50LmFwaSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGFzcyIgdmFsdWU9ImFuZHJvaWQuc2lnbmF0dXJlLmN0cy5hcGkuU2lnbmF0dXJlVGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJpbnN0cnVtZW50YXRpb24tYXJnIiBrZXk9InVuZXhwZWN0ZWQtYXBpLWZpbGVzIiB2YWx1ZT0iYXBhY2hlLWh0dHAtbGVnYWN5LW1pbnVzLWN1cnJlbnQuYXBpIiAvPgogICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjVzIiAvPgogICAgIDwvdGVzdD4KIDwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svYXBhY2hlLWh0dHAtbGVnYWN5LXVzZXMtbGlicmFyeS1hcGkvQW5kcm9pZC5tayBiL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svYXBhY2hlLWh0dHAtbGVnYWN5LXVzZXMtbGlicmFyeS1hcGkvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDgwMWM1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9hcGFjaGUtaHR0cC1sZWdhY3ktdXNlcy1saWJyYXJ5LWFwaS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjUgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNBcGFjaGVIdHRwTGVnYWN5VXNlc0xpYnJhcnlBcGlTaWduYXR1cmVUZXN0Q2FzZXMKKworTE9DQUxfU0lHTkFUVVJFX0FQSV9GSUxFUyA6PSBcCisgICAgY3VycmVudC5hcGkgXAorICAgIGFwYWNoZS1odHRwLWxlZ2FjeS1taW51cy1jdXJyZW50LmFwaSBcCisKK2luY2x1ZGUgJChMT0NBTF9QQVRIKS8uLi9idWlsZF9zaWduYXR1cmVfYXBrLm1rCmRpZmYgLS1naXQgYS90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL2FwYWNoZS1odHRwLWxlZ2FjeS11c2VzLWxpYnJhcnktYXBpL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL2FwYWNoZS1odHRwLWxlZ2FjeS11c2VzLWxpYnJhcnktYXBpL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc1OWM1NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svYXBhY2hlLWh0dHAtbGVnYWN5LXVzZXMtbGlicmFyeS1hcGkvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDMxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgICAgcGFja2FnZT0iYW5kcm9pZC5zaWduYXR1cmUuY3RzLmFwaS5hcGFjaGVfaHR0cF9sZWdhY3lfdXNlc19saWJyYXJ5Ij4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfRVhURVJOQUxfU1RPUkFHRSIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfUEhPTkVfU1RBVEUiLz4KKworICAgIDxhcHBsaWNhdGlvbj4KKyAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9Im9yZy5hcGFjaGUuaHR0cC5sZWdhY3kiLz4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9InJlcGFja2FnZWQuYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuc2lnbmF0dXJlLmN0cy5hcGkuYXBhY2hlX2h0dHBfbGVnYWN5X3VzZXNfbGlicmFyeSIKKyAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkFwYWNoZSBIdHRwIExlZ2FjeSBVc2VzTGlicmFyeSBBUEkgU2lnbmF0dXJlIFRlc3QiLz4KKworPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svYXBhY2hlLWh0dHAtbGVnYWN5LXVzZXMtbGlicmFyeS1hcGkvQW5kcm9pZFRlc3QueG1sIGIvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9hcGFjaGUtaHR0cC1sZWdhY3ktdXNlcy1saWJyYXJ5LWFwaS9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQyYzU2NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svYXBhY2hlLWh0dHAtbGVnYWN5LXVzZXMtbGlicmFyeS1hcGkvQW5kcm9pZFRlc3QueG1sCkBAIC0wLDAgKzEsNDEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgQXBhY2hlIEh0dHAgTGVnYWN5IFVzZXNMaWJyYXJ5IEFQSSBTaWduYXR1cmUgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KKyAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9InN5c3RlbXMiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5SdW5Db21tYW5kVGFyZ2V0UHJlcGFyZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bi1jb21tYW5kIiB2YWx1ZT0ibWtkaXIgLXAgL2RhdGEvbG9jYWwvdG1wL3NpZ25hdHVyZS10ZXN0IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlYXJkb3duLWNvbW1hbmQiIHZhbHVlPSJybSAtcmYgL2RhdGEvbG9jYWwvdG1wL3NpZ25hdHVyZS10ZXN0IiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRhcmdldHByZXAuRmlsZVB1c2hlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9ImN1cnJlbnQuYXBpLT4vZGF0YS9sb2NhbC90bXAvc2lnbmF0dXJlLXRlc3QvY3VycmVudC5hcGkiIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGFyZ2V0cHJlcC5GaWxlUHVzaGVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iYXBhY2hlLWh0dHAtbGVnYWN5LW1pbnVzLWN1cnJlbnQuYXBpLT4vZGF0YS9sb2NhbC90bXAvc2lnbmF0dXJlLXRlc3QvYXBhY2hlLWh0dHAtbGVnYWN5LW1pbnVzLWN1cnJlbnQuYXBpIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJDdHNBcGFjaGVIdHRwTGVnYWN5VXNlc0xpYnJhcnlBcGlTaWduYXR1cmVUZXN0Q2FzZXMuYXBrIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5BbmRyb2lkSlVuaXRUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0icGFja2FnZSIgdmFsdWU9ImFuZHJvaWQuc2lnbmF0dXJlLmN0cy5hcGkuYXBhY2hlX2h0dHBfbGVnYWN5X3VzZXNfbGlicmFyeSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJydW5uZXIiIHZhbHVlPSJyZXBhY2thZ2VkLmFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsYXNzIiB2YWx1ZT0iYW5kcm9pZC5zaWduYXR1cmUuY3RzLmFwaS5TaWduYXR1cmVUZXN0IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9Imluc3RydW1lbnRhdGlvbi1hcmciIGtleT0iYmFzZS1hcGktZmlsZXMiIHZhbHVlPSJjdXJyZW50LmFwaSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJpbnN0cnVtZW50YXRpb24tYXJnIiBrZXk9ImV4cGVjdGVkLWFwaS1maWxlcyIgdmFsdWU9ImFwYWNoZS1odHRwLWxlZ2FjeS1taW51cy1jdXJyZW50LmFwaSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJydW50aW1lLWhpbnQiIHZhbHVlPSI1cyIgLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL2J1aWxkX3NpZ25hdHVyZV9hcGsubWsgYi90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL2J1aWxkX3NpZ25hdHVyZV9hcGsubWsKaW5kZXggM2IwYWZkMi4uYTVlYmNmOCAxMDA2NDQKLS0tIGEvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9idWlsZF9zaWduYXR1cmVfYXBrLm1rCisrKyBiL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svYnVpbGRfc2lnbmF0dXJlX2Fway5tawpAQCAtMjEsMTggKzIxLDI0IEBACiAjICAgICAgICAgdGhlIGxpc3Qgb2YgYXBpIGZpbGVzIG5lZWRlZAogCiAjIGRvbid0IGluY2x1ZGUgdGhpcyBwYWNrYWdlIGluIGFueSB0YXJnZXQKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwogCiAjIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0CiBMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cwogCiBMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CiAKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjdHMtYXBpLXNpZ25hdHVyZS10ZXN0CitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgKz0gY3RzLWFwaS1zaWduYXR1cmUtdGVzdAorCitMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJjbGFzc2Rlc2NyaXB0b3JzCitMT0NBTF9NVUxUSUxJQiA6PSBib3RoCiAKIExPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTICs9IFwKICAgICAkKGFkZHByZWZpeCAkKENPTVBBVElCSUxJVFlfVEVTVENBU0VTX09VVF9jdHMpLywkKExPQ0FMX1NJR05BVFVSRV9BUElfRklMRVMpKQogCitMT0NBTF9ERVhfUFJFT1BUIDo9IGZhbHNlCitMT0NBTF9QUk9HVUFSRF9FTkFCTEVEIDo9IGRpc2FibGVkCisKIGluY2x1ZGUgJChCVUlMRF9DVFNfUEFDS0FHRSkKIAogTE9DQUxfU0lHTkFUVVJFX0FQSV9GSUxFUyA6PQpkaWZmIC0tZ2l0IGEvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9jdXJyZW50LWFwaS9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9jdXJyZW50LWFwaS9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDdkYzU3MzAuLmQ2ZjQ3NGIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svY3VycmVudC1hcGkvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL2N1cnJlbnQtYXBpL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTIwLDcgKzIwLDcgQEAKICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfRVhURVJOQUxfU1RPUkFHRSIgLz4KICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfUEhPTkVfU1RBVEUiLz4KIAotICAgIDxhcHBsaWNhdGlvbi8+CisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6ZGVidWdnYWJsZT0idHJ1ZSIvPgogCiAgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9InJlcGFja2FnZWQuYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuc2lnbmF0dXJlLmN0cy5hcGkuY3VycmVudCIKZGlmZiAtLWdpdCBhL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svY3VycmVudC1hcGkvQW5kcm9pZFRlc3QueG1sIGIvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9jdXJyZW50LWFwaS9BbmRyb2lkVGVzdC54bWwKaW5kZXggMjlkZmU2ZC4uNTliN2JkNiAxMDA2NDQKLS0tIGEvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9jdXJyZW50LWFwaS9BbmRyb2lkVGVzdC54bWwKKysrIGIvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9jdXJyZW50LWFwaS9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBDdXJyZW50IEFQSSBTaWduYXR1cmUgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9InN5c3RlbXMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJub3Qtc2hhcmRhYmxlIiB2YWx1ZT0idHJ1ZSIgLz4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlJ1bkNvbW1hbmRUYXJnZXRQcmVwYXJlciI+CkBAIC0zNiw2ICszNyw3IEBACiAgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkFuZHJvaWRKVW5pdFRlc3QiID4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJwYWNrYWdlIiB2YWx1ZT0iYW5kcm9pZC5zaWduYXR1cmUuY3RzLmFwaS5jdXJyZW50IiAvPgogICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bm5lciIgdmFsdWU9InJlcGFja2FnZWQuYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xhc3MiIHZhbHVlPSJhbmRyb2lkLnNpZ25hdHVyZS5jdHMuYXBpLlNpZ25hdHVyZVRlc3QiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0iaW5zdHJ1bWVudGF0aW9uLWFyZyIga2V5PSJleHBlY3RlZC1hcGktZmlsZXMiIHZhbHVlPSJjdXJyZW50LmFwaSIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJpbnN0cnVtZW50YXRpb24tYXJnIiBrZXk9InVuZXhwZWN0ZWQtYXBpLWZpbGVzIiB2YWx1ZT0iYW5kcm9pZC10ZXN0LW1vY2stY3VycmVudC5hcGksYW5kcm9pZC10ZXN0LXJ1bm5lci1jdXJyZW50LmFwaSIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJydW50aW1lLWhpbnQiIHZhbHVlPSIzMHMiIC8+CmRpZmYgLS1naXQgYS90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL2hpZGRlbi1hcGktYmxhY2tsaXN0LTI3LWFwaS9BbmRyb2lkLm1rIGIvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9oaWRkZW4tYXBpLWJsYWNrbGlzdC0yNy1hcGkvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGJmMTdkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9oaWRkZW4tYXBpLWJsYWNrbGlzdC0yNy1hcGkvQW5kcm9pZC5tawpAQCAtMCwwICsxLDIyIEBACisjIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0hpZGRlbkFwaUJsYWNrbGlzdEFwaTI3VGVzdENhc2VzCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQorTE9DQUxfU0lHTkFUVVJFX0FQSV9GSUxFUyA6PSBibGFja2xpc3QuYXBpCitMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdHNfZGV4Y2hlY2tlcgoraW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uL2J1aWxkX3NpZ25hdHVyZV9hcGsubWsKZGlmZiAtLWdpdCBhL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svaGlkZGVuLWFwaS1ibGFja2xpc3QtMjctYXBpL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL2hpZGRlbi1hcGktYmxhY2tsaXN0LTI3LWFwaS9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzODExMmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL2hpZGRlbi1hcGktYmxhY2tsaXN0LTI3LWFwaS9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgICBwYWNrYWdlPSJhbmRyb2lkLnNpZ25hdHVyZS5jdHMuYXBpLmhpZGRlbmFwaV9ibGFja2xpc3RfYXBpXzI3Ij4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfRVhURVJOQUxfU1RPUkFHRSIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfUEhPTkVfU1RBVEUiLz4KKyAgICA8dXNlcy1zZGsgYW5kcm9pZDp0YXJnZXRTZGtWZXJzaW9uPSIyNyIgLz4KKworICAgIDxhcHBsaWNhdGlvbi8+CisKKyAgICA8aW5zdHJ1bWVudGF0aW9uCisgICAgICAgIGFuZHJvaWQ6bmFtZT0icmVwYWNrYWdlZC5hbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLnNpZ25hdHVyZS5jdHMuYXBpLmhpZGRlbmFwaV9ibGFja2xpc3RfYXBpXzI3IgorICAgICAgICBhbmRyb2lkOmxhYmVsPSJIaWRkZW4gQVBJIEJsYWNrbGlzdCBUZXN0IGZvciBTREsgbGV2ZWwgMjciLz4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL2hpZGRlbi1hcGktYmxhY2tsaXN0LTI3LWFwaS9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL2hpZGRlbi1hcGktYmxhY2tsaXN0LTI3LWFwaS9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZhNWZjNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svaGlkZGVuLWFwaS1ibGFja2xpc3QtMjctYXBpL0FuZHJvaWRUZXN0LnhtbApAQCAtMCwwICsxLDM3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIEhpZGRlbiBBUEkgU2lnbmF0dXJlIHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CisgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJzeXN0ZW1zIiAvPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuUnVuQ29tbWFuZFRhcmdldFByZXBhcmVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJydW4tY29tbWFuZCIgdmFsdWU9Im1rZGlyIC1wIC9kYXRhL2xvY2FsL3RtcC9zaWduYXR1cmUtdGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZWFyZG93bi1jb21tYW5kIiB2YWx1ZT0icm0gLXJmIC9kYXRhL2xvY2FsL3RtcC9zaWduYXR1cmUtdGVzdCIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50YXJnZXRwcmVwLkZpbGVQdXNoZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJibGFja2xpc3QuYXBpLT4vZGF0YS9sb2NhbC90bXAvc2lnbmF0dXJlLXRlc3QvYmxhY2tsaXN0LmFwaSIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzSGlkZGVuQXBpQmxhY2tsaXN0QXBpMjdUZXN0Q2FzZXMuYXBrIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5BbmRyb2lkSlVuaXRUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0icGFja2FnZSIgdmFsdWU9ImFuZHJvaWQuc2lnbmF0dXJlLmN0cy5hcGkuaGlkZGVuYXBpX2JsYWNrbGlzdF9hcGlfMjciIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVubmVyIiB2YWx1ZT0icmVwYWNrYWdlZC5hbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGFzcyIgdmFsdWU9ImFuZHJvaWQuc2lnbmF0dXJlLmN0cy5hcGkuSGlkZGVuQXBpVGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJpbnN0cnVtZW50YXRpb24tYXJnIiBrZXk9ImhpZGRlbi1hcGktZmlsZXMiIHZhbHVlPSJibGFja2xpc3QuYXBpIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjMwcyIgLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL2hpZGRlbi1hcGktYmxhY2tsaXN0LWN1cnJlbnQtYXBpL0FuZHJvaWQubWsgYi90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL2hpZGRlbi1hcGktYmxhY2tsaXN0LWN1cnJlbnQtYXBpL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUxOGYxNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svaGlkZGVuLWFwaS1ibGFja2xpc3QtY3VycmVudC1hcGkvQW5kcm9pZC5tawpAQCAtMCwwICsxLDIyIEBACisjIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0hpZGRlbkFwaUJsYWNrbGlzdEN1cnJlbnRBcGlUZXN0Q2FzZXMKK0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCitMT0NBTF9TSUdOQVRVUkVfQVBJX0ZJTEVTIDo9IGJsYWNrbGlzdC5hcGkgZGFya19ncmV5bGlzdC5hcGkKK0xPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmN0c19kZXhjaGVja2VyCitpbmNsdWRlICQoTE9DQUxfUEFUSCkvLi4vYnVpbGRfc2lnbmF0dXJlX2Fway5tawpkaWZmIC0tZ2l0IGEvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9oaWRkZW4tYXBpLWJsYWNrbGlzdC1jdXJyZW50LWFwaS9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9oaWRkZW4tYXBpLWJsYWNrbGlzdC1jdXJyZW50LWFwaS9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZDAzOTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL2hpZGRlbi1hcGktYmxhY2tsaXN0LWN1cnJlbnQtYXBpL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICAgIHBhY2thZ2U9ImFuZHJvaWQuc2lnbmF0dXJlLmN0cy5hcGkuaGlkZGVuYXBpX2JsYWNrbGlzdF9jdXJyZW50Ij4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfRVhURVJOQUxfU1RPUkFHRSIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfUEhPTkVfU1RBVEUiLz4KKworICAgIDxhcHBsaWNhdGlvbi8+CisKKyAgICA8aW5zdHJ1bWVudGF0aW9uCisgICAgICAgIGFuZHJvaWQ6bmFtZT0icmVwYWNrYWdlZC5hbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLnNpZ25hdHVyZS5jdHMuYXBpLmhpZGRlbmFwaV9ibGFja2xpc3RfY3VycmVudCIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iSGlkZGVuIEFQSSBCbGFja2xpc3QgVGVzdCBmb3IgY3VycmVudCBTREsiLz4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL2hpZGRlbi1hcGktYmxhY2tsaXN0LWN1cnJlbnQtYXBpL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svaGlkZGVuLWFwaS1ibGFja2xpc3QtY3VycmVudC1hcGkvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmY2QwZDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL2hpZGRlbi1hcGktYmxhY2tsaXN0LWN1cnJlbnQtYXBpL0FuZHJvaWRUZXN0LnhtbApAQCAtMCwwICsxLDM4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIEhpZGRlbiBBUEkgU2lnbmF0dXJlIHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CisgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJzeXN0ZW1zIiAvPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuUnVuQ29tbWFuZFRhcmdldFByZXBhcmVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJydW4tY29tbWFuZCIgdmFsdWU9Im1rZGlyIC1wIC9kYXRhL2xvY2FsL3RtcC9zaWduYXR1cmUtdGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZWFyZG93bi1jb21tYW5kIiB2YWx1ZT0icm0gLXJmIC9kYXRhL2xvY2FsL3RtcC9zaWduYXR1cmUtdGVzdCIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50YXJnZXRwcmVwLkZpbGVQdXNoZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJibGFja2xpc3QuYXBpLT4vZGF0YS9sb2NhbC90bXAvc2lnbmF0dXJlLXRlc3QvYmxhY2tsaXN0LmFwaSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iZGFya19ncmV5bGlzdC5hcGktPi9kYXRhL2xvY2FsL3RtcC9zaWduYXR1cmUtdGVzdC9kYXJrX2dyZXlsaXN0LmFwaSIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzSGlkZGVuQXBpQmxhY2tsaXN0Q3VycmVudEFwaVRlc3RDYXNlcy5hcGsiIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkFuZHJvaWRKVW5pdFRlc3QiID4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwYWNrYWdlIiB2YWx1ZT0iYW5kcm9pZC5zaWduYXR1cmUuY3RzLmFwaS5oaWRkZW5hcGlfYmxhY2tsaXN0X2N1cnJlbnQiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVubmVyIiB2YWx1ZT0icmVwYWNrYWdlZC5hbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGFzcyIgdmFsdWU9ImFuZHJvaWQuc2lnbmF0dXJlLmN0cy5hcGkuSGlkZGVuQXBpVGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJpbnN0cnVtZW50YXRpb24tYXJnIiBrZXk9ImhpZGRlbi1hcGktZmlsZXMiIHZhbHVlPSJibGFja2xpc3QuYXBpLGRhcmtfZ3JleWxpc3QuYXBpIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjMwcyIgLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL2hpZGRlbi1hcGktYmxhY2tsaXN0LWRlYnVnLWNsYXNzL0FuZHJvaWQubWsgYi90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL2hpZGRlbi1hcGktYmxhY2tsaXN0LWRlYnVnLWNsYXNzL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y2ZDViNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svaGlkZGVuLWFwaS1ibGFja2xpc3QtZGVidWctY2xhc3MvQW5kcm9pZC5tawpAQCAtMCwwICsxLDIyIEBACisjIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0hpZGRlbkFwaUJsYWNrbGlzdERlYnVnQ2xhc3NUZXN0Q2FzZXMKK0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCitMT0NBTF9TSUdOQVRVUkVfQVBJX0ZJTEVTIDo9IGJsYWNrbGlzdC5hcGkgZGFya19ncmV5bGlzdC5hcGkKK0xPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmN0c19kZXhjaGVja2VyCitpbmNsdWRlICQoTE9DQUxfUEFUSCkvLi4vYnVpbGRfc2lnbmF0dXJlX2Fway5tawpkaWZmIC0tZ2l0IGEvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9oaWRkZW4tYXBpLWJsYWNrbGlzdC1kZWJ1Zy1jbGFzcy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9oaWRkZW4tYXBpLWJsYWNrbGlzdC1kZWJ1Zy1jbGFzcy9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ODZkZjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL2hpZGRlbi1hcGktYmxhY2tsaXN0LWRlYnVnLWNsYXNzL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICAgIHBhY2thZ2U9ImFuZHJvaWQuc2lnbmF0dXJlLmN0cy5hcGkuaGlkZGVuYXBpX2JsYWNrbGlzdF9kZWJ1Z19jbGFzcyI+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX0VYVEVSTkFMX1NUT1JBR0UiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX1BIT05FX1NUQVRFIi8+CisKKyAgICA8YXBwbGljYXRpb24vPgorCisgICAgPGluc3RydW1lbnRhdGlvbgorICAgICAgICBhbmRyb2lkOm5hbWU9InJlcGFja2FnZWQuYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5zaWduYXR1cmUuY3RzLmFwaS5oaWRkZW5hcGlfYmxhY2tsaXN0X2RlYnVnX2NsYXNzIgorICAgICAgICBhbmRyb2lkOmxhYmVsPSJIaWRkZW4gQVBJIEJsYWNrbGlzdCBUZXN0IHdpdGggRGVidWcgQ2xhc3MgRXhlbXB0Ii8+Cis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9oaWRkZW4tYXBpLWJsYWNrbGlzdC1kZWJ1Zy1jbGFzcy9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL2hpZGRlbi1hcGktYmxhY2tsaXN0LWRlYnVnLWNsYXNzL0FuZHJvaWRUZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNThjMzYyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9oaWRkZW4tYXBpLWJsYWNrbGlzdC1kZWJ1Zy1jbGFzcy9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwzOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBIaWRkZW4gQVBJIFNpZ25hdHVyZSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgorICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0ic3lzdGVtcyIgLz4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlJ1bkNvbW1hbmRUYXJnZXRQcmVwYXJlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVuLWNvbW1hbmQiIHZhbHVlPSJta2RpciAtcCAvZGF0YS9sb2NhbC90bXAvc2lnbmF0dXJlLXRlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVhcmRvd24tY29tbWFuZCIgdmFsdWU9InJtIC1yZiAvZGF0YS9sb2NhbC90bXAvc2lnbmF0dXJlLXRlc3QiIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGFyZ2V0cHJlcC5GaWxlUHVzaGVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iYmxhY2tsaXN0LmFwaS0+L2RhdGEvbG9jYWwvdG1wL3NpZ25hdHVyZS10ZXN0L2JsYWNrbGlzdC5hcGkiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9ImRhcmtfZ3JleWxpc3QuYXBpLT4vZGF0YS9sb2NhbC90bXAvc2lnbmF0dXJlLXRlc3QvZGFya19ncmV5bGlzdC5hcGkiIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0hpZGRlbkFwaUJsYWNrbGlzdERlYnVnQ2xhc3NUZXN0Q2FzZXMuYXBrIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5BbmRyb2lkSlVuaXRUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0icGFja2FnZSIgdmFsdWU9ImFuZHJvaWQuc2lnbmF0dXJlLmN0cy5hcGkuaGlkZGVuYXBpX2JsYWNrbGlzdF9kZWJ1Z19jbGFzcyIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJydW5uZXIiIHZhbHVlPSJyZXBhY2thZ2VkLmFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsYXNzIiB2YWx1ZT0iYW5kcm9pZC5zaWduYXR1cmUuY3RzLmFwaS5EZWJ1Z0NsYXNzSGlkZGVuQXBpVGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJpbnN0cnVtZW50YXRpb24tYXJnIiBrZXk9ImhpZGRlbi1hcGktZmlsZXMiIHZhbHVlPSJibGFja2xpc3QuYXBpLGRhcmtfZ3JleWxpc3QuYXBpIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjMwcyIgLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL2hpZGRlbi1hcGkta2lsbHN3aXRjaC1kZWJ1Zy1jbGFzcy9BbmRyb2lkLm1rIGIvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9oaWRkZW4tYXBpLWtpbGxzd2l0Y2gtZGVidWctY2xhc3MvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDIzNDQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9oaWRkZW4tYXBpLWtpbGxzd2l0Y2gtZGVidWctY2xhc3MvQW5kcm9pZC5tawpAQCAtMCwwICsxLDMwIEBACisjIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0hpZGRlbkFwaUtpbGxzd2l0Y2hEZWJ1Z0NsYXNzVGVzdENhc2VzCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKK0xPQ0FMX01VTFRJTElCIDo9IGJvdGgKK0xPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmN0c19kZXhjaGVja2VyIGxpYmNsYXNzZGVzY3JpcHRvcnMKK0xPQ0FMX05ES19TVExfVkFSSUFOVCA6PSBjKytfc3RhdGljCisKKyMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY3RzLWFwaS1zaWduYXR1cmUtdGVzdAorCitpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL2hpZGRlbi1hcGkta2lsbHN3aXRjaC1kZWJ1Zy1jbGFzcy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9oaWRkZW4tYXBpLWtpbGxzd2l0Y2gtZGVidWctY2xhc3MvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmQ2ODZiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9oaWRkZW4tYXBpLWtpbGxzd2l0Y2gtZGVidWctY2xhc3MvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgICAgcGFja2FnZT0iYW5kcm9pZC5zaWduYXR1cmUuY3RzLmFwaS5raWxsc3dpdGNoX2RlYnVnX2NsYXNzIj4KKworICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmRlYnVnZ2FibGU9InRydWUiLz4KKworICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJyZXBhY2thZ2VkLmFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIgorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLnNpZ25hdHVyZS5jdHMuYXBpLmtpbGxzd2l0Y2hfZGVidWdfY2xhc3MiCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJIaWRkZW4gQVBJIERlYnVnZ2FibGUgQ2xhc3MgS2lsbHN3aXRjaCBUZXN0Ii8+Cis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9oaWRkZW4tYXBpLWtpbGxzd2l0Y2gtZGVidWctY2xhc3MvQW5kcm9pZFRlc3QueG1sIGIvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9oaWRkZW4tYXBpLWtpbGxzd2l0Y2gtZGVidWctY2xhc3MvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzN2RkZTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL2hpZGRlbi1hcGkta2lsbHN3aXRjaC1kZWJ1Zy1jbGFzcy9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwzMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBIaWRkZW4gQVBJIFNpZ25hdHVyZSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgorICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0ic3lzdGVtcyIgLz4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzSGlkZGVuQXBpS2lsbHN3aXRjaERlYnVnQ2xhc3NUZXN0Q2FzZXMuYXBrIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5BbmRyb2lkSlVuaXRUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0icGFja2FnZSIgdmFsdWU9ImFuZHJvaWQuc2lnbmF0dXJlLmN0cy5hcGkua2lsbHN3aXRjaF9kZWJ1Z19jbGFzcyIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJydW5uZXIiIHZhbHVlPSJyZXBhY2thZ2VkLmFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsYXNzIiB2YWx1ZT0iYW5kcm9pZC5zaWduYXR1cmUuY3RzLmFwaS5EZWJ1Z0NsYXNzS2lsbHN3aXRjaFRlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVudGltZS1oaW50IiB2YWx1ZT0iNjBzIiAvPgorICAgIDwvdGVzdD4KKworICAgIDwhLS0gQ29udHJvbGxlciB0aGF0IHdpbGwgc2tpcCB0aGUgbW9kdWxlIGlmIGEgbmF0aXZlIGJyaWRnZSBzaXR1YXRpb24gaXMgZGV0ZWN0ZWQgLS0+CisgICAgPCEtLSBGb3IgZXhhbXBsZTogbW9kdWxlIHdhbnRzIHRvIHJ1biBhcm0zMiBhbmQgZGV2aWNlIGlzIHg4NiAtLT4KKyAgICA8b2JqZWN0IHR5cGU9Im1vZHVsZV9jb250cm9sbGVyIiBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuc3VpdGUubW9kdWxlLk5hdGl2ZUJyaWRnZU1vZHVsZUNvbnRyb2xsZXIiIC8+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL2hpZGRlbi1hcGkta2lsbHN3aXRjaC13aGl0ZWxpc3QvQW5kcm9pZC5tayBiL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svaGlkZGVuLWFwaS1raWxsc3dpdGNoLXdoaXRlbGlzdC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNjQyODYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL2hpZGRlbi1hcGkta2lsbHN3aXRjaC13aGl0ZWxpc3QvQW5kcm9pZC5tawpAQCAtMCwwICsxLDMwIEBACisjIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0hpZGRlbkFwaUtpbGxzd2l0Y2hXaGl0ZWxpc3RUZXN0Q2FzZXMKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQorTE9DQUxfTVVMVElMSUIgOj0gYm90aAorTE9DQUxfSk5JX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3RzX2RleGNoZWNrZXIgbGliY2xhc3NkZXNjcmlwdG9ycworTE9DQUxfTkRLX1NUTF9WQVJJQU5UIDo9IGMrK19zdGF0aWMKKworIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjdHMtYXBpLXNpZ25hdHVyZS10ZXN0CisKK2luY2x1ZGUgJChCVUlMRF9DVFNfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svaGlkZGVuLWFwaS1raWxsc3dpdGNoLXdoaXRlbGlzdC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9oaWRkZW4tYXBpLWtpbGxzd2l0Y2gtd2hpdGVsaXN0L0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIwMjNhZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svaGlkZGVuLWFwaS1raWxsc3dpdGNoLXdoaXRlbGlzdC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgICBwYWNrYWdlPSJhbmRyb2lkLnNpZ25hdHVyZS5jdHMuYXBpLmtpbGxzd2l0Y2hfd2hpdGVsaXN0Ij4KKworICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmRlYnVnZ2FibGU9InRydWUiLz4KKworICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJyZXBhY2thZ2VkLmFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIgorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLnNpZ25hdHVyZS5jdHMuYXBpLmtpbGxzd2l0Y2hfd2hpdGVsaXN0IgorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iSGlkZGVuIEFQSSBLaWxsc3dpdGNoIFdoaXRlbGlzdCBUZXN0Ii8+Cis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9oaWRkZW4tYXBpLWtpbGxzd2l0Y2gtd2hpdGVsaXN0L0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svaGlkZGVuLWFwaS1raWxsc3dpdGNoLXdoaXRlbGlzdC9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIwZjE2ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svaGlkZGVuLWFwaS1raWxsc3dpdGNoLXdoaXRlbGlzdC9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwzOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBIaWRkZW4gQVBJIFNpZ25hdHVyZSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgorICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0ic3lzdGVtcyIgLz4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlJ1bkNvbW1hbmRUYXJnZXRQcmVwYXJlciI+CisgICAgICAgIDwhLS0gV2hpdGVsaXN0IGFsbCBBUElzIGJlZm9yZSBydW5uaW5nIHRoZSB0ZXN0LCB0aGVuIHJlc2V0IHRoaXMgYWZ0ZXJ3YXJkcy4gVGhlIHRlc3QKKyAgICAgICAgICAgICBpcyBpbnRlbmRlZCB0byB2ZXJpZnkgdGhlIGJlaGF2aW91ciB3aGVuIGFsbCBBUElzIGFyZSB3aGl0ZWxpc3RlZC4gLS0+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVuLWNvbW1hbmQiIHZhbHVlPSJzZXR0aW5ncyBwdXQgZ2xvYmFsIGhpZGRlbl9hcGlfYmxhY2tsaXN0X2V4ZW1wdGlvbnMgTCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZWFyZG93bi1jb21tYW5kIiB2YWx1ZT0ic2V0dGluZ3MgZGVsZXRlIGdsb2JhbCBoaWRkZW5fYXBpX2JsYWNrbGlzdF9leGVtcHRpb25zIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJDdHNIaWRkZW5BcGlLaWxsc3dpdGNoV2hpdGVsaXN0VGVzdENhc2VzLmFwayIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuQW5kcm9pZEpVbml0VGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9InBhY2thZ2UiIHZhbHVlPSJhbmRyb2lkLnNpZ25hdHVyZS5jdHMuYXBpLmtpbGxzd2l0Y2hfd2hpdGVsaXN0IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bm5lciIgdmFsdWU9InJlcGFja2FnZWQuYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xhc3MiIHZhbHVlPSJhbmRyb2lkLnNpZ25hdHVyZS5jdHMuYXBpLldoaXRlbGlzdEtpbGxzd2l0Y2hUZXN0IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjYwcyIgLz4KKyAgICA8L3Rlc3Q+CisKKyAgICA8IS0tIENvbnRyb2xsZXIgdGhhdCB3aWxsIHNraXAgdGhlIG1vZHVsZSBpZiBhIG5hdGl2ZSBicmlkZ2Ugc2l0dWF0aW9uIGlzIGRldGVjdGVkIC0tPgorICAgIDwhLS0gRm9yIGV4YW1wbGU6IG1vZHVsZSB3YW50cyB0byBydW4gYXJtMzIgYW5kIGRldmljZSBpcyB4ODYgLS0+CisgICAgPG9iamVjdCB0eXBlPSJtb2R1bGVfY29udHJvbGxlciIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLnN1aXRlLm1vZHVsZS5OYXRpdmVCcmlkZ2VNb2R1bGVDb250cm9sbGVyIiAvPgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9oaWRkZW4tYXBpLWtpbGxzd2l0Y2gtd2lsZGNhcmQvQW5kcm9pZC5tayBiL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svaGlkZGVuLWFwaS1raWxsc3dpdGNoLXdpbGRjYXJkL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI3NDc2MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svaGlkZGVuLWFwaS1raWxsc3dpdGNoLXdpbGRjYXJkL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNIaWRkZW5BcGlLaWxsc3dpdGNoV2lsZGNhcmRUZXN0Q2FzZXMKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQorTE9DQUxfTVVMVElMSUIgOj0gYm90aAorTE9DQUxfSk5JX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3RzX2RleGNoZWNrZXIgbGliY2xhc3NkZXNjcmlwdG9ycworTE9DQUxfTkRLX1NUTF9WQVJJQU5UIDo9IGMrK19zdGF0aWMKKworIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjdHMtYXBpLXNpZ25hdHVyZS10ZXN0CisKK2luY2x1ZGUgJChCVUlMRF9DVFNfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svaGlkZGVuLWFwaS1raWxsc3dpdGNoLXdpbGRjYXJkL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL2hpZGRlbi1hcGkta2lsbHN3aXRjaC13aWxkY2FyZC9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZjNhY2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL2hpZGRlbi1hcGkta2lsbHN3aXRjaC13aWxkY2FyZC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgICBwYWNrYWdlPSJhbmRyb2lkLnNpZ25hdHVyZS5jdHMuYXBpLmtpbGxzd2l0Y2hfd2lsZGNhcmQiPgorCisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6ZGVidWdnYWJsZT0idHJ1ZSIvPgorCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9InJlcGFja2FnZWQuYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuc2lnbmF0dXJlLmN0cy5hcGkua2lsbHN3aXRjaF93aWxkY2FyZCIKKyAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkhpZGRlbiBBUEkgV2lsZGNhcmQgS2lsbHN3aXRjaCBUZXN0Ii8+Cis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9oaWRkZW4tYXBpLWtpbGxzd2l0Y2gtd2lsZGNhcmQvQW5kcm9pZFRlc3QueG1sIGIvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9oaWRkZW4tYXBpLWtpbGxzd2l0Y2gtd2lsZGNhcmQvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNzI2YmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL2hpZGRlbi1hcGkta2lsbHN3aXRjaC13aWxkY2FyZC9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwzOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBIaWRkZW4gQVBJIFNpZ25hdHVyZSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgorICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0ic3lzdGVtcyIgLz4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlJ1bkNvbW1hbmRUYXJnZXRQcmVwYXJlciI+CisgICAgICAgIDwhLS0gRW5hYmxlIHRoZSBraWxsc3dpdGNoIGJlZm9yZSBydW5uaW5nIHRoZSB0ZXN0LCB0aGVuIGRpc2FibGUgaXQgYWZ0ZXJ3YXJkcy4gVGhlIHRlc3QKKyAgICAgICAgICAgICBpcyBpbnRlbmRlZCB0byB2ZXJpZnkgdGhlIGJlaGF2aW91ciB3aGVuIHRoZSBraWxsc3dpdGNoIGlzIGVuYWJsZWQuIC0tPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bi1jb21tYW5kIiB2YWx1ZT0ic2V0dGluZ3MgcHV0IGdsb2JhbCBoaWRkZW5fYXBpX2JsYWNrbGlzdF9leGVtcHRpb25zIFwqIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlYXJkb3duLWNvbW1hbmQiIHZhbHVlPSJzZXR0aW5ncyBkZWxldGUgZ2xvYmFsIGhpZGRlbl9hcGlfYmxhY2tsaXN0X2V4ZW1wdGlvbnMiIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0hpZGRlbkFwaUtpbGxzd2l0Y2hXaWxkY2FyZFRlc3RDYXNlcy5hcGsiIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkFuZHJvaWRKVW5pdFRlc3QiID4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwYWNrYWdlIiB2YWx1ZT0iYW5kcm9pZC5zaWduYXR1cmUuY3RzLmFwaS5raWxsc3dpdGNoX3dpbGRjYXJkIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bm5lciIgdmFsdWU9InJlcGFja2FnZWQuYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xhc3MiIHZhbHVlPSJhbmRyb2lkLnNpZ25hdHVyZS5jdHMuYXBpLldpbGRjYXJkS2lsbHN3aXRjaFRlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVudGltZS1oaW50IiB2YWx1ZT0iNjBzIiAvPgorICAgIDwvdGVzdD4KKworICAgIDwhLS0gQ29udHJvbGxlciB0aGF0IHdpbGwgc2tpcCB0aGUgbW9kdWxlIGlmIGEgbmF0aXZlIGJyaWRnZSBzaXR1YXRpb24gaXMgZGV0ZWN0ZWQgLS0+CisgICAgPCEtLSBGb3IgZXhhbXBsZTogbW9kdWxlIHdhbnRzIHRvIHJ1biBhcm0zMiBhbmQgZGV2aWNlIGlzIHg4NiAtLT4KKyAgICA8b2JqZWN0IHR5cGU9Im1vZHVsZV9jb250cm9sbGVyIiBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuc3VpdGUubW9kdWxlLk5hdGl2ZUJyaWRnZU1vZHVsZUNvbnRyb2xsZXIiIC8+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL2xlZ2FjeS10ZXN0LTI2LWFwaS9BbmRyb2lkLm1rIGIvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9sZWdhY3ktdGVzdC0yNi1hcGkvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk5YmQwYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL2xlZ2FjeS10ZXN0LTI2LWFwaS9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0xlZ2FjeVRlc3QyNkFwaVNpZ25hdHVyZVRlc3RDYXNlcwotCi1MT0NBTF9TSUdOQVRVUkVfQVBJX0ZJTEVTIDo9IFwKLSAgICBsZWdhY3ktdGVzdC1jdXJyZW50LmFwaSBcCi0KLWluY2x1ZGUgJChMT0NBTF9QQVRIKS8uLi9idWlsZF9zaWduYXR1cmVfYXBrLm1rCmRpZmYgLS1naXQgYS90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL2xlZ2FjeS10ZXN0LTI2LWFwaS9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9sZWdhY3ktdGVzdC0yNi1hcGkvQW5kcm9pZE1hbmlmZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM2ZGZkMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL2xlZ2FjeS10ZXN0LTI2LWFwaS9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0KLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICAgIHBhY2thZ2U9ImFuZHJvaWQuc2lnbmF0dXJlLmN0cy5hcGkubGVnYWN5X3Rlc3RfMjYiPgotICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVBRF9FWFRFUk5BTF9TVE9SQUdFIiAvPgotICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVBRF9QSE9ORV9TVEFURSIvPgotCi0gICAgPHVzZXMtc2RrIGFuZHJvaWQ6bWluU2RrVmVyc2lvbj0iMjUiIGFuZHJvaWQ6dGFyZ2V0U2RrVmVyc2lvbj0iMjYiLz4KLQotICAgIDxhcHBsaWNhdGlvbi8+Ci0KLSAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0icmVwYWNrYWdlZC5hbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciIKLSAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5zaWduYXR1cmUuY3RzLmFwaS5sZWdhY3lfdGVzdF8yNiIKLSAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkxlZ2FjeSBUZXN0IDI2IEFQSSBTaWduYXR1cmUgVGVzdCIvPgotCi08L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9sZWdhY3ktdGVzdC0yNi1hcGkvQW5kcm9pZFRlc3QueG1sIGIvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9sZWdhY3ktdGVzdC0yNi1hcGkvQW5kcm9pZFRlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2IzMjk5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svbGVnYWN5LXRlc3QtMjYtYXBpL0FuZHJvaWRUZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgTGVnYWN5IFRlc3QgMjYgQVBJIFNpZ25hdHVyZSB0ZXN0IGNhc2VzIj4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9InN5c3RlbXMiIC8+Ci0gICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5SdW5Db21tYW5kVGFyZ2V0UHJlcGFyZXIiPgotICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bi1jb21tYW5kIiB2YWx1ZT0ibWtkaXIgLXAgL2RhdGEvbG9jYWwvdG1wL3NpZ25hdHVyZS10ZXN0IiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9InRlYXJkb3duLWNvbW1hbmQiIHZhbHVlPSJybSAtcmYgL2RhdGEvbG9jYWwvdG1wL3NpZ25hdHVyZS10ZXN0IiAvPgotICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgotICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRhcmdldHByZXAuRmlsZVB1c2hlciI+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9ImxlZ2FjeS10ZXN0LWN1cnJlbnQuYXBpLT4vZGF0YS9sb2NhbC90bXAvc2lnbmF0dXJlLXRlc3QvbGVnYWN5LXRlc3QtY3VycmVudC5hcGkiIC8+Ci0gICAgPC90YXJnZXRfcHJlcGFyZXI+Ci0gICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0xlZ2FjeVRlc3QyNkFwaVNpZ25hdHVyZVRlc3RDYXNlcy5hcGsiIC8+Ci0gICAgPC90YXJnZXRfcHJlcGFyZXI+Ci0gICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkFuZHJvaWRKVW5pdFRlc3QiID4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJwYWNrYWdlIiB2YWx1ZT0iYW5kcm9pZC5zaWduYXR1cmUuY3RzLmFwaS5sZWdhY3lfdGVzdF8yNiIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJydW5uZXIiIHZhbHVlPSJyZXBhY2thZ2VkLmFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9Imluc3RydW1lbnRhdGlvbi1hcmciIGtleT0iZXhwZWN0ZWQtYXBpLWZpbGVzIiB2YWx1ZT0ibGVnYWN5LXRlc3QtY3VycmVudC5hcGkiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0icnVudGltZS1oaW50IiB2YWx1ZT0iNXMiIC8+Ci0gICAgPC90ZXN0PgotPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9zcmMvYW5kcm9pZC9zaWduYXR1cmUvY3RzL2FwaS9TaWduYXR1cmVUZXN0LmphdmEgYi90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL3NyYy9hbmRyb2lkL3NpZ25hdHVyZS9jdHMvYXBpL1NpZ25hdHVyZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ3M2NmZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL3NyYy9hbmRyb2lkL3NpZ25hdHVyZS9jdHMvYXBpL1NpZ25hdHVyZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnNpZ25hdHVyZS5jdHMuYXBpOwotCi1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5zaWduYXR1cmUuY3RzLkFwaURvY3VtZW50UGFyc2VyOwotaW1wb3J0IGFuZHJvaWQuc2lnbmF0dXJlLmN0cy5BcGlDb21wbGlhbmNlQ2hlY2tlcjsKLWltcG9ydCBhbmRyb2lkLnNpZ25hdHVyZS5jdHMuRmFpbHVyZVR5cGU7Ci1pbXBvcnQgYW5kcm9pZC5zaWduYXR1cmUuY3RzLkpEaWZmQ2xhc3NEZXNjcmlwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnNpZ25hdHVyZS5jdHMuUmVmbGVjdGlvbkhlbHBlcjsKLWltcG9ydCBhbmRyb2lkLnNpZ25hdHVyZS5jdHMuUmVzdWx0T2JzZXJ2ZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLWltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOwotaW1wb3J0IHJlcGFja2FnZWQuYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RDYXNlOwotaW1wb3J0IHJlcGFja2FnZWQuYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXI7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5zaWduYXR1cmUuY3RzLkN1cnJlbnRBcGkuQVBJX0ZJTEVfRElSRUNUT1JZOwotCi0vKioKLSAqIFBlcmZvcm1zIHRoZSBzaWduYXR1cmUgY2hlY2sgdmlhIGEgSlVuaXQgdGVzdC4KLSAqLwotcHVibGljIGNsYXNzIFNpZ25hdHVyZVRlc3QgZXh0ZW5kcyBJbnN0cnVtZW50YXRpb25UZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gU2lnbmF0dXJlVGVzdC5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBBIHNldCBvZiBjbGFzcyBuYW1lcyB0aGF0IGFyZSBpbmFjY2Vzc2libGUgZm9yIHNvbWUgcmVhc29uLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IEtOT1dOX0lOQUNDRVNTSUJMRV9DTEFTU0VTID0gbmV3IEhhc2hTZXQ8PigpOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgLy8gVE9ETyhiLzYzMzgzNzg3KSAtIFRoZXNlIGNsYXNzZXMsIHdoaWNoIGFyZSBuZXN0ZWQgYW5ub3RhdGlvbnMgd2l0aCBAUmV0ZW50aW9uKFNPVVJDRSkKLSAgICAgICAgLy8gYXJlIHJlbW92ZWQgZnJvbSBmcmFtZXdvcmsuZGV4IGZvciBhbiBhcyB5ZXQgdW5rbm93biByZWFzb24uCi0gICAgICAgIEtOT1dOX0lOQUNDRVNTSUJMRV9DTEFTU0VTLmFkZCgiYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLlBlcm1pc3Npb25GbGFncyIpOwotICAgICAgICBLTk9XTl9JTkFDQ0VTU0lCTEVfQ0xBU1NFUy5hZGQoImFuZHJvaWQuaGFyZHdhcmUucmFkaW8uUHJvZ3JhbVNlbGVjdG9yLklkZW50aWZpZXJUeXBlIik7Ci0gICAgICAgIEtOT1dOX0lOQUNDRVNTSUJMRV9DTEFTU0VTLmFkZCgiYW5kcm9pZC5oYXJkd2FyZS5yYWRpby5Qcm9ncmFtU2VsZWN0b3IuUHJvZ3JhbVR5cGUiKTsKLSAgICAgICAgS05PV05fSU5BQ0NFU1NJQkxFX0NMQVNTRVMuYWRkKCJhbmRyb2lkLmhhcmR3YXJlLnJhZGlvLlJhZGlvTWFuYWdlci5CYW5kIik7Ci0gICAgICAgIEtOT1dOX0lOQUNDRVNTSUJMRV9DTEFTU0VTLmFkZCgiYW5kcm9pZC5vcy5Vc2VyTWFuYWdlci5Vc2VyUmVzdHJpY3Rpb25Tb3VyY2UiKTsKLSAgICAgICAgS05PV05fSU5BQ0NFU1NJQkxFX0NMQVNTRVMuYWRkKAotICAgICAgICAgICAgICAgICJhbmRyb2lkLnNlcnZpY2UucGVyc2lzdGVudGRhdGEuUGVyc2lzdGVudERhdGFCbG9ja01hbmFnZXIuRmxhc2hMb2NrU3RhdGUiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFRlc3RSZXN1bHRPYnNlcnZlciBtUmVzdWx0T2JzZXJ2ZXI7Ci0KLSAgICBwcml2YXRlIFN0cmluZ1tdIGV4cGVjdGVkQXBpRmlsZXM7Ci0gICAgcHJpdmF0ZSBTdHJpbmdbXSB1bmV4cGVjdGVkQXBpRmlsZXM7Ci0KLSAgICBwcml2YXRlIGNsYXNzIFRlc3RSZXN1bHRPYnNlcnZlciBpbXBsZW1lbnRzIFJlc3VsdE9ic2VydmVyIHsKLQotICAgICAgICBib29sZWFuIG1EaWRGYWlsID0gZmFsc2U7Ci0KLSAgICAgICAgU3RyaW5nQnVpbGRlciBtRXJyb3JTdHJpbmcgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBub3RpZnlGYWlsdXJlKEZhaWx1cmVUeXBlIHR5cGUsIFN0cmluZyBuYW1lLCBTdHJpbmcgZXJyb3JNZXNzYWdlKSB7Ci0gICAgICAgICAgICBtRGlkRmFpbCA9IHRydWU7Ci0gICAgICAgICAgICBtRXJyb3JTdHJpbmcuYXBwZW5kKCJcbiIpOwotICAgICAgICAgICAgbUVycm9yU3RyaW5nLmFwcGVuZCh0eXBlLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSk7Ci0gICAgICAgICAgICBtRXJyb3JTdHJpbmcuYXBwZW5kKCI6XHQiKTsKLSAgICAgICAgICAgIG1FcnJvclN0cmluZy5hcHBlbmQobmFtZSk7Ci0gICAgICAgICAgICBtRXJyb3JTdHJpbmcuYXBwZW5kKCJcdEVycm9yOiAiKTsKLSAgICAgICAgICAgIG1FcnJvclN0cmluZy5hcHBlbmQoZXJyb3JNZXNzYWdlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIG1SZXN1bHRPYnNlcnZlciA9IG5ldyBUZXN0UmVzdWx0T2JzZXJ2ZXIoKTsKLQotICAgICAgICAvLyBHZXQgdGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGluc3RydW1lbnRhdGlvbi4KLSAgICAgICAgQnVuZGxlIGluc3RydW1lbnRhdGlvbkFyZ3MgPQotICAgICAgICAgICAgICAgICgoSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcikgZ2V0SW5zdHJ1bWVudGF0aW9uKCkpLmdldEFyZ3VtZW50cygpOwotCi0gICAgICAgIGV4cGVjdGVkQXBpRmlsZXMgPSBnZXRDb21tYVNlcGFyYXRlZExpc3QoaW5zdHJ1bWVudGF0aW9uQXJncywgImV4cGVjdGVkLWFwaS1maWxlcyIpOwotICAgICAgICB1bmV4cGVjdGVkQXBpRmlsZXMgPSBnZXRDb21tYVNlcGFyYXRlZExpc3QoaW5zdHJ1bWVudGF0aW9uQXJncywgInVuZXhwZWN0ZWQtYXBpLWZpbGVzIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBnZXRDb21tYVNlcGFyYXRlZExpc3QoQnVuZGxlIGluc3RydW1lbnRhdGlvbkFyZ3MsIFN0cmluZyBrZXkpIHsKLSAgICAgICAgU3RyaW5nIGFyZ3VtZW50ID0gaW5zdHJ1bWVudGF0aW9uQXJncy5nZXRTdHJpbmcoa2V5KTsKLSAgICAgICAgaWYgKGFyZ3VtZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nWzBdOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhcmd1bWVudC5zcGxpdCgiLCIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoYXQgdGhlIGRldmljZSdzIEFQSSBtYXRjaGVzIHRoZSBleHBlY3RlZCBzZXQgZGVmaW5lZCBpbiB4bWwuCi0gICAgICogPHAvPgotICAgICAqIFdpbGwgY2hlY2sgdGhlIGVudGlyZSBBUEksIGFuZCB0aGVuIHJlcG9ydCB0aGUgY29tcGxldGUgbGlzdCBvZiBmYWlsdXJlcwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTaWduYXR1cmUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTZXQ8SkRpZmZDbGFzc0Rlc2NyaXB0aW9uPiB1bmV4cGVjdGVkQ2xhc3NlcyA9IGxvYWRVbmV4cGVjdGVkQ2xhc3NlcygpOwotICAgICAgICAgICAgZm9yIChKRGlmZkNsYXNzRGVzY3JpcHRpb24gY2xhc3NEZXNjcmlwdGlvbiA6IHVuZXhwZWN0ZWRDbGFzc2VzKSB7Ci0gICAgICAgICAgICAgICAgQ2xhc3M8Pz4gdW5leHBlY3RlZENsYXNzID0gZmluZFVuZXhwZWN0ZWRDbGFzcyhjbGFzc0Rlc2NyaXB0aW9uKTsKLSAgICAgICAgICAgICAgICBpZiAodW5leHBlY3RlZENsYXNzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVJlc3VsdE9ic2VydmVyLm5vdGlmeUZhaWx1cmUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFpbHVyZVR5cGUuVU5FWFBFQ1RFRF9DTEFTUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc0Rlc2NyaXB0aW9uLmdldEFic29sdXRlQ2xhc3NOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNsYXNzIHNob3VsZCBub3QgYmUgYWNjZXNzaWJsZSB0byB0aGlzIEFQSyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQXBpQ29tcGxpYW5jZUNoZWNrZXIgY29tcGxpYW5jZUNoZWNrZXIgPSBuZXcgQXBpQ29tcGxpYW5jZUNoZWNrZXIobVJlc3VsdE9ic2VydmVyKTsKLSAgICAgICAgICAgIEFwaURvY3VtZW50UGFyc2VyIGFwaURvY3VtZW50UGFyc2VyID0gbmV3IEFwaURvY3VtZW50UGFyc2VyKAotICAgICAgICAgICAgICAgICAgICBUQUcsIG5ldyBBcGlEb2N1bWVudFBhcnNlci5MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBjb21wbGV0ZWRDbGFzcyhKRGlmZkNsYXNzRGVzY3JpcHRpb24gY2xhc3NEZXNjcmlwdGlvbikgewotICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgY2xhc3NlcyB0aGF0IGFyZSBrbm93biB0byBiZSBpbmFjY2Vzc2libGUuCi0gICAgICAgICAgICAgICAgICAgIGlmIChLTk9XTl9JTkFDQ0VTU0lCTEVfQ0xBU1NFUy5jb250YWlucyhjbGFzc0Rlc2NyaXB0aW9uLmdldEFic29sdXRlQ2xhc3NOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgdW5leHBlY3RlZCBjbGFzc2VzIHRoYXQgYXJlIGluIHRoZSBBUEkgZGVmaW5pdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgaWYgKCF1bmV4cGVjdGVkQ2xhc3Nlcy5jb250YWlucyhjbGFzc0Rlc2NyaXB0aW9uKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxpYW5jZUNoZWNrZXIuY2hlY2tTaWduYXR1cmVDb21wbGlhbmNlKGNsYXNzRGVzY3JpcHRpb24pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGV4cGVjdGVkQXBpRmlsZSA6IGV4cGVjdGVkQXBpRmlsZXMpIHsKLSAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShBUElfRklMRV9ESVJFQ1RPUlkgKyAiLyIgKyBleHBlY3RlZEFwaUZpbGUpOwotICAgICAgICAgICAgICAgIGFwaURvY3VtZW50UGFyc2VyLnBhcnNlKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbVJlc3VsdE9ic2VydmVyLm5vdGlmeUZhaWx1cmUoRmFpbHVyZVR5cGUuQ0FVR0hUX0VYQ0VQVElPTiwgZS5nZXRNZXNzYWdlKCksCi0gICAgICAgICAgICAgICAgICAgIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobVJlc3VsdE9ic2VydmVyLm1EaWRGYWlsKSB7Ci0gICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGVycm9yU3RyaW5nID0gbVJlc3VsdE9ic2VydmVyLm1FcnJvclN0cmluZzsKLSAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOwotICAgICAgICAgICAgZXJyb3JTdHJpbmcuYXBwZW5kKCJcbkNsYXNzTG9hZGVyIGhpZXJhcmNoeVxuIik7Ci0gICAgICAgICAgICB3aGlsZSAoY2xhc3NMb2FkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGVycm9yU3RyaW5nLmFwcGVuZCgiICAgICIpLmFwcGVuZChjbGFzc0xvYWRlcikuYXBwZW5kKCJcbiIpOwotICAgICAgICAgICAgICAgIGNsYXNzTG9hZGVyID0gY2xhc3NMb2FkZXIuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmYWlsKGVycm9yU3RyaW5nLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDbGFzczw/PiBmaW5kVW5leHBlY3RlZENsYXNzKEpEaWZmQ2xhc3NEZXNjcmlwdGlvbiBjbGFzc0Rlc2NyaXB0aW9uKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gUmVmbGVjdGlvbkhlbHBlci5maW5kTWF0Y2hpbmdDbGFzcyhjbGFzc0Rlc2NyaXB0aW9uKTsKLSAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU2V0PEpEaWZmQ2xhc3NEZXNjcmlwdGlvbj4gbG9hZFVuZXhwZWN0ZWRDbGFzc2VzKCkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU2V0PEpEaWZmQ2xhc3NEZXNjcmlwdGlvbj4gdW5leHBlY3RlZENsYXNzZXMgPSBuZXcgVHJlZVNldDw+KAotICAgICAgICAgICAgICAgIENvbXBhcmF0b3IuY29tcGFyaW5nKEpEaWZmQ2xhc3NEZXNjcmlwdGlvbjo6Z2V0QWJzb2x1dGVDbGFzc05hbWUpKTsKLSAgICAgICAgQXBpRG9jdW1lbnRQYXJzZXIgYXBpRG9jdW1lbnRQYXJzZXIgPSBuZXcgQXBpRG9jdW1lbnRQYXJzZXIoVEFHLAotICAgICAgICAgICAgICAgIG5ldyBBcGlEb2N1bWVudFBhcnNlci5MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbXBsZXRlZENsYXNzKEpEaWZmQ2xhc3NEZXNjcmlwdGlvbiBjbGFzc0Rlc2NyaXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkQ2xhc3Nlcy5hZGQoY2xhc3NEZXNjcmlwdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgZm9yIChTdHJpbmcgZXhwZWN0ZWRBcGlGaWxlIDogdW5leHBlY3RlZEFwaUZpbGVzKSB7Ci0gICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShBUElfRklMRV9ESVJFQ1RPUlkgKyAiLyIgKyBleHBlY3RlZEFwaUZpbGUpOwotICAgICAgICAgICAgYXBpRG9jdW1lbnRQYXJzZXIucGFyc2UobmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHVuZXhwZWN0ZWRDbGFzc2VzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svc3JjL2phdmEvYW5kcm9pZC9zaWduYXR1cmUvY3RzL2FwaS9BYnN0cmFjdEFwaVRlc3QuamF2YSBiL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svc3JjL2phdmEvYW5kcm9pZC9zaWduYXR1cmUvY3RzL2FwaS9BYnN0cmFjdEFwaVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTRlZjgwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9zcmMvamF2YS9hbmRyb2lkL3NpZ25hdHVyZS9jdHMvYXBpL0Fic3RyYWN0QXBpVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5zaWduYXR1cmUuY3RzLmFwaTsKKworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQuc2lnbmF0dXJlLmN0cy5BcGlEb2N1bWVudFBhcnNlcjsKK2ltcG9ydCBhbmRyb2lkLnNpZ25hdHVyZS5jdHMuQ2xhc3NQcm92aWRlcjsKK2ltcG9ydCBhbmRyb2lkLnNpZ25hdHVyZS5jdHMuRXhjbHVkaW5nQ2xhc3NQcm92aWRlcjsKK2ltcG9ydCBhbmRyb2lkLnNpZ25hdHVyZS5jdHMuRmFpbHVyZVR5cGU7CitpbXBvcnQgYW5kcm9pZC5zaWduYXR1cmUuY3RzLkpEaWZmQ2xhc3NEZXNjcmlwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7CitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKK2ltcG9ydCByZXBhY2thZ2VkLmFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0Q2FzZTsKK2ltcG9ydCByZXBhY2thZ2VkLmFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2lnbmF0dXJlLmN0cy5DdXJyZW50QXBpLkFQSV9GSUxFX0RJUkVDVE9SWTsKKworLyoqCisgKi8KK3B1YmxpYyBjbGFzcyBBYnN0cmFjdEFwaVRlc3QgZXh0ZW5kcyBJbnN0cnVtZW50YXRpb25UZXN0Q2FzZSB7CisKKyAgICAvKioKKyAgICAgKiBBIHNldCBvZiBjbGFzcyBuYW1lcyB0aGF0IGFyZSBpbmFjY2Vzc2libGUgZm9yIHNvbWUgcmVhc29uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IEtOT1dOX0lOQUNDRVNTSUJMRV9DTEFTU0VTID0gbmV3IEhhc2hTZXQ8PigpOworCisgICAgc3RhdGljIHsKKyAgICAgICAgLy8gVE9ETyhiLzYzMzgzNzg3KSAtIFRoZXNlIGNsYXNzZXMsIHdoaWNoIGFyZSBuZXN0ZWQgYW5ub3RhdGlvbnMgd2l0aCBAUmV0ZW50aW9uKFNPVVJDRSkKKyAgICAgICAgLy8gYXJlIHJlbW92ZWQgZnJvbSBmcmFtZXdvcmsuZGV4IGZvciBhbiBhcyB5ZXQgdW5rbm93biByZWFzb24uCisgICAgICAgIEtOT1dOX0lOQUNDRVNTSUJMRV9DTEFTU0VTLmFkZCgiYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLlBlcm1pc3Npb25GbGFncyIpOworICAgICAgICBLTk9XTl9JTkFDQ0VTU0lCTEVfQ0xBU1NFUy5hZGQoImFuZHJvaWQuaGFyZHdhcmUucmFkaW8uUHJvZ3JhbVNlbGVjdG9yLklkZW50aWZpZXJUeXBlIik7CisgICAgICAgIEtOT1dOX0lOQUNDRVNTSUJMRV9DTEFTU0VTLmFkZCgiYW5kcm9pZC5oYXJkd2FyZS5yYWRpby5Qcm9ncmFtU2VsZWN0b3IuUHJvZ3JhbVR5cGUiKTsKKyAgICAgICAgS05PV05fSU5BQ0NFU1NJQkxFX0NMQVNTRVMuYWRkKCJhbmRyb2lkLmhhcmR3YXJlLnJhZGlvLlJhZGlvTWFuYWdlci5CYW5kIik7CisgICAgICAgIEtOT1dOX0lOQUNDRVNTSUJMRV9DTEFTU0VTLmFkZCgiYW5kcm9pZC5vcy5Vc2VyTWFuYWdlci5Vc2VyUmVzdHJpY3Rpb25Tb3VyY2UiKTsKKyAgICAgICAgS05PV05fSU5BQ0NFU1NJQkxFX0NMQVNTRVMuYWRkKAorICAgICAgICAgICAgICAgICJhbmRyb2lkLnNlcnZpY2UucGVyc2lzdGVudGRhdGEuUGVyc2lzdGVudERhdGFCbG9ja01hbmFnZXIuRmxhc2hMb2NrU3RhdGUiKTsKKyAgICAgICAgS05PV05fSU5BQ0NFU1NJQkxFX0NMQVNTRVMuYWRkKCJhbmRyb2lkLmhhcmR3YXJlLnJhZGlvLlByb2dyYW1TZWxlY3Rvci5JZGVudGlmaWVyVHlwZSIpOworICAgICAgICBLTk9XTl9JTkFDQ0VTU0lCTEVfQ0xBU1NFUy5hZGQoImFuZHJvaWQuaGFyZHdhcmUucmFkaW8uUHJvZ3JhbVNlbGVjdG9yLlByb2dyYW1UeXBlIik7CisgICAgICAgIEtOT1dOX0lOQUNDRVNTSUJMRV9DTEFTU0VTLmFkZCgiYW5kcm9pZC5oYXJkd2FyZS5yYWRpby5SYWRpb01hbmFnZXIuQmFuZCIpOworICAgIH0KKworICAgIHByaXZhdGUgVGVzdFJlc3VsdE9ic2VydmVyIG1SZXN1bHRPYnNlcnZlcjsKKworICAgIENsYXNzUHJvdmlkZXIgY2xhc3NQcm92aWRlcjsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgIG1SZXN1bHRPYnNlcnZlciA9IG5ldyBUZXN0UmVzdWx0T2JzZXJ2ZXIoKTsKKworICAgICAgICAvLyBHZXQgdGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGluc3RydW1lbnRhdGlvbi4KKyAgICAgICAgQnVuZGxlIGluc3RydW1lbnRhdGlvbkFyZ3MgPQorICAgICAgICAgICAgICAgICgoSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcikgZ2V0SW5zdHJ1bWVudGF0aW9uKCkpLmdldEFyZ3VtZW50cygpOworCisgICAgICAgIC8vIFByZXBhcmUgZm9yIGEgY2xhc3MgcHJvdmlkZXIgdGhhdCBsb2FkcyBjbGFzc2VzIGZyb20gYm9vdGNsYXNzcGF0aCBidXQgZmlsdGVycworICAgICAgICAvLyBvdXQga25vd24gaW5hY2Nlc3NpYmxlIGNsYXNzZXMuCisgICAgICAgIC8vIE5vdGUgdGhhdCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLiogaW5uZXIgY2xhc3NlcyBhcmUgYWxzbyBleGNsdWRlZCBhcyB0aGV5IGFyZQorICAgICAgICAvLyBub3QgcGFydCBvZiBBUEkgdGhvdWdoIGV4aXN0IGluIHRoZSBydW50aW1lLgorICAgICAgICBjbGFzc1Byb3ZpZGVyID0gbmV3IEV4Y2x1ZGluZ0NsYXNzUHJvdmlkZXIoCisgICAgICAgICAgICAgICAgbmV3IEJvb3RDbGFzc1BhdGhDbGFzc2VzUHJvdmlkZXIoKSwKKyAgICAgICAgICAgICAgICBuYW1lIC0+IEtOT1dOX0lOQUNDRVNTSUJMRV9DTEFTU0VTLmNvbnRhaW5zKG5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAobmFtZSAhPSBudWxsICYmIG5hbWUuc3RhcnRzV2l0aCgiY29tLmFuZHJvaWQuaW50ZXJuYWwuUi4iKSkpOworCisKKyAgICAgICAgaW5pdGlhbGl6ZUZyb21BcmdzKGluc3RydW1lbnRhdGlvbkFyZ3MpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVGcm9tQXJncyhCdW5kbGUgaW5zdHJ1bWVudGF0aW9uQXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQWNjZXNzaWJsZUNsYXNzKEpEaWZmQ2xhc3NEZXNjcmlwdGlvbiBjbGFzc0Rlc2NyaXB0aW9uKSB7CisgICAgICAgIC8vIElnbm9yZSBjbGFzc2VzIHRoYXQgYXJlIGtub3duIHRvIGJlIGluYWNjZXNzaWJsZS4KKyAgICAgICAgcmV0dXJuICFLTk9XTl9JTkFDQ0VTU0lCTEVfQ0xBU1NFUy5jb250YWlucyhjbGFzc0Rlc2NyaXB0aW9uLmdldEFic29sdXRlQ2xhc3NOYW1lKCkpOworICAgIH0KKworICAgIHByb3RlY3RlZCBpbnRlcmZhY2UgUnVubmFibGVXaXRoVGVzdFJlc3VsdE9ic2VydmVyIHsKKyAgICAgICAgdm9pZCBydW4oVGVzdFJlc3VsdE9ic2VydmVyIG9ic2VydmVyKSB0aHJvd3MgRXhjZXB0aW9uOworICAgIH0KKworICAgIHZvaWQgcnVuV2l0aFRlc3RSZXN1bHRPYnNlcnZlcihSdW5uYWJsZVdpdGhUZXN0UmVzdWx0T2JzZXJ2ZXIgcnVubmFibGUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJ1bm5hYmxlLnJ1bihtUmVzdWx0T2JzZXJ2ZXIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgICAgIHdyaXRlci53cml0ZShlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgd3JpdGVyLndyaXRlKCJcbiIpOworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UobmV3IFByaW50V3JpdGVyKHdyaXRlcikpOworICAgICAgICAgICAgbVJlc3VsdE9ic2VydmVyLm5vdGlmeUZhaWx1cmUoRmFpbHVyZVR5cGUuQ0FVR0hUX0VYQ0VQVElPTiwgZS5nZXRDbGFzcygpLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChtUmVzdWx0T2JzZXJ2ZXIubURpZEZhaWwpIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgZXJyb3JTdHJpbmcgPSBtUmVzdWx0T2JzZXJ2ZXIubUVycm9yU3RyaW5nOworICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7CisgICAgICAgICAgICBlcnJvclN0cmluZy5hcHBlbmQoIlxuQ2xhc3NMb2FkZXIgaGllcmFyY2h5XG4iKTsKKyAgICAgICAgICAgIHdoaWxlIChjbGFzc0xvYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZXJyb3JTdHJpbmcuYXBwZW5kKCIgICAgIikuYXBwZW5kKGNsYXNzTG9hZGVyKS5hcHBlbmQoIlxuIik7CisgICAgICAgICAgICAgICAgY2xhc3NMb2FkZXIgPSBjbGFzc0xvYWRlci5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZhaWwoZXJyb3JTdHJpbmcudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgU3RyaW5nW10gZ2V0Q29tbWFTZXBhcmF0ZWRMaXN0KEJ1bmRsZSBpbnN0cnVtZW50YXRpb25BcmdzLCBTdHJpbmcga2V5KSB7CisgICAgICAgIFN0cmluZyBhcmd1bWVudCA9IGluc3RydW1lbnRhdGlvbkFyZ3MuZ2V0U3RyaW5nKGtleSk7CisgICAgICAgIGlmIChhcmd1bWVudCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYXJndW1lbnQuc3BsaXQoIiwiKTsKKyAgICB9CisKKyAgICBzdGF0aWMgU3RyZWFtPElucHV0U3RyZWFtPiByZWFkRmlsZShGaWxlIGZpbGUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChmaWxlLmdldE5hbWUoKS5lbmRzV2l0aCgiLnppcCIpKSB7CisgICAgICAgICAgICAgICAgWmlwRmlsZSB6aXAgPSBuZXcgWmlwRmlsZShmaWxlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gemlwLnN0cmVhbSgpLm1hcChlbnRyeSAtPiB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gemlwLmdldElucHV0U3RyZWFtKGVudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICAgICAgICAgIH19KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmVhbS5vZihuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgU3RyZWFtPEpEaWZmQ2xhc3NEZXNjcmlwdGlvbj4gcGFyc2VBcGlGaWxlc0FzU3RyZWFtKAorICAgICAgICAgICAgQXBpRG9jdW1lbnRQYXJzZXIgYXBpRG9jdW1lbnRQYXJzZXIsIFN0cmluZ1tdIGFwaUZpbGVzKQorICAgICAgICAgICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIFN0cmVhbS5vZihhcGlGaWxlcykKKyAgICAgICAgICAgICAgICAubWFwKG5hbWUgLT4gbmV3IEZpbGUoQVBJX0ZJTEVfRElSRUNUT1JZICsgIi8iICsgbmFtZSkpCisgICAgICAgICAgICAgICAgLmZsYXRNYXAoZmlsZSAtPiByZWFkRmlsZShmaWxlKSkKKyAgICAgICAgICAgICAgICAuZmxhdE1hcChzdHJlYW0gLT4geworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFwaURvY3VtZW50UGFyc2VyLnBhcnNlQXNTdHJlYW0oc3RyZWFtKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihBYnN0cmFjdEFwaVRlc3Q6OmlzQWNjZXNzaWJsZUNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gfCBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9zcmMvamF2YS9hbmRyb2lkL3NpZ25hdHVyZS9jdHMvYXBpL0Jhc2VLaWxsc3dpdGNoVGVzdC5qYXZhIGIvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9zcmMvamF2YS9hbmRyb2lkL3NpZ25hdHVyZS9jdHMvYXBpL0Jhc2VLaWxsc3dpdGNoVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3YTViNzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL3NyYy9qYXZhL2FuZHJvaWQvc2lnbmF0dXJlL2N0cy9hcGkvQmFzZUtpbGxzd2l0Y2hUZXN0LmphdmEKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2lnbmF0dXJlLmN0cy5hcGk7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOworaW1wb3J0IGFuZHJvaWQuc2lnbmF0dXJlLmN0cy5EZXhBcGlEb2N1bWVudFBhcnNlcjsKK2ltcG9ydCBhbmRyb2lkLnNpZ25hdHVyZS5jdHMuRGV4RmllbGQ7CitpbXBvcnQgYW5kcm9pZC5zaWduYXR1cmUuY3RzLkRleE1lbWJlcjsKK2ltcG9ydCBhbmRyb2lkLnNpZ25hdHVyZS5jdHMuRGV4TWVtYmVyQ2hlY2tlcjsKK2ltcG9ydCBhbmRyb2lkLnNpZ25hdHVyZS5jdHMuRGV4TWV0aG9kOworaW1wb3J0IGFuZHJvaWQuc2lnbmF0dXJlLmN0cy5GYWlsdXJlVHlwZTsKK2ltcG9ydCByZXBhY2thZ2VkLmFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZUtpbGxzd2l0Y2hUZXN0IGV4dGVuZHMgQWJzdHJhY3RBcGlUZXN0IHsKKworICAgIHByb3RlY3RlZCBTdHJpbmcgbUVycm9yTWVzc2FnZUFwcGVuZGl4OworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgRGV4TWVtYmVyQ2hlY2tlci5pbml0KCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRHbG9iYWxFeGVtcHRpb25zKCkgeworICAgICAgcmV0dXJuIFNldHRpbmdzLkdsb2JhbC5nZXRTdHJpbmcoCisgICAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0Q29udGV4dCgpLmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgIFNldHRpbmdzLkdsb2JhbC5ISURERU5fQVBJX0JMQUNLTElTVF9FWEVNUFRJT05TKTsKKyAgICB9CisKKyAgICAvLyBUZXN0IHNoYXJlZCBieSBhbGwgdGhlIHN1YmNsYXNzZXMuCisgICAgcHVibGljIHZvaWQgdGVzdEtpbGxzd2l0Y2hNZWNoYW5pc20oKSB7CisgICAgICAgIHJ1bldpdGhUZXN0UmVzdWx0T2JzZXJ2ZXIocmVzdWx0T2JzZXJ2ZXIgLT4geworICAgICAgICAgICAgRGV4TWVtYmVyQ2hlY2tlci5PYnNlcnZlciBvYnNlcnZlciA9IG5ldyBEZXhNZW1iZXJDaGVja2VyLk9ic2VydmVyKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNsYXNzQWNjZXNzaWJsZShib29sZWFuIGFjY2Vzc2libGUsIERleE1lbWJlciBtZW1iZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFhY2Nlc3NpYmxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRPYnNlcnZlci5ub3RpZnlGYWlsdXJlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWlsdXJlVHlwZS5NSVNTSU5HX0NMQVNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXIudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNsYXNzIGZyb20gYm9vdCBjbGFzc3BhdGggaXMgbm90IGFjY2Vzc2libGUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtRXJyb3JNZXNzYWdlQXBwZW5kaXgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZmllbGRBY2Nlc3NpYmxlVmlhUmVmbGVjdGlvbihib29sZWFuIGFjY2Vzc2libGUsIERleEZpZWxkIGZpZWxkKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYWNjZXNzaWJsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0T2JzZXJ2ZXIubm90aWZ5RmFpbHVyZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFpbHVyZVR5cGUuTUlTU0lOR19GSUVMRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZWxkIGZyb20gYm9vdCBjbGFzc3BhdGggaXMgbm90IGFjY2Vzc2libGUgdmlhIHJlZmxlY3Rpb24iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtRXJyb3JNZXNzYWdlQXBwZW5kaXgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZmllbGRBY2Nlc3NpYmxlVmlhSm5pKGJvb2xlYW4gYWNjZXNzaWJsZSwgRGV4RmllbGQgZmllbGQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFhY2Nlc3NpYmxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRPYnNlcnZlci5ub3RpZnlGYWlsdXJlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWlsdXJlVHlwZS5NSVNTSU5HX0ZJRUxELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmllbGQgZnJvbSBib290IGNsYXNzcGF0aCBpcyBub3QgYWNjZXNzaWJsZSB2aWEgSk5JIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUVycm9yTWVzc2FnZUFwcGVuZGl4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1ldGhvZEFjY2Vzc2libGVWaWFSZWZsZWN0aW9uKGJvb2xlYW4gYWNjZXNzaWJsZSwgRGV4TWV0aG9kIG1ldGhvZCkgeworICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kLmlzU3RhdGljQ29uc3RydWN0b3IoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCBzdGF0aWMgY29uc3RydWN0b3JzLiBUaGV5IGNhbm5vdCBiZSBkaXNjb3ZlcmVkIHdpdGggcmVmbGVjdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICghYWNjZXNzaWJsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0T2JzZXJ2ZXIubm90aWZ5RmFpbHVyZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFpbHVyZVR5cGUuTUlTU0lOR19NRVRIT0QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZC50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWV0aG9kIGZyb20gYm9vdCBjbGFzc3BhdGggaXMgbm90IGFjY2Vzc2libGUgdmlhIHJlZmxlY3Rpb24iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtRXJyb3JNZXNzYWdlQXBwZW5kaXgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgbWV0aG9kQWNjZXNzaWJsZVZpYUpuaShib29sZWFuIGFjY2Vzc2libGUsIERleE1ldGhvZCBtZXRob2QpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFhY2Nlc3NpYmxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRPYnNlcnZlci5ub3RpZnlGYWlsdXJlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWlsdXJlVHlwZS5NSVNTSU5HX01FVEhPRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNZXRob2QgZnJvbSBib290IGNsYXNzcGF0aCBpcyBub3QgYWNjZXNzaWJsZSB2aWEgSk5JIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUVycm9yTWVzc2FnZUFwcGVuZGl4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGNsYXNzUHJvdmlkZXIuZ2V0QWxsQ2xhc3NlcygpLmZvckVhY2goa2xhc3MgLT4geworICAgICAgICAgICAgICAgIGNsYXNzUHJvdmlkZXIuZ2V0QWxsTWVtYmVycyhrbGFzcykuZm9yRWFjaChtZW1iZXIgLT4geworICAgICAgICAgICAgICAgICAgICBEZXhNZW1iZXJDaGVja2VyLmNoZWNrU2luZ2xlTWVtYmVyKG1lbWJlciwgb2JzZXJ2ZXIpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svc3JjL2phdmEvYW5kcm9pZC9zaWduYXR1cmUvY3RzL2FwaS9Cb290Q2xhc3NQYXRoQ2xhc3Nlc1Byb3ZpZGVyLmphdmEgYi90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL3NyYy9qYXZhL2FuZHJvaWQvc2lnbmF0dXJlL2N0cy9hcGkvQm9vdENsYXNzUGF0aENsYXNzZXNQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNTExYzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL3NyYy9qYXZhL2FuZHJvaWQvc2lnbmF0dXJlL2N0cy9hcGkvQm9vdENsYXNzUGF0aENsYXNzZXNQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNpZ25hdHVyZS5jdHMuYXBpOworCitpbXBvcnQgYW5kcm9pZC5vcy5EZWJ1ZzsKK2ltcG9ydCBhbmRyb2lkLnNpZ25hdHVyZS5jdHMuQ2xhc3NQcm92aWRlcjsKK2ltcG9ydCBhbmRyb2lkLnNpZ25hdHVyZS5jdHMuRGV4RmllbGQ7CitpbXBvcnQgYW5kcm9pZC5zaWduYXR1cmUuY3RzLkRleE1ldGhvZDsKK2ltcG9ydCBhbmRyb2lkLnNpZ25hdHVyZS5jdHMuRGV4TWVtYmVyOworaW1wb3J0IGRhbHZpay5zeXN0ZW0uQmFzZURleENsYXNzTG9hZGVyOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07CisKK0BTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCitwdWJsaWMgY2xhc3MgQm9vdENsYXNzUGF0aENsYXNzZXNQcm92aWRlciBleHRlbmRzIENsYXNzUHJvdmlkZXIgeworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gc0p2bXRpQXR0YWNoZWQgPSBmYWxzZTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJlYW08Q2xhc3M8Pz4+IGdldEFsbENsYXNzZXMoKSB7CisgICAgICAgIG1heWJlQXR0YWNoSnZtdGlBZ2VudCgpOworICAgICAgICByZXR1cm4gQXJyYXlzLnN0cmVhbShnZXRDbGFzc2xvYWRlckRlc2NyaXB0b3JzKE9iamVjdC5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKSkKKyAgICAgICAgICAgICAgICAubWFwKGRlc2NyaXB0b3IgLT4geworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NuYW1lID0gZGVzY3JpcHRvci5yZXBsYWNlKCcvJywgJy4nKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gb21pdCBMIGFuZCA7IGF0IHRoZSBmcm9udCBhbmQgYXQgdGhlIGVuZAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xhc3NuYW1lLnN1YnN0cmluZygxLCBjbGFzc25hbWUubGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC5tYXAoY2xhc3NuYW1lIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRDbGFzcyhjbGFzc25hbWUpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDYW5ub3QgbG9hZCAiICsgY2xhc3NuYW1lLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJlYW08RGV4TWVtYmVyPiBnZXRBbGxNZW1iZXJzKENsYXNzPD8+IGtsYXNzKSB7CisgICAgICAgIG1heWJlQXR0YWNoSnZtdGlBZ2VudCgpOworCisgICAgICAgIFN0cmluZ1tdW10gZmllbGRfaW5mb3MgPSBnZXRDbGFzc01lbWJlck5hbWVzQW5kVHlwZXMoa2xhc3MsIC8qIGZpZWxkcyAqLyB0cnVlKTsKKyAgICAgICAgU3RyaW5nW11bXSBtZXRob2RfaW5mb3MgPSBnZXRDbGFzc01lbWJlck5hbWVzQW5kVHlwZXMoa2xhc3MsIC8qIGZpZWxkcyAqLyBmYWxzZSk7CisgICAgICAgIGlmIChmaWVsZF9pbmZvcy5sZW5ndGggIT0gMiB8fCBmaWVsZF9pbmZvc1swXS5sZW5ndGggIT0gZmllbGRfaW5mb3NbMV0ubGVuZ3RoIHx8CisgICAgICAgICAgICBtZXRob2RfaW5mb3MubGVuZ3RoICE9IDIgfHwgbWV0aG9kX2luZm9zWzBdLmxlbmd0aCAhPSBtZXRob2RfaW5mb3NbMV0ubGVuZ3RoKSB7CisgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkludmFsaWQgcmVzdWx0IGZyb20gZ2V0Q2xhc3NNZW1iZXJOYW1lc0FuZFR5cGVzIik7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcga2xhc3NfZGVzYyA9ICJMIiArIGtsYXNzLmdldE5hbWUoKS5yZXBsYWNlKCcuJywgJy8nKSArICI7IjsKKyAgICAgICAgRGV4TWVtYmVyW10gbWVtYmVycyA9IG5ldyBEZXhNZW1iZXJbZmllbGRfaW5mb3NbMF0ubGVuZ3RoICsgbWV0aG9kX2luZm9zWzBdLmxlbmd0aF07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRfaW5mb3NbMF0ubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIG1lbWJlcnNbaV0gPSBuZXcgRGV4RmllbGQoa2xhc3NfZGVzYywgZmllbGRfaW5mb3NbMF1baV0sIGZpZWxkX2luZm9zWzFdW2ldKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZF9pbmZvc1swXS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgbWVtYmVyc1tpICsgZmllbGRfaW5mb3NbMF0ubGVuZ3RoXSA9CisgICAgICAgICAgICAgICAgbmV3IERleE1ldGhvZChrbGFzc19kZXNjLCBtZXRob2RfaW5mb3NbMF1baV0sIG1ldGhvZF9pbmZvc1sxXVtpXSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEFycmF5cy5zdHJlYW0obWVtYmVycyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBtYXliZUF0dGFjaEp2bXRpQWdlbnQoKSB7CisgICAgICBpZiAoIXNKdm10aUF0dGFjaGVkKSB7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgRGVidWcuYXR0YWNoSnZtdGlBZ2VudChjb3B5QWdlbnRUb0ZpbGUoImNsYXNzZGVzY3JpcHRvcnMiKS5nZXRBYnNvbHV0ZVBhdGgoKSwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICBCb290Q2xhc3NQYXRoQ2xhc3Nlc1Byb3ZpZGVyLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOworICAgICAgICAgICAgICBzSnZtdGlBdHRhY2hlZCA9IHRydWU7CisgICAgICAgICAgICAgIGluaXRpYWxpemUoKTsKKyAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXJyb3Igd2hpbGUgYXR0YWNoaW5nIEpWTVRJIGFnZW50IiwgZSk7CisgICAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEZpbGUgY29weUFnZW50VG9GaWxlKFN0cmluZyBsaWIpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDbGFzc0xvYWRlciBjbCA9IEJvb3RDbGFzc1BhdGhDbGFzc2VzUHJvdmlkZXIuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKTsKKworICAgICAgICBGaWxlIGNvcGllZEFnZW50ID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiYWdlbnQiLCAiLnNvIik7CisgICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKAorICAgICAgICAgICAgICAgICgoQmFzZURleENsYXNzTG9hZGVyKSBjbCkuZmluZExpYnJhcnkobGliKSkpIHsKKyAgICAgICAgICAgIHRyeSAoT3V0cHV0U3RyZWFtIG9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oY29waWVkQWdlbnQpKSB7CisgICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzY0ICogMTAyNF07CisKKyAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgbnVtUmVhZCA9IGlzLnJlYWQoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG51bVJlYWQgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG9zLndyaXRlKGJ1ZmZlciwgMCwgbnVtUmVhZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBjb3BpZWRBZ2VudDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBpbml0aWFsaXplKCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgU3RyaW5nW10gZ2V0Q2xhc3Nsb2FkZXJEZXNjcmlwdG9ycyhDbGFzc0xvYWRlciBsb2FkZXIpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBTdHJpbmdbXVtdIGdldENsYXNzTWVtYmVyTmFtZXNBbmRUeXBlcyhDbGFzczw/PiBrbGFzcywgYm9vbGVhbiBnZXRGaWVsZHMpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9zcmMvamF2YS9hbmRyb2lkL3NpZ25hdHVyZS9jdHMvYXBpL0RlYnVnQ2xhc3NIaWRkZW5BcGlUZXN0LmphdmEgYi90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL3NyYy9qYXZhL2FuZHJvaWQvc2lnbmF0dXJlL2N0cy9hcGkvRGVidWdDbGFzc0hpZGRlbkFwaVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTY4ZjA4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9zcmMvamF2YS9hbmRyb2lkL3NpZ25hdHVyZS9jdHMvYXBpL0RlYnVnQ2xhc3NIaWRkZW5BcGlUZXN0LmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zaWduYXR1cmUuY3RzLmFwaTsKKworaW1wb3J0IGFuZHJvaWQuc2lnbmF0dXJlLmN0cy5EZXhNZW1iZXJDaGVja2VyOworCitwdWJsaWMgY2xhc3MgRGVidWdDbGFzc0hpZGRlbkFwaVRlc3QgZXh0ZW5kcyBIaWRkZW5BcGlUZXN0IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworCisgICAgICAgIC8vIFRyeSB0byBleGVtcHQgRGV4TWVtYmVyQ2hlY2tlciBjbGFzcyBmcm9tIGhpZGRlbiBBUEkgY2hlY2tzLgorICAgICAgICAvLyBUaGlzIHNob3VsZCBmYWlsIGFzIHRoaXMgcHJvY2VzcyBpcyBub3QgZGVidWdnYWJsZS4KKyAgICAgICAgYXNzZXJ0RmFsc2UoRGV4TWVtYmVyQ2hlY2tlci5yZXF1ZXN0RXhlbXB0aW9uRnJvbUhpZGRlbkFwaUNoZWNrcygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL3NyYy9qYXZhL2FuZHJvaWQvc2lnbmF0dXJlL2N0cy9hcGkvRGVidWdDbGFzc0tpbGxzd2l0Y2hUZXN0LmphdmEgYi90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL3NyYy9qYXZhL2FuZHJvaWQvc2lnbmF0dXJlL2N0cy9hcGkvRGVidWdDbGFzc0tpbGxzd2l0Y2hUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E1ZTkwMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svc3JjL2phdmEvYW5kcm9pZC9zaWduYXR1cmUvY3RzL2FwaS9EZWJ1Z0NsYXNzS2lsbHN3aXRjaFRlc3QuamF2YQpAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNpZ25hdHVyZS5jdHMuYXBpOworCitpbXBvcnQgYW5kcm9pZC5zaWduYXR1cmUuY3RzLkRleE1lbWJlckNoZWNrZXI7CisKK3B1YmxpYyBjbGFzcyBEZWJ1Z0NsYXNzS2lsbHN3aXRjaFRlc3QgZXh0ZW5kcyBCYXNlS2lsbHN3aXRjaFRlc3QgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisKKyAgICAgICAgbUVycm9yTWVzc2FnZUFwcGVuZGl4ID0gIiB0byBleGVtcHRlZCBEZXhNZW1iZXJDaGVja2VyIGNsYXNzIjsKKworICAgICAgICAvLyBFeGVtcHQgRGV4TWVtYmVyQ2hlY2tlciBjbGFzcyBmcm9tIGhpZGRlbiBBUEkgY2hlY2tzLgorICAgICAgICBhc3NlcnRUcnVlKERleE1lbWJlckNoZWNrZXIucmVxdWVzdEV4ZW1wdGlvbkZyb21IaWRkZW5BcGlDaGVja3MoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9zcmMvamF2YS9hbmRyb2lkL3NpZ25hdHVyZS9jdHMvYXBpL0hpZGRlbkFwaVRlc3QuamF2YSBiL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svc3JjL2phdmEvYW5kcm9pZC9zaWduYXR1cmUvY3RzL2FwaS9IaWRkZW5BcGlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE4ZThjNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svc3JjL2phdmEvYW5kcm9pZC9zaWduYXR1cmUvY3RzL2FwaS9IaWRkZW5BcGlUZXN0LmphdmEKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2lnbmF0dXJlLmN0cy5hcGk7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnNpZ25hdHVyZS5jdHMuRGV4QXBpRG9jdW1lbnRQYXJzZXI7CitpbXBvcnQgYW5kcm9pZC5zaWduYXR1cmUuY3RzLkRleEZpZWxkOworaW1wb3J0IGFuZHJvaWQuc2lnbmF0dXJlLmN0cy5EZXhNZW1iZXI7CitpbXBvcnQgYW5kcm9pZC5zaWduYXR1cmUuY3RzLkRleE1lbWJlckNoZWNrZXI7CitpbXBvcnQgYW5kcm9pZC5zaWduYXR1cmUuY3RzLkRleE1ldGhvZDsKK2ltcG9ydCBhbmRyb2lkLnNpZ25hdHVyZS5jdHMuRmFpbHVyZVR5cGU7CitpbXBvcnQgYW5kcm9pZC5zaWduYXR1cmUuY3RzLlJlc3VsdE9ic2VydmVyOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOworaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNpZ25hdHVyZS5jdHMuQ3VycmVudEFwaS5BUElfRklMRV9ESVJFQ1RPUlk7CisKKy8qKgorICogQ2hlY2tzIHRoYXQgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGFjY2VzcyBoaWRkZW4gQVBJcy4KKyAqLworcHVibGljIGNsYXNzIEhpZGRlbkFwaVRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFwaVRlc3QgeworCisgICAgcHJpdmF0ZSBTdHJpbmdbXSBoaWRkZW5BcGlGaWxlczsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVGcm9tQXJncyhCdW5kbGUgaW5zdHJ1bWVudGF0aW9uQXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGhpZGRlbkFwaUZpbGVzID0gZ2V0Q29tbWFTZXBhcmF0ZWRMaXN0KGluc3RydW1lbnRhdGlvbkFyZ3MsICJoaWRkZW4tYXBpLWZpbGVzIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgRGV4TWVtYmVyQ2hlY2tlci5pbml0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhhdCB0aGUgZGV2aWNlIGRvZXMgbm90IGV4cG9zZSBBUElzIG9uIHRoZSBwcm92aWRlZCBsaXN0cyBvZgorICAgICAqIERFWCBzaWduYXR1cmVzLgorICAgICAqCisgICAgICogV2lsbCBjaGVjayB0aGUgZW50aXJlIEFQSSwgYW5kIHRoZW4gcmVwb3J0IHRoZSBjb21wbGV0ZSBsaXN0IG9mIGZhaWx1cmVzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFNpZ25hdHVyZSgpIHsKKyAgICAgICAgcnVuV2l0aFRlc3RSZXN1bHRPYnNlcnZlcihyZXN1bHRPYnNlcnZlciAtPiB7CisgICAgICAgICAgICBEZXhNZW1iZXJDaGVja2VyLk9ic2VydmVyIG9ic2VydmVyID0gbmV3IERleE1lbWJlckNoZWNrZXIuT2JzZXJ2ZXIoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgY2xhc3NBY2Nlc3NpYmxlKGJvb2xlYW4gYWNjZXNzaWJsZSwgRGV4TWVtYmVyIG1lbWJlcikgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZpZWxkQWNjZXNzaWJsZVZpYVJlZmxlY3Rpb24oYm9vbGVhbiBhY2Nlc3NpYmxlLCBEZXhGaWVsZCBmaWVsZCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzaWJsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0T2JzZXJ2ZXIubm90aWZ5RmFpbHVyZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFpbHVyZVR5cGUuRVhUUkFfRklFTEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIaWRkZW4gZmllbGQgYWNjZXNzaWJsZSB0aHJvdWdoIHJlZmxlY3Rpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZpZWxkQWNjZXNzaWJsZVZpYUpuaShib29sZWFuIGFjY2Vzc2libGUsIERleEZpZWxkIGZpZWxkKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3NpYmxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRPYnNlcnZlci5ub3RpZnlGYWlsdXJlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWlsdXJlVHlwZS5FWFRSQV9GSUVMRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhpZGRlbiBmaWVsZCBhY2Nlc3NpYmxlIHRocm91Z2ggSk5JIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBtZXRob2RBY2Nlc3NpYmxlVmlhUmVmbGVjdGlvbihib29sZWFuIGFjY2Vzc2libGUsIERleE1ldGhvZCBtZXRob2QpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2Vzc2libGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdE9ic2VydmVyLm5vdGlmeUZhaWx1cmUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhaWx1cmVUeXBlLkVYVFJBX01FVEhPRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIaWRkZW4gbWV0aG9kIGFjY2Vzc2libGUgdGhyb3VnaCByZWZsZWN0aW9uIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBtZXRob2RBY2Nlc3NpYmxlVmlhSm5pKGJvb2xlYW4gYWNjZXNzaWJsZSwgRGV4TWV0aG9kIG1ldGhvZCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzaWJsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0T2JzZXJ2ZXIubm90aWZ5RmFpbHVyZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFpbHVyZVR5cGUuRVhUUkFfTUVUSE9ELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhpZGRlbiBtZXRob2QgYWNjZXNzaWJsZSB0aHJvdWdoIEpOSSIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHBhcnNlRGV4QXBpRmlsZXNBc1N0cmVhbShoaWRkZW5BcGlGaWxlcykuZm9yRWFjaChkZXhNZW1iZXIgLT4geworICAgICAgICAgICAgICAgIERleE1lbWJlckNoZWNrZXIuY2hlY2tTaW5nbGVNZW1iZXIoZGV4TWVtYmVyLCBvYnNlcnZlcik7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyZWFtPERleE1lbWJlcj4gcGFyc2VEZXhBcGlGaWxlc0FzU3RyZWFtKFN0cmluZ1tdIGFwaUZpbGVzKSB7CisgICAgICAgIERleEFwaURvY3VtZW50UGFyc2VyIGRleEFwaURvY3VtZW50UGFyc2VyID0gbmV3IERleEFwaURvY3VtZW50UGFyc2VyKCk7CisgICAgICAgIHJldHVybiBTdHJlYW0ub2YoYXBpRmlsZXMpCisgICAgICAgICAgICAgICAgLm1hcChuYW1lIC0+IG5ldyBGaWxlKEFQSV9GSUxFX0RJUkVDVE9SWSArICIvIiArIG5hbWUpKQorICAgICAgICAgICAgICAgIC5mbGF0TWFwKGZpbGUgLT4gcmVhZEZpbGUoZmlsZSkpCisgICAgICAgICAgICAgICAgLmZsYXRNYXAoc3RyZWFtIC0+IGRleEFwaURvY3VtZW50UGFyc2VyLnBhcnNlQXNTdHJlYW0oc3RyZWFtKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL3NyYy9qYXZhL2FuZHJvaWQvc2lnbmF0dXJlL2N0cy9hcGkvU2lnbmF0dXJlVGVzdC5qYXZhIGIvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9zcmMvamF2YS9hbmRyb2lkL3NpZ25hdHVyZS9jdHMvYXBpL1NpZ25hdHVyZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWRmNzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9zcmMvamF2YS9hbmRyb2lkL3NpZ25hdHVyZS9jdHMvYXBpL1NpZ25hdHVyZVRlc3QuamF2YQpAQCAtMCwwICsxLDEyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zaWduYXR1cmUuY3RzLmFwaTsKKworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQuc2lnbmF0dXJlLmN0cy5BcGlDb21wbGlhbmNlQ2hlY2tlcjsKK2ltcG9ydCBhbmRyb2lkLnNpZ25hdHVyZS5jdHMuQXBpRG9jdW1lbnRQYXJzZXI7CitpbXBvcnQgYW5kcm9pZC5zaWduYXR1cmUuY3RzLkNsYXNzUHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZC5zaWduYXR1cmUuY3RzLkZhaWx1cmVUeXBlOworaW1wb3J0IGFuZHJvaWQuc2lnbmF0dXJlLmN0cy5KRGlmZkNsYXNzRGVzY3JpcHRpb247CitpbXBvcnQgYW5kcm9pZC5zaWduYXR1cmUuY3RzLlJlZmxlY3Rpb25IZWxwZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247CisKKy8qKgorICogUGVyZm9ybXMgdGhlIHNpZ25hdHVyZSBjaGVjayB2aWEgYSBKVW5pdCB0ZXN0LgorICovCitwdWJsaWMgY2xhc3MgU2lnbmF0dXJlVGVzdCBleHRlbmRzIEFic3RyYWN0QXBpVGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gU2lnbmF0dXJlVGVzdC5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7CisKKyAgICBwcml2YXRlIFN0cmluZ1tdIGV4cGVjdGVkQXBpRmlsZXM7CisgICAgcHJpdmF0ZSBTdHJpbmdbXSBiYXNlQXBpRmlsZXM7CisgICAgcHJpdmF0ZSBTdHJpbmdbXSB1bmV4cGVjdGVkQXBpRmlsZXM7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRnJvbUFyZ3MoQnVuZGxlIGluc3RydW1lbnRhdGlvbkFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleHBlY3RlZEFwaUZpbGVzID0gZ2V0Q29tbWFTZXBhcmF0ZWRMaXN0KGluc3RydW1lbnRhdGlvbkFyZ3MsICJleHBlY3RlZC1hcGktZmlsZXMiKTsKKyAgICAgICAgYmFzZUFwaUZpbGVzID0gZ2V0Q29tbWFTZXBhcmF0ZWRMaXN0KGluc3RydW1lbnRhdGlvbkFyZ3MsICJiYXNlLWFwaS1maWxlcyIpOworICAgICAgICB1bmV4cGVjdGVkQXBpRmlsZXMgPSBnZXRDb21tYVNlcGFyYXRlZExpc3QoaW5zdHJ1bWVudGF0aW9uQXJncywgInVuZXhwZWN0ZWQtYXBpLWZpbGVzIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhhdCB0aGUgZGV2aWNlJ3MgQVBJIG1hdGNoZXMgdGhlIGV4cGVjdGVkIHNldCBkZWZpbmVkIGluIHhtbC4KKyAgICAgKiA8cC8+CisgICAgICogV2lsbCBjaGVjayB0aGUgZW50aXJlIEFQSSwgYW5kIHRoZW4gcmVwb3J0IHRoZSBjb21wbGV0ZSBsaXN0IG9mIGZhaWx1cmVzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFNpZ25hdHVyZSgpIHsKKyAgICAgICAgcnVuV2l0aFRlc3RSZXN1bHRPYnNlcnZlcihtUmVzdWx0T2JzZXJ2ZXIgLT4geworICAgICAgICAgICAgU2V0PEpEaWZmQ2xhc3NEZXNjcmlwdGlvbj4gdW5leHBlY3RlZENsYXNzZXMgPSBsb2FkVW5leHBlY3RlZENsYXNzZXMoKTsKKyAgICAgICAgICAgIGZvciAoSkRpZmZDbGFzc0Rlc2NyaXB0aW9uIGNsYXNzRGVzY3JpcHRpb24gOiB1bmV4cGVjdGVkQ2xhc3NlcykgeworICAgICAgICAgICAgICAgIENsYXNzPD8+IHVuZXhwZWN0ZWRDbGFzcyA9IGZpbmRVbmV4cGVjdGVkQ2xhc3MoY2xhc3NEZXNjcmlwdGlvbiwgY2xhc3NQcm92aWRlcik7CisgICAgICAgICAgICAgICAgaWYgKHVuZXhwZWN0ZWRDbGFzcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1SZXN1bHRPYnNlcnZlci5ub3RpZnlGYWlsdXJlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhaWx1cmVUeXBlLlVORVhQRUNURURfQ0xBU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NEZXNjcmlwdGlvbi5nZXRBYnNvbHV0ZUNsYXNzTmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDbGFzcyBzaG91bGQgbm90IGJlIGFjY2Vzc2libGUgdG8gdGhpcyBBUEsiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFwaUNvbXBsaWFuY2VDaGVja2VyIGNvbXBsaWFuY2VDaGVja2VyID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IEFwaUNvbXBsaWFuY2VDaGVja2VyKG1SZXN1bHRPYnNlcnZlciwgY2xhc3NQcm92aWRlcik7CisKKyAgICAgICAgICAgIC8vIExvYWQgY2xhc3NlcyBmcm9tIGFueSBBUEkgZmlsZXMgdGhhdCBmb3JtIHRoZSBiYXNlIHdoaWNoIHRoZSBleHBlY3RlZCBBUElzIGV4dGVuZC4KKyAgICAgICAgICAgIGxvYWRCYXNlQ2xhc3Nlcyhjb21wbGlhbmNlQ2hlY2tlcik7CisKKyAgICAgICAgICAgIEFwaURvY3VtZW50UGFyc2VyIGFwaURvY3VtZW50UGFyc2VyID0gbmV3IEFwaURvY3VtZW50UGFyc2VyKFRBRyk7CisKKyAgICAgICAgICAgIHBhcnNlQXBpRmlsZXNBc1N0cmVhbShhcGlEb2N1bWVudFBhcnNlciwgZXhwZWN0ZWRBcGlGaWxlcykKKyAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihub3QodW5leHBlY3RlZENsYXNzZXM6OmNvbnRhaW5zKSkKKyAgICAgICAgICAgICAgICAgICAgLmZvckVhY2goY29tcGxpYW5jZUNoZWNrZXI6OmNoZWNrU2lnbmF0dXJlQ29tcGxpYW5jZSk7CisKKyAgICAgICAgICAgIC8vIEFmdGVyIGRvbmUgcGFyc2luZyBhbGwgZXhwZWN0ZWQgQVBJIGZpbGVzLCBwZXJmb3JtIGFueSBkZWZlcnJlZCBjaGVja3MuCisgICAgICAgICAgICBjb21wbGlhbmNlQ2hlY2tlci5jaGVja0RlZmVycmVkKCk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIDxUPiBQcmVkaWNhdGU8VD4gbm90KFByZWRpY2F0ZTxUPiBwcmVkaWNhdGUpIHsKKyAgICAgICAgcmV0dXJuIHByZWRpY2F0ZS5uZWdhdGUoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIENsYXNzPD8+IGZpbmRVbmV4cGVjdGVkQ2xhc3MoSkRpZmZDbGFzc0Rlc2NyaXB0aW9uIGNsYXNzRGVzY3JpcHRpb24sCisgICAgICAgICAgICBDbGFzc1Byb3ZpZGVyIGNsYXNzUHJvdmlkZXIpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBSZWZsZWN0aW9uSGVscGVyLmZpbmRNYXRjaGluZ0NsYXNzKGNsYXNzRGVzY3JpcHRpb24sIGNsYXNzUHJvdmlkZXIpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBTZXQ8SkRpZmZDbGFzc0Rlc2NyaXB0aW9uPiBsb2FkVW5leHBlY3RlZENsYXNzZXMoKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsKKworICAgICAgICBBcGlEb2N1bWVudFBhcnNlciBhcGlEb2N1bWVudFBhcnNlciA9IG5ldyBBcGlEb2N1bWVudFBhcnNlcihUQUcpOworICAgICAgICByZXR1cm4gcGFyc2VBcGlGaWxlc0FzU3RyZWFtKGFwaURvY3VtZW50UGFyc2VyLCB1bmV4cGVjdGVkQXBpRmlsZXMpCisgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0NvbGxlY3Rpb24oU2lnbmF0dXJlVGVzdDo6bmV3U2V0T2ZDbGFzc0Rlc2NyaXB0aW9ucykpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFRyZWVTZXQ8SkRpZmZDbGFzc0Rlc2NyaXB0aW9uPiBuZXdTZXRPZkNsYXNzRGVzY3JpcHRpb25zKCkgeworICAgICAgICByZXR1cm4gbmV3IFRyZWVTZXQ8PihDb21wYXJhdG9yLmNvbXBhcmluZyhKRGlmZkNsYXNzRGVzY3JpcHRpb246OmdldEFic29sdXRlQ2xhc3NOYW1lKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGxvYWRCYXNlQ2xhc3NlcyhBcGlDb21wbGlhbmNlQ2hlY2tlciBjb21wbGlhbmNlQ2hlY2tlcikKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgQXBpRG9jdW1lbnRQYXJzZXIgYXBpRG9jdW1lbnRQYXJzZXIgPQorICAgICAgICAgICAgICAgIG5ldyBBcGlEb2N1bWVudFBhcnNlcihUQUcpOworICAgICAgICBwYXJzZUFwaUZpbGVzQXNTdHJlYW0oYXBpRG9jdW1lbnRQYXJzZXIsIGJhc2VBcGlGaWxlcykKKyAgICAgICAgICAgICAgICAuZm9yRWFjaChjb21wbGlhbmNlQ2hlY2tlcjo6YWRkQmFzZUNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL3NyYy9qYXZhL2FuZHJvaWQvc2lnbmF0dXJlL2N0cy9hcGkvVGVzdFJlc3VsdE9ic2VydmVyLmphdmEgYi90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL3NyYy9qYXZhL2FuZHJvaWQvc2lnbmF0dXJlL2N0cy9hcGkvVGVzdFJlc3VsdE9ic2VydmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNlYTIwMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svc3JjL2phdmEvYW5kcm9pZC9zaWduYXR1cmUvY3RzL2FwaS9UZXN0UmVzdWx0T2JzZXJ2ZXIuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNpZ25hdHVyZS5jdHMuYXBpOworCitpbXBvcnQgYW5kcm9pZC5zaWduYXR1cmUuY3RzLkZhaWx1cmVUeXBlOworaW1wb3J0IGFuZHJvaWQuc2lnbmF0dXJlLmN0cy5SZXN1bHRPYnNlcnZlcjsKKworLyoqCisgKiBLZWVwcyB0cmFjayBvZiBhbnkgcmVwb3J0ZWQgZmFpbHVyZXMuCisgKi8KK2NsYXNzIFRlc3RSZXN1bHRPYnNlcnZlciBpbXBsZW1lbnRzIFJlc3VsdE9ic2VydmVyIHsKKworICAgIGJvb2xlYW4gbURpZEZhaWwgPSBmYWxzZTsKKworICAgIFN0cmluZ0J1aWxkZXIgbUVycm9yU3RyaW5nID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG5vdGlmeUZhaWx1cmUoRmFpbHVyZVR5cGUgdHlwZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBlcnJvck1lc3NhZ2UpIHsKKyAgICAgICAgbURpZEZhaWwgPSB0cnVlOworICAgICAgICBtRXJyb3JTdHJpbmcuYXBwZW5kKCJcbiIpOworICAgICAgICBtRXJyb3JTdHJpbmcuYXBwZW5kKHR5cGUudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKTsKKyAgICAgICAgbUVycm9yU3RyaW5nLmFwcGVuZCgiOlx0Iik7CisgICAgICAgIG1FcnJvclN0cmluZy5hcHBlbmQobmFtZSk7CisgICAgICAgIG1FcnJvclN0cmluZy5hcHBlbmQoIlx0RXJyb3I6ICIpOworICAgICAgICBtRXJyb3JTdHJpbmcuYXBwZW5kKGVycm9yTWVzc2FnZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9zcmMvamF2YS9hbmRyb2lkL3NpZ25hdHVyZS9jdHMvYXBpL1doaXRlbGlzdEtpbGxzd2l0Y2hUZXN0LmphdmEgYi90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL3NyYy9qYXZhL2FuZHJvaWQvc2lnbmF0dXJlL2N0cy9hcGkvV2hpdGVsaXN0S2lsbHN3aXRjaFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWFkZTFkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9zcmMvamF2YS9hbmRyb2lkL3NpZ25hdHVyZS9jdHMvYXBpL1doaXRlbGlzdEtpbGxzd2l0Y2hUZXN0LmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zaWduYXR1cmUuY3RzLmFwaTsKKworaW1wb3J0IGFuZHJvaWQuc2lnbmF0dXJlLmN0cy5EZXhNZW1iZXJDaGVja2VyOworCitwdWJsaWMgY2xhc3MgV2hpdGVsaXN0S2lsbHN3aXRjaFRlc3QgZXh0ZW5kcyBCYXNlS2lsbHN3aXRjaFRlc3QgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisKKyAgICAgICAgU3RyaW5nIGV4ZW1wdGlvbnMgPSBnZXRHbG9iYWxFeGVtcHRpb25zKCk7CisgICAgICAgIG1FcnJvck1lc3NhZ2VBcHBlbmRpeCA9ICIgd2hlbiBnbG9iYWwgc2V0dGluZyBoaWRkZW5fYXBpX2JsYWNrbGlzdF9leGVtcHRpb25zIGlzICIKKyAgICAgICAgICAgICsgIlwiIiArIGV4ZW1wdGlvbnMgKyAiXCIiOworCisgICAgICAgIC8vIHByZWNvbmRpdGlvbiBjaGVjazogbWFrZSBzdXJlIGdsb2JhbCBzZXR0aW5nIGhhcyBiZWVuIGNvbmZpZ3VyZWQgcHJvcGVybHkuCisgICAgICAgIC8vIFRoaXMgc2hvdWxkIGJlIGRvbmUgdmlhIGFuIGFkYiBjb21tYW5kLCBjb25maWd1cmVkIGluIEFuZHJvaWRUZXN0LnhtbC4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJMIiwgZXhlbXB0aW9ucyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9zcmMvamF2YS9hbmRyb2lkL3NpZ25hdHVyZS9jdHMvYXBpL1dpbGRjYXJkS2lsbHN3aXRjaFRlc3QuamF2YSBiL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svc3JjL2phdmEvYW5kcm9pZC9zaWduYXR1cmUvY3RzL2FwaS9XaWxkY2FyZEtpbGxzd2l0Y2hUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJkMzUyZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svc3JjL2phdmEvYW5kcm9pZC9zaWduYXR1cmUvY3RzL2FwaS9XaWxkY2FyZEtpbGxzd2l0Y2hUZXN0LmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zaWduYXR1cmUuY3RzLmFwaTsKKworaW1wb3J0IGFuZHJvaWQuc2lnbmF0dXJlLmN0cy5EZXhNZW1iZXJDaGVja2VyOworCitwdWJsaWMgY2xhc3MgV2lsZGNhcmRLaWxsc3dpdGNoVGVzdCBleHRlbmRzIEJhc2VLaWxsc3dpdGNoVGVzdCB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKworICAgICAgICBTdHJpbmcgZXhlbXB0aW9ucyA9IGdldEdsb2JhbEV4ZW1wdGlvbnMoKTsKKyAgICAgICAgbUVycm9yTWVzc2FnZUFwcGVuZGl4ID0gIiB3aGVuIGdsb2JhbCBzZXR0aW5nIGhpZGRlbl9hcGlfYmxhY2tsaXN0X2V4ZW1wdGlvbnMgaXMgIgorICAgICAgICAgICAgKyAiXCIiICsgZXhlbXB0aW9ucyArICJcIiI7CisKKyAgICAgICAgLy8gcHJlY29uZGl0aW9uIGNoZWNrOiBtYWtlIHN1cmUgZ2xvYmFsIHNldHRpbmcgaGFzIGJlZW4gY29uZmlndXJlZCBwcm9wZXJseS4KKyAgICAgICAgLy8gVGhpcyBzaG91bGQgYmUgZG9uZSB2aWEgYW4gYWRiIGNvbW1hbmQsIGNvbmZpZ3VyZWQgaW4gQW5kcm9pZFRlc3QueG1sLgorICAgICAgICBhc3NlcnRFcXVhbHMoIioiLCBleGVtcHRpb25zKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL3NyYy9qbmkvY2xhc3NkZXNjcmlwdG9ycy5jcHAgYi90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL3NyYy9qbmkvY2xhc3NkZXNjcmlwdG9ycy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FmMmMzMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svc3JjL2puaS9jbGFzc2Rlc2NyaXB0b3JzLmNwcApAQCAtMCwwICsxLDIyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxqbmkuaD4KKyNpbmNsdWRlIDxqdm10aS5oPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2Ugc2lnbmF0dXJlIHsKK25hbWVzcGFjZSBjdHMgeworbmFtZXNwYWNlIGFwaSB7CisKK3N0YXRpYyBqdm10aUVudioganZtdGlfZW52Oworc3RhdGljIGp2bXRpRXJyb3IgKCpnZXRfZGVzY3JpcHRvcl9saXN0KShqdm10aUVudiogZW52LCBqb2JqZWN0IGxvYWRlciwgamludCogY250LCBjaGFyKioqIGRlc2NzKTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGF0aWMgdm9pZCBEZWFsbG9jKFQqIHQpIHsKKyAganZtdGlfZW52LT5EZWFsbG9jYXRlKHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgY2hhcio+KHQpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIC4uLlJlc3Q+CitzdGF0aWMgdm9pZCBEZWFsbG9jKFQqIHQsIFJlc3QuLi4gcnMpIHsKKyAgRGVhbGxvYyh0KTsKKyAgRGVhbGxvYyhycy4uLik7Cit9CisKK3N0YXRpYyB2b2lkIERlYWxsb2NQYXJhbXMoanZtdGlQYXJhbUluZm8qIHBhcmFtcywgamludCBuX3BhcmFtcykgeworICBmb3IgKGppbnQgaSA9IDA7IGkgPCBuX3BhcmFtczsgaSsrKSB7CisgICAgRGVhbGxvYyhwYXJhbXNbaV0ubmFtZSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgQ2xlYW51cChjaGFyKiogZGF0YSwgamludCBjbnQpIHsKKyAgZm9yIChqaW50IGkgPSAwOyBpIDwgY250OyBpKyspIHsKKyAgICBEZWFsbG9jKGRhdGFbaV0pOworICB9CisgIERlYWxsb2MoZGF0YSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBTY29wZWRKdm10aVJlZmVyZW5jZSB7Cisgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3BvaW50ZXI8VD46OnZhbHVlLCAiVCBtdXN0IGJlIGEgcG9pbnRlciB0eXBlIik7CisKKyBwdWJsaWM6CisgIFNjb3BlZEp2bXRpUmVmZXJlbmNlKCkgOiByZWZfKG51bGxwdHIpIHt9CisKKyAgflNjb3BlZEp2bXRpUmVmZXJlbmNlKCkgeworICAgIGlmIChyZWZfICE9IG51bGxwdHIpIHsKKyAgICAgIERlYWxsb2MocmVmXyk7CisgICAgfQorICB9CisKKyAgLy8gUmV0dXJuIHRoZSBwb2ludGVyIHZhbHVlLgorICBUIEdldCgpIHsgcmV0dXJuIHJlZl87IH07CisKKyAgLy8gUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgcG9pbnRlciB2YWx1ZS4KKyAgVCogR2V0UHRyKCkgeyByZXR1cm4gJnJlZl87IH07CisKKyBwcml2YXRlOgorICBUIHJlZl87Cit9OworCitzdGF0aWMgdm9pZCBhYm9ydElmRXhjZXB0aW9uUGVuZGluZyhKTklFbnYqIGVudikgeworICBpZiAoZW52LT5FeGNlcHRpb25DaGVjaygpKSB7CisgICAgYWJvcnQoKTsKKyAgfQorfQorCitleHRlcm4gIkMiIEpOSUVYUE9SVCBqaW50IEpOSUNBTEwgQWdlbnRfT25BdHRhY2goSmF2YVZNKiB2bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSBjaGFyKiBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYXR0cmlidXRlX18oKHVudXNlZCkpIHZvaWQqIHJlc2VydmVkKSB7CisgIGppbnQganZtRXJyb3IgPSB2bS0+R2V0RW52KHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCoqPigmanZtdGlfZW52KSwgSlZNVElfVkVSU0lPTl8xXzIpOworICBpZiAoanZtRXJyb3IgIT0gSk5JX09LKSB7CisgICAgcmV0dXJuIGp2bUVycm9yOworICB9CisgIHJldHVybiBKVk1USV9FUlJPUl9OT05FOworfQorCitleHRlcm4gIkMiIEpOSUVYUE9SVCBqb2JqZWN0QXJyYXkgSk5JQ0FMTCBKYXZhX2FuZHJvaWRfc2lnbmF0dXJlX2N0c19hcGlfQm9vdENsYXNzUGF0aENsYXNzZXNQcm92aWRlcl9nZXRDbGFzc2xvYWRlckRlc2NyaXB0b3JzKAorICAgIEpOSUVudiogZW52LCBqY2xhc3MsIGpvYmplY3QgbG9hZGVyKSB7CisgIGlmIChnZXRfZGVzY3JpcHRvcl9saXN0ID09IG51bGxwdHIpIHsKKyAgICBqY2xhc3MgcnRfZXhjZXB0aW9uID0gZW52LT5GaW5kQ2xhc3MoImphdmEvbGFuZy9SdW50aW1lRXhjZXB0aW9uIik7CisgICAgZW52LT5UaHJvd05ldyhydF9leGNlcHRpb24sICJnZXRfY2xhc3NfbG9hZGVyX2NsYXNzX2Rlc2NyaXB0b3IgZXh0ZW5zaW9uIGlzIG5vdCByZWFkeS4iKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBjaGFyKiogY2xhc3NlcyA9IG51bGxwdHI7CisgIGppbnQgY250ID0gLTE7CisgIGp2bXRpRXJyb3IgZXJyb3IgPSBnZXRfZGVzY3JpcHRvcl9saXN0KGp2bXRpX2VudiwgbG9hZGVyLCAmY250LCAmY2xhc3Nlcyk7CisgIGlmIChlcnJvciAhPSBKVk1USV9FUlJPUl9OT05FKSB7CisgICAgamNsYXNzIHJ0X2V4Y2VwdGlvbiA9IGVudi0+RmluZENsYXNzKCJqYXZhL2xhbmcvUnVudGltZUV4Y2VwdGlvbiIpOworICAgIGVudi0+VGhyb3dOZXcocnRfZXhjZXB0aW9uLCAiRXJyb3Igd2hpbGUgZXhlY3V0aW5nIGdldF9jbGFzc19sb2FkZXJfY2xhc3NfZGVzY3JpcHRvci4iKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIGpvYmplY3RBcnJheSBhcnIgPSBlbnYtPk5ld09iamVjdEFycmF5KGNudCwgZW52LT5GaW5kQ2xhc3MoImphdmEvbGFuZy9TdHJpbmciKSwgbnVsbHB0cik7CisgIGlmIChlbnYtPkV4Y2VwdGlvbkNoZWNrKCkpIHsKKyAgICBDbGVhbnVwKGNsYXNzZXMsIGNudCk7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBmb3IgKGppbnQgaSA9IDA7IGkgPCBjbnQ7IGkrKykgeworICAgIGVudi0+U2V0T2JqZWN0QXJyYXlFbGVtZW50KGFyciwgaSwgZW52LT5OZXdTdHJpbmdVVEYoY2xhc3Nlc1tpXSkpOworICAgIGlmIChlbnYtPkV4Y2VwdGlvbkNoZWNrKCkpIHsKKyAgICAgIENsZWFudXAoY2xhc3NlcywgY250KTsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgfQorICBDbGVhbnVwKGNsYXNzZXMsIGNudCk7CisgIHJldHVybiBhcnI7Cit9CisKK2V4dGVybiAiQyIgSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2FuZHJvaWRfc2lnbmF0dXJlX2N0c19hcGlfQm9vdENsYXNzUGF0aENsYXNzZXNQcm92aWRlcl9pbml0aWFsaXplKEpOSUVudiogZW52LCBqY2xhc3MpIHsKKyAgamludCBmdW5jdGlvbkluZm9zQ291bnQgPSAwOworICBqdm10aUV4dGVuc2lvbkZ1bmN0aW9uSW5mbyogZnVuY3Rpb25JbmZvcyA9IG51bGxwdHI7CisKKyAganZtdGlFcnJvciBlcnIgPSBqdm10aV9lbnYtPkdldEV4dGVuc2lvbkZ1bmN0aW9ucygmZnVuY3Rpb25JbmZvc0NvdW50LCAmZnVuY3Rpb25JbmZvcyk7CisgIGlmIChlcnIgIT0gSlZNVElfRVJST1JfTk9ORSkgeworICAgIGpjbGFzcyBydF9leGNlcHRpb24gPSBlbnYtPkZpbmRDbGFzcygiamF2YS9sYW5nL1J1bnRpbWVFeGNlcHRpb24iKTsKKyAgICBlbnYtPlRocm93TmV3KHJ0X2V4Y2VwdGlvbiwgIkZhaWxlZCB0byBnZXQgSlZNVEkgZXh0ZW5zaW9uIEFQSXMiKTsKKyAgICByZXR1cm47CisgIH0KKworICBmb3IgKGppbnQgaSA9IDA7IGkgPCBmdW5jdGlvbkluZm9zQ291bnQ7IGkrKykgeworICAgIGp2bXRpRXh0ZW5zaW9uRnVuY3Rpb25JbmZvKiBjdXJJbmZvID0gJmZ1bmN0aW9uSW5mb3NbaV07CisgICAgaWYgKHN0cmNtcCgiY29tLmFuZHJvaWQuYXJ0LmNsYXNzLmdldF9jbGFzc19sb2FkZXJfY2xhc3NfZGVzY3JpcHRvcnMiLCBjdXJJbmZvLT5pZCkgPT0gMCkgeworICAgICAgZ2V0X2Rlc2NyaXB0b3JfbGlzdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8anZtdGlFcnJvciAoKikoanZtdGlFbnYqLCBqb2JqZWN0LCBqaW50KiwgY2hhcioqKik+KGN1ckluZm8tPmZ1bmMpOworICAgIH0KKyAgICBEZWFsbG9jUGFyYW1zKGN1ckluZm8tPnBhcmFtcywgY3VySW5mby0+cGFyYW1fY291bnQpOworICAgIERlYWxsb2MoY3VySW5mby0+aWQsIGN1ckluZm8tPnNob3J0X2Rlc2NyaXB0aW9uLCBjdXJJbmZvLT5wYXJhbXMsIGN1ckluZm8tPmVycm9ycyk7CisgIH0KKyAgRGVhbGxvYyhmdW5jdGlvbkluZm9zKTsKKworICBpZiAoZ2V0X2Rlc2NyaXB0b3JfbGlzdCA9PSBudWxscHRyKSB7CisgICAgamNsYXNzIHJ0X2V4Y2VwdGlvbiA9IGVudi0+RmluZENsYXNzKCJqYXZhL2xhbmcvUnVudGltZUV4Y2VwdGlvbiIpOworICAgIGVudi0+VGhyb3dOZXcocnRfZXhjZXB0aW9uLCAiRmFpbGVkIHRvIGZpbmQgZ2V0X2NsYXNzX2xvYWRlcl9jbGFzc19kZXNjcmlwdG9ycyBleHRlbnNpb24iKTsKKyAgICByZXR1cm47CisgIH0KK30KKworZXh0ZXJuICJDIiBKTklFWFBPUlQgam9iamVjdEFycmF5IEpOSUNBTEwKK0phdmFfYW5kcm9pZF9zaWduYXR1cmVfY3RzX2FwaV9Cb290Q2xhc3NQYXRoQ2xhc3Nlc1Byb3ZpZGVyX2dldENsYXNzTWVtYmVyTmFtZXNBbmRUeXBlcygKKyAgICBKTklFbnYqIGVudiwgamNsYXNzLCBqY2xhc3Mga2xhc3MsIGpib29sZWFuIGdldEZpZWxkcykgeworICBqdm10aUVycm9yIGVycm9yOworCisgIGppbnQgY291bnQ7CisgIFNjb3BlZEp2bXRpUmVmZXJlbmNlPGpmaWVsZElEKj4gZmlkczsKKyAgU2NvcGVkSnZtdGlSZWZlcmVuY2U8am1ldGhvZElEKj4gbWlkczsKKworICAvLyBSZXF1ZXN0IGEgbGlzdCBvZiBmaWVsZC9tZXRob2QgSURzIHVzaW5nIEpWTVRJLgorICBlcnJvciA9IChnZXRGaWVsZHMgIT0gSk5JX0ZBTFNFKSA/IGp2bXRpX2Vudi0+R2V0Q2xhc3NGaWVsZHMoa2xhc3MsICZjb3VudCwgZmlkcy5HZXRQdHIoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBqdm10aV9lbnYtPkdldENsYXNzTWV0aG9kcyhrbGFzcywgJmNvdW50LCBtaWRzLkdldFB0cigpKTsKKyAgaWYgKGVycm9yICE9IEpWTVRJX0VSUk9SX05PTkUpIHsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICBzcyA8PCAiRXJyb3Igd2hpbGUgZXhlY3V0aW5nICIKKyAgICAgICA8PCAoKGdldEZpZWxkcyAhPSBKTklfRkFMU0UpID8gIkdldENsYXNzRmllbGRzIiA6ICJHZXRDbGFzc01ldGhvZHMiKQorICAgICAgIDw8ICIsIGVycm9yIGNvZGU6ICIgPDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGVycm9yKTsKKyAgICBzdGQ6OnN0cmluZyBlcnJvciA9IHNzLnN0cigpOworICAgIGpjbGFzcyBydF9leGNlcHRpb24gPSBlbnYtPkZpbmRDbGFzcygiamF2YS9sYW5nL1J1bnRpbWVFeGNlcHRpb24iKTsKKyAgICBlbnYtPlRocm93TmV3KHJ0X2V4Y2VwdGlvbiwgZXJyb3IuY19zdHIoKSk7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBqb2JqZWN0QXJyYXkgbmFtZXMgPSBlbnYtPk5ld09iamVjdEFycmF5KGNvdW50LCBlbnYtPkZpbmRDbGFzcygiamF2YS9sYW5nL1N0cmluZyIpLCBudWxscHRyKTsKKyAgYWJvcnRJZkV4Y2VwdGlvblBlbmRpbmcoZW52KTsKKyAgam9iamVjdEFycmF5IHR5cGVzID0gZW52LT5OZXdPYmplY3RBcnJheShjb3VudCwgZW52LT5GaW5kQ2xhc3MoImphdmEvbGFuZy9TdHJpbmciKSwgbnVsbHB0cik7CisgIGFib3J0SWZFeGNlcHRpb25QZW5kaW5nKGVudik7CisKKyAgLy8gQ29udmVydCBJRHMgdG8gbmFtZXMgYW5kIHR5cGVzIHVzaW5nIEpWTVRJLgorICBmb3IgKGppbnQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgU2NvcGVkSnZtdGlSZWZlcmVuY2U8Y2hhcio+IG5hbWU7CisgICAgU2NvcGVkSnZtdGlSZWZlcmVuY2U8Y2hhcio+IHR5cGU7CisKKyAgICBlcnJvciA9IChnZXRGaWVsZHMgIT0gSk5JX0ZBTFNFKQorICAgICAgICA/IGp2bXRpX2Vudi0+R2V0RmllbGROYW1lKGtsYXNzLCBmaWRzLkdldCgpW2ldLCBuYW1lLkdldFB0cigpLCB0eXBlLkdldFB0cigpLCBudWxscHRyKQorICAgICAgICA6IGp2bXRpX2Vudi0+R2V0TWV0aG9kTmFtZShtaWRzLkdldCgpW2ldLCBuYW1lLkdldFB0cigpLCB0eXBlLkdldFB0cigpLCBudWxscHRyKTsKKyAgICBpZiAoZXJyb3IgIT0gSlZNVElfRVJST1JfTk9ORSkgeworICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgICBzcyA8PCAiRXJyb3Igd2hpbGUgZXhlY3V0aW5nICIKKyAgICAgICAgIDw8ICgoZ2V0RmllbGRzICE9IEpOSV9GQUxTRSkgPyAiR2V0RmllbGROYW1lIiA6ICJHZXRNZXRob2ROYW1lIikKKyAgICAgICAgIDw8ICIsIGVycm9yIGNvZGU6ICIgPDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGVycm9yKTsKKyAgICAgIHN0ZDo6c3RyaW5nIGVycm9yID0gc3Muc3RyKCk7CisgICAgICBqY2xhc3MgcnRfZXhjZXB0aW9uID0gZW52LT5GaW5kQ2xhc3MoImphdmEvbGFuZy9SdW50aW1lRXhjZXB0aW9uIik7CisgICAgICBlbnYtPlRocm93TmV3KHJ0X2V4Y2VwdGlvbiwgZXJyb3IuY19zdHIoKSk7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBlbnYtPlNldE9iamVjdEFycmF5RWxlbWVudChuYW1lcywgaSwgZW52LT5OZXdTdHJpbmdVVEYobmFtZS5HZXQoKSkpOworICAgIGFib3J0SWZFeGNlcHRpb25QZW5kaW5nKGVudik7CisgICAgZW52LT5TZXRPYmplY3RBcnJheUVsZW1lbnQodHlwZXMsIGksIGVudi0+TmV3U3RyaW5nVVRGKHR5cGUuR2V0KCkpKTsKKyAgICBhYm9ydElmRXhjZXB0aW9uUGVuZGluZyhlbnYpOworICB9CisKKyAgLy8gUmV0dXJuIGFzIGEgYXJyYXkgc2l6ZSAyIHggY291bnQsIHdoZXJlIHJlc3VsdFswXSBpcyBhbiBhcnJheSBvZiBuYW1lcyBhbmQKKyAgLy8gcmVzdWx0WzFdIGlzIGFuIGFycmF5IG9mIHR5cGVzLgorICBqb2JqZWN0QXJyYXkgcmVzdWx0ID0gZW52LT5OZXdPYmplY3RBcnJheSgKKyAgICAgIC8qIGNvdW50ICovIDIsIGVudi0+RmluZENsYXNzKCJbTGphdmEvbGFuZy9TdHJpbmc7IiksIG51bGxwdHIpOworICBhYm9ydElmRXhjZXB0aW9uUGVuZGluZyhlbnYpOworICBlbnYtPlNldE9iamVjdEFycmF5RWxlbWVudChyZXN1bHQsIDAsIG5hbWVzKTsKKyAgYWJvcnRJZkV4Y2VwdGlvblBlbmRpbmcoZW52KTsKKyAgZW52LT5TZXRPYmplY3RBcnJheUVsZW1lbnQocmVzdWx0LCAxLCB0eXBlcyk7CisgIGFib3J0SWZFeGNlcHRpb25QZW5kaW5nKGVudik7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFwaQorfSAgLy8gbmFtZXNwYWNlIGN0cworfSAgLy8gbmFtZXNwYWNlIHNpZ25hdHVyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svc3lzdGVtLWFubm90YXRpb24vQW5kcm9pZC5tayBiL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svc3lzdGVtLWFubm90YXRpb24vQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODBlNDIyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9zeXN0ZW0tYW5ub3RhdGlvbi9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjggQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNTeXN0ZW1BcGlBbm5vdGF0aW9uVGVzdENhc2VzCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLHNyYykKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dAorTE9DQUxfU0lHTkFUVVJFX0FQSV9GSUxFUyA6PSBcCisgICAgc3lzdGVtLWN1cnJlbnQuYXBpIFwKKyAgICBzeXN0ZW0tcmVtb3ZlZC5hcGkgXAorICAgIGNhci1zeXN0ZW0tY3VycmVudC5hcGkgXAorICAgIGNhci1zeXN0ZW0tcmVtb3ZlZC5hcGkgXAorCitpbmNsdWRlICQoTE9DQUxfUEFUSCkvLi4vYnVpbGRfc2lnbmF0dXJlX2Fway5tawpkaWZmIC0tZ2l0IGEvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9zeXN0ZW0tYW5ub3RhdGlvbi9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9zeXN0ZW0tYW5ub3RhdGlvbi9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NTNmYjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL3N5c3RlbS1hbm5vdGF0aW9uL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICAgIHBhY2thZ2U9ImFuZHJvaWQuc2lnbmF0dXJlLmN0cy5hcGkuc3lzdGVtX2Fubm90YXRpb24iPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVBRF9FWFRFUk5BTF9TVE9SQUdFIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVBRF9QSE9ORV9TVEFURSIvPgorCisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6ZGVidWdnYWJsZT0idHJ1ZSIvPgorCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9InJlcGFja2FnZWQuYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuc2lnbmF0dXJlLmN0cy5hcGkuc3lzdGVtX2Fubm90YXRpb24iCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJTeXN0ZW0gQVBJIEFubm90YXRpb24gVGVzdCIvPgorCis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9zeXN0ZW0tYW5ub3RhdGlvbi9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL3N5c3RlbS1hbm5vdGF0aW9uL0FuZHJvaWRUZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjAxYWY0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9zeXN0ZW0tYW5ub3RhdGlvbi9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSw1MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBTeXN0ZW0gQ3VycmVudCBBUEkgU2lnbmF0dXJlIHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CisgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJzeXN0ZW1zIiAvPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuUnVuQ29tbWFuZFRhcmdldFByZXBhcmVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJydW4tY29tbWFuZCIgdmFsdWU9Im1rZGlyIC1wIC9kYXRhL2xvY2FsL3RtcC9zaWduYXR1cmUtdGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZWFyZG93bi1jb21tYW5kIiB2YWx1ZT0icm0gLXJmIC9kYXRhL2xvY2FsL3RtcC9zaWduYXR1cmUtdGVzdCIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50YXJnZXRwcmVwLkZpbGVQdXNoZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJzeXN0ZW0tY3VycmVudC5hcGktPi9kYXRhL2xvY2FsL3RtcC9zaWduYXR1cmUtdGVzdC9zeXN0ZW0tY3VycmVudC5hcGkiIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGFyZ2V0cHJlcC5GaWxlUHVzaGVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0ic3lzdGVtLXJlbW92ZWQuYXBpLT4vZGF0YS9sb2NhbC90bXAvc2lnbmF0dXJlLXRlc3Qvc3lzdGVtLXJlbW92ZWQuYXBpIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRhcmdldHByZXAuRmlsZVB1c2hlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9ImNhci1zeXN0ZW0tY3VycmVudC5hcGktPi9kYXRhL2xvY2FsL3RtcC9zaWduYXR1cmUtdGVzdC9jYXItc3lzdGVtLWN1cnJlbnQuYXBpIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRhcmdldHByZXAuRmlsZVB1c2hlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9ImNhci1zeXN0ZW0tcmVtb3ZlZC5hcGktPi9kYXRhL2xvY2FsL3RtcC9zaWduYXR1cmUtdGVzdC9jYXItc3lzdGVtLXJlbW92ZWQuYXBpIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJDdHNTeXN0ZW1BcGlBbm5vdGF0aW9uVGVzdENhc2VzLmFwayIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuQW5kcm9pZEpVbml0VGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9InBhY2thZ2UiIHZhbHVlPSJhbmRyb2lkLnNpZ25hdHVyZS5jdHMuYXBpLnN5c3RlbV9hbm5vdGF0aW9uIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bm5lciIgdmFsdWU9InJlcGFja2FnZWQuYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xhc3MiIHZhbHVlPSJhbmRyb2lkLnNpZ25hdHVyZS5jdHMuYXBpLkFubm90YXRpb25UZXN0IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9Imluc3RydW1lbnRhdGlvbi1hcmciIGtleT0iZXhwZWN0ZWQtYXBpLWZpbGVzIiB2YWx1ZT0ic3lzdGVtLWN1cnJlbnQuYXBpLHN5c3RlbS1yZW1vdmVkLmFwaSxjYXItc3lzdGVtLWN1cnJlbnQuYXBpLGNhci1zeXN0ZW0tcmVtb3ZlZC5hcGkiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0iaW5zdHJ1bWVudGF0aW9uLWFyZyIga2V5PSJhbm5vdGF0aW9uLWZvci1leGFjdC1tYXRjaCIgdmFsdWU9ImFuZHJvaWQuYW5ub3RhdGlvbi5TeXN0ZW1BcGkiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVudGltZS1oaW50IiB2YWx1ZT0iMzBzIiAvPgorICAgIDwvdGVzdD4KKworICAgIDwhLS0gQ29udHJvbGxlciB0aGF0IHdpbGwgc2tpcCB0aGUgbW9kdWxlIGlmIGEgbmF0aXZlIGJyaWRnZSBzaXR1YXRpb24gaXMgZGV0ZWN0ZWQgLS0+CisgICAgPCEtLSBGb3IgZXhhbXBsZTogbW9kdWxlIHdhbnRzIHRvIHJ1biBhcm0zMiBhbmQgZGV2aWNlIGlzIHg4NiAtLT4KKyAgICA8b2JqZWN0IHR5cGU9Im1vZHVsZV9jb250cm9sbGVyIiBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuc3VpdGUubW9kdWxlLk5hdGl2ZUJyaWRnZU1vZHVsZUNvbnRyb2xsZXIiIC8+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL3N5c3RlbS1hbm5vdGF0aW9uL3NyYy9qYXZhL2FuZHJvaWQvc2lnbmF0dXJlL2N0cy9hcGkvQW5ub3RhdGlvblRlc3QuamF2YSBiL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svc3lzdGVtLWFubm90YXRpb24vc3JjL2phdmEvYW5kcm9pZC9zaWduYXR1cmUvY3RzL2FwaS9Bbm5vdGF0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NDMwMGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL3N5c3RlbS1hbm5vdGF0aW9uL3NyYy9qYXZhL2FuZHJvaWQvc2lnbmF0dXJlL2N0cy9hcGkvQW5ub3RhdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNpZ25hdHVyZS5jdHMuYXBpOworCitpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnNpZ25hdHVyZS5jdHMuQW5ub3RhdGlvbkNoZWNrZXI7CitpbXBvcnQgYW5kcm9pZC5zaWduYXR1cmUuY3RzLkFwaURvY3VtZW50UGFyc2VyOworCitpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5Qcm9wZXJ0eVV0aWw7CisKKy8qKgorICogQ2hlY2tzIHRoYXQgcGFydHMgb2YgdGhlIGRldmljZSdzIEFQSSB0aGF0IGFyZSBhbm5vdGF0ZWQgKGUuZy4gd2l0aCBhbmRyb2lkLmFubm90YXRpb24uU3lzdGVtQXBpKQorICogbWF0Y2ggdGhlIEFQSSBkZWZpbml0aW9uLgorICovCitwdWJsaWMgY2xhc3MgQW5ub3RhdGlvblRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFwaVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IEFubm90YXRpb25UZXN0LmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKworICAgIHByaXZhdGUgU3RyaW5nW10gZXhwZWN0ZWRBcGlGaWxlczsKKyAgICBwcml2YXRlIFN0cmluZyBhbm5vdGF0aW9uRm9yRXhhY3RNYXRjaDsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVGcm9tQXJncyhCdW5kbGUgaW5zdHJ1bWVudGF0aW9uQXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4cGVjdGVkQXBpRmlsZXMgPSBnZXRDb21tYVNlcGFyYXRlZExpc3QoaW5zdHJ1bWVudGF0aW9uQXJncywgImV4cGVjdGVkLWFwaS1maWxlcyIpOworICAgICAgICBhbm5vdGF0aW9uRm9yRXhhY3RNYXRjaCA9IGluc3RydW1lbnRhdGlvbkFyZ3MuZ2V0U3RyaW5nKCJhbm5vdGF0aW9uLWZvci1leGFjdC1tYXRjaCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoYXQgdGhlIHBhcnRzIG9mIHRoZSBkZXZpY2UncyBBUEkgdGhhdCBhcmUgYW5ub3RhdGVkIChlLmcuIHdpdGgKKyAgICAgKiBhbmRyb2lkLmFubm90YXRpb24uU3lzdGVtQXBpKSBtYXRjaCB0aGUgQVBJIGRlZmluaXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEFubm90YXRpb24oKSB7CisgICAgICAgIGlmICgidHJ1ZSIuZXF1YWxzKFByb3BlcnR5VXRpbC5nZXRQcm9wZXJ0eSgicm8udHJlYmxlLmVuYWJsZWQiKSkgJiYKKyAgICAgICAgICAgICAgICBQcm9wZXJ0eVV0aWwuZ2V0Rmlyc3RBcGlMZXZlbCgpID4gQnVpbGQuVkVSU0lPTl9DT0RFUy5PX01SMSkgeworICAgICAgICAgICAgcnVuV2l0aFRlc3RSZXN1bHRPYnNlcnZlcihyZXN1bHRPYnNlcnZlciAtPiB7CisgICAgICAgICAgICAgICAgQW5ub3RhdGlvbkNoZWNrZXIgY29tcGxpYW5jZUNoZWNrZXIgPSBuZXcgQW5ub3RhdGlvbkNoZWNrZXIocmVzdWx0T2JzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc1Byb3ZpZGVyLCBhbm5vdGF0aW9uRm9yRXhhY3RNYXRjaCk7CisKKyAgICAgICAgICAgICAgICBBcGlEb2N1bWVudFBhcnNlciBhcGlEb2N1bWVudFBhcnNlciA9IG5ldyBBcGlEb2N1bWVudFBhcnNlcihUQUcpOworCisgICAgICAgICAgICAgICAgcGFyc2VBcGlGaWxlc0FzU3RyZWFtKGFwaURvY3VtZW50UGFyc2VyLCBleHBlY3RlZEFwaUZpbGVzKQorICAgICAgICAgICAgICAgICAgICAgICAgLmZvckVhY2goY29tcGxpYW5jZUNoZWNrZXI6OmNoZWNrU2lnbmF0dXJlQ29tcGxpYW5jZSk7CisKKyAgICAgICAgICAgICAgICAvLyBBZnRlciBkb25lIHBhcnNpbmcgYWxsIGV4cGVjdGVkIEFQSSBmaWxlcywgcGVyZm9ybSBhbnkgZGVmZXJyZWQgY2hlY2tzLgorICAgICAgICAgICAgICAgIGNvbXBsaWFuY2VDaGVja2VyLmNoZWNrRGVmZXJyZWQoKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9zeXN0ZW0tYXBpL0FuZHJvaWQubWsgYi90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL3N5c3RlbS1hcGkvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzk1YTZkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9zeXN0ZW0tYXBpL0FuZHJvaWQubWsKQEAgLTAsMCArMSw1MCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCithbGxfc3lzdGVtX2FwaV9maWxlcyA6PSBzeXN0ZW0tY3VycmVudC5hcGkgc3lzdGVtLXJlbW92ZWQuYXBpCiskKGZvcmVhY2ggdmVyLCQoUExBVEZPUk1fU1lTVEVNU0RLX1ZFUlNJT05TKSxcCisgICQoaWYgJChjYWxsIG1hdGhfaXNfbnVtYmVyLCQodmVyKSksXAorICAgICQoZXZhbCBhbGxfc3lzdGVtX2FwaV9maWxlcyArPSBzeXN0ZW0tJCh2ZXIpLmFwaSlcCisgIClcCispCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IGN0cy1zeXN0ZW0tYWxsLmFwaQorTE9DQUxfTU9EVUxFX1NURU0gOj0gc3lzdGVtLWFsbC5hcGkuemlwCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9NT0RVTEVfUEFUSCA9ICQoVEFSR0VUX09VVF9EQVRBX0VUQykKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gYXJjdHMgY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9iYXNlX3J1bGVzLm1rCiskKExPQ0FMX0JVSUxUX01PRFVMRSk6ICQoYWRkcHJlZml4ICQoQ09NUEFUSUJJTElUWV9URVNUQ0FTRVNfT1VUX2N0cykvLCQoYWxsX3N5c3RlbV9hcGlfZmlsZXMpKQorCUBlY2hvICJaaXAgQVBJIGZpbGVzICReIC0+ICRAIgorCUBta2RpciAtcCAkKGRpciAkQCkKKwkkKGhpZGUpIHJtIC1mICRACisJJChoaWRlKSB6aXAgLXEgJEAgJF4KKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNTeXN0ZW1BcGlTaWduYXR1cmVUZXN0Q2FzZXMKKworTE9DQUxfU0lHTkFUVVJFX0FQSV9GSUxFUyA6PSBcCisgICAgY3VycmVudC5hcGkgXAorICAgIGFuZHJvaWQtdGVzdC1tb2NrLWN1cnJlbnQuYXBpIFwKKyAgICBhbmRyb2lkLXRlc3QtcnVubmVyLWN1cnJlbnQuYXBpIFwKKyAgICAkKGFsbF9zeXRlbV9hcGlfZmlsZXMpIFwKKyAgICBzeXN0ZW0tYWxsLmFwaS56aXAKKworaW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uL2J1aWxkX3NpZ25hdHVyZV9hcGsubWsKKworYWxsX3N5c3RlbV9hcGlfZmlsZXMgOj0KZGlmZiAtLWdpdCBhL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svc3lzdGVtLWFwaS9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9zeXN0ZW0tYXBpL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY3YmVkOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svc3lzdGVtLWFwaS9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgICBwYWNrYWdlPSJhbmRyb2lkLnNpZ25hdHVyZS5jdHMuYXBpLnN5c3RlbSI+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX0VYVEVSTkFMX1NUT1JBR0UiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX1BIT05FX1NUQVRFIi8+CisKKyAgICA8YXBwbGljYXRpb24vPgorCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9InJlcGFja2FnZWQuYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuc2lnbmF0dXJlLmN0cy5hcGkuc3lzdGVtIgorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iU3lzdGVtIEFQSSBTaWduYXR1cmUgVGVzdCIvPgorCis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvc2lnbmF0dXJlL2FwaS1jaGVjay9zeXN0ZW0tYXBpL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svc3lzdGVtLWFwaS9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY3MDQ3OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svc3lzdGVtLWFwaS9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSw0MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBTeXN0ZW0gQVBJIFNpZ25hdHVyZSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgorICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0ic3lzdGVtcyIgLz4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlJ1bkNvbW1hbmRUYXJnZXRQcmVwYXJlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVuLWNvbW1hbmQiIHZhbHVlPSJta2RpciAtcCAvZGF0YS9sb2NhbC90bXAvc2lnbmF0dXJlLXRlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVhcmRvd24tY29tbWFuZCIgdmFsdWU9InJtIC1yZiAvZGF0YS9sb2NhbC90bXAvc2lnbmF0dXJlLXRlc3QiIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGFyZ2V0cHJlcC5GaWxlUHVzaGVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iY3VycmVudC5hcGktPi9kYXRhL2xvY2FsL3RtcC9zaWduYXR1cmUtdGVzdC9jdXJyZW50LmFwaSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iYW5kcm9pZC10ZXN0LW1vY2stY3VycmVudC5hcGktPi9kYXRhL2xvY2FsL3RtcC9zaWduYXR1cmUtdGVzdC9hbmRyb2lkLXRlc3QtbW9jay1jdXJyZW50LmFwaSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iYW5kcm9pZC10ZXN0LXJ1bm5lci1jdXJyZW50LmFwaS0+L2RhdGEvbG9jYWwvdG1wL3NpZ25hdHVyZS10ZXN0L2FuZHJvaWQtdGVzdC1ydW5uZXItY3VycmVudC5hcGkiIC8+CisgICAgICAgIDwhLS0gVGhpcyB6aXAgZmlsZSBjb250YWlucyBhbGwgdmVyc2lvbnMgb2Ygc3lzdGVtIEFQSXMgdGhhdCB0aGUgcGxhdGZvcm0gaXMgc3VwcG9zZWQgdG8gaW1wbGVtZW50IC0tPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJzeXN0ZW0tYWxsLmFwaS56aXAtPi9kYXRhL2xvY2FsL3RtcC9zaWduYXR1cmUtdGVzdC9zeXN0ZW0tYWxsLmFwaS56aXAiIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c1N5c3RlbUFwaVNpZ25hdHVyZVRlc3RDYXNlcy5hcGsiIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkFuZHJvaWRKVW5pdFRlc3QiID4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwYWNrYWdlIiB2YWx1ZT0iYW5kcm9pZC5zaWduYXR1cmUuY3RzLmFwaS5zeXN0ZW0iIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVubmVyIiB2YWx1ZT0icmVwYWNrYWdlZC5hbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGFzcyIgdmFsdWU9ImFuZHJvaWQuc2lnbmF0dXJlLmN0cy5hcGkuU2lnbmF0dXJlVGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJpbnN0cnVtZW50YXRpb24tYXJnIiBrZXk9ImJhc2UtYXBpLWZpbGVzIiB2YWx1ZT0iY3VycmVudC5hcGkiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0iaW5zdHJ1bWVudGF0aW9uLWFyZyIga2V5PSJleHBlY3RlZC1hcGktZmlsZXMiIHZhbHVlPSJzeXN0ZW0tYWxsLmFwaS56aXAiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0iaW5zdHJ1bWVudGF0aW9uLWFyZyIga2V5PSJ1bmV4cGVjdGVkLWFwaS1maWxlcyIgdmFsdWU9ImFuZHJvaWQtdGVzdC1tb2NrLWN1cnJlbnQuYXBpLGFuZHJvaWQtdGVzdC1ydW5uZXItY3VycmVudC5hcGkiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVudGltZS1oaW50IiB2YWx1ZT0iMzBzIiAvPgorICAgIDwvdGVzdD4KKzwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svc3lzdGVtLWN1cnJlbnQtYXBpL0FuZHJvaWQubWsgYi90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL3N5c3RlbS1jdXJyZW50LWFwaS9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzEwZDJjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svc3lzdGVtLWN1cnJlbnQtYXBpL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzU3lzdGVtQ3VycmVudEFwaVNpZ25hdHVyZVRlc3RDYXNlcwotCi1MT0NBTF9TSUdOQVRVUkVfQVBJX0ZJTEVTIDo9IFwKLSAgICBzeXN0ZW0tY3VycmVudC5hcGkgXAotICAgIGFuZHJvaWQtdGVzdC1tb2NrLWN1cnJlbnQuYXBpIFwKLSAgICBhbmRyb2lkLXRlc3QtcnVubmVyLWN1cnJlbnQuYXBpIFwKLQotaW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uL2J1aWxkX3NpZ25hdHVyZV9hcGsubWsKZGlmZiAtLWdpdCBhL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svc3lzdGVtLWN1cnJlbnQtYXBpL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL3N5c3RlbS1jdXJyZW50LWFwaS9BbmRyb2lkTWFuaWZlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjc4YzRiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svc3lzdGVtLWN1cnJlbnQtYXBpL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLQotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgICAgcGFja2FnZT0iYW5kcm9pZC5zaWduYXR1cmUuY3RzLmFwaS5zeXN0ZW1fY3VycmVudCI+Ci0gICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX0VYVEVSTkFMX1NUT1JBR0UiIC8+Ci0gICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX1BIT05FX1NUQVRFIi8+Ci0KLSAgICA8YXBwbGljYXRpb24vPgotCi0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9InJlcGFja2FnZWQuYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiCi0gICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuc2lnbmF0dXJlLmN0cy5hcGkuc3lzdGVtX2N1cnJlbnQiCi0gICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJTeXN0ZW0gQ3VycmVudCBBUEkgU2lnbmF0dXJlIFRlc3QiLz4KLQotPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svc3lzdGVtLWN1cnJlbnQtYXBpL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL3NpZ25hdHVyZS9hcGktY2hlY2svc3lzdGVtLWN1cnJlbnQtYXBpL0FuZHJvaWRUZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJmNjQxYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9zaWduYXR1cmUvYXBpLWNoZWNrL3N5c3RlbS1jdXJyZW50LWFwaS9BbmRyb2lkVGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIFN5c3RlbSBDdXJyZW50IEFQSSBTaWduYXR1cmUgdGVzdCBjYXNlcyI+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJzeXN0ZW1zIiAvPgotICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuUnVuQ29tbWFuZFRhcmdldFByZXBhcmVyIj4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJydW4tY29tbWFuZCIgdmFsdWU9Im1rZGlyIC1wIC9kYXRhL2xvY2FsL3RtcC9zaWduYXR1cmUtdGVzdCIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZWFyZG93bi1jb21tYW5kIiB2YWx1ZT0icm0gLXJmIC9kYXRhL2xvY2FsL3RtcC9zaWduYXR1cmUtdGVzdCIgLz4KLSAgICA8L3RhcmdldF9wcmVwYXJlcj4KLSAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50YXJnZXRwcmVwLkZpbGVQdXNoZXIiPgotICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJzeXN0ZW0tY3VycmVudC5hcGktPi9kYXRhL2xvY2FsL3RtcC9zaWduYXR1cmUtdGVzdC9zeXN0ZW0tY3VycmVudC5hcGkiIC8+Ci0gICAgPC90YXJnZXRfcHJlcGFyZXI+Ci0gICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGFyZ2V0cHJlcC5GaWxlUHVzaGVyIj4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iYW5kcm9pZC10ZXN0LW1vY2stY3VycmVudC5hcGktPi9kYXRhL2xvY2FsL3RtcC9zaWduYXR1cmUtdGVzdC9hbmRyb2lkLXRlc3QtbW9jay1jdXJyZW50LmFwaSIgLz4KLSAgICA8L3RhcmdldF9wcmVwYXJlcj4KLSAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50YXJnZXRwcmVwLkZpbGVQdXNoZXIiPgotICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJhbmRyb2lkLXRlc3QtcnVubmVyLWN1cnJlbnQuYXBpLT4vZGF0YS9sb2NhbC90bXAvc2lnbmF0dXJlLXRlc3QvYW5kcm9pZC10ZXN0LXJ1bm5lci1jdXJyZW50LmFwaSIgLz4KLSAgICA8L3RhcmdldF9wcmVwYXJlcj4KLSAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzU3lzdGVtQ3VycmVudEFwaVNpZ25hdHVyZVRlc3RDYXNlcy5hcGsiIC8+Ci0gICAgPC90YXJnZXRfcHJlcGFyZXI+Ci0gICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkFuZHJvaWRKVW5pdFRlc3QiID4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJwYWNrYWdlIiB2YWx1ZT0iYW5kcm9pZC5zaWduYXR1cmUuY3RzLmFwaS5zeXN0ZW1fY3VycmVudCIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJydW5uZXIiIHZhbHVlPSJyZXBhY2thZ2VkLmFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9Imluc3RydW1lbnRhdGlvbi1hcmciIGtleT0iZXhwZWN0ZWQtYXBpLWZpbGVzIiB2YWx1ZT0ic3lzdGVtLWN1cnJlbnQuYXBpIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9Imluc3RydW1lbnRhdGlvbi1hcmciIGtleT0idW5leHBlY3RlZC1hcGktZmlsZXMiIHZhbHVlPSJhbmRyb2lkLXRlc3QtbW9jay1jdXJyZW50LmFwaSxhbmRyb2lkLXRlc3QtcnVubmVyLWN1cnJlbnQuYXBpIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjMwcyIgLz4KLSAgICA8L3Rlc3Q+Ci08L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9zaWduYXR1cmUvYXBpL0FuZHJvaWQubWsgYi90ZXN0cy9zaWduYXR1cmUvYXBpL0FuZHJvaWQubWsKaW5kZXggNzFlMzNhZS4uYzljMmE2MCAxMDA2NDQKLS0tIGEvdGVzdHMvc2lnbmF0dXJlL2FwaS9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3NpZ25hdHVyZS9hcGkvQW5kcm9pZC5tawpAQCAtMTUsNzEgKzE1LDYzIEBACiAjIFdlIGRlZmluZSB0aGlzIGluIGEgc3ViZGlyIHNvIHRoYXQgaXQgd29uJ3QgcGljayB1cCB0aGUgcGFyZW50J3MgQW5kcm9pZC54bWwgYnkgZGVmYXVsdC4KIAogTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKLSMgY3VycmVudCBhcGksIGluIFhNTCBmb3JtYXQuCisjICQoMSkgbmFtZSBvZiB0aGUgeG1sIGZpbGUgdG8gYmUgY3JlYXRlZAorIyAkKDIpIHBhdGggdG8gdGhlIGFwaSB0ZXh0IGZpbGUKK2RlZmluZSBidWlsZF94bWxfYXBpX2ZpbGUKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IGN0cy0kKHN1YnN0IC4sLSwkKDEpKQorTE9DQUxfTU9EVUxFX1NURU0gOj0gJCgxKQorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfTU9EVUxFX1BBVEggPSAkKFRBUkdFVF9PVVRfREFUQV9FVEMpCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGFyY3RzIGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvYmFzZV9ydWxlcy5taworJCQoTE9DQUxfQlVJTFRfTU9EVUxFKTogJCgyKSB8ICQoQVBJQ0hFQ0spCisJQGVjaG8gIkNvbnZlcnQgQVBJIGZpbGUgJCQ8IC0+ICQkQCIKKwlAbWtkaXIgLXAgJCQoZGlyICQkQCkKKwkkKGhpZGUpICQoQVBJQ0hFQ0tfQ09NTUFORCkgLWNvbnZlcnQyeG1sbm9zdHJpcCAkJDwgJCRACitlbmRlZgorCiAjIE5PVEU6IHRoZSBvdXRwdXQgWE1MIGZpbGUgaXMgYWxzbyB1c2VkCiAjIGluIC8vY3RzL2hvc3RzaWRldGVzdHMvZGV2aWNlcG9saWN5L0FuZHJvaWRUZXN0LnhtbAogIyBieSBjb20uYW5kcm9pZC5jdHMubWFuYWdlZHByb2ZpbGUuQ3VycmVudEFwaUhlbHBlcgogIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyQoZXZhbCAkKGNhbGwgYnVpbGRfeG1sX2FwaV9maWxlLGN1cnJlbnQuYXBpLGZyYW1ld29ya3MvYmFzZS9hcGkvY3VycmVudC50eHQpKQorJChldmFsICQoY2FsbCBidWlsZF94bWxfYXBpX2ZpbGUsc3lzdGVtLWN1cnJlbnQuYXBpLGZyYW1ld29ya3MvYmFzZS9hcGkvc3lzdGVtLWN1cnJlbnQudHh0KSkKKyQoZXZhbCAkKGNhbGwgYnVpbGRfeG1sX2FwaV9maWxlLHN5c3RlbS1yZW1vdmVkLmFwaSxmcmFtZXdvcmtzL2Jhc2UvYXBpL3N5c3RlbS1yZW1vdmVkLnR4dCkpCiskKGV2YWwgJChjYWxsIGJ1aWxkX3htbF9hcGlfZmlsZSxhbmRyb2lkLXRlc3QtYmFzZS1jdXJyZW50LmFwaSxmcmFtZXdvcmtzL2Jhc2UvdGVzdC1iYXNlL2FwaS9hbmRyb2lkLXRlc3QtYmFzZS1jdXJyZW50LnR4dCkpCiskKGV2YWwgJChjYWxsIGJ1aWxkX3htbF9hcGlfZmlsZSxhbmRyb2lkLXRlc3QtbW9jay1jdXJyZW50LmFwaSxmcmFtZXdvcmtzL2Jhc2UvdGVzdC1tb2NrL2FwaS9hbmRyb2lkLXRlc3QtbW9jay1jdXJyZW50LnR4dCkpCiskKGV2YWwgJChjYWxsIGJ1aWxkX3htbF9hcGlfZmlsZSxhbmRyb2lkLXRlc3QtcnVubmVyLWN1cnJlbnQuYXBpLGZyYW1ld29ya3MvYmFzZS90ZXN0LXJ1bm5lci9hcGkvYW5kcm9pZC10ZXN0LXJ1bm5lci1jdXJyZW50LnR4dCkpCiskKGV2YWwgJChjYWxsIGJ1aWxkX3htbF9hcGlfZmlsZSxjYXItc3lzdGVtLWN1cnJlbnQuYXBpLHBhY2thZ2VzL3NlcnZpY2VzL0Nhci9jYXItbGliL2FwaS9zeXN0ZW0tY3VycmVudC50eHQpKQorJChldmFsICQoY2FsbCBidWlsZF94bWxfYXBpX2ZpbGUsY2FyLXN5c3RlbS1yZW1vdmVkLmFwaSxwYWNrYWdlcy9zZXJ2aWNlcy9DYXIvY2FyLWxpYi9hcGkvc3lzdGVtLXJlbW92ZWQudHh0KSkKKyQoZm9yZWFjaCB2ZXIsJChQTEFURk9STV9TWVNURU1TREtfVkVSU0lPTlMpLFwKKyAgJChpZiAkKGNhbGwgbWF0aF9pc19udW1iZXIsJCh2ZXIpKSxcCisgICAgJChldmFsICQoY2FsbCBidWlsZF94bWxfYXBpX2ZpbGUsc3lzdGVtLSQodmVyKS5hcGkscHJlYnVpbHRzL3Nkay9zeXN0ZW0tYXBpLyQodmVyKS50eHQpKVwKKyAgKVwKKykKKworIyBjdXJyZW50IGFwYWNoZS1odHRwLWxlZ2FjeSBtaW51cyBjdXJyZW50IGFwaSwgaW4gdGV4dCBmb3JtYXQuCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgUmVtb3ZlcyBhbnkgY2xhc3NlcyBmcm9tIHRoZSBvcmcuYXBhY2hlLmh0dHAubGVnYWN5IEFQSSBkZXNjcmlwdGlvbiB0aGF0IGFyZQorIyBhbHNvIHBhcnQgb2YgdGhlIEFuZHJvaWQgQVBJIGRlc2NyaXB0aW9uLgogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9FVEMpCiAKLUxPQ0FMX01PRFVMRSA6PSBjdHMtY3VycmVudC1hcGkKLUxPQ0FMX01PRFVMRV9TVEVNIDo9IGN1cnJlbnQuYXBpCi1MT0NBTF9TUkNfRklMRVMgOj0gZnJhbWV3b3Jrcy9iYXNlL2FwaS9jdXJyZW50LnR4dAorIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKIAotaW5jbHVkZSAkKExPQ0FMX1BBVEgpL2J1aWxkX3htbF9hcGlfZmlsZS5taworTE9DQUxfTU9EVUxFIDo9IGN0cy1hcGFjaGUtaHR0cC1sZWdhY3ktbWludXMtY3VycmVudC1hcGkKK0xPQ0FMX01PRFVMRV9TVEVNIDo9IGFwYWNoZS1odHRwLWxlZ2FjeS1taW51cy1jdXJyZW50LmFwaQogCi0jIGN1cnJlbnQgc3lzdGVtIGFwaSwgaW4gWE1MIGZvcm1hdC4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRSA6PSBjdHMtc3lzdGVtLWN1cnJlbnQtYXBpCi1MT0NBTF9NT0RVTEVfU1RFTSA6PSBzeXN0ZW0tY3VycmVudC5hcGkKLUxPQ0FMX1NSQ19GSUxFUyA6PSBmcmFtZXdvcmtzL2Jhc2UvYXBpL3N5c3RlbS1jdXJyZW50LnR4dAotCi1pbmNsdWRlICQoTE9DQUxfUEFUSCkvYnVpbGRfeG1sX2FwaV9maWxlLm1rCi0KLSMgcmVtb3ZlZCBzeXN0ZW0gYXBpLCBpbiBYTUwgZm9ybWF0LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFIDo9IGN0cy1zeXN0ZW0tcmVtb3ZlZC1hcGkKLUxPQ0FMX01PRFVMRV9TVEVNIDo9IHN5c3RlbS1yZW1vdmVkLmFwaQotTE9DQUxfU1JDX0ZJTEVTIDo9IGZyYW1ld29ya3MvYmFzZS9hcGkvc3lzdGVtLXJlbW92ZWQudHh0Ci0KLWluY2x1ZGUgJChMT0NBTF9QQVRIKS9idWlsZF94bWxfYXBpX2ZpbGUubWsKLQotIyBjdXJyZW50IGxlZ2FjeS10ZXN0IGFwaSwgaW4gWE1MIGZvcm1hdC4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRSA6PSBjdHMtbGVnYWN5LXRlc3QtY3VycmVudC1hcGkKLUxPQ0FMX01PRFVMRV9TVEVNIDo9IGxlZ2FjeS10ZXN0LWN1cnJlbnQuYXBpCi1MT0NBTF9TUkNfRklMRVMgOj0gZnJhbWV3b3Jrcy9iYXNlL2xlZ2FjeS10ZXN0L2FwaS9sZWdhY3ktdGVzdC1jdXJyZW50LnR4dAotCi1pbmNsdWRlICQoTE9DQUxfUEFUSCkvYnVpbGRfeG1sX2FwaV9maWxlLm1rCi0KLSMgY3VycmVudCBhbmRyb2lkLXRlc3QtbW9jayBhcGksIGluIFhNTCBmb3JtYXQuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9NT0RVTEUgOj0gY3RzLWFuZHJvaWQtdGVzdC1tb2NrLWN1cnJlbnQtYXBpCi1MT0NBTF9NT0RVTEVfU1RFTSA6PSBhbmRyb2lkLXRlc3QtbW9jay1jdXJyZW50LmFwaQotTE9DQUxfU1JDX0ZJTEVTIDo9IGZyYW1ld29ya3MvYmFzZS90ZXN0LXJ1bm5lci9hcGkvYW5kcm9pZC10ZXN0LW1vY2stY3VycmVudC50eHQKLQotaW5jbHVkZSAkKExPQ0FMX1BBVEgpL2J1aWxkX3htbF9hcGlfZmlsZS5tawotCi0jIGN1cnJlbnQgYW5kcm9pZC10ZXN0LXJ1bm5lciBhcGksIGluIFhNTCBmb3JtYXQuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9NT0RVTEUgOj0gY3RzLWFuZHJvaWQtdGVzdC1ydW5uZXItY3VycmVudC1hcGkKLUxPQ0FMX01PRFVMRV9TVEVNIDo9IGFuZHJvaWQtdGVzdC1ydW5uZXItY3VycmVudC5hcGkKLUxPQ0FMX1NSQ19GSUxFUyA6PSBmcmFtZXdvcmtzL2Jhc2UvdGVzdC1ydW5uZXIvYXBpL2FuZHJvaWQtdGVzdC1ydW5uZXItY3VycmVudC50eHQKLQotaW5jbHVkZSAkKExPQ0FMX1BBVEgpL2J1aWxkX3htbF9hcGlfZmlsZS5tawotCi0jIGN1cnJlbnQgYXBhY2hlLWh0dHAtbGVnYWN5IGFwaSwgaW4gWE1MIGZvcm1hdC4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9NT0RVTEUgOj0gY3RzLWFwYWNoZS1odHRwLWxlZ2FjeS1jdXJyZW50LWFwaQotTE9DQUxfTU9EVUxFX1NURU0gOj0gYXBhY2hlLWh0dHAtbGVnYWN5LWN1cnJlbnQuYXBpCi1MT0NBTF9TUkNfRklMRVMgOj0gZXh0ZXJuYWwvYXBhY2hlLWh0dHAvYXBpL2FwYWNoZS1odHRwLWxlZ2FjeS1jdXJyZW50LnR4dAotCi1pbmNsdWRlICQoTE9DQUxfUEFUSCkvYnVpbGRfeG1sX2FwaV9maWxlLm1rCitpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9iYXNlX3J1bGVzLm1rCiskKExPQ0FMX0JVSUxUX01PRFVMRSkgOiBcCisgICAgICAgIGZyYW1ld29ya3MvYmFzZS9hcGkvY3VycmVudC50eHQgXAorICAgICAgICBleHRlcm5hbC9hcGFjaGUtaHR0cC9hcGkvYXBhY2hlLWh0dHAtbGVnYWN5LWN1cnJlbnQudHh0IFwKKyAgICAgICAgfCAkKEFQSUNIRUNLKQorCUBlY2hvICJHZW5lcmF0ZSB1bmlxdWUgQXBhY2hlIEh0dHAgTGVnYWN5IEFQSSBmaWxlIC0+ICRAIgorCUBta2RpciAtcCAkKGRpciAkQCkKKwkkKGhpZGUpICQoQVBJQ0hFQ0tfQ09NTUFORCkgLW5ld19hcGlfbm9fc3RyaXAgXAorCSAgICAgICAgZnJhbWV3b3Jrcy9iYXNlL2FwaS9jdXJyZW50LnR4dCBcCisgICAgICAgICAgICBleHRlcm5hbC9hcGFjaGUtaHR0cC9hcGkvYXBhY2hlLWh0dHAtbGVnYWN5LWN1cnJlbnQudHh0IFwKKyAgICAgICAgICAgICRACmRpZmYgLS1naXQgYS90ZXN0cy9zaWduYXR1cmUvYXBpL2J1aWxkX3htbF9hcGlfZmlsZS5tayBiL3Rlc3RzL3NpZ25hdHVyZS9hcGkvYnVpbGRfeG1sX2FwaV9maWxlLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTQ2OGJiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL3NpZ25hdHVyZS9hcGkvYnVpbGRfeG1sX2FwaV9maWxlLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotIyBTcGVjaWZ5IHRoZSBmb2xsb3dpbmcgMyB2YXJpYWJsZXMgYmVmb3JlIGluY2x1ZGluZzoKLSMKLSMgICAgIExPQ0FMX01PRFVMRV9TVEVNCi0jICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gZ2VuZXJhdGUsIGUuZy4gY3VycmVudC5hcGkKLSMKLSMgICAgIExPQ0FMX01PRFVMRQotIyAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgLSBtdXN0IGJlIHVuaXF1ZQotIwotIyAgICAgTE9DQUxfU1JDX0ZJTEVTCi0jICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBhcGkgdHh0IGZpbGUgLSBvbmx5IG9uZSBmaWxlIGFsbG93ZWQKLQotTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQwotTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfRVRDKQotCi0jIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0Ci1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cwotCi1pbmNsdWRlICQoQlVJTERfU1lTVEVNKS9iYXNlX3J1bGVzLm1rCi0kKExPQ0FMX0JVSUxUX01PRFVMRSkgOiAke0xPQ0FMX1NSQ19GSUxFU30gfCAkKEFQSUNIRUNLKQotCUBlY2hvICJDb252ZXJ0IEFQSSBmaWxlICQ8IC0+ICRAIgotCUBta2RpciAtcCAkKGRpciAkQCkKLQkkKGhpZGUpICQoQVBJQ0hFQ0tfQ09NTUFORCkgLWNvbnZlcnQyeG1sbm9zdHJpcCAkPCAkQApkaWZmIC0tZ2l0IGEvdGVzdHMvc2lnbmF0dXJlL2RleC1jaGVja2VyL0FuZHJvaWQubWsgYi90ZXN0cy9zaWduYXR1cmUvZGV4LWNoZWNrZXIvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTg2YTM2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc2lnbmF0dXJlL2RleC1jaGVja2VyL0FuZHJvaWQubWsKQEAgLTAsMCArMSwyNSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBsaWJjdHNfZGV4Y2hlY2tlcgorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKK0xPQ0FMX1NSQ19GSUxFUyA6PSBkZXgtY2hlY2tlci5jcHAKK0xPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yCitMT0NBTF9DX0lOQ0xVREVTIDo9ICQoSk5JX0hfSU5DTFVERSkKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKK0xPQ0FMX05ES19TVExfVkFSSUFOVCA6PSBjKytfc3RhdGljCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS90ZXN0cy9zaWduYXR1cmUvZGV4LWNoZWNrZXIvZGV4LWNoZWNrZXIuY3BwIGIvdGVzdHMvc2lnbmF0dXJlL2RleC1jaGVja2VyL2RleC1jaGVja2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWQ5ZTMyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc2lnbmF0dXJlL2RleC1jaGVja2VyL2RleC1jaGVja2VyLmNwcApAQCAtMCwwICsxLDk5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImpuaS5oIgorCitjbGFzcyBTY29wZWRVdGZDaGFycyB7CisgcHVibGljOgorICBTY29wZWRVdGZDaGFycyhKTklFbnYqIGVudiwganN0cmluZyBzKSA6IGVudl8oZW52KSwgc3RyaW5nXyhzKSB7CisgICAgaWYgKHMgPT0gTlVMTCkgeworICAgICAgdXRmX2NoYXJzXyA9IE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgIHV0Zl9jaGFyc18gPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKHMsIE5VTEwpOworICAgIH0KKyAgfQorCisgIH5TY29wZWRVdGZDaGFycygpIHsKKyAgICBpZiAodXRmX2NoYXJzXykgeworICAgICAgZW52Xy0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKHN0cmluZ18sIHV0Zl9jaGFyc18pOworICAgIH0KKyAgfQorCisgIGNvbnN0IGNoYXIqIGNfc3RyKCkgY29uc3QgeworICAgIHJldHVybiB1dGZfY2hhcnNfOworICB9CisKKyBwcml2YXRlOgorICBKTklFbnYqIGVudl87CisgIGpzdHJpbmcgc3RyaW5nXzsKKyAgY29uc3QgY2hhciogdXRmX2NoYXJzXzsKK307CisKK2V4dGVybiAiQyIgSk5JRVhQT1JUIGpvYmplY3QgSk5JQ0FMTAorSmF2YV9hbmRyb2lkX3NpZ25hdHVyZV9jdHNfRGV4TWVtYmVyQ2hlY2tlcl9nZXRGaWVsZF8xSk5JKAorICAgIEpOSUVudiogZW52LCBqY2xhc3MsIGpjbGFzcyBrbGFzcywganN0cmluZyBuYW1lLCBqc3RyaW5nIHR5cGUpIHsKKyAgU2NvcGVkVXRmQ2hhcnMgdXRmX25hbWUoZW52LCBuYW1lKTsKKyAgU2NvcGVkVXRmQ2hhcnMgdXRmX3R5cGUoZW52LCB0eXBlKTsKKyAgamZpZWxkSUQgZmlkID0gZW52LT5HZXRGaWVsZElEKGtsYXNzLCB1dGZfbmFtZS5jX3N0cigpLCB1dGZfdHlwZS5jX3N0cigpKTsKKyAgaWYgKGVudi0+RXhjZXB0aW9uQ2hlY2soKSkgeworICAgIC8vIEdldEZpZWxkSUQgY291bGQgaGF2ZSB0aHJvd24gZWl0aGVyIE5vU3VjaEZpZWxkRXJyb3Igb3IgRXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yLgorICAgIC8vIERvIG5vdCBjbGVhciB0aGUgZXhjZXB0aW9uLCBsZXQgSmF2YSBjb2RlIGhhbmRsZSBpdC4KKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICByZXR1cm4gZW52LT5Ub1JlZmxlY3RlZEZpZWxkKGtsYXNzLCBmaWQsIC8qIHN0YXRpYyAqLyBmYWxzZSk7Cit9CisKK2V4dGVybiAiQyIgSk5JRVhQT1JUIGpvYmplY3QgSk5JQ0FMTAorSmF2YV9hbmRyb2lkX3NpZ25hdHVyZV9jdHNfRGV4TWVtYmVyQ2hlY2tlcl9nZXRTdGF0aWNGaWVsZF8xSk5JKAorICAgIEpOSUVudiogZW52LCBqY2xhc3MsIGpjbGFzcyBrbGFzcywganN0cmluZyBuYW1lLCBqc3RyaW5nIHR5cGUpIHsKKyAgU2NvcGVkVXRmQ2hhcnMgdXRmX25hbWUoZW52LCBuYW1lKTsKKyAgU2NvcGVkVXRmQ2hhcnMgdXRmX3R5cGUoZW52LCB0eXBlKTsKKyAgamZpZWxkSUQgZmlkID0gZW52LT5HZXRTdGF0aWNGaWVsZElEKGtsYXNzLCB1dGZfbmFtZS5jX3N0cigpLCB1dGZfdHlwZS5jX3N0cigpKTsKKyAgaWYgKGVudi0+RXhjZXB0aW9uQ2hlY2soKSkgeworICAgIC8vIEdldFN0YXRpY0ZpZWxkSUQgY291bGQgaGF2ZSB0aHJvd24gZWl0aGVyIE5vU3VjaEZpZWxkRXJyb3Igb3IgRXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yLgorICAgIC8vIERvIG5vdCBjbGVhciB0aGUgZXhjZXB0aW9uLCBsZXQgSmF2YSBjb2RlIGhhbmRsZSBpdC4KKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICByZXR1cm4gZW52LT5Ub1JlZmxlY3RlZEZpZWxkKGtsYXNzLCBmaWQsIC8qIHN0YXRpYyAqLyB0cnVlKTsKK30KKworZXh0ZXJuICJDIiBKTklFWFBPUlQgam9iamVjdCBKTklDQUxMCitKYXZhX2FuZHJvaWRfc2lnbmF0dXJlX2N0c19EZXhNZW1iZXJDaGVja2VyX2dldE1ldGhvZF8xSk5JKAorICAgIEpOSUVudiogZW52LCBqY2xhc3MsIGpjbGFzcyBrbGFzcywganN0cmluZyBuYW1lLCBqc3RyaW5nIHNpZ25hdHVyZSkgeworICBTY29wZWRVdGZDaGFycyB1dGZfbmFtZShlbnYsIG5hbWUpOworICBTY29wZWRVdGZDaGFycyB1dGZfc2lnbmF0dXJlKGVudiwgc2lnbmF0dXJlKTsKKyAgam1ldGhvZElEIG1pZCA9IGVudi0+R2V0TWV0aG9kSUQoa2xhc3MsIHV0Zl9uYW1lLmNfc3RyKCksIHV0Zl9zaWduYXR1cmUuY19zdHIoKSk7CisgIGlmIChlbnYtPkV4Y2VwdGlvbkNoZWNrKCkpIHsKKyAgICAvLyBHZXRNZXRob2RJRCBjb3VsZCBoYXZlIHRocm93biBlaXRoZXIgTm9TdWNoTWV0aG9kRXJyb3Igb3IgRXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yLgorICAgIC8vIERvIG5vdCBjbGVhciB0aGUgZXhjZXB0aW9uLCBsZXQgSmF2YSBjb2RlIGhhbmRsZSBpdC4KKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICByZXR1cm4gZW52LT5Ub1JlZmxlY3RlZE1ldGhvZChrbGFzcywgbWlkLCAvKiBzdGF0aWMgKi8gZmFsc2UpOworfQorCitleHRlcm4gIkMiIEpOSUVYUE9SVCBqb2JqZWN0IEpOSUNBTEwKK0phdmFfYW5kcm9pZF9zaWduYXR1cmVfY3RzX0RleE1lbWJlckNoZWNrZXJfZ2V0U3RhdGljTWV0aG9kXzFKTkkoCisgICAgSk5JRW52KiBlbnYsIGpjbGFzcywgamNsYXNzIGtsYXNzLCBqc3RyaW5nIG5hbWUsIGpzdHJpbmcgc2lnbmF0dXJlKSB7CisgIFNjb3BlZFV0ZkNoYXJzIHV0Zl9uYW1lKGVudiwgbmFtZSk7CisgIFNjb3BlZFV0ZkNoYXJzIHV0Zl9zaWduYXR1cmUoZW52LCBzaWduYXR1cmUpOworICBqbWV0aG9kSUQgbWlkID0gZW52LT5HZXRTdGF0aWNNZXRob2RJRChrbGFzcywgdXRmX25hbWUuY19zdHIoKSwgdXRmX3NpZ25hdHVyZS5jX3N0cigpKTsKKyAgaWYgKGVudi0+RXhjZXB0aW9uQ2hlY2soKSkgeworICAgIC8vIEdldFN0YXRpY01ldGhvZElEIGNvdWxkIGhhdmUgdGhyb3duIGVpdGhlciBOb1N1Y2hNZXRob2RFcnJvciBvciBFeGNlcHRpb25JbkluaXRpYWxpemVyRXJyb3IuCisgICAgLy8gRG8gbm90IGNsZWFyIHRoZSBleGNlcHRpb24sIGxldCBKYXZhIGNvZGUgaGFuZGxlIGl0LgorICAgIHJldHVybiBudWxscHRyOworICB9CisgIHJldHVybiBlbnYtPlRvUmVmbGVjdGVkTWV0aG9kKGtsYXNzLCBtaWQsIC8qIHN0YXRpYyAqLyB0cnVlKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3NpZ25hdHVyZS9pbnRlbnQtY2hlY2svQW5kcm9pZC5tayBiL3Rlc3RzL3NpZ25hdHVyZS9pbnRlbnQtY2hlY2svQW5kcm9pZC5tawppbmRleCBjMjUxYzNmLi4zM2MxNTIzIDEwMDY0NAotLS0gYS90ZXN0cy9zaWduYXR1cmUvaW50ZW50LWNoZWNrL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvc2lnbmF0dXJlL2ludGVudC1jaGVjay9BbmRyb2lkLm1rCkBAIC0yOCw4ICsyOCw4IEBACiBMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CiAKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCi0gICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbCBcCi0gICAgYW5kcm9pZC1zdXBwb3J0LXRlc3QgXAorICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0IFwKKyAgICBhbmRyb2lkeC50ZXN0LnJ1bGVzIFwKICAgICBjdHMtc2lnbmF0dXJlLWNvbW1vbiBcCiAKIGluY2x1ZGUgJChCVUlMRF9DVFNfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL3Rlc3RzL3NpZ25hdHVyZS9pbnRlbnQtY2hlY2svQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL3NpZ25hdHVyZS9pbnRlbnQtY2hlY2svQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBhNDQ0MzUwLi45ZTQwY2E4IDEwMDY0NAotLS0gYS90ZXN0cy9zaWduYXR1cmUvaW50ZW50LWNoZWNrL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvc2lnbmF0dXJlL2ludGVudC1jaGVjay9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yNCw3ICsyNCw3IEBACiAgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIi8+CiAgICAgPC9hcHBsaWNhdGlvbj4KIAotICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuc2lnbmF0dXJlLmN0cy5pbnRlbnQiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJJbnRlbnQgU2lnbmF0dXJlIFRlc3QiLz4KIApkaWZmIC0tZ2l0IGEvdGVzdHMvc2lnbmF0dXJlL2ludGVudC1jaGVjay9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy9zaWduYXR1cmUvaW50ZW50LWNoZWNrL0FuZHJvaWRUZXN0LnhtbAppbmRleCBkYTY4OTViLi4xMzRhMTc1IDEwMDY0NAotLS0gYS90ZXN0cy9zaWduYXR1cmUvaW50ZW50LWNoZWNrL0FuZHJvaWRUZXN0LnhtbAorKysgYi90ZXN0cy9zaWduYXR1cmUvaW50ZW50LWNoZWNrL0FuZHJvaWRUZXN0LnhtbApAQCAtMTQsNiArMTQsNyBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIEludGVudCBTaWduYXR1cmUgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9InN5c3RlbXMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJub3Qtc2hhcmRhYmxlIiB2YWx1ZT0idHJ1ZSIgLz4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50YXJnZXRwcmVwLkR5bmFtaWNDb25maWdQdXNoZXIiPgpkaWZmIC0tZ2l0IGEvdGVzdHMvc2lnbmF0dXJlL2ludGVudC1jaGVjay9EeW5hbWljQ29uZmlnLnhtbCBiL3Rlc3RzL3NpZ25hdHVyZS9pbnRlbnQtY2hlY2svRHluYW1pY0NvbmZpZy54bWwKaW5kZXggN2Y3ZGU0Ny4uYmZhNTA0ZSAxMDA2NDQKLS0tIGEvdGVzdHMvc2lnbmF0dXJlL2ludGVudC1jaGVjay9EeW5hbWljQ29uZmlnLnhtbAorKysgYi90ZXN0cy9zaWduYXR1cmUvaW50ZW50LWNoZWNrL0R5bmFtaWNDb25maWcueG1sCkBAIC0xOSw1NCArMTksMjEgQEAKICAgICBCdWc6IDM2OTc3Nzc5IGFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQVNURVJfQ0xFQVIKICAgICBCdWc6IDM4MTgyNDY1IGFuZHJvaWQuaW50ZW50LmFjdGlvbi5BQ1RJT05fREVGQVVMVF9TTVNfU1VCU0NSSVBUSU9OX0NIQU5HRUQKICAgICBCdWc6IDcwMzE1Njk1IGFuZHJvaWQuaW50ZW50LmFjdGlvbi5IRE1JX1BMVUdHRUQKLSAgICBCdWc6IDExNTg0ODU2OCBhbmRyb2lkLmludGVudC5hY3Rpb24uQUNUSU9OX0FJUlBMQU5FX01PREVfQ0hBTkdFRAorICAgIEJ1ZzogNzg1NzQ4NzMgYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlFVSUNLU1RFUF9TRVJWSUNFCisgICAgQnVnOiA3ODU3NDg3MyBhbmRyb2lkLmludGVudC5hY3Rpb24uSU5TVEFMTF9FUEhFTUVSQUxfUEFDS0FHRQorICAgIEJ1ZzogNzg1NzQ4NzMgYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlJFU09MVkVfRVBIRU1FUkFMX1BBQ0tBR0UKKyAgICBCdWc6IDc4NTc0ODczIGFuZHJvaWQuaW50ZW50LmFjdGlvbi5FUEhFTUVSQUxfUkVTT0xWRVJfU0VUVElOR1MKKyAgICBCdWc6IDExNTc5OTk3NSBhbmRyb2lkLmludGVudC5hY3Rpb24uQUNUSU9OX0FJUlBMQU5FX01PREVfQ0hBTkdFRAogICAgICAgICAgV2lsbCBiZSByZW1vdmVkIGFmdGVyIHYxNyBvZiBDUy5hcGsgaXMgcmVsZWFzZWQuCi0gICAgQnVnOiAxMTQ4MDQ3NTMgYW5kcm9pZC5pbnRlbnQuYWN0aW9uLkRJU01JU1NfVElNRVIgKHB1YmxpYyBpbiBBUEkgMjgpCiAgICAgQnVnOiAxMTc1OTA5NDMgYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlZpZXcKICAgICAgICAgIEZpeGVkIGluIEdNU0NvcmUgdjE0LjcuNjguCi0gICAgQnVnOiA2NzEwOTAxNAotICAgIGFuZHJvaWQuaW50ZW50LmFjdGlvbi5FTUVSR0VOQ1lfU1RBVEVfQ0hBTkdFRAotICAgIGFuZHJvaWQuaW50ZW50LmFjdGlvbi5VU0VSX0FEREVECi0gICAgYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk9NQURNX0JST1dTRVJfU0VUX0hPTUVQQUdFCi0gICAgYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk9NQURNX0JST1dTRVJfR0VUX0hPTUVQQUdFCi0gICAgYW5kcm9pZC5pbnRlbnQuYWN0aW9uLkNTQ19CUk9XU0VSX1NFVF9IT01FUEFHRQotICAgIGFuZHJvaWQuaW50ZW50LmFjdGlvbi5DU0NfQlJPV1NFUl9TRVRfU0VBUkNIX0VOR0lORQotICAgIGFuZHJvaWQuaW50ZW50LmFjdGlvbi5TVEtfQlJPV1NFUl9HRVRfSE9NRVBBR0UyCi0gICAgYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlNCUk9XU0VSX1FSX1NDQU5fUkVTVUxUCi0gICAgYW5kcm9pZC5pbnRlbnQuYWN0aW9uLkJDU19SRVFVRVNUCi0gICAgYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlNUS19CUk9XU0VSX0dFVF9IT01FUEFHRQotICAgIGFuZHJvaWQuaW50ZW50LmFjdGlvbi5TQlJPV1NFUl9WSUVXX0ZPUl9FWFRFUk5BTF9BUFAKLSAgICBhbmRyb2lkLmludGVudC5hY3Rpb24uQ0hBTUVMRU9OX0JST1dTRVJfU0VUX0hPTUVQQUdFCi0gICAgYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlVTRVJfQURERUQKLSAgICBhbmRyb2lkLmludGVudC5hY3Rpb24uUEVET01FVEVSX1NFVFRJTkdfU1lOQwotICAgIGFuZHJvaWQuaW50ZW50LmFjdGlvbi5PTUFETV9CUk9XU0VSX1NFVF9IT01FUEFHRQotICAgIGFuZHJvaWQuaW50ZW50LmFjdGlvbi5PTUFETV9CUk9XU0VSX0dFVF9IT01FUEFHRQotICAgIGFuZHJvaWQuaW50ZW50LmFjdGlvbi5DU0NfQlJPV1NFUl9TRVRfSE9NRVBBR0UKLSAgICBhbmRyb2lkLmludGVudC5hY3Rpb24uQ1NDX0JST1dTRVJfU0VUX1NFQVJDSF9FTkdJTkUKLSAgICBhbmRyb2lkLmludGVudC5hY3Rpb24uU1RLX0JST1dTRVJfR0VUX0hPTUVQQUdFMgotICAgIGFuZHJvaWQuaW50ZW50LmFjdGlvbi5TQlJPV1NFUl9RUl9TQ0FOX1JFU1VMVAotICAgIGFuZHJvaWQuaW50ZW50LmFjdGlvbi5CQ1NfUkVRVUVTVAotICAgIGFuZHJvaWQuaW50ZW50LmFjdGlvbi5TVEtfQlJPV1NFUl9HRVRfSE9NRVBBR0UKLSAgICBhbmRyb2lkLmludGVudC5hY3Rpb24uU0JST1dTRVJfVklFV19GT1JfRVhURVJOQUxfQVBQCi0gICAgYW5kcm9pZC5pbnRlbnQuYWN0aW9uLkNIQU1FTEVPTl9CUk9XU0VSX1NFVF9IT01FUEFHRQotICAgIGFuZHJvaWQuaW50ZW50LmFjdGlvbi5TVE9QX05FVFdPUktfQk9PU1RFUgotICAgIGFuZHJvaWQuaW50ZW50LmFjdGlvbi5TVEFSVF9ORVRXT1JLX0JPT1NURVIKLSAgICBhbmRyb2lkLmludGVudC5hY3Rpb24uQkFER0VfQ09VTlRfVVBEQVRFCi0gICAgICAgIEFsbCBvZiB0aGVtKGV4Y2VwdCBCQURHRV9DT1VOVF9VUERBVEUpIHdpbGwgYmUgZml4ZWQgb24gUC4KLSAgICBCdWc6IEhvbmV5d2VsbCBjb20ucmVkYmVuZC5hcHAgYnVnOgotICAgIGFuZHJvaWQuaW50ZW50LmFjdGlvbi5TeW5jU1dWZXJzaW9uCi0gICAgYW5kcm9pZC5pbnRlbnQuYWN0aW9uLkFjdGlvblJhZGlvUmVzZXQKLSAgICBhbmRyb2lkLmludGVudC5hY3Rpb24uQWN0aW9uTWJiTm9PcHRJbgotICAgIGFuZHJvaWQuaW50ZW50LmFjdGlvbi5BY3Rpb25TdGFydEVtZXJnZW5jeUNhbGxFbmQKLSAgICBhbmRyb2lkLmludGVudC5hY3Rpb24uQWN0aW9uSGZhU21mUmVzdWx0Ci0gICAgYW5kcm9pZC5pbnRlbnQuYWN0aW9uLkFjdGlvblN0YXJ0RW1lcmdlbmN5Q2FsbAotICAgIGFuZHJvaWQuaW50ZW50LmFjdGlvbi5BY3Rpb25TZXRNYmJNYWludFdpbmRvdwotICAgIGFuZHJvaWQuaW50ZW50LmFjdGlvbi5BY3Rpb25TdGFydENJU2Vzc2lvbgotICAgIGFuZHJvaWQuaW50ZW50LmFjdGlvbi5URVNUCi0gICAgYW5kcm9pZC5pbnRlbnQuYWN0aW9uLkFjdGlvblNldE1iYkludGVydmFsCi0gICAgYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlJFR0lTVEVSX0hGQQotICAgIGFuZHJvaWQuaW50ZW50LmFjdGlvbi5BY3Rpb25IZmFSZW1pbmRlcgotICAgICAgICBGaXhlZCBpbiBIb25leXdlbGwncyByZWxlYXNlIGJ1aWxkIGF0IE5vdiAyNS4KKyAgICBCdWc6IDY3MTA5MDE0IGFuZHJvaWQuaW50ZW50LmFjdGlvbi5CQURHRV9DT1VOVF9VUERBVEUgLy8gU2Ftc3VuZyBpcyBzZW5kaW5nCisgICAgLy9uZXcgY29ycmVjdGVkIGludGVudCBhbmQgdGhlIG9sZCBpbnRlbnQgaW4gUC4KKyAgICAvL1RhcmdldCBkYXRlIGZvciBmaXggaXMgdW5kZXIgZGlzdWNzc2lvbiBmb3IgQkFER0VfQ09VTlRfVVBEQVRFCisgICAgQnVnOiAxMjg0MjQwNjAgYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlRJTUVMSU5FX1BPU1RfVklTSVRfQkFER0UgLy8KKyAgICAvL01hcHModmVyc2lvbjogMTAuMTEuMX4xMC4xMykgd2FzIHNlbmRpbmcgdGhpcyBpbnRlbnQgYW5kCisgICAgLy9mcm9tIHZlcnNpb24gMTAuMTQgbmV3ZXIgaW50ZW50ICdjb20uZ29vZ2xlLmFuZHJvaWQuYXBwcy5nbW0uVElNRUxJTkVfUE9TVF9WSVNJVF9CQURHRScKKyAgICAvL2lzIGJlaW5nIHNlbnQuCiAgICAgQnVnOiAxMjkzNDg3MjQgYW5kcm9pZC5pbnRlbnQuYWN0aW9uLkRFRklORSAocHVibGljIGluIEFQSSAyOSkKICAgICBCdWc6IDEyOTM0ODcyNCBhbmRyb2lkLmludGVudC5hY3Rpb24uVFJBTlNMQVRFIChwdWJsaWMgaW4gQVBJIDI5KQogLS0+CkBAIC03Niw0OCArNDMsMTQgQEAKICAgICAgIDx2YWx1ZT5hbmRyb2lkLmludGVudC5hY3Rpb24uUVVJQ0tCT09UX1BPV0VST048L3ZhbHVlPgogICAgICAgPHZhbHVlPmFuZHJvaWQuaW50ZW50LmFjdGlvbi5BQ1RJT05fREVGQVVMVF9TTVNfU1VCU0NSSVBUSU9OX0NIQU5HRUQ8L3ZhbHVlPgogICAgICAgPHZhbHVlPmFuZHJvaWQuaW50ZW50LmFjdGlvbi5IRE1JX1BMVUdHRUQ8L3ZhbHVlPgorICAgICAgPHZhbHVlPmFuZHJvaWQuaW50ZW50LmFjdGlvbi5RVUlDS1NURVBfU0VSVklDRTwvdmFsdWU+CisgICAgICA8dmFsdWU+YW5kcm9pZC5pbnRlbnQuYWN0aW9uLklOU1RBTExfRVBIRU1FUkFMX1BBQ0tBR0U8L3ZhbHVlPgorICAgICAgPHZhbHVlPmFuZHJvaWQuaW50ZW50LmFjdGlvbi5SRVNPTFZFX0VQSEVNRVJBTF9QQUNLQUdFPC92YWx1ZT4KKyAgICAgIDx2YWx1ZT5hbmRyb2lkLmludGVudC5hY3Rpb24uRVBIRU1FUkFMX1JFU09MVkVSX1NFVFRJTkdTPC92YWx1ZT4KICAgICAgIDx2YWx1ZT5hbmRyb2lkLmludGVudC5hY3Rpb24uQUNUSU9OX0FJUlBMQU5FX01PREVfQ0hBTkdFRDwvdmFsdWU+Ci0gICAgICA8dmFsdWU+YW5kcm9pZC5pbnRlbnQuYWN0aW9uLkRJU01JU1NfVElNRVI8L3ZhbHVlPgogICAgICAgPHZhbHVlPmFuZHJvaWQuaW50ZW50LmFjdGlvbi5WaWV3PC92YWx1ZT4KLSAgICAgIDx2YWx1ZT5hbmRyb2lkLmludGVudC5hY3Rpb24uRU1FUkdFTkNZX1NUQVRFX0NIQU5HRUQ8L3ZhbHVlPgotICAgICAgPHZhbHVlPmFuZHJvaWQuaW50ZW50LmFjdGlvbi5VU0VSX0FEREVEPC92YWx1ZT4KLSAgICAgIDx2YWx1ZT5hbmRyb2lkLmludGVudC5hY3Rpb24uT01BRE1fQlJPV1NFUl9TRVRfSE9NRVBBR0U8L3ZhbHVlPgotICAgICAgPHZhbHVlPmFuZHJvaWQuaW50ZW50LmFjdGlvbi5PTUFETV9CUk9XU0VSX0dFVF9IT01FUEFHRTwvdmFsdWU+Ci0gICAgICA8dmFsdWU+YW5kcm9pZC5pbnRlbnQuYWN0aW9uLkNTQ19CUk9XU0VSX1NFVF9IT01FUEFHRTwvdmFsdWU+Ci0gICAgICA8dmFsdWU+YW5kcm9pZC5pbnRlbnQuYWN0aW9uLkNTQ19CUk9XU0VSX1NFVF9TRUFSQ0hfRU5HSU5FPC92YWx1ZT4KLSAgICAgIDx2YWx1ZT5hbmRyb2lkLmludGVudC5hY3Rpb24uU1RLX0JST1dTRVJfR0VUX0hPTUVQQUdFMjwvdmFsdWU+Ci0gICAgICA8dmFsdWU+YW5kcm9pZC5pbnRlbnQuYWN0aW9uLlNCUk9XU0VSX1FSX1NDQU5fUkVTVUxUPC92YWx1ZT4KLSAgICAgIDx2YWx1ZT5hbmRyb2lkLmludGVudC5hY3Rpb24uQkNTX1JFUVVFU1Q8L3ZhbHVlPgotICAgICAgPHZhbHVlPmFuZHJvaWQuaW50ZW50LmFjdGlvbi5TVEtfQlJPV1NFUl9HRVRfSE9NRVBBR0U8L3ZhbHVlPgotICAgICAgPHZhbHVlPmFuZHJvaWQuaW50ZW50LmFjdGlvbi5TQlJPV1NFUl9WSUVXX0ZPUl9FWFRFUk5BTF9BUFA8L3ZhbHVlPgotICAgICAgPHZhbHVlPmFuZHJvaWQuaW50ZW50LmFjdGlvbi5DSEFNRUxFT05fQlJPV1NFUl9TRVRfSE9NRVBBR0U8L3ZhbHVlPgotICAgICAgPHZhbHVlPmFuZHJvaWQuaW50ZW50LmFjdGlvbi5VU0VSX0FEREVEPC92YWx1ZT4KLSAgICAgIDx2YWx1ZT5hbmRyb2lkLmludGVudC5hY3Rpb24uUEVET01FVEVSX1NFVFRJTkdfU1lOQzwvdmFsdWU+Ci0gICAgICA8dmFsdWU+YW5kcm9pZC5pbnRlbnQuYWN0aW9uLk9NQURNX0JST1dTRVJfU0VUX0hPTUVQQUdFPC92YWx1ZT4KLSAgICAgIDx2YWx1ZT5hbmRyb2lkLmludGVudC5hY3Rpb24uT01BRE1fQlJPV1NFUl9HRVRfSE9NRVBBR0U8L3ZhbHVlPgotICAgICAgPHZhbHVlPmFuZHJvaWQuaW50ZW50LmFjdGlvbi5DU0NfQlJPV1NFUl9TRVRfSE9NRVBBR0U8L3ZhbHVlPgotICAgICAgPHZhbHVlPmFuZHJvaWQuaW50ZW50LmFjdGlvbi5DU0NfQlJPV1NFUl9TRVRfU0VBUkNIX0VOR0lORTwvdmFsdWU+Ci0gICAgICA8dmFsdWU+YW5kcm9pZC5pbnRlbnQuYWN0aW9uLlNUS19CUk9XU0VSX0dFVF9IT01FUEFHRTI8L3ZhbHVlPgotICAgICAgPHZhbHVlPmFuZHJvaWQuaW50ZW50LmFjdGlvbi5TQlJPV1NFUl9RUl9TQ0FOX1JFU1VMVDwvdmFsdWU+Ci0gICAgICA8dmFsdWU+YW5kcm9pZC5pbnRlbnQuYWN0aW9uLkJDU19SRVFVRVNUPC92YWx1ZT4KLSAgICAgIDx2YWx1ZT5hbmRyb2lkLmludGVudC5hY3Rpb24uU1RLX0JST1dTRVJfR0VUX0hPTUVQQUdFPC92YWx1ZT4KLSAgICAgIDx2YWx1ZT5hbmRyb2lkLmludGVudC5hY3Rpb24uU0JST1dTRVJfVklFV19GT1JfRVhURVJOQUxfQVBQPC92YWx1ZT4KLSAgICAgIDx2YWx1ZT5hbmRyb2lkLmludGVudC5hY3Rpb24uQ0hBTUVMRU9OX0JST1dTRVJfU0VUX0hPTUVQQUdFPC92YWx1ZT4KLSAgICAgIDx2YWx1ZT5hbmRyb2lkLmludGVudC5hY3Rpb24uU1RPUF9ORVRXT1JLX0JPT1NURVI8L3ZhbHVlPgotICAgICAgPHZhbHVlPmFuZHJvaWQuaW50ZW50LmFjdGlvbi5TVEFSVF9ORVRXT1JLX0JPT1NURVI8L3ZhbHVlPgogICAgICAgPHZhbHVlPmFuZHJvaWQuaW50ZW50LmFjdGlvbi5CQURHRV9DT1VOVF9VUERBVEU8L3ZhbHVlPgotICAgICAgPHZhbHVlPmFuZHJvaWQuaW50ZW50LmFjdGlvbi5TeW5jU1dWZXJzaW9uPC92YWx1ZT4KLSAgICAgIDx2YWx1ZT5hbmRyb2lkLmludGVudC5hY3Rpb24uQWN0aW9uUmFkaW9SZXNldDwvdmFsdWU+Ci0gICAgICA8dmFsdWU+YW5kcm9pZC5pbnRlbnQuYWN0aW9uLkFjdGlvbk1iYk5vT3B0SW48L3ZhbHVlPgotICAgICAgPHZhbHVlPmFuZHJvaWQuaW50ZW50LmFjdGlvbi5BY3Rpb25TdGFydEVtZXJnZW5jeUNhbGxFbmQ8L3ZhbHVlPgotICAgICAgPHZhbHVlPmFuZHJvaWQuaW50ZW50LmFjdGlvbi5BY3Rpb25IZmFTbWZSZXN1bHQ8L3ZhbHVlPgotICAgICAgPHZhbHVlPmFuZHJvaWQuaW50ZW50LmFjdGlvbi5BY3Rpb25TdGFydEVtZXJnZW5jeUNhbGw8L3ZhbHVlPgotICAgICAgPHZhbHVlPmFuZHJvaWQuaW50ZW50LmFjdGlvbi5BY3Rpb25TZXRNYmJNYWludFdpbmRvdzwvdmFsdWU+Ci0gICAgICA8dmFsdWU+YW5kcm9pZC5pbnRlbnQuYWN0aW9uLkFjdGlvblN0YXJ0Q0lTZXNzaW9uPC92YWx1ZT4KLSAgICAgIDx2YWx1ZT5hbmRyb2lkLmludGVudC5hY3Rpb24uVEVTVDwvdmFsdWU+Ci0gICAgICA8dmFsdWU+YW5kcm9pZC5pbnRlbnQuYWN0aW9uLkFjdGlvblNldE1iYkludGVydmFsPC92YWx1ZT4KLSAgICAgIDx2YWx1ZT5hbmRyb2lkLmludGVudC5hY3Rpb24uUkVHSVNURVJfSEZBPC92YWx1ZT4KLSAgICAgIDx2YWx1ZT5hbmRyb2lkLmludGVudC5hY3Rpb24uQWN0aW9uSGZhUmVtaW5kZXI8L3ZhbHVlPgorICAgICAgPHZhbHVlPmFuZHJvaWQuaW50ZW50LmFjdGlvbi5USU1FTElORV9QT1NUX1ZJU0lUX0JBREdFPC92YWx1ZT4KICAgICAgIDx2YWx1ZT5hbmRyb2lkLmludGVudC5hY3Rpb24uREVGSU5FPC92YWx1ZT4KICAgICAgIDx2YWx1ZT5hbmRyb2lkLmludGVudC5hY3Rpb24uVFJBTlNMQVRFPC92YWx1ZT4KICAgICA8L2VudHJ5PgpkaWZmIC0tZ2l0IGEvdGVzdHMvc2lnbmF0dXJlL2ludGVudC1jaGVjay9zcmMvYW5kcm9pZC9zaWduYXR1cmUvY3RzL2ludGVudC9JbnRlbnRUZXN0LmphdmEgYi90ZXN0cy9zaWduYXR1cmUvaW50ZW50LWNoZWNrL3NyYy9hbmRyb2lkL3NpZ25hdHVyZS9jdHMvaW50ZW50L0ludGVudFRlc3QuamF2YQppbmRleCAyZjU1MWRjLi5hZjVjNGI5IDEwMDY0NAotLS0gYS90ZXN0cy9zaWduYXR1cmUvaW50ZW50LWNoZWNrL3NyYy9hbmRyb2lkL3NpZ25hdHVyZS9jdHMvaW50ZW50L0ludGVudFRlc3QuamF2YQorKysgYi90ZXN0cy9zaWduYXR1cmUvaW50ZW50LWNoZWNrL3NyYy9hbmRyb2lkL3NpZ25hdHVyZS9jdHMvaW50ZW50L0ludGVudFRlc3QuamF2YQpAQCAtMjIsMTIgKzIyLDEyIEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkFwcGxpY2F0aW9uSW5mbzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5zaWduYXR1cmUuY3RzLkFwaURvY3VtZW50UGFyc2VyOwotaW1wb3J0IGFuZHJvaWQuc2lnbmF0dXJlLmN0cy5KRGlmZkNsYXNzRGVzY3JpcHRpb247CiBpbXBvcnQgYW5kcm9pZC5zaWduYXR1cmUuY3RzLkpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZkZpZWxkOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkR5bmFtaWNDb25maWdEZXZpY2VTaWRlOwogCiBpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKQEAgLTEyNywyNSArMTI3LDIxIEBACiAKICAgICAgICAgU2V0PFN0cmluZz4gYW5kcm9pZEludGVudHMgPSBuZXcgSGFzaFNldDw+KCk7CiAKLSAgICAgICAgQXBpRG9jdW1lbnRQYXJzZXIgYXBpRG9jdW1lbnRQYXJzZXIgPSBuZXcgQXBpRG9jdW1lbnRQYXJzZXIoVEFHLAotICAgICAgICAgICAgICAgIG5ldyBBcGlEb2N1bWVudFBhcnNlci5MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbXBsZXRlZENsYXNzKEpEaWZmQ2xhc3NEZXNjcmlwdGlvbiBjbGFzc0Rlc2NyaXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEpEaWZmRmllbGQgZGlmZkZpZWxkIDogY2xhc3NEZXNjcmlwdGlvbi5nZXRGaWVsZExpc3QoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmaWVsZFZhbHVlID0gZGlmZkZpZWxkLmdldFZhbHVlU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkVmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZFZhbHVlID0gZmllbGRWYWx1ZS5yZXBsYWNlKCJcIiIsICIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkVmFsdWUuc3RhcnRzV2l0aChBTkRST0lEX0lOVEVOVF9QUkVGSVgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkSW50ZW50cy5hZGQoZmllbGRWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgQXBpRG9jdW1lbnRQYXJzZXIgYXBpRG9jdW1lbnRQYXJzZXIgPSBuZXcgQXBpRG9jdW1lbnRQYXJzZXIoVEFHKTsKKworICAgICAgICBhcGlEb2N1bWVudFBhcnNlci5wYXJzZUFzU3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0obmV3IEZpbGUoYXBpRmlsZU5hbWUpKSkuZm9yRWFjaCgKKyAgICAgICAgICAgICAgICBjbGFzc0Rlc2NyaXB0aW9uIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChKRGlmZkZpZWxkIGRpZmZGaWVsZCA6IGNsYXNzRGVzY3JpcHRpb24uZ2V0RmllbGRMaXN0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmaWVsZFZhbHVlID0gZGlmZkZpZWxkLmdldFZhbHVlU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRWYWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRWYWx1ZSA9IGZpZWxkVmFsdWUucmVwbGFjZSgiXCIiLCAiIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkVmFsdWUuc3RhcnRzV2l0aChBTkRST0lEX0lOVEVOVF9QUkVGSVgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRJbnRlbnRzLmFkZChmaWVsZFZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0pOwogCi0gICAgICAgIGFwaURvY3VtZW50UGFyc2VyLnBhcnNlKG5ldyBGaWxlSW5wdXRTdHJlYW0obmV3IEZpbGUoYXBpRmlsZU5hbWUpKSk7Ci0KICAgICAgICAgcmV0dXJuIGFuZHJvaWRJbnRlbnRzOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvdGVzdHMvc2lnbmF0dXJlL3J1blNpZ25hdHVyZVRlc3RzLnNoIGIvdGVzdHMvc2lnbmF0dXJlL3J1blNpZ25hdHVyZVRlc3RzLnNoCmluZGV4IDYyMzk3M2QuLmY4ZWMzZDEgMTAwNzU1Ci0tLSBhL3Rlc3RzL3NpZ25hdHVyZS9ydW5TaWduYXR1cmVUZXN0cy5zaAorKysgYi90ZXN0cy9zaWduYXR1cmUvcnVuU2lnbmF0dXJlVGVzdHMuc2gKQEAgLTQsNiArNCw4IEBACiAjCiAjIEJ1aWxkcyBhbmQgcnVucyBzaWduYXR1cmUgQVBLIHRlc3RzLgogCitzZXQgLWUKKwogaWYgWyAteiAiJEFORFJPSURfQlVJTERfVE9QIiBdOyB0aGVuCiAgICAgZWNobyAiTWlzc2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMuIERpZCB5b3UgcnVuIGJ1aWxkL2VudnNldHVwLnNoIGFuZCBsdW5jaD8iID4mMgogICAgIGV4aXQgMQpAQCAtMTIsMTEgKzE0LDI0IEBACiBpZiBbICQjIC1lcSAwIF07IHRoZW4KICAgICBQQUNLQUdFUz0iCiBDdHNDdXJyZW50QXBpU2lnbmF0dXJlVGVzdENhc2VzCi1DdHNTeXN0ZW1DdXJyZW50QXBpU2lnbmF0dXJlVGVzdENhc2VzCitDdHNTeXN0ZW1BcGlTaWduYXR1cmVUZXN0Q2FzZXMKIEN0c0FuZHJvaWRUZXN0TW9ja0N1cnJlbnRBcGlTaWduYXR1cmVUZXN0Q2FzZXMKIEN0c0FuZHJvaWRUZXN0UnVubmVyQ3VycmVudEFwaVNpZ25hdHVyZVRlc3RDYXNlcwotQ3RzTGVnYWN5VGVzdDI2QXBpU2lnbmF0dXJlVGVzdENhc2VzCitDdHNBbmRyb2lkVGVzdEJhc2UyN0FwaVNpZ25hdHVyZVRlc3RDYXNlcworCitDdHNBcGFjaGVIdHRwTGVnYWN5MjdBcGlTaWduYXR1cmVUZXN0Q2FzZXMKIEN0c0FwYWNoZUh0dHBMZWdhY3lDdXJyZW50QXBpU2lnbmF0dXJlVGVzdENhc2VzCitDdHNBcGFjaGVIdHRwTGVnYWN5VXNlc0xpYnJhcnlBcGlTaWduYXR1cmVUZXN0Q2FzZXMKKworQ3RzU3lzdGVtQXBpQW5ub3RhdGlvblRlc3RDYXNlcworCitDdHNIaWRkZW5BcGlCbGFja2xpc3RDdXJyZW50QXBpVGVzdENhc2VzCitDdHNIaWRkZW5BcGlCbGFja2xpc3RBcGkyN1Rlc3RDYXNlcworQ3RzSGlkZGVuQXBpQmxhY2tsaXN0RGVidWdDbGFzc1Rlc3RDYXNlcworCitDdHNIaWRkZW5BcGlLaWxsc3dpdGNoV2lsZGNhcmRUZXN0Q2FzZXMKK0N0c0hpZGRlbkFwaUtpbGxzd2l0Y2hXaGl0ZWxpc3RUZXN0Q2FzZXMKK0N0c0hpZGRlbkFwaUtpbGxzd2l0Y2hEZWJ1Z0NsYXNzVGVzdENhc2VzCiAiCiBlbHNlCiAgICAgUEFDS0FHRVM9JHsxKyIkQCJ9CmRpZmYgLS1naXQgYS90ZXN0cy9zaWduYXR1cmUvc3JjL2FuZHJvaWQvc2lnbmF0dXJlL2N0cy9BYnN0cmFjdEFwaUNoZWNrZXIuamF2YSBiL3Rlc3RzL3NpZ25hdHVyZS9zcmMvYW5kcm9pZC9zaWduYXR1cmUvY3RzL0Fic3RyYWN0QXBpQ2hlY2tlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NmI5MjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zaWduYXR1cmUvc3JjL2FuZHJvaWQvc2lnbmF0dXJlL2N0cy9BYnN0cmFjdEFwaUNoZWNrZXIuamF2YQpAQCAtMCwwICsxLDI1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQuc2lnbmF0dXJlLmN0czsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIHRob3NlIHRoYXQgcHJvY2VzcyBhIHNldCBvZiBBUEkgZGVmaW5pdGlvbiBmaWxlcyBhbmQgcGVyZm9ybSBzb21lIGNoZWNraW5nIG9uCisgKiB0aGVtLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBcGlDaGVja2VyIHsKKworICAgIGZpbmFsIFJlc3VsdE9ic2VydmVyIHJlc3VsdE9ic2VydmVyOworCisgICAgZmluYWwgQ2xhc3NQcm92aWRlciBjbGFzc1Byb3ZpZGVyOworCisgICAgQWJzdHJhY3RBcGlDaGVja2VyKENsYXNzUHJvdmlkZXIgY2xhc3NQcm92aWRlciwgUmVzdWx0T2JzZXJ2ZXIgcmVzdWx0T2JzZXJ2ZXIpIHsKKyAgICAgICAgdGhpcy5jbGFzc1Byb3ZpZGVyID0gY2xhc3NQcm92aWRlcjsKKyAgICAgICAgdGhpcy5yZXN1bHRPYnNlcnZlciA9IHJlc3VsdE9ic2VydmVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyB0ZXN0IGNsYXNzJ3MgbmFtZSwgbW9kaWZpZXIsIGZpZWxkcywgY29uc3RydWN0b3JzLCBhbmQKKyAgICAgKiBtZXRob2RzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNoZWNrU2lnbmF0dXJlQ29tcGxpYW5jZShKRGlmZkNsYXNzRGVzY3JpcHRpb24gY2xhc3NEZXNjcmlwdGlvbikgeworICAgICAgICBDbGFzczw/PiBydW50aW1lQ2xhc3MgPSBjaGVja0NsYXNzQ29tcGxpYW5jZShjbGFzc0Rlc2NyaXB0aW9uKTsKKyAgICAgICAgaWYgKHJ1bnRpbWVDbGFzcyAhPSBudWxsKSB7CisgICAgICAgICAgICBjaGVja0ZpZWxkc0NvbXBsaWFuY2UoY2xhc3NEZXNjcmlwdGlvbiwgcnVudGltZUNsYXNzKTsKKyAgICAgICAgICAgIGNoZWNrQ29uc3RydWN0b3JDb21wbGlhbmNlKGNsYXNzRGVzY3JpcHRpb24sIHJ1bnRpbWVDbGFzcyk7CisgICAgICAgICAgICBjaGVja01ldGhvZENvbXBsaWFuY2UoY2xhc3NEZXNjcmlwdGlvbiwgcnVudGltZUNsYXNzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyB0aGF0IHRoZSBjbGFzcyBmb3VuZCB0aHJvdWdoIHJlZmxlY3Rpb24gbWF0Y2hlcyB0aGUKKyAgICAgKiBzcGVjaWZpY2F0aW9uIGZyb20gdGhlIEFQSSB4bWwgZmlsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGFzc0Rlc2NyaXB0aW9uIGEgZGVzY3JpcHRpb24gb2YgYSBjbGFzcyBpbiBhbiBBUEkuCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHJpdmF0ZSBDbGFzczw/PiBjaGVja0NsYXNzQ29tcGxpYW5jZShKRGlmZkNsYXNzRGVzY3JpcHRpb24gY2xhc3NEZXNjcmlwdGlvbikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2xhc3M8Pz4gcnVudGltZUNsYXNzID0gUmVmbGVjdGlvbkhlbHBlcgorICAgICAgICAgICAgICAgICAgICAuZmluZFJlcXVpcmVkQ2xhc3MoY2xhc3NEZXNjcmlwdGlvbiwgY2xhc3NQcm92aWRlcik7CisKKyAgICAgICAgICAgIGlmIChydW50aW1lQ2xhc3MgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIE5vIGNsYXNzIGZvdW5kLCBub3RpZnkgdGhlIG9ic2VydmVyIGFjY29yZGluZyB0byB0aGUgY2xhc3MgdHlwZSwKKyAgICAgICAgICAgICAgICAvLyBpZiBtaXNzaW5nIGEgY2xhc3MgaXNuJ3QgYWNjZXB0YWJsZS4KKyAgICAgICAgICAgICAgICBpZiAoIWFsbG93TWlzc2luZ0NsYXNzKGNsYXNzRGVzY3JpcHRpb24pKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdE9ic2VydmVyLm5vdGlmeUZhaWx1cmUoRmFpbHVyZVR5cGUubWlzc2luZyhjbGFzc0Rlc2NyaXB0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc0Rlc2NyaXB0aW9uLmdldEFic29sdXRlQ2xhc3NOYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNsYXNzbG9hZGVyIGlzIHVuYWJsZSB0byBmaW5kICIgKyBjbGFzc0Rlc2NyaXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QWJzb2x1dGVDbGFzc05hbWUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIWNoZWNrQ2xhc3MoY2xhc3NEZXNjcmlwdGlvbiwgcnVudGltZUNsYXNzKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gcnVudGltZUNsYXNzOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nSGVscGVyLmxvZ2UoIkdvdCBleGNlcHRpb24gd2hlbiBjaGVja2luZyBjbGFzcyBjb21wbGlhbmNlIiwgZSk7CisgICAgICAgICAgICByZXN1bHRPYnNlcnZlci5ub3RpZnlGYWlsdXJlKAorICAgICAgICAgICAgICAgICAgICBGYWlsdXJlVHlwZS5DQVVHSFRfRVhDRVBUSU9OLAorICAgICAgICAgICAgICAgICAgICBjbGFzc0Rlc2NyaXB0aW9uLmdldEFic29sdXRlQ2xhc3NOYW1lKCksCisgICAgICAgICAgICAgICAgICAgICJFeGNlcHRpb24gd2hpbGUgY2hlY2tpbmcgY2xhc3MgY29tcGxpYW5jZSEiKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVyZm9ybSBhbnkgYWRkaXRpb25hbCBjaGVja3MgdGhhdCBjYW4gb25seSBiZSBkb25lIGFmdGVyIGFsbCBhcGkgZmlsZXMgaGF2ZSBiZWVuIHByb2Nlc3NlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBjaGVja0RlZmVycmVkKCk7CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnQgdG8gcHJvdmlkZSBjdXN0b20gY2hlY2sgb2YgdGhlIHN1cHBsaWVkIGNsYXNzIGRlc2NyaXB0aW9uLgorICAgICAqCisgICAgICogPHA+VGhpcyBzaG91bGQgbm90IHBlZm9ybSBjaGVja3Mgb24gdGhlIG1lbWJlcnMsIHRob3NlIHdpbGwgYmUgZG9uZSBzZXBhcmF0ZWx5IGRlcGVuZGluZworICAgICAqIG9uIHRoZSByZXN1bHQgb2YgdGhpcyBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xhc3NEZXNjcmlwdGlvbiB0aGUgY2xhc3MgZGVzY3JpcHRpb24gdG8gY2hlY2sKKyAgICAgKiBAcGFyYW0gcnVudGltZUNsYXNzIHRoZSBydW50aW1lIGNsYXNzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNsYXNzIGRlc2NyaXB0aW9uLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY2hlY2tzIHBhc3NlZCBhbmQgdGhlIG1lbWJlcnMgc2hvdWxkIG5vdyBiZSBjaGVja2VkLgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGNoZWNrQ2xhc3MoSkRpZmZDbGFzc0Rlc2NyaXB0aW9uIGNsYXNzRGVzY3JpcHRpb24sCisgICAgICAgICAgICBDbGFzczw/PiBydW50aW1lQ2xhc3MpOworCisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgdGhhdCBhIGNsYXNzIHRoYXQgZXhpc3RzIGluIHRoZSBBUEkgeG1sIGZpbGUgYnV0IHRoYXQgZG9lcyBub3QgZXhpc3QKKyAgICAgKiBpbiB0aGUgcnVudGltZSBpcyBhbGxvd2VkIG9yIG5vdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGFzc0Rlc2NyaXB0aW9uIHRoZSBjbGFzcyBkZXNjcmlwdGlvbiB0aGF0IGlzIG1pc3NpbmcuCisgICAgICogQHJldHVybiB0cnVlIGlmIG1pc3NpbmcgdGhlIGNsYXNzIGlzIGFjY2VwdGFibGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gYWxsb3dNaXNzaW5nQ2xhc3MoSkRpZmZDbGFzc0Rlc2NyaXB0aW9uIGNsYXNzRGVzY3JpcHRpb24pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyBhbGwgZmllbGRzIGluIHRlc3QgY2xhc3MgZm9yIGNvbXBsaWFuY2Ugd2l0aCB0aGUgQVBJIHhtbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGFzc0Rlc2NyaXB0aW9uIGEgZGVzY3JpcHRpb24gb2YgYSBjbGFzcyBpbiBhbiBBUEkuCisgICAgICogQHBhcmFtIHJ1bnRpbWVDbGFzcyB0aGUgcnVudGltZSBjbGFzcyBjb3JyZXNwb25kaW5nIHRvIHtAY29kZSBjbGFzc0Rlc2NyaXB0aW9ufS4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tGaWVsZHNDb21wbGlhbmNlKEpEaWZmQ2xhc3NEZXNjcmlwdGlvbiBjbGFzc0Rlc2NyaXB0aW9uLAorICAgICAgICAgICAgQ2xhc3M8Pz4gcnVudGltZUNsYXNzKSB7CisgICAgICAgIC8vIEEgbWFwIG9mIGZpZWxkIG5hbWUgdG8gZmllbGQgb2YgdGhlIGZpZWxkcyBjb250YWluZWQgaW4gcnVudGltZUNsYXNzLgorICAgICAgICBNYXA8U3RyaW5nLCBGaWVsZD4gY2xhc3NGaWVsZE1hcCA9IGJ1aWxkRmllbGRNYXAocnVudGltZUNsYXNzKTsKKyAgICAgICAgZm9yIChKRGlmZkNsYXNzRGVzY3JpcHRpb24uSkRpZmZGaWVsZCBmaWVsZCA6IGNsYXNzRGVzY3JpcHRpb24uZ2V0RmllbGRzKCkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgRmllbGQgZiA9IGNsYXNzRmllbGRNYXAuZ2V0KGZpZWxkLm1OYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoZiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdE9ic2VydmVyLm5vdGlmeUZhaWx1cmUoRmFpbHVyZVR5cGUuTUlTU0lOR19GSUVMRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC50b1JlYWRhYmxlU3RyaW5nKGNsYXNzRGVzY3JpcHRpb24uZ2V0QWJzb2x1dGVDbGFzc05hbWUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIGZpZWxkIHdpdGggY29ycmVjdCBzaWduYXR1cmUgZm91bmQ6IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC50b1NpZ25hdHVyZVN0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjaGVja0ZpZWxkKGNsYXNzRGVzY3JpcHRpb24sIHJ1bnRpbWVDbGFzcywgZmllbGQsIGYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nSGVscGVyLmxvZ2UoIkdvdCBleGNlcHRpb24gd2hlbiBjaGVja2luZyBmaWVsZCBjb21wbGlhbmNlIiwgZSk7CisgICAgICAgICAgICAgICAgcmVzdWx0T2JzZXJ2ZXIubm90aWZ5RmFpbHVyZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIEZhaWx1cmVUeXBlLkNBVUdIVF9FWENFUFRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC50b1JlYWRhYmxlU3RyaW5nKGNsYXNzRGVzY3JpcHRpb24uZ2V0QWJzb2x1dGVDbGFzc05hbWUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAiRXhjZXB0aW9uIHdoaWxlIGNoZWNraW5nIGZpZWxkIGNvbXBsaWFuY2UiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNjYW4gYSBjbGFzcyAoYW4gaXRzIGVudGlyZSBpbmhlcml0YW5jZSBjaGFpbikgZm9yIGZpZWxkcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSB7QGxpbmsgTWFwfSBvZiBmaWVsZE5hbWUgdG8ge0BsaW5rIEZpZWxkfQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIEZpZWxkPiBidWlsZEZpZWxkTWFwKENsYXNzIHRlc3RDbGFzcykgeworICAgICAgICBNYXA8U3RyaW5nLCBGaWVsZD4gZmllbGRNYXAgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIC8vIFNjYW4gdGhlIHN1cGVyY2xhc3MKKyAgICAgICAgaWYgKHRlc3RDbGFzcy5nZXRTdXBlcmNsYXNzKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgZmllbGRNYXAucHV0QWxsKGJ1aWxkRmllbGRNYXAodGVzdENsYXNzLmdldFN1cGVyY2xhc3MoKSkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2NhbiB0aGUgaW50ZXJmYWNlcworICAgICAgICBmb3IgKENsYXNzIGludGVyZmFjZUNsYXNzIDogdGVzdENsYXNzLmdldEludGVyZmFjZXMoKSkgeworICAgICAgICAgICAgZmllbGRNYXAucHV0QWxsKGJ1aWxkRmllbGRNYXAoaW50ZXJmYWNlQ2xhc3MpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIHRoZSBmaWVsZHMgaW4gdGhlIHRlc3QgY2xhc3MKKyAgICAgICAgZm9yIChGaWVsZCBmaWVsZCA6IHRlc3RDbGFzcy5nZXREZWNsYXJlZEZpZWxkcygpKSB7CisgICAgICAgICAgICBmaWVsZE1hcC5wdXQoZmllbGQuZ2V0TmFtZSgpLCBmaWVsZCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmllbGRNYXA7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgY2hlY2tGaWVsZChKRGlmZkNsYXNzRGVzY3JpcHRpb24gY2xhc3NEZXNjcmlwdGlvbiwKKyAgICAgICAgICAgIENsYXNzPD8+IHJ1bnRpbWVDbGFzcywKKyAgICAgICAgICAgIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZkZpZWxkIGZpZWxkRGVzY3JpcHRpb24sIEZpZWxkIGZpZWxkKTsKKworCisgICAgLyoqCisgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGNvbnN0cnVjdG9yIHBhcnNlZCBmcm9tIEFQSSB4bWwgZmlsZSBhbmQKKyAgICAgKiBKYXZhIHJlZmxlY3Rpb24gYXJlIGNvbXBsaWFudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGFzc0Rlc2NyaXB0aW9uIGEgZGVzY3JpcHRpb24gb2YgYSBjbGFzcyBpbiBhbiBBUEkuCisgICAgICogQHBhcmFtIHJ1bnRpbWVDbGFzcyB0aGUgcnVudGltZSBjbGFzcyBjb3JyZXNwb25kaW5nIHRvIHtAY29kZSBjbGFzc0Rlc2NyaXB0aW9ufS4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tDb25zdHJ1Y3RvckNvbXBsaWFuY2UoSkRpZmZDbGFzc0Rlc2NyaXB0aW9uIGNsYXNzRGVzY3JpcHRpb24sCisgICAgICAgICAgICBDbGFzczw/PiBydW50aW1lQ2xhc3MpIHsKKyAgICAgICAgZm9yIChKRGlmZkNsYXNzRGVzY3JpcHRpb24uSkRpZmZDb25zdHJ1Y3RvciBjb24gOiBjbGFzc0Rlc2NyaXB0aW9uLmdldENvbnN0cnVjdG9ycygpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIENvbnN0cnVjdG9yPD8+IGMgPSBSZWZsZWN0aW9uSGVscGVyLmZpbmRNYXRjaGluZ0NvbnN0cnVjdG9yKHJ1bnRpbWVDbGFzcywgY29uKTsKKyAgICAgICAgICAgICAgICBpZiAoYyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdE9ic2VydmVyLm5vdGlmeUZhaWx1cmUoRmFpbHVyZVR5cGUuTUlTU0lOR19DT05TVFJVQ1RPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb24udG9SZWFkYWJsZVN0cmluZyhjbGFzc0Rlc2NyaXB0aW9uLmdldEFic29sdXRlQ2xhc3NOYW1lKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBjb25zdHJ1Y3RvciB3aXRoIGNvcnJlY3Qgc2lnbmF0dXJlIGZvdW5kOiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uLnRvU2lnbmF0dXJlU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNoZWNrQ29uc3RydWN0b3IoY2xhc3NEZXNjcmlwdGlvbiwgcnVudGltZUNsYXNzLCBjb24sIGMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nSGVscGVyLmxvZ2UoIkdvdCBleGNlcHRpb24gd2hlbiBjaGVja2luZyBjb25zdHJ1Y3RvciBjb21wbGlhbmNlIiwgZSk7CisgICAgICAgICAgICAgICAgcmVzdWx0T2JzZXJ2ZXIubm90aWZ5RmFpbHVyZShGYWlsdXJlVHlwZS5DQVVHSFRfRVhDRVBUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uLnRvUmVhZGFibGVTdHJpbmcoY2xhc3NEZXNjcmlwdGlvbi5nZXRBYnNvbHV0ZUNsYXNzTmFtZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJFeGNlcHRpb24gd2hpbGUgY2hlY2tpbmcgY29uc3RydWN0b3IgY29tcGxpYW5jZSEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGNoZWNrQ29uc3RydWN0b3IoSkRpZmZDbGFzc0Rlc2NyaXB0aW9uIGNsYXNzRGVzY3JpcHRpb24sCisgICAgICAgICAgICBDbGFzczw/PiBydW50aW1lQ2xhc3MsCisgICAgICAgICAgICBKRGlmZkNsYXNzRGVzY3JpcHRpb24uSkRpZmZDb25zdHJ1Y3RvciBjdG9yRGVzY3JpcHRpb24sIENvbnN0cnVjdG9yPD8+IGN0b3IpOworCisgICAgLyoqCisgICAgICogQ2hlY2tzIHRoYXQgdGhlIG1ldGhvZCBmb3VuZCB0aHJvdWdoIHJlZmxlY3Rpb24gbWF0Y2hlcyB0aGUKKyAgICAgKiBzcGVjaWZpY2F0aW9uIGZyb20gdGhlIEFQSSB4bWwgZmlsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGFzc0Rlc2NyaXB0aW9uIGEgZGVzY3JpcHRpb24gb2YgYSBjbGFzcyBpbiBhbiBBUEkuCisgICAgICogQHBhcmFtIHJ1bnRpbWVDbGFzcyB0aGUgcnVudGltZSBjbGFzcyBjb3JyZXNwb25kaW5nIHRvIHtAY29kZSBjbGFzc0Rlc2NyaXB0aW9ufS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY2hlY2tNZXRob2RDb21wbGlhbmNlKEpEaWZmQ2xhc3NEZXNjcmlwdGlvbiBjbGFzc0Rlc2NyaXB0aW9uLAorICAgICAgICAgICAgQ2xhc3M8Pz4gcnVudGltZUNsYXNzKSB7CisgICAgICAgIGZvciAoSkRpZmZDbGFzc0Rlc2NyaXB0aW9uLkpEaWZmTWV0aG9kIG1ldGhvZCA6IGNsYXNzRGVzY3JpcHRpb24uZ2V0TWV0aG9kcygpKSB7CisgICAgICAgICAgICB0cnkgeworCisgICAgICAgICAgICAgICAgTWV0aG9kIG0gPSBSZWZsZWN0aW9uSGVscGVyLmZpbmRNYXRjaGluZ01ldGhvZChydW50aW1lQ2xhc3MsIG1ldGhvZCk7CisgICAgICAgICAgICAgICAgaWYgKG0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHRPYnNlcnZlci5ub3RpZnlGYWlsdXJlKEZhaWx1cmVUeXBlLk1JU1NJTkdfTUVUSE9ELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZC50b1JlYWRhYmxlU3RyaW5nKGNsYXNzRGVzY3JpcHRpb24uZ2V0QWJzb2x1dGVDbGFzc05hbWUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIG1ldGhvZCB3aXRoIGNvcnJlY3Qgc2lnbmF0dXJlIGZvdW5kOiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLnRvU2lnbmF0dXJlU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNoZWNrTWV0aG9kKGNsYXNzRGVzY3JpcHRpb24sIHJ1bnRpbWVDbGFzcywgbWV0aG9kLCBtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZ0hlbHBlci5sb2dlKCJHb3QgZXhjZXB0aW9uIHdoZW4gY2hlY2tpbmcgbWV0aG9kIGNvbXBsaWFuY2UiLCBlKTsKKyAgICAgICAgICAgICAgICByZXN1bHRPYnNlcnZlci5ub3RpZnlGYWlsdXJlKEZhaWx1cmVUeXBlLkNBVUdIVF9FWENFUFRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QudG9SZWFkYWJsZVN0cmluZyhjbGFzc0Rlc2NyaXB0aW9uLmdldEFic29sdXRlQ2xhc3NOYW1lKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIkV4Y2VwdGlvbiB3aGlsZSBjaGVja2luZyBtZXRob2QgY29tcGxpYW5jZSEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGNoZWNrTWV0aG9kKEpEaWZmQ2xhc3NEZXNjcmlwdGlvbiBjbGFzc0Rlc2NyaXB0aW9uLAorICAgICAgICAgICAgQ2xhc3M8Pz4gcnVudGltZUNsYXNzLAorICAgICAgICAgICAgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uLkpEaWZmTWV0aG9kIG1ldGhvZERlc2NyaXB0aW9uLCBNZXRob2QgbWV0aG9kKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3NpZ25hdHVyZS9zcmMvYW5kcm9pZC9zaWduYXR1cmUvY3RzL0Fubm90YXRpb25DaGVja2VyLmphdmEgYi90ZXN0cy9zaWduYXR1cmUvc3JjL2FuZHJvaWQvc2lnbmF0dXJlL2N0cy9Bbm5vdGF0aW9uQ2hlY2tlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMTExYTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zaWduYXR1cmUvc3JjL2FuZHJvaWQvc2lnbmF0dXJlL2N0cy9Bbm5vdGF0aW9uQ2hlY2tlci5qYXZhCkBAIC0wLDAgKzEsMTcyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5zaWduYXR1cmUuY3RzOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIENoZWNrcyB0aGF0IHRoZSBydW50aW1lIHJlcHJlc2VudGF0aW9uIG9mIGEgY2xhc3MgbWF0Y2hlcyB0aGUgQVBJIHJlcHJlc2VudGF0aW9uIG9mIGEgY2xhc3MuCisgKi8KK3B1YmxpYyBjbGFzcyBBbm5vdGF0aW9uQ2hlY2tlciBleHRlbmRzIEFic3RyYWN0QXBpQ2hlY2tlciB7CisKKyAgICBwcml2YXRlIGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBhbm5vdGF0aW9uQ2xhc3M7CisKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIENsYXNzPD8+PiBhbm5vdGF0ZWRDbGFzc2VzTWFwID0gbmV3IEhhc2hNYXA8PigpOworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgU2V0PENvbnN0cnVjdG9yPD8+Pj4gYW5ub3RhdGVkQ29uc3RydWN0b3JzTWFwID0gbmV3IEhhc2hNYXA8PigpOworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgU2V0PE1ldGhvZD4+IGFubm90YXRlZE1ldGhvZHNNYXAgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBTZXQ8RmllbGQ+PiBhbm5vdGF0ZWRGaWVsZHNNYXAgPSBuZXcgSGFzaE1hcDw+KCk7CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbk5hbWUgbmFtZSBvZiB0aGUgYW5ub3RhdGlvbiBjbGFzcyBmb3IgdGhlIEFQSSB0eXBlIChlLmcuCisgICAgICogICAgICBhbmRyb2lkLmFubm90YXRpb24uU3lzdGVtQXBpKQorICAgICAqLworICAgIHB1YmxpYyBBbm5vdGF0aW9uQ2hlY2tlcigKKyAgICAgICAgICAgIFJlc3VsdE9ic2VydmVyIHJlc3VsdE9ic2VydmVyLCBDbGFzc1Byb3ZpZGVyIGNsYXNzUHJvdmlkZXIsIFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgeworICAgICAgICBzdXBlcihjbGFzc1Byb3ZpZGVyLCByZXN1bHRPYnNlcnZlcik7CisKKyAgICAgICAgYW5ub3RhdGlvbkNsYXNzID0gUmVmbGVjdGlvbkhlbHBlci5nZXRBbm5vdGF0aW9uQ2xhc3MoYW5ub3RhdGlvbk5hbWUpOworICAgICAgICBjbGFzc1Byb3ZpZGVyLmdldEFsbENsYXNzZXMoKS5mb3JFYWNoKGNsYXp6IC0+IHsKKyAgICAgICAgICAgIGlmIChjbGF6ei5pc0Fubm90YXRpb25QcmVzZW50KGFubm90YXRpb25DbGFzcykpIHsKKyAgICAgICAgICAgICAgICBhbm5vdGF0ZWRDbGFzc2VzTWFwLnB1dChjbGF6ei5nZXROYW1lKCksIGNsYXp6KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFNldDxDb25zdHJ1Y3Rvcjw/Pj4gY29uc3RydWN0b3JzID0gUmVmbGVjdGlvbkhlbHBlci5nZXRBbm5vdGF0ZWRDb25zdHJ1Y3RvcnMoY2xhenosCisgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25DbGFzcyk7CisgICAgICAgICAgICBpZiAoIWNvbnN0cnVjdG9ycy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBhbm5vdGF0ZWRDb25zdHJ1Y3RvcnNNYXAucHV0KGNsYXp6LmdldE5hbWUoKSwgY29uc3RydWN0b3JzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFNldDxNZXRob2Q+IG1ldGhvZHMgPSBSZWZsZWN0aW9uSGVscGVyLmdldEFubm90YXRlZE1ldGhvZHMoY2xhenosIGFubm90YXRpb25DbGFzcyk7CisgICAgICAgICAgICBpZiAoIW1ldGhvZHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgYW5ub3RhdGVkTWV0aG9kc01hcC5wdXQoY2xhenouZ2V0TmFtZSgpLCBtZXRob2RzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFNldDxGaWVsZD4gZmllbGRzID0gUmVmbGVjdGlvbkhlbHBlci5nZXRBbm5vdGF0ZWRGaWVsZHMoY2xhenosIGFubm90YXRpb25DbGFzcyk7CisgICAgICAgICAgICBpZiAoIWZpZWxkcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBhbm5vdGF0ZWRGaWVsZHNNYXAucHV0KGNsYXp6LmdldE5hbWUoKSwgZmllbGRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2hlY2tEZWZlcnJlZCgpIHsKKyAgICAgICAgZm9yIChDbGFzczw/PiBjbGF6eiA6IGFubm90YXRlZENsYXNzZXNNYXAudmFsdWVzKCkpIHsKKyAgICAgICAgICAgIHJlc3VsdE9ic2VydmVyLm5vdGlmeUZhaWx1cmUoRmFpbHVyZVR5cGUuRVhUUkFfQ0xBU1MsIGNsYXp6LmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgIkNsYXNzIGFubm90YXRlZCB3aXRoICIgKyBhbm5vdGF0aW9uQ2xhc3MuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXMgbm90IGV4aXN0IGluIHRoZSBkb2N1bWVudGVkIEFQSSIpOworICAgICAgICB9CisgICAgICAgIGZvciAoU2V0PENvbnN0cnVjdG9yPD8+PiBzZXQgOiBhbm5vdGF0ZWRDb25zdHJ1Y3RvcnNNYXAudmFsdWVzKCkpIHsKKyAgICAgICAgICAgIGZvciAoQ29uc3RydWN0b3I8Pz4gYyA6IHNldCkgeworICAgICAgICAgICAgICAgIHJlc3VsdE9ic2VydmVyLm5vdGlmeUZhaWx1cmUoRmFpbHVyZVR5cGUuRVhUUkFfTUVUSE9ELCBjLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAiQ29uc3RydWN0b3IgYW5ub3RhdGVkIHdpdGggIiArIGFubm90YXRpb25DbGFzcy5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXMgbm90IGV4aXN0IGluIHRoZSBBUEkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKFNldDxNZXRob2Q+IHNldCA6IGFubm90YXRlZE1ldGhvZHNNYXAudmFsdWVzKCkpIHsKKyAgICAgICAgICAgIGZvciAoTWV0aG9kIG0gOiBzZXQpIHsKKyAgICAgICAgICAgICAgICByZXN1bHRPYnNlcnZlci5ub3RpZnlGYWlsdXJlKEZhaWx1cmVUeXBlLkVYVFJBX01FVEhPRCwgbS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgIk1ldGhvZCBhbm5vdGF0ZWQgd2l0aCAiICsgYW5ub3RhdGlvbkNsYXNzLmdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZG9lcyBub3QgZXhpc3QgaW4gdGhlIEFQSSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoU2V0PEZpZWxkPiBzZXQgOiBhbm5vdGF0ZWRGaWVsZHNNYXAudmFsdWVzKCkpIHsKKyAgICAgICAgICAgIGZvciAoRmllbGQgZiA6IHNldCkgeworICAgICAgICAgICAgICAgIHJlc3VsdE9ic2VydmVyLm5vdGlmeUZhaWx1cmUoRmFpbHVyZVR5cGUuRVhUUkFfRklFTEQsIGYudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJGaWVsZCBhbm5vdGF0ZWQgd2l0aCAiICsgYW5ub3RhdGlvbkNsYXNzLmdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZG9lcyBub3QgZXhpc3QgaW4gdGhlIEFQSSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gYWxsb3dNaXNzaW5nQ2xhc3MoSkRpZmZDbGFzc0Rlc2NyaXB0aW9uIGNsYXNzRGVzY3JpcHRpb24pIHsKKyAgICAgICAgLy8gQSBjbGFzcyB0aGF0IGV4aXN0IGluIHRoZSBBUEkgZG9jdW1lbnQgaXMgbm90IGZvdW5kIGluIHRoZSBydW50aW1lLgorICAgICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gZm9yIGNsYXNzZXMgdGhhdCBhcmUgb3B0aW9uYWwgKGUuZy4gY2xhc3NlcyBmb3IKKyAgICAgICAgLy8gQW5kcm9pZCBBdXRvKS4gVGhpcywgaG93ZXZlciwgc2hvdWxkIG5vdCBiZSBjb25zaWRlcmVkIGFzIGEgdGVzdAorICAgICAgICAvLyBmYWlsdXJlLCBiZWNhdXNlIHRoZSBwdXJwb3NlIG9mIHRoaXMgdGVzdCBpcyB0byBlbnN1cmUgdGhhdCBldmVyeQorICAgICAgICAvLyBydW50aW1lIGNsYXNzZXMgZm91bmQgaW4gdGhlIGRldmljZSBoYXZlIG1vcmUgYW5ub3RhdGlvbnMgdGhhbgorICAgICAgICAvLyB0aGUgZG9jdW1lbnRlZC4KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tDbGFzcyhKRGlmZkNsYXNzRGVzY3JpcHRpb24gY2xhc3NEZXNjcmlwdGlvbiwgQ2xhc3M8Pz4gcnVudGltZUNsYXNzKSB7CisgICAgICAgIC8vIHJlbW92ZSB0aGUgY2xhc3MgZnJvbSB0aGUgc2V0IGlmIGZvdW5kCisgICAgICAgIGFubm90YXRlZENsYXNzZXNNYXAucmVtb3ZlKHJ1bnRpbWVDbGFzcy5nZXROYW1lKCkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja0ZpZWxkKEpEaWZmQ2xhc3NEZXNjcmlwdGlvbiBjbGFzc0Rlc2NyaXB0aW9uLCBDbGFzczw/PiBydW50aW1lQ2xhc3MsCisgICAgICAgICAgICBKRGlmZkNsYXNzRGVzY3JpcHRpb24uSkRpZmZGaWVsZCBmaWVsZERlc2NyaXB0aW9uLCBGaWVsZCBmaWVsZCkgeworICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB0aGUgZmllbGQgKG9yIGl0cyBkZWNsYXJpbmcgY2xhc3MpIGlzIGFubm90YXRlZAorICAgICAgICBpZiAoIVJlZmxlY3Rpb25IZWxwZXIuaXNBbm5vdGF0ZWRPckluQW5ub3RhdGVkQ2xhc3MoZmllbGQsIGFubm90YXRpb25DbGFzcykpIHsKKyAgICAgICAgICAgIHJlc3VsdE9ic2VydmVyLm5vdGlmeUZhaWx1cmUoRmFpbHVyZVR5cGUuTUlTU0lOR19BTk5PVEFUSU9OLAorICAgICAgICAgICAgICAgICAgICBmaWVsZC50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAiQW5ub3RhdGlvbiAiICsgYW5ub3RhdGlvbkNsYXNzLmdldE5hbWUoKSArICIgaXMgbWlzc2luZyIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gcmVtb3ZlIGl0IGZyb20gdGhlIHNldCBpZiBmb3VuZCBpbiB0aGUgQVBJIGRvYworICAgICAgICBTZXQ8RmllbGQ+IGFubm90YXRlZEZpZWxkcyA9IGFubm90YXRlZEZpZWxkc01hcC5nZXQocnVudGltZUNsYXNzLmdldE5hbWUoKSk7CisgICAgICAgIGlmIChhbm5vdGF0ZWRGaWVsZHMgIT0gbnVsbCkgeworICAgICAgICAgICAgYW5ub3RhdGVkRmllbGRzLnJlbW92ZShmaWVsZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja0NvbnN0cnVjdG9yKEpEaWZmQ2xhc3NEZXNjcmlwdGlvbiBjbGFzc0Rlc2NyaXB0aW9uLCBDbGFzczw/PiBydW50aW1lQ2xhc3MsCisgICAgICAgICAgICBKRGlmZkNsYXNzRGVzY3JpcHRpb24uSkRpZmZDb25zdHJ1Y3RvciBjdG9yRGVzY3JpcHRpb24sIENvbnN0cnVjdG9yPD8+IGN0b3IpIHsKKyAgICAgICAgU2V0PENvbnN0cnVjdG9yPD8+PiBhbm5vdGF0ZWRDb25zdHJ1Y3RvcnMgPSBhbm5vdGF0ZWRDb25zdHJ1Y3RvcnNNYXAKKyAgICAgICAgICAgICAgICAuZ2V0KHJ1bnRpbWVDbGFzcy5nZXROYW1lKCkpOworCisgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHRoZSBjb25zdHJ1Y3RvciAob3IgaXRzIGRlY2xhcmluZyBjbGFzcykgaXMgYW5ub3RhdGVkCisgICAgICAgIGlmIChhbm5vdGF0aW9uQ2xhc3MgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKCFSZWZsZWN0aW9uSGVscGVyLmlzQW5ub3RhdGVkT3JJbkFubm90YXRlZENsYXNzKGN0b3IsIGFubm90YXRpb25DbGFzcykpIHsKKyAgICAgICAgICAgICAgICByZXN1bHRPYnNlcnZlci5ub3RpZnlGYWlsdXJlKEZhaWx1cmVUeXBlLk1JU1NJTkdfQU5OT1RBVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGN0b3IudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJBbm5vdGF0aW9uICIgKyBhbm5vdGF0aW9uQ2xhc3MuZ2V0TmFtZSgpICsgIiBpcyBtaXNzaW5nIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyByZW1vdmUgaXQgZnJvbSB0aGUgc2V0IGlmIGZvdW5kIGluIHRoZSBBUEkgZG9jCisgICAgICAgIGlmIChhbm5vdGF0ZWRDb25zdHJ1Y3RvcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgYW5ub3RhdGVkQ29uc3RydWN0b3JzLnJlbW92ZShjdG9yKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrTWV0aG9kKEpEaWZmQ2xhc3NEZXNjcmlwdGlvbiBjbGFzc0Rlc2NyaXB0aW9uLCBDbGFzczw/PiBydW50aW1lQ2xhc3MsCisgICAgICAgICAgICBKRGlmZkNsYXNzRGVzY3JpcHRpb24uSkRpZmZNZXRob2QgbWV0aG9kRGVzY3JpcHRpb24sIE1ldGhvZCBtZXRob2QpIHsKKyAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgdGhlIG1ldGhvZCAob3IgaXRzIGRlY2xhcmluZyBjbGFzcykgaXMgYW5ub3RhdGVkIG9yIG92ZXJyaWRpbmcKKyAgICAgICAgLy8gYW5ub3RhdGVkIG1ldGhvZC4KKyAgICAgICAgaWYgKCFSZWZsZWN0aW9uSGVscGVyLmlzQW5ub3RhdGVkT3JJbkFubm90YXRlZENsYXNzKG1ldGhvZCwgYW5ub3RhdGlvbkNsYXNzKQorICAgICAgICAgICAgICAgICYmICFSZWZsZWN0aW9uSGVscGVyLmlzT3ZlcnJpZGluZ0Fubm90YXRlZE1ldGhvZChtZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uQ2xhc3MpKSB7CisgICAgICAgICAgICByZXN1bHRPYnNlcnZlci5ub3RpZnlGYWlsdXJlKEZhaWx1cmVUeXBlLk1JU1NJTkdfQU5OT1RBVElPTiwKKyAgICAgICAgICAgICAgICAgICAgbWV0aG9kLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICJBbm5vdGF0aW9uICIgKyBhbm5vdGF0aW9uQ2xhc3MuZ2V0TmFtZSgpICsgIiBpcyBtaXNzaW5nIik7CisgICAgICAgIH0KKworICAgICAgICAvLyByZW1vdmUgaXQgZnJvbSB0aGUgc2V0IGlmIGZvdW5kIGluIHRoZSBBUEkgZG9jCisgICAgICAgIFNldDxNZXRob2Q+IGFubm90YXRlZE1ldGhvZHMgPSBhbm5vdGF0ZWRNZXRob2RzTWFwLmdldChydW50aW1lQ2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAgICAgaWYgKGFubm90YXRlZE1ldGhvZHMgIT0gbnVsbCkgeworICAgICAgICAgICAgYW5ub3RhdGVkTWV0aG9kcy5yZW1vdmUobWV0aG9kKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3NpZ25hdHVyZS9zcmMvYW5kcm9pZC9zaWduYXR1cmUvY3RzL0FwaUNvbXBsaWFuY2VDaGVja2VyLmphdmEgYi90ZXN0cy9zaWduYXR1cmUvc3JjL2FuZHJvaWQvc2lnbmF0dXJlL2N0cy9BcGlDb21wbGlhbmNlQ2hlY2tlci5qYXZhCmluZGV4IDhkYmY1ZTcuLmE3MjA1OWYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3NpZ25hdHVyZS9zcmMvYW5kcm9pZC9zaWduYXR1cmUvY3RzL0FwaUNvbXBsaWFuY2VDaGVja2VyLmphdmEKKysrIGIvdGVzdHMvc2lnbmF0dXJlL3NyYy9hbmRyb2lkL3NpZ25hdHVyZS9jdHMvQXBpQ29tcGxpYW5jZUNoZWNrZXIuamF2YQpAQCAtMjAsMTggKzIwLDE0IEBACiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIC8qKgogICogQ2hlY2tzIHRoYXQgdGhlIHJ1bnRpbWUgcmVwcmVzZW50YXRpb24gb2YgYSBjbGFzcyBtYXRjaGVzIHRoZSBBUEkgcmVwcmVzZW50YXRpb24gb2YgYSBjbGFzcy4KICAqLwotcHVibGljIGNsYXNzIEFwaUNvbXBsaWFuY2VDaGVja2VyIHsKK3B1YmxpYyBjbGFzcyBBcGlDb21wbGlhbmNlQ2hlY2tlciBleHRlbmRzIEFic3RyYWN0QXBpQ2hlY2tlciB7CiAKICAgICAvKiogSW5kaWNhdGVzIHRoYXQgdGhlIGNsYXNzIGlzIGFuIGFubm90YXRpb24uICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENMQVNTX01PRElGSUVSX0FOTk9UQVRJT04gPSAweDAwMDAyMDAwOwpAQCAtNDgsMTg5ICs0NCw1NiBAQAogICAgIC8qKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbWV0aG9kIGlzIGEgc3ludGhldGljIG1ldGhvZC4gKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVUSE9EX01PRElGSUVSX1NZTlRIRVRJQyA9IDB4MDAwMDEwMDA7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBISURERU5fSU5URVJGQUNFX1dISVRFTElTVCA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIEludGVyZmFjZUNoZWNrZXIgaW50ZXJmYWNlQ2hlY2tlcjsKIAotICAgIHN0YXRpYyB7Ci0gICAgICAgIC8vIEludGVyZmFjZXMgdGhhdCBkZWZpbmUgQGhpZGUgb3IgQFN5c3RlbUFwaSBvciBAVGVzdEFwaSBtZXRob2RzIHdpbGwgYnkgZGVmaW5pdGlvbiBjb250YWluCi0gICAgICAgIC8vIG1ldGhvZHMgdGhhdCBkbyBub3QgYXBwZWFyIGluIGN1cnJlbnQudHh0LiBJbnRlcmZhY2VzIGFkZGVkIHRvIHRoaXMKLSAgICAgICAgLy8gbGlzdCBhcmUgcHJvYmFibHkgbm90IG1lYW50IHRvIGJlIGltcGxlbWVudGVkIGluIGFuIGFwcGxpY2F0aW9uLgotICAgICAgICBISURERU5fSU5URVJGQUNFX1dISVRFTElTVC5hZGQoInB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGFuZHJvaWQuY29tcGFuaW9uLkRldmljZUZpbHRlci5tYXRjaGVzKEQpIik7Ci0gICAgICAgIEhJRERFTl9JTlRFUkZBQ0VfV0hJVEVMSVNULmFkZCgicHVibGljIHN0YXRpYyA8RD4gYm9vbGVhbiBhbmRyb2lkLmNvbXBhbmlvbi5EZXZpY2VGaWx0ZXIubWF0Y2hlcyhhbmRyb2lkLmNvbXBhbmlvbi5EZXZpY2VGaWx0ZXI8RD4sRCkiKTsKLSAgICAgICAgSElEREVOX0lOVEVSRkFDRV9XSElURUxJU1QuYWRkKCJwdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBhbmRyb2lkLmNvbXBhbmlvbi5EZXZpY2VGaWx0ZXIuZ2V0RGV2aWNlRGlzcGxheU5hbWUoRCkiKTsKLSAgICAgICAgSElEREVOX0lOVEVSRkFDRV9XSElURUxJU1QuYWRkKCJwdWJsaWMgYWJzdHJhY3QgaW50IGFuZHJvaWQuY29tcGFuaW9uLkRldmljZUZpbHRlci5nZXRNZWRpdW1UeXBlKCkiKTsKLSAgICAgICAgSElEREVOX0lOVEVSRkFDRV9XSElURUxJU1QuYWRkKCJwdWJsaWMgYWJzdHJhY3Qgdm9pZCBhbmRyb2lkLm5mYy50ZWNoLlRhZ1RlY2hub2xvZ3kucmVjb25uZWN0KCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24iKTsKLSAgICAgICAgSElEREVOX0lOVEVSRkFDRV9XSElURUxJU1QuYWRkKCJwdWJsaWMgYWJzdHJhY3Qgdm9pZCBhbmRyb2lkLm9zLklCaW5kZXIuc2hlbGxDb21tYW5kKGphdmEuaW8uRmlsZURlc2NyaXB0b3IsamF2YS5pby5GaWxlRGVzY3JpcHRvcixqYXZhLmlvLkZpbGVEZXNjcmlwdG9yLGphdmEubGFuZy5TdHJpbmdbXSxhbmRyb2lkLm9zLlNoZWxsQ2FsbGJhY2ssYW5kcm9pZC5vcy5SZXN1bHRSZWNlaXZlcikgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uIik7Ci0gICAgICAgIEhJRERFTl9JTlRFUkZBQ0VfV0hJVEVMSVNULmFkZCgicHVibGljIGFic3RyYWN0IGludCBhbmRyb2lkLnRleHQuUGFyY2VsYWJsZVNwYW4uZ2V0U3BhblR5cGVJZEludGVybmFsKCkiKTsKLSAgICAgICAgSElEREVOX0lOVEVSRkFDRV9XSElURUxJU1QuYWRkKCJwdWJsaWMgYWJzdHJhY3Qgdm9pZCBhbmRyb2lkLnRleHQuUGFyY2VsYWJsZVNwYW4ud3JpdGVUb1BhcmNlbEludGVybmFsKGFuZHJvaWQub3MuUGFyY2VsLGludCkiKTsKLSAgICAgICAgSElEREVOX0lOVEVSRkFDRV9XSElURUxJU1QuYWRkKCJwdWJsaWMgYWJzdHJhY3Qgdm9pZCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5yZXF1ZXN0QXBwS2V5Ym9hcmRTaG9ydGN1dHMoYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIkS2V5Ym9hcmRTaG9ydGN1dHNSZWNlaXZlcixpbnQpIik7Ci0gICAgICAgIEhJRERFTl9JTlRFUkZBQ0VfV0hJVEVMSVNULmFkZCgicHVibGljIGFic3RyYWN0IGJvb2xlYW4gamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTDEwLmVnbFJlbGVhc2VUaHJlYWQoKSIpOwotICAgICAgICBISURERU5fSU5URVJGQUNFX1dISVRFTElTVC5hZGQoInB1YmxpYyBhYnN0cmFjdCB2b2lkIG9yZy53M2MuZG9tLmxzLkxTU2VyaWFsaXplci5zZXRGaWx0ZXIob3JnLnczYy5kb20ubHMuTFNTZXJpYWxpemVyRmlsdGVyKSIpOwotICAgICAgICBISURERU5fSU5URVJGQUNFX1dISVRFTElTVC5hZGQoInB1YmxpYyBhYnN0cmFjdCBvcmcudzNjLmRvbS5scy5MU1NlcmlhbGl6ZXJGaWx0ZXIgb3JnLnczYy5kb20ubHMuTFNTZXJpYWxpemVyLmdldEZpbHRlcigpIik7Ci0gICAgICAgIEhJRERFTl9JTlRFUkZBQ0VfV0hJVEVMSVNULmFkZCgicHVibGljIGFic3RyYWN0IGFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLmdldEN1cnJlbnRJbWVUb3VjaFJlZ2lvbigpIik7CisgICAgcHVibGljIEFwaUNvbXBsaWFuY2VDaGVja2VyKFJlc3VsdE9ic2VydmVyIHJlc3VsdE9ic2VydmVyLCBDbGFzc1Byb3ZpZGVyIGNsYXNzUHJvdmlkZXIpIHsKKyAgICAgICAgc3VwZXIoY2xhc3NQcm92aWRlciwgcmVzdWx0T2JzZXJ2ZXIpOworICAgICAgICBpbnRlcmZhY2VDaGVja2VyID0gbmV3IEludGVyZmFjZUNoZWNrZXIocmVzdWx0T2JzZXJ2ZXIsIGNsYXNzUHJvdmlkZXIpOwogICAgIH0KIAotCi0gICAgcHJpdmF0ZSBmaW5hbCBSZXN1bHRPYnNlcnZlciByZXN1bHRPYnNlcnZlcjsKLQotICAgIHB1YmxpYyBBcGlDb21wbGlhbmNlQ2hlY2tlcihSZXN1bHRPYnNlcnZlciByZXN1bHRPYnNlcnZlcikgewotICAgICAgICB0aGlzLnJlc3VsdE9ic2VydmVyID0gcmVzdWx0T2JzZXJ2ZXI7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2hlY2tEZWZlcnJlZCgpIHsKKyAgICAgICAgaW50ZXJmYWNlQ2hlY2tlci5jaGVja1F1ZXVlZCgpOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgbG9nZShTdHJpbmcgbWVzc2FnZSwgRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oU3RyaW5nLmZvcm1hdCgiJXM6ICVzIiwgbWVzc2FnZSwgZXhjZXB0aW9uKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGxvZ01pc21hdGNoSW50ZXJmYWNlU2lnbmF0dXJlKEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZlR5cGUgbUNsYXNzVHlwZSwKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc0Z1bGxOYW1lLCBTdHJpbmcgZXJyb3JNZXNzYWdlKSB7Ci0gICAgICAgIGlmIChKRGlmZkNsYXNzRGVzY3JpcHRpb24uSkRpZmZUeXBlLklOVEVSRkFDRS5lcXVhbHMobUNsYXNzVHlwZSkpIHsKLSAgICAgICAgICAgIHJlc3VsdE9ic2VydmVyLm5vdGlmeUZhaWx1cmUoRmFpbHVyZVR5cGUuTUlTTUFUQ0hfSU5URVJGQUNFLAotICAgICAgICAgICAgICAgICAgICBjbGFzc0Z1bGxOYW1lLAotICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVzdWx0T2JzZXJ2ZXIubm90aWZ5RmFpbHVyZShGYWlsdXJlVHlwZS5NSVNNQVRDSF9DTEFTUywKLSAgICAgICAgICAgICAgICAgICAgY2xhc3NGdWxsTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlKTsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjaGVja0NsYXNzKEpEaWZmQ2xhc3NEZXNjcmlwdGlvbiBjbGFzc0Rlc2NyaXB0aW9uLCBDbGFzczw/PiBydW50aW1lQ2xhc3MpIHsKKyAgICAgICAgaWYgKEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZlR5cGUuSU5URVJGQUNFLmVxdWFscyhjbGFzc0Rlc2NyaXB0aW9uLmdldENsYXNzVHlwZSgpKSkgeworICAgICAgICAgICAgLy8gUXVldWUgdGhlIGludGVyZmFjZSBmb3IgZGVmZXJyZWQgY2hlY2tpbmcuCisgICAgICAgICAgICBpbnRlcmZhY2VDaGVja2VyLnF1ZXVlRm9yRGVmZXJyZWRDaGVjayhjbGFzc0Rlc2NyaXB0aW9uLCBydW50aW1lQ2xhc3MpOwogICAgICAgICB9Ci0gICAgfQogCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHRlc3QgY2xhc3MncyBuYW1lLCBtb2RpZmllciwgZmllbGRzLCBjb25zdHJ1Y3RvcnMsIGFuZAotICAgICAqIG1ldGhvZHMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2hlY2tTaWduYXR1cmVDb21wbGlhbmNlKEpEaWZmQ2xhc3NEZXNjcmlwdGlvbiBjbGFzc0Rlc2NyaXB0aW9uKSB7Ci0gICAgICAgIENsYXNzPD8+IHJ1bnRpbWVDbGFzcyA9IGNoZWNrQ2xhc3NDb21wbGlhbmNlKGNsYXNzRGVzY3JpcHRpb24pOwotICAgICAgICBpZiAocnVudGltZUNsYXNzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNoZWNrRmllbGRzQ29tcGxpYW5jZShjbGFzc0Rlc2NyaXB0aW9uLCBydW50aW1lQ2xhc3MpOwotICAgICAgICAgICAgY2hlY2tDb25zdHJ1Y3RvckNvbXBsaWFuY2UoY2xhc3NEZXNjcmlwdGlvbiwgcnVudGltZUNsYXNzKTsKLSAgICAgICAgICAgIGNoZWNrTWV0aG9kQ29tcGxpYW5jZShjbGFzc0Rlc2NyaXB0aW9uLCBydW50aW1lQ2xhc3MpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHRoYXQgdGhlIGNsYXNzIGZvdW5kIHRocm91Z2ggcmVmbGVjdGlvbiBtYXRjaGVzIHRoZQotICAgICAqIHNwZWNpZmljYXRpb24gZnJvbSB0aGUgQVBJIHhtbCBmaWxlLgotICAgICAqCi0gICAgICogQHBhcmFtIGNsYXNzRGVzY3JpcHRpb24gYSBkZXNjcmlwdGlvbiBvZiBhIGNsYXNzIGluIGFuIEFQSS4KLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwcml2YXRlIENsYXNzPD8+IGNoZWNrQ2xhc3NDb21wbGlhbmNlKEpEaWZmQ2xhc3NEZXNjcmlwdGlvbiBjbGFzc0Rlc2NyaXB0aW9uKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDbGFzczw/PiBydW50aW1lQ2xhc3MgPSBmaW5kUmVxdWlyZWRDbGFzcyhjbGFzc0Rlc2NyaXB0aW9uKTsKLQotICAgICAgICAgICAgaWYgKHJ1bnRpbWVDbGFzcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gTm8gY2xhc3MgZm91bmQsIG5vdGlmeSB0aGUgb2JzZXJ2ZXIgYWNjb3JkaW5nIHRvIHRoZSBjbGFzcyB0eXBlCi0gICAgICAgICAgICAgICAgaWYgKEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZlR5cGUuSU5URVJGQUNFLmVxdWFscygKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzRGVzY3JpcHRpb24uZ2V0Q2xhc3NUeXBlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdE9ic2VydmVyLm5vdGlmeUZhaWx1cmUoRmFpbHVyZVR5cGUuTUlTU0lOR19JTlRFUkZBQ0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NEZXNjcmlwdGlvbi5nZXRBYnNvbHV0ZUNsYXNzTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDbGFzc2xvYWRlciBpcyB1bmFibGUgdG8gZmluZCAiICsgY2xhc3NEZXNjcmlwdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEFic29sdXRlQ2xhc3NOYW1lKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdE9ic2VydmVyLm5vdGlmeUZhaWx1cmUoRmFpbHVyZVR5cGUuTUlTU0lOR19DTEFTUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc0Rlc2NyaXB0aW9uLmdldEFic29sdXRlQ2xhc3NOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNsYXNzbG9hZGVyIGlzIHVuYWJsZSB0byBmaW5kICIgKyBjbGFzc0Rlc2NyaXB0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QWJzb2x1dGVDbGFzc05hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBtZXRob2RzID0gY2hlY2tJbnRlcmZhY2VNZXRob2RDb21wbGlhbmNlKGNsYXNzRGVzY3JpcHRpb24sIHJ1bnRpbWVDbGFzcyk7Ci0gICAgICAgICAgICBpZiAoSkRpZmZDbGFzc0Rlc2NyaXB0aW9uLkpEaWZmVHlwZS5JTlRFUkZBQ0UuZXF1YWxzKGNsYXNzRGVzY3JpcHRpb24uZ2V0Q2xhc3NUeXBlKCkpICYmIG1ldGhvZHMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgIHJlc3VsdE9ic2VydmVyLm5vdGlmeUZhaWx1cmUoRmFpbHVyZVR5cGUuTUlTTUFUQ0hfSU5URVJGQUNFX01FVEhPRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzRGVzY3JpcHRpb24uZ2V0QWJzb2x1dGVDbGFzc05hbWUoKSwgIkludGVyZmFjZXMgY2Fubm90IGJlIG1vZGlmaWVkOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY2xhc3NEZXNjcmlwdGlvbi5nZXRBYnNvbHV0ZUNsYXNzTmFtZSgpICsgIjogIiArIG1ldGhvZHMpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIWNoZWNrQ2xhc3NNb2RpZmllcnNDb21wbGlhbmNlKGNsYXNzRGVzY3JpcHRpb24sIHJ1bnRpbWVDbGFzcykpIHsKLSAgICAgICAgICAgICAgICBsb2dNaXNtYXRjaEludGVyZmFjZVNpZ25hdHVyZShjbGFzc0Rlc2NyaXB0aW9uLmdldENsYXNzVHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NEZXNjcmlwdGlvbi5nZXRBYnNvbHV0ZUNsYXNzTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm9uLWNvbXBhdGlibGUgY2xhc3MgZm91bmQgd2hlbiBsb29raW5nIGZvciAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc0Rlc2NyaXB0aW9uLnRvU2lnbmF0dXJlU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIWNoZWNrQ2xhc3NBbm5vdGF0aW9uQ29tcGxpYW5jZShjbGFzc0Rlc2NyaXB0aW9uLCBydW50aW1lQ2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgbG9nTWlzbWF0Y2hJbnRlcmZhY2VTaWduYXR1cmUoY2xhc3NEZXNjcmlwdGlvbi5nZXRDbGFzc1R5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzRGVzY3JpcHRpb24uZ2V0QWJzb2x1dGVDbGFzc05hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFubm90YXRpb24gbWlzbWF0Y2giKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFydW50aW1lQ2xhc3MuaXNBbm5vdGF0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBjaGVjayBmYXRoZXIgY2xhc3MKLSAgICAgICAgICAgICAgICBpZiAoIWNoZWNrQ2xhc3NFeHRlbmRzQ29tcGxpYW5jZShjbGFzc0Rlc2NyaXB0aW9uLCBydW50aW1lQ2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ01pc21hdGNoSW50ZXJmYWNlU2lnbmF0dXJlKGNsYXNzRGVzY3JpcHRpb24uZ2V0Q2xhc3NUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NEZXNjcmlwdGlvbi5nZXRBYnNvbHV0ZUNsYXNzTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4dGVuZHMgbWlzbWF0Y2giKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gY2hlY2sgaW1wbGVtZW50cyBpbnRlcmZhY2UKLSAgICAgICAgICAgICAgICBpZiAoIWNoZWNrQ2xhc3NJbXBsZW1lbnRzQ29tcGxpYW5jZShjbGFzc0Rlc2NyaXB0aW9uLCBydW50aW1lQ2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ01pc21hdGNoSW50ZXJmYWNlU2lnbmF0dXJlKGNsYXNzRGVzY3JpcHRpb24uZ2V0Q2xhc3NUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NEZXNjcmlwdGlvbi5nZXRBYnNvbHV0ZUNsYXNzTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkltcGxlbWVudHMgbWlzbWF0Y2giKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJ1bnRpbWVDbGFzczsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZ2UoIkdvdCBleGNlcHRpb24gd2hlbiBjaGVja2luZyBmaWVsZCBjb21wbGlhbmNlIiwgZSk7Ci0gICAgICAgICAgICByZXN1bHRPYnNlcnZlci5ub3RpZnlGYWlsdXJlKAotICAgICAgICAgICAgICAgICAgICBGYWlsdXJlVHlwZS5DQVVHSFRfRVhDRVBUSU9OLAorICAgICAgICBTdHJpbmcgcmVhc29uOworICAgICAgICBpZiAoKHJlYXNvbiA9IGNoZWNrQ2xhc3NNb2RpZmllcnNDb21wbGlhbmNlKGNsYXNzRGVzY3JpcHRpb24sIHJ1bnRpbWVDbGFzcykpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlc3VsdE9ic2VydmVyLm5vdGlmeUZhaWx1cmUoRmFpbHVyZVR5cGUubWlzbWF0Y2goY2xhc3NEZXNjcmlwdGlvbiksCiAgICAgICAgICAgICAgICAgICAgIGNsYXNzRGVzY3JpcHRpb24uZ2V0QWJzb2x1dGVDbGFzc05hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgIkV4Y2VwdGlvbiEiKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDbGFzczw/PiBmaW5kUmVxdWlyZWRDbGFzcyhKRGlmZkNsYXNzRGVzY3JpcHRpb24gY2xhc3NEZXNjcmlwdGlvbikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3Rpb25IZWxwZXIuZmluZE1hdGNoaW5nQ2xhc3MoY2xhc3NEZXNjcmlwdGlvbik7Ci0gICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nZSgiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBmb3IgIiArIGNsYXNzRGVzY3JpcHRpb24uZ2V0QWJzb2x1dGVDbGFzc05hbWUoKSwgZSk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRlIHRoYXQgYW4gaW50ZXJmYWNlcyBtZXRob2QgY291bnQgaXMgYXMgZXhwZWN0ZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xhc3NEZXNjcmlwdGlvbiB0aGUgY2xhc3MncyBBUEkgZGVzY3JpcHRpb24uCi0gICAgICogQHBhcmFtIHJ1bnRpbWVDbGFzcyB0aGUgcnVudGltZSBjbGFzcyBjb3JyZXNwb25kaW5nIHRvIHtAY29kZSBjbGFzc0Rlc2NyaXB0aW9ufS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gY2hlY2tJbnRlcmZhY2VNZXRob2RDb21wbGlhbmNlKAotICAgICAgICAgICAgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uIGNsYXNzRGVzY3JpcHRpb24sIENsYXNzPD8+IHJ1bnRpbWVDbGFzcykgewotICAgICAgICBMaXN0PFN0cmluZz4gdW5leHBlY3RlZE1ldGhvZHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgZm9yIChNZXRob2QgbWV0aG9kIDogcnVudGltZUNsYXNzLmdldERlY2xhcmVkTWV0aG9kcygpKSB7Ci0gICAgICAgICAgICBpZiAobWV0aG9kLmlzRGVmYXVsdCgpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobWV0aG9kLmlzU3ludGhldGljKCkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtZXRob2QuaXNCcmlkZ2UoKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKEhJRERFTl9JTlRFUkZBQ0VfV0hJVEVMSVNULmNvbnRhaW5zKG1ldGhvZC50b0dlbmVyaWNTdHJpbmcoKSkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYm9vbGVhbiBmb3VuZE1hdGNoID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3IgKEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZk1ldGhvZCBqZGlmZk1ldGhvZCA6IGNsYXNzRGVzY3JpcHRpb24uZ2V0TWV0aG9kcygpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKFJlZmxlY3Rpb25IZWxwZXIubWF0Y2hlcyhqZGlmZk1ldGhvZCwgbWV0aG9kKSkgewotICAgICAgICAgICAgICAgICAgICBmb3VuZE1hdGNoID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWZvdW5kTWF0Y2gpIHsKLSAgICAgICAgICAgICAgICB1bmV4cGVjdGVkTWV0aG9kcy5hZGQobWV0aG9kLnRvR2VuZXJpY1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiTm9uLWNvbXBhdGlibGUgY2xhc3MgZm91bmQgd2hlbiBsb29raW5nIGZvciAlcyAtIGJlY2F1c2UgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzRGVzY3JpcHRpb24udG9TaWduYXR1cmVTdHJpbmcoKSwgcmVhc29uKSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gdW5leHBlY3RlZE1ldGhvZHM7CisgICAgICAgIGlmICghY2hlY2tDbGFzc0Fubm90YXRpb25Db21wbGlhbmNlKGNsYXNzRGVzY3JpcHRpb24sIHJ1bnRpbWVDbGFzcykpIHsKKyAgICAgICAgICAgIHJlc3VsdE9ic2VydmVyLm5vdGlmeUZhaWx1cmUoRmFpbHVyZVR5cGUubWlzbWF0Y2goY2xhc3NEZXNjcmlwdGlvbiksCisgICAgICAgICAgICAgICAgICAgIGNsYXNzRGVzY3JpcHRpb24uZ2V0QWJzb2x1dGVDbGFzc05hbWUoKSwgIkFubm90YXRpb24gbWlzbWF0Y2giKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQogCisgICAgICAgIGlmICghcnVudGltZUNsYXNzLmlzQW5ub3RhdGlvbigpKSB7CisgICAgICAgICAgICAvLyBjaGVjayBmYXRoZXIgY2xhc3MKKyAgICAgICAgICAgIGlmICghY2hlY2tDbGFzc0V4dGVuZHNDb21wbGlhbmNlKGNsYXNzRGVzY3JpcHRpb24sIHJ1bnRpbWVDbGFzcykpIHsKKyAgICAgICAgICAgICAgICByZXN1bHRPYnNlcnZlci5ub3RpZnlGYWlsdXJlKEZhaWx1cmVUeXBlLm1pc21hdGNoKGNsYXNzRGVzY3JpcHRpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NEZXNjcmlwdGlvbi5nZXRBYnNvbHV0ZUNsYXNzTmFtZSgpLCAiRXh0ZW5kcyBtaXNtYXRjaCIpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gY2hlY2sgaW1wbGVtZW50cyBpbnRlcmZhY2UKKyAgICAgICAgICAgIGlmICghY2hlY2tDbGFzc0ltcGxlbWVudHNDb21wbGlhbmNlKGNsYXNzRGVzY3JpcHRpb24sIHJ1bnRpbWVDbGFzcykpIHsKKyAgICAgICAgICAgICAgICByZXN1bHRPYnNlcnZlci5ub3RpZnlGYWlsdXJlKEZhaWx1cmVUeXBlLm1pc21hdGNoKGNsYXNzRGVzY3JpcHRpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NEZXNjcmlwdGlvbi5nZXRBYnNvbHV0ZUNsYXNzTmFtZSgpLCAiSW1wbGVtZW50cyBtaXNtYXRjaCIpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKICAgICAvKioKQEAgLTIzOCwzOCArMTAxLDQzIEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gY2xhc3NEZXNjcmlwdGlvbiBhIGRlc2NyaXB0aW9uIG9mIGEgY2xhc3MgaW4gYW4gQVBJLgogICAgICAqIEBwYXJhbSBydW50aW1lQ2xhc3MgdGhlIHJ1bnRpbWUgY2xhc3MgY29ycmVzcG9uZGluZyB0byB7QGNvZGUgY2xhc3NEZXNjcmlwdGlvbn0uCi0gICAgICogQHJldHVybiB0cnVlIGlmIG1vZGlmaWVycyBhcmUgY29tcGxpYW50LgorICAgICAqIEByZXR1cm4gbnVsbCBpZiBtb2RpZmllcnMgYXJlIGNvbXBsaWFudCBvdGhlcndpc2UgYSByZWFzb24gd2h5IHRoZXkgYXJlIG5vdC4KICAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNoZWNrQ2xhc3NNb2RpZmllcnNDb21wbGlhbmNlKEpEaWZmQ2xhc3NEZXNjcmlwdGlvbiBjbGFzc0Rlc2NyaXB0aW9uLAorICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBjaGVja0NsYXNzTW9kaWZpZXJzQ29tcGxpYW5jZShKRGlmZkNsYXNzRGVzY3JpcHRpb24gY2xhc3NEZXNjcmlwdGlvbiwKICAgICAgICAgICAgIENsYXNzPD8+IHJ1bnRpbWVDbGFzcykgewotICAgICAgICBpbnQgcmVmbGVjdGlvbk1vZGlmaWVyID0gcnVudGltZUNsYXNzLmdldE1vZGlmaWVycygpOwotICAgICAgICBpbnQgYXBpTW9kaWZpZXIgPSBjbGFzc0Rlc2NyaXB0aW9uLmdldE1vZGlmaWVyKCk7CisgICAgICAgIGludCByZWZsZWN0aW9uTW9kaWZpZXJzID0gcnVudGltZUNsYXNzLmdldE1vZGlmaWVycygpOworICAgICAgICBpbnQgYXBpTW9kaWZpZXJzID0gY2xhc3NEZXNjcmlwdGlvbi5nZXRNb2RpZmllcigpOwogCiAgICAgICAgIC8vIElmIHRoZSBhcGkgY2xhc3MgaXNuJ3QgYWJzdHJhY3QKLSAgICAgICAgaWYgKCgoYXBpTW9kaWZpZXIgJiBNb2RpZmllci5BQlNUUkFDVCkgPT0gMCkgJiYKKyAgICAgICAgaWYgKCgoYXBpTW9kaWZpZXJzICYgTW9kaWZpZXIuQUJTVFJBQ1QpID09IDApICYmCiAgICAgICAgICAgICAgICAgLy8gYnV0IHRoZSByZWZsZWN0ZWQgY2xhc3MgaXMKLSAgICAgICAgICAgICAgICAoKHJlZmxlY3Rpb25Nb2RpZmllciAmIE1vZGlmaWVyLkFCU1RSQUNUKSAhPSAwKSAmJgorICAgICAgICAgICAgICAgICgocmVmbGVjdGlvbk1vZGlmaWVycyAmIE1vZGlmaWVyLkFCU1RSQUNUKSAhPSAwKSAmJgogICAgICAgICAgICAgICAgIC8vIGFuZCBpdCBpc24ndCBhbiBlbnVtCiAgICAgICAgICAgICAgICAgIWNsYXNzRGVzY3JpcHRpb24uaXNFbnVtVHlwZSgpKSB7CiAgICAgICAgICAgICAvLyB0aGF0IGlzIGEgcHJvYmxlbQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuICJkZXNjcmlwdGlvbiBpcyBhYnN0cmFjdCBidXQgY2xhc3MgaXMgbm90IGFuZCBpcyBub3QgYW4gZW51bSI7CiAgICAgICAgIH0KICAgICAgICAgLy8gQUJTVFJBQ1QgY2hlY2sgcGFzc2VkLCBzbyBtYXNrIG9mZiBBQlNUUkFDVAotICAgICAgICByZWZsZWN0aW9uTW9kaWZpZXIgJj0gfk1vZGlmaWVyLkFCU1RSQUNUOwotICAgICAgICBhcGlNb2RpZmllciAmPSB+TW9kaWZpZXIuQUJTVFJBQ1Q7CisgICAgICAgIHJlZmxlY3Rpb25Nb2RpZmllcnMgJj0gfk1vZGlmaWVyLkFCU1RSQUNUOworICAgICAgICBhcGlNb2RpZmllcnMgJj0gfk1vZGlmaWVyLkFCU1RSQUNUOwogCiAgICAgICAgIGlmIChjbGFzc0Rlc2NyaXB0aW9uLmlzQW5ub3RhdGlvbigpKSB7Ci0gICAgICAgICAgICByZWZsZWN0aW9uTW9kaWZpZXIgJj0gfkNMQVNTX01PRElGSUVSX0FOTk9UQVRJT047CisgICAgICAgICAgICByZWZsZWN0aW9uTW9kaWZpZXJzICY9IH5DTEFTU19NT0RJRklFUl9BTk5PVEFUSU9OOwogICAgICAgICB9CiAgICAgICAgIGlmIChydW50aW1lQ2xhc3MuaXNJbnRlcmZhY2UoKSkgewotICAgICAgICAgICAgcmVmbGVjdGlvbk1vZGlmaWVyICY9IH4oTW9kaWZpZXIuSU5URVJGQUNFKTsKKyAgICAgICAgICAgIHJlZmxlY3Rpb25Nb2RpZmllcnMgJj0gfihNb2RpZmllci5JTlRFUkZBQ0UpOwogICAgICAgICB9CiAgICAgICAgIGlmIChjbGFzc0Rlc2NyaXB0aW9uLmlzRW51bVR5cGUoKSAmJiBydW50aW1lQ2xhc3MuaXNFbnVtKCkpIHsKLSAgICAgICAgICAgIHJlZmxlY3Rpb25Nb2RpZmllciAmPSB+Q0xBU1NfTU9ESUZJRVJfRU5VTTsKKyAgICAgICAgICAgIHJlZmxlY3Rpb25Nb2RpZmllcnMgJj0gfkNMQVNTX01PRElGSUVSX0VOVU07CiAgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gKChyZWZsZWN0aW9uTW9kaWZpZXIgPT0gYXBpTW9kaWZpZXIpICYmCi0gICAgICAgICAgICAgICAgKGNsYXNzRGVzY3JpcHRpb24uaXNFbnVtVHlwZSgpID09IHJ1bnRpbWVDbGFzcy5pc0VudW0oKSkpOworICAgICAgICBpZiAoKHJlZmxlY3Rpb25Nb2RpZmllcnMgPT0gYXBpTW9kaWZpZXJzKQorICAgICAgICAgICAgICAgICYmIChjbGFzc0Rlc2NyaXB0aW9uLmlzRW51bVR5cGUoKSA9PSBydW50aW1lQ2xhc3MuaXNFbnVtKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJtb2RpZmllciBtaXNtYXRjaCAtIGRlc2NyaXB0aW9uICglcyksIGNsYXNzICglcykiLAorICAgICAgICAgICAgICAgICAgICBNb2RpZmllci50b1N0cmluZyhhcGlNb2RpZmllcnMpLCBNb2RpZmllci50b1N0cmluZyhyZWZsZWN0aW9uTW9kaWZpZXJzKSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTMzMCwxMiArMTk4LDkgQEAKICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNoZWNrQ2xhc3NJbXBsZW1lbnRzQ29tcGxpYW5jZShKRGlmZkNsYXNzRGVzY3JpcHRpb24gY2xhc3NEZXNjcmlwdGlvbiwKICAgICAgICAgICAgIENsYXNzPD8+IHJ1bnRpbWVDbGFzcykgewotICAgICAgICBDbGFzczw/PltdIGludGVyZmFjZXMgPSBydW50aW1lQ2xhc3MuZ2V0SW50ZXJmYWNlcygpOwogICAgICAgICBTZXQ8U3RyaW5nPiBpbnRlckZhY2VTZXQgPSBuZXcgSGFzaFNldDw+KCk7CiAKLSAgICAgICAgZm9yIChDbGFzczw/PiBjIDogaW50ZXJmYWNlcykgewotICAgICAgICAgICAgaW50ZXJGYWNlU2V0LmFkZChjLmdldENhbm9uaWNhbE5hbWUoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgYWRkSW50ZXJmYWNlc1RvU2V0QnlOYW1lKHJ1bnRpbWVDbGFzcywgaW50ZXJGYWNlU2V0KTsKIAogICAgICAgICBmb3IgKFN0cmluZyBpbnRlciA6IGNsYXNzRGVzY3JpcHRpb24uZ2V0SW1wbEludGVyZmFjZXMoKSkgewogICAgICAgICAgICAgaWYgKCFpbnRlckZhY2VTZXQuY29udGFpbnMoaW50ZXIpKSB7CkBAIC0zNDUsNTkgKzIxMCw0NyBAQAogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEludGVyZmFjZXNUb1NldEJ5TmFtZShDbGFzczw/PiBydW50aW1lQ2xhc3MsIFNldDxTdHJpbmc+IGludGVyRmFjZVNldCkgeworICAgICAgICBDbGFzczw/PltdIGludGVyZmFjZXMgPSBydW50aW1lQ2xhc3MuZ2V0SW50ZXJmYWNlcygpOworICAgICAgICBmb3IgKENsYXNzPD8+IGMgOiBpbnRlcmZhY2VzKSB7CisgICAgICAgICAgICBpbnRlckZhY2VTZXQuYWRkKGMuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICAgICAgfQogCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIGFsbCBmaWVsZHMgaW4gdGVzdCBjbGFzcyBmb3IgY29tcGxpYW5jZSB3aXRoIHRoZSBBUEkgeG1sLgotICAgICAqCi0gICAgICogQHBhcmFtIGNsYXNzRGVzY3JpcHRpb24gYSBkZXNjcmlwdGlvbiBvZiBhIGNsYXNzIGluIGFuIEFQSS4KLSAgICAgKiBAcGFyYW0gcnVudGltZUNsYXNzIHRoZSBydW50aW1lIGNsYXNzIGNvcnJlc3BvbmRpbmcgdG8ge0Bjb2RlIGNsYXNzRGVzY3JpcHRpb259LgotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHByaXZhdGUgdm9pZCBjaGVja0ZpZWxkc0NvbXBsaWFuY2UoSkRpZmZDbGFzc0Rlc2NyaXB0aW9uIGNsYXNzRGVzY3JpcHRpb24sCi0gICAgICAgICAgICBDbGFzczw/PiBydW50aW1lQ2xhc3MpIHsKLSAgICAgICAgLy8gQSBtYXAgb2YgZmllbGQgbmFtZSB0byBmaWVsZCBvZiB0aGUgZmllbGRzIGNvbnRhaW5lZCBpbiBydW50aW1lQ2xhc3MuCi0gICAgICAgIE1hcDxTdHJpbmcsIEZpZWxkPiBjbGFzc0ZpZWxkTWFwID0gYnVpbGRGaWVsZE1hcChydW50aW1lQ2xhc3MpOwotICAgICAgICBmb3IgKEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZkZpZWxkIGZpZWxkIDogY2xhc3NEZXNjcmlwdGlvbi5nZXRGaWVsZHMoKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBGaWVsZCBmID0gY2xhc3NGaWVsZE1hcC5nZXQoZmllbGQubU5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChmID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0T2JzZXJ2ZXIubm90aWZ5RmFpbHVyZShGYWlsdXJlVHlwZS5NSVNTSU5HX0ZJRUxELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLnRvUmVhZGFibGVTdHJpbmcoY2xhc3NEZXNjcmlwdGlvbi5nZXRBYnNvbHV0ZUNsYXNzTmFtZSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gZmllbGQgd2l0aCBjb3JyZWN0IHNpZ25hdHVyZSBmb3VuZDoiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLnRvU2lnbmF0dXJlU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZi5nZXRNb2RpZmllcnMoKSAhPSBmaWVsZC5tTW9kaWZpZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0T2JzZXJ2ZXIubm90aWZ5RmFpbHVyZShGYWlsdXJlVHlwZS5NSVNNQVRDSF9GSUVMRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC50b1JlYWRhYmxlU3RyaW5nKGNsYXNzRGVzY3JpcHRpb24uZ2V0QWJzb2x1dGVDbGFzc05hbWUoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vbi1jb21wYXRpYmxlIGZpZWxkIG1vZGlmaWVycyBmb3VuZCB3aGVuIGxvb2tpbmcgZm9yICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQudG9TaWduYXR1cmVTdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghY2hlY2tGaWVsZFZhbHVlQ29tcGxpYW5jZShmaWVsZCwgZikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0T2JzZXJ2ZXIubm90aWZ5RmFpbHVyZShGYWlsdXJlVHlwZS5NSVNNQVRDSF9GSUVMRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC50b1JlYWRhYmxlU3RyaW5nKGNsYXNzRGVzY3JpcHRpb24uZ2V0QWJzb2x1dGVDbGFzc05hbWUoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluY29ycmVjdCBmaWVsZCB2YWx1ZSBmb3VuZCB3aGVuIGxvb2tpbmcgZm9yICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQudG9TaWduYXR1cmVTdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghZi5nZXRUeXBlKCkuZ2V0Q2Fub25pY2FsTmFtZSgpLmVxdWFscyhmaWVsZC5tRmllbGRUeXBlKSkgewotICAgICAgICAgICAgICAgICAgICAvLyB0eXBlIG5hbWUgZG9lcyBub3QgbWF0Y2gsIGJ1dCB0aGlzIG1pZ2h0IGJlIGEgZ2VuZXJpYwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZ2VuZXJpY1R5cGVOYW1lID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgVHlwZSB0eXBlID0gZi5nZXRHZW5lcmljVHlwZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljVHlwZU5hbWUgPSB0eXBlIGluc3RhbmNlb2YgQ2xhc3MgPyAoKENsYXNzKSB0eXBlKS5nZXROYW1lKCkgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLnRvU3RyaW5nKCkucmVwbGFjZSgnJCcsICcuJyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGdlbmVyaWNUeXBlTmFtZSA9PSBudWxsIHx8ICFnZW5lcmljVHlwZU5hbWUuZXF1YWxzKGZpZWxkLm1GaWVsZFR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRPYnNlcnZlci5ub3RpZnlGYWlsdXJlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWlsdXJlVHlwZS5NSVNNQVRDSF9GSUVMRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQudG9SZWFkYWJsZVN0cmluZyhjbGFzc0Rlc2NyaXB0aW9uLmdldEFic29sdXRlQ2xhc3NOYW1lKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm9uLWNvbXBhdGlibGUgZmllbGQgdHlwZSBmb3VuZCB3aGVuIGxvb2tpbmcgZm9yICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLnRvU2lnbmF0dXJlU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAvLyBBZGQgdGhlIGludGVyZmFjZXMgdGhhdCB0aGUgc3VwZXIgY2xhc3MgaW1wbGVtZW50cyBhcyB3ZWxsIGp1c3QgaW4gY2FzZSB0aGUgc3VwZXIgY2xhc3MKKyAgICAgICAgLy8gaXMgaGlkZGVuLgorICAgICAgICBDbGFzczw/PiBzdXBlckNsYXNzID0gcnVudGltZUNsYXNzLmdldFN1cGVyY2xhc3MoKTsKKyAgICAgICAgaWYgKHN1cGVyQ2xhc3MgIT0gbnVsbCkgeworICAgICAgICAgICAgYWRkSW50ZXJmYWNlc1RvU2V0QnlOYW1lKHN1cGVyQ2xhc3MsIGludGVyRmFjZVNldCk7CisgICAgICAgIH0KKyAgICB9CiAKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgbG9nZSgiR290IGV4Y2VwdGlvbiB3aGVuIGNoZWNraW5nIGZpZWxkIGNvbXBsaWFuY2UiLCBlKTsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja0ZpZWxkKEpEaWZmQ2xhc3NEZXNjcmlwdGlvbiBjbGFzc0Rlc2NyaXB0aW9uLCBDbGFzczw/PiBydW50aW1lQ2xhc3MsCisgICAgICAgICAgICBKRGlmZkNsYXNzRGVzY3JpcHRpb24uSkRpZmZGaWVsZCBmaWVsZERlc2NyaXB0aW9uLCBGaWVsZCBmaWVsZCkgeworICAgICAgICBpZiAoZmllbGQuZ2V0TW9kaWZpZXJzKCkgIT0gZmllbGREZXNjcmlwdGlvbi5tTW9kaWZpZXIpIHsKKyAgICAgICAgICAgIHJlc3VsdE9ic2VydmVyLm5vdGlmeUZhaWx1cmUoRmFpbHVyZVR5cGUuTUlTTUFUQ0hfRklFTEQsCisgICAgICAgICAgICAgICAgICAgIGZpZWxkRGVzY3JpcHRpb24udG9SZWFkYWJsZVN0cmluZyhjbGFzc0Rlc2NyaXB0aW9uLmdldEFic29sdXRlQ2xhc3NOYW1lKCkpLAorICAgICAgICAgICAgICAgICAgICAiTm9uLWNvbXBhdGlibGUgZmllbGQgbW9kaWZpZXJzIGZvdW5kIHdoZW4gbG9va2luZyBmb3IgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGREZXNjcmlwdGlvbi50b1NpZ25hdHVyZVN0cmluZygpKTsKKyAgICAgICAgfSBlbHNlIGlmICghY2hlY2tGaWVsZFZhbHVlQ29tcGxpYW5jZShmaWVsZERlc2NyaXB0aW9uLCBmaWVsZCkpIHsKKyAgICAgICAgICAgIHJlc3VsdE9ic2VydmVyLm5vdGlmeUZhaWx1cmUoRmFpbHVyZVR5cGUuTUlTTUFUQ0hfRklFTEQsCisgICAgICAgICAgICAgICAgICAgIGZpZWxkRGVzY3JpcHRpb24udG9SZWFkYWJsZVN0cmluZyhjbGFzc0Rlc2NyaXB0aW9uLmdldEFic29sdXRlQ2xhc3NOYW1lKCkpLAorICAgICAgICAgICAgICAgICAgICAiSW5jb3JyZWN0IGZpZWxkIHZhbHVlIGZvdW5kIHdoZW4gbG9va2luZyBmb3IgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGREZXNjcmlwdGlvbi50b1NpZ25hdHVyZVN0cmluZygpKTsKKyAgICAgICAgfSBlbHNlIGlmICghZmllbGQuZ2V0VHlwZSgpLmdldENhbm9uaWNhbE5hbWUoKS5lcXVhbHMoZmllbGREZXNjcmlwdGlvbi5tRmllbGRUeXBlKSkgeworICAgICAgICAgICAgLy8gdHlwZSBuYW1lIGRvZXMgbm90IG1hdGNoLCBidXQgdGhpcyBtaWdodCBiZSBhIGdlbmVyaWMKKyAgICAgICAgICAgIFN0cmluZyBnZW5lcmljVHlwZU5hbWUgPSBudWxsOworICAgICAgICAgICAgVHlwZSB0eXBlID0gZmllbGQuZ2V0R2VuZXJpY1R5cGUoKTsKKyAgICAgICAgICAgIGlmICh0eXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBnZW5lcmljVHlwZU5hbWUgPSB0eXBlIGluc3RhbmNlb2YgQ2xhc3MgPyAoKENsYXNzKSB0eXBlKS5nZXROYW1lKCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZS50b1N0cmluZygpLnJlcGxhY2UoJyQnLCAnLicpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGdlbmVyaWNUeXBlTmFtZSA9PSBudWxsIHx8ICFnZW5lcmljVHlwZU5hbWUuZXF1YWxzKGZpZWxkRGVzY3JpcHRpb24ubUZpZWxkVHlwZSkpIHsKICAgICAgICAgICAgICAgICByZXN1bHRPYnNlcnZlci5ub3RpZnlGYWlsdXJlKAotICAgICAgICAgICAgICAgICAgICAgICAgRmFpbHVyZVR5cGUuQ0FVR0hUX0VYQ0VQVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLnRvUmVhZGFibGVTdHJpbmcoY2xhc3NEZXNjcmlwdGlvbi5nZXRBYnNvbHV0ZUNsYXNzTmFtZSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJFeGNlcHRpb24hIik7CisgICAgICAgICAgICAgICAgICAgICAgICBGYWlsdXJlVHlwZS5NSVNNQVRDSF9GSUVMRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkRGVzY3JpcHRpb24udG9SZWFkYWJsZVN0cmluZyhjbGFzc0Rlc2NyaXB0aW9uLmdldEFic29sdXRlQ2xhc3NOYW1lKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIk5vbi1jb21wYXRpYmxlIGZpZWxkIHR5cGUgZm91bmQgd2hlbiBsb29raW5nIGZvciAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGREZXNjcmlwdGlvbi50b1NpZ25hdHVyZVN0cmluZygpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTQwOCw4ICsyNjEsNyBAQAogICAgICAqIEBwYXJhbSBhcGlGaWVsZCBUaGUgZmllbGQgYXMgZGVmaW5lZCBieSB0aGUgcGxhdGZvcm0gQVBJLgogICAgICAqIEBwYXJhbSBkZXZpY2VGaWVsZCBUaGUgZmllbGQgYXMgZGVmaW5lZCBieSB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuCiAgICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjaGVja0ZpZWxkVmFsdWVDb21wbGlhbmNlKEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZkZpZWxkIGFwaUZpZWxkLCBGaWVsZCBkZXZpY2VGaWVsZCkKLSAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNoZWNrRmllbGRWYWx1ZUNvbXBsaWFuY2UoSkRpZmZDbGFzc0Rlc2NyaXB0aW9uLkpEaWZmRmllbGQgYXBpRmllbGQsIEZpZWxkIGRldmljZUZpZWxkKSB7CiAgICAgICAgIGlmICgoYXBpRmllbGQubU1vZGlmaWVyICYgTW9kaWZpZXIuRklOQUwpID09IDAgfHwKICAgICAgICAgICAgICAgICAoYXBpRmllbGQubU1vZGlmaWVyICYgTW9kaWZpZXIuU1RBVElDKSA9PSAwKSB7CiAgICAgICAgICAgICAvLyBPbmx5IGZpbmFsIHN0YXRpYyBmaWVsZHMgY2FuIGhhdmUgZml4ZWQgdmFsdWVzLgpAQCAtNDIxLDQwICsyNzMsNDQgQEAKICAgICAgICAgfQogICAgICAgICAvLyBTb21lIGZpZWxkcyBtYXkgYmUgcHJvdGVjdGVkIG9yIHBhY2thZ2UtcHJpdmF0ZQogICAgICAgICBkZXZpY2VGaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotICAgICAgICBzd2l0Y2ggKGFwaUZpZWxkLm1GaWVsZFR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgImJ5dGUiOgotICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3RzLmVxdWFscyhhcGlGaWVsZC5nZXRWYWx1ZVN0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZS50b1N0cmluZyhkZXZpY2VGaWVsZC5nZXRCeXRlKG51bGwpKSk7Ci0gICAgICAgICAgICBjYXNlICJjaGFyIjoKLSAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0cy5lcXVhbHMoYXBpRmllbGQuZ2V0VmFsdWVTdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcoZGV2aWNlRmllbGQuZ2V0Q2hhcihudWxsKSkpOwotICAgICAgICAgICAgY2FzZSAic2hvcnQiOgotICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3RzLmVxdWFscyhhcGlGaWVsZC5nZXRWYWx1ZVN0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgU2hvcnQudG9TdHJpbmcoZGV2aWNlRmllbGQuZ2V0U2hvcnQobnVsbCkpKTsKLSAgICAgICAgICAgIGNhc2UgImludCI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdHMuZXF1YWxzKGFwaUZpZWxkLmdldFZhbHVlU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKGRldmljZUZpZWxkLmdldEludChudWxsKSkpOwotICAgICAgICAgICAgY2FzZSAibG9uZyI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdHMuZXF1YWxzKGFwaUZpZWxkLmdldFZhbHVlU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBMb25nLnRvU3RyaW5nKGRldmljZUZpZWxkLmdldExvbmcobnVsbCkpICsgIkwiKTsKLSAgICAgICAgICAgIGNhc2UgImZsb2F0IjoKLSAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0cy5lcXVhbHMoYXBpRmllbGQuZ2V0VmFsdWVTdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbm9uaWNhbGl6ZUZsb2F0aW5nUG9pbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsb2F0LnRvU3RyaW5nKGRldmljZUZpZWxkLmdldEZsb2F0KG51bGwpKSwgImYiKSk7Ci0gICAgICAgICAgICBjYXNlICJkb3VibGUiOgotICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3RzLmVxdWFscyhhcGlGaWVsZC5nZXRWYWx1ZVN0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgY2Fub25pY2FsaXplRmxvYXRpbmdQb2ludCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG91YmxlLnRvU3RyaW5nKGRldmljZUZpZWxkLmdldERvdWJsZShudWxsKSksICIiKSk7Ci0gICAgICAgICAgICBjYXNlICJib29sZWFuIjoKLSAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0cy5lcXVhbHMoYXBpRmllbGQuZ2V0VmFsdWVTdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEJvb2xlYW4udG9TdHJpbmcoZGV2aWNlRmllbGQuZ2V0Qm9vbGVhbihudWxsKSkpOwotICAgICAgICAgICAgY2FzZSAiamF2YS5sYW5nLlN0cmluZyI6Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gYXBpRmllbGQuZ2V0VmFsdWVTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIHF1b3RlcyB0aGUgdmFsdWUgc3RyaW5nIGlzIHdyYXBwZWQgaW4KLSAgICAgICAgICAgICAgICB2YWx1ZSA9IHVuZXNjYXBlRmllbGRTdHJpbmdWYWx1ZSh2YWx1ZS5zdWJzdHJpbmcoMSwgdmFsdWUubGVuZ3RoKCkgLSAxKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdHMuZXF1YWxzKHZhbHVlLCBkZXZpY2VGaWVsZC5nZXQobnVsbCkpOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN3aXRjaCAoYXBpRmllbGQubUZpZWxkVHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgImJ5dGUiOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0cy5lcXVhbHMoYXBpRmllbGQuZ2V0VmFsdWVTdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlLnRvU3RyaW5nKGRldmljZUZpZWxkLmdldEJ5dGUobnVsbCkpKTsKKyAgICAgICAgICAgICAgICBjYXNlICJjaGFyIjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdHMuZXF1YWxzKGFwaUZpZWxkLmdldFZhbHVlU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhkZXZpY2VGaWVsZC5nZXRDaGFyKG51bGwpKSk7CisgICAgICAgICAgICAgICAgY2FzZSAic2hvcnQiOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0cy5lcXVhbHMoYXBpRmllbGQuZ2V0VmFsdWVTdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaG9ydC50b1N0cmluZyhkZXZpY2VGaWVsZC5nZXRTaG9ydChudWxsKSkpOworICAgICAgICAgICAgICAgIGNhc2UgImludCI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3RzLmVxdWFscyhhcGlGaWVsZC5nZXRWYWx1ZVN0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcoZGV2aWNlRmllbGQuZ2V0SW50KG51bGwpKSk7CisgICAgICAgICAgICAgICAgY2FzZSAibG9uZyI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3RzLmVxdWFscyhhcGlGaWVsZC5nZXRWYWx1ZVN0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvbmcudG9TdHJpbmcoZGV2aWNlRmllbGQuZ2V0TG9uZyhudWxsKSkgKyAiTCIpOworICAgICAgICAgICAgICAgIGNhc2UgImZsb2F0IjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdHMuZXF1YWxzKGFwaUZpZWxkLmdldFZhbHVlU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Fub25pY2FsaXplRmxvYXRpbmdQb2ludCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsb2F0LnRvU3RyaW5nKGRldmljZUZpZWxkLmdldEZsb2F0KG51bGwpKSwgImYiKSk7CisgICAgICAgICAgICAgICAgY2FzZSAiZG91YmxlIjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdHMuZXF1YWxzKGFwaUZpZWxkLmdldFZhbHVlU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Fub25pY2FsaXplRmxvYXRpbmdQb2ludCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvdWJsZS50b1N0cmluZyhkZXZpY2VGaWVsZC5nZXREb3VibGUobnVsbCkpLCAiIikpOworICAgICAgICAgICAgICAgIGNhc2UgImJvb2xlYW4iOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0cy5lcXVhbHMoYXBpRmllbGQuZ2V0VmFsdWVTdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb29sZWFuLnRvU3RyaW5nKGRldmljZUZpZWxkLmdldEJvb2xlYW4obnVsbCkpKTsKKyAgICAgICAgICAgICAgICBjYXNlICJqYXZhLmxhbmcuU3RyaW5nIjoKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gYXBpRmllbGQuZ2V0VmFsdWVTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBxdW90ZXMgdGhlIHZhbHVlIHN0cmluZyBpcyB3cmFwcGVkIGluCisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdW5lc2NhcGVGaWVsZFN0cmluZ1ZhbHVlKHZhbHVlLnN1YnN0cmluZygxLCB2YWx1ZS5sZW5ndGgoKSAtIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdHMuZXF1YWxzKHZhbHVlLCBkZXZpY2VGaWVsZC5nZXQobnVsbCkpOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwogICAgICAgICB9CiAgICAgfQogCkBAIC01ODgsMTE3ICs0NDQsNDYgQEAKICAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFNjYW4gYSBjbGFzcyAoYW4gaXRzIGVudGlyZSBpbmhlcml0YW5jZSBjaGFpbikgZm9yIGZpZWxkcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSB7QGxpbmsgTWFwfSBvZiBmaWVsZE5hbWUgdG8ge0BsaW5rIEZpZWxkfQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIEZpZWxkPiBidWlsZEZpZWxkTWFwKENsYXNzIHRlc3RDbGFzcykgewotICAgICAgICBNYXA8U3RyaW5nLCBGaWVsZD4gZmllbGRNYXAgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgICAgIC8vIFNjYW4gdGhlIHN1cGVyY2xhc3MKLSAgICAgICAgaWYgKHRlc3RDbGFzcy5nZXRTdXBlcmNsYXNzKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgZmllbGRNYXAucHV0QWxsKGJ1aWxkRmllbGRNYXAodGVzdENsYXNzLmdldFN1cGVyY2xhc3MoKSkpOworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrQ29uc3RydWN0b3IoSkRpZmZDbGFzc0Rlc2NyaXB0aW9uIGNsYXNzRGVzY3JpcHRpb24sIENsYXNzPD8+IHJ1bnRpbWVDbGFzcywKKyAgICAgICAgICAgIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZkNvbnN0cnVjdG9yIGN0b3JEZXNjcmlwdGlvbiwgQ29uc3RydWN0b3I8Pz4gY3RvcikgeworICAgICAgICBpZiAoY3Rvci5pc1ZhckFyZ3MoKSkgey8vIHNvbWUgbWV0aG9kJ3MgcGFyYW1ldGVyIGFyZSB2YXJpYWJsZSBhcmdzCisgICAgICAgICAgICBjdG9yRGVzY3JpcHRpb24ubU1vZGlmaWVyIHw9IE1FVEhPRF9NT0RJRklFUl9WQVJfQVJHUzsKICAgICAgICAgfQotCi0gICAgICAgIC8vIFNjYW4gdGhlIGludGVyZmFjZXMKLSAgICAgICAgZm9yIChDbGFzcyBpbnRlcmZhY2VDbGFzcyA6IHRlc3RDbGFzcy5nZXRJbnRlcmZhY2VzKCkpIHsKLSAgICAgICAgICAgIGZpZWxkTWFwLnB1dEFsbChidWlsZEZpZWxkTWFwKGludGVyZmFjZUNsYXNzKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDaGVjayB0aGUgZmllbGRzIGluIHRoZSB0ZXN0IGNsYXNzCi0gICAgICAgIGZvciAoRmllbGQgZmllbGQgOiB0ZXN0Q2xhc3MuZ2V0RGVjbGFyZWRGaWVsZHMoKSkgewotICAgICAgICAgICAgZmllbGRNYXAucHV0KGZpZWxkLmdldE5hbWUoKSwgZmllbGQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZpZWxkTWFwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBjb25zdHJ1Y3RvciBwYXJzZWQgZnJvbSBBUEkgeG1sIGZpbGUgYW5kCi0gICAgICogSmF2YSByZWZsZWN0aW9uIGFyZSBjb21wbGlhbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xhc3NEZXNjcmlwdGlvbiBhIGRlc2NyaXB0aW9uIG9mIGEgY2xhc3MgaW4gYW4gQVBJLgotICAgICAqIEBwYXJhbSBydW50aW1lQ2xhc3MgdGhlIHJ1bnRpbWUgY2xhc3MgY29ycmVzcG9uZGluZyB0byB7QGNvZGUgY2xhc3NEZXNjcmlwdGlvbn0uCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrQ29uc3RydWN0b3JDb21wbGlhbmNlKEpEaWZmQ2xhc3NEZXNjcmlwdGlvbiBjbGFzc0Rlc2NyaXB0aW9uLAotICAgICAgICAgICAgQ2xhc3M8Pz4gcnVudGltZUNsYXNzKSB7Ci0gICAgICAgIGZvciAoSkRpZmZDbGFzc0Rlc2NyaXB0aW9uLkpEaWZmQ29uc3RydWN0b3IgY29uIDogY2xhc3NEZXNjcmlwdGlvbi5nZXRDb25zdHJ1Y3RvcnMoKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBDb25zdHJ1Y3Rvcjw/PiBjID0gUmVmbGVjdGlvbkhlbHBlci5maW5kTWF0Y2hpbmdDb25zdHJ1Y3RvcihydW50aW1lQ2xhc3MsIGNvbik7Ci0gICAgICAgICAgICAgICAgaWYgKGMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXN1bHRPYnNlcnZlci5ub3RpZnlGYWlsdXJlKEZhaWx1cmVUeXBlLk1JU1NJTkdfTUVUSE9ELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbi50b1JlYWRhYmxlU3RyaW5nKGNsYXNzRGVzY3JpcHRpb24uZ2V0QWJzb2x1dGVDbGFzc05hbWUoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIG1ldGhvZCB3aXRoIGNvcnJlY3Qgc2lnbmF0dXJlIGZvdW5kOiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uLnRvU2lnbmF0dXJlU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjLmlzVmFyQXJncygpKSB7Ly8gc29tZSBtZXRob2QncyBwYXJhbWV0ZXIgYXJlIHZhcmlhYmxlIGFyZ3MKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbi5tTW9kaWZpZXIgfD0gTUVUSE9EX01PRElGSUVSX1ZBUl9BUkdTOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjLmdldE1vZGlmaWVycygpICE9IGNvbi5tTW9kaWZpZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdE9ic2VydmVyLm5vdGlmeUZhaWx1cmUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhaWx1cmVUeXBlLk1JU01BVENIX01FVEhPRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uLnRvUmVhZGFibGVTdHJpbmcoY2xhc3NEZXNjcmlwdGlvbi5nZXRBYnNvbHV0ZUNsYXNzTmFtZSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vbi1jb21wYXRpYmxlIG1ldGhvZCBmb3VuZCB3aGVuIGxvb2tpbmcgZm9yICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbi50b1NpZ25hdHVyZVN0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgbG9nZSgiR290IGV4Y2VwdGlvbiB3aGVuIGNoZWNraW5nIGNvbnN0cnVjdG9yIGNvbXBsaWFuY2UiLCBlKTsKLSAgICAgICAgICAgICAgICByZXN1bHRPYnNlcnZlci5ub3RpZnlGYWlsdXJlKEZhaWx1cmVUeXBlLkNBVUdIVF9FWENFUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICBjb24udG9SZWFkYWJsZVN0cmluZyhjbGFzc0Rlc2NyaXB0aW9uLmdldEFic29sdXRlQ2xhc3NOYW1lKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgIkV4Y2VwdGlvbiEiKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKGN0b3IuZ2V0TW9kaWZpZXJzKCkgIT0gY3RvckRlc2NyaXB0aW9uLm1Nb2RpZmllcikgeworICAgICAgICAgICAgcmVzdWx0T2JzZXJ2ZXIubm90aWZ5RmFpbHVyZSgKKyAgICAgICAgICAgICAgICAgICAgRmFpbHVyZVR5cGUuTUlTTUFUQ0hfTUVUSE9ELAorICAgICAgICAgICAgICAgICAgICBjdG9yRGVzY3JpcHRpb24udG9SZWFkYWJsZVN0cmluZyhjbGFzc0Rlc2NyaXB0aW9uLmdldEFic29sdXRlQ2xhc3NOYW1lKCkpLAorICAgICAgICAgICAgICAgICAgICAiTm9uLWNvbXBhdGlibGUgbWV0aG9kIGZvdW5kIHdoZW4gbG9va2luZyBmb3IgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RvckRlc2NyaXB0aW9uLnRvU2lnbmF0dXJlU3RyaW5nKCkpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHRoYXQgdGhlIG1ldGhvZCBmb3VuZCB0aHJvdWdoIHJlZmxlY3Rpb24gbWF0Y2hlcyB0aGUKLSAgICAgKiBzcGVjaWZpY2F0aW9uIGZyb20gdGhlIEFQSSB4bWwgZmlsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjbGFzc0Rlc2NyaXB0aW9uIGEgZGVzY3JpcHRpb24gb2YgYSBjbGFzcyBpbiBhbiBBUEkuCi0gICAgICogQHBhcmFtIHJ1bnRpbWVDbGFzcyB0aGUgcnVudGltZSBjbGFzcyBjb3JyZXNwb25kaW5nIHRvIHtAY29kZSBjbGFzc0Rlc2NyaXB0aW9ufS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tNZXRob2RDb21wbGlhbmNlKEpEaWZmQ2xhc3NEZXNjcmlwdGlvbiBjbGFzc0Rlc2NyaXB0aW9uLAotICAgICAgICAgICAgQ2xhc3M8Pz4gcnVudGltZUNsYXNzKSB7Ci0gICAgICAgIGZvciAoSkRpZmZDbGFzc0Rlc2NyaXB0aW9uLkpEaWZmTWV0aG9kIG1ldGhvZCA6IGNsYXNzRGVzY3JpcHRpb24uZ2V0TWV0aG9kcygpKSB7Ci0gICAgICAgICAgICB0cnkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrTWV0aG9kKEpEaWZmQ2xhc3NEZXNjcmlwdGlvbiBjbGFzc0Rlc2NyaXB0aW9uLCBDbGFzczw/PiBydW50aW1lQ2xhc3MsCisgICAgICAgICAgICBKRGlmZkNsYXNzRGVzY3JpcHRpb24uSkRpZmZNZXRob2QgbWV0aG9kRGVzY3JpcHRpb24sIE1ldGhvZCBtZXRob2QpIHsKKyAgICAgICAgaWYgKG1ldGhvZC5pc1ZhckFyZ3MoKSkgeworICAgICAgICAgICAgbWV0aG9kRGVzY3JpcHRpb24ubU1vZGlmaWVyIHw9IE1FVEhPRF9NT0RJRklFUl9WQVJfQVJHUzsKKyAgICAgICAgfQorICAgICAgICBpZiAobWV0aG9kLmlzQnJpZGdlKCkpIHsKKyAgICAgICAgICAgIG1ldGhvZERlc2NyaXB0aW9uLm1Nb2RpZmllciB8PSBNRVRIT0RfTU9ESUZJRVJfQlJJREdFOworICAgICAgICB9CisgICAgICAgIGlmIChtZXRob2QuaXNTeW50aGV0aWMoKSkgeworICAgICAgICAgICAgbWV0aG9kRGVzY3JpcHRpb24ubU1vZGlmaWVyIHw9IE1FVEhPRF9NT0RJRklFUl9TWU5USEVUSUM7CisgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIE1ldGhvZCBtID0gUmVmbGVjdGlvbkhlbHBlci5maW5kTWF0Y2hpbmdNZXRob2QocnVudGltZUNsYXNzLCBtZXRob2QpOwotICAgICAgICAgICAgICAgIGlmIChtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0T2JzZXJ2ZXIubm90aWZ5RmFpbHVyZShGYWlsdXJlVHlwZS5NSVNTSU5HX01FVEhPRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QudG9SZWFkYWJsZVN0cmluZyhjbGFzc0Rlc2NyaXB0aW9uLmdldEFic29sdXRlQ2xhc3NOYW1lKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBtZXRob2Qgd2l0aCBjb3JyZWN0IHNpZ25hdHVyZSBmb3VuZDoiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZC50b1NpZ25hdHVyZVN0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAobS5pc1ZhckFyZ3MoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLm1Nb2RpZmllciB8PSBNRVRIT0RfTU9ESUZJRVJfVkFSX0FSR1M7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG0uaXNCcmlkZ2UoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLm1Nb2RpZmllciB8PSBNRVRIT0RfTU9ESUZJRVJfQlJJREdFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtLmlzU3ludGhldGljKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZC5tTW9kaWZpZXIgfD0gTUVUSE9EX01PRElGSUVSX1NZTlRIRVRJQzsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAvLyBGSVhNRTogQSB3b3JrYXJvdW5kIHRvIGZpeCB0aGUgZmluYWwgbWlzbWF0Y2ggb24gZW51bWVyYXRpb24KKyAgICAgICAgaWYgKHJ1bnRpbWVDbGFzcy5pc0VudW0oKSAmJiBtZXRob2REZXNjcmlwdGlvbi5tTmFtZS5lcXVhbHMoInZhbHVlcyIpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogQSB3b3JrYXJvdW5kIHRvIGZpeCB0aGUgZmluYWwgbWlzbWF0Y2ggb24gZW51bWVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bnRpbWVDbGFzcy5pc0VudW0oKSAmJiBtZXRob2QubU5hbWUuZXF1YWxzKCJ2YWx1ZXMiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFhcmVNZXRob2RzTW9kaWZpZWRDb21wYXRpYmxlKGNsYXNzRGVzY3JpcHRpb24sIG1ldGhvZCwgbSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdE9ic2VydmVyLm5vdGlmeUZhaWx1cmUoRmFpbHVyZVR5cGUuTUlTTUFUQ0hfTUVUSE9ELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QudG9SZWFkYWJsZVN0cmluZyhjbGFzc0Rlc2NyaXB0aW9uLmdldEFic29sdXRlQ2xhc3NOYW1lKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm9uLWNvbXBhdGlibGUgbWV0aG9kIGZvdW5kIHdoZW4gbG9va2luZyBmb3IgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLnRvU2lnbmF0dXJlU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBsb2dlKCJHb3QgZXhjZXB0aW9uIHdoZW4gY2hlY2tpbmcgbWV0aG9kIGNvbXBsaWFuY2UiLCBlKTsKLSAgICAgICAgICAgICAgICByZXN1bHRPYnNlcnZlci5ub3RpZnlGYWlsdXJlKEZhaWx1cmVUeXBlLkNBVUdIVF9FWENFUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QudG9SZWFkYWJsZVN0cmluZyhjbGFzc0Rlc2NyaXB0aW9uLmdldEFic29sdXRlQ2xhc3NOYW1lKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgIkV4Y2VwdGlvbiEiKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHJlYXNvbjsKKyAgICAgICAgaWYgKChyZWFzb24gPSBhcmVNZXRob2RzTW9kaWZpZWRDb21wYXRpYmxlKAorICAgICAgICAgICAgICAgIGNsYXNzRGVzY3JpcHRpb24sIG1ldGhvZERlc2NyaXB0aW9uLCBtZXRob2QpKSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXN1bHRPYnNlcnZlci5ub3RpZnlGYWlsdXJlKEZhaWx1cmVUeXBlLk1JU01BVENIX01FVEhPRCwKKyAgICAgICAgICAgICAgICAgICAgbWV0aG9kRGVzY3JpcHRpb24udG9SZWFkYWJsZVN0cmluZyhjbGFzc0Rlc2NyaXB0aW9uLmdldEFic29sdXRlQ2xhc3NOYW1lKCkpLAorICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJOb24tY29tcGF0aWJsZSBtZXRob2QgZm91bmQgd2hlbiBsb29raW5nIGZvciAlcyAtIGJlY2F1c2UgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZERlc2NyaXB0aW9uLnRvU2lnbmF0dXJlU3RyaW5nKCksIHJlYXNvbikpOwogICAgICAgICB9CiAgICAgfQogCkBAIC03MTMsOCArNDk4LDkgQEAKICAgICAgKiBAcGFyYW0gY2xhc3NEZXNjcmlwdGlvbiBhIGRlc2NyaXB0aW9uIG9mIGEgY2xhc3MgaW4gYW4gQVBJLgogICAgICAqIEBwYXJhbSBhcGlNZXRob2QgdGhlIG1ldGhvZCByZWFkIGZyb20gdGhlIGFwaSBmaWxlLgogICAgICAqIEBwYXJhbSByZWZsZWN0ZWRNZXRob2QgdGhlIG1ldGhvZCBmb3VuZCB2aWEgcmVmbGVjdGlvbi4KKyAgICAgKiBAcmV0dXJuIG51bGwgaWYgdGhlIG1ldGhvZCBtb2RpZmllcnMgYXJlIGNvbXBhdGlibGUgb3RoZXJ3aXNlIHRoZSByZWFzb24gd2h5IG5vdC4KICAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGFyZU1ldGhvZHNNb2RpZmllZENvbXBhdGlibGUoCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGFyZU1ldGhvZHNNb2RpZmllZENvbXBhdGlibGUoCiAgICAgICAgICAgICBKRGlmZkNsYXNzRGVzY3JpcHRpb24gY2xhc3NEZXNjcmlwdGlvbiwKICAgICAgICAgICAgIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZk1ldGhvZCBhcGlNZXRob2QsCiAgICAgICAgICAgICBNZXRob2QgcmVmbGVjdGVkTWV0aG9kKSB7CkBAIC03MjQsMjEgKzUxMCwzOSBAQAogICAgICAgICAgICAgICAgIC8vIGJ1dCB0aGUgcmVmbGVjdGVkIG1ldGhvZCBpcwogICAgICAgICAgICAgICAgICgocmVmbGVjdGVkTWV0aG9kLmdldE1vZGlmaWVycygpICYgTW9kaWZpZXIuU1lOQ0hST05JWkVEKSAhPSAwKSkgewogICAgICAgICAgICAgLy8gdGhhdCBpcyBhIHByb2JsZW0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiAiZGVzY3JpcHRpb24gaXMgc3luY2hyb25pemUgYnV0IGNsYXNzIGlzIG5vdCI7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBNYXNrIG9mZiBOQVRJVkUgc2luY2UgaXQgaXMgYSBkb24ndCBjYXJlLiAgQWxzbyBtYXNrIG9mZgogICAgICAgICAvLyBTWU5DSFJPTklaRUQgc2luY2Ugd2UndmUgYWxyZWFkeSBoYW5kbGVkIHRoYXQgY2hlY2suCiAgICAgICAgIGludCBpZ25vcmVkTW9kcyA9IChNb2RpZmllci5OQVRJVkUgfCBNb2RpZmllci5TWU5DSFJPTklaRUQgfCBNb2RpZmllci5TVFJJQ1QpOwotICAgICAgICBpbnQgbW9kMSA9IHJlZmxlY3RlZE1ldGhvZC5nZXRNb2RpZmllcnMoKSAmIH5pZ25vcmVkTW9kczsKLSAgICAgICAgaW50IG1vZDIgPSBhcGlNZXRob2QubU1vZGlmaWVyICYgfmlnbm9yZWRNb2RzOworICAgICAgICBpbnQgcmVmbGVjdGlvbk1vZGlmaWVycyA9IHJlZmxlY3RlZE1ldGhvZC5nZXRNb2RpZmllcnMoKSAmIH5pZ25vcmVkTW9kczsKKyAgICAgICAgaW50IGFwaU1vZGlmaWVycyA9IGFwaU1ldGhvZC5tTW9kaWZpZXIgJiB+aWdub3JlZE1vZHM7CiAKICAgICAgICAgLy8gV2UgY2FuIGlnbm9yZSBGSU5BTCBmb3IgY2xhc3NlcwogICAgICAgICBpZiAoKGNsYXNzRGVzY3JpcHRpb24uZ2V0TW9kaWZpZXIoKSAmIE1vZGlmaWVyLkZJTkFMKSAhPSAwKSB7Ci0gICAgICAgICAgICBtb2QxICY9IH5Nb2RpZmllci5GSU5BTDsKLSAgICAgICAgICAgIG1vZDIgJj0gfk1vZGlmaWVyLkZJTkFMOworICAgICAgICAgICAgcmVmbGVjdGlvbk1vZGlmaWVycyAmPSB+TW9kaWZpZXIuRklOQUw7CisgICAgICAgICAgICBhcGlNb2RpZmllcnMgJj0gfk1vZGlmaWVyLkZJTkFMOwogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIG1vZDEgPT0gbW9kMjsKKyAgICAgICAgaWYgKHJlZmxlY3Rpb25Nb2RpZmllcnMgPT0gYXBpTW9kaWZpZXJzKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJtb2RpZmllciBtaXNtYXRjaCAtIGRlc2NyaXB0aW9uICglcyksIG1ldGhvZCAoJXMpIiwKKyAgICAgICAgICAgICAgICAgICAgTW9kaWZpZXIudG9TdHJpbmcoYXBpTW9kaWZpZXJzKSwgTW9kaWZpZXIudG9TdHJpbmcocmVmbGVjdGlvbk1vZGlmaWVycykpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkQmFzZUNsYXNzKEpEaWZmQ2xhc3NEZXNjcmlwdGlvbiBjbGFzc0Rlc2NyaXB0aW9uKSB7CisgICAgICAgIC8vIEtlZXAgdHJhY2sgb2YgYWxsIHRoZSBiYXNlIGludGVyZmFjZXMgdGhhdCBtYXkgYnkgZXh0ZW5kZWQuCisgICAgICAgIGlmIChjbGFzc0Rlc2NyaXB0aW9uLmdldENsYXNzVHlwZSgpID09IEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZlR5cGUuSU5URVJGQUNFKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIENsYXNzPD8+IHJ1bnRpbWVDbGFzcyA9CisgICAgICAgICAgICAgICAgICAgICAgICBSZWZsZWN0aW9uSGVscGVyLmZpbmRNYXRjaGluZ0NsYXNzKGNsYXNzRGVzY3JpcHRpb24sIGNsYXNzUHJvdmlkZXIpOworICAgICAgICAgICAgICAgIGludGVyZmFjZUNoZWNrZXIucXVldWVGb3JEZWZlcnJlZENoZWNrKGNsYXNzRGVzY3JpcHRpb24sIHJ1bnRpbWVDbGFzcyk7CisgICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBEbyBub3RoaW5nLgorICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc2lnbmF0dXJlL3NyYy9hbmRyb2lkL3NpZ25hdHVyZS9jdHMvQXBpRG9jdW1lbnRQYXJzZXIuamF2YSBiL3Rlc3RzL3NpZ25hdHVyZS9zcmMvYW5kcm9pZC9zaWduYXR1cmUvY3RzL0FwaURvY3VtZW50UGFyc2VyLmphdmEKaW5kZXggNmM4YjE3Mi4uMThhZmE5OCAxMDA2NDQKLS0tIGEvdGVzdHMvc2lnbmF0dXJlL3NyYy9hbmRyb2lkL3NpZ25hdHVyZS9jdHMvQXBpRG9jdW1lbnRQYXJzZXIuamF2YQorKysgYi90ZXN0cy9zaWduYXR1cmUvc3JjL2FuZHJvaWQvc2lnbmF0dXJlL2N0cy9BcGlEb2N1bWVudFBhcnNlci5qYXZhCkBAIC0zNCw2ICszNCwxMCBAQAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5TcGxpdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW1TdXBwb3J0OwogaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7CiBpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKIGltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRmFjdG9yeTsKQEAgLTQyLDEwICs0Niw3IEBACiAgKiBQYXJzZXMgYW4gWE1MIGFwaSBkZWZpbml0aW9uIGZpbGUgYW5kIGNvbnN0cnVjdHMgYW5kIHBvcHVsYXRlcyBhbiB7QGxpbmsgSkRpZmZDbGFzc0Rlc2NyaXB0aW9ufQogICogZm9yIGV2ZXJ5IGNsYXNzLgogICoKLSAqIDxwPk9uY2UgaXQgaGFzIGNvbXBsZXRlbHkgcG9wdWxhdGVkIHRoZSBtZW1iZXJzIChzbyBkb2VzIG5vdCBpbmNsdWRlIG5lc3RlZC9pbm5lciBjbGFzc2VzKSBvZiBhCi0gKiB7QGxpbmsgSkRpZmZDbGFzc0Rlc2NyaXB0aW9ufSBpdCBub3RpZmllcyB0aGUge0BsaW5rICNsaXN0ZW5lcn0gYnkgY2FsbGluZwotICoge0BsaW5rIExpc3RlbmVyI2NvbXBsZXRlZENsYXNzKEpEaWZmQ2xhc3NEZXNjcmlwdGlvbil9IHdpdGggdGhlIGNvbXBsZXRlZAotICoge0BsaW5rIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbn0uCisgKiA8cD5UaGUgZGVmaW5pdGlvbiBmaWxlIGlzIGNvbnZlcnRlZCBpbnRvIGEge0BsaW5rIFN0cmVhbX0gb2Yge0BsaW5rIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbn0uCiAgKi8KIHB1YmxpYyBjbGFzcyBBcGlEb2N1bWVudFBhcnNlciB7CiAKQEAgLTY2LDEzMiArNjcsMTU2IEBACiAKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyB0YWc7CiAKLSAgICBwcml2YXRlIGZpbmFsIExpc3RlbmVyIGxpc3RlbmVyOworICAgIHByaXZhdGUgZmluYWwgWG1sUHVsbFBhcnNlckZhY3RvcnkgZmFjdG9yeTsKIAotICAgIHByaXZhdGUgZmluYWwgWG1sUHVsbFBhcnNlciBwYXJzZXI7Ci0KLSAgICBwdWJsaWMgQXBpRG9jdW1lbnRQYXJzZXIoU3RyaW5nIHRhZywgTGlzdGVuZXIgbGlzdGVuZXIpIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgQXBpRG9jdW1lbnRQYXJzZXIoU3RyaW5nIHRhZykgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gewogICAgICAgICB0aGlzLnRhZyA9IHRhZzsKLSAgICAgICAgdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOwotCi0gICAgICAgIFhtbFB1bGxQYXJzZXJGYWN0b3J5IGZhY3RvcnkgPSBYbWxQdWxsUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBwYXJzZXIgPSBmYWN0b3J5Lm5ld1B1bGxQYXJzZXIoKTsKKyAgICAgICAgZmFjdG9yeSA9IFhtbFB1bGxQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgcGFyc2UoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHBhcnNlci5zZXRJbnB1dChpbnB1dFN0cmVhbSwgbnVsbCk7Ci0gICAgICAgIHN0YXJ0KHBhcnNlcik7Ci0gICAgfQotCi0gICAgcHVibGljIGludGVyZmFjZSBMaXN0ZW5lciB7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEludm9rZWQgd2hlbiBhIHtAbGluayBKRGlmZkNsYXNzRGVzY3JpcHRpb259IGhhcyBiZWVuIGNvbXBsZXRlbHkgcG9wdWxhdGVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gY2xhc3NEZXNjcmlwdGlvbiB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGNsYXNzIGFzIHJlYWQgZnJvbSB0aGUgWE1MIEFQSSBmaWxlLgotICAgICAgICAgKi8KLSAgICAgICAgdm9pZCBjb21wbGV0ZWRDbGFzcyhKRGlmZkNsYXNzRGVzY3JpcHRpb24gY2xhc3NEZXNjcmlwdGlvbik7Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIHZvaWQgYmVnaW5Eb2N1bWVudChYbWxQdWxsUGFyc2VyIHBhcnNlciwgU3RyaW5nIGZpcnN0RWxlbWVudE5hbWUpCisgICAgcHVibGljIFN0cmVhbTxKRGlmZkNsYXNzRGVzY3JpcHRpb24+IHBhcnNlQXNTdHJlYW0oSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pCiAgICAgICAgICAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBpbnQgdHlwZTsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgdHlwZSA9IHBhcnNlci5uZXh0KCk7Ci0gICAgICAgIH0gd2hpbGUgKHR5cGUgIT0gWG1sUHVsbFBhcnNlci5TVEFSVF9UQUcgJiYgdHlwZSAhPSBYbWxQdWxsUGFyc2VyLkVORF9ET0NVTUVOVCk7Ci0KLSAgICAgICAgaWYgKHR5cGUgIT0gWG1sUHVsbFBhcnNlci5TVEFSVF9UQUcpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uKCJObyBzdGFydCB0YWcgZm91bmQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghcGFyc2VyLmdldE5hbWUoKS5lcXVhbHMoZmlyc3RFbGVtZW50TmFtZSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN0YXJ0IHRhZzogZm91bmQgIiArIHBhcnNlci5nZXROYW1lKCkgKwotICAgICAgICAgICAgICAgICAgICAiLCBleHBlY3RlZCAiICsgZmlyc3RFbGVtZW50TmFtZSk7Ci0gICAgICAgIH0KKyAgICAgICAgWG1sUHVsbFBhcnNlciBwYXJzZXIgPSBmYWN0b3J5Lm5ld1B1bGxQYXJzZXIoKTsKKyAgICAgICAgcGFyc2VyLnNldElucHV0KGlucHV0U3RyZWFtLCBudWxsKTsKKyAgICAgICAgcmV0dXJuIFN0cmVhbVN1cHBvcnQuc3RyZWFtKG5ldyBDbGFzc0Rlc2NyaXB0aW9uU3BsaXRlcmF0b3IocGFyc2VyKSwgZmFsc2UpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFNpZ25hdHVyZSB0ZXN0IGVudHJ5IHBvaW50LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzdGFydChYbWxQdWxsUGFyc2VyIHBhcnNlcikgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgbG9nZChTdHJpbmcuZm9ybWF0KCJOYW1lOiAlcyIsIHBhcnNlci5nZXROYW1lKCkpKTsKLSAgICAgICAgbG9nZChTdHJpbmcuZm9ybWF0KCJUZXh0OiAlcyIsIHBhcnNlci5nZXRUZXh0KCkpKTsKLSAgICAgICAgbG9nZChTdHJpbmcuZm9ybWF0KCJOYW1lc3BhY2U6ICVzIiwgcGFyc2VyLmdldE5hbWVzcGFjZSgpKSk7Ci0gICAgICAgIGxvZ2QoU3RyaW5nLmZvcm1hdCgiTGluZSBOdW1iZXI6ICVzIiwgcGFyc2VyLmdldExpbmVOdW1iZXIoKSkpOwotICAgICAgICBsb2dkKFN0cmluZy5mb3JtYXQoIkNvbHVtbiBOdW1iZXI6ICVzIiwgcGFyc2VyLmdldENvbHVtbk51bWJlcigpKSk7Ci0gICAgICAgIGxvZ2QoU3RyaW5nLmZvcm1hdCgiUG9zaXRpb24gRGVzY3JpcHRpb246ICVzIiwgcGFyc2VyLmdldFBvc2l0aW9uRGVzY3JpcHRpb24oKSkpOworICAgIHByaXZhdGUgY2xhc3MgQ2xhc3NEZXNjcmlwdGlvblNwbGl0ZXJhdG9yIGltcGxlbWVudHMgU3BsaXRlcmF0b3I8SkRpZmZDbGFzc0Rlc2NyaXB0aW9uPiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBYbWxQdWxsUGFyc2VyIHBhcnNlcjsKKwogICAgICAgICBKRGlmZkNsYXNzRGVzY3JpcHRpb24gY3VycmVudENsYXNzID0gbnVsbDsKICAgICAgICAgU3RyaW5nIGN1cnJlbnRQYWNrYWdlID0gIiI7CiAgICAgICAgIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZk1ldGhvZCBjdXJyZW50TWV0aG9kID0gbnVsbDsKIAotICAgICAgICBiZWdpbkRvY3VtZW50KHBhcnNlciwgVEFHX1JPT1QpOwotICAgICAgICBpbnQgdHlwZTsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgQ2xhc3NEZXNjcmlwdGlvblNwbGl0ZXJhdG9yKFhtbFB1bGxQYXJzZXIgcGFyc2VyKSB0aHJvd3MgSU9FeGNlcHRpb24sIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24geworICAgICAgICAgICAgdGhpcy5wYXJzZXIgPSBwYXJzZXI7CisgICAgICAgICAgICBsb2dkKFN0cmluZy5mb3JtYXQoIk5hbWU6ICVzIiwgcGFyc2VyLmdldE5hbWUoKSkpOworICAgICAgICAgICAgbG9nZChTdHJpbmcuZm9ybWF0KCJUZXh0OiAlcyIsIHBhcnNlci5nZXRUZXh0KCkpKTsKKyAgICAgICAgICAgIGxvZ2QoU3RyaW5nLmZvcm1hdCgiTmFtZXNwYWNlOiAlcyIsIHBhcnNlci5nZXROYW1lc3BhY2UoKSkpOworICAgICAgICAgICAgbG9nZChTdHJpbmcuZm9ybWF0KCJMaW5lIE51bWJlcjogJXMiLCBwYXJzZXIuZ2V0TGluZU51bWJlcigpKSk7CisgICAgICAgICAgICBsb2dkKFN0cmluZy5mb3JtYXQoIkNvbHVtbiBOdW1iZXI6ICVzIiwgcGFyc2VyLmdldENvbHVtbk51bWJlcigpKSk7CisgICAgICAgICAgICBsb2dkKFN0cmluZy5mb3JtYXQoIlBvc2l0aW9uIERlc2NyaXB0aW9uOiAlcyIsIHBhcnNlci5nZXRQb3NpdGlvbkRlc2NyaXB0aW9uKCkpKTsKKyAgICAgICAgICAgIGJlZ2luRG9jdW1lbnQocGFyc2VyLCBUQUdfUk9PVCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gdHJ5QWR2YW5jZShDb25zdW1lcjw/IHN1cGVyIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbj4gYWN0aW9uKSB7CisgICAgICAgICAgICBKRGlmZkNsYXNzRGVzY3JpcHRpb24gY2xhc3NEZXNjcmlwdGlvbjsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY2xhc3NEZXNjcmlwdGlvbiA9IG5leHQoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9ufFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY2xhc3NEZXNjcmlwdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWN0aW9uLmFjY2VwdChjbGFzc0Rlc2NyaXB0aW9uKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTcGxpdGVyYXRvcjxKRGlmZkNsYXNzRGVzY3JpcHRpb24+IHRyeVNwbGl0KCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZXN0aW1hdGVTaXplKCkgeworICAgICAgICAgICAgcmV0dXJuIExvbmcuTUFYX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgY2hhcmFjdGVyaXN0aWNzKCkgeworICAgICAgICAgICAgcmV0dXJuIE9SREVSRUQgfCBESVNUSU5DVCB8IE5PTk5VTEwgfCBJTU1VVEFCTEU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgYmVnaW5Eb2N1bWVudChYbWxQdWxsUGFyc2VyIHBhcnNlciwgU3RyaW5nIGZpcnN0RWxlbWVudE5hbWUpCisgICAgICAgICAgICAgICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGludCB0eXBlOwogICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgIHR5cGUgPSBwYXJzZXIubmV4dCgpOwotICAgICAgICAgICAgfSB3aGlsZSAodHlwZSAhPSBYbWxQdWxsUGFyc2VyLlNUQVJUX1RBRyAmJiB0eXBlICE9IFhtbFB1bGxQYXJzZXIuRU5EX0RPQ1VNRU5UCi0gICAgICAgICAgICAgICAgICAgICYmIHR5cGUgIT0gWG1sUHVsbFBhcnNlci5FTkRfVEFHKTsKKyAgICAgICAgICAgIH0gd2hpbGUgKHR5cGUgIT0gWG1sUHVsbFBhcnNlci5TVEFSVF9UQUcgJiYgdHlwZSAhPSBYbWxQdWxsUGFyc2VyLkVORF9ET0NVTUVOVCk7CiAKLSAgICAgICAgICAgIGlmICh0eXBlID09IFhtbFB1bGxQYXJzZXIuRU5EX1RBRykgewotICAgICAgICAgICAgICAgIGlmIChUQUdfQ0xBU1MuZXF1YWxzKHBhcnNlci5nZXROYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBUQUdfSU5URVJGQUNFLmVxdWFscyhwYXJzZXIuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAobGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIuY29tcGxldGVkQ2xhc3MoY3VycmVudENsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoVEFHX1BBQ0tBR0UuZXF1YWxzKHBhcnNlci5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQYWNrYWdlID0gIiI7CisgICAgICAgICAgICBpZiAodHlwZSAhPSBYbWxQdWxsUGFyc2VyLlNUQVJUX1RBRykgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uKCJObyBzdGFydCB0YWcgZm91bmQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFwYXJzZXIuZ2V0TmFtZSgpLmVxdWFscyhmaXJzdEVsZW1lbnROYW1lKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN0YXJ0IHRhZzogZm91bmQgIiArIHBhcnNlci5nZXROYW1lKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgIiwgZXhwZWN0ZWQgIiArIGZpcnN0RWxlbWVudE5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBKRGlmZkNsYXNzRGVzY3JpcHRpb24gbmV4dCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpbnQgdHlwZTsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICB0eXBlID0gcGFyc2VyLm5leHQoKTsKKyAgICAgICAgICAgICAgICB9IHdoaWxlICh0eXBlICE9IFhtbFB1bGxQYXJzZXIuU1RBUlRfVEFHICYmIHR5cGUgIT0gWG1sUHVsbFBhcnNlci5FTkRfRE9DVU1FTlQKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHR5cGUgIT0gWG1sUHVsbFBhcnNlci5FTkRfVEFHKTsKKworICAgICAgICAgICAgICAgIGlmICh0eXBlID09IFhtbFB1bGxQYXJzZXIuRU5EX0RPQ1VNRU5UKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZ2QoIlJlYWNoZWQgZW5kIG9mIGRvY3VtZW50Iik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIFN0cmluZyB0YWduYW1lID0gcGFyc2VyLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBYbWxQdWxsUGFyc2VyLkVORF9UQUcpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFRBR19DTEFTUy5lcXVhbHModGFnbmFtZSkgfHwgVEFHX0lOVEVSRkFDRS5lcXVhbHModGFnbmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2QoIlJlYWNoZWQgZW5kIG9mIGNsYXNzOiAiICsgY3VycmVudENsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50Q2xhc3M7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoVEFHX1BBQ0tBR0UuZXF1YWxzKHRhZ25hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UGFja2FnZSA9ICIiOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghS0VZX1RBR19TRVQuY29udGFpbnModGFnbmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRhZ25hbWUuZXF1YWxzKFRBR19QQUNLQUdFKSkgeworICAgICAgICAgICAgICAgICAgICBjdXJyZW50UGFja2FnZSA9IHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCBBVFRSSUJVVEVfTkFNRSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0YWduYW1lLmVxdWFscyhUQUdfQ0xBU1MpKSB7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDbGFzcyA9IEN1cnJlbnRBcGkubG9hZENsYXNzSW5mbygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIsIGZhbHNlLCBjdXJyZW50UGFja2FnZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0YWduYW1lLmVxdWFscyhUQUdfSU5URVJGQUNFKSkgeworICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q2xhc3MgPSBDdXJyZW50QXBpLmxvYWRDbGFzc0luZm8oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLCB0cnVlLCBjdXJyZW50UGFja2FnZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0YWduYW1lLmVxdWFscyhUQUdfSU1QTEVNRU5UUykpIHsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudENsYXNzLmFkZEltcGxJbnRlcmZhY2UocGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsIEFUVFJJQlVURV9OQU1FKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0YWduYW1lLmVxdWFscyhUQUdfQ09OU1RSVUNUT1IpKSB7CisgICAgICAgICAgICAgICAgICAgIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZkNvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJyZW50QXBpLmxvYWRDb25zdHJ1Y3RvckluZm8ocGFyc2VyLCBjdXJyZW50Q2xhc3MpOworICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q2xhc3MuYWRkQ29uc3RydWN0b3IoY29uc3RydWN0b3IpOworICAgICAgICAgICAgICAgICAgICBjdXJyZW50TWV0aG9kID0gY29uc3RydWN0b3I7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0YWduYW1lLmVxdWFscyhUQUdfTUVUSE9EKSkgeworICAgICAgICAgICAgICAgICAgICBjdXJyZW50TWV0aG9kID0gQ3VycmVudEFwaS5sb2FkTWV0aG9kSW5mbyhjdXJyZW50Q2xhc3MuZ2V0Q2xhc3NOYW1lKCksIHBhcnNlcik7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDbGFzcy5hZGRNZXRob2QoY3VycmVudE1ldGhvZCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0YWduYW1lLmVxdWFscyhUQUdfUEFSQU0pKSB7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRNZXRob2QuYWRkUGFyYW0ocGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsIEFUVFJJQlVURV9UWVBFKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0YWduYW1lLmVxdWFscyhUQUdfRVhDRVBUSU9OKSkgeworICAgICAgICAgICAgICAgICAgICBjdXJyZW50TWV0aG9kLmFkZEV4Y2VwdGlvbihwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgQVRUUklCVVRFX1RZUEUpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRhZ25hbWUuZXF1YWxzKFRBR19GSUVMRCkpIHsKKyAgICAgICAgICAgICAgICAgICAgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uLkpEaWZmRmllbGQgZmllbGQgPSBDdXJyZW50QXBpLmxvYWRGaWVsZEluZm8oY3VycmVudENsYXNzLmdldENsYXNzTmFtZSgpLCBwYXJzZXIpOworICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q2xhc3MuYWRkRmllbGQoZmllbGQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmtub3duIHRhZyBleGNlcHRpb246IiArIHRhZ25hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY3VycmVudFBhY2thZ2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBsb2dkKFN0cmluZy5mb3JtYXQoImN1cnJlbnRQYWNrYWdlOiAlcyIsIGN1cnJlbnRQYWNrYWdlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Q2xhc3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBsb2dkKFN0cmluZy5mb3JtYXQoImN1cnJlbnRDbGFzczogJXMiLCBjdXJyZW50Q2xhc3MudG9TaWduYXR1cmVTdHJpbmcoKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY3VycmVudE1ldGhvZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZ2QoU3RyaW5nLmZvcm1hdCgiY3VycmVudE1ldGhvZDogJXMiLCBjdXJyZW50TWV0aG9kLnRvU2lnbmF0dXJlU3RyaW5nKCkpKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmICh0eXBlID09IFhtbFB1bGxQYXJzZXIuRU5EX0RPQ1VNRU5UKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyB0YWduYW1lID0gcGFyc2VyLmdldE5hbWUoKTsKLSAgICAgICAgICAgIGlmICghS0VZX1RBR19TRVQuY29udGFpbnModGFnbmFtZSkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHR5cGUgPT0gWG1sUHVsbFBhcnNlci5TVEFSVF9UQUcgJiYgdGFnbmFtZS5lcXVhbHMoVEFHX1BBQ0tBR0UpKSB7Ci0gICAgICAgICAgICAgICAgY3VycmVudFBhY2thZ2UgPSBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgQVRUUklCVVRFX05BTUUpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0YWduYW1lLmVxdWFscyhUQUdfQ0xBU1MpKSB7Ci0gICAgICAgICAgICAgICAgY3VycmVudENsYXNzID0gQ3VycmVudEFwaS5sb2FkQ2xhc3NJbmZvKAotICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLCBmYWxzZSwgY3VycmVudFBhY2thZ2UpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0YWduYW1lLmVxdWFscyhUQUdfSU5URVJGQUNFKSkgewotICAgICAgICAgICAgICAgIGN1cnJlbnRDbGFzcyA9IEN1cnJlbnRBcGkubG9hZENsYXNzSW5mbygKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlciwgdHJ1ZSwgY3VycmVudFBhY2thZ2UpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0YWduYW1lLmVxdWFscyhUQUdfSU1QTEVNRU5UUykpIHsKLSAgICAgICAgICAgICAgICBjdXJyZW50Q2xhc3MuYWRkSW1wbEludGVyZmFjZShwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgQVRUUklCVVRFX05BTUUpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodGFnbmFtZS5lcXVhbHMoVEFHX0NPTlNUUlVDVE9SKSkgewotICAgICAgICAgICAgICAgIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZkNvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0KLSAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnRBcGkubG9hZENvbnN0cnVjdG9ySW5mbyhwYXJzZXIsIGN1cnJlbnRDbGFzcyk7Ci0gICAgICAgICAgICAgICAgY3VycmVudENsYXNzLmFkZENvbnN0cnVjdG9yKGNvbnN0cnVjdG9yKTsKLSAgICAgICAgICAgICAgICBjdXJyZW50TWV0aG9kID0gY29uc3RydWN0b3I7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHRhZ25hbWUuZXF1YWxzKFRBR19NRVRIT0QpKSB7Ci0gICAgICAgICAgICAgICAgY3VycmVudE1ldGhvZCA9IEN1cnJlbnRBcGkubG9hZE1ldGhvZEluZm8oY3VycmVudENsYXNzLmdldENsYXNzTmFtZSgpLCBwYXJzZXIpOwotICAgICAgICAgICAgICAgIGN1cnJlbnRDbGFzcy5hZGRNZXRob2QoY3VycmVudE1ldGhvZCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHRhZ25hbWUuZXF1YWxzKFRBR19QQVJBTSkpIHsKLSAgICAgICAgICAgICAgICBjdXJyZW50TWV0aG9kLmFkZFBhcmFtKHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCBBVFRSSUJVVEVfVFlQRSkpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0YWduYW1lLmVxdWFscyhUQUdfRVhDRVBUSU9OKSkgewotICAgICAgICAgICAgICAgIGN1cnJlbnRNZXRob2QuYWRkRXhjZXB0aW9uKHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCBBVFRSSUJVVEVfVFlQRSkpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0YWduYW1lLmVxdWFscyhUQUdfRklFTEQpKSB7Ci0gICAgICAgICAgICAgICAgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uLkpEaWZmRmllbGQgZmllbGQgPSBDdXJyZW50QXBpLmxvYWRGaWVsZEluZm8oY3VycmVudENsYXNzLmdldENsYXNzTmFtZSgpLCBwYXJzZXIpOwotICAgICAgICAgICAgICAgIGN1cnJlbnRDbGFzcy5hZGRGaWVsZChmaWVsZCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgInVua25vd24gdGFnIGV4Y2VwdGlvbjoiICsgdGFnbmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY3VycmVudFBhY2thZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxvZ2QoU3RyaW5nLmZvcm1hdCgiY3VycmVudFBhY2thZ2U6ICVzIiwgY3VycmVudFBhY2thZ2UpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjdXJyZW50Q2xhc3MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxvZ2QoU3RyaW5nLmZvcm1hdCgiY3VycmVudENsYXNzOiAlcyIsIGN1cnJlbnRDbGFzcy50b1NpZ25hdHVyZVN0cmluZygpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY3VycmVudE1ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9nZChTdHJpbmcuZm9ybWF0KCJjdXJyZW50TWV0aG9kOiAlcyIsIGN1cnJlbnRNZXRob2QudG9TaWduYXR1cmVTdHJpbmcoKSkpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3NpZ25hdHVyZS9zcmMvYW5kcm9pZC9zaWduYXR1cmUvY3RzL0NsYXNzUHJvdmlkZXIuamF2YSBiL3Rlc3RzL3NpZ25hdHVyZS9zcmMvYW5kcm9pZC9zaWduYXR1cmUvY3RzL0NsYXNzUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTliNDdjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc2lnbmF0dXJlL3NyYy9hbmRyb2lkL3NpZ25hdHVyZS9jdHMvQ2xhc3NQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLnNpZ25hdHVyZS5jdHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKKworLyoqCisgKiBHZW5lcmljIGNsYXNzIGZvciBnZXR0aW5nIHJ1bnRpbWUgY2xhc3NlcyB0aGF0IHdpbGwgYmUgbWF0Y2hlZCBhZ2FpbnN0CisgKiB7QGxpbmsgSkRpZmZDbGFzc0Rlc2NyaXB0aW9ufS4ge0BsaW5rIEFwaUNvbXBsaWFuY2VDaGVja2VyfSBpcyB1c2luZyB0aGlzCisgKiB3aGVuIGl0IG5lZWRzIHJ1bnRpbWUgY2xhc3Nlcy4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIENsYXNzUHJvdmlkZXIgeworICAgIC8qKgorICAgICAqIEdldCBhIHNwZWNpZmljIGNsYXNzIHdpdGggdGhlIGdpdmVuIG5hbWUuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3M8Pz4gZ2V0Q2xhc3MoU3RyaW5nIG5hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUobmFtZSwgZmFsc2UsIHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGFsbCBjbGFzc2VzIGF2YWlsYWJsZSB0byB0aGlzIHByb3ZpZGVyLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJlYW08Q2xhc3M8Pz4+IGdldEFsbENsYXNzZXMoKTsKKworICAgIC8qKgorICAgICAqIEdldHMgYWxsIGNsYXNzIG1lbWJlcnMgYXZhaWxhYmxlIGZvciB0aGUgZ2l2ZW4gY2xhc3MuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFN0cmVhbTxEZXhNZW1iZXI+IGdldEFsbE1lbWJlcnMoQ2xhc3M8Pz4ga2xhc3MpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc2lnbmF0dXJlL3NyYy9hbmRyb2lkL3NpZ25hdHVyZS9jdHMvRGV4QXBpRG9jdW1lbnRQYXJzZXIuamF2YSBiL3Rlc3RzL3NpZ25hdHVyZS9zcmMvYW5kcm9pZC9zaWduYXR1cmUvY3RzL0RleEFwaURvY3VtZW50UGFyc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE5OWJjMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NpZ25hdHVyZS9zcmMvYW5kcm9pZC9zaWduYXR1cmUvY3RzL0RleEFwaURvY3VtZW50UGFyc2VyLmphdmEKQEAgLTAsMCArMSwxNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLnNpZ25hdHVyZS5jdHM7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEudXRpbC5TcGxpdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW1TdXBwb3J0OworaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKKworLyoqCisgKiBQYXJzZXMgYW4gQVBJIGRlZmluaXRpb24gZ2l2ZW4gYXMgYSB0ZXh0IGZpbGUgd2l0aCBERVggc2lnbmF0dXJlcyBvZiBjbGFzcworICogbWVtYmVycy4gQ29uc3RydWN0cyBhIHtAbGluayBEZXhBcGlEb2N1bWVudFBhcnNlci5EZXhNZW1iZXJ9IGZvciBldmVyeSBjbGFzcworICogbWVtYmVyLgorICoKKyAqIDxwPlRoZSBkZWZpbml0aW9uIGZpbGUgaXMgY29udmVydGVkIGludG8gYSB7QGxpbmsgU3RyZWFtfSBvZgorICoge0BsaW5rIERleEFwaURvY3VtZW50UGFyc2VyLkRleE1lbWJlcn0uCisgKi8KK3B1YmxpYyBjbGFzcyBEZXhBcGlEb2N1bWVudFBhcnNlciB7CisKKyAgICBwdWJsaWMgU3RyZWFtPERleE1lbWJlcj4gcGFyc2VBc1N0cmVhbShJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgeworICAgICAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGlucHV0U3RyZWFtKSk7CisgICAgICAgIHJldHVybiBTdHJlYW1TdXBwb3J0LnN0cmVhbShuZXcgRGV4QXBpU3BsaXRlcmF0b3IocmVhZGVyKSwgZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIERleEFwaVNwbGl0ZXJhdG9yIGltcGxlbWVudHMgU3BsaXRlcmF0b3I8RGV4TWVtYmVyPiB7CisgICAgICAgIHByaXZhdGUgZmluYWwgQnVmZmVyZWRSZWFkZXIgbVJlYWRlcjsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbUxpbmVOdW07CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBSRUdFWF9DTEFTUyA9IFBhdHRlcm4uY29tcGlsZSgiXkxbXi0+XSo7JCIpOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIFJFR0VYX0ZJRUxEID0gUGF0dGVybi5jb21waWxlKCJeKExbXi0+XSo7KS0+KC4qKTooLiopJCIpOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIFJFR0VYX01FVEhPRCA9CisgICAgICAgICAgICAgICAgUGF0dGVybi5jb21waWxlKCJeKExbXi0+XSo7KS0+KC4qKShcXCguKlxcKS4qKSQiKTsKKworICAgICAgICBEZXhBcGlTcGxpdGVyYXRvcihCdWZmZXJlZFJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgICAgIG1SZWFkZXIgPSByZWFkZXI7CisgICAgICAgICAgICBtTGluZU51bSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gdHJ5QWR2YW5jZShDb25zdW1lcjw/IHN1cGVyIERleE1lbWJlcj4gYWN0aW9uKSB7CisgICAgICAgICAgICBEZXhNZW1iZXIgbmV4dE1lbWJlciA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG5leHRNZW1iZXIgPSBuZXh0KCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiB8IFBhcnNlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5leHRNZW1iZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFjdGlvbi5hY2NlcHQobmV4dE1lbWJlcik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3BsaXRlcmF0b3I8RGV4TWVtYmVyPiB0cnlTcGxpdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGVzdGltYXRlU2l6ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBMb25nLk1BWF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGNoYXJhY3RlcmlzdGljcygpIHsKKyAgICAgICAgICAgIHJldHVybiBPUkRFUkVEIHwgRElTVElOQ1QgfCBOT05OVUxMIHwgSU1NVVRBQkxFOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFBhcnNlcyBsaW5lcyBvZiBERVggc2lnbmF0dXJlcyBmcm9tIGBtUmVhZGVyYC4gVGhlIGZvbGxvd2luZyB0aHJlZQorICAgICAgICAgKiBsaW5lIGZvcm1hdHMgYXJlIHN1cHBvcnRlZDoKKyAgICAgICAgICogMSkgW2NsYXNzIGRlc2NyaXB0b3JdCisgICAgICAgICAqICAgICAgLSBlLmcuIExjb20vZXhhbXBsZS9NeUNsYXNzOworICAgICAgICAgKiAgICAgIC0gdGhlc2UgbGluZXMgYXJlIGlnbm9yZWQKKyAgICAgICAgICogMikgW2NsYXNzIGRlc2NyaXB0b3JdLT5bZmllbGQgbmFtZV06W2ZpZWxkIHR5cGVdCisgICAgICAgICAqICAgICAgLSBlLmcuIExjb20vZXhhbXBsZS9NeUNsYXNzOy0+bXlGaWVsZDpJCisgICAgICAgICAqICAgICAgLSB0aGVzZSBsaW5lcyBhcmUgcGFyc2VkIGFzIGZpZWxkIHNpZ25hdHVyZXMKKyAgICAgICAgICogMykgW2NsYXNzIGRlc2NyaXB0b3JdLT5bbWV0aG9kIG5hbWVdKFttZXRob2QgcGFyYW1ldGVyIHR5cGVzXSlbbWV0aG9kIHJldHVybiB0eXBlXQorICAgICAgICAgKiAgICAgIC0gZS5nLiBMY29tL2V4YW1wbGUvTXlDbGFzczstPm15TWV0aG9kKExmb287TGJhcjspSgorICAgICAgICAgKiAgICAgIC0gdGhlc2UgbGluZXMgYXJlIHBhcnNlZCBhcyBtZXRob2Qgc2lnbmF0dXJlcworICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBEZXhNZW1iZXIgbmV4dCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24geworICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICAvLyBSZWFkIHRoZSBuZXh0IGxpbmUgZnJvbSB0aGUgaW5wdXQuCisgICAgICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBtUmVhZGVyLnJlYWRMaW5lKCk7CisgICAgICAgICAgICAgICAgaWYgKGxpbmUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBFbmQgb2Ygc3RyZWFtLgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBJbmNyZW1lbnQgdGhlIGxpbmUgbnVtYmVyLgorICAgICAgICAgICAgICAgIG1MaW5lTnVtID0gbUxpbmVOdW0gKyAxOworCisgICAgICAgICAgICAgICAgLy8gTWF0Y2ggbGluZSBhZ2FpbnN0IHJlZ2V4IHBhdHRlcm5zLgorICAgICAgICAgICAgICAgIE1hdGNoZXIgbWF0Y2hDbGFzcyA9IFJFR0VYX0NMQVNTLm1hdGNoZXIobGluZSk7CisgICAgICAgICAgICAgICAgTWF0Y2hlciBtYXRjaEZpZWxkID0gUkVHRVhfRklFTEQubWF0Y2hlcihsaW5lKTsKKyAgICAgICAgICAgICAgICBNYXRjaGVyIG1hdGNoTWV0aG9kID0gUkVHRVhfTUVUSE9ELm1hdGNoZXIobGluZSk7CisKKyAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGF0ICpleGFjdGx5KiBvbmUgcGF0dGVybiBtYXRjaGVzLgorICAgICAgICAgICAgICAgIGludCBtYXRjaENvdW50ID0gKG1hdGNoQ2xhc3MubWF0Y2hlcygpID8gMSA6IDApICsgKG1hdGNoRmllbGQubWF0Y2hlcygpID8gMSA6IDApICsKKyAgICAgICAgICAgICAgICAgICAgICAgIChtYXRjaE1ldGhvZC5tYXRjaGVzKCkgPyAxIDogMCk7CisgICAgICAgICAgICAgICAgaWYgKG1hdGNoQ291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIkNvdWxkIG5vdCBwYXJzZTogXCIiICsgbGluZSArICJcIiIsIG1MaW5lTnVtKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1hdGNoQ291bnQgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigiQW1iaWd1b3VzIHBhcnNlOiBcIiIgKyBsaW5lICsgIlwiIiwgbUxpbmVOdW0pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEV4dHJhY3QgaW5mb3JtYXRpb24gZnJvbSB0aGUgbGluZS4KKyAgICAgICAgICAgICAgICBpZiAobWF0Y2hDbGFzcy5tYXRjaGVzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UgaWdub3JlIGxpbmVzIGRlc2NyaWJpbmcgYSBjbGFzcyBiZWNhdXNlIGNsYXNzZXMgYXJlCisgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBiZWluZyBoaWRkZW4uCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtYXRjaEZpZWxkLm1hdGNoZXMoKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERleEZpZWxkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoRmllbGQuZ3JvdXAoMSksIG1hdGNoRmllbGQuZ3JvdXAoMiksIG1hdGNoRmllbGQuZ3JvdXAoMykpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWF0Y2hNZXRob2QubWF0Y2hlcygpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGV4TWV0aG9kKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoTWV0aG9kLmdyb3VwKDEpLG1hdGNoTWV0aG9kLmdyb3VwKDIpLCBtYXRjaE1ldGhvZC5ncm91cCgzKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3NpZ25hdHVyZS9zcmMvYW5kcm9pZC9zaWduYXR1cmUvY3RzL0RleEZpZWxkLmphdmEgYi90ZXN0cy9zaWduYXR1cmUvc3JjL2FuZHJvaWQvc2lnbmF0dXJlL2N0cy9EZXhGaWVsZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZjYxOTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zaWduYXR1cmUvc3JjL2FuZHJvaWQvc2lnbmF0dXJlL2N0cy9EZXhGaWVsZC5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLnNpZ25hdHVyZS5jdHM7CisKK3B1YmxpYyBjbGFzcyBEZXhGaWVsZCBleHRlbmRzIERleE1lbWJlciB7CisgIHB1YmxpYyBEZXhGaWVsZChTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGUpIHsKKyAgICAgIHN1cGVyKGNsYXNzTmFtZSwgbmFtZSwgdHlwZSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgIHJldHVybiBnZXRKYXZhVHlwZSgpICsgIiAiICsgZ2V0SmF2YUNsYXNzTmFtZSgpICsgIi4iICsgZ2V0TmFtZSgpOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zaWduYXR1cmUvc3JjL2FuZHJvaWQvc2lnbmF0dXJlL2N0cy9EZXhNZW1iZXIuamF2YSBiL3Rlc3RzL3NpZ25hdHVyZS9zcmMvYW5kcm9pZC9zaWduYXR1cmUvY3RzL0RleE1lbWJlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMGY5MmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zaWduYXR1cmUvc3JjL2FuZHJvaWQvc2lnbmF0dXJlL2N0cy9EZXhNZW1iZXIuamF2YQpAQCAtMCwwICsxLDg5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5zaWduYXR1cmUuY3RzOworCisvKioKKyAqIFJlcHJlc2VudHMgb25lIGNsYXNzIG1lbWJlciBwYXJzZWQgZnJvbSB0aGUgcmVhZGVyIG9mIGRleCBzaWduYXR1cmVzLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGV4TWVtYmVyIHsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtTmFtZTsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQ2xhc3NEZXNjcmlwdG9yOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1UeXBlOworCisgICAgcHJvdGVjdGVkIERleE1lbWJlcihTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGUpIHsKKyAgICAgICAgbU5hbWUgPSBuYW1lOworICAgICAgICBtQ2xhc3NEZXNjcmlwdG9yID0gY2xhc3NOYW1lOworICAgICAgICBtVHlwZSA9IHR5cGU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbU5hbWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXREZXhDbGFzc05hbWUoKSB7CisgICAgICAgIHJldHVybiBtQ2xhc3NEZXNjcmlwdG9yOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SmF2YUNsYXNzTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGRleFRvSmF2YVR5cGUobUNsYXNzRGVzY3JpcHRvcik7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXREZXhUeXBlKCkgeworICAgICAgICByZXR1cm4gbVR5cGU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRKYXZhVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIGRleFRvSmF2YVR5cGUobVR5cGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIGB0eXBlYCB0byBhIEphdmEgdHlwZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBkZXhUb0phdmFUeXBlKFN0cmluZyB0eXBlKSB7CisgICAgICAgIFN0cmluZyBqYXZhRGltZW5zaW9uID0gIiI7CisgICAgICAgIHdoaWxlICh0eXBlLnN0YXJ0c1dpdGgoIlsiKSkgeworICAgICAgICAgICAgamF2YURpbWVuc2lvbiArPSAiW10iOworICAgICAgICAgICAgdHlwZSA9IHR5cGUuc3Vic3RyaW5nKDEpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGphdmFUeXBlID0gbnVsbDsKKyAgICAgICAgaWYgKCJWIi5lcXVhbHModHlwZSkpIHsKKyAgICAgICAgICAgIGphdmFUeXBlID0gInZvaWQiOworICAgICAgICB9IGVsc2UgaWYgKCJaIi5lcXVhbHModHlwZSkpIHsKKyAgICAgICAgICAgIGphdmFUeXBlID0gImJvb2xlYW4iOworICAgICAgICB9IGVsc2UgaWYgKCJCIi5lcXVhbHModHlwZSkpIHsKKyAgICAgICAgICAgIGphdmFUeXBlID0gImJ5dGUiOworICAgICAgICB9IGVsc2UgaWYgKCJDIi5lcXVhbHModHlwZSkpIHsKKyAgICAgICAgICAgIGphdmFUeXBlID0gImNoYXIiOworICAgICAgICB9IGVsc2UgaWYgKCJTIi5lcXVhbHModHlwZSkpIHsKKyAgICAgICAgICAgIGphdmFUeXBlID0gInNob3J0IjsKKyAgICAgICAgfSBlbHNlIGlmICgiSSIuZXF1YWxzKHR5cGUpKSB7CisgICAgICAgICAgICBqYXZhVHlwZSA9ICJpbnQiOworICAgICAgICB9IGVsc2UgaWYgKCJKIi5lcXVhbHModHlwZSkpIHsKKyAgICAgICAgICAgIGphdmFUeXBlID0gImxvbmciOworICAgICAgICB9IGVsc2UgaWYgKCJGIi5lcXVhbHModHlwZSkpIHsKKyAgICAgICAgICAgIGphdmFUeXBlID0gImZsb2F0IjsKKyAgICAgICAgfSBlbHNlIGlmICgiRCIuZXF1YWxzKHR5cGUpKSB7CisgICAgICAgICAgICBqYXZhVHlwZSA9ICJkb3VibGUiOworICAgICAgICB9IGVsc2UgaWYgKHR5cGUuc3RhcnRzV2l0aCgiTCIpICYmIHR5cGUuZW5kc1dpdGgoIjsiKSkgeworICAgICAgICAgICAgamF2YVR5cGUgPSB0eXBlLnN1YnN0cmluZygxLCB0eXBlLmxlbmd0aCgpIC0gMSkucmVwbGFjZSgnLycsICcuJyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHR5cGUgIiArIHR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGphdmFUeXBlICsgamF2YURpbWVuc2lvbjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zaWduYXR1cmUvc3JjL2FuZHJvaWQvc2lnbmF0dXJlL2N0cy9EZXhNZW1iZXJDaGVja2VyLmphdmEgYi90ZXN0cy9zaWduYXR1cmUvc3JjL2FuZHJvaWQvc2lnbmF0dXJlL2N0cy9EZXhNZW1iZXJDaGVja2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVmZGJhZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NpZ25hdHVyZS9zcmMvYW5kcm9pZC9zaWduYXR1cmUvY3RzL0RleE1lbWJlckNoZWNrZXIuamF2YQpAQCAtMCwwICsxLDIzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zaWduYXR1cmUuY3RzOworCitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5FeGVjdXRhYmxlOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgRGV4TWVtYmVyQ2hlY2tlciB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkRleE1lbWJlckNoZWNrZXIiOworCisgICAgcHVibGljIGludGVyZmFjZSBPYnNlcnZlciB7CisgICAgICAgIHZvaWQgY2xhc3NBY2Nlc3NpYmxlKGJvb2xlYW4gYWNjZXNzaWJsZSwgRGV4TWVtYmVyIG1lbWJlcik7CisgICAgICAgIHZvaWQgZmllbGRBY2Nlc3NpYmxlVmlhUmVmbGVjdGlvbihib29sZWFuIGFjY2Vzc2libGUsIERleEZpZWxkIGZpZWxkKTsKKyAgICAgICAgdm9pZCBmaWVsZEFjY2Vzc2libGVWaWFKbmkoYm9vbGVhbiBhY2Nlc3NpYmxlLCBEZXhGaWVsZCBmaWVsZCk7CisgICAgICAgIHZvaWQgbWV0aG9kQWNjZXNzaWJsZVZpYVJlZmxlY3Rpb24oYm9vbGVhbiBhY2Nlc3NpYmxlLCBEZXhNZXRob2QgbWV0aG9kKTsKKyAgICAgICAgdm9pZCBtZXRob2RBY2Nlc3NpYmxlVmlhSm5pKGJvb2xlYW4gYWNjZXNzaWJsZSwgRGV4TWV0aG9kIG1ldGhvZCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGluaXQoKSB7CisgICAgICAgIFN5c3RlbS5sb2FkTGlicmFyeSgiY3RzX2RleGNoZWNrZXIiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNhbGxfVk1EZWJ1Z19hbGxvd0hpZGRlbkFwaVJlZmxlY3Rpb25Gcm9tKENsYXNzPD8+IGtsYXNzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIE1ldGhvZCBtZXRob2QgPSBudWxsOworCisgICAgICB0cnkgeworICAgICAgICBDbGFzczw/PiB2bWRlYnVnID0gQ2xhc3MuZm9yTmFtZSgiZGFsdmlrLnN5c3RlbS5WTURlYnVnIik7CisgICAgICAgIG1ldGhvZCA9IHZtZGVidWcuZ2V0RGVjbGFyZWRNZXRob2QoImFsbG93SGlkZGVuQXBpUmVmbGVjdGlvbkZyb20iLCBDbGFzcy5jbGFzcyk7CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgLy8gQ291bGQgbm90IGZpbmQgdGhlIG1ldGhvZC4gUmVwb3J0IHRoZSBwcm9ibGVtIGFzIGEgUnVudGltZUV4Y2VwdGlvbi4KKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOworICAgICAgfQorCisgICAgICB0cnkgeworICAgICAgICBtZXRob2QuaW52b2tlKG51bGwsIGtsYXNzKTsKKyAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgLy8gUmV0aHJvdyB0aGUgb3JpZ2luYWwgZXhjZXB0aW9uLgorICAgICAgICBUaHJvd2FibGUgY2F1c2UgPSBleC5nZXRDYXVzZSgpOworICAgICAgICAvLyBQbGVhc2UgdGhlIGNvbXBpbGVyJ3MgJ3Rocm93cycgc3RhdGljIGFuYWx5c2lzLgorICAgICAgICBpZiAoY2F1c2UgaW5zdGFuY2VvZiBFeGNlcHRpb24pIHsKKyAgICAgICAgICB0aHJvdyAoRXhjZXB0aW9uKSBjYXVzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aHJvdyAoRXJyb3IpIGNhdXNlOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHJlcXVlc3RFeGVtcHRpb25Gcm9tSGlkZGVuQXBpQ2hlY2tzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICB0cnkgeworICAgICAgICBjYWxsX1ZNRGVidWdfYWxsb3dIaWRkZW5BcGlSZWZsZWN0aW9uRnJvbShEZXhNZW1iZXJDaGVja2VyLmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBleCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrU2luZ2xlTWVtYmVyKERleE1lbWJlciBkZXhNZW1iZXIsIERleE1lbWJlckNoZWNrZXIuT2JzZXJ2ZXIgb2JzZXJ2ZXIpIHsKKyAgICAgICAgQ2xhc3M8Pz4ga2xhc3MgPSBmaW5kQ2xhc3MoZGV4TWVtYmVyKTsKKyAgICAgICAgaWYgKGtsYXNzID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIENsYXNzIG5vdCBmb3VuZC4gVGhlcmVmb3JlIGl0cyBtZW1iZXJzIGFyZSBub3QgdmlzaWJsZS4KKyAgICAgICAgICAgIG9ic2VydmVyLmNsYXNzQWNjZXNzaWJsZShmYWxzZSwgZGV4TWVtYmVyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBvYnNlcnZlci5jbGFzc0FjY2Vzc2libGUodHJ1ZSwgZGV4TWVtYmVyKTsKKworICAgICAgICBpZiAoZGV4TWVtYmVyIGluc3RhbmNlb2YgRGV4RmllbGQpIHsKKyAgICAgICAgICAgIERleEZpZWxkIGZpZWxkID0gKERleEZpZWxkKSBkZXhNZW1iZXI7CisgICAgICAgICAgICBvYnNlcnZlci5maWVsZEFjY2Vzc2libGVWaWFSZWZsZWN0aW9uKAorICAgICAgICAgICAgICAgICAgICBoYXNNYXRjaGluZ0ZpZWxkX1JlZmxlY3Rpb24oa2xhc3MsIGZpZWxkKSwKKyAgICAgICAgICAgICAgICAgICAgZmllbGQpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBvYnNlcnZlci5maWVsZEFjY2Vzc2libGVWaWFKbmkoCisgICAgICAgICAgICAgICAgICAgICAgICBoYXNNYXRjaGluZ0ZpZWxkX0pOSShrbGFzcywgZmllbGQpLAorICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yIHwgVW5zYXRpc2ZpZWRMaW5rRXJyb3IgfCBOb0NsYXNzRGVmRm91bmRFcnJvciBlKSB7CisgICAgICAgICAgICAgICAgaWYgKChlIGluc3RhbmNlb2YgTm9DbGFzc0RlZkZvdW5kRXJyb3IpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAhKGUuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIEV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvcikKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICEoZS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgVW5zYXRpc2ZpZWRMaW5rRXJyb3IpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gQ291bGQgbm90IGluaXRpYWxpemUgdGhlIGNsYXNzLiBTa2lwIEpOSSB0ZXN0LgorICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkpOSSBmYWlsZWQgZm9yICIgKyBkZXhNZW1iZXIudG9TdHJpbmcoKSwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZGV4TWVtYmVyIGluc3RhbmNlb2YgRGV4TWV0aG9kKSB7CisgICAgICAgICAgICBEZXhNZXRob2QgbWV0aG9kID0gKERleE1ldGhvZCkgZGV4TWVtYmVyOworICAgICAgICAgICAgb2JzZXJ2ZXIubWV0aG9kQWNjZXNzaWJsZVZpYVJlZmxlY3Rpb24oCisgICAgICAgICAgICAgICAgICAgIGhhc01hdGNoaW5nTWV0aG9kX1JlZmxlY3Rpb24oa2xhc3MsIG1ldGhvZCksCisgICAgICAgICAgICAgICAgICAgIG1ldGhvZCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG9ic2VydmVyLm1ldGhvZEFjY2Vzc2libGVWaWFKbmkoCisgICAgICAgICAgICAgICAgICAgICAgICBoYXNNYXRjaGluZ01ldGhvZF9KTkkoa2xhc3MsIG1ldGhvZCksCisgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yIHwgVW5zYXRpc2ZpZWRMaW5rRXJyb3IgfCBOb0NsYXNzRGVmRm91bmRFcnJvciBlKSB7CisgICAgICAgICAgICAgICAgaWYgKChlIGluc3RhbmNlb2YgTm9DbGFzc0RlZkZvdW5kRXJyb3IpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAhKGUuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIEV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvcikKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICEoZS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgVW5zYXRpc2ZpZWRMaW5rRXJyb3IpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gQ291bGQgbm90IGluaXRpYWxpemUgdGhlIGNsYXNzLiBTa2lwIEpOSSB0ZXN0LgorICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkpOSSBmYWlsZWQgZm9yICIgKyBkZXhNZW1iZXIudG9TdHJpbmcoKSwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHR5cGUgb2YgZGV4IG1lbWJlciIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB0eXBlc01hdGNoKENsYXNzPD8+W10gY2xhc3NlcywgTGlzdDxTdHJpbmc+IHR5cGVOYW1lcykgeworICAgICAgICBpZiAoY2xhc3Nlcy5sZW5ndGggIT0gdHlwZU5hbWVzLnNpemUoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3Nlcy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgaWYgKCFjbGFzc2VzW2ldLmdldFR5cGVOYW1lKCkuZXF1YWxzKHR5cGVOYW1lcy5nZXQoaSkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIENsYXNzPD8+IGZpbmRDbGFzcyhEZXhNZW1iZXIgZGV4TWVtYmVyKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBUcnkgdG8gZmluZCB0aGUgY2xhc3MuIERvIG5vdCBpbml0aWFsaXplIGl0IC0gd2UgZG8gbm90IHdhbnQgdG8gcnVuCisgICAgICAgICAgICAvLyBzdGF0aWMgaW5pdGlhbGl6ZXJzLgorICAgICAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUoZGV4TWVtYmVyLmdldEphdmFDbGFzc05hbWUoKSwgLyogaW5pdGlhbGl6ZSAqLyBmYWxzZSwKKyAgICAgICAgICAgICAgICBEZXhNZW1iZXJDaGVja2VyLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaGFzTWF0Y2hpbmdGaWVsZF9SZWZsZWN0aW9uKENsYXNzPD8+IGtsYXNzLCBEZXhGaWVsZCBkZXhGaWVsZCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAga2xhc3MuZ2V0RGVjbGFyZWRGaWVsZChkZXhGaWVsZC5nZXROYW1lKCkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGhhc01hdGNoaW5nRmllbGRfSk5JKENsYXNzPD8+IGtsYXNzLCBEZXhGaWVsZCBkZXhGaWVsZCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgRmllbGQgaWZpZWxkID0gZ2V0RmllbGRfSk5JKGtsYXNzLCBkZXhGaWVsZC5nZXROYW1lKCksIGRleEZpZWxkLmdldERleFR5cGUoKSk7CisgICAgICAgICAgICBpZiAoaWZpZWxkLmdldERlY2xhcmluZ0NsYXNzKCkgPT0ga2xhc3MpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEZpZWxkRXJyb3IgZSkgeworICAgICAgICAgICAgLy8gTm90IGZvdW5kLgorICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEZpZWxkIHNmaWVsZCA9IGdldFN0YXRpY0ZpZWxkX0pOSShrbGFzcywgZGV4RmllbGQuZ2V0TmFtZSgpLCBkZXhGaWVsZC5nZXREZXhUeXBlKCkpOworICAgICAgICAgICAgaWYgKHNmaWVsZC5nZXREZWNsYXJpbmdDbGFzcygpID09IGtsYXNzKSB7CisgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChOb1N1Y2hGaWVsZEVycm9yIGUpIHsKKyAgICAgICAgICAgIC8vIE5vdCBmb3VuZC4KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGhhc01hdGNoaW5nTWV0aG9kX1JlZmxlY3Rpb24oQ2xhc3M8Pz4ga2xhc3MsIERleE1ldGhvZCBkZXhNZXRob2QpIHsKKyAgICAgICAgTGlzdDxTdHJpbmc+IG1ldGhvZFBhcmFtcyA9IGRleE1ldGhvZC5nZXRKYXZhUGFyYW1ldGVyVHlwZXMoKTsKKworICAgICAgICBpZiAoZGV4TWV0aG9kLmlzQ29uc3RydWN0b3IoKSkgeworICAgICAgICAgICAgZm9yIChDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA6IGtsYXNzLmdldERlY2xhcmVkQ29uc3RydWN0b3JzKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAodHlwZXNNYXRjaChjb25zdHJ1Y3Rvci5nZXRQYXJhbWV0ZXJUeXBlcygpLCBtZXRob2RQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXRob2RSZXR1cm5UeXBlID0gZGV4TWV0aG9kLmdldEphdmFUeXBlKCk7CisgICAgICAgICAgICBmb3IgKE1ldGhvZCBtZXRob2QgOiBrbGFzcy5nZXREZWNsYXJlZE1ldGhvZHMoKSkgeworICAgICAgICAgICAgICAgIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscyhkZXhNZXRob2QuZ2V0TmFtZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgbWV0aG9kLmdldFJldHVyblR5cGUoKS5nZXRUeXBlTmFtZSgpLmVxdWFscyhtZXRob2RSZXR1cm5UeXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgdHlwZXNNYXRjaChtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKSwgbWV0aG9kUGFyYW1zKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaGFzTWF0Y2hpbmdNZXRob2RfSk5JKENsYXNzPD8+IGtsYXNzLCBEZXhNZXRob2QgZGV4TWV0aG9kKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBFeGVjdXRhYmxlIGltZXRob2QgPSBnZXRNZXRob2RfSk5JKAorICAgICAgICAgICAgICAgIGtsYXNzLCBkZXhNZXRob2QuZ2V0TmFtZSgpLCBkZXhNZXRob2QuZ2V0RGV4U2lnbmF0dXJlKCkpOworICAgICAgICAgICAgaWYgKGltZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKSA9PSBrbGFzcykgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFcnJvciBlKSB7CisgICAgICAgICAgICAvLyBOb3QgZm91bmQuCisgICAgICAgIH0KKworICAgICAgICBpZiAoIWRleE1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgRXhlY3V0YWJsZSBzbWV0aG9kID0KKyAgICAgICAgICAgICAgICAgICAgZ2V0U3RhdGljTWV0aG9kX0pOSShrbGFzcywgZGV4TWV0aG9kLmdldE5hbWUoKSwgZGV4TWV0aG9kLmdldERleFNpZ25hdHVyZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAoc21ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpID09IGtsYXNzKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEVycm9yIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBOb3QgZm91bmQuCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIEZpZWxkIGdldEZpZWxkX0pOSShDbGFzczw/PiBrbGFzcywgU3RyaW5nIG5hbWUsIFN0cmluZyB0eXBlKTsKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgRmllbGQgZ2V0U3RhdGljRmllbGRfSk5JKENsYXNzPD8+IGtsYXNzLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGUpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBFeGVjdXRhYmxlIGdldE1ldGhvZF9KTkkoQ2xhc3M8Pz4ga2xhc3MsIFN0cmluZyBuYW1lLCBTdHJpbmcgc2lnbmF0dXJlKTsKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgRXhlY3V0YWJsZSBnZXRTdGF0aWNNZXRob2RfSk5JKENsYXNzPD8+IGtsYXNzLCBTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgIFN0cmluZyBzaWduYXR1cmUpOworCit9CmRpZmYgLS1naXQgYS90ZXN0cy9zaWduYXR1cmUvc3JjL2FuZHJvaWQvc2lnbmF0dXJlL2N0cy9EZXhNZXRob2QuamF2YSBiL3Rlc3RzL3NpZ25hdHVyZS9zcmMvYW5kcm9pZC9zaWduYXR1cmUvY3RzL0RleE1ldGhvZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMjFjN2EKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zaWduYXR1cmUvc3JjL2FuZHJvaWQvc2lnbmF0dXJlL2N0cy9EZXhNZXRob2QuamF2YQpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQuc2lnbmF0dXJlLmN0czsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitwdWJsaWMgY2xhc3MgRGV4TWV0aG9kIGV4dGVuZHMgRGV4TWVtYmVyIHsKKyAgcHJpdmF0ZSBmaW5hbCBMaXN0PFN0cmluZz4gbVBhcmFtVHlwZUxpc3Q7CisKKyAgcHVibGljIERleE1ldGhvZChTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHNpZ25hdHVyZSkgeworICAgICAgc3VwZXIoY2xhc3NOYW1lLCBuYW1lLCBwYXJzZURleFJldHVyblR5cGUoc2lnbmF0dXJlKSk7CisgICAgICBtUGFyYW1UeXBlTGlzdCA9IHBhcnNlRGV4VHlwZUxpc3Qoc2lnbmF0dXJlKTsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0RGV4U2lnbmF0dXJlKCkgeworICAgICAgcmV0dXJuICIoIiArIFN0cmluZy5qb2luKCIiLCBtUGFyYW1UeXBlTGlzdCkgKyAiKSIgKyBnZXREZXhUeXBlKCk7CisgIH0KKworICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEphdmFQYXJhbWV0ZXJUeXBlcygpIHsKKyAgICAgIHJldHVybiBtUGFyYW1UeXBlTGlzdC5zdHJlYW0oKS5tYXAoRGV4TWVtYmVyOjpkZXhUb0phdmFUeXBlKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gaXNDb25zdHJ1Y3RvcigpIHsKKyAgICAgIHJldHVybiAiPGluaXQ+Ii5lcXVhbHMoZ2V0TmFtZSgpKSAmJiAiViIuZXF1YWxzKGdldERleFR5cGUoKSk7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBpc1N0YXRpY0NvbnN0cnVjdG9yKCkgeworICAgICAgcmV0dXJuICI8Y2xpbml0PiIuZXF1YWxzKGdldE5hbWUoKSkgJiYgIlYiLmVxdWFscyhnZXREZXhUeXBlKCkpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICByZXR1cm4gZ2V0SmF2YVR5cGUoKSArICIgIiArIGdldEphdmFDbGFzc05hbWUoKSArICIuIiArIGdldE5hbWUoKQorICAgICAgICAgICAgICArICIoIiArIFN0cmluZy5qb2luKCIsICIsIGdldEphdmFQYXJhbWV0ZXJUeXBlcygpKSArICIpIjsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIE1hdGNoZXIgbWF0Y2hTaWduYXR1cmUoU3RyaW5nIHNpZ25hdHVyZSkgeworICAgICAgTWF0Y2hlciBtID0gUGF0dGVybi5jb21waWxlKCJeXFwoKC4qKVxcKSguKikkIikubWF0Y2hlcihzaWduYXR1cmUpOworICAgICAgaWYgKCFtLm1hdGNoZXMoKSkgeworICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDb3VsZCBub3QgcGFyc2UgbWV0aG9kIHNpZ25hdHVyZTogIiArIHNpZ25hdHVyZSk7CisgICAgICB9CisgICAgICByZXR1cm4gbTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBwYXJzZURleFJldHVyblR5cGUoU3RyaW5nIHNpZ25hdHVyZSkgeworICAgICAgcmV0dXJuIG1hdGNoU2lnbmF0dXJlKHNpZ25hdHVyZSkuZ3JvdXAoMik7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gcGFyc2VEZXhUeXBlTGlzdChTdHJpbmcgc2lnbmF0dXJlKSB7CisgICAgICBTdHJpbmcgdHlwZVNlcXVlbmNlID0gbWF0Y2hTaWduYXR1cmUoc2lnbmF0dXJlKS5ncm91cCgxKTsKKyAgICAgIExpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICB3aGlsZSAoIXR5cGVTZXF1ZW5jZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICBTdHJpbmcgdHlwZSA9IGZpcnN0RGV4VHlwZUZyb21MaXN0KHR5cGVTZXF1ZW5jZSk7CisgICAgICAgICAgbGlzdC5hZGQodHlwZSk7CisgICAgICAgICAgdHlwZVNlcXVlbmNlID0gdHlwZVNlcXVlbmNlLnN1YnN0cmluZyh0eXBlLmxlbmd0aCgpKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBsaXN0OworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIGZpcnN0IGRleCB0eXBlIGluIGB0eXBlTGlzdGAgb3IgdGhyb3dzIGEgUGFyc2VyRXhjZXB0aW9uCisgICAqIGlmIGEgZGV4IHR5cGUgaXMgbm90IHJlY29nbml6ZWQuIFRoZSBpbnB1dCBpcyBub3QgY2hhbmdlZC4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBmaXJzdERleFR5cGVGcm9tTGlzdChTdHJpbmcgdHlwZUxpc3QpIHsKKyAgICAgIFN0cmluZyBkZXhEaW1lbnNpb24gPSAiIjsKKyAgICAgIHdoaWxlICh0eXBlTGlzdC5zdGFydHNXaXRoKCJbIikpIHsKKyAgICAgICAgICBkZXhEaW1lbnNpb24gKz0gIlsiOworICAgICAgICAgIHR5cGVMaXN0ID0gdHlwZUxpc3Quc3Vic3RyaW5nKDEpOworICAgICAgfQorCisgICAgICBTdHJpbmcgdHlwZSA9IG51bGw7CisgICAgICBpZiAodHlwZUxpc3Quc3RhcnRzV2l0aCgiViIpCisgICAgICAgICAgICAgIHx8IHR5cGVMaXN0LnN0YXJ0c1dpdGgoIloiKQorICAgICAgICAgICAgICB8fCB0eXBlTGlzdC5zdGFydHNXaXRoKCJCIikKKyAgICAgICAgICAgICAgfHwgdHlwZUxpc3Quc3RhcnRzV2l0aCgiQyIpCisgICAgICAgICAgICAgIHx8IHR5cGVMaXN0LnN0YXJ0c1dpdGgoIlMiKQorICAgICAgICAgICAgICB8fCB0eXBlTGlzdC5zdGFydHNXaXRoKCJJIikKKyAgICAgICAgICAgICAgfHwgdHlwZUxpc3Quc3RhcnRzV2l0aCgiSiIpCisgICAgICAgICAgICAgIHx8IHR5cGVMaXN0LnN0YXJ0c1dpdGgoIkYiKQorICAgICAgICAgICAgICB8fCB0eXBlTGlzdC5zdGFydHNXaXRoKCJEIikpIHsKKyAgICAgICAgICB0eXBlID0gdHlwZUxpc3Quc3Vic3RyaW5nKDAsIDEpOworICAgICAgfSBlbHNlIGlmICh0eXBlTGlzdC5zdGFydHNXaXRoKCJMIikgJiYgdHlwZUxpc3QuaW5kZXhPZigiOyIpID4gMCkgeworICAgICAgICAgIHR5cGUgPSB0eXBlTGlzdC5zdWJzdHJpbmcoMCwgdHlwZUxpc3QuaW5kZXhPZigiOyIpICsgMSk7CisgICAgICB9IGVsc2UgeworICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmV4cGVjdGVkIGRleCB0eXBlIGluIFwiIiArIHR5cGVMaXN0ICsgIlwiIik7CisgICAgICB9CisKKyAgICAgIHJldHVybiBkZXhEaW1lbnNpb24gKyB0eXBlOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zaWduYXR1cmUvc3JjL2FuZHJvaWQvc2lnbmF0dXJlL2N0cy9FeGNsdWRpbmdDbGFzc1Byb3ZpZGVyLmphdmEgYi90ZXN0cy9zaWduYXR1cmUvc3JjL2FuZHJvaWQvc2lnbmF0dXJlL2N0cy9FeGNsdWRpbmdDbGFzc1Byb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ5Y2M2YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NpZ25hdHVyZS9zcmMvYW5kcm9pZC9zaWduYXR1cmUvY3RzL0V4Y2x1ZGluZ0NsYXNzUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5zaWduYXR1cmUuY3RzOworCitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKKworLyoqCisgKiBBIGZpbHRlcmVkIGNsYXNzIHByb3ZpZGVyIHdoaWNoIGV4Y2x1ZGVzIGNsYXNzZXMgYnkgdGhlaXIgY2Fub25pY2FsIG5hbWVzCisgKi8KK3B1YmxpYyBjbGFzcyBFeGNsdWRpbmdDbGFzc1Byb3ZpZGVyIGV4dGVuZHMgQ2xhc3NQcm92aWRlciB7CisgICAgcHJpdmF0ZSBmaW5hbCBDbGFzc1Byb3ZpZGVyIGJhc2U7CisgICAgcHJpdmF0ZSBmaW5hbCBQcmVkaWNhdGU8U3RyaW5nPiB0ZXN0Rm9yRXhjbHVzaW9uOworCisgICAgcHVibGljIEV4Y2x1ZGluZ0NsYXNzUHJvdmlkZXIoQ2xhc3NQcm92aWRlciBiYXNlLAorICAgICAgICAgICAgUHJlZGljYXRlPFN0cmluZz4gdGVzdEZvckV4Y2x1c2lvbikgeworICAgICAgICB0aGlzLmJhc2UgPSBiYXNlOworICAgICAgICB0aGlzLnRlc3RGb3JFeGNsdXNpb24gPSB0ZXN0Rm9yRXhjbHVzaW9uOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDbGFzczw/PiBnZXRDbGFzcyhTdHJpbmcgbmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBpZiAoIXRlc3RGb3JFeGNsdXNpb24udGVzdChuYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuIGJhc2UuZ2V0Q2xhc3MobmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gYSBmaWx0ZXJlZC1vdXQgY2xhc3MgaXMgdGhlIHNhbWUgYXMgbm9uLWV4aXN0aW5nIGNsYXNzCisgICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKCJDYW5ub3QgZmluZCBjbGFzcyAiICsgbmFtZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmVhbTxDbGFzczw/Pj4gZ2V0QWxsQ2xhc3NlcygpIHsKKyAgICAgICAgcmV0dXJuIGJhc2UuZ2V0QWxsQ2xhc3NlcygpCisgICAgICAgICAgICAgICAgLmZpbHRlcihjbGF6eiAtPiAhdGVzdEZvckV4Y2x1c2lvbi50ZXN0KGNsYXp6LmdldENhbm9uaWNhbE5hbWUoKSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJlYW08RGV4TWVtYmVyPiBnZXRBbGxNZW1iZXJzKENsYXNzPD8+IGtsYXNzKSB7CisgICAgICAgIHJldHVybiBiYXNlLmdldEFsbE1lbWJlcnMoa2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3NpZ25hdHVyZS9zcmMvYW5kcm9pZC9zaWduYXR1cmUvY3RzL0ZhaWx1cmVUeXBlLmphdmEgYi90ZXN0cy9zaWduYXR1cmUvc3JjL2FuZHJvaWQvc2lnbmF0dXJlL2N0cy9GYWlsdXJlVHlwZS5qYXZhCmluZGV4IDc3ODIwZWIuLjI1ZWZjYWIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3NpZ25hdHVyZS9zcmMvYW5kcm9pZC9zaWduYXR1cmUvY3RzL0ZhaWx1cmVUeXBlLmphdmEKKysrIGIvdGVzdHMvc2lnbmF0dXJlL3NyYy9hbmRyb2lkL3NpZ25hdHVyZS9jdHMvRmFpbHVyZVR5cGUuamF2YQpAQCAtNCw4ICs0LDEwIEBACiAgKiBEZWZpbmUgdGhlIHR5cGUgb2YgdGhlIHNpZ25hdHVyZSBjaGVjayBmYWlsdXJlcy4KICAqLwogcHVibGljIGVudW0gRmFpbHVyZVR5cGUgeworICAgIE1JU1NJTkdfQU5OT1RBVElPTiwKICAgICBNSVNTSU5HX0NMQVNTLAogICAgIE1JU1NJTkdfSU5URVJGQUNFLAorICAgIE1JU1NJTkdfQ09OU1RSVUNUT1IsCiAgICAgTUlTU0lOR19NRVRIT0QsCiAgICAgTUlTU0lOR19GSUVMRCwKICAgICBNSVNNQVRDSF9DTEFTUywKQEAgLTE0LDUgKzE2LDIwIEBACiAgICAgTUlTTUFUQ0hfTUVUSE9ELAogICAgIE1JU01BVENIX0ZJRUxELAogICAgIFVORVhQRUNURURfQ0xBU1MsCi0gICAgQ0FVR0hUX0VYQ0VQVElPTiwKKyAgICBFWFRSQV9DTEFTUywKKyAgICBFWFRSQV9JTlRFUkZBQ0UsCisgICAgRVhUUkFfTUVUSE9ELAorICAgIEVYVFJBX0ZJRUxELAorICAgIENBVUdIVF9FWENFUFRJT047CisKKyAgICBzdGF0aWMgRmFpbHVyZVR5cGUgbWlzbWF0Y2goSkRpZmZDbGFzc0Rlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7CisgICAgICAgIHJldHVybiBKRGlmZkNsYXNzRGVzY3JpcHRpb24uSkRpZmZUeXBlLklOVEVSRkFDRS5lcXVhbHMoZGVzY3JpcHRpb24uZ2V0Q2xhc3NUeXBlKCkpCisgICAgICAgICAgICAgICAgPyBGYWlsdXJlVHlwZS5NSVNNQVRDSF9JTlRFUkZBQ0UgOiBGYWlsdXJlVHlwZS5NSVNNQVRDSF9DTEFTUzsKKyAgICB9CisKKyAgICBzdGF0aWMgRmFpbHVyZVR5cGUgbWlzc2luZyhKRGlmZkNsYXNzRGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHsKKyAgICAgICAgcmV0dXJuIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZlR5cGUuSU5URVJGQUNFLmVxdWFscyhkZXNjcmlwdGlvbi5nZXRDbGFzc1R5cGUoKSkKKyAgICAgICAgICAgICAgICA/IEZhaWx1cmVUeXBlLk1JU1NJTkdfSU5URVJGQUNFIDogRmFpbHVyZVR5cGUuTUlTU0lOR19DTEFTUzsKKyAgICB9CisKIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3NpZ25hdHVyZS9zcmMvYW5kcm9pZC9zaWduYXR1cmUvY3RzL0ludGVyZmFjZUNoZWNrZXIuamF2YSBiL3Rlc3RzL3NpZ25hdHVyZS9zcmMvYW5kcm9pZC9zaWduYXR1cmUvY3RzL0ludGVyZmFjZUNoZWNrZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmU1Zjk2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc2lnbmF0dXJlL3NyYy9hbmRyb2lkL3NpZ25hdHVyZS9jdHMvSW50ZXJmYWNlQ2hlY2tlci5qYXZhCkBAIC0wLDAgKzEsMTUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5zaWduYXR1cmUuY3RzOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOworCisvKioKKyAqIENoZWNrcyB0aGF0IHRoZSBydW50aW1lIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbnRlcmZhY2VzIG1hdGNoIHRoZSBBUEkgZGVmaW5pdGlvbi4KKyAqCisgKiA8cD5JbnRlcmZhY2VzIGFyZSB0cmVhdGVkIGRpZmZlcmVudGx5IHRvIG90aGVyIGNsYXNzZXMuIFdoZXJlYXMgb3RoZXIgY2xhc3NlcyBhcmUgY2hlY2tlZCBieQorICogbWFraW5nIHN1cmUgdGhhdCBldmVyeSBtZW1iZXIgaW4gdGhlIEFQSSBpcyBhY2Nlc3NpYmxlIHRocm91Z2ggcmVmbGVjdGlvbi4gSW50ZXJmYWNlcyBhcmUKKyAqIGNoZWNrZWQgdG8gbWFrZSBzdXJlIHRoYXQgZXZlcnkgbWV0aG9kIHZpc2libGUgdGhyb3VnaCByZWZsZWN0aW9uIGlzIGRlZmluZWQgaW4gdGhlIEFQSS4gVGhlCisgKiByZWFzb24gZm9yIHRoaXMgZGlmZmVyZW5jZSBpcyB0byBlbnN1cmUgdGhhdCBubyBhZGRpdGlvbmFsIG1ldGhvZHMgaGF2ZSBiZWVuIGFkZGVkIHRvIGludGVyZmFjZXMKKyAqIHRoYXQgYXJlIGV4cGVjdGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IEFuZHJvaWQgZGV2ZWxvcGVycyBiZWNhdXNlIHRoYXQgd291bGQgYnJlYWsgYmFja3dhcmRzCisgKiBjb21wYXRpYmlsaXR5LgorICoKKyAqIFRPRE8oYi83MTg4NjQ5MSk6IFRoaXMgYWxzbyBwb3RlbnRpYWxseSBhcHBsaWVzIHRvIGFic3RyYWN0IGNsYXNzZXMgdGhhdCB0aGUgQXBwIGRldmVsb3BlcnMgYXJlCisgKiBleHBlY3RlZCB0byBleHRlbmQuCisgKi8KK2NsYXNzIEludGVyZmFjZUNoZWNrZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gSElEREVOX0lOVEVSRkFDRV9NRVRIT0RfV0hJVEVMSVNUID0gbmV3IEhhc2hTZXQ8PigpOworICAgIHN0YXRpYyB7CisgICAgICAgIC8vIEludGVyZmFjZXMgdGhhdCBkZWZpbmUgQGhpZGUgb3IgQFN5c3RlbUFwaSBvciBAVGVzdEFwaSBtZXRob2RzIHdpbGwgYnkgZGVmaW5pdGlvbiBjb250YWluCisgICAgICAgIC8vIG1ldGhvZHMgdGhhdCBkbyBub3QgYXBwZWFyIGluIGN1cnJlbnQudHh0LiBJbnRlcmZhY2VzIGFkZGVkIHRvIHRoaXMKKyAgICAgICAgLy8gbGlzdCBhcmUgcHJvYmFibHkgbm90IG1lYW50IHRvIGJlIGltcGxlbWVudGVkIGluIGFuIGFwcGxpY2F0aW9uLgorICAgICAgICBISURERU5fSU5URVJGQUNFX01FVEhPRF9XSElURUxJU1QuYWRkKCJwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBhbmRyb2lkLmNvbXBhbmlvbi5EZXZpY2VGaWx0ZXIubWF0Y2hlcyhEKSIpOworICAgICAgICBISURERU5fSU5URVJGQUNFX01FVEhPRF9XSElURUxJU1QuYWRkKCJwdWJsaWMgc3RhdGljIDxEPiBib29sZWFuIGFuZHJvaWQuY29tcGFuaW9uLkRldmljZUZpbHRlci5tYXRjaGVzKGFuZHJvaWQuY29tcGFuaW9uLkRldmljZUZpbHRlcjxEPixEKSIpOworICAgICAgICBISURERU5fSU5URVJGQUNFX01FVEhPRF9XSElURUxJU1QuYWRkKCJwdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBhbmRyb2lkLmNvbXBhbmlvbi5EZXZpY2VGaWx0ZXIuZ2V0RGV2aWNlRGlzcGxheU5hbWUoRCkiKTsKKyAgICAgICAgSElEREVOX0lOVEVSRkFDRV9NRVRIT0RfV0hJVEVMSVNULmFkZCgicHVibGljIGFic3RyYWN0IGludCBhbmRyb2lkLmNvbXBhbmlvbi5EZXZpY2VGaWx0ZXIuZ2V0TWVkaXVtVHlwZSgpIik7CisgICAgICAgIEhJRERFTl9JTlRFUkZBQ0VfTUVUSE9EX1dISVRFTElTVC5hZGQoInB1YmxpYyBhYnN0cmFjdCB2b2lkIGFuZHJvaWQubmZjLnRlY2guVGFnVGVjaG5vbG9neS5yZWNvbm5lY3QoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiIpOworICAgICAgICBISURERU5fSU5URVJGQUNFX01FVEhPRF9XSElURUxJU1QuYWRkKCJwdWJsaWMgYWJzdHJhY3Qgdm9pZCBhbmRyb2lkLm9zLklCaW5kZXIuc2hlbGxDb21tYW5kKGphdmEuaW8uRmlsZURlc2NyaXB0b3IsamF2YS5pby5GaWxlRGVzY3JpcHRvcixqYXZhLmlvLkZpbGVEZXNjcmlwdG9yLGphdmEubGFuZy5TdHJpbmdbXSxhbmRyb2lkLm9zLlNoZWxsQ2FsbGJhY2ssYW5kcm9pZC5vcy5SZXN1bHRSZWNlaXZlcikgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uIik7CisgICAgICAgIEhJRERFTl9JTlRFUkZBQ0VfTUVUSE9EX1dISVRFTElTVC5hZGQoInB1YmxpYyBhYnN0cmFjdCBpbnQgYW5kcm9pZC50ZXh0LlBhcmNlbGFibGVTcGFuLmdldFNwYW5UeXBlSWRJbnRlcm5hbCgpIik7CisgICAgICAgIEhJRERFTl9JTlRFUkZBQ0VfTUVUSE9EX1dISVRFTElTVC5hZGQoInB1YmxpYyBhYnN0cmFjdCB2b2lkIGFuZHJvaWQudGV4dC5QYXJjZWxhYmxlU3Bhbi53cml0ZVRvUGFyY2VsSW50ZXJuYWwoYW5kcm9pZC5vcy5QYXJjZWwsaW50KSIpOworICAgICAgICBISURERU5fSU5URVJGQUNFX01FVEhPRF9XSElURUxJU1QuYWRkKCJwdWJsaWMgYWJzdHJhY3Qgdm9pZCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5yZXF1ZXN0QXBwS2V5Ym9hcmRTaG9ydGN1dHMoYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIkS2V5Ym9hcmRTaG9ydGN1dHNSZWNlaXZlcixpbnQpIik7CisgICAgICAgIEhJRERFTl9JTlRFUkZBQ0VfTUVUSE9EX1dISVRFTElTVC5hZGQoInB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0wxMC5lZ2xSZWxlYXNlVGhyZWFkKCkiKTsKKyAgICAgICAgSElEREVOX0lOVEVSRkFDRV9NRVRIT0RfV0hJVEVMSVNULmFkZCgicHVibGljIGFic3RyYWN0IHZvaWQgb3JnLnczYy5kb20ubHMuTFNTZXJpYWxpemVyLnNldEZpbHRlcihvcmcudzNjLmRvbS5scy5MU1NlcmlhbGl6ZXJGaWx0ZXIpIik7CisgICAgICAgIEhJRERFTl9JTlRFUkZBQ0VfTUVUSE9EX1dISVRFTElTVC5hZGQoInB1YmxpYyBhYnN0cmFjdCBvcmcudzNjLmRvbS5scy5MU1NlcmlhbGl6ZXJGaWx0ZXIgb3JnLnczYy5kb20ubHMuTFNTZXJpYWxpemVyLmdldEZpbHRlcigpIik7CisgICAgICAgIEhJRERFTl9JTlRFUkZBQ0VfTUVUSE9EX1dISVRFTElTVC5hZGQoInB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbiBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5nZXRDdXJyZW50SW1lVG91Y2hSZWdpb24oKSIpOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgUmVzdWx0T2JzZXJ2ZXIgcmVzdWx0T2JzZXJ2ZXI7CisKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxDbGFzczw/PiwgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uPiBjbGFzczJEZXNjcmlwdGlvbiA9CisgICAgICAgICAgICBuZXcgVHJlZU1hcDw+KENvbXBhcmF0b3IuY29tcGFyaW5nKENsYXNzOjpnZXROYW1lKSk7CisKKyAgICBwcml2YXRlIGZpbmFsIENsYXNzUHJvdmlkZXIgY2xhc3NQcm92aWRlcjsKKworICAgIEludGVyZmFjZUNoZWNrZXIoUmVzdWx0T2JzZXJ2ZXIgcmVzdWx0T2JzZXJ2ZXIsIENsYXNzUHJvdmlkZXIgY2xhc3NQcm92aWRlcikgeworICAgICAgICB0aGlzLnJlc3VsdE9ic2VydmVyID0gcmVzdWx0T2JzZXJ2ZXI7CisgICAgICAgIHRoaXMuY2xhc3NQcm92aWRlciA9IGNsYXNzUHJvdmlkZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2hlY2tRdWV1ZWQoKSB7CisgICAgICAgIGZvciAoTWFwLkVudHJ5PENsYXNzPD8+LCBKRGlmZkNsYXNzRGVzY3JpcHRpb24+IGVudHJ5IDogY2xhc3MyRGVzY3JpcHRpb24uZW50cnlTZXQoKSkgeworICAgICAgICAgICAgQ2xhc3M8Pz4gcnVudGltZUNsYXNzID0gZW50cnkuZ2V0S2V5KCk7CisgICAgICAgICAgICBKRGlmZkNsYXNzRGVzY3JpcHRpb24gY2xhc3NEZXNjcmlwdGlvbiA9IGVudHJ5LmdldFZhbHVlKCk7CisgICAgICAgICAgICBMaXN0PE1ldGhvZD4gbWV0aG9kcyA9IGNoZWNrSW50ZXJmYWNlTWV0aG9kQ29tcGxpYW5jZShjbGFzc0Rlc2NyaXB0aW9uLCBydW50aW1lQ2xhc3MpOworICAgICAgICAgICAgaWYgKG1ldGhvZHMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIHJlc3VsdE9ic2VydmVyLm5vdGlmeUZhaWx1cmUoRmFpbHVyZVR5cGUuTUlTTUFUQ0hfSU5URVJGQUNFX01FVEhPRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzRGVzY3JpcHRpb24uZ2V0QWJzb2x1dGVDbGFzc05hbWUoKSwgIkludGVyZmFjZXMgY2Fubm90IGJlIG1vZGlmaWVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY2xhc3NEZXNjcmlwdGlvbi5nZXRBYnNvbHV0ZUNsYXNzTmFtZSgpICsgIjogIiArIG1ldGhvZHMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgPFQ+IFByZWRpY2F0ZTxUPiBub3QoUHJlZGljYXRlPFQ+IHByZWRpY2F0ZSkgeworICAgICAgICByZXR1cm4gcHJlZGljYXRlLm5lZ2F0ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZhbGlkYXRlIHRoYXQgYW4gaW50ZXJmYWNlcyBtZXRob2QgY291bnQgaXMgYXMgZXhwZWN0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xhc3NEZXNjcmlwdGlvbiB0aGUgY2xhc3MncyBBUEkgZGVzY3JpcHRpb24uCisgICAgICogQHBhcmFtIHJ1bnRpbWVDbGFzcyB0aGUgcnVudGltZSBjbGFzcyBjb3JyZXNwb25kaW5nIHRvIHtAY29kZSBjbGFzc0Rlc2NyaXB0aW9ufS4KKyAgICAgKi8KKyAgICBwcml2YXRlIExpc3Q8TWV0aG9kPiBjaGVja0ludGVyZmFjZU1ldGhvZENvbXBsaWFuY2UoCisgICAgICAgICAgICBKRGlmZkNsYXNzRGVzY3JpcHRpb24gY2xhc3NEZXNjcmlwdGlvbiwgQ2xhc3M8Pz4gcnVudGltZUNsYXNzKSB7CisKKyAgICAgICAgcmV0dXJuIFN0cmVhbS5vZihydW50aW1lQ2xhc3MuZ2V0RGVjbGFyZWRNZXRob2RzKCkpCisgICAgICAgICAgICAgICAgLmZpbHRlcihub3QoTWV0aG9kOjppc0RlZmF1bHQpKQorICAgICAgICAgICAgICAgIC5maWx0ZXIobm90KE1ldGhvZDo6aXNTeW50aGV0aWMpKQorICAgICAgICAgICAgICAgIC5maWx0ZXIobm90KE1ldGhvZDo6aXNCcmlkZ2UpKQorICAgICAgICAgICAgICAgIC5maWx0ZXIobSAtPiAhTW9kaWZpZXIuaXNTdGF0aWMobS5nZXRNb2RpZmllcnMoKSkpCisgICAgICAgICAgICAgICAgLmZpbHRlcihtIC0+ICFISURERU5fSU5URVJGQUNFX01FVEhPRF9XSElURUxJU1QuY29udGFpbnMobS50b0dlbmVyaWNTdHJpbmcoKSkpCisgICAgICAgICAgICAgICAgLmZpbHRlcihtIC0+ICFmaW5kTWV0aG9kKGNsYXNzRGVzY3JpcHRpb24sIG0pKQorICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9Db2xsZWN0aW9uKEFycmF5TGlzdDo6bmV3KSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGZpbmRNZXRob2QoSkRpZmZDbGFzc0Rlc2NyaXB0aW9uIGNsYXNzRGVzY3JpcHRpb24sIE1ldGhvZCBtZXRob2QpIHsKKyAgICAgICAgZm9yIChKRGlmZkNsYXNzRGVzY3JpcHRpb24uSkRpZmZNZXRob2QgamRpZmZNZXRob2QgOiBjbGFzc0Rlc2NyaXB0aW9uLmdldE1ldGhvZHMoKSkgeworICAgICAgICAgICAgaWYgKFJlZmxlY3Rpb25IZWxwZXIubWF0Y2hlcyhqZGlmZk1ldGhvZCwgbWV0aG9kKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoU3RyaW5nIGludGVyZmFjZU5hbWUgOiBjbGFzc0Rlc2NyaXB0aW9uLmdldEltcGxJbnRlcmZhY2VzKCkpIHsKKyAgICAgICAgICAgIENsYXNzPD8+IGludGVyZmFjZUNsYXNzID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaW50ZXJmYWNlQ2xhc3MgPSBSZWZsZWN0aW9uSGVscGVyLmZpbmRNYXRjaGluZ0NsYXNzKGludGVyZmFjZU5hbWUsIGNsYXNzUHJvdmlkZXIpOworICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nSGVscGVyLmxvZ2UoIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gZm9yICIgKyBjbGFzc0Rlc2NyaXB0aW9uLmdldEFic29sdXRlQ2xhc3NOYW1lKCksIGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBKRGlmZkNsYXNzRGVzY3JpcHRpb24gaW1wbEludGVyZmFjZSA9IGNsYXNzMkRlc2NyaXB0aW9uLmdldChpbnRlcmZhY2VDbGFzcyk7CisgICAgICAgICAgICBpZiAoaW1wbEludGVyZmFjZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gQ2xhc3MgZGVmaW5pdGlvbiBpcyBub3QgaW4gdGhlIHNjb3BlIG9mIHRoZSBBUEkgZGVmaW5pdGlvbnMuCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmaW5kTWV0aG9kKGltcGxJbnRlcmZhY2UsIG1ldGhvZCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisKKyAgICB2b2lkIHF1ZXVlRm9yRGVmZXJyZWRDaGVjayhKRGlmZkNsYXNzRGVzY3JpcHRpb24gY2xhc3NEZXNjcmlwdGlvbiwgQ2xhc3M8Pz4gcnVudGltZUNsYXNzKSB7CisKKyAgICAgICAgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uIGV4aXN0aW5nRGVzY3JpcHRpb24gPSBjbGFzczJEZXNjcmlwdGlvbi5nZXQocnVudGltZUNsYXNzKTsKKyAgICAgICAgaWYgKGV4aXN0aW5nRGVzY3JpcHRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChKRGlmZkNsYXNzRGVzY3JpcHRpb24uSkRpZmZNZXRob2QgbWV0aG9kIDogY2xhc3NEZXNjcmlwdGlvbi5nZXRNZXRob2RzKCkpIHsKKyAgICAgICAgICAgICAgICBleGlzdGluZ0Rlc2NyaXB0aW9uLmFkZE1ldGhvZChtZXRob2QpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2xhc3MyRGVzY3JpcHRpb24ucHV0KHJ1bnRpbWVDbGFzcywgY2xhc3NEZXNjcmlwdGlvbik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zaWduYXR1cmUvc3JjL2FuZHJvaWQvc2lnbmF0dXJlL2N0cy9KRGlmZkNsYXNzRGVzY3JpcHRpb24uamF2YSBiL3Rlc3RzL3NpZ25hdHVyZS9zcmMvYW5kcm9pZC9zaWduYXR1cmUvY3RzL0pEaWZmQ2xhc3NEZXNjcmlwdGlvbi5qYXZhCmluZGV4IGRmOTFkZGIuLjMwNTg0YzkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3NpZ25hdHVyZS9zcmMvYW5kcm9pZC9zaWduYXR1cmUvY3RzL0pEaWZmQ2xhc3NEZXNjcmlwdGlvbi5qYXZhCisrKyBiL3Rlc3RzL3NpZ25hdHVyZS9zcmMvYW5kcm9pZC9zaWduYXR1cmUvY3RzL0pEaWZmQ2xhc3NEZXNjcmlwdGlvbi5qYXZhCkBAIC00MiwxMCArNDIsMTAgQEAKICAgICBwcml2YXRlIGludCBtTW9kaWZpZXI7CiAKICAgICBwcml2YXRlIFN0cmluZyBtRXh0ZW5kZWRDbGFzczsKLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBpbXBsSW50ZXJmYWNlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgIHByaXZhdGUgTGlzdDxKRGlmZkZpZWxkPiBqRGlmZkZpZWxkcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgIHByaXZhdGUgTGlzdDxKRGlmZk1ldGhvZD4gakRpZmZNZXRob2RzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgcHJpdmF0ZSBMaXN0PEpEaWZmQ29uc3RydWN0b3I+IGpEaWZmQ29uc3RydWN0b3JzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFN0cmluZz4gaW1wbEludGVyZmFjZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8SkRpZmZGaWVsZD4gakRpZmZGaWVsZHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8SkRpZmZNZXRob2Q+IGpEaWZmTWV0aG9kcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxKRGlmZkNvbnN0cnVjdG9yPiBqRGlmZkNvbnN0cnVjdG9ycyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCiAgICAgcHJpdmF0ZSBKRGlmZlR5cGUgbUNsYXNzVHlwZTsKIApAQCAtNjYsNyArNjYsNyBAQAogICAgICAgICByZXR1cm4gbVBhY2thZ2VOYW1lOwogICAgIH0KIAotICAgIFN0cmluZyBnZXRTaG9ydENsYXNzTmFtZSgpIHsKKyAgICBwdWJsaWMgU3RyaW5nIGdldFNob3J0Q2xhc3NOYW1lKCkgewogICAgICAgICByZXR1cm4gbVNob3J0Q2xhc3NOYW1lOwogICAgIH0KIApAQCAtMTAzLDcgKzEwMyw3IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gaW5hbWUgbmFtZSBvZiBpbnRlcmZhY2UKICAgICAgKi8KLSAgICB2b2lkIGFkZEltcGxJbnRlcmZhY2UoU3RyaW5nIGluYW1lKSB7CisgICAgcHVibGljIHZvaWQgYWRkSW1wbEludGVyZmFjZShTdHJpbmcgaW5hbWUpIHsKICAgICAgICAgaW1wbEludGVyZmFjZXMuYWRkKGluYW1lKTsKICAgICB9CiAKQEAgLTEzNCw3ICsxMzQsNyBAQAogICAgICAgICBqRGlmZkNvbnN0cnVjdG9ycy5hZGQodGMpOwogICAgIH0KIAotICAgIHN0YXRpYyBTdHJpbmcgY29udmVydE1vZGlmaWVyc1RvQWNjZXNzTGV2ZWwoaW50IG1vZGlmaWVycykgeworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBjb252ZXJ0TW9kaWZpZXJzVG9BY2Nlc3NMZXZlbChpbnQgbW9kaWZpZXJzKSB7CiAgICAgICAgIGlmICgobW9kaWZpZXJzICYgTW9kaWZpZXIuUFVCTElDKSAhPSAwKSB7CiAgICAgICAgICAgICByZXR1cm4gInB1YmxpYyI7CiAgICAgICAgIH0gZWxzZSBpZiAoKG1vZGlmaWVycyAmIE1vZGlmaWVyLlBSSVZBVEUpICE9IDApIHsKQEAgLTE0Nyw3ICsxNDcsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgc3RhdGljIFN0cmluZyBjb252ZXJ0TW9kaWZlcnNUb01vZGlmaWVyU3RyaW5nKGludCBtb2RpZmllcnMpIHsKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgY29udmVydE1vZGlmZXJzVG9Nb2RpZmllclN0cmluZyhpbnQgbW9kaWZpZXJzKSB7CiAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgICBTdHJpbmcgc2VwYXJhdG9yID0gIiI7CiAKQEAgLTIwMSw4ICsyMDEsOCBAQAogICAgICAqIFJlcHJlc2VudHMgYSAgZmllbGQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBKRGlmZkZpZWxkIGV4dGVuZHMgSkRpZmZFbGVtZW50IHsKLSAgICAgICAgU3RyaW5nIG1GaWVsZFR5cGU7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIG1GaWVsZFZhbHVlOworICAgICAgICBmaW5hbCBTdHJpbmcgbUZpZWxkVHlwZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUZpZWxkVmFsdWU7CiAKICAgICAgICAgcHVibGljIEpEaWZmRmllbGQoU3RyaW5nIG5hbWUsIFN0cmluZyBmaWVsZFR5cGUsIGludCBtb2RpZmllciwgU3RyaW5nIHZhbHVlKSB7CiAgICAgICAgICAgICBzdXBlcihuYW1lLCBtb2RpZmllcik7CkBAIC0yNTQsOSArMjU0LDkgQEAKICAgICAgKiBSZXByZXNlbnRzIGEgbWV0aG9kLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSkRpZmZNZXRob2QgZXh0ZW5kcyBKRGlmZkVsZW1lbnQgewotICAgICAgICBTdHJpbmcgbVJldHVyblR5cGU7Ci0gICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IG1QYXJhbUxpc3Q7Ci0gICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IG1FeGNlcHRpb25MaXN0OworICAgICAgICBmaW5hbCBTdHJpbmcgbVJldHVyblR5cGU7CisgICAgICAgIGZpbmFsIEFycmF5TGlzdDxTdHJpbmc+IG1QYXJhbUxpc3Q7CisgICAgICAgIGZpbmFsIEFycmF5TGlzdDxTdHJpbmc+IG1FeGNlcHRpb25MaXN0OwogCiAgICAgICAgIHB1YmxpYyBKRGlmZk1ldGhvZChTdHJpbmcgbmFtZSwgaW50IG1vZGlmaWVyLCBTdHJpbmcgcmV0dXJuVHlwZSkgewogICAgICAgICAgICAgc3VwZXIobmFtZSwgbW9kaWZpZXIpOwpAQCAtMzY5LDcgKzM2OSw3IEBACiAgICAgICAgICAqCiAgICAgICAgICAqIEByZXR1cm4gdGhlIHJldHVybiB0eXBlIG9mIHRoaXMgbWV0aG9kLgogICAgICAgICAgKi8KLSAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSZXR1cm5UeXBlKCkgeworICAgICAgICBTdHJpbmcgZ2V0UmV0dXJuVHlwZSgpIHsKICAgICAgICAgICAgIHJldHVybiBtUmV0dXJuVHlwZTsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3NpZ25hdHVyZS9zcmMvYW5kcm9pZC9zaWduYXR1cmUvY3RzL0xvZ0hlbHBlci5qYXZhIGIvdGVzdHMvc2lnbmF0dXJlL3NyYy9hbmRyb2lkL3NpZ25hdHVyZS9jdHMvTG9nSGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNkZTNlYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NpZ25hdHVyZS9zcmMvYW5kcm9pZC9zaWduYXR1cmUvY3RzL0xvZ0hlbHBlci5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLnNpZ25hdHVyZS5jdHM7CisKKy8qKgorICovCitwdWJsaWMgY2xhc3MgTG9nSGVscGVyIHsKKworICAgIHN0YXRpYyB2b2lkIGxvZ2UoU3RyaW5nIG1lc3NhZ2UsIEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKFN0cmluZy5mb3JtYXQoIiVzOiAlcyIsIG1lc3NhZ2UsIGV4Y2VwdGlvbikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3NpZ25hdHVyZS9zcmMvYW5kcm9pZC9zaWduYXR1cmUvY3RzL1JlZmxlY3Rpb25IZWxwZXIuamF2YSBiL3Rlc3RzL3NpZ25hdHVyZS9zcmMvYW5kcm9pZC9zaWduYXR1cmUvY3RzL1JlZmxlY3Rpb25IZWxwZXIuamF2YQppbmRleCA1NDY0MGEzLi43OTA2OTJkIDEwMDY0NAotLS0gYS90ZXN0cy9zaWduYXR1cmUvc3JjL2FuZHJvaWQvc2lnbmF0dXJlL2N0cy9SZWZsZWN0aW9uSGVscGVyLmphdmEKKysrIGIvdGVzdHMvc2lnbmF0dXJlL3NyYy9hbmRyb2lkL3NpZ25hdHVyZS9jdHMvUmVmbGVjdGlvbkhlbHBlci5qYXZhCkBAIC0xNSw4ICsxNSwxMSBAQAogICovCiBwYWNrYWdlIGFuZHJvaWQuc2lnbmF0dXJlLmN0czsKIAoraW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuR2VuZXJpY0FycmF5VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZW1iZXI7CiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlBhcmFtZXRlcml6ZWRUeXBlOwpAQCAtMjQsMTcgKzI3LDE1IEBACiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZVZhcmlhYmxlOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LldpbGRjYXJkVHlwZTsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIC8qKgogICogVXNlcyByZWZsZWN0aW9uIHRvIG9idGFpbiBydW50aW1lIHJlcHJlc2VudGF0aW9ucyBvZiBlbGVtZW50cyBpbiB0aGUgQVBJLgogICovCiBwdWJsaWMgY2xhc3MgUmVmbGVjdGlvbkhlbHBlciB7CiAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGxvZ2UoU3RyaW5nIG1lc3NhZ2UsIEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKFN0cmluZy5mb3JtYXQoIiVzOiAlcyIsIG1lc3NhZ2UsIGV4Y2VwdGlvbikpOwotICAgIH0KLQogICAgIC8qKgogICAgICAqIEZpbmRzIHRoZSByZWZsZWN0ZWQgY2xhc3MgZm9yIHRoZSBjbGFzcyB1bmRlciB0ZXN0LgogICAgICAqCkBAIC00MiwyNCArNDMsMzQgQEAKICAgICAgKiBAcmV0dXJuIHRoZSByZWZsZWN0ZWQgY2xhc3MsIG9yIG51bGwgaWYgbm90IGZvdW5kLgogICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gZmluZE1hdGNoaW5nQ2xhc3MoSkRpZmZDbGFzc0Rlc2NyaXB0aW9uIGNsYXNzRGVzY3JpcHRpb24pCisgICAgcHVibGljIHN0YXRpYyBDbGFzczw/PiBmaW5kTWF0Y2hpbmdDbGFzcyhKRGlmZkNsYXNzRGVzY3JpcHRpb24gY2xhc3NEZXNjcmlwdGlvbiwgQ2xhc3NQcm92aWRlciBjbGFzc1Byb3ZpZGVyKQogICAgICAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewogICAgICAgICAvLyBldmVuIGlmIHRoZXJlIGFyZSBubyAuIGluIHRoZSBzdHJpbmcsIHNwbGl0IHdpbGwgcmV0dXJuIGFuCiAgICAgICAgIC8vIGFycmF5IG9mIGxlbmd0aCAxCiAgICAgICAgIFN0cmluZyBzaG9ydENsYXNzTmFtZSA9IGNsYXNzRGVzY3JpcHRpb24uZ2V0U2hvcnRDbGFzc05hbWUoKTsKICAgICAgICAgU3RyaW5nW10gY2xhc3NOYW1lUGFydHMgPSBzaG9ydENsYXNzTmFtZS5zcGxpdCgiXFwuIik7CiAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IGNsYXNzRGVzY3JpcHRpb24uZ2V0UGFja2FnZU5hbWUoKTsKLSAgICAgICAgU3RyaW5nIGN1cnJlbnROYW1lID0gcGFja2FnZU5hbWUgKyAiLiIgKyBjbGFzc05hbWVQYXJ0c1swXTsKKyAgICAgICAgU3RyaW5nIG91dGVybW9zdENsYXNzTmFtZSA9IHBhY2thZ2VOYW1lICsgIi4iICsgY2xhc3NOYW1lUGFydHNbMF07CisgICAgICAgIGludCBmaXJzdElubmVyQ2xhc3NOYW1lSW5kZXggPSAwOwogCi0gICAgICAgIENsYXNzPD8+IGNseiA9IENsYXNzLmZvck5hbWUoCi0gICAgICAgICAgICAgICAgY3VycmVudE5hbWUsIGZhbHNlLCBSZWZsZWN0aW9uSGVscGVyLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOwotICAgICAgICBTdHJpbmcgYWJzb2x1dGVDbGFzc05hbWUgPSBjbGFzc0Rlc2NyaXB0aW9uLmdldEFic29sdXRlQ2xhc3NOYW1lKCk7CisgICAgICAgIHJldHVybiBzZWFyY2hGb3JDbGFzcyhjbGFzc1Byb3ZpZGVyLCBjbGFzc0Rlc2NyaXB0aW9uLmdldEFic29sdXRlQ2xhc3NOYW1lKCksCisgICAgICAgICAgICAgICAgb3V0ZXJtb3N0Q2xhc3NOYW1lLCBjbGFzc05hbWVQYXJ0cywKKyAgICAgICAgICAgICAgICBmaXJzdElubmVyQ2xhc3NOYW1lSW5kZXgpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIENsYXNzPD8+IHNlYXJjaEZvckNsYXNzKAorICAgICAgICAgICAgQ2xhc3NQcm92aWRlciBjbGFzc1Byb3ZpZGVyLAorICAgICAgICAgICAgU3RyaW5nIGFic29sdXRlQ2xhc3NOYW1lLAorICAgICAgICAgICAgU3RyaW5nIG91dGVybW9zdENsYXNzTmFtZSwgU3RyaW5nW10gY2xhc3NOYW1lUGFydHMsCisgICAgICAgICAgICBpbnQgb3V0ZXJDbGFzc05hbWVJbmRleCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworCisgICAgICAgIENsYXNzPD8+IGNseiA9IGNsYXNzUHJvdmlkZXIuZ2V0Q2xhc3Mob3V0ZXJtb3N0Q2xhc3NOYW1lKTsKICAgICAgICAgaWYgKGNsei5nZXRDYW5vbmljYWxOYW1lKCkuZXF1YWxzKGFic29sdXRlQ2xhc3NOYW1lKSkgewogICAgICAgICAgICAgcmV0dXJuIGNsejsKICAgICAgICAgfQogCiAgICAgICAgIC8vIFRoZW4gaXQgbXVzdCBiZSBhbiBpbm5lciBjbGFzcy4KLSAgICAgICAgZm9yIChpbnQgeCA9IDE7IHggPCBjbGFzc05hbWVQYXJ0cy5sZW5ndGg7IHgrKykgeworICAgICAgICBmb3IgKGludCB4ID0gb3V0ZXJDbGFzc05hbWVJbmRleCArIDE7IHggPCBjbGFzc05hbWVQYXJ0cy5sZW5ndGg7IHgrKykgewogICAgICAgICAgICAgY2x6ID0gZmluZElubmVyQ2xhc3NCeU5hbWUoY2x6LCBjbGFzc05hbWVQYXJ0c1t4XSk7CiAgICAgICAgICAgICBpZiAoY2x6ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKQEAgLTcxLDYgKzgyLDI3IEBACiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAorICAgIHN0YXRpYyBDbGFzczw/PiBmaW5kTWF0Y2hpbmdDbGFzcyhTdHJpbmcgYWJzb2x1dGVDbGFzc05hbWUsIENsYXNzUHJvdmlkZXIgY2xhc3NQcm92aWRlcikKKyAgICAgICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmdbXSBjbGFzc05hbWVQYXJ0cyA9IGFic29sdXRlQ2xhc3NOYW1lLnNwbGl0KCJcXC4iKTsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgU3RyaW5nIHNlcGFyYXRvciA9ICIiOworICAgICAgICBpbnQgc3RhcnQ7CisgICAgICAgIGZvciAoc3RhcnQgPSAwOyBzdGFydCA8IGNsYXNzTmFtZVBhcnRzLmxlbmd0aDsgc3RhcnQrKykgeworICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZVBhcnQgPSBjbGFzc05hbWVQYXJ0c1tzdGFydF07CisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChzZXBhcmF0b3IpLmFwcGVuZChjbGFzc05hbWVQYXJ0KTsKKyAgICAgICAgICAgIHNlcGFyYXRvciA9ICIuIjsKKyAgICAgICAgICAgIGlmIChDaGFyYWN0ZXIuaXNVcHBlckNhc2UoY2xhc3NOYW1lUGFydC5jaGFyQXQoMCkpKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIG91dGVybW9zdENsYXNzTmFtZSA9IGJ1aWxkZXIudG9TdHJpbmcoKTsKKworICAgICAgICByZXR1cm4gc2VhcmNoRm9yQ2xhc3MoY2xhc3NQcm92aWRlciwgYWJzb2x1dGVDbGFzc05hbWUsIG91dGVybW9zdENsYXNzTmFtZSwgY2xhc3NOYW1lUGFydHMsCisgICAgICAgICAgICAgICAgc3RhcnQpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIFNlYXJjaGVzIHRoZSBjbGFzcyBmb3IgdGhlIHNwZWNpZmllZCBpbm5lciBjbGFzcy4KICAgICAgKgpAQCAtMTU2LDcgKzE4OCw3IEBACiAgICAgICAgIC8vIENoZWNrIGZvciB2YXJhcmdzLiAgamRpZmYgcmVwb3J0cyB2YXJhcmdzIGFzIC4uLiwgd2hpbGUKICAgICAgICAgLy8gcmVmbGVjdGlvbiByZXBvcnRzIHRoZW0gYXMgW10KICAgICAgICAgaW50IGpkaWZmUGFyYW1FbmRPZmZzZXQgPSBqZGlmZlBhcmFtLmluZGV4T2YoIi4uLiIpOwotICAgICAgICBpbnQgcmVmbGVjdGlvblBhcmFtRW5kT2Zmc2V0ID0gcmVmbGVjdGlvblBhcmFtLmluZGV4T2YoIltdIik7CisgICAgICAgIGludCByZWZsZWN0aW9uUGFyYW1FbmRPZmZzZXQgPSByZWZsZWN0aW9uUGFyYW0gIT0gbnVsbCA/IHJlZmxlY3Rpb25QYXJhbS5pbmRleE9mKCJbXSIpIDogLTE7CiAgICAgICAgIGlmIChqZGlmZlBhcmFtRW5kT2Zmc2V0ICE9IC0xICYmIHJlZmxlY3Rpb25QYXJhbUVuZE9mZnNldCAhPSAtMSkgewogICAgICAgICAgICAgamRpZmZQYXJhbSA9IGpkaWZmUGFyYW0uc3Vic3RyaW5nKDAsIGpkaWZmUGFyYW1FbmRPZmZzZXQpOwogICAgICAgICAgICAgcmVmbGVjdGlvblBhcmFtID0gcmVmbGVjdGlvblBhcmFtLnN1YnN0cmluZygwLCByZWZsZWN0aW9uUGFyYW1FbmRPZmZzZXQpOwpAQCAtMzMwLDQgKzM2MiwxNDggQEAKICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJHb3QgYW4gdW5rbm93biBqYXZhLmxhbmcuVHlwZSIpOwogICAgICAgICB9CiAgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIENsYXNzIHJlcHJlc2VudGluZyBhbiBhbm5vdGF0aW9uIHR5cGUgb2YgdGhlIGdpdmVuIG5hbWUuCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIHN0YXRpYyBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gZ2V0QW5ub3RhdGlvbkNsYXNzKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDbGFzczw/PiBjbGF6eiA9IENsYXNzLmZvck5hbWUoCisgICAgICAgICAgICAgICAgICAgIG5hbWUsIGZhbHNlLCBSZWZsZWN0aW9uSGVscGVyLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOworICAgICAgICAgICAgaWYgKGNsYXp6LmlzQW5ub3RhdGlvbigpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4pIGNsYXp6OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGNvbnN0cnVjdG9ycyB3aGljaCBhcmUgYW5ub3RhdGVkIHdpdGggdGhlIGdpdmVuIGFubm90YXRpb24gY2xhc3MuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTZXQ8Q29uc3RydWN0b3I8Pz4+IGdldEFubm90YXRlZENvbnN0cnVjdG9ycyhDbGFzczw/PiBjbGF6eiwKKyAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBhbm5vdGF0aW9uKSB7CisgICAgICAgIFNldDxDb25zdHJ1Y3Rvcjw/Pj4gcmVzdWx0ID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICBpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKENvbnN0cnVjdG9yPD8+IGMgOiBjbGF6ei5nZXREZWNsYXJlZENvbnN0cnVjdG9ycygpKSB7CisgICAgICAgICAgICAgICAgaWYgKGMuaXNBbm5vdGF0aW9uUHJlc2VudChhbm5vdGF0aW9uKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKGIvNzE2MzA2OTUpOiBjdXJyZW50bHksIHNvbWUgQVBJIG1lbWJlcnMgYXJlIG5vdCBhbm5vdGF0ZWQsIGJlY2F1c2UKKyAgICAgICAgICAgICAgICAgICAgLy8gYSBtZW1iZXIgaXMgYXV0b21hdGljYWxseSBhZGRlZCB0byB0aGUgQVBJIHNldCBpZiBpdCBpcyBpbiBhIGNsYXNzIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgLy8gYW5ub3RhdGlvbiBhbmQgaXQgaXMgbm90IEBoaWRlLiA8bWVtYmVyPi5nZXREZWNsYXJpbmdDbGFzcygpLgorICAgICAgICAgICAgICAgICAgICAvLyBpc0Fubm90YXRpb25QcmVzZW50KGFubm90YXRpb25DbGFzcykgd29uJ3QgaGVscCBiZWNhdXNlIGl0IHdpbGwgdGhlbgorICAgICAgICAgICAgICAgICAgICAvLyBpbmNvcnJlY3RseSBpbmNsdWRlIG5vbi1BUEkgbWVtYmVycyB3aGljaCBhcmUgbWFya2VkIGFzIEBoaWRlOworICAgICAgICAgICAgICAgICAgICAvLyBAaGlkZSBpc24ndCB2aXNpYmxlIGF0IHJ1bnRpbWUuIFVudGlsIHRoZSBpc3N1ZSBpcyBmaXhlZCwgd2Ugc2hvdWxkCisgICAgICAgICAgICAgICAgICAgIC8vIG9taXQgdGhvc2UgYXV0b21hdGljYWxseSBhZGRlZCBBUEkgbWVtYmVycyBmcm9tIHRoZSB0ZXN0LgorICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKGMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBsaXN0IG9mIG1ldGhvZHMgd2hpY2ggYXJlIGFubm90YXRlZCB3aXRoIHRoZSBnaXZlbiBhbm5vdGF0aW9uIGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU2V0PE1ldGhvZD4gZ2V0QW5ub3RhdGVkTWV0aG9kcyhDbGFzczw/PiBjbGF6eiwKKyAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBhbm5vdGF0aW9uKSB7CisgICAgICAgIFNldDxNZXRob2Q+IHJlc3VsdCA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgaWYgKGFubm90YXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChNZXRob2QgbSA6IGNsYXp6LmdldERlY2xhcmVkTWV0aG9kcygpKSB7CisgICAgICAgICAgICAgICAgaWYgKG0uaXNBbm5vdGF0aW9uUHJlc2VudChhbm5vdGF0aW9uKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKGIvNzE2MzA2OTUpOiBzZWUgZ2V0QW5ub3RhdGVkQ29uc3RydWN0b3JzIGZvciBkZXRhaWxzCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQobSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGxpc3Qgb2YgZmllbGRzIHdoaWNoIGFyZSBhbm5vdGF0ZWQgd2l0aCB0aGUgZ2l2ZW4gYW5ub3RhdGlvbiBjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFNldDxGaWVsZD4gZ2V0QW5ub3RhdGVkRmllbGRzKENsYXNzPD8+IGNsYXp6LAorICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGFubm90YXRpb24pIHsKKyAgICAgICAgU2V0PEZpZWxkPiByZXN1bHQgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgICAgIGlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoRmllbGQgZiA6IGNsYXp6LmdldERlY2xhcmVkRmllbGRzKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZi5pc0Fubm90YXRpb25QcmVzZW50KGFubm90YXRpb24pKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8oYi83MTYzMDY5NSk6IHNlZSBnZXRBbm5vdGF0ZWRDb25zdHJ1Y3RvcnMgZm9yIGRldGFpbHMKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5Bbm5vdGF0ZWRDbGFzcyhNZW1iZXIgbSwKKyAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBhbm5vdGF0aW9uQ2xhc3MpIHsKKyAgICAgICAgQ2xhc3M8Pz4gY2xhenogPSBtLmdldERlY2xhcmluZ0NsYXNzKCk7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGlmIChjbGF6ei5pc0Fubm90YXRpb25QcmVzZW50KGFubm90YXRpb25DbGFzcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoKGNsYXp6ID0gY2xhenouZ2V0RGVjbGFyaW5nQ2xhc3MoKSkgIT0gbnVsbCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBbm5vdGF0ZWRPckluQW5ub3RhdGVkQ2xhc3MoRmllbGQgZmllbGQsCisgICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gYW5ub3RhdGlvbkNsYXNzKSB7CisgICAgICAgIGlmIChhbm5vdGF0aW9uQ2xhc3MgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZpZWxkLmlzQW5ub3RhdGlvblByZXNlbnQoYW5ub3RhdGlvbkNsYXNzKQorICAgICAgICAgICAgICAgIHx8IGlzSW5Bbm5vdGF0ZWRDbGFzcyhmaWVsZCwgYW5ub3RhdGlvbkNsYXNzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBbm5vdGF0ZWRPckluQW5ub3RhdGVkQ2xhc3MoQ29uc3RydWN0b3I8Pz4gY29uc3RydWN0b3IsCisgICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gYW5ub3RhdGlvbkNsYXNzKSB7CisgICAgICAgIGlmIChhbm5vdGF0aW9uQ2xhc3MgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yLmlzQW5ub3RhdGlvblByZXNlbnQoYW5ub3RhdGlvbkNsYXNzKQorICAgICAgICAgICAgICAgIHx8IGlzSW5Bbm5vdGF0ZWRDbGFzcyhjb25zdHJ1Y3RvciwgYW5ub3RhdGlvbkNsYXNzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBbm5vdGF0ZWRPckluQW5ub3RhdGVkQ2xhc3MoTWV0aG9kIG1ldGhvZCwKKyAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBhbm5vdGF0aW9uQ2xhc3MpIHsKKyAgICAgICAgaWYgKGFubm90YXRpb25DbGFzcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbWV0aG9kLmlzQW5ub3RhdGlvblByZXNlbnQoYW5ub3RhdGlvbkNsYXNzKQorICAgICAgICAgICAgICAgIHx8IGlzSW5Bbm5vdGF0ZWRDbGFzcyhtZXRob2QsIGFubm90YXRpb25DbGFzcyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzT3ZlcnJpZGluZ0Fubm90YXRlZE1ldGhvZChNZXRob2QgbWV0aG9kLAorICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGFubm90YXRpb25DbGFzcykgeworICAgICAgICBDbGFzczw/PiBjbGF6eiA9IG1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpOworICAgICAgICB3aGlsZSAoIShjbGF6eiA9IGNsYXp6LmdldFN1cGVyY2xhc3MoKSkuZXF1YWxzKE9iamVjdC5jbGFzcykpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgTWV0aG9kIG92ZXJyaWRkZW5NZXRob2Q7CisgICAgICAgICAgICAgICAgb3ZlcnJpZGRlbk1ldGhvZCA9IGNsYXp6LmdldERlY2xhcmVkTWV0aG9kKG1ldGhvZC5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKSk7CisgICAgICAgICAgICAgICAgaWYgKG92ZXJyaWRkZW5NZXRob2QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNBbm5vdGF0ZWRPckluQW5ub3RhdGVkQ2xhc3Mob3ZlcnJpZGRlbk1ldGhvZCwgYW5ub3RhdGlvbkNsYXNzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIHdoaWxlIHNlYXJjaGluZyBmb3Igb3ZlcnJpZGRlbiBtZXRob2QuICIgKyBtZXRob2QudG9TdHJpbmcoKSwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN0YXRpYyBDbGFzczw/PiBmaW5kUmVxdWlyZWRDbGFzcyhKRGlmZkNsYXNzRGVzY3JpcHRpb24gY2xhc3NEZXNjcmlwdGlvbiwKKyAgICAgICAgICAgIENsYXNzUHJvdmlkZXIgY2xhc3NQcm92aWRlcikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGZpbmRNYXRjaGluZ0NsYXNzKGNsYXNzRGVzY3JpcHRpb24sIGNsYXNzUHJvdmlkZXIpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZ0hlbHBlci5sb2dlKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGZvciAiICsgY2xhc3NEZXNjcmlwdGlvbi5nZXRBYnNvbHV0ZUNsYXNzTmFtZSgpLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc2lnbmF0dXJlL3Rlc3RzL3NyYy9hbmRyb2lkL3NpZ25hdHVyZS9jdHMvdGVzdHMvQWJzdHJhY3RBcGlDaGVja2VyVGVzdC5qYXZhIGIvdGVzdHMvc2lnbmF0dXJlL3Rlc3RzL3NyYy9hbmRyb2lkL3NpZ25hdHVyZS9jdHMvdGVzdHMvQWJzdHJhY3RBcGlDaGVja2VyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ZmVhODAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zaWduYXR1cmUvdGVzdHMvc3JjL2FuZHJvaWQvc2lnbmF0dXJlL2N0cy90ZXN0cy9BYnN0cmFjdEFwaUNoZWNrZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLnNpZ25hdHVyZS5jdHMudGVzdHM7CisKK2ltcG9ydCBhbmRyb2lkLnNpZ25hdHVyZS5jdHMuQWJzdHJhY3RBcGlDaGVja2VyOworaW1wb3J0IGFuZHJvaWQuc2lnbmF0dXJlLmN0cy5DbGFzc1Byb3ZpZGVyOworaW1wb3J0IGFuZHJvaWQuc2lnbmF0dXJlLmN0cy5FeGNsdWRpbmdDbGFzc1Byb3ZpZGVyOworaW1wb3J0IGFuZHJvaWQuc2lnbmF0dXJlLmN0cy5GYWlsdXJlVHlwZTsKK2ltcG9ydCBhbmRyb2lkLnNpZ25hdHVyZS5jdHMuSkRpZmZDbGFzc0Rlc2NyaXB0aW9uOworaW1wb3J0IGFuZHJvaWQuc2lnbmF0dXJlLmN0cy5SZXN1bHRPYnNlcnZlcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBCYXNlIGNsYXNzIGZvciB0ZXN0cyBvZiBpbXBsZW1lbnRhdGlvbnMgb2Yge0BsaW5rIEFic3RyYWN0QXBpQ2hlY2tlcn0uCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEFwaUNoZWNrZXJUZXN0PFQgZXh0ZW5kcyBBYnN0cmFjdEFwaUNoZWNrZXI+IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRSA9ICJWQUxVRSI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBDbGFzc1Byb3ZpZGVyIGNyZWF0ZUNsYXNzUHJvdmlkZXIoU3RyaW5nW10gZXhjbHVkZWRSdW50aW1lQ2xhc3NlcykgeworICAgICAgICBDbGFzc1Byb3ZpZGVyIHByb3ZpZGVyID0gbmV3IFRlc3RDbGFzc2VzUHJvdmlkZXIoKTsKKyAgICAgICAgaWYgKGV4Y2x1ZGVkUnVudGltZUNsYXNzZXMubGVuZ3RoICE9IDApIHsKKyAgICAgICAgICAgIHByb3ZpZGVyID0gbmV3IEV4Y2x1ZGluZ0NsYXNzUHJvdmlkZXIocHJvdmlkZXIsCisgICAgICAgICAgICAgICAgICAgIG5hbWUgLT4gQXJyYXlzLnN0cmVhbShleGNsdWRlZFJ1bnRpbWVDbGFzc2VzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hbnlNYXRjaChteW5hbWUgLT4gbXluYW1lLmVxdWFscyhuYW1lKSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwcm92aWRlcjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbiBjcmVhdGVDbGFzcyhTdHJpbmcgbmFtZSkgeworICAgICAgICBKRGlmZkNsYXNzRGVzY3JpcHRpb24gY2x6ID0gbmV3IEpEaWZmQ2xhc3NEZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICAiYW5kcm9pZC5zaWduYXR1cmUuY3RzLnRlc3RzLmRhdGEiLCBuYW1lKTsKKyAgICAgICAgY2x6LnNldFR5cGUoSkRpZmZDbGFzc0Rlc2NyaXB0aW9uLkpEaWZmVHlwZS5DTEFTUyk7CisgICAgICAgIGNsei5zZXRNb2RpZmllcihNb2RpZmllci5QVUJMSUMpOworICAgICAgICByZXR1cm4gY2x6OworICAgIH0KKworICAgIHZvaWQgY2hlY2tTaWduYXR1cmVDb21wbGlhbmNlKEpEaWZmQ2xhc3NEZXNjcmlwdGlvbiBjbGFzc0Rlc2NyaXB0aW9uLAorICAgICAgICAgICAgU3RyaW5nLi4uIGV4Y2x1ZGVkUnVudGltZUNsYXNzTmFtZXMpIHsKKyAgICAgICAgUmVzdWx0T2JzZXJ2ZXIgcmVzdWx0T2JzZXJ2ZXIgPSBuZXcgTm9GYWlsdXJlcygpOworICAgICAgICBjaGVja1NpZ25hdHVyZUNvbXBsaWFuY2UoY2xhc3NEZXNjcmlwdGlvbiwgcmVzdWx0T2JzZXJ2ZXIsCisgICAgICAgICAgICAgICAgZXhjbHVkZWRSdW50aW1lQ2xhc3NOYW1lcyk7CisgICAgfQorCisgICAgdm9pZCBjaGVja1NpZ25hdHVyZUNvbXBsaWFuY2UoSkRpZmZDbGFzc0Rlc2NyaXB0aW9uIGNsYXNzRGVzY3JpcHRpb24sCisgICAgICAgICAgICBSZXN1bHRPYnNlcnZlciByZXN1bHRPYnNlcnZlciwgU3RyaW5nLi4uIGV4Y2x1ZGVkUnVudGltZUNsYXNzZXMpIHsKKyAgICAgICAgcnVuV2l0aEFwaUNoZWNrZXIocmVzdWx0T2JzZXJ2ZXIsCisgICAgICAgICAgICAgICAgY2hlY2tlciAtPiBjaGVja2VyLmNoZWNrU2lnbmF0dXJlQ29tcGxpYW5jZShjbGFzc0Rlc2NyaXB0aW9uKSwKKyAgICAgICAgICAgICAgICBleGNsdWRlZFJ1bnRpbWVDbGFzc2VzKTsKKyAgICB9CisKKyAgICB2b2lkIHJ1bldpdGhBcGlDaGVja2VyKAorICAgICAgICAgICAgUmVzdWx0T2JzZXJ2ZXIgcmVzdWx0T2JzZXJ2ZXIsIENvbnN1bWVyPFQ+IGNvbnN1bWVyLCBTdHJpbmcuLi4gZXhjbHVkZWRSdW50aW1lQ2xhc3NlcykgeworICAgICAgICBDbGFzc1Byb3ZpZGVyIHByb3ZpZGVyID0gY3JlYXRlQ2xhc3NQcm92aWRlcihleGNsdWRlZFJ1bnRpbWVDbGFzc2VzKTsKKyAgICAgICAgVCBjaGVja2VyID0gY3JlYXRlQ2hlY2tlcihyZXN1bHRPYnNlcnZlciwgcHJvdmlkZXIpOworICAgICAgICBjb25zdW1lci5hY2NlcHQoY2hlY2tlcik7CisgICAgICAgIGNoZWNrZXIuY2hlY2tEZWZlcnJlZCgpOworICAgIH0KKworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBUIGNyZWF0ZUNoZWNrZXIoUmVzdWx0T2JzZXJ2ZXIgcmVzdWx0T2JzZXJ2ZXIsIENsYXNzUHJvdmlkZXIgcHJvdmlkZXIpOworCisgICAgcHJvdGVjdGVkIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbiBjcmVhdGVJbnRlcmZhY2UoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uIGNseiA9IG5ldyBKRGlmZkNsYXNzRGVzY3JpcHRpb24oCisgICAgICAgICAgICAgICAgImFuZHJvaWQuc2lnbmF0dXJlLmN0cy50ZXN0cy5kYXRhIiwgbmFtZSk7CisgICAgICAgIGNsei5zZXRUeXBlKEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZlR5cGUuSU5URVJGQUNFKTsKKyAgICAgICAgY2x6LnNldE1vZGlmaWVyKE1vZGlmaWVyLlBVQkxJQyB8IE1vZGlmaWVyLkFCU1RSQUNUKTsKKyAgICAgICAgcmV0dXJuIGNsejsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZk1ldGhvZCBtZXRob2QoCisgICAgICAgICAgICBTdHJpbmcgbmFtZSwgaW50IG1vZGlmaWVycywgU3RyaW5nIHJldHVyblR5cGUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBKRGlmZkNsYXNzRGVzY3JpcHRpb24uSkRpZmZNZXRob2QobmFtZSwgbW9kaWZpZXJzLCByZXR1cm5UeXBlKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIE5vRmFpbHVyZXMgaW1wbGVtZW50cyBSZXN1bHRPYnNlcnZlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG5vdGlmeUZhaWx1cmUoRmFpbHVyZVR5cGUgdHlwZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBlcnJtc2cpIHsKKyAgICAgICAgICAgIEFzc2VydC5mYWlsKCJTYXcgdW5leHBlY3RlZCB0ZXN0IGZhaWx1cmU6ICIgKyBuYW1lICsgIiBmYWlsdXJlIHR5cGU6ICIgKyB0eXBlCisgICAgICAgICAgICAgICAgICAgICsgIiBlcnJvciBtZXNzYWdlOiAiICsgZXJybXNnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgRXhwZWN0RmFpbHVyZSBpbXBsZW1lbnRzIFJlc3VsdE9ic2VydmVyIHsKKworICAgICAgICBwcml2YXRlIEZhaWx1cmVUeXBlIGV4cGVjdGVkVHlwZTsKKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gZmFpbHVyZVNlZW47CisKKyAgICAgICAgRXhwZWN0RmFpbHVyZShGYWlsdXJlVHlwZSBleHBlY3RlZFR5cGUpIHsKKyAgICAgICAgICAgIHRoaXMuZXhwZWN0ZWRUeXBlID0gZXhwZWN0ZWRUeXBlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG5vdGlmeUZhaWx1cmUoRmFpbHVyZVR5cGUgdHlwZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBlcnJNc2cpIHsKKyAgICAgICAgICAgIGlmICh0eXBlID09IGV4cGVjdGVkVHlwZSkgeworICAgICAgICAgICAgICAgIGlmIChmYWlsdXJlU2VlbikgeworICAgICAgICAgICAgICAgICAgICBBc3NlcnQuZmFpbCgiU2F3IHNlY29uZCB0ZXN0IGZhaWx1cmU6ICIgKyBuYW1lICsgIiBmYWlsdXJlIHR5cGU6ICIgKyB0eXBlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBXZSd2ZSBzZWVuIHRoZSBlcnJvciwgbWFyayBpdCBhbmQga2VlcCBnb2luZworICAgICAgICAgICAgICAgICAgICBmYWlsdXJlU2VlbiA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBc3NlcnQuZmFpbCgiU2F3IHVuZXhwZWN0ZWQgdGVzdCBmYWlsdXJlOiAiICsgbmFtZSArICIgZmFpbHVyZSB0eXBlOiAiICsgdHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHZhbGlkYXRlKCkgeworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoZmFpbHVyZVNlZW4pOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9zaWduYXR1cmUvdGVzdHMvc3JjL2FuZHJvaWQvc2lnbmF0dXJlL2N0cy90ZXN0cy9Bbm5vdGF0aW9uQ2hlY2tlclRlc3QuamF2YSBiL3Rlc3RzL3NpZ25hdHVyZS90ZXN0cy9zcmMvYW5kcm9pZC9zaWduYXR1cmUvY3RzL3Rlc3RzL0Fubm90YXRpb25DaGVja2VyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNGJlYmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zaWduYXR1cmUvdGVzdHMvc3JjL2FuZHJvaWQvc2lnbmF0dXJlL2N0cy90ZXN0cy9Bbm5vdGF0aW9uQ2hlY2tlclRlc3QuamF2YQpAQCAtMCwwICsxLDI5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zaWduYXR1cmUuY3RzLnRlc3RzOworCitpbXBvcnQgYW5kcm9pZC5zaWduYXR1cmUuY3RzLkFubm90YXRpb25DaGVja2VyOworaW1wb3J0IGFuZHJvaWQuc2lnbmF0dXJlLmN0cy5DbGFzc1Byb3ZpZGVyOworaW1wb3J0IGFuZHJvaWQuc2lnbmF0dXJlLmN0cy5GYWlsdXJlVHlwZTsKK2ltcG9ydCBhbmRyb2lkLnNpZ25hdHVyZS5jdHMuSkRpZmZDbGFzc0Rlc2NyaXB0aW9uOworaW1wb3J0IGFuZHJvaWQuc2lnbmF0dXJlLmN0cy5SZXN1bHRPYnNlcnZlcjsKK2ltcG9ydCBhbmRyb2lkLnNpZ25hdHVyZS5jdHMudGVzdHMuZGF0YS5BcGlBbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOworCisvKioKKyAqIFRlc3QgY2xhc3MgZm9yIHtAbGluayBhbmRyb2lkLnNpZ25hdHVyZS5jdHMuQW5ub3RhdGlvbkNoZWNrZXJ9LgorICovCitAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQorcHVibGljIGNsYXNzIEFubm90YXRpb25DaGVja2VyVGVzdCBleHRlbmRzIEFic3RyYWN0QXBpQ2hlY2tlclRlc3Q8QW5ub3RhdGlvbkNoZWNrZXI+IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uQ2hlY2tlciBjcmVhdGVDaGVja2VyKFJlc3VsdE9ic2VydmVyIHJlc3VsdE9ic2VydmVyLAorICAgICAgICAgICAgQ2xhc3NQcm92aWRlciBwcm92aWRlcikgeworICAgICAgICByZXR1cm4gbmV3IEFubm90YXRpb25DaGVja2VyKHJlc3VsdE9ic2VydmVyLCBwcm92aWRlciwgQXBpQW5ub3RhdGlvbi5jbGFzcy5nZXROYW1lKCkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkQ29uc3RydWN0b3IoSkRpZmZDbGFzc0Rlc2NyaXB0aW9uIGNseiwgU3RyaW5nLi4uIHBhcmFtVHlwZXMpIHsKKyAgICAgICAgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uLkpEaWZmQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSBuZXcgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uLkpEaWZmQ29uc3RydWN0b3IoCisgICAgICAgICAgICAgICAgY2x6LmdldFNob3J0Q2xhc3NOYW1lKCksIE1vZGlmaWVyLlBVQkxJQyk7CisgICAgICAgIGlmIChwYXJhbVR5cGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIHR5cGUgOiBwYXJhbVR5cGVzKSB7CisgICAgICAgICAgICAgICAgY29uc3RydWN0b3IuYWRkUGFyYW0odHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2x6LmFkZENvbnN0cnVjdG9yKGNvbnN0cnVjdG9yKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFB1YmxpY1ZvaWRNZXRob2QoSkRpZmZDbGFzc0Rlc2NyaXB0aW9uIGNseiwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgY2x6LmFkZE1ldGhvZChtZXRob2QobmFtZSwgTW9kaWZpZXIuUFVCTElDLCAidm9pZCIpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFB1YmxpY0Jvb2xlYW5GaWVsZChKRGlmZkNsYXNzRGVzY3JpcHRpb24gY2x6LCBTdHJpbmcgbmFtZSkgeworICAgICAgICBKRGlmZkNsYXNzRGVzY3JpcHRpb24uSkRpZmZGaWVsZCBmaWVsZCA9IG5ldyBKRGlmZkNsYXNzRGVzY3JpcHRpb24uSkRpZmZGaWVsZCgKKyAgICAgICAgICAgICAgICBuYW1lLCAiYm9vbGVhbiIsIE1vZGlmaWVyLlBVQkxJQywgVkFMVUUpOworICAgICAgICBjbHouYWRkRmllbGQoZmllbGQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERvY3VtZW50ZWQgQVBJIGFuZCBydW50aW1lIGNsYXNzZXMgYXJlIGV4YWN0bHkgbWF0Y2hlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhhY3RBcGlNYXRjaCgpIHsKKyAgICAgICAgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uIGNseiA9IGNyZWF0ZUNsYXNzKCJTeXN0ZW1BcGlDbGFzcyIpOworICAgICAgICBhZGRDb25zdHJ1Y3RvcihjbHopOworICAgICAgICBhZGRQdWJsaWNWb2lkTWV0aG9kKGNseiwgImFwaU1ldGhvZCIpOworICAgICAgICBhZGRQdWJsaWNCb29sZWFuRmllbGQoY2x6LCAiYXBpRmllbGQiKTsKKworICAgICAgICBjaGVja1NpZ25hdHVyZUNvbXBsaWFuY2UoY2x6LAorICAgICAgICAgICAgICAgICJhbmRyb2lkLnNpZ25hdHVyZS5jdHMudGVzdHMuZGF0YS5QdWJsaWNBcGlDbGFzcyIsCisgICAgICAgICAgICAgICAgImFuZHJvaWQuc2lnbmF0dXJlLmN0cy50ZXN0cy5kYXRhLkZvcmNpYmx5UHVibGljaXplZFByaXZhdGVDbGFzcyIpOworCisgICAgICAgIGNseiA9IGNyZWF0ZUNsYXNzKCJQdWJsaWNBcGlDbGFzcyIpOworICAgICAgICBhZGRDb25zdHJ1Y3RvcihjbHopOworICAgICAgICBhZGRQdWJsaWNWb2lkTWV0aG9kKGNseiwgImFwaU1ldGhvZCIpOworICAgICAgICBhZGRQdWJsaWNCb29sZWFuRmllbGQoY2x6LCAiYXBpRmllbGQiKTsKKworICAgICAgICBjaGVja1NpZ25hdHVyZUNvbXBsaWFuY2UoY2x6LAorICAgICAgICAgICAgICAgICJhbmRyb2lkLnNpZ25hdHVyZS5jdHMudGVzdHMuZGF0YS5TeXN0ZW1BcGlDbGFzcyIsCisgICAgICAgICAgICAgICAgImFuZHJvaWQuc2lnbmF0dXJlLmN0cy50ZXN0cy5kYXRhLkZvcmNpYmx5UHVibGljaXplZFByaXZhdGVDbGFzcyIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgY29uc3RydWN0b3IgaXMgZm91bmQgaW4gdGhlIHJ1bnRpbWUgY2xhc3MsIGJ1dCBub3QgaW4gdGhlIGRvY3VtZW50ZWQgQVBJCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdERldGVjdFVuYXV0aG9yaXplZENvbnN0cnVjdG9yQXBpKCkgeworICAgICAgICBFeHBlY3RGYWlsdXJlIG9ic2VydmVyID0gbmV3IEV4cGVjdEZhaWx1cmUoRmFpbHVyZVR5cGUuRVhUUkFfTUVUSE9EKTsKKworICAgICAgICBKRGlmZkNsYXNzRGVzY3JpcHRpb24gY2x6ID0gY3JlYXRlQ2xhc3MoIlN5c3RlbUFwaUNsYXNzIik7CisgICAgICAgIC8vIChvbWl0dGVkKSBhZGRDb25zdHJ1Y3RvcihjbHopOworICAgICAgICBhZGRQdWJsaWNWb2lkTWV0aG9kKGNseiwgImFwaU1ldGhvZCIpOworICAgICAgICBhZGRQdWJsaWNCb29sZWFuRmllbGQoY2x6LCAiYXBpRmllbGQiKTsKKworICAgICAgICBjaGVja1NpZ25hdHVyZUNvbXBsaWFuY2UoY2x6LCBvYnNlcnZlciwKKyAgICAgICAgICAgICAgICAiYW5kcm9pZC5zaWduYXR1cmUuY3RzLnRlc3RzLmRhdGEuUHVibGljQXBpQ2xhc3MiLAorICAgICAgICAgICAgICAgICJhbmRyb2lkLnNpZ25hdHVyZS5jdHMudGVzdHMuZGF0YS5Gb3JjaWJseVB1YmxpY2l6ZWRQcml2YXRlQ2xhc3MiKTsKKyAgICAgICAgb2JzZXJ2ZXIudmFsaWRhdGUoKTsKKworICAgICAgICBvYnNlcnZlciA9IG5ldyBFeHBlY3RGYWlsdXJlKEZhaWx1cmVUeXBlLkVYVFJBX01FVEhPRCk7CisKKyAgICAgICAgY2x6ID0gY3JlYXRlQ2xhc3MoIlB1YmxpY0FwaUNsYXNzIik7CisgICAgICAgIC8vIChvbWl0dGVkKSBhZGRDb25zdHJ1Y3RvcihjbHopOworICAgICAgICBhZGRQdWJsaWNWb2lkTWV0aG9kKGNseiwgImFwaU1ldGhvZCIpOworICAgICAgICBhZGRQdWJsaWNCb29sZWFuRmllbGQoY2x6LCAiYXBpRmllbGQiKTsKKworICAgICAgICBjaGVja1NpZ25hdHVyZUNvbXBsaWFuY2UoY2x6LCBvYnNlcnZlciwKKyAgICAgICAgICAgICAgICAiYW5kcm9pZC5zaWduYXR1cmUuY3RzLnRlc3RzLmRhdGEuU3lzdGVtQXBpQ2xhc3MiLAorICAgICAgICAgICAgICAgICJhbmRyb2lkLnNpZ25hdHVyZS5jdHMudGVzdHMuZGF0YS5Gb3JjaWJseVB1YmxpY2l6ZWRQcml2YXRlQ2xhc3MiKTsKKyAgICAgICAgb2JzZXJ2ZXIudmFsaWRhdGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIG1ldGhvZCBpcyBmb3VuZCBpbiB0aGUgcnVudGltZSBjbGFzcywgYnV0IG5vdCBpbiB0aGUgZG9jdW1lbnRlZCBBUEkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGV0ZWN0VW5hdXRob3JpemVkTWV0aG9kQXBpKCkgeworICAgICAgICBFeHBlY3RGYWlsdXJlIG9ic2VydmVyID0gbmV3IEV4cGVjdEZhaWx1cmUoRmFpbHVyZVR5cGUuRVhUUkFfTUVUSE9EKTsKKworICAgICAgICBKRGlmZkNsYXNzRGVzY3JpcHRpb24gY2x6ID0gY3JlYXRlQ2xhc3MoIlN5c3RlbUFwaUNsYXNzIik7CisgICAgICAgIGFkZENvbnN0cnVjdG9yKGNseik7CisgICAgICAgIC8vIChvbWl0dGVkKSBhZGRQdWJsaWNWb2lkTWV0aG9kKGNseiwgImFwaU1ldGhvZCIpOworICAgICAgICBhZGRQdWJsaWNCb29sZWFuRmllbGQoY2x6LCAiYXBpRmllbGQiKTsKKworICAgICAgICBjaGVja1NpZ25hdHVyZUNvbXBsaWFuY2UoY2x6LCBvYnNlcnZlciwKKyAgICAgICAgICAgICAgICAiYW5kcm9pZC5zaWduYXR1cmUuY3RzLnRlc3RzLmRhdGEuUHVibGljQXBpQ2xhc3MiLAorICAgICAgICAgICAgICAgICJhbmRyb2lkLnNpZ25hdHVyZS5jdHMudGVzdHMuZGF0YS5Gb3JjaWJseVB1YmxpY2l6ZWRQcml2YXRlQ2xhc3MiKTsKKyAgICAgICAgb2JzZXJ2ZXIudmFsaWRhdGUoKTsKKworICAgICAgICBvYnNlcnZlciA9IG5ldyBFeHBlY3RGYWlsdXJlKEZhaWx1cmVUeXBlLkVYVFJBX01FVEhPRCk7CisKKyAgICAgICAgY2x6ID0gY3JlYXRlQ2xhc3MoIlB1YmxpY0FwaUNsYXNzIik7CisgICAgICAgIGFkZENvbnN0cnVjdG9yKGNseik7CisgICAgICAgIC8vIChvbWl0dGVkKSBhZGRQdWJsaWNWb2lkTWV0aG9kKGNseiwgImFwaU1ldGhvZCIpOworICAgICAgICBhZGRQdWJsaWNCb29sZWFuRmllbGQoY2x6LCAiYXBpRmllbGQiKTsKKworICAgICAgICBjaGVja1NpZ25hdHVyZUNvbXBsaWFuY2UoY2x6LCBvYnNlcnZlciwKKyAgICAgICAgICAgICAgICAiYW5kcm9pZC5zaWduYXR1cmUuY3RzLnRlc3RzLmRhdGEuU3lzdGVtQXBpQ2xhc3MiLAorICAgICAgICAgICAgICAgICJhbmRyb2lkLnNpZ25hdHVyZS5jdHMudGVzdHMuZGF0YS5Gb3JjaWJseVB1YmxpY2l6ZWRQcml2YXRlQ2xhc3MiKTsKKyAgICAgICAgb2JzZXJ2ZXIudmFsaWRhdGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGZpZWxkIGlzIGZvdW5kIGluIHRoZSBydW50aW1lIGNsYXNzLCBidXQgbm90IGluIHRoZSBkb2N1bWVudGVkIEFQSQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3REZXRlY3RVbmF1dGhvcml6ZWRGaWVsZEFwaSgpIHsKKyAgICAgICAgRXhwZWN0RmFpbHVyZSBvYnNlcnZlciA9IG5ldyBFeHBlY3RGYWlsdXJlKEZhaWx1cmVUeXBlLkVYVFJBX0ZJRUxEKTsKKworICAgICAgICBKRGlmZkNsYXNzRGVzY3JpcHRpb24gY2x6ID0gY3JlYXRlQ2xhc3MoIlN5c3RlbUFwaUNsYXNzIik7CisgICAgICAgIGFkZENvbnN0cnVjdG9yKGNseik7CisgICAgICAgIGFkZFB1YmxpY1ZvaWRNZXRob2QoY2x6LCAiYXBpTWV0aG9kIik7CisgICAgICAgIC8vIChvbWl0dGVkKSBhZGRQdWJsaWNCb29sZWFuRmllbGQoY2x6LCAiYXBpRmllbGQiKTsKKworICAgICAgICBjaGVja1NpZ25hdHVyZUNvbXBsaWFuY2UoY2x6LCBvYnNlcnZlciwKKyAgICAgICAgICAgICAgICAiYW5kcm9pZC5zaWduYXR1cmUuY3RzLnRlc3RzLmRhdGEuUHVibGljQXBpQ2xhc3MiLAorICAgICAgICAgICAgICAgICJhbmRyb2lkLnNpZ25hdHVyZS5jdHMudGVzdHMuZGF0YS5Gb3JjaWJseVB1YmxpY2l6ZWRQcml2YXRlQ2xhc3MiKTsKKyAgICAgICAgb2JzZXJ2ZXIudmFsaWRhdGUoKTsKKworICAgICAgICBvYnNlcnZlciA9IG5ldyBFeHBlY3RGYWlsdXJlKEZhaWx1cmVUeXBlLkVYVFJBX0ZJRUxEKTsKKworICAgICAgICBjbHogPSBjcmVhdGVDbGFzcygiUHVibGljQXBpQ2xhc3MiKTsKKyAgICAgICAgYWRkQ29uc3RydWN0b3IoY2x6KTsKKyAgICAgICAgYWRkUHVibGljVm9pZE1ldGhvZChjbHosICJhcGlNZXRob2QiKTsKKyAgICAgICAgLy8gKG9taXR0ZWQpIGFkZFB1YmxpY0Jvb2xlYW5GaWVsZChjbHosICJhcGlGaWVsZCIpOworCisgICAgICAgIGNoZWNrU2lnbmF0dXJlQ29tcGxpYW5jZShjbHosIG9ic2VydmVyLAorICAgICAgICAgICAgICAgICJhbmRyb2lkLnNpZ25hdHVyZS5jdHMudGVzdHMuZGF0YS5TeXN0ZW1BcGlDbGFzcyIsCisgICAgICAgICAgICAgICAgImFuZHJvaWQuc2lnbmF0dXJlLmN0cy50ZXN0cy5kYXRhLkZvcmNpYmx5UHVibGljaXplZFByaXZhdGVDbGFzcyIpOworICAgICAgICBvYnNlcnZlci52YWxpZGF0ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgY2xhc3MgaXMgZm91bmQgaW4gdGhlIHJ1bnRpbWUgY2xhc3NlcywgYnV0IG5vdCBpbiB0aGUgZG9jdW1lbnRlZCBBUEkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGV0ZWN0VW5hdXRob3JpemVkQ2xhc3NBcGkoKSB7CisgICAgICAgIEV4cGVjdEZhaWx1cmUgb2JzZXJ2ZXIgPSBuZXcgRXhwZWN0RmFpbHVyZShGYWlsdXJlVHlwZS5FWFRSQV9DTEFTUyk7CisgICAgICAgIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbiBjbHogPSBjcmVhdGVDbGFzcygiU3lzdGVtQXBpQ2xhc3MiKTsKKyAgICAgICAgYWRkQ29uc3RydWN0b3IoY2x6KTsKKyAgICAgICAgYWRkUHVibGljVm9pZE1ldGhvZChjbHosICJhcGlNZXRob2QiKTsKKyAgICAgICAgYWRkUHVibGljQm9vbGVhbkZpZWxkKGNseiwgImFwaUZpZWxkIik7CisKKyAgICAgICAgY2hlY2tTaWduYXR1cmVDb21wbGlhbmNlKGNseiwgb2JzZXJ2ZXIsCisgICAgICAgICAgICAgICAgImFuZHJvaWQuc2lnbmF0dXJlLmN0cy50ZXN0cy5kYXRhLlB1YmxpY0FwaUNsYXNzIik7CisgICAgICAgIC8vIE5vdGUgdGhhdCBGb3JjaWJseVB1YmxpY2l6ZWRQcml2YXRlQ2xhc3MgaXMgbm93IGluY2x1ZGVkIGluIHRoZSBydW50aW1lIGNsYXNzZXMKKyAgICAgICAgb2JzZXJ2ZXIudmFsaWRhdGUoKTsKKworICAgICAgICBvYnNlcnZlciA9IG5ldyBFeHBlY3RGYWlsdXJlKEZhaWx1cmVUeXBlLkVYVFJBX0NMQVNTKTsKKworICAgICAgICBjbHogPSBjcmVhdGVDbGFzcygiUHVibGljQXBpQ2xhc3MiKTsKKyAgICAgICAgYWRkQ29uc3RydWN0b3IoY2x6KTsKKyAgICAgICAgYWRkUHVibGljVm9pZE1ldGhvZChjbHosICJhcGlNZXRob2QiKTsKKyAgICAgICAgYWRkUHVibGljQm9vbGVhbkZpZWxkKGNseiwgImFwaUZpZWxkIik7CisKKyAgICAgICAgY2hlY2tTaWduYXR1cmVDb21wbGlhbmNlKGNseiwgb2JzZXJ2ZXIsCisgICAgICAgICAgICAgICAgImFuZHJvaWQuc2lnbmF0dXJlLmN0cy50ZXN0cy5kYXRhLlN5c3RlbUFwaUNsYXNzIik7CisgICAgICAgIC8vIE5vdGUgdGhhdCBGb3JjaWJseVB1YmxpY2l6ZWRQcml2YXRlQ2xhc3MgaXMgbm93IGluY2x1ZGVkIGluIHRoZSBydW50aW1lIGNsYXNzZXMKKyAgICAgICAgb2JzZXJ2ZXIudmFsaWRhdGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIG1lbWJlciB3aGljaCBpcyBkZWNsYXJlZCBpbiBhbiBhbm5vdGF0ZWQgY2xhc3MgaXMgY3VycmVudGx5IHJlY29nbml6ZWQgYXMgYW4gQVBJLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RCNzE2MzA2OTUoKSB7CisgICAgICAgIC8vIFRPRE8oYi83MTYzMDY5NSk6IGN1cnJlbnRseSwgc29tZSBBUEkgbWVtYmVycyBhcmUgbm90IGFubm90YXRlZCwgYmVjYXVzZQorICAgICAgICAvLyBhIG1lbWJlciBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIHRoZSBBUEkgc2V0IGlmIGl0IGlzIGluIGEgY2xhc3Mgd2l0aAorICAgICAgICAvLyBhbm5vdGF0aW9uIGFuZCBpdCBpcyBub3QgQGhpZGUuIFRoaXMgc2hvdWxkIGJlIGZpeGVkLCBidXQgdW50aWwgdGhlbiwKKyAgICAgICAgLy8gQ1RTIHNob3VsZCByZXNwZWN0IHRoZSBleGlzdGluZyBiZWhhdmlvci4KKyAgICAgICAgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uIGNseiA9IGNyZWF0ZUNsYXNzKCJTeXN0ZW1BcGlDbGFzcyIpOworICAgICAgICBhZGRDb25zdHJ1Y3RvcihjbHopOworICAgICAgICBhZGRQdWJsaWNWb2lkTWV0aG9kKGNseiwgImFwaU1ldGhvZCIpOworICAgICAgICBhZGRQdWJsaWNCb29sZWFuRmllbGQoY2x6LCAiYXBpRmllbGQiKTsKKyAgICAgICAgYWRkQ29uc3RydWN0b3IoY2x6LCAiZmxvYXQiKTsgLy8gdGhpcyBpcyBub3QgYW5ub3RhdGVkCisKKyAgICAgICAgY2hlY2tTaWduYXR1cmVDb21wbGlhbmNlKGNseiwKKyAgICAgICAgICAgICAgICAiYW5kcm9pZC5zaWduYXR1cmUuY3RzLnRlc3RzLmRhdGEuUHVibGljQXBpQ2xhc3MiLAorICAgICAgICAgICAgICAgICJhbmRyb2lkLnNpZ25hdHVyZS5jdHMudGVzdHMuZGF0YS5Gb3JjaWJseVB1YmxpY2l6ZWRQcml2YXRlQ2xhc3MiKTsKKworICAgICAgICBjbHogPSBjcmVhdGVDbGFzcygiU3lzdGVtQXBpQ2xhc3MiKTsKKyAgICAgICAgYWRkQ29uc3RydWN0b3IoY2x6KTsKKyAgICAgICAgYWRkUHVibGljVm9pZE1ldGhvZChjbHosICJhcGlNZXRob2QiKTsKKyAgICAgICAgYWRkUHVibGljQm9vbGVhbkZpZWxkKGNseiwgImFwaUZpZWxkIik7CisgICAgICAgIGFkZFB1YmxpY1ZvaWRNZXRob2QoY2x6LCAidW5hbm5vdGF0ZWRBcGlNZXRob2QiKTsgLy8gdGhpcyBpcyBub3QgYW5ub3RhdGVkCisKKyAgICAgICAgY2hlY2tTaWduYXR1cmVDb21wbGlhbmNlKGNseiwKKyAgICAgICAgICAgICAgICAiYW5kcm9pZC5zaWduYXR1cmUuY3RzLnRlc3RzLmRhdGEuUHVibGljQXBpQ2xhc3MiLAorICAgICAgICAgICAgICAgICJhbmRyb2lkLnNpZ25hdHVyZS5jdHMudGVzdHMuZGF0YS5Gb3JjaWJseVB1YmxpY2l6ZWRQcml2YXRlQ2xhc3MiKTsKKworICAgICAgICBjbHogPSBjcmVhdGVDbGFzcygiU3lzdGVtQXBpQ2xhc3MiKTsKKyAgICAgICAgYWRkQ29uc3RydWN0b3IoY2x6KTsKKyAgICAgICAgYWRkUHVibGljVm9pZE1ldGhvZChjbHosICJhcGlNZXRob2QiKTsKKyAgICAgICAgYWRkUHVibGljQm9vbGVhbkZpZWxkKGNseiwgImFwaUZpZWxkIik7CisgICAgICAgIGFkZFB1YmxpY0Jvb2xlYW5GaWVsZChjbHosICJ1bmFubm90YXRlZEFwaUZpZWxkIik7IC8vIHRoaXMgaXMgbm90IGFubm90YXRlZAorCisgICAgICAgIGNoZWNrU2lnbmF0dXJlQ29tcGxpYW5jZShjbHosCisgICAgICAgICAgICAgICAgImFuZHJvaWQuc2lnbmF0dXJlLmN0cy50ZXN0cy5kYXRhLlB1YmxpY0FwaUNsYXNzIiwKKyAgICAgICAgICAgICAgICAiYW5kcm9pZC5zaWduYXR1cmUuY3RzLnRlc3RzLmRhdGEuRm9yY2libHlQdWJsaWNpemVkUHJpdmF0ZUNsYXNzIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQW4gQVBJIGlzIGRvY3VtZW50ZWQsIGJ1dCBpc24ndCBhbm5vdGF0ZWQgaW4gdGhlIHJ1bnRpbWUgY2xhc3MuIEJ1dCwgZHVlIHRvIGIvNzE2MzA2OTUsIHRoaXMKKyAgICAgKiB0ZXN0IGNhbiBvbmx5IGJlIGRvbmUgZm9yIHB1YmxpYyBBUEkgY2xhc3Nlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGV0ZWN0TWlzc2luZ0Fubm90YXRpb24oKSB7CisgICAgICAgIEV4cGVjdEZhaWx1cmUgb2JzZXJ2ZXIgPSBuZXcgRXhwZWN0RmFpbHVyZShGYWlsdXJlVHlwZS5NSVNTSU5HX0FOTk9UQVRJT04pOworCisgICAgICAgIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbiBjbHogPSBjcmVhdGVDbGFzcygiUHVibGljQXBpQ2xhc3MiKTsKKyAgICAgICAgYWRkQ29uc3RydWN0b3IoY2x6KTsKKyAgICAgICAgYWRkUHVibGljVm9pZE1ldGhvZChjbHosICJhcGlNZXRob2QiKTsKKyAgICAgICAgYWRkUHVibGljQm9vbGVhbkZpZWxkKGNseiwgImFwaUZpZWxkIik7CisgICAgICAgIGFkZENvbnN0cnVjdG9yKGNseiwgImludCIpOyAvLyB0aGlzIGlzIG5vdCBhbm5vdGF0ZWQKKworICAgICAgICBjaGVja1NpZ25hdHVyZUNvbXBsaWFuY2UoY2x6LCBvYnNlcnZlciwKKyAgICAgICAgICAgICAgICAiYW5kcm9pZC5zaWduYXR1cmUuY3RzLnRlc3RzLmRhdGEuU3lzdGVtQXBpQ2xhc3MiLAorICAgICAgICAgICAgICAgICJhbmRyb2lkLnNpZ25hdHVyZS5jdHMudGVzdHMuZGF0YS5Gb3JjaWJseVB1YmxpY2l6ZWRQcml2YXRlQ2xhc3MiKTsKKyAgICAgICAgb2JzZXJ2ZXIudmFsaWRhdGUoKTsKKworICAgICAgICBvYnNlcnZlciA9IG5ldyBFeHBlY3RGYWlsdXJlKEZhaWx1cmVUeXBlLk1JU1NJTkdfQU5OT1RBVElPTik7CisKKyAgICAgICAgY2x6ID0gY3JlYXRlQ2xhc3MoIlB1YmxpY0FwaUNsYXNzIik7CisgICAgICAgIGFkZENvbnN0cnVjdG9yKGNseik7CisgICAgICAgIGFkZFB1YmxpY1ZvaWRNZXRob2QoY2x6LCAiYXBpTWV0aG9kIik7CisgICAgICAgIGFkZFB1YmxpY0Jvb2xlYW5GaWVsZChjbHosICJhcGlGaWVsZCIpOworICAgICAgICBhZGRQdWJsaWNWb2lkTWV0aG9kKGNseiwgInByaXZhdGVNZXRob2QiKTsgLy8gdGhpcyBpcyBub3QgYW5ub3RhdGVkCisKKyAgICAgICAgY2hlY2tTaWduYXR1cmVDb21wbGlhbmNlKGNseiwgb2JzZXJ2ZXIsCisgICAgICAgICAgICAgICAgImFuZHJvaWQuc2lnbmF0dXJlLmN0cy50ZXN0cy5kYXRhLlN5c3RlbUFwaUNsYXNzIiwKKyAgICAgICAgICAgICAgICAiYW5kcm9pZC5zaWduYXR1cmUuY3RzLnRlc3RzLmRhdGEuRm9yY2libHlQdWJsaWNpemVkUHJpdmF0ZUNsYXNzIik7CisgICAgICAgIG9ic2VydmVyLnZhbGlkYXRlKCk7CisKKyAgICAgICAgb2JzZXJ2ZXIgPSBuZXcgRXhwZWN0RmFpbHVyZShGYWlsdXJlVHlwZS5NSVNTSU5HX0FOTk9UQVRJT04pOworCisgICAgICAgIGNseiA9IGNyZWF0ZUNsYXNzKCJQdWJsaWNBcGlDbGFzcyIpOworICAgICAgICBhZGRDb25zdHJ1Y3RvcihjbHopOworICAgICAgICBhZGRQdWJsaWNWb2lkTWV0aG9kKGNseiwgImFwaU1ldGhvZCIpOworICAgICAgICBhZGRQdWJsaWNCb29sZWFuRmllbGQoY2x6LCAiYXBpRmllbGQiKTsKKyAgICAgICAgYWRkUHVibGljQm9vbGVhbkZpZWxkKGNseiwgInByaXZhdGVGaWVsZCIpOyAvLyB0aGlzIGlzIG5vdCBhbm5vdGF0ZWQKKworICAgICAgICBjaGVja1NpZ25hdHVyZUNvbXBsaWFuY2UoY2x6LCBvYnNlcnZlciwKKyAgICAgICAgICAgICAgICAiYW5kcm9pZC5zaWduYXR1cmUuY3RzLnRlc3RzLmRhdGEuU3lzdGVtQXBpQ2xhc3MiLAorICAgICAgICAgICAgICAgICJhbmRyb2lkLnNpZ25hdHVyZS5jdHMudGVzdHMuZGF0YS5Gb3JjaWJseVB1YmxpY2l6ZWRQcml2YXRlQ2xhc3MiKTsKKyAgICAgICAgb2JzZXJ2ZXIudmFsaWRhdGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIDxjb2RlPkBoaWRlPC9jb2RlPiBtZXRob2Qgc2hvdWxkIGJlIHJlY29nbml6ZWQgYXMgQVBJIHRob3VnaCBpdCBpcyBub3QgYW5ub3RhdGVkLCBpZiBpdCBpcworICAgICAqIG92ZXJyaWRpbmcgYSBtZXRob2Qgd2hpY2ggaXMgYWxyZWFkeSBhbiBBUEkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdE92ZXJyaWRkZW5IaWRlbk1ldGhvZElzQXBpKCkgeworICAgICAgICBKRGlmZkNsYXNzRGVzY3JpcHRpb24gY2x6ID0gY3JlYXRlQ2xhc3MoIlB1YmxpY0FwaUNsYXNzIik7CisgICAgICAgIGFkZENvbnN0cnVjdG9yKGNseik7CisgICAgICAgIGFkZFB1YmxpY1ZvaWRNZXRob2QoY2x6LCAiYXBpTWV0aG9kIik7CisgICAgICAgIGFkZFB1YmxpY0Jvb2xlYW5GaWVsZChjbHosICJhcGlGaWVsZCIpOworICAgICAgICBhZGRQdWJsaWNWb2lkTWV0aG9kKGNseiwgImFuT3ZlcnJpZGRlbk1ldGhvZCIpOyAvLyBub3QgYW5ub3RhdGVkIGFuZCBAaGlkZSwgYnV0IGlzIEFQSQorCisgICAgICAgIGNoZWNrU2lnbmF0dXJlQ29tcGxpYW5jZShjbHosCisgICAgICAgICAgICAgICAgImFuZHJvaWQuc2lnbmF0dXJlLmN0cy50ZXN0cy5kYXRhLlN5c3RlbUFwaUNsYXNzIiwKKyAgICAgICAgICAgICAgICAiYW5kcm9pZC5zaWduYXR1cmUuY3RzLnRlc3RzLmRhdGEuRm9yY2libHlQdWJsaWNpemVkUHJpdmF0ZUNsYXNzIik7CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zaWduYXR1cmUvdGVzdHMvc3JjL2FuZHJvaWQvc2lnbmF0dXJlL2N0cy90ZXN0cy9BcGlDb21wbGlhbmNlQ2hlY2tlclRlc3QuamF2YSBiL3Rlc3RzL3NpZ25hdHVyZS90ZXN0cy9zcmMvYW5kcm9pZC9zaWduYXR1cmUvY3RzL3Rlc3RzL0FwaUNvbXBsaWFuY2VDaGVja2VyVGVzdC5qYXZhCmluZGV4IDcxZDJlMzcuLjc5NDIyOTggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3NpZ25hdHVyZS90ZXN0cy9zcmMvYW5kcm9pZC9zaWduYXR1cmUvY3RzL3Rlc3RzL0FwaUNvbXBsaWFuY2VDaGVja2VyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3NpZ25hdHVyZS90ZXN0cy9zcmMvYW5kcm9pZC9zaWduYXR1cmUvY3RzL3Rlc3RzL0FwaUNvbXBsaWFuY2VDaGVja2VyVGVzdC5qYXZhCkBAIC0xNyw4MiArMTcsMjkgQEAKIHBhY2thZ2UgYW5kcm9pZC5zaWduYXR1cmUuY3RzLnRlc3RzOwogCiBpbXBvcnQgYW5kcm9pZC5zaWduYXR1cmUuY3RzLkFwaUNvbXBsaWFuY2VDaGVja2VyOworaW1wb3J0IGFuZHJvaWQuc2lnbmF0dXJlLmN0cy5DbGFzc1Byb3ZpZGVyOwogaW1wb3J0IGFuZHJvaWQuc2lnbmF0dXJlLmN0cy5GYWlsdXJlVHlwZTsKIGltcG9ydCBhbmRyb2lkLnNpZ25hdHVyZS5jdHMuSkRpZmZDbGFzc0Rlc2NyaXB0aW9uOwogaW1wb3J0IGFuZHJvaWQuc2lnbmF0dXJlLmN0cy5SZXN1bHRPYnNlcnZlcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCitpbXBvcnQgYW5kcm9pZC5zaWduYXR1cmUuY3RzLnRlc3RzLmRhdGEuRXh0ZW5kZWROb3JtYWxJbnRlcmZhY2U7CitpbXBvcnQgYW5kcm9pZC5zaWduYXR1cmUuY3RzLnRlc3RzLmRhdGEuTm9ybWFsQ2xhc3M7CitpbXBvcnQgYW5kcm9pZC5zaWduYXR1cmUuY3RzLnRlc3RzLmRhdGEuTm9ybWFsSW50ZXJmYWNlOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwogCiAvKioKICAqIFRlc3QgY2xhc3MgZm9yIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi4KICAqLwotcHVibGljIGNsYXNzIEFwaUNvbXBsaWFuY2VDaGVja2VyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRSA9ICJWQUxVRSI7Ci0KLSAgICBwcml2YXRlIGNsYXNzIE5vRmFpbHVyZXMgaW1wbGVtZW50cyBSZXN1bHRPYnNlcnZlciB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBub3RpZnlGYWlsdXJlKEZhaWx1cmVUeXBlIHR5cGUsIFN0cmluZyBuYW1lLCBTdHJpbmcgZXJybXNnKSB7Ci0gICAgICAgICAgICBBc3NlcnQuZmFpbCgiU2F3IHVuZXhwZWN0ZWQgdGVzdCBmYWlsdXJlOiAiICsgbmFtZSArICIgZmFpbHVyZSB0eXBlOiAiICsgdHlwZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIEV4cGVjdEZhaWx1cmUgaW1wbGVtZW50cyBSZXN1bHRPYnNlcnZlciB7Ci0gICAgICAgIHByaXZhdGUgRmFpbHVyZVR5cGUgZXhwZWN0ZWRUeXBlOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gZmFpbHVyZVNlZW47Ci0KLSAgICAgICAgRXhwZWN0RmFpbHVyZShGYWlsdXJlVHlwZSBleHBlY3RlZFR5cGUpIHsKLSAgICAgICAgICAgIHRoaXMuZXhwZWN0ZWRUeXBlID0gZXhwZWN0ZWRUeXBlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG5vdGlmeUZhaWx1cmUoRmFpbHVyZVR5cGUgdHlwZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBlcnJNc2cpIHsKLSAgICAgICAgICAgIGlmICh0eXBlID09IGV4cGVjdGVkVHlwZSkgewotICAgICAgICAgICAgICAgIGlmIChmYWlsdXJlU2VlbikgewotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuZmFpbCgiU2F3IHNlY29uZCB0ZXN0IGZhaWx1cmU6ICIgKyBuYW1lICsgIiBmYWlsdXJlIHR5cGU6ICIgKyB0eXBlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBXZSd2ZSBzZWVuIHRoZSBlcnJvciwgbWFyayBpdCBhbmQga2VlcCBnb2luZwotICAgICAgICAgICAgICAgICAgICBmYWlsdXJlU2VlbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBc3NlcnQuZmFpbCgiU2F3IHVuZXhwZWN0ZWQgdGVzdCBmYWlsdXJlOiAiICsgbmFtZSArICIgZmFpbHVyZSB0eXBlOiAiICsgdHlwZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHZhbGlkYXRlKCkgewotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoZmFpbHVyZVNlZW4pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrU2lnbmF0dXJlQ29tcGxpYW5jZShKRGlmZkNsYXNzRGVzY3JpcHRpb24gY2xhc3NEZXNjcmlwdGlvbikgewotICAgICAgICBSZXN1bHRPYnNlcnZlciByZXN1bHRPYnNlcnZlciA9IG5ldyBOb0ZhaWx1cmVzKCk7Ci0gICAgICAgIGNoZWNrU2lnbmF0dXJlQ29tcGxpYW5jZShjbGFzc0Rlc2NyaXB0aW9uLCByZXN1bHRPYnNlcnZlcik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrU2lnbmF0dXJlQ29tcGxpYW5jZShKRGlmZkNsYXNzRGVzY3JpcHRpb24gY2xhc3NEZXNjcmlwdGlvbiwKLSAgICAgICAgICAgIFJlc3VsdE9ic2VydmVyIHJlc3VsdE9ic2VydmVyKSB7Ci0gICAgICAgIEFwaUNvbXBsaWFuY2VDaGVja2VyIGNvbXBsaWFuY2VDaGVja2VyID0gbmV3IEFwaUNvbXBsaWFuY2VDaGVja2VyKHJlc3VsdE9ic2VydmVyKTsKLSAgICAgICAgY29tcGxpYW5jZUNoZWNrZXIuY2hlY2tTaWduYXR1cmVDb21wbGlhbmNlKGNsYXNzRGVzY3JpcHRpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uIGZvciAiTm9ybWFsQ2xhc3MiLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbmV3IEpEaWZmQ2xhc3NEZXNjcmlwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uIGNyZWF0ZU5vcm1hbENsYXNzKCkgewotICAgICAgICBKRGlmZkNsYXNzRGVzY3JpcHRpb24gY2x6ID0gbmV3IEpEaWZmQ2xhc3NEZXNjcmlwdGlvbigKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5zaWduYXR1cmUuY3RzLnRlc3RzLmRhdGEiLCAiTm9ybWFsQ2xhc3MiKTsKLSAgICAgICAgY2x6LnNldFR5cGUoSkRpZmZDbGFzc0Rlc2NyaXB0aW9uLkpEaWZmVHlwZS5DTEFTUyk7Ci0gICAgICAgIGNsei5zZXRNb2RpZmllcihNb2RpZmllci5QVUJMSUMpOwotICAgICAgICByZXR1cm4gY2x6OworQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKK3B1YmxpYyBjbGFzcyBBcGlDb21wbGlhbmNlQ2hlY2tlclRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFwaUNoZWNrZXJUZXN0PEFwaUNvbXBsaWFuY2VDaGVja2VyPiB7CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwaUNvbXBsaWFuY2VDaGVja2VyIGNyZWF0ZUNoZWNrZXIoUmVzdWx0T2JzZXJ2ZXIgcmVzdWx0T2JzZXJ2ZXIsCisgICAgICAgICAgICBDbGFzc1Byb3ZpZGVyIHByb3ZpZGVyKSB7CisgICAgICAgIHJldHVybiBuZXcgQXBpQ29tcGxpYW5jZUNoZWNrZXIocmVzdWx0T2JzZXJ2ZXIsIHByb3ZpZGVyKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9ybWFsQ2xhc3NDb21wbGlhbmNlKCkgewotICAgICAgICBKRGlmZkNsYXNzRGVzY3JpcHRpb24gY2x6ID0gY3JlYXRlTm9ybWFsQ2xhc3MoKTsKKyAgICAgICAgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uIGNseiA9IGNyZWF0ZUNsYXNzKE5vcm1hbENsYXNzLmNsYXNzLmdldFNpbXBsZU5hbWUoKSk7CiAgICAgICAgIGNoZWNrU2lnbmF0dXJlQ29tcGxpYW5jZShjbHopOwogICAgICAgICBhc3NlcnRFcXVhbHMoY2x6LnRvU2lnbmF0dXJlU3RyaW5nKCksICJwdWJsaWMgY2xhc3MgTm9ybWFsQ2xhc3MiKTsKICAgICB9CkBAIC0xMDcsNyArNTQsNyBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVDb25zdHJ1Y3RvcigpIHsKLSAgICAgICAgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uIGNseiA9IGNyZWF0ZU5vcm1hbENsYXNzKCk7CisgICAgICAgIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbiBjbHogPSBjcmVhdGVDbGFzcyhOb3JtYWxDbGFzcy5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpOwogICAgICAgICBKRGlmZkNsYXNzRGVzY3JpcHRpb24uSkRpZmZDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9CiAgICAgICAgICAgICAgICAgbmV3IEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZkNvbnN0cnVjdG9yKCJOb3JtYWxDbGFzcyIsIE1vZGlmaWVyLlBVQkxJQyk7CiAgICAgICAgIGNsei5hZGRDb25zdHJ1Y3Rvcihjb25zdHJ1Y3Rvcik7CkBAIC0xMTYsNyArNjMsNyBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RPbmVBcmdDb25zdHJ1Y3RvcigpIHsKLSAgICAgICAgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uIGNseiA9IGNyZWF0ZU5vcm1hbENsYXNzKCk7CisgICAgICAgIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbiBjbHogPSBjcmVhdGVDbGFzcyhOb3JtYWxDbGFzcy5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpOwogICAgICAgICBKRGlmZkNsYXNzRGVzY3JpcHRpb24uSkRpZmZDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9CiAgICAgICAgICAgICAgICAgbmV3IEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZkNvbnN0cnVjdG9yKCJOb3JtYWxDbGFzcyIsIE1vZGlmaWVyLlBSSVZBVEUpOwogICAgICAgICBjb25zdHJ1Y3Rvci5hZGRQYXJhbSgiamF2YS5sYW5nLlN0cmluZyIpOwpAQCAtMTI2LDcgKzczLDcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JUaHJvd3NFeGNlcHRpb24oKSB7Ci0gICAgICAgIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbiBjbHogPSBjcmVhdGVOb3JtYWxDbGFzcygpOworICAgICAgICBKRGlmZkNsYXNzRGVzY3JpcHRpb24gY2x6ID0gY3JlYXRlQ2xhc3MoTm9ybWFsQ2xhc3MuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKTsKICAgICAgICAgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uLkpEaWZmQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPQogICAgICAgICAgICAgICAgIG5ldyBKRGlmZkNsYXNzRGVzY3JpcHRpb24uSkRpZmZDb25zdHJ1Y3RvcigiTm9ybWFsQ2xhc3MiLCBNb2RpZmllci5QUk9URUNURUQpOwogICAgICAgICBjb25zdHJ1Y3Rvci5hZGRQYXJhbSgiamF2YS5sYW5nLlN0cmluZyIpOwpAQCAtMTM2LDExICs4MywxMSBAQAogICAgICAgICBjaGVja1NpZ25hdHVyZUNvbXBsaWFuY2UoY2x6KTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbnN0cnVjdG9yLnRvU2lnbmF0dXJlU3RyaW5nKCksCiAgICAgICAgICAgICAgICAgInByb3RlY3RlZCBOb3JtYWxDbGFzcyhqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKSAiICsKLSAgICAgICAgICAgICAgICAidGhyb3dzIGFuZHJvaWQuc2lnbmF0dXJlLmN0cy50ZXN0cy5kYXRhLk5vcm1hbEV4Y2VwdGlvbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgInRocm93cyBhbmRyb2lkLnNpZ25hdHVyZS5jdHMudGVzdHMuZGF0YS5Ob3JtYWxFeGNlcHRpb24iKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0UGFja2FnZVByb3RlY3RlZENvbnN0cnVjdG9yKCkgewotICAgICAgICBKRGlmZkNsYXNzRGVzY3JpcHRpb24gY2x6ID0gY3JlYXRlTm9ybWFsQ2xhc3MoKTsKKyAgICAgICAgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uIGNseiA9IGNyZWF0ZUNsYXNzKE5vcm1hbENsYXNzLmNsYXNzLmdldFNpbXBsZU5hbWUoKSk7CiAgICAgICAgIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZkNvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0KICAgICAgICAgICAgICAgICBuZXcgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uLkpEaWZmQ29uc3RydWN0b3IoIk5vcm1hbENsYXNzIiwgMCk7CiAgICAgICAgIGNvbnN0cnVjdG9yLmFkZFBhcmFtKCJqYXZhLmxhbmcuU3RyaW5nIik7CkBAIC0xNTMsNTQgKzEwMCw1MiBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RTdGF0aWNNZXRob2QoKSB7Ci0gICAgICAgIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbiBjbHogPSBjcmVhdGVOb3JtYWxDbGFzcygpOwotICAgICAgICBKRGlmZkNsYXNzRGVzY3JpcHRpb24uSkRpZmZNZXRob2QgbWV0aG9kID0gbmV3IEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZk1ldGhvZCgKLSAgICAgICAgICAgICAgICAic3RhdGljTWV0aG9kIiwgTW9kaWZpZXIuU1RBVElDIHwgTW9kaWZpZXIuUFVCTElDLCAidm9pZCIpOworICAgICAgICBKRGlmZkNsYXNzRGVzY3JpcHRpb24gY2x6ID0gY3JlYXRlQ2xhc3MoTm9ybWFsQ2xhc3MuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKTsKKyAgICAgICAgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uLkpEaWZmTWV0aG9kIG1ldGhvZCA9IG1ldGhvZCgic3RhdGljTWV0aG9kIiwKKyAgICAgICAgICAgICAgICBNb2RpZmllci5TVEFUSUMgfCBNb2RpZmllci5QVUJMSUMsICJ2b2lkIik7CiAgICAgICAgIGNsei5hZGRNZXRob2QobWV0aG9kKTsKICAgICAgICAgY2hlY2tTaWduYXR1cmVDb21wbGlhbmNlKGNseik7CiAgICAgICAgIGFzc2VydEVxdWFscyhtZXRob2QudG9TaWduYXR1cmVTdHJpbmcoKSwgInB1YmxpYyBzdGF0aWMgdm9pZCBzdGF0aWNNZXRob2QoKSIpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RTeW5jTWV0aG9kKCkgewotICAgICAgICBKRGlmZkNsYXNzRGVzY3JpcHRpb24gY2x6ID0gY3JlYXRlTm9ybWFsQ2xhc3MoKTsKLSAgICAgICAgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uLkpEaWZmTWV0aG9kIG1ldGhvZCA9IG5ldyBKRGlmZkNsYXNzRGVzY3JpcHRpb24uSkRpZmZNZXRob2QoCi0gICAgICAgICAgICAgICAgInN5bmNNZXRob2QiLCBNb2RpZmllci5TWU5DSFJPTklaRUQgfCBNb2RpZmllci5QVUJMSUMsICJ2b2lkIik7CisgICAgICAgIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbiBjbHogPSBjcmVhdGVDbGFzcyhOb3JtYWxDbGFzcy5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpOworICAgICAgICBKRGlmZkNsYXNzRGVzY3JpcHRpb24uSkRpZmZNZXRob2QgbWV0aG9kID0gbWV0aG9kKCJzeW5jTWV0aG9kIiwKKyAgICAgICAgICAgICAgICBNb2RpZmllci5TWU5DSFJPTklaRUQgfCBNb2RpZmllci5QVUJMSUMsICJ2b2lkIik7CiAgICAgICAgIGNsei5hZGRNZXRob2QobWV0aG9kKTsKICAgICAgICAgY2hlY2tTaWduYXR1cmVDb21wbGlhbmNlKGNseik7CiAgICAgICAgIGFzc2VydEVxdWFscyhtZXRob2QudG9TaWduYXR1cmVTdHJpbmcoKSwgInB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzeW5jTWV0aG9kKCkiKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0UGFja2FnZVByb3RlY3RNZXRob2QoKSB7Ci0gICAgICAgIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbiBjbHogPSBjcmVhdGVOb3JtYWxDbGFzcygpOwotICAgICAgICBKRGlmZkNsYXNzRGVzY3JpcHRpb24uSkRpZmZNZXRob2QgbWV0aG9kID0gbmV3IEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZk1ldGhvZCgKLSAgICAgICAgICAgICAgICAicGFja2FnZVByb3RlY3RlZE1ldGhvZCIsIDAsICJib29sZWFuIik7CisgICAgICAgIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbiBjbHogPSBjcmVhdGVDbGFzcyhOb3JtYWxDbGFzcy5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpOworICAgICAgICBKRGlmZkNsYXNzRGVzY3JpcHRpb24uSkRpZmZNZXRob2QgbWV0aG9kID0gbWV0aG9kKCJwYWNrYWdlUHJvdGVjdGVkTWV0aG9kIiwgMCwgImJvb2xlYW4iKTsKICAgICAgICAgY2x6LmFkZE1ldGhvZChtZXRob2QpOwogICAgICAgICBjaGVja1NpZ25hdHVyZUNvbXBsaWFuY2UoY2x6KTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKG1ldGhvZC50b1NpZ25hdHVyZVN0cmluZygpLCAiYm9vbGVhbiBwYWNrYWdlUHJvdGVjdGVkTWV0aG9kKCkiKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHJpdmF0ZU1ldGhvZCgpIHsKLSAgICAgICAgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uIGNseiA9IGNyZWF0ZU5vcm1hbENsYXNzKCk7Ci0gICAgICAgIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZk1ldGhvZCBtZXRob2QgPSBuZXcgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uLkpEaWZmTWV0aG9kKAotICAgICAgICAgICAgICAgICJwcml2YXRlTWV0aG9kIiwgTW9kaWZpZXIuUFJJVkFURSwgInZvaWQiKTsKKyAgICAgICAgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uIGNseiA9IGNyZWF0ZUNsYXNzKE5vcm1hbENsYXNzLmNsYXNzLmdldFNpbXBsZU5hbWUoKSk7CisgICAgICAgIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZk1ldGhvZCBtZXRob2QgPSBtZXRob2QoInByaXZhdGVNZXRob2QiLCBNb2RpZmllci5QUklWQVRFLAorICAgICAgICAgICAgICAgICJ2b2lkIik7CiAgICAgICAgIGNsei5hZGRNZXRob2QobWV0aG9kKTsKICAgICAgICAgY2hlY2tTaWduYXR1cmVDb21wbGlhbmNlKGNseik7CiAgICAgICAgIGFzc2VydEVxdWFscyhtZXRob2QudG9TaWduYXR1cmVTdHJpbmcoKSwgInByaXZhdGUgdm9pZCBwcml2YXRlTWV0aG9kKCkiKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvdGVjdGVkTWV0aG9kKCkgewotICAgICAgICBKRGlmZkNsYXNzRGVzY3JpcHRpb24gY2x6ID0gY3JlYXRlTm9ybWFsQ2xhc3MoKTsKLSAgICAgICAgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uLkpEaWZmTWV0aG9kIG1ldGhvZCA9IG5ldyBKRGlmZkNsYXNzRGVzY3JpcHRpb24uSkRpZmZNZXRob2QoCi0gICAgICAgICAgICAgICAgInByb3RlY3RlZE1ldGhvZCIsIE1vZGlmaWVyLlBST1RFQ1RFRCwgImphdmEubGFuZy5TdHJpbmciKTsKKyAgICAgICAgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uIGNseiA9IGNyZWF0ZUNsYXNzKE5vcm1hbENsYXNzLmNsYXNzLmdldFNpbXBsZU5hbWUoKSk7CisgICAgICAgIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZk1ldGhvZCBtZXRob2QgPSBtZXRob2QoInByb3RlY3RlZE1ldGhvZCIsIE1vZGlmaWVyLlBST1RFQ1RFRCwKKyAgICAgICAgICAgICAgICAiamF2YS5sYW5nLlN0cmluZyIpOwogICAgICAgICBjbHouYWRkTWV0aG9kKG1ldGhvZCk7CiAgICAgICAgIGNoZWNrU2lnbmF0dXJlQ29tcGxpYW5jZShjbHopOwogICAgICAgICBhc3NlcnRFcXVhbHMobWV0aG9kLnRvU2lnbmF0dXJlU3RyaW5nKCksICJwcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBwcm90ZWN0ZWRNZXRob2QoKSIpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RUaHJvd3NNZXRob2QoKSB7Ci0gICAgICAgIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbiBjbHogPSBjcmVhdGVOb3JtYWxDbGFzcygpOwotICAgICAgICBKRGlmZkNsYXNzRGVzY3JpcHRpb24uSkRpZmZNZXRob2QgbWV0aG9kID0gbmV3IEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZk1ldGhvZCgKLSAgICAgICAgICAgICAgICAidGhyb3dzTWV0aG9kIiwgTW9kaWZpZXIuUFVCTElDLCAidm9pZCIpOworICAgICAgICBKRGlmZkNsYXNzRGVzY3JpcHRpb24gY2x6ID0gY3JlYXRlQ2xhc3MoTm9ybWFsQ2xhc3MuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKTsKKyAgICAgICAgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uLkpEaWZmTWV0aG9kIG1ldGhvZCA9IG1ldGhvZCgidGhyb3dzTWV0aG9kIiwgTW9kaWZpZXIuUFVCTElDLCAidm9pZCIpOwogICAgICAgICBtZXRob2QuYWRkRXhjZXB0aW9uKCJhbmRyb2lkLnNpZ25hdHVyZS5jdHMudGVzdHMuZGF0YS5Ob3JtYWxFeGNlcHRpb24iKTsKICAgICAgICAgY2x6LmFkZE1ldGhvZChtZXRob2QpOwogICAgICAgICBjaGVja1NpZ25hdHVyZUNvbXBsaWFuY2UoY2x6KTsKQEAgLTIwOSwxNiArMTU0LDE2IEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdE5hdGl2ZU1ldGhvZCgpIHsKLSAgICAgICAgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uIGNseiA9IGNyZWF0ZU5vcm1hbENsYXNzKCk7Ci0gICAgICAgIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZk1ldGhvZCBtZXRob2QgPSBuZXcgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uLkpEaWZmTWV0aG9kKAotICAgICAgICAgICAgICAgICJuYXRpdmVNZXRob2QiLCBNb2RpZmllci5QVUJMSUMgfCBNb2RpZmllci5OQVRJVkUsICJ2b2lkIik7CisgICAgICAgIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbiBjbHogPSBjcmVhdGVDbGFzcyhOb3JtYWxDbGFzcy5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpOworICAgICAgICBKRGlmZkNsYXNzRGVzY3JpcHRpb24uSkRpZmZNZXRob2QgbWV0aG9kID0gbWV0aG9kKCJuYXRpdmVNZXRob2QiLAorICAgICAgICAgICAgICAgIE1vZGlmaWVyLlBVQkxJQyB8IE1vZGlmaWVyLk5BVElWRSwgInZvaWQiKTsKICAgICAgICAgY2x6LmFkZE1ldGhvZChtZXRob2QpOwogICAgICAgICBjaGVja1NpZ25hdHVyZUNvbXBsaWFuY2UoY2x6KTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKG1ldGhvZC50b1NpZ25hdHVyZVN0cmluZygpLCAicHVibGljIG5hdGl2ZSB2b2lkIG5hdGl2ZU1ldGhvZCgpIik7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdEZpbmFsRmllbGQoKSB7Ci0gICAgICAgIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbiBjbHogPSBjcmVhdGVOb3JtYWxDbGFzcygpOworICAgICAgICBKRGlmZkNsYXNzRGVzY3JpcHRpb24gY2x6ID0gY3JlYXRlQ2xhc3MoTm9ybWFsQ2xhc3MuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKTsKICAgICAgICAgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uLkpEaWZmRmllbGQgZmllbGQgPSBuZXcgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uLkpEaWZmRmllbGQoCiAgICAgICAgICAgICAgICAgIkZJTkFMX0ZJRUxEIiwgImphdmEubGFuZy5TdHJpbmciLCBNb2RpZmllci5QVUJMSUMgfCBNb2RpZmllci5GSU5BTCwgVkFMVUUpOwogICAgICAgICBjbHouYWRkRmllbGQoZmllbGQpOwpAQCAtMjI3LDcgKzE3Miw3IEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdFN0YXRpY0ZpZWxkKCkgewotICAgICAgICBKRGlmZkNsYXNzRGVzY3JpcHRpb24gY2x6ID0gY3JlYXRlTm9ybWFsQ2xhc3MoKTsKKyAgICAgICAgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uIGNseiA9IGNyZWF0ZUNsYXNzKE5vcm1hbENsYXNzLmNsYXNzLmdldFNpbXBsZU5hbWUoKSk7CiAgICAgICAgIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZkZpZWxkIGZpZWxkID0gbmV3IEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZkZpZWxkKAogICAgICAgICAgICAgICAgICJTVEFUSUNfRklFTEQiLCAiamF2YS5sYW5nLlN0cmluZyIsIE1vZGlmaWVyLlBVQkxJQyB8IE1vZGlmaWVyLlNUQVRJQywgVkFMVUUpOwogICAgICAgICBjbHouYWRkRmllbGQoZmllbGQpOwpAQCAtMjM2LDcgKzE4MSw3IEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdFZvbGF0aWxlRmlsZWQoKSB7Ci0gICAgICAgIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbiBjbHogPSBjcmVhdGVOb3JtYWxDbGFzcygpOworICAgICAgICBKRGlmZkNsYXNzRGVzY3JpcHRpb24gY2x6ID0gY3JlYXRlQ2xhc3MoTm9ybWFsQ2xhc3MuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKTsKICAgICAgICAgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uLkpEaWZmRmllbGQgZmllbGQgPSBuZXcgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uLkpEaWZmRmllbGQoCiAgICAgICAgICAgICAgICAgIlZPTEFUSUxFX0ZJRUxEIiwgImphdmEubGFuZy5TdHJpbmciLCBNb2RpZmllci5QVUJMSUMgfCBNb2RpZmllci5WT0xBVElMRSwgVkFMVUUpOwogICAgICAgICBjbHouYWRkRmllbGQoZmllbGQpOwpAQCAtMjQ1LDcgKzE5MCw3IEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdFRyYW5zaWVudEZpZWxkKCkgewotICAgICAgICBKRGlmZkNsYXNzRGVzY3JpcHRpb24gY2x6ID0gY3JlYXRlTm9ybWFsQ2xhc3MoKTsKKyAgICAgICAgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uIGNseiA9IGNyZWF0ZUNsYXNzKE5vcm1hbENsYXNzLmNsYXNzLmdldFNpbXBsZU5hbWUoKSk7CiAgICAgICAgIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZkZpZWxkIGZpZWxkID0gbmV3IEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZkZpZWxkKAogICAgICAgICAgICAgICAgICJUUkFOU0lFTlRfRklFTEQiLCAiamF2YS5sYW5nLlN0cmluZyIsCiAgICAgICAgICAgICAgICAgTW9kaWZpZXIuUFVCTElDIHwgTW9kaWZpZXIuVFJBTlNJRU5ULCBWQUxVRSk7CkBAIC0yNTYsNyArMjAxLDcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0UGFja2FnZUZpZWxkKCkgewotICAgICAgICBKRGlmZkNsYXNzRGVzY3JpcHRpb24gY2x6ID0gY3JlYXRlTm9ybWFsQ2xhc3MoKTsKKyAgICAgICAgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uIGNseiA9IGNyZWF0ZUNsYXNzKE5vcm1hbENsYXNzLmNsYXNzLmdldFNpbXBsZU5hbWUoKSk7CiAgICAgICAgIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZkZpZWxkIGZpZWxkID0gbmV3IEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZkZpZWxkKAogICAgICAgICAgICAgICAgICJQQUNBS0dFX0ZJRUxEIiwgImphdmEubGFuZy5TdHJpbmciLCAwLCBWQUxVRSk7CiAgICAgICAgIGNsei5hZGRGaWVsZChmaWVsZCk7CkBAIC0yNjUsNyArMjEwLDcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHJpdmF0ZUZpZWxkKCkgewotICAgICAgICBKRGlmZkNsYXNzRGVzY3JpcHRpb24gY2x6ID0gY3JlYXRlTm9ybWFsQ2xhc3MoKTsKKyAgICAgICAgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uIGNseiA9IGNyZWF0ZUNsYXNzKE5vcm1hbENsYXNzLmNsYXNzLmdldFNpbXBsZU5hbWUoKSk7CiAgICAgICAgIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZkZpZWxkIGZpZWxkID0gbmV3IEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZkZpZWxkKAogICAgICAgICAgICAgICAgICJQUklWQVRFX0ZJRUxEIiwgImphdmEubGFuZy5TdHJpbmciLCBNb2RpZmllci5QUklWQVRFLCBWQUxVRSk7CiAgICAgICAgIGNsei5hZGRGaWVsZChmaWVsZCk7CkBAIC0yNzQsNyArMjE5LDcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvdGVjdGVkRmllbGQoKSB7Ci0gICAgICAgIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbiBjbHogPSBjcmVhdGVOb3JtYWxDbGFzcygpOworICAgICAgICBKRGlmZkNsYXNzRGVzY3JpcHRpb24gY2x6ID0gY3JlYXRlQ2xhc3MoTm9ybWFsQ2xhc3MuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKTsKICAgICAgICAgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uLkpEaWZmRmllbGQgZmllbGQgPSBuZXcgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uLkpEaWZmRmllbGQoCiAgICAgICAgICAgICAgICAgIlBST1RFQ1RFRF9GSUVMRCIsICJqYXZhLmxhbmcuU3RyaW5nIiwgTW9kaWZpZXIuUFJPVEVDVEVELCBWQUxVRSk7CiAgICAgICAgIGNsei5hZGRGaWVsZChmaWVsZCk7CkBAIC0yODMsMTAgKzIyOCwxMCBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RGaWVsZFZhbHVlKCkgewotICAgICAgICBKRGlmZkNsYXNzRGVzY3JpcHRpb24gY2x6ID0gY3JlYXRlTm9ybWFsQ2xhc3MoKTsKKyAgICAgICAgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uIGNseiA9IGNyZWF0ZUNsYXNzKE5vcm1hbENsYXNzLmNsYXNzLmdldFNpbXBsZU5hbWUoKSk7CiAgICAgICAgIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZkZpZWxkIGZpZWxkID0gbmV3IEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZkZpZWxkKAogICAgICAgICAgICAgICAgICJWQUxVRV9GSUVMRCIsICJqYXZhLmxhbmcuU3RyaW5nIiwKLSAgICAgICAgICAgICAgICBNb2RpZmllci5QVUJMSUMgfCBNb2RpZmllci5GSU5BTCB8IE1vZGlmaWVyLlNUQVRJQyAsICJcIlxcdTI3MDhcIiIpOworICAgICAgICAgICAgICAgIE1vZGlmaWVyLlBVQkxJQyB8IE1vZGlmaWVyLkZJTkFMIHwgTW9kaWZpZXIuU1RBVElDLCAiXCJcXHUyNzA4XCIiKTsKICAgICAgICAgY2x6LmFkZEZpZWxkKGZpZWxkKTsKICAgICAgICAgY2hlY2tTaWduYXR1cmVDb21wbGlhbmNlKGNseik7CiAgICAgICAgIGFzc2VydEVxdWFscyhmaWVsZC50b1NpZ25hdHVyZVN0cmluZygpLApAQCAtMjk1LDEwICsyNDAsMTAgQEAKIAogICAgIHB1YmxpYyB2b2lkIHRlc3RGaWVsZFZhbHVlQ2hhbmdlZCgpIHsKICAgICAgICAgRXhwZWN0RmFpbHVyZSBvYnNlcnZlciA9IG5ldyBFeHBlY3RGYWlsdXJlKEZhaWx1cmVUeXBlLk1JU01BVENIX0ZJRUxEKTsKLSAgICAgICAgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uIGNseiA9IGNyZWF0ZU5vcm1hbENsYXNzKCk7CisgICAgICAgIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbiBjbHogPSBjcmVhdGVDbGFzcyhOb3JtYWxDbGFzcy5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpOwogICAgICAgICBKRGlmZkNsYXNzRGVzY3JpcHRpb24uSkRpZmZGaWVsZCBmaWVsZCA9IG5ldyBKRGlmZkNsYXNzRGVzY3JpcHRpb24uSkRpZmZGaWVsZCgKICAgICAgICAgICAgICAgICAiVkFMVUVfRklFTEQiLCAiamF2YS5sYW5nLlN0cmluZyIsCi0gICAgICAgICAgICAgICAgTW9kaWZpZXIuUFVCTElDIHwgTW9kaWZpZXIuRklOQUwgfCBNb2RpZmllci5TVEFUSUMgLCAiXCImIzk5OTI7XCIiKTsKKyAgICAgICAgICAgICAgICBNb2RpZmllci5QVUJMSUMgfCBNb2RpZmllci5GSU5BTCB8IE1vZGlmaWVyLlNUQVRJQywgIlwiJiM5OTkyO1wiIik7CiAgICAgICAgIGNsei5hZGRGaWVsZChmaWVsZCk7CiAgICAgICAgIGNoZWNrU2lnbmF0dXJlQ29tcGxpYW5jZShjbHosIG9ic2VydmVyKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKGZpZWxkLnRvU2lnbmF0dXJlU3RyaW5nKCksCkBAIC0zMDcsMTAgKzI1Miw3IEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdElubmVyQ2xhc3MoKSB7Ci0gICAgICAgIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbiBjbHogPSBuZXcgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICJhbmRyb2lkLnNpZ25hdHVyZS5jdHMudGVzdHMuZGF0YSIsICJOb3JtYWxDbGFzcy5Jbm5lckNsYXNzIik7Ci0gICAgICAgIGNsei5zZXRUeXBlKEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZlR5cGUuQ0xBU1MpOwotICAgICAgICBjbHouc2V0TW9kaWZpZXIoTW9kaWZpZXIuUFVCTElDKTsKKyAgICAgICAgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uIGNseiA9IGNyZWF0ZUNsYXNzKCJOb3JtYWxDbGFzcy5Jbm5lckNsYXNzIik7CiAgICAgICAgIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZkZpZWxkIGZpZWxkID0gbmV3IEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZkZpZWxkKAogICAgICAgICAgICAgICAgICJpbm5lckNsYXNzRGF0YSIsICJqYXZhLmxhbmcuU3RyaW5nIiwgTW9kaWZpZXIuUFJJVkFURSwgVkFMVUUpOwogICAgICAgICBjbHouYWRkRmllbGQoZmllbGQpOwpAQCAtMzE5LDExICsyNjEsOCBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RJbm5lcklubmVyQ2xhc3MoKSB7Ci0gICAgICAgIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbiBjbHogPSBuZXcgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICJhbmRyb2lkLnNpZ25hdHVyZS5jdHMudGVzdHMuZGF0YSIsICJOb3JtYWxDbGFzcy5Jbm5lckNsYXNzLklubmVySW5uZXJDbGFzcyIKLSAgICAgICAgKTsKLSAgICAgICAgY2x6LnNldFR5cGUoSkRpZmZDbGFzc0Rlc2NyaXB0aW9uLkpEaWZmVHlwZS5DTEFTUyk7Ci0gICAgICAgIGNsei5zZXRNb2RpZmllcihNb2RpZmllci5QVUJMSUMpOworICAgICAgICBKRGlmZkNsYXNzRGVzY3JpcHRpb24gY2x6ID0gY3JlYXRlQ2xhc3MoCisgICAgICAgICAgICAgICAgIk5vcm1hbENsYXNzLklubmVyQ2xhc3MuSW5uZXJJbm5lckNsYXNzIik7CiAgICAgICAgIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZkZpZWxkIGZpZWxkID0gbmV3IEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZkZpZWxkKAogICAgICAgICAgICAgICAgICJpbm5lcklubmVyQ2xhc3NEYXRhIiwgImphdmEubGFuZy5TdHJpbmciLCBNb2RpZmllci5QUklWQVRFLCBWQUxVRSk7CiAgICAgICAgIGNsei5hZGRGaWVsZChmaWVsZCk7CkBAIC0zMzgsMjAgKzI3NywxNSBAQAogICAgICAgICBjbHouc2V0VHlwZShKRGlmZkNsYXNzRGVzY3JpcHRpb24uSkRpZmZUeXBlLklOVEVSRkFDRSk7CiAgICAgICAgIGNsei5zZXRNb2RpZmllcihNb2RpZmllci5QVUJMSUMgfCBNb2RpZmllci5TVEFUSUMgfCBNb2RpZmllci5BQlNUUkFDVCk7CiAgICAgICAgIGNsei5hZGRNZXRob2QoCi0gICAgICAgICAgICAgICAgbmV3IEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZk1ldGhvZCgiZG9Tb21ldGhpbmciLAotICAgICAgICAgICAgICAgICAgICBNb2RpZmllci5QVUJMSUMgfCBNb2RpZmllci5BQlNUUkFDVCwgInZvaWQiKSk7CisgICAgICAgICAgICAgICAgbWV0aG9kKCJkb1NvbWV0aGluZyIsIE1vZGlmaWVyLlBVQkxJQyB8IE1vZGlmaWVyLkFCU1RSQUNULCAidm9pZCIpKTsKICAgICAgICAgY2hlY2tTaWduYXR1cmVDb21wbGlhbmNlKGNseik7CiAgICAgICAgIGFzc2VydEVxdWFscyhjbHoudG9TaWduYXR1cmVTdHJpbmcoKSwgInB1YmxpYyBpbnRlcmZhY2UgTm9ybWFsQ2xhc3MuSW5uZXJJbnRlcmZhY2UiKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW50ZXJmYWNlKCkgewotICAgICAgICBKRGlmZkNsYXNzRGVzY3JpcHRpb24gY2x6ID0gbmV3IEpEaWZmQ2xhc3NEZXNjcmlwdGlvbigKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5zaWduYXR1cmUuY3RzLnRlc3RzLmRhdGEiLCAiTm9ybWFsSW50ZXJmYWNlIik7Ci0gICAgICAgIGNsei5zZXRUeXBlKEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZlR5cGUuSU5URVJGQUNFKTsKLSAgICAgICAgY2x6LnNldE1vZGlmaWVyKE1vZGlmaWVyLlBVQkxJQyB8IE1vZGlmaWVyLkFCU1RSQUNUKTsKKyAgICAgICAgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uIGNseiA9IGNyZWF0ZUludGVyZmFjZSgiTm9ybWFsSW50ZXJmYWNlIik7CiAgICAgICAgIGNsei5hZGRNZXRob2QoCi0gICAgICAgICAgICAgICAgbmV3IEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZk1ldGhvZCgiZG9Tb21ldGhpbmciLAotICAgICAgICAgICAgICAgICAgICBNb2RpZmllci5BQlNUUkFDVHwgTW9kaWZpZXIuUFVCTElDLCAidm9pZCIpKTsKKyAgICAgICAgICAgICAgICBtZXRob2QoImRvU29tZXRoaW5nIiwgTW9kaWZpZXIuQUJTVFJBQ1QgfCBNb2RpZmllci5QVUJMSUMsICJ2b2lkIikpOwogICAgICAgICBjaGVja1NpZ25hdHVyZUNvbXBsaWFuY2UoY2x6KTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKGNsei50b1NpZ25hdHVyZVN0cmluZygpLCAicHVibGljIGludGVyZmFjZSBOb3JtYWxJbnRlcmZhY2UiKTsKICAgICB9CkBAIC0zNzEsOSArMzA1LDggQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkaW5nU3luYygpIHsKICAgICAgICAgRXhwZWN0RmFpbHVyZSBvYnNlcnZlciA9IG5ldyBFeHBlY3RGYWlsdXJlKEZhaWx1cmVUeXBlLk1JU01BVENIX01FVEhPRCk7Ci0gICAgICAgIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbiBjbHogPSBjcmVhdGVOb3JtYWxDbGFzcygpOwotICAgICAgICBKRGlmZkNsYXNzRGVzY3JpcHRpb24uSkRpZmZNZXRob2QgbWV0aG9kID0gbmV3IEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZk1ldGhvZCgKLSAgICAgICAgICAgICAgICAic3luY01ldGhvZCIsIE1vZGlmaWVyLlBVQkxJQywgInZvaWQiKTsKKyAgICAgICAgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uIGNseiA9IGNyZWF0ZUNsYXNzKE5vcm1hbENsYXNzLmNsYXNzLmdldFNpbXBsZU5hbWUoKSk7CisgICAgICAgIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZk1ldGhvZCBtZXRob2QgPSBtZXRob2QoInN5bmNNZXRob2QiLCBNb2RpZmllci5QVUJMSUMsICJ2b2lkIik7CiAgICAgICAgIGNsei5hZGRNZXRob2QobWV0aG9kKTsKICAgICAgICAgY2hlY2tTaWduYXR1cmVDb21wbGlhbmNlKGNseiwgb2JzZXJ2ZXIpOwogICAgICAgICBvYnNlcnZlci52YWxpZGF0ZSgpOwpAQCAtMzg0LDkgKzMxNyw5IEBACiAgICAgICogYWN0dWFsbHkgaXMgbm90LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmluZ1N5bmMoKSB7Ci0gICAgICAgIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbiBjbHogPSBjcmVhdGVOb3JtYWxDbGFzcygpOwotICAgICAgICBKRGlmZkNsYXNzRGVzY3JpcHRpb24uSkRpZmZNZXRob2QgbWV0aG9kID0gbmV3IEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZk1ldGhvZCgKLSAgICAgICAgICAgICAgICAibm90U3luY01ldGhvZCIsIE1vZGlmaWVyLlNZTkNIUk9OSVpFRCB8IE1vZGlmaWVyLlBVQkxJQywgInZvaWQiKTsKKyAgICAgICAgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uIGNseiA9IGNyZWF0ZUNsYXNzKE5vcm1hbENsYXNzLmNsYXNzLmdldFNpbXBsZU5hbWUoKSk7CisgICAgICAgIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZk1ldGhvZCBtZXRob2QgPSBtZXRob2QoIm5vdFN5bmNNZXRob2QiLAorICAgICAgICAgICAgICAgIE1vZGlmaWVyLlNZTkNIUk9OSVpFRCB8IE1vZGlmaWVyLlBVQkxJQywgInZvaWQiKTsKICAgICAgICAgY2x6LmFkZE1ldGhvZChtZXRob2QpOwogICAgICAgICBjaGVja1NpZ25hdHVyZUNvbXBsaWFuY2UoY2x6KTsKICAgICB9CkBAIC0zOTUsOSArMzI4LDggQEAKICAgICAgKiBBUEkgc2F5cyBtZXRob2QgaXMgbm90IG5hdGl2ZSwgYnV0IGl0IGFjdHVhbGx5IGlzLiBodHRwOi8vYi8xODM5NTU4CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdGVzdEFkZGluZ05hdGl2ZSgpIHsKLSAgICAgICAgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uIGNseiA9IGNyZWF0ZU5vcm1hbENsYXNzKCk7Ci0gICAgICAgIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZk1ldGhvZCBtZXRob2QgPSBuZXcgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uLkpEaWZmTWV0aG9kKAotICAgICAgICAgICAgICAgICJuYXRpdmVNZXRob2QiLCBNb2RpZmllci5QVUJMSUMsICJ2b2lkIik7CisgICAgICAgIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbiBjbHogPSBjcmVhdGVDbGFzcyhOb3JtYWxDbGFzcy5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpOworICAgICAgICBKRGlmZkNsYXNzRGVzY3JpcHRpb24uSkRpZmZNZXRob2QgbWV0aG9kID0gbWV0aG9kKCJuYXRpdmVNZXRob2QiLCBNb2RpZmllci5QVUJMSUMsICJ2b2lkIik7CiAgICAgICAgIGNsei5hZGRNZXRob2QobWV0aG9kKTsKICAgICAgICAgY2hlY2tTaWduYXR1cmVDb21wbGlhbmNlKGNseik7CiAgICAgfQpAQCAtNDA2LDkgKzMzOCw5IEBACiAgICAgICogQVBJIHNheXMgbWV0aG9kIGlzIG5hdGl2ZSwgYnV0IGFjdHVhbGx5IGlzbid0LiBodHRwOi8vYi8xODM5NTU4CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdGVzdFJlbW92aW5nTmF0aXZlKCkgewotICAgICAgICBKRGlmZkNsYXNzRGVzY3JpcHRpb24gY2x6ID0gY3JlYXRlTm9ybWFsQ2xhc3MoKTsKLSAgICAgICAgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uLkpEaWZmTWV0aG9kIG1ldGhvZCA9IG5ldyBKRGlmZkNsYXNzRGVzY3JpcHRpb24uSkRpZmZNZXRob2QoCi0gICAgICAgICAgICAgICAgIm5vdE5hdGl2ZU1ldGhvZCIsIE1vZGlmaWVyLk5BVElWRSB8IE1vZGlmaWVyLlBVQkxJQywgInZvaWQiKTsKKyAgICAgICAgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uIGNseiA9IGNyZWF0ZUNsYXNzKE5vcm1hbENsYXNzLmNsYXNzLmdldFNpbXBsZU5hbWUoKSk7CisgICAgICAgIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZk1ldGhvZCBtZXRob2QgPSBtZXRob2QoIm5vdE5hdGl2ZU1ldGhvZCIsCisgICAgICAgICAgICAgICAgTW9kaWZpZXIuTkFUSVZFIHwgTW9kaWZpZXIuUFVCTElDLCAidm9pZCIpOwogICAgICAgICBjbHouYWRkTWV0aG9kKG1ldGhvZCk7CiAgICAgICAgIGNoZWNrU2lnbmF0dXJlQ29tcGxpYW5jZShjbHopOwogICAgIH0KQEAgLTQzOCwxOCArMzcwLDE1IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdGVzdEFkZGluZ0Fic3RyYWN0VG9BQ2xhc3MoKSB7CiAgICAgICAgIEV4cGVjdEZhaWx1cmUgb2JzZXJ2ZXIgPSBuZXcgRXhwZWN0RmFpbHVyZShGYWlsdXJlVHlwZS5NSVNNQVRDSF9DTEFTUyk7Ci0gICAgICAgIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbiBjbHogPSBuZXcgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICJhbmRyb2lkLnNpZ25hdHVyZS5jdHMudGVzdHMuZGF0YSIsICJBYnN0cmFjdENsYXNzIik7Ci0gICAgICAgIGNsei5zZXRUeXBlKEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZlR5cGUuQ0xBU1MpOwotICAgICAgICBjbHouc2V0TW9kaWZpZXIoTW9kaWZpZXIuUFVCTElDKTsKKyAgICAgICAgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uIGNseiA9IGNyZWF0ZUNsYXNzKCJBYnN0cmFjdENsYXNzIik7CiAgICAgICAgIGNoZWNrU2lnbmF0dXJlQ29tcGxpYW5jZShjbHosIG9ic2VydmVyKTsKICAgICAgICAgb2JzZXJ2ZXIudmFsaWRhdGUoKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0RmluYWxNZXRob2QoKSB7Ci0gICAgICAgIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbiBjbHogPSBjcmVhdGVOb3JtYWxDbGFzcygpOwotICAgICAgICBKRGlmZkNsYXNzRGVzY3JpcHRpb24uSkRpZmZNZXRob2QgbWV0aG9kID0gbmV3IEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZk1ldGhvZCgKLSAgICAgICAgICAgICAgICAiZmluYWxNZXRob2QiLCBNb2RpZmllci5QVUJMSUMgfCBNb2RpZmllci5GSU5BTCwgInZvaWQiKTsKKyAgICAgICAgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uIGNseiA9IGNyZWF0ZUNsYXNzKE5vcm1hbENsYXNzLmNsYXNzLmdldFNpbXBsZU5hbWUoKSk7CisgICAgICAgIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZk1ldGhvZCBtZXRob2QgPSBtZXRob2QoImZpbmFsTWV0aG9kIiwKKyAgICAgICAgICAgICAgICBNb2RpZmllci5QVUJMSUMgfCBNb2RpZmllci5GSU5BTCwgInZvaWQiKTsKICAgICAgICAgY2x6LmFkZE1ldGhvZChtZXRob2QpOwogICAgICAgICBjaGVja1NpZ25hdHVyZUNvbXBsaWFuY2UoY2x6KTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKG1ldGhvZC50b1NpZ25hdHVyZVN0cmluZygpLCAicHVibGljIGZpbmFsIHZvaWQgZmluYWxNZXRob2QoKSIpOwpAQCAtNDY0LDggKzM5Myw3IEBACiAgICAgICAgICAgICAgICAgImFuZHJvaWQuc2lnbmF0dXJlLmN0cy50ZXN0cy5kYXRhIiwgIkZpbmFsQ2xhc3MiKTsKICAgICAgICAgY2x6LnNldFR5cGUoSkRpZmZDbGFzc0Rlc2NyaXB0aW9uLkpEaWZmVHlwZS5DTEFTUyk7CiAgICAgICAgIGNsei5zZXRNb2RpZmllcihNb2RpZmllci5QVUJMSUMgfCBNb2RpZmllci5GSU5BTCk7Ci0gICAgICAgIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZk1ldGhvZCBtZXRob2QgPSBuZXcgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uLkpEaWZmTWV0aG9kKAotICAgICAgICAgICAgICAgICJmaW5hbE1ldGhvZCIsIE1vZGlmaWVyLlBVQkxJQywgInZvaWQiKTsKKyAgICAgICAgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uLkpEaWZmTWV0aG9kIG1ldGhvZCA9IG1ldGhvZCgiZmluYWxNZXRob2QiLCBNb2RpZmllci5QVUJMSUMsICJ2b2lkIik7CiAgICAgICAgIGNsei5hZGRNZXRob2QobWV0aG9kKTsKICAgICAgICAgY2hlY2tTaWduYXR1cmVDb21wbGlhbmNlKGNseik7CiAgICAgfQpAQCAtNDc5LDggKzQwNyw4IEBACiAgICAgICAgICAgICAgICAgImFuZHJvaWQuc2lnbmF0dXJlLmN0cy50ZXN0cy5kYXRhIiwgIkZpbmFsQ2xhc3MiKTsKICAgICAgICAgY2x6LnNldFR5cGUoSkRpZmZDbGFzc0Rlc2NyaXB0aW9uLkpEaWZmVHlwZS5DTEFTUyk7CiAgICAgICAgIGNsei5zZXRNb2RpZmllcihNb2RpZmllci5QVUJMSUMgfCBNb2RpZmllci5GSU5BTCk7Ci0gICAgICAgIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZk1ldGhvZCBtZXRob2QgPSBuZXcgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uLkpEaWZmTWV0aG9kKAotICAgICAgICAgICAgICAgICJub25GaW5hbE1ldGhvZCIsIE1vZGlmaWVyLlBVQkxJQyB8IE1vZGlmaWVyLkZJTkFMLCAidm9pZCIpOworICAgICAgICBKRGlmZkNsYXNzRGVzY3JpcHRpb24uSkRpZmZNZXRob2QgbWV0aG9kID0gbWV0aG9kKCJub25GaW5hbE1ldGhvZCIsCisgICAgICAgICAgICAgICAgTW9kaWZpZXIuUFVCTElDIHwgTW9kaWZpZXIuRklOQUwsICJ2b2lkIik7CiAgICAgICAgIGNsei5hZGRNZXRob2QobWV0aG9kKTsKICAgICAgICAgY2hlY2tTaWduYXR1cmVDb21wbGlhbmNlKGNseik7CiAgICAgfQpAQCAtNDkxLDE0ICs0MTksMjUgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkaW5nRmluYWxUb0FNZXRob2RJbkFOb25GaW5hbENsYXNzKCkgewogICAgICAgICBFeHBlY3RGYWlsdXJlIG9ic2VydmVyID0gbmV3IEV4cGVjdEZhaWx1cmUoRmFpbHVyZVR5cGUuTUlTTUFUQ0hfTUVUSE9EKTsKLSAgICAgICAgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uIGNseiA9IG5ldyBKRGlmZkNsYXNzRGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuc2lnbmF0dXJlLmN0cy50ZXN0cy5kYXRhIiwgIk5vcm1hbENsYXNzIik7Ci0gICAgICAgIGNsei5zZXRUeXBlKEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZlR5cGUuQ0xBU1MpOwotICAgICAgICBjbHouc2V0TW9kaWZpZXIoTW9kaWZpZXIuUFVCTElDKTsKLSAgICAgICAgSkRpZmZDbGFzc0Rlc2NyaXB0aW9uLkpEaWZmTWV0aG9kIG1ldGhvZCA9IG5ldyBKRGlmZkNsYXNzRGVzY3JpcHRpb24uSkRpZmZNZXRob2QoCi0gICAgICAgICAgICAgICAgImZpbmFsTWV0aG9kIiwgTW9kaWZpZXIuUFVCTElDLCAidm9pZCIpOworICAgICAgICBKRGlmZkNsYXNzRGVzY3JpcHRpb24gY2x6ID0gY3JlYXRlQ2xhc3MoIk5vcm1hbENsYXNzIik7CisgICAgICAgIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbi5KRGlmZk1ldGhvZCBtZXRob2QgPSBtZXRob2QoImZpbmFsTWV0aG9kIiwgTW9kaWZpZXIuUFVCTElDLCAidm9pZCIpOwogICAgICAgICBjbHouYWRkTWV0aG9kKG1ldGhvZCk7CiAgICAgICAgIGNoZWNrU2lnbmF0dXJlQ29tcGxpYW5jZShjbHosIG9ic2VydmVyKTsKICAgICAgICAgb2JzZXJ2ZXIudmFsaWRhdGUoKTsKICAgICB9Ci19CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXh0ZW5kZWROb3JtYWxJbnRlcmZhY2UoKSB7CisgICAgICAgIE5vRmFpbHVyZXMgb2JzZXJ2ZXIgPSBuZXcgTm9GYWlsdXJlcygpOworICAgICAgICBydW5XaXRoQXBpQ2hlY2tlcihvYnNlcnZlciwgY2hlY2tlciAtPiB7CisgICAgICAgICAgICBKRGlmZkNsYXNzRGVzY3JpcHRpb24gaWZhY2UgPSBjcmVhdGVJbnRlcmZhY2UoTm9ybWFsSW50ZXJmYWNlLmNsYXNzLmdldFNpbXBsZU5hbWUoKSk7CisgICAgICAgICAgICBpZmFjZS5hZGRNZXRob2QobWV0aG9kKCJkb1NvbWV0aGluZyIsIE1vZGlmaWVyLlBVQkxJQywgInZvaWQiKSk7CisgICAgICAgICAgICBjaGVja2VyLmFkZEJhc2VDbGFzcyhpZmFjZSk7CisKKyAgICAgICAgICAgIEpEaWZmQ2xhc3NEZXNjcmlwdGlvbiBjbHogPQorICAgICAgICAgICAgICAgICAgICBjcmVhdGVJbnRlcmZhY2UoRXh0ZW5kZWROb3JtYWxJbnRlcmZhY2UuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKTsKKyAgICAgICAgICAgIGNsei5hZGRNZXRob2QobWV0aG9kKCJkb1NvbWV0aGluZ0Vsc2UiLCBNb2RpZmllci5QVUJMSUMgfCBNb2RpZmllci5BQlNUUkFDVCwgInZvaWQiKSk7CisgICAgICAgICAgICBjbHouYWRkSW1wbEludGVyZmFjZShpZmFjZS5nZXRBYnNvbHV0ZUNsYXNzTmFtZSgpKTsKKyAgICAgICAgICAgIGNoZWNrZXIuY2hlY2tTaWduYXR1cmVDb21wbGlhbmNlKGNseik7CisgICAgICAgIH0pOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9zaWduYXR1cmUvdGVzdHMvc3JjL2FuZHJvaWQvc2lnbmF0dXJlL2N0cy90ZXN0cy9UZXN0Q2xhc3Nlc1Byb3ZpZGVyLmphdmEgYi90ZXN0cy9zaWduYXR1cmUvdGVzdHMvc3JjL2FuZHJvaWQvc2lnbmF0dXJlL2N0cy90ZXN0cy9UZXN0Q2xhc3Nlc1Byb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRkY2JjZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NpZ25hdHVyZS90ZXN0cy9zcmMvYW5kcm9pZC9zaWduYXR1cmUvY3RzL3Rlc3RzL1Rlc3RDbGFzc2VzUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5zaWduYXR1cmUuY3RzLnRlc3RzOworCitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07CisKK2ltcG9ydCBhbmRyb2lkLnNpZ25hdHVyZS5jdHMuQ2xhc3NQcm92aWRlcjsKK2ltcG9ydCBhbmRyb2lkLnNpZ25hdHVyZS5jdHMuRGV4TWVtYmVyOworaW1wb3J0IGFuZHJvaWQuc2lnbmF0dXJlLmN0cy50ZXN0cy5kYXRhLkFic3RyYWN0Q2xhc3M7CitpbXBvcnQgYW5kcm9pZC5zaWduYXR1cmUuY3RzLnRlc3RzLmRhdGEuU3lzdGVtQXBpQ2xhc3M7CitpbXBvcnQgYW5kcm9pZC5zaWduYXR1cmUuY3RzLnRlc3RzLmRhdGEuRmluYWxDbGFzczsKK2ltcG9ydCBhbmRyb2lkLnNpZ25hdHVyZS5jdHMudGVzdHMuZGF0YS5Qcml2YXRlQ2xhc3M7CitpbXBvcnQgYW5kcm9pZC5zaWduYXR1cmUuY3RzLnRlc3RzLmRhdGEuUHVibGljQXBpQ2xhc3M7CitpbXBvcnQgYW5kcm9pZC5zaWduYXR1cmUuY3RzLnRlc3RzLmRhdGEuRm9yY2libHlQdWJsaWNpemVkUHJpdmF0ZUNsYXNzOworaW1wb3J0IGFuZHJvaWQuc2lnbmF0dXJlLmN0cy50ZXN0cy5kYXRhLk5vcm1hbENsYXNzOworaW1wb3J0IGFuZHJvaWQuc2lnbmF0dXJlLmN0cy50ZXN0cy5kYXRhLk5vcm1hbEV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnNpZ25hdHVyZS5jdHMudGVzdHMuZGF0YS5Ob3JtYWxJbnRlcmZhY2U7CitpbXBvcnQgYW5kcm9pZC5zaWduYXR1cmUuY3RzLnRlc3RzLmRhdGEuQXBpQW5ub3RhdGlvbjsKKworcHVibGljIGNsYXNzIFRlc3RDbGFzc2VzUHJvdmlkZXIgZXh0ZW5kcyBDbGFzc1Byb3ZpZGVyIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyZWFtPENsYXNzPD8+PiBnZXRBbGxDbGFzc2VzKCkgeworICAgICAgICBTdHJlYW0uQnVpbGRlcjxDbGFzczw/Pj4gYnVpbGRlciA9IFN0cmVhbS5idWlsZGVyKCk7CisgICAgICAgIGJ1aWxkZXIuYWRkKEFic3RyYWN0Q2xhc3MuY2xhc3MpOworICAgICAgICBidWlsZGVyLmFkZChGaW5hbENsYXNzLmNsYXNzKTsKKyAgICAgICAgYnVpbGRlci5hZGQoTm9ybWFsQ2xhc3MuY2xhc3MpOworICAgICAgICBidWlsZGVyLmFkZChOb3JtYWxFeGNlcHRpb24uY2xhc3MpOworICAgICAgICBidWlsZGVyLmFkZChOb3JtYWxJbnRlcmZhY2UuY2xhc3MpOworICAgICAgICBidWlsZGVyLmFkZChBcGlBbm5vdGF0aW9uLmNsYXNzKTsKKyAgICAgICAgYnVpbGRlci5hZGQoUHVibGljQXBpQ2xhc3MuY2xhc3MpOworICAgICAgICBidWlsZGVyLmFkZChTeXN0ZW1BcGlDbGFzcy5jbGFzcyk7CisgICAgICAgIGJ1aWxkZXIuYWRkKFByaXZhdGVDbGFzcy5jbGFzcyk7CisgICAgICAgIGJ1aWxkZXIuYWRkKEZvcmNpYmx5UHVibGljaXplZFByaXZhdGVDbGFzcy5jbGFzcyk7CisgICAgICAgIHJldHVybiBidWlsZGVyLmJ1aWxkKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmVhbTxEZXhNZW1iZXI+IGdldEFsbE1lbWJlcnMoQ2xhc3M8Pz4ga2xhc3MpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc2lnbmF0dXJlL3Rlc3RzL3NyYy9hbmRyb2lkL3NpZ25hdHVyZS9jdHMvdGVzdHMvZGF0YS9BcGlBbm5vdGF0aW9uLmphdmEgYi90ZXN0cy9zaWduYXR1cmUvdGVzdHMvc3JjL2FuZHJvaWQvc2lnbmF0dXJlL2N0cy90ZXN0cy9kYXRhL0FwaUFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2E0OWIyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc2lnbmF0dXJlL3Rlc3RzL3NyYy9hbmRyb2lkL3NpZ25hdHVyZS9jdHMvdGVzdHMvZGF0YS9BcGlBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQuc2lnbmF0dXJlLmN0cy50ZXN0cy5kYXRhOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkFOTk9UQVRJT05fVFlQRTsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuQ09OU1RSVUNUT1I7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlBBQ0tBR0U7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworQFRhcmdldCh7CisgICAgVFlQRSwgRklFTEQsIE1FVEhPRCwgQ09OU1RSVUNUT1IsIEFOTk9UQVRJT05fVFlQRSwgUEFDS0FHRQorfSkKK0BSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitwdWJsaWMgQGludGVyZmFjZSBBcGlBbm5vdGF0aW9uIHsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3NpZ25hdHVyZS90ZXN0cy9zcmMvYW5kcm9pZC9zaWduYXR1cmUvY3RzL3Rlc3RzL2RhdGEvRXh0ZW5kZWROb3JtYWxJbnRlcmZhY2UuamF2YSBiL3Rlc3RzL3NpZ25hdHVyZS90ZXN0cy9zcmMvYW5kcm9pZC9zaWduYXR1cmUvY3RzL3Rlc3RzL2RhdGEvRXh0ZW5kZWROb3JtYWxJbnRlcmZhY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjc3ZjkzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc2lnbmF0dXJlL3Rlc3RzL3NyYy9hbmRyb2lkL3NpZ25hdHVyZS9jdHMvdGVzdHMvZGF0YS9FeHRlbmRlZE5vcm1hbEludGVyZmFjZS5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2lnbmF0dXJlLmN0cy50ZXN0cy5kYXRhOworCisvKioKKyAqLworcHVibGljIGludGVyZmFjZSBFeHRlbmRlZE5vcm1hbEludGVyZmFjZSBleHRlbmRzIE5vcm1hbEludGVyZmFjZSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICB2b2lkIGRvU29tZXRoaW5nKCk7CisKKyAgICB2b2lkIGRvU29tZXRoaW5nRWxzZSgpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc2lnbmF0dXJlL3Rlc3RzL3NyYy9hbmRyb2lkL3NpZ25hdHVyZS9jdHMvdGVzdHMvZGF0YS9Gb3JjaWJseVB1YmxpY2l6ZWRQcml2YXRlQ2xhc3MuamF2YSBiL3Rlc3RzL3NpZ25hdHVyZS90ZXN0cy9zcmMvYW5kcm9pZC9zaWduYXR1cmUvY3RzL3Rlc3RzL2RhdGEvRm9yY2libHlQdWJsaWNpemVkUHJpdmF0ZUNsYXNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUzMzU0NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NpZ25hdHVyZS90ZXN0cy9zcmMvYW5kcm9pZC9zaWduYXR1cmUvY3RzL3Rlc3RzL2RhdGEvRm9yY2libHlQdWJsaWNpemVkUHJpdmF0ZUNsYXNzLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zaWduYXR1cmUuY3RzLnRlc3RzLmRhdGE7CisKKy8qKgorICogVGhpcyBtb2NrcyBhIHByaXZhdGUgY2xhc3MsIGJ1dCBzb21lb25lIGhhcyBmb3JjaWJseSBhZGRlZCB0aGUgYW5ub3RhdGlvbiB0byBtYWtlIGl0IGFzIGFuIEFQSS4KKyAqLworQEFwaUFubm90YXRpb24KK3B1YmxpYyBjbGFzcyBGb3JjaWJseVB1YmxpY2l6ZWRQcml2YXRlQ2xhc3MgeworCit9CmRpZmYgLS1naXQgYS90ZXN0cy9zaWduYXR1cmUvdGVzdHMvc3JjL2FuZHJvaWQvc2lnbmF0dXJlL2N0cy90ZXN0cy9kYXRhL1ByaXZhdGVDbGFzcy5qYXZhIGIvdGVzdHMvc2lnbmF0dXJlL3Rlc3RzL3NyYy9hbmRyb2lkL3NpZ25hdHVyZS9jdHMvdGVzdHMvZGF0YS9Qcml2YXRlQ2xhc3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjA4ODRjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc2lnbmF0dXJlL3Rlc3RzL3NyYy9hbmRyb2lkL3NpZ25hdHVyZS9jdHMvdGVzdHMvZGF0YS9Qcml2YXRlQ2xhc3MuamF2YQpAQCAtMCwwICsxLDI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNpZ25hdHVyZS5jdHMudGVzdHMuZGF0YTsKKworLyoqCisgKiBUaGlzIG1vY2tzIGFuIGludGVybmFsIHByaXZhdGUgY2xhc3MKKyAqLworcHVibGljIGNsYXNzIFByaXZhdGVDbGFzcyB7CisgICAgcHVibGljIHZvaWQgcHJpdmF0ZU1ldGhvZCgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBwcml2YXRlRmllbGQ7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zaWduYXR1cmUvdGVzdHMvc3JjL2FuZHJvaWQvc2lnbmF0dXJlL2N0cy90ZXN0cy9kYXRhL1B1YmxpY0FwaUNsYXNzLmphdmEgYi90ZXN0cy9zaWduYXR1cmUvdGVzdHMvc3JjL2FuZHJvaWQvc2lnbmF0dXJlL2N0cy90ZXN0cy9kYXRhL1B1YmxpY0FwaUNsYXNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI3ZDA3MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NpZ25hdHVyZS90ZXN0cy9zcmMvYW5kcm9pZC9zaWduYXR1cmUvY3RzL3Rlc3RzL2RhdGEvUHVibGljQXBpQ2xhc3MuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNpZ25hdHVyZS5jdHMudGVzdHMuZGF0YTsKKworLyoqCisgKiBBIHB1YmxpYyBBUEkgY2xhc3MsIHdpdGggc29tZSBtZW1iZXJzIGFyZSBtYXJrZWQgYXMgc3lzdGVtIEFQSQorICovCitwdWJsaWMgY2xhc3MgUHVibGljQXBpQ2xhc3MgZXh0ZW5kcyBQdWJsaWNBcGlDbGFzc1BhcmVudCB7CisgICAgcHVibGljIFB1YmxpY0FwaUNsYXNzKGJvb2xlYW4gZm9vKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHVibGljQXBpTWV0aG9kKCkgeworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHB1YmxpY0FwaUZpZWxkOworCisgICAgLyoqIEBoaWRlICovCisgICAgQEFwaUFubm90YXRpb24KKyAgICBwdWJsaWMgUHVibGljQXBpQ2xhc3MoKSB7CisgICAgfQorCisgICAgLyoqIEBoaWRlICovCisgICAgQEFwaUFubm90YXRpb24KKyAgICBwdWJsaWMgdm9pZCBhcGlNZXRob2QoKSB7CisgICAgfQorCisgICAgLyoqIEBoaWRlICovCisgICAgQEFwaUFubm90YXRpb24KKyAgICBwdWJsaWMgYm9vbGVhbiBhcGlGaWVsZDsKKworICAgIC8qKiBAaGlkZSAqLworICAgIHB1YmxpYyBQdWJsaWNBcGlDbGFzcyhpbnQgZm9vKSB7CisgICAgfQorCisgICAgLyoqIEBoaWRlICovCisgICAgcHVibGljIHZvaWQgcHJpdmF0ZU1ldGhvZCgpIHsKKyAgICB9CisKKyAgICAvKiogQGhpZGUgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBwcml2YXRlRmllbGQ7CisKKyAgICAvKiogQGhpZGUgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhbk92ZXJyaWRkZW5NZXRob2QoKSB7CisgICAgICAgIC8vIFRoaXMgaXMgQGhpZGUgYnV0IHNob3VsZCBiZSByZWNvZ25pemVkIGFzIGFuIEFQSSBiZWNhdXNlIHRoZSBleGFjdCBzYW1lIG1ldGhvZCBpcyBkZWZpbmVkCisgICAgICAgIC8vIGFzIEFQSSBpbiBvbmUgb2YgdGhlIGFuY2VzdG9yIGNsYXNzZXMuCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc2lnbmF0dXJlL3Rlc3RzL3NyYy9hbmRyb2lkL3NpZ25hdHVyZS9jdHMvdGVzdHMvZGF0YS9QdWJsaWNBcGlDbGFzc1BhcmVudC5qYXZhIGIvdGVzdHMvc2lnbmF0dXJlL3Rlc3RzL3NyYy9hbmRyb2lkL3NpZ25hdHVyZS9jdHMvdGVzdHMvZGF0YS9QdWJsaWNBcGlDbGFzc1BhcmVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMjlkMDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zaWduYXR1cmUvdGVzdHMvc3JjL2FuZHJvaWQvc2lnbmF0dXJlL2N0cy90ZXN0cy9kYXRhL1B1YmxpY0FwaUNsYXNzUGFyZW50LmphdmEKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zaWduYXR1cmUuY3RzLnRlc3RzLmRhdGE7CisKKy8qKgorICogUGFyZW50IGNsYXNzIG9mIFB1YmxpY0FwaUNsYXNzLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHVibGljQXBpQ2xhc3NQYXJlbnQgeworICAgIHB1YmxpYyB2b2lkIHB1YmxpY01ldGhvZCgpIHsKKyAgICB9CisKKyAgICAvKiogQGhpZGUgKi8KKyAgICBAQXBpQW5ub3RhdGlvbgorICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGFuT3ZlcnJpZGRlbk1ldGhvZCgpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc2lnbmF0dXJlL3Rlc3RzL3NyYy9hbmRyb2lkL3NpZ25hdHVyZS9jdHMvdGVzdHMvZGF0YS9TeXN0ZW1BcGlDbGFzcy5qYXZhIGIvdGVzdHMvc2lnbmF0dXJlL3Rlc3RzL3NyYy9hbmRyb2lkL3NpZ25hdHVyZS9jdHMvdGVzdHMvZGF0YS9TeXN0ZW1BcGlDbGFzcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MzZkNGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zaWduYXR1cmUvdGVzdHMvc3JjL2FuZHJvaWQvc2lnbmF0dXJlL2N0cy90ZXN0cy9kYXRhL1N5c3RlbUFwaUNsYXNzLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zaWduYXR1cmUuY3RzLnRlc3RzLmRhdGE7CisKKy8qKgorICogTm90IGEgcHVibGljIEFQSSwgYnV0IGEgc3lzdGVtIEFQSS4KKyAqCisgKiBAaGlkZQorICovCitAQXBpQW5ub3RhdGlvbgorcHVibGljIGNsYXNzIFN5c3RlbUFwaUNsYXNzIHsKKyAgICBAQXBpQW5ub3RhdGlvbgorICAgIHB1YmxpYyBTeXN0ZW1BcGlDbGFzcygpIHsKKyAgICB9CisKKyAgICBAQXBpQW5ub3RhdGlvbgorICAgIHB1YmxpYyB2b2lkIGFwaU1ldGhvZCgpIHsKKyAgICB9CisKKyAgICBAQXBpQW5ub3RhdGlvbgorICAgIHB1YmxpYyBib29sZWFuIGFwaUZpZWxkOworCisgICAgLy8gVE9ETyhiLzcxNjMwNjk1KSB0aGlzIHNob3VsZG4ndCBiZSByZWNvZ25pemVkCisgICAgLy8gYXMgYW4gQVBJLCBhcyBpdCBpcyBub3QgYW5ub3RhdGVkLgorICAgIHB1YmxpYyBTeXN0ZW1BcGlDbGFzcyhmbG9hdCBmb28pIHsKKworICAgIH0KKworICAgIC8vIFRPRE8oYi83MTYzMDY5NSkgdGhpcyBzaG91bGRuJ3QgYmUgcmVjb2duaXplZAorICAgIC8vIGFzIGFuIEFQSSwgYXMgaXQgaXMgbm90IGFubm90YXRlZC4KKyAgICBwdWJsaWMgdm9pZCB1bmFubm90YXRlZEFwaU1ldGhvZCgpIHsKKyAgICB9CisKKyAgICAvLyBUT0RPKGIvNzE2MzA2OTUpIHRoaXMgc2hvdWxkbid0IGJlIHJlY29nbml6ZWQKKyAgICAvLyBhcyBhbiBBUEksIGFzIGl0IGlzIG5vdCBhbm5vdGF0ZWQuCisgICAgcHVibGljIGJvb2xlYW4gdW5hbm5vdGF0ZWRBcGlGaWVsZDsKKworICAgIC8qKiBAaGlkZSAqLworICAgIHB1YmxpYyBTeXN0ZW1BcGlDbGFzcyhib29sZWFuIGZvbykgeworICAgIH0KKworICAgIC8qKiBAaGlkZSAqLworICAgIHB1YmxpYyB2b2lkIHByaXZhdGVNZXRob2QoKSB7CisgICAgfQorCisgICAgLyoqIEBoaWRlICovCisgICAgcHVibGljIGJvb2xlYW4gcHJpdmF0ZUZpZWxkOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc2ltcGxlY3B1L0FuZHJvaWQubWsgYi90ZXN0cy9zaW1wbGVjcHUvQW5kcm9pZC5tawppbmRleCA2MThhOWJjLi5lNjcxM2Q0IDEwMDY0NAotLS0gYS90ZXN0cy9zaW1wbGVjcHUvQW5kcm9pZC5taworKysgYi90ZXN0cy9zaW1wbGVjcHUvQW5kcm9pZC5tawpAQCAtMjEsNyArMjEsNyBAQAogIyBJbmNsdWRlIGJvdGggdGhlIDMyIGFuZCA2NCBiaXQgdmVyc2lvbnMKIExPQ0FMX01VTFRJTElCIDo9IGJvdGgKIAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwgY3RzdGVzdHJ1bm5lcgorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0IGN0c3Rlc3RydW5uZXItYXh0CiAKIExPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmN0c2NwdV9qbmkKIApkaWZmIC0tZ2l0IGEvdGVzdHMvc2ltcGxlY3B1L0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9zaW1wbGVjcHUvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA0YjVmZWJmLi4yMmI3ZGZhIDEwMDY0NAotLS0gYS90ZXN0cy9zaW1wbGVjcHUvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy9zaW1wbGVjcHUvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjMsNyArMjMsNyBAQAogICAgIDxhcHBsaWNhdGlvbj4KICAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CiAgICAgPC9hcHBsaWNhdGlvbj4KLSAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLnNpbXBsZWNwdS5jdHMiCiAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgdGVzdHMgZm9yIHNpbXBsZSBDUFUiIC8+CiA8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvc2ltcGxlY3B1L0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL3NpbXBsZWNwdS9BbmRyb2lkVGVzdC54bWwKaW5kZXggOTE5MmU4Yi4uOTE2ZGE1MCAxMDA2NDQKLS0tIGEvdGVzdHMvc2ltcGxlY3B1L0FuZHJvaWRUZXN0LnhtbAorKysgYi90ZXN0cy9zaW1wbGVjcHUvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgQ1BVIHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJzeXN0ZW1zIiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CmRpZmYgLS1naXQgYS90ZXN0cy9zaW1wbGVjcHUvam5pL0FuZHJvaWQubWsgYi90ZXN0cy9zaW1wbGVjcHUvam5pL0FuZHJvaWQubWsKaW5kZXggYzVmMDcyZS4uNzNhNmZjZiAxMDA2NDQKLS0tIGEvdGVzdHMvc2ltcGxlY3B1L2puaS9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3NpbXBsZWNwdS9qbmkvQW5kcm9pZC5tawpAQCAtMjYsNiArMjYsNiBAQAogCiBMT0NBTF9TREtfVkVSU0lPTiA6PSAxNAogCi1MT0NBTF9DRkxBR1MgOj0gLVduby11bnVzZWQtcGFyYW1ldGVyCitMT0NBTF9DRkxBR1MgOj0gLVdhbGwgLVdlcnJvciAtV25vLXVudXNlZC1wYXJhbWV0ZXIKIAogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3lzdGVtQXBwVGVzdC90ZXN0L0FuZHJvaWQubWsgYi90ZXN0cy9zeXN0ZW1BcHBUZXN0L3Rlc3QvQW5kcm9pZC5tawppbmRleCBlMTVkMjU5Li4wYzk0MDE5IDEwMDY0NAotLS0gYS90ZXN0cy9zeXN0ZW1BcHBUZXN0L3Rlc3QvQW5kcm9pZC5taworKysgYi90ZXN0cy9zeXN0ZW1BcHBUZXN0L3Rlc3QvQW5kcm9pZC5tawpAQCAtMjQsNyArMjQsNyBAQAogCiBMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfQVBQU19QUklWSUxFR0VEKQogCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY3RzdGVzdHJ1bm5lciBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY3RzdGVzdHJ1bm5lci1heHQgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9hY2NvdW50cy9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvYWNjb3VudHMvQW5kcm9pZC5tawppbmRleCBmNWFjNGZhLi5jNTU5MjUyIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9hY2NvdW50cy9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3Rlc3RzL2FjY291bnRzL0FuZHJvaWQubWsKQEAgLTIyLDkgKzIyLDkgQEAKIExPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCiAKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCi0gICAgQ3RzQWNjb3VudFRlc3RzQ29tbW9uIGN0c3Rlc3RydW5uZXIgbGVnYWN5LWFuZHJvaWQtdGVzdAorICAgIEN0c0FjY291bnRUZXN0c0NvbW1vbiBjdHN0ZXN0cnVubmVyLWF4dCBwbGF0Zm9ybS10ZXN0LWFubm90YXRpb25zCiAKLUxPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGxlZ2FjeS1hbmRyb2lkLXRlc3QKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIuc3R1YnMgYW5kcm9pZC50ZXN0LmJhc2Uuc3R1YnMKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogCkBAIC0zNyw3ICszNyw3IEBACiBMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CiAKICMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cyBjdHNfaW5zdGFudAogCiBpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCiBpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9hY2NvdW50cy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdGVzdHMvYWNjb3VudHMvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA3MzUzNWJjLi5hMzFiNzdhIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9hY2NvdW50cy9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL2FjY291bnRzL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTE2LDcgKzE2LDggQEAKICAtLT4KIAogPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBwYWNrYWdlPSJhbmRyb2lkLmFjY291bnRzLmN0cyI+CisgICAgICAgIHBhY2thZ2U9ImFuZHJvaWQuYWNjb3VudHMuY3RzIgorICAgICAgICBhbmRyb2lkOnRhcmdldFNhbmRib3hWZXJzaW9uPSIyIj4KICAgICA8dXNlcy1zZGsgYW5kcm9pZDptaW5TZGtWZXJzaW9uPSIxIgogICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0U2RrVmVyc2lvbj0iMjYiLz4KIApAQCAtNjIsNyArNjMsNyBAQAogICAgICAgICA8L3NlcnZpY2U+CiAgICAgPC9hcHBsaWNhdGlvbj4KIAotICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuYWNjb3VudHMuY3RzIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIGZvciBhbmRyb2lkLmFjY291bnRzIj4KICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9Imxpc3RlbmVyIgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvYWNjb3VudHMvQW5kcm9pZFRlc3QueG1sIGIvdGVzdHMvdGVzdHMvYWNjb3VudHMvQW5kcm9pZFRlc3QueG1sCmluZGV4IGI2YWQ3NTguLmUwYTNhZTkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2FjY291bnRzL0FuZHJvaWRUZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9hY2NvdW50cy9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDcgKzE0LDEyIEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgQWNjb3VudHMgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImZyYW1ld29yayIgLz4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlJ1bkNvbW1hbmRUYXJnZXRQcmVwYXJlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVuLWNvbW1hbmQiIHZhbHVlPSJjbWQgYWNjb3VudCBzZXQtYmluZC1pbnN0YW50LXNlcnZpY2UtYWxsb3dlZCB0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlYXJkb3duLWNvbW1hbmQiIHZhbHVlPSJjbWQgYWNjb3VudCBzZXQtYmluZC1pbnN0YW50LXNlcnZpY2UtYWxsb3dlZCBmYWxzZSIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgogICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzVW5hZmZpbGlhdGVkQWNjb3VudEF1dGhlbnRpY2F0b3JzLmFwayIgLz4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2FjY291bnRzL0N0c1VuYWZmaWxpYXRlZEFjY291bnRBdXRoZW50aWNhdG9ycy9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvYWNjb3VudHMvQ3RzVW5hZmZpbGlhdGVkQWNjb3VudEF1dGhlbnRpY2F0b3JzL0FuZHJvaWQubWsKaW5kZXggOTI0YjM3OC4uMDM0NzlkYiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvYWNjb3VudHMvQ3RzVW5hZmZpbGlhdGVkQWNjb3VudEF1dGhlbnRpY2F0b3JzL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvdGVzdHMvYWNjb3VudHMvQ3RzVW5hZmZpbGlhdGVkQWNjb3VudEF1dGhlbnRpY2F0b3JzL0FuZHJvaWQubWsKQEAgLTI4LDcgKzI4LDcgQEAKIExPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKIAogTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKLQljdHN0ZXN0cnVubmVyIFwKKwljdHN0ZXN0cnVubmVyLWF4dCBcCiAJQ3RzQWNjb3VudFRlc3RzQ29tbW9uCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKQEAgLTM4LDcgKzM4LDcgQEAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNVbmFmZmlsaWF0ZWRBY2NvdW50QXV0aGVudGljYXRvcnMKIAogIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzIGN0c19pbnN0YW50CiAKIAogTE9DQUxfQ0VSVElGSUNBVEUgOj0gY3RzL2hvc3RzaWRldGVzdHMvYXBwc2VjdXJpdHkvY2VydHMvY3RzLXRlc3RrZXkyCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9hY2NvdW50cy9DdHNVbmFmZmlsaWF0ZWRBY2NvdW50QXV0aGVudGljYXRvcnMvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL2FjY291bnRzL0N0c1VuYWZmaWxpYXRlZEFjY291bnRBdXRoZW50aWNhdG9ycy9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDY0MmIzZDguLjNhMGIwMjUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2FjY291bnRzL0N0c1VuYWZmaWxpYXRlZEFjY291bnRBdXRoZW50aWNhdG9ycy9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL2FjY291bnRzL0N0c1VuYWZmaWxpYXRlZEFjY291bnRBdXRoZW50aWNhdG9ycy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0xNiw3ICsxNiw4IEBACiAgLS0+CiAKIDxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgcGFja2FnZT0iYW5kcm9pZC5hY2NvdW50cy5jdHMudW5hZmZpbGlhdGVkIj4KKyAgICAgICAgcGFja2FnZT0iYW5kcm9pZC5hY2NvdW50cy5jdHMudW5hZmZpbGlhdGVkIgorICAgICAgICBhbmRyb2lkOnRhcmdldFNhbmRib3hWZXJzaW9uPSIyIj4KICAgICA8dXNlcy1zZGsgYW5kcm9pZDptaW5TZGtWZXJzaW9uPSIxIgogICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0U2RrVmVyc2lvbj0iMjYiLz4KIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvYWNjb3VudHMvc3JjL2FuZHJvaWQvYWNjb3VudHMvY3RzL0Fic3RyYWN0QXV0aGVudGljYXRvclRlc3RzLmphdmEgYi90ZXN0cy90ZXN0cy9hY2NvdW50cy9zcmMvYW5kcm9pZC9hY2NvdW50cy9jdHMvQWJzdHJhY3RBdXRoZW50aWNhdG9yVGVzdHMuamF2YQppbmRleCA3MjVlN2E1Li44OGZlNzg1IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9hY2NvdW50cy9zcmMvYW5kcm9pZC9hY2NvdW50cy9jdHMvQWJzdHJhY3RBdXRoZW50aWNhdG9yVGVzdHMuamF2YQorKysgYi90ZXN0cy90ZXN0cy9hY2NvdW50cy9zcmMvYW5kcm9pZC9hY2NvdW50cy9jdHMvQWJzdHJhY3RBdXRoZW50aWNhdG9yVGVzdHMuamF2YQpAQCAtMjksNiArMjksNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOwogaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpAQCAtNDMsNyArNDQsNyBAQAogICogIGFkYiBzaGVsbCBhbSBpbnN0cnVtZW50CiAgKiAgIC1lIGRlYnVnIGZhbHNlIC13CiAgKiAgIC1lIGNsYXNzIGFuZHJvaWQuYWNjb3VudHMuY3RzLkFic3RyYWN0QXV0aGVudGljYXRvclRlc3RzCi0gKiBhbmRyb2lkLmFjY291bnRzLmN0cy9hbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyCisgKiBhbmRyb2lkLmFjY291bnRzLmN0cy9hbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIKICAqLwogcHVibGljIGNsYXNzIEFic3RyYWN0QXV0aGVudGljYXRvclRlc3RzIGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKIApAQCAtNjAsNyArNjEsMTAgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewotICAgICAgICBtUHJvdmlkZXJDbGllbnQucmVsZWFzZSgpOworICAgICAgICBpZiAobVByb3ZpZGVyQ2xpZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIG1Qcm92aWRlckNsaWVudCBpcyBudWxsIGluIGNhc2Ugb2YgaW5zdGFudCB0ZXN0CisgICAgICAgICAgICBtUHJvdmlkZXJDbGllbnQucmVsZWFzZSgpOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMzksNiArMTQzLDcgQEAKICAgICAgKiBUZXN0cyBmaW5pc2hTZXNzaW9uIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gd2l0aCBkZWZhdWx0IHN0YXJ0QWRkQWNjb3VudFNlc3Npb24uCiAgICAgICogT25seSBhY2NvdW50IG5hbWUgYW5kIGFjY291bnQgdHlwZSBzaG91bGQgYmUgcmV0dXJuZWQgYXMgYSBidW5kbGUuCiAgICAgICovCisgICAgQEFwcE1vZGVGdWxsCiAgICAgcHVibGljIHZvaWQgdGVzdEZpbmlzaFNlc3Npb25BbmRTdGFydEFkZEFjY291bnRTZXNzaW9uRGVmYXVsdEltcGwoKQogICAgICAgICAgICAgdGhyb3dzIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uLCBBdXRoZW50aWNhdG9yRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwKICAgICAgICAgICAgIFJlbW90ZUV4Y2VwdGlvbiB7CkBAIC0yMDgsNiArMjEzLDcgQEAKICAgICAgKiBUZXN0cyBmaW5pc2hTZXNzaW9uIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gd2l0aCBkZWZhdWx0IHN0YXJ0VXBkYXRlQ3JlZGVudGlhbHNTZXNzaW9uLgogICAgICAqIE9ubHkgYWNjb3VudCBuYW1lIGFuZCBhY2NvdW50IHR5cGUgc2hvdWxkIGJlIHJldHVybmVkIGFzIGEgYnVuZGxlLgogICAgICAqLworICAgIEBBcHBNb2RlRnVsbAogICAgIHB1YmxpYyB2b2lkIHRlc3RGaW5pc2hTZXNzaW9uQW5kU3RhcnRVcGRhdGVDcmVkZW50aWFsc1Nlc3Npb25EZWZhdWx0SW1wbCgpCiAgICAgICAgICAgICB0aHJvd3MgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24sIEF1dGhlbnRpY2F0b3JFeGNlcHRpb24sIElPRXhjZXB0aW9uLAogICAgICAgICAgICAgUmVtb3RlRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2FjY291bnRzL3NyYy9hbmRyb2lkL2FjY291bnRzL2N0cy9BY2NvdW50TWFuYWdlclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2FjY291bnRzL3NyYy9hbmRyb2lkL2FjY291bnRzL2N0cy9BY2NvdW50TWFuYWdlclRlc3QuamF2YQppbmRleCBjOTQwYzNmLi40N2JkYTM4IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9hY2NvdW50cy9zcmMvYW5kcm9pZC9hY2NvdW50cy9jdHMvQWNjb3VudE1hbmFnZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvYWNjb3VudHMvc3JjL2FuZHJvaWQvYWNjb3VudHMvY3RzL0FjY291bnRNYW5hZ2VyVGVzdC5qYXZhCkBAIC0yOCwxMyArMjgsMTIgQEAKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXJUaHJlYWQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwogaW1wb3J0IGFuZHJvaWQub3MuU3RyaWN0TW9kZTsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CiBpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlByZXN1Ym1pdDsKIGltcG9ydCBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI7CiAKQEAgLTU0LDcgKzUzLDcgQEAKICAqICBhZGIgc2hlbGwgYW0gaW5zdHJ1bWVudAogICogICAtZSBkZWJ1ZyBmYWxzZSAtdwogICogICAtZSBjbGFzcyBhbmRyb2lkLmFjY291bnRzLmN0cy5BY2NvdW50TWFuYWdlclRlc3QKLSAqIGFuZHJvaWQuYWNjb3VudHMuY3RzL2FuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIKKyAqIGFuZHJvaWQuYWNjb3VudHMuY3RzL2FuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lcgogICovCiBwdWJsaWMgY2xhc3MgQWNjb3VudE1hbmFnZXJUZXN0IGV4dGVuZHMgQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI8QWNjb3VudER1bW15QWN0aXZpdHk+IHsKIApAQCAtNTY4LDYgKzU2Nyw3IEBACiAgICAgLyoqCiAgICAgICogVGVzdCBhZGRBY2NvdW50RXhwbGljaXRseSgpLCByZW5hbWVBY2NvdW50KCkgYW5kIHJlbW92ZUFjY291bnQoKS4KICAgICAgKi8KKyAgICBAQXBwTW9kZUZ1bGwocmVhc29uID0gIlRoZSBtZXRob2RzIGFyZSBmb3Igc2lnbi11cCB3aXphcmRzIGFzc29jaWF0ZWQgd2l0aCBhdXRoZW50aWNhdG9ycy4iKQogICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRBY2NvdW50RXhwbGljaXRseUFuZFJlbW92ZUFjY291bnQoKSB0aHJvd3MgSU9FeGNlcHRpb24sCiAgICAgICAgICAgICBBdXRoZW50aWNhdG9yRXhjZXB0aW9uLCBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiB7CiAKQEAgLTU5Myw2ICs1OTMsNyBAQAogICAgIC8qKgogICAgICAqIFRlc3QgYWRkQWNjb3VudEV4cGxpY2l0bHkoKSwgcmVuYW1lQWNjb3VudCgpIGFuZCByZW1vdmVBY2NvdW50KCkuCiAgICAgICovCisgICAgQEFwcE1vZGVGdWxsKHJlYXNvbiA9ICJUaGUgbWV0aG9kcyBhcmUgZm9yIHNpZ24tdXAgd2l6YXJkcyBhc3NvY2lhdGVkIHdpdGggYXV0aGVudGljYXRvcnMuIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkQWNjb3VudEV4cGxpY2l0bHlBbmRSZW1vdmVBY2NvdW50V2l0aE5ld0FwaSgpIHRocm93cyBJT0V4Y2VwdGlvbiwKICAgICAgICAgICAgIEF1dGhlbnRpY2F0b3JFeGNlcHRpb24sIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKIApAQCAtNjI0LDYgKzYyNSw3IEBACiAgICAgICogVGVzdCBhZGRBY2NvdW50RXhwbGljaXRseSgpLCByZW5hbWVBY2NvdW50KCkgYW5kIHJlbW92ZUFjY291bnQoKSBjYWxsaW5nCiAgICAgICogaW50byBkZWZhdWx0IGltcGxlbWVudGF0aW9ucy4KICAgICAgKi8KKyAgICBAQXBwTW9kZUZ1bGwocmVhc29uID0gIlRoZSBtZXRob2RzIGFyZSBmb3Igc2lnbi11cCB3aXphcmRzIGFzc29jaWF0ZWQgd2l0aCBhdXRoZW50aWNhdG9ycy4iKQogICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRBY2NvdW50RXhwbGljaXRseUFuZFJlbW92ZUFjY291bnRXaXRoRGVmYXVsdEltcGwoKSB0aHJvd3MgSU9FeGNlcHRpb24sCiAgICAgICAgICAgICBBdXRoZW50aWNhdG9yRXhjZXB0aW9uLCBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiB7CiAKQEAgLTY0OCw2ICs2NTAsNyBAQAogICAgIC8qKgogICAgICAqIFRlc3QgYWRkQWNjb3VudEV4cGxpY2l0bHkoKSwgcmVuYW1lQWNjb3VudCgpIGFuZCByZW1vdmVBY2NvdW50KCkuCiAgICAgICovCisgICAgQEFwcE1vZGVGdWxsKHJlYXNvbiA9ICJUaGUgbWV0aG9kcyBhcmUgZm9yIHNpZ24tdXAgd2l6YXJkcyBhc3NvY2lhdGVkIHdpdGggYXV0aGVudGljYXRvcnMuIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkQWNjb3VudEV4cGxpY2l0bHlBbmRSZW1vdmVBY2NvdW50V2l0aERlcHJlY2F0ZWRBcGkoKSB0aHJvd3MgSU9FeGNlcHRpb24sCiAgICAgICAgICAgICBBdXRoZW50aWNhdG9yRXhjZXB0aW9uLCBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiB7CiAKQEAgLTY3Miw2ICs2NzUsNyBAQAogICAgIC8qKgogICAgICAqIFRlc3QgYWRkQWNjb3VudEV4cGxpY2l0bHkoKSBhbmQgcmVtb3ZlQWNjb3VudEV4cGxpY3RseSgpLgogICAgICAqLworICAgIEBBcHBNb2RlRnVsbChyZWFzb24gPSAiVGhlIG1ldGhvZHMgYXJlIGZvciBzaWduLXVwIHdpemFyZHMgYXNzb2NpYXRlZCB3aXRoIGF1dGhlbnRpY2F0b3JzLiIpCiAgICAgcHVibGljIHZvaWQgdGVzdEFkZEFjY291bnRFeHBsaWNpdGx5QW5kUmVtb3ZlQWNjb3VudEV4cGxpY2l0bHkoKSB7CiAgICAgICAgIGZpbmFsIGludCBleHBlY3RlZEFjY291bnRzQ291bnQgPSBnZXRBY2NvdW50c0NvdW50KCk7CiAKQEAgLTY5NCw2ICs2OTgsNyBAQAogICAgIC8qKgogICAgICAqIFRlc3QgdXBkYXRlcyB0byBhY2NvdW50IHZpc2liaWxpdHkuCiAgICAgICovCisgICAgQEFwcE1vZGVGdWxsKHJlYXNvbiA9ICJUaGUgbWV0aG9kcyByZXF1aXJlcyB0aGUgY2FsbGVyIHRvIG1hdGNoIHNpZ25hdHVyZSB3aXRoIGF1dGhlbnRpY2F0b3IuIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0QWNjb3VudFZpc2liaWxpdHkoKQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBBdXRoZW50aWNhdG9yRXhjZXB0aW9uLCBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiB7CiAgICAgICAgIGFtLmFkZEFjY291bnRFeHBsaWNpdGx5KEFDQ09VTlQsIEFDQ09VTlRfUEFTU1dPUkQsIG51bGwgLyogdXNlckRhdGEgKi8pOwpAQCAtNzE2LDYgKzcyMSw3IEBACiAgICAgLyoqCiAgICAgICogVGVzdCB1cGRhdGVzIHRvIGFjY291bnQgdmlzaWJpbGl0eSBmb3IgYXV0aGVudGljYXRvciBwYWNrYWdlLgogICAgICAqLworICAgIEBBcHBNb2RlRnVsbChyZWFzb24gPSAiVGhlIG1ldGhvZHMgcmVxdWlyZXMgdGhlIGNhbGxlciB0byBtYXRjaCBzaWduYXR1cmUgd2l0aCBhdXRoZW50aWNhdG9yLiIpCiAgICAgcHVibGljIHZvaWQgdGVzdFNldEFjY291bnRWaXNpYmlsaXR5Rm9yUHJpdmlsZWdlZFBhY2thZ2UoKQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBBdXRoZW50aWNhdG9yRXhjZXB0aW9uLCBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiB7CiAgICAgICAgIGFtLmFkZEFjY291bnRFeHBsaWNpdGx5KEFDQ09VTlQsIEFDQ09VTlRfUEFTU1dPUkQsIG51bGwgLyogdXNlckRhdGEgKi8pOwpAQCAtNzM5LDYgKzc0NSw3IEBACiAgICAgLyoqCiAgICAgICogVGVzdCBnZXRQYWNrYWdlc0FuZFZpc2liaWxpdHlGb3JBY2NvdW50KCkgbWV0aG9kLgogICAgICAqLworICAgIEBBcHBNb2RlRnVsbChyZWFzb24gPSAiVGhlIG1ldGhvZHMgcmVxdWlyZXMgdGhlIGNhbGxlciB0byBtYXRjaCBzaWduYXR1cmUgd2l0aCBhdXRoZW50aWNhdG9yLiIpCiAgICAgcHVibGljIHZvaWQgdGVzdEdldFBhY2thZ2VzQW5kVmlzaWJpbGl0eUZvckFjY291bnQoKQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBBdXRoZW50aWNhdG9yRXhjZXB0aW9uLCBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiB7CiAgICAgICAgIGFtLmFkZEFjY291bnRFeHBsaWNpdGx5KEFDQ09VTlQsIEFDQ09VTlRfUEFTU1dPUkQsIG51bGwgLyogdXNlckRhdGEgKi8pOwpAQCAtNzYwLDYgKzc2Nyw3IEBACiAgICAgICogVGVzdCBhZGRBY2NvdW50RXhwbGljaXRseSgpLCBzZXRBY2NvdW50VmlzaWJpbGl0eSgpICwgZ2V0QWNjb3VudFZpc2liaWxpdHkoKSwgYW5kCiAgICAgICogcmVtb3ZlQWNjb3VudCgpLgogICAgICAqLworICAgIEBBcHBNb2RlRnVsbChyZWFzb24gPSAiVGhlIG1ldGhvZHMgYXJlIGZvciBzaWduLXVwIHdpemFyZHMgYXNzb2NpYXRlZCB3aXRoIGF1dGhlbnRpY2F0b3JzLiIpCiAgICAgcHVibGljIHZvaWQgdGVzdEFkZEFjY291bnRFeHBsaWNpdGx5V2l0aFZpc2liaWxpdHkoKQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBBdXRoZW50aWNhdG9yRXhjZXB0aW9uLCBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiB7CiAgICAgICAgIE1hcDxTdHJpbmcsIEludGVnZXI+IHZpc2liaWxpdHkgPSBuZXcgSGFzaE1hcDw+KCk7CkBAIC03OTUsNiArODAzLDcgQEAKICAgICAvKioKICAgICAgKiBUZXN0IHRlc3RHZXRBY2NvdW50c0FuZFZpc2liaWxpdHlGb3JQYWNrYWdlKCksIGdldEFjY291bnRzQnlUeXBlRm9yUGFja2FnZSgpIG1ldGhvZHMuCiAgICAgICovCisgICAgQEFwcE1vZGVGdWxsKHJlYXNvbiA9ICJUaGUgbWV0aG9kcyByZXF1aXJlcyB0aGUgY2FsbGVyIHRvIG1hdGNoIHNpZ25hdHVyZSB3aXRoIGF1dGhlbnRpY2F0b3IuIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QWNjb3VudHNBbmRWaXNpYmlsaXR5Rm9yUGFja2FnZSgpIHsKICAgICAgICAgYW0uYWRkQWNjb3VudEV4cGxpY2l0bHkoQUNDT1VOVCwgQUNDT1VOVF9QQVNTV09SRCwgbnVsbCAvKiB1c2VyRGF0YSAqLywgbnVsbCk7CiAgICAgICAgIGFtLmFkZEFjY291bnRFeHBsaWNpdGx5KEFDQ09VTlRfU0FNRV9UWVBFLCBBQ0NPVU5UX1BBU1NXT1JELCBudWxsIC8qIHVzZXJEYXRhICovLCBudWxsKTsKQEAgLTg1Miw2ICs4NjEsNyBAQAogICAgICAqIFRlc3QgY2hlY2tzIG9yZGVyIG9mIGFjY291bnRzIHJldHVybmVkIGJ5IGdldEFjY291bnRzLi4uKCkuCiAgICAgICogQWNjb3VudHMgc2hvdWxkIGJlIGdyb3VwZWQgYnkgdHlwZS4KICAgICAgKi8KKyAgICBAQXBwTW9kZUZ1bGwocmVhc29uID0gIlRoZSBtZXRob2RzIHJlcXVpcmVzIHRoZSBjYWxsZXIgdG8gbWF0Y2ggc2lnbmF0dXJlIHdpdGggYXV0aGVudGljYXRvci4iKQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBY2NvdW50c1JldHVybmVkT3JkZXIoKSB7CiAgICAgICAgIEFjY291bnQgYWNjb3VudF8xXzEgPSBuZXcgQWNjb3VudCgiYWNjb3VudF96IiwgQUNDT1VOVF9UWVBFKTsKICAgICAgICAgQWNjb3VudCBhY2NvdW50XzFfMiA9IG5ldyBBY2NvdW50KCJhY2NvdW50X2MiLCBBQ0NPVU5UX1RZUEUpOwpAQCAtMTY4Miw2ICsxNjkyLDkgQEAKICAgICAvKioKICAgICAgKiBUZXN0cyB0aGUgc2V0dGluZyBvZiBsYXN0QXV0aGVudGljYXRlZFRpbWUgb24gYWRkaW5nIGFjY291bnQKICAgICAgKi8KKyAgICAvLyBUT0RPOiBFaXRoZXIgYWxsb3cgdGhlIHN5c3RlbSB0byBzZWUgdGhlIGFjdGl2aXR5IGZyb20gaW5zdGFudCBhcHAsCisgICAgLy8gT3Igc2VwYXJhdGUgdGhlIGF1dGhlbnRpY2F0b3IgYW5kIHRlc3QgYXBwIHRvIGFsbG93IHRoZSBpbnN0YW50IGFwcCBtb2RlIHRlc3QuCisgICAgQEFwcE1vZGVGdWxsCiAgICAgcHVibGljIHZvaWQgdGVzdExhc3RBdXRoZW50aWNhdGVkVGltZUFmdGVyQWRkQWNjb3VudCgpIHRocm93cyBJT0V4Y2VwdGlvbiwKICAgICAgICAgICAgIEF1dGhlbnRpY2F0b3JFeGNlcHRpb24sIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0VHJ1ZShhZGRBY2NvdW50QW5kUmV0dXJuQWNjb3VudEFkZGVkVGltZShBQ0NPVU5ULCBBQ0NPVU5UX1BBU1NXT1JEKSA+IDApOwpAQCAtMTcwOCw2ICsxNzIxLDkgQEAKICAgICAgKiBUZXN0cyB0aGUgc2V0dGluZyBvZiBsYXN0QXV0aGVudGljYXRlZFRpbWUgb24gY29uZmlybUNyZWRlbnRpYWxzIGJlaW5nCiAgICAgICogc3VjY2Vzc2Z1bC4KICAgICAgKi8KKyAgICAvLyBUT0RPOiBFaXRoZXIgYWxsb3cgdGhlIHN5c3RlbSB0byBzZWUgdGhlIGFjdGl2aXR5IGZyb20gaW5zdGFudCBhcHAsCisgICAgLy8gT3Igc2VwYXJhdGUgdGhlIGF1dGhlbnRpY2F0b3IgYW5kIHRlc3QgYXBwIHRvIGFsbG93IHRoZSBpbnN0YW50IGFwcCBtb2RlIHRlc3QuCisgICAgQEFwcE1vZGVGdWxsCiAgICAgcHVibGljIHZvaWQgdGVzdExhc3RBdXRoZW50aWNhdGVkVGltZUFmdGVyQ29uZmlybUNyZWRlbnRpYWxzU3VjY2VzcygpIHRocm93cyBJT0V4Y2VwdGlvbiwKICAgICAgICAgICAgIEF1dGhlbnRpY2F0b3JFeGNlcHRpb24sIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKIApAQCAtMTcyOSw2ICsxNzQ1LDkgQEAKICAgICAgKiBUZXN0cyB0aGUgc2V0dGluZyBvZiBsYXN0QXV0aGVudGljYXRlZFRpbWUgb24gdXBkYXRlQ3JlZGVudGlhbHMgYmVpbmcKICAgICAgKiBzdWNjZXNzZnVsLgogICAgICAqLworICAgIC8vIFRPRE86IEVpdGhlciBhbGxvdyB0aGUgc3lzdGVtIHRvIHNlZSB0aGUgYWN0aXZpdHkgZnJvbSBpbnN0YW50IGFwcCwKKyAgICAvLyBPciBzZXBhcmF0ZSB0aGUgYXV0aGVudGljYXRvciBhbmQgdGVzdCBhcHAgdG8gYWxsb3cgdGhlIGluc3RhbnQgYXBwIG1vZGUgdGVzdC4KKyAgICBAQXBwTW9kZUZ1bGwKICAgICBwdWJsaWMgdm9pZCB0ZXN0TGFzdEF1dGhlbnRpY2F0ZWRUaW1lQWZ0ZXJVcGRhdGVDcmVkZW50aWFsc1N1Y2Nlc3MoKSB0aHJvd3MgSU9FeGNlcHRpb24sCiAgICAgICAgICAgICBBdXRoZW50aWNhdG9yRXhjZXB0aW9uLCBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiB7CiAKQEAgLTE3NDcsNiArMTc2Niw3IEBACiAgICAgLyoqCiAgICAgICogTGFzdEF1dGhlbnRpY2F0ZWRUaW1lIG9uIHNldFBhc3N3b3JkIHNob3VsZCBub3QgYmUgZGlzdHVyYmVkLgogICAgICAqLworICAgIEBBcHBNb2RlRnVsbChyZWFzb24gPSAic2V0UGFzc3dvcmQgc2hvdWxkIGJlIGNhbGxlZCBieSBhdXRoZW50aWNhdG9yLiIpCiAgICAgcHVibGljIHZvaWQgdGVzdExhc3RBdXRoZW50aWNhdGVkVGltZUFmdGVyU2V0UGFzc3dvcmQoKSB0aHJvd3MgSU9FeGNlcHRpb24sCiAgICAgICAgICAgICBBdXRoZW50aWNhdG9yRXhjZXB0aW9uLCBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiB7CiAgICAgICAgIGxvbmcgYWNjb3VudEFkZFRpbWUgPSBhZGRBY2NvdW50QW5kUmV0dXJuQWNjb3VudEFkZGVkVGltZShBQ0NPVU5ULCBBQ0NPVU5UX1BBU1NXT1JEKTsKQEAgLTI0MjgsNiArMjQ0OCw5IEBACiAgICAgICogYW5kIHJldHVybiB0aGUgZmluYWwgcmVzdWx0IHdoaWNoIGNvbnRhaW5zIGFuIGVuY3J5cHRlZCBzZXNzaW9uIGJ1bmRsZSwKICAgICAgKiBhY2NvdW50IHBhc3N3b3JkIGFuZCBzdGF0dXMgdG9rZW4uCiAgICAgICovCisgICAgLy8gVE9ETzogRWl0aGVyIGFsbG93IHRoZSBzeXN0ZW0gdG8gc2VlIHRoZSBhY3Rpdml0eSBmcm9tIGluc3RhbnQgYXBwLAorICAgIC8vIE9yIHNlcGFyYXRlIHRoZSBhdXRoZW50aWNhdG9yIGFuZCB0ZXN0IGFwcCB0byBhbGxvdyB0aGUgaW5zdGFudCBhcHAgbW9kZSB0ZXN0LgorICAgIEBBcHBNb2RlRnVsbAogICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFydEFkZEFjY291bnRTZXNzaW9uSW50ZXJ2ZW5lKCkKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQXV0aGVudGljYXRvckV4Y2VwdGlvbiwgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewogICAgICAgICBmaW5hbCBTdHJpbmcgYWNjb3VudE5hbWUgPSBGaXh0dXJlcy5QUkVGSVhfTkFNRV9JTlRFUlZFTkUgKyAiQCIKQEAgLTI0NTgsNiArMjQ4MSw5IEBACiAgICAgICogYXV0b21hdGljYWxseS4gV2hlbiBubyBBY3Rpdml0eSBpcyBwcm92aWRlZCBhbmQgYXV0aGVudGljYXRvciByZXF1aXJlcwogICAgICAqIGFkZGl0aW9uYWwgZGF0YSBmcm9tIHVzZXIsIEtFWV9JTlRFTlQgd2lsbCBiZSByZXR1cm5lZCBieSBBY2NvdW50TWFuYWdlci4KICAgICAgKi8KKyAgICAvLyBUT0RPOiBFaXRoZXIgYWxsb3cgdGhlIHN5c3RlbSB0byBzZWUgdGhlIGFjdGl2aXR5IGZyb20gaW5zdGFudCBhcHAsCisgICAgLy8gT3Igc2VwYXJhdGUgdGhlIGF1dGhlbnRpY2F0b3IgYW5kIHRlc3QgYXBwIHRvIGFsbG93IHRoZSBpbnN0YW50IGFwcCBtb2RlIHRlc3QuCisgICAgQEFwcE1vZGVGdWxsCiAgICAgcHVibGljIHZvaWQgdGVzdFN0YXJ0QWRkQWNjb3VudFNlc3Npb25XaXRoUmV0dXJuSW50ZW50KCkKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQXV0aGVudGljYXRvckV4Y2VwdGlvbiwgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewogICAgICAgICBmaW5hbCBTdHJpbmcgYWNjb3VudE5hbWUgPSBGaXh0dXJlcy5QUkVGSVhfTkFNRV9JTlRFUlZFTkUgKyAiQCIKQEAgLTI1MzIsNiArMjU1OCw5IEBACiAgICAgICogc2Vzc2lvbiBidW5kbGUsIGFjY291bnQgcGFzc3dvcmQgYW5kIHN0YXR1cyB0b2tlbi4gQ2FsbGJhY2sgc2hvdWxkIGJlCiAgICAgICogdHJpZ2dlcmVkIHdpdGggdGhlIHJlc3VsdCByZWdhcmRsZXNzIG9mIGEgaGFuZGxlZCBpcyBwcm92aWRlZCBvciBub3QuCiAgICAgICovCisgICAgLy8gVE9ETzogRWl0aGVyIGFsbG93IHRoZSBzeXN0ZW0gdG8gc2VlIHRoZSBhY3Rpdml0eSBmcm9tIGluc3RhbnQgYXBwLAorICAgIC8vIE9yIHNlcGFyYXRlIHRoZSBhdXRoZW50aWNhdG9yIGFuZCB0ZXN0IGFwcCB0byBhbGxvdyB0aGUgaW5zdGFudCBhcHAgbW9kZSB0ZXN0LgorICAgIEBBcHBNb2RlRnVsbAogICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFydEFkZEFjY291bnRTZXNzaW9uV2l0aENhbGxiYWNrQW5kSGFuZGxlcldpdGhJbnRlcnZlbmUoKQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBBdXRoZW50aWNhdG9yRXhjZXB0aW9uLCBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiB7CiAgICAgICAgIHRlc3RTdGFydEFkZEFjY291bnRTZXNzaW9uV2l0aENhbGxiYWNrQW5kSGFuZGxlcldpdGhJbnRlcnZlbmUobnVsbCAvKiBoYW5kbGVyICovKTsKQEAgLTI1NDUsNiArMjU3NCw5IEBACiAgICAgICogYWRkaXRpb25hbCBkYXRhIGZyb20gdXNlciwgS0VZX0lOVEVOVCB3aWxsIGJlIHJldHVybmVkIGJ5IEFjY291bnRNYW5hZ2VyCiAgICAgICogaW4gY2FsbGJhY2sgcmVnYXJkbGVzcyBvZiBhIGhhbmRsZXIgaXMgcHJvdmlkZWQgb3Igbm90LgogICAgICAqLworICAgIC8vIFRPRE86IEVpdGhlciBhbGxvdyB0aGUgc3lzdGVtIHRvIHNlZSB0aGUgYWN0aXZpdHkgZnJvbSBpbnN0YW50IGFwcCwKKyAgICAvLyBPciBzZXBhcmF0ZSB0aGUgYXV0aGVudGljYXRvciBhbmQgdGVzdCBhcHAgdG8gYWxsb3cgdGhlIGluc3RhbnQgYXBwIG1vZGUgdGVzdC4KKyAgICBAQXBwTW9kZUZ1bGwKICAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhcnRBZGRBY2NvdW50U2Vzc2lvbldpdGhDYWxsYmFja0FuZEhhbmRsZXJXaXRoUmV0dXJuSW50ZW50KCkKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQXV0aGVudGljYXRvckV4Y2VwdGlvbiwgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewogICAgICAgICB0ZXN0U3RhcnRBZGRBY2NvdW50U2Vzc2lvbldpdGhDYWxsYmFja0FuZEhhbmRsZXJXaXRoUmV0dXJuSW50ZW50KG51bGwgLyogaGFuZGxlciAqLyk7CkBAIC0yODE4LDYgKzI4NTAsOSBAQAogICAgICAqIGFuZCByZXR1cm4gdGhlIGZpbmFsIHJlc3VsdCB3aGljaCBjb250YWlucyBhbiBlbmNyeXB0ZWQgc2Vzc2lvbiBidW5kbGUsCiAgICAgICogYWNjb3VudCBwYXNzd29yZCBhbmQgc3RhdHVzIHRva2VuLgogICAgICAqLworICAgIC8vIFRPRE86IEVpdGhlciBhbGxvdyB0aGUgc3lzdGVtIHRvIHNlZSB0aGUgYWN0aXZpdHkgZnJvbSBpbnN0YW50IGFwcCwKKyAgICAvLyBPciBzZXBhcmF0ZSB0aGUgYXV0aGVudGljYXRvciBhbmQgdGVzdCBhcHAgdG8gYWxsb3cgdGhlIGluc3RhbnQgYXBwIG1vZGUgdGVzdC4KKyAgICBAQXBwTW9kZUZ1bGwKICAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhcnRVcGRhdGVDcmVkZW50aWFsc1Nlc3Npb25JbnRlcnZlbmUoKQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBBdXRoZW50aWNhdG9yRXhjZXB0aW9uLCBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZyBhY2NvdW50TmFtZSA9IEZpeHR1cmVzLlBSRUZJWF9OQU1FX0lOVEVSVkVORSArICJAIiArIEZpeHR1cmVzLlNVRkZJWF9OQU1FX0ZJWFRVUkU7CkBAIC0yODQ2LDYgKzI4ODEsOSBAQAogICAgICAqIHN0YXJ0ZWQgYXV0b21hdGljYWxseS4gV2hlbiBubyBBY3Rpdml0eSBpcyBwcm92aWRlZCBhbmQgYXV0aGVudGljYXRvciByZXF1aXJlcwogICAgICAqIGFkZGl0aW9uYWwgZGF0YSBmcm9tIHVzZXIsIEtFWV9JTlRFTlQgd2lsbCBiZSByZXR1cm5lZCBieSBBY2NvdW50TWFuYWdlci4KICAgICAgKi8KKyAgICAvLyBUT0RPOiBFaXRoZXIgYWxsb3cgdGhlIHN5c3RlbSB0byBzZWUgdGhlIGFjdGl2aXR5IGZyb20gaW5zdGFudCBhcHAsCisgICAgLy8gT3Igc2VwYXJhdGUgdGhlIGF1dGhlbnRpY2F0b3IgYW5kIHRlc3QgYXBwIHRvIGFsbG93IHRoZSBpbnN0YW50IGFwcCBtb2RlIHRlc3QuCisgICAgQEFwcE1vZGVGdWxsCiAgICAgcHVibGljIHZvaWQgdGVzdFN0YXJ0VXBkYXRlQ3JlZGVudGlhbHNTZXNzaW9uV2l0aFJldHVybkludGVudCgpCiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEF1dGhlbnRpY2F0b3JFeGNlcHRpb24sIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIGFjY291bnROYW1lID0gRml4dHVyZXMuUFJFRklYX05BTUVfSU5URVJWRU5FICsgIkAiICsgRml4dHVyZXMuU1VGRklYX05BTUVfRklYVFVSRTsKQEAgLTI5MTgsNiArMjk1Niw5IEBACiAgICAgICogc2Vzc2lvbiBidW5kbGUsIGFjY291bnQgcGFzc3dvcmQgYW5kIHN0YXR1cyB0b2tlbi4gQ2FsbGJhY2sgc2hvdWxkIGJlCiAgICAgICogdHJpZ2dlcmVkIHdpdGggdGhlIHJlc3VsdCByZWdhcmRsZXNzIG9mIGEgaGFuZGxlciBpcyBwcm92aWRlZCBvciBub3QuCiAgICAgICovCisgICAgLy8gVE9ETzogRWl0aGVyIGFsbG93IHRoZSBzeXN0ZW0gdG8gc2VlIHRoZSBhY3Rpdml0eSBmcm9tIGluc3RhbnQgYXBwLAorICAgIC8vIE9yIHNlcGFyYXRlIHRoZSBhdXRoZW50aWNhdG9yIGFuZCB0ZXN0IGFwcCB0byBhbGxvdyB0aGUgaW5zdGFudCBhcHAgbW9kZSB0ZXN0LgorICAgIEBBcHBNb2RlRnVsbAogICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFydFVwZGF0ZUNyZWRlbnRpYWxzU2Vzc2lvbldpdGhDYWxsYmFja0FuZEhhbmRsZXJXaXRoSW50ZXJ2ZW5lKCkKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQXV0aGVudGljYXRvckV4Y2VwdGlvbiwgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewogICAgICAgICB0ZXN0U3RhcnRVcGRhdGVDcmVkZW50aWFsc1Nlc3Npb25XaXRoQ2FsbGJhY2tBbmRIYW5kbGVyV2l0aEludGVydmVuZShudWxsIC8qIGhhbmRsZXIgKi8pOwpAQCAtMjkzMSw2ICsyOTcyLDkgQEAKICAgICAgKiBhZGRpdGlvbmFsIGRhdGEgZnJvbSB1c2VyLCBLRVlfSU5URU5UIHdpbGwgYmUgcmV0dXJuZWQgYnkgQWNjb3VudE1hbmFnZXIKICAgICAgKiBpbiBjYWxsYmFjayByZWdhcmRsZXNzIG9mIGEgaGFuZGxlciBpcyBwcm92aWRlZCBvciBub3QuCiAgICAgICovCisgICAgLy8gVE9ETzogRWl0aGVyIGFsbG93IHRoZSBzeXN0ZW0gdG8gc2VlIHRoZSBhY3Rpdml0eSBmcm9tIGluc3RhbnQgYXBwLAorICAgIC8vIE9yIHNlcGFyYXRlIHRoZSBhdXRoZW50aWNhdG9yIGFuZCB0ZXN0IGFwcCB0byBhbGxvdyB0aGUgaW5zdGFudCBhcHAgbW9kZSB0ZXN0LgorICAgIEBBcHBNb2RlRnVsbAogICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFydFVwZGF0ZUNyZWRlbnRpYWxzU2Vzc2lvbldpdGhDYWxsYmFja0FuZEhhbmRsZXJXaXRoUmV0dXJuSW50ZW50KCkKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQXV0aGVudGljYXRvckV4Y2VwdGlvbiwgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewogICAgICAgICB0ZXN0U3RhcnRVcGRhdGVDcmVkZW50aWFsc1Nlc3Npb25XaXRoQ2FsbGJhY2tBbmRIYW5kbGVyV2l0aFJldHVybkludGVudChudWxsIC8qIGhhbmRsZXIgKi8pOwpAQCAtMzYyNiw2ICszNjcwLDkgQEAKICAgICAgKiBwcm92aWRlZCBieSBjYWxsZXIsIHRoZSByZXNvbHV0aW9uIGludGVudCB3aWxsIGJlIHN0YXJ0ZWQgYXV0b21hdGljYWxseS4KICAgICAgKiBBIGJ1bmRsZSBjb250YWluaW5nIGFjY291bnQgbmFtZSBhbmQgdHlwZSB3aWxsIGJlIHJldHVybmVkLgogICAgICAqLworICAgIC8vIFRPRE86IEVpdGhlciBhbGxvdyB0aGUgc3lzdGVtIHRvIHNlZSB0aGUgYWN0aXZpdHkgZnJvbSBpbnN0YW50IGFwcCwKKyAgICAvLyBPciBzZXBhcmF0ZSB0aGUgYXV0aGVudGljYXRvciBhbmQgdGVzdCBhcHAgdG8gYWxsb3cgdGhlIGluc3RhbnQgYXBwIG1vZGUgdGVzdC4KKyAgICBAQXBwTW9kZUZ1bGwKICAgICBwdWJsaWMgdm9pZCB0ZXN0RmluaXNoU2Vzc2lvbkludGVydmVuZSgpCiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEF1dGhlbnRpY2F0b3JFeGNlcHRpb24sIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIGFjY291bnROYW1lID0gRml4dHVyZXMuUFJFRklYX05BTUVfSU5URVJWRU5FICsgIkAiICsgRml4dHVyZXMuU1VGRklYX05BTUVfRklYVFVSRTsKQEAgLTM2NzUsNiArMzcyMiw5IEBACiAgICAgICogd2lsbCBub3QgYmUgc3RhcnRlZCBhdXRvbWF0aWNhbGx5LiBBIGJ1bmRsZSBjb250YWluaW5nIEtFWV9JTlRFTlQgd2lsbCBiZQogICAgICAqIHJldHVybmVkIGluc3RlYWQuCiAgICAgICovCisgICAgLy8gVE9ETzogRWl0aGVyIGFsbG93IHRoZSBzeXN0ZW0gdG8gc2VlIHRoZSBhY3Rpdml0eSBmcm9tIGluc3RhbnQgYXBwLAorICAgIC8vIE9yIHNlcGFyYXRlIHRoZSBhdXRoZW50aWNhdG9yIGFuZCB0ZXN0IGFwcCB0byBhbGxvdyB0aGUgaW5zdGFudCBhcHAgbW9kZSB0ZXN0LgorICAgIEBBcHBNb2RlRnVsbAogICAgIHB1YmxpYyB2b2lkIHRlc3RGaW5pc2hTZXNzaW9uV2l0aFJldHVybkludGVudCgpCiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEF1dGhlbnRpY2F0b3JFeGNlcHRpb24sIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIGFjY291bnROYW1lID0gRml4dHVyZXMuUFJFRklYX05BTUVfSU5URVJWRU5FICsgIkAiICsgRml4dHVyZXMuU1VGRklYX05BTUVfRklYVFVSRTsKQEAgLTM3ODksNiArMzgzOSw5IEBACiAgICAgICogYXV0b21hdGljYWxseS4gQSBidW5kbGUgY29udGFpbmluZyBhY2NvdW50IG5hbWUgYW5kIHR5cGUgd2lsbCBiZSByZXR1cm5lZAogICAgICAqIHZpYSB0aGUgY2FsbGJhY2sgcmVnYXJkbGVzcyBvZiBpZiBoYW5kbGVyIGlzIHByb3ZpZGVkIG9yIG5vdy4KICAgICAgKi8KKyAgICAvLyBUT0RPOiBFaXRoZXIgYWxsb3cgdGhlIHN5c3RlbSB0byBzZWUgdGhlIGFjdGl2aXR5IGZyb20gaW5zdGFudCBhcHAsCisgICAgLy8gT3Igc2VwYXJhdGUgdGhlIGF1dGhlbnRpY2F0b3IgYW5kIHRlc3QgYXBwIHRvIGFsbG93IHRoZSBpbnN0YW50IGFwcCBtb2RlIHRlc3QuCisgICAgQEFwcE1vZGVGdWxsCiAgICAgcHVibGljIHZvaWQgdGVzdEZpbmlzaFNlc3Npb25XaXRoQ2FsbGJhY2tBbmRIYW5kbGVyV2l0aEludGVydmVuZSgpCiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEF1dGhlbnRpY2F0b3JFeGNlcHRpb24sIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKICAgICAgICAgdGVzdEZpbmlzaFNlc3Npb25XaXRoQ2FsbGJhY2tBbmRIYW5kbGVyV2l0aEludGVydmVuZShudWxsIC8qIGhhbmRsZXIgKi8pOwpAQCAtMzgwMyw2ICszODU2LDkgQEAKICAgICAgKiB3aWxsIG5vdCBiZSBzdGFydGVkIGF1dG9tYXRpY2FsbHkuIEEgYnVuZGxlIGNvbnRhaW5pbmcgS0VZX0lOVEVOVCB3aWxsIGJlCiAgICAgICogcmV0dXJuZWQgaW5zdGVhZCB2aWEgY2FsbGJhY2sgcmVnYXJkbGVzcyBvZiBpZiBoYW5kbGVyIGlzIHByb3ZpZGVkIG9yIG5vdC4KICAgICAgKi8KKyAgICAvLyBUT0RPOiBFaXRoZXIgYWxsb3cgdGhlIHN5c3RlbSB0byBzZWUgdGhlIGFjdGl2aXR5IGZyb20gaW5zdGFudCBhcHAsCisgICAgLy8gT3Igc2VwYXJhdGUgdGhlIGF1dGhlbnRpY2F0b3IgYW5kIHRlc3QgYXBwIHRvIGFsbG93IHRoZSBpbnN0YW50IGFwcCBtb2RlIHRlc3QuCisgICAgQEFwcE1vZGVGdWxsCiAgICAgcHVibGljIHZvaWQgdGVzdEZpbmlzaFNlc3Npb25XaXRoQ2FsbGJhY2tBbmRIYW5kbGVyV2l0aFJldHVybkludGVudCgpCiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEF1dGhlbnRpY2F0b3JFeGNlcHRpb24sIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKICAgICAgICAgdGVzdEZpbmlzaFNlc3Npb25XaXRoQ2FsbGJhY2tBbmRIYW5kbGVyV2l0aFJldHVybkludGVudChudWxsIC8qIGhhbmRsZXIgKi8pOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvYWNjb3VudHMvc3JjL2FuZHJvaWQvYWNjb3VudHMvY3RzL0FjY291bnRNYW5hZ2VyVW5hZmZpbGlhdGVkQXV0aGVudGljYXRvclRlc3RzLmphdmEgYi90ZXN0cy90ZXN0cy9hY2NvdW50cy9zcmMvYW5kcm9pZC9hY2NvdW50cy9jdHMvQWNjb3VudE1hbmFnZXJVbmFmZmlsaWF0ZWRBdXRoZW50aWNhdG9yVGVzdHMuamF2YQppbmRleCBmOTQxOGYwLi5hMTFkZTc1IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9hY2NvdW50cy9zcmMvYW5kcm9pZC9hY2NvdW50cy9jdHMvQWNjb3VudE1hbmFnZXJVbmFmZmlsaWF0ZWRBdXRoZW50aWNhdG9yVGVzdHMuamF2YQorKysgYi90ZXN0cy90ZXN0cy9hY2NvdW50cy9zcmMvYW5kcm9pZC9hY2NvdW50cy9jdHMvQWNjb3VudE1hbmFnZXJVbmFmZmlsaWF0ZWRBdXRoZW50aWNhdG9yVGVzdHMuamF2YQpAQCAtMjksNiArMjksNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOwogaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpAQCAtNDUsNyArNDYsNyBAQAogICogIGFkYiBzaGVsbCBhbSBpbnN0cnVtZW50CiAgKiAgIC1lIGRlYnVnIGZhbHNlIC13CiAgKiAgIC1lIGNsYXNzIGFuZHJvaWQuYWNjb3VudHMuY3RzLkFjY291bnRNYW5hZ2VyVW5hZmZpbGlhdGVkQXV0aGVudGljYXRvclRlc3RzCi0gKiBhbmRyb2lkLmFjY291bnRzLmN0cy9hbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyCisgKiBhbmRyb2lkLmFjY291bnRzLmN0cy9hbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIKICAqLwogcHVibGljIGNsYXNzIEFjY291bnRNYW5hZ2VyVW5hZmZpbGlhdGVkQXV0aGVudGljYXRvclRlc3RzIGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKIApAQCAtNTcsMjggKzU4LDExIEBACiAgICAgcHJpdmF0ZSBDb250ZW50UHJvdmlkZXJDbGllbnQgbVByb3ZpZGVyQ2xpZW50OwogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKICAgICAgICAgU0VTU0lPTl9CVU5ETEUucHV0U3RyaW5nKFNFU1NJT05fREFUQV9OQU1FXzEsIFNFU1NJT05fREFUQV9WQUxVRV8xKTsKIAogICAgICAgICAvLyBiaW5kIHRvIHRoZSBkaWFnbm9zdGljIHNlcnZpY2UgYW5kIHNldCBpdCB1cC4KICAgICAgICAgbUFjY291bnRNYW5hZ2VyID0gQWNjb3VudE1hbmFnZXIuZ2V0KGdldENvbnRleHQoKSk7Ci0gICAgICAgIENvbnRlbnRSZXNvbHZlciByZXNvbHZlciA9IGdldENvbnRleHQoKS5nZXRDb250ZW50UmVzb2x2ZXIoKTsKLSAgICAgICAgbVByb3ZpZGVyQ2xpZW50ID0gcmVzb2x2ZXIuYWNxdWlyZUNvbnRlbnRQcm92aWRlckNsaWVudCgKLSAgICAgICAgICAgICAgICBBdXRoZW50aWNhdG9yQ29udGVudFByb3ZpZGVyLkFVVEhPUklUWSk7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIFRoaXMgd2lsbCBpbnN0YWxsIGEgYnVuY2ggb2YgYWNjb3VudHMgb24gdGhlIGRldmljZQotICAgICAgICAgKiAoc2VlIEZpeHR1cmVzLmdldEZpeHR1cmVBY2NvdW50TmFtZXMoKSkuCi0gICAgICAgICAqLwotICAgICAgICBtUHJvdmlkZXJDbGllbnQuY2FsbChBdXRoZW50aWNhdG9yQ29udGVudFByb3ZpZGVyLk1FVEhPRF9TRVRVUCwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1Qcm92aWRlckNsaWVudC5jYWxsKEF1dGhlbnRpY2F0b3JDb250ZW50UHJvdmlkZXIuTUVUSE9EX1RFQVJET1dOLCBudWxsLCBudWxsKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIG1Qcm92aWRlckNsaWVudC5yZWxlYXNlKCk7Ci0gICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90aWZ5QWNjb3VudEF1dGhlbnRpY2F0ZWQoKSB7CkBAIC0yODgsOCArMjcyLDEzIEBACiAgICAgICogYXV0aGVudGljYXRvci4KICAgICAgKiBBbiBlbmNyeXB0ZWQgc2Vzc2lvbiBidW5kbGUgc2hvdWxkIGFsd2F5cyBiZSByZXR1cm5lZCB3aXRob3V0IHBhc3N3b3JkLgogICAgICAqLworICAgIC8vIFRPRE86IEVpdGhlciBhbGxvdyBpbnN0YW50IGFwcCB0byBleHBvc2UgY29udGVudCBwcm92aWRlciwgb3IgbW92ZSB0aGUgY29udGVudCBwcm92aWRlcgorICAgIC8vIG91dCBvZiB0aGUgdGVzdCBhcHAuCisgICAgQEFwcE1vZGVGdWxsCiAgICAgcHVibGljIHZvaWQgdGVzdFN0YXJ0QWRkQWNjb3VudFNlc3Npb24oKSB0aHJvd3MKICAgICAgICAgICAgIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uLCBBdXRoZW50aWNhdG9yRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgc2V0dXBBY2NvdW50cygpOworCiAgICAgICAgIFN0cmluZyBhY2NvdW50TmFtZSA9IEZpeHR1cmVzLlBSRUZJWF9OQU1FX1NVQ0NFU1MgKyAiQCIgKyBGaXh0dXJlcy5TVUZGSVhfTkFNRV9GSVhUVVJFOwogICAgICAgICBCdW5kbGUgb3B0aW9ucyA9IGNyZWF0ZU9wdGlvbnNXaXRoQWNjb3VudE5hbWUoYWNjb3VudE5hbWUpOwogCkBAIC0zMTMsNiArMzAyLDcgQEAKIAogICAgICAgICAvLyBWYWxpZGF0ZSByZXR1cm5lZCBkYXRhCiAgICAgICAgIHZhbGlkYXRlU2Vzc2lvbkJ1bmRsZUFuZFBhc3N3b3JkQW5kU3RhdHVzVG9rZW5SZXN1bHQocmVzdWx0KTsKKyAgICAgICAgcmVzZXRBY2NvdW50cygpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzIwLDggKzMxMCwxMyBAQAogICAgICAqIHRoZSBhdXRoZW50aWNhdG9yLgogICAgICAqIEFuIGVuY3J5cHRlZCBzZXNzaW9uIGJ1bmRsZSBzaG91bGQgYWx3YXlzIGJlIHJldHVybmVkIHdpdGhvdXQgcGFzc3dvcmQuCiAgICAgICovCisgICAgLy8gVE9ETzogRWl0aGVyIGFsbG93IGluc3RhbnQgYXBwIHRvIGV4cG9zZSBjb250ZW50IHByb3ZpZGVyLCBvciBtb3ZlIHRoZSBjb250ZW50IHByb3ZpZGVyCisgICAgLy8gb3V0IG9mIHRoZSB0ZXN0IGFwcC4KKyAgICBAQXBwTW9kZUZ1bGwKICAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhcnRVcGRhdGVDcmVkZW50aWFsc1Nlc3Npb24oKSB0aHJvd3MKICAgICAgICAgICAgIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uLCBBdXRoZW50aWNhdG9yRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgc2V0dXBBY2NvdW50cygpOworCiAgICAgICAgIFN0cmluZyBhY2NvdW50TmFtZSA9IEZpeHR1cmVzLlBSRUZJWF9OQU1FX1NVQ0NFU1MgKyAiQCIgKyBGaXh0dXJlcy5TVUZGSVhfTkFNRV9GSVhUVVJFOwogICAgICAgICBCdW5kbGUgb3B0aW9ucyA9IGNyZWF0ZU9wdGlvbnNXaXRoQWNjb3VudE5hbWUoYWNjb3VudE5hbWUpOwogCkBAIC0zNDQsNiArMzM5LDcgQEAKIAogICAgICAgICAvLyBWYWxpZGF0ZSByZXR1cm5lZCBkYXRhCiAgICAgICAgIHZhbGlkYXRlU2Vzc2lvbkJ1bmRsZUFuZFBhc3N3b3JkQW5kU3RhdHVzVG9rZW5SZXN1bHQocmVzdWx0KTsKKyAgICAgICAgcmVzZXRBY2NvdW50cygpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDQ2LDYgKzQ0MiwyNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIHNldHVwQWNjb3VudHMoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgQ29udGVudFJlc29sdmVyIHJlc29sdmVyID0gZ2V0Q29udGV4dCgpLmdldENvbnRlbnRSZXNvbHZlcigpOworICAgICAgICBtUHJvdmlkZXJDbGllbnQgPSByZXNvbHZlci5hY3F1aXJlQ29udGVudFByb3ZpZGVyQ2xpZW50KAorICAgICAgICAgICAgICAgIEF1dGhlbnRpY2F0b3JDb250ZW50UHJvdmlkZXIuQVVUSE9SSVRZKTsKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhpcyB3aWxsIGluc3RhbGwgYSBidW5jaCBvZiBhY2NvdW50cyBvbiB0aGUgZGV2aWNlCisgICAgICAgICAqIChzZWUgRml4dHVyZXMuZ2V0Rml4dHVyZUFjY291bnROYW1lcygpKS4KKyAgICAgICAgICovCisgICAgICAgIG1Qcm92aWRlckNsaWVudC5jYWxsKEF1dGhlbnRpY2F0b3JDb250ZW50UHJvdmlkZXIuTUVUSE9EX1NFVFVQLCBudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVzZXRBY2NvdW50cygpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgbVByb3ZpZGVyQ2xpZW50LmNhbGwoQXV0aGVudGljYXRvckNvbnRlbnRQcm92aWRlci5NRVRIT0RfVEVBUkRPV04sIG51bGwsIG51bGwpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgbVByb3ZpZGVyQ2xpZW50LnJlbGVhc2UoKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZVN0YXJ0QWRkQWNjb3VudFNlc3Npb25QYXJhbWV0ZXJzKEJ1bmRsZSBpbk9wdCkKICAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgICBCdW5kbGUgcGFyYW1zID0gbVByb3ZpZGVyQ2xpZW50LmNhbGwoQXV0aGVudGljYXRvckNvbnRlbnRQcm92aWRlci5NRVRIT0RfR0VULCBudWxsLCBudWxsKTsKQEAgLTQ4OCw0ICs1MDMsMyBAQAogICAgICAgICAgICAgICAgIHJlc3VsdC5nZXRTdHJpbmcoQWNjb3VudE1hbmFnZXIuS0VZX0FDQ09VTlRfU1RBVFVTX1RPS0VOKSk7CiAgICAgfQogfQotCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9hY2NvdW50cy9zcmMvYW5kcm9pZC9hY2NvdW50cy9jdHMvQWNjb3VudFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2FjY291bnRzL3NyYy9hbmRyb2lkL2FjY291bnRzL2N0cy9BY2NvdW50VGVzdC5qYXZhCmluZGV4IDY0YTE0MTUuLmJkM2ZjYmEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2FjY291bnRzL3NyYy9hbmRyb2lkL2FjY291bnRzL2N0cy9BY2NvdW50VGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2FjY291bnRzL3NyYy9hbmRyb2lkL2FjY291bnRzL2N0cy9BY2NvdW50VGVzdC5qYXZhCkBAIC00NCw2ICs0NCw4IEBACiAgICAgICAgIC8vIGFuZCB2ZXJpZnkgaXQgaXMgZXF1aXZhbGVudCB0byB0aGUgb3JpZ2luYWwgYWNjb3VudC4KICAgICAgICAgQWNjb3VudCBuZXdBY2NvdW50ID0gbmV3IEFjY291bnQocGFyY2VsKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKGFjY291bnQsIG5ld0FjY291bnQpOworCisgICAgICAgIHBhcmNlbC5yZWN5Y2xlKCk7CiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9hbGFybWNsb2NrL0FuZHJvaWQubWsgYi90ZXN0cy90ZXN0cy9hbGFybWNsb2NrL0FuZHJvaWQubWsKaW5kZXggYWRmZDUxZi4uZmViNTc5MiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvYWxhcm1jbG9jay9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3Rlc3RzL2FsYXJtY2xvY2svQW5kcm9pZC5tawpAQCAtMjEsNyArMjEsOSBAQAogIyBhbmQgd2hlbiBidWlsdCBleHBsaWNpdGx5IHB1dCBpdCBpbiB0aGUgZGF0YSBwYXJ0aXRpb24KIExPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCiAKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNBbGFybUNsb2NrQ29tbW9uIGN0c3Rlc3RydW5uZXIgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IEN0c0FsYXJtQ2xvY2tDb21tb24gY3RzdGVzdHJ1bm5lci1heHQgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQKKworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lci5zdHVicyBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicwogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2FsYXJtY2xvY2svQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL2FsYXJtY2xvY2svQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBjMDE5M2RkLi4xNWI0N2M0IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9hbGFybWNsb2NrL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvYWxhcm1jbG9jay9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0zNyw3ICszNyw3IEBACiAgICAgICAgIDwvYWN0aXZpdHk+CiAgICAgPC9hcHBsaWNhdGlvbj4KIAotICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuYWxhcm1jbG9jay5jdHMiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgdGVzdHMgb2YgYW5kcm9pZC5hbGFybWNsb2NrIj4KICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9Imxpc3RlbmVyIgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvYWxhcm1jbG9jay9jb21tb24vc3JjL2FuZHJvaWQvYWxhcm1jbG9jay9jb21tb24vVXRpbHMuamF2YSBiL3Rlc3RzL3Rlc3RzL2FsYXJtY2xvY2svY29tbW9uL3NyYy9hbmRyb2lkL2FsYXJtY2xvY2svY29tbW9uL1V0aWxzLmphdmEKaW5kZXggZDQ2OTU5Mi4uOGYwNGQyYSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvYWxhcm1jbG9jay9jb21tb24vc3JjL2FuZHJvaWQvYWxhcm1jbG9jay9jb21tb24vVXRpbHMuamF2YQorKysgYi90ZXN0cy90ZXN0cy9hbGFybWNsb2NrL2NvbW1vbi9zcmMvYW5kcm9pZC9hbGFybWNsb2NrL2NvbW1vbi9VdGlscy5qYXZhCkBAIC0yNCw4ICsyNCwxMCBAQAogCiAgICAgcHVibGljIGVudW0gVGVzdGNhc2VUeXBlIHsKICAgICAgICAgRElTTUlTU19BTEFSTSwKKyAgICAgICAgRElTTUlTU19USU1FUiwKICAgICAgICAgU0VUX0FMQVJNLAogICAgICAgICBTRVRfQUxBUk1fRk9SX0RJU01JU1NBTCwKKyAgICAgICAgU0VUX1RJTUVSX0ZPUl9ESVNNSVNTQUwsCiAgICAgICAgIFNOT09aRV9BTEFSTSwKICAgICB9CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVENBU0VfVFlQRSA9ICJUZXN0Y2FzZV90eXBlIjsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2FsYXJtY2xvY2svc2VydmljZS9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvYWxhcm1jbG9jay9zZXJ2aWNlL0FuZHJvaWQubWsKaW5kZXggMzg3M2RkYi4uZjY0Y2ZlNCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvYWxhcm1jbG9jay9zZXJ2aWNlL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvdGVzdHMvYWxhcm1jbG9jay9zZXJ2aWNlL0FuZHJvaWQubWsKQEAgLTIxLDcgKzIxLDcgQEAKICMgYW5kIHdoZW4gYnVpbHQgZXhwbGljaXRseSBwdXQgaXQgaW4gdGhlIGRhdGEgcGFydGl0aW9uCiBMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQogCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gQ3RzQWxhcm1DbG9ja0NvbW1vbiBjdHN0ZXN0cnVubmVyIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNBbGFybUNsb2NrQ29tbW9uIGN0c3Rlc3RydW5uZXItYXh0IGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0CiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvYWxhcm1jbG9jay9zZXJ2aWNlL3NyYy9hbmRyb2lkL2FsYXJtY2xvY2svc2VydmljZS9NYWluSW50ZXJhY3Rpb25TZXNzaW9uLmphdmEgYi90ZXN0cy90ZXN0cy9hbGFybWNsb2NrL3NlcnZpY2Uvc3JjL2FuZHJvaWQvYWxhcm1jbG9jay9zZXJ2aWNlL01haW5JbnRlcmFjdGlvblNlc3Npb24uamF2YQppbmRleCBlZGU3NjJhLi45OWMwYjZmIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9hbGFybWNsb2NrL3NlcnZpY2Uvc3JjL2FuZHJvaWQvYWxhcm1jbG9jay9zZXJ2aWNlL01haW5JbnRlcmFjdGlvblNlc3Npb24uamF2YQorKysgYi90ZXN0cy90ZXN0cy9hbGFybWNsb2NrL3NlcnZpY2Uvc3JjL2FuZHJvaWQvYWxhcm1jbG9jay9zZXJ2aWNlL01haW5JbnRlcmFjdGlvblNlc3Npb24uamF2YQpAQCAtNzgsMTIgKzc4LDIxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBBbGFybUNsb2NrLkFMQVJNX1NFQVJDSF9NT0RFX05FWFQpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogCisgICAgICAgICAgICBjYXNlIERJU01JU1NfVElNRVI6CisgICAgICAgICAgICAgICAgaW50ZW50ID0gbmV3IEludGVudChBbGFybUNsb2NrLkFDVElPTl9ESVNNSVNTX1RJTUVSKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKwogICAgICAgICAgICAgY2FzZSBTRVRfQUxBUk1fRk9SX0RJU01JU1NBTDoKICAgICAgICAgICAgIGNhc2UgU0VUX0FMQVJNOgogICAgICAgICAgICAgICAgIGludGVudCA9IG5ldyBJbnRlbnQoQWxhcm1DbG9jay5BQ1RJT05fU0VUX0FMQVJNKTsKICAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoQWxhcm1DbG9jay5FWFRSQV9IT1VSLCAxNCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKKyAgICAgICAgICAgIGNhc2UgU0VUX1RJTUVSX0ZPUl9ESVNNSVNTQUw6CisgICAgICAgICAgICAgICAgaW50ZW50ID0gbmV3IEludGVudChBbGFybUNsb2NrLkFDVElPTl9TRVRfVElNRVIpOworICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShBbGFybUNsb2NrLkVYVFJBX0xFTkdUSCwgMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgICAgIGNhc2UgU05PT1pFX0FMQVJNOgogICAgICAgICAgICAgICAgIGludGVudCA9IG5ldyBJbnRlbnQoQWxhcm1DbG9jay5BQ1RJT05fU05PT1pFX0FMQVJNKTsKICAgICAgICAgICAgICAgICBicmVhazsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2FsYXJtY2xvY2svc3JjL2FuZHJvaWQvYWxhcm1jbG9jay9jdHMvQWxhcm1DbG9ja1Rlc3RCYXNlLmphdmEgYi90ZXN0cy90ZXN0cy9hbGFybWNsb2NrL3NyYy9hbmRyb2lkL2FsYXJtY2xvY2svY3RzL0FsYXJtQ2xvY2tUZXN0QmFzZS5qYXZhCmluZGV4IDIyNGM4YWIuLjY5ZjE5YjkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2FsYXJtY2xvY2svc3JjL2FuZHJvaWQvYWxhcm1jbG9jay9jdHMvQWxhcm1DbG9ja1Rlc3RCYXNlLmphdmEKKysrIGIvdGVzdHMvdGVzdHMvYWxhcm1jbG9jay9zcmMvYW5kcm9pZC9hbGFybWNsb2NrL2N0cy9BbGFybUNsb2NrVGVzdEJhc2UuamF2YQpAQCAtODksMTEgKzg5LDE5IEBACiAgICAgICAgICAgICAgIGludGVudCA9IG5ldyBJbnRlbnQoQWxhcm1DbG9jay5BQ1RJT05fRElTTUlTU19BTEFSTSk7CiAgICAgICAgICAgICAgIGJyZWFrOwogCisgICAgICAgICAgY2FzZSBESVNNSVNTX1RJTUVSOgorICAgICAgICAgICAgICBpbnRlbnQgPSBuZXcgSW50ZW50KEFsYXJtQ2xvY2suQUNUSU9OX0RJU01JU1NfVElNRVIpOworICAgICAgICAgICAgICBicmVhazsKKwogICAgICAgICAgIGNhc2UgU0VUX0FMQVJNOgogICAgICAgICAgIGNhc2UgU0VUX0FMQVJNX0ZPUl9ESVNNSVNTQUw6CiAgICAgICAgICAgICAgIGludGVudCA9IG5ldyBJbnRlbnQoQWxhcm1DbG9jay5BQ1RJT05fU0VUX0FMQVJNKTsKICAgICAgICAgICAgICAgYnJlYWs7CiAKKyAgICAgICAgICBjYXNlIFNFVF9USU1FUl9GT1JfRElTTUlTU0FMOgorICAgICAgICAgICAgICBpbnRlbnQgPSBuZXcgSW50ZW50KEFsYXJtQ2xvY2suQUNUSU9OX1NFVF9USU1FUik7CisgICAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgICAgY2FzZSBTTk9PWkVfQUxBUk06CiAgICAgICAgICAgICAgIGludGVudCA9IG5ldyBJbnRlbnQoQWxhcm1DbG9jay5BQ1RJT05fU05PT1pFX0FMQVJNKTsKICAgICAgICAgICAgICAgYnJlYWs7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9hbGFybWNsb2NrL3NyYy9hbmRyb2lkL2FsYXJtY2xvY2svY3RzL0Rpc21pc3NUaW1lclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2FsYXJtY2xvY2svc3JjL2FuZHJvaWQvYWxhcm1jbG9jay9jdHMvRGlzbWlzc1RpbWVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YzBkMGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9hbGFybWNsb2NrL3NyYy9hbmRyb2lkL2FsYXJtY2xvY2svY3RzL0Rpc21pc3NUaW1lclRlc3QuamF2YQpAQCAtMCwwICsxLDM4IEBACitwYWNrYWdlIGFuZHJvaWQuYWxhcm1jbG9jay5jdHM7CisKK2ltcG9ydCBhbmRyb2lkLmFsYXJtY2xvY2suY29tbW9uLlV0aWxzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOworCitwdWJsaWMgY2xhc3MgRGlzbWlzc1RpbWVyVGVzdCBleHRlbmRzIEFsYXJtQ2xvY2tUZXN0QmFzZSB7CisKKyAgICBwcml2YXRlIGludCBtU2F2ZWRWb2x1bWU7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworCisgICAgICAgIC8vIFRoZSB0aW1lciBtYXkgcmluZyBiZXR3ZWVuIGV4cGlyYXRpb24gYW5kIGRpc21pc3NhbDsgc2lsZW5jZSB0aGlzLgorICAgICAgICBmaW5hbCBBdWRpb01hbmFnZXIgYXVkaW9NYW5hZ2VyID0gKEF1ZGlvTWFuYWdlcikgZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VGFyZ2V0Q29udGV4dCgpCisgICAgICAgICAgICAgICAgLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BVURJT19TRVJWSUNFKTsKKyAgICAgICAgbVNhdmVkVm9sdW1lID0gYXVkaW9NYW5hZ2VyLmdldFN0cmVhbVZvbHVtZShBdWRpb01hbmFnZXIuU1RSRUFNX0FMQVJNKTsKKyAgICAgICAgYXVkaW9NYW5hZ2VyLnNldFN0cmVhbVZvbHVtZShBdWRpb01hbmFnZXIuU1RSRUFNX0FMQVJNLCAwLCAwKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgICAgICBmaW5hbCBBdWRpb01hbmFnZXIgYXVkaW9NYW5hZ2VyID0gKEF1ZGlvTWFuYWdlcikgZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VGFyZ2V0Q29udGV4dCgpCisgICAgICAgICAgICAgICAgLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BVURJT19TRVJWSUNFKTsKKyAgICAgICAgYXVkaW9NYW5hZ2VyLnNldFN0cmVhbVZvbHVtZShBdWRpb01hbmFnZXIuU1RSRUFNX0FMQVJNLCBtU2F2ZWRWb2x1bWUsIDApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFV0aWxzLkNPTVBMRVRJT05fUkVTVUxULCBydW5UZXN0KFV0aWxzLlRlc3RjYXNlVHlwZS5TRVRfVElNRVJfRk9SX0RJU01JU1NBTCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDUwMDApOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZ25vcmVkKSB7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKFV0aWxzLkNPTVBMRVRJT05fUkVTVUxULCBydW5UZXN0KFV0aWxzLlRlc3RjYXNlVHlwZS5ESVNNSVNTX1RJTUVSKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvYW5pbWF0aW9uL0FuZHJvaWQubWsgYi90ZXN0cy90ZXN0cy9hbmltYXRpb24vQW5kcm9pZC5tawppbmRleCBjNjI1Y2JlLi5iNWViNzkxIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9hbmltYXRpb24vQW5kcm9pZC5taworKysgYi90ZXN0cy90ZXN0cy9hbmltYXRpb24vQW5kcm9pZC5tawpAQCAtMjUsMTkgKzI1LDIxIEBACiBMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQogCiBMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgKz0gXAotICAgIGFuZHJvaWQtc3VwcG9ydC10ZXN0IFwKKyAgICBhbmRyb2lkeC50ZXN0LnJ1bGVzIFwKICAgICBtb2NraXRvLXRhcmdldC1taW51cy1qdW5pdDQgXAogICAgIGFuZHJvaWQtY29tbW9uIFwKLSAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsIFwKLSAgICBjdHN0ZXN0cnVubmVyIFwKLSAgICBwbGF0Zm9ybS10ZXN0LWFubm90YXRpb25zIFwKLSAgICBsZWdhY3ktYW5kcm9pZC10ZXN0CisgICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgXAorICAgIGN0c3Rlc3RydW5uZXItYXh0IFwKKyAgICBwbGF0Zm9ybS10ZXN0LWFubm90YXRpb25zCiAKLUxPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIuc3R1YnMKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogCiAjIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0Ci1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMgY3RzX2luc3RhbnQKKworIyBFbmZvcmNlIHB1YmxpYyAvIHRlc3QgYXBpIG9ubHkKK0xPQ0FMX1NES19WRVJTSU9OIDo9IHRlc3RfY3VycmVudAogCiBpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9hbmltYXRpb24vQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL2FuaW1hdGlvbi9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDhjNTk5YjcuLjZlODcwNGUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2FuaW1hdGlvbi9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL2FuaW1hdGlvbi9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0xNSw3ICsxNSw4IEBACiAtLT4KIAogPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBwYWNrYWdlPSJhbmRyb2lkLmFuaW1hdGlvbi5jdHMiPgorICAgIHBhY2thZ2U9ImFuZHJvaWQuYW5pbWF0aW9uLmN0cyIKKyAgICBhbmRyb2lkOnRhcmdldFNhbmRib3hWZXJzaW9uPSIyIj4KICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkRJU0FCTEVfS0VZR1VBUkQiIC8+CiAgICAgPGFwcGxpY2F0aW9uPgogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFuaW1hdGlvbi5jdHMuQW5pbWF0aW9uQWN0aXZpdHkiCkBAIC0yNyw3ICsyOCw3IEBACiAgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgogICAgIDwvYXBwbGljYXRpb24+CiAKLSAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmFuaW1hdGlvbi5jdHMiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgdGVzdHMgZm9yIGFuZHJvaWQuYW5pbWF0aW9uIHBhY2thZ2UiPgogICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0ibGlzdGVuZXIiCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9hbmltYXRpb24vc3JjL2FuZHJvaWQvYW5pbWF0aW9uL2N0cy9BbmltYXRvckxpc3RlbmVyQWRhcHRlclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2FuaW1hdGlvbi9zcmMvYW5kcm9pZC9hbmltYXRpb24vY3RzL0FuaW1hdG9yTGlzdGVuZXJBZGFwdGVyVGVzdC5qYXZhCmluZGV4IGNiODdmMjkuLmZiMWQwN2EgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2FuaW1hdGlvbi9zcmMvYW5kcm9pZC9hbmltYXRpb24vY3RzL0FuaW1hdG9yTGlzdGVuZXJBZGFwdGVyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2FuaW1hdGlvbi9zcmMvYW5kcm9pZC9hbmltYXRpb24vY3RzL0FuaW1hdG9yTGlzdGVuZXJBZGFwdGVyVGVzdC5qYXZhCkBAIC0xNiw4ICsxNiw5IEBACiBwYWNrYWdlIGFuZHJvaWQuYW5pbWF0aW9uLmN0czsKIAogaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yTGlzdGVuZXJBZGFwdGVyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvYW5pbWF0aW9uL3NyYy9hbmRyb2lkL2FuaW1hdGlvbi9jdHMvQW5pbWF0b3JTZXRUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9hbmltYXRpb24vc3JjL2FuZHJvaWQvYW5pbWF0aW9uL2N0cy9BbmltYXRvclNldFRlc3QuamF2YQppbmRleCA4YTVlOTc0Li42ODg4YTMwIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9hbmltYXRpb24vc3JjL2FuZHJvaWQvYW5pbWF0aW9uL2N0cy9BbmltYXRvclNldFRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9hbmltYXRpb24vc3JjL2FuZHJvaWQvYW5pbWF0aW9uL2N0cy9BbmltYXRvclNldFRlc3QuamF2YQpAQCAtMzUsMTUgKzM1LDE2IEBACiBpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uVGltZUludGVycG9sYXRvcjsKIGltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5WYWx1ZUFuaW1hdG9yOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFjY2VsZXJhdGVEZWNlbGVyYXRlSW50ZXJwb2xhdG9yOwogaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQWNjZWxlcmF0ZUludGVycG9sYXRvcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkxpbmVhckludGVycG9sYXRvcjsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvYW5pbWF0aW9uL3NyYy9hbmRyb2lkL2FuaW1hdGlvbi9jdHMvQW5pbWF0b3JUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9hbmltYXRpb24vc3JjL2FuZHJvaWQvYW5pbWF0aW9uL2N0cy9BbmltYXRvclRlc3QuamF2YQppbmRleCA2NTVlYjFjLi5iMzhjNDM0IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9hbmltYXRpb24vc3JjL2FuZHJvaWQvYW5pbWF0aW9uL2N0cy9BbmltYXRvclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9hbmltYXRpb24vc3JjL2FuZHJvaWQvYW5pbWF0aW9uL2N0cy9BbmltYXRvclRlc3QuamF2YQpAQCAtMjcsMTMgKzI3LDE0IEBACiBpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uVmFsdWVBbmltYXRvcjsKIGltcG9ydCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQWNjZWxlcmF0ZUludGVycG9sYXRvcjsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2FuaW1hdGlvbi9zcmMvYW5kcm9pZC9hbmltYXRpb24vY3RzL0NyZWF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvYW5pbWF0aW9uL3NyYy9hbmRyb2lkL2FuaW1hdGlvbi9jdHMvQ3JlYXRpb25UZXN0LmphdmEKaW5kZXggNWJkZDJhNi4uOTIyYWE0MCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvYW5pbWF0aW9uL3NyYy9hbmRyb2lkL2FuaW1hdGlvbi9jdHMvQ3JlYXRpb25UZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvYW5pbWF0aW9uL3NyYy9hbmRyb2lkL2FuaW1hdGlvbi9jdHMvQ3JlYXRpb25UZXN0LmphdmEKQEAgLTIxLDExICsyMSwxMiBAQAogaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9ySW5mbGF0ZXI7CiBpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uT2JqZWN0QW5pbWF0b3I7CiBpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uVmFsdWVBbmltYXRvcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvYW5pbWF0aW9uL3NyYy9hbmRyb2lkL2FuaW1hdGlvbi9jdHMvRXZhbHVhdG9yVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvYW5pbWF0aW9uL3NyYy9hbmRyb2lkL2FuaW1hdGlvbi9jdHMvRXZhbHVhdG9yVGVzdC5qYXZhCmluZGV4IDBlOWE0NjIuLjhiZWM1ZjggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2FuaW1hdGlvbi9zcmMvYW5kcm9pZC9hbmltYXRpb24vY3RzL0V2YWx1YXRvclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9hbmltYXRpb24vc3JjL2FuZHJvaWQvYW5pbWF0aW9uL2N0cy9FdmFsdWF0b3JUZXN0LmphdmEKQEAgLTI5LDggKzI5LDkgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnRGOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2FuaW1hdGlvbi9zcmMvYW5kcm9pZC9hbmltYXRpb24vY3RzL0ludGVycG9sYXRvclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2FuaW1hdGlvbi9zcmMvYW5kcm9pZC9hbmltYXRpb24vY3RzL0ludGVycG9sYXRvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2RjODI0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvYW5pbWF0aW9uL3NyYy9hbmRyb2lkL2FuaW1hdGlvbi9jdHMvSW50ZXJwb2xhdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLmFuaW1hdGlvbi5jdHM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uVXRpbHM7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3I7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKKworQE1lZGl1bVRlc3QKK0BSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgSW50ZXJwb2xhdG9yVGVzdCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgRVBTSUxPTiA9IDAuMDAwMDFmOworICAgIHByaXZhdGUgQW5pbWF0aW9uQWN0aXZpdHkgbUFjdGl2aXR5OworCisgICAgQFJ1bGUKKyAgICBwdWJsaWMgQWN0aXZpdHlUZXN0UnVsZTxBbmltYXRpb25BY3Rpdml0eT4gbUFjdGl2aXR5UnVsZSA9CisgICAgICAgICAgICBuZXcgQWN0aXZpdHlUZXN0UnVsZTw+KEFuaW1hdGlvbkFjdGl2aXR5LmNsYXNzKTsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXR1cCgpIHsKKyAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkuc2V0SW5Ub3VjaE1vZGUoZmFsc2UpOworICAgICAgICBtQWN0aXZpdHkgPSBtQWN0aXZpdHlSdWxlLmdldEFjdGl2aXR5KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmFzdE91dEV4dHJhU2xvd0luKCkgeworICAgICAgICBJbnRlcnBvbGF0b3IgaW50ZXJwb2xhdG9yID0gQW5pbWF0aW9uVXRpbHMubG9hZEludGVycG9sYXRvcihtQWN0aXZpdHksCisgICAgICAgICAgICAgICAgYW5kcm9pZC5SLmludGVycG9sYXRvci5mYXN0X291dF9leHRyYV9zbG93X2luKTsKKyAgICAgICAgZmxvYXQgdHVybmluZ1BvaW50WCA9IDAuMTY2NjY2ZjsKKyAgICAgICAgZmxvYXQgdHVybmluZ1BvaW50WSA9IDAuNGY7CisKKyAgICAgICAgLy8gVGVzdCB0aGF0IHRoZSBpbnRlcnBvbGF0b3Igc3RhcnRzIGF0ICgwLCAwKSBhbmQgZW5kcyBhdCAoMSwgMSkKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDBmLCBpbnRlcnBvbGF0b3IuZ2V0SW50ZXJwb2xhdGlvbigwKSwgRVBTSUxPTik7CisgICAgICAgIGFzc2VydEVxdWFscygxZiwgaW50ZXJwb2xhdG9yLmdldEludGVycG9sYXRpb24oMSksIEVQU0lMT04pOworCisgICAgICAgIC8vIFRlc3QgdGhhdCB3aGVuIGR1cmF0aW9uIGlzIGF0IDEvNiBvZiB0aGUgdG90YWwgZHVyYXRpb24sIHRoZSBpbnRlcnBvbGF0aW9uIGlzIDAuNCwgcGVyCisgICAgICAgIC8vIGludGVycG9sYXRvciBzcGVjLgorICAgICAgICBhc3NlcnRFcXVhbHModHVybmluZ1BvaW50WSwgaW50ZXJwb2xhdG9yLmdldEludGVycG9sYXRpb24odHVybmluZ1BvaW50WCksIEVQU0lMT04pOworCisgICAgICAgIC8vIFRlc3QgdGhhdCB0aGUgZmlyc3Qgc2VnbWVudCBvZiB0aGUgY3VydmUgKGkuZS4gZnJhY3Rpb24gaW4gKDAsIDAuMTY2NjY2KSkgaXMgYmVsb3cgdGhlCisgICAgICAgIC8vIGxpbmUgZm9ybWVkIHdpdGggcG9pbnQgKDAsIDApIGFuZCAoMC4xNjY2NjYsIDAuNCkKKyAgICAgICAgZm9yIChmbG9hdCBmcmFjdGlvbiA9IEVQU0lMT047IGZyYWN0aW9uIDwgdHVybmluZ1BvaW50WDsgZnJhY3Rpb24gKz0gMC4wNWYpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoaW50ZXJwb2xhdG9yLmdldEludGVycG9sYXRpb24oZnJhY3Rpb24pCisgICAgICAgICAgICAgICAgICAgIDwgZnJhY3Rpb24gLyB0dXJuaW5nUG9pbnRYICogdHVybmluZ1BvaW50WSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBUZXN0IHRoYXQgdGhlIHNlY29uZCBzZWdtZW50IG9mIHRoZSBjdXJ2ZSAoaS5lLiBmcmFjdGlvbiBpbiAoMC4xNjY2NjYsIDEpKSBpcyBhYm92ZQorICAgICAgICAvLyB0aGUgbGluZSBmb3JtZWQgd2l0aCBwb2ludCAoMC4xNjY2NjYsIDAuNCkgYW5kICgxLCAxKQorICAgICAgICBmb3IgKGZsb2F0IGZyYWN0aW9uID0gdHVybmluZ1BvaW50WCArIEVQU0lMT047IGZyYWN0aW9uIDwgMWY7IGZyYWN0aW9uICs9IDAuMDVmKSB7CisgICAgICAgICAgICBmbG9hdCB2YWx1ZSA9IGludGVycG9sYXRvci5nZXRJbnRlcnBvbGF0aW9uKGZyYWN0aW9uKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoKHZhbHVlIC0gdHVybmluZ1BvaW50WSkgLyAoZnJhY3Rpb24gLSB0dXJuaW5nUG9pbnRYKQorICAgICAgICAgICAgICAgICAgICA+ICgxZiAtIHR1cm5pbmdQb2ludFkpIC8gKDFmIC0gdHVybmluZ1BvaW50WCkpOworICAgICAgICB9CisgICAgICAgIC8vIFRoZSBjdXJ2ZSBuZWVkcyB0byBwYXNzIHRoZSB0dXJuaW5nIHBvaW50LgorICAgICAgICBhc3NlcnRFcXVhbHModHVybmluZ1BvaW50WSwgaW50ZXJwb2xhdG9yLmdldEludGVycG9sYXRpb24odHVybmluZ1BvaW50WCksIEVQU0lMT04pOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvYW5pbWF0aW9uL3NyYy9hbmRyb2lkL2FuaW1hdGlvbi9jdHMvS2V5ZnJhbWVUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9hbmltYXRpb24vc3JjL2FuZHJvaWQvYW5pbWF0aW9uL2N0cy9LZXlmcmFtZVRlc3QuamF2YQppbmRleCAxMDcyNDg3Li5iM2ExZDg0IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9hbmltYXRpb24vc3JjL2FuZHJvaWQvYW5pbWF0aW9uL2N0cy9LZXlmcmFtZVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9hbmltYXRpb24vc3JjL2FuZHJvaWQvYW5pbWF0aW9uL2N0cy9LZXlmcmFtZVRlc3QuamF2YQpAQCAtMjEsMTAgKzIxLDExIEBACiAKIGltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5LZXlmcmFtZTsKIGltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5UaW1lSW50ZXJwb2xhdG9yOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQWNjZWxlcmF0ZUludGVycG9sYXRvcjsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvYW5pbWF0aW9uL3NyYy9hbmRyb2lkL2FuaW1hdGlvbi9jdHMvTGF5b3V0QW5pbWF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvYW5pbWF0aW9uL3NyYy9hbmRyb2lkL2FuaW1hdGlvbi9jdHMvTGF5b3V0QW5pbWF0aW9uVGVzdC5qYXZhCmluZGV4IGRhMDg5MjkuLmJhMWNjNDcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2FuaW1hdGlvbi9zcmMvYW5kcm9pZC9hbmltYXRpb24vY3RzL0xheW91dEFuaW1hdGlvblRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9hbmltYXRpb24vc3JjL2FuZHJvaWQvYW5pbWF0aW9uL2N0cy9MYXlvdXRBbmltYXRpb25UZXN0LmphdmEKQEAgLTI3LDE2ICsyNywxNyBAQAogaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLlByb3BlcnR5VmFsdWVzSG9sZGVyOwogaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLlRpbWVJbnRlcnBvbGF0b3I7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BY2NlbGVyYXRlSW50ZXJwb2xhdG9yOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvYW5pbWF0aW9uL3NyYy9hbmRyb2lkL2FuaW1hdGlvbi9jdHMvT2JqZWN0QW5pbWF0b3JUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9hbmltYXRpb24vc3JjL2FuZHJvaWQvYW5pbWF0aW9uL2N0cy9PYmplY3RBbmltYXRvclRlc3QuamF2YQppbmRleCBmMTliMTc3Li5iYTQ1ZDk5IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9hbmltYXRpb24vc3JjL2FuZHJvaWQvYW5pbWF0aW9uL2N0cy9PYmplY3RBbmltYXRvclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9hbmltYXRpb24vc3JjL2FuZHJvaWQvYW5pbWF0aW9uL2N0cy9PYmplY3RBbmltYXRvclRlc3QuamF2YQpAQCAtMzgsMTUgKzM4LDE2IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYXRoOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnRGOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuUHJvcGVydHk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BY2NlbGVyYXRlSW50ZXJwb2xhdG9yOwogaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uSW50ZXJwb2xhdG9yOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2FuaW1hdGlvbi9zcmMvYW5kcm9pZC9hbmltYXRpb24vY3RzL1Byb3BlcnR5VmFsdWVzSG9sZGVyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvYW5pbWF0aW9uL3NyYy9hbmRyb2lkL2FuaW1hdGlvbi9jdHMvUHJvcGVydHlWYWx1ZXNIb2xkZXJUZXN0LmphdmEKaW5kZXggM2I4MjdlYy4uYzgyYmU4ZSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvYW5pbWF0aW9uL3NyYy9hbmRyb2lkL2FuaW1hdGlvbi9jdHMvUHJvcGVydHlWYWx1ZXNIb2xkZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvYW5pbWF0aW9uL3NyYy9hbmRyb2lkL2FuaW1hdGlvbi9jdHMvUHJvcGVydHlWYWx1ZXNIb2xkZXJUZXN0LmphdmEKQEAgLTM3LDE1ICszNywxNiBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnRGOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU2hhcGVEcmF3YWJsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTGFyZ2VUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuRmxvYXRQcm9wZXJ0eTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuUHJvcGVydHk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BY2NlbGVyYXRlSW50ZXJwb2xhdG9yOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTGFyZ2VUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvYW5pbWF0aW9uL3NyYy9hbmRyb2lkL2FuaW1hdGlvbi9jdHMvVmFsdWVBbmltYXRvclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2FuaW1hdGlvbi9zcmMvYW5kcm9pZC9hbmltYXRpb24vY3RzL1ZhbHVlQW5pbWF0b3JUZXN0LmphdmEKaW5kZXggNTliOGU1ZGIuLmY3ZDdmNTcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2FuaW1hdGlvbi9zcmMvYW5kcm9pZC9hbmltYXRpb24vY3RzL1ZhbHVlQW5pbWF0b3JUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvYW5pbWF0aW9uL3NyYy9hbmRyb2lkL2FuaW1hdGlvbi9jdHMvVmFsdWVBbmltYXRvclRlc3QuamF2YQpAQCAtMzcsMTQgKzM3LDE1IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvaW50RjsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTGFyZ2VUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFjY2VsZXJhdGVJbnRlcnBvbGF0b3I7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5MaW5lYXJJbnRlcnBvbGF0b3I7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLkxhcmdlVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkFmdGVyQ2xhc3M7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9hcHAudXNhZ2UvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL2FwcC51c2FnZS9BbmRyb2lkLm1rCmluZGV4IGY4YTgwOTIuLjM4YTRmYjQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2FwcC51c2FnZS9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3Rlc3RzL2FwcC51c2FnZS9BbmRyb2lkLm1rCkBAIC0xNyw2ICsxNyw3IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c1VzYWdlU3RhdHNUZXN0Q2FzZXMKK0xPQ0FMX1BSSVZBVEVfUExBVEZPUk1fQVBJUyA6PSB0cnVlCiAKICMgZG9uJ3QgaW5jbHVkZSB0aGlzIHBhY2thZ2UgaW4gYW55IHRhcmdldAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKQEAgLTI1LDE2ICsyNiwxNyBAQAogTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKIAogTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKLSAgICBhbmRyb2lkLXN1cHBvcnQtdGVzdCBcCi0gICAgY3RzdGVzdHJ1bm5lciBcCisgICAgYW5kcm9pZHgudGVzdC5ydWxlcyBcCisgICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgXAorICAgIGN0c3Rlc3RydW5uZXItYXh0IFwKICAgICBqdW5pdCBcCi0gICAgbGVnYWN5LWFuZHJvaWQtdGVzdCBcCi0gICAgdWItdWlhdXRvbWF0b3IgXAotICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwKKyAgICB1Yi11aWF1dG9tYXRvcgorCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicyBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIAogIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzIGN0c19pbnN0YW50CiAKIGluY2x1ZGUgJChCVUlMRF9DVFNfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2FwcC51c2FnZS9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdGVzdHMvYXBwLnVzYWdlL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggNDYyNzM2YS4uMWVhZTg0NyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvYXBwLnVzYWdlL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvYXBwLnVzYWdlL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTE2LDkgKzE2LDEyIEBACiAgLS0+CiAKIDxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgcGFja2FnZT0iYW5kcm9pZC5hcHAudXNhZ2UuY3RzIj4KKyAgICBwYWNrYWdlPSJhbmRyb2lkLmFwcC51c2FnZS5jdHMiIGFuZHJvaWQ6dGFyZ2V0U2FuZGJveFZlcnNpb249IjIiPgogCisgICAgPCEtLSBXZSBjYW4ndCBoYXZlIHRoZSB0ZXN0IGZyYW1ld29yayB0dXJuIG9mZiB0aGUga2V5Z3VhcmQsIGJlY2F1c2UgdGhhdCB3aWxsCisgICAgICAgICBwcmV2ZW50IHVzIGZyb20gdGVzdGluZyBpbnRlcmFjdGlvbnMgd2l0aCBpdC4KICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkRJU0FCTEVfS0VZR1VBUkQiIC8+CisgICAgLS0+CiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5QQUNLQUdFX1VTQUdFX1NUQVRTIiAvPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uU0VUX1RJTUUiIC8+CiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5JTlRFUk5FVCIgLz4KQEAgLTI2LDggKzI5LDkgQEAKICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkFDQ0VTU19ORVRXT1JLX1NUQVRFIiAvPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVBRF9QSE9ORV9TVEFURSIgLz4KIAotICAgIDxhcHBsaWNhdGlvbj4KLSAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6dXNlc0NsZWFydGV4dFRyYWZmaWM9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOm5ldHdvcmtTZWN1cml0eUNvbmZpZz0iQHhtbC9uZXR3b3JrX3NlY3VyaXR5X2NvbmZpZyI+CisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIi8+CiAKICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLkFjdGl2aXRpZXMkQWN0aXZpdHlPbmUiIC8+CiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5BY3Rpdml0aWVzJEFjdGl2aXR5VHdvIiAvPgpAQCAtMzcsNyArNDEsNyBAQAogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuRnJhZ21lbnRUZXN0QWN0aXZpdHkiIC8+CiAgICAgPC9hcHBsaWNhdGlvbj4KIAotICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuYXBwLnVzYWdlLmN0cyIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBvZiBhbmRyb2lkLmFwcC51c2FnZSI+CiAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJsaXN0ZW5lciIKQEAgLTQ1LDQgKzQ5LDMgQEAKICAgICA8L2luc3RydW1lbnRhdGlvbj4KIAogPC9tYW5pZmVzdD4KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvYXBwLnVzYWdlL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL2FwcC51c2FnZS9BbmRyb2lkVGVzdC54bWwKaW5kZXggODg2OGMxNy4uZjQ4NDA3NSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvYXBwLnVzYWdlL0FuZHJvaWRUZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9hcHAudXNhZ2UvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlndXJhdGlvbiBmb3IgYXBwLnVzYWdlIFRlc3RzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iZnJhbWV3b3JrIiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CkBAIC0yMiw1ICsyMyw2IEBACiAgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkFuZHJvaWRKVW5pdFRlc3QiID4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJwYWNrYWdlIiB2YWx1ZT0iYW5kcm9pZC5hcHAudXNhZ2UuY3RzIiAvPgogICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjFtNDdzIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImhpZGRlbi1hcGktY2hlY2tzIiB2YWx1ZT0iZmFsc2UiIC8+CiAgICAgPC90ZXN0PgogPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvYXBwLnVzYWdlL3Jlcy9kcmF3YWJsZS9pY19ub3RpZmljYXRpb24ucG5nIGIvdGVzdHMvdGVzdHMvYXBwLnVzYWdlL3Jlcy9kcmF3YWJsZS9pY19ub3RpZmljYXRpb24ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhZTU3MGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9hcHAudXNhZ2UvcmVzL2RyYXdhYmxlL2ljX25vdGlmaWNhdGlvbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvYXBwLnVzYWdlL3Jlcy94bWwvbmV0d29ya19zZWN1cml0eV9jb25maWcueG1sIGIvdGVzdHMvdGVzdHMvYXBwLnVzYWdlL3Jlcy94bWwvbmV0d29ya19zZWN1cml0eV9jb25maWcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MWNjN2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9hcHAudXNhZ2UvcmVzL3htbC9uZXR3b3JrX3NlY3VyaXR5X2NvbmZpZy54bWwKQEAgLTAsMCArMSwyMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPG5ldHdvcmstc2VjdXJpdHktY29uZmlnPgorICAgIDxkb21haW4tY29uZmlnIGNsZWFydGV4dFRyYWZmaWNQZXJtaXR0ZWQ9InRydWUiPgorICAgICAgICA8ZG9tYWluIGluY2x1ZGVTdWJkb21haW5zPSJ0cnVlIj53d3cuMjY1LmNvbTwvZG9tYWluPgorICAgIDwvZG9tYWluLWNvbmZpZz4KKzwvbmV0d29yay1zZWN1cml0eS1jb25maWc+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9hcHAudXNhZ2Uvc3JjL2FuZHJvaWQvYXBwL3VzYWdlL2N0cy9OZXR3b3JrVXNhZ2VTdGF0c1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2FwcC51c2FnZS9zcmMvYW5kcm9pZC9hcHAvdXNhZ2UvY3RzL05ldHdvcmtVc2FnZVN0YXRzVGVzdC5qYXZhCmluZGV4IGI0NzVjZWEuLmZlOGNkNmUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2FwcC51c2FnZS9zcmMvYW5kcm9pZC9hcHAvdXNhZ2UvY3RzL05ldHdvcmtVc2FnZVN0YXRzVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2FwcC51c2FnZS9zcmMvYW5kcm9pZC9hcHAvdXNhZ2UvY3RzL05ldHdvcmtVc2FnZVN0YXRzVGVzdC5qYXZhCkBAIC0zMiw5ICszMiwxMSBAQAogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3I7CiBpbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5UZWxlcGhvbnlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuU3lzdGVtVXRpbDsKIAogaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC00MiwxMiArNDQsMjUgQEAKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwogaW1wb3J0IGphdmEubmV0LlVSTDsKIGltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5TY2FubmVyOwogaW1wb3J0IGphdmEubmV0Lkh0dHBVUkxDb25uZWN0aW9uOwogCiBpbXBvcnQgbGliY29yZS5pby5Jb1V0aWxzOwogaW1wb3J0IGxpYmNvcmUuaW8uU3RyZWFtczsKIAoraW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC51c2FnZS5OZXR3b3JrU3RhdHMuQnVja2V0LkRFRkFVTFRfTkVUV09SS19BTEw7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLnVzYWdlLk5ldHdvcmtTdGF0cy5CdWNrZXQuREVGQVVMVF9ORVRXT1JLX05POworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC51c2FnZS5OZXR3b3JrU3RhdHMuQnVja2V0LkRFRkFVTFRfTkVUV09SS19ZRVM7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLnVzYWdlLk5ldHdvcmtTdGF0cy5CdWNrZXQuTUVURVJFRF9BTEw7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLnVzYWdlLk5ldHdvcmtTdGF0cy5CdWNrZXQuTUVURVJFRF9ZRVM7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLnVzYWdlLk5ldHdvcmtTdGF0cy5CdWNrZXQuTUVURVJFRF9OTzsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAudXNhZ2UuTmV0d29ya1N0YXRzLkJ1Y2tldC5TVEFURV9BTEw7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLnVzYWdlLk5ldHdvcmtTdGF0cy5CdWNrZXQuU1RBVEVfREVGQVVMVDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAudXNhZ2UuTmV0d29ya1N0YXRzLkJ1Y2tldC5TVEFURV9GT1JFR1JPVU5EOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC51c2FnZS5OZXR3b3JrU3RhdHMuQnVja2V0LlRBR19OT05FOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC51c2FnZS5OZXR3b3JrU3RhdHMuQnVja2V0LlVJRF9BTEw7CisKIHB1YmxpYyBjbGFzcyBOZXR3b3JrVXNhZ2VTdGF0c1Rlc3QgZXh0ZW5kcyBJbnN0cnVtZW50YXRpb25UZXN0Q2FzZSB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiTmV0d29ya1VzYWdlU3RhdHNUZXN0IjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQT1BTX1NFVF9TSEVMTF9DT01NQU5EID0gImFwcG9wcyBzZXQgezB9IHsxfSB7Mn0iOwpAQCAtNjIsMjAgKzc3LDM2IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5FVFdPUktfVEFHID0gMHhmMDBkOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVEhSRVNIT0xEX0JZVEVTID0gMiAqIDEwMjQgKiAxMDI0OyAgLy8gMiBNQgogCi0gICAgcHJpdmF0ZSBpbnRlcmZhY2UgTmV0d29ya0ludGVyZmFjZVRvVGVzdCB7Ci0gICAgICAgIGludCBnZXROZXR3b3JrVHlwZSgpOwotICAgICAgICBpbnQgZ2V0VHJhbnNwb3J0VHlwZSgpOwotICAgICAgICBib29sZWFuIGdldE1ldGVyZWQoKTsKLSAgICAgICAgdm9pZCBzZXRNZXRlcmVkKGJvb2xlYW4gbWV0ZXJlZCk7Ci0gICAgICAgIFN0cmluZyBnZXRTeXN0ZW1GZWF0dXJlKCk7Ci0gICAgICAgIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKTsKKyAgICBwcml2YXRlIGFic3RyYWN0IGNsYXNzIE5ldHdvcmtJbnRlcmZhY2VUb1Rlc3QgeworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbU1ldGVyZWQ7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtSXNEZWZhdWx0OworCisgICAgICAgIGFic3RyYWN0IGludCBnZXROZXR3b3JrVHlwZSgpOworICAgICAgICBhYnN0cmFjdCBpbnQgZ2V0VHJhbnNwb3J0VHlwZSgpOworCisgICAgICAgIHB1YmxpYyBib29sZWFuIGdldE1ldGVyZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbU1ldGVyZWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRNZXRlcmVkKGJvb2xlYW4gbWV0ZXJlZCkgeworICAgICAgICAgICAgdGhpcy5tTWV0ZXJlZCA9IG1ldGVyZWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBnZXRJc0RlZmF1bHQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUlzRGVmYXVsdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldElzRGVmYXVsdChib29sZWFuIGlzRGVmYXVsdCkgeworICAgICAgICAgICAgbUlzRGVmYXVsdCA9IGlzRGVmYXVsdDsKKyAgICAgICAgfQorCisgICAgICAgIGFic3RyYWN0IFN0cmluZyBnZXRTeXN0ZW1GZWF0dXJlKCk7CisgICAgICAgIGFic3RyYWN0IFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBOZXR3b3JrSW50ZXJmYWNlVG9UZXN0W10gc05ldHdvcmtJbnRlcmZhY2VzVG9UZXN0ID0KKyAgICBwcml2YXRlIGZpbmFsIE5ldHdvcmtJbnRlcmZhY2VUb1Rlc3RbXSBtTmV0d29ya0ludGVyZmFjZXNUb1Rlc3QgPQogICAgICAgICAgICAgbmV3IE5ldHdvcmtJbnRlcmZhY2VUb1Rlc3RbXSB7CiAgICAgICAgICAgICAgICAgICAgIG5ldyBOZXR3b3JrSW50ZXJmYWNlVG9UZXN0KCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1ldGVyZWQgPSBmYWxzZTsKLQogICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgaW50IGdldE5ldHdvcmtUeXBlKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfV0lGSTsKQEAgLTg3LDE2ICsxMTgsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGdldE1ldGVyZWQoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGVyZWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0TWV0ZXJlZChib29sZWFuIG1ldGVyZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1ldGVyZWQgPSBtZXRlcmVkOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3lzdGVtRmVhdHVyZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9XSUZJOwogICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTA3LDcgKzEyOCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIG5ldyBOZXR3b3JrSW50ZXJmYWNlVG9UZXN0KCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1ldGVyZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGludCBnZXROZXR3b3JrVHlwZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX01PQklMRTsKQEAgLTExOSwxNSArMTM5LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBnZXRNZXRlcmVkKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtZXRlcmVkOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldE1ldGVyZWQoYm9vbGVhbiBtZXRlcmVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXRlcmVkID0gbWV0ZXJlZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRTeXN0ZW1GZWF0dXJlKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQYWNrYWdlTWFuYWdlci5GRUFUVVJFX1RFTEVQSE9OWTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTE0Miw2ICsxNTMsNyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgfTsKIAorICAgIHByaXZhdGUgU3RyaW5nIG1Qa2c7CiAgICAgcHJpdmF0ZSBOZXR3b3JrU3RhdHNNYW5hZ2VyIG1Oc207CiAgICAgcHJpdmF0ZSBDb25uZWN0aXZpdHlNYW5hZ2VyIG1DbTsKICAgICBwcml2YXRlIFBhY2thZ2VNYW5hZ2VyIG1QbTsKQEAgLTE2OCw2ICsxODAsOSBAQAogICAgICAgICAgICAgdXJsYyA9IChIdHRwVVJMQ29ubmVjdGlvbikgbmV0d29yay5vcGVuQ29ubmVjdGlvbih1cmwpOwogICAgICAgICAgICAgdXJsYy5zZXRDb25uZWN0VGltZW91dChUSU1FT1VUX01JTExJUyk7CiAgICAgICAgICAgICB1cmxjLnNldFVzZUNhY2hlcyhmYWxzZSk7CisgICAgICAgICAgICAvLyBEaXNhYmxlIGNvbXByZXNzaW9uIHNvIHdlIGdlbmVyYXRlIGVub3VnaCB0cmFmZmljIHRoYXQgYXNzZXJ0V2l0aGluUGVyY2VudGFnZSB3aWxsCisgICAgICAgICAgICAvLyBub3QgYmUgYWZmZWN0ZWQgYnkgdGhlIHNtYWxsIGFtb3VudCBvZiB0cmFmZmljICg1LTEwa0IpIHNlbnQgYnkgdGhlIHRlc3QgaGFybmVzcy4KKyAgICAgICAgICAgIHVybGMuc2V0UmVxdWVzdFByb3BlcnR5KCJBY2NlcHQtRW5jb2RpbmciLCAiaWRlbnRpdHkiKTsKICAgICAgICAgICAgIHVybGMuY29ubmVjdCgpOwogICAgICAgICAgICAgYm9vbGVhbiBwaW5nID0gdXJsYy5nZXRSZXNwb25zZUNvZGUoKSA9PSAyMDA7CiAgICAgICAgICAgICBpZiAocGluZykgewpAQCAtMjA0LDEyICsyMTksMTUgQEAKICAgICAgICAgc3VwZXIuc2V0VXAoKTsKICAgICAgICAgbU5zbSA9IChOZXR3b3JrU3RhdHNNYW5hZ2VyKSBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRDb250ZXh0KCkKICAgICAgICAgICAgICAgICAuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0Lk5FVFdPUktfU1RBVFNfU0VSVklDRSk7CisgICAgICAgIG1Oc20uc2V0UG9sbEZvcmNlKHRydWUpOwogCiAgICAgICAgIG1DbSA9IChDb25uZWN0aXZpdHlNYW5hZ2VyKSBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRDb250ZXh0KCkKICAgICAgICAgICAgICAgICAuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkNPTk5FQ1RJVklUWV9TRVJWSUNFKTsKIAogICAgICAgICBtUG0gPSBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRDb250ZXh0KCkuZ2V0UGFja2FnZU1hbmFnZXIoKTsKIAorICAgICAgICBtUGtnID0gZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VOYW1lKCk7CisKICAgICAgICAgbVdyaXRlU2V0dGluZ3NNb2RlID0gZ2V0QXBwT3BzTW9kZShBcHBPcHNNYW5hZ2VyLk9QU1RSX1dSSVRFX1NFVFRJTkdTKTsKICAgICAgICAgc2V0QXBwT3BzTW9kZShBcHBPcHNNYW5hZ2VyLk9QU1RSX1dSSVRFX1NFVFRJTkdTLCAiYWxsb3ciKTsKICAgICAgICAgbVVzYWdlU3RhdHNNb2RlID0gZ2V0QXBwT3BzTW9kZShBcHBPcHNNYW5hZ2VyLk9QU1RSX0dFVF9VU0FHRV9TVEFUUyk7CkBAIC0yMjcsMzggKzI0NSwyMyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBzZXRBcHBPcHNNb2RlKFN0cmluZyBhcHBvcCwgU3RyaW5nIG1vZGUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBTdHJpbmcgY29tbWFuZCA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEFQUE9QU19TRVRfU0hFTExfQ09NTUFORCwKLSAgICAgICAgICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRDb250ZXh0KCkuZ2V0UGFja2FnZU5hbWUoKSwgYXBwb3AsIG1vZGUpOwotICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBwZmQgPSBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRVaUF1dG9tYXRpb24oKQotICAgICAgICAgICAgICAgIC5leGVjdXRlU2hlbGxDb21tYW5kKGNvbW1hbmQpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyZWFtcy5yZWFkRnVsbHkobmV3IEZpbGVJbnB1dFN0cmVhbShwZmQuZ2V0RmlsZURlc2NyaXB0b3IoKSkpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgSW9VdGlscy5jbG9zZVF1aWV0bHkocGZkLmdldEZpbGVEZXNjcmlwdG9yKCkpOwotICAgICAgICB9CisgICAgICAgIGZpbmFsIFN0cmluZyBjb21tYW5kID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoQVBQT1BTX1NFVF9TSEVMTF9DT01NQU5ELCBtUGtnLCBhcHBvcCwgbW9kZSk7CisgICAgICAgIFN5c3RlbVV0aWwucnVuU2hlbGxDb21tYW5kKGNvbW1hbmQpOwogICAgIH0KIAogICAgIHByaXZhdGUgU3RyaW5nIGdldEFwcE9wc01vZGUoU3RyaW5nIGFwcG9wKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHJlc3VsdDsKLSAgICAgICAgZmluYWwgU3RyaW5nIGNvbW1hbmQgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChBUFBPUFNfR0VUX1NIRUxMX0NPTU1BTkQsCi0gICAgICAgICAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VOYW1lKCksIGFwcG9wKTsKLSAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgcGZkID0gZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VWlBdXRvbWF0aW9uKCkKLSAgICAgICAgICAgICAgICAuZXhlY3V0ZVNoZWxsQ29tbWFuZChjb21tYW5kKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGNvbnZlcnRTdHJlYW1Ub1N0cmluZyhuZXcgRmlsZUlucHV0U3RyZWFtKHBmZC5nZXRGaWxlRGVzY3JpcHRvcigpKSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBJb1V0aWxzLmNsb3NlUXVpZXRseShwZmQuZ2V0RmlsZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgZmluYWwgU3RyaW5nIGNvbW1hbmQgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChBUFBPUFNfR0VUX1NIRUxMX0NPTU1BTkQsIG1Qa2csIGFwcG9wKTsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IFN5c3RlbVV0aWwucnVuU2hlbGxDb21tYW5kKGNvbW1hbmQpOwogICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJBcHAgb3AgIiArIGFwcG9wICsgIiBjb3VsZCBub3QgYmUgcmVhZC4iKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBjb252ZXJ0U3RyZWFtVG9TdHJpbmcoSW5wdXRTdHJlYW0gaXMpIHsKLSAgICAgICAgdHJ5IChTY2FubmVyIHNjYW5uZXIgPSBuZXcgU2Nhbm5lcihpcykudXNlRGVsaW1pdGVyKCJcXEEiKSkgewotICAgICAgICAgICAgcmV0dXJuIHNjYW5uZXIuaGFzTmV4dCgpID8gc2Nhbm5lci5uZXh0KCkgOiBudWxsOwotICAgICAgICB9CisgICAgcHJpdmF0ZSBib29sZWFuIGlzSW5Gb3JlZ3JvdW5kKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IFN5c3RlbVV0aWwucnVuU2hlbGxDb21tYW5kKGdldEluc3RydW1lbnRhdGlvbigpLAorICAgICAgICAgICAgICAgICJjbWQgYWN0aXZpdHkgZ2V0LXVpZC1zdGF0ZSAiICsgUHJvY2Vzcy5teVVpZCgpKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdC5jb250YWlucygiRk9SRUdST1VORCIpOwogICAgIH0KIAogICAgIHByaXZhdGUgY2xhc3MgTmV0d29ya0NhbGxiYWNrIGV4dGVuZHMgQ29ubmVjdGl2aXR5TWFuYWdlci5OZXR3b3JrQ2FsbGJhY2sgewpAQCAtMjY2LDE4ICsyNjksMjEgQEAKICAgICAgICAgcHJpdmF0ZSBVUkwgbVVybDsKICAgICAgICAgcHVibGljIGJvb2xlYW4gc3VjY2VzczsKICAgICAgICAgcHVibGljIGJvb2xlYW4gbWV0ZXJlZDsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0OwogCiAgICAgICAgIE5ldHdvcmtDYWxsYmFjayhsb25nIHRvbGVyYW5jZSwgVVJMIHVybCkgewogICAgICAgICAgICAgbVRvbGVyYW5jZSA9IHRvbGVyYW5jZTsKICAgICAgICAgICAgIG1VcmwgPSB1cmw7CiAgICAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7CiAgICAgICAgICAgICBtZXRlcmVkID0gZmFsc2U7CisgICAgICAgICAgICBpc0RlZmF1bHQgPSBmYWxzZTsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBvbkF2YWlsYWJsZShOZXR3b3JrIG5ldHdvcmspIHsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gbVRvbGVyYW5jZTsKKyAgICAgICAgICAgICAgICBpc0RlZmF1bHQgPSBuZXR3b3JrLmVxdWFscyhtQ20uZ2V0QWN0aXZlTmV0d29yaygpKTsKICAgICAgICAgICAgICAgICBleGVyY2lzZVJlbW90ZUhvc3QobmV0d29yaywgbVVybCk7CiAgICAgICAgICAgICAgICAgbUVuZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIG1Ub2xlcmFuY2U7CiAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IHRydWU7CkBAIC0yOTYsMTMgKzMwMiwxMyBAQAogICAgIHByaXZhdGUgYm9vbGVhbiBzaG91bGRUZXN0VGhpc05ldHdvcmtUeXBlKGludCBuZXR3b3JrVHlwZUluZGV4LCBmaW5hbCBsb25nIHRvbGVyYW5jZSkKICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBib29sZWFuIGhhc0ZlYXR1cmUgPSBtUG0uaGFzU3lzdGVtRmVhdHVyZSgKLSAgICAgICAgICAgICAgICBzTmV0d29ya0ludGVyZmFjZXNUb1Rlc3RbbmV0d29ya1R5cGVJbmRleF0uZ2V0U3lzdGVtRmVhdHVyZSgpKTsKKyAgICAgICAgICAgICAgICBtTmV0d29ya0ludGVyZmFjZXNUb1Rlc3RbbmV0d29ya1R5cGVJbmRleF0uZ2V0U3lzdGVtRmVhdHVyZSgpKTsKICAgICAgICAgaWYgKCFoYXNGZWF0dXJlKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgTmV0d29ya0NhbGxiYWNrIGNhbGxiYWNrID0gbmV3IE5ldHdvcmtDYWxsYmFjayh0b2xlcmFuY2UsIG5ldyBVUkwoQ0hFQ0tfQ09OTkVDVElWSVRZX1VSTCkpOwogICAgICAgICBtQ20ucmVxdWVzdE5ldHdvcmsobmV3IE5ldHdvcmtSZXF1ZXN0LkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgIC5hZGRUcmFuc3BvcnRUeXBlKHNOZXR3b3JrSW50ZXJmYWNlc1RvVGVzdFtuZXR3b3JrVHlwZUluZGV4XS5nZXRUcmFuc3BvcnRUeXBlKCkpCisgICAgICAgICAgICAgICAgLmFkZFRyYW5zcG9ydFR5cGUobU5ldHdvcmtJbnRlcmZhY2VzVG9UZXN0W25ldHdvcmtUeXBlSW5kZXhdLmdldFRyYW5zcG9ydFR5cGUoKSkKICAgICAgICAgICAgICAgICAuYWRkQ2FwYWJpbGl0eShOZXR3b3JrQ2FwYWJpbGl0aWVzLk5FVF9DQVBBQklMSVRZX0lOVEVSTkVUKQogICAgICAgICAgICAgICAgIC5idWlsZCgpLCBjYWxsYmFjayk7CiAgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CkBAIC0zMTIsMjEgKzMxOCwyMiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChjYWxsYmFjay5zdWNjZXNzKSB7Ci0gICAgICAgICAgICBzTmV0d29ya0ludGVyZmFjZXNUb1Rlc3RbbmV0d29ya1R5cGVJbmRleF0uc2V0TWV0ZXJlZChjYWxsYmFjay5tZXRlcmVkKTsKKyAgICAgICAgICAgIG1OZXR3b3JrSW50ZXJmYWNlc1RvVGVzdFtuZXR3b3JrVHlwZUluZGV4XS5zZXRNZXRlcmVkKGNhbGxiYWNrLm1ldGVyZWQpOworICAgICAgICAgICAgbU5ldHdvcmtJbnRlcmZhY2VzVG9UZXN0W25ldHdvcmtUeXBlSW5kZXhdLnNldElzRGVmYXVsdChjYWxsYmFjay5pc0RlZmF1bHQpOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBUaGlzIHdpbGwgYWx3YXlzIGZhaWwgYXQgdGhpcyBwb2ludCBhcyB3ZSBrbm93ICdoYXNGZWF0dXJlJyBpcyB0cnVlLgotICAgICAgICBhc3NlcnRGYWxzZSAoc05ldHdvcmtJbnRlcmZhY2VzVG9UZXN0W25ldHdvcmtUeXBlSW5kZXhdLmdldFN5c3RlbUZlYXR1cmUoKSArCisgICAgICAgIGFzc2VydEZhbHNlIChtTmV0d29ya0ludGVyZmFjZXNUb1Rlc3RbbmV0d29ya1R5cGVJbmRleF0uZ2V0U3lzdGVtRmVhdHVyZSgpICsKICAgICAgICAgICAgICAgICAiIGlzIGEgcmVwb3J0ZWQgc3lzdGVtIGZlYXR1cmUsICIgKwogICAgICAgICAgICAgICAgICJob3dldmVyIG5vIGNvcnJlc3BvbmRpbmcgY29ubmVjdGVkIG5ldHdvcmsgaW50ZXJmYWNlIHdhcyBmb3VuZCBvciB0aGUgYXR0ZW1wdCAiICsKICAgICAgICAgICAgICAgICAidG8gY29ubmVjdCBoYXMgdGltZWQgb3V0ICh0aW1lb3V0ID0gIiArIFRJTUVPVVRfTUlMTElTICsgIm1zKS4iICsKLSAgICAgICAgICAgICAgICBzTmV0d29ya0ludGVyZmFjZXNUb1Rlc3RbbmV0d29ya1R5cGVJbmRleF0uZ2V0RXJyb3JNZXNzYWdlKCksIGhhc0ZlYXR1cmUpOworICAgICAgICAgICAgICAgIG1OZXR3b3JrSW50ZXJmYWNlc1RvVGVzdFtuZXR3b3JrVHlwZUluZGV4XS5nZXRFcnJvck1lc3NhZ2UoKSwgaGFzRmVhdHVyZSk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICBwcml2YXRlIFN0cmluZyBnZXRTdWJzY3JpYmVySWQoaW50IG5ldHdvcmtJbmRleCkgewotICAgICAgICBpbnQgbmV0d29ya1R5cGUgPSBzTmV0d29ya0ludGVyZmFjZXNUb1Rlc3RbbmV0d29ya0luZGV4XS5nZXROZXR3b3JrVHlwZSgpOworICAgICAgICBpbnQgbmV0d29ya1R5cGUgPSBtTmV0d29ya0ludGVyZmFjZXNUb1Rlc3RbbmV0d29ya0luZGV4XS5nZXROZXR3b3JrVHlwZSgpOwogICAgICAgICBpZiAoQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX01PQklMRSA9PSBuZXR3b3JrVHlwZSkgewogICAgICAgICAgICAgVGVsZXBob255TWFuYWdlciB0bSA9IChUZWxlcGhvbnlNYW5hZ2VyKSBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRDb250ZXh0KCkKICAgICAgICAgICAgICAgICAgICAgLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5URUxFUEhPTllfU0VSVklDRSk7CkBAIC0zMzUsOCArMzQyLDkgQEAKICAgICAgICAgcmV0dXJuICIiOwogICAgIH0KIAorICAgIEBBcHBNb2RlRnVsbAogICAgIHB1YmxpYyB2b2lkIHRlc3REZXZpY2VTdW1tYXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc05ldHdvcmtJbnRlcmZhY2VzVG9UZXN0Lmxlbmd0aDsgKytpKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU5ldHdvcmtJbnRlcmZhY2VzVG9UZXN0Lmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICBpZiAoIXNob3VsZFRlc3RUaGlzTmV0d29ya1R5cGUoaSwgTUlOVVRFLzIpKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CkBAIC0zNDQsMjAgKzM1MiwyMSBAQAogICAgICAgICAgICAgTmV0d29ya1N0YXRzLkJ1Y2tldCBidWNrZXQgPSBudWxsOwogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBidWNrZXQgPSBtTnNtLnF1ZXJ5U3VtbWFyeUZvckRldmljZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHNOZXR3b3JrSW50ZXJmYWNlc1RvVGVzdFtpXS5nZXROZXR3b3JrVHlwZSgpLCBnZXRTdWJzY3JpYmVySWQoaSksCisgICAgICAgICAgICAgICAgICAgICAgICBtTmV0d29ya0ludGVyZmFjZXNUb1Rlc3RbaV0uZ2V0TmV0d29ya1R5cGUoKSwgZ2V0U3Vic2NyaWJlcklkKGkpLAogICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZSwgbUVuZFRpbWUpOwogICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIHwgU2VjdXJpdHlFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgIGZhaWwoInRlc3REZXZpY2VTdW1tYXJ5IGZhaWxzIHdpdGggZXhjZXB0aW9uOiAiICsgZS50b1N0cmluZygpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYnVja2V0KTsKICAgICAgICAgICAgIGFzc2VydFRpbWVzdGFtcHMoYnVja2V0KTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhidWNrZXQuZ2V0U3RhdGUoKSwgTmV0d29ya1N0YXRzLkJ1Y2tldC5TVEFURV9BTEwpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJ1Y2tldC5nZXRVaWQoKSwgTmV0d29ya1N0YXRzLkJ1Y2tldC5VSURfQUxMKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhidWNrZXQuZ2V0TWV0ZXJlZCgpLCBOZXR3b3JrU3RhdHMuQnVja2V0Lk1FVEVSRURfQUxMKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhidWNrZXQuZ2V0U3RhdGUoKSwgU1RBVEVfQUxMKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhidWNrZXQuZ2V0VWlkKCksIFVJRF9BTEwpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJ1Y2tldC5nZXRNZXRlcmVkKCksIE1FVEVSRURfQUxMKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhidWNrZXQuZ2V0RGVmYXVsdE5ldHdvcmtTdGF0dXMoKSwgREVGQVVMVF9ORVRXT1JLX0FMTCk7CiAgICAgICAgICAgICBzZXRBcHBPcHNNb2RlKEFwcE9wc01hbmFnZXIuT1BTVFJfR0VUX1VTQUdFX1NUQVRTLCAiZGVueSIpOwogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBidWNrZXQgPSBtTnNtLnF1ZXJ5U3VtbWFyeUZvckRldmljZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHNOZXR3b3JrSW50ZXJmYWNlc1RvVGVzdFtpXS5nZXROZXR3b3JrVHlwZSgpLCBnZXRTdWJzY3JpYmVySWQoaSksCisgICAgICAgICAgICAgICAgICAgICAgICBtTmV0d29ya0ludGVyZmFjZXNUb1Rlc3RbaV0uZ2V0TmV0d29ya1R5cGUoKSwgZ2V0U3Vic2NyaWJlcklkKGkpLAogICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZSwgbUVuZFRpbWUpOwogICAgICAgICAgICAgICAgIGZhaWwoIm5lZ2F0aXZlIHRlc3REZXZpY2VTdW1tYXJ5IGZhaWxzOiBubyBleGNlcHRpb24gdGhyb3duLiIpOwogICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKQEAgLTM2OCw4ICszNzcsOSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQEFwcE1vZGVGdWxsCiAgICAgcHVibGljIHZvaWQgdGVzdFVzZXJTdW1tYXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc05ldHdvcmtJbnRlcmZhY2VzVG9UZXN0Lmxlbmd0aDsgKytpKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU5ldHdvcmtJbnRlcmZhY2VzVG9UZXN0Lmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICBpZiAoIXNob3VsZFRlc3RUaGlzTmV0d29ya1R5cGUoaSwgTUlOVVRFLzIpKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CkBAIC0zNzcsMjAgKzM4NywyMSBAQAogICAgICAgICAgICAgTmV0d29ya1N0YXRzLkJ1Y2tldCBidWNrZXQgPSBudWxsOwogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBidWNrZXQgPSBtTnNtLnF1ZXJ5U3VtbWFyeUZvclVzZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBzTmV0d29ya0ludGVyZmFjZXNUb1Rlc3RbaV0uZ2V0TmV0d29ya1R5cGUoKSwgZ2V0U3Vic2NyaWJlcklkKGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgbU5ldHdvcmtJbnRlcmZhY2VzVG9UZXN0W2ldLmdldE5ldHdvcmtUeXBlKCksIGdldFN1YnNjcmliZXJJZChpKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWUsIG1FbmRUaW1lKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiB8IFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICBmYWlsKCJ0ZXN0VXNlclN1bW1hcnkgZmFpbHMgd2l0aCBleGNlcHRpb246ICIgKyBlLnRvU3RyaW5nKCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChidWNrZXQpOwogICAgICAgICAgICAgYXNzZXJ0VGltZXN0YW1wcyhidWNrZXQpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJ1Y2tldC5nZXRTdGF0ZSgpLCBOZXR3b3JrU3RhdHMuQnVja2V0LlNUQVRFX0FMTCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoYnVja2V0LmdldFVpZCgpLCBOZXR3b3JrU3RhdHMuQnVja2V0LlVJRF9BTEwpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJ1Y2tldC5nZXRNZXRlcmVkKCksIE5ldHdvcmtTdGF0cy5CdWNrZXQuTUVURVJFRF9BTEwpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJ1Y2tldC5nZXRTdGF0ZSgpLCBTVEFURV9BTEwpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJ1Y2tldC5nZXRVaWQoKSwgVUlEX0FMTCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYnVja2V0LmdldE1ldGVyZWQoKSwgTUVURVJFRF9BTEwpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJ1Y2tldC5nZXREZWZhdWx0TmV0d29ya1N0YXR1cygpLCBERUZBVUxUX05FVFdPUktfQUxMKTsKICAgICAgICAgICAgIHNldEFwcE9wc01vZGUoQXBwT3BzTWFuYWdlci5PUFNUUl9HRVRfVVNBR0VfU1RBVFMsICJkZW55Iik7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIGJ1Y2tldCA9IG1Oc20ucXVlcnlTdW1tYXJ5Rm9yVXNlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIHNOZXR3b3JrSW50ZXJmYWNlc1RvVGVzdFtpXS5nZXROZXR3b3JrVHlwZSgpLCBnZXRTdWJzY3JpYmVySWQoaSksCisgICAgICAgICAgICAgICAgICAgICAgICBtTmV0d29ya0ludGVyZmFjZXNUb1Rlc3RbaV0uZ2V0TmV0d29ya1R5cGUoKSwgZ2V0U3Vic2NyaWJlcklkKGkpLAogICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZSwgbUVuZFRpbWUpOwogICAgICAgICAgICAgICAgIGZhaWwoIm5lZ2F0aXZlIHRlc3RVc2VyU3VtbWFyeSBmYWlsczogbm8gZXhjZXB0aW9uIHRocm93bi4iKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CkBAIC00MDEsOCArNDEyLDkgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBBcHBNb2RlRnVsbAogICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBTdW1tYXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc05ldHdvcmtJbnRlcmZhY2VzVG9UZXN0Lmxlbmd0aDsgKytpKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU5ldHdvcmtJbnRlcmZhY2VzVG9UZXN0Lmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICBpZiAoIXNob3VsZFRlc3RUaGlzTmV0d29ya1R5cGUoaSwgTUlOVVRFLzIpKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CkBAIC00MTAsMTcgKzQyMiwyMCBAQAogICAgICAgICAgICAgTmV0d29ya1N0YXRzIHJlc3VsdCA9IG51bGw7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIHJlc3VsdCA9IG1Oc20ucXVlcnlTdW1tYXJ5KAotICAgICAgICAgICAgICAgICAgICAgICAgc05ldHdvcmtJbnRlcmZhY2VzVG9UZXN0W2ldLmdldE5ldHdvcmtUeXBlKCksIGdldFN1YnNjcmliZXJJZChpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1OZXR3b3JrSW50ZXJmYWNlc1RvVGVzdFtpXS5nZXROZXR3b3JrVHlwZSgpLCBnZXRTdWJzY3JpYmVySWQoaSksCiAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhcnRUaW1lLCBtRW5kVGltZSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQgIT0gbnVsbCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwogICAgICAgICAgICAgICAgIE5ldHdvcmtTdGF0cy5CdWNrZXQgYnVja2V0ID0gbmV3IE5ldHdvcmtTdGF0cy5CdWNrZXQoKTsKICAgICAgICAgICAgICAgICBsb25nIHRvdGFsVHhQYWNrZXRzID0gMDsKICAgICAgICAgICAgICAgICBsb25nIHRvdGFsUnhQYWNrZXRzID0gMDsKICAgICAgICAgICAgICAgICBsb25nIHRvdGFsVHhCeXRlcyA9IDA7CiAgICAgICAgICAgICAgICAgbG9uZyB0b3RhbFJ4Qnl0ZXMgPSAwOwogICAgICAgICAgICAgICAgIGJvb2xlYW4gaGFzQ29ycmVjdE1ldGVyaW5nID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgaW50IGV4cGVjdGVkTWV0ZXJpbmcgPSBzTmV0d29ya0ludGVyZmFjZXNUb1Rlc3RbaV0uZ2V0TWV0ZXJlZCgpID8KLSAgICAgICAgICAgICAgICAgICAgICAgIE5ldHdvcmtTdGF0cy5CdWNrZXQuTUVURVJFRF9ZRVMgOiBOZXR3b3JrU3RhdHMuQnVja2V0Lk1FVEVSRURfTk87CisgICAgICAgICAgICAgICAgYm9vbGVhbiBoYXNDb3JyZWN0RGVmYXVsdFN0YXR1cyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGludCBleHBlY3RlZE1ldGVyaW5nID0gbU5ldHdvcmtJbnRlcmZhY2VzVG9UZXN0W2ldLmdldE1ldGVyZWQoKSA/CisgICAgICAgICAgICAgICAgICAgICAgICBNRVRFUkVEX1lFUyA6IE1FVEVSRURfTk87CisgICAgICAgICAgICAgICAgaW50IGV4cGVjdGVkRGVmYXVsdFN0YXR1cyA9IG1OZXR3b3JrSW50ZXJmYWNlc1RvVGVzdFtpXS5nZXRJc0RlZmF1bHQoKSA/CisgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX05FVFdPUktfWUVTIDogREVGQVVMVF9ORVRXT1JLX05POwogICAgICAgICAgICAgICAgIHdoaWxlIChyZXN1bHQuaGFzTmV4dEJ1Y2tldCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUocmVzdWx0LmdldE5leHRCdWNrZXQoYnVja2V0KSk7CiAgICAgICAgICAgICAgICAgICAgIGFzc2VydFRpbWVzdGFtcHMoYnVja2V0KTsKQEAgLTQzMCwxNyArNDQ1LDE5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFJ4UGFja2V0cyArPSBidWNrZXQuZ2V0UnhQYWNrZXRzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFR4Qnl0ZXMgKz0gYnVja2V0LmdldFR4Qnl0ZXMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsUnhCeXRlcyArPSBidWNrZXQuZ2V0UnhCeXRlcygpOworICAgICAgICAgICAgICAgICAgICAgICAgaGFzQ29ycmVjdERlZmF1bHRTdGF0dXMgfD0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVja2V0LmdldERlZmF1bHROZXR3b3JrU3RhdHVzKCkgPT0gZXhwZWN0ZWREZWZhdWx0U3RhdHVzOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKHJlc3VsdC5nZXROZXh0QnVja2V0KGJ1Y2tldCkpOwogICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCBtZXRlcmluZyBmb3IgTmV0d29ya1R5cGU6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgc05ldHdvcmtJbnRlcmZhY2VzVG9UZXN0W2ldLmdldE5ldHdvcmtUeXBlKCksIGhhc0NvcnJlY3RNZXRlcmluZyk7CisgICAgICAgICAgICAgICAgICAgICAgICBtTmV0d29ya0ludGVyZmFjZXNUb1Rlc3RbaV0uZ2V0TmV0d29ya1R5cGUoKSwgaGFzQ29ycmVjdE1ldGVyaW5nKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgaXNEZWZhdWx0IGZvciBOZXR3b3JrVHlwZTogIiArCisgICAgICAgICAgICAgICAgICAgICAgICBtTmV0d29ya0ludGVyZmFjZXNUb1Rlc3RbaV0uZ2V0TmV0d29ya1R5cGUoKSwgaGFzQ29ycmVjdERlZmF1bHRTdGF0dXMpOwogICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIk5vIFJ4IGJ5dGVzIHVzYWdlIGZvciB1aWQgIiArIFByb2Nlc3MubXlVaWQoKSwgdG90YWxSeEJ5dGVzID4gMCk7CiAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiTm8gUnggcGFja2V0cyB1c2FnZSBmb3IgdWlkICIgKyBQcm9jZXNzLm15VWlkKCksIHRvdGFsUnhQYWNrZXRzID4gMCk7CiAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiTm8gVHggYnl0ZXMgdXNhZ2UgZm9yIHVpZCAiICsgUHJvY2Vzcy5teVVpZCgpLCB0b3RhbFR4Qnl0ZXMgPiAwKTsKICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJObyBUeCBwYWNrZXRzIHVzYWdlIGZvciB1aWQgIiArIFByb2Nlc3MubXlVaWQoKSwgdG90YWxUeFBhY2tldHMgPiAwKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiB8IFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJ0ZXN0QXBwU3VtbWFyeSBmYWlscyB3aXRoIGV4Y2VwdGlvbjogIiArIGUudG9TdHJpbmcoKSk7CiAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICByZXN1bHQuY2xvc2UoKTsKQEAgLTQ0OSw3ICs0NjYsNyBAQAogICAgICAgICAgICAgc2V0QXBwT3BzTW9kZShBcHBPcHNNYW5hZ2VyLk9QU1RSX0dFVF9VU0FHRV9TVEFUUywgImRlbnkiKTsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbU5zbS5xdWVyeVN1bW1hcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICBzTmV0d29ya0ludGVyZmFjZXNUb1Rlc3RbaV0uZ2V0TmV0d29ya1R5cGUoKSwgZ2V0U3Vic2NyaWJlcklkKGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgbU5ldHdvcmtJbnRlcmZhY2VzVG9UZXN0W2ldLmdldE5ldHdvcmtUeXBlKCksIGdldFN1YnNjcmliZXJJZChpKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWUsIG1FbmRUaW1lKTsKICAgICAgICAgICAgICAgICBmYWlsKCJuZWdhdGl2ZSB0ZXN0QXBwU3VtbWFyeSBmYWlsczogbm8gZXhjZXB0aW9uIHRocm93bi4iKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CkBAIC00NjAsOCArNDc3LDkgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBBcHBNb2RlRnVsbAogICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBEZXRhaWxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc05ldHdvcmtJbnRlcmZhY2VzVG9UZXN0Lmxlbmd0aDsgKytpKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU5ldHdvcmtJbnRlcmZhY2VzVG9UZXN0Lmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICAvLyBSZWxhdGl2ZWx5IGxhcmdlIHRvbGVyYW5jZSB0byBhY2NvbW1vZGF0ZSBmb3IgaGlzdG9yeSBidWNrZXQgc2l6ZS4KICAgICAgICAgICAgIGlmICghc2hvdWxkVGVzdFRoaXNOZXR3b3JrVHlwZShpLCBNSU5VVEUgKiAxMjApKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CkBAIC00NzAsMzEgKzQ4OCwxNyBAQAogICAgICAgICAgICAgTmV0d29ya1N0YXRzIHJlc3VsdCA9IG51bGw7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIHJlc3VsdCA9IG1Oc20ucXVlcnlEZXRhaWxzKAotICAgICAgICAgICAgICAgICAgICAgICAgc05ldHdvcmtJbnRlcmZhY2VzVG9UZXN0W2ldLmdldE5ldHdvcmtUeXBlKCksIGdldFN1YnNjcmliZXJJZChpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1OZXR3b3JrSW50ZXJmYWNlc1RvVGVzdFtpXS5nZXROZXR3b3JrVHlwZSgpLCBnZXRTdWJzY3JpYmVySWQoaSksCiAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhcnRUaW1lLCBtRW5kVGltZSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQgIT0gbnVsbCk7Ci0gICAgICAgICAgICAgICAgTmV0d29ya1N0YXRzLkJ1Y2tldCBidWNrZXQgPSBuZXcgTmV0d29ya1N0YXRzLkJ1Y2tldCgpOwotICAgICAgICAgICAgICAgIGxvbmcgdG90YWxUeFBhY2tldHMgPSAwOwotICAgICAgICAgICAgICAgIGxvbmcgdG90YWxSeFBhY2tldHMgPSAwOwotICAgICAgICAgICAgICAgIGxvbmcgdG90YWxUeEJ5dGVzID0gMDsKLSAgICAgICAgICAgICAgICBsb25nIHRvdGFsUnhCeXRlcyA9IDA7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHJlc3VsdC5oYXNOZXh0QnVja2V0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0TmV4dEJ1Y2tldChidWNrZXQpKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VGltZXN0YW1wcyhidWNrZXQpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYnVja2V0LmdldFN0YXRlKCksIE5ldHdvcmtTdGF0cy5CdWNrZXQuU1RBVEVfQUxMKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJ1Y2tldC5nZXRNZXRlcmVkKCksIE5ldHdvcmtTdGF0cy5CdWNrZXQuTUVURVJFRF9BTEwpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYnVja2V0LmdldFVpZCgpID09IFByb2Nlc3MubXlVaWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxUeFBhY2tldHMgKz0gYnVja2V0LmdldFR4UGFja2V0cygpOwotICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxSeFBhY2tldHMgKz0gYnVja2V0LmdldFJ4UGFja2V0cygpOwotICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxUeEJ5dGVzICs9IGJ1Y2tldC5nZXRUeEJ5dGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFJ4Qnl0ZXMgKz0gYnVja2V0LmdldFJ4Qnl0ZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShyZXN1bHQuZ2V0TmV4dEJ1Y2tldChidWNrZXQpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJObyBSeCBieXRlcyB1c2FnZSBmb3IgdWlkICIgKyBQcm9jZXNzLm15VWlkKCksIHRvdGFsUnhCeXRlcyA+IDApOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIk5vIFJ4IHBhY2tldHMgdXNhZ2UgZm9yIHVpZCAiICsgUHJvY2Vzcy5teVVpZCgpLCB0b3RhbFJ4UGFja2V0cyA+IDApOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIk5vIFR4IGJ5dGVzIHVzYWdlIGZvciB1aWQgIiArIFByb2Nlc3MubXlVaWQoKSwgdG90YWxUeEJ5dGVzID4gMCk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiTm8gVHggcGFja2V0cyB1c2FnZSBmb3IgdWlkICIgKyBQcm9jZXNzLm15VWlkKCksIHRvdGFsVHhQYWNrZXRzID4gMCk7CisgICAgICAgICAgICAgICAgbG9uZyB0b3RhbEJ5dGVzV2l0aFN1YnNjcmliZXJJZCA9IGdldFRvdGFsQW5kQXNzZXJ0Tm90RW1wdHkocmVzdWx0KTsKKworICAgICAgICAgICAgICAgIC8vIFRlc3Qgd2l0aG91dCBmaWx0ZXJpbmcgYnkgc3Vic2NyaWJlcklkCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gbU5zbS5xdWVyeURldGFpbHMoCisgICAgICAgICAgICAgICAgICAgICAgICBtTmV0d29ya0ludGVyZmFjZXNUb1Rlc3RbaV0uZ2V0TmV0d29ya1R5cGUoKSwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWUsIG1FbmRUaW1lKTsKKworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIk1vcmUgYnl0ZXMgd2l0aCBzdWJzY3JpYmVySWQgZmlsdGVyIHRoYW4gd2l0aG91dC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VG90YWxBbmRBc3NlcnROb3RFbXB0eShyZXN1bHQpID49IHRvdGFsQnl0ZXNXaXRoU3Vic2NyaWJlcklkKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiB8IFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICBmYWlsKCJ0ZXN0QXBwRGV0YWlscyBmYWlscyB3aXRoIGV4Y2VwdGlvbjogIiArIGUudG9TdHJpbmcoKSk7CiAgICAgICAgICAgICB9IGZpbmFsbHkgewpAQCAtNTA1LDcgKzUwOSw3IEBACiAgICAgICAgICAgICBzZXRBcHBPcHNNb2RlKEFwcE9wc01hbmFnZXIuT1BTVFJfR0VUX1VTQUdFX1NUQVRTLCAiZGVueSIpOwogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICByZXN1bHQgPSBtTnNtLnF1ZXJ5RGV0YWlscygKLSAgICAgICAgICAgICAgICAgICAgICAgIHNOZXR3b3JrSW50ZXJmYWNlc1RvVGVzdFtpXS5nZXROZXR3b3JrVHlwZSgpLCBnZXRTdWJzY3JpYmVySWQoaSksCisgICAgICAgICAgICAgICAgICAgICAgICBtTmV0d29ya0ludGVyZmFjZXNUb1Rlc3RbaV0uZ2V0TmV0d29ya1R5cGUoKSwgZ2V0U3Vic2NyaWJlcklkKGkpLAogICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZSwgbUVuZFRpbWUpOwogICAgICAgICAgICAgICAgIGZhaWwoIm5lZ2F0aXZlIHRlc3RBcHBEZXRhaWxzIGZhaWxzOiBubyBleGNlcHRpb24gdGhyb3duLiIpOwogICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKQEAgLTUxNiw4ICs1MjAsOSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQEFwcE1vZGVGdWxsCiAgICAgcHVibGljIHZvaWQgdGVzdFVpZERldGFpbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzTmV0d29ya0ludGVyZmFjZXNUb1Rlc3QubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTmV0d29ya0ludGVyZmFjZXNUb1Rlc3QubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgIC8vIFJlbGF0aXZlbHkgbGFyZ2UgdG9sZXJhbmNlIHRvIGFjY29tbW9kYXRlIGZvciBoaXN0b3J5IGJ1Y2tldCBzaXplLgogICAgICAgICAgICAgaWYgKCFzaG91bGRUZXN0VGhpc05ldHdvcmtUeXBlKGksIE1JTlVURSAqIDEyMCkpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTUyNiw5ICs1MzEsOSBAQAogICAgICAgICAgICAgTmV0d29ya1N0YXRzIHJlc3VsdCA9IG51bGw7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIHJlc3VsdCA9IG1Oc20ucXVlcnlEZXRhaWxzRm9yVWlkKAotICAgICAgICAgICAgICAgICAgICAgICAgc05ldHdvcmtJbnRlcmZhY2VzVG9UZXN0W2ldLmdldE5ldHdvcmtUeXBlKCksIGdldFN1YnNjcmliZXJJZChpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1OZXR3b3JrSW50ZXJmYWNlc1RvVGVzdFtpXS5nZXROZXR3b3JrVHlwZSgpLCBnZXRTdWJzY3JpYmVySWQoaSksCiAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhcnRUaW1lLCBtRW5kVGltZSwgUHJvY2Vzcy5teVVpZCgpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdCAhPSBudWxsKTsKKyAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgTmV0d29ya1N0YXRzLkJ1Y2tldCBidWNrZXQgPSBuZXcgTmV0d29ya1N0YXRzLkJ1Y2tldCgpOwogICAgICAgICAgICAgICAgIGxvbmcgdG90YWxUeFBhY2tldHMgPSAwOwogICAgICAgICAgICAgICAgIGxvbmcgdG90YWxSeFBhY2tldHMgPSAwOwpAQCAtNTM3LDggKzU0Miw5IEBACiAgICAgICAgICAgICAgICAgd2hpbGUgKHJlc3VsdC5oYXNOZXh0QnVja2V0KCkpIHsKICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0TmV4dEJ1Y2tldChidWNrZXQpKTsKICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VGltZXN0YW1wcyhidWNrZXQpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYnVja2V0LmdldFN0YXRlKCksIE5ldHdvcmtTdGF0cy5CdWNrZXQuU1RBVEVfQUxMKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJ1Y2tldC5nZXRNZXRlcmVkKCksIE5ldHdvcmtTdGF0cy5CdWNrZXQuTUVURVJFRF9BTEwpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYnVja2V0LmdldFN0YXRlKCksIFNUQVRFX0FMTCk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhidWNrZXQuZ2V0TWV0ZXJlZCgpLCBNRVRFUkVEX0FMTCk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhidWNrZXQuZ2V0RGVmYXVsdE5ldHdvcmtTdGF0dXMoKSwgREVGQVVMVF9ORVRXT1JLX0FMTCk7CiAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhidWNrZXQuZ2V0VWlkKCksIFByb2Nlc3MubXlVaWQoKSk7CiAgICAgICAgICAgICAgICAgICAgIHRvdGFsVHhQYWNrZXRzICs9IGJ1Y2tldC5nZXRUeFBhY2tldHMoKTsKICAgICAgICAgICAgICAgICAgICAgdG90YWxSeFBhY2tldHMgKz0gYnVja2V0LmdldFJ4UGFja2V0cygpOwpAQCAtNTUwLDggKzU1Niw2IEBACiAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiTm8gUnggcGFja2V0cyB1c2FnZSBmb3IgdWlkICIgKyBQcm9jZXNzLm15VWlkKCksIHRvdGFsUnhQYWNrZXRzID4gMCk7CiAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiTm8gVHggYnl0ZXMgdXNhZ2UgZm9yIHVpZCAiICsgUHJvY2Vzcy5teVVpZCgpLCB0b3RhbFR4Qnl0ZXMgPiAwKTsKICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJObyBUeCBwYWNrZXRzIHVzYWdlIGZvciB1aWQgIiArIFByb2Nlc3MubXlVaWQoKSwgdG90YWxUeFBhY2tldHMgPiAwKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiB8IFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJ0ZXN0VWlkRGV0YWlscyBmYWlscyB3aXRoIGV4Y2VwdGlvbjogIiArIGUudG9TdHJpbmcoKSk7CiAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICByZXN1bHQuY2xvc2UoKTsKQEAgLTU2MCwxOSArNTY0LDE4IEBACiAgICAgICAgICAgICBzZXRBcHBPcHNNb2RlKEFwcE9wc01hbmFnZXIuT1BTVFJfR0VUX1VTQUdFX1NUQVRTLCAiZGVueSIpOwogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICByZXN1bHQgPSBtTnNtLnF1ZXJ5RGV0YWlsc0ZvclVpZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHNOZXR3b3JrSW50ZXJmYWNlc1RvVGVzdFtpXS5nZXROZXR3b3JrVHlwZSgpLCBnZXRTdWJzY3JpYmVySWQoaSksCisgICAgICAgICAgICAgICAgICAgICAgICBtTmV0d29ya0ludGVyZmFjZXNUb1Rlc3RbaV0uZ2V0TmV0d29ya1R5cGUoKSwgZ2V0U3Vic2NyaWJlcklkKGkpLAogICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZSwgbUVuZFRpbWUsIFByb2Nlc3MubXlVaWQoKSk7CiAgICAgICAgICAgICAgICAgZmFpbCgibmVnYXRpdmUgdGVzdFVpZERldGFpbHMgZmFpbHM6IG5vIGV4Y2VwdGlvbiB0aHJvd24uIik7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGZhaWwoInRlc3RVaWREZXRhaWxzIGZhaWxzIHdpdGggZXhjZXB0aW9uOiAiICsgZS50b1N0cmluZygpKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZCBvdXRjb21lCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAQXBwTW9kZUZ1bGwKICAgICBwdWJsaWMgdm9pZCB0ZXN0VGFnRGV0YWlscygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNOZXR3b3JrSW50ZXJmYWNlc1RvVGVzdC5sZW5ndGg7ICsraSkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OZXR3b3JrSW50ZXJmYWNlc1RvVGVzdC5sZW5ndGg7ICsraSkgewogICAgICAgICAgICAgLy8gUmVsYXRpdmVseSBsYXJnZSB0b2xlcmFuY2UgdG8gYWNjb21tb2RhdGUgZm9yIGhpc3RvcnkgYnVja2V0IHNpemUuCiAgICAgICAgICAgICBpZiAoIXNob3VsZFRlc3RUaGlzTmV0d29ya1R5cGUoaSwgTUlOVVRFICogMTIwKSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtNTgxLDkgKzU4NCw5IEBACiAgICAgICAgICAgICBOZXR3b3JrU3RhdHMgcmVzdWx0ID0gbnVsbDsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbU5zbS5xdWVyeURldGFpbHNGb3JVaWRUYWcoCi0gICAgICAgICAgICAgICAgICAgICAgICBzTmV0d29ya0ludGVyZmFjZXNUb1Rlc3RbaV0uZ2V0TmV0d29ya1R5cGUoKSwgZ2V0U3Vic2NyaWJlcklkKGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgbU5ldHdvcmtJbnRlcmZhY2VzVG9UZXN0W2ldLmdldE5ldHdvcmtUeXBlKCksIGdldFN1YnNjcmliZXJJZChpKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWUsIG1FbmRUaW1lLCBQcm9jZXNzLm15VWlkKCksIE5FVFdPUktfVEFHKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdCAhPSBudWxsKTsKKyAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgTmV0d29ya1N0YXRzLkJ1Y2tldCBidWNrZXQgPSBuZXcgTmV0d29ya1N0YXRzLkJ1Y2tldCgpOwogICAgICAgICAgICAgICAgIGxvbmcgdG90YWxUeFBhY2tldHMgPSAwOwogICAgICAgICAgICAgICAgIGxvbmcgdG90YWxSeFBhY2tldHMgPSAwOwpAQCAtNTkyLDggKzU5NSw5IEBACiAgICAgICAgICAgICAgICAgd2hpbGUgKHJlc3VsdC5oYXNOZXh0QnVja2V0KCkpIHsKICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0TmV4dEJ1Y2tldChidWNrZXQpKTsKICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VGltZXN0YW1wcyhidWNrZXQpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYnVja2V0LmdldFN0YXRlKCksIE5ldHdvcmtTdGF0cy5CdWNrZXQuU1RBVEVfQUxMKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJ1Y2tldC5nZXRNZXRlcmVkKCksIE5ldHdvcmtTdGF0cy5CdWNrZXQuTUVURVJFRF9BTEwpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYnVja2V0LmdldFN0YXRlKCksIFNUQVRFX0FMTCk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhidWNrZXQuZ2V0TWV0ZXJlZCgpLCBNRVRFUkVEX0FMTCk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhidWNrZXQuZ2V0RGVmYXVsdE5ldHdvcmtTdGF0dXMoKSwgREVGQVVMVF9ORVRXT1JLX0FMTCk7CiAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhidWNrZXQuZ2V0VWlkKCksIFByb2Nlc3MubXlVaWQoKSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChidWNrZXQuZ2V0VGFnKCkgPT0gTkVUV09SS19UQUcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsVHhQYWNrZXRzICs9IGJ1Y2tldC5nZXRUeFBhY2tldHMoKTsKQEAgLTYwNCwxNCArNjA4LDEyIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIk5vIFJ4IGJ5dGVzIHRhZ2dlZCB3aXRoIDB4IiArIEludGVnZXIudG9IZXhTdHJpbmcoTkVUV09SS19UQUcpCiAgICAgICAgICAgICAgICAgICAgICAgICArICIgZm9yIHVpZCAiICsgUHJvY2Vzcy5teVVpZCgpLCB0b3RhbFJ4Qnl0ZXMgPiAwKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJObyBSeCBwYWNrZXRzIHRhZ2dlZCB3aXRoICIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKE5FVFdPUktfVEFHKQorICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIk5vIFJ4IHBhY2tldHMgdGFnZ2VkIHdpdGggMHgiICsgSW50ZWdlci50b0hleFN0cmluZyhORVRXT1JLX1RBRykKICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBmb3IgdWlkICIgKyBQcm9jZXNzLm15VWlkKCksIHRvdGFsUnhQYWNrZXRzID4gMCk7CiAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiTm8gVHggYnl0ZXMgdGFnZ2VkIHdpdGggMHgiICsgSW50ZWdlci50b0hleFN0cmluZyhORVRXT1JLX1RBRykKICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBmb3IgdWlkICIgKyBQcm9jZXNzLm15VWlkKCksIHRvdGFsVHhCeXRlcyA+IDApOwogICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIk5vIFR4IHBhY2tldHMgdGFnZ2VkIHdpdGggMHgiICsgSW50ZWdlci50b0hleFN0cmluZyhORVRXT1JLX1RBRykKICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBmb3IgdWlkICIgKyBQcm9jZXNzLm15VWlkKCksIHRvdGFsVHhQYWNrZXRzID4gMCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgidGVzdFVpZERldGFpbHMgZmFpbHMgd2l0aCBleGNlcHRpb246ICIgKyBlLnRvU3RyaW5nKCkpOwogICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmNsb3NlKCk7CkBAIC02MjAsNyArNjIyLDcgQEAKICAgICAgICAgICAgIHNldEFwcE9wc01vZGUoQXBwT3BzTWFuYWdlci5PUFNUUl9HRVRfVVNBR0VfU1RBVFMsICJkZW55Iik7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIHJlc3VsdCA9IG1Oc20ucXVlcnlEZXRhaWxzRm9yVWlkVGFnKAotICAgICAgICAgICAgICAgICAgICAgICAgc05ldHdvcmtJbnRlcmZhY2VzVG9UZXN0W2ldLmdldE5ldHdvcmtUeXBlKCksIGdldFN1YnNjcmliZXJJZChpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1OZXR3b3JrSW50ZXJmYWNlc1RvVGVzdFtpXS5nZXROZXR3b3JrVHlwZSgpLCBnZXRTdWJzY3JpYmVySWQoaSksCiAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhcnRUaW1lLCBtRW5kVGltZSwgUHJvY2Vzcy5teVVpZCgpLCBORVRXT1JLX1RBRyk7CiAgICAgICAgICAgICAgICAgZmFpbCgibmVnYXRpdmUgdGVzdFVpZERldGFpbHMgZmFpbHM6IG5vIGV4Y2VwdGlvbiB0aHJvd24uIik7CiAgICAgICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CkBAIC02MjksOCArNjMxLDEzNCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgY2xhc3MgUXVlcnlSZXN1bHQgeworICAgICAgICBwdWJsaWMgZmluYWwgaW50IHRhZzsKKyAgICAgICAgcHVibGljIGZpbmFsIGludCBzdGF0ZTsKKyAgICAgICAgcHVibGljIGZpbmFsIGxvbmcgdG90YWw7CisKKyAgICAgICAgcHVibGljIFF1ZXJ5UmVzdWx0KGludCB0YWcsIGludCBzdGF0ZSwgTmV0d29ya1N0YXRzIHN0YXRzKSB7CisgICAgICAgICAgICB0aGlzLnRhZyA9IHRhZzsKKyAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgICAgIHRvdGFsID0gZ2V0VG90YWxBbmRBc3NlcnROb3RFbXB0eShzdGF0cywgdGFnLCBzdGF0ZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIlF1ZXJ5UmVzdWx0KHRhZz0lcyBzdGF0ZT0lcyB0b3RhbD0lZCkiLAorICAgICAgICAgICAgICAgICAgICB0YWdUb1N0cmluZyh0YWcpLCBzdGF0ZVRvU3RyaW5nKHN0YXRlKSwgdG90YWwpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBOZXR3b3JrU3RhdHMgZ2V0TmV0d29ya1N0YXRzRm9yVGFnU3RhdGUoaW50IGksIGludCB0YWcsIGludCBzdGF0ZSkgeworICAgICAgICByZXR1cm4gbU5zbS5xdWVyeURldGFpbHNGb3JVaWRUYWdTdGF0ZSgKKyAgICAgICAgICAgICAgICBtTmV0d29ya0ludGVyZmFjZXNUb1Rlc3RbaV0uZ2V0TmV0d29ya1R5cGUoKSwgZ2V0U3Vic2NyaWJlcklkKGkpLAorICAgICAgICAgICAgICAgIG1TdGFydFRpbWUsIG1FbmRUaW1lLCBQcm9jZXNzLm15VWlkKCksIHRhZywgc3RhdGUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRXaXRoaW5QZXJjZW50YWdlKFN0cmluZyBtc2csIGxvbmcgZXhwZWN0ZWQsIGxvbmcgYWN0dWFsLCBpbnQgcGVyY2VudGFnZSkgeworICAgICAgICBsb25nIGxvd2VyQm91bmQgPSBleHBlY3RlZCAqICgxMDAgLSBwZXJjZW50YWdlKSAvIDEwMDsKKyAgICAgICAgbG9uZyB1cHBlckJvdW5kID0gZXhwZWN0ZWQgKiAoMTAwICsgcGVyY2VudGFnZSkgLyAxMDA7CisgICAgICAgIG1zZyA9IFN0cmluZy5mb3JtYXQoIiVzOiAlZCBub3Qgd2l0aGluICVkJSUgb2YgJWQiLCBtc2csIGFjdHVhbCwgcGVyY2VudGFnZSwgZXhwZWN0ZWQpOworICAgICAgICBhc3NlcnRUcnVlKG1zZywgbG93ZXJCb3VuZCA8PSBhY3R1YWwpOworICAgICAgICBhc3NlcnRUcnVlKG1zZywgdXBwZXJCb3VuZCA+PSBhY3R1YWwpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRBbG1vc3ROb1VuZXhwZWN0ZWRUcmFmZmljKE5ldHdvcmtTdGF0cyByZXN1bHQsIGludCBleHBlY3RlZFRhZywKKyAgICAgICAgICAgIGludCBleHBlY3RlZFN0YXRlLCBsb25nIG1heFVuZXhwZWN0ZWQpIHsKKyAgICAgICAgbG9uZyB0b3RhbCA9IDA7CisgICAgICAgIE5ldHdvcmtTdGF0cy5CdWNrZXQgYnVja2V0ID0gbmV3IE5ldHdvcmtTdGF0cy5CdWNrZXQoKTsKKyAgICAgICAgd2hpbGUgKHJlc3VsdC5oYXNOZXh0QnVja2V0KCkpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUocmVzdWx0LmdldE5leHRCdWNrZXQoYnVja2V0KSk7CisgICAgICAgICAgICB0b3RhbCArPSBidWNrZXQuZ2V0UnhCeXRlcygpICsgYnVja2V0LmdldFR4Qnl0ZXMoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodG90YWwgPD0gbWF4VW5leHBlY3RlZCkgcmV0dXJuOworCisgICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiTW9yZSB0aGFuICVkIGJ5dGVzIG9mIHRyYWZmaWMgd2hlbiBxdWVyeWluZyBmb3IgIgorICAgICAgICAgICAgICAgICsgInRhZyAlcyBzdGF0ZSAlcy4gTGFzdCBidWNrZXQ6IHVpZD0lZCB0YWc9JXMgc3RhdGU9JXMgYnl0ZXM9JWQvJWQiLAorICAgICAgICAgICAgICAgIG1heFVuZXhwZWN0ZWQsIHRhZ1RvU3RyaW5nKGV4cGVjdGVkVGFnKSwgc3RhdGVUb1N0cmluZyhleHBlY3RlZFN0YXRlKSwKKyAgICAgICAgICAgICAgICBidWNrZXQuZ2V0VWlkKCksIHRhZ1RvU3RyaW5nKGJ1Y2tldC5nZXRUYWcoKSksIHN0YXRlVG9TdHJpbmcoYnVja2V0LmdldFN0YXRlKCkpLAorICAgICAgICAgICAgICAgIGJ1Y2tldC5nZXRSeEJ5dGVzKCksIGJ1Y2tldC5nZXRUeEJ5dGVzKCkpKTsKKyAgICB9CisKKyAgICBAQXBwTW9kZUZ1bGwKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VWlkVGFnU3RhdGVEZXRhaWxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU5ldHdvcmtJbnRlcmZhY2VzVG9UZXN0Lmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAvLyBSZWxhdGl2ZWx5IGxhcmdlIHRvbGVyYW5jZSB0byBhY2NvbW1vZGF0ZSBmb3IgaGlzdG9yeSBidWNrZXQgc2l6ZS4KKyAgICAgICAgICAgIGlmICghc2hvdWxkVGVzdFRoaXNOZXR3b3JrVHlwZShpLCBNSU5VVEUgKiAxMjApKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXRBcHBPcHNNb2RlKEFwcE9wc01hbmFnZXIuT1BTVFJfR0VUX1VTQUdFX1NUQVRTLCAiYWxsb3ciKTsKKyAgICAgICAgICAgIE5ldHdvcmtTdGF0cyByZXN1bHQgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpbnQgY3VycmVudFN0YXRlID0gaXNJbkZvcmVncm91bmQoKSA/IFNUQVRFX0ZPUkVHUk9VTkQgOiBTVEFURV9ERUZBVUxUOworICAgICAgICAgICAgICAgIGludCBvdGhlclN0YXRlID0gKGN1cnJlbnRTdGF0ZSA9PSBTVEFURV9ERUZBVUxUKSA/IFNUQVRFX0ZPUkVHUk9VTkQgOiBTVEFURV9ERUZBVUxUOworCisgICAgICAgICAgICAgICAgaW50W10gdGFnc1dpdGhUcmFmZmljID0ge05FVFdPUktfVEFHLCBUQUdfTk9ORX07CisgICAgICAgICAgICAgICAgaW50W10gc3RhdGVzV2l0aFRyYWZmaWMgPSB7Y3VycmVudFN0YXRlLCBTVEFURV9BTEx9OworICAgICAgICAgICAgICAgIEFycmF5TGlzdDxRdWVyeVJlc3VsdD4gcmVzdWx0c1dpdGhUcmFmZmljID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICAgICAgICAgICAgICBpbnRbXSBzdGF0ZXNXaXRoTm9UcmFmZmljID0ge290aGVyU3RhdGV9OworICAgICAgICAgICAgICAgIGludFtdIHRhZ3NXaXRoTm9UcmFmZmljID0ge05FVFdPUktfVEFHICsgMX07CisgICAgICAgICAgICAgICAgQXJyYXlMaXN0PFF1ZXJ5UmVzdWx0PiByZXN1bHRzV2l0aE5vVHJhZmZpYyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgICAgICAgICAgICAgLy8gRXhwZWN0IHRvIHNlZSB0cmFmZmljIHdoZW4gcXVlcnlpbmcgZm9yIGFueSBjb21iaW5hdGlvbiBvZiBhIHRhZyBpbgorICAgICAgICAgICAgICAgIC8vIHRhZ3NXaXRoVHJhZmZpYyBhbmQgYSBzdGF0ZSBpbiBzdGF0ZXNXaXRoVHJhZmZpYy4KKyAgICAgICAgICAgICAgICBmb3IgKGludCB0YWcgOiB0YWdzV2l0aFRyYWZmaWMpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgc3RhdGUgOiBzdGF0ZXNXaXRoVHJhZmZpYykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZ2V0TmV0d29ya1N0YXRzRm9yVGFnU3RhdGUoaSwgdGFnLCBzdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzV2l0aFRyYWZmaWMuYWRkKG5ldyBRdWVyeVJlc3VsdCh0YWcsIHN0YXRlLCByZXN1bHQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEV4cGVjdCB0aGF0IHRoZSByZXN1bHRzIGFyZSB3aXRoaW4gYSBmZXcgcGVyY2VudGFnZSBwb2ludHMgb2YgZWFjaCBvdGhlci4KKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGVuc3VyZXMgdGhhdCBGSU4gcmV0cmFuc21pdHMgYWZ0ZXIgdGhlIHRyYW5zZmVyIGlzIGNvbXBsZXRlIGRvbid0IGNhdXNlCisgICAgICAgICAgICAgICAgLy8gdGhlIHRlc3QgdG8gYmUgZmxha3kuIFRoZSB0ZXN0IFVSTCBjdXJyZW50bHkgcmV0dXJucyBqdXN0IG92ZXIgMTAwayBzbyB0aGlzCisgICAgICAgICAgICAgICAgLy8gc2hvdWxkIG5vdCBiZSB0b28gbm9pc3kuIEl0IGFsc28gZW5zdXJlcyB0aGF0IHRoZSB0cmFmZmljIHNlbnQgYnkgdGhlIHRlc3QKKyAgICAgICAgICAgICAgICAvLyBoYXJuZXNzLCB3aGljaCBpcyB1bnRhZ2dlZCwgd29uJ3QgY2F1c2UgYSBmYWlsdXJlLgorICAgICAgICAgICAgICAgIGxvbmcgZmlyc3RUb3RhbCA9IHJlc3VsdHNXaXRoVHJhZmZpYy5nZXQoMCkudG90YWw7CisgICAgICAgICAgICAgICAgZm9yIChRdWVyeVJlc3VsdCBxdWVyeVJlc3VsdCA6IHJlc3VsdHNXaXRoVHJhZmZpYykgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnRXaXRoaW5QZXJjZW50YWdlKHF1ZXJ5UmVzdWx0ICsgIiIsIGZpcnN0VG90YWwsIHF1ZXJ5UmVzdWx0LnRvdGFsLCAxMCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gRXhwZWN0IHRvIHNlZSBubyB0cmFmZmljIHdoZW4gcXVlcnlpbmcgZm9yIGFueSB0YWcgaW4gdGFnc1dpdGhOb1RyYWZmaWMgb3IgYW55CisgICAgICAgICAgICAgICAgLy8gc3RhdGUgaW4gc3RhdGVzV2l0aE5vVHJhZmZpYy4KKyAgICAgICAgICAgICAgICBmb3IgKGludCB0YWcgOiB0YWdzV2l0aE5vVHJhZmZpYykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBzdGF0ZSA6IHN0YXRlc1dpdGhUcmFmZmljKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBnZXROZXR3b3JrU3RhdHNGb3JUYWdTdGF0ZShpLCB0YWcsIHN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEFsbW9zdE5vVW5leHBlY3RlZFRyYWZmaWMocmVzdWx0LCB0YWcsIHN0YXRlLCBmaXJzdFRvdGFsIC8gMTAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGludCB0YWcgOiB0YWdzV2l0aFRyYWZmaWMpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgc3RhdGUgOiBzdGF0ZXNXaXRoTm9UcmFmZmljKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBnZXROZXR3b3JrU3RhdHNGb3JUYWdTdGF0ZShpLCB0YWcsIHN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEFsbW9zdE5vVW5leHBlY3RlZFRyYWZmaWMocmVzdWx0LCB0YWcsIHN0YXRlLCBmaXJzdFRvdGFsIC8gMTAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldEFwcE9wc01vZGUoQXBwT3BzTWFuYWdlci5PUFNUUl9HRVRfVVNBR0VfU1RBVFMsICJkZW55Iik7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IG1Oc20ucXVlcnlEZXRhaWxzRm9yVWlkVGFnKAorICAgICAgICAgICAgICAgICAgICAgICAgbU5ldHdvcmtJbnRlcmZhY2VzVG9UZXN0W2ldLmdldE5ldHdvcmtUeXBlKCksIGdldFN1YnNjcmliZXJJZChpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWUsIG1FbmRUaW1lLCBQcm9jZXNzLm15VWlkKCksIE5FVFdPUktfVEFHKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJuZWdhdGl2ZSB0ZXN0VWlkRGV0YWlscyBmYWlsczogbm8gZXhjZXB0aW9uIHRocm93bi4iKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBleHBlY3RlZCBvdXRjb21lCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAQXBwTW9kZUZ1bGwKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FsbGJhY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzTmV0d29ya0ludGVyZmFjZXNUb1Rlc3QubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTmV0d29ya0ludGVyZmFjZXNUb1Rlc3QubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgIC8vIFJlbGF0aXZlbHkgbGFyZ2UgdG9sZXJhbmNlIHRvIGFjY29tbW9kYXRlIGZvciBoaXN0b3J5IGJ1Y2tldCBzaXplLgogICAgICAgICAgICAgaWYgKCFzaG91bGRUZXN0VGhpc05ldHdvcmtUeXBlKGksIE1JTlVURS8yKSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtNjQxLDcgKzc2OSw3IEBACiAgICAgICAgICAgICBIYW5kbGVyVGhyZWFkIHRocmVhZCA9IG5ldyBIYW5kbGVyVGhyZWFkKCJjYWxsYmFjay10aHJlYWQiKTsKICAgICAgICAgICAgIHRocmVhZC5zdGFydCgpOwogICAgICAgICAgICAgSGFuZGxlciBoYW5kbGVyID0gbmV3IEhhbmRsZXIodGhyZWFkLmdldExvb3BlcigpKTsKLSAgICAgICAgICAgIG1Oc20ucmVnaXN0ZXJVc2FnZUNhbGxiYWNrKHNOZXR3b3JrSW50ZXJmYWNlc1RvVGVzdFtpXS5nZXROZXR3b3JrVHlwZSgpLAorICAgICAgICAgICAgbU5zbS5yZWdpc3RlclVzYWdlQ2FsbGJhY2sobU5ldHdvcmtJbnRlcmZhY2VzVG9UZXN0W2ldLmdldE5ldHdvcmtUeXBlKCksCiAgICAgICAgICAgICAgICAgICAgIGdldFN1YnNjcmliZXJJZChpKSwgVEhSRVNIT0xEX0JZVEVTLCB1c2FnZUNhbGxiYWNrLCBoYW5kbGVyKTsKIAogICAgICAgICAgICAgLy8gVE9ETzogRm9yY2UgdHJhZmZpYyBhbmQgY2hlY2sgd2hldGhlciB0aGUgY2FsbGJhY2sgaXMgaW52b2tlZC4KQEAgLTY1Myw2ICs3ODEsNjYgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgU3RyaW5nIHRhZ1RvU3RyaW5nKEludGVnZXIgdGFnKSB7CisgICAgICAgIGlmICh0YWcgPT0gbnVsbCkgcmV0dXJuICJudWxsIjsKKyAgICAgICAgc3dpdGNoICh0YWcpIHsKKyAgICAgICAgICAgIGNhc2UgVEFHX05PTkU6CisgICAgICAgICAgICAgICAgcmV0dXJuICJUQUdfTk9ORSI7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiAiMHgiICsgSW50ZWdlci50b0hleFN0cmluZyh0YWcpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgc3RhdGVUb1N0cmluZyhJbnRlZ2VyIHN0YXRlKSB7CisgICAgICAgIGlmIChzdGF0ZSA9PSBudWxsKSByZXR1cm4gIm51bGwiOworICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgICAgICBjYXNlIFNUQVRFX0FMTDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIlNUQVRFX0FMTCI7CisgICAgICAgICAgICBjYXNlIFNUQVRFX0RFRkFVTFQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJTVEFURV9ERUZBVUxUIjsKKyAgICAgICAgICAgIGNhc2UgU1RBVEVfRk9SRUdST1VORDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIlNUQVRFX0ZPUkVHUk9VTkQiOworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gc3RhdGUgIiArIHN0YXRlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGxvbmcgZ2V0VG90YWxBbmRBc3NlcnROb3RFbXB0eShOZXR3b3JrU3RhdHMgcmVzdWx0LCBJbnRlZ2VyIGV4cGVjdGVkVGFnLAorICAgICAgICAgICAgSW50ZWdlciBleHBlY3RlZFN0YXRlKSB7CisgICAgICAgIGFzc2VydFRydWUocmVzdWx0ICE9IG51bGwpOworICAgICAgICBOZXR3b3JrU3RhdHMuQnVja2V0IGJ1Y2tldCA9IG5ldyBOZXR3b3JrU3RhdHMuQnVja2V0KCk7CisgICAgICAgIGxvbmcgdG90YWxUeFBhY2tldHMgPSAwOworICAgICAgICBsb25nIHRvdGFsUnhQYWNrZXRzID0gMDsKKyAgICAgICAgbG9uZyB0b3RhbFR4Qnl0ZXMgPSAwOworICAgICAgICBsb25nIHRvdGFsUnhCeXRlcyA9IDA7CisgICAgICAgIHdoaWxlIChyZXN1bHQuaGFzTmV4dEJ1Y2tldCgpKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5nZXROZXh0QnVja2V0KGJ1Y2tldCkpOworICAgICAgICAgICAgYXNzZXJ0VGltZXN0YW1wcyhidWNrZXQpOworICAgICAgICAgICAgaWYgKGV4cGVjdGVkVGFnICE9IG51bGwpIGFzc2VydEVxdWFscyhidWNrZXQuZ2V0VGFnKCksIChpbnQpIGV4cGVjdGVkVGFnKTsKKyAgICAgICAgICAgIGlmIChleHBlY3RlZFN0YXRlICE9IG51bGwpIGFzc2VydEVxdWFscyhidWNrZXQuZ2V0U3RhdGUoKSwgKGludCkgZXhwZWN0ZWRTdGF0ZSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYnVja2V0LmdldE1ldGVyZWQoKSwgTUVURVJFRF9BTEwpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJ1Y2tldC5nZXREZWZhdWx0TmV0d29ya1N0YXR1cygpLCBERUZBVUxUX05FVFdPUktfQUxMKTsKKyAgICAgICAgICAgIGlmIChidWNrZXQuZ2V0VWlkKCkgPT0gUHJvY2Vzcy5teVVpZCgpKSB7CisgICAgICAgICAgICAgICAgdG90YWxUeFBhY2tldHMgKz0gYnVja2V0LmdldFR4UGFja2V0cygpOworICAgICAgICAgICAgICAgIHRvdGFsUnhQYWNrZXRzICs9IGJ1Y2tldC5nZXRSeFBhY2tldHMoKTsKKyAgICAgICAgICAgICAgICB0b3RhbFR4Qnl0ZXMgKz0gYnVja2V0LmdldFR4Qnl0ZXMoKTsKKyAgICAgICAgICAgICAgICB0b3RhbFJ4Qnl0ZXMgKz0gYnVja2V0LmdldFJ4Qnl0ZXMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhc3NlcnRGYWxzZShyZXN1bHQuZ2V0TmV4dEJ1Y2tldChidWNrZXQpKTsKKyAgICAgICAgU3RyaW5nIG1zZyA9IFN0cmluZy5mb3JtYXQoInVpZCAlZCB0YWcgJXMgc3RhdGUgJXMiLAorICAgICAgICAgICAgICAgIFByb2Nlc3MubXlVaWQoKSwgdGFnVG9TdHJpbmcoZXhwZWN0ZWRUYWcpLCBzdGF0ZVRvU3RyaW5nKGV4cGVjdGVkU3RhdGUpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiTm8gUnggYnl0ZXMgdXNhZ2UgZm9yICIgKyBtc2csIHRvdGFsUnhCeXRlcyA+IDApOworICAgICAgICBhc3NlcnRUcnVlKCJObyBSeCBwYWNrZXRzIHVzYWdlIGZvciAiICsgbXNnLCB0b3RhbFJ4UGFja2V0cyA+IDApOworICAgICAgICBhc3NlcnRUcnVlKCJObyBUeCBieXRlcyB1c2FnZSBmb3IgIiArIG1zZywgdG90YWxUeEJ5dGVzID4gMCk7CisgICAgICAgIGFzc2VydFRydWUoIk5vIFR4IHBhY2tldHMgdXNhZ2UgZm9yICIgKyBtc2csIHRvdGFsVHhQYWNrZXRzID4gMCk7CisKKyAgICAgICAgcmV0dXJuIHRvdGFsUnhCeXRlcyArIHRvdGFsVHhCeXRlczsKKyAgICB9CisKKyAgICBwcml2YXRlIGxvbmcgZ2V0VG90YWxBbmRBc3NlcnROb3RFbXB0eShOZXR3b3JrU3RhdHMgcmVzdWx0KSB7CisgICAgICAgIHJldHVybiBnZXRUb3RhbEFuZEFzc2VydE5vdEVtcHR5KHJlc3VsdCwgbnVsbCwgU1RBVEVfQUxMKTsKKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgYXNzZXJ0VGltZXN0YW1wcyhmaW5hbCBOZXR3b3JrU3RhdHMuQnVja2V0IGJ1Y2tldCkgewogICAgICAgICBhc3NlcnRUcnVlKCJTdGFydCB0aW1lc3RhbXAgIiArIGJ1Y2tldC5nZXRTdGFydFRpbWVTdGFtcCgpICsgIiBpcyBsZXNzIHRoYW4gIiArCiAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZSwgYnVja2V0LmdldFN0YXJ0VGltZVN0YW1wKCkgPj0gbVN0YXJ0VGltZSk7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9hcHAudXNhZ2Uvc3JjL2FuZHJvaWQvYXBwL3VzYWdlL2N0cy9Vc2FnZVN0YXRzVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvYXBwLnVzYWdlL3NyYy9hbmRyb2lkL2FwcC91c2FnZS9jdHMvVXNhZ2VTdGF0c1Rlc3QuamF2YQppbmRleCBhMWI1YTcxLi5hNzRiNWE4IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9hcHAudXNhZ2Uvc3JjL2FuZHJvaWQvYXBwL3VzYWdlL2N0cy9Vc2FnZVN0YXRzVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2FwcC51c2FnZS9zcmMvYW5kcm9pZC9hcHAvdXNhZ2UvY3RzL1VzYWdlU3RhdHNUZXN0LmphdmEKQEAgLTE2LDI5ICsxNiw1MyBAQAogCiBwYWNrYWdlIGFuZHJvaWQuYXBwLnVzYWdlLmN0czsKIAoraW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3N1bWUuYXNzdW1lVHJ1ZTsKKwogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwogaW1wb3J0IGFuZHJvaWQuYXBwLkFwcE9wc01hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5hcHAuS2V5Z3VhcmRNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb25DaGFubmVsOworaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbk1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKK2ltcG9ydCBhbmRyb2lkLmFwcC51c2FnZS5FdmVudFN0YXRzOwogaW1wb3J0IGFuZHJvaWQuYXBwLnVzYWdlLlVzYWdlRXZlbnRzOworaW1wb3J0IGFuZHJvaWQuYXBwLnVzYWdlLlVzYWdlRXZlbnRzLkV2ZW50OwogaW1wb3J0IGFuZHJvaWQuYXBwLnVzYWdlLlVzYWdlU3RhdHM7CiBpbXBvcnQgYW5kcm9pZC5hcHAudXNhZ2UuVXNhZ2VTdGF0c01hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKIGltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC51aWF1dG9tYXRvci5CeTsKIGltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC51aWF1dG9tYXRvci5VaURldmljZTsKIGltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC51aWF1dG9tYXRvci5VbnRpbDsKLWltcG9ydCBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdENhc2U7CitpbXBvcnQgYW5kcm9pZC50ZXh0LmZvcm1hdC5EYXRlVXRpbHM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUxvbmdBcnJheTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNkZFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yOworaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQXBwU3RhbmRieVV0aWxzOwogCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIAogaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwpAQCAtNTcsOCArODEsMTEgQEAKICAqICAgYWxvbmcgd2l0aCB0aGUgbmV3IHRpbWUuCiAgKiAtIFByb3BlciBldmljdGlvbiBvZiBvbGQgZGF0YS4KICAqLwotQENkZFRlc3QocmVxdWlyZW1lbnQ9IjkuOC4xL0MtMS0xIikKLXB1YmxpYyBjbGFzcyBVc2FnZVN0YXRzVGVzdCBleHRlbmRzIEluc3RydW1lbnRhdGlvblRlc3RDYXNlIHsKK0BSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgVXNhZ2VTdGF0c1Rlc3QgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlVzYWdlU3RhdHNUZXN0IjsKKwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBPUFNfU0VUX1NIRUxMX0NPTU1BTkQgPSAiYXBwb3BzIHNldCB7MH0gIiArCiAgICAgICAgICAgICBBcHBPcHNNYW5hZ2VyLk9QU1RSX0dFVF9VU0FHRV9TVEFUUyArICIgezF9IjsKIApAQCAtNjksNDMgKzk2LDM5IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBNT05USCA9IDMwICogREFZOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgWUVBUiA9IDM2NSAqIERBWTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFRJTUVfRElGRl9USFJFU0hPTEQgPSAyMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENIQU5ORUxfSUQgPSAibXlfY2hhbm5lbCI7CisKIAogICAgIHByaXZhdGUgVWlEZXZpY2UgbVVpRGV2aWNlOwogICAgIHByaXZhdGUgVXNhZ2VTdGF0c01hbmFnZXIgbVVzYWdlU3RhdHNNYW5hZ2VyOwogICAgIHByaXZhdGUgU3RyaW5nIG1UYXJnZXRQYWNrYWdlOwogCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgbVVpRGV2aWNlID0gVWlEZXZpY2UuZ2V0SW5zdGFuY2UoZ2V0SW5zdHJ1bWVudGF0aW9uKCkpOwotICAgICAgICBtVXNhZ2VTdGF0c01hbmFnZXIgPSAoVXNhZ2VTdGF0c01hbmFnZXIpIGdldEluc3RydW1lbnRhdGlvbigpLmdldENvbnRleHQoKQotICAgICAgICAgICAgICAgIC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuVVNBR0VfU1RBVFNfU0VSVklDRSk7Ci0gICAgICAgIG1UYXJnZXRQYWNrYWdlID0gZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VOYW1lKCk7Ci0KKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbVVpRGV2aWNlID0gVWlEZXZpY2UuZ2V0SW5zdGFuY2UoSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkpOworICAgICAgICBtVXNhZ2VTdGF0c01hbmFnZXIgPSAoVXNhZ2VTdGF0c01hbmFnZXIpIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpCisgICAgICAgICAgICAgICAgLmdldENvbnRleHQoKS5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuVVNBR0VfU1RBVFNfU0VSVklDRSk7CisgICAgICAgIG1UYXJnZXRQYWNrYWdlID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VOYW1lKCk7CisgICAgICAgIGFzc3VtZVRydWUoIkFwcCBTdGFuZGJ5IG5vdCBlbmFibGVkIG9uIGRldmljZSIsIEFwcFN0YW5kYnlVdGlscy5pc0FwcFN0YW5kYnlFbmFibGVkKCkpOwogICAgICAgICBzZXRBcHBPcHNNb2RlKCJhbGxvdyIpOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0TGVzc1RoYW4obG9uZyBsZWZ0LCBsb25nIHJpZ2h0KSB7Ci0gICAgICAgIGlmIChsZWZ0ID49IHJpZ2h0KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbGVkRXJyb3IoIkV4cGVjdGVkICIgKyBsZWZ0ICsgIiB0byBiZSBsZXNzIHRoYW4gIiArIHJpZ2h0KTsKLSAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCAiICsgbGVmdCArICIgdG8gYmUgbGVzcyB0aGFuICIgKyByaWdodCwgbGVmdCA8IHJpZ2h0KTsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydExlc3NUaGFuT3JFcXVhbChsb25nIGxlZnQsIGxvbmcgcmlnaHQpIHsKLSAgICAgICAgaWYgKGxlZnQgPiByaWdodCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxlZEVycm9yKCJFeHBlY3RlZCAiICsgbGVmdCArICIgdG8gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICIKLSAgICAgICAgICAgICAgICAgICAgKyByaWdodCk7Ci0gICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgIiArIGxlZnQgKyAiIHRvIGJlIGxlc3MgdGhhbiAiICsgcmlnaHQsIGxlZnQgPD0gcmlnaHQpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBzZXRBcHBPcHNNb2RlKFN0cmluZyBtb2RlKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgU3RyaW5nIGNvbW1hbmQgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChBUFBPUFNfU0VUX1NIRUxMX0NPTU1BTkQsCi0gICAgICAgICAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VOYW1lKCksIG1vZGUpOworICAgICAgICAgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKS5nZXRQYWNrYWdlTmFtZSgpLCBtb2RlKTsKICAgICAgICAgbVVpRGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoY29tbWFuZCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGxhdW5jaFN1YkFjdGl2aXR5KENsYXNzPD8gZXh0ZW5kcyBBY3Rpdml0eT4gY2xhenopIHsKLSAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0ID0gZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0Q29udGV4dCgpOworICAgICAgICBmaW5hbCBDb250ZXh0IGNvbnRleHQgPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKS5nZXRDb250ZXh0KCk7CiAgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEludGVudC5BQ1RJT05fTUFJTik7CiAgICAgICAgIGludGVudC5zZXRDbGFzc05hbWUobVRhcmdldFBhY2thZ2UsIGNsYXp6LmdldE5hbWUoKSk7CiAgICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7CkBAIC0xMTksNiArMTQyLDggQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBBcHBNb2RlRnVsbCAvLyBObyB1c2FnZSBldmVudHMgYWNjZXNzIGluIGluc3RhbnQgYXBwcworICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE9yZGVyZWRBY3Rpdml0eUxhdW5jaFNlcXVlbmNlSW5FdmVudExvZygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIEFjdGl2aXR5PltdIGFjdGl2aXR5U2VxdWVuY2UgPSBuZXcgQ2xhc3NbXSB7CkBAIC0xODEsMTIgKzIwNiwxMjEgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBBcHBNb2RlRnVsbCAvLyBObyB1c2FnZSBldmVudHMgYWNjZXNzIGluIGluc3RhbnQgYXBwcworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFwcExhdW5jaENvdW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGxvbmcgZW5kVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBsb25nIHN0YXJ0VGltZSA9IGVuZFRpbWUgLSBEYXRlVXRpbHMuREFZX0lOX01JTExJUzsKKyAgICAgICAgTWFwPFN0cmluZyxVc2FnZVN0YXRzPiBldmVudHMgPSBtVXNhZ2VTdGF0c01hbmFnZXIucXVlcnlBbmRBZ2dyZWdhdGVVc2FnZVN0YXRzKAorICAgICAgICAgICAgICAgIHN0YXJ0VGltZSwgZW5kVGltZSk7CisgICAgICAgIFVzYWdlU3RhdHMgc3RhdHMgPSBldmVudHMuZ2V0KG1UYXJnZXRQYWNrYWdlKTsKKyAgICAgICAgaW50IHN0YXJ0aW5nQ291bnQgPSBzdGF0cy5nZXRBcHBMYXVuY2hDb3VudCgpOworICAgICAgICBsYXVuY2hTdWJBY3Rpdml0eShBY3Rpdml0aWVzLkFjdGl2aXR5T25lLmNsYXNzKTsKKyAgICAgICAgbGF1bmNoU3ViQWN0aXZpdHkoQWN0aXZpdGllcy5BY3Rpdml0eVR3by5jbGFzcyk7CisgICAgICAgIGVuZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgZXZlbnRzID0gbVVzYWdlU3RhdHNNYW5hZ2VyLnF1ZXJ5QW5kQWdncmVnYXRlVXNhZ2VTdGF0cygKKyAgICAgICAgICAgICAgICBzdGFydFRpbWUsIGVuZFRpbWUpOworICAgICAgICBzdGF0cyA9IGV2ZW50cy5nZXQobVRhcmdldFBhY2thZ2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoc3RhcnRpbmdDb3VudCArIDEsIHN0YXRzLmdldEFwcExhdW5jaENvdW50KCkpOworICAgICAgICBtVWlEZXZpY2UucHJlc3NIb21lKCk7CisgICAgICAgIGxhdW5jaFN1YkFjdGl2aXR5KEFjdGl2aXRpZXMuQWN0aXZpdHlPbmUuY2xhc3MpOworICAgICAgICBsYXVuY2hTdWJBY3Rpdml0eShBY3Rpdml0aWVzLkFjdGl2aXR5VHdvLmNsYXNzKTsKKyAgICAgICAgbGF1bmNoU3ViQWN0aXZpdHkoQWN0aXZpdGllcy5BY3Rpdml0eVRocmVlLmNsYXNzKTsKKyAgICAgICAgZW5kVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBldmVudHMgPSBtVXNhZ2VTdGF0c01hbmFnZXIucXVlcnlBbmRBZ2dyZWdhdGVVc2FnZVN0YXRzKAorICAgICAgICAgICAgICAgIHN0YXJ0VGltZSwgZW5kVGltZSk7CisgICAgICAgIHN0YXRzID0gZXZlbnRzLmdldChtVGFyZ2V0UGFja2FnZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhzdGFydGluZ0NvdW50ICsgMiwgc3RhdHMuZ2V0QXBwTGF1bmNoQ291bnQoKSk7CisgICAgfQorCisgICAgQEFwcE1vZGVGdWxsIC8vIE5vIHVzYWdlIGV2ZW50cyBhY2Nlc3MgaW4gaW5zdGFudCBhcHBzCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhbmRieUJ1Y2tldENoYW5nZUxvZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBsb25nIHN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBtVWlEZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZCgiYW0gc2V0LXN0YW5kYnktYnVja2V0ICIgKyBtVGFyZ2V0UGFja2FnZSArICIgcmFyZSIpOworCisgICAgICAgIGZpbmFsIGxvbmcgZW5kVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBVc2FnZUV2ZW50cyBldmVudHMgPSBtVXNhZ2VTdGF0c01hbmFnZXIucXVlcnlFdmVudHMoc3RhcnRUaW1lIC0gMV8wMDAsIGVuZFRpbWUgKyAxXzAwMCk7CisKKyAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworICAgICAgICAvLyBDaGVjayBhbGwgdGhlIGV2ZW50cy4KKyAgICAgICAgd2hpbGUgKGV2ZW50cy5oYXNOZXh0RXZlbnQoKSkgeworICAgICAgICAgICAgVXNhZ2VFdmVudHMuRXZlbnQgZXZlbnQgPSBuZXcgVXNhZ2VFdmVudHMuRXZlbnQoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZXZlbnRzLmdldE5leHRFdmVudChldmVudCkpOworICAgICAgICAgICAgaWYgKGV2ZW50LmdldEV2ZW50VHlwZSgpID09IFVzYWdlRXZlbnRzLkV2ZW50LlNUQU5EQllfQlVDS0VUX0NIQU5HRUQpIHsKKyAgICAgICAgICAgICAgICBmb3VuZCB8PSBldmVudC5nZXRBcHBTdGFuZGJ5QnVja2V0KCkgPT0gVXNhZ2VTdGF0c01hbmFnZXIuU1RBTkRCWV9CVUNLRVRfUkFSRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydFRydWUoZm91bmQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEFwcFN0YW5kYnlCdWNrZXRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gb3JpZ1ZhbHVlID0gQXBwU3RhbmRieVV0aWxzLmlzQXBwU3RhbmRieUVuYWJsZWRBdFJ1bnRpbWUoKTsKKyAgICAgICAgQXBwU3RhbmRieVV0aWxzLnNldEFwcFN0YW5kYnlFbmFibGVkQXRSdW50aW1lKHRydWUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzdW1lVHJ1ZSgiU2tpcCBHZXRBcHBTdGFuZGJ5IHRlc3Q6IGFwcCBzdGFuZGJ5IGlzIGRpc2FibGVkLiIsCisgICAgICAgICAgICAgICAgICAgIEFwcFN0YW5kYnlVdGlscy5pc0FwcFN0YW5kYnlFbmFibGVkKCkpOworCisgICAgICAgICAgICBtVWlEZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZCgiYW0gc2V0LXN0YW5kYnktYnVja2V0ICIgKyBtVGFyZ2V0UGFja2FnZSArICIgcmFyZSIpOworICAgICAgICAgICAgTWFwPFN0cmluZywgSW50ZWdlcj4gYnVja2V0TWFwID0gbVVzYWdlU3RhdHNNYW5hZ2VyLmdldEFwcFN0YW5kYnlCdWNrZXRzKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJObyBidWNrZXQgZGF0YSByZXR1cm5lZCIsIGJ1Y2tldE1hcC5zaXplKCkgPiAwKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBidWNrZXQgPSBidWNrZXRNYXAuZ2V0T3JEZWZhdWx0KG1UYXJnZXRQYWNrYWdlLCAtMSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBidWNrZXQgcmV0dXJuZWQgZm9yICIgKyBtVGFyZ2V0UGFja2FnZSwgYnVja2V0LAorICAgICAgICAgICAgICAgICAgICBVc2FnZVN0YXRzTWFuYWdlci5TVEFOREJZX0JVQ0tFVF9SQVJFKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIEFwcFN0YW5kYnlVdGlscy5zZXRBcHBTdGFuZGJ5RW5hYmxlZEF0UnVudGltZShvcmlnVmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QXBwU3RhbmRieUJ1Y2tldCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBBcHAgc2hvdWxkIGJlIGF0IGxlYXN0IGFjdGl2ZSwgc2luY2UgaXQncyBydW5uaW5nIGluc3RydW1lbnRhdGlvbiB0ZXN0cworICAgICAgICBhc3NlcnRMZXNzVGhhbk9yRXF1YWwoVXNhZ2VTdGF0c01hbmFnZXIuU1RBTkRCWV9CVUNLRVRfQUNUSVZFLAorICAgICAgICAgICAgICAgIG1Vc2FnZVN0YXRzTWFuYWdlci5nZXRBcHBTdGFuZGJ5QnVja2V0KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFF1ZXJ5RXZlbnRzRm9yU2VsZigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzZXRBcHBPcHNNb2RlKCJpZ25vcmUiKTsgLy8gVG8gZW5zdXJlIHBlcm1pc3Npb24gaXMgbm90IHJlcXVpcmVkCisgICAgICAgIC8vIFRpbWUgZHJpZnRzIG9mIDJzIGFyZSBleHBlY3RlZCBpbnNpZGUgdXNhZ2Ugc3RhdHMKKyAgICAgICAgZmluYWwgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gMl8wMDA7CisgICAgICAgIG1VaURldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKCJhbSBzZXQtc3RhbmRieS1idWNrZXQgIiArIG1UYXJnZXRQYWNrYWdlICsgIiByYXJlIik7CisgICAgICAgIFRocmVhZC5zbGVlcCgxMDApOworICAgICAgICBtVWlEZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZCgiYW0gc2V0LXN0YW5kYnktYnVja2V0ICIgKyBtVGFyZ2V0UGFja2FnZSArICIgd29ya2luZ19zZXQiKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKDEwMCk7CisgICAgICAgIGZpbmFsIGxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyAyXzAwMDsKKyAgICAgICAgZmluYWwgVXNhZ2VFdmVudHMgZXZlbnRzID0gbVVzYWdlU3RhdHNNYW5hZ2VyLnF1ZXJ5RXZlbnRzRm9yU2VsZihzdGFydCwgZW5kKTsKKyAgICAgICAgbG9uZyByYXJlVGltZVN0YW1wID0gZW5kICsgMTsgLy8gSW5pdGlhbGl6aW5nIGFzIHJhcmVUaW1lU3RhbXAgPiB3b3JraW5nVGltZVN0YW1wCisgICAgICAgIGxvbmcgd29ya2luZ1RpbWVTdGFtcCA9IHN0YXJ0IC0gMTsKKyAgICAgICAgaW50IG51bUV2ZW50cyA9IDA7CisgICAgICAgIHdoaWxlIChldmVudHMuaGFzTmV4dEV2ZW50KCkpIHsKKyAgICAgICAgICAgIFVzYWdlRXZlbnRzLkV2ZW50IGV2ZW50ID0gbmV3IFVzYWdlRXZlbnRzLkV2ZW50KCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGV2ZW50cy5nZXROZXh0RXZlbnQoZXZlbnQpKTsKKyAgICAgICAgICAgIG51bUV2ZW50cysrOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJFdmVudCBmb3IgYSBkaWZmZXJlbnQgcGFja2FnZSIsIG1UYXJnZXRQYWNrYWdlLCBldmVudC5nZXRQYWNrYWdlTmFtZSgpKTsKKyAgICAgICAgICAgIGlmIChldmVudC5nZXRFdmVudFR5cGUoKSA9PSBFdmVudC5TVEFOREJZX0JVQ0tFVF9DSEFOR0VEKSB7CisgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmdldEFwcFN0YW5kYnlCdWNrZXQoKSA9PSBVc2FnZVN0YXRzTWFuYWdlci5TVEFOREJZX0JVQ0tFVF9SQVJFKSB7CisgICAgICAgICAgICAgICAgICAgIHJhcmVUaW1lU3RhbXAgPSBldmVudC5nZXRUaW1lU3RhbXAoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXZlbnQuZ2V0QXBwU3RhbmRieUJ1Y2tldCgpID09IFVzYWdlU3RhdHNNYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAuU1RBTkRCWV9CVUNLRVRfV09SS0lOR19TRVQpIHsKKyAgICAgICAgICAgICAgICAgICAgd29ya2luZ1RpbWVTdGFtcCA9IGV2ZW50LmdldFRpbWVTdGFtcCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKCJPbmx5ICIgKyBudW1FdmVudHMgKyAiIGV2ZW50cyByZXR1cm5lZCIsIG51bUV2ZW50cyA+PSAyKTsKKyAgICAgICAgYXNzZXJ0TGVzc1RoYW4ocmFyZVRpbWVTdGFtcCwgd29ya2luZ1RpbWVTdGFtcCk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogV2UgY2FuJ3QgcnVuIHRoaXMgdGVzdCBiZWNhdXNlIHdlIGFyZSB1bmFibGUgdG8gY2hhbmdlIHRoZSBzeXN0ZW0gdGltZS4KICAgICAgKiBJdCB3b3VsZCBiZSBuaWNlIHRvIGFkZCBhIHNoZWxsIGNvbW1hbmQgb3Igb3RoZXIgdG8gYWxsb3cgdGhlIHNoZWxsIHVzZXIKICAgICAgKiB0byBzZXQgdGhlIHRpbWUsIHRoZXJlYnkgYWxsb3dpbmcgdGhpcyB0ZXN0IHRvIHNldCB0aGUgdGltZSB1c2luZyB0aGUgVUlBdXRvbWF0b3IuCiAgICAgICovCiAgICAgQElnbm9yZQorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgaWdub3JlX3Rlc3RTdGF0c0FyZVNoaWZ0ZWRJblRpbWVXaGVuU3lzdGVtVGltZUNoYW5nZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgbGF1bmNoU3ViQWN0aXZpdHkoQWN0aXZpdGllcy5BY3Rpdml0eU9uZS5jbGFzcyk7CiAgICAgICAgIGxhdW5jaFN1YkFjdGl2aXR5KEFjdGl2aXRpZXMuQWN0aXZpdHlUaHJlZS5jbGFzcyk7CkBAIC0yMjIsNiArMzU2LDcgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFVzYWdlRXZlbnRzUGFyY2VsaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIGxvbmcgc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBNSU5VVEU7CiAKQEAgLTI2MCw2ICszOTUsOCBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoZXZlbnRzLmhhc05leHRFdmVudCgpLCByZXBhcmNlbGVkRXZlbnRzLmhhc05leHRFdmVudCgpKTsKICAgICB9CiAKKyAgICBAQXBwTW9kZUZ1bGwgLy8gTm8gdXNhZ2UgZXZlbnRzIGFjY2VzcyBpbiBpbnN0YW50IGFwcHMKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RQYWNrYWdlVXNhZ2VTdGF0c0ludGVydmFscygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBmaW5hbCBsb25nIGJlZm9yZVRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKIApAQCAtMzAwLDExICs0MzcsMTIgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE5vQWNjZXNzU2lsZW50bHlGYWlscygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBmaW5hbCBsb25nIHN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gTUlOVVRFOwogCi0gICAgICAgIGxhdW5jaFN1YkFjdGl2aXR5KEFjdGl2aXRpZXMuQWN0aXZpdHlPbmUuY2xhc3MpOwotICAgICAgICBsYXVuY2hTdWJBY3Rpdml0eShBY3Rpdml0aWVzLkFjdGl2aXR5VGhyZWUuY2xhc3MpOworICAgICAgICBsYXVuY2hTdWJBY3Rpdml0eShhbmRyb2lkLmFwcC51c2FnZS5jdHMuQWN0aXZpdGllcy5BY3Rpdml0eU9uZS5jbGFzcyk7CisgICAgICAgIGxhdW5jaFN1YkFjdGl2aXR5KGFuZHJvaWQuYXBwLnVzYWdlLmN0cy5BY3Rpdml0aWVzLkFjdGl2aXR5VGhyZWUuY2xhc3MpOwogCiAgICAgICAgIGZpbmFsIGxvbmcgZW5kVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgICAgICBMaXN0PFVzYWdlU3RhdHM+IHN0YXRzID0gbVVzYWdlU3RhdHNNYW5hZ2VyLnF1ZXJ5VXNhZ2VTdGF0cyhVc2FnZVN0YXRzTWFuYWdlci5JTlRFUlZBTF9CRVNULApAQCAtMzE5LDQgKzQ1Nyw0MDkgQEAKICAgICAgICAgICAgICAgICBzdGFydFRpbWUsIGVuZFRpbWUpOwogICAgICAgICBhc3NlcnRUcnVlKHN0YXRzLmlzRW1wdHkoKSk7CiAgICAgfQorCisgICAgQEFwcE1vZGVGdWxsIC8vIE5vIHVzYWdlIGV2ZW50cyBhY2Nlc3MgaW4gaW5zdGFudCBhcHBzCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90aWZpY2F0aW9uU2VlbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBsb25nIHN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCk7CisgICAgICAgIGlmIChjb250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCkuaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX1dBVENIKSkgeworICAgICAgICAgICAgLy8gU2tpcCB0aGUgdGVzdCBmb3Igd2VhcmFibGUgZGV2aWNlLgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIE5vdGlmaWNhdGlvbk1hbmFnZXIgbU5vdGlmaWNhdGlvbk1hbmFnZXIgPQorICAgICAgICAgICAgKE5vdGlmaWNhdGlvbk1hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0Lk5PVElGSUNBVElPTl9TRVJWSUNFKTsKKyAgICAgICAgaW50IGltcG9ydGFuY2UgPSBOb3RpZmljYXRpb25NYW5hZ2VyLklNUE9SVEFOQ0VfREVGQVVMVDsKKyAgICAgICAgTm90aWZpY2F0aW9uQ2hhbm5lbCBtQ2hhbm5lbCA9IG5ldyBOb3RpZmljYXRpb25DaGFubmVsKENIQU5ORUxfSUQsICJDaGFubmVsIiwKKyAgICAgICAgICAgIGltcG9ydGFuY2UpOworICAgICAgICAvLyBDb25maWd1cmUgdGhlIG5vdGlmaWNhdGlvbiBjaGFubmVsLgorICAgICAgICBtQ2hhbm5lbC5zZXREZXNjcmlwdGlvbigiVGVzdCBjaGFubmVsIik7CisgICAgICAgIG1Ob3RpZmljYXRpb25NYW5hZ2VyLmNyZWF0ZU5vdGlmaWNhdGlvbkNoYW5uZWwobUNoYW5uZWwpOworICAgICAgICBOb3RpZmljYXRpb24uQnVpbGRlciBtQnVpbGRlciA9CisgICAgICAgICAgICAgICAgbmV3IE5vdGlmaWNhdGlvbi5CdWlsZGVyKGNvbnRleHQsIENIQU5ORUxfSUQpCisgICAgICAgICAgICAgICAgICAgIC5zZXRTbWFsbEljb24oUi5kcmF3YWJsZS5pY19ub3RpZmljYXRpb24pCisgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50VGl0bGUoIk15IG5vdGlmaWNhdGlvbiIpCisgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50VGV4dCgiSGVsbG8gV29ybGQhIik7CisgICAgICAgIFBlbmRpbmdJbnRlbnQgcGkgPSBQZW5kaW5nSW50ZW50LmdldEFjdGl2aXR5KGNvbnRleHQsIDEsCisgICAgICAgICAgICAgICAgbmV3IEludGVudChTZXR0aW5ncy5BQ1RJT05fU0VUVElOR1MpLCAwKTsKKyAgICAgICAgbUJ1aWxkZXIuc2V0Q29udGVudEludGVudChwaSk7CisgICAgICAgIG1Ob3RpZmljYXRpb25NYW5hZ2VyLm5vdGlmeSgxLCBtQnVpbGRlci5idWlsZCgpKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKDUwMCk7CisgICAgICAgIGxvbmcgZW5kVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBVc2FnZUV2ZW50cyBldmVudHMgPSBtVXNhZ2VTdGF0c01hbmFnZXIucXVlcnlFdmVudHMoc3RhcnRUaW1lLCBlbmRUaW1lKTsKKyAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworICAgICAgICBFdmVudCBldmVudCA9IG5ldyBFdmVudCgpOworICAgICAgICB3aGlsZSAoZXZlbnRzLmhhc05leHRFdmVudCgpKSB7CisgICAgICAgICAgICBldmVudHMuZ2V0TmV4dEV2ZW50KGV2ZW50KTsKKyAgICAgICAgICAgIGlmIChldmVudC5nZXRFdmVudFR5cGUoKSA9PSBFdmVudC5OT1RJRklDQVRJT05fU0VFTikgeworICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhc3NlcnRGYWxzZShmb3VuZCk7CisgICAgICAgIC8vIFB1bGwgZG93biBzaGFkZQorICAgICAgICBtVWlEZXZpY2Uub3Blbk5vdGlmaWNhdGlvbigpOworICAgICAgICBvdXRlcjoKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcCg1MDApOworICAgICAgICAgICAgZW5kVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgZXZlbnRzID0gbVVzYWdlU3RhdHNNYW5hZ2VyLnF1ZXJ5RXZlbnRzKHN0YXJ0VGltZSwgZW5kVGltZSk7CisgICAgICAgICAgICBmb3VuZCA9IGZhbHNlOworICAgICAgICAgICAgd2hpbGUgKGV2ZW50cy5oYXNOZXh0RXZlbnQoKSkgeworICAgICAgICAgICAgICAgIGV2ZW50cy5nZXROZXh0RXZlbnQoZXZlbnQpOworICAgICAgICAgICAgICAgIGlmIChldmVudC5nZXRFdmVudFR5cGUoKSA9PSBFdmVudC5OT1RJRklDQVRJT05fU0VFTikgeworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrIG91dGVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKGZvdW5kKTsKKyAgICAgICAgbVVpRGV2aWNlLnByZXNzQmFjaygpOworICAgIH0KKworICAgIHN0YXRpYyBmaW5hbCBpbnRbXSBJTlRFUkFDVElWRV9FVkVOVFMgPSBuZXcgaW50W10geworICAgICAgICAgICAgRXZlbnQuU0NSRUVOX0lOVEVSQUNUSVZFLAorICAgICAgICAgICAgRXZlbnQuU0NSRUVOX05PTl9JTlRFUkFDVElWRQorICAgIH07CisKKyAgICBzdGF0aWMgZmluYWwgaW50W10gS0VZR1VBUkRfRVZFTlRTID0gbmV3IGludFtdIHsKKyAgICAgICAgICAgIEV2ZW50LktFWUdVQVJEX1NIT1dOLAorICAgICAgICAgICAgRXZlbnQuS0VZR1VBUkRfSElEREVOCisgICAgfTsKKworICAgIHN0YXRpYyBmaW5hbCBpbnRbXSBBTExfRVZFTlRTID0gbmV3IGludFtdIHsKKyAgICAgICAgICAgIEV2ZW50LlNDUkVFTl9JTlRFUkFDVElWRSwKKyAgICAgICAgICAgIEV2ZW50LlNDUkVFTl9OT05fSU5URVJBQ1RJVkUsCisgICAgICAgICAgICBFdmVudC5LRVlHVUFSRF9TSE9XTiwKKyAgICAgICAgICAgIEV2ZW50LktFWUdVQVJEX0hJRERFTgorICAgIH07CisKKyAgICBwcml2YXRlIGxvbmcgZ2V0RXZlbnRzKGludFtdIHdoaWNoRXZlbnRzLCBsb25nIHN0YXJ0VGltZSwgTGlzdDxFdmVudD4gb3V0KSB7CisgICAgICAgIGZpbmFsIGxvbmcgZW5kVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBpZiAoREVCVUcpIExvZy5pKFRBRywgIkxvb2tpbmcgZm9yIGV2ZW50cyAiICsgQXJyYXlzLnRvU3RyaW5nKHdoaWNoRXZlbnRzKQorICAgICAgICAgICAgICAgICsgIiBiZXR3ZWVuICIgKyBzdGFydFRpbWUgKyAiIGFuZCAiICsgZW5kVGltZSk7CisgICAgICAgIFVzYWdlRXZlbnRzIGV2ZW50cyA9IG1Vc2FnZVN0YXRzTWFuYWdlci5xdWVyeUV2ZW50cyhzdGFydFRpbWUsIGVuZFRpbWUpOworCisgICAgICAgIGxvbmcgbGF0ZXN0VGltZSA9IDA7CisKKyAgICAgICAgLy8gRmluZCBldmVudHMuCisgICAgICAgIHdoaWxlIChldmVudHMuaGFzTmV4dEV2ZW50KCkpIHsKKyAgICAgICAgICAgIFVzYWdlRXZlbnRzLkV2ZW50IGV2ZW50ID0gbmV3IFVzYWdlRXZlbnRzLkV2ZW50KCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGV2ZW50cy5nZXROZXh0RXZlbnQoZXZlbnQpKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBldiA9IGV2ZW50LmdldEV2ZW50VHlwZSgpOworICAgICAgICAgICAgZm9yIChpbnQgd2hpY2ggOiB3aGljaEV2ZW50cykgeworICAgICAgICAgICAgICAgIGlmIChldiA9PSB3aGljaCkgeworICAgICAgICAgICAgICAgICAgICBpZiAob3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5hZGQoZXZlbnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmkoVEFHLCAiTmV4dCBldmVudCB0eXBlICIgKyBldmVudC5nZXRFdmVudFR5cGUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB0aW1lPSIgKyBldmVudC5nZXRUaW1lU3RhbXAoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChsYXRlc3RUaW1lIDwgZXZlbnQuZ2V0VGltZVN0YW1wKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVzdFRpbWUgPSBldmVudC5nZXRUaW1lU3RhbXAoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbGF0ZXN0VGltZTsKKyAgICB9CisKKyAgICBwcml2YXRlIEFycmF5TGlzdDxFdmVudD4gd2FpdEZvckV2ZW50Q291bnQoaW50W10gd2hpY2hFdmVudHMsIGxvbmcgc3RhcnRUaW1lLCBpbnQgY291bnQpIHsKKyAgICAgICAgZmluYWwgQXJyYXlMaXN0PEV2ZW50PiBldmVudHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgZmluYWwgbG9uZyBlbmRUaW1lID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkgKyAyMDAwOworICAgICAgICBkbyB7CisgICAgICAgICAgICBldmVudHMuY2xlYXIoKTsKKyAgICAgICAgICAgIGdldEV2ZW50cyh3aGljaEV2ZW50cywgc3RhcnRUaW1lLCBldmVudHMpOworICAgICAgICAgICAgaWYgKGV2ZW50cy5zaXplKCkgPT0gY291bnQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXZlbnRzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGV2ZW50cy5zaXplKCkgPiBjb3VudCkgeworICAgICAgICAgICAgICAgIGZhaWwoIkZvdW5kIHRvbyBtYW55IGV2ZW50czogZ290ICIgKyBldmVudHMuc2l6ZSgpICsgIiwgZXhwZWN0ZWQgIiArIGNvdW50KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXZlbnRzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3lzdGVtQ2xvY2suc2xlZXAoMTApOworICAgICAgICB9IHdoaWxlIChTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSA8IGVuZFRpbWUpOworCisgICAgICAgIGZhaWwoIlRpbWVkIG91dCB3YWl0aW5nIGZvciAiICsgY291bnQgKyAiIGV2ZW50cywgb25seSByZWFjaGVkICIgKyBldmVudHMuc2l6ZSgpKTsKKyAgICAgICAgcmV0dXJuIGV2ZW50czsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgQWdnckV2ZW50RGF0YSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBsYWJlbDsKKyAgICAgICAgaW50IGNvdW50OworICAgICAgICBsb25nIGR1cmF0aW9uOworICAgICAgICBsb25nIGxhc3RFdmVudFRpbWU7CisKKyAgICAgICAgQWdnckV2ZW50RGF0YShTdHJpbmcgbGFiZWwpIHsKKyAgICAgICAgICAgIHRoaXMubGFiZWwgPSBsYWJlbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBBZ2dyQWxsRXZlbnRzRGF0YSB7CisgICAgICAgIGZpbmFsIEFnZ3JFdmVudERhdGEgaW50ZXJhY3RpdmUgPSBuZXcgQWdnckV2ZW50RGF0YSgiSW50ZXJhY3RpdmUiKTsKKyAgICAgICAgZmluYWwgQWdnckV2ZW50RGF0YSBub25JbnRlcmFjdGl2ZSA9IG5ldyBBZ2dyRXZlbnREYXRhKCJOb24taW50ZXJhY3RpdmUiKTsKKyAgICAgICAgZmluYWwgQWdnckV2ZW50RGF0YSBrZXlndWFyZFNob3duID0gbmV3IEFnZ3JFdmVudERhdGEoIktleWd1YXJkIHNob3duIik7CisgICAgICAgIGZpbmFsIEFnZ3JFdmVudERhdGEga2V5Z3VhcmRIaWRkZW4gPSBuZXcgQWdnckV2ZW50RGF0YSgiS2V5Z3VhcmQgaGlkZGVuIik7CisgICAgICAgIGludCBpbnRlcmFjdGl2ZUNvdW50OworICAgICAgICBsb25nIGludGVyYWN0aXZlRHVyYXRpb247CisgICAgICAgIGxvbmcgaW50ZXJhY3RpdmVMYXN0RXZlbnRUaW1lOworICAgICAgICBpbnQgbm9uSW50ZXJhY3RpdmVDb3VudDsKKyAgICAgICAgbG9uZyBub25JbnRlcmFjdGl2ZUR1cmF0aW9uOworICAgICAgICBsb25nIG5vbkludGVyYWN0aXZlTGFzdEV2ZW50VGltZTsKKyAgICAgICAgaW50IGtleWd1YXJkU2hvd25Db3VudDsKKyAgICAgICAgbG9uZyBrZXlndWFyZFNob3duRHVyYXRpb247CisgICAgICAgIGludCBrZXlndWFyZEhpZGRlbkNvdW50OworICAgICAgICBsb25nIGtleWd1YXJkSGlkZGVuRHVyYXRpb247CisgICAgfQorCisgICAgcHJpdmF0ZSBTcGFyc2VBcnJheTxBZ2dyQWxsRXZlbnRzRGF0YT4gZ2V0QWdnckV2ZW50RGF0YShsb25nIGJlZm9yZVRpbWUpIHsKKyAgICAgICAgZmluYWwgbG9uZyBlbmRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKyAgICAgICAgZmluYWwgU3BhcnNlTG9uZ0FycmF5IGludGVydmFsTGVuZ3RocyA9IG5ldyBTcGFyc2VMb25nQXJyYXkoKTsKKyAgICAgICAgaW50ZXJ2YWxMZW5ndGhzLnB1dChVc2FnZVN0YXRzTWFuYWdlci5JTlRFUlZBTF9EQUlMWSwgREFZKTsKKyAgICAgICAgaW50ZXJ2YWxMZW5ndGhzLnB1dChVc2FnZVN0YXRzTWFuYWdlci5JTlRFUlZBTF9XRUVLTFksIFdFRUspOworICAgICAgICBpbnRlcnZhbExlbmd0aHMucHV0KFVzYWdlU3RhdHNNYW5hZ2VyLklOVEVSVkFMX01PTlRITFksIE1PTlRIKTsKKyAgICAgICAgaW50ZXJ2YWxMZW5ndGhzLnB1dChVc2FnZVN0YXRzTWFuYWdlci5JTlRFUlZBTF9ZRUFSTFksIFlFQVIpOworCisgICAgICAgIGZpbmFsIFNwYXJzZUFycmF5PEFnZ3JBbGxFdmVudHNEYXRhPiBhbGxBZ2dyID0gbmV3IFNwYXJzZUFycmF5PD4oKTsKKworICAgICAgICBmaW5hbCBpbnQgaW50ZXJ2YWxDb3VudCA9IGludGVydmFsTGVuZ3Rocy5zaXplKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJ2YWxDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgaW50ZXJ2YWxUeXBlID0gaW50ZXJ2YWxMZW5ndGhzLmtleUF0KGkpOworICAgICAgICAgICAgZmluYWwgbG9uZyBpbnRlcnZhbER1cmF0aW9uID0gaW50ZXJ2YWxMZW5ndGhzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICBmaW5hbCBsb25nIHN0YXJ0VGltZSA9IGVuZFRpbWUgLSAoMiAqIGludGVydmFsRHVyYXRpb24pOworICAgICAgICAgICAgTGlzdDxFdmVudFN0YXRzPiBzdGF0c0xpc3QgPSBtVXNhZ2VTdGF0c01hbmFnZXIucXVlcnlFdmVudFN0YXRzKGludGVydmFsVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLCBlbmRUaW1lKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKHN0YXRzTGlzdC5pc0VtcHR5KCkpOworCisgICAgICAgICAgICBmaW5hbCBBZ2dyQWxsRXZlbnRzRGF0YSBhZ2dyID0gbmV3IEFnZ3JBbGxFdmVudHNEYXRhKCk7CisgICAgICAgICAgICBhbGxBZ2dyLnB1dChpbnRlcnZhbFR5cGUsIGFnZ3IpOworCisgICAgICAgICAgICBib29sZWFuIGZvdW5kRXZlbnQgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoRXZlbnRTdGF0cyBzdGF0cyA6IHN0YXRzTGlzdCkgeworICAgICAgICAgICAgICAgIC8vIFZlcmlmeSB0aGF0IGVhY2ggcGVyaW9kIGlzIGEgZGF5IGxvbmcuCisgICAgICAgICAgICAgICAgLy9hc3NlcnRMZXNzVGhhbk9yRXF1YWwoc3RhdHMuZ2V0TGFzdFRpbWVTdGFtcCgpIC0gc3RhdHMuZ2V0Rmlyc3RUaW1lU3RhbXAoKSwKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgaW50ZXJ2YWxEdXJhdGlvbik7CisgICAgICAgICAgICAgICAgQWdnckV2ZW50RGF0YSBkYXRhID0gbnVsbDsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHN0YXRzLmdldEV2ZW50VHlwZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRXZlbnQuU0NSRUVOX0lOVEVSQUNUSVZFOgorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGFnZ3IuaW50ZXJhY3RpdmU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBFdmVudC5TQ1JFRU5fTk9OX0lOVEVSQUNUSVZFOgorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGFnZ3Iubm9uSW50ZXJhY3RpdmU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBFdmVudC5LRVlHVUFSRF9ISURERU46CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gYWdnci5rZXlndWFyZEhpZGRlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEV2ZW50LktFWUdVQVJEX1NIT1dOOgorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGFnZ3Iua2V5Z3VhcmRTaG93bjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kRXZlbnQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBkYXRhLmNvdW50ICs9IHN0YXRzLmdldENvdW50KCk7CisgICAgICAgICAgICAgICAgICAgIGRhdGEuZHVyYXRpb24gKz0gc3RhdHMuZ2V0VG90YWxUaW1lKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmxhc3RFdmVudFRpbWUgPCBzdGF0cy5nZXRMYXN0RXZlbnRUaW1lKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEubGFzdEV2ZW50VGltZSA9IHN0YXRzLmdldExhc3RFdmVudFRpbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRGlkIG5vdCBmaW5kIGV2ZW50IGRhdGEgaW4gaW50ZXJ2YWwgIiArIGludGVydmFsVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgZm91bmRFdmVudCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYWxsQWdncjsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5Q291bnQoaW50IG9sZENvdW50LCBpbnQgbmV3Q291bnQsIGJvb2xlYW4gbGFyZ2VyLCBTdHJpbmcgbGFiZWwsCisgICAgICAgICAgICBpbnQgaW50ZXJ2YWwpIHsKKyAgICAgICAgaWYgKGxhcmdlcikgeworICAgICAgICAgICAgaWYgKG5ld0NvdW50IDw9IG9sZENvdW50KSB7CisgICAgICAgICAgICAgICAgZmFpbChsYWJlbCArICIgY291bnQgbmV3ZXIgIiArIG5ld0NvdW50CisgICAgICAgICAgICAgICAgICAgICAgICArICIgZXhwZWN0ZWQgdG8gYmUgbGFyZ2VyIHRoYW4gb2xkZXIgIiArIG9sZENvdW50CisgICAgICAgICAgICAgICAgICAgICAgICArICIgQCBpbnRlcnZhbCAiICsgaW50ZXJ2YWwpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG5ld0NvdW50ICE9IG9sZENvdW50KSB7CisgICAgICAgICAgICAgICAgZmFpbChsYWJlbCArICIgY291bnQgbmV3ZXIgIiArIG5ld0NvdW50CisgICAgICAgICAgICAgICAgICAgICAgICArICIgZXhwZWN0ZWQgdG8gYmUgc2FtZSBhcyBvbGRlciAiICsgb2xkQ291bnQKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBAIGludGVydmFsICIgKyBpbnRlcnZhbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5RHVyYXRpb24obG9uZyBvbGREdXIsIGxvbmcgbmV3RHVyLCBib29sZWFuIGxhcmdlciwgU3RyaW5nIGxhYmVsLAorICAgICAgICAgICAgaW50IGludGVydmFsKSB7CisgICAgICAgIGlmIChsYXJnZXIpIHsKKyAgICAgICAgICAgIGlmIChuZXdEdXIgPD0gb2xkRHVyKSB7CisgICAgICAgICAgICAgICAgZmFpbChsYWJlbCArICIgZHVyYXRpb24gbmV3ZXIgIiArIG5ld0R1cgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGV4cGVjdGVkIHRvIGJlIGxhcmdlciB0aGFuIG9sZGVyICIgKyBvbGREdXIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBAIGludGVydmFsICIgKyBpbnRlcnZhbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobmV3RHVyICE9IG9sZER1cikgeworICAgICAgICAgICAgICAgIGZhaWwobGFiZWwgKyAiIGR1cmF0aW9uIG5ld2VyICIgKyBuZXdEdXIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBleHBlY3RlZCB0byBiZSBzYW1lIGFzIG9sZGVyICIgKyBvbGREdXIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBAIGludGVydmFsICIgKyBpbnRlcnZhbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5QWdnckV2ZW50RGF0YShBZ2dyRXZlbnREYXRhIG9sZGVyLCBBZ2dyRXZlbnREYXRhIG5ld2VyLAorICAgICAgICAgICAgYm9vbGVhbiBjb3VudExhcmdlciwgYm9vbGVhbiBkdXJhdGlvbkxhcmdlciwgaW50IGludGVydmFsKSB7CisgICAgICAgIHZlcmlmeUNvdW50KG9sZGVyLmNvdW50LCBuZXdlci5jb3VudCwgY291bnRMYXJnZXIsIG9sZGVyLmxhYmVsLCBpbnRlcnZhbCk7CisgICAgICAgIHZlcmlmeUR1cmF0aW9uKG9sZGVyLmR1cmF0aW9uLCBuZXdlci5kdXJhdGlvbiwgZHVyYXRpb25MYXJnZXIsIG9sZGVyLmxhYmVsLCBpbnRlcnZhbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUFnZ3JJbnRlcmFjdGl2ZUV2ZW50RGF0YShTcGFyc2VBcnJheTxBZ2dyQWxsRXZlbnRzRGF0YT4gb2xkZXIsCisgICAgICAgICAgICBTcGFyc2VBcnJheTxBZ2dyQWxsRXZlbnRzRGF0YT4gbmV3ZXIsIGJvb2xlYW4gaW50ZXJhY3RpdmVMYXJnZXIsCisgICAgICAgICAgICBib29sZWFuIG5vbkludGVyYWN0aXZlTGFyZ2VyKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb2xkZXIuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIEFnZ3JBbGxFdmVudHNEYXRhIG8gPSBvbGRlci52YWx1ZUF0KGkpOworICAgICAgICAgICAgQWdnckFsbEV2ZW50c0RhdGEgbiA9IG5ld2VyLnZhbHVlQXQoaSk7CisgICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSB0b2xkIHNvbWV0aGluZyBpcyBsYXJnZXIsIHRoYXQgbWVhbnMgd2UgaGF2ZSB0cmFuc2l0aW9uZWQKKyAgICAgICAgICAgIC8vICpvdXQqIG9mIHRoYXQgc3RhdGUgLS0gc28gdGhlIGR1cmF0aW9uIG9mIHRoYXQgc3RhdGUgaXMgZXhwZWN0ZWQgdG8KKyAgICAgICAgICAgIC8vIGluY3JlYXNlLCBidXQgdGhlIGNvdW50IHNob3VsZCBzdGF5IHRoZSBzYW1lIChhbmQgdGhlIGNvdW50IG9mIHRoZSBzdGF0ZQorICAgICAgICAgICAgLy8gd2UgdHJhbnNpdGlvbiB0byBpcyBpbmNyZWFzZWQpLgorICAgICAgICAgICAgZmluYWwgaW50IGludGVydmFsID0gb2xkZXIua2V5QXQoaSk7CisgICAgICAgICAgICB2ZXJpZnlBZ2dyRXZlbnREYXRhKG8uaW50ZXJhY3RpdmUsIG4uaW50ZXJhY3RpdmUsIG5vbkludGVyYWN0aXZlTGFyZ2VyLAorICAgICAgICAgICAgICAgICAgICBpbnRlcmFjdGl2ZUxhcmdlciwgaW50ZXJ2YWwpOworICAgICAgICAgICAgdmVyaWZ5QWdnckV2ZW50RGF0YShvLm5vbkludGVyYWN0aXZlLCBuLm5vbkludGVyYWN0aXZlLCBpbnRlcmFjdGl2ZUxhcmdlciwKKyAgICAgICAgICAgICAgICAgICAgbm9uSW50ZXJhY3RpdmVMYXJnZXIsIGludGVydmFsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlBZ2dyS2V5Z3VhcmRFdmVudERhdGEoU3BhcnNlQXJyYXk8QWdnckFsbEV2ZW50c0RhdGE+IG9sZGVyLAorICAgICAgICAgICAgU3BhcnNlQXJyYXk8QWdnckFsbEV2ZW50c0RhdGE+IG5ld2VyLCBib29sZWFuIGhpZGRlbkxhcmdlciwKKyAgICAgICAgICAgIGJvb2xlYW4gc2hvd25MYXJnZXIpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRlci5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgQWdnckFsbEV2ZW50c0RhdGEgbyA9IG9sZGVyLnZhbHVlQXQoaSk7CisgICAgICAgICAgICBBZ2dyQWxsRXZlbnRzRGF0YSBuID0gbmV3ZXIudmFsdWVBdChpKTsKKyAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIHRvbGQgc29tZXRoaW5nIGlzIGxhcmdlciwgdGhhdCBtZWFucyB3ZSBoYXZlIHRyYW5zaXRpb25lZAorICAgICAgICAgICAgLy8gKm91dCogb2YgdGhhdCBzdGF0ZSAtLSBzbyB0aGUgZHVyYXRpb24gb2YgdGhhdCBzdGF0ZSBpcyBleHBlY3RlZCB0bworICAgICAgICAgICAgLy8gaW5jcmVhc2UsIGJ1dCB0aGUgY291bnQgc2hvdWxkIHN0YXkgdGhlIHNhbWUgKGFuZCB0aGUgY291bnQgb2YgdGhlIHN0YXRlCisgICAgICAgICAgICAvLyB3ZSB0cmFuc2l0aW9uIHRvIGlzIGluY3JlYXNlZCkuCisgICAgICAgICAgICBmaW5hbCBpbnQgaW50ZXJ2YWwgPSBvbGRlci5rZXlBdChpKTsKKyAgICAgICAgICAgIHZlcmlmeUFnZ3JFdmVudERhdGEoby5rZXlndWFyZEhpZGRlbiwgbi5rZXlndWFyZEhpZGRlbiwgc2hvd25MYXJnZXIsCisgICAgICAgICAgICAgICAgICAgIGhpZGRlbkxhcmdlciwgaW50ZXJ2YWwpOworICAgICAgICAgICAgdmVyaWZ5QWdnckV2ZW50RGF0YShvLmtleWd1YXJkU2hvd24sIG4ua2V5Z3VhcmRTaG93biwgaGlkZGVuTGFyZ2VyLAorICAgICAgICAgICAgICAgICAgICBzaG93bkxhcmdlciwgaW50ZXJ2YWwpOworICAgICAgICB9CisgICAgfQorCisgICAgQEFwcE1vZGVGdWxsIC8vIE5vIHVzYWdlIGV2ZW50cyBhY2Nlc3MgaW4gaW5zdGFudCBhcHBzCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW50ZXJhY3RpdmVFdmVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgS2V5Z3VhcmRNYW5hZ2VyIGttZ3IgPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKQorICAgICAgICAgICAgICAgIC5nZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShLZXlndWFyZE1hbmFnZXIuY2xhc3MpOworCisgICAgICAgIC8vIFdlIG5lZWQgdG8gc3RhcnQgb3V0IHdpdGggdGhlIHNjcmVlbiBvbi4KKyAgICAgICAgaWYgKCFtVWlEZXZpY2UuaXNTY3JlZW5PbigpKSB7CisgICAgICAgICAgICBwcmVzc1dha2VVcCgpOworICAgICAgICAgICAgU3lzdGVtQ2xvY2suc2xlZXAoMTAwMCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBBbHNvIHdhbnQgdG8gc3RhcnQgb3V0IHdpdGggdGhlIGtleWd1YXJkIGRpc21pc3NlZC4KKyAgICAgICAgaWYgKGttZ3IuaXNLZXlndWFyZExvY2tlZCgpKSB7CisgICAgICAgICAgICBmaW5hbCBsb25nIHN0YXJ0VGltZSA9IGdldEV2ZW50cyhLRVlHVUFSRF9FVkVOVFMsIDAsIG51bGwpICsgMTsKKyAgICAgICAgICAgIG1VaURldmljZS5leGVjdXRlU2hlbGxDb21tYW5kKCJ3bSBkaXNtaXNzLWtleWd1YXJkIik7CisgICAgICAgICAgICBBcnJheUxpc3Q8RXZlbnQ+IGV2ZW50cyA9IHdhaXRGb3JFdmVudENvdW50KEtFWUdVQVJEX0VWRU5UUywgc3RhcnRUaW1lLCAxKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhFdmVudC5LRVlHVUFSRF9ISURERU4sIGV2ZW50cy5nZXQoMCkuZ2V0RXZlbnRUeXBlKCkpOworICAgICAgICAgICAgU3lzdGVtQ2xvY2suc2xlZXAoNTAwKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBBcnJheUxpc3Q8RXZlbnQ+IGV2ZW50czsKKworICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIHRpbWUgdG8gc3RhcnQgbG9va2luZyBmb3IgZXZlbnRzLgorICAgICAgICAgICAgZmluYWwgbG9uZyBzdGFydFRpbWUgPSBnZXRFdmVudHMoQUxMX0VWRU5UUywgMCwgbnVsbCkgKyAxOworICAgICAgICAgICAgU3BhcnNlQXJyYXk8QWdnckFsbEV2ZW50c0RhdGE+IGJhc2VBZ2dyID0gZ2V0QWdnckV2ZW50RGF0YSgwKTsKKworICAgICAgICAgICAgLy8gRmlyc3QgdGVzdCAtLSBwdXQgZGV2aWNlIHRvIHNsZWVwIGFuZCBtYWtlIHN1cmUgd2Ugc2VlIHRoaXMgZXZlbnQuCisgICAgICAgICAgICBwcmVzc1NsZWVwKCk7CisKKyAgICAgICAgICAgIC8vIERvIHdlIGhhdmUgb25lIGV2ZW50LCBnb2luZyBpbiB0byBub24taW50ZXJhY3RpdmUgbW9kZT8KKyAgICAgICAgICAgIGV2ZW50cyA9IHdhaXRGb3JFdmVudENvdW50KElOVEVSQUNUSVZFX0VWRU5UUywgc3RhcnRUaW1lLCAxKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhFdmVudC5TQ1JFRU5fTk9OX0lOVEVSQUNUSVZFLCBldmVudHMuZ2V0KDApLmdldEV2ZW50VHlwZSgpKTsKKyAgICAgICAgICAgIFNwYXJzZUFycmF5PEFnZ3JBbGxFdmVudHNEYXRhPiBvZmZBZ2dyID0gZ2V0QWdnckV2ZW50RGF0YShzdGFydFRpbWUpOworICAgICAgICAgICAgdmVyaWZ5QWdnckludGVyYWN0aXZlRXZlbnREYXRhKGJhc2VBZ2dyLCBvZmZBZ2dyLCB0cnVlLCBmYWxzZSk7CisKKyAgICAgICAgICAgIC8vIE5leHQgdGVzdCAtLSB0dXJuIHNjcmVlbiBvbiBhbmQgbWFrZSBzdXJlIHdlIGhhdmUgYSBzZWNvbmQgZXZlbnQuCisgICAgICAgICAgICAvLyBYWFggbmVlZCB0byB3YWl0IGEgYml0IHNvIHdlIGRvbid0IGFjY2lkZW50YWxseSB0cmlnZ2VyIGRvdWJsZS1wb3dlcgorICAgICAgICAgICAgLy8gdG8gbGF1bmNoIGNhbWVyYS4gIChTSE9VTEQgRklYIEhPVyBXRSBXQUtFVVAgLyBTTEVFUCBUTyBOT1QgVVNFIFBPV0VSIEtFWSkKKyAgICAgICAgICAgIFN5c3RlbUNsb2NrLnNsZWVwKDUwMCk7CisgICAgICAgICAgICBwcmVzc1dha2VVcCgpOworICAgICAgICAgICAgZXZlbnRzID0gd2FpdEZvckV2ZW50Q291bnQoSU5URVJBQ1RJVkVfRVZFTlRTLCBzdGFydFRpbWUsIDIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEV2ZW50LlNDUkVFTl9OT05fSU5URVJBQ1RJVkUsIGV2ZW50cy5nZXQoMCkuZ2V0RXZlbnRUeXBlKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEV2ZW50LlNDUkVFTl9JTlRFUkFDVElWRSwgZXZlbnRzLmdldCgxKS5nZXRFdmVudFR5cGUoKSk7CisgICAgICAgICAgICBTcGFyc2VBcnJheTxBZ2dyQWxsRXZlbnRzRGF0YT4gb25BZ2dyID0gZ2V0QWdnckV2ZW50RGF0YShzdGFydFRpbWUpOworICAgICAgICAgICAgdmVyaWZ5QWdnckludGVyYWN0aXZlRXZlbnREYXRhKG9mZkFnZ3IsIG9uQWdnciwgZmFsc2UsIHRydWUpOworCisgICAgICAgICAgICAvLyBJZiB0aGUgZGV2aWNlIGlzIGRvaW5nIGEgbG9jayBzY3JlZW4sIHZlcmlmeSB0aGF0IHdlIGFyZSBhbHNvIHNlZWluZyB0aGUKKyAgICAgICAgICAgIC8vIGFwcHJvcHJpYXRlIGtleWd1YXJkIGJlaGF2aW9yLiAgV2UgZG9uJ3Qga25vdyB0aGUgdGltaW5nIGZyb20gd2hlbiB0aGUgc2NyZWVuCisgICAgICAgICAgICAvLyB3aWxsIGdvIG9mZiB1bnRpbCB0aGUga2V5Z3VhcmQgaXMgc2hvd24sIHNvIHdlIHdpbGwgZG8gdGhpcyBhbGwgYWZ0ZXIgdHVybmluZworICAgICAgICAgICAgLy8gdGhlIHNjcmVlbiBiYWNrIG9uIChhdCB3aGljaCBwb2ludCBpdCBtdXN0IGJlIHNob3duKS4KKyAgICAgICAgICAgIC8vIFhYWCBDVFMgc2VlbXMgdG8gYmUgcHJldmVudGluZyB0aGUga2V5Z3VhcmQgZnJvbSBzaG93aW5nLCBzbyB0aGlzIHBhdGggaXMKKyAgICAgICAgICAgIC8vIG5ldmVyIGJlaW5nIHRlc3RlZC4KKyAgICAgICAgICAgIGlmIChrbWdyLmlzS2V5Z3VhcmRMb2NrZWQoKSkgeworICAgICAgICAgICAgICAgIGV2ZW50cyA9IHdhaXRGb3JFdmVudENvdW50KEtFWUdVQVJEX0VWRU5UUywgc3RhcnRUaW1lLCAxKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoRXZlbnQuS0VZR1VBUkRfU0hPV04sIGV2ZW50cy5nZXQoMCkuZ2V0RXZlbnRUeXBlKCkpOworICAgICAgICAgICAgICAgIFNwYXJzZUFycmF5PEFnZ3JBbGxFdmVudHNEYXRhPiBzaG93bkFnZ3IgPSBnZXRBZ2dyRXZlbnREYXRhKHN0YXJ0VGltZSk7CisgICAgICAgICAgICAgICAgdmVyaWZ5QWdncktleWd1YXJkRXZlbnREYXRhKG9mZkFnZ3IsIHNob3duQWdnciwgdHJ1ZSwgZmFsc2UpOworCisgICAgICAgICAgICAgICAgLy8gTm93IGRpc21pc3MgdGhlIGtleWd1YXJkIGFuZCB2ZXJpZnkgdGhlIHJlc3VsdGluZyBldmVudHMuCisgICAgICAgICAgICAgICAgbVVpRGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoIndtIGRpc21pc3Mta2V5Z3VhcmQiKTsKKyAgICAgICAgICAgICAgICBldmVudHMgPSB3YWl0Rm9yRXZlbnRDb3VudChLRVlHVUFSRF9FVkVOVFMsIHN0YXJ0VGltZSwgMik7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEV2ZW50LktFWUdVQVJEX1NIT1dOLCBldmVudHMuZ2V0KDApLmdldEV2ZW50VHlwZSgpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoRXZlbnQuS0VZR1VBUkRfSElEREVOLCBldmVudHMuZ2V0KDEpLmdldEV2ZW50VHlwZSgpKTsKKyAgICAgICAgICAgICAgICBTcGFyc2VBcnJheTxBZ2dyQWxsRXZlbnRzRGF0YT4gaGlkZGVuQWdnciA9IGdldEFnZ3JFdmVudERhdGEoc3RhcnRUaW1lKTsKKyAgICAgICAgICAgICAgICB2ZXJpZnlBZ2dyS2V5Z3VhcmRFdmVudERhdGEoc2hvd25BZ2dyLCBoaWRkZW5BZ2dyLCBmYWxzZSwgdHJ1ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIC8vIERpc21pc3Mga2V5Z3VhcmQgdG8gZ2V0IGRldmljZSBiYWNrIGluIGl0cyBub3JtYWwgc3RhdGUuCisgICAgICAgICAgICBwcmVzc1dha2VVcCgpOworICAgICAgICAgICAgbVVpRGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoIndtIGRpc21pc3Mta2V5Z3VhcmQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElnbm9yZU5vbmV4aXN0ZW50UGFja2FnZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgZmFrZVBhY2thZ2VOYW1lID0gImFuZHJvaWQuZmFrZS5wYWNrYWdlLm5hbWUiOworICAgICAgICBmaW5hbCBpbnQgZGVmYXVsdFZhbHVlID0gLTE7CisKKyAgICAgICAgbVVpRGV2aWNlLmV4ZWN1dGVTaGVsbENvbW1hbmQoImFtIHNldC1zdGFuZGJ5LWJ1Y2tldCAiICsgZmFrZVBhY2thZ2VOYW1lICsgIiByYXJlIik7CisgICAgICAgIC8vIFZlcmlmeSB0aGUgYWJvdmUgZG9lcyBub3QgYWRkIGEgbmV3IGVudHJ5IHRvIHRoZSBBcHAgU3RhbmRieSBidWNrZXQgbWFwCisgICAgICAgIE1hcDxTdHJpbmcsIEludGVnZXI+IGJ1Y2tldE1hcCA9IG1Vc2FnZVN0YXRzTWFuYWdlci5nZXRBcHBTdGFuZGJ5QnVja2V0cygpOworICAgICAgICBpbnQgYnVja2V0ID0gYnVja2V0TWFwLmdldE9yRGVmYXVsdChmYWtlUGFja2FnZU5hbWUsIGRlZmF1bHRWYWx1ZSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJNZWFuaW5nZnVsIGJ1Y2tldCB2YWx1ZSAiICsgYnVja2V0ICsgIiByZXR1cm5lZCBmb3IgIiArIGZha2VQYWNrYWdlTmFtZQorICAgICAgICAgICAgICAgICsgIiBhZnRlciBzZXQtc3RhbmRieS1idWNrZXQiLCBidWNrZXQgPiAwKTsKKworICAgICAgICBtVWlEZXZpY2UuZXhlY3V0ZVNoZWxsQ29tbWFuZCgiYW0gZ2V0LXN0YW5kYnktYnVja2V0ICIgKyBmYWtlUGFja2FnZU5hbWUpOworICAgICAgICAvLyBWZXJpZnkgdGhlIGFib3ZlIGRvZXMgbm90IGFkZCBhIG5ldyBlbnRyeSB0byB0aGUgQXBwIFN0YW5kYnkgYnVja2V0IG1hcAorICAgICAgICBidWNrZXRNYXAgPSBtVXNhZ2VTdGF0c01hbmFnZXIuZ2V0QXBwU3RhbmRieUJ1Y2tldHMoKTsKKyAgICAgICAgYnVja2V0ID0gYnVja2V0TWFwLmdldE9yRGVmYXVsdChmYWtlUGFja2FnZU5hbWUsIGRlZmF1bHRWYWx1ZSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJNZWFuaW5nZnVsIGJ1Y2tldCB2YWx1ZSAiICsgYnVja2V0ICsgIiByZXR1cm5lZCBmb3IgIiArIGZha2VQYWNrYWdlTmFtZQorICAgICAgICAgICAgICAgICsgIiBhZnRlciBnZXQtc3RhbmRieS1idWNrZXQiLCBidWNrZXQgPiAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPYnNlcnZlVXNhZ2VQZXJtaXNzaW9uKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbVVzYWdlU3RhdHNNYW5hZ2VyLnJlZ2lzdGVyQXBwVXNhZ2VPYnNlcnZlcigwLCBuZXcgU3RyaW5nW10geyJjb20uYW5kcm9pZC5zZXR0aW5ncyJ9LAorICAgICAgICAgICAgICAgICAgICAxLCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdC5IT1VSUywgbnVsbCk7CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBmYWlsKCJTaG91bGQgdGhyb3cgU2VjdXJpdHlFeGNlcHRpb24iKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHJlc3NXYWtlVXAoKSB7CisgICAgICAgIG1VaURldmljZS5wcmVzc0tleUNvZGUoS2V5RXZlbnQuS0VZQ09ERV9XQUtFVVApOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcmVzc1NsZWVwKCkgeworICAgICAgICBtVWlEZXZpY2UucHJlc3NLZXlDb2RlKEtleUV2ZW50LktFWUNPREVfU0xFRVApOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2FwcC9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvYXBwL0FuZHJvaWQubWsKaW5kZXggYmQ2NzlhNC4uZWE1ZDllNiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvYXBwL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvdGVzdHMvYXBwL0FuZHJvaWQubWsKQEAgLTE3LDYgKzE3LDcgQEAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzQW5kcm9pZEFwcFRlc3RDYXNlcworTE9DQUxfUFJJVkFURV9QTEFURk9STV9BUElTIDo9IHRydWUKIAogIyBkb24ndCBpbmNsdWRlIHRoaXMgcGFja2FnZSBpbiBhbnkgdGFyZ2V0CiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbApAQCAtMjQsMTMgKzI1LDEyIEBACiAjIGFuZCB3aGVuIGJ1aWx0IGV4cGxpY2l0bHkgcHV0IGl0IGluIHRoZSBkYXRhIHBhcnRpdGlvbgogTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKIAotTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lcgorTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lci5zdHVicyBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicwogCiBMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAotICAgIGN0c3Rlc3RydW5uZXIgXAotICAgIGFuZHJvaWQtc3VwcG9ydC10ZXN0IFwKLSAgICBqdW5pdCBcCi0gICAgbGVnYWN5LWFuZHJvaWQtdGVzdAorICAgIGN0c3Rlc3RydW5uZXItYXh0IFwKKyAgICBhbmRyb2lkeC50ZXN0LnJ1bGVzIFwKKyAgICBqdW5pdAogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdGVzdHMvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggNzA3YjIyYi4uZWY4YzFhOCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTMwLDcgKzMwLDcgQEAKICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29uZmlnQ2hhbmdlcz0ib3JpZW50YXRpb258c2NyZWVuU2l6ZXxzbWFsbGVzdFNjcmVlblNpemV8c2NyZWVuTGF5b3V0IiAvPgogICAgIDwvYXBwbGljYXRpb24+CiAKLSAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmFwcC5jdHMiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgdGVzdHMgb2YgYW5kcm9pZC5hcHAiPgogICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0ibGlzdGVuZXIiCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9hcHAvQW5kcm9pZFRlc3QueG1sIGIvdGVzdHMvdGVzdHMvYXBwL0FuZHJvaWRUZXN0LnhtbAppbmRleCBjOWVlOTY4Li45Zjc0MjEwIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9hcHAvQW5kcm9pZFRlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL2FwcC9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWd1cmF0aW9uIGZvciBhcHAgVGVzdHMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJtaXNjIiAvPgogICAgIDxvcHRpb24gbmFtZT0ibm90LXNoYXJkYWJsZSIgdmFsdWU9InRydWUiIC8+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CkBAIC0yMyw1ICsyNCw2IEBACiAgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkFuZHJvaWRKVW5pdFRlc3QiID4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJwYWNrYWdlIiB2YWx1ZT0iYW5kcm9pZC5hcHAuY3RzIiAvPgogICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjFzIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImhpZGRlbi1hcGktY2hlY2tzIiB2YWx1ZT0iZmFsc2UiLz4KICAgICA8L3Rlc3Q+CiA8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9hcHAvc3JjL2FuZHJvaWQvYXBwL2N0cy9BcHBseU92ZXJyaWRlQ29uZmlndXJhdGlvblRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL0FwcGx5T3ZlcnJpZGVDb25maWd1cmF0aW9uVGVzdC5qYXZhCmluZGV4IGU2YzQyMzQuLmViYzVhM2YgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL0FwcGx5T3ZlcnJpZGVDb25maWd1cmF0aW9uVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL0FwcGx5T3ZlcnJpZGVDb25maWd1cmF0aW9uVGVzdC5qYXZhCkBAIC0xOSw5ICsxOSwxMCBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKKwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKIAogLyoqCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9hcHAvc3JjL2FuZHJvaWQvYXBwL2N0cy9QaWN0dXJlSW5QaWN0dXJlQWN0aW9uc1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL1BpY3R1cmVJblBpY3R1cmVBY3Rpb25zVGVzdC5qYXZhCmluZGV4IGRhMDJhODEuLjBmOThkMGUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL1BpY3R1cmVJblBpY3R1cmVBY3Rpb25zVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL1BpY3R1cmVJblBpY3R1cmVBY3Rpb25zVGVzdC5qYXZhCkBAIC0xOCwxMCArMTgsMTAgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9hcHAvc3JjL2FuZHJvaWQvYXBwL2N0cy9QaWN0dXJlSW5QaWN0dXJlUGFyYW1zQnVpbGRlclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL1BpY3R1cmVJblBpY3R1cmVQYXJhbXNCdWlsZGVyVGVzdC5qYXZhCmluZGV4IDYzOWM0ZDEuLjRiMTIxMjAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL1BpY3R1cmVJblBpY3R1cmVQYXJhbXNCdWlsZGVyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL1BpY3R1cmVJblBpY3R1cmVQYXJhbXNCdWlsZGVyVGVzdC5qYXZhCkBAIC0yMiwxMCArMjIsMTEgQEAKIGltcG9ydCBhbmRyb2lkLmFwcC5QaWN0dXJlSW5QaWN0dXJlUGFyYW1zOwogaW1wb3J0IGFuZHJvaWQuYXBwLlBpY3R1cmVJblBpY3R1cmVQYXJhbXMuQnVpbGRlcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlJhdGlvbmFsOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9hcHAvc3JjL2FuZHJvaWQvYXBwL2N0cy9SZW1vdGVBY3Rpb25UZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9hcHAvc3JjL2FuZHJvaWQvYXBwL2N0cy9SZW1vdGVBY3Rpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY3MWVkNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2FwcC9zcmMvYW5kcm9pZC9hcHAvY3RzL1JlbW90ZUFjdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFwcDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5JY29uOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKK0BSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCitAU21hbGxUZXN0CitwdWJsaWMgY2xhc3MgUmVtb3RlQWN0aW9uVGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJjZWwoKSB7CisgICAgICAgIEljb24gaWNvbiA9IEljb24uY3JlYXRlV2l0aENvbnRlbnRVcmkoImNvbnRlbnQ6Ly90ZXN0Iik7CisgICAgICAgIFN0cmluZyB0aXRsZSA9ICJ0aXRsZSI7CisgICAgICAgIFN0cmluZyBkZXNjcmlwdGlvbiA9ICJkZXNjcmlwdGlvbiI7CisgICAgICAgIFBlbmRpbmdJbnRlbnQgYWN0aW9uID0gUGVuZGluZ0ludGVudC5nZXRCcm9hZGNhc3QoCisgICAgICAgICAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0VGFyZ2V0Q29udGV4dCgpLCAwLCBuZXcgSW50ZW50KCJURVNUQUNUSU9OIiksIDApOworICAgICAgICBSZW1vdGVBY3Rpb24gcmVmZXJlbmNlID0gbmV3IFJlbW90ZUFjdGlvbihpY29uLCB0aXRsZSwgZGVzY3JpcHRpb24sIGFjdGlvbik7CisgICAgICAgIHJlZmVyZW5jZS5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgcmVmZXJlbmNlLnNldFNob3VsZFNob3dJY29uKGZhbHNlKTsKKworICAgICAgICBmaW5hbCBQYXJjZWwgcGFyY2VsID0gUGFyY2VsLm9idGFpbigpOworICAgICAgICByZWZlcmVuY2Uud3JpdGVUb1BhcmNlbChwYXJjZWwsIHJlZmVyZW5jZS5kZXNjcmliZUNvbnRlbnRzKCkpOworICAgICAgICBwYXJjZWwuc2V0RGF0YVBvc2l0aW9uKDApOworICAgICAgICBSZW1vdGVBY3Rpb24gcmVzdWx0ID0gUmVtb3RlQWN0aW9uLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChwYXJjZWwpOworCisgICAgICAgIGFzc2VydEVxdWFscyhpY29uLmdldFVyaSgpLCByZXN1bHQuZ2V0SWNvbigpLmdldFVyaSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRpdGxlLCByZXN1bHQuZ2V0VGl0bGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhkZXNjcmlwdGlvbiwgcmVzdWx0LmdldENvbnRlbnREZXNjcmlwdGlvbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGFjdGlvbi5nZXRDcmVhdG9yUGFja2FnZSgpLCByZXN1bHQuZ2V0QWN0aW9uSW50ZW50KCkuZ2V0Q3JlYXRvclBhY2thZ2UoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHJlc3VsdC5pc0VuYWJsZWQoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHJlc3VsdC5zaG91bGRTaG93SWNvbigpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9uZSgpIHsKKyAgICAgICAgSWNvbiBpY29uID0gSWNvbi5jcmVhdGVXaXRoQ29udGVudFVyaSgiY29udGVudDovL3Rlc3QiKTsKKyAgICAgICAgU3RyaW5nIHRpdGxlID0gInRpdGxlIjsKKyAgICAgICAgU3RyaW5nIGRlc2NyaXB0aW9uID0gImRlc2NyaXB0aW9uIjsKKyAgICAgICAgUGVuZGluZ0ludGVudCBhY3Rpb24gPSBQZW5kaW5nSW50ZW50LmdldEJyb2FkY2FzdCgKKyAgICAgICAgICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRUYXJnZXRDb250ZXh0KCksIDAsIG5ldyBJbnRlbnQoIlRFU1RBQ1RJT04iKSwgMCk7CisgICAgICAgIFJlbW90ZUFjdGlvbiByZWZlcmVuY2UgPSBuZXcgUmVtb3RlQWN0aW9uKGljb24sIHRpdGxlLCBkZXNjcmlwdGlvbiwgYWN0aW9uKTsKKyAgICAgICAgcmVmZXJlbmNlLnNldEVuYWJsZWQoZmFsc2UpOworICAgICAgICByZWZlcmVuY2Uuc2V0U2hvdWxkU2hvd0ljb24oZmFsc2UpOworCisgICAgICAgIFJlbW90ZUFjdGlvbiByZXN1bHQgPSByZWZlcmVuY2UuY2xvbmUoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoaWNvbi5nZXRVcmkoKSwgcmVzdWx0LmdldEljb24oKS5nZXRVcmkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0aXRsZSwgcmVzdWx0LmdldFRpdGxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZGVzY3JpcHRpb24sIHJlc3VsdC5nZXRDb250ZW50RGVzY3JpcHRpb24oKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhhY3Rpb24uZ2V0Q3JlYXRvclBhY2thZ2UoKSwgcmVzdWx0LmdldEFjdGlvbkludGVudCgpLmdldENyZWF0b3JQYWNrYWdlKCkpOworICAgICAgICBhc3NlcnRGYWxzZShyZXN1bHQuaXNFbmFibGVkKCkpOworICAgICAgICBhc3NlcnRGYWxzZShyZXN1bHQuc2hvdWxkU2hvd0ljb24oKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvYXBwY29tcG9uZW50ZmFjdG9yeS9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvYXBwY29tcG9uZW50ZmFjdG9yeS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NDM0ZjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9hcHBjb21wb25lbnRmYWN0b3J5L0FuZHJvaWQubWsKQEAgLTAsMCArMSw0MCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzQXBwQ29tcG9uZW50RmFjdG9yeVRlc3RDYXNlcworTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorCisjIGRvbid0IGluY2x1ZGUgdGhpcyBwYWNrYWdlIGluIGFueSB0YXJnZXQKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKKyMgYW5kIHdoZW4gYnVpbHQgZXhwbGljaXRseSBwdXQgaXQgaW4gdGhlIGRhdGEgcGFydGl0aW9uCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQorCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzIGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCisKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCisgICAgY3RzdGVzdHJ1bm5lci1heHQgXAorICAgIGFuZHJvaWR4LnRlc3QucnVsZXMgXAorICAgIGp1bml0CisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKKworIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKKworaW5jbHVkZSAkKEJVSUxEX0NUU19QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvYXBwY29tcG9uZW50ZmFjdG9yeS9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdGVzdHMvYXBwY29tcG9uZW50ZmFjdG9yeS9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NDMzMjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9hcHBjb21wb25lbnRmYWN0b3J5L0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSw0MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImFuZHJvaWQuYXBwLmNvbXBvbmVudGZhY3RvcnkuY3RzIj4KKworICAgIDxhcHBsaWNhdGlvbgorICAgICAgICBhbmRyb2lkOm5hbWU9Ii5pbmplY3QuTXlBcHBsaWNhdGlvbiIKKyAgICAgICAgYW5kcm9pZDphcHBDb21wb25lbnRGYWN0b3J5PSIuTXlGYWN0b3J5Ij4KKyAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLmluamVjdC5NeUFjdGl2aXR5IiAvPgorCisgICAgICAgIDxyZWNlaXZlciBhbmRyb2lkOm5hbWU9Ii5pbmplY3QuTXlSZWNlaXZlciIgLz4KKyAgICAgICAgPHNlcnZpY2UgYW5kcm9pZDpuYW1lPSIuaW5qZWN0Lk15U2VydmljZSIgLz4KKyAgICAgICAgPHByb3ZpZGVyIGFuZHJvaWQ6bmFtZT0iLmluamVjdC5NeVByb3ZpZGVyIgorICAgICAgICAgICAgYW5kcm9pZDphdXRob3JpdGllcz0iYW5kcm9pZC5hcHAuY29tcG9uZW50ZmFjdG9yeS5jdHMiIC8+CisgICAgPC9hcHBsaWNhdGlvbj4KKworICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuYXBwLmNvbXBvbmVudGZhY3RvcnkuY3RzIgorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIG9mIGFuZHJvaWQuYXBwIj4KKyAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9Imxpc3RlbmVyIgorICAgICAgICAgICAgYW5kcm9pZDp2YWx1ZT0iY29tLmFuZHJvaWQuY3RzLnJ1bm5lci5DdHNUZXN0UnVuTGlzdGVuZXIiIC8+CisgICAgPC9pbnN0cnVtZW50YXRpb24+CisKKzwvbWFuaWZlc3Q+CisKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2FwcGNvbXBvbmVudGZhY3RvcnkvQW5kcm9pZFRlc3QueG1sIGIvdGVzdHMvdGVzdHMvYXBwY29tcG9uZW50ZmFjdG9yeS9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNhNDZmOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2FwcGNvbXBvbmVudGZhY3RvcnkvQW5kcm9pZFRlc3QueG1sCkBAIC0wLDAgKzEsMjcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlndXJhdGlvbiBmb3IgYXBwIFRlc3RzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgorICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0ibWlzYyIgLz4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzQXBwQ29tcG9uZW50RmFjdG9yeVRlc3RDYXNlcy5hcGsiIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkFuZHJvaWRKVW5pdFRlc3QiID4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwYWNrYWdlIiB2YWx1ZT0iYW5kcm9pZC5hcHAuY29tcG9uZW50ZmFjdG9yeS5jdHMiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVudGltZS1oaW50IiB2YWx1ZT0iMXMiIC8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvYXBwY29tcG9uZW50ZmFjdG9yeS9zcmMvYW5kcm9pZC9hcHAvY29tcG9uZW50ZmFjdG9yeS9jdHMvQXBwQ29tcG9uZW50RmFjdG9yeVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2FwcGNvbXBvbmVudGZhY3Rvcnkvc3JjL2FuZHJvaWQvYXBwL2NvbXBvbmVudGZhY3RvcnkvY3RzL0FwcENvbXBvbmVudEZhY3RvcnlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJhY2QwZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2FwcGNvbXBvbmVudGZhY3Rvcnkvc3JjL2FuZHJvaWQvYXBwL2NvbXBvbmVudGZhY3RvcnkvY3RzL0FwcENvbXBvbmVudEZhY3RvcnlUZXN0LmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyAqIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUKKyAqIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyAqIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYXBwLmNvbXBvbmVudGZhY3RvcnkuY3RzOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKK0BSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgQXBwQ29tcG9uZW50RmFjdG9yeVRlc3QgeworCisgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0ID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpOworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwbGljYXRpb24oKSB7CisgICAgICAgIGFzc2VydFRydWUobUNvbnRleHQuZ2V0QXBwbGljYXRpb25Db250ZXh0KCkgaW5zdGFuY2VvZiBNeUFwcGxpY2F0aW9uKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBY3Rpdml0eSgpIHsKKyAgICAgICAgbUNvbnRleHQuc3RhcnRBY3Rpdml0eShuZXcgSW50ZW50KCkKKyAgICAgICAgICAgICAgICAuc2V0Q29tcG9uZW50KG5ldyBDb21wb25lbnROYW1lKG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpICsgIi5pbmplY3QuTXlBY3Rpdml0eSIpKQorICAgICAgICAgICAgICAgIC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlY2VpdmVyKCkgeworICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0KG5ldyBJbnRlbnQoKQorICAgICAgICAgICAgICAgIC5zZXRDb21wb25lbnQobmV3IENvbXBvbmVudE5hbWUobUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCkgKyAiLmluamVjdC5NeVJlY2VpdmVyIikpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2aWNlKCkgeworICAgICAgICBtQ29udGV4dC5zdGFydFNlcnZpY2UobmV3IEludGVudCgpCisgICAgICAgICAgICAgICAgLnNldENvbXBvbmVudChuZXcgQ29tcG9uZW50TmFtZShtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSArICIuaW5qZWN0Lk15U2VydmljZSIpKSk7CisgICAgfQorCisgICAgLy8gTm8gcHJvdmlkZXIgdGVzdCBuZWVkZWQgYmVjYXVzZSBvZiB0aGVpciB3ZWlyZCBsaWZlY3ljbGUuCit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9hcHBjb21wb25lbnRmYWN0b3J5L3NyYy9hbmRyb2lkL2FwcC9jb21wb25lbnRmYWN0b3J5L2N0cy9NeUFjdGl2aXR5LmphdmEgYi90ZXN0cy90ZXN0cy9hcHBjb21wb25lbnRmYWN0b3J5L3NyYy9hbmRyb2lkL2FwcC9jb21wb25lbnRmYWN0b3J5L2N0cy9NeUFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MyYjkwMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2FwcGNvbXBvbmVudGZhY3Rvcnkvc3JjL2FuZHJvaWQvYXBwL2NvbXBvbmVudGZhY3RvcnkvY3RzL015QWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorICogZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZQorICogTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworICogcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hcHAuY29tcG9uZW50ZmFjdG9yeS5jdHM7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKKworcHVibGljIGNsYXNzIE15QWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9hcHBjb21wb25lbnRmYWN0b3J5L3NyYy9hbmRyb2lkL2FwcC9jb21wb25lbnRmYWN0b3J5L2N0cy9NeUFwcGxpY2F0aW9uLmphdmEgYi90ZXN0cy90ZXN0cy9hcHBjb21wb25lbnRmYWN0b3J5L3NyYy9hbmRyb2lkL2FwcC9jb21wb25lbnRmYWN0b3J5L2N0cy9NeUFwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNmOTc0MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2FwcGNvbXBvbmVudGZhY3Rvcnkvc3JjL2FuZHJvaWQvYXBwL2NvbXBvbmVudGZhY3RvcnkvY3RzL015QXBwbGljYXRpb24uamF2YQpAQCAtMCwwICsxLDIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorICogZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZQorICogTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworICogcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hcHAuY29tcG9uZW50ZmFjdG9yeS5jdHM7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BcHBsaWNhdGlvbjsKKworcHVibGljIGNsYXNzIE15QXBwbGljYXRpb24gZXh0ZW5kcyBBcHBsaWNhdGlvbiB7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9hcHBjb21wb25lbnRmYWN0b3J5L3NyYy9hbmRyb2lkL2FwcC9jb21wb25lbnRmYWN0b3J5L2N0cy9NeUZhY3RvcnkuamF2YSBiL3Rlc3RzL3Rlc3RzL2FwcGNvbXBvbmVudGZhY3Rvcnkvc3JjL2FuZHJvaWQvYXBwL2NvbXBvbmVudGZhY3RvcnkvY3RzL015RmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMTQ5YmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9hcHBjb21wb25lbnRmYWN0b3J5L3NyYy9hbmRyb2lkL2FwcC9jb21wb25lbnRmYWN0b3J5L2N0cy9NeUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorICogZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZQorICogTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworICogcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hcHAuY29tcG9uZW50ZmFjdG9yeS5jdHM7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BcHBDb21wb25lbnRGYWN0b3J5OworaW1wb3J0IGFuZHJvaWQuYXBwLkFwcGxpY2F0aW9uOworaW1wb3J0IGFuZHJvaWQuYXBwLlNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKKworcHVibGljIGNsYXNzIE15RmFjdG9yeSBleHRlbmRzIEFwcENvbXBvbmVudEZhY3RvcnkgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFwcGxpY2F0aW9uIGluc3RhbnRpYXRlQXBwbGljYXRpb24oQ2xhc3NMb2FkZXIgY2wsIFN0cmluZyBjbGFzc05hbWUpCisgICAgICAgICAgICB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChjbGFzc05hbWUuY29udGFpbnMoIi5pbmplY3QiKSkgeworICAgICAgICAgICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lLnJlcGxhY2UoIi5pbmplY3QiLCAiIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLmluc3RhbnRpYXRlQXBwbGljYXRpb24oY2wsIGNsYXNzTmFtZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFjdGl2aXR5IGluc3RhbnRpYXRlQWN0aXZpdHkoQ2xhc3NMb2FkZXIgY2wsIFN0cmluZyBjbGFzc05hbWUsIEludGVudCBpbnRlbnQpCisgICAgICAgICAgICB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChjbGFzc05hbWUuY29udGFpbnMoIi5pbmplY3QiKSkgeworICAgICAgICAgICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lLnJlcGxhY2UoIi5pbmplY3QiLCAiIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLmluc3RhbnRpYXRlQWN0aXZpdHkoY2wsIGNsYXNzTmFtZSwgaW50ZW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnJvYWRjYXN0UmVjZWl2ZXIgaW5zdGFudGlhdGVSZWNlaXZlcihDbGFzc0xvYWRlciBjbCwgU3RyaW5nIGNsYXNzTmFtZSwgSW50ZW50IGludGVudCkKKyAgICAgICAgICAgIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGNsYXNzTmFtZS5jb250YWlucygiLmluamVjdCIpKSB7CisgICAgICAgICAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUucmVwbGFjZSgiLmluamVjdCIsICIiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIuaW5zdGFudGlhdGVSZWNlaXZlcihjbCwgY2xhc3NOYW1lLCBpbnRlbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDb250ZW50UHJvdmlkZXIgaW5zdGFudGlhdGVQcm92aWRlcihDbGFzc0xvYWRlciBjbCwgU3RyaW5nIGNsYXNzTmFtZSkKKyAgICAgICAgICAgIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGNsYXNzTmFtZS5jb250YWlucygiLmluamVjdCIpKSB7CisgICAgICAgICAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUucmVwbGFjZSgiLmluamVjdCIsICIiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIuaW5zdGFudGlhdGVQcm92aWRlcihjbCwgY2xhc3NOYW1lKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2VydmljZSBpbnN0YW50aWF0ZVNlcnZpY2UoQ2xhc3NMb2FkZXIgY2wsIFN0cmluZyBjbGFzc05hbWUsIEludGVudCBpbnRlbnQpCisgICAgICAgICAgICB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChjbGFzc05hbWUuY29udGFpbnMoIi5pbmplY3QiKSkgeworICAgICAgICAgICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lLnJlcGxhY2UoIi5pbmplY3QiLCAiIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLmluc3RhbnRpYXRlU2VydmljZShjbCwgY2xhc3NOYW1lLCBpbnRlbnQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2FwcGNvbXBvbmVudGZhY3Rvcnkvc3JjL2FuZHJvaWQvYXBwL2NvbXBvbmVudGZhY3RvcnkvY3RzL015UHJvdmlkZXIuamF2YSBiL3Rlc3RzL3Rlc3RzL2FwcGNvbXBvbmVudGZhY3Rvcnkvc3JjL2FuZHJvaWQvYXBwL2NvbXBvbmVudGZhY3RvcnkvY3RzL015UHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTIzZDExCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvYXBwY29tcG9uZW50ZmFjdG9yeS9zcmMvYW5kcm9pZC9hcHAvY29tcG9uZW50ZmFjdG9yeS9jdHMvTXlQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisgKiBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlCisgKiBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisgKiBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFwcC5jb21wb25lbnRmYWN0b3J5LmN0czsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworCitwdWJsaWMgY2xhc3MgTXlQcm92aWRlciBleHRlbmRzIENvbnRlbnRQcm92aWRlciB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25DcmVhdGUoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ3Vyc29yIHF1ZXJ5KFVyaSB1cmksIFN0cmluZ1tdIHByb2plY3Rpb24sIFN0cmluZyBzZWxlY3Rpb24sIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MsCisgICAgICAgICAgICBTdHJpbmcgc29ydE9yZGVyKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZShVcmkgdXJpKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBVcmkgaW5zZXJ0KFVyaSB1cmksIENvbnRlbnRWYWx1ZXMgdmFsdWVzKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZGVsZXRlKFVyaSB1cmksIFN0cmluZyBzZWxlY3Rpb24sIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCB1cGRhdGUoVXJpIHVyaSwgQ29udGVudFZhbHVlcyB2YWx1ZXMsIFN0cmluZyBzZWxlY3Rpb24sIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvYXBwY29tcG9uZW50ZmFjdG9yeS9zcmMvYW5kcm9pZC9hcHAvY29tcG9uZW50ZmFjdG9yeS9jdHMvTXlSZWNlaXZlci5qYXZhIGIvdGVzdHMvdGVzdHMvYXBwY29tcG9uZW50ZmFjdG9yeS9zcmMvYW5kcm9pZC9hcHAvY29tcG9uZW50ZmFjdG9yeS9jdHMvTXlSZWNlaXZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmOThiYjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9hcHBjb21wb25lbnRmYWN0b3J5L3NyYy9hbmRyb2lkL2FwcC9jb21wb25lbnRmYWN0b3J5L2N0cy9NeVJlY2VpdmVyLmphdmEKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyAqIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUKKyAqIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyAqIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYXBwLmNvbXBvbmVudGZhY3RvcnkuY3RzOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CisKK3B1YmxpYyBjbGFzcyBNeVJlY2VpdmVyIGV4dGVuZHMgQnJvYWRjYXN0UmVjZWl2ZXIgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvYXBwY29tcG9uZW50ZmFjdG9yeS9zcmMvYW5kcm9pZC9hcHAvY29tcG9uZW50ZmFjdG9yeS9jdHMvTXlTZXJ2aWNlLmphdmEgYi90ZXN0cy90ZXN0cy9hcHBjb21wb25lbnRmYWN0b3J5L3NyYy9hbmRyb2lkL2FwcC9jb21wb25lbnRmYWN0b3J5L2N0cy9NeVNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjUzZGU0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvYXBwY29tcG9uZW50ZmFjdG9yeS9zcmMvYW5kcm9pZC9hcHAvY29tcG9uZW50ZmFjdG9yeS9jdHMvTXlTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyAqIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUKKyAqIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyAqIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYXBwLmNvbXBvbmVudGZhY3RvcnkuY3RzOworCitpbXBvcnQgYW5kcm9pZC5hcHAuU2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKKworcHVibGljIGNsYXNzIE15U2VydmljZSBleHRlbmRzIFNlcnZpY2UgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElCaW5kZXIgb25CaW5kKEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvYXBwd2lkZ2V0L0FuZHJvaWQubWsgYi90ZXN0cy90ZXN0cy9hcHB3aWRnZXQvQW5kcm9pZC5tawppbmRleCAyZDc0ZWQwLi40OTNmY2FiIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9hcHB3aWRnZXQvQW5kcm9pZC5taworKysgYi90ZXN0cy90ZXN0cy9hcHB3aWRnZXQvQW5kcm9pZC5tawpAQCAtMjQsMTYgKzI0LDE4IEBACiAgICAgJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBjb21tb24vc3JjKQogCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzQXBwV2lkZ2V0VGVzdENhc2VzCitMT0NBTF9TREtfVkVSU0lPTiA6PSB0ZXN0X2N1cnJlbnQKIAogTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKICAgICBtb2NraXRvLXRhcmdldC1taW51cy1qdW5pdDQgXAotICAgIGN0c3Rlc3RydW5uZXIgXAorICAgIGN0c3Rlc3RydW5uZXItYXh0IFwKICAgICBqdW5pdCBcCi0gICAgbGVnYWN5LWFuZHJvaWQtdGVzdCBcCi0gICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbAorICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0CisKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCiAKICMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cyBjdHNfaW5zdGFudAogCiBpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2FwcHdpZGdldC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdGVzdHMvYXBwd2lkZ2V0L0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggNmY3ZDA1My4uYzc3MmJjOSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvYXBwd2lkZ2V0L0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvYXBwd2lkZ2V0L0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTE3LDcgKzE3LDggQEAKICAtLT4KIAogPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBwYWNrYWdlPSJhbmRyb2lkLmFwcHdpZGdldC5jdHMiPgorICAgIHBhY2thZ2U9ImFuZHJvaWQuYXBwd2lkZ2V0LmN0cyIKKyAgICBhbmRyb2lkOnRhcmdldFNhbmRib3hWZXJzaW9uPSIyIj4KIAogICA8YXBwbGljYXRpb24+CiAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIvPgpAQCAtMzgsMTMgKzM5LDM3IEBACiAgICAgICAgICAgICAgIGFuZHJvaWQ6cmVzb3VyY2U9IkB4bWwvc2Vjb25kX2FwcHdpZGdldF9pbmZvIiAvPgogICAgICAgPC9yZWNlaXZlcj4KIAorICAgICAgPHJlY2VpdmVyIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hcHB3aWRnZXQuY3RzLnByb3ZpZGVyLkFwcFdpZGdldFByb3ZpZGVyV2l0aEZlYXR1cmVzJFByb3ZpZGVyMSIgPgorICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hcHB3aWRnZXQuYWN0aW9uLkFQUFdJREdFVF9VUERBVEUiIC8+CisgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFwcHdpZGdldC5wcm92aWRlciIKKyAgICAgICAgICAgICAgYW5kcm9pZDpyZXNvdXJjZT0iQHhtbC9hcHB3aWRnZXRfaW5mb193aXRoX2ZlYXR1cmUxIiAvPgorICAgICAgPC9yZWNlaXZlcj4KKworICAgICAgPHJlY2VpdmVyIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hcHB3aWRnZXQuY3RzLnByb3ZpZGVyLkFwcFdpZGdldFByb3ZpZGVyV2l0aEZlYXR1cmVzJFByb3ZpZGVyMiIgPgorICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hcHB3aWRnZXQuYWN0aW9uLkFQUFdJREdFVF9VUERBVEUiIC8+CisgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFwcHdpZGdldC5wcm92aWRlciIKKyAgICAgICAgICAgICAgYW5kcm9pZDpyZXNvdXJjZT0iQHhtbC9hcHB3aWRnZXRfaW5mb193aXRoX2ZlYXR1cmUyIiAvPgorICAgICAgPC9yZWNlaXZlcj4KKworICAgICAgPHJlY2VpdmVyIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hcHB3aWRnZXQuY3RzLnByb3ZpZGVyLkFwcFdpZGdldFByb3ZpZGVyV2l0aEZlYXR1cmVzJFByb3ZpZGVyMyIgPgorICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hcHB3aWRnZXQuYWN0aW9uLkFQUFdJREdFVF9VUERBVEUiIC8+CisgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFwcHdpZGdldC5wcm92aWRlciIKKyAgICAgICAgICAgICAgYW5kcm9pZDpyZXNvdXJjZT0iQHhtbC9hcHB3aWRnZXRfaW5mb193aXRoX2ZlYXR1cmUzIiAvPgorICAgICAgPC9yZWNlaXZlcj4KKwogICAgICAgPHNlcnZpY2UgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFwcHdpZGdldC5jdHMuc2VydmljZS5NeUFwcFdpZGdldFNlcnZpY2UiCiAgICAgICAgICAgYW5kcm9pZDpwZXJtaXNzaW9uPSJhbmRyb2lkLnBlcm1pc3Npb24uQklORF9SRU1PVEVWSUVXUyI+CiAgICAgICA8L3NlcnZpY2U+CiAKICAgPC9hcHBsaWNhdGlvbj4KIAotICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5hcHB3aWRnZXQuY3RzIgogICAgICAgYW5kcm9pZDpsYWJlbD0iVGVzdHMgZm9yIHRoZSBhcHAgd2lkZ2V0IEFQSXMuIj4KICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJsaXN0ZW5lciIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2FwcHdpZGdldC9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy90ZXN0cy9hcHB3aWRnZXQvQW5kcm9pZFRlc3QueG1sCmluZGV4IGYxZDJkZjIuLmU2NDEyM2MgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2FwcHdpZGdldC9BbmRyb2lkVGVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvYXBwd2lkZ2V0L0FuZHJvaWRUZXN0LnhtbApAQCAtMTMsNiArMTMsNyBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIEFwcCBXaWRnZXQgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImZyYW1ld29yayIgLz4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgpAQCAtMjEsNyArMjIsMjggQEAKICAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0FwcFdpZGdldExhdW5jaGVyMy5hcGsiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJDdHNBcHBXaWRnZXRUZXN0Q2FzZXMuYXBrIiAvPgogICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorCisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5SdW5Db21tYW5kVGFyZ2V0UHJlcGFyZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bi1jb21tYW5kIiB2YWx1ZT0ibWtkaXIgLXAgL2RhdGEvbG9jYWwvdG1wL2N0cy93aWRnZXRwcm92aWRlci8iIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVhcmRvd24tY29tbWFuZCIgdmFsdWU9InJtIC1yZiAvZGF0YS9sb2NhbC90bXAvY3RzL3dpZGdldHByb3ZpZGVyIi8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisKKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50YXJnZXRwcmVwLkZpbGVQdXNoZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJDdHNBcHBXaWRnZXRQcm92aWRlcjEuYXBrLT4vZGF0YS9sb2NhbC90bXAvY3RzL3dpZGdldHByb3ZpZGVyL0N0c0FwcFdpZGdldFByb3ZpZGVyMS5hcGsiIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGFyZ2V0cHJlcC5GaWxlUHVzaGVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iQ3RzQXBwV2lkZ2V0UHJvdmlkZXIyLmFway0+L2RhdGEvbG9jYWwvdG1wL2N0cy93aWRnZXRwcm92aWRlci9DdHNBcHBXaWRnZXRQcm92aWRlcjIuYXBrIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRhcmdldHByZXAuRmlsZVB1c2hlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cCIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9IkN0c0FwcFdpZGdldFByb3ZpZGVyMy5hcGstPi9kYXRhL2xvY2FsL3RtcC9jdHMvd2lkZ2V0cHJvdmlkZXIvQ3RzQXBwV2lkZ2V0UHJvdmlkZXIzLmFwayIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKworCiAgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkFuZHJvaWRKVW5pdFRlc3QiID4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJoaWRkZW4tYXBpLWNoZWNrcyIgdmFsdWU9ImZhbHNlIiAvPgogICAgICAgICA8b3B0aW9uIG5hbWU9InBhY2thZ2UiIHZhbHVlPSJhbmRyb2lkLmFwcHdpZGdldC5jdHMiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icnVudGltZS1oaW50IiB2YWx1ZT0iOW0zMHMiIC8+CiAgICAgPC90ZXN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvYXBwd2lkZ2V0L2NvbW1vbi9zcmMvYW5kcm9pZC9hcHB3aWRnZXQvY3RzL2NvbW1vbi9Db25zdGFudHMuamF2YSBiL3Rlc3RzL3Rlc3RzL2FwcHdpZGdldC9jb21tb24vc3JjL2FuZHJvaWQvYXBwd2lkZ2V0L2N0cy9jb21tb24vQ29uc3RhbnRzLmphdmEKaW5kZXggOTU0YTgxYi4uNzg2YjJlYiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvYXBwd2lkZ2V0L2NvbW1vbi9zcmMvYW5kcm9pZC9hcHB3aWRnZXQvY3RzL2NvbW1vbi9Db25zdGFudHMuamF2YQorKysgYi90ZXN0cy90ZXN0cy9hcHB3aWRnZXQvY29tbW9uL3NyYy9hbmRyb2lkL2FwcHdpZGdldC9jdHMvY29tbW9uL0NvbnN0YW50cy5qYXZhCkBAIC0yNyw0ICsyNyw2IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfUEFDS0FHRSA9ICJQQUNLQUdFX05BTUUiOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1JFUVVFU1QgPSAiUkVRVUVTVCI7CiAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fQVBQTFlfT1ZFUlJJREUgPQorICAgICAgICAgICAgImFuZHJvaWQuYXBwd2lkZ2V0LmN0cy53aWRnZXRwcm92aWRlci5BUFBMWV9PVkVSUklERSI7CiB9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9hcHB3aWRnZXQvcGFja2FnZXMvbGF1bmNoZXJtYW5pZmVzdC9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvYXBwd2lkZ2V0L3BhY2thZ2VzL2xhdW5jaGVybWFuaWZlc3QvQW5kcm9pZC5tawppbmRleCBmOTQ5ODM2Li41OGQ2OTYwIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9hcHB3aWRnZXQvcGFja2FnZXMvbGF1bmNoZXJtYW5pZmVzdC9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3Rlc3RzL2FwcHdpZGdldC9wYWNrYWdlcy9sYXVuY2hlcm1hbmlmZXN0L0FuZHJvaWQubWsKQEAgLTMxLDcgKzMxLDcgQEAKIExPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKIAogIyB0YWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzIGN0c19pbnN0YW50CiAKIExPQ0FMX0FBUFRfRkxBR1MgKz0gLS1yZW5hbWUtbWFuaWZlc3QtcGFja2FnZSBhbmRyb2lkLmFwcHdpZGdldC5jdHMucGFja2FnZXMubGF1bmNoZXIxCiAKQEAgLTU0LDcgKzU0LDcgQEAKIExPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKIAogIyB0YWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzIGN0c19pbnN0YW50CiAKIExPQ0FMX0FBUFRfRkxBR1MgKz0gLS1yZW5hbWUtbWFuaWZlc3QtcGFja2FnZSBhbmRyb2lkLmFwcHdpZGdldC5jdHMucGFja2FnZXMubGF1bmNoZXIyCiAKQEAgLTc1LDcgKzc1LDcgQEAKIExPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKIAogIyB0YWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzIGN0c19pbnN0YW50CiAKIExPQ0FMX0FBUFRfRkxBR1MgKz0gLS1yZW5hbWUtbWFuaWZlc3QtcGFja2FnZSBhbmRyb2lkLmFwcHdpZGdldC5jdHMucGFja2FnZXMubGF1bmNoZXIzCiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2FwcHdpZGdldC9wYWNrYWdlcy9sYXVuY2hlcm1hbmlmZXN0L0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy90ZXN0cy9hcHB3aWRnZXQvcGFja2FnZXMvbGF1bmNoZXJtYW5pZmVzdC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGRiMDUyMzIuLjU3YzRlNGQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2FwcHdpZGdldC9wYWNrYWdlcy9sYXVuY2hlcm1hbmlmZXN0L0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvYXBwd2lkZ2V0L3BhY2thZ2VzL2xhdW5jaGVybWFuaWZlc3QvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMTYsNyArMTYsOCBAQAogIC0tPgogCiA8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICAgIHBhY2thZ2U9ImFuZHJvaWQuYXBwd2lkZ2V0LmN0cy5wYWNrYWdlcyI+CisgICAgICAgICAgcGFja2FnZT0iYW5kcm9pZC5hcHB3aWRnZXQuY3RzLnBhY2thZ2VzIgorICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0U2FuZGJveFZlcnNpb249IjIiPgogCiAgICAgPGFwcGxpY2F0aW9uPgogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJMYXVuY2hlciI+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9hcHB3aWRnZXQvcGFja2FnZXMvc3JjL2FuZHJvaWQvYXBwd2lkZ2V0L2N0cy9wYWNrYWdlcy9TaW1wbGVQcm92aWRlci5qYXZhIGIvdGVzdHMvdGVzdHMvYXBwd2lkZ2V0L3BhY2thZ2VzL3NyYy9hbmRyb2lkL2FwcHdpZGdldC9jdHMvcGFja2FnZXMvU2ltcGxlUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzI5NzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvYXBwd2lkZ2V0L3BhY2thZ2VzL3NyYy9hbmRyb2lkL2FwcHdpZGdldC9jdHMvcGFja2FnZXMvU2ltcGxlUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDI1IEBACitwYWNrYWdlIGFuZHJvaWQuYXBwd2lkZ2V0LmN0cy5wYWNrYWdlczsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuYXBwd2lkZ2V0LkFwcFdpZGdldE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5hcHB3aWRnZXQuQXBwV2lkZ2V0UHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZC5hcHB3aWRnZXQuY3RzLmNvbW1vbi5Db25zdGFudHM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKKworcHVibGljIGNsYXNzIFNpbXBsZVByb3ZpZGVyIGV4dGVuZHMgQXBwV2lkZ2V0UHJvdmlkZXIgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICBzdXBlci5vblJlY2VpdmUoY29udGV4dCwgaW50ZW50KTsKKworICAgICAgICBpZiAoQ29uc3RhbnRzLkFDVElPTl9BUFBMWV9PVkVSUklERS5lcXVhbHMoaW50ZW50LmdldEFjdGlvbigpKSkgeworICAgICAgICAgICAgU3RyaW5nIHJlcXVlc3QgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoQ29uc3RhbnRzLkVYVFJBX1JFUVVFU1QpOworICAgICAgICAgICAgQXBwV2lkZ2V0TWFuYWdlci5nZXRJbnN0YW5jZShjb250ZXh0KS51cGRhdGVBcHBXaWRnZXRQcm92aWRlckluZm8oCisgICAgICAgICAgICAgICAgICAgIG5ldyBDb21wb25lbnROYW1lKGNvbnRleHQsIFNpbXBsZVByb3ZpZGVyLmNsYXNzKSwKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCk7CisgICAgICAgICAgICBzZXRSZXN1bHRDb2RlKEFjdGl2aXR5LlJFU1VMVF9PSyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9hcHB3aWRnZXQvcGFja2FnZXMvd2lkZ2V0cHJvdmlkZXIvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL2FwcHdpZGdldC9wYWNrYWdlcy93aWRnZXRwcm92aWRlci9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNWNjMTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9hcHB3aWRnZXQvcGFja2FnZXMvd2lkZ2V0cHJvdmlkZXIvQW5kcm9pZC5tawpAQCAtMCwwICsxLDc4IEBACisjIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0FwcFdpZGdldFByb3ZpZGVyMQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCAuLi9zcmMpIFwKKyAgICAgICAgJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCAuLi8uLi9jb21tb24vc3JjKQorTE9DQUxfRlVMTF9MSUJTX01BTklGRVNUX0ZJTEVTIDo9IFwKKyAgICAkKExPQ0FMX1BBVEgpL0FuZHJvaWRNYW5pZmVzdFYxLnhtbAorCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CisKKyMgdGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzIGN0c19pbnN0YW50CisKK2luY2x1ZGUgJChCVUlMRF9DVFNfUEFDS0FHRSkKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0FwcFdpZGdldFByb3ZpZGVyMgorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCAuLi9zcmMpIFwKKyAgICAgICAgJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCAuLi8uLi9jb21tb24vc3JjKQorTE9DQUxfRlVMTF9MSUJTX01BTklGRVNUX0ZJTEVTIDo9IFwKKyAgICAkKExPQ0FMX1BBVEgpL0FuZHJvaWRNYW5pZmVzdFYyLnhtbAorCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CisKKyMgdGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzIGN0c19pbnN0YW50CisKK2luY2x1ZGUgJChCVUlMRF9DVFNfUEFDS0FHRSkKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0FwcFdpZGdldFByb3ZpZGVyMworCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCAuLi9zcmMpIFwKKyAgICAgICAgJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCAuLi8uLi9jb21tb24vc3JjKQorTE9DQUxfRlVMTF9MSUJTX01BTklGRVNUX0ZJTEVTIDo9IFwKKyAgICAkKExPQ0FMX1BBVEgpL0FuZHJvaWRNYW5pZmVzdFYzLnhtbAorCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CisKKyMgdGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzIGN0c19pbnN0YW50CisKK2luY2x1ZGUgJChCVUlMRF9DVFNfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2FwcHdpZGdldC9wYWNrYWdlcy93aWRnZXRwcm92aWRlci9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdGVzdHMvYXBwd2lkZ2V0L3BhY2thZ2VzL3dpZGdldHByb3ZpZGVyL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc2ZWFhNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2FwcHdpZGdldC9wYWNrYWdlcy93aWRnZXRwcm92aWRlci9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgcGFja2FnZT0iYW5kcm9pZC5hcHB3aWRnZXQuY3RzLndpZGdldHByb3ZpZGVyIgorICAgICAgICBhbmRyb2lkOnRhcmdldFNhbmRib3hWZXJzaW9uPSIyIj4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9hcHB3aWRnZXQvcGFja2FnZXMvd2lkZ2V0cHJvdmlkZXIvQW5kcm9pZE1hbmlmZXN0VjEueG1sIGIvdGVzdHMvdGVzdHMvYXBwd2lkZ2V0L3BhY2thZ2VzL3dpZGdldHByb3ZpZGVyL0FuZHJvaWRNYW5pZmVzdFYxLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTIzMTc2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvYXBwd2lkZ2V0L3BhY2thZ2VzL3dpZGdldHByb3ZpZGVyL0FuZHJvaWRNYW5pZmVzdFYxLnhtbApAQCAtMCwwICsxLDMyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiID4KKworICAgIDxhcHBsaWNhdGlvbj4KKyAgICAgICAgPHJlY2VpdmVyIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hcHB3aWRnZXQuY3RzLnBhY2thZ2VzLlNpbXBsZVByb3ZpZGVyIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFwcHdpZGdldC5hY3Rpb24uQVBQV0lER0VUX1VQREFURSIgLz4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hcHB3aWRnZXQuY3RzLndpZGdldHByb3ZpZGVyLkFQUExZX09WRVJSSURFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYXBwd2lkZ2V0LnByb3ZpZGVyIgorICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnJlc291cmNlPSJAeG1sL3dpZGdldF9ub19jb25maWciIC8+CisgICAgICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0ibXlfY3VzdG9tX2luZm8iCisgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cmVzb3VyY2U9IkB4bWwvd2lkZ2V0X2NvbmZpZyIgLz4KKyAgICAgICAgPC9yZWNlaXZlcj4KKyAgICA8L2FwcGxpY2F0aW9uPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2FwcHdpZGdldC9wYWNrYWdlcy93aWRnZXRwcm92aWRlci9BbmRyb2lkTWFuaWZlc3RWMi54bWwgYi90ZXN0cy90ZXN0cy9hcHB3aWRnZXQvcGFja2FnZXMvd2lkZ2V0cHJvdmlkZXIvQW5kcm9pZE1hbmlmZXN0VjIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NmUxNjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9hcHB3aWRnZXQvcGFja2FnZXMvd2lkZ2V0cHJvdmlkZXIvQW5kcm9pZE1hbmlmZXN0VjIueG1sCkBAIC0wLDAgKzEsMzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIgPgorCisgICAgPGFwcGxpY2F0aW9uPgorICAgICAgICA8cmVjZWl2ZXIgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFwcHdpZGdldC5jdHMucGFja2FnZXMuU2ltcGxlUHJvdmlkZXIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYXBwd2lkZ2V0LmFjdGlvbi5BUFBXSURHRVRfVVBEQVRFIiAvPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFwcHdpZGdldC5jdHMud2lkZ2V0cHJvdmlkZXIuQVBQTFlfT1ZFUlJJREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hcHB3aWRnZXQucHJvdmlkZXIiCisgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cmVzb3VyY2U9IkB4bWwvd2lkZ2V0X25vX2NvbmZpZyIgLz4KKyAgICAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJteV9jdXN0b21faW5mbyIKKyAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpyZXNvdXJjZT0iQHhtbC93aWRnZXRfY29uZmlnX25vX3Jlc2l6ZSIgLz4KKyAgICAgICAgPC9yZWNlaXZlcj4KKyAgICA8L2FwcGxpY2F0aW9uPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2FwcHdpZGdldC9wYWNrYWdlcy93aWRnZXRwcm92aWRlci9BbmRyb2lkTWFuaWZlc3RWMy54bWwgYi90ZXN0cy90ZXN0cy9hcHB3aWRnZXQvcGFja2FnZXMvd2lkZ2V0cHJvdmlkZXIvQW5kcm9pZE1hbmlmZXN0VjMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYTc0MGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9hcHB3aWRnZXQvcGFja2FnZXMvd2lkZ2V0cHJvdmlkZXIvQW5kcm9pZE1hbmlmZXN0VjMueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIgPgorCisgICAgPGFwcGxpY2F0aW9uPgorICAgICAgICA8cmVjZWl2ZXIgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFwcHdpZGdldC5jdHMucGFja2FnZXMuU2ltcGxlUHJvdmlkZXIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYXBwd2lkZ2V0LmFjdGlvbi5BUFBXSURHRVRfVVBEQVRFIiAvPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFwcHdpZGdldC5jdHMud2lkZ2V0cHJvdmlkZXIuQVBQTFlfT1ZFUlJJREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hcHB3aWRnZXQucHJvdmlkZXIiCisgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cmVzb3VyY2U9IkB4bWwvd2lkZ2V0X25vX2NvbmZpZyIgLz4KKyAgICAgICAgPC9yZWNlaXZlcj4KKyAgICA8L2FwcGxpY2F0aW9uPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2FwcHdpZGdldC9wYWNrYWdlcy93aWRnZXRwcm92aWRlci9yZXMvbGF5b3V0L3NpbXBsZV93aWRnZXQueG1sIGIvdGVzdHMvdGVzdHMvYXBwd2lkZ2V0L3BhY2thZ2VzL3dpZGdldHByb3ZpZGVyL3Jlcy9sYXlvdXQvc2ltcGxlX3dpZGdldC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlkYjQ1MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2FwcHdpZGdldC9wYWNrYWdlcy93aWRnZXRwcm92aWRlci9yZXMvbGF5b3V0L3NpbXBsZV93aWRnZXQueG1sCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKzxGcmFtZUxheW91dAorICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI2ZmMzMzMzMzIgorICAgIGFuZHJvaWQ6ZWxldmF0aW9uPSIzZHAiIC8+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvYXBwd2lkZ2V0L3BhY2thZ2VzL3dpZGdldHByb3ZpZGVyL3Jlcy94bWwvd2lkZ2V0X2NvbmZpZy54bWwgYi90ZXN0cy90ZXN0cy9hcHB3aWRnZXQvcGFja2FnZXMvd2lkZ2V0cHJvdmlkZXIvcmVzL3htbC93aWRnZXRfY29uZmlnLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDVjNDc2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvYXBwd2lkZ2V0L3BhY2thZ2VzL3dpZGdldHByb3ZpZGVyL3Jlcy94bWwvd2lkZ2V0X2NvbmZpZy54bWwKQEAgLTAsMCArMSwyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorPGFwcHdpZGdldC1wcm92aWRlcgorICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm1pbldpZHRoPSIxODBkcCIKKyAgICBhbmRyb2lkOm1pbkhlaWdodD0iMTEwZHAiCisgICAgYW5kcm9pZDp1cGRhdGVQZXJpb2RNaWxsaXM9Ijg2NDAwMDAwIgorICAgIGFuZHJvaWQ6aW5pdGlhbExheW91dD0iQGxheW91dC9zaW1wbGVfd2lkZ2V0IgorICAgIGFuZHJvaWQ6cmVzaXplTW9kZT0iaG9yaXpvbnRhbHx2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmNvbmZpZ3VyZT0iYW5kcm9pZC5hcHB3aWRnZXQuY3RzLndpZGdldHByb3ZpZGVyLkV4YW1wbGVBcHBXaWRnZXRDb25maWd1cmUiCisgICAgYW5kcm9pZDp3aWRnZXRDYXRlZ29yeT0iaG9tZV9zY3JlZW4iPgorPC9hcHB3aWRnZXQtcHJvdmlkZXI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvYXBwd2lkZ2V0L3BhY2thZ2VzL3dpZGdldHByb3ZpZGVyL3Jlcy94bWwvd2lkZ2V0X2NvbmZpZ19ub19yZXNpemUueG1sIGIvdGVzdHMvdGVzdHMvYXBwd2lkZ2V0L3BhY2thZ2VzL3dpZGdldHByb3ZpZGVyL3Jlcy94bWwvd2lkZ2V0X2NvbmZpZ19ub19yZXNpemUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyOGE3ODAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9hcHB3aWRnZXQvcGFja2FnZXMvd2lkZ2V0cHJvdmlkZXIvcmVzL3htbC93aWRnZXRfY29uZmlnX25vX3Jlc2l6ZS54bWwKQEAgLTAsMCArMSwyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorPGFwcHdpZGdldC1wcm92aWRlcgorICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm1pbldpZHRoPSIxODBkcCIKKyAgICBhbmRyb2lkOm1pbkhlaWdodD0iMTEwZHAiCisgICAgYW5kcm9pZDp1cGRhdGVQZXJpb2RNaWxsaXM9Ijg2NDAwMDAwIgorICAgIGFuZHJvaWQ6aW5pdGlhbExheW91dD0iQGxheW91dC9zaW1wbGVfd2lkZ2V0IgorICAgIGFuZHJvaWQ6cmVzaXplTW9kZT0ibm9uZSIKKyAgICBhbmRyb2lkOmNvbmZpZ3VyZT0iYW5kcm9pZC5hcHB3aWRnZXQuY3RzLndpZGdldHByb3ZpZGVyLkV4YW1wbGVBcHBXaWRnZXRDb25maWd1cmUiCisgICAgYW5kcm9pZDp3aWRnZXRDYXRlZ29yeT0iaG9tZV9zY3JlZW4iPgorPC9hcHB3aWRnZXQtcHJvdmlkZXI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvYXBwd2lkZ2V0L3BhY2thZ2VzL3dpZGdldHByb3ZpZGVyL3Jlcy94bWwvd2lkZ2V0X25vX2NvbmZpZy54bWwgYi90ZXN0cy90ZXN0cy9hcHB3aWRnZXQvcGFja2FnZXMvd2lkZ2V0cHJvdmlkZXIvcmVzL3htbC93aWRnZXRfbm9fY29uZmlnLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGFjZDFjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvYXBwd2lkZ2V0L3BhY2thZ2VzL3dpZGdldHByb3ZpZGVyL3Jlcy94bWwvd2lkZ2V0X25vX2NvbmZpZy54bWwKQEAgLTAsMCArMSwyNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorPGFwcHdpZGdldC1wcm92aWRlcgorICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm1pbldpZHRoPSIxODBkcCIKKyAgICBhbmRyb2lkOm1pbkhlaWdodD0iMTEwZHAiCisgICAgYW5kcm9pZDp1cGRhdGVQZXJpb2RNaWxsaXM9Ijg2NDAwMDAwIgorICAgIGFuZHJvaWQ6aW5pdGlhbExheW91dD0iQGxheW91dC9zaW1wbGVfd2lkZ2V0IgorICAgIGFuZHJvaWQ6cmVzaXplTW9kZT0iaG9yaXpvbnRhbHx2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOndpZGdldENhdGVnb3J5PSJob21lX3NjcmVlbiI+Cis8L2FwcHdpZGdldC1wcm92aWRlcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9hcHB3aWRnZXQvcmVzL3htbC9hcHB3aWRnZXRfaW5mb193aXRoX2ZlYXR1cmUxLnhtbCBiL3Rlc3RzL3Rlc3RzL2FwcHdpZGdldC9yZXMveG1sL2FwcHdpZGdldF9pbmZvX3dpdGhfZmVhdHVyZTEueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZGIyODMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9hcHB3aWRnZXQvcmVzL3htbC9hcHB3aWRnZXRfaW5mb193aXRoX2ZlYXR1cmUxLnhtbApAQCAtMCwwICsxLDMyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorCis8IS0tCisgICAgIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8YXBwd2lkZ2V0LXByb3ZpZGVyIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm1pbldpZHRoPSJAZGltZW4vZmlyc3RfbWluX2FwcHdpZGdldF9zaXplIgorICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSJAZGltZW4vZmlyc3RfbWluX2FwcHdpZGdldF9zaXplIgorICAgIGFuZHJvaWQ6bWluUmVzaXplV2lkdGg9IkBkaW1lbi9maXJzdF9taW5fcmVzaXplX2FwcHdpZGdldF9zaXplIgorICAgIGFuZHJvaWQ6bWluUmVzaXplSGVpZ2h0PSJAZGltZW4vZmlyc3RfbWluX3Jlc2l6ZV9hcHB3aWRnZXRfc2l6ZSIKKyAgICBhbmRyb2lkOnVwZGF0ZVBlcmlvZE1pbGxpcz0iQGludGVnZXIvZmlyc3RfdXBkYXRlX3BlcmlvZF9taWxsaXMiCisgICAgYW5kcm9pZDpjb25maWd1cmU9ImFuZHJvaWQuYXBwd2lkZ2V0LmN0cy5wcm92aWRlci5GaXJzdEFwcFdpZGdldENvbmZpZ3VyZUFjdGl2aXR5IgorICAgIGFuZHJvaWQ6cmVzaXplTW9kZT0iaG9yaXpvbnRhbHx2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOndpZGdldENhdGVnb3J5PSJob21lX3NjcmVlbnxrZXlndWFyZCIKKyAgICBhbmRyb2lkOndpZGdldEZlYXR1cmVzPSJyZWNvbmZpZ3VyYWJsZSIKKyAgICBhbmRyb2lkOmluaXRpYWxMYXlvdXQ9IkBsYXlvdXQvZmlyc3RfaW5pdGlhbF9sYXlvdXQiCisgICAgYW5kcm9pZDppbml0aWFsS2V5Z3VhcmRMYXlvdXQ9IkBsYXlvdXQvZmlyc3RfaW5pdGlhbF9rZXlndWFyZF9sYXlvdXQiCisgICAgYW5kcm9pZDpwcmV2aWV3SW1hZ2U9IkBkcmF3YWJsZS9maXJzdF9hbmRyb2lkX2ljb24iCisgICAgYW5kcm9pZDphdXRvQWR2YW5jZVZpZXdJZD0iQGlkL2ZpcnN0X2F1dG9fYWR2YW5jZV92aWV3X2lkIj4KKzwvYXBwd2lkZ2V0LXByb3ZpZGVyPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvYXBwd2lkZ2V0L3Jlcy94bWwvYXBwd2lkZ2V0X2luZm9fd2l0aF9mZWF0dXJlMi54bWwgYi90ZXN0cy90ZXN0cy9hcHB3aWRnZXQvcmVzL3htbC9hcHB3aWRnZXRfaW5mb193aXRoX2ZlYXR1cmUyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWQ2MGViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvYXBwd2lkZ2V0L3Jlcy94bWwvYXBwd2lkZ2V0X2luZm9fd2l0aF9mZWF0dXJlMi54bWwKQEAgLTAsMCArMSwzMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKworPCEtLQorICAgICBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGFwcHdpZGdldC1wcm92aWRlciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDptaW5XaWR0aD0iQGRpbWVuL2ZpcnN0X21pbl9hcHB3aWRnZXRfc2l6ZSIKKyAgICBhbmRyb2lkOm1pbkhlaWdodD0iQGRpbWVuL2ZpcnN0X21pbl9hcHB3aWRnZXRfc2l6ZSIKKyAgICBhbmRyb2lkOm1pblJlc2l6ZVdpZHRoPSJAZGltZW4vZmlyc3RfbWluX3Jlc2l6ZV9hcHB3aWRnZXRfc2l6ZSIKKyAgICBhbmRyb2lkOm1pblJlc2l6ZUhlaWdodD0iQGRpbWVuL2ZpcnN0X21pbl9yZXNpemVfYXBwd2lkZ2V0X3NpemUiCisgICAgYW5kcm9pZDp1cGRhdGVQZXJpb2RNaWxsaXM9IkBpbnRlZ2VyL2ZpcnN0X3VwZGF0ZV9wZXJpb2RfbWlsbGlzIgorICAgIGFuZHJvaWQ6Y29uZmlndXJlPSJhbmRyb2lkLmFwcHdpZGdldC5jdHMucHJvdmlkZXIuRmlyc3RBcHBXaWRnZXRDb25maWd1cmVBY3Rpdml0eSIKKyAgICBhbmRyb2lkOnJlc2l6ZU1vZGU9Imhvcml6b250YWx8dmVydGljYWwiCisgICAgYW5kcm9pZDp3aWRnZXRDYXRlZ29yeT0iaG9tZV9zY3JlZW58a2V5Z3VhcmQiCisgICAgYW5kcm9pZDp3aWRnZXRGZWF0dXJlcz0iaGlkZV9mcm9tX3BpY2tlciIKKyAgICBhbmRyb2lkOmluaXRpYWxMYXlvdXQ9IkBsYXlvdXQvZmlyc3RfaW5pdGlhbF9sYXlvdXQiCisgICAgYW5kcm9pZDppbml0aWFsS2V5Z3VhcmRMYXlvdXQ9IkBsYXlvdXQvZmlyc3RfaW5pdGlhbF9rZXlndWFyZF9sYXlvdXQiCisgICAgYW5kcm9pZDpwcmV2aWV3SW1hZ2U9IkBkcmF3YWJsZS9maXJzdF9hbmRyb2lkX2ljb24iCisgICAgYW5kcm9pZDphdXRvQWR2YW5jZVZpZXdJZD0iQGlkL2ZpcnN0X2F1dG9fYWR2YW5jZV92aWV3X2lkIj4KKzwvYXBwd2lkZ2V0LXByb3ZpZGVyPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvYXBwd2lkZ2V0L3Jlcy94bWwvYXBwd2lkZ2V0X2luZm9fd2l0aF9mZWF0dXJlMy54bWwgYi90ZXN0cy90ZXN0cy9hcHB3aWRnZXQvcmVzL3htbC9hcHB3aWRnZXRfaW5mb193aXRoX2ZlYXR1cmUzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTkzNmFiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvYXBwd2lkZ2V0L3Jlcy94bWwvYXBwd2lkZ2V0X2luZm9fd2l0aF9mZWF0dXJlMy54bWwKQEAgLTAsMCArMSwzMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKworPCEtLQorICAgICBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGFwcHdpZGdldC1wcm92aWRlciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDptaW5XaWR0aD0iQGRpbWVuL2ZpcnN0X21pbl9hcHB3aWRnZXRfc2l6ZSIKKyAgICBhbmRyb2lkOm1pbkhlaWdodD0iQGRpbWVuL2ZpcnN0X21pbl9hcHB3aWRnZXRfc2l6ZSIKKyAgICBhbmRyb2lkOm1pblJlc2l6ZVdpZHRoPSJAZGltZW4vZmlyc3RfbWluX3Jlc2l6ZV9hcHB3aWRnZXRfc2l6ZSIKKyAgICBhbmRyb2lkOm1pblJlc2l6ZUhlaWdodD0iQGRpbWVuL2ZpcnN0X21pbl9yZXNpemVfYXBwd2lkZ2V0X3NpemUiCisgICAgYW5kcm9pZDp1cGRhdGVQZXJpb2RNaWxsaXM9IkBpbnRlZ2VyL2ZpcnN0X3VwZGF0ZV9wZXJpb2RfbWlsbGlzIgorICAgIGFuZHJvaWQ6Y29uZmlndXJlPSJhbmRyb2lkLmFwcHdpZGdldC5jdHMucHJvdmlkZXIuRmlyc3RBcHBXaWRnZXRDb25maWd1cmVBY3Rpdml0eSIKKyAgICBhbmRyb2lkOnJlc2l6ZU1vZGU9Imhvcml6b250YWx8dmVydGljYWwiCisgICAgYW5kcm9pZDp3aWRnZXRDYXRlZ29yeT0iaG9tZV9zY3JlZW58a2V5Z3VhcmQiCisgICAgYW5kcm9pZDp3aWRnZXRGZWF0dXJlcz0icmVjb25maWd1cmFibGV8aGlkZV9mcm9tX3BpY2tlciIKKyAgICBhbmRyb2lkOmluaXRpYWxMYXlvdXQ9IkBsYXlvdXQvZmlyc3RfaW5pdGlhbF9sYXlvdXQiCisgICAgYW5kcm9pZDppbml0aWFsS2V5Z3VhcmRMYXlvdXQ9IkBsYXlvdXQvZmlyc3RfaW5pdGlhbF9rZXlndWFyZF9sYXlvdXQiCisgICAgYW5kcm9pZDpwcmV2aWV3SW1hZ2U9IkBkcmF3YWJsZS9maXJzdF9hbmRyb2lkX2ljb24iCisgICAgYW5kcm9pZDphdXRvQWR2YW5jZVZpZXdJZD0iQGlkL2ZpcnN0X2F1dG9fYWR2YW5jZV92aWV3X2lkIj4KKzwvYXBwd2lkZ2V0LXByb3ZpZGVyPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvYXBwd2lkZ2V0L3NyYy9hbmRyb2lkL2FwcHdpZGdldC9jdHMvQXBwV2lkZ2V0VGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvYXBwd2lkZ2V0L3NyYy9hbmRyb2lkL2FwcHdpZGdldC9jdHMvQXBwV2lkZ2V0VGVzdC5qYXZhCmluZGV4IDg5NGU4MTQuLjNmYTA5NDggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2FwcHdpZGdldC9zcmMvYW5kcm9pZC9hcHB3aWRnZXQvY3RzL0FwcFdpZGdldFRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9hcHB3aWRnZXQvc3JjL2FuZHJvaWQvYXBwd2lkZ2V0L2N0cy9BcHBXaWRnZXRUZXN0LmphdmEKQEAgLTE2LDYgKzE2LDEzIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5hcHB3aWRnZXQuY3RzOwogCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRTYW1lOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTWF0Y2hlcnMuYW55OwogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5NYXRjaGVycy5lcTsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTWF0Y2hlcnMuc2FtZTsKQEAgLTIzLDcgKzMwLDYgQEAKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5kb0Fuc3dlcjsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5pbk9yZGVyOwogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLm1vY2s7Ci1pbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8uc3B5OwogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnRpbWVzOwogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnZlcmlmeTsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uaGFtY3Jlc3QuTW9ja2l0b0hhbWNyZXN0LmFyZ1RoYXQ7CkBAIC0zMyw2ICszOSw3IEBACiBpbXBvcnQgYW5kcm9pZC5hcHB3aWRnZXQuQXBwV2lkZ2V0TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmFwcHdpZGdldC5BcHBXaWRnZXRQcm92aWRlckluZm87CiBpbXBvcnQgYW5kcm9pZC5hcHB3aWRnZXQuY3RzLnByb3ZpZGVyLkFwcFdpZGdldFByb3ZpZGVyQ2FsbGJhY2tzOworaW1wb3J0IGFuZHJvaWQuYXBwd2lkZ2V0LmN0cy5wcm92aWRlci5BcHBXaWRnZXRQcm92aWRlcldpdGhGZWF0dXJlczsKIGltcG9ydCBhbmRyb2lkLmFwcHdpZGdldC5jdHMucHJvdmlkZXIuRmlyc3RBcHBXaWRnZXRQcm92aWRlcjsKIGltcG9ydCBhbmRyb2lkLmFwcHdpZGdldC5jdHMucHJvdmlkZXIuU2Vjb25kQXBwV2lkZ2V0UHJvdmlkZXI7CiBpbXBvcnQgYW5kcm9pZC5hcHB3aWRnZXQuY3RzLnNlcnZpY2UuTXlBcHBXaWRnZXRTZXJ2aWNlOwpAQCAtNDcsNiArNTQsOCBAQAogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CiBpbXBvcnQgYW5kcm9pZC5vcy5Vc2VySGFuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuVXNlck1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlSW5zdGFudDsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3czsKQEAgLTU0LDYgKzYzLDkgQEAKIAogaW1wb3J0IG9yZy5oYW1jcmVzdC5CYXNlTWF0Y2hlcjsKIGltcG9ydCBvcmcuaGFtY3Jlc3QuRGVzY3JpcHRpb247CitpbXBvcnQgb3JnLmp1bml0LkFzc3VtZTsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5tb2NraXRvLkluT3JkZXI7CiBpbXBvcnQgb3JnLm1vY2tpdG8uaW52b2NhdGlvbi5JbnZvY2F0aW9uT25Nb2NrOwogaW1wb3J0IG9yZy5tb2NraXRvLnN0dWJiaW5nLkFuc3dlcjsKQEAgLTY5LDggKzgxLDggQEAKIAogICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOwogCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXBEZXhtYWtlcigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBkZXhtYWtlciBidWc6IGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZGV4bWFrZXIvaXNzdWVzL2RldGFpbD9pZD0yCiAgICAgICAgIC8vIERleG1ha2VyIGlzIHVzZWQgYnkgbW9ja2l0by4KICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJkZXhtYWtlci5kZXhjYWNoZSIsIGdldEluc3RydW1lbnRhdGlvbigpCkBAIC03OCwxNyArOTAsMzMgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JBTlRfQklORF9BUFBfV0lER0VUX1BFUk1JU1NJT05fQ09NTUFORCA9Ci0gICAgICAgICAgICAiYXBwd2lkZ2V0IGdyYW50YmluZCAtLXBhY2thZ2UgYW5kcm9pZC5hcHB3aWRnZXQuY3RzIC0tdXNlciAwIjsKKyAgICAgICAgICAgICJhcHB3aWRnZXQgZ3JhbnRiaW5kIC0tcGFja2FnZSBhbmRyb2lkLmFwcHdpZGdldC5jdHMgLS11c2VyICVkIjsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVZPS0VfQklORF9BUFBfV0lER0VUX1BFUk1JU1NJT05fQ09NTUFORCA9Ci0gICAgICAgICAgICAiYXBwd2lkZ2V0IHJldm9rZWJpbmQgLS1wYWNrYWdlIGFuZHJvaWQuYXBwd2lkZ2V0LmN0cyAtLXVzZXIgMCI7CisgICAgICAgICAgICAiYXBwd2lkZ2V0IHJldm9rZWJpbmQgLS1wYWNrYWdlIGFuZHJvaWQuYXBwd2lkZ2V0LmN0cyAtLXVzZXIgJWQiOwogCisgICAgQEFwcE1vZGVJbnN0YW50KHJlYXNvbiA9ICJJbnN0YW50IGFwcHMgY2Fubm90IHByb3ZpZGUgb3IgaG9zdCBhcHAgd2lkZ2V0cyIpCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFudEFwcHNDYW5ub3RQcm92aWRlQXBwV2lkZ2V0cygpIHsKKyAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUoZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VGFyZ2V0Q29udGV4dCgpCisgICAgICAgICAgICAgICAgLmdldFBhY2thZ2VNYW5hZ2VyKCkuaXNJbnN0YW50QXBwKCkpOworICAgICAgICBhc3NlcnROdWxsKGdldEZpcnN0QXBwV2lkZ2V0UHJvdmlkZXJJbmZvKCkpOworICAgIH0KIAorICAgIEBBcHBNb2RlSW5zdGFudChyZWFzb24gPSAiSW5zdGFudCBhcHBzIGNhbm5vdCBwcm92aWRlIG9yIGhvc3QgYXBwIHdpZGdldHMiKQorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEluc3RhbnRBcHBzQ2Fubm90SG9zdEFwcFdpZGdldHMoKSB7CisgICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKGdldEluc3RydW1lbnRhdGlvbigpLmdldFRhcmdldENvbnRleHQoKQorICAgICAgICAgICAgICAgIC5nZXRQYWNrYWdlTWFuYWdlcigpLmlzSW5zdGFudEFwcCgpKTsKKyAgICAgICAgLy8gQ3JlYXRlIGEgaG9zdCBhbmQgc3RhcnQgbGlzdGVuaW5nLgorICAgICAgICBBcHBXaWRnZXRIb3N0IGhvc3QgPSBuZXcgQXBwV2lkZ2V0SG9zdChnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRUYXJnZXRDb250ZXh0KCksIDApOworICAgICAgICAvLyBBbGxvY2F0ZSBhbiBhcHAgd2lkZ2V0IGlkIHRvIGJpbmQuCisgICAgICAgIGFzc2VydFNhbWUoQXBwV2lkZ2V0TWFuYWdlci5JTlZBTElEX0FQUFdJREdFVF9JRCwgaG9zdC5hbGxvY2F0ZUFwcFdpZGdldElkKCkpOworICAgIH0KKworICAgIEBBcHBNb2RlRnVsbChyZWFzb24gPSAiSW5zdGFudCBhcHBzIGNhbm5vdCBwcm92aWRlIG9yIGhvc3QgYXBwIHdpZGdldHMiKQorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEdldEFwcEluc3RhbGxlZFByb3ZpZGVyc0ZvckN1cnJlbnRVc2VyTGVnYWN5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghaGFzQXBwV2lkZ2V0cygpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQogICAgICAgICAvLyBCeSBkZWZhdWx0IHdlIHNob3VsZCBnZXQgb25seSBwcm92aWRlcnMgZm9yIHRoZSBjdXJyZW50IHVzZXIuCiAgICAgICAgIExpc3Q8QXBwV2lkZ2V0UHJvdmlkZXJJbmZvPiBwcm92aWRlcnMgPSBnZXRBcHBXaWRnZXRNYW5hZ2VyKCkuZ2V0SW5zdGFsbGVkUHJvdmlkZXJzKCk7CiAKQEAgLTk2LDExICsxMjQsOSBAQAogICAgICAgICBhc3NlcnRFeHBlY3RlZEluc3RhbGxlZFByb3ZpZGVycyhwcm92aWRlcnMpOwogICAgIH0KIAorICAgIEBBcHBNb2RlRnVsbChyZWFzb24gPSAiSW5zdGFudCBhcHBzIGNhbm5vdCBwcm92aWRlIG9yIGhvc3QgYXBwIHdpZGdldHMiKQorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEdldEFwcEluc3RhbGxlZFByb3ZpZGVyc0ZvckN1cnJlbnRVc2VyTmV3Q3VycmVudFByb2ZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFoYXNBcHBXaWRnZXRzKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCiAgICAgICAgIC8vIFdlIGFzayBvbmx5IGZvciBwcm92aWRlcnMgZm9yIHRoZSBjdXJyZW50IHVzZXIuCiAgICAgICAgIExpc3Q8QXBwV2lkZ2V0UHJvdmlkZXJJbmZvPiBwcm92aWRlcnMgPSBnZXRBcHBXaWRnZXRNYW5hZ2VyKCkKICAgICAgICAgICAgICAgICAuZ2V0SW5zdGFsbGVkUHJvdmlkZXJzRm9yUHJvZmlsZShQcm9jZXNzLm15VXNlckhhbmRsZSgpKTsKQEAgLTEwOSwxMSArMTM1LDkgQEAKICAgICAgICAgYXNzZXJ0RXhwZWN0ZWRJbnN0YWxsZWRQcm92aWRlcnMocHJvdmlkZXJzKTsKICAgICB9CiAKKyAgICBAQXBwTW9kZUZ1bGwocmVhc29uID0gIkluc3RhbnQgYXBwcyBjYW5ub3QgcHJvdmlkZSBvciBob3N0IGFwcCB3aWRnZXRzIikKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBcHBJbnN0YWxsZWRQcm92aWRlcnNGb3JDdXJyZW50VXNlck5ld0FsbFByb2ZpbGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghaGFzQXBwV2lkZ2V0cygpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQogICAgICAgICAvLyBXZSBhc2sgb25seSBmb3IgcHJvdmlkZXJzIGZvciBhbGwgY3VycmVudCB1c2VyJ3MgcHJvZmlsZXMKICAgICAgICAgVXNlck1hbmFnZXIgdXNlck1hbmFnZXIgPSAoVXNlck1hbmFnZXIpIGdldEluc3RydW1lbnRhdGlvbigpCiAgICAgICAgICAgICAgICAgLmdldFRhcmdldENvbnRleHQoKS5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuVVNFUl9TRVJWSUNFKTsKQEAgLTEzMywxMSArMTU3LDkgQEAKICAgICAgICAgYXNzZXJ0RXhwZWN0ZWRJbnN0YWxsZWRQcm92aWRlcnMoYWxsUHJvdmlkZXJzKTsKICAgICB9CiAKKyAgICBAQXBwTW9kZUZ1bGwocmVhc29uID0gIkluc3RhbnQgYXBwcyBjYW5ub3QgcHJvdmlkZSBvciBob3N0IGFwcCB3aWRnZXRzIikKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RCaW5kQXBwV2lkZ2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghaGFzQXBwV2lkZ2V0cygpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQogICAgICAgICAvLyBDcmVhdGUgYSBob3N0IGFuZCBzdGFydCBsaXN0ZW5pbmcuCiAgICAgICAgIEFwcFdpZGdldEhvc3QgaG9zdCA9IG5ldyBBcHBXaWRnZXRIb3N0KGdldEluc3RydW1lbnRhdGlvbigpLmdldFRhcmdldENvbnRleHQoKSwgMCk7CiAgICAgICAgIGhvc3QuZGVsZXRlSG9zdCgpOwpAQCAtMTc0LDEwICsxOTYsOSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQEFwcE1vZGVGdWxsKHJlYXNvbiA9ICJJbnN0YW50IGFwcHMgY2Fubm90IHByb3ZpZGUgb3IgaG9zdCBhcHAgd2lkZ2V0cyIpCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QXBwV2lkZ2V0SWRzRm9ySG9zdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIWhhc0FwcFdpZGdldHMoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9CiAgICAgICAgIEFwcFdpZGdldEhvc3QgaG9zdDEgPSBuZXcgQXBwV2lkZ2V0SG9zdChnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRUYXJnZXRDb250ZXh0KCksIDEpOwogICAgICAgICBBcHBXaWRnZXRIb3N0IGhvc3QyID0gbmV3IEFwcFdpZGdldEhvc3QoZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VGFyZ2V0Q29udGV4dCgpLCAyKTsKIApAQCAtMjA2LDExICsyMjcsOSBAQAogICAgICAgICBob3N0Mi5kZWxldGVIb3N0KCk7CiAgICAgfQogCisgICAgQEFwcE1vZGVGdWxsKHJlYXNvbiA9ICJJbnN0YW50IGFwcHMgY2Fubm90IHByb3ZpZGUgb3IgaG9zdCBhcHAgd2lkZ2V0cyIpCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwV2lkZ2V0UHJvdmlkZXJDYWxsYmFja3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFoYXNBcHBXaWRnZXRzKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCiAgICAgICAgIEF0b21pY0ludGVnZXIgaW52b2NhdGlvbkNvdW50ZXIgPSBuZXcgQXRvbWljSW50ZWdlcigpOwogCiAgICAgICAgIC8vIFNldCBhIG1vY2sgdG8gaW50ZXJjZXB0IHByb3ZpZGVyIGNhbGxiYWNrcy4KQEAgLTIyNCw3ICsyNDMsNyBAQAogICAgICAgICBmaW5hbCBCdW5kbGUgc2Vjb25kT3B0aW9uczsKIAogICAgICAgICAvLyBDcmVhdGUgYSBob3N0IGFuZCBzdGFydCBsaXN0ZW5pbmcuCi0gICAgICAgIEFwcFdpZGdldEhvc3QgaG9zdCA9IHNweShuZXcgQXBwV2lkZ2V0SG9zdChnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRUYXJnZXRDb250ZXh0KCksIDApKTsKKyAgICAgICAgQXBwV2lkZ2V0SG9zdCBob3N0ID0gbmV3IEFwcFdpZGdldEhvc3QoZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VGFyZ2V0Q29udGV4dCgpLCAwKTsKICAgICAgICAgaG9zdC5kZWxldGVIb3N0KCk7CiAgICAgICAgIGhvc3Quc3RhcnRMaXN0ZW5pbmcoKTsKIApAQCAtMzE3LDExICszMzYsOSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQEFwcE1vZGVGdWxsKHJlYXNvbiA9ICJJbnN0YW50IGFwcHMgY2Fubm90IHByb3ZpZGUgb3IgaG9zdCBhcHAgd2lkZ2V0cyIpCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0VHdvQXBwV2lkZ2V0UHJvdmlkZXJDYWxsYmFja3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFoYXNBcHBXaWRnZXRzKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCiAgICAgICAgIEF0b21pY0ludGVnZXIgaW52b2NhdGlvbkNvdW50ZXIgPSBuZXcgQXRvbWljSW50ZWdlcigpOwogCiAgICAgICAgIC8vIFNldCBhIG1vY2sgdG8gaW50ZXJjZXB0IGZpcnN0IHByb3ZpZGVyIGNhbGxiYWNrcy4KQEAgLTMzOCw4ICszNTUsNyBAQAogICAgICAgICBpbnQgc2Vjb25kQXBwV2lkZ2V0SWQgPSAwOwogCiAgICAgICAgIC8vIENyZWF0ZSBhIGhvc3QgYW5kIHN0YXJ0IGxpc3RlbmluZy4KLSAgICAgICAgQXBwV2lkZ2V0SG9zdCBob3N0ID0gc3B5KG5ldyBBcHBXaWRnZXRIb3N0KAotICAgICAgICAgICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpLmdldFRhcmdldENvbnRleHQoKSwgMCkpOworICAgICAgICBBcHBXaWRnZXRIb3N0IGhvc3QgPSBuZXcgQXBwV2lkZ2V0SG9zdChnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRUYXJnZXRDb250ZXh0KCksIDApOwogICAgICAgICBob3N0LmRlbGV0ZUhvc3QoKTsKICAgICAgICAgaG9zdC5zdGFydExpc3RlbmluZygpOwogCkBAIC00MTIsMTEgKzQyOCw5IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAQXBwTW9kZUZ1bGwocmVhc29uID0gIkluc3RhbnQgYXBwcyBjYW5ub3QgcHJvdmlkZSBvciBob3N0IGFwcCB3aWRnZXRzIikKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBcHBXaWRnZXRJZHNGb3JQcm92aWRlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIWhhc0FwcFdpZGdldHMoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KICAgICAgICAgLy8gV2Ugd2FudCB0byBiaW5kIHdpZGdldHMuCiAgICAgICAgIGdyYW50QmluZEFwcFdpZGdldFBlcm1pc3Npb24oKTsKIApAQCAtNDYzLDExICs0NzcsOSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQEFwcE1vZGVGdWxsKHJlYXNvbiA9ICJJbnN0YW50IGFwcHMgY2Fubm90IHByb3ZpZGUgb3IgaG9zdCBhcHAgd2lkZ2V0cyIpCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QXBwV2lkZ2V0SW5mbygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIWhhc0FwcFdpZGdldHMoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KICAgICAgICAgLy8gV2Ugd2FudCB0byBiaW5kIHdpZGdldHMuCiAgICAgICAgIGdyYW50QmluZEFwcFdpZGdldFBlcm1pc3Npb24oKTsKIApAQCAtNTE5LDExICs1MzEsOSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQEFwcE1vZGVGdWxsKHJlYXNvbiA9ICJJbnN0YW50IGFwcHMgY2Fubm90IHByb3ZpZGUgb3IgaG9zdCBhcHAgd2lkZ2V0cyIpCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QXBwV2lkZ2V0T3B0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIWhhc0FwcFdpZGdldHMoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KICAgICAgICAgLy8gV2Ugd2FudCB0byBiaW5kIHdpZGdldHMuCiAgICAgICAgIGdyYW50QmluZEFwcFdpZGdldFBlcm1pc3Npb24oKTsKIApAQCAtNTY4LDExICs1NzgsOSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQEFwcE1vZGVGdWxsKHJlYXNvbiA9ICJJbnN0YW50IGFwcHMgY2Fubm90IHByb3ZpZGUgb3IgaG9zdCBhcHAgd2lkZ2V0cyIpCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlSG9zdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIWhhc0FwcFdpZGdldHMoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KICAgICAgICAgLy8gV2Ugd2FudCB0byBiaW5kIHdpZGdldHMuCiAgICAgICAgIGdyYW50QmluZEFwcFdpZGdldFBlcm1pc3Npb24oKTsKIApAQCAtNjEzLDExICs2MjEsOSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQEFwcE1vZGVGdWxsKHJlYXNvbiA9ICJJbnN0YW50IGFwcHMgY2Fubm90IHByb3ZpZGUgb3IgaG9zdCBhcHAgd2lkZ2V0cyIpCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlSG9zdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFoYXNBcHBXaWRnZXRzKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCiAgICAgICAgIC8vIFdlIHdhbnQgdG8gYmluZCB3aWRnZXRzLgogICAgICAgICBncmFudEJpbmRBcHBXaWRnZXRQZXJtaXNzaW9uKCk7CiAKQEAgLTY3MywxMSArNjc5LDkgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBBcHBNb2RlRnVsbChyZWFzb24gPSAiSW5zdGFudCBhcHBzIGNhbm5vdCBwcm92aWRlIG9yIGhvc3QgYXBwIHdpZGdldHMiKQorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE9uUHJvdmlkZXJzQ2hhbmdlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIWhhc0FwcFdpZGdldHMoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KICAgICAgICAgLy8gV2Ugd2FudCB0byBiaW5kIHdpZGdldHMuCiAgICAgICAgIGdyYW50QmluZEFwcFdpZGdldFBlcm1pc3Npb24oKTsKIApAQCAtNzM5LDExICs3NDMsOSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQEFwcE1vZGVGdWxsKHJlYXNvbiA9ICJJbnN0YW50IGFwcHMgY2Fubm90IHByb3ZpZGUgb3IgaG9zdCBhcHAgd2lkZ2V0cyIpCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQXBwV2lkZ2V0VmlhQ29tcG9uZW50TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIWhhc0FwcFdpZGdldHMoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KICAgICAgICAgLy8gV2Ugd2FudCB0byBiaW5kIHdpZGdldHMuCiAgICAgICAgIGdyYW50QmluZEFwcFdpZGdldFBlcm1pc3Npb24oKTsKIApAQCAtODMzLDExICs4MzUsOSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQEFwcE1vZGVGdWxsKHJlYXNvbiA9ICJJbnN0YW50IGFwcHMgY2Fubm90IHByb3ZpZGUgb3IgaG9zdCBhcHAgd2lkZ2V0cyIpCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQXBwV2lkZ2V0VmlhV2lkZ2V0SWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFoYXNBcHBXaWRnZXRzKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCiAgICAgICAgIC8vIFdlIHdhbnQgdG8gYmluZCB3aWRnZXRzLgogICAgICAgICBncmFudEJpbmRBcHBXaWRnZXRQZXJtaXNzaW9uKCk7CiAKQEAgLTkwNywxMSArOTA3LDkgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBBcHBNb2RlRnVsbChyZWFzb24gPSAiSW5zdGFudCBhcHBzIGNhbm5vdCBwcm92aWRlIG9yIGhvc3QgYXBwIHdpZGdldHMiKQorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFVwZGF0ZUFwcFdpZGdldFZpYVdpZGdldElkcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIWhhc0FwcFdpZGdldHMoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KICAgICAgICAgLy8gV2Ugd2FudCB0byBiaW5kIHdpZGdldHMuCiAgICAgICAgIGdyYW50QmluZEFwcFdpZGdldFBlcm1pc3Npb24oKTsKIApAQCAtMTAwMywxMSArMTAwMSw5IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAQXBwTW9kZUZ1bGwocmVhc29uID0gIkluc3RhbnQgYXBwcyBjYW5ub3QgcHJvdmlkZSBvciBob3N0IGFwcCB3aWRnZXRzIikKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJ0aWFsbHlVcGRhdGVBcHBXaWRnZXRWaWFXaWRnZXRJZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIWhhc0FwcFdpZGdldHMoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KICAgICAgICAgLy8gV2Ugd2FudCB0byBiaW5kIHdpZGdldHMuCiAgICAgICAgIGdyYW50QmluZEFwcFdpZGdldFBlcm1pc3Npb24oKTsKIApAQCAtMTA4MSwxMSArMTA3Nyw5IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAQXBwTW9kZUZ1bGwocmVhc29uID0gIkluc3RhbnQgYXBwcyBjYW5ub3QgcHJvdmlkZSBvciBob3N0IGFwcCB3aWRnZXRzIikKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJ0aWFsbHlVcGRhdGVBcHBXaWRnZXRWaWFXaWRnZXRJZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFoYXNBcHBXaWRnZXRzKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCiAgICAgICAgIC8vIFdlIHdhbnQgdG8gYmluZCB3aWRnZXRzLgogICAgICAgICBncmFudEJpbmRBcHBXaWRnZXRQZXJtaXNzaW9uKCk7CiAKQEAgLTExOTUsMTEgKzExODksOSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQEFwcE1vZGVGdWxsKHJlYXNvbiA9ICJJbnN0YW50IGFwcHMgY2Fubm90IHByb3ZpZGUgb3IgaG9zdCBhcHAgd2lkZ2V0cyIpCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbldpZGdldHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFoYXNBcHBXaWRnZXRzKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCiAgICAgICAgIC8vIFdlIHdhbnQgdG8gYmluZCB3aWRnZXRzLgogICAgICAgICBncmFudEJpbmRBcHBXaWRnZXRQZXJtaXNzaW9uKCk7CiAKQEAgLTEzMDgsNiArMTMwMCwyNCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQEFwcE1vZGVGdWxsKHJlYXNvbiA9ICJJbnN0YW50IGFwcHMgY2Fubm90IHByb3ZpZGUgb3IgaG9zdCBhcHAgd2lkZ2V0cyIpCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2lkZ2V0RmVhdHVyZXNQYXJzZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGdldEZpcnN0QXBwV2lkZ2V0UHJvdmlkZXJJbmZvKCkud2lkZ2V0RmVhdHVyZXMpOworICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRUYXJnZXRDb250ZXh0KCkuZ2V0UGFja2FnZU5hbWUoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoQXBwV2lkZ2V0UHJvdmlkZXJJbmZvLldJREdFVF9GRUFUVVJFX1JFQ09ORklHVVJBQkxFLAorICAgICAgICAgICAgICAgIGdldFByb3ZpZGVySW5mbyhuZXcgQ29tcG9uZW50TmFtZShwYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICBBcHBXaWRnZXRQcm92aWRlcldpdGhGZWF0dXJlcy5Qcm92aWRlcjEuY2xhc3MuZ2V0TmFtZSgpKSkud2lkZ2V0RmVhdHVyZXMpOworICAgICAgICBhc3NlcnRFcXVhbHMoQXBwV2lkZ2V0UHJvdmlkZXJJbmZvLldJREdFVF9GRUFUVVJFX0hJREVfRlJPTV9QSUNLRVIsCisgICAgICAgICAgICAgICAgZ2V0UHJvdmlkZXJJbmZvKG5ldyBDb21wb25lbnROYW1lKHBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgQXBwV2lkZ2V0UHJvdmlkZXJXaXRoRmVhdHVyZXMuUHJvdmlkZXIyLmNsYXNzLmdldE5hbWUoKSkpLndpZGdldEZlYXR1cmVzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFwcFdpZGdldFByb3ZpZGVySW5mby5XSURHRVRfRkVBVFVSRV9SRUNPTkZJR1VSQUJMRQorICAgICAgICAgICAgICAgIHwgQXBwV2lkZ2V0UHJvdmlkZXJJbmZvLldJREdFVF9GRUFUVVJFX0hJREVfRlJPTV9QSUNLRVIsCisgICAgICAgICAgICAgICAgZ2V0UHJvdmlkZXJJbmZvKG5ldyBDb21wb25lbnROYW1lKHBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgQXBwV2lkZ2V0UHJvdmlkZXJXaXRoRmVhdHVyZXMuUHJvdmlkZXIzLmNsYXNzLmdldE5hbWUoKSkpLndpZGdldEZlYXR1cmVzKTsKKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgd2FpdEZvckNhbGxDb3VudChBdG9taWNJbnRlZ2VyIGNvdW50ZXIsIGludCBleHBlY3RlZENvdW50KSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKICAgICAgICAgICAgIGZpbmFsIGxvbmcgc3RhcnRUaW1lTWlsbGlzID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CkBAIC0xMzM0LDExICsxMzQ0LDEzIEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGdyYW50QmluZEFwcFdpZGdldFBlcm1pc3Npb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcnVuU2hlbGxDb21tYW5kKEdSQU5UX0JJTkRfQVBQX1dJREdFVF9QRVJNSVNTSU9OX0NPTU1BTkQpOworICAgICAgICBydW5TaGVsbENvbW1hbmQoU3RyaW5nLmZvcm1hdChHUkFOVF9CSU5EX0FQUF9XSURHRVRfUEVSTUlTU0lPTl9DT01NQU5ELAorICAgICAgICAgICAgICAgIFByb2Nlc3MubXlVc2VySGFuZGxlKCkuZ2V0SWRlbnRpZmllcigpKSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHJldm9rZUJpbmRBcHBXaWRnZXRQZXJtaXNzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJ1blNoZWxsQ29tbWFuZChSRVZPS0VfQklORF9BUFBfV0lER0VUX1BFUk1JU1NJT05fQ09NTUFORCk7CisgICAgICAgIHJ1blNoZWxsQ29tbWFuZChTdHJpbmcuZm9ybWF0KFJFVk9LRV9CSU5EX0FQUF9XSURHRVRfUEVSTUlTU0lPTl9DT01NQU5ELAorICAgICAgICAgICAgICAgIFByb2Nlc3MubXlVc2VySGFuZGxlKCkuZ2V0SWRlbnRpZmllcigpKSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBBcHBXaWRnZXRQcm92aWRlckluZm8gZ2V0Rmlyc3RBcHBXaWRnZXRQcm92aWRlckluZm8oKSB7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9hcHB3aWRnZXQvc3JjL2FuZHJvaWQvYXBwd2lkZ2V0L2N0cy9BcHBXaWRnZXRUZXN0Q2FzZS5qYXZhIGIvdGVzdHMvdGVzdHMvYXBwd2lkZ2V0L3NyYy9hbmRyb2lkL2FwcHdpZGdldC9jdHMvQXBwV2lkZ2V0VGVzdENhc2UuamF2YQppbmRleCBmYjBkYmQxLi44YTA0OTE1IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9hcHB3aWRnZXQvc3JjL2FuZHJvaWQvYXBwd2lkZ2V0L2N0cy9BcHBXaWRnZXRUZXN0Q2FzZS5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2FwcHdpZGdldC9zcmMvYW5kcm9pZC9hcHB3aWRnZXQvY3RzL0FwcFdpZGdldFRlc3RDYXNlLmphdmEKQEAgLTE2LDMxICsxNiw1MSBAQAogCiBwYWNrYWdlIGFuZHJvaWQuYXBwd2lkZ2V0LmN0czsKIAoraW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc3VtZS5hc3N1bWVUcnVlOworCitpbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOwogaW1wb3J0IGFuZHJvaWQuYXBwd2lkZ2V0LkFwcFdpZGdldFByb3ZpZGVySW5mbzsKIGltcG9ydCBhbmRyb2lkLmFwcHdpZGdldC5jdHMucHJvdmlkZXIuRmlyc3RBcHBXaWRnZXRQcm92aWRlcjsKIGltcG9ydCBhbmRyb2lkLmFwcHdpZGdldC5jdHMucHJvdmlkZXIuU2Vjb25kQXBwV2lkZ2V0UHJvdmlkZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3I7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RDYXNlOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAotcHVibGljIGFic3RyYWN0IGNsYXNzIEFwcFdpZGdldFRlc3RDYXNlIGV4dGVuZHMgSW5zdHJ1bWVudGF0aW9uVGVzdENhc2UgeworQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBcHBXaWRnZXRUZXN0Q2FzZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJBcHBXaWRnZXRUZXN0IjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklSU1RfQVBQX1dJREdFVF9DT05GSUdVUkVfQUNUSVZJVFkgPQogICAgICAgICAgICAgImFuZHJvaWQuYXBwd2lkZ2V0LmN0cy5wcm92aWRlci5GaXJzdEFwcFdpZGdldENvbmZpZ3VyZUFjdGl2aXR5IjsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRUNPTkRfQVBQX1dJREdFVF9DT05GSUdVUkVfQUNUSVZJVFkgPQogICAgICAgICAgICAgImFuZHJvaWQuYXBwd2lkZ2V0LmN0cy5wcm92aWRlci5TZWNvbmRBcHBXaWRnZXRDb25maWd1cmVBY3Rpdml0eSI7CiAKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgYXNzdW1lSGFzV2lkZ2V0cygpIHsKKyAgICAgICAgYXNzdW1lVHJ1ZShoYXNBcHBXaWRnZXRzKCkpOworICAgIH0KKwogICAgIHB1YmxpYyBib29sZWFuIGhhc0FwcFdpZGdldHMoKSB7CiAgICAgICAgIHJldHVybiBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRUYXJnZXRDb250ZXh0KCkuZ2V0UGFja2FnZU1hbmFnZXIoKQogICAgICAgICAgICAgICAgIC5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfQVBQX1dJREdFVFMpOwogICAgIH0KIAorICAgIHByb3RlY3RlZCBJbnN0cnVtZW50YXRpb24gZ2V0SW5zdHJ1bWVudGF0aW9uKCkgeworICAgICAgICByZXR1cm4gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCk7CisgICAgfQorCiAgICAgcHVibGljIGJvb2xlYW5bXSB2ZXJpZnlJbnN0YWxsZWRQcm92aWRlcnMoTGlzdDxBcHBXaWRnZXRQcm92aWRlckluZm8+IHByb3ZpZGVycykgewogICAgICAgICBib29sZWFuIGZpcnN0UHJvdmlkZXJWZXJpZmllZCA9IGZhbHNlOwogICAgICAgICBib29sZWFuIHNlY29uZFByb3ZpZGVyVmVyaWZpZWQgPSBmYWxzZTsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2FwcHdpZGdldC9zcmMvYW5kcm9pZC9hcHB3aWRnZXQvY3RzL1JlcXVlc3RQaW5BcHBXaWRnZXRUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9hcHB3aWRnZXQvc3JjL2FuZHJvaWQvYXBwd2lkZ2V0L2N0cy9SZXF1ZXN0UGluQXBwV2lkZ2V0VGVzdC5qYXZhCmluZGV4IDgyYjNhMDQuLjZhNTRlNTcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2FwcHdpZGdldC9zcmMvYW5kcm9pZC9hcHB3aWRnZXQvY3RzL1JlcXVlc3RQaW5BcHBXaWRnZXRUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvYXBwd2lkZ2V0L3NyYy9hbmRyb2lkL2FwcHdpZGdldC9jdHMvUmVxdWVzdFBpbkFwcFdpZGdldFRlc3QuamF2YQpAQCAtMTYsNiArMTYsMTAgQEAKIAogcGFja2FnZSBhbmRyb2lkLmFwcHdpZGdldC5jdHM7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCiBpbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKIGltcG9ydCBhbmRyb2lkLmFwcHdpZGdldC5BcHBXaWRnZXRNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuYXBwd2lkZ2V0LmN0cy5jb21tb24uQ29uc3RhbnRzOwpAQCAtMjYsNiArMzAsMTEgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uTGF1bmNoZXJBcHBzOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CkBAIC0zMyw2ICs0Miw3IEBACiAKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNkZFRlc3Q7CiAKK0BBcHBNb2RlRnVsbChyZWFzb24gPSAiSW5zdGFudCBhcHBzIGNhbm5vdCBwcm92aWRlIG9yIGhvc3QgYXBwIHdpZGdldHMiKQogcHVibGljIGNsYXNzIFJlcXVlc3RQaW5BcHBXaWRnZXRUZXN0IGV4dGVuZHMgQXBwV2lkZ2V0VGVzdENhc2UgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBVU5DSEVSX0NMQVNTID0gImFuZHJvaWQuYXBwd2lkZ2V0LmN0cy5wYWNrYWdlcy5MYXVuY2hlciI7CkBAIC00MCwyNCArNTAsMTkgQEAKIAogICAgIHByaXZhdGUgU3RyaW5nIG1EZWZhdWx0TGF1bmNoZXI7CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcExhdW5jaGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIG1EZWZhdWx0TGF1bmNoZXIgPSBnZXREZWZhdWx0TGF1bmNoZXIoKTsKICAgICB9CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duTGF1bmNoZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gU2V0IHRoZSBsYXVuY2hlciBiYWNrCiAgICAgICAgIHNldExhdW5jaGVyKG1EZWZhdWx0TGF1bmNoZXIpOwogICAgIH0KIAogICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSIzLjguMi9DLTItMiIpCiAgICAgcHJpdmF0ZSB2b2lkIHJ1blBpbldpZGdldFRlc3QoZmluYWwgU3RyaW5nIGxhdW5jaGVyUGtnKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFoYXNBcHBXaWRnZXRzKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQogICAgICAgICBzZXRMYXVuY2hlcihsYXVuY2hlclBrZyArICIvIiArIExBVU5DSEVSX0NMQVNTKTsKIAogICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRDb250ZXh0KCk7CkBAIC0xMDIsMTAgKzEwNywxMiBAQAogICAgICAgICByZXN1bHRSZWNlaXZlci51bnJlZ2lzdGVyKCk7CiAgICAgfQogCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UGluV2lkZ2V0X2xhdW5jaGVyMSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBydW5QaW5XaWRnZXRUZXN0KCJhbmRyb2lkLmFwcHdpZGdldC5jdHMucGFja2FnZXMubGF1bmNoZXIxIik7CiAgICAgfQogCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UGluV2lkZ2V0X2xhdW5jaGVyMigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBydW5QaW5XaWRnZXRUZXN0KCJhbmRyb2lkLmFwcHdpZGdldC5jdHMucGFja2FnZXMubGF1bmNoZXIyIik7CiAgICAgfQpAQCAtMTEzLDkgKzEyMCw2IEBACiAgICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjMuOC4yL0MtMi0xIikKICAgICBwdWJsaWMgdm9pZCB2ZXJpZnlJc1JlcXVlc3RQaW5BcHBXaWRnZXRTdXBwb3J0ZWQoU3RyaW5nIGxhdW5jaGVyUGtnLCBib29sZWFuIGV4cGVjdGVkU3VwcG9ydCkKICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghaGFzQXBwV2lkZ2V0cygpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KICAgICAgICAgc2V0TGF1bmNoZXIobGF1bmNoZXJQa2cgKyAiLyIgKyBMQVVOQ0hFUl9DTEFTUyk7CiAKICAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0Q29udGV4dCgpOwpAQCAtMTIzLDE0ICsxMjcsMTcgQEAKICAgICAgICAgICAgICAgICBBcHBXaWRnZXRNYW5hZ2VyLmdldEluc3RhbmNlKGNvbnRleHQpLmlzUmVxdWVzdFBpbkFwcFdpZGdldFN1cHBvcnRlZCgpKTsKICAgICB9CiAKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RJc1JlcXVlc3RQaW5BcHBXaWRnZXRTdXBwb3J0ZWRfbGF1bmNoZXIxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHZlcmlmeUlzUmVxdWVzdFBpbkFwcFdpZGdldFN1cHBvcnRlZCgiYW5kcm9pZC5hcHB3aWRnZXQuY3RzLnBhY2thZ2VzLmxhdW5jaGVyMSIsIHRydWUpOwogICAgIH0KIAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdElzUmVxdWVzdFBpbkFwcFdpZGdldFN1cHBvcnRlZF9sYXVuY2hlcjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgdmVyaWZ5SXNSZXF1ZXN0UGluQXBwV2lkZ2V0U3VwcG9ydGVkKCJhbmRyb2lkLmFwcHdpZGdldC5jdHMucGFja2FnZXMubGF1bmNoZXIyIiwgdHJ1ZSk7CiAgICAgfQogCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0SXNSZXF1ZXN0UGluQXBwV2lkZ2V0U3VwcG9ydGVkX2xhdW5jaGVyMygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICB2ZXJpZnlJc1JlcXVlc3RQaW5BcHBXaWRnZXRTdXBwb3J0ZWQoImFuZHJvaWQuYXBwd2lkZ2V0LmN0cy5wYWNrYWdlcy5sYXVuY2hlcjMiLCBmYWxzZSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvYXBwd2lkZ2V0L3NyYy9hbmRyb2lkL2FwcHdpZGdldC9jdHMvVXBkYXRlUHJvdmlkZXJJbmZvVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvYXBwd2lkZ2V0L3NyYy9hbmRyb2lkL2FwcHdpZGdldC9jdHMvVXBkYXRlUHJvdmlkZXJJbmZvVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkN2Y3NzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9hcHB3aWRnZXQvc3JjL2FuZHJvaWQvYXBwd2lkZ2V0L2N0cy9VcGRhdGVQcm92aWRlckluZm9UZXN0LmphdmEKQEAgLTAsMCArMSwxODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYXBwd2lkZ2V0LmN0czsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CisKK2ltcG9ydCBhbmRyb2lkLmFwcHdpZGdldC5BcHBXaWRnZXRIb3N0OworaW1wb3J0IGFuZHJvaWQuYXBwd2lkZ2V0LkFwcFdpZGdldE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5hcHB3aWRnZXQuQXBwV2lkZ2V0UHJvdmlkZXJJbmZvOworaW1wb3J0IGFuZHJvaWQuYXBwd2lkZ2V0LmN0cy5jb21tb24uQ29uc3RhbnRzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOworaW1wb3J0IGFuZHJvaWQub3MuUHJvY2VzczsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCitAQXBwTW9kZUZ1bGwocmVhc29uID0gIkluc3RhbnQgYXBwcyBjYW5ub3QgcHJvdmlkZSBvciBob3N0IGFwcCB3aWRnZXRzIikKK3B1YmxpYyBjbGFzcyBVcGRhdGVQcm92aWRlckluZm9UZXN0IGV4dGVuZHMgQXBwV2lkZ2V0VGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1ZJREVSX1BBQ0tBR0UgPSAiYW5kcm9pZC5hcHB3aWRnZXQuY3RzLndpZGdldHByb3ZpZGVyIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPVklERVJfQ0xBU1MgPSAiYW5kcm9pZC5hcHB3aWRnZXQuY3RzLnBhY2thZ2VzLlNpbXBsZVByb3ZpZGVyIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUEtfUEFUSCA9ICJkYXRhL2xvY2FsL3RtcC9jdHMvd2lkZ2V0cHJvdmlkZXIvIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBLX1YxID0gQVBLX1BBVEggKyAiQ3RzQXBwV2lkZ2V0UHJvdmlkZXIxLmFwayI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFQS19WMiA9IEFQS19QQVRIICsgIkN0c0FwcFdpZGdldFByb3ZpZGVyMi5hcGsiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUEtfVjMgPSBBUEtfUEFUSCArICJDdHNBcHBXaWRnZXRQcm92aWRlcjMuYXBrIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9DVVNUT01fSU5GTyA9ICJteV9jdXN0b21faW5mbyI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSE9TVF9JRCA9IDQyOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFVFJZX0NPVU5UID0gMzsKKworICAgIHByaXZhdGUgQ291bnREb3duTGF0Y2ggbVByb3ZpZGVyQ2hhbmdlTm90aWZpZXI7CisgICAgQXBwV2lkZ2V0SG9zdCBtSG9zdDsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcFByb3ZpZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHVuaW5zdGFsbFByb3ZpZGVyKCk7CisgICAgICAgIGNyZWF0ZUhvc3QoKTsKKyAgICB9CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93blByb3ZpZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHVuaW5zdGFsbFByb3ZpZGVyKCk7CisKKyAgICAgICAgaWYgKG1Ib3N0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Ib3N0LmRlbGV0ZUhvc3QoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEluZm9PdmVycmlkZXMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgLy8gT24gZmlyc3QgaW5zdGFsbCB0aGUgcHJvdmlkZXIgZG9lcyBub3QgaGF2ZSBhbnkgY29uZmlnIGFjdGl2aXR5LgorICAgICAgICBpbnN0YWxsQXBrKEFQS19WMSk7CisgICAgICAgIGFzc2VydE51bGwoZ2V0UHJvdmlkZXJJbmZvKCkuY29uZmlndXJlKTsKKworICAgICAgICAvLyBUaGUgcHJvdmlkZXIgaW5mbyBpcyB1cGRhdGVkCisgICAgICAgIHVwZGF0ZUluZm8oRVhUUkFfQ1VTVE9NX0lORk8pOworICAgICAgICBhc3NlcnROb3ROdWxsKGdldFByb3ZpZGVySW5mbygpLmNvbmZpZ3VyZSk7CisKKyAgICAgICAgLy8gVGhlIHByb3ZpZGVyIGluZm8gaXMgdXBkYXRlZAorICAgICAgICB1cGRhdGVJbmZvKG51bGwpOworICAgICAgICBhc3NlcnROdWxsKGdldFByb3ZpZGVySW5mbygpLmNvbmZpZ3VyZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3ZlcnJpZGVzUGVyc2lzdGVkT25VcGRhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW5zdGFsbEFwayhBUEtfVjEpOworICAgICAgICBhc3NlcnROdWxsKGdldFByb3ZpZGVySW5mbygpLmNvbmZpZ3VyZSk7CisKKyAgICAgICAgdXBkYXRlSW5mbyhFWFRSQV9DVVNUT01fSU5GTyk7CisgICAgICAgIGFzc2VydE5vdE51bGwoZ2V0UHJvdmlkZXJJbmZvKCkuY29uZmlndXJlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKChBcHBXaWRnZXRQcm92aWRlckluZm8uUkVTSVpFX0JPVEggJiBnZXRQcm92aWRlckluZm8oKS5yZXNpemVNb2RlKSwKKyAgICAgICAgICAgICAgICBBcHBXaWRnZXRQcm92aWRlckluZm8uUkVTSVpFX0JPVEgpOworCisgICAgICAgIC8vIEFwayB1cGRhdGVkLCB0aGUgaW5mbyBpcyBhbHNvIHVwZGF0ZWQKKyAgICAgICAgaW5zdGFsbEFwayhBUEtfVjIpOworICAgICAgICBhc3NlcnROb3ROdWxsKGdldFByb3ZpZGVySW5mbygpLmNvbmZpZ3VyZSk7CisgICAgICAgIGFzc2VydEVxdWFscygoQXBwV2lkZ2V0UHJvdmlkZXJJbmZvLlJFU0laRV9CT1RIICYgZ2V0UHJvdmlkZXJJbmZvKCkucmVzaXplTW9kZSksIDApOworCisgICAgICAgIC8vIFRoZSBwcm92aWRlciBpbmZvIGlzIHJldmVydGVkCisgICAgICAgIHVwZGF0ZUluZm8obnVsbCk7CisgICAgICAgIGFzc2VydE51bGwoZ2V0UHJvdmlkZXJJbmZvKCkuY29uZmlndXJlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPdmVycmlkZUNsZWFyZWRXaGVuTWlzc2luZ0luZm8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW5zdGFsbEFwayhBUEtfVjEpOworICAgICAgICBhc3NlcnROdWxsKGdldFByb3ZpZGVySW5mbygpLmNvbmZpZ3VyZSk7CisKKyAgICAgICAgdXBkYXRlSW5mbyhFWFRSQV9DVVNUT01fSU5GTyk7CisgICAgICAgIGFzc2VydE5vdE51bGwoZ2V0UHJvdmlkZXJJbmZvKCkuY29uZmlndXJlKTsKKworICAgICAgICAvLyBWMyBkb2VzIG5vdCBoYXZlIHRoZSBjdXN0b20gaW5mbyBkZWZpbml0aW9uCisgICAgICAgIGluc3RhbGxBcGsoQVBLX1YzKTsKKyAgICAgICAgYXNzZXJ0TnVsbChnZXRQcm92aWRlckluZm8oKS5jb25maWd1cmUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjcmVhdGVIb3N0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAobmV3IEhhbmRsZXIoTG9vcGVyLmdldE1haW5Mb29wZXIoKSkpLnBvc3QoKCkgLT4geworICAgICAgICAgICAgICAgIG1Ib3N0ID0gbmV3IEFwcFdpZGdldEhvc3QoZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VGFyZ2V0Q29udGV4dCgpLCBIT1NUX0lEKSB7CisKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uUHJvdmlkZXJzQ2hhbmdlZCgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLm9uUHJvdmlkZXJzQ2hhbmdlZCgpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVByb3ZpZGVyQ2hhbmdlTm90aWZpZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qcm92aWRlckNoYW5nZU5vdGlmaWVyLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBtSG9zdC5zdGFydExpc3RlbmluZygpOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbih0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVJbmZvKFN0cmluZyBrZXkpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtUHJvdmlkZXJDaGFuZ2VOb3RpZmllciA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoQ29uc3RhbnRzLkFDVElPTl9BUFBMWV9PVkVSUklERSkKKyAgICAgICAgICAgICAgICAuc2V0Q29tcG9uZW50KG5ldyBDb21wb25lbnROYW1lKFBST1ZJREVSX1BBQ0tBR0UsIFBST1ZJREVSX0NMQVNTKSkKKyAgICAgICAgICAgICAgICAuYWRkRmxhZ3MoSW50ZW50LkZMQUdfUkVDRUlWRVJfRk9SRUdST1VORCkKKyAgICAgICAgICAgICAgICAucHV0RXh0cmEoQ29uc3RhbnRzLkVYVFJBX1JFUVVFU1QsIGtleSk7CisgICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpLmdldFRhcmdldENvbnRleHQoKS5zZW5kQnJvYWRjYXN0KGludGVudCk7CisKKyAgICAgICAgLy8gV2FpdCB1bnRpbCB0aGUgYXBwIHdpZGdldCBtYW5hZ2VyIGlzIG5vdGlmaWVkCisgICAgICAgIG1Qcm92aWRlckNoYW5nZU5vdGlmaWVyLmF3YWl0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHVuaW5zdGFsbFByb3ZpZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJ1blNoZWxsQ29tbWFuZCgicG0gdW5pbnN0YWxsICIgKyBQUk9WSURFUl9QQUNLQUdFKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5zdGFsbEFwayhTdHJpbmcgcGF0aCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1Qcm92aWRlckNoYW5nZU5vdGlmaWVyID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworICAgICAgICBydW5TaGVsbENvbW1hbmQoInBtIGluc3RhbGwgLXIgLWQgIiArIHBhdGgpOworCisgICAgICAgIC8vIFdhaXQgdW50aWwgdGhlIGFwcCB3aWRnZXQgbWFuYWdlciBpcyBub3RpZmllZAorICAgICAgICBtUHJvdmlkZXJDaGFuZ2VOb3RpZmllci5hd2FpdCgpOworICAgIH0KKworICAgIHByaXZhdGUgQXBwV2lkZ2V0UHJvdmlkZXJJbmZvIGdldFByb3ZpZGVySW5mbygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFJFVFJZX0NPVU5UOyBpKyspIHsKKyAgICAgICAgICAgIG1Qcm92aWRlckNoYW5nZU5vdGlmaWVyID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworICAgICAgICAgICAgTGlzdDxBcHBXaWRnZXRQcm92aWRlckluZm8+IHByb3ZpZGVycyA9IEFwcFdpZGdldE1hbmFnZXIuZ2V0SW5zdGFuY2UoZ2V0SW5zdHJ1bWVudGF0aW9uKCkKKyAgICAgICAgICAgICAgICAgICAgLmdldFRhcmdldENvbnRleHQoKSkuZ2V0SW5zdGFsbGVkUHJvdmlkZXJzRm9yUGFja2FnZSgKKyAgICAgICAgICAgICAgICAgICAgUFJPVklERVJfUEFDS0FHRSwgUHJvY2Vzcy5teVVzZXJIYW5kbGUoKSk7CisKKyAgICAgICAgICAgIGlmIChwcm92aWRlcnMgIT0gbnVsbCAmJiAhcHJvdmlkZXJzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBwcm92aWRlcnMuZ2V0KDApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBTb21ldGltZXMgaXQgY291bGQgdGFrZSB0aW1lIGZvciB0aGUgaW5mbyB0byBhcHBlYXIgYWZ0ZXIgdGhlIGFwayBpcyBqdXN0IGluc3RhbGxlZAorICAgICAgICAgICAgbVByb3ZpZGVyQ2hhbmdlTm90aWZpZXIuYXdhaXQoMiwgVGltZVVuaXQuU0VDT05EUyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvYXBwd2lkZ2V0L3NyYy9hbmRyb2lkL2FwcHdpZGdldC9jdHMvcHJvdmlkZXIvQXBwV2lkZ2V0UHJvdmlkZXJXaXRoRmVhdHVyZXMuamF2YSBiL3Rlc3RzL3Rlc3RzL2FwcHdpZGdldC9zcmMvYW5kcm9pZC9hcHB3aWRnZXQvY3RzL3Byb3ZpZGVyL0FwcFdpZGdldFByb3ZpZGVyV2l0aEZlYXR1cmVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFmODQ4YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2FwcHdpZGdldC9zcmMvYW5kcm9pZC9hcHB3aWRnZXQvY3RzL3Byb3ZpZGVyL0FwcFdpZGdldFByb3ZpZGVyV2l0aEZlYXR1cmVzLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hcHB3aWRnZXQuY3RzLnByb3ZpZGVyOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQXBwV2lkZ2V0UHJvdmlkZXJXaXRoRmVhdHVyZXMgZXh0ZW5kcyBTdHViYmFibGVBcHBXaWRnZXRQcm92aWRlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IHNMb2NrID0gbmV3IE9iamVjdCgpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgQXBwV2lkZ2V0UHJvdmlkZXJDYWxsYmFja3Mgc0NhbGxiYWNrczsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDYWxsYmFja3MoQXBwV2lkZ2V0UHJvdmlkZXJDYWxsYmFja3MgY2FsbGJhY2tzKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAoc0xvY2spIHsKKyAgICAgICAgICAgIHNDYWxsYmFja3MgPSBjYWxsYmFja3M7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwV2lkZ2V0UHJvdmlkZXJDYWxsYmFja3MgZ2V0Q2FsbGJhY2tzKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHNMb2NrKSB7CisgICAgICAgICAgICBpZiAoc0NhbGxiYWNrcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc0NhbGxiYWNrcy5zZXRQcm92aWRlcih0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzQ2FsbGJhY2tzOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBQcm92aWRlcjEgZXh0ZW5kcyBBcHBXaWRnZXRQcm92aWRlcldpdGhGZWF0dXJlcyB7IH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUHJvdmlkZXIyIGV4dGVuZHMgQXBwV2lkZ2V0UHJvdmlkZXJXaXRoRmVhdHVyZXMgeyB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFByb3ZpZGVyMyBleHRlbmRzIEFwcFdpZGdldFByb3ZpZGVyV2l0aEZlYXR1cmVzIHsgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvYXNzaXN0L0FuZHJvaWQubWsgYi90ZXN0cy90ZXN0cy9hc3Npc3QvQW5kcm9pZC5tawppbmRleCA2YWE4MThlLi4zNmVjNzM1IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9hc3Npc3QvQW5kcm9pZC5taworKysgYi90ZXN0cy90ZXN0cy9hc3Npc3QvQW5kcm9pZC5tawpAQCAtMjQsNyArMjQsOSBAQAogIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAogTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKIAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IEN0c0Fzc2lzdENvbW1vbiBjdHN0ZXN0cnVubmVyIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNBc3Npc3RDb21tb24gY3RzdGVzdHJ1bm5lci1heHQgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQKKworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lci5zdHVicyBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicwogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2Fzc2lzdC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdGVzdHMvYXNzaXN0L0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggMDExNGVmNS4uZmVmZjdjNCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvYXNzaXN0L0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvYXNzaXN0L0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTQ1LDcgKzQ1LDcgQEAKICAgICAgIDwvYWN0aXZpdHk+CiAgICAgPC9hcHBsaWNhdGlvbj4KIAotICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuYXNzaXN0LmN0cyIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBvZiBhbmRyb2lkLmFzc2lzdCI+CiAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJsaXN0ZW5lciIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2Fzc2lzdC9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy90ZXN0cy9hc3Npc3QvQW5kcm9pZFRlc3QueG1sCmluZGV4IGQ4ZjMxZTcuLjEzYjE4NDcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2Fzc2lzdC9BbmRyb2lkVGVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvYXNzaXN0L0FuZHJvaWRUZXN0LnhtbApAQCAtMTQsNiArMTQsNyBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIEFzc2lzdCB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iZnJhbWV3b3JrIiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9hc3Npc3Qvc2VydmljZS9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvYXNzaXN0L3NlcnZpY2UvQW5kcm9pZC5tawppbmRleCAyMThlZDZiLi5mOTg5Nzc2IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9hc3Npc3Qvc2VydmljZS9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3Rlc3RzL2Fzc2lzdC9zZXJ2aWNlL0FuZHJvaWQubWsKQEAgLTIxLDcgKzIxLDcgQEAKICMgYW5kIHdoZW4gYnVpbHQgZXhwbGljaXRseSBwdXQgaXQgaW4gdGhlIGRhdGEgcGFydGl0aW9uCiBMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQogCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gQ3RzQXNzaXN0Q29tbW9uIGN0c3Rlc3RydW5uZXIgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IEN0c0Fzc2lzdENvbW1vbiBjdHN0ZXN0cnVubmVyLWF4dCBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dAogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2JhY2tncm91bmQvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL2JhY2tncm91bmQvQW5kcm9pZC5tawppbmRleCBjNWE5OGFhLi5iMjUxMmNlIDEwMDc1NQotLS0gYS90ZXN0cy90ZXN0cy9iYWNrZ3JvdW5kL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvdGVzdHMvYmFja2dyb3VuZC9BbmRyb2lkLm1rCkBAIC0yMSwyMCArMjEsMjAgQEAKIExPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCiAKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCi0gICAgYW5kcm9pZC1zdXBwb3J0LXRlc3QgXAotICAgIGFuZHJvaWQtc3VwcG9ydC12NCBcCisgICAgYW5kcm9pZHgudGVzdC5ydWxlcyBcCisgICAgYW5kcm9pZHgubGVnYWN5X2xlZ2FjeS1zdXBwb3J0LXY0IFwKICAgICBtb2NraXRvLXRhcmdldC1taW51cy1qdW5pdDQgXAotICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwgXAotICAgIGN0c3Rlc3RydW5uZXIgXAorICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0IFwKKyAgICBjdHN0ZXN0cnVubmVyLWF4dCBcCiAgICAgdWItdWlhdXRvbWF0b3IKIAotTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lcgorTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lci5zdHVicwogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNCYWNrZ3JvdW5kUmVzdHJpY3Rpb25zVGVzdENhc2VzCiAKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cworTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGN0c19pbnN0YW50CiAKIExPQ0FMX1NES19WRVJTSU9OIDo9IHRlc3RfY3VycmVudAogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9iYWNrZ3JvdW5kL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy90ZXN0cy9iYWNrZ3JvdW5kL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggOGRiOGYwNS4uZjQyZGE3NiAxMDA3NTUKLS0tIGEvdGVzdHMvdGVzdHMvYmFja2dyb3VuZC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL2JhY2tncm91bmQvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMTQsNyArMTQsOCBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBwYWNrYWdlPSJhbmRyb2lkLmFwcC5jdHMuYmFja2dyb3VuZHJlc3RyaWN0aW9ucyI+CisgICAgcGFja2FnZT0iYW5kcm9pZC5hcHAuY3RzLmJhY2tncm91bmRyZXN0cmljdGlvbnMiCisgICAgYW5kcm9pZDp0YXJnZXRTYW5kYm94VmVyc2lvbj0iMiI+CiAKICAgICA8YXBwbGljYXRpb24+CiAgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgpAQCAtMjMsNyArMjQsNyBAQAogCiAgICAgPC9hcHBsaWNhdGlvbj4KIAotICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5hcHAuY3RzLmJhY2tncm91bmRyZXN0cmljdGlvbnMiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBmb3IgYmFja2dyb3VuZCByZXN0cmljdGlvbnMiPgogICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0ibGlzdGVuZXIiCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9iYWNrZ3JvdW5kL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL2JhY2tncm91bmQvQW5kcm9pZFRlc3QueG1sCmluZGV4IDMzZTIwZWEuLmM1NDk0MGMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2JhY2tncm91bmQvQW5kcm9pZFRlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL2JhY2tncm91bmQvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBiYWNrZ3JvdW5kIHJlc3RyaWN0aW9ucyBDVFMgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImZyYW1ld29yayIgLz4KICAgICA8b3B0aW9uIG5hbWU9Im5vdC1zaGFyZGFibGUiIHZhbHVlPSJ0cnVlIiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvYmFja2dyb3VuZC9zcmMvYW5kcm9pZC9hcHAvY3RzL2JhY2tncm91bmRyZXN0cmljdGlvbnMvQnJvYWRjYXN0c1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2JhY2tncm91bmQvc3JjL2FuZHJvaWQvYXBwL2N0cy9iYWNrZ3JvdW5kcmVzdHJpY3Rpb25zL0Jyb2FkY2FzdHNUZXN0LmphdmEKaW5kZXggMWEwMzNmNy4uYTk1MWZjMCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvYmFja2dyb3VuZC9zcmMvYW5kcm9pZC9hcHAvY3RzL2JhY2tncm91bmRyZXN0cmljdGlvbnMvQnJvYWRjYXN0c1Rlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9iYWNrZ3JvdW5kL3NyYy9hbmRyb2lkL2FwcC9jdHMvYmFja2dyb3VuZHJlc3RyaWN0aW9ucy9Ccm9hZGNhc3RzVGVzdC5qYXZhCkBAIC0yMywxMiArMjMsMTUgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlN5c3RlbVV0aWw7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5BbVV0aWxzOwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ2RkVGVzdDsKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlN5c3RlbVV0aWw7CiAKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CkBAIC04MSw2ICs4NCw3IEBACiAgICAgICogTWFrZSBzdXJlICJjb20uYW5kcm9pZC5sYXVuY2hlci5hY3Rpb24uSU5TVEFMTF9TSE9SVENVVCIgd29uJ3QgYmUgZGVsaXZlcmVkIHRvIGEgbWFuaWZlc3QKICAgICAgKiByZWNlaXZlciwgZXZlbiBpZiBhbiBpbnRlbnQgaXMgdGFyZ2V0ZWQgdG8gdGhlIGNvbXBvbmVudC4KICAgICAgKi8KKyAgICBAQXBwTW9kZUZ1bGwocmVhc29uID0gIkluc3RhbnQgYXBwcyBkb24ndCBnZXQgdG8gcnVuIGluIHRoZSBiYWNrZ3JvdW5kLiIpCiAgICAgQFRlc3QKICAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iMy41L0MtMC02LDMuMi4zLjQvQy0wLTEiKQogICAgIHB1YmxpYyB2b2lkIHRlc3ROb25TdXBwb3J0ZWRCcm9hZGNhc3RzTm90RGVsaXZlcmVkX21hbmlmZXN0UmVjZWl2ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTk5LDcgKzEwMywxMCBAQAogICAgICAgICAgICAgQmlDb25zdW1lcjxJbnRlbnRGaWx0ZXIsIENvbnN1bWVyPEludGVudD4+IHJlY2VpdmVySW5pdGlhbGl6ZXIsCiAgICAgICAgICAgICBDb25zdW1lcjxJbnRlbnQ+IGludGVudEluaXRpYWxpemVyLAogICAgICAgICAgICAgUnVubmFibGUgcmVjZWl2ZXJEZWluaXRpYWxpemVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gVGhpcyBicm9hZGNhc3Qgc2hvdWxkIGJlIGRlbGl2ZXJlZC4KKworICAgICAgICBBbVV0aWxzLndhaXRGb3JCcm9hZGNhc3RJZGxlKCk7CisKKyAgICAgICAgLy8gVGhpcyBicm9hZGNhc3Qgc2hvdWxkIG5vdCBiZSBkZWxpdmVyZWQuCiAgICAgICAgIGZpbmFsIFN0cmluZ1tdIFVOU1VQUE9SVEVEX0JST0FEQ0FTVFMgPSBuZXcgU3RyaW5nW117CiAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmxhdW5jaGVyLmFjdGlvbi5JTlNUQUxMX1NIT1JUQ1VUIiwKICAgICAgICAgfTsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2JhY2tncm91bmQvc3JjL2FuZHJvaWQvYXBwL2N0cy9iYWNrZ3JvdW5kcmVzdHJpY3Rpb25zL015UmVjZWl2ZXIuamF2YSBiL3Rlc3RzL3Rlc3RzL2JhY2tncm91bmQvc3JjL2FuZHJvaWQvYXBwL2N0cy9iYWNrZ3JvdW5kcmVzdHJpY3Rpb25zL015UmVjZWl2ZXIuamF2YQppbmRleCBjYjA1YTAwLi4yMTcwMWVkIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9iYWNrZ3JvdW5kL3NyYy9hbmRyb2lkL2FwcC9jdHMvYmFja2dyb3VuZHJlc3RyaWN0aW9ucy9NeVJlY2VpdmVyLmphdmEKKysrIGIvdGVzdHMvdGVzdHMvYmFja2dyb3VuZC9zcmMvYW5kcm9pZC9hcHAvY3RzL2JhY2tncm91bmRyZXN0cmljdGlvbnMvTXlSZWNlaXZlci5qYXZhCkBAIC0xOSw3ICsxOSw4IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CiAKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljUmVmZXJlbmNlOwogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2JhdHRlcnlzYXZpbmcvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL2JhdHRlcnlzYXZpbmcvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zZGQyZmJmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvYmF0dGVyeXNhdmluZy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNDQgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKKworTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKKyAgICBCYXR0ZXJ5U2F2aW5nQ3RzQ29tbW9uIFwKKyAgICBhbmRyb2lkeC50ZXN0LnJ1bGVzIFwKKyAgICBhbmRyb2lkeC5sZWdhY3lfbGVnYWN5LXN1cHBvcnQtdjQgXAorICAgIG1vY2tpdG8tdGFyZ2V0LW1pbnVzLWp1bml0NCBcCisgICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgXAorICAgIGN0c3Rlc3RydW5uZXItYXh0IFwKKyAgICB1Yi11aWF1dG9tYXRvcgorCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzIGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0JhdHRlcnlTYXZpbmdUZXN0Q2FzZXMKKworTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKKworTE9DQUxfU0RLX1ZFUlNJT04gOj0gdGVzdF9jdXJyZW50CisKK2luY2x1ZGUgJChCVUlMRF9DVFNfUEFDS0FHRSkKKworaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvYmF0dGVyeXNhdmluZy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdGVzdHMvYmF0dGVyeXNhdmluZy9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNlNDA2MmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9iYXR0ZXJ5c2F2aW5nL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwzMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iYW5kcm9pZC5vcy5jdHMuYmF0dGVyeXNhdmluZyI+CisKKyAgICA8YXBwbGljYXRpb24+CisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgorICAgIDwvYXBwbGljYXRpb24+CisKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQub3MuY3RzLmJhdHRlcnlzYXZpbmciCisgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBmb3IgYmF0dGVyeSBzYXZpbmcgZmVhdHVyZXMiPgorICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0ibGlzdGVuZXIiCisgICAgICAgICAgICBhbmRyb2lkOnZhbHVlPSJjb20uYW5kcm9pZC5jdHMucnVubmVyLkN0c1Rlc3RSdW5MaXN0ZW5lciIgLz4KKyAgICA8L2luc3RydW1lbnRhdGlvbj4KKworPC9tYW5pZmVzdD4KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvYmF0dGVyeXNhdmluZy9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy90ZXN0cy9iYXR0ZXJ5c2F2aW5nL0FuZHJvaWRUZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTRjNjFmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvYmF0dGVyeXNhdmluZy9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSw0MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIFNob3J0Y3V0TWFuYWdlciBDVFMgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KKyAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImZyYW1ld29yayIgLz4KKworICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuUnVuQ29tbWFuZFRhcmdldFByZXBhcmVyIj4KKyAgICAgICAgPCEtLSBEaXNhYmxlIGtleWd1YXJkIC0tPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bi1jb21tYW5kIiB2YWx1ZT0ibG9ja3NldHRpbmdzIHNldC1kaXNhYmxlZCB0cnVlIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorCisKKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPiA8IS0tIERPIE5PVCBTVUJNSVQgV0lUSCBGQUxTRSAtLT4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0JhdHRlcnlTYXZpbmdUZXN0Q2FzZXMuYXBrIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzQmF0dGVyeVNhdmluZ0FwcFRhcmdldEFwaUN1cnJlbnQuYXBrIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzQmF0dGVyeVNhdmluZ0FwcFRhcmdldEFwaTI1LmFwayIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKworICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuUnVuQ29tbWFuZFRhcmdldFByZXBhcmVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJydW4tY29tbWFuZCIgdmFsdWU9ImFtIHNldC1zdGFuZGJ5LWJ1Y2tldCBhbmRyb2lkLm9zLmN0cy5iYXR0ZXJ5c2F2aW5nLmFwcF90YXJnZXRfYXBpXzI1ICAgICAgMTAiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVuLWNvbW1hbmQiIHZhbHVlPSJhbSBzZXQtc3RhbmRieS1idWNrZXQgYW5kcm9pZC5vcy5jdHMuYmF0dGVyeXNhdmluZy5hcHBfdGFyZ2V0X2FwaV9jdXJyZW50IDEwIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorCisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkFuZHJvaWRKVW5pdFRlc3QiID4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwYWNrYWdlIiB2YWx1ZT0iYW5kcm9pZC5vcy5jdHMuYmF0dGVyeXNhdmluZyIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJydW50aW1lLWhpbnQiIHZhbHVlPSIxMG0wMHMiIC8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvYmF0dGVyeXNhdmluZy9hcHBzL0FuZHJvaWQubWsgYi90ZXN0cy90ZXN0cy9iYXR0ZXJ5c2F2aW5nL2FwcHMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWFhNmFjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvYmF0dGVyeXNhdmluZy9hcHBzL0FuZHJvaWQubWsKQEAgLTAsMCArMSwxNyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2JhdHRlcnlzYXZpbmcvYXBwcy9hcHBfdGFyZ2V0X2FwaV8yNS9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvYmF0dGVyeXNhdmluZy9hcHBzL2FwcF90YXJnZXRfYXBpXzI1L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkyNDZhMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2JhdHRlcnlzYXZpbmcvYXBwcy9hcHBfdGFyZ2V0X2FwaV8yNS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNDAgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0JhdHRlcnlTYXZpbmdBcHBUYXJnZXRBcGkyNQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCAuLi9hcHBfdGFyZ2V0X2FwaV9jdXJyZW50L3NyYykKKworTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKKyAgICBCYXR0ZXJ5U2F2aW5nQ3RzQ29tbW9uIFwKKyAgICBhbmRyb2lkeC50ZXN0LnJ1bGVzIFwKKyAgICBhbmRyb2lkeC5sZWdhY3lfbGVnYWN5LXN1cHBvcnQtdjQgXAorICAgIG1vY2tpdG8tdGFyZ2V0LW1pbnVzLWp1bml0NCBcCisgICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgXAorICAgIHViLXVpYXV0b21hdG9yCisKK0xPQ0FMX1NES19WRVJTSU9OIDo9IHRlc3RfY3VycmVudAorCisjIHRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0CitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworCitpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9iYXR0ZXJ5c2F2aW5nL2FwcHMvYXBwX3RhcmdldF9hcGlfMjUvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL2JhdHRlcnlzYXZpbmcvYXBwcy9hcHBfdGFyZ2V0X2FwaV8yNS9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY4NDIxMDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9iYXR0ZXJ5c2F2aW5nL2FwcHMvYXBwX3RhcmdldF9hcGlfMjUvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDM2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJhbmRyb2lkLm9zLmN0cy5iYXR0ZXJ5c2F2aW5nLmFwcF90YXJnZXRfYXBpXzI1Ij4KKworICAgIDx1c2VzLXNkayBhbmRyb2lkOm1pblNka1ZlcnNpb249IjIzIiBhbmRyb2lkOnRhcmdldFNka1ZlcnNpb249IjI1IiAvPgorCisgICAgPCEtLSBLZWVwIHRoaXMgc2VjdGlvbiBpbiBzeW5jIHdpdGggdGhlIG90aGVyIGFwcCBtYW5pZmVzdChzKSAtLT4KKyAgICA8YXBwbGljYXRpb24+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQub3MuY3RzLmJhdHRlcnlzYXZpbmcuYXBwLlRlc3RBY3Rpdml0eSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZW5hYmxlZD0idHJ1ZSIgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPHJlY2VpdmVyIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5vcy5jdHMuYmF0dGVyeXNhdmluZy5hcHAuQ29tbVJlY2VpdmVyIgorICAgICAgICAgICAgYW5kcm9pZDplbmFibGVkPSJ0cnVlIiBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIj4KKyAgICAgICAgPC9yZWNlaXZlcj4KKworICAgICAgICA8c2VydmljZSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQub3MuY3RzLmJhdHRlcnlzYXZpbmcuYXBwLlRlc3RTZXJ2aWNlIgorICAgICAgICAgICAgYW5kcm9pZDplbmFibGVkPSJ0cnVlIiBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIj4KKyAgICAgICAgPC9zZXJ2aWNlPgorICAgIDwvYXBwbGljYXRpb24+Cis8L21hbmlmZXN0PgorCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9iYXR0ZXJ5c2F2aW5nL2FwcHMvYXBwX3RhcmdldF9hcGlfY3VycmVudC9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvYmF0dGVyeXNhdmluZy9hcHBzL2FwcF90YXJnZXRfYXBpX2N1cnJlbnQvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTdjZTNiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvYmF0dGVyeXNhdmluZy9hcHBzL2FwcF90YXJnZXRfYXBpX2N1cnJlbnQvQW5kcm9pZC5tawpAQCAtMCwwICsxLDQwIEBACisjIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNCYXR0ZXJ5U2F2aW5nQXBwVGFyZ2V0QXBpQ3VycmVudAorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCisKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCisgICAgQmF0dGVyeVNhdmluZ0N0c0NvbW1vbiBcCisgICAgYW5kcm9pZHgudGVzdC5ydWxlcyBcCisgICAgYW5kcm9pZHgubGVnYWN5X2xlZ2FjeS1zdXBwb3J0LXY0IFwKKyAgICBtb2NraXRvLXRhcmdldC1taW51cy1qdW5pdDQgXAorICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0IFwKKyAgICB1Yi11aWF1dG9tYXRvcgorCitMT0NBTF9TREtfVkVSU0lPTiA6PSB0ZXN0X2N1cnJlbnQKKworIyB0YWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKKworaW5jbHVkZSAkKEJVSUxEX0NUU19QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvYmF0dGVyeXNhdmluZy9hcHBzL2FwcF90YXJnZXRfYXBpX2N1cnJlbnQvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL2JhdHRlcnlzYXZpbmcvYXBwcy9hcHBfdGFyZ2V0X2FwaV9jdXJyZW50L0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTRiM2EzMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2JhdHRlcnlzYXZpbmcvYXBwcy9hcHBfdGFyZ2V0X2FwaV9jdXJyZW50L0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwzNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iYW5kcm9pZC5vcy5jdHMuYmF0dGVyeXNhdmluZy5hcHBfdGFyZ2V0X2FwaV9jdXJyZW50Ij4KKworICAgIDwhLS0gS2VlcCB0aGlzIHNlY3Rpb24gaW4gc3luYyB3aXRoIHRoZSBvdGhlciBhcHAgbWFuaWZlc3QocykgLS0+CisgICAgPGFwcGxpY2F0aW9uPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLm9zLmN0cy5iYXR0ZXJ5c2F2aW5nLmFwcC5UZXN0QWN0aXZpdHkiCisgICAgICAgICAgICBhbmRyb2lkOmVuYWJsZWQ9InRydWUiIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxyZWNlaXZlciBhbmRyb2lkOm5hbWU9ImFuZHJvaWQub3MuY3RzLmJhdHRlcnlzYXZpbmcuYXBwLkNvbW1SZWNlaXZlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZW5hYmxlZD0idHJ1ZSIgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSI+CisgICAgICAgIDwvcmVjZWl2ZXI+CisKKyAgICAgICAgPHNlcnZpY2UgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLm9zLmN0cy5iYXR0ZXJ5c2F2aW5nLmFwcC5UZXN0U2VydmljZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZW5hYmxlZD0idHJ1ZSIgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSI+CisgICAgICAgIDwvc2VydmljZT4KKyAgICA8L2FwcGxpY2F0aW9uPgorPC9tYW5pZmVzdD4KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvYmF0dGVyeXNhdmluZy9hcHBzL2FwcF90YXJnZXRfYXBpX2N1cnJlbnQvc3JjL2FuZHJvaWQvb3MvY3RzL2JhdHRlcnlzYXZpbmcvYXBwL0NvbW1SZWNlaXZlci5qYXZhIGIvdGVzdHMvdGVzdHMvYmF0dGVyeXNhdmluZy9hcHBzL2FwcF90YXJnZXRfYXBpX2N1cnJlbnQvc3JjL2FuZHJvaWQvb3MvY3RzL2JhdHRlcnlzYXZpbmcvYXBwL0NvbW1SZWNlaXZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMDliNjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9iYXR0ZXJ5c2F2aW5nL2FwcHMvYXBwX3RhcmdldF9hcGlfY3VycmVudC9zcmMvYW5kcm9pZC9vcy9jdHMvYmF0dGVyeXNhdmluZy9hcHAvQ29tbVJlY2VpdmVyLmphdmEKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLm9zLmN0cy5iYXR0ZXJ5c2F2aW5nLmFwcDsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm9zLmN0cy5iYXR0ZXJ5c2F2aW5nLmNvbW1vbi5WYWx1ZXMuS0VZX1JFUVVFU1RfRk9SRUdST1VORDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5vcy5jdHMuYmF0dGVyeXNhdmluZy5jb21tb24uVmFsdWVzLmdldFRlc3RTZXJ2aWNlOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWxhcm1NYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLmN0cy5iYXR0ZXJ5c2F2aW5nLmNvbW1vbi5CYXR0ZXJ5U2F2aW5nQ3RzQ29tbW9uLlBheWxvYWQ7CitpbXBvcnQgYW5kcm9pZC5vcy5jdHMuYmF0dGVyeXNhdmluZy5jb21tb24uQmF0dGVyeVNhdmluZ0N0c0NvbW1vbi5QYXlsb2FkLlRlc3RTZXJ2aWNlUmVxdWVzdC5TZXRBbGFybVJlcXVlc3Q7CitpbXBvcnQgYW5kcm9pZC5vcy5jdHMuYmF0dGVyeXNhdmluZy5jb21tb24uQmF0dGVyeVNhdmluZ0N0c0NvbW1vbi5QYXlsb2FkLlRlc3RTZXJ2aWNlUmVzcG9uc2U7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQnJvYWRjYXN0UnBjQmFzZTsKKworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uOworCitwdWJsaWMgY2xhc3MgQ29tbVJlY2VpdmVyIGV4dGVuZHMgQnJvYWRjYXN0UnBjQmFzZS5SZWNlaXZlckJhc2U8UGF5bG9hZCwgUGF5bG9hZD4geworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQ29tbVJlY2VpdmVyIjsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBQYXlsb2FkIGhhbmRsZVJlcXVlc3QoQ29udGV4dCBjb250ZXh0LCBQYXlsb2FkIHJlcXVlc3QpIHsKKyAgICAgICAgZmluYWwgUGF5bG9hZC5CdWlsZGVyIHJlc3BvbnNlQnVpbGRlciA9IFBheWxvYWQubmV3QnVpbGRlcigpOworICAgICAgICBpZiAocmVxdWVzdC5oYXNUZXN0U2VydmljZVJlcXVlc3QoKSkgeworICAgICAgICAgICAgaGFuZGxlQmF0dGVyeVNhdmVyQmdTZXJ2aWNlUmVxdWVzdChjb250ZXh0LCByZXF1ZXN0LCByZXNwb25zZUJ1aWxkZXIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXNwb25zZUJ1aWxkZXIuYnVpbGQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaGFuZGxlQmF0dGVyeVNhdmVyQmdTZXJ2aWNlUmVxdWVzdChDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICBQYXlsb2FkIHJlcXVlc3QsIFBheWxvYWQuQnVpbGRlciByZXNwb25zZUJ1aWxkZXIpIHsKKyAgICAgICAgZmluYWwgVGVzdFNlcnZpY2VSZXNwb25zZS5CdWlsZGVyIHJiID0gVGVzdFNlcnZpY2VSZXNwb25zZS5uZXdCdWlsZGVyKCk7CisKKyAgICAgICAgaWYgKHJlcXVlc3QuZ2V0VGVzdFNlcnZpY2VSZXF1ZXN0KCkuZ2V0Q2xlYXJMYXN0SW50ZW50KCkpIHsKKyAgICAgICAgICAgIC8vIFJlcXVlc3QgdG8gY2xlYXIgdGhlIGxhc3QgaW50ZW50IHRvIFRlc3RTZXJ2aWNlLgorCisgICAgICAgICAgICBUZXN0U2VydmljZS5MYXN0U3RhcnRJbnRlbnQuc2V0KG51bGwpOworICAgICAgICAgICAgcmIuc2V0Q2xlYXJMYXN0SW50ZW50QWNrKHRydWUpOworCisgICAgICAgIH0gZWxzZSBpZiAocmVxdWVzdC5nZXRUZXN0U2VydmljZVJlcXVlc3QoKS5nZXRHZXRMYXN0SW50ZW50KCkpIHsKKyAgICAgICAgICAgIC8vIFJlcXVlc3QgdG8gcmV0dXJuIHRoZSBsYXN0IGludGVudCBhY3Rpb24gdGhhdCBzdGFydGVkIFRlc3RTZXJ2aWNlLgorCisgICAgICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gVGVzdFNlcnZpY2UuTGFzdFN0YXJ0SW50ZW50LmdldCgpOworICAgICAgICAgICAgaWYgKGludGVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmIuc2V0R2V0TGFzdEludGVudEFjdGlvbihpbnRlbnQuZ2V0QWN0aW9uKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSBpZiAocmVxdWVzdC5nZXRUZXN0U2VydmljZVJlcXVlc3QoKS5oYXNTdGFydFNlcnZpY2UoKSkgeworICAgICAgICAgICAgLy8gUmVxdWVzdCB0byBzdGFydCBUZXN0U2VydmljZSB3aXRoIGEgZ2l2ZW4gYWN0aW9uLgorCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYWN0aW9uID0gcmVxdWVzdC5nZXRUZXN0U2VydmljZVJlcXVlc3QoKS5nZXRTdGFydFNlcnZpY2UoKS5nZXRBY3Rpb24oKTsKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gZmcgPSByZXF1ZXN0LmdldFRlc3RTZXJ2aWNlUmVxdWVzdCgpLmdldFN0YXJ0U2VydmljZSgpLmdldEZvcmVncm91bmQoKTsKKworICAgICAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoYWN0aW9uKQorICAgICAgICAgICAgICAgICAgICAuc2V0Q29tcG9uZW50KGdldFRlc3RTZXJ2aWNlKGNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSkpCisgICAgICAgICAgICAgICAgICAgIC5wdXRFeHRyYShLRVlfUkVRVUVTVF9GT1JFR1JPVU5ELCBmZyk7CisKKyAgICAgICAgICAgIExvZy5kKFRBRywgIlN0YXJ0aW5nIHNlcnZpY2UgIiArIGludGVudCk7CisKKyAgICAgICAgICAgIGlmIChmZykgeworICAgICAgICAgICAgICAgIGNvbnRleHQuc3RhcnRGb3JlZ3JvdW5kU2VydmljZShpbnRlbnQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LnN0YXJ0U2VydmljZShpbnRlbnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmIuc2V0U3RhcnRTZXJ2aWNlQWNrKHRydWUpOworCisgICAgICAgIH0gZWxzZSBpZiAocmVxdWVzdC5nZXRUZXN0U2VydmljZVJlcXVlc3QoKS5oYXNTZXRBbGFybSgpKSB7CisgICAgICAgICAgICAvLyBTZXQgYW4gYWxhcm0gd2l0aCBhIGdpdmVuIGludGVudC4KKworICAgICAgICAgICAgZmluYWwgU2V0QWxhcm1SZXF1ZXN0IHJlcSA9IHJlcXVlc3QuZ2V0VGVzdFNlcnZpY2VSZXF1ZXN0KCkuZ2V0U2V0QWxhcm0oKTsKKworICAgICAgICAgICAgZmluYWwgQWxhcm1NYW5hZ2VyIGFtID0gY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKEFsYXJtTWFuYWdlci5jbGFzcyk7CisKKyAgICAgICAgICAgIGZpbmFsIGludCB0eXBlID0gcmVxLmdldFR5cGUoKTsKKyAgICAgICAgICAgIGZpbmFsIGxvbmcgdHJpZ2dlclRpbWUgPSByZXEuZ2V0VHJpZ2dlclRpbWUoKTsKKyAgICAgICAgICAgIGZpbmFsIGxvbmcgaW50ZXJ2YWwgPSByZXEuZ2V0UmVwZWF0SW50ZXJ2YWwoKTsKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYWxsb3dXaGlsZUlkbGUgPSByZXEuZ2V0QWxsb3dXaGlsZUlkbGUoKTsKKworICAgICAgICAgICAgZmluYWwgUGVuZGluZ0ludGVudCBhbGFybVNlbmRlciA9IFBlbmRpbmdJbnRlbnQuZ2V0QnJvYWRjYXN0KGNvbnRleHQsIDEsCisgICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlbnQocmVxLmdldEludGVudEFjdGlvbigpKSwgMCk7CisKKyAgICAgICAgICAgIExvZy5kKFRBRywgIlNldHRpbmcgYWxhcm06IHR5cGU9IiArIHR5cGUgKyAiLCB0cmlnZ2VyVGltZT0iICsgdHJpZ2dlclRpbWUKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBpbnRlcnZhbD0iICsgaW50ZXJ2YWwgKyAiLCBhbGxvd1doaWxlSWRsZT0iICsgYWxsb3dXaGlsZUlkbGUpOworICAgICAgICAgICAgaWYgKGludGVydmFsID4gMCkgeworICAgICAgICAgICAgICAgIGFtLnNldFJlcGVhdGluZyh0eXBlLCB0cmlnZ2VyVGltZSwgaW50ZXJ2YWwsIGFsYXJtU2VuZGVyKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYWxsb3dXaGlsZUlkbGUpIHsKKyAgICAgICAgICAgICAgICBhbS5zZXRFeGFjdEFuZEFsbG93V2hpbGVJZGxlKHR5cGUsIHRyaWdnZXJUaW1lLCBhbGFybVNlbmRlcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFtLnNldEV4YWN0KHR5cGUsIHRyaWdnZXJUaW1lLCBhbGFybVNlbmRlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByYi5zZXRTZXRBbGFybUFjayh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3BvbnNlQnVpbGRlci5zZXRUZXN0U2VydmljZVJlc3BvbnNlKHJiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgYnl0ZVtdIHJlc3BvbnNlVG9CeXRlcyhQYXlsb2FkIHBheWxvYWQpIHsKKyAgICAgICAgcmV0dXJuIHBheWxvYWQudG9CeXRlQXJyYXkoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUGF5bG9hZCBieXRlc1RvUmVxdWVzdChieXRlW10gYnl0ZXMpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBQYXlsb2FkLnBhcnNlRnJvbShieXRlcyk7CisgICAgICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIiwgZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9iYXR0ZXJ5c2F2aW5nL2FwcHMvYXBwX3RhcmdldF9hcGlfY3VycmVudC9zcmMvYW5kcm9pZC9vcy9jdHMvYmF0dGVyeXNhdmluZy9hcHAvVGVzdEFjdGl2aXR5LmphdmEgYi90ZXN0cy90ZXN0cy9iYXR0ZXJ5c2F2aW5nL2FwcHMvYXBwX3RhcmdldF9hcGlfY3VycmVudC9zcmMvYW5kcm9pZC9vcy9jdHMvYmF0dGVyeXNhdmluZy9hcHAvVGVzdEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QyNTUyNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2JhdHRlcnlzYXZpbmcvYXBwcy9hcHBfdGFyZ2V0X2FwaV9jdXJyZW50L3NyYy9hbmRyb2lkL29zL2N0cy9iYXR0ZXJ5c2F2aW5nL2FwcC9UZXN0QWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5vcy5jdHMuYmF0dGVyeXNhdmluZy5hcHA7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKKworcHVibGljIGNsYXNzIFRlc3RBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2JhdHRlcnlzYXZpbmcvYXBwcy9hcHBfdGFyZ2V0X2FwaV9jdXJyZW50L3NyYy9hbmRyb2lkL29zL2N0cy9iYXR0ZXJ5c2F2aW5nL2FwcC9UZXN0U2VydmljZS5qYXZhIGIvdGVzdHMvdGVzdHMvYmF0dGVyeXNhdmluZy9hcHBzL2FwcF90YXJnZXRfYXBpX2N1cnJlbnQvc3JjL2FuZHJvaWQvb3MvY3RzL2JhdHRlcnlzYXZpbmcvYXBwL1Rlc3RTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTljNDY4MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2JhdHRlcnlzYXZpbmcvYXBwcy9hcHBfdGFyZ2V0X2FwaV9jdXJyZW50L3NyYy9hbmRyb2lkL29zL2N0cy9iYXR0ZXJ5c2F2aW5nL2FwcC9UZXN0U2VydmljZS5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLm9zLmN0cy5iYXR0ZXJ5c2F2aW5nLmFwcDsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm9zLmN0cy5iYXR0ZXJ5c2F2aW5nLmNvbW1vbi5WYWx1ZXMuS0VZX1JFUVVFU1RfRk9SRUdST1VORDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb25DaGFubmVsOworaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbk1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5hcHAuU2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY1JlZmVyZW5jZTsKKworcHVibGljIGNsYXNzIFRlc3RTZXJ2aWNlIGV4dGVuZHMgU2VydmljZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJUZXN0U2VydmljZSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEF0b21pY1JlZmVyZW5jZTxJbnRlbnQ+IExhc3RTdGFydEludGVudCA9IG5ldyBBdG9taWNSZWZlcmVuY2UoKTsKKworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGdldE5vdGlmaWNhdGlvbkNoYW5uZWxJZCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnROYW1lKHRoaXMsIFRlc3RTZXJ2aWNlLmNsYXNzKS50b1Nob3J0U3RyaW5nKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBvblN0YXJ0Q29tbWFuZChJbnRlbnQgaW50ZW50LCBpbnQgZmxhZ3MsIGludCBzdGFydElkKSB7CisKKyAgICAgICAgTG9nLmQoVEFHLCAiVGVzdFNlcnZpY2UuVGVzdFNlcnZpY2U6IGludGVudD0iICsgaW50ZW50KTsKKworICAgICAgICBpZiAoaW50ZW50LmdldEJvb2xlYW5FeHRyYShLRVlfUkVRVUVTVF9GT1JFR1JPVU5ELCBmYWxzZSkpIHsKKyAgICAgICAgICAgIE5vdGlmaWNhdGlvbk1hbmFnZXIgbm90aWZpY2F0aW9uTWFuYWdlciA9IGdldFN5c3RlbVNlcnZpY2UoTm90aWZpY2F0aW9uTWFuYWdlci5jbGFzcyk7CisgICAgICAgICAgICBub3RpZmljYXRpb25NYW5hZ2VyLmNyZWF0ZU5vdGlmaWNhdGlvbkNoYW5uZWwobmV3IE5vdGlmaWNhdGlvbkNoYW5uZWwoCisgICAgICAgICAgICAgICAgICAgIGdldE5vdGlmaWNhdGlvbkNoYW5uZWxJZCgpLCBnZXROb3RpZmljYXRpb25DaGFubmVsSWQoKSwKKyAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uTWFuYWdlci5JTVBPUlRBTkNFX0RFRkFVTFQpKTsKKyAgICAgICAgICAgIE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24gPQorICAgICAgICAgICAgICAgICAgICBuZXcgTm90aWZpY2F0aW9uLkJ1aWxkZXIoZ2V0QXBwbGljYXRpb25Db250ZXh0KCksIGdldE5vdGlmaWNhdGlvbkNoYW5uZWxJZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50VGl0bGUoIkZnU2VydmljZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFNtYWxsSWNvbihhbmRyb2lkLlIuZHJhd2FibGUuaWNfcG9wdXBfc3luYykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgICAgICAgICAgc3RhcnRGb3JlZ3JvdW5kKDEsIG5vdGlmaWNhdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBMYXN0U3RhcnRJbnRlbnQuc2V0KGludGVudCk7CisKKyAgICAgICAgc3RvcFNlbGYoKTsKKworICAgICAgICByZXR1cm4gU1RBUlRfTk9UX1NUSUNLWTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSUJpbmRlciBvbkJpbmQoSW50ZW50IGludGVudCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9iYXR0ZXJ5c2F2aW5nL2NvbW1vbi9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvYmF0dGVyeXNhdmluZy9jb21tb24vQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzI4NDYxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvYmF0dGVyeXNhdmluZy9jb21tb24vQW5kcm9pZC5tawpAQCAtMCwwICsxLDM2IEBACisjIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpIFwKKyAgICAkKGNhbGwgYWxsLXByb3RvLWZpbGVzLXVuZGVyLCBwcm90bykKKworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gXAorICAgIGFuZHJvaWR4LnRlc3QucnVsZXMgXAorICAgIGFuZHJvaWR4LmxlZ2FjeV9sZWdhY3ktc3VwcG9ydC12NCBcCisgICAgbW9ja2l0by10YXJnZXQgXAorICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0IFwKKyAgICBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX01PRFVMRSA6PSBCYXR0ZXJ5U2F2aW5nQ3RzQ29tbW9uCisKK0xPQ0FMX1NES19WRVJTSU9OIDo9IHRlc3RfY3VycmVudAorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0pBVkFfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2JhdHRlcnlzYXZpbmcvY29tbW9uL3Byb3RvL2JhdHRlcnlfc2F2ZXJfY3RzX2NvbW1vbi5wcm90byBiL3Rlc3RzL3Rlc3RzL2JhdHRlcnlzYXZpbmcvY29tbW9uL3Byb3RvL2JhdHRlcnlfc2F2ZXJfY3RzX2NvbW1vbi5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTUxODRiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvYmF0dGVyeXNhdmluZy9jb21tb24vcHJvdG8vYmF0dGVyeV9zYXZlcl9jdHNfY29tbW9uLnByb3RvCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworc3ludGF4ID0gInByb3RvMiI7CisKK29wdGlvbiBqYXZhX291dGVyX2NsYXNzbmFtZSA9ICJCYXR0ZXJ5U2F2aW5nQ3RzQ29tbW9uIjsKKworcGFja2FnZSBhbmRyb2lkLm9zLmN0cy5iYXR0ZXJ5c2F2aW5nLmNvbW1vbjsKKworbWVzc2FnZSBQYXlsb2FkIHsKKyAgICBtZXNzYWdlIFRlc3RTZXJ2aWNlUmVxdWVzdCB7CisgICAgICAgIC8vIFJlcXVlc3QgdG8gY2xlYXIgVGVzdFNlcnZpY2UuTGFzdFN0YXJ0SW50ZW50LgorICAgICAgICBvcHRpb25hbCBib29sIGNsZWFyX2xhc3RfaW50ZW50ID0gMTsKKworICAgICAgICAvLyBSZXF1ZXN0IHRvIHJldHVybiB0aGUgYWN0aW9uIHNldCBpbiBUZXN0U2VydmljZS5MYXN0U3RhcnRJbnRlbnQuCisgICAgICAgIG9wdGlvbmFsIGJvb2wgZ2V0X2xhc3RfaW50ZW50ID0gMjsKKworICAgICAgICAvLyBSZXF1ZXN0IHRvIHN0YXJ0IHRlc3RTZXJ2aWNlLgorICAgICAgICBtZXNzYWdlIFN0YXJ0U2VydmljZVJlcXVlc3QgeworICAgICAgICAgICAgb3B0aW9uYWwgYm9vbCBmb3JlZ3JvdW5kID0gMTsKKyAgICAgICAgICAgIG9wdGlvbmFsIHN0cmluZyBhY3Rpb24gPSAyOworICAgICAgICB9CisKKyAgICAgICAgb3B0aW9uYWwgU3RhcnRTZXJ2aWNlUmVxdWVzdCBzdGFydF9zZXJ2aWNlID0gMzsKKworICAgICAgICBtZXNzYWdlIFNldEFsYXJtUmVxdWVzdCB7CisgICAgICAgICAgICBvcHRpb25hbCBpbnQzMiB0eXBlID0gMTsKKyAgICAgICAgICAgIG9wdGlvbmFsIGludDY0IHRyaWdnZXJfdGltZSA9IDI7CisgICAgICAgICAgICBvcHRpb25hbCBpbnQ2NCByZXBlYXRfaW50ZXJ2YWwgPSAzOworICAgICAgICAgICAgb3B0aW9uYWwgYm9vbCBhbGxvd193aGlsZV9pZGxlID0gNDsKKyAgICAgICAgICAgIG9wdGlvbmFsIHN0cmluZyBpbnRlbnRfYWN0aW9uID0gNTsKKyAgICAgICAgfQorICAgICAgICBvcHRpb25hbCBTZXRBbGFybVJlcXVlc3Qgc2V0X2FsYXJtID0gNDsKKyAgICB9CisKKyAgICBvcHRpb25hbCBUZXN0U2VydmljZVJlcXVlc3QgdGVzdF9zZXJ2aWNlX3JlcXVlc3QgPSAxOworCisgICAgbWVzc2FnZSBUZXN0U2VydmljZVJlc3BvbnNlIHsKKyAgICAgICAgb3B0aW9uYWwgYm9vbCBjbGVhcl9sYXN0X2ludGVudF9hY2sgPSAxOworICAgICAgICBvcHRpb25hbCBzdHJpbmcgZ2V0X2xhc3RfaW50ZW50X2FjdGlvbiA9IDI7CisgICAgICAgIG9wdGlvbmFsIGJvb2wgc3RhcnRfc2VydmljZV9hY2sgPSAzOworICAgICAgICBvcHRpb25hbCBib29sIHNldF9hbGFybV9hY2sgPSA0OworICAgIH0KKworICAgIG9wdGlvbmFsIFRlc3RTZXJ2aWNlUmVzcG9uc2UgdGVzdF9zZXJ2aWNlX3Jlc3BvbnNlID0gMjsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2JhdHRlcnlzYXZpbmcvY29tbW9uL3NyYy9hbmRyb2lkL29zL2N0cy9iYXR0ZXJ5c2F2aW5nL2NvbW1vbi9WYWx1ZXMuamF2YSBiL3Rlc3RzL3Rlc3RzL2JhdHRlcnlzYXZpbmcvY29tbW9uL3NyYy9hbmRyb2lkL29zL2N0cy9iYXR0ZXJ5c2F2aW5nL2NvbW1vbi9WYWx1ZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjFkZDM2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvYmF0dGVyeXNhdmluZy9jb21tb24vc3JjL2FuZHJvaWQvb3MvY3RzL2JhdHRlcnlzYXZpbmcvY29tbW9uL1ZhbHVlcy5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLm9zLmN0cy5iYXR0ZXJ5c2F2aW5nLmNvbW1vbjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworCitpbXBvcnQgamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb207CisKK3B1YmxpYyBjbGFzcyBWYWx1ZXMgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNlY3VyZVJhbmRvbSBzUm5nID0gbmV3IFNlY3VyZVJhbmRvbSgpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQX0NVUlJFTlRfUEFDS0FHRSA9CisgICAgICAgICAgICAiYW5kcm9pZC5vcy5jdHMuYmF0dGVyeXNhdmluZy5hcHBfdGFyZ2V0X2FwaV9jdXJyZW50IjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUF8yNV9QQUNLQUdFID0KKyAgICAgICAgICAgICJhbmRyb2lkLm9zLmN0cy5iYXR0ZXJ5c2F2aW5nLmFwcF90YXJnZXRfYXBpXzI1IjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1fUkVDRUlWRVIgPSAiYW5kcm9pZC5vcy5jdHMuYmF0dGVyeXNhdmluZy5hcHAuQ29tbVJlY2VpdmVyIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfU0VSVklDRSA9ICJhbmRyb2lkLm9zLmN0cy5iYXR0ZXJ5c2F2aW5nLmFwcC5UZXN0U2VydmljZSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUkVRVUVTVF9GT1JFR1JPVU5EID0gIktFWV9SRVFVRVNUX0ZPUkVHUk9VTkQiOworCisgICAgcHVibGljIHN0YXRpYyBDb21wb25lbnROYW1lIGdldENvbW1SZWNlaXZlcihTdHJpbmcgcGFja2FnZU5hbWUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnROYW1lKHBhY2thZ2VOYW1lLCBDT01NX1JFQ0VJVkVSKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIENvbXBvbmVudE5hbWUgZ2V0VGVzdFNlcnZpY2UoU3RyaW5nIHBhY2thZ2VOYW1lKSB7CisgICAgICAgIHJldHVybiBuZXcgQ29tcG9uZW50TmFtZShwYWNrYWdlTmFtZSwgVEVTVF9TRVJWSUNFKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRSYW5kb21JbnQoKSB7CisgICAgICAgIHJldHVybiBzUm5nLm5leHRJbnQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9iYXR0ZXJ5c2F2aW5nL3NyYy9hbmRyb2lkL29zL2N0cy9iYXR0ZXJ5c2F2aW5nL0JhdHRlcnlTYXZlckFsYXJtVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvYmF0dGVyeXNhdmluZy9zcmMvYW5kcm9pZC9vcy9jdHMvYmF0dGVyeXNhdmluZy9CYXR0ZXJ5U2F2ZXJBbGFybVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmM5ZGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvYmF0dGVyeXNhdmluZy9zcmMvYW5kcm9pZC9vcy9jdHMvYmF0dGVyeXNhdmluZy9CYXR0ZXJ5U2F2ZXJBbGFybVRlc3QuamF2YQpAQCAtMCwwICsxLDI4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQub3MuY3RzLmJhdHRlcnlzYXZpbmc7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5vcy5jdHMuYmF0dGVyeXNhdmluZy5jb21tb24uVmFsdWVzLkFQUF8yNV9QQUNLQUdFOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm9zLmN0cy5iYXR0ZXJ5c2F2aW5nLmNvbW1vbi5WYWx1ZXMuZ2V0UmFuZG9tSW50OworCitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQW1VdGlscy5ydW5LaWxsOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkFtVXRpbHMucnVuTWFrZVVpZElkbGU7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQmF0dGVyeVV0aWxzLmVuYWJsZUJhdHRlcnlTYXZlcjsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5CYXR0ZXJ5VXRpbHMucnVuRHVtcHN5c0JhdHRlcnlVbnBsdWc7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuU2V0dGluZ3NVdGlscy5wdXRHbG9iYWxTZXR0aW5nOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlRlc3RVdGlscy53YWl0VW50aWw7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFsYXJtTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQub3MuY3RzLmJhdHRlcnlzYXZpbmcuY29tbW9uLkJhdHRlcnlTYXZpbmdDdHNDb21tb24uUGF5bG9hZDsKK2ltcG9ydCBhbmRyb2lkLm9zLmN0cy5iYXR0ZXJ5c2F2aW5nLmNvbW1vbi5CYXR0ZXJ5U2F2aW5nQ3RzQ29tbW9uLlBheWxvYWQuVGVzdFNlcnZpY2VSZXF1ZXN0OworaW1wb3J0IGFuZHJvaWQub3MuY3RzLmJhdHRlcnlzYXZpbmcuY29tbW9uLkJhdHRlcnlTYXZpbmdDdHNDb21tb24uUGF5bG9hZC5UZXN0U2VydmljZVJlcXVlc3QuU2V0QWxhcm1SZXF1ZXN0OworaW1wb3J0IGFuZHJvaWQub3MuY3RzLmJhdHRlcnlzYXZpbmcuY29tbW9uLkJhdHRlcnlTYXZpbmdDdHNDb21tb24uUGF5bG9hZC5UZXN0U2VydmljZVJlcXVlc3QuU3RhcnRTZXJ2aWNlUmVxdWVzdDsKK2ltcG9ydCBhbmRyb2lkLm9zLmN0cy5iYXR0ZXJ5c2F2aW5nLmNvbW1vbi5WYWx1ZXM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5MYXJnZVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuVGhyZWFkVXRpbHM7CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOworCisvKioKKyAqIENUUyBmb3IgYmF0dGVyeSBzYXZlciBhbGFybSB0aHJvdHRsaW5nCisgKgorIGF0ZXN0ICRBTkRST0lEX0JVSUxEX1RPUC9jdHMvdGVzdHMvdGVzdHMvYmF0dGVyeXNhdmluZy9zcmMvYW5kcm9pZC9vcy9jdHMvYmF0dGVyeXNhdmluZy9CYXR0ZXJ5U2F2ZXJBbGFybVRlc3QuamF2YQorICovCitATWVkaXVtVGVzdAorQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBCYXR0ZXJ5U2F2ZXJBbGFybVRlc3QgZXh0ZW5kcyBCYXR0ZXJ5U2F2aW5nVGVzdEJhc2UgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQmF0dGVyeVNhdmVyQWxhcm1UZXN0IjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgREVGQVVMVF9XQUlUID0gMV8wMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBQT0xMX0lOVEVSVkFMID0gMjAwOworCisgICAgLy8gVHdlYWtlZCBhbGFybSBtYW5hZ2VyIGNvbnN0YW50cyB0byBmYWNpbGl0YXRlIHRlc3RpbmcKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIE1JTl9SRVBFQVRJTkdfSU5URVJWQUwgPSA1XzAwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEFMTE9XX1dISUxFX0lETEVfU0hPUlRfVElNRSA9IDEwXzAwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEFMTE9XX1dISUxFX0lETEVfTE9OR19USU1FID0gMjBfMDAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgTUlOX0ZVVFVSSVRZID0gMl8wMDA7CisKKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlQWxhcm1NYW5hZ2VyQ29uc3RhbnRzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcHV0R2xvYmFsU2V0dGluZygiYWxhcm1fbWFuYWdlcl9jb25zdGFudHMiLAorICAgICAgICAgICAgICAgICJtaW5faW50ZXJ2YWw9IiArIE1JTl9SRVBFQVRJTkdfSU5URVJWQUwgKyAiLCIKKyAgICAgICAgICAgICAgICArICJtaW5fZnV0dXJpdHk9IiArIE1JTl9GVVRVUklUWSArICIsIgorICAgICAgICAgICAgICAgICsgImFsbG93X3doaWxlX2lkbGVfc2hvcnRfdGltZT0iICsgQUxMT1dfV0hJTEVfSURMRV9TSE9SVF9USU1FICsgIiwiCisgICAgICAgICAgICAgICAgKyAiYWxsb3dfd2hpbGVfaWRsZV9sb25nX3RpbWU9IiArIEFMTE9XX1dISUxFX0lETEVfTE9OR19USU1FKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVzZXRBbGFybU1hbmFnZXJDb25zdGFudHMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBwdXRHbG9iYWxTZXR0aW5nKCJhbGFybV9tYW5hZ2VyX2NvbnN0YW50cyIsICJudWxsIik7CisgICAgfQorCisgICAgLy8gVXNlIGEgZGlmZmVyZW50IGJyb2FkY2FzdCBhY3Rpb24gZXZlcnkgdGltZS4KKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBBQ1RJT04gPSAiQkFUVEVSWV9TQVZFUl9BTEFSTV9URVNUX0FMQVJNX0FDVElPTl8iICsgVmFsdWVzLmdldFJhbmRvbUludCgpOworCisgICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNJbnRlZ2VyIG1BbGFybUNvdW50ID0gbmV3IEF0b21pY0ludGVnZXIoKTsKKworICAgIHByaXZhdGUgZmluYWwgQnJvYWRjYXN0UmVjZWl2ZXIgbUFsYXJtUmVjZWl2ZXIgPSBuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICBtQWxhcm1Db3VudC5pbmNyZW1lbnRBbmRHZXQoKTsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIkFsYXJtIHJlY2VpdmVkIGF0ICIgKyBTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKSk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdXBkYXRlQWxhcm1NYW5hZ2VyQ29uc3RhbnRzKCk7CisKKyAgICAgICAgZmluYWwgSW50ZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoQUNUSU9OKTsKKyAgICAgICAgZ2V0Q29udGV4dCgpLnJlZ2lzdGVyUmVjZWl2ZXIobUFsYXJtUmVjZWl2ZXIsIGZpbHRlciwgbnVsbCwKKyAgICAgICAgICAgICAgICBuZXcgSGFuZGxlcihMb29wZXIuZ2V0TWFpbkxvb3BlcigpKSk7CisgICAgfQorCisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXNldEFsYXJtTWFuYWdlckNvbnN0YW50cygpOworICAgICAgICBnZXRDb250ZXh0KCkudW5yZWdpc3RlclJlY2VpdmVyKG1BbGFybVJlY2VpdmVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2NoZWR1bGVBbGFybShTdHJpbmcgdGFyZ2V0UGFja2FnZSwgaW50IHR5cGUsIGxvbmcgdHJpZ2dlck1pbGxpcykKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzY2hlZHVsZUFsYXJtKHRhcmdldFBhY2thZ2UsIHR5cGUsIHRyaWdnZXJNaWxsaXMsIC8qd2hpbGVJZGxlPSovIHRydWUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzY2hlZHVsZUFsYXJtKFN0cmluZyB0YXJnZXRQYWNrYWdlLCBpbnQgdHlwZSwgbG9uZyB0cmlnZ2VyTWlsbGlzLAorICAgICAgICAgICAgYm9vbGVhbiB3aGlsZUlkbGUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBMb2cuZChUQUcsICJTZXR0aW5nIGFuIGFsYXJtIGF0ICIgKyB0cmlnZ2VyTWlsbGlzICsgIiAoaW4gIgorICAgICAgICAgICAgICAgICsgKHRyaWdnZXJNaWxsaXMgLSBTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKSkgKyAibXMpIik7CisgICAgICAgIGZpbmFsIFNldEFsYXJtUmVxdWVzdCBhcmVxID0gU2V0QWxhcm1SZXF1ZXN0Lm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRJbnRlbnRBY3Rpb24oQUNUSU9OKQorICAgICAgICAgICAgICAgIC5zZXRUeXBlKHR5cGUpCisgICAgICAgICAgICAgICAgLnNldEFsbG93V2hpbGVJZGxlKHdoaWxlSWRsZSkKKyAgICAgICAgICAgICAgICAuc2V0VHJpZ2dlclRpbWUodHJpZ2dlck1pbGxpcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgZmluYWwgUGF5bG9hZCByZXNwb25zZSA9IG1ScGMuc2VuZFJlcXVlc3QodGFyZ2V0UGFja2FnZSwKKyAgICAgICAgICAgICAgICBQYXlsb2FkLm5ld0J1aWxkZXIoKS5zZXRUZXN0U2VydmljZVJlcXVlc3QoCisgICAgICAgICAgICAgICAgICAgICAgICBUZXN0U2VydmljZVJlcXVlc3QubmV3QnVpbGRlcigpLnNldFNldEFsYXJtKGFyZXEpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmhhc1Rlc3RTZXJ2aWNlUmVzcG9uc2UoKQorICAgICAgICAgICAgICAgICYmIHJlc3BvbnNlLmdldFRlc3RTZXJ2aWNlUmVzcG9uc2UoKS5nZXRTZXRBbGFybUFjaygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBzZXJ2aWNlIGluIHRoZSB0YXJnZXQgcGFja2FnZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBzdGFydFNlcnZpY2UoU3RyaW5nIHRhcmdldFBhY2thZ2UsIGJvb2xlYW4gZm9yZWdyb3VuZCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgYWN0aW9uID0gInN0YXJ0X3NlcnZpY2VfIiArIGdldFJhbmRvbUludCgpICsgIl9mZz0iICsgZm9yZWdyb3VuZDsKKworICAgICAgICBmaW5hbCBQYXlsb2FkIHJlc3BvbnNlID0gbVJwYy5zZW5kUmVxdWVzdCh0YXJnZXRQYWNrYWdlLAorICAgICAgICAgICAgICAgIFBheWxvYWQubmV3QnVpbGRlcigpLnNldFRlc3RTZXJ2aWNlUmVxdWVzdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RTZXJ2aWNlUmVxdWVzdC5uZXdCdWlsZGVyKCkuc2V0U3RhcnRTZXJ2aWNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFydFNlcnZpY2VSZXF1ZXN0Lm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGb3JlZ3JvdW5kKGZvcmVncm91bmQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEFjdGlvbihhY3Rpb24pLmJ1aWxkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICkpLmJ1aWxkKCkpOworICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmhhc1Rlc3RTZXJ2aWNlUmVzcG9uc2UoKQorICAgICAgICAgICAgICAgICYmIHJlc3BvbnNlLmdldFRlc3RTZXJ2aWNlUmVzcG9uc2UoKS5nZXRTdGFydFNlcnZpY2VBY2soKSk7CisgICAgICAgIHJldHVybiBhY3Rpb247CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBmb3JjZVBhY2thZ2VJbnRvQmcoU3RyaW5nIHBhY2thZ2VOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcnVuTWFrZVVpZElkbGUocGFja2FnZU5hbWUpOworICAgICAgICBUaHJlYWQuc2xlZXAoMjAwKTsKKyAgICAgICAgcnVuS2lsbChwYWNrYWdlTmFtZSwgLyp3YWl0PSovIHRydWUpOworICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFsbG93V2hpbGVJZGxlVGhyb3R0bGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyB0YXJnZXRQYWNrYWdlID0gQVBQXzI1X1BBQ0tBR0U7CisKKyAgICAgICAgcnVuRHVtcHN5c0JhdHRlcnlVbnBsdWcoKTsKKworICAgICAgICBlbmFibGVCYXR0ZXJ5U2F2ZXIodHJ1ZSk7CisKKyAgICAgICAgZm9yY2VQYWNrYWdlSW50b0JnKHRhcmdldFBhY2thZ2UpOworCisgICAgICAgIC8vIEZpcnN0IGFsYXJtIHNob3VsZG4ndCBiZSB0aHJvdHRsZWQuCisgICAgICAgIGZpbmFsIGxvbmcgdHJpZ2dlckVsYXBzZWQxID0gU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCkgKyBNSU5fRlVUVVJJVFk7CisgICAgICAgIHNjaGVkdWxlQWxhcm0odGFyZ2V0UGFja2FnZSwgQWxhcm1NYW5hZ2VyLkVMQVBTRURfUkVBTFRJTUVfV0FLRVVQLCB0cmlnZ2VyRWxhcHNlZDEpOworICAgICAgICBUaHJlYWRVdGlscy5zbGVlcFVudGlsUmVhbHRpbWUodHJpZ2dlckVsYXBzZWQxICsgREVGQVVMVF9XQUlUKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJBbGxvdy13aGlsZS1pZGxlIGFsYXJtIHNob3VsZG4ndCBiZSBibG9ja2VkIGluIGJhdHRlcnkgc2F2ZXIiLAorICAgICAgICAgICAgICAgIDEsIG1BbGFybUNvdW50LmdldCgpKTsKKworICAgICAgICAvLyBTZWNvbmQgb25lIHNob3VsZCBiZSB0aHJvdHRsZWQuCisgICAgICAgIG1BbGFybUNvdW50LnNldCgwKTsKKworICAgICAgICBmaW5hbCBsb25nIHRyaWdnZXJFbGFwc2VkMiA9IHRyaWdnZXJFbGFwc2VkMSArIEFMTE9XX1dISUxFX0lETEVfU0hPUlRfVElNRTsKKyAgICAgICAgc2NoZWR1bGVBbGFybSh0YXJnZXRQYWNrYWdlLCBBbGFybU1hbmFnZXIuRUxBUFNFRF9SRUFMVElNRV9XQUtFVVAsIHRyaWdnZXJFbGFwc2VkMik7CisgICAgICAgIFRocmVhZFV0aWxzLnNsZWVwVW50aWxSZWFsdGltZSh0cmlnZ2VyRWxhcHNlZDIgKyBERUZBVUxUX1dBSVQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkZvbGxvdyB1cCBhbGxvdy13aGlsZS1pZGxlIGFsYXJtIHNob3VsZG4ndCBnbyBvZmYgYmVmb3JlIHNob3J0IHRpbWUiLAorICAgICAgICAgICAgICAgIDAsIG1BbGFybUNvdW50LmdldCgpKTsKKworICAgICAgICBmaW5hbCBsb25nIHRyaWdnZXJFbGFwc2VkMyA9IHRyaWdnZXJFbGFwc2VkMSArIEFMTE9XX1dISUxFX0lETEVfTE9OR19USU1FOworICAgICAgICBUaHJlYWRVdGlscy5zbGVlcFVudGlsUmVhbHRpbWUodHJpZ2dlckVsYXBzZWQzICsgREVGQVVMVF9XQUlUKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJGb2xsb3ctdXAgYWxsb3ctd2hpbGUtaWRsZSBhbGFybSBzaG91bGQgZ28gb2ZmIGFmdGVyIGxvbmcgdGltZSIsCisgICAgICAgICAgICAgICAgMSwgbUFsYXJtQ291bnQuZ2V0KCkpOworCisgICAgICAgIC8vIFN0YXJ0IGFuIEZHIHNlcnZpY2UsIHdoaWNoIHNob3VsZCByZXNldCB0aHJvdHRsaW5nLgorICAgICAgICBtQWxhcm1Db3VudC5zZXQoMCk7CisKKyAgICAgICAgc3RhcnRTZXJ2aWNlKHRhcmdldFBhY2thZ2UsIHRydWUpOworCisgICAgICAgIGZpbmFsIGxvbmcgdHJpZ2dlckVsYXBzZWQ0ID0gdHJpZ2dlckVsYXBzZWQzICsgQUxMT1dfV0hJTEVfSURMRV9TSE9SVF9USU1FOworICAgICAgICBzY2hlZHVsZUFsYXJtKHRhcmdldFBhY2thZ2UsIEFsYXJtTWFuYWdlci5FTEFQU0VEX1JFQUxUSU1FX1dBS0VVUCwgdHJpZ2dlckVsYXBzZWQ0KTsKKyAgICAgICAgVGhyZWFkVXRpbHMuc2xlZXBVbnRpbFJlYWx0aW1lKHRyaWdnZXJFbGFwc2VkNCArIERFRkFVTFRfV0FJVCk7CisgICAgICAgIGFzc2VydEVxdWFscygiQWxsb3ctd2hpbGUtaWRsZSBhbGFybSBzaG91bGRuJ3QgYmUgdGhyb3R0bGVkIGluIGJhdHRlcnkgc2F2ZXIiCisgICAgICAgICAgICAgICAgKyIgYWZ0ZXIgRkcgc2VydmljZSBzdGFydGVkIiwKKyAgICAgICAgICAgICAgICAxLCBtQWxhcm1Db3VudC5nZXQoKSk7CisKKyAgICAgICAgLy8gQmF0dGVyeSBzYXZlciBvZmYuIEFsd2F5cyB1c2UgdGhlIHNob3J0IHRpbWUuCisgICAgICAgIGVuYWJsZUJhdHRlcnlTYXZlcihmYWxzZSk7CisKKyAgICAgICAgbUFsYXJtQ291bnQuc2V0KDApOworCisgICAgICAgIGZpbmFsIGxvbmcgdHJpZ2dlckVsYXBzZWQ1ID0gdHJpZ2dlckVsYXBzZWQ0ICsgQUxMT1dfV0hJTEVfSURMRV9TSE9SVF9USU1FOworICAgICAgICBzY2hlZHVsZUFsYXJtKHRhcmdldFBhY2thZ2UsIEFsYXJtTWFuYWdlci5FTEFQU0VEX1JFQUxUSU1FX1dBS0VVUCwgdHJpZ2dlckVsYXBzZWQ1KTsKKyAgICAgICAgVGhyZWFkVXRpbHMuc2xlZXBVbnRpbFJlYWx0aW1lKHRyaWdnZXJFbGFwc2VkNSArIERFRkFVTFRfV0FJVCk7CisgICAgICAgIGFzc2VydEVxdWFscygiQWxsb3ctd2hpbGUtaWRsZSBhbGFybSBzaG91bGRuJ3QgYmUgdGhyb3R0bGVkIGluIGJhdHRlcnkgc2F2ZXIiCisgICAgICAgICAgICAgICAgICAgICAgICArIiB3aGVuIEJTIGlzIG9mZiIsCisgICAgICAgICAgICAgICAgMSwgbUFsYXJtQ291bnQuZ2V0KCkpOworCisgICAgICAgIC8vIE9uZSBtb3JlIHRpbWUuCisgICAgICAgIG1BbGFybUNvdW50LnNldCgwKTsKKworICAgICAgICBmaW5hbCBsb25nIHRyaWdnZXJFbGFwc2VkNiA9IHRyaWdnZXJFbGFwc2VkNSArIEFMTE9XX1dISUxFX0lETEVfU0hPUlRfVElNRTsKKyAgICAgICAgc2NoZWR1bGVBbGFybSh0YXJnZXRQYWNrYWdlLCBBbGFybU1hbmFnZXIuRUxBUFNFRF9SRUFMVElNRV9XQUtFVVAsIHRyaWdnZXJFbGFwc2VkNik7CisgICAgICAgIFRocmVhZFV0aWxzLnNsZWVwVW50aWxSZWFsdGltZSh0cmlnZ2VyRWxhcHNlZDYgKyBERUZBVUxUX1dBSVQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkFsbG93LXdoaWxlLWlkbGUgYWxhcm0gc2hvdWxkbid0IGJlIHRocm90dGxlZCB3aGVuIEJTIGlzIG9mZiIsCisgICAgICAgICAgICAgICAgMSwgbUFsYXJtQ291bnQuZ2V0KCkpOworICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBbGFybXNUaHJvdHRsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHRhcmdldFBhY2thZ2UgPSBBUFBfMjVfUEFDS0FHRTsKKworICAgICAgICBydW5EdW1wc3lzQmF0dGVyeVVucGx1ZygpOworCisgICAgICAgIGVuYWJsZUJhdHRlcnlTYXZlcih0cnVlKTsKKworICAgICAgICBmb3JjZVBhY2thZ2VJbnRvQmcodGFyZ2V0UGFja2FnZSk7CisKKyAgICAgICAgeworICAgICAgICAgICAgLy8gV2hlbiBiYXR0ZXJ5IHNhdmVyIGlzIGVuYWJsZWQsIGFsYXJtcyBzaG91bGQgYmUgYmxvY2tlZC4KKyAgICAgICAgICAgIGZpbmFsIGxvbmcgdHJpZ2dlckVsYXBzZWQgPSBTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKSArIE1JTl9GVVRVUklUWTsKKyAgICAgICAgICAgIHNjaGVkdWxlQWxhcm0odGFyZ2V0UGFja2FnZSwgQWxhcm1NYW5hZ2VyLkVMQVBTRURfUkVBTFRJTUVfV0FLRVVQLCB0cmlnZ2VyRWxhcHNlZCwKKyAgICAgICAgICAgICAgICAgICAgLyogd2hpbGVJZGxlPSovIGZhbHNlKTsKKyAgICAgICAgICAgIFRocmVhZFV0aWxzLnNsZWVwVW50aWxSZWFsdGltZSh0cmlnZ2VyRWxhcHNlZCArIERFRkFVTFRfV0FJVCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIk5vbi13aGlsZS1pZGxlIGFsYXJtIHNob3VsZCBiZSBibG9ja2VkIGluIGJhdHRlcnkgc2F2ZXIiLAorICAgICAgICAgICAgICAgICAgICAwLCBtQWxhcm1Db3VudC5nZXQoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTdGFydCBhbiBGRyBzZXJ2aWNlIC0+IHNob3VsZCB1bmJsb2NrIHRoZSBhbGFybS4KKyAgICAgICAgc3RhcnRTZXJ2aWNlKHRhcmdldFBhY2thZ2UsIHRydWUpOworCisgICAgICAgIHdhaXRVbnRpbCgiQWxhcm0gc2hvdWxkIGZpcmUgZm9yIGFuIEZHIGFwcCIsCisgICAgICAgICAgICAgICAgKCkgLT4gbUFsYXJtQ291bnQuZ2V0KCkgPT0gMSk7CisKKyAgICAgICAgLy8gVHJ5IGFnYWluLgorICAgICAgICBtQWxhcm1Db3VudC5zZXQoMCk7CisKKyAgICAgICAgZm9yY2VQYWNrYWdlSW50b0JnKHRhcmdldFBhY2thZ2UpOworCisgICAgICAgIC8vIFRyeSBhZ2Fpbi4KKyAgICAgICAgLy8gV2hlbiBiYXR0ZXJ5IHNhdmVyIGlzIGVuYWJsZWQsIGFsYXJtcyBzaG91bGQgYmUgYmxvY2tlZC4KKyAgICAgICAgeworICAgICAgICAgICAgZmluYWwgbG9uZyB0cmlnZ2VyRWxhcHNlZCA9IFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpICsgTUlOX0ZVVFVSSVRZOworICAgICAgICAgICAgc2NoZWR1bGVBbGFybSh0YXJnZXRQYWNrYWdlLCBBbGFybU1hbmFnZXIuRUxBUFNFRF9SRUFMVElNRV9XQUtFVVAsIHRyaWdnZXJFbGFwc2VkLAorICAgICAgICAgICAgICAgICAgICAvKiB3aGlsZUlkbGU9Ki8gZmFsc2UpOworICAgICAgICAgICAgVGhyZWFkVXRpbHMuc2xlZXBVbnRpbFJlYWx0aW1lKHRyaWdnZXJFbGFwc2VkICsgREVGQVVMVF9XQUlUKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiTm9uLXdoaWxlLWlkbGUgYWxhcm0gc2hvdWxkIGJlIGJsb2NrZWQgaW4gYmF0dGVyeSBzYXZlciIsCisgICAgICAgICAgICAgICAgICAgIDAsIG1BbGFybUNvdW50LmdldCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRoaXMgdGltZSwgZGlzYWJsZSBFQlMgLT4gc2hvdWxkIHVuYmxvY2sgdGhlIGFsYXJtLgorICAgICAgICBlbmFibGVCYXR0ZXJ5U2F2ZXIoZmFsc2UpOworICAgICAgICB3YWl0VW50aWwoIkFsbG93LXdoaWxlLWlkbGUgYWxhcm0gc2hvdWxkIGJlIGJsb2NrZWQgaW4gYmF0dGVyeSBzYXZlciIsCisgICAgICAgICAgICAgICAgKCkgLT4gbUFsYXJtQ291bnQuZ2V0KCkgPT0gMSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvYmF0dGVyeXNhdmluZy9zcmMvYW5kcm9pZC9vcy9jdHMvYmF0dGVyeXNhdmluZy9CYXR0ZXJ5U2F2ZXJCZ1NlcnZpY2VUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9iYXR0ZXJ5c2F2aW5nL3NyYy9hbmRyb2lkL29zL2N0cy9iYXR0ZXJ5c2F2aW5nL0JhdHRlcnlTYXZlckJnU2VydmljZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGYwZGQyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvYmF0dGVyeXNhdmluZy9zcmMvYW5kcm9pZC9vcy9jdHMvYmF0dGVyeXNhdmluZy9CYXR0ZXJ5U2F2ZXJCZ1NlcnZpY2VUZXN0LmphdmEKQEAgLTAsMCArMSwxNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLm9zLmN0cy5iYXR0ZXJ5c2F2aW5nOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQub3MuY3RzLmJhdHRlcnlzYXZpbmcuY29tbW9uLlZhbHVlcy5BUFBfMjVfUEFDS0FHRTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5vcy5jdHMuYmF0dGVyeXNhdmluZy5jb21tb24uVmFsdWVzLmdldFJhbmRvbUludDsKKworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkFtVXRpbHMucnVuS2lsbDsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5BbVV0aWxzLnJ1bk1ha2VVaWRJZGxlOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkJhdHRlcnlVdGlscy5lbmFibGVCYXR0ZXJ5U2F2ZXI7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQmF0dGVyeVV0aWxzLnJ1bkR1bXBzeXNCYXR0ZXJ5VW5wbHVnOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlRlc3RVdGlscy53YWl0VW50aWw7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgYW5kcm9pZC5vcy5jdHMuYmF0dGVyeXNhdmluZy5jb21tb24uQmF0dGVyeVNhdmluZ0N0c0NvbW1vbi5QYXlsb2FkOworaW1wb3J0IGFuZHJvaWQub3MuY3RzLmJhdHRlcnlzYXZpbmcuY29tbW9uLkJhdHRlcnlTYXZpbmdDdHNDb21tb24uUGF5bG9hZC5UZXN0U2VydmljZVJlcXVlc3Q7CitpbXBvcnQgYW5kcm9pZC5vcy5jdHMuYmF0dGVyeXNhdmluZy5jb21tb24uQmF0dGVyeVNhdmluZ0N0c0NvbW1vbi5QYXlsb2FkLlRlc3RTZXJ2aWNlUmVxdWVzdC5TdGFydFNlcnZpY2VSZXF1ZXN0OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2U7CisKKy8qKgorICogVGVzdHMgcmVsYXRlZCB0byBiYXR0ZXJ5IHNhdmVyOgorICoKKyAqIGF0ZXN0ICRBTkRST0lEX0JVSUxEX1RPUC9jdHMvdGVzdHMvdGVzdHMvYmF0dGVyeXNhdmluZy9zcmMvYW5kcm9pZC9vcy9jdHMvYmF0dGVyeXNhdmluZy9CYXR0ZXJ5U2F2ZXJCZ1NlcnZpY2VUZXN0LmphdmEKKyAqLworQE1lZGl1bVRlc3QKK0BSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgQmF0dGVyeVNhdmVyQmdTZXJ2aWNlVGVzdCBleHRlbmRzIEJhdHRlcnlTYXZpbmdUZXN0QmFzZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJCYXR0ZXJ5U2F2ZXJCZ1NlcnZpY2VUZXN0IjsKKworICAgIC8qKgorICAgICAqIE1ha2Ugc3VyZSBCRyBzZXJ2aWNlcyBvbiBwcmUtTyBhcHBzIGNhbid0IGJlIHN0YXJ0ZWQgd2hlbiBCUyBpcyBvbi4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCZ1NlcnZpY2VUaHJvdHRsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBmaW5hbCBTdHJpbmcgdGFyZ2V0UGFja2FnZSA9IEFQUF8yNV9QQUNLQUdFOworCisgICAgICAgIHJ1bkR1bXBzeXNCYXR0ZXJ5VW5wbHVnKCk7CisKKyAgICAgICAgZW5hYmxlQmF0dGVyeVNhdmVyKGZhbHNlKTsKKworICAgICAgICAvLyBNYWtlIHN1cmUgYSBCRyBzZXJ2aWNlIG9uIHByZS1PIGFwcCBjYW4gYmUgc3RhcnRlZCB3aXRoIEJTIG9mZi4KKyAgICAgICAgeworICAgICAgICAgICAgcnVuTWFrZVVpZElkbGUodGFyZ2V0UGFja2FnZSk7CisgICAgICAgICAgICBydW5LaWxsKHRhcmdldFBhY2thZ2UpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDUwMCk7CisKKyAgICAgICAgICAgIHJlcXVlc3RDbGVhckludGVudCh0YXJnZXRQYWNrYWdlKTsKKworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGFjdGlvbiA9IHRyeVN0YXJ0VGVzdFNlcnZpY2VBbmRSZXR1cm5BY3Rpb24odGFyZ2V0UGFja2FnZSwgZmFsc2UpOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYWN0aW9uLCB3YWl0Rm9yTGFzdEludGVudEFjdGlvbih0YXJnZXRQYWNrYWdlKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBFbmFibGUgYmF0dGVyeSBzYXZlci4KKyAgICAgICAgZW5hYmxlQmF0dGVyeVNhdmVyKHRydWUpOworICAgICAgICB3YWl0VW50aWxGb3JjZUJhY2tncm91bmRDaGVjayh0cnVlKTsKKworICAgICAgICAvLyBNYWtlIHN1cmUgYSBCRyBzZXJ2aWNlIG9uIHByZS1PIGFwcCAqY2Fubm90KiBiZSBzdGFydGVkIHdpdGggQlMgb24uCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIERvIHRoZSBzYW1lIHRoaW5nIGFnYWluLgorICAgICAgICAgICAgcnVuTWFrZVVpZElkbGUodGFyZ2V0UGFja2FnZSk7CisgICAgICAgICAgICBydW5LaWxsKHRhcmdldFBhY2thZ2UpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDUwMCk7CisKKyAgICAgICAgICAgIHJlcXVlc3RDbGVhckludGVudCh0YXJnZXRQYWNrYWdlKTsKKworICAgICAgICAgICAgYXNzZXJ0TnVsbChyZXF1ZXN0TGFzdEludGVudCh0YXJnZXRQYWNrYWdlKSk7CisKKyAgICAgICAgICAgIHRyeVN0YXJ0VGVzdFNlcnZpY2VBbmRSZXR1cm5BY3Rpb24odGFyZ2V0UGFja2FnZSwgZmFsc2UpOworCisgICAgICAgICAgICAvLyBXYWl0IGEgbGl0dGxlIGJpdCBhbmQgbWFrZSBzdXJlIHRoZSBzZXJ2aWNlIGRpZG4ndCBzdGFydC4KKyAgICAgICAgICAgIFRocmVhZC5zbGVlcCg1MDAwKTsKKworICAgICAgICAgICAgYXNzZXJ0TnVsbChyZXF1ZXN0TGFzdEludGVudCh0YXJnZXRQYWNrYWdlKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBNYWtlIHN1cmUgYW4gRkcgc2VydmljZSBvbiBwcmUtTyBhcHAgKmNhbiogYmUgc3RhcnRlZCB3aXRoIEJTIG9uLgorICAgICAgICB7CisgICAgICAgICAgICBydW5NYWtlVWlkSWRsZSh0YXJnZXRQYWNrYWdlKTsKKyAgICAgICAgICAgIHJ1bktpbGwodGFyZ2V0UGFja2FnZSk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNTAwKTsKKworICAgICAgICAgICAgcmVxdWVzdENsZWFySW50ZW50KHRhcmdldFBhY2thZ2UpOworCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYWN0aW9uID0gdHJ5U3RhcnRUZXN0U2VydmljZUFuZFJldHVybkFjdGlvbih0YXJnZXRQYWNrYWdlLCB0cnVlKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGFjdGlvbiwgd2FpdEZvckxhc3RJbnRlbnRBY3Rpb24odGFyZ2V0UGFja2FnZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIEFzayB0byBjbGVhciB0aGUgbGFzdCByZWNlaXZlZCBpbnRlbnQgaW4gdGhlIHRlc3Qgc2VydmljZS4gKi8KKyAgICBwcml2YXRlIHZvaWQgcmVxdWVzdENsZWFySW50ZW50KFN0cmluZyB0YXJnZXRQYWNrYWdlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUGF5bG9hZCByZXNwb25zZSA9IG1ScGMuc2VuZFJlcXVlc3QodGFyZ2V0UGFja2FnZSwKKyAgICAgICAgICAgICAgICBQYXlsb2FkLm5ld0J1aWxkZXIoKS5zZXRUZXN0U2VydmljZVJlcXVlc3QoCisgICAgICAgICAgICAgICAgICAgICAgICBUZXN0U2VydmljZVJlcXVlc3QubmV3QnVpbGRlcigpLnNldENsZWFyTGFzdEludGVudCh0cnVlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5oYXNUZXN0U2VydmljZVJlc3BvbnNlKCkKKyAgICAgICAgICAgICAgICAmJiByZXNwb25zZS5nZXRUZXN0U2VydmljZVJlc3BvbnNlKCkuZ2V0Q2xlYXJMYXN0SW50ZW50QWNrKCkpOworICAgIH0KKworICAgIC8qKiBHZXQgdGhlIGxhc3QgcmVjZWl2ZWQgaW50ZW50IGluIHRoZSB0ZXN0IHNlcnZpY2UuICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVxdWVzdExhc3RJbnRlbnQoU3RyaW5nIHRhcmdldFBhY2thZ2UpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBQYXlsb2FkIHJlc3BvbnNlID0gbVJwYy5zZW5kUmVxdWVzdCh0YXJnZXRQYWNrYWdlLAorICAgICAgICAgICAgICAgIFBheWxvYWQubmV3QnVpbGRlcigpLnNldFRlc3RTZXJ2aWNlUmVxdWVzdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RTZXJ2aWNlUmVxdWVzdC5uZXdCdWlsZGVyKCkuc2V0R2V0TGFzdEludGVudCh0cnVlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5oYXNUZXN0U2VydmljZVJlc3BvbnNlKCkpOworCisgICAgICAgIHJldHVybiByZXNwb25zZS5nZXRUZXN0U2VydmljZVJlc3BvbnNlKCkuaGFzR2V0TGFzdEludGVudEFjdGlvbigpCisgICAgICAgICAgICAgICAgPyByZXNwb25zZS5nZXRUZXN0U2VydmljZVJlc3BvbnNlKCkuZ2V0R2V0TGFzdEludGVudEFjdGlvbigpCisgICAgICAgICAgICAgICAgOiBudWxsOworICAgIH0KKworICAgIC8qKiBXYWl0IHVudGlsIHRoZSBsYXN0IGludGVudCBhY3Rpb24gaXMgbm9uLW51bGwuICovCisgICAgcHJpdmF0ZSBTdHJpbmcgd2FpdEZvckxhc3RJbnRlbnRBY3Rpb24oU3RyaW5nIHRhcmdldFBhY2thZ2UpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBBdG9taWNSZWZlcmVuY2U8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXRvbWljUmVmZXJlbmNlPD4oKTsKKyAgICAgICAgd2FpdFVudGlsKCJTZXJ2aWNlIGRpZG4ndCBzdGFydCIsICgpIC0+IHsKKyAgICAgICAgICAgIFN0cmluZyBhY3Rpb24gPSByZXF1ZXN0TGFzdEludGVudCh0YXJnZXRQYWNrYWdlKTsKKyAgICAgICAgICAgIGlmIChhY3Rpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJlc3VsdC5zZXQoYWN0aW9uKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybiByZXN1bHQuZ2V0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgdHJ5U3RhcnRUZXN0U2VydmljZUFuZFJldHVybkFjdGlvbihTdHJpbmcgdGFyZ2V0UGFja2FnZSwgYm9vbGVhbiBmb3JlZ3JvdW5kKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBhY3Rpb24gPSAic3RhcnRfc2VydmljZV8iICsgZ2V0UmFuZG9tSW50KCkgKyAiX2ZnPSIgKyBmb3JlZ3JvdW5kOworCisgICAgICAgIGZpbmFsIFBheWxvYWQgcmVzcG9uc2UgPSBtUnBjLnNlbmRSZXF1ZXN0KHRhcmdldFBhY2thZ2UsCisgICAgICAgICAgICAgICAgUGF5bG9hZC5uZXdCdWlsZGVyKCkuc2V0VGVzdFNlcnZpY2VSZXF1ZXN0KAorICAgICAgICAgICAgICAgICAgICAgICAgVGVzdFNlcnZpY2VSZXF1ZXN0Lm5ld0J1aWxkZXIoKS5zZXRTdGFydFNlcnZpY2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRTZXJ2aWNlUmVxdWVzdC5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGb3JlZ3JvdW5kKGZvcmVncm91bmQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0QWN0aW9uKGFjdGlvbikuYnVpbGQoKQorICAgICAgICAgICAgICAgICAgICAgICAgKSkuYnVpbGQoKSk7CisgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuaGFzVGVzdFNlcnZpY2VSZXNwb25zZSgpCisgICAgICAgICAgICAgICAgJiYgcmVzcG9uc2UuZ2V0VGVzdFNlcnZpY2VSZXNwb25zZSgpLmdldFN0YXJ0U2VydmljZUFjaygpKTsKKyAgICAgICAgcmV0dXJuIGFjdGlvbjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9iYXR0ZXJ5c2F2aW5nL3NyYy9hbmRyb2lkL29zL2N0cy9iYXR0ZXJ5c2F2aW5nL0JhdHRlcnlTYXZlckxvY2F0aW9uVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvYmF0dGVyeXNhdmluZy9zcmMvYW5kcm9pZC9vcy9jdHMvYmF0dGVyeXNhdmluZy9CYXR0ZXJ5U2F2ZXJMb2NhdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTAzMmQzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvYmF0dGVyeXNhdmluZy9zcmMvYW5kcm9pZC9vcy9jdHMvYmF0dGVyeXNhdmluZy9CYXR0ZXJ5U2F2ZXJMb2NhdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDE2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQub3MuY3RzLmJhdHRlcnlzYXZpbmc7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fTU9ERV9PRkY7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU2VjdXJlLkxPQ0FUSU9OX1BST1ZJREVSU19BTExPV0VEOworCitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQmF0dGVyeVV0aWxzLmVuYWJsZUJhdHRlcnlTYXZlcjsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5CYXR0ZXJ5VXRpbHMucnVuRHVtcHN5c0JhdHRlcnlVbnBsdWc7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQmF0dGVyeVV0aWxzLnR1cm5PblNjcmVlbjsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5TZXR0aW5nc1V0aWxzLnB1dFNlY3VyZVNldHRpbmc7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuVGVzdFV0aWxzLndhaXRVbnRpbDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3RFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uTG9jYXRpb25NYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuUG93ZXJNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5HbG9iYWw7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5TZWN1cmU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNhbGxiYWNrQXNzZXJ0ZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5SZXF1aXJlZEZlYXR1cmVSdWxlOworaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuVGVzdFV0aWxzLlJ1bm5hYmxlV2l0aFRocm93OworCitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworCisvKioKKyAqIFRlc3RzIHJlbGF0ZWQgdG8gYmF0dGVyeSBzYXZlcjoKKyAqCisgYXRlc3QgJEFORFJPSURfQlVJTERfVE9QL2N0cy90ZXN0cy90ZXN0cy9iYXR0ZXJ5c2F2aW5nL3NyYy9hbmRyb2lkL29zL2N0cy9iYXR0ZXJ5c2F2aW5nL0JhdHRlcnlTYXZlckxvY2F0aW9uVGVzdC5qYXZhCisgKi8KK0BNZWRpdW1UZXN0CitAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIEJhdHRlcnlTYXZlckxvY2F0aW9uVGVzdCBleHRlbmRzIEJhdHRlcnlTYXZpbmdUZXN0QmFzZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJCYXR0ZXJ5U2F2ZXJMb2NhdGlvblRlc3QiOworCisgICAgQFJ1bGUKKyAgICBwdWJsaWMgZmluYWwgUmVxdWlyZWRGZWF0dXJlUnVsZSBtUmVxdWlyZUxvY2F0aW9uUnVsZSA9CisgICAgICAgICAgICBuZXcgUmVxdWlyZWRGZWF0dXJlUnVsZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX0xPQ0FUSU9OKTsKKworICAgIEBSdWxlCisgICAgcHVibGljIGZpbmFsIFJlcXVpcmVkRmVhdHVyZVJ1bGUgbVJlcXVpcmVMb2NhdGlvbkdwc1J1bGUgPQorICAgICAgICAgICAgbmV3IFJlcXVpcmVkRmVhdHVyZVJ1bGUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9MT0NBVElPTl9HUFMpOworCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgdGhlIHtAbGluayBQb3dlck1hbmFnZXIjTE9DQVRJT05fTU9ERV9BTExfRElTQUJMRURfV0hFTl9TQ1JFRU5fT0ZGfSBtb2RlLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvY2F0aW9uQWxsRGlzYWJsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiU2NyZWVuIGlzIG9mZiIsIGdldFBvd2VyTWFuYWdlcigpLmlzSW50ZXJhY3RpdmUoKSk7CisKKyAgICAgICAgYXNzZXJ0RmFsc2UoZ2V0UG93ZXJNYW5hZ2VyKCkuaXNQb3dlclNhdmVNb2RlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUG93ZXJNYW5hZ2VyLkxPQ0FUSU9OX01PREVfTk9fQ0hBTkdFLAorICAgICAgICAgICAgICAgIGdldFBvd2VyTWFuYWdlcigpLmdldExvY2F0aW9uUG93ZXJTYXZlTW9kZSgpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgZ2V0TG9jYXRpb25HbG9iYWxLaWxsU3dpdGNoKCkpOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSBHUFMgaXMgZW5hYmxlZC4KKyAgICAgICAgcHV0U2VjdXJlU2V0dGluZyhMT0NBVElPTl9QUk9WSURFUlNfQUxMT1dFRCwgIitncHMiKTsKKyAgICAgICAgYXNzZXJ0Tm90RXF1YWxzKExPQ0FUSU9OX01PREVfT0ZGLCBnZXRMb2NhdGlvbk1vZGUoKSk7CisgICAgICAgIGFzc2VydFRydWUoZ2V0TG9jYXRpb25NYW5hZ2VyKCkuaXNMb2NhdGlvbkVuYWJsZWQoKSk7CisKKyAgICAgICAgLy8gVW5wbHVnIHRoZSBjaGFyZ2VyIGFuZCBhY3RpdmF0ZSBiYXR0ZXJ5IHNhdmVyLgorICAgICAgICBydW5EdW1wc3lzQmF0dGVyeVVucGx1ZygpOworICAgICAgICBlbmFibGVCYXR0ZXJ5U2F2ZXIodHJ1ZSk7CisKKyAgICAgICAgLy8gU2tpcCBpZiB0aGUgbG9jYXRpb24gbW9kZSBpcyBub3Qgd2hhdCdzIGV4cGVjdGVkLgorICAgICAgICBmaW5hbCBpbnQgbW9kZSA9IGdldFBvd2VyTWFuYWdlcigpLmdldExvY2F0aW9uUG93ZXJTYXZlTW9kZSgpOworICAgICAgICBpZiAobW9kZSAhPSBQb3dlck1hbmFnZXIuTE9DQVRJT05fTU9ERV9BTExfRElTQUJMRURfV0hFTl9TQ1JFRU5fT0ZGKSB7CisgICAgICAgICAgICBMb2cuaShUQUcsICJVbmV4cGVjdGVkIGxvY2F0aW9uIHBvd2VyIHNhdmUgbW9kZSAoIiArIG1vZGUgKyAiKSwgc2tpcHBpbmcuIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBNYWtlIHN1cmUgc2NyZWVuIGlzIG9uLgorICAgICAgICBhc3NlcnRUcnVlKGdldFBvd2VyTWFuYWdlcigpLmlzSW50ZXJhY3RpdmUoKSk7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBraWxsIHN3aXRjaCBpcyBzdGlsbCBvZmYuCisgICAgICAgIGFzc2VydEVxdWFscygwLCBnZXRMb2NhdGlvbkdsb2JhbEtpbGxTd2l0Y2goKSk7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIGxvY2F0aW9uIGlzIHN0aWxsIGVuYWJsZWQuCisgICAgICAgIGFzc2VydE5vdEVxdWFscyhMT0NBVElPTl9NT0RFX09GRiwgZ2V0TG9jYXRpb25Nb2RlKCkpOworICAgICAgICBhc3NlcnRUcnVlKGdldExvY2F0aW9uTWFuYWdlcigpLmlzTG9jYXRpb25FbmFibGVkKCkpOworCisgICAgICAgIC8vIFR1cm4gc2NyZWVuIG9mZi4KKyAgICAgICAgcnVuV2l0aEV4cGVjdGluZ0xvY2F0aW9uQ2FsbGJhY2soKCkgLT4geworICAgICAgICAgICAgdHVybk9uU2NyZWVuKGZhbHNlKTsKKyAgICAgICAgICAgIHdhaXRVbnRpbCgiS2lsbCBzd2l0Y2ggc3RpbGwgb2ZmIiwgKCkgLT4gZ2V0TG9jYXRpb25HbG9iYWxLaWxsU3dpdGNoKCkgPT0gMSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoTE9DQVRJT05fTU9ERV9PRkYsIGdldExvY2F0aW9uTW9kZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGdldExvY2F0aW9uTWFuYWdlcigpLmlzTG9jYXRpb25FbmFibGVkKCkpOworICAgICAgICB9KTsKKworICAgICAgICAvLyBPbiBhZ2Fpbi4KKyAgICAgICAgcnVuV2l0aEV4cGVjdGluZ0xvY2F0aW9uQ2FsbGJhY2soKCkgLT4geworICAgICAgICAgICAgdHVybk9uU2NyZWVuKHRydWUpOworICAgICAgICAgICAgd2FpdFVudGlsKCJLaWxsIHN3aXRjaCBzdGlsbCBvZmYiLCAoKSAtPiBnZXRMb2NhdGlvbkdsb2JhbEtpbGxTd2l0Y2goKSA9PSAwKTsKKyAgICAgICAgICAgIGFzc2VydE5vdEVxdWFscyhMT0NBVElPTl9NT0RFX09GRiwgZ2V0TG9jYXRpb25Nb2RlKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShnZXRMb2NhdGlvbk1hbmFnZXIoKS5pc0xvY2F0aW9uRW5hYmxlZCgpKTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgLy8gT2ZmIGFnYWluLgorICAgICAgICBydW5XaXRoRXhwZWN0aW5nTG9jYXRpb25DYWxsYmFjaygoKSAtPiB7CisgICAgICAgICAgICB0dXJuT25TY3JlZW4oZmFsc2UpOworICAgICAgICAgICAgd2FpdFVudGlsKCJLaWxsIHN3aXRjaCBzdGlsbCBvZmYiLCAoKSAtPiBnZXRMb2NhdGlvbkdsb2JhbEtpbGxTd2l0Y2goKSA9PSAxKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhMT0NBVElPTl9NT0RFX09GRiwgZ2V0TG9jYXRpb25Nb2RlKCkpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoZ2V0TG9jYXRpb25NYW5hZ2VyKCkuaXNMb2NhdGlvbkVuYWJsZWQoKSk7CisgICAgICAgIH0pOworCisgICAgICAgIC8vIERpc2FibGUgYmF0dGVyeSBzYXZlciBhbmQgbWFrZSBzdXJlIHRoZSBraWxsIHN3dGljaCBpcyBvZmYuCisgICAgICAgIHJ1bldpdGhFeHBlY3RpbmdMb2NhdGlvbkNhbGxiYWNrKCgpIC0+IHsKKyAgICAgICAgICAgIGVuYWJsZUJhdHRlcnlTYXZlcihmYWxzZSk7CisgICAgICAgICAgICB3YWl0VW50aWwoIktpbGwgc3dpdGNoIHN0aWxsIG9uIiwgKCkgLT4gZ2V0TG9jYXRpb25HbG9iYWxLaWxsU3dpdGNoKCkgPT0gMCk7CisgICAgICAgICAgICBhc3NlcnROb3RFcXVhbHMoTE9DQVRJT05fTU9ERV9PRkYsIGdldExvY2F0aW9uTW9kZSgpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZ2V0TG9jYXRpb25NYW5hZ2VyKCkuaXNMb2NhdGlvbkVuYWJsZWQoKSk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGdldExvY2F0aW9uR2xvYmFsS2lsbFN3aXRjaCgpIHsKKyAgICAgICAgcmV0dXJuIEdsb2JhbC5nZXRJbnQoZ2V0Q29udGV4dCgpLmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgIEdsb2JhbC5MT0NBVElPTl9HTE9CQUxfS0lMTF9TV0lUQ0gsIDApOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGdldExvY2F0aW9uTW9kZSgpIHsKKyAgICAgICAgcmV0dXJuIFNlY3VyZS5nZXRJbnQoZ2V0Q29udGV4dCgpLmdldENvbnRlbnRSZXNvbHZlcigpLCBTZWN1cmUuTE9DQVRJT05fTU9ERSwgMCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJ1bldpdGhFeHBlY3RpbmdMb2NhdGlvbkNhbGxiYWNrKFJ1bm5hYmxlV2l0aFRocm93IHIpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDYWxsYmFja0Fzc2VydGVyIGxvY2F0aW9uTW9kZUJyb2FkY2FzdEFzc2VydGVyID0gQ2FsbGJhY2tBc3NlcnRlci5mb3JCcm9hZGNhc3QoCisgICAgICAgICAgICAgICAgbmV3IEludGVudEZpbHRlcihMb2NhdGlvbk1hbmFnZXIuTU9ERV9DSEFOR0VEX0FDVElPTikpOworICAgICAgICBDYWxsYmFja0Fzc2VydGVyIGxvY2F0aW9uTW9kZU9ic2VydmVyQXNzZXJ0ZXIgPSBDYWxsYmFja0Fzc2VydGVyLmZvckNvbnRlbnRVcmkoCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLmdldFVyaUZvcihTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQpKTsKKworICAgICAgICByLnJ1bigpOworCisgICAgICAgIGxvY2F0aW9uTW9kZUJyb2FkY2FzdEFzc2VydGVyLmFzc2VydENhbGxlZCgiQnJvYWRjYXN0IG5vdCByZWNlaXZlZCIsCisgICAgICAgICAgICAgICAgREVGQVVMVF9USU1FT1VUX1NFQ09ORFMpOworICAgICAgICBsb2NhdGlvbk1vZGVPYnNlcnZlckFzc2VydGVyLmFzc2VydENhbGxlZCgiT2JzZXJ2ZXIgbm90IG5vdGlmaWVkIiwKKyAgICAgICAgICAgICAgICBERUZBVUxUX1RJTUVPVVRfU0VDT05EUyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvYmF0dGVyeXNhdmluZy9zcmMvYW5kcm9pZC9vcy9jdHMvYmF0dGVyeXNhdmluZy9CYXR0ZXJ5U2F2ZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9iYXR0ZXJ5c2F2aW5nL3NyYy9hbmRyb2lkL29zL2N0cy9iYXR0ZXJ5c2F2aW5nL0JhdHRlcnlTYXZlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjQxNGEwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvYmF0dGVyeXNhdmluZy9zcmMvYW5kcm9pZC9vcy9jdHMvYmF0dGVyeXNhdmluZy9CYXR0ZXJ5U2F2ZXJUZXN0LmphdmEKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQub3MuY3RzLmJhdHRlcnlzYXZpbmc7CisKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5CYXR0ZXJ5VXRpbHMuZW5hYmxlQmF0dGVyeVNhdmVyOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkJhdHRlcnlVdGlscy5ydW5EdW1wc3lzQmF0dGVyeVVucGx1ZzsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKKworaW1wb3J0IGFuZHJvaWQub3MuUG93ZXJNYW5hZ2VyOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKKworLyoqCisgKiBUZXN0cyByZWxhdGVkIHRvIGJhdHRlcnkgc2F2ZXI6CisgKgorICogYXRlc3QgJEFORFJPSURfQlVJTERfVE9QL2N0cy90ZXN0cy90ZXN0cy9iYXR0ZXJ5c2F2aW5nL3NyYy9hbmRyb2lkL29zL2N0cy9iYXR0ZXJ5c2F2aW5nL0JhdHRlcnlTYXZlclRlc3QuamF2YQorICovCitATWVkaXVtVGVzdAorQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBCYXR0ZXJ5U2F2ZXJUZXN0IGV4dGVuZHMgQmF0dGVyeVNhdmluZ1Rlc3RCYXNlIHsKKyAgICAvKioKKyAgICAgKiBFbmFibGUgYmF0dGVyeSBzYXZlciBhbmQgbWFrZSBzdXJlIHRoZSByZWxldmFudCBjb21wb25lbnRzIGdldCBub3RpZmVkLgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWN0aXZhdGVCYXR0ZXJ5U2F2ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RmFsc2UoZ2V0UG93ZXJNYW5hZ2VyKCkuaXNQb3dlclNhdmVNb2RlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUG93ZXJNYW5hZ2VyLkxPQ0FUSU9OX01PREVfTk9fQ0hBTkdFLAorICAgICAgICAgICAgICAgIGdldFBvd2VyTWFuYWdlcigpLmdldExvY2F0aW9uUG93ZXJTYXZlTW9kZSgpKTsKKworICAgICAgICAvLyBVbnBsdWcgdGhlIGNoYXJnZXIuCisgICAgICAgIHJ1bkR1bXBzeXNCYXR0ZXJ5VW5wbHVnKCk7CisKKyAgICAgICAgLy8gQWN0aXZhdGUgYmF0dGVyeSBzYXZlci4KKyAgICAgICAgZW5hYmxlQmF0dGVyeVNhdmVyKHRydWUpOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgam9iIHNjaGVkdWxlciBhbmQgdGhlIGFsYXJtIG1hbmFnZXIgYXJlIGluZm9ybWVkLgorICAgICAgICB3YWl0VW50aWxBbGFybUZvcmNlQXBwU3RhbmRieSh0cnVlKTsKKyAgICAgICAgd2FpdFVudGlsSm9iRm9yY2VBcHBTdGFuZGJ5KHRydWUpOworICAgICAgICB3YWl0VW50aWxGb3JjZUJhY2tncm91bmRDaGVjayh0cnVlKTsKKworICAgICAgICAvLyBEZWFjdGl2YXRlLgorICAgICAgICAvLyBUbyBhdm9pZCB0b28gbXVjaCBjaHVybiwgbGV0J3Mgc2xlZXAgYSBsaXR0bGUgYml0IGJlZm9yZSBkZWFjdGl2YXRpbmcuCisgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKKworICAgICAgICBlbmFibGVCYXR0ZXJ5U2F2ZXIoZmFsc2UpOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgam9iIHNjaGVkdWxlciBhbmQgdGhlIGFsYXJtIG1hbmFnZXIgYXJlIGluZm9ybWVkLgorICAgICAgICB3YWl0VW50aWxBbGFybUZvcmNlQXBwU3RhbmRieShmYWxzZSk7CisgICAgICAgIHdhaXRVbnRpbEpvYkZvcmNlQXBwU3RhbmRieShmYWxzZSk7CisgICAgICAgIHdhaXRVbnRpbEZvcmNlQmFja2dyb3VuZENoZWNrKGZhbHNlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9iYXR0ZXJ5c2F2aW5nL3NyYy9hbmRyb2lkL29zL2N0cy9iYXR0ZXJ5c2F2aW5nL0JhdHRlcnlTYXZpbmdUZXN0QmFzZS5qYXZhIGIvdGVzdHMvdGVzdHMvYmF0dGVyeXNhdmluZy9zcmMvYW5kcm9pZC9vcy9jdHMvYmF0dGVyeXNhdmluZy9CYXR0ZXJ5U2F2aW5nVGVzdEJhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmZhY2E5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvYmF0dGVyeXNhdmluZy9zcmMvYW5kcm9pZC9vcy9jdHMvYmF0dGVyeXNhdmluZy9CYXR0ZXJ5U2F2aW5nVGVzdEJhc2UuamF2YQpAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQub3MuY3RzLmJhdHRlcnlzYXZpbmc7CisKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5CYXR0ZXJ5VXRpbHMuZW5hYmxlQmF0dGVyeVNhdmVyOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkJhdHRlcnlVdGlscy5ydW5EdW1wc3lzQmF0dGVyeVJlc2V0OworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkJhdHRlcnlVdGlscy50dXJuT25TY3JlZW47CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuU3lzdGVtVXRpbC5ydW5Db21tYW5kQW5kUHJpbnRPbkxvZ2NhdDsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5TeXN0ZW1VdGlsLnJ1blNoZWxsQ29tbWFuZDsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5UZXN0VXRpbHMud2FpdFVudGlsOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uTG9jYXRpb25NYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuQmF0dGVyeU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Qb3dlck1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkJhdHRlcnlVdGlsczsKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkJlZm9yZUFmdGVyUnVsZTsKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLk9uRmFpbHVyZVJ1bGU7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzdW1lOworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5SdWxlQ2hhaW47CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5EZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5tb2RlbC5TdGF0ZW1lbnQ7CisKK3B1YmxpYyBjbGFzcyBCYXR0ZXJ5U2F2aW5nVGVzdEJhc2UgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQmF0dGVyeVNhdmluZ1Rlc3RCYXNlIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfVElNRU9VVF9TRUNPTkRTID0gMzA7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKKworICAgIHByb3RlY3RlZCBmaW5hbCBCcm9hZGNhc3RScGMgbVJwYyA9IG5ldyBCcm9hZGNhc3RScGMoKTsKKworICAgIHByaXZhdGUgZmluYWwgT25GYWlsdXJlUnVsZSBtRHVtcE9uRmFpbHVyZVJ1bGUgPSBuZXcgT25GYWlsdXJlUnVsZShUQUcpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uVGVzdEZhaWx1cmUoU3RhdGVtZW50IGJhc2UsIERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLCBUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgcnVuQ29tbWFuZEFuZFByaW50T25Mb2djYXQoVEFHLCAiZHVtcHN5cyBwb3dlciIpOworICAgICAgICAgICAgcnVuQ29tbWFuZEFuZFByaW50T25Mb2djYXQoVEFHLCAiZHVtcHN5cyBhbGFybSIpOworICAgICAgICAgICAgcnVuQ29tbWFuZEFuZFByaW50T25Mb2djYXQoVEFHLCAiZHVtcHN5cyBqb2JzY2hlZHVsZXIiKTsKKyAgICAgICAgICAgIHJ1bkNvbW1hbmRBbmRQcmludE9uTG9nY2F0KFRBRywgImR1bXBzeXMgY29udGVudCIpOworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgZmluYWwgQmVmb3JlQWZ0ZXJSdWxlIG1Jbml0aWFsaXplQW5kQ2xlYW51cFJ1bGUgPSBuZXcgQmVmb3JlQWZ0ZXJSdWxlKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25CZWZvcmUoU3RhdGVtZW50IGJhc2UsIERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgICAgIEJhdHRlcnlVdGlscy5hc3N1bWVCYXR0ZXJ5U2F2ZXJGZWF0dXJlKCk7CisKKyAgICAgICAgICAgIHR1cm5PblNjcmVlbih0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkFmdGVyKFN0YXRlbWVudCBiYXNlLCBEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgICAgICBlbmFibGVCYXR0ZXJ5U2F2ZXIoZmFsc2UpOworICAgICAgICAgICAgcnVuRHVtcHN5c0JhdHRlcnlSZXNldCgpOworICAgICAgICAgICAgdHVybk9uU2NyZWVuKHRydWUpOworICAgICAgICB9CisgICAgfTsKKworICAgIEBSdWxlCisgICAgcHVibGljIFJ1bGVDaGFpbiBSdWxlcyA9IFJ1bGVDaGFpbi5vdXRlclJ1bGUobUluaXRpYWxpemVBbmRDbGVhbnVwUnVsZSkKKyAgICAgICAgICAgIC5hcm91bmQobUR1bXBPbkZhaWx1cmVSdWxlKTsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9nVGFnKCkgeworICAgICAgICByZXR1cm4gVEFHOworICAgIH0KKworICAgIC8qKiBQcmludCBhIGRlYnVnIGxvZyBvbiBsb2djYXQuICovCisgICAgcHVibGljIHZvaWQgZGVidWcoU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgaWYgKERFQlVHIHx8IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgTG9nLmQoZ2V0TG9nVGFnKCksIG1lc3NhZ2UpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd2FpdFVudGlsQWxhcm1Gb3JjZUFwcFN0YW5kYnkoYm9vbGVhbiBleHBlY3RlZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHdhaXRVbnRpbCgiRm9yY2UgYWxsIGFwcHMgc3RhbmRieSBzdGlsbCAiICsgIWV4cGVjdGVkICsgIiAoYWxhcm0pIiwgKCkgLT4KKyAgICAgICAgICAgICAgICBydW5TaGVsbENvbW1hbmQoImR1bXBzeXMgYWxhcm0iKS5jb250YWlucygiRm9yY2UgYWxsIGFwcHMgc3RhbmRieTogIiArIGV4cGVjdGVkKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd2FpdFVudGlsSm9iRm9yY2VBcHBTdGFuZGJ5KGJvb2xlYW4gZXhwZWN0ZWQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB3YWl0VW50aWwoIkZvcmNlIGFsbCBhcHBzIHN0YW5kYnkgc3RpbGwgIiArICFleHBlY3RlZCArICIgKGpvYikiLCAoKSAtPgorICAgICAgICAgICAgICAgIHJ1blNoZWxsQ29tbWFuZCgiZHVtcHN5cyBqb2JzY2hlZHVsZXIiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmNvbnRhaW5zKCJGb3JjZSBhbGwgYXBwcyBzdGFuZGJ5OiAiICsgZXhwZWN0ZWQpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3YWl0VW50aWxGb3JjZUJhY2tncm91bmRDaGVjayhib29sZWFuIGV4cGVjdGVkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgd2FpdFVudGlsKCJGb3JjZSBiYWNrZ3JvdW5kIGNoZWNrIHN0aWxsICIgKyAhZXhwZWN0ZWQgKyAiIChqb2IpIiwgKCkgLT4KKyAgICAgICAgICAgICAgICBydW5TaGVsbENvbW1hbmQoImR1bXBzeXMgYWN0aXZpdHkiKS5jb250YWlucygibUZvcmNlQmFja2dyb3VuZENoZWNrPSIgKyBleHBlY3RlZCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQ29udGV4dCBnZXRDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpOworICAgIH0KKworICAgIHB1YmxpYyBQYWNrYWdlTWFuYWdlciBnZXRQYWNrYWdlTWFuYWdlcigpIHsKKyAgICAgICAgcmV0dXJuIGdldENvbnRleHQoKS5nZXRQYWNrYWdlTWFuYWdlcigpOworICAgIH0KKworICAgIHB1YmxpYyBQb3dlck1hbmFnZXIgZ2V0UG93ZXJNYW5hZ2VyKCkgeworICAgICAgICByZXR1cm4gZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoUG93ZXJNYW5hZ2VyLmNsYXNzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQmF0dGVyeU1hbmFnZXIgZ2V0QmF0dGVyeU1hbmFnZXIoKSB7CisgICAgICAgIHJldHVybiBnZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShCYXR0ZXJ5TWFuYWdlci5jbGFzcyk7CisgICAgfQorCisgICAgcHVibGljIExvY2F0aW9uTWFuYWdlciBnZXRMb2NhdGlvbk1hbmFnZXIoKSB7CisgICAgICAgIHJldHVybiBnZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShMb2NhdGlvbk1hbmFnZXIuY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2JhdHRlcnlzYXZpbmcvc3JjL2FuZHJvaWQvb3MvY3RzL2JhdHRlcnlzYXZpbmcvQnJvYWRjYXN0UnBjLmphdmEgYi90ZXN0cy90ZXN0cy9iYXR0ZXJ5c2F2aW5nL3NyYy9hbmRyb2lkL29zL2N0cy9iYXR0ZXJ5c2F2aW5nL0Jyb2FkY2FzdFJwYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjODk1YWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9iYXR0ZXJ5c2F2aW5nL3NyYy9hbmRyb2lkL29zL2N0cy9iYXR0ZXJ5c2F2aW5nL0Jyb2FkY2FzdFJwYy5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLm9zLmN0cy5iYXR0ZXJ5c2F2aW5nOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQub3MuY3RzLmJhdHRlcnlzYXZpbmcuY29tbW9uLlZhbHVlcy5nZXRDb21tUmVjZWl2ZXI7CisKK2ltcG9ydCBhbmRyb2lkLm9zLmN0cy5iYXR0ZXJ5c2F2aW5nLmNvbW1vbi5CYXR0ZXJ5U2F2aW5nQ3RzQ29tbW9uLlBheWxvYWQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkJyb2FkY2FzdFJwY0Jhc2U7CisKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbjsKKworcHVibGljIGNsYXNzIEJyb2FkY2FzdFJwYyBleHRlbmRzIEJyb2FkY2FzdFJwY0Jhc2U8UGF5bG9hZCwgUGF5bG9hZD4geworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBieXRlW10gcmVxdWVzdFRvQnl0ZXMoUGF5bG9hZCB0ZXN0U2VydmljZVJlcXVlc3QpIHsKKyAgICAgICAgcmV0dXJuIHRlc3RTZXJ2aWNlUmVxdWVzdC50b0J5dGVBcnJheSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBQYXlsb2FkIGJ5dGVzVG9SZXNwb25zZShieXRlW10gYnl0ZXMpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBQYXlsb2FkLnBhcnNlRnJvbShieXRlcyk7CisgICAgICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIiwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgUGF5bG9hZCBzZW5kUmVxdWVzdChTdHJpbmcgdGFyZ2V0UGFja2FnZSwKKyAgICAgICAgICAgIFBheWxvYWQgdGVzdFNlcnZpY2VSZXF1ZXN0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmludm9rZShnZXRDb21tUmVjZWl2ZXIodGFyZ2V0UGFja2FnZSksIHRlc3RTZXJ2aWNlUmVxdWVzdCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvYmlvbmljL0FuZHJvaWQuYnVpbGQuY29weS5saWJzLm1rIGIvdGVzdHMvdGVzdHMvYmlvbmljL0FuZHJvaWQuYnVpbGQuY29weS5saWJzLm1rCmluZGV4IDUwMTZlMzMuLjEzZDQ5OWEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2Jpb25pYy9BbmRyb2lkLmJ1aWxkLmNvcHkubGlicy5taworKysgYi90ZXN0cy90ZXN0cy9iaW9uaWMvQW5kcm9pZC5idWlsZC5jb3B5LmxpYnMubWsKQEAgLTE2LDEwOSArMTYsMTIyIEBACiAgIGR0X3J1bnBhdGhfYl9jX3gvbGlidGVzdF9kdF9ydW5wYXRoX2Iuc28gXAogICBkdF9ydW5wYXRoX2JfY194L2xpYnRlc3RfZHRfcnVucGF0aF9jLnNvIFwKICAgZHRfcnVucGF0aF9iX2NfeC9saWJ0ZXN0X2R0X3J1bnBhdGhfeC5zbyBcCisgIGluYWNjZXNzaWJsZV9saWJzL2xpYnRlc3RzaGFyZWQuc28gXAorICBpbmFjY2Vzc2libGVfbGlicy9saWJ0ZXN0c2hhcmVkLnNvIFwKKyAgbGRfY29uZmlnX3Rlc3RfaGVscGVyL2xkX2NvbmZpZ190ZXN0X2hlbHBlciBcCisgIGxkX2NvbmZpZ190ZXN0X2hlbHBlcl9saWIzLnNvIFwKKyAgbGRfcHJlbG9hZF90ZXN0X2hlbHBlci9sZF9wcmVsb2FkX3Rlc3RfaGVscGVyIFwKKyAgbGRfcHJlbG9hZF90ZXN0X2hlbHBlcl9saWIxLnNvIFwKKyAgbGRfcHJlbG9hZF90ZXN0X2hlbHBlcl9saWIyLnNvIFwKICAgbGliYXRlc3Rfc2ltcGxlX3ppcC9saWJhdGVzdF9zaW1wbGVfemlwLnNvIFwKLSAgbGliY2ZpLXRlc3Quc28gXAogICBsaWJjZmktdGVzdC1iYWQuc28gXAorICBsaWJjZmktdGVzdC5zbyBcCisgIGxpYmRsX3ByZWVtcHRfdGVzdF8xLnNvIFwKKyAgbGliZGxfcHJlZW1wdF90ZXN0XzIuc28gXAorICBsaWJkbF90ZXN0X2RmXzFfZ2xvYmFsLnNvIFwKKyAgbGliZGxleHRfdGVzdC5zbyBcCiAgIGxpYmRsZXh0X3Rlc3RfZGlmZmVyZW50X3NvbmFtZS5zbyBcCiAgIGxpYmRsZXh0X3Rlc3RfZmQvbGliZGxleHRfdGVzdF9mZC5zbyBcCiAgIGxpYmRsZXh0X3Rlc3Rfbm9yZWxyby5zbyBcCiAgIGxpYmRsZXh0X3Rlc3RfcnVucGF0aF96aXAvbGliZGxleHRfdGVzdF9ydW5wYXRoX3ppcF96aXBhbGlnbmVkLnppcCBcCi0gIGxpYmRsZXh0X3Rlc3Quc28gXAogICBsaWJkbGV4dF90ZXN0X3ppcC9saWJkbGV4dF90ZXN0X3ppcC5zbyBcCiAgIGxpYmRsZXh0X3Rlc3RfemlwL2xpYmRsZXh0X3Rlc3RfemlwX3ppcGFsaWduZWQuemlwIFwKLSAgbGliZGxfcHJlZW1wdF90ZXN0XzEuc28gXAotICBsaWJkbF9wcmVlbXB0X3Rlc3RfMi5zbyBcCi0gIGxpYmRsX3Rlc3RfZGZfMV9nbG9iYWwuc28gXAorICBsaWJlbGYtdGxzLWxpYnJhcnkuc28gXAogICBsaWJzeXN2LWhhc2gtdGFibGUtbGlicmFyeS5zbyBcCiAgIGxpYnRlc3RfYXRleGl0LnNvIFwKKyAgbGlidGVzdF9jaGVja19vcmRlcl9kbHN5bS5zbyBcCiAgIGxpYnRlc3RfY2hlY2tfb3JkZXJfZGxzeW1fMV9sZWZ0LnNvIFwKICAgbGlidGVzdF9jaGVja19vcmRlcl9kbHN5bV8yX3JpZ2h0LnNvIFwKICAgbGlidGVzdF9jaGVja19vcmRlcl9kbHN5bV8zX2Muc28gXAogICBsaWJ0ZXN0X2NoZWNrX29yZGVyX2Rsc3ltX2Euc28gXAogICBsaWJ0ZXN0X2NoZWNrX29yZGVyX2Rsc3ltX2Iuc28gXAogICBsaWJ0ZXN0X2NoZWNrX29yZGVyX2Rsc3ltX2Quc28gXAotICBsaWJ0ZXN0X2NoZWNrX29yZGVyX2Rsc3ltLnNvIFwKKyAgbGlidGVzdF9jaGVja19vcmRlcl9yZWxvY19yb290LnNvIFwKICAgbGlidGVzdF9jaGVja19vcmRlcl9yZWxvY19yb290XzEuc28gXAogICBsaWJ0ZXN0X2NoZWNrX29yZGVyX3JlbG9jX3Jvb3RfMi5zbyBcCi0gIGxpYnRlc3RfY2hlY2tfb3JkZXJfcmVsb2Nfcm9vdC5zbyBcCisgIGxpYnRlc3RfY2hlY2tfb3JkZXJfcmVsb2Nfc2libGluZ3Muc28gXAogICBsaWJ0ZXN0X2NoZWNrX29yZGVyX3JlbG9jX3NpYmxpbmdzXzEuc28gXAogICBsaWJ0ZXN0X2NoZWNrX29yZGVyX3JlbG9jX3NpYmxpbmdzXzIuc28gXAogICBsaWJ0ZXN0X2NoZWNrX29yZGVyX3JlbG9jX3NpYmxpbmdzXzMuc28gXAogICBsaWJ0ZXN0X2NoZWNrX29yZGVyX3JlbG9jX3NpYmxpbmdzX2Euc28gXAogICBsaWJ0ZXN0X2NoZWNrX29yZGVyX3JlbG9jX3NpYmxpbmdzX2Iuc28gXAorICBsaWJ0ZXN0X2NoZWNrX29yZGVyX3JlbG9jX3NpYmxpbmdzX2Muc28gXAogICBsaWJ0ZXN0X2NoZWNrX29yZGVyX3JlbG9jX3NpYmxpbmdzX2NfMS5zbyBcCiAgIGxpYnRlc3RfY2hlY2tfb3JkZXJfcmVsb2Nfc2libGluZ3NfY18yLnNvIFwKLSAgbGlidGVzdF9jaGVja19vcmRlcl9yZWxvY19zaWJsaW5nc19jLnNvIFwKICAgbGlidGVzdF9jaGVja19vcmRlcl9yZWxvY19zaWJsaW5nc19kLnNvIFwKICAgbGlidGVzdF9jaGVja19vcmRlcl9yZWxvY19zaWJsaW5nc19lLnNvIFwKICAgbGlidGVzdF9jaGVja19vcmRlcl9yZWxvY19zaWJsaW5nc19mLnNvIFwKLSAgbGlidGVzdF9jaGVja19vcmRlcl9yZWxvY19zaWJsaW5ncy5zbyBcCiAgIGxpYnRlc3RfY2hlY2tfcnRsZF9uZXh0X2Zyb21fbGlicmFyeS5zbyBcCi0gIGxpYnRlc3RfZGxvcGVuX2Zyb21fY3Rvcl9tYWluLnNvIFwKKyAgbGlidGVzdF9kbG9wZW5fZGZfMV9nbG9iYWwuc28gXAogICBsaWJ0ZXN0X2Rsb3Blbl9mcm9tX2N0b3Iuc28gXAorICBsaWJ0ZXN0X2Rsb3Blbl9mcm9tX2N0b3JfbWFpbi5zbyBcCiAgIGxpYnRlc3RfZGxvcGVuX3dlYWtfdW5kZWZpbmVkX2Z1bmMuc28gXAogICBsaWJ0ZXN0X2Rsc3ltX2RmXzFfZ2xvYmFsLnNvIFwKKyAgbGlidGVzdF9kbHN5bV9mcm9tX3RoaXMuc28gXAogICBsaWJ0ZXN0X2Rsc3ltX2Zyb21fdGhpc19jaGlsZC5zbyBcCiAgIGxpYnRlc3RfZGxzeW1fZnJvbV90aGlzX2dyYW5kY2hpbGQuc28gXAotICBsaWJ0ZXN0X2Rsc3ltX2Zyb21fdGhpcy5zbyBcCiAgIGxpYnRlc3RfZGxzeW1fd2Vha19mdW5jLnNvIFwKICAgbGlidGVzdF9kdF9ydW5wYXRoX2Quc28gXAogICBsaWJ0ZXN0X2VtcHR5LnNvIFwKICAgbGlidGVzdF9pbml0X2Zpbmlfb3JkZXJfY2hpbGQuc28gXAogICBsaWJ0ZXN0X2luaXRfZmluaV9vcmRlcl9ncmFuZF9jaGlsZC5zbyBcCi0gIGxpYnRlc3RfaW5pdF9maW5pX29yZGVyX3Jvb3QyLnNvIFwKICAgbGlidGVzdF9pbml0X2Zpbmlfb3JkZXJfcm9vdC5zbyBcCisgIGxpYnRlc3RfaW5pdF9maW5pX29yZGVyX3Jvb3QyLnNvIFwKICAgbGlidGVzdF9ub2RlbGV0ZV8xLnNvIFwKICAgbGlidGVzdF9ub2RlbGV0ZV8yLnNvIFwKICAgbGlidGVzdF9ub2RlbGV0ZV9kdF9mbGFnc18xLnNvIFwKICAgbGlidGVzdF9wdGhyZWFkX2F0Zm9yay5zbyBcCisgIGxpYnRlc3RfcmVsb19jaGVja19kdF9uZWVkZWRfb3JkZXIuc28gXAogICBsaWJ0ZXN0X3JlbG9fY2hlY2tfZHRfbmVlZGVkX29yZGVyXzEuc28gXAogICBsaWJ0ZXN0X3JlbG9fY2hlY2tfZHRfbmVlZGVkX29yZGVyXzIuc28gXAotICBsaWJ0ZXN0X3JlbG9fY2hlY2tfZHRfbmVlZGVkX29yZGVyLnNvIFwKICAgbGlidGVzdF9zaW1wbGUuc28gXAorICBsaWJ0ZXN0X3RocmVhZF9sb2NhbF9kdG9yLnNvIFwKICAgbGlidGVzdF90d29fcGFyZW50c19jaGlsZC5zbyBcCiAgIGxpYnRlc3RfdHdvX3BhcmVudHNfcGFyZW50MS5zbyBcCiAgIGxpYnRlc3RfdHdvX3BhcmVudHNfcGFyZW50Mi5zbyBcCiAgIGxpYnRlc3RfdmVyc2lvbmVkX2xpYi5zbyBcCiAgIGxpYnRlc3RfdmVyc2lvbmVkX2xpYnYxLnNvIFwKICAgbGlidGVzdF92ZXJzaW9uZWRfbGlidjIuc28gXAotICBsaWJ0ZXN0X3ZlcnNpb25lZF9vdGhlcmxpYl9lbXB0eS5zbyBcCiAgIGxpYnRlc3RfdmVyc2lvbmVkX290aGVybGliLnNvIFwKKyAgbGlidGVzdF92ZXJzaW9uZWRfb3RoZXJsaWJfZW1wdHkuc28gXAogICBsaWJ0ZXN0X3ZlcnNpb25lZF91c2VsaWJ2MS5zbyBcCi0gIGxpYnRlc3RfdmVyc2lvbmVkX3VzZWxpYnYyX290aGVyLnNvIFwKICAgbGlidGVzdF92ZXJzaW9uZWRfdXNlbGlidjIuc28gXAorICBsaWJ0ZXN0X3ZlcnNpb25lZF91c2VsaWJ2Ml9vdGhlci5zbyBcCiAgIGxpYnRlc3RfdmVyc2lvbmVkX3VzZWxpYnYzX290aGVyLnNvIFwKKyAgbGlidGVzdF93aXRoX2RlcGVuZGVuY3kuc28gXAorICBsaWJ0ZXN0X3dpdGhfZGVwZW5kZW5jeV9sb29wLnNvIFwKICAgbGlidGVzdF93aXRoX2RlcGVuZGVuY3lfbG9vcF9hLnNvIFwKICAgbGlidGVzdF93aXRoX2RlcGVuZGVuY3lfbG9vcF9iLnNvIFwKICAgbGlidGVzdF93aXRoX2RlcGVuZGVuY3lfbG9vcF9iX3RtcC5zbyBcCiAgIGxpYnRlc3Rfd2l0aF9kZXBlbmRlbmN5X2xvb3BfYy5zbyBcCi0gIGxpYnRlc3Rfd2l0aF9kZXBlbmRlbmN5X2xvb3Auc28gXAotICBsaWJ0ZXN0X3dpdGhfZGVwZW5kZW5jeS5zbyBcCisgIG5zMi9sZF9jb25maWdfdGVzdF9oZWxwZXJfbGliMS5zbyBcCisgIG5zMi9sZF9jb25maWdfdGVzdF9oZWxwZXJfbGliMi5zbyBcCisgIG5zX2EvbGlibnN0ZXN0X25zX2FfcHVibGljMS5zbyBcCisgIG5zX2EvbGlibnN0ZXN0X25zX2FfcHVibGljMV9pbnRlcm5hbC5zbyBcCisgIG5zX2IvbGlibnN0ZXN0X25zX2JfcHVibGljMi5zbyBcCisgIG5zX2IvbGlibnN0ZXN0X25zX2JfcHVibGljMy5zbyBcCiAgIHByZWJ1aWx0LWVsZi1maWxlcy9saWJ0ZXN0X2ludmFsaWQtZW1wdHlfc2hkcl90YWJsZS5zbyBcCiAgIHByZWJ1aWx0LWVsZi1maWxlcy9saWJ0ZXN0X2ludmFsaWQtcndfbG9hZF9zZWdtZW50LnNvIFwKKyAgcHJlYnVpbHQtZWxmLWZpbGVzL2xpYnRlc3RfaW52YWxpZC10ZXh0cmVscy5zbyBcCisgIHByZWJ1aWx0LWVsZi1maWxlcy9saWJ0ZXN0X2ludmFsaWQtdGV4dHJlbHMyLnNvIFwKICAgcHJlYnVpbHQtZWxmLWZpbGVzL2xpYnRlc3RfaW52YWxpZC11bmFsaWduZWRfc2hkcl9vZmZzZXQuc28gXAogICBwcmVidWlsdC1lbGYtZmlsZXMvbGlidGVzdF9pbnZhbGlkLXplcm9fc2hkcl90YWJsZV9jb250ZW50LnNvIFwKICAgcHJlYnVpbHQtZWxmLWZpbGVzL2xpYnRlc3RfaW52YWxpZC16ZXJvX3NoZHJfdGFibGVfb2Zmc2V0LnNvIFwKICAgcHJlYnVpbHQtZWxmLWZpbGVzL2xpYnRlc3RfaW52YWxpZC16ZXJvX3NoZW50c2l6ZS5zbyBcCiAgIHByZWJ1aWx0LWVsZi1maWxlcy9saWJ0ZXN0X2ludmFsaWQtemVyb19zaHN0cm5keC5zbyBcCi0gIHByZWJ1aWx0LWVsZi1maWxlcy9saWJ0ZXN0X2ludmFsaWQtdGV4dHJlbHMuc28gXAotICBwcmVidWlsdC1lbGYtZmlsZXMvbGlidGVzdF9pbnZhbGlkLXRleHRyZWxzMi5zbyBcCiAgIHByZWluaXRfZ2V0YXV4dmFsX3Rlc3RfaGVscGVyL3ByZWluaXRfZ2V0YXV4dmFsX3Rlc3RfaGVscGVyIFwKICAgcHJlaW5pdF9zeXNjYWxsX3Rlc3RfaGVscGVyL3ByZWluaXRfc3lzY2FsbF90ZXN0X2hlbHBlciBcCi0gIHByaXZhdGVfbmFtZXNwYWNlX2xpYnNfZXh0ZXJuYWwvbGlibnN0ZXN0X3ByaXZhdGVfZXh0ZXJuYWwuc28gXAogICBwcml2YXRlX25hbWVzcGFjZV9saWJzL2xpYm5zdGVzdF9kbG9wZW5lZC5zbyBcCiAgIHByaXZhdGVfbmFtZXNwYWNlX2xpYnMvbGlibnN0ZXN0X3ByaXZhdGUuc28gXAotICBwcml2YXRlX25hbWVzcGFjZV9saWJzL2xpYm5zdGVzdF9yb290X25vdF9pc29sYXRlZC5zbyBcCiAgIHByaXZhdGVfbmFtZXNwYWNlX2xpYnMvbGlibnN0ZXN0X3Jvb3Quc28gXAorICBwcml2YXRlX25hbWVzcGFjZV9saWJzL2xpYm5zdGVzdF9yb290X25vdF9pc29sYXRlZC5zbyBcCisgIHByaXZhdGVfbmFtZXNwYWNlX2xpYnMvbGlidGVzdF9taXNzaW5nX3N5bWJvbF9jaGlsZF9wcml2YXRlLnNvIFwKKyAgcHJpdmF0ZV9uYW1lc3BhY2VfbGlicy9saWJ0ZXN0X21pc3Npbmdfc3ltYm9sX3Jvb3Quc28gXAorICBwcml2YXRlX25hbWVzcGFjZV9saWJzX2V4dGVybmFsL2xpYm5zdGVzdF9wcml2YXRlX2V4dGVybmFsLnNvIFwKICAgcHVibGljX25hbWVzcGFjZV9saWJzL2xpYm5zdGVzdF9wdWJsaWMuc28gXAogICBwdWJsaWNfbmFtZXNwYWNlX2xpYnMvbGlibnN0ZXN0X3B1YmxpY19pbnRlcm5hbC5zbyBcCi0gIGxkX3ByZWxvYWRfdGVzdF9oZWxwZXIvbGRfcHJlbG9hZF90ZXN0X2hlbHBlciBcCi0gIGxkX3ByZWxvYWRfdGVzdF9oZWxwZXJfbGliMS5zbyBcCi0gIGxkX3ByZWxvYWRfdGVzdF9oZWxwZXJfbGliMi5zbyBcCi0gIGxkX2NvbmZpZ190ZXN0X2hlbHBlci9sZF9jb25maWdfdGVzdF9oZWxwZXIgXAotICBuczIvbGRfY29uZmlnX3Rlc3RfaGVscGVyX2xpYjEuc28gXAotICBuczIvbGRfY29uZmlnX3Rlc3RfaGVscGVyX2xpYjIuc28gXAotICBsZF9jb25maWdfdGVzdF9oZWxwZXJfbGliMy5zbyBcCisgIHB1YmxpY19uYW1lc3BhY2VfbGlicy9saWJ0ZXN0X21pc3Npbmdfc3ltYm9sLnNvIFwKKyAgcHVibGljX25hbWVzcGFjZV9saWJzL2xpYnRlc3RfbWlzc2luZ19zeW1ib2xfY2hpbGRfcHVibGljLnNvIFwKIAogIyBUaGVzZSBsaWJyYXJpZXMgYXJlIG5vdCBidWlsdCBmb3IgbWlwcy4KIG15X2Jpb25pY190ZXN0bGliX2ZpbGVzX25vbl9taXBzIDo9IFwKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2Jpb25pYy9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvYmlvbmljL0FuZHJvaWQubWsKaW5kZXggMDA0NDhmMy4uZTVkNDM0MCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvYmlvbmljL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvdGVzdHMvYmlvbmljL0FuZHJvaWQubWsKQEAgLTcsOSArNywxMiBAQAogTE9DQUxfTU9EVUxFX1NURU1fMzIgOj0gJChMT0NBTF9NT0RVTEUpMzIKIExPQ0FMX01PRFVMRV9TVEVNXzY0IDo9ICQoTE9DQUxfTU9EVUxFKTY0CiAKK0xPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yCisKIExPQ0FMX0xERkxBR1MgOj0gLVdsLC0tcnBhdGgsXCQke09SSUdJTn0vbGliL2Jpb25pYy1sb2FkZXItdGVzdC1saWJzIC1XbCwtLWVuYWJsZS1uZXctZHRhZ3MgLVdsLC0tZXhwb3J0LWR5bmFtaWMKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBcCisgICAgbGQtYW5kcm9pZCBcCiAgICAgbGliZGwgXAogICAgIGxpYmRsX3ByZWVtcHRfdGVzdF8xIFwKICAgICBsaWJkbF9wcmVlbXB0X3Rlc3RfMiBcCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9iaW9uaWMvQW5kcm9pZFRlc3QueG1sIGIvdGVzdHMvdGVzdHMvYmlvbmljL0FuZHJvaWRUZXN0LnhtbAppbmRleCBjZTEzMzA3Li5mNmQyYjA5IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9iaW9uaWMvQW5kcm9pZFRlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL2Jpb25pYy9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBCaW9uaWMgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImJpb25pYyIgLz4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50YXJnZXRwcmVwLkZpbGVQdXNoZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJ0cnVlIiAvPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvYmx1ZXRvb3RoL0FuZHJvaWQubWsgYi90ZXN0cy90ZXN0cy9ibHVldG9vdGgvQW5kcm9pZC5tawppbmRleCAxYWY0YTNmLi5hYjA2ZTkzIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ibHVldG9vdGgvQW5kcm9pZC5taworKysgYi90ZXN0cy90ZXN0cy9ibHVldG9vdGgvQW5kcm9pZC5tawpAQCAtMjQsOCArMjQsOSBAQAogIyBXaGVuIGJ1aWx0LCBleHBsaWNpdGx5IHB1dCBpdCBpbiB0aGUgZGF0YSBwYXJ0aXRpb24uCiBMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQogCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY3RzdGVzdHJ1bm5lciBsZWdhY3ktYW5kcm9pZC10ZXN0Ci1MT0NBTF9KQVZBX0xJQlJBUklFUyArPSBhbmRyb2lkLnRlc3QucnVubmVyCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY3RzdGVzdHJ1bm5lci1heHQKK0xPQ0FMX0pBVkFfTElCUkFSSUVTICs9IGFuZHJvaWQudGVzdC5ydW5uZXIuc3R1YnMKK0xPQ0FMX0pBVkFfTElCUkFSSUVTICs9IGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvYmx1ZXRvb3RoL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy90ZXN0cy9ibHVldG9vdGgvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA0ZWI5Y2Q5Li40NWIwNWMxIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ibHVldG9vdGgvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9ibHVldG9vdGgvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjksNyArMjksNyBAQAogICAgIDwvYXBwbGljYXRpb24+CiAKICAgICA8IS0tIFRoaXMgaXMgYSBzZWxmLWluc3RydW1lbnRpbmcgdGVzdCBwYWNrYWdlLiAtLT4KLSAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmJsdWV0b290aC5jdHMiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgdGVzdHMgb2YgYmx1ZXRvb3RoIGNvbXBvbmVudCI+CiAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJsaXN0ZW5lciIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2JsdWV0b290aC9zcmMvYW5kcm9pZC9ibHVldG9vdGgvY3RzL0JsdWV0b290aExlU2NhblRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2JsdWV0b290aC9zcmMvYW5kcm9pZC9ibHVldG9vdGgvY3RzL0JsdWV0b290aExlU2NhblRlc3QuamF2YQppbmRleCA3YTY0NGMxLi4xODUzNzQxIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ibHVldG9vdGgvc3JjL2FuZHJvaWQvYmx1ZXRvb3RoL2N0cy9CbHVldG9vdGhMZVNjYW5UZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvYmx1ZXRvb3RoL3NyYy9hbmRyb2lkL2JsdWV0b290aC9jdHMvQmx1ZXRvb3RoTGVTY2FuVGVzdC5qYXZhCkBAIC0xOSw3ICsxOSw2IEBACiBpbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhBZGFwdGVyOwogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aE1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguY3RzLkJsdWV0b290aFNjYW5SZWNlaXZlcjsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5sZS5CbHVldG9vdGhMZVNjYW5uZXI7CiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGgubGUuU2NhbkNhbGxiYWNrOwogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLmxlLlNjYW5GaWx0ZXI7CkBAIC0zMSwxMiArMzAsMTMgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxVdWlkOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTWVkaXVtVGVzdDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CisKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKQEAgLTYxLDggKzYxLDEwIEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkJsdWV0b290aExlU2NhblRlc3QiOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNDQU5fRFVSQVRJT05fTUlMTElTID0gNTAwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0NBTl9EVVJBVElPTl9NSUxMSVMgPSAxMDAwMDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQkFUQ0hfU0NBTl9SRVBPUlRfREVMQVlfTUlMTElTID0gMjAwMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNDQU5fU1RPUF9USU1FT1VUID0gMjAwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQURBUFRFUl9FTkFCTEVfVElNRU9VVCA9IDMwMDA7CiAgICAgcHJpdmF0ZSBDb3VudERvd25MYXRjaCBtRmx1c2hCYXRjaFNjYW5MYXRjaDsKIAogICAgIHByaXZhdGUgQmx1ZXRvb3RoQWRhcHRlciBtQmx1ZXRvb3RoQWRhcHRlcjsKQEAgLTgyLDIzICs4NCwyOSBAQAogICAgICAgICAgICAgLy8gTm90ZSBpdCdzIG5vdCByZWxpYWJsZSB0byBsaXN0ZW4gZm9yIEFkYXB0ZXIuQUNUSU9OX1NUQVRFX0NIQU5HRUQgYnJvYWRjYXN0IGFuZCBjaGVjawogICAgICAgICAgICAgLy8gYmx1ZXRvb3RoIHN0YXRlLgogICAgICAgICAgICAgbUJsdWV0b290aEFkYXB0ZXIuZW5hYmxlKCk7Ci0gICAgICAgICAgICBzbGVlcCgzMDAwKTsKKyAgICAgICAgICAgIHNsZWVwKEFEQVBURVJfRU5BQkxFX1RJTUVPVVQpOwogICAgICAgICB9CiAgICAgICAgIG1TY2FubmVyID0gbUJsdWV0b290aEFkYXB0ZXIuZ2V0Qmx1ZXRvb3RoTGVTY2FubmVyKCk7CiAgICAgICAgIG1Mb2NhdGlvbk9uID0gVGVzdFV0aWxzLmlzTG9jYXRpb25PbihnZXRDb250ZXh0KCkpOwogICAgICAgICBpZiAoIW1Mb2NhdGlvbk9uKSB7CiAgICAgICAgICAgICBUZXN0VXRpbHMuZW5hYmxlTG9jYXRpb24oZ2V0Q29udGV4dCgpKTsKICAgICAgICAgfQotICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKS5nZXRVaUF1dG9tYXRpb24oKS5leGVjdXRlU2hlbGxDb21tYW5kKAotICAgICAgICAgICAgICAgICJwbSBncmFudCBhbmRyb2lkLmJsdWV0b290aC5jdHMgYW5kcm9pZC5wZXJtaXNzaW9uLkFDQ0VTU19DT0FSU0VfTE9DQVRJT04iCi0gICAgICAgICk7CisgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLmdldFVpQXV0b21hdGlvbigpLmdyYW50UnVudGltZVBlcm1pc3Npb24oCisgICAgICAgICAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLmN0cyIsIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5BQ0NFU1NfQ09BUlNFX0xPQ0FUSU9OKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKKyAgICAgICAgaWYgKCFpc0JsZVN1cHBvcnRlZCgpKSB7CisgICAgICAgICAgLy8gbUJsdWV0b290aEFkYXB0ZXIgPT0gbnVsbC4KKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKwogICAgICAgICBpZiAoIW1Mb2NhdGlvbk9uKSB7CiAgICAgICAgICAgICBUZXN0VXRpbHMuZGlzYWJsZUxvY2F0aW9uKGdldENvbnRleHQoKSk7CiAgICAgICAgIH0KKyAgICAgICAgbUJsdWV0b290aEFkYXB0ZXIuZGlzYWJsZSgpOworICAgICAgICBzbGVlcChBREFQVEVSX0VOQUJMRV9USU1FT1VUKTsKICAgICB9CiAKICAgICAvKioKQEAgLTExMiw2ICsxMjAsNyBAQAogICAgICAgICBsb25nIHNjYW5TdGFydE1pbGxpcyA9IFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpOwogICAgICAgICBDb2xsZWN0aW9uPFNjYW5SZXN1bHQ+IHNjYW5SZXN1bHRzID0gc2NhbigpOwogICAgICAgICBsb25nIHNjYW5FbmRNaWxsaXMgPSBTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKTsKKyAgICAgICAgTG9nLmQoVEFHLCAic2NhbiByZXN1bHQgc2l6ZToiICsgc2NhblJlc3VsdHMuc2l6ZSgpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiU2NhbiByZXN1bHRzIHNob3VsZG4ndCBiZSBlbXB0eSIsICFzY2FuUmVzdWx0cy5pc0VtcHR5KCkpOwogICAgICAgICB2ZXJpZnlUaW1lc3RhbXAoc2NhblJlc3VsdHMsIHNjYW5TdGFydE1pbGxpcywgc2NhbkVuZE1pbGxpcyk7CiAgICAgfQpAQCAtMTQwLDcgKzE0OSw3IEBACiAgICAgICAgIG1TY2FubmVyLnN0YXJ0U2NhbihmaWx0ZXJzLCBzZXR0aW5ncywgZmlsdGVyTGVTY2FuQ2FsbGJhY2spOwogICAgICAgICBzbGVlcChTQ0FOX0RVUkFUSU9OX01JTExJUyk7CiAgICAgICAgIG1TY2FubmVyLnN0b3BTY2FuKGZpbHRlckxlU2NhbkNhbGxiYWNrKTsKLSAgICAgICAgc2xlZXAoMTAwMCk7CisgICAgICAgIHNsZWVwKFNDQU5fU1RPUF9USU1FT1VUKTsKICAgICAgICAgQ29sbGVjdGlvbjxTY2FuUmVzdWx0PiBzY2FuUmVzdWx0cyA9IGZpbHRlckxlU2NhbkNhbGxiYWNrLmdldFNjYW5SZXN1bHRzKCk7CiAgICAgICAgIGZvciAoU2NhblJlc3VsdCByZXN1bHQgOiBzY2FuUmVzdWx0cykgewogICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmaWx0ZXIubWF0Y2hlcyhyZXN1bHQpKTsKQEAgLTE3OCw1NCArMTg3LDU4IEBACiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFRlc3Qgb2Ygb3Bwb3J0dW5pc3RpYyBCTEUgc2NhbnMuCi0gICAgICovCi0gICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3Bwb3J0dW5pc3RpY1NjYW4oKSB7Ci0gICAgICAgIC8vU2tpcHBpbmcgdGVzdCBhcyBpdCBpcyBmbGFra3kgYW5kIG5lZWRzIGltcHJvdm1lbnQuCi0gICAgICAgIHJldHVybjsKLQotICAgICAgICAvKmlmICghaXNCbGVTdXBwb3J0ZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIFNjYW5TZXR0aW5ncyBvcHBvcnR1bmlzdGljU2NhblNldHRpbmdzID0gbmV3IFNjYW5TZXR0aW5ncy5CdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAuc2V0U2Nhbk1vZGUoU2NhblNldHRpbmdzLlNDQU5fTU9ERV9PUFBPUlRVTklTVElDKQotICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICAgICAgICBCbGVTY2FuQ2FsbGJhY2sgZW1wdHlTY2FuQ2FsbGJhY2sgPSBuZXcgQmxlU2NhbkNhbGxiYWNrKCk7Ci0KLSAgICAgICAgLy8gTm8gc2NhbnMgYXJlIHJlYWxseSBzdGFydGVkIHdpdGggb3Bwb3J0dW5pc3RpYyBzY2FucyBvbmx5LgotICAgICAgICBtU2Nhbm5lci5zdGFydFNjYW4oQ29sbGVjdGlvbnMuPFNjYW5GaWx0ZXI+ZW1wdHlMaXN0KCksIG9wcG9ydHVuaXN0aWNTY2FuU2V0dGluZ3MsCi0gICAgICAgICAgICAgICAgZW1wdHlTY2FuQ2FsbGJhY2spOwotICAgICAgICBzbGVlcChTQ0FOX0RVUkFUSU9OX01JTExJUyk7Ci0gICAgICAgIGFzc2VydFRydWUoZW1wdHlTY2FuQ2FsbGJhY2suZ2V0U2NhblJlc3VsdHMoKS5pc0VtcHR5KCkpOwotCi0gICAgICAgIEJsZVNjYW5DYWxsYmFjayByZWd1bGFyU2NhbkNhbGxiYWNrID0gbmV3IEJsZVNjYW5DYWxsYmFjaygpOwotICAgICAgICBTY2FuU2V0dGluZ3MgcmVndWxhclNjYW5TZXR0aW5ncyA9IG5ldyBTY2FuU2V0dGluZ3MuQnVpbGRlcigpCi0gICAgICAgICAgICAgICAgLnNldFNjYW5Nb2RlKFNjYW5TZXR0aW5ncy5TQ0FOX01PREVfTE9XX0xBVEVOQ1kpLmJ1aWxkKCk7Ci0gICAgICAgIExpc3Q8U2NhbkZpbHRlcj4gZmlsdGVycyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBTY2FuRmlsdGVyIGZpbHRlciA9IGNyZWF0ZVNjYW5GaWx0ZXIoKTsKLSAgICAgICAgaWYgKGZpbHRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaWx0ZXJzLmFkZChmaWx0ZXIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAibm8gYXBwcm9wcmlhdGUgZmlsdGVyIGNhbiBiZSBzZXQiKTsKLSAgICAgICAgfQotICAgICAgICBtU2Nhbm5lci5zdGFydFNjYW4oZmlsdGVycywgcmVndWxhclNjYW5TZXR0aW5ncywgcmVndWxhclNjYW5DYWxsYmFjayk7Ci0gICAgICAgIHNsZWVwKFNDQU5fRFVSQVRJT05fTUlMTElTKTsKLSAgICAgICAgLy8gV2l0aCBub3JtYWwgQkxFIHNjYW4gY2xpZW50LCBvcHBvcnR1bmlzdGljIHNjYW4gY2xpZW50IHdpbGwgZ2V0IHNjYW4gcmVzdWx0cy4KLSAgICAgICAgYXNzZXJ0VHJ1ZSgib3Bwb3J0dW5pc3RpYyBzY2FuIHJlc3VsdHMgc2hvdWxkbid0IGJlIGVtcHR5IiwKLSAgICAgICAgICAgICAgICAhZW1wdHlTY2FuQ2FsbGJhY2suZ2V0U2NhblJlc3VsdHMoKS5pc0VtcHR5KCkpOwotCi0gICAgICAgIC8vIE5vIG1vcmUgc2NhbiByZXN1bHRzIGZvciBvcHBvcnR1bmlzdGljIHNjYW4gY2xpZW50cyBvbmNlIHRoZSBub3JtYWwgQkxFIHNjYW4gY2xpZW50cwotICAgICAgICAvLyBzdG9wcy4KLSAgICAgICAgbVNjYW5uZXIuc3RvcFNjYW4ocmVndWxhclNjYW5DYWxsYmFjayk7Ci0gICAgICAgIC8vIEluIGNhc2Ugd2UgZ290IHNjYW4gcmVzdWx0cyBiZWZvcmUgc2NhbiB3YXMgY29tcGxldGVseSBzdG9wcGVkLgotICAgICAgICBzbGVlcCgxMDAwKTsKLSAgICAgICAgZW1wdHlTY2FuQ2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgc2xlZXAoU0NBTl9EVVJBVElPTl9NSUxMSVMpOwotICAgICAgICBhc3NlcnRUcnVlKCJvcHBvcnR1bmlzdGljIHNjYW4gc2hvdWxkbid0IGhhdmUgc2NhbiByZXN1bHRzIiwKLSAgICAgICAgICAgICAgICBlbXB0eVNjYW5DYWxsYmFjay5nZXRTY2FuUmVzdWx0cygpLmlzRW1wdHkoKSk7Ki8KLSAgICB9CisvLyAgICAvKioKKy8vICAgICAqIFRlc3Qgb2Ygb3Bwb3J0dW5pc3RpYyBCTEUgc2NhbnMuCisvLyAgICAgKiBUZW1wb3JhcmlseSBkaXNhYmxlIHRoaXMgdGVzdCBiZWNhdXNlIGl0IGlzIGludGVyZmVyZWQgYnkgdGhlIEdtc0NvcmU7CisvLyAgICAgKiBpdCBmYWlscyB3aGVuIGl0IG9idGFpbnMgcmVzdWx0cyBmcm9tIEdtc0NvcmUgZXhwbGljaXQgc2Nhbi4KKy8vICAgICAqIFRPRE8oYi83MDg2NTE0NCk6IHJlLWVuYWJsZSB0aGlzIHRlc3QuCisvLyAgICAgKi8KKy8vICAgIEBNZWRpdW1UZXN0CisvLyAgICBwdWJsaWMgdm9pZCB0ZXN0T3Bwb3J0dW5pc3RpY1NjYW4oKSB7CisvLyAgICAgICAgaWYgKCFpc0JsZVN1cHBvcnRlZCgpKSB7CisvLyAgICAgICAgICAgIHJldHVybjsKKy8vICAgICAgICB9CisvLyAgICAgICAgU2NhblNldHRpbmdzIG9wcG9ydHVuaXN0aWNTY2FuU2V0dGluZ3MgPSBuZXcgU2NhblNldHRpbmdzLkJ1aWxkZXIoKQorLy8gICAgICAgICAgICAgICAgLnNldFNjYW5Nb2RlKFNjYW5TZXR0aW5ncy5TQ0FOX01PREVfT1BQT1JUVU5JU1RJQykKKy8vICAgICAgICAgICAgICAgIC5idWlsZCgpOworLy8gICAgICAgIEJsZVNjYW5DYWxsYmFjayBlbXB0eVNjYW5DYWxsYmFjayA9IG5ldyBCbGVTY2FuQ2FsbGJhY2soKTsKKy8vICAgICAgICBhc3NlcnRUcnVlKCJvcHBvcnR1bmlzdGljIHNjYW4gc2hvdWxkbid0IGhhdmUgc2NhbiByZXN1bHRzIiwKKy8vICAgICAgICAgICAgICAgIGVtcHR5U2NhbkNhbGxiYWNrLmdldFNjYW5SZXN1bHRzKCkuaXNFbXB0eSgpKTsKKy8vCisvLyAgICAgICAgLy8gTm8gc2NhbnMgYXJlIHJlYWxseSBzdGFydGVkIHdpdGggb3Bwb3J0dW5pc3RpYyBzY2FucyBvbmx5LgorLy8gICAgICAgIG1TY2FubmVyLnN0YXJ0U2NhbihDb2xsZWN0aW9ucy48U2NhbkZpbHRlcj5lbXB0eUxpc3QoKSwgb3Bwb3J0dW5pc3RpY1NjYW5TZXR0aW5ncywKKy8vICAgICAgICAgICAgICAgIGVtcHR5U2NhbkNhbGxiYWNrKTsKKy8vICAgICAgICBzbGVlcChTQ0FOX0RVUkFUSU9OX01JTExJUyk7CisvLyAgICAgICAgTG9nLmQoVEFHLCAicmVzdWx0OiAiICsgZW1wdHlTY2FuQ2FsbGJhY2suZ2V0U2NhblJlc3VsdHMoKSk7CisvLyAgICAgICAgYXNzZXJ0VHJ1ZSgib3Bwb3J0dW5pc3RpYyBzY2FuIHNob3VsZG4ndCBoYXZlIHNjYW4gcmVzdWx0cyIsCisvLyAgICAgICAgICAgICAgICBlbXB0eVNjYW5DYWxsYmFjay5nZXRTY2FuUmVzdWx0cygpLmlzRW1wdHkoKSk7CisvLworLy8gICAgICAgIEJsZVNjYW5DYWxsYmFjayByZWd1bGFyU2NhbkNhbGxiYWNrID0gbmV3IEJsZVNjYW5DYWxsYmFjaygpOworLy8gICAgICAgIFNjYW5TZXR0aW5ncyByZWd1bGFyU2NhblNldHRpbmdzID0gbmV3IFNjYW5TZXR0aW5ncy5CdWlsZGVyKCkKKy8vICAgICAgICAgICAgICAgIC5zZXRTY2FuTW9kZShTY2FuU2V0dGluZ3MuU0NBTl9NT0RFX0xPV19MQVRFTkNZKS5idWlsZCgpOworLy8gICAgICAgIExpc3Q8U2NhbkZpbHRlcj4gZmlsdGVycyA9IG5ldyBBcnJheUxpc3Q8PigpOworLy8gICAgICAgIFNjYW5GaWx0ZXIgZmlsdGVyID0gY3JlYXRlU2NhbkZpbHRlcigpOworLy8gICAgICAgIGlmIChmaWx0ZXIgIT0gbnVsbCkgeworLy8gICAgICAgICAgICBmaWx0ZXJzLmFkZChmaWx0ZXIpOworLy8gICAgICAgIH0gZWxzZSB7CisvLyAgICAgICAgICAgIExvZy5kKFRBRywgIm5vIGFwcHJvcHJpYXRlIGZpbHRlciBjYW4gYmUgc2V0Iik7CisvLyAgICAgICAgfQorLy8gICAgICAgIG1TY2FubmVyLnN0YXJ0U2NhbihmaWx0ZXJzLCByZWd1bGFyU2NhblNldHRpbmdzLCByZWd1bGFyU2NhbkNhbGxiYWNrKTsKKy8vICAgICAgICBzbGVlcChTQ0FOX0RVUkFUSU9OX01JTExJUyk7CisvLyAgICAgICAgLy8gV2l0aCBub3JtYWwgQkxFIHNjYW4gY2xpZW50LCBvcHBvcnR1bmlzdGljIHNjYW4gY2xpZW50IHdpbGwgZ2V0IHNjYW4gcmVzdWx0cy4KKy8vICAgICAgICBhc3NlcnRUcnVlKCJvcHBvcnR1bmlzdGljIHNjYW4gcmVzdWx0cyBzaG91bGRuJ3QgYmUgZW1wdHkiLAorLy8gICAgICAgICAgICAgICAgIWVtcHR5U2NhbkNhbGxiYWNrLmdldFNjYW5SZXN1bHRzKCkuaXNFbXB0eSgpKTsKKy8vCisvLyAgICAgICAgLy8gTm8gbW9yZSBzY2FuIHJlc3VsdHMgZm9yIG9wcG9ydHVuaXN0aWMgc2NhbiBjbGllbnRzIG9uY2UgdGhlIG5vcm1hbCBCTEUgc2NhbiBjbGllbnRzCisvLyAgICAgICAgLy8gc3RvcHMuCisvLyAgICAgICAgbVNjYW5uZXIuc3RvcFNjYW4ocmVndWxhclNjYW5DYWxsYmFjayk7CisvLyAgICAgICAgLy8gSW4gY2FzZSB3ZSBnb3Qgc2NhbiByZXN1bHRzIGJlZm9yZSBzY2FuIHdhcyBjb21wbGV0ZWx5IHN0b3BwZWQuCisvLyAgICAgICAgc2xlZXAoU0NBTl9TVE9QX1RJTUVPVVQpOworLy8gICAgICAgIGVtcHR5U2NhbkNhbGxiYWNrLmNsZWFyKCk7CisvLyAgICAgICAgc2xlZXAoU0NBTl9EVVJBVElPTl9NSUxMSVMpOworLy8gICAgICAgIGFzc2VydFRydWUoIm9wcG9ydHVuaXN0aWMgc2NhbiBzaG91bGRuJ3QgaGF2ZSBzY2FuIHJlc3VsdHMiLAorLy8gICAgICAgICAgICAgICAgZW1wdHlTY2FuQ2FsbGJhY2suZ2V0U2NhblJlc3VsdHMoKS5pc0VtcHR5KCkpOworLy8gICAgfQogCiAgICAgLyoqCiAgICAgICogVGVzdCBjYXNlIGZvciBCTEUgQmF0Y2ggc2Nhbi4KQEAgLTM3Myw3ICszODYsNyBAQAogICAgICAgICBtU2Nhbm5lci5zdGFydFNjYW4ocmVndWxhckxlU2NhbkNhbGxiYWNrKTsKICAgICAgICAgc2xlZXAoU0NBTl9EVVJBVElPTl9NSUxMSVMpOwogICAgICAgICBtU2Nhbm5lci5zdG9wU2NhbihyZWd1bGFyTGVTY2FuQ2FsbGJhY2spOwotICAgICAgICBzbGVlcCgxMDAwKTsKKyAgICAgICAgc2xlZXAoU0NBTl9TVE9QX1RJTUVPVVQpOwogICAgICAgICByZXR1cm4gcmVndWxhckxlU2NhbkNhbGxiYWNrLmdldFNjYW5SZXN1bHRzKCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9jYWxlbmRhcmNvbW1vbi9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvY2FsZW5kYXJjb21tb24vQW5kcm9pZC5tawppbmRleCAxOGFlNDllLi4zZDdjMDQ2IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9jYWxlbmRhcmNvbW1vbi9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3Rlc3RzL2NhbGVuZGFyY29tbW9uL0FuZHJvaWQubWsKQEAgLTI1LDkgKzI1LDkgQEAKICMgV2hlbiBidWlsdCwgZXhwbGljaXRseSBwdXQgaXQgaW4gdGhlIGRhdGEgcGFydGl0aW9uLgogTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKIAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGN0c3Rlc3RydW5uZXIgbGVnYWN5LWFuZHJvaWQtdGVzdAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGN0c3Rlc3RydW5uZXItYXh0CiAKLUxPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGxlZ2FjeS1hbmRyb2lkLXRlc3QKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvY2FsZW5kYXJjb21tb24vQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL2NhbGVuZGFyY29tbW9uL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggNGYyMWIxOC4uYWQ5NDM1NCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvY2FsZW5kYXJjb21tb24vQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9jYWxlbmRhcmNvbW1vbi9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yMywxNCArMjMsMTQgQEAKICAgICA8L2FwcGxpY2F0aW9uPgogCiAgICAgPCEtLSBUaGlzIGlzIGEgc2VsZi1pbnN0cnVtZW50aW5nIHRlc3QgcGFja2FnZS4gLS0+Ci0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5jYWxlbmRhcmNvbW1vbjIuY3RzIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIG9mIGNhbGVuZGFyY29tbW9uIj4KICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9Imxpc3RlbmVyIgogICAgICAgICAgICAgYW5kcm9pZDp2YWx1ZT0iY29tLmFuZHJvaWQuY3RzLnJ1bm5lci5DdHNUZXN0UnVuTGlzdGVuZXIiIC8+CiAgICAgPC9pbnN0cnVtZW50YXRpb24+CiAKLSAgICA8dXNlcy1zZGsgYW5kcm9pZDptaW5TZGtWZXJzaW9uPSIxNSIgYW5kcm9pZDp0YXJnZXRTZGtWZXJzaW9uPSIxNSI+PC91c2VzLXNkaz4KKyAgICA8dXNlcy1zZGsgYW5kcm9pZDptaW5TZGtWZXJzaW9uPSIxNSIgYW5kcm9pZDp0YXJnZXRTZGtWZXJzaW9uPSIxNyI+PC91c2VzLXNkaz4KIAogPC9tYW5pZmVzdD4KIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvY2FsZW5kYXJjb21tb24vQW5kcm9pZFRlc3QueG1sIGIvdGVzdHMvdGVzdHMvY2FsZW5kYXJjb21tb24vQW5kcm9pZFRlc3QueG1sCmluZGV4IDkxNjliNzkuLjc2ZWZiOWIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2NhbGVuZGFyY29tbW9uL0FuZHJvaWRUZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9jYWxlbmRhcmNvbW1vbi9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBDYWxlbmRhciB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iZnJhbWV3b3JrIiAvPgogICAgIDxvcHRpb24gbmFtZT0ibm90LXNoYXJkYWJsZSIgdmFsdWU9InRydWUiIC8+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9jYXIvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL2Nhci9BbmRyb2lkLm1rCmluZGV4IDgyZmJlN2MuLjcxMDQxNTkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2Nhci9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3Rlc3RzL2Nhci9BbmRyb2lkLm1rCkBAIC0yNCwxNSArMjQsMjAgQEAKICMgV2hlbiBidWlsdCwgZXhwbGljaXRseSBwdXQgaXQgaW4gdGhlIGRhdGEgcGFydGl0aW9uLgogTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKIAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGN0c3Rlc3RydW5uZXIgYW5kcm9pZC1zdXBwb3J0LXRlc3QgbGVnYWN5LWFuZHJvaWQtdGVzdCBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAorCWFuZHJvaWR4LnRlc3QucnVsZXMgXAorCWNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0IFwKKwljdHN0ZXN0cnVubmVyLWF4dAogCi1MT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLmNhcgorTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC5jYXIgYW5kcm9pZC50ZXN0LmJhc2Uuc3R1YnMKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogCiAjIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0CiBMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cwogCi1MT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CisjVE9ETyhiLzcyNjIwNTExKSBBcHBzIHNob3VsZCBub3QgdXNlIHBsYXRmb3JtIEFQSXMgZGlyZWN0bHkKKyNMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CitMT0NBTF9QUklWQVRFX1BMQVRGT1JNX0FQSVMgOj0gdHJ1ZQogCiBpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9jYXIvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL2Nhci9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDk4NGQ4OTYuLjYzOTlhZjUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2Nhci9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL2Nhci9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0xNywxMSArMTcsMjMgQEAKIDxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCiAgICAgcGFja2FnZT0iYW5kcm9pZC5jYXIuY3RzIj4KICAgICA8dXNlcy1mZWF0dXJlIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5oYXJkd2FyZS50eXBlLmF1dG9tb3RpdmUiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuY2FyLnBlcm1pc3Npb24uQ0FSX0VYVEVSSU9SX0VOVklST05NRU5UIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmNhci5wZXJtaXNzaW9uLkNBUl9JTkZPIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmNhci5wZXJtaXNzaW9uLkNBUl9QT1dFUlRSQUlOIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmNhci5wZXJtaXNzaW9uLkNBUl9TUEVFRCIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkJMVUVUT09USCIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkJMVUVUT09USF9BRE1JTiIgLz4KICAgICA8YXBwbGljYXRpb24+CiAgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuZHJpdmluZ3N0YXRlLkRpc3RyYWN0aW9uT3B0aW1pemVkQWN0aXZpdHkiPgorICAgICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9ImRpc3RyYWN0aW9uT3B0aW1pemVkIiBhbmRyb2lkOnZhbHVlPSJ0cnVlIi8+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5kcml2aW5nc3RhdGUuTm9uRGlzdHJhY3Rpb25PcHRpbWl6ZWRBY3Rpdml0eSI+CisgICAgICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0iZGlzdHJhY3Rpb25PcHRpbWl6ZWQiIGFuZHJvaWQ6dmFsdWU9ImZhbHNlIi8+CisgICAgICAgIDwvYWN0aXZpdHk+CiAgICAgPC9hcHBsaWNhdGlvbj4KIAotICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuY2FyLmN0cyIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBmb3IgQXV0b21vdGl2ZSI+CiAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJsaXN0ZW5lciIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2Nhci9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy90ZXN0cy9jYXIvQW5kcm9pZFRlc3QueG1sCmluZGV4IGM5MzExNjkuLjU1OGU3YmUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2Nhci9BbmRyb2lkVGVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvY2FyL0FuZHJvaWRUZXN0LnhtbApAQCAtMjMsNCArMjMsNSBAQAogICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5BbmRyb2lkSlVuaXRUZXN0IiA+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icGFja2FnZSIgdmFsdWU9ImFuZHJvaWQuY2FyLmN0cyIgLz4KICAgICA8L3Rlc3Q+CisgICAgPG9iamVjdCB0eXBlPSJtb2R1bGVfY29udHJvbGxlciIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLnN1aXRlLm1vZHVsZS5DYXJNb2R1bGVDb250cm9sbGVyIi8+CiA8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9jYXIvc3JjL2FuZHJvaWQvY2FyL2N0cy9DYXJBcGlUZXN0QmFzZS5qYXZhIGIvdGVzdHMvdGVzdHMvY2FyL3NyYy9hbmRyb2lkL2Nhci9jdHMvQ2FyQXBpVGVzdEJhc2UuamF2YQppbmRleCBkOTgyYzFiLi43MWRiMjI3IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9jYXIvc3JjL2FuZHJvaWQvY2FyL2N0cy9DYXJBcGlUZXN0QmFzZS5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2Nhci9zcmMvYW5kcm9pZC9jYXIvY3RzL0NhckFwaVRlc3RCYXNlLmphdmEKQEAgLTE2LDE4ICsxNiwyNiBAQAogCiBwYWNrYWdlIGFuZHJvaWQuY2FyLmN0czsKIAoraW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3N1bWUuYXNzdW1lVHJ1ZTsKKwogaW1wb3J0IGFuZHJvaWQuY2FyLkNhcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2VydmljZUNvbm5lY3Rpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwotaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworCitpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5GZWF0dXJlVXRpbDsKKworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKIAogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNlbWFwaG9yZTsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKIAotCi1wdWJsaWMgY2xhc3MgQ2FyQXBpVGVzdEJhc2UgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworcHVibGljIGFic3RyYWN0IGNsYXNzIENhckFwaVRlc3RCYXNlIHsKICAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGxvbmcgREVGQVVMVF9XQUlUX1RJTUVPVVRfTVMgPSAxMDAwOwogCiAgICAgcHJpdmF0ZSBDYXIgbUNhcjsKQEAgLTM5LDE4ICs0NywyMSBAQAogICAgICAgICBhc3NlcnRUcnVlKExvb3Blci5nZXRNYWluTG9vcGVyKCkuaXNDdXJyZW50VGhyZWFkKCkpOwogICAgIH0KIAotICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIG1DYXIgPSBDYXIuY3JlYXRlQ2FyKGdldENvbnRleHQoKSwgbUNvbm5lY3Rpb25MaXN0ZW5lciwgbnVsbCk7CisgICAgICAgIGFzc3VtZVRydWUoRmVhdHVyZVV0aWwuaXNBdXRvbW90aXZlKCkpOworCisgICAgICAgIENvbnRleHQgY29udGV4dCA9CisgICAgICAgICAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VGFyZ2V0Q29udGV4dCgpOworICAgICAgICBtQ2FyID0gQ2FyLmNyZWF0ZUNhcihjb250ZXh0LCBtQ29ubmVjdGlvbkxpc3RlbmVyLCBudWxsKTsKICAgICAgICAgbUNhci5jb25uZWN0KCk7CiAgICAgICAgIG1Db25uZWN0aW9uTGlzdGVuZXIud2FpdEZvckNvbm5lY3Rpb24oREVGQVVMVF9XQUlUX1RJTUVPVVRfTVMpOwogICAgIH0KIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgICAgIG1DYXIuZGlzY29ubmVjdCgpOworICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIGRpc2Nvbm5lY3RDYXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG1DYXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbUNhci5kaXNjb25uZWN0KCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIENhciBnZXRDYXIoKSB7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9jYXIvc3JjL2FuZHJvaWQvY2FyL2N0cy9DYXJBcHBGb2N1c01hbmFnZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9jYXIvc3JjL2FuZHJvaWQvY2FyL2N0cy9DYXJBcHBGb2N1c01hbmFnZXJUZXN0LmphdmEKaW5kZXggNDQ0ZTIyOC4uZjczNzlmNCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvY2FyL3NyYy9hbmRyb2lkL2Nhci9jdHMvQ2FyQXBwRm9jdXNNYW5hZ2VyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2Nhci9zcmMvYW5kcm9pZC9jYXIvY3RzL0NhckFwcEZvY3VzTWFuYWdlclRlc3QuamF2YQpAQCAtMTUsNDUgKzE1LDYxIEBACiAgKi8KIHBhY2thZ2UgYW5kcm9pZC5jYXIuY3RzOwogCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQuY2FyLkNhckFwcEZvY3VzTWFuYWdlci5BUFBfRk9DVVNfUkVRVUVTVF9TVUNDRUVERUQ7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuY2FyLkNhckFwcEZvY3VzTWFuYWdlci5BUFBfRk9DVVNfVFlQRV9OQVZJR0FUSU9OOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmNhci5DYXJBcHBGb2N1c01hbmFnZXIuQVBQX0ZPQ1VTX1RZUEVfVk9JQ0VfQ09NTUFORDsKIAoraW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKwogaW1wb3J0IGFuZHJvaWQuY2FyLkNhcjsKIGltcG9ydCBhbmRyb2lkLmNhci5DYXJBcHBGb2N1c01hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlJlcXVpcmVzRGV2aWNlOwogaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TbWFsbFRlc3Q7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ2RkVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2VtYXBob3JlOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogCi1pbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKLQotCi1AQ2RkVGVzdChyZXF1aXJlbWVudD0iMi41LjMvQS0wLTMiKQogQFNtYWxsVGVzdAogQFJlcXVpcmVzRGV2aWNlCitAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQogcHVibGljIGNsYXNzIENhckFwcEZvY3VzTWFuYWdlclRlc3QgZXh0ZW5kcyBDYXJBcGlUZXN0QmFzZSB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IENhckFwcEZvY3VzTWFuYWdlclRlc3QuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOwogICAgIHByaXZhdGUgQ2FyQXBwRm9jdXNNYW5hZ2VyIG1NYW5hZ2VyOwogCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgc3VwZXIuc2V0VXAoKTsKICAgICAgICAgbU1hbmFnZXIgPSAoQ2FyQXBwRm9jdXNNYW5hZ2VyKSBnZXRDYXIoKS5nZXRDYXJNYW5hZ2VyKENhci5BUFBfRk9DVVNfU0VSVklDRSk7CiAgICAgICAgIGFzc2VydE5vdE51bGwobU1hbmFnZXIpOwogCiAgICAgICAgIC8vIFJlcXVlc3QgYWxsIGFwcGxpY2F0aW9uIGZvY3VzZXMgYW5kIGFiYW5kb24gdGhlbSB0byBlbnN1cmUgbm8gYWN0aXZlIGNvbnRleHQgaXMgcHJlc2VudAogICAgICAgICAvLyB3aGVuIHRlc3Qgc3RhcnRzLgorICAgICAgICBpbnRbXSBhY3RpdmVUeXBlcyA9ICBtTWFuYWdlci5nZXRBY3RpdmVBcHBUeXBlcygpOwogICAgICAgICBGb2N1c093bmVyc2hpcENhbGxiYWNrIG93bmVyID0gbmV3IEZvY3VzT3duZXJzaGlwQ2FsbGJhY2soKTsKLSAgICAgICAgbU1hbmFnZXIucmVxdWVzdEFwcEZvY3VzKENhckFwcEZvY3VzTWFuYWdlci5BUFBfRk9DVVNfVFlQRV9OQVZJR0FUSU9OLCBvd25lcik7Ci0gICAgICAgIG1NYW5hZ2VyLnJlcXVlc3RBcHBGb2N1cyhDYXJBcHBGb2N1c01hbmFnZXIuQVBQX0ZPQ1VTX1RZUEVfVk9JQ0VfQ09NTUFORCwgb3duZXIpOwotICAgICAgICBtTWFuYWdlci5hYmFuZG9uQXBwRm9jdXMob3duZXIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFjdGl2ZVR5cGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBtTWFuYWdlci5yZXF1ZXN0QXBwRm9jdXMoYWN0aXZlVHlwZXNbaV0sIG93bmVyKTsKKyAgICAgICAgICAgIG93bmVyLndhaXRGb3JPd25lcnNoaXBHcmFudEFuZEFzc2VydChERUZBVUxUX1dBSVRfVElNRU9VVF9NUywgYWN0aXZlVHlwZXNbaV0pOworICAgICAgICAgICAgbU1hbmFnZXIuYWJhbmRvbkFwcEZvY3VzKG93bmVyLCBhY3RpdmVUeXBlc1tpXSk7CisgICAgICAgICAgICBvd25lci53YWl0Rm9yT3duZXJzaGlwTG9zc0FuZEFzc2VydCgKKyAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9XQUlUX1RJTUVPVVRfTVMsIGFjdGl2ZVR5cGVzW2ldKTsKKyAgICAgICAgfQorCiAgICAgfQogCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0QWN0aXZlTnVsbExpc3RlbmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBtTWFuYWdlci5yZXF1ZXN0QXBwRm9jdXMoQ2FyQXBwRm9jdXNNYW5hZ2VyLkFQUF9GT0NVU19UWVBFX05BVklHQVRJT04sIG51bGwpOwpAQCAtNjMsNiArNzksNyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVnaXN0ZXJOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBtTWFuYWdlci5hZGRGb2N1c0xpc3RlbmVyKG51bGwsIDApOwpAQCAtNzIsNiArODksNyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVnaXN0ZXJVbnJlZ2lzdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEZvY3VzQ2hhbmdlZExpc3Rlcm5lciBsaXN0ZW5lciA9IG5ldyBGb2N1c0NoYW5nZWRMaXN0ZXJuZXIoKTsKICAgICAgICAgRm9jdXNDaGFuZ2VkTGlzdGVybmVyIGxpc3RlbmVyMiA9IG5ldyBGb2N1c0NoYW5nZWRMaXN0ZXJuZXIoKTsKQEAgLTgxLDEwICs5OSwxNCBAQAogICAgICAgICBtTWFuYWdlci5yZW1vdmVGb2N1c0xpc3RlbmVyKGxpc3RlbmVyMik7CiAgICAgfQogCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9jdXNDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0KKyAgICAgICAgICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKS5nZXRUYXJnZXRDb250ZXh0KCk7CisKICAgICAgICAgRGVmYXVsdFNlcnZpY2VDb25uZWN0aW9uTGlzdGVuZXIgY29ubmVjdGlvbkxpc3RlbmVyID0KICAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdFNlcnZpY2VDb25uZWN0aW9uTGlzdGVuZXIoKTsKLSAgICAgICAgQ2FyIGNhcjIgPSBDYXIuY3JlYXRlQ2FyKGdldENvbnRleHQoKSwgY29ubmVjdGlvbkxpc3RlbmVyLCBudWxsKTsKKyAgICAgICAgQ2FyIGNhcjIgPSBDYXIuY3JlYXRlQ2FyKGNvbnRleHQsIGNvbm5lY3Rpb25MaXN0ZW5lciwgbnVsbCk7CiAgICAgICAgIGNhcjIuY29ubmVjdCgpOwogICAgICAgICBjb25uZWN0aW9uTGlzdGVuZXIud2FpdEZvckNvbm5lY3Rpb24oREVGQVVMVF9XQUlUX1RJTUVPVVRfTVMpOwogICAgICAgICBDYXJBcHBGb2N1c01hbmFnZXIgbWFuYWdlcjIgPSAoQ2FyQXBwRm9jdXNNYW5hZ2VyKQpAQCAtMjEzLDEwICsyMzUsMTMgQEAKICAgICAgICAgbWFuYWdlcjIucmVtb3ZlRm9jdXNMaXN0ZW5lcihjaGFuZ2UyKTsKICAgICB9CiAKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RGaWx0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgRGVmYXVsdFNlcnZpY2VDb25uZWN0aW9uTGlzdGVuZXIgY29ubmVjdGlvbkxpc3RlbmVyID0KICAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdFNlcnZpY2VDb25uZWN0aW9uTGlzdGVuZXIoKTsKLSAgICAgICAgQ2FyIGNhcjIgPSBDYXIuY3JlYXRlQ2FyKGdldENvbnRleHQoKSwgY29ubmVjdGlvbkxpc3RlbmVyKTsKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0KKyAgICAgICAgICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKS5nZXRUYXJnZXRDb250ZXh0KCk7CisgICAgICAgIENhciBjYXIyID0gQ2FyLmNyZWF0ZUNhcihjb250ZXh0LCBjb25uZWN0aW9uTGlzdGVuZXIpOwogICAgICAgICBjYXIyLmNvbm5lY3QoKTsKICAgICAgICAgY29ubmVjdGlvbkxpc3RlbmVyLndhaXRGb3JDb25uZWN0aW9uKERFRkFVTFRfV0FJVF9USU1FT1VUX01TKTsKICAgICAgICAgQ2FyQXBwRm9jdXNNYW5hZ2VyIG1hbmFnZXIyID0gKENhckFwcEZvY3VzTWFuYWdlcikKQEAgLTI3MSw2ICsyOTYsNyBAQAogICAgICAgICAgICAgICAgIENhckFwcEZvY3VzTWFuYWdlci5BUFBfRk9DVVNfVFlQRV9OQVZJR0FUSU9OLCBmYWxzZSkpOwogICAgIH0KIAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlQ2hhbmdlTGlzdGVuZXJzUGVyTWFuYWdlcigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBGb2N1c0NoYW5nZWRMaXN0ZXJuZXIgbGlzdGVuZXIgPSBuZXcgRm9jdXNDaGFuZ2VkTGlzdGVybmVyKCk7CiAgICAgICAgIEZvY3VzQ2hhbmdlZExpc3Rlcm5lciBsaXN0ZW5lcjIgPSBuZXcgRm9jdXNDaGFuZ2VkTGlzdGVybmVyKCk7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9jYXIvc3JjL2FuZHJvaWQvY2FyL2N0cy9DYXJBdWRpb01hbmFnZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9jYXIvc3JjL2FuZHJvaWQvY2FyL2N0cy9DYXJBdWRpb01hbmFnZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmOWM4ZjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvdGVzdHMvY2FyL3NyYy9hbmRyb2lkL2Nhci9jdHMvQ2FyQXVkaW9NYW5hZ2VyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQuY2FyLmN0czsKLQotaW1wb3J0IGFuZHJvaWQuY2FyLkNhcjsKLWltcG9ydCBhbmRyb2lkLmNhci5tZWRpYS5DYXJBdWRpb01hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0F0dHJpYnV0ZXM7Ci1pbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlJlcXVpcmVzRGV2aWNlOwotaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TbWFsbFRlc3Q7Ci0KLQotQFNtYWxsVGVzdAotQFJlcXVpcmVzRGV2aWNlCi0vKiogVW5pdCB0ZXN0cyBmb3Ige0BsaW5rIENhckF1ZGlvTWFuYWdlcn0uICovCi1wdWJsaWMgY2xhc3MgQ2FyQXVkaW9NYW5hZ2VyVGVzdCBleHRlbmRzIENhckFwaVRlc3RCYXNlIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gQ2FyQXVkaW9NYW5hZ2VyVGVzdC5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7Ci0gICAgcHJpdmF0ZSBDYXJBdWRpb01hbmFnZXIgbU1hbmFnZXI7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBtTWFuYWdlciA9IChDYXJBdWRpb01hbmFnZXIpIGdldENhcigpLmdldENhck1hbmFnZXIoQ2FyLkFVRElPX1NFUlZJQ0UpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG1NYW5hZ2VyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QXVkaW9BdHRyaWJ1dGVzRm9yQ2FyVXNhZ2VGb3JNdXNpYygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBBdWRpb0F0dHJpYnV0ZXMuQnVpbGRlciBtdXNpY0J1aWxkZXIgPSBuZXcgQXVkaW9BdHRyaWJ1dGVzLkJ1aWxkZXIoKTsKLSAgICAgICAgbXVzaWNCdWlsZGVyLnNldENvbnRlbnRUeXBlKEF1ZGlvQXR0cmlidXRlcy5DT05URU5UX1RZUEVfTVVTSUMpCi0gICAgICAgICAgICAgICAgLnNldFVzYWdlKEF1ZGlvQXR0cmlidXRlcy5VU0FHRV9NRURJQSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKG11c2ljQnVpbGRlci5idWlsZCgpLCBtTWFuYWdlci5nZXRBdWRpb0F0dHJpYnV0ZXNGb3JDYXJVc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FyQXVkaW9NYW5hZ2VyLkNBUl9BVURJT19VU0FHRV9NVVNJQykpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBdWRpb0F0dHJpYnV0ZXNGb3JDYXJVc2FnZUZvclVua25vd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQXVkaW9BdHRyaWJ1dGVzLkJ1aWxkZXIgdW5rbm93bkJ1aWxkZXIgPSBuZXcgQXVkaW9BdHRyaWJ1dGVzLkJ1aWxkZXIoKTsKLSAgICAgICAgdW5rbm93bkJ1aWxkZXIuc2V0Q29udGVudFR5cGUoQXVkaW9BdHRyaWJ1dGVzLkNPTlRFTlRfVFlQRV9VTktOT1dOKQotICAgICAgICAgICAgICAgIC5zZXRVc2FnZShBdWRpb0F0dHJpYnV0ZXMuVVNBR0VfVU5LTk9XTik7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHVua25vd25CdWlsZGVyLmJ1aWxkKCksIG1NYW5hZ2VyLmdldEF1ZGlvQXR0cmlidXRlc0ZvckNhclVzYWdlKDEwMDA3KSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvY2FyL3NyYy9hbmRyb2lkL2Nhci9jdHMvQ2FyQmx1ZXRvb3RoVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvY2FyL3NyYy9hbmRyb2lkL2Nhci9jdHMvQ2FyQmx1ZXRvb3RoVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMTJjZTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9jYXIvc3JjL2FuZHJvaWQvY2FyL2N0cy9DYXJCbHVldG9vdGhUZXN0LmphdmEKQEAgLTAsMCArMSwzNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuY2FyLmN0czsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzdW1lLmFzc3VtZVRydWU7CisKK2ltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoUHJvZmlsZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5SZXF1aXJlc0RldmljZTsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DZGRUZXN0OworaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuRmVhdHVyZVV0aWw7CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5Db25kaXRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50TG9jazsKKworLyoqCisgKiBDb250YWlucyB0aGUgdGVzdHMgdG8gcHJvdmUgY29tcGxpYW5jZSB3aXRoIGFuZHJvaWQgYXV0b21vdGl2ZSBzcGVjaWZpYyBibHVldG9vdGggcmVxdWlyZW1lbnRzLgorICovCitAU21hbGxUZXN0CitAUmVxdWlyZXNEZXZpY2UKK0BSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgQ2FyQmx1ZXRvb3RoVGVzdCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJDYXJCbHVldG9vdGhUZXN0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IGZhbHNlOworICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKKworICAgIC8vIEJsdWV0b290aCBDb3JlIG9iamVjdHMKKyAgICBwcml2YXRlIEJsdWV0b290aE1hbmFnZXIgbUJsdWV0b290aE1hbmFnZXI7CisgICAgcHJpdmF0ZSBCbHVldG9vdGhBZGFwdGVyIG1CbHVldG9vdGhBZGFwdGVyOworCisgICAgLy8gVGltZW91dCBmb3Igd2FpdGluZyBmb3IgYW4gYWRhcHRlciBzdGF0ZSBjaGFuZ2UKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlRfQURBUFRFUl9USU1FT1VUX01TID0gODAwMDsgLy8gbXMKKworICAgIC8vIE9iamVjdHMgdG8gYmxvY2sgdW50aWwgdGhlIGFkYXB0ZXIgaGFzIHJlYWNoZWQgYSBkZXNpcmVkIHN0YXRlCisgICAgcHJpdmF0ZSBSZWVudHJhbnRMb2NrIG1CbHVldG9vdGhBZGFwdGVyTG9jazsKKyAgICBwcml2YXRlIENvbmRpdGlvbiBtQ29uZGl0aW9uQWRhcHRlclN0YXRlUmVhY2hlZDsKKyAgICBwcml2YXRlIGludCBtRGVzaXJlZFN0YXRlOworICAgIHByaXZhdGUgaW50IG1PcmlnaW5hbFN0YXRlOworCisgICAgLyoqCisgICAgICogSGFuZGxlcyBCbHVldG9vdGhBZGFwdGVyIHN0YXRlIGNoYW5nZXMgYW5kIHNpZ25hbHMgd2hlbiB3ZSd2ZSByZWFjaGVkIGEgZGVzaXJlZCBzdGF0ZQorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgQmx1ZXRvb3RoQWRhcHRlclJlY2VpdmVyIGV4dGVuZHMgQnJvYWRjYXN0UmVjZWl2ZXIgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworCisgICAgICAgICAgICAvLyBEZWNvZGUgdGhlIGludGVudAorICAgICAgICAgICAgU3RyaW5nIGFjdGlvbiA9IGludGVudC5nZXRBY3Rpb24oKTsKKworICAgICAgICAgICAgLy8gV2F0Y2ggZm9yIEJsdWV0b290aEFkYXB0ZXIgaW50ZW50cyBvbmx5CisgICAgICAgICAgICBpZiAoQmx1ZXRvb3RoQWRhcHRlci5BQ1RJT05fU1RBVEVfQ0hBTkdFRC5lcXVhbHMoYWN0aW9uKSkgeworICAgICAgICAgICAgICAgIGludCBuZXdTdGF0ZSA9IGludGVudC5nZXRJbnRFeHRyYShCbHVldG9vdGhBZGFwdGVyLkVYVFJBX1NUQVRFLCAtMSk7CisgICAgICAgICAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJCbHVldG9vdGggYWRhcHRlciBzdGF0ZSBjaGFuZ2VkOiAiICsgbmV3U3RhdGUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFNpZ25hbCBpZiB0aGUgc3RhdGUgaXMgc2V0IHRvIHRoZSBvbmUgd2UncmUgd2FpdGluZyBvbi4gSWYgaXRzIG5vdCBhbmQgd2UgZ290IGEKKyAgICAgICAgICAgICAgICAvLyBTVEFURV9PRkYgZXZlbnQgdGhlbiBoYW5kbGUgdGhlIHVuZXhwZWN0ZWQgb2ZmIGV2ZW50LiBOb3RlIHRoYXQgd2UgY291bGQKKyAgICAgICAgICAgICAgICAvLyBwcm9hY3RpdmVseSB0dXJuIHRoZSBhZGFwdGVyIGJhY2sgb24gdG8gY29udGludWUgdGVzdGluZy4gRm9yIG5vdyB3ZSdsbCBqdXN0CisgICAgICAgICAgICAgICAgLy8gbG9nIGl0CisgICAgICAgICAgICAgICAgbUJsdWV0b290aEFkYXB0ZXJMb2NrLmxvY2soKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiAobURlc2lyZWRTdGF0ZSA9PSBuZXdTdGF0ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUNvbmRpdGlvbkFkYXB0ZXJTdGF0ZVJlYWNoZWQuc2lnbmFsKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV3U3RhdGUgPT0gQmx1ZXRvb3RoQWRhcHRlci5TVEFURV9PRkYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkJsdWV0b290aCB0dXJuZWQgb2ZmIHVuZXhwZWN0ZWRseSB3aGlsZSB0ZXN0IHdhcyBydW5uaW5nLiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgbUJsdWV0b290aEFkYXB0ZXJMb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBwcml2YXRlIEJsdWV0b290aEFkYXB0ZXJSZWNlaXZlciBtQmx1ZXRvb3RoQWRhcHRlclJlY2VpdmVyOworCisgICAgcHJpdmF0ZSB2b2lkIHdhaXRGb3JBZGFwdGVyT24oKSB7CisgICAgICAgIGlmIChEQkcpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIldhaXRpbmcgZm9yIGFkYXB0ZXIgdG8gYmUgb24uLi4iKTsKKyAgICAgICAgfQorICAgICAgICB3YWl0Rm9yQWRhcHRlclN0YXRlKEJsdWV0b290aEFkYXB0ZXIuU1RBVEVfT04pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB3YWl0Rm9yQWRhcHRlck9mZigpIHsKKyAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiV2FpdGluZyBmb3IgYWRhcHRlciB0byBiZSBvZmYuLi4iKTsKKyAgICAgICAgfQorICAgICAgICB3YWl0Rm9yQWRhcHRlclN0YXRlKEJsdWV0b290aEFkYXB0ZXIuU1RBVEVfT0ZGKTsKKyAgICB9CisKKyAgICAvLyBXYWl0IGZvciB0aGUgYmx1ZXRvb3RoIGFkYXB0ZXIgdG8gYmUgaW4gYSBnaXZlbiBzdGF0ZQorICAgIHByaXZhdGUgdm9pZCB3YWl0Rm9yQWRhcHRlclN0YXRlKGludCBkZXNpcmVkU3RhdGUpIHsKKyAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiV2FpdGluZyBmb3IgYWRhcHRlciBzdGF0ZSAiICsgZGVzaXJlZFN0YXRlKTsKKyAgICAgICAgfQorICAgICAgICBtQmx1ZXRvb3RoQWRhcHRlckxvY2subG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBkZXNpcmVkIHN0YXRlIHNvIHRoYXQgd2UnbGwgc2lnbmFsIHdoZW4gd2UgZ2V0IHRoZXJlCisgICAgICAgICAgICBtRGVzaXJlZFN0YXRlID0gZGVzaXJlZFN0YXRlOworICAgICAgICAgICAgaWYgKGRlc2lyZWRTdGF0ZSA9PSBCbHVldG9vdGhBZGFwdGVyLlNUQVRFX09OKSB7CisgICAgICAgICAgICAgICAgbUJsdWV0b290aEFkYXB0ZXIuZW5hYmxlKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1CbHVldG9vdGhBZGFwdGVyLmRpc2FibGUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gV2FpdCB1bnRpbCB3ZSdyZSByZWFjaGVkIHRoYXQgZGVzaXJlZCBzdGF0ZQorICAgICAgICAgICAgd2hpbGUgKGRlc2lyZWRTdGF0ZSAhPSBtQmx1ZXRvb3RoQWRhcHRlci5nZXRTdGF0ZSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtQ29uZGl0aW9uQWRhcHRlclN0YXRlUmVhY2hlZC5hd2FpdCgKKyAgICAgICAgICAgICAgICAgICAgQlRfQURBUFRFUl9USU1FT1VUX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlRpbWVvdXQgd2hpbGUgd2FpdGluZyBmb3IgQmx1ZXRvb3RoIGFkYXB0ZXIgc3RhdGUgIiArIGRlc2lyZWRTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncoVEFHLCAid2FpdEZvckFkYXB0ZXJTdGF0ZSgiICsgZGVzaXJlZFN0YXRlICsgIik6IGludGVycnVwdGVkIiwgZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBtQmx1ZXRvb3RoQWRhcHRlckxvY2sudW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBVdGlsaXR5IGNsYXNzIHRvIGhvbGQgcHJvZmlsZSBpbmZvcm1hdGlvbiBhbmQgc3RhdGUKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQcm9maWxlSW5mbyB7CisgICAgICAgIGZpbmFsIFN0cmluZyBtTmFtZTsKKyAgICAgICAgYm9vbGVhbiBtQ29ubmVjdGVkOworCisgICAgICAgIHB1YmxpYyBQcm9maWxlSW5mbyhTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgbU5hbWUgPSBuYW1lOworICAgICAgICAgICAgbUNvbm5lY3RlZCA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQXV0b21vdGl2ZSByZXF1aXJlZCBwcm9maWxlcyBhbmQgbWV0YSBkYXRhLiBQcm9maWxlIGRlZmF1bHRzIHRvICdub3QgY29ubmVjdGVkJyBhbmQgbmFtZQorICAgIC8vIGlzIHVzZWQgaW4gZGVidWcgYW5kIGVycm9yIG1lc3NhZ2VzCisgICAgcHJpdmF0ZSBzdGF0aWMgU3BhcnNlQXJyYXk8UHJvZmlsZUluZm8+IHNSZXF1aXJlZEJsdWV0b290aFByb2ZpbGVzID0gbmV3IFNwYXJzZUFycmF5KCk7CisgICAgc3RhdGljIHsKKyAgICAgICAgc1JlcXVpcmVkQmx1ZXRvb3RoUHJvZmlsZXMucHV0KEJsdWV0b290aFByb2ZpbGUuQTJEUF9TSU5LLAorICAgICAgICAgICAgICAgIG5ldyBQcm9maWxlSW5mbygiQTJEUCBTaW5rIikpOyAvLyAxMQorICAgICAgICBzUmVxdWlyZWRCbHVldG9vdGhQcm9maWxlcy5wdXQoQmx1ZXRvb3RoUHJvZmlsZS5BVlJDUF9DT05UUk9MTEVSLAorICAgICAgICAgICAgICAgIG5ldyBQcm9maWxlSW5mbygiQVZSQ1AgQ29udHJvbGxlciIpKTsgLy8gMTIKKyAgICAgICAgc1JlcXVpcmVkQmx1ZXRvb3RoUHJvZmlsZXMucHV0KEJsdWV0b290aFByb2ZpbGUuSEVBRFNFVF9DTElFTlQsCisgICAgICAgICAgICAgICAgbmV3IFByb2ZpbGVJbmZvKCJIU1AgQ2xpZW50IikpOyAvLyAxNgorICAgICAgICBzUmVxdWlyZWRCbHVldG9vdGhQcm9maWxlcy5wdXQoQmx1ZXRvb3RoUHJvZmlsZS5QQkFQX0NMSUVOVCwKKyAgICAgICAgICAgICAgICBuZXcgUHJvZmlsZUluZm8oIlBCQVAgQ2xpZW50IikpOyAvLyAxNworICAgIH0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1BST0ZJTEVTX1NVUFBPUlRFRCA9IHNSZXF1aXJlZEJsdWV0b290aFByb2ZpbGVzLnNpemUoKTsKKworICAgIC8vIENvbmZpZ3VyYWJsZSB0aW1lb3V0IGZvciB3YWl0aW5nIGZvciBwcm9maWxlIHByb3hpZXMgdG8gY29ubmVjdAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUk9YWV9DT05ORUNUSU9OU19USU1FT1VUX01TID0gMTAwMDsgLy8gbXMKKworICAgIC8vIE9iamVjdHMgdG8gYmxvY2sgdW50aWwgYWxsIHByb2ZpbGUgcHJveHkgY29ubmVjdGlvbnMgaGF2ZSBmaW5pc2hlZCwgb3IgdGhlIHRpbWVvdXQgb2NjdXJzCisgICAgcHJpdmF0ZSBDb25kaXRpb24gbUNvbmRpdGlvbkFsbFByb2ZpbGVzQ29ubmVjdGVkOworICAgIHByaXZhdGUgUmVlbnRyYW50TG9jayBtUHJvZmlsZUNvbm5lY3RlZExvY2s7CisgICAgcHJpdmF0ZSBpbnQgbVByb2ZpbGVzU3VwcG9ydGVkOworCisgICAgLy8gQ2FwdHVyZSBwcm9maWxlIHByb3h5IGNvbm5lY3Rpb24gZXZlbnRzCisgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBQcm9maWxlU2VydmljZUxpc3RlbmVyIGltcGxlbWVudHMgQmx1ZXRvb3RoUHJvZmlsZS5TZXJ2aWNlTGlzdGVuZXIgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKGludCBwcm9maWxlLCBCbHVldG9vdGhQcm9maWxlIHByb3h5KSB7CisgICAgICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUHJvZmlsZSAnIiArIHByb2ZpbGUgKyAiJyBoYXMgY29ubmVjdGVkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUHJvZmlsZUNvbm5lY3RlZExvY2subG9jaygpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzUmVxdWlyZWRCbHVldG9vdGhQcm9maWxlcy5nZXQocHJvZmlsZSkubUNvbm5lY3RlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgbVByb2ZpbGVzU3VwcG9ydGVkKys7CisgICAgICAgICAgICAgICAgaWYgKG1Qcm9maWxlc1N1cHBvcnRlZCA9PSBNQVhfUFJPRklMRVNfU1VQUE9SVEVEKSB7CisgICAgICAgICAgICAgICAgICAgIG1Db25kaXRpb25BbGxQcm9maWxlc0Nvbm5lY3RlZC5zaWduYWwoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIG1Qcm9maWxlQ29ubmVjdGVkTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VEaXNjb25uZWN0ZWQoaW50IHByb2ZpbGUpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJQcm9maWxlICciICsgcHJvZmlsZSArICInIGhhcyBkaXNjb25uZWN0ZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Qcm9maWxlQ29ubmVjdGVkTG9jay5sb2NrKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNSZXF1aXJlZEJsdWV0b290aFByb2ZpbGVzLmdldChwcm9maWxlKS5tQ29ubmVjdGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbVByb2ZpbGVzU3VwcG9ydGVkLS07CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIG1Qcm9maWxlQ29ubmVjdGVkTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEluaXRpYXRlIGNvbm5lY3Rpb25zIHRvIGFsbCBwcm9maWxlcyBhbmQgd2FpdCB1bnRpbCB3ZSBjb25uZWN0IHRvIGFsbCwgb3IgdGltZSBvdXQKKyAgICBwcml2YXRlIHZvaWQgd2FpdEZvclByb2ZpbGVDb25uZWN0aW9ucygpIHsKKyAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiU3RhcnRpbmcgcHJvZmlsZSBwcm94eSBjb25uZWN0aW9ucy4uLiIpOworICAgICAgICB9CisgICAgICAgIG1Qcm9maWxlQ29ubmVjdGVkTG9jay5sb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBBdHRlbXB0IGNvbm5lY3Rpb24gdG8gZWFjaCByZXF1aXJlZCBwcm9maWxlCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNSZXF1aXJlZEJsdWV0b290aFByb2ZpbGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50IHByb2ZpbGUgPSBzUmVxdWlyZWRCbHVldG9vdGhQcm9maWxlcy5rZXlBdChpKTsKKyAgICAgICAgICAgICAgICBtQmx1ZXRvb3RoQWRhcHRlci5nZXRQcm9maWxlUHJveHkobUNvbnRleHQsIG5ldyBQcm9maWxlU2VydmljZUxpc3RlbmVyKCksIHByb2ZpbGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBXYWl0IGZvciB0aGUgQWRhcHRlciB0byBiZSBkaXNhYmxlZAorICAgICAgICAgICAgd2hpbGUgKG1Qcm9maWxlc1N1cHBvcnRlZCAhPSBNQVhfUFJPRklMRVNfU1VQUE9SVEVEKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtQ29uZGl0aW9uQWxsUHJvZmlsZXNDb25uZWN0ZWQuYXdhaXQoCisgICAgICAgICAgICAgICAgICAgIFBST1hZX0NPTk5FQ1RJT05TX1RJTUVPVVRfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiVGltZW91dCB3aGlsZSB3YWl0aW5nIGZvciBQcm9maWxlIENvbm5lY3Rpb25zIik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncoVEFHLCAid2FpdEZvclByb2ZpbGVDb25uZWN0aW9uczogaW50ZXJydXB0ZWQiLCBlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIG1Qcm9maWxlQ29ubmVjdGVkTG9jay51bmxvY2soKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChEQkcpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIlByb3h5IGNvbm5lY3Rpb24gYXR0ZW1wdHMgY29tcGxldGUuIENvbm5lY3RlZCAiICsgbVByb2ZpbGVzU3VwcG9ydGVkCisgICAgICAgICAgICAgICAgICAgICsgIi8iICsgTUFYX1BST0ZJTEVTX1NVUFBPUlRFRCArICIgcHJvZmlsZXMiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIENoZWNrIGFuZCBtYWtlIHN1cmUgZWFjaCBwcm9maWxlIGlzIGNvbm5lY3RlZC4gSWYgYW55IGFyZSBub3Qgc3VwcG9ydGVkIHRoZW4gYnVpbGQgYW4KKyAgICAvLyBlcnJvciBzdHJpbmcgdG8gcmVwb3J0IGVhY2ggbWlzc2luZyBwcm9maWxlIGFuZCBhc3NlcnQgYSBmYWlsdXJlCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrUHJvZmlsZUNvbm5lY3Rpb25zKCkgeworICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJDaGVja2luZyBmb3IgYWxsIHJlcXVpcmVkIHByb2ZpbGVzIik7CisgICAgICAgIH0KKyAgICAgICAgbVByb2ZpbGVDb25uZWN0ZWRMb2NrLmxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChtUHJvZmlsZXNTdXBwb3J0ZWQgIT0gTUFYX1BST0ZJTEVTX1NVUFBPUlRFRCkgeworICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU29tZSBwcm9maWxlcyBmYWlsZWQgdG8gY29ubmVjdCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGUgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc1JlcXVpcmVkQmx1ZXRvb3RoUHJvZmlsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHByb2ZpbGUgPSBzUmVxdWlyZWRCbHVldG9vdGhQcm9maWxlcy5rZXlBdChpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBzUmVxdWlyZWRCbHVldG9vdGhQcm9maWxlcy5nZXQocHJvZmlsZSkubU5hbWU7CisgICAgICAgICAgICAgICAgICAgIGlmICghc1JlcXVpcmVkQmx1ZXRvb3RoUHJvZmlsZXMuZ2V0KHByb2ZpbGUpLm1Db25uZWN0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmFwcGVuZCgiTWlzc2luZyBQcm9maWxlczogIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZS5hcHBlbmQobmFtZSArICIgKCIgKyBwcm9maWxlICsgIikiKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgbmFtZSArICIgZmFpbGVkIHRvIGNvbm5lY3QiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmYWlsKGUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBtUHJvZmlsZUNvbm5lY3RlZExvY2sudW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBTZXQgdGhlIGNvbm5lY3Rpb24gc3RhdHVzIGZvciBlYWNoIHByb2ZpbGUgdG8gZmFsc2UKKyAgICBwcml2YXRlIHZvaWQgY2xlYXJQcm9maWxlU3RhdHVzZXMoKSB7CisgICAgICAgIGlmIChEQkcpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIlNldHRpbmcgYWxsIHByb2ZpbGVzIHRvICdkaXNjb25uZWN0ZWQnIik7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzUmVxdWlyZWRCbHVldG9vdGhQcm9maWxlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaW50IHByb2ZpbGUgPSBzUmVxdWlyZWRCbHVldG9vdGhQcm9maWxlcy5rZXlBdChpKTsKKyAgICAgICAgICAgIHNSZXF1aXJlZEJsdWV0b290aFByb2ZpbGVzLmdldChwcm9maWxlKS5tQ29ubmVjdGVkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiU2V0dGluZyB1cCBBdXRvbW90aXZlIEJsdWV0b290aCB0ZXN0LiBEZXZpY2UgaXMgIgorICAgICAgICAgICAgICAgICAgICArIChGZWF0dXJlVXRpbC5pc0F1dG9tb3RpdmUoKSA/ICIiIDogIm5vdCAiKSArICJhdXRvbW90aXZlIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBBdXRvbW90aXZlIG9ubHkKKyAgICAgICAgYXNzdW1lVHJ1ZShGZWF0dXJlVXRpbC5pc0F1dG9tb3RpdmUoKSk7CisKKyAgICAgICAgLy8gR2V0IHRoZSBjb250ZXh0CisgICAgICAgIG1Db250ZXh0ID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VGFyZ2V0Q29udGV4dCgpOworCisgICAgICAgIC8vIEdldCBibHVldG9vdGggY29yZSBvYmplY3RzIHNvIHdlIGNhbiBnZXQgcHJveGllcy9jaGVjayBmb3IgcHJvZmlsZSBleGlzdGVuY2UKKyAgICAgICAgbUJsdWV0b290aE1hbmFnZXIgPSAoQmx1ZXRvb3RoTWFuYWdlcikgbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZSgKKyAgICAgICAgICAgICAgICBDb250ZXh0LkJMVUVUT09USF9TRVJWSUNFKTsKKyAgICAgICAgbUJsdWV0b290aEFkYXB0ZXIgPSBtQmx1ZXRvb3RoTWFuYWdlci5nZXRBZGFwdGVyKCk7CisKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSBhbGwgdGhlIHByb2ZpbGUgY29ubmVjdGlvbiB2YXJpYWJsZXMKKyAgICAgICAgbVByb2ZpbGVzU3VwcG9ydGVkID0gMDsKKyAgICAgICAgbVByb2ZpbGVDb25uZWN0ZWRMb2NrID0gbmV3IFJlZW50cmFudExvY2soKTsKKyAgICAgICAgbUNvbmRpdGlvbkFsbFByb2ZpbGVzQ29ubmVjdGVkID0gbVByb2ZpbGVDb25uZWN0ZWRMb2NrLm5ld0NvbmRpdGlvbigpOworICAgICAgICBjbGVhclByb2ZpbGVTdGF0dXNlcygpOworCisgICAgICAgIC8vIFJlZ2lzdGVyIHRoZSBhZGFwdGVyIHJlY2VpdmVyIGFuZCBpbml0aWFsaXplIGFkYXB0ZXIgc3RhdGUgd2FpdCBvYmplY3RzCisgICAgICAgIG1EZXNpcmVkU3RhdGUgPSAtMTsgLy8gU2V0IGFuZCBjaGVja2VkIGJ5IHdhaXRGb3JBZGFwdGVyU3RhdGUoKQorICAgICAgICBtQmx1ZXRvb3RoQWRhcHRlckxvY2sgPSBuZXcgUmVlbnRyYW50TG9jaygpOworICAgICAgICBtQ29uZGl0aW9uQWRhcHRlclN0YXRlUmVhY2hlZCA9IG1CbHVldG9vdGhBZGFwdGVyTG9jay5uZXdDb25kaXRpb24oKTsKKyAgICAgICAgbUJsdWV0b290aEFkYXB0ZXJSZWNlaXZlciA9IG5ldyBCbHVldG9vdGhBZGFwdGVyUmVjZWl2ZXIoKTsKKyAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoQmx1ZXRvb3RoQWRhcHRlci5BQ1RJT05fU1RBVEVfQ0hBTkdFRCk7CisgICAgICAgIG1Db250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIobUJsdWV0b290aEFkYXB0ZXJSZWNlaXZlciwgZmlsdGVyKTsKKworICAgICAgICAvLyBNYWtlIHN1cmUgQmx1ZXRvb3RoIGlzIGVuYWJsZWQgYmVmb3JlIHRoZSB0ZXN0CisgICAgICAgIHdhaXRGb3JBZGFwdGVyT24oKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtQmx1ZXRvb3RoQWRhcHRlci5pc0VuYWJsZWQoKSk7CisgICAgfQorCisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CisgICAgICAgIHdhaXRGb3JBZGFwdGVyT2ZmKCk7CisgICAgICAgIG1Db250ZXh0LnVucmVnaXN0ZXJSZWNlaXZlcihtQmx1ZXRvb3RoQWRhcHRlclJlY2VpdmVyKTsKKyAgICB9CisKKyAgICAvLyBbQS0wLTJdIDogQW5kcm9pZCBBdXRvbW90aXZlIGRldmljZXMgbXVzdCBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgQmx1ZXRvb3RoIHByb2ZpbGVzOgorICAgIC8vICAqIEhhbmRzIEZyZWUgUHJvZmlsZSAoSEZQKSBbUGhvbmUgY2FsbGluZ10KKyAgICAvLyAgKiBBdWRpbyBEaXN0cmlidXRpb24gUHJvZmlsZSAoQTJEUCkgW01lZGlhIHBsYXliYWNrXQorICAgIC8vICAqIEF1ZGlvL1ZpZGVvIFJlbW90ZSBDb250cm9sIFByb2ZpbGUgKEFWUkNQKSBbTWVkaWEgcGxheWJhY2sgY29udHJvbF0KKyAgICAvLyAgKiBQaG9uZSBCb29rIEFjY2VzcyBQcm9maWxlIChQQkFQKSBbQ29udGFjdCBzaGFyaW5nL3JlY2VpdmluZ10KKyAgICAvLworICAgIC8vIFRoaXMgdGVzdCBmaXJlcyBvZmYgY29ubmVjdGlvbnMgdG8gZWFjaCByZXF1aXJlZCBwcm9maWxlICh3aGljaCBhcmUgYXN5bmNocm9ub3VzIGluIG5hdHVyZSkKKyAgICAvLyBhbmQgd2FpdHMgZm9yIGFsbCBvZiB0aGVtIHRvIGNvbm5lY3QgKHByb3ZpbmcgdGhleSBhcmUgdGhlcmUgYW5kIGltcGxlbWVudGVkKSwgb3IgZm9yIHRoZQorICAgIC8vIGNvbmZpZ3VyZWQgdGltZW91dC4gSWYgYWxsIHJlcXVpcmVkIHByb2ZpbGVzIGNvbm5lY3QsIHRoZSB0ZXN0IHBhc3Nlcy4KKyAgICBAVGVzdAorICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50ID0gIjcuNC4zL0EtMC0yIikKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWlyZWRCbHVldG9vdGhQcm9maWxlc0V4aXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChEQkcpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIkJlZ2luIHRlc3RSZXF1aXJlZEJsdWV0b290aFByb2ZpbGVzRXhpc3QoKSIpOworICAgICAgICB9CisgICAgICAgIGFzc2VydE5vdE51bGwobUJsdWV0b290aEFkYXB0ZXIpOworICAgICAgICB3YWl0Rm9yUHJvZmlsZUNvbm5lY3Rpb25zKCk7CisgICAgICAgIGNoZWNrUHJvZmlsZUNvbm5lY3Rpb25zKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvY2FyL3NyYy9hbmRyb2lkL2Nhci9jdHMvQ2FySW5mb01hbmFnZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9jYXIvc3JjL2FuZHJvaWQvY2FyL2N0cy9DYXJJbmZvTWFuYWdlclRlc3QuamF2YQppbmRleCBiNzEzY2I4Li42NTU5YTEyIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9jYXIvc3JjL2FuZHJvaWQvY2FyL2N0cy9DYXJJbmZvTWFuYWdlclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9jYXIvc3JjL2FuZHJvaWQvY2FyL2N0cy9DYXJJbmZvTWFuYWdlclRlc3QuamF2YQpAQCAtMTUsMzIgKzE1LDM4IEBACiAgKi8KIHBhY2thZ2UgYW5kcm9pZC5jYXIuY3RzOwogCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKKwogaW1wb3J0IGFuZHJvaWQuY2FyLkNhcjsKIGltcG9ydCBhbmRyb2lkLmNhci5DYXJJbmZvTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUmVxdWlyZXNEZXZpY2U7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlNtYWxsVGVzdDsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ2RkVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKLUBDZGRUZXN0KHJlcXVpcmVtZW50PSIyLjUuMy9BLTAtMyIpCiBAU21hbGxUZXN0CiBAUmVxdWlyZXNEZXZpY2UKK0BSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCiBwdWJsaWMgY2xhc3MgQ2FySW5mb01hbmFnZXJUZXN0IGV4dGVuZHMgQ2FyQXBpVGVzdEJhc2UgewogCiAgICAgcHJpdmF0ZSBDYXJJbmZvTWFuYWdlciBtQ2FySW5mb01hbmFnZXI7CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBzdXBlci5zZXRVcCgpOwogICAgICAgICBtQ2FySW5mb01hbmFnZXIgPSAoQ2FySW5mb01hbmFnZXIpIGdldENhcigpLmdldENhck1hbmFnZXIoQ2FyLklORk9fU0VSVklDRSk7CiAgICAgfQogCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0VmVoaWNsZUlkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGFzc2VydE5vdE51bGwobUNhckluZm9NYW5hZ2VyLmdldFZlaGljbGVJZCgpKTsKICAgICB9CiAKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsYWJsZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gbm8gZ3VhcmFudGVlIG9mIGV4aXN0ZW5jZS4ganVzdCBjYWxsIGFuZCBjaGVjayBpZiBpdCB0aHJvd3MgZXhjZXB0aW9uLgogICAgICAgICBtQ2FySW5mb01hbmFnZXIuZ2V0TWFudWZhY3R1cmVyKCk7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9jYXIvc3JjL2FuZHJvaWQvY2FyL2N0cy9DYXJQYWNrYWdlTWFuYWdlclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2Nhci9zcmMvYW5kcm9pZC9jYXIvY3RzL0NhclBhY2thZ2VNYW5hZ2VyVGVzdC5qYXZhCmluZGV4IDViZWU0NGIuLjVmMzkxZTQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2Nhci9zcmMvYW5kcm9pZC9jYXIvY3RzL0NhclBhY2thZ2VNYW5hZ2VyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2Nhci9zcmMvYW5kcm9pZC9jYXIvY3RzL0NhclBhY2thZ2VNYW5hZ2VyVGVzdC5qYXZhCkBAIC0xNSwyMCArMTUsMjUgQEAKICAqLwogcGFja2FnZSBhbmRyb2lkLmNhci5jdHM7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKIGltcG9ydCBhbmRyb2lkLmNhci5DYXI7CiBpbXBvcnQgYW5kcm9pZC5jYXIuQ2FyTm90Q29ubmVjdGVkRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQuY2FyLmNvbnRlbnQucG0uQ2FyUGFja2FnZU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkFwcGxpY2F0aW9uSW5mbzsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZUluZm87Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5SZXF1aXJlc0RldmljZTsKIGltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OwogCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCiBAU21hbGxUZXN0CiBAUmVxdWlyZXNEZXZpY2UKK0BSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCiBwdWJsaWMgY2xhc3MgQ2FyUGFja2FnZU1hbmFnZXJUZXN0IGV4dGVuZHMgQ2FyQXBpVGVzdEJhc2UgewogCiAgICAgcHJpdmF0ZSBDYXJQYWNrYWdlTWFuYWdlciBtQ2FyUG07CkBAIC0zNyw3NiArNDIsNDkgQEAKICAgICAvKiogTmFtZSBvZiB0aGUgbWV0YS1kYXRhIGF0dHJpYnV0ZSBmb3IgdGhlIGF1dG9tb3RpdmUgYXBwbGljYXRpb24gWE1MIHJlc291cmNlICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBX0FUVFJJQlVURSA9ICJhbmRyb2lkLmNhci5hcHBsaWNhdGlvbiI7CiAKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHN1cGVyLnNldFVwKCk7CiAgICAgICAgIG1DYXJQbSA9IChDYXJQYWNrYWdlTWFuYWdlcikgZ2V0Q2FyKCkuZ2V0Q2FyTWFuYWdlcihDYXIuUEFDS0FHRV9TRVJWSUNFKTsKICAgICB9CiAKLSAgIHB1YmxpYyB2b2lkIHRlc3RBY3Rpdml0eUFsbG93ZWRXaGlsZURyaXZpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICBhc3NlcnRGYWxzZShtQ2FyUG0uaXNBY3Rpdml0eUFsbG93ZWRXaGlsZURyaXZpbmcoImNvbS5iYXNpYy5wYWNrYWdlIiwgIkR1bW15QWN0aXZpdHkiKSk7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWN0aXZpdHlEaXN0cmFjdGlvbk9wdGltaXplZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgIGFzc2VydEZhbHNlKG1DYXJQbS5pc0FjdGl2aXR5RGlzdHJhY3Rpb25PcHRpbWl6ZWQoImNvbS5iYXNpYy5wYWNrYWdlIiwgIkR1bW15QWN0aXZpdHkiKSk7CiAgICAgICAgLy8gUmVhbCBzeXN0ZW0gYWN0aXZpdHkgaXMgbm90IGFsbG93ZWQgYXMgd2VsbC4KLSAgICAgICBhc3NlcnRGYWxzZShtQ2FyUG0uaXNBY3Rpdml0eUFsbG93ZWRXaGlsZURyaXZpbmcoImNvbS5hbmRyb2lkLnBob25lIiwgIkNhbGxBY3Rpdml0eSIpKTsKKyAgICAgICBhc3NlcnRGYWxzZShtQ2FyUG0uaXNBY3Rpdml0eURpc3RyYWN0aW9uT3B0aW1pemVkKCJjb20uYW5kcm9pZC5waG9uZSIsICJDYWxsQWN0aXZpdHkiKSk7CiAKICAgICAgICB0cnkgewotICAgICAgICAgICBtQ2FyUG0uaXNBY3Rpdml0eUFsbG93ZWRXaGlsZURyaXZpbmcoImNvbS5hbmRyb2lkLnNldHRpbmdzIiwgbnVsbCk7CisgICAgICAgICAgIG1DYXJQbS5pc0FjdGl2aXR5RGlzdHJhY3Rpb25PcHRpbWl6ZWQoImNvbS5hbmRyb2lkLnNldHRpbmdzIiwgbnVsbCk7CiAgICAgICAgICAgIGZhaWwoKTsKICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhwZWN0ZWQpIHsKICAgICAgICAgICAgLy8gRXhwZWN0ZWQuCiAgICAgICAgfQogICAgICAgIHRyeSB7Ci0gICAgICAgICAgIG1DYXJQbS5pc0FjdGl2aXR5QWxsb3dlZFdoaWxlRHJpdmluZyhudWxsLCAiQW55Iik7CisgICAgICAgICAgIG1DYXJQbS5pc0FjdGl2aXR5RGlzdHJhY3Rpb25PcHRpbWl6ZWQobnVsbCwgIkFueSIpOwogICAgICAgICAgICBmYWlsKCk7CiAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4cGVjdGVkKSB7CiAgICAgICAgICAgIC8vIEV4cGVjdGVkLgogICAgICAgIH0KICAgICAgICB0cnkgewotICAgICAgICAgICBtQ2FyUG0uaXNBY3Rpdml0eUFsbG93ZWRXaGlsZURyaXZpbmcobnVsbCwgbnVsbCk7CisgICAgICAgICAgIG1DYXJQbS5pc0FjdGl2aXR5RGlzdHJhY3Rpb25PcHRpbWl6ZWQobnVsbCwgbnVsbCk7CiAgICAgICAgICAgIGZhaWwoKTsKICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhwZWN0ZWQpIHsKICAgICAgICAgICAgLy8gRXhwZWN0ZWQuCiAgICAgICAgfQotICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN5c3RlbUFjdGl2aXRpZXNBbGxvd2VkKCkgdGhyb3dzIENhck5vdENvbm5lY3RlZEV4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3Q8UGFja2FnZUluZm8+IHBhY2thZ2VzID0gZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VNYW5hZ2VyKCkuZ2V0SW5zdGFsbGVkUGFja2FnZXMoCi0gICAgICAgICAgICAgICAgUGFja2FnZU1hbmFnZXIuR0VUX0FDVElWSVRJRVMgfCBQYWNrYWdlTWFuYWdlci5HRVRfTUVUQV9EQVRBKTsKLQotICAgICAgICBmb3IgKFBhY2thZ2VJbmZvIGluZm8gOiBwYWNrYWdlcykgewotICAgICAgICAgICAgaWYgKGluZm8uYXBwbGljYXRpb25JbmZvID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgoaW5mby5hcHBsaWNhdGlvbkluZm8uZmxhZ3MgJiBBcHBsaWNhdGlvbkluZm8uRkxBR19TWVNURU0pICE9IDAgfHwKLSAgICAgICAgICAgICAgICAgICAgKChpbmZvLmFwcGxpY2F0aW9uSW5mby5mbGFncyAmIEFwcGxpY2F0aW9uSW5mby5GTEFHX1VQREFURURfU1lTVEVNX0FQUCkgIT0gMCkpIHsKLQotICAgICAgICAgICAgICAgIEJ1bmRsZSBtZXRhRGF0YSA9IGluZm8uYXBwbGljYXRpb25JbmZvLm1ldGFEYXRhOwotICAgICAgICAgICAgICAgIGlmIChtZXRhRGF0YSA9PSBudWxsIHx8IG1ldGFEYXRhLmdldEludChNRVRBREFUQV9BVFRSSUJVVEUsIDApID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7ICAvLyBObyBjYXIgbWV0YWRhdGEsIGlnbm9yaW5nIHRoaXMgYXBwLgotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpbmZvLmFjdGl2aXRpZXMgIT0gbnVsbCAmJiBpbmZvLmFjdGl2aXRpZXMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYWN0aXZpdHkgPSBpbmZvLmFjdGl2aXRpZXNbMF0ubmFtZTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gaW5mby5wYWNrYWdlTmFtZTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRmFpbGVkIGZvciBwYWNrYWdlOiAiICsgcGFja2FnZU5hbWUgKyAiLCBhY3Rpdml0eTogIiArIGFjdGl2aXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYXJQbS5pc0FjdGl2aXR5QWxsb3dlZFdoaWxlRHJpdmluZyhwYWNrYWdlTmFtZSwgYWN0aXZpdHkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VydmljZUFsbG93ZWRXaGlsZURyaXZpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0RmFsc2UobUNhclBtLmlzU2VydmljZUFsbG93ZWRXaGlsZURyaXZpbmcoImNvbS5iYXNpYy5wYWNrYWdlIiwgIiIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShtQ2FyUG0uaXNTZXJ2aWNlQWxsb3dlZFdoaWxlRHJpdmluZygiY29tLmFuZHJvaWQuc2V0dGluZ3MiLCAiQW55IikpOwotICAgICAgICBhc3NlcnRUcnVlKG1DYXJQbS5pc1NlcnZpY2VBbGxvd2VkV2hpbGVEcml2aW5nKCJjb20uYW5kcm9pZC5zZXR0aW5ncyIsICIiKSk7Ci0gICAgICAgIGFzc2VydFRydWUobUNhclBtLmlzU2VydmljZUFsbG93ZWRXaGlsZURyaXZpbmcoImNvbS5hbmRyb2lkLnNldHRpbmdzIiwgbnVsbCkpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtQ2FyUG0uaXNTZXJ2aWNlQWxsb3dlZFdoaWxlRHJpdmluZyhudWxsLCAiQW55Iik7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleHBlY3RlZCkgewotICAgICAgICAgICAgLy8gRXhwZWN0ZWQuCi0gICAgICAgIH0KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REaXN0cmFjdGlvbk9wdGltaXplZEFjdGl2aXR5SXNBbGxvd2VkKCkgdGhyb3dzIENhck5vdENvbm5lY3RlZEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFRoaXMgdGVzdCByZWxpZXMgb24gdGVzdCBhY3Rpdml0eSBpbiBpbnN0YWxsZWQgYXBrLCBhbmQgQW5kcm9pZE1hbmlmZXN0IGRlY2xhcmF0aW9uLgorICAgICAgICBhc3NlcnRUcnVlKG1DYXJQbS5pc0FjdGl2aXR5RGlzdHJhY3Rpb25PcHRpbWl6ZWQoImFuZHJvaWQuY2FyLmN0cyIsCisgICAgICAgICAgICAgICAgImFuZHJvaWQuY2FyLmN0cy5kcml2aW5nc3RhdGUuRGlzdHJhY3Rpb25PcHRpbWl6ZWRBY3Rpdml0eSIpKTsKICAgICB9CiAKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb25EaXN0cmFjdGlvbk9wdGltaXplZEFjdGl2aXR5Tm90QWxsb3dlZCgpIHRocm93cyBDYXJOb3RDb25uZWN0ZWRFeGNlcHRpb24geworICAgICAgICAvLyBUaGlzIHRlc3QgcmVsaWVzIG9uIHRlc3QgYWN0aXZpdHkgaW4gaW5zdGFsbGVkIGFwaywgYW5kIEFuZHJvaWRNYW5pZmVzdCBkZWNsYXJhdGlvbi4KKyAgICAgICAgYXNzZXJ0RmFsc2UobUNhclBtLmlzQWN0aXZpdHlEaXN0cmFjdGlvbk9wdGltaXplZCgiYW5kcm9pZC5jYXIuY3RzIiwKKyAgICAgICAgICAgICAgICAiYW5kcm9pZC5jYXIuY3RzLmRyaXZpbmdzdGF0ZS5Ob25EaXN0cmFjdGlvbk9wdGltaXplZEFjdGl2aXR5IikpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2Nhci9zcmMvYW5kcm9pZC9jYXIvY3RzL0NhclNlbnNvck1hbmFnZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9jYXIvc3JjL2FuZHJvaWQvY2FyL2N0cy9DYXJTZW5zb3JNYW5hZ2VyVGVzdC5qYXZhCmluZGV4IGQwZmU3NWIuLjUzMjU3NjggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2Nhci9zcmMvYW5kcm9pZC9jYXIvY3RzL0NhclNlbnNvck1hbmFnZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvY2FyL3NyYy9hbmRyb2lkL2Nhci9jdHMvQ2FyU2Vuc29yTWFuYWdlclRlc3QuamF2YQpAQCAtMTYsNDEgKzE2LDY4IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5jYXIuY3RzOwogCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCiBpbXBvcnQgYW5kcm9pZC5jYXIuQ2FyOwotaW1wb3J0IGFuZHJvaWQuY2FyLmhhcmR3YXJlLkNhclNlbnNvckV2ZW50OwogaW1wb3J0IGFuZHJvaWQuY2FyLmhhcmR3YXJlLkNhclNlbnNvck1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlJlcXVpcmVzRGV2aWNlOwogaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TbWFsbFRlc3Q7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DZGRUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkludFN0cmVhbTsKKwogQFNtYWxsVGVzdAogQFJlcXVpcmVzRGV2aWNlCitAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQogcHVibGljIGNsYXNzIENhclNlbnNvck1hbmFnZXJUZXN0IGV4dGVuZHMgQ2FyQXBpVGVzdEJhc2UgewogCi0gICAgcHJpdmF0ZSBDYXJTZW5zb3JNYW5hZ2VyIG1DYXJTZW5zb3JNYW5hZ2VyOworICAgIHByaXZhdGUgaW50W10gbVN1cHBvcnRlZFNlbnNvcnM7CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBtQ2FyU2Vuc29yTWFuYWdlciA9IChDYXJTZW5zb3JNYW5hZ2VyKSBnZXRDYXIoKS5nZXRDYXJNYW5hZ2VyKENhci5TRU5TT1JfU0VSVklDRSk7CisgICAgICAgIENhclNlbnNvck1hbmFnZXIgY2FyU2Vuc29yTWFuYWdlciA9CisgICAgICAgICAgICAgICAgKENhclNlbnNvck1hbmFnZXIpIGdldENhcigpLmdldENhck1hbmFnZXIoQ2FyLlNFTlNPUl9TRVJWSUNFKTsKKyAgICAgICAgbVN1cHBvcnRlZFNlbnNvcnMgPSBjYXJTZW5zb3JNYW5hZ2VyLmdldFN1cHBvcnRlZFNlbnNvcnMoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtU3VwcG9ydGVkU2Vuc29ycyk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgdGVzdERyaXZpbmdQb2xpY3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaW50W10gc3VwcG9ydGVkU2Vuc29ycyA9IG1DYXJTZW5zb3JNYW5hZ2VyLmdldFN1cHBvcnRlZFNlbnNvcnMoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzdXBwb3J0ZWRTZW5zb3JzKTsKLSAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotICAgICAgICBmb3IgKGludCBzZW5zb3I6IHN1cHBvcnRlZFNlbnNvcnMpIHsKLSAgICAgICAgICAgIGlmIChzZW5zb3IgPT0gQ2FyU2Vuc29yTWFuYWdlci5TRU5TT1JfVFlQRV9EUklWSU5HX1NUQVRVUykgewotICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGZvdW5kKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShtQ2FyU2Vuc29yTWFuYWdlci5pc1NlbnNvclN1cHBvcnRlZCgKLSAgICAgICAgICAgICAgICBDYXJTZW5zb3JNYW5hZ2VyLlNFTlNPUl9UWVBFX0RSSVZJTkdfU1RBVFVTKSk7Ci0gICAgICAgIGFzc2VydFRydWUoQ2FyU2Vuc29yTWFuYWdlci5pc1NlbnNvclN1cHBvcnRlZChzdXBwb3J0ZWRTZW5zb3JzLAotICAgICAgICAgICAgICAgIENhclNlbnNvck1hbmFnZXIuU0VOU09SX1RZUEVfRFJJVklOR19TVEFUVVMpKTsKLSAgICAgICAgQ2FyU2Vuc29yRXZlbnQgbGFzdEV2ZW50ID0gbUNhclNlbnNvck1hbmFnZXIuZ2V0TGF0ZXN0U2Vuc29yRXZlbnQoCi0gICAgICAgICAgICAgICAgQ2FyU2Vuc29yTWFuYWdlci5TRU5TT1JfVFlQRV9EUklWSU5HX1NUQVRVUyk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwobGFzdEV2ZW50KTsKKyAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iMi41LjEiKQorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcXVpcmVkU2Vuc29yc0ZvckRyaXZpbmdTdGF0ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBib29sZWFuIGZvdW5kU3BlZWQgPQorICAgICAgICAgICAgaXNTdXBwb3J0U2Vuc29yKENhclNlbnNvck1hbmFnZXIuU0VOU09SX1RZUEVfQ0FSX1NQRUVEKTsKKyAgICAgICAgYm9vbGVhbiBmb3VuZEdlYXIgPSBpc1N1cHBvcnRTZW5zb3IoQ2FyU2Vuc29yTWFuYWdlci5TRU5TT1JfVFlQRV9HRUFSKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiTXVzdCBzdXBwb3J0IFNFTlNPUl9UWVBFX0NBUl9TUEVFRCIsIGZvdW5kU3BlZWQpOworICAgICAgICBhc3NlcnRUcnVlKCJNdXN0IHN1cHBvcnQgU0VOU09SX1RZUEVfR0VBUiIsIGZvdW5kR2Vhcik7CisgICAgfQorCisgICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjIuNS4xIikKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNdXN0U3VwcG9ydE5pZ2h0U2Vuc29yKCkgeworICAgICAgICBib29sZWFuIGZvdW5kTmlnaHRTZW5zb3IgPQorICAgICAgICAgICAgaXNTdXBwb3J0U2Vuc29yKENhclNlbnNvck1hbmFnZXIuU0VOU09SX1RZUEVfTklHSFQpOworICAgICAgICBhc3NlcnRUcnVlKCJNdXN0IHN1cHBvcnQgU0VOU09SX1RZUEVfTklHSFQiLCBmb3VuZE5pZ2h0U2Vuc29yKTsKKyAgICB9CisKKyAgICBAQ2RkVGVzdChyZXF1aXJlbWVudCA9ICIyLjUuMSIpCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVzdFN1cHBvcnRQYXJraW5nQnJha2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYm9vbGVhbiBmb3VuZFBhcmtpbmdCcmFrZSA9CisgICAgICAgICAgICBpc1N1cHBvcnRTZW5zb3IoQ2FyU2Vuc29yTWFuYWdlci5TRU5TT1JfVFlQRV9QQVJLSU5HX0JSQUtFKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiTXVzdCBzdXBwb3J0IFNFTlNPUl9UWVBFX1BBUktJTkdfQlJBS0UiLCBmb3VuZFBhcmtpbmdCcmFrZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzU3VwcG9ydFNlbnNvcihpbnQgc2Vuc29yVHlwZSkgeworICAgICAgICByZXR1cm4gSW50U3RyZWFtLm9mKG1TdXBwb3J0ZWRTZW5zb3JzKQorICAgICAgICAgICAgLmFueU1hdGNoKHggLT4geCA9PSBzZW5zb3JUeXBlKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9jYXIvc3JjL2FuZHJvaWQvY2FyL2N0cy9DYXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9jYXIvc3JjL2FuZHJvaWQvY2FyL2N0cy9DYXJUZXN0LmphdmEKaW5kZXggZDIxNWM3Mi4uODI0YTExYiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvY2FyL3NyYy9hbmRyb2lkL2Nhci9jdHMvQ2FyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2Nhci9zcmMvYW5kcm9pZC9jYXIvY3RzL0NhclRlc3QuamF2YQpAQCAtMTUsMzMgKzE1LDUyIEBACiAgKi8KIHBhY2thZ2UgYW5kcm9pZC5jYXIuY3RzOwogCisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc3VtZS5hc3N1bWVUcnVlOworCiBpbXBvcnQgYW5kcm9pZC5jYXIuQ2FyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5TZXJ2aWNlQ29ubmVjdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlJlcXVpcmVzRGV2aWNlOwotaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlNtYWxsVGVzdDsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ2RkVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkZlYXR1cmVVdGlsOworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TZW1hcGhvcmU7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiAKLQotQENkZFRlc3QocmVxdWlyZW1lbnQ9IjIuNS4zL0EtMC0zIikKIEBTbWFsbFRlc3QKIEBSZXF1aXJlc0RldmljZQotcHVibGljIGNsYXNzIENhclRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBDYXJUZXN0IHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgREVGQVVMVF9XQUlUX1RJTUVPVVRfTVMgPSAyMDAwOwogCiAgICAgcHJpdmF0ZSBDYXIgbUNhcjsKICAgICBwcml2YXRlIERlZmF1bHRTZXJ2aWNlQ29ubmVjdGlvbkxpc3RlbmVyIG1TZXJ2aWNlQ29ubmVjdGlvbkxpc3RlbmVyOwogCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBhc3N1bWVUcnVlKEZlYXR1cmVVdGlsLmlzQXV0b21vdGl2ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25uZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIG1TZXJ2aWNlQ29ubmVjdGlvbkxpc3RlbmVyID0gbmV3IERlZmF1bHRTZXJ2aWNlQ29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0gICAgICAgIG1DYXIgPSBDYXIuY3JlYXRlQ2FyKGdldENvbnRleHQoKSwgbVNlcnZpY2VDb25uZWN0aW9uTGlzdGVuZXIpOworICAgICAgICBtQ2FyID0gQ2FyLmNyZWF0ZUNhcigKKyAgICAgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLmdldFRhcmdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgbVNlcnZpY2VDb25uZWN0aW9uTGlzdGVuZXIpOwogICAgICAgICBhc3NlcnRGYWxzZShtQ2FyLmlzQ29ubmVjdGVkKCkpOwogICAgICAgICBhc3NlcnRGYWxzZShtQ2FyLmlzQ29ubmVjdGluZygpKTsKICAgICAgICAgbUNhci5jb25uZWN0KCk7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9jYXIvc3JjL2FuZHJvaWQvY2FyL2N0cy9FeGNlcHRpb25zVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvY2FyL3NyYy9hbmRyb2lkL2Nhci9jdHMvRXhjZXB0aW9uc1Rlc3QuamF2YQppbmRleCA5MDQ2NTBmLi41YjkwZWUxIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9jYXIvc3JjL2FuZHJvaWQvY2FyL2N0cy9FeGNlcHRpb25zVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2Nhci9zcmMvYW5kcm9pZC9jYXIvY3RzL0V4Y2VwdGlvbnNUZXN0LmphdmEKQEAgLTE1LDE4ICsxNSwzNSBAQAogICovCiBwYWNrYWdlIGFuZHJvaWQuY2FyLmN0czsKIAoraW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzdW1lLmFzc3VtZVRydWU7CisKIGltcG9ydCBhbmRyb2lkLmNhci5DYXJOb3RDb25uZWN0ZWRFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlJlcXVpcmVzRGV2aWNlOwotaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlNtYWxsVGVzdDsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkZlYXR1cmVVdGlsOworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKIEBTbWFsbFRlc3QKIEBSZXF1aXJlc0RldmljZQotcHVibGljIGNsYXNzIEV4Y2VwdGlvbnNUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKK0BSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgRXhjZXB0aW9uc1Rlc3QgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFID0gIk9vcHMhIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBFeGNlcHRpb24gQ0FVU0UgPSBuZXcgUnVudGltZUV4Y2VwdGlvbigpOwogCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBhc3N1bWVUcnVlKEZlYXR1cmVVdGlsLmlzQXV0b21vdGl2ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RDYXJOb3RDb25uZWN0ZWRFeGNlcHRpb24oKSB7CiAgICAgICAgIENhck5vdENvbm5lY3RlZEV4Y2VwdGlvbiBleGNlcHRpb24gPSBuZXcgQ2FyTm90Q29ubmVjdGVkRXhjZXB0aW9uKCk7CiAgICAgICAgIGFzc2VydE51bGwoZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9jYXIvc3JjL2FuZHJvaWQvY2FyL2N0cy9kcml2aW5nc3RhdGUvRGlzdHJhY3Rpb25PcHRpbWl6ZWRBY3Rpdml0eS5qYXZhIGIvdGVzdHMvdGVzdHMvY2FyL3NyYy9hbmRyb2lkL2Nhci9jdHMvZHJpdmluZ3N0YXRlL0Rpc3RyYWN0aW9uT3B0aW1pemVkQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDQ0MGI2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvY2FyL3NyYy9hbmRyb2lkL2Nhci9jdHMvZHJpdmluZ3N0YXRlL0Rpc3RyYWN0aW9uT3B0aW1pemVkQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDYgQEAKK3BhY2thZ2UgYW5kcm9pZC5jYXIuY3RzLmRyaXZpbmdzdGF0ZTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworCitwdWJsaWMgY2xhc3MgRGlzdHJhY3Rpb25PcHRpbWl6ZWRBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9jYXIvc3JjL2FuZHJvaWQvY2FyL2N0cy9kcml2aW5nc3RhdGUvTm9uRGlzdHJhY3Rpb25PcHRpbWl6ZWRBY3Rpdml0eS5qYXZhIGIvdGVzdHMvdGVzdHMvY2FyL3NyYy9hbmRyb2lkL2Nhci9jdHMvZHJpdmluZ3N0YXRlL05vbkRpc3RyYWN0aW9uT3B0aW1pemVkQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzc1YTNhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvY2FyL3NyYy9hbmRyb2lkL2Nhci9jdHMvZHJpdmluZ3N0YXRlL05vbkRpc3RyYWN0aW9uT3B0aW1pemVkQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDYgQEAKK3BhY2thZ2UgYW5kcm9pZC5jYXIuY3RzLmRyaXZpbmdzdGF0ZTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworCitwdWJsaWMgY2xhc3MgTm9uRGlzdHJhY3Rpb25PcHRpbWl6ZWRBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2NhcnJpZXJhcGkvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL2NhcnJpZXJhcGkvQW5kcm9pZC5tawppbmRleCA5NTRhZTE0Li5iMGEwYzc4IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9jYXJyaWVyYXBpL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvdGVzdHMvY2FycmllcmFwaS9BbmRyb2lkLm1rCkBAIC0yMywxOCArMjMsMjUgQEAKIExPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCiAKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCi0gICAgY3RzdGVzdHJ1bm5lciBcCi0gICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbCBcCi0gICAganVuaXQgXAotICAgIGxlZ2FjeS1hbmRyb2lkLXRlc3QKKyAgICBjdHN0ZXN0cnVubmVyLWF4dCBcCisgICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgXAorICAgIGp1bml0CiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIAogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0NhcnJpZXJBcGlUZXN0Q2FzZXMKK0xPQ0FMX1BSSVZBVEVfUExBVEZPUk1fQVBJUyA6PSB0cnVlCiAKICMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKIExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiAKLUxPQ0FMX0pBVkFfTElCUkFSSUVTICs9IGFuZHJvaWQudGVzdC5ydW5uZXIgdGVsZXBob255LWNvbW1vbgorTE9DQUxfSkFWQV9MSUJSQVJJRVMgKz0gYW5kcm9pZC50ZXN0LnJ1bm5lci5zdHVicyB0ZWxlcGhvbnktY29tbW9uCitMT0NBTF9KQVZBX0xJQlJBUklFUyArPSBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicworCisjIFRoaXMgQVBLIG11c3QgYmUgc2lnbmVkIHRvIG1hdGNoIHRoZSB0ZXN0IFNJTSdzIGNlcnQgd2hpdGVsaXN0LgorIyBXaGlsZSAidGVzdGtleSIgaXMgdGhlIGRlZmF1bHQsIHRoZXJlIGFyZSBkaWZmZXJlbnQgcGVyLWRldmljZSB0ZXN0a2V5cywgc28KKyMgaGFyZC1jb2RlIHRoZSBBT1NQIGRlZmF1bHQga2V5IHRvIGVuc3VyZSBpdCBpcyB1c2VkIHJlZ2FyZGxlc3Mgb2YgYnVpbGQKKyMgZW52aXJvbm1lbnQuCitMT0NBTF9DRVJUSUZJQ0FURSA6PSBidWlsZC9tYWtlL3RhcmdldC9wcm9kdWN0L3NlY3VyaXR5L3Rlc3RrZXkKIAogaW5jbHVkZSAkKEJVSUxEX0NUU19QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvY2FycmllcmFwaS9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdGVzdHMvY2FycmllcmFwaS9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDAzMzhkOTkuLmRmZmM3ZjEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2NhcnJpZXJhcGkvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9jYXJyaWVyYXBpL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTE3LDE1ICsxNywxNSBAQAogPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKICAgICBwYWNrYWdlPSJhbmRyb2lkLmNhcnJpZXJhcGkuY3RzIj4KIAorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX0NPQVJTRV9MT0NBVElPTiIgLz4KICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkFDQ0VTU19ORVRXT1JLX1NUQVRFIiAvPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uRElTQUJMRV9LRVlHVUFSRCIgLz4KLSAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfUEhPTkVfU1RBVEUiIC8+CiAKICAgICA8YXBwbGljYXRpb24+CiAgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgogICAgIDwvYXBwbGljYXRpb24+CiAKLSAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmNhcnJpZXJhcGkuY3RzIj4KICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9Imxpc3RlbmVyIgogICAgICAgICAgICAgYW5kcm9pZDp2YWx1ZT0iY29tLmFuZHJvaWQuY3RzLnJ1bm5lci5DdHNUZXN0UnVuTGlzdGVuZXIiIC8+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9jYXJyaWVyYXBpL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL2NhcnJpZXJhcGkvQW5kcm9pZFRlc3QueG1sCmluZGV4IGU0NmQ1M2EuLjUwN2QyYTIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2NhcnJpZXJhcGkvQW5kcm9pZFRlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL2NhcnJpZXJhcGkvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgQ2FycmllciBBUElzIHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJ0ZWxlY29tIiAvPgogICAgIDxvcHRpb24gbmFtZT0ibm90LXNoYXJkYWJsZSIgdmFsdWU9InRydWUiIC8+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGFyZ2V0cHJlcC5Ub2tlblJlcXVpcmVtZW50Ij4KQEAgLTI1LDUgKzI2LDYgQEAKICAgICA8L3RhcmdldF9wcmVwYXJlcj4KICAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuQW5kcm9pZEpVbml0VGVzdCIgPgogICAgICAgICA8b3B0aW9uIG5hbWU9InBhY2thZ2UiIHZhbHVlPSJhbmRyb2lkLmNhcnJpZXJhcGkuY3RzIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImhpZGRlbi1hcGktY2hlY2tzIiB2YWx1ZT0iZmFsc2UiLz4KICAgICA8L3Rlc3Q+CiA8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9jYXJyaWVyYXBpL3NyYy9hbmRyb2lkL2NhcnJpZXJhcGkvY3RzL0FwbkRhdGFiYXNlVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvY2FycmllcmFwaS9zcmMvYW5kcm9pZC9jYXJyaWVyYXBpL2N0cy9BcG5EYXRhYmFzZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWJhM2ZjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvY2FycmllcmFwaS9zcmMvYW5kcm9pZC9jYXJyaWVyYXBpL2N0cy9BcG5EYXRhYmFzZVRlc3QuamF2YQpAQCAtMCwwICsxLDM5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQuY2FycmllcmFwaS5jdHM7CisKK2ltcG9ydCBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlLmFzc2VydEVxdWFsczsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlRlbGVwaG9ueS5DYXJyaWVyczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogQnVpbGQsIGluc3RhbGwgYW5kIHJ1biB0aGUgdGVzdHMgYnkgcnVubmluZyB0aGUgY29tbWFuZHMgYmVsb3c6CisgKiAgbWFrZSBjdHMgLWo2NAorICogIGN0cy10cmFkZWZlZCBydW4gY3RzIC1tIEN0c0NhcnJpZXJBcGlUZXN0Q2FzZXMgLS10ZXN0IGFuZHJvaWQuY2FycmllcmFwaS5jdHMuQXBuRGF0YWJhc2VUZXN0CisgKi8KK0BSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgQXBuRGF0YWJhc2VUZXN0IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkFwbkRhdGFiYXNlVGVzdCI7CisKKyAgICBwcml2YXRlIENvbnRlbnRSZXNvbHZlciBtQ29udGVudFJlc29sdmVyOworICAgIHByaXZhdGUgUGFja2FnZU1hbmFnZXIgbVBhY2thZ2VNYW5hZ2VyOworICAgIHByaXZhdGUgYm9vbGVhbiBtSGFzQ2VsbHVsYXI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJjYXJyaWVyTmFtZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFQTiA9ICJhcG4iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9YWSA9ICJwcm94eSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBPUlQgPSAicG9ydCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1NU0MgPSAibW1zYyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1NU1BST1hZID0gIm1tc3Byb3h5IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU1TUE9SVCA9ICJtbXNwb3J0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlVNRVJJQyA9ICJudW1lcmljIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUiA9ICJ1c2VyIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTU1dPUkQgPSAicGFzc3dvcmQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIX1RZUEUgPSAiYXV0aF90eXBlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRSA9ICJ0eXBlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPVE9DT0wgPSAicHJvdG9jb2wiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBST0FNSU5HX1BST1RPQ09MID0gInJvYW1pbmdfcHJvdG9jb2wiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDQVJSSUVSX0VOQUJMRUQgPSAidHJ1ZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5FVFdPUktfVFlQRV9CSVRNQVNLID0gIjAiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCRUFSRVIgPSAiMCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IEFQTl9NQVAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsU3RyaW5nPigpIHt7CisgICAgICAgIHB1dChDYXJyaWVycy5OQU1FLCBOQU1FKTsKKyAgICAgICAgcHV0KENhcnJpZXJzLkFQTiwgQVBOKTsKKyAgICAgICAgcHV0KENhcnJpZXJzLlBST1hZLCBQUk9YWSk7CisgICAgICAgIHB1dChDYXJyaWVycy5QT1JULCBQT1JUKTsKKyAgICAgICAgcHV0KENhcnJpZXJzLk1NU0MsIE1NU0MpOworICAgICAgICBwdXQoQ2FycmllcnMuTU1TUFJPWFksIE1NU1BST1hZKTsKKyAgICAgICAgcHV0KENhcnJpZXJzLk1NU1BPUlQsIE1NU1BPUlQpOworICAgICAgICBwdXQoQ2FycmllcnMuTlVNRVJJQywgTlVNRVJJQyk7CisgICAgICAgIHB1dChDYXJyaWVycy5VU0VSLCBVU0VSKTsKKyAgICAgICAgcHV0KENhcnJpZXJzLlBBU1NXT1JELCBQQVNTV09SRCk7CisgICAgICAgIHB1dChDYXJyaWVycy5BVVRIX1RZUEUsIEFVVEhfVFlQRSk7CisgICAgICAgIHB1dChDYXJyaWVycy5UWVBFLCBUWVBFKTsKKyAgICAgICAgcHV0KENhcnJpZXJzLlBST1RPQ09MLCBQUk9UT0NPTCk7CisgICAgICAgIHB1dChDYXJyaWVycy5ST0FNSU5HX1BST1RPQ09MLCBST0FNSU5HX1BST1RPQ09MKTsKKyAgICAgICAgcHV0KENhcnJpZXJzLkNBUlJJRVJfRU5BQkxFRCwgQ0FSUklFUl9FTkFCTEVEKTsKKyAgICAgICAgcHV0KENhcnJpZXJzLk5FVFdPUktfVFlQRV9CSVRNQVNLLCBORVRXT1JLX1RZUEVfQklUTUFTSyk7CisgICAgICAgIHB1dChDYXJyaWVycy5CRUFSRVIsIEJFQVJFUik7CisgICAgfX07CisKKyAgICAvLyBGYWtlZCBuZXR3b3JrIHR5cGUgYml0bWFzayBhbmQgaXRzIGNvbXBhdGlibGUgYmVhcmVyIGJpdG1hc2suCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5FVFdPUktfVFlQRV9CSVRNQVNLX05VTUJFUiA9IDEgPDwgKDEzIC0gMSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJJTF9SQURJT19URUNITk9MT0dZX0JJVE1BU0tfTlVNQkVSID0gMSA8PCAoMTQgLSAxKTsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtQ29udGVudFJlc29sdmVyID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpLmdldENvbnRlbnRSZXNvbHZlcigpOworICAgICAgICBtUGFja2FnZU1hbmFnZXIgPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCkuZ2V0UGFja2FnZU1hbmFnZXIoKTsKKyAgICAgICAgLy8gQ2hlY2tzIHdoZXRoZXIgdGhlIGNlbGx1bGFyIHN0YWNrIHNob3VsZCBiZSBydW5uaW5nIG9uIHRoaXMgZGV2aWNlLgorICAgICAgICBtSGFzQ2VsbHVsYXIgPSBtUGFja2FnZU1hbmFnZXIuaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX1RFTEVQSE9OWSk7CisgICAgICAgIGlmICghbUhhc0NlbGx1bGFyKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJObyBjZWxsdWxhciBzdXBwb3J0LCBhbGwgdGVzdHMgd2lsbCBiZSBza2lwcGVkLiIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGZhaWxNZXNzYWdlKCkgeworICAgICAgICBmYWlsKCJUaGlzIHRlc3QgcmVxdWlyZXMgYSBTSU0gY2FyZCB3aXRoIGNhcnJpZXIgcHJpdmlsZWdlIHJ1bGUgb24gaXQuXG4iICsKKyAgICAgICAgICAgICAgICAiVmlzaXQgaHR0cHM6Ly9zb3VyY2UuYW5kcm9pZC5jb20vZGV2aWNlcy90ZWNoL2NvbmZpZy91aWNjLmh0bWwiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGluc2VydGluZywgcXVlcnlpbmcsIHVwZGF0aW5nIGFuZCBkZWxldGluZyB2YWx1ZXMgaW4gY2FycmllcnMgdGFibGUuCisgICAgICogVmVyaWZ5IHRoYXQgdGhlIGluc2VydGVkIHZhbHVlcyBtYXRjaCB0aGUgcmVzdWx0IG9mIHRoZSBxdWVyeSBhbmQgYXJlIGRlbGV0ZWQuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRDYXNlKCkgeworICAgICAgICBpZiAoIW1IYXNDZWxsdWxhcikgcmV0dXJuOworICAgICAgICBVcmkgdXJpID0gQ2FycmllcnMuQ09OVEVOVF9VUkk7CisgICAgICAgIC8vIENPTlRFTlRfVVJJID0gVXJpLnBhcnNlKCJjb250ZW50Oi8vdGVsZXBob255L2NhcnJpZXJzIik7CisgICAgICAgIC8vIENyZWF0ZSBBIHNldCBvZiBjb2x1bW5fbmFtZS92YWx1ZSBwYWlycyB0byBhZGQgdG8gdGhlIGRhdGFiYXNlLgorICAgICAgICBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgPSBtYWtlRGVmYXVsdENvbnRlbnRWYWx1ZXMoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW5zZXJ0IHRoZSB2YWx1ZSBpbnRvIGRhdGFiYXNlLgorICAgICAgICAgICAgTG9nLmQoVEFHLCAidGVzdEluc2VydENhcnJpZXJzIEluc2VydGluZyBjb250ZW50VmFsdWVzOiAiICsgY29udGVudFZhbHVlcy50b1N0cmluZygpKTsKKyAgICAgICAgICAgIFVyaSBuZXdVcmkgPSBtQ29udGVudFJlc29sdmVyLmluc2VydCh1cmksIGNvbnRlbnRWYWx1ZXMpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiRmFpbGVkIHRvIGluc2VydCB0byB0YWJsZSIsIG5ld1VyaSk7CisKKyAgICAgICAgICAgIC8vIEdldCB0aGUgdmFsdWVzIGluIHRhYmxlLgorICAgICAgICAgICAgZmluYWwgU3RyaW5nIHNlbGVjdGlvbiA9IENhcnJpZXJzLk5VTUVSSUMgKyAiPT8iOworICAgICAgICAgICAgU3RyaW5nW10gc2VsZWN0aW9uQXJncyA9IHsgTlVNRVJJQyB9OworICAgICAgICAgICAgU3RyaW5nW10gYXBuUHJvamVjdGlvbiA9IEFQTl9NQVAua2V5U2V0KCkudG9BcnJheShuZXcgU3RyaW5nW0FQTl9NQVAuc2l6ZSgpXSk7CisgICAgICAgICAgICBMb2cuZChUQUcsICJ0ZXN0SW5zZXJ0Q2FycmllcnMgcXVlcnkgcHJvamVjdGlvbjogIiArIEFycmF5cy50b1N0cmluZyhhcG5Qcm9qZWN0aW9uKQorICAgICAgICAgICAgICAgICAgICArICJcbnRlc3RJbnNlcnRDYXJyaWVycyBzZWxlY3Rpb246ICIgKyBzZWxlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgKyAiXG50ZXN0SW5zZXJ0Q2FycmllcnMgc2VsZWN0aW9uQXJnczogIiArIEFycmF5cy50b1N0cmluZyhzZWxlY3Rpb25BcmdzKSk7CisgICAgICAgICAgICBDdXJzb3IgY3Vyc29yID0gbUNvbnRlbnRSZXNvbHZlci5xdWVyeSgKKyAgICAgICAgICAgICAgICAgICAgdXJpLCBhcG5Qcm9qZWN0aW9uLCBzZWxlY3Rpb24sIHNlbGVjdGlvbkFyZ3MsIG51bGwpOworCisgICAgICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgaW5zZXJ0ZWQgdmFsdWUgbWF0Y2ggdGhlIHJlc3VsdHMgb2YgdGhlIHF1ZXJ5CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJGYWlsZWQgdG8gcXVlcnkgdGhlIHRhYmxlIiwgY3Vyc29yKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBudW1iZXIgb2YgQVBOcyByZXR1cm5lZCBieSBjdXJzb3IiLAorICAgICAgICAgICAgICAgICAgICAxLCBjdXJzb3IuZ2V0Q291bnQoKSk7CisgICAgICAgICAgICBjdXJzb3IubW92ZVRvRmlyc3QoKTsKKyAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnRyeTogQVBOX01BUC5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQgdmFsdWUgcmV0dXJuZWQgYnkgY3Vyc29yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvci5nZXRTdHJpbmcoY3Vyc29yLmdldENvbHVtbkluZGV4KGVudHJ5LmdldEtleSgpKSksIGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGFwbgorICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5ld0FwbiA9ICJuZXdhcG4iOworICAgICAgICAgICAgTG9nLmQoVEFHLCAiVXBkYXRlIHRoZSBBUE4gZmllbGQgdG86ICIgKyBuZXdBcG4pOworICAgICAgICAgICAgY29udGVudFZhbHVlcy5wdXQoQ2FycmllcnMuQVBOLCBuZXdBcG4pOworICAgICAgICAgICAgZmluYWwgaW50IHVwZGF0ZUNvdW50ID0gbUNvbnRlbnRSZXNvbHZlci51cGRhdGUodXJpLCBjb250ZW50VmFsdWVzLCBzZWxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkFyZ3MpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG51bWJlciBvZiByb3dzIHVwZGF0ZWQiLCAxLCB1cGRhdGVDb3VudCk7CisKKyAgICAgICAgICAgIC8vIFZlcmlmeSB0aGUgdXBkYXRlZCB2YWx1ZQorICAgICAgICAgICAgY3Vyc29yID0gbUNvbnRlbnRSZXNvbHZlci5xdWVyeSh1cmksIGFwblByb2plY3Rpb24sIHNlbGVjdGlvbiwgc2VsZWN0aW9uQXJncywgbnVsbCk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJGYWlsZWQgdG8gcXVlcnkgdGhlIHRhYmxlIiwgY3Vyc29yKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBudW1iZXIgb2YgQVBOcyByZXR1cm5lZCBieSBjdXJzb3IiLCAxLCBjdXJzb3IuZ2V0Q291bnQoKSk7CisgICAgICAgICAgICBjdXJzb3IubW92ZVRvRmlyc3QoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCB2YWx1ZSByZXR1cm5lZCBieSBjdXJzb3IiLAorICAgICAgICAgICAgICAgICAgICBjdXJzb3IuZ2V0U3RyaW5nKGN1cnNvci5nZXRDb2x1bW5JbmRleChDYXJyaWVycy5BUE4pKSwgbmV3QXBuKTsKKworICAgICAgICAgICAgLy8gZGVsZXRlIHRlc3QgY29udGVudAorICAgICAgICAgICAgZmluYWwgU3RyaW5nIHNlbGVjdGlvblRvRGVsZXRlID0gQ2FycmllcnMuTlVNRVJJQyArICI9PyI7CisgICAgICAgICAgICBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzVG9EZWxldGUgPSB7IE5VTUVSSUMgfTsKKyAgICAgICAgICAgIExvZy5kKFRBRywgInRlc3RJbnNlcnRDYXJyaWVycyBkZWxldGluZyBzZWxlY3Rpb246ICIgKyBzZWxlY3Rpb25Ub0RlbGV0ZQorICAgICAgICAgICAgICAgICAgICArICJ0ZXN0SW5zZXJ0Q2FycmllcnMgc2VsZWN0aW9uQXJnczogIiArIEFycmF5cy50b1N0cmluZyhzZWxlY3Rpb25BcmdzKSk7CisgICAgICAgICAgICBpbnQgbnVtUm93c0RlbGV0ZWQgPSBtQ29udGVudFJlc29sdmVyLmRlbGV0ZSgKKyAgICAgICAgICAgICAgICAgICAgdXJpLCBzZWxlY3Rpb25Ub0RlbGV0ZSwgc2VsZWN0aW9uQXJnc1RvRGVsZXRlKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBudW1iZXIgb2Ygcm93cyBkZWxldGVkIiwxLCBudW1Sb3dzRGVsZXRlZCk7CisKKyAgICAgICAgICAgIC8vIHZlcmlmeSB0aGF0IGRlbGV0ZWQgdmFsdWVzIGFyZSBnb25lCisgICAgICAgICAgICBjdXJzb3IgPSBtQ29udGVudFJlc29sdmVyLnF1ZXJ5KHVyaSwgYXBuUHJvamVjdGlvbiwgc2VsZWN0aW9uLCBzZWxlY3Rpb25BcmdzLCBudWxsKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBudW1iZXIgb2Ygcm93cyBkZWxldGVkIiwgMCwgY3Vyc29yLmdldENvdW50KCkpOworICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsTWVzc2FnZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UXVlcnlDb25mbGljdENhc2UoKSB7CisgICAgICAgIGlmICghbUhhc0NlbGx1bGFyKSByZXR1cm47CisgICAgICAgIFN0cmluZyBpbnZhbGlkQ29sdW1uID0gInJhbmRvbSI7CisgICAgICAgIFVyaSB1cmkgPSBDYXJyaWVycy5DT05URU5UX1VSSTsKKyAgICAgICAgLy8gQ09OVEVOVF9VUkkgPSBVcmkucGFyc2UoImNvbnRlbnQ6Ly90ZWxlcGhvbnkvY2FycmllcnMiKTsKKyAgICAgICAgLy8gQ3JlYXRlIEEgc2V0IG9mIGNvbHVtbl9uYW1lL3ZhbHVlIHBhaXJzIHRvIGFkZCB0byB0aGUgZGF0YWJhc2UuCisgICAgICAgIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7CisgICAgICAgIGNvbnRlbnRWYWx1ZXMucHV0KENhcnJpZXJzLk5BTUUsIE5BTUUpOworICAgICAgICBjb250ZW50VmFsdWVzLnB1dChDYXJyaWVycy5BUE4sIEFQTik7CisgICAgICAgIGNvbnRlbnRWYWx1ZXMucHV0KENhcnJpZXJzLlBPUlQsIFBPUlQpOworICAgICAgICBjb250ZW50VmFsdWVzLnB1dChDYXJyaWVycy5QUk9UT0NPTCwgUFJPVE9DT0wpOworICAgICAgICBjb250ZW50VmFsdWVzLnB1dChDYXJyaWVycy5OVU1FUklDLCBOVU1FUklDKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW5zZXJ0IHRoZSB2YWx1ZSBpbnRvIGRhdGFiYXNlLgorICAgICAgICAgICAgTG9nLmQoVEFHLCAidGVzdEluc2VydENhcnJpZXJzIEluc2VydGluZyBjb250ZW50VmFsdWVzOiAiICsgY29udGVudFZhbHVlcy50b1N0cmluZygpKTsKKyAgICAgICAgICAgIFVyaSBuZXdVcmkgPSBtQ29udGVudFJlc29sdmVyLmluc2VydCh1cmksIGNvbnRlbnRWYWx1ZXMpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiRmFpbGVkIHRvIGluc2VydCB0byB0YWJsZSIsIG5ld1VyaSk7CisKKyAgICAgICAgICAgIC8vIFRyeSB0byBnZXQgdGhlIHZhbHVlIHdpdGggaW52YWxpZCBzZWxlY3Rpb24KKyAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIHRlc3RQcm9qZWN0aW9uID0KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcnJpZXJzLk5BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FycmllcnMuQVBOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcnJpZXJzLlBPUlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FycmllcnMuUFJPVE9DT0wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FycmllcnMuTlVNRVJJQywKKyAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzZWxlY3Rpb24gPSBpbnZhbGlkQ29sdW1uICsgIj0/IjsKKyAgICAgICAgICAgIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MgPSB7IGludmFsaWRDb2x1bW4gfTsKKyAgICAgICAgICAgIExvZy5kKFRBRywgInRlc3RJbnNlcnRDYXJyaWVycyBxdWVyeSBwcm9qZWN0aW9uOiAiICsgQXJyYXlzLnRvU3RyaW5nKHRlc3RQcm9qZWN0aW9uKQorICAgICAgICAgICAgICAgICAgICArICJcbnRlc3RJbnNlcnRDYXJyaWVycyBzZWxlY3Rpb246ICIgKyBzZWxlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgKyAiXG50ZXN0SW5zZXJ0Q2FycmllcnMgc2VsZWN0aW9uQXJnczogIiArIEFycmF5cy50b1N0cmluZyhzZWxlY3Rpb25BcmdzKSk7CisgICAgICAgICAgICBDdXJzb3IgY3Vyc29yID0gbUNvbnRlbnRSZXNvbHZlci5xdWVyeSgKKyAgICAgICAgICAgICAgICAgICAgdXJpLCB0ZXN0UHJvamVjdGlvbiwgc2VsZWN0aW9uLCBzZWxlY3Rpb25BcmdzLCBudWxsKTsKKyAgICAgICAgICAgIGFzc2VydE51bGwoIkZhaWxlZCB0byBxdWVyeSB0aGUgdGFibGUiLGN1cnNvcik7CisKKyAgICAgICAgICAgIC8vIGRlbGV0ZSB0ZXN0IGNvbnRlbnQKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzZWxlY3Rpb25Ub0RlbGV0ZSA9IENhcnJpZXJzLk5BTUUgKyAiPT8iOworICAgICAgICAgICAgU3RyaW5nW10gc2VsZWN0aW9uQXJnc1RvRGVsZXRlID0geyBOQU1FIH07CisgICAgICAgICAgICBMb2cuZChUQUcsICJ0ZXN0SW5zZXJ0Q2FycmllcnMgZGVsZXRpbmcgc2VsZWN0aW9uOiAiICsgc2VsZWN0aW9uVG9EZWxldGUKKyAgICAgICAgICAgICAgICAgICAgKyAidGVzdEluc2VydENhcnJpZXJzIHNlbGVjdGlvbkFyZ3M6ICIgKyBBcnJheXMudG9TdHJpbmcoc2VsZWN0aW9uQXJncykpOworICAgICAgICAgICAgaW50IG51bVJvd3NEZWxldGVkID0gbUNvbnRlbnRSZXNvbHZlci5kZWxldGUoCisgICAgICAgICAgICAgICAgICAgIHVyaSwgc2VsZWN0aW9uVG9EZWxldGUsIHNlbGVjdGlvbkFyZ3NUb0RlbGV0ZSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbnVtYmVyIG9mIHJvd3MgZGVsZXRlZCIsIDEsIG51bVJvd3NEZWxldGVkKTsKKworICAgICAgICAgICAgLy8gdmVyaWZ5IHRoYXQgZGVsZXRlZCB2YWx1ZXMgYXJlIGdvbmUKKyAgICAgICAgICAgIGN1cnNvciA9IG1Db250ZW50UmVzb2x2ZXIucXVlcnkoCisgICAgICAgICAgICAgICAgICAgIHVyaSwgdGVzdFByb2plY3Rpb24sIHNlbGVjdGlvblRvRGVsZXRlLCBzZWxlY3Rpb25BcmdzVG9EZWxldGUsIG51bGwpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG51bWJlciBvZiByb3dzIGRlbGV0ZWQiLCAwLCBjdXJzb3IuZ2V0Q291bnQoKSk7CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWxNZXNzYWdlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDb25mbGljdENhc2UoKSB7CisgICAgICAgIGlmICghbUhhc0NlbGx1bGFyKSByZXR1cm47CisgICAgICAgIFVyaSB1cmkgPSBDYXJyaWVycy5DT05URU5UX1VSSTsKKyAgICAgICAgLy8gQ09OVEVOVF9VUkkgPSBVcmkucGFyc2UoImNvbnRlbnQ6Ly90ZWxlcGhvbnkvY2FycmllcnMiKTsKKyAgICAgICAgLy8gQ3JlYXRlIEEgc2V0IG9mIGNvbHVtbl9uYW1lL3ZhbHVlIHBhaXJzIHRvIGFkZCB0byB0aGUgZGF0YWJhc2UuCisgICAgICAgIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7CisgICAgICAgIGNvbnRlbnRWYWx1ZXMucHV0KENhcnJpZXJzLk5BTUUsIE5BTUUpOworICAgICAgICBjb250ZW50VmFsdWVzLnB1dChDYXJyaWVycy5BUE4sIEFQTik7CisgICAgICAgIGNvbnRlbnRWYWx1ZXMucHV0KENhcnJpZXJzLlBPUlQsIFBPUlQpOworICAgICAgICBjb250ZW50VmFsdWVzLnB1dChDYXJyaWVycy5QUk9UT0NPTCwgUFJPVE9DT0wpOworICAgICAgICBjb250ZW50VmFsdWVzLnB1dChDYXJyaWVycy5OVU1FUklDLCBOVU1FUklDKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSW5zZXJ0IHRoZSB2YWx1ZSBpbnRvIGRhdGFiYXNlLgorICAgICAgICAgICAgTG9nLmQoVEFHLCAidGVzdEluc2VydENhcnJpZXJzIEluc2VydGluZyBjb250ZW50VmFsdWVzOiAiICsgY29udGVudFZhbHVlcy50b1N0cmluZygpKTsKKyAgICAgICAgICAgIFVyaSBuZXdVcmkgPSBtQ29udGVudFJlc29sdmVyLmluc2VydCh1cmksIGNvbnRlbnRWYWx1ZXMpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiRmFpbGVkIHRvIGluc2VydCB0byB0YWJsZSIsIG5ld1VyaSk7CisKKyAgICAgICAgICAgIC8vIFRyeSB0byBnZXQgdGhlIHZhbHVlIHdpdGggaW52YWxpZCBzZWxlY3Rpb24KKyAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIHRlc3RQcm9qZWN0aW9uID0KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcnJpZXJzLk5BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FycmllcnMuQVBOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcnJpZXJzLlBPUlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FycmllcnMuUFJPVE9DT0wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FycmllcnMuTlVNRVJJQywKKyAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIFN0cmluZyBzZWxlY3Rpb24gPSBDYXJyaWVycy5OQU1FICsgIj0/IjsKKyAgICAgICAgICAgIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MgPSB7IE5BTUUgfTsKKyAgICAgICAgICAgIExvZy5kKFRBRywgInRlc3RJbnNlcnRDYXJyaWVycyBxdWVyeSBwcm9qZWN0aW9uOiAiICsgQXJyYXlzLnRvU3RyaW5nKHRlc3RQcm9qZWN0aW9uKQorICAgICAgICAgICAgICAgICAgICArICJcbnRlc3RJbnNlcnRDYXJyaWVycyBzZWxlY3Rpb246ICIgKyBzZWxlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgKyAiXG50ZXN0SW5zZXJ0Q2FycmllcnMgc2VsZWN0aW9uQXJnczogIiArIEFycmF5cy50b1N0cmluZyhzZWxlY3Rpb25BcmdzKSk7CisgICAgICAgICAgICBDdXJzb3IgY3Vyc29yID0gbUNvbnRlbnRSZXNvbHZlci5xdWVyeSgKKyAgICAgICAgICAgICAgICAgICAgdXJpLCB0ZXN0UHJvamVjdGlvbiwgc2VsZWN0aW9uLCBzZWxlY3Rpb25BcmdzLCBudWxsKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBudW1iZXIgb2YgQVBOcyByZXR1cm5lZCBieSBjdXJzb3IiLAorICAgICAgICAgICAgICAgICAgICAxLCBjdXJzb3IuZ2V0Q291bnQoKSk7CisKKyAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgdGFibGUgd2l0aCBpbnZhbGlkIGNvbHVtbgorICAgICAgICAgICAgU3RyaW5nIGludmFsaWRDb2x1bW4gPSAicmFuZG9tIjsKKyAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMucHV0KGludmFsaWRDb2x1bW4sIGludmFsaWRDb2x1bW4pOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtQ29udGVudFJlc29sdmVyLnVwZGF0ZSh1cmksIGNvbnRlbnRWYWx1ZXMsIHNlbGVjdGlvbiwgc2VsZWN0aW9uQXJncyk7CisgICAgICAgICAgICAgICAgZmFpbCgpOworICAgICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBFeHBlY3RlZDogSWYgdGhlcmUncyBubyBzdWNoIGEgY29sdW1uLCBhbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24gYW5kIHRoZQorICAgICAgICAgICAgICAgIC8vIEFjdGl2aXR5IE1hbmFnZXIgd2lsbCBraWxsIHRoaXMgcHJvY2VzcyBzaG9ydGx5LgorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBkZWxldGUgdGVzdCBjb250ZW50CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc2VsZWN0aW9uVG9EZWxldGUgPSBDYXJyaWVycy5OQU1FICsgIj0/IjsKKyAgICAgICAgICAgIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3NUb0RlbGV0ZSA9IHsgTkFNRSB9OworICAgICAgICAgICAgTG9nLmQoVEFHLCAidGVzdEluc2VydENhcnJpZXJzIGRlbGV0aW5nIHNlbGVjdGlvbjogIiArIHNlbGVjdGlvblRvRGVsZXRlCisgICAgICAgICAgICAgICAgICAgICsgInRlc3RJbnNlcnRDYXJyaWVycyBzZWxlY3Rpb25BcmdzOiAiICsgQXJyYXlzLnRvU3RyaW5nKHNlbGVjdGlvbkFyZ3MpKTsKKyAgICAgICAgICAgIGludCBudW1Sb3dzRGVsZXRlZCA9IG1Db250ZW50UmVzb2x2ZXIuZGVsZXRlKAorICAgICAgICAgICAgICAgICAgICB1cmksIHNlbGVjdGlvblRvRGVsZXRlLCBzZWxlY3Rpb25BcmdzVG9EZWxldGUpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG51bWJlciBvZiByb3dzIGRlbGV0ZWQiLCAxLCBudW1Sb3dzRGVsZXRlZCk7CisKKyAgICAgICAgICAgIC8vIHZlcmlmeSB0aGF0IGRlbGV0ZWQgdmFsdWVzIGFyZSBnb25lCisgICAgICAgICAgICBjdXJzb3IgPSBtQ29udGVudFJlc29sdmVyLnF1ZXJ5KAorICAgICAgICAgICAgICAgICAgICB1cmksIHRlc3RQcm9qZWN0aW9uLCBzZWxlY3Rpb25Ub0RlbGV0ZSwgc2VsZWN0aW9uQXJnc1RvRGVsZXRlLCBudWxsKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBudW1iZXIgb2Ygcm93cyBkZWxldGVkIiwgMCwgY3Vyc29yLmdldENvdW50KCkpOworICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsTWVzc2FnZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlQ29uZmxpY3RDYXNlKCkgeworICAgICAgICBpZiAoIW1IYXNDZWxsdWxhcikgcmV0dXJuOworICAgICAgICBTdHJpbmcgaW52YWxpZENvbHVtbiA9ICJyYW5kb20iOworICAgICAgICBVcmkgdXJpID0gQ2FycmllcnMuQ09OVEVOVF9VUkk7CisgICAgICAgIC8vIENPTlRFTlRfVVJJID0gVXJpLnBhcnNlKCJjb250ZW50Oi8vdGVsZXBob255L2NhcnJpZXJzIik7CisgICAgICAgIC8vIENyZWF0ZSBBIHNldCBvZiBjb2x1bW5fbmFtZS92YWx1ZSBwYWlycyB0byBhZGQgdG8gdGhlIGRhdGFiYXNlLgorICAgICAgICBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOworICAgICAgICBjb250ZW50VmFsdWVzLnB1dChDYXJyaWVycy5OQU1FLCBOQU1FKTsKKyAgICAgICAgY29udGVudFZhbHVlcy5wdXQoQ2FycmllcnMuQVBOLCBBUE4pOworICAgICAgICBjb250ZW50VmFsdWVzLnB1dChDYXJyaWVycy5QT1JULCBQT1JUKTsKKyAgICAgICAgY29udGVudFZhbHVlcy5wdXQoQ2FycmllcnMuUFJPVE9DT0wsIFBST1RPQ09MKTsKKyAgICAgICAgY29udGVudFZhbHVlcy5wdXQoQ2FycmllcnMuTlVNRVJJQywgTlVNRVJJQyk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEluc2VydCB0aGUgdmFsdWUgaW50byBkYXRhYmFzZS4KKyAgICAgICAgICAgIExvZy5kKFRBRywgInRlc3RJbnNlcnRDYXJyaWVycyBJbnNlcnRpbmcgY29udGVudFZhbHVlczogIiArIGNvbnRlbnRWYWx1ZXMudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBVcmkgbmV3VXJpID0gbUNvbnRlbnRSZXNvbHZlci5pbnNlcnQodXJpLCBjb250ZW50VmFsdWVzKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIkZhaWxlZCB0byBpbnNlcnQgdG8gdGFibGUiLCBuZXdVcmkpOworCisgICAgICAgICAgICAvLyBHZXQgdGhlIHZhbHVlcyBpbiB0YWJsZS4KKyAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIHRlc3RQcm9qZWN0aW9uID0KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcnJpZXJzLk5BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FycmllcnMuQVBOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcnJpZXJzLlBPUlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FycmllcnMuUFJPVE9DT0wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FycmllcnMuTlVNRVJJQywKKyAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIFN0cmluZyBzZWxlY3Rpb24gPSBDYXJyaWVycy5OQU1FICsgIj0/IjsKKyAgICAgICAgICAgIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MgPSB7IE5BTUUgfTsKKyAgICAgICAgICAgIExvZy5kKFRBRywgInRlc3RJbnNlcnRDYXJyaWVycyBxdWVyeSBwcm9qZWN0aW9uOiAiICsgQXJyYXlzLnRvU3RyaW5nKHRlc3RQcm9qZWN0aW9uKQorICAgICAgICAgICAgICAgICAgICArICJcbnRlc3RJbnNlcnRDYXJyaWVycyBzZWxlY3Rpb246ICIgKyBzZWxlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgKyAiXG50ZXN0SW5zZXJ0Q2FycmllcnMgc2VsZWN0aW9uQXJnczogIiArIEFycmF5cy50b1N0cmluZyhzZWxlY3Rpb25BcmdzKSk7CisgICAgICAgICAgICBDdXJzb3IgY3Vyc29yID0gbUNvbnRlbnRSZXNvbHZlci5xdWVyeSgKKyAgICAgICAgICAgICAgICAgICAgdXJpLCB0ZXN0UHJvamVjdGlvbiwgc2VsZWN0aW9uLCBzZWxlY3Rpb25BcmdzLCBudWxsKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBudW1iZXIgb2YgQVBOcyByZXR1cm5lZCBieSBjdXJzb3IiLCAxLCBjdXJzb3IuZ2V0Q291bnQoKSk7CisKKyAgICAgICAgICAgIC8vIHRyeSB0byBkZWxldGUgd2l0aCBpbnZhbGlkIHNlbGVjdGlvbgorICAgICAgICAgICAgU3RyaW5nIHNlbGVjdGlvblRvRGVsZXRlID0gaW52YWxpZENvbHVtbiArICI9PyI7CisgICAgICAgICAgICBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzVG9EZWxldGUgPSB7IGludmFsaWRDb2x1bW4gfTsKKyAgICAgICAgICAgIExvZy5kKFRBRywgInRlc3RJbnNlcnRDYXJyaWVycyBkZWxldGluZyBzZWxlY3Rpb246ICIgKyBzZWxlY3Rpb25Ub0RlbGV0ZQorICAgICAgICAgICAgICAgICAgICArICJ0ZXN0SW5zZXJ0Q2FycmllcnMgc2VsZWN0aW9uQXJnczogIiArIEFycmF5cy50b1N0cmluZyhzZWxlY3Rpb25BcmdzKSk7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbUNvbnRlbnRSZXNvbHZlci5kZWxldGUodXJpLCBzZWxlY3Rpb25Ub0RlbGV0ZSwgc2VsZWN0aW9uQXJnc1RvRGVsZXRlKTsKKyAgICAgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgICAgICB9IGNhdGNoIChTUUxpdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIEV4cGVjdGVkOiBJZiB0aGVyZSdzIG5vIHN1Y2ggYSBjb2x1bW4sIGFuIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBhbmQgdGhlCisgICAgICAgICAgICAgICAgLy8gQWN0aXZpdHkgTWFuYWdlciB3aWxsIGtpbGwgdGhpcyBwcm9jZXNzIHNob3J0bHkuCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHZlcmlmeSB0aGF0IGRlbGV0ZWQgdmFsdWUgaXMgc3RpbGwgdGhlcmUKKyAgICAgICAgICAgIHNlbGVjdGlvbiA9IENhcnJpZXJzLk5BTUUgKyAiPT8iOworICAgICAgICAgICAgc2VsZWN0aW9uQXJnc1swXSA9IE5BTUU7CisgICAgICAgICAgICBjdXJzb3IgPSBtQ29udGVudFJlc29sdmVyLnF1ZXJ5KHVyaSwgdGVzdFByb2plY3Rpb24sIHNlbGVjdGlvbiwgc2VsZWN0aW9uQXJncywgbnVsbCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbnVtYmVyIG9mIEFQTnMgcmV0dXJuZWQgYnkgY3Vyc29yIiwgMSwgY3Vyc29yLmdldENvdW50KCkpOworCisgICAgICAgICAgICAvLyBkZWxldGUgdGVzdCBjb250ZW50CisgICAgICAgICAgICBzZWxlY3Rpb25Ub0RlbGV0ZSA9IENhcnJpZXJzLk5BTUUgKyAiPT8iOworICAgICAgICAgICAgc2VsZWN0aW9uQXJnc1RvRGVsZXRlWzBdID0gTkFNRTsKKyAgICAgICAgICAgIExvZy5kKFRBRywgInRlc3RJbnNlcnRDYXJyaWVycyBkZWxldGluZyBzZWxlY3Rpb246ICIgKyBzZWxlY3Rpb25Ub0RlbGV0ZQorICAgICAgICAgICAgICAgICAgICArICJ0ZXN0SW5zZXJ0Q2FycmllcnMgc2VsZWN0aW9uQXJnczogIiArIEFycmF5cy50b1N0cmluZyhzZWxlY3Rpb25BcmdzKSk7CisgICAgICAgICAgICBpbnQgbnVtUm93c0RlbGV0ZWQgPSBtQ29udGVudFJlc29sdmVyLmRlbGV0ZSgKKyAgICAgICAgICAgICAgICAgICAgdXJpLCBzZWxlY3Rpb25Ub0RlbGV0ZSwgc2VsZWN0aW9uQXJnc1RvRGVsZXRlKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBudW1iZXIgb2Ygcm93cyBkZWxldGVkIiwgMSwgbnVtUm93c0RlbGV0ZWQpOworCisgICAgICAgICAgICAvLyB2ZXJpZnkgdGhhdCBkZWxldGVkIHZhbHVlcyBhcmUgZ29uZQorICAgICAgICAgICAgY3Vyc29yID0gbUNvbnRlbnRSZXNvbHZlci5xdWVyeSh1cmksIHRlc3RQcm9qZWN0aW9uLCBzZWxlY3Rpb24sIHNlbGVjdGlvbkFyZ3MsIG51bGwpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG51bWJlciBvZiByb3dzIGRlbGV0ZWQiLCAwLCBjdXJzb3IuZ2V0Q291bnQoKSk7CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWxNZXNzYWdlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIENvbnRlbnRWYWx1ZXMgbWFrZURlZmF1bHRDb250ZW50VmFsdWVzKCkgeworICAgICAgICBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOworICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnk6IEFQTl9NQVAuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgY29udGVudFZhbHVlcy5wdXQoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjb250ZW50VmFsdWVzOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9jYXJyaWVyYXBpL3NyYy9hbmRyb2lkL2NhcnJpZXJhcGkvY3RzL0NhcnJpZXJBcGlUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9jYXJyaWVyYXBpL3NyYy9hbmRyb2lkL2NhcnJpZXJhcGkvY3RzL0NhcnJpZXJBcGlUZXN0LmphdmEKaW5kZXggMGVhZTA0NC4uMGExOThmMiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvY2FycmllcmFwaS9zcmMvYW5kcm9pZC9jYXJyaWVyYXBpL2N0cy9DYXJyaWVyQXBpVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2NhcnJpZXJhcGkvc3JjL2FuZHJvaWQvY2FycmllcmFwaS9jdHMvQ2FycmllckFwaVRlc3QuamF2YQpAQCAtMTcsMTYgKzE3LDIzIEBACiBwYWNrYWdlIGFuZHJvaWQuY2FycmllcmFwaS5jdHM7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlckNsaWVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VJbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uU2lnbmF0dXJlOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwogaW1wb3J0IGFuZHJvaWQubmV0LkNvbm5lY3Rpdml0eU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXJUaHJlYWQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5QZXJzaXN0YWJsZUJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlZvaWNlbWFpbENvbnRyYWN0OwogaW1wb3J0IGFuZHJvaWQudGVsZXBob255LkNhcnJpZXJDb25maWdNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlBob25lU3RhdGVMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5TdWJzY3JpcHRpb25JbmZvOwogaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlN1YnNjcmlwdGlvbk1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuVGVsZXBob255TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwpAQCAtMzcsMTYgKzQ0LDI1IEBACiAKIGltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY1JlZmVyZW5jZTsKIAogcHVibGljIGNsYXNzIENhcnJpZXJBcGlUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkNhcnJpZXJBcGlUZXN0IjsKICAgICBwcml2YXRlIFRlbGVwaG9ueU1hbmFnZXIgbVRlbGVwaG9ueU1hbmFnZXI7CisgICAgcHJpdmF0ZSBDYXJyaWVyQ29uZmlnTWFuYWdlciBtQ2FycmllckNvbmZpZ01hbmFnZXI7CiAgICAgcHJpdmF0ZSBQYWNrYWdlTWFuYWdlciBtUGFja2FnZU1hbmFnZXI7CisgICAgcHJpdmF0ZSBTdWJzY3JpcHRpb25NYW5hZ2VyIG1TdWJzY3JpcHRpb25NYW5hZ2VyOworICAgIHByaXZhdGUgQ29udGVudFByb3ZpZGVyQ2xpZW50IG1Wb2ljZW1haWxQcm92aWRlcjsKKyAgICBwcml2YXRlIENvbnRlbnRQcm92aWRlckNsaWVudCBtU3RhdHVzUHJvdmlkZXI7CisgICAgcHJpdmF0ZSBVcmkgbVZvaWNlbWFpbENvbnRlbnRVcmk7CisgICAgcHJpdmF0ZSBVcmkgbVN0YXR1c0NvbnRlbnRVcmk7CiAgICAgcHJpdmF0ZSBib29sZWFuIGhhc0NlbGx1bGFyOwogICAgIHByaXZhdGUgU3RyaW5nIHNlbGZQYWNrYWdlTmFtZTsKICAgICBwcml2YXRlIFN0cmluZyBzZWxmQ2VydEhhc2g7CisgICAgcHJpdmF0ZSBIYW5kbGVyVGhyZWFkIG1MaXN0ZW5lclRocmVhZDsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGaURldkNlcnQgPSAiMjRFQjkyQ0JCMTU2QjI4MEZBNEUxNDI5QTZFQ0VFQjZFNUMxQkZFNCI7CiAKQEAgLTU1LDIzICs3MSw0NSBAQAogICAgICAgICBzdXBlci5zZXRVcCgpOwogICAgICAgICBtVGVsZXBob255TWFuYWdlciA9IChUZWxlcGhvbnlNYW5hZ2VyKQogICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuVEVMRVBIT05ZX1NFUlZJQ0UpOworICAgICAgICBtQ2FycmllckNvbmZpZ01hbmFnZXIgPSAoQ2FycmllckNvbmZpZ01hbmFnZXIpCisgICAgICAgICAgICAgICAgZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5DQVJSSUVSX0NPTkZJR19TRVJWSUNFKTsKICAgICAgICAgbVBhY2thZ2VNYW5hZ2VyID0gZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgIG1TdWJzY3JpcHRpb25NYW5hZ2VyID0gKFN1YnNjcmlwdGlvbk1hbmFnZXIpCisgICAgICAgICAgICAgICAgZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5URUxFUEhPTllfU1VCU0NSSVBUSU9OX1NFUlZJQ0UpOwogICAgICAgICBzZWxmUGFja2FnZU5hbWUgPSBnZXRDb250ZXh0KCkuZ2V0UGFja2FnZU5hbWUoKTsKICAgICAgICAgc2VsZkNlcnRIYXNoID0gZ2V0Q2VydEhhc2goc2VsZlBhY2thZ2VOYW1lKTsKKyAgICAgICAgbVZvaWNlbWFpbENvbnRlbnRVcmkgPSBWb2ljZW1haWxDb250cmFjdC5Wb2ljZW1haWxzLmJ1aWxkU291cmNlVXJpKHNlbGZQYWNrYWdlTmFtZSk7CisgICAgICAgIG1Wb2ljZW1haWxQcm92aWRlciA9IGdldENvbnRleHQoKS5nZXRDb250ZW50UmVzb2x2ZXIoKQorICAgICAgICAgICAgICAgIC5hY3F1aXJlQ29udGVudFByb3ZpZGVyQ2xpZW50KG1Wb2ljZW1haWxDb250ZW50VXJpKTsKKyAgICAgICAgbVN0YXR1c0NvbnRlbnRVcmkgPSBWb2ljZW1haWxDb250cmFjdC5TdGF0dXMuYnVpbGRTb3VyY2VVcmkoc2VsZlBhY2thZ2VOYW1lKTsKKyAgICAgICAgbVN0YXR1c1Byb3ZpZGVyID0gZ2V0Q29udGV4dCgpLmdldENvbnRlbnRSZXNvbHZlcigpCisgICAgICAgICAgICAgICAgLmFjcXVpcmVDb250ZW50UHJvdmlkZXJDbGllbnQobVN0YXR1c0NvbnRlbnRVcmkpOworICAgICAgICBtTGlzdGVuZXJUaHJlYWQgPSBuZXcgSGFuZGxlclRocmVhZCgiQ2FycmllckFwaVRlc3QiKTsKKyAgICAgICAgbUxpc3RlbmVyVGhyZWFkLnN0YXJ0KCk7CiAgICAgICAgIGhhc0NlbGx1bGFyID0gaGFzQ2VsbHVsYXIoKTsKICAgICAgICAgaWYgKCFoYXNDZWxsdWxhcikgewogICAgICAgICAgICAgTG9nLmUoVEFHLCAiTm8gY2VsbHVsYXIgc3VwcG9ydCwgYWxsIHRlc3RzIHdpbGwgYmUgc2tpcHBlZC4iKTsKICAgICAgICAgfQogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1MaXN0ZW5lclRocmVhZC5xdWl0KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtU3RhdHVzUHJvdmlkZXIuZGVsZXRlKG1TdGF0dXNDb250ZW50VXJpLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIG1Wb2ljZW1haWxQcm92aWRlci5kZWxldGUobVZvaWNlbWFpbENvbnRlbnRVcmksIG51bGwsIG51bGwpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRvIGNsZWFuIHVwIHZvaWNlbWFpbCB0YWJsZXMgaW4gdGVhckRvd24iLCBlKTsKKyAgICAgICAgfQorICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBjZWxsdWxhciBzdGFjayBzaG91bGQgYmUgcnVubmluZyBvbiB0aGlzIGRldmljZS4KICAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gaGFzQ2VsbHVsYXIoKSB7Ci0gICAgICAgIENvbm5lY3Rpdml0eU1hbmFnZXIgbWdyID0KLSAgICAgICAgICAgICAgICAoQ29ubmVjdGl2aXR5TWFuYWdlcikgZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5DT05ORUNUSVZJVFlfU0VSVklDRSk7Ci0gICAgICAgIHJldHVybiBtZ3IuaXNOZXR3b3JrU3VwcG9ydGVkKENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9NT0JJTEUpICYmCi0gICAgICAgICAgICAgICBtVGVsZXBob255TWFuYWdlci5pc1ZvaWNlQ2FwYWJsZSgpOworICAgICAgICByZXR1cm4gbVBhY2thZ2VNYW5hZ2VyLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9URUxFUEhPTlkpICYmCisgICAgICAgICAgICAgICAgbVRlbGVwaG9ueU1hbmFnZXIuZ2V0UGhvbmVDb3VudCgpID4gMDsKICAgICB9CiAKICAgICBwcml2YXRlIGJvb2xlYW4gaXNTaW1DYXJkUHJlc2VudCgpIHsKQEAgLTE1OCw2ICsxOTYsMTgzIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3Vic2NyaXB0aW9uSW5mb0xpc3RpbmcoKSB7CisgICAgICAgIGlmICghaGFzQ2VsbHVsYXIpIHJldHVybjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImdldEFjdGl2ZVN1YnNjcmlwdGlvbkluZm9Db3VudCgpIHNob3VsZCBiZSBub24temVybyIsCisgICAgICAgICAgICAgICAgICAgIG1TdWJzY3JpcHRpb25NYW5hZ2VyLmdldEFjdGl2ZVN1YnNjcmlwdGlvbkluZm9Db3VudCgpID4gMCk7CisgICAgICAgICAgICBMaXN0PFN1YnNjcmlwdGlvbkluZm8+IHN1YkluZm9MaXN0ID0KKyAgICAgICAgICAgICAgICAgICAgbVN1YnNjcmlwdGlvbk1hbmFnZXIuZ2V0QWN0aXZlU3Vic2NyaXB0aW9uSW5mb0xpc3QoKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoImdldEFjdGl2ZVN1YnNjcmlwdGlvbkluZm9MaXN0KCkgcmV0dXJuZWQgbnVsbCIsIHN1YkluZm9MaXN0KTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKCJnZXRBY3RpdmVTdWJzY3JpcHRpb25JbmZvTGlzdCgpIHJldHVybmVkIGFuIGVtcHR5IGxpc3QiLAorICAgICAgICAgICAgICAgICAgICBzdWJJbmZvTGlzdC5pc0VtcHR5KCkpOworICAgICAgICAgICAgZm9yIChTdWJzY3JpcHRpb25JbmZvIGluZm8gOiBzdWJJbmZvTGlzdCkgeworICAgICAgICAgICAgICAgIFRlbGVwaG9ueU1hbmFnZXIgdG0gPQorICAgICAgICAgICAgICAgICAgICAgICAgbVRlbGVwaG9ueU1hbmFnZXIuY3JlYXRlRm9yU3Vic2NyaXB0aW9uSWQoaW5mby5nZXRTdWJzY3JpcHRpb25JZCgpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJnZXRBY3RpdmVTdWJzY3JpcHRpb25JbmZvTGlzdCgpIHJldHVybmVkIGFuIGluYWNjZXNzaWJsZSBzdWJzY3JpcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgdG0uaGFzQ2FycmllclByaXZpbGVnZXMoaW5mby5nZXRTdWJzY3JpcHRpb25JZCgpKSk7CisKKyAgICAgICAgICAgICAgICAvLyBDaGVjayBvdGhlciBBUElzIHRvIG1ha2Ugc3VyZSB0aGV5IGFyZSBhY2Nlc3NpYmxlIGFuZCByZXR1cm4gY29uc2lzdGVudCBpbmZvLgorICAgICAgICAgICAgICAgIFN1YnNjcmlwdGlvbkluZm8gaW5mb0ZvclNsb3QgPQorICAgICAgICAgICAgICAgICAgICAgICAgbVN1YnNjcmlwdGlvbk1hbmFnZXIuZ2V0QWN0aXZlU3Vic2NyaXB0aW9uSW5mb0ZvclNpbVNsb3RJbmRleCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5nZXRTaW1TbG90SW5kZXgoKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZ2V0QWN0aXZlU3Vic2NyaXB0aW9uSW5mb0ZvclNpbVNsb3RJbmRleCgpIHJldHVybmVkIG51bGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5mb0ZvclNsb3QpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgICAgICJnZXRBY3RpdmVTdWJzY3JpcHRpb25JbmZvRm9yU2ltU2xvdEluZGV4KCkgcmV0dXJuZWQgaW5jb25zaXN0ZW50IGluZm8iLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5nZXRTdWJzY3JpcHRpb25JZCgpLCBpbmZvRm9yU2xvdC5nZXRTdWJzY3JpcHRpb25JZCgpKTsKKworICAgICAgICAgICAgICAgIFN1YnNjcmlwdGlvbkluZm8gaW5mb0ZvclN1YklkID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJzY3JpcHRpb25NYW5hZ2VyLmdldEFjdGl2ZVN1YnNjcmlwdGlvbkluZm8oaW5mby5nZXRTdWJzY3JpcHRpb25JZCgpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJnZXRBY3RpdmVTdWJzY3JpcHRpb25JbmZvKCkgcmV0dXJuZWQgbnVsbCIsIGluZm9Gb3JTdWJJZCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXRBY3RpdmVTdWJzY3JpcHRpb25JbmZvKCkgcmV0dXJuZWQgaW5jb25zaXN0ZW50IGluZm8iLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5nZXRTdWJzY3JpcHRpb25JZCgpLCBpbmZvRm9yU3ViSWQuZ2V0U3Vic2NyaXB0aW9uSWQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWxNZXNzYWdlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FycmllckNvbmZpZ0lzQWNjZXNzaWJsZSgpIHsKKyAgICAgICAgaWYgKCFoYXNDZWxsdWxhcikgcmV0dXJuOworICAgICAgICB0cnkgeworICAgICAgICAgICAgUGVyc2lzdGFibGVCdW5kbGUgYnVuZGxlID0gbUNhcnJpZXJDb25maWdNYW5hZ2VyLmdldENvbmZpZygpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiQ2FycmllckNvbmZpZ01hbmFnZXIjZ2V0Q29uZmlnKCkgcmV0dXJuZWQgbnVsbCIsIGJ1bmRsZSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZSgiQ2FycmllckNvbmZpZ01hbmFnZXIjZ2V0Q29uZmlnKCkgcmV0dXJuZWQgZW1wdHkgYnVuZGxlIiwgYnVuZGxlLmlzRW1wdHkoKSk7CisKKyAgICAgICAgICAgIGludCBzdWJJZCA9IFN1YnNjcmlwdGlvbk1hbmFnZXIuZ2V0RGVmYXVsdFN1YnNjcmlwdGlvbklkKCk7CisgICAgICAgICAgICBidW5kbGUgPSBtQ2FycmllckNvbmZpZ01hbmFnZXIuZ2V0Q29uZmlnRm9yU3ViSWQoc3ViSWQpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiQ2FycmllckNvbmZpZ01hbmFnZXIjZ2V0Q29uZmlnRm9yU3ViSWQoKSByZXR1cm5lZCBudWxsIiwgYnVuZGxlKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKCJDYXJyaWVyQ29uZmlnTWFuYWdlciNnZXRDb25maWdGb3JTdWJJZCgpIHJldHVybmVkIGVtcHR5IGJ1bmRsZSIsCisgICAgICAgICAgICAgICAgICAgIGJ1bmRsZS5pc0VtcHR5KCkpOworICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsTWVzc2FnZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFRlbGVwaG9ueUFwaXNBcmVBY2Nlc3NpYmxlKCkgeworICAgICAgICBpZiAoIWhhc0NlbGx1bGFyKSByZXR1cm47CisgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBtYXkgcmV0dXJuIGFueSB2YWx1ZSBkZXBlbmRpbmcgb24gdGhlIHN0YXRlIG9mIHRoZSBkZXZpY2UuIFNpbXBseQorICAgICAgICAvLyBjYWxsIHRoZW0gdG8gbWFrZSBzdXJlIHRoZXkgZG8gbm90IHRocm93IGFueSBleGNlcHRpb25zLgorICAgICAgICB0cnkgeworICAgICAgICAgICAgbVRlbGVwaG9ueU1hbmFnZXIuZ2V0RGV2aWNlU29mdHdhcmVWZXJzaW9uKCk7CisgICAgICAgICAgICBtVGVsZXBob255TWFuYWdlci5nZXREZXZpY2VJZCgpOworICAgICAgICAgICAgbVRlbGVwaG9ueU1hbmFnZXIuZ2V0RGV2aWNlSWQobVRlbGVwaG9ueU1hbmFnZXIuZ2V0U2xvdEluZGV4KCkpOworICAgICAgICAgICAgbVRlbGVwaG9ueU1hbmFnZXIuZ2V0SW1laSgpOworICAgICAgICAgICAgbVRlbGVwaG9ueU1hbmFnZXIuZ2V0SW1laShtVGVsZXBob255TWFuYWdlci5nZXRTbG90SW5kZXgoKSk7CisgICAgICAgICAgICBtVGVsZXBob255TWFuYWdlci5nZXRNZWlkKCk7CisgICAgICAgICAgICBtVGVsZXBob255TWFuYWdlci5nZXRNZWlkKG1UZWxlcGhvbnlNYW5hZ2VyLmdldFNsb3RJbmRleCgpKTsKKyAgICAgICAgICAgIG1UZWxlcGhvbnlNYW5hZ2VyLmdldE5haSgpOworICAgICAgICAgICAgbVRlbGVwaG9ueU1hbmFnZXIuZ2V0RGF0YU5ldHdvcmtUeXBlKCk7CisgICAgICAgICAgICBtVGVsZXBob255TWFuYWdlci5nZXRWb2ljZU5ldHdvcmtUeXBlKCk7CisgICAgICAgICAgICBtVGVsZXBob255TWFuYWdlci5nZXRTaW1TZXJpYWxOdW1iZXIoKTsKKyAgICAgICAgICAgIG1UZWxlcGhvbnlNYW5hZ2VyLmdldFN1YnNjcmliZXJJZCgpOworICAgICAgICAgICAgbVRlbGVwaG9ueU1hbmFnZXIuZ2V0R3JvdXBJZExldmVsMSgpOworICAgICAgICAgICAgbVRlbGVwaG9ueU1hbmFnZXIuZ2V0TGluZTFOdW1iZXIoKTsKKyAgICAgICAgICAgIG1UZWxlcGhvbnlNYW5hZ2VyLmdldFZvaWNlTWFpbE51bWJlcigpOworICAgICAgICAgICAgbVRlbGVwaG9ueU1hbmFnZXIuZ2V0VmlzdWFsVm9pY2VtYWlsUGFja2FnZU5hbWUoKTsKKyAgICAgICAgICAgIG1UZWxlcGhvbnlNYW5hZ2VyLmdldFZvaWNlTWFpbEFscGhhVGFnKCk7CisgICAgICAgICAgICBtVGVsZXBob255TWFuYWdlci5nZXRGb3JiaWRkZW5QbG1ucygpOworICAgICAgICAgICAgbVRlbGVwaG9ueU1hbmFnZXIuZ2V0U2VydmljZVN0YXRlKCk7CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWxNZXNzYWdlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Vm9pY2VtYWlsVGFibGVJc0FjY2Vzc2libGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFoYXNDZWxsdWxhcikgcmV0dXJuOworICAgICAgICBDb250ZW50VmFsdWVzIHZhbHVlID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKKyAgICAgICAgdmFsdWUucHV0KFZvaWNlbWFpbENvbnRyYWN0LlZvaWNlbWFpbHMuTlVNQkVSLCAiMDEyMzQ1Njc4OSIpOworICAgICAgICB2YWx1ZS5wdXQoVm9pY2VtYWlsQ29udHJhY3QuVm9pY2VtYWlscy5TT1VSQ0VfUEFDS0FHRSwgc2VsZlBhY2thZ2VOYW1lKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFVyaSB1cmkgPSBtVm9pY2VtYWlsUHJvdmlkZXIuaW5zZXJ0KG1Wb2ljZW1haWxDb250ZW50VXJpLCB2YWx1ZSk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHVyaSk7CisgICAgICAgICAgICBDdXJzb3IgY3Vyc29yID0gbVZvaWNlbWFpbFByb3ZpZGVyLnF1ZXJ5KHVyaSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2ljZW1haWxDb250cmFjdC5Wb2ljZW1haWxzLk5VTUJFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2ljZW1haWxDb250cmFjdC5Wb2ljZW1haWxzLlNPVVJDRV9QQUNLQUdFCisgICAgICAgICAgICAgICAgICAgIH0sIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChjdXJzb3IpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjdXJzb3IubW92ZVRvRmlyc3QoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIjAxMjM0NTY3ODkiLCBjdXJzb3IuZ2V0U3RyaW5nKDApKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhzZWxmUGFja2FnZU5hbWUsIGN1cnNvci5nZXRTdHJpbmcoMSkpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoY3Vyc29yLm1vdmVUb05leHQoKSk7CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWxNZXNzYWdlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Vm9pY2VtYWlsU3RhdHVzVGFibGVJc0FjY2Vzc2libGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFoYXNDZWxsdWxhcikgcmV0dXJuOworICAgICAgICBDb250ZW50VmFsdWVzIHZhbHVlID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKKyAgICAgICAgdmFsdWUucHV0KFZvaWNlbWFpbENvbnRyYWN0LlN0YXR1cy5DT05GSUdVUkFUSU9OX1NUQVRFLAorICAgICAgICAgICAgICAgIFZvaWNlbWFpbENvbnRyYWN0LlN0YXR1cy5DT05GSUdVUkFUSU9OX1NUQVRFX09LKTsKKyAgICAgICAgdmFsdWUucHV0KFZvaWNlbWFpbENvbnRyYWN0LlN0YXR1cy5TT1VSQ0VfUEFDS0FHRSwgc2VsZlBhY2thZ2VOYW1lKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFVyaSB1cmkgPSBtU3RhdHVzUHJvdmlkZXIuaW5zZXJ0KG1TdGF0dXNDb250ZW50VXJpLCB2YWx1ZSk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHVyaSk7CisgICAgICAgICAgICBDdXJzb3IgY3Vyc29yID0gbVZvaWNlbWFpbFByb3ZpZGVyLnF1ZXJ5KHVyaSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2ljZW1haWxDb250cmFjdC5TdGF0dXMuQ09ORklHVVJBVElPTl9TVEFURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2ljZW1haWxDb250cmFjdC5TdGF0dXMuU09VUkNFX1BBQ0tBR0UKKyAgICAgICAgICAgICAgICAgICAgfSwgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGN1cnNvcik7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGN1cnNvci5tb3ZlVG9GaXJzdCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhWb2ljZW1haWxDb250cmFjdC5TdGF0dXMuQ09ORklHVVJBVElPTl9TVEFURV9PSywgY3Vyc29yLmdldEludCgwKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoc2VsZlBhY2thZ2VOYW1lLCBjdXJzb3IuZ2V0U3RyaW5nKDEpKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGN1cnNvci5tb3ZlVG9OZXh0KCkpOworICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsTWVzc2FnZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFBob25lU3RhdGVMaXN0ZW5lcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIWhhc0NlbGx1bGFyKSByZXR1cm47CisgICAgICAgIGZpbmFsIEF0b21pY1JlZmVyZW5jZTxTZWN1cml0eUV4Y2VwdGlvbj4gZXJyb3IgPSBuZXcgQXRvbWljUmVmZXJlbmNlPD4oKTsKKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgICAgIG5ldyBIYW5kbGVyKG1MaXN0ZW5lclRocmVhZC5nZXRMb29wZXIoKSkucG9zdCgoKSAtPiB7CisgICAgICAgICAgICBQaG9uZVN0YXRlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgUGhvbmVTdGF0ZUxpc3RlbmVyKCkge307CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1UZWxlcGhvbnlNYW5hZ2VyLmxpc3RlbigKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLCBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX01FU1NBR0VfV0FJVElOR19JTkRJQ0FUT1IpOworICAgICAgICAgICAgICAgIG1UZWxlcGhvbnlNYW5hZ2VyLmxpc3RlbigKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLCBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX0NBTExfRk9SV0FSRElOR19JTkRJQ0FUT1IpOworICAgICAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGVycm9yLnNldChlKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgbVRlbGVwaG9ueU1hbmFnZXIubGlzdGVuKGxpc3RlbmVyLCBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX05PTkUpOworICAgICAgICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGVzdCB0aW1lZCBvdXQiLCBsYXRjaC5hd2FpdCgzMEwsIFRpbWVVbml0LlNFQ09ORFMpKTsKKyAgICAgICAgaWYgKGVycm9yLmdldCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZhaWxNZXNzYWdlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3Vic2NyaXB0aW9uSW5mb0NoYW5nZUxpc3RlbmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghaGFzQ2VsbHVsYXIpIHJldHVybjsKKyAgICAgICAgZmluYWwgQXRvbWljUmVmZXJlbmNlPFNlY3VyaXR5RXhjZXB0aW9uPiBlcnJvciA9IG5ldyBBdG9taWNSZWZlcmVuY2U8PigpOworICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICAgICAgbmV3IEhhbmRsZXIobUxpc3RlbmVyVGhyZWFkLmdldExvb3BlcigpKS5wb3N0KCgpIC0+IHsKKyAgICAgICAgICAgIFN1YnNjcmlwdGlvbk1hbmFnZXIuT25TdWJzY3JpcHRpb25zQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IFN1YnNjcmlwdGlvbk1hbmFnZXIuT25TdWJzY3JpcHRpb25zQ2hhbmdlZExpc3RlbmVyKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1TdWJzY3JpcHRpb25NYW5hZ2VyLmFkZE9uU3Vic2NyaXB0aW9uc0NoYW5nZWRMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZXJyb3Iuc2V0KGUpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBtU3Vic2NyaXB0aW9uTWFuYWdlci5yZW1vdmVPblN1YnNjcmlwdGlvbnNDaGFuZ2VkTGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGVzdCB0aW1lZCBvdXQiLCBsYXRjaC5hd2FpdCgzMEwsIFRpbWVVbml0LlNFQ09ORFMpKTsKKyAgICAgICAgaWYgKGVycm9yLmdldCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZhaWxNZXNzYWdlKCk7CisgICAgICAgIH0KKworICAgIH0KKwogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEludGVudFJlY2VpdmVyIGV4dGVuZHMgQnJvYWRjYXN0UmVjZWl2ZXIgewogICAgICAgICBwcml2YXRlIGZpbmFsIENvdW50RG93bkxhdGNoIG1SZWNlaXZlTGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2NhcnJpZXJhcGkvc3JjL2FuZHJvaWQvY2FycmllcmFwaS9jdHMvTmV0d29ya1NjYW5BcGlUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9jYXJyaWVyYXBpL3NyYy9hbmRyb2lkL2NhcnJpZXJhcGkvY3RzL05ldHdvcmtTY2FuQXBpVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNjZkYzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9jYXJyaWVyYXBpL3NyYy9hbmRyb2lkL2NhcnJpZXJhcGkvY3RzL05ldHdvcmtTY2FuQXBpVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5jYXJyaWVyYXBpLmN0czsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3RTYW1lOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5BY2Nlc3NOZXR3b3JrQ29uc3RhbnRzOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LkNlbGxJbmZvOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LkNlbGxJbmZvR3NtOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LkNlbGxJbmZvTHRlOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LkNlbGxJbmZvV2NkbWE7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuTmV0d29ya1NjYW47CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuTmV0d29ya1NjYW5SZXF1ZXN0OworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlJhZGlvQWNjZXNzU3BlY2lmaWVyOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlRlbGVwaG9ueU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuVGVsZXBob255U2Nhbk1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQnVpbGQsIGluc3RhbGwgYW5kIHJ1biB0aGUgdGVzdHMgYnkgcnVubmluZyB0aGUgY29tbWFuZHMgYmVsb3c6CisgKiAgbWFrZSBjdHMgLWo2NAorICogIGN0cy10cmFkZWZlZCBydW4gY3RzIC1tIEN0c0NhcnJpZXJBcGlUZXN0Q2FzZXMgLS10ZXN0IGFuZHJvaWQuY2FycmllcmFwaS5jdHMuTmV0d29ya1NjYW5BcGlUZXN0CisgKi8KK0BSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgTmV0d29ya1NjYW5BcGlUZXN0IHsKKyAgICBwcml2YXRlIFRlbGVwaG9ueU1hbmFnZXIgbVRlbGVwaG9ueU1hbmFnZXI7CisgICAgcHJpdmF0ZSBQYWNrYWdlTWFuYWdlciBtUGFja2FnZU1hbmFnZXI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJOZXR3b3JrU2NhbkFwaVRlc3QiOworICAgIHByaXZhdGUgaW50IG1OZXR3b3JrU2NhblN0YXR1czsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfTkVUV09SS19TQ0FOX1NUQVJUID0gMTAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9ORVRXT1JLX1NDQU5fUkVTVUxUUyA9IDIwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfTkVUV09SS19TQ0FOX0VSUk9SID0gMzAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9ORVRXT1JLX1NDQU5fQ09NUExFVEVEID0gNDAwOworICAgIHByaXZhdGUgTGlzdDxDZWxsSW5mbz4gbVNjYW5SZXN1bHRzID0gbnVsbDsKKyAgICBwcml2YXRlIE5ldHdvcmtTY2FuSGFuZGxlclRocmVhZCBtVGVzdEhhbmRsZXJUaHJlYWQ7CisgICAgcHJpdmF0ZSBIYW5kbGVyIG1IYW5kbGVyOworICAgIHByaXZhdGUgTmV0d29ya1NjYW4gbU5ldHdvcmtTY2FuOworICAgIHByaXZhdGUgTmV0d29ya1NjYW5SZXF1ZXN0IG1OZXR3b3JrU2NhblJlcXVlc3Q7CisgICAgcHJpdmF0ZSBOZXR3b3JrU2NhbkNhbGxiYWNrSW1wbCBtTmV0d29ya1NjYW5DYWxsYmFjazsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0lOSVRfV0FJVF9NUyA9IDYwMDAwOyAvLyA2MCBzZWNvbmRzCisgICAgcHJpdmF0ZSBPYmplY3QgbUxvY2sgPSBuZXcgT2JqZWN0KCk7CisgICAgcHJpdmF0ZSBib29sZWFuIG1SZWFkeTsKKyAgICBwcml2YXRlIGludCBtRXJyb3JDb2RlOworICAgIC8qIEFsbCB0aGUgZm9sbG93aW5nIGNvbnN0YW50cyBhcmUgdXNlZCB0byBjb25zdHJ1Y3QgTmV0d29ya1NjYW5SZXF1ZXN0Ki8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0NBTl9UWVBFID0gTmV0d29ya1NjYW5SZXF1ZXN0LlNDQU5fVFlQRV9PTkVfU0hPVDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIElOQ1JFTUVOVEFMX1JFU1VMVFMgPSB0cnVlOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRUFSQ0hfUEVSSU9ESUNJVFlfU0VDID0gNTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1NFQVJDSF9USU1FX1NFQyA9IDMwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5DUkVNRU5UQUxfUkVTVUxUU19QRVJJT0RJQ0lUWV9TRUMgPSAzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFycmF5TGlzdDxTdHJpbmc+IE1DQ19NTkMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSYWRpb0FjY2Vzc1NwZWNpZmllcltdIFJBRElPX0FDQ0VTU19TUEVDSUZJRVJTID0geworICAgICAgICAgICAgbmV3IFJhZGlvQWNjZXNzU3BlY2lmaWVyKAorICAgICAgICAgICAgICAgICAgICBBY2Nlc3NOZXR3b3JrQ29uc3RhbnRzLkFjY2Vzc05ldHdvcmtUeXBlLkdFUkFOLAorICAgICAgICAgICAgICAgICAgICBudWxsIC8qIGJhbmRzICovLAorICAgICAgICAgICAgICAgICAgICBudWxsIC8qIGNoYW5uZWxzICovKSwKKyAgICAgICAgICAgIG5ldyBSYWRpb0FjY2Vzc1NwZWNpZmllcigKKyAgICAgICAgICAgICAgICAgICAgQWNjZXNzTmV0d29ya0NvbnN0YW50cy5BY2Nlc3NOZXR3b3JrVHlwZS5FVVRSQU4sCisgICAgICAgICAgICAgICAgICAgIG51bGwgLyogYmFuZHMgKi8sCisgICAgICAgICAgICAgICAgICAgIG51bGwgLyogY2hhbm5lbHMgKi8pLAorICAgICAgICAgICAgbmV3IFJhZGlvQWNjZXNzU3BlY2lmaWVyKAorICAgICAgICAgICAgICAgICAgICBBY2Nlc3NOZXR3b3JrQ29uc3RhbnRzLkFjY2Vzc05ldHdvcmtUeXBlLlVUUkFOLAorICAgICAgICAgICAgICAgICAgICBudWxsIC8qIGJhbmRzICovLAorICAgICAgICAgICAgICAgICAgICBudWxsIC8qIGNoYW5uZWxzICovKQorICAgIH07CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbVRlbGVwaG9ueU1hbmFnZXIgPSAoVGVsZXBob255TWFuYWdlcikKKyAgICAgICAgICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlRFTEVQSE9OWV9TRVJWSUNFKTsKKyAgICAgICAgbVBhY2thZ2VNYW5hZ2VyID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgIG1UZXN0SGFuZGxlclRocmVhZCA9IG5ldyBOZXR3b3JrU2NhbkhhbmRsZXJUaHJlYWQoVEFHKTsKKyAgICAgICAgbVRlc3RIYW5kbGVyVGhyZWFkLnN0YXJ0KCk7CisgICAgfQorCisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbVRlc3RIYW5kbGVyVGhyZWFkLnF1aXQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgd2FpdFVudGlsUmVhZHkoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbUxvY2sud2FpdChNQVhfSU5JVF9XQUlUX01TKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghbVJlYWR5KSB7CisgICAgICAgICAgICAgICAgZmFpbCgiTmV0d29ya1NjYW5BcGlUZXN0IGZhaWxlZCB0byBpbml0aWFsaXplIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0UmVhZHkoYm9vbGVhbiByZWFkeSkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBtUmVhZHkgPSByZWFkeTsKKyAgICAgICAgICAgIG1Mb2NrLm5vdGlmeUFsbCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBOZXR3b3JrU2NhbkhhbmRsZXJUaHJlYWQgZXh0ZW5kcyBIYW5kbGVyVGhyZWFkIHsKKworICAgICAgICBwdWJsaWMgTmV0d29ya1NjYW5IYW5kbGVyVGhyZWFkKFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICBzdXBlcihuYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkxvb3BlclByZXBhcmVkKCkgeworICAgICAgICAgICAgLyogY3JlYXRlIGEgY3VzdG9tIGhhbmRsZXIgZm9yIHRoZSBIYW5kbGVyIFRocmVhZCAqLworICAgICAgICAgICAgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcihtVGVzdEhhbmRsZXJUaHJlYWQuZ2V0TG9vcGVyKCkpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRVZFTlRfTkVUV09SS19TQ0FOX1NUQVJUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInJlcXVlc3QgbmV0d29yayBzY2FuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5ldHdvcmtTY2FuID0gbVRlbGVwaG9ueU1hbmFnZXIucmVxdWVzdE5ldHdvcmtTY2FuKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5ldHdvcmtTY2FuUmVxdWVzdCwgbU5ldHdvcmtTY2FuQ2FsbGJhY2spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJVbmtub3duIEV2ZW50ICIgKyBtc2cud2hhdCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBOZXR3b3JrU2NhbkNhbGxiYWNrSW1wbCBleHRlbmRzIFRlbGVwaG9ueVNjYW5NYW5hZ2VyLk5ldHdvcmtTY2FuQ2FsbGJhY2sgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHRzKExpc3Q8Q2VsbEluZm8+IHJlc3VsdHMpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIm9uUmVzdWx0czogIiArIHJlc3VsdHMudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBtTmV0d29ya1NjYW5TdGF0dXMgPSBFVkVOVF9ORVRXT1JLX1NDQU5fUkVTVUxUUzsKKyAgICAgICAgICAgIG1TY2FuUmVzdWx0cyA9IHJlc3VsdHM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25Db21wbGV0ZSgpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIm9uQ29tcGxldGUiKTsKKyAgICAgICAgICAgIG1OZXR3b3JrU2NhblN0YXR1cyA9IEVWRU5UX05FVFdPUktfU0NBTl9DT01QTEVURUQ7CisgICAgICAgICAgICBzZXRSZWFkeSh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKGludCBlcnJvcikgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAib25FcnJvcjogIiArIFN0cmluZy52YWx1ZU9mKGVycm9yKSk7CisgICAgICAgICAgICBtTmV0d29ya1NjYW5TdGF0dXMgPSBFVkVOVF9ORVRXT1JLX1NDQU5fRVJST1I7CisgICAgICAgICAgICBtRXJyb3JDb2RlID0gZXJyb3I7CisgICAgICAgICAgICBMb2cuZChUQUcsICJTdG9wIHRoZSBuZXR3b3JrIHNjYW4iKTsKKyAgICAgICAgICAgIG1OZXR3b3JrU2Nhbi5zdG9wU2NhbigpOworICAgICAgICAgICAgc2V0UmVhZHkodHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIExpc3Q8UmFkaW9BY2Nlc3NTcGVjaWZpZXI+IGdldFJhZGlvQWNjZXNzU3BlY2lmaWVyKExpc3Q8Q2VsbEluZm8+IGFsbENlbGxJbmZvKSB7CisgICAgICAgIExpc3Q8UmFkaW9BY2Nlc3NTcGVjaWZpZXI+IHJhZGlvQWNjZXNzU3BlY2lmaWVyID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIExpc3Q8SW50ZWdlcj4gbHRlQ2hhbm5lbHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxJbnRlZ2VyPiB3Y2RtYUNoYW5uZWxzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIExpc3Q8SW50ZWdlcj4gZ3NtQ2hhbm5lbHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxDZWxsSW5mby5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgQ2VsbEluZm8gY2VsbEluZm8gPSBhbGxDZWxsSW5mby5nZXQoaSk7CisgICAgICAgICAgICBpZiAoY2VsbEluZm8gaW5zdGFuY2VvZiBDZWxsSW5mb0x0ZSkgeworICAgICAgICAgICAgICAgIGx0ZUNoYW5uZWxzLmFkZCgoKENlbGxJbmZvTHRlKSBjZWxsSW5mbykuZ2V0Q2VsbElkZW50aXR5KCkuZ2V0RWFyZmNuKCkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjZWxsSW5mbyBpbnN0YW5jZW9mIENlbGxJbmZvV2NkbWEpIHsKKyAgICAgICAgICAgICAgICB3Y2RtYUNoYW5uZWxzLmFkZCgoKENlbGxJbmZvV2NkbWEpIGNlbGxJbmZvKS5nZXRDZWxsSWRlbnRpdHkoKS5nZXRVYXJmY24oKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNlbGxJbmZvIGluc3RhbmNlb2YgQ2VsbEluZm9Hc20pIHsKKyAgICAgICAgICAgICAgICBnc21DaGFubmVscy5hZGQoKChDZWxsSW5mb0dzbSkgY2VsbEluZm8pLmdldENlbGxJZGVudGl0eSgpLmdldEFyZmNuKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghbHRlQ2hhbm5lbHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJsdGUgY2hhbm5lbHMiICsgbHRlQ2hhbm5lbHMudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBpbnQgcmFuTHRlID0gQWNjZXNzTmV0d29ya0NvbnN0YW50cy5BY2Nlc3NOZXR3b3JrVHlwZS5FVVRSQU47CisgICAgICAgICAgICByYWRpb0FjY2Vzc1NwZWNpZmllci5hZGQoCisgICAgICAgICAgICAgICAgICAgIG5ldyBSYWRpb0FjY2Vzc1NwZWNpZmllcihyYW5MdGUsIG51bGwgLyogYmFuZHMgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHRlQ2hhbm5lbHMuc3RyZWFtKCkubWFwVG9JbnQoaS0+aSkudG9BcnJheSgpKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF3Y2RtYUNoYW5uZWxzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAid2NkbWEgY2hhbm5lbHMiICsgd2NkbWFDaGFubmVscy50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGludCByYW5XY2RtYSA9IEFjY2Vzc05ldHdvcmtDb25zdGFudHMuQWNjZXNzTmV0d29ya1R5cGUuVVRSQU47CisgICAgICAgICAgICByYWRpb0FjY2Vzc1NwZWNpZmllci5hZGQoCisgICAgICAgICAgICAgICAgICAgIG5ldyBSYWRpb0FjY2Vzc1NwZWNpZmllcihyYW5XY2RtYSwgbnVsbCAvKiBiYW5kcyAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Y2RtYUNoYW5uZWxzLnN0cmVhbSgpLm1hcFRvSW50KGktPmkpLnRvQXJyYXkoKSkpOworICAgICAgICB9CisgICAgICAgIGlmICghZ3NtQ2hhbm5lbHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJnc20gY2hhbm5lbHMiICsgZ3NtQ2hhbm5lbHMudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBpbnQgcmFuR3NtID0gQWNjZXNzTmV0d29ya0NvbnN0YW50cy5BY2Nlc3NOZXR3b3JrVHlwZS5HRVJBTjsKKyAgICAgICAgICAgIHJhZGlvQWNjZXNzU3BlY2lmaWVyLmFkZCgKKyAgICAgICAgICAgICAgICAgICAgbmV3IFJhZGlvQWNjZXNzU3BlY2lmaWVyKHJhbkdzbSwgbnVsbCAvKiBiYW5kcyAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc21DaGFubmVscy5zdHJlYW0oKS5tYXBUb0ludChpLT5pKS50b0FycmF5KCkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmFkaW9BY2Nlc3NTcGVjaWZpZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhhdCB0aGUgZGV2aWNlIHByb3Blcmx5IHJlcXVlc3RzIGEgbmV0d29yayBzY2FuLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcXVlc3ROZXR3b3JrU2NhbigpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghbVBhY2thZ2VNYW5hZ2VyLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9URUxFUEhPTlkpKSB7CisgICAgICAgICAgICAvLyBDaGVja3Mgd2hldGhlciB0aGUgY2VsbHVsYXIgc3RhY2sgc2hvdWxkIGJlIHJ1bm5pbmcgb24gdGhpcyBkZXZpY2UuCisgICAgICAgICAgICBMb2cuZShUQUcsICJObyBjZWxsdWxhciBzdXBwb3J0LCB0aGUgdGVzdCB3aWxsIGJlIHNraXBwZWQuIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtVGVsZXBob255TWFuYWdlci5oYXNDYXJyaWVyUHJpdmlsZWdlcygpKSB7CisgICAgICAgICAgICBmYWlsKCJUaGlzIHRlc3QgcmVxdWlyZXMgYSBTSU0gY2FyZCB3aXRoIGNhcnJpZXIgcHJpdmlsZWdlIHJ1bGUgb24gaXQuIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGVyZSBzaG91bGQgYmUgYXQgbGVhc3Qgb25lIGVudHJ5LgorICAgICAgICBMaXN0PENlbGxJbmZvPiBhbGxDZWxsSW5mbyA9IG1UZWxlcGhvbnlNYW5hZ2VyLmdldEFsbENlbGxJbmZvKCk7CisgICAgICAgIGlmIChhbGxDZWxsSW5mbyA9PSBudWxsKSB7CisgICAgICAgICAgICBmYWlsKCJUZWxlcGhvbnlNYW5hZ2VyLmdldEFsbENlbGxJbmZvKCkgcmV0dXJuZWQgTlVMTCEiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYWxsQ2VsbEluZm8uc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIGZhaWwoIlRlbGVwaG9ueU1hbmFnZXIuZ2V0QWxsQ2VsbEluZm8oKSByZXR1cm5lZCB6ZXJvLWxlbmd0aCBsaXN0ISIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ29uc3RydWN0IGEgTmV0d29ya1NjYW5SZXF1ZXN0CisgICAgICAgIExpc3Q8UmFkaW9BY2Nlc3NTcGVjaWZpZXI+IHJhZGlvQWNjZXNzU3BlY2lmaWVyID0gZ2V0UmFkaW9BY2Nlc3NTcGVjaWZpZXIoYWxsQ2VsbEluZm8pOworICAgICAgICBMb2cuZChUQUcsICJudW1iZXIgb2YgcmFkaW9BY2Nlc3NTcGVjaWZpZXI6ICIgKyByYWRpb0FjY2Vzc1NwZWNpZmllci5zaXplKCkpOworICAgICAgICBpZiAocmFkaW9BY2Nlc3NTcGVjaWZpZXIuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBSYWRpb0FjY2Vzc1NwZWNpZmllciBnc20gPSBuZXcgUmFkaW9BY2Nlc3NTcGVjaWZpZXIoCisgICAgICAgICAgICAgICAgICAgIEFjY2Vzc05ldHdvcmtDb25zdGFudHMuQWNjZXNzTmV0d29ya1R5cGUuR0VSQU4sCisgICAgICAgICAgICAgICAgICAgIG51bGwgLyogYmFuZHMgKi8sCisgICAgICAgICAgICAgICAgICAgIG51bGwgLyogY2hhbm5lbHMgKi8pOworICAgICAgICAgICAgUmFkaW9BY2Nlc3NTcGVjaWZpZXIgbHRlID0gbmV3IFJhZGlvQWNjZXNzU3BlY2lmaWVyKAorICAgICAgICAgICAgICAgICAgICBBY2Nlc3NOZXR3b3JrQ29uc3RhbnRzLkFjY2Vzc05ldHdvcmtUeXBlLkVVVFJBTiwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiBiYW5kcyAqLywKKyAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiBjaGFubmVscyAqLyk7CisgICAgICAgICAgICBSYWRpb0FjY2Vzc1NwZWNpZmllciB3Y2RtYSA9IG5ldyBSYWRpb0FjY2Vzc1NwZWNpZmllcigKKyAgICAgICAgICAgICAgICAgICAgQWNjZXNzTmV0d29ya0NvbnN0YW50cy5BY2Nlc3NOZXR3b3JrVHlwZS5VVFJBTiwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiBiYW5kcyAqLywKKyAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiBjaGFubmVscyAqLyk7CisgICAgICAgICAgICByYWRpb0FjY2Vzc1NwZWNpZmllci5hZGQoZ3NtKTsKKyAgICAgICAgICAgIHJhZGlvQWNjZXNzU3BlY2lmaWVyLmFkZChsdGUpOworICAgICAgICAgICAgcmFkaW9BY2Nlc3NTcGVjaWZpZXIuYWRkKHdjZG1hKTsKKyAgICAgICAgfQorICAgICAgICBSYWRpb0FjY2Vzc1NwZWNpZmllcltdIHJhZGlvQWNjZXNzU3BlY2lmaWVyQXJyYXkgPQorICAgICAgICAgICAgICAgIG5ldyBSYWRpb0FjY2Vzc1NwZWNpZmllcltyYWRpb0FjY2Vzc1NwZWNpZmllci5zaXplKCldOworICAgICAgICBtTmV0d29ya1NjYW5SZXF1ZXN0ID0gbmV3IE5ldHdvcmtTY2FuUmVxdWVzdCgKKyAgICAgICAgICAgICAgICBOZXR3b3JrU2NhblJlcXVlc3QuU0NBTl9UWVBFX09ORV9TSE9UIC8qIHNjYW4gdHlwZSAqLywKKyAgICAgICAgICAgICAgICByYWRpb0FjY2Vzc1NwZWNpZmllci50b0FycmF5KHJhZGlvQWNjZXNzU3BlY2lmaWVyQXJyYXkpLAorICAgICAgICAgICAgICAgIDUgLyogc2VhcmNoIHBlcmlvZGljaXR5ICovLAorICAgICAgICAgICAgICAgIDYwIC8qIG1heCBzZWFyY2ggdGltZSAqLywKKyAgICAgICAgICAgICAgICB0cnVlIC8qZW5hYmxlIGluY3JlbWVudGFsIHJlc3VsdHMqLywKKyAgICAgICAgICAgICAgICA1IC8qIGluY3JlbWVudGFsIHJlc3VsdHMgcGVyaW9kaWNpdHkgKi8sCisgICAgICAgICAgICAgICAgbnVsbCAvKiBMaXN0IG9mIFBMTU4gaWRzIChNQ0MtTU5DKSAqLyk7CisKKyAgICAgICAgbU5ldHdvcmtTY2FuQ2FsbGJhY2sgPSBuZXcgTmV0d29ya1NjYW5DYWxsYmFja0ltcGwoKTsKKyAgICAgICAgTWVzc2FnZSBzdGFydE5ldHdvcmtTY2FuID0gbUhhbmRsZXIub2J0YWluTWVzc2FnZShFVkVOVF9ORVRXT1JLX1NDQU5fU1RBUlQpOworICAgICAgICBzZXRSZWFkeShmYWxzZSk7CisgICAgICAgIHN0YXJ0TmV0d29ya1NjYW4uc2VuZFRvVGFyZ2V0KCk7CisgICAgICAgIHdhaXRVbnRpbFJlYWR5KCk7CisKKyAgICAgICAgTG9nLmQoVEFHLCAibU5ldHdvcmtTY2FuU3RhdHVzOiAiICsgbU5ldHdvcmtTY2FuU3RhdHVzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGZpbmFsIHNjYW4gc3RhdHVzIGlzIG5vdCBTY2FuQ29tcGxldGVkIG9yIFNjYW5FcnJvciB3aXRoIGFuIGVycm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgImNvZGUgRVJST1JfTU9ERU1fVU5BVkFJTEFCTEUgb3IgRVJST1JfVU5TVVBQT1JURUQiLAorICAgICAgICAgICAgICAgIGlzU2NhblN0YXR1c1ZhbGlkKCkpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc1NjYW5TdGF0dXNWYWxpZCgpIHsKKyAgICAgICAgLy8gVE9ETyhiLzcyMTYyODg1KTogdGVzdCB0aGUgc2l6ZSBvZiBTY2FuUmVzdWx0cyBpcyBub3QgemVybyBhZnRlciB0aGUgYmxvY2tpbmcgYnVnIGZpeGVkLgorICAgICAgICBpZiAoKG1OZXR3b3JrU2NhblN0YXR1cyA9PSBFVkVOVF9ORVRXT1JLX1NDQU5fQ09NUExFVEVEKSAmJiAobVNjYW5SZXN1bHRzICE9IG51bGwpKSB7CisgICAgICAgICAgICAvLyBTY2FuIGNvbXBsZXRlLgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChtTmV0d29ya1NjYW5TdGF0dXMgPT0gRVZFTlRfTkVUV09SS19TQ0FOX0VSUk9SKQorICAgICAgICAgICAgICAgICYmICgobUVycm9yQ29kZSA9PSBOZXR3b3JrU2Nhbi5FUlJPUl9NT0RFTV9VTkFWQUlMQUJMRSkKKyAgICAgICAgICAgICAgICB8fCAobUVycm9yQ29kZSA9PSBOZXR3b3JrU2Nhbi5FUlJPUl9VTlNVUFBPUlRFRCkpKSB7CisgICAgICAgICAgICAvLyBTY2FuIGVycm9yIGJ1dCB0aGUgZXJyb3IgdHlwZSBpcyBhbGxvd2VkLgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgQXJyYXlMaXN0PFN0cmluZz4gZ2V0UGxtbnMoKSB7CisgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IG1jY01uY3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgbWNjTW5jcy5hZGQoIjMxMDI2MCIpOworICAgICAgICBtY2NNbmNzLmFkZCgiMzEwMTIwIik7CisgICAgICAgIHJldHVybiBtY2NNbmNzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRvIHRlc3QgaXRzIGNvbnN0cnVjdG9yIGFuZCBnZXR0ZXJzLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5ldHdvcmtTY2FuUmVxdWVzdF9Db25zdHJ1Y3RvckFuZEdldHRlcnMoKSB7CisgICAgICAgIE5ldHdvcmtTY2FuUmVxdWVzdCBuZXR3b3JrU2NhblJlcXVlc3QgPSBuZXcgTmV0d29ya1NjYW5SZXF1ZXN0KAorICAgICAgICAgICAgICAgIFNDQU5fVFlQRSwKKyAgICAgICAgICAgICAgICBSQURJT19BQ0NFU1NfU1BFQ0lGSUVSUywKKyAgICAgICAgICAgICAgICBTRUFSQ0hfUEVSSU9ESUNJVFlfU0VDLAorICAgICAgICAgICAgICAgIE1BWF9TRUFSQ0hfVElNRV9TRUMsCisgICAgICAgICAgICAgICAgSU5DUkVNRU5UQUxfUkVTVUxUUywKKyAgICAgICAgICAgICAgICBJTkNSRU1FTlRBTF9SRVNVTFRTX1BFUklPRElDSVRZX1NFQywKKyAgICAgICAgICAgICAgICBnZXRQbG1ucygpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImdldFNjYW5UeXBlKCkgcmV0dXJucyB3cm9uZyB2YWx1ZSIsCisgICAgICAgICAgICAgICAgU0NBTl9UWVBFLCBuZXR3b3JrU2NhblJlcXVlc3QuZ2V0U2NhblR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZ2V0U3BlY2lmaWVycygpIHJldHVybnMgd3JvbmcgdmFsdWUiLAorICAgICAgICAgICAgICAgIFJBRElPX0FDQ0VTU19TUEVDSUZJRVJTLCBuZXR3b3JrU2NhblJlcXVlc3QuZ2V0U3BlY2lmaWVycygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXRTZWFyY2hQZXJpb2RpY2l0eSgpIHJldHVybnMgd3JvbmcgdmFsdWUiLAorICAgICAgICAgICAgICAgIFNFQVJDSF9QRVJJT0RJQ0lUWV9TRUMsIG5ldHdvcmtTY2FuUmVxdWVzdC5nZXRTZWFyY2hQZXJpb2RpY2l0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXRNYXhTZWFyY2hUaW1lKCkgcmV0dXJucyB3cm9uZyB2YWx1ZSIsCisgICAgICAgICAgICAgICAgTUFYX1NFQVJDSF9USU1FX1NFQywgbmV0d29ya1NjYW5SZXF1ZXN0LmdldE1heFNlYXJjaFRpbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZ2V0SW5jcmVtZW50YWxSZXN1bHRzKCkgcmV0dXJucyB3cm9uZyB2YWx1ZSIsCisgICAgICAgICAgICAgICAgSU5DUkVNRU5UQUxfUkVTVUxUUywgbmV0d29ya1NjYW5SZXF1ZXN0LmdldEluY3JlbWVudGFsUmVzdWx0cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXRJbmNyZW1lbnRhbFJlc3VsdHNQZXJpb2RpY2l0eSgpIHJldHVybnMgd3JvbmcgdmFsdWUiLAorICAgICAgICAgICAgICAgIElOQ1JFTUVOVEFMX1JFU1VMVFNfUEVSSU9ESUNJVFlfU0VDLAorICAgICAgICAgICAgICAgIG5ldHdvcmtTY2FuUmVxdWVzdC5nZXRJbmNyZW1lbnRhbFJlc3VsdHNQZXJpb2RpY2l0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXRQbG1ucygpIHJldHVybnMgd3JvbmcgdmFsdWUiLCBnZXRQbG1ucygpLCBuZXR3b3JrU2NhblJlcXVlc3QuZ2V0UGxtbnMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZGVzY3JpYmVDb250ZW50cygpIHJldHVybnMgd3JvbmcgdmFsdWUiLAorICAgICAgICAgICAgICAgIDAsIG5ldHdvcmtTY2FuUmVxdWVzdC5kZXNjcmliZUNvbnRlbnRzKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRvIHRlc3QgaXRzIGhhc2hDb2RlIG1ldGhvZC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROZXR3b3JrU2NhblJlcXVlc3RQYXJjZWxfSGFzaGNvZGUoKSB7CisgICAgICAgIE5ldHdvcmtTY2FuUmVxdWVzdCBuZXR3b3JrU2NhblJlcXVlc3QxID0gbmV3IE5ldHdvcmtTY2FuUmVxdWVzdCgKKyAgICAgICAgICAgICAgICBTQ0FOX1RZUEUsCisgICAgICAgICAgICAgICAgUkFESU9fQUNDRVNTX1NQRUNJRklFUlMsCisgICAgICAgICAgICAgICAgU0VBUkNIX1BFUklPRElDSVRZX1NFQywKKyAgICAgICAgICAgICAgICBNQVhfU0VBUkNIX1RJTUVfU0VDLAorICAgICAgICAgICAgICAgIElOQ1JFTUVOVEFMX1JFU1VMVFMsCisgICAgICAgICAgICAgICAgSU5DUkVNRU5UQUxfUkVTVUxUU19QRVJJT0RJQ0lUWV9TRUMsCisgICAgICAgICAgICAgICAgZ2V0UGxtbnMoKSk7CisKKyAgICAgICAgTmV0d29ya1NjYW5SZXF1ZXN0IG5ldHdvcmtTY2FuUmVxdWVzdDIgPSBuZXcgTmV0d29ya1NjYW5SZXF1ZXN0KAorICAgICAgICAgICAgICAgIFNDQU5fVFlQRSwKKyAgICAgICAgICAgICAgICBSQURJT19BQ0NFU1NfU1BFQ0lGSUVSUywKKyAgICAgICAgICAgICAgICBTRUFSQ0hfUEVSSU9ESUNJVFlfU0VDLAorICAgICAgICAgICAgICAgIE1BWF9TRUFSQ0hfVElNRV9TRUMsCisgICAgICAgICAgICAgICAgSU5DUkVNRU5UQUxfUkVTVUxUUywKKyAgICAgICAgICAgICAgICBJTkNSRU1FTlRBTF9SRVNVTFRTX1BFUklPRElDSVRZX1NFQywKKyAgICAgICAgICAgICAgICBnZXRQbG1ucygpKTsKKworICAgICAgICBOZXR3b3JrU2NhblJlcXVlc3QgbmV0d29ya1NjYW5SZXF1ZXN0MyA9IG5ldyBOZXR3b3JrU2NhblJlcXVlc3QoCisgICAgICAgICAgICAgICAgU0NBTl9UWVBFLAorICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgU0VBUkNIX1BFUklPRElDSVRZX1NFQywKKyAgICAgICAgICAgICAgICBNQVhfU0VBUkNIX1RJTUVfU0VDLAorICAgICAgICAgICAgICAgIGZhbHNlLAorICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgZ2V0UGxtbnMoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJoYXNoQ29kZSgpIHJldHVybnMgZGlmZmVyZW50IGhhc2ggY29kZSBmb3Igc2FtZSBvYmplY3RzIiwKKyAgICAgICAgICAgICAgICBuZXR3b3JrU2NhblJlcXVlc3QxLmhhc2hDb2RlKCksIG5ldHdvcmtTY2FuUmVxdWVzdDIuaGFzaENvZGUoKSk7CisgICAgICAgIGFzc2VydE5vdFNhbWUoImhhc2hDb2RlKCkgcmV0dXJucyBzYW1lIGhhc2ggY29kZSBmb3IgZGlmZmVyZW50IG9iamVjdHMiLAorICAgICAgICAgICAgICAgIG5ldHdvcmtTY2FuUmVxdWVzdDEuaGFzaENvZGUoKSwgbmV0d29ya1NjYW5SZXF1ZXN0My5oYXNoQ29kZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUbyB0ZXN0IGl0cyBjb21wYXJpc2lvbiBtZXRob2QuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmV0d29ya1NjYW5SZXF1ZXN0UGFyY2VsX0VxdWFscygpIHsKKyAgICAgICAgTmV0d29ya1NjYW5SZXF1ZXN0IG5ldHdvcmtTY2FuUmVxdWVzdDEgPSBuZXcgTmV0d29ya1NjYW5SZXF1ZXN0KAorICAgICAgICAgICAgICAgIFNDQU5fVFlQRSwKKyAgICAgICAgICAgICAgICBSQURJT19BQ0NFU1NfU1BFQ0lGSUVSUywKKyAgICAgICAgICAgICAgICBTRUFSQ0hfUEVSSU9ESUNJVFlfU0VDLAorICAgICAgICAgICAgICAgIE1BWF9TRUFSQ0hfVElNRV9TRUMsCisgICAgICAgICAgICAgICAgSU5DUkVNRU5UQUxfUkVTVUxUUywKKyAgICAgICAgICAgICAgICBJTkNSRU1FTlRBTF9SRVNVTFRTX1BFUklPRElDSVRZX1NFQywKKyAgICAgICAgICAgICAgICBnZXRQbG1ucygpKTsKKworICAgICAgICBOZXR3b3JrU2NhblJlcXVlc3QgbmV0d29ya1NjYW5SZXF1ZXN0MiA9IG5ldyBOZXR3b3JrU2NhblJlcXVlc3QoCisgICAgICAgICAgICAgICAgU0NBTl9UWVBFLAorICAgICAgICAgICAgICAgIFJBRElPX0FDQ0VTU19TUEVDSUZJRVJTLAorICAgICAgICAgICAgICAgIFNFQVJDSF9QRVJJT0RJQ0lUWV9TRUMsCisgICAgICAgICAgICAgICAgTUFYX1NFQVJDSF9USU1FX1NFQywKKyAgICAgICAgICAgICAgICBJTkNSRU1FTlRBTF9SRVNVTFRTLAorICAgICAgICAgICAgICAgIElOQ1JFTUVOVEFMX1JFU1VMVFNfUEVSSU9ESUNJVFlfU0VDLAorICAgICAgICAgICAgICAgIGdldFBsbW5zKCkpOworCisgICAgICAgIGFzc2VydFRydWUobmV0d29ya1NjYW5SZXF1ZXN0MS5lcXVhbHMobmV0d29ya1NjYW5SZXF1ZXN0MikpOworCisgICAgICAgIG5ldHdvcmtTY2FuUmVxdWVzdDIgPSBuZXcgTmV0d29ya1NjYW5SZXF1ZXN0KAorICAgICAgICAgICAgICAgIFNDQU5fVFlQRSwKKyAgICAgICAgICAgICAgICBSQURJT19BQ0NFU1NfU1BFQ0lGSUVSUywKKyAgICAgICAgICAgICAgICBTRUFSQ0hfUEVSSU9ESUNJVFlfU0VDLAorICAgICAgICAgICAgICAgIE1BWF9TRUFSQ0hfVElNRV9TRUMsCisgICAgICAgICAgICAgICAgSU5DUkVNRU5UQUxfUkVTVUxUUywKKyAgICAgICAgICAgICAgICBJTkNSRU1FTlRBTF9SRVNVTFRTX1BFUklPRElDSVRZX1NFQywKKyAgICAgICAgICAgICAgICBudWxsIC8qIExpc3Qgb2YgUExNTiBpZHMgKE1DQy1NTkMpICovKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobmV0d29ya1NjYW5SZXF1ZXN0MS5lcXVhbHMobmV0d29ya1NjYW5SZXF1ZXN0MikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRvIHRlc3QgaXRzIHdyaXRlVG9QYXJjZWwgYW5kIGNyZWF0ZUZyb21QYXJjZWwgbWV0aG9kcy4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROZXR3b3JrU2NhblJlcXVlc3RQYXJjZWxfUGFyY2VsKCkgeworICAgICAgICBOZXR3b3JrU2NhblJlcXVlc3QgbmV0d29ya1NjYW5SZXF1ZXN0ID0gbmV3IE5ldHdvcmtTY2FuUmVxdWVzdCgKKyAgICAgICAgICAgICAgICBTQ0FOX1RZUEUsCisgICAgICAgICAgICAgICAgbnVsbCAvKiBSYWRpbyBBY2Nlc3MgU3BlY2lmaWVyICovLAorICAgICAgICAgICAgICAgIFNFQVJDSF9QRVJJT0RJQ0lUWV9TRUMsCisgICAgICAgICAgICAgICAgTUFYX1NFQVJDSF9USU1FX1NFQywKKyAgICAgICAgICAgICAgICBJTkNSRU1FTlRBTF9SRVNVTFRTLAorICAgICAgICAgICAgICAgIElOQ1JFTUVOVEFMX1JFU1VMVFNfUEVSSU9ESUNJVFlfU0VDLAorICAgICAgICAgICAgICAgIGdldFBsbW5zKCkpOworCisgICAgICAgIFBhcmNlbCBwID0gUGFyY2VsLm9idGFpbigpOworICAgICAgICBuZXR3b3JrU2NhblJlcXVlc3Qud3JpdGVUb1BhcmNlbChwLCAwKTsKKyAgICAgICAgcC5zZXREYXRhUG9zaXRpb24oMCk7CisgICAgICAgIE5ldHdvcmtTY2FuUmVxdWVzdCBuZXduc3IgPSBOZXR3b3JrU2NhblJlcXVlc3QuQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKHApOworICAgICAgICBhc3NlcnRUcnVlKG5ldHdvcmtTY2FuUmVxdWVzdC5lcXVhbHMobmV3bnNyKSk7CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9jb2xvcm1vZGUvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL2NvbG9ybW9kZS9BbmRyb2lkLm1rCmluZGV4IGE1MDZmYTUuLjFiY2UyNDcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2NvbG9ybW9kZS9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3Rlc3RzL2NvbG9ybW9kZS9BbmRyb2lkLm1rCkBAIC0yNCwxMiArMjQsMTIgQEAKIAogTE9DQUxfUFJPR1VBUkRfRU5BQkxFRCA6PSBkaXNhYmxlZAogCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY3RzdGVzdHJ1bm5lciBsZWdhY3ktYW5kcm9pZC10ZXN0CitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY3RzdGVzdHJ1bm5lci1heHQKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogCiAjIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0Ci1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMgY3RzX2luc3RhbnQKIAogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0NvbG9yTW9kZVRlc3RDYXNlcwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9jb2xvcm1vZGUvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL2NvbG9ybW9kZS9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGJlMmM0NTcuLjQ4OTcxYWYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2NvbG9ybW9kZS9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL2NvbG9ybW9kZS9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0xNSw3ICsxNSw4IEBACiAgLS0+CiAKIDxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIHBhY2thZ2U9ImFuZHJvaWQuY29sb3Jtb2RlLmN0cyI+CisgICAgICAgIHBhY2thZ2U9ImFuZHJvaWQuY29sb3Jtb2RlLmN0cyIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRTYW5kYm94VmVyc2lvbj0iMiI+CiAKICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkRJU0FCTEVfS0VZR1VBUkQiIC8+CiAKQEAgLTI3LDcgKzI4LDcgQEAKICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5jb2xvcm1vZGUuQXR0cmlidXRlV2lkZUNvbG9yTW9kZUFjdGl2aXR5IiAvPgogICAgIDwvYXBwbGljYXRpb24+CiAKLSAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmNvbG9ybW9kZS5jdHMiCiAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJUZXN0cyBmb3IgdGhlIENvbG9yIE1vZGUgQVBJcy4iID4KICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9Imxpc3RlbmVyIgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvY29sb3Jtb2RlL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL2NvbG9ybW9kZS9BbmRyb2lkVGVzdC54bWwKaW5kZXggOWMwOTAzOC4uZWI0OTFjMiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvY29sb3Jtb2RlL0FuZHJvaWRUZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9jb2xvcm1vZGUvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgQ29sb3IgTW9kZSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iZ3JhcGhpY3MiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJub3Qtc2hhcmRhYmxlIiB2YWx1ZT0idHJ1ZSIgLz4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2NvbG9ybW9kZS9zcmMvYW5kcm9pZC9jb2xvcm1vZGUvY3RzL0F0dHJpYnV0ZVdpZGVDb2xvck1vZGVUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9jb2xvcm1vZGUvc3JjL2FuZHJvaWQvY29sb3Jtb2RlL2N0cy9BdHRyaWJ1dGVXaWRlQ29sb3JNb2RlVGVzdC5qYXZhCmluZGV4IGExMjliNzkuLmUzYTVlN2UgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2NvbG9ybW9kZS9zcmMvYW5kcm9pZC9jb2xvcm1vZGUvY3RzL0F0dHJpYnV0ZVdpZGVDb2xvck1vZGVUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvY29sb3Jtb2RlL3NyYy9hbmRyb2lkL2NvbG9ybW9kZS9jdHMvQXR0cmlidXRlV2lkZUNvbG9yTW9kZVRlc3QuamF2YQpAQCAtMTYsMjEgKzE2LDIzIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5jb2xvcm1vZGUuY3RzOwogCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CiBpbXBvcnQgYW5kcm9pZC5jb2xvcm1vZGUuQXR0cmlidXRlV2lkZUNvbG9yTW9kZUFjdGl2aXR5OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm87CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvdzsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIAotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLQogQE1lZGl1bVRlc3QKIEBSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCiBwdWJsaWMgY2xhc3MgQXR0cmlidXRlV2lkZUNvbG9yTW9kZVRlc3QgewpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvY29sb3Jtb2RlL3NyYy9hbmRyb2lkL2NvbG9ybW9kZS9jdHMvRGVmYXVsdENvbG9yTW9kZVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2NvbG9ybW9kZS9zcmMvYW5kcm9pZC9jb2xvcm1vZGUvY3RzL0RlZmF1bHRDb2xvck1vZGVUZXN0LmphdmEKaW5kZXggNGQwNzZmOC4uNzFmOGQxMSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvY29sb3Jtb2RlL3NyYy9hbmRyb2lkL2NvbG9ybW9kZS9jdHMvRGVmYXVsdENvbG9yTW9kZVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9jb2xvcm1vZGUvc3JjL2FuZHJvaWQvY29sb3Jtb2RlL2N0cy9EZWZhdWx0Q29sb3JNb2RlVGVzdC5qYXZhCkBAIC0xNiwyMiArMTYsMjQgQEAKIAogcGFja2FnZSBhbmRyb2lkLmNvbG9ybW9kZS5jdHM7CiAKLWltcG9ydCBhbmRyb2lkLmNvbG9ybW9kZS5EZWZhdWx0Q29sb3JNb2RlQWN0aXZpdHk7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworCiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb2xvcm1vZGUuRGVmYXVsdENvbG9yTW9kZUFjdGl2aXR5OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm87CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvdzsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIAotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKLQogQE1lZGl1bVRlc3QKIEBSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCiBwdWJsaWMgY2xhc3MgRGVmYXVsdENvbG9yTW9kZVRlc3QgewpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvY29sb3Jtb2RlL3NyYy9hbmRyb2lkL2NvbG9ybW9kZS9jdHMvV2lkZUNvbG9yTW9kZVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2NvbG9ybW9kZS9zcmMvYW5kcm9pZC9jb2xvcm1vZGUvY3RzL1dpZGVDb2xvck1vZGVUZXN0LmphdmEKaW5kZXggNjRmMzdjNi4uZjdjOGM5MSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvY29sb3Jtb2RlL3NyYy9hbmRyb2lkL2NvbG9ybW9kZS9jdHMvV2lkZUNvbG9yTW9kZVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9jb2xvcm1vZGUvc3JjL2FuZHJvaWQvY29sb3Jtb2RlL2N0cy9XaWRlQ29sb3JNb2RlVGVzdC5qYXZhCkBAIC0xNiwyMSArMTYsMjMgQEAKIAogcGFja2FnZSBhbmRyb2lkLmNvbG9ybW9kZS5jdHM7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKIGltcG9ydCBhbmRyb2lkLmNvbG9ybW9kZS5XaWRlQ29sb3JNb2RlQWN0aXZpdHk7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkFjdGl2aXR5SW5mbzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotCiBATWVkaXVtVGVzdAogQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKIHB1YmxpYyBjbGFzcyBXaWRlQ29sb3JNb2RlVGVzdCB7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9jb250YWN0c3Byb3ZpZGVyd2lwZS9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvY29udGFjdHNwcm92aWRlcndpcGUvQW5kcm9pZC5tawppbmRleCBkODQzMjU2Li5lMDQ2ZmFkIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9jb250YWN0c3Byb3ZpZGVyd2lwZS9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3Rlc3RzL2NvbnRhY3RzcHJvdmlkZXJ3aXBlL0FuZHJvaWQubWsKQEAgLTIxLDE0ICsyMSwxNCBAQAogTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKIAogTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKLSAgICBhbmRyb2lkLXN1cHBvcnQtdGVzdCBcCi0gICAgYW5kcm9pZC1zdXBwb3J0LXY0IFwKKyAgICBhbmRyb2lkeC50ZXN0LnJ1bGVzIFwKKyAgICBhbmRyb2lkeC5sZWdhY3lfbGVnYWN5LXN1cHBvcnQtdjQgXAogICAgIG1vY2tpdG8tdGFyZ2V0LW1pbnVzLWp1bml0NCBcCi0gICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbCBcCi0gICAgY3RzdGVzdHJ1bm5lciBcCisgICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgXAorICAgIGN0c3Rlc3RydW5uZXItYXh0IFwKICAgICB1Yi11aWF1dG9tYXRvcgogCi1MT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzIGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIApAQCAtMzksNiArMzksNSBAQAogTE9DQUxfU0RLX1ZFUlNJT04gOj0gdGVzdF9jdXJyZW50CiAKIGluY2x1ZGUgJChCVUlMRF9DVFNfUEFDS0FHRSkKLSNpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKIAogaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvY29udGFjdHNwcm92aWRlcndpcGUvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL2NvbnRhY3RzcHJvdmlkZXJ3aXBlL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggOWFjOWFkMC4uZGVhYjcyMSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvY29udGFjdHNwcm92aWRlcndpcGUvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9jb250YWN0c3Byb3ZpZGVyd2lwZS9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yNSw3ICsyNSw3IEBACiAgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIi8+CiAgICAgPC9hcHBsaWNhdGlvbj4KIAotICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5wcm92aWRlci5jdHMuY29udGFjdHNwcm92aWRlcndpcGUiPgogICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0ibGlzdGVuZXIiCiAgICAgICAgICAgICBhbmRyb2lkOnZhbHVlPSJjb20uYW5kcm9pZC5jdHMucnVubmVyLkN0c1Rlc3RSdW5MaXN0ZW5lciIgLz4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2NvbnRhY3RzcHJvdmlkZXJ3aXBlL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL2NvbnRhY3RzcHJvdmlkZXJ3aXBlL0FuZHJvaWRUZXN0LnhtbAppbmRleCBiMTIzOThiLi4zYTAzYTFlIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9jb250YWN0c3Byb3ZpZGVyd2lwZS9BbmRyb2lkVGVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvY29udGFjdHNwcm92aWRlcndpcGUvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgUHJvdmlkZXIgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImZyYW1ld29yayIgLz4KICAgICA8b3B0aW9uIG5hbWU9Im5vdC1zaGFyZGFibGUiIHZhbHVlPSJ0cnVlIiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvY29udGFjdHNwcm92aWRlcndpcGUvc3JjL2FuZHJvaWQvcHJvdmlkZXIvY3RzL2NvbnRhY3RzcHJvdmlkZXJ3aXBlL0NvbnRhY3RzQ29udHJhY3RfV2lwZS5qYXZhIGIvdGVzdHMvdGVzdHMvY29udGFjdHNwcm92aWRlcndpcGUvc3JjL2FuZHJvaWQvcHJvdmlkZXIvY3RzL2NvbnRhY3RzcHJvdmlkZXJ3aXBlL0NvbnRhY3RzQ29udHJhY3RfV2lwZS5qYXZhCmluZGV4IGEwZDdmMTYuLjI5NDczNWMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2NvbnRhY3RzcHJvdmlkZXJ3aXBlL3NyYy9hbmRyb2lkL3Byb3ZpZGVyL2N0cy9jb250YWN0c3Byb3ZpZGVyd2lwZS9Db250YWN0c0NvbnRyYWN0X1dpcGUuamF2YQorKysgYi90ZXN0cy90ZXN0cy9jb250YWN0c3Byb3ZpZGVyd2lwZS9zcmMvYW5kcm9pZC9wcm92aWRlci9jdHMvY29udGFjdHNwcm92aWRlcndpcGUvQ29udGFjdHNDb250cmFjdF9XaXBlLmphdmEKQEAgLTI4LDE0ICsyOCwxNiBAQAogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3Q7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkludGVudHM7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LlByb3ZpZGVyU3RhdHVzOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwogaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKKwogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CiBpbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC01Miw2ICs1NCw3IEBACiAgKiBhIHN0YWJsZSBjb25uZWN0aW9uIHRvIHRoZSBjb250YWN0cyBwcm92aWRlciwgd2hpY2ggd291bGQgY2F1c2UgdGhlIHRlc3QgcHJvY2VzcyB0byBiZSBraWxsZWQKICAqIHdoZW4gdGhlIENQMiBwcm9jZXNzIGdldHMga2lsbGVkIChmb3IgInBtIGNsZWFyIikuCiAgKi8KK0BBcHBNb2RlRnVsbCAvLyBSZXF1aXJlcyBSRUFEL1dSSVRFX0NPTlRBQ1RTLgogcHVibGljIGNsYXNzIENvbnRhY3RzQ29udHJhY3RfV2lwZSBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkNvbnRhY3RzQ29udHJhY3RfUFMiOwogCkBAIC0xMzEsNyArMTM0LDcgQEAKIAogICAgICAgICBmaW5hbCBTdHJpbmcgcmVzdWx0ID0gY29uY2F0UmVzdWx0KHJlYWRBbGwoCiAgICAgICAgICAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VWlBdXRvbWF0aW9uKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJwbSBjbGVhciAiICsgcHJvdmlkZXJQYWNrYWdlKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgInBtIGNsZWFyIC0tdXNlciBjdXJyZW50ICIgKyBwcm92aWRlclBhY2thZ2UpKSk7CiAgICAgICAgIExvZy5pKFRBRywgIlJlc3VsdDoiICsgcmVzdWx0KTsKIAogICAgICAgICBhc3NlcnRFcXVhbHMoIlN1Y2Nlc3MiLCByZXN1bHQpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvY29udGVudC9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvY29udGVudC9BbmRyb2lkLm1rCmluZGV4IGRmODExZjkuLjRiNzQxNWQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvQW5kcm9pZC5taworKysgYi90ZXN0cy90ZXN0cy9jb250ZW50L0FuZHJvaWQubWsKQEAgLTI3LDI5ICsyNyw0MiBAQAogCiBMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJuYXRpdmVjdXJzb3J3aW5kb3dfam5pIGxpYm5hdGl2ZWhlbHBlcl9jb21wYXRfbGliYysrCiAKLUxPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIuc3R1YnMgYW5kcm9pZC50ZXN0LmJhc2Uuc3R1YnMgYW5kcm9pZC50ZXN0Lm1vY2sKIAogTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9ICBcCi0gICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbCBcCi0gICAgY3RzdGVzdHJ1bm5lciBcCisgICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgXAorICAgIGN0c3Rlc3RydW5uZXItYXh0IFwKICAgICBzZXJ2aWNlcy5jb3JlIFwKICAgICBqdW5pdCBcCi0gICAgbGVnYWN5LWFuZHJvaWQtdGVzdCBcCi0gICAgdHJ1dGgtcHJlYnVpbHQKKyAgICB0cnV0aC1wcmVidWlsdCBcCisgICAgYWNjb3VudGFjY2Vzc2xpYgogCi1MT0NBTF9TVEFUSUNfQU5EUk9JRF9MSUJSQVJJRVMgOj0gYW5kcm9pZC1zdXBwb3J0LXY0CitMT0NBTF9TVEFUSUNfQU5EUk9JRF9MSUJSQVJJRVMgOj0gYW5kcm9pZHgubGVnYWN5X2xlZ2FjeS1zdXBwb3J0LXY0CiAKICMgVXNlIG11bHRpLWRleCBhcyB0aGUgY29tcGF0aWJpbGl0eS1jb21tb24tdXRpbC1kZXZpY2VzaWRlbGliIGRlcGVuZGVuY3kKLSMgb24gY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbCBwdXNoZXMgdXMgYmV5b25kIDY0ayBtZXRob2RzLgorIyBvbiBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBwdXNoZXMgdXMgYmV5b25kIDY0ayBtZXRob2RzLgogTE9DQUxfSkFDS19GTEFHUyA6PSAtLW11bHRpLWRleCBuYXRpdmUKIExPQ0FMX0RYX0ZMQUdTIDo9IC0tbXVsdGktZGV4CiAKICMgUmVzb3VyY2UgdW5pdCB0ZXN0cyB1c2UgYSBwcml2YXRlIGxvY2FsZSBhbmQgc29tZSBkZW5zaXRpZXMKIExPQ0FMX0FBUFRfSU5DTFVERV9BTExfUkVTT1VSQ0VTIDo9IHRydWUKK0xPQ0FMX0FBUFRfRkxBR1MgOj0gXAorCS1jIGNzIFwKKwktYyBmaWwsZmlsLXJQSCxmaWwtclNBIFwKKwktYyBmcixmci1yRlIgXAorCS1jIGl3LGl3LXJJTCBcCisJLWMga29rLGIra29rKzQxOSxiK2tvays0MTkrdmFyaWFudCxiK2tvaytJTixiK2tvaytLbmRhLGIra29rK0tuZGErNDE5LGIra29rK0tuZGErNDE5K3ZhcmlhbnQgXAorCS1jIGIra29rK3ZhcmlhbnQgXAorCS1jIG1rLG1rLXJNSyBcCisJLWMgdGwsdGwtclBIIFwKKwktYyB0Z2wsdGdsLXJQSCBcCisJLWMgdGxoIFwKKwktYyB4eCx4eC1yWVkKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogTE9DQUxfTVVMVElMSUIgOj0gYm90aAogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0NvbnRlbnRUZXN0Q2FzZXMKK0xPQ0FMX1BSSVZBVEVfUExBVEZPUk1fQVBJUyA6PSB0cnVlCiAKICMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKIExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9jb250ZW50L0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy90ZXN0cy9jb250ZW50L0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggYjE5MWExMS4uM2YyMzkxNSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvY29udGVudC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjksNiArMjksNyBAQAogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uU0VUX1dBTExQQVBFUiIgLz4KICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkJST0FEQ0FTVF9TVElDS1kiIC8+CiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX0VYVEVSTkFMX1NUT1JBR0UiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5BQ0NFU1NfTkVUV09SS19TVEFURSIgLz4KICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5jb250ZW50LmN0cy5wZXJtaXNzaW9uLlRFU1RfR1JBTlRFRCIgLz4KIAogICAgIDwhLS0gVXNlZCBmb3IgUGFja2FnZU1hbmFnZXIgdGVzdCwgZG9uJ3QgZGVsZXRlIHRoaXMgSU5URVJORVQgcGVybWlzc2lvbiAtLT4KQEAgLTExOSw3ICsxMjAsOCBAQAogICAgICAgICAgICAgICAgIGFuZHJvaWQ6bWF4UmVjZW50cz0iMSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOm11bHRpQXJjaD0idHJ1ZSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuY29udGVudC5jdHMuTW9ja0FwcGxpY2F0aW9uIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3VwcG9ydHNSdGw9InRydWUiPgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3VwcG9ydHNSdGw9InRydWUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDphcHBDYXRlZ29yeT0icHJvZHVjdGl2aXR5Ij4KICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5jb250ZW50LmN0cy5Nb2NrQWN0aXZpdHkiPgogICAgICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYXBwLmFsaWFzIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6cmVzb3VyY2U9IkB4bWwvYWxpYXMiIC8+CkBAIC0yMjYsNyArMjI4LDcgQEAKICAgICAgICAgPHByb3ZpZGVyIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5jb250ZW50LmN0cy5Nb2NrUmVtb3RlQ29udGVudFByb3ZpZGVyIgogICAgICAgICAgICAgYW5kcm9pZDphdXRob3JpdGllcz0icmVtb3RlY3RzdGVzdCIKICAgICAgICAgICAgIGFuZHJvaWQ6cHJvY2Vzcz0iOnJlbW90ZXByb3ZpZGVyIiBhbmRyb2lkOm11bHRpcHJvY2Vzcz0iZmFsc2UiIC8+Ci0gICAgICAgIDxwcm92aWRlciBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC52NC5jb250ZW50LkZpbGVQcm92aWRlciIKKyAgICAgICAgPHByb3ZpZGVyIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHguY29yZS5jb250ZW50LkZpbGVQcm92aWRlciIKICAgICAgICAgICAgIGFuZHJvaWQ6YXV0aG9yaXRpZXM9ImFuZHJvaWQuY29udGVudC5jdHMuZmlsZXByb3ZpZGVyIgogICAgICAgICAgICAgYW5kcm9pZDpncmFudFVyaVBlcm1pc3Npb25zPSJ0cnVlIj4KICAgICAgICAgICAgIDxtZXRhLWRhdGEKQEAgLTI4OCw5ICsyOTAsMjcgQEAKICAgICAgICAgICAgICAgICBhbmRyb2lkOnByb2Nlc3M9Ijpwcm92aWRlclByb2Nlc3MiPgogICAgICAgICA8L3Byb3ZpZGVyPgogCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLmN0cy5jb250ZW50LlN0dWJBY3Rpdml0eSIvPgorCisgICAgICAgIDxzZXJ2aWNlIGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuY3RzLmNvbnRlbnQuTm90QWx3YXlzU3luY2FibGVTeW5jU2VydmljZSI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5jb250ZW50LlN5bmNBZGFwdGVyIi8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5jb250ZW50LlN5bmNBZGFwdGVyIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cmVzb3VyY2U9IkB4bWwvbm90X2Fsd2F5c19zeW5jYWJsZV9hY2NvdW50X2FjY2Vzc19hZGFwdGVyIiAvPgorICAgICAgICA8L3NlcnZpY2U+CisKKyAgICAgICAgPHNlcnZpY2UgYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5jdHMuY29udGVudC5BbHdheXNTeW5jYWJsZVN5bmNTZXJ2aWNlIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmNvbnRlbnQuU3luY0FkYXB0ZXIiLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmNvbnRlbnQuU3luY0FkYXB0ZXIiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpyZXNvdXJjZT0iQHhtbC9hbHdheXNfc3luY2FibGVfYWNjb3VudF9hY2Nlc3NfYWRhcHRlciIgLz4KKyAgICAgICAgPC9zZXJ2aWNlPgorCiAgICAgPC9hcHBsaWNhdGlvbj4KIAotICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuY29udGVudC5jdHMiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgdGVzdHMgb2YgYW5kcm9pZC5jb250ZW50Ij4KICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9Imxpc3RlbmVyIgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvY29udGVudC9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy90ZXN0cy9jb250ZW50L0FuZHJvaWRUZXN0LnhtbAppbmRleCA1Y2FiMGFjLi5hMTUxOTZmIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9jb250ZW50L0FuZHJvaWRUZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9jb250ZW50L0FuZHJvaWRUZXN0LnhtbApAQCAtMzEsMTAgKzMxLDEzIEBACiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CiAgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0NvbnRlbnRUZXN0Q2FzZXMuYXBrIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzU3luY0FjY291bnRBY2Nlc3NTdHVicy5hcGsiIC8+CiAgICAgPC90YXJnZXRfcHJlcGFyZXI+CiAKICAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuQW5kcm9pZEpVbml0VGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bm5lciIgdmFsdWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJwYWNrYWdlIiB2YWx1ZT0iYW5kcm9pZC5jb250ZW50LmN0cyIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJydW50aW1lLWhpbnQiIHZhbHVlPSIyMW0zMHMiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0iaGlkZGVuLWFwaS1jaGVja3MiIHZhbHVlPSJmYWxzZSIgLz4KICAgICA8L3Rlc3Q+CiA8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9jb250ZW50L0N0c1N5bmNBY2NvdW50QWNjZXNzT3RoZXJDZXJ0VGVzdHMvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvQ3RzU3luY0FjY291bnRBY2Nlc3NPdGhlckNlcnRUZXN0cy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1OWZhYjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9jb250ZW50L0N0c1N5bmNBY2NvdW50QWNjZXNzT3RoZXJDZXJ0VGVzdHMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDQxIEBACisjCisjIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAorICAgIGFuZHJvaWR4LnRlc3QucnVsZXMgXAorICAgIGN0c3Rlc3RydW5uZXItYXh0IFwKKyAgICBhY2NvdW50YWNjZXNzbGliCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c1N5bmNBY2NvdW50QWNjZXNzT3RoZXJDZXJ0VGVzdENhc2VzCitMT0NBTF9QUklWQVRFX1BMQVRGT1JNX0FQSVMgOj0gdHJ1ZQorCitMT0NBTF9DRVJUSUZJQ0FURSA6PSBjdHMvaG9zdHNpZGV0ZXN0cy9hcHBzZWN1cml0eS9jZXJ0cy9jdHMtdGVzdGtleTIKKworTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKKworTE9DQUxfUFJPR1VBUkRfRU5BQkxFRCA6PSBkaXNhYmxlZAorCitMT0NBTF9ERVhfUFJFT1BUIDo9IGZhbHNlCisKK2luY2x1ZGUgJChCVUlMRF9DVFNfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvQ3RzU3luY0FjY291bnRBY2Nlc3NPdGhlckNlcnRUZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdGVzdHMvY29udGVudC9DdHNTeW5jQWNjb3VudEFjY2Vzc090aGVyQ2VydFRlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdkMjBmOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvQ3RzU3luY0FjY291bnRBY2Nlc3NPdGhlckNlcnRUZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsNDEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLmN0cy5jb250ZW50Ij4KKworICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX05FVFdPUktfU1RBVEUiLz4KKworICAgIDxhcHBsaWNhdGlvbj4KKyAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLlN0dWJBY3Rpdml0eSIvPgorCisgICAgICAgIDxzZXJ2aWNlIGFuZHJvaWQ6bmFtZT0iLkFsd2F5c1N5bmNhYmxlU3luY1NlcnZpY2UiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuY29udGVudC5TeW5jQWRhcHRlciIvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuY29udGVudC5TeW5jQWRhcHRlciIKKyAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnJlc291cmNlPSJAeG1sL3N5bmNhZGFwdGVyIiAvPgorICAgICAgICA8L3NlcnZpY2U+CisKKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPGluc3RydW1lbnRhdGlvbgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5jdHMuY29udGVudCIgLz4KKworPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvQ3RzU3luY0FjY291bnRBY2Nlc3NPdGhlckNlcnRUZXN0cy9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy90ZXN0cy9jb250ZW50L0N0c1N5bmNBY2NvdW50QWNjZXNzT3RoZXJDZXJ0VGVzdHMvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNmRhMDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9jb250ZW50L0N0c1N5bmNBY2NvdW50QWNjZXNzT3RoZXJDZXJ0VGVzdHMvQW5kcm9pZFRlc3QueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgdGVzdHMgb2Ygc3luYyBhZGFwdGVycyB3aXRoIGRpZmZlcmVudCBjZXJ0cyBhcyB0aGUgYXV0aGVudGljYXRvciI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KKyAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImZyYW1ld29yayIgLz4KKworICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJDdHNTeW5jQWNjb3VudEFjY2Vzc090aGVyQ2VydFRlc3RDYXNlcy5hcGsiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJDdHNTeW5jQWNjb3VudEFjY2Vzc1N0dWJzLmFwayIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKworICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5BbmRyb2lkSlVuaXRUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0icGFja2FnZSIgdmFsdWU9ImNvbS5hbmRyb2lkLmN0cy5jb250ZW50IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjMwcyIgLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2NvbnRlbnQvdGVzdC1hcHBzL0N0c1N5bmNBY2NvdW50QWNjZXNzT3RoZXJDZXJ0VGVzdHMvcmVzL3htbC9zeW5jYWRhcHRlci54bWwgYi90ZXN0cy90ZXN0cy9jb250ZW50L0N0c1N5bmNBY2NvdW50QWNjZXNzT3RoZXJDZXJ0VGVzdHMvcmVzL3htbC9zeW5jYWRhcHRlci54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGhvc3RzaWRldGVzdHMvY29udGVudC90ZXN0LWFwcHMvQ3RzU3luY0FjY291bnRBY2Nlc3NPdGhlckNlcnRUZXN0cy9yZXMveG1sL3N5bmNhZGFwdGVyLnhtbApyZW5hbWUgdG8gdGVzdHMvdGVzdHMvY29udGVudC9DdHNTeW5jQWNjb3VudEFjY2Vzc090aGVyQ2VydFRlc3RzL3Jlcy94bWwvc3luY2FkYXB0ZXIueG1sCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9jb250ZW50L0N0c1N5bmNBY2NvdW50QWNjZXNzT3RoZXJDZXJ0VGVzdHMvc3JjL2NvbS9hbmRyb2lkL2N0cy9jb250ZW50L0N0c1N5bmNBY2NvdW50QWNjZXNzT3RoZXJDZXJ0VGVzdENhc2VzLmphdmEgYi90ZXN0cy90ZXN0cy9jb250ZW50L0N0c1N5bmNBY2NvdW50QWNjZXNzT3RoZXJDZXJ0VGVzdHMvc3JjL2NvbS9hbmRyb2lkL2N0cy9jb250ZW50L0N0c1N5bmNBY2NvdW50QWNjZXNzT3RoZXJDZXJ0VGVzdENhc2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU1MmU3MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvQ3RzU3luY0FjY291bnRBY2Nlc3NPdGhlckNlcnRUZXN0cy9zcmMvY29tL2FuZHJvaWQvY3RzL2NvbnRlbnQvQ3RzU3luY0FjY291bnRBY2Nlc3NPdGhlckNlcnRUZXN0Q2FzZXMuamF2YQpAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY3RzLmNvbnRlbnQ7CisKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY3RzLmNvbnRlbnQuVXRpbHMuQUxXQVlTX1NZTkNBQkxFX0FVVEhPUklUWTsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY3RzLmNvbnRlbnQuVXRpbHMuU1lOQ19USU1FT1VUX01JTExJUzsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY3RzLmNvbnRlbnQuVXRpbHMuYWxsb3dTeW5jQWRhcHRlclJ1bkluQmFja2dyb3VuZEFuZERhdGFJbkJhY2tncm91bmQ7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmN0cy5jb250ZW50LlV0aWxzLmRpc2FsbG93U3luY0FkYXB0ZXJSdW5JbkJhY2tncm91bmRBbmREYXRhSW5CYWNrZ3JvdW5kOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jdHMuY29udGVudC5VdGlscy5nZXRVaURldmljZTsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY3RzLmNvbnRlbnQuVXRpbHMuaGFzRGF0YUNvbm5lY3Rpb247CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmN0cy5jb250ZW50LlV0aWxzLmhhc05vdGlmaWNhdGlvblN1cHBvcnQ7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmN0cy5jb250ZW50LlV0aWxzLmlzV2F0Y2g7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmN0cy5jb250ZW50LlV0aWxzLnJlcXVlc3RTeW5jOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jdHMuY29udGVudC5VdGlscy53aXRoQWNjb3VudDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzdW1lLmFzc3VtZUZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzdW1lLmFzc3VtZVRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLkFyZ3VtZW50TWF0Y2hlcnMuYW55OworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLm5ldmVyOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnRpbWVvdXQ7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8udmVyaWZ5OworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5BYnN0cmFjdFRocmVhZGVkU3luY0FkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU3luY1JlcXVlc3Q7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLkJ5OworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLlVpRGV2aWNlOworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLlVpT2JqZWN0MjsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC51aWF1dG9tYXRvci5VbnRpbDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLlRlc3RSdWxlOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCisvKioKKyAqIFRlc3RzIHdoZXRoZXIgYSBzeW5jIGFkYXB0ZXIgY2FuIGFjY2VzcyBhY2NvdW50cy4KKyAqLworQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBDdHNTeW5jQWNjb3VudEFjY2Vzc090aGVyQ2VydFRlc3RDYXNlcyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBVSV9USU1FT1VUX01JTExJUyA9IDUwMDA7IC8vIDUgc2VjCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPQorICAgICAgICAgICAgQ3RzU3luY0FjY291bnRBY2Nlc3NPdGhlckNlcnRUZXN0Q2FzZXMuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBQRVJNSVNTSU9OX1JFUVVFU1RFRCA9IFBhdHRlcm4uY29tcGlsZSgKKyAgICAgICAgICAgICJQZXJtaXNzaW9uIFJlcXVlc3RlZHxQZXJtaXNzaW9uIHJlcXVlc3RlZCIpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gQUxMT1dfU1lOQyA9IFBhdHRlcm4uY29tcGlsZSgiQUxMT1d8QWxsb3ciKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFTl9OT1RJRklDQVRJT05fV0FUQ0ggPSAiT3BlbiI7CisKKyAgICBAUnVsZQorICAgIHB1YmxpYyBmaW5hbCBUZXN0UnVsZSBtRmxha3lUZXN0UnVsZSA9IG5ldyBGbGFreVRlc3RSdWxlKDMpOworCisgICAgQFJ1bGUKKyAgICBwdWJsaWMgZmluYWwgQWN0aXZpdHlUZXN0UnVsZTxTdHViQWN0aXZpdHk+IGFjdGl2aXR5ID0gbmV3IEFjdGl2aXR5VGVzdFJ1bGUoU3R1YkFjdGl2aXR5LmNsYXNzKTsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhbGxvd1N5bmNBZGFwdGVyUnVuSW5CYWNrZ3JvdW5kQW5kRGF0YUluQmFja2dyb3VuZCgpOworICAgIH0KKworICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGRpc2FsbG93U3luY0FkYXB0ZXJSdW5JbkJhY2tncm91bmRBbmREYXRhSW5CYWNrZ3JvdW5kKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWNjb3VudEFjY2Vzc19vdGhlckNlcnRBc0F1dGhlbnRpY2F0b3JDYW5Ob3RTZWVBY2NvdW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc3VtZVRydWUoaGFzRGF0YUNvbm5lY3Rpb24oKSk7CisgICAgICAgIGFzc3VtZVRydWUoaGFzTm90aWZpY2F0aW9uU3VwcG9ydCgpKTsKKyAgICAgICAgYXNzdW1lRmFsc2UoaXNSdW5uaW5nSW5WUigpKTsKKworICAgICAgICAvLyBJZiBydW5uaW5nIGluIGEgdGVzdCBoYXJuZXNzIHRoZSBBY2NvdW50IE1hbmFnZXIgbmV2ZXIgZGVuaWVzIGFjY2VzcyB0byBhbiBhY2NvdW50LiBIZW5jZQorICAgICAgICAvLyB0aGUgcGVybWlzc2lvbiByZXF1ZXN0IHdpbGwgbm90IHRyaWdnZXIuIGIvNzIxMTQ5MjQKKyAgICAgICAgYXNzdW1lRmFsc2UoQWN0aXZpdHlNYW5hZ2VyLmlzUnVubmluZ0luVGVzdEhhcm5lc3MoKSk7CisKKyAgICAgICAgdHJ5IChBdXRvQ2xvc2VhYmxlIGlnbm9yZWQgPSB3aXRoQWNjb3VudChhY3Rpdml0eS5nZXRBY3Rpdml0eSgpKSkgeworICAgICAgICAgICAgQWJzdHJhY3RUaHJlYWRlZFN5bmNBZGFwdGVyIGFkYXB0ZXIgPSBBbHdheXNTeW5jYWJsZVN5bmNTZXJ2aWNlLmdldEluc3RhbmNlKAorICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eS5nZXRBY3Rpdml0eSgpKS5zZXROZXdEZWxlZ2F0ZSgpOworCisgICAgICAgICAgICBTeW5jUmVxdWVzdCByZXF1ZXN0ID0gcmVxdWVzdFN5bmMoQUxXQVlTX1NZTkNBQkxFX0FVVEhPUklUWSk7CisgICAgICAgICAgICBMb2cuaShMT0dfVEFHLCAiU3luYyByZXF1ZXN0ZWQgIiArIHJlcXVlc3QpOworCisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU1lOQ19USU1FT1VUX01JTExJUyk7CisgICAgICAgICAgICB2ZXJpZnkoYWRhcHRlciwgbmV2ZXIoKSkub25QZXJmb3JtU3luYyhhbnkoKSwgYW55KCksIGFueSgpLCBhbnkoKSwgYW55KCkpOworICAgICAgICAgICAgTG9nLmkoTE9HX1RBRywgIkRpZCBub3QgZ2V0IG9uUGVyZm9ybVN5bmMiKTsKKworICAgICAgICAgICAgVWlEZXZpY2UgdWlEZXZpY2UgPSBnZXRVaURldmljZSgpOworICAgICAgICAgICAgaWYgKGlzV2F0Y2goKSkgeworICAgICAgICAgICAgICAgIFVpT2JqZWN0MiBub3RpZmljYXRpb24gPSBmaW5kUGVybWlzc2lvbk5vdGlmaWNhdGlvbkluU3RyZWFtKHVpRGV2aWNlKTsKKyAgICAgICAgICAgICAgICBub3RpZmljYXRpb24uY2xpY2soKTsKKyAgICAgICAgICAgICAgICBVaU9iamVjdDIgb3BlbkJ1dHRvbiA9IHVpRGV2aWNlLndhaXQoCisgICAgICAgICAgICAgICAgICAgICAgICBVbnRpbC5maW5kT2JqZWN0KEJ5LnRleHQoT1BFTl9OT1RJRklDQVRJT05fV0FUQ0gpKSwgVUlfVElNRU9VVF9NSUxMSVMpOworICAgICAgICAgICAgICAgIGlmIChvcGVuQnV0dG9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gb2xkZXIgc3lzdWkgbWF5IG5vdCBoYXZlIHRoZSAib3BlbiIgYnV0dG9uCisgICAgICAgICAgICAgICAgICAgIG9wZW5CdXR0b24uY2xpY2soKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHVpRGV2aWNlLm9wZW5Ob3RpZmljYXRpb24oKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBVaU9iamVjdDIgcGVybWlzc2lvblJlcXVlc3QgPSB1aURldmljZS53YWl0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVudGlsLmZpbmRPYmplY3QoQnkudGV4dChQRVJNSVNTSU9OX1JFUVVFU1RFRCkpLCBVSV9USU1FT1VUX01JTExJUyk7CisKKyAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvblJlcXVlc3QuY2xpY2soKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgICAgIGdldFVpRGV2aWNlKCkuZHVtcFdpbmRvd0hpZXJhcmNoeShvcyk7CisKKyAgICAgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIldpbmRvdyBoaWVyYXJjaHk6Iik7CisgICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGxpbmUgOiBvcy50b1N0cmluZygiVVRGLTgiKS5zcGxpdCgiXG4iKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgbGluZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdCBvdmVyd2hlbG0gbG9nZ2luZworICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHRocm93ICB0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdWlEZXZpY2Uud2FpdChVbnRpbC5maW5kT2JqZWN0KEJ5LnRleHQoQUxMT1dfU1lOQykpLCBVSV9USU1FT1VUX01JTExJUykuY2xpY2soKTsKKworICAgICAgICAgICAgQ29udGVudFJlc29sdmVyLnJlcXVlc3RTeW5jKHJlcXVlc3QpOworCisgICAgICAgICAgICB2ZXJpZnkoYWRhcHRlciwgdGltZW91dChTWU5DX1RJTUVPVVRfTUlMTElTKSkub25QZXJmb3JtU3luYyhhbnkoKSwgYW55KCksIGFueSgpLCBhbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgYW55KCkpOworICAgICAgICAgICAgTG9nLmkoTE9HX1RBRywgIkdvdCBvblBlcmZvcm1TeW5jIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFVpT2JqZWN0MiBmaW5kUGVybWlzc2lvbk5vdGlmaWNhdGlvbkluU3RyZWFtKFVpRGV2aWNlIHVpRGV2aWNlKSB7CisgICAgICAgIHVpRGV2aWNlLnByZXNzSG9tZSgpOworICAgICAgICBzd2lwZVVwKHVpRGV2aWNlKTsKKyAgICAgICAgaWYgKHVpRGV2aWNlLmhhc09iamVjdChCeS50ZXh0KFBFUk1JU1NJT05fUkVRVUVTVEVEKSkpIHsKKyAgICAgICAgICByZXR1cm4gdWlEZXZpY2UuZmluZE9iamVjdChCeS50ZXh0KFBFUk1JU1NJT05fUkVRVUVTVEVEKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgeworICAgICAgICAgIGlmICghc3dpcGVVcCh1aURldmljZSkpIHsKKyAgICAgICAgICAgIC8vIFdlIGhhdmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gYW5kIG5vdCBmb3VuZCB0aGUgdGFyZ2V0LgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGlmICh1aURldmljZS5oYXNPYmplY3QoQnkudGV4dChQRVJNSVNTSU9OX1JFUVVFU1RFRCkpKSB7CisgICAgICAgICAgICByZXR1cm4gdWlEZXZpY2UuZmluZE9iamVjdChCeS50ZXh0KFBFUk1JU1NJT05fUkVRVUVTVEVEKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBzd2lwZVVwKFVpRGV2aWNlIHVpRGV2aWNlKSB7CisgICAgICAgIGludCB3aWR0aCA9IHVpRGV2aWNlLmdldERpc3BsYXlXaWR0aCgpOworICAgICAgICBpbnQgaGVpZ2h0ID0gdWlEZXZpY2UuZ2V0RGlzcGxheUhlaWdodCgpOworICAgICAgICByZXR1cm4gdWlEZXZpY2Uuc3dpcGUoCisgICAgICAgICAgICB3aWR0aCAvIDIgLyogc3RhcnRYICovLAorICAgICAgICAgICAgaGVpZ2h0IC0gMSAvKiBzdGFydFkgKi8sCisgICAgICAgICAgICB3aWR0aCAvIDIgLyogZW5kWCAqLywKKyAgICAgICAgICAgIDEgLyogZW5kWSAqLywKKyAgICAgICAgICAgIDUwIC8qIG51bWJlck9mU3RlcHMgKi8pOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc1J1bm5pbmdJblZSKCkgeworICAgICAgICBmaW5hbCBDb250ZXh0IGNvbnRleHQgPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRUYXJnZXRDb250ZXh0KCk7CisgICAgICAgIHJldHVybiAoKGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0Q29uZmlndXJhdGlvbigpLnVpTW9kZSAmCisgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24uVUlfTU9ERV9UWVBFX01BU0spID09IENvbmZpZ3VyYXRpb24uVUlfTU9ERV9UWVBFX1ZSX0hFQURTRVQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvU3luY0FjY291bnRBY2Nlc3NTdHVicy9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvY29udGVudC9TeW5jQWNjb3VudEFjY2Vzc1N0dWJzL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYwMTVhMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvU3luY0FjY291bnRBY2Nlc3NTdHVicy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzQgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c1N5bmNBY2NvdW50QWNjZXNzU3R1YnMKK0xPQ0FMX1BSSVZBVEVfUExBVEZPUk1fQVBJUyA6PSB0cnVlCisKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCisKK0xPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKKworTE9DQUxfREVYX1BSRU9QVCA6PSBmYWxzZQorCitpbmNsdWRlICQoQlVJTERfQ1RTX1NVUFBPUlRfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvU3luY0FjY291bnRBY2Nlc3NTdHVicy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdGVzdHMvY29udGVudC9TeW5jQWNjb3VudEFjY2Vzc1N0dWJzL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBkZWU4NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvU3luY0FjY291bnRBY2Nlc3NTdHVicy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsNDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLmN0cy5zdHViIj4KKworICAgIDxhcHBsaWNhdGlvbj4KKyAgICAgICAgPHNlcnZpY2UKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9Ii5TdHViQXV0aGVudGljYXRvciI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hY2NvdW50cy5BY2NvdW50QXV0aGVudGljYXRvciIvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgPG1ldGEtZGF0YQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hY2NvdW50cy5BY2NvdW50QXV0aGVudGljYXRvciIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnJlc291cmNlPSJAeG1sL2F1dGhlbnRpY2F0b3IiIC8+CisgICAgICAgIDwvc2VydmljZT4KKworICAgICAgICA8cHJvdmlkZXIKKyAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iLlN0dWJQcm92aWRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6YXV0aG9yaXRpZXM9ImNvbS5hbmRyb2lkLmN0cy5zdHViLnByb3ZpZGVyIgorICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6c3luY2FibGU9InRydWUiPgorICAgICAgICA8L3Byb3ZpZGVyPgorCisgICAgICAgIDxwcm92aWRlcgorICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSIuU3R1YlByb3ZpZGVyMiIKKyAgICAgICAgICAgIGFuZHJvaWQ6YXV0aG9yaXRpZXM9ImNvbS5hbmRyb2lkLmN0cy5zdHViLnByb3ZpZGVyMiIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOnN5bmNhYmxlPSJ0cnVlIj4KKyAgICAgICAgPC9wcm92aWRlcj4KKworICAgIDwvYXBwbGljYXRpb24+CisKKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2NvbnRlbnQvdGVzdC1hcHBzL1N5bmNBY2NvdW50QWNjZXNzU3R1YnMvcmVzL3htbC9hdXRoZW50aWNhdG9yLnhtbCBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvU3luY0FjY291bnRBY2Nlc3NTdHVicy9yZXMveG1sL2F1dGhlbnRpY2F0b3IueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBob3N0c2lkZXRlc3RzL2NvbnRlbnQvdGVzdC1hcHBzL1N5bmNBY2NvdW50QWNjZXNzU3R1YnMvcmVzL3htbC9hdXRoZW50aWNhdG9yLnhtbApyZW5hbWUgdG8gdGVzdHMvdGVzdHMvY29udGVudC9TeW5jQWNjb3VudEFjY2Vzc1N0dWJzL3Jlcy94bWwvYXV0aGVudGljYXRvci54bWwKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvU3luY0FjY291bnRBY2Nlc3NTdHVicy9zcmMvY29tL2FuZHJvaWQvY3RzL3N0dWIvU3R1YkF1dGhlbnRpY2F0b3IuamF2YSBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvU3luY0FjY291bnRBY2Nlc3NTdHVicy9zcmMvY29tL2FuZHJvaWQvY3RzL3N0dWIvU3R1YkF1dGhlbnRpY2F0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjc1ZmE5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvY29udGVudC9TeW5jQWNjb3VudEFjY2Vzc1N0dWJzL3NyYy9jb20vYW5kcm9pZC9jdHMvc3R1Yi9TdHViQXV0aGVudGljYXRvci5qYXZhCkBAIC0wLDAgKzEsMTI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5jdHMuc3R1YjsKKworaW1wb3J0IGFuZHJvaWQuYWNjb3VudHMuQWJzdHJhY3RBY2NvdW50QXV0aGVudGljYXRvcjsKK2ltcG9ydCBhbmRyb2lkLmFjY291bnRzLkFjY291bnQ7CitpbXBvcnQgYW5kcm9pZC5hY2NvdW50cy5BY2NvdW50QXV0aGVudGljYXRvclJlc3BvbnNlOworaW1wb3J0IGFuZHJvaWQuYWNjb3VudHMuQWNjb3VudE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5hY2NvdW50cy5OZXR3b3JrRXJyb3JFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5hcHAuU2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKKworcHVibGljIGNsYXNzIFN0dWJBdXRoZW50aWNhdG9yIGV4dGVuZHMgU2VydmljZSB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9LRU5fVFlQRV9SRU1PVkVfQUNDT1VOVFMgPSAiVE9LRU5fVFlQRV9SRU1PVkVfQUNDT1VOVFMiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBzTnVtQWNjb3VudHNBZGRlZDsKKyAgICBwcml2YXRlIEF1dGhlbnRpY2F0b3IgbUF1dGhlbnRpY2F0b3I7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZSgpIHsKKyAgICAgICAgbUF1dGhlbnRpY2F0b3IgPSBuZXcgQXV0aGVudGljYXRvcih0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSUJpbmRlciBvbkJpbmQoSW50ZW50IGludGVudCkgeworICAgICAgICByZXR1cm4gbUF1dGhlbnRpY2F0b3IuZ2V0SUJpbmRlcigpOworICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBBdXRoZW50aWNhdG9yIGV4dGVuZHMgQWJzdHJhY3RBY2NvdW50QXV0aGVudGljYXRvciB7CisgICAgICAgIHB1YmxpYyBBdXRoZW50aWNhdG9yKENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgICAgICByZW1vdmVBY2NvdW50cygpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCdW5kbGUgZWRpdFByb3BlcnRpZXMoQWNjb3VudEF1dGhlbnRpY2F0b3JSZXNwb25zZSByZXNwb25zZSwKKyAgICAgICAgICAgICAgICBTdHJpbmcgYWNjb3VudFR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCdW5kbGUgYWRkQWNjb3VudChBY2NvdW50QXV0aGVudGljYXRvclJlc3BvbnNlIHJlc3BvbnNlLAorICAgICAgICAgICAgICAgIFN0cmluZyBhY2NvdW50VHlwZSwgU3RyaW5nIHRva2VuVHlwZSwgU3RyaW5nW10gc3RyaW5ncywKKyAgICAgICAgICAgICAgICBCdW5kbGUgYnVuZGxlKSB0aHJvd3MgTmV0d29ya0Vycm9yRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIEFjY291bnRNYW5hZ2VyIGFjY291bnRNYW5hZ2VyID0gZ2V0U3lzdGVtU2VydmljZShBY2NvdW50TWFuYWdlci5jbGFzcyk7CisKKyAgICAgICAgICAgIFN0cmluZyBhY2NvdW50TmFtZSA9ICJmb28iICsgc051bUFjY291bnRzQWRkZWQ7CisgICAgICAgICAgICBzTnVtQWNjb3VudHNBZGRlZCsrOworCisgICAgICAgICAgICBhY2NvdW50TWFuYWdlci5hZGRBY2NvdW50RXhwbGljaXRseShuZXcgQWNjb3VudChhY2NvdW50TmFtZSwgYWNjb3VudFR5cGUpLCAiYmFyIiwgbnVsbCk7CisKKyAgICAgICAgICAgIEJ1bmRsZSByZXN1bHQgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgICAgICByZXN1bHQucHV0U3RyaW5nKEFjY291bnRNYW5hZ2VyLktFWV9BQ0NPVU5UX05BTUUsIGFjY291bnROYW1lKTsKKyAgICAgICAgICAgIHJlc3VsdC5wdXRTdHJpbmcoQWNjb3VudE1hbmFnZXIuS0VZX0FDQ09VTlRfVFlQRSwgYWNjb3VudFR5cGUpOworICAgICAgICAgICAgcmVzcG9uc2Uub25SZXN1bHQocmVzdWx0KTsKKworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJ1bmRsZSBjb25maXJtQ3JlZGVudGlhbHMoQWNjb3VudEF1dGhlbnRpY2F0b3JSZXNwb25zZSByZXNwb25zZSwKKyAgICAgICAgICAgICAgICBBY2NvdW50IGFjY291bnQsIEJ1bmRsZSBidW5kbGUpIHRocm93cyBOZXR3b3JrRXJyb3JFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJ1bmRsZSBnZXRBdXRoVG9rZW4oQWNjb3VudEF1dGhlbnRpY2F0b3JSZXNwb25zZSByZXNwb25zZSwKKyAgICAgICAgICAgICAgICBBY2NvdW50IGFjY291bnQsIFN0cmluZyB0eXBlLCBCdW5kbGUgYnVuZGxlKSB0aHJvd3MgTmV0d29ya0Vycm9yRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChUT0tFTl9UWVBFX1JFTU9WRV9BQ0NPVU5UUy5lcXVhbHModHlwZSkpIHsKKyAgICAgICAgICAgICAgICByZW1vdmVBY2NvdW50cygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRBdXRoVG9rZW5MYWJlbChTdHJpbmcgdG9rZW5OYW1lKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQnVuZGxlIHVwZGF0ZUNyZWRlbnRpYWxzKEFjY291bnRBdXRoZW50aWNhdG9yUmVzcG9uc2UgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgQWNjb3VudCBhY2NvdW50LCBTdHJpbmcgdG9rZW5UeXBlLCBCdW5kbGUgYnVuZGxlKQorICAgICAgICAgICAgICAgIHRocm93cyBOZXR3b3JrRXJyb3JFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJ1bmRsZSBoYXNGZWF0dXJlcyhBY2NvdW50QXV0aGVudGljYXRvclJlc3BvbnNlIHJlc3BvbnNlLAorICAgICAgICAgICAgICAgIEFjY291bnQgYWNjb3VudCwgU3RyaW5nW10gb3B0aW9ucykgdGhyb3dzIE5ldHdvcmtFcnJvckV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQnVuZGxlIGdldEFjY291bnRSZW1vdmFsQWxsb3dlZChBY2NvdW50QXV0aGVudGljYXRvclJlc3BvbnNlIHJlc3BvbnNlLAorICAgICAgICAgICAgICAgIEFjY291bnQgYWNjb3VudCkgdGhyb3dzIE5ldHdvcmtFcnJvckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBCdW5kbGUgcmVzdWx0ID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgcmVzdWx0LnB1dEJvb2xlYW4oQWNjb3VudE1hbmFnZXIuS0VZX0JPT0xFQU5fUkVTVUxULCB0cnVlKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgcmVtb3ZlQWNjb3VudHMoKSB7CisgICAgICAgICAgICBBY2NvdW50TWFuYWdlciBhY2NvdW50TWFuYWdlciA9IGdldFN5c3RlbVNlcnZpY2UoQWNjb3VudE1hbmFnZXIuY2xhc3MpOworICAgICAgICAgICAgZm9yIChBY2NvdW50IGFjY291bnQgOiBhY2NvdW50TWFuYWdlci5nZXRBY2NvdW50cygpKSB7CisgICAgICAgICAgICAgICAgYWNjb3VudE1hbmFnZXIucmVtb3ZlQWNjb3VudEV4cGxpY2l0bHkoYWNjb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ob3N0c2lkZXRlc3RzL2NvbnRlbnQvdGVzdC1hcHBzL1N5bmNBY2NvdW50QWNjZXNzU3R1YnMvc3JjL2NvbS9hbmRyb2lkL2N0cy9zdHViL1N0dWJQcm92aWRlci5qYXZhIGIvdGVzdHMvdGVzdHMvY29udGVudC9TeW5jQWNjb3VudEFjY2Vzc1N0dWJzL3NyYy9jb20vYW5kcm9pZC9jdHMvc3R1Yi9TdHViUHJvdmlkZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaG9zdHNpZGV0ZXN0cy9jb250ZW50L3Rlc3QtYXBwcy9TeW5jQWNjb3VudEFjY2Vzc1N0dWJzL3NyYy9jb20vYW5kcm9pZC9jdHMvc3R1Yi9TdHViUHJvdmlkZXIuamF2YQpyZW5hbWUgdG8gdGVzdHMvdGVzdHMvY29udGVudC9TeW5jQWNjb3VudEFjY2Vzc1N0dWJzL3NyYy9jb20vYW5kcm9pZC9jdHMvc3R1Yi9TdHViUHJvdmlkZXIuamF2YQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvY29udGVudC9TeW5jQWNjb3VudEFjY2Vzc1N0dWJzL3NyYy9jb20vYW5kcm9pZC9jdHMvc3R1Yi9TdHViUHJvdmlkZXIyLmphdmEgYi90ZXN0cy90ZXN0cy9jb250ZW50L1N5bmNBY2NvdW50QWNjZXNzU3R1YnMvc3JjL2NvbS9hbmRyb2lkL2N0cy9zdHViL1N0dWJQcm92aWRlcjIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWNiMjNiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvY29udGVudC9TeW5jQWNjb3VudEFjY2Vzc1N0dWJzL3NyYy9jb20vYW5kcm9pZC9jdHMvc3R1Yi9TdHViUHJvdmlkZXIyLmphdmEKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY3RzLnN0dWI7CisKK3B1YmxpYyBjbGFzcyBTdHViUHJvdmlkZXIyIGV4dGVuZHMgU3R1YlByb3ZpZGVyIHsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvYXNzZXRzL3N1YmRpci9zdWJkaXJfdGV4dC50eHQgYi90ZXN0cy90ZXN0cy9jb250ZW50L2Fzc2V0cy9zdWJkaXIvc3ViZGlyX3RleHQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMDM0YTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9jb250ZW50L2Fzc2V0cy9zdWJkaXIvc3ViZGlyX3RleHQudHh0CkBAIC0wLDAgKzEgQEAKK3N1YmRpcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvY29udGVudC9mb250c19yZWFkbWUudHh0IGIvdGVzdHMvdGVzdHMvY29udGVudC9mb250c19yZWFkbWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwZGU1NzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9jb250ZW50L2ZvbnRzX3JlYWRtZS50eHQKQEAgLTAsMCArMSwxNSBAQAorQWxsIGZvbnRzIGluY2x1ZGVkIGluIHRoaXMgcHJvamVjdCBmb2xsb3cgdGhlIGJlbG93IGNvcHlyaWdodCBhbmQgbGljZW5zaW5nOgorCitDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCitMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKK3lvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK1lvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvam5pL0FuZHJvaWQubWsgYi90ZXN0cy90ZXN0cy9jb250ZW50L2puaS9BbmRyb2lkLm1rCmluZGV4IDQ3MzdiMzUuLjNiMTRiNmYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvam5pL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvdGVzdHMvY29udGVudC9qbmkvQW5kcm9pZC5tawpAQCAtMjUsNiArMjUsOCBAQAogCiBMT0NBTF9DX0lOQ0xVREVTIDo9ICQoSk5JX0hfSU5DTFVERSkKIAorTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IgLVduby1wb2ludGVyLWFyaXRoIC1Xbm8tdW51c2VkLXBhcmFtZXRlcgorCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYm5hdGl2ZWhlbHBlcl9jb21wYXRfbGliYysrIGxpYmxvZwogTE9DQUxfQ1hYX1NUTCA6PSBsaWJjKytfc3RhdGljCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9jb250ZW50L2xpYi9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvY29udGVudC9saWIvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWFhNmFjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvY29udGVudC9saWIvQW5kcm9pZC5tawpAQCAtMCwwICsxLDE3IEBACisjIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvY29udGVudC9saWIvYWNjb3VudGFjY2Vzcy9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvY29udGVudC9saWIvYWNjb3VudGFjY2Vzcy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNGViNDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9jb250ZW50L2xpYi9hY2NvdW50YWNjZXNzL0FuZHJvaWQubWsKQEAgLTAsMCArMSwyOSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCisKK0xPQ0FMX01PRFVMRSA6PSBhY2NvdW50YWNjZXNzbGliCisKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBtb2NraXRvLXRhcmdldCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWItdWlhdXRvbWF0b3IgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0CisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfSkFWQV9MSUJSQVJZKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvbGliL2FjY291bnRhY2Nlc3Mvc3JjL2NvbS5hbmRyb2lkLmN0cy5jb250ZW50L0Fsd2F5c1N5bmNhYmxlU3luY1NlcnZpY2UuamF2YSBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvbGliL2FjY291bnRhY2Nlc3Mvc3JjL2NvbS5hbmRyb2lkLmN0cy5jb250ZW50L0Fsd2F5c1N5bmNhYmxlU3luY1NlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGM0OTZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvY29udGVudC9saWIvYWNjb3VudGFjY2Vzcy9zcmMvY29tLmFuZHJvaWQuY3RzLmNvbnRlbnQvQWx3YXlzU3luY2FibGVTeW5jU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5jdHMuY29udGVudDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLlNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CisKK3B1YmxpYyBjbGFzcyBBbHdheXNTeW5jYWJsZVN5bmNTZXJ2aWNlIGV4dGVuZHMgU2VydmljZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IHNMb2NrID0gbmV3IE9iamVjdCgpOworICAgIHByaXZhdGUgc3RhdGljIFN5bmNBZGFwdGVyIHNJbnN0YW5jZTsKKworICAgIHB1YmxpYyBzdGF0aWMgU3luY0FkYXB0ZXIgZ2V0SW5zdGFuY2UoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN5bmNocm9uaXplZCAoc0xvY2spIHsKKyAgICAgICAgICAgIGlmIChzSW5zdGFuY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNJbnN0YW5jZSA9IG5ldyBTeW5jQWRhcHRlcihjb250ZXh0LmdldEFwcGxpY2F0aW9uQ29udGV4dCgpLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc0luc3RhbmNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJQmluZGVyIG9uQmluZChJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIHJldHVybiBnZXRJbnN0YW5jZSh0aGlzKS5nZXRTeW5jQWRhcHRlckJpbmRlcigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvbGliL2FjY291bnRhY2Nlc3Mvc3JjL2NvbS5hbmRyb2lkLmN0cy5jb250ZW50L0ZsYWt5VGVzdFJ1bGUuamF2YSBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvbGliL2FjY291bnRhY2Nlc3Mvc3JjL2NvbS5hbmRyb2lkLmN0cy5jb250ZW50L0ZsYWt5VGVzdFJ1bGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDQxYWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvY29udGVudC9saWIvYWNjb3VudGFjY2Vzcy9zcmMvY29tLmFuZHJvaWQuY3RzLmNvbnRlbnQvRmxha3lUZXN0UnVsZS5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5jdHMuY29udGVudDsKKworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVzdFJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5EZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5tb2RlbC5TdGF0ZW1lbnQ7CisKKy8qKgorICogUnVsZSBmb3IgcnVubmluZyBmbGFreSB0ZXN0cyB0aGF0IHJ1bnMgdGhlIHRlc3QgdXAgdG8gYXR0ZW1wdAorICogY291bnQgYW5kIGlmIG9uZSBydW4gc3VjY2VlZHMgcmVwb3J0cyB0aGUgdGVzdHMgYXMgcGFzc2luZy4KKyAqLworLy8gVE9ETzogTW92ZSB0aGlzIHB1cHB5IGluIGEgY29tbW9uIHBsYWNlLCBzbyBwcGwgY2FuIHVzZSBpdC4KK3B1YmxpYyBjbGFzcyBGbGFreVRlc3RSdWxlIGltcGxlbWVudHMgVGVzdFJ1bGUgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gRmxha3lUZXN0UnVsZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7CisKKyAgICBwcml2YXRlIGZpbmFsIGludCBtQXR0ZW1wdENvdW50OworCisgICAgcHVibGljIEZsYWt5VGVzdFJ1bGUoaW50IGF0dGVtcHRDb3VudCkgeworICAgICAgICBtQXR0ZW1wdENvdW50ID0gYXR0ZW1wdENvdW50OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdGF0ZW1lbnQgYXBwbHkoU3RhdGVtZW50IHN0YXRlbWVudCwgRGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdGF0ZW1lbnQoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGV2YWx1YXRlKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgICAgICAgICAgVGhyb3dhYmxlIHRocm93YWJsZSA9IG51bGw7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtQXR0ZW1wdENvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudC5ldmFsdWF0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlRlc3QgZmFpbGVkICIsIHQpOworCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd2FibGUgPSB0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRocm93IHRocm93YWJsZTsKKyAgICAgICAgICAgIH07CisgICAgICAgIH07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvY29udGVudC9saWIvYWNjb3VudGFjY2Vzcy9zcmMvY29tLmFuZHJvaWQuY3RzLmNvbnRlbnQvTm90QWx3YXlzU3luY2FibGVTeW5jU2VydmljZS5qYXZhIGIvdGVzdHMvdGVzdHMvY29udGVudC9saWIvYWNjb3VudGFjY2Vzcy9zcmMvY29tLmFuZHJvaWQuY3RzLmNvbnRlbnQvTm90QWx3YXlzU3luY2FibGVTeW5jU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NTI0Y2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9jb250ZW50L2xpYi9hY2NvdW50YWNjZXNzL3NyYy9jb20uYW5kcm9pZC5jdHMuY29udGVudC9Ob3RBbHdheXNTeW5jYWJsZVN5bmNTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5jb250ZW50OworCitpbXBvcnQgYW5kcm9pZC5hcHAuU2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKKworcHVibGljIGNsYXNzIE5vdEFsd2F5c1N5bmNhYmxlU3luY1NlcnZpY2UgZXh0ZW5kcyBTZXJ2aWNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3Qgc0xvY2sgPSBuZXcgT2JqZWN0KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgU3luY0FkYXB0ZXIgc0luc3RhbmNlOworCisgICAgcHVibGljIHN0YXRpYyBTeW5jQWRhcHRlciBnZXRJbnN0YW5jZShDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChzTG9jaykgeworICAgICAgICAgICAgaWYgKHNJbnN0YW5jZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgc0luc3RhbmNlID0gbmV3IFN5bmNBZGFwdGVyKGNvbnRleHQuZ2V0QXBwbGljYXRpb25Db250ZXh0KCksIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzSW5zdGFuY2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElCaW5kZXIgb25CaW5kKEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgcmV0dXJuIGdldEluc3RhbmNlKHRoaXMpLmdldFN5bmNBZGFwdGVyQmluZGVyKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9jb250ZW50L3Rlc3QtYXBwcy9DdHNTeW5jQWNjb3VudEFjY2Vzc1NhbWVDZXJ0VGVzdHMvc3JjL2NvbS9hbmRyb2lkL2N0cy9jb250ZW50L1N0dWJBY3Rpdml0eS5qYXZhIGIvdGVzdHMvdGVzdHMvY29udGVudC9saWIvYWNjb3VudGFjY2Vzcy9zcmMvY29tLmFuZHJvaWQuY3RzLmNvbnRlbnQvU3R1YkFjdGl2aXR5LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGhvc3RzaWRldGVzdHMvY29udGVudC90ZXN0LWFwcHMvQ3RzU3luY0FjY291bnRBY2Nlc3NTYW1lQ2VydFRlc3RzL3NyYy9jb20vYW5kcm9pZC9jdHMvY29udGVudC9TdHViQWN0aXZpdHkuamF2YQpyZW5hbWUgdG8gdGVzdHMvdGVzdHMvY29udGVudC9saWIvYWNjb3VudGFjY2Vzcy9zcmMvY29tLmFuZHJvaWQuY3RzLmNvbnRlbnQvU3R1YkFjdGl2aXR5LmphdmEKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvbGliL2FjY291bnRhY2Nlc3Mvc3JjL2NvbS5hbmRyb2lkLmN0cy5jb250ZW50L1N5bmNBZGFwdGVyLmphdmEgYi90ZXN0cy90ZXN0cy9jb250ZW50L2xpYi9hY2NvdW50YWNjZXNzL3NyYy9jb20uYW5kcm9pZC5jdHMuY29udGVudC9TeW5jQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MWQ2Y2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9jb250ZW50L2xpYi9hY2NvdW50YWNjZXNzL3NyYy9jb20uYW5kcm9pZC5jdHMuY29udGVudC9TeW5jQWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5jb250ZW50OworCitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ubW9jazsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by53aGVuOworCitpbXBvcnQgYW5kcm9pZC5hY2NvdW50cy5BY2NvdW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5BYnN0cmFjdFRocmVhZGVkU3luY0FkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlckNsaWVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU3luY1Jlc3VsdDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKKworcHVibGljIGNsYXNzIFN5bmNBZGFwdGVyIGV4dGVuZHMgQWJzdHJhY3RUaHJlYWRlZFN5bmNBZGFwdGVyIHsKKyAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtTG9jayA9IG5ldyBPYmplY3QoKTsKKyAgICBwcml2YXRlIEFic3RyYWN0VGhyZWFkZWRTeW5jQWRhcHRlciBtRGVsZWdhdGU7CisKKyAgICBwdWJsaWMgQWJzdHJhY3RUaHJlYWRlZFN5bmNBZGFwdGVyIHNldE5ld0RlbGVnYXRlKCkgeworICAgICAgICBBYnN0cmFjdFRocmVhZGVkU3luY0FkYXB0ZXIgZGVsZWdhdGUgPSBtb2NrKEFic3RyYWN0VGhyZWFkZWRTeW5jQWRhcHRlci5jbGFzcyk7CisgICAgICAgIHdoZW4oZGVsZWdhdGUub25VbnN5bmNhYmxlQWNjb3VudCgpKS50aGVuQ2FsbFJlYWxNZXRob2QoKTsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBtRGVsZWdhdGUgPSBkZWxlZ2F0ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBkZWxlZ2F0ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3luY0FkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBib29sZWFuIGF1dG9Jbml0aWFsaXplKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF1dG9Jbml0aWFsaXplKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEFic3RyYWN0VGhyZWFkZWRTeW5jQWRhcHRlciBnZXRDb3B5T2ZEZWxlZ2F0ZSgpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgcmV0dXJuIG1EZWxlZ2F0ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uUGVyZm9ybVN5bmMoQWNjb3VudCBhY2NvdW50LCBCdW5kbGUgZXh0cmFzLCBTdHJpbmcgYXV0aG9yaXR5LAorICAgICAgICAgICAgQ29udGVudFByb3ZpZGVyQ2xpZW50IHByb3ZpZGVyLCBTeW5jUmVzdWx0IHN5bmNSZXN1bHQpIHsKKyAgICAgICAgQWJzdHJhY3RUaHJlYWRlZFN5bmNBZGFwdGVyIGRlbGVnYXRlID0gZ2V0Q29weU9mRGVsZWdhdGUoKTsKKworICAgICAgICBpZiAoZGVsZWdhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgZGVsZWdhdGUub25QZXJmb3JtU3luYyhhY2NvdW50LCBleHRyYXMsIGF1dGhvcml0eSwgcHJvdmlkZXIsIHN5bmNSZXN1bHQpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25VbnN5bmNhYmxlQWNjb3VudCgpIHsKKyAgICAgICAgQWJzdHJhY3RUaHJlYWRlZFN5bmNBZGFwdGVyIGRlbGVnYXRlID0gZ2V0Q29weU9mRGVsZWdhdGUoKTsKKworICAgICAgICBpZiAoZGVsZWdhdGUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUub25VbnN5bmNhYmxlQWNjb3VudCgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvY29udGVudC9saWIvYWNjb3VudGFjY2Vzcy9zcmMvY29tLmFuZHJvaWQuY3RzLmNvbnRlbnQvVXRpbHMuamF2YSBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvbGliL2FjY291bnRhY2Nlc3Mvc3JjL2NvbS5hbmRyb2lkLmN0cy5jb250ZW50L1V0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE4NTgzMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvbGliL2FjY291bnRhY2Nlc3Mvc3JjL2NvbS5hbmRyb2lkLmN0cy5jb250ZW50L1V0aWxzLmphdmEKQEAgLTAsMCArMSwxMzMgQEAKK3BhY2thZ2UgY29tLmFuZHJvaWQuY3RzLmNvbnRlbnQ7CisKK2ltcG9ydCBhbmRyb2lkLmFjY291bnRzLkFjY291bnQ7CitpbXBvcnQgYW5kcm9pZC5hY2NvdW50cy5BY2NvdW50TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmFjY291bnRzLkF1dGhlbnRpY2F0b3JFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5hY2NvdW50cy5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5TeW5jUmVxdWVzdDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQubmV0LkNvbm5lY3Rpdml0eU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0luZm87CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QudWlhdXRvbWF0b3IuVWlEZXZpY2U7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTm9uTnVsbDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworCitpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5TeXN0ZW1VdGlsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworcHVibGljIGNsYXNzIFV0aWxzIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9IFV0aWxzLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBTWU5DX1RJTUVPVVRfTUlMTElTID0gMjAwMDA7IC8vIDIwIHNlYworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPS0VOX1RZUEVfUkVNT1ZFX0FDQ09VTlRTID0gIlRPS0VOX1RZUEVfUkVNT1ZFX0FDQ09VTlRTIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5DX0FDQ09VTlRfVFlQRSA9ICJjb20uc3R1YiI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxXQVlTX1NZTkNBQkxFX0FVVEhPUklUWSA9ICJjb20uYW5kcm9pZC5jdHMuc3R1Yi5wcm92aWRlciI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9UX0FMV0FZU19TWU5DQUJMRV9BVVRIT1JJVFkgPSAiY29tLmFuZHJvaWQuY3RzLnN0dWIucHJvdmlkZXIyIjsKKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNEYXRhQ29ubmVjdGlvbigpIHsKKyAgICAgICAgQ29ubmVjdGl2aXR5TWFuYWdlciBjb25uZWN0aXZpdHlNYW5hZ2VyID0gZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoCisgICAgICAgICAgICAgICAgQ29ubmVjdGl2aXR5TWFuYWdlci5jbGFzcyk7CisgICAgICAgIE5ldHdvcmtJbmZvIGFjdGl2ZU5ldHdvcmsgPSBjb25uZWN0aXZpdHlNYW5hZ2VyLmdldEFjdGl2ZU5ldHdvcmtJbmZvKCk7CisgICAgICAgIHJldHVybiBhY3RpdmVOZXR3b3JrICE9IG51bGwgJiYgYWN0aXZlTmV0d29yay5pc0Nvbm5lY3RlZE9yQ29ubmVjdGluZygpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNOb3RpZmljYXRpb25TdXBwb3J0KCkgeworICAgICAgICByZXR1cm4gIWdldENvbnRleHQoKS5nZXRQYWNrYWdlTWFuYWdlcigpCisgICAgICAgICAgICAgICAgLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9MRUFOQkFDSyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBDb250ZXh0IGdldENvbnRleHQoKSB7CisgICAgICAgIHJldHVybiBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKS5nZXRDb250ZXh0KCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzV2F0Y2goKSB7CisgICAgICAgIHJldHVybiAoZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLmdldENvbmZpZ3VyYXRpb24oKS51aU1vZGUKKyAgICAgICAgICAgICAgICAmIENvbmZpZ3VyYXRpb24uVUlfTU9ERV9UWVBFX01BU0spID09IENvbmZpZ3VyYXRpb24uVUlfTU9ERV9UWVBFX1dBVENIOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgVWlEZXZpY2UgZ2V0VWlEZXZpY2UoKSB7CisgICAgICAgIHJldHVybiBVaURldmljZS5nZXRJbnN0YW5jZShJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHdhaXRGb3JTeW5jTWFuYWdlckFjY291bnRDaGFuZ2VVcGRhdGUoKSB7CisgICAgICAgIC8vIFdhaXQgZm9yIHRoZSBzeW5jIG1hbmFnZXIgdG8gYmUgbm90aWZpZWQgZm9yIHRoZSBuZXcgYWNjb3VudC4KKyAgICAgICAgLy8gVW5mb3J0dW5hdGVseSwgdGhlcmUgaXMgbm8gd2F5IHRvIGRldGVjdCB0aGlzIGV2ZW50LCBzaWdoLi4uCisgICAgICAgIFN5c3RlbUNsb2NrLnNsZWVwKFNZTkNfVElNRU9VVF9NSUxMSVMpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhbGxvd1N5bmNBZGFwdGVyUnVuSW5CYWNrZ3JvdW5kQW5kRGF0YUluQmFja2dyb3VuZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIEFsbG93IHVzIHRvIHJ1biBpbiB0aGUgYmFja2dyb3VuZAorICAgICAgICBTeXN0ZW1VdGlsLnJ1blNoZWxsQ29tbWFuZChJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKSwKKyAgICAgICAgICAgICAgICAiY21kIGRldmljZWlkbGUgd2hpdGVsaXN0ICsiICsgZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VOYW1lKCkpOworICAgICAgICAvLyBBbGxvdyB1cyB0byB1c2UgZGF0YSBpbiB0aGUgYmFja2dyb3VuZAorICAgICAgICBTeXN0ZW1VdGlsLnJ1blNoZWxsQ29tbWFuZChJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKSwKKyAgICAgICAgICAgICAgICAiY21kIG5ldHBvbGljeSBhZGQgcmVzdHJpY3QtYmFja2dyb3VuZC13aGl0ZWxpc3QgIiArIFByb2Nlc3MubXlVaWQoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyAgdm9pZCBkaXNhbGxvd1N5bmNBZGFwdGVyUnVuSW5CYWNrZ3JvdW5kQW5kRGF0YUluQmFja2dyb3VuZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIEFsbG93IHVzIHRvIHJ1biBpbiB0aGUgYmFja2dyb3VuZAorICAgICAgICBTeXN0ZW1VdGlsLnJ1blNoZWxsQ29tbWFuZChJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKSwKKyAgICAgICAgICAgICAgICAiY21kIGRldmljZWlkbGUgd2hpdGVsaXN0IC0iICsgZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VOYW1lKCkpOworICAgICAgICAvLyBBbGxvdyB1cyB0byB1c2UgZGF0YSBpbiB0aGUgYmFja2dyb3VuZAorICAgICAgICBTeXN0ZW1VdGlsLnJ1blNoZWxsQ29tbWFuZChJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKSwKKyAgICAgICAgICAgICAgICAiY21kIG5ldHBvbGljeSByZW1vdmUgcmVzdHJpY3QtYmFja2dyb3VuZC13aGl0ZWxpc3QgIiArIFByb2Nlc3MubXlVaWQoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDbG9zYWJsZUFjY291bnQgaW1wbGVtZW50cyBBdXRvQ2xvc2VhYmxlIHsKKyAgICAgICAgcHVibGljIGZpbmFsIEFjY291bnQgYWNjb3VudDsKKworICAgICAgICBwcml2YXRlIENsb3NhYmxlQWNjb3VudChATm9uTnVsbCBBY2NvdW50IGFjY291bnQpIHsKKyAgICAgICAgICAgIHRoaXMuYWNjb3VudCA9IGFjY291bnQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIEFjY291bnRNYW5hZ2VyIGFjY291bnRNYW5hZ2VyID0gZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoQWNjb3VudE1hbmFnZXIuY2xhc3MpOworCisgICAgICAgICAgICBhY2NvdW50TWFuYWdlci5nZXRBdXRoVG9rZW4oYWNjb3VudCwgVE9LRU5fVFlQRV9SRU1PVkVfQUNDT1VOVFMsIG51bGwsIGZhbHNlLCBudWxsLAorICAgICAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQ2xvc2FibGVBY2NvdW50IHdpdGhBY2NvdW50KEBOb25OdWxsIEFjdGl2aXR5IGFjdGl2aXR5KQorICAgICAgICAgICAgdGhyb3dzIEF1dGhlbnRpY2F0b3JFeGNlcHRpb24sIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEFjY291bnRNYW5hZ2VyIGFjY291bnRNYW5hZ2VyID0gZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoQWNjb3VudE1hbmFnZXIuY2xhc3MpOworICAgICAgICBCdW5kbGUgcmVzdWx0ID0gYWNjb3VudE1hbmFnZXIuYWRkQWNjb3VudChTWU5DX0FDQ09VTlRfVFlQRSwgbnVsbCwgbnVsbCwgbnVsbCwKKyAgICAgICAgICAgICAgICBhY3Rpdml0eSwgbnVsbCwgbnVsbCkuZ2V0UmVzdWx0KCk7CisgICAgICAgIEFjY291bnQgYWRkZWRBY2NvdW50ID0gbmV3IEFjY291bnQoCisgICAgICAgICAgICAgICAgcmVzdWx0LmdldFN0cmluZyhBY2NvdW50TWFuYWdlci5LRVlfQUNDT1VOVF9OQU1FKSwKKyAgICAgICAgICAgICAgICByZXN1bHQuZ2V0U3RyaW5nKEFjY291bnRNYW5hZ2VyLktFWV9BQ0NPVU5UX1RZUEUpKTsKKyAgICAgICAgTG9nLmkoTE9HX1RBRywgIkFkZGVkIGFjY291bnQgIiArIGFkZGVkQWNjb3VudCk7CisKKyAgICAgICAgd2FpdEZvclN5bmNNYW5hZ2VyQWNjb3VudENoYW5nZVVwZGF0ZSgpOworCisgICAgICAgIHJldHVybiBuZXcgQ2xvc2FibGVBY2NvdW50KGFkZGVkQWNjb3VudCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTeW5jUmVxdWVzdCByZXF1ZXN0U3luYyhTdHJpbmcgYXV0aG9yaXR5KSB7CisgICAgICAgIEJ1bmRsZSBleHRyYXMgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgIGV4dHJhcy5wdXRCb29sZWFuKENvbnRlbnRSZXNvbHZlci5TWU5DX0VYVFJBU19ET19OT1RfUkVUUlksIHRydWUpOworICAgICAgICBleHRyYXMucHV0Qm9vbGVhbihDb250ZW50UmVzb2x2ZXIuU1lOQ19FWFRSQVNfUFJJT1JJVFksIHRydWUpOworICAgICAgICBleHRyYXMuZ2V0Qm9vbGVhbihDb250ZW50UmVzb2x2ZXIuU1lOQ19FWFRSQVNfSUdOT1JFX1NFVFRJTkdTLCB0cnVlKTsKKyAgICAgICAgU3luY1JlcXVlc3QgcmVxdWVzdCA9IG5ldyBTeW5jUmVxdWVzdC5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0U3luY0FkYXB0ZXIobnVsbCwgYXV0aG9yaXR5KQorICAgICAgICAgICAgICAgIC5zeW5jT25jZSgpCisgICAgICAgICAgICAgICAgLnNldEV4dHJhcyhleHRyYXMpCisgICAgICAgICAgICAgICAgLnNldEV4cGVkaXRlZCh0cnVlKQorICAgICAgICAgICAgICAgIC5zZXRNYW51YWwodHJ1ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgQ29udGVudFJlc29sdmVyLnJlcXVlc3RTeW5jKHJlcXVlc3QpOworCisgICAgICAgIHJldHVybiByZXF1ZXN0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvcmVzL2RyYXdhYmxlL2Zha2VfaW1hZ2Vfd2lsbF9ub3RfZGVjb2RlLmpwZyBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvcmVzL2RyYXdhYmxlL2Zha2VfaW1hZ2Vfd2lsbF9ub3RfZGVjb2RlLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmY3NTMxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvY29udGVudC9yZXMvZHJhd2FibGUvZmFrZV9pbWFnZV93aWxsX25vdF9kZWNvZGUuanBnCkBAIC0wLDAgKzEgQEAKK2xvbCBub3QgYSBqcGcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9jb250ZW50L3Jlcy9mb250L3NhbXBsZV9mb250X2NvbGxlY3Rpb24udHRjIGIvdGVzdHMvdGVzdHMvY29udGVudC9yZXMvZm9udC9zYW1wbGVfZm9udF9jb2xsZWN0aW9uLnR0YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjUyZjNkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvY29udGVudC9yZXMvZm9udC9zYW1wbGVfZm9udF9jb2xsZWN0aW9uLnR0YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9jb250ZW50L3Jlcy9mb250L3NhbXBsZV90dGNfZmFtaWx5LnhtbCBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvcmVzL2ZvbnQvc2FtcGxlX3R0Y19mYW1pbHkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlOWI2M2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9jb250ZW50L3Jlcy9mb250L3NhbXBsZV90dGNfZmFtaWx5LnhtbApAQCAtMCwwICsxLDUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8Zm9udC1mYW1pbHkgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8Zm9udCBhbmRyb2lkOmZvbnRTdHlsZT0ibm9ybWFsIiBhbmRyb2lkOmZvbnQ9IkBmb250L3NhbXBsZV9mb250X2NvbGxlY3Rpb24iIGFuZHJvaWQ6dHRjSW5kZXg9IjAiIC8+CisgICAgPGZvbnQgYW5kcm9pZDpmb250U3R5bGU9Iml0YWxpYyIgYW5kcm9pZDpmb250PSJAZm9udC9zYW1wbGVfZm9udF9jb2xsZWN0aW9uIiBhbmRyb2lkOnR0Y0luZGV4PSIxIiAvPgorPC9mb250LWZhbWlseT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9jb250ZW50L3Jlcy9mb250L3NhbXBsZV92YXJpYXRpb25fc2V0dGluZ3NfZmFtaWx5MS54bWwgYi90ZXN0cy90ZXN0cy9jb250ZW50L3Jlcy9mb250L3NhbXBsZV92YXJpYXRpb25fc2V0dGluZ3NfZmFtaWx5MS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcxOWZhOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvcmVzL2ZvbnQvc2FtcGxlX3ZhcmlhdGlvbl9zZXR0aW5nc19mYW1pbHkxLnhtbApAQCAtMCwwICsxLDQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8Zm9udC1mYW1pbHkgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8Zm9udCBhbmRyb2lkOmZvbnQ9IkBmb250L3ZhcmlhYmxlX3dpZHRoX2Rhc2hfZm9udCIgYW5kcm9pZDpmb250VmFyaWF0aW9uU2V0dGluZ3M9Iid3ZHRoJyAxMDAuMCIgLz4KKzwvZm9udC1mYW1pbHk+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9jb250ZW50L3Jlcy9mb250L3NhbXBsZV92YXJpYXRpb25fc2V0dGluZ3NfZmFtaWx5Mi54bWwgYi90ZXN0cy90ZXN0cy9jb250ZW50L3Jlcy9mb250L3NhbXBsZV92YXJpYXRpb25fc2V0dGluZ3NfZmFtaWx5Mi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRkNGQ3OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvcmVzL2ZvbnQvc2FtcGxlX3ZhcmlhdGlvbl9zZXR0aW5nc19mYW1pbHkyLnhtbApAQCAtMCwwICsxLDQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8Zm9udC1mYW1pbHkgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8Zm9udCBhbmRyb2lkOmZvbnQ9IkBmb250L3ZhcmlhYmxlX3dpZHRoX2Rhc2hfZm9udCIgYW5kcm9pZDpmb250VmFyaWF0aW9uU2V0dGluZ3M9Iid3ZHRoJyA1MDAuMCIgLz4KKzwvZm9udC1mYW1pbHk+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9jb250ZW50L3Jlcy9mb250L3ZhcmlhYmxlX3dpZHRoX2Rhc2hfZm9udC50dGYgYi90ZXN0cy90ZXN0cy9jb250ZW50L3Jlcy9mb250L3ZhcmlhYmxlX3dpZHRoX2Rhc2hfZm9udC50dGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdhMjU2YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvcmVzL2ZvbnQvdmFyaWFibGVfd2lkdGhfZGFzaF9mb250LnR0ZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9jb250ZW50L3Jlcy9mb250L3ZhcmlhYmxlX3dpZHRoX2Rhc2hfZm9udF9zb3VyY2UudHR4IGIvdGVzdHMvdGVzdHMvY29udGVudC9yZXMvZm9udC92YXJpYWJsZV93aWR0aF9kYXNoX2ZvbnRfc291cmNlLnR0eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDFmZTBmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvY29udGVudC9yZXMvZm9udC92YXJpYWJsZV93aWR0aF9kYXNoX2ZvbnRfc291cmNlLnR0eApAQCAtMCwwICsxLDI0MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUworICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHR0Rm9udCBzZm50VmVyc2lvbj0iXHgwMFx4MDFceDAwXHgwMCIgdHRMaWJWZXJzaW9uPSIzLjkiPgorCisgIDxHbHlwaE9yZGVyPgorICAgIDwhLS0gVGhlICdpZCcgYXR0cmlidXRlIGlzIG9ubHkgZm9yIGh1bWFuczsgaXQgaXMgaWdub3JlZCB3aGVuIHBhcnNlZC4gLS0+CisgICAgPEdseXBoSUQgaWQ9IjAiIG5hbWU9Ii5ub3RkZWYiLz4KKyAgICA8R2x5cGhJRCBpZD0iMSIgbmFtZT0iZGFzaCIvPgorICA8L0dseXBoT3JkZXI+CisKKyAgPGhlYWQ+CisgICAgPCEtLSBNb3N0IG9mIHRoaXMgdGFibGUgd2lsbCBiZSByZWNhbGN1bGF0ZWQgYnkgdGhlIGNvbXBpbGVyIC0tPgorICAgIDx0YWJsZVZlcnNpb24gdmFsdWU9IjEuMCIvPgorICAgIDxmb250UmV2aXNpb24gdmFsdWU9IjEuMCIvPgorICAgIDxjaGVja1N1bUFkanVzdG1lbnQgdmFsdWU9IjB4ODFlZTczZGQiLz4KKyAgICA8bWFnaWNOdW1iZXIgdmFsdWU9IjB4NWYwZjNjZjUiLz4KKyAgICA8ZmxhZ3MgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDExIi8+CisgICAgPHVuaXRzUGVyRW0gdmFsdWU9IjEwMDAiLz4KKyAgICA8Y3JlYXRlZCB2YWx1ZT0iV2VkIFNlcCA5IDA4OjAxOjE3IDIwMTUiLz4KKyAgICA8bW9kaWZpZWQgdmFsdWU9IlRodSBNYXIgOSAyMjoyMjozMSAyMDE3Ii8+CisgICAgPHhNaW4gdmFsdWU9IjAiLz4KKyAgICA8eU1pbiB2YWx1ZT0iMCIvPgorICAgIDx4TWF4IHZhbHVlPSIwIi8+CisgICAgPHlNYXggdmFsdWU9IjAiLz4KKyAgICA8bWFjU3R5bGUgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIi8+CisgICAgPGxvd2VzdFJlY1BQRU0gdmFsdWU9IjciLz4KKyAgICA8Zm9udERpcmVjdGlvbkhpbnQgdmFsdWU9IjIiLz4KKyAgICA8aW5kZXhUb0xvY0Zvcm1hdCB2YWx1ZT0iMCIvPgorICAgIDxnbHlwaERhdGFGb3JtYXQgdmFsdWU9IjAiLz4KKyAgPC9oZWFkPgorCisgIDxoaGVhPgorICAgIDx0YWJsZVZlcnNpb24gdmFsdWU9IjB4MDAwMTAwMDAiLz4KKyAgICA8YXNjZW50IHZhbHVlPSIxMDAwIi8+CisgICAgPGRlc2NlbnQgdmFsdWU9Ii0yMDAiLz4KKyAgICA8bGluZUdhcCB2YWx1ZT0iMCIvPgorICAgIDxhZHZhbmNlV2lkdGhNYXggdmFsdWU9IjUwMCIvPgorICAgIDxtaW5MZWZ0U2lkZUJlYXJpbmcgdmFsdWU9IjAiLz4KKyAgICA8bWluUmlnaHRTaWRlQmVhcmluZyB2YWx1ZT0iMCIvPgorICAgIDx4TWF4RXh0ZW50IHZhbHVlPSIwIi8+CisgICAgPGNhcmV0U2xvcGVSaXNlIHZhbHVlPSIxIi8+CisgICAgPGNhcmV0U2xvcGVSdW4gdmFsdWU9IjAiLz4KKyAgICA8Y2FyZXRPZmZzZXQgdmFsdWU9IjAiLz4KKyAgICA8cmVzZXJ2ZWQwIHZhbHVlPSIwIi8+CisgICAgPHJlc2VydmVkMSB2YWx1ZT0iMCIvPgorICAgIDxyZXNlcnZlZDIgdmFsdWU9IjAiLz4KKyAgICA8cmVzZXJ2ZWQzIHZhbHVlPSIwIi8+CisgICAgPG1ldHJpY0RhdGFGb3JtYXQgdmFsdWU9IjAiLz4KKyAgICA8bnVtYmVyT2ZITWV0cmljcyB2YWx1ZT0iMSIvPgorICA8L2hoZWE+CisKKyAgPG1heHA+CisgICAgPCEtLSBNb3N0IG9mIHRoaXMgdGFibGUgd2lsbCBiZSByZWNhbGN1bGF0ZWQgYnkgdGhlIGNvbXBpbGVyIC0tPgorICAgIDx0YWJsZVZlcnNpb24gdmFsdWU9IjB4MTAwMDAiLz4KKyAgICA8bnVtR2x5cGhzIHZhbHVlPSIyIi8+CisgICAgPG1heFBvaW50cyB2YWx1ZT0iMCIvPgorICAgIDxtYXhDb250b3VycyB2YWx1ZT0iMCIvPgorICAgIDxtYXhDb21wb3NpdGVQb2ludHMgdmFsdWU9IjAiLz4KKyAgICA8bWF4Q29tcG9zaXRlQ29udG91cnMgdmFsdWU9IjAiLz4KKyAgICA8bWF4Wm9uZXMgdmFsdWU9IjIiLz4KKyAgICA8bWF4VHdpbGlnaHRQb2ludHMgdmFsdWU9IjEyIi8+CisgICAgPG1heFN0b3JhZ2UgdmFsdWU9IjI4Ii8+CisgICAgPG1heEZ1bmN0aW9uRGVmcyB2YWx1ZT0iMTE5Ii8+CisgICAgPG1heEluc3RydWN0aW9uRGVmcyB2YWx1ZT0iMCIvPgorICAgIDxtYXhTdGFja0VsZW1lbnRzIHZhbHVlPSI2MSIvPgorICAgIDxtYXhTaXplT2ZJbnN0cnVjdGlvbnMgdmFsdWU9IjI5NjciLz4KKyAgICA8bWF4Q29tcG9uZW50RWxlbWVudHMgdmFsdWU9IjAiLz4KKyAgICA8bWF4Q29tcG9uZW50RGVwdGggdmFsdWU9IjAiLz4KKyAgPC9tYXhwPgorCisgIDxPU18yPgorICAgIDwhLS0gVGhlIGZpZWxkcyAndXNGaXJzdENoYXJJbmRleCcgYW5kICd1c0xhc3RDaGFySW5kZXgnCisgICAgICAgICB3aWxsIGJlIHJlY2FsY3VsYXRlZCBieSB0aGUgY29tcGlsZXIgLS0+CisgICAgPHZlcnNpb24gdmFsdWU9IjMiLz4KKyAgICA8eEF2Z0NoYXJXaWR0aCB2YWx1ZT0iNTk0Ii8+CisgICAgPHVzV2VpZ2h0Q2xhc3MgdmFsdWU9IjQwMCIvPgorICAgIDx1c1dpZHRoQ2xhc3MgdmFsdWU9IjUiLz4KKyAgICA8ZnNUeXBlIHZhbHVlPSIwMDAwMDAwMCAwMDAwMTAwMCIvPgorICAgIDx5U3Vic2NyaXB0WFNpemUgdmFsdWU9IjY1MCIvPgorICAgIDx5U3Vic2NyaXB0WVNpemUgdmFsdWU9IjYwMCIvPgorICAgIDx5U3Vic2NyaXB0WE9mZnNldCB2YWx1ZT0iMCIvPgorICAgIDx5U3Vic2NyaXB0WU9mZnNldCB2YWx1ZT0iNzUiLz4KKyAgICA8eVN1cGVyc2NyaXB0WFNpemUgdmFsdWU9IjY1MCIvPgorICAgIDx5U3VwZXJzY3JpcHRZU2l6ZSB2YWx1ZT0iNjAwIi8+CisgICAgPHlTdXBlcnNjcmlwdFhPZmZzZXQgdmFsdWU9IjAiLz4KKyAgICA8eVN1cGVyc2NyaXB0WU9mZnNldCB2YWx1ZT0iMzUwIi8+CisgICAgPHlTdHJpa2VvdXRTaXplIHZhbHVlPSI1MCIvPgorICAgIDx5U3RyaWtlb3V0UG9zaXRpb24gdmFsdWU9IjMwMCIvPgorICAgIDxzRmFtaWx5Q2xhc3MgdmFsdWU9IjAiLz4KKyAgICA8cGFub3NlPgorICAgICAgPGJGYW1pbHlUeXBlIHZhbHVlPSIwIi8+CisgICAgICA8YlNlcmlmU3R5bGUgdmFsdWU9IjAiLz4KKyAgICAgIDxiV2VpZ2h0IHZhbHVlPSI1Ii8+CisgICAgICA8YlByb3BvcnRpb24gdmFsdWU9IjAiLz4KKyAgICAgIDxiQ29udHJhc3QgdmFsdWU9IjAiLz4KKyAgICAgIDxiU3Ryb2tlVmFyaWF0aW9uIHZhbHVlPSIwIi8+CisgICAgICA8YkFybVN0eWxlIHZhbHVlPSIwIi8+CisgICAgICA8YkxldHRlckZvcm0gdmFsdWU9IjAiLz4KKyAgICAgIDxiTWlkbGluZSB2YWx1ZT0iMCIvPgorICAgICAgPGJYSGVpZ2h0IHZhbHVlPSIwIi8+CisgICAgPC9wYW5vc2U+CisgICAgPHVsVW5pY29kZVJhbmdlMSB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDEiLz4KKyAgICA8dWxVbmljb2RlUmFuZ2UyIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCIvPgorICAgIDx1bFVuaWNvZGVSYW5nZTMgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIi8+CisgICAgPHVsVW5pY29kZVJhbmdlNCB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAiLz4KKyAgICA8YWNoVmVuZElEIHZhbHVlPSJVS1dOIi8+CisgICAgPGZzU2VsZWN0aW9uIHZhbHVlPSIwMDAwMDAwMCAwMTAwMDAwMCIvPgorICAgIDx1c0ZpcnN0Q2hhckluZGV4IHZhbHVlPSI5NyIvPgorICAgIDx1c0xhc3RDaGFySW5kZXggdmFsdWU9Ijk3Ii8+CisgICAgPHNUeXBvQXNjZW5kZXIgdmFsdWU9IjgwMCIvPgorICAgIDxzVHlwb0Rlc2NlbmRlciB2YWx1ZT0iLTIwMCIvPgorICAgIDxzVHlwb0xpbmVHYXAgdmFsdWU9IjIwMCIvPgorICAgIDx1c1dpbkFzY2VudCB2YWx1ZT0iMTAwMCIvPgorICAgIDx1c1dpbkRlc2NlbnQgdmFsdWU9IjIwMCIvPgorICAgIDx1bENvZGVQYWdlUmFuZ2UxIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMSIvPgorICAgIDx1bENvZGVQYWdlUmFuZ2UyIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCIvPgorICAgIDxzeEhlaWdodCB2YWx1ZT0iNTAwIi8+CisgICAgPHNDYXBIZWlnaHQgdmFsdWU9IjcwMCIvPgorICAgIDx1c0RlZmF1bHRDaGFyIHZhbHVlPSIwIi8+CisgICAgPHVzQnJlYWtDaGFyIHZhbHVlPSIzMiIvPgorICAgIDx1c01heENvbnRleHQgdmFsdWU9IjAiLz4KKyAgPC9PU18yPgorCisgIDxobXR4PgorICAgIDxtdHggbmFtZT0iLm5vdGRlZiIgd2lkdGg9IjUwMCIgbHNiPSI5MyIvPgorICAgIDxtdHggbmFtZT0iZGFzaCIgd2lkdGg9IjUwMCIgbHNiPSI5MyIvPgorICA8L2htdHg+CisKKyAgPGNtYXA+CisgICAgPHRhYmxlVmVyc2lvbiB2ZXJzaW9uPSIwIi8+CisgICAgPGNtYXBfZm9ybWF0XzQgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxMCIgbGFuZ3VhZ2U9IjAiPgorICAgICAgPG1hcCBjb2RlPSIweDJEIiBuYW1lPSJkYXNoIi8+PCEtLSBBU0NJSSBEQVNIIC0tPgorICAgIDwvY21hcF9mb3JtYXRfND4KKyAgPC9jbWFwPgorCisgIDxsb2NhPgorICAgIDwhLS0gVGhlICdsb2NhJyB0YWJsZSB3aWxsIGJlIGNhbGN1bGF0ZWQgYnkgdGhlIGNvbXBpbGVyIC0tPgorICA8L2xvY2E+CisKKyAgPGdseWY+CisKKyAgICA8IS0tIFRoZSB4TWluLCB5TWluLCB4TWF4IGFuZCB5TWF4IHZhbHVlcworICAgICAgICAgd2lsbCBiZSByZWNhbGN1bGF0ZWQgYnkgdGhlIGNvbXBpbGVyLiAtLT4KKyAgICA8VFRHbHlwaCBuYW1lPSIubm90ZGVmIiB4TWluPSIwIiB5TWluPSIwIiB4TWF4PSIwIiB5TWF4PSIwIj4KKyAgICAgIDxjb250b3VyPgorICAgICAgICA8cHQgeD0iMTAwIiB5PSItNTAwIiBvbj0iMSIvPgorICAgICAgICA8cHQgeD0iOTAwIiB5PSItNTAwIiBvbj0iMSIvPgorICAgICAgICA8cHQgeD0iOTAwIiB5PSIxMDAwIiBvbj0iMSIvPgorICAgICAgICA8cHQgeD0iMTAwIiB5PSIxMDAwIiBvbj0iMSIvPgorICAgICAgPC9jb250b3VyPgorICAgICAgPGluc3RydWN0aW9ucy8+CisgICAgPC9UVEdseXBoPgorCisgICAgPFRUR2x5cGggbmFtZT0iZGFzaCI+CisgICAgICA8Y29udG91cj4KKyAgICAgICAgPHB0IHg9IjAiIHk9IjIwMCIgb249IjEiLz4KKyAgICAgICAgPHB0IHg9IjEwMCIgeT0iMjAwIiBvbj0iMSIvPgorICAgICAgICA8cHQgeD0iMTAwIiB5PSIzMDAiIG9uPSIxIi8+CisgICAgICAgIDxwdCB4PSIwIiB5PSIzMDAiIG9uPSIxIi8+CisgICAgICA8L2NvbnRvdXI+CisgICAgPGluc3RydWN0aW9ucy8+CisgICAgPC9UVEdseXBoPgorICA8L2dseWY+CisKKyAgPG5hbWU+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSIxIiBwbGF0Zm9ybUlEPSIxIiBwbGF0RW5jSUQ9IjAiIGxhbmdJRD0iMHgwIiB1bmljb2RlPSJUcnVlIj4KKyAgICAgIE11bHRpQXhpc0ZvbnQgVGVzdAorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjIiIHBsYXRmb3JtSUQ9IjEiIHBsYXRFbmNJRD0iMCIgbGFuZ0lEPSIweDAiIHVuaWNvZGU9IlRydWUiPgorICAgICAgUmVndWxhcgorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjQiIHBsYXRmb3JtSUQ9IjEiIHBsYXRFbmNJRD0iMCIgbGFuZ0lEPSIweDAiIHVuaWNvZGU9IlRydWUiPgorICAgICAgTXVsdGlBeGlzRm9udCBUZXN0CisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iNiIgcGxhdGZvcm1JRD0iMSIgcGxhdEVuY0lEPSIwIiBsYW5nSUQ9IjB4MCIgdW5pY29kZT0iVHJ1ZSI+CisgICAgICBNdWx0aUF4aXNGb250VGVzdC1SZWd1bGFyCisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iMSIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIE11bHRpQXhpc0ZvbnQgVGVzdAorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjIiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBSZWd1bGFyCisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iNCIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIE11bHRpQXhpc0ZvbnQgVGVzdAorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjYiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBNdWx0aUF4aXNGb250VGVzdC1SZWd1bGFyCisgICAgPC9uYW1lcmVjb3JkPgorICA8L25hbWU+CisKKyAgPHBvc3Q+CisgICAgPGZvcm1hdFR5cGUgdmFsdWU9IjMuMCIvPgorICAgIDxpdGFsaWNBbmdsZSB2YWx1ZT0iMC4wIi8+CisgICAgPHVuZGVybGluZVBvc2l0aW9uIHZhbHVlPSItMjAwIi8+CisgICAgPHVuZGVybGluZVRoaWNrbmVzcyB2YWx1ZT0iMjAiLz4KKyAgICA8aXNGaXhlZFBpdGNoIHZhbHVlPSIwIi8+CisgICAgPG1pbk1lbVR5cGU0MiB2YWx1ZT0iMCIvPgorICAgIDxtYXhNZW1UeXBlNDIgdmFsdWU9IjAiLz4KKyAgICA8bWluTWVtVHlwZTEgdmFsdWU9IjAiLz4KKyAgICA8bWF4TWVtVHlwZTEgdmFsdWU9IjAiLz4KKyAgPC9wb3N0PgorCisgIDxmdmFyPgorICAgIDxBeGlzPgorICAgICAgPEF4aXNUYWc+d2R0aDwvQXhpc1RhZz4KKyAgICAgIDxNaW5WYWx1ZT4xMDAuMDwvTWluVmFsdWU+CisgICAgICA8RGVmYXVsdFZhbHVlPjEwMC4wPC9EZWZhdWx0VmFsdWU+CisgICAgICA8TWF4VmFsdWU+NTAwLjA8L01heFZhbHVlPgorICAgICAgPEF4aXNOYW1lSUQ+MjU2PC9BeGlzTmFtZUlEPgorICAgIDwvQXhpcz4KKyAgPC9mdmFyPgorCisgIDxndmFyPgorICAgIDxnbHlwaFZhcmlhdGlvbnMgZ2x5cGg9ImRhc2giPgorICAgICAgPHR1cGxlPgorICAgICAgICA8Y29vcmQgYXhpcz0id2R0aCIgdmFsdWU9IjEuMCIvPgorICAgICAgICA8ZGVsdGEgcHQ9IjAiIHg9IjAiIHk9IjAiLz4KKyAgICAgICAgPGRlbHRhIHB0PSIxIiB4PSI0MDAiIHk9IjAiLz4KKyAgICAgICAgPGRlbHRhIHB0PSIyIiB4PSI0MDAiIHk9IjAiLz4KKyAgICAgICAgPGRlbHRhIHB0PSIzIiB4PSIwIiB5PSIwIi8+CisgICAgICAgIDxkZWx0YSBwdD0iNCIgeD0iLTIwMCIgeT0iMCIvPgorICAgICAgICA8ZGVsdGEgcHQ9IjUiIHg9IjIwMCIgeT0iMCIvPgorICAgICAgPC90dXBsZT4KKyAgICA8L2dseXBoVmFyaWF0aW9ucz4KKyAgPC9ndmFyPgorCis8L3R0Rm9udD4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvcmVzL21pcG1hcC9pY29uX2JhY2tncm91bmQucG5nIGIvdGVzdHMvdGVzdHMvY29udGVudC9yZXMvbWlwbWFwL2ljb25fYmFja2dyb3VuZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJhMDY1YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvcmVzL21pcG1hcC9pY29uX2JhY2tncm91bmQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvcmVzL21pcG1hcC9pY29uX3JlY3Vyc2l2ZS54bWwgYi90ZXN0cy90ZXN0cy9jb250ZW50L3Jlcy9taXBtYXAvaWNvbl9yZWN1cnNpdmUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NGZlMTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9jb250ZW50L3Jlcy9taXBtYXAvaWNvbl9yZWN1cnNpdmUueG1sCkBAIC0wLDAgKzEsMjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPGFkYXB0aXZlLWljb24geG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8YmFja2dyb3VuZCBhbmRyb2lkOmRyYXdhYmxlPSJAbWlwbWFwL2ljb25fYmFja2dyb3VuZCIgLz4KKyAgICA8Zm9yZWdyb3VuZCBhbmRyb2lkOmRyYXdhYmxlPSJAbWlwbWFwL2ljb25fcmVjdXJzaXZlIiAvPgorPC9hZGFwdGl2ZS1pY29uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvY29udGVudC9yZXMvdmFsdWVzLXYyOS9zdHJpbmdzLnhtbCBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvcmVzL3ZhbHVlcy12Mjkvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhlNTJkMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvcmVzL3ZhbHVlcy12Mjkvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwxOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHJlc291cmNlcyB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICA8c3RyaW5nIG5hbWU9InZlcnNpb25fY3VyIj52MjljdXI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvY29udGVudC9yZXMvdmFsdWVzLXYzMC9zdHJpbmdzLnhtbCBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvcmVzL3ZhbHVlcy12MzAvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjcyY2I2OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvcmVzL3ZhbHVlcy12MzAvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwxOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHJlc291cmNlcyB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICA8c3RyaW5nIG5hbWU9InZlcnNpb25fY3VyIj52MzBjdXI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvY29udGVudC9yZXMvdmFsdWVzLXYzMS9zdHJpbmdzLnhtbCBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvcmVzL3ZhbHVlcy12MzEvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ3YmViZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvcmVzL3ZhbHVlcy12MzEvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwxOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHJlc291cmNlcyB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICA8c3RyaW5nIG5hbWU9InZlcnNpb25fY3VyIj52MzFjdXI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvY29udGVudC9yZXMvdmFsdWVzLXYzMi9zdHJpbmdzLnhtbCBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvcmVzL3ZhbHVlcy12MzIvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNhMjFiNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvcmVzL3ZhbHVlcy12MzIvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwxOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHJlc291cmNlcyB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICA8c3RyaW5nIG5hbWU9InZlcnNpb25fY3VyIj52MzJjdXI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvY29udGVudC9yZXMvdmFsdWVzLXYzMy9zdHJpbmdzLnhtbCBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvcmVzL3ZhbHVlcy12MzMvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY4NDg5MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvcmVzL3ZhbHVlcy12MzMvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwxOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHJlc291cmNlcyB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICA8c3RyaW5nIG5hbWU9InZlcnNpb25fY3VyIj52MzNjdXI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvY29udGVudC9yZXMvdmFsdWVzLXYzNC9zdHJpbmdzLnhtbCBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvcmVzL3ZhbHVlcy12MzQvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY3ZmViMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvcmVzL3ZhbHVlcy12MzQvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwxOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHJlc291cmNlcyB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICA8c3RyaW5nIG5hbWU9InZlcnNpb25fY3VyIj52MzRjdXI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvY29udGVudC9yZXMvdmFsdWVzLXYzNS9zdHJpbmdzLnhtbCBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvcmVzL3ZhbHVlcy12MzUvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMwNjJiZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvcmVzL3ZhbHVlcy12MzUvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwxOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHJlc291cmNlcyB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICA8c3RyaW5nIG5hbWU9InZlcnNpb25fY3VyIj52MzVjdXI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvY29udGVudC9yZXMvdmFsdWVzLXYzNi9zdHJpbmdzLnhtbCBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvcmVzL3ZhbHVlcy12MzYvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEyNjE0ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvcmVzL3ZhbHVlcy12MzYvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwxOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHJlc291cmNlcyB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICA8c3RyaW5nIG5hbWU9InZlcnNpb25fY3VyIj52MzZjdXI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvY29udGVudC9yZXMvdmFsdWVzLXYzNy9zdHJpbmdzLnhtbCBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvcmVzL3ZhbHVlcy12Mzcvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEwMWI5MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvcmVzL3ZhbHVlcy12Mzcvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwxOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHJlc291cmNlcyB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICA8c3RyaW5nIG5hbWU9InZlcnNpb25fY3VyIj52MzdjdXI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvY29udGVudC9yZXMvdmFsdWVzLXYzOC9zdHJpbmdzLnhtbCBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvcmVzL3ZhbHVlcy12Mzgvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVmMDk5OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvcmVzL3ZhbHVlcy12Mzgvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwxOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHJlc291cmNlcyB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICA8c3RyaW5nIG5hbWU9InZlcnNpb25fY3VyIj52MzhjdXI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvY29udGVudC9yZXMvdmFsdWVzLXYzOS9zdHJpbmdzLnhtbCBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvcmVzL3ZhbHVlcy12Mzkvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQwMjM3MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvcmVzL3ZhbHVlcy12Mzkvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwxOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHJlc291cmNlcyB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICA8c3RyaW5nIG5hbWU9InZlcnNpb25fY3VyIj52MzljdXI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvY29udGVudC9yZXMvdmFsdWVzLXY0MC9zdHJpbmdzLnhtbCBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvcmVzL3ZhbHVlcy12NDAvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFiM2I0NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvcmVzL3ZhbHVlcy12NDAvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwxOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHJlc291cmNlcyB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICA8c3RyaW5nIG5hbWU9InZlcnNpb25fY3VyIj52NDBjdXI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvaG9zdHNpZGV0ZXN0cy9jb250ZW50L3Rlc3QtYXBwcy9DdHNTeW5jQWNjb3VudEFjY2Vzc090aGVyQ2VydFRlc3RzL3Jlcy94bWwvc3luY2FkYXB0ZXIueG1sIGIvdGVzdHMvdGVzdHMvY29udGVudC9yZXMveG1sL2Fsd2F5c19zeW5jYWJsZV9hY2NvdW50X2FjY2Vzc19hZGFwdGVyLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIGhvc3RzaWRldGVzdHMvY29udGVudC90ZXN0LWFwcHMvQ3RzU3luY0FjY291bnRBY2Nlc3NPdGhlckNlcnRUZXN0cy9yZXMveG1sL3N5bmNhZGFwdGVyLnhtbApjb3B5IHRvIHRlc3RzL3Rlc3RzL2NvbnRlbnQvcmVzL3htbC9hbHdheXNfc3luY2FibGVfYWNjb3VudF9hY2Nlc3NfYWRhcHRlci54bWwKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvcmVzL3htbC9ub3RfYWx3YXlzX3N5bmNhYmxlX2FjY291bnRfYWNjZXNzX2FkYXB0ZXIueG1sIGIvdGVzdHMvdGVzdHMvY29udGVudC9yZXMveG1sL25vdF9hbHdheXNfc3luY2FibGVfYWNjb3VudF9hY2Nlc3NfYWRhcHRlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMyZTlmZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvcmVzL3htbC9ub3RfYWx3YXlzX3N5bmNhYmxlX2FjY291bnRfYWNjZXNzX2FkYXB0ZXIueG1sCkBAIC0wLDAgKzEsMjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzeW5jLWFkYXB0ZXIKKyAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpjb250ZW50QXV0aG9yaXR5PSJjb20uYW5kcm9pZC5jdHMuc3R1Yi5wcm92aWRlcjIiCisgICAgYW5kcm9pZDphY2NvdW50VHlwZT0iY29tLnN0dWIiCisgICAgYW5kcm9pZDp1c2VyVmlzaWJsZT0iZmFsc2UiCisgICAgYW5kcm9pZDpzdXBwb3J0c1VwbG9hZGluZz0iZmFsc2UiCisgICAgYW5kcm9pZDphbGxvd1BhcmFsbGVsU3luY3M9ImZhbHNlIgorICAgIGFuZHJvaWQ6aXNBbHdheXNTeW5jYWJsZT0iZmFsc2UiPgorPC9zeW5jLWFkYXB0ZXI+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9jb250ZW50L3NyYy9hbmRyb2lkL2NvbnRlbnQvY3RzL0FjY291bnRBY2Nlc3NTYW1lQ2VydFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvc3JjL2FuZHJvaWQvY29udGVudC9jdHMvQWNjb3VudEFjY2Vzc1NhbWVDZXJ0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwY2E3NDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9jb250ZW50L3NyYy9hbmRyb2lkL2NvbnRlbnQvY3RzL0FjY291bnRBY2Nlc3NTYW1lQ2VydFRlc3QuamF2YQpAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQuY3RzOworCitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmN0cy5jb250ZW50LlV0aWxzLkFMV0FZU19TWU5DQUJMRV9BVVRIT1JJVFk7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmN0cy5jb250ZW50LlV0aWxzLlNZTkNfVElNRU9VVF9NSUxMSVM7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmN0cy5jb250ZW50LlV0aWxzLmFsbG93U3luY0FkYXB0ZXJSdW5JbkJhY2tncm91bmRBbmREYXRhSW5CYWNrZ3JvdW5kOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jdHMuY29udGVudC5VdGlscy5kaXNhbGxvd1N5bmNBZGFwdGVyUnVuSW5CYWNrZ3JvdW5kQW5kRGF0YUluQmFja2dyb3VuZDsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY3RzLmNvbnRlbnQuVXRpbHMuaGFzRGF0YUNvbm5lY3Rpb247CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmN0cy5jb250ZW50LlV0aWxzLnJlcXVlc3RTeW5jOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jdHMuY29udGVudC5VdGlscy53aXRoQWNjb3VudDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzdW1lLmFzc3VtZVRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLkFyZ3VtZW50TWF0Y2hlcnMuYW55OworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnRpbWVvdXQ7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8udmVyaWZ5OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkFic3RyYWN0VGhyZWFkZWRTeW5jQWRhcHRlcjsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jdHMuY29udGVudC5BbHdheXNTeW5jYWJsZVN5bmNTZXJ2aWNlOworaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy5jb250ZW50LkZsYWt5VGVzdFJ1bGU7CitpbXBvcnQgY29tLmFuZHJvaWQuY3RzLmNvbnRlbnQuU3R1YkFjdGl2aXR5OworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLlRlc3RSdWxlOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKKworLyoqCisgKiBUZXN0cyB3aGV0aGVyIGEgc3luYyBhZGFwdGVyIGNhbiBhY2Nlc3MgYWNjb3VudHMuCisgKi8KK0BSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgQWNjb3VudEFjY2Vzc1NhbWVDZXJ0VGVzdCB7CisgICAgQFJ1bGUKKyAgICBwdWJsaWMgZmluYWwgVGVzdFJ1bGUgbUZsYWt5VGVzdFRSdWxlID0gbmV3IEZsYWt5VGVzdFJ1bGUoMyk7CisKKyAgICBAUnVsZQorICAgIHB1YmxpYyBmaW5hbCBBY3Rpdml0eVRlc3RSdWxlPFN0dWJBY3Rpdml0eT4gYWN0aXZpdHkgPSBuZXcgQWN0aXZpdHlUZXN0UnVsZShTdHViQWN0aXZpdHkuY2xhc3MpOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFsbG93U3luY0FkYXB0ZXJSdW5JbkJhY2tncm91bmRBbmREYXRhSW5CYWNrZ3JvdW5kKCk7CisgICAgfQorCisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZGlzYWxsb3dTeW5jQWRhcHRlclJ1bkluQmFja2dyb3VuZEFuZERhdGFJbkJhY2tncm91bmQoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBY2NvdW50QWNjZXNzX3NhbWVDZXJ0QXNBdXRoZW50aWNhdG9yQ2FuU2VlQWNjb3VudCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3N1bWVUcnVlKGhhc0RhdGFDb25uZWN0aW9uKCkpOworCisgICAgICAgIHRyeSAoQXV0b0Nsb3NlYWJsZSBpZ25vcmVkID0gd2l0aEFjY291bnQoYWN0aXZpdHkuZ2V0QWN0aXZpdHkoKSkpIHsKKyAgICAgICAgICAgIEFic3RyYWN0VGhyZWFkZWRTeW5jQWRhcHRlciBhZGFwdGVyID0gQWx3YXlzU3luY2FibGVTeW5jU2VydmljZS5nZXRJbnN0YW5jZSgKKyAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHkuZ2V0QWN0aXZpdHkoKSkuc2V0TmV3RGVsZWdhdGUoKTsKKworICAgICAgICAgICAgcmVxdWVzdFN5bmMoQUxXQVlTX1NZTkNBQkxFX0FVVEhPUklUWSk7CisKKyAgICAgICAgICAgIHZlcmlmeShhZGFwdGVyLCB0aW1lb3V0KFNZTkNfVElNRU9VVF9NSUxMSVMpKS5vblBlcmZvcm1TeW5jKGFueSgpLCBhbnkoKSwgYW55KCksIGFueSgpLAorICAgICAgICAgICAgICAgICAgICBhbnkoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9jb250ZW50L3NyYy9hbmRyb2lkL2NvbnRlbnQvY3RzL0F2YWlsYWJsZUludGVudHNUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9jb250ZW50L3NyYy9hbmRyb2lkL2NvbnRlbnQvY3RzL0F2YWlsYWJsZUludGVudHNUZXN0LmphdmEKaW5kZXggZDRkMzUwMS4uMDY0YmYwYiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvY29udGVudC9zcmMvYW5kcm9pZC9jb250ZW50L2N0cy9BdmFpbGFibGVJbnRlbnRzVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvc3JjL2FuZHJvaWQvY29udGVudC9jdHMvQXZhaWxhYmxlSW50ZW50c1Rlc3QuamF2YQpAQCAtMjgsNiArMjgsNyBAQAogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQWxhcm1DbG9jazsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLk1lZGlhU3RvcmU7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlRlbGVwaG9ueTsKIGltcG9ydCBhbmRyb2lkLnNwZWVjaC5SZWNvZ25pemVySW50ZW50OwogaW1wb3J0IGFuZHJvaWQudGVsZWNvbS5UZWxlY29tTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwpAQCAtMTY2LDcgKzE2Nyw2IEBACiAgICAgLyoqCiAgICAgICogVGVzdCBBQ1RJT05fQ0hBTkdFX1BIT05FX0FDQ09VTlRTLCBpdCB3aWxsIGRpc3BsYXkgdGhlIHBob25lIGFjY291bnQgcHJlZmVyZW5jZXMuCiAgICAgICovCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjMuMi4zLjUvQy0yLTMiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VQaG9uZUFjY291bnRzKCkgewogICAgICAgICBQYWNrYWdlTWFuYWdlciBwYWNrYWdlTWFuYWdlciA9IG1Db250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7CiAgICAgICAgIGlmIChwYWNrYWdlTWFuYWdlci5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfVEVMRVBIT05ZKSkgewpAQCAtMzQ5LDYgKzM0OSwzOSBAQAogICAgICAgICBhc3NlcnRDYW5CZUhhbmRsZWQobmV3IEludGVudChTdG9yYWdlTWFuYWdlci5BQ1RJT05fTUFOQUdFX1NUT1JBR0UpKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmluZ2VycHJpbnRFbnJvbGxTdGFydCgpIHsKKyAgICAgICAgUGFja2FnZU1hbmFnZXIgcGFja2FnZU1hbmFnZXIgPSBtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICBpZiAocGFja2FnZU1hbmFnZXIuaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX0ZJTkdFUlBSSU5UKSkgeworICAgICAgICAgICAgYXNzZXJ0Q2FuQmVIYW5kbGVkKG5ldyBJbnRlbnQoU2V0dGluZ3MuQUNUSU9OX0ZJTkdFUlBSSU5UX0VOUk9MTCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFBpY3R1cmVJblBpY3R1cmVTZXR0aW5ncygpIHsKKyAgICAgICAgUGFja2FnZU1hbmFnZXIgcGFja2FnZU1hbmFnZXIgPSBtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICBpZiAocGFja2FnZU1hbmFnZXIuaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX1BJQ1RVUkVfSU5fUElDVFVSRSkpIHsKKyAgICAgICAgICAgIGFzc2VydENhbkJlSGFuZGxlZChuZXcgSW50ZW50KFNldHRpbmdzLkFDVElPTl9QSUNUVVJFX0lOX1BJQ1RVUkVfU0VUVElOR1MpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VEZWZhdWx0U21zQXBwbGljYXRpb24oKSB7CisgICAgICAgIFBhY2thZ2VNYW5hZ2VyIHBhY2thZ2VNYW5hZ2VyID0gbUNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKTsKKyAgICAgICAgaWYgKHBhY2thZ2VNYW5hZ2VyLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9URUxFUEhPTlkpKSB7CisgICAgICAgICAgICBhc3NlcnRDYW5CZUhhbmRsZWQobmV3IEludGVudChUZWxlcGhvbnkuU21zLkludGVudHMuQUNUSU9OX0NIQU5HRV9ERUZBVUxUKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9jYXRpb25TY2FubmluZ1NldHRpbmdzKCkgeworICAgICAgICBQYWNrYWdlTWFuYWdlciBwYWNrYWdlTWFuYWdlciA9IG1Db250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgIGlmIChwYWNrYWdlTWFuYWdlci5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfV0FUQ0gpKSB7CisgICAgICAgICAgICAvLyBTa2lwIHRoZSB0ZXN0IGZvciB3ZWFyYWJsZSBkZXZpY2UuCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBhY2thZ2VNYW5hZ2VyLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9XSUZJKQorICAgICAgICAgICAgICAgIHx8IHBhY2thZ2VNYW5hZ2VyLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9CTFVFVE9PVEhfTEUpKSB7CisgICAgICAgICAgICBhc3NlcnRDYW5CZUhhbmRsZWQobmV3IEludGVudCgiYW5kcm9pZC5zZXR0aW5ncy5MT0NBVElPTl9TQ0FOTklOR19TRVRUSU5HUyIpKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHRlc3RQb3dlclVzYWdlU3VtbWFyeVNldHRpbmdzKCkgewogICAgICAgICBpZiAoaXNIYW5kaGVsZCgpKSB7CiAgICAgICAgICAgICBhc3NlcnRDYW5CZUhhbmRsZWQobmV3IEludGVudChJbnRlbnQuQUNUSU9OX1BPV0VSX1VTQUdFX1NVTU1BUlkpKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvc3JjL2FuZHJvaWQvY29udGVudC9jdHMvQ2xpcERlc2NyaXB0aW9uVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvY29udGVudC9zcmMvYW5kcm9pZC9jb250ZW50L2N0cy9DbGlwRGVzY3JpcHRpb25UZXN0LmphdmEKaW5kZXggYmQ5NzU2ZS4uMzU4MzFiYiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvY29udGVudC9zcmMvYW5kcm9pZC9jb250ZW50L2N0cy9DbGlwRGVzY3JpcHRpb25UZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvY29udGVudC9zcmMvYW5kcm9pZC9jb250ZW50L2N0cy9DbGlwRGVzY3JpcHRpb25UZXN0LmphdmEKQEAgLTIxLDEwICsyMSwxMSBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5DbGlwRGF0YTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ2xpcGJvYXJkTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiAKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9jb250ZW50L3NyYy9hbmRyb2lkL2NvbnRlbnQvY3RzL0NsaXBib2FyZE1hbmFnZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9jb250ZW50L3NyYy9hbmRyb2lkL2NvbnRlbnQvY3RzL0NsaXBib2FyZE1hbmFnZXJUZXN0LmphdmEKaW5kZXggZTAzODExN2YuLjMxZDYzZWUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvc3JjL2FuZHJvaWQvY29udGVudC9jdHMvQ2xpcGJvYXJkTWFuYWdlclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9jb250ZW50L3NyYy9hbmRyb2lkL2NvbnRlbnQvY3RzL0NsaXBib2FyZE1hbmFnZXJUZXN0LmphdmEKQEAgLTE2LDI5ICsxNiw0NiBAQAogCiBwYWNrYWdlIGFuZHJvaWQuY29udGVudC5jdHM7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ2xpcERhdGE7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNsaXBEYXRhLkl0ZW07CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNsaXBEZXNjcmlwdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ2xpcGJvYXJkTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ2xpcGJvYXJkTWFuYWdlci5PblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ2xpcERhdGEuSXRlbTsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RDYXNlOwotaW1wb3J0IGFuZHJvaWQudGVzdC5VaVRocmVhZFRlc3Q7CiAKLXB1YmxpYyBjbGFzcyBDbGlwYm9hcmRNYW5hZ2VyVGVzdCBleHRlbmRzIEluc3RydW1lbnRhdGlvblRlc3RDYXNlIHsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCitAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIENsaXBib2FyZE1hbmFnZXJUZXN0IHsKICAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBDbGlwYm9hcmRNYW5hZ2VyIG1DbGlwYm9hcmRNYW5hZ2VyOwogCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgbUNvbnRleHQgPSBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRUYXJnZXRDb250ZXh0KCk7CisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1Db250ZXh0ID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0VGFyZ2V0Q29udGV4dCgpOworICAgICAgICBtQ2xpcGJvYXJkTWFuYWdlciA9IG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ2xpcGJvYXJkTWFuYWdlci5jbGFzcyk7CiAgICAgfQogCi0gICAgQFVpVGhyZWFkVGVzdAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFNldEdldFRleHQoKSB7Ci0gICAgICAgIENsaXBib2FyZE1hbmFnZXIgY2xpcGJvYXJkTWFuYWdlciA9IG1ha2VDbGlwYm9hcmRNYW5hZ2VyKCk7CisgICAgICAgIENsaXBib2FyZE1hbmFnZXIgY2xpcGJvYXJkTWFuYWdlciA9IG1DbGlwYm9hcmRNYW5hZ2VyOwogICAgICAgICBjbGlwYm9hcmRNYW5hZ2VyLnNldFRleHQoIlRlc3QgVGV4dCAxIik7CiAgICAgICAgIGFzc2VydEVxdWFscygiVGVzdCBUZXh0IDEiLCBjbGlwYm9hcmRNYW5hZ2VyLmdldFRleHQoKSk7CiAKQEAgLTQ2LDkgKzYzLDkgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUZXN0IFRleHQgMiIsIGNsaXBib2FyZE1hbmFnZXIuZ2V0VGV4dCgpKTsKICAgICB9CiAKLSAgICBAVWlUaHJlYWRUZXN0CisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzUHJpbWFyeUNsaXAoKSB7Ci0gICAgICAgIENsaXBib2FyZE1hbmFnZXIgY2xpcGJvYXJkTWFuYWdlciA9IG1ha2VDbGlwYm9hcmRNYW5hZ2VyKCk7CisgICAgICAgIENsaXBib2FyZE1hbmFnZXIgY2xpcGJvYXJkTWFuYWdlciA9IG1DbGlwYm9hcmRNYW5hZ2VyOwogICAgICAgICBpZiAoY2xpcGJvYXJkTWFuYWdlci5oYXNQcmltYXJ5Q2xpcCgpKSB7CiAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGNsaXBib2FyZE1hbmFnZXIuZ2V0UHJpbWFyeUNsaXAoKSk7CiAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGNsaXBib2FyZE1hbmFnZXIuZ2V0UHJpbWFyeUNsaXBEZXNjcmlwdGlvbigpKTsKQEAgLTYxLDcgKzc4LDcgQEAKICAgICAgICAgYXNzZXJ0VHJ1ZShjbGlwYm9hcmRNYW5hZ2VyLmhhc1ByaW1hcnlDbGlwKCkpOwogICAgIH0KIAotICAgIEBVaVRocmVhZFRlc3QKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRQcmltYXJ5Q2xpcF9wbGFpblRleHQoKSB7CiAgICAgICAgIENsaXBEYXRhIHRleHREYXRhID0gQ2xpcERhdGEubmV3UGxhaW5UZXh0KCJUZXh0TGFiZWwiLCAiVGV4dCIpOwogICAgICAgICBhc3NlcnRTZXRQcmltYXJ5Q2xpcCh0ZXh0RGF0YSwgIlRleHRMYWJlbCIsCkBAIC02OSw3ICs4Niw3IEBACiAgICAgICAgICAgICAgICAgbmV3IEV4cGVjdGVkQ2xpcEl0ZW0oIlRleHQiLCBudWxsLCBudWxsKSk7CiAgICAgfQogCi0gICAgQFVpVGhyZWFkVGVzdAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFNldFByaW1hcnlDbGlwX2ludGVudCgpIHsKICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQobUNvbnRleHQsIENsaXBib2FyZE1hbmFnZXJUZXN0LmNsYXNzKTsKICAgICAgICAgQ2xpcERhdGEgaW50ZW50RGF0YSA9IENsaXBEYXRhLm5ld0ludGVudCgiSW50ZW50TGFiZWwiLCBpbnRlbnQpOwpAQCAtNzgsNyArOTUsNyBAQAogICAgICAgICAgICAgICAgIG5ldyBFeHBlY3RlZENsaXBJdGVtKG51bGwsIGludGVudCwgbnVsbCkpOwogICAgIH0KIAotICAgIEBVaVRocmVhZFRlc3QKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRQcmltYXJ5Q2xpcF9yYXdVcmkoKSB7CiAgICAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2UoImh0dHA6Ly93d3cuZ29vZ2xlLmNvbSIpOwogICAgICAgICBDbGlwRGF0YSB1cmlEYXRhID0gQ2xpcERhdGEubmV3UmF3VXJpKCJVcmlMYWJlbCIsIHVyaSk7CkBAIC04Nyw3ICsxMDQsNyBAQAogICAgICAgICAgICAgICAgIG5ldyBFeHBlY3RlZENsaXBJdGVtKG51bGwsIG51bGwsIHVyaSkpOwogICAgIH0KIAotICAgIEBVaVRocmVhZFRlc3QKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRQcmltYXJ5Q2xpcF9jb250ZW50VXJpKCkgewogICAgICAgICBVcmkgY29udGVudFVyaSA9IFVyaS5wYXJzZSgiY29udGVudDovL2N0cy90ZXN0L2Zvci9jbGlwYm9hcmRtYW5hZ2VyIik7CiAgICAgICAgIENsaXBEYXRhIGNvbnRlbnRVcmlEYXRhID0gQ2xpcERhdGEubmV3VXJpKG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLApAQCAtOTcsNyArMTE0LDcgQEAKICAgICAgICAgICAgICAgICBuZXcgRXhwZWN0ZWRDbGlwSXRlbShudWxsLCBudWxsLCBjb250ZW50VXJpKSk7CiAgICAgfQogCi0gICAgQFVpVGhyZWFkVGVzdAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFNldFByaW1hcnlDbGlwX2NvbXBsZXhJdGVtKCkgewogICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChtQ29udGV4dCwgQ2xpcGJvYXJkTWFuYWdlclRlc3QuY2xhc3MpOwogICAgICAgICBVcmkgdXJpID0gVXJpLnBhcnNlKCJodHRwOi8vd3d3Lmdvb2dsZS5jb20iKTsKQEAgLTExMyw3ICsxMzAsNyBAQAogICAgICAgICAgICAgICAgIG5ldyBFeHBlY3RlZENsaXBJdGVtKCJUZXh0IiwgaW50ZW50LCB1cmkpKTsKICAgICB9CiAKLSAgICBAVWlUaHJlYWRUZXN0CisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0UHJpbWFyeUNsaXBfbXVsdGlwbGVJdGVtcygpIHsKICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQobUNvbnRleHQsIENsaXBib2FyZE1hbmFnZXJUZXN0LmNsYXNzKTsKICAgICAgICAgVXJpIHVyaSA9IFVyaS5wYXJzZSgiaHR0cDovL3d3dy5nb29nbGUuY29tIik7CkBAIC0xMjksNyArMTQ2LDcgQEAKICAgICAgICAgICAgICAgICBuZXcgRXhwZWN0ZWRDbGlwSXRlbShudWxsLCBudWxsLCB1cmkpKTsKICAgICB9CiAKLSAgICBAVWlUaHJlYWRUZXN0CisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0UHJpbWFyeUNsaXBfbXVsdGlwbGVNaW1lVHlwZXMoKSB7CiAgICAgICAgIENvbnRlbnRSZXNvbHZlciBjb250ZW50UmVzb2x2ZXIgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKIApAQCAtMTg0LDYgKzIwMSwzOCBAQAogICAgICAgICAgICAgICAgIG5ldyBFeHBlY3RlZENsaXBJdGVtKG51bGwsIG51bGwsIGNvbnRlbnRVcmk4KSk7CiAgICAgfQogCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgICAgIG1DbGlwYm9hcmRNYW5hZ2VyLmFkZFByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyKG5ldyBPblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblByaW1hcnlDbGlwQ2hhbmdlZCgpIHsKKyAgICAgICAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgZmluYWwgQ2xpcERhdGEgY2xpcERhdGEgPSBDbGlwRGF0YS5uZXdQbGFpblRleHQoIlRleHRMYWJlbCIsICJUZXh0Iik7CisgICAgICAgIG1DbGlwYm9hcmRNYW5hZ2VyLnNldFByaW1hcnlDbGlwKGNsaXBEYXRhKTsKKworICAgICAgICBsYXRjaC5hd2FpdCg1LCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbGVhclByaW1hcnlDbGlwKCkgeworICAgICAgICBmaW5hbCBDbGlwRGF0YSBjbGlwRGF0YSA9IENsaXBEYXRhLm5ld1BsYWluVGV4dCgiVGV4dExhYmVsIiwgIlRleHQiKTsKKyAgICAgICAgbUNsaXBib2FyZE1hbmFnZXIuc2V0UHJpbWFyeUNsaXAoY2xpcERhdGEpOworICAgICAgICBhc3NlcnRUcnVlKG1DbGlwYm9hcmRNYW5hZ2VyLmhhc1ByaW1hcnlDbGlwKCkpOworICAgICAgICBhc3NlcnRUcnVlKG1DbGlwYm9hcmRNYW5hZ2VyLmhhc1RleHQoKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwobUNsaXBib2FyZE1hbmFnZXIuZ2V0UHJpbWFyeUNsaXAoKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwobUNsaXBib2FyZE1hbmFnZXIuZ2V0UHJpbWFyeUNsaXBEZXNjcmlwdGlvbigpKTsKKworICAgICAgICBtQ2xpcGJvYXJkTWFuYWdlci5jbGVhclByaW1hcnlDbGlwKCk7CisgICAgICAgIGFzc2VydEZhbHNlKG1DbGlwYm9hcmRNYW5hZ2VyLmhhc1ByaW1hcnlDbGlwKCkpOworICAgICAgICBhc3NlcnRGYWxzZShtQ2xpcGJvYXJkTWFuYWdlci5oYXNUZXh0KCkpOworICAgICAgICBhc3NlcnROdWxsKG1DbGlwYm9hcmRNYW5hZ2VyLmdldFByaW1hcnlDbGlwKCkpOworICAgICAgICBhc3NlcnROdWxsKG1DbGlwYm9hcmRNYW5hZ2VyLmdldFByaW1hcnlDbGlwRGVzY3JpcHRpb24oKSk7CisgICAgfQorCiAgICAgcHJpdmF0ZSBjbGFzcyBFeHBlY3RlZENsaXBJdGVtIHsKICAgICAgICAgQ2hhclNlcXVlbmNlIG1UZXh0OwogICAgICAgICBJbnRlbnQgbUludGVudDsKQEAgLTIwMCw3ICsyNDksNyBAQAogICAgICAgICAgICAgU3RyaW5nIGV4cGVjdGVkTGFiZWwsCiAgICAgICAgICAgICBTdHJpbmdbXSBleHBlY3RlZE1pbWVUeXBlcywKICAgICAgICAgICAgIEV4cGVjdGVkQ2xpcEl0ZW0uLi4gZXhwZWN0ZWRDbGlwSXRlbXMpIHsKLSAgICAgICAgQ2xpcGJvYXJkTWFuYWdlciBjbGlwYm9hcmRNYW5hZ2VyID0gbWFrZUNsaXBib2FyZE1hbmFnZXIoKTsKKyAgICAgICAgQ2xpcGJvYXJkTWFuYWdlciBjbGlwYm9hcmRNYW5hZ2VyID0gbUNsaXBib2FyZE1hbmFnZXI7CiAKICAgICAgICAgY2xpcGJvYXJkTWFuYWdlci5zZXRQcmltYXJ5Q2xpcChjbGlwRGF0YSk7CiAgICAgICAgIGFzc2VydFRydWUoY2xpcGJvYXJkTWFuYWdlci5oYXNQcmltYXJ5Q2xpcCgpKTsKQEAgLTIyMyw3ICsyNzIsNyBAQAogICAgICAgICAgICAgICAgIGV4cGVjdGVkTGFiZWwsIGV4cGVjdGVkTWltZVR5cGVzKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0Q2xpcERhdGEoQ2xpcERhdGEgYWN0dWFsRGF0YSwgU3RyaW5nIGV4cGVjdGVkTGFiZWwsCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRDbGlwRGF0YShDbGlwRGF0YSBhY3R1YWxEYXRhLCBTdHJpbmcgZXhwZWN0ZWRMYWJlbCwKICAgICAgICAgICAgIFN0cmluZ1tdIGV4cGVjdGVkTWltZVR5cGVzLCBFeHBlY3RlZENsaXBJdGVtLi4uIGV4cGVjdGVkQ2xpcEl0ZW1zKSB7CiAgICAgICAgIGlmIChleHBlY3RlZENsaXBJdGVtcyAhPSBudWxsKSB7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRDbGlwSXRlbXMubGVuZ3RoLCBhY3R1YWxEYXRhLmdldEl0ZW1Db3VudCgpKTsKQEAgLTIzNyw3ICsyODYsNyBAQAogICAgICAgICBhc3NlcnRDbGlwRGVzY3JpcHRpb24oYWN0dWFsRGF0YS5nZXREZXNjcmlwdGlvbigpLCBleHBlY3RlZExhYmVsLCBleHBlY3RlZE1pbWVUeXBlcyk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydENsaXBEZXNjcmlwdGlvbihDbGlwRGVzY3JpcHRpb24gZGVzY3JpcHRpb24sIFN0cmluZyBleHBlY3RlZExhYmVsLAorICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0Q2xpcERlc2NyaXB0aW9uKENsaXBEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiwgU3RyaW5nIGV4cGVjdGVkTGFiZWwsCiAgICAgICAgICAgICBTdHJpbmcuLi4gbWltZVR5cGVzKSB7CiAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZExhYmVsLCBkZXNjcmlwdGlvbi5nZXRMYWJlbCgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKG1pbWVUeXBlcy5sZW5ndGgsIGRlc2NyaXB0aW9uLmdldE1pbWVUeXBlQ291bnQoKSk7CkBAIC0yNDcsNyArMjk2LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRDbGlwSXRlbShFeHBlY3RlZENsaXBJdGVtIGV4cGVjdGVkSXRlbSwgSXRlbSBpdGVtKSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRDbGlwSXRlbShFeHBlY3RlZENsaXBJdGVtIGV4cGVjdGVkSXRlbSwgSXRlbSBpdGVtKSB7CiAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZEl0ZW0ubVRleHQsIGl0ZW0uZ2V0VGV4dCgpKTsKICAgICAgICAgaWYgKGV4cGVjdGVkSXRlbS5tSW50ZW50ICE9IG51bGwpIHsKICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoaXRlbS5nZXRJbnRlbnQoKSk7CkBAIC0yNjAsOCArMzA5LDQgQEAKICAgICAgICAgICAgIGFzc2VydE51bGwoaXRlbS5nZXRVcmkoKSk7CiAgICAgICAgIH0KICAgICB9Ci0KLSAgICBwcml2YXRlIENsaXBib2FyZE1hbmFnZXIgbWFrZUNsaXBib2FyZE1hbmFnZXIoKSB7Ci0gICAgICAgIHJldHVybiAoQ2xpcGJvYXJkTWFuYWdlcikgbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkNMSVBCT0FSRF9TRVJWSUNFKTsKLSAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9jb250ZW50L3NyYy9hbmRyb2lkL2NvbnRlbnQvY3RzL0NvbnRlbnRQcm92aWRlckN1cnNvcldpbmRvd1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvc3JjL2FuZHJvaWQvY29udGVudC9jdHMvQ29udGVudFByb3ZpZGVyQ3Vyc29yV2luZG93VGVzdC5qYXZhCmluZGV4IDVjZmQ1MzIuLjRkNTM3OGMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvc3JjL2FuZHJvaWQvY29udGVudC9jdHMvQ29udGVudFByb3ZpZGVyQ3Vyc29yV2luZG93VGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvc3JjL2FuZHJvaWQvY29udGVudC9jdHMvQ29udGVudFByb3ZpZGVyQ3Vyc29yV2luZG93VGVzdC5qYXZhCkBAIC0xNiw5ICsxNiw3IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5jb250ZW50LmN0czsKIAotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yV2luZG93QWxsb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwogaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5TZWN1cml0eVRlc3Q7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKQEAgLTMyLDMzICszMCwxMyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQ29udGVudFByb3ZpZGVyQ3Vyc29yV2luZG93VGVzdCI7CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0UXVlcnkoKSB7Ci0gICAgICAgIC8vIEZpcnN0IGNoZWNrIGlmIHRoZSBzeXN0ZW0gaGFzIGEgcGF0Y2ggZm9yIGVuZm9yY2luZyBwcm90ZWN0ZWQgUGFyY2VsIGRhdGEKLSAgICAgICAgQ3Vyc29yIGN1cnNvcjsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGN1cnNvciA9IGdldENvbnRleHQoKS5nZXRDb250ZW50UmVzb2x2ZXIoKS5xdWVyeSgKKyAgICAgICAgICAgIGdldENvbnRleHQoKS5nZXRDb250ZW50UmVzb2x2ZXIoKS5xdWVyeSgKICAgICAgICAgICAgICAgICAgICAgVXJpLnBhcnNlKCJjb250ZW50Oi8vY3Vyc29yd2luZG93LnByb3ZpZGVyL2hlbGxvIiksCiAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICAgICAgZmFpbCgiUmVhZGluZyBmcm9tIG1hbGZvcm1lZCBQYXJjZWwgc2hvdWxkIGZhaWwgZHVlIHRvIGludmFsaWQgb2Zmc2V0IHVzZWQiKTsKICAgICAgICAgfSBjYXRjaCAoQ3Vyc29yV2luZG93QWxsb2NhdGlvbkV4Y2VwdGlvbiBleHBlY3RlZCkgewogICAgICAgICAgICAgTG9nLmkoVEFHLCAiRXhwZWN0ZWQgZXhjZXB0aW9uOiAiICsgZXhwZWN0ZWQpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgdGhlIHN5c3RlbSBoYXMgbm8gcGF0Y2ggZm9yIHByb3RlY3RlZCBQYXJjZWwgZGF0YSwKLSAgICAgICAgLy8gaXQgc2hvdWxkIHN0aWxsIGZhaWwgd2hpbGUgcmVhZGluZyBmcm9tIHRoZSBjdXJzb3IKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGN1cnNvci5tb3ZlVG9GaXJzdCgpOwotCi0gICAgICAgICAgICBpbnQgdHlwZSA9IGN1cnNvci5nZXRUeXBlKDApOwotICAgICAgICAgICAgaWYgKHR5cGUgIT0gQ3Vyc29yLkZJRUxEX1RZUEVfQkxPQikgewotICAgICAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgdHlwZSAiICsgdHlwZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBieXRlW10gYmxvYiA9IGN1cnNvci5nZXRCbG9iKDApOwotICAgICAgICAgICAgTG9nLmkoVEFHLCAgIkJsb2IgbGVuZ3RoICIgKyBibG9iLmxlbmd0aCk7Ci0gICAgICAgICAgICBmYWlsKCJnZXRCbG9iIHNob3VsZCBmYWlsIGR1ZSB0byBpbnZhbGlkIG9mZnNldCB1c2VkIGluIHRoZSBmaWVsZCBzbG90Iik7Ci0gICAgICAgIH0gY2F0Y2ggKFNRTGl0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgewotICAgICAgICAgICAgTG9nLmkoVEFHLCAiRXhwZWN0ZWQgZXhjZXB0aW9uOiAiICsgZXhwZWN0ZWQpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgY3Vyc29yLmNsb3NlKCk7CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9jb250ZW50L3NyYy9hbmRyb2lkL2NvbnRlbnQvY3RzL0NvbnRleHRNb3JlVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvY29udGVudC9zcmMvYW5kcm9pZC9jb250ZW50L2N0cy9Db250ZXh0TW9yZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDViYzQzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvY29udGVudC9zcmMvYW5kcm9pZC9jb250ZW50L2N0cy9Db250ZXh0TW9yZVRlc3QuamF2YQpAQCAtMCwwICsxLDE0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQuY29udGVudC5jdHM7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHRXcmFwcGVyOworaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CitpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLkxhcmdlVGVzdDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKKworcHVibGljIGNsYXNzIENvbnRleHRNb3JlVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJDb250ZXh0TW9yZVRlc3QiOworCisgICAgLyoqCisgICAgICogVGVzdCBmb3Ige0BsaW5rIENvbnRleHQjZ2V0U3lzdGVtU2VydmljZSl9LgorICAgICAqCisgICAgICogQ2FsbCBpdCByZXBlYXRlZGx5IGZyb20gbXVsdGlwbGUgdGhyZWFkcywgYW5kOgorICAgICAqIC0gTWFrZSBzdXJlIGdldFN5c3RlbVNlcnZpY2UoQWN0aXZpdHlNYW5hZ2VyKSB3aWxsIGFsd2F5cyByZXR1cm4gbm9uLW51bGwuCisgICAgICogLSBJZiBDb250ZXh0SW1wbC5tU2VydmljZUNhY2hlIGlzIGFjY2Vzc2libGUgdmlhIHJlZmxlY3Rpb24sIGNsZWFyIGl0IG9uY2UgaW4gYSB3aGlsZSBhbmQKKyAgICAgKiBtYWtlIHN1cmUgZ2V0U3lzdGVtU2VydmljZSgpIHN0aWxsIHJldHVybnMgbm9uLW51bGwuCisgICAgICovCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTeXN0ZW1TZXJ2aWNlX211bHRpVGhyZWFkZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gIyBvZiB0aW1lcyB0aGUgdGVzdGVyIFJ1bm5hYmxlIGhhcyBiZWVuIGV4ZWN1dGVkLgorICAgICAgICBmaW5hbCBBdG9taWNJbnRlZ2VyIHRvdGFsQ291bnQgPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKKworICAgICAgICAvLyAjIG9mIHRpbWVzIHRoZSB0ZXN0ZXIgUnVubmFibGUgaGFzIGZhaWxlZC4KKyAgICAgICAgZmluYWwgQXRvbWljSW50ZWdlciBmYWlsQ291bnQgPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKKworICAgICAgICAvLyBSdW4gdGhlIHRocmVhZHMgdW50aWwgdGhpcyBiZWNvbWVzIHRydWUuCisgICAgICAgIGZpbmFsIEF0b21pY0Jvb2xlYW4gc3RvcCA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKKworICAgICAgICBmaW5hbCBDb250ZXh0IGNvbnRleHQgPSBnZXRDb250ZXh0KCk7CisgICAgICAgIGZpbmFsIE9iamVjdFtdIHNlcnZpY2VDYWNoZSA9IGZpbmRTZXJ2aWNlQ2FjaGUoY29udGV4dCk7CisgICAgICAgIGlmIChzZXJ2aWNlQ2FjaGUgPT0gbnVsbCkgeworICAgICAgICAgICAgTG9nLncoVEFHLCAibVNlcnZpY2VDYWNoZSBub3QgZm91bmQuIik7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBSdW5uYWJsZSB0ZXN0ZXIgPSAoKSAtPiB7CisgICAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHBhc3MgPSB0b3RhbENvdW50LmluY3JlbWVudEFuZEdldCgpOworCisgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IHNlcnZpY2UgPSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQWN0aXZpdHlNYW5hZ2VyLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBpZiAoc2VydmljZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZhaWxDb3VudC5pbmNyZW1lbnRBbmRHZXQoKTsgLy8gRmFpbCEKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoc3RvcC5nZXQoKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gWWllbGQgdGhlIENQVS4KKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIE9uY2UgaW4gYSB3aGlsZSwgZm9yY2UgY2xlYXIgbVNlcnZpY2VDYWNoZS4KKyAgICAgICAgICAgICAgICBpZiAoKHNlcnZpY2VDYWNoZSAhPSBudWxsKSAmJiAoKHBhc3MgJSA3KSA9PSAwKSkgeworICAgICAgICAgICAgICAgICAgICBBcnJheXMuZmlsbChzZXJ2aWNlQ2FjaGUsIG51bGwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBmaW5hbCBpbnQgTlVNX1RIUkVBRFMgPSAyMDsKKworICAgICAgICAvLyBDcmVhdGUgYW5kIHN0YXJ0IHRoZSB0aHJlYWRzLi4uCisgICAgICAgIGZpbmFsIFRocmVhZFtdIHRocmVhZHMgPSBuZXcgVGhyZWFkW05VTV9USFJFQURTXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fVEhSRUFEUzsgaSsrKSB7CisgICAgICAgICAgICB0aHJlYWRzW2ldID0gbmV3IFRocmVhZCh0ZXN0ZXIpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1RIUkVBRFM7IGkrKykgeworICAgICAgICAgICAgdGhyZWFkc1tpXS5zdGFydCgpOworICAgICAgICB9CisKKyAgICAgICAgVGhyZWFkLnNsZWVwKDEwICogMTAwMCk7CisKKyAgICAgICAgc3RvcC5zZXQodHJ1ZSk7CisKKyAgICAgICAgLy8gV2FpdCBmb3IgdGhlbSB0byBzdG9wLi4uCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1RIUkVBRFM7IGkrKykgeworICAgICAgICAgICAgdGhyZWFkc1tpXS5qb2luKCk7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgZmFpbENvdW50LmdldCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgidG90YWxDb3VudCBtdXN0IGJlIGJpZ2dlciB0aGFuICIgKyBOVU1fVEhSRUFEUworICAgICAgICAgICAgICAgICsgIiBidXQgd2FzICIgKyB0b3RhbENvdW50LmdldCgpLCB0b3RhbENvdW50LmdldCgpID4gTlVNX1RIUkVBRFMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgYSBmaWVsZCBieSBuYW1lIHVzaW5nIHJlZmxlY3Rpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IHJlYWRGaWVsZChPYmplY3QgaW5zdGFuY2UsIFN0cmluZyBmaWVsZE5hbWUpIHsKKyAgICAgICAgZmluYWwgRmllbGQgZjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGYgPSBpbnN0YW5jZS5nZXRDbGFzcygpLmdldERlY2xhcmVkRmllbGQoZmllbGROYW1lKTsKKyAgICAgICAgICAgIGYuc2V0QWNjZXNzaWJsZSh0cnVlKTsKKyAgICAgICAgICAgIGZpbmFsIE9iamVjdCByZXQgPSBmLmdldChpbnN0YW5jZSk7CisgICAgICAgICAgICBpZiAocmV0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIHwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRyeSB0byBmaW5kIHRoZSBtU2VydmljZUNhY2hlIGZpZWxkIGZyb20gYSBDb250ZXh0LiBSZXR1cm5zIG51bGwgaWYgbm9uZSBmb3VuZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBPYmplY3RbXSBmaW5kU2VydmljZUNhY2hlKENvbnRleHQgY29udGV4dCkgeworICAgICAgICAvLyBGaW5kIHRoZSBiYXNlIGNvbnRleHQuCisgICAgICAgIHdoaWxlIChjb250ZXh0IGluc3RhbmNlb2YgQ29udGV4dFdyYXBwZXIpIHsKKyAgICAgICAgICAgIGNvbnRleHQgPSAoKENvbnRleHRXcmFwcGVyKSBjb250ZXh0KS5nZXRCYXNlQ29udGV4dCgpOworICAgICAgICB9CisgICAgICAgIC8vIFRyeSB0byBmaW5kIHRoZSBtU2VydmljZUNhY2hlIGZpZWxkLgorICAgICAgICBmaW5hbCBPYmplY3Qgc2VydmljZUNhY2hlID0gcmVhZEZpZWxkKGNvbnRleHQsICJtU2VydmljZUNhY2hlIik7CisgICAgICAgIGlmIChzZXJ2aWNlQ2FjaGUgaW5zdGFuY2VvZiBPYmplY3RbXSkgeworICAgICAgICAgICAgcmV0dXJuIChPYmplY3RbXSkgc2VydmljZUNhY2hlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvc3JjL2FuZHJvaWQvY29udGVudC9jdHMvQ29udGV4dFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvc3JjL2FuZHJvaWQvY29udGVudC9jdHMvQ29udGV4dFRlc3QuamF2YQppbmRleCAwZDljNTZkLi5mODRjNzcxIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9jb250ZW50L3NyYy9hbmRyb2lkL2NvbnRlbnQvY3RzL0NvbnRleHRUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvY29udGVudC9zcmMvYW5kcm9pZC9jb250ZW50L2N0cy9Db250ZXh0VGVzdC5qYXZhCkBAIC0xNyw3ICsxNyw2IEBACiBwYWNrYWdlIGFuZHJvaWQuY29udGVudC5jdHM7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuY3RzLnV0aWwuWG1sVXRpbHM7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db2xvclN0YXRlTGlzdDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcy5Ob3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcy5UaGVtZTsKQEAgLTI1LDEyICsyNCwxNSBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuWG1sUmVzb3VyY2VQYXJzZXI7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2U7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwogaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5YbWw7CiBpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7CiAKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyOwogaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CkBAIC0zMzUsNiArMzM3LDIxIEBACiAgICAgICAgIGFzc2VydFZhbGlkRmlsZShsb25nRmlsZSk7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgdGVzdE1haW5Mb29wZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgVGhyZWFkIG1haW5UaHJlYWQgPSBMb29wZXIuZ2V0TWFpbkxvb3BlcigpLmdldFRocmVhZCgpOworICAgICAgICBmaW5hbCBIYW5kbGVyIGhhbmRsZXIgPSBuZXcgSGFuZGxlcihtQ29udGV4dC5nZXRNYWluTG9vcGVyKCkpOworICAgICAgICBoYW5kbGVyLnBvc3QoKCkgLT4geworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG1haW5UaHJlYWQsIFRocmVhZC5jdXJyZW50VGhyZWFkKCkpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFpbkV4ZWN1dG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFRocmVhZCBtYWluVGhyZWFkID0gTG9vcGVyLmdldE1haW5Mb29wZXIoKS5nZXRUaHJlYWQoKTsKKyAgICAgICAgbUNvbnRleHQuZ2V0TWFpbkV4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobWFpblRocmVhZCwgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSk7CisgICAgICAgIH0pOworICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCBhc3NlcnRWYWxpZEZpbGUoRmlsZSBmaWxlKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgTG9nLmQoVEFHLCAiQ2hlY2tpbmcgIiArIGZpbGUpOwogICAgICAgICBhc3NlcnRUcnVlKCJGYWlsZWQgdG8gY3JlYXRlICIgKyBmaWxlLCBmaWxlLmNyZWF0ZU5ld0ZpbGUoKSk7CkBAIC0zNDUsMTIgKzM2MiwzMSBAQAogICAgICAgICBhc3NlcnRUcnVlKCJGYWlsZWQgdG8gZGVsZXRlIGFmdGVyIHN0cmVhbSAiICsgZmlsZSwgZmlsZS5kZWxldGUoKSk7CiAgICAgfQogCisgICAgc3RhdGljIHZvaWQgYmVnaW5Eb2N1bWVudChYbWxQdWxsUGFyc2VyIHBhcnNlciwgU3RyaW5nIGZpcnN0RWxlbWVudE5hbWUpCisgICAgICAgICAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGludCB0eXBlOworICAgICAgICB3aGlsZSAoKHR5cGU9cGFyc2VyLm5leHQoKSkgIT0gcGFyc2VyLlNUQVJUX1RBRworICAgICAgICAgICAgICAgICYmIHR5cGUgIT0gcGFyc2VyLkVORF9ET0NVTUVOVCkgeworICAgICAgICAgICAgOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHR5cGUgIT0gcGFyc2VyLlNUQVJUX1RBRykgeworICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFB1bGxQYXJzZXJFeGNlcHRpb24oIk5vIHN0YXJ0IHRhZyBmb3VuZCIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFwYXJzZXIuZ2V0TmFtZSgpLmVxdWFscyhmaXJzdEVsZW1lbnROYW1lKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFB1bGxQYXJzZXJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3RhcnQgdGFnOiBmb3VuZCAiICsgcGFyc2VyLmdldE5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICIsIGV4cGVjdGVkICIgKyBmaXJzdEVsZW1lbnROYW1lKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHByaXZhdGUgQXR0cmlidXRlU2V0IGdldEF0dHJpYnV0ZVNldChpbnQgcmVzb3VyY2VJZCkgewogICAgICAgICBmaW5hbCBYbWxSZXNvdXJjZVBhcnNlciBwYXJzZXIgPSBnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0WG1sKAogICAgICAgICAgICAgICAgIHJlc291cmNlSWQpOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBYbWxVdGlscy5iZWdpbkRvY3VtZW50KHBhcnNlciwgIlJlbGF0aXZlTGF5b3V0Iik7CisgICAgICAgICAgICBiZWdpbkRvY3VtZW50KHBhcnNlciwgIlJlbGF0aXZlTGF5b3V0Iik7CiAgICAgICAgIH0gY2F0Y2ggKFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvY29udGVudC9zcmMvYW5kcm9pZC9jb250ZW50L2N0cy9Db250ZXh0V3JhcHBlclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvc3JjL2FuZHJvaWQvY29udGVudC9jdHMvQ29udGV4dFdyYXBwZXJUZXN0LmphdmEKaW5kZXggMTE4MDA3Ny4uYTAxZTllMCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvY29udGVudC9zcmMvYW5kcm9pZC9jb250ZW50L2N0cy9Db250ZXh0V3JhcHBlclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9jb250ZW50L3NyYy9hbmRyb2lkL2NvbnRlbnQvY3RzL0NvbnRleHRXcmFwcGVyVGVzdC5qYXZhCkBAIC00MCw2ICs0MCw3IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuUHJvY2VzczsKIGltcG9ydCBhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKQEAgLTU3LDggKzU4LDYgQEAKICAqIFRlc3Qge0BsaW5rIENvbnRleHRXcmFwcGVyfS4KICAqLwogcHVibGljIGNsYXNzIENvbnRleHRXcmFwcGVyVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUk1JU1NJT05fSEFSRFdBUkVfVEVTVCA9ICJhbmRyb2lkLnBlcm1pc3Npb24uSEFSRFdBUkVfVEVTVCI7Ci0KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUVUFMX1JFU1VMVCA9ICJSZXN1bHRTZXRCeVJlY2VpdmVyIjsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlRJQUxfUkVTVUxUID0gIkludGlhbFJlc3VsdCI7CkBAIC04MCwxMCArNzksMTMgQEAKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTU9DS19BQ1RJT04xID0gQUNUSU9OX0JST0FEQ0FTVF9URVNUT1JERVIgKyAiMSI7CiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIE1PQ0tfQUNUSU9OMiA9IEFDVElPTl9CUk9BRENBU1RfVEVTVE9SREVSICsgIjIiOwogCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSTUlTU0lPTl9HUkFOVEVEID0gImFuZHJvaWQuY29udGVudC5jdHMucGVybWlzc2lvbi5URVNUX0dSQU5URUQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUk1JU1NJT05fREVOSUVEID0gImFuZHJvaWQuY29udGVudC5jdHMucGVybWlzc2lvbi5URVNUX0RFTklFRCI7CisgICAgLy8gQSBwZXJtaXNzaW9uIHRoYXQncyBncmFudGVkIHRvIHRoaXMgdGVzdCBwYWNrYWdlLgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdSQU5URURfUEVSTUlTU0lPTiA9ICJhbmRyb2lkLnBlcm1pc3Npb24uVVNFX0NSRURFTlRJQUxTIjsKKyAgICAvLyBBIHBlcm1pc3Npb24gdGhhdCdzIG5vdCBncmFudGVkIHRvIHRoaXMgdGVzdCBwYWNrYWdlLgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVF9HUkFOVEVEX1BFUk1JU1NJT04gPSAiYW5kcm9pZC5wZXJtaXNzaW9uLkhBUkRXQVJFX1RFU1QiOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJST0FEQ0FTVF9USU1FT1VUID0gMTAwMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJPT1RfVUlEID0gMDsKIAogICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKIApAQCAtMTM0LDE3ICsxMzYsNiBAQAogICAgICAgICBuZXcgQ29udGV4dFdyYXBwZXIobnVsbCk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgdGVzdEVuZm9yY2VDYWxsaW5nUGVybWlzc2lvbigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1Db250ZXh0V3JhcHBlci5lbmZvcmNlQ2FsbGluZ1Blcm1pc3Npb24oCi0gICAgICAgICAgICAgICAgICAgIFBFUk1JU1NJT05fSEFSRFdBUkVfVEVTVCwKLSAgICAgICAgICAgICAgICAgICAgImVuZm9yY2VDYWxsaW5nUGVybWlzc2lvbiBpcyBub3Qgd29ya2luZyB3aXRob3V0IHBvc3Nlc3NpbmcgYW4gSVBDLiIpOwotICAgICAgICAgICAgZmFpbCgiZW5mb3JjZUNhbGxpbmdQZXJtaXNzaW9uIGlzIG5vdCB3b3JraW5nIHdpdGhvdXQgcG9zc2Vzc2luZyBhbiBJUEMuIik7Ci0gICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIEN1cnJlbnRseSBubyBJUEMgaXMgaGFuZGxlZCBieSB0aGlzIHByb2Nlc3MsIHRoaXMgZXhjZXB0aW9uIGlzIGV4cGVjdGVkCi0gICAgICAgIH0KLSAgICB9Ci0KICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZE9yZGVyZWRCcm9hZGNhc3QxKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgSGlnaFByaW9yaXR5QnJvYWRjYXN0UmVjZWl2ZXIgaGlnaFByaW9yaXR5UmVjZWl2ZXIgPQogICAgICAgICAgICAgICAgIG5ldyBIaWdoUHJpb3JpdHlCcm9hZGNhc3RSZWNlaXZlcigpOwpAQCAtMjczLDE3ICsyNjQsNiBAQAogICAgICAgICBtQ29udGV4dFdyYXBwZXIudW5yZWdpc3RlclJlY2VpdmVyKGJyb2FkY2FzdFJlY2VpdmVyKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgbUNvbnRleHRXcmFwcGVyLmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihQRVJNSVNTSU9OX0hBUkRXQVJFX1RFU1QsCi0gICAgICAgICAgICAgICAgICAgICJlbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24gaXMgbm90IHdvcmtpbmcgd2l0aG91dCBwb3NzZXNzaW5nIGFuIElQQy4iKTsKLSAgICAgICAgICAgIGZhaWwoImVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbiBpcyBub3Qgd29ya2luZyB3aXRob3V0IHBvc3Nlc3NpbmcgYW4gSVBDLiIpOwotICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBJZiB0aGUgZnVuY3Rpb24gaXMgT0ssIGl0IHNob3VsZCB0aHJvdyBhIFNlY3VyaXR5RXhjZXB0aW9uIGhlcmUgYmVjYXVzZSBjdXJyZW50bHkgbm8KLSAgICAgICAgICAgIC8vIElQQyBpcyBoYW5kbGVkIGJ5IHRoaXMgcHJvY2Vzcy4KLSAgICAgICAgfQotICAgIH0KLQogICAgIHB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NXYWxscGFwZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKICAgICAgICAgLy8gc2V0IFdhbGxwYXBlciBieSBjb250ZXh0V3JhcHBlciNzZXRXYWxscGFwZXIoQml0bWFwKQogICAgICAgICBCaXRtYXAgYml0bWFwID0gQml0bWFwLmNyZWF0ZUJpdG1hcCgyMCwgMzAsIEJpdG1hcC5Db25maWcuUkdCXzU2NSk7CkBAIC0zNDcsMTEgKzMyNywxMSBAQAogCiAgICAgICAgIC8vIFRlc3Qgb3Blbk9yQ3JlYXRlRGF0YWJhc2Ugd2l0aCBudWxsIGFuZCBhY3R1YWwgZmFjdG9yeQogICAgICAgICBtRGF0YWJhc2UgPSBtQ29udGV4dFdyYXBwZXIub3Blbk9yQ3JlYXRlRGF0YWJhc2UoREFUQUJBU0VfTkFNRTEsCi0gICAgICAgICAgICAgICAgQ29udGV4dFdyYXBwZXIuTU9ERV9QUklWQVRFLCBmYWN0b3J5KTsKKyAgICAgICAgICAgICAgICBDb250ZXh0V3JhcHBlci5NT0RFX0VOQUJMRV9XUklURV9BSEVBRF9MT0dHSU5HLCBmYWN0b3J5KTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChtRGF0YWJhc2UpOwogICAgICAgICBtRGF0YWJhc2UuY2xvc2UoKTsKICAgICAgICAgbURhdGFiYXNlID0gbUNvbnRleHRXcmFwcGVyLm9wZW5PckNyZWF0ZURhdGFiYXNlKERBVEFCQVNFX05BTUUyLAotICAgICAgICAgICAgICAgIENvbnRleHRXcmFwcGVyLk1PREVfUFJJVkFURSwgZmFjdG9yeSk7CisgICAgICAgICAgICAgICAgQ29udGV4dFdyYXBwZXIuTU9ERV9FTkFCTEVfV1JJVEVfQUhFQURfTE9HR0lORywgZmFjdG9yeSk7CiAgICAgICAgIGFzc2VydE5vdE51bGwobURhdGFiYXNlKTsKICAgICAgICAgbURhdGFiYXNlLmNsb3NlKCk7CiAKQEAgLTM4OSw4ICszNjksOCBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RFbmZvcmNlVXJpUGVybWlzc2lvbjIoKSB7CiAgICAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2UoImNvbnRlbnQ6Ly9jdHN0ZXN0Iik7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtQ29udGV4dFdyYXBwZXIuZW5mb3JjZVVyaVBlcm1pc3Npb24odXJpLCBQRVJNSVNTSU9OX0hBUkRXQVJFX1RFU1QsCi0gICAgICAgICAgICAgICAgICAgIFBFUk1JU1NJT05fSEFSRFdBUkVfVEVTVCwgQmluZGVyLmdldENhbGxpbmdQaWQoKSwgQmluZGVyLmdldENhbGxpbmdVaWQoKSwKKyAgICAgICAgICAgIG1Db250ZXh0V3JhcHBlci5lbmZvcmNlVXJpUGVybWlzc2lvbih1cmksIE5PVF9HUkFOVEVEX1BFUk1JU1NJT04sCisgICAgICAgICAgICAgICAgICAgIE5PVF9HUkFOVEVEX1BFUk1JU1NJT04sIEJpbmRlci5nZXRDYWxsaW5nUGlkKCksIEJpbmRlci5nZXRDYWxsaW5nVWlkKCksCiAgICAgICAgICAgICAgICAgICAgIEludGVudC5GTEFHX0dSQU5UX1dSSVRFX1VSSV9QRVJNSVNTSU9OLAogICAgICAgICAgICAgICAgICAgICAiZW5mb3JjZVVyaVBlcm1pc3Npb24gaXMgbm90IHdvcmtpbmcgd2l0aG91dCBwb3NzZXNzaW5nIGFuIElQQy4iKTsKICAgICAgICAgICAgIGZhaWwoImVuZm9yY2VVcmlQZXJtaXNzaW9uIGlzIG5vdCB3b3JraW5nIHdpdGhvdXQgcG9zc2Vzc2luZyBhbiBJUEMuIik7CkBAIC01NjksMTYgKzU0OSw5NiBAQAogICAgICAgICAgICAgICAgIEludGVudC5GTEFHX0dSQU5UX1dSSVRFX1VSSV9QRVJNSVNTSU9OKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW5mb3JjZVBlcm1pc3Npb24oKSB7CisgICAgcHVibGljIHZvaWQgdGVzdENoZWNrUGVybWlzc2lvbkdyYW50ZWQoKSB7CisgICAgICAgIGludCByZXR1cm5WYWx1ZSA9IG1Db250ZXh0V3JhcHBlci5jaGVja1Blcm1pc3Npb24oCisgICAgICAgICAgICAgICAgR1JBTlRFRF9QRVJNSVNTSU9OLCBQcm9jZXNzLm15UGlkKCksIFByb2Nlc3MubXlVaWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhQYWNrYWdlTWFuYWdlci5QRVJNSVNTSU9OX0dSQU5URUQsIHJldHVyblZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tQZXJtaXNzaW9uTm90R3JhbnRlZCgpIHsKKyAgICAgICAgaW50IHJldHVyblZhbHVlID0gbUNvbnRleHRXcmFwcGVyLmNoZWNrUGVybWlzc2lvbigKKyAgICAgICAgICAgICAgICBOT1RfR1JBTlRFRF9QRVJNSVNTSU9OLCBQcm9jZXNzLm15UGlkKCksIFByb2Nlc3MubXlVaWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhQYWNrYWdlTWFuYWdlci5QRVJNSVNTSU9OX0RFTklFRCwgcmV0dXJuVmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDaGVja1Blcm1pc3Npb25Sb290VXNlcigpIHsKKyAgICAgICAgLy8gVGVzdCB3aXRoIHJvb3QgdXNlciwgZXZlcnl0aGluZyB3aWxsIGJlIGdyYW50ZWQuCisgICAgICAgIGludCByZXR1cm5WYWx1ZSA9IG1Db250ZXh0V3JhcHBlci5jaGVja1Blcm1pc3Npb24oTk9UX0dSQU5URURfUEVSTUlTU0lPTiwgMSwgUk9PVF9VSUQpOworICAgICAgICBhc3NlcnRFcXVhbHMoUGFja2FnZU1hbmFnZXIuUEVSTUlTU0lPTl9HUkFOVEVELCByZXR1cm5WYWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENoZWNrUGVybWlzc2lvbkludmFsaWRSZXF1ZXN0KCkgeworICAgICAgICAvLyBUZXN0IHdpdGggbnVsbCBwZXJtaXNzaW9uLgorICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IHJldHVyblZhbHVlID0gbUNvbnRleHRXcmFwcGVyLmNoZWNrUGVybWlzc2lvbihudWxsLCAwLCBST09UX1VJRCk7CisgICAgICAgICAgICBmYWlsKCJjaGVja1Blcm1pc3Npb24gc2hvdWxkIG5vdCBhY2NlcHQgbnVsbCBwZXJtaXNzaW9uIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKworICAgICAgICAvLyBUZXN0IHdpdGggaW52YWxpZCB1aWQgYW5kIGluY2x1ZGVkIGdyYW50ZWQgcGVybWlzc2lvbi4KKyAgICAgICAgaW50IHJldHVyblZhbHVlID0gbUNvbnRleHRXcmFwcGVyLmNoZWNrUGVybWlzc2lvbihHUkFOVEVEX1BFUk1JU1NJT04sIDEsIC0xMSk7CisgICAgICAgIGFzc2VydEVxdWFscyhQYWNrYWdlTWFuYWdlci5QRVJNSVNTSU9OX0RFTklFRCwgcmV0dXJuVmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDaGVja1NlbGZQZXJtaXNzaW9uR3JhbnRlZCgpIHsKKyAgICAgICAgaW50IHJldHVyblZhbHVlID0gbUNvbnRleHRXcmFwcGVyLmNoZWNrU2VsZlBlcm1pc3Npb24oR1JBTlRFRF9QRVJNSVNTSU9OKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFBhY2thZ2VNYW5hZ2VyLlBFUk1JU1NJT05fR1JBTlRFRCwgcmV0dXJuVmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDaGVja1NlbGZQZXJtaXNzaW9uTm90R3JhbnRlZCgpIHsKKyAgICAgICAgaW50IHJldHVyblZhbHVlID0gbUNvbnRleHRXcmFwcGVyLmNoZWNrU2VsZlBlcm1pc3Npb24oTk9UX0dSQU5URURfUEVSTUlTU0lPTik7CisgICAgICAgIGFzc2VydEVxdWFscyhQYWNrYWdlTWFuYWdlci5QRVJNSVNTSU9OX0RFTklFRCwgcmV0dXJuVmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RFbmZvcmNlUGVybWlzc2lvbkdyYW50ZWQoKSB7CisgICAgICAgIG1Db250ZXh0V3JhcHBlci5lbmZvcmNlUGVybWlzc2lvbigKKyAgICAgICAgICAgICAgICBHUkFOVEVEX1BFUk1JU1NJT04sIFByb2Nlc3MubXlQaWQoKSwgUHJvY2Vzcy5teVVpZCgpLAorICAgICAgICAgICAgICAgICJwZXJtaXNzaW9uIGlzbid0IGdyYW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW5mb3JjZVBlcm1pc3Npb25Ob3RHcmFudGVkKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgbUNvbnRleHRXcmFwcGVyLmVuZm9yY2VQZXJtaXNzaW9uKAotICAgICAgICAgICAgICAgICAgICBQRVJNSVNTSU9OX0hBUkRXQVJFX1RFU1QsIEJpbmRlci5nZXRDYWxsaW5nUGlkKCksCi0gICAgICAgICAgICAgICAgICAgIEJpbmRlci5nZXRDYWxsaW5nVWlkKCksCi0gICAgICAgICAgICAgICAgICAgICJlbmZvcmNlUGVybWlzc2lvbiBpcyBub3Qgd29ya2luZyB3aXRob3V0IHBvc3Nlc3NpbmcgYW4gSVBDLiIpOwotICAgICAgICAgICAgZmFpbCgiZW5mb3JjZVBlcm1pc3Npb24gaXMgbm90IHdvcmtpbmcgd2l0aG91dCBwb3NzZXNzaW5nIGFuIElQQy4iKTsKKyAgICAgICAgICAgICAgICAgICAgTk9UX0dSQU5URURfUEVSTUlTU0lPTiwgUHJvY2Vzcy5teVBpZCgpLCBQcm9jZXNzLm15VWlkKCksCisgICAgICAgICAgICAgICAgICAgICJwZXJtaXNzaW9uIGlzbid0IGdyYW50ZWQiKTsKKyAgICAgICAgICAgIGZhaWwoIlBlcm1pc3Npb24gc2hvdWxkbid0IGJlIGdyYW50ZWQuIik7CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tDYWxsaW5nT3JTZWxmUGVybWlzc2lvbkdyYW50ZWQoKSB7CisgICAgICAgIGludCByZXRWYWx1ZSA9IG1Db250ZXh0V3JhcHBlci5jaGVja0NhbGxpbmdPclNlbGZQZXJtaXNzaW9uKEdSQU5URURfUEVSTUlTU0lPTik7CisgICAgICAgIGFzc2VydEVxdWFscyhQYWNrYWdlTWFuYWdlci5QRVJNSVNTSU9OX0dSQU5URUQsIHJldFZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uR3JhbnRlZCgpIHsKKyAgICAgICAgbUNvbnRleHRXcmFwcGVyLmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbigKKyAgICAgICAgICAgICAgICBHUkFOVEVEX1BFUk1JU1NJT04sICJwZXJtaXNzaW9uIGlzbid0IGdyYW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uTm90R3JhbnRlZCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1Db250ZXh0V3JhcHBlci5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oCisgICAgICAgICAgICAgICAgICAgIE5PVF9HUkFOVEVEX1BFUk1JU1NJT04sICJwZXJtaXNzaW9uIGlzbid0IGdyYW50ZWQiKTsKKyAgICAgICAgICAgIGZhaWwoIlBlcm1pc3Npb24gc2hvdWxkbid0IGJlIGdyYW50ZWQuIik7CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tDYWxsaW5nUGVybWlzc2lvbigpIHsKKyAgICAgICAgLy8gRGVuaWVkIGJlY2F1c2Ugbm8gSVBDIGlzIGFjdGl2ZS4KKyAgICAgICAgaW50IHJldFZhbHVlID0gbUNvbnRleHRXcmFwcGVyLmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oR1JBTlRFRF9QRVJNSVNTSU9OKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFBhY2thZ2VNYW5hZ2VyLlBFUk1JU1NJT05fREVOSUVELCByZXRWYWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEVuZm9yY2VDYWxsaW5nUGVybWlzc2lvbigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1Db250ZXh0V3JhcHBlci5lbmZvcmNlQ2FsbGluZ1Blcm1pc3Npb24oCisgICAgICAgICAgICAgICAgICAgIEdSQU5URURfUEVSTUlTU0lPTiwKKyAgICAgICAgICAgICAgICAgICAgImVuZm9yY2VDYWxsaW5nUGVybWlzc2lvbiBpcyBub3Qgd29ya2luZyB3aXRob3V0IHBvc3Nlc3NpbmcgYW4gSVBDLiIpOworICAgICAgICAgICAgZmFpbCgiZW5mb3JjZUNhbGxpbmdQZXJtaXNzaW9uIGlzIG5vdCB3b3JraW5nIHdpdGhvdXQgcG9zc2Vzc2luZyBhbiBJUEMuIik7CiAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIElmIHRoZSBmdW5jdGlvbiBpcyBvaywgaXQgc2hvdWxkIHRocm93IGEgU2VjdXJpdHlFeGNlcHRpb24gaGVyZQotICAgICAgICAgICAgLy8gYmVjYXVzZSBjdXJyZW50bHkgbm8gSVBDIGlzIGhhbmRsZWQgYnkgdGhpcyBwcm9jZXNzLgorICAgICAgICAgICAgLy8gQ3VycmVudGx5IG5vIElQQyBpcyBoYW5kbGVkIGJ5IHRoaXMgcHJvY2VzcywgdGhpcyBleGNlcHRpb24gaXMgZXhwZWN0ZWQKICAgICAgICAgfQogICAgIH0KIApAQCAtNTk3LDIyICs2NTcsMTcgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tVcmlQZXJtaXNzaW9uMigpIHsKICAgICAgICAgVXJpIHVyaSA9IFVyaS5wYXJzZSgiY29udGVudDovL2N0c3Rlc3QiKTsKIAotICAgICAgICBpbnQgcmV0VmFsdWUgPSBtQ29udGV4dFdyYXBwZXIuY2hlY2tVcmlQZXJtaXNzaW9uKHVyaSwgUEVSTUlTU0lPTl9IQVJEV0FSRV9URVNULAotICAgICAgICAgICAgICAgIFBFUk1JU1NJT05fSEFSRFdBUkVfVEVTVCwgQmluZGVyLmdldENhbGxpbmdQaWQoKSwgMCwKKyAgICAgICAgaW50IHJldFZhbHVlID0gbUNvbnRleHRXcmFwcGVyLmNoZWNrVXJpUGVybWlzc2lvbih1cmksIE5PVF9HUkFOVEVEX1BFUk1JU1NJT04sCisgICAgICAgICAgICAgICAgTk9UX0dSQU5URURfUEVSTUlTU0lPTiwgQmluZGVyLmdldENhbGxpbmdQaWQoKSwgMCwKICAgICAgICAgICAgICAgICBJbnRlbnQuRkxBR19HUkFOVF9XUklURV9VUklfUEVSTUlTU0lPTik7CiAgICAgICAgIGFzc2VydEVxdWFscyhQYWNrYWdlTWFuYWdlci5QRVJNSVNTSU9OX0dSQU5URUQsIHJldFZhbHVlKTsKIAotICAgICAgICByZXRWYWx1ZSA9IG1Db250ZXh0V3JhcHBlci5jaGVja1VyaVBlcm1pc3Npb24odXJpLCBQRVJNSVNTSU9OX0hBUkRXQVJFX1RFU1QsCi0gICAgICAgICAgICAgICAgUEVSTUlTU0lPTl9IQVJEV0FSRV9URVNULCBCaW5kZXIuZ2V0Q2FsbGluZ1BpZCgpLCBCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpLAorICAgICAgICByZXRWYWx1ZSA9IG1Db250ZXh0V3JhcHBlci5jaGVja1VyaVBlcm1pc3Npb24odXJpLCBOT1RfR1JBTlRFRF9QRVJNSVNTSU9OLAorICAgICAgICAgICAgICAgIE5PVF9HUkFOVEVEX1BFUk1JU1NJT04sIEJpbmRlci5nZXRDYWxsaW5nUGlkKCksIEJpbmRlci5nZXRDYWxsaW5nVWlkKCksCiAgICAgICAgICAgICAgICAgSW50ZW50LkZMQUdfR1JBTlRfV1JJVEVfVVJJX1BFUk1JU1NJT04pOwogICAgICAgICBhc3NlcnRFcXVhbHMoUGFja2FnZU1hbmFnZXIuUEVSTUlTU0lPTl9ERU5JRUQsIHJldFZhbHVlKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tDYWxsaW5nUGVybWlzc2lvbigpIHsKLSAgICAgICAgaW50IHJldFZhbHVlID0gbUNvbnRleHRXcmFwcGVyLmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oUEVSTUlTU0lPTl9IQVJEV0FSRV9URVNUKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFBhY2thZ2VNYW5hZ2VyLlBFUk1JU1NJT05fREVOSUVELCByZXRWYWx1ZSk7Ci0gICAgfQotCiAgICAgcHVibGljIHZvaWQgdGVzdENoZWNrQ2FsbGluZ1VyaVBlcm1pc3Npb24oKSB7CiAgICAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2UoImNvbnRlbnQ6Ly9jdHN0ZXN0Iik7CiAKQEAgLTY0MywxMiArNjk4LDYgQEAKICAgICAgICAgYXNzZXJ0U2FtZShtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpLCBtQ29udGV4dFdyYXBwZXIuZ2V0UGFja2FnZU1hbmFnZXIoKSk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgdGVzdENoZWNrQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oKSB7Ci0gICAgICAgIGludCByZXRWYWx1ZSA9IG1Db250ZXh0V3JhcHBlci5jaGVja0NhbGxpbmdPclNlbGZQZXJtaXNzaW9uKAotICAgICAgICAgICAgICAgICJhbmRyb2lkLnBlcm1pc3Npb24uU0VUX1dBTExQQVBFUiIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoUGFja2FnZU1hbmFnZXIuUEVSTUlTU0lPTl9HUkFOVEVELCByZXRWYWx1ZSk7Ci0gICAgfQotCiAgICAgcHVibGljIHZvaWQgdGVzdFNlbmRCcm9hZGNhc3QxKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgUmVzdWx0UmVjZWl2ZXIgcmVjZWl2ZXIgPSBuZXcgUmVzdWx0UmVjZWl2ZXIoKTsKIApAQCAtNjkyLDI3ICs3NDEsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgdGVzdENoZWNrUGVybWlzc2lvbigpIHsKLSAgICAgICAgLy8gVGVzdCB3aXRoIHJvb3QgdXNlciwgZXZlcnl0aGluZyB3aWxsIGJlIGdyYW50ZWQuCi0gICAgICAgIGludCByZXR1cm5WYWx1ZSA9IG1Db250ZXh0V3JhcHBlci5jaGVja1Blcm1pc3Npb24oUEVSTUlTU0lPTl9IQVJEV0FSRV9URVNULCAxLCAwKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFBhY2thZ2VNYW5hZ2VyLlBFUk1JU1NJT05fR1JBTlRFRCwgcmV0dXJuVmFsdWUpOwotCi0gICAgICAgIC8vIFRlc3Qgd2l0aCBub24tcm9vdCB1c2VyLCBvbmx5IGluY2x1ZGVkIGdyYW50ZWQgcGVybWlzc2lvbi4KLSAgICAgICAgcmV0dXJuVmFsdWUgPSBtQ29udGV4dFdyYXBwZXIuY2hlY2tQZXJtaXNzaW9uKFBFUk1JU1NJT05fSEFSRFdBUkVfVEVTVCwgMSwgMSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhQYWNrYWdlTWFuYWdlci5QRVJNSVNTSU9OX0RFTklFRCwgcmV0dXJuVmFsdWUpOwotCi0gICAgICAgIC8vIFRlc3Qgd2l0aCBudWxsIHBlcm1pc3Npb24uCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm5WYWx1ZSA9IG1Db250ZXh0V3JhcHBlci5jaGVja1Blcm1pc3Npb24obnVsbCwgMCwgMCk7Ci0gICAgICAgICAgICBmYWlsKCJjaGVja1Blcm1pc3Npb24gc2hvdWxkIG5vdCBhY2NlcHQgbnVsbCBwZXJtaXNzaW9uIik7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUZXN0IHdpdGggaW52YWxpZCB1aWQgYW5kIGluY2x1ZGVkIGdyYW50ZWQgcGVybWlzc2lvbi4KLSAgICAgICAgcmV0dXJuVmFsdWUgPSBtQ29udGV4dFdyYXBwZXIuY2hlY2tQZXJtaXNzaW9uKCJhbmRyb2lkLnBlcm1pc3Npb24uU0VUX1dBTExQQVBFUiIsIDEsIC0xMSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhQYWNrYWdlTWFuYWdlci5QRVJNSVNTSU9OX0RFTklFRCwgcmV0dXJuVmFsdWUpOwotICAgIH0KLQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTeXN0ZW1TZXJ2aWNlKCkgewogICAgICAgICAvLyBUZXN0IGludmFsaWQgc2VydmljZSBuYW1lCiAgICAgICAgIGFzc2VydE51bGwobUNvbnRleHRXcmFwcGVyLmdldFN5c3RlbVNlcnZpY2UoImludmFsaWQiKSk7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9jb250ZW50L3NyYy9hbmRyb2lkL2NvbnRlbnQvY3RzL0RlZmVyU3luY1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvc3JjL2FuZHJvaWQvY29udGVudC9jdHMvRGVmZXJTeW5jVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5YTZlY2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9jb250ZW50L3NyYy9hbmRyb2lkL2NvbnRlbnQvY3RzL0RlZmVyU3luY1Rlc3QuamF2YQpAQCAtMCwwICsxLDIwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5jb250ZW50LmN0czsKKworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jdHMuY29udGVudC5VdGlscy5BTFdBWVNfU1lOQ0FCTEVfQVVUSE9SSVRZOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jdHMuY29udGVudC5VdGlscy5OT1RfQUxXQVlTX1NZTkNBQkxFX0FVVEhPUklUWTsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY3RzLmNvbnRlbnQuVXRpbHMuU1lOQ19USU1FT1VUX01JTExJUzsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY3RzLmNvbnRlbnQuVXRpbHMuYWxsb3dTeW5jQWRhcHRlclJ1bkluQmFja2dyb3VuZEFuZERhdGFJbkJhY2tncm91bmQ7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmN0cy5jb250ZW50LlV0aWxzLmRpc2FsbG93U3luY0FkYXB0ZXJSdW5JbkJhY2tncm91bmRBbmREYXRhSW5CYWNrZ3JvdW5kOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jdHMuY29udGVudC5VdGlscy5oYXNEYXRhQ29ubmVjdGlvbjsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY3RzLmNvbnRlbnQuVXRpbHMucmVxdWVzdFN5bmM7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmN0cy5jb250ZW50LlV0aWxzLndpdGhBY2NvdW50OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc3VtZS5hc3N1bWVUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Bcmd1bWVudENhcHRvci5mb3JDbGFzczsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uQXJndW1lbnRNYXRjaGVycy5hbnk7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8uYXRMZWFzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5uZXZlcjsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by50aW1lb3V0OworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnZlcmlmeTsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by53aGVuOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkFic3RyYWN0VGhyZWFkZWRTeW5jQWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy5jb250ZW50LkFsd2F5c1N5bmNhYmxlU3luY1NlcnZpY2U7CitpbXBvcnQgY29tLmFuZHJvaWQuY3RzLmNvbnRlbnQuRmxha3lUZXN0UnVsZTsKK2ltcG9ydCBjb20uYW5kcm9pZC5jdHMuY29udGVudC5Ob3RBbHdheXNTeW5jYWJsZVN5bmNTZXJ2aWNlOworaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy5jb250ZW50LlN0dWJBY3Rpdml0eTsKK2ltcG9ydCBjb20uYW5kcm9pZC5jdHMuY29udGVudC5VdGlsczsKKworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5UZXN0UnVsZTsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLm1vY2tpdG8uQXJndW1lbnRDYXB0b3I7CisKK0BSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgRGVmZXJTeW5jVGVzdCB7CisgICAgQFJ1bGUKKyAgICBwdWJsaWMgZmluYWwgVGVzdFJ1bGUgZmxha3lUZXN0UnVsZSA9IG5ldyBGbGFreVRlc3RSdWxlKDMpOworCisgICAgQFJ1bGUKKyAgICBwdWJsaWMgZmluYWwgQWN0aXZpdHlUZXN0UnVsZTxTdHViQWN0aXZpdHk+IGFjdGl2aXR5ID0gbmV3IEFjdGl2aXR5VGVzdFJ1bGUoU3R1YkFjdGl2aXR5LmNsYXNzKTsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhbGxvd1N5bmNBZGFwdGVyUnVuSW5CYWNrZ3JvdW5kQW5kRGF0YUluQmFja2dyb3VuZCgpOworICAgIH0KKworICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGRpc2FsbG93U3luY0FkYXB0ZXJSdW5JbkJhY2tncm91bmRBbmREYXRhSW5CYWNrZ3JvdW5kKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBub1N5bmNzV2hlbkRlZmVycmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc3VtZVRydWUoaGFzRGF0YUNvbm5lY3Rpb24oKSk7CisKKyAgICAgICAgQWJzdHJhY3RUaHJlYWRlZFN5bmNBZGFwdGVyIG5vdEFsd2F5c1N5bmNhYmxlQWRhcHRlciA9CisgICAgICAgICAgICAgICAgTm90QWx3YXlzU3luY2FibGVTeW5jU2VydmljZS5nZXRJbnN0YW5jZShhY3Rpdml0eS5nZXRBY3Rpdml0eSgpKS5zZXROZXdEZWxlZ2F0ZSgpOworICAgICAgICBBYnN0cmFjdFRocmVhZGVkU3luY0FkYXB0ZXIgYWx3YXlzU3luY2FibGVBZGFwdGVyID0KKyAgICAgICAgICAgICAgICBBbHdheXNTeW5jYWJsZVN5bmNTZXJ2aWNlLmdldEluc3RhbmNlKGFjdGl2aXR5LmdldEFjdGl2aXR5KCkpLnNldE5ld0RlbGVnYXRlKCk7CisKKyAgICAgICAgd2hlbihhbHdheXNTeW5jYWJsZUFkYXB0ZXIub25VbnN5bmNhYmxlQWNjb3VudCgpKS50aGVuUmV0dXJuKGZhbHNlKTsKKyAgICAgICAgd2hlbihub3RBbHdheXNTeW5jYWJsZUFkYXB0ZXIub25VbnN5bmNhYmxlQWNjb3VudCgpKS50aGVuUmV0dXJuKGZhbHNlKTsKKworICAgICAgICB0cnkgKFV0aWxzLkNsb3NhYmxlQWNjb3VudCBpZ25vcmVkID0gd2l0aEFjY291bnQoYWN0aXZpdHkuZ2V0QWN0aXZpdHkoKSkpIHsKKyAgICAgICAgICAgIHJlcXVlc3RTeW5jKE5PVF9BTFdBWVNfU1lOQ0FCTEVfQVVUSE9SSVRZKTsKKyAgICAgICAgICAgIHJlcXVlc3RTeW5jKEFMV0FZU19TWU5DQUJMRV9BVVRIT1JJVFkpOworCisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU1lOQ19USU1FT1VUX01JTExJUyk7CisKKyAgICAgICAgICAgIHZlcmlmeShub3RBbHdheXNTeW5jYWJsZUFkYXB0ZXIsIGF0TGVhc3QoMSkpLm9uVW5zeW5jYWJsZUFjY291bnQoKTsKKyAgICAgICAgICAgIHZlcmlmeShub3RBbHdheXNTeW5jYWJsZUFkYXB0ZXIsIG5ldmVyKCkpLm9uUGVyZm9ybVN5bmMoYW55KCksIGFueSgpLCBhbnkoKSwgYW55KCksCisgICAgICAgICAgICAgICAgICAgIGFueSgpKTsKKworICAgICAgICAgICAgdmVyaWZ5KGFsd2F5c1N5bmNhYmxlQWRhcHRlciwgYXRMZWFzdCgxKSkub25VbnN5bmNhYmxlQWNjb3VudCgpOworICAgICAgICAgICAgdmVyaWZ5KGFsd2F5c1N5bmNhYmxlQWRhcHRlciwgbmV2ZXIoKSkub25QZXJmb3JtU3luYyhhbnkoKSwgYW55KCksIGFueSgpLCBhbnkoKSwgYW55KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBkZWZlclN5bmNBbmRNYWtlU3luY2FibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzdW1lVHJ1ZShoYXNEYXRhQ29ubmVjdGlvbigpKTsKKworICAgICAgICBBYnN0cmFjdFRocmVhZGVkU3luY0FkYXB0ZXIgYWRhcHRlciA9IE5vdEFsd2F5c1N5bmNhYmxlU3luY1NlcnZpY2UuZ2V0SW5zdGFuY2UoCisgICAgICAgICAgICAgICAgYWN0aXZpdHkuZ2V0QWN0aXZpdHkoKSkuc2V0TmV3RGVsZWdhdGUoKTsKKyAgICAgICAgd2hlbihhZGFwdGVyLm9uVW5zeW5jYWJsZUFjY291bnQoKSkudGhlblJldHVybihmYWxzZSk7CisKKyAgICAgICAgdHJ5IChVdGlscy5DbG9zYWJsZUFjY291bnQgYWNjb3VudCA9IHdpdGhBY2NvdW50KGFjdGl2aXR5LmdldEFjdGl2aXR5KCkpKSB7CisgICAgICAgICAgICB2ZXJpZnkoYWRhcHRlciwgdGltZW91dChTWU5DX1RJTUVPVVRfTUlMTElTKSkub25VbnN5bmNhYmxlQWNjb3VudCgpOworCisgICAgICAgICAgICAvLyBFbmFibGUgdGhlIGFkYXB0ZXIgYnkgbWFraW5nIHRoZSBhY2NvdW50L3Byb3ZpZGVyIHN5bmNhYmxlCisgICAgICAgICAgICBDb250ZW50UmVzb2x2ZXIuc2V0SXNTeW5jYWJsZShhY2NvdW50LmFjY291bnQsIE5PVF9BTFdBWVNfU1lOQ0FCTEVfQVVUSE9SSVRZLCAxKTsKKyAgICAgICAgICAgIHJlcXVlc3RTeW5jKE5PVF9BTFdBWVNfU1lOQ0FCTEVfQVVUSE9SSVRZKTsKKworICAgICAgICAgICAgQXJndW1lbnRDYXB0b3I8QnVuZGxlPiBleHRyYXNDYXB0b3IgPSBmb3JDbGFzcyhCdW5kbGUuY2xhc3MpOworICAgICAgICAgICAgdmVyaWZ5KGFkYXB0ZXIsIHRpbWVvdXQoU1lOQ19USU1FT1VUX01JTExJUykpLm9uUGVyZm9ybVN5bmMoYW55KCksCisgICAgICAgICAgICAgICAgICAgIGV4dHJhc0NhcHRvci5jYXB0dXJlKCksIGFueSgpLCBhbnkoKSwgYW55KCkpOworCisgICAgICAgICAgICAvLyBBcyB0aGUgYWRhcHRlciBpcyBtYWRlIHN5bmNhYmxlLCB3ZSBzaG91bGQgbm90IGdldCBhbiBpbml0aWFsaXphdGlvbiBzeW5jCisgICAgICAgICAgICBhc3NlcnRGYWxzZSgKKyAgICAgICAgICAgICAgICAgICAgZXh0cmFzQ2FwdG9yLmdldFZhbHVlKCkuY29udGFpbnNLZXkoQ29udGVudFJlc29sdmVyLlNZTkNfRVhUUkFTX0lOSVRJQUxJWkUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZGVmZXJTeW5jQW5kUmVwb3J0SXNSZWFkeSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3N1bWVUcnVlKGhhc0RhdGFDb25uZWN0aW9uKCkpOworCisgICAgICAgIEFic3RyYWN0VGhyZWFkZWRTeW5jQWRhcHRlciBhZGFwdGVyID0gTm90QWx3YXlzU3luY2FibGVTeW5jU2VydmljZS5nZXRJbnN0YW5jZSgKKyAgICAgICAgICAgICAgICBhY3Rpdml0eS5nZXRBY3Rpdml0eSgpKS5zZXROZXdEZWxlZ2F0ZSgpOworICAgICAgICB3aGVuKGFkYXB0ZXIub25VbnN5bmNhYmxlQWNjb3VudCgpKS50aGVuUmV0dXJuKGZhbHNlKTsKKworICAgICAgICB0cnkgKFV0aWxzLkNsb3NhYmxlQWNjb3VudCBpZ25vcmVkID0gd2l0aEFjY291bnQoYWN0aXZpdHkuZ2V0QWN0aXZpdHkoKSkpIHsKKyAgICAgICAgICAgIHZlcmlmeShhZGFwdGVyLCB0aW1lb3V0KFNZTkNfVElNRU9VVF9NSUxMSVMpKS5vblVuc3luY2FibGVBY2NvdW50KCk7CisKKyAgICAgICAgICAgIC8vIEVuYWJsZSB0aGUgYWRhcHRlciBieSByZXR1cm5pbmcgdHJ1ZSBmcm9tIG9uTmV3QWNjb3VudAorICAgICAgICAgICAgd2hlbihhZGFwdGVyLm9uVW5zeW5jYWJsZUFjY291bnQoKSkudGhlblJldHVybih0cnVlKTsKKyAgICAgICAgICAgIHJlcXVlc3RTeW5jKE5PVF9BTFdBWVNfU1lOQ0FCTEVfQVVUSE9SSVRZKTsKKyAgICAgICAgICAgIHZlcmlmeShhZGFwdGVyLCBhdExlYXN0KDEpKS5vblVuc3luY2FibGVBY2NvdW50KCk7CisKKyAgICAgICAgICAgIEFyZ3VtZW50Q2FwdG9yPEJ1bmRsZT4gZXh0cmFzQ2FwdG9yID0gZm9yQ2xhc3MoQnVuZGxlLmNsYXNzKTsKKyAgICAgICAgICAgIHZlcmlmeShhZGFwdGVyLCB0aW1lb3V0KFNZTkNfVElNRU9VVF9NSUxMSVMpKS5vblBlcmZvcm1TeW5jKGFueSgpLAorICAgICAgICAgICAgICAgICAgICBleHRyYXNDYXB0b3IuY2FwdHVyZSgpLCBhbnkoKSwgYW55KCksIGFueSgpKTsKKworICAgICAgICAgICAgLy8gQXMgdGhlIGFkYXB0ZXIgaXMgbm90IHN5bmNhYmxlIHlldCwgd2Ugc2hvdWxkIGdldCBhbiBpbml0aWFsaXphdGlvbiBzeW5jCisgICAgICAgICAgICBhc3NlcnRUcnVlKGV4dHJhc0NhcHRvci5nZXRWYWx1ZSgpLmdldEJvb2xlYW4oQ29udGVudFJlc29sdmVyLlNZTkNfRVhUUkFTX0lOSVRJQUxJWkUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZGVmZXJTeW5jQW5kUmVwb3J0SXNSZWFkeUFsd2F5c1N5bmNhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc3VtZVRydWUoaGFzRGF0YUNvbm5lY3Rpb24oKSk7CisKKyAgICAgICAgQWJzdHJhY3RUaHJlYWRlZFN5bmNBZGFwdGVyIGFkYXB0ZXIgPSBBbHdheXNTeW5jYWJsZVN5bmNTZXJ2aWNlLmdldEluc3RhbmNlKAorICAgICAgICAgICAgICAgIGFjdGl2aXR5LmdldEFjdGl2aXR5KCkpLnNldE5ld0RlbGVnYXRlKCk7CisgICAgICAgIHdoZW4oYWRhcHRlci5vblVuc3luY2FibGVBY2NvdW50KCkpLnRoZW5SZXR1cm4oZmFsc2UpOworCisgICAgICAgIHRyeSAoVXRpbHMuQ2xvc2FibGVBY2NvdW50IGlnbm9yZWQgPSB3aXRoQWNjb3VudChhY3Rpdml0eS5nZXRBY3Rpdml0eSgpKSkgeworICAgICAgICAgICAgdmVyaWZ5KGFkYXB0ZXIsIHRpbWVvdXQoU1lOQ19USU1FT1VUX01JTExJUykpLm9uVW5zeW5jYWJsZUFjY291bnQoKTsKKworICAgICAgICAgICAgLy8gRW5hYmxlIHRoZSBhZGFwdGVyIGJ5IHJldHVybmluZyB0cnVlIGZyb20gb25OZXdBY2NvdW50CisgICAgICAgICAgICB3aGVuKGFkYXB0ZXIub25VbnN5bmNhYmxlQWNjb3VudCgpKS50aGVuUmV0dXJuKHRydWUpOworICAgICAgICAgICAgcmVxdWVzdFN5bmMoQUxXQVlTX1NZTkNBQkxFX0FVVEhPUklUWSk7CisgICAgICAgICAgICB2ZXJpZnkoYWRhcHRlciwgYXRMZWFzdCgxKSkub25VbnN5bmNhYmxlQWNjb3VudCgpOworCisgICAgICAgICAgICBBcmd1bWVudENhcHRvcjxCdW5kbGU+IGV4dHJhc0NhcHRvciA9IGZvckNsYXNzKEJ1bmRsZS5jbGFzcyk7CisgICAgICAgICAgICB2ZXJpZnkoYWRhcHRlciwgdGltZW91dChTWU5DX1RJTUVPVVRfTUlMTElTKSkub25QZXJmb3JtU3luYyhhbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgZXh0cmFzQ2FwdG9yLmNhcHR1cmUoKSwgYW55KCksIGFueSgpLCBhbnkoKSk7CisKKyAgICAgICAgICAgIC8vIFRoZSBhZGFwdGVyIGlzIGFsd2F5cyBzeW5jYWJsZSwgaGVuY2UgdGhlcmUgaXMgbm8gaW5pdCBzeW5jCisgICAgICAgICAgICBhc3NlcnRGYWxzZSgKKyAgICAgICAgICAgICAgICAgICAgZXh0cmFzQ2FwdG9yLmdldFZhbHVlKCkuY29udGFpbnNLZXkoQ29udGVudFJlc29sdmVyLlNZTkNfRVhUUkFTX0lOSVRJQUxJWkUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgb25OZXdBY2NvdW50Rm9yRWFjaEFjY291bnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzdW1lVHJ1ZShoYXNEYXRhQ29ubmVjdGlvbigpKTsKKworICAgICAgICBBYnN0cmFjdFRocmVhZGVkU3luY0FkYXB0ZXIgYWRhcHRlciA9IE5vdEFsd2F5c1N5bmNhYmxlU3luY1NlcnZpY2UuZ2V0SW5zdGFuY2UoCisgICAgICAgICAgICAgICAgYWN0aXZpdHkuZ2V0QWN0aXZpdHkoKSkuc2V0TmV3RGVsZWdhdGUoKTsKKyAgICAgICAgd2hlbihhZGFwdGVyLm9uVW5zeW5jYWJsZUFjY291bnQoKSkudGhlblJldHVybih0cnVlLCBmYWxzZSk7CisKKyAgICAgICAgdHJ5IChVdGlscy5DbG9zYWJsZUFjY291bnQgYWNjb3VudDEgPSB3aXRoQWNjb3VudChhY3Rpdml0eS5nZXRBY3Rpdml0eSgpKSkgeworICAgICAgICAgICAgdHJ5IChVdGlscy5DbG9zYWJsZUFjY291bnQgYWNjb3VudDIgPSB3aXRoQWNjb3VudChhY3Rpdml0eS5nZXRBY3Rpdml0eSgpKSkgeworICAgICAgICAgICAgICAgIHZlcmlmeShhZGFwdGVyLCB0aW1lb3V0KFNZTkNfVElNRU9VVF9NSUxMSVMpLmF0TGVhc3QoMikpLm9uVW5zeW5jYWJsZUFjY291bnQoKTsKKworICAgICAgICAgICAgICAgIC8vIEV4YWN0bHkgYWNjb3VudCBzaG91bGQgaGF2ZSBnb3R0ZW4gdGhlIGluaXQtc3luYy4gTm8gZnVydGhlciBzeW5jcyBoYXBwZW4gYXMKKyAgICAgICAgICAgICAgICAvLyBvbk5ld0FjY291bnQgcmV0dXJucyBmYWxzZSBhZ2Fpbi4KKyAgICAgICAgICAgICAgICBBcmd1bWVudENhcHRvcjxCdW5kbGU+IGV4dHJhc0NhcHRvciA9IGZvckNsYXNzKEJ1bmRsZS5jbGFzcyk7CisgICAgICAgICAgICAgICAgdmVyaWZ5KGFkYXB0ZXIsIHRpbWVvdXQoU1lOQ19USU1FT1VUX01JTExJUykpLm9uUGVyZm9ybVN5bmMoYW55KCksCisgICAgICAgICAgICAgICAgICAgICAgICBleHRyYXNDYXB0b3IuY2FwdHVyZSgpLCBhbnkoKSwgYW55KCksIGFueSgpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFzQ2FwdG9yLmdldFZhbHVlKCkuZ2V0Qm9vbGVhbihDb250ZW50UmVzb2x2ZXIuU1lOQ19FWFRSQVNfSU5JVElBTElaRSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9jb250ZW50L3NyYy9hbmRyb2lkL2NvbnRlbnQvY3RzL0ludGVudFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvc3JjL2FuZHJvaWQvY29udGVudC9jdHMvSW50ZW50VGVzdC5qYXZhCmluZGV4IGNhZGIxM2MuLjUxNjg0YWUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvc3JjL2FuZHJvaWQvY29udGVudC9jdHMvSW50ZW50VGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvc3JjL2FuZHJvaWQvY29udGVudC9jdHMvSW50ZW50VGVzdC5qYXZhCkBAIC0xMTUwLDYgKzExNTAsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIC5wdXRFeHRyYSgiaW50IiwgMTAwMCkucHV0RXh0cmEoImxvbmciLCAobG9uZykgMTAwMCkKICAgICAgICAgICAgICAgICAgICAgICAgIC5wdXRFeHRyYSgiYm9vbGVhbiIsIHRydWUpLnB1dEV4dHJhKCJmbG9hdCIsIDEwLjRmKQogICAgICAgICAgICAgICAgICAgICAgICAgLnNldFBhY2thZ2UoImNvbS5teWFwcCIpKTsKKyAgICAgICAgY2hlY2tJbnRlbnRVcmkoCisgICAgICAgICAgICAgICAgImludGVudDovL2V4YW1wbGUub3JnL2RiPzEyMyNJbnRlbnQ7c2NoZW1lPXozOS41MHI7ZW5kIiwKKyAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgIG5ldyBJbnRlbnQoKS5zZXRBY3Rpb24oSW50ZW50LkFDVElPTl9WSUVXKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldERhdGEoVXJpLnBhcnNlKCJ6MzkuNTByOi8vZXhhbXBsZS5vcmcvZGI/MTIzIikpKTsKICAgICB9CiAKICAgICBwcml2YXRlIGJvb2xlYW4gY29tcGFyZUludGVudHMoSW50ZW50IGV4cGVjdGVkLCBJbnRlbnQgYWN0dWFsKSB7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9jb250ZW50L3NyYy9hbmRyb2lkL2NvbnRlbnQvY3RzL01vY2tDb250ZW50UHJvdmlkZXIuamF2YSBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvc3JjL2FuZHJvaWQvY29udGVudC9jdHMvTW9ja0NvbnRlbnRQcm92aWRlci5qYXZhCmluZGV4IGI2ZWI4MDQuLjAxODMxNzcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvc3JjL2FuZHJvaWQvY29udGVudC9jdHMvTW9ja0NvbnRlbnRQcm92aWRlci5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvc3JjL2FuZHJvaWQvY29udGVudC9jdHMvTW9ja0NvbnRlbnRQcm92aWRlci5qYXZhCkBAIC0xNiw3ICsxNiw3IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5jb250ZW50LmN0czsKIAotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnN1cHBvcnQudjQudXRpbC5QcmVjb25kaXRpb25zLmNoZWNrQXJndW1lbnQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWR4LmNvcmUudXRpbC5QcmVjb25kaXRpb25zLmNoZWNrQXJndW1lbnQ7CiBpbXBvcnQgc3RhdGljIGp1bml0LmZyYW1ld29yay5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogCiBpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9jb250ZW50L3NyYy9hbmRyb2lkL2NvbnRlbnQvY3RzL01vY2tTeW5jQWRhcHRlci5qYXZhIGIvdGVzdHMvdGVzdHMvY29udGVudC9zcmMvYW5kcm9pZC9jb250ZW50L2N0cy9Nb2NrU3luY0FkYXB0ZXIuamF2YQppbmRleCA5NTc4NTllLi5jOGIwYmVjIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9jb250ZW50L3NyYy9hbmRyb2lkL2NvbnRlbnQvY3RzL01vY2tTeW5jQWRhcHRlci5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvc3JjL2FuZHJvaWQvY29udGVudC9jdHMvTW9ja1N5bmNBZGFwdGVyLmphdmEKQEAgLTE5LDYgKzE5LDcgQEAKIGltcG9ydCBhbmRyb2lkLmFjY291bnRzLkFjY291bnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSVN5bmNBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JU3luY0FkYXB0ZXJVbnN5bmNhYmxlQWNjb3VudENhbGxiYWNrOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JU3luY0NvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CkBAIC03Niw2ICs3NywxMiBAQAogICAgICAgICB0aGlzLm1MYXRjaCA9IG1MYXRjaDsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblVuc3luY2FibGVBY2NvdW50KElTeW5jQWRhcHRlclVuc3luY2FibGVBY2NvdW50Q2FsbGJhY2sgY2IpCisgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgY2Iub25VbnN5bmNhYmxlQWNjb3VudERvbmUodHJ1ZSk7CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgc3RhcnRTeW5jKElTeW5jQ29udGV4dCBzeW5jQ29udGV4dCwgU3RyaW5nIGF1dGhvcml0eSwgQWNjb3VudCBhY2NvdW50LAogICAgICAgICAgICAgQnVuZGxlIGV4dHJhcykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvc3JjL2FuZHJvaWQvY29udGVudC9jdHMvU2hhcmVkUHJlZmVyZW5jZXNUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9jb250ZW50L3NyYy9hbmRyb2lkL2NvbnRlbnQvY3RzL1NoYXJlZFByZWZlcmVuY2VzVGVzdC5qYXZhCmluZGV4IGI0ZmNiMzEuLjdjOWU1MzggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvc3JjL2FuZHJvaWQvY29udGVudC9jdHMvU2hhcmVkUHJlZmVyZW5jZXNUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvY29udGVudC9zcmMvYW5kcm9pZC9jb250ZW50L2N0cy9TaGFyZWRQcmVmZXJlbmNlc1Rlc3QuamF2YQpAQCAtMjIsNiArMjIsOCBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm87CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQub3MuU3RyaWN0TW9kZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlN0cmljdE1vZGUuVmlvbGF0aW9uSW5mbzsKK2ltcG9ydCBhbmRyb2lkLm9zLlN0cmljdE1vZGUuVmlvbGF0aW9uTG9nZ2VyOwogaW1wb3J0IGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CkBAIC0zMiw2ICszNCw4IEBACiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogCiAvKioKICAqIFRlc3Qge0BsaW5rIFNoYXJlZFByZWZlcmVuY2VzfS4KQEAgLTMyMiwyOCArMzI2LDI3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZU11bHRpUHJvY2VzcygpIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZU11bHRpUHJvY2VzcygpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFByZS1sb2FkIGl0LgogICAgICAgICBtQ29udGV4dC5nZXRTaGFyZWRQcmVmZXJlbmNlcygibXVsdGlwcm9jZXNzVGVzdCIsIDApOwogCiAgICAgICAgIGZpbmFsIFN0cmljdE1vZGUuVGhyZWFkUG9saWN5IG9sZFBvbGljeSA9IFN0cmljdE1vZGUuZ2V0VGhyZWFkUG9saWN5KCk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBTdHJpY3RNb2RlLlRocmVhZFBvbGljeSBkaXNrUmVhZERlYXRoID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmljdE1vZGUuVGhyZWFkUG9saWN5LkJ1aWxkZXIoKS5kZXRlY3REaXNrUmVhZHMoKS5wZW5hbHR5RGVhdGgoKS5idWlsZCgpOworICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaWN0TW9kZS5UaHJlYWRQb2xpY3kuQnVpbGRlcigpLmRldGVjdERpc2tSZWFkcygpLnBlbmFsdHlMb2coKS5idWlsZCgpOwogICAgICAgICAgICAgU3RyaWN0TW9kZS5zZXRUaHJlYWRQb2xpY3koZGlza1JlYWREZWF0aCk7CisgICAgICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICAgICAgICAgIFN0cmljdE1vZGUuc2V0VmlvbGF0aW9uTG9nZ2VyKGluZm8gLT4gbGF0Y2guY291bnREb3duKCkpOwogCiAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZG4ndCBoaXQgZGlzay4gIChpdCB3YXMgYWxyZWFkeSBwcmUtbG9hZGVkIGFib3ZlKQogICAgICAgICAgICAgbUNvbnRleHQuZ2V0U2hhcmVkUHJlZmVyZW5jZXMoIm11bHRpcHJvY2Vzc1Rlc3QiLCAwKTsKKyAgICAgICAgICAgIGJvb2xlYW4gdHJpZ2dlcmVkID0gbGF0Y2guYXdhaXQoMSwgVGltZVVuaXQuU0VDT05EUyk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZSh0cmlnZ2VyZWQpOwogCi0gICAgICAgICAgICBib29sZWFuIGRpZFJlYWQgPSBmYWxzZTsKICAgICAgICAgICAgIC8vIFRoaXMgU0hPVUxEIGhpdCBkaXNrLiAgKG11bHRpLXByb2Nlc3MgZmxhZyBpcyBzZXQpCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFNoYXJlZFByZWZlcmVuY2VzKCJtdWx0aXByb2Nlc3NUZXN0IiwgQ29udGV4dC5NT0RFX01VTFRJX1BST0NFU1MpOwotICAgICAgICAgICAgICAgIGZhaWwoKTsgIC8vIHdlIHNob3VsZG4ndCBnZXQgaGVyZS4KLSAgICAgICAgICAgIH0gY2F0Y2ggKFN0cmljdE1vZGUuU3RyaWN0TW9kZVZpb2xhdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgZGlkUmVhZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGRpZFJlYWQpOworICAgICAgICAgICAgbUNvbnRleHQuZ2V0U2hhcmVkUHJlZmVyZW5jZXMoIm11bHRpcHJvY2Vzc1Rlc3QiLCBDb250ZXh0Lk1PREVfTVVMVElfUFJPQ0VTUyk7CisgICAgICAgICAgICB0cmlnZ2VyZWQgPSBsYXRjaC5hd2FpdCgxLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUodHJpZ2dlcmVkKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIFN0cmljdE1vZGUuc2V0VGhyZWFkUG9saWN5KG9sZFBvbGljeSk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvc3JjL2FuZHJvaWQvY29udGVudC9jdHMvVGVzdFBhZ2luZ0NvbnRlbnRQcm92aWRlci5qYXZhIGIvdGVzdHMvdGVzdHMvY29udGVudC9zcmMvYW5kcm9pZC9jb250ZW50L2N0cy9UZXN0UGFnaW5nQ29udGVudFByb3ZpZGVyLmphdmEKaW5kZXggNmUzODgwOS4uMmExZDExZSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvY29udGVudC9zcmMvYW5kcm9pZC9jb250ZW50L2N0cy9UZXN0UGFnaW5nQ29udGVudFByb3ZpZGVyLmphdmEKKysrIGIvdGVzdHMvdGVzdHMvY29udGVudC9zcmMvYW5kcm9pZC9jb250ZW50L2N0cy9UZXN0UGFnaW5nQ29udGVudFByb3ZpZGVyLmphdmEKQEAgLTI2LDcgKzI2LDYgQEAKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLkNhbmNlbGxhdGlvblNpZ25hbDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudXRpbC5NYXRoVXRpbHM7CiAKIGltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOwogCkBAIC0xMDksNyArMTA4LDggQEAKICAgICAgICAgQnVuZGxlIGV4dHJhcyA9IGMuZ2V0RXh0cmFzKCk7CiAKICAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgaXRlbXMgdG8gaW5jbHVkZSBpbiB0aGUgY3Vyc29yLgotICAgICAgICBpbnQgbnVtSXRlbXMgPSBNYXRoVXRpbHMuY29uc3RyYWluKHJlY29yZHNldFNpemUgLSBvZmZzZXQsIDAsIGxpbWl0KTsKKyAgICAgICAgaW50IG51bUl0ZW1zID0gcmVjb3Jkc2V0U2l6ZSAtIG9mZnNldDsKKyAgICAgICAgbnVtSXRlbXMgPSBudW1JdGVtcyA8IDAgPyAwIDogKG51bUl0ZW1zID4gbGltaXQgPyBsaW1pdCA6IG51bUl0ZW1zKTsKIAogICAgICAgICAvLyBCdWlsZCB0aGUgcGFnZWQgcmVzdWx0IHNldC4KICAgICAgICAgZm9yIChpbnQgaSA9IG9mZnNldDsgaSA8IG9mZnNldCArIG51bUl0ZW1zOyBpKyspIHsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvc3JjL2FuZHJvaWQvY29udGVudC9wbS9jdHMvQXBwbGljYXRpb25JbmZvVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvY29udGVudC9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9BcHBsaWNhdGlvbkluZm9UZXN0LmphdmEKaW5kZXggNmEwNmViOC4uY2ZhMjE4OSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvY29udGVudC9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9BcHBsaWNhdGlvbkluZm9UZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvY29udGVudC9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9BcHBsaWNhdGlvbkluZm9UZXN0LmphdmEKQEAgLTE2LDI4ICsxNiw1NCBAQAogCiBwYWNrYWdlIGFuZHJvaWQuY29udGVudC5wbS5jdHM7CiAKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LnBtLkFwcGxpY2F0aW9uSW5mby5DQVRFR09SWV9NQVBTOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQucG0uQXBwbGljYXRpb25JbmZvLkNBVEVHT1JZX1BST0RVQ1RJVklUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LnBtLkFwcGxpY2F0aW9uSW5mby5DQVRFR09SWV9VTkRFRklORUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm8uRkxBR19NVUxUSUFSQ0g7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm8uRkxBR19TVVBQT1JUU19SVEw7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRBcnJheUVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuY3RzLlI7Ci0KLQogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm87CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLk5hbWVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKLWltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworaW1wb3J0IGFuZHJvaWQub3MuUHJvY2VzczsKK2ltcG9ydCBhbmRyb2lkLm9zLlVzZXJIYW5kbGU7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlN0cmluZ0J1aWxkZXJQcmludGVyOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKIC8qKgogICogVGVzdCB7QGxpbmsgQXBwbGljYXRpb25JbmZvfS4KICAqLwotcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uSW5mb1Rlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbkluZm9UZXN0IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOQ19BQ0NPVU5UX0FDQ0VTU19TVFVCX1BBQ0tBR0VfTkFNRSA9ICJjb20uYW5kcm9pZC5jdHMuc3R1YiI7CisKICAgICBwcml2YXRlIEFwcGxpY2F0aW9uSW5mbyBtQXBwbGljYXRpb25JbmZvOwogICAgIHByaXZhdGUgU3RyaW5nIG1QYWNrYWdlTmFtZTsKIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIG1QYWNrYWdlTmFtZSA9IGdldENvbnRleHQoKS5nZXRQYWNrYWdlTmFtZSgpOwogICAgIH0KIAorICAgIHByaXZhdGUgQ29udGV4dCBnZXRDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VGFyZ2V0Q29udGV4dCgpOworICAgIH0KKworICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yKCkgewogICAgICAgICBBcHBsaWNhdGlvbkluZm8gaW5mbyA9IG5ldyBBcHBsaWNhdGlvbkluZm8oKTsKICAgICAgICAgLy8gc2ltcGxlIHRlc3QgdG8gZW5zdXJlIHBhY2thZ2VOYW1lIGlzIGNvcGllZCBieSBjb3B5IGNvbnN0cnVjdG9yCkBAIC00Nyw4ICs3Myw5IEBACiAgICAgICAgIGFzc2VydEVxdWFscyhpbmZvLnBhY2thZ2VOYW1lLCBjb3B5LnBhY2thZ2VOYW1lKTsKICAgICB9CiAKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RXcml0ZVRvUGFyY2VsKCkgdGhyb3dzIE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1BcHBsaWNhdGlvbkluZm8gPSBtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpLmdldEFwcGxpY2F0aW9uSW5mbyhtUGFja2FnZU5hbWUsIDApOworICAgICAgICBtQXBwbGljYXRpb25JbmZvID0gZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VNYW5hZ2VyKCkuZ2V0QXBwbGljYXRpb25JbmZvKG1QYWNrYWdlTmFtZSwgMCk7CiAKICAgICAgICAgUGFyY2VsIHAgPSBQYXJjZWwub2J0YWluKCk7CiAgICAgICAgIG1BcHBsaWNhdGlvbkluZm8ud3JpdGVUb1BhcmNlbChwLCAwKTsKQEAgLTcxLDE3ICs5OCwyMCBAQAogICAgICAgICBhc3NlcnRFcXVhbHMobUFwcGxpY2F0aW9uSW5mby5kZXNjcmlwdGlvblJlcywgaW5mby5kZXNjcmlwdGlvblJlcyk7CiAgICAgfQogCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7CiAgICAgICAgIG1BcHBsaWNhdGlvbkluZm8gPSBuZXcgQXBwbGljYXRpb25JbmZvKCk7CiAgICAgICAgIGFzc2VydE5vdE51bGwobUFwcGxpY2F0aW9uSW5mby50b1N0cmluZygpKTsKICAgICB9CiAKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3REZXNjcmliZUNvbnRlbnRzKCkgdGhyb3dzIE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgbUFwcGxpY2F0aW9uSW5mbyA9IG1Db250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCkuZ2V0QXBwbGljYXRpb25JbmZvKG1QYWNrYWdlTmFtZSwgMCk7CisgICAgICAgbUFwcGxpY2F0aW9uSW5mbyA9IGdldENvbnRleHQoKS5nZXRQYWNrYWdlTWFuYWdlcigpLmdldEFwcGxpY2F0aW9uSW5mbyhtUGFja2FnZU5hbWUsIDApOwogCiAgICAgICAgIGFzc2VydEVxdWFscygwLCBtQXBwbGljYXRpb25JbmZvLmRlc2NyaWJlQ29udGVudHMoKSk7CiAgICAgfQogCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RHVtcCgpIHsKICAgICAgICAgbUFwcGxpY2F0aW9uSW5mbyA9IG5ldyBBcHBsaWNhdGlvbkluZm8oKTsKIApAQCAtOTUsMTMgKzEyNSw3MyBAQAogICAgICAgICBhc3NlcnRUcnVlKHNiLmxlbmd0aCgpID4gMCk7CiAgICAgfQogCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0TG9hZERlc2NyaXB0aW9uKCkgdGhyb3dzIE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1BcHBsaWNhdGlvbkluZm8gPSBtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpLmdldEFwcGxpY2F0aW9uSW5mbyhtUGFja2FnZU5hbWUsIDApOworICAgICAgICBtQXBwbGljYXRpb25JbmZvID0gZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VNYW5hZ2VyKCkuZ2V0QXBwbGljYXRpb25JbmZvKG1QYWNrYWdlTmFtZSwgMCk7CiAKLSAgICAgICAgYXNzZXJ0TnVsbChtQXBwbGljYXRpb25JbmZvLmxvYWREZXNjcmlwdGlvbihtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpKSk7CisgICAgICAgIGFzc2VydE51bGwobUFwcGxpY2F0aW9uSW5mby5sb2FkRGVzY3JpcHRpb24oZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VNYW5hZ2VyKCkpKTsKIAogICAgICAgICBtQXBwbGljYXRpb25JbmZvLmRlc2NyaXB0aW9uUmVzID0gUi5zdHJpbmcuaGVsbG9fd29ybGQ7Ci0gICAgICAgIGFzc2VydEVxdWFscyhtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRTdHJpbmcoUi5zdHJpbmcuaGVsbG9fd29ybGQpLAotICAgICAgICAgICAgICAgIG1BcHBsaWNhdGlvbkluZm8ubG9hZERlc2NyaXB0aW9uKG1Db250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKS5nZXRTdHJpbmcoUi5zdHJpbmcuaGVsbG9fd29ybGQpLAorICAgICAgICAgICAgICAgIG1BcHBsaWNhdGlvbkluZm8ubG9hZERlc2NyaXB0aW9uKGdldENvbnRleHQoKS5nZXRQYWNrYWdlTWFuYWdlcigpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB2ZXJpZnlPd25JbmZvKCkgdGhyb3dzIE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIG1BcHBsaWNhdGlvbkluZm8gPSBnZXRDb250ZXh0KCkuZ2V0UGFja2FnZU1hbmFnZXIoKS5nZXRBcHBsaWNhdGlvbkluZm8obVBhY2thZ2VOYW1lLCAwKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIkFuZHJvaWQgVGVzdENhc2UiLCBtQXBwbGljYXRpb25JbmZvLm5vbkxvY2FsaXplZExhYmVsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFIuZHJhd2FibGUuc2l6ZV80OHg0OCwgbUFwcGxpY2F0aW9uSW5mby5pY29uKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhbmRyb2lkLmNvbnRlbnQuY3RzLk1vY2tBcHBsaWNhdGlvbiIsIG1BcHBsaWNhdGlvbkluZm8ubmFtZSk7CisgICAgICAgIGludCBmbGFncyA9IEZMQUdfTVVMVElBUkNIIHwgRkxBR19TVVBQT1JUU19SVEw7CisgICAgICAgIGFzc2VydEVxdWFscyhmbGFncywgbUFwcGxpY2F0aW9uSW5mby5mbGFncyAmIGZsYWdzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKENBVEVHT1JZX1BST0RVQ1RJVklUWSwgbUFwcGxpY2F0aW9uSW5mby5jYXRlZ29yeSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB2ZXJpZnlEZWZhdWx0VmFsdWVzKCkgdGhyb3dzIE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFRoZSBhcHBsaWNhdGlvbiAiY29tLmFuZHJvaWQuY3RzLnN0dWIiIGRvZXMgbm90IGhhdmUgYW55IGF0dHJpYnV0ZXMgc2V0CisgICAgICAgIG1BcHBsaWNhdGlvbkluZm8gPSBnZXRDb250ZXh0KCkuZ2V0UGFja2FnZU1hbmFnZXIoKS5nZXRBcHBsaWNhdGlvbkluZm8oCisgICAgICAgICAgICAgICAgU1lOQ19BQ0NPVU5UX0FDQ0VTU19TVFVCX1BBQ0tBR0VfTkFNRSwgMCk7CisgICAgICAgIGludCBjdXJyZW50VXNlcklkID0gUHJvY2Vzcy5teVVzZXJIYW5kbGUoKS5nZXRJZGVudGlmaWVyKCk7CisKKyAgICAgICAgYXNzZXJ0TnVsbChtQXBwbGljYXRpb25JbmZvLmNsYXNzTmFtZSk7CisgICAgICAgIGFzc2VydE51bGwobUFwcGxpY2F0aW9uSW5mby5wZXJtaXNzaW9uKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNZTkNfQUNDT1VOVF9BQ0NFU1NfU1RVQl9QQUNLQUdFX05BTUUsIG1BcHBsaWNhdGlvbkluZm8ucGFja2FnZU5hbWUpOworICAgICAgICBhc3NlcnRFcXVhbHMoU1lOQ19BQ0NPVU5UX0FDQ0VTU19TVFVCX1BBQ0tBR0VfTkFNRSwgbUFwcGxpY2F0aW9uSW5mby5wcm9jZXNzTmFtZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhTWU5DX0FDQ09VTlRfQUNDRVNTX1NUVUJfUEFDS0FHRV9OQU1FLCBtQXBwbGljYXRpb25JbmZvLnRhc2tBZmZpbml0eSk7CisgICAgICAgIGFzc2VydFRydWUoVXNlckhhbmRsZS5pc0FwcChtQXBwbGljYXRpb25JbmZvLnVpZCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbUFwcGxpY2F0aW9uSW5mby50aGVtZSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtQXBwbGljYXRpb25JbmZvLnJlcXVpcmVzU21hbGxlc3RXaWR0aERwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1BcHBsaWNhdGlvbkluZm8uY29tcGF0aWJsZVdpZHRoTGltaXREcCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtQXBwbGljYXRpb25JbmZvLmxhcmdlc3RXaWR0aExpbWl0RHApOworICAgICAgICBhc3NlcnROb3ROdWxsKG1BcHBsaWNhdGlvbkluZm8uc291cmNlRGlyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1BcHBsaWNhdGlvbkluZm8uc291cmNlRGlyLCBtQXBwbGljYXRpb25JbmZvLnB1YmxpY1NvdXJjZURpcik7CisgICAgICAgIGFzc2VydE51bGwobUFwcGxpY2F0aW9uSW5mby5zcGxpdFNvdXJjZURpcnMpOworICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhtQXBwbGljYXRpb25JbmZvLnNwbGl0U291cmNlRGlycywgbUFwcGxpY2F0aW9uSW5mby5zcGxpdFB1YmxpY1NvdXJjZURpcnMpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9kYXRhL3VzZXIvIiArIGN1cnJlbnRVc2VySWQgKyAiLyIgKyBTWU5DX0FDQ09VTlRfQUNDRVNTX1NUVUJfUEFDS0FHRV9OQU1FLAorICAgICAgICAgICAgICAgIG1BcHBsaWNhdGlvbkluZm8uZGF0YURpcik7CisgICAgICAgIGFzc2VydEVxdWFscygiL2RhdGEvdXNlcl9kZS8iICsgY3VycmVudFVzZXJJZCArICIvIiArIFNZTkNfQUNDT1VOVF9BQ0NFU1NfU1RVQl9QQUNLQUdFX05BTUUsCisgICAgICAgICAgICAgICAgbUFwcGxpY2F0aW9uSW5mby5kZXZpY2VQcm90ZWN0ZWREYXRhRGlyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvZGF0YS91c2VyLyIgKyBjdXJyZW50VXNlcklkICsgIi8iICsgU1lOQ19BQ0NPVU5UX0FDQ0VTU19TVFVCX1BBQ0tBR0VfTkFNRSwKKyAgICAgICAgICAgICAgICBtQXBwbGljYXRpb25JbmZvLmNyZWRlbnRpYWxQcm90ZWN0ZWREYXRhRGlyKTsKKyAgICAgICAgYXNzZXJ0TnVsbChtQXBwbGljYXRpb25JbmZvLnNoYXJlZExpYnJhcnlGaWxlcyk7CisgICAgICAgIGFzc2VydFRydWUobUFwcGxpY2F0aW9uSW5mby5lbmFibGVkKTsKKyAgICAgICAgYXNzZXJ0TnVsbChtQXBwbGljYXRpb25JbmZvLm1hbmFnZVNwYWNlQWN0aXZpdHlOYW1lKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1BcHBsaWNhdGlvbkluZm8uZGVzY3JpcHRpb25SZXMpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbUFwcGxpY2F0aW9uSW5mby51aU9wdGlvbnMpOworICAgICAgICBhc3NlcnRFcXVhbHMoQ0FURUdPUllfVU5ERUZJTkVELCBtQXBwbGljYXRpb25JbmZvLmNhdGVnb3J5KTsKKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZD1JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgc2V0T3duQXBwQ2F0ZWdvcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VNYW5hZ2VyKCkuc2V0QXBwbGljYXRpb25DYXRlZ29yeUhpbnQoZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VOYW1lKCksCisgICAgICAgICAgICAgICAgQ0FURUdPUllfTUFQUyk7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQ9SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHNldEFwcENhdGVnb3J5QnlOb3RJbnN0YWxsZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VNYW5hZ2VyKCkuc2V0QXBwbGljYXRpb25DYXRlZ29yeUhpbnQoCisgICAgICAgICAgICAgICAgU1lOQ19BQ0NPVU5UX0FDQ0VTU19TVFVCX1BBQ0tBR0VfTkFNRSwgQ0FURUdPUllfTUFQUyk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvY29udGVudC9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9GZWF0dXJlVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvY29udGVudC9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9GZWF0dXJlVGVzdC5qYXZhCmluZGV4IDE5YmYxMjguLjg3YWE2MTMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvc3JjL2FuZHJvaWQvY29udGVudC9wbS9jdHMvRmVhdHVyZVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9jb250ZW50L3NyYy9hbmRyb2lkL2NvbnRlbnQvcG0vY3RzL0ZlYXR1cmVUZXN0LmphdmEKQEAgLTE3LDEzICsxNywxOSBAQAogCiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uRmVhdHVyZUdyb3VwSW5mbzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uRmVhdHVyZUluZm87CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VJbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJhdHRlcnlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuRW52aXJvbm1lbnQ7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAoraW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CiAKQEAgLTMzLDEyICszOSwyMCBAQAogCiAgICAgcHJpdmF0ZSBQYWNrYWdlTWFuYWdlciBtUGFja2FnZU1hbmFnZXI7CiAgICAgcHJpdmF0ZSBBY3Rpdml0eU1hbmFnZXIgbUFjdGl2aXR5TWFuYWdlcjsKKyAgICBwcml2YXRlIFdpbmRvd01hbmFnZXIgbVdpbmRvd01hbmFnZXI7CisgICAgcHJpdmF0ZSBib29sZWFuIG1TdXBwb3J0c0RldmljZUFkbWluOworICAgIHByaXZhdGUgYm9vbGVhbiBtU3VwcG9ydHNNYW5hZ2VkUHJvZmlsZXM7CiAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBzdXBlci5zZXRVcCgpOwogICAgICAgICBtUGFja2FnZU1hbmFnZXIgPSBnZXRDb250ZXh0KCkuZ2V0UGFja2FnZU1hbmFnZXIoKTsKICAgICAgICAgbUFjdGl2aXR5TWFuYWdlciA9IChBY3Rpdml0eU1hbmFnZXIpZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BQ1RJVklUWV9TRVJWSUNFKTsKKyAgICAgICAgbVdpbmRvd01hbmFnZXIgPSAoV2luZG93TWFuYWdlcikgZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5XSU5ET1dfU0VSVklDRSk7CisgICAgICAgIG1TdXBwb3J0c0RldmljZUFkbWluID0KKyAgICAgICAgICAgICAgICBtUGFja2FnZU1hbmFnZXIuaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX0RFVklDRV9BRE1JTik7CisgICAgICAgIG1TdXBwb3J0c01hbmFnZWRQcm9maWxlcyA9CisgICAgICAgICAgICAgICAgbVBhY2thZ2VNYW5hZ2VyLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9NQU5BR0VEX1VTRVJTKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9NYW5hZ2VkVXNlcnNJZkxvd1JhbURldmljZSgpIHsKQEAgLTQ3LDcgKzYxLDY0IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1BY3Rpdml0eU1hbmFnZXIuaXNMb3dSYW1EZXZpY2UoKSkgewotICAgICAgICAgICAgYXNzZXJ0RmFsc2UobVBhY2thZ2VNYW5hZ2VyLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9NQU5BR0VEX1VTRVJTKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShtU3VwcG9ydHNNYW5hZ2VkUHJvZmlsZXMpOwogICAgICAgICB9CiAgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB3aGV0aGVyIGRldmljZSBzdXBwb3J0cyBtYW5hZ2VkIHByb2ZpbGVzIGFzIHJlcXVpcmVkIGJ5IENERAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RNYW5hZ2VkUHJvZmlsZVN1cHBvcnRlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBNYW5hZ2VkIHByb2ZpbGVzIG9ubHkgcmVxdWlyZWQgaWYgZGV2aWNlIGFkbWluIGZlYXR1cmUgaXMgc3VwcG9ydGVkCisgICAgICAgIGlmICghbVN1cHBvcnRzRGV2aWNlQWRtaW4pIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIlNraXBwaW5nIHRlc3RNYW5hZ2VkUHJvZmlsZVN1cHBvcnRlZCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1TdXBwb3J0c01hbmFnZWRQcm9maWxlcykgeworICAgICAgICAgICAgLy8gTWFuYWdlZCBwcm9maWxlcyBzdXBwb3J0ZWQgbm90aGluZyB0byBjaGVjay4KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE1hbmFnZWQgcHJvZmlsZXMgb25seSByZXF1aXJlZCBmb3IgaGFuZGhlbGQgZGV2aWNlcworICAgICAgICBpZiAoIWlzSGFuZGhlbGREZXZpY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2tpcCB0aGUgdGVzdHMgZm9yIG5vbi1lbXVsYXRlZCBzZGNhcmQKKyAgICAgICAgaWYgKCFFbnZpcm9ubWVudC5pc0V4dGVybmFsU3RvcmFnZUVtdWxhdGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNraXAgdGhlIHRlc3RzIGZvciBsb3ctUkFNIGRldmljZXMKKyAgICAgICAgaWYgKG1BY3Rpdml0eU1hbmFnZXIuaXNMb3dSYW1EZXZpY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZmFpbCgiRGV2aWNlIHNob3VsZCBzdXBwb3J0IG1hbmFnZWQgcHJvZmlsZXMsIGJ1dCAiCisgICAgICAgICAgICAgICAgKyBQYWNrYWdlTWFuYWdlci5GRUFUVVJFX01BTkFHRURfVVNFUlMgKyAiIGlzIG5vdCBlbmFibGVkIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIENERCBkZWZpbmVzIGEgaGFuZGhlbGQgZGV2aWNlIGFzIG9uZSB0aGF0IGhhcyBhIGJhdHRlcnkgYW5kIGEgc2NyZWVuIHNpemUgYmV0d2VlbgorICAgICAqIDIuNSBhbmQgOCBpbmNoZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGlzSGFuZGhlbGREZXZpY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZG91YmxlIHNjcmVlbkluY2hlcyA9IGdldFNjcmVlblNpemVJbkluY2hlcygpOworICAgICAgICByZXR1cm4gZGV2aWNlSGFzQmF0dGVyeSgpICYmIHNjcmVlbkluY2hlcyA+PSAyLjUgJiYgc2NyZWVuSW5jaGVzIDw9IDguMDsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gZGV2aWNlSGFzQmF0dGVyeSgpIHsKKyAgICAgICAgZmluYWwgSW50ZW50IGJhdHRlcnlJbmZvID0gZ2V0Q29udGV4dCgpLnJlZ2lzdGVyUmVjZWl2ZXIobnVsbCwKKyAgICAgICAgICAgICAgICBuZXcgSW50ZW50RmlsdGVyKEludGVudC5BQ1RJT05fQkFUVEVSWV9DSEFOR0VEKSk7CisgICAgICAgIHJldHVybiBiYXR0ZXJ5SW5mby5nZXRCb29sZWFuRXh0cmEoQmF0dGVyeU1hbmFnZXIuRVhUUkFfUFJFU0VOVCwgdHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBkb3VibGUgZ2V0U2NyZWVuU2l6ZUluSW5jaGVzKCkgeworICAgICAgICBEaXNwbGF5TWV0cmljcyBkbSA9IG5ldyBEaXNwbGF5TWV0cmljcygpOworICAgICAgICBtV2luZG93TWFuYWdlci5nZXREZWZhdWx0RGlzcGxheSgpLmdldE1ldHJpY3MoZG0pOworICAgICAgICBkb3VibGUgd2lkdGhJbkluY2hlc1NxdWFyZWQgPSBNYXRoLnBvdyhkbS53aWR0aFBpeGVscy9kbS54ZHBpLDIpOworICAgICAgICBkb3VibGUgaGVpZ2h0SW5JbmNoZXNTcXVhcmVkID0gTWF0aC5wb3coZG0uaGVpZ2h0UGl4ZWxzL2RtLnlkcGksMik7CisgICAgICAgIHJldHVybiBNYXRoLnNxcnQod2lkdGhJbkluY2hlc1NxdWFyZWQgKyBoZWlnaHRJbkluY2hlc1NxdWFyZWQpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvc3JjL2FuZHJvaWQvY29udGVudC9wbS9jdHMvSW5zdGFsbFNlc3Npb25QYXJhbXNVbml0VGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvY29udGVudC9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9JbnN0YWxsU2Vzc2lvblBhcmFtc1VuaXRUZXN0LmphdmEKaW5kZXggZDk3OGI3MC4uOTI3MjFlZiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvY29udGVudC9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9JbnN0YWxsU2Vzc2lvblBhcmFtc1VuaXRUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvY29udGVudC9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9JbnN0YWxsU2Vzc2lvblBhcmFtc1VuaXRUZXN0LmphdmEKQEAgLTM4LDkgKzM4LDEwIEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VJbnN0YWxsZXIuU2Vzc2lvblBhcmFtczsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKQEAgLTE4Myw3ICsxODQsNyBAQAogICAgICAgICBMaXN0PFNlc3Npb25JbmZvPiBteVNlc3Npb25JbmZvcyA9IGluc3RhbGxlci5nZXRNeVNlc3Npb25zKCk7CiAKICAgICAgICAgZm9yIChTZXNzaW9uSW5mbyBzZXNzaW9uSW5mbyA6IG15U2Vzc2lvbkluZm9zKSB7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvbkluZm8uc2Vzc2lvbklkID09IHNlc3Npb25JZCkgeworICAgICAgICAgICAgaWYgKHNlc3Npb25JbmZvLmdldFNlc3Npb25JZCgpID09IHNlc3Npb25JZCkgewogICAgICAgICAgICAgICAgIHJldHVybiBzZXNzaW9uSW5mbzsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvY29udGVudC9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9JbnN0YWxsU2Vzc2lvblRyYW5zZmVyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvY29udGVudC9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9JbnN0YWxsU2Vzc2lvblRyYW5zZmVyVGVzdC5qYXZhCmluZGV4IGRkNDU2NjguLmI5M2Y4NTggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvc3JjL2FuZHJvaWQvY29udGVudC9wbS9jdHMvSW5zdGFsbFNlc3Npb25UcmFuc2ZlclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9jb250ZW50L3NyYy9hbmRyb2lkL2NvbnRlbnQvcG0vY3RzL0luc3RhbGxTZXNzaW9uVHJhbnNmZXJUZXN0LmphdmEKQEAgLTMzLDggKzMzLDkgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlJlc29sdmVJbmZvOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIAogaW1wb3J0IGxpYmNvcmUuaW8uU3RyZWFtczsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvY29udGVudC9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9QYWNrYWdlSW5mb1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvc3JjL2FuZHJvaWQvY29udGVudC9wbS9jdHMvUGFja2FnZUluZm9UZXN0LmphdmEKaW5kZXggODg2YjRmNS4uOWU0ZmM1YyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvY29udGVudC9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9QYWNrYWdlSW5mb1Rlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9jb250ZW50L3NyYy9hbmRyb2lkL2NvbnRlbnQvcG0vY3RzL1BhY2thZ2VJbmZvVGVzdC5qYXZhCkBAIC02Myw3ICs2Myw3IEBACiAKICAgICBwcml2YXRlIHZvaWQgY2hlY2tQa2dJbmZvU2FtZShQYWNrYWdlSW5mbyBleHBlY3RlZCwgUGFja2FnZUluZm8gYWN0dWFsKSB7CiAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZC5wYWNrYWdlTmFtZSwgYWN0dWFsLnBhY2thZ2VOYW1lKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLnZlcnNpb25Db2RlLCBhY3R1YWwudmVyc2lvbkNvZGUpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuZ2V0TG9uZ1ZlcnNpb25Db2RlKCksIGFjdHVhbC5nZXRMb25nVmVyc2lvbkNvZGUoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZC52ZXJzaW9uTmFtZSwgYWN0dWFsLnZlcnNpb25OYW1lKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLnNoYXJlZFVzZXJJZCwgYWN0dWFsLnNoYXJlZFVzZXJJZCk7CiAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZC5zaGFyZWRVc2VyTGFiZWwsIGFjdHVhbC5zaGFyZWRVc2VyTGFiZWwpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvY29udGVudC9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9QYWNrYWdlTWFuYWdlclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvc3JjL2FuZHJvaWQvY29udGVudC9wbS9jdHMvUGFja2FnZU1hbmFnZXJUZXN0LmphdmEKaW5kZXggNTE0MGU2OS4uNjBhN2FiZCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvY29udGVudC9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9QYWNrYWdlTWFuYWdlclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9jb250ZW50L3NyYy9hbmRyb2lkL2NvbnRlbnQvcG0vY3RzL1BhY2thZ2VNYW5hZ2VyVGVzdC5qYXZhCkBAIC00NSwxMiArNDUsMTIgQEAKIHB1YmxpYyBjbGFzcyBQYWNrYWdlTWFuYWdlclRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgewogICAgIHByaXZhdGUgUGFja2FnZU1hbmFnZXIgbVBhY2thZ2VNYW5hZ2VyOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFX05BTUUgPSAiYW5kcm9pZC5jb250ZW50LmN0cyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfUEtHX05BTUUgPSAiYW5kcm9pZC5jb250ZW50LmN0cyI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElWSVRZX0FDVElPTl9OQU1FID0gImFuZHJvaWQuaW50ZW50LmFjdGlvbi5QTVRFU1QiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNQUlOX0FDVElPTl9OQU1FID0gImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9BQ1RJT05fTkFNRSA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLmNvbnRlbnQucG0uY3RzLmFjdGl2aXR5LlBNVEVTVF9TRVJWSUNFIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSTUlTU0lPTl9OQU1FID0gImFuZHJvaWQucGVybWlzc2lvbi5JTlRFUk5FVCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdSQU5URURfUEVSTUlTU0lPTl9OQU1FID0gImFuZHJvaWQucGVybWlzc2lvbi5JTlRFUk5FVCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVF9HUkFOVEVEX1BFUk1JU1NJT05fTkFNRSA9ICJhbmRyb2lkLnBlcm1pc3Npb24uSEFSRFdBUkVfVEVTVCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElWSVRZX05BTUUgPSAiYW5kcm9pZC5jb250ZW50LnBtLmN0cy5UZXN0UG1BY3Rpdml0eSI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfTkFNRSA9ICJhbmRyb2lkLmNvbnRlbnQucG0uY3RzLlRlc3RQbVNlcnZpY2UiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUNFSVZFUl9OQU1FID0gImFuZHJvaWQuY29udGVudC5wbS5jdHMuUG1UZXN0UmVjZWl2ZXIiOwpAQCAtMjMwLDcgKzIzMCw4IEBACiAgICAgICAgIGFzc2VydFRydWUobVBhY2thZ2VNYW5hZ2VyLmdldFBhY2thZ2VHaWRzKFBBQ0tBR0VfTkFNRSkubGVuZ3RoID4gMCk7CiAKICAgICAgICAgLy8gVGVzdCBnZXRQZXJtaXNzaW9uSW5mbwotICAgICAgICBhc3NlcnRFcXVhbHMoUEVSTUlTU0lPTl9OQU1FLCBtUGFja2FnZU1hbmFnZXIuZ2V0UGVybWlzc2lvbkluZm8oUEVSTUlTU0lPTl9OQU1FLCAwKS5uYW1lKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEdSQU5URURfUEVSTUlTU0lPTl9OQU1FLAorICAgICAgICAgICAgICAgIG1QYWNrYWdlTWFuYWdlci5nZXRQZXJtaXNzaW9uSW5mbyhHUkFOVEVEX1BFUk1JU1NJT05fTkFNRSwgMCkubmFtZSk7CiAKICAgICAgICAgLy8gVGVzdCBnZXRQZXJtaXNzaW9uR3JvdXBJbmZvCiAgICAgICAgIGFzc2VydEVxdWFscyhQRVJNSVNTSU9OR1JPVVBfTkFNRSwgbVBhY2thZ2VNYW5hZ2VyLmdldFBlcm1pc3Npb25Hcm91cEluZm8oCkBAIC0zODgsMTcgKzM4OSw2IEBACiAgICAgICAgICAgICAgICAgbVBhY2thZ2VNYW5hZ2VyLmdldENvbXBvbmVudEVuYWJsZWRTZXR0aW5nKGNvbXBvbmVudE5hbWUpKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3BQZXJtaXNzaW9uKCkgewotICAgICAgICBQZXJtaXNzaW9uSW5mbyBwZXJtaXNzaW9uSW5mbyA9IG5ldyBQZXJtaXNzaW9uSW5mbygpOwotICAgICAgICBTdHJpbmcgcGVybWlzc2lvbk5hbWUgPSAiYW5kcm9pZC5jb250ZW50LmN0cy5wZXJtaXNzaW9uLlRFU1RfRFlOQU1JQy5BREQiOwotICAgICAgICBwZXJtaXNzaW9uSW5mby5uYW1lID0gcGVybWlzc2lvbk5hbWU7Ci0gICAgICAgIHBlcm1pc3Npb25JbmZvLmxhYmVsUmVzID0gUi5zdHJpbmcucGVybWxhYl90ZXN0RHluYW1pYzsKLSAgICAgICAgcGVybWlzc2lvbkluZm8ubm9uTG9jYWxpemVkTGFiZWwgPSAiVGVzdCBUcmVlIjsKLQotICAgICAgICAvLyBUT0RPOiBCdWcgSUQgMTU2MTE4MS4KLSAgICAgICAgLy8gQ2FuJ3QgYWRkIHBlcm1pc3Npb24gaW4gZHluYW1pYyB3YXkKLSAgICB9Ci0KICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SWNvbigpIHRocm93cyBOYW1lTm90Rm91bmRFeGNlcHRpb24gewogICAgICAgICBhc3NlcnROb3ROdWxsKG1QYWNrYWdlTWFuYWdlci5nZXRBcHBsaWNhdGlvbkljb24oUEFDS0FHRV9OQU1FKSk7CiAgICAgICAgIGFzc2VydE5vdE51bGwobVBhY2thZ2VNYW5hZ2VyLmdldEFwcGxpY2F0aW9uSWNvbihtUGFja2FnZU1hbmFnZXIuZ2V0QXBwbGljYXRpb25JbmZvKApAQCAtNDE1LDExICs0MDUsMzUgQEAKICAgICAgICAgYXNzZXJ0Tm90TnVsbChtUGFja2FnZU1hbmFnZXIuZ2V0RHJhd2FibGUoUEFDS0FHRV9OQU1FLCBpY29uUmVzLCBhcHBJbmZvKSk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgdGVzdENoZWNrTWV0aG9kcygpIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tTaWduYXR1cmVzTWF0Y2goKSB7CisgICAgICAgIC8vIENvbXBhcmUgdGhlIHNpZ25hdHVyZSBvZiB0aGlzIHBhY2thZ2UgdG8gYW5vdGhlciBwYWNrYWdlIGluc3RhbGxlZCBieSB0aGlzIHRlc3Qgc3VpdGUKKyAgICAgICAgLy8gKHNlZSBBbmRyb2lkVGVzdC54bWwpLiBUaGVpciBzaWduYXR1cmVzIG11c3QgbWF0Y2guCiAgICAgICAgIGFzc2VydEVxdWFscyhQYWNrYWdlTWFuYWdlci5TSUdOQVRVUkVfTUFUQ0gsIG1QYWNrYWdlTWFuYWdlci5jaGVja1NpZ25hdHVyZXMoUEFDS0FHRV9OQU1FLAotICAgICAgICAgICAgICAgIENPTlRFTlRfUEtHX05BTUUpKTsKKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuY3RzLnN0dWIiKSk7CisgICAgICAgIC8vIFRoaXMgcGFja2FnZSdzIHNpZ25hdHVyZSBzaG91bGQgbWF0Y2ggaXRzIG93biBzaWduYXR1cmUuCisgICAgICAgIGFzc2VydEVxdWFscyhQYWNrYWdlTWFuYWdlci5TSUdOQVRVUkVfTUFUQ0gsIG1QYWNrYWdlTWFuYWdlci5jaGVja1NpZ25hdHVyZXMoUEFDS0FHRV9OQU1FLAorICAgICAgICAgICAgICAgIFBBQ0tBR0VfTkFNRSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDaGVja1NpZ25hdHVyZXNOb01hdGNoKCkgeworICAgICAgICAvLyBUaGlzIHRlc3QgcGFja2FnZSdzIHNpZ25hdHVyZSBzaG91bGRuJ3QgbWF0Y2ggdGhlIHN5c3RlbSdzIHNpZ25hdHVyZS4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKFBhY2thZ2VNYW5hZ2VyLlNJR05BVFVSRV9OT19NQVRDSCwgbVBhY2thZ2VNYW5hZ2VyLmNoZWNrU2lnbmF0dXJlcygKKyAgICAgICAgICAgICAgICBQQUNLQUdFX05BTUUsICJhbmRyb2lkIikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDaGVja1NpZ25hdHVyZXNVbmtub3duUGFja2FnZSgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFBhY2thZ2VNYW5hZ2VyLlNJR05BVFVSRV9VTktOT1dOX1BBQ0tBR0UsIG1QYWNrYWdlTWFuYWdlci5jaGVja1NpZ25hdHVyZXMoCisgICAgICAgICAgICAgICAgUEFDS0FHRV9OQU1FLCAidGhpcy5wYWNrYWdlLmRvZXMubm90LmV4aXN0IikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDaGVja1Blcm1pc3Npb25HcmFudGVkKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoUGFja2FnZU1hbmFnZXIuUEVSTUlTU0lPTl9HUkFOVEVELAotICAgICAgICAgICAgICAgIG1QYWNrYWdlTWFuYWdlci5jaGVja1Blcm1pc3Npb24oUEVSTUlTU0lPTl9OQU1FLCBQQUNLQUdFX05BTUUpKTsKKyAgICAgICAgICAgICAgICBtUGFja2FnZU1hbmFnZXIuY2hlY2tQZXJtaXNzaW9uKEdSQU5URURfUEVSTUlTU0lPTl9OQU1FLCBQQUNLQUdFX05BTUUpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tQZXJtaXNzaW9uTm90R3JhbnRlZCgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFBhY2thZ2VNYW5hZ2VyLlBFUk1JU1NJT05fREVOSUVELAorICAgICAgICAgICAgICAgIG1QYWNrYWdlTWFuYWdlci5jaGVja1Blcm1pc3Npb24oTk9UX0dSQU5URURfUEVSTUlTU0lPTl9OQU1FLCBQQUNLQUdFX05BTUUpKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZU1ldGhvZHMoKSB7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9jb250ZW50L3NyYy9hbmRyb2lkL2NvbnRlbnQvcmVzL2N0cy9Bc3NldEZpbGVEZXNjcmlwdG9yVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvY29udGVudC9zcmMvYW5kcm9pZC9jb250ZW50L3Jlcy9jdHMvQXNzZXRGaWxlRGVzY3JpcHRvclRlc3QuamF2YQppbmRleCBmNWRjNWNhLi5iNjE3MTY0IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9jb250ZW50L3NyYy9hbmRyb2lkL2NvbnRlbnQvcmVzL2N0cy9Bc3NldEZpbGVEZXNjcmlwdG9yVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvc3JjL2FuZHJvaWQvY29udGVudC9yZXMvY3RzL0Fzc2V0RmlsZURlc2NyaXB0b3JUZXN0LmphdmEKQEAgLTIwMCw1ICsyMDAsNyBAQAogICAgICAgICBhc3NlcnRFcXVhbHMob3V0LmdldERlY2xhcmVkTGVuZ3RoKCksIG1Bc3NldEZpbGVEZXMuZ2V0RGVjbGFyZWRMZW5ndGgoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhvdXQuZ2V0UGFyY2VsRmlsZURlc2NyaXB0b3IoKS5nZXRTdGF0U2l6ZSgpLAogICAgICAgICAgICAgICAgIG1Bc3NldEZpbGVEZXMuZ2V0UGFyY2VsRmlsZURlc2NyaXB0b3IoKS5nZXRTdGF0U2l6ZSgpKTsKKworICAgICAgICBwYXJjZWwucmVjeWNsZSgpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvc3JjL2FuZHJvaWQvY29udGVudC9yZXMvY3RzL0Fzc2V0TWFuYWdlclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvc3JjL2FuZHJvaWQvY29udGVudC9yZXMvY3RzL0Fzc2V0TWFuYWdlclRlc3QuamF2YQppbmRleCAxMzg3YmUwLi42OTk4MTAzIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9jb250ZW50L3NyYy9hbmRyb2lkL2NvbnRlbnQvcmVzL2N0cy9Bc3NldE1hbmFnZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvY29udGVudC9zcmMvYW5kcm9pZC9jb250ZW50L3Jlcy9jdHMvQXNzZXRNYW5hZ2VyVGVzdC5qYXZhCkBAIC0xNSwyMCArMTUsMjkgQEAKICAqLwogcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQucmVzLmN0czsKIAoraW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi50cnV0aC5UcnV0aC5hc3NlcnRUaGF0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5jdHMuUjsKLQotaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7Ci1pbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKLQogaW1wb3J0IGFuZHJvaWQuY29udGVudC5jdHMudXRpbC5YbWxVdGlsczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0RmlsZURlc2NyaXB0b3I7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldE1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5YbWxSZXNvdXJjZVBhcnNlcjsKLWltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwotaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TbWFsbFRlc3Q7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlR5cGVkVmFsdWU7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7CitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKKwogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwpAQCAtMzYsNTYgKzQ1LDcxIEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIAotCi1wdWJsaWMgY2xhc3MgQXNzZXRNYW5hZ2VyVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZXsKK0BSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgQXNzZXRNYW5hZ2VyVGVzdCB7CiAgICAgcHJpdmF0ZSBBc3NldE1hbmFnZXIgbUFzc2V0czsKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOworICAgIHByaXZhdGUgQ29udGV4dCBnZXRDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gbUNvbnRleHQ7CisgICAgfQorCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1Db250ZXh0ID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpOwogICAgICAgICBtQXNzZXRzID0gbUNvbnRleHQuZ2V0QXNzZXRzKCk7CiAgICAgfQogCiAgICAgQFNtYWxsVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RBc3NldE9wZXJhdGlvbnMoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBSZXNvdXJjZXMgcmVzID0gZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpOwotICAgICAgICBmaW5hbCBUeXBlZFZhbHVlIHZhbHVlID0gbmV3IFR5cGVkVmFsdWUoKTsKLSAgICAgICAgcmVzLmdldFZhbHVlKFIucmF3LnRleHQsIHZhbHVlLCB0cnVlKTsKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBc3NldE9wZXJhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgU3RyaW5nIGZpbGVOYW1lID0gInRleHQudHh0IjsKLSAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBtQXNzZXRzLm9wZW4oZmlsZU5hbWUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGlucHV0U3RyZWFtKTsKICAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdCA9ICJPbmVUd29UaHJlZUZvdXJGaXZlU2l4U2V2ZW5FaWdodE5pbmVUZW4iOworCisgICAgICAgIGZpbmFsIFR5cGVkVmFsdWUgdmFsdWUgPSBuZXcgVHlwZWRWYWx1ZSgpOworICAgICAgICBmaW5hbCBSZXNvdXJjZXMgcmVzID0gZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpOworICAgICAgICByZXMuZ2V0VmFsdWUoUi5yYXcudGV4dCwgdmFsdWUsIHRydWUpOworCisgICAgICAgIElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbUFzc2V0cy5vcGVuKGZpbGVOYW1lKTsKKyAgICAgICAgYXNzZXJ0VGhhdChpbnB1dFN0cmVhbSkuaXNOb3ROdWxsKCk7CiAgICAgICAgIGFzc2VydENvbnRleHRFcXVhbHMoZXhwZWN0LCBpbnB1dFN0cmVhbSk7CisKICAgICAgICAgaW5wdXRTdHJlYW0gPSBtQXNzZXRzLm9wZW4oZmlsZU5hbWUsIEFzc2V0TWFuYWdlci5BQ0NFU1NfQlVGRkVSKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChpbnB1dFN0cmVhbSk7CisgICAgICAgIGFzc2VydFRoYXQoaW5wdXRTdHJlYW0pLmlzTm90TnVsbCgpOwogICAgICAgICBhc3NlcnRDb250ZXh0RXF1YWxzKGV4cGVjdCwgaW5wdXRTdHJlYW0pOwogCiAgICAgICAgIEFzc2V0RmlsZURlc2NyaXB0b3IgYXNzZXRGaWxlRGVzID0gbUFzc2V0cy5vcGVuRmQoZmlsZU5hbWUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGFzc2V0RmlsZURlcyk7CisgICAgICAgIGFzc2VydFRoYXQoYXNzZXRGaWxlRGVzKS5pc05vdE51bGwoKTsKICAgICAgICAgYXNzZXJ0Q29udGV4dEVxdWFscyhleHBlY3QsIGFzc2V0RmlsZURlcy5jcmVhdGVJbnB1dFN0cmVhbSgpKTsKKwogICAgICAgICBhc3NldEZpbGVEZXMgPSBtQXNzZXRzLm9wZW5Ob25Bc3NldEZkKHZhbHVlLnN0cmluZy50b1N0cmluZygpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChhc3NldEZpbGVEZXMpOworICAgICAgICBhc3NlcnRUaGF0KGFzc2V0RmlsZURlcykuaXNOb3ROdWxsKCk7CiAgICAgICAgIGFzc2VydENvbnRleHRFcXVhbHMoZXhwZWN0LCBhc3NldEZpbGVEZXMuY3JlYXRlSW5wdXRTdHJlYW0oKSk7CisKICAgICAgICAgYXNzZXRGaWxlRGVzID0gbUFzc2V0cy5vcGVuTm9uQXNzZXRGZCh2YWx1ZS5hc3NldENvb2tpZSwgdmFsdWUuc3RyaW5nLnRvU3RyaW5nKCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGFzc2V0RmlsZURlcyk7CisgICAgICAgIGFzc2VydFRoYXQoYXNzZXRGaWxlRGVzKS5pc05vdE51bGwoKTsKICAgICAgICAgYXNzZXJ0Q29udGV4dEVxdWFscyhleHBlY3QsIGFzc2V0RmlsZURlcy5jcmVhdGVJbnB1dFN0cmVhbSgpKTsKIAogICAgICAgICBYbWxSZXNvdXJjZVBhcnNlciBwYXJzZXIgPSBtQXNzZXRzLm9wZW5YbWxSZXNvdXJjZVBhcnNlcigiQW5kcm9pZE1hbmlmZXN0LnhtbCIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHBhcnNlcik7CisgICAgICAgIGFzc2VydFRoYXQocGFyc2VyKS5pc05vdE51bGwoKTsKICAgICAgICAgWG1sVXRpbHMuYmVnaW5Eb2N1bWVudChwYXJzZXIsICJtYW5pZmVzdCIpOwogICAgICAgICBwYXJzZXIgPSBtQXNzZXRzLm9wZW5YbWxSZXNvdXJjZVBhcnNlcigwLCAiQW5kcm9pZE1hbmlmZXN0LnhtbCIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHBhcnNlcik7CisgICAgICAgIGFzc2VydFRoYXQocGFyc2VyKS5pc05vdE51bGwoKTsKICAgICAgICAgYmVnaW5Eb2N1bWVudChwYXJzZXIsICJtYW5pZmVzdCIpOwogCiAgICAgICAgIFN0cmluZ1tdIGZpbGVzID0gbUFzc2V0cy5saXN0KCIiKTsKLSAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKGZpbGVzW2ldLmVxdWFscyhmaWxlTmFtZSkpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0KTsKKyAgICAgICAgYXNzZXJ0VGhhdChmaWxlcykuaXNOb3ROdWxsKCk7CisKKyAgICAgICAgLy8gV2UgZG9uJ3QgZG8gYW4gZXhhY3QgbWF0Y2ggYmVjYXVzZSB0aGUgZnJhbWV3b3JrIGNhbiBhZGQgYXNzZXQgZmlsZXMgYW5kIHRoaXMgdGVzdAorICAgICAgICAvLyB3b3VsZCBiZSB0b28gYnJpdHRsZS4KKyAgICAgICAgYXNzZXJ0VGhhdChmaWxlcykuYXNMaXN0KCkuY29udGFpbnNBbGxPZihmaWxlTmFtZSwgInN1YmRpciIpOworCisgICAgICAgIGZpbGVzID0gbUFzc2V0cy5saXN0KCJzdWJkaXIiKTsKKyAgICAgICAgYXNzZXJ0VGhhdChmaWxlcykuaXNOb3ROdWxsKCk7CisgICAgICAgIGFzc2VydFRoYXQoZmlsZXMpLmFzTGlzdCgpLmNvbnRhaW5zKCJzdWJkaXJfdGV4dC50eHQiKTsKKworICAgICAgICAvLyBUaGlzIGRpcmVjdG9yeSBkb2Vzbid0IGV4aXN0LgorICAgICAgICBhc3NlcnRUaGF0KG1Bc3NldHMubGlzdCgiX19mb29fX2Jhcl9fZGlyX18iKSkuYXNMaXN0KCkuaXNFbXB0eSgpOwogCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBtQXNzZXRzLm9wZW4oIm5vdEV4aXN0RmlsZS50eHQiLCBBc3NldE1hbmFnZXIuQUNDRVNTX0JVRkZFUik7CkBAIC0xMTUsMTIgKzEzOSwxMiBAQAogICAgICAgICAgICAgLy8gZXhwZWN0ZWQKICAgICAgICAgfQogCi0gICAgICAgIGFzc2VydE5vdE51bGwobUFzc2V0cy5nZXRMb2NhbGVzKCkpOwotCisgICAgICAgIGFzc2VydFRoYXQobUFzc2V0cy5nZXRMb2NhbGVzKCkpLmlzTm90TnVsbCgpOwogICAgIH0KIAogICAgIEBTbWFsbFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24geworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENsb3NlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIEFzc2V0TWFuYWdlciBhc3NldHMgPSBuZXcgQXNzZXRNYW5hZ2VyKCk7CiAgICAgICAgIGFzc2V0cy5jbG9zZSgpOwogCkBAIC0xMzYsNiArMTYwLDcgQEAKICAgICB9CiAKICAgICBAU21hbGxUZXN0CisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Tm9uU3lzdGVtTG9jYWxlcygpIHsKICAgICAgICAgLy8gVGhpcyBpcyB0aGUgbGlzdCBvZiBsb2NhbGVzIGJ1aWx0IGludG8gdGhpcyB0ZXN0IHBhY2thZ2UuIEl0IGlzIGJhc2ljYWxseSB0aGUgbG9jYWxlcwogICAgICAgICAvLyBzcGVjaWZpZWQgaW4gdGhlIEFuZHJvaWQubWsgZmlsZXMgKGFzc3VtaW5nIHRoZXkgaGF2ZSBjb3JyZXNwb25kaW5nIHJlc291cmNlcyksIHBsdXMgdGhlCkBAIC0xNjYsOSArMTkxLDYgQEAKICAgICAgICAgICAgICJ4eC1ZWSIKICAgICAgICAgfTsKIAotICAgICAgICBmaW5hbCBIYXNoU2V0PFN0cmluZz4gS05PV05fTE9DQUxFU19TRVQgPQotICAgICAgICAgICAgICAgIG5ldyBIYXNoU2V0PFN0cmluZz4oQXJyYXlzLmFzTGlzdChLTk9XTl9MT0NBTEVTKSk7Ci0KICAgICAgICAgZmluYWwgU3RyaW5nIFBTRVVET19PUl9FTVBUWV9MT0NBTEVTW10gPSB7CiAgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJlbi1YQSIsCkBAIC0xNzcsMzEgKzE5OSwyNiBAQAogCiAgICAgICAgIFN0cmluZyBsb2NhbGVzW10gPSBtQXNzZXRzLmdldE5vblN5c3RlbUxvY2FsZXMoKTsKICAgICAgICAgSGFzaFNldDxTdHJpbmc+IGxvY2FsZXNTZXQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KEFycmF5cy5hc0xpc3QobG9jYWxlcykpOwotICAgICAgICBmb3IgKFN0cmluZyBsIDogUFNFVURPX09SX0VNUFRZX0xPQ0FMRVMpIHsKLSAgICAgICAgICAgIGxvY2FsZXNTZXQucmVtb3ZlKGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKEtOT1dOX0xPQ0FMRVNfU0VULCBsb2NhbGVzU2V0KTsKKyAgICAgICAgbG9jYWxlc1NldC5yZW1vdmVBbGwoQXJyYXlzLmFzTGlzdChQU0VVRE9fT1JfRU1QVFlfTE9DQUxFUykpOworICAgICAgICBhc3NlcnRUaGF0KGxvY2FsZXNTZXQpLmNvbnRhaW5zRXhhY3RseUVsZW1lbnRzSW4oQXJyYXlzLmFzTGlzdChLTk9XTl9MT0NBTEVTKSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGFzc2VydENvbnRleHRFcXVhbHMoZmluYWwgU3RyaW5nIGV4cGVjdCwgZmluYWwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pCiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBmaW5hbCBCdWZmZXJlZFJlYWRlciBiZiA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW5wdXRTdHJlYW0pKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdCA9IGJmLnJlYWRMaW5lKCk7Ci0gICAgICAgIGlucHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmVzdWx0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdCwgcmVzdWx0KTsKKyAgICAgICAgdHJ5IChmaW5hbCBCdWZmZXJlZFJlYWRlciBiZiA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW5wdXRTdHJlYW0pKSkgeworICAgICAgICAgICAgYXNzZXJ0VGhhdChiZi5yZWFkTGluZSgpKS5pc0VxdWFsVG8oZXhwZWN0KTsKKyAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBiZWdpbkRvY3VtZW50KGZpbmFsIFhtbFB1bGxQYXJzZXIgcGFyc2VyLGZpbmFsICBTdHJpbmcgZmlyc3RFbGVtZW50TmFtZSkKKyAgICBwcml2YXRlIHZvaWQgYmVnaW5Eb2N1bWVudChmaW5hbCBYbWxQdWxsUGFyc2VyIHBhcnNlciwgZmluYWwgU3RyaW5nIGZpcnN0RWxlbWVudE5hbWUpCiAgICAgICAgICAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogICAgICAgICBpbnQgdHlwZTsKICAgICAgICAgd2hpbGUgKCh0eXBlID0gcGFyc2VyLm5leHQoKSkgIT0gWG1sUHVsbFBhcnNlci5TVEFSVF9UQUcpIHsKICAgICAgICAgfQorCiAgICAgICAgIGlmICh0eXBlICE9IFhtbFB1bGxQYXJzZXIuU1RBUlRfVEFHKSB7CiAgICAgICAgICAgICBmYWlsKCJObyBzdGFydCB0YWcgZm91bmQiKTsKICAgICAgICAgfQotICAgICAgICBhc3NlcnRFcXVhbHMoZmlyc3RFbGVtZW50TmFtZSwgcGFyc2VyLmdldE5hbWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoZmlyc3RFbGVtZW50TmFtZSkuaXNFcXVhbFRvKHBhcnNlci5nZXROYW1lKCkpOwogICAgIH0KLQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvY29udGVudC9zcmMvYW5kcm9pZC9jb250ZW50L3Jlcy9jdHMvQXNzZXRNYW5hZ2VyX0Fzc2V0SW5wdXRTdHJlYW1UZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9jb250ZW50L3NyYy9hbmRyb2lkL2NvbnRlbnQvcmVzL2N0cy9Bc3NldE1hbmFnZXJfQXNzZXRJbnB1dFN0cmVhbVRlc3QuamF2YQppbmRleCAzMmMxYTNhLi5hOTQ1NTFjIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9jb250ZW50L3NyYy9hbmRyb2lkL2NvbnRlbnQvcmVzL2N0cy9Bc3NldE1hbmFnZXJfQXNzZXRJbnB1dFN0cmVhbVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9jb250ZW50L3NyYy9hbmRyb2lkL2NvbnRlbnQvcmVzL2N0cy9Bc3NldE1hbmFnZXJfQXNzZXRJbnB1dFN0cmVhbVRlc3QuamF2YQpAQCAtMTUsMTE0ICsxNSwxNDYgQEAKICAqLwogcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQucmVzLmN0czsKIAotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CiAKLXB1YmxpYyBjbGFzcyBBc3NldE1hbmFnZXJfQXNzZXRJbnB1dFN0cmVhbVRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgewotICAgIHByaXZhdGUgQXNzZXRNYW5hZ2VyLkFzc2V0SW5wdXRTdHJlYW0gbUFzc2V0SW5wdXRTdHJlYW07Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgQ09OVEVOVF9TVFJJTkcgPSAiT25lVHdvVGhyZWVGb3VyRml2ZVNpeFNldmVuRWlnaHROaW5lVGVuIjsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBtQXNzZXRJbnB1dFN0cmVhbSA9IChBc3NldE1hbmFnZXIuQXNzZXRJbnB1dFN0cmVhbSltQ29udGV4dC5nZXRBc3NldHMoKS5vcGVuKCJ0ZXh0LnR4dCIpOworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKKworQFNtYWxsVGVzdAorcHVibGljIGNsYXNzIEFzc2V0TWFuYWdlcl9Bc3NldElucHV0U3RyZWFtVGVzdCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIEVYUEVDVEVEX0JZVEVTID0gIk9uZVR3b1RocmVlRm91ckZpdmVTaXhTZXZlbkVpZ2h0TmluZVRlbiIuZ2V0Qnl0ZXMoCisgICAgICAgICAgICBTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKyAgICBwcml2YXRlIElucHV0U3RyZWFtIG1Bc3NldElucHV0U3RyZWFtOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1Bc3NldElucHV0U3RyZWFtID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpLmdldEFzc2V0cygpLm9wZW4oInRleHQudHh0Iik7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgdGVzdENsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBtQXNzZXRJbnB1dFN0cmVhbS5jbG9zZSgpOworICAgIH0KIAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENsb3NlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1Bc3NldElucHV0U3RyZWFtLmNsb3NlKCk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBtQXNzZXRJbnB1dFN0cmVhbS5yZWFkKCk7Ci0gICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgZXhjZXB0aW9uIik7Ci0gICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoInJlYWQgYWZ0ZXIgY2xvc2Ugc2hvdWxkIHRocm93IGFuIGV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgLy8gZXhwZWN0ZWQKICAgICAgICAgfQogICAgIH0KIAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEdldEFzc2V0SW50KCkgeworICAgICAgICBBc3NldE1hbmFnZXIuQXNzZXRJbnB1dFN0cmVhbSBhc3NldElucHV0U3RyZWFtID0KKyAgICAgICAgICAgICAgICAoQXNzZXRNYW5hZ2VyLkFzc2V0SW5wdXRTdHJlYW0pIG1Bc3NldElucHV0U3RyZWFtOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgLy8gZ2V0QXNzZXRJbnQgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4KLSAgICAgICAgICAgIG1Bc3NldElucHV0U3RyZWFtLmdldEFzc2V0SW50KCk7Ci0gICAgICAgICAgICBmYWlsKCk7CisgICAgICAgICAgICBhc3NldElucHV0U3RyZWFtLmdldEFzc2V0SW50KCk7CisgICAgICAgICAgICBmYWlsKCJnZXRBc3NldEludCBzaG91bGQgdGhyb3cgYW4gZXhjZXB0aW9uIik7CiAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4cGVjdGVkKSB7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RNYXJrUmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBhc3NlcnRUcnVlKG1Bc3NldElucHV0U3RyZWFtLm1hcmtTdXBwb3J0ZWQoKSk7Ci0gICAgICAgIGZpbmFsIGludCByZWFkbGltaXQgPSAxMDsKLSAgICAgICAgZmluYWwgYnl0ZVtdIGJ5dGVzID0gQ09OVEVOVF9TVFJJTkcuZ2V0Qnl0ZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWFkbGltaXQ7IGkrKykgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJ5dGVzW2ldLCBtQXNzZXRJbnB1dFN0cmVhbS5yZWFkKCkpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhFWFBFQ1RFRF9CWVRFU1tpXSwgbUFzc2V0SW5wdXRTdHJlYW0ucmVhZCgpKTsKICAgICAgICAgfQotICAgICAgICBtQXNzZXRJbnB1dFN0cmVhbS5tYXJrKHJlYWRsaW1pdCk7CisgICAgICAgIG1Bc3NldElucHV0U3RyZWFtLm1hcmsoMTApOwogICAgICAgICBtQXNzZXRJbnB1dFN0cmVhbS5yZXNldCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlYWRsaW1pdDsgaSsrKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoYnl0ZXNbaSArIHJlYWRsaW1pdF0sIG1Bc3NldElucHV0U3RyZWFtLnJlYWQoKSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEVYUEVDVEVEX0JZVEVTWzEwICsgaV0sIG1Bc3NldElucHV0U3RyZWFtLnJlYWQoKSk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZE1ldGhvZHMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAvLyB0ZXN0IGF2YWlsYWJsZSgpCi0gICAgICAgIGZpbmFsIGJ5dGVbXSBieXRlcyA9IENPTlRFTlRfU1RSSU5HLmdldEJ5dGVzKCk7Ci0gICAgICAgIGludCBsZW4gPSBtQXNzZXRJbnB1dFN0cmVhbS5hdmFpbGFibGUoKTsKLSAgICAgICAgaW50IGVuZCA9IC0xOwotICAgICAgICBhc3NlcnRFcXVhbHMoQ09OVEVOVF9TVFJJTkcubGVuZ3RoKCksIGxlbik7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhieXRlc1tpXSwgbUFzc2V0SW5wdXRTdHJlYW0ucmVhZCgpKTsKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGVCeXRlUmVhZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoRVhQRUNURURfQllURVMubGVuZ3RoLCBtQXNzZXRJbnB1dFN0cmVhbS5hdmFpbGFibGUoKSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRVhQRUNURURfQllURVMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhFWFBFQ1RFRF9CWVRFU1tpXSwgbUFzc2V0SW5wdXRTdHJlYW0ucmVhZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhFWFBFQ1RFRF9CWVRFUy5sZW5ndGggLSBpIC0gMSwgbUFzc2V0SW5wdXRTdHJlYW0uYXZhaWxhYmxlKCkpOwogICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscyhlbmQsIG1Bc3NldElucHV0U3RyZWFtLnJlYWQoKSk7CiAKLSAgICAgICAgLy8gdGVzdCByZWFkKGJ5dGVbXSkKLSAgICAgICAgbUFzc2V0SW5wdXRTdHJlYW0ucmVzZXQoKTsKLSAgICAgICAgaW50IGRhdGFMZW5ndGggPSAxMDsKLSAgICAgICAgYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVtkYXRhTGVuZ3RoXTsKLSAgICAgICAgaW50IHJldCA9IG1Bc3NldElucHV0U3RyZWFtLnJlYWQoZGF0YSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhkYXRhTGVuZ3RoLCByZXQpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRhdGFMZW5ndGg7IGkrKykgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJ5dGVzW2ldLCBkYXRhW2ldKTsKLSAgICAgICAgfQotICAgICAgICBkYXRhID0gbmV3IGJ5dGVbbGVuIC0gZGF0YUxlbmd0aF07Ci0gICAgICAgIGFzc2VydEVxdWFscyhsZW4gLSBkYXRhTGVuZ3RoLCBtQXNzZXRJbnB1dFN0cmVhbS5yZWFkKGRhdGEpKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW4gLSBkYXRhTGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhieXRlc1tpICsgZGF0YUxlbmd0aF0sIGRhdGFbaV0pOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscyhlbmQsIG1Bc3NldElucHV0U3RyZWFtLnJlYWQoZGF0YSkpOworICAgICAgICAvLyBDaGVjayBlbmQtb2YtZmlsZSBjb25kaXRpb24uCisgICAgICAgIGFzc2VydEVxdWFscygtMSwgbUFzc2V0SW5wdXRTdHJlYW0ucmVhZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1Bc3NldElucHV0U3RyZWFtLmF2YWlsYWJsZSgpKTsKKyAgICB9CiAKLSAgICAgICAgLy8gdGVzdCByZWFkKGJ5dGVwW10sIGludCwgaW50KQotICAgICAgICBtQXNzZXRJbnB1dFN0cmVhbS5yZXNldCgpOwotICAgICAgICBpbnQgb2Zmc2V0ID0gMDsKLSAgICAgICAgcmV0ID0gbUFzc2V0SW5wdXRTdHJlYW0ucmVhZChkYXRhLCBvZmZzZXQsIGRhdGFMZW5ndGgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZGF0YUxlbmd0aCwgcmV0KTsKLSAgICAgICAgZm9yIChpbnQgaSA9IG9mZnNldDsgaSA8IHJldDsgaSsrKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoYnl0ZXNbaV0sIGRhdGFbb2Zmc2V0ICsgaV0pOworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJ5dGVBcnJheVJlYWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzEwXTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEwLCBtQXNzZXRJbnB1dFN0cmVhbS5yZWFkKGJ1ZmZlcikpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhFWFBFQ1RFRF9CWVRFU1tpXSwgYnVmZmVyW2ldKTsKICAgICAgICAgfQotICAgICAgICBtQXNzZXRJbnB1dFN0cmVhbS5yZXNldCgpOwotICAgICAgICBvZmZzZXQgPSAyOwotICAgICAgICByZXQgPSBtQXNzZXRJbnB1dFN0cmVhbS5yZWFkKGRhdGEsIG9mZnNldCwgZGF0YUxlbmd0aCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhkYXRhTGVuZ3RoLCByZXQpOwotICAgICAgICBmb3IgKGludCBpID0gb2Zmc2V0OyBpIDwgcmV0OyBpKyspIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhieXRlc1tpXSwgZGF0YVtvZmZzZXQgKyBpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZGF0YSA9IG5ldyBieXRlW2xlbiArIG9mZnNldF07Ci0gICAgICAgIHJldCA9IG1Bc3NldElucHV0U3RyZWFtLnJlYWQoZGF0YSwgb2Zmc2V0LCBsZW4pOwotICAgICAgICBhc3NlcnRFcXVhbHMobGVuIC0gZGF0YUxlbmd0aCwgcmV0KTsKLSAgICAgICAgZm9yIChpbnQgaSA9IG9mZnNldDsgaSA8IHJldDsgaSsrKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoYnl0ZXNbaSArIGRhdGFMZW5ndGhdLCBkYXRhW29mZnNldCArIGldKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRFcXVhbHMoZW5kLCBtQXNzZXRJbnB1dFN0cmVhbS5yZWFkKGRhdGEsIG9mZnNldCwgbGVuKSk7Ci0gICAgICAgIC8vIHRlc3QgbGVuIGlzIHplcm8sCi0gICAgICAgIG1Bc3NldElucHV0U3RyZWFtLnJlc2V0KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBtQXNzZXRJbnB1dFN0cmVhbS5yZWFkKGRhdGEsIDAsIDApKTsKLSAgICAgICAgLy8gdGVzdCBza2lwKGludCkKLSAgICAgICAgaW50IHNraXBMZW50aCA9IDg7Ci0gICAgICAgIG1Bc3NldElucHV0U3RyZWFtLnJlc2V0KCk7Ci0gICAgICAgIG1Bc3NldElucHV0U3RyZWFtLnNraXAoc2tpcExlbnRoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKENPTlRFTlRfU1RSSU5HLmNoYXJBdChza2lwTGVudGgpLCBtQXNzZXRJbnB1dFN0cmVhbS5yZWFkKCkpOwogCi0gICAgICAgIC8vIHRlc3QgcmVhZChieXRlW10gYiksIGIgaXMgbnVsbAorICAgICAgICBidWZmZXIgPSBuZXcgYnl0ZVs1XTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUsIG1Bc3NldElucHV0U3RyZWFtLnJlYWQoYnVmZmVyKSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoRVhQRUNURURfQllURVNbMTAgKyBpXSwgYnVmZmVyW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIGVuZC1vZi1maWxlIGNvbmRpdGlvbi4KKyAgICAgICAgYnVmZmVyID0gbmV3IGJ5dGVbRVhQRUNURURfQllURVMubGVuZ3RoIC0gMTVdOworICAgICAgICBhc3NlcnRFcXVhbHMoYnVmZmVyLmxlbmd0aCwgbUFzc2V0SW5wdXRTdHJlYW0ucmVhZChidWZmZXIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBtQXNzZXRJbnB1dFN0cmVhbS5yZWFkKGJ1ZmZlcikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbUFzc2V0SW5wdXRTdHJlYW0uYXZhaWxhYmxlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJ5dGVBcnJheVJlYWRPZmZzZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzE1XTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEwLCBtQXNzZXRJbnB1dFN0cmVhbS5yZWFkKGJ1ZmZlciwgMCwgMTApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEVYUEVDVEVEX0JZVEVTLmxlbmd0aCAtIDEwLCBtQXNzZXRJbnB1dFN0cmVhbS5hdmFpbGFibGUoKSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEVYUEVDVEVEX0JZVEVTW2ldLCBidWZmZXJbaV0pOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUsIG1Bc3NldElucHV0U3RyZWFtLnJlYWQoYnVmZmVyLCAxMCwgNSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoRVhQRUNURURfQllURVMubGVuZ3RoIC0gMTUsIG1Bc3NldElucHV0U3RyZWFtLmF2YWlsYWJsZSgpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNTsgaSsrKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoRVhQRUNURURfQllURVNbaV0sIGJ1ZmZlcltpXSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayBlbmQtb2YtZmlsZSBjb25kaXRpb24uCisgICAgICAgIGJ1ZmZlciA9IG5ldyBieXRlW0VYUEVDVEVEX0JZVEVTLmxlbmd0aF07CisgICAgICAgIGFzc2VydEVxdWFscyhFWFBFQ1RFRF9CWVRFUy5sZW5ndGggLSAxNSwKKyAgICAgICAgICAgICAgICBtQXNzZXRJbnB1dFN0cmVhbS5yZWFkKGJ1ZmZlciwgMTUsIEVYUEVDVEVEX0JZVEVTLmxlbmd0aCAtIDE1KSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgbUFzc2V0SW5wdXRTdHJlYW0ucmVhZChidWZmZXIsIDAsIDEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1Bc3NldElucHV0U3RyZWFtLmF2YWlsYWJsZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTa2lwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscyg4LCBtQXNzZXRJbnB1dFN0cmVhbS5za2lwKDgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEVYUEVDVEVEX0JZVEVTLmxlbmd0aCAtIDgsIG1Bc3NldElucHV0U3RyZWFtLmF2YWlsYWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEVYUEVDVEVEX0JZVEVTWzhdLCBtQXNzZXRJbnB1dFN0cmVhbS5yZWFkKCkpOworCisgICAgICAgIC8vIENoZWNrIHRoYXQgc2tpcCByZXNwZWN0cyB0aGUgYXZhaWxhYmxlIHNwYWNlLgorICAgICAgICBhc3NlcnRFcXVhbHMoRVhQRUNURURfQllURVMubGVuZ3RoIC0gOCAtIDEsIG1Bc3NldElucHV0U3RyZWFtLnNraXAoMTAwMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbUFzc2V0SW5wdXRTdHJlYW0uYXZhaWxhYmxlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFyZ3VtZW50RWRnZUNhc2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHRlc3QgcmVhZChieXRlW10pOiBieXRlW10gaXMgbnVsbAogICAgICAgICB0cnkgewogICAgICAgICAgICAgbUFzc2V0SW5wdXRTdHJlYW0ucmVhZChudWxsKTsKICAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBOdWxsUG9pbnRlckV4Y2VwdGlvbiAiKTsKQEAgLTEzMCwzNCArMTYyLDM5IEBACiAgICAgICAgICAgICAvLyBleHBlY3RlZAogICAgICAgICB9CiAKKyAgICAgICAgLy8gdGVzdCByZWFkKGJ5dGVbXSwgaW50LCBpbnQpOiBieXRlW10gaXMgbnVsbAogICAgICAgICB0cnkgewogICAgICAgICAgICAgbUFzc2V0SW5wdXRTdHJlYW0ucmVhZChudWxsLCAwLCBtQXNzZXRJbnB1dFN0cmVhbS5hdmFpbGFibGUoKSk7CiAgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgTnVsbFBvaW50ZXJFeGNlcHRpb24gIik7CiAgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIC8vIGV4cGVjdGVkCiAgICAgICAgIH0KLSAgICAgICAgLy8gdGVzdCByZWFkKGJ5dGVwW10sIGludCwgaW50KTogb2Zmc2V0IGlzIG5lZ2F0aXZlLAorCisgICAgICAgIC8vIHRlc3QgcmVhZChieXRlW10pOiBieXRlW10gaXMgbGVuIDAKKyAgICAgICAgZmluYWwgaW50IHByZXZpb3VzQXZhaWxhYmxlID0gbUFzc2V0SW5wdXRTdHJlYW0uYXZhaWxhYmxlKCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtQXNzZXRJbnB1dFN0cmVhbS5yZWFkKG5ldyBieXRlWzBdKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhwcmV2aW91c0F2YWlsYWJsZSwgbUFzc2V0SW5wdXRTdHJlYW0uYXZhaWxhYmxlKCkpOworCisgICAgICAgIC8vIHRlc3QgcmVhZChieXRlW10pOiBieXRlW10gaXMgbGVuIDAKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1Bc3NldElucHV0U3RyZWFtLnJlYWQobmV3IGJ5dGVbMF0sIDAsIDApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHByZXZpb3VzQXZhaWxhYmxlLCBtQXNzZXRJbnB1dFN0cmVhbS5hdmFpbGFibGUoKSk7CisKKyAgICAgICAgLy8gdGVzdCByZWFkKGJ5dGVbXSwgaW50LCBpbnQpOiBvZmZzZXQgaXMgbmVnYXRpdmUKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGRhdGEgPSBuZXcgYnl0ZVsxMF07CisgICAgICAgICAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlWzEwXTsKICAgICAgICAgICAgIG1Bc3NldElucHV0U3RyZWFtLnJlYWQoZGF0YSwgLTEsIG1Bc3NldElucHV0U3RyZWFtLmF2YWlsYWJsZSgpKTsKICAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uICIpOwogICAgICAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIC8vIGV4cGVjdGVkCiAgICAgICAgIH0KIAotICAgICAgICAvLyB0ZXN0IHJlYWQoYnl0ZXBbXSwgaW50LCBpbnQpOiBsZW4rb2Zmc2V0IGdyZWF0ZXIgdGhhbiBkYXRhIGxlbmd0aAorICAgICAgICAvLyB0ZXN0IHJlYWQoYnl0ZVtdLCBpbnQsIGludCk6IGxlbiArIG9mZnNldCBncmVhdGVyIHRoYW4gZGF0YSBsZW5ndGgKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGRhdGEgPSBuZXcgYnl0ZVsxMF07CisgICAgICAgICAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlWzEwXTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBtQXNzZXRJbnB1dFN0cmVhbS5yZWFkKGRhdGEsIDAsIGRhdGEubGVuZ3RoICsgMikpOwogICAgICAgICAgICAgZmFpbCgic2hvdWxkIHRocm93IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gIik7CiAgICAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKICAgICAgICAgfQogICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgICAgIG1Bc3NldElucHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgfQotCiB9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9jb250ZW50L3NyYy9hbmRyb2lkL2NvbnRlbnQvcmVzL2N0cy9Db2xvclN0YXRlTGlzdFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvc3JjL2FuZHJvaWQvY29udGVudC9yZXMvY3RzL0NvbG9yU3RhdGVMaXN0VGVzdC5qYXZhCmluZGV4IDIwMjliOTUuLmYzYmU4NjIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvc3JjL2FuZHJvaWQvY29udGVudC9yZXMvY3RzL0NvbG9yU3RhdGVMaXN0VGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvc3JjL2FuZHJvaWQvY29udGVudC9yZXMvY3RzL0NvbG9yU3RhdGVMaXN0VGVzdC5qYXZhCkBAIC0xMTEsNiArMTExLDggQEAKICAgICAgICAgZmluYWwgQ29sb3JTdGF0ZUxpc3QgYWN0dWFsID0gQ29sb3JTdGF0ZUxpc3QuQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKHBhcmNlbCk7CiAgICAgICAgIGFzc2VydEVxdWFscyhjLmlzU3RhdGVmdWwoKSwgYWN0dWFsLmlzU3RhdGVmdWwoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhjLmdldERlZmF1bHRDb2xvcigpLCBhY3R1YWwuZ2V0RGVmYXVsdENvbG9yKCkpOworCisgICAgICAgIHBhcmNlbC5yZWN5Y2xlKCk7CiAgICAgfQogCiAgICAgQFNtYWxsVGVzdApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvY29udGVudC9zcmMvYW5kcm9pZC9jb250ZW50L3Jlcy9jdHMvQ29uZmlndXJhdGlvblRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvc3JjL2FuZHJvaWQvY29udGVudC9yZXMvY3RzL0NvbmZpZ3VyYXRpb25UZXN0LmphdmEKaW5kZXggNzM1NTQzNy4uNGRiMWVlNSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvY29udGVudC9zcmMvYW5kcm9pZC9jb250ZW50L3Jlcy9jdHMvQ29uZmlndXJhdGlvblRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9jb250ZW50L3NyYy9hbmRyb2lkL2NvbnRlbnQvcmVzL2N0cy9Db25maWd1cmF0aW9uVGVzdC5qYXZhCkBAIC0xNiw4ICsxNiw2IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5jb250ZW50LnJlcy5jdHM7CiAKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkFjdGl2aXR5SW5mbzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5Mb2NhbGVMaXN0OwpAQCAtMjUsNiArMjMsOCBAQAogaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiAKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworCiBwdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvblRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgewogCiAgICAgcHJpdmF0ZSBDb25maWd1cmF0aW9uIG1Db25maWdEZWZhdWx0OwpAQCAtMzk3LDExICszOTcsMTEgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGVUb1BhcmNlbCgpIHsKLSAgICAgICAgYXNzZXJ0V3JpdGVUb1BhcmNlbChjcmVhdGVDb25maWcoKExvY2FsZSkgbnVsbCksIFBhcmNlbC5vYnRhaW4oKSk7Ci0gICAgICAgIGFzc2VydFdyaXRlVG9QYXJjZWwoY3JlYXRlQ29uZmlnKG5ldyBMb2NhbGUoIiIpKSwgUGFyY2VsLm9idGFpbigpKTsKLSAgICAgICAgYXNzZXJ0V3JpdGVUb1BhcmNlbChjcmVhdGVDb25maWcoTG9jYWxlLkpBUEFOKSwgUGFyY2VsLm9idGFpbigpKTsKLSAgICAgICAgYXNzZXJ0V3JpdGVUb1BhcmNlbChjcmVhdGVDb25maWcoTG9jYWxlLmZvckxhbmd1YWdlVGFnKCJlbi1TaGF3IikpLCBQYXJjZWwub2J0YWluKCkpOwotICAgICAgICBhc3NlcnRXcml0ZVRvUGFyY2VsKGNyZWF0ZUNvbmZpZyhMb2NhbGVMaXN0LmZvckxhbmd1YWdlVGFncygiZnIsZW4tVVMiKSksIFBhcmNlbC5vYnRhaW4oKSk7CisgICAgICAgIGFzc2VydFdyaXRlVG9QYXJjZWwoY3JlYXRlQ29uZmlnKChMb2NhbGUpIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0V3JpdGVUb1BhcmNlbChjcmVhdGVDb25maWcobmV3IExvY2FsZSgiIikpKTsKKyAgICAgICAgYXNzZXJ0V3JpdGVUb1BhcmNlbChjcmVhdGVDb25maWcoTG9jYWxlLkpBUEFOKSk7CisgICAgICAgIGFzc2VydFdyaXRlVG9QYXJjZWwoY3JlYXRlQ29uZmlnKExvY2FsZS5mb3JMYW5ndWFnZVRhZygiZW4tU2hhdyIpKSk7CisgICAgICAgIGFzc2VydFdyaXRlVG9QYXJjZWwoY3JlYXRlQ29uZmlnKExvY2FsZUxpc3QuZm9yTGFuZ3VhZ2VUYWdzKCJmcixlbi1VUyIpKSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdFNldExvY2FsZSgpIHsKQEAgLTczMiwxMSArNzMyLDE2IEBACiAgICAgICAgIHJldHVybiBjb25maWc7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydFdyaXRlVG9QYXJjZWwoQ29uZmlndXJhdGlvbiBjb25maWcsIFBhcmNlbCBwYXJjZWwpIHsKLSAgICAgICAgY29uZmlnLndyaXRlVG9QYXJjZWwocGFyY2VsLCAwKTsKLSAgICAgICAgcGFyY2VsLnNldERhdGFQb3NpdGlvbigwKTsKLSAgICAgICAgQ29uZmlndXJhdGlvbiByZWFkQ29uZiA9IG5ldyBDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIHJlYWRDb25mLnJlYWRGcm9tUGFyY2VsKHBhcmNlbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjb25maWcsIHJlYWRDb25mKTsKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0V3JpdGVUb1BhcmNlbChDb25maWd1cmF0aW9uIGNvbmZpZykgeworICAgICAgICBmaW5hbCBQYXJjZWwgcGFyY2VsID0gUGFyY2VsLm9idGFpbigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29uZmlnLndyaXRlVG9QYXJjZWwocGFyY2VsLCAwKTsKKyAgICAgICAgICAgIHBhcmNlbC5zZXREYXRhUG9zaXRpb24oMCk7CisgICAgICAgICAgICBDb25maWd1cmF0aW9uIHJlYWRDb25mID0gbmV3IENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgICAgIHJlYWRDb25mLnJlYWRGcm9tUGFyY2VsKHBhcmNlbCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY29uZmlnLCByZWFkQ29uZik7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBwYXJjZWwucmVjeWNsZSgpOworICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvY29udGVudC9zcmMvYW5kcm9pZC9jb250ZW50L3Jlcy9jdHMvUHJpdmF0ZUF0dHJpYnV0ZVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvc3JjL2FuZHJvaWQvY29udGVudC9yZXMvY3RzL1ByaXZhdGVBdHRyaWJ1dGVUZXN0LmphdmEKaW5kZXggMGMxOGI0Zi4uMzNhODc3NyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvY29udGVudC9zcmMvYW5kcm9pZC9jb250ZW50L3Jlcy9jdHMvUHJpdmF0ZUF0dHJpYnV0ZVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9jb250ZW50L3NyYy9hbmRyb2lkL2NvbnRlbnQvcmVzL2N0cy9Qcml2YXRlQXR0cmlidXRlVGVzdC5qYXZhCkBAIC0yNyw3ICsyNyw3IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBQcml2YXRlQXR0cmlidXRlVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgc0xhc3RQdWJsaWNBdHRyID0gMHgwMTAxMDU2ZDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgc0xhc3RQdWJsaWNBdHRyID0gMHgwMTBjMDAxYTsKIAogICAgIHB1YmxpYyB2b2lkIHRlc3ROb0F0dHJpYnV0ZXNBZnRlckxhc3RQdWJsaWNBdHRyaWJ1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFCdWlsZC5WRVJTSU9OLkNPREVOQU1FLmVxdWFscygiUkVMIikpIHsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvc3JjL2FuZHJvaWQvY29udGVudC9yZXMvY3RzL1Jlc291cmNlc1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvc3JjL2FuZHJvaWQvY29udGVudC9yZXMvY3RzL1Jlc291cmNlc1Rlc3QuamF2YQppbmRleCA3ZjVkNmNlLi5hYjY3MzIxIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9jb250ZW50L3NyYy9hbmRyb2lkL2NvbnRlbnQvcmVzL2N0cy9SZXNvdXJjZXNUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvY29udGVudC9zcmMvYW5kcm9pZC9jb250ZW50L3Jlcy9jdHMvUmVzb3VyY2VzVGVzdC5qYXZhCkBAIC0zMSw2ICszMSw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMuTm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuWG1sUmVzb3VyY2VQYXJzZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlR5cGVmYWNlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQWRhcHRpdmVJY29uRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5Db2xvckRyYXdhYmxlOwpAQCAtMjA5LDYgKzIxMCwxNiBAQAogICAgICAgICBhc3NlcnRFcXVhbHMobVJlc291cmNlcy5nZXRDb2xvcihSLmNvbG9yLnRlc3Rjb2xvcjEpLCBmb2N1c0NvbG9yKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q29sb3JTdGF0ZUxpc3RUaHJvd3MoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBYTUwgdGhhdCdzIG5vdCBhIHNlbGVjdG9yIG9yIGdyYWRpZW50IHRocm93cworICAgICAgICAgICAgbVJlc291cmNlcy5nZXRDb2xvclN0YXRlTGlzdChSLmRyYXdhYmxlLmRlbnNpdHlfdGVzdCk7CisgICAgICAgICAgICBmYWlsKCJGYWlsZWQgYXQgdGVzdEdldENvbG9yU3RhdGVMaXN0Iik7CisgICAgICAgIH0gY2F0Y2ggKE5vdEZvdW5kRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgdGVzdEdldENvbG9yKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgbVJlc291cmNlcy5nZXRDb2xvcigtMSk7CkBAIC0zMTMsNiArMzI0LDkgQEAKICAgICAgICAgYXNzZXJ0Tm90TnVsbChkcmF3KTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDIxMiAqIHRhcmdldERlbnNpdHkgLyBkZWZhdWx0RGVuc2l0eSwgZHJhdy5nZXRJbnRyaW5zaWNXaWR0aCgpLCAxKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDE0MiAqIHRhcmdldERlbnNpdHkgLyBkZWZhdWx0RGVuc2l0eSwgZHJhdy5nZXRJbnRyaW5zaWNIZWlnaHQoKSwgMSk7CisKKyAgICAgICAgLy8gU29tZSBhcHBzIHJlbHkgb24gdGhlIGZhY3QgdGhhdCB0aGlzIHdpbGwgcmV0dXJuIG51bGwgKHJhdGhlciB0aGFuIHRocm93aW5nKS4KKyAgICAgICAgYXNzZXJ0TnVsbChtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuZmFrZV9pbWFnZV93aWxsX25vdF9kZWNvZGUpKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RHJhd2FibGVfU3RhY2tPdmVyZmxvd0Vycm9yRHJhd2FibGUoKSB7CkBAIC0zMjQsNiArMzM4LDE1IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RHJhd2FibGVfU3RhY2tPdmVyZmxvd0Vycm9yRHJhd2FibGVfbWlwbWFwKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLm1pcG1hcC5pY29uX3JlY3Vyc2l2ZSk7CisgICAgICAgICAgICBmYWlsKCJGYWlsZWQgYXQgdGVzdEdldERyYXdhYmxlX1N0YWNrT3ZlcmZsb3dFcnJvckRyYXdhYmxlX21pcG1hcCIpOworICAgICAgICB9IGNhdGNoIChOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvL2V4cGVjdGVkCisgICAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RHJhd2FibGVGb3JEZW5zaXR5KCkgewogICAgICAgICBmaW5hbCBEcmF3YWJsZSBsZHBpID0gbVJlc291cmNlcy5nZXREcmF3YWJsZUZvckRlbnNpdHkoCiAgICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5kZW5zaXR5X3Rlc3QsIERpc3BsYXlNZXRyaWNzLkRFTlNJVFlfTE9XKTsKQEAgLTc4OCw2ICs4MTEsNTUgQEAKICAgICAgICAgYXNzZXJ0Tm90U2FtZShUeXBlZmFjZS5ERUZBVUxULCBmb250KTsKICAgICB9CiAKKyAgICBwcml2YXRlIFR5cGVmYWNlIGdldExhcmdlclR5cGVmYWNlKFN0cmluZyB0ZXh0LCBUeXBlZmFjZSB0eXBlZmFjZTEsIFR5cGVmYWNlIHR5cGVmYWNlMikgeworICAgICAgICBQYWludCBwMSA9IG5ldyBQYWludCgpOworICAgICAgICBwMS5zZXRUeXBlZmFjZSh0eXBlZmFjZTEpOworICAgICAgICBmbG9hdCB3aWR0aDEgPSBwMS5tZWFzdXJlVGV4dCh0ZXh0KTsKKyAgICAgICAgUGFpbnQgcDIgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgcDIuc2V0VHlwZWZhY2UodHlwZWZhY2UyKTsKKyAgICAgICAgZmxvYXQgd2lkdGgyID0gcDIubWVhc3VyZVRleHQodGV4dCk7CisKKyAgICAgICAgaWYgKHdpZHRoMSA+IHdpZHRoMikgeworICAgICAgICAgICAgcmV0dXJuIHR5cGVmYWNlMTsKKyAgICAgICAgfSBlbHNlIGlmICh3aWR0aDEgPCB3aWR0aDIpIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlZmFjZTI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmYWlsKCJUaGUgd2lkdGhzIG9mIHRoZSB0ZXh0IHNob3VsZCBub3QgYmUgdGhlIHNhbWUiKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldEZvbnRfeG1sRmlsZVdpdGhUdGMoKSB7CisgICAgICAgIC8vIEhlcmUgd2UgdGVzdCB0aGF0IGJ1aWxkaW5nIHR5cGVmYWNlcyBieSBpbmRleGluZyBpbiBmb250IGNvbGxlY3Rpb25zIHdvcmtzIGNvcnJlY3RseS4KKyAgICAgICAgLy8gV2Ugd2FudCB0byBlbnN1cmUgdGhhdCB0aGUgYnVpbHQgdHlwZWZhY2VzIGNvcnJlc3BvbmQgdG8gdGhlIGZvbnRzIHdpdGggdGhlIHJpZ2h0IGluZGV4LgorICAgICAgICAvLyBzYW1wbGVfZm9udF9jb2xsZWN0aW9uLnR0YyBjb250YWlucyB0d28gZm9udHMgKHdpdGggaW5kaWNlcyAwIGFuZCAxKS4gVGhlIGZpcnN0IG9uZSBoYXMKKyAgICAgICAgLy8gZ2x5cGggImEiIG9mIDNlbSB3aWR0aCwgYW5kIGFsbCB0aGUgb3RoZXIgZ2x5cGhzIDFlbS4gVGhlIHNlY29uZCBvbmUgaGFzIGdseXBoICJiIiBvZgorICAgICAgICAvLyAzZW0gd2lkdGgsIGFuZCBhbGwgdGhlIG90aGVyIGdseXBocyAxZW0uIEhlbmNlLCB3ZSBjYW4gY29tcGFyZSB0aGUgd2lkdGggb2YgdGhlc2UKKyAgICAgICAgLy8gZ2x5cGhzIHRvIGFzc2VydCB0aGF0IHR0YyBpbmRleGluZyB3b3Jrcy4KKyAgICAgICAgVHlwZWZhY2Ugbm9ybWFsRm9udCA9IG1SZXNvdXJjZXMuZ2V0Rm9udChSLmZvbnQuc2FtcGxlX3R0Y19mYW1pbHkpOworICAgICAgICBhc3NlcnROb3ROdWxsKG5vcm1hbEZvbnQpOworICAgICAgICBUeXBlZmFjZSBpdGFsaWNGb250ID0gVHlwZWZhY2UuY3JlYXRlKG5vcm1hbEZvbnQsIFR5cGVmYWNlLklUQUxJQyk7CisgICAgICAgIGFzc2VydE5vdE51bGwoaXRhbGljRm9udCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGdldExhcmdlclR5cGVmYWNlKCJhIiwgbm9ybWFsRm9udCwgaXRhbGljRm9udCksIG5vcm1hbEZvbnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0TGFyZ2VyVHlwZWZhY2UoImIiLCBub3JtYWxGb250LCBpdGFsaWNGb250KSwgaXRhbGljRm9udCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldEZvbnRfeG1sRmlsZVdpdGhWYXJpYXRpb25TZXR0aW5ncygpIHsKKyAgICAgICAgLy8gSGVyZSB3ZSB0ZXN0IHRoYXQgc3BlY2lmeWluZyB2YXJpYXRpb24gc2V0dGluZ3MgZm9yIGZvbnRzIGluIFhNTHMgd29ya3MuCisgICAgICAgIC8vIFdlIGJ1aWxkIHR5cGVmYWNlcyBmcm9tIHR3byBmYW1pbGllcyBjb250YWluaW5nIG9uZSBmb250IGVhY2gsIHVzaW5nIHRoZSBzYW1lIGZvbnQKKyAgICAgICAgLy8gcmVzb3VyY2UsIGJ1dCBoYXZpbmcgZGlmZmVyZW50IHZhbHVlcyBmb3IgdGhlICd3ZHRoJyB0YWcuIFRoZW4gd2UgbWVhc3VyZSB0aGUgcGFpbnRlZAorICAgICAgICAvLyB0ZXh0IHRvIGVuc3VyZSB0aGF0IHRoZSB0YWcgYWZmZWN0cyB0aGUgdGV4dCB3aWR0aC4gVGhlIGZvbnQgcmVzb3VyY2UgdXNlZCBzdXBwb3J0cworICAgICAgICAvLyB0aGUgJ3dkdGgnIGF4aXMgZm9yIHRoZSBkYXNoICgtKSBjaGFyYWN0ZXIuCisgICAgICAgIFR5cGVmYWNlIHR5cGVmYWNlMSA9IG1SZXNvdXJjZXMuZ2V0Rm9udChSLmZvbnQuc2FtcGxlX3ZhcmlhdGlvbl9zZXR0aW5nc19mYW1pbHkxKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh0eXBlZmFjZTEpOworICAgICAgICBUeXBlZmFjZSB0eXBlZmFjZTIgPSBtUmVzb3VyY2VzLmdldEZvbnQoUi5mb250LnNhbXBsZV92YXJpYXRpb25fc2V0dGluZ3NfZmFtaWx5Mik7CisgICAgICAgIGFzc2VydE5vdE51bGwodHlwZWZhY2UyKTsKKworICAgICAgICBhc3NlcnROb3RTYW1lKHR5cGVmYWNlMSwgdHlwZWZhY2UyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGdldExhcmdlclR5cGVmYWNlKCItIiwgdHlwZWZhY2UxLCB0eXBlZmFjZTIpLCB0eXBlZmFjZTIpOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRGb250X2ludmFsaWRYbWxGaWxlKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgYXNzZXJ0TnVsbChtUmVzb3VyY2VzLmdldEZvbnQoUi5mb250LmludmFsaWRfeG1sZmFtaWx5KSk7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9jb250ZW50L3NyYy9hbmRyb2lkL2NvbnRlbnQvcmVzL2N0cy9UeXBlZEFycmF5VGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvY29udGVudC9zcmMvYW5kcm9pZC9jb250ZW50L3Jlcy9jdHMvVHlwZWRBcnJheVRlc3QuamF2YQppbmRleCA0ZTE0NjliLi5mMjdmMDZjIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9jb250ZW50L3NyYy9hbmRyb2lkL2NvbnRlbnQvcmVzL2N0cy9UeXBlZEFycmF5VGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2NvbnRlbnQvc3JjL2FuZHJvaWQvY29udGVudC9yZXMvY3RzL1R5cGVkQXJyYXlUZXN0LmphdmEKQEAgLTU1LDggKzU1LDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQRUNURURfTk9OX1JFU09VUkNFX1NUUklORyA9ICJ0ZXN0Tm9uUmVzb3VyY2VzU3RyaW5nIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0JFR0lOID0gInJlc291cmNlcyI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVYUEVDVEVEX0lOVF9BVFQgPSA4NjQwMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVhQRUNURURfQ0hBTkdJTkdfQ09ORklHID0KLSAgICAgICAgICAgIEFjdGl2aXR5SW5mby5DT05GSUdfT1JJRU5UQVRJT04gfCBBY3Rpdml0eUluZm8uQ09ORklHX0xPQ0FMRTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVhQRUNURURfQ0hBTkdJTkdfQ09ORklHID0gQWN0aXZpdHlJbmZvLkNPTkZJR19PUklFTlRBVElPTjsKIAogICAgIHByaXZhdGUgVHlwZWRBcnJheSBtVHlwZWRBcnJheTsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZGF0YWJhc2UvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL2RhdGFiYXNlL0FuZHJvaWQubWsKaW5kZXggMGUyNGMxNS4uOGIzOGMwOCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZGF0YWJhc2UvQW5kcm9pZC5taworKysgYi90ZXN0cy90ZXN0cy9kYXRhYmFzZS9BbmRyb2lkLm1rCkBAIC0yMywyMCArMjMsMTkgQEAKIAogTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKICAgICBhbmRyb2lkLWNvbW1vbiBcCi0gICAgY3RzdGVzdHJ1bm5lciBcCi0gICAgY3RzdGVzdHJ1bm5lciBcCisgICAgY3RzdGVzdHJ1bm5lci1heHQgXAorICAgIGN0c3Rlc3RydW5uZXItYXh0IFwKICAgICB1Yi11aWF1dG9tYXRvciBcCi0gICAganVuaXQgXAotICAgIGxlZ2FjeS1hbmRyb2lkLXRlc3QKKyAgICBqdW5pdAogCi1MT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzIGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIAogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0RhdGFiYXNlVGVzdENhc2VzCiAKICMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cyBjdHNfaW5zdGFudAogCiAjIEVuZm9yY2UgcHVibGljIC8gdGVzdCBhcGkgb25seQogTE9DQUxfU0RLX1ZFUlNJT04gOj0gdGVzdF9jdXJyZW50CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9kYXRhYmFzZS9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdGVzdHMvZGF0YWJhc2UvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBmOTA0M2RiLi40OWUyZjNlZSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZGF0YWJhc2UvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9kYXRhYmFzZS9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0xNiwxNCArMTYsMTUgQEAKICAtLT4KIAogPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBwYWNrYWdlPSJhbmRyb2lkLmRhdGFiYXNlLmN0cyI+CisgICAgcGFja2FnZT0iYW5kcm9pZC5kYXRhYmFzZS5jdHMiCisgICAgYW5kcm9pZDp0YXJnZXRTYW5kYm94VmVyc2lvbj0iMiI+CiAKICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkRJU0FCTEVfS0VZR1VBUkQiIC8+CiAgICAgPGFwcGxpY2F0aW9uPgogICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KICAgICA8L2FwcGxpY2F0aW9uPgogCi0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5kYXRhYmFzZS5jdHMiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgdGVzdHMgb2YgYW5kcm9pZC5kYXRhYmFzZSI+CiAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJsaXN0ZW5lciIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2RhdGFiYXNlL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL2RhdGFiYXNlL0FuZHJvaWRUZXN0LnhtbAppbmRleCA2MjMzOGYxLi5hMWRiOWMwIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9kYXRhYmFzZS9BbmRyb2lkVGVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvZGF0YWJhc2UvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgRGF0YWJhc2UgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImZyYW1ld29yayIgLz4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgpAQCAtMjIsNSArMjMsNiBAQAogICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5BbmRyb2lkSlVuaXRUZXN0IiA+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icGFja2FnZSIgdmFsdWU9ImFuZHJvaWQuZGF0YWJhc2UuY3RzIiAvPgogICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjExbSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJoaWRkZW4tYXBpLWNoZWNrcyIgdmFsdWU9ImZhbHNlIi8+CiAgICAgPC90ZXN0PgogPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZGF0YWJhc2Uvc3JjL2FuZHJvaWQvZGF0YWJhc2UvY3RzL0N1cnNvcldpbmRvd1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2RhdGFiYXNlL3NyYy9hbmRyb2lkL2RhdGFiYXNlL2N0cy9DdXJzb3JXaW5kb3dUZXN0LmphdmEKaW5kZXggNjVjZTNmZC4uNjcxYTA2MSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZGF0YWJhc2Uvc3JjL2FuZHJvaWQvZGF0YWJhc2UvY3RzL0N1cnNvcldpbmRvd1Rlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9kYXRhYmFzZS9zcmMvYW5kcm9pZC9kYXRhYmFzZS9jdHMvQ3Vyc29yV2luZG93VGVzdC5qYXZhCkBAIC0xNiwyMSArMTYsMzYgQEAKIAogcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLmN0czsKIAoraW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DaGFyQXJyYXlCdWZmZXI7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3JXaW5kb3c7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5NYXRyaXhDdXJzb3I7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwotaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CitpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlNtYWxsVGVzdDsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKIAotcHVibGljIGNsYXNzIEN1cnNvcldpbmRvd1Rlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKK0BTbWFsbFRlc3QKK3B1YmxpYyBjbGFzcyBDdXJzb3JXaW5kb3dUZXN0IHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1NUUklORyA9ICJUZXN0IFN0cmluZyI7CiAKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RXcml0ZUN1cnNvclRvV2luZG93KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIGNyZWF0ZSBjdXJzb3IKICAgICAgICAgU3RyaW5nW10gY29sTmFtZXMgPSBuZXcgU3RyaW5nW117Il9pZCIsICJuYW1lIiwgIm51bWJlciIsICJwcm9maXQifTsKQEAgLTc1LDYgKzkwLDcgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHdpbmRvdy5nZXROdW1Sb3dzKCkpOwogICAgIH0KIAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE51bGwoKSB7CiAgICAgICAgIEN1cnNvcldpbmRvdyB3aW5kb3cgPSBnZXRPbmVCeU9uZVdpbmRvdygpOwogCkBAIC04MiwxMCArOTgsMTEgQEAKICAgICAgICAgYXNzZXJ0VHJ1ZSh3aW5kb3cucHV0TnVsbCgwLCAwKSk7CiAgICAgICAgIGFzc2VydE51bGwod2luZG93LmdldFN0cmluZygwLCAwKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygwLCB3aW5kb3cuZ2V0TG9uZygwLCAwKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLjAsIHdpbmRvdy5nZXREb3VibGUoMCwgMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMC4wLCB3aW5kb3cuZ2V0RG91YmxlKDAsIDApLCAwLjApOwogICAgICAgICBhc3NlcnROdWxsKHdpbmRvdy5nZXRCbG9iKDAsIDApKTsKICAgICB9CiAKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eVN0cmluZygpIHsKICAgICAgICAgQ3Vyc29yV2luZG93IHdpbmRvdyA9IGdldE9uZUJ5T25lV2luZG93KCk7CiAKQEAgLTkzLDkgKzExMCwxMCBAQAogICAgICAgICBhc3NlcnRUcnVlKHdpbmRvdy5wdXRTdHJpbmcoIiIsIDAsIDApKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCB3aW5kb3cuZ2V0U3RyaW5nKDAsIDApKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHdpbmRvdy5nZXRMb25nKDAsIDApKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAuMCwgd2luZG93LmdldERvdWJsZSgwLCAwKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLjAsIHdpbmRvdy5nZXREb3VibGUoMCwgMCksIDAuMCk7CiAgICAgfQogCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JzKCkgewogICAgICAgICBpbnQgVEVTVF9OVU1CRVIgPSA1OwogICAgICAgICBDdXJzb3JXaW5kb3cgY3Vyc29yV2luZG93OwpAQCAtMTIxLDggKzEzOSwxMSBAQAogICAgICAgICBjdXJzb3JXaW5kb3cgPSBDdXJzb3JXaW5kb3cuQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKHBhcmNlbCk7CiAgICAgICAgIGFzc2VydEVxdWFscyhURVNUX05VTUJFUiwgY3Vyc29yV2luZG93LmdldFN0YXJ0UG9zaXRpb24oKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhURVNUX1NUUklORywgY3Vyc29yV2luZG93LmdldFN0cmluZyhURVNUX05VTUJFUiwgMCkpOworCisgICAgICAgIHBhcmNlbC5yZWN5Y2xlKCk7CiAgICAgfQogCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGF0YVN0cnVjdHVyZU9wZXJhdGlvbnMoKSB7CiAgICAgICAgIEN1cnNvcldpbmRvdyBjdXJzb3JXaW5kb3cgPSBuZXcgQ3Vyc29yV2luZG93KHRydWUpOwogCkBAIC0xNzUsNiArMTk2LDcgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEFjY2Vzc0RhdGFWYWx1ZXMoKSB7CiAgICAgICAgIGZpbmFsIGxvbmcgTlVNQkVSX0xPTkdfSU5URUdFUiA9IChsb25nKSAweGFhYmJjY2RkZmZMOwogICAgICAgICBmaW5hbCBsb25nIE5VTUJFUl9JTlRFR0VSID0gKGludCkgTlVNQkVSX0xPTkdfSU5URUdFUjsKQEAgLTIxNCw4ICsyMzYsOCBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoMCwgY3Vyc29yV2luZG93LmdldExvbmcoMCwgMCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMCwgY3Vyc29yV2luZG93LmdldEludCgwLCAwKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygwLCBjdXJzb3JXaW5kb3cuZ2V0U2hvcnQoMCwgMCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMC4wLCBjdXJzb3JXaW5kb3cuZ2V0RG91YmxlKDAsIDApKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAuMGYsIGN1cnNvcldpbmRvdy5nZXRGbG9hdCgwLCAwKSwgMC4wMDAwMDAwMWYpOworICAgICAgICBhc3NlcnRFcXVhbHMoMC4wLCBjdXJzb3JXaW5kb3cuZ2V0RG91YmxlKDAsIDApLCAwLjApOworICAgICAgICBhc3NlcnRFcXVhbHMoMC4wZiwgY3Vyc29yV2luZG93LmdldEZsb2F0KDAsIDApLCAwLjApOwogICAgICAgICBhc3NlcnRGYWxzZShjdXJzb3JXaW5kb3cuaXNOdWxsKDAsIDApKTsKICAgICAgICAgYXNzZXJ0RmFsc2UoY3Vyc29yV2luZG93LmlzQmxvYigwLCAwKSk7CiAKQEAgLTIyNiw4ICsyNDgsOCBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoMCwgY3Vyc29yV2luZG93LmdldExvbmcoMCwgMSkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMCwgY3Vyc29yV2luZG93LmdldEludCgwLCAxKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygwLCBjdXJzb3JXaW5kb3cuZ2V0U2hvcnQoMCwgMSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMC4wLCBjdXJzb3JXaW5kb3cuZ2V0RG91YmxlKDAsIDEpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAuMGYsIGN1cnNvcldpbmRvdy5nZXRGbG9hdCgwLCAxKSwgMC4wMDAwMDAwMWYpOworICAgICAgICBhc3NlcnRFcXVhbHMoMC4wLCBjdXJzb3JXaW5kb3cuZ2V0RG91YmxlKDAsIDEpLCAwLjApOworICAgICAgICBhc3NlcnRFcXVhbHMoMC4wZiwgY3Vyc29yV2luZG93LmdldEZsb2F0KDAsIDEpLCAwLjApOwogICAgICAgICBhc3NlcnROdWxsKGN1cnNvcldpbmRvdy5nZXRCbG9iKDAsIDEpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShjdXJzb3JXaW5kb3cuaXNOdWxsKDAsIDEpKTsKICAgICAgICAgLy8gSWYgdGhlIGZpZWxkIGlzIG51bGwsIGlzQmxvYiB3aWxsIHJldHVybiB0cnVlLgpAQCAtMjM5LDggKzI2MSw4IEBACiAgICAgICAgIGFzc2VydEVxdWFscyhOVU1CRVJfSU5URUdFUiwgY3Vyc29yV2luZG93LmdldEludCgwLCAyKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhMb25nLnRvU3RyaW5nKE5VTUJFUl9MT05HX0lOVEVHRVIpLCBjdXJzb3JXaW5kb3cuZ2V0U3RyaW5nKDAsIDIpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKE5VTUJFUl9TSE9SVCwgY3Vyc29yV2luZG93LmdldFNob3J0KDAsIDIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKE5VTUJFUl9GTE9BVF9TQ0lFTkNFLCBjdXJzb3JXaW5kb3cuZ2V0RmxvYXQoMCwgMiksIDAuMDAwMDAwMDFmKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKE5VTUJFUl9ET1VCTEVfU0NJRU5DRSwgY3Vyc29yV2luZG93LmdldERvdWJsZSgwLCAyKSwgMC4wMDAwMDAwMSk7CisgICAgICAgIGFzc2VydEVxdWFscyhOVU1CRVJfRkxPQVRfU0NJRU5DRSwgY3Vyc29yV2luZG93LmdldEZsb2F0KDAsIDIpLCAwLjApOworICAgICAgICBhc3NlcnRFcXVhbHMoTlVNQkVSX0RPVUJMRV9TQ0lFTkNFLCBjdXJzb3JXaW5kb3cuZ2V0RG91YmxlKDAsIDIpLCAwLjApOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgY3Vyc29yV2luZG93LmdldEJsb2IoMCwgMik7CiAgICAgICAgICAgICBmYWlsKCJDYW4ndCBnZXQgQmxvYiBmcm9tIGEgSW50ZWdlciB2YWx1ZS4iKTsKQEAgLTI1OSw4ICsyODEsOCBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoTlVNQkVSX0ZMT0FUX1NDSUVOQ0VfU1RSSU5HMi5zdWJzdHJpbmcoMCwgNiksIGN1cnNvcldpbmRvdy5nZXRTdHJpbmcoMCwgMykKICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKDAsIDYpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKE5VTUJFUl9TSE9SVCwgY3Vyc29yV2luZG93LmdldFNob3J0KDAsIDMpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKE5VTUJFUl9GTE9BVF9TQ0lFTkNFLCBjdXJzb3JXaW5kb3cuZ2V0RmxvYXQoMCwgMyksIDAuMDAwMDAwMDFmKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKE5VTUJFUl9ET1VCTEVfU0NJRU5DRSwgY3Vyc29yV2luZG93LmdldERvdWJsZSgwLCAzKSwgMC4wMDAwMDAwMSk7CisgICAgICAgIGFzc2VydEVxdWFscyhOVU1CRVJfRkxPQVRfU0NJRU5DRSwgY3Vyc29yV2luZG93LmdldEZsb2F0KDAsIDMpLCAwLjApOworICAgICAgICBhc3NlcnRFcXVhbHMoTlVNQkVSX0RPVUJMRV9TQ0lFTkNFLCBjdXJzb3JXaW5kb3cuZ2V0RG91YmxlKDAsIDMpLCAwLjApOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgY3Vyc29yV2luZG93LmdldEJsb2IoMCwgMyk7CiAgICAgICAgICAgICBmYWlsKCJDYW4ndCBnZXQgQmxvYiBmcm9tIGEgRG91YmxlIHZhbHVlLiIpOwpAQCAtMjc5LDYgKzMwMSw3IEBACiAgICAgICAgIGFzc2VydFRydWUoY3Vyc29yV2luZG93LmlzQmxvYigwLCA0KSk7CiAgICAgfQogCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29weVN0cmluZ1RvQnVmZmVyKCkgewogICAgICAgICBpbnQgREVGQVVMVF9BUlJBWV9MRU5HVEggPSA2NDsKICAgICAgICAgU3RyaW5nIGJhc2VTdHJpbmcgPSAiMDEyMzQ1Njc4OSI7CkBAIC0zMTQsNiArMzM3LDcgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLmxlbmd0aCgpLCBjaGFyQXJyYXlCdWZmZXIuZGF0YS5sZW5ndGgpOwogICAgIH0KIAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEFjY2Vzc1N0YXJ0UG9zaXRpb24oKSB7CiAgICAgICAgIGZpbmFsIGludCBURVNUX1BPU0lUSU9OXzEgPSAwOwogICAgICAgICBmaW5hbCBpbnQgVEVTVF9QT1NJVElPTl8yID0gMzsKQEAgLTM0Myw2ICszNjcsNyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJBbmRPbkFsbFJlZmVyZW5jZXNSZWxlYXNlZCgpIHsKICAgICAgICAgTW9ja0N1cnNvcldpbmRvdyBjdXJzb3JXaW5kb3cgPSBuZXcgTW9ja0N1cnNvcldpbmRvdyh0cnVlKTsKIApAQCAtMzY5LDExICszOTQsNDMgQEAKICAgICAgICAgYXNzZXJ0VHJ1ZShjdXJzb3JXaW5kb3cuaGFzUmVsZWFzZWRBbGxSZWZlcmVuY2VzKCkpOwogICAgIH0KIAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdERlc2NyaWJlQ29udGVudHMoKSB7CiAgICAgICAgIEN1cnNvcldpbmRvdyBjdXJzb3JXaW5kb3cgPSBuZXcgQ3Vyc29yV2luZG93KHRydWUpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMCwgY3Vyc29yV2luZG93LmRlc2NyaWJlQ29udGVudHMoKSk7CiAgICAgfQogCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEN1cnNvcldpbmRvd1NpemUoKSB7CisgICAgICAgIEN1cnNvcldpbmRvdyBjdXJzb3JXaW5kb3cgPSBuZXcgQ3Vyc29yV2luZG93KCJ0ZXN0Iik7CisgICAgICAgIGN1cnNvcldpbmRvdy5zZXROdW1Db2x1bW5zKDEpOworICAgICAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVsxMDI0XTsKKyAgICAgICAgQXJyYXlzLmZpbGwoYnl0ZXMsIChieXRlKSAxKTsKKyAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlIGRlZmF1bHQgaXMgbm90IHRvbyBzbWFsbCBhbmQgaXQncyBwb3NzaWJsZSB0byBmaWxsIEN1cnNvcldpbmRvdworICAgICAgICAvLyB3aXRoIH4yTWIgb2YgZGF0YQorICAgICAgICBpbnQgdGVzdFJvd0NvdW50ID0gMjAxNjsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0Um93Q291bnQ7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjdXJzb3JXaW5kb3cuYWxsb2NSb3coKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJBbGxvY2F0aW9uIGZhaWxlZCBmb3Igcm93ICIgKyBpLCBjdXJzb3JXaW5kb3cucHV0QmxvYihieXRlcywgaSwgMCkpOworICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoY3Vyc29yV2luZG93LmFsbG9jUm93KCkpOworICAgICAgICBhc3NlcnRGYWxzZSgiQWxsb2NhdGlvbiBzaG91bGQgZmFpbCBmb3Igcm93ICIgKyB0ZXN0Um93Q291bnQsCisgICAgICAgICAgICAgICAgY3Vyc29yV2luZG93LnB1dEJsb2IoYnl0ZXMsIHRlc3RSb3dDb3VudCwgMCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbVNpemUoKSB7CisgICAgICAgIC8vIEFsbG9jYXRlIEN1cnNvcldpbmRvdyB3aXRoIG1heCBzaXplIDEwS0IgYW5kIHRlc3QgdGhhdCByZXN0cmljdGlvbiBpcyBlbmZvcmNlZAorICAgICAgICBDdXJzb3JXaW5kb3cgY3Vyc29yV2luZG93ID0gbmV3IEN1cnNvcldpbmRvdygidGVzdCIsIDEwMDAwKTsKKyAgICAgICAgY3Vyc29yV2luZG93LnNldE51bUNvbHVtbnMoMSk7CisgICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlWzgwMDBdOworICAgICAgICBBcnJheXMuZmlsbChieXRlcywgKGJ5dGUpIDEpOworICAgICAgICBhc3NlcnRUcnVlKGN1cnNvcldpbmRvdy5hbGxvY1JvdygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiQWxsb2NhdGlvbiBvZiAxIHJvdyBzaG91bGQgc3VjY2VlZCIsIGN1cnNvcldpbmRvdy5wdXRCbG9iKGJ5dGVzLCAwLCAwKSk7CisgICAgICAgIGFzc2VydFRydWUoY3Vyc29yV2luZG93LmFsbG9jUm93KCkpOworICAgICAgICBhc3NlcnRGYWxzZSgiQWxsb2NhdGlvbiBvZiAybmQgcm93IHNob3VsZCBmYWlsIiwgY3Vyc29yV2luZG93LnB1dEJsb2IoYnl0ZXMsIDEsIDApKTsKKyAgICB9CisKICAgICBwcml2YXRlIGNsYXNzIE1vY2tDdXJzb3JXaW5kb3cgZXh0ZW5kcyBDdXJzb3JXaW5kb3cgewogICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUhhc1JlbGVhc2VkQWxsUmVmZXJlbmNlcyA9IGZhbHNlOwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9kYXRhYmFzZS9zcmMvYW5kcm9pZC9kYXRhYmFzZS9jdHMvRGF0YWJhc2VVdGlsc1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2RhdGFiYXNlL3NyYy9hbmRyb2lkL2RhdGFiYXNlL2N0cy9EYXRhYmFzZVV0aWxzVGVzdC5qYXZhCmluZGV4IDliNDQxYTAuLmEzNWE2YWMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2RhdGFiYXNlL3NyYy9hbmRyb2lkL2RhdGFiYXNlL2N0cy9EYXRhYmFzZVV0aWxzVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2RhdGFiYXNlL3NyYy9hbmRyb2lkL2RhdGFiYXNlL2N0cy9EYXRhYmFzZVV0aWxzVGVzdC5qYXZhCkBAIC01MTksNiArNTE5LDcgQEAKICAgICAgICAgICAgIC8vIGV4cGVjdGVkCiAgICAgICAgIH0KIAorICAgICAgICBwYXJjZWwucmVjeWNsZSgpOwogICAgICAgICBwYXJjZWwgPSBQYXJjZWwub2J0YWluKCk7CiAgICAgICAgIERhdGFiYXNlVXRpbHMud3JpdGVFeGNlcHRpb25Ub1BhcmNlbChwYXJjZWwsIG5ldyBTUUxpdGVBYm9ydEV4Y2VwdGlvbigpKTsKICAgICAgICAgcGFyY2VsLnNldERhdGFQb3NpdGlvbigwKTsKQEAgLTUyOSw2ICs1MzAsNyBAQAogICAgICAgICAgICAgLy8gZXhwZWN0ZWQKICAgICAgICAgfQogCisgICAgICAgIHBhcmNlbC5yZWN5Y2xlKCk7CiAgICAgICAgIHBhcmNlbCA9IFBhcmNlbC5vYnRhaW4oKTsKICAgICAgICAgRGF0YWJhc2VVdGlscy53cml0ZUV4Y2VwdGlvblRvUGFyY2VsKHBhcmNlbCwgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigpKTsKICAgICAgICAgcGFyY2VsLnNldERhdGFQb3NpdGlvbigwKTsKQEAgLTUzOSw2ICs1NDEsNyBAQAogICAgICAgICAgICAgLy8gZXhwZWN0ZWQKICAgICAgICAgfQogCisgICAgICAgIHBhcmNlbC5yZWN5Y2xlKCk7CiAgICAgICAgIHBhcmNlbCA9IFBhcmNlbC5vYnRhaW4oKTsKICAgICAgICAgRGF0YWJhc2VVdGlscy53cml0ZUV4Y2VwdGlvblRvUGFyY2VsKHBhcmNlbCwgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigpKTsKICAgICAgICAgcGFyY2VsLnNldERhdGFQb3NpdGlvbigwKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2RhdGFiYXNlL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9jdHMvRGF0YWJhc2VUZXN0VXRpbHMuamF2YSBiL3Rlc3RzL3Rlc3RzL2RhdGFiYXNlL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9jdHMvRGF0YWJhc2VUZXN0VXRpbHMuamF2YQppbmRleCA1YjUyNzkwLi4yODM2MDQyIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9kYXRhYmFzZS9zcmMvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvY3RzL0RhdGFiYXNlVGVzdFV0aWxzLmphdmEKKysrIGIvdGVzdHMvdGVzdHMvZGF0YWJhc2Uvc3JjL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL2N0cy9EYXRhYmFzZVRlc3RVdGlscy5qYXZhCkBAIC0xNywxMCArMTcsMTEgQEAKIHBhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuY3RzOwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CiBpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QudWlhdXRvbWF0b3IuVWlEZXZpY2U7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CisKIC8qKgogICogQ29tbW9uIHV0aWxpdHkgbWV0aG9kcyBmb3IgdGVzdGluZwogICovCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9kYXRhYmFzZS9zcmMvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvY3RzL1NRTGl0ZUN1cnNvclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2RhdGFiYXNlL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9jdHMvU1FMaXRlQ3Vyc29yVGVzdC5qYXZhCmluZGV4IGE1MDZkZTUuLmExMWFiZjYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2RhdGFiYXNlL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9jdHMvU1FMaXRlQ3Vyc29yVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2RhdGFiYXNlL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9jdHMvU1FMaXRlQ3Vyc29yVGVzdC5qYXZhCkBAIC0xOSwxMCArMTksMTMgQEAKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQWJzdHJhY3RDdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5BYnN0cmFjdFdpbmRvd2VkQ3Vyc29yOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yV2luZG93OwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YVNldE9ic2VydmVyOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuU1FMRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuU3RhbGVEYXRhRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUJsb2JUb29CaWdFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlQ3Vyc29yOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURpcmVjdEN1cnNvckRyaXZlcjsKQEAgLTIxMCw2ICsyMTMsNDYgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKFRFU1RfQ09VTlQgLSBURVNUX0FSRzIsIGN1cnNvci5nZXRDb3VudCgpKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Um93VG9vQmlnKCkgeworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFIFRzdCAoVHh0IEJMT0IgTk9UIE5VTEwpOyIpOworICAgICAgICBieXRlW10gdGVzdEFyciA9IG5ldyBieXRlWzEwMDAwXTsKKyAgICAgICAgQXJyYXlzLmZpbGwodGVzdEFyciwgKGJ5dGUpIDEpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJJTlNFUlQgSU5UTyBUc3QgVkFMVUVTICg/KSIsIG5ldyBPYmplY3RbXXt0ZXN0QXJyfSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBOb3cgcmVkdWNlIHdpbmRvdyBzaXplLCBzbyB0aGF0IG5vIHJvd3MgY2FuIGZpdAorICAgICAgICBDdXJzb3IgY3Vyc29yID0gbURhdGFiYXNlLnJhd1F1ZXJ5KCJTRUxFQ1QgKiBGUk9NIFRTVCIsIG51bGwpOworICAgICAgICBDdXJzb3JXaW5kb3cgY3cgPSBuZXcgQ3Vyc29yV2luZG93KCJ0ZXN0IiwgNTAwMCk7CisgICAgICAgIEFic3RyYWN0V2luZG93ZWRDdXJzb3IgYWMgPSAoQWJzdHJhY3RXaW5kb3dlZEN1cnNvcikgY3Vyc29yOworICAgICAgICBhYy5zZXRXaW5kb3coY3cpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhYy5tb3ZlVG9OZXh0KCk7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gaXMgZXhwZWN0ZWQgd2hlbiByb3cgZXhjZWVkcyBDdXJzb3JXaW5kb3cgc2l6ZSIpOworICAgICAgICB9IGNhdGNoIChTUUxpdGVCbG9iVG9vQmlnRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsbFdpbmRvd0ZvcndhcmRPbmx5KCkgeworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFIFRzdCAoTnVtIEludGVnZXIgTk9UIE5VTEwpOyIpOworICAgICAgICBtRGF0YWJhc2UuYmVnaW5UcmFuc2FjdGlvbigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisgICAgICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiSU5TRVJUIElOVE8gVHN0IFZBTFVFUyAoPykiLCBuZXcgT2JqZWN0W117aX0pOworICAgICAgICB9CisgICAgICAgIG1EYXRhYmFzZS5zZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwoKTsKKyAgICAgICAgbURhdGFiYXNlLmVuZFRyYW5zYWN0aW9uKCk7CisgICAgICAgIEN1cnNvciBjdXJzb3IgPSBtRGF0YWJhc2UucmF3UXVlcnkoIlNFTEVDVCAqIEZST00gVFNUIiwgbnVsbCk7CisgICAgICAgIFNRTGl0ZUN1cnNvciBhYyA9IChTUUxpdGVDdXJzb3IpIGN1cnNvcjsKKyAgICAgICAgQ3Vyc29yV2luZG93IHdpbmRvdyA9IG5ldyBDdXJzb3JXaW5kb3coInRlc3QiLCAxMDAwKTsKKyAgICAgICAgYWMuc2V0RmlsbFdpbmRvd0ZvcndhcmRPbmx5KHRydWUpOworICAgICAgICBhYy5zZXRXaW5kb3cod2luZG93KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShhYy5tb3ZlVG9GaXJzdCgpKTsKKyAgICAgICAgLy8gTm93IHNraXAgNzAgcm93cyBhbmQgY2hlY2sgdGhhdCB0aGUgd2luZG93IHN0YXJ0IHBvc2l0aW9uIGNvcnJlc3BvbmRzIHRvIHJvdyA3MAorICAgICAgICBhYy5tb3ZlKDcwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDcwLCB3aW5kb3cuZ2V0U3RhcnRQb3NpdGlvbigpKTsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCB0ZXN0T25Nb3ZlKCkgewogICAgICAgICAvLyBEbyBub3QgdGVzdCB0aGlzIEFQSS4gSXQgaXMgY2FsbGJhY2sgd2hpY2g6CiAgICAgICAgIC8vIDEuIFRoZSBjYWxsYmFjayBtZWNoYW5pc20gaGFzIGJlZW4gdGVzdGVkIGluIHN1cGVyIGNsYXNzCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9kYXRhYmFzZS9zcmMvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvY3RzL1NRTGl0ZURhdGFiYXNlVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvZGF0YWJhc2Uvc3JjL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL2N0cy9TUUxpdGVEYXRhYmFzZVRlc3QuamF2YQppbmRleCAzMmU3OGUzLi5mOTAxZTljIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9kYXRhYmFzZS9zcmMvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvY3RzL1NRTGl0ZURhdGFiYXNlVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2RhdGFiYXNlL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9jdHMvU1FMaXRlRGF0YWJhc2VUZXN0LmphdmEKQEAgLTE2LDExICsxNiw4IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuY3RzOwogCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNlbWFwaG9yZTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuY3RzLkRhdGFiYXNlVGVzdFV0aWxzLmdldERiSW5mb091dHB1dDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuY3RzLkRhdGFiYXNlVGVzdFV0aWxzLndhaXRGb3JDb25uZWN0aW9uVG9DbG9zZTsKIAogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKQEAgLTMzLDIxICszMCwyOCBAQAogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlLkN1cnNvckZhY3Rvcnk7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGVidWc7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlR2xvYmFsOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZVF1ZXJ5OwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZVN0YXRlbWVudDsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVUcmFuc2FjdGlvbkxpc3RlbmVyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLlVpRGV2aWNlOwogaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CiBpbXBvcnQgYW5kcm9pZC50ZXN0Lk1vcmVBc3NlcnRzOwogaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5MYXJnZVRlc3Q7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5jdHMuRGF0YWJhc2VUZXN0VXRpbHMuZ2V0RGJJbmZvT3V0cHV0OwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5jdHMuRGF0YWJhc2VUZXN0VXRpbHMud2FpdEZvckNvbm5lY3Rpb25Ub0Nsb3NlOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TZW1hcGhvcmU7CiAKIHB1YmxpYyBjbGFzcyBTUUxpdGVEYXRhYmFzZVRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTUUxpdGVEYXRhYmFzZVRlc3QiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBFQ1RFRF9NQUpPUl9NSU5PUl9WRVJTSU9OID0gIjMuMjIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFWFBFQ1RFRF9NSU5fUEFUQ0hfTEVWRUwgPSAwOworCiAgICAgcHJpdmF0ZSBTUUxpdGVEYXRhYmFzZSBtRGF0YWJhc2U7CiAgICAgcHJpdmF0ZSBGaWxlIG1EYXRhYmFzZUZpbGU7CiAgICAgcHJpdmF0ZSBTdHJpbmcgbURhdGFiYXNlRmlsZVBhdGg7CkBAIC01OSw2ICs2Myw3IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQUJBU0VfRklMRV9OQU1FID0gImRhdGFiYXNlX3Rlc3QuZGIiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJMRV9OQU1FID0gInRlc3QiOworCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTFVNTl9JRF9JTkRFWCA9IDA7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTFVNTl9OQU1FX0lOREVYID0gMTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX0FHRV9JTkRFWCA9IDI7CkBAIC0xMzkwLDYgKzEzOTUsMTYgQEAKICAgICAgICAgYXNzZXJ0RmFsc2UobURhdGFiYXNlLmlzV3JpdGVBaGVhZExvZ2dpbmdFbmFibGVkKCkpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHRlc3REaXNhYmxlV3JpdGVBaGVhZExvZ2dpbmcoKSB7CisgICAgICAgIGFzc2VydEZhbHNlKG1EYXRhYmFzZS5pc1dyaXRlQWhlYWRMb2dnaW5nRW5hYmxlZCgpKTsKKyAgICAgICAgbURhdGFiYXNlLmRpc2FibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICBhc3NlcnRGYWxzZShtRGF0YWJhc2UuaXNXcml0ZUFoZWFkTG9nZ2luZ0VuYWJsZWQoKSk7CisgICAgICAgIC8vIFZlcmlmeSB0aGF0IGRlZmF1bHQgam91cm5hbCBtb2RlIGlzIHNldCBpZiBXQUwgaXMgZGlzYWJsZWQKKyAgICAgICAgU3RyaW5nIGRlZmF1bHRKb3VybmFsTW9kZSA9IFNRTGl0ZUdsb2JhbC5nZXREZWZhdWx0Sm91cm5hbE1vZGUoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShEYXRhYmFzZVV0aWxzLnN0cmluZ0ZvclF1ZXJ5KG1EYXRhYmFzZSwgIlBSQUdNQSBqb3VybmFsX21vZGUiLCBudWxsKQorICAgICAgICAgICAgICAgIC5lcXVhbHNJZ25vcmVDYXNlKGRlZmF1bHRKb3VybmFsTW9kZSkpOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHRlc3RFbmFibGVUaGVuRGlzYWJsZVdyaXRlQWhlYWRMb2dnaW5nVXNpbmdPcGVuRmxhZygpIHsKICAgICAgICAgY2xvc2VBbmREZWxldGVEYXRhYmFzZSgpOwogICAgICAgICBtRGF0YWJhc2UgPSBTUUxpdGVEYXRhYmFzZS5vcGVuRGF0YWJhc2UobURhdGFiYXNlRmlsZS5nZXRQYXRoKCksIG51bGwsCkBAIC0xNTQ4LDcgKzE1NjMsNyBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9zZUlkbGVDb25uZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIG1EYXRhYmFzZS5jbG9zZSgpOwogICAgICAgICBTUUxpdGVEYXRhYmFzZS5PcGVuUGFyYW1zIHBhcmFtcyA9IG5ldyBTUUxpdGVEYXRhYmFzZS5PcGVuUGFyYW1zLkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgIC5zZXRJZGxlQ29ubmVjdGlvblRpbWVvdXQoMTAwMCkuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICAuc2V0SWRsZUNvbm5lY3Rpb25UaW1lb3V0KDUwMDApLmJ1aWxkKCk7CiAgICAgICAgIG1EYXRhYmFzZSA9IFNRTGl0ZURhdGFiYXNlLm9wZW5EYXRhYmFzZShtRGF0YWJhc2VGaWxlLCBwYXJhbXMpOwogICAgICAgICAvLyBXYWl0IGEgYml0IGFuZCBjaGVjayB0aGF0IGNvbm5lY3Rpb24gaXMgc3RpbGwgb3BlbgogICAgICAgICBUaHJlYWQuc2xlZXAoNjAwKTsKQEAgLTE1NTcsOSArMTU3Miw5IEBACiAgICAgICAgICAgICAgICAgb3V0cHV0LmNvbnRhaW5zKCJDb25uZWN0aW9uICMwOiIpKTsKIAogICAgICAgICAvLyBOb3cgY2F1c2UgaWRsZSB0aW1lb3V0IGFuZCBjaGVjayB0aGF0IGNvbm5lY3Rpb24gaXMgY2xvc2VkCi0gICAgICAgIC8vIFdlIHdhaXQgdXAgdG8gNSBzZWNvbmRzLCB3aGljaCBpcyBsb25nZXIgdGhhbiByZXF1aXJlZCAxIHMgdG8gYWNjb21tb2RhdGUgZm9yIGRlbGF5cyBpbgorICAgICAgICAvLyBXZSB3YWl0IHVwIHRvIDEwIHNlY29uZHMsIHdoaWNoIGlzIGxvbmdlciB0aGFuIHJlcXVpcmVkIDEgcyB0byBhY2NvbW1vZGF0ZSBmb3IgZGVsYXlzIGluCiAgICAgICAgIC8vIG1lc3NhZ2UgcHJvY2Vzc2luZyB3aGVuIHN5c3RlbSBpcyBidXN5Ci0gICAgICAgIGJvb2xlYW4gY29ubmVjdGlvbldhc0Nsb3NlZCA9IHdhaXRGb3JDb25uZWN0aW9uVG9DbG9zZSgxMCwgNTAwKTsKKyAgICAgICAgYm9vbGVhbiBjb25uZWN0aW9uV2FzQ2xvc2VkID0gd2FpdEZvckNvbm5lY3Rpb25Ub0Nsb3NlKDIwLCA1MDApOwogICAgICAgICBhc3NlcnRUcnVlKCJDb25uZWN0aW9uICMwIHNob3VsZCBiZSBjbG9zZWQiLCBjb25uZWN0aW9uV2FzQ2xvc2VkKTsKICAgICB9CiAKQEAgLTE1ODYsOCArMTYwMSwxMTYgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEpvdXJuYWxNb2RlTm90V0FMKCkgewotICAgICAgICBhc3NlcnRGYWxzZSgiRGVmYXVsdCBqb3VybmFsIG1vZGUgc2hvdWxkIG5vdCBiZSBXQUwiLCAiV0FMIi5lcXVhbHNJZ25vcmVDYXNlKAotICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuc3RyaW5nRm9yUXVlcnkobURhdGFiYXNlLCAiUFJBR01BIGpvdXJuYWxfbW9kZSIsIG51bGwpKSk7CisgICAgICAgIFN0cmluZyBkZWZhdWx0Sm91cm5hbE1vZGUgPSBTUUxpdGVHbG9iYWwuZ2V0RGVmYXVsdEpvdXJuYWxNb2RlKCk7CisgICAgICAgIGFzc2VydEZhbHNlKCJEZWZhdWx0IGpvdXJuYWwgbW9kZSBzaG91bGQgbm90IGJlIFdBTCIsCisgICAgICAgICAgICAgICAgIldBTCIuZXF1YWxzSWdub3JlQ2FzZShkZWZhdWx0Sm91cm5hbE1vZGUpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGF0aWJpbGl0eVdBTElzRGVmYXVsdFdoZW5TdXBwb3J0ZWQoKSB7CisgICAgICAgIGlmICghU1FMaXRlR2xvYmFsLmlzQ29tcGF0aWJpbGl0eVdhbFN1cHBvcnRlZCgpKSB7CisgICAgICAgICAgICBMb2cuaShUQUcsICJDb21wYXRpYmlsaXR5IFdBTCBub3Qgc3VwcG9ydGVkLiAiCisgICAgICAgICAgICAgICAgICAgICsgIlNraXBwaW5nIHRlc3RDb21wYXRpYmlsaXR5V0FMSXNEZWZhdWx0V2hlblN1cHBvcnRlZCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiSm91cm5hbCBtb2RlIHNob3VsZCBiZSBXQUwgaWYgY29tcGF0aWJpbGl0eSBXQUwgaXMgc3VwcG9ydGVkIiwKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLnN0cmluZ0ZvclF1ZXJ5KG1EYXRhYmFzZSwgIlBSQUdNQSBqb3VybmFsX21vZGUiLCBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFsc0lnbm9yZUNhc2UoIldBTCIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoYXQgYXBwIGNhbiBzcGVjaWZ5IGpvdXJuYWwgbW9kZS9zeW5jaHJvbm91cyBtb2RlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEpvdXJuYWxNb2RlU3luY2hyb25vdXNNb2RlT3ZlcnJpZGUoKSB7CisgICAgICAgIG1EYXRhYmFzZS5jbG9zZSgpOworICAgICAgICBTUUxpdGVEYXRhYmFzZS5PcGVuUGFyYW1zIHBhcmFtcyA9IG5ldyBTUUxpdGVEYXRhYmFzZS5PcGVuUGFyYW1zLkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRKb3VybmFsTW9kZSgiREVMRVRFIikuc2V0U3luY2hyb25vdXNNb2RlKCJPRkYiKS5idWlsZCgpOworICAgICAgICBtRGF0YWJhc2UgPSBTUUxpdGVEYXRhYmFzZS5vcGVuRGF0YWJhc2UobURhdGFiYXNlRmlsZSwgcGFyYW1zKTsKKworICAgICAgICBTdHJpbmcgam91cm5hbE1vZGUgPSBEYXRhYmFzZVV0aWxzCisgICAgICAgICAgICAgICAgLnN0cmluZ0ZvclF1ZXJ5KG1EYXRhYmFzZSwgIlBSQUdNQSBqb3VybmFsX21vZGUiLCBudWxsKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIkRFTEVURSIsIGpvdXJuYWxNb2RlLnRvVXBwZXJDYXNlKCkpOworICAgICAgICBTdHJpbmcgc3luY01vZGUgPSBEYXRhYmFzZVV0aWxzCisgICAgICAgICAgICAgICAgLnN0cmluZ0ZvclF1ZXJ5KG1EYXRhYmFzZSwgIlBSQUdNQSBzeW5jaHJvbm91cyIsIG51bGwpOworCisgICAgICAgIGFzc2VydEVxdWFscygiMCIsIHN5bmNNb2RlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoYXQgZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcgaXMgbm90IGFmZmVjdGVkIGJ5IGFwcCdzIGpvdXJuYWwgbW9kZSBzZXR0aW5nLAorICAgICAqIGJ1dCBhcHAgY2FuIHN0aWxsIGNvbnRyb2wgc3luY2hyb25vdXMgbW9kZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW5hYmxlV2FsT3ZlcnJpZGVzSm91cm5hbE1vZGVTeW5jTW9kZVByZXNlcnZlZCgpIHsKKyAgICAgICAgbURhdGFiYXNlLmNsb3NlKCk7CisgICAgICAgIFNRTGl0ZURhdGFiYXNlLk9wZW5QYXJhbXMgcGFyYW1zID0gbmV3IFNRTGl0ZURhdGFiYXNlLk9wZW5QYXJhbXMuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldEpvdXJuYWxNb2RlKCJERUxFVEUiKS5zZXRTeW5jaHJvbm91c01vZGUoIk9GRiIpLmJ1aWxkKCk7CisgICAgICAgIG1EYXRhYmFzZSA9IFNRTGl0ZURhdGFiYXNlLm9wZW5EYXRhYmFzZShtRGF0YWJhc2VGaWxlLCBwYXJhbXMpOworICAgICAgICBtRGF0YWJhc2UuZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKworICAgICAgICBTdHJpbmcgam91cm5hbE1vZGUgPSBEYXRhYmFzZVV0aWxzCisgICAgICAgICAgICAgICAgLnN0cmluZ0ZvclF1ZXJ5KG1EYXRhYmFzZSwgIlBSQUdNQSBqb3VybmFsX21vZGUiLCBudWxsKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIldBTCIsIGpvdXJuYWxNb2RlLnRvVXBwZXJDYXNlKCkpOworICAgICAgICBTdHJpbmcgc3luY01vZGUgPSBEYXRhYmFzZVV0aWxzCisgICAgICAgICAgICAgICAgLnN0cmluZ0ZvclF1ZXJ5KG1EYXRhYmFzZSwgIlBSQUdNQSBzeW5jaHJvbm91cyIsIG51bGwpOworCisgICAgICAgIGFzc2VydEVxdWFscygiMCIgLyogT0ZGICovLCBzeW5jTW9kZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyB0ZXN0IHN0YXJ0cyBhIHRyYW5zYWN0aW9uIGFuZCB2ZXJpZmllcyB0aGF0IG90aGVyIHRocmVhZHMgYXJlIGJsb2NrZWQgb24KKyAgICAgKiBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLiBXYWl0aW5nIHRocmVhZHMgc2hvdWxkIGJlIHVuYmxvY2tlZCBvbmNlIHRyYW5zYWN0aW9uIGlzIGNvbXBsZXRlLgorICAgICAqCisgICAgICogVGhpcyBpcyBkb25lIHRvIGVuc3VyZSB0aGF0IENvbXBhdGliaWxpdHkgV0FMIGZvbGxvd3MgdGhlIG9yaWdpbmFsIHRyYW5zYWN0aW9uIHNlbWFudGljcyBvZgorICAgICAqIHtAbGluayBTUUxpdGVEYXRhYmFzZX0gaW5zdGFuY2Ugd2hlbiB7QGxpbmsgU1FMaXRlRGF0YWJhc2UjRU5BQkxFX1dSSVRFX0FIRUFEX0xPR0dJTkd9IGZsYWcKKyAgICAgKiBpcyBub3Qgc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBY3RpdmVUcmFuc2FjdGlvbklzQmxvY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbURhdGFiYXNlLmJlZ2luVHJhbnNhY3Rpb25Ob25FeGNsdXNpdmUoKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSB0MSAoaSBpbnQpOyIpOworICAgICAgICBmaW5hbCBMaXN0PFRocm93YWJsZT4gZXJyb3JzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICAgICAgVGhyZWFkIHJlYWRUaHJlYWQgPSBuZXcgVGhyZWFkKAorICAgICAgICAgICAgICAgICgpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMubG9uZ0ZvclF1ZXJ5KG1EYXRhYmFzZSwgIlNFTEVDVCBjb3VudCgqKSBmcm9tIHQxIiwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJSZWFkVGhyZWFkIGZhaWxlZCIsIHQpOworICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFkZCh0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICByZWFkVGhyZWFkLnN0YXJ0KCk7CisgICAgICAgIHJlYWRUaHJlYWQuam9pbig1MDBMKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiUmVhZFRocmVhZCBzaG91bGQgYmUgYmxvY2tlZCB3aGlsZSB0cmFuc2FjdGlvbiBpcyBhY3RpdmUiLAorICAgICAgICAgICAgICAgIHJlYWRUaHJlYWQuaXNBbGl2ZSgpKTsKKworICAgICAgICBtRGF0YWJhc2Uuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7CisgICAgICAgIG1EYXRhYmFzZS5lbmRUcmFuc2FjdGlvbigpOworCisgICAgICAgIHJlYWRUaHJlYWQuam9pbig1MDBMKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlJlYWRUaHJlYWQgc2hvdWxkIGZpbmlzaCBhZnRlciB0cmFuc2FjdGlvbiBoYXMgZW5kZWQiLAorICAgICAgICAgICAgICAgIHJlYWRUaHJlYWQuaXNBbGl2ZSgpKTsKKworICAgICAgICBhc3NlcnRUcnVlKCJSZWFkVGhyZWFkIGZhaWxlZCB3aXRoIGVycm9yczogIiArIGVycm9ycywgZXJyb3JzLmlzRW1wdHkoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNxbGl0ZUxpYnJhcnlWZXJzaW9uKCkgeworICAgICAgICAvLyBTUUxpdGUgdXNlcyBzZW1hbnRpYyB2ZXJzaW9uaW5nIGluIGEgZm9ybSBvZiBNQUpPUi5NSU5PUi5QQVRDSC4KKyAgICAgICAgLy8gTWFqb3IvbWlub3Igc2hvdWxkIG1hdGNoLCB3aGlsZSBwYXRjaCBjYW4gYmUgbmV3ZXIKKyAgICAgICAgU3RyaW5nIGZ1bGxWZXJzaW9uU3RyID0gRGF0YWJhc2VVdGlscworICAgICAgICAgICAgICAgIC5zdHJpbmdGb3JRdWVyeShtRGF0YWJhc2UsICJzZWxlY3Qgc3FsaXRlX3ZlcnNpb24oKSIsIG51bGwpOworICAgICAgICBpbnQgbGFzdERvdCA9IGZ1bGxWZXJzaW9uU3RyLmxhc3RJbmRleE9mKCcuJyk7CisgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQgdmVyc2lvbiBmb3JtYXQsIGV4cGVjdGVkIE1BSk9SLk1JTk9SLlBBVENIIGJ1dCB3YXMgIiArIGZ1bGxWZXJzaW9uU3RyLAorICAgICAgICAgICAgICAgIGxhc3REb3QgPiAwKTsKKyAgICAgICAgU3RyaW5nIG1ham9yTWlub3IgPSBmdWxsVmVyc2lvblN0ci5zdWJzdHJpbmcoMCwgbGFzdERvdCk7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgU1FMaXRlIGxpYnJhcnkgdmVyc2lvbiAiICsgRVhQRUNURURfTUFKT1JfTUlOT1JfVkVSU0lPTiArICIsIGJ1dCB3YXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBmdWxsVmVyc2lvblN0ciwgRVhQRUNURURfTUFKT1JfTUlOT1JfVkVSU0lPTiwgbWFqb3JNaW5vcik7CisgICAgICAgIGludCBwYXRjaExldmVsID0gSW50ZWdlci52YWx1ZU9mKGZ1bGxWZXJzaW9uU3RyLnN1YnN0cmluZyhsYXN0RG90ICsgMSkpOworICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCBtaW5pbXVtIHBhdGNoIGxldmVsICIgKyBFWFBFQ1RFRF9NSU5fUEFUQ0hfTEVWRUwgKyAiLCBidXQgd2FzICIKKyAgICAgICAgICAgICAgICArIHBhdGNoTGV2ZWwsIHBhdGNoTGV2ZWwgPj0gRVhQRUNURURfTUlOX1BBVENIX0xFVkVMKTsKICAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2RhdGFiYXNlL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9jdHMvU1FMaXRlT3BlbkhlbHBlclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2RhdGFiYXNlL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9jdHMvU1FMaXRlT3BlbkhlbHBlclRlc3QuamF2YQppbmRleCA4NTNmMjRiLi5lYjUxYWZhIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9kYXRhYmFzZS9zcmMvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvY3RzL1NRTGl0ZU9wZW5IZWxwZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvZGF0YWJhc2Uvc3JjL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL2N0cy9TUUxpdGVPcGVuSGVscGVyVGVzdC5qYXZhCkBAIC0xNiwyMyArMTYsMjYgQEAKIAogcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5jdHM7CiAKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuY3RzLkRhdGFiYXNlVGVzdFV0aWxzLmdldERiSW5mb091dHB1dDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuY3RzLkRhdGFiYXNlVGVzdFV0aWxzLndhaXRGb3JDb25uZWN0aW9uVG9DbG9zZTsKKwogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlVXRpbHM7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlQ3Vyc29yOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUN1cnNvckRyaXZlcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZTsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5OwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURlYnVnOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUdsb2JhbDsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVPcGVuSGVscGVyOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZVF1ZXJ5OwotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlLkN1cnNvckZhY3Rvcnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QudWlhdXRvbWF0b3IuVWlEZXZpY2U7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLmN0cy5EYXRhYmFzZVRlc3RVdGlscy5nZXREYkluZm9PdXRwdXQ7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLmN0cy5EYXRhYmFzZVRlc3RVdGlscy53YWl0Rm9yQ29ubmVjdGlvblRvQ2xvc2U7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiAKIC8qKgogICogVGVzdCB7QGxpbmsgU1FMaXRlT3BlbkhlbHBlcn0uCkBAIC01NSw2ICs1OCw3IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgbU9wZW5IZWxwZXIuY2xvc2UoKTsKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UuZGVsZXRlRGF0YWJhc2UobUNvbnRleHQuZ2V0RGF0YWJhc2VQYXRoKFRFU1RfREFUQUJBU0VfTkFNRSkpOwogICAgICAgICBzdXBlci50ZWFyRG93bigpOwogICAgIH0KIApAQCAtMjA0LDE3ICsyMDgsMTEyIEBACiAgICAgICAgICAgICAgICAgb3V0cHV0LmNvbnRhaW5zKCJDb25uZWN0aW9uICMwOiIpKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3BlblBhcmFtc0NvbnN0cnVjdG9yKCkgeworICAgICAgICBTUUxpdGVEYXRhYmFzZS5PcGVuUGFyYW1zIHBhcmFtcyA9IG5ldyBTUUxpdGVEYXRhYmFzZS5PcGVuUGFyYW1zLkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworCisgICAgICAgIE1vY2tPcGVuSGVscGVyIGhlbHBlciA9IG5ldyBNb2NrT3BlbkhlbHBlcihtQ29udGV4dCwgbnVsbCwgMSwgcGFyYW1zKTsKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGF0YWJhc2UgPSBoZWxwZXIuZ2V0V3JpdGFibGVEYXRhYmFzZSgpOworICAgICAgICBhc3NlcnROb3ROdWxsKGRhdGFiYXNlKTsKKyAgICAgICAgaGVscGVyLmNsb3NlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3Ige0BsaW5rIFNRTGl0ZU9wZW5IZWxwZXIjc2V0T3BlblBhcmFtcyhTUUxpdGVEYXRhYmFzZS5PcGVuUGFyYW1zKX0uCisgICAgICogPHA+T3BlbnMgdGhlIGRhdGFiYXNlIHVzaW5nIHRoZSBoZWxwZXIgYW5kIHZlcmlmaWVzIHRoYXQgcGFyYW1zIGhhdmUgYmVlbiBhcHBsaWVkPC9wPgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRPcGVuUGFyYW1zKCkgeworICAgICAgICBtT3BlbkhlbHBlci5jbG9zZSgpOworCisgICAgICAgIFNRTGl0ZURhdGFiYXNlLk9wZW5QYXJhbXMuQnVpbGRlciBwYXJhbXNCdWlsZGVyID0gbmV3IFNRTGl0ZURhdGFiYXNlLk9wZW5QYXJhbXMuQnVpbGRlcigpOworICAgICAgICBwYXJhbXNCdWlsZGVyLmFkZE9wZW5GbGFncyhTUUxpdGVEYXRhYmFzZS5FTkFCTEVfV1JJVEVfQUhFQURfTE9HR0lORyk7CisKKyAgICAgICAgTW9ja09wZW5IZWxwZXIgaGVscGVyID0gbmV3IE1vY2tPcGVuSGVscGVyKG1Db250ZXh0LCBURVNUX0RBVEFCQVNFX05BTUUsIG51bGwsIDEpOworICAgICAgICBoZWxwZXIuc2V0T3BlblBhcmFtcyhwYXJhbXNCdWlsZGVyLmJ1aWxkKCkpOworICAgICAgICBhc3NlcnRUcnVlKCJkYXRhYmFzZSBtdXN0IGJlIG9wZW5lZCB3aXRoIEVOQUJMRV9XUklURV9BSEVBRF9MT0dHSU5HIGZsYWciLAorICAgICAgICAgICAgICAgIGhlbHBlci5nZXRXcml0YWJsZURhdGFiYXNlKCkuaXNXcml0ZUFoZWFkTG9nZ2luZ0VuYWJsZWQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmVyaWZpZXMgdGhhdCB7QGxpbmsgU1FMaXRlT3BlbkhlbHBlciNzZXRPcGVuUGFyYW1zKFNRTGl0ZURhdGFiYXNlLk9wZW5QYXJhbXMpfSBjYW5ub3QgYmUKKyAgICAgKiBjYWxsZWQgYWZ0ZXIgb3BlbmluZyB0aGUgZGF0YWJhc2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFNldE9wZW5QYXJhbXNGYWlsc0lmRGJJc09wZW4oKSB7CisgICAgICAgIG1PcGVuSGVscGVyLmdldFdyaXRhYmxlRGF0YWJhc2UoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1PcGVuSGVscGVyLnNldE9wZW5QYXJhbXMobmV3IFNRTGl0ZURhdGFiYXNlLk9wZW5QYXJhbXMuQnVpbGRlcigpLmJ1aWxkKCkpOworICAgICAgICAgICAgZmFpbCgic2V0T3BlblBhcmFtcyBzaG91bGQgZmFpbCBpZiB0aGUgZGF0YWJhc2UgaXMgb3BlbiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gRXhwZWN0ZWQKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIGEgc2NlbmFyaW8gaW4gV0FMIG1vZGUgd2l0aCBtdWx0aXBsZSBjb25uZWN0aW9ucywgd2hlbiBhIGNvbm5lY3Rpb24gc2hvdWxkIHNlZSBzY2hlbWEKKyAgICAgKiBjaGFuZ2VzIG1hZGUgZnJvbSBhbm90aGVyIGNvbm5lY3Rpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFdhbFNjaGVtYUNoYW5nZVZpc2liaWxpdHlPblVwZ3JhZGUoKSB7CisgICAgICAgIEZpbGUgZGJQYXRoID0gbUNvbnRleHQuZ2V0RGF0YWJhc2VQYXRoKFRFU1RfREFUQUJBU0VfTkFNRSk7CisgICAgICAgIFNRTGl0ZURhdGFiYXNlLmRlbGV0ZURhdGFiYXNlKGRiUGF0aCk7CisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gU1FMaXRlRGF0YWJhc2Uub3Blbk9yQ3JlYXRlRGF0YWJhc2UoZGJQYXRoLCBudWxsKTsKKyAgICAgICAgZGIuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFIHRlc3RfdGFibGUgKF9pZCBJTlRFR0VSIFBSSU1BUlkgS0VZIEFVVE9JTkNSRU1FTlQpIik7CisgICAgICAgIGRiLnNldFZlcnNpb24oMSk7CisgICAgICAgIGRiLmNsb3NlKCk7CisgICAgICAgIG1PcGVuSGVscGVyID0gbmV3IE1vY2tPcGVuSGVscGVyKG1Db250ZXh0LCBURVNUX0RBVEFCQVNFX05BTUUsIG51bGwsIDIpIHsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZXRXcml0ZUFoZWFkTG9nZ2luZ0VuYWJsZWQodHJ1ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25DcmVhdGUoU1FMaXRlRGF0YWJhc2UgZGIpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblVwZ3JhZGUoU1FMaXRlRGF0YWJhc2UgZGIsIGludCBvbGRWZXJzaW9uLCBpbnQgbmV3VmVyc2lvbikgeworICAgICAgICAgICAgICAgIGlmIChvbGRWZXJzaW9uID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgZGIuZXhlY1NRTCgiQUxURVIgVEFCTEUgdGVzdF90YWJsZSBBREQgY29sdW1uMiBJTlQgREVGQVVMVCAxMjM0Iik7CisgICAgICAgICAgICAgICAgICAgIGRiLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSB0ZXN0X3RhYmxlMiAoX2lkIElOVEVHRVIgUFJJTUFSWSBLRVkgQVVUT0lOQ1JFTUVOVCkiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIC8vIENoZWNrIGlmIGNhbiBzZWUgdGhlIG5ldyBjb2x1bW4KKyAgICAgICAgdHJ5IChDdXJzb3IgY3Vyc29yID0gbU9wZW5IZWxwZXIuZ2V0UmVhZGFibGVEYXRhYmFzZSgpCisgICAgICAgICAgICAgICAgLnJhd1F1ZXJ5KCJzZWxlY3QgKiBmcm9tIHRlc3RfdGFibGUiLCBudWxsKSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJOZXdseSBhZGRlZCBjb2x1bW4gc2hvdWxkIGJlIHZpc2libGUuIFJldHVybmVkIGNvbHVtbnM6ICIgKyBBcnJheXMKKyAgICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKGN1cnNvci5nZXRDb2x1bW5OYW1lcygpKSwgMiwgY3Vyc29yLmdldENvbHVtbkNvdW50KCkpOworICAgICAgICB9CisgICAgICAgIC8vIENoZWNrIGlmIGNhbiBzZWUgdGhlIG5ldyB0YWJsZQorICAgICAgICB0cnkgKEN1cnNvciBjdXJzb3IgPSBtT3BlbkhlbHBlci5nZXRSZWFkYWJsZURhdGFiYXNlKCkKKyAgICAgICAgICAgICAgICAucmF3UXVlcnkoInNlbGVjdCAqIGZyb20gdGVzdF90YWJsZTIiLCBudWxsKSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGN1cnNvci5nZXRDb2x1bW5Db3VudCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRXcml0ZUFoZWFkTG9nZ2luZ0Rpc2FibGVzQ29tcGF0aWJpbGl0eVdhbCgpIHsKKyAgICAgICAgLy8gVmVyaWZ5IHRoYXQgY29tcGF0aWJpbGl0eSBXQUwgaXMgbm90IGVuYWJsZWQsIGlmIGFuIGFwcGxpY2F0aW9uIGV4cGxpY2l0bHkgZGlzYWJsZXMgV0FMCisKKyAgICAgICAgbU9wZW5IZWxwZXIuc2V0V3JpdGVBaGVhZExvZ2dpbmdFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgU3RyaW5nIGpvdXJuYWxNb2RlID0gRGF0YWJhc2VVdGlscworICAgICAgICAgICAgICAgIC5zdHJpbmdGb3JRdWVyeShtT3BlbkhlbHBlci5nZXRXcml0YWJsZURhdGFiYXNlKCksICJQUkFHTUEgam91cm5hbF9tb2RlIiwgbnVsbCk7CisgICAgICAgIGFzc2VydEZhbHNlKCJEZWZhdWx0IGpvdXJuYWwgbW9kZSBzaG91bGQgbm90IGJlIFdBTCIsICJXQUwiLmVxdWFsc0lnbm9yZUNhc2Uoam91cm5hbE1vZGUpKTsKKyAgICB9CisKICAgICBwcml2YXRlIE1vY2tPcGVuSGVscGVyIGdldE9wZW5IZWxwZXIoKSB7CiAgICAgICAgIHJldHVybiBuZXcgTW9ja09wZW5IZWxwZXIobUNvbnRleHQsIFRFU1RfREFUQUJBU0VfTkFNRSwgbUZhY3RvcnksIFRFU1RfVkVSU0lPTik7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBjbGFzcyBNb2NrT3BlbkhlbHBlciBleHRlbmRzIFNRTGl0ZU9wZW5IZWxwZXIgeworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE1vY2tPcGVuSGVscGVyIGV4dGVuZHMgU1FMaXRlT3BlbkhlbHBlciB7CiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtSGFzQ2FsbGVkT25PcGVuID0gZmFsc2U7CiAKLSAgICAgICAgcHVibGljIE1vY2tPcGVuSGVscGVyKENvbnRleHQgY29udGV4dCwgU3RyaW5nIG5hbWUsIEN1cnNvckZhY3RvcnkgZmFjdG9yeSwgaW50IHZlcnNpb24pIHsKKyAgICAgICAgTW9ja09wZW5IZWxwZXIoQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgbmFtZSwgQ3Vyc29yRmFjdG9yeSBmYWN0b3J5LCBpbnQgdmVyc2lvbikgewogICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgbmFtZSwgZmFjdG9yeSwgdmVyc2lvbik7CiAgICAgICAgIH0KIAorICAgICAgICBNb2NrT3BlbkhlbHBlcihDb250ZXh0IGNvbnRleHQsIFN0cmluZyBuYW1lLCBpbnQgdmVyc2lvbiwKKyAgICAgICAgICAgICAgICBTUUxpdGVEYXRhYmFzZS5PcGVuUGFyYW1zIG9wZW5QYXJhbXMpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIG5hbWUsIHZlcnNpb24sIG9wZW5QYXJhbXMpOworICAgICAgICB9CisKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKFNRTGl0ZURhdGFiYXNlIGRiKSB7CiAgICAgICAgIH0KQEAgLTIzNyw4ICszMzYsOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBjbGFzcyBNb2NrQ3Vyc29yIGV4dGVuZHMgU1FMaXRlQ3Vyc29yIHsKLSAgICAgICAgcHVibGljIE1vY2tDdXJzb3IoU1FMaXRlRGF0YWJhc2UgZGIsIFNRTGl0ZUN1cnNvckRyaXZlciBkcml2ZXIsIFN0cmluZyBlZGl0VGFibGUsCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTW9ja0N1cnNvciBleHRlbmRzIFNRTGl0ZUN1cnNvciB7CisgICAgICAgIE1vY2tDdXJzb3IoU1FMaXRlRGF0YWJhc2UgZGIsIFNRTGl0ZUN1cnNvckRyaXZlciBkcml2ZXIsIFN0cmluZyBlZGl0VGFibGUsCiAgICAgICAgICAgICAgICAgU1FMaXRlUXVlcnkgcXVlcnkpIHsKICAgICAgICAgICAgIHN1cGVyKGRiLCBkcml2ZXIsIGVkaXRUYWJsZSwgcXVlcnkpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9kZWJ1Zy9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvZGVidWcvQW5kcm9pZC5tawppbmRleCBmMWI5YjI3Li42OGU4ZjkwIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9kZWJ1Zy9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3Rlc3RzL2RlYnVnL0FuZHJvaWQubWsKQEAgLTMwLDcgKzMwLDcgQEAKICMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKIExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiAKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjdHN0ZXN0cnVubmVyCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY3RzdGVzdHJ1bm5lci1heHQgbmF0aXZldGVzdGhlbHBlcgogCiBMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJkZWJ1Z3Rlc3QKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZGVidWcvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL2RlYnVnL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggNGIzMjU0YS4uMTY1MzdmYiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZGVidWcvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9kZWJ1Zy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yMywxMSArMjMsOSBAQAogICAgIDwvYXBwbGljYXRpb24+CiAKICAgICA8IS0tIFRoaXMgaXMgYSBzZWxmLWluc3RydW1lbnRpbmcgdGVzdCBwYWNrYWdlLiAtLT4KLSAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmRlYnVnLmN0cyIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBvZiBuYXRpdmUgZGVidWdnaW5nIEFQSSI+Ci0gICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJsaXN0ZW5lciIKLSAgICAgICAgICAgIGFuZHJvaWQ6dmFsdWU9ImNvbS5hbmRyb2lkLmN0cy5ydW5uZXIuQ3RzVGVzdFJ1bkxpc3RlbmVyIiAvPgogICAgIDwvaW5zdHJ1bWVudGF0aW9uPgogCiA8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZGVidWcvbGliZGVidWd0ZXN0L0FuZHJvaWQubWsgYi90ZXN0cy90ZXN0cy9kZWJ1Zy9saWJkZWJ1Z3Rlc3QvQW5kcm9pZC5tawppbmRleCA2NWM5NzU2Li5kM2RiNzBmIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9kZWJ1Zy9saWJkZWJ1Z3Rlc3QvQW5kcm9pZC5taworKysgYi90ZXN0cy90ZXN0cy9kZWJ1Zy9saWJkZWJ1Z3Rlc3QvQW5kcm9pZC5tawpAQCAtMjIsNiArMjIsOCBAQAogCiBMT0NBTF9NT0RVTEUgOj0gbGliZGVidWd0ZXN0CiAKK0xPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yCisKICMgRG9uJ3QgaW5jbHVkZSB0aGlzIHBhY2thZ2UgaW4gYW55IGNvbmZpZ3VyYXRpb24gYnkgZGVmYXVsdC4KIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCiAKQEAgLTI5LDYgKzMxLDcgQEAKIAlhbmRyb2lkX2RlYnVnX2N0cy5jcHAKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJsb2cKK0xPQ0FMX1dIT0xFX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGlibmF0aXZldGVzdGhlbHBlcl9qbmkKIAogTE9DQUxfU0RLX1ZFUlNJT04gOj0gMjMKIExPQ0FMX05ES19TVExfVkFSSUFOVCA6PSBjKytfc3RhdGljCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9kZWJ1Zy9saWJkZWJ1Z3Rlc3QvYW5kcm9pZF9kZWJ1Z19jdHMuY3BwIGIvdGVzdHMvdGVzdHMvZGVidWcvbGliZGVidWd0ZXN0L2FuZHJvaWRfZGVidWdfY3RzLmNwcAppbmRleCAyYzdjOTY3Li4zYWE0MzE4IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9kZWJ1Zy9saWJkZWJ1Z3Rlc3QvYW5kcm9pZF9kZWJ1Z19jdHMuY3BwCisrKyBiL3Rlc3RzL3Rlc3RzL2RlYnVnL2xpYmRlYnVndGVzdC9hbmRyb2lkX2RlYnVnX2N0cy5jcHAKQEAgLTE1LDggKzE1LDEwIEBACiAgKi8KIAogI2luY2x1ZGUgPGpuaS5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9sb2cuaD4KIAorI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8c3lzL3B0cmFjZS5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy91aW8uaD4KQEAgLTI4LDYgKzMwLDcgQEAKIAogI2RlZmluZSBMT0dfVEFHICJDdHMtRGVidWdUZXN0IgogCisvLyBVc2VkIGJ5IGNoaWxkIHByb2Nlc3NlcyBvbmx5CiAjZGVmaW5lIGFzc2VydF9vcl9leGl0KHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBpZih4KSBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0zNSwyOSArMzgsMjEgQEAKICAgICAgICAgICAgICAgICBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBfZXhpdCgxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgfSB3aGlsZSAoMCkKLSNkZWZpbmUgYXNzZXJ0X29yX3JldHVybih4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmKHgpIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19FUlJPUiwgTE9HX1RBRywgIkFzc2VydGlvbiAiICN4ICIgZmFpbGVkLiBlcnJubyglZCk6ICVzIiwgXAotICAgICAgICAgICAgICAgIGVycm5vLCBzdHJlcnJvcihlcnJubykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHJldHVybiBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9IHdoaWxlICgwKQogCi1zdGF0aWMgYm9vbCBwYXJlbnQocGlkX3QgY2hpbGQpIHsKK3N0YXRpYyB2b2lkIHBhcmVudChwaWRfdCBjaGlsZCkgewogICAgIGludCBzdGF0dXM7CiAgICAgaW50IHdwaWQgPSB3YWl0cGlkKGNoaWxkLCAmc3RhdHVzLCAwKTsKLSAgICBhc3NlcnRfb3JfcmV0dXJuKHdwaWQgPT0gY2hpbGQpOwotICAgIGFzc2VydF9vcl9yZXR1cm4oV0lGRVhJVEVEKHN0YXR1cykpOwotICAgIGFzc2VydF9vcl9yZXR1cm4oV0VYSVRTVEFUVVMoc3RhdHVzICkgPT0gMCk7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgQVNTRVJUX0VRKGNoaWxkLCB3cGlkKTsKKyAgICBBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSk7CisgICAgQVNTRVJUX0VRKDAsIFdFWElUU1RBVFVTKHN0YXR1cykpOwogfQogCi1zdGF0aWMgYm9vbCBydW5fdGVzdChjb25zdCBzdGQ6OmZ1bmN0aW9uPHZvaWQocGlkX3QpPiAmdGVzdCkgeworc3RhdGljIHZvaWQgcnVuX3Rlc3QoY29uc3Qgc3RkOjpmdW5jdGlvbjx2b2lkKHBpZF90KT4gJnRlc3QpIHsKICAgICBwaWRfdCBwaWQgPSBmb3JrKCk7Ci0gICAgYXNzZXJ0X29yX3JldHVybihwaWQgPj0gMCk7Ci0gICAgaWYgKHBpZCAhPSAwKQotICAgICAgICByZXR1cm4gcGFyZW50KHBpZCk7Ci0gICAgZWxzZSB7CisgICAgQVNTRVJUX05FKC0xLCBwaWQpIDw8ICJmb3JrKCkgZmFpbGVkIHdpdGggIiA8PCBzdHJlcnJvcihlcnJubyk7CisgICAgaWYgKHBpZCAhPSAwKSB7CisgICAgICAgIHBhcmVudChwaWQpOworICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIGNoaWxkCiAgICAgICAgIHRlc3QoZ2V0cHBpZCgpKTsKICAgICAgICAgX2V4aXQoMCk7CkBAIC03NCwxMiArNjksMTAgQEAKICAgICBhc3NlcnRfb3JfZXhpdChwdHJhY2UoUFRSQUNFX0RFVEFDSCwgcGFyZW50LCBudWxscHRyLCBudWxscHRyKSA9PSAwKTsKIH0KIAotLy8gcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBwdHJhY2VBdHRhY2goKTsKLWV4dGVybiAiQyIgamJvb2xlYW4gSmF2YV9hbmRyb2lkX2RlYnVnX2N0c19EZWJ1Z1Rlc3RfcHRyYWNlQXR0YWNoKEpOSUVudiAqLCBqY2xhc3MpIHsKLSAgICByZXR1cm4gcnVuX3Rlc3QocHRyYWNlQXR0YWNoKTsKK1RFU1QoRGVidWdUZXN0LCBwdHJhY2VBdHRhY2gpIHsKKyAgICBydW5fdGVzdChwdHJhY2VBdHRhY2gpOwogfQogCi0KIHN0YXRpYyB2b2lkIHByb2Nlc3NWbVJlYWR2KHBpZF90IHBhcmVudCwgY29uc3Qgc3RkOjp2ZWN0b3I8bG9uZyAqPiAmYWRkcmVzc2VzKSB7CiAgICAgbG9uZyBkZXN0aW5hdGlvbjsKICAgICBpb3ZlYyBsb2NhbCA9IHsgJmRlc3RpbmF0aW9uLCBzaXplb2YgZGVzdGluYXRpb24gfTsKQEAgLTk4LDExICs5MSwxMSBAQAogCiBzdGF0aWMgbG9uZyBnbG9iYWxfdmFyaWFibGUgPSAweDQ3NDc0NzQ3OwogLy8gcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBwcm9jZXNzVm1SZWFkdigpOwotZXh0ZXJuICJDIiBqYm9vbGVhbiBKYXZhX2FuZHJvaWRfZGVidWdfY3RzX0RlYnVnVGVzdF9wcm9jZXNzVm1SZWFkdihKTklFbnYgKiwgamNsYXNzKSB7CitURVNUKERlYnVnVGVzdCwgcHJvY2Vzc1ZtUmVhZHYpIHsKICAgICBsb25nIHN0YWNrX3ZhcmlhYmxlID0gMHg0MjQyNDI0MjsKICAgICAvLyBUaGlzIHJ1bnMgdGhlIHRlc3Qgd2l0aCBhIHNlbGVjdGlvbiBvZiBkaWZmZXJlbnQga2luZHMgb2YgYWRkcmVzc2VzIGFuZAogICAgIC8vIG1ha2VzIHN1cmUgdGhlIGNoaWxkIHByb2Nlc3MgKHNpbXVsYXRpbmcgYSBkZWJ1Z2dlcikgY2FuIHJlYWQgdGhlbS4KLSAgICByZXR1cm4gcnVuX3Rlc3QoWyZdKHBpZF90IHBhcmVudCkgeworICAgIHJ1bl90ZXN0KFsmXShwaWRfdCBwYXJlbnQpIHsKICAgICAgICAgcHJvY2Vzc1ZtUmVhZHYocGFyZW50LCBzdGQ6OnZlY3Rvcjxsb25nICo+ewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xvYmFsX3ZhcmlhYmxlLCAmc3RhY2tfdmFyaWFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8bG9uZyAqPigmcHJvY2Vzc1ZtUmVhZHYpfSk7CkBAIC0xMTAsOSArMTAzLDkgQEAKIH0KIAogLy8gcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBwcm9jZXNzVm1SZWFkdk51bGxwdHIoKTsKLWV4dGVybiAiQyIgamJvb2xlYW4gSmF2YV9hbmRyb2lkX2RlYnVnX2N0c19EZWJ1Z1Rlc3RfcHJvY2Vzc1ZtUmVhZHZOdWxscHRyKEpOSUVudiAqLCBqY2xhc3MpIHsKK1RFU1QoRGVidWdUZXN0LCBwcm9jZXNzVm1SZWFkdk51bGxwdHIpIHsKICAgICAvLyBNYWtlIHN1cmUgcmVhZGluZyB1bmFsbG9jYXRlZCBtZW1vcnkgYmVoYXZlcyByZWFzb25hYmx5LgotICAgIHJldHVybiBydW5fdGVzdChbXShwaWRfdCBwYXJlbnQpIHsKKyAgICBydW5fdGVzdChbXShwaWRfdCBwYXJlbnQpIHsKICAgICAgICAgbG9uZyBkZXN0aW5hdGlvbjsKICAgICAgICAgaW92ZWMgbG9jYWwgPSB7JmRlc3RpbmF0aW9uLCBzaXplb2YgZGVzdGluYXRpb259OwogICAgICAgICBpb3ZlYyByZW1vdGUgPSB7bnVsbHB0ciwgc2l6ZW9mKGxvbmcpfTsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2RlYnVnL3NyYy9hbmRyb2lkL2RlYnVnL2N0cy9EZWJ1Z1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2RlYnVnL3NyYy9hbmRyb2lkL2RlYnVnL2N0cy9EZWJ1Z1Rlc3QuamF2YQppbmRleCBjYTU1ZDljLi45OTNmMDJiIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9kZWJ1Zy9zcmMvYW5kcm9pZC9kZWJ1Zy9jdHMvRGVidWdUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvZGVidWcvc3JjL2FuZHJvaWQvZGVidWcvY3RzL0RlYnVnVGVzdC5qYXZhCkBAIC0xNiwyNiArMTYsMTAgQEAKIAogcGFja2FnZSBhbmRyb2lkLmRlYnVnLmN0czsKIAotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgY29tLmFuZHJvaWQuZ3Rlc3RydW5uZXIuR3Rlc3RSdW5uZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuZ3Rlc3RydW5uZXIuVGFyZ2V0TGlicmFyeTsKIAotcHVibGljIGNsYXNzIERlYnVnVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIFN5c3RlbS5sb2FkTGlicmFyeSgiZGVidWd0ZXN0Iik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBwdHJhY2VBdHRhY2goKTsKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3B0cmFjZUF0dGFjaCgpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHB0cmFjZUF0dGFjaCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIHByb2Nlc3NWbVJlYWR2KCk7Ci0gICAgcHVibGljIHZvaWQgdGVzdF9wcm9jZXNzVm1SZWFkdigpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHByb2Nlc3NWbVJlYWR2KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gcHJvY2Vzc1ZtUmVhZHZOdWxscHRyKCk7Ci0gICAgcHVibGljIHZvaWQgdGVzdF9wcm9jZXNzVm1SZWFkdk51bGxwdHIoKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBwcm9jZXNzVm1SZWFkdk51bGxwdHIoKSk7Ci0gICAgfQotfQorQFJ1bldpdGgoR3Rlc3RSdW5uZXIuY2xhc3MpCitAVGFyZ2V0TGlicmFyeSgiZGVidWd0ZXN0IikKK3B1YmxpYyBjbGFzcyBEZWJ1Z1Rlc3Qge30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2Rpc3BsYXkvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL2Rpc3BsYXkvQW5kcm9pZC5tawppbmRleCA1M2FlMTc3Li45OWVmYzIwIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9kaXNwbGF5L0FuZHJvaWQubWsKKysrIGIvdGVzdHMvdGVzdHMvZGlzcGxheS9BbmRyb2lkLm1rCkBAIC0yNywxMyArMjcsMTUgQEAKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC1zdXBwb3J0LXRlc3QgbGVnYWN5LWFuZHJvaWQtdGVzdAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWR4LnRlc3QucnVsZXMKKworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LmJhc2Uuc3R1YnMKIAogIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzIGN0c19pbnN0YW50CiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNEaXNwbGF5VGVzdENhc2VzCiAKLUxPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKK0xPQ0FMX1NES19WRVJTSU9OIDo9IHRlc3RfY3VycmVudAogCiBpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9kaXNwbGF5L0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy90ZXN0cy9kaXNwbGF5L0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggNjM4YmRiMS4uNDFkMTY4OCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZGlzcGxheS9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL2Rpc3BsYXkvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMTYsMTAgKzE2LDE2IEBACiAgLS0+CiAKIDxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgcGFja2FnZT0iYW5kcm9pZC5kaXNwbGF5LmN0cyI+CisgICAgcGFja2FnZT0iYW5kcm9pZC5kaXNwbGF5LmN0cyIKKyAgICBhbmRyb2lkOnRhcmdldFNhbmRib3hWZXJzaW9uPSIyIj4KIAogICAgIDwhLS0gRm9yIHNwZWNpYWwgcHJlc2VudGF0aW9uIHdpbmRvd3Mgd2hlbiB0ZXN0aW5nIG1vZGUgc3dpdGNoZXMuIC0tPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uU1lTVEVNX0FMRVJUX1dJTkRPVyIgLz4KKyAgICA8IS0tIEZvciB0ZXN0aW5nIGJyaWdodG5lc3Mgc2xpZGVyIHRyYWNraW5nLiAtLT4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkJSSUdIVE5FU1NfU0xJREVSX1VTQUdFIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uV0FLRV9MT0NLIiAvPgorICAgIDwhLS0gRm9yIHRlc3RpbmcgcHVzaGluZyBicmlnaHRuZXNzIGN1cnZlcy4gLS0+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5DT05GSUdVUkVfRElTUExBWV9CUklHSFRORVNTIiAvPgogCiAgICAgPGFwcGxpY2F0aW9uPgogICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KQEAgLTI5LDcgKzM1LDcgQEAKIAogICAgIDwhLS0gIHNlbGYtaW5zdHJ1bWVudGluZyB0ZXN0IHBhY2thZ2UuIC0tPgogICAgIDxpbnN0cnVtZW50YXRpb24KLSAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmRpc3BsYXkuY3RzIgogICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgdGVzdHMgb2YgYW5kcm9pZC5kaXNwbGF5Ij4KICAgICA8L2luc3RydW1lbnRhdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2Rpc3BsYXkvQW5kcm9pZFRlc3QueG1sIGIvdGVzdHMvdGVzdHMvZGlzcGxheS9BbmRyb2lkVGVzdC54bWwKaW5kZXggOGIxNzRmMS4uM2UxYjM4ZCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZGlzcGxheS9BbmRyb2lkVGVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvZGlzcGxheS9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBEaXNwbGF5IHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJmcmFtZXdvcmsiIC8+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CiAgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2Rpc3BsYXkvc3JjL2FuZHJvaWQvZGlzcGxheS9jdHMvQnJpZ2h0bmVzc1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2Rpc3BsYXkvc3JjL2FuZHJvaWQvZGlzcGxheS9jdHMvQnJpZ2h0bmVzc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDU3YjczCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvZGlzcGxheS9zcmMvYW5kcm9pZC9kaXNwbGF5L2N0cy9CcmlnaHRuZXNzVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmRpc3BsYXkuY3RzOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCitpbXBvcnQgYW5kcm9pZC5NYW5pZmVzdDsKK2ltcG9ydCBhbmRyb2lkLmFwcC5VaUF1dG9tYXRpb247CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VJbmZvOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmRpc3BsYXkuQnJpZ2h0bmVzc0NoYW5nZUV2ZW50OworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuZGlzcGxheS5CcmlnaHRuZXNzQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmRpc3BsYXkuRGlzcGxheU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlBvd2VyTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOworaW1wb3J0IGFuZHJvaWQudXRpbC5QYWlyOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworCitpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNjYW5uZXI7CisKK0BNZWRpdW1UZXN0CitAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIEJyaWdodG5lc3NUZXN0IHsKKworICAgIHByaXZhdGUgTWFwPExvbmcsIEJyaWdodG5lc3NDaGFuZ2VFdmVudD4gbUxhc3RSZWFkRXZlbnRzID0gbmV3IEhhc2hNYXA8PigpOworICAgIHByaXZhdGUgRGlzcGxheU1hbmFnZXIgbURpc3BsYXlNYW5hZ2VyOworICAgIHByaXZhdGUgUG93ZXJNYW5hZ2VyLldha2VMb2NrIG1XYWtlTG9jazsKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIG1Db250ZXh0ID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpOworICAgICAgICBtRGlzcGxheU1hbmFnZXIgPSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKERpc3BsYXlNYW5hZ2VyLmNsYXNzKTsKKyAgICAgICAgUG93ZXJNYW5hZ2VyIHBtID0gbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShQb3dlck1hbmFnZXIuY2xhc3MpOworCisgICAgICAgIG1XYWtlTG9jayA9IHBtLm5ld1dha2VMb2NrKAorICAgICAgICAgICAgICAgIFBvd2VyTWFuYWdlci5TQ1JFRU5fQlJJR0hUX1dBS0VfTE9DSyB8IFBvd2VyTWFuYWdlci5BQ1FVSVJFX0NBVVNFU19XQUtFVVAsCisgICAgICAgICAgICAgICAgIkJyaWdodG5lc3NUZXN0Iik7CisgICAgICAgIG1XYWtlTG9jay5hY3F1aXJlKCk7CisgICAgfQorCisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CisgICAgICAgIGlmIChtV2FrZUxvY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgbVdha2VMb2NrLnJlbGVhc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldm9rZVBlcm1pc3Npb24oTWFuaWZlc3QucGVybWlzc2lvbi5DT05GSUdVUkVfRElTUExBWV9CUklHSFRORVNTKTsKKyAgICAgICAgcmV2b2tlUGVybWlzc2lvbihNYW5pZmVzdC5wZXJtaXNzaW9uLkJSSUdIVE5FU1NfU0xJREVSX1VTQUdFKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCcmlnaHRuZXNzU2xpZGVyVHJhY2tpbmcoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpZiAobnVtYmVyT2ZTeXN0ZW1BcHBzV2l0aFBlcm1pc3Npb24oTWFuaWZlc3QucGVybWlzc2lvbi5CUklHSFRORVNTX1NMSURFUl9VU0FHRSkgPT0gMCkgeworICAgICAgICAgICAgLy8gRG9uJ3QgcnVuIGFzIHRoZXJlIGlzIG5vIGFwcCB0aGF0IGhhcyBwZXJtaXNzaW9uIHRvIGFjY2VzcyBzbGlkZXIgdXNhZ2UuCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpbnQgcHJldmlvdXNCcmlnaHRuZXNzID0gZ2V0U3lzdGVtU2V0dGluZyhTZXR0aW5ncy5TeXN0ZW0uU0NSRUVOX0JSSUdIVE5FU1MpOworICAgICAgICBpbnQgcHJldmlvdXNCcmlnaHRuZXNzTW9kZSA9CisgICAgICAgICAgICAgICAgZ2V0U3lzdGVtU2V0dGluZyhTZXR0aW5ncy5TeXN0ZW0uU0NSRUVOX0JSSUdIVE5FU1NfTU9ERSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZXRTeXN0ZW1TZXR0aW5nKFNldHRpbmdzLlN5c3RlbS5TQ1JFRU5fQlJJR0hUTkVTU19NT0RFLAorICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0uU0NSRUVOX0JSSUdIVE5FU1NfTU9ERV9BVVRPTUFUSUMpOworICAgICAgICAgICAgaW50IG1vZGUgPSBnZXRTeXN0ZW1TZXR0aW5nKFNldHRpbmdzLlN5c3RlbS5TQ1JFRU5fQlJJR0hUTkVTU19NT0RFKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhTZXR0aW5ncy5TeXN0ZW0uU0NSRUVOX0JSSUdIVE5FU1NfTU9ERV9BVVRPTUFUSUMsIG1vZGUpOworCisgICAgICAgICAgICBncmFudFBlcm1pc3Npb24oTWFuaWZlc3QucGVybWlzc2lvbi5CUklHSFRORVNTX1NMSURFUl9VU0FHRSk7CisKKyAgICAgICAgICAgIC8vIFNsZWVwIHRvIHdvcmsgYXJvdW5kIGEgaXNzdWUgd2l0aCBldmVudHMgYmVpbmcgcmVjb3JkZWQgaW5jb3JyZWN0bHkKKyAgICAgICAgICAgIC8vIG9uIGRldmljZXMgd2l0aCBzZW5zb3JzIHRoYXQgcmVxdWlyZSBhIHdhcm11cCB0aW1lLgorICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDIwMDApOworCisgICAgICAgICAgICAvLyBTZXR1cCBhbmQgcmVtZW1iZXIgc29tZSBpbml0aWFsIHN0YXRlLgorICAgICAgICAgICAgcmVjb3JkU2xpZGVyRXZlbnRzKCk7CisgICAgICAgICAgICBzZXRTeXN0ZW1TZXR0aW5nKFNldHRpbmdzLlN5c3RlbS5TQ1JFRU5fQlJJR0hUTkVTUywgMjApOworICAgICAgICAgICAgZ2V0TmV3RXZlbnRzKDEpOworCisgICAgICAgICAgICAvLyBVcGRhdGUgYnJpZ2h0bmVzcworICAgICAgICAgICAgc2V0U3lzdGVtU2V0dGluZyhTZXR0aW5ncy5TeXN0ZW0uU0NSRUVOX0JSSUdIVE5FU1MsIDYwKTsKKworICAgICAgICAgICAgLy8gQ2hlY2sgd2UgZ290IGEgc2xpZGVyIGV2ZW50IGZvciB0aGUgY2hhbmdlLgorICAgICAgICAgICAgTGlzdDxCcmlnaHRuZXNzQ2hhbmdlRXZlbnQ+IG5ld0V2ZW50cyA9IGdldE5ld0V2ZW50cygxKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBuZXdFdmVudHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIEJyaWdodG5lc3NDaGFuZ2VFdmVudCBmaXJzdEV2ZW50ID0gbmV3RXZlbnRzLmdldCgwKTsKKyAgICAgICAgICAgIGFzc2VydFZhbGlkTHV4RGF0YShmaXJzdEV2ZW50KTsKKworICAgICAgICAgICAgLy8gVXBkYXRlIGJyaWdodG5lc3MgYWdhaW4KKyAgICAgICAgICAgIHNldFN5c3RlbVNldHRpbmcoU2V0dGluZ3MuU3lzdGVtLlNDUkVFTl9CUklHSFRORVNTLCAyMDApOworCisgICAgICAgICAgICAvLyBDaGVjayB3ZSBnZXQgYSBzZWNvbmQgc2xpZGVyIGV2ZW50LgorICAgICAgICAgICAgbmV3RXZlbnRzID0gZ2V0TmV3RXZlbnRzKDEpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG5ld0V2ZW50cy5zaXplKCkpOworICAgICAgICAgICAgQnJpZ2h0bmVzc0NoYW5nZUV2ZW50IHNlY29uZEV2ZW50ID0gbmV3RXZlbnRzLmdldCgwKTsKKyAgICAgICAgICAgIGFzc2VydFZhbGlkTHV4RGF0YShzZWNvbmRFdmVudCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoc2Vjb25kRXZlbnQubGFzdEJyaWdodG5lc3MsIGZpcnN0RXZlbnQuYnJpZ2h0bmVzcywgMS4wZik7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHNlY29uZEV2ZW50LmlzVXNlclNldEJyaWdodG5lc3MpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiZmFpbGVkICIgKyBzZWNvbmRFdmVudC5icmlnaHRuZXNzICsgIiBub3QgZ3JlYXRlciB0aGFuICIgKworICAgICAgICAgICAgICAgICAgICBmaXJzdEV2ZW50LmJyaWdodG5lc3MsIHNlY29uZEV2ZW50LmJyaWdodG5lc3MgPiBmaXJzdEV2ZW50LmJyaWdodG5lc3MpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgc2V0U3lzdGVtU2V0dGluZyhTZXR0aW5ncy5TeXN0ZW0uU0NSRUVOX0JSSUdIVE5FU1MsIHByZXZpb3VzQnJpZ2h0bmVzcyk7CisgICAgICAgICAgICBzZXRTeXN0ZW1TZXR0aW5nKFNldHRpbmdzLlN5c3RlbS5TQ1JFRU5fQlJJR0hUTkVTU19NT0RFLCBwcmV2aW91c0JyaWdodG5lc3NNb2RlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vVHJhY2tpbmdGb3JNYW51YWxCcmlnaHRuZXNzKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG51bWJlck9mU3lzdGVtQXBwc1dpdGhQZXJtaXNzaW9uKE1hbmlmZXN0LnBlcm1pc3Npb24uQlJJR0hUTkVTU19TTElERVJfVVNBR0UpID09IDApIHsKKyAgICAgICAgICAgIC8vIERvbid0IHJ1biBhcyB0aGVyZSBpcyBubyBhcHAgdGhhdCBoYXMgcGVybWlzc2lvbiB0byBhY2Nlc3Mgc2xpZGVyIHVzYWdlLgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGludCBwcmV2aW91c0JyaWdodG5lc3MgPSBnZXRTeXN0ZW1TZXR0aW5nKFNldHRpbmdzLlN5c3RlbS5TQ1JFRU5fQlJJR0hUTkVTUyk7CisgICAgICAgIGludCBwcmV2aW91c0JyaWdodG5lc3NNb2RlID0KKyAgICAgICAgICAgICAgICBnZXRTeXN0ZW1TZXR0aW5nKFNldHRpbmdzLlN5c3RlbS5TQ1JFRU5fQlJJR0hUTkVTU19NT0RFKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNldFN5c3RlbVNldHRpbmcoU2V0dGluZ3MuU3lzdGVtLlNDUkVFTl9CUklHSFRORVNTX01PREUsCisgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5TQ1JFRU5fQlJJR0hUTkVTU19NT0RFX01BTlVBTCk7CisgICAgICAgICAgICBpbnQgbW9kZSA9IGdldFN5c3RlbVNldHRpbmcoU2V0dGluZ3MuU3lzdGVtLlNDUkVFTl9CUklHSFRORVNTX01PREUpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFNldHRpbmdzLlN5c3RlbS5TQ1JFRU5fQlJJR0hUTkVTU19NT0RFX01BTlVBTCwgbW9kZSk7CisKKyAgICAgICAgICAgIGdyYW50UGVybWlzc2lvbihNYW5pZmVzdC5wZXJtaXNzaW9uLkJSSUdIVE5FU1NfU0xJREVSX1VTQUdFKTsKKworICAgICAgICAgICAgLy8gU2V0dXAgYW5kIHJlbWVtYmVyIHNvbWUgaW5pdGlhbCBzdGF0ZS4KKyAgICAgICAgICAgIHJlY29yZFNsaWRlckV2ZW50cygpOworICAgICAgICAgICAgc2V0U3lzdGVtU2V0dGluZyhTZXR0aW5ncy5TeXN0ZW0uU0NSRUVOX0JSSUdIVE5FU1MsIDIwKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZ2V0TmV3RXZlbnRzKCkuaXNFbXB0eSgpKTsKKworICAgICAgICAgICAgLy8gVGhlbiBjaGFuZ2UgdGhlIGJyaWdodG5lc3MKKyAgICAgICAgICAgIHNldFN5c3RlbVNldHRpbmcoU2V0dGluZ3MuU3lzdGVtLlNDUkVFTl9CUklHSFRORVNTLCA4MCk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMjAwKTsKKyAgICAgICAgICAgIC8vIFRoZXJlIHNob3VsZG4ndCBiZSBhbnkgZXZlbnRzLgorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShnZXROZXdFdmVudHMoKS5pc0VtcHR5KCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgc2V0U3lzdGVtU2V0dGluZyhTZXR0aW5ncy5TeXN0ZW0uU0NSRUVOX0JSSUdIVE5FU1MsIHByZXZpb3VzQnJpZ2h0bmVzcyk7CisgICAgICAgICAgICBzZXRTeXN0ZW1TZXR0aW5nKFNldHRpbmdzLlN5c3RlbS5TQ1JFRU5fQlJJR0hUTkVTU19NT0RFLCBwcmV2aW91c0JyaWdodG5lc3NNb2RlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNsaWRlclVzYWdlUGVybWlzc2lvbigpIHsKKyAgICAgICAgcmV2b2tlUGVybWlzc2lvbihNYW5pZmVzdC5wZXJtaXNzaW9uLkJSSUdIVE5FU1NfU0xJREVSX1VTQUdFKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbURpc3BsYXlNYW5hZ2VyLmdldEJyaWdodG5lc3NFdmVudHMoKTsKKyAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gRXhwZWN0ZWQKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBmYWlsKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uZmlndXJlQnJpZ2h0bmVzc1Blcm1pc3Npb24oKSB7CisgICAgICAgIHJldm9rZVBlcm1pc3Npb24oTWFuaWZlc3QucGVybWlzc2lvbi5DT05GSUdVUkVfRElTUExBWV9CUklHSFRORVNTKTsKKworICAgICAgICBCcmlnaHRuZXNzQ29uZmlndXJhdGlvbiBjb25maWcgPQorICAgICAgICAgICAgbmV3IEJyaWdodG5lc3NDb25maWd1cmF0aW9uLkJ1aWxkZXIoCisgICAgICAgICAgICAgICAgICAgIG5ldyBmbG9hdFtdezAuMGYsIDEwMDAuMGZ9LG5ldyBmbG9hdFtdezIwLjBmLCA1MDAuMGZ9KQorICAgICAgICAgICAgICAgIC5zZXREZXNjcmlwdGlvbigic29tZSB0ZXN0IikuYnVpbGQoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbURpc3BsYXlNYW5hZ2VyLnNldEJyaWdodG5lc3NDb25maWd1cmF0aW9uKGNvbmZpZyk7CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIEV4cGVjdGVkCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZmFpbCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNldEdldFNpbXBsZUN1cnZlKCkgeworICAgICAgICBpZiAobnVtYmVyT2ZTeXN0ZW1BcHBzV2l0aFBlcm1pc3Npb24oCisgICAgICAgICAgICAgICAgICAgIE1hbmlmZXN0LnBlcm1pc3Npb24uQ09ORklHVVJFX0RJU1BMQVlfQlJJR0hUTkVTUykgPT0gMCkgeworICAgICAgICAgICAgLy8gRG9uJ3QgcnVuIGFzIHRoZXJlIGlzIG5vIGFwcCB0aGF0IGhhcyBwZXJtaXNzaW9uIHRvIHB1c2ggY3VydmVzLgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZ3JhbnRQZXJtaXNzaW9uKE1hbmlmZXN0LnBlcm1pc3Npb24uQ09ORklHVVJFX0RJU1BMQVlfQlJJR0hUTkVTUyk7CisKKyAgICAgICAgQnJpZ2h0bmVzc0NvbmZpZ3VyYXRpb24gY29uZmlnID0KKyAgICAgICAgICAgICAgICBuZXcgQnJpZ2h0bmVzc0NvbmZpZ3VyYXRpb24uQnVpbGRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBmbG9hdFtdezAuMGYsIDEwMDAuMGZ9LG5ldyBmbG9hdFtdezIwLjBmLCA1MDAuMGZ9KQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldERlc2NyaXB0aW9uKCJzb21lIHRlc3QiKS5idWlsZCgpOworICAgICAgICBtRGlzcGxheU1hbmFnZXIuc2V0QnJpZ2h0bmVzc0NvbmZpZ3VyYXRpb24oY29uZmlnKTsKKyAgICAgICAgQnJpZ2h0bmVzc0NvbmZpZ3VyYXRpb24gcmV0dXJuZWRDb25maWcgPSBtRGlzcGxheU1hbmFnZXIuZ2V0QnJpZ2h0bmVzc0NvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbmZpZywgcmV0dXJuZWRDb25maWcpOworCisgICAgICAgIC8vIEFmdGVyIGNsZWFyaW5nIHRoZSBjdXJ2ZSB3ZSBzaG91bGQgZ2V0IGJhY2sgdGhlIGRlZmF1bHQgY3VydmUuCisgICAgICAgIG1EaXNwbGF5TWFuYWdlci5zZXRCcmlnaHRuZXNzQ29uZmlndXJhdGlvbihudWxsKTsKKyAgICAgICAgcmV0dXJuZWRDb25maWcgPSBtRGlzcGxheU1hbmFnZXIuZ2V0QnJpZ2h0bmVzc0NvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EaXNwbGF5TWFuYWdlci5nZXREZWZhdWx0QnJpZ2h0bmVzc0NvbmZpZ3VyYXRpb24oKSwgcmV0dXJuZWRDb25maWcpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRDdXJ2ZSgpICB7CisgICAgICAgIGlmIChudW1iZXJPZlN5c3RlbUFwcHNXaXRoUGVybWlzc2lvbihNYW5pZmVzdC5wZXJtaXNzaW9uLkJSSUdIVE5FU1NfU0xJREVSX1VTQUdFKSA9PSAwKSB7CisgICAgICAgICAgICAvLyBEb24ndCBydW4gYXMgdGhlcmUgaXMgbm8gYXBwIHRoYXQgaGFzIHBlcm1pc3Npb24gdG8gcHVzaCBjdXJ2ZXMuCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBncmFudFBlcm1pc3Npb24oTWFuaWZlc3QucGVybWlzc2lvbi5DT05GSUdVUkVfRElTUExBWV9CUklHSFRORVNTKTsKKworICAgICAgICBCcmlnaHRuZXNzQ29uZmlndXJhdGlvbiBkZWZhdWx0Q29uZmlnID0gbURpc3BsYXlNYW5hZ2VyLmdldERlZmF1bHRCcmlnaHRuZXNzQ29uZmlndXJhdGlvbigpOworICAgICAgICAvLyBNdXN0IHByb3ZpZGUgYSBkZWZhdWx0IGNvbmZpZyBpZiBhbiBhcHAgd2l0aCBDT05GSUdVUkVfRElTUExBWV9CUklHSFRORVNTIGV4aXN0cy4KKyAgICAgICAgYXNzZXJ0Tm90TnVsbChkZWZhdWx0Q29uZmlnKTsKKworICAgICAgICBQYWlyPGZsb2F0W10sIGZsb2F0W10+IGN1cnZlID0gZGVmYXVsdENvbmZpZy5nZXRDdXJ2ZSgpOworICAgICAgICBhc3NlcnRUcnVlKGN1cnZlLmZpcnN0Lmxlbmd0aCA+IDApOworICAgICAgICBhc3NlcnRFcXVhbHMoY3VydmUuZmlyc3QubGVuZ3RoLCBjdXJ2ZS5zZWNvbmQubGVuZ3RoKTsKKyAgICAgICAgYXNzZXJ0SW5SYW5nZShjdXJ2ZS5maXJzdCwgMCwgRmxvYXQuTUFYX1ZBTFVFKTsKKyAgICAgICAgYXNzZXJ0SW5SYW5nZShjdXJ2ZS5zZWNvbmQsIDAsIEZsb2F0Lk1BWF9WQUxVRSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLjAsIGN1cnZlLmZpcnN0WzBdLCAwLjEpOworICAgICAgICBhc3NlcnRNb25vdG9uaWMoY3VydmUuZmlyc3QsIHRydWUgLypzdHJpY3RseSBpbmNyZWFzaW5nKi8sICJsdXgiKTsKKyAgICAgICAgYXNzZXJ0TW9ub3RvbmljKGN1cnZlLnNlY29uZCwgZmFsc2UgLypzdHJpY3RseSBpbmNyZWFzaW5nKi8sICJuaXRzIik7CisgICAgfQorCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTbGlkZXJFdmVudHNSZWZsZWN0Q3VydmVzKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG51bWJlck9mU3lzdGVtQXBwc1dpdGhQZXJtaXNzaW9uKE1hbmlmZXN0LnBlcm1pc3Npb24uQlJJR0hUTkVTU19TTElERVJfVVNBR0UpID09IDApIHsKKyAgICAgICAgICAgIC8vIERvbid0IHJ1biBhcyB0aGVyZSBpcyBubyBhcHAgdGhhdCBoYXMgcGVybWlzc2lvbiB0byBhY2Nlc3Mgc2xpZGVyIHVzYWdlLgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChudW1iZXJPZlN5c3RlbUFwcHNXaXRoUGVybWlzc2lvbigKKyAgICAgICAgICAgICAgICAgICAgTWFuaWZlc3QucGVybWlzc2lvbi5DT05GSUdVUkVfRElTUExBWV9CUklHSFRORVNTKSA9PSAwKSB7CisgICAgICAgICAgICAvLyBEb24ndCBydW4gYXMgdGhlcmUgaXMgbm8gYXBwIHRoYXQgaGFzIHBlcm1pc3Npb24gdG8gcHVzaCBjdXJ2ZXMuCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBCcmlnaHRuZXNzQ29uZmlndXJhdGlvbiBjb25maWcgPQorICAgICAgICAgICAgICAgIG5ldyBCcmlnaHRuZXNzQ29uZmlndXJhdGlvbi5CdWlsZGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGZsb2F0W117MC4wZiwgMTAwMDAuMGZ9LG5ldyBmbG9hdFtdezE1LjBmLCA0MDAuMGZ9KQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldERlc2NyaXB0aW9uKCJtb2RlbDo4IikuYnVpbGQoKTsKKworICAgICAgICBpbnQgcHJldmlvdXNCcmlnaHRuZXNzID0gZ2V0U3lzdGVtU2V0dGluZyhTZXR0aW5ncy5TeXN0ZW0uU0NSRUVOX0JSSUdIVE5FU1MpOworICAgICAgICBpbnQgcHJldmlvdXNCcmlnaHRuZXNzTW9kZSA9CisgICAgICAgICAgICAgICAgZ2V0U3lzdGVtU2V0dGluZyhTZXR0aW5ncy5TeXN0ZW0uU0NSRUVOX0JSSUdIVE5FU1NfTU9ERSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZXRTeXN0ZW1TZXR0aW5nKFNldHRpbmdzLlN5c3RlbS5TQ1JFRU5fQlJJR0hUTkVTU19NT0RFLAorICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0uU0NSRUVOX0JSSUdIVE5FU1NfTU9ERV9BVVRPTUFUSUMpOworICAgICAgICAgICAgaW50IG1vZGUgPSBnZXRTeXN0ZW1TZXR0aW5nKFNldHRpbmdzLlN5c3RlbS5TQ1JFRU5fQlJJR0hUTkVTU19NT0RFKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhTZXR0aW5ncy5TeXN0ZW0uU0NSRUVOX0JSSUdIVE5FU1NfTU9ERV9BVVRPTUFUSUMsIG1vZGUpOworCisgICAgICAgICAgICBncmFudFBlcm1pc3Npb24oTWFuaWZlc3QucGVybWlzc2lvbi5CUklHSFRORVNTX1NMSURFUl9VU0FHRSk7CisgICAgICAgICAgICBncmFudFBlcm1pc3Npb24oTWFuaWZlc3QucGVybWlzc2lvbi5DT05GSUdVUkVfRElTUExBWV9CUklHSFRORVNTKTsKKworICAgICAgICAgICAgLy8gU2V0dXAgYW5kIHJlbWVtYmVyIHNvbWUgaW5pdGlhbCBzdGF0ZS4KKyAgICAgICAgICAgIHJlY29yZFNsaWRlckV2ZW50cygpOworICAgICAgICAgICAgc2V0U3lzdGVtU2V0dGluZyhTZXR0aW5ncy5TeXN0ZW0uU0NSRUVOX0JSSUdIVE5FU1MsIDIwKTsKKyAgICAgICAgICAgIGdldE5ld0V2ZW50cygxKTsKKworICAgICAgICAgICAgLy8gVXBkYXRlIGJyaWdodG5lc3Mgd2hpbGUgd2UgaGF2ZSBhIGN1c3RvbSBjdXJ2ZS4KKyAgICAgICAgICAgIG1EaXNwbGF5TWFuYWdlci5zZXRCcmlnaHRuZXNzQ29uZmlndXJhdGlvbihjb25maWcpOworICAgICAgICAgICAgc2V0U3lzdGVtU2V0dGluZyhTZXR0aW5ncy5TeXN0ZW0uU0NSRUVOX0JSSUdIVE5FU1MsIDYwKTsKKworICAgICAgICAgICAgLy8gQ2hlY2sgd2UgZ290IGEgc2xpZGVyIGV2ZW50IGZvciB0aGUgY2hhbmdlLgorICAgICAgICAgICAgTGlzdDxCcmlnaHRuZXNzQ2hhbmdlRXZlbnQ+IG5ld0V2ZW50cyA9IGdldE5ld0V2ZW50cygxKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBuZXdFdmVudHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIEJyaWdodG5lc3NDaGFuZ2VFdmVudCBmaXJzdEV2ZW50ID0gbmV3RXZlbnRzLmdldCgwKTsKKyAgICAgICAgICAgIGFzc2VydFZhbGlkTHV4RGF0YShmaXJzdEV2ZW50KTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGZpcnN0RXZlbnQuaXNEZWZhdWx0QnJpZ2h0bmVzc0NvbmZpZyk7CisKKyAgICAgICAgICAgIC8vIFVwZGF0ZSBicmlnaHRuZXNzIGFnYWluIG5vdyB3aXRoIGRlZmF1bHQgY3VydmUuCisgICAgICAgICAgICBtRGlzcGxheU1hbmFnZXIuc2V0QnJpZ2h0bmVzc0NvbmZpZ3VyYXRpb24obnVsbCk7CisgICAgICAgICAgICBzZXRTeXN0ZW1TZXR0aW5nKFNldHRpbmdzLlN5c3RlbS5TQ1JFRU5fQlJJR0hUTkVTUywgMjAwKTsKKworICAgICAgICAgICAgLy8gQ2hlY2sgd2UgZ2V0IGEgc2Vjb25kIHNsaWRlciBldmVudC4KKyAgICAgICAgICAgIG5ld0V2ZW50cyA9IGdldE5ld0V2ZW50cygxKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBuZXdFdmVudHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIEJyaWdodG5lc3NDaGFuZ2VFdmVudCBzZWNvbmRFdmVudCA9IG5ld0V2ZW50cy5nZXQoMCk7CisgICAgICAgICAgICBhc3NlcnRWYWxpZEx1eERhdGEoc2Vjb25kRXZlbnQpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzZWNvbmRFdmVudC5pc0RlZmF1bHRCcmlnaHRuZXNzQ29uZmlnKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHNldFN5c3RlbVNldHRpbmcoU2V0dGluZ3MuU3lzdGVtLlNDUkVFTl9CUklHSFRORVNTLCBwcmV2aW91c0JyaWdodG5lc3MpOworICAgICAgICAgICAgc2V0U3lzdGVtU2V0dGluZyhTZXR0aW5ncy5TeXN0ZW0uU0NSRUVOX0JSSUdIVE5FU1NfTU9ERSwgcHJldmlvdXNCcmlnaHRuZXNzTW9kZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBdE1vc3RPbmVBcHBIb2xkc0JyaWdodG5lc3NDb25maWd1cmF0aW9uUGVybWlzc2lvbigpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShudW1iZXJPZlN5c3RlbUFwcHNXaXRoUGVybWlzc2lvbigKKyAgICAgICAgICAgICAgICAgICAgTWFuaWZlc3QucGVybWlzc2lvbi5DT05GSUdVUkVfRElTUExBWV9CUklHSFRORVNTKSA8IDIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRWYWxpZEx1eERhdGEoQnJpZ2h0bmVzc0NoYW5nZUV2ZW50IGV2ZW50KSB7CisgICAgICAgIGFzc2VydE5vdE51bGwoZXZlbnQubHV4VGltZXN0YW1wcyk7CisgICAgICAgIGFzc2VydE5vdE51bGwoZXZlbnQubHV4VmFsdWVzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShldmVudC5sdXhUaW1lc3RhbXBzLmxlbmd0aCA+IDApOworICAgICAgICBhc3NlcnRFcXVhbHMoZXZlbnQubHV4VmFsdWVzLmxlbmd0aCwgZXZlbnQubHV4VGltZXN0YW1wcy5sZW5ndGgpOworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGV2ZW50Lmx1eFRpbWVzdGFtcHMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZXZlbnQubHV4VGltZXN0YW1wc1tpIC0gMV0gPD0gZXZlbnQubHV4VGltZXN0YW1wc1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBldmVudC5sdXhWYWx1ZXMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZXZlbnQubHV4VmFsdWVzW2ldID49IDAuMGYpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShldmVudC5sdXhWYWx1ZXNbaV0gPD0gRmxvYXQuTUFYX1ZBTFVFKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKEZsb2F0LmlzTmFOKGV2ZW50Lmx1eFZhbHVlc1tpXSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHN5c3RlbSBhcHBzIHdpdGggdGhlIGdpdmVuIHBlcm1pc3Npb24uCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgbnVtYmVyT2ZTeXN0ZW1BcHBzV2l0aFBlcm1pc3Npb24oU3RyaW5nIHBlcm1pc3Npb24pIHsKKyAgICAgICAgTGlzdDxQYWNrYWdlSW5mbz4gcGFja2FnZXMgPSBtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpLmdldFBhY2thZ2VzSG9sZGluZ1Blcm1pc3Npb25zKAorICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7cGVybWlzc2lvbn0sIFBhY2thZ2VNYW5hZ2VyLk1BVENIX1NZU1RFTV9PTkxZKTsKKyAgICAgICAgcmV0dXJuIHBhY2thZ2VzLnNpemUoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIExpc3Q8QnJpZ2h0bmVzc0NoYW5nZUV2ZW50PiBnZXROZXdFdmVudHMoaW50IGV4cGVjdGVkKQorICAgICAgICAgICAgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgTGlzdDxCcmlnaHRuZXNzQ2hhbmdlRXZlbnQ+IG5ld0V2ZW50cyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgbmV3RXZlbnRzLnNpemUoKSA8IGV4cGVjdGVkICYmIGkgPCAyMDsgKytpKSB7CisgICAgICAgICAgICBpZiAoaSAhPSAwKSB7CisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuZXdFdmVudHMuYWRkQWxsKGdldE5ld0V2ZW50cygpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3RXZlbnRzOworICAgIH0KKworICAgIHByaXZhdGUgTGlzdDxCcmlnaHRuZXNzQ2hhbmdlRXZlbnQ+IGdldE5ld0V2ZW50cygpIHsKKyAgICAgICAgTGlzdDxCcmlnaHRuZXNzQ2hhbmdlRXZlbnQ+IG5ld0V2ZW50cyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBMaXN0PEJyaWdodG5lc3NDaGFuZ2VFdmVudD4gZXZlbnRzID0gbURpc3BsYXlNYW5hZ2VyLmdldEJyaWdodG5lc3NFdmVudHMoKTsKKyAgICAgICAgZm9yIChCcmlnaHRuZXNzQ2hhbmdlRXZlbnQgZXZlbnQgOiBldmVudHMpIHsKKyAgICAgICAgICAgIGlmICghbUxhc3RSZWFkRXZlbnRzLmNvbnRhaW5zS2V5KGV2ZW50LnRpbWVTdGFtcCkpIHsKKyAgICAgICAgICAgICAgICBuZXdFdmVudHMuYWRkKGV2ZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtTGFzdFJlYWRFdmVudHMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIGZvciAoQnJpZ2h0bmVzc0NoYW5nZUV2ZW50IGV2ZW50IDogZXZlbnRzKSB7CisgICAgICAgICAgICBtTGFzdFJlYWRFdmVudHMucHV0KGV2ZW50LnRpbWVTdGFtcCwgZXZlbnQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXdFdmVudHM7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlY29yZFNsaWRlckV2ZW50cygpIHsKKyAgICAgICAgbUxhc3RSZWFkRXZlbnRzID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBMaXN0PEJyaWdodG5lc3NDaGFuZ2VFdmVudD4gZXZlbnRzQmVmb3JlID0gbURpc3BsYXlNYW5hZ2VyLmdldEJyaWdodG5lc3NFdmVudHMoKTsKKyAgICAgICAgZm9yIChCcmlnaHRuZXNzQ2hhbmdlRXZlbnQgZXZlbnQ6IGV2ZW50c0JlZm9yZSkgeworICAgICAgICAgICAgbUxhc3RSZWFkRXZlbnRzLnB1dChldmVudC50aW1lU3RhbXAsIGV2ZW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgaW50IGdldFN5c3RlbVNldHRpbmcoU3RyaW5nIHNldHRpbmcpIHsKKyAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQocnVuU2hlbGxDb21tYW5kKCJzZXR0aW5ncyBnZXQgc3lzdGVtICIgKyBzZXR0aW5nKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldFN5c3RlbVNldHRpbmcoU3RyaW5nIHNldHRpbmcsIGludCB2YWx1ZSkgeworICAgICAgICBydW5TaGVsbENvbW1hbmQoInNldHRpbmdzIHB1dCBzeXN0ZW0gIiArIHNldHRpbmcgKyAiICIgKyBJbnRlZ2VyLnRvU3RyaW5nKHZhbHVlKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGdyYW50UGVybWlzc2lvbihTdHJpbmcgcGVybWlzc2lvbikgeworICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKS5nZXRVaUF1dG9tYXRpb24oKQorICAgICAgICAgICAgICAgIC5ncmFudFJ1bnRpbWVQZXJtaXNzaW9uKG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCksIHBlcm1pc3Npb24pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZXZva2VQZXJtaXNzaW9uKFN0cmluZyBwZXJtaXNzaW9uKSB7CisgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLmdldFVpQXV0b21hdGlvbigpCisgICAgICAgICAgICAgICAgLnJldm9rZVJ1bnRpbWVQZXJtaXNzaW9uKG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCksIHBlcm1pc3Npb24pOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIHJ1blNoZWxsQ29tbWFuZChTdHJpbmcgY21kKSB7CisgICAgICAgIFVpQXV0b21hdGlvbiBhdXRvbWF0aW9uID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VWlBdXRvbWF0aW9uKCk7CisgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIG91dHB1dCA9IGF1dG9tYXRpb24uZXhlY3V0ZVNoZWxsQ29tbWFuZChjbWQpOworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gY29udmVydEZpbGVEZXNjcmlwdG9yVG9TdHJpbmcob3V0cHV0LmdldEZpbGVEZXNjcmlwdG9yKCkpOworICAgICAgICByZXR1cm4gcmVzdWx0LnRyaW0oKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBjb252ZXJ0RmlsZURlc2NyaXB0b3JUb1N0cmluZyhGaWxlRGVzY3JpcHRvciBkZXNjKSB7CisgICAgICAgIHRyeSAoU2Nhbm5lciBzID0gbmV3IFNjYW5uZXIobmV3IEZpbGVJbnB1dFN0cmVhbShkZXNjKSkudXNlRGVsaW1pdGVyKCJcXFoiKSkgeworICAgICAgICAgICAgcmV0dXJuIHMuaGFzTmV4dCgpID8gcy5uZXh0KCkgOiAiIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0SW5SYW5nZShmbG9hdFtdIHZhbHVlcywgZmxvYXQgbWluLCBmbG9hdCBtYXgpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKEZsb2F0LmlzTmFOKHZhbHVlc1tpXSkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh2YWx1ZXNbaV0gPj0gbWluKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUodmFsdWVzW2ldIDw9IG1heCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydE1vbm90b25pYyhmbG9hdFtdIHZhbHVlcywgYm9vbGVhbiBzdHJpY3RseUluY3JlYXNpbmcsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoIDw9IDEpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBmbG9hdCBwcmV2ID0gdmFsdWVzWzBdOworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKHByZXYgPiB2YWx1ZXNbaV0gfHwgKHByZXYgPT0gdmFsdWVzW2ldICYmIHN0cmljdGx5SW5jcmVhc2luZykpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgY29uZGl0aW9uID0gc3RyaWN0bHlJbmNyZWFzaW5nID8gInN0cmljdGx5IGluY3JlYXNpbmciIDogIm1vbm90b25pYyI7CisgICAgICAgICAgICAgICAgZmFpbChuYW1lICsgIiB2YWx1ZXMgbXVzdCBiZSAiICsgY29uZGl0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByZXYgPSB2YWx1ZXNbaV07CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9kaXNwbGF5L3NyYy9hbmRyb2lkL2Rpc3BsYXkvY3RzL0Rpc3BsYXlUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9kaXNwbGF5L3NyYy9hbmRyb2lkL2Rpc3BsYXkvY3RzL0Rpc3BsYXlUZXN0LmphdmEKaW5kZXggMWEyNzUzYi4uY2I4ZTdjZCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZGlzcGxheS9zcmMvYW5kcm9pZC9kaXNwbGF5L2N0cy9EaXNwbGF5VGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2Rpc3BsYXkvc3JjL2FuZHJvaWQvZGlzcGxheS9jdHMvRGlzcGxheVRlc3QuamF2YQpAQCAtMTYsMTIgKzE2LDExIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5kaXNwbGF5LmN0czsKIAotaW1wb3J0IG9yZy5qdW5pdC5SdWxlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7CiAKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKIGltcG9ydCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb247CiBpbXBvcnQgYW5kcm9pZC5hcHAuUHJlc2VudGF0aW9uOwotaW1wb3J0IGFuZHJvaWQuYXBwLlVpQXV0b21hdGlvbjsKIGltcG9ydCBhbmRyb2lkLmFwcC5VaU1vZGVNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CkBAIC0zNiw4ICszNSw2IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUHJlc3VibWl0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKIGltcG9ydCBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdENhc2U7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOwogaW1wb3J0IGFuZHJvaWQudmlldy5EaXNwbGF5OwpAQCAtNDYsMTMgKzQzLDI0IEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKKwogaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS51dGlsLlNjYW5uZXI7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiAKLXB1YmxpYyBjbGFzcyBEaXNwbGF5VGVzdCBleHRlbmRzIEluc3RydW1lbnRhdGlvblRlc3RDYXNlIHsKK0BSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgRGlzcGxheVRlc3QgewogICAgIC8vIFRoZSBDVFMgcGFja2FnZSBicmluZ3MgdXAgYW4gb3ZlcmxheSBkaXNwbGF5IG9uIHRoZSB0YXJnZXQgZGV2aWNlIChzZWUgQW5kcm9pZFRlc3QueG1sKS4KICAgICAvLyBUaGUgb3ZlcmxheSBkaXNwbGF5IHBhcmFtZXRlcnMgbXVzdCBtYXRjaCB0aGUgb25lcyBkZWZpbmVkIHRoZXJlIHdoaWNoIGFyZQogICAgIC8vIDE4MXgxNjEvMjE0ICh3eGgvZHBpKS4gIEl0IG9ubHkgbWF0dGVycyB0aGF0IHRoZXNlIHZhbHVlcyBhcmUgZGlmZmVyZW50IGZyb20gYW55IHJlYWwKQEAgLTg0LDE4ICs5MiwxNyBAQAogICAgICAgICAgICAgbmV3IEFjdGl2aXR5VGVzdFJ1bGU8PihEaXNwbGF5VGVzdEFjdGl2aXR5LmNsYXNzLAogICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBpbml0aWFsVG91Y2hNb2RlICovLCBmYWxzZSAvKiBsYXVuY2hBY3Rpdml0eSAqLyk7CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBtU2NyZWVuT25BY3Rpdml0eSA9IGxhdW5jaFNjcmVlbk9uQWN0aXZpdHkoKTsKLSAgICAgICAgbUNvbnRleHQgPSBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRDb250ZXh0KCk7CisgICAgICAgIG1Db250ZXh0ID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0Q29udGV4dCgpOwogICAgICAgICBtRGlzcGxheU1hbmFnZXIgPSAoRGlzcGxheU1hbmFnZXIpbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkRJU1BMQVlfU0VSVklDRSk7CiAgICAgICAgIG1XaW5kb3dNYW5hZ2VyID0gKFdpbmRvd01hbmFnZXIpbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LldJTkRPV19TRVJWSUNFKTsKICAgICAgICAgbVVpTW9kZU1hbmFnZXIgPSAoVWlNb2RlTWFuYWdlciltQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuVUlfTU9ERV9TRVJWSUNFKTsKICAgICB9CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChtU2NyZWVuT25BY3Rpdml0eSAhPSBudWxsKSB7CiAgICAgICAgICAgICBtU2NyZWVuT25BY3Rpdml0eS5maW5pc2goKTsKICAgICAgICAgfQpAQCAtMTA0LDIwICsxMTEsMjEgQEAKICAgICBwcml2YXRlIHZvaWQgZW5hYmxlQXBwT3BzKCkgewogICAgICAgICBTdHJpbmdCdWlsZGVyIGNtZCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAgICAgICAgIGNtZC5hcHBlbmQoImFwcG9wcyBzZXQgIik7Ci0gICAgICAgIGNtZC5hcHBlbmQoZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VOYW1lKCkpOworICAgICAgICBjbWQuYXBwZW5kKEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLmdldENvbnRleHQoKS5nZXRQYWNrYWdlTmFtZSgpKTsKICAgICAgICAgY21kLmFwcGVuZCgiIGFuZHJvaWQ6c3lzdGVtX2FsZXJ0X3dpbmRvdyBhbGxvdyIpOwotICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRVaUF1dG9tYXRpb24oKS5leGVjdXRlU2hlbGxDb21tYW5kKGNtZC50b1N0cmluZygpKTsKKyAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VWlBdXRvbWF0aW9uKCkKKyAgICAgICAgICAgICAgICAuZXhlY3V0ZVNoZWxsQ29tbWFuZChjbWQudG9TdHJpbmcoKSk7CiAKICAgICAgICAgU3RyaW5nQnVpbGRlciBxdWVyeSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAgICAgICAgIHF1ZXJ5LmFwcGVuZCgiYXBwb3BzIGdldCAiKTsKLSAgICAgICAgcXVlcnkuYXBwZW5kKGdldEluc3RydW1lbnRhdGlvbigpLmdldENvbnRleHQoKS5nZXRQYWNrYWdlTmFtZSgpKTsKKyAgICAgICAgcXVlcnkuYXBwZW5kKEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLmdldENvbnRleHQoKS5nZXRQYWNrYWdlTmFtZSgpKTsKICAgICAgICAgcXVlcnkuYXBwZW5kKCIgYW5kcm9pZDpzeXN0ZW1fYWxlcnRfd2luZG93Iik7CiAgICAgICAgIFN0cmluZyBxdWVyeVN0ciA9IHF1ZXJ5LnRvU3RyaW5nKCk7CiAKICAgICAgICAgU3RyaW5nIHJlc3VsdCA9ICJObyBvcGVyYXRpb25zLiI7CiAgICAgICAgIHdoaWxlIChyZXN1bHQuY29udGFpbnMoIk5vIG9wZXJhdGlvbnMiKSkgewotICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgcGZkID0gZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VWlBdXRvbWF0aW9uKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZCgKLSAgICAgICAgICAgICAgICAgICAgcXVlcnlTdHIpOworICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgcGZkID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkKKyAgICAgICAgICAgICAgICAgICAgLmdldFVpQXV0b21hdGlvbigpLmV4ZWN1dGVTaGVsbENvbW1hbmQocXVlcnlTdHIpOwogICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHBmZC5nZXRGaWxlRGVzY3JpcHRvcigpKTsKICAgICAgICAgICAgIHJlc3VsdCA9IGNvbnZlcnRTdHJlYW1Ub1N0cmluZyhpbnB1dFN0cmVhbSk7CiAgICAgICAgIH0KQEAgLTE0Nyw2ICsxNTUsNyBAQAogICAgIC8qKgogICAgICAqIFZlcmlmeSB0aGF0IHRoZSBnZXREaXNwbGF5cyBtZXRob2QgcmV0dXJucyBib3RoIGEgZGVmYXVsdCBhbmQgYW4gb3ZlcmxheSBkaXNwbGF5LgogICAgICAqLworICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEdldERpc3BsYXlzKCkgewogICAgICAgICBEaXNwbGF5W10gZGlzcGxheXMgPSBtRGlzcGxheU1hbmFnZXIuZ2V0RGlzcGxheXMoKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChkaXNwbGF5cyk7CkBAIC0xNjksNiArMTc4LDcgQEAKICAgICAgKiBWZXJpZnkgdGhhdCB0aGUgV2luZG93TWFuYWdlciByZXR1cm5zIHRoZSBkZWZhdWx0IGRpc3BsYXkuCiAgICAgICovCiAgICAgQFByZXN1Ym1pdAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHREaXNwbGF5KCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoRGlzcGxheS5ERUZBVUxUX0RJU1BMQVksIG1XaW5kb3dNYW5hZ2VyLmdldERlZmF1bHREaXNwbGF5KCkuZ2V0RGlzcGxheUlkKCkpOwogICAgIH0KQEAgLTE3Niw2ICsxODYsNyBAQAogICAgIC8qKgogICAgICAqIFZlcmlmeSBkZWZhdWx0IGRpc3BsYXkncyBIRFIgY2FwYWJpbGl0eS4KICAgICAgKi8KKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0RGlzcGxheUhkckNhcGFiaWxpdHkoKSB7CiAgICAgICAgIERpc3BsYXkgZGlzcGxheSA9IG1EaXNwbGF5TWFuYWdlci5nZXREaXNwbGF5KERpc3BsYXkuREVGQVVMVF9ESVNQTEFZKTsKICAgICAgICAgSGRyQ2FwYWJpbGl0aWVzIGNhcCA9IGRpc3BsYXkuZ2V0SGRyQ2FwYWJpbGl0aWVzKCk7CkBAIC0xOTYsNiArMjA3LDcgQEAKICAgICAvKioKICAgICAgKiBWZXJpZnkgdGhhdCB0aGVyZSBpcyBhIHNlY29uZGFyeSBkaXNwbGF5LgogICAgICAqLworICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFNlY29uZGFyeURpc3BsYXkoKSB7CiAgICAgICAgIERpc3BsYXkgZGlzcGxheSA9IGdldFNlY29uZGFyeURpc3BsYXkobURpc3BsYXlNYW5hZ2VyLmdldERpc3BsYXlzKCkpOwogICAgICAgICBhc3NlcnROb3ROdWxsKGRpc3BsYXkpOwpAQCAtMjA1LDYgKzIxNyw3IEBACiAgICAgLyoqCiAgICAgICogVGVzdCB0aGUgcHJvcGVydGllcyBvZiB0aGUgc2Vjb25kYXJ5IERpc3BsYXkuCiAgICAgICovCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RGlzcGxheUF0dHJzKCkgewogICAgICAgICBEaXNwbGF5IGRpc3BsYXkgPSBnZXRTZWNvbmRhcnlEaXNwbGF5KG1EaXNwbGF5TWFuYWdlci5nZXREaXNwbGF5cygpKTsKIApAQCAtMjMwLDYgKzI0Myw3IEBACiAgICAgLyoqCiAgICAgICogVGVzdCB0aGF0IHRoZSBnZXRNZXRyaWNzIG1ldGhvZCBmaWxscyBpbiBjb3JyZWN0IHZhbHVlcy4KICAgICAgKi8KKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRNZXRyaWNzKCkgewogICAgICAgICB0ZXN0R2V0TWV0cmljcyhtRGlzcGxheU1hbmFnZXIpOwogICAgIH0KQEAgLTIzNyw2ICsyNTEsNyBAQAogICAgIC8qKgogICAgICAqIFRlc3RzIGdldHRpbmcgbWV0cmljcyBmcm9tIHRoZSBBY3Rpdml0eSBjb250ZXh0LgogICAgICAqLworICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEFjdGl2aXR5Q29udGV4dEdldE1ldHJpY3MoKSB7CiAgICAgICAgIGZpbmFsIEFjdGl2aXR5IGFjdGl2aXR5ID0gbGF1bmNoQWN0aXZpdHkobURpc3BsYXlUZXN0QWN0aXZpdHkpOwogICAgICAgICBmaW5hbCBEaXNwbGF5TWFuYWdlciBkbSA9CkBAIC0yNjQsMTMgKzI3OSwxNCBAQAogICAgICAgICAgICAgICAgICYmIG91dE1ldHJpY3Muc2NhbGVkRGVuc2l0eSA8PSBTQ0FMRV9ERU5TSVRZX1VQUEVSX0JPVU5EKTsKIAogICAgICAgICBhc3NlcnRFcXVhbHMoU0VDT05EQVJZX0RJU1BMQVlfRFBJLCBvdXRNZXRyaWNzLmRlbnNpdHlEcGkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoKGZsb2F0KVNFQ09OREFSWV9ESVNQTEFZX0RQSSwgb3V0TWV0cmljcy54ZHBpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKChmbG9hdClTRUNPTkRBUllfRElTUExBWV9EUEksIG91dE1ldHJpY3MueWRwaSk7CisgICAgICAgIGFzc2VydEVxdWFscygoZmxvYXQpU0VDT05EQVJZX0RJU1BMQVlfRFBJLCBvdXRNZXRyaWNzLnhkcGksIDAuMDAwMWYpOworICAgICAgICBhc3NlcnRFcXVhbHMoKGZsb2F0KVNFQ09OREFSWV9ESVNQTEFZX0RQSSwgb3V0TWV0cmljcy55ZHBpLCAwLjAwMDFmKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBUZXN0IHRoYXQgdGhlIGdldEZsYWdzIG1ldGhvZCByZXR1cm5zIG5vIGZsYWcgYml0cyBzZXQgZm9yIHRoZSBvdmVybGF5IGRpc3BsYXkuCiAgICAgICovCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RmxhZ3MoKSB7CiAgICAgICAgIERpc3BsYXkgZGlzcGxheSA9IGdldFNlY29uZGFyeURpc3BsYXkobURpc3BsYXlNYW5hZ2VyLmdldERpc3BsYXlzKCkpOwogCkBAIC0yODAsNiArMjk2LDcgQEAKICAgICAvKioKICAgICAgKiBUZXN0cyB0aGF0IHRoZSBtb2RlLXJlbGF0ZWQgYXR0cmlidXRlcyBhbmQgbWV0aG9kcyB3b3JrIGFzIGV4cGVjdGVkLgogICAgICAqLworICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE1vZGUoKSB7CiAgICAgICAgIERpc3BsYXkgZGlzcGxheSA9IGdldFNlY29uZGFyeURpc3BsYXkobURpc3BsYXlNYW5hZ2VyLmdldERpc3BsYXlzKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMiwgZGlzcGxheS5nZXRTdXBwb3J0ZWRNb2RlcygpLmxlbmd0aCk7CkBAIC0yODcsMTIgKzMwNCwxMyBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoZGlzcGxheS5nZXRTdXBwb3J0ZWRNb2RlcygpWzBdLCBtb2RlKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKFNFQ09OREFSWV9ESVNQTEFZX1dJRFRILCBtb2RlLmdldFBoeXNpY2FsV2lkdGgoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhTRUNPTkRBUllfRElTUExBWV9IRUlHSFQsIG1vZGUuZ2V0UGh5c2ljYWxIZWlnaHQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhkaXNwbGF5LmdldFJlZnJlc2hSYXRlKCksIG1vZGUuZ2V0UmVmcmVzaFJhdGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhkaXNwbGF5LmdldFJlZnJlc2hSYXRlKCksIG1vZGUuZ2V0UmVmcmVzaFJhdGUoKSwgMC4wMDAxZik7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogVGVzdHMgdGhhdCBtb2RlIHN3aXRjaCByZXF1ZXN0cyBhcmUgY29ycmVjdGx5IGV4ZWN1dGVkLgogICAgICAqLworICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE1vZGVTd2l0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gU3RhbmRhbG9uZSBWUiBkZXZpY2VzIGdsb2JhbGx5IGlnbm9yZSBTWVNURU1fQUxFUlRfV0lORE9XIHZpYSBBcHBPcHMuCiAgICAgICAgIC8vIFNraXAgdGhpcyB0ZXN0LCB3aGljaCBkZXBlbmRzIG9uIGEgUHJlc2VudGF0aW9uIFNZU1RFTV9BTEVSVF9XSU5ET1cgdG8gcGFzcy4KQEAgLTMzMyw3ICszNTEsOCBAQAogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgICAgICAgICAgbVByZXNlbnRhdGlvbiA9IG5ldyBUZXN0UHJlc2VudGF0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0Q29udGV4dCgpLCBkaXNwbGF5LCBuZXdNb2RlLmdldE1vZGVJZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLmdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXksIG5ld01vZGUuZ2V0TW9kZUlkKCkpOwogICAgICAgICAgICAgICAgIG1QcmVzZW50YXRpb24uc2hvdygpOwogICAgICAgICAgICAgICAgIHByZXNlbnRhdGlvblNpZ25hbC5jb3VudERvd24oKTsKICAgICAgICAgICAgIH0KQEAgLTM4NywxMCArNDA2LDEzIEBACiAKICAgICBwcml2YXRlIEFjdGl2aXR5IGxhdW5jaFNjcmVlbk9uQWN0aXZpdHkoKSB7CiAgICAgICAgIENsYXNzIGNsYXp6ID0gU2NyZWVuT25BY3Rpdml0eS5jbGFzczsKLSAgICAgICAgU3RyaW5nIHRhcmdldFBhY2thZ2UgPSBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRDb250ZXh0KCkuZ2V0UGFja2FnZU5hbWUoKTsKLSAgICAgICAgSW5zdHJ1bWVudGF0aW9uLkFjdGl2aXR5UmVzdWx0IHJlc3VsdCA9IG5ldyBJbnN0cnVtZW50YXRpb24uQWN0aXZpdHlSZXN1bHQoMCwgbmV3IEludGVudCgpKTsKLSAgICAgICAgSW5zdHJ1bWVudGF0aW9uLkFjdGl2aXR5TW9uaXRvciBtb25pdG9yID0gbmV3IEluc3RydW1lbnRhdGlvbi5BY3Rpdml0eU1vbml0b3IoY2xhenouZ2V0TmFtZSgpLCByZXN1bHQsIGZhbHNlKTsKLSAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkuYWRkTW9uaXRvcihtb25pdG9yKTsKKyAgICAgICAgU3RyaW5nIHRhcmdldFBhY2thZ2UgPQorICAgICAgICAgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLmdldENvbnRleHQoKS5nZXRQYWNrYWdlTmFtZSgpOworICAgICAgICBJbnN0cnVtZW50YXRpb24uQWN0aXZpdHlSZXN1bHQgcmVzdWx0ID0KKyAgICAgICAgICAgICAgICBuZXcgSW5zdHJ1bWVudGF0aW9uLkFjdGl2aXR5UmVzdWx0KDAsIG5ldyBJbnRlbnQoKSk7CisgICAgICAgIEluc3RydW1lbnRhdGlvbi5BY3Rpdml0eU1vbml0b3IgbW9uaXRvciA9CisgICAgICAgICAgICAgICAgbmV3IEluc3RydW1lbnRhdGlvbi5BY3Rpdml0eU1vbml0b3IoY2xhenouZ2V0TmFtZSgpLCByZXN1bHQsIGZhbHNlKTsKKyAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkuYWRkTW9uaXRvcihtb25pdG9yKTsKICAgICAgICAgbGF1bmNoQWN0aXZpdHkodGFyZ2V0UGFja2FnZSwgY2xhenosIG51bGwpOwogICAgICAgICByZXR1cm4gbW9uaXRvci53YWl0Rm9yQWN0aXZpdHkoKTsKICAgICB9CkBAIC00MDAsNCArNDIyLDU3IEBACiAgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLndhaXRGb3JJZGxlU3luYygpOwogICAgICAgICByZXR1cm4gYWN0aXZpdHk7CiAgICAgfQorCisgICAgLyoqCisgICAgICogVXRpbGl0eSBtZXRob2QgZm9yIGxhdW5jaGluZyBhbiBhY3Rpdml0eS4gQ29waWVkIGZyb20gSW5zdHJ1bWVudGF0aW9uVGVzdENhc2Ugc2luY2UKKyAgICAgKiBJbnN0cnVtZW50YXRpb25SZWdpc3RyeSBkb2VzIG5vdCBwcm92aWRlIHRoZXNlIEFQSXMgYW55bW9yZS4KKyAgICAgKgorICAgICAqIDxwPlRoZSB7QGxpbmsgSW50ZW50fSB1c2VkIHRvIGxhdW5jaCB0aGUgQWN0aXZpdHkgaXM6CisgICAgICogIGFjdGlvbiA9IHtAbGluayBJbnRlbnQjQUNUSU9OX01BSU59CisgICAgICogIGV4dHJhcyA9IG51bGwsIHVubGVzcyBhIGN1c3RvbSBidW5kbGUgaXMgcHJvdmlkZWQgaGVyZQorICAgICAqIEFsbCBvdGhlciBmaWVsZHMgYXJlIG51bGwgb3IgZW1wdHkuCisgICAgICoKKyAgICAgKiA8cD48Yj5OT1RFOjwvYj4gVGhlIHBhcmFtZXRlciA8aT5wa2c8L2k+IG11c3QgcmVmZXIgdG8gdGhlIHBhY2thZ2UgaWRlbnRpZmllciBvZiB0aGUKKyAgICAgKiBwYWNrYWdlIGhvc3RpbmcgdGhlIGFjdGl2aXR5IHRvIGJlIGxhdW5jaGVkLCB3aGljaCBpcyBzcGVjaWZpZWQgaW4gdGhlIEFuZHJvaWRNYW5pZmVzdC54bWwKKyAgICAgKiBmaWxlLiAgVGhpcyBpcyBub3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgdGhlIGphdmEgcGFja2FnZSBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIHBrZyBUaGUgcGFja2FnZSBob3N0aW5nIHRoZSBhY3Rpdml0eSB0byBiZSBsYXVuY2hlZC4KKyAgICAgKiBAcGFyYW0gYWN0aXZpdHlDbHMgVGhlIGFjdGl2aXR5IGNsYXNzIHRvIGxhdW5jaC4KKyAgICAgKiBAcGFyYW0gZXh0cmFzIE9wdGlvbmFsIGV4dHJhIHN0dWZmIHRvIHBhc3MgdG8gdGhlIGFjdGl2aXR5LgorICAgICAqIEByZXR1cm4gVGhlIGFjdGl2aXR5LCBvciBudWxsIGlmIG5vbiBsYXVuY2hlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIDxUIGV4dGVuZHMgQWN0aXZpdHk+IFQgbGF1bmNoQWN0aXZpdHkoCisgICAgICAgICAgICBTdHJpbmcgcGtnLAorICAgICAgICAgICAgQ2xhc3M8VD4gYWN0aXZpdHlDbHMsCisgICAgICAgICAgICBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEludGVudC5BQ1RJT05fTUFJTik7CisgICAgICAgIGlmIChleHRyYXMgIT0gbnVsbCkgeworICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhcyhleHRyYXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBsYXVuY2hBY3Rpdml0eVdpdGhJbnRlbnQocGtnLCBhY3Rpdml0eUNscywgaW50ZW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IG1ldGhvZCBmb3IgbGF1bmNoaW5nIGFuIGFjdGl2aXR5IHdpdGggYSBzcGVjaWZpYyBJbnRlbnQuCisgICAgICoKKyAgICAgKiA8cD48Yj5OT1RFOjwvYj4gVGhlIHBhcmFtZXRlciA8aT5wa2c8L2k+IG11c3QgcmVmZXIgdG8gdGhlIHBhY2thZ2UgaWRlbnRpZmllciBvZiB0aGUKKyAgICAgKiBwYWNrYWdlIGhvc3RpbmcgdGhlIGFjdGl2aXR5IHRvIGJlIGxhdW5jaGVkLCB3aGljaCBpcyBzcGVjaWZpZWQgaW4gdGhlIEFuZHJvaWRNYW5pZmVzdC54bWwKKyAgICAgKiBmaWxlLiAgVGhpcyBpcyBub3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgdGhlIGphdmEgcGFja2FnZSBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIHBrZyBUaGUgcGFja2FnZSBob3N0aW5nIHRoZSBhY3Rpdml0eSB0byBiZSBsYXVuY2hlZC4KKyAgICAgKiBAcGFyYW0gYWN0aXZpdHlDbHMgVGhlIGFjdGl2aXR5IGNsYXNzIHRvIGxhdW5jaC4KKyAgICAgKiBAcGFyYW0gaW50ZW50IFRoZSBpbnRlbnQgdG8gbGF1bmNoIHdpdGgKKyAgICAgKiBAcmV0dXJuIFRoZSBhY3Rpdml0eSwgb3IgbnVsbCBpZiBub24gbGF1bmNoZWQuCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHJpdmF0ZSBmaW5hbCA8VCBleHRlbmRzIEFjdGl2aXR5PiBUIGxhdW5jaEFjdGl2aXR5V2l0aEludGVudCgKKyAgICAgICAgICAgIFN0cmluZyBwa2csCisgICAgICAgICAgICBDbGFzczxUPiBhY3Rpdml0eUNscywKKyAgICAgICAgICAgIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgaW50ZW50LnNldENsYXNzTmFtZShwa2csIGFjdGl2aXR5Q2xzLmdldE5hbWUoKSk7CisgICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7CisgICAgICAgIFQgYWN0aXZpdHkgPSAoVCkgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkuc3RhcnRBY3Rpdml0eVN5bmMoaW50ZW50KTsKKyAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkud2FpdEZvcklkbGVTeW5jKCk7CisgICAgICAgIHJldHVybiBhY3Rpdml0eTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9kcGkvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL2RwaS9BbmRyb2lkLm1rCmluZGV4IDk4YTY1MDQuLmE0YzMzMTUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2RwaS9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3Rlc3RzL2RwaS9BbmRyb2lkLm1rCkBAIC0xNyw3ICsxNyw5IEBACiAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY3RzdGVzdHJ1bm5lciBqdW5pdCBsZWdhY3ktYW5kcm9pZC10ZXN0IGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjdHN0ZXN0cnVubmVyLWF4dCBqdW5pdCBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dAorCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzIGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIApAQCAtMzEsNyArMzMsNyBAQAogTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAogCiAjIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0Ci1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMgY3RzX2luc3RhbnQKIAogaW5jbHVkZSAkKEJVSUxEX0NUU19QQUNLQUdFKQogCkBAIC00MSw3ICs0Myw3IEBACiAjIENUUyB0ZXN0cywgc28gZHJvcCBpdCBpbnRvIGEgbGlicmFyeSB0aGF0IG90aGVyIHRlc3RzIGNhbiB1c2UuCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGp1bml0IGxlZ2FjeS1hbmRyb2lkLXRlc3QKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSBzcmMvYW5kcm9pZC9kcGkvY3RzL0RlZmF1bHRNYW5pZmVzdEF0dHJpYnV0ZXNUZXN0LmphdmEKIApAQCAtNDksNCArNTEsNiBAQAogCiBMT0NBTF9NT0RVTEUgOj0gYW5kcm9pZC5jdHMuZHBpCiAKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKKwogaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19KQVZBX0xJQlJBUlkpCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9kcGkvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL2RwaS9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDExODA1MGUuLjU0NTdkOTIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2RwaS9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL2RwaS9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0xNiw3ICsxNiw4IEBACiAgLS0+CiAKIDxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgcGFja2FnZT0iYW5kcm9pZC5kcGkuY3RzIj4KKyAgICBwYWNrYWdlPSJhbmRyb2lkLmRwaS5jdHMiCisgICAgYW5kcm9pZDp0YXJnZXRTYW5kYm94VmVyc2lvbj0iMiI+CiAKICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkRJU0FCTEVfS0VZR1VBUkQiIC8+CiAgICAgPGFwcGxpY2F0aW9uPgpAQCAtMjYsNyArMjcsNyBAQAogICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29uZmlnQ2hhbmdlcz0ib3JpZW50YXRpb24iIC8+CiAgICAgPC9hcHBsaWNhdGlvbj4KIAotICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuZHBpLmN0cyIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBmb3IgRFBJIj4KICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9Imxpc3RlbmVyIgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZHBpL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL2RwaS9BbmRyb2lkVGVzdC54bWwKaW5kZXggZTEyYjM2ZC4uNWUwN2I3YyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZHBpL0FuZHJvaWRUZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9kcGkvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgRFBJIHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJmcmFtZXdvcmsiIC8+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CiAgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2RwaS9zcmMvYW5kcm9pZC9kcGkvY3RzL0NvbmZpZ3VyYXRpb25TY3JlZW5MYXlvdXRUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9kcGkvc3JjL2FuZHJvaWQvZHBpL2N0cy9Db25maWd1cmF0aW9uU2NyZWVuTGF5b3V0VGVzdC5qYXZhCmluZGV4IDUwODUwMzguLmQwNWUyMzEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2RwaS9zcmMvYW5kcm9pZC9kcGkvY3RzL0NvbmZpZ3VyYXRpb25TY3JlZW5MYXlvdXRUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvZHBpL3NyYy9hbmRyb2lkL2RwaS9jdHMvQ29uZmlndXJhdGlvblNjcmVlbkxheW91dFRlc3QuamF2YQpAQCAtMjAsMTQgKzIwLDE0IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQWN0aXZpdHlJbmZvOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKIGltcG9ydCBhbmRyb2lkLnZpZXcuRGlzcGxheTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0NvbmZpZ3VyYXRpb247CiBpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNkZFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKIAogcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25TY3JlZW5MYXlvdXRUZXN0CiAgICAgICAgIGV4dGVuZHMgQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI8T3JpZW50YXRpb25BY3Rpdml0eT4gewpAQCAtNDMsOCArNDMsMjAgQEAKICAgICAgICAgc3VwZXIoT3JpZW50YXRpb25BY3Rpdml0eS5jbGFzcyk7CiAgICAgfQogCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuMS4zL0MtMC0yLEMtMS0yLDcuMS4xLjEvQy0wLTEiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RTY3JlZW5MYXlvdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFzdXBwb3J0c1JvdGF0aW9uKCkpIHsKKyAgICAgICAgICAgIC8vIHRlc3QgaGFzIG5vIGVmZmVjdCBpZiBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCByb3RhdGlvbgorICAgICAgICAgICAgdGVhckRvd24oKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNQQygpKSB7CisgICAgICAgICAgICAvLyBUaGUgdGVzdCBza2lwcyBtYWlubHkgZm9yIENocm9tZWJvb2sgY2xhbXNoZWxsIG1vZGUuIEZvciBDaHJvbWVib29rIGNsYW1zaGVsbCBtb2RlCisgICAgICAgICAgICAvLyB3aXRoIG5vbi1yb3RhdGVkIGxhbmRzY2FwZSBwaHlzaWNhbCBzY3JlZW4sIHRoZSBwb3J0cmFpdCB3aW5kb3cvYWN0aXZpdHkgaGFzIHNwZWNpYWwKKyAgICAgICAgICAgIC8vIGJlaGF2aW9yIHdpdGggYmxhY2sgYmFja2dyb3VuZCBvbiBib3RoIHNpZGVzIHRvIG1ha2UgdGhlIHdpbmRvdy9hY3Rpdml0eSBsb29rCisgICAgICAgICAgICAvLyBwb3J0cmFpdCwgd2hpY2ggcmV0dXJucyBzbWFsbGVyIHNjcmVlbiBsYXlvdXQgc2l6ZS4KKyAgICAgICAgICAgIHRlYXJEb3duKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KICAgICAgICAgaW50IGV4cGVjdGVkU2NyZWVuTGF5b3V0ID0gY29tcHV0ZVNjcmVlbkxheW91dCgpOwogICAgICAgICBpbnQgZXhwZWN0ZWRTaXplID0gZXhwZWN0ZWRTY3JlZW5MYXlvdXQgJiBDb25maWd1cmF0aW9uLlNDUkVFTkxBWU9VVF9TSVpFX01BU0s7CiAgICAgICAgIGludCBleHBlY3RlZExvbmcgPSBleHBlY3RlZFNjcmVlbkxheW91dCAmIENvbmZpZ3VyYXRpb24uU0NSRUVOTEFZT1VUX0xPTkdfTUFTSzsKQEAgLTg5LDYgKzEwMSwxMiBAQAogICAgICAgICByZXR1cm4gc2NyZWVuTGF5b3V0OwogICAgIH0KIAorICAgIHByaXZhdGUgYm9vbGVhbiBoYXNEZXZpY2VGZWF0dXJlKGZpbmFsIFN0cmluZyByZXF1aXJlZEZlYXR1cmUpIHsKKyAgICAgICAgcmV0dXJuIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKQorICAgICAgICAgICAgICAgIC5nZXRQYWNrYWdlTWFuYWdlcigpCisgICAgICAgICAgICAgICAgLmhhc1N5c3RlbUZlYXR1cmUocmVxdWlyZWRGZWF0dXJlKTsKKyAgICB9CisKICAgICBwcml2YXRlIEFjdGl2aXR5IHN0YXJ0T3JpZW50YXRpb25BY3Rpdml0eShpbnQgb3JpZW50YXRpb24pIHsKICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoKTsKICAgICAgICAgaW50ZW50LnB1dEV4dHJhKE9yaWVudGF0aW9uQWN0aXZpdHkuRVhUUkFfT1JJRU5UQVRJT04sIG9yaWVudGF0aW9uKTsKQEAgLTE0Miw0ICsxNjAsMjAgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gc2NyZWVuTGF5b3V0OwogICAgIH0KKworICAgIC8qKgorICAgICAqIFJvdGF0aW9uIHN1cHBvcnQgaXMgaW5kaWNhdGVkIGJ5IGV4cGxpY2l0bHkgaGF2aW5nIGJvdGggbGFuZHNjYXBlIGFuZCBwb3J0cmFpdAorICAgICAqIGZlYXR1cmVzIG9yIG5vdCBsaXN0aW5nIGVpdGhlciBhdCBhbGwuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHN1cHBvcnRzUm90YXRpb24oKSB7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gc3VwcG9ydHNMYW5kc2NhcGUgPSBoYXNEZXZpY2VGZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfU0NSRUVOX0xBTkRTQ0FQRSk7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gc3VwcG9ydHNQb3J0cmFpdCA9IGhhc0RldmljZUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9TQ1JFRU5fUE9SVFJBSVQpOworICAgICAgICByZXR1cm4gKHN1cHBvcnRzTGFuZHNjYXBlICYmIHN1cHBvcnRzUG9ydHJhaXQpCisgICAgICAgICAgICAgICAgfHwgKCFzdXBwb3J0c0xhbmRzY2FwZSAmJiAhc3VwcG9ydHNQb3J0cmFpdCk7CisgICAgfQorCisgICAgLy8gQ2hlY2sgaWYgaXQgaXMgYSBQQyBkZXZpY2UKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNQQygpIHsKKyAgICAgICAgcmV0dXJuIGhhc0RldmljZUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9QQyk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZHBpL3NyYy9hbmRyb2lkL2RwaS9jdHMvQ29uZmlndXJhdGlvblRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2RwaS9zcmMvYW5kcm9pZC9kcGkvY3RzL0NvbmZpZ3VyYXRpb25UZXN0LmphdmEKaW5kZXggZTc5ZDEwZi4uOGZkYzcwMSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZHBpL3NyYy9hbmRyb2lkL2RwaS9jdHMvQ29uZmlndXJhdGlvblRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9kcGkvc3JjL2FuZHJvaWQvZHBpL2N0cy9Db25maWd1cmF0aW9uVGVzdC5qYXZhCkBAIC0yNSw2ICsyNSw3IEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNkZFRlc3Q7CitpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5GZWF0dXJlVXRpbDsKIAogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CkBAIC0zNCwyNyArMzUsMzUgQEAKICAqLwogcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25UZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKIAotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjEuMS4xL0gtMC0xLFctMC0xLDcuMS4xLjMvQy0wLTEsNy4xLjIvQy0xLTEiKQotICAgIEBQcmVzdWJtaXQKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2NyZWVuQ29uZmlndXJhdGlvbigpIHsKKyAgICBwcml2YXRlIERpc3BsYXlNZXRyaWNzIG1NZXRyaWNzOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKICAgICAgICAgV2luZG93TWFuYWdlciB3aW5kb3dNYW5hZ2VyID0KICAgICAgICAgICAgICAgICAoV2luZG93TWFuYWdlcikgZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5XSU5ET1dfU0VSVklDRSk7CiAgICAgICAgIERpc3BsYXkgZGlzcGxheSA9IHdpbmRvd01hbmFnZXIuZ2V0RGVmYXVsdERpc3BsYXkoKTsKLSAgICAgICAgRGlzcGxheU1ldHJpY3MgbWV0cmljcyA9IG5ldyBEaXNwbGF5TWV0cmljcygpOwotICAgICAgICBkaXNwbGF5LmdldFJlYWxNZXRyaWNzKG1ldHJpY3MpOworICAgICAgICBtTWV0cmljcyA9IG5ldyBEaXNwbGF5TWV0cmljcygpOworICAgICAgICBkaXNwbGF5LmdldE1ldHJpY3MobU1ldHJpY3MpOworICAgIH0KIAotICAgICAgICBkb3VibGUgeEluY2hlcyA9IChkb3VibGUpIG1ldHJpY3Mud2lkdGhQaXhlbHMgLyBtZXRyaWNzLnhkcGk7Ci0gICAgICAgIGRvdWJsZSB5SW5jaGVzID0gKGRvdWJsZSkgbWV0cmljcy5oZWlnaHRQaXhlbHMgLyBtZXRyaWNzLnlkcGk7CisgICAgQFByZXN1Ym1pdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTY3JlZW5Db25maWd1cmF0aW9uKCkgeworICAgICAgICBkb3VibGUgeEluY2hlcyA9IChkb3VibGUpIG1NZXRyaWNzLndpZHRoUGl4ZWxzIC8gbU1ldHJpY3MueGRwaTsKKyAgICAgICAgZG91YmxlIHlJbmNoZXMgPSAoZG91YmxlKSBtTWV0cmljcy5oZWlnaHRQaXhlbHMgLyBtTWV0cmljcy55ZHBpOwogICAgICAgICBkb3VibGUgZGlhZ29uYWxJbmNoZXMgPSBNYXRoLnNxcnQoTWF0aC5wb3coeEluY2hlcywgMikgKyBNYXRoLnBvdyh5SW5jaGVzLCAyKSk7CiAgICAgICAgIGRvdWJsZSBtaW5TaXplID0gMi41ZDsKLSAgICAgICAgaWYgKGdldENvbnRleHQoKS5nZXRQYWNrYWdlTWFuYWdlcigpLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9XQVRDSCkpIHsKKyAgICAgICAgaWYgKEZlYXR1cmVVdGlsLmlzV2F0Y2goKSkgewogICAgICAgICAgICAgLy8gV2F0Y2hlcyBoYXZlIGEgZGlmZmVyZW50IG1pbmltdW0gZGlhZ29uYWwuCiAgICAgICAgICAgICBtaW5TaXplID0gMS4wZDsKKyAgICAgICAgfSBlbHNlIGlmIChGZWF0dXJlVXRpbC5pc0F1dG9tb3RpdmUoKSkgeworICAgICAgICAgICAgLy8gQ2FycyBoYXZlIGEgZGlmZmVyZW50IG1pbmltdW0gZGlhZ29uYWwuCisgICAgICAgICAgICBtaW5TaXplID0gNi4wZDsKICAgICAgICAgfQogICAgICAgICBhc3NlcnRUcnVlKCJTY3JlZW4gZGlhZ29uYWwgbXVzdCBiZSBhdCBsZWFzdCAiICsgbWluU2l6ZSArICIgaW5jaGVzOiAiICsgZGlhZ29uYWxJbmNoZXMsCiAgICAgICAgICAgICAgICAgZGlhZ29uYWxJbmNoZXMgPj0gbWluU2l6ZSk7CiAKLSAgICAgICAgZG91YmxlIGRlbnNpdHkgPSAxNjAuMGQgKiBtZXRyaWNzLmRlbnNpdHk7CisgICAgICAgIGRvdWJsZSBkZW5zaXR5ID0gMTYwLjBkICogbU1ldHJpY3MuZGVuc2l0eTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiU2NyZWVuIGRlbnNpdHkgbXVzdCBiZSBhdCBsZWFzdCAxMDAgZHBpOiAiICsgZGVuc2l0eSwgZGVuc2l0eSA+PSAxMDAuMGQpOwogCiAgICAgICAgIFNldDxJbnRlZ2VyPiBhbGxvd2VkRGVuc2l0aWVzID0gbmV3IEhhc2hTZXQ8SW50ZWdlcj4oKTsKQEAgLTcwLDE0ICs3OSwyNyBAQAogICAgICAgICBhbGxvd2VkRGVuc2l0aWVzLmFkZChEaXNwbGF5TWV0cmljcy5ERU5TSVRZXzM2MCk7CiAgICAgICAgIGFsbG93ZWREZW5zaXRpZXMuYWRkKERpc3BsYXlNZXRyaWNzLkRFTlNJVFlfNDAwKTsKICAgICAgICAgYWxsb3dlZERlbnNpdGllcy5hZGQoRGlzcGxheU1ldHJpY3MuREVOU0lUWV80MjApOworICAgICAgICBhbGxvd2VkRGVuc2l0aWVzLmFkZChEaXNwbGF5TWV0cmljcy5ERU5TSVRZXzQ0MCk7CiAgICAgICAgIGFsbG93ZWREZW5zaXRpZXMuYWRkKERpc3BsYXlNZXRyaWNzLkRFTlNJVFlfWFhISUdIKTsKICAgICAgICAgYWxsb3dlZERlbnNpdGllcy5hZGQoRGlzcGxheU1ldHJpY3MuREVOU0lUWV81NjApOwogICAgICAgICBhbGxvd2VkRGVuc2l0aWVzLmFkZChEaXNwbGF5TWV0cmljcy5ERU5TSVRZX1hYWEhJR0gpOwotICAgICAgICBhc3NlcnRUcnVlKCJEaXNwbGF5TWV0cmljcyNkZW5zaXR5RHBpIG11c3QgYmUgb25lIG9mIHRoZSBEaXNwbGF5TWV0cmljcy5ERU5TSVRZXyogdmFsdWVzOiAiCi0gICAgICAgICAgICAgICAgKyBhbGxvd2VkRGVuc2l0aWVzLCBhbGxvd2VkRGVuc2l0aWVzLmNvbnRhaW5zKG1ldHJpY3MuZGVuc2l0eURwaSkpOworICAgICAgICBhc3NlcnRUcnVlKCJEaXNwbGF5TWV0cmljcy5ERU5TSVRZX0RFVklDRV9TVEFCTEUgbXVzdCBiZSBvbmUgb2YgdGhlIERpc3BsYXlNZXRyaWNzLkRFTlNJVFlfKiB2YWx1ZXM6ICIKKyAgICAgICAgICAgICAgICArIGFsbG93ZWREZW5zaXRpZXMsIGFsbG93ZWREZW5zaXRpZXMuY29udGFpbnMoRGlzcGxheU1ldHJpY3MuREVOU0lUWV9ERVZJQ0VfU1RBQkxFKSk7CiAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG1ldHJpY3MuZGVuc2l0eSwKLSAgICAgICAgICAgICAgICAoZmxvYXQpIG1ldHJpY3MuZGVuc2l0eURwaSAvIERpc3BsYXlNZXRyaWNzLkRFTlNJVFlfREVGQVVMVCwKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1NZXRyaWNzLmRlbnNpdHksCisgICAgICAgICAgICAgICAgKGZsb2F0KSBtTWV0cmljcy5kZW5zaXR5RHBpIC8gRGlzcGxheU1ldHJpY3MuREVOU0lUWV9ERUZBVUxULAogICAgICAgICAgICAgICAgIDAuNWYgLyBEaXNwbGF5TWV0cmljcy5ERU5TSVRZX0RFRkFVTFQpOwogICAgIH0KKworICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSIyLjUuMSIpCisgICAgcHVibGljIHZvaWQgdGVzdEF1dG9tb3RpdmVNaW5pbXVtU2NyZWVuU2l6ZSgpIHsKKyAgICAgICAgaWYgKCFGZWF0dXJlVXRpbC5pc0F1dG9tb3RpdmUoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZsb2F0IGRwSGVpZ2h0ID0gbU1ldHJpY3MuaGVpZ2h0UGl4ZWxzIC8gbU1ldHJpY3MuZGVuc2l0eTsKKyAgICAgICAgZmxvYXQgZHBXaWR0aCA9IG1NZXRyaWNzLndpZHRoUGl4ZWxzIC8gbU1ldHJpY3MuZGVuc2l0eTsKKworICAgICAgICBhc3NlcnRUcnVlKCJIZWlnaHQgbXVzdCBiZSA+PSA0ODBkcCwgZm91bmQ6ICIgKyBkcEhlaWdodCwgZHBIZWlnaHQgPj0gNDgwKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiV2lkdGggbXVzdCBiZSA+PSA3NTBkcCwgZm91bmQ6ICIgKyBkcFdpZHRoLCBkcFdpZHRoID49IDc1MCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZHBpMi9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvZHBpMi9BbmRyb2lkLm1rCmluZGV4IGRjZDJjMGYuLmVjN2I3NTEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2RwaTIvQW5kcm9pZC5taworKysgYi90ZXN0cy90ZXN0cy9kcGkyL0FuZHJvaWQubWsKQEAgLTE4LDkgKzE4LDkgQEAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCiAjIFdlIHVzZSB0aGUgRGVmYXVsdE1hbmlmZXN0QXR0cmlidXRlc1Rlc3QgZnJvbSB0aGUgYW5kcm9pZC5jdHMuZHBpIHBhY2thZ2UuCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC5jdHMuZHBpIGN0c3Rlc3RydW5uZXIganVuaXQKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLmN0cy5kcGkgY3RzdGVzdHJ1bm5lci1heHQganVuaXQKIAotTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gbGVnYWN5LWFuZHJvaWQtdGVzdAorTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LmJhc2Uuc3R1YnMKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9kcGkyL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy90ZXN0cy9kcGkyL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggNjg5YmUyOS4uMjhiNTU3OSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZHBpMi9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL2RwaTIvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjUsOSArMjUsOSBAQAogCiAgICAgPCEtLSB0YXJnZXQgY3VwY2FrZSBzbyB3ZSBjYW4gdGVzdCB0aGUgZGVmYXVsdCBhdHRyaWJ1dGVzIGdldCBzZXQKICAgICAgICAgIHByb3Blcmx5IGZvciB0aGUgc2NyZWVuIHNpemUgYXR0cmlidXRlcy4gLS0+Ci0gICAgPHVzZXMtc2RrIGFuZHJvaWQ6bWluU2RrVmVyc2lvbj0iMyIgYW5kcm9pZDp0YXJnZXRTZGtWZXJzaW9uPSIzIiAvPgorICAgIDx1c2VzLXNkayBhbmRyb2lkOm1pblNka1ZlcnNpb249IjMiIGFuZHJvaWQ6dGFyZ2V0U2RrVmVyc2lvbj0iMTciIC8+CiAKLSAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmRwaTIuY3RzIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIGZvciBEUEkiPgogICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0ibGlzdGVuZXIiCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9kcGkyL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL2RwaTIvQW5kcm9pZFRlc3QueG1sCmluZGV4IDU4OTkzNWQuLjBjMmY2ZGMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2RwaTIvQW5kcm9pZFRlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL2RwaTIvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgRFBJIHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJmcmFtZXdvcmsiIC8+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CiAgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2RwaTIvc3JjL2FuZHJvaWQvZHBpMi9jdHMvRGVmYXVsdE1hbmlmZXN0QXR0cmlidXRlc0N1cGNha2VUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9kcGkyL3NyYy9hbmRyb2lkL2RwaTIvY3RzL0RlZmF1bHRNYW5pZmVzdEF0dHJpYnV0ZXNDdXBjYWtlVGVzdC5qYXZhCmluZGV4IDA0ZGI0MTIuLmFiYjhkNjYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2RwaTIvc3JjL2FuZHJvaWQvZHBpMi9jdHMvRGVmYXVsdE1hbmlmZXN0QXR0cmlidXRlc0N1cGNha2VUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvZHBpMi9zcmMvYW5kcm9pZC9kcGkyL2N0cy9EZWZhdWx0TWFuaWZlc3RBdHRyaWJ1dGVzQ3VwY2FrZVRlc3QuamF2YQpAQCAtMzQsNiArMzQsNiBAQAogCiAgICAgLy8gVGhpcyBpcyBhIHNhbml0eSB0ZXN0IHRvIG1ha2Ugc3VyZSB0aGF0IHdlJ3JlIGluc3RydW1lbnRpbmcgdGhlIHByb3BlciBwYWNrYWdlCiAgICAgcHVibGljIHZvaWQgdGVzdFBhY2thZ2VIYXNFeHBlY3RlZFNka1ZlcnNpb24oKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscygzLCBnZXRBcHBJbmZvKCkudGFyZ2V0U2RrVmVyc2lvbik7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBnZXRBcHBJbmZvKCkubWluU2RrVmVyc2lvbik7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZHJlYW1zL0FuZHJvaWQubWsgYi90ZXN0cy90ZXN0cy9kcmVhbXMvQW5kcm9pZC5tawppbmRleCAzODNjOWMzLi5iMjdiOTg5IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9kcmVhbXMvQW5kcm9pZC5taworKysgYi90ZXN0cy90ZXN0cy9kcmVhbXMvQW5kcm9pZC5tawpAQCAtMjQsMTYgKzI0LDE3IEBACiAjIFdoZW4gYnVpbHQsIGV4cGxpY2l0bHkgcHV0IGl0IGluIHRoZSBkYXRhIHBhcnRpdGlvbi4KIExPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCiAKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjdHN0ZXN0cnVubmVyIGp1bml0IGxlZ2FjeS1hbmRyb2lkLXRlc3QKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjdHN0ZXN0cnVubmVyLWF4dCBqdW5pdAogCi1MT0NBTF9KQVZBX0xJQlJBUklFUyA6PSAgYW5kcm9pZC50ZXN0LnJ1bm5lcgorTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gIGFuZHJvaWQudGVzdC5ydW5uZXIuc3R1YnMgYW5kcm9pZC50ZXN0LmJhc2Uuc3R1YnMKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogCiAjIE5lZWQgYWNjZXNzIHRvIFNlcnZpY2VNYW5hZ2VyIC0gc2VlIGIvMTMzMDcyMjEKICNMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CitMT0NBTF9QUklWQVRFX1BMQVRGT1JNX0FQSVMgOj0gdHJ1ZQogCiAjIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0Ci1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMgY3RzX2luc3RhbnQKIAogaW5jbHVkZSAkKEJVSUxEX0NUU19QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZHJlYW1zL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy90ZXN0cy9kcmVhbXMvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA4ZjFkNzVlLi40MDcwMTg3IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9kcmVhbXMvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9kcmVhbXMvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMTQsNyArMTQsOCBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBwYWNrYWdlPSJhbmRyb2lkLmRyZWFtcy5jdHMiPgorICAgIHBhY2thZ2U9ImFuZHJvaWQuZHJlYW1zLmN0cyIKKyAgICBhbmRyb2lkOnRhcmdldFNhbmRib3hWZXJzaW9uPSIyIj4KIAogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uRElTQUJMRV9LRVlHVUFSRCIgLz4KICAgICA8YXBwbGljYXRpb24+CkBAIC0yMiw3ICsyMyw3IEBACiAgICAgPC9hcHBsaWNhdGlvbj4KIAogICAgIDwhLS0gVGhpcyBpcyBhIHNlbGYtaW5zdHJ1bWVudGluZyB0ZXN0IHBhY2thZ2UuIC0tPgotICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuZHJlYW1zLmN0cyIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBmb3IgdGhlIGFuZHJvaWQuc2VydmljZS5kcmVhbXMgcGFja2FnZSI+CiAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJsaXN0ZW5lciIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2RyZWFtcy9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy90ZXN0cy9kcmVhbXMvQW5kcm9pZFRlc3QueG1sCmluZGV4IDcyNzQ3NDAuLjg2YjExMzEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2RyZWFtcy9BbmRyb2lkVGVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvZHJlYW1zL0FuZHJvaWRUZXN0LnhtbApAQCAtMTQsNiArMTQsNyBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIERyZWFtcyB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0ic3lzdWkiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJub3Qtc2hhcmRhYmxlIiB2YWx1ZT0idHJ1ZSIgLz4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KQEAgLTIzLDUgKzI0LDYgQEAKICAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuQW5kcm9pZEpVbml0VGVzdCIgPgogICAgICAgICA8b3B0aW9uIG5hbWU9InBhY2thZ2UiIHZhbHVlPSJhbmRyb2lkLmRyZWFtcy5jdHMiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icnVudGltZS1oaW50IiB2YWx1ZT0iMTBtIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImhpZGRlbi1hcGktY2hlY2tzIiB2YWx1ZT0iZmFsc2UiIC8+CiAgICAgPC90ZXN0PgogPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZHJtL0FuZHJvaWQubWsgYi90ZXN0cy90ZXN0cy9kcm0vQW5kcm9pZC5tawppbmRleCAxM2FjOGQ2Li4wYjQ3Yzg1IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9kcm0vQW5kcm9pZC5taworKysgYi90ZXN0cy90ZXN0cy9kcm0vQW5kcm9pZC5tawpAQCAtMjQsNyArMjQsOSBAQAogIyBhbmQgd2hlbiBidWlsdCBleHBsaWNpdGx5IHB1dCBpdCBpbiB0aGUgZGF0YSBwYXJ0aXRpb24KIExPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCiAKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjdHN0ZXN0cnVubmVyIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwgbGVnYWN5LWFuZHJvaWQtdGVzdAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGN0c3Rlc3RydW5uZXItYXh0IGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0CisKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIApAQCAtMzcsNyArMzksNyBAQAogCWxpYmN0c2RybV9qbmkgXAogCWxpYmRybXRlc3RwbHVnaW4KIAotTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorTE9DQUxfUFJJVkFURV9QTEFURk9STV9BUElTIDo9IHRydWUKIAogaW5jbHVkZSAkKEJVSUxEX0NUU19QQUNLQUdFKQogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9kcm0vQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL2RybS9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGM0ZWEwM2QuLjVkOGJiN2UgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2RybS9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL2RybS9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yMSw3ICsyMSw3IEBACiAgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgogICAgIDwvYXBwbGljYXRpb24+CiAKLSAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmRybS5jdHMiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgdGVzdHMgb2YgYW5kcm9pZC5kcm0iPgogICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0ibGlzdGVuZXIiCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9kcm0vQW5kcm9pZFRlc3QueG1sIGIvdGVzdHMvdGVzdHMvZHJtL0FuZHJvaWRUZXN0LnhtbAppbmRleCAxYTlkMGI3Li45OTZmM2YxIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9kcm0vQW5kcm9pZFRlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL2RybS9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBEUk0gdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9Im1lZGlhIiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9kcm0vam5pL0FuZHJvaWQubWsgYi90ZXN0cy90ZXN0cy9kcm0vam5pL0FuZHJvaWQubWsKaW5kZXggZmU5YTA0MS4uMTEzYmVmOCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZHJtL2puaS9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3Rlc3RzL2RybS9qbmkvQW5kcm9pZC5tawpAQCAtMzAsNiArMzAsNiBAQAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJsb2cgbGliZGwKIExPQ0FMX1NES19WRVJTSU9OIDo9IDIzCiAKLUxPQ0FMX0NGTEFHUyA6PSAtV25vLXVudXNlZC1wYXJhbWV0ZXIKK0xPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yIC1Xbm8tdW51c2VkLXBhcmFtZXRlcgogCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9keW5hbWljX2xpbmtlci9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvZHluYW1pY19saW5rZXIvQW5kcm9pZC5tawppbmRleCA5NzUxOGJkLi43ZDFkNTc0IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9keW5hbWljX2xpbmtlci9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3Rlc3RzL2R5bmFtaWNfbGlua2VyL0FuZHJvaWQubWsKQEAgLTE4LDYgKzE4LDcgQEAKIExPQ0FMX01PRFVMRSA6PSBsaWJkeW5hbWljbGlua2VyX25hdGl2ZV9saWJfYQogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIExPQ0FMX1NSQ19GSUxFUyA6PSBuYXRpdmVfbGliX2EuY3BwCitMT0NBTF9DRkxBR1MgOj0gLVdhbGwgLVdlcnJvcgogTE9DQUxfQ19JTkNMVURFUyA6PSAkKEpOSV9IX0lOQ0xVREUpCiBMT0NBTF9TREtfVkVSU0lPTiA6PSAyNQogTE9DQUxfTkRLX1NUTF9WQVJJQU5UIDo9IGMrK19zdGF0aWMKQEAgLTI4LDYgKzI5LDcgQEAKIExPQ0FMX01PRFVMRSA6PSBsaWJkeW5hbWljbGlua2VyX25hdGl2ZV9saWJfYgogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIExPQ0FMX1NSQ19GSUxFUyA6PSBuYXRpdmVfbGliX2IuY3BwCitMT0NBTF9DRkxBR1MgOj0gLVdhbGwgLVdlcnJvcgogTE9DQUxfQ19JTkNMVURFUyA6PSAkKEpOSV9IX0lOQ0xVREUpCiBMT0NBTF9TREtfVkVSU0lPTiA6PSAyNQogTE9DQUxfTkRLX1NUTF9WQVJJQU5UIDo9IGMrK19zdGF0aWMKQEAgLTM3LDcgKzM5LDcgQEAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIExPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY3RzdGVzdHJ1bm5lciBsZWdhY3ktYW5kcm9pZC10ZXN0CitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY3RzdGVzdHJ1bm5lci1heHQKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIC4pCiBMT0NBTF9NVUxUSUxJQiA6PSBib3RoCiBMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJkeW5hbWljbGlua2VyX25hdGl2ZV9saWJfYSBsaWJkeW5hbWljbGlua2VyX25hdGl2ZV9saWJfYgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZHluYW1pY19saW5rZXIvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL2R5bmFtaWNfbGlua2VyL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggZGI4MDk5ZS4uZDQxNzQ0OSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZHluYW1pY19saW5rZXIvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9keW5hbWljX2xpbmtlci9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yMiw1ICsyMiw1IEBACiAgICAgPC9hcHBsaWNhdGlvbj4KICAgICA8aW5zdHJ1bWVudGF0aW9uCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmFuZHJvaWQuZHluYW1pY2xpbmtlciIKLSAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIiAvPgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIgLz4KIDwvbWFuaWZlc3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZHluYW1pY19saW5rZXIvQW5kcm9pZFRlc3QueG1sIGIvdGVzdHMvdGVzdHMvZHluYW1pY19saW5rZXIvQW5kcm9pZFRlc3QueG1sCmluZGV4IDVjYzQzMTcuLjQ4M2FlMDMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2R5bmFtaWNfbGlua2VyL0FuZHJvaWRUZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9keW5hbWljX2xpbmtlci9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBkeW5hbWljIGxpbmtlciB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iYmlvbmljIiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9keW5hbWljX2xpbmtlci9jb20vYW5kcm9pZC9keW5hbWljbGlua2VyL0R5bmFtaWNMaW5rZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9keW5hbWljX2xpbmtlci9jb20vYW5kcm9pZC9keW5hbWljbGlua2VyL0R5bmFtaWNMaW5rZXJUZXN0LmphdmEKaW5kZXggZjBkN2M0Yi4uZjJlMTlmZSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZHluYW1pY19saW5rZXIvY29tL2FuZHJvaWQvZHluYW1pY2xpbmtlci9EeW5hbWljTGlua2VyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2R5bmFtaWNfbGlua2VyL2NvbS9hbmRyb2lkL2R5bmFtaWNsaW5rZXIvRHluYW1pY0xpbmtlclRlc3QuamF2YQpAQCAtMTYsOCArMTYsOSBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmR5bmFtaWNsaW5rZXI7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwogCiBwdWJsaWMgY2xhc3MgRHluYW1pY0xpbmtlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2VmZmVjdC9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvZWZmZWN0L0FuZHJvaWQubWsKaW5kZXggYWRmMmJhYS4uZjJmY2M5NCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZWZmZWN0L0FuZHJvaWQubWsKKysrIGIvdGVzdHMvdGVzdHMvZWZmZWN0L0FuZHJvaWQubWsKQEAgLTI0LDcgKzI0LDcgQEAKICMgV2hlbiBidWlsdCwgZXhwbGljaXRseSBwdXQgaXQgaW4gdGhlIGRhdGEgcGFydGl0aW9uLgogTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKIAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGN0c3Rlc3RydW5uZXIKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjdHN0ZXN0cnVubmVyLWF4dAogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2VmZmVjdC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdGVzdHMvZWZmZWN0L0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggODFmM2JiZi4uNTMyM2ZlNiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZWZmZWN0L0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvZWZmZWN0L0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTIyLDcgKzIyLDcgQEAKICAgICA8L2FwcGxpY2F0aW9uPgogCiAgICAgPCEtLSBUaGlzIGlzIGEgc2VsZi1pbnN0cnVtZW50aW5nIHRlc3QgcGFja2FnZS4gLS0+Ci0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5lZmZlY3QuY3RzIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIG9mIGFuZHJvaWQubWVkaWEuZWZmZWN0IGNvbXBvbmVudCI+CiAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJsaXN0ZW5lciIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2VmZmVjdC9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy90ZXN0cy9lZmZlY3QvQW5kcm9pZFRlc3QueG1sCmluZGV4IDA3MjAyOGIuLmFlMzJjZDUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2VmZmVjdC9BbmRyb2lkVGVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvZWZmZWN0L0FuZHJvaWRUZXN0LnhtbApAQCAtMTQsNiArMTQsNyBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIEVmZmVjdCB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0ibWVkaWEiIC8+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CiAgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2V4dGVybmFsc2VydmljZS9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvZXh0ZXJuYWxzZXJ2aWNlL0FuZHJvaWQubWsKaW5kZXggNjJhZmFhZC4uZDU1MTNlMyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZXh0ZXJuYWxzZXJ2aWNlL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvdGVzdHMvZXh0ZXJuYWxzZXJ2aWNlL0FuZHJvaWQubWsKQEAgLTI1LDcgKzI1LDkgQEAKIAogTE9DQUxfUFJPR1VBUkRfRU5BQkxFRCA6PSBkaXNhYmxlZAogCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gQ3RzRXh0ZXJuYWxTZXJ2aWNlQ29tbW9uIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwgY3RzdGVzdHJ1bm5lcgorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IEN0c0V4dGVybmFsU2VydmljZUNvbW1vbiBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBjdHN0ZXN0cnVubmVyLWF4dAorCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicwogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2V4dGVybmFsc2VydmljZS9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdGVzdHMvZXh0ZXJuYWxzZXJ2aWNlL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggMGM1ZWE1ZC4uYzVjNjU1ZSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZXh0ZXJuYWxzZXJ2aWNlL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvZXh0ZXJuYWxzZXJ2aWNlL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTIzLDcgKzIzLDcgQEAKICAgICA8L2FwcGxpY2F0aW9uPgogCiAgICAgPGluc3RydW1lbnRhdGlvbgotICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgZXh0ZXJuYWwgc2VydmljZSB0ZXN0cyIKICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmV4dGVybmFsc2VydmljZS5jdHMiID4KICAgICA8L2luc3RydW1lbnRhdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2V4dGVybmFsc2VydmljZS9zZXJ2aWNlL0FuZHJvaWQubWsgYi90ZXN0cy90ZXN0cy9leHRlcm5hbHNlcnZpY2Uvc2VydmljZS9BbmRyb2lkLm1rCmluZGV4IDlmYzAwMzMuLjQwMDg5MWUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2V4dGVybmFsc2VydmljZS9zZXJ2aWNlL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvdGVzdHMvZXh0ZXJuYWxzZXJ2aWNlL3NlcnZpY2UvQW5kcm9pZC5tawpAQCAtMjEsNyArMjEsMTEgQEAKICMgYW5kIHdoZW4gYnVpbHQgZXhwbGljaXRseSBwdXQgaXQgaW4gdGhlIGRhdGEgcGFydGl0aW9uCiBMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQogCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gQ3RzRXh0ZXJuYWxTZXJ2aWNlQ29tbW9uIGN0c3Rlc3RydW5uZXIgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKKyAgICBDdHNFeHRlcm5hbFNlcnZpY2VDb21tb24gXAorICAgIGN0c3Rlc3RydW5uZXItYXh0IFwKKyAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBcCisKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9leHRlcm5hbHNlcnZpY2Uvc2VydmljZS9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdGVzdHMvZXh0ZXJuYWxzZXJ2aWNlL3NlcnZpY2UvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCAwNmZhODBlLi43NGQwODI1IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9leHRlcm5hbHNlcnZpY2Uvc2VydmljZS9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL2V4dGVybmFsc2VydmljZS9zZXJ2aWNlL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTE5LDYgKzE5LDggQEAKICAgICBwYWNrYWdlPSJhbmRyb2lkLmV4dGVybmFsc2VydmljZS5zZXJ2aWNlIj4KIAogICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJFeHRlcm5hbCBTZXJ2aWNlIEhvc3QiPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKwogICAgICAgICA8IS0tIFNlcnZpY2UgdXNlZCB0byBzdGFydCAuRXh0ZXJuYWxTZXJ2aWNlIGZyb20gdGhpcyBwYWNrYWdlLiAtLT4KICAgICAgICAgPHNlcnZpY2UgYW5kcm9pZDpuYW1lPSIuU2VydmljZUNyZWF0b3IiCiAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aXNvbGF0ZWRQcm9jZXNzPSJmYWxzZSIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dlc3R1cmUvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL2dlc3R1cmUvQW5kcm9pZC5tawppbmRleCBiN2JkMDM2Li40YmU0YmVkIDEwMDc1NQotLS0gYS90ZXN0cy90ZXN0cy9nZXN0dXJlL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvdGVzdHMvZ2VzdHVyZS9BbmRyb2lkLm1rCkBAIC0yNywxMCArMjcsMTAgQEAKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC1zdXBwb3J0LXRlc3QKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkeC50ZXN0LnJ1bGVzCiAKICMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cyBjdHNfaW5zdGFudAogCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzR2VzdHVyZVRlc3RDYXNlcwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9nZXN0dXJlL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy90ZXN0cy9nZXN0dXJlL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggZmIzZWU1MS4uMjhhMmM3YSAxMDA3NTUKLS0tIGEvdGVzdHMvdGVzdHMvZ2VzdHVyZS9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL2dlc3R1cmUvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMTYsNyArMTYsOCBAQAogIC0tPgogCiA8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHBhY2thZ2U9ImFuZHJvaWQuZ2VzdHVyZS5jdHMiPgorICAgIHBhY2thZ2U9ImFuZHJvaWQuZ2VzdHVyZS5jdHMiCisgICAgYW5kcm9pZDp0YXJnZXRTYW5kYm94VmVyc2lvbj0iMiI+CiAKICAgICA8YXBwbGljYXRpb24+CiAgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgpAQCAtMjQsNyArMjUsNyBAQAogCiAgICAgPCEtLSAgc2VsZi1pbnN0cnVtZW50aW5nIHRlc3QgcGFja2FnZS4gLS0+CiAgICAgPGluc3RydW1lbnRhdGlvbgotICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuZ2VzdHVyZS5jdHMiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBvZiBhbmRyb2lkLmdlc3R1cmUiPgogICAgIDwvaW5zdHJ1bWVudGF0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ2VzdHVyZS9zcmMvYW5kcm9pZC9nZXN0dXJlL2N0cy9HZXN0dXJlVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvZ2VzdHVyZS9zcmMvYW5kcm9pZC9nZXN0dXJlL2N0cy9HZXN0dXJlVGVzdC5qYXZhCmluZGV4IDRkMzMwMjQuLjUyNGU5YTMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2dlc3R1cmUvc3JjL2FuZHJvaWQvZ2VzdHVyZS9jdHMvR2VzdHVyZVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9nZXN0dXJlL3NyYy9hbmRyb2lkL2dlc3R1cmUvY3RzL0dlc3R1cmVUZXN0LmphdmEKQEAgLTExMyw1ICsxMTMsNyBAQAogICAgICAgICBHZXN0dXJlIHJlYWRHZXN0dXJlID0gR2VzdHVyZS5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwocGFyY2VsKTsKICAgICAgICAgLy8gY2hlY2sgdGhhdCBhbGwgYXR0cmlidXRlcyBhcmUgZXF1YWwKICAgICAgICAgbmV3IEdlc3R1cmVDb21wYXJhdG9yKCkuYXNzZXJ0R2VzdHVyZXNFcXVhbHMobUdlc3R1cmUsIHJlYWRHZXN0dXJlKTsKKworICAgICAgICBwYXJjZWwucmVjeWNsZSgpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL0FuZHJvaWQubWsgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9BbmRyb2lkLm1rCmluZGV4IDdlYTVlZWMuLmQzZDEwNDYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvQW5kcm9pZC5tawpAQCAtMjAsMTcgKzIwLDE5IEBACiAKIExPQ0FMX01VTFRJTElCIDo9IGJvdGgKIAotTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lcgorTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lci5zdHVicyBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicwogCiBMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgKz0gXAotICAgIGFuZHJvaWQtc3VwcG9ydC10ZXN0IFwKKyAgICBhbmRyb2lkeC50ZXN0LnJ1bGVzIFwKICAgICBtb2NraXRvLXRhcmdldC1taW51cy1qdW5pdDQgXAotICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwgXAotICAgIGN0c2RldmljZXV0aWxsZWdhY3kgXAotICAgIGN0c3Rlc3RydW5uZXIgXAotICAgIGFuZHJvaWQtc3VwcG9ydC1hbm5vdGF0aW9ucyBcCi0gICAganVuaXQgXAotICAgIGxlZ2FjeS1hbmRyb2lkLXRlc3QKKyAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBcCisgICAgY3RzZGV2aWNldXRpbGxlZ2FjeS1heHQgXAorICAgIGN0c3Rlc3RydW5uZXItYXh0IFwKKyAgICBhbmRyb2lkeC5hbm5vdGF0aW9uX2Fubm90YXRpb24gXAorICAgIGp1bml0CisKK0xPQ0FMX1NUQVRJQ19BTkRST0lEX0xJQlJBUklFUyArPSBcCisgICAgYW5kcm9pZHguY29yZV9jb3JlCiAKIExPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmN0c2dyYXBoaWNzX2puaQogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCAyMDVlODFiLi5hZmNhNTcxIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTM2LDEyICszNiwyNyBAQAogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICA8L2FjdGl2aXR5PgogCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuZ3JhcGhpY3MuY3RzLlZ1bGthblByZVRyYW5zZm9ybUN0c0FjdGl2aXR5IgorICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iVnVsa2FuUHJlVHJhbnNmb3JtQ3RzQWN0aXZpdHkiCisgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5Ob1RpdGxlQmFyLkZ1bGxzY3JlZW4iPgorICAgICAgICA8L2FjdGl2aXR5PgorCiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuY3RzLkRyYXdhYmxlU3R1YkFjdGl2aXR5IgogICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQHN0eWxlL1doaXRlQmFja2dyb3VuZE5vV2luZG93QW5pbWF0aW9uIgogICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzY3JlZW5PcmllbnRhdGlvbj0ibG9ja2VkIi8+CisgICAgICAgIDxwcm92aWRlcgorICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC5jb3JlLmNvbnRlbnQuRmlsZVByb3ZpZGVyIgorICAgICAgICAgICAgYW5kcm9pZDphdXRob3JpdGllcz0iYW5kcm9pZC5ncmFwaGljcy5jdHMuZmlsZXByb3ZpZGVyIgorICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0iZmFsc2UiCisgICAgICAgICAgICBhbmRyb2lkOmdyYW50VXJpUGVybWlzc2lvbnM9InRydWUiCisgICAgICAgICAgICA+CisgICAgICAgICAgICA8bWV0YS1kYXRhCisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQuRklMRV9QUk9WSURFUl9QQVRIUyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnJlc291cmNlPSJAeG1sL2ZpbGVfcGF0aHMiIC8+CisgICAgICAgIDwvcHJvdmlkZXI+CiAgICAgPC9hcHBsaWNhdGlvbj4KIAotICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuZ3JhcGhpY3MuY3RzIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIG9mIGFuZHJvaWQuZ3JhcGhpY3MiPgogICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0ibGlzdGVuZXIiCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9BbmRyb2lkVGVzdC54bWwKaW5kZXggYmFhMWU3MC4uZjZlYjQ3ZiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvQW5kcm9pZFRlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL0FuZHJvaWRUZXN0LnhtbApAQCAtMTQsNiArMTQsNyBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIEdyYXBoaWNzIHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJ1aXRvb2xraXQiIC8+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CiAgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KQEAgLTIyLDUgKzIzLDYgQEAKICAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuQW5kcm9pZEpVbml0VGVzdCIgPgogICAgICAgICA8b3B0aW9uIG5hbWU9InBhY2thZ2UiIHZhbHVlPSJhbmRyb2lkLmdyYXBoaWNzLmN0cyIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJydW50aW1lLWhpbnQiIHZhbHVlPSI1bSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJoaWRkZW4tYXBpLWNoZWNrcyIgdmFsdWU9ImZhbHNlIiAvPgogICAgIDwvdGVzdD4KIDwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL2Fzc2V0cy9XZWlnaHRFcXVhbHNFbVZhcmlhYmxlRm9udC50dGYgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9hc3NldHMvV2VpZ2h0RXF1YWxzRW1WYXJpYWJsZUZvbnQudHRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ZGY0Y2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9hc3NldHMvV2VpZ2h0RXF1YWxzRW1WYXJpYWJsZUZvbnQudHRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL2Fzc2V0cy9XZWlnaHRFcXVhbHNFbVZhcmlhYmxlRm9udC50dHggYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9hc3NldHMvV2VpZ2h0RXF1YWxzRW1WYXJpYWJsZUZvbnQudHR4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlOGNkZWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9hc3NldHMvV2VpZ2h0RXF1YWxzRW1WYXJpYWJsZUZvbnQudHR4CkBAIC0wLDAgKzEsMjcwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8dHRGb250IHNmbnRWZXJzaW9uPSJceDAwXHgwMVx4MDBceDAwIiB0dExpYlZlcnNpb249IjMuMCI+CisKKyAgPEdseXBoT3JkZXI+CisgICAgPEdseXBoSUQgaWQ9IjAiIG5hbWU9Ii5ub3RkZWYiLz4KKyAgICA8R2x5cGhJRCBpZD0iMSIgbmFtZT0iMWVtIi8+CisgIDwvR2x5cGhPcmRlcj4KKworICA8aGVhZD4KKyAgICA8dGFibGVWZXJzaW9uIHZhbHVlPSIxLjAiLz4KKyAgICA8Zm9udFJldmlzaW9uIHZhbHVlPSIxLjAiLz4KKyAgICA8Y2hlY2tTdW1BZGp1c3RtZW50IHZhbHVlPSIweDY0MGNkYjJmIi8+CisgICAgPG1hZ2ljTnVtYmVyIHZhbHVlPSIweDVmMGYzY2Y1Ii8+CisgICAgPGZsYWdzIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAxMSIvPgorICAgIDx1bml0c1BlckVtIHZhbHVlPSIxMDAiLz4KKyAgICA8Y3JlYXRlZCB2YWx1ZT0iVGh1IEZlYiAyMiAxMDowNDoyOCAyMDE4Ii8+CisgICAgPG1hY1N0eWxlIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMCIvPgorICAgIDxsb3dlc3RSZWNQUEVNIHZhbHVlPSI3Ii8+CisgICAgPGZvbnREaXJlY3Rpb25IaW50IHZhbHVlPSIyIi8+CisgICAgPGdseXBoRGF0YUZvcm1hdCB2YWx1ZT0iMCIvPgorICA8L2hlYWQ+CisKKyAgPGhoZWE+CisgICAgPHRhYmxlVmVyc2lvbiB2YWx1ZT0iMHgwMDAxMDAwMCIvPgorICAgIDxhc2NlbnQgdmFsdWU9IjEwMCIvPgorICAgIDxkZXNjZW50IHZhbHVlPSIwIi8+CisgICAgPGxpbmVHYXAgdmFsdWU9IjAiLz4KKyAgICA8Y2FyZXRTbG9wZVJpc2UgdmFsdWU9IjEiLz4KKyAgICA8Y2FyZXRTbG9wZVJ1biB2YWx1ZT0iMCIvPgorICAgIDxjYXJldE9mZnNldCB2YWx1ZT0iMCIvPgorICAgIDxyZXNlcnZlZDAgdmFsdWU9IjAiLz4KKyAgICA8cmVzZXJ2ZWQxIHZhbHVlPSIwIi8+CisgICAgPHJlc2VydmVkMiB2YWx1ZT0iMCIvPgorICAgIDxyZXNlcnZlZDMgdmFsdWU9IjAiLz4KKyAgICA8bWV0cmljRGF0YUZvcm1hdCB2YWx1ZT0iMCIvPgorICA8L2hoZWE+CisKKyAgPG1heHA+CisgICAgPHRhYmxlVmVyc2lvbiB2YWx1ZT0iMHgxMDAwMCIvPgorICAgIDxtYXhab25lcyB2YWx1ZT0iMCIvPgorICAgIDxtYXhUd2lsaWdodFBvaW50cyB2YWx1ZT0iMCIvPgorICAgIDxtYXhTdG9yYWdlIHZhbHVlPSIwIi8+CisgICAgPG1heEZ1bmN0aW9uRGVmcyB2YWx1ZT0iMCIvPgorICAgIDxtYXhJbnN0cnVjdGlvbkRlZnMgdmFsdWU9IjAiLz4KKyAgICA8bWF4U3RhY2tFbGVtZW50cyB2YWx1ZT0iMCIvPgorICAgIDxtYXhTaXplT2ZJbnN0cnVjdGlvbnMgdmFsdWU9IjAiLz4KKyAgICA8bWF4Q29tcG9uZW50RWxlbWVudHMgdmFsdWU9IjAiLz4KKyAgPC9tYXhwPgorCisgIDxPU18yPgorICAgIDwhLS0gVGhlIGZpZWxkcyAndXNGaXJzdENoYXJJbmRleCcgYW5kICd1c0xhc3RDaGFySW5kZXgnCisgICAgICAgICB3aWxsIGJlIHJlY2FsY3VsYXRlZCBieSB0aGUgY29tcGlsZXIgLS0+CisgICAgPHZlcnNpb24gdmFsdWU9IjMiLz4KKyAgICA8eEF2Z0NoYXJXaWR0aCB2YWx1ZT0iNTk0Ii8+CisgICAgPHVzV2VpZ2h0Q2xhc3MgdmFsdWU9IjEwMCIvPgorICAgIDx1c1dpZHRoQ2xhc3MgdmFsdWU9IjUiLz4KKyAgICA8ZnNUeXBlIHZhbHVlPSIwMDAwMDAwMCAwMDAwMTAwMCIvPgorICAgIDx5U3Vic2NyaXB0WFNpemUgdmFsdWU9IjY1MCIvPgorICAgIDx5U3Vic2NyaXB0WVNpemUgdmFsdWU9IjYwMCIvPgorICAgIDx5U3Vic2NyaXB0WE9mZnNldCB2YWx1ZT0iMCIvPgorICAgIDx5U3Vic2NyaXB0WU9mZnNldCB2YWx1ZT0iNzUiLz4KKyAgICA8eVN1cGVyc2NyaXB0WFNpemUgdmFsdWU9IjY1MCIvPgorICAgIDx5U3VwZXJzY3JpcHRZU2l6ZSB2YWx1ZT0iNjAwIi8+CisgICAgPHlTdXBlcnNjcmlwdFhPZmZzZXQgdmFsdWU9IjAiLz4KKyAgICA8eVN1cGVyc2NyaXB0WU9mZnNldCB2YWx1ZT0iMzUwIi8+CisgICAgPHlTdHJpa2VvdXRTaXplIHZhbHVlPSI1MCIvPgorICAgIDx5U3RyaWtlb3V0UG9zaXRpb24gdmFsdWU9IjMwMCIvPgorICAgIDxzRmFtaWx5Q2xhc3MgdmFsdWU9IjAiLz4KKyAgICA8cGFub3NlPgorICAgICAgPGJGYW1pbHlUeXBlIHZhbHVlPSIwIi8+CisgICAgICA8YlNlcmlmU3R5bGUgdmFsdWU9IjAiLz4KKyAgICAgIDxiV2VpZ2h0IHZhbHVlPSI1Ii8+CisgICAgICA8YlByb3BvcnRpb24gdmFsdWU9IjAiLz4KKyAgICAgIDxiQ29udHJhc3QgdmFsdWU9IjAiLz4KKyAgICAgIDxiU3Ryb2tlVmFyaWF0aW9uIHZhbHVlPSIwIi8+CisgICAgICA8YkFybVN0eWxlIHZhbHVlPSIwIi8+CisgICAgICA8YkxldHRlckZvcm0gdmFsdWU9IjAiLz4KKyAgICAgIDxiTWlkbGluZSB2YWx1ZT0iMCIvPgorICAgICAgPGJYSGVpZ2h0IHZhbHVlPSIwIi8+CisgICAgPC9wYW5vc2U+CisgICAgPHVsVW5pY29kZVJhbmdlMSB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDEiLz4KKyAgICA8dWxVbmljb2RlUmFuZ2UyIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCIvPgorICAgIDx1bFVuaWNvZGVSYW5nZTMgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIi8+CisgICAgPHVsVW5pY29kZVJhbmdlNCB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAiLz4KKyAgICA8YWNoVmVuZElEIHZhbHVlPSJVS1dOIi8+CisgICAgPGZzU2VsZWN0aW9uIHZhbHVlPSIwMDAwMDAwMCAwMTAwMDAwMCIvPgorICAgIDx1c0ZpcnN0Q2hhckluZGV4IHZhbHVlPSIzMiIvPgorICAgIDx1c0xhc3RDaGFySW5kZXggdmFsdWU9IjEyMiIvPgorICAgIDxzVHlwb0FzY2VuZGVyIHZhbHVlPSI4MDAiLz4KKyAgICA8c1R5cG9EZXNjZW5kZXIgdmFsdWU9Ii0yMDAiLz4KKyAgICA8c1R5cG9MaW5lR2FwIHZhbHVlPSIyMDAiLz4KKyAgICA8dXNXaW5Bc2NlbnQgdmFsdWU9IjEwMDAiLz4KKyAgICA8dXNXaW5EZXNjZW50IHZhbHVlPSIyMDAiLz4KKyAgICA8dWxDb2RlUGFnZVJhbmdlMSB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDEiLz4KKyAgICA8dWxDb2RlUGFnZVJhbmdlMiB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAiLz4KKyAgICA8c3hIZWlnaHQgdmFsdWU9IjUwMCIvPgorICAgIDxzQ2FwSGVpZ2h0IHZhbHVlPSI3MDAiLz4KKyAgICA8dXNEZWZhdWx0Q2hhciB2YWx1ZT0iMCIvPgorICAgIDx1c0JyZWFrQ2hhciB2YWx1ZT0iMzIiLz4KKyAgICA8dXNNYXhDb250ZXh0IHZhbHVlPSIwIi8+CisgIDwvT1NfMj4KKworICA8aG10eD4KKyAgICA8bXR4IG5hbWU9Ii5ub3RkZWYiIHdpZHRoPSI1MCIgbHNiPSI5MyIvPgorICAgIDxtdHggbmFtZT0iMWVtIiB3aWR0aD0iMCIgbHNiPSIwIi8+CisgIDwvaG10eD4KKworICA8Y21hcD4KKyAgICA8dGFibGVWZXJzaW9uIHZlcnNpb249IjAiLz4KKyAgICA8Y21hcF9mb3JtYXRfNCBwbGF0Zm9ybUlEPSIwIiBwbGF0RW5jSUQ9IjMiIGxhbmd1YWdlPSIwIj4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjEiIG5hbWU9IjFlbSIgLz4gPCEtLSBhIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2MiIgbmFtZT0iMWVtIiAvPiA8IS0tIGIgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDYzIiBuYW1lPSIxZW0iIC8+IDwhLS0gYyAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjQiIG5hbWU9IjFlbSIgLz4gPCEtLSBkIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2NSIgbmFtZT0iMWVtIiAvPiA8IS0tIGUgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDY2IiBuYW1lPSIxZW0iIC8+IDwhLS0gZiAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjciIG5hbWU9IjFlbSIgLz4gPCEtLSBnIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2OCIgbmFtZT0iMWVtIiAvPiA8IS0tIGggLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDY5IiBuYW1lPSIxZW0iIC8+IDwhLS0gaSAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNkEiIG5hbWU9IjFlbSIgLz4gPCEtLSBqIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2QiIgbmFtZT0iMWVtIiAvPiA8IS0tIGsgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDZDIiBuYW1lPSIxZW0iIC8+IDwhLS0gbCAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNkQiIG5hbWU9IjFlbSIgLz4gPCEtLSBtIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2RSIgbmFtZT0iMWVtIiAvPiA8IS0tIG4gLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDZGIiBuYW1lPSIxZW0iIC8+IDwhLS0gbyAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzAiIG5hbWU9IjFlbSIgLz4gPCEtLSBwIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3MSIgbmFtZT0iMWVtIiAvPiA8IS0tIHEgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDcyIiBuYW1lPSIxZW0iIC8+IDwhLS0gciAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzMiIG5hbWU9IjFlbSIgLz4gPCEtLSBzIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3NCIgbmFtZT0iMWVtIiAvPiA8IS0tIHQgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDc1IiBuYW1lPSIxZW0iIC8+IDwhLS0gdSAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzYiIG5hbWU9IjFlbSIgLz4gPCEtLSB2IC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3NyIgbmFtZT0iMWVtIiAvPiA8IS0tIHcgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDc4IiBuYW1lPSIxZW0iIC8+IDwhLS0geCAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzkiIG5hbWU9IjFlbSIgLz4gPCEtLSB5IC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3QSIgbmFtZT0iMWVtIiAvPiA8IS0tIHogLS0+CisgICAgPC9jbWFwX2Zvcm1hdF80PgorICA8L2NtYXA+CisKKyAgPGxvY2E+CisgICAgPCEtLSBUaGUgJ2xvY2EnIHRhYmxlIHdpbGwgYmUgY2FsY3VsYXRlZCBieSB0aGUgY29tcGlsZXIgLS0+CisgIDwvbG9jYT4KKworICA8Z2x5Zj4KKyAgICA8VFRHbHlwaCBuYW1lPSIubm90ZGVmIiB4TWluPSIwIiB5TWluPSIwIiB4TWF4PSIwIiB5TWF4PSIwIiAvPgorICAgIDxUVEdseXBoIG5hbWU9IjFlbSIgeE1pbj0iMCIgeU1pbj0iMCIgeE1heD0iMTAwIiB5TWF4PSIxMDAiPgorICAgICAgPGNvbnRvdXI+CisgICAgICAgIDxwdCB4PSIwIiB5PSIwIiBvbj0iMSIvPgorICAgICAgICA8cHQgeD0iMCIgeT0iNTAiIG9uPSIxIi8+CisgICAgICAgIDxwdCB4PSIwIiB5PSIxMDAiIG9uPSIxIi8+CisgICAgICA8L2NvbnRvdXI+CisgICAgICA8aW5zdHJ1Y3Rpb25zIC8+CisgICAgPC9UVEdseXBoPgorICA8L2dseWY+CisKKyAgPEhWQVI+CisgICAgPFZlcnNpb24gdmFsdWU9IjB4MDAwMTAwMDAiLz4KKyAgICA8VmFyU3RvcmUgRm9ybWF0PSIxIj4KKyAgICAgIDxGb3JtYXQgdmFsdWU9IjEiIC8+CisgICAgICA8VmFyUmVnaW9uTGlzdD4KKyAgICAgICAgPFJlZ2lvbiBpbmRleD0iMCI+CisgICAgICAgICAgPFZhclJlZ2lvbkF4aXMgaW5kZXg9IjAiPgorICAgICAgICAgICAgPFN0YXJ0Q29vcmQgdmFsdWU9IjAiIC8+CisgICAgICAgICAgICA8UGVha0Nvb3JkIHZhbHVlPSIxLjAiIC8+CisgICAgICAgICAgICA8RW5kQ29vcmQgdmFsdWU9IjEuMCIgLz4KKyAgICAgICAgICA8L1ZhclJlZ2lvbkF4aXM+CisgICAgICAgIDwvUmVnaW9uPgorICAgICAgPC9WYXJSZWdpb25MaXN0PgorICAgICAgPFZhckRhdGEgaW5kZXg9IjAiPgorICAgICAgICA8TnVtU2hvcnRzIHZhbHVlPSIwIiAvPgorICAgICAgICA8VmFyUmVnaW9uSW5kZXggaW5kZXg9IjAiIHZhbHVlPSIwIiAvPgorICAgICAgICA8SXRlbSBpbmRleD0iMCIgdmFsdWU9IlsxMDBdIiAvPgorICAgICAgPC9WYXJEYXRhPgorICAgIDwvVmFyU3RvcmU+CisgICAgPEFkdldpZHRoTWFwPgorICAgICAgPE1hcCBpbmRleD0iMCIgb3V0ZXI9IjAiIGlubmVyPSIwIiAvPgorICAgICAgPE1hcCBpbmRleD0iMSIgb3V0ZXI9IjAiIGlubmVyPSIwIiAvPgorICAgICAgPE1hcCBpbmRleD0iMiIgb3V0ZXI9IjAiIGlubmVyPSIwIiAvPgorICAgIDwvQWR2V2lkdGhNYXA+CisgIDwvSFZBUj4KKworICA8ZnZhcj4KKyAgICA8QXhpcz4KKyAgICAgIDxBeGlzVGFnPndnaHQ8L0F4aXNUYWc+CisgICAgICA8RmxhZ3M+MHgwPC9GbGFncz4KKyAgICAgIDxNaW5WYWx1ZT4wLjA8L01pblZhbHVlPgorICAgICAgPERlZmF1bHRWYWx1ZT4wLjA8L0RlZmF1bHRWYWx1ZT4KKyAgICAgIDxNYXhWYWx1ZT4xMDAwLjA8L01heFZhbHVlPgorICAgICAgPEF4aXNOYW1lSUQ+MjU2PC9BeGlzTmFtZUlEPgorICAgIDwvQXhpcz4KKyAgPC9mdmFyPgorCisgIDxndmFyPgorICAgIDx2ZXJzaW9uIHZhbHVlPSIxIiAvPgorICAgIDxyZXNlcnZlZCB2YWx1ZT0iMCIgLz4KKyAgICA8Z2x5cGhWYXJpYXRpb25zIGdseXBoPSIxZW0iPgorICAgICAgPHR1cGxlPgorICAgICAgICA8Y29vcmQgYXhpcz0id2dodCIgdmFsdWU9IjEuMCIgLz4KKyAgICAgICAgPGRlbHRhIHB0PSIwIiB4PSIwIiB5PSIwIiAvPgorICAgICAgICA8ZGVsdGEgcHQ9IjEiIHg9IjEwMCIgeT0iMCIgLz4KKyAgICAgICAgPGRlbHRhIHB0PSIyIiB4PSIwIiB5PSIwIiAvPgorICAgICAgICA8IS0tIGRlbHRhcyBmb3IgcGhhbnRvbSBwb2ludHMgLS0+CisgICAgICAgIDxkZWx0YSBwdD0iMyIgeD0iMCIgeT0iMCIgLz4gIDwhLS0gKGxlZnQsIDApIC0tPgorICAgICAgICA8ZGVsdGEgcHQ9IjQiIHg9IjEwMCIgeT0iMCIgLz4gIDwhLS0gKHJpZ2h0LCAwKSAtLT4KKyAgICAgICAgPGRlbHRhIHB0PSI1IiB4PSIwIiB5PSIwIiAvPiAgPCEtLSAoMCwgdG9wKSAtLT4KKyAgICAgICAgPGRlbHRhIHB0PSI2IiB4PSIwIiB5PSIwIiAvPiAgPCEtLSAoMCwgYm90dG9tKSAtLT4KKyAgICAgIDwvdHVwbGU+CisgICAgPC9nbHlwaFZhcmlhdGlvbnM+CisgIDwvZ3Zhcj4KKworICA8bmFtZT4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjAiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjEiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBTYW1wbGUgRm9udAorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjIiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBSZWd1bGFyCisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iNCIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIFNhbXBsZSBGb250CisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iNiIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIFNhbXBsZUZvbnQtUmVndWxhcgorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjEzIiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjE0IiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iMjU2IiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgV2VpZ2h0CisgICAgPC9uYW1lcmVjb3JkPgorICA8L25hbWU+CisKKyAgPHBvc3Q+CisgICAgPGZvcm1hdFR5cGUgdmFsdWU9IjMuMCIvPgorICAgIDxpdGFsaWNBbmdsZSB2YWx1ZT0iMC4wIi8+CisgICAgPHVuZGVybGluZVBvc2l0aW9uIHZhbHVlPSItNzUiLz4KKyAgICA8dW5kZXJsaW5lVGhpY2tuZXNzIHZhbHVlPSI1MCIvPgorICAgIDxpc0ZpeGVkUGl0Y2ggdmFsdWU9IjAiLz4KKyAgICA8bWluTWVtVHlwZTQyIHZhbHVlPSIwIi8+CisgICAgPG1heE1lbVR5cGU0MiB2YWx1ZT0iMCIvPgorICAgIDxtaW5NZW1UeXBlMSB2YWx1ZT0iMCIvPgorICAgIDxtYXhNZW1UeXBlMSB2YWx1ZT0iMCIvPgorICA8L3Bvc3Q+CisKKzwvdHRGb250PgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvYXNzZXRzL2EzZW0udHR4IGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvYXNzZXRzL2EzZW0udHR4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzYjllMTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9hc3NldHMvYTNlbS50dHgKQEAgLTAsMCArMSwxODcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzx0dEZvbnQgc2ZudFZlcnNpb249Ilx4MDBceDAxXHgwMFx4MDAiIHR0TGliVmVyc2lvbj0iMy4wIj4KKworICA8R2x5cGhPcmRlcj4KKyAgICA8R2x5cGhJRCBpZD0iMCIgbmFtZT0iLm5vdGRlZiIvPgorICAgIDxHbHlwaElEIGlkPSIxIiBuYW1lPSIxZW0iLz4KKyAgICA8R2x5cGhJRCBpZD0iMiIgbmFtZT0iM2VtIi8+CisgIDwvR2x5cGhPcmRlcj4KKworICA8aGVhZD4KKyAgICA8dGFibGVWZXJzaW9uIHZhbHVlPSIxLjAiLz4KKyAgICA8Zm9udFJldmlzaW9uIHZhbHVlPSIxLjAiLz4KKyAgICA8Y2hlY2tTdW1BZGp1c3RtZW50IHZhbHVlPSIweDY0MGNkYjJmIi8+CisgICAgPG1hZ2ljTnVtYmVyIHZhbHVlPSIweDVmMGYzY2Y1Ii8+CisgICAgPGZsYWdzIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAxMSIvPgorICAgIDx1bml0c1BlckVtIHZhbHVlPSIxMDAwIi8+CisgICAgPGNyZWF0ZWQgdmFsdWU9IkZyaSBNYXIgMTcgMDc6MjY6MDAgMjAxNyIvPgorICAgIDxtYWNTdHlsZSB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAiLz4KKyAgICA8bG93ZXN0UmVjUFBFTSB2YWx1ZT0iNyIvPgorICAgIDxmb250RGlyZWN0aW9uSGludCB2YWx1ZT0iMiIvPgorICAgIDxnbHlwaERhdGFGb3JtYXQgdmFsdWU9IjAiLz4KKyAgPC9oZWFkPgorCisgIDxoaGVhPgorICAgIDx0YWJsZVZlcnNpb24gdmFsdWU9IjEuMCIvPgorICAgIDxhc2NlbnQgdmFsdWU9IjEwMDAiLz4KKyAgICA8ZGVzY2VudCB2YWx1ZT0iLTIwMCIvPgorICAgIDxsaW5lR2FwIHZhbHVlPSIwIi8+CisgICAgPGNhcmV0U2xvcGVSaXNlIHZhbHVlPSIxIi8+CisgICAgPGNhcmV0U2xvcGVSdW4gdmFsdWU9IjAiLz4KKyAgICA8Y2FyZXRPZmZzZXQgdmFsdWU9IjAiLz4KKyAgICA8cmVzZXJ2ZWQwIHZhbHVlPSIwIi8+CisgICAgPHJlc2VydmVkMSB2YWx1ZT0iMCIvPgorICAgIDxyZXNlcnZlZDIgdmFsdWU9IjAiLz4KKyAgICA8cmVzZXJ2ZWQzIHZhbHVlPSIwIi8+CisgICAgPG1ldHJpY0RhdGFGb3JtYXQgdmFsdWU9IjAiLz4KKyAgPC9oaGVhPgorCisgIDxtYXhwPgorICAgIDx0YWJsZVZlcnNpb24gdmFsdWU9IjB4MTAwMDAiLz4KKyAgICA8bWF4Wm9uZXMgdmFsdWU9IjAiLz4KKyAgICA8bWF4VHdpbGlnaHRQb2ludHMgdmFsdWU9IjAiLz4KKyAgICA8bWF4U3RvcmFnZSB2YWx1ZT0iMCIvPgorICAgIDxtYXhGdW5jdGlvbkRlZnMgdmFsdWU9IjAiLz4KKyAgICA8bWF4SW5zdHJ1Y3Rpb25EZWZzIHZhbHVlPSIwIi8+CisgICAgPG1heFN0YWNrRWxlbWVudHMgdmFsdWU9IjAiLz4KKyAgICA8bWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zIHZhbHVlPSIwIi8+CisgICAgPG1heENvbXBvbmVudEVsZW1lbnRzIHZhbHVlPSIwIi8+CisgIDwvbWF4cD4KKworICA8T1NfMj4KKyAgICA8IS0tIFRoZSBmaWVsZHMgJ3VzRmlyc3RDaGFySW5kZXgnIGFuZCAndXNMYXN0Q2hhckluZGV4JworICAgICAgICAgd2lsbCBiZSByZWNhbGN1bGF0ZWQgYnkgdGhlIGNvbXBpbGVyIC0tPgorICAgIDx2ZXJzaW9uIHZhbHVlPSIzIi8+CisgICAgPHhBdmdDaGFyV2lkdGggdmFsdWU9IjU5NCIvPgorICAgIDx1c1dlaWdodENsYXNzIHZhbHVlPSI0MDAiLz4KKyAgICA8dXNXaWR0aENsYXNzIHZhbHVlPSI1Ii8+CisgICAgPGZzVHlwZSB2YWx1ZT0iMDAwMDAwMDAgMDAwMDEwMDAiLz4KKyAgICA8eVN1YnNjcmlwdFhTaXplIHZhbHVlPSI2NTAiLz4KKyAgICA8eVN1YnNjcmlwdFlTaXplIHZhbHVlPSI2MDAiLz4KKyAgICA8eVN1YnNjcmlwdFhPZmZzZXQgdmFsdWU9IjAiLz4KKyAgICA8eVN1YnNjcmlwdFlPZmZzZXQgdmFsdWU9Ijc1Ii8+CisgICAgPHlTdXBlcnNjcmlwdFhTaXplIHZhbHVlPSI2NTAiLz4KKyAgICA8eVN1cGVyc2NyaXB0WVNpemUgdmFsdWU9IjYwMCIvPgorICAgIDx5U3VwZXJzY3JpcHRYT2Zmc2V0IHZhbHVlPSIwIi8+CisgICAgPHlTdXBlcnNjcmlwdFlPZmZzZXQgdmFsdWU9IjM1MCIvPgorICAgIDx5U3RyaWtlb3V0U2l6ZSB2YWx1ZT0iNTAiLz4KKyAgICA8eVN0cmlrZW91dFBvc2l0aW9uIHZhbHVlPSIzMDAiLz4KKyAgICA8c0ZhbWlseUNsYXNzIHZhbHVlPSIwIi8+CisgICAgPHBhbm9zZT4KKyAgICAgIDxiRmFtaWx5VHlwZSB2YWx1ZT0iMCIvPgorICAgICAgPGJTZXJpZlN0eWxlIHZhbHVlPSIwIi8+CisgICAgICA8YldlaWdodCB2YWx1ZT0iNSIvPgorICAgICAgPGJQcm9wb3J0aW9uIHZhbHVlPSIwIi8+CisgICAgICA8YkNvbnRyYXN0IHZhbHVlPSIwIi8+CisgICAgICA8YlN0cm9rZVZhcmlhdGlvbiB2YWx1ZT0iMCIvPgorICAgICAgPGJBcm1TdHlsZSB2YWx1ZT0iMCIvPgorICAgICAgPGJMZXR0ZXJGb3JtIHZhbHVlPSIwIi8+CisgICAgICA8Yk1pZGxpbmUgdmFsdWU9IjAiLz4KKyAgICAgIDxiWEhlaWdodCB2YWx1ZT0iMCIvPgorICAgIDwvcGFub3NlPgorICAgIDx1bFVuaWNvZGVSYW5nZTEgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAxIi8+CisgICAgPHVsVW5pY29kZVJhbmdlMiB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAiLz4KKyAgICA8dWxVbmljb2RlUmFuZ2UzIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCIvPgorICAgIDx1bFVuaWNvZGVSYW5nZTQgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIi8+CisgICAgPGFjaFZlbmRJRCB2YWx1ZT0iVUtXTiIvPgorICAgIDxmc1NlbGVjdGlvbiB2YWx1ZT0iMDAwMDAwMDAgMDEwMDAwMDAiLz4KKyAgICA8dXNGaXJzdENoYXJJbmRleCB2YWx1ZT0iMzIiLz4KKyAgICA8dXNMYXN0Q2hhckluZGV4IHZhbHVlPSIxMjIiLz4KKyAgICA8c1R5cG9Bc2NlbmRlciB2YWx1ZT0iODAwIi8+CisgICAgPHNUeXBvRGVzY2VuZGVyIHZhbHVlPSItMjAwIi8+CisgICAgPHNUeXBvTGluZUdhcCB2YWx1ZT0iMjAwIi8+CisgICAgPHVzV2luQXNjZW50IHZhbHVlPSIxMDAwIi8+CisgICAgPHVzV2luRGVzY2VudCB2YWx1ZT0iMjAwIi8+CisgICAgPHVsQ29kZVBhZ2VSYW5nZTEgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAxIi8+CisgICAgPHVsQ29kZVBhZ2VSYW5nZTIgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIi8+CisgICAgPHN4SGVpZ2h0IHZhbHVlPSI1MDAiLz4KKyAgICA8c0NhcEhlaWdodCB2YWx1ZT0iNzAwIi8+CisgICAgPHVzRGVmYXVsdENoYXIgdmFsdWU9IjAiLz4KKyAgICA8dXNCcmVha0NoYXIgdmFsdWU9IjMyIi8+CisgICAgPHVzTWF4Q29udGV4dCB2YWx1ZT0iMCIvPgorICA8L09TXzI+CisKKyAgPGhtdHg+CisgICAgPG10eCBuYW1lPSIubm90ZGVmIiB3aWR0aD0iNTAwIiBsc2I9IjkzIi8+CisgICAgPG10eCBuYW1lPSIxZW0iIHdpZHRoPSIxMDAwIiBsc2I9IjkzIi8+CisgICAgPG10eCBuYW1lPSIzZW0iIHdpZHRoPSIzMDAwIiBsc2I9IjkzIi8+CisgIDwvaG10eD4KKworICA8Y21hcD4KKyAgICA8dGFibGVWZXJzaW9uIHZlcnNpb249IjAiLz4KKyAgICA8Y21hcF9mb3JtYXRfNCBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEwIiBsYW5ndWFnZT0iMCI+CisgICAgICA8bWFwIGNvZGU9IjB4MDA2MSIgbmFtZT0iM2VtIiAvPgorICAgICAgPG1hcCBjb2RlPSIweDAwNjIiIG5hbWU9IjFlbSIgLz4KKyAgICAgIDxtYXAgY29kZT0iMHgwMDYzIiBuYW1lPSIxZW0iIC8+CisgICAgICA8bWFwIGNvZGU9IjB4MDA2NCIgbmFtZT0iMWVtIiAvPgorICAgICAgPG1hcCBjb2RlPSIweDAwNjUiIG5hbWU9IjFlbSIgLz4KKyAgICA8L2NtYXBfZm9ybWF0XzQ+CisgIDwvY21hcD4KKworICA8bG9jYT4KKyAgICA8IS0tIFRoZSAnbG9jYScgdGFibGUgd2lsbCBiZSBjYWxjdWxhdGVkIGJ5IHRoZSBjb21waWxlciAtLT4KKyAgPC9sb2NhPgorCisgIDxnbHlmPgorICAgIDxUVEdseXBoIG5hbWU9Ii5ub3RkZWYiIHhNaW49IjAiIHlNaW49IjAiIHhNYXg9IjAiIHlNYXg9IjAiIC8+CisgICAgPFRUR2x5cGggbmFtZT0iMWVtIiB4TWluPSIwIiB5TWluPSIwIiB4TWF4PSIwIiB5TWF4PSIwIiAvPgorICAgIDxUVEdseXBoIG5hbWU9IjNlbSIgeE1pbj0iMCIgeU1pbj0iMCIgeE1heD0iMCIgeU1heD0iMCIgLz4KKyAgPC9nbHlmPgorCisgIDxuYW1lPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iMCIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iMSIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIFNhbXBsZSBGb250CisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iMiIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIFJlZ3VsYXIKKyAgICA8L25hbWVyZWNvcmQ+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSI0IiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgU2FtcGxlIEZvbnQKKyAgICA8L25hbWVyZWNvcmQ+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSI2IiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgU2FtcGxlRm9udC1SZWd1bGFyCisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iMTMiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iMTQiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICA8L25hbWVyZWNvcmQ+CisgIDwvbmFtZT4KKworICA8cG9zdD4KKyAgICA8Zm9ybWF0VHlwZSB2YWx1ZT0iMy4wIi8+CisgICAgPGl0YWxpY0FuZ2xlIHZhbHVlPSIwLjAiLz4KKyAgICA8dW5kZXJsaW5lUG9zaXRpb24gdmFsdWU9Ii03NSIvPgorICAgIDx1bmRlcmxpbmVUaGlja25lc3MgdmFsdWU9IjUwIi8+CisgICAgPGlzRml4ZWRQaXRjaCB2YWx1ZT0iMCIvPgorICAgIDxtaW5NZW1UeXBlNDIgdmFsdWU9IjAiLz4KKyAgICA8bWF4TWVtVHlwZTQyIHZhbHVlPSIwIi8+CisgICAgPG1pbk1lbVR5cGUxIHZhbHVlPSIwIi8+CisgICAgPG1heE1lbVR5cGUxIHZhbHVlPSIwIi8+CisgIDwvcG9zdD4KKworPC90dEZvbnQ+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9hc3NldHMvYXNjaWlfYTNlbV93ZWlnaHQxMDBfdXByaWdodC50dGYgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9hc3NldHMvYXNjaWlfYTNlbV93ZWlnaHQxMDBfdXByaWdodC50dGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdjZjBjNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL2Fzc2V0cy9hc2NpaV9hM2VtX3dlaWdodDEwMF91cHJpZ2h0LnR0ZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9hc3NldHMvYXNjaWlfYTNlbV93ZWlnaHQxMDBfdXByaWdodC50dHggYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9hc3NldHMvYXNjaWlfYTNlbV93ZWlnaHQxMDBfdXByaWdodC50dHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc0MDg3YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL2Fzc2V0cy9hc2NpaV9hM2VtX3dlaWdodDEwMF91cHJpZ2h0LnR0eApAQCAtMCwwICsxLDIwOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUworICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHR0Rm9udCBzZm50VmVyc2lvbj0iXHgwMFx4MDFceDAwXHgwMCIgdHRMaWJWZXJzaW9uPSIzLjAiPgorCisgIDxHbHlwaE9yZGVyPgorICAgIDxHbHlwaElEIGlkPSIwIiBuYW1lPSIubm90ZGVmIi8+CisgICAgPEdseXBoSUQgaWQ9IjEiIG5hbWU9IjFlbSIvPgorICAgIDxHbHlwaElEIGlkPSIyIiBuYW1lPSIzZW0iLz4KKyAgPC9HbHlwaE9yZGVyPgorCisgIDxoZWFkPgorICAgIDx0YWJsZVZlcnNpb24gdmFsdWU9IjEuMCIvPgorICAgIDxmb250UmV2aXNpb24gdmFsdWU9IjEuMCIvPgorICAgIDxjaGVja1N1bUFkanVzdG1lbnQgdmFsdWU9IjB4NjQwY2RiMmYiLz4KKyAgICA8bWFnaWNOdW1iZXIgdmFsdWU9IjB4NWYwZjNjZjUiLz4KKyAgICA8ZmxhZ3MgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDExIi8+CisgICAgPHVuaXRzUGVyRW0gdmFsdWU9IjEwMDAiLz4KKyAgICA8Y3JlYXRlZCB2YWx1ZT0iVGh1IEZlYiAyMiAxMDowNDoyOCAyMDE4Ii8+CisgICAgPG1hY1N0eWxlIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMCIvPgorICAgIDxsb3dlc3RSZWNQUEVNIHZhbHVlPSI3Ii8+CisgICAgPGZvbnREaXJlY3Rpb25IaW50IHZhbHVlPSIyIi8+CisgICAgPGdseXBoRGF0YUZvcm1hdCB2YWx1ZT0iMCIvPgorICA8L2hlYWQ+CisKKyAgPGhoZWE+CisgICAgPHRhYmxlVmVyc2lvbiB2YWx1ZT0iMHgwMDAxMDAwMCIvPgorICAgIDxhc2NlbnQgdmFsdWU9IjEwMDAiLz4KKyAgICA8ZGVzY2VudCB2YWx1ZT0iLTIwMCIvPgorICAgIDxsaW5lR2FwIHZhbHVlPSIwIi8+CisgICAgPGNhcmV0U2xvcGVSaXNlIHZhbHVlPSIxIi8+CisgICAgPGNhcmV0U2xvcGVSdW4gdmFsdWU9IjAiLz4KKyAgICA8Y2FyZXRPZmZzZXQgdmFsdWU9IjAiLz4KKyAgICA8cmVzZXJ2ZWQwIHZhbHVlPSIwIi8+CisgICAgPHJlc2VydmVkMSB2YWx1ZT0iMCIvPgorICAgIDxyZXNlcnZlZDIgdmFsdWU9IjAiLz4KKyAgICA8cmVzZXJ2ZWQzIHZhbHVlPSIwIi8+CisgICAgPG1ldHJpY0RhdGFGb3JtYXQgdmFsdWU9IjAiLz4KKyAgPC9oaGVhPgorCisgIDxtYXhwPgorICAgIDx0YWJsZVZlcnNpb24gdmFsdWU9IjB4MTAwMDAiLz4KKyAgICA8bWF4Wm9uZXMgdmFsdWU9IjAiLz4KKyAgICA8bWF4VHdpbGlnaHRQb2ludHMgdmFsdWU9IjAiLz4KKyAgICA8bWF4U3RvcmFnZSB2YWx1ZT0iMCIvPgorICAgIDxtYXhGdW5jdGlvbkRlZnMgdmFsdWU9IjAiLz4KKyAgICA8bWF4SW5zdHJ1Y3Rpb25EZWZzIHZhbHVlPSIwIi8+CisgICAgPG1heFN0YWNrRWxlbWVudHMgdmFsdWU9IjAiLz4KKyAgICA8bWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zIHZhbHVlPSIwIi8+CisgICAgPG1heENvbXBvbmVudEVsZW1lbnRzIHZhbHVlPSIwIi8+CisgIDwvbWF4cD4KKworICA8T1NfMj4KKyAgICA8IS0tIFRoZSBmaWVsZHMgJ3VzRmlyc3RDaGFySW5kZXgnIGFuZCAndXNMYXN0Q2hhckluZGV4JworICAgICAgICAgd2lsbCBiZSByZWNhbGN1bGF0ZWQgYnkgdGhlIGNvbXBpbGVyIC0tPgorICAgIDx2ZXJzaW9uIHZhbHVlPSIzIi8+CisgICAgPHhBdmdDaGFyV2lkdGggdmFsdWU9IjU5NCIvPgorICAgIDx1c1dlaWdodENsYXNzIHZhbHVlPSIxMDAiLz4KKyAgICA8dXNXaWR0aENsYXNzIHZhbHVlPSI1Ii8+CisgICAgPGZzVHlwZSB2YWx1ZT0iMDAwMDAwMDAgMDAwMDEwMDAiLz4KKyAgICA8eVN1YnNjcmlwdFhTaXplIHZhbHVlPSI2NTAiLz4KKyAgICA8eVN1YnNjcmlwdFlTaXplIHZhbHVlPSI2MDAiLz4KKyAgICA8eVN1YnNjcmlwdFhPZmZzZXQgdmFsdWU9IjAiLz4KKyAgICA8eVN1YnNjcmlwdFlPZmZzZXQgdmFsdWU9Ijc1Ii8+CisgICAgPHlTdXBlcnNjcmlwdFhTaXplIHZhbHVlPSI2NTAiLz4KKyAgICA8eVN1cGVyc2NyaXB0WVNpemUgdmFsdWU9IjYwMCIvPgorICAgIDx5U3VwZXJzY3JpcHRYT2Zmc2V0IHZhbHVlPSIwIi8+CisgICAgPHlTdXBlcnNjcmlwdFlPZmZzZXQgdmFsdWU9IjM1MCIvPgorICAgIDx5U3RyaWtlb3V0U2l6ZSB2YWx1ZT0iNTAiLz4KKyAgICA8eVN0cmlrZW91dFBvc2l0aW9uIHZhbHVlPSIzMDAiLz4KKyAgICA8c0ZhbWlseUNsYXNzIHZhbHVlPSIwIi8+CisgICAgPHBhbm9zZT4KKyAgICAgIDxiRmFtaWx5VHlwZSB2YWx1ZT0iMCIvPgorICAgICAgPGJTZXJpZlN0eWxlIHZhbHVlPSIwIi8+CisgICAgICA8YldlaWdodCB2YWx1ZT0iNSIvPgorICAgICAgPGJQcm9wb3J0aW9uIHZhbHVlPSIwIi8+CisgICAgICA8YkNvbnRyYXN0IHZhbHVlPSIwIi8+CisgICAgICA8YlN0cm9rZVZhcmlhdGlvbiB2YWx1ZT0iMCIvPgorICAgICAgPGJBcm1TdHlsZSB2YWx1ZT0iMCIvPgorICAgICAgPGJMZXR0ZXJGb3JtIHZhbHVlPSIwIi8+CisgICAgICA8Yk1pZGxpbmUgdmFsdWU9IjAiLz4KKyAgICAgIDxiWEhlaWdodCB2YWx1ZT0iMCIvPgorICAgIDwvcGFub3NlPgorICAgIDx1bFVuaWNvZGVSYW5nZTEgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAxIi8+CisgICAgPHVsVW5pY29kZVJhbmdlMiB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAiLz4KKyAgICA8dWxVbmljb2RlUmFuZ2UzIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCIvPgorICAgIDx1bFVuaWNvZGVSYW5nZTQgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIi8+CisgICAgPGFjaFZlbmRJRCB2YWx1ZT0iVUtXTiIvPgorICAgIDxmc1NlbGVjdGlvbiB2YWx1ZT0iMDAwMDAwMDAgMDEwMDAwMDAiLz4KKyAgICA8dXNGaXJzdENoYXJJbmRleCB2YWx1ZT0iMzIiLz4KKyAgICA8dXNMYXN0Q2hhckluZGV4IHZhbHVlPSIxMjIiLz4KKyAgICA8c1R5cG9Bc2NlbmRlciB2YWx1ZT0iODAwIi8+CisgICAgPHNUeXBvRGVzY2VuZGVyIHZhbHVlPSItMjAwIi8+CisgICAgPHNUeXBvTGluZUdhcCB2YWx1ZT0iMjAwIi8+CisgICAgPHVzV2luQXNjZW50IHZhbHVlPSIxMDAwIi8+CisgICAgPHVzV2luRGVzY2VudCB2YWx1ZT0iMjAwIi8+CisgICAgPHVsQ29kZVBhZ2VSYW5nZTEgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAxIi8+CisgICAgPHVsQ29kZVBhZ2VSYW5nZTIgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIi8+CisgICAgPHN4SGVpZ2h0IHZhbHVlPSI1MDAiLz4KKyAgICA8c0NhcEhlaWdodCB2YWx1ZT0iNzAwIi8+CisgICAgPHVzRGVmYXVsdENoYXIgdmFsdWU9IjAiLz4KKyAgICA8dXNCcmVha0NoYXIgdmFsdWU9IjMyIi8+CisgICAgPHVzTWF4Q29udGV4dCB2YWx1ZT0iMCIvPgorICA8L09TXzI+CisKKyAgPGhtdHg+CisgICAgPG10eCBuYW1lPSIubm90ZGVmIiB3aWR0aD0iNTAwIiBsc2I9IjkzIi8+CisgICAgPG10eCBuYW1lPSIxZW0iIHdpZHRoPSIxMDAwIiBsc2I9IjkzIi8+CisgICAgPG10eCBuYW1lPSIzZW0iIHdpZHRoPSIzMDAwIiBsc2I9IjkzIi8+CisgIDwvaG10eD4KKworICA8Y21hcD4KKyAgICA8dGFibGVWZXJzaW9uIHZlcnNpb249IjAiLz4KKyAgICA8Y21hcF9mb3JtYXRfNCBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEwIiBsYW5ndWFnZT0iMCI+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDYxIiBuYW1lPSIzZW0iIC8+IDwhLS0gYSAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjIiIG5hbWU9IjFlbSIgLz4gPCEtLSBiIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2MyIgbmFtZT0iMWVtIiAvPiA8IS0tIGMgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDY0IiBuYW1lPSIxZW0iIC8+IDwhLS0gZCAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjUiIG5hbWU9IjFlbSIgLz4gPCEtLSBlIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2NiIgbmFtZT0iMWVtIiAvPiA8IS0tIGYgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDY3IiBuYW1lPSIxZW0iIC8+IDwhLS0gZyAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjgiIG5hbWU9IjFlbSIgLz4gPCEtLSBoIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2OSIgbmFtZT0iMWVtIiAvPiA8IS0tIGkgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDZBIiBuYW1lPSIxZW0iIC8+IDwhLS0gaiAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNkIiIG5hbWU9IjFlbSIgLz4gPCEtLSBrIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2QyIgbmFtZT0iMWVtIiAvPiA8IS0tIGwgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDZEIiBuYW1lPSIxZW0iIC8+IDwhLS0gbSAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNkUiIG5hbWU9IjFlbSIgLz4gPCEtLSBuIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2RiIgbmFtZT0iMWVtIiAvPiA8IS0tIG8gLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDcwIiBuYW1lPSIxZW0iIC8+IDwhLS0gcCAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzEiIG5hbWU9IjFlbSIgLz4gPCEtLSBxIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3MiIgbmFtZT0iMWVtIiAvPiA8IS0tIHIgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDczIiBuYW1lPSIxZW0iIC8+IDwhLS0gcyAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzQiIG5hbWU9IjFlbSIgLz4gPCEtLSB0IC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3NSIgbmFtZT0iMWVtIiAvPiA8IS0tIHUgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDc2IiBuYW1lPSIxZW0iIC8+IDwhLS0gdiAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzciIG5hbWU9IjFlbSIgLz4gPCEtLSB3IC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3OCIgbmFtZT0iMWVtIiAvPiA8IS0tIHggLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDc5IiBuYW1lPSIxZW0iIC8+IDwhLS0geSAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwN0EiIG5hbWU9IjFlbSIgLz4gPCEtLSB6IC0tPgorICAgIDwvY21hcF9mb3JtYXRfND4KKyAgPC9jbWFwPgorCisgIDxsb2NhPgorICAgIDwhLS0gVGhlICdsb2NhJyB0YWJsZSB3aWxsIGJlIGNhbGN1bGF0ZWQgYnkgdGhlIGNvbXBpbGVyIC0tPgorICA8L2xvY2E+CisKKyAgPGdseWY+CisgICAgPFRUR2x5cGggbmFtZT0iLm5vdGRlZiIgeE1pbj0iMCIgeU1pbj0iMCIgeE1heD0iMCIgeU1heD0iMCIgLz4KKyAgICA8VFRHbHlwaCBuYW1lPSIxZW0iIHhNaW49IjAiIHlNaW49IjAiIHhNYXg9IjAiIHlNYXg9IjAiIC8+CisgICAgPFRUR2x5cGggbmFtZT0iM2VtIiB4TWluPSIwIiB5TWluPSIwIiB4TWF4PSIwIiB5TWF4PSIwIiAvPgorICA8L2dseWY+CisKKyAgPG5hbWU+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSIwIiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAgICA8L25hbWVyZWNvcmQ+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSIxIiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgU2FtcGxlIEZvbnQKKyAgICA8L25hbWVyZWNvcmQ+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSIyIiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgUmVndWxhcgorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjQiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBTYW1wbGUgRm9udAorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjYiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBTYW1wbGVGb250LVJlZ3VsYXIKKyAgICA8L25hbWVyZWNvcmQ+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSIxMyIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUworICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAgICA8L25hbWVyZWNvcmQ+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSIxNCIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgIDwvbmFtZXJlY29yZD4KKyAgPC9uYW1lPgorCisgIDxwb3N0PgorICAgIDxmb3JtYXRUeXBlIHZhbHVlPSIzLjAiLz4KKyAgICA8aXRhbGljQW5nbGUgdmFsdWU9IjAuMCIvPgorICAgIDx1bmRlcmxpbmVQb3NpdGlvbiB2YWx1ZT0iLTc1Ii8+CisgICAgPHVuZGVybGluZVRoaWNrbmVzcyB2YWx1ZT0iNTAiLz4KKyAgICA8aXNGaXhlZFBpdGNoIHZhbHVlPSIwIi8+CisgICAgPG1pbk1lbVR5cGU0MiB2YWx1ZT0iMCIvPgorICAgIDxtYXhNZW1UeXBlNDIgdmFsdWU9IjAiLz4KKyAgICA8bWluTWVtVHlwZTEgdmFsdWU9IjAiLz4KKyAgICA8bWF4TWVtVHlwZTEgdmFsdWU9IjAiLz4KKyAgPC9wb3N0PgorCis8L3R0Rm9udD4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL2Fzc2V0cy9hc2NpaV9iM2VtX3dlaWdodDEwMF9pdGFsaWMudHRmIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvYXNzZXRzL2FzY2lpX2IzZW1fd2VpZ2h0MTAwX2l0YWxpYy50dGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZlZDNjZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL2Fzc2V0cy9hc2NpaV9iM2VtX3dlaWdodDEwMF9pdGFsaWMudHRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL2Fzc2V0cy9hc2NpaV9iM2VtX3dlaWdodDEwMF9pdGFsaWMudHR4IGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvYXNzZXRzL2FzY2lpX2IzZW1fd2VpZ2h0MTAwX2l0YWxpYy50dHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNlMTdhNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL2Fzc2V0cy9hc2NpaV9iM2VtX3dlaWdodDEwMF9pdGFsaWMudHR4CkBAIC0wLDAgKzEsMjA4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8dHRGb250IHNmbnRWZXJzaW9uPSJceDAwXHgwMVx4MDBceDAwIiB0dExpYlZlcnNpb249IjMuMCI+CisKKyAgPEdseXBoT3JkZXI+CisgICAgPEdseXBoSUQgaWQ9IjAiIG5hbWU9Ii5ub3RkZWYiLz4KKyAgICA8R2x5cGhJRCBpZD0iMSIgbmFtZT0iMWVtIi8+CisgICAgPEdseXBoSUQgaWQ9IjIiIG5hbWU9IjNlbSIvPgorICA8L0dseXBoT3JkZXI+CisKKyAgPGhlYWQ+CisgICAgPHRhYmxlVmVyc2lvbiB2YWx1ZT0iMS4wIi8+CisgICAgPGZvbnRSZXZpc2lvbiB2YWx1ZT0iMS4wIi8+CisgICAgPGNoZWNrU3VtQWRqdXN0bWVudCB2YWx1ZT0iMHg2NDBjZGIyZiIvPgorICAgIDxtYWdpY051bWJlciB2YWx1ZT0iMHg1ZjBmM2NmNSIvPgorICAgIDxmbGFncyB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMTEiLz4KKyAgICA8dW5pdHNQZXJFbSB2YWx1ZT0iMTAwMCIvPgorICAgIDxjcmVhdGVkIHZhbHVlPSJUaHUgRmViIDIyIDEwOjA0OjI4IDIwMTgiLz4KKyAgICA8bWFjU3R5bGUgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDEwIi8+CisgICAgPGxvd2VzdFJlY1BQRU0gdmFsdWU9IjciLz4KKyAgICA8Zm9udERpcmVjdGlvbkhpbnQgdmFsdWU9IjIiLz4KKyAgICA8Z2x5cGhEYXRhRm9ybWF0IHZhbHVlPSIwIi8+CisgIDwvaGVhZD4KKworICA8aGhlYT4KKyAgICA8dGFibGVWZXJzaW9uIHZhbHVlPSIweDAwMDEwMDAwIi8+CisgICAgPGFzY2VudCB2YWx1ZT0iMTAwMCIvPgorICAgIDxkZXNjZW50IHZhbHVlPSItMjAwIi8+CisgICAgPGxpbmVHYXAgdmFsdWU9IjAiLz4KKyAgICA8Y2FyZXRTbG9wZVJpc2UgdmFsdWU9IjEiLz4KKyAgICA8Y2FyZXRTbG9wZVJ1biB2YWx1ZT0iMCIvPgorICAgIDxjYXJldE9mZnNldCB2YWx1ZT0iMCIvPgorICAgIDxyZXNlcnZlZDAgdmFsdWU9IjAiLz4KKyAgICA8cmVzZXJ2ZWQxIHZhbHVlPSIwIi8+CisgICAgPHJlc2VydmVkMiB2YWx1ZT0iMCIvPgorICAgIDxyZXNlcnZlZDMgdmFsdWU9IjAiLz4KKyAgICA8bWV0cmljRGF0YUZvcm1hdCB2YWx1ZT0iMCIvPgorICA8L2hoZWE+CisKKyAgPG1heHA+CisgICAgPHRhYmxlVmVyc2lvbiB2YWx1ZT0iMHgxMDAwMCIvPgorICAgIDxtYXhab25lcyB2YWx1ZT0iMCIvPgorICAgIDxtYXhUd2lsaWdodFBvaW50cyB2YWx1ZT0iMCIvPgorICAgIDxtYXhTdG9yYWdlIHZhbHVlPSIwIi8+CisgICAgPG1heEZ1bmN0aW9uRGVmcyB2YWx1ZT0iMCIvPgorICAgIDxtYXhJbnN0cnVjdGlvbkRlZnMgdmFsdWU9IjAiLz4KKyAgICA8bWF4U3RhY2tFbGVtZW50cyB2YWx1ZT0iMCIvPgorICAgIDxtYXhTaXplT2ZJbnN0cnVjdGlvbnMgdmFsdWU9IjAiLz4KKyAgICA8bWF4Q29tcG9uZW50RWxlbWVudHMgdmFsdWU9IjAiLz4KKyAgPC9tYXhwPgorCisgIDxPU18yPgorICAgIDwhLS0gVGhlIGZpZWxkcyAndXNGaXJzdENoYXJJbmRleCcgYW5kICd1c0xhc3RDaGFySW5kZXgnCisgICAgICAgICB3aWxsIGJlIHJlY2FsY3VsYXRlZCBieSB0aGUgY29tcGlsZXIgLS0+CisgICAgPHZlcnNpb24gdmFsdWU9IjMiLz4KKyAgICA8eEF2Z0NoYXJXaWR0aCB2YWx1ZT0iNTk0Ii8+CisgICAgPHVzV2VpZ2h0Q2xhc3MgdmFsdWU9IjEwMCIvPgorICAgIDx1c1dpZHRoQ2xhc3MgdmFsdWU9IjUiLz4KKyAgICA8ZnNUeXBlIHZhbHVlPSIwMDAwMDAwMCAwMDAwMTAwMCIvPgorICAgIDx5U3Vic2NyaXB0WFNpemUgdmFsdWU9IjY1MCIvPgorICAgIDx5U3Vic2NyaXB0WVNpemUgdmFsdWU9IjYwMCIvPgorICAgIDx5U3Vic2NyaXB0WE9mZnNldCB2YWx1ZT0iMCIvPgorICAgIDx5U3Vic2NyaXB0WU9mZnNldCB2YWx1ZT0iNzUiLz4KKyAgICA8eVN1cGVyc2NyaXB0WFNpemUgdmFsdWU9IjY1MCIvPgorICAgIDx5U3VwZXJzY3JpcHRZU2l6ZSB2YWx1ZT0iNjAwIi8+CisgICAgPHlTdXBlcnNjcmlwdFhPZmZzZXQgdmFsdWU9IjAiLz4KKyAgICA8eVN1cGVyc2NyaXB0WU9mZnNldCB2YWx1ZT0iMzUwIi8+CisgICAgPHlTdHJpa2VvdXRTaXplIHZhbHVlPSI1MCIvPgorICAgIDx5U3RyaWtlb3V0UG9zaXRpb24gdmFsdWU9IjMwMCIvPgorICAgIDxzRmFtaWx5Q2xhc3MgdmFsdWU9IjAiLz4KKyAgICA8cGFub3NlPgorICAgICAgPGJGYW1pbHlUeXBlIHZhbHVlPSIwIi8+CisgICAgICA8YlNlcmlmU3R5bGUgdmFsdWU9IjAiLz4KKyAgICAgIDxiV2VpZ2h0IHZhbHVlPSI1Ii8+CisgICAgICA8YlByb3BvcnRpb24gdmFsdWU9IjAiLz4KKyAgICAgIDxiQ29udHJhc3QgdmFsdWU9IjAiLz4KKyAgICAgIDxiU3Ryb2tlVmFyaWF0aW9uIHZhbHVlPSIwIi8+CisgICAgICA8YkFybVN0eWxlIHZhbHVlPSIwIi8+CisgICAgICA8YkxldHRlckZvcm0gdmFsdWU9IjAiLz4KKyAgICAgIDxiTWlkbGluZSB2YWx1ZT0iMCIvPgorICAgICAgPGJYSGVpZ2h0IHZhbHVlPSIwIi8+CisgICAgPC9wYW5vc2U+CisgICAgPHVsVW5pY29kZVJhbmdlMSB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDEiLz4KKyAgICA8dWxVbmljb2RlUmFuZ2UyIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCIvPgorICAgIDx1bFVuaWNvZGVSYW5nZTMgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIi8+CisgICAgPHVsVW5pY29kZVJhbmdlNCB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAiLz4KKyAgICA8YWNoVmVuZElEIHZhbHVlPSJVS1dOIi8+CisgICAgPGZzU2VsZWN0aW9uIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMSIvPgorICAgIDx1c0ZpcnN0Q2hhckluZGV4IHZhbHVlPSIzMiIvPgorICAgIDx1c0xhc3RDaGFySW5kZXggdmFsdWU9IjEyMiIvPgorICAgIDxzVHlwb0FzY2VuZGVyIHZhbHVlPSI4MDAiLz4KKyAgICA8c1R5cG9EZXNjZW5kZXIgdmFsdWU9Ii0yMDAiLz4KKyAgICA8c1R5cG9MaW5lR2FwIHZhbHVlPSIyMDAiLz4KKyAgICA8dXNXaW5Bc2NlbnQgdmFsdWU9IjEwMDAiLz4KKyAgICA8dXNXaW5EZXNjZW50IHZhbHVlPSIyMDAiLz4KKyAgICA8dWxDb2RlUGFnZVJhbmdlMSB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDEiLz4KKyAgICA8dWxDb2RlUGFnZVJhbmdlMiB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAiLz4KKyAgICA8c3hIZWlnaHQgdmFsdWU9IjUwMCIvPgorICAgIDxzQ2FwSGVpZ2h0IHZhbHVlPSI3MDAiLz4KKyAgICA8dXNEZWZhdWx0Q2hhciB2YWx1ZT0iMCIvPgorICAgIDx1c0JyZWFrQ2hhciB2YWx1ZT0iMzIiLz4KKyAgICA8dXNNYXhDb250ZXh0IHZhbHVlPSIwIi8+CisgIDwvT1NfMj4KKworICA8aG10eD4KKyAgICA8bXR4IG5hbWU9Ii5ub3RkZWYiIHdpZHRoPSI1MDAiIGxzYj0iOTMiLz4KKyAgICA8bXR4IG5hbWU9IjFlbSIgd2lkdGg9IjEwMDAiIGxzYj0iOTMiLz4KKyAgICA8bXR4IG5hbWU9IjNlbSIgd2lkdGg9IjMwMDAiIGxzYj0iOTMiLz4KKyAgPC9obXR4PgorCisgIDxjbWFwPgorICAgIDx0YWJsZVZlcnNpb24gdmVyc2lvbj0iMCIvPgorICAgIDxjbWFwX2Zvcm1hdF80IHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMTAiIGxhbmd1YWdlPSIwIj4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjEiIG5hbWU9IjFlbSIgLz4gPCEtLSBhIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2MiIgbmFtZT0iM2VtIiAvPiA8IS0tIGIgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDYzIiBuYW1lPSIxZW0iIC8+IDwhLS0gYyAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjQiIG5hbWU9IjFlbSIgLz4gPCEtLSBkIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2NSIgbmFtZT0iMWVtIiAvPiA8IS0tIGUgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDY2IiBuYW1lPSIxZW0iIC8+IDwhLS0gZiAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjciIG5hbWU9IjFlbSIgLz4gPCEtLSBnIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2OCIgbmFtZT0iMWVtIiAvPiA8IS0tIGggLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDY5IiBuYW1lPSIxZW0iIC8+IDwhLS0gaSAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNkEiIG5hbWU9IjFlbSIgLz4gPCEtLSBqIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2QiIgbmFtZT0iMWVtIiAvPiA8IS0tIGsgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDZDIiBuYW1lPSIxZW0iIC8+IDwhLS0gbCAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNkQiIG5hbWU9IjFlbSIgLz4gPCEtLSBtIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2RSIgbmFtZT0iMWVtIiAvPiA8IS0tIG4gLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDZGIiBuYW1lPSIxZW0iIC8+IDwhLS0gbyAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzAiIG5hbWU9IjFlbSIgLz4gPCEtLSBwIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3MSIgbmFtZT0iMWVtIiAvPiA8IS0tIHEgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDcyIiBuYW1lPSIxZW0iIC8+IDwhLS0gciAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzMiIG5hbWU9IjFlbSIgLz4gPCEtLSBzIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3NCIgbmFtZT0iMWVtIiAvPiA8IS0tIHQgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDc1IiBuYW1lPSIxZW0iIC8+IDwhLS0gdSAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzYiIG5hbWU9IjFlbSIgLz4gPCEtLSB2IC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3NyIgbmFtZT0iMWVtIiAvPiA8IS0tIHcgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDc4IiBuYW1lPSIxZW0iIC8+IDwhLS0geCAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzkiIG5hbWU9IjFlbSIgLz4gPCEtLSB5IC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3QSIgbmFtZT0iMWVtIiAvPiA8IS0tIHogLS0+CisgICAgPC9jbWFwX2Zvcm1hdF80PgorICA8L2NtYXA+CisKKyAgPGxvY2E+CisgICAgPCEtLSBUaGUgJ2xvY2EnIHRhYmxlIHdpbGwgYmUgY2FsY3VsYXRlZCBieSB0aGUgY29tcGlsZXIgLS0+CisgIDwvbG9jYT4KKworICA8Z2x5Zj4KKyAgICA8VFRHbHlwaCBuYW1lPSIubm90ZGVmIiB4TWluPSIwIiB5TWluPSIwIiB4TWF4PSIwIiB5TWF4PSIwIiAvPgorICAgIDxUVEdseXBoIG5hbWU9IjFlbSIgeE1pbj0iMCIgeU1pbj0iMCIgeE1heD0iMCIgeU1heD0iMCIgLz4KKyAgICA8VFRHbHlwaCBuYW1lPSIzZW0iIHhNaW49IjAiIHlNaW49IjAiIHhNYXg9IjAiIHlNYXg9IjAiIC8+CisgIDwvZ2x5Zj4KKworICA8bmFtZT4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjAiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjEiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBTYW1wbGUgRm9udAorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjIiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBSZWd1bGFyCisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iNCIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIFNhbXBsZSBGb250CisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iNiIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIFNhbXBsZUZvbnQtUmVndWxhcgorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjEzIiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjE0IiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgPC9uYW1lcmVjb3JkPgorICA8L25hbWU+CisKKyAgPHBvc3Q+CisgICAgPGZvcm1hdFR5cGUgdmFsdWU9IjMuMCIvPgorICAgIDxpdGFsaWNBbmdsZSB2YWx1ZT0iMC4wIi8+CisgICAgPHVuZGVybGluZVBvc2l0aW9uIHZhbHVlPSItNzUiLz4KKyAgICA8dW5kZXJsaW5lVGhpY2tuZXNzIHZhbHVlPSI1MCIvPgorICAgIDxpc0ZpeGVkUGl0Y2ggdmFsdWU9IjAiLz4KKyAgICA8bWluTWVtVHlwZTQyIHZhbHVlPSIwIi8+CisgICAgPG1heE1lbVR5cGU0MiB2YWx1ZT0iMCIvPgorICAgIDxtaW5NZW1UeXBlMSB2YWx1ZT0iMCIvPgorICAgIDxtYXhNZW1UeXBlMSB2YWx1ZT0iMCIvPgorICA8L3Bvc3Q+CisKKzwvdHRGb250PgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvYXNzZXRzL2IzZW0udHR4IGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvYXNzZXRzL2IzZW0udHR4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YTc3ZWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9hc3NldHMvYjNlbS50dHgKQEAgLTAsMCArMSwxODcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzx0dEZvbnQgc2ZudFZlcnNpb249Ilx4MDBceDAxXHgwMFx4MDAiIHR0TGliVmVyc2lvbj0iMy4wIj4KKworICA8R2x5cGhPcmRlcj4KKyAgICA8R2x5cGhJRCBpZD0iMCIgbmFtZT0iLm5vdGRlZiIvPgorICAgIDxHbHlwaElEIGlkPSIxIiBuYW1lPSIxZW0iLz4KKyAgICA8R2x5cGhJRCBpZD0iMiIgbmFtZT0iM2VtIi8+CisgIDwvR2x5cGhPcmRlcj4KKworICA8aGVhZD4KKyAgICA8dGFibGVWZXJzaW9uIHZhbHVlPSIxLjAiLz4KKyAgICA8Zm9udFJldmlzaW9uIHZhbHVlPSIxLjAiLz4KKyAgICA8Y2hlY2tTdW1BZGp1c3RtZW50IHZhbHVlPSIweDY0MGNkYjJmIi8+CisgICAgPG1hZ2ljTnVtYmVyIHZhbHVlPSIweDVmMGYzY2Y1Ii8+CisgICAgPGZsYWdzIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAxMSIvPgorICAgIDx1bml0c1BlckVtIHZhbHVlPSIxMDAwIi8+CisgICAgPGNyZWF0ZWQgdmFsdWU9IkZyaSBNYXIgMTcgMDc6MjY6MDAgMjAxNyIvPgorICAgIDxtYWNTdHlsZSB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAiLz4KKyAgICA8bG93ZXN0UmVjUFBFTSB2YWx1ZT0iNyIvPgorICAgIDxmb250RGlyZWN0aW9uSGludCB2YWx1ZT0iMiIvPgorICAgIDxnbHlwaERhdGFGb3JtYXQgdmFsdWU9IjAiLz4KKyAgPC9oZWFkPgorCisgIDxoaGVhPgorICAgIDx0YWJsZVZlcnNpb24gdmFsdWU9IjEuMCIvPgorICAgIDxhc2NlbnQgdmFsdWU9IjEwMDAiLz4KKyAgICA8ZGVzY2VudCB2YWx1ZT0iLTIwMCIvPgorICAgIDxsaW5lR2FwIHZhbHVlPSIwIi8+CisgICAgPGNhcmV0U2xvcGVSaXNlIHZhbHVlPSIxIi8+CisgICAgPGNhcmV0U2xvcGVSdW4gdmFsdWU9IjAiLz4KKyAgICA8Y2FyZXRPZmZzZXQgdmFsdWU9IjAiLz4KKyAgICA8cmVzZXJ2ZWQwIHZhbHVlPSIwIi8+CisgICAgPHJlc2VydmVkMSB2YWx1ZT0iMCIvPgorICAgIDxyZXNlcnZlZDIgdmFsdWU9IjAiLz4KKyAgICA8cmVzZXJ2ZWQzIHZhbHVlPSIwIi8+CisgICAgPG1ldHJpY0RhdGFGb3JtYXQgdmFsdWU9IjAiLz4KKyAgPC9oaGVhPgorCisgIDxtYXhwPgorICAgIDx0YWJsZVZlcnNpb24gdmFsdWU9IjB4MTAwMDAiLz4KKyAgICA8bWF4Wm9uZXMgdmFsdWU9IjAiLz4KKyAgICA8bWF4VHdpbGlnaHRQb2ludHMgdmFsdWU9IjAiLz4KKyAgICA8bWF4U3RvcmFnZSB2YWx1ZT0iMCIvPgorICAgIDxtYXhGdW5jdGlvbkRlZnMgdmFsdWU9IjAiLz4KKyAgICA8bWF4SW5zdHJ1Y3Rpb25EZWZzIHZhbHVlPSIwIi8+CisgICAgPG1heFN0YWNrRWxlbWVudHMgdmFsdWU9IjAiLz4KKyAgICA8bWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zIHZhbHVlPSIwIi8+CisgICAgPG1heENvbXBvbmVudEVsZW1lbnRzIHZhbHVlPSIwIi8+CisgIDwvbWF4cD4KKworICA8T1NfMj4KKyAgICA8IS0tIFRoZSBmaWVsZHMgJ3VzRmlyc3RDaGFySW5kZXgnIGFuZCAndXNMYXN0Q2hhckluZGV4JworICAgICAgICAgd2lsbCBiZSByZWNhbGN1bGF0ZWQgYnkgdGhlIGNvbXBpbGVyIC0tPgorICAgIDx2ZXJzaW9uIHZhbHVlPSIzIi8+CisgICAgPHhBdmdDaGFyV2lkdGggdmFsdWU9IjU5NCIvPgorICAgIDx1c1dlaWdodENsYXNzIHZhbHVlPSI0MDAiLz4KKyAgICA8dXNXaWR0aENsYXNzIHZhbHVlPSI1Ii8+CisgICAgPGZzVHlwZSB2YWx1ZT0iMDAwMDAwMDAgMDAwMDEwMDAiLz4KKyAgICA8eVN1YnNjcmlwdFhTaXplIHZhbHVlPSI2NTAiLz4KKyAgICA8eVN1YnNjcmlwdFlTaXplIHZhbHVlPSI2MDAiLz4KKyAgICA8eVN1YnNjcmlwdFhPZmZzZXQgdmFsdWU9IjAiLz4KKyAgICA8eVN1YnNjcmlwdFlPZmZzZXQgdmFsdWU9Ijc1Ii8+CisgICAgPHlTdXBlcnNjcmlwdFhTaXplIHZhbHVlPSI2NTAiLz4KKyAgICA8eVN1cGVyc2NyaXB0WVNpemUgdmFsdWU9IjYwMCIvPgorICAgIDx5U3VwZXJzY3JpcHRYT2Zmc2V0IHZhbHVlPSIwIi8+CisgICAgPHlTdXBlcnNjcmlwdFlPZmZzZXQgdmFsdWU9IjM1MCIvPgorICAgIDx5U3RyaWtlb3V0U2l6ZSB2YWx1ZT0iNTAiLz4KKyAgICA8eVN0cmlrZW91dFBvc2l0aW9uIHZhbHVlPSIzMDAiLz4KKyAgICA8c0ZhbWlseUNsYXNzIHZhbHVlPSIwIi8+CisgICAgPHBhbm9zZT4KKyAgICAgIDxiRmFtaWx5VHlwZSB2YWx1ZT0iMCIvPgorICAgICAgPGJTZXJpZlN0eWxlIHZhbHVlPSIwIi8+CisgICAgICA8YldlaWdodCB2YWx1ZT0iNSIvPgorICAgICAgPGJQcm9wb3J0aW9uIHZhbHVlPSIwIi8+CisgICAgICA8YkNvbnRyYXN0IHZhbHVlPSIwIi8+CisgICAgICA8YlN0cm9rZVZhcmlhdGlvbiB2YWx1ZT0iMCIvPgorICAgICAgPGJBcm1TdHlsZSB2YWx1ZT0iMCIvPgorICAgICAgPGJMZXR0ZXJGb3JtIHZhbHVlPSIwIi8+CisgICAgICA8Yk1pZGxpbmUgdmFsdWU9IjAiLz4KKyAgICAgIDxiWEhlaWdodCB2YWx1ZT0iMCIvPgorICAgIDwvcGFub3NlPgorICAgIDx1bFVuaWNvZGVSYW5nZTEgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAxIi8+CisgICAgPHVsVW5pY29kZVJhbmdlMiB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAiLz4KKyAgICA8dWxVbmljb2RlUmFuZ2UzIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCIvPgorICAgIDx1bFVuaWNvZGVSYW5nZTQgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIi8+CisgICAgPGFjaFZlbmRJRCB2YWx1ZT0iVUtXTiIvPgorICAgIDxmc1NlbGVjdGlvbiB2YWx1ZT0iMDAwMDAwMDAgMDEwMDAwMDAiLz4KKyAgICA8dXNGaXJzdENoYXJJbmRleCB2YWx1ZT0iMzIiLz4KKyAgICA8dXNMYXN0Q2hhckluZGV4IHZhbHVlPSIxMjIiLz4KKyAgICA8c1R5cG9Bc2NlbmRlciB2YWx1ZT0iODAwIi8+CisgICAgPHNUeXBvRGVzY2VuZGVyIHZhbHVlPSItMjAwIi8+CisgICAgPHNUeXBvTGluZUdhcCB2YWx1ZT0iMjAwIi8+CisgICAgPHVzV2luQXNjZW50IHZhbHVlPSIxMDAwIi8+CisgICAgPHVzV2luRGVzY2VudCB2YWx1ZT0iMjAwIi8+CisgICAgPHVsQ29kZVBhZ2VSYW5nZTEgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAxIi8+CisgICAgPHVsQ29kZVBhZ2VSYW5nZTIgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIi8+CisgICAgPHN4SGVpZ2h0IHZhbHVlPSI1MDAiLz4KKyAgICA8c0NhcEhlaWdodCB2YWx1ZT0iNzAwIi8+CisgICAgPHVzRGVmYXVsdENoYXIgdmFsdWU9IjAiLz4KKyAgICA8dXNCcmVha0NoYXIgdmFsdWU9IjMyIi8+CisgICAgPHVzTWF4Q29udGV4dCB2YWx1ZT0iMCIvPgorICA8L09TXzI+CisKKyAgPGhtdHg+CisgICAgPG10eCBuYW1lPSIubm90ZGVmIiB3aWR0aD0iNTAwIiBsc2I9IjkzIi8+CisgICAgPG10eCBuYW1lPSIxZW0iIHdpZHRoPSIxMDAwIiBsc2I9IjkzIi8+CisgICAgPG10eCBuYW1lPSIzZW0iIHdpZHRoPSIzMDAwIiBsc2I9IjkzIi8+CisgIDwvaG10eD4KKworICA8Y21hcD4KKyAgICA8dGFibGVWZXJzaW9uIHZlcnNpb249IjAiLz4KKyAgICA8Y21hcF9mb3JtYXRfNCBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEwIiBsYW5ndWFnZT0iMCI+CisgICAgICA8bWFwIGNvZGU9IjB4MDA2MSIgbmFtZT0iMWVtIiAvPgorICAgICAgPG1hcCBjb2RlPSIweDAwNjIiIG5hbWU9IjNlbSIgLz4KKyAgICAgIDxtYXAgY29kZT0iMHgwMDYzIiBuYW1lPSIxZW0iIC8+CisgICAgICA8bWFwIGNvZGU9IjB4MDA2NCIgbmFtZT0iMWVtIiAvPgorICAgICAgPG1hcCBjb2RlPSIweDAwNjUiIG5hbWU9IjFlbSIgLz4KKyAgICA8L2NtYXBfZm9ybWF0XzQ+CisgIDwvY21hcD4KKworICA8bG9jYT4KKyAgICA8IS0tIFRoZSAnbG9jYScgdGFibGUgd2lsbCBiZSBjYWxjdWxhdGVkIGJ5IHRoZSBjb21waWxlciAtLT4KKyAgPC9sb2NhPgorCisgIDxnbHlmPgorICAgIDxUVEdseXBoIG5hbWU9Ii5ub3RkZWYiIHhNaW49IjAiIHlNaW49IjAiIHhNYXg9IjAiIHlNYXg9IjAiIC8+CisgICAgPFRUR2x5cGggbmFtZT0iMWVtIiB4TWluPSIwIiB5TWluPSIwIiB4TWF4PSIwIiB5TWF4PSIwIiAvPgorICAgIDxUVEdseXBoIG5hbWU9IjNlbSIgeE1pbj0iMCIgeU1pbj0iMCIgeE1heD0iMCIgeU1heD0iMCIgLz4KKyAgPC9nbHlmPgorCisgIDxuYW1lPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iMCIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iMSIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIFNhbXBsZSBGb250CisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iMiIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIFJlZ3VsYXIKKyAgICA8L25hbWVyZWNvcmQ+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSI0IiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgU2FtcGxlIEZvbnQKKyAgICA8L25hbWVyZWNvcmQ+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSI2IiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgU2FtcGxlRm9udC1SZWd1bGFyCisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iMTMiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iMTQiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICA8L25hbWVyZWNvcmQ+CisgIDwvbmFtZT4KKworICA8cG9zdD4KKyAgICA8Zm9ybWF0VHlwZSB2YWx1ZT0iMy4wIi8+CisgICAgPGl0YWxpY0FuZ2xlIHZhbHVlPSIwLjAiLz4KKyAgICA8dW5kZXJsaW5lUG9zaXRpb24gdmFsdWU9Ii03NSIvPgorICAgIDx1bmRlcmxpbmVUaGlja25lc3MgdmFsdWU9IjUwIi8+CisgICAgPGlzRml4ZWRQaXRjaCB2YWx1ZT0iMCIvPgorICAgIDxtaW5NZW1UeXBlNDIgdmFsdWU9IjAiLz4KKyAgICA8bWF4TWVtVHlwZTQyIHZhbHVlPSIwIi8+CisgICAgPG1pbk1lbVR5cGUxIHZhbHVlPSIwIi8+CisgICAgPG1heE1lbVR5cGUxIHZhbHVlPSIwIi8+CisgIDwvcG9zdD4KKworPC90dEZvbnQ+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9hc3NldHMvYjc4MTIwMDg2LmRuZyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL2Fzc2V0cy9iNzgxMjAwODYuZG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NWQ1YTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9hc3NldHMvYjc4MTIwMDg2LmRuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9hc3NldHMvYzNlbS50dHggYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9hc3NldHMvYzNlbS50dHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVlZDhlNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL2Fzc2V0cy9jM2VtLnR0eApAQCAtMCwwICsxLDE4NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUworICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHR0Rm9udCBzZm50VmVyc2lvbj0iXHgwMFx4MDFceDAwXHgwMCIgdHRMaWJWZXJzaW9uPSIzLjAiPgorCisgIDxHbHlwaE9yZGVyPgorICAgIDxHbHlwaElEIGlkPSIwIiBuYW1lPSIubm90ZGVmIi8+CisgICAgPEdseXBoSUQgaWQ9IjEiIG5hbWU9IjFlbSIvPgorICAgIDxHbHlwaElEIGlkPSIyIiBuYW1lPSIzZW0iLz4KKyAgPC9HbHlwaE9yZGVyPgorCisgIDxoZWFkPgorICAgIDx0YWJsZVZlcnNpb24gdmFsdWU9IjEuMCIvPgorICAgIDxmb250UmV2aXNpb24gdmFsdWU9IjEuMCIvPgorICAgIDxjaGVja1N1bUFkanVzdG1lbnQgdmFsdWU9IjB4NjQwY2RiMmYiLz4KKyAgICA8bWFnaWNOdW1iZXIgdmFsdWU9IjB4NWYwZjNjZjUiLz4KKyAgICA8ZmxhZ3MgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDExIi8+CisgICAgPHVuaXRzUGVyRW0gdmFsdWU9IjEwMDAiLz4KKyAgICA8Y3JlYXRlZCB2YWx1ZT0iRnJpIE1hciAxNyAwNzoyNjowMCAyMDE3Ii8+CisgICAgPG1hY1N0eWxlIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMCIvPgorICAgIDxsb3dlc3RSZWNQUEVNIHZhbHVlPSI3Ii8+CisgICAgPGZvbnREaXJlY3Rpb25IaW50IHZhbHVlPSIyIi8+CisgICAgPGdseXBoRGF0YUZvcm1hdCB2YWx1ZT0iMCIvPgorICA8L2hlYWQ+CisKKyAgPGhoZWE+CisgICAgPHRhYmxlVmVyc2lvbiB2YWx1ZT0iMS4wIi8+CisgICAgPGFzY2VudCB2YWx1ZT0iMTAwMCIvPgorICAgIDxkZXNjZW50IHZhbHVlPSItMjAwIi8+CisgICAgPGxpbmVHYXAgdmFsdWU9IjAiLz4KKyAgICA8Y2FyZXRTbG9wZVJpc2UgdmFsdWU9IjEiLz4KKyAgICA8Y2FyZXRTbG9wZVJ1biB2YWx1ZT0iMCIvPgorICAgIDxjYXJldE9mZnNldCB2YWx1ZT0iMCIvPgorICAgIDxyZXNlcnZlZDAgdmFsdWU9IjAiLz4KKyAgICA8cmVzZXJ2ZWQxIHZhbHVlPSIwIi8+CisgICAgPHJlc2VydmVkMiB2YWx1ZT0iMCIvPgorICAgIDxyZXNlcnZlZDMgdmFsdWU9IjAiLz4KKyAgICA8bWV0cmljRGF0YUZvcm1hdCB2YWx1ZT0iMCIvPgorICA8L2hoZWE+CisKKyAgPG1heHA+CisgICAgPHRhYmxlVmVyc2lvbiB2YWx1ZT0iMHgxMDAwMCIvPgorICAgIDxtYXhab25lcyB2YWx1ZT0iMCIvPgorICAgIDxtYXhUd2lsaWdodFBvaW50cyB2YWx1ZT0iMCIvPgorICAgIDxtYXhTdG9yYWdlIHZhbHVlPSIwIi8+CisgICAgPG1heEZ1bmN0aW9uRGVmcyB2YWx1ZT0iMCIvPgorICAgIDxtYXhJbnN0cnVjdGlvbkRlZnMgdmFsdWU9IjAiLz4KKyAgICA8bWF4U3RhY2tFbGVtZW50cyB2YWx1ZT0iMCIvPgorICAgIDxtYXhTaXplT2ZJbnN0cnVjdGlvbnMgdmFsdWU9IjAiLz4KKyAgICA8bWF4Q29tcG9uZW50RWxlbWVudHMgdmFsdWU9IjAiLz4KKyAgPC9tYXhwPgorCisgIDxPU18yPgorICAgIDwhLS0gVGhlIGZpZWxkcyAndXNGaXJzdENoYXJJbmRleCcgYW5kICd1c0xhc3RDaGFySW5kZXgnCisgICAgICAgICB3aWxsIGJlIHJlY2FsY3VsYXRlZCBieSB0aGUgY29tcGlsZXIgLS0+CisgICAgPHZlcnNpb24gdmFsdWU9IjMiLz4KKyAgICA8eEF2Z0NoYXJXaWR0aCB2YWx1ZT0iNTk0Ii8+CisgICAgPHVzV2VpZ2h0Q2xhc3MgdmFsdWU9IjQwMCIvPgorICAgIDx1c1dpZHRoQ2xhc3MgdmFsdWU9IjUiLz4KKyAgICA8ZnNUeXBlIHZhbHVlPSIwMDAwMDAwMCAwMDAwMTAwMCIvPgorICAgIDx5U3Vic2NyaXB0WFNpemUgdmFsdWU9IjY1MCIvPgorICAgIDx5U3Vic2NyaXB0WVNpemUgdmFsdWU9IjYwMCIvPgorICAgIDx5U3Vic2NyaXB0WE9mZnNldCB2YWx1ZT0iMCIvPgorICAgIDx5U3Vic2NyaXB0WU9mZnNldCB2YWx1ZT0iNzUiLz4KKyAgICA8eVN1cGVyc2NyaXB0WFNpemUgdmFsdWU9IjY1MCIvPgorICAgIDx5U3VwZXJzY3JpcHRZU2l6ZSB2YWx1ZT0iNjAwIi8+CisgICAgPHlTdXBlcnNjcmlwdFhPZmZzZXQgdmFsdWU9IjAiLz4KKyAgICA8eVN1cGVyc2NyaXB0WU9mZnNldCB2YWx1ZT0iMzUwIi8+CisgICAgPHlTdHJpa2VvdXRTaXplIHZhbHVlPSI1MCIvPgorICAgIDx5U3RyaWtlb3V0UG9zaXRpb24gdmFsdWU9IjMwMCIvPgorICAgIDxzRmFtaWx5Q2xhc3MgdmFsdWU9IjAiLz4KKyAgICA8cGFub3NlPgorICAgICAgPGJGYW1pbHlUeXBlIHZhbHVlPSIwIi8+CisgICAgICA8YlNlcmlmU3R5bGUgdmFsdWU9IjAiLz4KKyAgICAgIDxiV2VpZ2h0IHZhbHVlPSI1Ii8+CisgICAgICA8YlByb3BvcnRpb24gdmFsdWU9IjAiLz4KKyAgICAgIDxiQ29udHJhc3QgdmFsdWU9IjAiLz4KKyAgICAgIDxiU3Ryb2tlVmFyaWF0aW9uIHZhbHVlPSIwIi8+CisgICAgICA8YkFybVN0eWxlIHZhbHVlPSIwIi8+CisgICAgICA8YkxldHRlckZvcm0gdmFsdWU9IjAiLz4KKyAgICAgIDxiTWlkbGluZSB2YWx1ZT0iMCIvPgorICAgICAgPGJYSGVpZ2h0IHZhbHVlPSIwIi8+CisgICAgPC9wYW5vc2U+CisgICAgPHVsVW5pY29kZVJhbmdlMSB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDEiLz4KKyAgICA8dWxVbmljb2RlUmFuZ2UyIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCIvPgorICAgIDx1bFVuaWNvZGVSYW5nZTMgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIi8+CisgICAgPHVsVW5pY29kZVJhbmdlNCB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAiLz4KKyAgICA8YWNoVmVuZElEIHZhbHVlPSJVS1dOIi8+CisgICAgPGZzU2VsZWN0aW9uIHZhbHVlPSIwMDAwMDAwMCAwMTAwMDAwMCIvPgorICAgIDx1c0ZpcnN0Q2hhckluZGV4IHZhbHVlPSIzMiIvPgorICAgIDx1c0xhc3RDaGFySW5kZXggdmFsdWU9IjEyMiIvPgorICAgIDxzVHlwb0FzY2VuZGVyIHZhbHVlPSI4MDAiLz4KKyAgICA8c1R5cG9EZXNjZW5kZXIgdmFsdWU9Ii0yMDAiLz4KKyAgICA8c1R5cG9MaW5lR2FwIHZhbHVlPSIyMDAiLz4KKyAgICA8dXNXaW5Bc2NlbnQgdmFsdWU9IjEwMDAiLz4KKyAgICA8dXNXaW5EZXNjZW50IHZhbHVlPSIyMDAiLz4KKyAgICA8dWxDb2RlUGFnZVJhbmdlMSB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDEiLz4KKyAgICA8dWxDb2RlUGFnZVJhbmdlMiB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAiLz4KKyAgICA8c3hIZWlnaHQgdmFsdWU9IjUwMCIvPgorICAgIDxzQ2FwSGVpZ2h0IHZhbHVlPSI3MDAiLz4KKyAgICA8dXNEZWZhdWx0Q2hhciB2YWx1ZT0iMCIvPgorICAgIDx1c0JyZWFrQ2hhciB2YWx1ZT0iMzIiLz4KKyAgICA8dXNNYXhDb250ZXh0IHZhbHVlPSIwIi8+CisgIDwvT1NfMj4KKworICA8aG10eD4KKyAgICA8bXR4IG5hbWU9Ii5ub3RkZWYiIHdpZHRoPSI1MDAiIGxzYj0iOTMiLz4KKyAgICA8bXR4IG5hbWU9IjFlbSIgd2lkdGg9IjEwMDAiIGxzYj0iOTMiLz4KKyAgICA8bXR4IG5hbWU9IjNlbSIgd2lkdGg9IjMwMDAiIGxzYj0iOTMiLz4KKyAgPC9obXR4PgorCisgIDxjbWFwPgorICAgIDx0YWJsZVZlcnNpb24gdmVyc2lvbj0iMCIvPgorICAgIDxjbWFwX2Zvcm1hdF80IHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMTAiIGxhbmd1YWdlPSIwIj4KKyAgICAgIDxtYXAgY29kZT0iMHgwMDYxIiBuYW1lPSIxZW0iIC8+CisgICAgICA8bWFwIGNvZGU9IjB4MDA2MiIgbmFtZT0iMWVtIiAvPgorICAgICAgPG1hcCBjb2RlPSIweDAwNjMiIG5hbWU9IjNlbSIgLz4KKyAgICAgIDxtYXAgY29kZT0iMHgwMDY0IiBuYW1lPSIxZW0iIC8+CisgICAgICA8bWFwIGNvZGU9IjB4MDA2NSIgbmFtZT0iMWVtIiAvPgorICAgIDwvY21hcF9mb3JtYXRfND4KKyAgPC9jbWFwPgorCisgIDxsb2NhPgorICAgIDwhLS0gVGhlICdsb2NhJyB0YWJsZSB3aWxsIGJlIGNhbGN1bGF0ZWQgYnkgdGhlIGNvbXBpbGVyIC0tPgorICA8L2xvY2E+CisKKyAgPGdseWY+CisgICAgPFRUR2x5cGggbmFtZT0iLm5vdGRlZiIgeE1pbj0iMCIgeU1pbj0iMCIgeE1heD0iMCIgeU1heD0iMCIgLz4KKyAgICA8VFRHbHlwaCBuYW1lPSIxZW0iIHhNaW49IjAiIHlNaW49IjAiIHhNYXg9IjAiIHlNYXg9IjAiIC8+CisgICAgPFRUR2x5cGggbmFtZT0iM2VtIiB4TWluPSIwIiB5TWluPSIwIiB4TWF4PSIwIiB5TWF4PSIwIiAvPgorICA8L2dseWY+CisKKyAgPG5hbWU+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSIwIiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAgICA8L25hbWVyZWNvcmQ+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSIxIiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgU2FtcGxlIEZvbnQKKyAgICA8L25hbWVyZWNvcmQ+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSIyIiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgUmVndWxhcgorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjQiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBTYW1wbGUgRm9udAorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjYiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBTYW1wbGVGb250LVJlZ3VsYXIKKyAgICA8L25hbWVyZWNvcmQ+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSIxMyIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUworICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAgICA8L25hbWVyZWNvcmQ+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSIxNCIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgIDwvbmFtZXJlY29yZD4KKyAgPC9uYW1lPgorCisgIDxwb3N0PgorICAgIDxmb3JtYXRUeXBlIHZhbHVlPSIzLjAiLz4KKyAgICA8aXRhbGljQW5nbGUgdmFsdWU9IjAuMCIvPgorICAgIDx1bmRlcmxpbmVQb3NpdGlvbiB2YWx1ZT0iLTc1Ii8+CisgICAgPHVuZGVybGluZVRoaWNrbmVzcyB2YWx1ZT0iNTAiLz4KKyAgICA8aXNGaXhlZFBpdGNoIHZhbHVlPSIwIi8+CisgICAgPG1pbk1lbVR5cGU0MiB2YWx1ZT0iMCIvPgorICAgIDxtYXhNZW1UeXBlNDIgdmFsdWU9IjAiLz4KKyAgICA8bWluTWVtVHlwZTEgdmFsdWU9IjAiLz4KKyAgICA8bWF4TWVtVHlwZTEgdmFsdWU9IjAiLz4KKyAgPC9wb3N0PgorCis8L3R0Rm9udD4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL2Fzc2V0cy9wYXNzdGhyb3VnaF9mc2guZ2xzbCBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL2Fzc2V0cy9wYXNzdGhyb3VnaF9mc2guZ2xzbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2U1OTJlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvYXNzZXRzL3Bhc3N0aHJvdWdoX2ZzaC5nbHNsCkBAIC0wLDAgKzEsOSBAQAorI3ZlcnNpb24gNDAwCisjZXh0ZW5zaW9uIEdMX0FSQl9zZXBhcmF0ZV9zaGFkZXJfb2JqZWN0cyA6IGVuYWJsZQorI2V4dGVuc2lvbiBHTF9BUkJfc2hhZGluZ19sYW5ndWFnZV80MjBwYWNrIDogZW5hYmxlCitsYXlvdXQgKGJpbmRpbmcgPSAwKSB1bmlmb3JtIHNhbXBsZXIyRCB0ZXg7CitsYXlvdXQgKGxvY2F0aW9uID0gMCkgaW4gdmVjMiB0ZXhjb29yZDsKK2xheW91dCAobG9jYXRpb24gPSAwKSBvdXQgdmVjNCB1RnJhZ0NvbG9yOwordm9pZCBtYWluKCkgeworICAgdUZyYWdDb2xvciA9IHRleHR1cmUodGV4LCB0ZXhjb29yZCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9hc3NldHMvcGFzc3Rocm91Z2hfZnNoLnNwdiBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL2Fzc2V0cy9wYXNzdGhyb3VnaF9mc2guc3B2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2OGM0YmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9hc3NldHMvcGFzc3Rocm91Z2hfZnNoLnNwdgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9hc3NldHMvcGFzc3Rocm91Z2hfdnNoLmdsc2wgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9hc3NldHMvcGFzc3Rocm91Z2hfdnNoLmdsc2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU0NjgxYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL2Fzc2V0cy9wYXNzdGhyb3VnaF92c2guZ2xzbApAQCAtMCwwICsxLDEwIEBACisjdmVyc2lvbiA0MDAKKyNleHRlbnNpb24gR0xfQVJCX3NlcGFyYXRlX3NoYWRlcl9vYmplY3RzIDogZW5hYmxlCisjZXh0ZW5zaW9uIEdMX0FSQl9zaGFkaW5nX2xhbmd1YWdlXzQyMHBhY2sgOiBlbmFibGUKK2xheW91dCAobG9jYXRpb24gPSAwKSBpbiB2ZWM0IHBvczsKK2xheW91dCAobG9jYXRpb24gPSAxKSBpbiB2ZWMyIGF0dHI7CitsYXlvdXQgKGxvY2F0aW9uID0gMCkgb3V0IHZlYzIgdGV4Y29vcmQ7Cit2b2lkIG1haW4oKSB7CisgICB0ZXhjb29yZCA9IGF0dHI7CisgICBnbF9Qb3NpdGlvbiA9IHBvczsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL2Fzc2V0cy9wYXNzdGhyb3VnaF92c2guc3B2IGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvYXNzZXRzL3Bhc3N0aHJvdWdoX3ZzaC5zcHYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU3MTg2OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL2Fzc2V0cy9wYXNzdGhyb3VnaF92c2guc3B2CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL2Fzc2V0cy9zaGFkZXJzL3RyaS5mcmFnIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvYXNzZXRzL3NoYWRlcnMvdHJpLmZyYWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUwZjZkZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL2Fzc2V0cy9zaGFkZXJzL3RyaS5mcmFnCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCisjdmVyc2lvbiA0MDAKKyNleHRlbnNpb24gR0xfQVJCX3NlcGFyYXRlX3NoYWRlcl9vYmplY3RzIDogZW5hYmxlCisjZXh0ZW5zaW9uIEdMX0FSQl9zaGFkaW5nX2xhbmd1YWdlXzQyMHBhY2sgOiBlbmFibGUKK2xheW91dCAobG9jYXRpb24gPSAwKSBvdXQgdmVjNCB1RnJhZ0NvbG9yOworbGF5b3V0IChwdXNoX2NvbnN0YW50KSB1bmlmb3JtIENvbG9yRGF0YSB7CisgICAgdmVjMyBjb2xvcnM7Cit9IGNvbG9yRGF0YTsKK3ZvaWQgbWFpbigpIHsKKyAgIHVGcmFnQ29sb3IgPSB2ZWM0KGNvbG9yRGF0YS5jb2xvcnMsIDEuMCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9hc3NldHMvc2hhZGVycy90cmkuZnJhZy5zcHYgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9hc3NldHMvc2hhZGVycy90cmkuZnJhZy5zcHYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVkODJiYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL2Fzc2V0cy9zaGFkZXJzL3RyaS5mcmFnLnNwdgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9hc3NldHMvc2hhZGVycy90cmkudmVydCBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL2Fzc2V0cy9zaGFkZXJzL3RyaS52ZXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMDdlYmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9hc3NldHMvc2hhZGVycy90cmkudmVydApAQCAtMCwwICsxLDI0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworI3ZlcnNpb24gNDAwCisjZXh0ZW5zaW9uIEdMX0FSQl9zZXBhcmF0ZV9zaGFkZXJfb2JqZWN0cyA6IGVuYWJsZQorI2V4dGVuc2lvbiBHTF9BUkJfc2hhZGluZ19sYW5ndWFnZV80MjBwYWNrIDogZW5hYmxlCitsYXlvdXQgKGxvY2F0aW9uID0gMCkgaW4gdmVjNCBwb3M7Cit2b2lkIG1haW4oKSB7CisgICBnbF9Qb3NpdGlvbiA9IHBvczsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL2Fzc2V0cy9zaGFkZXJzL3RyaS52ZXJ0LnNwdiBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL2Fzc2V0cy9zaGFkZXJzL3RyaS52ZXJ0LnNwdgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWJiMzZlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvYXNzZXRzL3NoYWRlcnMvdHJpLnZlcnQuc3B2CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL2Fzc2V0cy90ZXN0X3ZpZGVvLm1wNCBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL2Fzc2V0cy90ZXN0X3ZpZGVvLm1wNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2U0OTU4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvYXNzZXRzL3Rlc3RfdmlkZW8ubXA0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL2Fzc2V0cy90ZXN0X3ZpZGVvX2ZyYW1lLnBuZyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL2Fzc2V0cy90ZXN0X3ZpZGVvX2ZyYW1lLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDAxMWVlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvYXNzZXRzL3Rlc3RfdmlkZW9fZnJhbWUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL2puaS9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvam5pL0FuZHJvaWQubWsKaW5kZXggYjkyZmNkNy4uYjcyZmRlNyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvam5pL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvam5pL0FuZHJvaWQubWsKQEAgLTIzLDEwICsyMywyMSBAQAogTE9DQUxfU1JDX0ZJTEVTIDo9IFwKIAlDdHNHcmFwaGljc0puaU9uTG9hZC5jcHAgXAogCWFuZHJvaWRfZ3JhcGhpY3NfY3RzX0FOYXRpdmVXaW5kb3dUZXN0LmNwcCBcCisJYW5kcm9pZF9ncmFwaGljc19jdHNfQVN1cmZhY2VUZXh0dXJlVGVzdC5jcHAgXAorCWFuZHJvaWRfZ3JhcGhpY3NfY3RzX0Jhc2ljVnVsa2FuR3B1VGVzdC5jcHAgXAogCWFuZHJvaWRfZ3JhcGhpY3NfY3RzX0JpdG1hcFRlc3QuY3BwIFwKIAlhbmRyb2lkX2dyYXBoaWNzX2N0c19TeW5jVGVzdC5jcHAgXAogCWFuZHJvaWRfZ3JhcGhpY3NfY3RzX0NhbWVyYUdwdUN0c0FjdGl2aXR5LmNwcCBcCi0JYW5kcm9pZF9ncmFwaGljc19jdHNfVnVsa2FuRmVhdHVyZXNUZXN0LmNwcAorCWFuZHJvaWRfZ3JhcGhpY3NfY3RzX0NhbWVyYVZ1bGthbkdwdVRlc3QuY3BwIFwKKwlhbmRyb2lkX2dyYXBoaWNzX2N0c19NZWRpYVZ1bGthbkdwdVRlc3QuY3BwIFwKKwlhbmRyb2lkX2dyYXBoaWNzX2N0c19WdWxrYW5GZWF0dXJlc1Rlc3QuY3BwIFwKKwlhbmRyb2lkX2dyYXBoaWNzX2N0c19WdWxrYW5QcmVUcmFuc2Zvcm1DdHNBY3Rpdml0eS5jcHAgXAorCUNhbWVyYVRlc3RIZWxwZXJzLmNwcCBcCisJSW1hZ2VSZWFkZXJUZXN0SGVscGVycy5jcHAgXAorCU1lZGlhVGVzdEhlbHBlcnMuY3BwIFwKKwlOYXRpdmVUZXN0SGVscGVycy5jcHAgXAorCVZ1bGthblByZVRyYW5zZm9ybVRlc3RIZWxwZXJzLmNwcCBcCisJVnVsa2FuVGVzdEhlbHBlcnMuY3BwCiAKIExPQ0FMX0NGTEFHUyArPSAtc3RkPWMrKzE0IC1XYWxsIC1XZXJyb3IgLURHTF9HTEVYVF9QUk9UT1RZUEVTIC1ERUdMX0VHTEVYVF9QUk9UT1RZUEVTCiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL2puaS9DYW1lcmFUZXN0SGVscGVycy5jcHAgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9qbmkvQ2FtZXJhVGVzdEhlbHBlcnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MTJlMDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9qbmkvQ2FtZXJhVGVzdEhlbHBlcnMuY3BwCkBAIC0wLDAgKzEsMTg3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJDYW1lcmFUZXN0SGVscGVycyIKKworI2luY2x1ZGUgIkNhbWVyYVRlc3RIZWxwZXJzLmgiCisKKyNpbmNsdWRlIDxhbmRyb2lkL2xvZy5oPgorCisjZGVmaW5lIEFMT0dJKC4uLikgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19JTkZPLCBMT0dfVEFHLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgQUxPR1coLi4uKSBfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX1dBUk4sIExPR19UQUcsIF9fVkFfQVJHU19fKQorI2RlZmluZSBBTE9HRSguLi4pIF9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfRVJST1IsIExPR19UQUcsIF9fVkFfQVJHU19fKQorCitDYW1lcmFIZWxwZXI6On5DYW1lcmFIZWxwZXIoKSB7IGNsb3NlQ2FtZXJhKCk7IH0KKworaW50IENhbWVyYUhlbHBlcjo6aW5pdENhbWVyYShBTmF0aXZlV2luZG93ICppbWdSZWFkZXJBbncpIHsKKyAgaWYgKGltZ1JlYWRlckFudyA9PSBudWxscHRyKSB7CisgICAgQUxPR0UoIkNhbm5vdCBpbml0aWFsaXplIGNhbWVyYSBiZWZvcmUgaW1hZ2UgcmVhZGVyIGdldCBpbml0aWFsaXplZC4iKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBtSW1nUmVhZGVyQW53ID0gaW1nUmVhZGVyQW53OworICBtQ2FtZXJhTWFuYWdlciA9IEFDYW1lcmFNYW5hZ2VyX2NyZWF0ZSgpOworICBpZiAobUNhbWVyYU1hbmFnZXIgPT0gbnVsbHB0cikgeworICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlIEFDYW1lcmFNYW5hZ2VyLiIpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGludCByZXQgPSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFJZExpc3QobUNhbWVyYU1hbmFnZXIsICZtQ2FtZXJhSWRMaXN0KTsKKyAgaWYgKHJldCAhPSBBTUVESUFfT0spIHsKKyAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBjYW1lcmFJZExpc3Q6IHJldD0lZCIsIHJldCk7CisgICAgcmV0dXJuIHJldDsKKyAgfQorICBpZiAobUNhbWVyYUlkTGlzdC0+bnVtQ2FtZXJhcyA8IDEpIHsKKyAgICBBTE9HVygiRGV2aWNlIGhhcyBubyBOREsgY29tcGF0aWJsZSBjYW1lcmEuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgQUxPR0koIkZvdW5kICVkIGNhbWVyYShzKS4iLCBtQ2FtZXJhSWRMaXN0LT5udW1DYW1lcmFzKTsKKworICAvLyBXZSBhbHdheXMgdXNlIHRoZSBmaXJzdCBjYW1lcmEuCisgIG1DYW1lcmFJZCA9IG1DYW1lcmFJZExpc3QtPmNhbWVyYUlkc1swXTsKKyAgaWYgKG1DYW1lcmFJZCA9PSBudWxscHRyKSB7CisgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgY2FtZXJhSWQuIik7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgcmV0ID0gQUNhbWVyYU1hbmFnZXJfb3BlbkNhbWVyYShtQ2FtZXJhTWFuYWdlciwgbUNhbWVyYUlkLCAmbURldmljZUNiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtRGV2aWNlKTsKKyAgaWYgKHJldCAhPSBBTUVESUFfT0sgfHwgbURldmljZSA9PSBudWxscHRyKSB7CisgICAgQUxPR0UoIkZhaWxlZCB0byBvcGVuIGNhbWVyYSwgcmV0PSVkLCBtRGV2aWNlPSVwLiIsIHJldCwgbURldmljZSk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgcmV0ID0gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKG1DYW1lcmFNYW5hZ2VyLCBtQ2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbUNhbWVyYU1ldGFkYXRhKTsKKyAgaWYgKHJldCAhPSBBQ0FNRVJBX09LIHx8IG1DYW1lcmFNZXRhZGF0YSA9PSBudWxscHRyKSB7CisgICAgQUxPR0UoIkdldCBjYW1lcmEgJXMgY2hhcmFjdGVyaXN0aWNzIGZhaWx1cmUuIHJldCAlZCwgbWV0YWRhdGEgJXAiLAorICAgICAgICAgIG1DYW1lcmFJZCwgcmV0LCBtQ2FtZXJhTWV0YWRhdGEpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGlmICghaXNDYXBhYmlsaXR5U3VwcG9ydGVkKAorICAgICAgICAgIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX0JBQ0tXQVJEX0NPTVBBVElCTEUpKSB7CisgICAgQUxPR1coIkNhbWVyYSBkb2VzIG5vdCBzdXBwb3J0IEJBQ0tXQVJEX0NPTVBBVElCTEUuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLyBDcmVhdGUgY2FwdHVyZSBzZXNzaW9uCisgIHJldCA9IEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lcl9jcmVhdGUoJm1PdXRwdXRzKTsKKyAgaWYgKHJldCAhPSBBTUVESUFfT0spIHsKKyAgICBBTE9HRSgiQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2NyZWF0ZSBmYWlsZWQsIHJldD0lZCIsIHJldCk7CisgICAgcmV0dXJuIHJldDsKKyAgfQorICByZXQgPSBBQ2FwdHVyZVNlc3Npb25PdXRwdXRfY3JlYXRlKG1JbWdSZWFkZXJBbncsICZtSW1nUmVhZGVyT3V0cHV0KTsKKyAgaWYgKHJldCAhPSBBTUVESUFfT0spIHsKKyAgICBBTE9HRSgiQUNhcHR1cmVTZXNzaW9uT3V0cHV0X2NyZWF0ZSBmYWlsZWQsIHJldD0lZCIsIHJldCk7CisgICAgcmV0dXJuIHJldDsKKyAgfQorICByZXQgPSBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXJfYWRkKG1PdXRwdXRzLCBtSW1nUmVhZGVyT3V0cHV0KTsKKyAgaWYgKHJldCAhPSBBTUVESUFfT0spIHsKKyAgICBBTE9HRSgiQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2FkZCBmYWlsZWQsIHJldD0lZCIsIHJldCk7CisgICAgcmV0dXJuIHJldDsKKyAgfQorICByZXQgPSBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVTZXNzaW9uKG1EZXZpY2UsIG1PdXRwdXRzLCAmbVNlc3Npb25DYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbVNlc3Npb24pOworICBpZiAocmV0ICE9IEFNRURJQV9PSykgeworICAgIEFMT0dFKCJBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVTZXNzaW9uIGZhaWxlZCwgcmV0PSVkIiwgcmV0KTsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgLy8gQ3JlYXRlIGNhcHR1cmUgcmVxdWVzdAorICByZXQgPSBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVSZXF1ZXN0KG1EZXZpY2UsIFRFTVBMQVRFX1JFQ09SRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbUNhcHR1cmVSZXF1ZXN0KTsKKyAgaWYgKHJldCAhPSBBTUVESUFfT0spIHsKKyAgICBBTE9HRSgiQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlUmVxdWVzdCBmYWlsZWQsIHJldD0lZCIsIHJldCk7CisgICAgcmV0dXJuIHJldDsKKyAgfQorICByZXQgPSBBQ2FtZXJhT3V0cHV0VGFyZ2V0X2NyZWF0ZShtSW1nUmVhZGVyQW53LCAmbVJlcUltZ1JlYWRlck91dHB1dCk7CisgIGlmIChyZXQgIT0gQU1FRElBX09LKSB7CisgICAgQUxPR0UoIkFDYW1lcmFPdXRwdXRUYXJnZXRfY3JlYXRlIGZhaWxlZCwgcmV0PSVkIiwgcmV0KTsKKyAgICByZXR1cm4gcmV0OworICB9CisgIHJldCA9IEFDYXB0dXJlUmVxdWVzdF9hZGRUYXJnZXQobUNhcHR1cmVSZXF1ZXN0LCBtUmVxSW1nUmVhZGVyT3V0cHV0KTsKKyAgaWYgKHJldCAhPSBBTUVESUFfT0spIHsKKyAgICBBTE9HRSgiQUNhcHR1cmVSZXF1ZXN0X2FkZFRhcmdldCBmYWlsZWQsIHJldD0lZCIsIHJldCk7CisgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIG1Jc0NhbWVyYVJlYWR5ID0gdHJ1ZTsKKyAgcmV0dXJuIDA7Cit9CisKK2Jvb2wgQ2FtZXJhSGVscGVyOjppc0NhcGFiaWxpdHlTdXBwb3J0ZWQoCisgICAgYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfcmVxdWVzdF9hdmFpbGFibGVfY2FwYWJpbGl0aWVzX3QgY2FwKSB7CisgIEFDYW1lcmFNZXRhZGF0YV9jb25zdF9lbnRyeSBlbnRyeTsKKyAgQUNhbWVyYU1ldGFkYXRhX2dldENvbnN0RW50cnkobUNhbWVyYU1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUywgJmVudHJ5KTsKKyAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGVudHJ5LmNvdW50OyBpKyspIHsKKyAgICBpZiAoZW50cnkuZGF0YS51OFtpXSA9PSBjYXApIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQ2FtZXJhSGVscGVyOjpjbG9zZUNhbWVyYSgpIHsKKyAgLy8gRGVzdHJveSBjYXB0dXJlIHJlcXVlc3QKKyAgaWYgKG1SZXFJbWdSZWFkZXJPdXRwdXQpIHsKKyAgICBBQ2FtZXJhT3V0cHV0VGFyZ2V0X2ZyZWUobVJlcUltZ1JlYWRlck91dHB1dCk7CisgICAgbVJlcUltZ1JlYWRlck91dHB1dCA9IG51bGxwdHI7CisgIH0KKyAgaWYgKG1DYXB0dXJlUmVxdWVzdCkgeworICAgIEFDYXB0dXJlUmVxdWVzdF9mcmVlKG1DYXB0dXJlUmVxdWVzdCk7CisgICAgbUNhcHR1cmVSZXF1ZXN0ID0gbnVsbHB0cjsKKyAgfQorICAvLyBEZXN0cm95IGNhcHR1cmUgc2Vzc2lvbgorICBpZiAobVNlc3Npb24gIT0gbnVsbHB0cikgeworICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jbG9zZShtU2Vzc2lvbik7CisgICAgbVNlc3Npb24gPSBudWxscHRyOworICB9CisgIGlmIChtSW1nUmVhZGVyT3V0cHV0KSB7CisgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0X2ZyZWUobUltZ1JlYWRlck91dHB1dCk7CisgICAgbUltZ1JlYWRlck91dHB1dCA9IG51bGxwdHI7CisgIH0KKyAgaWYgKG1PdXRwdXRzKSB7CisgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2ZyZWUobU91dHB1dHMpOworICAgIG1PdXRwdXRzID0gbnVsbHB0cjsKKyAgfQorICAvLyBEZXN0cm95IGNhbWVyYSBkZXZpY2UKKyAgaWYgKG1EZXZpY2UpIHsKKyAgICBBQ2FtZXJhRGV2aWNlX2Nsb3NlKG1EZXZpY2UpOworICAgIG1EZXZpY2UgPSBudWxscHRyOworICB9CisgIGlmIChtQ2FtZXJhTWV0YWRhdGEpIHsKKyAgICBBQ2FtZXJhTWV0YWRhdGFfZnJlZShtQ2FtZXJhTWV0YWRhdGEpOworICAgIG1DYW1lcmFNZXRhZGF0YSA9IG51bGxwdHI7CisgIH0KKyAgLy8gRGVzdHJveSBjYW1lcmEgbWFuYWdlcgorICBpZiAobUNhbWVyYUlkTGlzdCkgeworICAgIEFDYW1lcmFNYW5hZ2VyX2RlbGV0ZUNhbWVyYUlkTGlzdChtQ2FtZXJhSWRMaXN0KTsKKyAgICBtQ2FtZXJhSWRMaXN0ID0gbnVsbHB0cjsKKyAgfQorICBpZiAobUNhbWVyYU1hbmFnZXIpIHsKKyAgICBBQ2FtZXJhTWFuYWdlcl9kZWxldGUobUNhbWVyYU1hbmFnZXIpOworICAgIG1DYW1lcmFNYW5hZ2VyID0gbnVsbHB0cjsKKyAgfQorICBtSXNDYW1lcmFSZWFkeSA9IGZhbHNlOworfQorCitpbnQgQ2FtZXJhSGVscGVyOjp0YWtlUGljdHVyZSgpIHsKKyAgcmV0dXJuIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlKG1TZXNzaW9uLCBudWxscHRyLCAxLCAmbUNhcHR1cmVSZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9qbmkvQ2FtZXJhVGVzdEhlbHBlcnMuaCBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL2puaS9DYW1lcmFUZXN0SGVscGVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiOTczZDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9qbmkvQ2FtZXJhVGVzdEhlbHBlcnMuaApAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0NBTUVSQVRFU1RIRUxQRVJTX0gKKyNkZWZpbmUgQU5EUk9JRF9DQU1FUkFURVNUSEVMUEVSU19ICisKKy8vIE11c3QgY29tZSBiZWZvcmUgTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaAorI2luY2x1ZGUgPGNhbWVyYS9OZGtDYXB0dXJlUmVxdWVzdC5oPgorCisjaW5jbHVkZSA8Y2FtZXJhL05ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmg+CisjaW5jbHVkZSA8Y2FtZXJhL05ka0NhbWVyYURldmljZS5oPgorI2luY2x1ZGUgPGNhbWVyYS9OZGtDYW1lcmFFcnJvci5oPgorI2luY2x1ZGUgPGNhbWVyYS9OZGtDYW1lcmFNYW5hZ2VyLmg+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGpuaS5oPgorI2luY2x1ZGUgPG1lZGlhL05ka0ltYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrSW1hZ2VSZWFkZXIuaD4KKworLy8gQSBoZWxwZXIgY2xhc3Mgd2hpY2ggY2FuIGJlIHVzZWQgdG8gaW5pdGlhbGl6ZS9jb250cm9sIHRoZSBjYW1lcmEuCitjbGFzcyBDYW1lcmFIZWxwZXIgeworcHVibGljOgorICB+Q2FtZXJhSGVscGVyKCk7CisKKyAgaW50IGluaXRDYW1lcmEoQU5hdGl2ZVdpbmRvdyAqaW1nUmVhZGVyQW53KTsKKyAgYm9vbCBpc0NhcGFiaWxpdHlTdXBwb3J0ZWQoCisgICAgICBhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9yZXF1ZXN0X2F2YWlsYWJsZV9jYXBhYmlsaXRpZXNfdCBjYXApOworICBib29sIGlzQ2FtZXJhUmVhZHkoKSB7IHJldHVybiBtSXNDYW1lcmFSZWFkeTsgfQorICB2b2lkIGNsb3NlQ2FtZXJhKCk7CisgIGludCB0YWtlUGljdHVyZSgpOworCisgIHN0YXRpYyB2b2lkIG9uRGV2aWNlRGlzY29ubmVjdGVkKHZvaWQgKiAvKm9iaiovLCBBQ2FtZXJhRGV2aWNlICogLypkZXZpY2UqLykgeworICB9CisgIHN0YXRpYyB2b2lkIG9uRGV2aWNlRXJyb3Iodm9pZCAqIC8qb2JqKi8sIEFDYW1lcmFEZXZpY2UgKiAvKmRldmljZSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKmVycm9yQ29kZSovKSB7fQorICBzdGF0aWMgdm9pZCBvblNlc3Npb25DbG9zZWQodm9pZCAqIC8qb2JqKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24gKiAvKnNlc3Npb24qLykge30KKyAgc3RhdGljIHZvaWQgb25TZXNzaW9uUmVhZHkodm9pZCAqIC8qb2JqKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiAqIC8qc2Vzc2lvbiovKSB7fQorICBzdGF0aWMgdm9pZCBvblNlc3Npb25BY3RpdmUodm9pZCAqIC8qb2JqKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24gKiAvKnNlc3Npb24qLykge30KKworcHJpdmF0ZToKKyAgQUNhbWVyYURldmljZV9TdGF0ZUNhbGxiYWNrcyBtRGV2aWNlQ2J7dGhpcywgb25EZXZpY2VEaXNjb25uZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uRGV2aWNlRXJyb3J9OworICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fc3RhdGVDYWxsYmFja3MgbVNlc3Npb25DYnsKKyAgICAgIHRoaXMsIG9uU2Vzc2lvbkNsb3NlZCwgb25TZXNzaW9uUmVhZHksIG9uU2Vzc2lvbkFjdGl2ZX07CisKKyAgQU5hdGl2ZVdpbmRvdyAqbUltZ1JlYWRlckFud3tudWxscHRyfTsgLy8gbm90IG93bmVkIGJ5IHVzLgorCisgIC8vIENhbWVyYSBtYW5hZ2VyCisgIEFDYW1lcmFNYW5hZ2VyICptQ2FtZXJhTWFuYWdlcntudWxscHRyfTsKKyAgQUNhbWVyYUlkTGlzdCAqbUNhbWVyYUlkTGlzdHtudWxscHRyfTsKKyAgLy8gQ2FtZXJhIGRldmljZQorICBBQ2FtZXJhTWV0YWRhdGEgKm1DYW1lcmFNZXRhZGF0YXtudWxscHRyfTsKKyAgQUNhbWVyYURldmljZSAqbURldmljZXtudWxscHRyfTsKKyAgLy8gQ2FwdHVyZSBzZXNzaW9uCisgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lciAqbU91dHB1dHN7bnVsbHB0cn07CisgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dCAqbUltZ1JlYWRlck91dHB1dHtudWxscHRyfTsKKyAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uICptU2Vzc2lvbntudWxscHRyfTsKKyAgLy8gQ2FwdHVyZSByZXF1ZXN0CisgIEFDYXB0dXJlUmVxdWVzdCAqbUNhcHR1cmVSZXF1ZXN0e251bGxwdHJ9OworICBBQ2FtZXJhT3V0cHV0VGFyZ2V0ICptUmVxSW1nUmVhZGVyT3V0cHV0e251bGxwdHJ9OworCisgIGJvb2wgbUlzQ2FtZXJhUmVhZHl7ZmFsc2V9OworICBjb25zdCBjaGFyICptQ2FtZXJhSWR7bnVsbHB0cn07Cit9OworCisjZW5kaWYgLy8gQU5EUk9JRF9DQU1FUkFUSEVMUEVSU19ICmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9qbmkvQ3RzR3JhcGhpY3NKbmlPbkxvYWQuY3BwIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvam5pL0N0c0dyYXBoaWNzSm5pT25Mb2FkLmNwcAppbmRleCBmZTNiYmM3Li5iYjQ2NjcxIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9qbmkvQ3RzR3JhcGhpY3NKbmlPbkxvYWQuY3BwCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL2puaS9DdHNHcmFwaGljc0puaU9uTG9hZC5jcHAKQEAgLTE4LDkgKzE4LDE0IEBACiAjaW5jbHVkZSA8c3RkaW8uaD4KIAogZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX2dyYXBoaWNzX2N0c19BTmF0aXZlV2luZG93VGVzdChKTklFbnYqKTsKK2V4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9ncmFwaGljc19jdHNfQVN1cmZhY2VUZXh0dXJlVGVzdChKTklFbnYqKTsKK2V4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9ncmFwaGljc19jdHNfQmFzaWNWdWxrYW5HcHVUZXN0KEpOSUVudiopOwogZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX2dyYXBoaWNzX2N0c19CaXRtYXBUZXN0KEpOSUVudiopOwogZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX2dyYXBoaWNzX2N0c19DYW1lcmFHcHVDdHNBY3Rpdml0eShKTklFbnYqKTsKK2V4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9ncmFwaGljc19jdHNfQ2FtZXJhVnVsa2FuR3B1VGVzdChKTklFbnYqKTsKK2V4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9ncmFwaGljc19jdHNfTWVkaWFWdWxrYW5HcHVUZXN0KEpOSUVudiopOwogZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX2dyYXBoaWNzX2N0c19WdWxrYW5GZWF0dXJlc1Rlc3QoSk5JRW52Kik7CitleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfZ3JhcGhpY3NfY3RzX1Z1bGthblByZVRyYW5zZm9ybUN0c0FjdGl2aXR5KEpOSUVudiopOwogCiBqaW50IEpOSV9PbkxvYWQoSmF2YVZNKiB2bSwgdm9pZCogLypyZXNlcnZlZCovKSB7CiAgICAgSk5JRW52KiBlbnYgPSBudWxscHRyOwpAQCAtMjgsMTEgKzMzLDIzIEBACiAgICAgICAgIHJldHVybiBKTklfRVJSOwogICAgIGlmIChyZWdpc3Rlcl9hbmRyb2lkX2dyYXBoaWNzX2N0c19BTmF0aXZlV2luZG93VGVzdChlbnYpKQogICAgICAgICByZXR1cm4gSk5JX0VSUjsKKyAgICBpZiAocmVnaXN0ZXJfYW5kcm9pZF9ncmFwaGljc19jdHNfQVN1cmZhY2VUZXh0dXJlVGVzdChlbnYpKQorICAgICAgICByZXR1cm4gSk5JX0VSUjsKICAgICBpZiAocmVnaXN0ZXJfYW5kcm9pZF9ncmFwaGljc19jdHNfQml0bWFwVGVzdChlbnYpKQogICAgICAgICByZXR1cm4gSk5JX0VSUjsKICAgICBpZiAocmVnaXN0ZXJfYW5kcm9pZF9ncmFwaGljc19jdHNfQ2FtZXJhR3B1Q3RzQWN0aXZpdHkoZW52KSkKICAgICAgICAgcmV0dXJuIEpOSV9FUlI7CisgICAgaWYgKHJlZ2lzdGVyX2FuZHJvaWRfZ3JhcGhpY3NfY3RzX0NhbWVyYVZ1bGthbkdwdVRlc3QoZW52KSkKKyAgICAgICAgcmV0dXJuIEpOSV9FUlI7CisgICAgaWYgKHJlZ2lzdGVyX2FuZHJvaWRfZ3JhcGhpY3NfY3RzX01lZGlhVnVsa2FuR3B1VGVzdChlbnYpKQorICAgICAgICByZXR1cm4gSk5JX0VSUjsKICAgICBpZiAocmVnaXN0ZXJfYW5kcm9pZF9ncmFwaGljc19jdHNfVnVsa2FuRmVhdHVyZXNUZXN0KGVudikpCiAgICAgICAgIHJldHVybiBKTklfRVJSOworICAgIGlmIChyZWdpc3Rlcl9hbmRyb2lkX2dyYXBoaWNzX2N0c19WdWxrYW5QcmVUcmFuc2Zvcm1DdHNBY3Rpdml0eShlbnYpKQorICAgICAgICByZXR1cm4gSk5JX0VSUjsKKyAgICBpZiAocmVnaXN0ZXJfYW5kcm9pZF9ncmFwaGljc19jdHNfQmFzaWNWdWxrYW5HcHVUZXN0KGVudikpCisgICAgICAgIHJldHVybiBKTklfRVJSOworICAgIGlmIChyZWdpc3Rlcl9hbmRyb2lkX2dyYXBoaWNzX2N0c19DYW1lcmFWdWxrYW5HcHVUZXN0KGVudikpCisgICAgICAgIHJldHVybiBKTklfRVJSOwogICAgIHJldHVybiBKTklfVkVSU0lPTl8xXzQ7CiB9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9qbmkvSW1hZ2VSZWFkZXJUZXN0SGVscGVycy5jcHAgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9qbmkvSW1hZ2VSZWFkZXJUZXN0SGVscGVycy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JkYTcxMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL2puaS9JbWFnZVJlYWRlclRlc3RIZWxwZXJzLmNwcApAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiSW1hZ2VSZWFkZXJUZXN0SGVscGVycyIKKworI2luY2x1ZGUgIkltYWdlUmVhZGVyVGVzdEhlbHBlcnMuaCIKKworI2luY2x1ZGUgPGFuZHJvaWQvbG9nLmg+CisKKyNkZWZpbmUgQUxPR0koLi4uKSBfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX0lORk8sIExPR19UQUcsIF9fVkFfQVJHU19fKQorI2RlZmluZSBBTE9HVyguLi4pIF9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfV0FSTiwgTE9HX1RBRywgX19WQV9BUkdTX18pCisjZGVmaW5lIEFMT0dFKC4uLikgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19FUlJPUiwgTE9HX1RBRywgX19WQV9BUkdTX18pCisKK0ltYWdlUmVhZGVySGVscGVyOjpJbWFnZVJlYWRlckhlbHBlcihpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZvcm1hdCwgdWludDY0X3QgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXhJbWFnZXMpCisgICAgOiBtV2lkdGgod2lkdGgpLCBtSGVpZ2h0KGhlaWdodCksIG1Gb3JtYXQoZm9ybWF0KSwgbVVzYWdlKHVzYWdlKSwKKyAgICAgIG1NYXhJbWFnZXMobWF4SW1hZ2VzKSB7fQorCitJbWFnZVJlYWRlckhlbHBlcjo6fkltYWdlUmVhZGVySGVscGVyKCkgeworICBtQWNxdWlyZWRJbWFnZS5yZXNldCgpOworICBpZiAobUltZ1JlYWRlckFudykgeworICAgIEFJbWFnZVJlYWRlcl9kZWxldGUobUltZ1JlYWRlcik7CisgICAgLy8gTm8gbmVlZCB0byBjYWxsIEFOYXRpdmVXaW5kb3dfcmVsZWFzZSBvbiBpbWFnZVJlYWRlckFudworICB9Cit9CisKK2ludCBJbWFnZVJlYWRlckhlbHBlcjo6aW5pdEltYWdlUmVhZGVyKCkgeworICBpZiAobUltZ1JlYWRlciAhPSBudWxscHRyIHx8IG1JbWdSZWFkZXJBbncgIT0gbnVsbHB0cikgeworICAgIEFMT0dFKCJDYW5ub3QgcmUtaW5pdGFsaXplIGltYWdlIHJlYWRlciwgbUltZ1JlYWRlcj0lcCwgbUltZ1JlYWRlckFudz0lcCIsCisgICAgICAgICAgbUltZ1JlYWRlciwgbUltZ1JlYWRlckFudyk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgaW50IHJldCA9IEFJbWFnZVJlYWRlcl9uZXdXaXRoVXNhZ2UobVdpZHRoLCBtSGVpZ2h0LCBtRm9ybWF0LCBtVXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NYXhJbWFnZXMsICZtSW1nUmVhZGVyKTsKKyAgaWYgKHJldCAhPSBBTUVESUFfT0sgfHwgbUltZ1JlYWRlciA9PSBudWxscHRyKSB7CisgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgbmV3IEFJbWFnZVJlYWRlciwgcmV0PSVkLCBtSW1nUmVhZGVyPSVwIiwgcmV0LAorICAgICAgICAgIG1JbWdSZWFkZXIpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIHJldCA9IEFJbWFnZVJlYWRlcl9zZXRJbWFnZUxpc3RlbmVyKG1JbWdSZWFkZXIsICZtUmVhZGVyQXZhaWxhYmxlQ2IpOworICBpZiAocmV0ICE9IEFNRURJQV9PSykgeworICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IGltYWdlIGF2YWlsYWJsZSBsaXN0ZW5lciwgcmV0PSVkLiIsIHJldCk7CisgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIHJldCA9IEFJbWFnZVJlYWRlcl9nZXRXaW5kb3cobUltZ1JlYWRlciwgJm1JbWdSZWFkZXJBbncpOworICBpZiAocmV0ICE9IEFNRURJQV9PSyB8fCBtSW1nUmVhZGVyQW53ID09IG51bGxwdHIpIHsKKyAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBBTmF0aXZlV2luZG93IGZyb20gQUltYWdlUmVhZGVyLCByZXQ9JWQsICIKKyAgICAgICAgICAibUltZ1JlYWRlckFudz0lcC4iLAorICAgICAgICAgIHJldCwgbUltZ1JlYWRlckFudyk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBJbWFnZVJlYWRlckhlbHBlcjo6Z2V0QnVmZmVyRnJvbUN1cnJlbnRJbWFnZShBSGFyZHdhcmVCdWZmZXIgKipvdXRCdWZmZXIpIHsKKyAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKworICBpbnQgcmV0ID0gMDsKKyAgaWYgKG1BdmFpbGFibGVJbWFnZXMgPiAwKSB7CisgICAgQUltYWdlICpvdXRJbWFnZSA9IG51bGxwdHI7CisKKyAgICBtQXZhaWxhYmxlSW1hZ2VzIC09IDE7CisKKyAgICByZXQgPSBBSW1hZ2VSZWFkZXJfYWNxdWlyZU5leHRJbWFnZShtSW1nUmVhZGVyLCAmb3V0SW1hZ2UpOworICAgIGlmIChyZXQgIT0gQU1FRElBX09LIHx8IG91dEltYWdlID09IG51bGxwdHIpIHsKKyAgICAgIC8vIFdoZW4gdGhlIEJ1ZmZlclF1ZXVlIGlzIGluIGFzeW5jIG1vZGUsIGl0IGlzIHN0aWxsIHBvc3NpYmxlIHRoYXQKKyAgICAgIC8vIEFJbWFnZVJlYWRlcl9hY3F1aXJlTmV4dEltYWdlIHJldHVybnMgbm90aGluZyBhZnRlciBvbkZyYW1lQXZhaWxhYmxlLgorICAgICAgQUxPR1coIkZhaWxlZCB0byBhY3F1aXJlIGltYWdlLCByZXQ9JWQsIG91dElhbWdlPSVwLiIsIHJldCwgb3V0SW1hZ2UpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBBbnkgZXhpc2l0bmcgaW4gbUFjcXVpcmVkSW1hZ2Ugd2lsbCBiZSBkZWxldGVkIGFuZCByZWxlYXNlZAorICAgICAgLy8gYXV0b21hdGljYWxseS4KKyAgICAgIG1BY3F1aXJlZEltYWdlLnJlc2V0KG91dEltYWdlKTsKKyAgICB9CisgIH0KKworICBpZiAobUFjcXVpcmVkSW1hZ2UgPT0gbnVsbHB0cikgeworICAgIHJldHVybiAtRUFHQUlOOworICB9CisKKyAgLy8gTm90ZSB0aGF0IEFJbWFnZV9nZXRIYXJkd2FyZUJ1ZmZlciBpcyBub3QgYWNxdWlyaW5nIGFkZGl0aW9uYWwgcmVmZXJlbmNlIHRvCisgIC8vIHRoZSBidWZmZXIsIHNvIHdlIGNhbiByZXR1cm4gaXQgaGVyZSBhbnkgdGltZXMgd2Ugd2FudCB3aXRob3V0IHdvcnJ5aW5nCisgIC8vIGFib3V0IHJlbGVhc2luZy4KKyAgQUhhcmR3YXJlQnVmZmVyICpidWZmZXIgPSBudWxscHRyOworICByZXQgPSBBSW1hZ2VfZ2V0SGFyZHdhcmVCdWZmZXIobUFjcXVpcmVkSW1hZ2UuZ2V0KCksICZidWZmZXIpOworICBpZiAocmV0ICE9IEFNRURJQV9PSyB8fCBidWZmZXIgPT0gbnVsbHB0cikgeworICAgIEFMT0dFKCJGYWlsZCB0byBnZXQgaGFyZHdhcmUgYnVmZmVyLCByZXQ9JWQsIG91dEJ1ZmZlcj0lcC4iLCByZXQsIGJ1ZmZlcik7CisgICAgcmV0dXJuIC1FTk9NRU07CisgIH0KKworICAqb3V0QnVmZmVyID0gYnVmZmVyOworICByZXR1cm4gMDsKK30KKwordm9pZCBJbWFnZVJlYWRlckhlbHBlcjo6aGFuZGxlSW1hZ2VBdmFpbGFibGUoKSB7CisgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisKKyAgbUF2YWlsYWJsZUltYWdlcyArPSAxOworfQorCit2b2lkIEltYWdlUmVhZGVySGVscGVyOjpvbkltYWdlQXZhaWxhYmxlKHZvaWQgKm9iaiwgQUltYWdlUmVhZGVyICopIHsKKyAgSW1hZ2VSZWFkZXJIZWxwZXIgKnRoaXogPSByZWludGVycHJldF9jYXN0PEltYWdlUmVhZGVySGVscGVyICo+KG9iaik7CisgIHRoaXotPmhhbmRsZUltYWdlQXZhaWxhYmxlKCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9qbmkvSW1hZ2VSZWFkZXJUZXN0SGVscGVycy5oIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvam5pL0ltYWdlUmVhZGVyVGVzdEhlbHBlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2QwOGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvam5pL0ltYWdlUmVhZGVyVGVzdEhlbHBlcnMuaApAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0lNQUdFUkVBREVSVEVTVEhFTFBFUlNfSAorI2RlZmluZSBBTkRST0lEX0lNQUdFUkVBREVSVEVTVEhFTFBFUlNfSAorCisjaW5jbHVkZSA8ZGVxdWU+CisjaW5jbHVkZSA8bXV0ZXg+CisKKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8am5pLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrSW1hZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtJbWFnZVJlYWRlci5oPgorCitjbGFzcyBJbWFnZVJlYWRlckhlbHBlciB7CitwdWJsaWM6CisgIHVzaW5nIEltYWdlUHRyID0gc3RkOjp1bmlxdWVfcHRyPEFJbWFnZSwgZGVjbHR5cGUoJkFJbWFnZV9kZWxldGUpPjsKKworICBJbWFnZVJlYWRlckhlbHBlcihpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwgaW50MzJfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHVzYWdlLCBpbnQzMl90IG1heEltYWdlcyk7CisgIH5JbWFnZVJlYWRlckhlbHBlcigpOworICBpbnQgaW5pdEltYWdlUmVhZGVyKCk7CisgIEFOYXRpdmVXaW5kb3cgKmdldE5hdGl2ZVdpbmRvdygpIHsgcmV0dXJuIG1JbWdSZWFkZXJBbnc7IH0KKyAgaW50IGdldEJ1ZmZlckZyb21DdXJyZW50SW1hZ2UoQUhhcmR3YXJlQnVmZmVyICoqb3V0QnVmZmVyKTsKKyAgdm9pZCBoYW5kbGVJbWFnZUF2YWlsYWJsZSgpOworICBzdGF0aWMgdm9pZCBvbkltYWdlQXZhaWxhYmxlKHZvaWQgKm9iaiwgQUltYWdlUmVhZGVyICopOworCitwcml2YXRlOgorICBpbnQzMl90IG1XaWR0aDsKKyAgaW50MzJfdCBtSGVpZ2h0OworICBpbnQzMl90IG1Gb3JtYXQ7CisgIHVpbnQ2NF90IG1Vc2FnZTsKKyAgdWludDMyX3QgbU1heEltYWdlczsKKworICBzdGQ6Om11dGV4IG1NdXRleDsKKyAgLy8gTnVtYmVyIG9mIGltYWdlcyB0aGF0J3MgYXZhaWFibGUgZm9yIGFjcXVpcmUuCisgIHNpemVfdCBtQXZhaWxhYmxlSW1hZ2VzezB9OworICAvLyBBbHRob3VnaCBBSW1hZ2VSZWFkZXIgc3VwcG9ydHMgYWNxdWlyaW5nIG11bHRpcGxlIGltYWdlcyBhdCBhIHRpbWUsIHdlCisgIC8vIGRvbid0IHJlYWxseSBuZWVkIGl0IGluIHRoaXMgdGVzdC4gV2Ugb25seSBhY3F1aXJlIG9uZSBpbWFnZSB0aGF0IGEgdGltZS4KKyAgSW1hZ2VQdHIgbUFjcXVpcmVkSW1hZ2V7bnVsbHB0ciwgQUltYWdlX2RlbGV0ZX07CisKKyAgQUltYWdlUmVhZGVyICptSW1nUmVhZGVye251bGxwdHJ9OworICBBTmF0aXZlV2luZG93ICptSW1nUmVhZGVyQW53e251bGxwdHJ9OworCisgIEFJbWFnZVJlYWRlcl9JbWFnZUxpc3RlbmVyIG1SZWFkZXJBdmFpbGFibGVDYnt0aGlzLCBvbkltYWdlQXZhaWxhYmxlfTsKK307CisKKyNlbmRpZiAvLyBBTkRST0lEX0lNQUdFUkVBREVSVEVTVEhFTFBFUlNfSApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvam5pL01lZGlhVGVzdEhlbHBlcnMuY3BwIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvam5pL01lZGlhVGVzdEhlbHBlcnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ZGYwNTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9qbmkvTWVkaWFUZXN0SGVscGVycy5jcHAKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCisjZGVmaW5lIExPR19UQUcgIk1lZGlhSGVscGVyIgorCisjaW5jbHVkZSAiTWVkaWFUZXN0SGVscGVycy5oIgorCisjaW5jbHVkZSA8YW5kcm9pZC9hc3NldF9tYW5hZ2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9hc3NldF9tYW5hZ2VyX2puaS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbG9nLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNkZWZpbmUgQUxPR0UoLi4uKSBfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX0VSUk9SLCBMT0dfVEFHLCBfX1ZBX0FSR1NfXykKKworI2RlZmluZSBBU1NFUlQoYSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKCEoYSkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQUxPR0UoIkZhaWx1cmU6ICIgI2EgIiBhdCAiIF9fRklMRV9fICI6JWQiLCBfX0xJTkVfXyk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisjZGVmaW5lIE1FRElBX0NBTEwoYSkgQVNTRVJUKEFNRURJQV9PSyA9PSAoYSkpCisKK01lZGlhSGVscGVyOjp+TWVkaWFIZWxwZXIoKSB7CisgIGlmIChtQ29kZWMgIT0gbnVsbHB0cikgeworICAgIEFNZWRpYUNvZGVjX3N0b3AobUNvZGVjKTsKKyAgICBBTWVkaWFDb2RlY19kZWxldGUobUNvZGVjKTsKKyAgICBtQ29kZWMgPSBudWxscHRyOworICB9CisgIGlmIChtRXh0cmFjdG9yICE9IG51bGxwdHIpIHsKKyAgICBBTWVkaWFFeHRyYWN0b3JfZGVsZXRlKG1FeHRyYWN0b3IpOworICAgIG1FeHRyYWN0b3IgPSBudWxscHRyOworICB9Cit9CisKK2Jvb2wgTWVkaWFIZWxwZXI6OmluaXQoSk5JRW52ICplbnYsIGpvYmplY3QgYXNzZXRNZ3IsIGpzdHJpbmcgamZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBBTmF0aXZlV2luZG93ICp3aW5kb3cpIHsKKyAgLy8gQ3JlYXRlIGEgbWVkaWEgZXh0cmFjdG9yIHdoaWNoIHdpbGwgcHJvdmlkZSBjb2RlYyBkYXRhIGZyb20gamZpbGVuYW1lLgorICBBU1NFUlQoY3JlYXRlRXh0cmFjdG9yKGVudiwgYXNzZXRNZ3IsIGpmaWxlbmFtZSkpOworICAvLyBDcmVhdGUgYSBtZWRpYSBjb2RlYyBhbmQgaW1hZ2UgcmVhZGVyIHdoaWNoIHJlY2VpdmVzIGZyYW1lcyBmcm9tIHRoZQorICAvLyBjb2RlYy4KKyAgQVNTRVJUKGNyZWF0ZU1lZGlhQ29kZWMod2luZG93KSk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTWVkaWFIZWxwZXI6OnByb2Nlc3NPbmVGcmFtZSgpIHsKKyAgQVNTRVJUKG1Db2RlYyk7CisKKyAgLy8gV2FpdCB1bnRpbCB0aGUgY29kZWMgcHJvZHVjZXMgYW4gb3V0cHV0IGJ1ZmZlciwgd2hpY2ggd2UgY2FuIHJlYWQgYXMKKyAgLy8gYW4gaW1hZ2UuCisgIGJvb2wgZ290T3V0cHV0QnVmZmVyID0gZmFsc2U7CisgIGRvIHsKKyAgICBBU1NFUlQocHJvY2Vzc09uZUlucHV0QnVmZmVyKCkpOworICAgIEFTU0VSVChwcm9jZXNzT25lT3V0cHV0QnVmZmVyKCZnb3RPdXRwdXRCdWZmZXIpKTsKKyAgfSB3aGlsZSAoIWdvdE91dHB1dEJ1ZmZlcik7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTWVkaWFIZWxwZXI6OmNyZWF0ZUV4dHJhY3RvcihKTklFbnYgKmVudiwgam9iamVjdCBhc3NldE1nciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc3RyaW5nIGpmaWxlbmFtZSkgeworICBBU1NFUlQobnVsbHB0ciA9PSBtRXh0cmFjdG9yKTsKKyAgY29uc3QgY2hhciAqZmlsZW5hbWUgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGpmaWxlbmFtZSwgTlVMTCk7CisgIEFTU0VSVChmaWxlbmFtZSk7CisKKyAgc3RydWN0IFJlbGVhc2VGZCB7CisgICAgflJlbGVhc2VGZCgpIHsKKyAgICAgIGlmIChmZCA+PSAwKQorICAgICAgICBjbG9zZShmZCk7CisgICAgfQorCisgICAgaW50IGZkID0gLTE7CisgIH0gcmVsZWFzZUZkOworCisgIG9mZl90IG91dFN0YXJ0LCBvdXRMZW47CisgIHJlbGVhc2VGZC5mZCA9IEFBc3NldF9vcGVuRmlsZURlc2NyaXB0b3IoCisgICAgICBBQXNzZXRNYW5hZ2VyX29wZW4oQUFzc2V0TWFuYWdlcl9mcm9tSmF2YShlbnYsIGFzc2V0TWdyKSwgZmlsZW5hbWUsIDApLAorICAgICAgJm91dFN0YXJ0LCAmb3V0TGVuKTsKKyAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoamZpbGVuYW1lLCBmaWxlbmFtZSk7CisgIEFTU0VSVChyZWxlYXNlRmQuZmQgPj0gMCk7CisKKyAgbUV4dHJhY3RvciA9IEFNZWRpYUV4dHJhY3Rvcl9uZXcoKTsKKyAgTUVESUFfQ0FMTChBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZUZkKG1FeHRyYWN0b3IsIHJlbGVhc2VGZC5mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PG9mZjY0X3Q+KG91dFN0YXJ0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PG9mZjY0X3Q+KG91dExlbikpKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTWVkaWFIZWxwZXI6OmNyZWF0ZU1lZGlhQ29kZWMoQU5hdGl2ZVdpbmRvdyAqd2luZG93KSB7CisgIEFTU0VSVChtRXh0cmFjdG9yKTsKKyAgQVNTRVJUKG51bGxwdHIgPT0gbUNvZGVjKTsKKworICAvLyBDcmVhdGUgYSBtQ29kZWMgZnJvbSB0aGUgdmlkZW8gdHJhY2suCisgIGludCBudW1UcmFja3MgPSBBTWVkaWFFeHRyYWN0b3JfZ2V0VHJhY2tDb3VudChtRXh0cmFjdG9yKTsKKyAgQU1lZGlhRm9ybWF0ICpmb3JtYXQ7CisgIGNvbnN0IGNoYXIgKm1pbWU7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtVHJhY2tzOyArK2kpIHsKKyAgICBmb3JtYXQgPSBBTWVkaWFFeHRyYWN0b3JfZ2V0VHJhY2tGb3JtYXQobUV4dHJhY3RvciwgaSk7CisgICAgQVNTRVJUKEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKSk7CisKKyAgICBpZiAoIXN0cm5jbXAobWltZSwgInZpZGVvLyIsIDYpKSB7CisgICAgICBNRURJQV9DQUxMKEFNZWRpYUV4dHJhY3Rvcl9zZWxlY3RUcmFjayhtRXh0cmFjdG9yLCBpKSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKGZvcm1hdCk7CisgIH0KKworICBtQ29kZWMgPSBBTWVkaWFDb2RlY19jcmVhdGVEZWNvZGVyQnlUeXBlKG1pbWUpOworICBBU1NFUlQobUNvZGVjKTsKKyAgTUVESUFfQ0FMTChBTWVkaWFDb2RlY19jb25maWd1cmUobUNvZGVjLCBmb3JtYXQsIHdpbmRvdywgTlVMTCwgMCkpOworICBBTWVkaWFGb3JtYXRfZGVsZXRlKGZvcm1hdCk7CisgIE1FRElBX0NBTEwoQU1lZGlhQ29kZWNfc3RhcnQobUNvZGVjKSk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTWVkaWFIZWxwZXI6OnByb2Nlc3NPbmVJbnB1dEJ1ZmZlcigpIHsKKyAgc3NpemVfdCBidWZmZXJJbmRleCA9IEFNZWRpYUNvZGVjX2RlcXVldWVJbnB1dEJ1ZmZlcihtQ29kZWMsIDIwMDApOworICAvLyBObyBpbnB1dCBidWZmZXIgcmVhZHksIGp1c3QgcmV0dXJuLCB3ZSdsbCB0cnkgYWdhaW4uCisgIGlmIChidWZmZXJJbmRleCA8IDApCisgICAgcmV0dXJuIHRydWU7CisKKyAgc2l6ZV90IGJ1ZmZlclNpemUgPSAwOworICB1aW50OF90ICpidWZmZXIgPQorICAgICAgQU1lZGlhQ29kZWNfZ2V0SW5wdXRCdWZmZXIobUNvZGVjLCBidWZmZXJJbmRleCwgJmJ1ZmZlclNpemUpOworICBBU1NFUlQoYnVmZmVyKTsKKworICBzc2l6ZV90IHNhbXBsZVNpemUgPQorICAgICAgQU1lZGlhRXh0cmFjdG9yX3JlYWRTYW1wbGVEYXRhKG1FeHRyYWN0b3IsIGJ1ZmZlciwgYnVmZmVyU2l6ZSk7CisgIEFTU0VSVChzYW1wbGVTaXplID49IDApOworCisgIGF1dG8gcHJlc2VudGF0aW9uVGltZVVzID0gQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZVRpbWUobUV4dHJhY3Rvcik7CisgIE1FRElBX0NBTEwoQU1lZGlhQ29kZWNfcXVldWVJbnB1dEJ1ZmZlcihtQ29kZWMsIGJ1ZmZlckluZGV4LCAwLCBzYW1wbGVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VudGF0aW9uVGltZVVzLCAwKSk7CisKKyAgQVNTRVJUKEFNZWRpYUV4dHJhY3Rvcl9hZHZhbmNlKG1FeHRyYWN0b3IpKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmIHdlIHN1Y2Nlc3NmdWxseSBnb3QgYW4gb3V0cHV0IGJ1ZmZlci4KK2Jvb2wgTWVkaWFIZWxwZXI6OnByb2Nlc3NPbmVPdXRwdXRCdWZmZXIoYm9vbCAqZGlkUHJvY2Vzc0J1ZmZlcikgeworICAqZGlkUHJvY2Vzc0J1ZmZlciA9IGZhbHNlOworCisgIEFNZWRpYUNvZGVjQnVmZmVySW5mbyBpbmZvOworICBzc2l6ZV90IGluZGV4ID0gQU1lZGlhQ29kZWNfZGVxdWV1ZU91dHB1dEJ1ZmZlcihtQ29kZWMsICZpbmZvLCAwKTsKKyAgaWYgKGluZGV4IDwgMCkgeworICAgIHN3aXRjaCAoaW5kZXgpIHsKKyAgICBjYXNlIEFNRURJQUNPREVDX0lORk9fT1VUUFVUX0JVRkZFUlNfQ0hBTkdFRDoKKyAgICBjYXNlIEFNRURJQUNPREVDX0lORk9fT1VUUFVUX0ZPUk1BVF9DSEFOR0VEOgorICAgIGNhc2UgQU1FRElBQ09ERUNfSU5GT19UUllfQUdBSU5fTEFURVI6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgICpkaWRQcm9jZXNzQnVmZmVyID0gdHJ1ZTsKKyAgTUVESUFfQ0FMTChBTWVkaWFDb2RlY19yZWxlYXNlT3V0cHV0QnVmZmVyKG1Db2RlYywgaW5kZXgsIGluZm8uc2l6ZSAhPSAwKSk7CisgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvam5pL01lZGlhVGVzdEhlbHBlcnMuaCBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL2puaS9NZWRpYVRlc3RIZWxwZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU0NTUxOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL2puaS9NZWRpYVRlc3RIZWxwZXJzLmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQVRFU1RIRUxQRVJTX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQVRFU1RIRUxQRVJTX0gKKworI2luY2x1ZGUgPGpuaS5oPgorI2luY2x1ZGUgPG1lZGlhL05ka0ltYWdlUmVhZGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFDb2RlYy5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXh0cmFjdG9yLmg+CisKK2NsYXNzIE1lZGlhSGVscGVyIHsKK3B1YmxpYzoKKyAgfk1lZGlhSGVscGVyKCk7CisgIGJvb2wgaW5pdChKTklFbnYgKmVudiwgam9iamVjdCBhc3NldE1nciwganN0cmluZyBqZmlsZW5hbWUsCisgICAgICAgICAgICBBTmF0aXZlV2luZG93ICp3aW5kb3cpOworICBib29sIHByb2Nlc3NPbmVGcmFtZSgpOworCitwcml2YXRlOgorICBib29sIGNyZWF0ZUV4dHJhY3RvcihKTklFbnYgKmVudiwgam9iamVjdCBhc3NldE1nciwganN0cmluZyBqZmlsZW5hbWUpOworICBib29sIGNyZWF0ZU1lZGlhQ29kZWMoQU5hdGl2ZVdpbmRvdyAqd2luZG93KTsKKyAgYm9vbCBwcm9jZXNzT25lSW5wdXRCdWZmZXIoKTsKKyAgYm9vbCBwcm9jZXNzT25lT3V0cHV0QnVmZmVyKGJvb2wgKmRpZFByb2Nlc3NlZEJ1ZmZlcik7CisKKyAgQU1lZGlhRXh0cmFjdG9yICptRXh0cmFjdG9yID0gbnVsbHB0cjsKKyAgQU1lZGlhQ29kZWMgKm1Db2RlYyA9IG51bGxwdHI7Cit9OworCisjZW5kaWYgLy8gQU5EUk9JRF9NRURJQVRFU1RIRUxQRVJTX0gKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL2puaS9OYXRpdmVUZXN0SGVscGVycy5jcHAgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9qbmkvTmF0aXZlVGVzdEhlbHBlcnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmODg3ZjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9qbmkvTmF0aXZlVGVzdEhlbHBlcnMuY3BwCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCisjaW5jbHVkZSAiTmF0aXZlVGVzdEhlbHBlcnMuaCIKKworI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8Y3N0cmluZz4KKwordm9pZCBmYWlsKEpOSUVudiAqZW52LCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikgeworICB2YV9saXN0IGFyZ3M7CisKKyAgdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKyAgY2hhciAqbXNnOworICB2YXNwcmludGYoJm1zZywgZm9ybWF0LCBhcmdzKTsKKyAgdmFfZW5kKGFyZ3MpOworCisgIGpjbGFzcyBleENsYXNzOworICBjb25zdCBjaGFyICpjbGFzc05hbWUgPSAiamF2YS9sYW5nL0Fzc2VydGlvbkVycm9yIjsKKyAgZXhDbGFzcyA9IGVudi0+RmluZENsYXNzKGNsYXNzTmFtZSk7CisgIGVudi0+VGhyb3dOZXcoZXhDbGFzcywgbXNnKTsKKyAgZnJlZShtc2cpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvam5pL05hdGl2ZVRlc3RIZWxwZXJzLmggYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9qbmkvTmF0aXZlVGVzdEhlbHBlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTcwNjE0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvam5pL05hdGl2ZVRlc3RIZWxwZXJzLmgKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9OQVRJVkVURVNUSEVMUEVSU19ICisjZGVmaW5lIEFORFJPSURfTkFUSVZFVEVTVEhFTFBFUlNfSAorCisjaW5jbHVkZSA8YW5kcm9pZC9sb2cuaD4KKyNpbmNsdWRlIDxqbmkuaD4KKworI2RlZmluZSBBU1NFUlQoY29uZGl0aW9uLCBmb3JtYXQsIGFyZ3MuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKCEoY29uZGl0aW9uKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZmFpbChlbnYsIGZvcm1hdCwgIyNhcmdzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisjZGVmaW5lIEFTU0VSVF9UUlVFKGEpIEFTU0VSVCgoYSksICJhc3NlcnQgZmFpbGVkIG9uICgiICNhICIpIGF0ICIgX19GSUxFX18gIjolZCIsIF9fTElORV9fKQorI2RlZmluZSBBU1NFUlRfRkFMU0UoYSkgQVNTRVJUKCEoYSksICJhc3NlcnQgZmFpbGVkIG9uICghIiAjYSAiKSBhdCAiIF9fRklMRV9fICI6JWQiLCBfX0xJTkVfXykKKyNkZWZpbmUgQVNTRVJUX0VRKGEsIGIpIFwKKyAgICAgICAgQVNTRVJUKChhKSA9PSAoYiksICJhc3NlcnQgZmFpbGVkIG9uICgiICNhICIgPT0gIiAjYiAiKSBhdCAiIF9fRklMRV9fICI6JWQiLCBfX0xJTkVfXykKKyNkZWZpbmUgQVNTRVJUX05FKGEsIGIpIFwKKyAgICAgICAgQVNTRVJUKChhKSAhPSAoYiksICJhc3NlcnQgZmFpbGVkIG9uICgiICNhICIgIT0gIiAjYiAiKSBhdCAiIF9fRklMRV9fICI6JWQiLCBfX0xJTkVfXykKKyNkZWZpbmUgQVNTRVJUX0dUKGEsIGIpIFwKKyAgICAgICAgQVNTRVJUKChhKSA+IChiKSwgImFzc2VydCBmYWlsZWQgb24gKCIgI2EgIiA+ICIgI2IgIikgYXQgIiBfX0ZJTEVfXyAiOiVkIiwgX19MSU5FX18pCisjZGVmaW5lIEFTU0VSVF9HRShhLCBiKSBcCisgICAgICAgIEFTU0VSVCgoYSkgPj0gKGIpLCAiYXNzZXJ0IGZhaWxlZCBvbiAoIiAjYSAiID49ICIgI2IgIikgYXQgIiBfX0ZJTEVfXyAiOiVkIiwgX19MSU5FX18pCisjZGVmaW5lIEFTU0VSVF9MVChhLCBiKSBcCisgICAgICAgIEFTU0VSVCgoYSkgPCAoYiksICJhc3NlcnQgZmFpbGVkIG9uICgiICNhICIgPCAiICNiICIpIGF0ICIgX19GSUxFX18gIjolZCIsIF9fTElORV9fKQorI2RlZmluZSBBU1NFUlRfTEUoYSwgYikgXAorICAgICAgICBBU1NFUlQoKGEpIDw9IChiKSwgImFzc2VydCBmYWlsZWQgb24gKCIgI2EgIiA8PSAiICNiICIpIGF0ICIgX19GSUxFX18gIjolZCIsIF9fTElORV9fKQorCisjZGVmaW5lIEFMT0dFKC4uLikgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19FUlJPUiwgTE9HX1RBRywgX19WQV9BUkdTX18pCisKKy8vIFJhaXNlcyBhIGphdmEgZXhjZXB0aW9uLgordm9pZCBmYWlsKEpOSUVudiAqZW52LCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLik7CisKKyNlbmRpZiAgLy8gQU5EUk9JRF9OQVRJVkVURVNUSEVMUEVSU19ICisKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL2puaS9WdWxrYW5QcmVUcmFuc2Zvcm1UZXN0SGVscGVycy5jcHAgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9qbmkvVnVsa2FuUHJlVHJhbnNmb3JtVGVzdEhlbHBlcnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYWEzMTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9qbmkvVnVsa2FuUHJlVHJhbnNmb3JtVGVzdEhlbHBlcnMuY3BwCkBAIC0wLDAgKzEsODcwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGFuZHJvaWQvbG9nLmg+CisjaW5jbHVkZSA8Y3N0cmluZz4KKworI2luY2x1ZGUgIlZ1bGthblByZVRyYW5zZm9ybVRlc3RIZWxwZXJzLmgiCisKKyNkZWZpbmUgQUxPR0QoLi4uKSBfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX0RFQlVHLCBMT0dfVEFHLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgQUxPR0UoLi4uKSBfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX0VSUk9SLCBMT0dfVEFHLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgQVNTRVJUKGEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIShhKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR0UoIkZhaWx1cmU6ICIgI2EgIiBhdCAiIF9fRklMRV9fICI6JWQiLCBfX0xJTkVfXyk7IFwKKyAgICAgICAgcmV0dXJuIC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisjZGVmaW5lIFZLX0NBTEwoYSkgQVNTRVJUKFZLX1NVQ0NFU1MgPT0gKGEpKQorCitzdGF0aWMgY29uc3QgZmxvYXQgdmVydGV4RGF0YVtdID0geworICAgICAgICAvLyBMOmxlZnQsIFQ6dG9wLCBSOnJpZ2h0LCBCOmJvdHRvbSwgQzpjZW50ZXIKKyAgICAgICAgLTEuMGYsIC0xLjBmLCAwLjBmLCAvLyBMVAorICAgICAgICAtMS4wZiwgIDAuMGYsIDAuMGYsIC8vIExDCisgICAgICAgICAwLjBmLCAtMS4wZiwgMC4wZiwgLy8gQ1QKKyAgICAgICAgIDAuMGYsICAwLjBmLCAwLjBmLCAvLyBDQworICAgICAgICAgMS4wZiwgLTEuMGYsIDAuMGYsIC8vIFJUCisgICAgICAgICAxLjBmLCAgMC4wZiwgMC4wZiwgLy8gUkMKKyAgICAgICAgLTEuMGYsICAwLjBmLCAwLjBmLCAvLyBMQworICAgICAgICAtMS4wZiwgIDEuMGYsIDAuMGYsIC8vIExCCisgICAgICAgICAwLjBmLCAgMC4wZiwgMC4wZiwgLy8gQ0MKKyAgICAgICAgIDAuMGYsICAxLjBmLCAwLjBmLCAvLyBDQgorICAgICAgICAgMS4wZiwgIDAuMGYsIDAuMGYsIC8vIFJDCisgICAgICAgICAxLjBmLCAgMS4wZiwgMC4wZiwgLy8gUkIKK307CisKK3N0YXRpYyBjb25zdCBmbG9hdCBmcmFnRGF0YVtdID0geworICAgICAgICAxLjBmLCAwLjBmLCAwLjBmLCAvLyBSZWQKKyAgICAgICAgMC4wZiwgMS4wZiwgMC4wZiwgLy8gR3JlZW4KKyAgICAgICAgMC4wZiwgMC4wZiwgMS4wZiwgLy8gQmx1ZQorICAgICAgICAxLjBmLCAxLjBmLCAwLjBmLCAvLyBZZWxsb3cKK307CisKK3N0YXRpYyBjb25zdCBjaGFyKiByZXF1aXJlZEluc3RhbmNlRXh0ZW5zaW9uc1tdID0geworICAgICAgICAiVktfS0hSX3N1cmZhY2UiLAorICAgICAgICAiVktfS0hSX2FuZHJvaWRfc3VyZmFjZSIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciogcmVxdWlyZWREZXZpY2VFeHRlbnNpb25zW10gPSB7CisgICAgICAgICJWS19LSFJfc3dhcGNoYWluIiwKK307CisKK3N0YXRpYyBib29sIGVudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9ucyhzdGQ6OnZlY3RvcjxWa0V4dGVuc2lvblByb3BlcnRpZXM+KiBleHRlbnNpb25zKSB7CisgICAgVmtSZXN1bHQgcmVzdWx0OworCisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIHJlc3VsdCA9IHZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKG51bGxwdHIsICZjb3VudCwgbnVsbHB0cik7CisgICAgaWYgKHJlc3VsdCAhPSBWS19TVUNDRVNTKSByZXR1cm4gZmFsc2U7CisKKyAgICBleHRlbnNpb25zLT5yZXNpemUoY291bnQpOworICAgIHJlc3VsdCA9IHZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKG51bGxwdHIsICZjb3VudCwgZXh0ZW5zaW9ucy0+ZGF0YSgpKTsKKyAgICBpZiAocmVzdWx0ICE9IFZLX1NVQ0NFU1MpIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBlbnVtZXJhdGVEZXZpY2VFeHRlbnNpb25zKFZrUGh5c2ljYWxEZXZpY2UgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxWa0V4dGVuc2lvblByb3BlcnRpZXM+KiBleHRlbnNpb25zKSB7CisgICAgVmtSZXN1bHQgcmVzdWx0OworCisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIHJlc3VsdCA9IHZrRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcyhkZXZpY2UsIG51bGxwdHIsICZjb3VudCwgbnVsbHB0cik7CisgICAgaWYgKHJlc3VsdCAhPSBWS19TVUNDRVNTKSByZXR1cm4gZmFsc2U7CisKKyAgICBleHRlbnNpb25zLT5yZXNpemUoY291bnQpOworICAgIHJlc3VsdCA9IHZrRW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9uUHJvcGVydGllcyhkZXZpY2UsIG51bGxwdHIsICZjb3VudCwgZXh0ZW5zaW9ucy0+ZGF0YSgpKTsKKyAgICBpZiAocmVzdWx0ICE9IFZLX1NVQ0NFU1MpIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBoYXNFeHRlbnNpb24oY29uc3QgY2hhciogZXh0ZW5zaW9uX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8VmtFeHRlbnNpb25Qcm9wZXJ0aWVzPiYgZXh0ZW5zaW9ucykgeworICAgIHJldHVybiBzdGQ6OmZpbmRfaWYoZXh0ZW5zaW9ucy5jYmVnaW4oKSwgZXh0ZW5zaW9ucy5jZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICBbZXh0ZW5zaW9uX25hbWVdKGNvbnN0IFZrRXh0ZW5zaW9uUHJvcGVydGllcyYgZXh0ZW5zaW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0cmNtcChleHRlbnNpb24uZXh0ZW5zaW9uTmFtZSwgZXh0ZW5zaW9uX25hbWUpID09IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9KSAhPSBleHRlbnNpb25zLmNlbmQoKTsKK30KKworRGV2aWNlSW5mbzo6RGV2aWNlSW5mbygpCisgICAgICA6IG1JbnN0YW5jZShWS19OVUxMX0hBTkRMRSksCisgICAgICAgIG1HcHUoVktfTlVMTF9IQU5ETEUpLAorICAgICAgICBtV2luZG93KG51bGxwdHIpLAorICAgICAgICBtU3VyZmFjZShWS19OVUxMX0hBTkRMRSksCisgICAgICAgIG1RdWV1ZUZhbWlseUluZGV4KDApLAorICAgICAgICBtRGV2aWNlKFZLX05VTExfSEFORExFKSwKKyAgICAgICAgbVF1ZXVlKFZLX05VTExfSEFORExFKSB7fQorCitEZXZpY2VJbmZvOjp+RGV2aWNlSW5mbygpIHsKKyAgICBpZiAobURldmljZSkgeworICAgICAgICB2a0RldmljZVdhaXRJZGxlKG1EZXZpY2UpOworICAgICAgICB2a0Rlc3Ryb3lEZXZpY2UobURldmljZSwgbnVsbHB0cik7CisgICAgICAgIG1EZXZpY2UgPSBWS19OVUxMX0hBTkRMRTsKKyAgICB9CisgICAgaWYgKG1JbnN0YW5jZSkgeworICAgICAgICB2a0Rlc3Ryb3lTdXJmYWNlS0hSKG1JbnN0YW5jZSwgbVN1cmZhY2UsIG51bGxwdHIpOworICAgICAgICB2a0Rlc3Ryb3lJbnN0YW5jZShtSW5zdGFuY2UsIG51bGxwdHIpOworICAgICAgICBtSW5zdGFuY2UgPSBWS19OVUxMX0hBTkRMRTsKKyAgICB9CisgICAgaWYgKG1XaW5kb3cpIHsKKyAgICAgICAgQU5hdGl2ZVdpbmRvd19yZWxlYXNlKG1XaW5kb3cpOworICAgICAgICBtV2luZG93ID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK2ludDMyX3QgRGV2aWNlSW5mbzo6aW5pdChKTklFbnYqIGVudiwgam9iamVjdCBqU3VyZmFjZSkgeworICAgIEFTU0VSVChqU3VyZmFjZSk7CisKKyAgICBtV2luZG93ID0gQU5hdGl2ZVdpbmRvd19mcm9tU3VyZmFjZShlbnYsIGpTdXJmYWNlKTsKKyAgICBBU1NFUlQobVdpbmRvdyk7CisKKyAgICBzdGQ6OnZlY3RvcjxWa0V4dGVuc2lvblByb3BlcnRpZXM+IHN1cHBvcnRlZEluc3RhbmNlRXh0ZW5zaW9uczsKKyAgICBBU1NFUlQoZW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25zKCZzdXBwb3J0ZWRJbnN0YW5jZUV4dGVuc2lvbnMpKTsKKworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIqPiBlbmFibGVkSW5zdGFuY2VFeHRlbnNpb25zOworICAgIGZvciAoY29uc3QgYXV0byBleHRlbnNpb24gOiByZXF1aXJlZEluc3RhbmNlRXh0ZW5zaW9ucykgeworICAgICAgICBBU1NFUlQoaGFzRXh0ZW5zaW9uKGV4dGVuc2lvbiwgc3VwcG9ydGVkSW5zdGFuY2VFeHRlbnNpb25zKSk7CisgICAgICAgIGVuYWJsZWRJbnN0YW5jZUV4dGVuc2lvbnMucHVzaF9iYWNrKGV4dGVuc2lvbik7CisgICAgfQorCisgICAgY29uc3QgVmtBcHBsaWNhdGlvbkluZm8gYXBwSW5mbyA9IHsKKyAgICAgICAgICAgIC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0FQUExJQ0FUSU9OX0lORk8sCisgICAgICAgICAgICAucE5leHQgPSBudWxscHRyLAorICAgICAgICAgICAgLnBBcHBsaWNhdGlvbk5hbWUgPSAiVnVsa2FuUHJlVHJhbnNmb3JtVGVzdCIsCisgICAgICAgICAgICAuYXBwbGljYXRpb25WZXJzaW9uID0gVktfTUFLRV9WRVJTSU9OKDEsIDAsIDApLAorICAgICAgICAgICAgLnBFbmdpbmVOYW1lID0gIiIsCisgICAgICAgICAgICAuZW5naW5lVmVyc2lvbiA9IFZLX01BS0VfVkVSU0lPTigxLCAwLCAwKSwKKyAgICAgICAgICAgIC5hcGlWZXJzaW9uID0gVktfTUFLRV9WRVJTSU9OKDEsIDAsIDApLAorICAgIH07CisgICAgY29uc3QgVmtJbnN0YW5jZUNyZWF0ZUluZm8gaW5zdGFuY2VJbmZvID0geworICAgICAgICAgICAgLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU5TVEFOQ0VfQ1JFQVRFX0lORk8sCisgICAgICAgICAgICAucE5leHQgPSBudWxscHRyLAorICAgICAgICAgICAgLmZsYWdzID0gMCwKKyAgICAgICAgICAgIC5wQXBwbGljYXRpb25JbmZvID0gJmFwcEluZm8sCisgICAgICAgICAgICAuZW5hYmxlZExheWVyQ291bnQgPSAwLAorICAgICAgICAgICAgLnBwRW5hYmxlZExheWVyTmFtZXMgPSBudWxscHRyLAorICAgICAgICAgICAgLmVuYWJsZWRFeHRlbnNpb25Db3VudCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihlbmFibGVkSW5zdGFuY2VFeHRlbnNpb25zLnNpemUoKSksCisgICAgICAgICAgICAucHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMgPSBlbmFibGVkSW5zdGFuY2VFeHRlbnNpb25zLmRhdGEoKSwKKyAgICB9OworICAgIFZLX0NBTEwodmtDcmVhdGVJbnN0YW5jZSgmaW5zdGFuY2VJbmZvLCBudWxscHRyLCAmbUluc3RhbmNlKSk7CisKKyAgICB1aW50MzJfdCBncHVDb3VudCA9IDA7CisgICAgVktfQ0FMTCh2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyhtSW5zdGFuY2UsICZncHVDb3VudCwgbnVsbHB0cikpOworICAgIGlmIChncHVDb3VudCA9PSAwKSB7CisgICAgICAgIEFMT0dEKCJObyBwaHlzaWNhbCBkZXZpY2UgYXZhaWxhYmxlIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPFZrUGh5c2ljYWxEZXZpY2U+IGdwdXMoZ3B1Q291bnQsIFZLX05VTExfSEFORExFKTsKKyAgICBWS19DQUxMKHZrRW51bWVyYXRlUGh5c2ljYWxEZXZpY2VzKG1JbnN0YW5jZSwgJmdwdUNvdW50LCBncHVzLmRhdGEoKSkpOworCisgICAgbUdwdSA9IGdwdXNbMF07CisKKyAgICBjb25zdCBWa0FuZHJvaWRTdXJmYWNlQ3JlYXRlSW5mb0tIUiBzdXJmYWNlSW5mbyA9IHsKKyAgICAgICAgICAgIC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0FORFJPSURfU1VSRkFDRV9DUkVBVEVfSU5GT19LSFIsCisgICAgICAgICAgICAucE5leHQgPSBudWxscHRyLAorICAgICAgICAgICAgLmZsYWdzID0gMCwKKyAgICAgICAgICAgIC53aW5kb3cgPSBtV2luZG93LAorICAgIH07CisgICAgVktfQ0FMTCh2a0NyZWF0ZUFuZHJvaWRTdXJmYWNlS0hSKG1JbnN0YW5jZSwgJnN1cmZhY2VJbmZvLCBudWxscHRyLCAmbVN1cmZhY2UpKTsKKworICAgIHN0ZDo6dmVjdG9yPFZrRXh0ZW5zaW9uUHJvcGVydGllcz4gc3VwcG9ydGVkRGV2aWNlRXh0ZW5zaW9uczsKKyAgICBBU1NFUlQoZW51bWVyYXRlRGV2aWNlRXh0ZW5zaW9ucyhtR3B1LCAmc3VwcG9ydGVkRGV2aWNlRXh0ZW5zaW9ucykpOworCisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhcio+IGVuYWJsZWREZXZpY2VFeHRlbnNpb25zOworICAgIGZvciAoY29uc3QgYXV0byBleHRlbnNpb24gOiByZXF1aXJlZERldmljZUV4dGVuc2lvbnMpIHsKKyAgICAgICAgQVNTRVJUKGhhc0V4dGVuc2lvbihleHRlbnNpb24sIHN1cHBvcnRlZERldmljZUV4dGVuc2lvbnMpKTsKKyAgICAgICAgZW5hYmxlZERldmljZUV4dGVuc2lvbnMucHVzaF9iYWNrKGV4dGVuc2lvbik7CisgICAgfQorCisgICAgdWludDMyX3QgcXVldWVGYW1pbHlDb3VudCA9IDA7CisgICAgdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllcyhtR3B1LCAmcXVldWVGYW1pbHlDb3VudCwgbnVsbHB0cik7CisgICAgQVNTRVJUKHF1ZXVlRmFtaWx5Q291bnQpOworCisgICAgc3RkOjp2ZWN0b3I8VmtRdWV1ZUZhbWlseVByb3BlcnRpZXM+IHF1ZXVlRmFtaWx5UHJvcGVydGllcyhxdWV1ZUZhbWlseUNvdW50KTsKKyAgICB2a0dldFBoeXNpY2FsRGV2aWNlUXVldWVGYW1pbHlQcm9wZXJ0aWVzKG1HcHUsICZxdWV1ZUZhbWlseUNvdW50LCBxdWV1ZUZhbWlseVByb3BlcnRpZXMuZGF0YSgpKTsKKworICAgIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXg7CisgICAgZm9yIChxdWV1ZUZhbWlseUluZGV4ID0gMDsgcXVldWVGYW1pbHlJbmRleCA8IHF1ZXVlRmFtaWx5Q291bnQ7ICsrcXVldWVGYW1pbHlJbmRleCkgeworICAgICAgICBpZiAocXVldWVGYW1pbHlQcm9wZXJ0aWVzW3F1ZXVlRmFtaWx5SW5kZXhdLnF1ZXVlRmxhZ3MgJiBWS19RVUVVRV9HUkFQSElDU19CSVQpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVChxdWV1ZUZhbWlseUluZGV4IDwgcXVldWVGYW1pbHlDb3VudCk7CisgICAgbVF1ZXVlRmFtaWx5SW5kZXggPSBxdWV1ZUZhbWlseUluZGV4OworCisgICAgY29uc3QgZmxvYXQgcHJpb3JpdHkgPSAxLjBmOworICAgIGNvbnN0IFZrRGV2aWNlUXVldWVDcmVhdGVJbmZvIHF1ZXVlQ3JlYXRlSW5mbyA9IHsKKyAgICAgICAgICAgIC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9RVUVVRV9DUkVBVEVfSU5GTywKKyAgICAgICAgICAgIC5wTmV4dCA9IG51bGxwdHIsCisgICAgICAgICAgICAuZmxhZ3MgPSAwLAorICAgICAgICAgICAgLnF1ZXVlRmFtaWx5SW5kZXggPSBtUXVldWVGYW1pbHlJbmRleCwKKyAgICAgICAgICAgIC5xdWV1ZUNvdW50ID0gMSwKKyAgICAgICAgICAgIC5wUXVldWVQcmlvcml0aWVzID0gJnByaW9yaXR5LAorICAgIH07CisgICAgY29uc3QgVmtEZXZpY2VDcmVhdGVJbmZvIGRldmljZUNyZWF0ZUluZm8gPSB7CisgICAgICAgICAgICAuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfQ1JFQVRFX0lORk8sCisgICAgICAgICAgICAucE5leHQgPSBudWxscHRyLAorICAgICAgICAgICAgLnF1ZXVlQ3JlYXRlSW5mb0NvdW50ID0gMSwKKyAgICAgICAgICAgIC5wUXVldWVDcmVhdGVJbmZvcyA9ICZxdWV1ZUNyZWF0ZUluZm8sCisgICAgICAgICAgICAuZW5hYmxlZExheWVyQ291bnQgPSAwLAorICAgICAgICAgICAgLnBwRW5hYmxlZExheWVyTmFtZXMgPSBudWxscHRyLAorICAgICAgICAgICAgLmVuYWJsZWRFeHRlbnNpb25Db3VudCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihlbmFibGVkRGV2aWNlRXh0ZW5zaW9ucy5zaXplKCkpLAorICAgICAgICAgICAgLnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzID0gZW5hYmxlZERldmljZUV4dGVuc2lvbnMuZGF0YSgpLAorICAgICAgICAgICAgLnBFbmFibGVkRmVhdHVyZXMgPSBudWxscHRyLAorICAgIH07CisgICAgVktfQ0FMTCh2a0NyZWF0ZURldmljZShtR3B1LCAmZGV2aWNlQ3JlYXRlSW5mbywgbnVsbHB0ciwgJm1EZXZpY2UpKTsKKworICAgIHZrR2V0RGV2aWNlUXVldWUobURldmljZSwgbVF1ZXVlRmFtaWx5SW5kZXgsIDAsICZtUXVldWUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK1N3YXBjaGFpbkluZm86OlN3YXBjaGFpbkluZm8oY29uc3QgRGV2aWNlSW5mbyogY29uc3QgZGV2aWNlSW5mbykKKyAgICAgIDogbURldmljZUluZm8oZGV2aWNlSW5mbyksCisgICAgICAgIG1Gb3JtYXQoVktfRk9STUFUX1VOREVGSU5FRCksCisgICAgICAgIG1EaXNwbGF5U2l6ZSh7MCwgMH0pLAorICAgICAgICBtU3dhcGNoYWluKFZLX05VTExfSEFORExFKSwKKyAgICAgICAgbVN3YXBjaGFpbkxlbmd0aCgwKSB7fQorCitTd2FwY2hhaW5JbmZvOjp+U3dhcGNoYWluSW5mbygpIHsKKyAgICBpZiAobURldmljZUluZm8tPmRldmljZSgpKSB7CisgICAgICAgIHZrRGV2aWNlV2FpdElkbGUobURldmljZUluZm8tPmRldmljZSgpKTsKKyAgICAgICAgdmtEZXN0cm95U3dhcGNoYWluS0hSKG1EZXZpY2VJbmZvLT5kZXZpY2UoKSwgbVN3YXBjaGFpbiwgbnVsbHB0cik7CisgICAgfQorfQorCitpbnQzMl90IFN3YXBjaGFpbkluZm86OmluaXQoYm9vbCBzZXRQcmVUcmFuc2Zvcm0sIGludCogb3V0UHJlVHJhbnNmb3JtSGludCkgeworICAgIFZrU3VyZmFjZUNhcGFiaWxpdGllc0tIUiBzdXJmYWNlQ2FwYWJpbGl0aWVzOworICAgIFZLX0NBTEwodmtHZXRQaHlzaWNhbERldmljZVN1cmZhY2VDYXBhYmlsaXRpZXNLSFIobURldmljZUluZm8tPmdwdSgpLCBtRGV2aWNlSW5mby0+c3VyZmFjZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN1cmZhY2VDYXBhYmlsaXRpZXMpKTsKKyAgICBBTE9HRCgiVnVsa2FuIFN1cmZhY2UgQ2FwYWJpbGl0aWVzOlxuIik7CisgICAgQUxPR0QoIlx0aW1hZ2UgY291bnQ6ICV1IC0gJXVcbiIsIHN1cmZhY2VDYXBhYmlsaXRpZXMubWluSW1hZ2VDb3VudCwKKyAgICAgICAgICBzdXJmYWNlQ2FwYWJpbGl0aWVzLm1heEltYWdlQ291bnQpOworICAgIEFMT0dEKCJcdGFycmF5IGxheWVyczogJXVcbiIsIHN1cmZhY2VDYXBhYmlsaXRpZXMubWF4SW1hZ2VBcnJheUxheWVycyk7CisgICAgQUxPR0QoIlx0aW1hZ2Ugc2l6ZSAobm93KTogJWR4JWRcbiIsIHN1cmZhY2VDYXBhYmlsaXRpZXMuY3VycmVudEV4dGVudC53aWR0aCwKKyAgICAgICAgICBzdXJmYWNlQ2FwYWJpbGl0aWVzLmN1cnJlbnRFeHRlbnQuaGVpZ2h0KTsKKyAgICBBTE9HRCgiXHRpbWFnZSBzaXplIChleHRlbnQpOiAlZHglZCAtICVkeCVkXG4iLCBzdXJmYWNlQ2FwYWJpbGl0aWVzLm1pbkltYWdlRXh0ZW50LndpZHRoLAorICAgICAgICAgIHN1cmZhY2VDYXBhYmlsaXRpZXMubWluSW1hZ2VFeHRlbnQuaGVpZ2h0LCBzdXJmYWNlQ2FwYWJpbGl0aWVzLm1heEltYWdlRXh0ZW50LndpZHRoLAorICAgICAgICAgIHN1cmZhY2VDYXBhYmlsaXRpZXMubWF4SW1hZ2VFeHRlbnQuaGVpZ2h0KTsKKyAgICBBTE9HRCgiXHR1c2FnZTogJXhcbiIsIHN1cmZhY2VDYXBhYmlsaXRpZXMuc3VwcG9ydGVkVXNhZ2VGbGFncyk7CisgICAgQUxPR0QoIlx0Y3VycmVudCB0cmFuc2Zvcm06ICV1XG4iLCBzdXJmYWNlQ2FwYWJpbGl0aWVzLmN1cnJlbnRUcmFuc2Zvcm0pOworICAgIEFMT0dEKCJcdGFsbG93ZWQgdHJhbnNmb3JtczogJXhcbiIsIHN1cmZhY2VDYXBhYmlsaXRpZXMuc3VwcG9ydGVkVHJhbnNmb3Jtcyk7CisgICAgQUxPR0QoIlx0Y29tcG9zaXRlIGFscGhhIGZsYWdzOiAldVxuIiwgc3VyZmFjZUNhcGFiaWxpdGllcy5zdXBwb3J0ZWRDb21wb3NpdGVBbHBoYSk7CisKKyAgICB1aW50MzJfdCBmb3JtYXRDb3VudCA9IDA7CisgICAgVktfQ0FMTCh2a0dldFBoeXNpY2FsRGV2aWNlU3VyZmFjZUZvcm1hdHNLSFIobURldmljZUluZm8tPmdwdSgpLCBtRGV2aWNlSW5mby0+c3VyZmFjZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmb3JtYXRDb3VudCwgbnVsbHB0cikpOworCisgICAgc3RkOjp2ZWN0b3I8VmtTdXJmYWNlRm9ybWF0S0hSPiBmb3JtYXRzKGZvcm1hdENvdW50KTsKKyAgICBWS19DQUxMKHZrR2V0UGh5c2ljYWxEZXZpY2VTdXJmYWNlRm9ybWF0c0tIUihtRGV2aWNlSW5mby0+Z3B1KCksIG1EZXZpY2VJbmZvLT5zdXJmYWNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvcm1hdENvdW50LCBmb3JtYXRzLmRhdGEoKSkpOworCisgICAgdWludDMyX3QgZm9ybWF0SW5kZXg7CisgICAgZm9yIChmb3JtYXRJbmRleCA9IDA7IGZvcm1hdEluZGV4IDwgZm9ybWF0Q291bnQ7ICsrZm9ybWF0SW5kZXgpIHsKKyAgICAgICAgaWYgKGZvcm1hdHNbZm9ybWF0SW5kZXhdLmZvcm1hdCA9PSBWS19GT1JNQVRfUjhHOEI4QThfVU5PUk0pIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVChmb3JtYXRJbmRleCA8IGZvcm1hdENvdW50KTsKKworICAgIG1Gb3JtYXQgPSBmb3JtYXRzW2Zvcm1hdEluZGV4XS5mb3JtYXQ7CisgICAgbURpc3BsYXlTaXplID0gc3VyZmFjZUNhcGFiaWxpdGllcy5jdXJyZW50RXh0ZW50OworCisgICAgVmtTdXJmYWNlVHJhbnNmb3JtRmxhZ0JpdHNLSFIgcHJlVHJhbnNmb3JtID0KKyAgICAgICAgICAgIChzZXRQcmVUcmFuc2Zvcm0gPyBzdXJmYWNlQ2FwYWJpbGl0aWVzLmN1cnJlbnRUcmFuc2Zvcm0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBWS19TVVJGQUNFX1RSQU5TRk9STV9JREVOVElUWV9CSVRfS0hSKTsKKyAgICBBTE9HRCgiY3VycmVudFRyYW5zZm9ybSA9ICV1LCBwcmVUcmFuc2Zvcm0gPSAldSIsCisgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN1cmZhY2VDYXBhYmlsaXRpZXMuY3VycmVudFRyYW5zZm9ybSksCisgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHByZVRyYW5zZm9ybSkpOworCisgICAgaWYgKChwcmVUcmFuc2Zvcm0gJgorICAgICAgICAgKFZLX1NVUkZBQ0VfVFJBTlNGT1JNX1JPVEFURV85MF9CSVRfS0hSIHwgVktfU1VSRkFDRV9UUkFOU0ZPUk1fUk9UQVRFXzI3MF9CSVRfS0hSIHwKKyAgICAgICAgICBWS19TVVJGQUNFX1RSQU5TRk9STV9IT1JJWk9OVEFMX01JUlJPUl9ST1RBVEVfOTBfQklUX0tIUiB8CisgICAgICAgICAgVktfU1VSRkFDRV9UUkFOU0ZPUk1fSE9SSVpPTlRBTF9NSVJST1JfUk9UQVRFXzI3MF9CSVRfS0hSKSkgIT0gMCkgeworICAgICAgICBzdGQ6OnN3YXAobURpc3BsYXlTaXplLndpZHRoLCBtRGlzcGxheVNpemUuaGVpZ2h0KTsKKyAgICB9CisKKyAgICBpZiAob3V0UHJlVHJhbnNmb3JtSGludCkgeworICAgICAgICAqb3V0UHJlVHJhbnNmb3JtSGludCA9IHByZVRyYW5zZm9ybTsKKyAgICB9CisKKyAgICBjb25zdCB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4ID0gbURldmljZUluZm8tPnF1ZXVlRmFtaWx5SW5kZXgoKTsKKyAgICBjb25zdCBWa1N3YXBjaGFpbkNyZWF0ZUluZm9LSFIgc3dhcGNoYWluQ3JlYXRlSW5mbyA9IHsKKyAgICAgICAgICAgIC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NXQVBDSEFJTl9DUkVBVEVfSU5GT19LSFIsCisgICAgICAgICAgICAucE5leHQgPSBudWxscHRyLAorICAgICAgICAgICAgLmZsYWdzID0gMCwKKyAgICAgICAgICAgIC5zdXJmYWNlID0gbURldmljZUluZm8tPnN1cmZhY2UoKSwKKyAgICAgICAgICAgIC5taW5JbWFnZUNvdW50ID0gc3VyZmFjZUNhcGFiaWxpdGllcy5taW5JbWFnZUNvdW50LAorICAgICAgICAgICAgLmltYWdlRm9ybWF0ID0gbUZvcm1hdCwKKyAgICAgICAgICAgIC5pbWFnZUNvbG9yU3BhY2UgPSBmb3JtYXRzW2Zvcm1hdEluZGV4XS5jb2xvclNwYWNlLAorICAgICAgICAgICAgLmltYWdlRXh0ZW50ID0gbURpc3BsYXlTaXplLAorICAgICAgICAgICAgLmltYWdlVXNhZ2UgPSBWS19JTUFHRV9VU0FHRV9DT0xPUl9BVFRBQ0hNRU5UX0JJVCwKKyAgICAgICAgICAgIC5wcmVUcmFuc2Zvcm0gPSBwcmVUcmFuc2Zvcm0sCisgICAgICAgICAgICAuaW1hZ2VBcnJheUxheWVycyA9IDEsCisgICAgICAgICAgICAuaW1hZ2VTaGFyaW5nTW9kZSA9IFZLX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUsCisgICAgICAgICAgICAucXVldWVGYW1pbHlJbmRleENvdW50ID0gMSwKKyAgICAgICAgICAgIC5wUXVldWVGYW1pbHlJbmRpY2VzID0gJnF1ZXVlRmFtaWx5SW5kZXgsCisgICAgICAgICAgICAuY29tcG9zaXRlQWxwaGEgPSBWS19DT01QT1NJVEVfQUxQSEFfSU5IRVJJVF9CSVRfS0hSLAorICAgICAgICAgICAgLnByZXNlbnRNb2RlID0gVktfUFJFU0VOVF9NT0RFX0ZJRk9fS0hSLAorICAgICAgICAgICAgLmNsaXBwZWQgPSBWS19GQUxTRSwKKyAgICB9OworICAgIFZLX0NBTEwodmtDcmVhdGVTd2FwY2hhaW5LSFIobURldmljZUluZm8tPmRldmljZSgpLCAmc3dhcGNoYWluQ3JlYXRlSW5mbywgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtU3dhcGNoYWluKSk7CisKKyAgICBWS19DQUxMKHZrR2V0U3dhcGNoYWluSW1hZ2VzS0hSKG1EZXZpY2VJbmZvLT5kZXZpY2UoKSwgbVN3YXBjaGFpbiwgJm1Td2FwY2hhaW5MZW5ndGgsIG51bGxwdHIpKTsKKyAgICBBTE9HRCgiU3dhcGNoYWluIGxlbmd0aCA9ICV1IiwgbVN3YXBjaGFpbkxlbmd0aCk7CisKKyAgICByZXR1cm4gMDsKK30KKworUmVuZGVyZXI6OlJlbmRlcmVyKGNvbnN0IERldmljZUluZm8qIGNvbnN0IGRldmljZUluZm8sIGNvbnN0IFN3YXBjaGFpbkluZm8qIGNvbnN0IHN3YXBjaGFpbkluZm8pCisgICAgICA6IG1EZXZpY2VJbmZvKGRldmljZUluZm8pLAorICAgICAgICBtU3dhcGNoYWluSW5mbyhzd2FwY2hhaW5JbmZvKSwKKyAgICAgICAgbURldmljZU1lbW9yeShWS19OVUxMX0hBTkRMRSksCisgICAgICAgIG1WZXJ0ZXhCdWZmZXIoVktfTlVMTF9IQU5ETEUpLAorICAgICAgICBtUmVuZGVyUGFzcyhWS19OVUxMX0hBTkRMRSksCisgICAgICAgIG1WZXJ0ZXhTaGFkZXIoVktfTlVMTF9IQU5ETEUpLAorICAgICAgICBtRnJhZ21lbnRTaGFkZXIoVktfTlVMTF9IQU5ETEUpLAorICAgICAgICBtUGlwZWxpbmVMYXlvdXQoVktfTlVMTF9IQU5ETEUpLAorICAgICAgICBtUGlwZWxpbmUoVktfTlVMTF9IQU5ETEUpLAorICAgICAgICBtQ29tbWFuZFBvb2woVktfTlVMTF9IQU5ETEUpLAorICAgICAgICBtU2VtYXBob3JlKFZLX05VTExfSEFORExFKSwKKyAgICAgICAgbUZlbmNlKFZLX05VTExfSEFORExFKSB7fQorCitSZW5kZXJlcjo6flJlbmRlcmVyKCkgeworICAgIGlmIChtRGV2aWNlSW5mby0+ZGV2aWNlKCkpIHsKKyAgICAgICAgdmtEZXZpY2VXYWl0SWRsZShtRGV2aWNlSW5mby0+ZGV2aWNlKCkpOworICAgICAgICB2a0Rlc3Ryb3lTaGFkZXJNb2R1bGUobURldmljZUluZm8tPmRldmljZSgpLCBtVmVydGV4U2hhZGVyLCBudWxscHRyKTsKKyAgICAgICAgdmtEZXN0cm95U2hhZGVyTW9kdWxlKG1EZXZpY2VJbmZvLT5kZXZpY2UoKSwgbUZyYWdtZW50U2hhZGVyLCBudWxscHRyKTsKKyAgICAgICAgdmtEZXN0cm95RmVuY2UobURldmljZUluZm8tPmRldmljZSgpLCBtRmVuY2UsIG51bGxwdHIpOworICAgICAgICB2a0Rlc3Ryb3lTZW1hcGhvcmUobURldmljZUluZm8tPmRldmljZSgpLCBtU2VtYXBob3JlLCBudWxscHRyKTsKKyAgICAgICAgaWYgKCFtQ29tbWFuZEJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICAgICAgdmtGcmVlQ29tbWFuZEJ1ZmZlcnMobURldmljZUluZm8tPmRldmljZSgpLCBtQ29tbWFuZFBvb2wsIG1Db21tYW5kQnVmZmVycy5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29tbWFuZEJ1ZmZlcnMuZGF0YSgpKTsKKyAgICAgICAgfQorICAgICAgICB2a0Rlc3Ryb3lDb21tYW5kUG9vbChtRGV2aWNlSW5mby0+ZGV2aWNlKCksIG1Db21tYW5kUG9vbCwgbnVsbHB0cik7CisgICAgICAgIHZrRGVzdHJveVBpcGVsaW5lKG1EZXZpY2VJbmZvLT5kZXZpY2UoKSwgbVBpcGVsaW5lLCBudWxscHRyKTsKKyAgICAgICAgdmtEZXN0cm95UGlwZWxpbmVMYXlvdXQobURldmljZUluZm8tPmRldmljZSgpLCBtUGlwZWxpbmVMYXlvdXQsIG51bGxwdHIpOworICAgICAgICB2a0Rlc3Ryb3lCdWZmZXIobURldmljZUluZm8tPmRldmljZSgpLCBtVmVydGV4QnVmZmVyLCBudWxscHRyKTsKKyAgICAgICAgdmtGcmVlTWVtb3J5KG1EZXZpY2VJbmZvLT5kZXZpY2UoKSwgbURldmljZU1lbW9yeSwgbnVsbHB0cik7CisgICAgICAgIHZrRGVzdHJveVJlbmRlclBhc3MobURldmljZUluZm8tPmRldmljZSgpLCBtUmVuZGVyUGFzcywgbnVsbHB0cik7CisgICAgICAgIGZvciAoYXV0byYgZnJhbWVidWZmZXIgOiBtRnJhbWVidWZmZXJzKSB7CisgICAgICAgICAgICB2a0Rlc3Ryb3lGcmFtZWJ1ZmZlcihtRGV2aWNlSW5mby0+ZGV2aWNlKCksIGZyYW1lYnVmZmVyLCBudWxscHRyKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGF1dG8mIGltYWdlVmlldyA6IG1JbWFnZVZpZXdzKSB7CisgICAgICAgICAgICB2a0Rlc3Ryb3lJbWFnZVZpZXcobURldmljZUluZm8tPmRldmljZSgpLCBpbWFnZVZpZXcsIG51bGxwdHIpOworICAgICAgICB9CisgICAgfQorfQorCitpbnQzMl90IFJlbmRlcmVyOjpjcmVhdGVSZW5kZXJQYXNzKCkgeworICAgIGNvbnN0IFZrQXR0YWNobWVudERlc2NyaXB0aW9uIGF0dGFjaG1lbnREZXNjcmlwdGlvbiA9IHsKKyAgICAgICAgICAgIC5mbGFncyA9IDAsCisgICAgICAgICAgICAuZm9ybWF0ID0gbVN3YXBjaGFpbkluZm8tPmZvcm1hdCgpLAorICAgICAgICAgICAgLnNhbXBsZXMgPSBWS19TQU1QTEVfQ09VTlRfMV9CSVQsCisgICAgICAgICAgICAubG9hZE9wID0gVktfQVRUQUNITUVOVF9MT0FEX09QX0NMRUFSLAorICAgICAgICAgICAgLnN0b3JlT3AgPSBWS19BVFRBQ0hNRU5UX1NUT1JFX09QX1NUT1JFLAorICAgICAgICAgICAgLnN0ZW5jaWxMb2FkT3AgPSBWS19BVFRBQ0hNRU5UX0xPQURfT1BfRE9OVF9DQVJFLAorICAgICAgICAgICAgLnN0ZW5jaWxTdG9yZU9wID0gVktfQVRUQUNITUVOVF9TVE9SRV9PUF9ET05UX0NBUkUsCisgICAgICAgICAgICAuaW5pdGlhbExheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQsCisgICAgICAgICAgICAuZmluYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfUFJFU0VOVF9TUkNfS0hSLAorICAgIH07CisgICAgY29uc3QgVmtBdHRhY2htZW50UmVmZXJlbmNlIGF0dGFjaG1lbnRSZWZlcmVuY2UgPSB7CisgICAgICAgICAgICAuYXR0YWNobWVudCA9IDAsCisgICAgICAgICAgICAubGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX0NPTE9SX0FUVEFDSE1FTlRfT1BUSU1BTCwKKyAgICB9OworICAgIGNvbnN0IFZrU3VicGFzc0Rlc2NyaXB0aW9uIHN1YnBhc3NEZXNjcmlwdGlvbiA9IHsKKyAgICAgICAgICAgIC5mbGFncyA9IDAsCisgICAgICAgICAgICAucGlwZWxpbmVCaW5kUG9pbnQgPSBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLAorICAgICAgICAgICAgLmlucHV0QXR0YWNobWVudENvdW50ID0gMCwKKyAgICAgICAgICAgIC5wSW5wdXRBdHRhY2htZW50cyA9IG51bGxwdHIsCisgICAgICAgICAgICAuY29sb3JBdHRhY2htZW50Q291bnQgPSAxLAorICAgICAgICAgICAgLnBDb2xvckF0dGFjaG1lbnRzID0gJmF0dGFjaG1lbnRSZWZlcmVuY2UsCisgICAgICAgICAgICAucFJlc29sdmVBdHRhY2htZW50cyA9IG51bGxwdHIsCisgICAgICAgICAgICAucERlcHRoU3RlbmNpbEF0dGFjaG1lbnQgPSBudWxscHRyLAorICAgICAgICAgICAgLnByZXNlcnZlQXR0YWNobWVudENvdW50ID0gMCwKKyAgICAgICAgICAgIC5wUHJlc2VydmVBdHRhY2htZW50cyA9IG51bGxwdHIsCisgICAgfTsKKyAgICBjb25zdCBWa1JlbmRlclBhc3NDcmVhdGVJbmZvIHJlbmRlclBhc3NDcmVhdGVJbmZvID0geworICAgICAgICAgICAgLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUkVOREVSX1BBU1NfQ1JFQVRFX0lORk8sCisgICAgICAgICAgICAucE5leHQgPSBudWxscHRyLAorICAgICAgICAgICAgLmZsYWdzID0gMCwKKyAgICAgICAgICAgIC5hdHRhY2htZW50Q291bnQgPSAxLAorICAgICAgICAgICAgLnBBdHRhY2htZW50cyA9ICZhdHRhY2htZW50RGVzY3JpcHRpb24sCisgICAgICAgICAgICAuc3VicGFzc0NvdW50ID0gMSwKKyAgICAgICAgICAgIC5wU3VicGFzc2VzID0gJnN1YnBhc3NEZXNjcmlwdGlvbiwKKyAgICAgICAgICAgIC5kZXBlbmRlbmN5Q291bnQgPSAwLAorICAgICAgICAgICAgLnBEZXBlbmRlbmNpZXMgPSBudWxscHRyLAorICAgIH07CisgICAgVktfQ0FMTCh2a0NyZWF0ZVJlbmRlclBhc3MobURldmljZUluZm8tPmRldmljZSgpLCAmcmVuZGVyUGFzc0NyZWF0ZUluZm8sIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1SZW5kZXJQYXNzKSk7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50MzJfdCBSZW5kZXJlcjo6Y3JlYXRlRnJhbWVCdWZmZXJzKCkgeworICAgIHVpbnQzMl90IHN3YXBjaGFpbkxlbmd0aCA9IG1Td2FwY2hhaW5JbmZvLT5zd2FwY2hhaW5MZW5ndGgoKTsKKyAgICBzdGQ6OnZlY3RvcjxWa0ltYWdlPiBpbWFnZXMoc3dhcGNoYWluTGVuZ3RoLCBWS19OVUxMX0hBTkRMRSk7CisgICAgVktfQ0FMTCh2a0dldFN3YXBjaGFpbkltYWdlc0tIUihtRGV2aWNlSW5mby0+ZGV2aWNlKCksIG1Td2FwY2hhaW5JbmZvLT5zd2FwY2hhaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzd2FwY2hhaW5MZW5ndGgsIGltYWdlcy5kYXRhKCkpKTsKKworICAgIG1JbWFnZVZpZXdzLnJlc2l6ZShzd2FwY2hhaW5MZW5ndGgsIFZLX05VTExfSEFORExFKTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc3dhcGNoYWluTGVuZ3RoOyArK2kpIHsKKyAgICAgICAgY29uc3QgVmtJbWFnZVZpZXdDcmVhdGVJbmZvIGltYWdlVmlld0NyZWF0ZUluZm8gPSB7CisgICAgICAgICAgICAgICAgLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1BR0VfVklFV19DUkVBVEVfSU5GTywKKyAgICAgICAgICAgICAgICAucE5leHQgPSBudWxscHRyLAorICAgICAgICAgICAgICAgIC5mbGFncyA9IDAsCisgICAgICAgICAgICAgICAgLmltYWdlID0gaW1hZ2VzW2ldLAorICAgICAgICAgICAgICAgIC52aWV3VHlwZSA9IFZLX0lNQUdFX1ZJRVdfVFlQRV8yRCwKKyAgICAgICAgICAgICAgICAuZm9ybWF0ID0gbVN3YXBjaGFpbkluZm8tPmZvcm1hdCgpLAorICAgICAgICAgICAgICAgIC5jb21wb25lbnRzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnIgPSBWS19DT01QT05FTlRfU1dJWlpMRV9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZyA9IFZLX0NPTVBPTkVOVF9TV0laWkxFX0csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5iID0gVktfQ09NUE9ORU5UX1NXSVpaTEVfQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmEgPSBWS19DT01QT05FTlRfU1dJWlpMRV9BLAorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAuc3VicmVzb3VyY2VSYW5nZSA9CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hc3BlY3RNYXNrID0gVktfSU1BR0VfQVNQRUNUX0NPTE9SX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJhc2VNaXBMZXZlbCA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sZXZlbENvdW50ID0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJhc2VBcnJheUxheWVyID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxheWVyQ291bnQgPSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgfTsKKyAgICAgICAgVktfQ0FMTCh2a0NyZWF0ZUltYWdlVmlldyhtRGV2aWNlSW5mby0+ZGV2aWNlKCksICZpbWFnZVZpZXdDcmVhdGVJbmZvLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtSW1hZ2VWaWV3c1tpXSkpOworICAgIH0KKworICAgIG1GcmFtZWJ1ZmZlcnMucmVzaXplKHN3YXBjaGFpbkxlbmd0aCwgVktfTlVMTF9IQU5ETEUpOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBzd2FwY2hhaW5MZW5ndGg7ICsraSkgeworICAgICAgICBjb25zdCBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyBmcmFtZWJ1ZmZlckNyZWF0ZUluZm8gPSB7CisgICAgICAgICAgICAgICAgLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfRlJBTUVCVUZGRVJfQ1JFQVRFX0lORk8sCisgICAgICAgICAgICAgICAgLnBOZXh0ID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAuZmxhZ3MgPSAwLAorICAgICAgICAgICAgICAgIC5yZW5kZXJQYXNzID0gbVJlbmRlclBhc3MsCisgICAgICAgICAgICAgICAgLmF0dGFjaG1lbnRDb3VudCA9IDEsCisgICAgICAgICAgICAgICAgLnBBdHRhY2htZW50cyA9ICZtSW1hZ2VWaWV3c1tpXSwKKyAgICAgICAgICAgICAgICAud2lkdGggPSBtU3dhcGNoYWluSW5mby0+ZGlzcGxheVNpemUoKS53aWR0aCwKKyAgICAgICAgICAgICAgICAuaGVpZ2h0ID0gbVN3YXBjaGFpbkluZm8tPmRpc3BsYXlTaXplKCkuaGVpZ2h0LAorICAgICAgICAgICAgICAgIC5sYXllcnMgPSAxLAorICAgICAgICB9OworICAgICAgICBWS19DQUxMKHZrQ3JlYXRlRnJhbWVidWZmZXIobURldmljZUluZm8tPmRldmljZSgpLCAmZnJhbWVidWZmZXJDcmVhdGVJbmZvLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1GcmFtZWJ1ZmZlcnNbaV0pKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50MzJfdCBSZW5kZXJlcjo6Y3JlYXRlVmVydGV4QnVmZmVycygpIHsKKyAgICBjb25zdCB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4ID0gbURldmljZUluZm8tPnF1ZXVlRmFtaWx5SW5kZXgoKTsKKyAgICBjb25zdCBWa0J1ZmZlckNyZWF0ZUluZm8gYnVmZmVyQ3JlYXRlSW5mbyA9IHsKKyAgICAgICAgICAgIC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9DUkVBVEVfSU5GTywKKyAgICAgICAgICAgIC5wTmV4dCA9IG51bGxwdHIsCisgICAgICAgICAgICAuZmxhZ3MgPSAwLAorICAgICAgICAgICAgLnNpemUgPSBzaXplb2YodmVydGV4RGF0YSksCisgICAgICAgICAgICAudXNhZ2UgPSBWS19CVUZGRVJfVVNBR0VfVkVSVEVYX0JVRkZFUl9CSVQsCisgICAgICAgICAgICAuc2hhcmluZ01vZGUgPSBWS19TSEFSSU5HX01PREVfRVhDTFVTSVZFLAorICAgICAgICAgICAgLnF1ZXVlRmFtaWx5SW5kZXhDb3VudCA9IDEsCisgICAgICAgICAgICAucFF1ZXVlRmFtaWx5SW5kaWNlcyA9ICZxdWV1ZUZhbWlseUluZGV4LAorICAgIH07CisgICAgVktfQ0FMTCh2a0NyZWF0ZUJ1ZmZlcihtRGV2aWNlSW5mby0+ZGV2aWNlKCksICZidWZmZXJDcmVhdGVJbmZvLCBudWxscHRyLCAmbVZlcnRleEJ1ZmZlcikpOworCisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMgbWVtb3J5UmVxdWlyZW1lbnRzOworICAgIHZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzKG1EZXZpY2VJbmZvLT5kZXZpY2UoKSwgbVZlcnRleEJ1ZmZlciwgJm1lbW9yeVJlcXVpcmVtZW50cyk7CisKKyAgICBWa1BoeXNpY2FsRGV2aWNlTWVtb3J5UHJvcGVydGllcyBtZW1vcnlQcm9wZXJ0aWVzOworICAgIHZrR2V0UGh5c2ljYWxEZXZpY2VNZW1vcnlQcm9wZXJ0aWVzKG1EZXZpY2VJbmZvLT5ncHUoKSwgJm1lbW9yeVByb3BlcnRpZXMpOworCisgICAgaW50MzJfdCB0eXBlSW5kZXggPSAtMTsKKyAgICBmb3IgKGludDMyX3QgaSA9IDAsIHR5cGVCaXRzID0gbWVtb3J5UmVxdWlyZW1lbnRzLm1lbW9yeVR5cGVCaXRzOyBpIDwgMzI7ICsraSkgeworICAgICAgICBpZiAoKHR5cGVCaXRzICYgMSkgPT0gMSkgeworICAgICAgICAgICAgaWYgKChtZW1vcnlQcm9wZXJ0aWVzLm1lbW9yeVR5cGVzW2ldLnByb3BlcnR5RmxhZ3MgJgorICAgICAgICAgICAgICAgICBWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9WSVNJQkxFX0JJVCkgPT0gVktfTUVNT1JZX1BST1BFUlRZX0hPU1RfVklTSUJMRV9CSVQpIHsKKyAgICAgICAgICAgICAgICB0eXBlSW5kZXggPSBpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHR5cGVCaXRzID4+PSAxOworICAgIH0KKyAgICBBU1NFUlQodHlwZUluZGV4ICE9IC0xKTsKKworICAgIFZrTWVtb3J5QWxsb2NhdGVJbmZvIG1lbW9yeUFsbG9jYXRlSW5mbyA9IHsKKyAgICAgICAgICAgIC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9BTExPQ0FURV9JTkZPLAorICAgICAgICAgICAgLnBOZXh0ID0gbnVsbHB0ciwKKyAgICAgICAgICAgIC5hbGxvY2F0aW9uU2l6ZSA9IG1lbW9yeVJlcXVpcmVtZW50cy5zaXplLAorICAgICAgICAgICAgLm1lbW9yeVR5cGVJbmRleCA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih0eXBlSW5kZXgpLAorICAgIH07CisgICAgVktfQ0FMTCh2a0FsbG9jYXRlTWVtb3J5KG1EZXZpY2VJbmZvLT5kZXZpY2UoKSwgJm1lbW9yeUFsbG9jYXRlSW5mbywgbnVsbHB0ciwgJm1EZXZpY2VNZW1vcnkpKTsKKworICAgIHZvaWQqIGRhdGE7CisgICAgVktfQ0FMTCh2a01hcE1lbW9yeShtRGV2aWNlSW5mby0+ZGV2aWNlKCksIG1EZXZpY2VNZW1vcnksIDAsIHNpemVvZih2ZXJ0ZXhEYXRhKSwgMCwgJmRhdGEpKTsKKworICAgIG1lbWNweShkYXRhLCB2ZXJ0ZXhEYXRhLCBzaXplb2YodmVydGV4RGF0YSkpOworICAgIHZrVW5tYXBNZW1vcnkobURldmljZUluZm8tPmRldmljZSgpLCBtRGV2aWNlTWVtb3J5KTsKKworICAgIFZLX0NBTEwodmtCaW5kQnVmZmVyTWVtb3J5KG1EZXZpY2VJbmZvLT5kZXZpY2UoKSwgbVZlcnRleEJ1ZmZlciwgbURldmljZU1lbW9yeSwgMCkpOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludDMyX3QgUmVuZGVyZXI6OmxvYWRTaGFkZXJGcm9tRmlsZShjb25zdCBjaGFyKiBmaWxlUGF0aCwgVmtTaGFkZXJNb2R1bGUqIGNvbnN0IG91dFNoYWRlcikgeworICAgIEFTU0VSVChmaWxlUGF0aCk7CisKKyAgICBBQXNzZXQqIGZpbGUgPSBBQXNzZXRNYW5hZ2VyX29wZW4obUFzc2V0TWFuYWdlciwgZmlsZVBhdGgsIEFBU1NFVF9NT0RFX0JVRkZFUik7CisgICAgaWYgKCFmaWxlKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gb3BlbiBzaGFkZXIgZmlsZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHNpemVfdCBmaWxlTGVuZ3RoID0gQUFzc2V0X2dldExlbmd0aChmaWxlKTsKKyAgICBzdGQ6OnZlY3RvcjxjaGFyPiBmaWxlQ29udGVudChmaWxlTGVuZ3RoKTsKKyAgICBBQXNzZXRfcmVhZChmaWxlLCBmaWxlQ29udGVudC5kYXRhKCksIGZpbGVMZW5ndGgpOworICAgIEFBc3NldF9jbG9zZShmaWxlKTsKKworICAgIGNvbnN0IFZrU2hhZGVyTW9kdWxlQ3JlYXRlSW5mbyBzaGFkZXJNb2R1bGVDcmVhdGVJbmZvID0geworICAgICAgICAgICAgLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU0hBREVSX01PRFVMRV9DUkVBVEVfSU5GTywKKyAgICAgICAgICAgIC5wTmV4dCA9IG51bGxwdHIsCisgICAgICAgICAgICAuZmxhZ3MgPSAwLAorICAgICAgICAgICAgLmNvZGVTaXplID0gZmlsZUxlbmd0aCwKKyAgICAgICAgICAgIC5wQ29kZSA9IChjb25zdCB1aW50MzJfdCopKGZpbGVDb250ZW50LmRhdGEoKSksCisgICAgfTsKKyAgICBWS19DQUxMKHZrQ3JlYXRlU2hhZGVyTW9kdWxlKG1EZXZpY2VJbmZvLT5kZXZpY2UoKSwgJnNoYWRlck1vZHVsZUNyZWF0ZUluZm8sIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRTaGFkZXIpKTsKKworICAgIHJldHVybiAwOworfQorCitpbnQzMl90IFJlbmRlcmVyOjpjcmVhdGVHcmFwaGljc1BpcGVsaW5lKCkgeworICAgIGNvbnN0IFZrUHVzaENvbnN0YW50UmFuZ2UgcHVzaENvbnN0YW50UmFuZ2UgPSB7CisgICAgICAgICAgICAuc3RhZ2VGbGFncyA9IFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQsCisgICAgICAgICAgICAub2Zmc2V0ID0gMCwKKyAgICAgICAgICAgIC5zaXplID0gMyAqIHNpemVvZihmbG9hdCksCisgICAgfTsKKyAgICBjb25zdCBWa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mbyBwaXBlbGluZUxheW91dENyZWF0ZUluZm8gPSB7CisgICAgICAgICAgICAuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9MQVlPVVRfQ1JFQVRFX0lORk8sCisgICAgICAgICAgICAucE5leHQgPSBudWxscHRyLAorICAgICAgICAgICAgLmZsYWdzID0gMCwKKyAgICAgICAgICAgIC5zZXRMYXlvdXRDb3VudCA9IDAsCisgICAgICAgICAgICAucFNldExheW91dHMgPSBudWxscHRyLAorICAgICAgICAgICAgLnB1c2hDb25zdGFudFJhbmdlQ291bnQgPSAxLAorICAgICAgICAgICAgLnBQdXNoQ29uc3RhbnRSYW5nZXMgPSAmcHVzaENvbnN0YW50UmFuZ2UsCisgICAgfTsKKyAgICBWS19DQUxMKHZrQ3JlYXRlUGlwZWxpbmVMYXlvdXQobURldmljZUluZm8tPmRldmljZSgpLCAmcGlwZWxpbmVMYXlvdXRDcmVhdGVJbmZvLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbVBpcGVsaW5lTGF5b3V0KSk7CisKKyAgICBBU1NFUlQoIWxvYWRTaGFkZXJGcm9tRmlsZSgic2hhZGVycy90cmkudmVydC5zcHYiLCAmbVZlcnRleFNoYWRlcikpOworICAgIEFTU0VSVCghbG9hZFNoYWRlckZyb21GaWxlKCJzaGFkZXJzL3RyaS5mcmFnLnNwdiIsICZtRnJhZ21lbnRTaGFkZXIpKTsKKworICAgIGNvbnN0IFZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8gc2hhZGVyU3RhZ2VzWzJdID0KKyAgICAgICAgICAgIHt7CisgICAgICAgICAgICAgICAgICAgICAuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9TSEFERVJfU1RBR0VfQ1JFQVRFX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAucE5leHQgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgLmZsYWdzID0gMCwKKyAgICAgICAgICAgICAgICAgICAgIC5zdGFnZSA9IFZLX1NIQURFUl9TVEFHRV9WRVJURVhfQklULAorICAgICAgICAgICAgICAgICAgICAgLm1vZHVsZSA9IG1WZXJ0ZXhTaGFkZXIsCisgICAgICAgICAgICAgICAgICAgICAucE5hbWUgPSAibWFpbiIsCisgICAgICAgICAgICAgICAgICAgICAucFNwZWNpYWxpemF0aW9uSW5mbyA9IG51bGxwdHIsCisgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9TSEFERVJfU1RBR0VfQ1JFQVRFX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAucE5leHQgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgLmZsYWdzID0gMCwKKyAgICAgICAgICAgICAgICAgICAgIC5zdGFnZSA9IFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQsCisgICAgICAgICAgICAgICAgICAgICAubW9kdWxlID0gbUZyYWdtZW50U2hhZGVyLAorICAgICAgICAgICAgICAgICAgICAgLnBOYW1lID0gIm1haW4iLAorICAgICAgICAgICAgICAgICAgICAgLnBTcGVjaWFsaXphdGlvbkluZm8gPSBudWxscHRyLAorICAgICAgICAgICAgIH19OworICAgIGNvbnN0IFZrVmlld3BvcnQgdmlld3BvcnRzID0geworICAgICAgICAgICAgLnggPSAwLjBmLAorICAgICAgICAgICAgLnkgPSAwLjBmLAorICAgICAgICAgICAgLndpZHRoID0gKGZsb2F0KW1Td2FwY2hhaW5JbmZvLT5kaXNwbGF5U2l6ZSgpLndpZHRoLAorICAgICAgICAgICAgLmhlaWdodCA9IChmbG9hdCltU3dhcGNoYWluSW5mby0+ZGlzcGxheVNpemUoKS5oZWlnaHQsCisgICAgICAgICAgICAubWluRGVwdGggPSAwLjBmLAorICAgICAgICAgICAgLm1heERlcHRoID0gMS4wZiwKKyAgICB9OworICAgIGNvbnN0IFZrUmVjdDJEIHNjaXNzb3IgPSB7CisgICAgICAgICAgICAub2Zmc2V0ID0KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC54ID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAueSA9IDAsCisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAuZXh0ZW50ID0gbVN3YXBjaGFpbkluZm8tPmRpc3BsYXlTaXplKCksCisgICAgfTsKKyAgICBjb25zdCBWa1BpcGVsaW5lVmlld3BvcnRTdGF0ZUNyZWF0ZUluZm8gdmlld3BvcnRJbmZvID0geworICAgICAgICAgICAgLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVklFV1BPUlRfU1RBVEVfQ1JFQVRFX0lORk8sCisgICAgICAgICAgICAucE5leHQgPSBudWxscHRyLAorICAgICAgICAgICAgLmZsYWdzID0gMCwKKyAgICAgICAgICAgIC52aWV3cG9ydENvdW50ID0gMSwKKyAgICAgICAgICAgIC5wVmlld3BvcnRzID0gJnZpZXdwb3J0cywKKyAgICAgICAgICAgIC5zY2lzc29yQ291bnQgPSAxLAorICAgICAgICAgICAgLnBTY2lzc29ycyA9ICZzY2lzc29yLAorICAgIH07CisgICAgVmtTYW1wbGVNYXNrIHNhbXBsZU1hc2sgPSB+MHU7CisgICAgY29uc3QgVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvIG11bHRpc2FtcGxlSW5mbyA9IHsKKyAgICAgICAgICAgIC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX01VTFRJU0FNUExFX1NUQVRFX0NSRUFURV9JTkZPLAorICAgICAgICAgICAgLnBOZXh0ID0gbnVsbHB0ciwKKyAgICAgICAgICAgIC5mbGFncyA9IDAsCisgICAgICAgICAgICAucmFzdGVyaXphdGlvblNhbXBsZXMgPSBWS19TQU1QTEVfQ09VTlRfMV9CSVQsCisgICAgICAgICAgICAuc2FtcGxlU2hhZGluZ0VuYWJsZSA9IFZLX0ZBTFNFLAorICAgICAgICAgICAgLm1pblNhbXBsZVNoYWRpbmcgPSAwLAorICAgICAgICAgICAgLnBTYW1wbGVNYXNrID0gJnNhbXBsZU1hc2ssCisgICAgICAgICAgICAuYWxwaGFUb0NvdmVyYWdlRW5hYmxlID0gVktfRkFMU0UsCisgICAgICAgICAgICAuYWxwaGFUb09uZUVuYWJsZSA9IFZLX0ZBTFNFLAorICAgIH07CisgICAgY29uc3QgVmtQaXBlbGluZUNvbG9yQmxlbmRBdHRhY2htZW50U3RhdGUgYXR0YWNobWVudFN0YXRlcyA9IHsKKyAgICAgICAgICAgIC5ibGVuZEVuYWJsZSA9IFZLX0ZBTFNFLAorICAgICAgICAgICAgLnNyY0NvbG9yQmxlbmRGYWN0b3IgPSAoVmtCbGVuZEZhY3RvcikwLAorICAgICAgICAgICAgLmRzdENvbG9yQmxlbmRGYWN0b3IgPSAoVmtCbGVuZEZhY3RvcikwLAorICAgICAgICAgICAgLmNvbG9yQmxlbmRPcCA9IChWa0JsZW5kT3ApMCwKKyAgICAgICAgICAgIC5zcmNBbHBoYUJsZW5kRmFjdG9yID0gKFZrQmxlbmRGYWN0b3IpMCwKKyAgICAgICAgICAgIC5kc3RBbHBoYUJsZW5kRmFjdG9yID0gKFZrQmxlbmRGYWN0b3IpMCwKKyAgICAgICAgICAgIC5hbHBoYUJsZW5kT3AgPSAoVmtCbGVuZE9wKTAsCisgICAgICAgICAgICAuY29sb3JXcml0ZU1hc2sgPSBWS19DT0xPUl9DT01QT05FTlRfUl9CSVQgfCBWS19DT0xPUl9DT01QT05FTlRfR19CSVQgfAorICAgICAgICAgICAgICAgICAgICBWS19DT0xPUl9DT01QT05FTlRfQl9CSVQgfCBWS19DT0xPUl9DT01QT05FTlRfQV9CSVQsCisgICAgfTsKKyAgICBjb25zdCBWa1BpcGVsaW5lQ29sb3JCbGVuZFN0YXRlQ3JlYXRlSW5mbyBjb2xvckJsZW5kSW5mbyA9IHsKKyAgICAgICAgICAgIC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0NPTE9SX0JMRU5EX1NUQVRFX0NSRUFURV9JTkZPLAorICAgICAgICAgICAgLnBOZXh0ID0gbnVsbHB0ciwKKyAgICAgICAgICAgIC5mbGFncyA9IDAsCisgICAgICAgICAgICAubG9naWNPcEVuYWJsZSA9IFZLX0ZBTFNFLAorICAgICAgICAgICAgLmxvZ2ljT3AgPSBWS19MT0dJQ19PUF9DT1BZLAorICAgICAgICAgICAgLmF0dGFjaG1lbnRDb3VudCA9IDEsCisgICAgICAgICAgICAucEF0dGFjaG1lbnRzID0gJmF0dGFjaG1lbnRTdGF0ZXMsCisgICAgICAgICAgICAuYmxlbmRDb25zdGFudHMgPSB7MC4wZiwgMC4wZiwgMC4wZiwgMC4wZn0sCisgICAgfTsKKyAgICBjb25zdCBWa1BpcGVsaW5lUmFzdGVyaXphdGlvblN0YXRlQ3JlYXRlSW5mbyByYXN0ZXJJbmZvID0geworICAgICAgICAgICAgLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfUkFTVEVSSVpBVElPTl9TVEFURV9DUkVBVEVfSU5GTywKKyAgICAgICAgICAgIC5wTmV4dCA9IG51bGxwdHIsCisgICAgICAgICAgICAuZmxhZ3MgPSAwLAorICAgICAgICAgICAgLmRlcHRoQ2xhbXBFbmFibGUgPSBWS19GQUxTRSwKKyAgICAgICAgICAgIC5yYXN0ZXJpemVyRGlzY2FyZEVuYWJsZSA9IFZLX0ZBTFNFLAorICAgICAgICAgICAgLnBvbHlnb25Nb2RlID0gVktfUE9MWUdPTl9NT0RFX0ZJTEwsCisgICAgICAgICAgICAuY3VsbE1vZGUgPSBWS19DVUxMX01PREVfTk9ORSwKKyAgICAgICAgICAgIC5mcm9udEZhY2UgPSBWS19GUk9OVF9GQUNFX0NMT0NLV0lTRSwKKyAgICAgICAgICAgIC5kZXB0aEJpYXNFbmFibGUgPSBWS19GQUxTRSwKKyAgICAgICAgICAgIC5kZXB0aEJpYXNDb25zdGFudEZhY3RvciA9IDAsCisgICAgICAgICAgICAuZGVwdGhCaWFzQ2xhbXAgPSAwLAorICAgICAgICAgICAgLmRlcHRoQmlhc1Nsb3BlRmFjdG9yID0gMCwKKyAgICAgICAgICAgIC5saW5lV2lkdGggPSAxLAorICAgIH07CisgICAgY29uc3QgVmtQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8gaW5wdXRBc3NlbWJseUluZm8gPSB7CisgICAgICAgICAgICAuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9JTlBVVF9BU1NFTUJMWV9TVEFURV9DUkVBVEVfSU5GTywKKyAgICAgICAgICAgIC5wTmV4dCA9IG51bGxwdHIsCisgICAgICAgICAgICAuZmxhZ3MgPSAwLAorICAgICAgICAgICAgLnRvcG9sb2d5ID0gVktfUFJJTUlUSVZFX1RPUE9MT0dZX1RSSUFOR0xFX1NUUklQLAorICAgICAgICAgICAgLnByaW1pdGl2ZVJlc3RhcnRFbmFibGUgPSBWS19GQUxTRSwKKyAgICB9OworICAgIGNvbnN0IFZrVmVydGV4SW5wdXRCaW5kaW5nRGVzY3JpcHRpb24gdmVydGV4SW5wdXRCaW5kaW5nRGVzY3JpcHRpb24gPSB7CisgICAgICAgICAgICAuYmluZGluZyA9IDAsCisgICAgICAgICAgICAuc3RyaWRlID0gMyAqIHNpemVvZihmbG9hdCksCisgICAgICAgICAgICAuaW5wdXRSYXRlID0gVktfVkVSVEVYX0lOUFVUX1JBVEVfVkVSVEVYLAorICAgIH07CisgICAgY29uc3QgVmtWZXJ0ZXhJbnB1dEF0dHJpYnV0ZURlc2NyaXB0aW9uIHZlcnRleElucHV0QXR0cmlidXRlRGVzY3JpcHRpb24gPSB7CisgICAgICAgICAgICAubG9jYXRpb24gPSAwLAorICAgICAgICAgICAgLmJpbmRpbmcgPSAwLAorICAgICAgICAgICAgLmZvcm1hdCA9IFZLX0ZPUk1BVF9SMzJHMzJCMzJfU0ZMT0FULAorICAgICAgICAgICAgLm9mZnNldCA9IDAsCisgICAgfTsKKyAgICBjb25zdCBWa1BpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8gdmVydGV4SW5wdXRJbmZvID0geworICAgICAgICAgICAgLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfVkVSVEVYX0lOUFVUX1NUQVRFX0NSRUFURV9JTkZPLAorICAgICAgICAgICAgLnBOZXh0ID0gbnVsbHB0ciwKKyAgICAgICAgICAgIC5mbGFncyA9IDAsCisgICAgICAgICAgICAudmVydGV4QmluZGluZ0Rlc2NyaXB0aW9uQ291bnQgPSAxLAorICAgICAgICAgICAgLnBWZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25zID0gJnZlcnRleElucHV0QmluZGluZ0Rlc2NyaXB0aW9uLAorICAgICAgICAgICAgLnZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9uQ291bnQgPSAxLAorICAgICAgICAgICAgLnBWZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdGlvbnMgPSAmdmVydGV4SW5wdXRBdHRyaWJ1dGVEZXNjcmlwdGlvbiwKKyAgICB9OworICAgIGNvbnN0IFZrR3JhcGhpY3NQaXBlbGluZUNyZWF0ZUluZm8gcGlwZWxpbmVDcmVhdGVJbmZvID0geworICAgICAgICAgICAgLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfR1JBUEhJQ1NfUElQRUxJTkVfQ1JFQVRFX0lORk8sCisgICAgICAgICAgICAucE5leHQgPSBudWxscHRyLAorICAgICAgICAgICAgLmZsYWdzID0gMCwKKyAgICAgICAgICAgIC5zdGFnZUNvdW50ID0gMiwKKyAgICAgICAgICAgIC5wU3RhZ2VzID0gc2hhZGVyU3RhZ2VzLAorICAgICAgICAgICAgLnBWZXJ0ZXhJbnB1dFN0YXRlID0gJnZlcnRleElucHV0SW5mbywKKyAgICAgICAgICAgIC5wSW5wdXRBc3NlbWJseVN0YXRlID0gJmlucHV0QXNzZW1ibHlJbmZvLAorICAgICAgICAgICAgLnBUZXNzZWxsYXRpb25TdGF0ZSA9IG51bGxwdHIsCisgICAgICAgICAgICAucFZpZXdwb3J0U3RhdGUgPSAmdmlld3BvcnRJbmZvLAorICAgICAgICAgICAgLnBSYXN0ZXJpemF0aW9uU3RhdGUgPSAmcmFzdGVySW5mbywKKyAgICAgICAgICAgIC5wTXVsdGlzYW1wbGVTdGF0ZSA9ICZtdWx0aXNhbXBsZUluZm8sCisgICAgICAgICAgICAucERlcHRoU3RlbmNpbFN0YXRlID0gbnVsbHB0ciwKKyAgICAgICAgICAgIC5wQ29sb3JCbGVuZFN0YXRlID0gJmNvbG9yQmxlbmRJbmZvLAorICAgICAgICAgICAgLnBEeW5hbWljU3RhdGUgPSBudWxscHRyLAorICAgICAgICAgICAgLmxheW91dCA9IG1QaXBlbGluZUxheW91dCwKKyAgICAgICAgICAgIC5yZW5kZXJQYXNzID0gbVJlbmRlclBhc3MsCisgICAgICAgICAgICAuc3VicGFzcyA9IDAsCisgICAgICAgICAgICAuYmFzZVBpcGVsaW5lSGFuZGxlID0gVktfTlVMTF9IQU5ETEUsCisgICAgICAgICAgICAuYmFzZVBpcGVsaW5lSW5kZXggPSAwLAorICAgIH07CisgICAgVktfQ0FMTCh2a0NyZWF0ZUdyYXBoaWNzUGlwZWxpbmVzKG1EZXZpY2VJbmZvLT5kZXZpY2UoKSwgVktfTlVMTF9IQU5ETEUsIDEsICZwaXBlbGluZUNyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsICZtUGlwZWxpbmUpKTsKKworICAgIHZrRGVzdHJveVNoYWRlck1vZHVsZShtRGV2aWNlSW5mby0+ZGV2aWNlKCksIG1WZXJ0ZXhTaGFkZXIsIG51bGxwdHIpOworICAgIHZrRGVzdHJveVNoYWRlck1vZHVsZShtRGV2aWNlSW5mby0+ZGV2aWNlKCksIG1GcmFnbWVudFNoYWRlciwgbnVsbHB0cik7CisgICAgbVZlcnRleFNoYWRlciA9IFZLX05VTExfSEFORExFOworICAgIG1GcmFnbWVudFNoYWRlciA9IFZLX05VTExfSEFORExFOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludDMyX3QgUmVuZGVyZXI6OmluaXQoSk5JRW52KiBlbnYsIGpvYmplY3QgakFzc2V0TWFuYWdlcikgeworICAgIG1Bc3NldE1hbmFnZXIgPSBBQXNzZXRNYW5hZ2VyX2Zyb21KYXZhKGVudiwgakFzc2V0TWFuYWdlcik7CisgICAgQVNTRVJUKG1Bc3NldE1hbmFnZXIpOworCisgICAgQVNTRVJUKCFjcmVhdGVSZW5kZXJQYXNzKCkpOworCisgICAgQVNTRVJUKCFjcmVhdGVGcmFtZUJ1ZmZlcnMoKSk7CisKKyAgICBBU1NFUlQoIWNyZWF0ZVZlcnRleEJ1ZmZlcnMoKSk7CisKKyAgICBBU1NFUlQoIWNyZWF0ZUdyYXBoaWNzUGlwZWxpbmUoKSk7CisKKyAgICBjb25zdCBWa0NvbW1hbmRQb29sQ3JlYXRlSW5mbyBjb21tYW5kUG9vbENyZWF0ZUluZm8gPSB7CisgICAgICAgICAgICAuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX1BPT0xfQ1JFQVRFX0lORk8sCisgICAgICAgICAgICAucE5leHQgPSBudWxscHRyLAorICAgICAgICAgICAgLmZsYWdzID0gVktfQ09NTUFORF9QT09MX0NSRUFURV9SRVNFVF9DT01NQU5EX0JVRkZFUl9CSVQsCisgICAgICAgICAgICAucXVldWVGYW1pbHlJbmRleCA9IG1EZXZpY2VJbmZvLT5xdWV1ZUZhbWlseUluZGV4KCksCisgICAgfTsKKyAgICBWS19DQUxMKHZrQ3JlYXRlQ29tbWFuZFBvb2wobURldmljZUluZm8tPmRldmljZSgpLCAmY29tbWFuZFBvb2xDcmVhdGVJbmZvLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbUNvbW1hbmRQb29sKSk7CisKKyAgICB1aW50MzJfdCBzd2FwY2hhaW5MZW5ndGggPSBtU3dhcGNoYWluSW5mby0+c3dhcGNoYWluTGVuZ3RoKCk7CisgICAgbUNvbW1hbmRCdWZmZXJzLnJlc2l6ZShzd2FwY2hhaW5MZW5ndGgsIFZLX05VTExfSEFORExFKTsKKyAgICBjb25zdCBWa0NvbW1hbmRCdWZmZXJBbGxvY2F0ZUluZm8gY29tbWFuZEJ1ZmZlckFsbG9jYXRlSW5mbyA9IHsKKyAgICAgICAgICAgIC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0FMTE9DQVRFX0lORk8sCisgICAgICAgICAgICAucE5leHQgPSBudWxscHRyLAorICAgICAgICAgICAgLmNvbW1hbmRQb29sID0gbUNvbW1hbmRQb29sLAorICAgICAgICAgICAgLmxldmVsID0gVktfQ09NTUFORF9CVUZGRVJfTEVWRUxfUFJJTUFSWSwKKyAgICAgICAgICAgIC5jb21tYW5kQnVmZmVyQ291bnQgPSBzd2FwY2hhaW5MZW5ndGgsCisgICAgfTsKKyAgICBWS19DQUxMKHZrQWxsb2NhdGVDb21tYW5kQnVmZmVycyhtRGV2aWNlSW5mby0+ZGV2aWNlKCksICZjb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db21tYW5kQnVmZmVycy5kYXRhKCkpKTsKKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBzd2FwY2hhaW5MZW5ndGg7ICsraSkgeworICAgICAgICBjb25zdCBWa0NvbW1hbmRCdWZmZXJCZWdpbkluZm8gY29tbWFuZEJ1ZmZlckJlZ2luSW5mbyA9IHsKKyAgICAgICAgICAgICAgICAuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX0JVRkZFUl9CRUdJTl9JTkZPLAorICAgICAgICAgICAgICAgIC5wTmV4dCA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgLmZsYWdzID0gMCwKKyAgICAgICAgICAgICAgICAucEluaGVyaXRhbmNlSW5mbyA9IG51bGxwdHIsCisgICAgICAgIH07CisgICAgICAgIFZLX0NBTEwodmtCZWdpbkNvbW1hbmRCdWZmZXIobUNvbW1hbmRCdWZmZXJzW2ldLCAmY29tbWFuZEJ1ZmZlckJlZ2luSW5mbykpOworCisgICAgICAgIGNvbnN0IFZrQ2xlYXJWYWx1ZSBjbGVhclZhbHMgPSB7CisgICAgICAgICAgICAgICAgLmNvbG9yLmZsb2F0MzJbMF0gPSAwLjBmLAorICAgICAgICAgICAgICAgIC5jb2xvci5mbG9hdDMyWzFdID0gMC4wZiwKKyAgICAgICAgICAgICAgICAuY29sb3IuZmxvYXQzMlsyXSA9IDAuMGYsCisgICAgICAgICAgICAgICAgLmNvbG9yLmZsb2F0MzJbM10gPSAxLjBmLAorICAgICAgICB9OworICAgICAgICBjb25zdCBWa1JlbmRlclBhc3NCZWdpbkluZm8gcmVuZGVyUGFzc0JlZ2luSW5mbyA9IHsKKyAgICAgICAgICAgICAgICAuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19CRUdJTl9JTkZPLAorICAgICAgICAgICAgICAgIC5wTmV4dCA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgLnJlbmRlclBhc3MgPSBtUmVuZGVyUGFzcywKKyAgICAgICAgICAgICAgICAuZnJhbWVidWZmZXIgPSBtRnJhbWVidWZmZXJzW2ldLAorICAgICAgICAgICAgICAgIC5yZW5kZXJBcmVhID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm9mZnNldCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnggPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnkgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5leHRlbnQgPSBtU3dhcGNoYWluSW5mby0+ZGlzcGxheVNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgLmNsZWFyVmFsdWVDb3VudCA9IDEsCisgICAgICAgICAgICAgICAgLnBDbGVhclZhbHVlcyA9ICZjbGVhclZhbHMsCisgICAgICAgIH07CisgICAgICAgIHZrQ21kQmVnaW5SZW5kZXJQYXNzKG1Db21tYW5kQnVmZmVyc1tpXSwgJnJlbmRlclBhc3NCZWdpbkluZm8sIFZLX1NVQlBBU1NfQ09OVEVOVFNfSU5MSU5FKTsKKworICAgICAgICB2a0NtZEJpbmRQaXBlbGluZShtQ29tbWFuZEJ1ZmZlcnNbaV0sIFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsIG1QaXBlbGluZSk7CisKKyAgICAgICAgVmtEZXZpY2VTaXplIG9mZnNldCA9IDA7CisgICAgICAgIHZrQ21kQmluZFZlcnRleEJ1ZmZlcnMobUNvbW1hbmRCdWZmZXJzW2ldLCAwLCAxLCAmbVZlcnRleEJ1ZmZlciwgJm9mZnNldCk7CisKKyAgICAgICAgdmtDbWRQdXNoQ29uc3RhbnRzKG1Db21tYW5kQnVmZmVyc1tpXSwgbVBpcGVsaW5lTGF5b3V0LCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAqIHNpemVvZihmbG9hdCksICZmcmFnRGF0YVswXSk7CisgICAgICAgIHZrQ21kRHJhdyhtQ29tbWFuZEJ1ZmZlcnNbaV0sIDQsIDEsIDAsIDApOworCisgICAgICAgIHZrQ21kUHVzaENvbnN0YW50cyhtQ29tbWFuZEJ1ZmZlcnNbaV0sIG1QaXBlbGluZUxheW91dCwgVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgKiBzaXplb2YoZmxvYXQpLCAmZnJhZ0RhdGFbM10pOworICAgICAgICB2a0NtZERyYXcobUNvbW1hbmRCdWZmZXJzW2ldLCA0LCAxLCAyLCAwKTsKKworICAgICAgICB2a0NtZFB1c2hDb25zdGFudHMobUNvbW1hbmRCdWZmZXJzW2ldLCBtUGlwZWxpbmVMYXlvdXQsIFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAzICogc2l6ZW9mKGZsb2F0KSwgJmZyYWdEYXRhWzZdKTsKKyAgICAgICAgdmtDbWREcmF3KG1Db21tYW5kQnVmZmVyc1tpXSwgNCwgMSwgNiwgMCk7CisKKyAgICAgICAgdmtDbWRQdXNoQ29uc3RhbnRzKG1Db21tYW5kQnVmZmVyc1tpXSwgbVBpcGVsaW5lTGF5b3V0LCBWS19TSEFERVJfU1RBR0VfRlJBR01FTlRfQklULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAqIHNpemVvZihmbG9hdCksICZmcmFnRGF0YVs5XSk7CisgICAgICAgIHZrQ21kRHJhdyhtQ29tbWFuZEJ1ZmZlcnNbaV0sIDQsIDEsIDgsIDApOworCisgICAgICAgIHZrQ21kRW5kUmVuZGVyUGFzcyhtQ29tbWFuZEJ1ZmZlcnNbaV0pOworCisgICAgICAgIFZLX0NBTEwodmtFbmRDb21tYW5kQnVmZmVyKG1Db21tYW5kQnVmZmVyc1tpXSkpOworICAgIH0KKworICAgIGNvbnN0IFZrRmVuY2VDcmVhdGVJbmZvIGZlbmNlQ3JlYXRlSW5mbyA9IHsKKyAgICAgICAgICAgIC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0ZFTkNFX0NSRUFURV9JTkZPLAorICAgICAgICAgICAgLnBOZXh0ID0gbnVsbHB0ciwKKyAgICAgICAgICAgIC5mbGFncyA9IDAsCisgICAgfTsKKyAgICBWS19DQUxMKHZrQ3JlYXRlRmVuY2UobURldmljZUluZm8tPmRldmljZSgpLCAmZmVuY2VDcmVhdGVJbmZvLCBudWxscHRyLCAmbUZlbmNlKSk7CisKKyAgICBjb25zdCBWa1NlbWFwaG9yZUNyZWF0ZUluZm8gc2VtYXBob3JlQ3JlYXRlSW5mbyA9IHsKKyAgICAgICAgICAgIC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NFTUFQSE9SRV9DUkVBVEVfSU5GTywKKyAgICAgICAgICAgIC5wTmV4dCA9IG51bGxwdHIsCisgICAgICAgICAgICAuZmxhZ3MgPSAwLAorICAgIH07CisgICAgVktfQ0FMTCh2a0NyZWF0ZVNlbWFwaG9yZShtRGV2aWNlSW5mby0+ZGV2aWNlKCksICZzZW1hcGhvcmVDcmVhdGVJbmZvLCBudWxscHRyLCAmbVNlbWFwaG9yZSkpOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludDMyX3QgUmVuZGVyZXI6OmRyYXdGcmFtZSgpIHsKKyAgICB1aW50MzJfdCBuZXh0SW5kZXg7CisgICAgVktfQ0FMTCh2a0FjcXVpcmVOZXh0SW1hZ2VLSFIobURldmljZUluZm8tPmRldmljZSgpLCBtU3dhcGNoYWluSW5mby0+c3dhcGNoYWluKCksIFVJTlQ2NF9NQVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlbWFwaG9yZSwgVktfTlVMTF9IQU5ETEUsICZuZXh0SW5kZXgpKTsKKworICAgIFZLX0NBTEwodmtSZXNldEZlbmNlcyhtRGV2aWNlSW5mby0+ZGV2aWNlKCksIDEsICZtRmVuY2UpKTsKKworICAgIFZrUGlwZWxpbmVTdGFnZUZsYWdzIHdhaXRTdGFnZU1hc2sgPSBWS19QSVBFTElORV9TVEFHRV9DT0xPUl9BVFRBQ0hNRU5UX09VVFBVVF9CSVQ7CisgICAgY29uc3QgVmtTdWJtaXRJbmZvIHN1Ym1pdEluZm8gPSB7CisgICAgICAgICAgICAuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TVUJNSVRfSU5GTywKKyAgICAgICAgICAgIC5wTmV4dCA9IG51bGxwdHIsCisgICAgICAgICAgICAud2FpdFNlbWFwaG9yZUNvdW50ID0gMSwKKyAgICAgICAgICAgIC5wV2FpdFNlbWFwaG9yZXMgPSAmbVNlbWFwaG9yZSwKKyAgICAgICAgICAgIC5wV2FpdERzdFN0YWdlTWFzayA9ICZ3YWl0U3RhZ2VNYXNrLAorICAgICAgICAgICAgLmNvbW1hbmRCdWZmZXJDb3VudCA9IDEsCisgICAgICAgICAgICAucENvbW1hbmRCdWZmZXJzID0gJm1Db21tYW5kQnVmZmVyc1tuZXh0SW5kZXhdLAorICAgICAgICAgICAgLnNpZ25hbFNlbWFwaG9yZUNvdW50ID0gMCwKKyAgICAgICAgICAgIC5wU2lnbmFsU2VtYXBob3JlcyA9IG51bGxwdHIsCisgICAgfTsKKyAgICBWS19DQUxMKHZrUXVldWVTdWJtaXQobURldmljZUluZm8tPnF1ZXVlKCksIDEsICZzdWJtaXRJbmZvLCBtRmVuY2UpKQorCisgICAgVktfQ0FMTCh2a1dhaXRGb3JGZW5jZXMobURldmljZUluZm8tPmRldmljZSgpLCAxLCAmbUZlbmNlLCBWS19UUlVFLCAxMDAwMDAwMDApKTsKKworICAgIGNvbnN0IFZrU3dhcGNoYWluS0hSIHN3YXBjaGFpbiA9IG1Td2FwY2hhaW5JbmZvLT5zd2FwY2hhaW4oKTsKKyAgICBjb25zdCBWa1ByZXNlbnRJbmZvS0hSIHByZXNlbnRJbmZvID0geworICAgICAgICAgICAgLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUFJFU0VOVF9JTkZPX0tIUiwKKyAgICAgICAgICAgIC5wTmV4dCA9IG51bGxwdHIsCisgICAgICAgICAgICAud2FpdFNlbWFwaG9yZUNvdW50ID0gMCwKKyAgICAgICAgICAgIC5wV2FpdFNlbWFwaG9yZXMgPSBudWxscHRyLAorICAgICAgICAgICAgLnN3YXBjaGFpbkNvdW50ID0gMSwKKyAgICAgICAgICAgIC5wU3dhcGNoYWlucyA9ICZzd2FwY2hhaW4sCisgICAgICAgICAgICAucEltYWdlSW5kaWNlcyA9ICZuZXh0SW5kZXgsCisgICAgICAgICAgICAucFJlc3VsdHMgPSBudWxscHRyLAorICAgIH07CisgICAgVktfQ0FMTCh2a1F1ZXVlUHJlc2VudEtIUihtRGV2aWNlSW5mby0+cXVldWUoKSwgJnByZXNlbnRJbmZvKSk7CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL2puaS9WdWxrYW5QcmVUcmFuc2Zvcm1UZXN0SGVscGVycy5oIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvam5pL1Z1bGthblByZVRyYW5zZm9ybVRlc3RIZWxwZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjExNzRiNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL2puaS9WdWxrYW5QcmVUcmFuc2Zvcm1UZXN0SGVscGVycy5oCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKyNpZm5kZWYgVlVMS0FOX1BSRV9UUkFOU0ZPUk1fVEVTVF9IRUxQRVJTX0gKKyNkZWZpbmUgVlVMS0FOX1BSRV9UUkFOU0ZPUk1fVEVTVF9IRUxQRVJTX0gKKworI2RlZmluZSBMT0dfVEFHICJ2dWxrYW4iCisKKyNpZm5kZWYgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisjZGVmaW5lIFZLX1VTRV9QTEFURk9STV9BTkRST0lEX0tIUgorI2VuZGlmCisKKyNpbmNsdWRlIDxhbmRyb2lkL2Fzc2V0X21hbmFnZXJfam5pLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9uYXRpdmVfd2luZG93X2puaS5oPgorI2luY2x1ZGUgPGpuaS5oPgorI2luY2x1ZGUgPHZ1bGthbi92dWxrYW4uaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK2NsYXNzIERldmljZUluZm8geworcHVibGljOgorICAgIERldmljZUluZm8oKTsKKyAgICB+RGV2aWNlSW5mbygpOworICAgIGludDMyX3QgaW5pdChKTklFbnYqIGVudiwgam9iamVjdCBqU3VyZmFjZSk7CisgICAgVmtQaHlzaWNhbERldmljZSBncHUoKSBjb25zdCB7IHJldHVybiBtR3B1OyB9CisgICAgVmtTdXJmYWNlS0hSIHN1cmZhY2UoKSBjb25zdCB7IHJldHVybiBtU3VyZmFjZTsgfQorICAgIHVpbnQzMl90IHF1ZXVlRmFtaWx5SW5kZXgoKSBjb25zdCB7IHJldHVybiBtUXVldWVGYW1pbHlJbmRleDsgfQorICAgIFZrRGV2aWNlIGRldmljZSgpIGNvbnN0IHsgcmV0dXJuIG1EZXZpY2U7IH0KKyAgICBWa1F1ZXVlIHF1ZXVlKCkgY29uc3QgeyByZXR1cm4gbVF1ZXVlOyB9CisKK3ByaXZhdGU6CisgICAgVmtJbnN0YW5jZSBtSW5zdGFuY2U7CisgICAgVmtQaHlzaWNhbERldmljZSBtR3B1OworICAgIEFOYXRpdmVXaW5kb3cqIG1XaW5kb3c7CisgICAgVmtTdXJmYWNlS0hSIG1TdXJmYWNlOworICAgIHVpbnQzMl90IG1RdWV1ZUZhbWlseUluZGV4OworICAgIFZrRGV2aWNlIG1EZXZpY2U7CisgICAgVmtRdWV1ZSBtUXVldWU7Cit9OworCitjbGFzcyBTd2FwY2hhaW5JbmZvIHsKK3B1YmxpYzoKKyAgICBTd2FwY2hhaW5JbmZvKGNvbnN0IERldmljZUluZm8qIGNvbnN0IGRldmljZUluZm8pOworICAgIH5Td2FwY2hhaW5JbmZvKCk7CisgICAgaW50MzJfdCBpbml0KGJvb2wgc2V0UHJlVHJhbnNmb3JtLCBpbnQqIG91dFByZVRyYW5zZm9ybUhpbnQpOworICAgIFZrRm9ybWF0IGZvcm1hdCgpIGNvbnN0IHsgcmV0dXJuIG1Gb3JtYXQ7IH0KKyAgICBWa0V4dGVudDJEIGRpc3BsYXlTaXplKCkgY29uc3QgeyByZXR1cm4gbURpc3BsYXlTaXplOyB9CisgICAgVmtTd2FwY2hhaW5LSFIgc3dhcGNoYWluKCkgY29uc3QgeyByZXR1cm4gbVN3YXBjaGFpbjsgfQorICAgIHVpbnQzMl90IHN3YXBjaGFpbkxlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIG1Td2FwY2hhaW5MZW5ndGg7IH0KKworcHJpdmF0ZToKKyAgICBjb25zdCBEZXZpY2VJbmZvKiBjb25zdCBtRGV2aWNlSW5mbzsKKworICAgIFZrRm9ybWF0IG1Gb3JtYXQ7CisgICAgVmtFeHRlbnQyRCBtRGlzcGxheVNpemU7CisgICAgVmtTd2FwY2hhaW5LSFIgbVN3YXBjaGFpbjsKKyAgICB1aW50MzJfdCBtU3dhcGNoYWluTGVuZ3RoOworfTsKKworY2xhc3MgUmVuZGVyZXIgeworcHVibGljOgorICAgIFJlbmRlcmVyKGNvbnN0IERldmljZUluZm8qIGNvbnN0IGRldmljZUluZm8sIGNvbnN0IFN3YXBjaGFpbkluZm8qIGNvbnN0IHN3YXBjaGFpbkluZm8pOworICAgIH5SZW5kZXJlcigpOworICAgIGludDMyX3QgaW5pdChKTklFbnYqIGVudiwgam9iamVjdCBhc3NldE1hbmFnZXIpOworICAgIGludDMyX3QgZHJhd0ZyYW1lKCk7CisKK3ByaXZhdGU6CisgICAgaW50MzJfdCBjcmVhdGVSZW5kZXJQYXNzKCk7CisgICAgaW50MzJfdCBjcmVhdGVGcmFtZUJ1ZmZlcnMoKTsKKyAgICBpbnQzMl90IGNyZWF0ZVZlcnRleEJ1ZmZlcnMoKTsKKyAgICBpbnQzMl90IGxvYWRTaGFkZXJGcm9tRmlsZShjb25zdCBjaGFyKiBmaWxlUGF0aCwgVmtTaGFkZXJNb2R1bGUqIGNvbnN0IG91dFNoYWRlcik7CisgICAgaW50MzJfdCBjcmVhdGVHcmFwaGljc1BpcGVsaW5lKCk7CisKKyAgICBjb25zdCBEZXZpY2VJbmZvKiBjb25zdCBtRGV2aWNlSW5mbzsKKyAgICBjb25zdCBTd2FwY2hhaW5JbmZvKiBjb25zdCBtU3dhcGNoYWluSW5mbzsKKworICAgIEFBc3NldE1hbmFnZXIqIG1Bc3NldE1hbmFnZXI7CisKKyAgICBWa0RldmljZU1lbW9yeSBtRGV2aWNlTWVtb3J5OworICAgIFZrQnVmZmVyIG1WZXJ0ZXhCdWZmZXI7CisKKyAgICBWa1JlbmRlclBhc3MgbVJlbmRlclBhc3M7CisgICAgVmtTaGFkZXJNb2R1bGUgbVZlcnRleFNoYWRlcjsKKyAgICBWa1NoYWRlck1vZHVsZSBtRnJhZ21lbnRTaGFkZXI7CisgICAgVmtQaXBlbGluZUxheW91dCBtUGlwZWxpbmVMYXlvdXQ7CisgICAgVmtQaXBlbGluZSBtUGlwZWxpbmU7CisKKyAgICBWa0NvbW1hbmRQb29sIG1Db21tYW5kUG9vbDsKKyAgICBWa1NlbWFwaG9yZSBtU2VtYXBob3JlOworICAgIFZrRmVuY2UgbUZlbmNlOworCisgICAgc3RkOjp2ZWN0b3I8VmtJbWFnZVZpZXc+IG1JbWFnZVZpZXdzOworICAgIHN0ZDo6dmVjdG9yPFZrRnJhbWVidWZmZXI+IG1GcmFtZWJ1ZmZlcnM7CisgICAgc3RkOjp2ZWN0b3I8VmtDb21tYW5kQnVmZmVyPiBtQ29tbWFuZEJ1ZmZlcnM7Cit9OworCisjZW5kaWYgLy8gVlVMS0FOX1BSRV9UUkFOU0ZPUk1fVEVTVF9IRUxQRVJTX0gKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL2puaS9WdWxrYW5UZXN0SGVscGVycy5jcHAgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9qbmkvVnVsa2FuVGVzdEhlbHBlcnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ZDk1MmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9qbmkvVnVsa2FuVGVzdEhlbHBlcnMuY3BwCkBAIC0wLDAgKzEsMTE5MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiVnVsa2FuVGVzdEhlbHBlcnMiCisKKyNpbmNsdWRlICJWdWxrYW5UZXN0SGVscGVycy5oIgorCisjaW5jbHVkZSA8YW5kcm9pZC9hc3NldF9tYW5hZ2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9hc3NldF9tYW5hZ2VyX2puaS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmVfYnVmZmVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9sb2cuaD4KKworI2RlZmluZSBBTE9HRSguLi4pIF9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfRVJST1IsIExPR19UQUcsIF9fVkFfQVJHU19fKQorCisjZGVmaW5lIEFTU0VSVChhKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoIShhKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBBTE9HRSgiRmFpbHVyZTogIiAjYSAiIGF0ICIgX19GSUxFX18gIjolZCIsIF9fTElORV9fKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNkZWZpbmUgVktfQ0FMTChhKSBBU1NFUlQoVktfU1VDQ0VTUyA9PSAoYSkpCisKK25hbWVzcGFjZSB7CisKK3ZvaWQgYWRkSW1hZ2VUcmFuc2l0aW9uQmFycmllcihWa0NvbW1hbmRCdWZmZXIgY29tbWFuZEJ1ZmZlciwgVmtJbWFnZSBpbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1BpcGVsaW5lU3RhZ2VGbGFncyBzcmNTdGFnZU1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtQaXBlbGluZVN0YWdlRmxhZ3MgZHN0U3RhZ2VNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrQWNjZXNzRmxhZ3Mgc3JjQWNjZXNzTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0FjY2Vzc0ZsYWdzIGRzdEFjY2Vzc01hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtJbWFnZUxheW91dCBvbGRMYXlvdXQsIFZrSW1hZ2VMYXlvdXQgbmV3TGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNyY1F1ZXVlID0gVktfUVVFVUVfRkFNSUxZX0lHTk9SRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHN0UXVldWUgPSBWS19RVUVVRV9GQU1JTFlfSUdOT1JFRCkgeworICBjb25zdCBWa0ltYWdlU3VicmVzb3VyY2VSYW5nZSBzdWJSZXNvdXJjZXJhbmdleworICAgICAgLmFzcGVjdE1hc2sgPSBWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklULAorICAgICAgLmJhc2VNaXBMZXZlbCA9IDAsCisgICAgICAubGV2ZWxDb3VudCA9IDEsCisgICAgICAuYmFzZUFycmF5TGF5ZXIgPSAwLAorICAgICAgLmxheWVyQ291bnQgPSAxLAorICB9OworICBjb25zdCBWa0ltYWdlTWVtb3J5QmFycmllciBpbWFnZUJhcnJpZXJ7CisgICAgICAuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9NRU1PUllfQkFSUklFUiwKKyAgICAgIC5wTmV4dCA9IG51bGxwdHIsCisgICAgICAuc3JjQWNjZXNzTWFzayA9IHNyY0FjY2Vzc01hc2ssCisgICAgICAuZHN0QWNjZXNzTWFzayA9IGRzdEFjY2Vzc01hc2ssCisgICAgICAub2xkTGF5b3V0ID0gb2xkTGF5b3V0LAorICAgICAgLm5ld0xheW91dCA9IG5ld0xheW91dCwKKyAgICAgIC5zcmNRdWV1ZUZhbWlseUluZGV4ID0gc3JjUXVldWUsCisgICAgICAuZHN0UXVldWVGYW1pbHlJbmRleCA9IGRzdFF1ZXVlLAorICAgICAgLmltYWdlID0gaW1hZ2UsCisgICAgICAuc3VicmVzb3VyY2VSYW5nZSA9IHN1YlJlc291cmNlcmFuZ2UsCisgIH07CisgIHZrQ21kUGlwZWxpbmVCYXJyaWVyKGNvbW1hbmRCdWZmZXIsIHNyY1N0YWdlTWFzaywgZHN0U3RhZ2VNYXNrLCAwLCAwLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAwLCBudWxscHRyLCAxLCAmaW1hZ2VCYXJyaWVyKTsKK30KKworfSAvLyBuYW1lc3BhY2UKKworYm9vbCBWa0luaXQ6OmluaXQoKSB7CisgIFZrQXBwbGljYXRpb25JbmZvIGFwcEluZm8gPSB7CisgICAgICAuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9BUFBMSUNBVElPTl9JTkZPLAorICAgICAgLnBOZXh0ID0gbnVsbHB0ciwKKyAgICAgIC5hcGlWZXJzaW9uID0gVktfTUFLRV9WRVJTSU9OKDEsIDEsIDApLAorICAgICAgLmFwcGxpY2F0aW9uVmVyc2lvbiA9IFZLX01BS0VfVkVSU0lPTigxLCAwLCAwKSwKKyAgICAgIC5lbmdpbmVWZXJzaW9uID0gVktfTUFLRV9WRVJTSU9OKDEsIDAsIDApLAorICAgICAgLnBBcHBsaWNhdGlvbk5hbWUgPSAiVnVsa2FuR3B1VGVzdCIsCisgICAgICAucEVuZ2luZU5hbWUgPSAiVnVsa2FuR3B1VGVzdEVuZ2luZSIsCisgIH07CisgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIgKj4gaW5zdGFuY2VFeHQsIGRldmljZUV4dDsKKyAgaW5zdGFuY2VFeHQucHVzaF9iYWNrKFZLX0VYVF9ERUJVR19SRVBPUlRfRVhURU5TSU9OX05BTUUpOworICBpbnN0YW5jZUV4dC5wdXNoX2JhY2soVktfS0hSX0VYVEVSTkFMX01FTU9SWV9DQVBBQklMSVRJRVNfRVhURU5TSU9OX05BTUUpOworICBpbnN0YW5jZUV4dC5wdXNoX2JhY2soVktfS0hSX0VYVEVSTkFMX1NFTUFQSE9SRV9DQVBBQklMSVRJRVNfRVhURU5TSU9OX05BTUUpOworICBpbnN0YW5jZUV4dC5wdXNoX2JhY2soVktfS0hSX0dFVF9QSFlTSUNBTF9ERVZJQ0VfUFJPUEVSVElFU18yX0VYVEVOU0lPTl9OQU1FKTsKKyAgZGV2aWNlRXh0LnB1c2hfYmFjayhWS19LSFJfR0VUX01FTU9SWV9SRVFVSVJFTUVOVFNfMl9FWFRFTlNJT05fTkFNRSk7CisgIGRldmljZUV4dC5wdXNoX2JhY2soVktfS0hSX0JJTkRfTUVNT1JZXzJfRVhURU5TSU9OX05BTUUpOworICBkZXZpY2VFeHQucHVzaF9iYWNrKFZLX0tIUl9FWFRFUk5BTF9NRU1PUllfRVhURU5TSU9OX05BTUUpOworICBkZXZpY2VFeHQucHVzaF9iYWNrKFZLX0tIUl9FWFRFUk5BTF9TRU1BUEhPUkVfRVhURU5TSU9OX05BTUUpOworICBkZXZpY2VFeHQucHVzaF9iYWNrKFZLX0tIUl9FWFRFUk5BTF9TRU1BUEhPUkVfRkRfRVhURU5TSU9OX05BTUUpOworICBkZXZpY2VFeHQucHVzaF9iYWNrKFZLX0tIUl9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fRVhURU5TSU9OX05BTUUpOworICBkZXZpY2VFeHQucHVzaF9iYWNrKFZLX0FORFJPSURfRVhURVJOQUxfTUVNT1JZX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX0VYVEVOU0lPTl9OQU1FKTsKKyAgVmtJbnN0YW5jZUNyZWF0ZUluZm8gY3JlYXRlSW5mbyA9IHsKKyAgICAgIC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lOU1RBTkNFX0NSRUFURV9JTkZPLAorICAgICAgLnBOZXh0ID0gbnVsbHB0ciwKKyAgICAgIC5wQXBwbGljYXRpb25JbmZvID0gJmFwcEluZm8sCisgICAgICAuZW5hYmxlZEV4dGVuc2lvbkNvdW50ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGluc3RhbmNlRXh0LnNpemUoKSksCisgICAgICAucHBFbmFibGVkRXh0ZW5zaW9uTmFtZXMgPSBpbnN0YW5jZUV4dC5kYXRhKCksCisgICAgICAuZW5hYmxlZExheWVyQ291bnQgPSAwLAorICAgICAgLnBwRW5hYmxlZExheWVyTmFtZXMgPSBudWxscHRyLAorICB9OworICBWS19DQUxMKHZrQ3JlYXRlSW5zdGFuY2UoJmNyZWF0ZUluZm8sIG51bGxwdHIsICZtSW5zdGFuY2UpKTsKKworICAvLyBGaW5kIGEgR1BVIHRvIHVzZS4KKyAgdWludDMyX3QgZ3B1Q291bnQgPSAxOworICBpbnQgc3RhdHVzID0gdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXMobUluc3RhbmNlLCAmZ3B1Q291bnQsICZtR3B1KTsKKyAgQVNTRVJUKHN0YXR1cyA9PSBWS19TVUNDRVNTIHx8IHN0YXR1cyA9PSBWS19JTkNPTVBMRVRFKTsKKyAgQVNTRVJUKGdwdUNvdW50ID4gMCk7CisKKyAgdWludDMyX3QgcXVldWVGYW1pbHlDb3VudCA9IDA7CisgIHZrR2V0UGh5c2ljYWxEZXZpY2VRdWV1ZUZhbWlseVByb3BlcnRpZXMobUdwdSwgJnF1ZXVlRmFtaWx5Q291bnQsIG51bGxwdHIpOworICBBU1NFUlQocXVldWVGYW1pbHlDb3VudCAhPSAwKTsKKyAgc3RkOjp2ZWN0b3I8VmtRdWV1ZUZhbWlseVByb3BlcnRpZXM+IHF1ZXVlRmFtaWx5UHJvcGVydGllcyhxdWV1ZUZhbWlseUNvdW50KTsKKyAgdmtHZXRQaHlzaWNhbERldmljZVF1ZXVlRmFtaWx5UHJvcGVydGllcyhtR3B1LCAmcXVldWVGYW1pbHlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZUZhbWlseVByb3BlcnRpZXMuZGF0YSgpKTsKKworICB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4OworICBmb3IgKHF1ZXVlRmFtaWx5SW5kZXggPSAwOyBxdWV1ZUZhbWlseUluZGV4IDwgcXVldWVGYW1pbHlDb3VudDsKKyAgICAgICArK3F1ZXVlRmFtaWx5SW5kZXgpIHsKKyAgICBpZiAocXVldWVGYW1pbHlQcm9wZXJ0aWVzW3F1ZXVlRmFtaWx5SW5kZXhdLnF1ZXVlRmxhZ3MgJgorICAgICAgICBWS19RVUVVRV9HUkFQSElDU19CSVQpCisgICAgICBicmVhazsKKyAgfQorICBBU1NFUlQocXVldWVGYW1pbHlJbmRleCA8IHF1ZXVlRmFtaWx5Q291bnQpOworICBtUXVldWVGYW1pbHlJbmRleCA9IHF1ZXVlRmFtaWx5SW5kZXg7CisKKyAgZmxvYXQgcHJpb3JpdGllc1tdID0gezEuMGZ9OworICBWa0RldmljZVF1ZXVlQ3JlYXRlSW5mbyBxdWV1ZUNyZWF0ZUluZm97CisgICAgICAuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9ERVZJQ0VfUVVFVUVfQ1JFQVRFX0lORk8sCisgICAgICAucE5leHQgPSBudWxscHRyLAorICAgICAgLmZsYWdzID0gMCwKKyAgICAgIC5xdWV1ZUNvdW50ID0gMSwKKyAgICAgIC5xdWV1ZUZhbWlseUluZGV4ID0gcXVldWVGYW1pbHlJbmRleCwKKyAgICAgIC5wUXVldWVQcmlvcml0aWVzID0gcHJpb3JpdGllcywKKyAgfTsKKworICBWa0RldmljZUNyZWF0ZUluZm8gZGV2aWNlQ3JlYXRlSW5mb3sKKyAgICAgIC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFVklDRV9DUkVBVEVfSU5GTywKKyAgICAgIC5wTmV4dCA9IG51bGxwdHIsCisgICAgICAucXVldWVDcmVhdGVJbmZvQ291bnQgPSAxLAorICAgICAgLnBRdWV1ZUNyZWF0ZUluZm9zID0gJnF1ZXVlQ3JlYXRlSW5mbywKKyAgICAgIC5lbmFibGVkTGF5ZXJDb3VudCA9IDAsCisgICAgICAucHBFbmFibGVkTGF5ZXJOYW1lcyA9IG51bGxwdHIsCisgICAgICAuZW5hYmxlZEV4dGVuc2lvbkNvdW50ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGRldmljZUV4dC5zaXplKCkpLAorICAgICAgLnBwRW5hYmxlZEV4dGVuc2lvbk5hbWVzID0gZGV2aWNlRXh0LmRhdGEoKSwKKyAgICAgIC5wRW5hYmxlZEZlYXR1cmVzID0gbnVsbHB0ciwKKyAgfTsKKworICBWS19DQUxMKHZrQ3JlYXRlRGV2aWNlKG1HcHUsICZkZXZpY2VDcmVhdGVJbmZvLCBudWxscHRyLCAmbURldmljZSkpOworCisgIG1QZm5HZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCA9CisgICAgICAoUEZOX3ZrR2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQpdmtHZXREZXZpY2VQcm9jQWRkcigKKyAgICAgICAgICBtRGV2aWNlLCAidmtHZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCIpOworICBBU1NFUlQobVBmbkdldEFuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEKTsKKworICBWa1BoeXNpY2FsRGV2aWNlU2FtcGxlclljYmNyQ29udmVyc2lvbkZlYXR1cmVzS0hSIHljYmNyRmVhdHVyZXN7CisgICAgICAuc1R5cGUgPQorICAgICAgICAgIFZLX1NUUlVDVFVSRV9UWVBFX1BIWVNJQ0FMX0RFVklDRV9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fRkVBVFVSRVNfS0hSLAorICAgICAgLnBOZXh0ID0gbnVsbHB0ciwKKyAgfTsKKyAgVmtQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiBwaHlzaWNhbERldmljZUZlYXR1cmVzeworICAgICAgLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUEhZU0lDQUxfREVWSUNFX0ZFQVRVUkVTXzJfS0hSLAorICAgICAgLnBOZXh0ID0gJnljYmNyRmVhdHVyZXMsCisgIH07CisgIFBGTl92a0dldFBoeXNpY2FsRGV2aWNlRmVhdHVyZXMyS0hSIGdldEZlYXR1cmVzID0KKyAgICAgIChQRk5fdmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUil2a0dldEluc3RhbmNlUHJvY0FkZHIoCisgICAgICAgICAgbUluc3RhbmNlLCAidmtHZXRQaHlzaWNhbERldmljZUZlYXR1cmVzMktIUiIpOworICBBU1NFUlQoZ2V0RmVhdHVyZXMpOworICBnZXRGZWF0dXJlcyhtR3B1LCAmcGh5c2ljYWxEZXZpY2VGZWF0dXJlcyk7CisgIEFTU0VSVCh5Y2JjckZlYXR1cmVzLnNhbXBsZXJZY2JjckNvbnZlcnNpb24gPT0gVktfVFJVRSk7CisKKyAgdmtHZXREZXZpY2VRdWV1ZShtRGV2aWNlLCAwLCAwLCAmbVF1ZXVlKTsKKyAgdmtHZXRQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMobUdwdSwgJm1NZW1vcnlQcm9wZXJ0aWVzKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworVmtJbml0Ojp+VmtJbml0KCkgeworICBpZiAobVF1ZXVlICE9IFZLX05VTExfSEFORExFKSB7CisgICAgLy8gUXVldWVzIGFyZSBpbXBsaWNpdGx5IGRlc3Ryb3llZCB3aXRoIHRoZSBkZXZpY2UuCisgICAgbVF1ZXVlID0gVktfTlVMTF9IQU5ETEU7CisgIH0KKyAgaWYgKG1EZXZpY2UgIT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICB2a0Rlc3Ryb3lEZXZpY2UobURldmljZSwgbnVsbHB0cik7CisgICAgbURldmljZSA9IFZLX05VTExfSEFORExFOworICB9CisgIGlmIChtSW5zdGFuY2UgIT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICB2a0Rlc3Ryb3lJbnN0YW5jZShtSW5zdGFuY2UsIG51bGxwdHIpOworICAgIG1JbnN0YW5jZSA9IFZLX05VTExfSEFORExFOworICB9Cit9CisKK3VpbnQzMl90IFZrSW5pdDo6ZmluZE1lbW9yeVR5cGUodWludDMyX3QgbWVtb3J5VHlwZUJpdHNSZXF1aXJlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtGbGFncyByZXF1aXJlbWVudHNNYXNrKSB7CisgIGZvciAodWludDMyX3QgbWVtb3J5SW5kZXggPSAwOyBtZW1vcnlJbmRleCA8IFZLX01BWF9NRU1PUllfVFlQRVM7CisgICAgICAgKyttZW1vcnlJbmRleCkgeworICAgIGNvbnN0IHVpbnQzMl90IG1lbW9yeVR5cGVCaXRzID0gKDEgPDwgbWVtb3J5SW5kZXgpOworICAgIGNvbnN0IGJvb2wgaXNSZXF1aXJlZE1lbW9yeVR5cGUgPQorICAgICAgICBtZW1vcnlUeXBlQml0c1JlcXVpcmVtZW50ICYgbWVtb3J5VHlwZUJpdHM7CisgICAgY29uc3QgYm9vbCBzYXRpc2ZpZXNGbGFncyA9CisgICAgICAgIChtTWVtb3J5UHJvcGVydGllcy5tZW1vcnlUeXBlc1ttZW1vcnlJbmRleF0ucHJvcGVydHlGbGFncyAmCisgICAgICAgICByZXF1aXJlbWVudHNNYXNrKSA9PSByZXF1aXJlbWVudHNNYXNrOworICAgIGlmIChpc1JlcXVpcmVkTWVtb3J5VHlwZSAmJiBzYXRpc2ZpZXNGbGFncykKKyAgICAgIHJldHVybiBtZW1vcnlJbmRleDsKKyAgfQorCisgIC8vIGZhaWxlZCB0byBmaW5kIG1lbW9yeSB0eXBlLgorICBBTE9HRSgiQ291bGRuJ3QgZmluZCByZXF1aXJlZCBtZW1vcnkgdHlwZS4iKTsKKyAgcmV0dXJuIDA7Cit9CisKK1ZrQUhhcmR3YXJlQnVmZmVySW1hZ2U6OlZrQUhhcmR3YXJlQnVmZmVySW1hZ2UoVmtJbml0ICppbml0KSA6IG1Jbml0KGluaXQpIHt9CisKK2Jvb2wgVmtBSGFyZHdhcmVCdWZmZXJJbWFnZTo6aW5pdChBSGFyZHdhcmVCdWZmZXIgKmJ1ZmZlciwgYm9vbCB1c2VFeHRlcm5hbEZvcm1hdCwgaW50IHN5bmNGZCkgeworICBBSGFyZHdhcmVCdWZmZXJfRGVzYyBidWZmZXJEZXNjOworICBBSGFyZHdhcmVCdWZmZXJfZGVzY3JpYmUoYnVmZmVyLCAmYnVmZmVyRGVzYyk7CisgIEFTU0VSVChidWZmZXJEZXNjLmxheWVycyA9PSAxKTsKKworICBWa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlckZvcm1hdFByb3BlcnRpZXNBTkRST0lEIGZvcm1hdEluZm8gPSB7CisgICAgICAuc1R5cGUgPQorICAgICAgICAgIFZLX1NUUlVDVFVSRV9UWVBFX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX0ZPUk1BVF9QUk9QRVJUSUVTX0FORFJPSUQsCisgICAgICAucE5leHQgPSBudWxscHRyLAorICB9OworICBWa0FuZHJvaWRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNBTkRST0lEIHByb3BlcnRpZXMgPSB7CisgICAgICAuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9QUk9QRVJUSUVTX0FORFJPSUQsCisgICAgICAucE5leHQgPSAmZm9ybWF0SW5mbywKKyAgfTsKKyAgVktfQ0FMTChtSW5pdC0+Z2V0SGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzRm4oKShtSW5pdC0+ZGV2aWNlKCksIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydGllcykpOworICBBU1NFUlQodXNlRXh0ZXJuYWxGb3JtYXQgfHwgZm9ybWF0SW5mby5mb3JtYXQgIT0gVktfRk9STUFUX1VOREVGSU5FRCk7CisgIC8vIENyZWF0ZSBhbiBpbWFnZSB0byBiaW5kIHRvIG91ciBBSGFyZHdhcmVCdWZmZXIuCisgIFZrRXh0ZXJuYWxGb3JtYXRBTkRST0lEIGV4dGVybmFsRm9ybWF0eworICAgICAgLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfRVhURVJOQUxfRk9STUFUX0FORFJPSUQsCisgICAgICAucE5leHQgPSBudWxscHRyLAorICAgICAgLmV4dGVybmFsRm9ybWF0ID0gZm9ybWF0SW5mby5leHRlcm5hbEZvcm1hdCwKKyAgfTsKKyAgVmtFeHRlcm5hbE1lbW9yeUltYWdlQ3JlYXRlSW5mbyBleHRlcm5hbENyZWF0ZUluZm97CisgICAgICAuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9FWFRFUk5BTF9NRU1PUllfSU1BR0VfQ1JFQVRFX0lORk8sCisgICAgICAucE5leHQgPSB1c2VFeHRlcm5hbEZvcm1hdCA/ICZleHRlcm5hbEZvcm1hdCA6IG51bGxwdHIsCisgICAgICAuaGFuZGxlVHlwZXMgPQorICAgICAgICAgIFZLX0VYVEVSTkFMX01FTU9SWV9IQU5ETEVfVFlQRV9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9CSVRfQU5EUk9JRCwKKyAgfTsKKyAgVmtJbWFnZUNyZWF0ZUluZm8gY3JlYXRlSW5mb3sKKyAgICAgIC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX0NSRUFURV9JTkZPLAorICAgICAgLnBOZXh0ID0gJmV4dGVybmFsQ3JlYXRlSW5mbywKKyAgICAgIC5mbGFncyA9IDB1LAorICAgICAgLmltYWdlVHlwZSA9IFZLX0lNQUdFX1RZUEVfMkQsCisgICAgICAuZm9ybWF0ID0gdXNlRXh0ZXJuYWxGb3JtYXQgPyBWS19GT1JNQVRfVU5ERUZJTkVEIDogZm9ybWF0SW5mby5mb3JtYXQsCisgICAgICAuZXh0ZW50ID0KKyAgICAgICAgICB7CisgICAgICAgICAgICAgIGJ1ZmZlckRlc2Mud2lkdGgsIGJ1ZmZlckRlc2MuaGVpZ2h0LCAxdSwKKyAgICAgICAgICB9LAorICAgICAgLm1pcExldmVscyA9IDF1LAorICAgICAgLmFycmF5TGF5ZXJzID0gMXUsCisgICAgICAuc2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVCwKKyAgICAgIC50aWxpbmcgPSBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCwKKyAgICAgIC51c2FnZSA9IFZLX0lNQUdFX1VTQUdFX1NBTVBMRURfQklULAorICAgICAgLnNoYXJpbmdNb2RlID0gVktfU0hBUklOR19NT0RFX0VYQ0xVU0lWRSwKKyAgICAgIC5xdWV1ZUZhbWlseUluZGV4Q291bnQgPSAwLAorICAgICAgLnBRdWV1ZUZhbWlseUluZGljZXMgPSBudWxscHRyLAorICAgICAgLmluaXRpYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVELAorICB9OworICBWS19DQUxMKHZrQ3JlYXRlSW1hZ2UobUluaXQtPmRldmljZSgpLCAmY3JlYXRlSW5mbywgbnVsbHB0ciwgJm1JbWFnZSkpOworCisgIFZrSW1wb3J0QW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb0FORFJPSUQgYW5kcm9pZEhhcmR3YXJlQnVmZmVySW5mb3sKKyAgICAgIC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNUE9SVF9BTkRST0lEX0hBUkRXQVJFX0JVRkZFUl9JTkZPX0FORFJPSUQsCisgICAgICAucE5leHQgPSBudWxscHRyLAorICAgICAgLmJ1ZmZlciA9IGJ1ZmZlciwKKyAgfTsKKyAgVmtNZW1vcnlEZWRpY2F0ZWRBbGxvY2F0ZUluZm8gbWVtb3J5QWxsb2NhdGVJbmZveworICAgICAgLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0RFRElDQVRFRF9BTExPQ0FURV9JTkZPLAorICAgICAgLnBOZXh0ID0gJmFuZHJvaWRIYXJkd2FyZUJ1ZmZlckluZm8sCisgICAgICAuaW1hZ2UgPSBtSW1hZ2UsCisgICAgICAuYnVmZmVyID0gVktfTlVMTF9IQU5ETEUsCisgIH07CisgIFZrTWVtb3J5QWxsb2NhdGVJbmZvIGFsbG9jYXRlSW5mb3sKKyAgICAgIC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9BTExPQ0FURV9JTkZPLAorICAgICAgLnBOZXh0ID0gJm1lbW9yeUFsbG9jYXRlSW5mbywKKyAgICAgIC5hbGxvY2F0aW9uU2l6ZSA9IHByb3BlcnRpZXMuYWxsb2NhdGlvblNpemUsCisgICAgICAubWVtb3J5VHlwZUluZGV4ID0gbUluaXQtPmZpbmRNZW1vcnlUeXBlKAorICAgICAgICAgIHByb3BlcnRpZXMubWVtb3J5VHlwZUJpdHMsIDB1IC8qIHJlcXVpcmVtZW50c01hc2sgKi8pLAorICB9OworCisgIFZLX0NBTEwodmtBbGxvY2F0ZU1lbW9yeShtSW5pdC0+ZGV2aWNlKCksICZhbGxvY2F0ZUluZm8sIG51bGxwdHIsICZtTWVtb3J5KSk7CisgIFZrQmluZEltYWdlTWVtb3J5SW5mbyBiaW5kSW1hZ2VJbmZvOworICBiaW5kSW1hZ2VJbmZvLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfQklORF9JTUFHRV9NRU1PUllfSU5GTzsKKyAgYmluZEltYWdlSW5mby5wTmV4dCA9IG51bGxwdHI7CisgIGJpbmRJbWFnZUluZm8uaW1hZ2UgPSBtSW1hZ2U7CisgIGJpbmRJbWFnZUluZm8ubWVtb3J5ID0gbU1lbW9yeTsKKyAgYmluZEltYWdlSW5mby5tZW1vcnlPZmZzZXQgPSAwOworCisgIFBGTl92a0JpbmRJbWFnZU1lbW9yeTJLSFIgYmluZEltYWdlTWVtb3J5ID0KKyAgICAgIChQRk5fdmtCaW5kSW1hZ2VNZW1vcnkyS0hSKXZrR2V0RGV2aWNlUHJvY0FkZHIobUluaXQtPmRldmljZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmtCaW5kSW1hZ2VNZW1vcnkyS0hSIik7CisgIEFTU0VSVChiaW5kSW1hZ2VNZW1vcnkpOworICBWS19DQUxMKGJpbmRJbWFnZU1lbW9yeShtSW5pdC0+ZGV2aWNlKCksIDEsICZiaW5kSW1hZ2VJbmZvKSk7CisKKyAgVmtJbWFnZU1lbW9yeVJlcXVpcmVtZW50c0luZm8yIG1lbVJlcXNJbmZvOworICBtZW1SZXFzSW5mby5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX01FTU9SWV9SRVFVSVJFTUVOVFNfSU5GT18yOworICBtZW1SZXFzSW5mby5wTmV4dCA9IG51bGxwdHI7CisgIG1lbVJlcXNJbmZvLmltYWdlID0gbUltYWdlOworCisgIFZrTWVtb3J5RGVkaWNhdGVkUmVxdWlyZW1lbnRzIGRlZGljYXRlZE1lbVJlcXM7CisgIGRlZGljYXRlZE1lbVJlcXMuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfREVESUNBVEVEX1JFUVVJUkVNRU5UUzsKKyAgZGVkaWNhdGVkTWVtUmVxcy5wTmV4dCA9IG51bGxwdHI7CisKKyAgVmtNZW1vcnlSZXF1aXJlbWVudHMyIG1lbVJlcXM7CisgIG1lbVJlcXMuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfUkVRVUlSRU1FTlRTXzI7CisgIG1lbVJlcXMucE5leHQgPSAmZGVkaWNhdGVkTWVtUmVxczsKKworICBQRk5fdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50czJLSFIgZ2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMgPQorICAgICAgKFBGTl92a0dldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzMktIUil2a0dldERldmljZVByb2NBZGRyKAorICAgICAgICAgIG1Jbml0LT5kZXZpY2UoKSwgInZrR2V0SW1hZ2VNZW1vcnlSZXF1aXJlbWVudHMyS0hSIik7CisgIEFTU0VSVChnZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50cyk7CisgIGdldEltYWdlTWVtb3J5UmVxdWlyZW1lbnRzKG1Jbml0LT5kZXZpY2UoKSwgJm1lbVJlcXNJbmZvLCAmbWVtUmVxcyk7CisgIEFTU0VSVChWS19UUlVFID09IGRlZGljYXRlZE1lbVJlcXMucHJlZmVyc0RlZGljYXRlZEFsbG9jYXRpb24pOworICBBU1NFUlQoVktfVFJVRSA9PSBkZWRpY2F0ZWRNZW1SZXFzLnJlcXVpcmVzRGVkaWNhdGVkQWxsb2NhdGlvbik7CisKKyAgaWYgKHVzZUV4dGVybmFsRm9ybWF0IC8qIFRPRE86IHx8IGV4cGxpY2l0IGZvcm1hdCByZXF1aXJlcyBjb252ZXJzaW9uICovKSB7CisgICAgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uQ3JlYXRlSW5mbyBjb252ZXJzaW9uQ3JlYXRlSW5mb3sKKyAgICAgICAgLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0NSRUFURV9JTkZPLAorICAgICAgICAucE5leHQgPSAmZXh0ZXJuYWxGb3JtYXQsCisgICAgICAgIC5mb3JtYXQgPSB1c2VFeHRlcm5hbEZvcm1hdCA/IFZLX0ZPUk1BVF9VTkRFRklORUQgOiBmb3JtYXRJbmZvLmZvcm1hdCwKKyAgICAgICAgLnljYmNyTW9kZWwgPSBmb3JtYXRJbmZvLnN1Z2dlc3RlZFljYmNyTW9kZWwsCisgICAgICAgIC55Y2JjclJhbmdlID0gZm9ybWF0SW5mby5zdWdnZXN0ZWRZY2JjclJhbmdlLAorICAgICAgICAuY29tcG9uZW50cyA9IGZvcm1hdEluZm8uc2FtcGxlclljYmNyQ29udmVyc2lvbkNvbXBvbmVudHMsCisgICAgICAgIC54Q2hyb21hT2Zmc2V0ID0gZm9ybWF0SW5mby5zdWdnZXN0ZWRYQ2hyb21hT2Zmc2V0LAorICAgICAgICAueUNocm9tYU9mZnNldCA9IGZvcm1hdEluZm8uc3VnZ2VzdGVkWUNocm9tYU9mZnNldCwKKyAgICAgICAgLmNocm9tYUZpbHRlciA9IFZLX0ZJTFRFUl9ORUFSRVNULAorICAgICAgICAuZm9yY2VFeHBsaWNpdFJlY29uc3RydWN0aW9uID0gVktfRkFMU0UsCisgICAgfTsKKyAgICBQRk5fdmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSIGNyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb24gPQorICAgICAgICAoUEZOX3ZrQ3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbktIUil2a0dldERldmljZVByb2NBZGRyKAorICAgICAgICAgICAgbUluaXQtPmRldmljZSgpLCAidmtDcmVhdGVTYW1wbGVyWWNiY3JDb252ZXJzaW9uS0hSIik7CisgICAgQVNTRVJUKGNyZWF0ZVNhbXBsZXJZY2JjckNvbnZlcnNpb24pOworICAgIFZLX0NBTEwoY3JlYXRlU2FtcGxlclljYmNyQ29udmVyc2lvbihtSW5pdC0+ZGV2aWNlKCksICZjb252ZXJzaW9uQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgJm1Db252ZXJzaW9uKSk7CisgIH0KKyAgVmtTYW1wbGVyWWNiY3JDb252ZXJzaW9uSW5mbyBzYW1wbGVyQ29udmVyc2lvbkluZm97CisgICAgICAuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TQU1QTEVSX1lDQkNSX0NPTlZFUlNJT05fSU5GTywKKyAgICAgIC5wTmV4dCA9ICZleHRlcm5hbEZvcm1hdCwKKyAgICAgIC5jb252ZXJzaW9uID0gbUNvbnZlcnNpb24sCisgIH07CisKKyAgVmtTYW1wbGVyQ3JlYXRlSW5mbyBzYW1wbGVyQ3JlYXRlSW5mb3sKKyAgICAgIC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NBTVBMRVJfQ1JFQVRFX0lORk8sCisgICAgICAucE5leHQgPQorICAgICAgICAgIChtQ29udmVyc2lvbiA9PSBWS19OVUxMX0hBTkRMRSkgPyBudWxscHRyIDogJnNhbXBsZXJDb252ZXJzaW9uSW5mbywKKyAgICAgIC5tYWdGaWx0ZXIgPSBWS19GSUxURVJfTkVBUkVTVCwKKyAgICAgIC5taW5GaWx0ZXIgPSBWS19GSUxURVJfTkVBUkVTVCwKKyAgICAgIC5taXBtYXBNb2RlID0gVktfU0FNUExFUl9NSVBNQVBfTU9ERV9ORUFSRVNULAorICAgICAgLmFkZHJlc3NNb2RlVSA9IFZLX1NBTVBMRVJfQUREUkVTU19NT0RFX0NMQU1QX1RPX0VER0UsCisgICAgICAuYWRkcmVzc01vZGVWID0gVktfU0FNUExFUl9BRERSRVNTX01PREVfQ0xBTVBfVE9fRURHRSwKKyAgICAgIC5hZGRyZXNzTW9kZVcgPSBWS19TQU1QTEVSX0FERFJFU1NfTU9ERV9DTEFNUF9UT19FREdFLAorICAgICAgLm1pcExvZEJpYXMgPSAwLjBmLAorICAgICAgLmFuaXNvdHJvcHlFbmFibGUgPSBWS19GQUxTRSwKKyAgICAgIC5tYXhBbmlzb3Ryb3B5ID0gMSwKKyAgICAgIC5jb21wYXJlRW5hYmxlID0gVktfRkFMU0UsCisgICAgICAuY29tcGFyZU9wID0gVktfQ09NUEFSRV9PUF9ORVZFUiwKKyAgICAgIC5taW5Mb2QgPSAwLjBmLAorICAgICAgLm1heExvZCA9IDAuMGYsCisgICAgICAuYm9yZGVyQ29sb3IgPSBWS19CT1JERVJfQ09MT1JfRkxPQVRfT1BBUVVFX1dISVRFLAorICAgICAgLnVubm9ybWFsaXplZENvb3JkaW5hdGVzID0gVktfRkFMU0UsCisgIH07CisgIFZLX0NBTEwoCisgICAgICB2a0NyZWF0ZVNhbXBsZXIobUluaXQtPmRldmljZSgpLCAmc2FtcGxlckNyZWF0ZUluZm8sIG51bGxwdHIsICZtU2FtcGxlcikpOworCisgIFZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyB2aWV3Q3JlYXRlSW5mb3sKKyAgICAgIC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0lNQUdFX1ZJRVdfQ1JFQVRFX0lORk8sCisgICAgICAucE5leHQgPQorICAgICAgICAgIChtQ29udmVyc2lvbiA9PSBWS19OVUxMX0hBTkRMRSkgPyBudWxscHRyIDogJnNhbXBsZXJDb252ZXJzaW9uSW5mbywKKyAgICAgIC5pbWFnZSA9IG1JbWFnZSwKKyAgICAgIC52aWV3VHlwZSA9IFZLX0lNQUdFX1ZJRVdfVFlQRV8yRCwKKyAgICAgIC5mb3JtYXQgPSB1c2VFeHRlcm5hbEZvcm1hdCA/IFZLX0ZPUk1BVF9VTkRFRklORUQgOiBmb3JtYXRJbmZvLmZvcm1hdCwKKyAgICAgIC5jb21wb25lbnRzID0KKyAgICAgICAgICB7CisgICAgICAgICAgICAgIFZLX0NPTVBPTkVOVF9TV0laWkxFX0lERU5USVRZLCBWS19DT01QT05FTlRfU1dJWlpMRV9JREVOVElUWSwKKyAgICAgICAgICAgICAgVktfQ09NUE9ORU5UX1NXSVpaTEVfSURFTlRJVFksIFZLX0NPTVBPTkVOVF9TV0laWkxFX0lERU5USVRZLAorICAgICAgICAgIH0sCisgICAgICAuc3VicmVzb3VyY2VSYW5nZSA9IHtWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklULCAwLCAxLCAwLCAxfSwKKyAgICAgIC5mbGFncyA9IDAsCisgIH07CisgIFZLX0NBTEwodmtDcmVhdGVJbWFnZVZpZXcobUluaXQtPmRldmljZSgpLCAmdmlld0NyZWF0ZUluZm8sIG51bGxwdHIsICZtVmlldykpOworCisgIC8vIENyZWF0ZSBzZW1hcGhvcmUgaWYgbmVjZXNzYXJ5LgorICBpZiAoc3luY0ZkICE9IC0xKSB7CisgICAgVmtTZW1hcGhvcmVDcmVhdGVJbmZvIHNlbWFwaG9yZUNyZWF0ZUluZm97CisgICAgICAgIC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NFTUFQSE9SRV9DUkVBVEVfSU5GTywKKyAgICAgICAgLnBOZXh0ID0gbnVsbHB0ciwKKyAgICAgICAgLmZsYWdzID0gMCwKKyAgICB9OworICAgIFZLX0NBTEwodmtDcmVhdGVTZW1hcGhvcmUobUluaXQtPmRldmljZSgpLCAmc2VtYXBob3JlQ3JlYXRlSW5mbywgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtU2VtYXBob3JlKSk7CisKKyAgICAvLyBJbXBvcnQgdGhlIGZkIGludG8gYSBzZW1hcGhvcmUuCisgICAgVmtJbXBvcnRTZW1hcGhvcmVGZEluZm9LSFIgaW1wb3J0U2VtYXBob3JlSW5mb3sKKyAgICAgICAgLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfSU1QT1JUX1NFTUFQSE9SRV9GRF9JTkZPX0tIUiwKKyAgICAgICAgLnBOZXh0ID0gbnVsbHB0ciwKKyAgICAgICAgLnNlbWFwaG9yZSA9IG1TZW1hcGhvcmUsCisgICAgICAgIC5mbGFncyA9IFZLX1NFTUFQSE9SRV9JTVBPUlRfVEVNUE9SQVJZX0JJVCwKKyAgICAgICAgLmhhbmRsZVR5cGUgPSBWS19FWFRFUk5BTF9TRU1BUEhPUkVfSEFORExFX1RZUEVfU1lOQ19GRF9CSVQsCisgICAgICAgIC5mZCA9IHN5bmNGZCwKKyAgICB9OworCisgICAgUEZOX3ZrSW1wb3J0U2VtYXBob3JlRmRLSFIgaW1wb3J0U2VtYXBob3JlRmQgPQorICAgICAgICAoUEZOX3ZrSW1wb3J0U2VtYXBob3JlRmRLSFIpdmtHZXREZXZpY2VQcm9jQWRkcigKKyAgICAgICAgICAgIG1Jbml0LT5kZXZpY2UoKSwgInZrSW1wb3J0U2VtYXBob3JlRmRLSFIiKTsKKyAgICBBU1NFUlQoaW1wb3J0U2VtYXBob3JlRmQpOworICAgIFZLX0NBTEwoaW1wb3J0U2VtYXBob3JlRmQobUluaXQtPmRldmljZSgpLCAmaW1wb3J0U2VtYXBob3JlSW5mbykpOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK1ZrQUhhcmR3YXJlQnVmZmVySW1hZ2U6On5Wa0FIYXJkd2FyZUJ1ZmZlckltYWdlKCkgeworICBpZiAobVZpZXcgIT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICB2a0Rlc3Ryb3lJbWFnZVZpZXcobUluaXQtPmRldmljZSgpLCBtVmlldywgbnVsbHB0cik7CisgICAgbVZpZXcgPSBWS19OVUxMX0hBTkRMRTsKKyAgfQorICBpZiAobVNhbXBsZXIgIT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICB2a0Rlc3Ryb3lTYW1wbGVyKG1Jbml0LT5kZXZpY2UoKSwgbVNhbXBsZXIsIG51bGxwdHIpOworICAgIG1TYW1wbGVyID0gVktfTlVMTF9IQU5ETEU7CisgIH0KKyAgaWYgKG1Db252ZXJzaW9uICE9IFZLX05VTExfSEFORExFKSB7CisgICAgUEZOX3ZrRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIgZGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb24gPQorICAgICAgICAoUEZOX3ZrRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIpdmtHZXREZXZpY2VQcm9jQWRkcigKKyAgICAgICAgICAgIG1Jbml0LT5kZXZpY2UoKSwgInZrRGVzdHJveVNhbXBsZXJZY2JjckNvbnZlcnNpb25LSFIiKTsKKyAgICBkZXN0cm95U2FtcGxlclljYmNyQ29udmVyc2lvbihtSW5pdC0+ZGV2aWNlKCksIG1Db252ZXJzaW9uLCBudWxscHRyKTsKKyAgfQorICBpZiAobU1lbW9yeSAhPSBWS19OVUxMX0hBTkRMRSkgeworICAgIHZrRnJlZU1lbW9yeShtSW5pdC0+ZGV2aWNlKCksIG1NZW1vcnksIG51bGxwdHIpOworICAgIG1NZW1vcnkgPSBWS19OVUxMX0hBTkRMRTsKKyAgfQorICBpZiAobUltYWdlICE9IFZLX05VTExfSEFORExFKSB7CisgICAgdmtEZXN0cm95SW1hZ2UobUluaXQtPmRldmljZSgpLCBtSW1hZ2UsIG51bGxwdHIpOworICAgIG1JbWFnZSA9IFZLX05VTExfSEFORExFOworICB9CisgIGlmIChtU2VtYXBob3JlICE9IFZLX05VTExfSEFORExFKSB7CisgICAgdmtEZXN0cm95U2VtYXBob3JlKG1Jbml0LT5kZXZpY2UoKSwgbVNlbWFwaG9yZSwgbnVsbHB0cik7CisgICAgbVNlbWFwaG9yZSA9IFZLX05VTExfSEFORExFOworICB9Cit9CisKK1ZrSW1hZ2VSZW5kZXJlcjo6VmtJbWFnZVJlbmRlcmVyKFZrSW5pdCAqaW5pdCwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRm9ybWF0IGZvcm1hdCwgdWludDMyX3QgYnl0ZXNQZXJQaXhlbCkKKyAgICA6IG1Jbml0KGluaXQpLCBtV2lkdGgod2lkdGgpLCBtSGVpZ2h0KGhlaWdodCksIG1Gb3JtYXQoZm9ybWF0KSwKKyAgICAgIG1SZXN1bHRCdWZmZXJTaXplKHdpZHRoICogaGVpZ2h0ICogYnl0ZXNQZXJQaXhlbCkge30KKworYm9vbCBWa0ltYWdlUmVuZGVyZXI6OmluaXQoSk5JRW52ICplbnYsIGpvYmplY3QgYXNzZXRNZ3IpIHsKKyAgLy8gQ3JlYXRlIGFuIGltYWdlIHRvIGJhY2sgb3VyIGZyYW1lYnVmZmVyLgorICB7CisgICAgY29uc3QgVmtJbWFnZVVzYWdlRmxhZ3MgaW1hZ2VVc2FnZSA9IFZLX0lNQUdFX1VTQUdFX0NPTE9SX0FUVEFDSE1FTlRfQklUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfSU1BR0VfVVNBR0VfVFJBTlNGRVJfU1JDX0JJVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0lNQUdFX1VTQUdFX1RSQU5TRkVSX0RTVF9CSVQ7CisgICAgY29uc3QgVmtJbWFnZUNyZWF0ZUluZm8gaW1hZ2VDcmVhdGVJbmZveworICAgICAgICAuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9DUkVBVEVfSU5GTywKKyAgICAgICAgLnBOZXh0ID0gbnVsbHB0ciwKKyAgICAgICAgLmZsYWdzID0gMHUsCisgICAgICAgIC5pbWFnZVR5cGUgPSBWS19JTUFHRV9UWVBFXzJELAorICAgICAgICAuZm9ybWF0ID0gbUZvcm1hdCwKKyAgICAgICAgLmV4dGVudCA9IHttV2lkdGgsIG1IZWlnaHQsIDF1fSwKKyAgICAgICAgLm1pcExldmVscyA9IDF1LAorICAgICAgICAuYXJyYXlMYXllcnMgPSAxdSwKKyAgICAgICAgLnNhbXBsZXMgPSBWS19TQU1QTEVfQ09VTlRfMV9CSVQsCisgICAgICAgIC50aWxpbmcgPSBWS19JTUFHRV9USUxJTkdfT1BUSU1BTCwKKyAgICAgICAgLnVzYWdlID0gaW1hZ2VVc2FnZSwKKyAgICAgICAgLnNoYXJpbmdNb2RlID0gVktfU0hBUklOR19NT0RFX0VYQ0xVU0lWRSwKKyAgICAgICAgLnF1ZXVlRmFtaWx5SW5kZXhDb3VudCA9IDB1LAorICAgICAgICAucFF1ZXVlRmFtaWx5SW5kaWNlcyA9IG51bGxwdHIsCisgICAgICAgIC5pbml0aWFsTGF5b3V0ID0gVktfSU1BR0VfTEFZT1VUX1VOREVGSU5FRCwKKyAgICB9OworICAgIFZLX0NBTEwoCisgICAgICAgIHZrQ3JlYXRlSW1hZ2UobUluaXQtPmRldmljZSgpLCAmaW1hZ2VDcmVhdGVJbmZvLCBudWxscHRyLCAmbURlc3RJbWFnZSkpOworCisgICAgLy8gR2V0IG1lbW9yeSByZXF1aXJlbWVudHMgZm9yIGltYWdlIGFuZCBhbGxvY2F0ZSBtZW1vcnkgYmFja2luZy4KKyAgICBWa01lbW9yeVJlcXVpcmVtZW50cyBtZW1vcnlSZXF1aXJlbWVudHM7CisgICAgdmtHZXRJbWFnZU1lbW9yeVJlcXVpcmVtZW50cyhtSW5pdC0+ZGV2aWNlKCksIG1EZXN0SW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVtb3J5UmVxdWlyZW1lbnRzKTsKKworICAgIFZrTWVtb3J5QWxsb2NhdGVJbmZvIG1lbW9yeUFsbG9jYXRlSW5mb3sKKyAgICAgICAgLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfTUVNT1JZX0FMTE9DQVRFX0lORk8sCisgICAgICAgIC5wTmV4dCA9IG51bGxwdHIsCisgICAgICAgIC5hbGxvY2F0aW9uU2l6ZSA9IG1lbW9yeVJlcXVpcmVtZW50cy5zaXplLAorICAgICAgICAubWVtb3J5VHlwZUluZGV4ID0KKyAgICAgICAgICAgIG1Jbml0LT5maW5kTWVtb3J5VHlwZShtZW1vcnlSZXF1aXJlbWVudHMubWVtb3J5VHlwZUJpdHMsIDB1KSwKKyAgICB9OworICAgIFZLX0NBTEwodmtBbGxvY2F0ZU1lbW9yeShtSW5pdC0+ZGV2aWNlKCksICZtZW1vcnlBbGxvY2F0ZUluZm8sIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtRGVzdEltYWdlTWVtb3J5KSk7CisgICAgVktfQ0FMTCgKKyAgICAgICAgdmtCaW5kSW1hZ2VNZW1vcnkobUluaXQtPmRldmljZSgpLCBtRGVzdEltYWdlLCBtRGVzdEltYWdlTWVtb3J5LCAwKSk7CisgIH0KKworICAvLyBDcmVhdGUgaW1hZ2Ugdmlldy4KKyAgeworICAgIFZrSW1hZ2VWaWV3Q3JlYXRlSW5mbyBpbWFnZVZpZXdDcmVhdGVJbmZveworICAgICAgICAuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9JTUFHRV9WSUVXX0NSRUFURV9JTkZPLAorICAgICAgICAucE5leHQgPSBudWxscHRyLAorICAgICAgICAuZmxhZ3MgPSAwdSwKKyAgICAgICAgLmltYWdlID0gbURlc3RJbWFnZSwKKyAgICAgICAgLnZpZXdUeXBlID0gVktfSU1BR0VfVklFV19UWVBFXzJELAorICAgICAgICAuZm9ybWF0ID0gbUZvcm1hdCwKKyAgICAgICAgLmNvbXBvbmVudHMgPSB7VktfQ09NUE9ORU5UX1NXSVpaTEVfSURFTlRJVFksCisgICAgICAgICAgICAgICAgICAgICAgIFZLX0NPTVBPTkVOVF9TV0laWkxFX0lERU5USVRZLAorICAgICAgICAgICAgICAgICAgICAgICBWS19DT01QT05FTlRfU1dJWlpMRV9JREVOVElUWSwKKyAgICAgICAgICAgICAgICAgICAgICAgVktfQ09NUE9ORU5UX1NXSVpaTEVfSURFTlRJVFl9LAorICAgICAgICAuc3VicmVzb3VyY2VSYW5nZSA9IHtWS19JTUFHRV9BU1BFQ1RfQ09MT1JfQklULCAwdSwgMXUsIDB1LCAxdX0sCisgICAgfTsKKyAgICBWS19DQUxMKHZrQ3JlYXRlSW1hZ2VWaWV3KG1Jbml0LT5kZXZpY2UoKSwgJmltYWdlVmlld0NyZWF0ZUluZm8sIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbURlc3RJbWFnZVZpZXcpKTsKKyAgfQorCisgIC8vIENyZWF0ZSByZW5kZXIgcGFzcworICB7CisgICAgVmtBdHRhY2htZW50RGVzY3JpcHRpb24gYXR0YWNobWVudERlc2N7CisgICAgICAgIC5mbGFncyA9IDB1LAorICAgICAgICAuZm9ybWF0ID0gbUZvcm1hdCwKKyAgICAgICAgLnNhbXBsZXMgPSBWS19TQU1QTEVfQ09VTlRfMV9CSVQsCisgICAgICAgIC5sb2FkT3AgPSBWS19BVFRBQ0hNRU5UX0xPQURfT1BfQ0xFQVIsCisgICAgICAgIC5zdG9yZU9wID0gVktfQVRUQUNITUVOVF9TVE9SRV9PUF9TVE9SRSwKKyAgICAgICAgLnN0ZW5jaWxMb2FkT3AgPSBWS19BVFRBQ0hNRU5UX0xPQURfT1BfRE9OVF9DQVJFLAorICAgICAgICAuc3RlbmNpbFN0b3JlT3AgPSBWS19BVFRBQ0hNRU5UX1NUT1JFX09QX0RPTlRfQ0FSRSwKKyAgICAgICAgLmluaXRpYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfQ09MT1JfQVRUQUNITUVOVF9PUFRJTUFMLAorICAgICAgICAuZmluYWxMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfQ09MT1JfQVRUQUNITUVOVF9PUFRJTUFMfTsKKyAgICBWa0F0dGFjaG1lbnRSZWZlcmVuY2UgYXR0YWNobWVudFJlZnsKKyAgICAgICAgLmF0dGFjaG1lbnQgPSAwdSwgLmxheW91dCA9IFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUwsCisgICAgfTsKKyAgICBWa1N1YnBhc3NEZXNjcmlwdGlvbiBzdWJwYXNzRGVzY3sKKyAgICAgICAgLmZsYWdzID0gMHUsCisgICAgICAgIC5waXBlbGluZUJpbmRQb2ludCA9IFZLX1BJUEVMSU5FX0JJTkRfUE9JTlRfR1JBUEhJQ1MsCisgICAgICAgIC5pbnB1dEF0dGFjaG1lbnRDb3VudCA9IDB1LAorICAgICAgICAucElucHV0QXR0YWNobWVudHMgPSBudWxscHRyLAorICAgICAgICAuY29sb3JBdHRhY2htZW50Q291bnQgPSAxdSwKKyAgICAgICAgLnBDb2xvckF0dGFjaG1lbnRzID0gJmF0dGFjaG1lbnRSZWYsCisgICAgICAgIC5wUmVzb2x2ZUF0dGFjaG1lbnRzID0gbnVsbHB0ciwKKyAgICAgICAgLnBEZXB0aFN0ZW5jaWxBdHRhY2htZW50ID0gbnVsbHB0ciwKKyAgICAgICAgLnByZXNlcnZlQXR0YWNobWVudENvdW50ID0gMHUsCisgICAgICAgIC5wUHJlc2VydmVBdHRhY2htZW50cyA9IG51bGxwdHIsCisgICAgfTsKKyAgICBWa1JlbmRlclBhc3NDcmVhdGVJbmZvIHJlbmRlclBhc3NDcmVhdGVJbmZveworICAgICAgICAuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9SRU5ERVJfUEFTU19DUkVBVEVfSU5GTywKKyAgICAgICAgLnBOZXh0ID0gbnVsbHB0ciwKKyAgICAgICAgLmZsYWdzID0gMHUsCisgICAgICAgIC5hdHRhY2htZW50Q291bnQgPSAxdSwKKyAgICAgICAgLnBBdHRhY2htZW50cyA9ICZhdHRhY2htZW50RGVzYywKKyAgICAgICAgLnN1YnBhc3NDb3VudCA9IDF1LAorICAgICAgICAucFN1YnBhc3NlcyA9ICZzdWJwYXNzRGVzYywKKyAgICAgICAgLmRlcGVuZGVuY3lDb3VudCA9IDB1LAorICAgICAgICAucERlcGVuZGVuY2llcyA9IG51bGxwdHIsCisgICAgfTsKKyAgICBWS19DQUxMKHZrQ3JlYXRlUmVuZGVyUGFzcyhtSW5pdC0+ZGV2aWNlKCksICZyZW5kZXJQYXNzQ3JlYXRlSW5mbywgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbVJlbmRlclBhc3MpKTsKKyAgfQorCisgIC8vIENyZWF0ZSB2ZXJ0ZXggYnVmZmVyLgorICB7CisgICAgY29uc3QgZmxvYXQgdmVydGV4RGF0YVtdID0geworICAgICAgICAtMS4wZiwgLTEuMGYsIDAuMGYsIDAuMGYsIDEuMGYsICAtMS4wZiwgMS4wZiwgMC4wZiwKKyAgICAgICAgMS4wZiwgIDEuMGYsICAxLjBmLCAxLjBmLCAtMS4wZiwgLTEuMGYsIDAuMGYsIDAuMGYsCisgICAgICAgIDEuMGYsICAxLjBmLCAgMS4wZiwgMS4wZiwgLTEuMGYsIDEuMGYsICAwLjBmLCAxLjBmLAorICAgIH07CisgICAgVmtCdWZmZXJDcmVhdGVJbmZvIGNyZWF0ZUJ1ZmZlckluZm97CisgICAgICAgIC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9DUkVBVEVfSU5GTywKKyAgICAgICAgLnBOZXh0ID0gbnVsbHB0ciwKKyAgICAgICAgLnNpemUgPSBzaXplb2YodmVydGV4RGF0YSksCisgICAgICAgIC51c2FnZSA9IFZLX0JVRkZFUl9VU0FHRV9WRVJURVhfQlVGRkVSX0JJVCwKKyAgICAgICAgLmZsYWdzID0gMCwKKyAgICAgICAgLnNoYXJpbmdNb2RlID0gVktfU0hBUklOR19NT0RFX0VYQ0xVU0lWRSwKKyAgICAgICAgLnF1ZXVlRmFtaWx5SW5kZXhDb3VudCA9IDAsCisgICAgICAgIC5wUXVldWVGYW1pbHlJbmRpY2VzID0gbnVsbHB0ciwKKyAgICB9OworICAgIFZLX0NBTEwodmtDcmVhdGVCdWZmZXIobUluaXQtPmRldmljZSgpLCAmY3JlYXRlQnVmZmVySW5mbywgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZtVmVydGV4QnVmZmVyKSk7CisKKyAgICBWa01lbW9yeVJlcXVpcmVtZW50cyBtZW1SZXE7CisgICAgdmtHZXRCdWZmZXJNZW1vcnlSZXF1aXJlbWVudHMobUluaXQtPmRldmljZSgpLCBtVmVydGV4QnVmZmVyLCAmbWVtUmVxKTsKKyAgICBWa01lbW9yeUFsbG9jYXRlSW5mbyBhbGxvY0luZm97CisgICAgICAgIC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX01FTU9SWV9BTExPQ0FURV9JTkZPLAorICAgICAgICAucE5leHQgPSBudWxscHRyLAorICAgICAgICAuYWxsb2NhdGlvblNpemUgPSBtZW1SZXEuc2l6ZSwKKyAgICAgICAgLm1lbW9yeVR5cGVJbmRleCA9IG1Jbml0LT5maW5kTWVtb3J5VHlwZSgKKyAgICAgICAgICAgIG1lbVJlcS5tZW1vcnlUeXBlQml0cywgVktfTUVNT1JZX1BST1BFUlRZX0hPU1RfQ09IRVJFTlRfQklUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX1ZJU0lCTEVfQklUKSwKKyAgICB9OworICAgIFZLX0NBTEwodmtBbGxvY2F0ZU1lbW9yeShtSW5pdC0+ZGV2aWNlKCksICZhbGxvY0luZm8sIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtVmVydGV4QnVmZmVyTWVtb3J5KSk7CisKKyAgICB2b2lkICptYXBwZWREYXRhOworICAgIFZLX0NBTEwodmtNYXBNZW1vcnkobUluaXQtPmRldmljZSgpLCBtVmVydGV4QnVmZmVyTWVtb3J5LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHZlcnRleERhdGEpLCAwLCAmbWFwcGVkRGF0YSkpOworICAgIG1lbWNweShtYXBwZWREYXRhLCB2ZXJ0ZXhEYXRhLCBzaXplb2YodmVydGV4RGF0YSkpOworICAgIHZrVW5tYXBNZW1vcnkobUluaXQtPmRldmljZSgpLCBtVmVydGV4QnVmZmVyTWVtb3J5KTsKKworICAgIFZLX0NBTEwodmtCaW5kQnVmZmVyTWVtb3J5KG1Jbml0LT5kZXZpY2UoKSwgbVZlcnRleEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmVydGV4QnVmZmVyTWVtb3J5LCAwKSk7CisgIH0KKworICAvLyBDcmVhdGUgZnJhbWVidWZmZXIuCisgIHsKKyAgICBWa0ZyYW1lYnVmZmVyQ3JlYXRlSW5mbyBmcmFtZWJ1ZmZlckNyZWF0ZUluZm97CisgICAgICAgIC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0ZSQU1FQlVGRkVSX0NSRUFURV9JTkZPLAorICAgICAgICAucE5leHQgPSBudWxscHRyLAorICAgICAgICAuZmxhZ3MgPSAwdSwKKyAgICAgICAgLnJlbmRlclBhc3MgPSBtUmVuZGVyUGFzcywKKyAgICAgICAgLmF0dGFjaG1lbnRDb3VudCA9IDF1LAorICAgICAgICAucEF0dGFjaG1lbnRzID0gJm1EZXN0SW1hZ2VWaWV3LAorICAgICAgICAud2lkdGggPSBtV2lkdGgsCisgICAgICAgIC5oZWlnaHQgPSBtSGVpZ2h0LAorICAgICAgICAubGF5ZXJzID0gMXUsCisgICAgfTsKKyAgICBWS19DQUxMKHZrQ3JlYXRlRnJhbWVidWZmZXIobUluaXQtPmRldmljZSgpLCAmZnJhbWVidWZmZXJDcmVhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCAmbUZyYW1lYnVmZmVyKSk7CisgIH0KKworICAvLyBDcmVhdGUgdGhlIGhvc3Qtc2lkZSBidWZmZXIgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIHJlYWQgYmFjayB0aGUgcmVzdWx0cy4KKyAgeworICAgIFZrQnVmZmVyQ3JlYXRlSW5mbyBidWZmZXJDcmVhdGVJbmZveworICAgICAgICAuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9CVUZGRVJfQ1JFQVRFX0lORk8sCisgICAgICAgIC5wTmV4dCA9IG51bGxwdHIsCisgICAgICAgIC5mbGFncyA9IDB1LAorICAgICAgICAuc2l6ZSA9IG1SZXN1bHRCdWZmZXJTaXplLAorICAgICAgICAudXNhZ2UgPSBWS19CVUZGRVJfVVNBR0VfVFJBTlNGRVJfRFNUX0JJVCwKKyAgICAgICAgLnNoYXJpbmdNb2RlID0gVktfU0hBUklOR19NT0RFX0VYQ0xVU0lWRSwKKyAgICAgICAgLnF1ZXVlRmFtaWx5SW5kZXhDb3VudCA9IDB1LAorICAgICAgICAucFF1ZXVlRmFtaWx5SW5kaWNlcyA9IG51bGxwdHIsCisgICAgfTsKKyAgICBWS19DQUxMKHZrQ3JlYXRlQnVmZmVyKG1Jbml0LT5kZXZpY2UoKSwgJmJ1ZmZlckNyZWF0ZUluZm8sIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmbVJlc3VsdEJ1ZmZlcikpOworCisgICAgVmtNZW1vcnlSZXF1aXJlbWVudHMgbWVtUmVxOworICAgIHZrR2V0QnVmZmVyTWVtb3J5UmVxdWlyZW1lbnRzKG1Jbml0LT5kZXZpY2UoKSwgbVJlc3VsdEJ1ZmZlciwgJm1lbVJlcSk7CisgICAgVmtNZW1vcnlBbGxvY2F0ZUluZm8gYWxsb2NJbmZveworICAgICAgICAuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9NRU1PUllfQUxMT0NBVEVfSU5GTywKKyAgICAgICAgLnBOZXh0ID0gbnVsbHB0ciwKKyAgICAgICAgLmFsbG9jYXRpb25TaXplID0gbWVtUmVxLnNpemUsCisgICAgICAgIC5tZW1vcnlUeXBlSW5kZXggPSBtSW5pdC0+ZmluZE1lbW9yeVR5cGUoCisgICAgICAgICAgICBtZW1SZXEubWVtb3J5VHlwZUJpdHMsIFZLX01FTU9SWV9QUk9QRVJUWV9IT1NUX0NPSEVSRU5UX0JJVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19NRU1PUllfUFJPUEVSVFlfSE9TVF9WSVNJQkxFX0JJVCksCisgICAgfTsKKyAgICBWS19DQUxMKHZrQWxsb2NhdGVNZW1vcnkobUluaXQtPmRldmljZSgpLCAmYWxsb2NJbmZvLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbVJlc3VsdEJ1ZmZlck1lbW9yeSkpOworICAgIFZLX0NBTEwodmtCaW5kQnVmZmVyTWVtb3J5KG1Jbml0LT5kZXZpY2UoKSwgbVJlc3VsdEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVzdWx0QnVmZmVyTWVtb3J5LCAwKSk7CisgIH0KKworICAvLyBDcmVhdGUgc2hhZGVycy4KKyAgeworICAgIEFBc3NldCAqdmVydEZpbGUgPQorICAgICAgICBBQXNzZXRNYW5hZ2VyX29wZW4oQUFzc2V0TWFuYWdlcl9mcm9tSmF2YShlbnYsIGFzc2V0TWdyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXNzdGhyb3VnaF92c2guc3B2IiwgQUFTU0VUX01PREVfQlVGRkVSKTsKKyAgICBBU1NFUlQodmVydEZpbGUpOworICAgIHNpemVfdCB2ZXJ0U2hhZGVyTGVuZ3RoID0gQUFzc2V0X2dldExlbmd0aCh2ZXJ0RmlsZSk7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmVydFNoYWRlcjsKKyAgICB2ZXJ0U2hhZGVyLnJlc2l6ZSh2ZXJ0U2hhZGVyTGVuZ3RoKTsKKyAgICBBQXNzZXRfcmVhZCh2ZXJ0RmlsZSwgc3RhdGljX2Nhc3Q8dm9pZCAqPih2ZXJ0U2hhZGVyLmRhdGEoKSksCisgICAgICAgICAgICAgICAgdmVydFNoYWRlckxlbmd0aCk7CisgICAgQUFzc2V0X2Nsb3NlKHZlcnRGaWxlKTsKKworICAgIEFBc3NldCAqcGl4ZWxGaWxlID0KKyAgICAgICAgQUFzc2V0TWFuYWdlcl9vcGVuKEFBc3NldE1hbmFnZXJfZnJvbUphdmEoZW52LCBhc3NldE1nciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFzc3Rocm91Z2hfZnNoLnNwdiIsIEFBU1NFVF9NT0RFX0JVRkZFUik7CisgICAgQVNTRVJUKHBpeGVsRmlsZSk7CisgICAgc2l6ZV90IHBpeGVsU2hhZGVyTGVuZ3RoID0gQUFzc2V0X2dldExlbmd0aChwaXhlbEZpbGUpOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBpeGVsU2hhZGVyOworICAgIHBpeGVsU2hhZGVyLnJlc2l6ZShwaXhlbFNoYWRlckxlbmd0aCk7CisgICAgQUFzc2V0X3JlYWQocGl4ZWxGaWxlLCBzdGF0aWNfY2FzdDx2b2lkICo+KHBpeGVsU2hhZGVyLmRhdGEoKSksCisgICAgICAgICAgICAgICAgcGl4ZWxTaGFkZXJMZW5ndGgpOworICAgIEFBc3NldF9jbG9zZShwaXhlbEZpbGUpOworCisgICAgVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvIHZlcnRleFNoYWRlckluZm97CisgICAgICAgIC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1NIQURFUl9NT0RVTEVfQ1JFQVRFX0lORk8sCisgICAgICAgIC5wTmV4dCA9IG51bGxwdHIsCisgICAgICAgIC5mbGFncyA9IDB1LAorICAgICAgICAuY29kZVNpemUgPSB2ZXJ0U2hhZGVyTGVuZ3RoLAorICAgICAgICAucENvZGUgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMl90ICo+KHZlcnRTaGFkZXIuZGF0YSgpKSwKKyAgICB9OworICAgIFZLX0NBTEwodmtDcmVhdGVTaGFkZXJNb2R1bGUobUluaXQtPmRldmljZSgpLCAmdmVydGV4U2hhZGVySW5mbywgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtVmVydE1vZHVsZSkpOworCisgICAgVmtTaGFkZXJNb2R1bGVDcmVhdGVJbmZvIHBpeGVsU2hhZGVySW5mb3sKKyAgICAgICAgLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfU0hBREVSX01PRFVMRV9DUkVBVEVfSU5GTywKKyAgICAgICAgLnBOZXh0ID0gbnVsbHB0ciwKKyAgICAgICAgLmZsYWdzID0gMHUsCisgICAgICAgIC5jb2RlU2l6ZSA9IHBpeGVsU2hhZGVyTGVuZ3RoLAorICAgICAgICAucENvZGUgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMl90ICo+KHBpeGVsU2hhZGVyLmRhdGEoKSksCisgICAgfTsKKyAgICBWS19DQUxMKHZrQ3JlYXRlU2hhZGVyTW9kdWxlKG1Jbml0LT5kZXZpY2UoKSwgJnBpeGVsU2hhZGVySW5mbywgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtUGl4ZWxNb2R1bGUpKTsKKyAgfQorCisgIFZrUGlwZWxpbmVDYWNoZUNyZWF0ZUluZm8gcGlwZWxpbmVDYWNoZUluZm97CisgICAgICAuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DQUNIRV9DUkVBVEVfSU5GTywKKyAgICAgIC5wTmV4dCA9IG51bGxwdHIsCisgICAgICAuaW5pdGlhbERhdGFTaXplID0gMCwKKyAgICAgIC5wSW5pdGlhbERhdGEgPSBudWxscHRyLAorICAgICAgLmZsYWdzID0gMCwgLy8gcmVzZXJ2ZWQsIG11c3QgYmUgMAorICB9OworICBWS19DQUxMKHZrQ3JlYXRlUGlwZWxpbmVDYWNoZShtSW5pdC0+ZGV2aWNlKCksICZwaXBlbGluZUNhY2hlSW5mbywgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1DYWNoZSkpOworCisgIC8vIENyZWF0ZSBEZXNjcmlwdG9yIFBvb2wKKyAgeworICAgIGNvbnN0IFZrRGVzY3JpcHRvclBvb2xTaXplIHR5cGVDb3VudCA9IHsKKyAgICAgICAgLnR5cGUgPSBWS19ERVNDUklQVE9SX1RZUEVfQ09NQklORURfSU1BR0VfU0FNUExFUiwgLmRlc2NyaXB0b3JDb3VudCA9IDEsCisgICAgfTsKKyAgICBjb25zdCBWa0Rlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbyBkZXNjcmlwdG9yUG9vbENyZWF0ZUluZm97CisgICAgICAgIC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0RFU0NSSVBUT1JfUE9PTF9DUkVBVEVfSU5GTywKKyAgICAgICAgLnBOZXh0ID0gbnVsbHB0ciwKKyAgICAgICAgLm1heFNldHMgPSAxLAorICAgICAgICAucG9vbFNpemVDb3VudCA9IDEsCisgICAgICAgIC5wUG9vbFNpemVzID0gJnR5cGVDb3VudCwKKyAgICB9OworCisgICAgVktfQ0FMTCh2a0NyZWF0ZURlc2NyaXB0b3JQb29sKG1Jbml0LT5kZXZpY2UoKSwgJmRlc2NyaXB0b3JQb29sQ3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgJm1EZXNjcmlwdG9yUG9vbCkpOworICB9CisKKyAgLy8gQ3JlYXRlIGNvbW1hbmQgcG9vbC4KKyAgeworICAgIFZrQ29tbWFuZFBvb2xDcmVhdGVJbmZvIGNtZFBvb2xDcmVhdGVJbmZveworICAgICAgICAuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9DT01NQU5EX1BPT0xfQ1JFQVRFX0lORk8sCisgICAgICAgIC5wTmV4dCA9IG51bGxwdHIsCisgICAgICAgIC5mbGFncyA9IFZLX0NPTU1BTkRfUE9PTF9DUkVBVEVfUkVTRVRfQ09NTUFORF9CVUZGRVJfQklULAorICAgICAgICAucXVldWVGYW1pbHlJbmRleCA9IDAsCisgICAgfTsKKyAgICBWS19DQUxMKHZrQ3JlYXRlQ29tbWFuZFBvb2wobUluaXQtPmRldmljZSgpLCAmY21kUG9vbENyZWF0ZUluZm8sIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtQ21kUG9vbCkpOworICB9CisKKyAgLy8gQ3JlYXRlIGEgZmVuY2UKKyAgeworICAgIFZrRmVuY2VDcmVhdGVJbmZvIGZlbmNlSW5mbyA9IHsKKyAgICAgICAgLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfRkVOQ0VfQ1JFQVRFX0lORk8sCisgICAgICAgIC5wTmV4dCA9IG51bGxwdHIsCisgICAgICAgIC5mbGFncyA9IDAsCisgICAgfTsKKyAgICBWS19DQUxMKHZrQ3JlYXRlRmVuY2UobUluaXQtPmRldmljZSgpLCAmZmVuY2VJbmZvLCBudWxscHRyLCAmbUZlbmNlKSk7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworVmtJbWFnZVJlbmRlcmVyOjp+VmtJbWFnZVJlbmRlcmVyKCkgeworICBjbGVhblVwVGVtcG9yYXJpZXMoKTsKKworICBpZiAobUNtZFBvb2wgIT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICB2a0Rlc3Ryb3lDb21tYW5kUG9vbChtSW5pdC0+ZGV2aWNlKCksIG1DbWRQb29sLCBudWxscHRyKTsKKyAgICBtQ21kUG9vbCA9IFZLX05VTExfSEFORExFOworICB9CisgIGlmIChtRGVzY3JpcHRvclBvb2wgIT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICB2a0Rlc3Ryb3lEZXNjcmlwdG9yUG9vbChtSW5pdC0+ZGV2aWNlKCksIG1EZXNjcmlwdG9yUG9vbCwgbnVsbHB0cik7CisgICAgbURlc2NyaXB0b3JQb29sID0gVktfTlVMTF9IQU5ETEU7CisgIH0KKyAgaWYgKG1EZXN0SW1hZ2VWaWV3ICE9IFZLX05VTExfSEFORExFKSB7CisgICAgdmtEZXN0cm95SW1hZ2VWaWV3KG1Jbml0LT5kZXZpY2UoKSwgbURlc3RJbWFnZVZpZXcsIG51bGxwdHIpOworICAgIG1EZXN0SW1hZ2VWaWV3ID0gVktfTlVMTF9IQU5ETEU7CisgIH0KKyAgaWYgKG1EZXN0SW1hZ2UgIT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICB2a0Rlc3Ryb3lJbWFnZShtSW5pdC0+ZGV2aWNlKCksIG1EZXN0SW1hZ2UsIG51bGxwdHIpOworICAgIG1EZXN0SW1hZ2UgPSBWS19OVUxMX0hBTkRMRTsKKyAgfQorICBpZiAobURlc3RJbWFnZU1lbW9yeSAhPSBWS19OVUxMX0hBTkRMRSkgeworICAgIHZrRnJlZU1lbW9yeShtSW5pdC0+ZGV2aWNlKCksIG1EZXN0SW1hZ2VNZW1vcnksIG51bGxwdHIpOworICAgIG1EZXN0SW1hZ2VNZW1vcnkgPSBWS19OVUxMX0hBTkRMRTsKKyAgfQorICBpZiAobVJlc3VsdEJ1ZmZlciAhPSBWS19OVUxMX0hBTkRMRSkgeworICAgIHZrRGVzdHJveUJ1ZmZlcihtSW5pdC0+ZGV2aWNlKCksIG1SZXN1bHRCdWZmZXIsIG51bGxwdHIpOworICAgIG1SZXN1bHRCdWZmZXIgPSBWS19OVUxMX0hBTkRMRTsKKyAgfQorICBpZiAobVJlc3VsdEJ1ZmZlck1lbW9yeSAhPSBWS19OVUxMX0hBTkRMRSkgeworICAgIHZrRnJlZU1lbW9yeShtSW5pdC0+ZGV2aWNlKCksIG1SZXN1bHRCdWZmZXJNZW1vcnksIG51bGxwdHIpOworICAgIG1SZXN1bHRCdWZmZXJNZW1vcnkgPSBWS19OVUxMX0hBTkRMRTsKKyAgfQorICBpZiAobVJlbmRlclBhc3MgIT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICB2a0Rlc3Ryb3lSZW5kZXJQYXNzKG1Jbml0LT5kZXZpY2UoKSwgbVJlbmRlclBhc3MsIG51bGxwdHIpOworICAgIG1SZW5kZXJQYXNzID0gVktfTlVMTF9IQU5ETEU7CisgIH0KKyAgaWYgKG1WZXJ0ZXhCdWZmZXIgIT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICB2a0Rlc3Ryb3lCdWZmZXIobUluaXQtPmRldmljZSgpLCBtVmVydGV4QnVmZmVyLCBudWxscHRyKTsKKyAgICBtVmVydGV4QnVmZmVyID0gVktfTlVMTF9IQU5ETEU7CisgIH0KKyAgaWYgKG1WZXJ0ZXhCdWZmZXJNZW1vcnkgIT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICB2a0ZyZWVNZW1vcnkobUluaXQtPmRldmljZSgpLCBtVmVydGV4QnVmZmVyTWVtb3J5LCBudWxscHRyKTsKKyAgICBtVmVydGV4QnVmZmVyTWVtb3J5ID0gVktfTlVMTF9IQU5ETEU7CisgIH0KKyAgaWYgKG1GcmFtZWJ1ZmZlciAhPSBWS19OVUxMX0hBTkRMRSkgeworICAgIHZrRGVzdHJveUZyYW1lYnVmZmVyKG1Jbml0LT5kZXZpY2UoKSwgbUZyYW1lYnVmZmVyLCBudWxscHRyKTsKKyAgICBtRnJhbWVidWZmZXIgPSBWS19OVUxMX0hBTkRMRTsKKyAgfQorICBpZiAobUNhY2hlICE9IFZLX05VTExfSEFORExFKSB7CisgICAgdmtEZXN0cm95UGlwZWxpbmVDYWNoZShtSW5pdC0+ZGV2aWNlKCksIG1DYWNoZSwgbnVsbHB0cik7CisgICAgbUNhY2hlID0gVktfTlVMTF9IQU5ETEU7CisgIH0KKyAgaWYgKG1WZXJ0TW9kdWxlICE9IFZLX05VTExfSEFORExFKSB7CisgICAgdmtEZXN0cm95U2hhZGVyTW9kdWxlKG1Jbml0LT5kZXZpY2UoKSwgbVZlcnRNb2R1bGUsIG51bGxwdHIpOworICAgIG1WZXJ0TW9kdWxlID0gVktfTlVMTF9IQU5ETEU7CisgIH0KKyAgaWYgKG1QaXhlbE1vZHVsZSAhPSBWS19OVUxMX0hBTkRMRSkgeworICAgIHZrRGVzdHJveVNoYWRlck1vZHVsZShtSW5pdC0+ZGV2aWNlKCksIG1QaXhlbE1vZHVsZSwgbnVsbHB0cik7CisgICAgbVBpeGVsTW9kdWxlID0gVktfTlVMTF9IQU5ETEU7CisgIH0KKyAgaWYgKG1GZW5jZSAhPSBWS19OVUxMX0hBTkRMRSkgeworICAgIHZrRGVzdHJveUZlbmNlKG1Jbml0LT5kZXZpY2UoKSwgbUZlbmNlLCBudWxscHRyKTsKKyAgICBtRmVuY2UgPSBWS19OVUxMX0hBTkRMRTsKKyAgfQorfQorCitib29sIFZrSW1hZ2VSZW5kZXJlcjo6cmVuZGVySW1hZ2VBbmRSZWFkYmFjayhWa0ltYWdlIGltYWdlLCBWa1NhbXBsZXIgc2FtcGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZrSW1hZ2VWaWV3IHZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa1NlbWFwaG9yZSBzZW1hcGhvcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVzZUV4dGVybmFsRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+ICpkYXRhKSB7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHVuY29udmVydGVkRGF0YTsKKyAgQVNTRVJUKHJlbmRlckltYWdlQW5kUmVhZGJhY2soaW1hZ2UsIHNhbXBsZXIsIHZpZXcsIHNlbWFwaG9yZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlRXh0ZXJuYWxGb3JtYXQsICZ1bmNvbnZlcnRlZERhdGEpKTsKKyAgaWYgKCh1bmNvbnZlcnRlZERhdGEuc2l6ZSgpICUgc2l6ZW9mKHVpbnQzMl90KSkgIT0gMCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgY29uc3QgdWludDMyX3QgKmRhdGFQdHIgPQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzJfdCAqPih1bmNvbnZlcnRlZERhdGEuZGF0YSgpKTsKKyAgKmRhdGEgPSBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4oZGF0YVB0ciwgZGF0YVB0ciArIHVuY29udmVydGVkRGF0YS5zaXplKCkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih1aW50MzJfdCkpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBWa0ltYWdlUmVuZGVyZXI6OnJlbmRlckltYWdlQW5kUmVhZGJhY2soVmtJbWFnZSBpbWFnZSwgVmtTYW1wbGVyIHNhbXBsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0ltYWdlVmlldyB2aWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtTZW1hcGhvcmUgc2VtYXBob3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VJbW11dGFibGVTYW1wbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gKmRhdGEpIHsKKyAgY2xlYW5VcFRlbXBvcmFyaWVzKCk7CisKKyAgLy8gQ3JlYXRlIGdyYXBoaWNzIHBpcGVsaW5lLgorICB7CisgICAgVmtEZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZyBkZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZ3sKKyAgICAgICAgLmJpbmRpbmcgPSAwLAorICAgICAgICAuZGVzY3JpcHRvclR5cGUgPSBWS19ERVNDUklQVE9SX1RZUEVfQ09NQklORURfSU1BR0VfU0FNUExFUiwKKyAgICAgICAgLmRlc2NyaXB0b3JDb3VudCA9IDF1LAorICAgICAgICAuc3RhZ2VGbGFncyA9IFZLX1NIQURFUl9TVEFHRV9GUkFHTUVOVF9CSVQsCisgICAgICAgIC5wSW1tdXRhYmxlU2FtcGxlcnMgPSB1c2VJbW11dGFibGVTYW1wbGVyID8gJnNhbXBsZXIgOiBudWxscHRyLAorICAgIH07CisgICAgY29uc3QgVmtEZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyBkZXNjcmlwdG9yU2V0TGF5b3V0Q3JlYXRlSW5mbyA9IHsKKyAgICAgICAgLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9TRVRfTEFZT1VUX0NSRUFURV9JTkZPLAorICAgICAgICAucE5leHQgPSBudWxscHRyLAorICAgICAgICAuYmluZGluZ0NvdW50ID0gMSwKKyAgICAgICAgLnBCaW5kaW5ncyA9ICZkZXNjcmlwdG9yU2V0TGF5b3V0QmluZGluZywKKyAgICB9OworICAgIFZLX0NBTEwodmtDcmVhdGVEZXNjcmlwdG9yU2V0TGF5b3V0KG1Jbml0LT5kZXZpY2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzY3JpcHRvclNldExheW91dENyZWF0ZUluZm8sIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1EZXNjcmlwdG9yTGF5b3V0KSk7CisKKyAgICBWa1BpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mbyBwaXBlbGluZUxheW91dENyZWF0ZUluZm97CisgICAgICAgIC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0xBWU9VVF9DUkVBVEVfSU5GTywKKyAgICAgICAgLnBOZXh0ID0gbnVsbHB0ciwKKyAgICAgICAgLnNldExheW91dENvdW50ID0gMSwKKyAgICAgICAgLnBTZXRMYXlvdXRzID0gJm1EZXNjcmlwdG9yTGF5b3V0LAorICAgICAgICAucHVzaENvbnN0YW50UmFuZ2VDb3VudCA9IDAsCisgICAgICAgIC5wUHVzaENvbnN0YW50UmFuZ2VzID0gbnVsbHB0ciwKKyAgICB9OworCisgICAgVktfQ0FMTCh2a0NyZWF0ZVBpcGVsaW5lTGF5b3V0KG1Jbml0LT5kZXZpY2UoKSwgJnBpcGVsaW5lTGF5b3V0Q3JlYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgJm1MYXlvdXQpKTsKKworICAgIFZrUGlwZWxpbmVTaGFkZXJTdGFnZUNyZWF0ZUluZm8gc2hhZGVyU3RhZ2VQYXJhbXNbMl0gPSB7CisgICAgICAgIHsKKyAgICAgICAgICAgIC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1NIQURFUl9TVEFHRV9DUkVBVEVfSU5GTywKKyAgICAgICAgICAgIC5wTmV4dCA9IG51bGxwdHIsCisgICAgICAgICAgICAuZmxhZ3MgPSAwLAorICAgICAgICAgICAgLnN0YWdlID0gVktfU0hBREVSX1NUQUdFX1ZFUlRFWF9CSVQsCisgICAgICAgICAgICAubW9kdWxlID0gbVZlcnRNb2R1bGUsCisgICAgICAgICAgICAucE5hbWUgPSAibWFpbiIsCisgICAgICAgICAgICAucFNwZWNpYWxpemF0aW9uSW5mbyA9IG51bGxwdHIsCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1NIQURFUl9TVEFHRV9DUkVBVEVfSU5GTywKKyAgICAgICAgICAgIC5wTmV4dCA9IG51bGxwdHIsCisgICAgICAgICAgICAuZmxhZ3MgPSAwLAorICAgICAgICAgICAgLnN0YWdlID0gVktfU0hBREVSX1NUQUdFX0ZSQUdNRU5UX0JJVCwKKyAgICAgICAgICAgIC5tb2R1bGUgPSBtUGl4ZWxNb2R1bGUsCisgICAgICAgICAgICAucE5hbWUgPSAibWFpbiIsCisgICAgICAgICAgICAucFNwZWNpYWxpemF0aW9uSW5mbyA9IG51bGxwdHIsCisgICAgICAgIH19OworCisgICAgVmtWaWV3cG9ydCB2aWV3cG9ydHN7CisgICAgICAgIC5taW5EZXB0aCA9IDAuMGYsCisgICAgICAgIC5tYXhEZXB0aCA9IDEuMGYsCisgICAgICAgIC54ID0gMCwKKyAgICAgICAgLnkgPSAwLAorICAgICAgICAud2lkdGggPSBzdGF0aWNfY2FzdDxmbG9hdD4obVdpZHRoKSwKKyAgICAgICAgLmhlaWdodCA9IHN0YXRpY19jYXN0PGZsb2F0PihtSGVpZ2h0KSwKKyAgICB9OworCisgICAgVmtSZWN0MkQgc2Npc3NvciA9IHsuZXh0ZW50ID0ge21XaWR0aCwgbUhlaWdodH0sIC5vZmZzZXQgPSB7MCwgMH19OworICAgIFZrUGlwZWxpbmVWaWV3cG9ydFN0YXRlQ3JlYXRlSW5mbyB2aWV3cG9ydEluZm97CisgICAgICAgIC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX1ZJRVdQT1JUX1NUQVRFX0NSRUFURV9JTkZPLAorICAgICAgICAucE5leHQgPSBudWxscHRyLAorICAgICAgICAudmlld3BvcnRDb3VudCA9IDEsCisgICAgICAgIC5wVmlld3BvcnRzID0gJnZpZXdwb3J0cywKKyAgICAgICAgLnNjaXNzb3JDb3VudCA9IDEsCisgICAgICAgIC5wU2Npc3NvcnMgPSAmc2Npc3NvciwKKyAgICB9OworCisgICAgVmtTYW1wbGVNYXNrIHNhbXBsZU1hc2sgPSB+MHU7CisgICAgVmtQaXBlbGluZU11bHRpc2FtcGxlU3RhdGVDcmVhdGVJbmZvIG11bHRpc2FtcGxlSW5mb3sKKyAgICAgICAgLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfTVVMVElTQU1QTEVfU1RBVEVfQ1JFQVRFX0lORk8sCisgICAgICAgIC5wTmV4dCA9IG51bGxwdHIsCisgICAgICAgIC5yYXN0ZXJpemF0aW9uU2FtcGxlcyA9IFZLX1NBTVBMRV9DT1VOVF8xX0JJVCwKKyAgICAgICAgLnNhbXBsZVNoYWRpbmdFbmFibGUgPSBWS19GQUxTRSwKKyAgICAgICAgLm1pblNhbXBsZVNoYWRpbmcgPSAwLAorICAgICAgICAucFNhbXBsZU1hc2sgPSAmc2FtcGxlTWFzaywKKyAgICAgICAgLmFscGhhVG9Db3ZlcmFnZUVuYWJsZSA9IFZLX0ZBTFNFLAorICAgICAgICAuYWxwaGFUb09uZUVuYWJsZSA9IFZLX0ZBTFNFLAorICAgIH07CisgICAgVmtQaXBlbGluZUNvbG9yQmxlbmRBdHRhY2htZW50U3RhdGUgYXR0YWNobWVudFN0YXRlc3sKKyAgICAgICAgLmNvbG9yV3JpdGVNYXNrID0gVktfQ09MT1JfQ09NUE9ORU5UX1JfQklUIHwgVktfQ09MT1JfQ09NUE9ORU5UX0dfQklUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVktfQ09MT1JfQ09NUE9ORU5UX0JfQklUIHwgVktfQ09MT1JfQ09NUE9ORU5UX0FfQklULAorICAgICAgICAuYmxlbmRFbmFibGUgPSBWS19GQUxTRSwKKyAgICB9OworICAgIFZrUGlwZWxpbmVDb2xvckJsZW5kU3RhdGVDcmVhdGVJbmZvIGNvbG9yQmxlbmRJbmZveworICAgICAgICAuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9DT0xPUl9CTEVORF9TVEFURV9DUkVBVEVfSU5GTywKKyAgICAgICAgLnBOZXh0ID0gbnVsbHB0ciwKKyAgICAgICAgLmxvZ2ljT3BFbmFibGUgPSBWS19GQUxTRSwKKyAgICAgICAgLmxvZ2ljT3AgPSBWS19MT0dJQ19PUF9DT1BZLAorICAgICAgICAuYXR0YWNobWVudENvdW50ID0gMSwKKyAgICAgICAgLnBBdHRhY2htZW50cyA9ICZhdHRhY2htZW50U3RhdGVzLAorICAgICAgICAuZmxhZ3MgPSAwLAorICAgIH07CisgICAgVmtQaXBlbGluZVJhc3Rlcml6YXRpb25TdGF0ZUNyZWF0ZUluZm8gcmFzdGVySW5mb3sKKyAgICAgICAgLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfUElQRUxJTkVfUkFTVEVSSVpBVElPTl9TVEFURV9DUkVBVEVfSU5GTywKKyAgICAgICAgLnBOZXh0ID0gbnVsbHB0ciwKKyAgICAgICAgLmRlcHRoQ2xhbXBFbmFibGUgPSBWS19GQUxTRSwKKyAgICAgICAgLnJhc3Rlcml6ZXJEaXNjYXJkRW5hYmxlID0gVktfRkFMU0UsCisgICAgICAgIC5wb2x5Z29uTW9kZSA9IFZLX1BPTFlHT05fTU9ERV9GSUxMLAorICAgICAgICAuY3VsbE1vZGUgPSBWS19DVUxMX01PREVfTk9ORSwKKyAgICAgICAgLmZyb250RmFjZSA9IFZLX0ZST05UX0ZBQ0VfQ0xPQ0tXSVNFLAorICAgICAgICAuZGVwdGhCaWFzRW5hYmxlID0gVktfRkFMU0UsCisgICAgICAgIC5saW5lV2lkdGggPSAxLAorICAgIH07CisgICAgVmtQaXBlbGluZUlucHV0QXNzZW1ibHlTdGF0ZUNyZWF0ZUluZm8gaW5wdXRBc3NlbWJseUluZm97CisgICAgICAgIC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1BJUEVMSU5FX0lOUFVUX0FTU0VNQkxZX1NUQVRFX0NSRUFURV9JTkZPLAorICAgICAgICAucE5leHQgPSBudWxscHRyLAorICAgICAgICAudG9wb2xvZ3kgPSBWS19QUklNSVRJVkVfVE9QT0xPR1lfVFJJQU5HTEVfTElTVCwKKyAgICAgICAgLnByaW1pdGl2ZVJlc3RhcnRFbmFibGUgPSBWS19GQUxTRSwKKyAgICB9OworCisgICAgLy8gU3BlY2lmeSB2ZXJ0ZXggaW5wdXQgc3RhdGUKKyAgICBWa1ZlcnRleElucHV0QmluZGluZ0Rlc2NyaXB0aW9uIHZlcnRleElucHV0QmluZGluZ0Rlc2NyaXB0aW9ueworICAgICAgICAuYmluZGluZyA9IDB1LAorICAgICAgICAuc3RyaWRlID0gNCAqIHNpemVvZihmbG9hdCksCisgICAgICAgIC5pbnB1dFJhdGUgPSBWS19WRVJURVhfSU5QVVRfUkFURV9WRVJURVh9OworICAgIFZrVmVydGV4SW5wdXRBdHRyaWJ1dGVEZXNjcmlwdGlvbiB2ZXJ0ZXhfaW5wdXRfYXR0cmlidXRlc1syXXsKKyAgICAgICAgeworICAgICAgICAgICAgLmJpbmRpbmcgPSAwLAorICAgICAgICAgICAgLmxvY2F0aW9uID0gMCwKKyAgICAgICAgICAgIC5mb3JtYXQgPSBWS19GT1JNQVRfUjMyRzMyX1NGTE9BVCwKKyAgICAgICAgICAgIC5vZmZzZXQgPSAwLAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAuYmluZGluZyA9IDAsCisgICAgICAgICAgICAubG9jYXRpb24gPSAxLAorICAgICAgICAgICAgLmZvcm1hdCA9IFZLX0ZPUk1BVF9SMzJHMzJfU0ZMT0FULAorICAgICAgICAgICAgLm9mZnNldCA9IHNpemVvZihmbG9hdCkgKiAyLAorICAgICAgICB9fTsKKyAgICBWa1BpcGVsaW5lVmVydGV4SW5wdXRTdGF0ZUNyZWF0ZUluZm8gdmVydGV4SW5wdXRJbmZveworICAgICAgICAuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9QSVBFTElORV9WRVJURVhfSU5QVVRfU1RBVEVfQ1JFQVRFX0lORk8sCisgICAgICAgIC5wTmV4dCA9IG51bGxwdHIsCisgICAgICAgIC52ZXJ0ZXhCaW5kaW5nRGVzY3JpcHRpb25Db3VudCA9IDEsCisgICAgICAgIC5wVmVydGV4QmluZGluZ0Rlc2NyaXB0aW9ucyA9ICZ2ZXJ0ZXhJbnB1dEJpbmRpbmdEZXNjcmlwdGlvbiwKKyAgICAgICAgLnZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9uQ291bnQgPSAyLAorICAgICAgICAucFZlcnRleEF0dHJpYnV0ZURlc2NyaXB0aW9ucyA9IHZlcnRleF9pbnB1dF9hdHRyaWJ1dGVzLAorICAgIH07CisKKyAgICAvLyBDcmVhdGUgdGhlIHBpcGVsaW5lCisgICAgVmtHcmFwaGljc1BpcGVsaW5lQ3JlYXRlSW5mbyBwaXBlbGluZUNyZWF0ZUluZm97CisgICAgICAgIC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0dSQVBISUNTX1BJUEVMSU5FX0NSRUFURV9JTkZPLAorICAgICAgICAucE5leHQgPSBudWxscHRyLAorICAgICAgICAuZmxhZ3MgPSAwLAorICAgICAgICAuc3RhZ2VDb3VudCA9IDIsCisgICAgICAgIC5wU3RhZ2VzID0gc2hhZGVyU3RhZ2VQYXJhbXMsCisgICAgICAgIC5wVmVydGV4SW5wdXRTdGF0ZSA9ICZ2ZXJ0ZXhJbnB1dEluZm8sCisgICAgICAgIC5wSW5wdXRBc3NlbWJseVN0YXRlID0gJmlucHV0QXNzZW1ibHlJbmZvLAorICAgICAgICAucFRlc3NlbGxhdGlvblN0YXRlID0gbnVsbHB0ciwKKyAgICAgICAgLnBWaWV3cG9ydFN0YXRlID0gJnZpZXdwb3J0SW5mbywKKyAgICAgICAgLnBSYXN0ZXJpemF0aW9uU3RhdGUgPSAmcmFzdGVySW5mbywKKyAgICAgICAgLnBNdWx0aXNhbXBsZVN0YXRlID0gJm11bHRpc2FtcGxlSW5mbywKKyAgICAgICAgLnBEZXB0aFN0ZW5jaWxTdGF0ZSA9IG51bGxwdHIsCisgICAgICAgIC5wQ29sb3JCbGVuZFN0YXRlID0gJmNvbG9yQmxlbmRJbmZvLAorICAgICAgICAucER5bmFtaWNTdGF0ZSA9IDB1LAorICAgICAgICAubGF5b3V0ID0gbUxheW91dCwKKyAgICAgICAgLnJlbmRlclBhc3MgPSBtUmVuZGVyUGFzcywKKyAgICAgICAgLnN1YnBhc3MgPSAwLAorICAgICAgICAuYmFzZVBpcGVsaW5lSGFuZGxlID0gVktfTlVMTF9IQU5ETEUsCisgICAgICAgIC5iYXNlUGlwZWxpbmVJbmRleCA9IDAsCisgICAgfTsKKworICAgIFZLX0NBTEwodmtDcmVhdGVHcmFwaGljc1BpcGVsaW5lcygKKyAgICAgICAgbUluaXQtPmRldmljZSgpLCBtQ2FjaGUsIDEsICZwaXBlbGluZUNyZWF0ZUluZm8sIG51bGxwdHIsICZtUGlwZWxpbmUpKTsKKyAgfQorCisgIC8vIENyZWF0ZSBhIGNvbW1hbmQgYnVmZmVyLgorICB7CisgICAgVmtDb21tYW5kQnVmZmVyQWxsb2NhdGVJbmZvIGNtZEJ1ZmZlckNyZWF0ZUluZm97CisgICAgICAgIC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0FMTE9DQVRFX0lORk8sCisgICAgICAgIC5wTmV4dCA9IG51bGxwdHIsCisgICAgICAgIC5jb21tYW5kUG9vbCA9IG1DbWRQb29sLAorICAgICAgICAubGV2ZWwgPSBWS19DT01NQU5EX0JVRkZFUl9MRVZFTF9QUklNQVJZLAorICAgICAgICAuY29tbWFuZEJ1ZmZlckNvdW50ID0gMSwKKyAgICB9OworICAgIFZLX0NBTEwodmtBbGxvY2F0ZUNvbW1hbmRCdWZmZXJzKG1Jbml0LT5kZXZpY2UoKSwgJmNtZEJ1ZmZlckNyZWF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1DbWRCdWZmZXIpKTsKKyAgfQorCisgIC8vIENyZWF0ZSB0aGUgZGVzY3JpcHRvciBzZXRzLgorICB7CisgICAgVmtEZXNjcmlwdG9yU2V0QWxsb2NhdGVJbmZvIGFsbG9jSW5mb3sKKyAgICAgICAgLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfREVTQ1JJUFRPUl9TRVRfQUxMT0NBVEVfSU5GTywKKyAgICAgICAgLnBOZXh0ID0gbnVsbHB0ciwKKyAgICAgICAgLmRlc2NyaXB0b3JQb29sID0gbURlc2NyaXB0b3JQb29sLAorICAgICAgICAuZGVzY3JpcHRvclNldENvdW50ID0gMSwKKyAgICAgICAgLnBTZXRMYXlvdXRzID0gJm1EZXNjcmlwdG9yTGF5b3V0fTsKKyAgICBWS19DQUxMKAorICAgICAgICB2a0FsbG9jYXRlRGVzY3JpcHRvclNldHMobUluaXQtPmRldmljZSgpLCAmYWxsb2NJbmZvLCAmbURlc2NyaXB0b3JTZXQpKTsKKworICAgIFZrRGVzY3JpcHRvckltYWdlSW5mbyB0ZXhEZXNjeworICAgICAgICAuc2FtcGxlciA9IHNhbXBsZXIsCisgICAgICAgIC5pbWFnZVZpZXcgPSB2aWV3LAorICAgICAgICAuaW1hZ2VMYXlvdXQgPSBWS19JTUFHRV9MQVlPVVRfU0hBREVSX1JFQURfT05MWV9PUFRJTUFMLAorICAgIH07CisKKyAgICBWa1dyaXRlRGVzY3JpcHRvclNldCB3cml0ZURzdHsKKyAgICAgICAgLnNUeXBlID0gVktfU1RSVUNUVVJFX1RZUEVfV1JJVEVfREVTQ1JJUFRPUl9TRVQsCisgICAgICAgIC5wTmV4dCA9IG51bGxwdHIsCisgICAgICAgIC5kc3RTZXQgPSBtRGVzY3JpcHRvclNldCwKKyAgICAgICAgLmRzdEJpbmRpbmcgPSAwLAorICAgICAgICAuZHN0QXJyYXlFbGVtZW50ID0gMCwKKyAgICAgICAgLmRlc2NyaXB0b3JDb3VudCA9IDEsCisgICAgICAgIC5kZXNjcmlwdG9yVHlwZSA9IFZLX0RFU0NSSVBUT1JfVFlQRV9DT01CSU5FRF9JTUFHRV9TQU1QTEVSLAorICAgICAgICAucEltYWdlSW5mbyA9ICZ0ZXhEZXNjLAorICAgICAgICAucEJ1ZmZlckluZm8gPSBudWxscHRyLAorICAgICAgICAucFRleGVsQnVmZmVyVmlldyA9IG51bGxwdHJ9OworICAgIHZrVXBkYXRlRGVzY3JpcHRvclNldHMobUluaXQtPmRldmljZSgpLCAxLCAmd3JpdGVEc3QsIDAsIG51bGxwdHIpOworICB9CisKKyAgLy8gQmVnaW4gQ29tbWFuZCBCdWZmZXIKKyAgeworICAgIFZrQ29tbWFuZEJ1ZmZlckJlZ2luSW5mbyBjbWRCdWZmZXJCZWdpbkluZm97CisgICAgICAgIC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0NPTU1BTkRfQlVGRkVSX0JFR0lOX0lORk8sCisgICAgICAgIC5wTmV4dCA9IG51bGxwdHIsCisgICAgICAgIC5mbGFncyA9IDB1LAorICAgICAgICAucEluaGVyaXRhbmNlSW5mbyA9IG51bGxwdHIsCisgICAgfTsKKworICAgIFZLX0NBTEwodmtCZWdpbkNvbW1hbmRCdWZmZXIobUNtZEJ1ZmZlciwgJmNtZEJ1ZmZlckJlZ2luSW5mbykpOworICB9CisKKyAgLy8gVHJhbnNpdGlvbiB0aGUgcHJvdmlkZWQgcmVzb3VyY2Ugc28gd2UgY2FuIHNhbXBsZSBmcm9tIGl0LgorICBhZGRJbWFnZVRyYW5zaXRpb25CYXJyaWVyKAorICAgICAgbUNtZEJ1ZmZlciwgaW1hZ2UsIFZLX1BJUEVMSU5FX1NUQUdFX1RPUF9PRl9QSVBFX0JJVCwKKyAgICAgIFZLX1BJUEVMSU5FX1NUQUdFX0ZSQUdNRU5UX1NIQURFUl9CSVQsIDAsIFZLX0FDQ0VTU19TSEFERVJfUkVBRF9CSVQsCisgICAgICBWS19JTUFHRV9MQVlPVVRfVU5ERUZJTkVELCBWS19JTUFHRV9MQVlPVVRfU0hBREVSX1JFQURfT05MWV9PUFRJTUFMLAorICAgICAgVktfUVVFVUVfRkFNSUxZX0VYVEVSTkFMX0tIUiwgbUluaXQtPnF1ZXVlRmFtaWx5SW5kZXgoKSk7CisKKyAgLy8gVHJhbnNpdGlvbiB0aGUgZGVzdGluYXRpb24gdGV4dHVyZSBmb3IgdXNlIGFzIGEgZnJhbWVidWZmZXIuCisgIGFkZEltYWdlVHJhbnNpdGlvbkJhcnJpZXIoCisgICAgICBtQ21kQnVmZmVyLCBtRGVzdEltYWdlLCBWS19QSVBFTElORV9TVEFHRV9UT1BfT0ZfUElQRV9CSVQsCisgICAgICBWS19QSVBFTElORV9TVEFHRV9DT0xPUl9BVFRBQ0hNRU5UX09VVFBVVF9CSVQsIDAsCisgICAgICBWS19BQ0NFU1NfQ09MT1JfQVRUQUNITUVOVF9XUklURV9CSVQsIFZLX0lNQUdFX0xBWU9VVF9VTkRFRklORUQsCisgICAgICBWS19JTUFHRV9MQVlPVVRfQ09MT1JfQVRUQUNITUVOVF9PUFRJTUFMKTsKKworICAvLyBCZWdpbiBSZW5kZXIgUGFzcyB0byBkcmF3IHRoZSBzb3VyY2UgcmVzb3VyY2UgdG8gdGhlIGZyYW1lYnVmZmVyLgorICB7CisgICAgY29uc3QgVmtDbGVhclZhbHVlIGNsZWFyVmFsdWV7CisgICAgICAgIC5jb2xvciA9CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLmZsb2F0MzIgPSB7MC4wZiwgMC4wZiwgMC4wZiwgMC4wZn0sCisgICAgICAgICAgICB9LAorICAgIH07CisgICAgVmtSZW5kZXJQYXNzQmVnaW5JbmZvIHJlbmRlclBhc3NCZWdpbkluZm97CisgICAgICAgIC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX1JFTkRFUl9QQVNTX0JFR0lOX0lORk8sCisgICAgICAgIC5wTmV4dCA9IG51bGxwdHIsCisgICAgICAgIC5yZW5kZXJQYXNzID0gbVJlbmRlclBhc3MsCisgICAgICAgIC5mcmFtZWJ1ZmZlciA9IG1GcmFtZWJ1ZmZlciwKKyAgICAgICAgLnJlbmRlckFyZWEgPSB7ezAsIDB9LCB7bVdpZHRoLCBtSGVpZ2h0fX0sCisgICAgICAgIC5jbGVhclZhbHVlQ291bnQgPSAxdSwKKyAgICAgICAgLnBDbGVhclZhbHVlcyA9ICZjbGVhclZhbHVlLAorICAgIH07CisgICAgdmtDbWRCZWdpblJlbmRlclBhc3MobUNtZEJ1ZmZlciwgJnJlbmRlclBhc3NCZWdpbkluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgVktfU1VCUEFTU19DT05URU5UU19JTkxJTkUpOworICB9CisKKyAgLy8vIERyYXcgdGV4dHVyZSB0byByZW5kZXJwYXNzLgorICB2a0NtZEJpbmRQaXBlbGluZShtQ21kQnVmZmVyLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCBtUGlwZWxpbmUpOworICB2a0NtZEJpbmREZXNjcmlwdG9yU2V0cyhtQ21kQnVmZmVyLCBWS19QSVBFTElORV9CSU5EX1BPSU5UX0dSQVBISUNTLCBtTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAwdSwgMSwgJm1EZXNjcmlwdG9yU2V0LCAwdSwgbnVsbHB0cik7CisgIFZrRGV2aWNlU2l6ZSBvZmZzZXQgPSAwOworICB2a0NtZEJpbmRWZXJ0ZXhCdWZmZXJzKG1DbWRCdWZmZXIsIDAsIDEsICZtVmVydGV4QnVmZmVyLCAmb2Zmc2V0KTsKKyAgdmtDbWREcmF3KG1DbWRCdWZmZXIsIDZ1LCAxdSwgMHUsIDB1KTsKKyAgdmtDbWRFbmRSZW5kZXJQYXNzKG1DbWRCdWZmZXIpOworCisgIC8vIENvcHkgdG8gb3VyIHN0YWdpbmcgYnVmZmVyLgorICB7CisgICAgVmtCdWZmZXJNZW1vcnlCYXJyaWVyIGJ1ZmZlckJhcnJpZXJ7CisgICAgICAgIC5zVHlwZSA9IFZLX1NUUlVDVFVSRV9UWVBFX0JVRkZFUl9NRU1PUllfQkFSUklFUiwKKyAgICAgICAgLnBOZXh0ID0gbnVsbHB0ciwKKyAgICAgICAgLnNyY0FjY2Vzc01hc2sgPSBWS19BQ0NFU1NfVFJBTlNGRVJfV1JJVEVfQklULAorICAgICAgICAuZHN0QWNjZXNzTWFzayA9IFZLX0FDQ0VTU19IT1NUX1JFQURfQklULAorICAgICAgICAuc3JjUXVldWVGYW1pbHlJbmRleCA9IFZLX1FVRVVFX0ZBTUlMWV9JR05PUkVELAorICAgICAgICAuZHN0UXVldWVGYW1pbHlJbmRleCA9IFZLX1FVRVVFX0ZBTUlMWV9JR05PUkVELAorICAgICAgICAuYnVmZmVyID0gbVJlc3VsdEJ1ZmZlciwKKyAgICAgICAgLm9mZnNldCA9IDB1LAorICAgICAgICAuc2l6ZSA9IG1SZXN1bHRCdWZmZXJTaXplLAorICAgIH07CisKKyAgICBWa0J1ZmZlckltYWdlQ29weSBjb3B5UmVnaW9ueworICAgICAgICAuYnVmZmVyT2Zmc2V0ID0gMHUsCisgICAgICAgIC5idWZmZXJSb3dMZW5ndGggPSBtV2lkdGgsCisgICAgICAgIC5idWZmZXJJbWFnZUhlaWdodCA9IG1IZWlnaHQsCisgICAgICAgIC5pbWFnZVN1YnJlc291cmNlID0ge1ZLX0lNQUdFX0FTUEVDVF9DT0xPUl9CSVQsIDB1LCAwdSwgMXV9LAorICAgICAgICAuaW1hZ2VPZmZzZXQgPSB7MCwgMCwgMH0sCisgICAgICAgIC5pbWFnZUV4dGVudCA9IHttV2lkdGgsIG1IZWlnaHQsIDF1fX07CisKKyAgICBhZGRJbWFnZVRyYW5zaXRpb25CYXJyaWVyKAorICAgICAgICBtQ21kQnVmZmVyLCBtRGVzdEltYWdlLCBWS19QSVBFTElORV9TVEFHRV9DT0xPUl9BVFRBQ0hNRU5UX09VVFBVVF9CSVQsCisgICAgICAgIFZLX1BJUEVMSU5FX1NUQUdFX1RSQU5TRkVSX0JJVCwgVktfQUNDRVNTX0NPTE9SX0FUVEFDSE1FTlRfV1JJVEVfQklULAorICAgICAgICBWS19BQ0NFU1NfVFJBTlNGRVJfUkVBRF9CSVQsIFZLX0lNQUdFX0xBWU9VVF9DT0xPUl9BVFRBQ0hNRU5UX09QVElNQUwsCisgICAgICAgIFZLX0lNQUdFX0xBWU9VVF9UUkFOU0ZFUl9TUkNfT1BUSU1BTCk7CisKKyAgICB2a0NtZENvcHlJbWFnZVRvQnVmZmVyKG1DbWRCdWZmZXIsIG1EZXN0SW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19JTUFHRV9MQVlPVVRfVFJBTlNGRVJfU1JDX09QVElNQUwsIG1SZXN1bHRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAmY29weVJlZ2lvbik7CisKKyAgICB2a0NtZFBpcGVsaW5lQmFycmllcihtQ21kQnVmZmVyLCBWS19QSVBFTElORV9TVEFHRV9UUkFOU0ZFUl9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgVktfUElQRUxJTkVfU1RBR0VfSE9TVF9CSVQsIChWa0RlcGVuZGVuY3lGbGFncykwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBWa01lbW9yeUJhcnJpZXIgKiludWxscHRyLCAxLCAmYnVmZmVyQmFycmllciwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgVmtJbWFnZU1lbW9yeUJhcnJpZXIgKiludWxscHRyKTsKKyAgfQorCisgIFZLX0NBTEwodmtFbmRDb21tYW5kQnVmZmVyKG1DbWRCdWZmZXIpKTsKKworICBWa1BpcGVsaW5lU3RhZ2VGbGFncyBzZW1hcGhvcmVXYWl0RmxhZ3MgPQorICAgICAgVktfUElQRUxJTkVfU1RBR0VfRlJBR01FTlRfU0hBREVSX0JJVDsKKyAgVmtTdWJtaXRJbmZvIHN1Ym1pdEluZm97CisgICAgICAuc1R5cGUgPSBWS19TVFJVQ1RVUkVfVFlQRV9TVUJNSVRfSU5GTywKKyAgICAgIC5wTmV4dCA9IG51bGxwdHIsCisgICAgICAud2FpdFNlbWFwaG9yZUNvdW50ID0gc2VtYXBob3JlICE9IFZLX05VTExfSEFORExFID8gMXUgOiAwdSwKKyAgICAgIC5wV2FpdFNlbWFwaG9yZXMgPSBzZW1hcGhvcmUgIT0gVktfTlVMTF9IQU5ETEUgPyAmc2VtYXBob3JlIDogbnVsbHB0ciwKKyAgICAgIC5wV2FpdERzdFN0YWdlTWFzayA9CisgICAgICAgICAgc2VtYXBob3JlICE9IFZLX05VTExfSEFORExFID8gJnNlbWFwaG9yZVdhaXRGbGFncyA6IG51bGxwdHIsCisgICAgICAuY29tbWFuZEJ1ZmZlckNvdW50ID0gMXUsCisgICAgICAucENvbW1hbmRCdWZmZXJzID0gJm1DbWRCdWZmZXIsCisgICAgICAuc2lnbmFsU2VtYXBob3JlQ291bnQgPSAwdSwKKyAgICAgIC5wU2lnbmFsU2VtYXBob3JlcyA9IG51bGxwdHIsCisgIH07CisgIFZLX0NBTEwodmtSZXNldEZlbmNlcyhtSW5pdC0+ZGV2aWNlKCksIDEsICZtRmVuY2UpKQorICBWS19DQUxMKHZrUXVldWVTdWJtaXQobUluaXQtPnF1ZXVlKCksIDEsICZzdWJtaXRJbmZvLCBtRmVuY2UpKTsKKyAgVktfQ0FMTCh2a1dhaXRGb3JGZW5jZXMobUluaXQtPmRldmljZSgpLCAxLCAmbUZlbmNlLCBWS19UUlVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICB+KDB1bGwpIC8qIGluZmluaXR5ICovKSk7CisKKyAgdm9pZCAqb3V0RGF0YTsKKyAgVktfQ0FMTCh2a01hcE1lbW9yeShtSW5pdC0+ZGV2aWNlKCksIG1SZXN1bHRCdWZmZXJNZW1vcnksIDB1LAorICAgICAgICAgICAgICAgICAgICAgIG1SZXN1bHRCdWZmZXJTaXplLCAwdSwgJm91dERhdGEpKTsKKyAgdWludDhfdCAqdURhdGEgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QgKj4ob3V0RGF0YSk7CisgICpkYXRhID0gc3RkOjp2ZWN0b3I8dWludDhfdD4odURhdGEsIHVEYXRhICsgbVJlc3VsdEJ1ZmZlclNpemUpOworICB2a1VubWFwTWVtb3J5KG1Jbml0LT5kZXZpY2UoKSwgbVJlc3VsdEJ1ZmZlck1lbW9yeSk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgVmtJbWFnZVJlbmRlcmVyOjpjbGVhblVwVGVtcG9yYXJpZXMoKSB7CisgIGlmIChtQ21kQnVmZmVyICE9IFZLX05VTExfSEFORExFKSB7CisgICAgdmtGcmVlQ29tbWFuZEJ1ZmZlcnMobUluaXQtPmRldmljZSgpLCBtQ21kUG9vbCwgMSwgJm1DbWRCdWZmZXIpOworICAgIG1DbWRCdWZmZXIgPSBWS19OVUxMX0hBTkRMRTsKKyAgfQorICBpZiAobURlc2NyaXB0b3JTZXQgIT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICB2a1Jlc2V0RGVzY3JpcHRvclBvb2wobUluaXQtPmRldmljZSgpLCBtRGVzY3JpcHRvclBvb2wsIDAgLypmbGFncyovKTsKKyAgICBtRGVzY3JpcHRvclNldCA9IFZLX05VTExfSEFORExFOworICB9CisgIGlmIChtUGlwZWxpbmUgIT0gVktfTlVMTF9IQU5ETEUpIHsKKyAgICB2a0Rlc3Ryb3lQaXBlbGluZShtSW5pdC0+ZGV2aWNlKCksIG1QaXBlbGluZSwgbnVsbHB0cik7CisgICAgbVBpcGVsaW5lID0gVktfTlVMTF9IQU5ETEU7CisgIH0KKyAgaWYgKG1EZXNjcmlwdG9yTGF5b3V0ICE9IFZLX05VTExfSEFORExFKSB7CisgICAgdmtEZXN0cm95RGVzY3JpcHRvclNldExheW91dChtSW5pdC0+ZGV2aWNlKCksIG1EZXNjcmlwdG9yTGF5b3V0LCBudWxscHRyKTsKKyAgICBtRGVzY3JpcHRvckxheW91dCA9IFZLX05VTExfSEFORExFOworICB9CisgIGlmIChtTGF5b3V0ICE9IFZLX05VTExfSEFORExFKSB7CisgICAgdmtEZXN0cm95UGlwZWxpbmVMYXlvdXQobUluaXQtPmRldmljZSgpLCBtTGF5b3V0LCBudWxscHRyKTsKKyAgICBtTGF5b3V0ID0gVktfTlVMTF9IQU5ETEU7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL2puaS9WdWxrYW5UZXN0SGVscGVycy5oIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvam5pL1Z1bGthblRlc3RIZWxwZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdjYzFlZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL2puaS9WdWxrYW5UZXN0SGVscGVycy5oCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1ZVTEtBTlRFU1RIRUxQRVJTX0gKKyNkZWZpbmUgQU5EUk9JRF9WVUxLQU5URVNUSEVMUEVSU19ICisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8am5pLmg+CisjaW5jbHVkZSA8dnVsa2FuL3Z1bGthbi5oPgorI2luY2x1ZGUgPHZ1bGthbi92dWxrYW5fYW5kcm9pZC5oPgorCisvLyBQcm92aWRlcyBiYXNpYyBzZXQtdXAgb2YgYSBWdWxrYW4gZGV2aWNlIGFuZCBxdWV1ZS4KK2NsYXNzIFZrSW5pdCB7CitwdWJsaWM6CisgIH5Wa0luaXQoKTsKKworICBib29sIGluaXQoKTsKKyAgVmtEZXZpY2UgZGV2aWNlKCkgeyByZXR1cm4gbURldmljZTsgfQorICBWa1F1ZXVlIHF1ZXVlKCkgeyByZXR1cm4gbVF1ZXVlOyB9CisgIFZrUGh5c2ljYWxEZXZpY2UgZ3B1KCkgeyByZXR1cm4gbUdwdTsgfQorICB1aW50MzJfdCBxdWV1ZUZhbWlseUluZGV4KCkgeyByZXR1cm4gbVF1ZXVlRmFtaWx5SW5kZXg7IH0KKyAgUEZOX3ZrR2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQKKyAgICBnZXRIYXJkd2FyZUJ1ZmZlclByb3BlcnRpZXNGbigpIHsKKyAgICAgIHJldHVybiBtUGZuR2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQ7CisgICAgfQorCisgIHVpbnQzMl90IGZpbmRNZW1vcnlUeXBlKHVpbnQzMl90IG1lbW9yeVR5cGVCaXRzUmVxdWlyZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFZrRmxhZ3MgcmVxdWlyZW1lbnRzTWFzayk7CisKK3ByaXZhdGU6CisgIFZrSW5zdGFuY2UgbUluc3RhbmNlID0gVktfTlVMTF9IQU5ETEU7CisgIFZrUGh5c2ljYWxEZXZpY2UgbUdwdSA9IFZLX05VTExfSEFORExFOworICBWa0RldmljZSBtRGV2aWNlID0gVktfTlVMTF9IQU5ETEU7CisgIFZrUXVldWUgbVF1ZXVlID0gVktfTlVMTF9IQU5ETEU7CisgIHVpbnQzMl90IG1RdWV1ZUZhbWlseUluZGV4ID0gMDsKKyAgVmtQaHlzaWNhbERldmljZU1lbW9yeVByb3BlcnRpZXMgbU1lbW9yeVByb3BlcnRpZXMgPSB7fTsKKyAgUEZOX3ZrR2V0QW5kcm9pZEhhcmR3YXJlQnVmZmVyUHJvcGVydGllc0FORFJPSUQKKyAgICAgIG1QZm5HZXRBbmRyb2lkSGFyZHdhcmVCdWZmZXJQcm9wZXJ0aWVzQU5EUk9JRCA9IG51bGxwdHI7Cit9OworCisvLyBQcm92aWRlcyBpbXBvcnQgb2YgQUhhcmR3YXJlQnVmZmVyLgorY2xhc3MgVmtBSGFyZHdhcmVCdWZmZXJJbWFnZSB7CitwdWJsaWM6CisgIFZrQUhhcmR3YXJlQnVmZmVySW1hZ2UoVmtJbml0ICppbml0KTsKKyAgflZrQUhhcmR3YXJlQnVmZmVySW1hZ2UoKTsKKworICBib29sIGluaXQoQUhhcmR3YXJlQnVmZmVyICpidWZmZXIsIGJvb2wgdXNlRXh0ZXJuYWxGb3JtYXQsIGludCBzeW5jRmQgPSAtMSk7CisgIFZrSW1hZ2UgaW1hZ2UoKSB7IHJldHVybiBtSW1hZ2U7IH0KKyAgVmtTYW1wbGVyIHNhbXBsZXIoKSB7IHJldHVybiBtU2FtcGxlcjsgfQorICBWa0ltYWdlVmlldyB2aWV3KCkgeyByZXR1cm4gbVZpZXc7IH0KKyAgVmtTZW1hcGhvcmUgc2VtYXBob3JlKCkgeyByZXR1cm4gbVNlbWFwaG9yZTsgfQorICBib29sIGlzU2FtcGxlckltbXV0YWJsZSgpIHsgcmV0dXJuIG1Db252ZXJzaW9uICE9IFZLX05VTExfSEFORExFOyB9CisKK3ByaXZhdGU6CisgIFZrSW5pdCAqY29uc3QgbUluaXQ7CisgIFZrSW1hZ2UgbUltYWdlID0gVktfTlVMTF9IQU5ETEU7CisgIFZrRGV2aWNlTWVtb3J5IG1NZW1vcnkgPSBWS19OVUxMX0hBTkRMRTsKKyAgVmtTYW1wbGVyIG1TYW1wbGVyID0gVktfTlVMTF9IQU5ETEU7CisgIFZrSW1hZ2VWaWV3IG1WaWV3ID0gVktfTlVMTF9IQU5ETEU7CisgIFZrU2FtcGxlclljYmNyQ29udmVyc2lvbiBtQ29udmVyc2lvbiA9IFZLX05VTExfSEFORExFOworICBWa1NlbWFwaG9yZSBtU2VtYXBob3JlID0gVktfTlVMTF9IQU5ETEU7Cit9OworCisvLyBSZW5kZXJzIGEgcHJvdmlkZWQgaW1hZ2UgdG8gYSBuZXcgdGV4dHVyZSwgdGhlbiByZWFkcyBiYWNrIHRoYXQgdGV4dHVyZSB0bworLy8gZGlzay4KK2NsYXNzIFZrSW1hZ2VSZW5kZXJlciB7CitwdWJsaWM6CisgIFZrSW1hZ2VSZW5kZXJlcihWa0luaXQgKmluaXQsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICBWa0Zvcm1hdCBmb3JtYXQsIHVpbnQzMl90IGJ5dGVzUGVyUGl4ZWwpOworICB+VmtJbWFnZVJlbmRlcmVyKCk7CisKKyAgYm9vbCBpbml0KEpOSUVudiAqZW52LCBqb2JqZWN0IGFzc2V0TWdyKTsKKyAgYm9vbCByZW5kZXJJbWFnZUFuZFJlYWRiYWNrKFZrSW1hZ2UgaW1hZ2UsIFZrU2FtcGxlciBzYW1wbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmtJbWFnZVZpZXcgdmlldywgVmtTZW1hcGhvcmUgc2VtYXBob3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VJbW11dGFibGVTYW1wbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gKmRhdGEpOworICBib29sIHJlbmRlckltYWdlQW5kUmVhZGJhY2soVmtJbWFnZSBpbWFnZSwgVmtTYW1wbGVyIHNhbXBsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWa0ltYWdlVmlldyB2aWV3LCBWa1NlbWFwaG9yZSBzZW1hcGhvcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVzZUltbXV0YWJsZVNhbXBsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gKmRhdGEpOworCitwcml2YXRlOgorICAvLyBDbGVhbnMgdXAgdGhlIHRlbXBvcmFyeSByZW5kZXJJbWFnZUFuZFJlYWRiYWNrIHZhcmlhYmxlcy4KKyAgdm9pZCBjbGVhblVwVGVtcG9yYXJpZXMoKTsKKworICBWa0luaXQgKmNvbnN0IG1Jbml0OworICBjb25zdCB1aW50MzJfdCBtV2lkdGg7CisgIGNvbnN0IHVpbnQzMl90IG1IZWlnaHQ7CisgIGNvbnN0IFZrRm9ybWF0IG1Gb3JtYXQ7CisgIGNvbnN0IFZrRGV2aWNlU2l6ZSBtUmVzdWx0QnVmZmVyU2l6ZTsKKyAgVmtJbWFnZSBtRGVzdEltYWdlID0gVktfTlVMTF9IQU5ETEU7CisgIFZrRGV2aWNlTWVtb3J5IG1EZXN0SW1hZ2VNZW1vcnkgPSBWS19OVUxMX0hBTkRMRTsKKyAgVmtJbWFnZVZpZXcgbURlc3RJbWFnZVZpZXcgPSBWS19OVUxMX0hBTkRMRTsKKyAgVmtCdWZmZXIgbVJlc3VsdEJ1ZmZlciA9IFZLX05VTExfSEFORExFOworICBWa0RldmljZU1lbW9yeSBtUmVzdWx0QnVmZmVyTWVtb3J5ID0gVktfTlVMTF9IQU5ETEU7CisgIFZrRGVzY3JpcHRvclBvb2wgbURlc2NyaXB0b3JQb29sID0gVktfTlVMTF9IQU5ETEU7CisgIFZrQ29tbWFuZFBvb2wgbUNtZFBvb2wgPSBWS19OVUxMX0hBTkRMRTsKKyAgVmtSZW5kZXJQYXNzIG1SZW5kZXJQYXNzID0gVktfTlVMTF9IQU5ETEU7CisgIFZrQnVmZmVyIG1WZXJ0ZXhCdWZmZXIgPSBWS19OVUxMX0hBTkRMRTsKKyAgVmtEZXZpY2VNZW1vcnkgbVZlcnRleEJ1ZmZlck1lbW9yeSA9IFZLX05VTExfSEFORExFOworICBWa0ZyYW1lYnVmZmVyIG1GcmFtZWJ1ZmZlciA9IFZLX05VTExfSEFORExFOworICBWa1NoYWRlck1vZHVsZSBtVmVydE1vZHVsZSA9IFZLX05VTExfSEFORExFOworICBWa1NoYWRlck1vZHVsZSBtUGl4ZWxNb2R1bGUgPSBWS19OVUxMX0hBTkRMRTsKKyAgVmtGZW5jZSBtRmVuY2UgPSBWS19OVUxMX0hBTkRMRTsKKworICAvLyBUZW1wb3JhcnkgdmFsdWVzIHVzZWQgZHVyaW5nIHJlbmRlckltYWdlQW5kUmVhZGJhY2suCisgIFZrQ29tbWFuZEJ1ZmZlciBtQ21kQnVmZmVyID0gVktfTlVMTF9IQU5ETEU7CisgIFZrRGVzY3JpcHRvclNldCBtRGVzY3JpcHRvclNldCA9IFZLX05VTExfSEFORExFOworICBWa1BpcGVsaW5lQ2FjaGUgbUNhY2hlID0gVktfTlVMTF9IQU5ETEU7CisgIFZrUGlwZWxpbmUgbVBpcGVsaW5lID0gVktfTlVMTF9IQU5ETEU7CisgIFZrRGVzY3JpcHRvclNldExheW91dCBtRGVzY3JpcHRvckxheW91dCA9IFZLX05VTExfSEFORExFOworICBWa1BpcGVsaW5lTGF5b3V0IG1MYXlvdXQgPSBWS19OVUxMX0hBTkRMRTsKK307CisKKyNlbmRpZiAvLyBBTkRST0lEX1ZVTEtBTlRFU1RIRUxQRVJTX0gKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL2puaS9hbmRyb2lkX2dyYXBoaWNzX2N0c19BTmF0aXZlV2luZG93VGVzdC5jcHAgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9qbmkvYW5kcm9pZF9ncmFwaGljc19jdHNfQU5hdGl2ZVdpbmRvd1Rlc3QuY3BwCmluZGV4IDc4OGM2NmUuLjc0ZjMzY2QgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL2puaS9hbmRyb2lkX2dyYXBoaWNzX2N0c19BTmF0aXZlV2luZG93VGVzdC5jcHAKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvam5pL2FuZHJvaWRfZ3JhcGhpY3NfY3RzX0FOYXRpdmVXaW5kb3dUZXN0LmNwcApAQCAtMTgsOSArMTgsMTAgQEAKICNkZWZpbmUgTE9HX1RBRyAiQU5hdGl2ZVdpbmRvd1Rlc3QiCiAKICNpbmNsdWRlIDxhcnJheT4KLSNpbmNsdWRlIDxqbmkuaD4KKwogI2luY2x1ZGUgPGFuZHJvaWQvbmF0aXZlX3dpbmRvdy5oPgogI2luY2x1ZGUgPGFuZHJvaWQvbmF0aXZlX3dpbmRvd19qbmkuaD4KKyNpbmNsdWRlIDxqbmkuaD4KIAogbmFtZXNwYWNlIHsKIApAQCAtMzMsOCArMzQsMzQgQEAKICAgICBBTmF0aXZlV2luZG93X3JlbGVhc2Uod2luZG93KTsKIH0KIAotY29uc3Qgc3RkOjphcnJheTxKTklOYXRpdmVNZXRob2QsIDE+IEpOSV9NRVRIT0RTID0ge3sKK2ppbnQgc2V0QnVmZmVyc0RhdGFTcGFjZShKTklFbnYqIGVudiwgamNsYXNzLCBqb2JqZWN0IGpTdXJmYWNlLCBqaW50IGRhdGFTcGFjZSkgeworICAgIEFOYXRpdmVXaW5kb3cqIHdpbmRvdyA9IG51bGxwdHI7CisgICAgaWYgKGpTdXJmYWNlKSB7CisgICAgICAgIHdpbmRvdyA9IEFOYXRpdmVXaW5kb3dfZnJvbVN1cmZhY2UoZW52LCBqU3VyZmFjZSk7CisgICAgfQorICAgIGludCBlcnJvciA9IEFOYXRpdmVXaW5kb3dfc2V0QnVmZmVyc0RhdGFTcGFjZSh3aW5kb3csIGRhdGFTcGFjZSk7CisgICAgaWYgKGVycm9yICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGVycm9yOworICAgIH0KKyAgICBBTmF0aXZlV2luZG93X0J1ZmZlciBtYXBwZWRCdWZmZXI7CisgICAgQU5hdGl2ZVdpbmRvd19sb2NrKHdpbmRvdywgJm1hcHBlZEJ1ZmZlciwgbnVsbHB0cik7CisgICAgQU5hdGl2ZVdpbmRvd191bmxvY2tBbmRQb3N0KHdpbmRvdyk7CisgICAgQU5hdGl2ZVdpbmRvd19yZWxlYXNlKHdpbmRvdyk7CisgICAgcmV0dXJuIGVycm9yOworfQorCitqaW50IGdldEJ1ZmZlcnNEYXRhU3BhY2UoSk5JRW52KiBlbnYsIGpjbGFzcywgam9iamVjdCBqU3VyZmFjZSkgeworICAgIEFOYXRpdmVXaW5kb3cqIHdpbmRvdyA9IG51bGxwdHI7CisgICAgaWYgKGpTdXJmYWNlKSB7CisgICAgICAgIHdpbmRvdyA9IEFOYXRpdmVXaW5kb3dfZnJvbVN1cmZhY2UoZW52LCBqU3VyZmFjZSk7CisgICAgfQorICAgIHJldHVybiBBTmF0aXZlV2luZG93X2dldEJ1ZmZlcnNEYXRhU3BhY2Uod2luZG93KTsKK30KKworY29uc3Qgc3RkOjphcnJheTxKTklOYXRpdmVNZXRob2QsIDM+IEpOSV9NRVRIT0RTID0ge3sKICAgICB7ICJuUHVzaEJ1ZmZlcldpdGhUcmFuc2Zvcm0iLCAiKExhbmRyb2lkL3ZpZXcvU3VyZmFjZTtJKVYiLCAodm9pZCopcHVzaEJ1ZmZlcldpdGhUcmFuc2Zvcm0gfSwKKyAgICB7ICJuU2V0QnVmZmVyc0RhdGFTcGFjZSIsICIoTGFuZHJvaWQvdmlldy9TdXJmYWNlO0kpSSIsICh2b2lkKilzZXRCdWZmZXJzRGF0YVNwYWNlIH0sCisgICAgeyAibkdldEJ1ZmZlcnNEYXRhU3BhY2UiLCAiKExhbmRyb2lkL3ZpZXcvU3VyZmFjZTspSSIsICh2b2lkKilnZXRCdWZmZXJzRGF0YVNwYWNlIH0sCiB9fTsKIAogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvam5pL2FuZHJvaWRfZ3JhcGhpY3NfY3RzX0FTdXJmYWNlVGV4dHVyZVRlc3QuY3BwIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvam5pL2FuZHJvaWRfZ3JhcGhpY3NfY3RzX0FTdXJmYWNlVGV4dHVyZVRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYTY1ZTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9qbmkvYW5kcm9pZF9ncmFwaGljc19jdHNfQVN1cmZhY2VUZXh0dXJlVGVzdC5jcHAKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQVN1cmZhY2VUZXh0dXJlVGVzdCIKKworI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSA8YXJyYXk+CisjaW5jbHVkZSA8am5pLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9uYXRpdmVfd2luZG93Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9zdXJmYWNlX3RleHR1cmUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL3N1cmZhY2VfdGV4dHVyZV9qbmkuaD4KKworI2luY2x1ZGUgIk5hdGl2ZVRlc3RIZWxwZXJzLmgiCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBiYXNpY1Rlc3RzKEpOSUVudiogZW52LCBqY2xhc3MsIGpvYmplY3Qgc3VyZmFjZVRleHR1cmUpIHsKKworICBBU1NFUlQoZGxzeW0oUlRMRF9ERUZBVUxULCAiQVN1cmZhY2VUZXh0dXJlX2Zyb21TdXJmYWNlVGV4dHVyZSIpLAorICAgICAgImNvdWxkbid0IGRsc3ltIEFTdXJmYWNlVGV4dHVyZV9mcm9tU3VyZmFjZVRleHR1cmUiKTsKKyAgQVNTRVJUKGRsc3ltKFJUTERfREVGQVVMVCwgIkFTdXJmYWNlVGV4dHVyZV9yZWxlYXNlIiksCisgICAgICAiY291bGRuJ3QgZGxzeW0gQVN1cmZhY2VUZXh0dXJlX3JlbGVhc2UiKTsKKyAgQVNTRVJUKGRsc3ltKFJUTERfREVGQVVMVCwgIkFTdXJmYWNlVGV4dHVyZV9hY3F1aXJlQU5hdGl2ZVdpbmRvdyIpLAorICAgICAgImNvdWxkbid0IGRsc3ltIEFTdXJmYWNlVGV4dHVyZV9hY3F1aXJlQU5hdGl2ZVdpbmRvdyIpOworICBBU1NFUlQoZGxzeW0oUlRMRF9ERUZBVUxULCAiQVN1cmZhY2VUZXh0dXJlX2F0dGFjaFRvR0xDb250ZXh0IiksCisgICAgICAiY291bGRuJ3QgZGxzeW0gQVN1cmZhY2VUZXh0dXJlX2F0dGFjaFRvR0xDb250ZXh0Iik7CisgIEFTU0VSVChkbHN5bShSVExEX0RFRkFVTFQsICJBU3VyZmFjZVRleHR1cmVfZGV0YWNoRnJvbUdMQ29udGV4dCIpLAorICAgICAgImNvdWxkbid0IGRsc3ltIEFTdXJmYWNlVGV4dHVyZV9kZXRhY2hGcm9tR0xDb250ZXh0Iik7CisgIEFTU0VSVChkbHN5bShSVExEX0RFRkFVTFQsICJBU3VyZmFjZVRleHR1cmVfdXBkYXRlVGV4SW1hZ2UiKSwKKyAgICAgICJjb3VsZG4ndCBkbHN5bSBBU3VyZmFjZVRleHR1cmVfdXBkYXRlVGV4SW1hZ2UiKTsKKyAgQVNTRVJUKGRsc3ltKFJUTERfREVGQVVMVCwgIkFTdXJmYWNlVGV4dHVyZV9nZXRUcmFuc2Zvcm1NYXRyaXgiKSwKKyAgICAgICJjb3VsZG4ndCBkbHN5bSBBU3VyZmFjZVRleHR1cmVfZ2V0VHJhbnNmb3JtTWF0cml4Iik7CisgIEFTU0VSVChkbHN5bShSVExEX0RFRkFVTFQsICJBU3VyZmFjZVRleHR1cmVfZ2V0VGltZXN0YW1wIiksCisgICAgICAiY291bGRuJ3QgZGxzeW0gQVN1cmZhY2VUZXh0dXJlX2dldFRpbWVzdGFtcCIpOworCisgIEFTdXJmYWNlVGV4dHVyZSogYXN0ID0gQVN1cmZhY2VUZXh0dXJlX2Zyb21TdXJmYWNlVGV4dHVyZShlbnYsIHN1cmZhY2VUZXh0dXJlKTsKKyAgQVNTRVJUKGFzdCwgIkFTdXJmYWNlVGV4dHVyZV9mcm9tU3VyZmFjZVRleHR1cmUgZmFpbGVkIikKKworICBBTmF0aXZlV2luZG93KiB3aW4gPSBBU3VyZmFjZVRleHR1cmVfYWNxdWlyZUFOYXRpdmVXaW5kb3coYXN0KTsKKyAgQVNTRVJUKHdpbiwgIkFTdXJmYWNlVGV4dHVyZV9hY3F1aXJlQU5hdGl2ZVdpbmRvdyByZXR1cm5lZCBudWxscHRyIikKKworICBBU1NFUlQoIUFTdXJmYWNlVGV4dHVyZV9hdHRhY2hUb0dMQ29udGV4dChhc3QsIDEyMzQpLCAiQVN1cmZhY2VUZXh0dXJlX2F0dGFjaFRvR0xDb250ZXh0IGZhaWxlZCIpOworICBBU1NFUlQoIEFTdXJmYWNlVGV4dHVyZV9hdHRhY2hUb0dMQ29udGV4dChhc3QsIDIwMDApLCAiQVN1cmZhY2VUZXh0dXJlX2F0dGFjaFRvR0xDb250ZXh0ICgybmQpIHNob3VsZCBoYXZlIGZhaWxlZCIpOworCisgIEFSZWN0IGJvdW5kcyA9IHswLCAwLCA2NDAsIDQ4MH07CisgIEFOYXRpdmVXaW5kb3dfQnVmZmVyIG91dEJ1ZmZlcjsKKyAgaW50IGVyciA9IEFOYXRpdmVXaW5kb3dfbG9jayh3aW4sICZvdXRCdWZmZXIsICZib3VuZHMpOworICBBU1NFUlQoIWVyciwgIkFOYXRpdmVXaW5kb3dfbG9jayBmYWlsZWQiKTsKKyAgQVNTRVJUKG91dEJ1ZmZlci53aWR0aCA9PSA2NDAsICJsb2NrZWQgYnVmZmVyIHdpZHRoIGlzIHdyb25nIikKKyAgQVNTRVJUKG91dEJ1ZmZlci5oZWlnaHQgPT0gNDgwLCAibG9ja2VkIGJ1ZmZlciBoZWlnaHQgaXMgd3JvbmciKQorCisgIC8vIHRoaXMgcHVzaGVzIGEgYnVmZmVyCisgIEFOYXRpdmVXaW5kb3dfdW5sb2NrQW5kUG9zdCh3aW4pOworCisgIEFTU0VSVCghQVN1cmZhY2VUZXh0dXJlX3VwZGF0ZVRleEltYWdlKGFzdCksICJBU3VyZmFjZVRleHR1cmVfdXBkYXRlVGV4SW1hZ2UgKDFzdCkgZmFpbGVkIik7CisgIEFTU0VSVCghQVN1cmZhY2VUZXh0dXJlX3VwZGF0ZVRleEltYWdlKGFzdCksICJBU3VyZmFjZVRleHR1cmVfdXBkYXRlVGV4SW1hZ2UgKDJzdCkgZmFpbGVkIik7CisKKyAgQVN1cmZhY2VUZXh0dXJlX2RldGFjaEZyb21HTENvbnRleHQoYXN0KTsKKyAgQU5hdGl2ZVdpbmRvd19yZWxlYXNlKHdpbik7CisgIEFTdXJmYWNlVGV4dHVyZV9yZWxlYXNlKGFzdCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgY29uc3Qgc3RkOjphcnJheTxKTklOYXRpdmVNZXRob2QsIDE+IEpOSV9NRVRIT0RTID0ge3sKKyAgICB7ICJuQmFzaWNUZXN0cyIsICIoTGFuZHJvaWQvZ3JhcGhpY3MvU3VyZmFjZVRleHR1cmU7KVYiLCAodm9pZCopYmFzaWNUZXN0cyB9LAorfX07CisKK2ludCByZWdpc3Rlcl9hbmRyb2lkX2dyYXBoaWNzX2N0c19BU3VyZmFjZVRleHR1cmVUZXN0KEpOSUVudiogZW52KSB7CisgICAgamNsYXNzIGNsYXp6ID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvZ3JhcGhpY3MvY3RzL0FTdXJmYWNlVGV4dHVyZVRlc3QiKTsKKyAgICByZXR1cm4gZW52LT5SZWdpc3Rlck5hdGl2ZXMoY2xhenosIEpOSV9NRVRIT0RTLmRhdGEoKSwgSk5JX01FVEhPRFMuc2l6ZSgpKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL2puaS9hbmRyb2lkX2dyYXBoaWNzX2N0c19CYXNpY1Z1bGthbkdwdVRlc3QuY3BwIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvam5pL2FuZHJvaWRfZ3JhcGhpY3NfY3RzX0Jhc2ljVnVsa2FuR3B1VGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM5MDk0MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL2puaS9hbmRyb2lkX2dyYXBoaWNzX2N0c19CYXNpY1Z1bGthbkdwdVRlc3QuY3BwCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJCYXNpY1Z1bGthbkdwdVRlc3QiCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZV9idWZmZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2xvZy5oPgorI2luY2x1ZGUgPGpuaS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAiTmF0aXZlVGVzdEhlbHBlcnMuaCIKKyNpbmNsdWRlICJWdWxrYW5UZXN0SGVscGVycy5oIgorCituYW1lc3BhY2UgeworCitzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGtUZXN0SW1hZ2VXaWR0aCA9IDY0Oworc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrVGVzdEltYWdlSGVpZ2h0ID0gNjQ7CisKK30gLy8gbmFtZXNwYWNlCisKKy8vIEEgVnVsa2FuIEFIYXJkd2FyZUJ1ZmZlciBpbXBvcnQgdGVzdCB3aGljaCBkb2VzIHRoZSBmb2xsb3dpbmc6CisvLyAxKSBBbGxvY2F0ZXMgYW4gQUhhcmR3YXJlQnVmZmVyIGluIG9uZSBvZiA1IGZvcm1hdHMuCisvLyAyKSBQb3B1bGF0ZXMgdGhlIGJ1ZmZlciB3aXRoIHdlbGwtZGVmaW5lZCBkYXRhLgorLy8gMykgQ3JlYXRlcyBhIFZrSW1hZ2UgZnJvbSB0aGlzIEFIYXJkd2FyZUJ1ZmZlci4KKy8vIDQpIFJlbmRlcnMgdGhlIEFIYXJkd2FyZUJ1ZmZlciB0byBhIFZ1bGthbiBSR0JBIGludGVybWVkaWF0ZS4KKy8vIDUpIFJlYWRzIGJhY2sgdGhlIGludGVybWVkaWF0ZSBpbnRvIGEgQ1BVIGFjY2Vzc2libGUgVmtCdWZmZXIuCisvLyA2KSBWYWxpZGF0ZXMgdGhhdCB0aGUgdmFsdWVzIGFyZSBhcyBleHBlY3RlZC4KK3N0YXRpYyB2b2lkIHZlcmlmeUJhc2ljQnVmZmVySW1wb3J0KEpOSUVudiAqZW52LCBqY2xhc3MsIGpvYmplY3QgYXNzZXRNZ3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IGZvcm1hdCwgamJvb2xlYW4gdXNlRXh0ZXJuYWxGb3JtYXQpIHsKKyAgLy8gRGVmaW5lIGFuZCBjaG9zZSBwYXJhbWV0ZXJzLgorICBzdHJ1Y3QgRm9ybWF0RGVzY3JpcHRpb24geworICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgc2l6ZV90IHBpeGVsV2lkdGg7CisgICAgVmtGb3JtYXQgdmtGb3JtYXQ7CisgIH07CisgIHN0ZDo6bWFwPHVpbnQzMl90LCBGb3JtYXREZXNjcmlwdGlvbj4gYnVmZmVyRm9ybWF0c3sKKyAgICAgIHtBSEFSRFdBUkVCVUZGRVJfRk9STUFUX1I4RzhCOEE4X1VOT1JNLAorICAgICAgIHsiQUhBUkRXQVJFQlVGRkVSX0ZPUk1BVF9SOEc4QjhBOF9VTk9STSIsIDQsIFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STX19LAorICAgICAge0FIQVJEV0FSRUJVRkZFUl9GT1JNQVRfUjVHNkI1X1VOT1JNLAorICAgICAgIHsiQUhBUkRXQVJFQlVGRkVSX0ZPUk1BVF9SNUc2QjVfVU5PUk0iLCAyLAorICAgICAgICBWS19GT1JNQVRfUjVHNkI1X1VOT1JNX1BBQ0sxNn19LAorICAgICAge0FIQVJEV0FSRUJVRkZFUl9GT1JNQVRfUjhHOEI4WDhfVU5PUk0sCisgICAgICAgeyJBSEFSRFdBUkVCVUZGRVJfRk9STUFUX1I4RzhCOFg4X1VOT1JNIiwgNCwgVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNfX0sCisgICAgICB7QUhBUkRXQVJFQlVGRkVSX0ZPUk1BVF9SOEc4QjhfVU5PUk0sCisgICAgICAgeyJBSEFSRFdBUkVCVUZGRVJfRk9STUFUX1I4RzhCOF9VTk9STSIsIDMsIFZLX0ZPUk1BVF9SOEc4QjhfVU5PUk19fSwKKyAgICAgIHtBSEFSRFdBUkVCVUZGRVJfRk9STUFUX1IxMEcxMEIxMEEyX1VOT1JNLAorICAgICAgIHsiQUhBUkRXQVJFQlVGRkVSX0ZPUk1BVF9SMTBHMTBCMTBBMl9VTk9STSIsIDQsCisgICAgICAgIFZLX0ZPUk1BVF9BMkIxMEcxMFIxMF9VTk9STV9QQUNLMzJ9fSwKKyAgICAgIC8vIFRPRE8oZXJpY3JrKTogVGVzdCBmbG9hdCBhbmQgbm9uLXJlbmRlcmFibGUgZm9ybWF0cy4KKyAgfTsKKyAgQVNTRVJUKGJ1ZmZlckZvcm1hdHMuZmluZChmb3JtYXQpICE9IGJ1ZmZlckZvcm1hdHMuZW5kKCksCisgICAgICAgICAiQ2FsbGVkIHZlcmlmeUJhc2ljQnVmZmVySW1wb3J0IHdpdGggdW5leHBlY3RlZCBmb3JtYXQgJWQuIiwgZm9ybWF0KTsKKyAgY29uc3QgRm9ybWF0RGVzY3JpcHRpb24gJmZvcm1hdERlc2MgPSBidWZmZXJGb3JtYXRzW2Zvcm1hdF07CisKKyAgLy8gU2V0IHVwIFZ1bGthbi4KKyAgVmtJbml0IGluaXQ7CisgIGlmICghaW5pdC5pbml0KCkpIHsKKyAgICAvLyBDb3VsZCBub3QgaW5pdGlhbGl6ZSBWdWxrYW4gZHVlIHRvIGxhY2sgb2YgZGV2aWNlIHN1cHBvcnQsIHNraXAgdGVzdC4KKyAgICByZXR1cm47CisgIH0KKworICAvLyBDcmVhdGUgYW5kIGluaXRpYWxpemUgYnVmZmVyIGJhc2VkIG9uIHBhcmFtZXRlcnMuCisgIEFIYXJkd2FyZUJ1ZmZlcl9EZXNjIGh3YkRlc2N7CisgICAgICAud2lkdGggPSBrVGVzdEltYWdlV2lkdGgsCisgICAgICAuaGVpZ2h0ID0ga1Rlc3RJbWFnZUhlaWdodCwKKyAgICAgIC5sYXllcnMgPSAxLAorICAgICAgLnVzYWdlID0gQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0NQVV9SRUFEX05FVkVSIHwKKyAgICAgICAgICAgICAgIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9DUFVfV1JJVEVfT0ZURU4gfAorICAgICAgICAgICAgICAgQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0dQVV9TQU1QTEVEX0lNQUdFLAorICAgICAgLmZvcm1hdCA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pihmb3JtYXQpLAorICB9OworICBBSGFyZHdhcmVCdWZmZXIgKmJ1ZmZlcjsKKyAgaWYgKDAgIT0gQUhhcmR3YXJlQnVmZmVyX2FsbG9jYXRlKCZod2JEZXNjLCAmYnVmZmVyKSkgeworICAgIC8vIFdlIGRvbid0IHJlcXVpcmUgc3VwcG9ydCBmb3IgYWxsIGZvcm1hdHMsIHdlIG9ubHkgcmVxdWlyZSB0aGF0IGlmIGEKKyAgICAvLyBmb3JtYXQgaXMgc3VwcG9ydGVkIGl0IG11c3QgYmUgaW1wb3J0YWJsZSBpbnRvIFZ1bGthbi4KKyAgICByZXR1cm47CisgIH0KKworICBWa0ltYWdlUmVuZGVyZXIgcmVuZGVyZXIoJmluaXQsIGtUZXN0SW1hZ2VXaWR0aCwga1Rlc3RJbWFnZUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdERlc2MudmtGb3JtYXQsIGZvcm1hdERlc2MucGl4ZWxXaWR0aCk7CisgIEFTU0VSVChyZW5kZXJlci5pbml0KGVudiwgYXNzZXRNZ3IpLCAiVW5hYmxlIHRvIGluaXRpYWxpemUgVmtSZW5kZXJlci4iKTsKKworICAvLyBQb3B1bGF0ZSB0aGUgYnVmZmVyIHdpdGggd2VsbC1kZWZpbmVkIGRhdGEuCisgIEFIYXJkd2FyZUJ1ZmZlcl9kZXNjcmliZShidWZmZXIsICZod2JEZXNjKTsKKyAgdWludDhfdCAqYnVmZmVyQWRkcjsKKyAgQVNTRVJUKDAgPT0gQUhhcmR3YXJlQnVmZmVyX2xvY2soCisgICAgICAgICAgICAgICAgICBidWZmZXIsIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9DUFVfV1JJVEVfT0ZURU4sIC0xLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2lkICoqPigmYnVmZmVyQWRkcikpLAorICAgICAgICAgIlVuYWJsZSB0byBsb2NrIGhhcmR3YXJlIGJ1ZmZlci4iKTsKKworICB1aW50OF90ICpkc3QgPSBidWZmZXJBZGRyOworICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IGtUZXN0SW1hZ2VIZWlnaHQ7ICsreSkgeworICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwga1Rlc3RJbWFnZVdpZHRoOyArK3gpIHsKKyAgICAgIHVpbnQ4X3QgKnRhcmdldCA9IGRzdCArICgoeSAqIGh3YkRlc2Muc3RyaWRlICogZm9ybWF0RGVzYy5waXhlbFdpZHRoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCAqIGZvcm1hdERlc2MucGl4ZWxXaWR0aCk7CisgICAgICAqdGFyZ2V0ID0geCArIHk7CisgICAgfQorICB9CisKKyAgaW50IHN5bmNGZCA9IC0xOworICBBSGFyZHdhcmVCdWZmZXJfdW5sb2NrKGJ1ZmZlciwgJnN5bmNGZCk7CisKKyAgLy8gSW1wb3J0IHRoZSBBSGFyZHdhcmVCdWZmZXIgaW50byBWdWxrYW4uCisgIFZrQUhhcmR3YXJlQnVmZmVySW1hZ2UgdmtJbWFnZSgmaW5pdCk7CisgIEFTU0VSVCh2a0ltYWdlLmluaXQoYnVmZmVyLCB1c2VFeHRlcm5hbEZvcm1hdCwgc3luY0ZkKSwKKyAgICAgICAgICJDb3VsZCBub3QgaW5pdGlhbGl6ZSBWa0FIYXJkd2FyZUJ1ZmZlckltYWdlLiIpOworCisgIC8vIFJlbmRlciB0aGUgQUhhcmR3YXJlQnVmZmVyIGFuZCByZWFkIGJhY2sgdGhlIHJlc3VsdC4KKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZnJhbWVQaXhlbHM7CisgIEFTU0VSVChyZW5kZXJlci5yZW5kZXJJbWFnZUFuZFJlYWRiYWNrKHZrSW1hZ2UuaW1hZ2UoKSwgdmtJbWFnZS5zYW1wbGVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZrSW1hZ2UudmlldygpLCB2a0ltYWdlLnNlbWFwaG9yZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2a0ltYWdlLmlzU2FtcGxlckltbXV0YWJsZSgpLCAmZnJhbWVQaXhlbHMpLAorICAgICAgICAgIkNvdWxkIG5vdCByZW5kZXIvcmVhZC1iYWNrIGltYWdlIGJpdHMuIik7CisgIEFTU0VSVChmcmFtZVBpeGVscy5zaXplKCkgPT0KKyAgICAgICAgICAgICBrVGVzdEltYWdlV2lkdGggKiBrVGVzdEltYWdlSGVpZ2h0ICogZm9ybWF0RGVzYy5waXhlbFdpZHRoLAorICAgICAgICAgIkdvdCB1bmV4cGVjdGVkIHBpeGVsIHNpemUuIik7CisKKyAgLy8gQ2hlY2sgdGhhdCB0aGUgcmVzdWx0IGlzIGFzIGV4cGVjdGVkLgorICBmb3IgKHVpbnQzMl90IHkgPSAwOyB5IDwga1Rlc3RJbWFnZUhlaWdodDsgKyt5KSB7CisgICAgZm9yICh1aW50MzJfdCB4ID0gMDsgeCA8IGtUZXN0SW1hZ2VXaWR0aDsgKyt4KSB7CisgICAgICBzaXplX3Qgb2Zmc2V0ID0geSAqIGtUZXN0SW1hZ2VXaWR0aCAqIGZvcm1hdERlc2MucGl4ZWxXaWR0aCArCisgICAgICAgICAgICAgICAgICAgICAgeCAqIGZvcm1hdERlc2MucGl4ZWxXaWR0aDsKKyAgICAgIEFTU0VSVChmcmFtZVBpeGVsc1tvZmZzZXRdID09IHggKyB5LAorICAgICAgICAgICAgICJGb3JtYXQgJXMgRXhwZWN0ZWQgJWQgYXQgKCVkLCVkKSwgZ290ICVkIiwKKyAgICAgICAgICAgICBmb3JtYXREZXNjLm5hbWUuY19zdHIoKSwgeCArIHksIHgsIHksIGZyYW1lUGl4ZWxzW29mZnNldF0pOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdNZXRob2RzW10gPSB7CisgICAgeyJ2ZXJpZnlCYXNpY0J1ZmZlckltcG9ydCIsICIoTGFuZHJvaWQvY29udGVudC9yZXMvQXNzZXRNYW5hZ2VyO0laKVYiLAorICAgICAodm9pZCAqKXZlcmlmeUJhc2ljQnVmZmVySW1wb3J0fSwKK307CisKK2ludCByZWdpc3Rlcl9hbmRyb2lkX2dyYXBoaWNzX2N0c19CYXNpY1Z1bGthbkdwdVRlc3QoSk5JRW52ICplbnYpIHsKKyAgamNsYXNzIGNsYXp6ID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvZ3JhcGhpY3MvY3RzL0Jhc2ljVnVsa2FuR3B1VGVzdCIpOworICByZXR1cm4gZW52LT5SZWdpc3Rlck5hdGl2ZXMoY2xhenosIGdNZXRob2RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGdNZXRob2RzKSAvIHNpemVvZihKTklOYXRpdmVNZXRob2QpKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL2puaS9hbmRyb2lkX2dyYXBoaWNzX2N0c19CaXRtYXBUZXN0LmNwcCBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL2puaS9hbmRyb2lkX2dyYXBoaWNzX2N0c19CaXRtYXBUZXN0LmNwcAppbmRleCA0YWY2YjNjLi4yZTNiZjA2IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9qbmkvYW5kcm9pZF9ncmFwaGljc19jdHNfQml0bWFwVGVzdC5jcHAKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvam5pL2FuZHJvaWRfZ3JhcGhpY3NfY3RzX0JpdG1hcFRlc3QuY3BwCkBAIC0xOSw0NiArMTksOCBAQAogCiAjaW5jbHVkZSA8am5pLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9iaXRtYXAuaD4KLSNpbmNsdWRlIDxjc3RkbGliPgotI2luY2x1ZGUgPGNzdHJpbmc+CiAKLS8vIENvcGllZCBmcm9tIHRlc3RzL3NlbnNvci9qbmkvbmF0aXZlVGVzdEhlbHBlci5oCi0vLyBUT0RPOiBNb3ZlIHRvIGEgc2hhcmVkIGxvY2F0aW9uCi0jZGVmaW5lIEFTU0VSVChjb25kaXRpb24sIGZvcm1hdCwgYXJncy4uLikgXAotICAgICAgICBpZiAoIShjb25kaXRpb24pKSB7IFwKLSAgICAgICAgICAgIGZhaWwoZW52LCBmb3JtYXQsICMjIGFyZ3MpOyBcCi0gICAgICAgICAgICByZXR1cm47IFwKLSAgICAgICAgfQotCi0jZGVmaW5lIEFTU0VSVF9UUlVFKGEpIEFTU0VSVCgoYSksICJhc3NlcnQgZmFpbGVkIG9uICgiICNhICIpIGF0ICIgX19GSUxFX18gIjolZCIsIF9fTElORV9fKQotI2RlZmluZSBBU1NFUlRfRkFMU0UoYSkgQVNTRVJUKCEoYSksICJhc3NlcnQgZmFpbGVkIG9uICghIiAjYSAiKSBhdCAiIF9fRklMRV9fICI6JWQiLCBfX0xJTkVfXykKLSNkZWZpbmUgQVNTRVJUX0VRKGEsIGIpIFwKLSAgICAgICAgQVNTRVJUKChhKSA9PSAoYiksICJhc3NlcnQgZmFpbGVkIG9uICgiICNhICIgPT0gIiAjYiAiKSBhdCAiIF9fRklMRV9fICI6JWQiLCBfX0xJTkVfXykKLSNkZWZpbmUgQVNTRVJUX05FKGEsIGIpIFwKLSAgICAgICAgQVNTRVJUKChhKSAhPSAoYiksICJhc3NlcnQgZmFpbGVkIG9uICgiICNhICIgIT0gIiAjYiAiKSBhdCAiIF9fRklMRV9fICI6JWQiLCBfX0xJTkVfXykKLSNkZWZpbmUgQVNTRVJUX0dUKGEsIGIpIFwKLSAgICAgICAgQVNTRVJUKChhKSA+IChiKSwgImFzc2VydCBmYWlsZWQgb24gKCIgI2EgIiA+ICIgI2IgIikgYXQgIiBfX0ZJTEVfXyAiOiVkIiwgX19MSU5FX18pCi0jZGVmaW5lIEFTU0VSVF9HRShhLCBiKSBcCi0gICAgICAgIEFTU0VSVCgoYSkgPj0gKGIpLCAiYXNzZXJ0IGZhaWxlZCBvbiAoIiAjYSAiID49ICIgI2IgIikgYXQgIiBfX0ZJTEVfXyAiOiVkIiwgX19MSU5FX18pCi0jZGVmaW5lIEFTU0VSVF9MVChhLCBiKSBcCi0gICAgICAgIEFTU0VSVCgoYSkgPCAoYiksICJhc3NlcnQgZmFpbGVkIG9uICgiICNhICIgPCAiICNiICIpIGF0ICIgX19GSUxFX18gIjolZCIsIF9fTElORV9fKQotI2RlZmluZSBBU1NFUlRfTEUoYSwgYikgXAotICAgICAgICBBU1NFUlQoKGEpIDw9IChiKSwgImFzc2VydCBmYWlsZWQgb24gKCIgI2EgIiA8PSAiICNiICIpIGF0ICIgX19GSUxFX18gIjolZCIsIF9fTElORV9fKQotCi1zdGF0aWMgdm9pZCBmYWlsKEpOSUVudiogZW52LCBjb25zdCBjaGFyKiBmb3JtYXQsIC4uLikgewotICAgIHZhX2xpc3QgYXJnczsKLQotICAgIHZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7Ci0gICAgY2hhciAqbXNnOwotICAgIHZhc3ByaW50ZigmbXNnLCBmb3JtYXQsIGFyZ3MpOwotICAgIHZhX2VuZChhcmdzKTsKLQotICAgIGpjbGFzcyBleENsYXNzOwotICAgIGNvbnN0IGNoYXIgKmNsYXNzTmFtZSA9ICJqYXZhL2xhbmcvQXNzZXJ0aW9uRXJyb3IiOwotICAgIGV4Q2xhc3MgPSBlbnYtPkZpbmRDbGFzcyhjbGFzc05hbWUpOwotICAgIGVudi0+VGhyb3dOZXcoZXhDbGFzcywgbXNnKTsKLSAgICBmcmVlKG1zZyk7Ci19CisjaW5jbHVkZSAiTmF0aXZlVGVzdEhlbHBlcnMuaCIKIAogc3RhdGljIHZvaWQgdmFsaWRhdGVCaXRtYXBJbmZvKEpOSUVudiogZW52LCBqY2xhc3MsIGpvYmplY3QgamJpdG1hcCwgamludCB3aWR0aCwgamludCBoZWlnaHQsCiAgICAgICAgIGpib29sZWFuIGlzNTY1KSB7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9qbmkvYW5kcm9pZF9ncmFwaGljc19jdHNfQ2FtZXJhR3B1Q3RzQWN0aXZpdHkuY3BwIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvam5pL2FuZHJvaWRfZ3JhcGhpY3NfY3RzX0NhbWVyYUdwdUN0c0FjdGl2aXR5LmNwcAppbmRleCBkYzI4Y2VkLi5hNmI2YzVmIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9qbmkvYW5kcm9pZF9ncmFwaGljc19jdHNfQ2FtZXJhR3B1Q3RzQWN0aXZpdHkuY3BwCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL2puaS9hbmRyb2lkX2dyYXBoaWNzX2N0c19DYW1lcmFHcHVDdHNBY3Rpdml0eS5jcHAKQEAgLTIwLDI0ICsyMCwxOCBAQAogI2luY2x1ZGUgPGpuaS5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCi0jaW5jbHVkZSA8ZGVxdWU+CiAjaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPG11dGV4PgogI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgPGFuZHJvaWQvbG9nLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9uYXRpdmVfd2luZG93X2puaS5oPgotI2luY2x1ZGUgPGNhbWVyYS9OZGtDYW1lcmFFcnJvci5oPgotI2luY2x1ZGUgPGNhbWVyYS9OZGtDYW1lcmFNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8Y2FtZXJhL05ka0NhbWVyYURldmljZS5oPgotI2luY2x1ZGUgPGNhbWVyYS9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oPgogI2luY2x1ZGUgPEVHTC9lZ2wuaD4KICNpbmNsdWRlIDxFR0wvZWdsZXh0Lmg+CiAjaW5jbHVkZSA8R0xFUy9nbC5oPgogI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KICNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KLSNpbmNsdWRlIDxtZWRpYS9OZGtJbWFnZS5oPgotI2luY2x1ZGUgPG1lZGlhL05ka0ltYWdlUmVhZGVyLmg+CisKKyNpbmNsdWRlICJDYW1lcmFUZXN0SGVscGVycy5oIgorI2luY2x1ZGUgIkltYWdlUmVhZGVyVGVzdEhlbHBlcnMuaCIKIAogLy8jZGVmaW5lIEFMT0dWKC4uLikgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19WRVJCT1NFLCBMT0dfVEFHLCBfX1ZBX0FSR1NfXykKIC8vI2RlZmluZSBBTE9HRCguLi4pIF9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfREVCVUcsIExPR19UQUcsIF9fVkFfQVJHU19fKQpAQCAtOTUsMzIyICs4OSw2IEBACiAgICAgfQogfQogCi1jbGFzcyBDYW1lcmFIZWxwZXIgewotICBwdWJsaWM6Ci0gICAgfkNhbWVyYUhlbHBlcigpIHsgY2xvc2VDYW1lcmEoKTsgfQotCi0gICAgaW50IGluaXRDYW1lcmEoQU5hdGl2ZVdpbmRvdyogaW1nUmVhZGVyQW53KSB7Ci0gICAgICAgIGlmIChpbWdSZWFkZXJBbncgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBpbml0aWFsaXplIGNhbWVyYSBiZWZvcmUgaW1hZ2UgcmVhZGVyIGdldCBpbml0aWFsaXplZC4iKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIG1JbWdSZWFkZXJBbncgPSBpbWdSZWFkZXJBbnc7Ci0gICAgICAgIG1DYW1lcmFNYW5hZ2VyID0gQUNhbWVyYU1hbmFnZXJfY3JlYXRlKCk7Ci0gICAgICAgIGlmIChtQ2FtZXJhTWFuYWdlciA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSBBQ2FtZXJhTWFuYWdlci4iKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCByZXQgPSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFJZExpc3QobUNhbWVyYU1hbmFnZXIsICZtQ2FtZXJhSWRMaXN0KTsKLSAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IGNhbWVyYUlkTGlzdDogcmV0PSVkIiwgcmV0KTsKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1DYW1lcmFJZExpc3QtPm51bUNhbWVyYXMgPCAxKSB7Ci0gICAgICAgICAgICBBTE9HVygiRGV2aWNlIGhhcyBubyBOREsgY29tcGF0aWJsZSBjYW1lcmEuIik7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBBTE9HSSgiRm91bmQgJWQgY2FtZXJhKHMpLiIsIG1DYW1lcmFJZExpc3QtPm51bUNhbWVyYXMpOwotCi0gICAgICAgIC8vIFdlIGFsd2F5cyB1c2UgdGhlIGZpcnN0IGNhbWVyYS4KLSAgICAgICAgbUNhbWVyYUlkID0gbUNhbWVyYUlkTGlzdC0+Y2FtZXJhSWRzWzBdOwotICAgICAgICBpZiAobUNhbWVyYUlkID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IGNhbWVyYUlkLiIpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0ID0gQUNhbWVyYU1hbmFnZXJfb3BlbkNhbWVyYShtQ2FtZXJhTWFuYWdlciwgbUNhbWVyYUlkLCAmbURldmljZUNiLCAmbURldmljZSk7Ci0gICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LIHx8IG1EZXZpY2UgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBvcGVuIGNhbWVyYSwgcmV0PSVkLCBtRGV2aWNlPSVwLiIsIHJldCwgbURldmljZSk7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICByZXQgPSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MobUNhbWVyYU1hbmFnZXIsIG1DYW1lcmFJZCwgJm1DYW1lcmFNZXRhZGF0YSk7Ci0gICAgICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSyB8fCBtQ2FtZXJhTWV0YWRhdGEgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgQUxPR0UoIkdldCBjYW1lcmEgJXMgY2hhcmFjdGVyaXN0aWNzIGZhaWx1cmUuIHJldCAlZCwgbWV0YWRhdGEgJXAiLCBtQ2FtZXJhSWQsIHJldCwKLSAgICAgICAgICAgICAgICAgIG1DYW1lcmFNZXRhZGF0YSk7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWlzQ2FwYWJpbGl0eVN1cHBvcnRlZChBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19CQUNLV0FSRF9DT01QQVRJQkxFKSkgewotICAgICAgICAgICAgQUxPR1coIkNhbWVyYSBkb2VzIG5vdCBzdXBwb3J0IEJBQ0tXQVJEX0NPTVBBVElCTEUuIik7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENyZWF0ZSBjYXB0dXJlIHNlc3Npb24KLSAgICAgICAgcmV0ID0gQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2NyZWF0ZSgmbU91dHB1dHMpOwotICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSykgewotICAgICAgICAgICAgQUxPR0UoIkFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lcl9jcmVhdGUgZmFpbGVkLCByZXQ9JWQiLCByZXQpOwotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgfQotICAgICAgICByZXQgPSBBQ2FwdHVyZVNlc3Npb25PdXRwdXRfY3JlYXRlKG1JbWdSZWFkZXJBbncsICZtSW1nUmVhZGVyT3V0cHV0KTsKLSAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCJBQ2FwdHVyZVNlc3Npb25PdXRwdXRfY3JlYXRlIGZhaWxlZCwgcmV0PSVkIiwgcmV0KTsKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0ID0gQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2FkZChtT3V0cHV0cywgbUltZ1JlYWRlck91dHB1dCk7Ci0gICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2FkZCBmYWlsZWQsIHJldD0lZCIsIHJldCk7Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICB9Ci0gICAgICAgIHJldCA9IEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVNlc3Npb24obURldmljZSwgbU91dHB1dHMsICZtU2Vzc2lvbkNiLCAmbVNlc3Npb24pOwotICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSykgewotICAgICAgICAgICAgQUxPR0UoIkFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVNlc3Npb24gZmFpbGVkLCByZXQ9JWQiLCByZXQpOwotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENyZWF0ZSBjYXB0dXJlIHJlcXVlc3QKLSAgICAgICAgcmV0ID0gQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlUmVxdWVzdChtRGV2aWNlLCBURU1QTEFURV9SRUNPUkQsICZtQ2FwdHVyZVJlcXVlc3QpOwotICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSykgewotICAgICAgICAgICAgQUxPR0UoIkFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVJlcXVlc3QgZmFpbGVkLCByZXQ9JWQiLCByZXQpOwotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgfQotICAgICAgICByZXQgPSBBQ2FtZXJhT3V0cHV0VGFyZ2V0X2NyZWF0ZShtSW1nUmVhZGVyQW53LCAmbVJlcUltZ1JlYWRlck91dHB1dCk7Ci0gICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiQUNhbWVyYU91dHB1dFRhcmdldF9jcmVhdGUgZmFpbGVkLCByZXQ9JWQiLCByZXQpOwotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgfQotICAgICAgICByZXQgPSBBQ2FwdHVyZVJlcXVlc3RfYWRkVGFyZ2V0KG1DYXB0dXJlUmVxdWVzdCwgbVJlcUltZ1JlYWRlck91dHB1dCk7Ci0gICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiQUNhcHR1cmVSZXF1ZXN0X2FkZFRhcmdldCBmYWlsZWQsIHJldD0lZCIsIHJldCk7Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICB9Ci0KLSAgICAgICAgbUlzQ2FtZXJhUmVhZHkgPSB0cnVlOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBib29sIGlzQ2FwYWJpbGl0eVN1cHBvcnRlZChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9yZXF1ZXN0X2F2YWlsYWJsZV9jYXBhYmlsaXRpZXNfdCBjYXApIHsKLSAgICAgICAgQUNhbWVyYU1ldGFkYXRhX2NvbnN0X2VudHJ5IGVudHJ5OwotICAgICAgICBBQ2FtZXJhTWV0YWRhdGFfZ2V0Q29uc3RFbnRyeShtQ2FtZXJhTWV0YWRhdGEsIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW50cnkpOwotICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZW50cnkuY291bnQ7IGkrKykgewotICAgICAgICAgICAgaWYgKGVudHJ5LmRhdGEudThbaV0gPT0gY2FwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJvb2wgaXNDYW1lcmFSZWFkeSgpIHsgcmV0dXJuIG1Jc0NhbWVyYVJlYWR5OyB9Ci0KLSAgICB2b2lkIGNsb3NlQ2FtZXJhKCkgewotICAgICAgICAvLyBEZXN0cm95IGNhcHR1cmUgcmVxdWVzdAotICAgICAgICBpZiAobVJlcUltZ1JlYWRlck91dHB1dCkgewotICAgICAgICAgICAgQUNhbWVyYU91dHB1dFRhcmdldF9mcmVlKG1SZXFJbWdSZWFkZXJPdXRwdXQpOwotICAgICAgICAgICAgbVJlcUltZ1JlYWRlck91dHB1dCA9IG51bGxwdHI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1DYXB0dXJlUmVxdWVzdCkgewotICAgICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0X2ZyZWUobUNhcHR1cmVSZXF1ZXN0KTsKLSAgICAgICAgICAgIG1DYXB0dXJlUmVxdWVzdCA9IG51bGxwdHI7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gRGVzdHJveSBjYXB0dXJlIHNlc3Npb24KLSAgICAgICAgaWYgKG1TZXNzaW9uICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jbG9zZShtU2Vzc2lvbik7Ci0gICAgICAgICAgICBtU2Vzc2lvbiA9IG51bGxwdHI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1JbWdSZWFkZXJPdXRwdXQpIHsKLSAgICAgICAgICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dF9mcmVlKG1JbWdSZWFkZXJPdXRwdXQpOwotICAgICAgICAgICAgbUltZ1JlYWRlck91dHB1dCA9IG51bGxwdHI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1PdXRwdXRzKSB7Ci0gICAgICAgICAgICBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXJfZnJlZShtT3V0cHV0cyk7Ci0gICAgICAgICAgICBtT3V0cHV0cyA9IG51bGxwdHI7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gRGVzdHJveSBjYW1lcmEgZGV2aWNlCi0gICAgICAgIGlmIChtRGV2aWNlKSB7Ci0gICAgICAgICAgICBBQ2FtZXJhRGV2aWNlX2Nsb3NlKG1EZXZpY2UpOwotICAgICAgICAgICAgbURldmljZSA9IG51bGxwdHI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1DYW1lcmFNZXRhZGF0YSkgewotICAgICAgICAgICAgQUNhbWVyYU1ldGFkYXRhX2ZyZWUobUNhbWVyYU1ldGFkYXRhKTsKLSAgICAgICAgICAgIG1DYW1lcmFNZXRhZGF0YSA9IG51bGxwdHI7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gRGVzdHJveSBjYW1lcmEgbWFuYWdlcgotICAgICAgICBpZiAobUNhbWVyYUlkTGlzdCkgewotICAgICAgICAgICAgQUNhbWVyYU1hbmFnZXJfZGVsZXRlQ2FtZXJhSWRMaXN0KG1DYW1lcmFJZExpc3QpOwotICAgICAgICAgICAgbUNhbWVyYUlkTGlzdCA9IG51bGxwdHI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1DYW1lcmFNYW5hZ2VyKSB7Ci0gICAgICAgICAgICBBQ2FtZXJhTWFuYWdlcl9kZWxldGUobUNhbWVyYU1hbmFnZXIpOwotICAgICAgICAgICAgbUNhbWVyYU1hbmFnZXIgPSBudWxscHRyOwotICAgICAgICB9Ci0gICAgICAgIG1Jc0NhbWVyYVJlYWR5ID0gZmFsc2U7Ci0gICAgfQotCi0gICAgaW50IHRha2VQaWN0dXJlKCkgewotICAgICAgICByZXR1cm4gQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmUobVNlc3Npb24sIG51bGxwdHIsIDEsICZtQ2FwdHVyZVJlcXVlc3QsIG51bGxwdHIpOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIG9uRGV2aWNlRGlzY29ubmVjdGVkKHZvaWQqIC8qb2JqKi8sIEFDYW1lcmFEZXZpY2UqIC8qZGV2aWNlKi8pIHt9Ci0KLSAgICBzdGF0aWMgdm9pZCBvbkRldmljZUVycm9yKHZvaWQqIC8qb2JqKi8sIEFDYW1lcmFEZXZpY2UqIC8qZGV2aWNlKi8sIGludCAvKmVycm9yQ29kZSovKSB7fQotCi0gICAgc3RhdGljIHZvaWQgb25TZXNzaW9uQ2xvc2VkKHZvaWQqIC8qb2JqKi8sIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogLypzZXNzaW9uKi8pIHt9Ci0KLSAgICBzdGF0aWMgdm9pZCBvblNlc3Npb25SZWFkeSh2b2lkKiAvKm9iaiovLCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIC8qc2Vzc2lvbiovKSB7fQotCi0gICAgc3RhdGljIHZvaWQgb25TZXNzaW9uQWN0aXZlKHZvaWQqIC8qb2JqKi8sIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogLypzZXNzaW9uKi8pIHt9Ci0KLSAgcHJpdmF0ZToKLSAgICBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzIG1EZXZpY2VDYnt0aGlzLCBvbkRldmljZURpc2Nvbm5lY3RlZCwgb25EZXZpY2VFcnJvcn07Ci0gICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX3N0YXRlQ2FsbGJhY2tzIG1TZXNzaW9uQ2J7dGhpcywgb25TZXNzaW9uQ2xvc2VkLCBvblNlc3Npb25SZWFkeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblNlc3Npb25BY3RpdmV9OwotCi0gICAgQU5hdGl2ZVdpbmRvdyogbUltZ1JlYWRlckFud3tudWxscHRyfTsgIC8vIG5vdCBvd25lZCBieSB1cy4KLQotICAgIC8vIENhbWVyYSBtYW5hZ2VyCi0gICAgQUNhbWVyYU1hbmFnZXIqIG1DYW1lcmFNYW5hZ2Vye251bGxwdHJ9OwotICAgIEFDYW1lcmFJZExpc3QqIG1DYW1lcmFJZExpc3R7bnVsbHB0cn07Ci0gICAgLy8gQ2FtZXJhIGRldmljZQotICAgIEFDYW1lcmFNZXRhZGF0YSogbUNhbWVyYU1ldGFkYXRhe251bGxwdHJ9OwotICAgIEFDYW1lcmFEZXZpY2UqIG1EZXZpY2V7bnVsbHB0cn07Ci0gICAgLy8gQ2FwdHVyZSBzZXNzaW9uCi0gICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyKiBtT3V0cHV0c3tudWxscHRyfTsKLSAgICBBQ2FwdHVyZVNlc3Npb25PdXRwdXQqIG1JbWdSZWFkZXJPdXRwdXR7bnVsbHB0cn07Ci0gICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiBtU2Vzc2lvbntudWxscHRyfTsKLSAgICAvLyBDYXB0dXJlIHJlcXVlc3QKLSAgICBBQ2FwdHVyZVJlcXVlc3QqIG1DYXB0dXJlUmVxdWVzdHtudWxscHRyfTsKLSAgICBBQ2FtZXJhT3V0cHV0VGFyZ2V0KiBtUmVxSW1nUmVhZGVyT3V0cHV0e251bGxwdHJ9OwotCi0gICAgYm9vbCBtSXNDYW1lcmFSZWFkeXtmYWxzZX07Ci0gICAgY29uc3QgY2hhciogbUNhbWVyYUlke251bGxwdHJ9OwotfTsKLQotY2xhc3MgSW1hZ2VSZWFkZXJIZWxwZXIgewotICBwdWJsaWM6Ci0gICAgdXNpbmcgSW1hZ2VQdHIgPSBzdGQ6OnVuaXF1ZV9wdHI8QUltYWdlLCBkZWNsdHlwZSgmQUltYWdlX2RlbGV0ZSk+OwotCi0gICAgSW1hZ2VSZWFkZXJIZWxwZXIoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIGludDMyX3QgZm9ybWF0LCB1aW50NjRfdCB1c2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1heEltYWdlcykKLSAgICAgICAgOiBtV2lkdGgod2lkdGgpLCBtSGVpZ2h0KGhlaWdodCksIG1Gb3JtYXQoZm9ybWF0KSwgbVVzYWdlKHVzYWdlKSwgbU1heEltYWdlcyhtYXhJbWFnZXMpIHt9Ci0KLSAgICB+SW1hZ2VSZWFkZXJIZWxwZXIoKSB7Ci0gICAgICAgIG1BY3F1aXJlZEltYWdlLnJlc2V0KCk7Ci0gICAgICAgIGlmIChtSW1nUmVhZGVyQW53KSB7Ci0gICAgICAgICAgICBBSW1hZ2VSZWFkZXJfZGVsZXRlKG1JbWdSZWFkZXIpOwotICAgICAgICAgICAgLy8gTm8gbmVlZCB0byBjYWxsIEFOYXRpdmVXaW5kb3dfcmVsZWFzZSBvbiBpbWFnZVJlYWRlckFudwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaW50IGluaXRJbWFnZVJlYWRlcigpIHsKLSAgICAgICAgaWYgKG1JbWdSZWFkZXIgIT0gbnVsbHB0ciB8fCBtSW1nUmVhZGVyQW53ICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIEFMT0dFKCJDYW5ub3QgcmUtaW5pdGFsaXplIGltYWdlIHJlYWRlciwgbUltZ1JlYWRlcj0lcCwgbUltZ1JlYWRlckFudz0lcCIsIG1JbWdSZWFkZXIsCi0gICAgICAgICAgICAgICAgICBtSW1nUmVhZGVyQW53KTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCByZXQgPQotICAgICAgICAgICAgQUltYWdlUmVhZGVyX25ld1dpdGhVc2FnZShtV2lkdGgsIG1IZWlnaHQsIG1Gb3JtYXQsIG1Vc2FnZSwgbU1heEltYWdlcywgJm1JbWdSZWFkZXIpOwotICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSyB8fCBtSW1nUmVhZGVyID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlIG5ldyBBSW1hZ2VSZWFkZXIsIHJldD0lZCwgbUltZ1JlYWRlcj0lcCIsIHJldCwgbUltZ1JlYWRlcik7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICByZXQgPSBBSW1hZ2VSZWFkZXJfc2V0SW1hZ2VMaXN0ZW5lcihtSW1nUmVhZGVyLCAmbVJlYWRlckF2YWlsYWJsZUNiKTsKLSAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IGltYWdlIGF2YWlsYWJsZSBsaXN0ZW5lciwgcmV0PSVkLiIsIHJldCk7Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0ID0gQUltYWdlUmVhZGVyX2dldFdpbmRvdyhtSW1nUmVhZGVyLCAmbUltZ1JlYWRlckFudyk7Ci0gICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LIHx8IG1JbWdSZWFkZXJBbncgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgQU5hdGl2ZVdpbmRvdyBmcm9tIEFJbWFnZVJlYWRlciwgcmV0PSVkLCBtSW1nUmVhZGVyQW53PSVwLiIsIHJldCwKLSAgICAgICAgICAgICAgICAgIG1JbWdSZWFkZXJBbncpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgQU5hdGl2ZVdpbmRvdyogZ2V0TmF0aXZlV2luZG93KCkgeyByZXR1cm4gbUltZ1JlYWRlckFudzsgfQotCi0gICAgaW50IGdldEJ1ZmZlckZyb21DdXJyZW50SW1hZ2UoQUhhcmR3YXJlQnVmZmVyKiogb3V0QnVmZmVyKSB7Ci0gICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7Ci0KLSAgICAgICAgaW50IHJldCA9IDA7Ci0gICAgICAgIHVpbnQ4X3QqIGRhdGE7Ci0gICAgICAgIGludCBkYXRhX3NpemU7Ci0gICAgICAgIGlmIChtQXZhaWxhYmxlSW1hZ2VzID4gMCkgewotICAgICAgICAgICAgQUltYWdlKiBvdXRJbWFnZSA9IG51bGxwdHI7Ci0KLSAgICAgICAgICAgIG1BdmFpbGFibGVJbWFnZXMgLT0gMTsKLQotICAgICAgICAgICAgcmV0ID0gQUltYWdlUmVhZGVyX2FjcXVpcmVOZXh0SW1hZ2UobUltZ1JlYWRlciwgJm91dEltYWdlKTsKLSAgICAgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LIHx8IG91dEltYWdlID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSBCdWZmZXJRdWV1ZSBpcyBpbiBhc3luYyBtb2RlLCBpdCBpcyBzdGlsbCBwb3NzaWJsZSB0aGF0Ci0gICAgICAgICAgICAgICAgLy8gQUltYWdlUmVhZGVyX2FjcXVpcmVOZXh0SW1hZ2UgcmV0dXJucyBub3RoaW5nIGFmdGVyIG9uRnJhbWVBdmFpbGFibGUuCi0gICAgICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byBhY3F1aXJlIGltYWdlLCByZXQ9JWQsIG91dElhbWdlPSVwLiIsIHJldCwgb3V0SW1hZ2UpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBBbnkgZXhpc2l0bmcgaW4gbUFjcXVpcmVkSW1hZ2Ugd2lsbCBiZSBkZWxldGVkIGFuZCByZWxlYXNlZCBhdXRvbWF0aWNhbGx5LgotICAgICAgICAgICAgICAgIG1BY3F1aXJlZEltYWdlLnJlc2V0KG91dEltYWdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEV4cGVjdGVkIGdldFBsYW5lRGF0YSB0byBmYWlsIGZvciBBSU1BR0VfRk9STUFUX1BSSVYsIGlmIG5vdCB0aGVuCi0gICAgICAgICAgICAvLyByZXR1cm4gZXJyb3IKLSAgICAgICAgICAgIHJldCA9IEFJbWFnZV9nZXRQbGFuZURhdGEob3V0SW1hZ2UsIDAsICZkYXRhLCAmZGF0YV9zaXplKTsKLSAgICAgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX0lNR1JFQURFUl9DQU5OT1RfTE9DS19JTUFHRSkKLSAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUFjcXVpcmVkSW1hZ2UgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgcmV0dXJuIC1FQUdBSU47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBOb3RlIHRoYXQgQUltYWdlX2dldEhhcmR3YXJlQnVmZmVyIGlzIG5vdCBhY3F1aXJpbmcgYWRkaXRpb25hbCByZWZlcmVuY2UgdG8gdGhlIGJ1ZmZlciwKLSAgICAgICAgLy8gc28gd2UgY2FuIHJldHVybiBpdCBoZXJlIGFueSB0aW1lcyB3ZSB3YW50IHdpdGhvdXQgd29ycnlpbmcgYWJvdXQgcmVsZWFzaW5nLgotICAgICAgICBBSGFyZHdhcmVCdWZmZXIqIGJ1ZmZlciA9IG51bGxwdHI7Ci0gICAgICAgIHJldCA9IEFJbWFnZV9nZXRIYXJkd2FyZUJ1ZmZlcihtQWNxdWlyZWRJbWFnZS5nZXQoKSwgJmJ1ZmZlcik7Ci0gICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LIHx8IGJ1ZmZlciA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRmFpbGQgdG8gZ2V0IGhhcmR3YXJlIGJ1ZmZlciwgcmV0PSVkLCBvdXRCdWZmZXI9JXAuIiwgcmV0LCBidWZmZXIpOwotICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07Ci0gICAgICAgIH0KLQotICAgICAgICAqb3V0QnVmZmVyID0gYnVmZmVyOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICB2b2lkIGhhbmRsZUltYWdlQXZhaWxhYmxlKCkgewotICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOwotCi0gICAgICAgIG1BdmFpbGFibGVJbWFnZXMgKz0gMTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBvbkltYWdlQXZhaWxhYmxlKHZvaWQqIG9iaiwgQUltYWdlUmVhZGVyKikgewotICAgICAgICBJbWFnZVJlYWRlckhlbHBlciogdGhpeiA9IHJlaW50ZXJwcmV0X2Nhc3Q8SW1hZ2VSZWFkZXJIZWxwZXIqPihvYmopOwotICAgICAgICB0aGl6LT5oYW5kbGVJbWFnZUF2YWlsYWJsZSgpOwotICAgIH0KLQotICBwcml2YXRlOgotICAgIGludDMyX3QgbVdpZHRoOwotICAgIGludDMyX3QgbUhlaWdodDsKLSAgICBpbnQzMl90IG1Gb3JtYXQ7Ci0gICAgdWludDY0X3QgbVVzYWdlOwotICAgIHVpbnQzMl90IG1NYXhJbWFnZXM7Ci0KLSAgICBzdGQ6Om11dGV4IG1NdXRleDsKLSAgICAvLyBOdW1iZXIgb2YgaW1hZ2VzIHRoYXQncyBhdmFpYWJsZSBmb3IgYWNxdWlyZS4KLSAgICBzaXplX3QgbUF2YWlsYWJsZUltYWdlc3swfTsKLSAgICAvLyBBbHRob3VnaCBBSW1hZ2VSZWFkZXIgc3VwcG9ydHMgYWNxdWlyaW5nIG11bHRpcGxlIGltYWdlcyBhdCBhIHRpbWUsIHdlIGRvbid0IHJlYWxseSBuZWVkIGl0Ci0gICAgLy8gaW4gdGhpcyB0ZXN0LiBXZSBvbmx5IGFjcXVpcmUgb25lIGltYWdlIHRoYXQgYSB0aW1lLgotICAgIEltYWdlUHRyIG1BY3F1aXJlZEltYWdle251bGxwdHIsIEFJbWFnZV9kZWxldGV9OwotCi0gICAgQUltYWdlUmVhZGVyKiBtSW1nUmVhZGVye251bGxwdHJ9OwotICAgIEFOYXRpdmVXaW5kb3cqIG1JbWdSZWFkZXJBbnd7bnVsbHB0cn07Ci0KLSAgICBBSW1hZ2VSZWFkZXJfSW1hZ2VMaXN0ZW5lciBtUmVhZGVyQXZhaWxhYmxlQ2J7dGhpcywgb25JbWFnZUF2YWlsYWJsZX07Ci19OwotCiBjbGFzcyBDYW1lcmFGcmFtZVJlbmRlcmVyIHsKICAgcHVibGljOgogICAgIENhbWVyYUZyYW1lUmVuZGVyZXIoKQpAQCAtNjMzLDggKzMxMSw4IEBACiAKIGJvb2wgaXNDYW1lcmFSZWFkeShKTklFbnYqLCBqY2xhc3MsIGpsb25nIHJlbmRlcmVyKSB7CiAgICAgaWYgKHJlbmRlcmVyID09IDApIHsKLSAgICAgICAgQUxPR0UoIkludmFsaWQgcmVuZGVyZXIuIik7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICBBTE9HRSgiaXNDYW1lcmFSZWFkeTogSW52YWxpZCByZW5kZXJlcjogbnVsbHB0ci4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIHJldHVybiBuYXRpdmUocmVuZGVyZXIpLT5pc0NhbWVyYVJlYWR5KCk7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9qbmkvYW5kcm9pZF9ncmFwaGljc19jdHNfQ2FtZXJhVnVsa2FuR3B1VGVzdC5jcHAgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9qbmkvYW5kcm9pZF9ncmFwaGljc19jdHNfQ2FtZXJhVnVsa2FuR3B1VGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ3MjFjMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL2puaS9hbmRyb2lkX2dyYXBoaWNzX2N0c19DYW1lcmFWdWxrYW5HcHVUZXN0LmNwcApAQCAtMCwwICsxLDk5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKyNpbmNsdWRlIDxqbmkuaD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJDYW1lcmFUZXN0SGVscGVycy5oIgorI2luY2x1ZGUgIkltYWdlUmVhZGVyVGVzdEhlbHBlcnMuaCIKKyNpbmNsdWRlICJOYXRpdmVUZXN0SGVscGVycy5oIgorI2luY2x1ZGUgIlZ1bGthblRlc3RIZWxwZXJzLmgiCisKK25hbWVzcGFjZSB7CisKKy8vIENvbnN0YW50cyB1c2VkIHRvIGNvbnRyb2wgdGVzdCBleGVjdXRpb24uCitzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGtUZXN0SW1hZ2VXaWR0aCA9IDY0MDsKK3N0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga1Rlc3RJbWFnZUhlaWdodCA9IDQ4MDsKK3N0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga1Rlc3RJbWFnZUZvcm1hdCA9IEFJTUFHRV9GT1JNQVRfUFJJVkFURTsKK3N0YXRpYyBjb25zdGV4cHIgdWludDY0X3Qga1Rlc3RJbWFnZVVzYWdlID0KKyAgICBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfR1BVX1NBTVBMRURfSU1BR0U7CitzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGtUZXN0SW1hZ2VDb3VudCA9IDM7CisKK30gLy8gbmFtZXNwYWNlCisKKy8vIEEgYmFzaWMgdGVzdCB3aGljaCBkb2VzIHRoZSBmb2xsb3dpbmc6CisvLyAxKSBSZWFkcyBhIENhbWVyYSBmcmFtZSBpbnRvIGFuIEFIYXJkd2FyZUJ1ZmZlci4KKy8vIDIpIENyZWF0ZXMgYSBWa0ltYWdlIGZyb20gdGhpcyBBSGFyZHdhcmVCdWZmZXIuCisvLyAzKSBSZW5kZXJzIHRoZSBBSGFyZHdhcmVCdWZmZXIgdG8gYSBWdWxrYW4gUkdCQSBpbnRlcm1lZGlhdGUuCisvLyA0KSBSZWFkcyBiYWNrIHRoZSBpbnRlcm1lZGlhdGUgaW50byBhIENQVSBhY2Nlc3NpYmxlIFZrQnVmZmVyLgorLy8gNSkgVmFsaWRhdGVzIHRoYXQgdGhlcmUgaXMgbm9pc2UgaW4gdGhlIGJ1ZmZlci4KK3N0YXRpYyB2b2lkIGxvYWRDYW1lcmFBbmRWZXJpZnlGcmFtZUltcG9ydChKTklFbnYgKmVudiwgamNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYmplY3QgYXNzZXRNZ3IpIHsKKyAgLy8gSW5pdGlhbGl6ZSBWdWxrYW4uCisgIFZrSW5pdCBpbml0OworICBpZiAoIWluaXQuaW5pdCgpKSB7CisgICAgLy8gQ291bGQgbm90IGluaXRpYWxpemUgVnVsa2FuIGR1ZSB0byBsYWNrIG9mIGRldmljZSBzdXBwb3J0LCBza2lwIHRlc3QuCisgICAgcmV0dXJuOworICB9CisgIFZrSW1hZ2VSZW5kZXJlciByZW5kZXJlcigmaW5pdCwga1Rlc3RJbWFnZVdpZHRoLCBrVGVzdEltYWdlSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNLCA0KTsKKyAgQVNTRVJUKHJlbmRlcmVyLmluaXQoZW52LCBhc3NldE1nciksICJDb3VsZCBub3QgaW5pdCBWa0ltYWdlUmVuZGVyZXIuIik7CisKKyAgLy8gSW5pdGlhbGl6ZSBpbWFnZSByZWFkZXIgYW5kIGNhbWVyYSBoZWxwZXJzLgorICBJbWFnZVJlYWRlckhlbHBlciBpbWFnZVJlYWRlcihrVGVzdEltYWdlV2lkdGgsIGtUZXN0SW1hZ2VIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtUZXN0SW1hZ2VGb3JtYXQsIGtUZXN0SW1hZ2VVc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1Rlc3RJbWFnZUNvdW50KTsKKyAgQ2FtZXJhSGVscGVyIGNhbWVyYTsKKyAgQVNTRVJUKGltYWdlUmVhZGVyLmluaXRJbWFnZVJlYWRlcigpID49IDAsCisgICAgICAgICAiRmFpbGVkIHRvIGluaXRpYWxpemUgaW1hZ2UgcmVhZGVyLiIpOworICBBU1NFUlQoY2FtZXJhLmluaXRDYW1lcmEoaW1hZ2VSZWFkZXIuZ2V0TmF0aXZlV2luZG93KCkpID49IDAsCisgICAgICAgICAiRmFpbGVkIHRvIGluaXRpYWxpemUgY2FtZXJhLiIpOworICBBU1NFUlQoY2FtZXJhLmlzQ2FtZXJhUmVhZHkoKSwgIkNhbWVyYSBpcyBub3QgcmVhZHkuIik7CisKKyAgLy8gQWNxdWlyZSBhbiBBSGFyZHdhcmVCdWZmZXIgZnJvbSB0aGUgY2FtZXJhLgorICBBU1NFUlQoY2FtZXJhLnRha2VQaWN0dXJlKCkgPj0gMCwgIkNhbWVyYSBmYWlsZWQgdG8gdGFrZSBwaWN0dXJlLiIpOworICBBSGFyZHdhcmVCdWZmZXIgKmJ1ZmZlcjsKKyAgaW50IHJldCA9IGltYWdlUmVhZGVyLmdldEJ1ZmZlckZyb21DdXJyZW50SW1hZ2UoJmJ1ZmZlcik7CisgIHdoaWxlIChyZXQgIT0gMCkgeworICAgIHVzbGVlcCgxMDAwKTsKKyAgICByZXQgPSBpbWFnZVJlYWRlci5nZXRCdWZmZXJGcm9tQ3VycmVudEltYWdlKCZidWZmZXIpOworICB9CisKKyAgLy8gSW1wb3IgdGhlIEFIYXJkd2FyZUJ1ZmZlciBpbnRvIFZ1bGthbi4KKyAgVmtBSGFyZHdhcmVCdWZmZXJJbWFnZSB2a0ltYWdlKCZpbml0KTsKKyAgQVNTRVJUKHZrSW1hZ2UuaW5pdChidWZmZXIsIHRydWUgLyogdXNlRXh0ZXJuYWxGb3JtYXQgKi8pLCAiQ291bGQgbm90IGluaXRpYWxpemUgVmtBSGFyZHdhcmVCdWZmZXJJbWFnZS4iKTsKKworICAvLyBSZW5kZXIgdGhlIEFIYXJkd2FyZUJ1ZmZlciB1c2luZyBWdWxrYW4gYW5kIHJlYWQgYmFjayB0aGUgcmVzdWx0LgorICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gaW1hZ2VEYXRhOworICBBU1NFUlQocmVuZGVyZXIucmVuZGVySW1hZ2VBbmRSZWFkYmFjaygKKyAgICAgICAgICAgICB2a0ltYWdlLmltYWdlKCksIHZrSW1hZ2Uuc2FtcGxlcigpLCB2a0ltYWdlLnZpZXcoKSwKKyAgICAgICAgICAgICB2a0ltYWdlLnNlbWFwaG9yZSgpLCB2a0ltYWdlLmlzU2FtcGxlckltbXV0YWJsZSgpLCAmaW1hZ2VEYXRhKSwKKyAgICAgICAgICJDb3VsZCBub3QgcmVuZGVyL3JlYWQtYmFjayBWdWxrYW4gcGl4ZWxzLiIpOworCisgIC8vIFRPRE8oYi8xMTAwMjU3NzkpOiBXZSBzaG91bGQgZmluZCBhIHdheSB0byB2YWxpZGF0ZSBwaXhlbHMuCit9CisKK3N0YXRpYyBKTklOYXRpdmVNZXRob2QgZ01ldGhvZHNbXSA9IHsKKyAgICB7ImxvYWRDYW1lcmFBbmRWZXJpZnlGcmFtZUltcG9ydCIsICIoTGFuZHJvaWQvY29udGVudC9yZXMvQXNzZXRNYW5hZ2VyOylWIiwKKyAgICAgKHZvaWQgKilsb2FkQ2FtZXJhQW5kVmVyaWZ5RnJhbWVJbXBvcnR9LAorfTsKKworaW50IHJlZ2lzdGVyX2FuZHJvaWRfZ3JhcGhpY3NfY3RzX0NhbWVyYVZ1bGthbkdwdVRlc3QoSk5JRW52ICplbnYpIHsKKyAgamNsYXNzIGNsYXp6ID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvZ3JhcGhpY3MvY3RzL0NhbWVyYVZ1bGthbkdwdVRlc3QiKTsKKyAgcmV0dXJuIGVudi0+UmVnaXN0ZXJOYXRpdmVzKGNsYXp6LCBnTWV0aG9kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihnTWV0aG9kcykgLyBzaXplb2YoSk5JTmF0aXZlTWV0aG9kKSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9qbmkvYW5kcm9pZF9ncmFwaGljc19jdHNfTWVkaWFWdWxrYW5HcHVUZXN0LmNwcCBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL2puaS9hbmRyb2lkX2dyYXBoaWNzX2N0c19NZWRpYVZ1bGthbkdwdVRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNTcwYTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9qbmkvYW5kcm9pZF9ncmFwaGljc19jdHNfTWVkaWFWdWxrYW5HcHVUZXN0LmNwcApAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKKyNpbmNsdWRlIDxhbmRyb2lkL2xvZy5oPgorI2luY2x1ZGUgPGpuaS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAiSW1hZ2VSZWFkZXJUZXN0SGVscGVycy5oIgorI2luY2x1ZGUgIk1lZGlhVGVzdEhlbHBlcnMuaCIKKyNpbmNsdWRlICJOYXRpdmVUZXN0SGVscGVycy5oIgorI2luY2x1ZGUgIlZ1bGthblRlc3RIZWxwZXJzLmgiCisKK25hbWVzcGFjZSB7CisKK3N0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga1Rlc3RJbWFnZVdpZHRoID0gMTkyMDsKK3N0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga1Rlc3RJbWFnZUhlaWdodCA9IDEwODA7CitzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGtUZXN0SW1hZ2VGb3JtYXQgPSBBSU1BR0VfRk9STUFUX1lVVl80MjBfODg4Oworc3RhdGljIGNvbnN0ZXhwciB1aW50NjRfdCBrVGVzdEltYWdlVXNhZ2UgPQorICAgIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9HUFVfU0FNUExFRF9JTUFHRTsKK3N0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga1Rlc3RJbWFnZUNvdW50ID0gMzsKKworLy8gQ29uZmlybXMgdGhhdCB0aGUgdHdvIHZhbHVlcyBtYXRjaCwgYWxsb3dpbmcgZm9yIGFuIGVycm9yIG9mIHRvbGVyYW5jZSBwZXIKKy8vIGNoYW5uZWwuCitib29sIGZ1enp5TWF0Y2godWludDMyX3QgdmFsdWUxLCB1aW50MzJfdCB2YWx1ZTIsIGludDMyX3QgdG9sZXJhbmNlKSB7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgc2l6ZV90IHNoaWZ0ID0gOCAqIGk7CisgICAgdWludDMyX3QgbWFzayA9IDB4MDAwMDAwRkYgPDwgc2hpZnQ7CisKKyAgICBpbnQzMl90IHZhbHVlMU1hc2tlZCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KCh2YWx1ZTEgJiBtYXNrKSA+PiBzaGlmdCk7CisgICAgaW50MzJfdCB2YWx1ZTJNYXNrZWQgPSBzdGF0aWNfY2FzdDxpbnQzMl90PigodmFsdWUyICYgbWFzaykgPj4gc2hpZnQpOworCisgICAgaWYgKHN0ZDo6YWJzKHZhbHVlMU1hc2tlZCAtIHZhbHVlMk1hc2tlZCkgPiB0b2xlcmFuY2UpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKwordWludDMyX3Qgc3dpenpsZUJncmFUb1JnYmEodWludDMyX3QgYmdyYSkgeworICB1aW50MzJfdCByZXN1bHQgPSAwOworICByZXN1bHQgfD0gKGJncmEgJiAweEZGMDAwMDAwKSA+PiAwOyAgLy8gQWxwaGEKKyAgcmVzdWx0IHw9IChiZ3JhICYgMHgwMEZGMDAwMCkgPj4gMTY7IC8vIFJlZAorICByZXN1bHQgfD0gKGJncmEgJiAweDAwMDBGRjAwKSA+PiAwOyAgLy8gR3JlZW4KKyAgcmVzdWx0IHw9IChiZ3JhICYgMHgwMDAwMDBGRikgPDwgMTY7IC8vIEJsdWUKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworfSAvLyBuYW1lc3BhY2UKKworLy8gQSBWdWxrYW4gbWVkaWEgaW1wb3J0IHRlc3Qgd2hpY2ggZG9lcyB0aGUgZm9sbG93aW5nOgorLy8gMSkgUmVhZHMgdGhlIGZpcnN0IGZyYW1lIGZyb20gYSB2aWRlbyBhcyBhbiBBSGFyZHdhcmVCdWZmZXIuCisvLyAyKSBDcmVhdGVzIGEgVmtJbWFnZSBmcm9tIHRoaXMgQUhhcmR3YXJlQnVmZmVyLgorLy8gMykgUmVuZGVycyB0aGUgQUhhcmR3YXJlQnVmZmVyIHRvIGEgVnVsa2FuIFJHQkEgaW50ZXJtZWRpYXRlLgorLy8gNCkgUmVhZHMgYmFjayB0aGUgaW50ZXJtZWRpYXRlIGludG8gYSBDUFUgYWNjZXNzaWJsZSBWa0J1ZmZlci4KKy8vIDUpIFZhbGlkYXRlcyB0aGF0IHRoZSB2YWx1ZXMgYXJlIGFzIGV4cGVjdGVkLgorc3RhdGljIHZvaWQgbG9hZE1lZGlhQW5kVmVyaWZ5RnJhbWVJbXBvcnQoSk5JRW52ICplbnYsIGpjbGFzcywgam9iamVjdCBhc3NldE1nciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzdHJpbmcgamZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludEFycmF5IHJlZmVyZW5jZVBpeGVscykgeworICAvLyBTZXQgdXAgVnVsa2FuLgorICBWa0luaXQgaW5pdDsKKyAgaWYgKCFpbml0LmluaXQoKSkgeworICAgIC8vIENvdWxkIG5vdCBpbml0aWFsaXplIFZ1bGthbiBkdWUgdG8gbGFjayBvZiBkZXZpY2Ugc3VwcG9ydCwgc2tpcCB0ZXN0LgorICAgIHJldHVybjsKKyAgfQorCisgIC8vIFNldCB1cCB0aGUgaW1hZ2UgcmVhZGVyIGFuZCBtZWRpYSBoZWxwZXJzIHVzZWQgdG8gZ2V0IGEgZnJhbWVzIGZyb20gdmlkZW8uCisgIEltYWdlUmVhZGVySGVscGVyIGltYWdlUmVhZGVyKGtUZXN0SW1hZ2VXaWR0aCwga1Rlc3RJbWFnZUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1Rlc3RJbWFnZUZvcm1hdCwga1Rlc3RJbWFnZVVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVGVzdEltYWdlQ291bnQpOworICBBU1NFUlQoaW1hZ2VSZWFkZXIuaW5pdEltYWdlUmVhZGVyKCkgPj0gMCwKKyAgICAgICAgICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBpbWFnZSByZWFkZXIuIik7CisgIE1lZGlhSGVscGVyIG1lZGlhOworICBBU1NFUlQobWVkaWEuaW5pdChlbnYsIGFzc2V0TWdyLCBqZmlsZW5hbWUsIGltYWdlUmVhZGVyLmdldE5hdGl2ZVdpbmRvdygpKSwKKyAgICAgICAgICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBtZWRpYSBjb2RlYy4iKTsKKworICAvLyBHZXQgYW4gQUhhcmR3YXJlQnVmZmVyIGZvciB0aGUgZmlyc3QgZnJhbWUgb2YgdGhlIHZpZGVvLgorICBBU1NFUlQobWVkaWEucHJvY2Vzc09uZUZyYW1lKCksCisgICAgICAgICAiQ291bGQgbm90IGdldCBhIG1lZGlhIGZyYW1lIHRvIGltcG9ydCBpbnRvIFZ1bGthbi4iKTsKKyAgQUhhcmR3YXJlQnVmZmVyICpidWZmZXI7CisgIGludCByZXQgPSBpbWFnZVJlYWRlci5nZXRCdWZmZXJGcm9tQ3VycmVudEltYWdlKCZidWZmZXIpOworICB3aGlsZSAocmV0ICE9IDApIHsKKyAgICB1c2xlZXAoMTAwMCk7CisgICAgcmV0ID0gaW1hZ2VSZWFkZXIuZ2V0QnVmZmVyRnJvbUN1cnJlbnRJbWFnZSgmYnVmZmVyKTsKKyAgfQorCisgIC8vIFJlYWQgdGhlIHdpZHRoL2hlaWdodCBvZiB0aGUgcHJvZHVjZWQgQUhhcmR3YXJlQnVmZmVyLiBBSW1hZ2VSZWFkZXIgbWF5IHJvdW5kIHVwIGZyb20gb3VyCisgIC8vIGV4cGVjdGVkIHZpZGVvIHNpemUuCisgIEFIYXJkd2FyZUJ1ZmZlcl9EZXNjIGJ1ZmZlckRlc2M7CisgIEFIYXJkd2FyZUJ1ZmZlcl9kZXNjcmliZShidWZmZXIsICZidWZmZXJEZXNjKTsKKyAgLy8gVGhlIEFJbWFnZVJlYWRlciBtYXkgcm91bmQgdXAgdGhlIHNpemUgb2YgdGhlIEFIYXJkd2FyZUJ1ZmZlciByZXR1cm5lZC4KKyAgQVNTRVJUKGJ1ZmZlckRlc2Mud2lkdGggPj0ga1Rlc3RJbWFnZVdpZHRoLCAiVW5leHBlY3RlZGx5IHNtYWxsIGltYWdlIHdpZHRoIHJlYWQgZnJvbSB2aWRlby4iKTsKKyAgQVNTRVJUKGJ1ZmZlckRlc2MuaGVpZ2h0ID49IGtUZXN0SW1hZ2VIZWlnaHQsICJVbmV4cGVjdGVkbHkgc21hbGwgaW1hZ2UgaGVpZ2h0IHJlYWQgZnJvbSB2aWRlby4iKTsKKworICAvLyBDcmVhdGUgYSBWa0ltYWdlUmVuZGVyZXIgd2l0aCB0aGUgYWN0dWFsIHdpZHRoL2hlaWdodCBvZiB0aGUgQUhhcmR3YXJlQnVmZmVyLgorICBWa0ltYWdlUmVuZGVyZXIgcmVuZGVyZXIoJmluaXQsIGJ1ZmZlckRlc2Mud2lkdGgsIGJ1ZmZlckRlc2MuaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNLCA0KTsKKyAgQVNTRVJUKHJlbmRlcmVyLmluaXQoZW52LCBhc3NldE1nciksICJDb3VsZCBub3QgaW5pdCBWa0ltYWdlUmVuZGVyZXIuIik7CisKKyAgLy8gSW1wb3J0IHRoZSBBSGFyZHdhcmVCdWZmZXIgaW50byBWdWxrYW4uCisgIFZrQUhhcmR3YXJlQnVmZmVySW1hZ2UgdmtJbWFnZSgmaW5pdCk7CisgIEFTU0VSVCh2a0ltYWdlLmluaXQoYnVmZmVyLCB0cnVlIC8qIHVzZUV4dGVybmFsRm9ybWF0ICovKSwKKyAgICAgICAgICJDb3VsZCBub3QgaW5pdCBWa0FIYXJkd2FyZUJ1ZmZlckltYWdlLiIpOworCisgIC8vIFJlbmRlciB0aGUgQUhhcmR3YXJlQnVmZmVyIHVzaW5nIFZ1bGthbiBhbmQgcmVhZCBiYWNrIHRoZSByZXN1bHQuCisgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBmcmFtZVBpeGVsczsKKyAgQVNTRVJUKHJlbmRlcmVyLnJlbmRlckltYWdlQW5kUmVhZGJhY2soCisgICAgICAgICAgICAgdmtJbWFnZS5pbWFnZSgpLCB2a0ltYWdlLnNhbXBsZXIoKSwgdmtJbWFnZS52aWV3KCksCisgICAgICAgICAgICAgdmtJbWFnZS5zZW1hcGhvcmUoKSwgdmtJbWFnZS5pc1NhbXBsZXJJbW11dGFibGUoKSwgJmZyYW1lUGl4ZWxzKSwKKyAgICAgICAgICJDb3VsZCBub3QgZ2V0IGZyYW1lIHBpeGVscyBmcm9tIFZ1bGthbi4iKTsKKyAgQVNTRVJUKGZyYW1lUGl4ZWxzLnNpemUoKSA9PSBidWZmZXJEZXNjLndpZHRoICogYnVmZmVyRGVzYy5oZWlnaHQsCisgICAgICAgICAiVW5leHBlY3RlZCBudW1iZXIgb2YgcGl4ZWxzIGluIGZyYW1lIik7CisKKyAgLy8gRW5zdXJlIHRoYXQgdGhlIGRhdGEgd2UgcmVhZCBiYWNrIG1hdGNoZXMgb3VyIHJlZmVyZW5jZSBpbWFnZS4KKyAgc2l6ZV90IHJlZmVyZW5jZVNpemUgPQorICAgICAgc3RhdGljX2Nhc3Q8c2l6ZV90PihlbnYtPkdldEFycmF5TGVuZ3RoKHJlZmVyZW5jZVBpeGVscykpOworICBBU1NFUlQocmVmZXJlbmNlU2l6ZSA9PSBrVGVzdEltYWdlV2lkdGggKiBrVGVzdEltYWdlSGVpZ2h0LAorICAgICAgICAgIlVuZXhwZWN0ZWQgbnVtYmVyIG9mIHBpeGVscyBpbiByZWZlcmVuY2UgaW1hZ2UuIik7CisgIHVpbnQzMl90ICpyZWZlcmVuY2VEYXRhID0gcmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCAqPigKKyAgICAgIGVudi0+R2V0SW50QXJyYXlFbGVtZW50cyhyZWZlcmVuY2VQaXhlbHMsIDApKTsKKyAgZm9yICh1aW50MzJfdCB4ID0gMDsgeCA8IGtUZXN0SW1hZ2VXaWR0aDsgKyt4KSB7CisgICAgZm9yICh1aW50MzJfdCB5ID0gMDsgeSA8IGtUZXN0SW1hZ2VIZWlnaHQ7ICsreSkgeworICAgICAgc2l6ZV90IGZyYW1lX29mZnNldCA9IHkgKiBidWZmZXJEZXNjLndpZHRoICsgeDsKKyAgICAgIHNpemVfdCByZWZlcmVuY2Vfb2Zmc2V0ID0geSAqIGtUZXN0SW1hZ2VXaWR0aCArIHg7CisgICAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrVG9sZXJhbmNlID0gMHgzMDsKKyAgICAgIHVpbnQzMl90IHZhbHVlMSA9IGZyYW1lUGl4ZWxzW2ZyYW1lX29mZnNldF07CisgICAgICAvLyBSZWZlcmVuY2UgZGF0YSBpcyBCR1JBLCBWayBkYXRhIGlzIEJHUkEuCisgICAgICB1aW50MzJfdCB2YWx1ZTIgPSBzd2l6emxlQmdyYVRvUmdiYShyZWZlcmVuY2VEYXRhW3JlZmVyZW5jZV9vZmZzZXRdKTsKKyAgICAgIEFTU0VSVChmdXp6eU1hdGNoKHZhbHVlMSwgdmFsdWUyLCBrVG9sZXJhbmNlKSwKKyAgICAgICAgICAgICAiRXhwZWN0ZWQgfjB4JTA4WCBhdCAoJWksJWkpLCBnb3QgMHglMDhYIiwgdmFsdWUyLCB4LCB5LCB2YWx1ZTEpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdNZXRob2RzW10gPSB7CisgICAgeyJsb2FkTWVkaWFBbmRWZXJpZnlGcmFtZUltcG9ydCIsCisgICAgICIoTGFuZHJvaWQvY29udGVudC9yZXMvQXNzZXRNYW5hZ2VyO0xqYXZhL2xhbmcvU3RyaW5nO1tJKVYiLAorICAgICAodm9pZCAqKWxvYWRNZWRpYUFuZFZlcmlmeUZyYW1lSW1wb3J0fSwKK307CisKK2ludCByZWdpc3Rlcl9hbmRyb2lkX2dyYXBoaWNzX2N0c19NZWRpYVZ1bGthbkdwdVRlc3QoSk5JRW52ICplbnYpIHsKKyAgamNsYXNzIGNsYXp6ID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvZ3JhcGhpY3MvY3RzL01lZGlhVnVsa2FuR3B1VGVzdCIpOworICByZXR1cm4gZW52LT5SZWdpc3Rlck5hdGl2ZXMoY2xhenosIGdNZXRob2RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGdNZXRob2RzKSAvIHNpemVvZihKTklOYXRpdmVNZXRob2QpKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL2puaS9hbmRyb2lkX2dyYXBoaWNzX2N0c19TeW5jVGVzdC5jcHAgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9qbmkvYW5kcm9pZF9ncmFwaGljc19jdHNfU3luY1Rlc3QuY3BwCmluZGV4IGFlZWEwMmMuLjEzNzllNDggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL2puaS9hbmRyb2lkX2dyYXBoaWNzX2N0c19TeW5jVGVzdC5jcHAKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvam5pL2FuZHJvaWRfZ3JhcGhpY3NfY3RzX1N5bmNUZXN0LmNwcApAQCAtMTcsNiArMTcsNyBAQAogCiAjZGVmaW5lIExPR19UQUcgIlN5bmNUZXN0IgogCisjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxwb2xsLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL2puaS9hbmRyb2lkX2dyYXBoaWNzX2N0c19WdWxrYW5GZWF0dXJlc1Rlc3QuY3BwIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvam5pL2FuZHJvaWRfZ3JhcGhpY3NfY3RzX1Z1bGthbkZlYXR1cmVzVGVzdC5jcHAKaW5kZXggNzAxOGEzNC4uYTYwZTBhYyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvam5pL2FuZHJvaWRfZ3JhcGhpY3NfY3RzX1Z1bGthbkZlYXR1cmVzVGVzdC5jcHAKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvam5pL2FuZHJvaWRfZ3JhcGhpY3NfY3RzX1Z1bGthbkZlYXR1cmVzVGVzdC5jcHAKQEAgLTE1LDExMyArMTUsMTYgQEAKICAqCiAgKi8KIAotI2RlZmluZSBMT0dfVEFHICJWdWxrYW5GZWF0dXJlc1Rlc3QiCi0KICNpbmNsdWRlIDxhbmRyb2lkL2xvZy5oPgogI2luY2x1ZGUgPGpuaS5oPgogI2luY2x1ZGUgPHZranNvbi5oPgogCi0jZGVmaW5lIEFMT0dJKG1zZywgLi4uKSBcCi0gICAgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19JTkZPLCBMT0dfVEFHLCAobXNnKSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIEFMT0dFKG1zZywgLi4uKSBcCi0gICAgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19FUlJPUiwgTE9HX1RBRywgKG1zZyksIF9fVkFfQVJHU19fKQotCiBuYW1lc3BhY2UgewogCi1jb25zdCBjaGFyKiBrRGVzaXJlZEluc3RhbmNlRXh0ZW5zaW9uc1tdID0gewotICAgICJWS19LSFJfZ2V0X3BoeXNpY2FsX2RldmljZV9wcm9wZXJ0aWVzMiIsCi19OwotCi1Wa1Jlc3VsdCBnZXRWa0pTT04oc3RkOjpzdHJpbmcmIHZranNvbikgewotICAgIFZrUmVzdWx0IHJlc3VsdDsKLQotICAgIHVpbnQzMl90IGF2YWlsYWJsZV9leHRlbnNpb25zX2NvdW50ID0gMDsKLSAgICBzdGQ6OnZlY3RvcjxWa0V4dGVuc2lvblByb3BlcnRpZXM+IGF2YWlsYWJsZV9leHRlbnNpb25zOwotICAgIHJlc3VsdCA9IHZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKG51bGxwdHIgLyogbGF5ZXJOYW1lICovLAotICAgICAgICAgICAgJmF2YWlsYWJsZV9leHRlbnNpb25zX2NvdW50LCBudWxscHRyKTsKLSAgICBpZiAocmVzdWx0ICE9IFZLX1NVQ0NFU1MpIHsKLSAgICAgICAgQUxPR0UoInZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzIGZhaWxlZDogJWQiLCByZXN1bHQpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICBkbyB7Ci0gICAgICAgIGF2YWlsYWJsZV9leHRlbnNpb25zLnJlc2l6ZShhdmFpbGFibGVfZXh0ZW5zaW9uc19jb3VudCk7Ci0gICAgICAgIHJlc3VsdCA9IHZrRW51bWVyYXRlSW5zdGFuY2VFeHRlbnNpb25Qcm9wZXJ0aWVzKG51bGxwdHIgLyogbGF5ZXJOYW1lICovLAotICAgICAgICAgICAgICAgICZhdmFpbGFibGVfZXh0ZW5zaW9uc19jb3VudCwgYXZhaWxhYmxlX2V4dGVuc2lvbnMuZGF0YSgpKTsKLSAgICAgICAgaWYgKHJlc3VsdCA8IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJ2a0VudW1lcmF0ZUluc3RhbmNlRXh0ZW5zaW9uUHJvcGVydGllcyBmYWlsZWQ6ICVkIiwgcmVzdWx0KTsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICB9IHdoaWxlIChyZXN1bHQgPT0gVktfSU5DT01QTEVURSk7Ci0gICAgYXZhaWxhYmxlX2V4dGVuc2lvbnMucmVzaXplKGF2YWlsYWJsZV9leHRlbnNpb25zX2NvdW50KTsKLQotICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIqPiBlbmFibGVfZXh0ZW5zaW9uczsKLSAgICBmb3IgKGF1dG8gbmFtZSA6IGtEZXNpcmVkSW5zdGFuY2VFeHRlbnNpb25zKSB7Ci0gICAgICAgIGlmIChzdGQ6OmZpbmRfaWYoYXZhaWxhYmxlX2V4dGVuc2lvbnMuY2JlZ2luKCksIGF2YWlsYWJsZV9leHRlbnNpb25zLmNlbmQoKSwKLSAgICAgICAgICAgICAgICBbbmFtZV0oY29uc3QgVmtFeHRlbnNpb25Qcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHJjbXAobmFtZSwgcHJvcGVydGllcy5leHRlbnNpb25OYW1lKSA9PSAwOwotICAgICAgICAgICAgICAgIH0pCi0gICAgICAgICAgICAgICAgIT0gYXZhaWxhYmxlX2V4dGVuc2lvbnMuY2VuZCgpKSB7Ci0gICAgICAgICAgICBlbmFibGVfZXh0ZW5zaW9ucy5wdXNoX2JhY2sobmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBjb25zdCBWa0FwcGxpY2F0aW9uSW5mbyBhcHBfaW5mbyA9IHsKLSAgICAgICAgVktfU1RSVUNUVVJFX1RZUEVfQVBQTElDQVRJT05fSU5GTywgbnVsbHB0ciwKLSAgICAgICAgIlZ1bGthbkZlYXR1cmVzVGVzdCIsIDAsICAgIC8qIGFwcCBuYW1lLCB2ZXJzaW9uICovCi0gICAgICAgICJ2a2pzb24iLCAwLCAgICAgICAgICAgICAgICAvKiBlbmdpbmUgbmFtZSwgdmVyc2lvbiAqLwotICAgICAgICBWS19BUElfVkVSU0lPTl8xXzAsCi0gICAgfTsKLSAgICBjb25zdCBWa0luc3RhbmNlQ3JlYXRlSW5mbyBpbnN0YW5jZV9pbmZvID0gewotICAgICAgICBWS19TVFJVQ1RVUkVfVFlQRV9JTlNUQU5DRV9DUkVBVEVfSU5GTywgbnVsbHB0ciwKLSAgICAgICAgMCwgICAgICAgICAgICAgIC8qIGZsYWdzICovCi0gICAgICAgICZhcHBfaW5mbywKLSAgICAgICAgMCwgbnVsbHB0ciwgICAgIC8qIGxheWVycyAqLwotICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oZW5hYmxlX2V4dGVuc2lvbnMuc2l6ZSgpKSwKLSAgICAgICAgZW5hYmxlX2V4dGVuc2lvbnMuZGF0YSgpLAotICAgIH07Ci0gICAgVmtJbnN0YW5jZSBpbnN0YW5jZTsKLSAgICByZXN1bHQgPSB2a0NyZWF0ZUluc3RhbmNlKCZpbnN0YW5jZV9pbmZvLCBudWxscHRyLCAmaW5zdGFuY2UpOwotICAgIGlmIChyZXN1bHQgIT0gVktfU1VDQ0VTUykgewotICAgICAgICBBTE9HRSgidmtDcmVhdGVJbnN0YW5jZSBmYWlsZWQ6ICVkIiwgcmVzdWx0KTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBuZ3B1ID0gMDsKLSAgICByZXN1bHQgPSB2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyhpbnN0YW5jZSwgJm5ncHUsIG51bGxwdHIpOwotICAgIGlmIChyZXN1bHQgIT0gVktfU1VDQ0VTUykgewotICAgICAgICBBTE9HRSgidmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXMgZmFpbGVkOiAlZCIsIHJlc3VsdCk7Ci0gICAgICAgIHZrRGVzdHJveUluc3RhbmNlKGluc3RhbmNlLCBudWxscHRyKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgc3RkOjp2ZWN0b3I8VmtQaHlzaWNhbERldmljZT4gZ3B1cyhuZ3B1LCBWS19OVUxMX0hBTkRMRSk7Ci0gICAgcmVzdWx0ID0gdmtFbnVtZXJhdGVQaHlzaWNhbERldmljZXMoaW5zdGFuY2UsICZuZ3B1LCBncHVzLmRhdGEoKSk7Ci0gICAgaWYgKHJlc3VsdCAhPSBWS19TVUNDRVNTKSB7Ci0gICAgICAgIEFMT0dFKCJ2a0VudW1lcmF0ZVBoeXNpY2FsRGV2aWNlcyBmYWlsZWQ6ICVkIiwgcmVzdWx0KTsKLSAgICAgICAgdmtEZXN0cm95SW5zdGFuY2UoaW5zdGFuY2UsIG51bGxwdHIpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHZranNvbi5hc3NpZ24oIltcbiIpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwLCBuID0gZ3B1cy5zaXplKCk7IGkgPCBuOyBpKyspIHsKLSAgICAgICAgYXV0byBwcm9wcyA9IFZrSnNvbkdldERldmljZShpbnN0YW5jZSwgZ3B1c1tpXSwKLSAgICAgICAgICAgICAgICBpbnN0YW5jZV9pbmZvLmVuYWJsZWRFeHRlbnNpb25Db3VudCwgaW5zdGFuY2VfaW5mby5wcEVuYWJsZWRFeHRlbnNpb25OYW1lcyk7Ci0gICAgICAgIHZranNvbi5hcHBlbmQoVmtKc29uRGV2aWNlVG9Kc29uKHByb3BzKSk7Ci0gICAgICAgIGlmIChpIDwgbiAtIDEpCi0gICAgICAgICAgICB2a2pzb24uYXBwZW5kKCIsXG4iKTsKLSAgICB9Ci0gICAgdmtqc29uLmFwcGVuZCgiXSIpOwotCi0gICAgdmtEZXN0cm95SW5zdGFuY2UoaW5zdGFuY2UsIG51bGxwdHIpOwotCi0gICAgcmV0dXJuIFZLX1NVQ0NFU1M7Ci19Ci0KIGpzdHJpbmcgYW5kcm9pZF9ncmFwaGljc19jdHNfVnVsa2FuRmVhdHVyZXNUZXN0X25hdGl2ZUdldFZrSlNPTihKTklFbnYqIGVudiwKICAgICBqY2xhc3MgLypjbGF6eiovKQogewotICAgIHN0ZDo6c3RyaW5nIHZranNvbjsKLSAgICBpZiAoZ2V0VmtKU09OKHZranNvbikgPCAwKQotICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICBzdGQ6OnN0cmluZyB2a2pzb24oVmtKc29uSW5zdGFuY2VUb0pzb24oVmtKc29uR2V0SW5zdGFuY2UoKSkpOwogICAgIHJldHVybiBlbnYtPk5ld1N0cmluZ1VURih2a2pzb24uY19zdHIoKSk7CiB9CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL2puaS9hbmRyb2lkX2dyYXBoaWNzX2N0c19WdWxrYW5QcmVUcmFuc2Zvcm1DdHNBY3Rpdml0eS5jcHAgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9qbmkvYW5kcm9pZF9ncmFwaGljc19jdHNfVnVsa2FuUHJlVHJhbnNmb3JtQ3RzQWN0aXZpdHkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZmM4NTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9qbmkvYW5kcm9pZF9ncmFwaGljc19jdHNfVnVsa2FuUHJlVHJhbnNmb3JtQ3RzQWN0aXZpdHkuY3BwCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCisjZGVmaW5lIExPR19UQUcgInZ1bGthbiIKKworI2lmbmRlZiBWS19VU0VfUExBVEZPUk1fQU5EUk9JRF9LSFIKKyNkZWZpbmUgVktfVVNFX1BMQVRGT1JNX0FORFJPSURfS0hSCisjZW5kaWYKKworI2luY2x1ZGUgPGFuZHJvaWQvbG9nLmg+CisjaW5jbHVkZSA8am5pLmg+CisjaW5jbHVkZSA8YXJyYXk+CisKKyNpbmNsdWRlICJOYXRpdmVUZXN0SGVscGVycy5oIgorI2luY2x1ZGUgIlZ1bGthblByZVRyYW5zZm9ybVRlc3RIZWxwZXJzLmgiCisKKyNkZWZpbmUgQUxPR0QoLi4uKSBfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX0RFQlVHLCBMT0dfVEFHLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgQUxPR0UoLi4uKSBfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX0VSUk9SLCBMT0dfVEFHLCBfX1ZBX0FSR1NfXykKKworbmFtZXNwYWNlIHsKKworamJvb2xlYW4gdmFsaWRhdGVQaXhlbFZhbHVlcyhKTklFbnYqIGVudiwgamJvb2xlYW4gc2V0UHJlVHJhbnNmb3JtLCBqaW50IHByZVRyYW5zZm9ybUhpbnQpIHsKKyAgICBqY2xhc3MgY2xhenogPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9ncmFwaGljcy9jdHMvVnVsa2FuUHJlVHJhbnNmb3JtVGVzdCIpOworICAgIGptZXRob2RJRCBtaWQgPSBlbnYtPkdldFN0YXRpY01ldGhvZElEKGNsYXp6LCAidmFsaWRhdGVQaXhlbFZhbHVlc0FmdGVyUm90YXRpb24iLCAiKFpJKVoiKTsKKyAgICBpZiAobWlkID09IDApIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBmaW5kIG1ldGhvZCBJRCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBlbnYtPkNhbGxTdGF0aWNCb29sZWFuTWV0aG9kKGNsYXp6LCBtaWQsIHNldFByZVRyYW5zZm9ybSwgcHJlVHJhbnNmb3JtSGludCk7Cit9CisKK3ZvaWQgY3JlYXRlTmF0aXZlVGVzdChKTklFbnYqIGVudiwgamNsYXNzIC8qY2xhenoqLywgam9iamVjdCBqQXNzZXRNYW5hZ2VyLCBqb2JqZWN0IGpTdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgIGpib29sZWFuIHNldFByZVRyYW5zZm9ybSkgeworICAgIEFMT0dEKCJqYm9vbGVhbiBzZXRQcmVUcmFuc2Zvcm0gPSAlZCIsIHNldFByZVRyYW5zZm9ybSk7CisgICAgQVNTRVJUKGpBc3NldE1hbmFnZXIsICJqQXNzZXRNYW5hZ2VyIGlzIE5VTEwiKTsKKyAgICBBU1NFUlQoalN1cmZhY2UsICJqU3VyZmFjZSBpcyBOVUxMIik7CisKKyAgICBEZXZpY2VJbmZvIGRldmljZUluZm87CisgICAgaW50IHByZVRyYW5zZm9ybUhpbnQ7CisgICAgaW50IHJldCA9IGRldmljZUluZm8uaW5pdChlbnYsIGpTdXJmYWNlKTsKKyAgICBBU1NFUlQocmV0ID49IDAsICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBWdWxrYW4gZGV2aWNlIik7CisgICAgaWYgKHJldCA+IDApIHsKKyAgICAgICAgQUxPR0QoIkhhcmR3YXJlIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgdGVzdCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgU3dhcGNoYWluSW5mbyBzd2FwY2hhaW5JbmZvKCZkZXZpY2VJbmZvKTsKKyAgICBBU1NFUlQoIXN3YXBjaGFpbkluZm8uaW5pdChzZXRQcmVUcmFuc2Zvcm0sICZwcmVUcmFuc2Zvcm1IaW50KSwgIkZhaWxlZCB0byBpbml0aWFsaXplIFZ1bGthbiBzd2FwY2hhaW4iKTsKKworICAgIFJlbmRlcmVyIHJlbmRlcmVyKCZkZXZpY2VJbmZvLCAmc3dhcGNoYWluSW5mbyk7CisgICAgQVNTRVJUKCFyZW5kZXJlci5pbml0KGVudiwgakFzc2V0TWFuYWdlciksICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBWdWxrYW4gcmVuZGVyZXIiKTsKKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCAxMjA7ICsraSkgeworICAgICAgICBBU1NFUlQoIXJlbmRlcmVyLmRyYXdGcmFtZSgpLCAiRmFpbGVkIHRvIGRyYXcgZnJhbWUiKTsKKyAgICB9CisKKyAgICBBU1NFUlQodmFsaWRhdGVQaXhlbFZhbHVlcyhlbnYsIHNldFByZVRyYW5zZm9ybSwgcHJlVHJhbnNmb3JtSGludCksICJOb3QgcHJvcGVybHkgcm90YXRlZCIpOworfQorCitjb25zdCBzdGQ6OmFycmF5PEpOSU5hdGl2ZU1ldGhvZCwgMT4gSk5JX01FVEhPRFMgPSB7eworICAgICAgICB7Im5DcmVhdGVOYXRpdmVUZXN0IiwgIihMYW5kcm9pZC9jb250ZW50L3Jlcy9Bc3NldE1hbmFnZXI7TGFuZHJvaWQvdmlldy9TdXJmYWNlO1opViIsCisgICAgICAgICAodm9pZCopY3JlYXRlTmF0aXZlVGVzdH0sCit9fTsKKworfSAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK2ludCByZWdpc3Rlcl9hbmRyb2lkX2dyYXBoaWNzX2N0c19WdWxrYW5QcmVUcmFuc2Zvcm1DdHNBY3Rpdml0eShKTklFbnYqIGVudikgeworICAgIGpjbGFzcyBjbGF6eiA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL2dyYXBoaWNzL2N0cy9WdWxrYW5QcmVUcmFuc2Zvcm1DdHNBY3Rpdml0eSIpOworICAgIHJldHVybiBlbnYtPlJlZ2lzdGVyTmF0aXZlcyhjbGF6eiwgSk5JX01FVEhPRFMuZGF0YSgpLCBKTklfTUVUSE9EUy5zaXplKCkpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL25pbmVwYXRjaF9ub2RwaS45LnBuZyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS1ub2RwaS9uaW5lcGF0Y2hfbm9kcGkuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQwMTlkOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS1ub2RwaS9uaW5lcGF0Y2hfbm9kcGkuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9kcmF3YWJsZV9zY2FsZV9nb2xkZW4ucG5nIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9kcmF3YWJsZV9zY2FsZV9nb2xkZW4ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODMzOWI3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS1ub2RwaS92ZWN0b3JfZHJhd2FibGVfc2NhbGVfZ29sZGVuLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS1ub2RwaS92ZWN0b3JfaWNvbl9hcmN0b19nb2xkZW4ucG5nIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX2FyY3RvX2dvbGRlbi5wbmcKaW5kZXggYTIyZjY3OC4uOWJhN2MwMCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX2FyY3RvX2dvbGRlbi5wbmcKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX2FyY3RvX2dvbGRlbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX2NsaXBfcGF0aF8xX2dvbGRlbi5wbmcgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUtbm9kcGkvdmVjdG9yX2ljb25fY2xpcF9wYXRoXzFfZ29sZGVuLnBuZwppbmRleCBiZTQ4N2QxLi42Y2FmYTg0IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUtbm9kcGkvdmVjdG9yX2ljb25fY2xpcF9wYXRoXzFfZ29sZGVuLnBuZworKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUtbm9kcGkvdmVjdG9yX2ljb25fY2xpcF9wYXRoXzFfZ29sZGVuLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUtbm9kcGkvdmVjdG9yX2ljb25fY3JlYXRlX2dvbGRlbi5wbmcgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUtbm9kcGkvdmVjdG9yX2ljb25fY3JlYXRlX2dvbGRlbi5wbmcKaW5kZXggOTQzZmNlNS4uYjBiNmViNSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX2NyZWF0ZV9nb2xkZW4ucG5nCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS1ub2RwaS92ZWN0b3JfaWNvbl9jcmVhdGVfZ29sZGVuLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUtbm9kcGkvdmVjdG9yX2ljb25fZGVsZXRlX2dvbGRlbi5wbmcgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUtbm9kcGkvdmVjdG9yX2ljb25fZGVsZXRlX2dvbGRlbi5wbmcKaW5kZXggYjQ2MzYzZS4uOWY2MGEzMSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX2RlbGV0ZV9nb2xkZW4ucG5nCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS1ub2RwaS92ZWN0b3JfaWNvbl9kZWxldGVfZ29sZGVuLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUtbm9kcGkvdmVjdG9yX2ljb25fZmlsbHR5cGVfZXZlbm9kZF9nb2xkZW4ucG5nIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX2ZpbGx0eXBlX2V2ZW5vZGRfZ29sZGVuLnBuZwppbmRleCAwMWM0NDVjLi4zZDE0NjMwIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUtbm9kcGkvdmVjdG9yX2ljb25fZmlsbHR5cGVfZXZlbm9kZF9nb2xkZW4ucG5nCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS1ub2RwaS92ZWN0b3JfaWNvbl9maWxsdHlwZV9ldmVub2RkX2dvbGRlbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX2ZpbGx0eXBlX25vbnplcm9fZ29sZGVuLnBuZyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS1ub2RwaS92ZWN0b3JfaWNvbl9maWxsdHlwZV9ub256ZXJvX2dvbGRlbi5wbmcKaW5kZXggNzM5ZWVhMS4uODdmZmNjMSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX2ZpbGx0eXBlX25vbnplcm9fZ29sZGVuLnBuZworKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUtbm9kcGkvdmVjdG9yX2ljb25fZmlsbHR5cGVfbm9uemVyb19nb2xkZW4ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS1ub2RwaS92ZWN0b3JfaWNvbl9ncmFkaWVudF8xX2NsYW1wX2dvbGRlbi5wbmcgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUtbm9kcGkvdmVjdG9yX2ljb25fZ3JhZGllbnRfMV9jbGFtcF9nb2xkZW4ucG5nCmluZGV4IDQ2MTdmNjIuLjg1OWRmN2UgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS1ub2RwaS92ZWN0b3JfaWNvbl9ncmFkaWVudF8xX2NsYW1wX2dvbGRlbi5wbmcKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX2dyYWRpZW50XzFfY2xhbXBfZ29sZGVuLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUtbm9kcGkvdmVjdG9yX2ljb25fZ3JhZGllbnRfMV9nb2xkZW4ucG5nIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX2dyYWRpZW50XzFfZ29sZGVuLnBuZwppbmRleCA0ZDZiODRkLi43OGVmNDJiIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUtbm9kcGkvdmVjdG9yX2ljb25fZ3JhZGllbnRfMV9nb2xkZW4ucG5nCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS1ub2RwaS92ZWN0b3JfaWNvbl9ncmFkaWVudF8xX2dvbGRlbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX2dyYWRpZW50XzJfZ29sZGVuLnBuZyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS1ub2RwaS92ZWN0b3JfaWNvbl9ncmFkaWVudF8yX2dvbGRlbi5wbmcKaW5kZXggYzY1NDBlOC4uMjlhZWU4NSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX2dyYWRpZW50XzJfZ29sZGVuLnBuZworKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUtbm9kcGkvdmVjdG9yX2ljb25fZ3JhZGllbnRfMl9nb2xkZW4ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS1ub2RwaS92ZWN0b3JfaWNvbl9ncmFkaWVudF8yX3JlcGVhdF9nb2xkZW4ucG5nIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX2dyYWRpZW50XzJfcmVwZWF0X2dvbGRlbi5wbmcKaW5kZXggNDkxZTczZS4uMWMxM2MzMCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX2dyYWRpZW50XzJfcmVwZWF0X2dvbGRlbi5wbmcKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX2dyYWRpZW50XzJfcmVwZWF0X2dvbGRlbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX2dyYWRpZW50XzNfZ29sZGVuLnBuZyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS1ub2RwaS92ZWN0b3JfaWNvbl9ncmFkaWVudF8zX2dvbGRlbi5wbmcKaW5kZXggZTMzNWE5Mi4uZjJjYjEwNiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX2dyYWRpZW50XzNfZ29sZGVuLnBuZworKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUtbm9kcGkvdmVjdG9yX2ljb25fZ3JhZGllbnRfM19nb2xkZW4ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS1ub2RwaS92ZWN0b3JfaWNvbl9ncmFkaWVudF8zX21pcnJvcl9nb2xkZW4ucG5nIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX2dyYWRpZW50XzNfbWlycm9yX2dvbGRlbi5wbmcKaW5kZXggNTdmMmFlMy4uMzRlMDU3MSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX2dyYWRpZW50XzNfbWlycm9yX2dvbGRlbi5wbmcKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX2dyYWRpZW50XzNfbWlycm9yX2dvbGRlbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX2dyb3VwX2NsaXBfZ29sZGVuLnBuZyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS1ub2RwaS92ZWN0b3JfaWNvbl9ncm91cF9jbGlwX2dvbGRlbi5wbmcKaW5kZXggZTc0YzE4MS4uYzk3MDJjOSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX2dyb3VwX2NsaXBfZ29sZGVuLnBuZworKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUtbm9kcGkvdmVjdG9yX2ljb25fZ3JvdXBfY2xpcF9nb2xkZW4ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS1ub2RwaS92ZWN0b3JfaWNvbl9oZWFydF9nb2xkZW4ucG5nIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX2hlYXJ0X2dvbGRlbi5wbmcKaW5kZXggNzQ1MDc1MS4uYjBhZjdkNCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX2hlYXJ0X2dvbGRlbi5wbmcKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX2hlYXJ0X2dvbGRlbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX3JhbmRvbV9wYXRoXzFfZ29sZGVuLnBuZyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS1ub2RwaS92ZWN0b3JfaWNvbl9yYW5kb21fcGF0aF8xX2dvbGRlbi5wbmcKaW5kZXggZDAxMGQ3OS4uZTc3OTcxOCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX3JhbmRvbV9wYXRoXzFfZ29sZGVuLnBuZworKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUtbm9kcGkvdmVjdG9yX2ljb25fcmFuZG9tX3BhdGhfMV9nb2xkZW4ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS1ub2RwaS92ZWN0b3JfaWNvbl9yYW5kb21fcGF0aF8yX2dvbGRlbi5wbmcgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUtbm9kcGkvdmVjdG9yX2ljb25fcmFuZG9tX3BhdGhfMl9nb2xkZW4ucG5nCmluZGV4IDVhZGEwNjAuLjdiYTcxOTEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS1ub2RwaS92ZWN0b3JfaWNvbl9yYW5kb21fcGF0aF8yX2dvbGRlbi5wbmcKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX3JhbmRvbV9wYXRoXzJfZ29sZGVuLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUtbm9kcGkvdmVjdG9yX2ljb25fcmVwZWF0ZWRfYV8xX2dvbGRlbi5wbmcgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUtbm9kcGkvdmVjdG9yX2ljb25fcmVwZWF0ZWRfYV8xX2dvbGRlbi5wbmcKaW5kZXggNWFmNzA5MC4uMzdhMGQyMSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX3JlcGVhdGVkX2FfMV9nb2xkZW4ucG5nCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS1ub2RwaS92ZWN0b3JfaWNvbl9yZXBlYXRlZF9hXzFfZ29sZGVuLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUtbm9kcGkvdmVjdG9yX2ljb25fcmVwZWF0ZWRfYV8yX2dvbGRlbi5wbmcgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUtbm9kcGkvdmVjdG9yX2ljb25fcmVwZWF0ZWRfYV8yX2dvbGRlbi5wbmcKaW5kZXggMjRiOTY2Mi4uYjAxMTI4NCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX3JlcGVhdGVkX2FfMl9nb2xkZW4ucG5nCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS1ub2RwaS92ZWN0b3JfaWNvbl9yZXBlYXRlZF9hXzJfZ29sZGVuLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUtbm9kcGkvdmVjdG9yX2ljb25fcmVwZWF0ZWRfY3FfZ29sZGVuLnBuZyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS1ub2RwaS92ZWN0b3JfaWNvbl9yZXBlYXRlZF9jcV9nb2xkZW4ucG5nCmluZGV4IGM5Njc3YTYuLjllOTJjOGEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS1ub2RwaS92ZWN0b3JfaWNvbl9yZXBlYXRlZF9jcV9nb2xkZW4ucG5nCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS1ub2RwaS92ZWN0b3JfaWNvbl9yZXBlYXRlZF9jcV9nb2xkZW4ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS1ub2RwaS92ZWN0b3JfaWNvbl9yZXBlYXRlZF9zdF9nb2xkZW4ucG5nIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX3JlcGVhdGVkX3N0X2dvbGRlbi5wbmcKaW5kZXggODg4MmE3YS4uMDI2MmU1NyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX3JlcGVhdGVkX3N0X2dvbGRlbi5wbmcKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX3JlcGVhdGVkX3N0X2dvbGRlbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX3NjYWxlXzFfZ29sZGVuLnBuZyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS1ub2RwaS92ZWN0b3JfaWNvbl9zY2FsZV8xX2dvbGRlbi5wbmcKaW5kZXggMTQzY2UzZS4uMTUyMDM5NyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX3NjYWxlXzFfZ29sZGVuLnBuZworKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUtbm9kcGkvdmVjdG9yX2ljb25fc2NhbGVfMV9nb2xkZW4ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS1ub2RwaS92ZWN0b3JfaWNvbl9zY2FsZV8yX2dvbGRlbi5wbmcgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUtbm9kcGkvdmVjdG9yX2ljb25fc2NhbGVfMl9nb2xkZW4ucG5nCmluZGV4IDlhNWVmZDIuLjcyN2JiNDggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS1ub2RwaS92ZWN0b3JfaWNvbl9zY2FsZV8yX2dvbGRlbi5wbmcKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX3NjYWxlXzJfZ29sZGVuLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUtbm9kcGkvdmVjdG9yX2ljb25fc2NhbGVfM19nb2xkZW4ucG5nIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX3NjYWxlXzNfZ29sZGVuLnBuZwppbmRleCAyZWRjM2M3Li5kNjhhYjkwIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUtbm9kcGkvdmVjdG9yX2ljb25fc2NhbGVfM19nb2xkZW4ucG5nCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS1ub2RwaS92ZWN0b3JfaWNvbl9zY2FsZV8zX2dvbGRlbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX3NjaGVkdWxlX2dvbGRlbi5wbmcgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUtbm9kcGkvdmVjdG9yX2ljb25fc2NoZWR1bGVfZ29sZGVuLnBuZwppbmRleCA5ODIyYmMyLi4yODMwODQwIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUtbm9kcGkvdmVjdG9yX2ljb25fc2NoZWR1bGVfZ29sZGVuLnBuZworKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUtbm9kcGkvdmVjdG9yX2ljb25fc2NoZWR1bGVfZ29sZGVuLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUtbm9kcGkvdmVjdG9yX2ljb25fc2V0dGluZ3NfZ29sZGVuLnBuZyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS1ub2RwaS92ZWN0b3JfaWNvbl9zZXR0aW5nc19nb2xkZW4ucG5nCmluZGV4IGQxMmIxNDIuLmI1ZDI1YmUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS1ub2RwaS92ZWN0b3JfaWNvbl9zZXR0aW5nc19nb2xkZW4ucG5nCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS1ub2RwaS92ZWN0b3JfaWNvbl9zZXR0aW5nc19nb2xkZW4ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS1ub2RwaS92ZWN0b3JfaWNvbl9zdGF0ZV9saXN0XzJfZ29sZGVuLnBuZyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS1ub2RwaS92ZWN0b3JfaWNvbl9zdGF0ZV9saXN0XzJfZ29sZGVuLnBuZwppbmRleCAzOTM2Yzg5Li45MjMzNDdkIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUtbm9kcGkvdmVjdG9yX2ljb25fc3RhdGVfbGlzdF8yX2dvbGRlbi5wbmcKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX3N0YXRlX2xpc3RfMl9nb2xkZW4ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS1ub2RwaS92ZWN0b3JfaWNvbl9zdGF0ZV9saXN0XzJfcHJlc3NlZF9nb2xkZW4ucG5nIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX3N0YXRlX2xpc3RfMl9wcmVzc2VkX2dvbGRlbi5wbmcKaW5kZXggYzVkMDZmNi4uNzRjMzBmYSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX3N0YXRlX2xpc3RfMl9wcmVzc2VkX2dvbGRlbi5wbmcKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX3N0YXRlX2xpc3RfMl9wcmVzc2VkX2dvbGRlbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX3N0YXRlX2xpc3RfZ29sZGVuLnBuZyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS1ub2RwaS92ZWN0b3JfaWNvbl9zdGF0ZV9saXN0X2dvbGRlbi5wbmcKaW5kZXggMzkzNmM4OS4uOTIzMzQ3ZCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX3N0YXRlX2xpc3RfZ29sZGVuLnBuZworKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUtbm9kcGkvdmVjdG9yX2ljb25fc3RhdGVfbGlzdF9nb2xkZW4ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS1ub2RwaS92ZWN0b3JfaWNvbl9zdGF0ZV9saXN0X3ByZXNzZWRfZ29sZGVuLnBuZyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS1ub2RwaS92ZWN0b3JfaWNvbl9zdGF0ZV9saXN0X3ByZXNzZWRfZ29sZGVuLnBuZwppbmRleCBjNWQwNmY2Li43NGMzMGZhIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUtbm9kcGkvdmVjdG9yX2ljb25fc3RhdGVfbGlzdF9wcmVzc2VkX2dvbGRlbi5wbmcKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX3N0YXRlX2xpc3RfcHJlc3NlZF9nb2xkZW4ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS1ub2RwaS92ZWN0b3JfaWNvbl9zdHJva2VfMV9nb2xkZW4ucG5nIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX3N0cm9rZV8xX2dvbGRlbi5wbmcKaW5kZXggMmJmNzg4Mi4uYzIwMmZmYyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX3N0cm9rZV8xX2dvbGRlbi5wbmcKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX3N0cm9rZV8xX2dvbGRlbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX3N0cm9rZV8yX2dvbGRlbi5wbmcgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUtbm9kcGkvdmVjdG9yX2ljb25fc3Ryb2tlXzJfZ29sZGVuLnBuZwppbmRleCA0MTQxZDZmLi5lZDMxZTQ3IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUtbm9kcGkvdmVjdG9yX2ljb25fc3Ryb2tlXzJfZ29sZGVuLnBuZworKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUtbm9kcGkvdmVjdG9yX2ljb25fc3Ryb2tlXzJfZ29sZGVuLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUtbm9kcGkvdmVjdG9yX2ljb25fc3Ryb2tlXzNfZ29sZGVuLnBuZyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS1ub2RwaS92ZWN0b3JfaWNvbl9zdHJva2VfM19nb2xkZW4ucG5nCmluZGV4IDEyMTJmYjMuLmEzMmRlOTAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS1ub2RwaS92ZWN0b3JfaWNvbl9zdHJva2VfM19nb2xkZW4ucG5nCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS1ub2RwaS92ZWN0b3JfaWNvbl9zdHJva2VfM19nb2xkZW4ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS1ub2RwaS92ZWN0b3JfaWNvbl90cmFuc2Zvcm1hdGlvbl8xX2dvbGRlbi5wbmcgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUtbm9kcGkvdmVjdG9yX2ljb25fdHJhbnNmb3JtYXRpb25fMV9nb2xkZW4ucG5nCmluZGV4IDA3MTczOTkuLjI2Y2JlMmEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS1ub2RwaS92ZWN0b3JfaWNvbl90cmFuc2Zvcm1hdGlvbl8xX2dvbGRlbi5wbmcKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX3RyYW5zZm9ybWF0aW9uXzFfZ29sZGVuLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUtbm9kcGkvdmVjdG9yX2ljb25fdHJhbnNmb3JtYXRpb25fMl9nb2xkZW4ucG5nIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX3RyYW5zZm9ybWF0aW9uXzJfZ29sZGVuLnBuZwppbmRleCA1MDVhYTJlLi45YWVlZWVmIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUtbm9kcGkvdmVjdG9yX2ljb25fdHJhbnNmb3JtYXRpb25fMl9nb2xkZW4ucG5nCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS1ub2RwaS92ZWN0b3JfaWNvbl90cmFuc2Zvcm1hdGlvbl8yX2dvbGRlbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX3RyYW5zZm9ybWF0aW9uXzNfZ29sZGVuLnBuZyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS1ub2RwaS92ZWN0b3JfaWNvbl90cmFuc2Zvcm1hdGlvbl8zX2dvbGRlbi5wbmcKaW5kZXggOWI1M2U5NC4uNDY4YTFjMyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX3RyYW5zZm9ybWF0aW9uXzNfZ29sZGVuLnBuZworKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUtbm9kcGkvdmVjdG9yX2ljb25fdHJhbnNmb3JtYXRpb25fM19nb2xkZW4ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS1ub2RwaS92ZWN0b3JfaWNvbl90cmFuc2Zvcm1hdGlvbl80X2dvbGRlbi5wbmcgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUtbm9kcGkvdmVjdG9yX2ljb25fdHJhbnNmb3JtYXRpb25fNF9nb2xkZW4ucG5nCmluZGV4IGE1ZDRkMzMuLmU0YmMwNTUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS1ub2RwaS92ZWN0b3JfaWNvbl90cmFuc2Zvcm1hdGlvbl80X2dvbGRlbi5wbmcKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX3RyYW5zZm9ybWF0aW9uXzRfZ29sZGVuLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUtbm9kcGkvdmVjdG9yX2ljb25fdHJhbnNmb3JtYXRpb25fNV9nb2xkZW4ucG5nIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX3RyYW5zZm9ybWF0aW9uXzVfZ29sZGVuLnBuZwppbmRleCAwZDhkZWQxLi5iYjE4NWYyIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUtbm9kcGkvdmVjdG9yX2ljb25fdHJhbnNmb3JtYXRpb25fNV9nb2xkZW4ucG5nCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS1ub2RwaS92ZWN0b3JfaWNvbl90cmFuc2Zvcm1hdGlvbl81X2dvbGRlbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX3RyYW5zZm9ybWF0aW9uXzZfZ29sZGVuLnBuZyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS1ub2RwaS92ZWN0b3JfaWNvbl90cmFuc2Zvcm1hdGlvbl82X2dvbGRlbi5wbmcKaW5kZXggM2RhNzk2OS4uMDI5MDFiNiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9pY29uX3RyYW5zZm9ybWF0aW9uXzZfZ29sZGVuLnBuZworKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUtbm9kcGkvdmVjdG9yX2ljb25fdHJhbnNmb3JtYXRpb25fNl9nb2xkZW4ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS9hbmltYXRlZF9vbmVfbG9vcC5naWYgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUvYW5pbWF0ZWRfb25lX2xvb3AuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3OWFhMTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUvYW5pbWF0ZWRfb25lX2xvb3AuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS9hbmltYXRlZGltYWdlZHJhd2FibGUueG1sIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlL2FuaW1hdGVkaW1hZ2VkcmF3YWJsZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQxMzNjNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS9hbmltYXRlZGltYWdlZHJhd2FibGUueG1sCkBAIC0wLDAgKzEsMjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQW5pbWF0ZWRJbWFnZURyYXdhYmxlCisgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvYW5pbWF0ZWQiIC8+CisKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS9hbmltYXRlZGltYWdlZHJhd2FibGVfYXV0b21pcnJvcmVkLnhtbCBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS9hbmltYXRlZGltYWdlZHJhd2FibGVfYXV0b21pcnJvcmVkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDViMGNmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlL2FuaW1hdGVkaW1hZ2VkcmF3YWJsZV9hdXRvbWlycm9yZWQueG1sCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPGFuaW1hdGVkLWltYWdlIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2FuaW1hdGVkIgorICAgIGFuZHJvaWQ6YXV0b01pcnJvcmVkPSJ0cnVlIgorICAgIC8+CisKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS9hbmltYXRlZGltYWdlZHJhd2FibGVfYXV0b3N0YXJ0LnhtbCBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS9hbmltYXRlZGltYWdlZHJhd2FibGVfYXV0b3N0YXJ0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2QzOGE2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlL2FuaW1hdGVkaW1hZ2VkcmF3YWJsZV9hdXRvc3RhcnQueG1sCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPGFuaW1hdGVkLWltYWdlIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2FuaW1hdGVkIgorICAgIGFuZHJvaWQ6YXV0b1N0YXJ0PSJ0cnVlIgorICAgIC8+CisKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS9hbmltYXRlZGltYWdlZHJhd2FibGVfYXV0b3N0YXJ0X2ZhbHNlLnhtbCBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS9hbmltYXRlZGltYWdlZHJhd2FibGVfYXV0b3N0YXJ0X2ZhbHNlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWU1NmU5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlL2FuaW1hdGVkaW1hZ2VkcmF3YWJsZV9hdXRvc3RhcnRfZmFsc2UueG1sCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPGFuaW1hdGVkLWltYWdlIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2FuaW1hdGVkIgorICAgIGFuZHJvaWQ6YXV0b1N0YXJ0PSJmYWxzZSIKKyAgICAvPgorCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUvYW5pbWF0ZWRpbWFnZWRyYXdhYmxlX2NsYXNzLnhtbCBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS9hbmltYXRlZGltYWdlZHJhd2FibGVfY2xhc3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZGM0OGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUvYW5pbWF0ZWRpbWFnZWRyYXdhYmxlX2NsYXNzLnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxkcmF3YWJsZSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgY2xhc3M9ImFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQW5pbWF0ZWRJbWFnZURyYXdhYmxlIgorICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvYW5pbWF0ZWQiIC8+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUvYW5pbWF0ZWRpbWFnZWRyYXdhYmxlX2xvb3BfY291bnQueG1sIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlL2FuaW1hdGVkaW1hZ2VkcmF3YWJsZV9sb29wX2NvdW50LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmQyMTlkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlL2FuaW1hdGVkaW1hZ2VkcmF3YWJsZV9sb29wX2NvdW50LnhtbApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxhbmltYXRlZC1pbWFnZSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9hbmltYXRlZCIKKyAgICBhbmRyb2lkOnJlcGVhdENvdW50PSIxNyIKKyAgICAvPgorCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUvYW5pbWF0ZWRpbWFnZWRyYXdhYmxlX2xvb3BfY291bnRfaW5maW5pdGUueG1sIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlL2FuaW1hdGVkaW1hZ2VkcmF3YWJsZV9sb29wX2NvdW50X2luZmluaXRlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTdhMzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlL2FuaW1hdGVkaW1hZ2VkcmF3YWJsZV9sb29wX2NvdW50X2luZmluaXRlLnhtbApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxhbmltYXRlZC1pbWFnZSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9hbmltYXRlZF9vbmVfbG9vcCIKKyAgICBhbmRyb2lkOnJlcGVhdENvdW50PSJpbmZpbml0ZSIKKyAgICAvPgorCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUvYW5pbWF0ZWRpbWFnZWRyYXdhYmxlX25vc3JjLnhtbCBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS9hbmltYXRlZGltYWdlZHJhd2FibGVfbm9zcmMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmN2FjOGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUvYW5pbWF0ZWRpbWFnZWRyYXdhYmxlX25vc3JjLnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxhbmltYXRlZC1pbWFnZSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgLz4KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlL2FuaW1hdGVkaW1hZ2VkcmF3YWJsZV90YWcueG1sIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlL2FuaW1hdGVkaW1hZ2VkcmF3YWJsZV90YWcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNjZkNjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUvYW5pbWF0ZWRpbWFnZWRyYXdhYmxlX3RhZy54bWwKQEAgLTAsMCArMSwyMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8YW5pbWF0ZWQtaW1hZ2UgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvYW5pbWF0ZWQiIC8+CisKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS9jb2xvcl93aGVlbC5pY28gYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUvY29sb3Jfd2hlZWwuaWNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZmEzODEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUvY29sb3Jfd2hlZWwuaWNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS9nb29nbGVfY2hyb21lLmljbyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS9nb29nbGVfY2hyb21lLmljbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWY5MWVlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlL2dvb2dsZV9jaHJvbWUuaWNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS9vcmllbnRhdGlvbl8xLmpwZyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS9vcmllbnRhdGlvbl8xLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzY0ZWYyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlL29yaWVudGF0aW9uXzEuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS9vcmllbnRhdGlvbl8yLmpwZyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS9vcmllbnRhdGlvbl8yLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzVmZjBiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlL29yaWVudGF0aW9uXzIuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS9vcmllbnRhdGlvbl8zLmpwZyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS9vcmllbnRhdGlvbl8zLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWM2YzEzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlL29yaWVudGF0aW9uXzMuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS9vcmllbnRhdGlvbl80LmpwZyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS9vcmllbnRhdGlvbl80LmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmE3YmFkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlL29yaWVudGF0aW9uXzQuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS9vcmllbnRhdGlvbl81LmpwZyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS9vcmllbnRhdGlvbl81LmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTM0OTA1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlL29yaWVudGF0aW9uXzUuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS9vcmllbnRhdGlvbl82LmpwZyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS9vcmllbnRhdGlvbl82LmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTkzNGEzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlL29yaWVudGF0aW9uXzYuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS9vcmllbnRhdGlvbl83LmpwZyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS9vcmllbnRhdGlvbl83LmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTg0OTEyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlL29yaWVudGF0aW9uXzcuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS9vcmllbnRhdGlvbl84LmpwZyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS9vcmllbnRhdGlvbl84LmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWU2ZDM2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlL29yaWVudGF0aW9uXzguanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS93ZWJwX29yaWVudGF0aW9uMS53ZWJwIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlL3dlYnBfb3JpZW50YXRpb24xLndlYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FiNTM3ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS93ZWJwX29yaWVudGF0aW9uMS53ZWJwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS93ZWJwX29yaWVudGF0aW9uMi53ZWJwIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlL3dlYnBfb3JpZW50YXRpb24yLndlYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA3NTdhMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS93ZWJwX29yaWVudGF0aW9uMi53ZWJwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS93ZWJwX29yaWVudGF0aW9uMy53ZWJwIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlL3dlYnBfb3JpZW50YXRpb24zLndlYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UyOWRkOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS93ZWJwX29yaWVudGF0aW9uMy53ZWJwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS93ZWJwX29yaWVudGF0aW9uNC53ZWJwIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlL3dlYnBfb3JpZW50YXRpb240LndlYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY0YmFiNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS93ZWJwX29yaWVudGF0aW9uNC53ZWJwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS93ZWJwX29yaWVudGF0aW9uNS53ZWJwIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlL3dlYnBfb3JpZW50YXRpb241LndlYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NjM2I2MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS93ZWJwX29yaWVudGF0aW9uNS53ZWJwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS93ZWJwX29yaWVudGF0aW9uNi53ZWJwIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2RyYXdhYmxlL3dlYnBfb3JpZW50YXRpb242LndlYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZjZjY2NjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUvd2VicF9vcmllbnRhdGlvbjYud2VicApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUvd2VicF9vcmllbnRhdGlvbjcud2VicCBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS93ZWJwX29yaWVudGF0aW9uNy53ZWJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NTQ5NTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUvd2VicF9vcmllbnRhdGlvbjcud2VicApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUvd2VicF9vcmllbnRhdGlvbjgud2VicCBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9kcmF3YWJsZS93ZWJwX29yaWVudGF0aW9uOC53ZWJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMTE5NjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZHJhd2FibGUvd2VicF9vcmllbnRhdGlvbjgud2VicApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZm9udC9hM2VtLnR0ZiBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9mb250L2EzZW0udHRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MDFjZTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZm9udC9hM2VtLnR0ZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZm9udC9iM2VtLnR0ZiBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9mb250L2IzZW0udHRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzOTQ4YTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZm9udC9iM2VtLnR0ZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZm9udC9jM2VtLnR0ZiBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9mb250L2MzZW0udHRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZGMzZTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZm9udC9jM2VtLnR0ZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZm9udC9tdWx0aXN0eWxlX2ZhbWlseS54bWwgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZm9udC9tdWx0aXN0eWxlX2ZhbWlseS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUyMmU3MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9mb250L211bHRpc3R5bGVfZmFtaWx5LnhtbApAQCAtMCwwICsxLDYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8Zm9udC1mYW1pbHkgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8Zm9udCBhbmRyb2lkOmZvbnQ9IkBmb250L2EzZW0iIGFuZHJvaWQ6Zm9udFdlaWdodD0iNDAwIiBhbmRyb2lkOmZvbnRTdHlsZT0ibm9ybWFsIiAvPgorICAgIDxmb250IGFuZHJvaWQ6Zm9udD0iQGZvbnQvYjNlbSIgYW5kcm9pZDpmb250V2VpZ2h0PSI0MDAiIGFuZHJvaWQ6Zm9udFN0eWxlPSJpdGFsaWMiIC8+CisgICAgPGZvbnQgYW5kcm9pZDpmb250PSJAZm9udC9jM2VtIiBhbmRyb2lkOmZvbnRXZWlnaHQ9IjcwMCIgYW5kcm9pZDpmb250U3R5bGU9Iml0YWxpYyIgLz4KKzwvZm9udC1mYW1pbHk+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvZm9udC9tdWx0aXdlaWdodF9mYW1pbHkueG1sIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2ZvbnQvbXVsdGl3ZWlnaHRfZmFtaWx5LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWQwNDkwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2ZvbnQvbXVsdGl3ZWlnaHRfZmFtaWx5LnhtbApAQCAtMCwwICsxLDYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8Zm9udC1mYW1pbHkgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8Zm9udCBhbmRyb2lkOmZvbnQ9IkBmb250L2EzZW0iIGFuZHJvaWQ6Zm9udFdlaWdodD0iMTAwIiBhbmRyb2lkOmZvbnRTdHlsZT0ibm9ybWFsIiAvPgorICAgIDxmb250IGFuZHJvaWQ6Zm9udD0iQGZvbnQvYjNlbSIgYW5kcm9pZDpmb250V2VpZ2h0PSI0MDAiIGFuZHJvaWQ6Zm9udFN0eWxlPSJub3JtYWwiIC8+CisgICAgPGZvbnQgYW5kcm9pZDpmb250PSJAZm9udC9jM2VtIiBhbmRyb2lkOmZvbnRXZWlnaHQ9IjcwMCIgYW5kcm9pZDpmb250U3R5bGU9Im5vcm1hbCIgLz4KKzwvZm9udC1mYW1pbHk+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvbGF5b3V0L2FuaW1hdGVkX2ltYWdlX2xheW91dC54bWwgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvbGF5b3V0L2FuaW1hdGVkX2ltYWdlX2xheW91dC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNkYjkyYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9sYXlvdXQvYW5pbWF0ZWRfaW1hZ2VfbGF5b3V0LnhtbApAQCAtMCwwICsxLDMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6dG9vbHM9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL3Rvb2xzIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgPgorICAgICAgICA8SW1hZ2VWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FuaW1hdGVkX2ltYWdlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpzY2FsZVR5cGU9ImZpdENlbnRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6YWRqdXN0Vmlld0JvdW5kcz0idHJ1ZSIKKyAgICAgICAgICAgIC8+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9sYXlvdXQvdnVsa2FuX3ByZXRyYW5zZm9ybV9sYXlvdXQueG1sIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL2xheW91dC92dWxrYW5fcHJldHJhbnNmb3JtX2xheW91dC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI3ZjYzNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9sYXlvdXQvdnVsa2FuX3ByZXRyYW5zZm9ybV9sYXlvdXQueG1sCkBAIC0wLDAgKzEsMzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiPgorCisgICAgPFN1cmZhY2VWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3VyZmFjZXZpZXciCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ii8+CisKKzwvTGluZWFyTGF5b3V0PgorCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvcmF3L2Jhc2k2YTE2LnBuZyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9yYXcvYmFzaTZhMTYucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQxODE1MzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvcmF3L2Jhc2k2YTE2LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvcmF3L2YxNi5wbmcgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvcmF3L2YxNi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMzYWVkMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9yYXcvZjE2LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvcmF3L3NhbXBsZV8xbXAuZG5nIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL3Jhdy9zYW1wbGVfMW1wLmRuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWMxMDc4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL3Jhdy9zYW1wbGVfMW1wLmRuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvdmFsdWVzL3N0eWxlcy54bWwgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvdmFsdWVzL3N0eWxlcy54bWwKaW5kZXggNjk5MWJlNi4uODA3ODBmYiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3MvcmVzL3ZhbHVlcy9zdHlsZXMueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbApAQCAtMTI1LDggKzEyNSw4IEBACiAKICAgICA8c3R5bGUgbmFtZT0iVGVzdFByb2dyZXNzQmFyIj4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDppbmRldGVybWluYXRlT25seSI+ZmFsc2U8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6cHJvZ3Jlc3NEcmF3YWJsZSI+P2FuZHJvaWQ6ZHJhd2FibGUvcHJvZ3Jlc3NfaG9yaXpvbnRhbDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDppbmRldGVybWluYXRlRHJhd2FibGUiPj9hbmRyb2lkOmRyYXdhYmxlL3Byb2dyZXNzX2hvcml6b250YWw8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6cHJvZ3Jlc3NEcmF3YWJsZSI+QGFuZHJvaWQ6ZHJhd2FibGUvcHJvZ3Jlc3NfaG9yaXpvbnRhbDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDppbmRldGVybWluYXRlRHJhd2FibGUiPkBhbmRyb2lkOmRyYXdhYmxlL3Byb2dyZXNzX2hvcml6b250YWw8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bWluSGVpZ2h0Ij4yMGRpcDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDptYXhIZWlnaHQiPjIwZGlwPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmZvY3VzYWJsZSI+dHJ1ZTwvaXRlbT4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy94bWwvZmlsZV9wYXRocy54bWwgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMveG1sL2ZpbGVfcGF0aHMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlYzRjYWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMveG1sL2ZpbGVfcGF0aHMueG1sCkBAIC0wLDAgKzEsMjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxwYXRocyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxmaWxlcy1wYXRoIG5hbWU9ImltYWdlcyIgcGF0aD0iaW1hZ2VzLyIgLz4KKzwvcGF0aHM+CisKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9BTmF0aXZlV2luZG93VGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL0FOYXRpdmVXaW5kb3dUZXN0LmphdmEKaW5kZXggZTY3YjVhNC4uMTdhYjM3OSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL0FOYXRpdmVXaW5kb3dUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL0FOYXRpdmVXaW5kb3dUZXN0LmphdmEKQEAgLTE2LDkgKzE2LDEwIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5ncmFwaGljcy5jdHM7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQub3BlbmdsLkVHTDE0Lio7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlN1cmZhY2VUZXh0dXJlOwogaW1wb3J0IGFuZHJvaWQub3BlbmdsLkVHTDE0OwogaW1wb3J0IGFuZHJvaWQub3BlbmdsLkVHTENvbmZpZzsKQEAgLTI2LDE2ICsyNywxNiBAQAogaW1wb3J0IGFuZHJvaWQub3BlbmdsLkVHTERpc3BsYXk7CiBpbXBvcnQgYW5kcm9pZC5vcGVuZ2wuRUdMU3VyZmFjZTsKIGltcG9ydCBhbmRyb2lkLm9wZW5nbC5HTEVTMjA7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2U7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZTsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CiAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVycy5CbG9ja0pVbml0NENsYXNzUnVubmVyOwogCi0KIEBTbWFsbFRlc3QKIEBSdW5XaXRoKEJsb2NrSlVuaXQ0Q2xhc3NSdW5uZXIuY2xhc3MpCiBwdWJsaWMgY2xhc3MgQU5hdGl2ZVdpbmRvd1Rlc3QgewpAQCAtMTkyLDYgKzE5MywzMiBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0QnVmZmVyc0RhdGFTcGFjZSgpIHsKKyAgICAgICAgZmluYWwgaW50IERBVEFTUEFDRV9TUkdCID0gMTQyNjcxODcyOworICAgICAgICBmaW5hbCBpbnQgREFUQVNQQUNFX1VOS05PV04gPSAxMjM7CisKKyAgICAgICAgaW50W10gdGV4SWQgPSBuZXcgaW50WzFdOworICAgICAgICBHTEVTMjAuZ2xHZW5UZXh0dXJlcygxLCB0ZXhJZCwgMCk7CisKKyAgICAgICAgU3VyZmFjZVRleHR1cmUgY29uc3VtZXIgPSBuZXcgU3VyZmFjZVRleHR1cmUodGV4SWRbMF0pOworICAgICAgICBjb25zdW1lci5zZXREZWZhdWx0QnVmZmVyU2l6ZSgxNiwgMTYpOworICAgICAgICBTdXJmYWNlIHN1cmZhY2UgPSBuZXcgU3VyZmFjZShjb25zdW1lcik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5HZXRCdWZmZXJzRGF0YVNwYWNlKHN1cmZhY2UpLCAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5TZXRCdWZmZXJzRGF0YVNwYWNlKHN1cmZhY2UsIERBVEFTUEFDRV9TUkdCKSwgMCk7CisgICAgICAgIGFzc2VydEVxdWFscyhuR2V0QnVmZmVyc0RhdGFTcGFjZShzdXJmYWNlKSwgREFUQVNQQUNFX1NSR0IpOworCisgICAgICAgIGFzc2VydEVxdWFscyhuU2V0QnVmZmVyc0RhdGFTcGFjZShudWxsLCBEQVRBU1BBQ0VfU1JHQiksIC0yMik7CisgICAgICAgIGFzc2VydEVxdWFscyhuR2V0QnVmZmVyc0RhdGFTcGFjZShudWxsKSwgLTIyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5HZXRCdWZmZXJzRGF0YVNwYWNlKHN1cmZhY2UpLCBEQVRBU1BBQ0VfU1JHQik7CisKKyAgICAgICAgLy8gc2V0IGFuIHVuc3VwcG9ydGVkIGRhdGEgc3BhY2Ugc2hvdWxkIHJldHVybiBhIGVycm9yIGNvZGUsCisgICAgICAgIC8vIHRoZSBvcmlnaW5hbCBkYXRhIHNwYWNlIHNob3VsZG4ndCBjaGFuZ2UuCisgICAgICAgIGFzc2VydEVxdWFscyhuU2V0QnVmZmVyc0RhdGFTcGFjZShzdXJmYWNlLCBEQVRBU1BBQ0VfVU5LTk9XTiksIC0yMik7CisgICAgICAgIGFzc2VydEVxdWFscyhuR2V0QnVmZmVyc0RhdGFTcGFjZShzdXJmYWNlKSwgREFUQVNQQUNFX1NSR0IpOworICAgIH0KKwogICAgIC8vIE11bHRpcGx5IDR4NCBtYXRyaWNlcyByZXN1bHQgPSBhKmIuIHJlc3VsdCBjYW4gYmUgdGhlIHNhbWUgYXMgZWl0aGVyIGEgb3IgYiwKICAgICAvLyBhbGxvd2luZyBmb3IgcmVzdWx0ICo9IGIuIEFub3RoZXIgNHg0IG1hdHJpeCB0bXAgbXVzdCBiZSBwcm92aWRlZCBhcyBzY3JhdGNoIHNwYWNlLgogICAgIHByaXZhdGUgdm9pZCBtYXRyaXhNdWx0aXBseShmbG9hdFtdIHJlc3VsdCwgZmxvYXRbXSBhLCBmbG9hdFtdIGIsIGZsb2F0W10gdG1wKSB7CkBAIC0yMTksNSArMjQ2LDYgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuUHVzaEJ1ZmZlcldpdGhUcmFuc2Zvcm0oU3VyZmFjZSBzdXJmYWNlLCBpbnQgdHJhbnNmb3JtKTsKLQorICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgblNldEJ1ZmZlcnNEYXRhU3BhY2UoU3VyZmFjZSBzdXJmYWNlLCBpbnQgZGF0YVNwYWNlKTsKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5HZXRCdWZmZXJzRGF0YVNwYWNlKFN1cmZhY2Ugc3VyZmFjZSk7CiB9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvQVN1cmZhY2VUZXh0dXJlVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL0FTdXJmYWNlVGV4dHVyZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmY0NWY5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL0FTdXJmYWNlVGV4dHVyZVRlc3QuamF2YQpAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmdyYXBoaWNzLmN0czsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm9wZW5nbC5FR0wxNC4qOworCitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5TdXJmYWNlVGV4dHVyZTsKK2ltcG9ydCBhbmRyb2lkLm9wZW5nbC5FR0wxNDsKK2ltcG9ydCBhbmRyb2lkLm9wZW5nbC5FR0xDb25maWc7CitpbXBvcnQgYW5kcm9pZC5vcGVuZ2wuRUdMQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLm9wZW5nbC5FR0xEaXNwbGF5OworaW1wb3J0IGFuZHJvaWQub3BlbmdsLkVHTFN1cmZhY2U7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuQmxvY2tKVW5pdDRDbGFzc1J1bm5lcjsKKworQFNtYWxsVGVzdAorQFJ1bldpdGgoQmxvY2tKVW5pdDRDbGFzc1J1bm5lci5jbGFzcykKK3B1YmxpYyBjbGFzcyBBU3VyZmFjZVRleHR1cmVUZXN0IHsKKworICBzdGF0aWMgeworICAgIFN5c3RlbS5sb2FkTGlicmFyeSgiY3RzZ3JhcGhpY3Nfam5pIik7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gQU5hdGl2ZVdpbmRvd1Rlc3QuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7CisKKyAgcHJpdmF0ZSBFR0xEaXNwbGF5IG1FZ2xEaXNwbGF5ID0gRUdMX05PX0RJU1BMQVk7CisgIHByaXZhdGUgRUdMQ29uZmlnIG1FZ2xDb25maWcgPSBudWxsOworICBwcml2YXRlIEVHTFN1cmZhY2UgbUVnbFBidWZmZXIgPSBFR0xfTk9fU1VSRkFDRTsKKyAgcHJpdmF0ZSBFR0xDb250ZXh0IG1FZ2xDb250ZXh0ID0gRUdMX05PX0NPTlRFWFQ7CisKKyAgQEJlZm9yZQorICBwdWJsaWMgdm9pZCBzZXR1cCgpIHRocm93cyBUaHJvd2FibGUgeworICAgIG1FZ2xEaXNwbGF5ID0gRUdMMTQuZWdsR2V0RGlzcGxheShFR0xfREVGQVVMVF9ESVNQTEFZKTsKKyAgICBpZiAobUVnbERpc3BsYXkgPT0gRUdMX05PX0RJU1BMQVkpIHsKKyAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJubyBFR0wgZGlzcGxheSIpOworICAgIH0KKyAgICBpbnRbXSBtYWpvciA9IG5ldyBpbnRbMV07CisgICAgaW50W10gbWlub3IgPSBuZXcgaW50WzFdOworICAgIGlmICghRUdMMTQuZWdsSW5pdGlhbGl6ZShtRWdsRGlzcGxheSwgbWFqb3IsIDAsIG1pbm9yLCAwKSkgeworICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImVycm9yIGluIGVnbEluaXRpYWxpemUiKTsKKyAgICB9CisKKyAgICAvLyBJZiB3ZSBjb3VsZCByZWx5IG9uIGhhdmluZyBFR0xfS0hSX3N1cmZhY2VsZXNzX2NvbnRleHQgYW5kIEVHTF9LSFJfY29udGV4dF9ub19jb25maWcsIHdlCisgICAgLy8gd291bGRuJ3QgaGF2ZSB0byBjcmVhdGUgYSBjb25maWcgb3IgcGJ1ZmZlciBhdCBhbGwuCisKKyAgICBpbnRbXSBudW1Db25maWdzID0gbmV3IGludFsxXTsKKyAgICBFR0xDb25maWdbXSBjb25maWdzID0gbmV3IEVHTENvbmZpZ1sxXTsKKyAgICBpZiAoIUVHTDE0LmVnbENob29zZUNvbmZpZyhtRWdsRGlzcGxheSwKKyAgICAgICAgbmV3IGludFtdIHsKKyAgICAgICAgICAgIEVHTF9SRU5ERVJBQkxFX1RZUEUsIEVHTF9PUEVOR0xfRVMyX0JJVCwKKyAgICAgICAgICAgIEVHTF9TVVJGQUNFX1RZUEUsIEVHTF9QQlVGRkVSX0JJVCwKKyAgICAgICAgICAgIEVHTF9OT05FfSwKKyAgICAgICAgMCwgY29uZmlncywgMCwgMSwgbnVtQ29uZmlncywgMCkpIHsKKyAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJlZ2xDaG9vc2VDb25maWcgZmFpbGVkIik7CisgICAgfQorICAgIG1FZ2xDb25maWcgPSBjb25maWdzWzBdOworCisgICAgbUVnbFBidWZmZXIgPSBFR0wxNC5lZ2xDcmVhdGVQYnVmZmVyU3VyZmFjZShtRWdsRGlzcGxheSwgbUVnbENvbmZpZywKKyAgICAgICAgbmV3IGludFtdIHtFR0xfV0lEVEgsIDEsIEVHTF9IRUlHSFQsIDEsIEVHTF9OT05FfSwgMCk7CisgICAgaWYgKG1FZ2xQYnVmZmVyID09IEVHTF9OT19TVVJGQUNFKSB7CisgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiZWdsQ3JlYXRlUGJ1ZmZlclN1cmZhY2UgZmFpbGVkIik7CisgICAgfQorCisgICAgbUVnbENvbnRleHQgPSBFR0wxNC5lZ2xDcmVhdGVDb250ZXh0KG1FZ2xEaXNwbGF5LCBtRWdsQ29uZmlnLCBFR0xfTk9fQ09OVEVYVCwKKyAgICAgICAgbmV3IGludFtdIHtFR0xfQ09OVEVYVF9DTElFTlRfVkVSU0lPTiwgMiwgRUdMX05PTkV9LCAwKTsKKyAgICBpZiAobUVnbENvbnRleHQgPT0gRUdMX05PX0NPTlRFWFQpIHsKKyAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJlZ2xDcmVhdGVDb250ZXh0IGZhaWxlZCIpOworICAgIH0KKworICAgIGlmICghRUdMMTQuZWdsTWFrZUN1cnJlbnQobUVnbERpc3BsYXksIG1FZ2xQYnVmZmVyLCBtRWdsUGJ1ZmZlciwgbUVnbENvbnRleHQpKSB7CisgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiZWdsTWFrZUN1cnJlbnQgZmFpbGVkIik7CisgICAgfQorICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdEJhc2ljKCkgeworICAgIC8vIGNyZWF0ZSBhIGRldGFjaGVkIFN1cmZhY2VUZXh0dXJlCisgICAgU3VyZmFjZVRleHR1cmUgY29uc3VtZXIgPSBuZXcgU3VyZmFjZVRleHR1cmUoZmFsc2UpOworICAgIGNvbnN1bWVyLnNldERlZmF1bHRCdWZmZXJTaXplKDY0MCwgNDgwKTsKKyAgICBuQmFzaWNUZXN0cyhjb25zdW1lcik7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuQmFzaWNUZXN0cyhTdXJmYWNlVGV4dHVyZSBjb25zdW1lcik7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvQmFzaWNWdWxrYW5HcHVUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvQmFzaWNWdWxrYW5HcHVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZiMGYwNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9CYXNpY1Z1bGthbkdwdVRlc3QuamF2YQpAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5ncmFwaGljcy5jdHM7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQuUGFyYW1ldGVyczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK0BTbWFsbFRlc3QKK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgQmFzaWNWdWxrYW5HcHVUZXN0IHsKKworICAgIHN0YXRpYyB7CisgICAgICAgIFN5c3RlbS5sb2FkTGlicmFyeSgiY3RzZ3JhcGhpY3Nfam5pIik7CisgICAgfQorCisgICAgQFBhcmFtZXRlcnMobmFtZSA9ICJ7MH0iKQorICAgIHB1YmxpYyBzdGF0aWMgSXRlcmFibGU8T2JqZWN0W10+IGRhdGEoKSB7CisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXVtdIHsKKyAgICAgICAgICAgIHsiQUhBUkRXQVJFQlVGRkVSX0ZPUk1BVF9SOEc4QjhBOF9VTk9STSIsIDF9LAorICAgICAgICAgICAgeyJBSEFSRFdBUkVCVUZGRVJfRk9STUFUX1I4RzhCOFg4X1VOT1JNIiwgMn0sCisgICAgICAgICAgICB7IkFIQVJEV0FSRUJVRkZFUl9GT1JNQVRfUjhHOEI4X1VOT1JNIiwgM30sCisgICAgICAgICAgICB7IkFIQVJEV0FSRUJVRkZFUl9GT1JNQVRfUjVHNkI1X1VOT1JNIiwgNH0sCisgICAgICAgICAgICB7IkFIQVJEV0FSRUJVRkZFUl9GT1JNQVRfUjEwRzEwQjEwQTJfVU5PUk0iLCA0M30sCisgICAgICAgICAgICAvLyBUT0RPKGVyaWNyayk6IFRlc3QgZmxvYXQgYW5kIG5vbi1yZW5kZXJhYmxlIGZvcm1hdHMuCisgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgaW50IG1Gb3JtYXQ7CisKKyAgICBwdWJsaWMgQmFzaWNWdWxrYW5HcHVUZXN0KFN0cmluZyBuYW1lLCBpbnQgZm9ybWF0KSB7CisgICAgICAgIG1Gb3JtYXQgPSBmb3JtYXQ7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmFzaWNCdWZmZXJJbXBvcnRBbmRSZW5kZXJpbmdFeHBsaWNpdEZvcm1hdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB2ZXJpZnlCYXNpY0J1ZmZlckltcG9ydChJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCkuZ2V0QXNzZXRzKCksIG1Gb3JtYXQsIGZhbHNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCYXNpY0J1ZmZlckltcG9ydEFuZFJlbmRlcmluZ0V4dGVybmFsRm9ybWF0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHZlcmlmeUJhc2ljQnVmZmVySW1wb3J0KEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKS5nZXRBc3NldHMoKSwgbUZvcm1hdCwgdHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgdmVyaWZ5QmFzaWNCdWZmZXJJbXBvcnQoQXNzZXRNYW5hZ2VyIGFzc2V0TWFuYWdlciwgaW50IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHVzZUV4dGVybmFsRm9ybWF0KTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9CaXRtYXBDb2xvclNwYWNlVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL0JpdG1hcENvbG9yU3BhY2VUZXN0LmphdmEKaW5kZXggYmM4OGFkMS4uMzFmMjQ5NSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL0JpdG1hcENvbG9yU3BhY2VUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL0JpdG1hcENvbG9yU3BhY2VUZXN0LmphdmEKQEAgLTI4LDE4ICsyOCwyMiBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yU3BhY2U7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5JbWFnZURlY29kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uQ29sb3JJbnQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5Db2xvckludDsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk5vbk51bGw7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuUmVxdWlyZXNEZXZpY2U7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKQEAgLTc0MCw0ICs3NDQsOTggQEAKIAogICAgICAgICBhc3NlcnRUcnVlKHBhc3MpOwogICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVuY29kZVAzKCkgeworICAgICAgICBCaXRtYXAgYiA9IG51bGw7CisgICAgICAgIEltYWdlRGVjb2Rlci5Tb3VyY2Ugc3JjID0gSW1hZ2VEZWNvZGVyLmNyZWF0ZVNvdXJjZShtUmVzb3VyY2VzLmdldEFzc2V0cygpLAorICAgICAgICAgICAgICAgICJwcm9waG90by1yZ2JhMTZmLnBuZyIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYiA9IEltYWdlRGVjb2Rlci5kZWNvZGVCaXRtYXAoc3JjLCAoZGVjb2RlciwgaW5mbywgcykgLT4geworICAgICAgICAgICAgICAgIGRlY29kZXIuc2V0QWxsb2NhdG9yKEltYWdlRGVjb2Rlci5BTExPQ0FUT1JfU09GVFdBUkUpOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJpdG1hcC5Db25maWcuUkdCQV9GMTYsIGIuZ2V0Q29uZmlnKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJGYWlsZWQgd2l0aCAiICsgZSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKEJpdG1hcC5Db21wcmVzc0Zvcm1hdCBmb3JtYXQgOiBuZXcgQml0bWFwLkNvbXByZXNzRm9ybWF0W10geworICAgICAgICAgICAgICAgIEJpdG1hcC5Db21wcmVzc0Zvcm1hdC5KUEVHLAorICAgICAgICAgICAgICAgIEJpdG1hcC5Db21wcmVzc0Zvcm1hdC5XRUJQLAorICAgICAgICAgICAgICAgIEJpdG1hcC5Db21wcmVzc0Zvcm1hdC5QTkcsCisgICAgICAgIH0pIHsKKyAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJGYWlsZWQgdG8gZW5jb2RlIEYxNiB0byAiICsgZm9ybWF0LCBiLmNvbXByZXNzKGZvcm1hdCwgMTAwLCBvdXQpKTsKKworICAgICAgICAgICAgYnl0ZVtdIGFycmF5ID0gb3V0LnRvQnl0ZUFycmF5KCk7CisgICAgICAgICAgICBzcmMgPSBJbWFnZURlY29kZXIuY3JlYXRlU291cmNlKEJ5dGVCdWZmZXIud3JhcChhcnJheSkpOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEJpdG1hcCBiMiA9IEltYWdlRGVjb2Rlci5kZWNvZGVCaXRtYXAoc3JjKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIldyb25nIGNvbG9yIHNwYWNlIGZvciAiICsgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JTcGFjZS5nZXQoQ29sb3JTcGFjZS5OYW1lZC5ESVNQTEFZX1AzKSwgYjIuZ2V0Q29sb3JTcGFjZSgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJGYWlsZWQgd2l0aCAiICsgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbmNvZGVQM2hhcmR3YXJlKCkgeworICAgICAgICBCaXRtYXAgYiA9IG51bGw7CisgICAgICAgIEltYWdlRGVjb2Rlci5Tb3VyY2Ugc3JjID0gSW1hZ2VEZWNvZGVyLmNyZWF0ZVNvdXJjZShtUmVzb3VyY2VzLmdldEFzc2V0cygpLAorICAgICAgICAgICAgICAgICJncmVlbi1wMy5wbmciKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGIgPSBJbWFnZURlY29kZXIuZGVjb2RlQml0bWFwKHNyYywgKGRlY29kZXIsIGluZm8sIHMpIC0+IHsKKyAgICAgICAgICAgICAgICBkZWNvZGVyLnNldEFsbG9jYXRvcihJbWFnZURlY29kZXIuQUxMT0NBVE9SX0hBUkRXQVJFKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChiKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhCaXRtYXAuQ29uZmlnLkhBUkRXQVJFLCBiLmdldENvbmZpZygpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhDb2xvclNwYWNlLmdldChDb2xvclNwYWNlLk5hbWVkLkRJU1BMQVlfUDMpLCBiLmdldENvbG9yU3BhY2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkZhaWxlZCB3aXRoICIgKyBlKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoQml0bWFwLkNvbXByZXNzRm9ybWF0IGZvcm1hdCA6IG5ldyBCaXRtYXAuQ29tcHJlc3NGb3JtYXRbXSB7CisgICAgICAgICAgICAgICAgQml0bWFwLkNvbXByZXNzRm9ybWF0LkpQRUcsCisgICAgICAgICAgICAgICAgQml0bWFwLkNvbXByZXNzRm9ybWF0LldFQlAsCisgICAgICAgICAgICAgICAgQml0bWFwLkNvbXByZXNzRm9ybWF0LlBORywKKyAgICAgICAgfSkgeworICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkZhaWxlZCB0byBlbmNvZGUgODg4OCB0byAiICsgZm9ybWF0LCBiLmNvbXByZXNzKGZvcm1hdCwgMTAwLCBvdXQpKTsKKworICAgICAgICAgICAgYnl0ZVtdIGFycmF5ID0gb3V0LnRvQnl0ZUFycmF5KCk7CisgICAgICAgICAgICBzcmMgPSBJbWFnZURlY29kZXIuY3JlYXRlU291cmNlKEJ5dGVCdWZmZXIud3JhcChhcnJheSkpOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEJpdG1hcCBiMiA9IEltYWdlRGVjb2Rlci5kZWNvZGVCaXRtYXAoc3JjKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIldyb25nIGNvbG9yIHNwYWNlIGZvciAiICsgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JTcGFjZS5nZXQoQ29sb3JTcGFjZS5OYW1lZC5ESVNQTEFZX1AzKSwgYjIuZ2V0Q29sb3JTcGFjZSgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJGYWlsZWQgd2l0aCAiICsgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBSZXF1aXJlc0RldmljZSAvLyBTd2lmdFNoYWRlciBkb2VzIG5vdCB5ZXQgaGF2ZSBzdXBwb3J0IGZvciBGMTYgaW4gSEFSRFdBUkUgYi83NTc3ODAyNAorICAgIHB1YmxpYyB2b2lkIHRlc3QxNmJpdEhhcmR3YXJlKCkgeworICAgICAgICAvLyBEZWNvZGluZyB0byBIQVJEV0FSRSBtYXkgdXNlIExJTkVBUl9FWFRFTkRFRF9TUkdCIG9yIFNSR0IsIGRlcGVuZGluZworICAgICAgICAvLyBvbiB3aGV0aGVyIEYxNiBpcyBzdXBwb3J0ZWQgaW4gSEFSRFdBUkUuCisgICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaW4gPSBtUmVzb3VyY2VzLmdldEFzc2V0cygpLm9wZW4oInByb3Bob3RvLXJnYmExNmYucG5nIikpIHsKKyAgICAgICAgICAgIEJpdG1hcEZhY3RvcnkuT3B0aW9ucyBvcHRpb25zID0gbmV3IEJpdG1hcEZhY3RvcnkuT3B0aW9ucygpOworICAgICAgICAgICAgb3B0aW9ucy5pblByZWZlcnJlZENvbmZpZyA9IEJpdG1hcC5Db25maWcuSEFSRFdBUkU7CisgICAgICAgICAgICBCaXRtYXAgYiA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlU3RyZWFtKGluLCBudWxsLCBvcHRpb25zKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhCaXRtYXAuQ29uZmlnLkhBUkRXQVJFLCBiLmdldENvbmZpZygpKTsKKworICAgICAgICAgICAgZmluYWwgQ29sb3JTcGFjZSBjcyA9IGIuZ2V0Q29sb3JTcGFjZSgpOworICAgICAgICAgICAgaWYgKGNzICE9IENvbG9yU3BhY2UuZ2V0KENvbG9yU3BhY2UuTmFtZWQuTElORUFSX0VYVEVOREVEX1NSR0IpCisgICAgICAgICAgICAgICAgICAgICYmIGNzICE9IENvbG9yU3BhY2UuZ2V0KENvbG9yU3BhY2UuTmFtZWQuU1JHQikpIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIGNvbG9yIHNwYWNlICIgKyBjcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJGYWlsZWQgd2l0aCAiICsgZSk7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvQml0bWFwRmFjdG9yeVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9CaXRtYXBGYWN0b3J5VGVzdC5qYXZhCmluZGV4IDI5ZWNiNjQuLjAyMzRmY2YgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9CaXRtYXBGYWN0b3J5VGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9CaXRtYXBGYWN0b3J5VGVzdC5qYXZhCkBAIC0zNCwxNSArMzQsMTUgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnN5c3RlbS5FcnJub0V4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLnN5c3RlbS5PczsKLWltcG9ydCBhbmRyb2lkLnN5c3RlbS5Pc0NvbnN0YW50czsKIGltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlR5cGVkVmFsdWU7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpAQCAtNTcsOSArNTcsNiBAQAogaW1wb3J0IGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZTsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ2RkVGVzdDsKLQotQENkZFRlc3QocmVxdWlyZW1lbnQ9IjUuMS41L0MtMC0xLEMtMC0yLEMtMC0zLEMtMC00LEMtMC01IikKIEBTbWFsbFRlc3QKIEBSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCiBwdWJsaWMgY2xhc3MgQml0bWFwRmFjdG9yeVRlc3QgewpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL0JpdG1hcEZhY3RvcnlfT3B0aW9uc1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9CaXRtYXBGYWN0b3J5X09wdGlvbnNUZXN0LmphdmEKaW5kZXggYWQ3NTliYi4uMzk0MTI0MCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL0JpdG1hcEZhY3RvcnlfT3B0aW9uc1Rlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvQml0bWFwRmFjdG9yeV9PcHRpb25zVGVzdC5qYXZhCkBAIC0xNSwyNSArMTUsMjggQEAKICAqLwogcGFja2FnZSBhbmRyb2lkLmdyYXBoaWNzLmN0czsKIAoraW1wb3J0IHN0YXRpYyBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbjsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKIGltcG9ydCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb247CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldE1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbjsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotCiBAU21hbGxUZXN0CiBAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQogcHVibGljIGNsYXNzIEJpdG1hcEZhY3RvcnlfT3B0aW9uc1Rlc3QgewpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL0JpdG1hcFJHQkFGMTZUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvQml0bWFwUkdCQUYxNlRlc3QuamF2YQppbmRleCAwMmM5NDI1Li44ZDJjOTFjIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvQml0bWFwUkdCQUYxNlRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvQml0bWFwUkdCQUYxNlRlc3QuamF2YQpAQCAtMjUsOSArMjUsMTAgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcC5Db25maWc7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL0JpdG1hcFJlZ2lvbkRlY29kZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvQml0bWFwUmVnaW9uRGVjb2RlclRlc3QuamF2YQppbmRleCBiODYzODYxLi5lMDIyYzhmIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvQml0bWFwUmVnaW9uRGVjb2RlclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvQml0bWFwUmVnaW9uRGVjb2RlclRlc3QuamF2YQpAQCAtMzQsMTAgKzM0LDExIEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvclNwYWNlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTGFyZ2VUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTGFyZ2VUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIAogaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwpAQCAtNTYyLDYgKzU2MywzMyBAQAogICAgICAgICByZWdpb24ucmVjeWNsZSgpOwogICAgIH0KIAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEYxNldpdGhJbkJpdG1hcCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIFRoaXMgaW1hZ2Ugbm9ybWFsbHkgZGVjb2RlcyB0byBGMTYsIGJ1dCBpZiB0aGVyZSBpcyBhbiBpbkJpdG1hcCwKKyAgICAgICAgLy8gZGVjb2Rpbmcgd2lsbCBtYXRjaCB0aGUgQ29uZmlnIG9mIHRoYXQgQml0bWFwLgorICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG9idGFpbklucHV0U3RyZWFtKEFTU0VUX05BTUVTWzBdKTsgLy8gRjE2CisgICAgICAgIEJpdG1hcFJlZ2lvbkRlY29kZXIgZGVjb2RlciA9IEJpdG1hcFJlZ2lvbkRlY29kZXIubmV3SW5zdGFuY2UoaXMsIGZhbHNlKTsKKworICAgICAgICBPcHRpb25zIG9wdHMgPSBuZXcgQml0bWFwRmFjdG9yeS5PcHRpb25zKCk7CisgICAgICAgIGZvciAoQml0bWFwLkNvbmZpZyBjb25maWcgOiBuZXcgQml0bWFwLkNvbmZpZ1tdIHsKKyAgICAgICAgICAgICAgICBudWxsLCAvLyBEbyBub3QgdXNlIGluQml0bWFwCisgICAgICAgICAgICAgICAgQml0bWFwLkNvbmZpZy5BUkdCXzg4ODgsCisgICAgICAgICAgICAgICAgQml0bWFwLkNvbmZpZy5SR0JfNTY1fSkgeworICAgICAgICAgICAgQml0bWFwLkNvbmZpZyBleHBlY3RlZCA9IGNvbmZpZzsKKyAgICAgICAgICAgIGlmIChleHBlY3RlZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBCaXRtYXAuQ29uZmlnLlJHQkFfRjE2OworICAgICAgICAgICAgICAgIG9wdHMuaW5CaXRtYXAgPSBudWxsOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvcHRzLmluQml0bWFwID0gQml0bWFwLmNyZWF0ZUJpdG1hcChkZWNvZGVyLmdldFdpZHRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyLmdldEhlaWdodCgpLCBjb25maWcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQml0bWFwIHJlc3VsdCA9IGRlY29kZXIuZGVjb2RlUmVnaW9uKG5ldyBSZWN0KDAsIDAsIGRlY29kZXIuZ2V0V2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXIuZ2V0SGVpZ2h0KCkpLCBvcHRzKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwocmVzdWx0KTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgcmVzdWx0LmdldENvbmZpZygpKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIEBUZXN0KGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQogICAgIHB1YmxpYyB2b2lkIHRlc3RJbkNvbG9yU3BhY2VOb3RSZ2IoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBPcHRpb25zIG9wdHMgPSBuZXcgQml0bWFwRmFjdG9yeS5PcHRpb25zKCk7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvQml0bWFwU2hhZGVyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL0JpdG1hcFNoYWRlclRlc3QuamF2YQppbmRleCAwYjRmMjlmLi41YjNkZWRmIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvQml0bWFwU2hhZGVyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9CaXRtYXBTaGFkZXJUZXN0LmphdmEKQEAgLTI0LDggKzI0LDkgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5TaGFkZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiAKIGltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL0JpdG1hcFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9CaXRtYXBUZXN0LmphdmEKaW5kZXggMjlhZWZiZTQuLmEwYzA5ZjEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9CaXRtYXBUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL0JpdG1hcFRlc3QuamF2YQpAQCAtMzUsMTMgKzM1LDE0IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5EZWJ1ZzsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKIGltcG9ydCBhbmRyb2lkLm9zLlN0cmljdE1vZGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5MYXJnZVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOwogaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTGFyZ2VUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ29sb3JVdGlsczsKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLldpZGdldFRlc3RVdGlsczsKIApAQCAtMTEyNSwxMiArMTEyNiwxNSBAQAogICAgICAgICB9IGNhdGNoKFJ1bnRpbWVFeGNlcHRpb24gZSl7CiAgICAgICAgIH0KIAorICAgICAgICBwLnJlY3ljbGUoKTsKICAgICAgICAgLy8gbm9ybWFsIGNhc2UKICAgICAgICAgcCA9IFBhcmNlbC5vYnRhaW4oKTsKICAgICAgICAgbUJpdG1hcCA9IEJpdG1hcC5jcmVhdGVCaXRtYXAoMTAwLCAxMDAsIENvbmZpZy5BUkdCXzg4ODgpOwogICAgICAgICBtQml0bWFwLndyaXRlVG9QYXJjZWwocCwgMCk7CiAgICAgICAgIHAuc2V0RGF0YVBvc2l0aW9uKDApOwogICAgICAgICBhc3NlcnRUcnVlKG1CaXRtYXAuc2FtZUFzKEJpdG1hcC5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwocCkpKTsKKworICAgICAgICBwLnJlY3ljbGUoKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMTE0MSw2ICsxMTQ1LDggQEAKICAgICAgICAgcC5zZXREYXRhUG9zaXRpb24oMCk7CiAgICAgICAgIEJpdG1hcCBleHBlY3RlZEJpdG1hcCA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UobVJlcywgUi5kcmF3YWJsZS5yb2JvdCk7CiAgICAgICAgIGFzc2VydFRydWUoZXhwZWN0ZWRCaXRtYXAuc2FtZUFzKEJpdG1hcC5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwocCkpKTsKKworICAgICAgICBwLnJlY3ljbGUoKTsKICAgICB9CiAKICAgICBAVGVzdApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL0JpdG1hcF9Db21wcmVzc0Zvcm1hdFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9CaXRtYXBfQ29tcHJlc3NGb3JtYXRUZXN0LmphdmEKaW5kZXggOTA4OWJhYS4uZDQyZTljYSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL0JpdG1hcF9Db21wcmVzc0Zvcm1hdFRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvQml0bWFwX0NvbXByZXNzRm9ybWF0VGVzdC5qYXZhCkBAIC0yMSwxMCArMjEsOSBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwLkNvbXByZXNzRm9ybWF0OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwLkNvbmZpZzsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ2RkVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiAKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CkBAIC0zNCw4ICszMyw2IEBACiBAU21hbGxUZXN0CiBAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQogcHVibGljIGNsYXNzIEJpdG1hcF9Db21wcmVzc0Zvcm1hdFRlc3QgewotCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjUuMS40L0MtMC0xLEMtMC0yLEMtMC0zIikKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RWYWx1ZU9mKCl7CiAgICAgICAgIGFzc2VydEVxdWFscyhDb21wcmVzc0Zvcm1hdC5KUEVHLCBDb21wcmVzc0Zvcm1hdC52YWx1ZU9mKCJKUEVHIikpOwpAQCAtNDMsNyArNDAsNiBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoQ29tcHJlc3NGb3JtYXQuV0VCUCwgQ29tcHJlc3NGb3JtYXQudmFsdWVPZigiV0VCUCIpKTsKICAgICB9CiAKLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iNS4xLjQvQy0wLTEsQy0wLTIsQy0wLTMiKQogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFZhbHVlcygpewogICAgICAgICBDb21wcmVzc0Zvcm1hdFtdIGNvbUZvcm1hdCA9IENvbXByZXNzRm9ybWF0LnZhbHVlcygpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL0JpdG1hcF9Db25maWdUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvQml0bWFwX0NvbmZpZ1Rlc3QuamF2YQppbmRleCBiYWJjZjkxLi41ZWYxNDVhIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvQml0bWFwX0NvbmZpZ1Rlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvQml0bWFwX0NvbmZpZ1Rlc3QuamF2YQpAQCAtMjEsOCArMjEsOSBAQAogCiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAuQ29uZmlnOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL0JsdXJNYXNrRmlsdGVyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL0JsdXJNYXNrRmlsdGVyVGVzdC5qYXZhCmluZGV4IGIzMTViYzkuLjY2NzgyOTEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9CbHVyTWFza0ZpbHRlclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvQmx1ck1hc2tGaWx0ZXJUZXN0LmphdmEKQEAgLTI0LDggKzI0LDkgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiAKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CkBAIC0zNSw2ICszNiw3IEBACiBwdWJsaWMgY2xhc3MgQmx1ck1hc2tGaWx0ZXJUZXN0IHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0ZGU0VUID0gMTA7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJBRElVUyA9IDU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENIRUNLX1JBRElVUyA9IDg7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJJVE1BUF9XSURUSCA9IDEwMDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQklUTUFQX0hFSUdIVCA9IDEwMDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0VOVEVSID0gQklUTUFQX0hFSUdIVCAvIDI7CkBAIC01MSwxMyArNTMsMTMgQEAKICAgICAgICAgY2FudmFzLmRyYXdSZWN0KENFTlRFUiAtIE9GRlNFVCwgQ0VOVEVSIC0gT0ZGU0VULCBDRU5URVIgKyBPRkZTRVQsIENFTlRFUiArIE9GRlNFVCwgcGFpbnQpOwogICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IENFTlRFUjsgeCsrKSB7CiAgICAgICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IENFTlRFUjsgeSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHggPCBDRU5URVIgLSBPRkZTRVQgLSBSQURJVVMgfHwgeSA8IENFTlRFUiAtIE9GRlNFVCAtIFJBRElVUykgeworICAgICAgICAgICAgICAgIGlmICh4IDwgQ0VOVEVSIC0gT0ZGU0VUIC0gQ0hFQ0tfUkFESVVTIHx8IHkgPCBDRU5URVIgLSBPRkZTRVQgLSBDSEVDS19SQURJVVMpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhhdCBjb2xvciBkaWRuJ3QgYmxlZWQgKG11Y2gpIGJleW9uZCByYWRpdXMKICAgICAgICAgICAgICAgICAgICAgdmVyaWZ5UXVhZHJhbnRzKENvbG9yLlRSQU5TUEFSRU5ULCBiLCB4LCB5LCA1KTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHggPiBDRU5URVIgLSBPRkZTRVQgKyBSQURJVVMgJiYgeSA+IENFTlRFUiAtIE9GRlNFVCArIFJBRElVUykgewogICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGF0IGNvbG9yIGRpZG4ndCB3YXNoIG91dCAobXVjaCkgaW4gdGhlIGNlbnRlcgotICAgICAgICAgICAgICAgICAgICB2ZXJpZnlRdWFkcmFudHMoQ29sb3IuUkVELCBiLCB4LCB5LCA1KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB2ZXJpZnlRdWFkcmFudHMoQ29sb3IuUkVELCBiLCB4LCB5LCA4KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHggPiBDRU5URVIgLSBPRkZTRVQgLSBSQURJVVMgJiYgeSA+IENFTlRFUiAtIE9GRlNFVCAtIFJBRElVUykgewogICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBibHVyIHpvbmUsIGNvbG9yIHNob3VsZCByZW1haW4sIGFscGhhIHZhcmllcwogICAgICAgICAgICAgICAgICAgICB2ZXJpZnlRdWFkcmFudHMoQ29sb3IuUkVELCBiLCB4LCB5LCAyNTUpOwogICAgICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9CbHVyTWFza0ZpbHRlcl9CbHVyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL0JsdXJNYXNrRmlsdGVyX0JsdXJUZXN0LmphdmEKaW5kZXggYmRjNDRhZi4uZDdhMWI5YSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL0JsdXJNYXNrRmlsdGVyX0JsdXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL0JsdXJNYXNrRmlsdGVyX0JsdXJUZXN0LmphdmEKQEAgLTIwLDggKzIwLDkgQEAKIAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQmx1ck1hc2tGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CbHVyTWFza0ZpbHRlci5CbHVyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL0NhbWVyYUdwdUN0c0FjdGl2aXR5LmphdmEgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvQ2FtZXJhR3B1Q3RzQWN0aXZpdHkuamF2YQppbmRleCA3ZGY5ODkyLi42NTA4YmYzIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvQ2FtZXJhR3B1Q3RzQWN0aXZpdHkuamF2YQorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvQ2FtZXJhR3B1Q3RzQWN0aXZpdHkuamF2YQpAQCAtMjAsMTAgKzIwLDExIEBACiBpbXBvcnQgYW5kcm9pZC5vcGVuZ2wuR0xTdXJmYWNlVmlldzsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TZW1hcGhvcmU7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKIGltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMQ29uZmlnOwogaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTA7CiAKQEAgLTM5LDYgKzQwLDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkNhbWVyYUdwdUN0c0FjdGl2aXR5IjsKIAogICAgIHByb3RlY3RlZCBHTFN1cmZhY2VWaWV3IG1WaWV3OworICAgIHByb3RlY3RlZCBTZW1hcGhvcmUgbU5hdGl2ZVJlbmRlcmVySW5pdGlhbGl6ZWQ7CiAgICAgcHJvdGVjdGVkIGxvbmcgbU5hdGl2ZVJlbmRlcmVyOwogICAgIHByaXZhdGUgQ291bnREb3duTGF0Y2ggbUZpbmlzaGVkUmVuZGVyaW5nOwogCkBAIC01NSwxMiArNTcsMTQgQEAKIAogICAgICAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VDcmVhdGVkKEdMMTAgZ2wsIEVHTENvbmZpZyBjb25maWcpIHsKICAgICAgICAgICAgIG1OYXRpdmVSZW5kZXJlciA9IG5DcmVhdGVSZW5kZXJlcigpOworICAgICAgICAgICAgbU5hdGl2ZVJlbmRlcmVySW5pdGlhbGl6ZWQucmVsZWFzZSgpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewogICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBtTmF0aXZlUmVuZGVyZXJJbml0aWFsaXplZCA9IG5ldyBTZW1hcGhvcmUoMCk7CiAgICAgICAgIG1WaWV3ID0gbmV3IEdMU3VyZmFjZVZpZXcodGhpcyk7CiAgICAgICAgIG1WaWV3LnNldEVHTENvbnRleHRDbGllbnRWZXJzaW9uKDIpOwogICAgICAgICBtVmlldy5zZXRSZW5kZXJlcihuZXcgUmVuZGVyZXIoKSk7CkBAIC05Miw2ICs5Niw4IEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgd2FpdFRvRmluaXNoUmVuZGVyaW5nKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gV2FpdCBmb3IgcmVuZGVyZXIgaW5pdGlhbGl6YXRpb24KKyAgICAgICAgbU5hdGl2ZVJlbmRlcmVySW5pdGlhbGl6ZWQuYWNxdWlyZSgpOwogICAgICAgICAvLyBTa2lwIHRoZSB0ZXN0IGlmIHRoZXJlIGlzIG5vIGNhbWVyYSBvbiBib2FyZC4KICAgICAgICAgaWYgKCFuSXNDYW1lcmFSZWFkeShtTmF0aXZlUmVuZGVyZXIpKSB7CiAgICAgICAgICAgICByZXR1cm47CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvQ2FtZXJhR3B1VGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL0NhbWVyYUdwdVRlc3QuamF2YQppbmRleCAwMmJmZDUxLi5kMWIwMmNjIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvQ2FtZXJhR3B1VGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9DYW1lcmFHcHVUZXN0LmphdmEKQEAgLTE1LDkgKzE1LDExIEBACiAgKi8KIHBhY2thZ2UgYW5kcm9pZC5ncmFwaGljcy5jdHM7CiAKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLkxhcmdlVGVzdDsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvQ2FtZXJhVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL0NhbWVyYVRlc3QuamF2YQppbmRleCA2MWI2NDIyLi5mZjhmNzdjIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvQ2FtZXJhVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9DYW1lcmFUZXN0LmphdmEKQEAgLTIyLDggKzIyLDkgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbWVyYTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLk1hdHJpeDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvQ2FtZXJhVnVsa2FuR3B1VGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL0NhbWVyYVZ1bGthbkdwdVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODNhMTdhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL0NhbWVyYVZ1bGthbkdwdVRlc3QuamF2YQpAQCAtMCwwICsxLDgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5ncmFwaGljcy5jdHM7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYUNoYXJhY3RlcmlzdGljczsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5Qcm9wZXJ0eVV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworCitAU21hbGxUZXN0CitAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIENhbWVyYVZ1bGthbkdwdVRlc3QgeworCisgICAgc3RhdGljIHsKKyAgICAgICAgU3lzdGVtLmxvYWRMaWJyYXJ5KCJjdHNncmFwaGljc19qbmkiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDYW1lcmFJbXBvcnRBbmRSZW5kZXJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUGFja2FnZU1hbmFnZXIgcG0gPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCkuZ2V0UGFja2FnZU1hbmFnZXIoKTsKKyAgICAgICAgaWYgKCFwbS5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfQ0FNRVJBKSkgeworICAgICAgICAgICAgLy8gVGVzdCByZXF1aXJlcyBhIGNhbWVyYS4KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmKFByb3BlcnR5VXRpbC5nZXRGaXJzdEFwaUxldmVsKCkgPCAyOCl7CisgICAgICAgICAgICAvLyBIQUwzIGlzIG5vdCByZXF1aXJlZCBmb3IgUCB1cGdyYWRlIGRldmljZXMuCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBDYW1lcmFNYW5hZ2VyIGNhbU1nciA9CisgICAgICAgICAgICAgICAgKENhbWVyYU1hbmFnZXIpIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5DQU1FUkFfU0VSVklDRSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmdbXSBjYW1lcmFJZHMgPSBjYW1NZ3IuZ2V0Q2FtZXJhSWRMaXN0KCk7CisgICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBtVG9CZVRlc3RlZENhbWVyYUlkcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICAgICAgZm9yIChTdHJpbmcgaWQgOiBjYW1lcmFJZHMpIHsKKyAgICAgICAgICAgICAgICBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MgY2hhcmFjdGVyaXN0aWNzID0gY2FtTWdyLmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhpZCk7CisgICAgICAgICAgICAgICAgaW50IGh3TGV2ZWwgPQorICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyaXN0aWNzLmdldChDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuSU5GT19TVVBQT1JURURfSEFSRFdBUkVfTEVWRUwpOworICAgICAgICAgICAgICAgIGlmIChod0xldmVsICE9IENhbWVyYUNoYXJhY3RlcmlzdGljcy5JTkZPX1NVUFBPUlRFRF9IQVJEV0FSRV9MRVZFTF9MRUdBQ1kpIHsKKyAgICAgICAgICAgICAgICAgICAgbVRvQmVUZXN0ZWRDYW1lcmFJZHMuYWRkKGlkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHNraXAgdGhlIHRlc3QgaWYgYWxsIGNhbWVyYSBkZXZpY2VzIGFyZSBsZWdhY3kKKyAgICAgICAgICAgIGlmIChtVG9CZVRlc3RlZENhbWVyYUlkcy5zaXplKCkgPT0gMCkgcmV0dXJuOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgZXhjZXB0aW9uIHRoYXQgc2hvdWxkIGJlIHRocm93biBpbiB0aGlzIGNhc2UuCisgICAgICAgIH0KKworICAgICAgICBsb2FkQ2FtZXJhQW5kVmVyaWZ5RnJhbWVJbXBvcnQoSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpLmdldEFzc2V0cygpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBsb2FkQ2FtZXJhQW5kVmVyaWZ5RnJhbWVJbXBvcnQoQXNzZXRNYW5hZ2VyIGFzc2V0TWFuYWdlcik7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvQ2FudmFzVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL0NhbnZhc1Rlc3QuamF2YQppbmRleCBiMzZjMjNhLi5iODdhOGIwIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvQ2FudmFzVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9DYW52YXNUZXN0LmphdmEKQEAgLTIwLDYgKzIwLDcgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwpAQCAtNDMsMjUgKzQ0LDI1IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0RjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbi5PcDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlNoYWRlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nOwogaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmdCdWlsZGVyOwogaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmVkU3RyaW5nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ29sb3JVdGlsczsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIAotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ29sb3JVdGlsczsKIAogaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKIEBTbWFsbFRlc3QKIEBSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCiBwdWJsaWMgY2xhc3MgQ2FudmFzVGVzdCB7CkBAIC0yMDYsNyArMjA3LDcgQEAKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTYXZlMSgpIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2F2ZSgpIHsKICAgICAgICAgZmluYWwgTWF0cml4IG0xID0gbmV3IE1hdHJpeCgpOwogICAgICAgICBtMS5zZXRWYWx1ZXModmFsdWVzMSk7CiAgICAgICAgIG1DYW52YXMuc2V0TWF0cml4KG0xKTsKQEAgLTIzMSwyODkgKzIzMiwxNSBAQAogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNhdmUyKCkgewotICAgICAgICAvLyB0ZXN0IHNhdmUgY3VycmVudCBtYXRyaXggb25seQotICAgICAgICBNYXRyaXggbTEgPSBuZXcgTWF0cml4KCk7Ci0gICAgICAgIG0xLnNldFZhbHVlcyh2YWx1ZXMxKTsKLSAgICAgICAgbUNhbnZhcy5zZXRNYXRyaXgobTEpOwotICAgICAgICBtQ2FudmFzLnNhdmUoQ2FudmFzLk1BVFJJWF9TQVZFX0ZMQUcpOwotCi0gICAgICAgIE1hdHJpeCBtMiA9IG5ldyBNYXRyaXgoKTsKLSAgICAgICAgbTIuc2V0VmFsdWVzKHZhbHVlczIpOwotICAgICAgICBtQ2FudmFzLnNldE1hdHJpeChtMik7Ci0KLSAgICAgICAgZmxvYXRbXSB2YWx1ZXMzID0gbmV3IGZsb2F0W0ZMT0FUX0FSUkFZX0xFTl07Ci0gICAgICAgIE1hdHJpeCBtMyA9IG1DYW52YXMuZ2V0TWF0cml4KCk7Ci0gICAgICAgIG0zLmdldFZhbHVlcyh2YWx1ZXMzKTsKLQotICAgICAgICBhc3NlcnRBcnJheUVxdWFscyh2YWx1ZXMyLCB2YWx1ZXMzLCAwLjBmKTsKLQotICAgICAgICBtQ2FudmFzLnJlc3RvcmUoKTsKLSAgICAgICAgZmxvYXRbXSB2YWx1ZXM0ID0gbmV3IGZsb2F0W0ZMT0FUX0FSUkFZX0xFTl07Ci0gICAgICAgIE1hdHJpeCBtNCA9IG1DYW52YXMuZ2V0TWF0cml4KCk7Ci0gICAgICAgIG00LmdldFZhbHVlcyh2YWx1ZXM0KTsKLQotICAgICAgICBhc3NlcnRBcnJheUVxdWFscyh2YWx1ZXMxLCB2YWx1ZXM0LCAwLjBmKTsKLQotICAgICAgICAvLyB0ZXN0IHNhdmUgY3VycmVudCBjbGlwIG9ubHksIGRvbid0IGtub3cgaG93IHRvIGdldCBjbGlwIHNhdmVkLAotICAgICAgICAvLyBidXQgY2FuIG1ha2Ugc3VyZSBNYXRyaXggY2FuJ3QgYmUgc2F2ZWQgaW4gdGhpcyBjYXNlCi0gICAgICAgIG0xID0gbmV3IE1hdHJpeCgpOwotICAgICAgICBtMS5zZXRWYWx1ZXModmFsdWVzMSk7Ci0gICAgICAgIG1DYW52YXMuc2V0TWF0cml4KG0xKTsKLSAgICAgICAgbUNhbnZhcy5zYXZlKENhbnZhcy5DTElQX1NBVkVfRkxBRyk7Ci0KLSAgICAgICAgbTIgPSBuZXcgTWF0cml4KCk7Ci0gICAgICAgIG0yLnNldFZhbHVlcyh2YWx1ZXMyKTsKLSAgICAgICAgbUNhbnZhcy5zZXRNYXRyaXgobTIpOwotCi0gICAgICAgIHZhbHVlczMgPSBuZXcgZmxvYXRbRkxPQVRfQVJSQVlfTEVOXTsKLSAgICAgICAgbTMgPSBtQ2FudmFzLmdldE1hdHJpeCgpOwotICAgICAgICBtMy5nZXRWYWx1ZXModmFsdWVzMyk7Ci0KLSAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHModmFsdWVzMiwgdmFsdWVzMywgMC4wZik7Ci0KLSAgICAgICAgbUNhbnZhcy5yZXN0b3JlKCk7Ci0gICAgICAgIHZhbHVlczQgPSBuZXcgZmxvYXRbRkxPQVRfQVJSQVlfTEVOXTsKLSAgICAgICAgbTQgPSBtQ2FudmFzLmdldE1hdHJpeCgpOwotICAgICAgICBtNC5nZXRWYWx1ZXModmFsdWVzNCk7Ci0KLSAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHModmFsdWVzMiwgdmFsdWVzNCwgMC4wZik7Ci0KLSAgICAgICAgLy8gdGVzdCBzYXZlIGV2ZXJ5dGhpbmcKLSAgICAgICAgbTEgPSBuZXcgTWF0cml4KCk7Ci0gICAgICAgIG0xLnNldFZhbHVlcyh2YWx1ZXMxKTsKLSAgICAgICAgbUNhbnZhcy5zZXRNYXRyaXgobTEpOwotICAgICAgICBtQ2FudmFzLnNhdmUoQ2FudmFzLkFMTF9TQVZFX0ZMQUcpOwotCi0gICAgICAgIG0yID0gbmV3IE1hdHJpeCgpOwotICAgICAgICBtMi5zZXRWYWx1ZXModmFsdWVzMik7Ci0gICAgICAgIG1DYW52YXMuc2V0TWF0cml4KG0yKTsKLQotICAgICAgICB2YWx1ZXMzID0gbmV3IGZsb2F0W0ZMT0FUX0FSUkFZX0xFTl07Ci0gICAgICAgIG0zID0gbUNhbnZhcy5nZXRNYXRyaXgoKTsKLSAgICAgICAgbTMuZ2V0VmFsdWVzKHZhbHVlczMpOwotCi0gICAgICAgIGFzc2VydEFycmF5RXF1YWxzKHZhbHVlczIsIHZhbHVlczMsIDAuMGYpOwotCi0gICAgICAgIG1DYW52YXMucmVzdG9yZSgpOwotICAgICAgICB2YWx1ZXM0ID0gbmV3IGZsb2F0W0ZMT0FUX0FSUkFZX0xFTl07Ci0gICAgICAgIG00ID0gbUNhbnZhcy5nZXRNYXRyaXgoKTsKLSAgICAgICAgbTQuZ2V0VmFsdWVzKHZhbHVlczQpOwotCi0gICAgICAgIGFzc2VydEFycmF5RXF1YWxzKHZhbHVlczEsIHZhbHVlczQsIDAuMGYpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNhdmVGbGFnczEoKSB7Ci0gICAgICAgIGludFtdIGZsYWdzID0gewotICAgICAgICAgICAgQ2FudmFzLk1BVFJJWF9TQVZFX0ZMQUcsCi0gICAgICAgIH07Ci0gICAgICAgIHZlcmlmeVNhdmVGbGFnc1NlcXVlbmNlKGZsYWdzKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTYXZlRmxhZ3MyKCkgewotICAgICAgICBpbnRbXSBmbGFncyA9IHsKLSAgICAgICAgICAgIENhbnZhcy5DTElQX1NBVkVfRkxBRywKLSAgICAgICAgfTsKLSAgICAgICAgdmVyaWZ5U2F2ZUZsYWdzU2VxdWVuY2UoZmxhZ3MpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNhdmVGbGFnczMoKSB7Ci0gICAgICAgIGludFtdIGZsYWdzID0gewotICAgICAgICAgICAgQ2FudmFzLkFMTF9TQVZFX0ZMQUcsCi0gICAgICAgICAgICBDYW52YXMuTUFUUklYX1NBVkVfRkxBRywKLSAgICAgICAgICAgIENhbnZhcy5NQVRSSVhfU0FWRV9GTEFHLAotICAgICAgICB9OwotICAgICAgICB2ZXJpZnlTYXZlRmxhZ3NTZXF1ZW5jZShmbGFncyk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2F2ZUZsYWdzNCgpIHsKLSAgICAgICAgaW50W10gZmxhZ3MgPSB7Ci0gICAgICAgICAgICBDYW52YXMuQUxMX1NBVkVfRkxBRywKLSAgICAgICAgICAgIENhbnZhcy5DTElQX1NBVkVfRkxBRywKLSAgICAgICAgICAgIENhbnZhcy5DTElQX1NBVkVfRkxBRywKLSAgICAgICAgfTsKLSAgICAgICAgdmVyaWZ5U2F2ZUZsYWdzU2VxdWVuY2UoZmxhZ3MpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNhdmVGbGFnczUoKSB7Ci0gICAgICAgIGludFtdIGZsYWdzID0gewotICAgICAgICAgICAgQ2FudmFzLk1BVFJJWF9TQVZFX0ZMQUcsCi0gICAgICAgICAgICBDYW52YXMuTUFUUklYX1NBVkVfRkxBRywKLSAgICAgICAgICAgIENhbnZhcy5DTElQX1NBVkVfRkxBRywKLSAgICAgICAgICAgIENhbnZhcy5DTElQX1NBVkVfRkxBRywKLSAgICAgICAgICAgIENhbnZhcy5NQVRSSVhfU0FWRV9GTEFHLAotICAgICAgICAgICAgQ2FudmFzLk1BVFJJWF9TQVZFX0ZMQUcsCi0gICAgICAgIH07Ci0gICAgICAgIHZlcmlmeVNhdmVGbGFnc1NlcXVlbmNlKGZsYWdzKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTYXZlRmxhZ3M2KCkgewotICAgICAgICBpbnRbXSBmbGFncyA9IHsKLSAgICAgICAgICAgIENhbnZhcy5DTElQX1NBVkVfRkxBRywKLSAgICAgICAgICAgIENhbnZhcy5DTElQX1NBVkVfRkxBRywKLSAgICAgICAgICAgIENhbnZhcy5NQVRSSVhfU0FWRV9GTEFHLAotICAgICAgICAgICAgQ2FudmFzLk1BVFJJWF9TQVZFX0ZMQUcsCi0gICAgICAgICAgICBDYW52YXMuQ0xJUF9TQVZFX0ZMQUcsCi0gICAgICAgICAgICBDYW52YXMuQ0xJUF9TQVZFX0ZMQUcsCi0gICAgICAgIH07Ci0gICAgICAgIHZlcmlmeVNhdmVGbGFnc1NlcXVlbmNlKGZsYWdzKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTYXZlRmxhZ3M3KCkgewotICAgICAgICBpbnRbXSBmbGFncyA9IHsKLSAgICAgICAgICAgIENhbnZhcy5NQVRSSVhfU0FWRV9GTEFHLAotICAgICAgICAgICAgQ2FudmFzLk1BVFJJWF9TQVZFX0ZMQUcsCi0gICAgICAgICAgICBDYW52YXMuQUxMX1NBVkVfRkxBRywKLSAgICAgICAgICAgIENhbnZhcy5BTExfU0FWRV9GTEFHLAotICAgICAgICAgICAgQ2FudmFzLkNMSVBfU0FWRV9GTEFHLAotICAgICAgICAgICAgQ2FudmFzLkNMSVBfU0FWRV9GTEFHLAotICAgICAgICB9OwotICAgICAgICB2ZXJpZnlTYXZlRmxhZ3NTZXF1ZW5jZShmbGFncyk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2F2ZUZsYWdzOCgpIHsKLSAgICAgICAgaW50W10gZmxhZ3MgPSB7Ci0gICAgICAgICAgICBDYW52YXMuTUFUUklYX1NBVkVfRkxBRywKLSAgICAgICAgICAgIENhbnZhcy5DTElQX1NBVkVfRkxBRywKLSAgICAgICAgICAgIENhbnZhcy5BTExfU0FWRV9GTEFHLAotICAgICAgICAgICAgQ2FudmFzLk1BVFJJWF9TQVZFX0ZMQUcsCi0gICAgICAgICAgICBDYW52YXMuQ0xJUF9TQVZFX0ZMQUcsCi0gICAgICAgICAgICBDYW52YXMuQUxMX1NBVkVfRkxBRywKLSAgICAgICAgfTsKLSAgICAgICAgdmVyaWZ5U2F2ZUZsYWdzU2VxdWVuY2UoZmxhZ3MpOwotICAgIH0KLQotICAgIC8vIFRoaXMgdGVzdCBleGVyY2lzZXMgdGhlIHNhdmVMYXllciBmbGFnIHRoYXQgcHJlc2VydmVzIHRoZSBjbGlwCi0gICAgLy8gc3RhdGUgYWNyb3NzIHRoZSBtYXRjaGluZyByZXN0b3JlIGNhbGwgYm91bmRhcnkuIFRoaXMgaXMgYSB2YW5pbGxhCi0gICAgLy8gdGVzdCBhbmQgZG9lc24ndCBleGVyY2lzZSBhbnkgaW50ZXJhY3Rpb24gYmV0d2VlbiB0aGUgY2xpcCBzdGFjawotICAgIC8vIGFuZCBTa0NhbnZhcycgZGVmZXJyZWQgc2F2ZS9yZXN0b3JlIHN5c3RlbS4KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTYXZlRmxhZ3M5KCkgewotICAgICAgICBSZWN0IGNsaXAwID0gbmV3IFJlY3QoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShtQ2FudmFzLmdldENsaXBCb3VuZHMoY2xpcDApKTsKLQotICAgICAgICBtQ2FudmFzLnNhdmUoQ2FudmFzLk1BVFJJWF9TQVZFX0ZMQUcpOwotCi0gICAgICAgICAgICAvLyBBbGwgY2xpcCBlbGVtZW50cyBzaG91bGQgYmUgcHJlc2VydmVkIGFmdGVyIHJlc3RvcmUKLSAgICAgICAgICAgIG1DYW52YXMuY2xpcFJlY3QoMCwgMCwgQklUTUFQX1dJRFRIIC8gMiwgQklUTUFQX0hFSUdIVCk7Ci0gICAgICAgICAgICBQYXRoIHBhdGggPSBuZXcgUGF0aCgpOwotICAgICAgICAgICAgcGF0aC5hZGRPdmFsKDAuMjVmICogQklUTUFQX1dJRFRILCAwLjI1ZiAqIEJJVE1BUF9IRUlHSFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgMC43NWYgKiBCSVRNQVBfV0lEVEgsIDAuNzVmICogQklUTUFQX0hFSUdIVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBQYXRoLkRpcmVjdGlvbi5DVyk7Ci0gICAgICAgICAgICBtQ2FudmFzLmNsaXBQYXRoKHBhdGgpOwotICAgICAgICAgICAgbUNhbnZhcy5jbGlwUmVjdCgwLCAwLCBCSVRNQVBfV0lEVEgsIEJJVE1BUF9IRUlHSFQgLyAyKTsKLQotICAgICAgICAgICAgUmVjdCBjbGlwMSA9IG5ldyBSZWN0KCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1DYW52YXMuZ2V0Q2xpcEJvdW5kcyhjbGlwMSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjbGlwMSAhPSBjbGlwMCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGNsaXAwLmNvbnRhaW5zKGNsaXAxKSk7Ci0KLSAgICAgICAgbUNhbnZhcy5yZXN0b3JlKCk7Ci0KLSAgICAgICAgUmVjdCBjbGlwMiA9IG5ldyBSZWN0KCk7Ci0gICAgICAgIGFzc2VydFRydWUobUNhbnZhcy5nZXRDbGlwQm91bmRzKGNsaXAyKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjbGlwMiwgY2xpcDEpOwotICAgIH0KLQotICAgIC8vIFRoaXMgdGVzdCBleGVyY2lzZXMgdGhlIHNhdmVMYXllciBNQVRSSVhfU0FWRV9GTEFHIGZsYWcgYW5kIGl0cwotICAgIC8vIGludGVyYWN0aW9uIHdpdGggdGhlIGNsaXAgc3RhY2sgYW5kIFNrQ2FudmFzIGRlZmVycmVkIHNhdmUvcmVzdG9yZQotICAgIC8vIHN5c3RlbS4KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTYXZlRmxhZ3MxMCgpIHsKLSAgICAgICAgUmVjdEYgcmVjdDEgPSBuZXcgUmVjdEYoMCwgMCwgQklUTUFQX1dJRFRIIC8gMiwgQklUTUFQX0hFSUdIVCk7Ci0gICAgICAgIFJlY3RGIHJlY3QyID0gbmV3IFJlY3RGKDAsIDAsIEJJVE1BUF9XSURUSCwgQklUTUFQX0hFSUdIVCAvIDIpOwotICAgICAgICBQYXRoIHBhdGggPSBuZXcgUGF0aCgpOwotICAgICAgICBwYXRoLmFkZE92YWwoMC4yNWYgKiBCSVRNQVBfV0lEVEgsIDAuMjVmICogQklUTUFQX0hFSUdIVCwKLSAgICAgICAgICAgICAgICAgICAgIDAuNzVmICogQklUTUFQX1dJRFRILCAwLjc1ZiAqIEJJVE1BUF9IRUlHSFQsCi0gICAgICAgICAgICAgICAgICAgICBQYXRoLkRpcmVjdGlvbi5DVyk7Ci0KLSAgICAgICAgUmVjdCBjbGlwMCA9IG5ldyBSZWN0KCk7Ci0gICAgICAgIGFzc2VydFRydWUobUNhbnZhcy5nZXRDbGlwQm91bmRzKGNsaXAwKSk7Ci0KLSAgICAgICAgLy8gRXhlcmNpc2UgdmFyaW91cyBDYW52YXMgbGF6eS1zYXZlIGludGVyYWN0aW9ucy4KLSAgICAgICAgbUNhbnZhcy5zYXZlKCk7Ci0gICAgICAgICAgICBtQ2FudmFzLnNhdmUoKTsKLSAgICAgICAgICAgICAgICBtQ2FudmFzLmNsaXBSZWN0KHJlY3QxKTsKLSAgICAgICAgICAgICAgICBtQ2FudmFzLmNsaXBQYXRoKHBhdGgpOwotCi0gICAgICAgICAgICAgICAgUmVjdCBjbGlwMSA9IG5ldyBSZWN0KCk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtQ2FudmFzLmdldENsaXBCb3VuZHMoY2xpcDEpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGNsaXAxICE9IGNsaXAwKTsKLQotICAgICAgICAgICAgICAgIG1DYW52YXMuc2F2ZShDYW52YXMuTUFUUklYX1NBVkVfRkxBRyk7Ci0gICAgICAgICAgICAgICAgICAgIG1DYW52YXMuc2F2ZShDYW52YXMuTUFUUklYX1NBVkVfRkxBRyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ2FudmFzLmNsaXBSZWN0KHJlY3QyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1DYW52YXMuY2xpcFBhdGgocGF0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFJlY3QgY2xpcDIgPSBuZXcgUmVjdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtQ2FudmFzLmdldENsaXBCb3VuZHMoY2xpcDIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoY2xpcDIgIT0gY2xpcDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjbGlwMiAhPSBjbGlwMCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1DYW52YXMuc2F2ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYW52YXMudHJhbnNsYXRlKDEwLCA1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FudmFzLnNhdmUoQ2FudmFzLk1BVFJJWF9TQVZFX0ZMQUcpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBbiB1bmNvbW1pdHRlZCBzYXZlL3Jlc3RvcmUgZnJhbWU6IGV4ZXJjaXNlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcGFydGlhbCBzYXZlIGVtdWxhdGlvbiwgZW5zdXJpbmcgdGhlcmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJlIG5vIHNpZGUgZWZmZWN0cy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjdCBjbGlwMyA9IG5ldyBSZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUobUNhbnZhcy5nZXRDbGlwQm91bmRzKGNsaXAzKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXAzLm9mZnNldCgxMCwgNSk7IC8vIGFkanVzdCBmb3IgbG9jYWwgb2Zmc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhjbGlwMywgY2xpcDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYW52YXMucmVzdG9yZSgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjdCBjbGlwNCA9IG5ldyBSZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtQ2FudmFzLmdldENsaXBCb3VuZHMoY2xpcDQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwNC5vZmZzZXQoMTAsIDUpOyAvLyBhZGp1c3QgZm9yIGxvY2FsIG9mZnNldAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhjbGlwNCwgY2xpcDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUNhbnZhcy5yZXN0b3JlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFJlY3QgY2xpcDUgPSBuZXcgUmVjdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtQ2FudmFzLmdldENsaXBCb3VuZHMoY2xpcDUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhjbGlwNSwgY2xpcDIpOwotICAgICAgICAgICAgICAgICAgICBtQ2FudmFzLnJlc3RvcmUoKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBjbGlwMiBzdXJ2aXZlcyB0aGUgcHJlY2VkaW5nIHJlc3RvcmUKLSAgICAgICAgICAgICAgICAgICAgUmVjdCBjbGlwNiA9IG5ldyBSZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUobUNhbnZhcy5nZXRDbGlwQm91bmRzKGNsaXA2KSk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhjbGlwNiwgY2xpcDIpOwotICAgICAgICAgICAgICAgIG1DYW52YXMucmVzdG9yZSgpOwotCi0gICAgICAgICAgICAgICAgLy8gY2xpcDIgYWxzbyBzdXJ2aXZlcyB0aGUgcHJlY2VkaW5nIHJlc3RvcmUKLSAgICAgICAgICAgICAgICBSZWN0IGNsaXA3ID0gbmV3IFJlY3QoKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKG1DYW52YXMuZ2V0Q2xpcEJvdW5kcyhjbGlwNykpOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhjbGlwNywgY2xpcDIpOwotICAgICAgICAgICAgbUNhbnZhcy5yZXN0b3JlKCk7Ci0KLSAgICAgICAgICAgIC8vIGNsaXAxIGRvZXMgX25vdF8gc3Vydml2ZSB0aGUgcHJlY2VkaW5nIHJlc3RvcmUKLSAgICAgICAgICAgIFJlY3QgY2xpcDggPSBuZXcgUmVjdCgpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtQ2FudmFzLmdldENsaXBCb3VuZHMoY2xpcDgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhjbGlwOCwgY2xpcDApOwotICAgICAgICBtQ2FudmFzLnJlc3RvcmUoKTsKLQotICAgICAgICBSZWN0IGNsaXA5ID0gbmV3IFJlY3QoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShtQ2FudmFzLmdldENsaXBCb3VuZHMoY2xpcDkpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNsaXA5LCBjbGlwMCk7Ci0gICAgfQotCi0gICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2F2ZUxheWVyMSgpIHsKICAgICAgICAgZmluYWwgUGFpbnQgcCA9IG5ldyBQYWludCgpOwogICAgICAgICBmaW5hbCBSZWN0RiByRiA9IG5ldyBSZWN0RigwLCAxMCwgMzEsIDApOwogCi0gICAgICAgIC8vIHRlc3Qgc2F2ZSBjdXJyZW50IG1hdHJpeCBvbmx5CisgICAgICAgIC8vIHRlc3Qgc2F2ZSBldmVyeXRoaW5nCiAgICAgICAgIE1hdHJpeCBtMSA9IG5ldyBNYXRyaXgoKTsKICAgICAgICAgbTEuc2V0VmFsdWVzKHZhbHVlczEpOwogICAgICAgICBtQ2FudmFzLnNldE1hdHJpeChtMSk7Ci0gICAgICAgIG1DYW52YXMuc2F2ZUxheWVyKHJGLCBwLCBDYW52YXMuTUFUUklYX1NBVkVfRkxBRyk7CisgICAgICAgIG1DYW52YXMuc2F2ZUxheWVyKHJGLCBwKTsKIAogICAgICAgICBNYXRyaXggbTIgPSBuZXcgTWF0cml4KCk7CiAgICAgICAgIG0yLnNldFZhbHVlcyh2YWx1ZXMyKTsKQEAgLTUzMSw2MyArMjU4LDE3IEBACiAgICAgICAgIG00LmdldFZhbHVlcyh2YWx1ZXM0KTsKIAogICAgICAgICBhc3NlcnRBcnJheUVxdWFscyh2YWx1ZXMxLCB2YWx1ZXM0LCAwLjBmKTsKLQotICAgICAgICAvLyB0ZXN0IHNhdmUgY3VycmVudCBjbGlwIGZsYWcgb25seTogdGhpcyBzaG91bGQgc2F2ZSBtYXRyaXggYXMgd2VsbAotICAgICAgICBtMSA9IG5ldyBNYXRyaXgoKTsKLSAgICAgICAgbTEuc2V0VmFsdWVzKHZhbHVlczEpOwotICAgICAgICBtQ2FudmFzLnNldE1hdHJpeChtMSk7Ci0gICAgICAgIG1DYW52YXMuc2F2ZUxheWVyKHJGLCBwLCBDYW52YXMuQ0xJUF9TQVZFX0ZMQUcpOwotCi0gICAgICAgIG0yID0gbmV3IE1hdHJpeCgpOwotICAgICAgICBtMi5zZXRWYWx1ZXModmFsdWVzMik7Ci0gICAgICAgIG1DYW52YXMuc2V0TWF0cml4KG0yKTsKLQotICAgICAgICB2YWx1ZXMzID0gbmV3IGZsb2F0W0ZMT0FUX0FSUkFZX0xFTl07Ci0gICAgICAgIG0zID0gbUNhbnZhcy5nZXRNYXRyaXgoKTsKLSAgICAgICAgbTMuZ2V0VmFsdWVzKHZhbHVlczMpOwotCi0gICAgICAgIGFzc2VydEFycmF5RXF1YWxzKHZhbHVlczIsIHZhbHVlczMsIDAuMGYpOwotCi0gICAgICAgIG1DYW52YXMucmVzdG9yZSgpOwotICAgICAgICB2YWx1ZXM0ID0gbmV3IGZsb2F0W0ZMT0FUX0FSUkFZX0xFTl07Ci0gICAgICAgIG00ID0gbUNhbnZhcy5nZXRNYXRyaXgoKTsKLSAgICAgICAgbTQuZ2V0VmFsdWVzKHZhbHVlczQpOwotCi0gICAgICAgIGFzc2VydEFycmF5RXF1YWxzKHZhbHVlczEsIHZhbHVlczQsIDAuMGYpOwotCi0gICAgICAgIC8vIHRlc3Qgc2F2ZSBldmVyeXRoaW5nCi0gICAgICAgIG0xID0gbmV3IE1hdHJpeCgpOwotICAgICAgICBtMS5zZXRWYWx1ZXModmFsdWVzMSk7Ci0gICAgICAgIG1DYW52YXMuc2V0TWF0cml4KG0xKTsKLSAgICAgICAgbUNhbnZhcy5zYXZlTGF5ZXIockYsIHAsIENhbnZhcy5BTExfU0FWRV9GTEFHKTsKLQotICAgICAgICBtMiA9IG5ldyBNYXRyaXgoKTsKLSAgICAgICAgbTIuc2V0VmFsdWVzKHZhbHVlczIpOwotICAgICAgICBtQ2FudmFzLnNldE1hdHJpeChtMik7Ci0KLSAgICAgICAgdmFsdWVzMyA9IG5ldyBmbG9hdFtGTE9BVF9BUlJBWV9MRU5dOwotICAgICAgICBtMyA9IG1DYW52YXMuZ2V0TWF0cml4KCk7Ci0gICAgICAgIG0zLmdldFZhbHVlcyh2YWx1ZXMzKTsKLQotICAgICAgICBhc3NlcnRBcnJheUVxdWFscyh2YWx1ZXMyLCB2YWx1ZXMzLCAwLjBmKTsKLQotICAgICAgICBtQ2FudmFzLnJlc3RvcmUoKTsKLSAgICAgICAgdmFsdWVzNCA9IG5ldyBmbG9hdFtGTE9BVF9BUlJBWV9MRU5dOwotICAgICAgICBtNCA9IG1DYW52YXMuZ2V0TWF0cml4KCk7Ci0gICAgICAgIG00LmdldFZhbHVlcyh2YWx1ZXM0KTsKLQotICAgICAgICBhc3NlcnRBcnJheUVxdWFscyh2YWx1ZXMxLCB2YWx1ZXM0LCAwLjBmKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTYXZlTGF5ZXIyKCkgewogICAgICAgICBmaW5hbCBQYWludCBwID0gbmV3IFBhaW50KCk7CiAKLSAgICAgICAgLy8gdGVzdCBzYXZlIGN1cnJlbnQgbWF0cml4IG9ubHkKKyAgICAgICAgLy8gdGVzdCBzYXZlIGV2ZXJ5dGhpbmcKICAgICAgICAgTWF0cml4IG0xID0gbmV3IE1hdHJpeCgpOwogICAgICAgICBtMS5zZXRWYWx1ZXModmFsdWVzMSk7CiAgICAgICAgIG1DYW52YXMuc2V0TWF0cml4KG0xKTsKLSAgICAgICAgbUNhbnZhcy5zYXZlTGF5ZXIoMTAsIDAsIDAsIDMxLCBwLCBDYW52YXMuTUFUUklYX1NBVkVfRkxBRyk7CisgICAgICAgIG1DYW52YXMuc2F2ZUxheWVyKDEwLCAwLCAwLCAzMSwgcCk7CiAKICAgICAgICAgTWF0cml4IG0yID0gbmV3IE1hdHJpeCgpOwogICAgICAgICBtMi5zZXRWYWx1ZXModmFsdWVzMik7CkBAIC02MDUsNjMgKzI4NiwxNyBAQAogICAgICAgICBtNC5nZXRWYWx1ZXModmFsdWVzNCk7CiAKICAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHModmFsdWVzMSwgdmFsdWVzNCwgMC4wZik7Ci0KLSAgICAgICAgLy8gdGVzdCBzYXZlIGN1cnJlbnQgY2xpcCBmbGFnIG9ubHk6IHRoaXMgc2hvdWxkIHNhdmUgbWF0cml4IGFzIHdlbGwKLSAgICAgICAgbTEgPSBuZXcgTWF0cml4KCk7Ci0gICAgICAgIG0xLnNldFZhbHVlcyh2YWx1ZXMxKTsKLSAgICAgICAgbUNhbnZhcy5zZXRNYXRyaXgobTEpOwotICAgICAgICBtQ2FudmFzLnNhdmVMYXllcigxMCwgMCwgMCwgMzEsIHAsIENhbnZhcy5DTElQX1NBVkVfRkxBRyk7Ci0KLSAgICAgICAgbTIgPSBuZXcgTWF0cml4KCk7Ci0gICAgICAgIG0yLnNldFZhbHVlcyh2YWx1ZXMyKTsKLSAgICAgICAgbUNhbnZhcy5zZXRNYXRyaXgobTIpOwotCi0gICAgICAgIHZhbHVlczMgPSBuZXcgZmxvYXRbRkxPQVRfQVJSQVlfTEVOXTsKLSAgICAgICAgbTMgPSBtQ2FudmFzLmdldE1hdHJpeCgpOwotICAgICAgICBtMy5nZXRWYWx1ZXModmFsdWVzMyk7Ci0KLSAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHModmFsdWVzMiwgdmFsdWVzMywgMC4wZik7Ci0KLSAgICAgICAgbUNhbnZhcy5yZXN0b3JlKCk7Ci0gICAgICAgIHZhbHVlczQgPSBuZXcgZmxvYXRbRkxPQVRfQVJSQVlfTEVOXTsKLSAgICAgICAgbTQgPSBtQ2FudmFzLmdldE1hdHJpeCgpOwotICAgICAgICBtNC5nZXRWYWx1ZXModmFsdWVzNCk7Ci0KLSAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHModmFsdWVzMSwgdmFsdWVzNCwgMC4wZik7Ci0KLSAgICAgICAgLy8gdGVzdCBzYXZlIGV2ZXJ5dGhpbmcKLSAgICAgICAgbTEgPSBuZXcgTWF0cml4KCk7Ci0gICAgICAgIG0xLnNldFZhbHVlcyh2YWx1ZXMxKTsKLSAgICAgICAgbUNhbnZhcy5zZXRNYXRyaXgobTEpOwotICAgICAgICBtQ2FudmFzLnNhdmVMYXllcigxMCwgMCwgMCwgMzEsIHAsIENhbnZhcy5BTExfU0FWRV9GTEFHKTsKLQotICAgICAgICBtMiA9IG5ldyBNYXRyaXgoKTsKLSAgICAgICAgbTIuc2V0VmFsdWVzKHZhbHVlczIpOwotICAgICAgICBtQ2FudmFzLnNldE1hdHJpeChtMik7Ci0KLSAgICAgICAgdmFsdWVzMyA9IG5ldyBmbG9hdFtGTE9BVF9BUlJBWV9MRU5dOwotICAgICAgICBtMyA9IG1DYW52YXMuZ2V0TWF0cml4KCk7Ci0gICAgICAgIG0zLmdldFZhbHVlcyh2YWx1ZXMzKTsKLQotICAgICAgICBhc3NlcnRBcnJheUVxdWFscyh2YWx1ZXMyLCB2YWx1ZXMzLCAwLjBmKTsKLQotICAgICAgICBtQ2FudmFzLnJlc3RvcmUoKTsKLSAgICAgICAgdmFsdWVzNCA9IG5ldyBmbG9hdFtGTE9BVF9BUlJBWV9MRU5dOwotICAgICAgICBtNCA9IG1DYW52YXMuZ2V0TWF0cml4KCk7Ci0gICAgICAgIG00LmdldFZhbHVlcyh2YWx1ZXM0KTsKLQotICAgICAgICBhc3NlcnRBcnJheUVxdWFscyh2YWx1ZXMxLCB2YWx1ZXM0LCAwLjBmKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTYXZlTGF5ZXJBbHBoYTEoKSB7CiAgICAgICAgIGZpbmFsIFJlY3RGIHJGID0gbmV3IFJlY3RGKDAsIDEwLCAzMSwgMCk7CiAKLSAgICAgICAgLy8gdGVzdCBzYXZlIGN1cnJlbnQgbWF0cml4IG9ubHkKKyAgICAgICAgLy8gdGVzdCBzYXZlIGV2ZXJ5dGhpbmcKICAgICAgICAgTWF0cml4IG0xID0gbmV3IE1hdHJpeCgpOwogICAgICAgICBtMS5zZXRWYWx1ZXModmFsdWVzMSk7CiAgICAgICAgIG1DYW52YXMuc2V0TWF0cml4KG0xKTsKLSAgICAgICAgbUNhbnZhcy5zYXZlTGF5ZXJBbHBoYShyRiwgMHhmZiwgQ2FudmFzLk1BVFJJWF9TQVZFX0ZMQUcpOworICAgICAgICBtQ2FudmFzLnNhdmVMYXllckFscGhhKHJGLCAweGZmKTsKIAogICAgICAgICBNYXRyaXggbTIgPSBuZXcgTWF0cml4KCk7CiAgICAgICAgIG0yLnNldFZhbHVlcyh2YWx1ZXMyKTsKQEAgLTY3OSw2MSArMzE0LDE1IEBACiAgICAgICAgIG00LmdldFZhbHVlcyh2YWx1ZXM0KTsKIAogICAgICAgICBhc3NlcnRBcnJheUVxdWFscyh2YWx1ZXMxLCB2YWx1ZXM0LCAwLjBmKTsKLQotICAgICAgICAvLyB0ZXN0IHNhdmUgY3VycmVudCBjbGlwIGZsYWcgb25seTogdGhpcyBzaG91bGQgc2F2ZSBtYXRyaXggYXMgd2VsbAotICAgICAgICBtMSA9IG5ldyBNYXRyaXgoKTsKLSAgICAgICAgbTEuc2V0VmFsdWVzKHZhbHVlczEpOwotICAgICAgICBtQ2FudmFzLnNldE1hdHJpeChtMSk7Ci0gICAgICAgIG1DYW52YXMuc2F2ZUxheWVyQWxwaGEockYsIDB4ZmYsIENhbnZhcy5DTElQX1NBVkVfRkxBRyk7Ci0KLSAgICAgICAgbTIgPSBuZXcgTWF0cml4KCk7Ci0gICAgICAgIG0yLnNldFZhbHVlcyh2YWx1ZXMyKTsKLSAgICAgICAgbUNhbnZhcy5zZXRNYXRyaXgobTIpOwotCi0gICAgICAgIHZhbHVlczMgPSBuZXcgZmxvYXRbRkxPQVRfQVJSQVlfTEVOXTsKLSAgICAgICAgbTMgPSBtQ2FudmFzLmdldE1hdHJpeCgpOwotICAgICAgICBtMy5nZXRWYWx1ZXModmFsdWVzMyk7Ci0KLSAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHModmFsdWVzMiwgdmFsdWVzMywgMC4wZik7Ci0KLSAgICAgICAgbUNhbnZhcy5yZXN0b3JlKCk7Ci0gICAgICAgIHZhbHVlczQgPSBuZXcgZmxvYXRbRkxPQVRfQVJSQVlfTEVOXTsKLSAgICAgICAgbTQgPSBtQ2FudmFzLmdldE1hdHJpeCgpOwotICAgICAgICBtNC5nZXRWYWx1ZXModmFsdWVzNCk7Ci0KLSAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHModmFsdWVzMSwgdmFsdWVzNCwgMC4wZik7Ci0KLSAgICAgICAgLy8gdGVzdCBzYXZlIGV2ZXJ5dGhpbmcKLSAgICAgICAgbTEgPSBuZXcgTWF0cml4KCk7Ci0gICAgICAgIG0xLnNldFZhbHVlcyh2YWx1ZXMxKTsKLSAgICAgICAgbUNhbnZhcy5zZXRNYXRyaXgobTEpOwotICAgICAgICBtQ2FudmFzLnNhdmVMYXllckFscGhhKHJGLCAweGZmLCBDYW52YXMuQUxMX1NBVkVfRkxBRyk7Ci0KLSAgICAgICAgbTIgPSBuZXcgTWF0cml4KCk7Ci0gICAgICAgIG0yLnNldFZhbHVlcyh2YWx1ZXMyKTsKLSAgICAgICAgbUNhbnZhcy5zZXRNYXRyaXgobTIpOwotCi0gICAgICAgIHZhbHVlczMgPSBuZXcgZmxvYXRbRkxPQVRfQVJSQVlfTEVOXTsKLSAgICAgICAgbTMgPSBtQ2FudmFzLmdldE1hdHJpeCgpOwotICAgICAgICBtMy5nZXRWYWx1ZXModmFsdWVzMyk7Ci0KLSAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHModmFsdWVzMiwgdmFsdWVzMywgMC4wZik7Ci0KLSAgICAgICAgbUNhbnZhcy5yZXN0b3JlKCk7Ci0gICAgICAgIHZhbHVlczQgPSBuZXcgZmxvYXRbRkxPQVRfQVJSQVlfTEVOXTsKLSAgICAgICAgbTQgPSBtQ2FudmFzLmdldE1hdHJpeCgpOwotICAgICAgICBtNC5nZXRWYWx1ZXModmFsdWVzNCk7Ci0KLSAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHModmFsdWVzMSwgdmFsdWVzNCwgMC4wZik7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2F2ZUxheWVyQWxwaGEyKCkgewotICAgICAgICAvLyB0ZXN0IHNhdmUgY3VycmVudCBtYXRyaXggb25seQorICAgICAgICAvLyB0ZXN0IHNhdmUgZXZlcnl0aGluZwogICAgICAgICBNYXRyaXggbTEgPSBuZXcgTWF0cml4KCk7CiAgICAgICAgIG0xLnNldFZhbHVlcyh2YWx1ZXMxKTsKICAgICAgICAgbUNhbnZhcy5zZXRNYXRyaXgobTEpOwotICAgICAgICBtQ2FudmFzLnNhdmVMYXllckFscGhhKDAsIDEwLCAzMSwgMCwgMHhmZiwgQ2FudmFzLk1BVFJJWF9TQVZFX0ZMQUcpOworICAgICAgICBtQ2FudmFzLnNhdmVMYXllckFscGhhKDAsIDEwLCAzMSwgMCwgMHhmZik7CiAKICAgICAgICAgTWF0cml4IG0yID0gbmV3IE1hdHJpeCgpOwogICAgICAgICBtMi5zZXRWYWx1ZXModmFsdWVzMik7CkBAIC03NTEsNTIgKzM0MCw2IEBACiAgICAgICAgIG00LmdldFZhbHVlcyh2YWx1ZXM0KTsKIAogICAgICAgICBhc3NlcnRBcnJheUVxdWFscyh2YWx1ZXMxLCB2YWx1ZXM0LCAwLjBmKTsKLQotICAgICAgICAvLyB0ZXN0IHNhdmUgY3VycmVudCBjbGlwIGZsYWcgb25seTogdGhpcyBzaG91bGQgc2F2ZSBtYXRyaXggYXMgd2VsbAotICAgICAgICBtMSA9IG5ldyBNYXRyaXgoKTsKLSAgICAgICAgbTEuc2V0VmFsdWVzKHZhbHVlczEpOwotICAgICAgICBtQ2FudmFzLnNldE1hdHJpeChtMSk7Ci0gICAgICAgIG1DYW52YXMuc2F2ZUxheWVyQWxwaGEoMCwgMTAsIDMxLCAwLCAweGZmLCBDYW52YXMuQ0xJUF9TQVZFX0ZMQUcpOwotCi0gICAgICAgIG0yID0gbmV3IE1hdHJpeCgpOwotICAgICAgICBtMi5zZXRWYWx1ZXModmFsdWVzMik7Ci0gICAgICAgIG1DYW52YXMuc2V0TWF0cml4KG0yKTsKLQotICAgICAgICB2YWx1ZXMzID0gbmV3IGZsb2F0W0ZMT0FUX0FSUkFZX0xFTl07Ci0gICAgICAgIG0zID0gbUNhbnZhcy5nZXRNYXRyaXgoKTsKLSAgICAgICAgbTMuZ2V0VmFsdWVzKHZhbHVlczMpOwotCi0gICAgICAgIGFzc2VydEFycmF5RXF1YWxzKHZhbHVlczIsIHZhbHVlczMsIDAuMGYpOwotCi0gICAgICAgIG1DYW52YXMucmVzdG9yZSgpOwotICAgICAgICB2YWx1ZXM0ID0gbmV3IGZsb2F0W0ZMT0FUX0FSUkFZX0xFTl07Ci0gICAgICAgIG00ID0gbUNhbnZhcy5nZXRNYXRyaXgoKTsKLSAgICAgICAgbTQuZ2V0VmFsdWVzKHZhbHVlczQpOwotCi0gICAgICAgIGFzc2VydEFycmF5RXF1YWxzKHZhbHVlczEsIHZhbHVlczQsIDAuMGYpOwotCi0gICAgICAgIC8vIHRlc3Qgc2F2ZSBldmVyeXRoaW5nCi0gICAgICAgIG0xID0gbmV3IE1hdHJpeCgpOwotICAgICAgICBtMS5zZXRWYWx1ZXModmFsdWVzMSk7Ci0gICAgICAgIG1DYW52YXMuc2V0TWF0cml4KG0xKTsKLSAgICAgICAgbUNhbnZhcy5zYXZlTGF5ZXJBbHBoYSgwLCAxMCwgMzEsIDAsIDB4ZmYsIENhbnZhcy5BTExfU0FWRV9GTEFHKTsKLQotICAgICAgICBtMiA9IG5ldyBNYXRyaXgoKTsKLSAgICAgICAgbTIuc2V0VmFsdWVzKHZhbHVlczIpOwotICAgICAgICBtQ2FudmFzLnNldE1hdHJpeChtMik7Ci0KLSAgICAgICAgdmFsdWVzMyA9IG5ldyBmbG9hdFtGTE9BVF9BUlJBWV9MRU5dOwotICAgICAgICBtMyA9IG1DYW52YXMuZ2V0TWF0cml4KCk7Ci0gICAgICAgIG0zLmdldFZhbHVlcyh2YWx1ZXMzKTsKLQotICAgICAgICBhc3NlcnRBcnJheUVxdWFscyh2YWx1ZXMyLCB2YWx1ZXMzLCAwLjBmKTsKLQotICAgICAgICBtQ2FudmFzLnJlc3RvcmUoKTsKLSAgICAgICAgdmFsdWVzNCA9IG5ldyBmbG9hdFtGTE9BVF9BUlJBWV9MRU5dOwotICAgICAgICBtNCA9IG1DYW52YXMuZ2V0TWF0cml4KCk7Ci0gICAgICAgIG00LmdldFZhbHVlcyh2YWx1ZXM0KTsKLQotICAgICAgICBhc3NlcnRBcnJheUVxdWFscyh2YWx1ZXMxLCB2YWx1ZXM0LCAwLjBmKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtODA3LDkgKzM1MCw5IEBACiAgICAgICAgIGFzc2VydEVxdWFscygyLCBtQ2FudmFzLmdldFNhdmVDb3VudCgpKTsKICAgICAgICAgbUNhbnZhcy5zYXZlKCk7CiAgICAgICAgIGFzc2VydEVxdWFscygzLCBtQ2FudmFzLmdldFNhdmVDb3VudCgpKTsKLSAgICAgICAgbUNhbnZhcy5zYXZlTGF5ZXIobmV3IFJlY3RGKCksIG5ldyBQYWludCgpLCBDYW52YXMuQUxMX1NBVkVfRkxBRyk7CisgICAgICAgIG1DYW52YXMuc2F2ZUxheWVyKG5ldyBSZWN0RigpLCBuZXcgUGFpbnQoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyg0LCBtQ2FudmFzLmdldFNhdmVDb3VudCgpKTsKLSAgICAgICAgbUNhbnZhcy5zYXZlTGF5ZXJBbHBoYShuZXcgUmVjdEYoKSwgMCwgQ2FudmFzLkFMTF9TQVZFX0ZMQUcpOworICAgICAgICBtQ2FudmFzLnNhdmVMYXllckFscGhhKG5ldyBSZWN0RigpLCAwKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDUsIG1DYW52YXMuZ2V0U2F2ZUNvdW50KCkpOwogICAgIH0KIApAQCAtOTk4LDEyICs1NDEsMTMgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdENsaXBSZWN0RigpIHsKKyAgICAgICAgbUNhbnZhcy5zYXZlKCk7CiAgICAgICAgIC8vIGludGVyc2VjdCB3aXRoIGNsaXAgbGFyZ2VyIHRoYW4gY2FudmFzCiAgICAgICAgIGFzc2VydFRydWUobUNhbnZhcy5jbGlwUmVjdChuZXcgUmVjdEYoMCwgMCwgMTAsIDMxKSwgT3AuSU5URVJTRUNUKSk7CiAgICAgICAgIC8vIGludGVyc2VjdCB3aXRoIGNsaXAgb3V0c2lkZSBvZiBjYW52YXMgYm91bmRzCiAgICAgICAgIGFzc2VydEZhbHNlKG1DYW52YXMuY2xpcFJlY3QobmV3IFJlY3RGKDEwLCAzMSwgMTEsIDMyKSwgT3AuSU5URVJTRUNUKSk7Ci0gICAgICAgIC8vIHJlcGxhY2Ugd2l0aCBjbGlwIHRoYXQgaXMgbGFyZ2VyIHRoYW4gY2FudmFzCi0gICAgICAgIGFzc2VydFRydWUobUNhbnZhcy5jbGlwUmVjdChuZXcgUmVjdEYoMCwgMCwgMTAsIDMxKSwgT3AuUkVQTEFDRSkpOworICAgICAgICAvLyByZXBsYWNlIHdpdGggdGhlIG9yaWdpbmFsIGNsaXAKKyAgICAgICAgbUNhbnZhcy5yZXN0b3JlKCk7CiAgICAgICAgIC8vIGludGVyc2VjdCB3aXRoIGNsaXAgdGhhdCBjb3ZlcnMgdG9wIHBvcnRpb24gb2YgY2FudmFzCiAgICAgICAgIGFzc2VydFRydWUobUNhbnZhcy5jbGlwUmVjdChuZXcgUmVjdEYoMCwgMCwgMjAsIDEwKSwgT3AuSU5URVJTRUNUKSk7CiAgICAgICAgIC8vIGludGVyc2VjdCB3aXRoIGNsaXAgdGhhdCBjb3ZlcnMgYm90dG9tIHBvcnRpb24gb2YgY2FudmFzCkBAIC0xMDE0LDEyICs1NTgsMTMgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdENsaXBSZWN0KCkgeworICAgICAgICBtQ2FudmFzLnNhdmUoKTsKICAgICAgICAgLy8gaW50ZXJzZWN0IHdpdGggY2xpcCBsYXJnZXIgdGhhbiBjYW52YXMKICAgICAgICAgYXNzZXJ0VHJ1ZShtQ2FudmFzLmNsaXBSZWN0KG5ldyBSZWN0KDAsIDAsIDEwLCAzMSksIE9wLklOVEVSU0VDVCkpOwogICAgICAgICAvLyBpbnRlcnNlY3Qgd2l0aCBjbGlwIG91dHNpZGUgb2YgY2FudmFzIGJvdW5kcwogICAgICAgICBhc3NlcnRGYWxzZShtQ2FudmFzLmNsaXBSZWN0KG5ldyBSZWN0KDEwLCAzMSwgMTEsIDMyKSwgT3AuSU5URVJTRUNUKSk7Ci0gICAgICAgIC8vIHJlcGxhY2Ugd2l0aCBjbGlwIHRoYXQgaXMgbGFyZ2VyIHRoYW4gY2FudmFzCi0gICAgICAgIGFzc2VydFRydWUobUNhbnZhcy5jbGlwUmVjdChuZXcgUmVjdCgwLCAwLCAxMCwgMzEpLCBPcC5SRVBMQUNFKSk7CisgICAgICAgIC8vIHJlcGxhY2Ugd2l0aCB0aGUgb3JpZ2luYWwgY2xpcAorICAgICAgICBtQ2FudmFzLnJlc3RvcmUoKTsKICAgICAgICAgLy8gaW50ZXJzZWN0IHdpdGggY2xpcCB0aGF0IGNvdmVycyB0b3AgcG9ydGlvbiBvZiBjYW52YXMKICAgICAgICAgYXNzZXJ0VHJ1ZShtQ2FudmFzLmNsaXBSZWN0KG5ldyBSZWN0KDAsIDAsIDIwLCAxMCksIE9wLklOVEVSU0VDVCkpOwogICAgICAgICAvLyBpbnRlcnNlY3Qgd2l0aCBjbGlwIHRoYXQgY292ZXJzIGJvdHRvbSBwb3J0aW9uIG9mIGNhbnZhcwpAQCAtMTAzMCwxMiArNTc1LDEzIEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RDbGlwUmVjdDRJKCkgeworICAgICAgICBtQ2FudmFzLnNhdmUoKTsKICAgICAgICAgLy8gaW50ZXJzZWN0IHdpdGggY2xpcCBsYXJnZXIgdGhhbiBjYW52YXMKICAgICAgICAgYXNzZXJ0VHJ1ZShtQ2FudmFzLmNsaXBSZWN0KDAsIDAsIDEwLCAzMSwgT3AuSU5URVJTRUNUKSk7CiAgICAgICAgIC8vIGludGVyc2VjdCB3aXRoIGNsaXAgb3V0c2lkZSBvZiBjYW52YXMgYm91bmRzCiAgICAgICAgIGFzc2VydEZhbHNlKG1DYW52YXMuY2xpcFJlY3QoMTAsIDMxLCAxMSwgMzIsIE9wLklOVEVSU0VDVCkpOwotICAgICAgICAvLyByZXBsYWNlIHdpdGggY2xpcCB0aGF0IGlzIGxhcmdlciB0aGFuIGNhbnZhcwotICAgICAgICBhc3NlcnRUcnVlKG1DYW52YXMuY2xpcFJlY3QoMCwgMCwgMTAsIDMxLCBPcC5SRVBMQUNFKSk7CisgICAgICAgIC8vIHJlcGxhY2Ugd2l0aCB0aGUgb3JpZ2luYWwgY2xpcAorICAgICAgICBtQ2FudmFzLnJlc3RvcmUoKTsKICAgICAgICAgLy8gaW50ZXJzZWN0IHdpdGggY2xpcCB0aGF0IGNvdmVycyB0b3AgcG9ydGlvbiBvZiBjYW52YXMKICAgICAgICAgYXNzZXJ0VHJ1ZShtQ2FudmFzLmNsaXBSZWN0KDAsIDAsIDIwLCAxMCwgT3AuSU5URVJTRUNUKSk7CiAgICAgICAgIC8vIGludGVyc2VjdCB3aXRoIGNsaXAgdGhhdCBjb3ZlcnMgYm90dG9tIHBvcnRpb24gb2YgY2FudmFzCkBAIC0xMDQ2LDEyICs1OTIsMTMgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdENsaXBSZWN0NEYoKSB7CisgICAgICAgIG1DYW52YXMuc2F2ZSgpOwogICAgICAgICAvLyBpbnRlcnNlY3Qgd2l0aCBjbGlwIGxhcmdlciB0aGFuIGNhbnZhcwogICAgICAgICBhc3NlcnRUcnVlKG1DYW52YXMuY2xpcFJlY3QoMGYsIDBmLCAxMGYsIDMxZiwgT3AuSU5URVJTRUNUKSk7CiAgICAgICAgIC8vIGludGVyc2VjdCB3aXRoIGNsaXAgb3V0c2lkZSBvZiBjYW52YXMgYm91bmRzCiAgICAgICAgIGFzc2VydEZhbHNlKG1DYW52YXMuY2xpcFJlY3QoMTBmLCAzMWYsIDExZiwgMzJmLCBPcC5JTlRFUlNFQ1QpKTsKLSAgICAgICAgLy8gcmVwbGFjZSB3aXRoIGNsaXAgdGhhdCBpcyBsYXJnZXIgdGhhbiBjYW52YXMKLSAgICAgICAgYXNzZXJ0VHJ1ZShtQ2FudmFzLmNsaXBSZWN0KDBmLCAwZiwgMTBmLCAzMWYsIE9wLlJFUExBQ0UpKTsKKyAgICAgICAgLy8gcmVwbGFjZSB3aXRoIHRoZSBvcmlnaW5hbCBjbGlwCisgICAgICAgIG1DYW52YXMucmVzdG9yZSgpOwogICAgICAgICAvLyBpbnRlcnNlY3Qgd2l0aCBjbGlwIHRoYXQgY292ZXJzIHRvcCBwb3J0aW9uIG9mIGNhbnZhcwogICAgICAgICBhc3NlcnRUcnVlKG1DYW52YXMuY2xpcFJlY3QoMGYsIDBmLCAyMGYsIDEwZiwgT3AuSU5URVJTRUNUKSk7CiAgICAgICAgIC8vIGludGVyc2VjdCB3aXRoIGNsaXAgdGhhdCBjb3ZlcnMgYm90dG9tIHBvcnRpb24gb2YgY2FudmFzCkBAIC0xMDY1LDcgKzYxMiw3IEBACiAgICAgICAgIC8vIHJlbW92ZSBjZW50ZXIsIGNsaXAgbm90IGVtcHR5CiAgICAgICAgIGFzc2VydFRydWUobUNhbnZhcy5jbGlwT3V0UmVjdChuZXcgUmVjdEYoMSwgMSwgOSwgMjcpKSk7CiAgICAgICAgIC8vIHJlcGxhY2UgY2xpcCwgdmVyaWZ5IGRpZmZlcmVuY2UgZG9lc24ndCB3aWRlbgotICAgICAgICBhc3NlcnRGYWxzZShtQ2FudmFzLmNsaXBSZWN0KG5ldyBSZWN0RigwLCAwLCAwLCAwKSwgT3AuUkVQTEFDRSkpOworICAgICAgICBhc3NlcnRGYWxzZShtQ2FudmFzLmNsaXBSZWN0KG5ldyBSZWN0RigwLCAwLCAwLCAwKSkpOwogICAgICAgICBhc3NlcnRGYWxzZShtQ2FudmFzLmNsaXBPdXRSZWN0KG5ldyBSZWN0RigwLCAwLCAxMDAsIDEwMCkpKTsKICAgICB9CiAKQEAgLTEwNzQsNyArNjIxLDcgQEAKICAgICAgICAgLy8gcmVtb3ZlIGNlbnRlciwgY2xpcCBub3QgZW1wdHkKICAgICAgICAgYXNzZXJ0VHJ1ZShtQ2FudmFzLmNsaXBPdXRSZWN0KG5ldyBSZWN0KDEsIDEsIDksIDI3KSkpOwogICAgICAgICAvLyByZXBsYWNlIGNsaXAsIHZlcmlmeSBkaWZmZXJlbmNlIGRvZXNuJ3Qgd2lkZW4KLSAgICAgICAgYXNzZXJ0RmFsc2UobUNhbnZhcy5jbGlwUmVjdChuZXcgUmVjdCgwLCAwLCAwLCAwKSwgT3AuUkVQTEFDRSkpOworICAgICAgICBhc3NlcnRGYWxzZShtQ2FudmFzLmNsaXBSZWN0KG5ldyBSZWN0KDAsIDAsIDAsIDApKSk7CiAgICAgICAgIGFzc2VydEZhbHNlKG1DYW52YXMuY2xpcE91dFJlY3QobmV3IFJlY3QoMCwgMCwgMTAwLCAxMDApKSk7CiAgICAgfQogCkBAIC0xMDgzLDcgKzYzMCw3IEBACiAgICAgICAgIC8vIHJlbW92ZSBjZW50ZXIsIGNsaXAgbm90IGVtcHR5CiAgICAgICAgIGFzc2VydFRydWUobUNhbnZhcy5jbGlwT3V0UmVjdCgxLCAxLCA5LCAyNykpOwogICAgICAgICAvLyByZXBsYWNlIGNsaXAsIHZlcmlmeSBkaWZmZXJlbmNlIGRvZXNuJ3Qgd2lkZW4KLSAgICAgICAgYXNzZXJ0RmFsc2UobUNhbnZhcy5jbGlwUmVjdCgwLCAwLCAwLCAwLCBPcC5SRVBMQUNFKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1DYW52YXMuY2xpcFJlY3QoMCwgMCwgMCwgMCkpOwogICAgICAgICBhc3NlcnRGYWxzZShtQ2FudmFzLmNsaXBPdXRSZWN0KDAsIDAsIDEwMCwgMTAwKSk7CiAgICAgfQogCkBAIC0xMDkyLDcgKzYzOSw3IEBACiAgICAgICAgIC8vIHJlbW92ZSBjZW50ZXIsIGNsaXAgbm90IGVtcHR5CiAgICAgICAgIGFzc2VydFRydWUobUNhbnZhcy5jbGlwT3V0UmVjdCgxZiwgMWYsIDlmLCAyN2YpKTsKICAgICAgICAgLy8gcmVwbGFjZSBjbGlwLCB2ZXJpZnkgZGlmZmVyZW5jZSBkb2Vzbid0IHdpZGVuCi0gICAgICAgIGFzc2VydEZhbHNlKG1DYW52YXMuY2xpcFJlY3QoMGYsIDBmLCAwZiwgMGYsIE9wLlJFUExBQ0UpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobUNhbnZhcy5jbGlwUmVjdCgwZiwgMGYsIDBmLCAwZikpOwogICAgICAgICBhc3NlcnRGYWxzZShtQ2FudmFzLmNsaXBPdXRSZWN0KDBmLCAwZiwgMTAwZiwgMTAwZikpOwogICAgIH0KIApAQCAtMTEzOCwxMiArNjg1LDEzIEBACiAgICAgICAgIGZpbmFsIFBhdGggcE91dCA9IG5ldyBQYXRoKCk7CiAgICAgICAgIHBPdXQuYWRkUm91bmRSZWN0KG5ldyBSZWN0RigxMCwgMzEsIDExLCAzMiksIDAuNWYsIDAuNWYsIERpcmVjdGlvbi5DVyk7CiAKKyAgICAgICAgbUNhbnZhcy5zYXZlKCk7CiAgICAgICAgIC8vIGludGVyc2VjdCB3aXRoIGNsaXAgbGFyZ2VyIHRoYW4gY2FudmFzCiAgICAgICAgIGFzc2VydFRydWUobUNhbnZhcy5jbGlwUGF0aChwLCBPcC5JTlRFUlNFQ1QpKTsKICAgICAgICAgLy8gaW50ZXJzZWN0IHdpdGggY2xpcCBvdXRzaWRlIG9mIGNhbnZhcyBib3VuZHMKICAgICAgICAgYXNzZXJ0RmFsc2UobUNhbnZhcy5jbGlwUGF0aChwT3V0LCBPcC5JTlRFUlNFQ1QpKTsKLSAgICAgICAgLy8gcmVwbGFjZSB3aXRoIGNsaXAgdGhhdCBpcyBsYXJnZXIgdGhhbiBjYW52YXMKLSAgICAgICAgYXNzZXJ0VHJ1ZShtQ2FudmFzLmNsaXBQYXRoKHAsIE9wLlJFUExBQ0UpKTsKKyAgICAgICAgLy8gcmVwbGFjZSB3aXRoIHRoZSBvcmlnaW5hbCBjbGlwCisgICAgICAgIG1DYW52YXMucmVzdG9yZSgpOwogICAgICAgICAvLyBpbnRlcnNlY3Qgd2l0aCBjbGlwIHRoYXQgY292ZXJzIHRvcCBwb3J0aW9uIG9mIGNhbnZhcwogICAgICAgICBhc3NlcnRUcnVlKG1DYW52YXMuY2xpcFBhdGgocEluLCBPcC5JTlRFUlNFQ1QpKTsKICAgICAgICAgLy8gaW50ZXJzZWN0IHdpdGggY2xpcCBvdXRzaWRlIG9mIGNhbnZhcyBib3VuZHMKQEAgLTE0MjgsNiArOTc2LDEyIEBACiAgICAgICAgIC8vIG5vcm1hbCBjYXNlCiAgICAgICAgIG1DYW52YXMuZHJhd0FyYyhuZXcgUmVjdEYoMCwgMCwgMTAsIDEyKSwgMTAsIDExLCBmYWxzZSwgbVBhaW50KTsKICAgICAgICAgbUNhbnZhcy5kcmF3QXJjKG5ldyBSZWN0RigwLCAwLCAxMCwgMTIpLCAxMCwgMTEsIHRydWUsIG1QYWludCk7CisKKyAgICAgICAgLy8gc3BlY2lhbCBjYXNlOiBzd2VlcEFuZ2xlID49IGFicygzNjApCisgICAgICAgIG1DYW52YXMuZHJhd0FyYyhuZXcgUmVjdEYoMCwgMCwgMTAsIDEyKSwgMTAsIDQwMCwgdHJ1ZSwgbVBhaW50KTsKKyAgICAgICAgbUNhbnZhcy5kcmF3QXJjKG5ldyBSZWN0RigwLCAwLCAxMCwgMTIpLCAxMCwgLTQwMCwgdHJ1ZSwgbVBhaW50KTsKKyAgICAgICAgbUNhbnZhcy5kcmF3QXJjKG5ldyBSZWN0RigwLCAwLCAxMCwgMTIpLCAxMCwgRmxvYXQuUE9TSVRJVkVfSU5GSU5JVFksIHRydWUsIG1QYWludCk7CisgICAgICAgIG1DYW52YXMuZHJhd0FyYyhuZXcgUmVjdEYoMCwgMCwgMTAsIDEyKSwgMTAsIEZsb2F0Lk5FR0FUSVZFX0lORklOSVRZLCB0cnVlLCBtUGFpbnQpOwogICAgIH0KIAogICAgIEBUZXN0KGV4cGVjdGVkPU51bGxQb2ludGVyRXhjZXB0aW9uLmNsYXNzKQpAQCAtMjEyMywxMyArMTY3NywzNSBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoRGlzcGxheU1ldHJpY3MuREVOU0lUWV9ISUdILCBtQ2FudmFzLmdldERlbnNpdHkoKSk7CiAgICAgfQogCi0gICAgQFRlc3QoZXhwZWN0ZWQgPSBJbGxlZ2FsU3RhdGVFeGNlcHRpb24uY2xhc3MpCi0gICAgcHVibGljIHZvaWQgdGVzdERyYXdId0JpdG1hcEluU3dDYW52YXMoKSB7CisgICAgQFRlc3QoZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdERyYXdId0JpdG1hcF9pblN3Q2FudmFzKCkgewogICAgICAgICBCaXRtYXAgaHdCaXRtYXAgPSBtSW1tdXRhYmxlQml0bWFwLmNvcHkoQ29uZmlnLkhBUkRXQVJFLCBmYWxzZSk7Ci0gICAgICAgIG1DYW52YXMuZHJhd0JpdG1hcChod0JpdG1hcCwgMCwgMCwgbnVsbCk7CisgICAgICAgIG1DYW52YXMuZHJhd0JpdG1hcChod0JpdG1hcCwgMCwgMCwgbnVsbCk7IC8vIHdlIHZlcmlmeSB0aGlzIHNwZWNpZmljIGNhbGwgc2hvdWxkIElBRQogICAgIH0KIAotICAgIEBUZXN0KGV4cGVjdGVkID0gSWxsZWdhbFN0YXRlRXhjZXB0aW9uLmNsYXNzKQorICAgIEBUZXN0KGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3REcmF3SHdCaXRtYXBfaW5QaWN0dXJlQ2FudmFzX2luU3dDYW52YXMoKSB7CisgICAgICAgIEJpdG1hcCBod0JpdG1hcCA9IG1JbW11dGFibGVCaXRtYXAuY29weShDb25maWcuSEFSRFdBUkUsIGZhbHNlKTsKKyAgICAgICAgUGljdHVyZSBwaWN0dXJlID0gbmV3IFBpY3R1cmUoKTsKKyAgICAgICAgQ2FudmFzIHBpY3R1cmVDYW52YXMgPSBwaWN0dXJlLmJlZ2luUmVjb3JkaW5nKDEwMCwgMTAwKTsKKyAgICAgICAgcGljdHVyZUNhbnZhcy5kcmF3Qml0bWFwKGh3Qml0bWFwLCAwLCAwLCBudWxsKTsKKyAgICAgICAgbUNhbnZhcy5kcmF3UGljdHVyZShwaWN0dXJlKTsgLy8gd2UgdmVyaWZ5IHRoaXMgc3BlY2lmaWMgY2FsbCBzaG91bGQgSUFFCisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdERyYXdId0JpdG1hcF9pblBpY3R1cmVDYW52YXNfaW5QaWN0dXJlQ2FudmFzX2luU3dDYW52YXMoKSB7CisgICAgICAgIEJpdG1hcCBod0JpdG1hcCA9IG1JbW11dGFibGVCaXRtYXAuY29weShDb25maWcuSEFSRFdBUkUsIGZhbHNlKTsKKyAgICAgICAgUGljdHVyZSBpbm5lclBpY3R1cmUgPSBuZXcgUGljdHVyZSgpOworICAgICAgICBDYW52YXMgcGljdHVyZUNhbnZhcyA9IGlubmVyUGljdHVyZS5iZWdpblJlY29yZGluZygxMDAsIDEwMCk7CisgICAgICAgIHBpY3R1cmVDYW52YXMuZHJhd0JpdG1hcChod0JpdG1hcCwgMCwgMCwgbnVsbCk7CisKKyAgICAgICAgUGljdHVyZSBvdXRlclBpY3R1cmUgPSBuZXcgUGljdHVyZSgpOworICAgICAgICBDYW52YXMgb3V0ZXJQaWN0dXJlQ2FudmFzID0gb3V0ZXJQaWN0dXJlLmJlZ2luUmVjb3JkaW5nKDEwMCwgMTAwKTsKKyAgICAgICAgb3V0ZXJQaWN0dXJlQ2FudmFzLmRyYXdQaWN0dXJlKGlubmVyUGljdHVyZSk7CisgICAgICAgIG1DYW52YXMuZHJhd1BpY3R1cmUob3V0ZXJQaWN0dXJlKTsgLy8gd2UgdmVyaWZ5IHRoaXMgc3BlY2lmaWMgY2FsbCBzaG91bGQgSUFFCisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCiAgICAgcHVibGljIHZvaWQgdGVzdEh3Qml0bWFwU2hhZGVySW5Td0NhbnZhczEoKSB7CiAgICAgICAgIEJpdG1hcCBod0JpdG1hcCA9IG1JbW11dGFibGVCaXRtYXAuY29weShDb25maWcuSEFSRFdBUkUsIGZhbHNlKTsKICAgICAgICAgQml0bWFwU2hhZGVyIGJpdG1hcFNoYWRlciA9IG5ldyBCaXRtYXBTaGFkZXIoaHdCaXRtYXAsIFNoYWRlci5UaWxlTW9kZS5SRVBFQVQsCkBAIC0yMTQyLDcgKzE3MTgsNyBAQAogICAgICAgICBtQ2FudmFzLmRyYXdSZWN0KDAsIDAsIDEwLCAxMCwgcCk7CiAgICAgfQogCi0gICAgQFRlc3QoZXhwZWN0ZWQgPSBJbGxlZ2FsU3RhdGVFeGNlcHRpb24uY2xhc3MpCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCiAgICAgcHVibGljIHZvaWQgdGVzdEh3Qml0bWFwU2hhZGVySW5Td0NhbnZhczIoKSB7CiAgICAgICAgIEJpdG1hcCBod0JpdG1hcCA9IG1JbW11dGFibGVCaXRtYXAuY29weShDb25maWcuSEFSRFdBUkUsIGZhbHNlKTsKICAgICAgICAgQml0bWFwU2hhZGVyIGJpdG1hcFNoYWRlciA9IG5ldyBCaXRtYXBTaGFkZXIoaHdCaXRtYXAsIFNoYWRlci5UaWxlTW9kZS5SRVBFQVQsCkBAIC0yMTY5LDQ1ICsxNzQ1LDYgQEAKICAgICAgICAgcmV0dXJuIGNsaXA7CiAgICAgfQogCi0gICAgLy8gTG9vcHMgdGhyb3VnaCB0aGUgcGFzc2VkIGZsYWdzLCBhcHBseWluZyBlYWNoIGluIG9yZGVyIHdpdGggc3VjY2Vzc2l2ZSBjYWxscwotICAgIC8vIHRvIHNhdmUsIHZlcmlmeWluZyB0aGUgY2xpcCBhbmQgbWF0cml4IHZhbHVlcyB3aGVuIHJlc3RvcmluZy4KLSAgICBwcml2YXRlIHZvaWQgdmVyaWZ5U2F2ZUZsYWdzU2VxdWVuY2UoaW50W10gc2F2ZUZsYWdzKSB7Ci0gICAgICAgIGZpbmFsIFZlY3RvcjxSZWN0Rj4gY2xpcHMgPSBuZXcgVmVjdG9yPFJlY3RGPigpOwotICAgICAgICBmaW5hbCBWZWN0b3I8TWF0cml4PiBtYXRyaWNlcyA9IG5ldyBWZWN0b3I8TWF0cml4PigpOwotCi0gICAgICAgIGFzc2VydFRydWUoQklUTUFQX1dJRFRIID4gc2F2ZUZsYWdzLmxlbmd0aCk7Ci0gICAgICAgIGFzc2VydFRydWUoQklUTUFQX0hFSUdIVCA+IHNhdmVGbGFncy5sZW5ndGgpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2F2ZUZsYWdzLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICBjbGlwcy5hZGQoZ2V0RGV2aWNlQ2xpcCgpKTsKLSAgICAgICAgICAgIG1hdHJpY2VzLmFkZChtQ2FudmFzLmdldE1hdHJpeCgpKTsKLSAgICAgICAgICAgIG1DYW52YXMuc2F2ZShzYXZlRmxhZ3NbaV0pOwotCi0gICAgICAgICAgICBtQ2FudmFzLnRyYW5zbGF0ZSgxLCAxKTsKLSAgICAgICAgICAgIG1DYW52YXMuY2xpcFJlY3QoMCwgMCwgQklUTUFQX1dJRFRIIC0gaSAtIDEsIEJJVE1BUF9IRUlHSFQgLSBpIC0gMSk7Ci0KLSAgICAgICAgICAgIGlmIChpICA+IDApIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBhcmUgbXV0YXRpbmcgdGhlIHN0YXRlIG9uIGVhY2ggaXRlcmF0aW9uLgotICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKGNsaXBzLmVsZW1lbnRBdChpKS5lcXVhbHMoY2xpcHMuZWxlbWVudEF0KGkgLSAxKSkpOwotICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKG1hdHJpY2VzLmVsZW1lbnRBdChpKS5lcXVhbHMobWF0cmljZXMuZWxlbWVudEF0KGkgLSAxKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IHNhdmVGbGFncy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgewotICAgICAgICAgICAgLy8gSWYgY2xpcC9tYXRyaXggZmxhZ3MgYXJlIG5vdCBzZXQsIHRoZSBhc3NvY2lhdGVkIHN0YXRlIHNob3VsZCBiZSBwcmVzZXJ2ZWQuCi0gICAgICAgICAgICBpZiAoKHNhdmVGbGFnc1tpXSAmIENhbnZhcy5DTElQX1NBVkVfRkxBRykgPT0gMCkgewotICAgICAgICAgICAgICAgIGNsaXBzLmVsZW1lbnRBdChpKS5zZXQoZ2V0RGV2aWNlQ2xpcCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgoc2F2ZUZsYWdzW2ldICYgQ2FudmFzLk1BVFJJWF9TQVZFX0ZMQUcpID09IDApIHsKLSAgICAgICAgICAgICAgICBtYXRyaWNlcy5lbGVtZW50QXQoaSkuc2V0KG1DYW52YXMuZ2V0TWF0cml4KCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtQ2FudmFzLnJlc3RvcmUoKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhjbGlwcy5lbGVtZW50QXQoaSksIGdldERldmljZUNsaXAoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobWF0cmljZXMuZWxlbWVudEF0KGkpLCBtQ2FudmFzLmdldE1hdHJpeCgpKTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdERyYXdCaXRtYXBDb2xvckJlaGF2aW9yKCkgewogICAgICAgICB0cnkgewpAQCAtMjIyNCw3ICsxNzYxLDcgQEAKICAgICAgICAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBwaXhlbCBpcyBub3cgbWF4IHJlZC4KICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMHhGRkZGMDAwMCwgY2FudmFzQml0bWFwLmdldFBpeGVsKDAsIDApKTsKICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgQXNzZXJ0LmZhaWwoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL0NhbnZhc19FZGdlVHlwZVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9DYW52YXNfRWRnZVR5cGVUZXN0LmphdmEKaW5kZXggZjM0ZWM3MS4uZmZhZWM1NCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL0NhbnZhc19FZGdlVHlwZVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvQ2FudmFzX0VkZ2VUeXBlVGVzdC5qYXZhCkBAIC0yMSw4ICsyMSw5IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMuRWRnZVR5cGU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYXRoOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdEY7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiAKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvQ2FudmFzX1ZlcnRleE1vZGVUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvQ2FudmFzX1ZlcnRleE1vZGVUZXN0LmphdmEKaW5kZXggNjg1ODhlYy4uYzk3ZDVlOSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL0NhbnZhc19WZXJ0ZXhNb2RlVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9DYW52YXNfVmVydGV4TW9kZVRlc3QuamF2YQpAQCAtMjIsOCArMjIsOSBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzLlZlcnRleE1vZGU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9Db2xvck1hdHJpeENvbG9yRmlsdGVyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL0NvbG9yTWF0cml4Q29sb3JGaWx0ZXJUZXN0LmphdmEKaW5kZXggMzU4ZTQwMS4uY2RiYmQwOSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL0NvbG9yTWF0cml4Q29sb3JGaWx0ZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL0NvbG9yTWF0cml4Q29sb3JGaWx0ZXJUZXN0LmphdmEKQEAgLTE3LDcgKzE3LDYgQEAKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEFycmF5RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3RTYW1lOwogCiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAuQ29uZmlnOwpAQCAtMjYsOCArMjUsOSBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3JNYXRyaXg7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvck1hdHJpeENvbG9yRmlsdGVyOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNvbG9yVXRpbHM7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9Db2xvck1hdHJpeFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9Db2xvck1hdHJpeFRlc3QuamF2YQppbmRleCBhOWQwZTQ0Li41NDgwYTQxIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvQ29sb3JNYXRyaXhUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL0NvbG9yTWF0cml4VGVzdC5qYXZhCkBAIC0yMCw4ICsyMCw5IEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90RXF1YWxzOwogCiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvck1hdHJpeDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvQ29sb3JTcGFjZVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9Db2xvclNwYWNlVGVzdC5qYXZhCmluZGV4IGI1MzVlZGIuLmZiMWU2ZDQxIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvQ29sb3JTcGFjZVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvQ29sb3JTcGFjZVRlc3QuamF2YQpAQCAtMjQsOCArMjQsOSBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yU3BhY2U7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiAKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvQ29sb3JUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvQ29sb3JUZXN0LmphdmEKaW5kZXggMWU2NWNhZi4uNzI1Zjg1MSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL0NvbG9yVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9Db2xvclRlc3QuamF2YQpAQCAtMTUsMTggKzE1LDI0IEBACiAgKi8KIHBhY2thZ2UgYW5kcm9pZC5ncmFwaGljcy5jdHM7CiAKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbjsKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZTsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIAoraW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKIEBTbWFsbFRlc3QKIEBSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCiBwdWJsaWMgY2xhc3MgQ29sb3JUZXN0IHsKQEAgLTY0LDE0ICs3MCw1MiBAQAogICAgICAgICAgICAgICAgIHsgMHhmZjAwMDAwMCwgYW5kcm9pZC5SLmNvbG9yLndpZGdldF9lZGl0dGV4dF9kYXJrIH0sCiAgICAgICAgIH07CiAKKyAgICAgICAgTGlzdDxJbnRlZ2VyPiBleHBlY3RlZENvbG9yU3RhdGVMaXN0cyA9IEFycmF5cy5hc0xpc3QoCisgICAgICAgICAgICAgICAgYW5kcm9pZC5SLmNvbG9yLnByaW1hcnlfdGV4dF9kYXJrLAorICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5jb2xvci5wcmltYXJ5X3RleHRfZGFya19ub2Rpc2FibGUsCisgICAgICAgICAgICAgICAgYW5kcm9pZC5SLmNvbG9yLnByaW1hcnlfdGV4dF9saWdodCwKKyAgICAgICAgICAgICAgICBhbmRyb2lkLlIuY29sb3IucHJpbWFyeV90ZXh0X2xpZ2h0X25vZGlzYWJsZSwKKyAgICAgICAgICAgICAgICBhbmRyb2lkLlIuY29sb3Iuc2Vjb25kYXJ5X3RleHRfZGFyaywKKyAgICAgICAgICAgICAgICBhbmRyb2lkLlIuY29sb3Iuc2Vjb25kYXJ5X3RleHRfZGFya19ub2Rpc2FibGUsCisgICAgICAgICAgICAgICAgYW5kcm9pZC5SLmNvbG9yLnNlY29uZGFyeV90ZXh0X2xpZ2h0LAorICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5jb2xvci5zZWNvbmRhcnlfdGV4dF9saWdodF9ub2Rpc2FibGUsCisgICAgICAgICAgICAgICAgYW5kcm9pZC5SLmNvbG9yLnRhYl9pbmRpY2F0b3JfdGV4dCwKKyAgICAgICAgICAgICAgICBhbmRyb2lkLlIuY29sb3IudGVydGlhcnlfdGV4dF9kYXJrLAorICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5jb2xvci50ZXJ0aWFyeV90ZXh0X2xpZ2h0LAorICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5jb2xvci53aWRnZXRfZWRpdHRleHRfZGFyaworICAgICAgICApOworCiAgICAgICAgIFJlc291cmNlcyByZXNvdXJjZXMgPSBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRUYXJnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCk7CiAgICAgICAgIGZvciAoaW50W10gcGFpciA6IGNvbG9ycykgewotICAgICAgICAgICAgaW50IHZhbHVlID0gcmVzb3VyY2VzLmdldENvbG9yKHBhaXJbMV0sIG51bGwpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJDb2xvciA9ICIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKHZhbHVlKSArICIsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEludGVnZXIudG9IZXhTdHJpbmcocGFpclswXSkgKyAiIGV4cGVjdGVkIiwKLSAgICAgICAgICAgICAgICAgICAgcGFpclswXSwKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUpOworICAgICAgICAgICAgZmluYWwgaW50IHJlc291cmNlSWQgPSBwYWlyWzFdOworICAgICAgICAgICAgZmluYWwgaW50IGV4cGVjdGVkQ29sb3IgPSBwYWlyWzBdOwogCisgICAgICAgICAgICAvLyB2YWxpZGF0ZSBjb2xvciBmcm9tIGdldENvbG9yCisgICAgICAgICAgICBpbnQgb2JzZXJ2ZWRDb2xvciA9IHJlc291cmNlcy5nZXRDb2xvcihyZXNvdXJjZUlkLCBudWxsKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiQ29sb3IgPSAiICsgSW50ZWdlci50b0hleFN0cmluZyhvYnNlcnZlZENvbG9yKSArICIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEludGVnZXIudG9IZXhTdHJpbmcoZXhwZWN0ZWRDb2xvcikgKyAiIGV4cGVjdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZWRDb2xvcik7CisKKyAgICAgICAgICAgIC8vIHZhbGlkYXRlIGNvbG9yIGZyb20gZ2V0VmFsdWUKKyAgICAgICAgICAgIFR5cGVkVmFsdWUgdmFsdWUgPSBuZXcgVHlwZWRWYWx1ZSgpOworICAgICAgICAgICAgcmVzb3VyY2VzLmdldFZhbHVlKHJlc291cmNlSWQsIHZhbHVlLCB0cnVlKTsKKworICAgICAgICAgICAgLy8gY29sb3JzIHNob3VsZG4ndCBkZXBlbmQgb24gY29uZmlnIGNoYW5nZXMKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCB2YWx1ZS5jaGFuZ2luZ0NvbmZpZ3VyYXRpb25zKTsKKworICAgICAgICAgICAgaWYgKGV4cGVjdGVkQ29sb3JTdGF0ZUxpc3RzLmNvbnRhaW5zKHJlc291cmNlSWQpKSB7CisgICAgICAgICAgICAgICAgLy8gQ29sb3JTdGF0ZUxpc3RzIGFyZSBzdHJpbmdzCisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJDU0xzIHNob3VsZCBiZSBzdHJpbmdzIiwgVHlwZWRWYWx1ZS5UWVBFX1NUUklORywgdmFsdWUudHlwZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGNvbG9ycyBzaG91bGQgYmUgcmF3IGludHMKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJUeXBlIHNob3VsZCBiZSBpbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUudHlwZSA+PSBUeXBlZFZhbHVlLlRZUEVfRklSU1RfSU5UCisgICAgICAgICAgICAgICAgICAgICAgICAmJiB2YWx1ZS50eXBlIDw9IFR5cGVkVmFsdWUuVFlQRV9MQVNUX0lOVCk7CisKKyAgICAgICAgICAgICAgICAvLyBWYWxpZGF0ZSBjb2xvciBmcm9tIGdldFZhbHVlCisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJDb2xvciBzaG91bGQgYmUgZXhwZWN0ZWQgdmFsdWUiLCBleHBlY3RlZENvbG9yLCB2YWx1ZS5kYXRhKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBhc3NlcnRFcXVhbHMoIlRlc3Qgbm8gbG9uZ2VyIGluIHN5bmMgd2l0aCBjb2xvcnMgaW4gYW5kcm9pZC5SLmNvbG9yIiwKICAgICAgICAgICAgICAgICBjb2xvcnMubGVuZ3RoLApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL0NvbG9yX0NvbG9yTG9uZ1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9Db2xvcl9Db2xvckxvbmdUZXN0LmphdmEKaW5kZXggZjc4OTNjNy4uODQ5ZGQxYiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL0NvbG9yX0NvbG9yTG9uZ1Rlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvQ29sb3JfQ29sb3JMb25nVGVzdC5qYXZhCkBAIC0xNSwxNCArMTUsNiBAQAogICovCiBwYWNrYWdlIGFuZHJvaWQuZ3JhcGhpY3MuY3RzOwogCi1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yU3BhY2U7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvclNwYWNlLk5hbWVkOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKLQogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yLmFscGhhOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yLmJsdWU7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3IuY29sb3JTcGFjZTsKQEAgLTMzLDYgKzI1LDcgQEAKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5Db2xvci5yZWQ7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3IudG9BcmdiOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yLnZhbHVlT2Y7CisKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90RXF1YWxzOwpAQCAtNDAsNiArMzMsMTYgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRTYW1lOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3JTcGFjZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yU3BhY2UuTmFtZWQ7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKIEBTbWFsbFRlc3QKIEBSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCiBwdWJsaWMgY2xhc3MgQ29sb3JfQ29sb3JMb25nVGVzdCB7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvQ29tcG9zZVBhdGhFZmZlY3RUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvQ29tcG9zZVBhdGhFZmZlY3RUZXN0LmphdmEKaW5kZXggYmYxMWI5My4uYmVlOTNhMyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL0NvbXBvc2VQYXRoRWZmZWN0VGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9Db21wb3NlUGF0aEVmZmVjdFRlc3QuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwLkNvbmZpZzsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29tcG9zZVBhdGhFZmZlY3Q7CkBAIC0yNSwxMSArMjYsOSBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYXRoOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGF0aEVmZmVjdDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcC5Db25maWc7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiAKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL0NvbXBvc2VTaGFkZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvQ29tcG9zZVNoYWRlclRlc3QuamF2YQppbmRleCA4Yzg5MTFlLi5kNzM3OGI5IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvQ29tcG9zZVNoYWRlclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvQ29tcG9zZVNoYWRlclRlc3QuamF2YQpAQCAtMzAsMTAgKzMwLDExIEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmWGZlcm1vZGU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5TaGFkZXI7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5TaGFkZXIuVGlsZU1vZGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL0Nvcm5lclBhdGhFZmZlY3RUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvQ29ybmVyUGF0aEVmZmVjdFRlc3QuamF2YQppbmRleCA1NGNjM2MwLi5iM2RmZDNhIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvQ29ybmVyUGF0aEVmZmVjdFRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvQ29ybmVyUGF0aEVmZmVjdFRlc3QuamF2YQpAQCAtMzAsOCArMzAsOSBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZi5Nb2RlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZlhmZXJtb2RlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdEY7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiAKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvRGFzaFBhdGhFZmZlY3RUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvRGFzaFBhdGhFZmZlY3RUZXN0LmphdmEKaW5kZXggY2YxYzk3MS4uZDFjNzg4OSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL0Rhc2hQYXRoRWZmZWN0VGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9EYXNoUGF0aEVmZmVjdFRlc3QuamF2YQpAQCAtMjYsMTAgKzI2LDExIEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludC5TdHlsZTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhdGg7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYXRoRWZmZWN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9EaXNjcmV0ZVBhdGhFZmZlY3RUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvRGlzY3JldGVQYXRoRWZmZWN0VGVzdC5qYXZhCmluZGV4IGVlNDllMmIuLmU3NmRiOGYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9EaXNjcmV0ZVBhdGhFZmZlY3RUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL0Rpc2NyZXRlUGF0aEVmZmVjdFRlc3QuamF2YQpAQCAtMjksOCArMjksOSBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGF0aDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmYuTW9kZTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmZYZmVybW9kZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9EcmF3RmlsdGVyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL0RyYXdGaWx0ZXJUZXN0LmphdmEKaW5kZXggNjc2NjQ4My4uNWE0NzJhZSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL0RyYXdGaWx0ZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL0RyYXdGaWx0ZXJUZXN0LmphdmEKQEAgLTE3LDggKzE3LDkgQEAKIHBhY2thZ2UgYW5kcm9pZC5ncmFwaGljcy5jdHM7CiAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkRyYXdGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiAKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvRW1ib3NzTWFza0ZpbHRlclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9FbWJvc3NNYXNrRmlsdGVyVGVzdC5qYXZhCmluZGV4IGM5YTc3MTAuLmY1ZDdkYzIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9FbWJvc3NNYXNrRmlsdGVyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9FbWJvc3NNYXNrRmlsdGVyVGVzdC5qYXZhCkBAIC0yNyw4ICsyNyw5IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhdGg7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL0ZvbnRWYXJpYXRpb25BeGlzVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL0ZvbnRWYXJpYXRpb25BeGlzVGVzdC5qYXZhCmluZGV4IDUwNjNhYTguLjZhMmFmNmEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9Gb250VmFyaWF0aW9uQXhpc1Rlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvRm9udFZhcmlhdGlvbkF4aXNUZXN0LmphdmEKQEAgLTIxLDggKzIxLDkgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwogCiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5mb250cy5Gb250VmFyaWF0aW9uQXhpczsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9JbWFnZURlY29kZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvSW1hZ2VEZWNvZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlOGYyNmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvSW1hZ2VEZWNvZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjIyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5ncmFwaGljcy5jdHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3JTcGFjZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkltYWdlRGVjb2RlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkltYWdlRGVjb2Rlci5EZWNvZGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5JbWFnZURlY29kZXIuT25QYXJ0aWFsSW1hZ2VMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBpeGVsRm9ybWF0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9zdFByb2Nlc3NvcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5CaXRtYXBEcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuTmluZVBhdGNoRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU2l6ZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZTsKKworaW1wb3J0IGFuZHJvaWR4LmNvcmUuY29udGVudC5GaWxlUHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTGFyZ2VUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkJpdG1hcFV0aWxzOworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5JbnRGdW5jdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlRvSW50RnVuY3Rpb247CisKK0BSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgSW1hZ2VEZWNvZGVyVGVzdCB7CisgICAgcHJpdmF0ZSBSZXNvdXJjZXMgbVJlczsKKyAgICBwcml2YXRlIENvbnRlbnRSZXNvbHZlciBtQ29udGVudFJlc29sdmVyOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmVjb3JkIHsKKyAgICAgICAgcHVibGljIGZpbmFsIGludCByZXNJZDsKKyAgICAgICAgcHVibGljIGZpbmFsIGludCB3aWR0aDsKKyAgICAgICAgcHVibGljIGZpbmFsIGludCBoZWlnaHQ7CisgICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgbWltZVR5cGU7CisgICAgICAgIHB1YmxpYyBmaW5hbCBDb2xvclNwYWNlIGNvbG9yU3BhY2U7CisKKyAgICAgICAgUmVjb3JkKGludCByZXNJZCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBTdHJpbmcgbWltZVR5cGUsIENvbG9yU3BhY2UgY29sb3JTcGFjZSkgeworICAgICAgICAgICAgdGhpcy5yZXNJZCAgICA9IHJlc0lkOworICAgICAgICAgICAgdGhpcy53aWR0aCAgICA9IHdpZHRoOworICAgICAgICAgICAgdGhpcy5oZWlnaHQgICA9IGhlaWdodDsKKyAgICAgICAgICAgIHRoaXMubWltZVR5cGUgPSBtaW1lVHlwZTsKKyAgICAgICAgICAgIHRoaXMuY29sb3JTcGFjZSA9IGNvbG9yU3BhY2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb2xvclNwYWNlIHNTUkdCID0gQ29sb3JTcGFjZS5nZXQoQ29sb3JTcGFjZS5OYW1lZC5TUkdCKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFJlY29yZFtdIFJFQ09SRFMgPSBuZXcgUmVjb3JkW10geworICAgICAgICBuZXcgUmVjb3JkKFIuZHJhd2FibGUuYmFzZWxpbmVfanBlZywgMTI4MCwgOTYwLCAiaW1hZ2UvanBlZyIsIHNTUkdCKSwKKyAgICAgICAgbmV3IFJlY29yZChSLmRyYXdhYmxlLnBuZ190ZXN0LCA2NDAsIDQ4MCwgImltYWdlL3BuZyIsIHNTUkdCKSwKKyAgICAgICAgbmV3IFJlY29yZChSLmRyYXdhYmxlLmdpZl90ZXN0LCAzMjAsIDI0MCwgImltYWdlL2dpZiIsIHNTUkdCKSwKKyAgICAgICAgbmV3IFJlY29yZChSLmRyYXdhYmxlLmJtcF90ZXN0LCAzMjAsIDI0MCwgImltYWdlL2JtcCIsIHNTUkdCKSwKKyAgICAgICAgbmV3IFJlY29yZChSLmRyYXdhYmxlLndlYnBfdGVzdCwgNjQwLCA0ODAsICJpbWFnZS93ZWJwIiwgc1NSR0IpLAorICAgICAgICBuZXcgUmVjb3JkKFIuZHJhd2FibGUuZ29vZ2xlX2Nocm9tZSwgMjU2LCAyNTYsICJpbWFnZS94LWljbyIsIHNTUkdCKSwKKyAgICAgICAgbmV3IFJlY29yZChSLmRyYXdhYmxlLmNvbG9yX3doZWVsLCAxMjgsIDEyOCwgImltYWdlL3gtaWNvIiwgc1NSR0IpLAorICAgICAgICBuZXcgUmVjb3JkKFIucmF3LnNhbXBsZV8xbXAsIDYwMCwgMzM4LCAiaW1hZ2UveC1hZG9iZS1kbmciLCBzU1JHQiksCisgICAgfTsKKworICAgIC8vIG9mZnNldCBpcyBob3cgbWFueSBieXRlcyB0byBvZmZzZXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW1hZ2UuCisgICAgLy8gZXh0cmEgaXMgaG93IG1hbnkgYnl0ZXMgdG8gYXBwZW5kIGF0IHRoZSBlbmQuCisgICAgcHJpdmF0ZSBieXRlW10gZ2V0QXNCeXRlQXJyYXkoaW50IHJlc0lkLCBpbnQgb2Zmc2V0LCBpbnQgZXh0cmEpIHsKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dHB1dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgd3JpdGVUb1N0cmVhbShvdXRwdXQsIHJlc0lkLCBvZmZzZXQsIGV4dHJhKTsKKyAgICAgICAgcmV0dXJuIG91dHB1dC50b0J5dGVBcnJheSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB3cml0ZVRvU3RyZWFtKE91dHB1dFN0cmVhbSBvdXRwdXQsIGludCByZXNJZCwgaW50IG9mZnNldCwgaW50IGV4dHJhKSB7CisgICAgICAgIElucHV0U3RyZWFtIGlucHV0ID0gbVJlcy5vcGVuUmF3UmVzb3VyY2UocmVzSWQpOworICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbNDA5Nl07CisgICAgICAgIGludCBieXRlc1JlYWQ7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9mZnNldDsgKytpKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0LndyaXRlKDApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3aGlsZSAoKGJ5dGVzUmVhZCA9IGlucHV0LnJlYWQoYnVmZmVyKSkgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXQud3JpdGUoYnVmZmVyLCAwLCBieXRlc1JlYWQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dHJhOyArK2kpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXQud3JpdGUoMCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlucHV0LmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYnl0ZVtdIGdldEFzQnl0ZUFycmF5KGludCByZXNJZCkgeworICAgICAgICByZXR1cm4gZ2V0QXNCeXRlQXJyYXkocmVzSWQsIDAsIDApOworICAgIH0KKworICAgIHByaXZhdGUgQnl0ZUJ1ZmZlciBnZXRBc0J5dGVCdWZmZXJXcmFwKGludCByZXNJZCkgeworICAgICAgICBieXRlW10gYnVmZmVyID0gZ2V0QXNCeXRlQXJyYXkocmVzSWQpOworICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlci53cmFwKGJ1ZmZlcik7CisgICAgfQorCisgICAgcHJpdmF0ZSBCeXRlQnVmZmVyIGdldEFzRGlyZWN0Qnl0ZUJ1ZmZlcihpbnQgcmVzSWQpIHsKKyAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IGdldEFzQnl0ZUFycmF5KHJlc0lkKTsKKyAgICAgICAgQnl0ZUJ1ZmZlciBieXRlQnVmZmVyID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZURpcmVjdChidWZmZXIubGVuZ3RoKTsKKyAgICAgICAgYnl0ZUJ1ZmZlci5wdXQoYnVmZmVyKTsKKyAgICAgICAgYnl0ZUJ1ZmZlci5wb3NpdGlvbigwKTsKKyAgICAgICAgcmV0dXJuIGJ5dGVCdWZmZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBCeXRlQnVmZmVyIGdldEFzUmVhZE9ubHlCeXRlQnVmZmVyKGludCByZXNJZCkgeworICAgICAgICByZXR1cm4gZ2V0QXNCeXRlQnVmZmVyV3JhcChyZXNJZCkuYXNSZWFkT25seUJ1ZmZlcigpOworICAgIH0KKworICAgIHByaXZhdGUgRmlsZSBnZXRBc0ZpbGUoaW50IHJlc0lkKSB7CisgICAgICAgIEZpbGUgZmlsZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRUYXJnZXRDb250ZXh0KCk7CisgICAgICAgICAgICBGaWxlIGRpciA9IG5ldyBGaWxlKGNvbnRleHQuZ2V0RmlsZXNEaXIoKSwgImltYWdlcyIpOworICAgICAgICAgICAgZGlyLm1rZGlycygpOworICAgICAgICAgICAgZmlsZSA9IG5ldyBGaWxlKGRpciwgInRlc3RfZmlsZSIgKyByZXNJZCk7CisgICAgICAgICAgICBpZiAoIWZpbGUuY3JlYXRlTmV3RmlsZSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZhaWwoIkZhaWxlZCB0byBjcmVhdGUgbmV3IEZpbGUhIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0cHV0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSk7CisgICAgICAgICAgICB3cml0ZVRvU3RyZWFtKG91dHB1dCwgcmVzSWQsIDAsIDApOworICAgICAgICAgICAgb3V0cHV0LmNsb3NlKCk7CisKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRmFpbGVkIHdpdGggZXhjZXB0aW9uICIgKyBlKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmaWxlOworICAgIH0KKworICAgIHByaXZhdGUgVXJpIGdldEFzRmlsZVVyaShpbnQgcmVzSWQpIHsKKyAgICAgICAgcmV0dXJuIFVyaS5mcm9tRmlsZShnZXRBc0ZpbGUocmVzSWQpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFVyaSBnZXRBc0NvbnRlbnRVcmkoaW50IHJlc0lkKSB7CisgICAgICAgIENvbnRleHQgY29udGV4dCA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldFRhcmdldENvbnRleHQoKTsKKyAgICAgICAgcmV0dXJuIEZpbGVQcm92aWRlci5nZXRVcmlGb3JGaWxlKGNvbnRleHQsCisgICAgICAgICAgICAgICAgImFuZHJvaWQuZ3JhcGhpY3MuY3RzLmZpbGVwcm92aWRlciIsIGdldEFzRmlsZShyZXNJZCkpOworICAgIH0KKworICAgIHByaXZhdGUgVXJpIGdldEFzUmVzb3VyY2VVcmkoaW50IHJlc0lkKSB7CisgICAgICAgIHJldHVybiBuZXcgVXJpLkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zY2hlbWUoQ29udGVudFJlc29sdmVyLlNDSEVNRV9BTkRST0lEX1JFU09VUkNFKQorICAgICAgICAgICAgICAgIC5hdXRob3JpdHkobVJlcy5nZXRSZXNvdXJjZVBhY2thZ2VOYW1lKHJlc0lkKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kUGF0aChtUmVzLmdldFJlc291cmNlVHlwZU5hbWUocmVzSWQpKQorICAgICAgICAgICAgICAgIC5hcHBlbmRQYXRoKG1SZXMuZ2V0UmVzb3VyY2VFbnRyeU5hbWUocmVzSWQpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgIH0KKworICAgIHByaXZhdGUgaW50ZXJmYWNlIFNvdXJjZUNyZWF0b3IgZXh0ZW5kcyBJbnRGdW5jdGlvbjxJbWFnZURlY29kZXIuU291cmNlPiB7fTsKKworICAgIHByaXZhdGUgU291cmNlQ3JlYXRvcltdIG1DcmVhdG9ycyA9IG5ldyBTb3VyY2VDcmVhdG9yW10geworICAgICAgICAgICAgcmVzSWQgLT4gSW1hZ2VEZWNvZGVyLmNyZWF0ZVNvdXJjZShnZXRBc0J5dGVCdWZmZXJXcmFwKHJlc0lkKSksCisgICAgICAgICAgICByZXNJZCAtPiBJbWFnZURlY29kZXIuY3JlYXRlU291cmNlKGdldEFzRGlyZWN0Qnl0ZUJ1ZmZlcihyZXNJZCkpLAorICAgICAgICAgICAgcmVzSWQgLT4gSW1hZ2VEZWNvZGVyLmNyZWF0ZVNvdXJjZShnZXRBc1JlYWRPbmx5Qnl0ZUJ1ZmZlcihyZXNJZCkpLAorICAgICAgICAgICAgcmVzSWQgLT4gSW1hZ2VEZWNvZGVyLmNyZWF0ZVNvdXJjZShnZXRBc0ZpbGUocmVzSWQpKSwKKyAgICB9OworCisgICAgcHJpdmF0ZSBpbnRlcmZhY2UgVXJpQ3JlYXRvciBleHRlbmRzIEludEZ1bmN0aW9uPFVyaT4ge307CisKKyAgICBwcml2YXRlIFVyaUNyZWF0b3JbXSBtVXJpQ3JlYXRvcnMgPSBuZXcgVXJpQ3JlYXRvcltdIHsKKyAgICAgICAgICAgIHJlc0lkIC0+IGdldEFzUmVzb3VyY2VVcmkocmVzSWQpLAorICAgICAgICAgICAgcmVzSWQgLT4gZ2V0QXNGaWxlVXJpKHJlc0lkKSwKKyAgICAgICAgICAgIHJlc0lkIC0+IGdldEFzQ29udGVudFVyaShyZXNJZCksCisgICAgfTsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVyaXMoKSB7CisgICAgICAgIGZvciAoUmVjb3JkIHJlY29yZCA6IFJFQ09SRFMpIHsKKyAgICAgICAgICAgIGludCByZXNJZCA9IHJlY29yZC5yZXNJZDsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbVJlcy5nZXRSZXNvdXJjZUVudHJ5TmFtZShyZXNJZCk7CisgICAgICAgICAgICBmb3IgKFVyaUNyZWF0b3IgZiA6IG1VcmlDcmVhdG9ycykgeworICAgICAgICAgICAgICAgIEltYWdlRGVjb2Rlci5Tb3VyY2Ugc3JjID0gbnVsbDsKKyAgICAgICAgICAgICAgICBVcmkgdXJpID0gZi5hcHBseShyZXNJZCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGZ1bGxOYW1lID0gbmFtZSArICI6ICIgKyB1cmkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBzcmMgPSBJbWFnZURlY29kZXIuY3JlYXRlU291cmNlKG1Db250ZW50UmVzb2x2ZXIsIHVyaSk7CisKKyAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJmYWlsZWQgdG8gY3JlYXRlIFNvdXJjZSBmb3IgIiArIGZ1bGxOYW1lLCBzcmMpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIERyYXdhYmxlIGQgPSBJbWFnZURlY29kZXIuZGVjb2RlRHJhd2FibGUoc3JjLCAoZGVjb2RlciwgaW5mbywgcykgLT4geworICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2Rlci5zZXRPblBhcnRpYWxJbWFnZUxpc3RlbmVyKChlKSAtPiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbCgiZXJyb3IgZm9yIGltYWdlICIgKyBmdWxsTmFtZSArICI6XG4iICsgZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJmYWlsZWQgdG8gY3JlYXRlIGRyYXdhYmxlIGZvciAiICsgZnVsbE5hbWUsIGQpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgZmFpbCgiZXhjZXB0aW9uIGZvciBpbWFnZSAiICsgZnVsbE5hbWUgKyAiOlxuIiArIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXR1cCgpIHsKKyAgICAgICAgbVJlcyA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldFRhcmdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKTsKKyAgICAgICAgbUNvbnRlbnRSZXNvbHZlciA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldFRhcmdldENvbnRleHQoKS5nZXRDb250ZW50UmVzb2x2ZXIoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbmZvKCkgeworICAgICAgICBmb3IgKFJlY29yZCByZWNvcmQgOiBSRUNPUkRTKSB7CisgICAgICAgICAgICBmb3IgKFNvdXJjZUNyZWF0b3IgZiA6IG1DcmVhdG9ycykgeworICAgICAgICAgICAgICAgIEltYWdlRGVjb2Rlci5Tb3VyY2Ugc3JjID0gZi5hcHBseShyZWNvcmQucmVzSWQpOworICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoc3JjKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBJbWFnZURlY29kZXIuZGVjb2RlRHJhd2FibGUoc3JjLCAoZGVjb2RlciwgaW5mbywgcykgLT4geworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlY29yZC53aWR0aCwgIGluZm8uZ2V0U2l6ZSgpLmdldFdpZHRoKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlY29yZC5oZWlnaHQsIGluZm8uZ2V0U2l6ZSgpLmdldEhlaWdodCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZWNvcmQubWltZVR5cGUsIGluZm8uZ2V0TWltZVR5cGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRTYW1lKHJlY29yZC5jb2xvclNwYWNlLCBpbmZvLmdldENvbG9yU3BhY2UoKSk7CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgZmFpbCgiRmFpbGVkICIgKyBnZXRBc1Jlc291cmNlVXJpKHJlY29yZC5yZXNJZCkgKyAiIHdpdGggZXhjZXB0aW9uICIgKyBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REZWNvZGVEcmF3YWJsZSgpIHsKKyAgICAgICAgZm9yIChSZWNvcmQgcmVjb3JkIDogUkVDT1JEUykgeworICAgICAgICAgICAgZm9yIChTb3VyY2VDcmVhdG9yIGYgOiBtQ3JlYXRvcnMpIHsKKyAgICAgICAgICAgICAgICBJbWFnZURlY29kZXIuU291cmNlIHNyYyA9IGYuYXBwbHkocmVjb3JkLnJlc0lkKTsKKyAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHNyYyk7CisKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBEcmF3YWJsZSBkcmF3YWJsZSA9IEltYWdlRGVjb2Rlci5kZWNvZGVEcmF3YWJsZShzcmMpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGRyYXdhYmxlKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlY29yZC53aWR0aCwgIGRyYXdhYmxlLmdldEludHJpbnNpY1dpZHRoKCkpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVjb3JkLmhlaWdodCwgZHJhd2FibGUuZ2V0SW50cmluc2ljSGVpZ2h0KCkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgZmFpbCgiRmFpbGVkIHdpdGggZXhjZXB0aW9uICIgKyBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REZWNvZGVCaXRtYXAoKSB7CisgICAgICAgIGZvciAoUmVjb3JkIHJlY29yZCA6IFJFQ09SRFMpIHsKKyAgICAgICAgICAgIGZvciAoU291cmNlQ3JlYXRvciBmIDogbUNyZWF0b3JzKSB7CisgICAgICAgICAgICAgICAgSW1hZ2VEZWNvZGVyLlNvdXJjZSBzcmMgPSBmLmFwcGx5KHJlY29yZC5yZXNJZCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChzcmMpOworCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgQml0bWFwIGJtID0gSW1hZ2VEZWNvZGVyLmRlY29kZUJpdG1hcChzcmMpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGJtKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlY29yZC53aWR0aCwgYm0uZ2V0V2lkdGgoKSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZWNvcmQuaGVpZ2h0LCBibS5nZXRIZWlnaHQoKSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKGJtLmlzTXV0YWJsZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IFRoaXMgbWF5IGNoYW5nZSBmb3Igc21hbGwgcmVzb3VyY2VzLCBldGMuCisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhCaXRtYXAuQ29uZmlnLkhBUkRXQVJFLCBibS5nZXRDb25maWcoKSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBmYWlsKCJGYWlsZWQgd2l0aCBleGNlcHRpb24gIiArIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkPUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0Qm9ndXNBbGxvY2F0b3IoKSB7CisgICAgICAgIEltYWdlRGVjb2Rlci5Tb3VyY2Ugc3JjID0gbUNyZWF0b3JzWzBdLmFwcGx5KFJFQ09SRFNbMF0ucmVzSWQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW1hZ2VEZWNvZGVyLmRlY29kZUJpdG1hcChzcmMsIChkZWNvZGVyLCBpbmZvLCBzKSAtPiBkZWNvZGVyLnNldEFsbG9jYXRvcigxNSkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJGYWlsZWQgd2l0aCBleGNlcHRpb24gIiArIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gQUxMT0NBVE9SUyA9IG5ldyBpbnRbXSB7CisgICAgICAgIEltYWdlRGVjb2Rlci5BTExPQ0FUT1JfU09GVFdBUkUsCisgICAgICAgIEltYWdlRGVjb2Rlci5BTExPQ0FUT1JfU0hBUkVEX01FTU9SWSwKKyAgICAgICAgSW1hZ2VEZWNvZGVyLkFMTE9DQVRPUl9IQVJEV0FSRSwKKyAgICAgICAgSW1hZ2VEZWNvZGVyLkFMTE9DQVRPUl9ERUZBVUxULAorICAgIH07CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbGxvY2F0b3IoKSB7CisgICAgICAgIGZpbmFsIGludCByZXNJZCA9IFJFQ09SRFNbMF0ucmVzSWQ7CisgICAgICAgIEltYWdlRGVjb2Rlci5Tb3VyY2Ugc3JjID0gbUNyZWF0b3JzWzBdLmFwcGx5KHJlc0lkKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEltYWdlRGVjb2Rlci5kZWNvZGVEcmF3YWJsZShzcmMsIChkZWNvZGVyLCBpbmZvLCBzKSAtPiB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEltYWdlRGVjb2Rlci5BTExPQ0FUT1JfREVGQVVMVCwgZGVjb2Rlci5nZXRBbGxvY2F0b3IoKSk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgYWxsb2NhdG9yIDogQUxMT0NBVE9SUykgeworICAgICAgICAgICAgICAgICAgICBkZWNvZGVyLnNldEFsbG9jYXRvcihhbGxvY2F0b3IpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYWxsb2NhdG9yLCBkZWNvZGVyLmdldEFsbG9jYXRvcigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRmFpbGVkICIgKyBnZXRBc1Jlc291cmNlVXJpKHJlc0lkKSArICIgd2l0aCBleGNlcHRpb24gIiArIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0QWxsb2NhdG9yRGVjb2RlQml0bWFwKCkgeworICAgICAgICBjbGFzcyBMaXN0ZW5lciBpbXBsZW1lbnRzIEltYWdlRGVjb2Rlci5PbkhlYWRlckRlY29kZWRMaXN0ZW5lciB7CisgICAgICAgICAgICBwdWJsaWMgaW50IGFsbG9jYXRvcjsKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGRvQ3JvcDsKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGRvU2NhbGU7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uSGVhZGVyRGVjb2RlZChJbWFnZURlY29kZXIgZGVjb2RlciwgSW1hZ2VEZWNvZGVyLkltYWdlSW5mbyBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltYWdlRGVjb2Rlci5Tb3VyY2Ugc3JjKSB7CisgICAgICAgICAgICAgICAgZGVjb2Rlci5zZXRBbGxvY2F0b3IoYWxsb2NhdG9yKTsKKyAgICAgICAgICAgICAgICBpZiAoZG9TY2FsZSkgeworICAgICAgICAgICAgICAgICAgICBkZWNvZGVyLnNldFRhcmdldFNhbXBsZVNpemUoMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChkb0Nyb3ApIHsKKyAgICAgICAgICAgICAgICAgICAgZGVjb2Rlci5zZXRDcm9wKG5ldyBSZWN0KDEsIDEsIGluZm8uZ2V0U2l6ZSgpLmdldFdpZHRoKCkgIC8gMiAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLmdldFNpemUoKS5nZXRIZWlnaHQoKSAvIDIgLSAxKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBMaXN0ZW5lciBsID0gbmV3IExpc3RlbmVyKCk7CisKKyAgICAgICAgYm9vbGVhbiB0cnVlRmFsc2VbXSA9IG5ldyBib29sZWFuW10geyB0cnVlLCBmYWxzZSB9OworICAgICAgICBmb3IgKFJlY29yZCByZWNvcmQgOiBSRUNPUkRTKSB7CisgICAgICAgICAgICBmb3IgKFNvdXJjZUNyZWF0b3IgZiA6IG1DcmVhdG9ycykgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGFsbG9jYXRvciA6IEFMTE9DQVRPUlMpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChib29sZWFuIGRvQ3JvcCA6IHRydWVGYWxzZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChib29sZWFuIGRvU2NhbGUgOiB0cnVlRmFsc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsLmRvQ3JvcCA9IGRvQ3JvcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsLmRvU2NhbGUgPSBkb1NjYWxlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwuYWxsb2NhdG9yID0gYWxsb2NhdG9yOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltYWdlRGVjb2Rlci5Tb3VyY2Ugc3JjID0gZi5hcHBseShyZWNvcmQucmVzSWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoc3JjKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdG1hcCBibSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibSA9IEltYWdlRGVjb2Rlci5kZWNvZGVCaXRtYXAoc3JjLCBsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwoIkZhaWxlZCAiICsgZ2V0QXNSZXNvdXJjZVVyaShyZWNvcmQucmVzSWQpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHdpdGggZXhjZXB0aW9uICIgKyBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChibSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsbG9jYXRvcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEltYWdlRGVjb2Rlci5BTExPQ0FUT1JfU09GVFdBUkU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IE9uY2UgQml0bWFwIHByb3ZpZGVzIGFjY2VzcyB0byBpdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2hhcmVkTWVtb3J5LCBjb25maXJtIHRoYXQgQUxMT0NBVE9SX1NIQVJFRF9NRU1PUlkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd29ya2VkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEltYWdlRGVjb2Rlci5BTExPQ0FUT1JfU0hBUkVEX01FTU9SWToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydE5vdEVxdWFscyhCaXRtYXAuQ29uZmlnLkhBUkRXQVJFLCBibS5nZXRDb25maWcoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZG9TY2FsZSAmJiAhZG9Dcm9wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0bWFwIHJlZmVyZW5jZSA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UobVJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZC5yZXNJZCwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZWZlcmVuY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdG1hcFV0aWxzLmNvbXBhcmVCaXRtYXBzKGJtLCByZWZlcmVuY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGdldEFzUmVzb3VyY2VVcmkocmVjb3JkLnJlc0lkKS50b1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbWFnZSAiICsgbmFtZSArICI7IGFsbG9jYXRvcjogIiArIGFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRtYXAuQ29uZmlnLkhBUkRXQVJFLCBibS5nZXRDb25maWcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRVbnByZW11bCgpIHsKKyAgICAgICAgZmluYWwgaW50IHJlc0lkID0gUkVDT1JEU1swXS5yZXNJZDsKKyAgICAgICAgSW1hZ2VEZWNvZGVyLlNvdXJjZSBzcmMgPSBtQ3JlYXRvcnNbMF0uYXBwbHkocmVzSWQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW1hZ2VEZWNvZGVyLmRlY29kZUJpdG1hcChzcmMsIChkZWNvZGVyLCBpbmZvLCBzKSAtPiB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UoZGVjb2Rlci5pc1VucHJlbXVsdGlwbGllZFJlcXVpcmVkKCkpOworCisgICAgICAgICAgICAgICAgZGVjb2Rlci5zZXRVbnByZW11bHRpcGxpZWRSZXF1aXJlZCh0cnVlKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGRlY29kZXIuaXNVbnByZW11bHRpcGxpZWRSZXF1aXJlZCgpKTsKKworICAgICAgICAgICAgICAgIGRlY29kZXIuc2V0VW5wcmVtdWx0aXBsaWVkUmVxdWlyZWQoZmFsc2UpOworICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKGRlY29kZXIuaXNVbnByZW11bHRpcGxpZWRSZXF1aXJlZCgpKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJGYWlsZWQgIiArIGdldEFzUmVzb3VyY2VVcmkocmVzSWQpICsgIiB3aXRoIGV4Y2VwdGlvbiAiICsgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVbnByZW11bCgpIHsKKyAgICAgICAgaW50W10gcmVzSWRzID0gbmV3IGludFtdIHsgUi5kcmF3YWJsZS5wbmdfdGVzdCwgUi5kcmF3YWJsZS5hbHBoYSB9OworICAgICAgICBib29sZWFuW10gaGFzQWxwaGEgPSBuZXcgYm9vbGVhbltdIHsgZmFsc2UsICAgICB0cnVlIH07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzSWRzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBmb3IgKFNvdXJjZUNyZWF0b3IgZiA6IG1DcmVhdG9ycykgeworICAgICAgICAgICAgICAgIC8vIE5vcm1hbCBkZWNvZGUKKyAgICAgICAgICAgICAgICBJbWFnZURlY29kZXIuU291cmNlIHNyYyA9IGYuYXBwbHkocmVzSWRzW2ldKTsKKyAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHNyYyk7CisKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBCaXRtYXAgbm9ybWFsID0gSW1hZ2VEZWNvZGVyLmRlY29kZUJpdG1hcChzcmMpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKG5vcm1hbCk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhub3JtYWwuaGFzQWxwaGEoKSwgaGFzQWxwaGFbaV0pOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMobm9ybWFsLmlzUHJlbXVsdGlwbGllZCgpLCBoYXNBbHBoYVtpXSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gUmVxdWlyZSB1bnByZW11bAorICAgICAgICAgICAgICAgICAgICBzcmMgPSBmLmFwcGx5KHJlc0lkc1tpXSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoc3JjKTsKKworICAgICAgICAgICAgICAgICAgICBCaXRtYXAgdW5wcmVtdWwgPSBJbWFnZURlY29kZXIuZGVjb2RlQml0bWFwKHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVjb2RlciwgaW5mbywgcykgLT4gZGVjb2Rlci5zZXRVbnByZW11bHRpcGxpZWRSZXF1aXJlZCh0cnVlKSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwodW5wcmVtdWwpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHModW5wcmVtdWwuaGFzQWxwaGEoKSwgaGFzQWxwaGFbaV0pOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZSh1bnByZW11bC5pc1ByZW11bHRpcGxpZWQoKSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBmYWlsKCJGYWlsZWQgd2l0aCBleGNlcHRpb24gIiArIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFBvc3RQcm9jZXNzb3IoKSB7CisgICAgICAgIFBvc3RQcm9jZXNzb3JbXSBwcm9jZXNzb3JzID0gbmV3IFBvc3RQcm9jZXNzb3JbXSB7CisgICAgICAgICAgICAgICAgKGNhbnZhcykgLT4gUGl4ZWxGb3JtYXQuVU5LTk9XTiwKKyAgICAgICAgICAgICAgICAoY2FudmFzKSAtPiBQaXhlbEZvcm1hdC5VTktOT1dOLAorICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgIH07CisgICAgICAgIGZpbmFsIGludCByZXNJZCA9IFJFQ09SRFNbMF0ucmVzSWQ7CisgICAgICAgIEltYWdlRGVjb2Rlci5Tb3VyY2Ugc3JjID0gbUNyZWF0b3JzWzBdLmFwcGx5KHJlc0lkKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEltYWdlRGVjb2Rlci5kZWNvZGVEcmF3YWJsZShzcmMsIChkZWNvZGVyLCBpbmZvLCBzKSAtPiB7CisgICAgICAgICAgICAgICAgYXNzZXJ0TnVsbChkZWNvZGVyLmdldFBvc3RQcm9jZXNzb3IoKSk7CisKKyAgICAgICAgICAgICAgICBmb3IgKFBvc3RQcm9jZXNzb3IgcHAgOiBwcm9jZXNzb3JzKSB7CisgICAgICAgICAgICAgICAgICAgIGRlY29kZXIuc2V0UG9zdFByb2Nlc3NvcihwcCk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFNhbWUocHAsIGRlY29kZXIuZ2V0UG9zdFByb2Nlc3NvcigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRmFpbGVkICIgKyBnZXRBc1Jlc291cmNlVXJpKHJlc0lkKSArICIgd2l0aCBleGNlcHRpb24gIiArIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdFByb2Nlc3NvcigpIHsKKyAgICAgICAgY2xhc3MgTGlzdGVuZXIgaW1wbGVtZW50cyBJbWFnZURlY29kZXIuT25IZWFkZXJEZWNvZGVkTGlzdGVuZXIgeworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcmVxdWlyZVNvZnR3YXJlOworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkhlYWRlckRlY29kZWQoSW1hZ2VEZWNvZGVyIGRlY29kZXIsIEltYWdlRGVjb2Rlci5JbWFnZUluZm8gaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbWFnZURlY29kZXIuU291cmNlIHNyYykgeworICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlU29mdHdhcmUpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVjb2Rlci5zZXRBbGxvY2F0b3IoSW1hZ2VEZWNvZGVyLkFMTE9DQVRPUl9TT0ZUV0FSRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlY29kZXIuc2V0UG9zdFByb2Nlc3NvcigoY2FudmFzKSAtPiB7CisgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3Q29sb3IoQ29sb3IuQkxBQ0spOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGl4ZWxGb3JtYXQuT1BBUVVFOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBMaXN0ZW5lciBsID0gbmV3IExpc3RlbmVyKCk7CisgICAgICAgIGJvb2xlYW4gdHJ1ZUZhbHNlW10gPSBuZXcgYm9vbGVhbltdIHsgdHJ1ZSwgZmFsc2UgfTsKKyAgICAgICAgZm9yIChSZWNvcmQgcmVjb3JkIDogUkVDT1JEUykgeworICAgICAgICAgICAgZm9yIChTb3VyY2VDcmVhdG9yIGYgOiBtQ3JlYXRvcnMpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGJvb2xlYW4gcmVxdWlyZVNvZnR3YXJlIDogdHJ1ZUZhbHNlKSB7CisgICAgICAgICAgICAgICAgICAgIGwucmVxdWlyZVNvZnR3YXJlID0gcmVxdWlyZVNvZnR3YXJlOworICAgICAgICAgICAgICAgICAgICBJbWFnZURlY29kZXIuU291cmNlIHNyYyA9IGYuYXBwbHkocmVjb3JkLnJlc0lkKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChzcmMpOworCisgICAgICAgICAgICAgICAgICAgIEJpdG1hcCBiaXRtYXAgPSBudWxsOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgYml0bWFwID0gSW1hZ2VEZWNvZGVyLmRlY29kZUJpdG1hcChzcmMsIGwpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsKCJGYWlsZWQgd2l0aCBleGNlcHRpb24gIiArIGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYml0bWFwKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UoYml0bWFwLmlzTXV0YWJsZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVTb2Z0d2FyZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Tm90RXF1YWxzKEJpdG1hcC5Db25maWcuSEFSRFdBUkUsIGJpdG1hcC5nZXRDb25maWcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IGJpdG1hcC5nZXRXaWR0aCgpOyArK3gpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IGJpdG1hcC5nZXRIZWlnaHQoKTsgKyt5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2xvciA9IGJpdG1hcC5nZXRQaXhlbCh4LCB5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJwaXhlbCBhdCAoIiArIHggKyAiLCAiICsgeSArICIpIGRvZXMgbm90IG1hdGNoISIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IsIENvbG9yLkJMQUNLKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYml0bWFwLmdldENvbmZpZygpLCBCaXRtYXAuQ29uZmlnLkhBUkRXQVJFKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5pbmVwYXRjaFdpdGhEZW5zaXR5Tm9uZSgpIHsKKyAgICAgICAgVHlwZWRWYWx1ZSB2YWx1ZSA9IG5ldyBUeXBlZFZhbHVlKCk7CisgICAgICAgIElucHV0U3RyZWFtIGlzID0gbVJlcy5vcGVuUmF3UmVzb3VyY2UoUi5kcmF3YWJsZS5uaW5lcGF0Y2hfbm9kcGksIHZhbHVlKTsKKyAgICAgICAgLy8gVGhpcyBkb2VzIG5vdCBjYWxsIEltYWdlRGVjb2RlciBkaXJlY3RseSBiZWNhdXNlIHRoaXMgZW50cnkgcG9pbnQgaXMgbm90IHB1YmxpYy4KKyAgICAgICAgRHJhd2FibGUgZHIgPSBEcmF3YWJsZS5jcmVhdGVGcm9tUmVzb3VyY2VTdHJlYW0obVJlcywgdmFsdWUsIGlzLCBudWxsLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChkcik7CisgICAgICAgIGFzc2VydEVxdWFscyg1LCBkci5nZXRJbnRyaW5zaWNXaWR0aCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUsIGRyLmdldEludHJpbnNpY0hlaWdodCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0UHJvY2Vzc29yT3ZlcnJpZGVzTmluZXBhdGNoKCkgeworICAgICAgICBjbGFzcyBMaXN0ZW5lciBpbXBsZW1lbnRzIEltYWdlRGVjb2Rlci5PbkhlYWRlckRlY29kZWRMaXN0ZW5lciB7CisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiByZXF1aXJlU29mdHdhcmU7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uSGVhZGVyRGVjb2RlZChJbWFnZURlY29kZXIgZGVjb2RlciwgSW1hZ2VEZWNvZGVyLkltYWdlSW5mbyBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltYWdlRGVjb2Rlci5Tb3VyY2Ugc3JjKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVTb2Z0d2FyZSkgeworICAgICAgICAgICAgICAgICAgICBkZWNvZGVyLnNldEFsbG9jYXRvcihJbWFnZURlY29kZXIuQUxMT0NBVE9SX1NPRlRXQVJFKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVjb2Rlci5zZXRQb3N0UHJvY2Vzc29yKChjKSAtPiBQaXhlbEZvcm1hdC5VTktOT1dOKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgTGlzdGVuZXIgbCA9IG5ldyBMaXN0ZW5lcigpOworICAgICAgICBpbnQgcmVzSWRzW10gPSBuZXcgaW50W10geyBSLmRyYXdhYmxlLm5pbmVwYXRjaF8wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLmRyYXdhYmxlLm5pbmVwYXRjaF8xIH07CisgICAgICAgIGJvb2xlYW4gdHJ1ZUZhbHNlW10gPSBuZXcgYm9vbGVhbltdIHsgdHJ1ZSwgZmFsc2UgfTsKKyAgICAgICAgZm9yIChpbnQgcmVzSWQgOiByZXNJZHMpIHsKKyAgICAgICAgICAgIGZvciAoU291cmNlQ3JlYXRvciBmIDogbUNyZWF0b3JzKSB7CisgICAgICAgICAgICAgICAgZm9yIChib29sZWFuIHJlcXVpcmVTb2Z0d2FyZSA6IHRydWVGYWxzZSkgeworICAgICAgICAgICAgICAgICAgICBsLnJlcXVpcmVTb2Z0d2FyZSA9IHJlcXVpcmVTb2Z0d2FyZTsKKyAgICAgICAgICAgICAgICAgICAgSW1hZ2VEZWNvZGVyLlNvdXJjZSBzcmMgPSBmLmFwcGx5KHJlc0lkKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIERyYXdhYmxlIGRyYXdhYmxlID0gSW1hZ2VEZWNvZGVyLmRlY29kZURyYXdhYmxlKHNyYywgbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShkcmF3YWJsZSBpbnN0YW5jZW9mIE5pbmVQYXRjaERyYXdhYmxlKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgc3JjID0gZi5hcHBseShyZXNJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBCaXRtYXAgYm0gPSBJbWFnZURlY29kZXIuZGVjb2RlQml0bWFwKHNyYywgbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnROdWxsKGJtLmdldE5pbmVQYXRjaENodW5rKCkpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsKCJGYWlsZWQgd2l0aCBleGNlcHRpb24gIiArIGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdFByb2Nlc3NvckFuZE1hZGVPcGFxdWUoKSB7CisgICAgICAgIGNsYXNzIExpc3RlbmVyIGltcGxlbWVudHMgSW1hZ2VEZWNvZGVyLk9uSGVhZGVyRGVjb2RlZExpc3RlbmVyIHsKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHJlcXVpcmVTb2Z0d2FyZTsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25IZWFkZXJEZWNvZGVkKEltYWdlRGVjb2RlciBkZWNvZGVyLCBJbWFnZURlY29kZXIuSW1hZ2VJbmZvIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1hZ2VEZWNvZGVyLlNvdXJjZSBzcmMpIHsKKyAgICAgICAgICAgICAgICBpZiAocmVxdWlyZVNvZnR3YXJlKSB7CisgICAgICAgICAgICAgICAgICAgIGRlY29kZXIuc2V0QWxsb2NhdG9yKEltYWdlRGVjb2Rlci5BTExPQ0FUT1JfU09GVFdBUkUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZWNvZGVyLnNldFBvc3RQcm9jZXNzb3IoKGMpIC0+IFBpeGVsRm9ybWF0Lk9QQVFVRSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIExpc3RlbmVyIGwgPSBuZXcgTGlzdGVuZXIoKTsKKyAgICAgICAgYm9vbGVhbiB0cnVlRmFsc2VbXSA9IG5ldyBib29sZWFuW10geyB0cnVlLCBmYWxzZSB9OworICAgICAgICBpbnQgcmVzSWRzW10gPSBuZXcgaW50W10geyBSLmRyYXdhYmxlLmFscGhhLCBSLmRyYXdhYmxlLmdvb2dsZV9sb2dvXzIgfTsKKyAgICAgICAgZm9yIChpbnQgcmVzSWQgOiByZXNJZHMpIHsKKyAgICAgICAgICAgIGZvciAoU291cmNlQ3JlYXRvciBmIDogbUNyZWF0b3JzKSB7CisgICAgICAgICAgICAgICAgZm9yIChib29sZWFuIHJlcXVpcmVTb2Z0d2FyZSA6IHRydWVGYWxzZSkgeworICAgICAgICAgICAgICAgICAgICBsLnJlcXVpcmVTb2Z0d2FyZSA9IHJlcXVpcmVTb2Z0d2FyZTsKKyAgICAgICAgICAgICAgICAgICAgSW1hZ2VEZWNvZGVyLlNvdXJjZSBzcmMgPSBmLmFwcGx5KHJlc0lkKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEJpdG1hcCBibSA9IEltYWdlRGVjb2Rlci5kZWNvZGVCaXRtYXAoc3JjLCBsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKGJtLmhhc0FscGhhKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UoYm0uaXNQcmVtdWx0aXBsaWVkKCkpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsKCJGYWlsZWQgd2l0aCBleGNlcHRpb24gIiArIGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdFByb2Nlc3NvckFuZEFkZGVkVHJhbnNwYXJlbmN5KCkgeworICAgICAgICBjbGFzcyBMaXN0ZW5lciBpbXBsZW1lbnRzIEltYWdlRGVjb2Rlci5PbkhlYWRlckRlY29kZWRMaXN0ZW5lciB7CisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiByZXF1aXJlU29mdHdhcmU7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uSGVhZGVyRGVjb2RlZChJbWFnZURlY29kZXIgZGVjb2RlciwgSW1hZ2VEZWNvZGVyLkltYWdlSW5mbyBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltYWdlRGVjb2Rlci5Tb3VyY2Ugc3JjKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVTb2Z0d2FyZSkgeworICAgICAgICAgICAgICAgICAgICBkZWNvZGVyLnNldEFsbG9jYXRvcihJbWFnZURlY29kZXIuQUxMT0NBVE9SX1NPRlRXQVJFKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVjb2Rlci5zZXRQb3N0UHJvY2Vzc29yKChjKSAtPiBQaXhlbEZvcm1hdC5UUkFOU0xVQ0VOVCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIExpc3RlbmVyIGwgPSBuZXcgTGlzdGVuZXIoKTsKKyAgICAgICAgYm9vbGVhbiB0cnVlRmFsc2VbXSA9IG5ldyBib29sZWFuW10geyB0cnVlLCBmYWxzZSB9OworICAgICAgICBmb3IgKFJlY29yZCByZWNvcmQgOiBSRUNPUkRTKSB7CisgICAgICAgICAgICBmb3IgKFNvdXJjZUNyZWF0b3IgZiA6IG1DcmVhdG9ycykgeworICAgICAgICAgICAgICAgIGZvciAoYm9vbGVhbiByZXF1aXJlU29mdHdhcmUgOiB0cnVlRmFsc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgbC5yZXF1aXJlU29mdHdhcmUgPSByZXF1aXJlU29mdHdhcmU7CisgICAgICAgICAgICAgICAgICAgIEltYWdlRGVjb2Rlci5Tb3VyY2Ugc3JjID0gZi5hcHBseShyZWNvcmQucmVzSWQpOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgQml0bWFwIGJtID0gSW1hZ2VEZWNvZGVyLmRlY29kZUJpdG1hcChzcmMsIGwpOworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShibS5oYXNBbHBoYSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoYm0uaXNQcmVtdWx0aXBsaWVkKCkpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsKCJGYWlsZWQgd2l0aCBleGNlcHRpb24gIiArIGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQ9SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0UHJvY2Vzc29yVFJBTlNQQVJFTlQoKSB7CisgICAgICAgIEltYWdlRGVjb2Rlci5Tb3VyY2Ugc3JjID0gbUNyZWF0b3JzWzBdLmFwcGx5KFIuZHJhd2FibGUucG5nX3Rlc3QpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW1hZ2VEZWNvZGVyLmRlY29kZURyYXdhYmxlKHNyYywgKGRlY29kZXIsIGluZm8sIHMpIC0+IHsKKyAgICAgICAgICAgICAgICBkZWNvZGVyLnNldFBvc3RQcm9jZXNzb3IoKGMpIC0+IFBpeGVsRm9ybWF0LlRSQU5TUEFSRU5UKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJGYWlsZWQgd2l0aCBleGNlcHRpb24gIiArIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQ9SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0UHJvY2Vzc29ySW52YWxpZFJldHVybigpIHsKKyAgICAgICAgSW1hZ2VEZWNvZGVyLlNvdXJjZSBzcmMgPSBtQ3JlYXRvcnNbMF0uYXBwbHkoUkVDT1JEU1swXS5yZXNJZCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJbWFnZURlY29kZXIuZGVjb2RlRHJhd2FibGUoc3JjLCAoZGVjb2RlciwgaW5mbywgcykgLT4geworICAgICAgICAgICAgICAgIGRlY29kZXIuc2V0UG9zdFByb2Nlc3NvcigoYykgLT4gNDIpOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkZhaWxlZCB3aXRoIGV4Y2VwdGlvbiAiICsgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZD1JbGxlZ2FsU3RhdGVFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdFBvc3RQcm9jZXNzb3JBbmRVbnByZW11bCgpIHsKKyAgICAgICAgSW1hZ2VEZWNvZGVyLlNvdXJjZSBzcmMgPSBtQ3JlYXRvcnNbMF0uYXBwbHkoUkVDT1JEU1swXS5yZXNJZCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJbWFnZURlY29kZXIuZGVjb2RlRHJhd2FibGUoc3JjLCAoZGVjb2RlciwgaW5mbywgcykgLT4geworICAgICAgICAgICAgICAgIGRlY29kZXIuc2V0VW5wcmVtdWx0aXBsaWVkUmVxdWlyZWQodHJ1ZSk7CisgICAgICAgICAgICAgICAgZGVjb2Rlci5zZXRQb3N0UHJvY2Vzc29yKChjKSAtPiBQaXhlbEZvcm1hdC5VTktOT1dOKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJGYWlsZWQgd2l0aCBleGNlcHRpb24gIiArIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdFByb2Nlc3NvckFuZFNjYWxlKCkgeworICAgICAgICBjbGFzcyBQb3N0UHJvY2Vzc29yV2l0aFNpemUgaW1wbGVtZW50cyBQb3N0UHJvY2Vzc29yIHsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgd2lkdGg7CisgICAgICAgICAgICBwdWJsaWMgaW50IGhlaWdodDsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGludCBvblBvc3RQcm9jZXNzKENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHModGhpcy53aWR0aCwgIHdpZHRoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHModGhpcy5oZWlnaHQsIGhlaWdodCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFBpeGVsRm9ybWF0LlVOS05PV047CisgICAgICAgICAgICB9OworICAgICAgICB9OworICAgICAgICBmaW5hbCBQb3N0UHJvY2Vzc29yV2l0aFNpemUgcHAgPSBuZXcgUG9zdFByb2Nlc3NvcldpdGhTaXplKCk7CisgICAgICAgIGZvciAoUmVjb3JkIHJlY29yZCA6IFJFQ09SRFMpIHsKKyAgICAgICAgICAgIHBwLndpZHRoID0gIHJlY29yZC53aWR0aCAgLyAyOworICAgICAgICAgICAgcHAuaGVpZ2h0ID0gcmVjb3JkLmhlaWdodCAvIDI7CisgICAgICAgICAgICBmb3IgKFNvdXJjZUNyZWF0b3IgZiA6IG1DcmVhdG9ycykgeworICAgICAgICAgICAgICAgIEltYWdlRGVjb2Rlci5Tb3VyY2Ugc3JjID0gZi5hcHBseShyZWNvcmQucmVzSWQpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIERyYXdhYmxlIGRyYXdhYmxlID0gSW1hZ2VEZWNvZGVyLmRlY29kZURyYXdhYmxlKHNyYywgKGRlY29kZXIsIGluZm8sIHMpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXIuc2V0VGFyZ2V0U2l6ZShwcC53aWR0aCwgcHAuaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXIuc2V0UG9zdFByb2Nlc3NvcihwcCk7CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMocHAud2lkdGgsICBkcmF3YWJsZS5nZXRJbnRyaW5zaWNXaWR0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHBwLmhlaWdodCwgZHJhd2FibGUuZ2V0SW50cmluc2ljSGVpZ2h0KCkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgZmFpbCgiRmFpbGVkICIgKyBnZXRBc1Jlc291cmNlVXJpKHJlY29yZC5yZXNJZCkgKyAiIHdpdGggZXhjZXB0aW9uICIgKyBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tTYW1wbGVTaXplKFN0cmluZyBuYW1lLCBpbnQgb3JpZ2luYWxEaW1lbnNpb24sIGludCBzYW1wbGVTaXplLCBpbnQgcmVzdWx0KSB7CisgICAgICAgIGlmIChvcmlnaW5hbERpbWVuc2lvbiAlIHNhbXBsZVNpemUgPT0gMCkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJNaXNtYXRjaCBmb3IgIiArIG5hbWUgKyAiOiAiICsgb3JpZ2luYWxEaW1lbnNpb24gKyAiIC8gIiArIHNhbXBsZVNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICArICIgIT0gIiArIHJlc3VsdCwgb3JpZ2luYWxEaW1lbnNpb24gLyBzYW1wbGVTaXplLCByZXN1bHQpOworICAgICAgICB9IGVsc2UgaWYgKG9yaWdpbmFsRGltZW5zaW9uIDw9IHNhbXBsZVNpemUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCByZXN1bHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gUm91bmRpbmcgbWF5IHJlc3VsdCBpbiBkaWZmZXJlbmNlcy4KKyAgICAgICAgICAgIGludCBzaXplID0gcmVzdWx0ICogc2FtcGxlU2l6ZTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlJvdW5kaW5nIG1pc21hdGNoIGZvciAiICsgbmFtZSArICI6ICIgKyBvcmlnaW5hbERpbWVuc2lvbiArICIgLyAiCisgICAgICAgICAgICAgICAgICAgICAgICsgc2FtcGxlU2l6ZSArICIgPSAiICsgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICBNYXRoLmFicyhzaXplIC0gb3JpZ2luYWxEaW1lbnNpb24pIDwgc2FtcGxlU2l6ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTYW1wbGVTaXplKCkgeworICAgICAgICBmb3IgKFJlY29yZCByZWNvcmQgOiBSRUNPUkRTKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IGdldEFzUmVzb3VyY2VVcmkocmVjb3JkLnJlc0lkKS50b1N0cmluZygpOworICAgICAgICAgICAgZm9yIChpbnQgc2FtcGxlU2l6ZSA6IG5ldyBpbnRbXSB7IDIsIDMsIDQsIDgsIDMyIH0pIHsKKyAgICAgICAgICAgICAgICBJbWFnZURlY29kZXIuU291cmNlIHNyYyA9IG1DcmVhdG9yc1swXS5hcHBseShyZWNvcmQucmVzSWQpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIERyYXdhYmxlIGRyID0gSW1hZ2VEZWNvZGVyLmRlY29kZURyYXdhYmxlKHNyYywgKGRlY29kZXIsIGluZm8sIHMpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXIuc2V0VGFyZ2V0U2FtcGxlU2l6ZShzYW1wbGVTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tTYW1wbGVTaXplKG5hbWUsIHJlY29yZC53aWR0aCwgc2FtcGxlU2l6ZSwgZHIuZ2V0SW50cmluc2ljV2lkdGgoKSk7CisgICAgICAgICAgICAgICAgICAgIGNoZWNrU2FtcGxlU2l6ZShuYW1lLCByZWNvcmQuaGVpZ2h0LCBzYW1wbGVTaXplLCBkci5nZXRJbnRyaW5zaWNIZWlnaHQoKSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBmYWlsKCJGYWlsZWQgIiArIG5hbWUgKyAiIHdpdGggZXhjZXB0aW9uICIgKyBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGludGVyZmFjZSBTYW1wbGVTaXplU3VwcGxpZXIgZXh0ZW5kcyBUb0ludEZ1bmN0aW9uPFNpemU+IHt9OworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGFyZ2VTYW1wbGVTaXplKCkgeworICAgICAgICBmb3IgKFJlY29yZCByZWNvcmQgOiBSRUNPUkRTKSB7CisgICAgICAgICAgICBmb3IgKFNvdXJjZUNyZWF0b3IgZiA6IG1DcmVhdG9ycykgeworICAgICAgICAgICAgICAgIGZvciAoU2FtcGxlU2l6ZVN1cHBsaWVyIHN1cHBseVNhbXBsZVNpemUgOiBuZXcgU2FtcGxlU2l6ZVN1cHBsaWVyW10geworICAgICAgICAgICAgICAgICAgICAgICAgKHNpemUpIC0+IHNpemUuZ2V0V2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChzaXplKSAtPiBzaXplLmdldFdpZHRoKCkgKyA1LAorICAgICAgICAgICAgICAgICAgICAgICAgKHNpemUpIC0+IHNpemUuZ2V0V2lkdGgoKSAqIDUsCisgICAgICAgICAgICAgICAgfSkgeworICAgICAgICAgICAgICAgICAgICBJbWFnZURlY29kZXIuU291cmNlIHNyYyA9IGYuYXBwbHkocmVjb3JkLnJlc0lkKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIERyYXdhYmxlIGRyID0gSW1hZ2VEZWNvZGVyLmRlY29kZURyYXdhYmxlKHNyYywgKGRlY29kZXIsIGluZm8sIHMpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2FtcGxlU2l6ZSA9IHN1cHBseVNhbXBsZVNpemUuYXBwbHlBc0ludChpbmZvLmdldFNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2Rlci5zZXRUYXJnZXRTYW1wbGVTaXplKHNhbXBsZVNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZHIuZ2V0SW50cmluc2ljV2lkdGgoKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwoIkZhaWxlZCB3aXRoIGV4Y2VwdGlvbiAiICsgZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNpemVUcmFuc3BhcmVuY3koKSB7CisgICAgICAgIEltYWdlRGVjb2Rlci5Tb3VyY2Ugc3JjID0gbUNyZWF0b3JzWzBdLmFwcGx5KFIuZHJhd2FibGUuYW5pbWF0ZWQpOworICAgICAgICBEcmF3YWJsZSBkciA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBkciA9IEltYWdlRGVjb2Rlci5kZWNvZGVEcmF3YWJsZShzcmMsIChkZWNvZGVyLCBpbmZvLCBzKSAtPiB7CisgICAgICAgICAgICAgICAgU2l6ZSBzaXplID0gaW5mby5nZXRTaXplKCk7CisgICAgICAgICAgICAgICAgZGVjb2Rlci5zZXRUYXJnZXRTaXplKHNpemUuZ2V0V2lkdGgoKSAtIDUsIHNpemUuZ2V0SGVpZ2h0KCkgLSA1KTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJGYWlsZWQgd2l0aCBleGNlcHRpb24gIiArIGUpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgaW50IHdpZHRoID0gZHIuZ2V0SW50cmluc2ljV2lkdGgoKTsKKyAgICAgICAgZmluYWwgaW50IGhlaWdodCA9IGRyLmdldEludHJpbnNpY0hlaWdodCgpOworCisgICAgICAgIC8vIERyYXcgdG8gYSBmdWxseSB0cmFuc3BhcmVudCBCaXRtYXAuIFBpeGVscyB0aGF0IGFyZSB0cmFuc3BhcmVudCBpbiB0aGUgaW1hZ2Ugd2lsbCBiZQorICAgICAgICAvLyB0cmFuc3BhcmVudC4KKyAgICAgICAgQml0bWFwIG5vcm1hbCA9IEJpdG1hcC5jcmVhdGVCaXRtYXAod2lkdGgsIGhlaWdodCwgQml0bWFwLkNvbmZpZy5BUkdCXzg4ODgpOworICAgICAgICB7CisgICAgICAgICAgICBDYW52YXMgY2FudmFzID0gbmV3IENhbnZhcyhub3JtYWwpOworICAgICAgICAgICAgZHIuZHJhdyhjYW52YXMpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRHJhdyB0byBhIEJMVUUgQml0bWFwLiBBbnkgcGl4ZWxzIHRoYXQgYXJlIHRyYW5zcGFyZW50IGluIHRoZSBpbWFnZSByZW1haW4gQkxVRS4KKyAgICAgICAgQml0bWFwIGJsZW5kZWQgPSBCaXRtYXAuY3JlYXRlQml0bWFwKHdpZHRoLCBoZWlnaHQsIEJpdG1hcC5Db25maWcuQVJHQl84ODg4KTsKKyAgICAgICAgeworICAgICAgICAgICAgQ2FudmFzIGNhbnZhcyA9IG5ldyBDYW52YXMoYmxlbmRlZCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd0NvbG9yKENvbG9yLkJMVUUpOworICAgICAgICAgICAgZHIuZHJhdyhjYW52YXMpOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBoYXNUcmFuc3BhcmVuY3kgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3aWR0aDsgKytpKSB7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGhlaWdodDsgKytqKSB7CisgICAgICAgICAgICAgICAgaW50IG5vcm1hbENvbG9yID0gbm9ybWFsLmdldFBpeGVsKGksIGopOworICAgICAgICAgICAgICAgIGludCBibGVuZGVkQ29sb3IgPSBibGVuZGVkLmdldFBpeGVsKGksIGopOworICAgICAgICAgICAgICAgIGlmIChub3JtYWxDb2xvciA9PSBDb2xvci5UUkFOU1BBUkVOVCkgeworICAgICAgICAgICAgICAgICAgICBoYXNUcmFuc3BhcmVuY3kgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoQ29sb3IuQkxVRSwgYmxlbmRlZENvbG9yKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKENvbG9yLmFscGhhKG5vcm1hbENvbG9yKSA9PSAyNTUpIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG5vcm1hbENvbG9yLCBibGVuZGVkQ29sb3IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBpbWFnZSBoYXMgdHJhbnNwYXJlbmN5LiBPdGhlcndpc2UgdGhlIHRlc3QgaXMgbm90IHVzZWZ1bC4KKyAgICAgICAgYXNzZXJ0VHJ1ZShoYXNUcmFuc3BhcmVuY3kpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldE9uUGFydGlhbEltYWdlTGlzdGVuZXIoKSB7CisgICAgICAgIE9uUGFydGlhbEltYWdlTGlzdGVuZXJbXSBsaXN0ZW5lcnMgPSBuZXcgT25QYXJ0aWFsSW1hZ2VMaXN0ZW5lcltdIHsKKyAgICAgICAgICAgICAgICAoZSkgLT4gdHJ1ZSwKKyAgICAgICAgICAgICAgICAoZSkgLT4gZmFsc2UsCisgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgfTsKKworICAgICAgICBmaW5hbCBpbnQgcmVzSWQgPSBSRUNPUkRTWzBdLnJlc0lkOworICAgICAgICBJbWFnZURlY29kZXIuU291cmNlIHNyYyA9IG1DcmVhdG9yc1swXS5hcHBseShyZXNJZCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJbWFnZURlY29kZXIuZGVjb2RlRHJhd2FibGUoc3JjLCAoZGVjb2RlciwgaW5mbywgcykgLT4geworICAgICAgICAgICAgICAgIGFzc2VydE51bGwoZGVjb2Rlci5nZXRPblBhcnRpYWxJbWFnZUxpc3RlbmVyKCkpOworCisgICAgICAgICAgICAgICAgZm9yIChPblBhcnRpYWxJbWFnZUxpc3RlbmVyIGwgOiBsaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVjb2Rlci5zZXRPblBhcnRpYWxJbWFnZUxpc3RlbmVyKGwpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRTYW1lKGwsIGRlY29kZXIuZ2V0T25QYXJ0aWFsSW1hZ2VMaXN0ZW5lcigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRmFpbGVkICIgKyBnZXRBc1Jlc291cmNlVXJpKHJlc0lkKSArICIgd2l0aCBleGNlcHRpb24gIiArIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RWFybHlJbmNvbXBsZXRlKCkgeworICAgICAgICBieXRlW10gYnl0ZXMgPSBnZXRBc0J5dGVBcnJheShSLnJhdy5iYXNpNmExNik7CisgICAgICAgIC8vIFRoaXMgaXMgdG9vIGVhcmx5IHRvIGNyZWF0ZSBhIHBhcnRpYWwgaW1hZ2UsIHNvIHdlIHRocm93IHRoZSBFeGNlcHRpb24KKyAgICAgICAgLy8gd2l0aG91dCBjYWxsaW5nIHRoZSBsaXN0ZW5lci4KKyAgICAgICAgaW50IHRydW5jYXRlZExlbmd0aCA9IDQ5OworICAgICAgICBJbWFnZURlY29kZXIuU291cmNlIHNyYyA9IEltYWdlRGVjb2Rlci5jcmVhdGVTb3VyY2UoCisgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlci53cmFwKGJ5dGVzLCAwLCB0cnVuY2F0ZWRMZW5ndGgpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEltYWdlRGVjb2Rlci5kZWNvZGVEcmF3YWJsZShzcmMsIChkZWNvZGVyLCBpbmZvLCBzKSAtPiB7CisgICAgICAgICAgICAgICAgZGVjb2Rlci5zZXRPblBhcnRpYWxJbWFnZUxpc3RlbmVyKChlKSAtPiB7CisgICAgICAgICAgICAgICAgICAgIGZhaWwoIk5vIG5lZWQgdG8gY2FsbCBsaXN0ZW5lcjsgbm8gcGFydGlhbCBpbWFnZSB0byBkaXNwbGF5ISIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgRXhjZXB0aW9uOiAiICsgZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9IGNhdGNoIChEZWNvZGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKERlY29kZUV4Y2VwdGlvbi5TT1VSQ0VfSU5DT01QTEVURSwgZS5nZXRFcnJvcigpKTsKKyAgICAgICAgICAgIGFzc2VydFNhbWUoc3JjLCBlLmdldFNvdXJjZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICBmYWlsKCJUaHJldyBzb21lIG90aGVyIGV4Y2VwdGlvbjogIiArIGlvZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIEV4Y2VwdGlvblN0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBJbnB1dFN0cmVhbSBtSW5wdXRTdHJlYW07CisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1FeGNlcHRpb25Qb3NpdGlvbjsKKyAgICAgICAgaW50IG1Qb3NpdGlvbjsKKworICAgICAgICBFeGNlcHRpb25TdHJlYW0oaW50IHJlc0lkLCBpbnQgZXhjZXB0aW9uUG9zaXRpb24pIHsKKyAgICAgICAgICAgIG1JbnB1dFN0cmVhbSA9IG1SZXMub3BlblJhd1Jlc291cmNlKHJlc0lkKTsKKyAgICAgICAgICAgIG1FeGNlcHRpb25Qb3NpdGlvbiA9IGV4Y2VwdGlvblBvc2l0aW9uOworICAgICAgICAgICAgbVBvc2l0aW9uID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaWYgKG1Qb3NpdGlvbiA+PSBtRXhjZXB0aW9uUG9zaXRpb24pIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IHZhbHVlID0gbUlucHV0U3RyZWFtLnJlYWQoKTsKKyAgICAgICAgICAgIG1Qb3NpdGlvbisrOworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChtUG9zaXRpb24gKyBsZW4gPD0gbUV4Y2VwdGlvblBvc2l0aW9uKSB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGJ5dGVzUmVhZCA9IG1JbnB1dFN0cmVhbS5yZWFkKGIsIG9mZiwgbGVuKTsKKyAgICAgICAgICAgICAgICBtUG9zaXRpb24gKz0gYnl0ZXNSZWFkOworICAgICAgICAgICAgICAgIHJldHVybiBieXRlc1JlYWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxlbiA9IG1FeGNlcHRpb25Qb3NpdGlvbiAtIG1Qb3NpdGlvbjsKKyAgICAgICAgICAgIG1Qb3NpdGlvbiArPSBtSW5wdXRTdHJlYW0ucmVhZChiLCBvZmYsIGxlbik7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEV4Y2VwdGlvbkluU3RyZWFtKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIElucHV0U3RyZWFtIGlzID0gbmV3IEV4Y2VwdGlvblN0cmVhbShSLmRyYXdhYmxlLmFuaW1hdGVkLCAyNzU3MCk7CisgICAgICAgIEltYWdlRGVjb2Rlci5Tb3VyY2Ugc3JjID0gSW1hZ2VEZWNvZGVyLmNyZWF0ZVNvdXJjZShtUmVzLCBpcywgQml0bWFwLkRFTlNJVFlfTk9ORSk7CisgICAgICAgIERyYXdhYmxlIGRyID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGRyID0gSW1hZ2VEZWNvZGVyLmRlY29kZURyYXdhYmxlKHNyYyk7CisgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCB0byB0aHJvdyBhbiBleGNlcHRpb24hIik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpb2UgaW5zdGFuY2VvZiBEZWNvZGVFeGNlcHRpb24pOworICAgICAgICAgICAgRGVjb2RlRXhjZXB0aW9uIGRlY29kZUV4Y2VwdGlvbiA9IChEZWNvZGVFeGNlcHRpb24pIGlvZTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhEZWNvZGVFeGNlcHRpb24uU09VUkNFX0VYQ0VQVElPTiwgZGVjb2RlRXhjZXB0aW9uLmdldEVycm9yKCkpOworICAgICAgICAgICAgVGhyb3dhYmxlIHRocm93YWJsZSA9IGRlY29kZUV4Y2VwdGlvbi5nZXRDYXVzZSgpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCh0aHJvd2FibGUpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0aHJvd2FibGUgaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0TnVsbChkcik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25QYXJ0aWFsSW1hZ2UoKSB7CisgICAgICAgIGNsYXNzIFBhcnRpYWxJbWFnZUNhbGxiYWNrIGltcGxlbWVudHMgT25QYXJ0aWFsSW1hZ2VMaXN0ZW5lciB7CisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiB3YXNDYWxsZWQ7CisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiByZXR1cm5EcmF3YWJsZTsKKyAgICAgICAgICAgIHB1YmxpYyBJbWFnZURlY29kZXIuU291cmNlIHNvdXJjZTsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gb25QYXJ0aWFsSW1hZ2UoRGVjb2RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB3YXNDYWxsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhEZWNvZGVFeGNlcHRpb24uU09VUkNFX0lOQ09NUExFVEUsIGUuZ2V0RXJyb3IoKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0U2FtZShzb3VyY2UsIGUuZ2V0U291cmNlKCkpOworICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5EcmF3YWJsZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgZmluYWwgUGFydGlhbEltYWdlQ2FsbGJhY2sgY2FsbGJhY2sgPSBuZXcgUGFydGlhbEltYWdlQ2FsbGJhY2soKTsKKyAgICAgICAgYm9vbGVhbiBhYm9ydERlY29kZVtdID0gbmV3IGJvb2xlYW5bXSB7IHRydWUsIGZhbHNlIH07CisgICAgICAgIGZvciAoUmVjb3JkIHJlY29yZCA6IFJFQ09SRFMpIHsKKyAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IGdldEFzQnl0ZUFycmF5KHJlY29yZC5yZXNJZCk7CisgICAgICAgICAgICBpbnQgdHJ1bmNhdGVkTGVuZ3RoID0gYnl0ZXMubGVuZ3RoIC8gMjsKKyAgICAgICAgICAgIGlmIChyZWNvcmQubWltZVR5cGUuZXF1YWxzKCJpbWFnZS94LWljbyIpCisgICAgICAgICAgICAgICAgICAgIHx8IHJlY29yZC5taW1lVHlwZS5lcXVhbHMoImltYWdlL3gtYWRvYmUtZG5nIikpIHsKKyAgICAgICAgICAgICAgICAvLyBGSVhNRSAoc2Nyb2dnbyk6IFNvbWUgY29kZWNzIGN1cnJlbnRseSBkbyBub3Qgc3VwcG9ydCBpbmNvbXBsZXRlIGltYWdlcy4KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoYm9vbGVhbiBhYm9ydCA6IGFib3J0RGVjb2RlKSB7CisgICAgICAgICAgICAgICAgSW1hZ2VEZWNvZGVyLlNvdXJjZSBzcmMgPSBJbWFnZURlY29kZXIuY3JlYXRlU291cmNlKAorICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlci53cmFwKGJ5dGVzLCAwLCB0cnVuY2F0ZWRMZW5ndGgpKTsKKyAgICAgICAgICAgICAgICBjYWxsYmFjay53YXNDYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBjYWxsYmFjay5yZXR1cm5EcmF3YWJsZSA9ICFhYm9ydDsKKyAgICAgICAgICAgICAgICBjYWxsYmFjay5zb3VyY2UgPSBzcmM7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgRHJhd2FibGUgZHJhd2FibGUgPSBJbWFnZURlY29kZXIuZGVjb2RlRHJhd2FibGUoc3JjLCAoZGVjb2RlciwgaW5mbywgcykgLT4geworICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2Rlci5zZXRPblBhcnRpYWxJbWFnZUxpc3RlbmVyKGNhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKGFib3J0KTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChkcmF3YWJsZSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZWNvcmQud2lkdGgsICBkcmF3YWJsZS5nZXRJbnRyaW5zaWNXaWR0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlY29yZC5oZWlnaHQsIGRyYXdhYmxlLmdldEludHJpbnNpY0hlaWdodCgpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoYWJvcnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGNhbGxiYWNrLndhc0NhbGxlZCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIG51bGwgbGlzdGVuZXIgYmVoYXZlcyBhcyBpZiBvblBhcnRpYWxJbWFnZSByZXR1cm5lZCBmYWxzZS4KKyAgICAgICAgICAgIEltYWdlRGVjb2Rlci5Tb3VyY2Ugc3JjID0gSW1hZ2VEZWNvZGVyLmNyZWF0ZVNvdXJjZSgKKyAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlci53cmFwKGJ5dGVzLCAwLCB0cnVuY2F0ZWRMZW5ndGgpKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgSW1hZ2VEZWNvZGVyLmRlY29kZURyYXdhYmxlKHNyYyk7CisgICAgICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbiEiKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKERlY29kZUV4Y2VwdGlvbiBpbmNvbXBsZXRlKSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgY29ycmVjdCBiZWhhdmlvci4KKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJGYWlsZWQgd2l0aCBleGNlcHRpb24gIiArIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29ycnVwdEV4Y2VwdGlvbigpIHsKKyAgICAgICAgY2xhc3MgUGFydGlhbEltYWdlQ2FsbGJhY2sgaW1wbGVtZW50cyBPblBhcnRpYWxJbWFnZUxpc3RlbmVyIHsKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHdhc0NhbGxlZCA9IGZhbHNlOworICAgICAgICAgICAgcHVibGljIEltYWdlRGVjb2Rlci5Tb3VyY2Ugc291cmNlOworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBvblBhcnRpYWxJbWFnZShEZWNvZGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHdhc0NhbGxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKERlY29kZUV4Y2VwdGlvbi5TT1VSQ0VfTUFMRk9STUVEX0RBVEEsIGUuZ2V0RXJyb3IoKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0U2FtZShzb3VyY2UsIGUuZ2V0U291cmNlKCkpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBmaW5hbCBQYXJ0aWFsSW1hZ2VDYWxsYmFjayBjYWxsYmFjayA9IG5ldyBQYXJ0aWFsSW1hZ2VDYWxsYmFjaygpOworICAgICAgICBieXRlW10gYnl0ZXMgPSBnZXRBc0J5dGVBcnJheShSLmRyYXdhYmxlLnBuZ190ZXN0KTsKKyAgICAgICAgLy8gVGhlIGZvdXIgYnl0ZXMgc3RhcnRpbmcgd2l0aCBieXRlIDQwLDAwMCByZXByZXNlbnQgdGhlIENSQy4gQ2hhbmdpbmcKKyAgICAgICAgLy8gdGhlbSB3aWxsIGNhdXNlIHRoZSBkZWNvZGUgdG8gZmFpbC4KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyArK2kpIHsKKyAgICAgICAgICAgIGJ5dGVzWzQwMDAwICsgaV0gPSAnWCc7CisgICAgICAgIH0KKyAgICAgICAgSW1hZ2VEZWNvZGVyLlNvdXJjZSBzcmMgPSBJbWFnZURlY29kZXIuY3JlYXRlU291cmNlKEJ5dGVCdWZmZXIud3JhcChieXRlcykpOworICAgICAgICBjYWxsYmFjay53YXNDYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgY2FsbGJhY2suc291cmNlID0gc3JjOworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW1hZ2VEZWNvZGVyLmRlY29kZURyYXdhYmxlKHNyYywgKGRlY29kZXIsIGluZm8sIHMpIC0+IHsKKyAgICAgICAgICAgICAgICBkZWNvZGVyLnNldE9uUGFydGlhbEltYWdlTGlzdGVuZXIoY2FsbGJhY2spOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkZhaWxlZCB3aXRoIGV4Y2VwdGlvbiAiICsgZSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZShjYWxsYmFjay53YXNDYWxsZWQpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIER1bW15RXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7fTsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgIHRlc3RQYXJ0aWFsSW1hZ2VUaHJvd0V4Y2VwdGlvbigpIHsKKyAgICAgICAgYnl0ZVtdIGJ5dGVzID0gZ2V0QXNCeXRlQXJyYXkoUi5kcmF3YWJsZS5wbmdfdGVzdCk7CisgICAgICAgIEltYWdlRGVjb2Rlci5Tb3VyY2Ugc3JjID0gSW1hZ2VEZWNvZGVyLmNyZWF0ZVNvdXJjZSgKKyAgICAgICAgICAgICAgICBCeXRlQnVmZmVyLndyYXAoYnl0ZXMsIDAsIGJ5dGVzLmxlbmd0aCAvIDIpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEltYWdlRGVjb2Rlci5kZWNvZGVEcmF3YWJsZShzcmMsIChkZWNvZGVyLCBpbmZvLCBzKSAtPiB7CisgICAgICAgICAgICAgICAgZGVjb2Rlci5zZXRPblBhcnRpYWxJbWFnZUxpc3RlbmVyKChlKSAtPiB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEdW1teUV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKER1bW15RXhjZXB0aW9uIGR1bW15KSB7CisgICAgICAgICAgICAvLyBUaGlzIGlzIGNvcnJlY3QuCisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gRHVtbXlFeGNlcHRpb24gLSB0aHJldyAiICsgdCArICIgaW5zdGVhZCIpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TXV0YWJsZSgpIHsKKyAgICAgICAgZmluYWwgaW50IHJlc0lkID0gUkVDT1JEU1swXS5yZXNJZDsKKyAgICAgICAgSW1hZ2VEZWNvZGVyLlNvdXJjZSBzcmMgPSBtQ3JlYXRvcnNbMF0uYXBwbHkocmVzSWQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW1hZ2VEZWNvZGVyLmRlY29kZURyYXdhYmxlKHNyYywgKGRlY29kZXIsIGluZm8sIHMpIC0+IHsKKyAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShkZWNvZGVyLmlzTXV0YWJsZVJlcXVpcmVkKCkpOworCisgICAgICAgICAgICAgICAgZGVjb2Rlci5zZXRNdXRhYmxlUmVxdWlyZWQodHJ1ZSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShkZWNvZGVyLmlzTXV0YWJsZVJlcXVpcmVkKCkpOworCisgICAgICAgICAgICAgICAgZGVjb2Rlci5zZXRNdXRhYmxlUmVxdWlyZWQoZmFsc2UpOworICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKGRlY29kZXIuaXNNdXRhYmxlUmVxdWlyZWQoKSk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRmFpbGVkICIgKyBnZXRBc1Jlc291cmNlVXJpKHJlc0lkKSArICIgd2l0aCBleGNlcHRpb24gIiArIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXV0YWJsZSgpIHsKKyAgICAgICAgaW50IGFsbG9jYXRvcnNbXSA9IG5ldyBpbnRbXSB7IEltYWdlRGVjb2Rlci5BTExPQ0FUT1JfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltYWdlRGVjb2Rlci5BTExPQ0FUT1JfU09GVFdBUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbWFnZURlY29kZXIuQUxMT0NBVE9SX1NIQVJFRF9NRU1PUlkgfTsKKyAgICAgICAgY2xhc3MgSGVhZGVyTGlzdGVuZXIgaW1wbGVtZW50cyBJbWFnZURlY29kZXIuT25IZWFkZXJEZWNvZGVkTGlzdGVuZXIgeworICAgICAgICAgICAgaW50IGFsbG9jYXRvcjsKKyAgICAgICAgICAgIGJvb2xlYW4gcG9zdFByb2Nlc3M7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uSGVhZGVyRGVjb2RlZChJbWFnZURlY29kZXIgZGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbWFnZURlY29kZXIuSW1hZ2VJbmZvIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1hZ2VEZWNvZGVyLlNvdXJjZSBzcmMpIHsKKyAgICAgICAgICAgICAgICBkZWNvZGVyLnNldE11dGFibGVSZXF1aXJlZCh0cnVlKTsKKyAgICAgICAgICAgICAgICBkZWNvZGVyLnNldEFsbG9jYXRvcihhbGxvY2F0b3IpOworICAgICAgICAgICAgICAgIGlmIChwb3N0UHJvY2VzcykgeworICAgICAgICAgICAgICAgICAgICBkZWNvZGVyLnNldFBvc3RQcm9jZXNzb3IoKGMpIC0+IFBpeGVsRm9ybWF0LlVOS05PV04pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgSGVhZGVyTGlzdGVuZXIgbCA9IG5ldyBIZWFkZXJMaXN0ZW5lcigpOworICAgICAgICBib29sZWFuIHRydWVGYWxzZVtdID0gbmV3IGJvb2xlYW5bXSB7IHRydWUsIGZhbHNlIH07CisgICAgICAgIGZvciAoUmVjb3JkIHJlY29yZCA6IFJFQ09SRFMpIHsKKyAgICAgICAgICAgIGZvciAoU291cmNlQ3JlYXRvciBmIDogbUNyZWF0b3JzKSB7CisgICAgICAgICAgICAgICAgZm9yIChib29sZWFuIHBvc3RQcm9jZXNzIDogdHJ1ZUZhbHNlKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGFsbG9jYXRvciA6IGFsbG9jYXRvcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGwuYWxsb2NhdG9yID0gYWxsb2NhdG9yOworICAgICAgICAgICAgICAgICAgICAgICAgbC5wb3N0UHJvY2VzcyA9IHBvc3RQcm9jZXNzOworCisgICAgICAgICAgICAgICAgICAgICAgICBJbWFnZURlY29kZXIuU291cmNlIHNyYyA9IGYuYXBwbHkocmVjb3JkLnJlc0lkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0bWFwIGJtID0gSW1hZ2VEZWNvZGVyLmRlY29kZUJpdG1hcChzcmMsIGwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoYm0uaXNNdXRhYmxlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydE5vdEVxdWFscyhCaXRtYXAuQ29uZmlnLkhBUkRXQVJFLCBibS5nZXRDb25maWcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbCgiRmFpbGVkIHdpdGggZXhjZXB0aW9uICIgKyBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkPUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXV0YWJsZUhhcmR3YXJlKCkgeworICAgICAgICBJbWFnZURlY29kZXIuU291cmNlIHNyYyA9IG1DcmVhdG9yc1swXS5hcHBseShSRUNPUkRTWzBdLnJlc0lkKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEltYWdlRGVjb2Rlci5kZWNvZGVCaXRtYXAoc3JjLCAoZGVjb2RlciwgaW5mbywgcykgLT4geworICAgICAgICAgICAgICAgIGRlY29kZXIuc2V0TXV0YWJsZVJlcXVpcmVkKHRydWUpOworICAgICAgICAgICAgICAgIGRlY29kZXIuc2V0QWxsb2NhdG9yKEltYWdlRGVjb2Rlci5BTExPQ0FUT1JfSEFSRFdBUkUpOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkZhaWxlZCB3aXRoIGV4Y2VwdGlvbiAiICsgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZD1JbGxlZ2FsU3RhdGVFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdE11dGFibGVEcmF3YWJsZSgpIHsKKyAgICAgICAgSW1hZ2VEZWNvZGVyLlNvdXJjZSBzcmMgPSBtQ3JlYXRvcnNbMF0uYXBwbHkoUkVDT1JEU1swXS5yZXNJZCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJbWFnZURlY29kZXIuZGVjb2RlRHJhd2FibGUoc3JjLCAoZGVjb2RlciwgaW5mbywgcykgLT4geworICAgICAgICAgICAgICAgIGRlY29kZXIuc2V0TXV0YWJsZVJlcXVpcmVkKHRydWUpOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkZhaWxlZCB3aXRoIGV4Y2VwdGlvbiAiICsgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGludGVyZmFjZSBFbXB0eUJ5dGVCdWZmZXJDcmVhdG9yIHsKKyAgICAgICAgcHVibGljIEJ5dGVCdWZmZXIgYXBwbHkoKTsKKyAgICB9OworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlCeXRlQnVmZmVyKCkgeworICAgICAgICBjbGFzcyBEaXJlY3QgaW1wbGVtZW50cyBFbXB0eUJ5dGVCdWZmZXJDcmVhdG9yIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIEJ5dGVCdWZmZXIgYXBwbHkoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3QoMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIGNsYXNzIFdyYXAgaW1wbGVtZW50cyBFbXB0eUJ5dGVCdWZmZXJDcmVhdG9yIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIEJ5dGVCdWZmZXIgYXBwbHkoKSB7CisgICAgICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbMF07CisgICAgICAgICAgICAgICAgcmV0dXJuIEJ5dGVCdWZmZXIud3JhcChieXRlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIGNsYXNzIFJlYWRPbmx5IGltcGxlbWVudHMgRW1wdHlCeXRlQnVmZmVyQ3JlYXRvciB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIGFwcGx5KCkgeworICAgICAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlWzBdOworICAgICAgICAgICAgICAgIHJldHVybiBCeXRlQnVmZmVyLndyYXAoYnl0ZXMpLmFzUmVhZE9ubHlCdWZmZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgRW1wdHlCeXRlQnVmZmVyQ3JlYXRvciBjcmVhdG9yc1tdID0gbmV3IEVtcHR5Qnl0ZUJ1ZmZlckNyZWF0b3JbXSB7CisgICAgICAgICAgICBuZXcgRGlyZWN0KCksIG5ldyBXcmFwKCksIG5ldyBSZWFkT25seSgpIH07CisgICAgICAgIGZvciAoRW1wdHlCeXRlQnVmZmVyQ3JlYXRvciBjcmVhdG9yIDogY3JlYXRvcnMpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgSW1hZ2VEZWNvZGVyLmRlY29kZURyYXdhYmxlKAorICAgICAgICAgICAgICAgICAgICAgICAgSW1hZ2VEZWNvZGVyLmNyZWF0ZVNvdXJjZShjcmVhdG9yLmFwcGx5KCkpKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJUaGlzIHNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24iKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGNvcnJlY3QuCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZD1JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdFplcm9TYW1wbGVTaXplKCkgeworICAgICAgICBJbWFnZURlY29kZXIuU291cmNlIHNyYyA9IG1DcmVhdG9yc1swXS5hcHBseShSLmRyYXdhYmxlLnBuZ190ZXN0KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEltYWdlRGVjb2Rlci5kZWNvZGVEcmF3YWJsZShzcmMsIChkZWNvZGVyLCBpbmZvLCBzKSAtPiBkZWNvZGVyLnNldFRhcmdldFNhbXBsZVNpemUoMCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJGYWlsZWQgd2l0aCBleGNlcHRpb24gIiArIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQ9SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3ROZWdhdGl2ZVNhbXBsZVNpemUoKSB7CisgICAgICAgIEltYWdlRGVjb2Rlci5Tb3VyY2Ugc3JjID0gbUNyZWF0b3JzWzBdLmFwcGx5KFIuZHJhd2FibGUucG5nX3Rlc3QpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW1hZ2VEZWNvZGVyLmRlY29kZURyYXdhYmxlKHNyYywgKGRlY29kZXIsIGluZm8sIHMpIC0+IGRlY29kZXIuc2V0VGFyZ2V0U2FtcGxlU2l6ZSgtMikpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJGYWlsZWQgd2l0aCBleGNlcHRpb24gIiArIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGFyZ2V0U2l6ZSgpIHsKKyAgICAgICAgY2xhc3MgUmVzaXplTGlzdGVuZXIgaW1wbGVtZW50cyBJbWFnZURlY29kZXIuT25IZWFkZXJEZWNvZGVkTGlzdGVuZXIgeworICAgICAgICAgICAgcHVibGljIGludCB3aWR0aDsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgaGVpZ2h0OworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkhlYWRlckRlY29kZWQoSW1hZ2VEZWNvZGVyIGRlY29kZXIsIEltYWdlRGVjb2Rlci5JbWFnZUluZm8gaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbWFnZURlY29kZXIuU291cmNlIHNyYykgeworICAgICAgICAgICAgICAgIGRlY29kZXIuc2V0VGFyZ2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgUmVzaXplTGlzdGVuZXIgbCA9IG5ldyBSZXNpemVMaXN0ZW5lcigpOworCisgICAgICAgIGZsb2F0W10gc2NhbGVzID0gbmV3IGZsb2F0W10geyAuMDYyNWYsIC4xMjVmLCAuMjVmLCAuNWYsIC43NWYsIDEuMWYsIDIuMGYgfTsKKyAgICAgICAgZm9yIChSZWNvcmQgcmVjb3JkIDogUkVDT1JEUykgeworICAgICAgICAgICAgZm9yIChTb3VyY2VDcmVhdG9yIGYgOiBtQ3JlYXRvcnMpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHNjYWxlcy5sZW5ndGg7ICsraikgeworICAgICAgICAgICAgICAgICAgICBsLndpZHRoICA9IChpbnQpIChzY2FsZXNbal0gKiByZWNvcmQud2lkdGgpOworICAgICAgICAgICAgICAgICAgICBsLmhlaWdodCA9IChpbnQpIChzY2FsZXNbal0gKiByZWNvcmQuaGVpZ2h0KTsKKworICAgICAgICAgICAgICAgICAgICBJbWFnZURlY29kZXIuU291cmNlIHNyYyA9IGYuYXBwbHkocmVjb3JkLnJlc0lkKTsKKworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgRHJhd2FibGUgZHJhd2FibGUgPSBJbWFnZURlY29kZXIuZGVjb2RlRHJhd2FibGUoc3JjLCBsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhsLndpZHRoLCAgZHJhd2FibGUuZ2V0SW50cmluc2ljV2lkdGgoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMobC5oZWlnaHQsIGRyYXdhYmxlLmdldEludHJpbnNpY0hlaWdodCgpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgc3JjID0gZi5hcHBseShyZWNvcmQucmVzSWQpOworICAgICAgICAgICAgICAgICAgICAgICAgQml0bWFwIGJtID0gSW1hZ2VEZWNvZGVyLmRlY29kZUJpdG1hcChzcmMsIGwpOworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGwud2lkdGgsICBibS5nZXRXaWR0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhsLmhlaWdodCwgYm0uZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsKCJGYWlsZWQgIiArIGdldEFzUmVzb3VyY2VVcmkocmVjb3JkLnJlc0lkKSArICIgd2l0aCBleGNlcHRpb24gIiArIGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQXJiaXRyYXJ5IHNxdWFyZS4KKyAgICAgICAgICAgICAgICAgICAgbC53aWR0aCAgPSA1MDsKKyAgICAgICAgICAgICAgICAgICAgbC5oZWlnaHQgPSA1MDsKKyAgICAgICAgICAgICAgICAgICAgSW1hZ2VEZWNvZGVyLlNvdXJjZSBzcmMgPSBmLmFwcGx5KHJlY29yZC5yZXNJZCk7CisgICAgICAgICAgICAgICAgICAgIERyYXdhYmxlIGRyYXdhYmxlID0gSW1hZ2VEZWNvZGVyLmRlY29kZURyYXdhYmxlKHNyYywgbCk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyg1MCwgIGRyYXdhYmxlLmdldEludHJpbnNpY1dpZHRoKCkpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoNTAsIGRyYXdhYmxlLmdldEludHJpbnNpY0hlaWdodCgpKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBTd2FwIHdpZHRoIGFuZCBoZWlnaHQsIGZvciBkaWZmZXJlbnQgc2NhbGVzLgorICAgICAgICAgICAgICAgICAgICBsLmhlaWdodCA9IHJlY29yZC53aWR0aDsKKyAgICAgICAgICAgICAgICAgICAgbC53aWR0aCAgPSByZWNvcmQuaGVpZ2h0OworICAgICAgICAgICAgICAgICAgICBzcmMgPSBmLmFwcGx5KHJlY29yZC5yZXNJZCk7CisgICAgICAgICAgICAgICAgICAgIGRyYXdhYmxlID0gSW1hZ2VEZWNvZGVyLmRlY29kZURyYXdhYmxlKHNyYywgbCk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZWNvcmQuaGVpZ2h0LCBkcmF3YWJsZS5nZXRJbnRyaW5zaWNXaWR0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlY29yZC53aWR0aCwgIGRyYXdhYmxlLmdldEludHJpbnNpY0hlaWdodCgpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGZhaWwoIkZhaWxlZCB3aXRoIGV4Y2VwdGlvbiAiICsgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzaXplV2VicCgpIHsKKyAgICAgICAgLy8gbGlid2VicCBzdXBwb3J0cyB1bnByZW11bHRpcGxpZWQgZm9yIGRvd25zY2FsZWQgb3V0cHV0CisgICAgICAgIGNsYXNzIFJlc2l6ZUxpc3RlbmVyIGltcGxlbWVudHMgSW1hZ2VEZWNvZGVyLk9uSGVhZGVyRGVjb2RlZExpc3RlbmVyIHsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgd2lkdGg7CisgICAgICAgICAgICBwdWJsaWMgaW50IGhlaWdodDsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25IZWFkZXJEZWNvZGVkKEltYWdlRGVjb2RlciBkZWNvZGVyLCBJbWFnZURlY29kZXIuSW1hZ2VJbmZvIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1hZ2VEZWNvZGVyLlNvdXJjZSBzcmMpIHsKKyAgICAgICAgICAgICAgICBkZWNvZGVyLnNldFRhcmdldFNpemUod2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICAgICAgZGVjb2Rlci5zZXRVbnByZW11bHRpcGxpZWRSZXF1aXJlZCh0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgUmVzaXplTGlzdGVuZXIgbCA9IG5ldyBSZXNpemVMaXN0ZW5lcigpOworCisgICAgICAgIGZsb2F0W10gc2NhbGVzID0gbmV3IGZsb2F0W10geyAuMDYyNWYsIC4xMjVmLCAuMjVmLCAuNWYsIC43NWYgfTsKKyAgICAgICAgZm9yIChTb3VyY2VDcmVhdG9yIGYgOiBtQ3JlYXRvcnMpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc2NhbGVzLmxlbmd0aDsgKytqKSB7CisgICAgICAgICAgICAgICAgbC53aWR0aCAgPSAoaW50KSAoc2NhbGVzW2pdICogMjQwKTsKKyAgICAgICAgICAgICAgICBsLmhlaWdodCA9IChpbnQpIChzY2FsZXNbal0gKiAgODcpOworCisgICAgICAgICAgICAgICAgSW1hZ2VEZWNvZGVyLlNvdXJjZSBzcmMgPSBmLmFwcGx5KFIuZHJhd2FibGUuZ29vZ2xlX2xvZ29fMik7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgQml0bWFwIGJtID0gSW1hZ2VEZWNvZGVyLmRlY29kZUJpdG1hcChzcmMsIGwpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMobC53aWR0aCwgIGJtLmdldFdpZHRoKCkpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMobC5oZWlnaHQsIGJtLmdldEhlaWdodCgpKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShibS5oYXNBbHBoYSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UoYm0uaXNQcmVtdWx0aXBsaWVkKCkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgZmFpbCgiRmFpbGVkIHdpdGggZXhjZXB0aW9uICIgKyBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZD1JbGxlZ2FsU3RhdGVFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdFJlc2l6ZVdlYnBMYXJnZXIoKSB7CisgICAgICAgIC8vIGxpYndlYnAgZG9lcyBub3QgdXBzY2FsZSwgc28gdGhlcmUgaXMgbm8gd2F5IHRvIGdldCB1bnByZW11bC4KKyAgICAgICAgSW1hZ2VEZWNvZGVyLlNvdXJjZSBzcmMgPSBtQ3JlYXRvcnNbMF0uYXBwbHkoUi5kcmF3YWJsZS5nb29nbGVfbG9nb18yKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEltYWdlRGVjb2Rlci5kZWNvZGVCaXRtYXAoc3JjLCAoZGVjb2RlciwgaW5mbywgcykgLT4geworICAgICAgICAgICAgICAgIFNpemUgc2l6ZSA9IGluZm8uZ2V0U2l6ZSgpOworICAgICAgICAgICAgICAgIGRlY29kZXIuc2V0VGFyZ2V0U2l6ZShzaXplLmdldFdpZHRoKCkgKiAyLCBzaXplLmdldEhlaWdodCgpICogMik7CisgICAgICAgICAgICAgICAgZGVjb2Rlci5zZXRVbnByZW11bHRpcGxpZWRSZXF1aXJlZCh0cnVlKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJGYWlsZWQgd2l0aCBleGNlcHRpb24gIiArIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQ9SWxsZWdhbFN0YXRlRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNpemVVbnByZW11bCgpIHsKKyAgICAgICAgSW1hZ2VEZWNvZGVyLlNvdXJjZSBzcmMgPSBtQ3JlYXRvcnNbMF0uYXBwbHkoUi5kcmF3YWJsZS5hbHBoYSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJbWFnZURlY29kZXIuZGVjb2RlQml0bWFwKHNyYywgKGRlY29kZXIsIGluZm8sIHMpIC0+IHsKKyAgICAgICAgICAgICAgICAvLyBDaG9vc2UgYSB3aWR0aCBhbmQgaGVpZ2h0IHRoYXQgY2Fubm90IGJlIGFjaGlldmVkIHdpdGggc2FtcGxpbmcuCisgICAgICAgICAgICAgICAgU2l6ZSBzaXplID0gaW5mby5nZXRTaXplKCk7CisgICAgICAgICAgICAgICAgaW50IHdpZHRoID0gc2l6ZS5nZXRXaWR0aCgpIC8gMiArIDM7CisgICAgICAgICAgICAgICAgaW50IGhlaWdodCA9IHNpemUuZ2V0SGVpZ2h0KCkgLyAyICsgMzsKKyAgICAgICAgICAgICAgICBkZWNvZGVyLnNldFRhcmdldFNpemUod2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICAgICAgZGVjb2Rlci5zZXRVbnByZW11bHRpcGxpZWRSZXF1aXJlZCh0cnVlKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJGYWlsZWQgd2l0aCBleGNlcHRpb24gIiArIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q3JvcCgpIHsKKyAgICAgICAgZmluYWwgaW50IHJlc0lkID0gUkVDT1JEU1swXS5yZXNJZDsKKyAgICAgICAgSW1hZ2VEZWNvZGVyLlNvdXJjZSBzcmMgPSBtQ3JlYXRvcnNbMF0uYXBwbHkocmVzSWQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW1hZ2VEZWNvZGVyLmRlY29kZURyYXdhYmxlKHNyYywgKGRlY29kZXIsIGluZm8sIHMpIC0+IHsKKyAgICAgICAgICAgICAgICBhc3NlcnROdWxsKGRlY29kZXIuZ2V0Q3JvcCgpKTsKKworICAgICAgICAgICAgICAgIFJlY3QgciA9IG5ldyBSZWN0KDAsIDAsIGluZm8uZ2V0U2l6ZSgpLmdldFdpZHRoKCkgLyAyLCA1KTsKKyAgICAgICAgICAgICAgICBkZWNvZGVyLnNldENyb3Aocik7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHIsIGRlY29kZXIuZ2V0Q3JvcCgpKTsKKworICAgICAgICAgICAgICAgIHIgPSBuZXcgUmVjdCgwLCAwLCA1LCAxMCk7CisgICAgICAgICAgICAgICAgZGVjb2Rlci5zZXRDcm9wKHIpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhyLCBkZWNvZGVyLmdldENyb3AoKSk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRmFpbGVkICIgKyBnZXRBc1Jlc291cmNlVXJpKHJlc0lkKSArICIgd2l0aCBleGNlcHRpb24gIiArIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JvcCgpIHsKKyAgICAgICAgY2xhc3MgTGlzdGVuZXIgaW1wbGVtZW50cyBJbWFnZURlY29kZXIuT25IZWFkZXJEZWNvZGVkTGlzdGVuZXIgeworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZG9TY2FsZTsKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHJlcXVpcmVTb2Z0d2FyZTsKKyAgICAgICAgICAgIHB1YmxpYyBSZWN0IGNyb3BSZWN0OworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkhlYWRlckRlY29kZWQoSW1hZ2VEZWNvZGVyIGRlY29kZXIsIEltYWdlRGVjb2Rlci5JbWFnZUluZm8gaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbWFnZURlY29kZXIuU291cmNlIHNyYykgeworICAgICAgICAgICAgICAgIGludCB3aWR0aCAgPSBpbmZvLmdldFNpemUoKS5nZXRXaWR0aCgpOworICAgICAgICAgICAgICAgIGludCBoZWlnaHQgPSBpbmZvLmdldFNpemUoKS5nZXRIZWlnaHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoZG9TY2FsZSkgeworICAgICAgICAgICAgICAgICAgICB3aWR0aCAgLz0gMjsKKyAgICAgICAgICAgICAgICAgICAgaGVpZ2h0IC89IDI7CisgICAgICAgICAgICAgICAgICAgIGRlY29kZXIuc2V0VGFyZ2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gQ3JvcCB0byB0aGUgbWlkZGxlOgorICAgICAgICAgICAgICAgIGludCBxdWFydGVyV2lkdGggID0gd2lkdGggIC8gNDsKKyAgICAgICAgICAgICAgICBpbnQgcXVhcnRlckhlaWdodCA9IGhlaWdodCAvIDQ7CisgICAgICAgICAgICAgICAgY3JvcFJlY3QgPSBuZXcgUmVjdChxdWFydGVyV2lkdGgsIHF1YXJ0ZXJIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICBxdWFydGVyV2lkdGggKiAzLCBxdWFydGVySGVpZ2h0ICogMyk7CisgICAgICAgICAgICAgICAgZGVjb2Rlci5zZXRDcm9wKGNyb3BSZWN0KTsKKworICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlU29mdHdhcmUpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVjb2Rlci5zZXRBbGxvY2F0b3IoSW1hZ2VEZWNvZGVyLkFMTE9DQVRPUl9TT0ZUV0FSRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBMaXN0ZW5lciBsID0gbmV3IExpc3RlbmVyKCk7CisgICAgICAgIGJvb2xlYW4gdHJ1ZUZhbHNlW10gPSBuZXcgYm9vbGVhbltdIHsgdHJ1ZSwgZmFsc2UgfTsKKyAgICAgICAgZm9yIChSZWNvcmQgcmVjb3JkIDogUkVDT1JEUykgeworICAgICAgICAgICAgZm9yIChTb3VyY2VDcmVhdG9yIGYgOiBtQ3JlYXRvcnMpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGJvb2xlYW4gZG9TY2FsZSA6IHRydWVGYWxzZSkgeworICAgICAgICAgICAgICAgICAgICBsLmRvU2NhbGUgPSBkb1NjYWxlOworICAgICAgICAgICAgICAgICAgICBmb3IgKGJvb2xlYW4gcmVxdWlyZVNvZnR3YXJlIDogdHJ1ZUZhbHNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsLnJlcXVpcmVTb2Z0d2FyZSA9IHJlcXVpcmVTb2Z0d2FyZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEltYWdlRGVjb2Rlci5Tb3VyY2Ugc3JjID0gZi5hcHBseShyZWNvcmQucmVzSWQpOworCisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIERyYXdhYmxlIGRyYXdhYmxlID0gSW1hZ2VEZWNvZGVyLmRlY29kZURyYXdhYmxlKHNyYywgbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGwuY3JvcFJlY3Qud2lkdGgoKSwgIGRyYXdhYmxlLmdldEludHJpbnNpY1dpZHRoKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhsLmNyb3BSZWN0LmhlaWdodCgpLCBkcmF3YWJsZS5nZXRJbnRyaW5zaWNIZWlnaHQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbCgiRmFpbGVkICIgKyBnZXRBc1Jlc291cmNlVXJpKHJlY29yZC5yZXNJZCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB3aXRoIGV4Y2VwdGlvbiAiICsgZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZD1JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdFJlc2l6ZVplcm9YKCkgeworICAgICAgICBJbWFnZURlY29kZXIuU291cmNlIHNyYyA9IG1DcmVhdG9yc1swXS5hcHBseShSLmRyYXdhYmxlLnBuZ190ZXN0KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEltYWdlRGVjb2Rlci5kZWNvZGVEcmF3YWJsZShzcmMsIChkZWNvZGVyLCBpbmZvLCBzKSAtPgorICAgICAgICAgICAgICAgICAgICBkZWNvZGVyLnNldFRhcmdldFNpemUoMCwgaW5mby5nZXRTaXplKCkuZ2V0SGVpZ2h0KCkpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRmFpbGVkIHdpdGggZXhjZXB0aW9uICIgKyBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkPUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzaXplWmVyb1koKSB7CisgICAgICAgIEltYWdlRGVjb2Rlci5Tb3VyY2Ugc3JjID0gbUNyZWF0b3JzWzBdLmFwcGx5KFIuZHJhd2FibGUucG5nX3Rlc3QpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW1hZ2VEZWNvZGVyLmRlY29kZURyYXdhYmxlKHNyYywgKGRlY29kZXIsIGluZm8sIHMpIC0+CisgICAgICAgICAgICAgICAgICAgIGRlY29kZXIuc2V0VGFyZ2V0U2l6ZShpbmZvLmdldFNpemUoKS5nZXRXaWR0aCgpLCAwKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkZhaWxlZCB3aXRoIGV4Y2VwdGlvbiAiICsgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZD1JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdFJlc2l6ZU5lZ2F0aXZlWCgpIHsKKyAgICAgICAgSW1hZ2VEZWNvZGVyLlNvdXJjZSBzcmMgPSBtQ3JlYXRvcnNbMF0uYXBwbHkoUi5kcmF3YWJsZS5wbmdfdGVzdCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJbWFnZURlY29kZXIuZGVjb2RlRHJhd2FibGUoc3JjLCAoZGVjb2RlciwgaW5mbywgcykgLT4KKyAgICAgICAgICAgICAgICAgICAgZGVjb2Rlci5zZXRUYXJnZXRTaXplKC0xMCwgaW5mby5nZXRTaXplKCkuZ2V0SGVpZ2h0KCkpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRmFpbGVkIHdpdGggZXhjZXB0aW9uICIgKyBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkPUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzaXplTmVnYXRpdmVZKCkgeworICAgICAgICBJbWFnZURlY29kZXIuU291cmNlIHNyYyA9IG1DcmVhdG9yc1swXS5hcHBseShSLmRyYXdhYmxlLnBuZ190ZXN0KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEltYWdlRGVjb2Rlci5kZWNvZGVEcmF3YWJsZShzcmMsIChkZWNvZGVyLCBpbmZvLCBzKSAtPgorICAgICAgICAgICAgICAgICAgICBkZWNvZGVyLnNldFRhcmdldFNpemUoaW5mby5nZXRTaXplKCkuZ2V0V2lkdGgoKSwgLTEwKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkZhaWxlZCB3aXRoIGV4Y2VwdGlvbiAiICsgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZD1JbGxlZ2FsU3RhdGVFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdFN0b3JlSW1hZ2VEZWNvZGVyKCkgeworICAgICAgICBjbGFzcyBDYWNoaW5nQ2FsbGJhY2sgaW1wbGVtZW50cyBJbWFnZURlY29kZXIuT25IZWFkZXJEZWNvZGVkTGlzdGVuZXIgeworICAgICAgICAgICAgSW1hZ2VEZWNvZGVyIGNhY2hlZERlY29kZXI7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uSGVhZGVyRGVjb2RlZChJbWFnZURlY29kZXIgZGVjb2RlciwgSW1hZ2VEZWNvZGVyLkltYWdlSW5mbyBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltYWdlRGVjb2Rlci5Tb3VyY2Ugc3JjKSB7CisgICAgICAgICAgICAgICAgY2FjaGVkRGVjb2RlciA9IGRlY29kZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIENhY2hpbmdDYWxsYmFjayBsID0gbmV3IENhY2hpbmdDYWxsYmFjaygpOworICAgICAgICBJbWFnZURlY29kZXIuU291cmNlIHNyYyA9IG1DcmVhdG9yc1swXS5hcHBseShSLmRyYXdhYmxlLnBuZ190ZXN0KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEltYWdlRGVjb2Rlci5kZWNvZGVEcmF3YWJsZShzcmMsIGwpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJGYWlsZWQgd2l0aCBleGNlcHRpb24gIiArIGUpOworICAgICAgICB9CisgICAgICAgIGwuY2FjaGVkRGVjb2Rlci5zZXRUYXJnZXRTYW1wbGVTaXplKDIpOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkPUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVjb2RlVW5wcmVtdWxEcmF3YWJsZSgpIHsKKyAgICAgICAgSW1hZ2VEZWNvZGVyLlNvdXJjZSBzcmMgPSBtQ3JlYXRvcnNbMF0uYXBwbHkoUi5kcmF3YWJsZS5wbmdfdGVzdCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJbWFnZURlY29kZXIuZGVjb2RlRHJhd2FibGUoc3JjLCAoZGVjb2RlciwgaW5mbywgcykgLT4KKyAgICAgICAgICAgICAgICAgICAgZGVjb2Rlci5zZXRVbnByZW11bHRpcGxpZWRSZXF1aXJlZCh0cnVlKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkZhaWxlZCB3aXRoIGV4Y2VwdGlvbiAiICsgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZD1JbGxlZ2FsU3RhdGVFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdENyb3BOZWdhdGl2ZUxlZnQoKSB7CisgICAgICAgIEltYWdlRGVjb2Rlci5Tb3VyY2Ugc3JjID0gbUNyZWF0b3JzWzBdLmFwcGx5KFIuZHJhd2FibGUucG5nX3Rlc3QpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW1hZ2VEZWNvZGVyLmRlY29kZURyYXdhYmxlKHNyYywgKGRlY29kZXIsIGluZm8sIHMpIC0+IHsKKyAgICAgICAgICAgICAgICBkZWNvZGVyLnNldENyb3AobmV3IFJlY3QoLTEsIDAsIGluZm8uZ2V0U2l6ZSgpLmdldFdpZHRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLmdldFNpemUoKS5nZXRIZWlnaHQoKSkpOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkZhaWxlZCB3aXRoIGV4Y2VwdGlvbiAiICsgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZD1JbGxlZ2FsU3RhdGVFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdENyb3BOZWdhdGl2ZVRvcCgpIHsKKyAgICAgICAgSW1hZ2VEZWNvZGVyLlNvdXJjZSBzcmMgPSBtQ3JlYXRvcnNbMF0uYXBwbHkoUi5kcmF3YWJsZS5wbmdfdGVzdCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJbWFnZURlY29kZXIuZGVjb2RlRHJhd2FibGUoc3JjLCAoZGVjb2RlciwgaW5mbywgcykgLT4geworICAgICAgICAgICAgICAgIGRlY29kZXIuc2V0Q3JvcChuZXcgUmVjdCgwLCAtMSwgaW5mby5nZXRTaXplKCkuZ2V0V2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uZ2V0U2l6ZSgpLmdldEhlaWdodCgpKSk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRmFpbGVkIHdpdGggZXhjZXB0aW9uICIgKyBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkPUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JvcFRvb1dpZGUoKSB7CisgICAgICAgIEltYWdlRGVjb2Rlci5Tb3VyY2Ugc3JjID0gbUNyZWF0b3JzWzBdLmFwcGx5KFIuZHJhd2FibGUucG5nX3Rlc3QpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW1hZ2VEZWNvZGVyLmRlY29kZURyYXdhYmxlKHNyYywgKGRlY29kZXIsIGluZm8sIHMpIC0+IHsKKyAgICAgICAgICAgICAgICBkZWNvZGVyLnNldENyb3AobmV3IFJlY3QoMSwgMCwgaW5mby5nZXRTaXplKCkuZ2V0V2lkdGgoKSArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uZ2V0U2l6ZSgpLmdldEhlaWdodCgpKSk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRmFpbGVkIHdpdGggZXhjZXB0aW9uICIgKyBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkPUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JvcFRvb1RhbGwoKSB7CisgICAgICAgIEltYWdlRGVjb2Rlci5Tb3VyY2Ugc3JjID0gbUNyZWF0b3JzWzBdLmFwcGx5KFIuZHJhd2FibGUucG5nX3Rlc3QpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW1hZ2VEZWNvZGVyLmRlY29kZURyYXdhYmxlKHNyYywgKGRlY29kZXIsIGluZm8sIHMpIC0+IHsKKyAgICAgICAgICAgICAgICBkZWNvZGVyLnNldENyb3AobmV3IFJlY3QoMCwgMSwgaW5mby5nZXRTaXplKCkuZ2V0V2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5nZXRTaXplKCkuZ2V0SGVpZ2h0KCkgKyAxKSk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiRmFpbGVkIHdpdGggZXhjZXB0aW9uICIgKyBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkPUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JvcFJlc2l6ZSgpIHsKKyAgICAgICAgSW1hZ2VEZWNvZGVyLlNvdXJjZSBzcmMgPSBtQ3JlYXRvcnNbMF0uYXBwbHkoUi5kcmF3YWJsZS5wbmdfdGVzdCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJbWFnZURlY29kZXIuZGVjb2RlRHJhd2FibGUoc3JjLCAoZGVjb2RlciwgaW5mbywgcykgLT4geworICAgICAgICAgICAgICAgIFNpemUgc2l6ZSA9IGluZm8uZ2V0U2l6ZSgpOworICAgICAgICAgICAgICAgIGRlY29kZXIuc2V0VGFyZ2V0U2l6ZShzaXplLmdldFdpZHRoKCkgLyAyLCBzaXplLmdldEhlaWdodCgpIC8gMik7CisgICAgICAgICAgICAgICAgZGVjb2Rlci5zZXRDcm9wKG5ldyBSZWN0KDAsIDAsIHNpemUuZ2V0V2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZS5nZXRIZWlnaHQoKSkpOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkZhaWxlZCB3aXRoIGV4Y2VwdGlvbiAiICsgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBbHBoYU1hc2tOb25HcmF5KCkgeworICAgICAgICAvLyBJdCBpcyBzYWZlIHRvIGNhbGwgc2V0RGVjb2RlQXNBbHBoYU1hc2tFbmFibGVkIG9uIGEgbm9uLWdyYXkgaW1hZ2UuCisgICAgICAgIFNvdXJjZUNyZWF0b3IgZiA9IG1DcmVhdG9yc1swXTsKKyAgICAgICAgSW1hZ2VEZWNvZGVyLlNvdXJjZSBzcmMgPSBmLmFwcGx5KFIuZHJhd2FibGUucG5nX3Rlc3QpOworICAgICAgICBhc3NlcnROb3ROdWxsKHNyYyk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBCaXRtYXAgYm0gPSBJbWFnZURlY29kZXIuZGVjb2RlQml0bWFwKHNyYywgKGRlY29kZXIsIGluZm8sIHMpIC0+IHsKKyAgICAgICAgICAgICAgICBkZWNvZGVyLnNldERlY29kZUFzQWxwaGFNYXNrRW5hYmxlZCh0cnVlKTsKKyAgICAgICAgICAgICAgICBkZWNvZGVyLnNldEFsbG9jYXRvcihJbWFnZURlY29kZXIuQUxMT0NBVE9SX1NPRlRXQVJFKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChibSk7CisgICAgICAgICAgICBhc3NlcnROb3RFcXVhbHMoQml0bWFwLkNvbmZpZy5BTFBIQV84LCBibS5nZXRDb25maWcoKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkZhaWxlZCB3aXRoIGV4Y2VwdGlvbiAiICsgZSk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkPUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWxwaGFNYXNrUGx1c0hhcmR3YXJlKCkgeworICAgICAgICBTb3VyY2VDcmVhdG9yIGYgPSBtQ3JlYXRvcnNbMF07CisgICAgICAgIEltYWdlRGVjb2Rlci5Tb3VyY2Ugc3JjID0gZi5hcHBseShSLmRyYXdhYmxlLnBuZ190ZXN0KTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChzcmMpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW1hZ2VEZWNvZGVyLmRlY29kZURyYXdhYmxlKHNyYywgKGRlY29kZXIsIGluZm8sIHMpIC0+IHsKKyAgICAgICAgICAgICAgICBkZWNvZGVyLnNldERlY29kZUFzQWxwaGFNYXNrRW5hYmxlZCh0cnVlKTsKKyAgICAgICAgICAgICAgICBkZWNvZGVyLnNldEFsbG9jYXRvcihJbWFnZURlY29kZXIuQUxMT0NBVE9SX0hBUkRXQVJFKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJGYWlsZWQgd2l0aCBleGNlcHRpb24gIiArIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QWxwaGFNYXNrKCkgeworICAgICAgICBmaW5hbCBpbnQgcmVzSWQgPSBSLmRyYXdhYmxlLmdyYXlzY2FsZV9wbmc7CisgICAgICAgIEltYWdlRGVjb2Rlci5Tb3VyY2Ugc3JjID0gbUNyZWF0b3JzWzBdLmFwcGx5KHJlc0lkKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEltYWdlRGVjb2Rlci5kZWNvZGVEcmF3YWJsZShzcmMsIChkZWNvZGVyLCBpbmZvLCBzKSAtPiB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UoZGVjb2Rlci5pc0RlY29kZUFzQWxwaGFNYXNrRW5hYmxlZCgpKTsKKworICAgICAgICAgICAgICAgIGRlY29kZXIuc2V0RGVjb2RlQXNBbHBoYU1hc2tFbmFibGVkKHRydWUpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZGVjb2Rlci5pc0RlY29kZUFzQWxwaGFNYXNrRW5hYmxlZCgpKTsKKworICAgICAgICAgICAgICAgIGRlY29kZXIuc2V0RGVjb2RlQXNBbHBoYU1hc2tFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShkZWNvZGVyLmlzRGVjb2RlQXNBbHBoYU1hc2tFbmFibGVkKCkpOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkZhaWxlZCAiICsgZ2V0QXNSZXNvdXJjZVVyaShyZXNJZCkgKyAiIHdpdGggZXhjZXB0aW9uICIgKyBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFscGhhTWFzaygpIHsKKyAgICAgICAgY2xhc3MgTGlzdGVuZXIgaW1wbGVtZW50cyBJbWFnZURlY29kZXIuT25IZWFkZXJEZWNvZGVkTGlzdGVuZXIgeworICAgICAgICAgICAgYm9vbGVhbiBkb0Nyb3A7CisgICAgICAgICAgICBib29sZWFuIGRvU2NhbGU7CisgICAgICAgICAgICBib29sZWFuIGRvUG9zdFByb2Nlc3M7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uSGVhZGVyRGVjb2RlZChJbWFnZURlY29kZXIgZGVjb2RlciwgSW1hZ2VEZWNvZGVyLkltYWdlSW5mbyBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltYWdlRGVjb2Rlci5Tb3VyY2Ugc3JjKSB7CisgICAgICAgICAgICAgICAgZGVjb2Rlci5zZXREZWNvZGVBc0FscGhhTWFza0VuYWJsZWQodHJ1ZSk7CisgICAgICAgICAgICAgICAgU2l6ZSBzaXplID0gaW5mby5nZXRTaXplKCk7CisgICAgICAgICAgICAgICAgaWYgKGRvU2NhbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVjb2Rlci5zZXRUYXJnZXRTaXplKHNpemUuZ2V0V2lkdGgoKSAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLmdldEhlaWdodCgpIC8gMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChkb0Nyb3ApIHsKKyAgICAgICAgICAgICAgICAgICAgZGVjb2Rlci5zZXRDcm9wKG5ldyBSZWN0KDAsIDAsIHNpemUuZ2V0V2lkdGgoKSAvIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLmdldEhlaWdodCgpIC8gNCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZG9Qb3N0UHJvY2VzcykgeworICAgICAgICAgICAgICAgICAgICBkZWNvZGVyLnNldFBvc3RQcm9jZXNzb3IoKGMpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMuZHJhd0NvbG9yKENvbG9yLkJMQUNLKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQaXhlbEZvcm1hdC5VTktOT1dOOworICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIExpc3RlbmVyIGwgPSBuZXcgTGlzdGVuZXIoKTsKKyAgICAgICAgLy8gQm90aCBvZiB0aGVzZSBhcmUgZW5jb2RlZCBhcyBzaW5nbGUgY2hhbm5lbCBncmF5IGltYWdlcy4KKyAgICAgICAgaW50IHJlc0lkc1tdID0gbmV3IGludFtdIHsgUi5kcmF3YWJsZS5ncmF5c2NhbGVfcG5nLCBSLmRyYXdhYmxlLmdyYXlzY2FsZV9qcGcgfTsKKyAgICAgICAgYm9vbGVhbiB0cnVlRmFsc2VbXSA9IG5ldyBib29sZWFuW10geyB0cnVlLCBmYWxzZSB9OworICAgICAgICBTb3VyY2VDcmVhdG9yIGYgPSBtQ3JlYXRvcnNbMF07CisgICAgICAgIGZvciAoaW50IHJlc0lkIDogcmVzSWRzKSB7CisgICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCB0aGlzIHdpbGwgZGVjb2RlIHRvIEhBUkRXQVJFCisgICAgICAgICAgICBJbWFnZURlY29kZXIuU291cmNlIHNyYyA9IGYuYXBwbHkocmVzSWQpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBCaXRtYXAgYm0gID0gSW1hZ2VEZWNvZGVyLmRlY29kZUJpdG1hcChzcmMpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhCaXRtYXAuQ29uZmlnLkhBUkRXQVJFLCBibS5nZXRDb25maWcoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZmFpbCgiRmFpbGVkIHdpdGggZXhjZXB0aW9uICIgKyBlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gTm93IHNldCBhbHBoYSBtYXNrLCB3aGljaCBpcyBpbmNvbXBhdGlibGUgd2l0aCBIQVJEV0FSRQorICAgICAgICAgICAgZm9yIChib29sZWFuIGRvQ3JvcCA6IHRydWVGYWxzZSkgeworICAgICAgICAgICAgICAgIGZvciAoYm9vbGVhbiBkb1NjYWxlIDogdHJ1ZUZhbHNlKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoYm9vbGVhbiBkb1Bvc3RQcm9jZXNzIDogdHJ1ZUZhbHNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsLmRvQ3JvcCA9IGRvQ3JvcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGwuZG9TY2FsZSA9IGRvU2NhbGU7CisgICAgICAgICAgICAgICAgICAgICAgICBsLmRvUG9zdFByb2Nlc3MgPSBkb1Bvc3RQcm9jZXNzOworICAgICAgICAgICAgICAgICAgICAgICAgc3JjID0gZi5hcHBseShyZXNJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdG1hcCBibSA9IEltYWdlRGVjb2Rlci5kZWNvZGVCaXRtYXAoc3JjLCBsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnROb3RFcXVhbHMoQml0bWFwLkNvbmZpZy5IQVJEV0FSRSwgYm0uZ2V0Q29uZmlnKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwoIkZhaWxlZCB3aXRoIGV4Y2VwdGlvbiAiICsgZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDb25zZXJ2ZU1lbW9yeSgpIHsKKyAgICAgICAgZmluYWwgaW50IHJlc0lkID0gUkVDT1JEU1swXS5yZXNJZDsKKyAgICAgICAgSW1hZ2VEZWNvZGVyLlNvdXJjZSBzcmMgPSBtQ3JlYXRvcnNbMF0uYXBwbHkocmVzSWQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW1hZ2VEZWNvZGVyLmRlY29kZURyYXdhYmxlKHNyYywgKGRlY29kZXIsIGluZm8sIHMpIC0+IHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoSW1hZ2VEZWNvZGVyLk1FTU9SWV9QT0xJQ1lfREVGQVVMVCwgZGVjb2Rlci5nZXRNZW1vcnlTaXplUG9saWN5KCkpOworCisgICAgICAgICAgICAgICAgZGVjb2Rlci5zZXRNZW1vcnlTaXplUG9saWN5KEltYWdlRGVjb2Rlci5NRU1PUllfUE9MSUNZX0xPV19SQU0pOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhJbWFnZURlY29kZXIuTUVNT1JZX1BPTElDWV9MT1dfUkFNLCBkZWNvZGVyLmdldE1lbW9yeVNpemVQb2xpY3koKSk7CisKKyAgICAgICAgICAgICAgICBkZWNvZGVyLnNldE1lbW9yeVNpemVQb2xpY3koSW1hZ2VEZWNvZGVyLk1FTU9SWV9QT0xJQ1lfREVGQVVMVCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEltYWdlRGVjb2Rlci5NRU1PUllfUE9MSUNZX0RFRkFVTFQsIGRlY29kZXIuZ2V0TWVtb3J5U2l6ZVBvbGljeSgpKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJGYWlsZWQgIiArIGdldEFzUmVzb3VyY2VVcmkocmVzSWQpICsgIiB3aXRoIGV4Y2VwdGlvbiAiICsgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zZXJ2ZU1lbW9yeVBsdXNIYXJkd2FyZSgpIHsKKyAgICAgICAgY2xhc3MgTGlzdGVuZXIgaW1wbGVtZW50cyBJbWFnZURlY29kZXIuT25IZWFkZXJEZWNvZGVkTGlzdGVuZXIgeworICAgICAgICAgICAgaW50IGFsbG9jYXRvcjsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25IZWFkZXJEZWNvZGVkKEltYWdlRGVjb2RlciBkZWNvZGVyLCBJbWFnZURlY29kZXIuSW1hZ2VJbmZvIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1hZ2VEZWNvZGVyLlNvdXJjZSBzcmMpIHsKKyAgICAgICAgICAgICAgICBkZWNvZGVyLnNldE1lbW9yeVNpemVQb2xpY3koSW1hZ2VEZWNvZGVyLk1FTU9SWV9QT0xJQ1lfTE9XX1JBTSk7CisgICAgICAgICAgICAgICAgZGVjb2Rlci5zZXRBbGxvY2F0b3IoYWxsb2NhdG9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgTGlzdGVuZXIgbCA9IG5ldyBMaXN0ZW5lcigpOworICAgICAgICBTb3VyY2VDcmVhdG9yIGYgPSBtQ3JlYXRvcnNbMF07CisgICAgICAgIGZvciAoaW50IHJlc0lkIDogbmV3IGludFtdIHsgUi5kcmF3YWJsZS5wbmdfdGVzdCwgUi5yYXcuZjE2IH0pIHsKKyAgICAgICAgICAgIEJpdG1hcCBub3JtYWwgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBub3JtYWwgPSBJbWFnZURlY29kZXIuZGVjb2RlQml0bWFwKGYuYXBwbHkocmVzSWQpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJGYWlsZWQgd2l0aCBleGNlcHRpb24gIiArIGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChub3JtYWwpOworICAgICAgICAgICAgaW50IG5vcm1hbEJ5dGVDb3VudCA9IG5vcm1hbC5nZXRBbGxvY2F0aW9uQnl0ZUNvdW50KCk7CisgICAgICAgICAgICBmb3IgKGludCBhbGxvY2F0b3IgOiBBTExPQ0FUT1JTKSB7CisgICAgICAgICAgICAgICAgbC5hbGxvY2F0b3IgPSBhbGxvY2F0b3I7CisgICAgICAgICAgICAgICAgQml0bWFwIHRlc3QgPSBudWxsOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHRlc3QgPSBJbWFnZURlY29kZXIuZGVjb2RlQml0bWFwKGYuYXBwbHkocmVzSWQpLCBsKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGZhaWwoIkZhaWxlZCB3aXRoIGV4Y2VwdGlvbiAiICsgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwodGVzdCk7CisgICAgICAgICAgICAgICAgaW50IGJ5dGVDb3VudCA9IHRlc3QuZ2V0QWxsb2NhdGlvbkJ5dGVDb3VudCgpOworCisgICAgICAgICAgICAgICAgaWYgKGFsbG9jYXRvciA9PSBJbWFnZURlY29kZXIuQUxMT0NBVE9SX0hBUkRXQVJFCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBhbGxvY2F0b3IgPT0gSW1hZ2VEZWNvZGVyLkFMTE9DQVRPUl9ERUZBVUxUKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXNJZCA9PSBSLmRyYXdhYmxlLnBuZ190ZXN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBkbyBub3Qgc3VwcG9ydCA1NjUgaW4gSEFSRFdBUkUsIHNvIG5vIFJBTSBzYXZpbmdzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcmUgcG9zc2libGUuCisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMobm9ybWFsQnl0ZUNvdW50LCBieXRlQ291bnQpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyBSLnJhdy5mMTYKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaW1hZ2UgZGVmYXVsdHMgdG8gRjE2LiBNRU1PUllfUE9MSUNZX0xPV19SQU0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcmNlcyAidGVzdCIgdG8gZGVjb2RlIHRvIDg4ODguIEJ1dCBpZiB0aGUgZGV2aWNlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb2VzIG5vdCBzdXBwb3J0IEYxNiBpbiBIQVJEV0FSRSwgIm5vcm1hbCIgaXMgYWxzbworICAgICAgICAgICAgICAgICAgICAgICAgLy8gODg4OC4gSXRzIENvbmZpZyBpcyBIQVJEV0FSRSBlaXRoZXIgd2F5LCBidXQgd2UgY2FuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXRlY3QgaXRzIHVuZGVybHlpbmcgcGl4ZWwgZm9ybWF0IGJ5IGNoZWNraW5nIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29sb3JTcGFjZSwgd2hpY2ggaXMgYWx3YXlzIExJTkVBUl9FWFRFTkRFRF9TUkdCIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gRjE2LgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vcm1hbC5nZXRDb2xvclNwYWNlKCkuZXF1YWxzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JTcGFjZS5nZXQoQ29sb3JTcGFjZS5OYW1lZC5MSU5FQVJfRVhURU5ERURfU1JHQikpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRjE2LiAidGVzdCIgc2hvdWxkIGJlIHNtYWxsZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShieXRlQ291bnQgPCBub3JtYWxCeXRlQ291bnQpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA4ODg4LiBObyBSQU0gc2F2aW5ncyBwb3NzaWJsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMobm9ybWFsQnl0ZUNvdW50LCBieXRlQ291bnQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTm90IGRlY29kaW5nIHRvIEhBUkRXQVJFLCBidXQgfG5vcm1hbHwgd2FzLiBBcyBzdWNoIHRoaXMgc2hvdWxkIGFsd2F5cworICAgICAgICAgICAgICAgICAgICAvLyBzdWNjZWVkIGluIGJlaW5nIHNtYWxsZXIsIGFzIHNvZnR3YXJlIHdpbGwgZGVjb2RlIHRvIDU2NSBpbiB0aGlzIGNhc2UuCisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBhbHdheXMgYmUgbGVzcyB0aGFuIHdoYXRldmVyIEhBUkRXQVJFIHN1cHBvcnRzLgorICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGJ5dGVDb3VudCA8IG5vcm1hbEJ5dGVDb3VudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc2VydmVNZW1vcnkoKSB7CisgICAgICAgIGNsYXNzIExpc3RlbmVyIGltcGxlbWVudHMgSW1hZ2VEZWNvZGVyLk9uSGVhZGVyRGVjb2RlZExpc3RlbmVyIHsKKyAgICAgICAgICAgIGJvb2xlYW4gZG9Qb3N0UHJvY2VzczsKKyAgICAgICAgICAgIGJvb2xlYW4gcHJlZmVyUmFtT3ZlclF1YWxpdHk7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uSGVhZGVyRGVjb2RlZChJbWFnZURlY29kZXIgZGVjb2RlciwgSW1hZ2VEZWNvZGVyLkltYWdlSW5mbyBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltYWdlRGVjb2Rlci5Tb3VyY2Ugc3JjKSB7CisgICAgICAgICAgICAgICAgaWYgKHByZWZlclJhbU92ZXJRdWFsaXR5KSB7CisgICAgICAgICAgICAgICAgICAgIGRlY29kZXIuc2V0TWVtb3J5U2l6ZVBvbGljeShJbWFnZURlY29kZXIuTUVNT1JZX1BPTElDWV9MT1dfUkFNKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGRvUG9zdFByb2Nlc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVjb2Rlci5zZXRQb3N0UHJvY2Vzc29yKChjKSAtPiB7CisgICAgICAgICAgICAgICAgICAgICAgICBjLmRyYXdDb2xvcihDb2xvci5CTEFDSyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGl4ZWxGb3JtYXQuVFJBTlNMVUNFTlQ7CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZWNvZGVyLnNldEFsbG9jYXRvcihJbWFnZURlY29kZXIuQUxMT0NBVE9SX1NPRlRXQVJFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgTGlzdGVuZXIgbCA9IG5ldyBMaXN0ZW5lcigpOworICAgICAgICAvLyBBbGwgb2YgdGhlc2UgaW1hZ2VzIGFyZSBvcGFxdWUsIHNvIHRoZXkgY2FuIHNhdmUgUkFNIHdpdGgKKyAgICAgICAgLy8gc2V0Q29uc2VydmVNZW1vcnkuCisgICAgICAgIGludCByZXNJZHNbXSA9IG5ldyBpbnRbXSB7IFIuZHJhd2FibGUucG5nX3Rlc3QsIFIuZHJhd2FibGUuYmFzZWxpbmVfanBlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyB3ZXJlIHN0b3JlZCBpbiBkcmF3YWJsZS8sIGl0IHdvdWxkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlIGNvbnZlcnRlZCBmcm9tIDE2LWJpdCB0byA4LiBGSVhNRTogSXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVoYXZpb3Igc3RpbGwgZGVzaXJhYmxlIG5vdyB0aGF0IHdlIGhhdmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRjE2PyBiLzExOTc2MDE0NgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLnJhdy5mMTYgfTsKKyAgICAgICAgLy8gQW4gb3BhcXVlIGltYWdlIGNhbiBiZSBjb252ZXJ0ZWQgdG8gNTY1LCBidXQgcG9zdFByb2Nlc3Mgd2lsbCBwcm9tb3RlCisgICAgICAgIC8vIHRvIDg4ODggaW4gY2FzZSBhbHBoYSBpcyBhZGRlZC4gVGhlIHRoaXJkIGltYWdlIGRlZmF1bHRzIHRvIEYxNiwgc28KKyAgICAgICAgLy8gZXZlbiB3aXRoIHBvc3RQcm9jZXNzIGl0IHdpbGwgb25seSBiZSBwcm9tb3RlZCB0byA4ODg4LgorICAgICAgICBib29sZWFuIHBvc3RQcm9jZXNzQ2FuY2Vsc1tdID0gbmV3IGJvb2xlYW5bXSB7IHRydWUsIHRydWUsIGZhbHNlIH07CisgICAgICAgIGJvb2xlYW4gdHJ1ZUZhbHNlW10gPSBuZXcgYm9vbGVhbltdIHsgdHJ1ZSwgZmFsc2UgfTsKKyAgICAgICAgU291cmNlQ3JlYXRvciBmID0gbUNyZWF0b3JzWzBdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc0lkcy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgaW50IHJlc0lkID0gcmVzSWRzW2ldOworICAgICAgICAgICAgbC5kb1Bvc3RQcm9jZXNzID0gZmFsc2U7CisgICAgICAgICAgICBsLnByZWZlclJhbU92ZXJRdWFsaXR5ID0gZmFsc2U7CisgICAgICAgICAgICBCaXRtYXAgbm9ybWFsID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbm9ybWFsID0gSW1hZ2VEZWNvZGVyLmRlY29kZUJpdG1hcChmLmFwcGx5KHJlc0lkKSwgbCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZmFpbCgiRmFpbGVkIHdpdGggZXhjZXB0aW9uICIgKyBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBub3JtYWxCeXRlQ291bnQgPSBub3JtYWwuZ2V0QWxsb2NhdGlvbkJ5dGVDb3VudCgpOworICAgICAgICAgICAgZm9yIChib29sZWFuIGRvUG9zdFByb2Nlc3MgOiB0cnVlRmFsc2UpIHsKKyAgICAgICAgICAgICAgICBsLmRvUG9zdFByb2Nlc3MgPSBkb1Bvc3RQcm9jZXNzOworICAgICAgICAgICAgICAgIGwucHJlZmVyUmFtT3ZlclF1YWxpdHkgPSB0cnVlOworICAgICAgICAgICAgICAgIEJpdG1hcCBzYXZlUmFtT3ZlclF1YWxpdHkgPSBudWxsOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHNhdmVSYW1PdmVyUXVhbGl0eSA9IEltYWdlRGVjb2Rlci5kZWNvZGVCaXRtYXAoZi5hcHBseShyZXNJZCksIGwpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgZmFpbCgiRmFpbGVkIHdpdGggZXhjZXB0aW9uICIgKyBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IHNhdmVCeXRlQ291bnQgPSBzYXZlUmFtT3ZlclF1YWxpdHkuZ2V0QWxsb2NhdGlvbkJ5dGVDb3VudCgpOworICAgICAgICAgICAgICAgIGlmIChkb1Bvc3RQcm9jZXNzICYmIHBvc3RQcm9jZXNzQ2FuY2Vsc1tpXSkgeworICAgICAgICAgICAgICAgICAgICAvLyBQcm9tb3RlZCB0byBub3JtYWwuCisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhub3JtYWxCeXRlQ291bnQsIHNhdmVCeXRlQ291bnQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoc2F2ZUJ5dGVDb3VudCA8IG5vcm1hbEJ5dGVDb3VudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzcGVjdE9yaWVudGF0aW9uKCkgeworICAgICAgICAvLyBUaGVzZSA4IGltYWdlcyB0ZXN0IHRoZSA4IEVYSUYgb3JpZW50YXRpb25zLiBJZiB0aGUgb3JpZW50YXRpb24gaXMKKyAgICAgICAgLy8gcmVzcGVjdGVkLCB0aGV5IGFsbCBoYXZlIHRoZSBzYW1lIGRpbWVuc2lvbnM6IDEwMCB4IDgwLgorICAgICAgICAvLyBUaGV5IGFyZSBhbHNvIGlkZW50aWNhbCAoYWZ0ZXIgYWRqdXN0aW5nKSwgc28gY29tcGFyZSB0aGVtLgorICAgICAgICBCaXRtYXAgcmVmZXJlbmNlID0gbnVsbDsKKyAgICAgICAgZm9yIChpbnQgcmVzSWQgOiBuZXcgaW50W10geyBSLmRyYXdhYmxlLm9yaWVudGF0aW9uXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5vcmllbnRhdGlvbl8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuZHJhd2FibGUub3JpZW50YXRpb25fMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLmRyYXdhYmxlLm9yaWVudGF0aW9uXzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5vcmllbnRhdGlvbl81LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuZHJhd2FibGUub3JpZW50YXRpb25fNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLmRyYXdhYmxlLm9yaWVudGF0aW9uXzcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5vcmllbnRhdGlvbl84LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuZHJhd2FibGUud2VicF9vcmllbnRhdGlvbjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5kcmF3YWJsZS53ZWJwX29yaWVudGF0aW9uMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLmRyYXdhYmxlLndlYnBfb3JpZW50YXRpb24zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuZHJhd2FibGUud2VicF9vcmllbnRhdGlvbjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5kcmF3YWJsZS53ZWJwX29yaWVudGF0aW9uNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLmRyYXdhYmxlLndlYnBfb3JpZW50YXRpb242LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuZHJhd2FibGUud2VicF9vcmllbnRhdGlvbjcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5kcmF3YWJsZS53ZWJwX29yaWVudGF0aW9uOCwKKyAgICAgICAgfSkgeworICAgICAgICAgICAgaWYgKHJlc0lkID09IFIuZHJhd2FibGUud2VicF9vcmllbnRhdGlvbjEpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgd2VicCBmaWxlcyBtYXkgbm90IGxvb2sgZXhhY3RseSB0aGUgc2FtZSBhcyB0aGUganBlZ3MuCisgICAgICAgICAgICAgICAgLy8gUmVjcmVhdGUgdGhlIHJlZmVyZW5jZS4KKyAgICAgICAgICAgICAgICByZWZlcmVuY2UgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVXJpIHVyaSA9IGdldEFzUmVzb3VyY2VVcmkocmVzSWQpOworICAgICAgICAgICAgSW1hZ2VEZWNvZGVyLlNvdXJjZSBzcmMgPSBJbWFnZURlY29kZXIuY3JlYXRlU291cmNlKG1Db250ZW50UmVzb2x2ZXIsIHVyaSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEJpdG1hcCBibSA9IEltYWdlRGVjb2Rlci5kZWNvZGVCaXRtYXAoc3JjLCAoZGVjb2RlciwgaW5mbywgcykgLT4geworICAgICAgICAgICAgICAgICAgICAvLyBVc2Ugc29mdHdhcmUgYWxsb2NhdG9yIHNvIHdlIGNhbiBjb21wYXJlLgorICAgICAgICAgICAgICAgICAgICBkZWNvZGVyLnNldEFsbG9jYXRvcihJbWFnZURlY29kZXIuQUxMT0NBVE9SX1NPRlRXQVJFKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGJtKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMTAwLCBibS5nZXRXaWR0aCgpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoODAsICBibS5nZXRIZWlnaHQoKSk7CisKKyAgICAgICAgICAgICAgICBpZiAocmVmZXJlbmNlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlID0gYm07CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQml0bWFwVXRpbHMuY29tcGFyZUJpdG1hcHMoYm0sIHJlZmVyZW5jZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGZhaWwoIkRlY29kaW5nICIgKyB1cmkudG9TdHJpbmcoKSArICIgeWllbGRlZCAiICsgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZD1JT0V4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0WmVyb0xlbmd0aEJ5dGVCdWZmZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBEcmF3YWJsZSBkcmF3YWJsZSA9IEltYWdlRGVjb2Rlci5kZWNvZGVEcmF3YWJsZSgKKyAgICAgICAgICAgIEltYWdlRGVjb2Rlci5jcmVhdGVTb3VyY2UoQnl0ZUJ1ZmZlci53cmFwKG5ldyBieXRlWzEwXSwgMCwgMCkpKTsKKyAgICAgICAgZmFpbCgic2hvdWxkIG5vdCBoYXZlIHJlYWNoZWQgaGVyZSEiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludGVyZmFjZSBCeXRlQnVmZmVyU3VwcGxpZXIgZXh0ZW5kcyBTdXBwbGllcjxCeXRlQnVmZmVyPiB7fTsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9mZnNldEJ5dGVBcnJheSgpIHsKKyAgICAgICAgZm9yIChSZWNvcmQgcmVjb3JkIDogUkVDT1JEUykgeworICAgICAgICAgICAgaW50IG9mZnNldCA9IDEwOworICAgICAgICAgICAgaW50IGV4dHJhID0gMTU7CisgICAgICAgICAgICBieXRlW10gYXJyYXkgPSBnZXRBc0J5dGVBcnJheShyZWNvcmQucmVzSWQsIG9mZnNldCwgZXh0cmEpOworICAgICAgICAgICAgaW50IGxlbmd0aCA9IGFycmF5Lmxlbmd0aCAtIGV4dHJhIC0gb2Zmc2V0OworICAgICAgICAgICAgLy8gVXNlZCBmb3IgU291cmNlQ3JlYXRvcnMgdGhhdCBzZXQgYm90aCBhIHBvc2l0aW9uIGFuZCBhbiBvZmZzZXQuCisgICAgICAgICAgICBpbnQgbXlPZmZzZXQgPSAzOworICAgICAgICAgICAgaW50IG15UG9zaXRpb24gPSA3OworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG9mZnNldCwgbXlPZmZzZXQgKyBteVBvc2l0aW9uKTsKKworICAgICAgICAgICAgQnl0ZUJ1ZmZlclN1cHBsaWVyW10gc3VwcGxpZXJzID0gbmV3IEJ5dGVCdWZmZXJTdXBwbGllcltdIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxseSwgdGhpcyBnaXZlcyB0aGUgYnVmZmVyIGEgcG9zaXRpb24sIGJ1dCBub3QgYW4gb2Zmc2V0LgorICAgICAgICAgICAgICAgICAgICAoKSAtPiBCeXRlQnVmZmVyLndyYXAoYXJyYXksIG9mZnNldCwgbGVuZ3RoKSwKKyAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSwgYnV0IG1ha2UgaXQgcmVhZE9ubHkgdG8gZW5zdXJlIHRoYXQgd2UgdGVzdCB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gQnl0ZUJ1ZmZlclNvdXJjZSByYXRoZXIgdGhhbiB0aGUgQnl0ZUFycmF5U291cmNlLgorICAgICAgICAgICAgICAgICAgICAoKSAtPiBCeXRlQnVmZmVyLndyYXAoYXJyYXksIG9mZnNldCwgbGVuZ3RoKS5hc1JlYWRPbmx5QnVmZmVyKCksCisgICAgICAgICAgICAgICAgICAgICgpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNsaWNlKCkgdG8gZ2l2ZSB0aGUgYnVmZmVyIGFuIG9mZnNldC4KKyAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgYnVmID0gQnl0ZUJ1ZmZlci53cmFwKGFycmF5LCAwLCBhcnJheS5sZW5ndGggLSBleHRyYSk7CisgICAgICAgICAgICAgICAgICAgICAgICBidWYucG9zaXRpb24ob2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBidWYuc2xpY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgKCkgLT4geworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSwgYnV0IG1ha2UgaXQgcmVhZE9ubHkgdG8gZW5zdXJlIHRoYXQgd2UgdGVzdCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJ5dGVCdWZmZXJTb3VyY2UgcmF0aGVyIHRoYW4gdGhlIEJ5dGVBcnJheVNvdXJjZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgYnVmID0gQnl0ZUJ1ZmZlci53cmFwKGFycmF5LCAwLCBhcnJheS5sZW5ndGggLSBleHRyYSk7CisgICAgICAgICAgICAgICAgICAgICAgICBidWYucG9zaXRpb24ob2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBidWYuc2xpY2UoKS5hc1JlYWRPbmx5QnVmZmVyKCk7CisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICgpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSBib3RoIGEgcG9zaXRpb24gYW5kIGFuIG9mZnNldC4KKyAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgYnVmID0gQnl0ZUJ1ZmZlci53cmFwKGFycmF5LCBteU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5sZW5ndGggLSBleHRyYSAtIG15T2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiA9IGJ1Zi5zbGljZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnVmLnBvc2l0aW9uKG15UG9zaXRpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgKCkgLT4geworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSwgYXMgcmVhZE9ubHkuCisgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIGJ1ZiA9IEJ5dGVCdWZmZXIud3JhcChhcnJheSwgbXlPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5Lmxlbmd0aCAtIGV4dHJhIC0gbXlPZmZzZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnVmID0gYnVmLnNsaWNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBidWYucG9zaXRpb24obXlQb3NpdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnVmLmFzUmVhZE9ubHlCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgKCkgLT4geworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGlyZWN0IEJ5dGVCdWZmZXIgd2l0aCBhIHBvc2l0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBidWYgPSBCeXRlQnVmZmVyLmFsbG9jYXRlRGlyZWN0KGFycmF5Lmxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBidWYucHV0KGFycmF5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5wb3NpdGlvbihvZmZzZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgKCkgLT4geworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2xpY2VkIGRpcmVjdCBCeXRlQnVmZmVyLCBmb3IgYW4gb2Zmc2V0LgorICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBidWYgPSBCeXRlQnVmZmVyLmFsbG9jYXRlRGlyZWN0KGFycmF5Lmxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBidWYucHV0KGFycmF5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5wb3NpdGlvbihvZmZzZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1Zi5zbGljZSgpOworICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAoKSAtPiB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBEaXJlY3QgQnl0ZUJ1ZmZlciB3aXRoIHBvc2l0aW9uIGFuZCBvZmZzZXQuCisgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIGJ1ZiA9IEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3QoYXJyYXkubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5wdXQoYXJyYXkpOworICAgICAgICAgICAgICAgICAgICAgICAgYnVmLnBvc2l0aW9uKG15T2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiA9IGJ1Zi5zbGljZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnVmLnBvc2l0aW9uKG15UG9zaXRpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1cHBsaWVycy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgYnVmZmVyID0gc3VwcGxpZXJzW2ldLmdldCgpOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBwb3NpdGlvbiA9IGJ1ZmZlci5wb3NpdGlvbigpOworICAgICAgICAgICAgICAgIEltYWdlRGVjb2Rlci5Tb3VyY2Ugc3JjID0gSW1hZ2VEZWNvZGVyLmNyZWF0ZVNvdXJjZShidWZmZXIpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIERyYXdhYmxlIGRyYXdhYmxlID0gSW1hZ2VEZWNvZGVyLmRlY29kZURyYXdhYmxlKHNyYyk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZHJhd2FibGUpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgZmFpbCgiRmFpbGVkIHdpdGggZXhjZXB0aW9uICIgKyBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJNaXNtYXRjaCBmb3Igc3VwcGxpZXIgIiArIGksCisgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiwgYnVmZmVyLnBvc2l0aW9uKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VTb3VyY2UoKSB7CisgICAgICAgIGZvciAoUmVjb3JkIHJlY29yZCA6IFJFQ09SRFMpIHsKKyAgICAgICAgICAgIEltYWdlRGVjb2Rlci5Tb3VyY2Ugc3JjID0gSW1hZ2VEZWNvZGVyLmNyZWF0ZVNvdXJjZShtUmVzLCByZWNvcmQucmVzSWQpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBEcmF3YWJsZSBkcmF3YWJsZSA9IEltYWdlRGVjb2Rlci5kZWNvZGVEcmF3YWJsZShzcmMpOworICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZHJhd2FibGUpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGZhaWwoIkZhaWxlZCAiICsgZ2V0QXNSZXNvdXJjZVVyaShyZWNvcmQucmVzSWQpICsgIiB3aXRoICIgKyBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgQml0bWFwRHJhd2FibGUgZGVjb2RlQml0bWFwRHJhd2FibGUoaW50IHJlc0lkKSB7CisgICAgICAgIEltYWdlRGVjb2Rlci5Tb3VyY2Ugc3JjID0gSW1hZ2VEZWNvZGVyLmNyZWF0ZVNvdXJjZShtUmVzLCByZXNJZCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBEcmF3YWJsZSBkcmF3YWJsZSA9IEltYWdlRGVjb2Rlci5kZWNvZGVEcmF3YWJsZShzcmMpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChkcmF3YWJsZSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGRyYXdhYmxlIGluc3RhbmNlb2YgQml0bWFwRHJhd2FibGUpOworICAgICAgICAgICAgcmV0dXJuIChCaXRtYXBEcmF3YWJsZSkgZHJhd2FibGU7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkZhaWxlZCAiICsgZ2V0QXNSZXNvdXJjZVVyaShyZXNJZCkgKyAiIHdpdGggIiArIGUpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVcHNjYWxlKCkgeworICAgICAgICBmaW5hbCBpbnQgb3JpZ2luYWxEZW5zaXR5ID0gbVJlcy5nZXREaXNwbGF5TWV0cmljcygpLmRlbnNpdHlEcGk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZvciAoUmVjb3JkIHJlY29yZCA6IFJFQ09SRFMpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcmVzSWQgPSByZWNvcmQucmVzSWQ7CisKKyAgICAgICAgICAgICAgICAvLyBTZXQgYSBoaWdoIGRlbnNpdHkuIFRoaXMgd2lsbCByZXN1bHQgaW4gYSBsYXJnZXIgZHJhd2FibGUsIGJ1dAorICAgICAgICAgICAgICAgIC8vIG5vdCBhIGxhcmdlciBCaXRtYXAuCisgICAgICAgICAgICAgICAgbVJlcy5nZXREaXNwbGF5TWV0cmljcygpLmRlbnNpdHlEcGkgPSBEaXNwbGF5TWV0cmljcy5ERU5TSVRZX1hYWEhJR0g7CisgICAgICAgICAgICAgICAgQml0bWFwRHJhd2FibGUgZHJhd2FibGUgPSBkZWNvZGVCaXRtYXBEcmF3YWJsZShyZXNJZCk7CisKKyAgICAgICAgICAgICAgICBCaXRtYXAgYm0gPSBkcmF3YWJsZS5nZXRCaXRtYXAoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVjb3JkLndpZHRoLCBibS5nZXRXaWR0aCgpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVjb3JkLmhlaWdodCwgYm0uZ2V0SGVpZ2h0KCkpOworCisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShkcmF3YWJsZS5nZXRJbnRyaW5zaWNXaWR0aCgpID4gcmVjb3JkLndpZHRoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGRyYXdhYmxlLmdldEludHJpbnNpY0hlaWdodCgpID4gcmVjb3JkLmhlaWdodCk7CisKKyAgICAgICAgICAgICAgICAvLyBTZXQgYSBsb3cgZGVuc2l0eS4gVGhpcyB3aWxsIHJlc3VsdCBpbiBhIHNtYWxsZXIgZHJhd2FibGUgYW5kCisgICAgICAgICAgICAgICAgLy8gQml0bWFwLCB1bmxlc3MgdGhlIHRydWUgZGVuc2l0eSBpcyBERU5TSVRZX01FRElVTSwgd2hpY2ggbWF0Y2hlcworICAgICAgICAgICAgICAgIC8vIHRoZSBkZW5zaXR5IG9mIHRoZSBhc3NldC4KKyAgICAgICAgICAgICAgICBtUmVzLmdldERpc3BsYXlNZXRyaWNzKCkuZGVuc2l0eURwaSA9IERpc3BsYXlNZXRyaWNzLkRFTlNJVFlfTE9XOworICAgICAgICAgICAgICAgIGRyYXdhYmxlID0gZGVjb2RlQml0bWFwRHJhd2FibGUocmVzSWQpOworICAgICAgICAgICAgICAgIGJtID0gZHJhd2FibGUuZ2V0Qml0bWFwKCk7CisKKyAgICAgICAgICAgICAgICBpZiAob3JpZ2luYWxEZW5zaXR5ID09IERpc3BsYXlNZXRyaWNzLkRFTlNJVFlfTUVESVVNKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEFsdGhvdWdoIHdlJ3ZlIG1vZGlmaWVkIHxkZW5zaXR5RHBpfCwgSW1hZ2VEZWNvZGVyIGtub3dzIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyB0cnVlIGRlbnNpdHkgbWF0Y2hlcyB0aGUgYXNzZXQsIHNvIGl0IHdpbGwgbm90IGRvd25zY2FsZSBhdAorICAgICAgICAgICAgICAgICAgICAvLyBkZWNvZGUgdGltZS4KKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJtLmdldFdpZHRoKCksIHJlY29yZC53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhibS5nZXRIZWlnaHQoKSwgcmVjb3JkLmhlaWdodCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGRyYXdhYmxlIHNob3VsZCBzdGlsbCBiZSBzbWFsbGVyLgorICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGJtLmdldFdpZHRoKCkgPiBkcmF3YWJsZS5nZXRJbnRyaW5zaWNXaWR0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShibS5nZXRIZWlnaHQoKSA+IGRyYXdhYmxlLmdldEludHJpbnNpY0hlaWdodCgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGUgYml0bWFwIGlzIHNjYWxlZCBkb3duIGF0IGRlY29kZSB0aW1lLCBzbyBpdCBtYXRjaGVzIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBkcmF3YWJsZSBzaXplLCBhbmQgaXMgc21hbGxlciB0aGFuIHRoZSBvcmlnaW5hbC4KKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShibS5nZXRXaWR0aCgpIDwgcmVjb3JkLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShibS5nZXRIZWlnaHQoKSA8IHJlY29yZC5oZWlnaHQpOworCisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhibS5nZXRXaWR0aCgpLCBkcmF3YWJsZS5nZXRJbnRyaW5zaWNXaWR0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJtLmdldEhlaWdodCgpLCBkcmF3YWJsZS5nZXRJbnRyaW5zaWNIZWlnaHQoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgbVJlcy5nZXREaXNwbGF5TWV0cmljcygpLmRlbnNpdHlEcGkgPSBvcmlnaW5hbERlbnNpdHk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBc3NldFJlY29yZCB7CisgICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgbmFtZTsKKyAgICAgICAgcHVibGljIGZpbmFsIGludCB3aWR0aDsKKyAgICAgICAgcHVibGljIGZpbmFsIGludCBoZWlnaHQ7CisgICAgICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzRjE2OworICAgICAgICBwcml2YXRlIGZpbmFsIENvbG9yU3BhY2UgbUNvbG9yU3BhY2U7CisKKyAgICAgICAgQXNzZXRSZWNvcmQoU3RyaW5nIG5hbWUsIGludCB3aWR0aCwgaW50IGhlaWdodCwgYm9vbGVhbiBpc0YxNiwgQ29sb3JTcGFjZSBjb2xvclNwYWNlKSB7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoOworICAgICAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgICAgICB0aGlzLmlzRjE2ID0gaXNGMTY7CisgICAgICAgICAgICBtQ29sb3JTcGFjZSA9IGNvbG9yU3BhY2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjaGVja0NvbG9yU3BhY2UoQ29sb3JTcGFjZSByZXF1ZXN0ZWQsIENvbG9yU3BhY2UgYWN0dWFsKSB7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFjdHVhbCk7CisgICAgICAgICAgICBpZiAodGhpcy5pc0YxNikgeworICAgICAgICAgICAgICAgIGFzc2VydFNhbWUoQ29sb3JTcGFjZS5nZXQoQ29sb3JTcGFjZS5OYW1lZC5MSU5FQVJfRVhURU5ERURfU1JHQiksIGFjdHVhbCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcXVlc3RlZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0U2FtZShyZXF1ZXN0ZWQsIGFjdHVhbCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1Db2xvclNwYWNlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHModGhpcy5uYW1lLCAiVW5rbm93biIsIGFjdHVhbC5nZXROYW1lKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRTYW1lKHRoaXMubmFtZSwgbUNvbG9yU3BhY2UsIGFjdHVhbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBc3NldFJlY29yZFtdIEFTU0VUUyA9IG5ldyBBc3NldFJlY29yZFtdIHsKKyAgICAgICAgICAgIC8vIEEgbnVsbCBDb2xvclNwYWNlIG1lYW5zIHRoYXQgdGhlIGNvbG9yIHNwYWNlIGlzICJVbmtub3duIi4KKyAgICAgICAgICAgIG5ldyBBc3NldFJlY29yZCgiYWxtb3N0LXJlZC1hZG9iZS5wbmciLCAxLCAxLCBmYWxzZSwgbnVsbCksCisgICAgICAgICAgICBuZXcgQXNzZXRSZWNvcmQoImdyZWVuLXAzLnBuZyIsIDY0LCA2NCwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgIENvbG9yU3BhY2UuZ2V0KENvbG9yU3BhY2UuTmFtZWQuRElTUExBWV9QMykpLAorICAgICAgICAgICAgbmV3IEFzc2V0UmVjb3JkKCJncmVlbi1zcmdiLnBuZyIsIDY0LCA2NCwgZmFsc2UsIHNTUkdCKSwKKyAgICAgICAgICAgIG5ldyBBc3NldFJlY29yZCgicHJvcGhvdG8tcmdiYTE2Zi5wbmciLCA2NCwgNjQsIHRydWUsCisgICAgICAgICAgICAgICAgICAgIENvbG9yU3BhY2UuZ2V0KENvbG9yU3BhY2UuTmFtZWQuTElORUFSX0VYVEVOREVEX1NSR0IpKSwKKyAgICAgICAgICAgIG5ldyBBc3NldFJlY29yZCgicHVycGxlLWNteWsucG5nIiwgNjQsIDY0LCBmYWxzZSwgc1NSR0IpLAorICAgICAgICAgICAgbmV3IEFzc2V0UmVjb3JkKCJwdXJwbGUtZGlzcGxheXByb2ZpbGUucG5nIiwgNjQsIDY0LCBmYWxzZSwgbnVsbCksCisgICAgICAgICAgICBuZXcgQXNzZXRSZWNvcmQoInJlZC1hZG9iZXJnYi5wbmciLCA2NCwgNjQsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICBDb2xvclNwYWNlLmdldChDb2xvclNwYWNlLk5hbWVkLkFET0JFX1JHQikpLAorICAgICAgICAgICAgbmV3IEFzc2V0UmVjb3JkKCJ0cmFuc2x1Y2VudC1ncmVlbi1wMy5wbmciLCA2NCwgNjQsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICBDb2xvclNwYWNlLmdldChDb2xvclNwYWNlLk5hbWVkLkRJU1BMQVlfUDMpKSwKKyAgICB9OworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXNzZXRTb3VyY2UoKSB7CisgICAgICAgIEFzc2V0TWFuYWdlciBhc3NldHMgPSBtUmVzLmdldEFzc2V0cygpOworICAgICAgICBmb3IgKEFzc2V0UmVjb3JkIHJlY29yZCA6IEFTU0VUUykgeworICAgICAgICAgICAgSW1hZ2VEZWNvZGVyLlNvdXJjZSBzcmMgPSBJbWFnZURlY29kZXIuY3JlYXRlU291cmNlKGFzc2V0cywgcmVjb3JkLm5hbWUpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBCaXRtYXAgYm0gPSBJbWFnZURlY29kZXIuZGVjb2RlQml0bWFwKHNyYywgKGRlY29kZXIsIGluZm8sIHMpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlY29yZC5pc0YxNikgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ1RTIGluZnJhc3RydWN0dXJlIGZhaWxzIHRvIGNyZWF0ZSBGMTYgSEFSRFdBUkUgQml0bWFwcywgc28gdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3dpdGNoZXMgdG8gdXNpbmcgc29mdHdhcmUuCisgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyLnNldEFsbG9jYXRvcihJbWFnZURlY29kZXIuQUxMT0NBVE9SX1NPRlRXQVJFKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHJlY29yZC5jaGVja0NvbG9yU3BhY2UobnVsbCwgaW5mby5nZXRDb2xvclNwYWNlKCkpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZWNvcmQubmFtZSwgcmVjb3JkLndpZHRoLCBibS5nZXRXaWR0aCgpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVjb3JkLm5hbWUsIHJlY29yZC5oZWlnaHQsIGJtLmdldEhlaWdodCgpKTsKKyAgICAgICAgICAgICAgICByZWNvcmQuY2hlY2tDb2xvclNwYWNlKG51bGwsIGJtLmdldENvbG9yU3BhY2UoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZmFpbCgiRmFpbGVkIHRvIGRlY29kZSBhc3NldCAiICsgcmVjb3JkLm5hbWUgKyAiIHdpdGggIiArIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGFyZ2V0Q29sb3JTcGFjZSgpIHsKKyAgICAgICAgQXNzZXRNYW5hZ2VyIGFzc2V0cyA9IG1SZXMuZ2V0QXNzZXRzKCk7CisgICAgICAgIGZvciAoQXNzZXRSZWNvcmQgcmVjb3JkIDogQVNTRVRTKSB7CisgICAgICAgICAgICBJbWFnZURlY29kZXIuU291cmNlIHNyYyA9IEltYWdlRGVjb2Rlci5jcmVhdGVTb3VyY2UoYXNzZXRzLCByZWNvcmQubmFtZSk7CisgICAgICAgICAgICBmb3IgKENvbG9yU3BhY2UgY3MgOiBuZXcgQ29sb3JTcGFjZVtdIHsKKyAgICAgICAgICAgICAgICAgICAgc1NSR0IsCisgICAgICAgICAgICAgICAgICAgIENvbG9yU3BhY2UuZ2V0KENvbG9yU3BhY2UuTmFtZWQuTElORUFSX0VYVEVOREVEX1NSR0IpLAorICAgICAgICAgICAgICAgICAgICBDb2xvclNwYWNlLmdldChDb2xvclNwYWNlLk5hbWVkLkRJU1BMQVlfUDMpLAorICAgICAgICAgICAgICAgICAgICBDb2xvclNwYWNlLmdldChDb2xvclNwYWNlLk5hbWVkLkFET0JFX1JHQiksCisgICAgICAgICAgICAgICAgICAgIENvbG9yU3BhY2UuZ2V0KENvbG9yU3BhY2UuTmFtZWQuQlQ3MDkpLAorICAgICAgICAgICAgICAgICAgICBDb2xvclNwYWNlLmdldChDb2xvclNwYWNlLk5hbWVkLkJUMjAyMCksCisgICAgICAgICAgICAgICAgICAgIENvbG9yU3BhY2UuZ2V0KENvbG9yU3BhY2UuTmFtZWQuRENJX1AzKSwKKyAgICAgICAgICAgICAgICAgICAgQ29sb3JTcGFjZS5nZXQoQ29sb3JTcGFjZS5OYW1lZC5OVFNDXzE5NTMpLAorICAgICAgICAgICAgICAgICAgICBDb2xvclNwYWNlLmdldChDb2xvclNwYWNlLk5hbWVkLlNNUFRFX0MpLAorICAgICAgICAgICAgICAgICAgICBDb2xvclNwYWNlLmdldChDb2xvclNwYWNlLk5hbWVkLlBST19QSE9UT19SR0IpLAorICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogVGhlc2Ugd2lsbCBub3QgbWF0Y2ggZHVlIHRvIGIvNzcyNzY1MzMuCisgICAgICAgICAgICAgICAgICAgIC8vIENvbG9yU3BhY2UuZ2V0KENvbG9yU3BhY2UuTmFtZWQuTElORUFSX1NSR0IpLAorICAgICAgICAgICAgICAgICAgICAvLyBDb2xvclNwYWNlLmdldChDb2xvclNwYWNlLk5hbWVkLkFDRVMpLAorICAgICAgICAgICAgICAgICAgICAvLyBDb2xvclNwYWNlLmdldChDb2xvclNwYWNlLk5hbWVkLkFDRVNDRyksCisgICAgICAgICAgICB9KSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgQml0bWFwIGJtID0gSW1hZ2VEZWNvZGVyLmRlY29kZUJpdG1hcChzcmMsIChkZWNvZGVyLCBpbmZvLCBzKSAtPiB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVjb3JkLmlzRjE2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ1RTIGluZnJhc3RydWN0dXJlIGZhaWxzIHRvIGNyZWF0ZSBGMTYgSEFSRFdBUkUgQml0bWFwcywgc28gdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN3aXRjaGVzIHRvIHVzaW5nIHNvZnR3YXJlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXIuc2V0QWxsb2NhdG9yKEltYWdlRGVjb2Rlci5BTExPQ0FUT1JfU09GVFdBUkUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2Rlci5zZXRUYXJnZXRDb2xvclNwYWNlKGNzKTsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgIHJlY29yZC5jaGVja0NvbG9yU3BhY2UoY3MsIGJtLmdldENvbG9yU3BhY2UoKSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBmYWlsKCJGYWlsZWQgdG8gZGVjb2RlIGFzc2V0ICIgKyByZWNvcmQubmFtZSArICIgdG8gIiArIGNzICsgIiB3aXRoICIgKyBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUYXJnZXRDb2xvclNwYWNlTm9uUkdCKCkgeworICAgICAgICBJbWFnZURlY29kZXIuU291cmNlIHNyYyA9IG1DcmVhdG9yc1swXS5hcHBseShSLmRyYXdhYmxlLnBuZ190ZXN0KTsKKyAgICAgICAgZm9yIChDb2xvclNwYWNlIGNzIDogbmV3IENvbG9yU3BhY2VbXSB7CisgICAgICAgICAgICAgICAgQ29sb3JTcGFjZS5nZXQoQ29sb3JTcGFjZS5OYW1lZC5FWFRFTkRFRF9TUkdCKSwKKyAgICAgICAgICAgICAgICBDb2xvclNwYWNlLmdldChDb2xvclNwYWNlLk5hbWVkLkNJRV9MQUIpLAorICAgICAgICAgICAgICAgIENvbG9yU3BhY2UuZ2V0KENvbG9yU3BhY2UuTmFtZWQuQ0lFX1hZWiksCisgICAgICAgIH0pIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgSW1hZ2VEZWNvZGVyLmRlY29kZURyYXdhYmxlKHNyYywgKGRlY29kZXIsIGluZm8sIHMpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgZGVjb2Rlci5zZXRUYXJnZXRDb2xvclNwYWNlKGNzKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGZvciBzZXRUYXJnZXRDb2xvclNwYWNlKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgY3MgKyAiKSEiKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJGYWlsZWQgdG8gZGVjb2RlIHBuZ190ZXN0IHdpdGggIiArIGUpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlsbGVnYWwpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGV4cGVjdGVkLgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBCaXRtYXAgZHJhd1RvQml0bWFwKERyYXdhYmxlIGRyKSB7CisgICAgICAgIEJpdG1hcCBibSA9IEJpdG1hcC5jcmVhdGVCaXRtYXAoZHIuZ2V0SW50cmluc2ljV2lkdGgoKSwgZHIuZ2V0SW50cmluc2ljSGVpZ2h0KCksCisgICAgICAgICAgICAgICAgQml0bWFwLkNvbmZpZy5BUkdCXzg4ODgpOworICAgICAgICBDYW52YXMgY2FudmFzID0gbmV3IENhbnZhcyhibSk7CisgICAgICAgIGRyLmRyYXcoY2FudmFzKTsKKyAgICAgICAgcmV0dXJuIGJtOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0UmV1c2UoSW1hZ2VEZWNvZGVyLlNvdXJjZSBzcmMsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIERyYXdhYmxlIGZpcnN0ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpcnN0ID0gSW1hZ2VEZWNvZGVyLmRlY29kZURyYXdhYmxlKHNyYywgKGRlY29kZXIsIGluZm8sIHMpIC0+IHsKKyAgICAgICAgICAgICAgICBkZWNvZGVyLnNldEFsbG9jYXRvcihJbWFnZURlY29kZXIuQUxMT0NBVE9SX1NPRlRXQVJFKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJGYWlsZWQgb24gZmlyc3QgZGVjb2RlIG9mICIgKyBuYW1lICsgIiB1c2luZyAiICsgc3JjICsgIiEiKTsKKyAgICAgICAgfQorCisgICAgICAgIERyYXdhYmxlIHNlY29uZCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZWNvbmQgPSBJbWFnZURlY29kZXIuZGVjb2RlRHJhd2FibGUoc3JjLCAoZGVjb2RlciwgaW5mbywgcykgLT4geworICAgICAgICAgICAgICAgIGRlY29kZXIuc2V0QWxsb2NhdG9yKEltYWdlRGVjb2Rlci5BTExPQ0FUT1JfU09GVFdBUkUpOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkZhaWxlZCBvbiBzZWNvbmQgZGVjb2RlIG9mICIgKyBuYW1lICsgIiB1c2luZyAiICsgc3JjICsgIiEiKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydEVxdWFscyhmaXJzdC5nZXRJbnRyaW5zaWNXaWR0aCgpLCBzZWNvbmQuZ2V0SW50cmluc2ljV2lkdGgoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmaXJzdC5nZXRJbnRyaW5zaWNIZWlnaHQoKSwgc2Vjb25kLmdldEludHJpbnNpY0hlaWdodCgpKTsKKworICAgICAgICBCaXRtYXAgYm0xID0gZHJhd1RvQml0bWFwKGZpcnN0KTsKKyAgICAgICAgQml0bWFwIGJtMiA9IGRyYXdUb0JpdG1hcChzZWNvbmQpOworICAgICAgICBCaXRtYXBVdGlscy5jb21wYXJlQml0bWFwcyhibTEsIGJtMik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJldXNlKCkgeworICAgICAgICBmb3IgKFJlY29yZCByZWNvcmQgOiBSRUNPUkRTKSB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGdldEFzUmVzb3VyY2VVcmkocmVjb3JkLnJlc0lkKS50b1N0cmluZygpOworICAgICAgICAgICAgZm9yIChTb3VyY2VDcmVhdG9yIGYgOiBtQ3JlYXRvcnMpIHsKKyAgICAgICAgICAgICAgICBJbWFnZURlY29kZXIuU291cmNlIHNyYyA9IGYuYXBwbHkocmVjb3JkLnJlc0lkKTsKKyAgICAgICAgICAgICAgICB0ZXN0UmV1c2Uoc3JjLCBuYW1lKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEltYWdlRGVjb2Rlci5Tb3VyY2Ugc3JjID0gSW1hZ2VEZWNvZGVyLmNyZWF0ZVNvdXJjZShtUmVzLCByZWNvcmQucmVzSWQpOworICAgICAgICAgICAgICAgIHRlc3RSZXVzZShzcmMsIG5hbWUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKFVyaUNyZWF0b3IgZiA6IG1VcmlDcmVhdG9ycykgeworICAgICAgICAgICAgICAgIFVyaSB1cmkgPSBmLmFwcGx5KHJlY29yZC5yZXNJZCk7CisgICAgICAgICAgICAgICAgSW1hZ2VEZWNvZGVyLlNvdXJjZSBzcmMgPSBJbWFnZURlY29kZXIuY3JlYXRlU291cmNlKG1Db250ZW50UmVzb2x2ZXIsIHVyaSk7CisgICAgICAgICAgICAgICAgdGVzdFJldXNlKHNyYywgdXJpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSW1hZ2VEZWNvZGVyLlNvdXJjZSBzcmMgPSBJbWFnZURlY29kZXIuY3JlYXRlU291cmNlKGdldEFzRmlsZShyZWNvcmQucmVzSWQpKTsKKyAgICAgICAgICAgICAgICB0ZXN0UmV1c2Uoc3JjLCBuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEFzc2V0TWFuYWdlciBhc3NldHMgPSBtUmVzLmdldEFzc2V0cygpOworICAgICAgICBmb3IgKEFzc2V0UmVjb3JkIHJlY29yZCA6IEFTU0VUUykgeworICAgICAgICAgICAgSW1hZ2VEZWNvZGVyLlNvdXJjZSBzcmMgPSBJbWFnZURlY29kZXIuY3JlYXRlU291cmNlKGFzc2V0cywgcmVjb3JkLm5hbWUpOworICAgICAgICAgICAgdGVzdFJldXNlKHNyYywgcmVjb3JkLm5hbWUpOworICAgICAgICB9CisKKworICAgICAgICBJbWFnZURlY29kZXIuU291cmNlIHNyYyA9IG1DcmVhdG9yc1swXS5hcHBseShSLmRyYXdhYmxlLmFuaW1hdGVkKTsKKyAgICAgICAgdGVzdFJldXNlKHNyYywgImFuaW1hdGVkLmdpZiIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9JbnRlcnBvbGF0b3JUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvSW50ZXJwb2xhdG9yVGVzdC5qYXZhCmluZGV4IDc2YTlmODAuLjFiYTgwODkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9JbnRlcnBvbGF0b3JUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL0ludGVycG9sYXRvclRlc3QuamF2YQpAQCAtMjQsOCArMjQsOSBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuSW50ZXJwb2xhdG9yOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuSW50ZXJwb2xhdG9yLlJlc3VsdDsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL0ludGVycG9sYXRvcl9SZXN1bHRUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvSW50ZXJwb2xhdG9yX1Jlc3VsdFRlc3QuamF2YQppbmRleCBlNmZkMzk3Li5iOTdjNzExIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvSW50ZXJwb2xhdG9yX1Jlc3VsdFRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvSW50ZXJwb2xhdG9yX1Jlc3VsdFRlc3QuamF2YQpAQCAtMTksMTAgKzE5LDkgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkludGVycG9sYXRvci5SZXN1bHQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiAKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL0xpZ2h0aW5nQ29sb3JGaWx0ZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvTGlnaHRpbmdDb2xvckZpbHRlclRlc3QuamF2YQppbmRleCBjN2JlZmE4Li41ODkxNmY3IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvTGlnaHRpbmdDb2xvckZpbHRlclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvTGlnaHRpbmdDb2xvckZpbHRlclRlc3QuamF2YQpAQCAtMjIsOCArMjIsOSBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3I7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5MaWdodGluZ0NvbG9yRmlsdGVyOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNvbG9yVXRpbHM7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9MaW5lYXJHcmFkaWVudFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9MaW5lYXJHcmFkaWVudFRlc3QuamF2YQppbmRleCAxODVlNmExLi40YmM0NTFiIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvTGluZWFyR3JhZGllbnRUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL0xpbmVhckdyYWRpZW50VGVzdC5qYXZhCkBAIC0yNyw4ICsyNyw5IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5NYXRyaXg7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlNoYWRlci5UaWxlTW9kZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ29sb3JVdGlsczsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL01hc2tGaWx0ZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvTWFza0ZpbHRlclRlc3QuamF2YQppbmRleCA2ZGZhOTZlLi5mZTNhMjUwIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvTWFza0ZpbHRlclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvTWFza0ZpbHRlclRlc3QuamF2YQpAQCAtMTcsOCArMTcsOSBAQAogcGFja2FnZSBhbmRyb2lkLmdyYXBoaWNzLmN0czsKIAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTWFza0ZpbHRlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9NYXRyaXhUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvTWF0cml4VGVzdC5qYXZhCmluZGV4IGY0NTg3NzguLmQ2NzQxMWYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9NYXRyaXhUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL01hdHJpeFRlc3QuamF2YQpAQCAtMjYsOCArMjYsOSBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4LlNjYWxlVG9GaXQ7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0RjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvTWF0cml4X1NjYWxlVG9GaXRUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvTWF0cml4X1NjYWxlVG9GaXRUZXN0LmphdmEKaW5kZXggYmZhYjQ1ZC4uZTI3ZGUwYyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL01hdHJpeF9TY2FsZVRvRml0VGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9NYXRyaXhfU2NhbGVUb0ZpdFRlc3QuamF2YQpAQCAtMTksOCArMTksOSBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4LlNjYWxlVG9GaXQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiAKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvTWVkaWFWdWxrYW5HcHVUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvTWVkaWFWdWxrYW5HcHVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y4YWNlZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9NZWRpYVZ1bGthbkdwdVRlc3QuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5ncmFwaGljcy5jdHM7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlNtYWxsVGVzdDsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKKworQFNtYWxsVGVzdAorQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBNZWRpYVZ1bGthbkdwdVRlc3QgeworCisgICAgc3RhdGljIHsKKyAgICAgICAgU3lzdGVtLmxvYWRMaWJyYXJ5KCJjdHNncmFwaGljc19qbmkiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludFtdIGdldEZyYW1lUGl4ZWxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEFzc2V0TWFuYWdlciBhc3NldHMgPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCkuZ2V0QXNzZXRzKCk7CisgICAgICAgIEJpdG1hcCBiaXRtYXAgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVN0cmVhbShhc3NldHMub3BlbigidGVzdF92aWRlb19mcmFtZS5wbmciKSk7CisgICAgICAgIGludFtdIGZyYW1lUGl4ZWxzID0gbmV3IGludFtiaXRtYXAuZ2V0V2lkdGgoKSAqIGJpdG1hcC5nZXRIZWlnaHQoKV07CisgICAgICAgIGJpdG1hcC5nZXRQaXhlbHMoZnJhbWVQaXhlbHMsIDAsIGJpdG1hcC5nZXRXaWR0aCgpLCAwLCAwLCBiaXRtYXAuZ2V0V2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiaXRtYXAuZ2V0SGVpZ2h0KCkpOworICAgICAgICByZXR1cm4gZnJhbWVQaXhlbHM7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWVkaWFJbXBvcnRBbmRSZW5kZXJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbG9hZE1lZGlhQW5kVmVyaWZ5RnJhbWVJbXBvcnQoSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpLmdldEFzc2V0cygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdF92aWRlby5tcDQiLCBnZXRGcmFtZVBpeGVscygpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBsb2FkTWVkaWFBbmRWZXJpZnlGcmFtZUltcG9ydChBc3NldE1hbmFnZXIgYXNzZXRNYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRbXSByZWZlcmVuY2VQaXhlbHMpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL01vdmllVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL01vdmllVGVzdC5qYXZhCmluZGV4IDIyZmE3YzMuLjY5YmQ2NDUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9Nb3ZpZVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvTW92aWVUZXN0LmphdmEKQEAgLTI3LDkgKzI3LDEwIEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Nb3ZpZTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLldpZGdldFRlc3RVdGlsczsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL05pbmVQYXRjaFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9OaW5lUGF0Y2hUZXN0LmphdmEKaW5kZXggMjA5NGQwMC4uYTQ5MTViNyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL05pbmVQYXRjaFRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvTmluZVBhdGNoVGVzdC5qYXZhCkBAIC0zMiw5ICszMiwxMCBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3RGOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL091dGxpbmVUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvT3V0bGluZVRlc3QuamF2YQppbmRleCBiOWE2NjdlLi5kYjY5MTBlIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvT3V0bGluZVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvT3V0bGluZVRlc3QuamF2YQpAQCAtMjMsOCArMjMsOSBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuT3V0bGluZTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhdGg7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1BhaW50RmxhZ3NEcmF3RmlsdGVyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1BhaW50RmxhZ3NEcmF3RmlsdGVyVGVzdC5qYXZhCmluZGV4IGU0NjYwOTkuLjQwYTc3YzggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9QYWludEZsYWdzRHJhd0ZpbHRlclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvUGFpbnRGbGFnc0RyYXdGaWx0ZXJUZXN0LmphdmEKQEAgLTI3LDggKzI3LDkgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50LkFsaWduOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnRGbGFnc0RyYXdGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1BhaW50VGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1BhaW50VGVzdC5qYXZhCmluZGV4IGYwZDVjYjguLmYzNmFhNWQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9QYWludFRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvUGFpbnRUZXN0LmphdmEKQEAgLTE4LDcgKzE4LDYgQEAKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIApAQCAtMzksMjAgKzM4LDIwIEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5TaGFkZXI7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5UeXBlZmFjZTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlhmZXJtb2RlOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZm9udHMuRm9udFZhcmlhdGlvbkF4aXM7CiBpbXBvcnQgYW5kcm9pZC5vcy5Mb2NhbGVMaXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmVkU3RyaW5nOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNkZFRlc3Q7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DZGRUZXN0OwotCiBAU21hbGxUZXN0CiBAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQogcHVibGljIGNsYXNzIFBhaW50VGVzdCB7CkBAIC0xNjQ1LDQgKzE2NDQsODIgQEAKICAgICAgICAgcC5zZXRFbGVnYW50VGV4dEhlaWdodChmYWxzZSk7CiAgICAgICAgIGFzc2VydEZhbHNlKHAuaXNFbGVnYW50VGV4dEhlaWdodCgpKTsKICAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHNGb3JUZXh0TWVhc3VybWVudCgpIHsKKyAgICAgICAgUGFpbnQgcDEgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgUGFpbnQgcDIgPSBuZXcgUGFpbnQoKTsKKworICAgICAgICBhc3NlcnRUcnVlKHAxLmVxdWFsc0ZvclRleHRNZWFzdXJlbWVudChwMikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVxdWFsc0ZvclRleHRNZWFzdXJtZW50X3RleHRTaXplKCkgeworICAgICAgICBQYWludCBwMSA9IG5ldyBQYWludCgpOworICAgICAgICBQYWludCBwMiA9IG5ldyBQYWludCgpOworCisgICAgICAgIHAxLnNldFRleHRTaXplKHAyLmdldFRleHRTaXplKCkgKiAyLjBmKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocDEuZXF1YWxzRm9yVGV4dE1lYXN1cmVtZW50KHAyKSk7CisgICAgICAgIHAxLnNldFRleHRTaXplKHAyLmdldFRleHRTaXplKCkpOworICAgICAgICBhc3NlcnRUcnVlKHAxLmVxdWFsc0ZvclRleHRNZWFzdXJlbWVudChwMikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVxdWFsc0ZvclRleHRNZWFzdXJtZW50X3RleHRTa2V3KCkgeworICAgICAgICBQYWludCBwMSA9IG5ldyBQYWludCgpOworICAgICAgICBQYWludCBwMiA9IG5ldyBQYWludCgpOworCisgICAgICAgIHAxLnNldFRleHRTa2V3WChwMi5nZXRUZXh0U2tld1goKSArIDIuMGYpOworICAgICAgICBhc3NlcnRGYWxzZShwMS5lcXVhbHNGb3JUZXh0TWVhc3VyZW1lbnQocDIpKTsKKyAgICAgICAgcDEuc2V0VGV4dFNrZXdYKHAyLmdldFRleHRTa2V3WCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShwMS5lcXVhbHNGb3JUZXh0TWVhc3VyZW1lbnQocDIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHNGb3JUZXh0TWVhc3VybWVudF90ZXh0U2NhbGUoKSB7CisgICAgICAgIFBhaW50IHAxID0gbmV3IFBhaW50KCk7CisgICAgICAgIFBhaW50IHAyID0gbmV3IFBhaW50KCk7CisKKyAgICAgICAgcDEuc2V0VGV4dFNjYWxlWChwMi5nZXRUZXh0U2NhbGVYKCkgKiAyLjBmKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocDEuZXF1YWxzRm9yVGV4dE1lYXN1cmVtZW50KHAyKSk7CisgICAgICAgIHAxLnNldFRleHRTY2FsZVgocDIuZ2V0VGV4dFNjYWxlWCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShwMS5lcXVhbHNGb3JUZXh0TWVhc3VyZW1lbnQocDIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHNGb3JUZXh0TWVhc3VybWVudF9sZXR0ZXJTcGFjaW5nKCkgeworICAgICAgICBQYWludCBwMSA9IG5ldyBQYWludCgpOworICAgICAgICBQYWludCBwMiA9IG5ldyBQYWludCgpOworCisgICAgICAgIHAxLnNldExldHRlclNwYWNpbmcocDIuZ2V0TGV0dGVyU3BhY2luZygpICsgMi4wZik7CisgICAgICAgIGFzc2VydEZhbHNlKHAxLmVxdWFsc0ZvclRleHRNZWFzdXJlbWVudChwMikpOworICAgICAgICBwMS5zZXRMZXR0ZXJTcGFjaW5nKHAyLmdldExldHRlclNwYWNpbmcoKSk7CisgICAgICAgIGFzc2VydFRydWUocDEuZXF1YWxzRm9yVGV4dE1lYXN1cmVtZW50KHAyKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzRm9yVGV4dE1lYXN1cm1lbnRfbG9jYWxlTGlzdCgpIHsKKyAgICAgICAgUGFpbnQgcDEgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgUGFpbnQgcDIgPSBuZXcgUGFpbnQoKTsKKworICAgICAgICBMb2NhbGVMaXN0IGVuVVMgPSBMb2NhbGVMaXN0LmZvckxhbmd1YWdlVGFncygiZW4tVVMiKTsKKyAgICAgICAgTG9jYWxlTGlzdCBqYUpQID0gTG9jYWxlTGlzdC5mb3JMYW5ndWFnZVRhZ3MoImphLUpQIik7CisgICAgICAgIExvY2FsZUxpc3QgZGlmZmVyZW50TG9jYWxlID0gcDIuZ2V0VGV4dExvY2FsZXMoKS5lcXVhbHMoZW5VUykgPyBqYUpQIDogZW5VUzsKKyAgICAgICAgcDEuc2V0VGV4dExvY2FsZXMoZGlmZmVyZW50TG9jYWxlKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocDEuZXF1YWxzRm9yVGV4dE1lYXN1cmVtZW50KHAyKSk7CisgICAgICAgIHAxLnNldFRleHRMb2NhbGVzKHAyLmdldFRleHRMb2NhbGVzKCkpOworICAgICAgICBhc3NlcnRUcnVlKHAxLmVxdWFsc0ZvclRleHRNZWFzdXJlbWVudChwMikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVxdWFsc0ZvclRleHRNZWFzdXJtZW50X3R5cGVmYWNlKCkgeworICAgICAgICBQYWludCBwMSA9IG5ldyBQYWludCgpOworICAgICAgICBQYWludCBwMiA9IG5ldyBQYWludCgpOworCisgICAgICAgIHAxLnNldFR5cGVmYWNlKFR5cGVmYWNlLkRFRkFVTFQpOworICAgICAgICBwMi5zZXRUeXBlZmFjZShUeXBlZmFjZS5TRVJJRik7CisgICAgICAgIGFzc2VydEZhbHNlKHAxLmVxdWFsc0ZvclRleHRNZWFzdXJlbWVudChwMikpOworICAgICAgICBwMS5zZXRUeXBlZmFjZShwMi5nZXRUeXBlZmFjZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShwMS5lcXVhbHNGb3JUZXh0TWVhc3VyZW1lbnQocDIpKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvUGFpbnRfQWxpZ25UZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvUGFpbnRfQWxpZ25UZXN0LmphdmEKaW5kZXggMDhmYjY0OS4uMjJlNjNhMyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1BhaW50X0FsaWduVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9QYWludF9BbGlnblRlc3QuamF2YQpAQCAtMjAsOCArMjAsOSBAQAogCiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50LkFsaWduOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1BhaW50X0NhcFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9QYWludF9DYXBUZXN0LmphdmEKaW5kZXggYjE2Y2YwZC4uZDFmNGMzYiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1BhaW50X0NhcFRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvUGFpbnRfQ2FwVGVzdC5qYXZhCkBAIC0yMCw4ICsyMCw5IEBACiAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQuQ2FwOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1BhaW50X0ZvbnRNZXRyaWNzSW50VGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1BhaW50X0ZvbnRNZXRyaWNzSW50VGVzdC5qYXZhCmluZGV4IDU2Y2FiZTEuLmM1MGMwMmIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9QYWludF9Gb250TWV0cmljc0ludFRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvUGFpbnRfRm9udE1ldHJpY3NJbnRUZXN0LmphdmEKQEAgLTIwLDggKzIwLDkgQEAKIAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludC5Gb250TWV0cmljc0ludDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9QYWludF9Kb2luVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1BhaW50X0pvaW5UZXN0LmphdmEKaW5kZXggYzIwMzc5NC4uMDcwODNhNyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1BhaW50X0pvaW5UZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1BhaW50X0pvaW5UZXN0LmphdmEKQEAgLTIwLDggKzIwLDkgQEAKIAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludC5Kb2luOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1BhaW50X1N0eWxlVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1BhaW50X1N0eWxlVGVzdC5qYXZhCmluZGV4IDA3NTI4OTguLjM4YmMwZmYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9QYWludF9TdHlsZVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvUGFpbnRfU3R5bGVUZXN0LmphdmEKQEAgLTIwLDggKzIwLDkgQEAKIAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludC5TdHlsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9QYXRoRGFzaFBhdGhFZmZlY3RUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvUGF0aERhc2hQYXRoRWZmZWN0VGVzdC5qYXZhCmluZGV4IDljYzljN2UuLjc0ZTc4YjMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9QYXRoRGFzaFBhdGhFZmZlY3RUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1BhdGhEYXNoUGF0aEVmZmVjdFRlc3QuamF2YQpAQCAtMjcsOCArMjcsOSBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGF0aC5EaXJlY3Rpb247CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYXRoRGFzaFBhdGhFZmZlY3Q7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0RjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9QYXRoRGFzaFBhdGhFZmZlY3RfU3R5bGVUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvUGF0aERhc2hQYXRoRWZmZWN0X1N0eWxlVGVzdC5qYXZhCmluZGV4IGQ0ZTk1ZTAuLmU4NmVjNzggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9QYXRoRGFzaFBhdGhFZmZlY3RfU3R5bGVUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1BhdGhEYXNoUGF0aEVmZmVjdF9TdHlsZVRlc3QuamF2YQpAQCAtMTksOCArMTksOSBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGF0aERhc2hQYXRoRWZmZWN0LlN0eWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1BhdGhFZmZlY3RUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvUGF0aEVmZmVjdFRlc3QuamF2YQppbmRleCBkN2YzMTNiLi4yNzI0OTdlIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvUGF0aEVmZmVjdFRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvUGF0aEVmZmVjdFRlc3QuamF2YQpAQCAtMTcsOCArMTcsOSBAQAogcGFja2FnZSBhbmRyb2lkLmdyYXBoaWNzLmN0czsKIAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGF0aEVmZmVjdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9QYXRoTWVhc3VyZVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9QYXRoTWVhc3VyZVRlc3QuamF2YQppbmRleCAzYjA4NDZmLi4zOTJjZjM0IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvUGF0aE1lYXN1cmVUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1BhdGhNZWFzdXJlVGVzdC5qYXZhCkBAIC0yNCw4ICsyNCw5IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYXRoOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGF0aC5EaXJlY3Rpb247CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYXRoTWVhc3VyZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CkBAIC04Myw4ICs4NCwxMCBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3ROZXh0Q29udG91cigpIHsKICAgICAgICAgYXNzZXJ0RmFsc2UobVBhdGhNZWFzdXJlLm5leHRDb250b3VyKCkpOwogICAgICAgICBtUGF0aC5hZGRSZWN0KDEsIDIsIDMsIDQsIFBhdGguRGlyZWN0aW9uLkNXKTsKKyAgICAgICAgbVBhdGguYWRkUmVjdCgxLCAyLCAzLCA0LCBQYXRoLkRpcmVjdGlvbi5DVyk7CiAgICAgICAgIG1QYXRoTWVhc3VyZS5zZXRQYXRoKG1QYXRoLCB0cnVlKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShtUGF0aE1lYXN1cmUubmV4dENvbnRvdXIoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1QYXRoTWVhc3VyZS5uZXh0Q29udG91cigpKTsKICAgICB9CiAKICAgICBAVGVzdApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1BhdGhUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvUGF0aFRlc3QuamF2YQppbmRleCBhZmUxZjM0Li45MDg4MmMwIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvUGF0aFRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvUGF0aFRlc3QuamF2YQpAQCAtMjgsOCArMjgsOSBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYXRoOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdEY7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiAKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CkBAIC00OTEsNiArNDkyLDM2IEBACiAgICAgICAgIGFzc2VydFRydWUocGF0aC5hcHByb3hpbWF0ZSgwLjI1ZikubGVuZ3RoID4gMjApOwogICAgIH0KIAorICAgIC8qKiBUaGlzIHRlc3QganVzdCBlbnN1cmVzIHRoZSBwcm9jZXNzIGRvZXNuJ3QgY3Jhc2guIFRoZSBhY3R1YWwgb3V0cHV0IGlzIG5vdCBpbnRlcmVzdGluZworICAgICAqICBoZW5jZSB0aGUgbGFjayBvZiBhc3NlcnRzLCBhcyB0aGUgb25seSBiZWhhdmlvciB0aGF0J3MgYmVpbmcgYXNzZXJ0ZWQgaXMgdGhhdCBpdAorICAgICAqICBkb2Vzbid0IGNyYXNoLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVzZUFmdGVyRmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgUGF0aEFidXNlciBwYXRoQWJ1c2VyID0gbmV3IFBhdGhBYnVzZXIoKTsKKworICAgICAgICAvLyBCYXNpYyB0ZXN0IHRoYXQgd2UgY3JlYXRlZCBhIHBhdGggc3VjY2Vzc2Z1bGx5CisgICAgICAgIGFzc2VydFRydWUocGF0aEFidXNlci5pc0VtcHR5KCkpOworICAgICAgICBhZGRSZWN0VG9QYXRoKHBhdGhBYnVzZXIpOworICAgICAgICBhc3NlcnRUcnVlKHBhdGhBYnVzZXIuaXNSZWN0KG51bGwpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocGF0aEFidXNlci5pc0VtcHR5KCkpOworCisgICAgICAgIC8vIE5vdyB1c2UtYWZ0ZXItZmluYWxpemUuCisgICAgICAgIHBhdGhBYnVzZXIuZGVzdHJveSgpOworICAgICAgICBwYXRoQWJ1c2VyLmlzRW1wdHkoKTsKKyAgICAgICAgcGF0aEFidXNlci5pc1JlY3QobnVsbCk7CisgICAgICAgIHBhdGhBYnVzZXIuZGVzdHJveSgpOworICAgICAgICBwYXRoQWJ1c2VyLmlzRW1wdHkoKTsKKyAgICAgICAgcGF0aEFidXNlci5pc1JlY3QobnVsbCk7CisgICAgICAgIHBhdGhBYnVzZXIuZGVzdHJveSgpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFBhdGhBYnVzZXIgZXh0ZW5kcyBQYXRoIHsKKyAgICAgICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICAgICAgZmluYWxpemUoKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdmVyaWZ5UGF0aHNBcmVFcXVpdmFsZW50KFBhdGggYWN0dWFsLCBQYXRoIGV4cGVjdGVkKSB7CiAgICAgICAgIEJpdG1hcCBhY3R1YWxCaXRtYXAgPSBkcmF3QW5kR2V0Qml0bWFwKGFjdHVhbCk7CiAgICAgICAgIEJpdG1hcCBleHBlY3RlZEJpdG1hcCA9IGRyYXdBbmRHZXRCaXRtYXAoZXhwZWN0ZWQpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1BhdGhfRGlyZWN0aW9uVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1BhdGhfRGlyZWN0aW9uVGVzdC5qYXZhCmluZGV4IGZiOWMzOWYuLjBjZGQwODIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9QYXRoX0RpcmVjdGlvblRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvUGF0aF9EaXJlY3Rpb25UZXN0LmphdmEKQEAgLTE5LDggKzE5LDkgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhdGguRGlyZWN0aW9uOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1BhdGhfRmlsbFR5cGVUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvUGF0aF9GaWxsVHlwZVRlc3QuamF2YQppbmRleCAxN2Y1Zjg3Li4wMDlhZTZmIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvUGF0aF9GaWxsVHlwZVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvUGF0aF9GaWxsVHlwZVRlc3QuamF2YQpAQCAtMTksOCArMTksOSBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGF0aC5GaWxsVHlwZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9QaWN0dXJlVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1BpY3R1cmVUZXN0LmphdmEKaW5kZXggMDE3Y2NiNy4uYWIyN2RhNCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1BpY3R1cmVUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1BpY3R1cmVUZXN0LmphdmEKQEAgLTI4LDkgKzI4LDkgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50LlN0eWxlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGljdHVyZTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWdpb24uT3A7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiAKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CkBAIC04Niw3ICs4Niw3IEBACiAgICAgLy8gQWRkIGFuIGV4dHJhIHNhdmUgd2l0aCBhIHRyYW5zZm9ybSBhbmQgY2xpcAogICAgIHByaXZhdGUgdm9pZCBjcmVhdGVJbWJhbGFuY2UoQ2FudmFzIGNhbnZhcykgewogICAgICAgICBjYW52YXMuc2F2ZSgpOwotICAgICAgICBjYW52YXMuY2xpcFJlY3QobUNsaXBSZWN0LCBPcC5SRVBMQUNFKTsKKyAgICAgICAgY2FudmFzLmNsaXBSZWN0KG1DbGlwUmVjdCk7CiAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMS4wZiwgMS4wZik7CiAgICAgICAgIFBhaW50IHBhaW50ID0gbmV3IFBhaW50KCk7CiAgICAgICAgIHBhaW50LnNldENvbG9yKENvbG9yLkdSRUVOKTsKQEAgLTE1MCw2ICsxNTAsMTMgQEAKICAgICAgICAgdmVyaWZ5Qml0bWFwKGJpdG1hcCk7CiAgICAgfQogCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBJbGxlZ2FsU3RhdGVFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdEJlZ2luUmVjb3JkaW5nVHdpY2UoKSB7CisgICAgICAgIFBpY3R1cmUgcGljdHVyZSA9IG5ldyBQaWN0dXJlKCk7CisgICAgICAgIHBpY3R1cmUuYmVnaW5SZWNvcmRpbmcoMTAsIDEwKTsKKyAgICAgICAgcGljdHVyZS5iZWdpblJlY29yZGluZygxMCwgMTApOworICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlTaXplKFBpY3R1cmUgcGljdHVyZSkgewogICAgICAgICBhc3NlcnRFcXVhbHMoVEVTVF9XSURUSCwgcGljdHVyZS5nZXRXaWR0aCgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKFRFU1RfSEVJR0hULCBwaWN0dXJlLmdldEhlaWdodCgpKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9QaXhlbEZvcm1hdFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9QaXhlbEZvcm1hdFRlc3QuamF2YQppbmRleCBlNTRiZWY5Li42NDhmY2UxIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvUGl4ZWxGb3JtYXRUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1BpeGVsRm9ybWF0VGVzdC5qYXZhCkBAIC0yMSw4ICsyMSw5IEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGl4ZWxGb3JtYXQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiAKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvUG9pbnRGVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1BvaW50RlRlc3QuamF2YQppbmRleCBlZWRjYjZmLi5iYTQ5ZTQyIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvUG9pbnRGVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9Qb2ludEZUZXN0LmphdmEKQEAgLTIzLDggKzIzLDkgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvaW50OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnRGOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpAQCAtMTExLDUgKzExMiw3IEBACiAgICAgICAgIG1Qb2ludEYucmVhZEZyb21QYXJjZWwocCk7CiAgICAgICAgIGFzc2VydEVxdWFscygxMC4wZiwgbVBvaW50Ri54LCAwLjBmKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDIwLjBmLCBtUG9pbnRGLnksIDAuMGYpOworCisgICAgICAgIHAucmVjeWNsZSgpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9Qb2ludFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9Qb2ludFRlc3QuamF2YQppbmRleCBkMDFmNTUxLi45YjkyODRkIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvUG9pbnRUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1BvaW50VGVzdC5qYXZhCkBAIC0yMyw4ICsyMyw5IEBACiAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvaW50OwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1BvcnRlckR1ZmZDb2xvckZpbHRlclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9Qb3J0ZXJEdWZmQ29sb3JGaWx0ZXJUZXN0LmphdmEKaW5kZXggMGJlYWRhZS4uZTM5MjkxZCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1BvcnRlckR1ZmZDb2xvckZpbHRlclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvUG9ydGVyRHVmZkNvbG9yRmlsdGVyVGVzdC5qYXZhCkBAIC0yNCw4ICsyNCw5IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmY7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmQ29sb3JGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiAKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvUG9ydGVyRHVmZlhmZXJtb2RlVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1BvcnRlckR1ZmZYZmVybW9kZVRlc3QuamF2YQppbmRleCAxYTQ3ZjQ0Li41NDQzOTgzIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvUG9ydGVyRHVmZlhmZXJtb2RlVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9Qb3J0ZXJEdWZmWGZlcm1vZGVUZXN0LmphdmEKQEAgLTI0LDggKzI0LDkgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmZYZmVybW9kZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9SYWRpYWxHcmFkaWVudFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9SYWRpYWxHcmFkaWVudFRlc3QuamF2YQppbmRleCBkMTMzYmI5Li5mYWQyN2IzIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvUmFkaWFsR3JhZGllbnRUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1JhZGlhbEdyYWRpZW50VGVzdC5qYXZhCkBAIC0yNCw4ICsyNCw5IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJhZGlhbEdyYWRpZW50OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyLlRpbGVNb2RlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogCiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5Db2xvclV0aWxzOwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvUmVjdEZUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvUmVjdEZUZXN0LmphdmEKaW5kZXggMjc1OWQxZS4uMWM0NGMxYyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1JlY3RGVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9SZWN0RlRlc3QuamF2YQpAQCAtMjQsOCArMjQsOSBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3RGOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpAQCAtNTA0LDUgKzUwNSw3IEBACiAgICAgICAgIGFzc2VydE5vdE51bGwocmVjdEluLnRvU3RyaW5nKCkpOwogCiAgICAgICAgIGFzc2VydEVxdWFscygwLCByZWN0SW4uZGVzY3JpYmVDb250ZW50cygpKTsKKworICAgICAgICBvdXQucmVjeWNsZSgpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9SZWN0VGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1JlY3RUZXN0LmphdmEKaW5kZXggY2IxMmNiNS4uOTA5NDNjZSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1JlY3RUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1JlY3RUZXN0LmphdmEKQEAgLTI0LDggKzI0LDkgQEAKIAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKQEAgLTQ4Nyw2ICs0ODgsOCBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbVJlY3QudG9wKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIG1SZWN0LnJpZ2h0KTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIG1SZWN0LmJvdHRvbSk7CisKKyAgICAgICAgcC5yZWN5Y2xlKCk7CiAgICAgfQogCiAgICAgQFRlc3QKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9SZWdpb25JdGVyYXRvclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9SZWdpb25JdGVyYXRvclRlc3QuamF2YQppbmRleCA2YWMzNTUyLi5hNmJiY2VkIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvUmVnaW9uSXRlcmF0b3JUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1JlZ2lvbkl0ZXJhdG9yVGVzdC5qYXZhCkBAIC0yNCw4ICsyNCw5IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiAKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvUmVnaW9uVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1JlZ2lvblRlc3QuamF2YQppbmRleCAwZWZmNmNmLi5hNmI0ODJlIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvUmVnaW9uVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9SZWdpb25UZXN0LmphdmEKQEAgLTI1LDggKzI1LDkgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWdpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpAQCAtMTQ2Niw2ICsxNDY3LDcgQEAKICAgICAgICAgcC5zZXREYXRhUG9zaXRpb24oMCk7CiAgICAgICAgIFJlZ2lvbiBkc3QgPSBSZWdpb24uQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKHApOwogICAgICAgICBhc3NlcnRUcnVlKGRzdC5pc0VtcHR5KCkpOworICAgICAgICBwLnJlY3ljbGUoKTsKIAogICAgICAgICAvLyB0ZXN0IHJlYWRpbmcvd3JpdGluZyBhIHNpbmdsZSByZWN0IHBhcmNlbAogICAgICAgICBwID0gUGFyY2VsLm9idGFpbigpOwpAQCAtMTQ3OCw2ICsxNDgwLDcgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKG9yaVJlY3QubGVmdCwgZHN0LmdldEJvdW5kcygpLmxlZnQpOwogICAgICAgICBhc3NlcnRFcXVhbHMob3JpUmVjdC5ib3R0b20sIGRzdC5nZXRCb3VuZHMoKS5ib3R0b20pOwogICAgICAgICBhc3NlcnRFcXVhbHMob3JpUmVjdC5yaWdodCwgZHN0LmdldEJvdW5kcygpLnJpZ2h0KTsKKyAgICAgICAgcC5yZWN5Y2xlKCk7CiAKICAgICAgICAgLy8gdGVzdCByZWFkaW5nL3dyaXRpbmcgYSBtdWx0aXBsZSByZWN0IHBhcmNlbAogICAgICAgICBwID0gUGFyY2VsLm9idGFpbigpOwpAQCAtMTQ5NSw2ICsxNDk4LDggQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGRzdC5nZXRCb3VuZHMoKS5sZWZ0KTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDE1LCBkc3QuZ2V0Qm91bmRzKCkuYm90dG9tKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDE1LCBkc3QuZ2V0Qm91bmRzKCkucmlnaHQpOworCisgICAgICAgIHAucmVjeWNsZSgpOwogICAgIH0KIAogICAgIEBUZXN0CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvUmVnaW9uX09wVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1JlZ2lvbl9PcFRlc3QuamF2YQppbmRleCBiZTMxNjcyLi45YzI2NTFjIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvUmVnaW9uX09wVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9SZWdpb25fT3BUZXN0LmphdmEKQEAgLTE5LDggKzE5LDkgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbi5PcDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9TaGFkZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvU2hhZGVyVGVzdC5qYXZhCmluZGV4IDdjMThmZTkuLmEzOTNhZTggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9TaGFkZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1NoYWRlclRlc3QuamF2YQpAQCAtMjUsOCArMjUsOSBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3I7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5NYXRyaXg7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5TaGFkZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiAKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvU2hhZGVyX1RpbGVNb2RlVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1NoYWRlcl9UaWxlTW9kZVRlc3QuamF2YQppbmRleCA0N2M0OWRlLi40NTVmNTllIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvU2hhZGVyX1RpbGVNb2RlVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9TaGFkZXJfVGlsZU1vZGVUZXN0LmphdmEKQEAgLTE5LDggKzE5LDkgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlNoYWRlci5UaWxlTW9kZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9TdW1QYXRoRWZmZWN0VGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1N1bVBhdGhFZmZlY3RUZXN0LmphdmEKaW5kZXggZDZlYWM5Ny4uMjA3Zjc0ZTYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9TdW1QYXRoRWZmZWN0VGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9TdW1QYXRoRWZmZWN0VGVzdC5qYXZhCkBAIC0zMCw4ICszMCw5IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYXRoLkRpcmVjdGlvbjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhdGhFZmZlY3Q7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5TdW1QYXRoRWZmZWN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1N3ZWVwR3JhZGllbnRUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvU3dlZXBHcmFkaWVudFRlc3QuamF2YQppbmRleCBjYjdlYzBhLi5hNjI3ZDdmIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvU3dlZXBHcmFkaWVudFRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvU3dlZXBHcmFkaWVudFRlc3QuamF2YQpAQCAtMjcsMTAgKzI3LDExIEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuU3dlZXBHcmFkaWVudDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5Db2xvclV0aWxzOwogCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9TeW5jVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1N5bmNUZXN0LmphdmEKaW5kZXggYTgyYWRmYy4uMzE4Nzg3MSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1N5bmNUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1N5bmNUZXN0LmphdmEKQEAgLTE2LDE4ICsxNiwxMyBAQAogCiBwYWNrYWdlIGFuZHJvaWQuZ3JhcGhpY3MuY3RzOwogCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm9wZW5nbC5FR0wxNC4qOwogCiBpbXBvcnQgYW5kcm9pZC5vcGVuZ2wuRUdMMTQ7CiBpbXBvcnQgYW5kcm9pZC5vcGVuZ2wuRUdMQ29uZmlnOwotaW1wb3J0IGFuZHJvaWQub3BlbmdsLkVHTENvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5vcGVuZ2wuRUdMRGlzcGxheTsKLWltcG9ydCBhbmRyb2lkLm9wZW5nbC5FR0xTdXJmYWNlOwotaW1wb3J0IGFuZHJvaWQub3BlbmdsLkdMRVMyMDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKIAotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkN5Y2xpY0JhcnJpZXI7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKIAogaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwpAQCAtMzUsNyArMzAsNiBAQAogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVycy5CbG9ja0pVbml0NENsYXNzUnVubmVyOwogCi0KIC8vIFRoaXMgY2xhc3MgY29udGFpbnMgdGVzdHMgZm9yIHRoZSBMaW51eCBrZXJuZWwgc3luYyBmaWxlIHN5c3RlbSwgYW5kIHRoZSBOREsgaW50ZXJmYWNlcyBmb3IgaXQKIC8vIChhbmRyb2lkL3N5bmMuaCkuIFVuZm9ydHVuYXRlbHksIHRoZSBpbnRlcmZhY2VzIGV4cG9zZWQgYnkgdGhlIGtlcm5lbCBtYWtlIGl0IGRpZmZpY3VsdCB0byB0ZXN0CiAvLyBmb3IgYSBjb3VwbGUgcmVhc29uczoKQEAgLTUzLDcgKzQ3LDYgQEAKIC8vICAgICBzaWduYWwgdGhlbSBoYXMgYmVlbiBzdWJtaXR0ZWQgdG8gdGhlIGtlcm5lbCwgYW5kIHdpbGwgY29tcGxldGUgd2l0aG91dCBmdXJ0aGVyIGFjdGlvbiBmcm9tCiAvLyAgICAgdXNlcmxhbmQuIFRoaXMgbWVhbnMgdGhhdCBpdCBpcyBpbXBvc3NpYmxlIHRvIHJlbGlhYmx5IGRvIHNvbWV0aGluZyBiZWZvcmUgYSBzeW5jIGZpbGUgaGFzCiAvLyAgICAgc2lnbmFsZWQuCi0KIEBTbWFsbFRlc3QKIEBSdW5XaXRoKEJsb2NrSlVuaXQ0Q2xhc3NSdW5uZXIuY2xhc3MpCiBwdWJsaWMgY2xhc3MgU3luY1Rlc3QgewpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1R5cGVmYWNlVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1R5cGVmYWNlVGVzdC5qYXZhCmluZGV4IDA0ZDU1NjQuLjAxOGU1ZGMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9UeXBlZmFjZVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvVHlwZWZhY2VUZXN0LmphdmEKQEAgLTMwLDkgKzMwLDExIEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldE1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlR5cGVmYWNlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuVHlwZWZhY2UuQnVpbGRlcjsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKQEAgLTQzLDYgKzQ1LDcgQEAKIGltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiAKIEBTbWFsbFRlc3QKIEBSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCkBAIC01Miw2ICs1NSwyNSBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUID0gKFN0cmluZyludWxsOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlZBTElEID0gImludmFsaWQtZmFtaWx5LW5hbWUiOwogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgR0xZUEhfMUVNX1dJRFRIOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IEdMWVBIXzNFTV9XSURUSDsKKworICAgIHByaXZhdGUgc3RhdGljIGZsb2F0IG1lYXN1cmVUZXh0KFN0cmluZyB0ZXh0LCBUeXBlZmFjZSB0eXBlZmFjZSkgeworICAgICAgICBmaW5hbCBQYWludCBwYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAvLyBGaXggdGhlIGxvY2FsZSBzbyB0aGF0IGZpeCB0aGUgbG9jYWxlIGJhc2VkIGZhbGxiYWNrLgorICAgICAgICBwYWludC5zZXRUZXh0TG9jYWxlKExvY2FsZS5VUyk7CisgICAgICAgIHBhaW50LnNldFR5cGVmYWNlKHR5cGVmYWNlKTsKKyAgICAgICAgcmV0dXJuIHBhaW50Lm1lYXN1cmVUZXh0KHRleHQpOworICAgIH0KKworICAgIHN0YXRpYyB7CisgICAgICAgIC8vIDNlbS50dGYgc3VwcG9ydHMgImEiLCAiYiIsICJjIi4gVGhlIHdpZHRoIG9mICJhIiBpcyAzZW0sIG90aGVycyBhcmUgMWVtLgorICAgICAgICBmaW5hbCBDb250ZXh0IGN0eCA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldFRhcmdldENvbnRleHQoKTsKKyAgICAgICAgZmluYWwgVHlwZWZhY2UgdHlwZWZhY2UgPSBjdHguZ2V0UmVzb3VyY2VzKCkuZ2V0Rm9udChSLmZvbnQuYTNlbSk7CisgICAgICAgIEdMWVBIXzNFTV9XSURUSCA9IG1lYXN1cmVUZXh0KCJhIiwgdHlwZWZhY2UpOworICAgICAgICBHTFlQSF8xRU1fV0lEVEggPSBtZWFzdXJlVGV4dCgiYiIsIHR5cGVmYWNlKTsKKyAgICB9CisKICAgICAvLyBsaXN0IG9mIGZhbWlseSBuYW1lcyB0byB0cnkgd2hlbiBhdHRlbXB0aW5nIHRvIGZpbmQgYSB0eXBlZmFjZSB3aXRoIGEgZ2l2ZW4gc3R5bGUKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBGQU1JTElFUyA9CiAgICAgICAgICAgICB7IChTdHJpbmcpIG51bGwsICJtb25vc3BhY2UiLCAic2VyaWYiLCAic2Fucy1zZXJpZiIsICJjdXJzaXZlIiwgImFyaWFsIiwgInRpbWVzIiB9OwpAQCAtMjMxLDExICsyNTMsOSBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQ21hcEZvbnQoKSB7CiAgICAgICAgIFR5cGVmYWNlIHR5cGVmYWNlID0gVHlwZWZhY2UuY3JlYXRlRnJvbUFzc2V0KG1Db250ZXh0LmdldEFzc2V0cygpLCAiYm9tYmZvbnQudHRmIik7CiAgICAgICAgIGFzc2VydE5vdE51bGwodHlwZWZhY2UpOwotICAgICAgICBQYWludCBwID0gbmV3IFBhaW50KCk7CiAgICAgICAgIGZpbmFsIFN0cmluZyB0ZXN0U3RyaW5nID0gImFiY2RlIjsKLSAgICAgICAgZmxvYXQgd2lkdGhEZWZhdWx0VHlwZWZhY2UgPSBwLm1lYXN1cmVUZXh0KHRlc3RTdHJpbmcpOwotICAgICAgICBwLnNldFR5cGVmYWNlKHR5cGVmYWNlKTsKLSAgICAgICAgZmxvYXQgd2lkdGhDdXN0b21UeXBlZmFjZSA9IHAubWVhc3VyZVRleHQodGVzdFN0cmluZyk7CisgICAgICAgIGZsb2F0IHdpZHRoRGVmYXVsdFR5cGVmYWNlID0gbWVhc3VyZVRleHQodGVzdFN0cmluZywgVHlwZWZhY2UuREVGQVVMVCk7CisgICAgICAgIGZsb2F0IHdpZHRoQ3VzdG9tVHlwZWZhY2UgPSBtZWFzdXJlVGV4dCh0ZXN0U3RyaW5nLCB0eXBlZmFjZSk7CiAgICAgICAgIGFzc2VydEVxdWFscyh3aWR0aERlZmF1bHRUeXBlZmFjZSwgd2lkdGhDdXN0b21UeXBlZmFjZSwgMS4wZik7CiAgICAgfQogCkBAIC0yNDMsMTEgKzI2Myw5IEBACiAgICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRDbWFwRm9udDIoKSB7CiAgICAgICAgIFR5cGVmYWNlIHR5cGVmYWNlID0gVHlwZWZhY2UuY3JlYXRlRnJvbUFzc2V0KG1Db250ZXh0LmdldEFzc2V0cygpLCAiYm9tYmZvbnQyLnR0ZiIpOwogICAgICAgICBhc3NlcnROb3ROdWxsKHR5cGVmYWNlKTsKLSAgICAgICAgUGFpbnQgcCA9IG5ldyBQYWludCgpOwogICAgICAgICBmaW5hbCBTdHJpbmcgdGVzdFN0cmluZyA9ICJhYmNkZSI7Ci0gICAgICAgIGZsb2F0IHdpZHRoRGVmYXVsdFR5cGVmYWNlID0gcC5tZWFzdXJlVGV4dCh0ZXN0U3RyaW5nKTsKLSAgICAgICAgcC5zZXRUeXBlZmFjZSh0eXBlZmFjZSk7Ci0gICAgICAgIGZsb2F0IHdpZHRoQ3VzdG9tVHlwZWZhY2UgPSBwLm1lYXN1cmVUZXh0KHRlc3RTdHJpbmcpOworICAgICAgICBmbG9hdCB3aWR0aERlZmF1bHRUeXBlZmFjZSA9IG1lYXN1cmVUZXh0KHRlc3RTdHJpbmcsIFR5cGVmYWNlLkRFRkFVTFQpOworICAgICAgICBmbG9hdCB3aWR0aEN1c3RvbVR5cGVmYWNlID0gbWVhc3VyZVRleHQodGVzdFN0cmluZywgdHlwZWZhY2UpOwogICAgICAgICBhc3NlcnRFcXVhbHMod2lkdGhEZWZhdWx0VHlwZWZhY2UsIHdpZHRoQ3VzdG9tVHlwZWZhY2UsIDEuMGYpOwogICAgIH0KIApAQCAtMjc1LDExICsyOTMsOSBAQAogICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBmaWxlIDogSU5WQUxJRF9DTUFQX0ZPTlRTKSB7CiAgICAgICAgICAgICBmaW5hbCBUeXBlZmFjZSB0eXBlZmFjZSA9IFR5cGVmYWNlLmNyZWF0ZUZyb21Bc3NldChtQ29udGV4dC5nZXRBc3NldHMoKSwgZmlsZSk7CiAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHR5cGVmYWNlKTsKLSAgICAgICAgICAgIGZpbmFsIFBhaW50IHAgPSBuZXcgUGFpbnQoKTsKICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0ZXN0U3RyaW5nID0gIlx1MDEwMFx1MDQwMCI7Ci0gICAgICAgICAgICBmaW5hbCBmbG9hdCB3aWR0aERlZmF1bHRUeXBlZmFjZSA9IHAubWVhc3VyZVRleHQodGVzdFN0cmluZyk7Ci0gICAgICAgICAgICBwLnNldFR5cGVmYWNlKHR5cGVmYWNlKTsKLSAgICAgICAgICAgIGZpbmFsIGZsb2F0IHdpZHRoQ3VzdG9tVHlwZWZhY2UgPSBwLm1lYXN1cmVUZXh0KHRlc3RTdHJpbmcpOworICAgICAgICAgICAgZmluYWwgZmxvYXQgd2lkdGhEZWZhdWx0VHlwZWZhY2UgPSBtZWFzdXJlVGV4dCh0ZXN0U3RyaW5nLCBUeXBlZmFjZS5ERUZBVUxUKTsKKyAgICAgICAgICAgIGZpbmFsIGZsb2F0IHdpZHRoQ3VzdG9tVHlwZWZhY2UgPSBtZWFzdXJlVGV4dCh0ZXN0U3RyaW5nLCB0eXBlZmFjZSk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMod2lkdGhEZWZhdWx0VHlwZWZhY2UsIHdpZHRoQ3VzdG9tVHlwZWZhY2UsIDAuMGYpOwogICAgICAgICB9CiAKQEAgLTI5MiwzMCArMzA4LDI4IEBACiAgICAgICAgIGZvciAoZmluYWwgU3RyaW5nIGZpbGUgOiBJTlZBTElEX0NNQVBfVlNfRk9OVFMpIHsKICAgICAgICAgICAgIGZpbmFsIFR5cGVmYWNlIHR5cGVmYWNlID0gVHlwZWZhY2UuY3JlYXRlRnJvbUFzc2V0KG1Db250ZXh0LmdldEFzc2V0cygpLCBmaWxlKTsKICAgICAgICAgICAgIGFzc2VydE5vdE51bGwodHlwZWZhY2UpOwotICAgICAgICAgICAgZmluYWwgUGFpbnQgcCA9IG5ldyBQYWludCgpOwogICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRlc3RTdHJpbmcgPSAiXHUwMTAwXHVGRTAwXHUwNDAwXHVGRTAwIjsKLSAgICAgICAgICAgIGZpbmFsIGZsb2F0IHdpZHRoRGVmYXVsdFR5cGVmYWNlID0gcC5tZWFzdXJlVGV4dCh0ZXN0U3RyaW5nKTsKLSAgICAgICAgICAgIHAuc2V0VHlwZWZhY2UodHlwZWZhY2UpOwotICAgICAgICAgICAgZmluYWwgZmxvYXQgd2lkdGhDdXN0b21UeXBlZmFjZSA9IHAubWVhc3VyZVRleHQodGVzdFN0cmluZyk7CisgICAgICAgICAgICBmaW5hbCBmbG9hdCB3aWR0aERlZmF1bHRUeXBlZmFjZSA9IG1lYXN1cmVUZXh0KHRlc3RTdHJpbmcsIFR5cGVmYWNlLkRFRkFVTFQpOworICAgICAgICAgICAgZmluYWwgZmxvYXQgd2lkdGhDdXN0b21UeXBlZmFjZSA9IG1lYXN1cmVUZXh0KHRlc3RTdHJpbmcsIHR5cGVmYWNlKTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscyh3aWR0aERlZmF1bHRUeXBlZmFjZSwgd2lkdGhDdXN0b21UeXBlZmFjZSwgMC4wZik7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVGcm9tQXNzZXRfY2FjaGVzVHlwZWZhY2UoKSB7Ci0gICAgICAgIFR5cGVmYWNlIHR5cGVmYWNlMSA9IFR5cGVmYWNlLmNyZWF0ZUZyb21Bc3NldChtQ29udGV4dC5nZXRBc3NldHMoKSwgImJvbWJmb250Mi50dGYiKTsKKyAgICAgICAgVHlwZWZhY2UgdHlwZWZhY2UxID0gVHlwZWZhY2UuY3JlYXRlRnJvbUFzc2V0KG1Db250ZXh0LmdldEFzc2V0cygpLCAic2FtcGxlZm9udC50dGYiKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbCh0eXBlZmFjZTEpOwogCi0gICAgICAgIFR5cGVmYWNlIHR5cGVmYWNlMiA9IFR5cGVmYWNlLmNyZWF0ZUZyb21Bc3NldChtQ29udGV4dC5nZXRBc3NldHMoKSwgImJvbWJmb250Mi50dGYiKTsKKyAgICAgICAgVHlwZWZhY2UgdHlwZWZhY2UyID0gVHlwZWZhY2UuY3JlYXRlRnJvbUFzc2V0KG1Db250ZXh0LmdldEFzc2V0cygpLCAic2FtcGxlZm9udC50dGYiKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbCh0eXBlZmFjZTIpOwogICAgICAgICBhc3NlcnRTYW1lKCJTYW1lIGZvbnQgYXNzZXQgc2hvdWxkIHJldHVybiBzYW1lIFR5cGVmYWNlIG9iamVjdCIsIHR5cGVmYWNlMSwgdHlwZWZhY2UyKTsKIAotICAgICAgICBUeXBlZmFjZSB0eXBlZmFjZTMgPSBUeXBlZmFjZS5jcmVhdGVGcm9tQXNzZXQobUNvbnRleHQuZ2V0QXNzZXRzKCksICJib21iZm9udC50dGYiKTsKKyAgICAgICAgVHlwZWZhY2UgdHlwZWZhY2UzID0gVHlwZWZhY2UuY3JlYXRlRnJvbUFzc2V0KG1Db250ZXh0LmdldEFzc2V0cygpLCAic2FtcGxlZm9udDIudHRmIik7CiAgICAgICAgIGFzc2VydE5vdE51bGwodHlwZWZhY2UzKTsKICAgICAgICAgYXNzZXJ0Tm90U2FtZSgiRGlmZmVyZW50IGZvbnQgYXNzZXQgc2hvdWxkIHJldHVybiBkaWZmZXJlbnQgVHlwZWZhY2Ugb2JqZWN0IiwKICAgICAgICAgICAgICAgICB0eXBlZmFjZTIsIHR5cGVmYWNlMyk7CiAKLSAgICAgICAgVHlwZWZhY2UgdHlwZWZhY2U0ID0gVHlwZWZhY2UuY3JlYXRlRnJvbUFzc2V0KG1Db250ZXh0LmdldEFzc2V0cygpLCAic2FtcGxlZm9udC50dGYiKTsKKyAgICAgICAgVHlwZWZhY2UgdHlwZWZhY2U0ID0gVHlwZWZhY2UuY3JlYXRlRnJvbUFzc2V0KG1Db250ZXh0LmdldEFzc2V0cygpLCAic2FtcGxlZm9udDMudHRmIik7CiAgICAgICAgIGFzc2VydE5vdE51bGwodHlwZWZhY2U0KTsKICAgICAgICAgYXNzZXJ0Tm90U2FtZSgiRGlmZmVyZW50IGZvbnQgYXNzZXQgc2hvdWxkIHJldHVybiBkaWZmZXJlbnQgVHlwZWZhY2Ugb2JqZWN0IiwKICAgICAgICAgICAgICAgICB0eXBlZmFjZTIsIHR5cGVmYWNlNCk7CkBAIC00OTgsMTEgKzUxMiw5IEBACiAgICAgICAgIGZvciAoU3RyaW5nIGZvbnRQYXRoIDogZm9udFBhdGhzKSB7CiAgICAgICAgICAgICBUeXBlZmFjZSB0eXBlZmFjZSA9IFR5cGVmYWNlLmNyZWF0ZUZyb21Bc3NldChtQ29udGV4dC5nZXRBc3NldHMoKSwgZm9udFBhdGgpOwogICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCh0eXBlZmFjZSk7Ci0gICAgICAgICAgICBQYWludCBwID0gbmV3IFBhaW50KCk7CiAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdGVzdFN0cmluZyA9ICJhIjsKLSAgICAgICAgICAgIGZsb2F0IHdpZHRoRGVmYXVsdFR5cGVmYWNlID0gcC5tZWFzdXJlVGV4dCh0ZXN0U3RyaW5nKTsKLSAgICAgICAgICAgIHAuc2V0VHlwZWZhY2UodHlwZWZhY2UpOwotICAgICAgICAgICAgZmxvYXQgd2lkdGhDdXN0b21UeXBlZmFjZSA9IHAubWVhc3VyZVRleHQodGVzdFN0cmluZyk7CisgICAgICAgICAgICBmbG9hdCB3aWR0aERlZmF1bHRUeXBlZmFjZSA9IG1lYXN1cmVUZXh0KHRlc3RTdHJpbmcsIFR5cGVmYWNlLkRFRkFVTFQpOworICAgICAgICAgICAgZmxvYXQgd2lkdGhDdXN0b21UeXBlZmFjZSA9IG1lYXN1cmVUZXh0KHRlc3RTdHJpbmcsIHR5cGVmYWNlKTsKICAgICAgICAgICAgIC8vIFRoZSB3aWR0aCBvZiB0aGUgZ2x5cGggImEiIGZyb20gYWJvdmUgZm9udHMgYXJlIDJlbS4KICAgICAgICAgICAgIC8vIFNvIHRoZSB3aWR0aCBzaG91bGQgYmUgZGlmZmVyZW50IGZyb20gdGhlIGRlZmF1bHQgb25lLgogICAgICAgICAgICAgYXNzZXJ0Tm90RXF1YWxzKHdpZHRoRGVmYXVsdFR5cGVmYWNlLCB3aWR0aEN1c3RvbVR5cGVmYWNlLCAxLjBmKTsKQEAgLTUyMSw2ICs1MzMsNyBAQAogICAgICAgICBmaW5hbCBTdHJpbmcgdGVzdFN0cmluZyA9ICJXV1dXV1dXV1dXV1dXV1dXV1dXV1ciOwogCiAgICAgICAgIGZpbmFsIFBhaW50IHAgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgcC5zZXRUZXh0TG9jYWxlKExvY2FsZS5VUyk7CiAgICAgICAgIHAuc2V0VGV4dFNpemUoMTI4KTsKIAogICAgICAgICBwLnNldFR5cGVmYWNlKHJlZ3VsYXJUeXBlZmFjZSk7CkBAIC01MjksNiArNTQyLDIyNiBAQAogICAgICAgICBwLnNldFR5cGVmYWNlKGJsYWNrVHlwZWZhY2UpOwogICAgICAgICBmaW5hbCBmbG9hdCB3aWR0aEZyb21CbGFjayA9IHAubWVhc3VyZVRleHQodGVzdFN0cmluZyk7CiAKLSAgICAgICAgYXNzZXJ0VHJ1ZShNYXRoLmFicyh3aWR0aEZyb21SZWd1bGFyIC0gd2lkdGhGcm9tQmxhY2spID4gMS4wZik7CisgICAgICAgIGFzc2VydE5vdEVxdWFscyh3aWR0aEZyb21SZWd1bGFyLCB3aWR0aEZyb21CbGFjaywgMS4wZik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHlwZWZhY2VDcmVhdGVfd2l0aEV4YWN0V2VpZ2h0KCkgeworICAgICAgICAvLyBtdWx0aXdlaWdodF9mYW1pbHkgaGFzIGZvbGxvd2luZyBmb250cy4KKyAgICAgICAgLy8gLSBhM2VtLnR0ZiB3aXRoIHdlaWdodCA9IDEwMCwgc3R5bGU9bm9ybWFsIGNvbmZpZ3VyYXRpb24uCisgICAgICAgIC8vICAgVGhpcyBmb250IHN1cHBvcnRzICJhIiwgImIiLCAiYyIuIFRoZSB3ZWlnaHQgImEiIGlzIDNlbSwgb3RoZXJzIGFyZSAxZW0uCisgICAgICAgIC8vIC0gYjNlbS50dGYgd2l0aCB3ZWlnaHQgPSA0MDAsIHN0eWxlPW5vcm1hbCBjb25maWd1cmF0aW9uLgorICAgICAgICAvLyAgIFRoaXMgZm9udCBzdXBwb3J0cyAiYSIsICJiIiwgImMiLiBUaGUgd2VpZ2h0ICJiIiBpcyAzZW0sIG90aGVycyBhcmUgMWVtLgorICAgICAgICAvLyAtIGMzZW0udHRmIHdpdGggd2VpZ2h0ID0gNzAwLCBzdHlsZT1ub3JtYWwgY29uZmlndXJhdGlvbi4KKyAgICAgICAgLy8gICBUaGlzIGZvbnQgc3VwcG9ydHMgImEiLCAiYiIsICJjIi4gVGhlIHdlaWdodCAiYyIgaXMgM2VtLCBvdGhlcnMgYXJlIDFlbS4KKyAgICAgICAgZmluYWwgVHlwZWZhY2UgZmFtaWx5ID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0Rm9udChSLmZvbnQubXVsdGl3ZWlnaHRfZmFtaWx5KTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChmYW1pbHkpOworCisgICAgICAgIC8vIEJ5IGRlZmF1bHQsIHRoZSBmb250IHdoaWNoIHdlaWdodCBpcyA0MDAgaXMgc2VsZWN0ZWQuCisgICAgICAgIGFzc2VydEVxdWFscyhHTFlQSF8xRU1fV0lEVEgsIG1lYXN1cmVUZXh0KCJhIiwgZmFtaWx5KSwgMGYpOworICAgICAgICBhc3NlcnRFcXVhbHMoR0xZUEhfM0VNX1dJRFRILCBtZWFzdXJlVGV4dCgiYiIsIGZhbWlseSksIDBmKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEdMWVBIXzFFTV9XSURUSCwgbWVhc3VyZVRleHQoImMiLCBmYW1pbHkpLCAwZik7CisKKyAgICAgICAgLy8gRHJhdyB3aXRoIHRoZSBmb250IHdoaWNoIHdlaWdodCBpcyAxMDAuCisgICAgICAgIGZpbmFsIFR5cGVmYWNlIHRoaW5GYW1pbHkgPSBUeXBlZmFjZS5jcmVhdGUoZmFtaWx5LCAxMDAgLyogd2VpZ2h0ICovLCBmYWxzZSAvKiBpdGFsaWMgKi8pOworICAgICAgICBhc3NlcnRFcXVhbHMoR0xZUEhfM0VNX1dJRFRILCBtZWFzdXJlVGV4dCgiYSIsIHRoaW5GYW1pbHkpLCAwZik7CisgICAgICAgIGFzc2VydEVxdWFscyhHTFlQSF8xRU1fV0lEVEgsIG1lYXN1cmVUZXh0KCJiIiwgdGhpbkZhbWlseSksIDBmKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEdMWVBIXzFFTV9XSURUSCwgbWVhc3VyZVRleHQoImMiLCB0aGluRmFtaWx5KSwgMGYpOworCisgICAgICAgIC8vIERyYXcgd2l0aCB0aGUgZm9udCB3aGljaCB3ZWlnaHQgaXMgNzAwLgorICAgICAgICBmaW5hbCBUeXBlZmFjZSBib2xkRmFtaWx5ID0gVHlwZWZhY2UuY3JlYXRlKGZhbWlseSwgNzAwIC8qIHdlaWdodCAqLywgZmFsc2UgLyogaXRhbGljICovKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEdMWVBIXzFFTV9XSURUSCwgbWVhc3VyZVRleHQoImEiLCBib2xkRmFtaWx5KSwgMGYpOworICAgICAgICBhc3NlcnRFcXVhbHMoR0xZUEhfMUVNX1dJRFRILCBtZWFzdXJlVGV4dCgiYiIsIGJvbGRGYW1pbHkpLCAwZik7CisgICAgICAgIGFzc2VydEVxdWFscyhHTFlQSF8zRU1fV0lEVEgsIG1lYXN1cmVUZXh0KCJjIiwgYm9sZEZhbWlseSksIDBmKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUeXBlZmFjZUNyZWF0ZV93aXRoRXhhY3RTdHlsZSgpIHsKKyAgICAgICAgLy8gbXVsdGl3ZWlnaHRfZmFtaWx5IGhhcyBmb2xsb3dpbmcgZm9udHMuCisgICAgICAgIC8vIC0gYTNlbS50dGYgd2l0aCB3ZWlnaHQgPSA0MDAsIHN0eWxlPW5vcm1hbCBjb25maWd1cmF0aW9uLgorICAgICAgICAvLyAgIFRoaXMgZm9udCBzdXBwb3J0cyAiYSIsICJiIiwgImMiLiBUaGUgd2VpZ2h0ICJhIiBpcyAzZW0sIG90aGVycyBhcmUgMWVtLgorICAgICAgICAvLyAtIGIzZW0udHRmIHdpdGggd2VpZ2h0ID0gNDAwLCBzdHlsZT1pdGFsaWMgY29uZmlndXJhdGlvbi4KKyAgICAgICAgLy8gICBUaGlzIGZvbnQgc3VwcG9ydHMgImEiLCAiYiIsICJjIi4gVGhlIHdlaWdodCAiYiIgaXMgM2VtLCBvdGhlcnMgYXJlIDFlbS4KKyAgICAgICAgLy8gLSBjM2VtLnR0ZiB3aXRoIHdlaWdodCA9IDcwMCwgc3R5bGU9aXRhbGljIGNvbmZpZ3VyYXRpb24uCisgICAgICAgIC8vICAgVGhpcyBmb250IHN1cHBvcnRzICJhIiwgImIiLCAiYyIuIFRoZSB3ZWlnaHQgImMiIGlzIDNlbSwgb3RoZXJzIGFyZSAxZW0uCisgICAgICAgIGZpbmFsIFR5cGVmYWNlIGZhbWlseSA9IG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldEZvbnQoUi5mb250Lm11bHRpc3R5bGVfZmFtaWx5KTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChmYW1pbHkpOworCisgICAgICAgIC8vIEJ5IGRlZmF1bHQsIHRoZSBub3JtYWwgc3R5bGUgZm9udCB3aGljaCB3ZWlnaHQgaXMgNDAwIGlzIHNlbGVjdGVkLgorICAgICAgICBhc3NlcnRFcXVhbHMoR0xZUEhfM0VNX1dJRFRILCBtZWFzdXJlVGV4dCgiYSIsIGZhbWlseSksIDBmKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEdMWVBIXzFFTV9XSURUSCwgbWVhc3VyZVRleHQoImIiLCBmYW1pbHkpLCAwZik7CisgICAgICAgIGFzc2VydEVxdWFscyhHTFlQSF8xRU1fV0lEVEgsIG1lYXN1cmVUZXh0KCJjIiwgZmFtaWx5KSwgMGYpOworCisgICAgICAgIC8vIERyYXcgd2l0aCB0aGUgaXRhbGljIGZvbnQuCisgICAgICAgIGZpbmFsIFR5cGVmYWNlIGl0YWxpY0ZhbWlseSA9IFR5cGVmYWNlLmNyZWF0ZShmYW1pbHksIDQwMCAvKiB3ZWlnaHQgKi8sIHRydWUgLyogaXRhbGljICovKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEdMWVBIXzFFTV9XSURUSCwgbWVhc3VyZVRleHQoImEiLCBpdGFsaWNGYW1pbHkpLCAwZik7CisgICAgICAgIGFzc2VydEVxdWFscyhHTFlQSF8zRU1fV0lEVEgsIG1lYXN1cmVUZXh0KCJiIiwgaXRhbGljRmFtaWx5KSwgMGYpOworICAgICAgICBhc3NlcnRFcXVhbHMoR0xZUEhfMUVNX1dJRFRILCBtZWFzdXJlVGV4dCgiYyIsIGl0YWxpY0ZhbWlseSksIDBmKTsKKworICAgICAgICAvLyBEcmF3IHdpdGggdGhlIGl0YWxpYyBmb250IHdoaWNoIHdlaWd0aCBpcyA3MDAuCisgICAgICAgIGZpbmFsIFR5cGVmYWNlIGJvbGRJdGFsaWNGYW1pbHkgPQorICAgICAgICAgICAgICAgIFR5cGVmYWNlLmNyZWF0ZShmYW1pbHksIDcwMCAvKiB3ZWlnaHQgKi8sIHRydWUgLyogaXRhbGljICovKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEdMWVBIXzFFTV9XSURUSCwgbWVhc3VyZVRleHQoImEiLCBib2xkSXRhbGljRmFtaWx5KSwgMGYpOworICAgICAgICBhc3NlcnRFcXVhbHMoR0xZUEhfMUVNX1dJRFRILCBtZWFzdXJlVGV4dCgiYiIsIGJvbGRJdGFsaWNGYW1pbHkpLCAwZik7CisgICAgICAgIGFzc2VydEVxdWFscyhHTFlQSF8zRU1fV0lEVEgsIG1lYXN1cmVUZXh0KCJjIiwgYm9sZEl0YWxpY0ZhbWlseSksIDBmKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGb250VmFyaWF0aW9uU2V0dGluZ3MoKSB7CisgICAgICAgIC8vIFdlaWdodEVxdWFsc0VtVmFyaWFibGVGb250IGlzIGEgc3BlY2lhbCBmb250IGdlbmVyYXRpbmcgdGhlIG91dGxpbmVzIGEgZ2x5cGggb2YgMS8xMDAwCisgICAgICAgIC8vIHdpZHRoIG9mIHRoZSBnaXZlbiB3Z2h0IGF4aXMuIEZvciBleGFtcGxlLCBpZiAzMDAgaXMgZ2l2ZW4gYXMgdGhlIHdnaHQgdmFsdWUgdG8gdGhlIGZvbnQsCisgICAgICAgIC8vIHRoZSBmb250IHdpbGwgZ2VuZXJhdGUgMC4zZW0gb2YgdGhlIGdseXBoIGZvciB0aGUgJ2EnLi4neicgY2hhcmFjdGVycy4KKyAgICAgICAgLy8gVGhlIG1pbmltdW0sIGRlZmF1bHQsIG1heGltdW0gdmFsdWUgb2YgJ3dnaHQnIGlzIDAsIDAsIDEwMDAuCisgICAgICAgIC8vIE5vIG90aGVyIGF4ZXMgYXJlIHN1cHBvcnRlZC4KKworICAgICAgICBmaW5hbCBBc3NldE1hbmFnZXIgYW0gPSBtQ29udGV4dC5nZXRBc3NldHMoKTsKKyAgICAgICAgZmluYWwgUGFpbnQgcGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgcGFpbnQuc2V0VGV4dFNpemUoMTAwKTsgIC8vIE1ha2UgMWVtID0gMTAwcHgKKworICAgICAgICAvLyBCeSBkZWZhdWx0LCBXZWlnaHRFcXVhbHNFbVZhcmlhYmxlRm9udCBoYXMgMCAnd2dodCcgdmFsdWUuCisgICAgICAgIHBhaW50LnNldFR5cGVmYWNlKG5ldyBUeXBlZmFjZS5CdWlsZGVyKGFtLCAiV2VpZ2h0RXF1YWxzRW1WYXJpYWJsZUZvbnQudHRmIikuYnVpbGQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLjBmLCBwYWludC5tZWFzdXJlVGV4dCgiYSIpLCAwLjBmKTsKKworICAgICAgICBwYWludC5zZXRUeXBlZmFjZShuZXcgVHlwZWZhY2UuQnVpbGRlcihhbSwgIldlaWdodEVxdWFsc0VtVmFyaWFibGVGb250LnR0ZiIpCisgICAgICAgICAgICAgICAgLnNldEZvbnRWYXJpYXRpb25TZXR0aW5ncygiJ3dnaHQnIDEwMCIpLmJ1aWxkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTAuMGYsIHBhaW50Lm1lYXN1cmVUZXh0KCJhIiksIDAuMGYpOworCisgICAgICAgIHBhaW50LnNldFR5cGVmYWNlKG5ldyBUeXBlZmFjZS5CdWlsZGVyKGFtLCAiV2VpZ2h0RXF1YWxzRW1WYXJpYWJsZUZvbnQudHRmIikKKyAgICAgICAgICAgICAgICAuc2V0Rm9udFZhcmlhdGlvblNldHRpbmdzKCInd2dodCcgMzAwIikuYnVpbGQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygzMC4wZiwgcGFpbnQubWVhc3VyZVRleHQoImEiKSwgMC4wZik7CisKKyAgICAgICAgcGFpbnQuc2V0VHlwZWZhY2UobmV3IFR5cGVmYWNlLkJ1aWxkZXIoYW0sICJXZWlnaHRFcXVhbHNFbVZhcmlhYmxlRm9udC50dGYiKQorICAgICAgICAgICAgICAgIC5zZXRGb250VmFyaWF0aW9uU2V0dGluZ3MoIid3Z2h0JyA4MDAiKS5idWlsZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDgwLjBmLCBwYWludC5tZWFzdXJlVGV4dCgiYSIpLCAwLjBmKTsKKworICAgICAgICBwYWludC5zZXRUeXBlZmFjZShuZXcgVHlwZWZhY2UuQnVpbGRlcihhbSwgIldlaWdodEVxdWFsc0VtVmFyaWFibGVGb250LnR0ZiIpCisgICAgICAgICAgICAgICAgLnNldEZvbnRWYXJpYXRpb25TZXR0aW5ncygiJ3dnaHQnIDU1MCIpLmJ1aWxkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNTUuMGYsIHBhaW50Lm1lYXN1cmVUZXh0KCJhIiksIDAuMGYpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZvbnRWYXJpYXRpb25TZXR0aW5nc19VbnN1cHBvcnRlZEF4ZXMoKSB7CisgICAgICAgIC8vIFdlaWdodEVxdWFsc0VtVmFyaWFibGVGb250IGlzIGEgc3BlY2lhbCBmb250IGdlbmVyYXRpbmcgdGhlIG91dGxpbmVzIGEgZ2x5cGggb2YgMS8xMDAwCisgICAgICAgIC8vIHdpZHRoIG9mIHRoZSBnaXZlbiB3Z2h0IGF4aXMuIEZvciBleGFtcGxlLCBpZiAzMDAgaXMgZ2l2ZW4gYXMgdGhlIHdnaHQgdmFsdWUgdG8gdGhlIGZvbnQsCisgICAgICAgIC8vIHRoZSBmb250IHdpbGwgZ2VuZXJhdGUgMC4zZW0gb2YgdGhlIGdseXBoIGZvciB0aGUgJ2EnLi4neicgY2hhcmFjdGVycy4KKyAgICAgICAgLy8gVGhlIG1pbmltdW0sIGRlZmF1bHQsIG1heGltdW0gdmFsdWUgb2YgJ3dnaHQnIGlzIDAsIDAsIDEwMDAuCisgICAgICAgIC8vIE5vIG90aGVyIGF4ZXMgYXJlIHN1cHBvcnRlZC4KKworICAgICAgICBmaW5hbCBBc3NldE1hbmFnZXIgYW0gPSBtQ29udGV4dC5nZXRBc3NldHMoKTsKKyAgICAgICAgZmluYWwgUGFpbnQgcGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgcGFpbnQuc2V0VGV4dFNpemUoMTAwKTsgIC8vIE1ha2UgMWVtID0gMTAwcHgKKworICAgICAgICAvLyBVbnN1cHBvcnRlZCBheGVzIGRvIG5vdCBhZmZlY3QgdGhlIHJlc3VsdC4KKyAgICAgICAgcGFpbnQuc2V0VHlwZWZhY2UobmV3IFR5cGVmYWNlLkJ1aWxkZXIoYW0sICJXZWlnaHRFcXVhbHNFbVZhcmlhYmxlRm9udC50dGYiKQorICAgICAgICAgICAgICAgIC5zZXRGb250VmFyaWF0aW9uU2V0dGluZ3MoIid3Z2h0JyAzMDAsICd3ZHRoJyAxMCIpLmJ1aWxkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMzAuMGYsIHBhaW50Lm1lYXN1cmVUZXh0KCJhIiksIDAuMGYpOworCisgICAgICAgIHBhaW50LnNldFR5cGVmYWNlKG5ldyBUeXBlZmFjZS5CdWlsZGVyKGFtLCAiV2VpZ2h0RXF1YWxzRW1WYXJpYWJsZUZvbnQudHRmIikKKyAgICAgICAgICAgICAgICAuc2V0Rm9udFZhcmlhdGlvblNldHRpbmdzKCInd2R0aCcgMTAsICd3Z2h0JyAzMDAiKS5idWlsZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMwLjBmLCBwYWludC5tZWFzdXJlVGV4dCgiYSIpLCAwLjBmKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGb250VmFyaWF0aW9uU2V0dGluZ3NfT3V0T2ZSYW5nZVZhbHVlKCkgeworICAgICAgICAvLyBXZWlnaHRFcXVhbHNFbVZhcmlhYmxlRm9udCBpcyBhIHNwZWNpYWwgZm9udCBnZW5lcmF0aW5nIHRoZSBvdXRsaW5lcyBhIGdseXBoIG9mIDEvMTAwMAorICAgICAgICAvLyB3aWR0aCBvZiB0aGUgZ2l2ZW4gd2dodCBheGlzLiBGb3IgZXhhbXBsZSwgaWYgMzAwIGlzIGdpdmVuIGFzIHRoZSB3Z2h0IHZhbHVlIHRvIHRoZSBmb250LAorICAgICAgICAvLyB0aGUgZm9udCB3aWxsIGdlbmVyYXRlIDAuM2VtIG9mIHRoZSBnbHlwaCBmb3IgdGhlICdhJy4uJ3onIGNoYXJhY3RlcnMuCisgICAgICAgIC8vIFRoZSBtaW5pbXVtLCBkZWZhdWx0LCBtYXhpbXVtIHZhbHVlIG9mICd3Z2h0JyBpcyAwLCAwLCAxMDAwLgorICAgICAgICAvLyBObyBvdGhlciBheGVzIGFyZSBzdXBwb3J0ZWQuCisKKyAgICAgICAgZmluYWwgQXNzZXRNYW5hZ2VyIGFtID0gbUNvbnRleHQuZ2V0QXNzZXRzKCk7CisgICAgICAgIGZpbmFsIFBhaW50IHBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgIHBhaW50LnNldFRleHRTaXplKDEwMCk7ICAvLyBNYWtlIDFlbSA9IDEwMHB4CisKKyAgICAgICAgLy8gT3V0IG9mIHJhbmdlIHZhbHVlIG5lZWRzIHRvIGJlIGNsaXBwZWQgYXQgdGhlIG1pbmltdW0gb3IgbWF4aW11bSB2YWx1ZXMuCisgICAgICAgIHBhaW50LnNldFR5cGVmYWNlKG5ldyBUeXBlZmFjZS5CdWlsZGVyKGFtLCAiV2VpZ2h0RXF1YWxzRW1WYXJpYWJsZUZvbnQudHRmIikKKyAgICAgICAgICAgICAgICAuc2V0Rm9udFZhcmlhdGlvblNldHRpbmdzKCInd2dodCcgLTEwMCIpLmJ1aWxkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMC4wZiwgcGFpbnQubWVhc3VyZVRleHQoImEiKSwgMC4wZik7CisKKyAgICAgICAgcGFpbnQuc2V0VHlwZWZhY2UobmV3IFR5cGVmYWNlLkJ1aWxkZXIoYW0sICJXZWlnaHRFcXVhbHNFbVZhcmlhYmxlRm9udC50dGYiKQorICAgICAgICAgICAgICAgIC5zZXRGb250VmFyaWF0aW9uU2V0dGluZ3MoIid3Z2h0JyAxMzAwIikuYnVpbGQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxMDAuMGYsIHBhaW50Lm1lYXN1cmVUZXh0KCJhIiksIDAuMGYpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFR5cGVmYWNlQ3JlYXRlX2dldFdlaWdodCgpIHsKKyAgICAgICAgVHlwZWZhY2UgdHlwZWZhY2UgPSBUeXBlZmFjZS5ERUZBVUxUOworICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLCB0eXBlZmFjZS5nZXRXZWlnaHQoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHR5cGVmYWNlLmlzSXRhbGljKCkpOworCisgICAgICAgIHR5cGVmYWNlID0gVHlwZWZhY2UuY3JlYXRlKFR5cGVmYWNlLkRFRkFVTFQsIDEwMCwgZmFsc2UgLyogaXRhbGljICovKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEwMCwgdHlwZWZhY2UuZ2V0V2VpZ2h0KCkpOworICAgICAgICBhc3NlcnRGYWxzZSh0eXBlZmFjZS5pc0l0YWxpYygpKTsKKworICAgICAgICB0eXBlZmFjZSA9IFR5cGVmYWNlLmNyZWF0ZShUeXBlZmFjZS5ERUZBVUxULCAxMDAsIHRydWUgLyogaXRhbGljICovKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEwMCwgdHlwZWZhY2UuZ2V0V2VpZ2h0KCkpOworICAgICAgICBhc3NlcnRUcnVlKHR5cGVmYWNlLmlzSXRhbGljKCkpOworCisgICAgICAgIHR5cGVmYWNlID0gVHlwZWZhY2UuY3JlYXRlKFR5cGVmYWNlLkRFRkFVTFQsIDQwMCwgZmFsc2UgLyogaXRhbGljICovKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwMCwgdHlwZWZhY2UuZ2V0V2VpZ2h0KCkpOworICAgICAgICBhc3NlcnRGYWxzZSh0eXBlZmFjZS5pc0l0YWxpYygpKTsKKworICAgICAgICB0eXBlZmFjZSA9IFR5cGVmYWNlLmNyZWF0ZShUeXBlZmFjZS5ERUZBVUxULCA0MDAsIHRydWUgLyogaXRhbGljICovKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwMCwgdHlwZWZhY2UuZ2V0V2VpZ2h0KCkpOworICAgICAgICBhc3NlcnRUcnVlKHR5cGVmYWNlLmlzSXRhbGljKCkpOworCisgICAgICAgIHR5cGVmYWNlID0gVHlwZWZhY2UuY3JlYXRlKFR5cGVmYWNlLkRFRkFVTFQsIDcwMCwgZmFsc2UgLyogaXRhbGljICovKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDcwMCwgdHlwZWZhY2UuZ2V0V2VpZ2h0KCkpOworICAgICAgICBhc3NlcnRGYWxzZSh0eXBlZmFjZS5pc0l0YWxpYygpKTsKKworICAgICAgICB0eXBlZmFjZSA9IFR5cGVmYWNlLmNyZWF0ZShUeXBlZmFjZS5ERUZBVUxULCA3MDAsIHRydWUgLyogaXRhbGljICovKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDcwMCwgdHlwZWZhY2UuZ2V0V2VpZ2h0KCkpOworICAgICAgICBhc3NlcnRUcnVlKHR5cGVmYWNlLmlzSXRhbGljKCkpOworCisgICAgICAgIC8vIE5vbi1zdGFuZGFyZCB3ZWlnaHQuCisgICAgICAgIHR5cGVmYWNlID0gVHlwZWZhY2UuY3JlYXRlKFR5cGVmYWNlLkRFRkFVTFQsIDI1MCwgZmFsc2UgLyogaXRhbGljICovKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDI1MCwgdHlwZWZhY2UuZ2V0V2VpZ2h0KCkpOworICAgICAgICBhc3NlcnRGYWxzZSh0eXBlZmFjZS5pc0l0YWxpYygpKTsKKworICAgICAgICB0eXBlZmFjZSA9IFR5cGVmYWNlLmNyZWF0ZShUeXBlZmFjZS5ERUZBVUxULCAyNTAsIHRydWUgLyogaXRhbGljICovKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDI1MCwgdHlwZWZhY2UuZ2V0V2VpZ2h0KCkpOworICAgICAgICBhc3NlcnRUcnVlKHR5cGVmYWNlLmlzSXRhbGljKCkpOworCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHlwZWZhY2VDcmVhdGVfY3VzdG9tRm9udF9nZXRXZWlnaHQoKSB7CisgICAgICAgIGZpbmFsIEFzc2V0TWFuYWdlciBhbSA9IG1Db250ZXh0LmdldEFzc2V0cygpOworCisgICAgICAgIFR5cGVmYWNlIHR5cGVmYWNlID0gbmV3IEJ1aWxkZXIoYW0sICJhc2NpaV9hM2VtX3dlaWdodDEwMF91cHJpZ2h0LnR0ZiIpLmJ1aWxkKCk7CisgICAgICAgIGFzc2VydEVxdWFscygxMDAsIHR5cGVmYWNlLmdldFdlaWdodCgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UodHlwZWZhY2UuaXNJdGFsaWMoKSk7CisKKyAgICAgICAgdHlwZWZhY2UgPSBuZXcgQnVpbGRlcihhbSwgImFzY2lpX2IzZW1fd2VpZ2h0MTAwX2l0YWxpYy50dGYiKS5idWlsZCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTAwLCB0eXBlZmFjZS5nZXRXZWlnaHQoKSk7CisgICAgICAgIGFzc2VydFRydWUodHlwZWZhY2UuaXNJdGFsaWMoKSk7CisKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUeXBlZmFjZUNyZWF0ZV9jdXN0b21Gb250X2N1c3RvbVdlaWdodCgpIHsKKyAgICAgICAgZmluYWwgQXNzZXRNYW5hZ2VyIGFtID0gbUNvbnRleHQuZ2V0QXNzZXRzKCk7CisgICAgICAgIFR5cGVmYWNlIHR5cGVmYWNlID0gbmV3IEJ1aWxkZXIoYW0sICJhc2NpaV9hM2VtX3dlaWdodDEwMF91cHJpZ2h0LnR0ZiIpCisgICAgICAgICAgICAgICAgLnNldFdlaWdodCg0MDApLmJ1aWxkKCk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDAsIHR5cGVmYWNlLmdldFdlaWdodCgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UodHlwZWZhY2UuaXNJdGFsaWMoKSk7CisKKyAgICAgICAgdHlwZWZhY2UgPSBuZXcgQnVpbGRlcihhbSwgImFzY2lpX2IzZW1fd2VpZ2h0MTAwX2l0YWxpYy50dGYiKS5zZXRXZWlnaHQoNDAwKS5idWlsZCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLCB0eXBlZmFjZS5nZXRXZWlnaHQoKSk7CisgICAgICAgIGFzc2VydFRydWUodHlwZWZhY2UuaXNJdGFsaWMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHlwZWZhY2VDcmVhdGVfY3VzdG9tRm9udF9jdXN0b21JdGFsaWMoKSB7CisgICAgICAgIGZpbmFsIEFzc2V0TWFuYWdlciBhbSA9IG1Db250ZXh0LmdldEFzc2V0cygpOworCisgICAgICAgIFR5cGVmYWNlIHR5cGVmYWNlID0gbmV3IEJ1aWxkZXIoYW0sICJhc2NpaV9hM2VtX3dlaWdodDEwMF91cHJpZ2h0LnR0ZiIpCisgICAgICAgICAgICAgICAgLnNldEl0YWxpYyh0cnVlKS5idWlsZCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTAwLCB0eXBlZmFjZS5nZXRXZWlnaHQoKSk7CisgICAgICAgIGFzc2VydFRydWUodHlwZWZhY2UuaXNJdGFsaWMoKSk7CisKKyAgICAgICAgdHlwZWZhY2UgPSBuZXcgQnVpbGRlcihhbSwgImFzY2lpX2IzZW1fd2VpZ2h0MTAwX2l0YWxpYy50dGYiKS5zZXRJdGFsaWMoZmFsc2UpLmJ1aWxkKCk7CisgICAgICAgIGFzc2VydEVxdWFscygxMDAsIHR5cGVmYWNlLmdldFdlaWdodCgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UodHlwZWZhY2UuaXNJdGFsaWMoKSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1Z1bGthbkZlYXR1cmVzVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1Z1bGthbkZlYXR1cmVzVGVzdC5qYXZhCmluZGV4IDI4YjlkMDYuLmEzZmMyZDMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9WdWxrYW5GZWF0dXJlc1Rlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvVnVsa2FuRmVhdHVyZXNUZXN0LmphdmEKQEAgLTIzLDExICsyMywxNCBAQAogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkZlYXR1cmVJbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNkZFRlc3Q7CisKIGltcG9ydCBvcmcuanNvbi5KU09OQXJyYXk7CiBpbXBvcnQgb3JnLmpzb24uSlNPTkV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuanNvbi5KU09OT2JqZWN0OwpAQCAtMzYsNyArMzksNiBAQAogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIAogaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNkZFRlc3Q7CiAKIC8qKgogICogVGVzdCB0aGF0IHRoZSBWdWxrYW4gbG9hZGVyIGlzIHByZXNlbnQsIHN1cHBvcnRzIHRoZSByZXF1aXJlZCBleHRlbnNpb25zLCBhbmQgdGhhdCBzeXN0ZW0KQEAgLTU2LDEyICs1OCwyMCBAQAogICAgIC8vIFJlcXVpcmUgcGF0Y2ggdmVyc2lvbiAzIGZvciBWdWxrYW4gMS4wOiBJdCB3YXMgdGhlIGZpcnN0IHB1YmxpY2x5IGF2YWlsYWJsZSB2ZXJzaW9uLAogICAgIC8vIGFuZCB0aGVyZSB3YXMgYW4gaW1wb3J0YW50IGJ1Z2ZpeCByZWxhdGl2ZSB0byAxLjAuMi4KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVlVMS0FOXzFfMCA9IDB4MDA0MDAwMDM7IC8vIDEuMC4zCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZVTEtBTl8xXzEgPSAweDAwNDAxMDAwOyAvLyAxLjEuMAorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZLX0FORFJPSURfRVhURVJOQUxfTUVNT1JZX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX0VYVEVOU0lPTl9OQU1FID0KKyAgICAgICAgICAgICJWS19BTkRST0lEX2V4dGVybmFsX21lbW9yeV9hbmRyb2lkX2hhcmR3YXJlX2J1ZmZlciI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZLX0FORFJPSURfRVhURVJOQUxfTUVNT1JZX0FORFJPSURfSEFSRFdBUkVfQlVGRkVSX1NQRUNfVkVSU0lPTiA9IDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZLX0VYVEVSTkFMX0ZFTkNFX0hBTkRMRV9UWVBFX1NZTkNfRkRfQklUID0gMHg4OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWS19FWFRFUk5BTF9TRU1BUEhPUkVfSEFORExFX1RZUEVfU1lOQ19GRF9CSVQgPSAweDEwOwogCiAgICAgcHJpdmF0ZSBQYWNrYWdlTWFuYWdlciBtUG07CiAgICAgcHJpdmF0ZSBGZWF0dXJlSW5mbyBtVnVsa2FuSGFyZHdhcmVMZXZlbCA9IG51bGw7CiAgICAgcHJpdmF0ZSBGZWF0dXJlSW5mbyBtVnVsa2FuSGFyZHdhcmVWZXJzaW9uID0gbnVsbDsKICAgICBwcml2YXRlIEZlYXR1cmVJbmZvIG1WdWxrYW5IYXJkd2FyZUNvbXB1dGUgPSBudWxsOwogICAgIHByaXZhdGUgSlNPTk9iamVjdCBtVnVsa2FuRGV2aWNlc1tdOworICAgIHByaXZhdGUgSlNPTk9iamVjdCBtQmVzdERldmljZSA9IG51bGw7CiAKICAgICBAQmVmb3JlCiAgICAgcHVibGljIHZvaWQgc2V0dXAoKSB0aHJvd3MgVGhyb3dhYmxlIHsKQEAgLTg5LDggKzk5LDkgQEAKICAgICAgICAgfQogCiAgICAgICAgIG1WdWxrYW5EZXZpY2VzID0gZ2V0VnVsa2FuRGV2aWNlcygpOworICAgICAgICBtQmVzdERldmljZSA9IGdldEJlc3REZXZpY2UoKTsKICAgICB9Ci0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuMS40LjIvQy0xLTEsQy0yLTEsQy0yLTIiKQorICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjEuNC4yL0MtMS0xLEMtMi0xIikKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RWdWxrYW5IYXJkd2FyZUZlYXR1cmVzKCkgdGhyb3dzIEpTT05FeGNlcHRpb24gewogICAgICAgICBpZiAoREVCVUcpIHsKQEAgLTEzMywyNyArMTQ0LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgbVZ1bGthbkhhcmR3YXJlQ29tcHV0ZS52ZXJzaW9uID09IDApOwogICAgICAgICB9CiAKLSAgICAgICAgSlNPTk9iamVjdCBiZXN0RGV2aWNlID0gbnVsbDsKLSAgICAgICAgaW50IGJlc3REZXZpY2VMZXZlbCA9IC0xOwotICAgICAgICBpbnQgYmVzdENvbXB1dGVMZXZlbCA9IC0xOwotICAgICAgICBpbnQgYmVzdERldmljZVZlcnNpb24gPSAtMTsKLSAgICAgICAgZm9yIChKU09OT2JqZWN0IGRldmljZSA6IG1WdWxrYW5EZXZpY2VzKSB7Ci0gICAgICAgICAgICBpbnQgbGV2ZWwgPSBkZXRlcm1pbmVIYXJkd2FyZUxldmVsKGRldmljZSk7Ci0gICAgICAgICAgICBpbnQgY29tcHV0ZSA9IGRldGVybWluZUhhcmR3YXJlQ29tcHV0ZShkZXZpY2UpOwotICAgICAgICAgICAgaW50IHZlcnNpb24gPSBkZXRlcm1pbmVIYXJkd2FyZVZlcnNpb24oZGV2aWNlKTsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgZGV2aWNlLmdldEpTT05PYmplY3QoInByb3BlcnRpZXMiKS5nZXRTdHJpbmcoImRldmljZU5hbWUiKSArCi0gICAgICAgICAgICAgICAgICAgICI6IGxldmVsPSIgKyBsZXZlbCArICIgY29tcHV0ZT0iICsgY29tcHV0ZSArCi0gICAgICAgICAgICAgICAgICAgICIgdmVyc2lvbj0weCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKHZlcnNpb24pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChsZXZlbCA+PSBiZXN0RGV2aWNlTGV2ZWwgJiYgY29tcHV0ZSA+PSBiZXN0Q29tcHV0ZUxldmVsICYmCi0gICAgICAgICAgICAgICAgICAgIHZlcnNpb24gPj0gYmVzdERldmljZVZlcnNpb24pIHsKLSAgICAgICAgICAgICAgICBiZXN0RGV2aWNlID0gZGV2aWNlOwotICAgICAgICAgICAgICAgIGJlc3REZXZpY2VMZXZlbCA9IGxldmVsOwotICAgICAgICAgICAgICAgIGJlc3RDb21wdXRlTGV2ZWwgPSBjb21wdXRlOwotICAgICAgICAgICAgICAgIGJlc3REZXZpY2VWZXJzaW9uID0gdmVyc2lvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBpbnQgYmVzdERldmljZUxldmVsID0gZGV0ZXJtaW5lSGFyZHdhcmVMZXZlbChtQmVzdERldmljZSk7CisgICAgICAgIGludCBiZXN0Q29tcHV0ZUxldmVsID0gZGV0ZXJtaW5lSGFyZHdhcmVDb21wdXRlKG1CZXN0RGV2aWNlKTsKKyAgICAgICAgaW50IGJlc3REZXZpY2VWZXJzaW9uID0gZGV0ZXJtaW5lSGFyZHdhcmVWZXJzaW9uKG1CZXN0RGV2aWNlKTsKIAogICAgICAgICBhc3NlcnRFcXVhbHMoIlN5c3RlbSBmZWF0dXJlICIgKyBQYWNrYWdlTWFuYWdlci5GRUFUVVJFX1ZVTEtBTl9IQVJEV0FSRV9MRVZFTCArCiAgICAgICAgICAgICAiIHZlcnNpb24gIiArIG1WdWxrYW5IYXJkd2FyZUxldmVsLnZlcnNpb24gKyAiIGRvZXNuJ3QgbWF0Y2ggYmVzdCBwaHlzaWNhbCBkZXZpY2UgIiArCkBAIC0xNzksNiArMTcyLDIzIEBACiAKICAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iNy45LjIvQy0xLTUiKQogICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFZ1bGthbjFfMVJlcXVpcmVtZW50cygpIHRocm93cyBKU09ORXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG1WdWxrYW5IYXJkd2FyZVZlcnNpb24gPT0gbnVsbCB8fCBtVnVsa2FuSGFyZHdhcmVWZXJzaW9uLnZlcnNpb24gPCBWVUxLQU5fMV8xKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBhc3NlcnRUcnVlKCJEZXZpY2VzIHdpdGggVnVsa2FuIDEuMSBtdXN0IHN1cHBvcnQgU1lOQ19GRCBleHRlcm5hbCBzZW1hcGhvcmVzIiwKKyAgICAgICAgICAgICAgICBoYXNIYW5kbGVUeXBlKG1CZXN0RGV2aWNlLmdldEpTT05BcnJheSgiZXh0ZXJuYWxTZW1hcGhvcmVQcm9wZXJ0aWVzIiksCisgICAgICAgICAgICAgICAgICAgIFZLX0VYVEVSTkFMX1NFTUFQSE9SRV9IQU5ETEVfVFlQRV9TWU5DX0ZEX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgImV4dGVybmFsU2VtYXBob3JlRmVhdHVyZXMiLCAweDMgLyogaW1wb3J0YWJsZSArIGV4cG9ydGFibGUgKi8pKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRGV2aWNlcyB3aXRoIFZ1bGthbiAxLjEgbXVzdCBzdXBwb3J0IFNZTkNfRkQgZXh0ZXJuYWwgZmVuY2VzIiwKKyAgICAgICAgICAgICAgICBoYXNIYW5kbGVUeXBlKG1CZXN0RGV2aWNlLmdldEpTT05BcnJheSgiZXh0ZXJuYWxGZW5jZVByb3BlcnRpZXMiKSwKKyAgICAgICAgICAgICAgICAgICAgVktfRVhURVJOQUxfRkVOQ0VfSEFORExFX1RZUEVfU1lOQ19GRF9CSVQsCisgICAgICAgICAgICAgICAgICAgICJleHRlcm5hbEZlbmNlRmVhdHVyZXMiLCAweDMgLyogaW1wb3J0YWJsZSArIGV4cG9ydGFibGUgKi8pKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRGV2aWNlcyB3aXRoIFZ1bGthbiAxLjEgbXVzdCBzdXBwb3J0IHNhbXBsZXIgWUNiQ3IgY29udmVyc2lvbiIsCisgICAgICAgICAgICAgICAgbUJlc3REZXZpY2UuZ2V0SlNPTk9iamVjdCgic2FtcGxlclljYmNyQ29udmVyc2lvbkZlYXR1cmVzIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRJbnQoInNhbXBsZXJZY2JjckNvbnZlcnNpb24iKSAhPSAwKTsKKyAgICB9CisKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RWdWxrYW5WZXJzaW9uRm9yVnJIaWdoUGVyZm9ybWFuY2UoKSB7CiAgICAgICAgIGlmICghbVBtLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9WUl9NT0RFX0hJR0hfUEVSRk9STUFOQ0UpKQogICAgICAgICAgICAgcmV0dXJuOwpAQCAtMTg5LDYgKzE5OSwzMSBAQAogICAgICAgICAgICAgbVZ1bGthbkhhcmR3YXJlTGV2ZWwgIT0gbnVsbCAmJiBtVnVsa2FuSGFyZHdhcmVMZXZlbC52ZXJzaW9uID49IDApOwogICAgIH0KIAorICAgIHByaXZhdGUgSlNPTk9iamVjdCBnZXRCZXN0RGV2aWNlKCkgdGhyb3dzIEpTT05FeGNlcHRpb24geworICAgICAgICBKU09OT2JqZWN0IGJlc3REZXZpY2UgPSBudWxsOworICAgICAgICBpbnQgYmVzdERldmljZUxldmVsID0gLTE7CisgICAgICAgIGludCBiZXN0Q29tcHV0ZUxldmVsID0gLTE7CisgICAgICAgIGludCBiZXN0RGV2aWNlVmVyc2lvbiA9IC0xOworICAgICAgICBmb3IgKEpTT05PYmplY3QgZGV2aWNlIDogbVZ1bGthbkRldmljZXMpIHsKKyAgICAgICAgICAgIGludCBsZXZlbCA9IGRldGVybWluZUhhcmR3YXJlTGV2ZWwoZGV2aWNlKTsKKyAgICAgICAgICAgIGludCBjb21wdXRlID0gZGV0ZXJtaW5lSGFyZHdhcmVDb21wdXRlKGRldmljZSk7CisgICAgICAgICAgICBpbnQgdmVyc2lvbiA9IGRldGVybWluZUhhcmR3YXJlVmVyc2lvbihkZXZpY2UpOworICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBkZXZpY2UuZ2V0SlNPTk9iamVjdCgicHJvcGVydGllcyIpLmdldFN0cmluZygiZGV2aWNlTmFtZSIpICsKKyAgICAgICAgICAgICAgICAgICAgIjogbGV2ZWw9IiArIGxldmVsICsgIiBjb21wdXRlPSIgKyBjb21wdXRlICsKKyAgICAgICAgICAgICAgICAgICAgIiB2ZXJzaW9uPTB4IiArIEludGVnZXIudG9IZXhTdHJpbmcodmVyc2lvbikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxldmVsID49IGJlc3REZXZpY2VMZXZlbCAmJiBjb21wdXRlID49IGJlc3RDb21wdXRlTGV2ZWwgJiYKKyAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiA+PSBiZXN0RGV2aWNlVmVyc2lvbikgeworICAgICAgICAgICAgICAgIGJlc3REZXZpY2UgPSBkZXZpY2U7CisgICAgICAgICAgICAgICAgYmVzdERldmljZUxldmVsID0gbGV2ZWw7CisgICAgICAgICAgICAgICAgYmVzdENvbXB1dGVMZXZlbCA9IGNvbXB1dGU7CisgICAgICAgICAgICAgICAgYmVzdERldmljZVZlcnNpb24gPSB2ZXJzaW9uOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBiZXN0RGV2aWNlOworICAgIH0KKwogICAgIHByaXZhdGUgaW50IGRldGVybWluZUhhcmR3YXJlTGV2ZWwoSlNPTk9iamVjdCBkZXZpY2UpIHRocm93cyBKU09ORXhjZXB0aW9uIHsKICAgICAgICAgSlNPTk9iamVjdCBmZWF0dXJlcyA9IGRldmljZS5nZXRKU09OT2JqZWN0KCJmZWF0dXJlcyIpOwogICAgICAgICBib29sZWFuIHRleHR1cmVDb21wcmVzc2lvbkVUQzIgPSBmZWF0dXJlcy5nZXRJbnQoInRleHR1cmVDb21wcmVzc2lvbkVUQzIiKSAhPSAwOwpAQCAtMjIzLDggKzI1OCw5IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBpbnQgZGV0ZXJtaW5lSGFyZHdhcmVDb21wdXRlKEpTT05PYmplY3QgZGV2aWNlKSB0aHJvd3MgSlNPTkV4Y2VwdGlvbiB7Ci0gICAgICAgIEpTT05PYmplY3QgdmFyaWFibGVQb2ludGVyc0ZlYXR1cmVzID0gZGV2aWNlLmdldEpTT05PYmplY3QoInZhcmlhYmxlUG9pbnRlcnNGZWF0dXJlc0tIUiIpOwotICAgICAgICBib29sZWFuIHZhcmlhYmxlUG9pbnRlcnMgPSB2YXJpYWJsZVBvaW50ZXJzRmVhdHVyZXMuZ2V0SW50KCJ2YXJpYWJsZVBvaW50ZXJzIikgIT0gMDsKKyAgICAgICAgYm9vbGVhbiB2YXJpYWJsZVBvaW50ZXJzID0gZGV2aWNlLmdldEpTT05PYmplY3QoIlZLX0tIUl92YXJpYWJsZV9wb2ludGVycyIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRKU09OT2JqZWN0KCJ2YXJpYWJsZVBvaW50ZXJGZWF0dXJlc0tIUiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRJbnQoInZhcmlhYmxlUG9pbnRlcnMiKSAhPSAwOwogICAgICAgICBKU09OT2JqZWN0IGxpbWl0cyA9IGRldmljZS5nZXRKU09OT2JqZWN0KCJwcm9wZXJ0aWVzIikuZ2V0SlNPTk9iamVjdCgibGltaXRzIik7CiAgICAgICAgIGludCBtYXhQZXJTdGFnZURlc2NyaXB0b3JTdG9yYWdlQnVmZmVycyA9IGxpbWl0cy5nZXRJbnQoIm1heFBlclN0YWdlRGVzY3JpcHRvclN0b3JhZ2VCdWZmZXJzIik7CiAgICAgICAgIGlmIChERUJVRykgewpAQCAtMjYzLDYgKzI5OSw3IEBACiAgICAgICAgIC8vIHBhdGNoIHZlcnNpb25zLgogICAgICAgICBmaW5hbCBpbnRbXSBBTExPV0VEX0hBUkRXQVJFX1ZFUlNJT05TID0gewogICAgICAgICAgICAgVlVMS0FOXzFfMCwKKyAgICAgICAgICAgIFZVTEtBTl8xXzEsCiAgICAgICAgIH07CiAgICAgICAgIGZvciAoaW50IGV4cGVjdGVkIDogQUxMT1dFRF9IQVJEV0FSRV9WRVJTSU9OUykgewogICAgICAgICAgICAgaWYgKGFjdHVhbCA9PSBleHBlY3RlZCkgewpAQCAtMjcyLDEwICszMDksMzUgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAorICAgIHByaXZhdGUgYm9vbGVhbiBoYXNFeHRlbnNpb24oSlNPTk9iamVjdCBkZXZpY2UsIFN0cmluZyBuYW1lLCBpbnQgbWluVmVyc2lvbikKKyAgICAgICAgICAgIHRocm93cyBKU09ORXhjZXB0aW9uIHsKKyAgICAgICAgSlNPTkFycmF5IGV4dGVuc2lvbnMgPSBkZXZpY2UuZ2V0SlNPTkFycmF5KCJleHRlbnNpb25zIik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICBKU09OT2JqZWN0IGV4dCA9IGV4dGVuc2lvbnMuZ2V0SlNPTk9iamVjdChpKTsKKyAgICAgICAgICAgIGlmIChleHQuZ2V0U3RyaW5nKCJleHRlbnNpb25OYW1lIikuZXF1YWxzKG5hbWUpICYmCisgICAgICAgICAgICAgICAgICAgIGV4dC5nZXRJbnQoInNwZWNWZXJzaW9uIikgPj0gbWluVmVyc2lvbikKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGhhc0hhbmRsZVR5cGUoSlNPTkFycmF5IGhhbmRsZVR5cGVzLCBpbnQgdHlwZSwKKyAgICAgICAgICAgIFN0cmluZyBmZWF0dXJlc05hbWUsIGludCByZXF1aXJlZEZlYXR1cmVzKSB0aHJvd3MgSlNPTkV4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGFuZGxlVHlwZXMubGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgSlNPTkFycmF5IHR5cGVSZWNvcmQgPSBoYW5kbGVUeXBlcy5nZXRKU09OQXJyYXkoaSk7CisgICAgICAgICAgICBpZiAodHlwZVJlY29yZC5nZXRJbnQoMCkgPT0gdHlwZSkgeworICAgICAgICAgICAgICAgIEpTT05PYmplY3QgdHlwZUluZm8gPSB0eXBlUmVjb3JkLmdldEpTT05PYmplY3QoMSk7CisgICAgICAgICAgICAgICAgaWYgKCh0eXBlSW5mby5nZXRJbnQoZmVhdHVyZXNOYW1lKSAmIHJlcXVpcmVkRmVhdHVyZXMpID09IHJlcXVpcmVkRmVhdHVyZXMpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgU3RyaW5nIG5hdGl2ZUdldFZrSlNPTigpOwogCiAgICAgcHJpdmF0ZSBKU09OT2JqZWN0W10gZ2V0VnVsa2FuRGV2aWNlcygpIHRocm93cyBKU09ORXhjZXB0aW9uLCBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgSlNPTkFycmF5IHZranNvbiA9IG5ldyBKU09OQXJyYXkobmF0aXZlR2V0VmtKU09OKCkpOworICAgICAgICBKU09OQXJyYXkgdmtqc29uID0gKG5ldyBKU09OT2JqZWN0KG5hdGl2ZUdldFZrSlNPTigpKSkuZ2V0SlNPTkFycmF5KCJkZXZpY2VzIik7CiAgICAgICAgIEpTT05PYmplY3RbXSBkZXZpY2VzID0gbmV3IEpTT05PYmplY3Rbdmtqc29uLmxlbmd0aCgpXTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2a2pzb24ubGVuZ3RoKCk7IGkrKykgewogICAgICAgICAgICAgZGV2aWNlc1tpXSA9IHZranNvbi5nZXRKU09OT2JqZWN0KGkpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1Z1bGthblByZVRyYW5zZm9ybUN0c0FjdGl2aXR5LmphdmEgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvVnVsa2FuUHJlVHJhbnNmb3JtQ3RzQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmNiNzU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1Z1bGthblByZVRyYW5zZm9ybUN0c0FjdGl2aXR5LmphdmEKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5ncmFwaGljcy5jdHM7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQWN0aXZpdHlJbmZvOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKKworLyoqCisgKiBBY3Rpdml0eSBmb3IgVnVsa2FuUHJlVHJhbnNmb3JtVGVzdC4KKyAqLworcHVibGljIGNsYXNzIFZ1bGthblByZVRyYW5zZm9ybUN0c0FjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIHN0YXRpYyB7CisgICAgICAgIFN5c3RlbS5sb2FkTGlicmFyeSgiY3RzZ3JhcGhpY3Nfam5pIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJ2dWxrYW4iOworCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzT3JpZW50YXRpb25SZXF1ZXN0ZWQgPSBmYWxzZTsKKworICAgIHByb3RlY3RlZCBTdXJmYWNlIG1TdXJmYWNlOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBMb2cuZChUQUcsICJvbkNyZWF0ZSEiKTsKKyAgICAgICAgc2V0QWN0aXZpdHlPcmllbnRhdGlvbigpOworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC52dWxrYW5fcHJldHJhbnNmb3JtX2xheW91dCk7CisgICAgICAgIFN1cmZhY2VWaWV3IHN1cmZhY2VWaWV3ID0gKFN1cmZhY2VWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5zdXJmYWNldmlldyk7CisgICAgICAgIG1TdXJmYWNlID0gc3VyZmFjZVZpZXcuZ2V0SG9sZGVyKCkuZ2V0U3VyZmFjZSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRBY3Rpdml0eU9yaWVudGF0aW9uKCkgeworICAgICAgICBpZiAoc09yaWVudGF0aW9uUmVxdWVzdGVkKSB7CisgICAgICAgICAgICAvLyBpdCBtaWdodCBiZSBjYWxsZWQgYWdhaW4gYmVjYXVzZSBjaGFuZ2luZyB0aGUgb3JpZW50YXRpb24ga2lja3Mgb2ZmIG9uQ3JlYXRlIGFnYWluIS4KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChnZXRSb3RhdGlvbigpID09IFN1cmZhY2UuUk9UQVRJT05fMCkgeworICAgICAgICAgICAgaWYgKGdldFJlc291cmNlcygpLmdldENvbmZpZ3VyYXRpb24oKS5vcmllbnRhdGlvbgorICAgICAgICAgICAgICAgICAgICA9PSBDb25maWd1cmF0aW9uLk9SSUVOVEFUSU9OX0xBTkRTQ0FQRSkgeworICAgICAgICAgICAgICAgIHNldFJlcXVlc3RlZE9yaWVudGF0aW9uKEFjdGl2aXR5SW5mby5TQ1JFRU5fT1JJRU5UQVRJT05fUE9SVFJBSVQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzZXRSZXF1ZXN0ZWRPcmllbnRhdGlvbihBY3Rpdml0eUluZm8uU0NSRUVOX09SSUVOVEFUSU9OX0xBTkRTQ0FQRSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzT3JpZW50YXRpb25SZXF1ZXN0ZWQgPSB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0Um90YXRpb24oKSB7CisgICAgICAgIHJldHVybiAoKFdpbmRvd01hbmFnZXIpIGdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5XSU5ET1dfU0VSVklDRSkpCisgICAgICAgICAgICAgICAgLmdldERlZmF1bHREaXNwbGF5KCkKKyAgICAgICAgICAgICAgICAuZ2V0Um90YXRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VnVsa2FuUHJlVHJhbnNmb3JtKGJvb2xlYW4gc2V0UHJlVHJhbnNmb3JtKSB7CisgICAgICAgIG5DcmVhdGVOYXRpdmVUZXN0KGdldEFzc2V0cygpLCBtU3VyZmFjZSwgc2V0UHJlVHJhbnNmb3JtKTsKKyAgICAgICAgc09yaWVudGF0aW9uUmVxdWVzdGVkID0gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbkNyZWF0ZU5hdGl2ZVRlc3QoCisgICAgICAgICAgICBBc3NldE1hbmFnZXIgbWFuYWdlciwgU3VyZmFjZSBzdXJmYWNlLCBib29sZWFuIHNldFByZVRyYW5zZm9ybSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvVnVsa2FuUHJlVHJhbnNmb3JtVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1Z1bGthblByZVRyYW5zZm9ybVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTYwOTMxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1Z1bGthblByZVRyYW5zZm9ybVRlc3QuamF2YQpAQCAtMCwwICsxLDIwMSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmdyYXBoaWNzLmN0czsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3I7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLkxhcmdlVGVzdDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5QaXhlbENvcHk7CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VWaWV3OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5TeW5jaHJvbm91c1BpeGVsQ29weTsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworCisvKgorICogdGVzdFZ1bGthblByZVRyYW5zZm9ybVNldFRvTWF0Y2hDdXJyZW50VHJhbnNmb3JtKCkKKyAqCisgKiAgIEZvciBkZXZpY2VzIHJvdGF0aW5nIDkwIGRlZ3JlZXMuCisgKgorICogICAgICBCdWZmZXIgICAgICAgICAgU2NyZWVuCisgKiAgICAgIC0tLS0tLS0tLSAgICAgICAtLS0tLS0tLS0KKyAqICAgICAgfCBSIHwgRyB8ICAgICAgIHwgRyB8IFkgfAorICogICAgICAtLS0tLS0tLS0gICAgICAgLS0tLS0tLS0tCisgKiAgICAgIHwgQiB8IFkgfCAgICAgICB8IFIgfCBCIHwKKyAqICAgICAgLS0tLS0tLS0tICAgICAgIC0tLS0tLS0tLQorICoKKyAqICAgRm9yIGRldmljZXMgcm90YXRpbmcgMTgwIGRlZ3JlZXMuCisgKgorICogICAgICBCdWZmZXIgICAgICAgICAgU2NyZWVuCisgKiAgICAgIC0tLS0tLS0tLSAgICAgICAtLS0tLS0tLS0KKyAqICAgICAgfCBSIHwgRyB8ICAgICAgIHwgWSB8IEIgfAorICogICAgICAtLS0tLS0tLS0gICAgICAgLS0tLS0tLS0tCisgKiAgICAgIHwgQiB8IFkgfCAgICAgICB8IEcgfCBSIHwKKyAqICAgICAgLS0tLS0tLS0tICAgICAgIC0tLS0tLS0tLQorICoKKyAqICAgRm9yIGRldmljZXMgcm90YXRpbmcgMjcwIGRlZ3JlZXMuCisgKgorICogICAgICBCdWZmZXIgICAgICAgICAgU2NyZWVuCisgKiAgICAgIC0tLS0tLS0tLSAgICAgICAtLS0tLS0tLS0KKyAqICAgICAgfCBSIHwgRyB8ICAgICAgIHwgQiB8IFIgfAorICogICAgICAtLS0tLS0tLS0gICAgICAgLS0tLS0tLS0tCisgKiAgICAgIHwgQiB8IFkgfCAgICAgICB8IFkgfCBHIHwKKyAqICAgICAgLS0tLS0tLS0tICAgICAgIC0tLS0tLS0tLQorICoKKyAqICAgRm9yIGRldmljZXMgbm90IHJvdGF0aW5nLgorICoKKyAqICAgICAgQnVmZmVyICAgICAgICAgIFNjcmVlbgorICogICAgICAtLS0tLS0tLS0gICAgICAgLS0tLS0tLS0tCisgKiAgICAgIHwgUiB8IEcgfCAgICAgICB8IFIgfCBHIHwKKyAqICAgICAgLS0tLS0tLS0tICAgICAgIC0tLS0tLS0tLQorICogICAgICB8IEIgfCBZIHwgICAgICAgfCBCIHwgWSB8CisgKiAgICAgIC0tLS0tLS0tLSAgICAgICAtLS0tLS0tLS0KKyAqCisgKiB0ZXN0VnVsa2FuUHJlVHJhbnNmb3JtTm90U2V0VG9NYXRjaEN1cnJlbnRUcmFuc2Zvcm0oKQorICoKKyAqICAgICAgQnVmZmVyICAgICAgICAgIFNjcmVlbgorICogICAgICAtLS0tLS0tLS0gICAgICAgLS0tLS0tLS0tCisgKiAgICAgIHwgUiB8IEcgfCAgICAgICB8IFIgfCBHIHwKKyAqICAgICAgLS0tLS0tLS0tICAgICAgIC0tLS0tLS0tLQorICogICAgICB8IEIgfCBZIHwgICAgICAgfCBCIHwgWSB8CisgKiAgICAgIC0tLS0tLS0tLSAgICAgICAtLS0tLS0tLS0KKyAqLworCitATGFyZ2VUZXN0CitAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIFZ1bGthblByZVRyYW5zZm9ybVRlc3QgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAidnVsa2FuIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7CisgICAgcHJpdmF0ZSBzdGF0aWMgVnVsa2FuUHJlVHJhbnNmb3JtQ3RzQWN0aXZpdHkgc0FjdGl2aXR5ID0gbnVsbDsKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisKKyAgICBAUnVsZQorICAgIHB1YmxpYyBBY3Rpdml0eVRlc3RSdWxlPFZ1bGthblByZVRyYW5zZm9ybUN0c0FjdGl2aXR5PiBtQWN0aXZpdHlSdWxlID0KKyAgICAgICAgICAgIG5ldyBBY3Rpdml0eVRlc3RSdWxlPD4oVnVsa2FuUHJlVHJhbnNmb3JtQ3RzQWN0aXZpdHkuY2xhc3MsIGZhbHNlLCBmYWxzZSk7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIExvZy5kKFRBRywgInNldFVwISIpOworICAgICAgICAvLyBXb3JrIGFyb3VuZCBmb3IgYi83NzE0ODgwNworICAgICAgICAvLyBBY3Rpdml0eSB3YXMgZmFsc2VseSBjcmVhdGVkIGJlZm9yZSBBY3Rpdml0eU1hbmFnZXIgc2V0IGNvbmZpZyBjaGFuZ2UgdG8gbGFuZHNjYXBlCisgICAgICAgIFN5c3RlbUNsb2NrLnNsZWVwKDIwMDApOworICAgICAgICBtQ29udGV4dCA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWdWxrYW5QcmVUcmFuc2Zvcm1TZXRUb01hdGNoQ3VycmVudFRyYW5zZm9ybSgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBMb2cuZChUQUcsICJ0ZXN0VnVsa2FuUHJlVHJhbnNmb3JtU2V0VG9NYXRjaEN1cnJlbnRUcmFuc2Zvcm0gc3RhcnQiKTsKKyAgICAgICAgaWYgKCFoYXNEZXZpY2VGZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfU0NSRUVOX1BPUlRSQUlUKQorICAgICAgICAgICAgICAgIHx8ICFoYXNEZXZpY2VGZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfU0NSRUVOX0xBTkRTQ0FQRSkpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIlJvdGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBkZXZpY2UuIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc0FjdGl2aXR5ID0gbUFjdGl2aXR5UnVsZS5sYXVuY2hBY3Rpdml0eShudWxsKTsKKyAgICAgICAgc0FjdGl2aXR5LnRlc3RWdWxrYW5QcmVUcmFuc2Zvcm0odHJ1ZSk7CisgICAgICAgIHNBY3Rpdml0eS5maW5pc2goKTsKKyAgICAgICAgc0FjdGl2aXR5ID0gbnVsbDsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWdWxrYW5QcmVUcmFuc2Zvcm1Ob3RTZXRUb01hdGNoQ3VycmVudFRyYW5zZm9ybSgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBMb2cuZChUQUcsICJ0ZXN0VnVsa2FuUHJlVHJhbnNmb3JtTm90U2V0VG9NYXRjaEN1cnJlbnRUcmFuc2Zvcm0gc3RhcnQiKTsKKyAgICAgICAgaWYgKCFoYXNEZXZpY2VGZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfU0NSRUVOX1BPUlRSQUlUKQorICAgICAgICAgICAgICAgIHx8ICFoYXNEZXZpY2VGZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfU0NSRUVOX0xBTkRTQ0FQRSkpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIlJvdGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBkZXZpY2UuIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc0FjdGl2aXR5ID0gbUFjdGl2aXR5UnVsZS5sYXVuY2hBY3Rpdml0eShudWxsKTsKKyAgICAgICAgc0FjdGl2aXR5LnRlc3RWdWxrYW5QcmVUcmFuc2Zvcm0oZmFsc2UpOworICAgICAgICBzQWN0aXZpdHkuZmluaXNoKCk7CisgICAgICAgIHNBY3Rpdml0eSA9IG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGhhc0RldmljZUZlYXR1cmUoZmluYWwgU3RyaW5nIHJlcXVpcmVkRmVhdHVyZSkgeworICAgICAgICByZXR1cm4gbUNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKS5oYXNTeXN0ZW1GZWF0dXJlKHJlcXVpcmVkRmVhdHVyZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgQml0bWFwIHRha2VTY3JlZW5zaG90KCkgeworICAgICAgICBhc3NlcnROb3ROdWxsKCJzQWN0aXZpdHkgc2hvdWxkIG5vdCBiZSBudWxsIiwgc0FjdGl2aXR5KTsKKyAgICAgICAgUmVjdCBzcmNSZWN0ID0gbmV3IFJlY3QoKTsKKyAgICAgICAgc0FjdGl2aXR5LmZpbmRWaWV3QnlJZChSLmlkLnN1cmZhY2V2aWV3KS5nZXRHbG9iYWxWaXNpYmxlUmVjdChzcmNSZWN0KTsKKyAgICAgICAgU3luY2hyb25vdXNQaXhlbENvcHkgY29weSA9IG5ldyBTeW5jaHJvbm91c1BpeGVsQ29weSgpOworICAgICAgICBCaXRtYXAgZGVzdCA9CisgICAgICAgICAgICAgICAgQml0bWFwLmNyZWF0ZUJpdG1hcChzcmNSZWN0LndpZHRoKCksIHNyY1JlY3QuaGVpZ2h0KCksIEJpdG1hcC5Db25maWcuQVJHQl84ODg4KTsKKyAgICAgICAgaW50IGNvcHlSZXN1bHQgPQorICAgICAgICAgICAgICAgIGNvcHkucmVxdWVzdCgoU3VyZmFjZVZpZXcpIHNBY3Rpdml0eS5maW5kVmlld0J5SWQoUi5pZC5zdXJmYWNldmlldyksIHNyY1JlY3QsIGRlc3QpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlBpeGVsQ29weSBmYWlsZWQiLCBQaXhlbENvcHkuU1VDQ0VTUywgY29weVJlc3VsdCk7CisgICAgICAgIHJldHVybiBkZXN0OworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGludCBwaXhlbERpZmYoaW50IHBpeGVsLCBpbnQgZXhwZWN0ZWRSLCBpbnQgZXhwZWN0ZWRHLCBpbnQgZXhwZWN0ZWRCKSB7CisgICAgICAgIGludCBhY3R1YWxSID0gQ29sb3IucmVkKHBpeGVsKTsKKyAgICAgICAgaW50IGFjdHVhbEcgPSBDb2xvci5ncmVlbihwaXhlbCk7CisgICAgICAgIGludCBhY3R1YWxCID0gQ29sb3IuYmx1ZShwaXhlbCk7CisgICAgICAgIExvZy5kKFRBRywKKyAgICAgICAgICAgICAgICAiRXhwZWN0ZWRQaXhlbCgiICsgZXhwZWN0ZWRSICsgIiwiICsgZXhwZWN0ZWRHICsgIiwiICsgZXhwZWN0ZWRCICsgIiksIEFjdHVhbFBpeGVsKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgYWN0dWFsUiArICIsIiArIGFjdHVhbEcgKyAiLCIgKyBhY3R1YWxCICsgIikiKTsKKyAgICAgICAgcmV0dXJuIE1hdGguYWJzKGFjdHVhbFIgLSBleHBlY3RlZFIpICsgTWF0aC5hYnMoYWN0dWFsRyAtIGV4cGVjdGVkRykKKyAgICAgICAgICAgICAgICArIE1hdGguYWJzKGFjdHVhbEIgLSBleHBlY3RlZEIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gdmFsaWRhdGVQaXhlbFZhbHVlc0FmdGVyUm90YXRpb24oCisgICAgICAgICAgICBib29sZWFuIHNldFByZVRyYW5zZm9ybSwgaW50IHByZVRyYW5zZm9ybUhpbnQpIHsKKyAgICAgICAgQml0bWFwIGJpdG1hcCA9IHRha2VTY3JlZW5zaG90KCk7CisKKyAgICAgICAgaW50IHdpZHRoID0gYml0bWFwLmdldFdpZHRoKCk7CisgICAgICAgIGludCBoZWlnaHQgPSBiaXRtYXAuZ2V0SGVpZ2h0KCk7CisgICAgICAgIGludCBkaWZmID0gMDsKKyAgICAgICAgaWYgKCFzZXRQcmVUcmFuc2Zvcm0gfHwgcHJlVHJhbnNmb3JtSGludCA9PSAweDEgLypWS19TVVJGQUNFX1RSQU5TRk9STV9JREVOVElUWV9CSVRfS0hSKi8pIHsKKyAgICAgICAgICAgIGRpZmYgKz0gcGl4ZWxEaWZmKGJpdG1hcC5nZXRQaXhlbCgwLCAwKSwgMjU1LCAwLCAwKTsKKyAgICAgICAgICAgIGRpZmYgKz0gcGl4ZWxEaWZmKGJpdG1hcC5nZXRQaXhlbCh3aWR0aCAtIDEsIDApLCAwLCAyNTUsIDApOworICAgICAgICAgICAgZGlmZiArPSBwaXhlbERpZmYoYml0bWFwLmdldFBpeGVsKDAsIGhlaWdodCAtIDEpLCAwLCAwLCAyNTUpOworICAgICAgICAgICAgZGlmZiArPSBwaXhlbERpZmYoYml0bWFwLmdldFBpeGVsKHdpZHRoIC0gMSwgaGVpZ2h0IC0gMSksIDI1NSwgMjU1LCAwKTsKKyAgICAgICAgfSBlbHNlIGlmIChwcmVUcmFuc2Zvcm1IaW50ID09IDB4MiAvKlZLX1NVUkZBQ0VfVFJBTlNGT1JNX1JPVEFURV85MF9CSVRfS0hSKi8pIHsKKyAgICAgICAgICAgIGRpZmYgKz0gcGl4ZWxEaWZmKGJpdG1hcC5nZXRQaXhlbCgwLCAwKSwgMCwgMjU1LCAwKTsKKyAgICAgICAgICAgIGRpZmYgKz0gcGl4ZWxEaWZmKGJpdG1hcC5nZXRQaXhlbCh3aWR0aCAtIDEsIDApLCAyNTUsIDI1NSwgMCk7CisgICAgICAgICAgICBkaWZmICs9IHBpeGVsRGlmZihiaXRtYXAuZ2V0UGl4ZWwoMCwgaGVpZ2h0IC0gMSksIDI1NSwgMCwgMCk7CisgICAgICAgICAgICBkaWZmICs9IHBpeGVsRGlmZihiaXRtYXAuZ2V0UGl4ZWwod2lkdGggLSAxLCBoZWlnaHQgLSAxKSwgMCwgMCwgMjU1KTsKKyAgICAgICAgfSBlbHNlIGlmIChwcmVUcmFuc2Zvcm1IaW50ID09IDB4NCAvKlZLX1NVUkZBQ0VfVFJBTlNGT1JNX1JPVEFURV8xODBfQklUX0tIUiovKSB7CisgICAgICAgICAgICBkaWZmICs9IHBpeGVsRGlmZihiaXRtYXAuZ2V0UGl4ZWwoMCwgMCksIDI1NSwgMjU1LCAwKTsKKyAgICAgICAgICAgIGRpZmYgKz0gcGl4ZWxEaWZmKGJpdG1hcC5nZXRQaXhlbCh3aWR0aCAtIDEsIDApLCAwLCAwLCAyNTUpOworICAgICAgICAgICAgZGlmZiArPSBwaXhlbERpZmYoYml0bWFwLmdldFBpeGVsKDAsIGhlaWdodCAtIDEpLCAwLCAyNTUsIDApOworICAgICAgICAgICAgZGlmZiArPSBwaXhlbERpZmYoYml0bWFwLmdldFBpeGVsKHdpZHRoIC0gMSwgaGVpZ2h0IC0gMSksIDI1NSwgMCwgMCk7CisgICAgICAgIH0gZWxzZSB7IC8qIDB4OCA6IFZLX1NVUkZBQ0VfVFJBTlNGT1JNX1JPVEFURV8yNzBfQklUX0tIUiovCisgICAgICAgICAgICBkaWZmICs9IHBpeGVsRGlmZihiaXRtYXAuZ2V0UGl4ZWwoMCwgMCksIDAsIDAsIDI1NSk7CisgICAgICAgICAgICBkaWZmICs9IHBpeGVsRGlmZihiaXRtYXAuZ2V0UGl4ZWwod2lkdGggLSAxLCAwKSwgMjU1LCAwLCAwKTsKKyAgICAgICAgICAgIGRpZmYgKz0gcGl4ZWxEaWZmKGJpdG1hcC5nZXRQaXhlbCgwLCBoZWlnaHQgLSAxKSwgMjU1LCAyNTUsIDApOworICAgICAgICAgICAgZGlmZiArPSBwaXhlbERpZmYoYml0bWFwLmdldFBpeGVsKHdpZHRoIC0gMSwgaGVpZ2h0IC0gMSksIDAsIDI1NSwgMCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZGlmZiA8IDEwOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9ZdXZJbWFnZVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2N0cy9ZdXZJbWFnZVRlc3QuamF2YQppbmRleCBiZWJkYzU4Li5hZDhmMGFmIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9jdHMvWXV2SW1hZ2VUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvY3RzL1l1dkltYWdlVGVzdC5qYXZhCkBAIC0yOCwxMSArMjgsMTIgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkltYWdlRm9ybWF0OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLll1dkltYWdlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL0FkYXB0aXZlSWNvbkRyYXdhYmxlVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL0FkYXB0aXZlSWNvbkRyYXdhYmxlVGVzdC5qYXZhCmluZGV4IGUyMjU0YTcuLjhkYTFjMzQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL2N0cy9BZGFwdGl2ZUljb25EcmF3YWJsZVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9jdHMvQWRhcHRpdmVJY29uRHJhd2FibGVUZXN0LmphdmEKQEAgLTI1LDE5ICsyNSwyMiBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZS5Db25zdGFudFN0YXRlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU3RhdGVMaXN0RHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5YbWw7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiBpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKIAoraW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKwogQFNtYWxsVGVzdAogQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKIHB1YmxpYyBjbGFzcyBBZGFwdGl2ZUljb25EcmF3YWJsZVRlc3QgewpAQCAtMjE1LDEyICsyMTgsMjMgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0QWxwaGEoKSB7CiAgICAgICAgIEFkYXB0aXZlSWNvbkRyYXdhYmxlIGljb25EcmF3YWJsZSA9IG5ldyBBZGFwdGl2ZUljb25EcmF3YWJsZSgKICAgICAgICAgICAgIG5ldyBDb2xvckRyYXdhYmxlKENvbG9yLlJFRCksIG5ldyBDb2xvckRyYXdhYmxlKENvbG9yLkJMVUUpKTsKLSAgICAgICAgaWNvbkRyYXdhYmxlLnNldEFscGhhKDEpOwotICAgICAgICBpY29uRHJhd2FibGUuc2V0QWxwaGEoLTEpOworICAgICAgICBpY29uRHJhd2FibGUuc2V0Qm91bmRzKDAsIDAsIDEwMCwgMTAwKTsKIAotICAgICAgICBpY29uRHJhd2FibGUuc2V0QWxwaGEoMCk7Ci0gICAgICAgIGljb25EcmF3YWJsZS5zZXRBbHBoYShJbnRlZ2VyLk1BWF9WQUxVRSk7Ci0gICAgICAgIGljb25EcmF3YWJsZS5zZXRBbHBoYShJbnRlZ2VyLk1JTl9WQUxVRSk7CisgICAgICAgIEJpdG1hcCBiaXRtYXAgPSBCaXRtYXAuY3JlYXRlQml0bWFwKDEwMCwgMTAwLCBCaXRtYXAuQ29uZmlnLkFSR0JfODg4OCk7CisgICAgICAgIENhbnZhcyBjYW52YXMgPSBuZXcgQ2FudmFzKGJpdG1hcCk7CisKKyAgICAgICAgaWNvbkRyYXdhYmxlLmRyYXcoY2FudmFzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDI1NSwgQ29sb3IuYWxwaGEoYml0bWFwLmdldFBpeGVsKDUwLCA1MCkpKTsKKworICAgICAgICBpY29uRHJhd2FibGUuc2V0QWxwaGEoMjAwKTsKKyAgICAgICAgYml0bWFwLmVyYXNlQ29sb3IoQ29sb3IuVFJBTlNQQVJFTlQpOworICAgICAgICBpY29uRHJhd2FibGUuZHJhdyhjYW52YXMpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCBDb2xvci5hbHBoYShiaXRtYXAuZ2V0UGl4ZWwoNTAsIDUwKSkpOworCisgICAgICAgIGljb25EcmF3YWJsZS5zZXRBbHBoYSgxMDApOworICAgICAgICBiaXRtYXAuZXJhc2VDb2xvcihDb2xvci5UUkFOU1BBUkVOVCk7CisgICAgICAgIGljb25EcmF3YWJsZS5kcmF3KGNhbnZhcyk7CisgICAgICAgIGFzc2VydEVxdWFscygxMDAsIENvbG9yLmFscGhhKGJpdG1hcC5nZXRQaXhlbCg1MCwgNTApKSk7CiAgICAgfQogCiAgICAgQFRlc3QKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL2N0cy9BZGFwdGl2ZUljb25NYXNrVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL0FkYXB0aXZlSWNvbk1hc2tUZXN0LmphdmEKaW5kZXggOTlkMTMyNy4uZmM1ZTk1NCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL0FkYXB0aXZlSWNvbk1hc2tUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL0FkYXB0aXZlSWNvbk1hc2tUZXN0LmphdmEKQEAgLTMwLDEwICszMCwxMiBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uLk9wOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQWRhcHRpdmVJY29uRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5Db2xvckRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL0FuaW1hdGFibGUyQ2FsbGJhY2suamF2YSBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL2N0cy9BbmltYXRhYmxlMkNhbGxiYWNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY1OWFjMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL2N0cy9BbmltYXRhYmxlMkNhbGxiYWNrLmphdmEKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuY3RzOworCitpbXBvcnQgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZS5hc3NlcnRUcnVlOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5BbmltYXRhYmxlMjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworCisvLyBOb3cgdGhpcyBjbGFzcyBjYW4gbm90IG9ubHkgbGlzdGVuIHRvIHRoZSBldmVudHMsIGJ1dCBhbHNvIHN5bmNocm9uaXplIHRoZSBrZXkgZXZlbnRzLAorLy8gbG9nZ2luZyB0aGUgZXZlbnQgdGltZXN0YW1wLCBhbmQgY2VudHJhbGl6ZSBzb21lIGFzc2VydGlvbnMuCitwdWJsaWMgY2xhc3MgQW5pbWF0YWJsZTJDYWxsYmFjayBleHRlbmRzIEFuaW1hdGFibGUyLkFuaW1hdGlvbkNhbGxiYWNrIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIE1BWF9TVEFSVF9USU1FT1VUX01TID0gNTAwMDsKKworICAgIHByaXZhdGUgYm9vbGVhbiBtU3RhcnRlZCA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBtRW5kZWQgPSBmYWxzZTsKKworICAgIHByaXZhdGUgbG9uZyBtU3RhcnROcyA9IExvbmcuTUFYX1ZBTFVFOworICAgIHByaXZhdGUgbG9uZyBtRW5kTnMgPSBMb25nLk1JTl9WQUxVRTsKKworICAgIC8vIFVzZSB0aGlzIGxvY2sgdG8gbWFrZSBzdXJlIHRoZSBvbkFuaW1hdGlvbkVuZCgpIGhhcyBiZWVuIGNhbGxlZC4KKyAgICAvLyBFYWNoIHN1YiB0ZXN0IHNob3VsZCBoYXZlIGl0cyBvd24gbG9jay4KKyAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtRW5kTG9jayA9IG5ldyBPYmplY3QoKTsKKworICAgIC8vIFVzZSB0aGlzIGxvY2sgdG8gbWFrZSBzdXJlIHRoZSB0ZXN0IHRocmVhZCBrbm93IHdoZW4gdGhlIEFWRC5zdGFydCgpIGhhcyBiZWVuIGNhbGxlZC4KKyAgICAvLyBFYWNoIHN1YiB0ZXN0IHNob3VsZCBoYXZlIGl0cyBvd24gbG9jay4KKyAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtU3RhcnRMb2NrID0gbmV3IE9iamVjdCgpOworCisgICAgcHVibGljIGJvb2xlYW4gd2FpdEZvckVuZChsb25nIHRpbWVvdXRNcykgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtRW5kTG9jaykgeworICAgICAgICAgICAgaWYgKCFtRW5kZWQpIHsKKyAgICAgICAgICAgICAgICAvLyBSZXR1cm4gaW1tZWRpYXRlbHkgaWYgdGhlIEFWRCBoYXMgYWxyZWFkeSBlbmRlZC4KKyAgICAgICAgICAgICAgICBtRW5kTG9jay53YWl0KHRpbWVvdXRNcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbUVuZGVkOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gd2FpdEZvclN0YXJ0KCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgc3luY2hyb25pemVkKG1TdGFydExvY2spIHsKKyAgICAgICAgICAgIGlmICghbVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgICAgICAvLyBSZXR1cm4gaW1tZWRpYXRlbHkgaWYgdGhlIEFWRCBoYXMgYWxyZWFkeSBzdGFydGVkLgorICAgICAgICAgICAgICAgIG1TdGFydExvY2sud2FpdChNQVhfU1RBUlRfVElNRU9VVF9NUyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbVN0YXJ0ZWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblN0YXJ0KERyYXdhYmxlIGRyYXdhYmxlKSB7CisgICAgICAgIG1TdGFydE5zID0gU3lzdGVtLm5hbm9UaW1lKCk7CisgICAgICAgIHN5bmNocm9uaXplZChtU3RhcnRMb2NrKSB7CisgICAgICAgICAgICBtU3RhcnRlZCA9IHRydWU7CisgICAgICAgICAgICBtU3RhcnRMb2NrLm5vdGlmeSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25FbmQoRHJhd2FibGUgZHJhd2FibGUpIHsKKyAgICAgICAgbUVuZE5zID0gU3lzdGVtLm5hbm9UaW1lKCk7CisgICAgICAgIHN5bmNocm9uaXplZCAobUVuZExvY2spIHsKKyAgICAgICAgICAgIG1FbmRlZCA9IHRydWU7CisgICAgICAgICAgICBtRW5kTG9jay5ub3RpZnkoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGVuZElzQ2FsbGVkKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1FbmRMb2NrKSB7CisgICAgICAgICAgICByZXR1cm4gbUVuZGVkOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXNzZXJ0U3RhcnRlZChib29sZWFuIHN0YXJ0ZWQpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHN0YXJ0ZWQsIG1TdGFydGVkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhc3NlcnRFbmRlZChib29sZWFuIGVuZGVkKSB7CisgICAgICAgIGFzc2VydEVxdWFscyhlbmRlZCwgbUVuZGVkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhc3NlcnRBVkRSdW50aW1lKGxvbmcgbWluLCBsb25nIG1heCkgeworICAgICAgICBhc3NlcnRUcnVlKG1TdGFydE5zICE9IExvbmcuTUFYX1ZBTFVFKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtRW5kTnMgIT0gTG9uZy5NSU5fVkFMVUUpOworICAgICAgICBsb25nIGR1cmF0aW9uTnMgPSBtRW5kTnMgLSBtU3RhcnROczsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiY3VycmVudCBkdXJhdGlvbiAiICsgZHVyYXRpb25OcyArICIgc2hvdWxkIGJlIHdpdGhpbiAiICsKKyAgICAgICAgICAgICAgICAgICBtaW4gKyAiLCIgKyBtYXgsIGR1cmF0aW9uTnMgPD0gbWF4ICYmIGR1cmF0aW9uTnMgPj0gbWluKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9jdHMvQW5pbWF0YWJsZTJfQW5pbWF0aW9uQ2FsbGJhY2tUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9jdHMvQW5pbWF0YWJsZTJfQW5pbWF0aW9uQ2FsbGJhY2tUZXN0LmphdmEKaW5kZXggMDI2NmUzNC4uNWZiYzk5YyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL0FuaW1hdGFibGUyX0FuaW1hdGlvbkNhbGxiYWNrVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL2N0cy9BbmltYXRhYmxlMl9BbmltYXRpb25DYWxsYmFja1Rlc3QuamF2YQpAQCAtMTcsOCArMTcsOSBAQAogcGFja2FnZSBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLmN0czsKIAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQW5pbWF0YWJsZTIuQW5pbWF0aW9uQ2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiAKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9jdHMvQW5pbWF0ZWRJbWFnZURyYXdhYmxlVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL0FuaW1hdGVkSW1hZ2VEcmF3YWJsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjI4MWIyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL0FuaW1hdGVkSW1hZ2VEcmF3YWJsZVRlc3QuamF2YQpAQCAtMCwwICsxLDY2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5jdHM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3JGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5JbWFnZURlY29kZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5MaWdodGluZ0NvbG9yRmlsdGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QaXhlbEZvcm1hdDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5jdHMuUjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkFuaW1hdGVkSW1hZ2VEcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkJpdG1hcFV0aWxzOworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQmlGdW5jdGlvbjsKKworQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBBbmltYXRlZEltYWdlRHJhd2FibGVUZXN0IHsKKyAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzOworICAgIHByaXZhdGUgQ29udGVudFJlc29sdmVyIG1Db250ZW50UmVzb2x2ZXI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVTX0lEID0gUi5kcmF3YWJsZS5hbmltYXRlZDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0lEVEggPSAyNzg7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhFSUdIVCA9IDE4MzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTlVNX0ZSQU1FUyA9IDQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZSQU1FX0RVUkFUSU9OID0gMjUwOyAvLyBpbiBtaWxsaXNlY29uZHMKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRFVSQVRJT04gPSBOVU1fRlJBTUVTICogRlJBTUVfRFVSQVRJT047CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExBWU9VVCA9IFIubGF5b3V0LmFuaW1hdGVkX2ltYWdlX2xheW91dDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU1BR0VfSUQgPSBSLmlkLmFuaW1hdGVkX2ltYWdlOworICAgIEBSdWxlCisgICAgcHVibGljIEFjdGl2aXR5VGVzdFJ1bGU8RHJhd2FibGVTdHViQWN0aXZpdHk+IG1BY3Rpdml0eVJ1bGUgPQorICAgICAgICAgICAgbmV3IEFjdGl2aXR5VGVzdFJ1bGU8RHJhd2FibGVTdHViQWN0aXZpdHk+KERyYXdhYmxlU3R1YkFjdGl2aXR5LmNsYXNzKTsKKyAgICBwcml2YXRlIEFjdGl2aXR5IG1BY3Rpdml0eTsKKworICAgIHByaXZhdGUgVXJpIGdldEFzUmVzb3VyY2VVcmkoaW50IHJlc0lkKSB7CisgICAgICAgIHJldHVybiBuZXcgVXJpLkJ1aWxkZXIoKQorICAgICAgICAgICAgLnNjaGVtZShDb250ZW50UmVzb2x2ZXIuU0NIRU1FX0FORFJPSURfUkVTT1VSQ0UpCisgICAgICAgICAgICAuYXV0aG9yaXR5KG1SZXMuZ2V0UmVzb3VyY2VQYWNrYWdlTmFtZShyZXNJZCkpCisgICAgICAgICAgICAuYXBwZW5kUGF0aChtUmVzLmdldFJlc291cmNlVHlwZU5hbWUocmVzSWQpKQorICAgICAgICAgICAgLmFwcGVuZFBhdGgobVJlcy5nZXRSZXNvdXJjZUVudHJ5TmFtZShyZXNJZCkpCisgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICB9CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0dXAoKSB7CisgICAgICAgIG1SZXMgPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRUYXJnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCk7CisgICAgICAgIG1Db250ZW50UmVzb2x2ZXIgPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRUYXJnZXRDb250ZXh0KCkuZ2V0Q29udGVudFJlc29sdmVyKCk7CisgICAgICAgIG1BY3Rpdml0eSA9IG1BY3Rpdml0eVJ1bGUuZ2V0QWN0aXZpdHkoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eUNvbnN0cnVjdG9yKCkgeworICAgICAgICBuZXcgQW5pbWF0ZWRJbWFnZURyYXdhYmxlKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXV0YXRlKCkgeworICAgICAgICBBbmltYXRlZEltYWdlRHJhd2FibGUgYWlkMSA9IChBbmltYXRlZEltYWdlRHJhd2FibGUpIG1SZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5hbmltYXRlZCk7CisgICAgICAgIEFuaW1hdGVkSW1hZ2VEcmF3YWJsZSBhaWQyID0gKEFuaW1hdGVkSW1hZ2VEcmF3YWJsZSkgbVJlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmFuaW1hdGVkKTsKKworICAgICAgICBmaW5hbCBpbnQgb3JpZ2luYWxBbHBoYSA9IGFpZDEuZ2V0QWxwaGEoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDI1NSwgb3JpZ2luYWxBbHBoYSk7CisgICAgICAgIGFzc2VydEVxdWFscygyNTUsIGFpZDIuZ2V0QWxwaGEoKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFpZDEubXV0YXRlKCk7CisgICAgICAgICAgICBhaWQxLnNldEFscGhhKDEwMCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMob3JpZ2luYWxBbHBoYSwgYWlkMi5nZXRBbHBoYSgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIG1SZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5hbmltYXRlZCkuc2V0QWxwaGEob3JpZ2luYWxBbHBoYSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIEFuaW1hdGVkSW1hZ2VEcmF3YWJsZSBjcmVhdGVGcm9tSW1hZ2VEZWNvZGVyKGludCByZXNJZCkgeworICAgICAgICBVcmkgdXJpID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHVyaSA9IGdldEFzUmVzb3VyY2VVcmkocmVzSWQpOworICAgICAgICAgICAgSW1hZ2VEZWNvZGVyLlNvdXJjZSBzb3VyY2UgPSBJbWFnZURlY29kZXIuY3JlYXRlU291cmNlKG1Db250ZW50UmVzb2x2ZXIsIHVyaSk7CisgICAgICAgICAgICBEcmF3YWJsZSBkcmF3YWJsZSA9IEltYWdlRGVjb2Rlci5kZWNvZGVEcmF3YWJsZShzb3VyY2UpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShkcmF3YWJsZSBpbnN0YW5jZW9mIEFuaW1hdGVkSW1hZ2VEcmF3YWJsZSk7CisgICAgICAgICAgICByZXR1cm4gKEFuaW1hdGVkSW1hZ2VEcmF3YWJsZSkgZHJhd2FibGU7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoImZhaWxlZCB0byBjcmVhdGUgaW1hZ2UgZnJvbSAiICsgdXJpKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVjb2RlQW5pbWF0ZWRJbWFnZURyYXdhYmxlKCkgeworICAgICAgICBEcmF3YWJsZSBkcmF3YWJsZSA9IGNyZWF0ZUZyb21JbWFnZURlY29kZXIoUkVTX0lEKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFdJRFRILCAgZHJhd2FibGUuZ2V0SW50cmluc2ljV2lkdGgoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhIRUlHSFQsIGRyYXdhYmxlLmdldEludHJpbnNpY0hlaWdodCgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDYWxsYmFjayBleHRlbmRzIEFuaW1hdGFibGUyQ2FsbGJhY2sgeworICAgICAgICBwcml2YXRlIGZpbmFsIERyYXdhYmxlIG1EcmF3YWJsZTsKKworICAgICAgICBwdWJsaWMgQ2FsbGJhY2soRHJhd2FibGUgZCkgeworICAgICAgICAgICAgbURyYXdhYmxlID0gZDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblN0YXJ0KERyYXdhYmxlIGRyYXdhYmxlKSB7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGRyYXdhYmxlKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhtRHJhd2FibGUsIGRyYXdhYmxlKTsKKyAgICAgICAgICAgIHN1cGVyLm9uQW5pbWF0aW9uU3RhcnQoZHJhd2FibGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uRW5kKERyYXdhYmxlIGRyYXdhYmxlKSB7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGRyYXdhYmxlKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhtRHJhd2FibGUsIGRyYXdhYmxlKTsKKyAgICAgICAgICAgIHN1cGVyLm9uQW5pbWF0aW9uRW5kKGRyYXdhYmxlKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBAVGVzdChleHBlY3RlZD1JbGxlZ2FsU3RhdGVFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdFJlZ2lzdGVyV2l0aG91dExvb3BlcigpIHsKKyAgICAgICAgQW5pbWF0ZWRJbWFnZURyYXdhYmxlIGRyYXdhYmxlID0gY3JlYXRlRnJvbUltYWdlRGVjb2RlcihSLmRyYXdhYmxlLmFuaW1hdGVkKTsKKworICAgICAgICAvLyByZWdpc3RlckFuaW1hdGlvbkNhbGxiYWNrIG11c3QgYmUgcnVuIG9uIGEgdGhyZWFkIHdpdGggYSBMb29wZXIsCisgICAgICAgIC8vIHdoaWNoIHRoZSB0ZXN0IHRocmVhZCBkb2VzIG5vdCBoYXZlLgorICAgICAgICBDYWxsYmFjayBjYiA9IG5ldyBDYWxsYmFjayhkcmF3YWJsZSk7CisgICAgICAgIGRyYXdhYmxlLnJlZ2lzdGVyQW5pbWF0aW9uQ2FsbGJhY2soY2IpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlZ2lzdGVyQ2FsbGJhY2soKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgQW5pbWF0ZWRJbWFnZURyYXdhYmxlIGRyYXdhYmxlID0gY3JlYXRlRnJvbUltYWdlRGVjb2RlcihSLmRyYXdhYmxlLmFuaW1hdGVkKTsKKworICAgICAgICBtQWN0aXZpdHlSdWxlLnJ1bk9uVWlUaHJlYWQoKCkgLT4geworICAgICAgICAgICAgLy8gUmVnaXN0ZXIgYSBjYWxsYmFjay4KKyAgICAgICAgICAgIENhbGxiYWNrIGNiID0gbmV3IENhbGxiYWNrKGRyYXdhYmxlKTsKKyAgICAgICAgICAgIGRyYXdhYmxlLnJlZ2lzdGVyQW5pbWF0aW9uQ2FsbGJhY2soY2IpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShkcmF3YWJsZS51bnJlZ2lzdGVyQW5pbWF0aW9uQ2FsbGJhY2soY2IpKTsKKworICAgICAgICAgICAgLy8gTm93IHRoYXQgaXQgaGFzIGJlZW4gcmVtb3ZlZCwgaXQgY2Fubm90IGJlIHJlbW92ZWQgYWdhaW4uCisgICAgICAgICAgICBhc3NlcnRGYWxzZShkcmF3YWJsZS51bnJlZ2lzdGVyQW5pbWF0aW9uQ2FsbGJhY2soY2IpKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJDYWxsYmFja3MoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgQW5pbWF0ZWRJbWFnZURyYXdhYmxlIGRyYXdhYmxlID0gY3JlYXRlRnJvbUltYWdlRGVjb2RlcihSLmRyYXdhYmxlLmFuaW1hdGVkKTsKKworICAgICAgICBDYWxsYmFja1tdIGNhbGxiYWNrcyA9IG5ldyBDYWxsYmFja1tdIHsKKyAgICAgICAgICAgIG5ldyBDYWxsYmFjayhkcmF3YWJsZSksCisgICAgICAgICAgICBuZXcgQ2FsbGJhY2soZHJhd2FibGUpLAorICAgICAgICAgICAgbmV3IENhbGxiYWNrKGRyYXdhYmxlKSwKKyAgICAgICAgICAgIG5ldyBDYWxsYmFjayhkcmF3YWJsZSksCisgICAgICAgICAgICBuZXcgQ2FsbGJhY2soZHJhd2FibGUpLAorICAgICAgICAgICAgbmV3IENhbGxiYWNrKGRyYXdhYmxlKSwKKyAgICAgICAgICAgIG5ldyBDYWxsYmFjayhkcmF3YWJsZSksCisgICAgICAgICAgICBuZXcgQ2FsbGJhY2soZHJhd2FibGUpLAorICAgICAgICB9OworCisgICAgICAgIG1BY3Rpdml0eVJ1bGUucnVuT25VaVRocmVhZCgoKSAtPiB7CisgICAgICAgICAgICBmb3IgKENhbGxiYWNrIGNiIDogY2FsbGJhY2tzKSB7CisgICAgICAgICAgICAgICAgZHJhd2FibGUucmVnaXN0ZXJBbmltYXRpb25DYWxsYmFjayhjYik7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIGRyYXdhYmxlLmNsZWFyQW5pbWF0aW9uQ2FsbGJhY2tzKCk7CisKKyAgICAgICAgZm9yIChDYWxsYmFjayBjYiA6IGNhbGxiYWNrcykgeworICAgICAgICAgICAgLy8gSXQgaGFzIGFscmVhZHkgYmVlbiByZW1vdmVkLgorICAgICAgICAgICAgYXNzZXJ0RmFsc2UoZHJhd2FibGUudW5yZWdpc3RlckFuaW1hdGlvbkNhbGxiYWNrKGNiKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgSGVscGVyIGZvciBhdHRhY2hpbmcgZHJhd2FibGUgdG8gdGhlIHZpZXcgc3lzdGVtLgorICAgICAqCisgICAgICogIE5lY2Vzc2FyeSBmb3IgdGhlIGRyYXdhYmxlIHRvIGFuaW1hdGUuCisgICAgICoKKyAgICAgKiAgTXVzdCBiZSBjYWxsZWQgZnJvbSBVSSB0aHJlYWQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldENvbnRlbnRWaWV3KEFuaW1hdGVkSW1hZ2VEcmF3YWJsZSBkcmF3YWJsZSkgeworICAgICAgICBtQWN0aXZpdHkuc2V0Q29udGVudFZpZXcoTEFZT1VUKTsKKyAgICAgICAgSW1hZ2VWaWV3IGltYWdlVmlldyA9IChJbWFnZVZpZXcpIG1BY3Rpdml0eS5maW5kVmlld0J5SWQoSU1BR0VfSUQpOworICAgICAgICBpbWFnZVZpZXcuc2V0SW1hZ2VEcmF3YWJsZShkcmF3YWJsZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VW5yZWdpc3RlckNhbGxiYWNrKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIEFuaW1hdGVkSW1hZ2VEcmF3YWJsZSBkcmF3YWJsZSA9IGNyZWF0ZUZyb21JbWFnZURlY29kZXIoUi5kcmF3YWJsZS5hbmltYXRlZCk7CisKKyAgICAgICAgQ2FsbGJhY2sgY2IgPSBuZXcgQ2FsbGJhY2soZHJhd2FibGUpOworICAgICAgICBtQWN0aXZpdHlSdWxlLnJ1bk9uVWlUaHJlYWQoKCkgLT4geworICAgICAgICAgICAgc2V0Q29udGVudFZpZXcoZHJhd2FibGUpOworCisgICAgICAgICAgICBkcmF3YWJsZS5yZWdpc3RlckFuaW1hdGlvbkNhbGxiYWNrKGNiKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZHJhd2FibGUudW5yZWdpc3RlckFuaW1hdGlvbkNhbGxiYWNrKGNiKSk7CisgICAgICAgICAgICBkcmF3YWJsZS5zZXRSZXBlYXRDb3VudCgwKTsKKyAgICAgICAgICAgIGRyYXdhYmxlLnN0YXJ0KCk7CisgICAgICAgIH0pOworCisgICAgICAgIGNiLndhaXRGb3JTdGFydCgpOworICAgICAgICBjYi5hc3NlcnRTdGFydGVkKGZhbHNlKTsKKworICAgICAgICBjYi53YWl0Rm9yRW5kKERVUkFUSU9OICogMik7CisgICAgICAgIGNiLmFzc2VydEVuZGVkKGZhbHNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMaWZlQ3ljbGUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgQW5pbWF0ZWRJbWFnZURyYXdhYmxlIGRyYXdhYmxlID0gY3JlYXRlRnJvbUltYWdlRGVjb2RlcihSRVNfSUQpOworCisgICAgICAgIC8vIE9ubHkgcnVuIHRoZSBhbmltYXRpb24gb25lIHRpbWUuCisgICAgICAgIGRyYXdhYmxlLnNldFJlcGVhdENvdW50KDApOworCisgICAgICAgIENhbGxiYWNrIGNiID0gbmV3IENhbGxiYWNrKGRyYXdhYmxlKTsKKyAgICAgICAgbUFjdGl2aXR5UnVsZS5ydW5PblVpVGhyZWFkKCgpIC0+IHsKKyAgICAgICAgICAgIHNldENvbnRlbnRWaWV3KGRyYXdhYmxlKTsKKworICAgICAgICAgICAgZHJhd2FibGUucmVnaXN0ZXJBbmltYXRpb25DYWxsYmFjayhjYik7CisgICAgICAgIH0pOworCisgICAgICAgIGFzc2VydEZhbHNlKGRyYXdhYmxlLmlzUnVubmluZygpKTsKKyAgICAgICAgY2IuYXNzZXJ0U3RhcnRlZChmYWxzZSk7CisgICAgICAgIGNiLmFzc2VydEVuZGVkKGZhbHNlKTsKKworICAgICAgICBtQWN0aXZpdHlSdWxlLnJ1bk9uVWlUaHJlYWQoKCkgLT4geworICAgICAgICAgICAgZHJhd2FibGUuc3RhcnQoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZHJhd2FibGUuaXNSdW5uaW5nKCkpOworICAgICAgICB9KTsKKyAgICAgICAgY2Iud2FpdEZvclN0YXJ0KCk7CisgICAgICAgIGNiLmFzc2VydFN0YXJ0ZWQodHJ1ZSk7CisKKyAgICAgICAgLy8gRXh0cmEgdGltZSwgdG8gd2FpdCBmb3IgdGhlIG1lc3NhZ2UgdG8gcG9zdC4KKyAgICAgICAgY2Iud2FpdEZvckVuZChEVVJBVElPTiAqIDMpOworICAgICAgICBjYi5hc3NlcnRFbmRlZCh0cnVlKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoZHJhd2FibGUuaXNSdW5uaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExpZmVDeWNsZVNvZnR3YXJlKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIEFuaW1hdGVkSW1hZ2VEcmF3YWJsZSBkcmF3YWJsZSA9IGNyZWF0ZUZyb21JbWFnZURlY29kZXIoUkVTX0lEKTsKKworICAgICAgICBCaXRtYXAgYm0gPSBCaXRtYXAuY3JlYXRlQml0bWFwKGRyYXdhYmxlLmdldEludHJpbnNpY1dpZHRoKCksIGRyYXdhYmxlLmdldEludHJpbnNpY0hlaWdodCgpLAorICAgICAgICAgICAgICAgIEJpdG1hcC5Db25maWcuQVJHQl84ODg4KTsKKyAgICAgICAgQ2FudmFzIGNhbnZhcyA9IG5ldyBDYW52YXMoYm0pOworCisgICAgICAgIENhbGxiYWNrIGNiID0gbmV3IENhbGxiYWNrKGRyYXdhYmxlKTsKKyAgICAgICAgbUFjdGl2aXR5UnVsZS5ydW5PblVpVGhyZWFkKCgpIC0+IHsKKyAgICAgICAgICAgIGRyYXdhYmxlLnJlZ2lzdGVyQW5pbWF0aW9uQ2FsbGJhY2soY2IpOworICAgICAgICAgICAgZHJhd2FibGUuZHJhdyhjYW52YXMpOworICAgICAgICB9KTsKKworICAgICAgICBhc3NlcnRGYWxzZShkcmF3YWJsZS5pc1J1bm5pbmcoKSk7CisgICAgICAgIGNiLmFzc2VydFN0YXJ0ZWQoZmFsc2UpOworICAgICAgICBjYi5hc3NlcnRFbmRlZChmYWxzZSk7CisKKyAgICAgICAgbUFjdGl2aXR5UnVsZS5ydW5PblVpVGhyZWFkKCgpIC0+IHsKKyAgICAgICAgICAgIGRyYXdhYmxlLnN0YXJ0KCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGRyYXdhYmxlLmlzUnVubmluZygpKTsKKyAgICAgICAgICAgIGRyYXdhYmxlLmRyYXcoY2FudmFzKTsKKyAgICAgICAgfSk7CisgICAgICAgIGNiLndhaXRGb3JTdGFydCgpOworICAgICAgICBjYi5hc3NlcnRTdGFydGVkKHRydWUpOworCisgICAgICAgIC8vIE9ubHkgcnVuIHRoZSBhbmltYXRpb24gb25lIHRpbWUuCisgICAgICAgIGRyYXdhYmxlLnNldFJlcGVhdENvdW50KDApOworCisgICAgICAgIC8vIFRoZSBkcmF3YWJsZSB3aWxsIHByZXZlbnQgc2tpcHBpbmcgZnJhbWVzLCBzbyB3ZSBhY3R1YWxseSBoYXZlIHRvCisgICAgICAgIC8vIGRyYXcgZWFjaCBmcmFtZS4gKFN0YXJ0IHdpdGggMSwgc2luY2Ugd2UgYWxyZWFkeSBkcmV3IGZyYW1lIDAuKQorICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IE5VTV9GUkFNRVM7IGkrKykgeworICAgICAgICAgICAgY2Iud2FpdEZvckVuZChGUkFNRV9EVVJBVElPTik7CisgICAgICAgICAgICBjYi5hc3NlcnRFbmRlZChmYWxzZSk7CisgICAgICAgICAgICBtQWN0aXZpdHlSdWxlLnJ1bk9uVWlUaHJlYWQoKCkgLT4geworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZHJhd2FibGUuaXNSdW5uaW5nKCkpOworICAgICAgICAgICAgICAgIGRyYXdhYmxlLmRyYXcoY2FudmFzKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICAgICAgY2Iud2FpdEZvckVuZChGUkFNRV9EVVJBVElPTik7CisgICAgICAgIGFzc2VydEZhbHNlKGRyYXdhYmxlLmlzUnVubmluZygpKTsKKyAgICAgICAgY2IuYXNzZXJ0RW5kZWQodHJ1ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkQ2FsbGJhY2tBZnRlclN0YXJ0KCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIEFuaW1hdGVkSW1hZ2VEcmF3YWJsZSBkcmF3YWJsZSA9IGNyZWF0ZUZyb21JbWFnZURlY29kZXIoUkVTX0lEKTsKKyAgICAgICAgQ2FsbGJhY2sgY2IgPSBuZXcgQ2FsbGJhY2soZHJhd2FibGUpOworICAgICAgICBtQWN0aXZpdHlSdWxlLnJ1bk9uVWlUaHJlYWQoKCkgLT4geworICAgICAgICAgICAgc2V0Q29udGVudFZpZXcoZHJhd2FibGUpOworCisgICAgICAgICAgICBkcmF3YWJsZS5zZXRSZXBlYXRDb3VudCgwKTsKKyAgICAgICAgICAgIGRyYXdhYmxlLnN0YXJ0KCk7CisgICAgICAgICAgICBkcmF3YWJsZS5yZWdpc3RlckFuaW1hdGlvbkNhbGxiYWNrKGNiKTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgLy8gQWRkIGV4dHJhIGR1cmF0aW9uIHRvIHdhaXQgZm9yIHRoZSBtZXNzYWdlIHBvc3RlZCBieSB0aGUgZW5kIG9mIHRoZQorICAgICAgICAvLyBhbmltYXRpb24uIFRoaXMgc2hvdWxkIGhlbHAgZml4IGZsYWtpbmVzcy4KKyAgICAgICAgY2Iud2FpdEZvckVuZChEVVJBVElPTiAqIDMpOworICAgICAgICBjYi5hc3NlcnRFbmRlZCh0cnVlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdG9wKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIEFuaW1hdGVkSW1hZ2VEcmF3YWJsZSBkcmF3YWJsZSA9IGNyZWF0ZUZyb21JbWFnZURlY29kZXIoUkVTX0lEKTsKKyAgICAgICAgQ2FsbGJhY2sgY2IgPSBuZXcgQ2FsbGJhY2soZHJhd2FibGUpOworICAgICAgICBtQWN0aXZpdHlSdWxlLnJ1bk9uVWlUaHJlYWQoKCkgLT4geworICAgICAgICAgICAgc2V0Q29udGVudFZpZXcoZHJhd2FibGUpOworCisgICAgICAgICAgICBkcmF3YWJsZS5yZWdpc3RlckFuaW1hdGlvbkNhbGxiYWNrKGNiKTsKKworICAgICAgICAgICAgZHJhd2FibGUuc3RhcnQoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZHJhd2FibGUuaXNSdW5uaW5nKCkpOworICAgICAgICB9KTsKKworICAgICAgICBjYi53YWl0Rm9yU3RhcnQoKTsKKyAgICAgICAgY2IuYXNzZXJ0U3RhcnRlZCh0cnVlKTsKKworICAgICAgICBtQWN0aXZpdHlSdWxlLnJ1bk9uVWlUaHJlYWQoKCkgLT4geworICAgICAgICAgICAgZHJhd2FibGUuc3RvcCgpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoZHJhd2FibGUuaXNSdW5uaW5nKCkpOworICAgICAgICB9KTsKKworICAgICAgICAvLyBUaGlzIGR1cmF0aW9uIG1heSBiZSBvdmVya2lsbCwgYnV0IHdlIG5lZWQgdG8gd2FpdCBmb3IgdGhlIG1lc3NhZ2UKKyAgICAgICAgLy8gdG8gcG9zdC4gSW5jcmVhc2luZyBpdCBzaG91bGQgaGVscCB3aXRoIGZsYWtpbmVzcyBvbiBib3RzLgorICAgICAgICBjYi53YWl0Rm9yRW5kKERVUkFUSU9OICogMyk7CisgICAgICAgIGNiLmFzc2VydEVuZGVkKHRydWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcGVhdENvdW50cygpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBmb3IgKGludCByZXBlYXRDb3VudCA6IG5ldyBpbnRbXSB7IDMsIDUsIDcsIDE2IH0pIHsKKyAgICAgICAgICAgIEFuaW1hdGVkSW1hZ2VEcmF3YWJsZSBkcmF3YWJsZSA9IGNyZWF0ZUZyb21JbWFnZURlY29kZXIoUkVTX0lEKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhBbmltYXRlZEltYWdlRHJhd2FibGUuUkVQRUFUX0lORklOSVRFLCBkcmF3YWJsZS5nZXRSZXBlYXRDb3VudCgpKTsKKworICAgICAgICAgICAgQ2FsbGJhY2sgY2IgPSBuZXcgQ2FsbGJhY2soZHJhd2FibGUpOworICAgICAgICAgICAgbUFjdGl2aXR5UnVsZS5ydW5PblVpVGhyZWFkKCgpIC0+IHsKKyAgICAgICAgICAgICAgICBzZXRDb250ZW50VmlldyhkcmF3YWJsZSk7CisKKyAgICAgICAgICAgICAgICBkcmF3YWJsZS5yZWdpc3RlckFuaW1hdGlvbkNhbGxiYWNrKGNiKTsKKyAgICAgICAgICAgICAgICBkcmF3YWJsZS5zZXRSZXBlYXRDb3VudChyZXBlYXRDb3VudCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlcGVhdENvdW50LCBkcmF3YWJsZS5nZXRSZXBlYXRDb3VudCgpKTsKKyAgICAgICAgICAgICAgICBkcmF3YWJsZS5zdGFydCgpOworICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIC8vIFRoZSBhbmltYXRpb24gcnVucyByZXBlYXRDb3VudCArIDEgdG90YWwgdGltZXMuCisgICAgICAgICAgICBjYi53YWl0Rm9yRW5kKERVUkFUSU9OICogcmVwZWF0Q291bnQpOworICAgICAgICAgICAgY2IuYXNzZXJ0RW5kZWQoZmFsc2UpOworCisgICAgICAgICAgICBjYi53YWl0Rm9yRW5kKERVUkFUSU9OICogMik7CisgICAgICAgICAgICBjYi5hc3NlcnRFbmRlZCh0cnVlKTsKKworICAgICAgICAgICAgZHJhd2FibGUuc2V0UmVwZWF0Q291bnQoQW5pbWF0ZWRJbWFnZURyYXdhYmxlLlJFUEVBVF9JTkZJTklURSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoQW5pbWF0ZWRJbWFnZURyYXdhYmxlLlJFUEVBVF9JTkZJTklURSwgZHJhd2FibGUuZ2V0UmVwZWF0Q291bnQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBlYXRDb3VudEluZmluaXRlKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIEFuaW1hdGVkSW1hZ2VEcmF3YWJsZSBkcmF3YWJsZSA9IGNyZWF0ZUZyb21JbWFnZURlY29kZXIoUkVTX0lEKTsKKyAgICAgICAgQ2FsbGJhY2sgY2IgPSBuZXcgQ2FsbGJhY2soZHJhd2FibGUpOworICAgICAgICBtQWN0aXZpdHlSdWxlLnJ1bk9uVWlUaHJlYWQoKCkgLT4geworICAgICAgICAgICAgc2V0Q29udGVudFZpZXcoZHJhd2FibGUpOworCisgICAgICAgICAgICBkcmF3YWJsZS5yZWdpc3RlckFuaW1hdGlvbkNhbGxiYWNrKGNiKTsKKyAgICAgICAgICAgIGRyYXdhYmxlLnNldFJlcGVhdENvdW50KEFuaW1hdGVkSW1hZ2VEcmF3YWJsZS5SRVBFQVRfSU5GSU5JVEUpOworICAgICAgICAgICAgZHJhd2FibGUuc3RhcnQoKTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgLy8gVGhlcmUgaXMgbm8gd2F5IHRvIHRydWx5IHRlc3QgaW5maW5pdGUsIGJ1dCBsZXQgaXQgcnVuIGZvciBhIGxvbmcKKyAgICAgICAgLy8gdGltZSBhbmQgdmVyaWZ5IHRoYXQgaXQncyBzdGlsbCBydW5uaW5nLgorICAgICAgICBjYi53YWl0Rm9yRW5kKERVUkFUSU9OICogMzApOworICAgICAgICBjYi5hc3NlcnRFbmRlZChmYWxzZSk7CisgICAgICAgIGFzc2VydFRydWUoZHJhd2FibGUuaXNSdW5uaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldE9wYWNpdHkoKSB7CisgICAgICAgIEFuaW1hdGVkSW1hZ2VEcmF3YWJsZSBkcmF3YWJsZSA9IGNyZWF0ZUZyb21JbWFnZURlY29kZXIoUkVTX0lEKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFBpeGVsRm9ybWF0LlRSQU5TTFVDRU5ULCBkcmF3YWJsZS5nZXRPcGFjaXR5KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbG9yRmlsdGVyKCkgeworICAgICAgICBBbmltYXRlZEltYWdlRHJhd2FibGUgZHJhd2FibGUgPSBjcmVhdGVGcm9tSW1hZ2VEZWNvZGVyKFJFU19JRCk7CisKKyAgICAgICAgQ29sb3JGaWx0ZXIgZmlsdGVyID0gbmV3IExpZ2h0aW5nQ29sb3JGaWx0ZXIoMCwgQ29sb3IuUkVEKTsKKyAgICAgICAgZHJhd2FibGUuc2V0Q29sb3JGaWx0ZXIoZmlsdGVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZpbHRlciwgZHJhd2FibGUuZ2V0Q29sb3JGaWx0ZXIoKSk7CisKKyAgICAgICAgQml0bWFwIGFjdHVhbCA9IEJpdG1hcC5jcmVhdGVCaXRtYXAoZHJhd2FibGUuZ2V0SW50cmluc2ljV2lkdGgoKSwKKyAgICAgICAgICAgICAgICBkcmF3YWJsZS5nZXRJbnRyaW5zaWNIZWlnaHQoKSwgQml0bWFwLkNvbmZpZy5BUkdCXzg4ODgpOworICAgICAgICB7CisgICAgICAgICAgICBDYW52YXMgY2FudmFzID0gbmV3IENhbnZhcyhhY3R1YWwpOworICAgICAgICAgICAgZHJhd2FibGUuZHJhdyhjYW52YXMpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhY3R1YWwuZ2V0V2lkdGgoKTsgKytpKSB7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGFjdHVhbC5nZXRIZWlnaHQoKTsgKytqKSB7CisgICAgICAgICAgICAgICAgaW50IGNvbG9yID0gYWN0dWFsLmdldFBpeGVsKGksIGopOworICAgICAgICAgICAgICAgIC8vIFRoZSBMaWdodGluZ0NvbG9yRmlsdGVyIGRvZXMgbm90IGFmZmVjdCB0aGUgdHJhbnNwYXJlbnQgcGl4ZWxzLAorICAgICAgICAgICAgICAgIC8vIHNvIGFsbCBwaXhlbHMgc2hvdWxkIGVpdGhlciByZW1haW4gdHJhbnNwYXJlbnQgb3IgdHVybiByZWQuCisgICAgICAgICAgICAgICAgaWYgKGNvbG9yICE9IENvbG9yLlJFRCAmJiBjb2xvciAhPSBDb2xvci5UUkFOU1BBUkVOVCkgeworICAgICAgICAgICAgICAgICAgICBmYWlsKCJwaXhlbCBhdCAiICsgaSArICIsICIgKyBqICsgIiBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZC4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImV4cGVjdGVkOiAiICsgQ29sb3IuUkVEICsgIiBPUiAiICsgQ29sb3IuVFJBTlNQQVJFTlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYWN0dWFsOiAiICsgY29sb3IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvc3RQcm9jZXNzKCkgeworICAgICAgICAvLyBDb21wYXJlIHBvc3QgcHJvY2Vzc2luZyBhIFJlY3QgaW4gdGhlIG1pZGRsZSBvZiB0aGUgKG5vdC1hbmltYXRpbmcpCisgICAgICAgIC8vIGltYWdlIHdpdGggZHJhd2luZyBtYW51YWxseS4gVGhleSBzaG91bGQgYmUgZXhhY3RseSB0aGUgc2FtZS4KKyAgICAgICAgQmlGdW5jdGlvbjxJbnRlZ2VyLCBJbnRlZ2VyLCBSZWN0PiByZWN0Q3JlYXRvciA9ICh3aWR0aCwgaGVpZ2h0KSAtPiB7CisgICAgICAgICAgICBpbnQgcXVhcnRlcldpZHRoICA9IHdpZHRoICAvIDQ7CisgICAgICAgICAgICBpbnQgcXVhcnRlckhlaWdodCA9IGhlaWdodCAvIDQ7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlY3QocXVhcnRlcldpZHRoLCBxdWFydGVySGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAzICogcXVhcnRlcldpZHRoLCAzICogcXVhcnRlckhlaWdodCk7CisgICAgICAgIH07CisKKyAgICAgICAgQW5pbWF0ZWRJbWFnZURyYXdhYmxlIGRyYXdhYmxlID0gY3JlYXRlRnJvbUltYWdlRGVjb2RlcihSRVNfSUQpOworICAgICAgICBCaXRtYXAgZXhwZWN0ZWQgPSBCaXRtYXAuY3JlYXRlQml0bWFwKGRyYXdhYmxlLmdldEludHJpbnNpY1dpZHRoKCksCisgICAgICAgICAgICAgICAgZHJhd2FibGUuZ2V0SW50cmluc2ljSGVpZ2h0KCksIEJpdG1hcC5Db25maWcuQVJHQl84ODg4KTsKKworICAgICAgICBQYWludCBwYWludCA9IG5ldyBQYWludCgpOworICAgICAgICBwYWludC5zZXRDb2xvcihDb2xvci5SRUQpOworCisgICAgICAgIHsKKyAgICAgICAgICAgIFJlY3QgciA9IHJlY3RDcmVhdG9yLmFwcGx5KGRyYXdhYmxlLmdldEludHJpbnNpY1dpZHRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3YWJsZS5nZXRJbnRyaW5zaWNIZWlnaHQoKSk7CisgICAgICAgICAgICBDYW52YXMgY2FudmFzID0gbmV3IENhbnZhcyhleHBlY3RlZCk7CisgICAgICAgICAgICBkcmF3YWJsZS5kcmF3KGNhbnZhcyk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSByLmxlZnQ7IGkgPCByLnJpZ2h0OyArK2kpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gci50b3A7IGogPCByLmJvdHRvbTsgKytqKSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydE5vdEVxdWFscyhDb2xvci5SRUQsIGV4cGVjdGVkLmdldFBpeGVsKGksIGopKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdChyLCBwYWludCk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSByLmxlZnQ7IGkgPCByLnJpZ2h0OyArK2kpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gci50b3A7IGogPCByLmJvdHRvbTsgKytqKSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhDb2xvci5SRUQsIGV4cGVjdGVkLmdldFBpeGVsKGksIGopKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIEFuaW1hdGVkSW1hZ2VEcmF3YWJsZSB0ZXN0RHJhd2FibGUgPSBudWxsOworICAgICAgICBVcmkgdXJpID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHVyaSA9IGdldEFzUmVzb3VyY2VVcmkoUkVTX0lEKTsKKyAgICAgICAgICAgIEltYWdlRGVjb2Rlci5Tb3VyY2Ugc291cmNlID0gSW1hZ2VEZWNvZGVyLmNyZWF0ZVNvdXJjZShtQ29udGVudFJlc29sdmVyLCB1cmkpOworICAgICAgICAgICAgRHJhd2FibGUgZHIgPSBJbWFnZURlY29kZXIuZGVjb2RlRHJhd2FibGUoc291cmNlLCAoZGVjb2RlciwgaW5mbywgc3JjKSAtPiB7CisgICAgICAgICAgICAgICAgZGVjb2Rlci5zZXRQb3N0UHJvY2Vzc29yKChjYW52YXMpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KHJlY3RDcmVhdG9yLmFwcGx5KGNhbnZhcy5nZXRXaWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzLmdldEhlaWdodCgpKSwgcGFpbnQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGl4ZWxGb3JtYXQuVFJBTlNMVUNFTlQ7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZHIgaW5zdGFuY2VvZiBBbmltYXRlZEltYWdlRHJhd2FibGUpOworICAgICAgICAgICAgdGVzdERyYXdhYmxlID0gKEFuaW1hdGVkSW1hZ2VEcmF3YWJsZSkgZHI7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoImZhaWxlZCB0byBjcmVhdGUgaW1hZ2UgZnJvbSAiICsgdXJpKTsKKyAgICAgICAgfQorCisgICAgICAgIEJpdG1hcCBhY3R1YWwgPSBCaXRtYXAuY3JlYXRlQml0bWFwKGRyYXdhYmxlLmdldEludHJpbnNpY1dpZHRoKCksCisgICAgICAgICAgICAgICAgZHJhd2FibGUuZ2V0SW50cmluc2ljSGVpZ2h0KCksIEJpdG1hcC5Db25maWcuQVJHQl84ODg4KTsKKworICAgICAgICB7CisgICAgICAgICAgICBDYW52YXMgY2FudmFzID0gbmV3IENhbnZhcyhhY3R1YWwpOworICAgICAgICAgICAgdGVzdERyYXdhYmxlLmRyYXcoY2FudmFzKTsKKyAgICAgICAgfQorCisgICAgICAgIEJpdG1hcFV0aWxzLmNvbXBhcmVCaXRtYXBzKGV4cGVjdGVkLCBhY3R1YWwpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUZyb21YbWwoKSB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBYbWxQdWxsUGFyc2VyIHBhcnNlciA9IG1SZXMuZ2V0WG1sKFIuZHJhd2FibGUuYW5pbWF0ZWRpbWFnZWRyYXdhYmxlX3RhZyk7CisgICAgICAgIERyYXdhYmxlIGRyYXdhYmxlID0gRHJhd2FibGUuY3JlYXRlRnJvbVhtbChtUmVzLCBwYXJzZXIpOworICAgICAgICBhc3NlcnROb3ROdWxsKGRyYXdhYmxlKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkcmF3YWJsZSBpbnN0YW5jZW9mIEFuaW1hdGVkSW1hZ2VEcmF3YWJsZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlRnJvbVhtbENsYXNzKCkgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgWG1sUHVsbFBhcnNlciBwYXJzZXIgPSBtUmVzLmdldFhtbChSLmRyYXdhYmxlLmFuaW1hdGVkaW1hZ2VkcmF3YWJsZSk7CisgICAgICAgIERyYXdhYmxlIGRyYXdhYmxlID0gRHJhd2FibGUuY3JlYXRlRnJvbVhtbChtUmVzLCBwYXJzZXIpOworICAgICAgICBhc3NlcnROb3ROdWxsKGRyYXdhYmxlKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkcmF3YWJsZSBpbnN0YW5jZW9mIEFuaW1hdGVkSW1hZ2VEcmF3YWJsZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlRnJvbVhtbENsYXNzQXR0cmlidXRlKCkgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgWG1sUHVsbFBhcnNlciBwYXJzZXIgPSBtUmVzLmdldFhtbChSLmRyYXdhYmxlLmFuaW1hdGVkaW1hZ2VkcmF3YWJsZV9jbGFzcyk7CisgICAgICAgIERyYXdhYmxlIGRyYXdhYmxlID0gRHJhd2FibGUuY3JlYXRlRnJvbVhtbChtUmVzLCBwYXJzZXIpOworICAgICAgICBhc3NlcnROb3ROdWxsKGRyYXdhYmxlKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkcmF3YWJsZSBpbnN0YW5jZW9mIEFuaW1hdGVkSW1hZ2VEcmF3YWJsZSk7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQ9WG1sUHVsbFBhcnNlckV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWlzc2luZ1NyY0luZmxhdGUoKSB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gIHsKKyAgICAgICAgWG1sUHVsbFBhcnNlciBwYXJzZXIgPSBtUmVzLmdldFhtbChSLmRyYXdhYmxlLmFuaW1hdGVkaW1hZ2VkcmF3YWJsZV9ub3NyYyk7CisgICAgICAgIERyYXdhYmxlIGRyYXdhYmxlID0gRHJhd2FibGUuY3JlYXRlRnJvbVhtbChtUmVzLCBwYXJzZXIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEF1dG9NaXJyb3JlZCgpIHsKKyAgICAgICAgQW5pbWF0ZWRJbWFnZURyYXdhYmxlIGRyYXdhYmxlID0gY3JlYXRlRnJvbUltYWdlRGVjb2RlcihSRVNfSUQpOworICAgICAgICBhc3NlcnRGYWxzZShkcmF3YWJsZS5pc0F1dG9NaXJyb3JlZCgpKTsKKworICAgICAgICBkcmF3YWJsZS5zZXRBdXRvTWlycm9yZWQodHJ1ZSk7CisgICAgICAgIGFzc2VydFRydWUoZHJhd2FibGUuaXNBdXRvTWlycm9yZWQoKSk7CisKKyAgICAgICAgZHJhd2FibGUuc2V0QXV0b01pcnJvcmVkKGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoZHJhd2FibGUuaXNBdXRvTWlycm9yZWQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0b01pcnJvcmVkRnJvbVhtbCgpIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEFuaW1hdGVkSW1hZ2VEcmF3YWJsZSBkcmF3YWJsZSA9IHBhcnNlWG1sKFIuZHJhd2FibGUuYW5pbWF0ZWRpbWFnZWRyYXdhYmxlX3RhZyk7CisgICAgICAgIGFzc2VydEZhbHNlKGRyYXdhYmxlLmlzQXV0b01pcnJvcmVkKCkpOworCisgICAgICAgIGRyYXdhYmxlID0gcGFyc2VYbWwoUi5kcmF3YWJsZS5hbmltYXRlZGltYWdlZHJhd2FibGVfYXV0b21pcnJvcmVkKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkcmF3YWJsZS5pc0F1dG9NaXJyb3JlZCgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEFuaW1hdGVkSW1hZ2VEcmF3YWJsZSBwYXJzZVhtbChpbnQgcmVzSWQpIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFhtbFB1bGxQYXJzZXIgcGFyc2VyID0gbVJlcy5nZXRYbWwocmVzSWQpOworICAgICAgICBEcmF3YWJsZSBkcmF3YWJsZSA9IERyYXdhYmxlLmNyZWF0ZUZyb21YbWwobVJlcywgcGFyc2VyKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChkcmF3YWJsZSk7CisgICAgICAgIGFzc2VydFRydWUoZHJhd2FibGUgaW5zdGFuY2VvZiBBbmltYXRlZEltYWdlRHJhd2FibGUpOworICAgICAgICByZXR1cm4gKEFuaW1hdGVkSW1hZ2VEcmF3YWJsZSkgZHJhd2FibGU7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0b1N0YXJ0RnJvbVhtbCgpIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEFuaW1hdGVkSW1hZ2VEcmF3YWJsZSBkcmF3YWJsZSA9IHBhcnNlWG1sKFIuZHJhd2FibGUuYW5pbWF0ZWRpbWFnZWRyYXdhYmxlX3RhZyk7CisgICAgICAgIGFzc2VydEZhbHNlKGRyYXdhYmxlLmlzUnVubmluZygpKTsKKworICAgICAgICBkcmF3YWJsZSA9IHBhcnNlWG1sKFIuZHJhd2FibGUuYW5pbWF0ZWRpbWFnZWRyYXdhYmxlX2F1dG9zdGFydF9mYWxzZSk7CisgICAgICAgIGFzc2VydEZhbHNlKGRyYXdhYmxlLmlzUnVubmluZygpKTsKKworICAgICAgICBkcmF3YWJsZSA9IHBhcnNlWG1sKFIuZHJhd2FibGUuYW5pbWF0ZWRpbWFnZWRyYXdhYmxlX2F1dG9zdGFydCk7CisgICAgICAgIGFzc2VydFRydWUoZHJhd2FibGUuaXNSdW5uaW5nKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkcmF3QW5kQ29tcGFyZShCaXRtYXAgZXhwZWN0ZWQsIERyYXdhYmxlIGRyYXdhYmxlKSB7CisgICAgICAgIEJpdG1hcCB0ZXN0ID0gQml0bWFwLmNyZWF0ZUJpdG1hcChkcmF3YWJsZS5nZXRJbnRyaW5zaWNXaWR0aCgpLAorICAgICAgICAgICAgICAgIGRyYXdhYmxlLmdldEludHJpbnNpY0hlaWdodCgpLCBCaXRtYXAuQ29uZmlnLkFSR0JfODg4OCk7CisgICAgICAgIENhbnZhcyBjYW52YXMgPSBuZXcgQ2FudmFzKHRlc3QpOworICAgICAgICBkcmF3YWJsZS5kcmF3KGNhbnZhcyk7CisgICAgICAgIEJpdG1hcFV0aWxzLmNvbXBhcmVCaXRtYXBzKGV4cGVjdGVkLCB0ZXN0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvTWlycm9yZWREcmF3aW5nKCkgeworICAgICAgICBBbmltYXRlZEltYWdlRHJhd2FibGUgZHJhd2FibGUgPSBjcmVhdGVGcm9tSW1hZ2VEZWNvZGVyKFJFU19JRCk7CisgICAgICAgIGFzc2VydEZhbHNlKGRyYXdhYmxlLmlzQXV0b01pcnJvcmVkKCkpOworCisgICAgICAgIGZpbmFsIGludCB3aWR0aCA9IGRyYXdhYmxlLmdldEludHJpbnNpY1dpZHRoKCk7CisgICAgICAgIGZpbmFsIGludCBoZWlnaHQgPSBkcmF3YWJsZS5nZXRJbnRyaW5zaWNIZWlnaHQoKTsKKyAgICAgICAgQml0bWFwIG5vcm1hbCA9IEJpdG1hcC5jcmVhdGVCaXRtYXAod2lkdGgsIGhlaWdodCwgQml0bWFwLkNvbmZpZy5BUkdCXzg4ODgpOworICAgICAgICB7CisgICAgICAgICAgICBDYW52YXMgY2FudmFzID0gbmV3IENhbnZhcyhub3JtYWwpOworICAgICAgICAgICAgZHJhd2FibGUuZHJhdyhjYW52YXMpOworICAgICAgICB9CisKKyAgICAgICAgQml0bWFwIGZsaXBwZWQgPSBCaXRtYXAuY3JlYXRlQml0bWFwKHdpZHRoLCBoZWlnaHQsIEJpdG1hcC5Db25maWcuQVJHQl84ODg4KTsKKyAgICAgICAgeworICAgICAgICAgICAgQ2FudmFzIGNhbnZhcyA9IG5ldyBDYW52YXMoZmxpcHBlZCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKHdpZHRoLCAwKTsKKyAgICAgICAgICAgIGNhbnZhcy5zY2FsZSgtMSwgMSk7CisgICAgICAgICAgICBkcmF3YWJsZS5kcmF3KGNhbnZhcyk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdpZHRoOyArK2kpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaGVpZ2h0OyArK2opIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMobm9ybWFsLmdldFBpeGVsKGksIGopLCBmbGlwcGVkLmdldFBpeGVsKHdpZHRoIC0gMSAtIGksIGopKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGRyYXdhYmxlLnNldEF1dG9NaXJyb3JlZCh0cnVlKTsKKyAgICAgICAgZHJhd0FuZENvbXBhcmUobm9ybWFsLCBkcmF3YWJsZSk7CisKKyAgICAgICAgZHJhd2FibGUuc2V0TGF5b3V0RGlyZWN0aW9uKFZpZXcuTEFZT1VUX0RJUkVDVElPTl9SVEwpOworICAgICAgICBkcmF3QW5kQ29tcGFyZShmbGlwcGVkLCBkcmF3YWJsZSk7CisKKyAgICAgICAgZHJhd2FibGUuc2V0QXV0b01pcnJvcmVkKGZhbHNlKTsKKyAgICAgICAgZHJhd0FuZENvbXBhcmUobm9ybWFsLCBkcmF3YWJsZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwZWF0Q291bnRGcm9tWG1sKCkgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgWG1sUHVsbFBhcnNlciBwYXJzZXIgPSBtUmVzLmdldFhtbChSLmRyYXdhYmxlLmFuaW1hdGVkaW1hZ2VkcmF3YWJsZV9sb29wX2NvdW50KTsKKyAgICAgICAgRHJhd2FibGUgZHJhd2FibGUgPSBEcmF3YWJsZS5jcmVhdGVGcm9tWG1sKG1SZXMsIHBhcnNlcik7CisgICAgICAgIGFzc2VydE5vdE51bGwoZHJhd2FibGUpOworICAgICAgICBhc3NlcnRUcnVlKGRyYXdhYmxlIGluc3RhbmNlb2YgQW5pbWF0ZWRJbWFnZURyYXdhYmxlKTsKKworICAgICAgICBBbmltYXRlZEltYWdlRHJhd2FibGUgYWlkID0gKEFuaW1hdGVkSW1hZ2VEcmF3YWJsZSkgZHJhd2FibGU7CisgICAgICAgIGFzc2VydEVxdWFscygxNywgYWlkLmdldFJlcGVhdENvdW50KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEluZmluaXRlUmVwZWF0Q291bnRGcm9tWG1sKCkgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gVGhpcyBpbWFnZSBoYXMgYW4gZW5jb2RlZCByZXBlYXQgY291bnQgb2YgMS4gVmVyaWZ5IHRoYXQuCisgICAgICAgIERyYXdhYmxlIGRyYXdhYmxlID0gbVJlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmFuaW1hdGVkX29uZV9sb29wKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChkcmF3YWJsZSk7CisgICAgICAgIGFzc2VydFRydWUoZHJhd2FibGUgaW5zdGFuY2VvZiBBbmltYXRlZEltYWdlRHJhd2FibGUpOworICAgICAgICBBbmltYXRlZEltYWdlRHJhd2FibGUgYWlkID0gKEFuaW1hdGVkSW1hZ2VEcmF3YWJsZSkgZHJhd2FibGU7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBhaWQuZ2V0UmVwZWF0Q291bnQoKSk7CisKKyAgICAgICAgLy8gVGhpcyBsYXlvdXQgdXNlcyB0aGUgc2FtZSBpbWFnZSBhbmQgb3ZlcnJpZGVzIHRoZSByZXBlYXQgY291bnQgdG8gaW5maW5pdHkuCisgICAgICAgIFhtbFB1bGxQYXJzZXIgcGFyc2VyID0gbVJlcy5nZXRYbWwoUi5kcmF3YWJsZS5hbmltYXRlZGltYWdlZHJhd2FibGVfbG9vcF9jb3VudF9pbmZpbml0ZSk7CisgICAgICAgIGRyYXdhYmxlID0gRHJhd2FibGUuY3JlYXRlRnJvbVhtbChtUmVzLCBwYXJzZXIpOworICAgICAgICBhc3NlcnROb3ROdWxsKGRyYXdhYmxlKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkcmF3YWJsZSBpbnN0YW5jZW9mIEFuaW1hdGVkSW1hZ2VEcmF3YWJsZSk7CisKKyAgICAgICAgYWlkID0gKEFuaW1hdGVkSW1hZ2VEcmF3YWJsZSkgZHJhd2FibGU7CisgICAgICAgIGFzc2VydEVxdWFscyhBbmltYXRlZEltYWdlRHJhd2FibGUuUkVQRUFUX0lORklOSVRFLCBhaWQuZ2V0UmVwZWF0Q291bnQoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL0FuaW1hdGVkU3RhdGVMaXN0RHJhd2FibGVUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9jdHMvQW5pbWF0ZWRTdGF0ZUxpc3REcmF3YWJsZVRlc3QuamF2YQppbmRleCAyZTk4NmNiLi5jYzgwZjk3IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9jdHMvQW5pbWF0ZWRTdGF0ZUxpc3REcmF3YWJsZVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9jdHMvQW5pbWF0ZWRTdGF0ZUxpc3REcmF3YWJsZVRlc3QuamF2YQpAQCAtMzcsMTIgKzM3LDEzIEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlQ29udGFpbmVyLkRyYXdhYmxlQ29udGFpbmVyU3RhdGU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5TdGF0ZUxpc3REcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU3RhdGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlhtbDsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CkBAIC0yMDAsMTUgKzIwMSwxNyBAQAogICAgICAgICAgICAgQXJyYXlzLmZpbGwob3JpZ1dpZHRoLCBtYXgpOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gTk9URTogaW5zdHJpbnNpYyBXL0ggbWF5IGFscmVhZHkgYmUgYSBzY2FsZWQgYW5kIHRydW5jYXRlZCB2YWx1ZSBjb21wdXRlZCBmcm9tIHRoZQorICAgICAgICAvLyB1bmRlcmx5aW5nIGFzc2V0IChlLmcuIGJpdG1hcCkgc28gYWNjb3VudCBmb3IgdGhpcyBwcmV2aW91c2x5IGFwcGxpZWQgc2NhbGluZy90cnVuY2F0aW9uCisgICAgICAgIC8vIGJ5IGFwcGx5aW5nIGEgc21hbGwgZGVsdGEgdG8gdGhlIGFzc2VydHMuCisKICAgICAgICAgLy8gU2V0IGRlbnNpdHkgdG8gaGFsZiBvZiBvcmlnaW5hbC4KICAgICAgICAgRHJhd2FibGVUZXN0VXRpbHMuc2V0UmVzb3VyY2VzRGVuc2l0eShyZXMsIGRlbnNpdHlEcGkgLyAyKTsKICAgICAgICAgZmluYWwgU3RhdGVMaXN0RHJhd2FibGUgaGFsZkRyYXdhYmxlID0KICAgICAgICAgICAgICAgICAoU3RhdGVMaXN0RHJhd2FibGUpIGNzLm5ld0RyYXdhYmxlKHJlcyk7Ci0gICAgICAgIC8vIE5PVEU6IGRlbnNpdHlEcGkgbWF5IG5vdCBiZSBhbiBldmVuIG51bWJlciwgc28gYWNjb3VudCBmb3IgKmFjdHVhbCogc2NhbGluZyBpbiBhc3NlcnRzCi0gICAgICAgIGZpbmFsIGZsb2F0IGFwcHJveEhhbGYgPSAoZmxvYXQpKGRlbnNpdHlEcGkgLyAyKSAvIGRlbnNpdHlEcGk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICAgICAgICAgaGFsZkRyYXdhYmxlLnNlbGVjdERyYXdhYmxlKGkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKE1hdGgucm91bmQob3JpZ1dpZHRoW2ldICogYXBwcm94SGFsZiksIGhhbGZEcmF3YWJsZS5nZXRJbnRyaW5zaWNXaWR0aCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhNYXRoLnJvdW5kKG9yaWdXaWR0aFtpXSAqIDAuNWYpLCBoYWxmRHJhd2FibGUuZ2V0SW50cmluc2ljV2lkdGgoKSwgMSk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBTZXQgZGVuc2l0eSB0byBkb3VibGUgb3JpZ2luYWwuCkBAIC0yMTcsNyArMjIwLDcgQEAKICAgICAgICAgICAgICAgICAoU3RhdGVMaXN0RHJhd2FibGUpIGNzLm5ld0RyYXdhYmxlKHJlcyk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICAgICAgICAgZG91YmxlRHJhd2FibGUuc2VsZWN0RHJhd2FibGUoaSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMob3JpZ1dpZHRoW2ldICogMiwgZG91YmxlRHJhd2FibGUuZ2V0SW50cmluc2ljV2lkdGgoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMob3JpZ1dpZHRoW2ldICogMiwgZG91YmxlRHJhd2FibGUuZ2V0SW50cmluc2ljV2lkdGgoKSwgMSk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBSZXN0b3JlIG9yaWdpbmFsIGNvbmZpZ3VyYXRpb24gYW5kIG1ldHJpY3MuCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9jdHMvQW5pbWF0ZWRWZWN0b3JEcmF3YWJsZVBhcmFtZXRlcml6ZWRUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9jdHMvQW5pbWF0ZWRWZWN0b3JEcmF3YWJsZVBhcmFtZXRlcml6ZWRUZXN0LmphdmEKaW5kZXggMTdlZGMzZi4uYzJlMmFjYyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL0FuaW1hdGVkVmVjdG9yRHJhd2FibGVQYXJhbWV0ZXJpemVkVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL2N0cy9BbmltYXRlZFZlY3RvckRyYXdhYmxlUGFyYW1ldGVyaXplZFRlc3QuamF2YQpAQCAtMjksMTcgKzI5LDE3IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuY3RzLlI7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5BbmltYXRlZFZlY3RvckRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk51bGxhYmxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTGFyZ2VUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuUGl4ZWxDb3B5OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLkxhcmdlVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworCiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5TeW5jaHJvbm91c1BpeGVsQ29weTsKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlN5c3RlbVV0aWw7CiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5XaWRnZXRUZXN0VXRpbHM7CkBAIC0xMTgsOCArMTE4LDcgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEFuaW1hdGlvbk9uTGF5ZXIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgZmluYWwgQW5pbWF0ZWRWZWN0b3JEcmF3YWJsZVRlc3QuTXlDYWxsYmFjayBjYWxsYmFjawotICAgICAgICAgICAgICAgID0gbmV3IEFuaW1hdGVkVmVjdG9yRHJhd2FibGVUZXN0Lk15Q2FsbGJhY2soKTsKKyAgICAgICAgZmluYWwgQW5pbWF0YWJsZTJDYWxsYmFjayBjYWxsYmFjayA9IG5ldyBBbmltYXRhYmxlMkNhbGxiYWNrKCk7CiAgICAgICAgIC8vIENhbid0IHNpbXBseSB1c2UgZmluYWwgaGVyZSwgYi9jIGl0IG5lZWRzIHRvIGJlIGluaXRpYWxpemVkIGFuZCByZWZlcnJlZCBsYXRlciBpbiBVSQogICAgICAgICAvLyB0aHJlYWQuCiAgICAgICAgIGZpbmFsIEltYWdlVmlld1tdIGltYWdlVmlldyA9IG5ldyBJbWFnZVZpZXdbMV07CkBAIC0yMzEsOCArMjMwLDcgQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eUFuaW1hdG9yU2V0KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIGludCByZXNJZCA9IFIuZHJhd2FibGUuYXZkX2VtcHR5X2FuaW1hdG9yOwotICAgICAgICBmaW5hbCBBbmltYXRlZFZlY3RvckRyYXdhYmxlVGVzdC5NeUNhbGxiYWNrIGNhbGxiYWNrID0KLSAgICAgICAgICAgICAgICBuZXcgQW5pbWF0ZWRWZWN0b3JEcmF3YWJsZVRlc3QuTXlDYWxsYmFjaygpOworICAgICAgICBmaW5hbCBBbmltYXRhYmxlMkNhbGxiYWNrIGNhbGxiYWNrID0gbmV3IEFuaW1hdGFibGUyQ2FsbGJhY2soKTsKICAgICAgICAgZmluYWwgQW5pbWF0ZWRWZWN0b3JEcmF3YWJsZSBkMSA9CiAgICAgICAgICAgICAgICAgKEFuaW1hdGVkVmVjdG9yRHJhd2FibGUpIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUocmVzSWQpOwogICAgICAgICBkMS5yZWdpc3RlckFuaW1hdGlvbkNhbGxiYWNrKGNhbGxiYWNrKTsKQEAgLTI4NCw4ICsyODIsNyBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW5maW5pdGVBVkQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgZmluYWwgQW5pbWF0ZWRWZWN0b3JEcmF3YWJsZVRlc3QuTXlDYWxsYmFjayBjYWxsYmFjawotICAgICAgICAgICAgICAgID0gbmV3IEFuaW1hdGVkVmVjdG9yRHJhd2FibGVUZXN0Lk15Q2FsbGJhY2soKTsKKyAgICAgICAgZmluYWwgQW5pbWF0YWJsZTJDYWxsYmFjayBjYWxsYmFjayA9IG5ldyBBbmltYXRhYmxlMkNhbGxiYWNrKCk7CiAgICAgICAgIC8vIENhbid0IHNpbXBseSB1c2UgZmluYWwgaGVyZSwgYi9jIGl0IG5lZWRzIHRvIGJlIGluaXRpYWxpemVkIGFuZCByZWZlcnJlZCBsYXRlciBpbiBVSQogICAgICAgICAvLyB0aHJlYWQuCiAgICAgICAgIGZpbmFsIEltYWdlVmlld1tdIGltYWdlVmlldyA9IG5ldyBJbWFnZVZpZXdbMV07CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9jdHMvQW5pbWF0ZWRWZWN0b3JEcmF3YWJsZVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL2N0cy9BbmltYXRlZFZlY3RvckRyYXdhYmxlVGVzdC5qYXZhCmluZGV4IDk5MGE4ZmIuLjc3M2NjOWUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL2N0cy9BbmltYXRlZFZlY3RvckRyYXdhYmxlVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL2N0cy9BbmltYXRlZFZlY3RvckRyYXdhYmxlVGVzdC5qYXZhCkBAIC0zMiwxOCArMzIsMTcgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmY7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmQ29sb3JGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5jdHMuUjsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkFuaW1hdGFibGUyOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQW5pbWF0ZWRWZWN0b3JEcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUuQ29uc3RhbnRTdGF0ZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLkxhcmdlVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5MYXJnZVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKQEAgLTU3LDcgKzU2LDYgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU1BR0VfV0lEVEggPSA2NDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU1BR0VfSEVJR0hUID0gNjQ7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBNQVhfVElNRU9VVF9NUyA9IDEwMDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBNQVhfU1RBUlRfVElNRU9VVF9NUyA9IDUwMDA7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TX1RPX05TID0gMTAwMDAwMDsKIAogICAgIEBSdWxlCkBAIC0yMDIsNyArMjAwLDcgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFJlc2V0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIGZpbmFsIE15Q2FsbGJhY2sgY2FsbGJhY2sgPSBuZXcgTXlDYWxsYmFjaygpOworICAgICAgICBmaW5hbCBBbmltYXRhYmxlMkNhbGxiYWNrIGNhbGxiYWNrID0gbmV3IEFuaW1hdGFibGUyQ2FsbGJhY2soKTsKICAgICAgICAgZmluYWwgQW5pbWF0ZWRWZWN0b3JEcmF3YWJsZSBkMSA9IChBbmltYXRlZFZlY3RvckRyYXdhYmxlKSBtUmVzb3VyY2VzLmdldERyYXdhYmxlKG1SZXNJZCk7CiAgICAgICAgIC8vIFRoZSBBVkQgaGFzIGEgZHVyYXRpb24gYXMgMTAwbXMuCiAgICAgICAgIG1BY3Rpdml0eVJ1bGUucnVuT25VaVRocmVhZCgoKSAtPiB7CkBAIC0yMTcsNyArMjE1LDcgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFN0b3AoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgZmluYWwgTXlDYWxsYmFjayBjYWxsYmFjayA9IG5ldyBNeUNhbGxiYWNrKCk7CisgICAgICAgIGZpbmFsIEFuaW1hdGFibGUyQ2FsbGJhY2sgY2FsbGJhY2sgPSBuZXcgQW5pbWF0YWJsZTJDYWxsYmFjaygpOwogICAgICAgICBmaW5hbCBBbmltYXRlZFZlY3RvckRyYXdhYmxlIGQxID0gKEFuaW1hdGVkVmVjdG9yRHJhd2FibGUpIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUobVJlc0lkKTsKICAgICAgICAgLy8gVGhlIEFWRCBoYXMgYSBkdXJhdGlvbiBhcyAxMDBtcy4KICAgICAgICAgbUFjdGl2aXR5UnVsZS5ydW5PblVpVGhyZWFkKCgpIC0+IHsKQEAgLTIzMSw3ICsyMjksNyBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkQ2FsbGJhY2tCZWZvcmVTdGFydCgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBmaW5hbCBNeUNhbGxiYWNrIGNhbGxiYWNrID0gbmV3IE15Q2FsbGJhY2soKTsKKyAgICAgICAgZmluYWwgQW5pbWF0YWJsZTJDYWxsYmFjayBjYWxsYmFjayA9IG5ldyBBbmltYXRhYmxlMkNhbGxiYWNrKCk7CiAgICAgICAgIC8vIFRoZSBBVkQgaGFzIGEgZHVyYXRpb24gYXMgMTAwbXMuCiAgICAgICAgIG1BY3Rpdml0eVJ1bGUucnVuT25VaVRocmVhZCgoKSAtPiB7CiAgICAgICAgICAgICBtQWN0aXZpdHkuc2V0Q29udGVudFZpZXcobUxheW91dElkKTsKQEAgLTI0OCw3ICsyNDYsNyBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkQ2FsbGJhY2tBZnRlclRyaWdnZXIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgZmluYWwgTXlDYWxsYmFjayBjYWxsYmFjayA9IG5ldyBNeUNhbGxiYWNrKCk7CisgICAgICAgIGZpbmFsIEFuaW1hdGFibGUyQ2FsbGJhY2sgY2FsbGJhY2sgPSBuZXcgQW5pbWF0YWJsZTJDYWxsYmFjaygpOwogICAgICAgICAvLyBUaGUgQVZEIGhhcyBhIGR1cmF0aW9uIGFzIDEwMG1zLgogICAgICAgICBtQWN0aXZpdHlSdWxlLnJ1bk9uVWlUaHJlYWQoKCkgLT4gewogICAgICAgICAgICAgbUFjdGl2aXR5LnNldENvbnRlbnRWaWV3KG1MYXlvdXRJZCk7CkBAIC0yNjksNyArMjY3LDcgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEFkZENhbGxiYWNrQWZ0ZXJTdGFydCgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBmaW5hbCBNeUNhbGxiYWNrIGNhbGxiYWNrID0gbmV3IE15Q2FsbGJhY2soKTsKKyAgICAgICAgZmluYWwgQW5pbWF0YWJsZTJDYWxsYmFjayBjYWxsYmFjayA9IG5ldyBBbmltYXRhYmxlMkNhbGxiYWNrKCk7CiAgICAgICAgIC8vIFRoZSBBVkQgaGFzIGEgZHVyYXRpb24gYXMgMTAwbXMuCiAgICAgICAgIG1BY3Rpdml0eVJ1bGUucnVuT25VaVRocmVhZCgoKSAtPiB7CiAgICAgICAgICAgICBtQWN0aXZpdHkuc2V0Q29udGVudFZpZXcobUxheW91dElkKTsKQEAgLTI4OSw3ICsyODcsNyBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQ2FsbGJhY2soKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgZmluYWwgTXlDYWxsYmFjayBjYWxsYmFjayA9IG5ldyBNeUNhbGxiYWNrKCk7CisgICAgICAgIGZpbmFsIEFuaW1hdGFibGUyQ2FsbGJhY2sgY2FsbGJhY2sgPSBuZXcgQW5pbWF0YWJsZTJDYWxsYmFjaygpOwogICAgICAgICAvLyBUaGUgQVZEIGhhcyBhIGR1cmF0aW9uIGFzIDEwMG1zLgogICAgICAgICBtQWN0aXZpdHlSdWxlLnJ1bk9uVWlUaHJlYWQoKCkgLT4gewogICAgICAgICAgICAgbUFjdGl2aXR5LnNldENvbnRlbnRWaWV3KG1MYXlvdXRJZCk7CkBAIC0zMDgsNyArMzA2LDcgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdENsZWFyQ2FsbGJhY2soKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgZmluYWwgTXlDYWxsYmFjayBjYWxsYmFjayA9IG5ldyBNeUNhbGxiYWNrKCk7CisgICAgICAgIGZpbmFsIEFuaW1hdGFibGUyQ2FsbGJhY2sgY2FsbGJhY2sgPSBuZXcgQW5pbWF0YWJsZTJDYWxsYmFjaygpOwogCiAgICAgICAgIC8vIFRoZSBBVkQgaGFzIGEgZHVyYXRpb24gYXMgMTAwbXMuCiAgICAgICAgIG1BY3Rpdml0eVJ1bGUucnVuT25VaVRocmVhZCgoKSAtPiB7CkBAIC0zMjgsNyArMzI2LDcgQEAKIAogICAgIC8vIFRoZSB0aW1lIG91dCBpcyBleHBlY3RlZCB3aGVuIHRoZSBsaXN0ZW5lciBpcyByZW1vdmVkIHN1Y2Nlc3NmdWxseS4KICAgICAvLyBTdWNoIHRoYXQgd2UgZG9uJ3QgZ2V0IHRoZSBlbmQgZXZlbnQuCi0gICAgc3RhdGljIHZvaWQgd2FpdEZvckFWRFN0b3AoTXlDYWxsYmFjayBjYWxsYmFjaywgbG9uZyB0aW1lb3V0KSB7CisgICAgc3RhdGljIHZvaWQgd2FpdEZvckFWRFN0b3AoQW5pbWF0YWJsZTJDYWxsYmFjayBjYWxsYmFjaywgbG9uZyB0aW1lb3V0KSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBjYWxsYmFjay53YWl0Rm9yRW5kKHRpbWVvdXQpOwogICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CkBAIC0zMzYsODIgKzMzNCw0IEBACiAgICAgICAgICAgICBmYWlsKCJXZSBzaG91bGQgbm90IHNlZSB0aGUgQVZEIHJ1biB0aGlzIGxvbmcgdGltZSEiKTsKICAgICAgICAgfQogICAgIH0KLQotICAgIC8vIE5vdyB0aGlzIGNsYXNzIGNhbiBub3Qgb25seSBsaXN0ZW4gdG8gdGhlIGV2ZW50cywgYnV0IGFsc28gc3luY2hyb25pemUgdGhlIGtleSBldmVudHMsCi0gICAgLy8gbG9nZ2luZyB0aGUgZXZlbnQgdGltZXN0YW1wLCBhbmQgY2VudHJhbGl6ZSBzb21lIGFzc2VydGlvbnMuCi0gICAgc3RhdGljIGNsYXNzIE15Q2FsbGJhY2sgZXh0ZW5kcyBBbmltYXRhYmxlMi5BbmltYXRpb25DYWxsYmFjayB7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtU3RhcnRlZCA9IGZhbHNlOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUVuZGVkID0gZmFsc2U7Ci0KLSAgICAgICAgcHJpdmF0ZSBsb25nIG1TdGFydE5zID0gTG9uZy5NQVhfVkFMVUU7Ci0gICAgICAgIHByaXZhdGUgbG9uZyBtRW5kTnMgPSBMb25nLk1JTl9WQUxVRTsKLQotICAgICAgICAvLyBVc2UgdGhpcyBsb2NrIHRvIG1ha2Ugc3VyZSB0aGUgb25BbmltYXRpb25FbmQoKSBoYXMgYmVlbiBjYWxsZWQuCi0gICAgICAgIC8vIEVhY2ggc3ViIHRlc3Qgc2hvdWxkIGhhdmUgaXRzIG93biBsb2NrLgotICAgICAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtRW5kTG9jayA9IG5ldyBPYmplY3QoKTsKLQotICAgICAgICAvLyBVc2UgdGhpcyBsb2NrIHRvIG1ha2Ugc3VyZSB0aGUgdGVzdCB0aHJlYWQga25vdyB3aGVuIHRoZSBBVkQuc3RhcnQoKSBoYXMgYmVlbiBjYWxsZWQuCi0gICAgICAgIC8vIEVhY2ggc3ViIHRlc3Qgc2hvdWxkIGhhdmUgaXRzIG93biBsb2NrLgotICAgICAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtU3RhcnRMb2NrID0gbmV3IE9iamVjdCgpOwotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHdhaXRGb3JFbmQobG9uZyB0aW1lb3V0TXMpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1FbmRMb2NrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFtRW5kZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gUmV0dXJuIGltbWVkaWF0ZWx5IGlmIHRoZSBBVkQgaGFzIGFscmVhZHkgZW5kZWQuCi0gICAgICAgICAgICAgICAgICAgIG1FbmRMb2NrLndhaXQodGltZW91dE1zKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1FbmRlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHdhaXRGb3JTdGFydCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQobVN0YXJ0TG9jaykgewotICAgICAgICAgICAgICAgIGlmICghbVN0YXJ0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gUmV0dXJuIGltbWVkaWF0ZWx5IGlmIHRoZSBBVkQgaGFzIGFscmVhZHkgc3RhcnRlZC4KLSAgICAgICAgICAgICAgICAgICAgbVN0YXJ0TG9jay53YWl0KE1BWF9TVEFSVF9USU1FT1VUX01TKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1TdGFydGVkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uU3RhcnQoRHJhd2FibGUgZHJhd2FibGUpIHsKLSAgICAgICAgICAgIG1TdGFydE5zID0gU3lzdGVtLm5hbm9UaW1lKCk7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQobVN0YXJ0TG9jaykgewotICAgICAgICAgICAgICAgIG1TdGFydGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBtU3RhcnRMb2NrLm5vdGlmeSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uRW5kKERyYXdhYmxlIGRyYXdhYmxlKSB7Ci0gICAgICAgICAgICBtRW5kTnMgPSBTeXN0ZW0ubmFub1RpbWUoKTsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUVuZExvY2spIHsKLSAgICAgICAgICAgICAgICBtRW5kZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1FbmRMb2NrLm5vdGlmeSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gZW5kSXNDYWxsZWQoKSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1FbmRMb2NrKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1FbmRlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGFzc2VydFN0YXJ0ZWQoYm9vbGVhbiBzdGFydGVkKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc3RhcnRlZCwgbVN0YXJ0ZWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYXNzZXJ0RW5kZWQoYm9vbGVhbiBlbmRlZCkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGVuZGVkLCBtRW5kZWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYXNzZXJ0QVZEUnVudGltZShsb25nIG1pbiwgbG9uZyBtYXgpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUobVN0YXJ0TnMgIT0gTG9uZy5NQVhfVkFMVUUpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRW5kTnMgIT0gTG9uZy5NSU5fVkFMVUUpOwotICAgICAgICAgICAgbG9uZyBkdXJhdGlvbk5zID0gbUVuZE5zIC0gbVN0YXJ0TnM7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJjdXJyZW50IGR1cmF0aW9uICIgKyBkdXJhdGlvbk5zICsgIiBzaG91bGQgYmUgd2l0aGluICIgKwotICAgICAgICAgICAgICAgICAgICBtaW4gKyAiLCIgKyBtYXgsIGR1cmF0aW9uTnMgPD0gbWF4ICYmIGR1cmF0aW9uTnMgPj0gbWluKTsKLSAgICAgICAgfQotICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL2N0cy9BbmltYXRpb25EcmF3YWJsZVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL2N0cy9BbmltYXRpb25EcmF3YWJsZVRlc3QuamF2YQppbmRleCBlYjI3Y2YyLi4zZmMzOGIxIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9jdHMvQW5pbWF0aW9uRHJhd2FibGVUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL0FuaW1hdGlvbkRyYXdhYmxlVGVzdC5qYXZhCkBAIC0zMiwxMyArMzIsMTQgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkFuaW1hdGlvbkRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZUNvbnRhaW5lci5EcmF3YWJsZUNvbnRhaW5lclN0YXRlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTGFyZ2VUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLkxhcmdlVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5Qb2xsaW5nQ2hlY2s7CiAKIGltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9jdHMvQml0bWFwRHJhd2FibGVUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9jdHMvQml0bWFwRHJhd2FibGVUZXN0LmphdmEKaW5kZXggZWRkY2VjYy4uMzgzZjJkNSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL0JpdG1hcERyYXdhYmxlVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL2N0cy9CaXRtYXBEcmF3YWJsZVRlc3QuamF2YQpAQCAtMjUsNDMgKzI1LDM2IEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwogCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMuVGhlbWU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5YbWxSZXNvdXJjZVBhcnNlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcC5Db25maWc7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3JGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBpeGVsRm9ybWF0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZi5Nb2RlOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyLlRpbGVNb2RlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuY3RzLlI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5CaXRtYXBEcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlLkNvbnN0YW50U3RhdGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiBpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKIAotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuWG1sUmVzb3VyY2VQYXJzZXI7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yRmlsdGVyOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QaXhlbEZvcm1hdDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlNoYWRlcjsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcC5Db25maWc7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmLk1vZGU7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5TaGFkZXIuVGlsZU1vZGU7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5CaXRtYXBEcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUuQ29uc3RhbnRTdGF0ZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5MYXlvdXREaXJlY3Rpb247Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlhtbDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKLQogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiAKQEAgLTM1Nyw4ICszNTAsOCBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEdldEludHJpbnNpY1NpemUoKSB7CiAgICAgICAgIEJpdG1hcERyYXdhYmxlIGJpdG1hcERyYXdhYmxlID0gbmV3IEJpdG1hcERyYXdhYmxlKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBiaXRtYXBEcmF3YWJsZS5nZXRJbnRyaW5zaWNXaWR0aCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGJpdG1hcERyYXdhYmxlLmdldEludHJpbnNpY0hlaWdodCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBiaXRtYXBEcmF3YWJsZS5nZXRJbnRyaW5zaWNXaWR0aCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBiaXRtYXBEcmF3YWJsZS5nZXRJbnRyaW5zaWNIZWlnaHQoKSk7CiAKICAgICAgICAgQml0bWFwIGJpdG1hcCA9IEJpdG1hcC5jcmVhdGVCaXRtYXAoMjAwLCAzMDAsIENvbmZpZy5SR0JfNTY1KTsKICAgICAgICAgYml0bWFwRHJhd2FibGUgPSBuZXcgQml0bWFwRHJhd2FibGUoYml0bWFwKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL2N0cy9DbGlwRHJhd2FibGVUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9jdHMvQ2xpcERyYXdhYmxlVGVzdC5qYXZhCmluZGV4IDJhNDFmYmUuLjlkYzk5MTMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL2N0cy9DbGlwRHJhd2FibGVUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL0NsaXBEcmF3YWJsZVRlc3QuamF2YQpAQCAtNDYsMTQgKzQ2LDE1IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5Db2xvckRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZS5Db25zdGFudFN0YXRlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlN0YXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5YbWw7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIGltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL0NvbG9yRHJhd2FibGVUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9jdHMvQ29sb3JEcmF3YWJsZVRlc3QuamF2YQppbmRleCBlZTM0MjU0Li5mZTYxN2JkIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9jdHMvQ29sb3JEcmF3YWJsZVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9jdHMvQ29sb3JEcmF3YWJsZVRlc3QuamF2YQpAQCAtMzEsMTIgKzMxLDEzIEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmQ29sb3JGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5jdHMuUjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkNvbG9yRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiBpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL2N0cy9DdXN0b21BbmltYXRpb25TY2FsZUxpc3REcmF3YWJsZVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL2N0cy9DdXN0b21BbmltYXRpb25TY2FsZUxpc3REcmF3YWJsZVRlc3QuamF2YQppbmRleCBhYmJhOTZlLi44NGQwMDU3IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9jdHMvQ3VzdG9tQW5pbWF0aW9uU2NhbGVMaXN0RHJhd2FibGVUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL0N1c3RvbUFuaW1hdGlvblNjYWxlTGlzdERyYXdhYmxlVGVzdC5qYXZhCkBAIC0xNiwyNSArMTYsMjUgQEAKIAogcGFja2FnZSBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLmN0czsKIAoraW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKIGltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5WYWx1ZUFuaW1hdG9yOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuY3RzLlI7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5BbmltYXRhYmxlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZUNvbnRhaW5lcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIAogaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIAotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7Ci0KIC8qKgogICogVGhpcyB0ZXN0IGlzIHVzZWQgdG8gdmVyaWZ5IHRoYXQgdGhlIEN1c3RvbUFuaW1hdGlvblNjYWxlTGlzdERyYXdhYmxlJ3MgY3VycmVudCBkcmF3YWJsZSBkZXBlbmRzCiAgKiBvbiBhbmltYXRpb24gZHVyYXRpb24gc2NhbGUuIFdoZW4gdGhlIHNjYWxlIGlzIDAsIGl0IGlzIGEgc3RhdGljIGRyYXdhYmxlLCBvdGhlcndpc2UsIGl0IGlzIGFuCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9jdHMvQ3VzdG9tRHJhd2FibGVUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9jdHMvQ3VzdG9tRHJhd2FibGVUZXN0LmphdmEKaW5kZXggOTA3MDY5MC4uYzMxMjI5YyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL0N1c3RvbURyYXdhYmxlVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL2N0cy9DdXN0b21EcmF3YWJsZVRlc3QuamF2YQpAQCAtMjgsMTEgKzI4LDEyIEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QaXhlbEZvcm1hdDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmN0cy5SOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9jdHMvRGVmYXVsdEZvY3VzSGlnaGxpZ2h0VGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL0RlZmF1bHRGb2N1c0hpZ2hsaWdodFRlc3QuamF2YQppbmRleCBjOGQwNTdhLi4xYmM2ZWI5IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9jdHMvRGVmYXVsdEZvY3VzSGlnaGxpZ2h0VGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL2N0cy9EZWZhdWx0Rm9jdXNIaWdobGlnaHRUZXN0LmphdmEKQEAgLTQ0LDEyICs0NCwxMyBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU2hhcGVEcmF3YWJsZTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLlN0YXRlTGlzdERyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuc2hhcGVzLlJlY3RTaGFwZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU3RhdGVTZXQ7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9jdHMvRHJhd2FibGVDb250YWluZXJTdGF0ZVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL2N0cy9EcmF3YWJsZUNvbnRhaW5lclN0YXRlVGVzdC5qYXZhCmluZGV4IGFlZjhjM2EuLmJkOGEwOTkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL2N0cy9EcmF3YWJsZUNvbnRhaW5lclN0YXRlVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL2N0cy9EcmF3YWJsZUNvbnRhaW5lclN0YXRlVGVzdC5qYXZhCkBAIC0zMyw4ICszMyw5IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZUNvbnRhaW5lcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlQ29udGFpbmVyLkRyYXdhYmxlQ29udGFpbmVyU3RhdGU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5MZXZlbExpc3REcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9jdHMvRHJhd2FibGVDb250YWluZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9jdHMvRHJhd2FibGVDb250YWluZXJUZXN0LmphdmEKaW5kZXggOWI5M2E0OC4uZjEzZWQxMyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL0RyYXdhYmxlQ29udGFpbmVyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL2N0cy9EcmF3YWJsZUNvbnRhaW5lclRlc3QuamF2YQpAQCAtNTAsOCArNTAsOSBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGVDb250YWluZXI7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZUNvbnRhaW5lci5EcmF3YWJsZUNvbnRhaW5lclN0YXRlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuTGV2ZWxMaXN0RHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL0RyYXdhYmxlVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL0RyYXdhYmxlVGVzdC5qYXZhCmluZGV4IDEzY2MyZTAuLjYxNzg3M2IgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL2N0cy9EcmF3YWJsZVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9jdHMvRHJhd2FibGVUZXN0LmphdmEKQEAgLTE2LDExICsxNiwxNyBAQAogCiBwYWNrYWdlIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuY3RzOwogCi1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLWltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7Ci1pbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKLWltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1hdGNoZXJzLmVxOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLm1vY2s7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8udGltZXM7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8udmVyaWZ5OwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKQEAgLTM2LDM2ICs0MiwyOSBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZS5DYWxsYmFjazsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5TdGF0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyOworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247CisKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKIAotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7Ci1pbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1hdGNoZXJzLmVxOwotaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLm1vY2s7Ci1pbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8udGltZXM7Ci1pbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8udmVyaWZ5OwotCiBAU21hbGxUZXN0CiBAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQogcHVibGljIGNsYXNzIERyYXdhYmxlVGVzdCB7CkBAIC0yMTMsNiArMjEyLDM5IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIEJvb2xlYW4gaXNDbG9zZWQgPSBuZXcgQm9vbGVhbihmYWxzZSk7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVGcm9tU3RyZWFtMigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgIEZpbGUgaW1hZ2VGaWxlID0gbnVsbDsKKyAgICAgICAgc3luY2hyb25pemVkIChpc0Nsb3NlZCkgeworICAgICAgICAgICAgaXNDbG9zZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaW1hZ2VGaWxlID0gbmV3IEZpbGUobUNvbnRleHQuZ2V0RmlsZXNEaXIoKSwgInRlbXBpbWFnZS5qcGciKTsKKyAgICAgICAgICAgICAgICB3cml0ZVNhbXBsZUltYWdlKGltYWdlRmlsZSk7CisKKyAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oaW1hZ2VGaWxlKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdXBlci5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgaXNDbG9zZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKERyYXdhYmxlLmNyZWF0ZUZyb21TdHJlYW0oaW5wdXRTdHJlYW0sICJTYW1wbGUiKSk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlmIChudWxsICE9IGlucHV0U3RyZWFtKSB7CisJCSAgICAvLyB2ZXJpZnkgdGhhdCB0aGUgc3RyZWFtIHdhcyBub3QgY2xvc2VkCisgICAgICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKGlzQ2xvc2VkKTsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGltYWdlRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGltYWdlRmlsZS5kZWxldGUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlRnJvbVJlc291cmNlU3RyZWFtMSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpbnB1dEVtcHR5U3RyZWFtID0gbnVsbDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL2N0cy9EcmF3YWJsZVRlc3RVdGlscy5qYXZhIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL0RyYXdhYmxlVGVzdFV0aWxzLmphdmEKaW5kZXggMDc3ODM2Yy4uZDUxODY2OCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL0RyYXdhYmxlVGVzdFV0aWxzLmphdmEKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL0RyYXdhYmxlVGVzdFV0aWxzLmphdmEKQEAgLTI0LDkgKzI0LDkgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uSW50ZWdlclJlczsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uSW50ZWdlclJlczsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk5vbk51bGw7CitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5OdWxsYWJsZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlhtbDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL2N0cy9EcmF3YWJsZVdyYXBwZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9jdHMvRHJhd2FibGVXcmFwcGVyVGVzdC5qYXZhCmluZGV4IDAzYjJmMjIuLmY0YzQ1ZmEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL2N0cy9EcmF3YWJsZVdyYXBwZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL0RyYXdhYmxlV3JhcHBlclRlc3QuamF2YQpAQCAtMzYsMTcgKzM2LDIwIEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yRmlsdGVyOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGl4ZWxGb3JtYXQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZkNvbG9yRmlsdGVyOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmN0cy5SOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQml0bWFwRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5Db2xvckRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZVdyYXBwZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlN0YXRlU2V0OwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKQEAgLTE5Myw2ICsxOTYsMTcgQEAKICAgICAgICAgdmVyaWZ5KG1vY2tEcmF3YWJsZSwgdGltZXMoMSkpLmdldFBhZGRpbmcoYW55KCkpOwogICAgIH0KIAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbG9yRmlsdGVyKCkgeworICAgICAgICBEcmF3YWJsZSB3cmFwcGVkRHJhd2FibGUgPSBuZXcgTW9ja0RyYXdhYmxlKCk7CisgICAgICAgIERyYXdhYmxlV3JhcHBlciB3cmFwcGVyID0gbmV3IE15V3JhcHBlcih3cmFwcGVkRHJhd2FibGUpOworICAgICAgICBQb3J0ZXJEdWZmQ29sb3JGaWx0ZXIgY29sb3JGaWx0ZXIgPSBuZXcgUG9ydGVyRHVmZkNvbG9yRmlsdGVyKENvbG9yLkJMVUUsCisgICAgICAgICAgICAgICAgUG9ydGVyRHVmZi5Nb2RlLlNSQ19PVkVSKTsKKyAgICAgICAgd3JhcHBlci5zZXRDb2xvckZpbHRlcihjb2xvckZpbHRlcik7CisgICAgICAgIENvbG9yRmlsdGVyIG9idGFpbmVkQ29sb3JGaWx0ZXIgPSB3cmFwcGVyLmdldENvbG9yRmlsdGVyKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiQ29sb3IgZmlsdGVycyBhcmUgbm90IHByb3Blcmx5IHJldHVybmVkIiwgY29sb3JGaWx0ZXIsIG9idGFpbmVkQ29sb3JGaWx0ZXIpOworICAgIH0KKwogICAgIEBUZXN0KGV4cGVjdGVkPU51bGxQb2ludGVyRXhjZXB0aW9uLmNsYXNzKQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRQYWRkaW5nTnVsbCgpIHsKICAgICAgICAgRHJhd2FibGVXcmFwcGVyIHdyYXBwZXIgPSBuZXcgTXlXcmFwcGVyKG5ldyBDb2xvckRyYXdhYmxlKENvbG9yLlJFRCkpOwpAQCAtMzc2LDYgKzM5MCw3IEBACiAgICAgLy8gb2YgdGhlIGJhc2UgYWJzdHJhY3QgbWV0aG9kcy4KICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNb2NrRHJhd2FibGUgZXh0ZW5kcyBEcmF3YWJsZSB7CiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtQ2FsbGVkT25MZXZlbENoYW5nZSA9IGZhbHNlOworICAgICAgICBwcml2YXRlIENvbG9yRmlsdGVyIG1Db2xvckZpbHRlcjsKIAogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgZHJhdyhDYW52YXMgY2FudmFzKSB7CkBAIC0zOTIsNiArNDA3LDEyIEBACiAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIHNldENvbG9yRmlsdGVyKENvbG9yRmlsdGVyIGNmKSB7CisgICAgICAgICAgICBtQ29sb3JGaWx0ZXIgPSBjZjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ29sb3JGaWx0ZXIgZ2V0Q29sb3JGaWx0ZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gbUNvbG9yRmlsdGVyOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9jdHMvRHJhd2FibGVfQ29uc3RhbnRTdGF0ZVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL2N0cy9EcmF3YWJsZV9Db25zdGFudFN0YXRlVGVzdC5qYXZhCmluZGV4IGFiY2I3MWYuLmRiZjk2ZWYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL2N0cy9EcmF3YWJsZV9Db25zdGFudFN0YXRlVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL2N0cy9EcmF3YWJsZV9Db25zdGFudFN0YXRlVGVzdC5qYXZhCkBAIC0yNyw5ICsyNywxMCBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZS5Db25zdGFudFN0YXRlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiAKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9jdHMvR3JhZGllbnREcmF3YWJsZVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL2N0cy9HcmFkaWVudERyYXdhYmxlVGVzdC5qYXZhCmluZGV4IGI3OThmYjguLjk2MTVlMjcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL2N0cy9HcmFkaWVudERyYXdhYmxlVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL2N0cy9HcmFkaWVudERyYXdhYmxlVGVzdC5qYXZhCkBAIC0zNiwxMyArMzYsMTMgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlLkNvbnN0YW50U3RhdGU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5HcmFkaWVudERyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuR3JhZGllbnREcmF3YWJsZS5PcmllbnRhdGlvbjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKQEAgLTk4LDEwICs5OCwyMCBAQAogICAgICAgICAgICAgICAgIFBpeGVsRm9ybWF0Lk9QQVFVRSwgZ3JhZGllbnREcmF3YWJsZS5nZXRPcGFjaXR5KCkpOwogCiAgICAgICAgIGdyYWRpZW50RHJhd2FibGUuc2V0Q29ybmVyUmFkaXVzKDEwKTsKLSAgICAgICAgZ3JhZGllbnREcmF3YWJsZS5zZXRDb2xvcihDb2xvci5SRUQpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIlJFRCB3aXRoIGNvcm5lciByYWRpdXMgaXMgVFJBTlNMVUNFTlQiLAogICAgICAgICAgICAgICAgIFBpeGVsRm9ybWF0LlRSQU5TTFVDRU5ULCBncmFkaWVudERyYXdhYmxlLmdldE9wYWNpdHkoKSk7CiAKKyAgICAgICAgZ3JhZGllbnREcmF3YWJsZS5zZXRDb3JuZXJSYWRpdXMoMCk7CisgICAgICAgIGFzc2VydEVxdWFscygiUkVEIHdpdGggbm8gY29ybmVyIHJhZGl1cyBpcyBPUEFRVUUiLAorICAgICAgICAgICAgICAgIFBpeGVsRm9ybWF0Lk9QQVFVRSwgZ3JhZGllbnREcmF3YWJsZS5nZXRPcGFjaXR5KCkpOworCisgICAgICAgIGdyYWRpZW50RHJhd2FibGUuc2V0Q29ybmVyUmFkaWkobmV3IGZsb2F0W10geyAyLCAyLCAwLCAwLCAwLCAwLCAwLCAwfSk7CisgICAgICAgIGFzc2VydEVxdWFscygiUkVEIHdpdGggY29ybmVyIHJhZGlpIGlzIFRSQU5TTFVDRU5UIiwKKyAgICAgICAgICAgICAgICBQaXhlbEZvcm1hdC5UUkFOU0xVQ0VOVCwgZ3JhZGllbnREcmF3YWJsZS5nZXRPcGFjaXR5KCkpOworCisgICAgICAgIGdyYWRpZW50RHJhd2FibGUuc2V0Q29ybmVyUmFkaWkobnVsbCk7CisgICAgICAgIGFzc2VydEVxdWFscygiUkVEIHdpdGggbm8gY29ybmVyIHJhZGlpIGlzIE9QQVFVRSIsCisgICAgICAgICAgICAgICAgUGl4ZWxGb3JtYXQuT1BBUVVFLCBncmFkaWVudERyYXdhYmxlLmdldE9wYWNpdHkoKSk7CiAgICAgfQogCiAgICAgQFRlc3QKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL2N0cy9JY29uVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL0ljb25UZXN0LmphdmEKaW5kZXggZTU4YjQwMi4uNzQ1YWVjYSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL0ljb25UZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL0ljb25UZXN0LmphdmEKQEAgLTE2LDYgKzE2LDcgQEAKIAogcGFja2FnZSBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLmN0czsKIAoraW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1hdGNoZXJzLmFueTsKQEAgLTM1LDkgKzM2LDEwIEBACiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CkBAIC0xMzIsNiArMTM0LDUyIEBACiAgICAgICAgIHZlcmlmeShtb2NrUnVubmFibGUsIHRpbWVzKDEpKS5ydW4oKTsKICAgICB9CiAKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCaXRtYXBJY29uX2dldFR5cGUoKSB7CisgICAgICAgIEljb24gaWNvbiA9IEljb24uY3JlYXRlV2l0aEJpdG1hcChCaXRtYXAuY3JlYXRlQml0bWFwKDE2LCAxNiwgQml0bWFwLkNvbmZpZy5BUkdCXzg4ODgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEljb24uVFlQRV9CSVRNQVAsIGljb24uZ2V0VHlwZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REYXRhSWNvbl9nZXRUeXBlKCkgeworICAgICAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlWzRdOworICAgICAgICBkYXRhWzBdID0gZGF0YVsxXSA9IGRhdGFbMl0gPSBkYXRhWzNdID0gKGJ5dGUpIDI1NTsKKyAgICAgICAgSWNvbiBpY29uID0gSWNvbi5jcmVhdGVXaXRoRGF0YShkYXRhLCAwLCA0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEljb24uVFlQRV9EQVRBLCBpY29uLmdldFR5cGUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZUljb25fZ2V0VHlwZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKG1BY3Rpdml0eS5nZXRGaWxlc0RpcigpLCAidGVzdGltYWdlLmpwZyIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgd3JpdGVTYW1wbGVJbWFnZShmaWxlKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZmlsZS5leGlzdHMoKSk7CisgICAgICAgICAgICBTdHJpbmcgZmlsZVBhdGggPSBmaWxlLnRvVVJJKCkuZ2V0UGF0aCgpOworCisgICAgICAgICAgICBJY29uIGljb24gPSBJY29uLmNyZWF0ZVdpdGhGaWxlUGF0aChmaWxlLmdldFBhdGgoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoSWNvbi5UWVBFX1VSSSwgaWNvbi5nZXRUeXBlKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGZpbGVQYXRoLCBpY29uLmdldFVyaSgpLmdldFBhdGgoKSk7CisKKyAgICAgICAgICAgIGljb24gPSBJY29uLmNyZWF0ZVdpdGhDb250ZW50VXJpKFVyaS5mcm9tRmlsZShmaWxlKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoSWNvbi5UWVBFX1VSSSwgaWNvbi5nZXRUeXBlKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGZpbGVQYXRoLCBpY29uLmdldFVyaSgpLmdldFBhdGgoKSk7CisKKyAgICAgICAgICAgIGljb24gPSBJY29uLmNyZWF0ZVdpdGhDb250ZW50VXJpKGZpbGUudG9VUkkoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhJY29uLlRZUEVfVVJJLCBpY29uLmdldFR5cGUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZmlsZVBhdGgsIGljb24uZ2V0VXJpKCkuZ2V0UGF0aCgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGZpbGUuZGVsZXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUljb25fZ2V0VHlwZSgpIHsKKyAgICAgICAgSWNvbiBpY29uID0gSWNvbi5jcmVhdGVXaXRoUmVzb3VyY2UoImNvbS5hbmRyb2lkLmN0cy50ZXN0cGtnIiwgUi5kcmF3YWJsZS5ibXBfdGVzdCk7CisgICAgICAgIGFzc2VydEVxdWFscyhJY29uLlRZUEVfUkVTT1VSQ0UsIGljb24uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uYW5kcm9pZC5jdHMudGVzdHBrZyIsIGljb24uZ2V0UmVzUGFja2FnZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFIuZHJhd2FibGUuYm1wX3Rlc3QsIGljb24uZ2V0UmVzSWQoKSk7CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlU2FtcGxlSW1hZ2UoRmlsZSBpbWFnZWZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gc291cmNlID0gbUFjdGl2aXR5LmdldFJlc291cmNlcygpLm9wZW5SYXdSZXNvdXJjZShSLmRyYXdhYmxlLnRlc3RpbWFnZSk7CiAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIHRhcmdldCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGltYWdlZmlsZSkpIHsKQEAgLTE2MSw1ICsyMDksNyBAQAogCiAgICAgICAgIC8vIGxvYWRpbmcgZHJhd2FibGUgc3luY2hyb25vdXNseS4KICAgICAgICAgYXNzZXJ0Tm90TnVsbChpY29uLmxvYWREcmF3YWJsZShtQWN0aXZpdHkpKTsKKworICAgICAgICBwYXJjZWwucmVjeWNsZSgpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL2N0cy9JbnNldERyYXdhYmxlVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL0luc2V0RHJhd2FibGVUZXN0LmphdmEKaW5kZXggYjFjMWYwMy4uMTdiNTY0YSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL0luc2V0RHJhd2FibGVUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL0luc2V0RHJhd2FibGVUZXN0LmphdmEKQEAgLTI2LDI1ICsyNiwyMyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzLlRoZW1lOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuWG1sUmVzb3VyY2VQYXJzZXI7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAuQ29uZmlnOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3JGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QaXhlbEZvcm1hdDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5jdHMuUjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQml0bWFwRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZS5Db25zdGFudFN0YXRlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuSW5zZXREcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5TdGF0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOwogaW1wb3J0IGFuZHJvaWQudmlldy5JbmZsYXRlRXhjZXB0aW9uOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL2N0cy9MYXllckRyYXdhYmxlVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL0xheWVyRHJhd2FibGVUZXN0LmphdmEKaW5kZXggNDMzMWFiYS4uYmE4NDFjNyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL0xheWVyRHJhd2FibGVUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL0xheWVyRHJhd2FibGVUZXN0LmphdmEKQEAgLTYxLDE1ICs2MSwxNiBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuUm90YXRlRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5TaGFwZURyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU3RhdGVMaXN0RHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU3RhdGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlhtbDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9jdHMvTGV2ZWxMaXN0RHJhd2FibGVUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9jdHMvTGV2ZWxMaXN0RHJhd2FibGVUZXN0LmphdmEKaW5kZXggOWJjNDIzYi4uNjAyYmVhNiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL0xldmVsTGlzdERyYXdhYmxlVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL2N0cy9MZXZlbExpc3REcmF3YWJsZVRlc3QuamF2YQpAQCAtMzAsMTEgKzMwLDEyIEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5Db2xvckRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGVDb250YWluZXIuRHJhd2FibGVDb250YWluZXJTdGF0ZTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkxldmVsTGlzdERyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5YbWw7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL05pbmVQYXRjaERyYXdhYmxlVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL05pbmVQYXRjaERyYXdhYmxlVGVzdC5qYXZhCmluZGV4IDI3NjA5NDAuLjc5MDUyZjggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL2N0cy9OaW5lUGF0Y2hEcmF3YWJsZVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9jdHMvTmluZVBhdGNoRHJhd2FibGVUZXN0LmphdmEKQEAgLTQ0LDEzICs0NCwxNCBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZS5Db25zdGFudFN0YXRlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuTmluZVBhdGNoRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlhtbDsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuSWdub3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL1BhaW50RHJhd2FibGVUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9jdHMvUGFpbnREcmF3YWJsZVRlc3QuamF2YQppbmRleCAzMGEwN2Y3Li45ZTlkMjhjIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9jdHMvUGFpbnREcmF3YWJsZVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9jdHMvUGFpbnREcmF3YWJsZVRlc3QuamF2YQpAQCAtMjgsMTIgKzI4LDEzIEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5jdHMuUjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLlBhaW50RHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5zaGFwZXMuUm91bmRSZWN0U2hhcGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL2N0cy9QaWN0dXJlRHJhd2FibGVUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9jdHMvUGljdHVyZURyYXdhYmxlVGVzdC5qYXZhCmluZGV4IDVhZWQ5NWMuLjExNDJjMjAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL2N0cy9QaWN0dXJlRHJhd2FibGVUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL1BpY3R1cmVEcmF3YWJsZVRlc3QuamF2YQpAQCAtMjYsOCArMjYsOSBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGljdHVyZTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBpeGVsRm9ybWF0OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuUGljdHVyZURyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL1JpcHBsZURyYXdhYmxlVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL1JpcHBsZURyYXdhYmxlVGVzdC5qYXZhCmluZGV4IDRmNmJmNmQuLjMwYWZhZjkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL2N0cy9SaXBwbGVEcmF3YWJsZVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9jdHMvUmlwcGxlRHJhd2FibGVUZXN0LmphdmEKQEAgLTMxLDExICszMSwxMiBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZS5Db25zdGFudFN0YXRlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuUmlwcGxlRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlhtbDsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9jdHMvUm90YXRlRHJhd2FibGVUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9jdHMvUm90YXRlRHJhd2FibGVUZXN0LmphdmEKaW5kZXggMDA4NDRmOS4uMjgyY2NiNiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL1JvdGF0ZURyYXdhYmxlVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL2N0cy9Sb3RhdGVEcmF3YWJsZVRlc3QuamF2YQpAQCAtNDMsMTIgKzQzLDEzIEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlLkNvbnN0YW50U3RhdGU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5Sb3RhdGVEcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5YbWw7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL1NjYWxlRHJhd2FibGVUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9jdHMvU2NhbGVEcmF3YWJsZVRlc3QuamF2YQppbmRleCBhZDFmZTA5Li4zZDdkZWE0IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9jdHMvU2NhbGVEcmF3YWJsZVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9jdHMvU2NhbGVEcmF3YWJsZVRlc3QuamF2YQpAQCAtNDgsMTMgKzQ4LDE0IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlLkNvbnN0YW50U3RhdGU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5TY2FsZURyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlN0YXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL2N0cy9TaGFwZURyYXdhYmxlVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL1NoYXBlRHJhd2FibGVUZXN0LmphdmEKaW5kZXggZDU2MzEwMi4uN2Y0NWZiMCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL1NoYXBlRHJhd2FibGVUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL1NoYXBlRHJhd2FibGVUZXN0LmphdmEKQEAgLTQ2LDEyICs0NiwxMyBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuc2hhcGVzLk92YWxTaGFwZTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLnNoYXBlcy5SZWN0U2hhcGU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5zaGFwZXMuU2hhcGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiBpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL2N0cy9TaGFwZURyYXdhYmxlX1NoYWRlckZhY3RvcnlUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9jdHMvU2hhcGVEcmF3YWJsZV9TaGFkZXJGYWN0b3J5VGVzdC5qYXZhCmluZGV4IDdiMTcwZWQuLmE3MWVjYmUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL2N0cy9TaGFwZURyYXdhYmxlX1NoYWRlckZhY3RvcnlUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL1NoYXBlRHJhd2FibGVfU2hhZGVyRmFjdG9yeVRlc3QuamF2YQpAQCAtMjAsOCArMjAsOSBAQAogCiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5TaGFkZXI7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5TaGFwZURyYXdhYmxlLlNoYWRlckZhY3Rvcnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiAKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9jdHMvU3RhdGVMaXN0RHJhd2FibGVUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9jdHMvU3RhdGVMaXN0RHJhd2FibGVUZXN0LmphdmEKaW5kZXggNjQ5OTU5NC4uOTkxY2ZlNiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL1N0YXRlTGlzdERyYXdhYmxlVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL2N0cy9TdGF0ZUxpc3REcmF3YWJsZVRlc3QuamF2YQpAQCAtMzMsMTIgKzMzLDEzIEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZS5Db25zdGFudFN0YXRlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGVDb250YWluZXIuRHJhd2FibGVDb250YWluZXJTdGF0ZTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLlN0YXRlTGlzdERyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5TdGF0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKQEAgLTIyNSwyNSArMjI2LDI4IEBACiAgICAgICAgICAgICBvcmlnV2lkdGgxID0gdGVtcFdpZHRoMTsKICAgICAgICAgfQogCisgICAgICAgIC8vIE5PVEU6IGluc3RyaW5zaWMgVy9IIG1heSBhbHJlYWR5IGJlIGEgc2NhbGVkIGFuZCB0cnVuY2F0ZWQgdmFsdWUgY29tcHV0ZWQgZnJvbSB0aGUKKyAgICAgICAgLy8gdW5kZXJseWluZyBhc3NldCAoZS5nLiBiaXRtYXApIHNvIGFjY291bnQgZm9yIHRoaXMgcHJldmlvdXNseSBhcHBsaWVkIHNjYWxpbmcvdHJ1bmNhdGlvbgorICAgICAgICAvLyBieSBhcHBseWluZyBhIHNtYWxsIGRlbHRhIHRvIHRoZSBhc3NlcnRzLgorCiAgICAgICAgIC8vIFNldCBkZW5zaXR5IHRvIGhhbGYgb2Ygb3JpZ2luYWwuCiAgICAgICAgIERyYXdhYmxlVGVzdFV0aWxzLnNldFJlc291cmNlc0RlbnNpdHkocmVzLCBkZW5zaXR5RHBpIC8gMik7CiAgICAgICAgIGZpbmFsIFN0YXRlTGlzdERyYXdhYmxlIGhhbGZEcmF3YWJsZSA9CiAgICAgICAgICAgICAgICAgKFN0YXRlTGlzdERyYXdhYmxlKSBwcmVsb2FkZWRDb25zdGFudFN0YXRlLm5ld0RyYXdhYmxlKHJlcyk7Ci0gICAgICAgIC8vIE5PVEU6IGRlbnNpdHlEcGkgbWF5IG5vdCBiZSBhbiBldmVuIG51bWJlciwgc28gYWNjb3VudCBmb3IgKmFjdHVhbCogc2NhbGluZyBpbiBhc3NlcnRzCi0gICAgICAgIGZpbmFsIGZsb2F0IGFwcHJveEhhbGYgPSAoZmxvYXQpKGRlbnNpdHlEcGkgLyAyKSAvIGRlbnNpdHlEcGk7CiAgICAgICAgIGhhbGZEcmF3YWJsZS5zZWxlY3REcmF3YWJsZSgwKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKE1hdGgucm91bmQob3JpZ1dpZHRoMCAqIGFwcHJveEhhbGYpLCBoYWxmRHJhd2FibGUuZ2V0SW50cmluc2ljV2lkdGgoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNYXRoLnJvdW5kKG9yaWdXaWR0aDAgKiAwLjVmKSwgaGFsZkRyYXdhYmxlLmdldEludHJpbnNpY1dpZHRoKCksIDEpOwogICAgICAgICBoYWxmRHJhd2FibGUuc2VsZWN0RHJhd2FibGUoMSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhNYXRoLnJvdW5kKG9yaWdXaWR0aDEgKiBhcHByb3hIYWxmKSwgaGFsZkRyYXdhYmxlLmdldEludHJpbnNpY1dpZHRoKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWF0aC5yb3VuZChvcmlnV2lkdGgxICogMC41ZiksIGhhbGZEcmF3YWJsZS5nZXRJbnRyaW5zaWNXaWR0aCgpLCAxKTsKIAogICAgICAgICAvLyBTZXQgZGVuc2l0eSB0byBkb3VibGUgb3JpZ2luYWwuCisgICAgICAgIC8vIE5PVEU6IGRlbnNpdHlEcGkgbWF5IG5vdCBiZSBhbiBldmVuIG51bWJlciwgc28gYWNjb3VudCBmb3IgKmFjdHVhbCogc2NhbGluZyBpbiBhc3NlcnRzCiAgICAgICAgIERyYXdhYmxlVGVzdFV0aWxzLnNldFJlc291cmNlc0RlbnNpdHkocmVzLCBkZW5zaXR5RHBpICogMik7CiAgICAgICAgIGZpbmFsIFN0YXRlTGlzdERyYXdhYmxlIGRvdWJsZURyYXdhYmxlID0KICAgICAgICAgICAgICAgICAoU3RhdGVMaXN0RHJhd2FibGUpIHByZWxvYWRlZENvbnN0YW50U3RhdGUubmV3RHJhd2FibGUocmVzKTsKICAgICAgICAgZG91YmxlRHJhd2FibGUuc2VsZWN0RHJhd2FibGUoMCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhvcmlnV2lkdGgwICogMiwgZG91YmxlRHJhd2FibGUuZ2V0SW50cmluc2ljV2lkdGgoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhvcmlnV2lkdGgwICogMiwgZG91YmxlRHJhd2FibGUuZ2V0SW50cmluc2ljV2lkdGgoKSwgMSk7CiAgICAgICAgIGRvdWJsZURyYXdhYmxlLnNlbGVjdERyYXdhYmxlKDEpOwotICAgICAgICBhc3NlcnRFcXVhbHMob3JpZ1dpZHRoMSAqIDIsIGRvdWJsZURyYXdhYmxlLmdldEludHJpbnNpY1dpZHRoKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMob3JpZ1dpZHRoMSAqIDIsIGRvdWJsZURyYXdhYmxlLmdldEludHJpbnNpY1dpZHRoKCksIDEpOwogCiAgICAgICAgIC8vIFJlc3RvcmUgb3JpZ2luYWwgY29uZmlndXJhdGlvbiBhbmQgbWV0cmljcy4KICAgICAgICAgRHJhd2FibGVUZXN0VXRpbHMuc2V0UmVzb3VyY2VzRGVuc2l0eShyZXMsIGRlbnNpdHlEcGkpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL1RoZW1lZERyYXdhYmxlVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL1RoZW1lZERyYXdhYmxlVGVzdC5qYXZhCmluZGV4IDFhM2Y3NzQuLmIwNTY3MWQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL2N0cy9UaGVtZWREcmF3YWJsZVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9jdHMvVGhlbWVkRHJhd2FibGVUZXN0LmphdmEKQEAgLTMzLDExICszMywxMiBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuTGF5ZXJEcmF3YWJsZTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLk5pbmVQYXRjaERyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuUmlwcGxlRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL1RyYW5zaXRpb25EcmF3YWJsZVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL2N0cy9UcmFuc2l0aW9uRHJhd2FibGVUZXN0LmphdmEKaW5kZXggNGJiMzdjMy4uMzUxOWQxMSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL1RyYW5zaXRpb25EcmF3YWJsZVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9jdHMvVHJhbnNpdGlvbkRyYXdhYmxlVGVzdC5qYXZhCkBAIC0zNSw5ICszNSwxMCBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuY3RzLlI7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLlRyYW5zaXRpb25EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLkxhcmdlVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLkxhcmdlVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL2N0cy9WZWN0b3JEcmF3YWJsZVNjYWxlVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL1ZlY3RvckRyYXdhYmxlU2NhbGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNWZiMTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL1ZlY3RvckRyYXdhYmxlU2NhbGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5jdHM7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuY3RzLlI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuUGl4ZWxDb3B5OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuU3luY2hyb25vdXNQaXhlbENvcHk7Ci1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5XaWRnZXRUZXN0VXRpbHM7Ci0KLWltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlJ1bGU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLUBNZWRpdW1UZXN0Ci1wdWJsaWMgY2xhc3MgVmVjdG9yRHJhd2FibGVTY2FsZVRlc3QgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHX1NDUkVFTlNIT1QgPSBmYWxzZTsKLSAgICBAUnVsZQotICAgIHB1YmxpYyBmaW5hbCBBY3Rpdml0eVRlc3RSdWxlPERyYXdhYmxlU3R1YkFjdGl2aXR5PiBtQWN0aXZpdHlSdWxlID0KLSAgICAgICAgICAgIG5ldyBBY3Rpdml0eVRlc3RSdWxlPD4oRHJhd2FibGVTdHViQWN0aXZpdHkuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBBY3Rpdml0eSBtQWN0aXZpdHkgPSBudWxsOwotICAgIHByaXZhdGUgUmVzb3VyY2VzIG1SZXNvdXJjZXMgPSBudWxsOwotCi0gICAgcHVibGljIFZlY3RvckRyYXdhYmxlU2NhbGVUZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgfQotCi0gICAgQEJlZm9yZQotICAgIHB1YmxpYyB2b2lkIHNldHVwKCkgewotICAgICAgICBtQWN0aXZpdHkgPSBtQWN0aXZpdHlSdWxlLmdldEFjdGl2aXR5KCk7Ci0gICAgICAgIG1SZXNvdXJjZXMgPSBtQWN0aXZpdHkuZ2V0UmVzb3VyY2VzKCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmVjdG9yRHJhd2FibGVJbkltYWdlVmlldygpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBtQWN0aXZpdHlSdWxlLnJ1bk9uVWlUaHJlYWQoKCkgLT4gewotICAgICAgICAgICAgbUFjdGl2aXR5LnNldENvbnRlbnRWaWV3KFIubGF5b3V0LnZlY3Rvcl9kcmF3YWJsZV9zY2FsZV9sYXlvdXQpOwotICAgICAgICB9KTsKLQotICAgICAgICBCaXRtYXAgc2NyZWVuU2hvdCA9IG51bGw7Ci0gICAgICAgIFdpZGdldFRlc3RVdGlscy5ydW5Pbk1haW5BbmREcmF3U3luYyhtQWN0aXZpdHlSdWxlLAotICAgICAgICAgICAgICAgIG1BY3Rpdml0eS5maW5kVmlld0J5SWQoUi5pZC5zY2FsZXRlc3QpLAotICAgICAgICAgICAgICAgICgpIC0+IHNldHVwSW1hZ2VWaWV3cygpKTsKLSAgICAgICAgZmluYWwgUmVjdCBzcmNSZWN0ID0gbmV3IFJlY3QoKTsKLSAgICAgICAgbUFjdGl2aXR5UnVsZS5ydW5PblVpVGhyZWFkKCgpIC0+IHsKLSAgICAgICAgICAgIG1BY3Rpdml0eS5maW5kVmlld0J5SWQoUi5pZC5pbWFnZXZpZXcxKS5nZXRHbG9iYWxWaXNpYmxlUmVjdChzcmNSZWN0KTsKLSAgICAgICAgfSk7Ci0KLSAgICAgICAgc2NyZWVuU2hvdCA9IHRha2VTY3JlZW5zaG90KHNyY1JlY3QpOwotICAgICAgICBpZiAoREJHX1NDUkVFTlNIT1QpIHsKLSAgICAgICAgICAgIFN0cmluZyBvdXRwdXRGb2xkZXIgPSBtQWN0aXZpdHkuZ2V0RXh0ZXJuYWxGaWxlc0RpcihudWxsKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgICAgIERyYXdhYmxlVGVzdFV0aWxzLnNhdmVWZWN0b3JEcmF3YWJsZUludG9QTkcoc2NyZWVuU2hvdCwgb3V0cHV0Rm9sZGVyLCAic2NhbGUiKTsKLSAgICAgICAgfQotCi0gICAgICAgIEJpdG1hcCBnb2xkZW4gPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKG1SZXNvdXJjZXMsCi0gICAgICAgICAgICAgICAgUi5kcmF3YWJsZS52ZWN0b3JfZHJhd2FibGVfc2NhbGVfZ29sZGVuKTsKLSAgICAgICAgRHJhd2FibGVUZXN0VXRpbHMuY29tcGFyZUltYWdlcygidmVjdG9yRHJhd2FibGVTY2FsZSIsIHNjcmVlblNob3QsIGdvbGRlbiwKLSAgICAgICAgICAgICAgICBEcmF3YWJsZVRlc3RVdGlscy5QSVhFTF9FUlJPUl9USFJFU0hPTEQsCi0gICAgICAgICAgICAgICAgRHJhd2FibGVUZXN0VXRpbHMuUElYRUxfRVJST1JfQ09VTlRfVEhSRVNIT0xELAotICAgICAgICAgICAgICAgIERyYXdhYmxlVGVzdFV0aWxzLlBJWEVMX0VSUk9SX1RPTEVSQU5DRSk7Ci0gICAgfQotCi0gICAgLy8gU2V0dXAgMiBpbWFnZXZpZXdzLCBvbmUgYmlnIGFuZCBvbmUgc21hbGwuIFRoZSBwdXJwb3NlIG9mIHRoaXMgdGVzdCBpcyB0byBtYWtlIHN1cmUgdGhhdCB0aGUKLSAgICAvLyBpbWFnZXZpZXcgd2l0aCBzbWFsbGVyIHNjYWxlIHdpbGwgbm90IGFmZmVjdCB0aGUgYXBwZWFyYW5jZSBpbiB0aGUgaW1hZ2V2aWV3IHdpdGggbGFyZ2VyCi0gICAgLy8gc2NhbGUuCi0gICAgcHJpdmF0ZSB2b2lkIHNldHVwSW1hZ2VWaWV3cygpIHsKLSAgICAgICAgSW1hZ2VWaWV3IGltYWdlVmlldyA9IChJbWFnZVZpZXcpIG1BY3Rpdml0eS5maW5kVmlld0J5SWQoUi5pZC5pbWFnZXZpZXcxKTsKLSAgICAgICAgaW1hZ2VWaWV3LnNldEltYWdlUmVzb3VyY2UoUi5kcmF3YWJsZS52ZWN0b3JfaWNvbl9jcmVhdGUpOwotICAgICAgICBpbWFnZVZpZXcgPSAoSW1hZ2VWaWV3KSBtQWN0aXZpdHkuZmluZFZpZXdCeUlkKFIuaWQuaW1hZ2V2aWV3Mik7Ci0gICAgICAgIGltYWdlVmlldy5zZXRJbWFnZVJlc291cmNlKFIuZHJhd2FibGUudmVjdG9yX2ljb25fY3JlYXRlKTsKLSAgICB9Ci0KLSAgICAvLyBDb3B5IHRoZSBzb3VyY2UgcmVjdGFuZ2xlIGZyb20gdGhlIHNjcmVlbiBpbnRvIHRoZSByZXR1cm5lZCBiaXRtYXAuCi0gICAgcHJpdmF0ZSBCaXRtYXAgdGFrZVNjcmVlbnNob3QoUmVjdCBzcmNSZWN0KSB7Ci0gICAgICAgIFN5bmNocm9ub3VzUGl4ZWxDb3B5IGNvcHkgPSBuZXcgU3luY2hyb25vdXNQaXhlbENvcHkoKTsKLSAgICAgICAgQml0bWFwIGRlc3QgPSBCaXRtYXAuY3JlYXRlQml0bWFwKAotICAgICAgICAgICAgICAgIHNyY1JlY3Qud2lkdGgoKSwgc3JjUmVjdC5oZWlnaHQoKSwgQml0bWFwLkNvbmZpZy5BUkdCXzg4ODgpOwotICAgICAgICBpbnQgY29weVJlc3VsdCA9IGNvcHkucmVxdWVzdChtQWN0aXZpdHkuZ2V0V2luZG93KCksIHNyY1JlY3QsIGRlc3QpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFBpeGVsQ29weS5TVUNDRVNTLCBjb3B5UmVzdWx0KTsKLSAgICAgICAgcmV0dXJuIGRlc3Q7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL1ZlY3RvckRyYXdhYmxlU2l6ZVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL2N0cy9WZWN0b3JEcmF3YWJsZVNpemVUZXN0LmphdmEKaW5kZXggZGVmYThjNi4uMDNkZGY4NCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL1ZlY3RvckRyYXdhYmxlU2l6ZVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9jdHMvVmVjdG9yRHJhd2FibGVTaXplVGVzdC5qYXZhCkBAIC0yMiw4ICsyMiw5IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5jdHMuUjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLlZlY3RvckRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CiAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL1ZlY3RvckRyYXdhYmxlVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvY3RzL1ZlY3RvckRyYXdhYmxlVGVzdC5qYXZhCmluZGV4IGMwOWExMzkuLjMwY2QwNjAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL2N0cy9WZWN0b3JEcmF3YWJsZVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9jdHMvVmVjdG9yRHJhd2FibGVUZXN0LmphdmEKQEAgLTMzLDIyICszMywyMCBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuY3RzLlI7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZS5Db25zdGFudFN0YXRlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuVmVjdG9yRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uTnVsbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5YbWw7CiAKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiBpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKIGltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOwogCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogCiBAU21hbGxUZXN0CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9zaGFwZXMvY3RzL0FyY1NoYXBlVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvc2hhcGVzL2N0cy9BcmNTaGFwZVRlc3QuamF2YQppbmRleCBkOTZhYWJiLi5mNTk4NGUzIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9zaGFwZXMvY3RzL0FyY1NoYXBlVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL3NoYXBlcy9jdHMvQXJjU2hhcGVUZXN0LmphdmEKQEAgLTI3LDggKzI3LDkgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQuU3R5bGU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5zaGFwZXMuQXJjU2hhcGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiAKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9zaGFwZXMvY3RzL092YWxTaGFwZVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL3NoYXBlcy9jdHMvT3ZhbFNoYXBlVGVzdC5qYXZhCmluZGV4IGE4MzI1MWUuLjAzMWNmODAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL3NoYXBlcy9jdHMvT3ZhbFNoYXBlVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL3NoYXBlcy9jdHMvT3ZhbFNoYXBlVGVzdC5qYXZhCkBAIC0yOSw4ICsyOSw5IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludC5TdHlsZTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5zaGFwZXMuT3ZhbFNoYXBlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvc2hhcGVzL2N0cy9QYXRoU2hhcGVUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9zaGFwZXMvY3RzL1BhdGhTaGFwZVRlc3QuamF2YQppbmRleCBiNzMzNWUzLi5lODkwMTA4IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9zaGFwZXMvY3RzL1BhdGhTaGFwZVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9zaGFwZXMvY3RzL1BhdGhTaGFwZVRlc3QuamF2YQpAQCAtMjgsOCArMjgsOSBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQuU3R5bGU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYXRoOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuc2hhcGVzLlBhdGhTaGFwZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL3NoYXBlcy9jdHMvUmVjdFNoYXBlVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvc2hhcGVzL2N0cy9SZWN0U2hhcGVUZXN0LmphdmEKaW5kZXggNGNkNmUxNS4uNzE2MmY2ZCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvc2hhcGVzL2N0cy9SZWN0U2hhcGVUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvc2hhcGVzL2N0cy9SZWN0U2hhcGVUZXN0LmphdmEKQEAgLTMwLDggKzMwLDkgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0RjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLnNoYXBlcy5SZWN0U2hhcGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiAKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9zaGFwZXMvY3RzL1JvdW5kUmVjdFNoYXBlVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvc2hhcGVzL2N0cy9Sb3VuZFJlY3RTaGFwZVRlc3QuamF2YQppbmRleCAwZGIwZjVkLi40NGNhZTdiIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9zaGFwZXMvY3RzL1JvdW5kUmVjdFNoYXBlVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL3NoYXBlcy9jdHMvUm91bmRSZWN0U2hhcGVUZXN0LmphdmEKQEAgLTMwLDggKzMwLDkgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0RjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLnNoYXBlcy5Sb3VuZFJlY3RTaGFwZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL3NoYXBlcy9jdHMvU2hhcGVUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9ncmFwaGljcy9zcmMvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9zaGFwZXMvY3RzL1NoYXBlVGVzdC5qYXZhCmluZGV4IGQ1ZDE2YzMuLjIzZmFjOGIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL3NoYXBlcy9jdHMvU2hhcGVUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvZ3JhcGhpY3Mvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvc2hhcGVzL2N0cy9TaGFwZVRlc3QuamF2YQpAQCAtMjgsOCArMjgsOSBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludC5TdHlsZTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLnNoYXBlcy5TaGFwZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2hhcmR3YXJlL0FuZHJvaWQubWsgYi90ZXN0cy90ZXN0cy9oYXJkd2FyZS9BbmRyb2lkLm1rCmluZGV4IDNhZGY4MTEuLjJmZGQ0YTcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2hhcmR3YXJlL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvdGVzdHMvaGFyZHdhcmUvQW5kcm9pZC5tawpAQCAtMjYsMjIgKzI2LDIyIEBACiAKIExPQ0FMX01VTFRJTElCIDo9IGJvdGgKIAotTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lcgorTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lci5zdHVicyBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicwogCiBMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAotICAgIGFuZHJvaWQtc3VwcG9ydC10ZXN0IFwKLSAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsIFwKLSAgICBjdHN0ZXN0cnVubmVyIFwKKyAgICBhbmRyb2lkeC50ZXN0LnJ1bGVzIFwKKyAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBcCisgICAgY3RzdGVzdHJ1bm5lci1heHQgXAogICAgIG1vY2tpdG8tdGFyZ2V0LW1pbnVzLWp1bml0NCBcCiAgICAgcGxhdGZvcm0tdGVzdC1hbm5vdGF0aW9ucyBcCi0gICAgdWItdWlhdXRvbWF0b3IgXAotICAgIGxlZ2FjeS1hbmRyb2lkLXRlc3QKKyAgICB1Yi11aWF1dG9tYXRvcgogCiBMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdHNoYXJkd2FyZV9qbmkgbGlibmF0aXZlaGVscGVyX2NvbXBhdF9saWJjKysKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzSGFyZHdhcmVUZXN0Q2FzZXMKK0xPQ0FMX1BSSVZBVEVfUExBVEZPUk1fQVBJUyA6PSB0cnVlCiAKIGluY2x1ZGUgJChCVUlMRF9DVFNfUEFDS0FHRSkKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvaGFyZHdhcmUvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL2hhcmR3YXJlL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggN2E5OGEyYS4uN2NlMGNiZSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvaGFyZHdhcmUvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9oYXJkd2FyZS9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC04MCw3ICs4MCw3IEBACiAKICAgICA8L2FwcGxpY2F0aW9uPgogCi0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5oYXJkd2FyZS5jdHMiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgaGFyZHdhcmUgdGVzdHMiPgogICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0ibGlzdGVuZXIiCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9oYXJkd2FyZS9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy90ZXN0cy9oYXJkd2FyZS9BbmRyb2lkVGVzdC54bWwKaW5kZXggNmRiZGEzNy4uZjFmYTkyZCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvaGFyZHdhcmUvQW5kcm9pZFRlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL2hhcmR3YXJlL0FuZHJvaWRUZXN0LnhtbApAQCAtMTMsNiArMTMsNyBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIEhhcmR3YXJlIHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJtaXNjIiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRhcmdldHByZXAuTG9jYXRpb25DaGVjayIgLz4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2hhcmR3YXJlL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2Jpb21ldHJpY3MvY3RzL0Jpb21ldHJpY1Byb21wdFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2hhcmR3YXJlL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2Jpb21ldHJpY3MvY3RzL0Jpb21ldHJpY1Byb21wdFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjc5ZjQxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvaGFyZHdhcmUvc3JjL2FuZHJvaWQvaGFyZHdhcmUvYmlvbWV0cmljcy9jdHMvQmlvbWV0cmljUHJvbXB0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQuaGFyZHdhcmUuYmlvbWV0cmljcy5jdHM7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmJpb21ldHJpY3MuQmlvbWV0cmljUHJvbXB0OworaW1wb3J0IGFuZHJvaWQub3MuQ2FuY2VsbGF0aW9uU2lnbmFsOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUHJlc3VibWl0OworaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworLyoqCisgKiBCYXNpYyB0ZXN0IGNhc2VzIGZvciBCaW9tZXRyaWNQcm9tcHQKKyAqLworcHVibGljIGNsYXNzIEJpb21ldHJpY1Byb21wdFRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFXQUlUX1RJTUVPVVRfTVMgPSAzMDAwOworCisgICAgcHJpdmF0ZSBmaW5hbCBIYW5kbGVyIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoTG9vcGVyLmdldE1haW5Mb29wZXIoKSk7CisgICAgcHJpdmF0ZSBmaW5hbCBDb3VudERvd25MYXRjaCBtTGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisKKyAgICBwcml2YXRlIGludCBtRXJyb3JSZWNlaXZlZDsKKworICAgIHByaXZhdGUgZmluYWwgRXhlY3V0b3IgbUV4ZWN1dG9yID0gbmV3IEV4ZWN1dG9yKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZShSdW5uYWJsZSBydW5uYWJsZSkgeworICAgICAgICAgICAgbUhhbmRsZXIucG9zdChydW5uYWJsZSk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBmaW5hbCBCaW9tZXRyaWNQcm9tcHQuQXV0aGVudGljYXRpb25DYWxsYmFjayBtQXV0aGVudGljYXRpb25DYWxsYmFjaworICAgICAgICAgICAgPSBuZXcgQmlvbWV0cmljUHJvbXB0LkF1dGhlbnRpY2F0aW9uQ2FsbGJhY2soKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkF1dGhlbnRpY2F0aW9uRXJyb3IoaW50IGVycm9yQ29kZSwgQ2hhclNlcXVlbmNlIGVyclN0cmluZykgeworICAgICAgICAgICAgbUVycm9yUmVjZWl2ZWQgPSBlcnJvckNvZGU7CisgICAgICAgICAgICBtTGF0Y2guY291bnREb3duKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25BdXRoZW50aWNhdGlvbkhlbHAoaW50IGhlbHBDb2RlLCBDaGFyU2VxdWVuY2UgaGVscFN0cmluZykge30KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25BdXRoZW50aWNhdGlvbkZhaWxlZCgpIHt9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQXV0aGVudGljYXRpb25TdWNjZWVkZWQoQmlvbWV0cmljUHJvbXB0LkF1dGhlbnRpY2F0aW9uUmVzdWx0IHJlc3VsdCkge30KKyAgICB9OworCisgICAgLyoqCisgICAgICogVGVzdCB0aGF0IHdlIGNhbiB0cnkgdG8gc3RhcnQgZmluZ2VycHJpbnQgYXV0aGVudGljYXRpb24uIEl0IHdvbid0IGFjdHVhbGx5IHN0YXJ0IHNpbmNlCisgICAgICogdGhlcmUgYXJlIG5vIGZpbmdlcnMgZW5yb2xsZWQuIEN0cy12ZXJpZmllciB3aWxsIGNoZWNrIHRoZSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBAUHJlc3VibWl0CisgICAgcHVibGljIHZvaWQgdGVzdF9hdXRoZW50aWNhdGVfZmluZ2VycHJpbnQoKSB7CisgICAgICAgIGZpbmFsIFBhY2thZ2VNYW5hZ2VyIHBtID0gZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgIGlmICghcG0uaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX0ZJTkdFUlBSSU5UKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBleGNlcHRpb25UYWtlbiA9IGZhbHNlOworICAgICAgICBib29sZWFuIGNhbGxiYWNrUmVjZWl2ZWQgPSBmYWxzZTsKKyAgICAgICAgQ2FuY2VsbGF0aW9uU2lnbmFsIGNhbmNlbGxhdGlvblNpZ25hbCA9IG5ldyBDYW5jZWxsYXRpb25TaWduYWwoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEJpb21ldHJpY1Byb21wdC5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgQmlvbWV0cmljUHJvbXB0LkJ1aWxkZXIoZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0VGl0bGUoIlRpdGxlIik7CisgICAgICAgICAgICBidWlsZGVyLnNldFN1YnRpdGxlKCJTdWJ0aXRsZSIpOworICAgICAgICAgICAgYnVpbGRlci5zZXREZXNjcmlwdGlvbigiRGVzY3JpcHRpb24iKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0TmVnYXRpdmVCdXR0b24oIk5lZ2F0aXZlIiwgbUV4ZWN1dG9yLCBuZXcgRGlhbG9nSW50ZXJmYWNlLk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKERpYWxvZ0ludGVyZmFjZSBkaWFsb2csIGludCB3aGljaCkgeworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIEJpb21ldHJpY1Byb21wdCBwcm9tcHQgPSBidWlsZGVyLmJ1aWxkKCk7CisKKyAgICAgICAgICAgIHByb21wdC5hdXRoZW50aWNhdGUoY2FuY2VsbGF0aW9uU2lnbmFsLCBtRXhlY3V0b3IsIG1BdXRoZW50aWNhdGlvbkNhbGxiYWNrKTsKKyAgICAgICAgICAgIG1MYXRjaC5hd2FpdChBV0FJVF9USU1FT1VUX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICAgICAgYXNzZXJ0KG1FcnJvclJlY2VpdmVkID09IEJpb21ldHJpY1Byb21wdC5CSU9NRVRSSUNfRVJST1JfTk9fQklPTUVUUklDUyk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBleGNlcHRpb25UYWtlbiA9IHRydWU7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShleGNlcHRpb25UYWtlbik7CisgICAgICAgICAgICBjYW5jZWxsYXRpb25TaWduYWwuY2FuY2VsKCk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2hhcmR3YXJlL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2N0cy9FZ2wxNFV0aWxzLmphdmEgYi90ZXN0cy90ZXN0cy9oYXJkd2FyZS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jdHMvRWdsMTRVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODAyNmM5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL3Rlc3RzL2hhcmR3YXJlL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2N0cy9FZ2wxNFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5oYXJkd2FyZS5jdHM7Ci0KLWltcG9ydCBhbmRyb2lkLm9wZW5nbC5FR0wxNDsKLWltcG9ydCBhbmRyb2lkLm9wZW5nbC5FR0xDb25maWc7Ci1pbXBvcnQgYW5kcm9pZC5vcGVuZ2wuRUdMQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLm9wZW5nbC5FR0xEaXNwbGF5OwotaW1wb3J0IGFuZHJvaWQub3BlbmdsLkVHTEV4dDsKLWltcG9ydCBhbmRyb2lkLm9wZW5nbC5HTEVTMjA7Ci0KLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotLyoqCi0gKiBVdGlsaXRpZXMgdG8gdGVzdCBFR0wgQVBJcy4KLSAqLwotZmluYWwgY2xhc3MgRWdsMTRVdGlscyB7Ci0gICAgcHJpdmF0ZSBFZ2wxNFV0aWxzKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gaW5pdGlhbGl6ZWQgZGVmYXVsdCBkaXNwbGF5LgotICAgICAqLwotICAgIHN0YXRpYyBFR0xEaXNwbGF5IGNyZWF0ZUVnbERpc3BsYXkoKSB7Ci0gICAgICAgIEVHTERpc3BsYXkgZWdsRGlzcGxheSA9IEVHTDE0LmVnbEdldERpc3BsYXkoRUdMMTQuRUdMX0RFRkFVTFRfRElTUExBWSk7Ci0gICAgICAgIGlmIChlZ2xEaXNwbGF5ID09IEVHTDE0LkVHTF9OT19ESVNQTEFZKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJubyBFR0wgZGlzcGxheSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50W10gbWFqb3IgPSBuZXcgaW50WzFdOwotICAgICAgICBpbnRbXSBtaW5vciA9IG5ldyBpbnRbMV07Ci0gICAgICAgIGlmICghRUdMMTQuZWdsSW5pdGlhbGl6ZShlZ2xEaXNwbGF5LCBtYWpvciwgMCwgbWlub3IsIDApKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJlcnJvciBpbiBlZ2xJbml0aWFsaXplIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZWdsRGlzcGxheTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IEdMIEVTIDIuMCBjb250ZXh0IGZvciB0aGUgc3BlY2lmaWVkIHtAY29kZSBlZ2xEaXNwbGF5fS4KLSAgICAgKi8KLSAgICBzdGF0aWMgRUdMQ29udGV4dCBjcmVhdGVFZ2xDb250ZXh0KEVHTERpc3BsYXkgZWdsRGlzcGxheSkgewotICAgICAgICByZXR1cm4gY3JlYXRlRWdsQ29udGV4dChlZ2xEaXNwbGF5LCBnZXRFZ2xDb25maWcoZWdsRGlzcGxheSwgMiksIDIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBuZXcgR0wgRVMgY29udGV4dCBmb3IgdGhlIHNwZWNpZmllZCBkaXNwbGF5LCBjb25maWcgYW5kIHZlcnNpb24uCi0gICAgICovCi0gICAgc3RhdGljIEVHTENvbnRleHQgY3JlYXRlRWdsQ29udGV4dChFR0xEaXNwbGF5IGVnbERpc3BsYXksIEVHTENvbmZpZyBlZ2xDb25maWcsIGludCB2ZXJzaW9uKSB7Ci0gICAgICAgIGludFtdIGNvbnRleHRBdHRyaWJ1dGVzID0geyBFR0wxNC5FR0xfQ09OVEVYVF9DTElFTlRfVkVSU0lPTiwgdmVyc2lvbiwgRUdMMTQuRUdMX05PTkUgfTsKLSAgICAgICAgcmV0dXJuIEVHTDE0LmVnbENyZWF0ZUNvbnRleHQoZWdsRGlzcGxheSwgZWdsQ29uZmlnLAotICAgICAgICAgICAgICAgIEVHTDE0LkVHTF9OT19DT05URVhULCBjb250ZXh0QXR0cmlidXRlcywgMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVzdHJveXMgdGhlIEdMIGNvbnRleHQgaWRlbnRpZmllZCBieSB7QGNvZGUgZWdsRGlzcGxheX0gYW5kIHtAY29kZSBlZ2xDb250ZXh0fS4KLSAgICAgKi8KLSAgICBzdGF0aWMgdm9pZCBkZXN0cm95RWdsQ29udGV4dChFR0xEaXNwbGF5IGVnbERpc3BsYXksIEVHTENvbnRleHQgZWdsQ29udGV4dCkgewotICAgICAgICBFR0wxNC5lZ2xNYWtlQ3VycmVudChlZ2xEaXNwbGF5LAotICAgICAgICAgICAgICAgIEVHTDE0LkVHTF9OT19TVVJGQUNFLAotICAgICAgICAgICAgICAgIEVHTDE0LkVHTF9OT19TVVJGQUNFLAotICAgICAgICAgICAgICAgIEVHTDE0LkVHTF9OT19DT05URVhUKTsKLSAgICAgICAgaW50IGVycm9yID0gRUdMMTQuZWdsR2V0RXJyb3IoKTsKLSAgICAgICAgaWYgKGVycm9yICE9IEVHTDE0LkVHTF9TVUNDRVNTKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiZXJyb3IgcmVsZWFzaW5nIGNvbnRleHQ6ICIgKyBlcnJvcik7Ci0gICAgICAgIH0KLQotICAgICAgICBFR0wxNC5lZ2xEZXN0cm95Q29udGV4dChlZ2xEaXNwbGF5LCBlZ2xDb250ZXh0KTsKLSAgICAgICAgZXJyb3IgPSBFR0wxNC5lZ2xHZXRFcnJvcigpOwotICAgICAgICBpZiAoZXJyb3IgIT0gRUdMMTQuRUdMX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJlcnJvciBkZXN0cm95aW5nIGNvbnRleHQ6ICIgKyBlcnJvcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCByZWxlYXNlQW5kVGVybWluYXRlKEVHTERpc3BsYXkgZWdsRGlzcGxheSkgewotICAgICAgICBpbnQgZXJyb3I7Ci0gICAgICAgIEVHTDE0LmVnbFJlbGVhc2VUaHJlYWQoKTsKLSAgICAgICAgZXJyb3IgPSBFR0wxNC5lZ2xHZXRFcnJvcigpOwotICAgICAgICBpZiAoZXJyb3IgIT0gRUdMMTQuRUdMX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJlcnJvciByZWxlYXNpbmcgdGhyZWFkOiAiICsgZXJyb3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgRUdMMTQuZWdsVGVybWluYXRlKGVnbERpc3BsYXkpOwotICAgICAgICBlcnJvciA9IEVHTDE0LmVnbEdldEVycm9yKCk7Ci0gICAgICAgIGlmIChlcnJvciAhPSBFR0wxNC5FR0xfU1VDQ0VTUykgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImVycm9yIHRlcm1pbmF0aW5nIGRpc3BsYXk6ICIgKyBlcnJvcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgRUdMQ29uZmlnIGdldEVnbENvbmZpZyhFR0xEaXNwbGF5IGVnbERpc3BsYXksIGludCB2ZXJzaW9uKSB7Ci0gICAgICAgIC8vIEdldCBhbiBFR0xDb25maWcuCi0gICAgICAgIGludCByZW5kZXJhYmxlVHlwZSA9IEVHTDE0LkVHTF9PUEVOR0xfRVMyX0JJVDsKLSAgICAgICAgaWYgKHZlcnNpb24gPT0gMykgewotICAgICAgICAgICAgcmVuZGVyYWJsZVR5cGUgPSBFR0xFeHQuRUdMX09QRU5HTF9FUzNfQklUX0tIUjsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBpbnQgUkVEX1NJWkUgPSA4OwotICAgICAgICBmaW5hbCBpbnQgR1JFRU5fU0laRSA9IDg7Ci0gICAgICAgIGZpbmFsIGludCBCTFVFX1NJWkUgPSA4OwotICAgICAgICBmaW5hbCBpbnQgQUxQSEFfU0laRSA9IDg7Ci0gICAgICAgIGZpbmFsIGludCBERVBUSF9TSVpFID0gMDsKLSAgICAgICAgZmluYWwgaW50IFNURU5DSUxfU0laRSA9IDA7Ci0gICAgICAgIGZpbmFsIGludFtdIERFRkFVTFRfQ09ORklHVVJBVElPTiA9IG5ldyBpbnRbXSB7Ci0gICAgICAgICAgICAgICAgRUdMMTQuRUdMX1JFTkRFUkFCTEVfVFlQRSwgcmVuZGVyYWJsZVR5cGUsCi0gICAgICAgICAgICAgICAgRUdMMTQuRUdMX1JFRF9TSVpFLCBSRURfU0laRSwKLSAgICAgICAgICAgICAgICBFR0wxNC5FR0xfR1JFRU5fU0laRSwgR1JFRU5fU0laRSwKLSAgICAgICAgICAgICAgICBFR0wxNC5FR0xfQkxVRV9TSVpFLCBCTFVFX1NJWkUsCi0gICAgICAgICAgICAgICAgRUdMMTQuRUdMX0FMUEhBX1NJWkUsIEFMUEhBX1NJWkUsCi0gICAgICAgICAgICAgICAgRUdMMTQuRUdMX0RFUFRIX1NJWkUsIERFUFRIX1NJWkUsCi0gICAgICAgICAgICAgICAgRUdMMTQuRUdMX1NURU5DSUxfU0laRSwgU1RFTkNJTF9TSVpFLAotICAgICAgICAgICAgICAgIEVHTDE0LkVHTF9OT05FfTsKLQotICAgICAgICBpbnRbXSBjb25maWdzQ291bnQgPSBuZXcgaW50WzFdOwotICAgICAgICBFR0xDb25maWdbXSBlZ2xDb25maWdzID0gbmV3IEVHTENvbmZpZ1sxXTsKLSAgICAgICAgaWYgKCFFR0wxNC5lZ2xDaG9vc2VDb25maWcoCi0gICAgICAgICAgICAgICAgZWdsRGlzcGxheSwgREVGQVVMVF9DT05GSUdVUkFUSU9OLCAwLCBlZ2xDb25maWdzLCAwLCAxLCBjb25maWdzQ291bnQsIDApKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiZWdsQ2hvb3NlQ29uZmlnIGZhaWxlZCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlZ2xDb25maWdzWzBdOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyBmb3IgYSBHTCBlcnJvciB1c2luZyB7QGxpbmsgR0xFUzIwI2dsR2V0RXJyb3IoKX0uCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBHTCBlcnJvcgotICAgICAqLwotICAgIHN0YXRpYyB2b2lkIGNoZWNrR2xFcnJvcigpIHsKLSAgICAgICAgaW50IGVycm9yQ29kZTsKLSAgICAgICAgaWYgKChlcnJvckNvZGUgPSBHTEVTMjAuZ2xHZXRFcnJvcigpKSAhPSBHTEVTMjAuR0xfTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJnbCBlcnJvcjogIiArIEludGVnZXIudG9IZXhTdHJpbmcoZXJyb3JDb2RlKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9oYXJkd2FyZS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jdHMvR2VvbWFnbmV0aWNGaWVsZFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2hhcmR3YXJlL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2N0cy9HZW9tYWduZXRpY0ZpZWxkVGVzdC5qYXZhCmluZGV4IDc1ZDdiN2MuLjg5Njg0NDIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2hhcmR3YXJlL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2N0cy9HZW9tYWduZXRpY0ZpZWxkVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2hhcmR3YXJlL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2N0cy9HZW9tYWduZXRpY0ZpZWxkVGVzdC5qYXZhCkBAIC0yMywyNiArMjMsNzkgQEAKIGltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7CiAKIHB1YmxpYyBjbGFzcyBHZW9tYWduZXRpY0ZpZWxkVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7Ci0gICAgLy8gQ2hlbmdkdTogTGF0aXR1ZGUgMzBkIDQwJyAxMiIsIExvbmdpdHVkZSAxMDRkIDMnIDM2IgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IExBVElUVURFX09GX0NIRU5HRFUgPSAzMC42N2Y7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgTE9OR0lUVURFX09GX0NIRU5HRFUgPSAxMDQuMDZmOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IEFMVElUVURFX09GX0NIRU5HRFUgPSA1MDBmOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVEVTVF9USU1FID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKDIwMTAsIDUsIDEpLmdldFRpbWVJbk1pbGxpcygpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IERFQ0xJTkFUSU9OX1RIUkVTSE9MRCA9IDAuMWY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgSU5DTElOQVRJT05fVEhSRVNIT0xEID0gMC4xZjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBGSUVMRF9TVFJFTkdUSF9USFJFU0hPTEQgPSAxMDA7CiAKICAgICBAUHJlc3VibWl0CiAgICAgcHVibGljIHZvaWQgdGVzdEdlb21hZ25ldGljRmllbGQoKSB7Ci0gICAgICAgIEdlb21hZ25ldGljRmllbGQgZ2VvbWFnbmV0aWNGaWVsZCA9IG5ldyBHZW9tYWduZXRpY0ZpZWxkKExBVElUVURFX09GX0NIRU5HRFUsCi0gICAgICAgICAgICAgICAgTE9OR0lUVURFX09GX0NIRU5HRFUsIEFMVElUVURFX09GX0NIRU5HRFUsIFRFU1RfVElNRSk7CisgICAgICAgIC8vIFJlZmVyZW5jZSB2YWx1ZXMgY2FsY3VsYXRlZCBmcm9tIE5PQUEgb25saW5lIGNhbGN1bGF0b3IgZm9yIFdNTSAyMDE1CisgICAgICAgIC8vIGh0dHBzOi8vd3d3Lm5nZGMubm9hYS5nb3YvZ2VvbWFnLXdlYi8jaWdyZndtbQorICAgICAgICBUZXN0RGF0YVBvaW50IHRlc3RQb2ludHNbXSA9IG5ldyBUZXN0RGF0YVBvaW50W10geworICAgICAgICAgICAgLy8gTW91bnRhaW4gVmlldywgQ0EsIFVTQSBvbiAyMDE3LzEvMQorICAgICAgICAgICAgbmV3IFRlc3REYXRhUG9pbnQoMzcuMzg2ZiwgLTEyMi4wODNmLCAzMiwgMjAxNywgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgMTMuNDU4OWYsIDYwLjk1NDJmLCA0ODE2OC4wZiksCisgICAgICAgICAgICAvLyBDaGVuZ2R1LCBDaGluYSBvbiAyMDE3LzgvOAorICAgICAgICAgICAgbmV3IFRlc3REYXRhUG9pbnQoMzAuNjU4ZiwgMTAzLjkzNWYsIDUwMGYsIDIwMTcsIDgsIDgsCisgICAgICAgICAgICAgICAgICAgIC0xLjk3ODRmLCA0Ny45NzIzZiwgNTA3MTcuM2YpLAorICAgICAgICAgICAgLy8gU2FvIFBhdWxvLCBCcmF6aWwgb24gMjAxOC8xMi8yNQorICAgICAgICAgICAgbmV3IFRlc3REYXRhUG9pbnQoLTIzLjY4MmYsIC00Ni44NzVmLCA3NjBmLCAyMDE4LCAxMiwgMjUsCisgICAgICAgICAgICAgICAgICAgIC0yMS4zMTMwZiwgLTM3Ljk5NDBmLCAyMjgzMi4zZiksCisgICAgICAgICAgICAvLyBCb3N0b24sIE1BLCBVU0Egb24gMjAxOS8yLzEwCisgICAgICAgICAgICBuZXcgVGVzdERhdGFQb2ludCg0Mi4zMTNmLCAtNzEuMTI3ZiwgNDNmLCAyMDE5LCAyLCAxMCwKKyAgICAgICAgICAgICAgICAgICAgLTE0LjUzOTFmLCA2Ni45NjkzZiwgNTE4MTUuMWYpLAorICAgICAgICAgICAgLy8gQ2FwZSBUb3duLCBTb3V0aCBBZnJpY2Egb24gMjAxOS81LzEKKyAgICAgICAgICAgIG5ldyBUZXN0RGF0YVBvaW50KC0zMy45MTNmLCAxOC4wOTVmLCAxMDBmLCAyMDE5LCA1LCAxLAorICAgICAgICAgICAgICAgICAgICAtMjUuMjQ1NGYsIC02NS44ODg3ZiwgMjUzNjkuMmYpLAorICAgICAgICAgICAgLy8gU3lkbmV5LCBBdXN0cmFsaWEgb24gMjAyMC8xLzEKKyAgICAgICAgICAgIG5ldyBUZXN0RGF0YVBvaW50KC0zMy44NDdmLCAxNTAuNzkxZiwgMTlmLCAyMDIwLCAxLCAxLAorICAgICAgICAgICAgICAgICAgICAxMi40NDY5ZiwgLTY0LjM0NDNmLCA1NzA4Ny45ZikKKyAgICAgICAgfTsKIAotICAgICAgICAvLyBSZWZlcmVuY2UgdmFsdWVzIGNhbGN1bGF0ZWQgZnJvbSBOT0FBIG9ubGluZSBjYWxjdWxhdG9yIGZvciBXTU0gMjAxMCwKLSAgICAgICAgLy8gYW5kIGNyb3NzLWNoZWNrZWQgaW4gTWF0bGFiLiBUaGUgZXhwZWN0ZWQgZGVsdGFzIGFyZSBwcm9wb3J0aW9uYWwgdG8gdGhlCi0gICAgICAgIC8vIG1hZ25pdHVkZSBvZiBlYWNoIHZhbHVlLgotICAgICAgICBhc3NlcnRFcXVhbHMoLTEuODY3ZiwgZ2VvbWFnbmV0aWNGaWVsZC5nZXREZWNsaW5hdGlvbigpLCAwLjFmKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDQ3LjEzM2YsIGdlb21hZ25ldGljRmllbGQuZ2V0SW5jbGluYXRpb24oKSwgMS4wZik7Ci0gICAgICAgIGFzc2VydEVxdWFscyg1MDM3NS42ZiwgZ2VvbWFnbmV0aWNGaWVsZC5nZXRGaWVsZFN0cmVuZ3RoKCksIDEwMC4wZik7Ci0gICAgICAgIGFzc2VydEVxdWFscygzNDI2OS4zZiwgZ2VvbWFnbmV0aWNGaWVsZC5nZXRIb3Jpem9udGFsU3RyZW5ndGgoKSwgMTAwLjBmKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDM0MjUxLjJmLCBnZW9tYWduZXRpY0ZpZWxkLmdldFgoKSwgMTAwLjBmKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKC0xMTEzLjJmLCBnZW9tYWduZXRpY0ZpZWxkLmdldFkoKSwgMTAuMGYpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMzY5MjMuMWYsIGdlb21hZ25ldGljRmllbGQuZ2V0WigpLCAxMDAuMGYpOworICAgICAgICBmb3IgKFRlc3REYXRhUG9pbnQgdCA6IHRlc3RQb2ludHMpIHsKKyAgICAgICAgICAgIEdlb21hZ25ldGljRmllbGQgZmllbGQgPQorICAgICAgICAgICAgICAgICAgICBuZXcgR2VvbWFnbmV0aWNGaWVsZCh0LmxhdGl0dWRlLCB0LmxvbmdpdHVkZSwgdC5hbHRpdHVkZSwgdC5lcG9jaFRpbWVNaWxsaXMpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHQuZGVjbGluYXRpb25EZWdyZWUsICBmaWVsZC5nZXREZWNsaW5hdGlvbigpLCBERUNMSU5BVElPTl9USFJFU0hPTEQpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHQuaW5jbGluYXRpb25EZWdyZWUsICBmaWVsZC5nZXRJbmNsaW5hdGlvbigpLCBJTkNMSU5BVElPTl9USFJFU0hPTEQpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHQuZmllbGRTdHJlbmd0aE5hbm9UZXNsYSwgZmllbGQuZ2V0RmllbGRTdHJlbmd0aCgpLAorICAgICAgICAgICAgICAgICAgICBGSUVMRF9TVFJFTkdUSF9USFJFU0hPTEQpOworCisgICAgICAgICAgICBmbG9hdCBob3Jpem9udGFsRmllbGRTdHJlbmd0aE5hbm9UZXNsYSA9IChmbG9hdCkoCisgICAgICAgICAgICAgICAgICAgIE1hdGguY29zKE1hdGgudG9SYWRpYW5zKHQuaW5jbGluYXRpb25EZWdyZWUpKSAqIHQuZmllbGRTdHJlbmd0aE5hbm9UZXNsYSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaG9yaXpvbnRhbEZpZWxkU3RyZW5ndGhOYW5vVGVzbGEsIGZpZWxkLmdldEhvcml6b250YWxTdHJlbmd0aCgpLAorICAgICAgICAgICAgICAgICAgICBGSUVMRF9TVFJFTkdUSF9USFJFU0hPTEQpOworCisgICAgICAgICAgICBmbG9hdCB2ZXJ0aWNhbEZpZWxkU3RyZW5ndGhOYW5vVGVzbGEgPSAoZmxvYXQpKAorICAgICAgICAgICAgICAgICAgICBNYXRoLnNpbihNYXRoLnRvUmFkaWFucyh0LmluY2xpbmF0aW9uRGVncmVlKSkgKiB0LmZpZWxkU3RyZW5ndGhOYW5vVGVzbGEpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHZlcnRpY2FsRmllbGRTdHJlbmd0aE5hbm9UZXNsYSwgZmllbGQuZ2V0WigpLCBGSUVMRF9TVFJFTkdUSF9USFJFU0hPTEQpOworCisgICAgICAgICAgICBmbG9hdCBkZWNsaW5hdGlvbkRlZ3JlZSA9IChmbG9hdCkoCisgICAgICAgICAgICAgICAgICAgIE1hdGgudG9EZWdyZWVzKE1hdGguYXRhbjIoZmllbGQuZ2V0WSgpLCBmaWVsZC5nZXRYKCkpKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModC5kZWNsaW5hdGlvbkRlZ3JlZSwgZGVjbGluYXRpb25EZWdyZWUsIERFQ0xJTkFUSU9OX1RIUkVTSE9MRCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaG9yaXpvbnRhbEZpZWxkU3RyZW5ndGhOYW5vVGVzbGEsCisgICAgICAgICAgICAgICAgICAgIE1hdGguc3FydChmaWVsZC5nZXRYKCkgKiBmaWVsZC5nZXRYKCkgKyBmaWVsZC5nZXRZKCkgKiBmaWVsZC5nZXRZKCkpLAorICAgICAgICAgICAgICAgICAgICBGSUVMRF9TVFJFTkdUSF9USFJFU0hPTEQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBUZXN0RGF0YVBvaW50IHsKKyAgICAgICAgcHVibGljIGZpbmFsIGZsb2F0IGxhdGl0dWRlOworICAgICAgICBwdWJsaWMgZmluYWwgZmxvYXQgbG9uZ2l0dWRlOworICAgICAgICBwdWJsaWMgZmluYWwgZmxvYXQgYWx0aXR1ZGU7CisgICAgICAgIHB1YmxpYyBmaW5hbCBsb25nIGVwb2NoVGltZU1pbGxpczsKKyAgICAgICAgcHVibGljIGZpbmFsIGZsb2F0IGRlY2xpbmF0aW9uRGVncmVlOworICAgICAgICBwdWJsaWMgZmluYWwgZmxvYXQgaW5jbGluYXRpb25EZWdyZWU7CisgICAgICAgIHB1YmxpYyBmaW5hbCBmbG9hdCBmaWVsZFN0cmVuZ3RoTmFub1Rlc2xhOworCisgICAgICAgIFRlc3REYXRhUG9pbnQoZmxvYXQgbGF0LCBmbG9hdCBsbmcsIGZsb2F0IGFsdCwgaW50IHllYXIsIGludCBtb250aCwgaW50IGRheSwKKyAgICAgICAgICAgICAgICBmbG9hdCBkZWMsIGZsb2F0IGluYywgZmxvYXQgc3RyZW5ndGgpIHsKKyAgICAgICAgICAgIGxhdGl0dWRlID0gbGF0OworICAgICAgICAgICAgbG9uZ2l0dWRlID0gbG5nOworICAgICAgICAgICAgYWx0aXR1ZGUgPSBhbHQ7CisgICAgICAgICAgICBlcG9jaFRpbWVNaWxsaXMgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoeWVhciwgbW9udGgsIGRheSkuZ2V0VGltZUluTWlsbGlzKCk7CisgICAgICAgICAgICBkZWNsaW5hdGlvbkRlZ3JlZSA9IGRlYzsKKyAgICAgICAgICAgIGluY2xpbmF0aW9uRGVncmVlID0gaW5jOworICAgICAgICAgICAgZmllbGRTdHJlbmd0aE5hbm9UZXNsYSA9IHN0cmVuZ3RoOworICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvaGFyZHdhcmUvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY3RzL0dsVXRpbHMuamF2YSBiL3Rlc3RzL3Rlc3RzL2hhcmR3YXJlL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2N0cy9HbFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNWNlY2IuLjAwMDAwMDAKLS0tIGEvdGVzdHMvdGVzdHMvaGFyZHdhcmUvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY3RzL0dsVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuaGFyZHdhcmUuY3RzOwotCi1pbXBvcnQgYW5kcm9pZC5vcGVuZ2wuR0xFUzIwOwotaW1wb3J0IGFuZHJvaWQudXRpbC5QYWlyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotZmluYWwgY2xhc3MgR2xVdGlscyB7Ci0gICAgcHJpdmF0ZSBHbFV0aWxzKCkgewotICAgIH0KLQotICAgIHN0YXRpYyBpbnQgZ2V0TWFqb3JWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gZ2V0VmVyc2lvbigpLmZpcnN0OwotICAgIH0KLQotICAgIHN0YXRpYyBQYWlyPEludGVnZXIsIEludGVnZXI+IGdldFZlcnNpb24oKSB7Ci0gICAgICAgIC8vIFNlY3Rpb24gNi4xLjUgb2YgdGhlIE9wZW5HTCBFUyBzcGVjaWZpY2F0aW9uIGluZGljYXRlcyB0aGUgR0wgdmVyc2lvbgotICAgICAgICAvLyBzdHJpbmcgc3RyaWN0bHkgZm9sbG93cyB0aGlzIGZvcm1hdDoKLSAgICAgICAgLy8KLSAgICAgICAgLy8gT3BlbkdMPHNwYWNlPkVTPHNwYWNlPjx2ZXJzaW9uIG51bWJlcj48c3BhY2U+PHZlbmRvci1zcGVjaWZpYyBpbmZvcm1hdGlvbj4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gSW4gYWRkaXRpb24gc2VjdGlvbiA2LjEuNSBkZXNjcmliZXMgdGhlIHZlcnNpb24gbnVtYmVyIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyOgotICAgICAgICAvLwotICAgICAgICAvLyAiVGhlIHZlcnNpb24gbnVtYmVyIGlzIGVpdGhlciBvZiB0aGUgZm9ybSBtYWpvciBudW1iZXIubWlub3IgbnVtYmVyIG9yCi0gICAgICAgIC8vIG1ham9yIG51bWJlci5taW5vciBudW1iZXIucmVsZWFzZSBudW1iZXIsIHdoZXJlIHRoZSBudW1iZXJzIGFsbCBoYXZlIG9uZQotICAgICAgICAvLyBvciBtb3JlIGRpZ2l0cy4gVGhlIHJlbGVhc2UgbnVtYmVyIGFuZCB2ZW5kb3Igc3BlY2lmaWMgaW5mb3JtYXRpb24gYXJlCi0gICAgICAgIC8vIG9wdGlvbmFsLiIKLSAgICAgICAgU3RyaW5nIHZlcnNpb24gPSBHTEVTMjAuZ2xHZXRTdHJpbmcoR0xFUzIwLkdMX1ZFUlNJT04pOwotICAgICAgICBQYXR0ZXJuIHBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoIk9wZW5HTCBFUyAoWzAtOV0rKVxcLihbMC05XSspIik7Ci0gICAgICAgIE1hdGNoZXIgbWF0Y2hlciA9IHBhdHRlcm4ubWF0Y2hlcih2ZXJzaW9uKTsKLSAgICAgICAgaWYgKG1hdGNoZXIuZmluZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFBhaXI8PigKLSAgICAgICAgICAgICAgICAgICAgSW50ZWdlci5wYXJzZUludChtYXRjaGVyLmdyb3VwKDEpKSwgSW50ZWdlci5wYXJzZUludChtYXRjaGVyLmdyb3VwKDIpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBQYWlyPD4oMiwgMCk7Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cmluZ1tdIGdldEV4dGVuc2lvbnMoKSB7Ci0gICAgICAgIHJldHVybiBHTEVTMjAuZ2xHZXRTdHJpbmcoR0xFUzIwLkdMX0VYVEVOU0lPTlMpLnNwbGl0KCIgIik7Ci0gICAgfQotCi0gICAgc3RhdGljIGJvb2xlYW4gaGFzRXh0ZW5zaW9ucyhTdHJpbmcuLi4gZXh0ZW5zaW9ucykgewotICAgICAgICBTdHJpbmdbXSBhdmFpbGFibGUgPSBnZXRFeHRlbnNpb25zKCk7Ci0gICAgICAgIEFycmF5cy5zb3J0KGF2YWlsYWJsZSk7Ci0gICAgICAgIGZvciAoU3RyaW5nIGV4dGVuc2lvbiA6IGV4dGVuc2lvbnMpIHsKLSAgICAgICAgICAgIGlmIChBcnJheXMuYmluYXJ5U2VhcmNoKGF2YWlsYWJsZSwgZXh0ZW5zaW9uKSA8IDApIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9oYXJkd2FyZS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jdHMvSGFyZHdhcmVCdWZmZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9oYXJkd2FyZS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jdHMvSGFyZHdhcmVCdWZmZXJUZXN0LmphdmEKaW5kZXggNjI3Njk1OS4uNDFjMDczNSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvaGFyZHdhcmUvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY3RzL0hhcmR3YXJlQnVmZmVyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2hhcmR3YXJlL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2N0cy9IYXJkd2FyZUJ1ZmZlclRlc3QuamF2YQpAQCAtMTYsMzYgKzE2LDIzIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5oYXJkd2FyZS5jdHM7CiAKLWltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLkhhcmR3YXJlQnVmZmVyOwotaW1wb3J0IGFuZHJvaWQub3BlbmdsLkVHTDE0OwotaW1wb3J0IGFuZHJvaWQub3BlbmdsLkVHTENvbmZpZzsKLWltcG9ydCBhbmRyb2lkLm9wZW5nbC5FR0xDb250ZXh0OwotaW1wb3J0IGFuZHJvaWQub3BlbmdsLkVHTERpc3BsYXk7Ci1pbXBvcnQgYW5kcm9pZC5vcGVuZ2wuRUdMU3VyZmFjZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuUGFpcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwotCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQub3BlbmdsLkVHTDE0LkVHTF9IRUlHSFQ7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQub3BlbmdsLkVHTDE0LkVHTF9OT05FOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm9wZW5nbC5FR0wxNC5FR0xfTk9fQ09OVEVYVDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5vcGVuZ2wuRUdMMTQuRUdMX05PX1NVUkZBQ0U7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQub3BlbmdsLkVHTDE0LkVHTF9XSURUSDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAoraW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuSGFyZHdhcmVCdWZmZXI7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKIC8qKgogICogVGVzdCB7QGxpbmsgSGFyZHdhcmVCdWZmZXJ9LgogICovCiBAU21hbGxUZXN0CiBAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQogcHVibGljIGNsYXNzIEhhcmR3YXJlQnVmZmVyVGVzdCB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzSGFzRmxvYXRCdWZmZXJzOwotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoIlNhbWVQYXJhbWV0ZXJWYWx1ZSIpCiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIEhhcmR3YXJlQnVmZmVyIG5hdGl2ZUNyZWF0ZUhhcmR3YXJlQnVmZmVyKGludCB3aWR0aCwgaW50IGhlaWdodCwKICAgICAgICAgICAgIGludCBmb3JtYXQsIGludCBsYXllcnMsIGxvbmcgdXNhZ2UpOwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZVJlbGVhc2VIYXJkd2FyZUJ1ZmZlcihIYXJkd2FyZUJ1ZmZlciBoYXJkd2FyZUJ1ZmZlck9iaik7CkBAIC01NCw1MSArNDEsNiBAQAogICAgICAgICBTeXN0ZW0ubG9hZExpYnJhcnkoImN0c2hhcmR3YXJlX2puaSIpOwogICAgIH0KIAotICAgIEBCZWZvcmVDbGFzcwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBoYXNGbG9hdEJ1ZmZlcnMoKSB7Ci0gICAgICAgIEVHTERpc3BsYXkgZWdsRGlzcGxheSA9IG51bGw7Ci0gICAgICAgIEVHTENvbnRleHQgZWdsQ29udGV4dCA9IG51bGw7Ci0gICAgICAgIEVHTFN1cmZhY2UgZWdsU3VyZmFjZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBlZ2xEaXNwbGF5ID0gRWdsMTRVdGlscy5jcmVhdGVFZ2xEaXNwbGF5KCk7Ci0gICAgICAgICAgICBFR0xDb25maWcgZWdsQ29uZmlnID0gRWdsMTRVdGlscy5nZXRFZ2xDb25maWcoZWdsRGlzcGxheSwgMik7Ci0gICAgICAgICAgICBlZ2xDb250ZXh0ID0gRWdsMTRVdGlscy5jcmVhdGVFZ2xDb250ZXh0KGVnbERpc3BsYXksIGVnbENvbmZpZywgMik7Ci0KLSAgICAgICAgICAgIGVnbFN1cmZhY2UgPSBFR0wxNC5lZ2xDcmVhdGVQYnVmZmVyU3VyZmFjZShlZ2xEaXNwbGF5LCBlZ2xDb25maWcsIG5ldyBpbnRbXSB7Ci0gICAgICAgICAgICAgICAgICAgIEVHTF9XSURUSCwgMSwKLSAgICAgICAgICAgICAgICAgICAgRUdMX0hFSUdIVCwgMSwKLSAgICAgICAgICAgICAgICAgICAgRUdMX05PTkUKLSAgICAgICAgICAgIH0sIDApOwotICAgICAgICAgICAgRUdMMTQuZWdsTWFrZUN1cnJlbnQoZWdsRGlzcGxheSwgZWdsU3VyZmFjZSwgZWdsU3VyZmFjZSwgZWdsQ29udGV4dCk7Ci0KLSAgICAgICAgICAgIFBhaXI8SW50ZWdlciwgSW50ZWdlcj4gdmVyc2lvbiA9IEdsVXRpbHMuZ2V0VmVyc2lvbigpOwotICAgICAgICAgICAgc0hhc0Zsb2F0QnVmZmVycyA9ICh2ZXJzaW9uLmZpcnN0ID49IDMgJiYgdmVyc2lvbi5zZWNvbmQgPj0gMikgfHwKLSAgICAgICAgICAgICAgICAgICAgR2xVdGlscy5oYXNFeHRlbnNpb25zKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHTF9PRVNfdGV4dHVyZV9oYWxmX2Zsb2F0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR0xfT0VTX3RleHR1cmVfaGFsZl9mbG9hdF9saW5lYXIiKTsKLQotICAgICAgICAgICAgRUdMMTQuZWdsTWFrZUN1cnJlbnQoZWdsRGlzcGxheSwgRUdMX05PX1NVUkZBQ0UsIEVHTF9OT19TVVJGQUNFLCBFR0xfTk9fQ09OVEVYVCk7Ci0gICAgICAgICAgICBFR0wxNC5lZ2xEZXN0cm95U3VyZmFjZShlZ2xEaXNwbGF5LCBlZ2xTdXJmYWNlKTsKLQotICAgICAgICAgICAgRWdsMTRVdGlscy5kZXN0cm95RWdsQ29udGV4dChlZ2xEaXNwbGF5LCBlZ2xDb250ZXh0KTsKLSAgICAgICAgICAgIEVnbDE0VXRpbHMucmVsZWFzZUFuZFRlcm1pbmF0ZShlZ2xEaXNwbGF5KTsKLQotICAgICAgICAgICAgZWdsRGlzcGxheSA9IG51bGw7Ci0gICAgICAgICAgICBlZ2xDb250ZXh0ID0gbnVsbDsKLSAgICAgICAgICAgIGVnbFN1cmZhY2UgPSBudWxsOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGVnbERpc3BsYXkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChlZ2xDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgRUdMMTQuZWdsRGVzdHJveUNvbnRleHQoZWdsRGlzcGxheSwgZWdsQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChlZ2xTdXJmYWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgRUdMMTQuZWdsRGVzdHJveVN1cmZhY2UoZWdsRGlzcGxheSwgZWdsU3VyZmFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEVHTDE0LmVnbFRlcm1pbmF0ZShlZ2xEaXNwbGF5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZSgpIHsKICAgICAgICAgSGFyZHdhcmVCdWZmZXIgYnVmZmVyID0gSGFyZHdhcmVCdWZmZXIuY3JlYXRlKDIsIDQsIEhhcmR3YXJlQnVmZmVyLlJHQkFfODg4OCwgMSwKQEAgLTEyMiwyMSArNjQsMTIgQEAKICAgICAgICAgYnVmZmVyID0gSGFyZHdhcmVCdWZmZXIuY3JlYXRlKDIsIDEsIEhhcmR3YXJlQnVmZmVyLkJMT0IsIDEsCiAgICAgICAgICAgICAgICAgSGFyZHdhcmVCdWZmZXIuVVNBR0VfQ1BVX1JFQURfUkFSRUxZKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKEhhcmR3YXJlQnVmZmVyLkJMT0IsIGJ1ZmZlci5nZXRGb3JtYXQoKSk7Ci0KLSAgICAgICAgaWYgKHNIYXNGbG9hdEJ1ZmZlcnMpIHsKLSAgICAgICAgICAgIGJ1ZmZlciA9IEhhcmR3YXJlQnVmZmVyLmNyZWF0ZSgyLCA0LCBIYXJkd2FyZUJ1ZmZlci5SR0JBX0ZQMTYsIDEsCi0gICAgICAgICAgICAgICAgICAgIEhhcmR3YXJlQnVmZmVyLlVTQUdFX0NQVV9SRUFEX1JBUkVMWSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSGFyZHdhcmVCdWZmZXIuUkdCQV9GUDE2LCBidWZmZXIuZ2V0Rm9ybWF0KCkpOwotICAgICAgICAgICAgYnVmZmVyID0gSGFyZHdhcmVCdWZmZXIuY3JlYXRlKDIsIDQsIEhhcmR3YXJlQnVmZmVyLlJHQkFfMTAxMDEwMiwgMSwKLSAgICAgICAgICAgICAgICAgICAgSGFyZHdhcmVCdWZmZXIuVVNBR0VfQ1BVX1JFQURfUkFSRUxZKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhIYXJkd2FyZUJ1ZmZlci5SR0JBXzEwMTAxMDIsIGJ1ZmZlci5nZXRGb3JtYXQoKSk7Ci0gICAgICAgIH0KICAgICB9CiAKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiRW1wdHlDYXRjaEJsb2NrIikKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVGYWlsc1dpdGhJbnZhbGlkQXJndW1lbnRzKCkgewogICAgICAgICBIYXJkd2FyZUJ1ZmZlciBidWZmZXIgPSBudWxsOworICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgYnVmZmVyKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGJ1ZmZlciA9IEhhcmR3YXJlQnVmZmVyLmNyZWF0ZSgwLCA0LCBIYXJkd2FyZUJ1ZmZlci5SR0JfODg4LCAxLAogICAgICAgICAgICAgICAgICAgICBIYXJkd2FyZUJ1ZmZlci5VU0FHRV9DUFVfUkVBRF9SQVJFTFkpOwpAQCAtMTYzLDIwICs5Niw2IEBACiAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7fQogICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgYnVmZmVyKTsKIAotICAgICAgICBpZiAoc0hhc0Zsb2F0QnVmZmVycykgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBidWZmZXIgPSBIYXJkd2FyZUJ1ZmZlci5jcmVhdGUoMCwgNCwgSGFyZHdhcmVCdWZmZXIuUkdCQV9GUDE2LCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgSGFyZHdhcmVCdWZmZXIuVVNBR0VfQ1BVX1JFQURfUkFSRUxZKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgYnVmZmVyKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyID0gSGFyZHdhcmVCdWZmZXIuY3JlYXRlKDAsIDQsIEhhcmR3YXJlQnVmZmVyLlJHQkFfMTAxMDEwMiwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEhhcmR3YXJlQnVmZmVyLlVTQUdFX0NQVV9SRUFEX1JBUkVMWSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIGJ1ZmZlcik7Ci0gICAgICAgIH0KICAgICB9CiAKICAgICBAVGVzdApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvaGFyZHdhcmUvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY3RzL0xvd1JhbURldmljZVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2hhcmR3YXJlL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2N0cy9Mb3dSYW1EZXZpY2VUZXN0LmphdmEKaW5kZXggMzI0YWQ2ZC4uOWUxMzY2YSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvaGFyZHdhcmUvc3JjL2FuZHJvaWQvaGFyZHdhcmUvY3RzL0xvd1JhbURldmljZVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9oYXJkd2FyZS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jdHMvTG93UmFtRGV2aWNlVGVzdC5qYXZhCkBAIC0yMCw3ICsyMCw2IEBACiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbi5TQ1JFRU5MQVlPVVRfU0laRV9OT1JNQUw7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbi5TQ1JFRU5MQVlPVVRfU0laRV9TTUFMTDsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uLlNDUkVFTkxBWU9VVF9TSVpFX1hMQVJHRTsKLQogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3MuREVOU0lUWV80MDA7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljcy5ERU5TSVRZXzU2MDsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzLkRFTlNJVFlfSElHSDsKQEAgLTI5LDQ3ICsyOCw1OSBAQAogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3MuREVOU0lUWV9UVjsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzLkRFTlNJVFlfWEhJR0g7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKLWltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworaW1wb3J0IGFuZHJvaWQub3MuU3RhdEZzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKLWltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogCiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DZGRUZXN0OwogCi1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5TY2FubmVyOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CiAKIC8qKgogICogVGVzdHMgdGhhdCBkZXZpY2VzIHdpdGggbG93IFJBTSBzcGVjaWZ5IHRoZW1zZWx2ZXMgYXMgTG93IFJBTSBkZXZpY2VzCiAgKi8KLXB1YmxpYyBjbGFzcyBMb3dSYW1EZXZpY2VUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKK0BSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgTG93UmFtRGV2aWNlVGVzdCB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIE9ORV9NRUdBQllURSA9IDEwNDg1NzZMOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTG93UmFtRGV2aWNlVGVzdCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBMT1dfUkFNX01BWCA9IDEwMjQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgTUlOX0FQUF9EQVRBX1BBUlRJVElPTl9TSVpFX0dCID0gNGY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgTUlOX0FQUF9EQVRBX1BBUlRJVElPTl9TSVpFX0xPV19SQU1fR0IgPSAxLjFmOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IE1JTl9TSEFSRURfREFUQV9QQVJUSVRJT05fU0laRV9HQiA9IDFmOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgR0JfVE9fQllURVNfTVVMVElQTElFUiA9IDEwMjQgKiAxMDI0ICogMTAyNDsKIAorICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKICAgICBwcml2YXRlIFBhY2thZ2VNYW5hZ2VyIG1QYWNrYWdlTWFuYWdlcjsKICAgICBwcml2YXRlIEFjdGl2aXR5TWFuYWdlciBtQWN0aXZpdHlNYW5hZ2VyOwogICAgIHByaXZhdGUgRGlzcGxheU1ldHJpY3MgbURpc3BsYXlNZXRyaWNzOwogCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgbVBhY2thZ2VNYW5hZ2VyID0gZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1Db250ZXh0ID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0VGFyZ2V0Q29udGV4dCgpOworICAgICAgICBtUGFja2FnZU1hbmFnZXIgPSBtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOwogICAgICAgICBtQWN0aXZpdHlNYW5hZ2VyID0KLSAgICAgICAgICAgICAgICAoQWN0aXZpdHlNYW5hZ2VyKSBnZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkFDVElWSVRZX1NFUlZJQ0UpOworICAgICAgICAgICAgICAgIChBY3Rpdml0eU1hbmFnZXIpIG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BQ1RJVklUWV9TRVJWSUNFKTsKIAogICAgICAgICBtRGlzcGxheU1ldHJpY3MgPSBuZXcgRGlzcGxheU1ldHJpY3MoKTsKICAgICAgICAgV2luZG93TWFuYWdlciB3aW5kb3dNYW5hZ2VyID0KLSAgICAgICAgICAgICAgICAoV2luZG93TWFuYWdlcikgZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5XSU5ET1dfU0VSVklDRSk7CisgICAgICAgICAgICAgICAgKFdpbmRvd01hbmFnZXIpIG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5XSU5ET1dfU0VSVklDRSk7CiAgICAgICAgIHdpbmRvd01hbmFnZXIuZ2V0RGVmYXVsdERpc3BsYXkoKS5nZXRNZXRyaWNzKG1EaXNwbGF5TWV0cmljcyk7CiAgICAgfQogCkBAIC03Nyw3ICs4OCw4IEBACiAgICAgICogVGVzdCB0aGUgZGV2aWNlcyByZXBvcnRlZCBtZW1vcnkgdG8gZW5zdXJlIGl0IG1lZXRzIHRoZSBtaW5pbXVtIHZhbHVlcyBkZXNjcmliZWQKICAgICAgKiBpbiBDREQgNy42LjEuCiAgICAgICovCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuNi4xL0gtMy0xLEgtNC0xLEgtNy0xLEgtOC0xLEgtOS0xLFctMC0yLFQtMC0yIikKKyAgICBAVGVzdAorICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjYuMSIpCiAgICAgcHVibGljIHZvaWQgdGVzdE1pbmltdW1NZW1vcnkoKSB7CiAgICAgICAgIGludCBkZW5zaXR5ID0gbURpc3BsYXlNZXRyaWNzLmRlbnNpdHlEcGk7CiAgICAgICAgIEJvb2xlYW4gc3VwcG9ydHM2NEJpdCA9IHN1cHBvcnRzU2l4dHlGb3VyQml0KCk7CkBAIC0xMjcsMTMgKzEzOSwzOSBAQAogICAgICAgICAgICAgICAgIGdyZWF0ZXJUaGFuRHBpKGRlbnNpdHksIERFTlNJVFlfTUVESVVNLCBzY3JlZW5TaXplLCBTQ1JFRU5MQVlPVVRfU0laRV9YTEFSR0UpKSB7CiAKICAgICAgICAgICAgIGlmIChzdXBwb3J0czY0Qml0KSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0TWluTWVtb3J5TWIoODMyKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRNaW5NZW1vcnlNYig5NDQpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRNaW5NZW1vcnlNYig1MTIpOworICAgICAgICAgICAgICAgIGFzc2VydE1pbk1lbW9yeU1iKDU5Mik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAVGVzdAorICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjYuMi9ILTAtMSIpCisgICAgcHVibGljIHZvaWQgdGVzdE1pblNoYXJlZERhdGFQYXJ0aXRpb25TaXplKCkgeworICAgICAgICBhc3NlcnREYXRhUGFydGl0aW9uTWluaW11bVNpemUoCisgICAgICAgICAgICAgICAgIlNoYXJlZCBkYXRhIiwKKyAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRFeHRlcm5hbEZpbGVzRGlyKG51bGwpLAorICAgICAgICAgICAgICAgIE1JTl9TSEFSRURfREFUQV9QQVJUSVRJT05fU0laRV9HQik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iNy42LjEvSC05LTIsVC0wLTEsQS0wLTEsNy42LjEvSC0xMC0xIikKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWluRGF0YVBhcnRpdGlvblNpemUoKSB7CisgICAgICAgIGxvbmcgdG90YWxNZW1vcnlNYiA9IGdldFRvdGFsTWVtb3J5KCkgLyBPTkVfTUVHQUJZVEU7CisgICAgICAgIGJvb2xlYW4gbG93UmFtID0gdG90YWxNZW1vcnlNYiA8PSBMT1dfUkFNX01BWDsKKworICAgICAgICBpZiAobG93UmFtKSB7CisgICAgICAgICAgICBhc3NlcnREYXRhUGFydGl0aW9uTWluaW11bVNpemUoCisgICAgICAgICAgICAgICAgICAgICJBcHBsaWNhdGlvbiBkYXRhIiwKKyAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0RmlsZXNEaXIoKSwKKyAgICAgICAgICAgICAgICAgICAgTUlOX0FQUF9EQVRBX1BBUlRJVElPTl9TSVpFX0xPV19SQU1fR0IpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0RGF0YVBhcnRpdGlvbk1pbmltdW1TaXplKAorICAgICAgICAgICAgICAgICAgICAiQXBwbGljYXRpb24gZGF0YSIsIG1Db250ZXh0LmdldEZpbGVzRGlyKCksIE1JTl9BUFBfREFUQV9QQVJUSVRJT05fU0laRV9HQik7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKICAgICAgKiBAcmV0dXJuIHRoZSB0b3RhbCBtZW1vcnkgYWNjZXNzaWJsZSBieSB0aGUga2VybmVsIGFzIGRlZmluZWQgYnkKICAgICAgKiB7QGNvZGUgQWN0aXZpdHlNYW5hZ2VyLk1lbW9yeUluZm99LgpAQCAtMTQ2LDcgKzE4NCw3IEBACiAKICAgICAvKiogQHJldHVybiB0aGUgc2NyZWVuIHNpemUgYXMgZGVmaW5lZCBpbiB7QENvbmZpZ3VyYXRpb259LiAqLwogICAgIHByaXZhdGUgaW50IGdldFNjcmVlblNpemUoKSB7Ci0gICAgICAgIENvbmZpZ3VyYXRpb24gY29uZmlnID0gZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLmdldENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgQ29uZmlndXJhdGlvbiBjb25maWcgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRDb25maWd1cmF0aW9uKCk7CiAgICAgICAgIHJldHVybiBjb25maWcuc2NyZWVuTGF5b3V0ICYgQ29uZmlndXJhdGlvbi5TQ1JFRU5MQVlPVVRfU0laRV9NQVNLOwogICAgIH0KIApAQCAtMTk1LDQgKzIzMywxNiBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0RGF0YVBhcnRpdGlvbk1pbmltdW1TaXplKAorICAgICAgICAgICAgU3RyaW5nIHBhcnRpdGlvbk5hbWUsIEZpbGUgZmlsZUluUGFydGl0aW9uLCBmbG9hdCBtaW5QYXJ0aXRpb25TaXplR2IpIHsKKyAgICAgICAgU3RhdEZzIHN0YXRGcyA9IG5ldyBTdGF0RnMoZmlsZUluUGFydGl0aW9uLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgbG9uZyBzaXplID0gc3RhdEZzLmdldFRvdGFsQnl0ZXMoKTsKKyAgICAgICAgbG9uZyBtaW5TaXplQnl0ZXMgPSAobG9uZykgbWluUGFydGl0aW9uU2l6ZUdiICogR0JfVE9fQllURVNfTVVMVElQTElFUjsKKworICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIiVzIHBhcnRpdGlvbiBzaXplIGRvZXMgbm90IG1lZXQgcmVxdWlyZW1lbnQuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIkZvdW5kID0gJWQsIE1pbmltdW0gPSAlZCIsIHBhcnRpdGlvbk5hbWUsIHNpemUsIG1pblNpemVCeXRlcyksCisgICAgICAgICAgICAgICAgc2l6ZSA+IG1pblNpemVCeXRlcyk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvaGFyZHdhcmUvc3JjL2FuZHJvaWQvaGFyZHdhcmUvZmluZ2VycHJpbnQvY3RzL0ZpbmdlcnByaW50TWFuYWdlclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2hhcmR3YXJlL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2ZpbmdlcnByaW50L2N0cy9GaW5nZXJwcmludE1hbmFnZXJUZXN0LmphdmEKaW5kZXggYmRhOGMxMi4uZjExYjZiYyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvaGFyZHdhcmUvc3JjL2FuZHJvaWQvaGFyZHdhcmUvZmluZ2VycHJpbnQvY3RzL0ZpbmdlcnByaW50TWFuYWdlclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9oYXJkd2FyZS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9maW5nZXJwcmludC9jdHMvRmluZ2VycHJpbnRNYW5hZ2VyVGVzdC5qYXZhCkBAIC0yNCwxMiArMjQsOSBAQAogaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5QcmVzdWJtaXQ7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ2RkVGVzdDsKLQogLyoqCiAgKiBCYXNpYyB0ZXN0IGNhc2VzIGZvciBGaW5nZXJwcmludE1hbmFnZXIKICAqLwotQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuMy4xMC9DLTEtMiIpCiBwdWJsaWMgY2xhc3MgRmluZ2VycHJpbnRNYW5hZ2VyVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CiAgICAgcHJpdmF0ZSBlbnVtIEF1dGhTdGF0ZSB7CiAgICAgICAgIEFVVEhfVU5LTk9XTiwgQVVUSF9FUlJPUiwgQVVUSF9GQUlMRUQsIEFVVEhfU1VDQ0VFREVECkBAIC04NSw3ICs4Miw2IEBACiAgICAgICAgIGFzc2VydFRydWUoIWhhc0Vucm9sbGVkRmluZ2VycHJpbnRzKTsKICAgICB9CiAKLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iNy4zLjEwL0MtMS0yIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2F1dGhlbnRpY2F0ZU51bGxDYWxsYmFjaygpIHsKICAgICAgICAgaWYgKCFtSGFzRmluZ2VycHJpbnRNYW5hZ2VyKSB7CiAgICAgICAgICAgICByZXR1cm47IC8vIHNraXAgdGVzdCBpZiBubyBmaW5nZXJwcmludCBmZWF0dXJlCkBAIC0xMDMsNyArOTksNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuMy4xMC9DLTEtMiIpCiAgICAgcHVibGljIHZvaWQgdGVzdF9hdXRoZW50aWNhdGUoKSB7CiAgICAgICAgIGlmICghbUhhc0ZpbmdlcnByaW50TWFuYWdlcikgewogICAgICAgICAgICAgcmV0dXJuOyAvLyBza2lwIHRlc3QgaWYgbm8gZmluZ2VycHJpbnQgZmVhdHVyZQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvaGFyZHdhcmUvc3JjL2FuZHJvaWQvaGFyZHdhcmUvaW5wdXQvY3RzL3Rlc3RzL0dhbWVwYWRUZXN0Q2FzZS5qYXZhIGIvdGVzdHMvdGVzdHMvaGFyZHdhcmUvc3JjL2FuZHJvaWQvaGFyZHdhcmUvaW5wdXQvY3RzL3Rlc3RzL0dhbWVwYWRUZXN0Q2FzZS5qYXZhCmluZGV4IGU0NGJjYjQuLjQxNmVlNGQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2hhcmR3YXJlL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2lucHV0L2N0cy90ZXN0cy9HYW1lcGFkVGVzdENhc2UuamF2YQorKysgYi90ZXN0cy90ZXN0cy9oYXJkd2FyZS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9pbnB1dC9jdHMvdGVzdHMvR2FtZXBhZFRlc3RDYXNlLmphdmEKQEAgLTE1LDE1ICsxNSwxNSBAQAogICovCiAKIHBhY2thZ2UgYW5kcm9pZC5oYXJkd2FyZS5pbnB1dC5jdHMudGVzdHM7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jdHMuUjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKLWltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmN0cy5SOwotCiBAU21hbGxUZXN0CiBAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQogcHVibGljIGNsYXNzIEdhbWVwYWRUZXN0Q2FzZSBleHRlbmRzIElucHV0VGVzdENhc2UgewpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvaGFyZHdhcmUvc3JjL2FuZHJvaWQvaGFyZHdhcmUvaW5wdXQvY3RzL3Rlc3RzL0lucHV0VGVzdENhc2UuamF2YSBiL3Rlc3RzL3Rlc3RzL2hhcmR3YXJlL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2lucHV0L2N0cy90ZXN0cy9JbnB1dFRlc3RDYXNlLmphdmEKaW5kZXggMjdiYTA4MS4uMzE5MmRlNiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvaGFyZHdhcmUvc3JjL2FuZHJvaWQvaGFyZHdhcmUvaW5wdXQvY3RzL3Rlc3RzL0lucHV0VGVzdENhc2UuamF2YQorKysgYi90ZXN0cy90ZXN0cy9oYXJkd2FyZS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9pbnB1dC9jdHMvdGVzdHMvSW5wdXRUZXN0Q2FzZS5qYXZhCkBAIC0yNCwyMCArMjQsMTIgQEAKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmlucHV0LmN0cy5JbnB1dENhbGxiYWNrOwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuaW5wdXQuY3RzLklucHV0Q3RzQWN0aXZpdHk7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwogCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQmxvY2tpbmdRdWV1ZTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5MaW5rZWRCbG9ja2luZ1F1ZXVlOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CiAKIGltcG9ydCBsaWJjb3JlLmlvLklvVXRpbHM7CiAKQEAgLTQ1LDYgKzM3LDE1IEBACiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIAoraW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5CbG9ja2luZ1F1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkxpbmtlZEJsb2NraW5nUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKIHB1YmxpYyBjbGFzcyBJbnB1dFRlc3RDYXNlIHsKICAgICAvLyBoaWQgZXhlY3V0YWJsZSBleHBlY3RzICItIiBhcmd1bWVudCB0byByZWFkIGZyb20gc3RkaW4gaW5zdGVhZCBvZiBhIGZpbGUKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSElEX0NPTU1BTkQgPSAiaGlkIC0iOwpAQCAtMTAzLDYgKzEwNCw3IEBACiAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkbHkgaW50ZXJydXB0ZWQgd2hpbGUgd2FpdGluZyBmb3IgZGV2aWNlIGFkZGVkIG5vdGlmaWNhdGlvbi4iKTsKICAgICAgICAgfQorICAgICAgICBTeXN0ZW1DbG9jay5zbGVlcCgxMDApOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvaWN1L0FuZHJvaWQubWsgYi90ZXN0cy90ZXN0cy9pY3UvQW5kcm9pZC5tawppbmRleCA1YjgwYTM3Li4yMDRkOTdmIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9pY3UvQW5kcm9pZC5taworKysgYi90ZXN0cy90ZXN0cy9pY3UvQW5kcm9pZC5tawpAQCAtMzAsMTUgKzMwLDE0IEBACiAjIFRoZSBhaW0gb2YgdGhpcyBwYWNrYWdlIGlzIHRvIHJ1biB0ZXN0cyBhZ2FpbnN0IHRoZSBpbXBsZW1lbnRhdGlvbiBpbiB1c2UgYnkKICMgdGhlIGN1cnJlbnQgYW5kcm9pZCBzeXN0ZW0uCiBMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAotCWN0cy1jb3JlLXRlc3QtcnVubmVyIFwKKwljdHMtY29yZS10ZXN0LXJ1bm5lci1heHQgXAogCWFuZHJvaWQtaWN1NGotdGVzdHMKIAogIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAogTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKIAogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0ljdVRlc3RDYXNlcwotCi1MT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CitMT0NBTF9QUklWQVRFX1BMQVRGT1JNX0FQSVMgOj0gdHJ1ZQogCiBpbmNsdWRlICQoQlVJTERfQ1RTX1NVUFBPUlRfUEFDS0FHRSkKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvaWN1L0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy90ZXN0cy9pY3UvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCAxZGMwYTcwLi40MThjMjE1IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9pY3UvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9pY3UvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjIsNyArMjIsNyBAQAogICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KICAgICA8L2FwcGxpY2F0aW9uPgogCi0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5pY3UuY3RzIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIFJlcGFja2FnZWQgSUNVNEogbGlicmFyeSB0ZXN0cy4iLz4KIDwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9pY3UvQW5kcm9pZFRlc3QueG1sIGIvdGVzdHMvdGVzdHMvaWN1L0FuZHJvaWRUZXN0LnhtbAppbmRleCBiZTMzZmQyLi4wOGVmN2FhIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9pY3UvQW5kcm9pZFRlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL2ljdS9BbmRyb2lkVGVzdC54bWwKQEAgLTMxLDYgKzMxLDcgQEAKICAgICAgICAgPG9wdGlvbiBuYW1lPSJjb3JlLWV4cGVjdGF0aW9uIiB2YWx1ZT0iL2FuZHJvaWQvaWN1L2N0cy9leHBlY3RhdGlvbnMvaWN1LWtub3duLWZhaWx1cmVzLnR4dCIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJydW50aW1lLWhpbnQiIHZhbHVlPSIyMHMiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0iaW5jbHVkZS1hbm5vdGF0aW9uIiB2YWx1ZT0iYW5kcm9pZC5pY3UudGVzdHNoYXJkaW5nLkhpTWVtVGVzdFNoYXJkIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImhpZGRlbi1hcGktY2hlY2tzIiB2YWx1ZT0iZmFsc2UiLz4KICAgICA8L3Rlc3Q+CiAgICAgPCEtLSBUaGUgc2hhcmQgdXNlZCB0byBydW4gbW9zdCBJQ1UgdGVzdHMuIC0tPgogICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LnRlc3R0eXBlLkxpYmNvcmVUZXN0IiA+CkBAIC00MCw1ICs0MSw2IEBACiAgICAgICAgIDxvcHRpb24gbmFtZT0iY29yZS1leHBlY3RhdGlvbiIgdmFsdWU9Ii9hbmRyb2lkL2ljdS9jdHMvZXhwZWN0YXRpb25zL2ljdS1rbm93bi1mYWlsdXJlcy50eHQiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icnVudGltZS1oaW50IiB2YWx1ZT0iMThtIiAvPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImluY2x1ZGUtYW5ub3RhdGlvbiIgdmFsdWU9ImFuZHJvaWQuaWN1LnRlc3RzaGFyZGluZy5NYWluVGVzdFNoYXJkIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImhpZGRlbi1hcGktY2hlY2tzIiB2YWx1ZT0iZmFsc2UiLz4KICAgICA8L3Rlc3Q+CiA8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9pbmNpZGVudC9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvaW5jaWRlbnQvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMwOWM5OS4uMDAwMDAwMAotLS0gYS90ZXN0cy90ZXN0cy9pbmNpZGVudC9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi0jIGRvbid0IGluY2x1ZGUgdGhpcyBwYWNrYWdlIGluIGFueSB0YXJnZXQKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0jIGFuZCB3aGVuIGJ1aWx0IGV4cGxpY2l0bHkgcHV0IGl0IGluIHRoZSBkYXRhIHBhcnRpdGlvbgotTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKLQotTE9DQUxfU1JDX0ZJTEVTIDo9IFwKLSAgICAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKLQotTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0luY2lkZW50VGVzdENhc2VzCi0KLSMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCi0KLSNMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50Ci1MT0NBTF9KQVZBX0xJQlJBUklFUyArPSBhbmRyb2lkLnRlc3QucnVubmVyCi0KLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCi0gICAgICAgIGN0c3Rlc3RydW5uZXIgXAotCWxlZ2FjeS1hbmRyb2lkLXRlc3QKLQotaW5jbHVkZSAkKEJVSUxEX0NUU19QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvaW5jaWRlbnQvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL2luY2lkZW50L0FuZHJvaWRNYW5pZmVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNzYzMWMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvdGVzdHMvaW5jaWRlbnQvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBwYWNrYWdlPSJhbmRyb2lkLm9zLmluY2lkZW50LmN0cyI+Ci0KLSAgICA8YXBwbGljYXRpb24+Ci0gICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuV2hhdGV2ZXIiIC8+Ci0gICAgPC9hcHBsaWNhdGlvbj4KLQotICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgotICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLm9zLmluY2lkZW50LmN0cyIKLSAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBvZiBhbmRyb2lkLm9zIGluY2lkZW50IHJlcG9ydGluZyI+Ci0gICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJsaXN0ZW5lciIKLSAgICAgICAgICAgIGFuZHJvaWQ6dmFsdWU9ImNvbS5hbmRyb2lkLmN0cy5ydW5uZXIuQ3RzVGVzdFJ1bkxpc3RlbmVyIiAvPgotICAgIDwvaW5zdHJ1bWVudGF0aW9uPgotCi08L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvaW5jaWRlbnQvQW5kcm9pZFRlc3QueG1sIGIvdGVzdHMvdGVzdHMvaW5jaWRlbnQvQW5kcm9pZFRlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDJkYTNkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL3Rlc3RzL2luY2lkZW50L0FuZHJvaWRUZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlndXJhdGlvbiBmb3IgSW5jaWRlbnQgVGVzdHMiPgotICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJtZXRyaWNzIiAvPgotICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgotICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJDdHNJbmNpZGVudFRlc3RDYXNlcy5hcGsiIC8+Ci0gICAgPC90YXJnZXRfcHJlcGFyZXI+Ci0gICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkFuZHJvaWRKVW5pdFRlc3QiID4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJwYWNrYWdlIiB2YWx1ZT0iYW5kcm9pZC5vcy5pbmNpZGVudC5jdHMiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0icnVudGltZS1oaW50IiB2YWx1ZT0iNXMiIC8+Ci0gICAgPC90ZXN0PgotPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvaW5jaWRlbnQvc3JjL2FuZHJvaWQvb3MvY3RzL0luY2lkZW50U2V0dGluZ0Zvcm1hdFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2luY2lkZW50L3NyYy9hbmRyb2lkL29zL2N0cy9JbmNpZGVudFNldHRpbmdGb3JtYXRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ZDI2YTEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvdGVzdHMvaW5jaWRlbnQvc3JjL2FuZHJvaWQvb3MvY3RzL0luY2lkZW50U2V0dGluZ0Zvcm1hdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQub3MuaW5jaWRlbnQuY3RzOwotCi1pbXBvcnQgYW5kcm9pZC5vcy5JbmNpZGVudFJlcG9ydEFyZ3M7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKLQotLyoqCi0gKiBUZXN0IHRoZSBwYXJzaW5nIG9mIHRoZSBzdHJpbmcgSW5jaWRlbnRSZXBvcnRBcmdzIGZvcm1hdC4KLSAqLwotcHVibGljIGNsYXNzIEluY2lkZW50U2V0dGluZ0Zvcm1hdFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJJbmNpZGVudFNldHRpbmdGb3JtYXRUZXN0IjsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIEluY2lkZW50UmVwb3J0QXJncyBhcmdzID0gSW5jaWRlbnRSZXBvcnRBcmdzLnBhcnNlU2V0dGluZyhudWxsKTsKLSAgICAgICAgYXNzZXJ0TnVsbChhcmdzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgSW5jaWRlbnRSZXBvcnRBcmdzIGFyZ3MgPSBJbmNpZGVudFJlcG9ydEFyZ3MucGFyc2VTZXR0aW5nKCIiKTsKLSAgICAgICAgYXNzZXJ0TnVsbChhcmdzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3BhY2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIEluY2lkZW50UmVwb3J0QXJncyBhcmdzID0gSW5jaWRlbnRSZXBvcnRBcmdzLnBhcnNlU2V0dGluZygiIFxyXG5cdCIpOwotICAgICAgICBhc3NlcnROdWxsKGFyZ3MpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REaXNhYmxlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBJbmNpZGVudFJlcG9ydEFyZ3MgYXJncyA9IEluY2lkZW50UmVwb3J0QXJncy5wYXJzZVNldHRpbmcoIiBkaXNhYmxlZCAiKTsKLSAgICAgICAgYXNzZXJ0TnVsbChhcmdzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIEluY2lkZW50UmVwb3J0QXJncyBhcmdzID0gSW5jaWRlbnRSZXBvcnRBcmdzLnBhcnNlU2V0dGluZygiIGFsbCAiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShhcmdzLmlzQWxsKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROb25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIEluY2lkZW50UmVwb3J0QXJncyBhcmdzID0gSW5jaWRlbnRSZXBvcnRBcmdzLnBhcnNlU2V0dGluZygiIG5vbmUgIik7Ci0gICAgICAgIGFzc2VydEZhbHNlKGFyZ3MuaXNBbGwoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBhcmdzLnNlY3Rpb25Db3VudCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIEluY2lkZW50UmVwb3J0QXJncyBhcmdzID0gSW5jaWRlbnRSZXBvcnRBcmdzLnBhcnNlU2V0dGluZygiIDEgIik7Ci0gICAgICAgIGFzc2VydEZhbHNlKGFyZ3MuaXNBbGwoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBhcmdzLnNlY3Rpb25Db3VudCgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShhcmdzLmNvbnRhaW5zU2VjdGlvbigxKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNldmVyYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgSW5jaWRlbnRSZXBvcnRBcmdzIGFyZ3MgPSBJbmNpZGVudFJlcG9ydEFyZ3MucGFyc2VTZXR0aW5nKCIgMSwgMiwgLCAzLDQsNSwgNiwgNzgsICIpOwotICAgICAgICBhc3NlcnRGYWxzZShhcmdzLmlzQWxsKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNywgYXJncy5zZWN0aW9uQ291bnQoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoYXJncy5jb250YWluc1NlY3Rpb24oMSkpOwotICAgICAgICBhc3NlcnRUcnVlKGFyZ3MuY29udGFpbnNTZWN0aW9uKDIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShhcmdzLmNvbnRhaW5zU2VjdGlvbigzKSk7Ci0gICAgICAgIGFzc2VydFRydWUoYXJncy5jb250YWluc1NlY3Rpb24oNCkpOwotICAgICAgICBhc3NlcnRUcnVlKGFyZ3MuY29udGFpbnNTZWN0aW9uKDUpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShhcmdzLmNvbnRhaW5zU2VjdGlvbig2KSk7Ci0gICAgICAgIGFzc2VydFRydWUoYXJncy5jb250YWluc1NlY3Rpb24oNzgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0WmVybygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgZmluYWwgSW5jaWRlbnRSZXBvcnRBcmdzIGFyZ3MgPSBJbmNpZGVudFJlcG9ydEFyZ3MucGFyc2VTZXR0aW5nKCIgMCAiKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJwYXJzZVNldHRpbmcoXCIgMCBcIikgc2hvdWxkIGZhaWwgd2l0aCIKLSAgICAgICAgICAgICAgICAgICAgKyAiIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROZWdhdGl2ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgZmluYWwgSW5jaWRlbnRSZXBvcnRBcmdzIGFyZ3MgPSBJbmNpZGVudFJlcG9ydEFyZ3MucGFyc2VTZXR0aW5nKCIgLTEgIik7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigicGFyc2VTZXR0aW5nKFwiIC0xIFwiKSBzaG91bGQgZmFpbCB3aXRoIgotICAgICAgICAgICAgICAgICAgICArICIgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIik7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9pbmNpZGVudC9zcmMvYW5kcm9pZC9vcy9jdHMvSW5jaWRlbnRUZXN0cy5qYXZhIGIvdGVzdHMvdGVzdHMvaW5jaWRlbnQvc3JjL2FuZHJvaWQvb3MvY3RzL0luY2lkZW50VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcxODczOC4uMDAwMDAwMAotLS0gYS90ZXN0cy90ZXN0cy9pbmNpZGVudC9zcmMvYW5kcm9pZC9vcy9jdHMvSW5jaWRlbnRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5vcy5pbmNpZGVudC5jdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgSW5jaWRlbnRUZXN0cyB7Ci0gICAgcHVibGljIHN0YXRpYyBUZXN0U3VpdGUgc3VpdGUoKSB7Ci0gICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSW5jaWRlbnRUZXN0cy5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShJbmNpZGVudFNldHRpbmdGb3JtYXRUZXN0LmNsYXNzKTsKLQotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvam5pL0FuZHJvaWQubWsgYi90ZXN0cy90ZXN0cy9qbmkvQW5kcm9pZC5tawppbmRleCBjN2ZjZjBiLi45MTZmNTVlIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9qbmkvQW5kcm9pZC5taworKysgYi90ZXN0cy90ZXN0cy9qbmkvQW5kcm9pZC5tawpAQCAtMzAsOSArMzAsMTAgQEAKICMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKIExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiAKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjdHN0ZXN0cnVubmVyIGFuZHJvaWQtc3VwcG9ydC10ZXN0IGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjdHN0ZXN0cnVubmVyLWF4dCBhbmRyb2lkeC50ZXN0LnJ1bGVzCiAKIExPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgbGliam5pX3Rlc3RfZGxjbG9zZSBcCiAgIGxpYmpuaW5hbWVzcGFjZWExIFwKICAgbGliam5pbmFtZXNwYWNlYTIgXAogICBsaWJqbmluYW1lc3BhY2ViIFwKQEAgLTQzLDYgKzQ0LDcgQEAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIAogTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorTE9DQUxfTkRLX1NUTF9WQVJJQU5UIDo9IGMrK19zaGFyZWQKIAogaW5jbHVkZSAkKEJVSUxEX0NUU19QQUNLQUdFKQogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9qbmkvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL2puaS9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDI3MjQ1NzMuLmEzZjcxZmEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2puaS9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL2puaS9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yMyw3ICsyMyw3IEBACiAgICAgPC9hcHBsaWNhdGlvbj4KIAogICAgIDwhLS0gVGhpcyBpcyBhIHNlbGYtaW5zdHJ1bWVudGluZyB0ZXN0IHBhY2thZ2UuIC0tPgotICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuam5pLmN0cyIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBvZiBjYWxsaW5nIG5hdGl2ZSBjb2RlIHZpYSBKTkkiPgogICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0ibGlzdGVuZXIiCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9qbmkvQW5kcm9pZFRlc3QueG1sIGIvdGVzdHMvdGVzdHMvam5pL0FuZHJvaWRUZXN0LnhtbAppbmRleCA4NGNmMjM1Li5lNGFiMmRkIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9qbmkvQW5kcm9pZFRlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL2puaS9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBKTkkgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImFydCIgLz4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvam5pL2xpYmpuaWNvbW1vbi9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvam5pL2xpYmpuaWNvbW1vbi9BbmRyb2lkLm1rCmluZGV4IDBmODA0NGUuLjE0NDA2ZjMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2puaS9saWJqbmljb21tb24vQW5kcm9pZC5taworKysgYi90ZXN0cy90ZXN0cy9qbmkvbGliam5pY29tbW9uL0FuZHJvaWQubWsKQEAgLTI3LDExICsyNywxMyBAQAogCiBMT0NBTF9TUkNfRklMRVMgOj0gY29tbW9uLmNwcAogCitMT0NBTF9DRkxBR1MgOj0gLVdhbGwgLVdlcnJvcgorCiBMT0NBTF9DX0lOQ0xVREVTIDo9ICQoSk5JX0hfSU5DTFVERSkKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJkbCBsaWJsb2cgbGlibmF0aXZlaGVscGVyX2NvbXBhdF9saWJjKysKIAogTE9DQUxfU0RLX1ZFUlNJT04gOj0gMjMKLUxPQ0FMX05ES19TVExfVkFSSUFOVCA6PSBjKytfc3RhdGljCitMT0NBTF9OREtfU1RMX1ZBUklBTlQgOj0gYysrX3NoYXJlZAogCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9qbmkvbGliam5pbmFtZXNwYWNlYTEvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL2puaS9saWJqbmluYW1lc3BhY2VhMS9BbmRyb2lkLm1rCmluZGV4IDgwMTZjNTAuLjQxOWRiODIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2puaS9saWJqbmluYW1lc3BhY2VhMS9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3Rlc3RzL2puaS9saWJqbmluYW1lc3BhY2VhMS9BbmRyb2lkLm1rCkBAIC0yNywxMiArMjcsMTQgQEAKIAogTE9DQUxfU1JDX0ZJTEVTIDo9IG5hbWVzcGFjZWExLmNwcAogCitMT0NBTF9DRkxBR1MgOj0gLVdhbGwgLVdlcnJvcgorCiBMT0NBTF9DX0lOQ0xVREVTIDo9ICQoSk5JX0hfSU5DTFVERSkgJChMT0NBTF9QQVRIKS8uLi9saWJqbmljb21tb24vCiAKIExPQ0FMX0xETElCUyArPSAtbGxvZwogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJkbCBsaWJsb2cgbGlibmF0aXZlaGVscGVyX2NvbXBhdF9saWJjKysgbGliam5pY29tbW9uCiAKIExPQ0FMX1NES19WRVJTSU9OIDo9IDIzCi1MT0NBTF9OREtfU1RMX1ZBUklBTlQgOj0gYysrX3N0YXRpYworTE9DQUxfTkRLX1NUTF9WQVJJQU5UIDo9IGMrK19zaGFyZWQKIAogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvam5pL2xpYmpuaW5hbWVzcGFjZWExL25hbWVzcGFjZWExLmNwcCBiL3Rlc3RzL3Rlc3RzL2puaS9saWJqbmluYW1lc3BhY2VhMS9uYW1lc3BhY2VhMS5jcHAKaW5kZXggZGVjYjRmMS4uOGE3OWMzYyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvam5pL2xpYmpuaW5hbWVzcGFjZWExL25hbWVzcGFjZWExLmNwcAorKysgYi90ZXN0cy90ZXN0cy9qbmkvbGliam5pbmFtZXNwYWNlYTEvbmFtZXNwYWNlYTEuY3BwCkBAIC0xOCw3ICsxOCw3IEBACiAKICNpbmNsdWRlIDxhbmRyb2lkL2xvZy5oPgogI2luY2x1ZGUgPGpuaS5oPgotI2luY2x1ZGUgPEpOSUhlbHAuaD4KKyNpbmNsdWRlIDxuYXRpdmVoZWxwZXIvSk5JSGVscC5oPgogCiAjZGVmaW5lICBMT0dJKC4uLikgIF9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfSU5GTywibmFtZXNwYWNlYTEiLF9fVkFfQVJHU19fKQogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9qbmkvbGliam5pbmFtZXNwYWNlYTIvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL2puaS9saWJqbmluYW1lc3BhY2VhMi9BbmRyb2lkLm1rCmluZGV4IDliNTE1YzkuLjI3ODFhODEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2puaS9saWJqbmluYW1lc3BhY2VhMi9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3Rlc3RzL2puaS9saWJqbmluYW1lc3BhY2VhMi9BbmRyb2lkLm1rCkBAIC0yNywxMiArMjcsMTQgQEAKIAogTE9DQUxfU1JDX0ZJTEVTIDo9IG5hbWVzcGFjZWEyLmNwcAogCitMT0NBTF9DRkxBR1MgOj0gLVdhbGwgLVdlcnJvcgorCiBMT0NBTF9DX0lOQ0xVREVTIDo9ICQoSk5JX0hfSU5DTFVERSkgJChMT0NBTF9QQVRIKS8uLi9saWJqbmljb21tb24vCiAKIExPQ0FMX0xETElCUyArPSAtbGxvZwogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJkbCBsaWJsb2cgbGlibmF0aXZlaGVscGVyX2NvbXBhdF9saWJjKysgbGliam5pY29tbW9uCiAKIExPQ0FMX1NES19WRVJTSU9OIDo9IDIzCi1MT0NBTF9OREtfU1RMX1ZBUklBTlQgOj0gYysrX3N0YXRpYworTE9DQUxfTkRLX1NUTF9WQVJJQU5UIDo9IGMrK19zaGFyZWQKIAogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvam5pL2xpYmpuaW5hbWVzcGFjZWEyL25hbWVzcGFjZWEyLmNwcCBiL3Rlc3RzL3Rlc3RzL2puaS9saWJqbmluYW1lc3BhY2VhMi9uYW1lc3BhY2VhMi5jcHAKaW5kZXggODA5MjY2ZS4uNDlmMDU1ZSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvam5pL2xpYmpuaW5hbWVzcGFjZWEyL25hbWVzcGFjZWEyLmNwcAorKysgYi90ZXN0cy90ZXN0cy9qbmkvbGliam5pbmFtZXNwYWNlYTIvbmFtZXNwYWNlYTIuY3BwCkBAIC0xOCw3ICsxOCw3IEBACiAKICNpbmNsdWRlIDxhbmRyb2lkL2xvZy5oPgogI2luY2x1ZGUgPGpuaS5oPgotI2luY2x1ZGUgPEpOSUhlbHAuaD4KKyNpbmNsdWRlIDxuYXRpdmVoZWxwZXIvSk5JSGVscC5oPgogCiAjZGVmaW5lICBMT0dJKC4uLikgIF9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfSU5GTywibmFtZXNwYWNlYTIiLF9fVkFfQVJHU19fKQogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9qbmkvbGliam5pbmFtZXNwYWNlYi9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvam5pL2xpYmpuaW5hbWVzcGFjZWIvQW5kcm9pZC5tawppbmRleCA0ZDNlMTU4Li5lOTFiYTU5IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9qbmkvbGliam5pbmFtZXNwYWNlYi9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3Rlc3RzL2puaS9saWJqbmluYW1lc3BhY2ViL0FuZHJvaWQubWsKQEAgLTI3LDEyICsyNywxNCBAQAogCiBMT0NBTF9TUkNfRklMRVMgOj0gbmFtZXNwYWNlYi5jcHAKIAorTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IKKwogTE9DQUxfQ19JTkNMVURFUyA6PSAkKEpOSV9IX0lOQ0xVREUpICQoTE9DQUxfUEFUSCkvLi4vbGliam5pY29tbW9uLwogCiBMT0NBTF9MRExJQlMgKz0gLWxsb2cKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliZGwgbGlibG9nIGxpYm5hdGl2ZWhlbHBlcl9jb21wYXRfbGliYysrIGxpYmpuaWNvbW1vbgogCiBMT0NBTF9TREtfVkVSU0lPTiA6PSAyMwotTE9DQUxfTkRLX1NUTF9WQVJJQU5UIDo9IGMrK19zdGF0aWMKK0xPQ0FMX05ES19TVExfVkFSSUFOVCA6PSBjKytfc2hhcmVkCiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2puaS9saWJqbmluYW1lc3BhY2ViL25hbWVzcGFjZWIuY3BwIGIvdGVzdHMvdGVzdHMvam5pL2xpYmpuaW5hbWVzcGFjZWIvbmFtZXNwYWNlYi5jcHAKaW5kZXggYjNiZWRjYi4uNGM0ODYyNyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvam5pL2xpYmpuaW5hbWVzcGFjZWIvbmFtZXNwYWNlYi5jcHAKKysrIGIvdGVzdHMvdGVzdHMvam5pL2xpYmpuaW5hbWVzcGFjZWIvbmFtZXNwYWNlYi5jcHAKQEAgLTE4LDcgKzE4LDcgQEAKIAogI2luY2x1ZGUgPGFuZHJvaWQvbG9nLmg+CiAjaW5jbHVkZSA8am5pLmg+Ci0jaW5jbHVkZSA8Sk5JSGVscC5oPgorI2luY2x1ZGUgPG5hdGl2ZWhlbHBlci9KTklIZWxwLmg+CiAKICNkZWZpbmUgIExPR0koLi4uKSAgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19JTkZPLCJuYW1lc3BhY2ViIixfX1ZBX0FSR1NfXykKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvam5pL2xpYmpuaXRlc3QvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL2puaS9saWJqbml0ZXN0L0FuZHJvaWQubWsKaW5kZXggMDcwMzcyMi4uMzUxYzdmOSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvam5pL2xpYmpuaXRlc3QvQW5kcm9pZC5taworKysgYi90ZXN0cy90ZXN0cy9qbmkvbGliam5pdGVzdC9BbmRyb2lkLm1rCkBAIC0yNiw2ICsyNiw3IEBACiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAogCiBMT0NBTF9TUkNfRklMRVMgOj0gXAorCWFuZHJvaWRfam5pX2N0c19CYXNpY0xvYWRlclRlc3QuY3BwIFwKIAlhbmRyb2lkX2puaV9jdHNfSW5zdGFuY2VOb25jZS5jIFwKIAlhbmRyb2lkX2puaV9jdHNfSm5pQ1Rlc3QuYyBcCiAJYW5kcm9pZF9qbmlfY3RzX0puaUNwcFRlc3QuY3BwIFwKQEAgLTM3LDExICszOCwyOCBAQAogCiBMT0NBTF9DX0lOQ0xVREVTIDo9ICQoSk5JX0hfSU5DTFVERSkKIAorTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJiYXNlX25kaworCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmRsIGxpYmxvZyBsaWJuYXRpdmVoZWxwZXJfY29tcGF0X2xpYmMrKwogCiBMT0NBTF9TREtfVkVSU0lPTiA6PSAyMwogTE9DQUxfTkRLX1NUTF9WQVJJQU5UIDo9IGMrK19zdGF0aWMKIAotTE9DQUxfQ0ZMQUdTIDo9IC1Xbm8tdW51c2VkLXBhcmFtZXRlcgorTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IgLVduby11bnVzZWQtcGFyYW1ldGVyCitMT0NBTF9DRkxBR1MgKz0gLVduby1mb3JtYXQgLVduby1nbnUtZGVzaWduYXRvcgorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEUgOj0gbGliam5pX3Rlc3RfZGxjbG9zZQorCitMT0NBTF9TUkNfRklMRVMgOj0gdGF4aWNhYl9udW1iZXIuY3BwCisKK0xPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2Vycm9yCisKK0xPQ0FMX1NES19WRVJTSU9OIDo9IDIzCisKK0xPQ0FMX05ES19TVExfVkFSSUFOVCA6PSBjKytfc3RhdGljCiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2puaS9saWJqbml0ZXN0L2FuZHJvaWRfam5pX2N0c19CYXNpY0xvYWRlclRlc3QuY3BwIGIvdGVzdHMvdGVzdHMvam5pL2xpYmpuaXRlc3QvYW5kcm9pZF9qbmlfY3RzX0Jhc2ljTG9hZGVyVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA0Y2Q0ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2puaS9saWJqbml0ZXN0L2FuZHJvaWRfam5pX2N0c19CYXNpY0xvYWRlclRlc3QuY3BwCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogVGVzdHMgYWNjZXNzaWJpbGl0eSBvZiBwbGF0Zm9ybSBuYXRpdmUgbGlicmFyaWVzCisgKi8KKworI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSA8am5pLmg+CisjaW5jbHVkZSA8bGliZ2VuLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAibmF0aXZlaGVscGVyL0pOSUhlbHAuaCIKKyNpbmNsdWRlICJuYXRpdmVoZWxwZXIvU2NvcGVkTG9jYWxSZWYuaCIKKyNpbmNsdWRlICJuYXRpdmVoZWxwZXIvU2NvcGVkVXRmQ2hhcnMuaCIKKworc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyKiBrVGVzdExpYk5hbWUgPSAibGliam5pX3Rlc3RfZGxjbG9zZS5zbyI7CisKK3N0YXRpYyBib29sIHJ1bl90ZXN0KHN0ZDo6c3RyaW5nKiBlcnJvcl9tc2cpIHsKKyAgdm9pZCogaGFuZGxlID0gZGxvcGVuKGtUZXN0TGliTmFtZSwgUlRMRF9OT1cpOworICBpZiAoaGFuZGxlID09IG51bGxwdHIpIHsKKyAgICAqZXJyb3JfbXNnID0gZGxlcnJvcigpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHZvaWQqIHRheGljYWJfbnVtYmVyID0gZGxzeW0oaGFuZGxlLCAiZGxvcGVuX3Rlc3RsaWJfdGF4aWNhYl9udW1iZXIiKTsKKyAgaWYgKHRheGljYWJfbnVtYmVyID09IG51bGxwdHIpIHsKKyAgICAqZXJyb3JfbXNnID0gZGxlcnJvcigpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGRsY2xvc2UoaGFuZGxlKTsKKworICB1aW50cHRyX3QgcGFnZV9zdGFydCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90Pih0YXhpY2FiX251bWJlcikgJiB+KFBBR0VfU0laRSAtIDEpOworICBpZiAobXByb3RlY3QocmVpbnRlcnByZXRfY2FzdDx2b2lkKj4ocGFnZV9zdGFydCksIFBBR0VfU0laRSwgUFJPVF9OT05FKSA9PSAwKSB7CisgICAgKmVycm9yX21zZyA9IHN0ZDo6c3RyaW5nKCJUaGUgbGlicmFyeSBcIiIpICsKKyAgICAgICAgICAgICAgICAga1Rlc3RMaWJOYW1lICsKKyAgICAgICAgICAgICAgICAgIlwiIGhhcyBub3QgYmVlbiB1bmxvYWRlZCBvbiBkbGNsb3NlKCkiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmIChlcnJubyAhPSBFTk9NRU0pIHsKKyAgICAqZXJyb3JfbXNnID0gc3RkOjpzdHJpbmcoIlVuZXhwZWN0ZWQgZXJyb3Igb24gbXByb3RlY3Q6ICIpICsgc3RyZXJyb3IoZXJybm8pOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCitleHRlcm4gIkMiIEpOSUVYUE9SVCBqc3RyaW5nIEpOSUNBTEwgSmF2YV9hbmRyb2lkX2puaV9jdHNfQmFzaWNMb2FkZXJUZXN0SGVscGVyX25hdGl2ZVJ1blRlc3RzKAorICAgICAgICBKTklFbnYqIGVudikgeworICBzdGQ6OnN0cmluZyBlcnJvcl9zdHI7CisKKyAgaWYgKCFydW5fdGVzdCgmZXJyb3Jfc3RyKSkgeworICAgIHJldHVybiBlbnYtPk5ld1N0cmluZ1VURihlcnJvcl9zdHIuY19zdHIoKSk7CisgIH0KKworICByZXR1cm4gbnVsbHB0cjsKK30KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvam5pL2xpYmpuaXRlc3QvYW5kcm9pZF9qbmlfY3RzX0luc3RhbmNlTm9uY2UuYyBiL3Rlc3RzL3Rlc3RzL2puaS9saWJqbml0ZXN0L2FuZHJvaWRfam5pX2N0c19JbnN0YW5jZU5vbmNlLmMKaW5kZXggM2ZkYTgyYS4uY2I0NGI0MiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvam5pL2xpYmpuaXRlc3QvYW5kcm9pZF9qbmlfY3RzX0luc3RhbmNlTm9uY2UuYworKysgYi90ZXN0cy90ZXN0cy9qbmkvbGliam5pdGVzdC9hbmRyb2lkX2puaV9jdHNfSW5zdGFuY2VOb25jZS5jCkBAIC0yMCw3ICsyMCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGpuaS5oPgotI2luY2x1ZGUgPEpOSUhlbHAuaD4KKyNpbmNsdWRlIDxuYXRpdmVoZWxwZXIvSk5JSGVscC5oPgogCiAjaW5jbHVkZSA8c3RkYm9vbC5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvam5pL2xpYmpuaXRlc3QvYW5kcm9pZF9qbmlfY3RzX0puaUNUZXN0LmMgYi90ZXN0cy90ZXN0cy9qbmkvbGliam5pdGVzdC9hbmRyb2lkX2puaV9jdHNfSm5pQ1Rlc3QuYwppbmRleCAyMzI3OGRjLi5jY2E1MzgzIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9qbmkvbGliam5pdGVzdC9hbmRyb2lkX2puaV9jdHNfSm5pQ1Rlc3QuYworKysgYi90ZXN0cy90ZXN0cy9qbmkvbGliam5pdGVzdC9hbmRyb2lkX2puaV9jdHNfSm5pQ1Rlc3QuYwpAQCAtMTksNyArMTksNyBAQAogICovCiAKICNpbmNsdWRlIDxqbmkuaD4KLSNpbmNsdWRlIDxKTklIZWxwLmg+CisjaW5jbHVkZSA8bmF0aXZlaGVscGVyL0pOSUhlbHAuaD4KIAogCiAvKgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvam5pL2xpYmpuaXRlc3QvYW5kcm9pZF9qbmlfY3RzX0puaUNwcFRlc3QuY3BwIGIvdGVzdHMvdGVzdHMvam5pL2xpYmpuaXRlc3QvYW5kcm9pZF9qbmlfY3RzX0puaUNwcFRlc3QuY3BwCmluZGV4IDM4ODI5YTAuLmIwOTM3ZjQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2puaS9saWJqbml0ZXN0L2FuZHJvaWRfam5pX2N0c19KbmlDcHBUZXN0LmNwcAorKysgYi90ZXN0cy90ZXN0cy9qbmkvbGliam5pdGVzdC9hbmRyb2lkX2puaV9jdHNfSm5pQ3BwVGVzdC5jcHAKQEAgLTE5LDcgKzE5LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8am5pLmg+Ci0jaW5jbHVkZSA8Sk5JSGVscC5oPgorI2luY2x1ZGUgPG5hdGl2ZWhlbHBlci9KTklIZWxwLmg+CiAKIAogLyoKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2puaS9saWJqbml0ZXN0L2FuZHJvaWRfam5pX2N0c19KbmlTdGF0aWNUZXN0LmNwcCBiL3Rlc3RzL3Rlc3RzL2puaS9saWJqbml0ZXN0L2FuZHJvaWRfam5pX2N0c19KbmlTdGF0aWNUZXN0LmNwcAppbmRleCA1ZThiZWEwLi5hYTU2NTFmIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9qbmkvbGliam5pdGVzdC9hbmRyb2lkX2puaV9jdHNfSm5pU3RhdGljVGVzdC5jcHAKKysrIGIvdGVzdHMvdGVzdHMvam5pL2xpYmpuaXRlc3QvYW5kcm9pZF9qbmlfY3RzX0puaVN0YXRpY1Rlc3QuY3BwCkBAIC0xOSw3ICsxOSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGpuaS5oPgotI2luY2x1ZGUgPEpOSUhlbHAuaD4KKyNpbmNsdWRlIDxuYXRpdmVoZWxwZXIvSk5JSGVscC5oPgogCiBleHRlcm4gIkMiIEpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9hbmRyb2lkX2puaV9jdHNfQ2xhc3NMb2FkZXJIZWxwZXJfbmF0aXZlR2V0SGFzaENvZGUoCiAgICAgICAgIEpOSUVudiogZW52LApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvam5pL2xpYmpuaXRlc3QvYW5kcm9pZF9qbmlfY3RzX0xpbmtlck5hbWVzcGFjZXNUZXN0LmNwcCBiL3Rlc3RzL3Rlc3RzL2puaS9saWJqbml0ZXN0L2FuZHJvaWRfam5pX2N0c19MaW5rZXJOYW1lc3BhY2VzVGVzdC5jcHAKaW5kZXggYjJhZjRkZi4uY2VjMjcyMyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvam5pL2xpYmpuaXRlc3QvYW5kcm9pZF9qbmlfY3RzX0xpbmtlck5hbWVzcGFjZXNUZXN0LmNwcAorKysgYi90ZXN0cy90ZXN0cy9qbmkvbGliam5pdGVzdC9hbmRyb2lkX2puaV9jdHNfTGlua2VyTmFtZXNwYWNlc1Rlc3QuY3BwCkBAIC0yMiwyNyArMjIsMzAgQEAKICNpbmNsdWRlIDxkbGZjbi5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CiAjaW5jbHVkZSA8am5pLmg+Ci0jaW5jbHVkZSA8Sk5JSGVscC5oPgogI2luY2x1ZGUgPGxpYmdlbi5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKLSNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPHF1ZXVlPgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgogI2luY2x1ZGUgPHZlY3Rvcj4KIAotI2luY2x1ZGUgIlNjb3BlZExvY2FsUmVmLmgiCi0jaW5jbHVkZSAiU2NvcGVkVXRmQ2hhcnMuaCIKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oPgorI2luY2x1ZGUgPG5hdGl2ZWhlbHBlci9KTklIZWxwLmg+CisjaW5jbHVkZSA8bmF0aXZlaGVscGVyL1Njb3BlZExvY2FsUmVmLmg+CisjaW5jbHVkZSA8bmF0aXZlaGVscGVyL1Njb3BlZFV0ZkNoYXJzLmg+CiAKICNpZiBkZWZpbmVkKF9fTFA2NF9fKQogc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtTeXN0ZW1MaWJyYXJ5UGF0aCA9ICIvc3lzdGVtL2xpYjY0IjsKIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVmVuZG9yTGlicmFyeVBhdGggPSAiL3ZlbmRvci9saWI2NCI7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1Byb2R1Y3RMaWJyYXJ5UGF0aCA9ICIvcHJvZHVjdC9saWI2NCI7CiAjZWxzZQogc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtTeXN0ZW1MaWJyYXJ5UGF0aCA9ICIvc3lzdGVtL2xpYiI7CiBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1ZlbmRvckxpYnJhcnlQYXRoID0gIi92ZW5kb3IvbGliIjsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrUHJvZHVjdExpYnJhcnlQYXRoID0gIi9wcm9kdWN0L2xpYiI7CiAjZW5kaWYKIAogLy8gVGhpcyBpcyBub3QgdGhlIGNvbXBsZXRlIGxpc3QgLSBqdXN0IGEgc21hbGwgc3Vic2V0CkBAIC02NiwyNCArNjksMjMgQEAKICAgICAibGlidm9yYmlzaWRlYy5zbyIsCiAgIH07CiAKLXN0YXRpYyBib29sIGlzX2RpcmVjdG9yeShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCkgeworc3RhdGljIGJvb2wgaXNfZGlyZWN0b3J5KGNvbnN0IGNoYXIqIHBhdGgpIHsKICAgc3RydWN0IHN0YXQgc2I7Ci0gIGlmIChzdGF0KHBhdGguY19zdHIoKSwgJnNiKSAhPSAtMSkgeworICBpZiAoc3RhdChwYXRoLCAmc2IpICE9IC0xKSB7CiAgICAgcmV0dXJuIFNfSVNESVIoc2Iuc3RfbW9kZSk7CiAgIH0KIAogICByZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXRpYyBib29sIG5vdF9hY2Nlc3NpYmxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBsaWJyYXJ5LCBjb25zdCBzdGQ6OnN0cmluZyYgZXJyKSB7Ci0gIHJldHVybiBlcnIuZmluZCgiZGxvcGVuIGZhaWxlZDogbGlicmFyeSBcIiIgKyBsaWJyYXJ5ICsgIlwiIikgPT0gMCAmJgotICAgICAgICAgKGVyci5maW5kKCJpcyBub3QgYWNjZXNzaWJsZSBmb3IgdGhlIG5hbWVzcGFjZSBcImNsYXNzbG9hZGVyLW5hbWVzcGFjZVwiIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MgfHwKLSAgICAgICAgICBlcnIuZmluZCgiaXMgbm90IGFjY2Vzc2libGUgZm9yIHRoZSBuYW1lc3BhY2UgXCJzcGhhbFwiIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MgfHwKLSAgICAgICAgICBlcnIuZmluZCgiaXMgbm90IGFjY2Vzc2libGUgZm9yIHRoZSBuYW1lc3BhY2UgXCIoZGVmYXVsdClcIiIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKTsKK3N0YXRpYyBib29sIG5vdF9hY2Nlc3NpYmxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBlcnIpIHsKKyAgcmV0dXJuIGVyci5maW5kKCJkbG9wZW4gZmFpbGVkOiBsaWJyYXJ5IFwiIikgPT0gMCAmJgorICAgICAgICAgZXJyLmZpbmQoImlzIG5vdCBhY2Nlc3NpYmxlIGZvciB0aGUgbmFtZXNwYWNlIFwiY2xhc3Nsb2FkZXItbmFtZXNwYWNlXCIiKSAhPSBzdGQ6OnN0cmluZzo6bnBvczsKIH0KIAotc3RhdGljIGJvb2wgbm90X2ZvdW5kKGNvbnN0IHN0ZDo6c3RyaW5nJiBsaWJyYXJ5LCBjb25zdCBzdGQ6OnN0cmluZyYgZXJyKSB7Ci0gIHJldHVybiBlcnIgPT0gImRsb3BlbiBmYWlsZWQ6IGxpYnJhcnkgXCIiICsgbGlicmFyeSArICJcIiBub3QgZm91bmQiOworc3RhdGljIGJvb2wgbm90X2ZvdW5kKGNvbnN0IHN0ZDo6c3RyaW5nJiBlcnIpIHsKKyAgcmV0dXJuIGVyci5maW5kKCJkbG9wZW4gZmFpbGVkOiBsaWJyYXJ5IFwiIikgPT0gMCAmJgorICAgICAgICAgZXJyLmZpbmQoIlwiIG5vdCBmb3VuZCIpICE9IHN0ZDo6c3RyaW5nOjpucG9zOwogfQogCiBzdGF0aWMgYm9vbCB3cm9uZ19hcmNoKGNvbnN0IHN0ZDo6c3RyaW5nJiBsaWJyYXJ5LCBjb25zdCBzdGQ6OnN0cmluZyYgZXJyKSB7CkBAIC05Myw2OCArOTUsNDEgQEAKICAgcmV0dXJuIGVyci5maW5kKCJkbG9wZW4gZmFpbGVkOiBcIiIgKyBsaWJyYXJ5ICsgIlwiIGhhcyB1bmV4cGVjdGVkIGVfbWFjaGluZTogIikgPT0gMDsKIH0KIAotLy8gY29waWVkIGZyb20gc3lzdGVtL2NvcmUvYmFzZS9zdHJpbmdzLmNwcDsgbGliYmFzZSBpc24ndCBhdmFpbGFibGUgaGVyZQotc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzcGxpdChjb25zdCBzdGQ6OnN0cmluZyYgcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGVsaW1pdGVycykgewotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcmVzdWx0OwotCi0gIHNpemVfdCBiYXNlID0gMDsKLSAgc2l6ZV90IGZvdW5kOwotICB3aGlsZSAodHJ1ZSkgewotICAgIGZvdW5kID0gcy5maW5kX2ZpcnN0X29mKGRlbGltaXRlcnMsIGJhc2UpOwotICAgIHJlc3VsdC5wdXNoX2JhY2socy5zdWJzdHIoYmFzZSwgZm91bmQgLSBiYXNlKSk7Ci0gICAgaWYgKGZvdW5kID09IHMubnBvcykgYnJlYWs7Ci0gICAgYmFzZSA9IGZvdW5kICsgMTsKLSAgfQotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBib29sIGluX2xkX3ByZWxvYWQoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpIHsKLSAgc3RhdGljIGNvbnN0IGNoYXIqIGxkX3ByZWxvYWQgPSBnZXRlbnYoIkxEX1BSRUxPQUQiKTsKLSAgaWYgKGxkX3ByZWxvYWQgIT0gbnVsbHB0cikgewotICAgIC8vICcgJyBoYXMgYWxzbyBiZWVuIGFsbG93ZWQgaW4gTERfUFJFTE9BRCBhcyB3ZWxsIGFzICc6JwotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBsZF9wcmVsb2FkX25hbWVzID1zcGxpdChsZF9wcmVsb2FkLCAiIDoiKTsKLSAgICBhdXRvIHJlc3VsdCA9IHN0ZDo6ZmluZF9pZihsZF9wcmVsb2FkX25hbWVzLmJlZ2luKCksIGxkX3ByZWxvYWRfbmFtZXMuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZwYXRoXShjb25zdCBzdGQ6OnN0cmluZyYgcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMgPT0gcGF0aCB8fCBzID09IHN0ZDo6c3RyaW5nKGJhc2VuYW1lKHBhdGguY19zdHIoKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgIHJldHVybiByZXN1bHQgIT0gbGRfcHJlbG9hZF9uYW1lcy5lbmQoKTsKLSAgfQotICByZXR1cm4gZmFsc2U7CitzdGF0aWMgYm9vbCBpc19saWJyYXJ5X29uX3BhdGgoY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPiYgbGlicmFyeV9zZWFyY2hfcGF0aHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGJhc2VsaWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpIHsKKyAgc3RkOjpzdHJpbmcgdGFpbCA9ICcvJyArIGJhc2VsaWI7CisgIGlmICghYW5kcm9pZDo6YmFzZTo6RW5kc1dpdGgocGF0aCwgdGFpbCkpIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIGxpYnJhcnlfc2VhcmNoX3BhdGhzLmNvdW50KHBhdGguc3Vic3RyKDAsIHBhdGguc2l6ZSgpIC0gdGFpbC5zaXplKCkpKSA+IDA7CiB9CiAKIHN0YXRpYyBib29sIGNoZWNrX2xpYihjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbGlicmFyeV9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4mIGxpYnJhcnlfc2VhcmNoX3BhdGhzLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4mIGxpYnJhcmllcywKICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIGVycm9ycykgewotICBzdGQ6OnVuaXF1ZV9wdHI8dm9pZCwgaW50ICgqKSh2b2lkKik+IGhhbmRsZShkbG9wZW4ocGF0aC5jX3N0cigpLCBSVExEX05PVyksIGRsY2xvc2UpOworICBzdGQ6OnVuaXF1ZV9wdHI8dm9pZCwgZGVjbHR5cGUoJmRsY2xvc2UpPiBoYW5kbGUoZGxvcGVuKHBhdGguY19zdHIoKSwgUlRMRF9OT1cpLCBkbGNsb3NlKTsKIAogICAvLyBUaGUgY3VycmVudCByZXN0cmljdGlvbnMgb24gcHVibGljIGxpYnJhcmllczoKLSAgLy8gIC0gSXQgbXVzdCBleGlzdCBvbmx5IGluIHRoZSB0b3AgbGV2ZWwgZGlyZWN0b3J5IG9mICJsaWJyYXJ5X3BhdGgiLgorICAvLyAgLSBJdCBtdXN0IGV4aXN0IG9ubHkgaW4gdGhlIHRvcCBsZXZlbCBkaXJlY3Rvcnkgb2YgImxpYnJhcnlfc2VhcmNoX3BhdGhzIi4KICAgLy8gIC0gTm8gbGlicmFyeSB3aXRoIHRoZSBzYW1lIG5hbWUgY2FuIGJlIGZvdW5kIGluIGEgc3ViIGRpcmVjdG9yeS4KICAgLy8gIC0gRWFjaCBwdWJsaWMgbGlicmFyeSBkb2VzIG5vdCBjb250YWluIGFueSBkaXJlY3RvcnkgY29tcG9uZW50cy4KIAogICAvLyBDaGVjayBpZiB0aGlzIGxpYnJhcnkgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSBwdWJsaWMgbGlicmFyeS4KICAgc3RkOjpzdHJpbmcgYmFzZWxpYiA9IGJhc2VuYW1lKHBhdGguY19zdHIoKSk7CiAgIGlmIChsaWJyYXJpZXMuZmluZChiYXNlbGliKSAhPSBsaWJyYXJpZXMuZW5kKCkgJiYKLSAgICAgIGxpYnJhcnlfcGF0aCArICIvIiArIGJhc2VsaWIgPT0gcGF0aCkgeworICAgICAgaXNfbGlicmFyeV9vbl9wYXRoKGxpYnJhcnlfc2VhcmNoX3BhdGhzLCBiYXNlbGliLCBwYXRoKSkgewogICAgIGlmIChoYW5kbGUuZ2V0KCkgPT0gbnVsbHB0cikgewogICAgICAgZXJyb3JzLT5wdXNoX2JhY2soIlRoZSBsaWJyYXJ5IFwiIiArIHBhdGggKwogICAgICAgICAgICAgICAgICAgICAgICAgIlwiIGlzIGEgcHVibGljIGxpYnJhcnkgYnV0IGl0IGNhbm5vdCBiZSBsb2FkZWQ6ICIgKyBkbGVycm9yKCkpOwogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgfSBlbHNlIGlmIChoYW5kbGUuZ2V0KCkgIT0gbnVsbHB0cikgewotICAgIC8vIExEX1BSRUxPQUQgbGlicyBhcmUgc2hhcmVkIHRvIHRoZSBjbGFzc2xvYWRlci1uYW1lc3BhY2UuIFNvLCBhY2Nlc3MgdG8KLSAgICAvLyB0aGUgbGliIGlzIG9rYXkgZXZlbiB3aGVuIHRoZSBsaWIgaXMgbm90IGEgcHVibGljIGxpYnJhcnkuCi0gICAgaWYgKCFpbl9sZF9wcmVsb2FkKHBhdGgpKSB7Ci0gICAgICBlcnJvcnMtPnB1c2hfYmFjaygiVGhlIGxpYnJhcnkgXCIiICsgcGF0aCArICJcIiBpcyBub3QgYSBwdWJsaWMgbGlicmFyeSBidXQgaXQgbG9hZGVkLiIpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KKyAgICBlcnJvcnMtPnB1c2hfYmFjaygiVGhlIGxpYnJhcnkgXCIiICsgcGF0aCArICJcIiBpcyBub3QgYSBwdWJsaWMgbGlicmFyeSBidXQgaXQgbG9hZGVkLiIpOworICAgIHJldHVybiBmYWxzZTsKICAgfSBlbHNlIHsgLy8gKGhhbmRsZSA9PSBudWxscHRyICYmICFzaG91bGRCZUFjY2Vzc2libGUocGF0aCkpCiAgICAgLy8gQ2hlY2sgdGhlIGVycm9yIG1lc3NhZ2UKICAgICBzdGQ6OnN0cmluZyBlcnIgPSBkbGVycm9yKCk7Ci0gICAgaWYgKCFub3RfYWNjZXNzaWJsZShwYXRoLCBlcnIpICYmICFub3RfZm91bmQocGF0aCwgZXJyKSAmJiAhd3JvbmdfYXJjaChwYXRoLCBlcnIpKSB7CisgICAgaWYgKCFub3RfYWNjZXNzaWJsZShlcnIpICYmICFub3RfZm91bmQoZXJyKSAmJiAhd3JvbmdfYXJjaChwYXRoLCBlcnIpKSB7CiAgICAgICBlcnJvcnMtPnB1c2hfYmFjaygidW5leHBlY3RlZCBkbGVycm9yOiAiICsgZXJyKTsKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC0xNjMsMTYgKzEzOCwxNyBAQAogfQogCiBzdGF0aWMgYm9vbCBjaGVja19wYXRoKGNvbnN0IHN0ZDo6c3RyaW5nJiBsaWJyYXJ5X3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4mIGxpYnJhcnlfc2VhcmNoX3BhdGhzLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+JiBsaWJyYXJpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogZXJyb3JzKSB7CiAgIGJvb2wgc3VjY2VzcyA9IHRydWU7Ci0gIHN0ZDo6bGlzdDxzdGQ6OnN0cmluZz4gZGlycyA9IHsgbGlicmFyeV9wYXRoIH07CisgIHN0ZDo6cXVldWU8c3RkOjpzdHJpbmc+IGRpcnM7CisgIGRpcnMucHVzaChsaWJyYXJ5X3BhdGgpOwogICB3aGlsZSAoIWRpcnMuZW1wdHkoKSkgewogICAgIHN0ZDo6c3RyaW5nIGRpciA9IGRpcnMuZnJvbnQoKTsKLSAgICBkaXJzLnBvcF9mcm9udCgpOworICAgIGRpcnMucG9wKCk7CiAKLSAgICBhdXRvIGRpcl9kZWxldGVyID0gW10oRElSKiBoYW5kbGUpIHsgY2xvc2VkaXIoaGFuZGxlKTsgfTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8RElSLCBkZWNsdHlwZShkaXJfZGVsZXRlcik+IGRpcnAob3BlbmRpcihkaXIuY19zdHIoKSksIGRpcl9kZWxldGVyKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RElSLCBkZWNsdHlwZSgmY2xvc2VkaXIpPiBkaXJwKG9wZW5kaXIoZGlyLmNfc3RyKCkpLCBjbG9zZWRpcik7CiAgICAgaWYgKGRpcnAgPT0gbnVsbHB0cikgewogICAgICAgZXJyb3JzLT5wdXNoX2JhY2soIkZhaWxlZCB0byBvcGVuICIgKyBkaXIgKyAiOiAiICsgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKQEAgLTE4Nyw5ICsxNjMsOSBAQAogICAgICAgfQogCiAgICAgICBzdGQ6OnN0cmluZyBwYXRoID0gZGlyICsgIi8iICsgZHAtPmRfbmFtZTsKLSAgICAgIGlmIChpc19kaXJlY3RvcnkocGF0aCkpIHsKLSAgICAgICAgZGlycy5wdXNoX2JhY2socGF0aCk7Ci0gICAgICB9IGVsc2UgaWYgKCFjaGVja19saWIocGF0aCwgbGlicmFyeV9wYXRoLCBsaWJyYXJpZXMsIGVycm9ycykpIHsKKyAgICAgIGlmIChpc19kaXJlY3RvcnkocGF0aC5jX3N0cigpKSkgeworICAgICAgICBkaXJzLnB1c2gocGF0aCk7CisgICAgICB9IGVsc2UgaWYgKCFjaGVja19saWIocGF0aCwgbGlicmFyeV9zZWFyY2hfcGF0aHMsIGxpYnJhcmllcywgZXJyb3JzKSkgewogICAgICAgICBzdWNjZXNzID0gZmFsc2U7CiAgICAgICB9CiAgICAgfQpAQCAtMjQ2LDEyICsyMjIsMTYgQEAKICAgcmV0dXJuIHN1Y2Nlc3M7CiB9CiAKKy8vIFRoaXMgaXMgbm90IHB1YmxpYyBmdW5jdGlvbiBidXQgb25seSBrbm93biB3YXkgdG8gZ2V0IHNlYXJjaCBwYXRoIG9mIHRoZSBkZWZhdWx0IG5hbWVzcGFjZS4KK2V4dGVybiAiQyIgdm9pZCBhbmRyb2lkX2dldF9MRF9MSUJSQVJZX1BBVEgoY2hhciosIHNpemVfdCkgX19hdHRyaWJ1dGVfXygoX193ZWFrX18pKTsKKwogZXh0ZXJuICJDIiBKTklFWFBPUlQganN0cmluZyBKTklDQUxMCiAgICAgSmF2YV9hbmRyb2lkX2puaV9jdHNfTGlua2VyTmFtZXNwYWNlc0hlbHBlcl9ydW5BY2Nlc3NpYmlsaXR5VGVzdEltcGwoCiAgICAgICAgIEpOSUVudiogZW52LAogICAgICAgICBqY2xhc3MgY2xhenogX19hdHRyaWJ1dGVfXygodW51c2VkKSksCiAgICAgICAgIGpvYmplY3RBcnJheSBqYXZhX3N5c3RlbV9wdWJsaWNfbGlicmFyaWVzLAotICAgICAgICBqb2JqZWN0QXJyYXkgamF2YV92ZW5kb3JfcHVibGljX2xpYnJhcmllcykgeworICAgICAgICBqb2JqZWN0QXJyYXkgamF2YV92ZW5kb3JfcHVibGljX2xpYnJhcmllcywKKyAgICAgICAgam9iamVjdEFycmF5IGphdmFfcHJvZHVjdF9wdWJsaWNfbGlicmFyaWVzKSB7CiAgIGJvb2wgc3VjY2VzcyA9IHRydWU7CiAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBlcnJvcnM7CiAgIHN0ZDo6c3RyaW5nIGVycm9yX21zZzsKQEAgLTI2OSw4ICsyNDksMzYgQEAKICAgICBlcnJvcnMucHVzaF9iYWNrKCJFcnJvcnMgaW4gc3lzdGVtIHB1YmxpYyBsaWJyYXJ5IGZpbGU6IiArIGVycm9yX21zZyk7CiAgIH0KIAorICBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+IHByb2R1Y3RfcHVibGljX2xpYnJhcmllczsKKyAgaWYgKCFqb2JqZWN0X2FycmF5X3RvX3NldChlbnYsIGphdmFfcHJvZHVjdF9wdWJsaWNfbGlicmFyaWVzLCAmcHJvZHVjdF9wdWJsaWNfbGlicmFyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcl9tc2cpKSB7CisgICAgc3VjY2VzcyA9IGZhbHNlOworICAgIGVycm9ycy5wdXNoX2JhY2soIkVycm9ycyBpbiBwcm9kdWN0IHB1YmxpYyBsaWJyYXJ5IGZpbGU6IiArIGVycm9yX21zZyk7CisgIH0KKwogICAvLyBDaGVjayB0aGUgc3lzdGVtIGxpYnJhcmllcy4KLSAgaWYgKCFjaGVja19wYXRoKGtTeXN0ZW1MaWJyYXJ5UGF0aCwgc3lzdGVtX3B1YmxpY19saWJyYXJpZXMsICZlcnJvcnMpKSB7CisKKyAgLy8gQ2hlY2sgY3VycmVudCBzZWFyY2ggcGF0aCBhbmQgYWRkIHRoZSByZXN0IG9mIHNlYXJjaCBwYXRoIGNvbmZpZ3VyZWQgZm9yCisgIC8vIHRoZSBkZWZhdWx0IG5hbWVwc2FjZS4KKyAgY2hhciBkZWZhdWx0X3NlYXJjaF9wYXRoc1tQQVRIX01BWF07CisgIGFuZHJvaWRfZ2V0X0xEX0xJQlJBUllfUEFUSChkZWZhdWx0X3NlYXJjaF9wYXRocywgc2l6ZW9mKGRlZmF1bHRfc2VhcmNoX3BhdGhzKSk7CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGxpYnJhcnlfc2VhcmNoX3BhdGhzID0gYW5kcm9pZDo6YmFzZTo6U3BsaXQoZGVmYXVsdF9zZWFyY2hfcGF0aHMsICI6Iik7CisKKyAgLy8gUmVtb3ZlIGV2ZXJ5dGhpbmcgcG9pbnRpbmcgb3V0c2lkZSBvZiAvc3lzdGVtL2xpYioKKyAgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPiBzeXN0ZW1fbGlicmFyeV9zZWFyY2hfcGF0aHM7CisKKyAgZm9yIChjb25zdCBhdXRvJiBwYXRoIDogbGlicmFyeV9zZWFyY2hfcGF0aHMpIHsKKyAgICBpZiAoYW5kcm9pZDo6YmFzZTo6U3RhcnRzV2l0aChwYXRoLCAiL3N5c3RlbS9saWIiKSkgeworICAgICAgc3lzdGVtX2xpYnJhcnlfc2VhcmNoX3BhdGhzLmluc2VydChwYXRoKTsKKyAgICB9CisgIH0KKworICAvLyBUaGlzIHBhdGggc2hvdWxkIGJlIHRlc3RlZCB0b28gLSB0aGlzIGlzIGJlY2F1c2UgYXBwcyBtYXkgcmVseSBvbiBzb21lCisgIC8vIGxpYnJhcmllcyBiZWluZyBhdmFpbGFibGUgaW4gL3N5c3RlbS8ke0xJQn0vCisgIHN5c3RlbV9saWJyYXJ5X3NlYXJjaF9wYXRocy5pbnNlcnQoa1N5c3RlbUxpYnJhcnlQYXRoKTsKKworICBpZiAoIWNoZWNrX3BhdGgoa1N5c3RlbUxpYnJhcnlQYXRoLCBzeXN0ZW1fbGlicmFyeV9zZWFyY2hfcGF0aHMsIHN5c3RlbV9wdWJsaWNfbGlicmFyaWVzLCAmZXJyb3JzKSkgewogICAgIHN1Y2Nlc3MgPSBmYWxzZTsKICAgfQogCkBAIC0yODEsNyArMjg5LDcgQEAKICAgICBpZiAoaGFuZGxlID09IG51bGxwdHIpIHsKICAgICAgIHN0ZDo6c3RyaW5nIGVyciA9IGRsZXJyb3IoKTsKICAgICAgIC8vIFRoZSBsaWJyYXJpZXMgc2hvdWxkIGJlIHByZXNlbnQgYW5kIHByb2R1Y2Ugc3BlY2lmaWMgZGxlcnJvciB3aGVuIGluYWNjZXNzaWJsZS4KLSAgICAgIGlmICghbm90X2FjY2Vzc2libGUobGlicmFyeSwgZXJyKSkgeworICAgICAgaWYgKCFub3RfYWNjZXNzaWJsZShlcnIpKSB7CiAgICAgICAgICAgZXJyb3JzLnB1c2hfYmFjaygiTWFuZGF0b3J5IHN5c3RlbSBsaWJyYXJ5IFwiIiArIGxpYnJhcnkgKyAiXCIgZmFpbGVkIHRvIGxvYWQgd2l0aCB1bmV4cGVjdGVkIGVycm9yOiAiICsgZXJyKTsKICAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7CiAgICAgICB9CkBAIC0yOTAsOCArMjk4LDE1IEBACiAgICAgfQogICB9CiAKKyAgLy8gQ2hlY2sgdGhlIHByb2R1Y3QgbGlicmFyaWVzLCBpZiAvcHJvZHVjdC9saWIgZXhpc3RzLgorICBpZiAoaXNfZGlyZWN0b3J5KGtQcm9kdWN0TGlicmFyeVBhdGguY19zdHIoKSkpIHsKKyAgICBpZiAoIWNoZWNrX3BhdGgoa1Byb2R1Y3RMaWJyYXJ5UGF0aCwgeyBrUHJvZHVjdExpYnJhcnlQYXRoIH0sIHByb2R1Y3RfcHVibGljX2xpYnJhcmllcywgJmVycm9ycykpIHsKKyAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICB9CisgIH0KKwogICAvLyBDaGVjayB0aGUgdmVuZG9yIGxpYnJhcmllcy4KLSAgaWYgKCFjaGVja19wYXRoKGtWZW5kb3JMaWJyYXJ5UGF0aCwgdmVuZG9yX3B1YmxpY19saWJyYXJpZXMsICZlcnJvcnMpKSB7CisgIGlmICghY2hlY2tfcGF0aChrVmVuZG9yTGlicmFyeVBhdGgsIHsga1ZlbmRvckxpYnJhcnlQYXRoIH0sIHZlbmRvcl9wdWJsaWNfbGlicmFyaWVzLCAmZXJyb3JzKSkgewogICAgIHN1Y2Nlc3MgPSBmYWxzZTsKICAgfQogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9qbmkvbGliam5pdGVzdC9hbmRyb2lkX2puaV9jdHNfU3RhdGljTm9uY2UuYyBiL3Rlc3RzL3Rlc3RzL2puaS9saWJqbml0ZXN0L2FuZHJvaWRfam5pX2N0c19TdGF0aWNOb25jZS5jCmluZGV4IGFkYTJiZjguLjRlMzMwZTUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2puaS9saWJqbml0ZXN0L2FuZHJvaWRfam5pX2N0c19TdGF0aWNOb25jZS5jCisrKyBiL3Rlc3RzL3Rlc3RzL2puaS9saWJqbml0ZXN0L2FuZHJvaWRfam5pX2N0c19TdGF0aWNOb25jZS5jCkBAIC0yMCw3ICsyMCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGpuaS5oPgotI2luY2x1ZGUgPEpOSUhlbHAuaD4KKyNpbmNsdWRlIDxuYXRpdmVoZWxwZXIvSk5JSGVscC5oPgogCiAjaW5jbHVkZSA8c3RkYm9vbC5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvam5pL2xpYmpuaXRlc3QvbWFjcm9pemVkX3Rlc3RzLmMgYi90ZXN0cy90ZXN0cy9qbmkvbGliam5pdGVzdC9tYWNyb2l6ZWRfdGVzdHMuYwppbmRleCAxMzBiMzc4Li43OTVjNjgyIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9qbmkvbGliam5pdGVzdC9tYWNyb2l6ZWRfdGVzdHMuYworKysgYi90ZXN0cy90ZXN0cy9qbmkvbGliam5pdGVzdC9tYWNyb2l6ZWRfdGVzdHMuYwpAQCAtMjksNiArMjksNyBAQAogI2VuZGlmCiAKICNpbmNsdWRlICJoZWxwZXIuaCIKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPHN0ZGJvb2wuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KQEAgLTE4MiwxMyArMTgzLDEzIEBACiAvLyBUT0RPOiBNaXNzaW5nIGZ1bmN0aW9uczoKIC8vICAgQWxsb2NPYmplY3QKIAotc3RhdGljIGNoYXIgKmhlbHBfQ2FsbEJvb2xlYW5NZXRob2QoSk5JRW52ICplbnYsIGNhbGxUeXBlIGN0LCAuLi4pIHsKK3N0YXRpYyBjaGFyICpoZWxwX0NhbGxCb29sZWFuTWV0aG9kKEpOSUVudiAqZW52LCBpbnQgY3QsIC4uLikgewogICAgIHZhX2xpc3QgYXJnczsKICAgICB2YV9zdGFydChhcmdzLCBjdCk7CiAKICAgICBjaGFyICptc2c7CiAgICAgam9iamVjdCBvID0gZ2V0U3RhbmRhcmRJbnN0YW5jZShlbnYpOwotICAgIGptZXRob2RJRCBtZXRob2QgPSBmaW5kQXBwcm9wcmlhdGVNZXRob2QoZW52LCAmbXNnLCBjdCwKKyAgICBqbWV0aG9kSUQgbWV0aG9kID0gZmluZEFwcHJvcHJpYXRlTWV0aG9kKGVudiwgJm1zZywgKGNhbGxUeXBlKWN0LAogICAgICAgICAgICAgInJldHVybkJvb2xlYW4iLCAiKClaIik7CiAKICAgICBpZiAobWV0aG9kID09IE5VTEwpIHsKQEAgLTI4NywxMyArMjg4LDEzIEBACiAgICAgcmV0dXJuIGhlbHBfQ2FsbEJvb2xlYW5NZXRob2QoZW52LCBTVEFUSUNfVkEpOwogfQogCi1zdGF0aWMgY2hhciAqaGVscF9DYWxsQnl0ZU1ldGhvZChKTklFbnYgKmVudiwgY2FsbFR5cGUgY3QsIC4uLikgeworc3RhdGljIGNoYXIgKmhlbHBfQ2FsbEJ5dGVNZXRob2QoSk5JRW52ICplbnYsIGludCBjdCwgLi4uKSB7CiAgICAgdmFfbGlzdCBhcmdzOwogICAgIHZhX3N0YXJ0KGFyZ3MsIGN0KTsKIAogICAgIGNoYXIgKm1zZzsKICAgICBqb2JqZWN0IG8gPSBnZXRTdGFuZGFyZEluc3RhbmNlKGVudik7Ci0gICAgam1ldGhvZElEIG1ldGhvZCA9IGZpbmRBcHByb3ByaWF0ZU1ldGhvZChlbnYsICZtc2csIGN0LAorICAgIGptZXRob2RJRCBtZXRob2QgPSBmaW5kQXBwcm9wcmlhdGVNZXRob2QoZW52LCAmbXNnLCAoY2FsbFR5cGUpY3QsCiAgICAgICAgICAgICAicmV0dXJuQnl0ZSIsICIoKUIiKTsKIAogICAgIGlmIChtZXRob2QgPT0gTlVMTCkgewpAQCAtMzkyLDEzICszOTMsMTMgQEAKICAgICByZXR1cm4gaGVscF9DYWxsQnl0ZU1ldGhvZChlbnYsIFNUQVRJQ19WQSk7CiB9CiAKLXN0YXRpYyBjaGFyICpoZWxwX0NhbGxTaG9ydE1ldGhvZChKTklFbnYgKmVudiwgY2FsbFR5cGUgY3QsIC4uLikgeworc3RhdGljIGNoYXIgKmhlbHBfQ2FsbFNob3J0TWV0aG9kKEpOSUVudiAqZW52LCBpbnQgY3QsIC4uLikgewogICAgIHZhX2xpc3QgYXJnczsKICAgICB2YV9zdGFydChhcmdzLCBjdCk7CiAKICAgICBjaGFyICptc2c7CiAgICAgam9iamVjdCBvID0gZ2V0U3RhbmRhcmRJbnN0YW5jZShlbnYpOwotICAgIGptZXRob2RJRCBtZXRob2QgPSBmaW5kQXBwcm9wcmlhdGVNZXRob2QoZW52LCAmbXNnLCBjdCwKKyAgICBqbWV0aG9kSUQgbWV0aG9kID0gZmluZEFwcHJvcHJpYXRlTWV0aG9kKGVudiwgJm1zZywgKGNhbGxUeXBlKWN0LAogICAgICAgICAgICAgInJldHVyblNob3J0IiwgIigpUyIpOwogCiAgICAgaWYgKG1ldGhvZCA9PSBOVUxMKSB7CkBAIC00OTcsMTMgKzQ5OCwxMyBAQAogICAgIHJldHVybiBoZWxwX0NhbGxTaG9ydE1ldGhvZChlbnYsIFNUQVRJQ19WQSk7CiB9CiAKLXN0YXRpYyBjaGFyICpoZWxwX0NhbGxDaGFyTWV0aG9kKEpOSUVudiAqZW52LCBjYWxsVHlwZSBjdCwgLi4uKSB7CitzdGF0aWMgY2hhciAqaGVscF9DYWxsQ2hhck1ldGhvZChKTklFbnYgKmVudiwgaW50IGN0LCAuLi4pIHsKICAgICB2YV9saXN0IGFyZ3M7CiAgICAgdmFfc3RhcnQoYXJncywgY3QpOwogCiAgICAgY2hhciAqbXNnOwogICAgIGpvYmplY3QgbyA9IGdldFN0YW5kYXJkSW5zdGFuY2UoZW52KTsKLSAgICBqbWV0aG9kSUQgbWV0aG9kID0gZmluZEFwcHJvcHJpYXRlTWV0aG9kKGVudiwgJm1zZywgY3QsCisgICAgam1ldGhvZElEIG1ldGhvZCA9IGZpbmRBcHByb3ByaWF0ZU1ldGhvZChlbnYsICZtc2csIChjYWxsVHlwZSljdCwKICAgICAgICAgICAgICJyZXR1cm5DaGFyIiwgIigpQyIpOwogCiAgICAgaWYgKG1ldGhvZCA9PSBOVUxMKSB7CkBAIC02MDIsMTMgKzYwMywxMyBAQAogICAgIHJldHVybiBoZWxwX0NhbGxDaGFyTWV0aG9kKGVudiwgU1RBVElDX1ZBKTsKIH0KIAotc3RhdGljIGNoYXIgKmhlbHBfQ2FsbEludE1ldGhvZChKTklFbnYgKmVudiwgY2FsbFR5cGUgY3QsIC4uLikgeworc3RhdGljIGNoYXIgKmhlbHBfQ2FsbEludE1ldGhvZChKTklFbnYgKmVudiwgaW50IGN0LCAuLi4pIHsKICAgICB2YV9saXN0IGFyZ3M7CiAgICAgdmFfc3RhcnQoYXJncywgY3QpOwogCiAgICAgY2hhciAqbXNnOwogICAgIGpvYmplY3QgbyA9IGdldFN0YW5kYXJkSW5zdGFuY2UoZW52KTsKLSAgICBqbWV0aG9kSUQgbWV0aG9kID0gZmluZEFwcHJvcHJpYXRlTWV0aG9kKGVudiwgJm1zZywgY3QsCisgICAgam1ldGhvZElEIG1ldGhvZCA9IGZpbmRBcHByb3ByaWF0ZU1ldGhvZChlbnYsICZtc2csIChjYWxsVHlwZSljdCwKICAgICAgICAgICAgICJyZXR1cm5JbnQiLCAiKClJIik7CiAKICAgICBpZiAobWV0aG9kID09IE5VTEwpIHsKQEAgLTcwNywxMyArNzA4LDEzIEBACiAgICAgcmV0dXJuIGhlbHBfQ2FsbEludE1ldGhvZChlbnYsIFNUQVRJQ19WQSk7CiB9CiAKLXN0YXRpYyBjaGFyICpoZWxwX0NhbGxMb25nTWV0aG9kKEpOSUVudiAqZW52LCBjYWxsVHlwZSBjdCwgLi4uKSB7CitzdGF0aWMgY2hhciAqaGVscF9DYWxsTG9uZ01ldGhvZChKTklFbnYgKmVudiwgaW50IGN0LCAuLi4pIHsKICAgICB2YV9saXN0IGFyZ3M7CiAgICAgdmFfc3RhcnQoYXJncywgY3QpOwogCiAgICAgY2hhciAqbXNnOwogICAgIGpvYmplY3QgbyA9IGdldFN0YW5kYXJkSW5zdGFuY2UoZW52KTsKLSAgICBqbWV0aG9kSUQgbWV0aG9kID0gZmluZEFwcHJvcHJpYXRlTWV0aG9kKGVudiwgJm1zZywgY3QsCisgICAgam1ldGhvZElEIG1ldGhvZCA9IGZpbmRBcHByb3ByaWF0ZU1ldGhvZChlbnYsICZtc2csIChjYWxsVHlwZSljdCwKICAgICAgICAgICAgICJyZXR1cm5Mb25nIiwgIigpSiIpOwogCiAgICAgaWYgKG1ldGhvZCA9PSBOVUxMKSB7CkBAIC03NzMsNyArNzc0LDcgQEAKIAogICAgIHZhX2VuZChhcmdzKTsKIAotICAgIHJldHVybiBGQUlMX0lGX1VORVFVQUwoIiVsbGQiLCAtODAwODAwODAwODdMTCwgcmVzdWx0KTsKKyAgICByZXR1cm4gRkFJTF9JRl9VTkVRVUFMKCIlIiBQUklkNjQsIC04MDA4MDA4MDA4N0xMLCByZXN1bHQpOwogfQogCiBURVNUX0RFQ0xBUkFUSU9OKENhbGxMb25nTWV0aG9kKSB7CkBAIC04MTIsMTMgKzgxMywxMyBAQAogICAgIHJldHVybiBoZWxwX0NhbGxMb25nTWV0aG9kKGVudiwgU1RBVElDX1ZBKTsKIH0KIAotc3RhdGljIGNoYXIgKmhlbHBfQ2FsbEZsb2F0TWV0aG9kKEpOSUVudiAqZW52LCBjYWxsVHlwZSBjdCwgLi4uKSB7CitzdGF0aWMgY2hhciAqaGVscF9DYWxsRmxvYXRNZXRob2QoSk5JRW52ICplbnYsIGludCBjdCwgLi4uKSB7CiAgICAgdmFfbGlzdCBhcmdzOwogICAgIHZhX3N0YXJ0KGFyZ3MsIGN0KTsKIAogICAgIGNoYXIgKm1zZzsKICAgICBqb2JqZWN0IG8gPSBnZXRTdGFuZGFyZEluc3RhbmNlKGVudik7Ci0gICAgam1ldGhvZElEIG1ldGhvZCA9IGZpbmRBcHByb3ByaWF0ZU1ldGhvZChlbnYsICZtc2csIGN0LAorICAgIGptZXRob2RJRCBtZXRob2QgPSBmaW5kQXBwcm9wcmlhdGVNZXRob2QoZW52LCAmbXNnLCAoY2FsbFR5cGUpY3QsCiAgICAgICAgICAgICAicmV0dXJuRmxvYXQiLCAiKClGIik7CiAKICAgICBpZiAobWV0aG9kID09IE5VTEwpIHsKQEAgLTkxNywxMyArOTE4LDEzIEBACiAgICAgcmV0dXJuIGhlbHBfQ2FsbEZsb2F0TWV0aG9kKGVudiwgU1RBVElDX1ZBKTsKIH0KIAotc3RhdGljIGNoYXIgKmhlbHBfQ2FsbERvdWJsZU1ldGhvZChKTklFbnYgKmVudiwgY2FsbFR5cGUgY3QsIC4uLikgeworc3RhdGljIGNoYXIgKmhlbHBfQ2FsbERvdWJsZU1ldGhvZChKTklFbnYgKmVudiwgaW50IGN0LCAuLi4pIHsKICAgICB2YV9saXN0IGFyZ3M7CiAgICAgdmFfc3RhcnQoYXJncywgY3QpOwogCiAgICAgY2hhciAqbXNnOwogICAgIGpvYmplY3QgbyA9IGdldFN0YW5kYXJkSW5zdGFuY2UoZW52KTsKLSAgICBqbWV0aG9kSUQgbWV0aG9kID0gZmluZEFwcHJvcHJpYXRlTWV0aG9kKGVudiwgJm1zZywgY3QsCisgICAgam1ldGhvZElEIG1ldGhvZCA9IGZpbmRBcHByb3ByaWF0ZU1ldGhvZChlbnYsICZtc2csIChjYWxsVHlwZSljdCwKICAgICAgICAgICAgICJyZXR1cm5Eb3VibGUiLCAiKClEIik7CiAKICAgICBpZiAobWV0aG9kID09IE5VTEwpIHsKQEAgLTEwMjIsMTMgKzEwMjMsMTMgQEAKICAgICByZXR1cm4gaGVscF9DYWxsRG91YmxlTWV0aG9kKGVudiwgU1RBVElDX1ZBKTsKIH0KIAotc3RhdGljIGNoYXIgKmhlbHBfQ2FsbFZvaWRNZXRob2QoSk5JRW52ICplbnYsIGNhbGxUeXBlIGN0LCAuLi4pIHsKK3N0YXRpYyBjaGFyICpoZWxwX0NhbGxWb2lkTWV0aG9kKEpOSUVudiAqZW52LCBpbnQgY3QsIC4uLikgewogICAgIHZhX2xpc3QgYXJnczsKICAgICB2YV9zdGFydChhcmdzLCBjdCk7CiAKICAgICBjaGFyICptc2c7CiAgICAgam9iamVjdCBvID0gZ2V0U3RhbmRhcmRJbnN0YW5jZShlbnYpOwotICAgIGptZXRob2RJRCBtZXRob2QgPSBmaW5kQXBwcm9wcmlhdGVNZXRob2QoZW52LCAmbXNnLCBjdCwKKyAgICBqbWV0aG9kSUQgbWV0aG9kID0gZmluZEFwcHJvcHJpYXRlTWV0aG9kKGVudiwgJm1zZywgKGNhbGxUeXBlKWN0LAogICAgICAgICAgICAgIm5vcCIsICIoKVYiKTsKIAogICAgIGlmIChtZXRob2QgPT0gTlVMTCkgewpAQCAtMTEyNywxMyArMTEyOCwxMyBAQAogICAgIHJldHVybiBoZWxwX0NhbGxWb2lkTWV0aG9kKGVudiwgU1RBVElDX1ZBKTsKIH0KIAotc3RhdGljIGNoYXIgKmhlbHBfQ2FsbE9iamVjdE1ldGhvZChKTklFbnYgKmVudiwgY2FsbFR5cGUgY3QsIC4uLikgeworc3RhdGljIGNoYXIgKmhlbHBfQ2FsbE9iamVjdE1ldGhvZChKTklFbnYgKmVudiwgaW50IGN0LCAuLi4pIHsKICAgICB2YV9saXN0IGFyZ3M7CiAgICAgdmFfc3RhcnQoYXJncywgY3QpOwogCiAgICAgY2hhciAqbXNnOwogICAgIGpvYmplY3QgbyA9IGdldFN0YW5kYXJkSW5zdGFuY2UoZW52KTsKLSAgICBqbWV0aG9kSUQgbWV0aG9kID0gZmluZEFwcHJvcHJpYXRlTWV0aG9kKGVudiwgJm1zZywgY3QsCisgICAgam1ldGhvZElEIG1ldGhvZCA9IGZpbmRBcHByb3ByaWF0ZU1ldGhvZChlbnYsICZtc2csIChjYWxsVHlwZSljdCwKICAgICAgICAgICAgICJyZXR1cm5TdHJpbmciLCAiKClMamF2YS9sYW5nL1N0cmluZzsiKTsKIAogICAgIGlmIChtZXRob2QgPT0gTlVMTCkgewpAQCAtMTI1MCwxMyArMTI1MSwxMyBAQAogICAgIHJldHVybiBoZWxwX0NhbGxPYmplY3RNZXRob2QoZW52LCBTVEFUSUNfVkEpOwogfQogCi1zdGF0aWMgY2hhciAqaGVscF9UYWtlT25lT2ZFYWNoKEpOSUVudiAqZW52LCBjYWxsVHlwZSBjdCwgLi4uKSB7CitzdGF0aWMgY2hhciAqaGVscF9UYWtlT25lT2ZFYWNoKEpOSUVudiAqZW52LCBpbnQgY3QsIC4uLikgewogICAgIHZhX2xpc3QgYXJnczsKICAgICB2YV9zdGFydChhcmdzLCBjdCk7CiAKICAgICBjaGFyICptc2c7CiAgICAgam9iamVjdCBvID0gZ2V0U3RhbmRhcmRJbnN0YW5jZShlbnYpOwotICAgIGptZXRob2RJRCBtZXRob2QgPSBmaW5kQXBwcm9wcmlhdGVNZXRob2QoZW52LCAmbXNnLCBjdCwKKyAgICBqbWV0aG9kSUQgbWV0aG9kID0gZmluZEFwcHJvcHJpYXRlTWV0aG9kKGVudiwgJm1zZywgKGNhbGxUeXBlKWN0LAogICAgICAgICAgICAgInRha2VPbmVPZkVhY2giLCAiKERGSklDU0JaTGphdmEvbGFuZy9TdHJpbmc7KVoiKTsKIAogICAgIGlmIChtZXRob2QgPT0gTlVMTCkgewpAQCAtMTI2NSw4ICsxMjY2LDggQEAKICAgICB9CiAKICAgICBqdmFsdWUgamFyZ3NbXSA9IHsKLSAgICAgICAge2Q6IDAuMH0sIHtmOiAxLjBmfSwge2o6IDJMTH0sIHtpOiAzfSwge2M6IDR9LCB7czogNX0sIHtiOiA2fSwKLSAgICAgICAge3o6IHRydWV9LCB7bDogYmlzY3VpdHN9CisgICAgICAgIHsuZCA9IDAuMH0sIHsuZiA9IDEuMGZ9LCB7LmogPSAyTEx9LCB7LmkgPSAzfSwgey5jID0gNH0sIHsucyA9IDV9LAorICAgICAgICB7LmIgPSA2fSwgey56ID0gdHJ1ZX0sIHsubCA9IGJpc2N1aXRzfQogICAgIH07CiAKICAgICBqYm9vbGVhbiByZXN1bHQ7CkBAIC0xMzcyLDEzICsxMzczLDEzIEBACiAgICAgICAgICAgICAoamJvb2xlYW4pIHRydWUsIGJpc2N1aXRzKTsKIH0KIAotc3RhdGljIGNoYXIgKmhlbHBfVGFrZUNvb2xIYW5kTHVrZShKTklFbnYgKmVudiwgY2FsbFR5cGUgY3QsIC4uLikgeworc3RhdGljIGNoYXIgKmhlbHBfVGFrZUNvb2xIYW5kTHVrZShKTklFbnYgKmVudiwgaW50IGN0LCAuLi4pIHsKICAgICB2YV9saXN0IGFyZ3M7CiAgICAgdmFfc3RhcnQoYXJncywgY3QpOwogCiAgICAgY2hhciAqbXNnOwogICAgIGpvYmplY3QgbyA9IGdldFN0YW5kYXJkSW5zdGFuY2UoZW52KTsKLSAgICBqbWV0aG9kSUQgbWV0aG9kID0gZmluZEFwcHJvcHJpYXRlTWV0aG9kKGVudiwgJm1zZywgY3QsCisgICAgam1ldGhvZElEIG1ldGhvZCA9IGZpbmRBcHByb3ByaWF0ZU1ldGhvZChlbnYsICZtc2csIChjYWxsVHlwZSljdCwKICAgICAgICAgICAgICJ0YWtlQ29vbEhhbmRMdWtlIiwKICAgICAgICAgICAgICIoSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUkpWiIpOwogCkBAIC0xMzg4LDE3ICsxMzg5LDE3IEBACiAgICAgfQogCiAgICAganZhbHVlIGphcmdzW10gPSB7Ci0gICAgICAgIHtpOiAxfSwge2k6IDJ9LCB7aTogM30sIHtpOiA0fSwKLSAgICAgICAge2k6IDV9LCB7aTogNn0sIHtpOiA3fSwge2k6IDh9LCB7aTogOX0sIAotICAgICAgICB7aTogMTB9LCB7aTogMTF9LCB7aTogMTJ9LCB7aTogMTN9LCB7aTogMTR9LAotICAgICAgICB7aTogMTV9LCB7aTogMTZ9LCB7aTogMTd9LCB7aTogMTh9LCB7aTogMTl9LCAKLSAgICAgICAge2k6IDIwfSwge2k6IDIxfSwge2k6IDIyfSwge2k6IDIzfSwge2k6IDI0fSwKLSAgICAgICAge2k6IDI1fSwge2k6IDI2fSwge2k6IDI3fSwge2k6IDI4fSwge2k6IDI5fSwgCi0gICAgICAgIHtpOiAzMH0sIHtpOiAzMX0sIHtpOiAzMn0sIHtpOiAzM30sIHtpOiAzNH0sCi0gICAgICAgIHtpOiAzNX0sIHtpOiAzNn0sIHtpOiAzN30sIHtpOiAzOH0sIHtpOiAzOX0sIAotICAgICAgICB7aTogNDB9LCB7aTogNDF9LCB7aTogNDJ9LCB7aTogNDN9LCB7aTogNDR9LAotICAgICAgICB7aTogNDV9LCB7aTogNDZ9LCB7aTogNDd9LCB7aTogNDh9LCB7aTogNDl9LAotICAgICAgICB7aTogNTB9CisgICAgICAgIHsuaSA9IDF9LCB7LmkgPSAyfSwgey5pID0gM30sIHsuaSA9IDR9LAorICAgICAgICB7LmkgPSA1fSwgey5pID0gNn0sIHsuaSA9IDd9LCB7LmkgPSA4fSwgey5pID0gOX0sIAorICAgICAgICB7LmkgPSAxMH0sIHsuaSA9IDExfSwgey5pID0gMTJ9LCB7LmkgPSAxM30sIHsuaSA9IDE0fSwKKyAgICAgICAgey5pID0gMTV9LCB7LmkgPSAxNn0sIHsuaSA9IDE3fSwgey5pID0gMTh9LCB7LmkgPSAxOX0sIAorICAgICAgICB7LmkgPSAyMH0sIHsuaSA9IDIxfSwgey5pID0gMjJ9LCB7LmkgPSAyM30sIHsuaSA9IDI0fSwKKyAgICAgICAgey5pID0gMjV9LCB7LmkgPSAyNn0sIHsuaSA9IDI3fSwgey5pID0gMjh9LCB7LmkgPSAyOX0sIAorICAgICAgICB7LmkgPSAzMH0sIHsuaSA9IDMxfSwgey5pID0gMzJ9LCB7LmkgPSAzM30sIHsuaSA9IDM0fSwKKyAgICAgICAgey5pID0gMzV9LCB7LmkgPSAzNn0sIHsuaSA9IDM3fSwgey5pID0gMzh9LCB7LmkgPSAzOX0sIAorICAgICAgICB7LmkgPSA0MH0sIHsuaSA9IDQxfSwgey5pID0gNDJ9LCB7LmkgPSA0M30sIHsuaSA9IDQ0fSwKKyAgICAgICAgey5pID0gNDV9LCB7LmkgPSA0Nn0sIHsuaSA9IDQ3fSwgey5pID0gNDh9LCB7LmkgPSA0OX0sCisgICAgICAgIHsuaSA9IDUwfQogICAgIH07CiAKICAgICBqYm9vbGVhbiByZXN1bHQ7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9qbmkvbGliam5pdGVzdC90YXhpY2FiX251bWJlci5jcHAgYi90ZXN0cy90ZXN0cy9qbmkvbGliam5pdGVzdC90YXhpY2FiX251bWJlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIyNjk1NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2puaS9saWJqbml0ZXN0L3RheGljYWJfbnVtYmVyLmNwcApAQCAtMCwwICsxLDI0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCit1aW50MzJfdCBkbG9wZW5fdGVzdGxpYl90YXhpY2FiX251bWJlciA9IDE3Mjk7CisKK2V4dGVybiAiQyIgYm9vbCBkbG9wZW5fdGVzdGxpYl9zaW1wbGVfZnVuYygpIHsKKyAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9qbmkvc3JjL2FuZHJvaWQvam5pL2N0cy9CYXNpY0xvYWRlclRlc3RIZWxwZXIuamF2YSBiL3Rlc3RzL3Rlc3RzL2puaS9zcmMvYW5kcm9pZC9qbmkvY3RzL0Jhc2ljTG9hZGVyVGVzdEhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4OWRjMTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9qbmkvc3JjL2FuZHJvaWQvam5pL2N0cy9CYXNpY0xvYWRlclRlc3RIZWxwZXIuamF2YQpAQCAtMCwwICsxLDI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmpuaS5jdHM7CisKK2NsYXNzIEJhc2ljTG9hZGVyVGVzdEhlbHBlciB7CisgICAgc3RhdGljIHsKKyAgICAgICAgU3lzdGVtLmxvYWRMaWJyYXJ5KCJqbml0ZXN0Iik7CisgICAgfQorCisgICAgc3RhdGljIG5hdGl2ZSBTdHJpbmcgbmF0aXZlUnVuVGVzdHMoKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2puaS9zcmMvYW5kcm9pZC9qbmkvY3RzL0puaUNwcFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2puaS9zcmMvYW5kcm9pZC9qbmkvY3RzL0puaUNwcFRlc3QuamF2YQppbmRleCA3NjJiMjlmLi42OTkzYjI5IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9qbmkvc3JjL2FuZHJvaWQvam5pL2N0cy9KbmlDcHBUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvam5pL3NyYy9hbmRyb2lkL2puaS9jdHMvSm5pQ3BwVGVzdC5qYXZhCkBAIC0xNiwxNSArMTYsMTIgQEAKIAogcGFja2FnZSBhbmRyb2lkLmpuaS5jdHM7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNkZFRlc3Q7Ci0KIAogLyoqCiAgKiBCYXNpYyB0ZXN0cyBvZiBjYWxsaW5nIHRoZSBDKysgZnVuY3Rpb25zIHRoYXQgbWFrZSB1cCB0aGUgSk5JLiBUaGlzCiAgKiBjbGFzcyBtZXJlbHkgY2FsbHMgaW50byBuYXRpdmUgY29kZSBhbmQgcmVwb3J0cyBiYWNrIGlmIHRoZXJlIHdhcwogICogYSBwcm9ibGVtLgogICovCi1AQ2RkVGVzdChyZXF1aXJlbWVudD0iMy4zLjEvQy0wLTIiKQogcHVibGljIGNsYXNzIEpuaUNwcFRlc3QgZXh0ZW5kcyBKbmlUZXN0Q2FzZSB7CiAgICAgc3RhdGljIHsKICAgICAgICAgaWYgKCFKbmlUZXN0Q2FzZS5pc0NwdUFiaU5vbmUoKSkgewpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvam5pL3NyYy9hbmRyb2lkL2puaS9jdHMvSm5pSW5zdGFuY2VUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9qbmkvc3JjL2FuZHJvaWQvam5pL2N0cy9KbmlJbnN0YW5jZVRlc3QuamF2YQppbmRleCA4ODMxYTNlLi43YzE2YTNhIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9qbmkvc3JjL2FuZHJvaWQvam5pL2N0cy9KbmlJbnN0YW5jZVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9qbmkvc3JjL2FuZHJvaWQvam5pL2N0cy9KbmlJbnN0YW5jZVRlc3QuamF2YQpAQCAtMTYsMTQgKzE2LDEyIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5qbmkuY3RzOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DZGRUZXN0OwogCiAvKioKICAqIEJhc2ljIG5hdGl2ZSBpbnN0YW5jZSBtZXRob2QgdGVzdHMuIFRoZSAibm9uY2UiIGNsYXNzIGJlaW5nIHRlc3RlZAogICogYnkgdGhpcyBjbGFzcyBpcyBhIGNsYXNzIGRlZmluZWQgaW4gdGhpcyBwYWNrYWdlIHRoYXQgZGVjbGFyZXMgdGhlCiAgKiBidWxrIG9mIGl0cyBtZXRob2RzIGFzIG5hdGl2ZS4KICAqLwotQENkZFRlc3QocmVxdWlyZW1lbnQ9IjMuMy4xL0MtMC0yIikKIHB1YmxpYyBjbGFzcyBKbmlJbnN0YW5jZVRlc3QgZXh0ZW5kcyBKbmlUZXN0Q2FzZSB7CiAgICAgLyoqIGluc3RhbmNlIHRvIHVzZSBmb3IgYWxsIHRoZSB0ZXN0cyAqLwogICAgIHByaXZhdGUgSW5zdGFuY2VOb25jZSB0YXJnZXQ7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9qbmkvc3JjL2FuZHJvaWQvam5pL2N0cy9KbmlTdGF0aWNUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9qbmkvc3JjL2FuZHJvaWQvam5pL2N0cy9KbmlTdGF0aWNUZXN0LmphdmEKaW5kZXggMmZkZTM2My4uYjEyMjQ1NyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvam5pL3NyYy9hbmRyb2lkL2puaS9jdHMvSm5pU3RhdGljVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2puaS9zcmMvYW5kcm9pZC9qbmkvY3RzL0puaVN0YXRpY1Rlc3QuamF2YQpAQCAtMTYsOCArMTYsNiBAQAogCiBwYWNrYWdlIGFuZHJvaWQuam5pLmN0czsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ2RkVGVzdDsKLQogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiAKIC8qKgpAQCAtMjUsNyArMjMsNiBAQAogICogY2xhc3MgaXMgYSBjbGFzcyBkZWZpbmVkIGluIHRoaXMgcGFja2FnZSB0aGF0IGRlY2xhcmVzIHRoZSBidWxrIG9mCiAgKiBpdHMgbWV0aG9kcyBhcyBuYXRpdmUuCiAgKi8KLUBDZGRUZXN0KHJlcXVpcmVtZW50PSIzLjMuMS9DLTAtMiIpCiBwdWJsaWMgY2xhc3MgSm5pU3RhdGljVGVzdCBleHRlbmRzIEpuaVRlc3RDYXNlIHsKIAogICAgIHN0YXRpYyB7CkBAIC0zOCw3ICszNSw2IEBACiAgICAgICogVGVzdCBsaWJyYXJ5IGFjY2Vzc2liaWxpdHkuIEludGVybmFsIHBsYXRmb3JtIGxpYnJhcmllcyBzaG91bGQgbm90CiAgICAgICogYmUgYWNjZXNzaWJsZSBmcm9tIHRoZSBqbmkgY29kZS4KICAgICAgKi8KLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iMy4zLjEvQy0wLTcsQy0wLTksQy0wLTEwIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0X2xpbmtlcl9uYW1lc3BhY2VzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIGVycm9yID0gTGlua2VyTmFtZXNwYWNlc0hlbHBlci5ydW5BY2Nlc3NpYmlsaXR5VGVzdCgpOwogICAgICAgICBpZiAoZXJyb3IgIT0gbnVsbCkgewpAQCAtNTMsNiArNDksMTMgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHRlc3RfbG9hZGVyX2Jhc2ljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBlcnJvciA9IEJhc2ljTG9hZGVyVGVzdEhlbHBlci5uYXRpdmVSdW5UZXN0cygpOworICAgICAgICBpZiAoZXJyb3IgIT0gbnVsbCkgeworICAgICAgICAgICAgZmFpbChlcnJvcik7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKICAgICAgKiBUZXN0IHRoYXQgYWNjZXNzaW5nIGNsYXNzZXMgdHJ1ZSBKTkkgd29ya3MgYXMgZXhwZWN0ZWQuIGIvMTkzODIxMzAKICAgICAgKi8KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2puaS9zcmMvYW5kcm9pZC9qbmkvY3RzL0xpbmtlck5hbWVzcGFjZXNIZWxwZXIuamF2YSBiL3Rlc3RzL3Rlc3RzL2puaS9zcmMvYW5kcm9pZC9qbmkvY3RzL0xpbmtlck5hbWVzcGFjZXNIZWxwZXIuamF2YQppbmRleCBmNjNlNzZhLi4yNDkyYjQ4IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9qbmkvc3JjL2FuZHJvaWQvam5pL2N0cy9MaW5rZXJOYW1lc3BhY2VzSGVscGVyLmphdmEKKysrIGIvdGVzdHMvdGVzdHMvam5pL3NyYy9hbmRyb2lkL2puaS9jdHMvTGlua2VyTmFtZXNwYWNlc0hlbHBlci5qYXZhCkBAIC0xNiwyMiArMTYsMzMgQEAKIAogcGFja2FnZSBhbmRyb2lkLmpuaS5jdHM7CiAKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQXBwbGljYXRpb25JbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuTmFtZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKKwogaW1wb3J0IGRhbHZpay5zeXN0ZW0uUGF0aENsYXNzTG9hZGVyOwogCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlbmFtZUZpbHRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CiAKIGNsYXNzIExpbmtlck5hbWVzcGFjZXNIZWxwZXIgeworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBQVUJMSUNfQ09ORklHX0RJUiA9ICIvc3lzdGVtL2V0Yy8iOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBQUk9EVUNUX0NPTkZJR19ESVIgPSAiL3Byb2R1Y3QvZXRjLyI7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFNZU1RFTV9DT05GSUdfRklMRSA9IFBVQkxJQ19DT05GSUdfRElSICsgInB1YmxpYy5saWJyYXJpZXMudHh0IjsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBQYXR0ZXJuIEVYVEVOU0lPTl9DT05GSUdfRklMRV9QQVRURVJOID0gUGF0dGVybi5jb21waWxlKAorICAgICAgICAgICAgInB1YmxpY1xcLmxpYnJhcmllcy0oW0EtWmEtejAtOVxcLV8uXSspXFwudHh0Iik7CiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFZFTkRPUl9DT05GSUdfRklMRSA9ICIvdmVuZG9yL2V0Yy9wdWJsaWMubGlicmFyaWVzLnR4dCI7CiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nW10gUFVCTElDX1NZU1RFTV9MSUJSQVJJRVMgPSB7CiAgICAgICAgICJsaWJhYXVkaW8uc28iLApAQCAtNTksMTIgKzcwLDI5IEBACiAgICAgICAgICJsaWJ2dWxrYW4uc28iLAogICAgICAgICAibGliei5zbyIKICAgICB9OworICAgIC8vIFRoZSBncmV5LWxpc3QuCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nW10gUFJJVkFURV9TWVNURU1fTElCUkFSSUVTID0geworICAgICAgICAibGliYW5kcm9pZF9ydW50aW1lLnNvIiwKKyAgICAgICAgImxpYmJpbmRlci5zbyIsCisgICAgICAgICJsaWJjcnlwdG8uc28iLAorICAgICAgICAibGliY3V0aWxzLnNvIiwKKyAgICAgICAgImxpYmV4cGF0LnNvIiwKKyAgICAgICAgImxpYmd1aS5zbyIsCisgICAgICAgICJsaWJtZWRpYS5zbyIsCisgICAgICAgICJsaWJuYXRpdmVoZWxwZXIuc28iLAorICAgICAgICAibGlic2tpYS5zbyIsCisgICAgICAgICJsaWJzc2wuc28iLAorICAgICAgICAibGlic3RhZ2VmcmlnaHQuc28iLAorICAgICAgICAibGlic3FsaXRlLnNvIiwKKyAgICAgICAgImxpYnVpLnNvIiwKKyAgICAgICAgImxpYnV0aWxzLnNvIiwKKyAgICAgICAgImxpYnZvcmJpc2lkZWMuc28iLAorICAgIH07CiAKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgV0VCVklFV19QTEFUX1NVUFBPUlRfTElCID0gImxpYndlYnZpZXdjaHJvbWl1bV9wbGF0X3N1cHBvcnQuc28iOwogCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcnVuQWNjZXNzaWJpbGl0eVRlc3QoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBMaXN0PFN0cmluZz4gdmVuZG9yTGlicyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShWRU5ET1JfQ09ORklHX0ZJTEUpOworICAgIHByaXZhdGUgc3RhdGljIExpc3Q8U3RyaW5nPiByZWFkUHVibGljTGlicmFyaWVzRmlsZShGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIExpc3Q8U3RyaW5nPiBsaWJzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgICAgIGlmIChmaWxlLmV4aXN0cygpKSB7CiAgICAgICAgICAgICB0cnkgKEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGZpbGUpKSkgewogICAgICAgICAgICAgICAgIFN0cmluZyBsaW5lOwpAQCAtNzMsMTIgKzEwMSw1MSBAQAogICAgICAgICAgICAgICAgICAgICBpZiAobGluZS5pc0VtcHR5KCkgfHwgbGluZS5zdGFydHNXaXRoKCIjIikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHZlbmRvckxpYnMuYWRkKGxpbmUpOworICAgICAgICAgICAgICAgICAgICBsaWJzLmFkZChsaW5lKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxpYnM7CisgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlYWRFeHRlbnNpb25Db25maWdGaWxlcyhTdHJpbmcgY29uZmlnRGlyLCBMaXN0PFN0cmluZz4gbGlicykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZVtdIGNvbmZpZ0ZpbGVzID0gbmV3IEZpbGUoY29uZmlnRGlyKS5saXN0RmlsZXMoCisgICAgICAgICAgICAgICAgbmV3IEZpbGVuYW1lRmlsdGVyKCkgeworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBkaXIsIFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVhURU5TSU9OX0NPTkZJR19GSUxFX1BBVFRFUk4ubWF0Y2hlcihuYW1lKS5tYXRjaGVzKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKGNvbmZpZ0ZpbGVzID09IG51bGwpIHJldHVybiBudWxsOworCisgICAgICAgIGZvciAoRmlsZSBjb25maWdGaWxlOiBjb25maWdGaWxlcykgeworICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gY29uZmlnRmlsZS50b1BhdGgoKS5nZXRGaWxlTmFtZSgpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICBNYXRjaGVyIGNvbmZpZ01hdGNoZXIgPSBFWFRFTlNJT05fQ09ORklHX0ZJTEVfUEFUVEVSTi5tYXRjaGVyKGZpbGVOYW1lKTsKKyAgICAgICAgICAgIGlmIChjb25maWdNYXRjaGVyLm1hdGNoZXMoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBjb21wYW55TmFtZSA9IGNvbmZpZ01hdGNoZXIuZ3JvdXAoMSk7CisgICAgICAgICAgICAgICAgLy8gYSBsaWIgaW4gcHVibGljLmxpYnJhcmllcy1hY21lLnR4dCBzaG91bGQgYmUKKyAgICAgICAgICAgICAgICAvLyBsaWJGb28uYWNtZS5zbworICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBsaWJOYW1lcyA9IHJlYWRQdWJsaWNMaWJyYXJpZXNGaWxlKGNvbmZpZ0ZpbGUpOworICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGxpYiA6IGxpYk5hbWVzKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBzcGFjZSA9IGxpYi5sYXN0SW5kZXhPZignICcpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3BhY2UgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAvLyBEcm9wIDY0IG9yIDMyIGZyb20gJ2xpYkZvby5zbyA2NCcKKyAgICAgICAgICAgICAgICAgICAgICBsaWIgPSBsaWIuc3Vic3RyaW5nKDAsIHNwYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobGliLmVuZHNXaXRoKCIuIiArIGNvbXBhbnlOYW1lICsgIi5zbyIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsaWJzLmFkZChsaWIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJMaWJyYXJ5IFwiIiArIGxpYiArICJcIiBpbiAiICsgY29uZmlnRmlsZS50b1N0cmluZygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtdXN0IGhhdmUgY29tcGFueSBuYW1lICIgKyBjb21wYW55TmFtZSArICIgYXMgc3VmZml4LiI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcnVuQWNjZXNzaWJpbGl0eVRlc3QoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBMaXN0PFN0cmluZz4gc3lzdGVtTGlicyA9IG5ldyBBcnJheUxpc3Q8PigpOworCiAgICAgICAgIENvbGxlY3Rpb25zLmFkZEFsbChzeXN0ZW1MaWJzLCBQVUJMSUNfU1lTVEVNX0xJQlJBUklFUyk7CiAKICAgICAgICAgaWYgKEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKS5nZXRQYWNrYWdlTWFuYWdlcigpLgpAQCAtODYsMTIgKzE1Myw0NSBAQAogICAgICAgICAgICAgc3lzdGVtTGlicy5hZGQoV0VCVklFV19QTEFUX1NVUFBPUlRfTElCKTsKICAgICAgICAgfQogCisgICAgICAgIC8vIENoZWNrIGlmIHB1YmxpYy5saWJyYXJpZXMudHh0IGNvbnRhaW5zIGxpYnMgb3RoZXIgdGhhbiB0aGUKKyAgICAgICAgLy8gcHVibGljIHN5c3RlbSBsaWJzIChOREsgbGlicykuCisKKyAgICAgICAgTGlzdDxTdHJpbmc+IG9lbUxpYnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgU3RyaW5nIG9lbUxpYnNFcnJvciA9IHJlYWRFeHRlbnNpb25Db25maWdGaWxlcyhQVUJMSUNfQ09ORklHX0RJUiwgb2VtTGlicyk7CisgICAgICAgIGlmIChvZW1MaWJzRXJyb3IgIT0gbnVsbCkgcmV0dXJuIG9lbUxpYnNFcnJvcjsKKyAgICAgICAgLy8gT0VNIGxpYnMgdGhhdCBwYXNzZWQgYWJvdmUgdGVzdHMgYXJlIGF2YWlsYWJsZSB0byBBbmRyb2lkIGFwcCB2aWEgSk5JCisgICAgICAgIHN5c3RlbUxpYnMuYWRkQWxsKG9lbUxpYnMpOworCisgICAgICAgIC8vIFBST0RVQ1QgbGlicyB0aGF0IHBhc3NlZCBhcmUgYWxzbyBhdmFpbGFibGUKKyAgICAgICAgTGlzdDxTdHJpbmc+IHByb2R1Y3RMaWJzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIFN0cmluZyBwcm9kdWN0TGlic0Vycm9yID0gcmVhZEV4dGVuc2lvbkNvbmZpZ0ZpbGVzKFBST0RVQ1RfQ09ORklHX0RJUiwgcHJvZHVjdExpYnMpOworICAgICAgICBpZiAocHJvZHVjdExpYnNFcnJvciAhPSBudWxsKSByZXR1cm4gcHJvZHVjdExpYnNFcnJvcjsKKworICAgICAgICBMaXN0PFN0cmluZz4gdmVuZG9yTGlicyA9IHJlYWRQdWJsaWNMaWJyYXJpZXNGaWxlKG5ldyBGaWxlKFZFTkRPUl9DT05GSUdfRklMRSkpOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBsaWJzIGluIGdyZXktbGlzdCBhcmUgbm90IGV4cG9zZWQgdG8gYXBwcy4gSW4gZmFjdCwgaXQKKyAgICAgICAgLy8gd291bGQgYmUgYmV0dGVyIGZvciB1cyB0byBydW4gdGhpcyBjaGVjayBhZ2FpbnN0IGFsbCBzeXN0ZW0gbGlicmFyaWVzIHdoaWNoCisgICAgICAgIC8vIGFyZSBub3QgTkRLIGxpYnMsIGJ1dCBncmV5LWxpc3QgbGlicyBhcmUgZW5vdWdoIGZvciBub3cgc2luY2UgdGhleSBoYXZlIGJlZW4KKyAgICAgICAgLy8gdGhlIG1vc3QgcG9wdWxhciB2aW9sYXRvcnMuCisgICAgICAgIFNldDxTdHJpbmc+IGdyZXlMaXN0TGlicyA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgQ29sbGVjdGlvbnMuYWRkQWxsKGdyZXlMaXN0TGlicywgUFJJVkFURV9TWVNURU1fTElCUkFSSUVTKTsKKyAgICAgICAgLy8gTm90ZTogY2hlY2sgZm9yIHN5c3RlbUxpYnMgaXNuJ3QgbmVlZGVkIHNpbmNlIHdlIGFscmVhZHkgY2hlY2tlZAorICAgICAgICAvLyAvc3lzdGVtL2V0Yy9wdWJsaWMubGlicmFyaWVzLnR4dCBhZ2FpbnN0IE5ESyBhbmQKKyAgICAgICAgLy8gL3N5c3RlbS9ldGMvcHVibGljLmxpYnJhcmllcy08Y29tcGFueT4udHh0IGFnYWluc3QgbGliPG5hbWU+Ljxjb21wYW55Pi5zby4KKyAgICAgICAgZm9yIChTdHJpbmcgbGliIDogdmVuZG9yTGlicykgeworICAgICAgICAgICAgaWYgKGdyZXlMaXN0TGlicy5jb250YWlucyhsaWIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJJbnRlcm5hbCBsaWJyYXJ5IFwiIiArIGxpYiArICJcIiBtdXN0IG5vdCBiZSBhdmFpbGFibGUgdG8gYXBwcy4iOworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgcmV0dXJuIHJ1bkFjY2Vzc2liaWxpdHlUZXN0SW1wbChzeXN0ZW1MaWJzLnRvQXJyYXkobmV3IFN0cmluZ1tzeXN0ZW1MaWJzLnNpemUoKV0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvckxpYnMudG9BcnJheShuZXcgU3RyaW5nW3ZlbmRvckxpYnMuc2l6ZSgpXSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvckxpYnMudG9BcnJheShuZXcgU3RyaW5nW3ZlbmRvckxpYnMuc2l6ZSgpXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdExpYnMudG9BcnJheShuZXcgU3RyaW5nW3Byb2R1Y3RMaWJzLnNpemUoKV0pKTsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgU3RyaW5nIHJ1bkFjY2Vzc2liaWxpdHlUZXN0SW1wbChTdHJpbmdbXSBwdWJsaWNTeXN0ZW1MaWJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHB1YmxpY1ZlbmRvckxpYnMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHB1YmxpY1ZlbmRvckxpYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gcHVibGljUHJvZHVjdExpYnMpOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbnZva2VJbmNyZW1lbnRHbG9iYWwoQ2xhc3M8Pz4gY2xhenopIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBjbGF6ei5nZXRNZXRob2QoImluY3JlbWVudEdsb2JhbCIpLmludm9rZShudWxsKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2puaV92ZW5kb3IvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL2puaV92ZW5kb3IvQW5kcm9pZC5tawppbmRleCBiYTA2YjQyLi42YjliZmIzIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9qbmlfdmVuZG9yL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvdGVzdHMvam5pX3ZlbmRvci9BbmRyb2lkLm1rCkBAIC0yNyw3ICsyNyw3IEBACiAjIFdoZW4gYnVpbHQsIGV4cGxpY2l0bHkgcHV0IGl0IGluIHRoZSB2ZW5kb3IgcGFydGl0aW9uLgogTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX1ZFTkRPUl9BUFBTKQogCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC1zdXBwb3J0LXRlc3QgY3RzdGVzdHJ1bm5lcgorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWR4LnRlc3QucnVsZXMgY3RzdGVzdHJ1bm5lci1heHQKIAogTE9DQUxfSk5JX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGlidmVuZG9yam5pdGVzdAogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9qbmlfdmVuZG9yL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy90ZXN0cy9qbmlfdmVuZG9yL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggMzYzYTE1MS4uOTZhMWM5ZSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvam5pX3ZlbmRvci9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL2puaV92ZW5kb3IvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjMsNyArMjMsNyBAQAogICAgIDwvYXBwbGljYXRpb24+CiAKICAgICA8IS0tIFRoaXMgaXMgYSBzZWxmLWluc3RydW1lbnRpbmcgdGVzdCBwYWNrYWdlLiAtLT4KLSAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmpuaS52ZW5kb3IuY3RzIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIG9mIGNhbGxpbmcgbmF0aXZlIGNvZGUgdmlhIFZlbmRvcidzIEpOSSI+CiAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJsaXN0ZW5lciIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2puaV92ZW5kb3IvQW5kcm9pZFRlc3QueG1sIGIvdGVzdHMvdGVzdHMvam5pX3ZlbmRvci9BbmRyb2lkVGVzdC54bWwKaW5kZXggNjVhZmQ2Yi4uYjYwNjU1OSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvam5pX3ZlbmRvci9BbmRyb2lkVGVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvam5pX3ZlbmRvci9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBWZW5kb3IncyBKTkkgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImFydCIgLz4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvam5pX3ZlbmRvci9saWJ2ZW5kb3Jqbml0ZXN0L0FuZHJvaWQubWsgYi90ZXN0cy90ZXN0cy9qbmlfdmVuZG9yL2xpYnZlbmRvcmpuaXRlc3QvQW5kcm9pZC5tawppbmRleCBjYTU5ZWU4Li5jOWU5MjA1IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9qbmlfdmVuZG9yL2xpYnZlbmRvcmpuaXRlc3QvQW5kcm9pZC5taworKysgYi90ZXN0cy90ZXN0cy9qbmlfdmVuZG9yL2xpYnZlbmRvcmpuaXRlc3QvQW5kcm9pZC5tawpAQCAtMzYsNCArMzYsNiBAQAogCiBMT0NBTF9DRkxBR1MgOj0gLVduby11bnVzZWQtcGFyYW1ldGVyCiAKK0xPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQorCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9qdm10aS9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvanZtdGkvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmFjYzlmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvanZtdGkvQW5kcm9pZC5tawpAQCAtMCwwICsxLDE4IEBACisjIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKKyMgSW5jbHVkZSB0aGUgYXNzb2NpYXRlZCBsaWJyYXJ5J3MgbWFrZWZpbGUuCitpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9qdm10aS9hdHRhY2hpbmcvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL2p2bXRpL2F0dGFjaGluZy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMmE3NjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9qdm10aS9hdHRhY2hpbmcvQW5kcm9pZC5tawpAQCAtMCwwICsxLDM5IEBACisjIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzSnZtdGlBdHRhY2hpbmdUZXN0Q2FzZXMKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKK0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY3RzdGVzdHJ1bm5lci1heHQgYW5kcm9pZHgudGVzdC5ydWxlcworCitMT0NBTF9NVUxUSUxJQiA6PSBib3RoCitMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJqdm10aWF0dGFjaGluZ3Rlc3RhZ2VudDEgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlianZtdGlhdHRhY2hpbmd0ZXN0YWdlbnQyIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYmp2bXRpYXR0YWNoaW5ndGVzdGFnZW50MyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJqdm10aWF0dGFjaGluZ3Rlc3RhZ2VudDQgXAorCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCisKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKKworaW5jbHVkZSAkKEJVSUxEX0NUU19QQUNLQUdFKQorCitpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9qdm10aS9hdHRhY2hpbmcvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL2p2bXRpL2F0dGFjaGluZy9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNjFiY2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9qdm10aS9hdHRhY2hpbmcvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDMyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICB+IENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgIH4KKyAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIH4KKyAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICB+CisgIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJhbmRyb2lkLmptdnRpLmF0dGFjaGluZy5jdHMiPgorCisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6ZGVidWdnYWJsZT0idHJ1ZSI+CisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgorICAgIDwvYXBwbGljYXRpb24+CisKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmptdnRpLmF0dGFjaGluZy5jdHMiCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgdGVzdHMgZm9yIGF0dGFjaGluZyBqdm10aSBhZ2VudHMgZnJvbSBpbnNpZGUgdGhlIGFwcCI+CisgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJsaXN0ZW5lciIKKyAgICAgICAgICAgIGFuZHJvaWQ6dmFsdWU9ImNvbS5hbmRyb2lkLmN0cy5ydW5uZXIuQ3RzVGVzdFJ1bkxpc3RlbmVyIiAvPgorICAgIDwvaW5zdHJ1bWVudGF0aW9uPgorPC9tYW5pZmVzdD4KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvanZtdGkvYXR0YWNoaW5nL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL2p2bXRpL2F0dGFjaGluZy9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU5MjdhMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2p2bXRpL2F0dGFjaGluZy9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwzNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKworPCEtLQorICB+IENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgIH4KKyAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIH4KKyAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICB+CisgIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICAtLT4KKworPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIGp2bXRpIGF0dGFjaGluZyB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgorICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iYXJ0IiAvPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJDdHNKdm10aUF0dGFjaGluZ1Rlc3RDYXNlcy5hcGsiIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkFuZHJvaWRKVW5pdFRlc3QiID4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwYWNrYWdlIiB2YWx1ZT0iYW5kcm9pZC5qbXZ0aS5hdHRhY2hpbmcuY3RzIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjE4cyIgLz4KKyAgICA8L3Rlc3Q+CisKKyAgICA8IS0tIENvbnRyb2xsZXIgdGhhdCB3aWxsIHNraXAgdGhlIG1vZHVsZSBpZiBhIG5hdGl2ZSBicmlkZ2Ugc2l0dWF0aW9uIGlzIGRldGVjdGVkIC0tPgorICAgIDwhLS0gRm9yIGV4YW1wbGU6IG1vZHVsZSB3YW50cyB0byBydW4gYXJtMzIgYW5kIGRldmljZSBpcyB4ODYgLS0+CisgICAgPG9iamVjdCB0eXBlPSJtb2R1bGVfY29udHJvbGxlciIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLnN1aXRlLm1vZHVsZS5OYXRpdmVCcmlkZ2VNb2R1bGVDb250cm9sbGVyIiAvPgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvanZtdGkvYXR0YWNoaW5nL2puaS9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvanZtdGkvYXR0YWNoaW5nL2puaS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZDgzNzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9qdm10aS9hdHRhY2hpbmcvam5pL0FuZHJvaWQubWsKQEAgLTAsMCArMSw0NCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIworIyBUaGlzIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBpbmNsdWRlZCBieSB0aGUgSk5JIHRlc3QgYXBwLgorIworCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworZGVmaW5lIGp2bXRpLWF0dGFjaGluZy10ZXN0LWFnZW50CitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFIDo9IGxpYmp2bXRpYXR0YWNoaW5ndGVzdGFnZW50JDEKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfU1JDX0ZJTEVTIDo9IGFnZW50LmMKKworTE9DQUxfQ19JTkNMVURFUyA6PSAkKEpOSV9IX0lOQ0xVREUpCisKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKKworTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IgLVduby11bnVzZWQtcGFyYW1ldGVyCisKK0xPQ0FMX0NGTEFHUyArPSAtREFHRU5UX05SPSQxCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKK2VuZGVmCisKKyQoZXZhbCAkKGNhbGwganZtdGktYXR0YWNoaW5nLXRlc3QtYWdlbnQsMSkpCiskKGV2YWwgJChjYWxsIGp2bXRpLWF0dGFjaGluZy10ZXN0LWFnZW50LDIpKQorJChldmFsICQoY2FsbCBqdm10aS1hdHRhY2hpbmctdGVzdC1hZ2VudCwzKSkKKyQoZXZhbCAkKGNhbGwganZtdGktYXR0YWNoaW5nLXRlc3QtYWdlbnQsNCkpCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9qdm10aS9hdHRhY2hpbmcvam5pL2FnZW50LmMgYi90ZXN0cy90ZXN0cy9qdm10aS9hdHRhY2hpbmcvam5pL2FnZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ViY2EzMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2p2bXRpL2F0dGFjaGluZy9qbmkvYWdlbnQuYwpAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGpuaS5oPgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorCitzdGF0aWMgYm9vbCBzSXNBdHRhY2hlZCA9IGZhbHNlOworCitqaW50CitBZ2VudF9PbkF0dGFjaChKYXZhVk0qIHZtLCBjaGFyKiBvcHRpb25zLCB2b2lkKiByZXNlcnZlZCkgeworICAgIGlmIChvcHRpb25zICE9IE5VTEwgJiYgb3B0aW9uc1swXSA9PSAnYScpIHsKKyAgICAgICAgc0lzQXR0YWNoZWQgPSB0cnVlOworICAgICAgICByZXR1cm4gSk5JX09LOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBKTklfRVJSOworICAgIH0KK30KKworI2lmbmRlZiBBR0VOVF9OUgorI2Vycm9yICJNaXNzaW5nIEFHRU5UX05SIgorI2VuZGlmCisjZGVmaW5lIENPTkNBVChBLEIpIEEgIyMgQgorI2RlZmluZSBFVkFMKEEsQikgQ09OQ0FUKEEsQikKKyNkZWZpbmUgTkFNRShCQVNFKSBFVkFMKEJBU0UsQUdFTlRfTlIpCisKK0pOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIE5BTUUoSmF2YV9hbmRyb2lkX2p2bXRpX2F0dGFjaGluZ19jdHNfQXR0YWNoaW5nVGVzdF9pc0F0dGFjaGVkKSAoCisgICAgICAgIEpOSUVudiogZW52LCBqY2xhc3Mga2xhc3MpIHsKKyAgICBpZiAoc0lzQXR0YWNoZWQpIHsKKyAgICAgICAgcmV0dXJuIEpOSV9UUlVFOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBKTklfRkFMU0U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvanZtdGkvYXR0YWNoaW5nL3NyYy9hbmRyb2lkLmp2bXRpLmF0dGFjaGluZy5jdHMvQXR0YWNoaW5nVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvanZtdGkvYXR0YWNoaW5nL3NyYy9hbmRyb2lkLmp2bXRpLmF0dGFjaGluZy5jdHMvQXR0YWNoaW5nVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkOGMyZGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9qdm10aS9hdHRhY2hpbmcvc3JjL2FuZHJvaWQuanZtdGkuYXR0YWNoaW5nLmN0cy9BdHRhY2hpbmdUZXN0LmphdmEKQEAgLTAsMCArMSwyMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuanZtdGkuYXR0YWNoaW5nLmN0czsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkRlYnVnOworCitpbXBvcnQgZGFsdmlrLnN5c3RlbS5CYXNlRGV4Q2xhc3NMb2FkZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXJDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuRml4TWV0aG9kT3JkZXI7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLk1ldGhvZFNvcnRlcnM7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7CisKK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitARml4TWV0aG9kT3JkZXIoTWV0aG9kU29ydGVycy5OQU1FX0FTQ0VORElORykKK3B1YmxpYyBjbGFzcyBBdHRhY2hpbmdUZXN0IHsKKyAgICAvLyBTb21lIHN0YXRpYyBzdG9yZWQgc3RhdGUsIGZvciBmaW5hbCBjbGVhbnVwLgorICAgIHByaXZhdGUgc3RhdGljIFNldDxGaWxlPiBjcmVhdGVkRmlsZXMgPSBuZXcgSGFzaFNldDw+KCk7CisKKyAgICAvLyBQYXJhbWV0ZXJzIGZvciBhIHRlc3QgaW5zdGFuY2UuCisKKyAgICAvLyBUaGUgc3RyaW5nIHRvIHBhc3MgYXMgdGhlIGFnZW50IHBhcmFtZXRlci4KKyAgICBwcml2YXRlIFN0cmluZyBhZ2VudFN0cmluZzsKKyAgICAvLyBUaGUgY2xhc3Nsb2FkZXIgdG8gcGFzcy4KKyAgICBwcml2YXRlIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyOworICAgIC8vIFRoZSBhdHRhY2gtc3VjY2VzcyBmdW5jdGlvbiBmb3IgdGhlIGxhc3QgdGVzdC4KKyAgICBwcml2YXRlIENhbGxhYmxlPEJvb2xlYW4+IGlzQXR0YWNoZWRGbjsKKworICAgIHB1YmxpYyBBdHRhY2hpbmdUZXN0KFN0cmluZyBhZ2VudFN0cmluZywgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIsCisgICAgICAgICAgICBDYWxsYWJsZTxCb29sZWFuPiBpc0F0dGFjaGVkRm4pIHsKKyAgICAgICAgdGhpcy5hZ2VudFN0cmluZyA9IGFnZW50U3RyaW5nOworICAgICAgICB0aGlzLmNsYXNzTG9hZGVyID0gY2xhc3NMb2FkZXI7CisgICAgICAgIHRoaXMuaXNBdHRhY2hlZEZuID0gaXNBdHRhY2hlZEZuOworICAgIH0KKworICAgIEBQYXJhbWV0ZXJzCisgICAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPE9iamVjdFtdPiBkYXRhKCkgeworICAgICAgICBDb2xsZWN0aW9uPE9iamVjdFtdPiBwYXJhbXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gVGVzdCB0aGF0IGFuIGFic29sdXRlIHBhdGggd29ya3Mgdy9vIGdpdmVuIGNsYXNzbG9hZGVyLgorICAgICAgICAgICAgRmlsZSBhZ2VudEV4dHJhY3RlZCA9IGNvcHlBZ2VudFRvRmlsZSgianZtdGlhdHRhY2hpbmd0ZXN0YWdlbnQxIik7CisgICAgICAgICAgICBDYWxsYWJsZTxCb29sZWFuPiBzdWNjZXNzID0gQXR0YWNoaW5nVGVzdDo6aXNBdHRhY2hlZDE7CisgICAgICAgICAgICBwYXJhbXMuYWRkKG5ldyBPYmplY3RbXSB7CisgICAgICAgICAgICAgICAgYWdlbnRFeHRyYWN0ZWQuZ2V0QWJzb2x1dGVQYXRoKCksCisgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICBzdWNjZXNzLAorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBjcmVhdGVkRmlsZXMuYWRkKGFnZW50RXh0cmFjdGVkKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4YykgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXhjKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBUZXN0IHRoYXQgYW4gYWJzb2x1dGUgcGF0aCB3b3JrcyB3LyBnaXZlbiBjbGFzc2xvYWRlci4KKyAgICAgICAgICAgIEZpbGUgYWdlbnRFeHRyYWN0ZWQgPSBjb3B5QWdlbnRUb0ZpbGUoImp2bXRpYXR0YWNoaW5ndGVzdGFnZW50MiIpOworICAgICAgICAgICAgQ2FsbGFibGU8Qm9vbGVhbj4gc3VjY2VzcyA9IEF0dGFjaGluZ1Rlc3Q6OmlzQXR0YWNoZWQyOworICAgICAgICAgICAgcGFyYW1zLmFkZChuZXcgT2JqZWN0W10geworICAgICAgICAgICAgICAgIGFnZW50RXh0cmFjdGVkLmdldEFic29sdXRlUGF0aCgpLAorICAgICAgICAgICAgICAgIEF0dGFjaGluZ1Rlc3QuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSwKKyAgICAgICAgICAgICAgICBzdWNjZXNzLAorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBjcmVhdGVkRmlsZXMuYWRkKGFnZW50RXh0cmFjdGVkKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4YykgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXhjKTsKKyAgICAgICAgfQorCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRlc3QgdGhhdCBhIHJlbGF0aXZlIHBhdGggd29ya3Mgdy8gZ2l2ZW4gY2xhc3Nsb2FkZXIuCisgICAgICAgICAgICBDYWxsYWJsZTxCb29sZWFuPiBzdWNjZXNzID0gQXR0YWNoaW5nVGVzdDo6aXNBdHRhY2hlZDM7CisgICAgICAgICAgICBwYXJhbXMuYWRkKG5ldyBPYmplY3RbXSB7CisgICAgICAgICAgICAgICAgImxpYmp2bXRpYXR0YWNoaW5ndGVzdGFnZW50My5zbyIsCisgICAgICAgICAgICAgICAgQXR0YWNoaW5nVGVzdC5jbGFzcy5nZXRDbGFzc0xvYWRlcigpLAorICAgICAgICAgICAgICAgIHN1Y2Nlc3MsCisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBUaGUgbmFtZSBwYXJ0IG9mIGFuIGV4dHJhY3RlZCBsaWIgc2hvdWxkIG5vdCB3b3JrLgorICAgICAgICAgICAgRmlsZSBhZ2VudEV4dHJhY3RlZCA9IGNvcHlBZ2VudFRvRmlsZSgianZtdGlhdHRhY2hpbmd0ZXN0YWdlbnQ0Iik7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGFnZW50RXh0cmFjdGVkLmdldE5hbWUoKTsKKyAgICAgICAgICAgIENhbGxhYmxlPEJvb2xlYW4+IHN1Y2Nlc3MgPSAoKSAtPiB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaXNBdHRhY2hlZDQoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gQW55IHJlc3VsdCBpcyBhIGZhaWx1cmUuCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChVbnNhdGlzZmllZExpbmtFcnJvciBlKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBwYXJhbXMuYWRkKG5ldyBPYmplY3RbXSB7CisgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICBBdHRhY2hpbmdUZXN0LmNsYXNzLmdldENsYXNzTG9hZGVyKCksCisgICAgICAgICAgICAgICAgc3VjY2VzcywKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgY3JlYXRlZEZpbGVzLmFkZChhZ2VudEV4dHJhY3RlZCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4Yyk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcGFyYW1zOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEZpbGUgY29weUFnZW50VG9GaWxlKFN0cmluZyBsaWIpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDbGFzc0xvYWRlciBjbCA9IEF0dGFjaGluZ1Rlc3QuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjbCBpbnN0YW5jZW9mIEJhc2VEZXhDbGFzc0xvYWRlcik7CisKKyAgICAgICAgRmlsZSBjb3BpZWRBZ2VudCA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoImFnZW50IiwgIi5zbyIpOworICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbSgKKyAgICAgICAgICAgICAgICAoKEJhc2VEZXhDbGFzc0xvYWRlcikgY2wpLmZpbmRMaWJyYXJ5KGxpYikpKSB7CisgICAgICAgICAgICB0cnkgKE91dHB1dFN0cmVhbSBvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGNvcGllZEFnZW50KSkgeworICAgICAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVs2NCAqIDEwMjRdOworCisgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IG51bVJlYWQgPSBpcy5yZWFkKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgIGlmIChudW1SZWFkID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvcy53cml0ZShidWZmZXIsIDAsIG51bVJlYWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjb3BpZWRBZ2VudDsKKyAgICB9CisKKyAgICBAQWZ0ZXJDbGFzcworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhbnVwRXh0cmFjdGVkQWdlbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoRmlsZSBmIDogY3JlYXRlZEZpbGVzKSB7CisgICAgICAgICAgICBmLmRlbGV0ZSgpOworICAgICAgICB9CisgICAgICAgIGNyZWF0ZWRGaWxlcy5jbGVhcigpOworICAgIH0KKworICAgIC8vIFRlc3RzLgorCisgICAgLy8gVGhpcyB3aWxsIGJlIHJlcGVhdGVkIHVubmVjZXNzYXJpbHksIGJ1dCB0aGF0J3MgT0suCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBJT0V4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCBhX2F0dGFjaEludmFsaWRBZ2VudCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBGaWxlIHRtcEZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJiYWRBZ2VudCIsICIuc28iKTsKKyAgICAgICAgY3JlYXRlZEZpbGVzLmFkZCh0bXBGaWxlKTsKKyAgICAgICAgRGVidWcuYXR0YWNoSnZtdGlBZ2VudCh0bXBGaWxlLmdldEFic29sdXRlUGF0aCgpLCBudWxsLCBjbGFzc0xvYWRlcik7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBJT0V4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCBhX2F0dGFjaEludmFsaWRQYXRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIERlYnVnLmF0dGFjaEp2bXRpQWdlbnQoYWdlbnRTdHJpbmcgKyAiLmludmFsaWQiLCBudWxsLCBjbGFzc0xvYWRlcik7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBOdWxsUG9pbnRlckV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCBhX2F0dGFjaE51bGxBZ2VudCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBEZWJ1Zy5hdHRhY2hKdm10aUFnZW50KG51bGwsIG51bGwsIGNsYXNzTG9hZGVyKTsKKyAgICB9CisKKyAgICAvLyBUaGlzIHdpbGwgYmUgcmVwZWF0ZWQgdW5uZWNlc3NhcmlseSwgYnV0IHRoYXQncyBPSy4KKyAgICBAVGVzdChleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCBhX2F0dGFjaFdpdGhFcXVhbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSB0bXBGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiPSIsICIuc28iKTsKKyAgICAgICAgY3JlYXRlZEZpbGVzLmFkZCh0bXBGaWxlKTsKKyAgICAgICAgRGVidWcuYXR0YWNoSnZtdGlBZ2VudCh0bXBGaWxlLmdldEFic29sdXRlUGF0aCgpLCBudWxsLCBjbGFzc0xvYWRlcik7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBJT0V4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCBhX2F0dGFjaFdpdGhOdWxsT3B0aW9ucygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBEZWJ1Zy5hdHRhY2hKdm10aUFnZW50KGFnZW50U3RyaW5nLCBudWxsLCBjbGFzc0xvYWRlcik7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBJT0V4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCBhX2F0dGFjaFdpdGhCYWRPcHRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIERlYnVnLmF0dGFjaEp2bXRpQWdlbnQoYWdlbnRTdHJpbmcsICJiIiwgY2xhc3NMb2FkZXIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgYl9hdHRhY2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIERlYnVnLmF0dGFjaEp2bXRpQWdlbnQoYWdlbnRTdHJpbmcsICJhIiwgY2xhc3NMb2FkZXIpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgLy8gSWdub3JlZC4KKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydFRydWUoaXNBdHRhY2hlZEZuLmNhbGwoKSk7CisgICAgfQorCisgICAgLy8gRnVuY3Rpb25zIHRoZSBhZ2VudHMgY2FuIGJpbmQgdG8uCisKKyAgICBuYXRpdmUgc3RhdGljIGJvb2xlYW4gaXNBdHRhY2hlZDEoKTsKKyAgICBuYXRpdmUgc3RhdGljIGJvb2xlYW4gaXNBdHRhY2hlZDIoKTsKKyAgICBuYXRpdmUgc3RhdGljIGJvb2xlYW4gaXNBdHRhY2hlZDMoKTsKKyAgICBuYXRpdmUgc3RhdGljIGJvb2xlYW4gaXNBdHRhY2hlZDQoKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2tleXN0b3JlL0FuZHJvaWQubWsgYi90ZXN0cy90ZXN0cy9rZXlzdG9yZS9BbmRyb2lkLm1rCmluZGV4IGVhMjQ5NTQuLmM0ZTc5NmMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2tleXN0b3JlL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvdGVzdHMva2V5c3RvcmUvQW5kcm9pZC5tawpAQCAtMjYsMTMgKzI2LDE0IEBACiBMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBib3VuY3ljYXN0bGUKIAogTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKLSAgICAgICAgYW5kcm9pZC1zdXBwb3J0LXRlc3QgXAorICAgICAgICBhbmRyb2lkeC50ZXN0LnJ1bGVzIFwKICAgICAgICAgY29yZS10ZXN0cy1zdXBwb3J0IFwKLSAgICAgICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbCBcCi0gICAgICAgIGN0c3Rlc3RydW5uZXIgXAorICAgICAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBcCisgICAgICAgIGN0c3Rlc3RydW5uZXItYXh0IGhhbWNyZXN0LWxpYnJhcnkgXAogICAgICAgICBndWF2YSBcCiAgICAgICAgIGp1bml0IFwKLSAgICAgICAgbGVnYWN5LWFuZHJvaWQtdGVzdAorICAgICAgICBjdHMtc2VjdXJpdHktdGVzdC1zdXBwb3J0LWxpYnJhcnkgXAorICAgICAgICBwbGF0Zm9ybXByb3Rvc25hbm8KIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogCkBAIC00OCw3ICs0OSw5IEBACiAjCiAjIFVuY29tbWVudCB3aGVuIGIvMTMyODIyNTQgaXMgZml4ZWQuCiAjIExPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKLUxPQ0FMX0pBVkFfTElCUkFSSUVTICs9IGFuZHJvaWQudGVzdC5ydW5uZXIKK0xPQ0FMX1BSSVZBVEVfUExBVEZPUk1fQVBJUyA6PSB0cnVlCitMT0NBTF9KQVZBX0xJQlJBUklFUyArPSBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzCitMT0NBTF9KQVZBX0xJQlJBUklFUyArPSBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicwogCiBpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2tleXN0b3JlL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy90ZXN0cy9rZXlzdG9yZS9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDM2NzhmNjMuLjM0Zjc5ODUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2tleXN0b3JlL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMva2V5c3RvcmUvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMTgsMTMgKzE4LDEzIEBACiA8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgogICAgIHBhY2thZ2U9ImFuZHJvaWQua2V5c3RvcmUuY3RzIj4KIAotICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uRElTQUJMRV9LRVlHVUFSRCIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLk1BTkFHRV9BQ1RJVklUWV9TVEFDS1MiIC8+CiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5JTlRFUk5FVCIgLz4KICAgICA8YXBwbGljYXRpb24+CiAgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgogICAgIDwvYXBwbGljYXRpb24+CiAKLSAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmtleXN0b3JlLmN0cyIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBvZiBhbmRyb2lkLmtleXN0b3JlLmN0cyI+CiAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJsaXN0ZW5lciIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2tleXN0b3JlL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL2tleXN0b3JlL0FuZHJvaWRUZXN0LnhtbAppbmRleCA4NzkxM2VkLi40MGJlYWU2IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9rZXlzdG9yZS9BbmRyb2lkVGVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMva2V5c3RvcmUvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgS2V5c3RvcmUgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9InNlY3VyaXR5IiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CkBAIC0yMiw3ICsyMyw3IEBACiAgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkFuZHJvaWRKVW5pdFRlc3QiID4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJwYWNrYWdlIiB2YWx1ZT0iYW5kcm9pZC5rZXlzdG9yZS5jdHMiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icnVudGltZS1oaW50IiB2YWx1ZT0iMTZtMzlzIiAvPgotICAgICAgICA8IS0tIHRlc3QtdGltZW91dCB1bml0IGlzIG1zLCB2YWx1ZSA9IDEwIG1pbiAtLT4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXRpbWVvdXQiIHZhbHVlPSI2MDAwMDAiIC8+CisgICAgICAgIDwhLS0gdGVzdC10aW1lb3V0IHVuaXQgaXMgbXMsIHZhbHVlID0gNTAgbWluIC0tPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtdGltZW91dCIgdmFsdWU9IjMwMDAwMDAiIC8+CiAgICAgPC90ZXN0PgogPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMva2V5c3RvcmUvc3JjL2FuZHJvaWQva2V5c3RvcmUvY3RzL0FuZHJvaWRLZXlTdG9yZVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2tleXN0b3JlL3NyYy9hbmRyb2lkL2tleXN0b3JlL2N0cy9BbmRyb2lkS2V5U3RvcmVUZXN0LmphdmEKaW5kZXggMmEzOWRhYi4uNzlmODdlMCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMva2V5c3RvcmUvc3JjL2FuZHJvaWQva2V5c3RvcmUvY3RzL0FuZHJvaWRLZXlTdG9yZVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9rZXlzdG9yZS9zcmMvYW5kcm9pZC9rZXlzdG9yZS9jdHMvQW5kcm9pZEtleVN0b3JlVGVzdC5qYXZhCkBAIC0zMCw4ICszMCw2IEBACiAKIGltcG9ydCBhbmRyb2lkLmtleXN0b3JlLmN0cy5SOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DZGRUZXN0OwotCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKQEAgLTY1LDYgKzYzLDcgQEAKIAogaW1wb3J0IGphdmF4LmNyeXB0by5CYWRQYWRkaW5nRXhjZXB0aW9uOwogaW1wb3J0IGphdmF4LmNyeXB0by5DaXBoZXI7CitpbXBvcnQgamF2YXguY3J5cHRvLklsbGVnYWxCbG9ja1NpemVFeGNlcHRpb247CiBpbXBvcnQgamF2YXguY3J5cHRvLk1hYzsKIGltcG9ydCBqYXZheC5jcnlwdG8uU2VjcmV0S2V5OwogaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGgueDUwMC5YNTAwUHJpbmNpcGFsOwpAQCAtMTM0Niw0NiArMTM0NSw2IEBACiAgICAgICAgIGFzc2VydFByaXZhdGVLZXlFbnRyeUVxdWFscyhhY3R1YWwsICJSU0EiLCBGQUtFX1JTQV9LRVlfMSwgRkFLRV9SU0FfVVNFUl8xLCBGQUtFX1JTQV9DQV8xKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5U3RvcmVfU2V0RW50cnlfUHJpdmF0ZUtleUVudHJ5X1BhcmFtc19VbmVuY3J5cHRlZF9GYWlsdXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFRoZSBBbmRyb2lkIEtleXN0b3JlIHJlcXVpcmVzIGVuY3J5cHRlZCBzdG9yYWdlIHdoaWNoIGlzIG9ubHkgZGVjcnlwdGFibGUgd2l0aCBhIGtleQotICAgICAgICAvLyBib3VuZCB0byBhIGNyZWRlbnRpYWwgcHJvdmlkZWQgYnkgdGhlIHVzZXIuIEJ5IGRlZmF1bHQsIHRoZSBLZXlzdG9yZSB3YWl0cyBmb3IgdGhlIHVzZXIKLSAgICAgICAgLy8gdG8gc2V0IGEgbG9jayBzY3JlZW4gUElOIG9yIHBhc3N3b3JkIGFuZCB1c2VzIHRoaXMgY3JlZGVudGlhbCB0byBzZXQgdXAgYW4gZW5jcnlwdGVkCi0gICAgICAgIC8vIHN0b3JhZ2Ugc3BhY2UgaXRzZWxmLiBJbiB0aGF0IGltcGxlbWVudGF0aW9uLCB0aGUgS2V5c3RvcmUgc2hvdWxkIG5vdCBiZSBpbml0aWFsaXplZCB3aGVuCi0gICAgICAgIC8vIG5vIGxvY2sgc2NyZWVuIFBJTiBvciBwYXNzd29yZCBoYXMgYmVlbiBzZXQuIFRoaXMgaXMgd2hhdCB0aGUgdGVzdCB2ZXJpZmllcy4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gSWYgeW91ciBlbnZpcm9ubWVudCBhbHJlYWR5IHByb3ZpZGVzIGVuY3J5cHRlZCBzdG9yYWdlIHdoaWNoIGlzIG9ubHkgZGVjcnlwdGFibGUgd2l0aCBhCi0gICAgICAgIC8vIGtleSBib3VuZCB0byBhbm90aGVyIGNyZWRlbnRpYWwgcHJvdmlkZWQgYnkgdGhlIHVzZXIsIHlvdSBtYXkgaW5pdGlhbGl6ZSB0aGUgS2V5c3RvcmUKLSAgICAgICAgLy8gaW1tZWRpYXRlbHkgYW5kIGdldCBhIHdhaXZlciBmb3IgdGhpcyB0ZXN0LgotICAgICAgICBLZXlndWFyZE1hbmFnZXIga2V5Z3VhcmRNYW5hZ2VyID0KLSAgICAgICAgICAgICAgICAoS2V5Z3VhcmRNYW5hZ2VyKSBnZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LktFWUdVQVJEX1NFUlZJQ0UpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGtleWd1YXJkTWFuYWdlcik7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJTZWN1cmUgbG9jayBzY3JlZW4gbXVzdCBub3QgYmUgY29uZmlndXJlZCIsIGtleWd1YXJkTWFuYWdlci5pc0RldmljZVNlY3VyZSgpKTsKLQotICAgICAgICBtS2V5U3RvcmUubG9hZChudWxsLCBudWxsKTsKLQotICAgICAgICBLZXlGYWN0b3J5IGtleUZhY3QgPSBLZXlGYWN0b3J5LmdldEluc3RhbmNlKCJSU0EiKTsKLSAgICAgICAgUHJpdmF0ZUtleSBleHBlY3RlZEtleSA9IGtleUZhY3QuZ2VuZXJhdGVQcml2YXRlKG5ldyBQS0NTOEVuY29kZWRLZXlTcGVjKEZBS0VfUlNBX0tFWV8xKSk7Ci0KLSAgICAgICAgZmluYWwgQ2VydGlmaWNhdGVGYWN0b3J5IGYgPSBDZXJ0aWZpY2F0ZUZhY3RvcnkuZ2V0SW5zdGFuY2UoIlguNTA5Iik7Ci0KLSAgICAgICAgZmluYWwgQ2VydGlmaWNhdGVbXSBleHBlY3RlZENoYWluID0gbmV3IENlcnRpZmljYXRlWzJdOwotICAgICAgICBleHBlY3RlZENoYWluWzBdID0gZi5nZW5lcmF0ZUNlcnRpZmljYXRlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShGQUtFX1JTQV9VU0VSXzEpKTsKLSAgICAgICAgZXhwZWN0ZWRDaGFpblsxXSA9IGYuZ2VuZXJhdGVDZXJ0aWZpY2F0ZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oRkFLRV9SU0FfQ0FfMSkpOwotCi0gICAgICAgIFByaXZhdGVLZXlFbnRyeSBlbnRyeSA9IG5ldyBQcml2YXRlS2V5RW50cnkoZXhwZWN0ZWRLZXksIGV4cGVjdGVkQ2hhaW4pOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtS2V5U3RvcmUuc2V0RW50cnkoVEVTVF9BTElBU18xLCBlbnRyeSwKLSAgICAgICAgICAgICAgICAgICAgbmV3IEtleVN0b3JlUGFyYW1ldGVyLkJ1aWxkZXIoZ2V0Q29udGV4dCgpKQotICAgICAgICAgICAgICAgICAgICAuc2V0RW5jcnlwdGlvblJlcXVpcmVkKHRydWUpCi0gICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKLSAgICAgICAgICAgIGZhaWwoIlNob3VsZG4ndCBiZSBhYmxlIHRvIGluc2VydCBlbmNyeXB0ZWQgZW50cnkgd2hlbiBLZXlTdG9yZSB1bmluaXRpYWxpemVkIik7Ci0gICAgICAgIH0gY2F0Y2ggKEtleVN0b3JlRXhjZXB0aW9uIGV4cGVjdGVkKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnROdWxsKG1LZXlTdG9yZS5nZXRFbnRyeShURVNUX0FMSUFTXzEsIG51bGwpKTsKLSAgICB9Ci0KICAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5U3RvcmVfU2V0RW50cnlfUHJpdmF0ZUtleUVudHJ5X092ZXJ3cml0ZXNfUHJpdmF0ZUtleUVudHJ5X1VuZW5jcnlwdGVkX1N1Y2Nlc3MoKQogICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIG1LZXlTdG9yZS5sb2FkKG51bGwsIG51bGwpOwpAQCAtMTk2OSw5ICsxOTI4LDExIEBACiAgICAgICAgIC8vIGlzIGJpZ2dlciB0aGFuIHRoZSBtb2R1bHVzLgogICAgICAgICB0cnkgewogICAgICAgICAgICAgZW5jcnlwdC5kb0ZpbmFsKHBsYWluVGV4dCk7Ci0gICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBCYWRQYWRkaW5nRXhjZXB0aW9uIik7CisgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBCYWRQYWRkaW5nRXhjZXB0aW9uIG9yIElsbGVnYWxCbG9ja1NpemVFeGNlcHRpb24iKTsKICAgICAgICAgfSBjYXRjaCAoQmFkUGFkZGluZ0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAvLyBwYXNzIG9uIGV4Y2VwdGlvbiBhcyBpdCBpcyBleHBlY3RlZAorICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIHBhc3Mgb24gZXhjZXB0aW9uIGFzIGl0IGlzIGV4cGVjdGVkCiAgICAgICAgIH0KICAgICB9CiAKQEAgLTIwMzcsOCArMTk5OCw4IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUlOX1NVUFBPUlRFRF9LRVlfQ09VTlQgPSAxNTAwOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgTUlOVVRFX0lOX01JTExJUyA9IDEwMDAgKiA2MDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIExBUkdFX05VTUJFUl9PRl9LRVlTX1RFU1RfTUFYX0RVUkFUSU9OX01JTExJUyA9IDIgKiBNSU5VVEVfSU5fTUlMTElTOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgTEFSR0VfTlVNQkVSX09GX0tFWVNfVEVTVF9NQVhfRFVSQVRJT05fV0FUQ0hfTUlMTElTID0gMyAqIE1JTlVURV9JTl9NSUxMSVM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBMQVJHRV9OVU1CRVJfT0ZfS0VZU19URVNUX01BWF9EVVJBVElPTl9NSUxMSVMgPSA0ICogTUlOVVRFX0lOX01JTExJUzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIExBUkdFX05VTUJFUl9PRl9LRVlTX1RFU1RfTUFYX0RVUkFUSU9OX1dBVENIX01JTExJUyA9IDYgKiBNSU5VVEVfSU5fTUlMTElTOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0RlYWRsaW5lUmVhY2hlZChsb25nIHN0YXJ0VGltZU1pbGxpcywgbG9uZyBkdXJhdGlvbk1pbGxpcykgewogICAgICAgICBsb25nIG5vd01pbGxpcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwpAQCAtMjE0Niw3ICsyMTA3LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI5LjExL0MtMC0xIikKICAgICBATGFyZ2VUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEtleVN0b3JlX0xhcmdlTnVtYmVyT2ZLZXlzU3VwcG9ydGVkX0VDKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRoaXMgdGVzdCBpbXBvcnRzIGtleTEsIHRoZW4gbG90cyBvZiBvdGhlciBrZXlzLCB0aGVuIGtleTIsIGFuZCB0aGVuIGNvbmZpcm1zIHRoYXQKQEAgLTIyNDUsNyArMjIwNSw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iOS4xMS9DLTAtMSIpCiAgICAgQExhcmdlVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RLZXlTdG9yZV9MYXJnZU51bWJlck9mS2V5c1N1cHBvcnRlZF9BRVMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGhpcyB0ZXN0IGltcG9ydHMga2V5MSwgdGhlbiBsb3RzIG9mIG90aGVyIGtleXMsIHRoZW4ga2V5MiwgYW5kIHRoZW4gY29uZmlybXMgdGhhdApAQCAtMjMzNiw3ICsyMjk1LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI5LjExL0MtMC0xIikKICAgICBATGFyZ2VUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEtleVN0b3JlX0xhcmdlTnVtYmVyT2ZLZXlzU3VwcG9ydGVkX0hNQUMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGhpcyB0ZXN0IGltcG9ydHMga2V5MSwgdGhlbiBsb3RzIG9mIG90aGVyIGtleXMsIHRoZW4ga2V5MiwgYW5kIHRoZW4gY29uZmlybXMgdGhhdApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMva2V5c3RvcmUvc3JjL2FuZHJvaWQva2V5c3RvcmUvY3RzL0F0dGVzdGF0aW9uUGFja2FnZUluZm8uamF2YSBiL3Rlc3RzL3Rlc3RzL2tleXN0b3JlL3NyYy9hbmRyb2lkL2tleXN0b3JlL2N0cy9BdHRlc3RhdGlvblBhY2thZ2VJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NGZkYTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvdGVzdHMva2V5c3RvcmUvc3JjL2FuZHJvaWQva2V5c3RvcmUvY3RzL0F0dGVzdGF0aW9uUGFja2FnZUluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdAotICogaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlCi0gKiBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3MKLSAqIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKLSAqIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5rZXlzdG9yZS5jdHM7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZTsKLWltcG9ydCBjb20uYW5kcm9pZC5vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlOwotCi1pbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIEF0dGVzdGF0aW9uUGFja2FnZUluZm8gaW1wbGVtZW50cyBqYXZhLmxhbmcuQ29tcGFyYWJsZTxBdHRlc3RhdGlvblBhY2thZ2VJbmZvPiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBQ0tBR0VfTkFNRV9JTkRFWCA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fSU5ERVggPSAxOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcGFja2FnZU5hbWU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgdmVyc2lvbjsKLQotICAgIHB1YmxpYyBBdHRlc3RhdGlvblBhY2thZ2VJbmZvKFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHZlcnNpb24pIHsKLSAgICAgICAgdGhpcy5wYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lOwotICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBBdHRlc3RhdGlvblBhY2thZ2VJbmZvKEFTTjFFbmNvZGFibGUgYXNuMUVuY29kYWJsZSkgdGhyb3dzIENlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghKGFzbjFFbmNvZGFibGUgaW5zdGFuY2VvZiBBU04xU2VxdWVuY2UpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgc2VxdWVuY2UgZm9yIEF0dGVzdGF0aW9uUGFja2FnZUluZm8sIGZvdW5kICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGFzbjFFbmNvZGFibGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQVNOMVNlcXVlbmNlIHNlcXVlbmNlID0gKEFTTjFTZXF1ZW5jZSkgYXNuMUVuY29kYWJsZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHBhY2thZ2VOYW1lID0gQXNuMVV0aWxzLmdldFN0cmluZ0Zyb21Bc24xT2N0ZXRTdHJlYW1Bc3N1bWluZ1VURjgoCi0gICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlLmdldE9iamVjdEF0KFBBQ0tBR0VfTkFNRV9JTkRFWCkpOwotICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJDb252ZXJ0aW5nIG9jdGV0IHN0cmVhbSB0byBTdHJpbmcgdHJpZ2dlcmVkIGFuIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24iLAotICAgICAgICAgICAgICAgICAgICBlKTsKLSAgICAgICAgfQotICAgICAgICB2ZXJzaW9uID0gQXNuMVV0aWxzLmdldEludGVnZXJGcm9tQXNuMShzZXF1ZW5jZS5nZXRPYmplY3RBdChWRVJTSU9OX0lOREVYKSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHBhY2thZ2VOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0VmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIHZlcnNpb247Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdCdWlsZGVyKCkuYXBwZW5kKCJQYWNrYWdlIG5hbWU6ICIpLmFwcGVuZChnZXRQYWNrYWdlTmFtZSgpKQotICAgICAgICAgICAgICAgIC5hcHBlbmQoIlxuVmVyc2lvbjogIiArIGdldFZlcnNpb24oKSkudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhBdHRlc3RhdGlvblBhY2thZ2VJbmZvIG90aGVyKSB7Ci0gICAgICAgIGludCByZXMgPSBwYWNrYWdlTmFtZS5jb21wYXJlVG8ob3RoZXIucGFja2FnZU5hbWUpOwotICAgICAgICBpZiAocmVzICE9IDApIHJldHVybiByZXM7Ci0gICAgICAgIHJlcyA9IEludGVnZXIuY29tcGFyZSh2ZXJzaW9uLCBvdGhlci52ZXJzaW9uKTsKLSAgICAgICAgaWYgKHJlcyAhPSAwKSByZXR1cm4gcmVzOwotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotICAgICAgICByZXR1cm4gKG8gaW5zdGFuY2VvZiBBdHRlc3RhdGlvblBhY2thZ2VJbmZvKQotICAgICAgICAgICAgICAgICYmICgwID09IGNvbXBhcmVUbygoQXR0ZXN0YXRpb25QYWNrYWdlSW5mbykgbykpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2tleXN0b3JlL3NyYy9hbmRyb2lkL2tleXN0b3JlL2N0cy9BdXRob3JpemF0aW9uTGlzdC5qYXZhIGIvdGVzdHMvdGVzdHMva2V5c3RvcmUvc3JjL2FuZHJvaWQva2V5c3RvcmUvY3RzL0F1dGhvcml6YXRpb25MaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ODhiMjYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvdGVzdHMva2V5c3RvcmUvc3JjL2FuZHJvaWQva2V5c3RvcmUvY3RzL0F1dGhvcml6YXRpb25MaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ODEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5rZXlzdG9yZS5jdHM7Ci0KLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5GdW5jdGlvbnMuZm9yTWFwOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkNvbGxlY3Rpb25zMi50cmFuc2Zvcm07Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkpvaW5lcjsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOwotCi1pbXBvcnQgYW5kcm9pZC5zZWN1cml0eS5rZXlzdG9yZS5LZXlQcm9wZXJ0aWVzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZTsKLWltcG9ydCBjb20uYW5kcm9pZC5vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVByaW1pdGl2ZTsKLWltcG9ydCBjb20uYW5kcm9pZC5vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLm9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2VQYXJzZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQub3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFUYWdnZWRPYmplY3Q7Ci1pbXBvcnQgY29tLmFuZHJvaWQub3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFJbnB1dFN0cmVhbTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1wdWJsaWMgY2xhc3MgQXV0aG9yaXphdGlvbkxpc3QgewotICAgIC8vIEFsZ29yaXRobSB2YWx1ZXMuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS01fQUxHT1JJVEhNX1JTQSA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS01fQUxHT1JJVEhNX0VDID0gMzsKLQotICAgIC8vIEVDIEN1cnZlcwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtNX0VDX0NVUlZFX1AyMjQgPSAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtNX0VDX0NVUlZFX1AyNTYgPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtNX0VDX0NVUlZFX1AzODQgPSAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtNX0VDX0NVUlZFX1A1MjEgPSAzOwotCi0gICAgLy8gUGFkZGluZyBtb2Rlcy4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLTV9QQURfTk9ORSA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS01fUEFEX1JTQV9PQUVQID0gMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLTV9QQURfUlNBX1BTUyA9IDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS01fUEFEX1JTQV9QS0NTMV8xXzVfRU5DUllQVCA9IDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS01fUEFEX1JTQV9QS0NTMV8xXzVfU0lHTiA9IDU7Ci0KLSAgICAvLyBEaWdlc3QgbW9kZXMuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS01fRElHRVNUX05PTkUgPSAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtNX0RJR0VTVF9NRDUgPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtNX0RJR0VTVF9TSEExID0gMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLTV9ESUdFU1RfU0hBXzJfMjI0ID0gMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLTV9ESUdFU1RfU0hBXzJfMjU2ID0gNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLTV9ESUdFU1RfU0hBXzJfMzg0ID0gNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLTV9ESUdFU1RfU0hBXzJfNTEyID0gNjsKLQotICAgIC8vIEtleSBvcmlnaW5zLgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtNX09SSUdJTl9HRU5FUkFURUQgPSAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtNX09SSUdJTl9JTVBPUlRFRCA9IDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS01fT1JJR0lOX1VOS05PV04gPSAzOwotCi0gICAgLy8gT3BlcmF0aW9uIFB1cnBvc2VzLgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtNX1BVUlBPU0VfRU5DUllQVCA9IDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS01fUFVSUE9TRV9ERUNSWVBUID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLTV9QVVJQT1NFX1NJR04gPSAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtNX1BVUlBPU0VfVkVSSUZZID0gMzsKLQotICAgIC8vIFVzZXIgYXV0aGVudGljYXRvcnMuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSFdfQVVUSF9QQVNTV09SRCA9IDEgPDwgMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIV19BVVRIX0ZJTkdFUlBSSU5UID0gMSA8PCAxOwotCi0gICAgLy8gS2V5bWFzdGVyIHRhZyBjbGFzc2VzCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEtNX0VOVU0gPSAxIDw8IDI4OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBLTV9FTlVNX1JFUCA9IDIgPDwgMjg7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEtNX1VJTlQgPSAzIDw8IDI4OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBLTV9VTE9ORyA9IDUgPDwgMjg7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEtNX0RBVEUgPSA2IDw8IDI4OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBLTV9CT09MID0gNyA8PCAyODsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgS01fQllURVMgPSA5IDw8IDI4OwotCi0gICAgLy8gVGFnIGNsYXNzIHJlbW92YWwgbWFzawotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBLRVlNQVNURVJfVEFHX1RZUEVfTUFTSyA9IDB4MEZGRkZGRkY7Ci0KLSAgICAvLyBLZXltYXN0ZXIgdGFncwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBLTV9UQUdfUFVSUE9TRSA9IEtNX0VOVU1fUkVQIHwgMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgS01fVEFHX0FMR09SSVRITSA9IEtNX0VOVU0gfCAyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBLTV9UQUdfS0VZX1NJWkUgPSBLTV9VSU5UIHwgMzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgS01fVEFHX0RJR0VTVCA9IEtNX0VOVU1fUkVQIHwgNTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgS01fVEFHX1BBRERJTkcgPSBLTV9FTlVNX1JFUCB8IDY7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEtNX1RBR19FQ19DVVJWRSA9IEtNX0VOVU0gfCAxMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgS01fVEFHX1JTQV9QVUJMSUNfRVhQT05FTlQgPSBLTV9VTE9ORyB8IDIwMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgS01fVEFHX0FDVElWRV9EQVRFVElNRSA9IEtNX0RBVEUgfCA0MDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEtNX1RBR19PUklHSU5BVElPTl9FWFBJUkVfREFURVRJTUUgPSBLTV9EQVRFIHwgNDAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBLTV9UQUdfVVNBR0VfRVhQSVJFX0RBVEVUSU1FID0gS01fREFURSB8IDQwMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgS01fVEFHX05PX0FVVEhfUkVRVUlSRUQgPSBLTV9CT09MIHwgNTAzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBLTV9UQUdfVVNFUl9BVVRIX1RZUEUgPSBLTV9FTlVNIHwgNTA0OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBLTV9UQUdfQUxMT1dfV0hJTEVfT05fQk9EWSA9IEtNX0JPT0wgfCA1MDY7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEtNX1RBR19BVVRIX1RJTUVPVVQgPSBLTV9VSU5UIHwgNTA1OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBLTV9UQUdfQUxMX0FQUExJQ0FUSU9OUyA9IEtNX0JPT0wgfCA2MDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEtNX1RBR19BUFBMSUNBVElPTl9JRCA9IEtNX0JZVEVTIHwgNjAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBLTV9UQUdfQ1JFQVRJT05fREFURVRJTUUgPSBLTV9EQVRFIHwgNzAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBLTV9UQUdfT1JJR0lOID0gS01fRU5VTSB8IDcwMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgS01fVEFHX1JPTExCQUNLX1JFU0lTVEFOVCA9IEtNX0JPT0wgfCA3MDM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEtNX1RBR19ST09UX09GX1RSVVNUID0gS01fQllURVMgfCA3MDQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEtNX1RBR19PU19WRVJTSU9OID0gS01fVUlOVCB8IDcwNTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgS01fVEFHX09TX1BBVENITEVWRUwgPSBLTV9VSU5UIHwgNzA2OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBLTV9UQUdfQVRURVNUQVRJT05fQVBQTElDQVRJT05fSUQgPSBLTV9CWVRFUyB8IDcwOTsKLQotICAgIC8vIE1hcCBmb3IgY29udmVydGluZyBwYWRkaW5nIHZhbHVlcyB0byBzdHJpbmdzCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1tdXRhYmxlTWFwPEludGVnZXIsIFN0cmluZz4gcGFkZGluZ01hcCA9IEltbXV0YWJsZU1hcAotICAgICAgICAgICAgLjxJbnRlZ2VyLCBTdHJpbmc+IGJ1aWxkZXIoKQotICAgICAgICAgICAgLnB1dChLTV9QQURfTk9ORSwgIk5PTkUiKQotICAgICAgICAgICAgLnB1dChLTV9QQURfUlNBX09BRVAsICJPQUVQIikKLSAgICAgICAgICAgIC5wdXQoS01fUEFEX1JTQV9QU1MsICJQU1MiKQotICAgICAgICAgICAgLnB1dChLTV9QQURfUlNBX1BLQ1MxXzFfNV9FTkNSWVBULCAiUEtDUzEgRU5DUllQVCIpCi0gICAgICAgICAgICAucHV0KEtNX1BBRF9SU0FfUEtDUzFfMV81X1NJR04sICJQS0NTMSBTSUdOIikKLSAgICAgICAgICAgIC5idWlsZCgpOwotCi0gICAgLy8gTWFwIGZvciBjb252ZXJ0aW5nIGRpZ2VzdCB2YWx1ZXMgdG8gc3RyaW5ncwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEltbXV0YWJsZU1hcDxJbnRlZ2VyLCBTdHJpbmc+IGRpZ2VzdE1hcCA9IEltbXV0YWJsZU1hcAotICAgICAgICAgICAgLjxJbnRlZ2VyLCBTdHJpbmc+IGJ1aWxkZXIoKQotICAgICAgICAgICAgLnB1dChLTV9ESUdFU1RfTk9ORSwgIk5PTkUiKQotICAgICAgICAgICAgLnB1dChLTV9ESUdFU1RfTUQ1LCAiTUQ1IikKLSAgICAgICAgICAgIC5wdXQoS01fRElHRVNUX1NIQTEsICJTSEExIikKLSAgICAgICAgICAgIC5wdXQoS01fRElHRVNUX1NIQV8yXzIyNCwgIlNIQTIyNCIpCi0gICAgICAgICAgICAucHV0KEtNX0RJR0VTVF9TSEFfMl8yNTYsICJTSEEyNTYiKQotICAgICAgICAgICAgLnB1dChLTV9ESUdFU1RfU0hBXzJfMzg0LCAiU0hBMzg0IikKLSAgICAgICAgICAgIC5wdXQoS01fRElHRVNUX1NIQV8yXzUxMiwgIlNIQTUxMiIpCi0gICAgICAgICAgICAuYnVpbGQoKTsKLQotICAgIC8vIE1hcCBmb3IgY29udmVydGluZyBwdXJwb3NlIHZhbHVlcyB0byBzdHJpbmdzCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1tdXRhYmxlTWFwPEludGVnZXIsIFN0cmluZz4gcHVycG9zZU1hcCA9IEltbXV0YWJsZU1hcAotICAgICAgICAgICAgLjxJbnRlZ2VyLCBTdHJpbmc+IGJ1aWxkZXIoKQotICAgICAgICAgICAgLnB1dChLTV9QVVJQT1NFX0RFQ1JZUFQsICJERUNSWVBUIikKLSAgICAgICAgICAgIC5wdXQoS01fUFVSUE9TRV9FTkNSWVBULCAiRU5DUllQVCIpCi0gICAgICAgICAgICAucHV0KEtNX1BVUlBPU0VfU0lHTiwgIlNJR04iKQotICAgICAgICAgICAgLnB1dChLTV9QVVJQT1NFX1ZFUklGWSwgIlZFUklGWSIpCi0gICAgICAgICAgICAuYnVpbGQoKTsKLQotICAgIHByaXZhdGUgU2V0PEludGVnZXI+IHB1cnBvc2VzOwotICAgIHByaXZhdGUgSW50ZWdlciBhbGdvcml0aG07Ci0gICAgcHJpdmF0ZSBJbnRlZ2VyIGtleVNpemU7Ci0gICAgcHJpdmF0ZSBTZXQ8SW50ZWdlcj4gZGlnZXN0czsKLSAgICBwcml2YXRlIFNldDxJbnRlZ2VyPiBwYWRkaW5nTW9kZXM7Ci0gICAgcHJpdmF0ZSBJbnRlZ2VyIGVjQ3VydmU7Ci0gICAgcHJpdmF0ZSBMb25nIHJzYVB1YmxpY0V4cG9uZW50OwotICAgIHByaXZhdGUgRGF0ZSBhY3RpdmVEYXRlVGltZTsKLSAgICBwcml2YXRlIERhdGUgb3JpZ2luYXRpb25FeHBpcmVEYXRlVGltZTsKLSAgICBwcml2YXRlIERhdGUgdXNhZ2VFeHBpcmVEYXRlVGltZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbm9BdXRoUmVxdWlyZWQ7Ci0gICAgcHJpdmF0ZSBJbnRlZ2VyIHVzZXJBdXRoVHlwZTsKLSAgICBwcml2YXRlIEludGVnZXIgYXV0aFRpbWVvdXQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGFsbG93V2hpbGVPbkJvZHk7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGFsbEFwcGxpY2F0aW9uczsKLSAgICBwcml2YXRlIGJ5dGVbXSBhcHBsaWNhdGlvbklkOwotICAgIHByaXZhdGUgRGF0ZSBjcmVhdGlvbkRhdGVUaW1lOwotICAgIHByaXZhdGUgSW50ZWdlciBvcmlnaW47Ci0gICAgcHJpdmF0ZSBib29sZWFuIHJvbGxiYWNrUmVzaXN0YW50OwotICAgIHByaXZhdGUgUm9vdE9mVHJ1c3Qgcm9vdE9mVHJ1c3Q7Ci0gICAgcHJpdmF0ZSBJbnRlZ2VyIG9zVmVyc2lvbjsKLSAgICBwcml2YXRlIEludGVnZXIgb3NQYXRjaExldmVsOwotICAgIHByaXZhdGUgQXR0ZXN0YXRpb25BcHBsaWNhdGlvbklkIGF0dGVzdGF0aW9uQXBwbGljYXRpb25JZDsKLQotICAgIHB1YmxpYyBBdXRob3JpemF0aW9uTGlzdChBU04xRW5jb2RhYmxlIHNlcXVlbmNlKSB0aHJvd3MgQ2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCEoc2VxdWVuY2UgaW5zdGFuY2VvZiBBU04xU2VxdWVuY2UpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uKCJFeHBlY3RlZCBzZXF1ZW5jZSBmb3IgYXV0aG9yaXphdGlvbiBsaXN0LCBmb3VuZCAiCi0gICAgICAgICAgICAgICAgICAgICsgc2VxdWVuY2UuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQVNOMVNlcXVlbmNlUGFyc2VyIHBhcnNlciA9ICgoQVNOMVNlcXVlbmNlKSBzZXF1ZW5jZSkucGFyc2VyKCk7Ci0gICAgICAgIEFTTjFUYWdnZWRPYmplY3QgZW50cnkgPSBwYXJzZUFzbjFUYWdnZWRPYmplY3QocGFyc2VyKTsKLSAgICAgICAgZm9yICg7IGVudHJ5ICE9IG51bGw7IGVudHJ5ID0gcGFyc2VBc24xVGFnZ2VkT2JqZWN0KHBhcnNlcikpIHsKLSAgICAgICAgICAgIGludCB0YWcgPSBlbnRyeS5nZXRUYWdObygpOwotICAgICAgICAgICAgQVNOMVByaW1pdGl2ZSB2YWx1ZSA9IGVudHJ5LmdldE9iamVjdCgpOwotICAgICAgICAgICAgTG9nLmkoIkF0dGVzdGF0aW9uIiwgIlBhcnNpbmcgdGFnOiBbIiArIHRhZyArICJdLCB2YWx1ZTogWyIgKyB2YWx1ZSArICJdIik7Ci0gICAgICAgICAgICBzd2l0Y2ggKHRhZykgewotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb24oIlVua25vd24gdGFnICIgKyB0YWcgKyAiIGZvdW5kIik7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIEtNX1RBR19QVVJQT1NFICYgS0VZTUFTVEVSX1RBR19UWVBFX01BU0s6Ci0gICAgICAgICAgICAgICAgICAgIHB1cnBvc2VzID0gQXNuMVV0aWxzLmdldEludGVnZXJzRnJvbUFzbjFTZXQodmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEtNX1RBR19BTEdPUklUSE0gJiBLRVlNQVNURVJfVEFHX1RZUEVfTUFTSzoKLSAgICAgICAgICAgICAgICAgICAgYWxnb3JpdGhtID0gQXNuMVV0aWxzLmdldEludGVnZXJGcm9tQXNuMSh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgS01fVEFHX0tFWV9TSVpFICYgS0VZTUFTVEVSX1RBR19UWVBFX01BU0s6Ci0gICAgICAgICAgICAgICAgICAgIGtleVNpemUgPSBBc24xVXRpbHMuZ2V0SW50ZWdlckZyb21Bc24xKHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmkoIkF0dGVzdGF0aW9uIiwgIkZvdW5kIEtFWSBTSVpFLCB2YWx1ZTogIiArIGtleVNpemUpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEtNX1RBR19ESUdFU1QgJiBLRVlNQVNURVJfVEFHX1RZUEVfTUFTSzoKLSAgICAgICAgICAgICAgICAgICAgZGlnZXN0cyA9IEFzbjFVdGlscy5nZXRJbnRlZ2Vyc0Zyb21Bc24xU2V0KHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBLTV9UQUdfUEFERElORyAmIEtFWU1BU1RFUl9UQUdfVFlQRV9NQVNLOgotICAgICAgICAgICAgICAgICAgICBwYWRkaW5nTW9kZXMgPSBBc24xVXRpbHMuZ2V0SW50ZWdlcnNGcm9tQXNuMVNldCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgS01fVEFHX1JTQV9QVUJMSUNfRVhQT05FTlQgJiBLRVlNQVNURVJfVEFHX1RZUEVfTUFTSzoKLSAgICAgICAgICAgICAgICAgICAgcnNhUHVibGljRXhwb25lbnQgPSBBc24xVXRpbHMuZ2V0TG9uZ0Zyb21Bc24xKHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBLTV9UQUdfTk9fQVVUSF9SRVFVSVJFRCAmIEtFWU1BU1RFUl9UQUdfVFlQRV9NQVNLOgotICAgICAgICAgICAgICAgICAgICBub0F1dGhSZXF1aXJlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgS01fVEFHX0NSRUFUSU9OX0RBVEVUSU1FICYgS0VZTUFTVEVSX1RBR19UWVBFX01BU0s6Ci0gICAgICAgICAgICAgICAgICAgIGNyZWF0aW9uRGF0ZVRpbWUgPSBBc24xVXRpbHMuZ2V0RGF0ZUZyb21Bc24xKHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBLTV9UQUdfT1JJR0lOICYgS0VZTUFTVEVSX1RBR19UWVBFX01BU0s6Ci0gICAgICAgICAgICAgICAgICAgIG9yaWdpbiA9IEFzbjFVdGlscy5nZXRJbnRlZ2VyRnJvbUFzbjEodmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEtNX1RBR19PU19WRVJTSU9OICYgS0VZTUFTVEVSX1RBR19UWVBFX01BU0s6Ci0gICAgICAgICAgICAgICAgICAgIG9zVmVyc2lvbiA9IEFzbjFVdGlscy5nZXRJbnRlZ2VyRnJvbUFzbjEodmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEtNX1RBR19PU19QQVRDSExFVkVMICYgS0VZTUFTVEVSX1RBR19UWVBFX01BU0s6Ci0gICAgICAgICAgICAgICAgICAgIG9zUGF0Y2hMZXZlbCA9IEFzbjFVdGlscy5nZXRJbnRlZ2VyRnJvbUFzbjEodmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEtNX1RBR19BQ1RJVkVfREFURVRJTUUgJiBLRVlNQVNURVJfVEFHX1RZUEVfTUFTSzoKLSAgICAgICAgICAgICAgICAgICAgYWN0aXZlRGF0ZVRpbWUgPSBBc24xVXRpbHMuZ2V0RGF0ZUZyb21Bc24xKHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBLTV9UQUdfT1JJR0lOQVRJT05fRVhQSVJFX0RBVEVUSU1FICYgS0VZTUFTVEVSX1RBR19UWVBFX01BU0s6Ci0gICAgICAgICAgICAgICAgICAgIG9yaWdpbmF0aW9uRXhwaXJlRGF0ZVRpbWUgPSBBc24xVXRpbHMuZ2V0RGF0ZUZyb21Bc24xKHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBLTV9UQUdfVVNBR0VfRVhQSVJFX0RBVEVUSU1FICYgS0VZTUFTVEVSX1RBR19UWVBFX01BU0s6Ci0gICAgICAgICAgICAgICAgICAgIHVzYWdlRXhwaXJlRGF0ZVRpbWUgPSBBc24xVXRpbHMuZ2V0RGF0ZUZyb21Bc24xKHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBLTV9UQUdfQVBQTElDQVRJT05fSUQgJiBLRVlNQVNURVJfVEFHX1RZUEVfTUFTSzoKLSAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25JZCA9IEFzbjFVdGlscy5nZXRCeXRlQXJyYXlGcm9tQXNuMSh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgS01fVEFHX1JPTExCQUNLX1JFU0lTVEFOVCAmIEtFWU1BU1RFUl9UQUdfVFlQRV9NQVNLOgotICAgICAgICAgICAgICAgICAgICByb2xsYmFja1Jlc2lzdGFudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgS01fVEFHX0FVVEhfVElNRU9VVCAmIEtFWU1BU1RFUl9UQUdfVFlQRV9NQVNLOgotICAgICAgICAgICAgICAgICAgICBhdXRoVGltZW91dCA9IEFzbjFVdGlscy5nZXRJbnRlZ2VyRnJvbUFzbjEodmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEtNX1RBR19BTExPV19XSElMRV9PTl9CT0RZICYgS0VZTUFTVEVSX1RBR19UWVBFX01BU0s6Ci0gICAgICAgICAgICAgICAgICAgIGFsbG93V2hpbGVPbkJvZHkgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEtNX1RBR19FQ19DVVJWRSAmIEtFWU1BU1RFUl9UQUdfVFlQRV9NQVNLOgotICAgICAgICAgICAgICAgICAgICBlY0N1cnZlID0gQXNuMVV0aWxzLmdldEludGVnZXJGcm9tQXNuMSh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgS01fVEFHX1VTRVJfQVVUSF9UWVBFICYgS0VZTUFTVEVSX1RBR19UWVBFX01BU0s6Ci0gICAgICAgICAgICAgICAgICAgIHVzZXJBdXRoVHlwZSA9IEFzbjFVdGlscy5nZXRJbnRlZ2VyRnJvbUFzbjEodmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEtNX1RBR19ST09UX09GX1RSVVNUICYgS0VZTUFTVEVSX1RBR19UWVBFX01BU0s6Ci0gICAgICAgICAgICAgICAgICAgIHJvb3RPZlRydXN0ID0gbmV3IFJvb3RPZlRydXN0KHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBLTV9UQUdfQVRURVNUQVRJT05fQVBQTElDQVRJT05fSUQgJiBLRVlNQVNURVJfVEFHX1RZUEVfTUFTSzoKLSAgICAgICAgICAgICAgICAgICAgYXR0ZXN0YXRpb25BcHBsaWNhdGlvbklkID0gbmV3IEF0dGVzdGF0aW9uQXBwbGljYXRpb25JZChBc24xVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QXNuMUVuY29kYWJsZUZyb21CeXRlcyhBc24xVXRpbHMuZ2V0Qnl0ZUFycmF5RnJvbUFzbjEodmFsdWUpKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgS01fVEFHX0FMTF9BUFBMSUNBVElPTlMgJiBLRVlNQVNURVJfVEFHX1RZUEVfTUFTSzoKLSAgICAgICAgICAgICAgICAgICAgYWxsQXBwbGljYXRpb25zID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGFsZ29yaXRobVRvU3RyaW5nKGludCBhbGdvcml0aG0pIHsKLSAgICAgICAgc3dpdGNoIChhbGdvcml0aG0pIHsKLSAgICAgICAgICAgIGNhc2UgS01fQUxHT1JJVEhNX1JTQToKLSAgICAgICAgICAgICAgICByZXR1cm4gIlJTQSI7Ci0gICAgICAgICAgICBjYXNlIEtNX0FMR09SSVRITV9FQzoKLSAgICAgICAgICAgICAgICByZXR1cm4gIkVDRFNBIjsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJVbmtub3duIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhZGRpbmdNb2Rlc1RvU3RyaW5nKGZpbmFsIFNldDxJbnRlZ2VyPiBwYWRkaW5nTW9kZXMpIHsKLSAgICAgICAgcmV0dXJuIGpvaW5TdHJpbmdzKHRyYW5zZm9ybShwYWRkaW5nTW9kZXMsIGZvck1hcChwYWRkaW5nTWFwLCAiVW5rbm93biIpKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcGFkZGluZ01vZGVUb1N0cmluZyhpbnQgcGFkZGluZ01vZGUpIHsKLSAgICAgICAgcmV0dXJuIGZvck1hcChwYWRkaW5nTWFwLCAiVW5rbm93biIpLmFwcGx5KHBhZGRpbmdNb2RlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBkaWdlc3RzVG9TdHJpbmcoU2V0PEludGVnZXI+IGRpZ2VzdHMpIHsKLSAgICAgICAgcmV0dXJuIGpvaW5TdHJpbmdzKHRyYW5zZm9ybShkaWdlc3RzLCBmb3JNYXAoZGlnZXN0TWFwLCAiVW5rbm93biIpKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZGlnZXN0VG9TdHJpbmcoaW50IGRpZ2VzdCkgewotICAgICAgICByZXR1cm4gZm9yTWFwKGRpZ2VzdE1hcCwgIlVua25vd24iKS5hcHBseShkaWdlc3QpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1cnBvc2VzVG9TdHJpbmcoU2V0PEludGVnZXI+IHB1cnBvc2VzKSB7Ci0gICAgICAgIHJldHVybiBqb2luU3RyaW5ncyh0cmFuc2Zvcm0ocHVycG9zZXMsIGZvck1hcChwdXJwb3NlTWFwLCAiVW5rbm93biIpKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdXNlckF1dGhUeXBlVG9TdHJpbmcoaW50IHVzZXJBdXRoVHlwZSkgewotICAgICAgICBMaXN0PFN0cmluZz4gdHlwZXMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKLSAgICAgICAgaWYgKCh1c2VyQXV0aFR5cGUgJiBIV19BVVRIX0ZJTkdFUlBSSU5UKSAhPSAwKQotICAgICAgICAgICAgdHlwZXMuYWRkKCJGaW5nZXJwcmludCIpOwotICAgICAgICBpZiAoKHVzZXJBdXRoVHlwZSAmIEhXX0FVVEhfUEFTU1dPUkQpICE9IDApCi0gICAgICAgICAgICB0eXBlcy5hZGQoIlBhc3N3b3JkIik7Ci0gICAgICAgIHJldHVybiBqb2luU3RyaW5ncyh0eXBlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgb3JpZ2luVG9TdHJpbmcoaW50IG9yaWdpbikgewotICAgICAgICBzd2l0Y2ggKG9yaWdpbikgewotICAgICAgICAgICAgY2FzZSBLTV9PUklHSU5fR0VORVJBVEVEOgotICAgICAgICAgICAgICAgIHJldHVybiAiR2VuZXJhdGVkIjsKLSAgICAgICAgICAgIGNhc2UgS01fT1JJR0lOX0lNUE9SVEVEOgotICAgICAgICAgICAgICAgIHJldHVybiAiSW1wb3J0ZWQiOwotICAgICAgICAgICAgY2FzZSBLTV9PUklHSU5fVU5LTk9XTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gIlVua25vd24gKEtNMCkiOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIlVua25vd24iOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGpvaW5TdHJpbmdzKENvbGxlY3Rpb248U3RyaW5nPiBjb2xsZWN0aW9uKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nQnVpbGRlcigpCi0gICAgICAgICAgICAgICAgLmFwcGVuZCgiWyIpCi0gICAgICAgICAgICAgICAgLmFwcGVuZChKb2luZXIub24oIiwgIikuam9pbihjb2xsZWN0aW9uKSkKLSAgICAgICAgICAgICAgICAuYXBwZW5kKCJdIikKLSAgICAgICAgICAgICAgICAudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZm9ybWF0RGF0ZShEYXRlIGRhdGUpIHsKLSAgICAgICAgcmV0dXJuIERhdGVGb3JtYXQuZ2V0RGF0ZVRpbWVJbnN0YW5jZSgpLmZvcm1hdChkYXRlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBBU04xVGFnZ2VkT2JqZWN0IHBhcnNlQXNuMVRhZ2dlZE9iamVjdChBU04xU2VxdWVuY2VQYXJzZXIgcGFyc2VyKQotICAgICAgICAgICAgdGhyb3dzIENlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIEFTTjFFbmNvZGFibGUgYXNuMUVuY29kYWJsZSA9IHBhcnNlQXNuMUVuY29kYWJsZShwYXJzZXIpOwotICAgICAgICBpZiAoYXNuMUVuY29kYWJsZSA9PSBudWxsIHx8IGFzbjFFbmNvZGFibGUgaW5zdGFuY2VvZiBBU04xVGFnZ2VkT2JqZWN0KSB7Ci0gICAgICAgICAgICByZXR1cm4gKEFTTjFUYWdnZWRPYmplY3QpIGFzbjFFbmNvZGFibGU7Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3cgbmV3IENlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgdGFnZ2VkIG9iamVjdCwgZm91bmQgIiArIGFzbjFFbmNvZGFibGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIEFTTjFFbmNvZGFibGUgcGFyc2VBc24xRW5jb2RhYmxlKEFTTjFTZXF1ZW5jZVBhcnNlciBwYXJzZXIpCi0gICAgICAgICAgICB0aHJvd3MgQ2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBwYXJzZXIucmVhZE9iamVjdCgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uKCJGYWlsZWQgdG8gcGFyc2UgQVNOMSBzZXF1ZW5jZSIsIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFNldDxJbnRlZ2VyPiBnZXRQdXJwb3NlcygpIHsKLSAgICAgICAgcmV0dXJuIHB1cnBvc2VzOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnRlZ2VyIGdldEFsZ29yaXRobSgpIHsKLSAgICAgICAgcmV0dXJuIGFsZ29yaXRobTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW50ZWdlciBnZXRLZXlTaXplKCkgewotICAgICAgICByZXR1cm4ga2V5U2l6ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2V0PEludGVnZXI+IGdldERpZ2VzdHMoKSB7Ci0gICAgICAgIHJldHVybiBkaWdlc3RzOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXQ8SW50ZWdlcj4gZ2V0UGFkZGluZ01vZGVzKCkgewotICAgICAgICByZXR1cm4gcGFkZGluZ01vZGVzOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRQYWRkaW5nTW9kZXNBc1N0cmluZ3MoKSB0aHJvd3MgQ2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHBhZGRpbmdNb2RlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gSW1tdXRhYmxlU2V0Lm9mKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBJbW11dGFibGVTZXQuQnVpbGRlcjxTdHJpbmc+IGJ1aWxkZXIgPSBJbW11dGFibGVTZXQuYnVpbGRlcigpOwotICAgICAgICBmb3IgKGludCBwYWRkaW5nTW9kZSA6IHBhZGRpbmdNb2RlcykgewotICAgICAgICAgICAgc3dpdGNoIChwYWRkaW5nTW9kZSkgewotICAgICAgICAgICAgICAgIGNhc2UgS01fUEFEX05PTkU6Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkKEtleVByb3BlcnRpZXMuRU5DUllQVElPTl9QQURESU5HX05PTkUpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEtNX1BBRF9SU0FfT0FFUDoKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hZGQoS2V5UHJvcGVydGllcy5FTkNSWVBUSU9OX1BBRERJTkdfUlNBX09BRVApOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEtNX1BBRF9SU0FfUEtDUzFfMV81X0VOQ1JZUFQ6Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkKEtleVByb3BlcnRpZXMuRU5DUllQVElPTl9QQURESU5HX1JTQV9QS0NTMSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgS01fUEFEX1JTQV9QS0NTMV8xXzVfU0lHTjoKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hZGQoS2V5UHJvcGVydGllcy5TSUdOQVRVUkVfUEFERElOR19SU0FfUEtDUzEpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEtNX1BBRF9SU0FfUFNTOgotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFkZChLZXlQcm9wZXJ0aWVzLlNJR05BVFVSRV9QQURESU5HX1JTQV9QU1MpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uKCJJbnZhbGlkIHBhZGRpbmcgbW9kZSAiICsgcGFkZGluZ01vZGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEludGVnZXIgZ2V0RWNDdXJ2ZSgpIHsKLSAgICAgICAgcmV0dXJuIGVjQ3VydmU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBlY0N1cnZlQXNTdHJpbmcoKSB7Ci0gICAgICAgIGlmIChlY0N1cnZlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gIk5VTEwiOwotCi0gICAgICAgIHN3aXRjaCAoZWNDdXJ2ZSkgewotICAgICAgICAgICAgY2FzZSBLTV9FQ19DVVJWRV9QMjI0OgotICAgICAgICAgICAgICAgIHJldHVybiAic2VjcDIyNHIxIjsKLSAgICAgICAgICAgIGNhc2UgS01fRUNfQ1VSVkVfUDI1NjoKLSAgICAgICAgICAgICAgICByZXR1cm4gInNlY3AyNTZyMSI7Ci0gICAgICAgICAgICBjYXNlIEtNX0VDX0NVUlZFX1AzODQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJzZWNwMzg0cjEiOwotICAgICAgICAgICAgY2FzZSBLTV9FQ19DVVJWRV9QNTIxOgotICAgICAgICAgICAgICAgIHJldHVybiAic2VjcDUyMXIxIjsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ1bmtub3duIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBMb25nIGdldFJzYVB1YmxpY0V4cG9uZW50KCkgewotICAgICAgICByZXR1cm4gcnNhUHVibGljRXhwb25lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIERhdGUgZ2V0QWN0aXZlRGF0ZVRpbWUoKSB7Ci0gICAgICAgIHJldHVybiBhY3RpdmVEYXRlVGltZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRGF0ZSBnZXRPcmlnaW5hdGlvbkV4cGlyZURhdGVUaW1lKCkgewotICAgICAgICByZXR1cm4gb3JpZ2luYXRpb25FeHBpcmVEYXRlVGltZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRGF0ZSBnZXRVc2FnZUV4cGlyZURhdGVUaW1lKCkgewotICAgICAgICByZXR1cm4gdXNhZ2VFeHBpcmVEYXRlVGltZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc05vQXV0aFJlcXVpcmVkKCkgewotICAgICAgICByZXR1cm4gbm9BdXRoUmVxdWlyZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIEludGVnZXIgZ2V0VXNlckF1dGhUeXBlKCkgewotICAgICAgICByZXR1cm4gdXNlckF1dGhUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnRlZ2VyIGdldEF1dGhUaW1lb3V0KCkgewotICAgICAgICByZXR1cm4gYXV0aFRpbWVvdXQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBbGxvd1doaWxlT25Cb2R5KCkgewotICAgICAgICByZXR1cm4gYWxsb3dXaGlsZU9uQm9keTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FsbEFwcGxpY2F0aW9ucygpIHsKLSAgICAgICAgcmV0dXJuIGFsbEFwcGxpY2F0aW9uczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYnl0ZVtdIGdldEFwcGxpY2F0aW9uSWQoKSB7Ci0gICAgICAgIHJldHVybiBhcHBsaWNhdGlvbklkOwotICAgIH0KLQotICAgIHB1YmxpYyBEYXRlIGdldENyZWF0aW9uRGF0ZVRpbWUoKSB7Ci0gICAgICAgIHJldHVybiBjcmVhdGlvbkRhdGVUaW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnRlZ2VyIGdldE9yaWdpbigpIHsKLSAgICAgICAgcmV0dXJuIG9yaWdpbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JvbGxiYWNrUmVzaXN0YW50KCkgewotICAgICAgICByZXR1cm4gcm9sbGJhY2tSZXNpc3RhbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIFJvb3RPZlRydXN0IGdldFJvb3RPZlRydXN0KCkgewotICAgICAgICByZXR1cm4gcm9vdE9mVHJ1c3Q7Ci0gICAgfQotCi0gICAgcHVibGljIEludGVnZXIgZ2V0T3NWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gb3NWZXJzaW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnRlZ2VyIGdldE9zUGF0Y2hMZXZlbCgpIHsKLSAgICAgICAgcmV0dXJuIG9zUGF0Y2hMZXZlbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXR0ZXN0YXRpb25BcHBsaWNhdGlvbklkIGdldEF0dGVzdGF0aW9uQXBwbGljYXRpb25JZCgpIHsKLSAgICAgICAgcmV0dXJuIGF0dGVzdGF0aW9uQXBwbGljYXRpb25JZDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIHMgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCi0gICAgICAgIGlmIChhbGdvcml0aG0gIT0gbnVsbCkgewotICAgICAgICAgICAgcy5hcHBlbmQoIlxuQWxnb3JpdGhtOiAiKS5hcHBlbmQoYWxnb3JpdGhtVG9TdHJpbmcoYWxnb3JpdGhtKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoa2V5U2l6ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzLmFwcGVuZCgiXG5LZXlTaXplOiAiKS5hcHBlbmQoa2V5U2l6ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocHVycG9zZXMgIT0gbnVsbCAmJiAhcHVycG9zZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBzLmFwcGVuZCgiXG5QdXJwb3NlczogIikuYXBwZW5kKHB1cnBvc2VzVG9TdHJpbmcocHVycG9zZXMpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkaWdlc3RzICE9IG51bGwgJiYgIWRpZ2VzdHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBzLmFwcGVuZCgiXG5EaWdlc3RzOiAiKS5hcHBlbmQoZGlnZXN0c1RvU3RyaW5nKGRpZ2VzdHMpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwYWRkaW5nTW9kZXMgIT0gbnVsbCAmJiAhcGFkZGluZ01vZGVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgcy5hcHBlbmQoIlxuUGFkZGluZyBtb2RlczogIikuYXBwZW5kKHBhZGRpbmdNb2Rlc1RvU3RyaW5nKHBhZGRpbmdNb2RlcykpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGVjQ3VydmUgIT0gbnVsbCkgewotICAgICAgICAgICAgcy5hcHBlbmQoIlxuRUMgQ3VydmU6ICIpLmFwcGVuZChlY0N1cnZlQXNTdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgbGFiZWwgPSAiXG5SU0EgZXhwb25lbnQ6ICI7Ci0gICAgICAgIGlmIChyc2FQdWJsaWNFeHBvbmVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzLmFwcGVuZChsYWJlbCkuYXBwZW5kKHJzYVB1YmxpY0V4cG9uZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChhY3RpdmVEYXRlVGltZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzLmFwcGVuZCgiXG5BY3RpdmU6ICIpLmFwcGVuZChmb3JtYXREYXRlKGFjdGl2ZURhdGVUaW1lKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAob3JpZ2luYXRpb25FeHBpcmVEYXRlVGltZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzLmFwcGVuZCgiXG5PcmlnaW5hdGlvbiBleHBpcmU6ICIpLmFwcGVuZChmb3JtYXREYXRlKG9yaWdpbmF0aW9uRXhwaXJlRGF0ZVRpbWUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh1c2FnZUV4cGlyZURhdGVUaW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIHMuYXBwZW5kKCJcblVzYWdlIGV4cGlyZTogIikuYXBwZW5kKGZvcm1hdERhdGUodXNhZ2VFeHBpcmVEYXRlVGltZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFub0F1dGhSZXF1aXJlZCAmJiB1c2VyQXV0aFR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcy5hcHBlbmQoIlxuQXV0aCB0eXBlczogIikuYXBwZW5kKHVzZXJBdXRoVHlwZVRvU3RyaW5nKHVzZXJBdXRoVHlwZSkpOwotICAgICAgICAgICAgaWYgKGF1dGhUaW1lb3V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzLmFwcGVuZCgiXG5BdXRoIHRpbWVvdXQ6ICIpLmFwcGVuZChhdXRoVGltZW91dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYXBwbGljYXRpb25JZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzLmFwcGVuZCgiXG5BcHBsaWNhdGlvbiBJRDogIikuYXBwZW5kKG5ldyBTdHJpbmcoYXBwbGljYXRpb25JZCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNyZWF0aW9uRGF0ZVRpbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgcy5hcHBlbmQoIlxuQ3JlYXRlZDogIikuYXBwZW5kKGZvcm1hdERhdGUoY3JlYXRpb25EYXRlVGltZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG9yaWdpbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzLmFwcGVuZCgiXG5PcmlnaW46ICIpLmFwcGVuZChvcmlnaW5Ub1N0cmluZyhvcmlnaW4pKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyb2xsYmFja1Jlc2lzdGFudCkgewotICAgICAgICAgICAgcy5hcHBlbmQoIlxuUm9sbGJhY2sgcmVzaXN0YW50OiB0cnVlIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocm9vdE9mVHJ1c3QgIT0gbnVsbCkgewotICAgICAgICAgICAgcy5hcHBlbmQoIlxuUm9vdCBvZiBUcnVzdDpcbiIpOwotICAgICAgICAgICAgcy5hcHBlbmQocm9vdE9mVHJ1c3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG9zVmVyc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzLmFwcGVuZCgiXG5PUyBWZXJzaW9uOiAiKS5hcHBlbmQob3NWZXJzaW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvc1BhdGNoTGV2ZWwgIT0gbnVsbCkgewotICAgICAgICAgICAgcy5hcHBlbmQoIlxuT1MgUGF0Y2hsZXZlbDogIikuYXBwZW5kKG9zUGF0Y2hMZXZlbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYXR0ZXN0YXRpb25BcHBsaWNhdGlvbklkICE9IG51bGwpIHsKLSAgICAgICAgICAgIHMuYXBwZW5kKCJcbkF0dGVzdGF0aW9uIEFwcGxpY2F0aW9uIElkOiIpLmFwcGVuZChhdHRlc3RhdGlvbkFwcGxpY2F0aW9uSWQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzLnRvU3RyaW5nKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMva2V5c3RvcmUvc3JjL2FuZHJvaWQva2V5c3RvcmUvY3RzL0Jsb2NrQ2lwaGVyVGVzdEJhc2UuamF2YSBiL3Rlc3RzL3Rlc3RzL2tleXN0b3JlL3NyYy9hbmRyb2lkL2tleXN0b3JlL2N0cy9CbG9ja0NpcGhlclRlc3RCYXNlLmphdmEKaW5kZXggNjZlODA5My4uM2I2MjUxZCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMva2V5c3RvcmUvc3JjL2FuZHJvaWQva2V5c3RvcmUvY3RzL0Jsb2NrQ2lwaGVyVGVzdEJhc2UuamF2YQorKysgYi90ZXN0cy90ZXN0cy9rZXlzdG9yZS9zcmMvYW5kcm9pZC9rZXlzdG9yZS9jdHMvQmxvY2tDaXBoZXJUZXN0QmFzZS5qYXZhCkBAIC01MzgsNyArNTM4LDcgQEAKICAgICAgICAgYnl0ZVtdIG91dHB1dDEgPSBkb0ZpbmFsKGlucHV0KTsKIAogICAgICAgICAvLyBDcmVhdGUgYSBkaWZmZXJlbnQga2V5IGJ5IGZsaXBwaW5nIGEgYml0IGluIHRoZSBLQVQga2V5LgotICAgICAgICBrYXRLZXlCeXRlc1swXSBePSAxOworICAgICAgICBrYXRLZXlCeXRlc1swXSBePSAwYjEwMDA7IC8vIEZsaXAgYSBiaXQgdGhhdCBfZG9lc18gYWZmZWN0IDNERVMKICAgICAgICAgU2VjcmV0S2V5IGtleTIgPSBpbXBvcnRLZXkoa2F0S2V5Qnl0ZXMpOwogCiAgICAgICAgIGluaXQob3Btb2RlLCBrZXkyLCBnZXRLYXRBbGdvcml0aG1QYXJhbWV0ZXJTcGVjKCkpOwpAQCAtNTQ3LDcgKzU0Nyw3IEBACiAgICAgICAgICAgICBvdXRwdXQyID0gZG9GaW5hbChpbnB1dCk7CiAgICAgICAgIH0gY2F0Y2ggKEJhZFBhZGRpbmdFeGNlcHRpb24gZXhwZWN0ZWQpIHsKICAgICAgICAgICAgIC8vIFBhZGRpbmcgZG9lc24ndCBkZWNvZGUgcHJvYmFibHkgYmVjYXVzZSB0aGUgbmV3IGtleSBpcyBiZWluZyB1c2VkLiBUaGlzIGNhbiBvbmx5Ci0gICAgICAgICAgICAvLyBvY2N1ciBpcyBwYWRkaW5nIGlzIHVzZWQuCisgICAgICAgICAgICAvLyBvY2N1ciBpZiBwYWRkaW5nIGlzIHVzZWQuCiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtNjU4LDggKzY1OCw4IEBACiAgICAgICAgIGFzc2VydEVxdWFscygwLCB1cGRhdGUobmV3IGJ5dGVbMV0sIDAsIDEsIG5ldyBieXRlW2dldEJsb2NrU2l6ZSgpXSwgMCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdXBkYXRlKEJ5dGVCdWZmZXIuYWxsb2NhdGUoMSksIEJ5dGVCdWZmZXIuYWxsb2NhdGUoZ2V0QmxvY2tTaXplKCkpKSk7CiAKLSAgICAgICAgLy8gRmVlZCBhIGJsb2NrIHRocm91Z2ggdGhlIENpcGhlciwgc28gdGhhdCBpdCdzIHBvdGVudGlhbGx5IG5vIGxvbmdlciBpbiBhbiBpbml0aWFsIHN0YXRlLgotICAgICAgICBieXRlW10gb3V0cHV0ID0gdXBkYXRlKG5ldyBieXRlW2dldEJsb2NrU2l6ZSgpXSk7CisgICAgICAgIC8vIENvbXBsZXRlIHRoZSBjdXJyZW50IGJsb2NrLiBUaGVyZSBhcmUgYmxvY2tTaXplIC0gNCBieXRlcyBsZWZ0IHRvIGZpbGwuCisgICAgICAgIGJ5dGVbXSBvdXRwdXQgPSB1cGRhdGUobmV3IGJ5dGVbZ2V0QmxvY2tTaXplKCkgLSA0XSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhnZXRCbG9ja1NpemUoKSwgb3V0cHV0Lmxlbmd0aCk7CiAKICAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIHVwZGF0ZShuZXcgYnl0ZVsxXSkpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMva2V5c3RvcmUvc3JjL2FuZHJvaWQva2V5c3RvcmUvY3RzL0NpcGhlclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2tleXN0b3JlL3NyYy9hbmRyb2lkL2tleXN0b3JlL2N0cy9DaXBoZXJUZXN0LmphdmEKaW5kZXggYmFjOGVkMC4uM2Y5Zjc1OCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMva2V5c3RvcmUvc3JjL2FuZHJvaWQva2V5c3RvcmUvY3RzL0NpcGhlclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9rZXlzdG9yZS9zcmMvYW5kcm9pZC9rZXlzdG9yZS9jdHMvQ2lwaGVyVGVzdC5qYXZhCkBAIC0xNiwxNyArMTYsMjUgQEAKIAogcGFja2FnZSBhbmRyb2lkLmtleXN0b3JlLmN0czsKIAoraW1wb3J0IGFuZHJvaWQuYXBwLktleWd1YXJkTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKIGltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUHJlc3VibWl0OworaW1wb3J0IGFuZHJvaWQuc2VjdXJpdHkua2V5c3RvcmUuS2V5R2VuUGFyYW1ldGVyU3BlYzsKIGltcG9ydCBhbmRyb2lkLnNlY3VyaXR5LmtleXN0b3JlLktleVByb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC5zZWN1cml0eS5rZXlzdG9yZS5LZXlQcm90ZWN0aW9uOworaW1wb3J0IGFuZHJvaWQuc2VydmVyLmFtLkFjdGl2aXR5TWFuYWdlclRlc3RCYXNlOwogaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CiBpbXBvcnQgYW5kcm9pZC50ZXN0Lk1vcmVBc3NlcnRzOwogCi1pbXBvcnQgYW5kcm9pZC5rZXlzdG9yZS5jdHMuUjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk9iamVjdEFycmF5czsKIAogaW1wb3J0IGphdmEuc2VjdXJpdHkuQWxnb3JpdGhtUGFyYW1ldGVyczsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRLZXlFeGNlcHRpb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5LZXk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlTdG9yZTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LktleVN0b3JlRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJvdmlkZXI7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5TZWN1cml0eTsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlNpZ25hdHVyZTsKQEAgLTQ2LDYgKzU0LDggQEAKIGltcG9ydCBqYXZheC5jcnlwdG8uQmFkUGFkZGluZ0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZheC5jcnlwdG8uQ2lwaGVyOwogaW1wb3J0IGphdmF4LmNyeXB0by5JbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LmNyeXB0by5LZXlHZW5lcmF0b3I7CitpbXBvcnQgamF2YXguY3J5cHRvLlNlY3JldEtleTsKIGltcG9ydCBqYXZheC5jcnlwdG8uc3BlYy5HQ01QYXJhbWV0ZXJTcGVjOwogaW1wb3J0IGphdmF4LmNyeXB0by5zcGVjLkl2UGFyYW1ldGVyU3BlYzsKIGltcG9ydCBqYXZheC5jcnlwdG8uc3BlYy5PQUVQUGFyYW1ldGVyU3BlYzsKQEAgLTYwLDcgKzcwLDcgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBFQ1RFRF9QUk9WSURFUl9OQU1FID0gVGVzdFV0aWxzLkVYUEVDVEVEX0NSWVBUT19PUF9QUk9WSURFUl9OQU1FOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRVhQRUNURURfQUxHT1JJVEhNUyA9IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBCQVNFX0VYUEVDVEVEX0FMR09SSVRITVMgPSB7CiAgICAgICAgICJBRVMvRUNCL05vUGFkZGluZyIsCiAgICAgICAgICJBRVMvRUNCL1BLQ1M3UGFkZGluZyIsCiAgICAgICAgICJBRVMvQ0JDL05vUGFkZGluZyIsCkBAIC03NCw5ICs4NCwyNSBAQAogICAgICAgICAiUlNBL0VDQi9PQUVQV2l0aFNIQS0yMjRBbmRNR0YxUGFkZGluZyIsCiAgICAgICAgICJSU0EvRUNCL09BRVBXaXRoU0hBLTI1NkFuZE1HRjFQYWRkaW5nIiwKICAgICAgICAgIlJTQS9FQ0IvT0FFUFdpdGhTSEEtMzg0QW5kTUdGMVBhZGRpbmciLAotICAgICAgICAiUlNBL0VDQi9PQUVQV2l0aFNIQS01MTJBbmRNR0YxUGFkZGluZyIsCisgICAgICAgICJSU0EvRUNCL09BRVBXaXRoU0hBLTUxMkFuZE1HRjFQYWRkaW5nIgogICAgIH07CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERVNFREVfQUxHT1JJVEhNUyA9IHsKKyAgICAgICAgIkRFU2VkZS9DQkMvTm9QYWRkaW5nIiwKKyAgICAgICAgIkRFU2VkZS9DQkMvUEtDUzdQYWRkaW5nIiwKKyAgICAgICAgIkRFU2VkZS9FQ0IvTm9QYWRkaW5nIiwKKyAgICAgICAgIkRFU2VkZS9FQ0IvUEtDUzdQYWRkaW5nIiwKKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gRVhQRUNURURfQUxHT1JJVEhNUyA9IEJBU0VfRVhQRUNURURfQUxHT1JJVEhNUzsKKworICAgIHN0YXRpYyB7CisgICAgICBpZiAoVGVzdFV0aWxzLnN1cHBvcnRzM0RFUygpKSB7CisgICAgICAgIEVYUEVDVEVEX0FMR09SSVRITVMgPSBPYmplY3RBcnJheXMKKyAgICAgICAgICAgIC5jb25jYXQoQkFTRV9FWFBFQ1RFRF9BTEdPUklUSE1TLCBERVNFREVfQUxHT1JJVEhNUywgU3RyaW5nLmNsYXNzKTsKKyAgICAgIH0KKyAgICB9CisKICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBLYXRWZWN0b3IgewogICAgICAgICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBwbGFpbnRleHQ7CiAgICAgICAgIHByaXZhdGUgZmluYWwgYnl0ZVtdIGNpcGhlcnRleHQ7CkBAIC0yMDksNiArMjM1LDIyIEBACiAgICAgICAgICAgICAgICAgKyAiZGZlNGIxMjgzYWIxMTRlNTE3YjdiOWU0YTZlMGJmMTY2ZDViNTA2ZTdhM2I3MzI4MDc4ZTEyY2IyM2IxZDkzODc2MDc2N2RjOWIzYzNlYjAiCiAgICAgICAgICAgICAgICAgKyAiODQ4ZGRkYTEwMTc5MmFjYTkyNzNhZDQxNDMxNGMxM2ZjNTExZmZhMDM1OGE4ZjRjNWYzOGVkZGVkM2EyZGMxMTFmYTYyYzgwZTYwMzJjMzIiCiAgICAgICAgICAgICAgICAgKyAiYWUwNGFlYWM3NzI5ZjE2YTYzMTBmMWY2Nzg1YzI3IikpOworCisKKyAgICAgICAgS0FUX1ZFQ1RPUlMucHV0KCJERVNlZGUvQ0JDL05vUGFkZGluZyIsCisgICAgICAgICAgICAgICAgbmV3IEthdFZlY3RvcigiZWFjMWI3OTU5ZTFlMjNjMTFkYzRhMGUyMzNlZWRkOTllNWJmNWRkMzkxYTVmMTA3ZDAwNjEzM2E5YWYzZTM4NSIsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSXZQYXJhbWV0ZXJTcGVjKEhleEVuY29kaW5nLmRlY29kZSgiZWNkODdiZjljNDlmMzdkYyIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICI2MzI1MTFjNDY2ODBkNjA4ODNhMjI4ZTYyY2QzMTI0NGFkNjFiOTg3ZThkZjc5MDFkYWUwZWIyMjBjODM5Njg5IikpOworICAgICAgICBLQVRfVkVDVE9SUy5wdXQoIkRFU2VkZS9DQkMvUEtDUzdQYWRkaW5nIiwKKyAgICAgICAgICAgICAgICBuZXcgS2F0VmVjdG9yKCIzMTMyMzMzNDM1MzYzNzM4MzEzMjMzMzQzNTM2MzczOCIsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSXZQYXJhbWV0ZXJTcGVjKEhleEVuY29kaW5nLmRlY29kZSgiREZDQTM2Njg0OERFQTZCQiIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJlNzBiYjU3NjFkNzk2ZDdiMGViNDBiNWI2MGRlYjZhOTcyNmY3MmQ5N2NmMmFkYTQiKSk7CisgICAgICAgIEtBVF9WRUNUT1JTLnB1dCgiREVTZWRlL0VDQi9Ob1BhZGRpbmciLAorICAgICAgICAgICAgICAgIG5ldyBLYXRWZWN0b3IoIjMxMzIzMzM0MzUzNjM3MzgzMTMyMzMzNDM1MzYzNzM4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhZGUxMTlmOWUzNWFiM2U5YWRlMTE5ZjllMzVhYjNlOSIpKTsKKyAgICAgICAgS0FUX1ZFQ1RPUlMucHV0KCJERVNlZGUvRUNCL1BLQ1M3UGFkZGluZyIsCisgICAgICAgICAgICAgICAgbmV3IEthdFZlY3RvcigiMzEzMjMzMzQzNTM2MzczODMxMzIzMzM0MzUzNjM3MzgiLAorICAgICAgICAgICAgICAgICAgICAgICAgImFkZTExOWY5ZTM1YWIzZTlhZGUxMTlmOWUzNWFiM2U5NGJjYjAxYmJjMGQwNTUyNiIpKTsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIERBWV9JTl9NSUxMSVMgPSBUZXN0VXRpbHMuREFZX0lOX01JTExJUzsKQEAgLTIyMiw2ICsyNjQsNDAgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gQUVTMjU2X0tBVF9LRVlfQllURVMgPQogICAgICAgICAgICAgSGV4RW5jb2RpbmcuZGVjb2RlKCJjZjYwMWNjMTBhYWY0MzRkMWYwMTc0NzEzNmFmZjIyMmFmN2ZiNDI2ZDEwMTkwMTcxMjIxNGMzZmVhMTgxMjVmIik7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gREVTZWRlX0tBVF9LRVlfQllURVMgPSBIZXhFbmNvZGluZy5kZWNvZGUoCisgICAgICAgICAgICAiNUVCRTIyOTRFQ0QwRTBGMDhFQUI3NjkwRDJBNkVFNjkyNkFFNUNDODU0RTM2QjZCIik7CisKKyAgICBwcml2YXRlIGNsYXNzIERldmljZUxvY2tTZXNzaW9uICBleHRlbmRzIEFjdGl2aXR5TWFuYWdlclRlc3RCYXNlIGltcGxlbWVudHMgQXV0b0Nsb3NlYWJsZSB7CisKKyAgICAgICAgcHJpdmF0ZSBMb2NrU2NyZWVuU2Vzc2lvbiBtTG9ja0NyZWRlbnRpYWw7CisKKyAgICAgICAgcHVibGljIERldmljZUxvY2tTZXNzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBzZXRVcCgpOworICAgICAgICAgICAgbUxvY2tDcmVkZW50aWFsID0gbmV3IExvY2tTY3JlZW5TZXNzaW9uKCk7CisgICAgICAgICAgICBtTG9ja0NyZWRlbnRpYWwuc2V0TG9ja0NyZWRlbnRpYWwoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHBlcmZvcm1EZXZpY2VMb2NrKCkgeworICAgICAgICAgICAgbUxvY2tDcmVkZW50aWFsLnNsZWVwRGV2aWNlKCk7CisgICAgICAgICAgICBLZXlndWFyZE1hbmFnZXIga2V5Z3VhcmRNYW5hZ2VyID0gKEtleWd1YXJkTWFuYWdlcilnZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LktFWUdVQVJEX1NFUlZJQ0UpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNSAmJiAha2V5Z3VhcmRNYW5hZ2VyLmlzRGV2aWNlTG9ja2VkKCk7IGkrKykgeworICAgICAgICAgICAgICAgIFN5c3RlbUNsb2NrLnNsZWVwKDIwMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBwZXJmb3JtRGV2aWNlVW5sb2NrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBtTG9ja0NyZWRlbnRpYWwuZ290b0tleWd1YXJkKCk7CisgICAgICAgICAgICBtTG9ja0NyZWRlbnRpYWwuZW50ZXJBbmRDb25maXJtTG9ja0NyZWRlbnRpYWwoKTsKKyAgICAgICAgICAgIGxhdW5jaEhvbWVBY3Rpdml0eSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBtTG9ja0NyZWRlbnRpYWwuY2xvc2UoKTsKKyAgICAgICAgICAgIHRlYXJEb3duKCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBAUHJlc3VibWl0CiAgICAgcHVibGljIHZvaWQgdGVzdEFsZ29yaXRobUxpc3QoKSB7CiAgICAgICAgIC8vIEFzc2VydCB0aGF0IEFuZHJvaWQgS2V5c3RvcmUgUHJvdmlkZXIgZXhwb3NlcyBleGFjdGx5IHRoZSBleHBlY3RlZCBDaXBoZXIKQEAgLTM1NCw2ICs0MzAsMTE1IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNEZWNyeXB0VmFsaWQoYnl0ZVtdIGV4cGVjdGVkUGxhaW50ZXh0LCBieXRlW10gY2lwaGVydGV4dCwgQ2lwaGVyIGNpcGhlciwKKyAgICAgICAgICAgIEFsZ29yaXRobVBhcmFtZXRlcnMgcGFyYW1zLCBJbXBvcnRlZEtleSBrZXkpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEtleSBkZWNyeXB0aW9uS2V5ID0ga2V5LmdldEtleXN0b3JlQmFja2VkRGVjcnlwdGlvbktleSgpOworICAgICAgICAgICAgY2lwaGVyLmluaXQoQ2lwaGVyLkRFQ1JZUFRfTU9ERSwgZGVjcnlwdGlvbktleSwgcGFyYW1zKTsKKyAgICAgICAgICAgIGJ5dGVbXSBhY3R1YWxQbGFpbnRleHQgPSBjaXBoZXIuZG9GaW5hbChjaXBoZXJ0ZXh0KTsKKyAgICAgICAgICAgIE1vcmVBc3NlcnRzLmFzc2VydEVxdWFscyhleHBlY3RlZFBsYWludGV4dCwgYWN0dWFsUGxhaW50ZXh0KTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzTGVhbmJhY2tPbmx5KCkgeworICAgICAgICBQYWNrYWdlTWFuYWdlciBwbSA9IGdldENvbnRleHQoKS5nZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICByZXR1cm4gKHBtICE9IG51bGwgJiYgcG0uaGFzU3lzdGVtRmVhdHVyZSgiYW5kcm9pZC5zb2Z0d2FyZS5sZWFuYmFja19vbmx5IikpOworICAgIH0KKworICAgIEBQcmVzdWJtaXQKKyAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5Z3VhcmRMb2NrQW5kVW5sb2NrKCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoaXNMZWFuYmFja09ubHkoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IChEZXZpY2VMb2NrU2Vzc2lvbiBkbCA9IG5ldyBEZXZpY2VMb2NrU2Vzc2lvbigpKSB7CisgICAgICAgICAgICBLZXlndWFyZE1hbmFnZXIga2V5Z3VhcmRNYW5hZ2VyID0gKEtleWd1YXJkTWFuYWdlcilnZXRDb250ZXh0KCkKKyAgICAgICAgICAgICAgICAgICAgLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5LRVlHVUFSRF9TRVJWSUNFKTsKKworICAgICAgICAgICAgZGwucGVyZm9ybURldmljZUxvY2soKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoa2V5Z3VhcmRNYW5hZ2VyLmlzRGV2aWNlTG9ja2VkKCkpOworCisgICAgICAgICAgICBkbC5wZXJmb3JtRGV2aWNlVW5sb2NrKCk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShrZXlndWFyZE1hbmFnZXIuaXNEZXZpY2VMb2NrZWQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlQbGFpbnRleHRFbmNyeXB0c0FuZERlY3J5cHRzV2hlblVubG9ja2VkUmVxdWlyZWQoKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNVbmxvY2tlZERldmljZVJlcXVpcmVkID0gdHJ1ZTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBpc1VzZXJBdXRoUmVxdWlyZWQgPSBmYWxzZTsKKworICAgICAgICBpZiAoaXNMZWFuYmFja09ubHkoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IChEZXZpY2VMb2NrU2Vzc2lvbiBkbCA9IG5ldyBEZXZpY2VMb2NrU2Vzc2lvbigpKSB7CisgICAgICAgICAgICBLZXlndWFyZE1hbmFnZXIga2V5Z3VhcmRNYW5hZ2VyID0gKEtleWd1YXJkTWFuYWdlcilnZXRDb250ZXh0KCkKKyAgICAgICAgICAgICAgICAuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LktFWUdVQVJEX1NFUlZJQ0UpOworCisgICAgICAgICAgICBQcm92aWRlciBwcm92aWRlciA9IFNlY3VyaXR5LmdldFByb3ZpZGVyKEVYUEVDVEVEX1BST1ZJREVSX05BTUUpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChwcm92aWRlcik7CisgICAgICAgICAgICBmaW5hbCBieXRlW10gb3JpZ2luYWxQbGFpbnRleHQgPSBFbXB0eUFycmF5LkJZVEU7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBhbGdvcml0aG0gOiBFWFBFQ1RFRF9BTEdPUklUSE1TKSB7CisgICAgICAgICAgICAgICAgLy8gTm9ybWFsbHkgd2Ugd291bGQgdGVzdCBhbGwgY29tYmluYXRpb25zIG9mIGFsZ29yaXRobXMgYW5kIGtleSBzaXplcywgYnV0IHRoZQorICAgICAgICAgICAgICAgIC8vIHNlbWktbWFudWFsIGxvY2tpbmcgYW5kIHVubG9ja2luZyB0aGlzIHJlcXVpcmVzIHRha2VzIHdheSB0b28gbG9uZyBpZiB3ZSB0cnkgdG8KKyAgICAgICAgICAgICAgICAvLyBnbyB0aHJvdWdoIGFsbCBvZiB0aG9zZS4gT3RoZXIgdGVzdHMgY2hlY2sgYWxsIHRoZSBrZXkgc2l6ZXMsIHNvIHdlIGRvbid0IG5lZWQgdG8KKyAgICAgICAgICAgICAgICAvLyBkdXBsaWNhdGUgYWxsIHRoYXQgd29yay4KKyAgICAgICAgICAgICAgICBmb3IgKEltcG9ydGVkS2V5IGtleSA6IGltcG9ydEthdEtleXMoCisgICAgICAgICAgICAgICAgICAgICAgICBhbGdvcml0aG0sCisgICAgICAgICAgICAgICAgICAgICAgICBLZXlQcm9wZXJ0aWVzLlBVUlBPU0VfRU5DUllQVCB8IEtleVByb3BlcnRpZXMuUFVSUE9TRV9ERUNSWVBULAorICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGlzVW5sb2NrZWREZXZpY2VSZXF1aXJlZCwgaXNVc2VyQXV0aFJlcXVpcmVkKSkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRW5jcnlwdCB0aGUgZGF0YSB3aXRoIHRoZSBkZXZpY2UgbG9ja2VkCisgICAgICAgICAgICAgICAgICAgICAgICBkbC5wZXJmb3JtRGV2aWNlTG9jaygpOworICAgICAgICAgICAgICAgICAgICAgICAgS2V5IGVuY3J5cHRpb25LZXkgPSBrZXkuZ2V0S2V5c3RvcmVCYWNrZWRFbmNyeXB0aW9uS2V5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gcGxhaW50ZXh0ID0gdHJ1bmNhdGVQbGFpbnRleHRJZk5lY2Vzc2FyeSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGdvcml0aG0sIGVuY3J5cHRpb25LZXksIG9yaWdpbmFsUGxhaW50ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbGFpbnRleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEtleSBpcyB0b28gc2hvcnQgdG8gZW5jcnlwdCBhbnl0aGluZyB1c2luZyB0aGlzIHRyYW5zZm9ybWF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIENpcGhlciBjaXBoZXIgPSBDaXBoZXIuZ2V0SW5zdGFuY2UoYWxnb3JpdGhtLCBwcm92aWRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICBjaXBoZXIuaW5pdChDaXBoZXIuRU5DUllQVF9NT0RFLCBlbmNyeXB0aW9uS2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFsZ29yaXRobVBhcmFtZXRlcnMgcGFyYW1zID0gY2lwaGVyLmdldFBhcmFtZXRlcnMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBjaXBoZXJ0ZXh0ID0gY2lwaGVyLmRvRmluYWwocGxhaW50ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBleHBlY3RlZFBsYWludGV4dCA9IHBsYWludGV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgiUlNBL0VDQi9Ob1BhZGRpbmciLmVxdWFsc0lnbm9yZUNhc2UoYWxnb3JpdGhtKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJTQSBkZWNyeXB0aW9uIHdpdGhvdXQgcGFkZGluZyBsZWZ0LXBhZHMgcmVzdWx0aW5nIHBsYWludGV4dCB3aXRoIE5VTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ5dGVzIHRvIHRoZSBsZW5ndGggb2YgUlNBIG1vZHVsdXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZHVsdXNMZW5ndGhCeXRlcyA9IChUZXN0VXRpbHMuZ2V0S2V5U2l6ZUJpdHMoZW5jcnlwdGlvbktleSkgKyA3KSAvIDg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRQbGFpbnRleHQgPSBUZXN0VXRpbHMubGVmdFBhZFdpdGhaZXJvQnl0ZXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkUGxhaW50ZXh0LCBtb2R1bHVzTGVuZ3RoQnl0ZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGVuIGF0dGVtcHQgdG8gZGVjcnlwdCB0aGUgZGF0YSB3aXRoIHRoZSBkZXZpY2Ugc3RpbGwgbG9ja2VkCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBmYWlsLgorICAgICAgICAgICAgICAgICAgICAgICAgY2lwaGVyID0gQ2lwaGVyLmdldEluc3RhbmNlKGFsZ29yaXRobSwgcHJvdmlkZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UoaXNEZWNyeXB0VmFsaWQoZXhwZWN0ZWRQbGFpbnRleHQsIGNpcGhlcnRleHQsIGNpcGhlciwgcGFyYW1zLCBrZXkpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlbiBhdHRlbXB0IHRvIGRlY3J5cHQgdGhlIGRhdGEgd2l0aCB0aGUgZGV2aWNlIHVubG9ja2VkCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBzdWNjZWVkCisgICAgICAgICAgICAgICAgICAgICAgICBkbC5wZXJmb3JtRGV2aWNlVW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjaXBoZXIgPSBDaXBoZXIuZ2V0SW5zdGFuY2UoYWxnb3JpdGhtLCBwcm92aWRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGlzRGVjcnlwdFZhbGlkKGV4cGVjdGVkUGxhaW50ZXh0LCBjaXBoZXJ0ZXh0LCBjaXBoZXIsIHBhcmFtcywga2V5KSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgZm9yICIgKyBhbGdvcml0aG0gKyAiIHdpdGgga2V5ICIgKyBrZXkuZ2V0QWxpYXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCBrbm93IHRoZSB1bmRlcmx5aW5nIHR5cGUgb2YgdGhpcyBjb2xsZWN0aW9uLCBzbyBqdXN0IGJyZWFrIG91dCBvZgorICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaXRlcmF0b3IgbG9vcC4KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgdGVzdENpcGhlcnRleHRHZW5lcmF0ZWRCeUFuZHJvaWRLZXlTdG9yZURlY3J5cHRzQnlBbmRyb2lkS2V5U3RvcmUoKQogICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFByb3ZpZGVyIHByb3ZpZGVyID0gU2VjdXJpdHkuZ2V0UHJvdmlkZXIoRVhQRUNURURfUFJPVklERVJfTkFNRSk7CkBAIC03NzUsNiArOTYwLDU1IEBACiAgICAgICAgICAgICAgICAgfHwgKHRyYW5zZm9ybWF0aW9uVXBwZXJDYXNlLmNvbnRhaW5zKCJPQUVQIikpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHRlc3RDYW5DcmVhdGVBdXRoQm91bmRLZXlXaGVuU2NyZWVuTG9ja2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNVbmxvY2tlZERldmljZVJlcXVpcmVkID0gZmFsc2U7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNVc2VyQXV0aFJlcXVpcmVkID0gdHJ1ZTsKKworICAgICAgICBpZiAoaXNMZWFuYmFja09ubHkoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IChEZXZpY2VMb2NrU2Vzc2lvbiBkbCA9IG5ldyBEZXZpY2VMb2NrU2Vzc2lvbigpKSB7CisgICAgICAgICAgICBLZXlndWFyZE1hbmFnZXIga2V5Z3VhcmRNYW5hZ2VyID0gKEtleWd1YXJkTWFuYWdlcilnZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LktFWUdVQVJEX1NFUlZJQ0UpOworCisgICAgICAgICAgICBkbC5wZXJmb3JtRGV2aWNlTG9jaygpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShrZXlndWFyZE1hbmFnZXIuaXNEZXZpY2VMb2NrZWQoKSk7CisKKyAgICAgICAgICAgIFByb3ZpZGVyIHByb3ZpZGVyID0gU2VjdXJpdHkuZ2V0UHJvdmlkZXIoRVhQRUNURURfUFJPVklERVJfTkFNRSk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHByb3ZpZGVyKTsKKworICAgICAgICAgICAgZm9yIChTdHJpbmcgYWxnb3JpdGhtIDogRVhQRUNURURfQUxHT1JJVEhNUykgeworICAgICAgICAgICAgICAgIGZvciAoSW1wb3J0ZWRLZXkga2V5IDogaW1wb3J0S2F0S2V5cyhhbGdvcml0aG0sCisgICAgICAgICAgICAgICAgICAgICAgICBLZXlQcm9wZXJ0aWVzLlBVUlBPU0VfRU5DUllQVCB8IEtleVByb3BlcnRpZXMuUFVSUE9TRV9ERUNSWVBULAorICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGlzVW5sb2NrZWREZXZpY2VSZXF1aXJlZCwgaXNVc2VyQXV0aFJlcXVpcmVkKSkgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGtleSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENhbm5vdENyZWF0ZUF1dGhCb3VuZEtleVdoZW5EZXZpY2VQaW5Ob3RTZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBpc1VzZXJBdXRoUmVxdWlyZWQgPSB0cnVlOworICAgICAgICBmaW5hbCBib29sZWFuIGlzVW5sb2NrZWREZXZpY2VSZXF1aXJlZCA9IGZhbHNlOworCisgICAgICAgIGlmIChpc0xlYW5iYWNrT25seSgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBLZXlndWFyZE1hbmFnZXIga2V5Z3VhcmRNYW5hZ2VyID0gKEtleWd1YXJkTWFuYWdlcilnZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LktFWUdVQVJEX1NFUlZJQ0UpOworICAgICAgICBhc3NlcnRGYWxzZShrZXlndWFyZE1hbmFnZXIuaXNEZXZpY2VMb2NrZWQoKSk7CisKKyAgICAgICAgZm9yIChTdHJpbmcgYWxnb3JpdGhtIDogRVhQRUNURURfQUxHT1JJVEhNUykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpbXBvcnRLYXRLZXlzKGFsZ29yaXRobSwgS2V5UHJvcGVydGllcy5QVVJQT1NFX0VOQ1JZUFQgfCBLZXlQcm9wZXJ0aWVzLlBVUlBPU0VfREVDUllQVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBpc1VubG9ja2VkRGV2aWNlUmVxdWlyZWQsIGlzVXNlckF1dGhSZXF1aXJlZCk7CisgICAgICAgICAgICAgICAgZmFpbCgiSW1wb3J0aW5nIGF1dGggYm91bmQga2V5cyB0byBhbiBpbnNlY3VyZSBkZXZpY2Ugc2hvdWxkIGZhaWwiKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEtleVN0b3JlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBFeHBlY3RlZCBiZWhhdmlvcgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgdGVzdEluaXREZWNyeXB0RmFpbHNXaGVuTm90QXV0aG9yaXplZFRvRGVjcnlwdCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBmb3IgKFN0cmluZyB0cmFuc2Zvcm1hdGlvbiA6IEVYUEVDVEVEX0FMR09SSVRITVMpIHsKICAgICAgICAgICAgIHRyeSB7CkBAIC0xMzE3LDYgKzE1NTEsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgYmxvY2sgbW9kZSAiICsgYmxvY2tNb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChLZXlQcm9wZXJ0aWVzLktFWV9BTEdPUklUSE1fM0RFUy5lcXVhbHNJZ25vcmVDYXNlKGtleUFsZ29yaXRobSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBibG9ja01vZGUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0VXRpbHMuZ2V0Q2lwaGVyQmxvY2tNb2RlKHRyYW5zZm9ybWF0aW9uKS50b1VwcGVyQ2FzZShMb2NhbGUuVVMpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRW50cm9weSBzaG91bGQgY29uc3VtZWQgZm9yIElWIGdlbmVyYXRpb24gb25seS4KKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYmxvY2tNb2RlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiRUNCIjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRFbnRyb3B5Qnl0ZXNDb25zdW1lZER1cmluZ0luaXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJDQkMiOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZEVudHJvcHlCeXRlc0NvbnN1bWVkRHVyaW5nSW5pdCA9IDg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBibG9jayBtb2RlICIgKyBibG9ja01vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEtleVByb3BlcnRpZXMuS0VZX0FMR09SSVRITV9SU0EuZXF1YWxzSWdub3JlQ2FzZShrZXlBbGdvcml0aG0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZEVudHJvcHlCeXRlc0NvbnN1bWVkRHVyaW5nSW5pdCA9IDA7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0xMzM0LDcgKzE1ODIsOCBAQAogICAgICAgICAgICAgICAgICAgICBybmcucmVzZXRDb3VudGVycygpOwogICAgICAgICAgICAgICAgICAgICBjaXBoZXJ0ZXh0ID0gVGVzdFV0aWxzLmNvbmNhdChjaXBoZXJ0ZXh0LCBjaXBoZXIuZG9GaW5hbCgpKTsKICAgICAgICAgICAgICAgICAgICAgaW50IGV4cGVjdGVkRW50cm9weUJ5dGVzQ29uc3VtZWREdXJpbmdEb0ZpbmFsOwotICAgICAgICAgICAgICAgICAgICBpZiAoS2V5UHJvcGVydGllcy5LRVlfQUxHT1JJVEhNX0FFUy5lcXVhbHNJZ25vcmVDYXNlKGtleUFsZ29yaXRobSkpIHsKKyAgICAgICAgICAgICAgICAgIGlmIChLZXlQcm9wZXJ0aWVzLktFWV9BTEdPUklUSE1fQUVTLmVxdWFsc0lnbm9yZUNhc2Uoa2V5QWxnb3JpdGhtKQorICAgICAgICAgICAgICAgICAgICAgIHx8IEtleVByb3BlcnRpZXMuS0VZX0FMR09SSVRITV8zREVTLmVxdWFsc0lnbm9yZUNhc2Uoa2V5QWxnb3JpdGhtKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRFbnRyb3B5Qnl0ZXNDb25zdW1lZER1cmluZ0RvRmluYWwgPSAwOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEtleVByb3BlcnRpZXMuS0VZX0FMR09SSVRITV9SU0EuZXF1YWxzSWdub3JlQ2FzZShrZXlBbGdvcml0aG0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFbnRyb3B5IHNob3VsZCBub3QgYmUgY29uc3VtZWQgZHVyaW5nIENpcGhlci5pbml0LgpAQCAtMTQwMiwxMSArMTY1MSwyMSBAQAogICAgICAgICAgICAgfSBlbHNlIGlmICgoS2V5UHJvcGVydGllcy5CTE9DS19NT0RFX0NCQy5lcXVhbHNJZ25vcmVDYXNlKGJsb2NrTW9kZSkpCiAgICAgICAgICAgICAgICAgICAgIHx8IChLZXlQcm9wZXJ0aWVzLkJMT0NLX01PREVfQ1RSLmVxdWFsc0lnbm9yZUNhc2UoYmxvY2tNb2RlKSkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEl2UGFyYW1ldGVyU3BlYygKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBieXRlW10gezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2fSk7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgYnl0ZVtdezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2fSk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKEtleVByb3BlcnRpZXMuQkxPQ0tfTU9ERV9HQ00uZXF1YWxzSWdub3JlQ2FzZShibG9ja01vZGUpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBHQ01QYXJhbWV0ZXJTcGVjKAogICAgICAgICAgICAgICAgICAgICAgICAgMTI4LAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGJ5dGVbXSB7MSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMn0pOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGJ5dGVbXXsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyfSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuc3VwcG9ydGVkIGJsb2NrIG1vZGU6ICIgKyBibG9ja01vZGUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKEtleVByb3BlcnRpZXMuS0VZX0FMR09SSVRITV8zREVTLmVxdWFsc0lnbm9yZUNhc2Uoa2V5QWxnb3JpdGhtKSkgeworICAgICAgICAgICAgU3RyaW5nIGJsb2NrTW9kZSA9IFRlc3RVdGlscy5nZXRDaXBoZXJCbG9ja01vZGUodHJhbnNmb3JtYXRpb24pOworICAgICAgICAgICAgaWYgKEtleVByb3BlcnRpZXMuQkxPQ0tfTU9ERV9FQ0IuZXF1YWxzSWdub3JlQ2FzZShibG9ja01vZGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9IGVsc2UgaWYgKEtleVByb3BlcnRpZXMuQkxPQ0tfTU9ERV9DQkMuZXF1YWxzSWdub3JlQ2FzZShibG9ja01vZGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJdlBhcmFtZXRlclNwZWMoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgYnl0ZVtdezEsIDIsIDMsIDQsIDUsIDYsIDcsIDh9KTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgYmxvY2sgbW9kZTogIiArIGJsb2NrTW9kZSk7CiAgICAgICAgICAgICB9CkBAIC0xNDY0LDYgKzE3MjMsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgInRlc3RBRVMiLAogICAgICAgICAgICAgICAgICAgICBuZXcgU2VjcmV0S2V5U3BlYyhBRVMxMjhfS0FUX0tFWV9CWVRFUywgIkFFUyIpLAogICAgICAgICAgICAgICAgICAgICBpbXBvcnRQYXJhbXMpOworICAgICAgICB9IGVsc2UgaWYgKEtleVByb3BlcnRpZXMuS0VZX0FMR09SSVRITV8zREVTLmVxdWFsc0lnbm9yZUNhc2Uoa2V5QWxnb3JpdGhtKSkgeworICAgICAgICAgICAgcmV0dXJuIFRlc3RVdGlscy5pbXBvcnRJbnRvQW5kcm9pZEtleVN0b3JlKAorICAgICAgICAgICAgICAgICAgICAidGVzdDNERVMiLAorICAgICAgICAgICAgICAgICAgICBuZXcgU2VjcmV0S2V5U3BlYyhERVNlZGVfS0FUX0tFWV9CWVRFUywgIkRFU2VkZSIpLAorICAgICAgICAgICAgICAgICAgICBpbXBvcnRQYXJhbXMpOwogICAgICAgICB9IGVsc2UgaWYgKEtleVByb3BlcnRpZXMuS0VZX0FMR09SSVRITV9SU0EuZXF1YWxzSWdub3JlQ2FzZShrZXlBbGdvcml0aG0pKSB7CiAgICAgICAgICAgICByZXR1cm4gVGVzdFV0aWxzLmltcG9ydEludG9BbmRyb2lkS2V5U3RvcmUoCiAgICAgICAgICAgICAgICAgICAgICJ0ZXN0UlNBIiwKQEAgLTE0ODcsOCArMTc1MSwxNSBAQAogICAgIHByaXZhdGUgQ29sbGVjdGlvbjxJbXBvcnRlZEtleT4gaW1wb3J0S2F0S2V5cygKICAgICAgICAgICAgIFN0cmluZyB0cmFuc2Zvcm1hdGlvbiwgaW50IHB1cnBvc2VzLCBib29sZWFuIGl2UHJvdmlkZWRXaGVuRW5jcnlwdGluZykKICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgcmV0dXJuIGltcG9ydEthdEtleXModHJhbnNmb3JtYXRpb24sIHB1cnBvc2VzLCBpdlByb3ZpZGVkV2hlbkVuY3J5cHRpbmcsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPEltcG9ydGVkS2V5PiBpbXBvcnRLYXRLZXlzKAorICAgICAgICAgICAgU3RyaW5nIHRyYW5zZm9ybWF0aW9uLCBpbnQgcHVycG9zZXMsIGJvb2xlYW4gaXZQcm92aWRlZFdoZW5FbmNyeXB0aW5nLAorICAgICAgICAgICAgYm9vbGVhbiBpc1VubG9ja2VkRGV2aWNlUmVxdWlyZWQsIGJvb2xlYW4gaXNVc2VyQXV0aFJlcXVpcmVkKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgS2V5UHJvdGVjdGlvbiBpbXBvcnRQYXJhbXMgPSBUZXN0VXRpbHMuZ2V0TWluaW1hbFdvcmtpbmdJbXBvcnRQYXJhbWV0ZXJzRm9yQ2lwaGVyaW5nV2l0aCgKLSAgICAgICAgICAgICAgICB0cmFuc2Zvcm1hdGlvbiwgcHVycG9zZXMsIGl2UHJvdmlkZWRXaGVuRW5jcnlwdGluZyk7CisgICAgICAgICAgICB0cmFuc2Zvcm1hdGlvbiwgcHVycG9zZXMsIGl2UHJvdmlkZWRXaGVuRW5jcnlwdGluZywgaXNVbmxvY2tlZERldmljZVJlcXVpcmVkLAorICAgICAgICAgICAgaXNVc2VyQXV0aFJlcXVpcmVkKTsKICAgICAgICAgU3RyaW5nIGtleUFsZ29yaXRobSA9IFRlc3RVdGlscy5nZXRDaXBoZXJLZXlBbGdvcml0aG0odHJhbnNmb3JtYXRpb24pOwogICAgICAgICBpZiAoS2V5UHJvcGVydGllcy5LRVlfQUxHT1JJVEhNX0FFUy5lcXVhbHNJZ25vcmVDYXNlKGtleUFsZ29yaXRobSkpIHsKICAgICAgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KApAQCAtMTUwNCw3ICsxNzc1LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3RBRVMyNTYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTZWNyZXRLZXlTcGVjKEFFUzI1Nl9LQVRfS0VZX0JZVEVTLCAiQUVTIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0UGFyYW1zKQotICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgKTsKKyAgICAgICAgfSBlbHNlIGlmIChLZXlQcm9wZXJ0aWVzLktFWV9BTEdPUklUSE1fM0RFUy5lcXVhbHNJZ25vcmVDYXNlKGtleUFsZ29yaXRobSkpIHsKKyAgICAgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KFRlc3RVdGlscy5pbXBvcnRJbnRvQW5kcm9pZEtleVN0b3JlKAorICAgICAgICAgICAgICAgICAgICAidGVzdDNERVMiLAorICAgICAgICAgICAgICAgICAgICBuZXcgU2VjcmV0S2V5U3BlYyhERVNlZGVfS0FUX0tFWV9CWVRFUywgIkRFU2VkZSIpLAorICAgICAgICAgICAgICAgICAgICBpbXBvcnRQYXJhbXMpCisgICAgICAgICAgICApOwogICAgICAgICB9IGVsc2UgaWYgKEtleVByb3BlcnRpZXMuS0VZX0FMR09SSVRITV9SU0EuZXF1YWxzSWdub3JlQ2FzZShrZXlBbGdvcml0aG0pKSB7CiAgICAgICAgICAgICByZXR1cm4gUlNBU2lnbmF0dXJlVGVzdC5pbXBvcnRLYXRLZXlQYWlycyhnZXRDb250ZXh0KCksIGltcG9ydFBhcmFtcyk7CiAgICAgICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9rZXlzdG9yZS9zcmMvYW5kcm9pZC9rZXlzdG9yZS9jdHMvREVTZWRlQ0JDTm9QYWRkaW5nQ2lwaGVyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMva2V5c3RvcmUvc3JjL2FuZHJvaWQva2V5c3RvcmUvY3RzL0RFU2VkZUNCQ05vUGFkZGluZ0NpcGhlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTY0YTI1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMva2V5c3RvcmUvc3JjL2FuZHJvaWQva2V5c3RvcmUvY3RzL0RFU2VkZUNCQ05vUGFkZGluZ0NpcGhlclRlc3QuamF2YQpAQCAtMCwwICsxLDM4IEBACitwYWNrYWdlIGFuZHJvaWQua2V5c3RvcmUuY3RzOworCitpbXBvcnQgamF2YS5zZWN1cml0eS5BbGdvcml0aG1QYXJhbWV0ZXJzOworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjOworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5JbnZhbGlkUGFyYW1ldGVyU3BlY0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LmNyeXB0by5zcGVjLkl2UGFyYW1ldGVyU3BlYzsKKworcHVibGljIGNsYXNzIERFU2VkZUNCQ05vUGFkZGluZ0NpcGhlclRlc3QgZXh0ZW5kcyBERVNlZGVDaXBoZXJUZXN0QmFzZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gS0FUX0lWID0gSGV4RW5jb2RpbmcuZGVjb2RlKCJERkNBMzY2ODQ4REVBNkJCIik7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFRyYW5zZm9ybWF0aW9uKCkgeworICAgICAgICByZXR1cm4gIkRFU2VkZS9DQkMvTm9QYWRkaW5nIjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgYnl0ZVtdIGdldEl2KEFsZ29yaXRobVBhcmFtZXRlcnMgcGFyYW1zKSB0aHJvd3MgSW52YWxpZFBhcmFtZXRlclNwZWNFeGNlcHRpb24geworICAgICAgICBJdlBhcmFtZXRlclNwZWMgc3BlYyA9IHBhcmFtcy5nZXRQYXJhbWV0ZXJTcGVjKEl2UGFyYW1ldGVyU3BlYy5jbGFzcyk7CisgICAgICAgIHJldHVybiBzcGVjLmdldElWKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFsZ29yaXRobVBhcmFtZXRlclNwZWMgZ2V0S2F0QWxnb3JpdGhtUGFyYW1ldGVyU3BlYygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJdlBhcmFtZXRlclNwZWMoZ2V0S2F0SXYoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGJ5dGVbXSBnZXRLYXRDaXBoZXJ0ZXh0KCkgeworICAgICAgICByZXR1cm4gSGV4RW5jb2RpbmcuZGVjb2RlKCJlNzBiYjU3NjFkNzk2ZDdiMGViNDBiNWI2MGRlYjZhOSIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBieXRlW10gZ2V0S2F0SXYoKSB7CisgICAgICAgIHJldHVybiBLQVRfSVYuY2xvbmUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9rZXlzdG9yZS9zcmMvYW5kcm9pZC9rZXlzdG9yZS9jdHMvREVTZWRlQ0JDUEtDUzdQYWRkaW5nQ2lwaGVyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMva2V5c3RvcmUvc3JjL2FuZHJvaWQva2V5c3RvcmUvY3RzL0RFU2VkZUNCQ1BLQ1M3UGFkZGluZ0NpcGhlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDQ4NGVkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMva2V5c3RvcmUvc3JjL2FuZHJvaWQva2V5c3RvcmUvY3RzL0RFU2VkZUNCQ1BLQ1M3UGFkZGluZ0NpcGhlclRlc3QuamF2YQpAQCAtMCwwICsxLDM4IEBACitwYWNrYWdlIGFuZHJvaWQua2V5c3RvcmUuY3RzOworCitpbXBvcnQgamF2YS5zZWN1cml0eS5BbGdvcml0aG1QYXJhbWV0ZXJzOworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjOworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5JbnZhbGlkUGFyYW1ldGVyU3BlY0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LmNyeXB0by5zcGVjLkl2UGFyYW1ldGVyU3BlYzsKKworcHVibGljIGNsYXNzIERFU2VkZUNCQ1BLQ1M3UGFkZGluZ0NpcGhlclRlc3QgZXh0ZW5kcyBERVNlZGVDaXBoZXJUZXN0QmFzZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gS0FUX0lWID0gSGV4RW5jb2RpbmcuZGVjb2RlKCJERkNBMzY2ODQ4REVBNkJCIik7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFRyYW5zZm9ybWF0aW9uKCkgeworICAgICAgICByZXR1cm4gIkRFU2VkZS9DQkMvUEtDUzdQYWRkaW5nIjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgYnl0ZVtdIGdldEl2KEFsZ29yaXRobVBhcmFtZXRlcnMgcGFyYW1zKSB0aHJvd3MgSW52YWxpZFBhcmFtZXRlclNwZWNFeGNlcHRpb24geworICAgICAgICBJdlBhcmFtZXRlclNwZWMgc3BlYyA9IHBhcmFtcy5nZXRQYXJhbWV0ZXJTcGVjKEl2UGFyYW1ldGVyU3BlYy5jbGFzcyk7CisgICAgICAgIHJldHVybiBzcGVjLmdldElWKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFsZ29yaXRobVBhcmFtZXRlclNwZWMgZ2V0S2F0QWxnb3JpdGhtUGFyYW1ldGVyU3BlYygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJdlBhcmFtZXRlclNwZWMoZ2V0S2F0SXYoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGJ5dGVbXSBnZXRLYXRDaXBoZXJ0ZXh0KCkgeworICAgICAgICByZXR1cm4gSGV4RW5jb2RpbmcuZGVjb2RlKCJlNzBiYjU3NjFkNzk2ZDdiMGViNDBiNWI2MGRlYjZhOTcyNmY3MmQ5N2NmMmFkYTQiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgYnl0ZVtdIGdldEthdEl2KCkgeworICAgICAgICByZXR1cm4gS0FUX0lWLmNsb25lKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMva2V5c3RvcmUvc3JjL2FuZHJvaWQva2V5c3RvcmUvY3RzL0RFU2VkZUNpcGhlclRlc3RCYXNlLmphdmEgYi90ZXN0cy90ZXN0cy9rZXlzdG9yZS9zcmMvYW5kcm9pZC9rZXlzdG9yZS9jdHMvREVTZWRlQ2lwaGVyVGVzdEJhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmM4NTQxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMva2V5c3RvcmUvc3JjL2FuZHJvaWQva2V5c3RvcmUvY3RzL0RFU2VkZUNpcGhlclRlc3RCYXNlLmphdmEKQEAgLTAsMCArMSwyNDIgQEAKK3BhY2thZ2UgYW5kcm9pZC5rZXlzdG9yZS5jdHM7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBERVNlZGVDaXBoZXJUZXN0QmFzZSBleHRlbmRzIEJsb2NrQ2lwaGVyVGVzdEJhc2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIEtBVF9LRVkgPSBIZXhFbmNvZGluZy5kZWNvZGUoCisgICAgICAgICAgICAiNUVCRTIyOTRFQ0QwRTBGMDhFQUI3NjkwRDJBNkVFNjkyNkFFNUNDODU0RTM2QjZCIik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIEtBVF9QTEFJTlRFWFQgPSBIZXhFbmNvZGluZy5kZWNvZGUoCisgICAgICAgICAgICAiMzEzMjMzMzQzNTM2MzczODMxMzIzMzM0MzUzNjM3MzgiKTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBpbnQgZ2V0QmxvY2tTaXplKCkgeworICAgICAgICByZXR1cm4gODsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgYnl0ZVtdIGdldEthdEtleSgpIHsKKyAgICAgICAgcmV0dXJuIEtBVF9LRVkuY2xvbmUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgYnl0ZVtdIGdldEthdFBsYWludGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIEtBVF9QTEFJTlRFWFQuY2xvbmUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgaW50IGdldEthdEF1dGhlbnRpY2F0aW9uVGFnTGVuZ3RoQnl0ZXMoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBib29sZWFuIGlzQXV0aGVudGljYXRlZENpcGhlcigpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBib29sZWFuIGlzU3RyZWFtQ2lwaGVyKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQGphdmEubGFuZy5PdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRQcm92aWRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoVGVzdFV0aWxzLnN1cHBvcnRzM0RFUygpKSB7CisgICAgICAgICAgICBzdXBlci50ZXN0R2V0UHJvdmlkZXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBqYXZhLmxhbmcuT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QWxnb3JpdGhtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChUZXN0VXRpbHMuc3VwcG9ydHMzREVTKCkpIHsKKyAgICAgICAgICAgIHN1cGVyLnRlc3RHZXRQcm92aWRlcigpOworICAgICAgICB9CisgICAgfQorCisgICAgQGphdmEubGFuZy5PdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRCbG9ja1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKFRlc3RVdGlscy5zdXBwb3J0czNERVMoKSkgeworICAgICAgICAgICAgc3VwZXIudGVzdEdldFByb3ZpZGVyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAamF2YS5sYW5nLk92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdEdldEV4ZW1wdGlvbk1lY2hhbmlzbSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoVGVzdFV0aWxzLnN1cHBvcnRzM0RFUygpKSB7CisgICAgICAgICAgICBzdXBlci50ZXN0R2V0UHJvdmlkZXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ29weVNhZmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKFRlc3RVdGlscy5zdXBwb3J0czNERVMoKSkgeworICAgICAgICAgICAgc3VwZXIudGVzdFVwZGF0ZUNvcHlTYWZlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQW5kRG9GaW5hbE5vdFN1cHBvcnRlZEluV3JhcEFuZFVud3JhcE1vZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChUZXN0VXRpbHMuc3VwcG9ydHMzREVTKCkpIHsKKyAgICAgICAgICAgIHN1cGVyLnRlc3RVcGRhdGVXaXRoRW1wdHlJbnB1dFJldHVybnNDb3JyZWN0VmFsdWUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RLZXlEb2VzTm90U3Vydml2ZVJlaW5pdGlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKFRlc3RVdGlscy5zdXBwb3J0czNERVMoKSkgeworICAgICAgICAgICAgc3VwZXIudGVzdFVwZGF0ZVdpdGhFbXB0eUlucHV0UmV0dXJuc0NvcnJlY3RWYWx1ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdEthdE9uZVNob3RFbmNyeXB0VXNpbmdEb0ZpbmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChUZXN0VXRpbHMuc3VwcG9ydHMzREVTKCkpIHsKKyAgICAgICAgICAgIHN1cGVyLnRlc3RVcGRhdGVXaXRoRW1wdHlJbnB1dFJldHVybnNDb3JyZWN0VmFsdWUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RLYXRPbmVTaG90RGVjcnlwdFVzaW5nRG9GaW5hbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoVGVzdFV0aWxzLnN1cHBvcnRzM0RFUygpKSB7CisgICAgICAgICAgICBzdXBlci50ZXN0VXBkYXRlV2l0aEVtcHR5SW5wdXRSZXR1cm5zQ29ycmVjdFZhbHVlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0S2F0RW5jcnlwdE9uZUJ5dGVBdEFUaW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChUZXN0VXRpbHMuc3VwcG9ydHMzREVTKCkpIHsKKyAgICAgICAgICAgIHN1cGVyLnRlc3RVcGRhdGVXaXRoRW1wdHlJbnB1dFJldHVybnNDb3JyZWN0VmFsdWUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RLYXREZWNyeXB0T25lQnl0ZUF0QVRpbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKFRlc3RVdGlscy5zdXBwb3J0czNERVMoKSkgeworICAgICAgICAgICAgc3VwZXIudGVzdFVwZGF0ZVdpdGhFbXB0eUlucHV0UmV0dXJuc0NvcnJlY3RWYWx1ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdEl2R2VuZXJhdGVkQW5kVXNlZFdoZW5FbmNyeXB0aW5nV2l0aG91dEV4cGxpY2l0SXYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKFRlc3RVdGlscy5zdXBwb3J0czNERVMoKSkgeworICAgICAgICAgICAgc3VwZXIudGVzdFVwZGF0ZVdpdGhFbXB0eUlucHV0UmV0dXJuc0NvcnJlY3RWYWx1ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdEdldFBhcmFtZXRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKFRlc3RVdGlscy5zdXBwb3J0czNERVMoKSkgeworICAgICAgICAgICAgc3VwZXIudGVzdFVwZGF0ZVdpdGhFbXB0eUlucHV0UmV0dXJuc0NvcnJlY3RWYWx1ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdEdldE91dHB1dFNpemVJbkVuY3J5cHRpb25Nb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChUZXN0VXRpbHMuc3VwcG9ydHMzREVTKCkpIHsKKyAgICAgICAgICAgIHN1cGVyLnRlc3RVcGRhdGVXaXRoRW1wdHlJbnB1dFJldHVybnNDb3JyZWN0VmFsdWUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRPdXRwdXRTaXplSW5EZWNyeXB0aW9uTW9kZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoVGVzdFV0aWxzLnN1cHBvcnRzM0RFUygpKSB7CisgICAgICAgICAgICBzdXBlci50ZXN0VXBkYXRlV2l0aEVtcHR5SW5wdXRSZXR1cm5zQ29ycmVjdFZhbHVlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SVYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKFRlc3RVdGlscy5zdXBwb3J0czNERVMoKSkgeworICAgICAgICAgICAgc3VwZXIudGVzdFVwZGF0ZVdpdGhFbXB0eUlucHV0UmV0dXJuc0NvcnJlY3RWYWx1ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdFVwZGF0ZVdpdGhFbXB0eUlucHV0UmV0dXJuc0NvcnJlY3RWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoVGVzdFV0aWxzLnN1cHBvcnRzM0RFUygpKSB7CisgICAgICAgICAgICBzdXBlci50ZXN0VXBkYXRlV2l0aEVtcHR5SW5wdXRSZXR1cm5zQ29ycmVjdFZhbHVlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRG9lc05vdFByb2R1Y2VPdXRwdXRXaGVuSW5zdWZmaWNpZW50SW5wdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKFRlc3RVdGlscy5zdXBwb3J0czNERVMoKSkgeworICAgICAgICAgICAgc3VwZXIudGVzdFVwZGF0ZVdpdGhFbXB0eUlucHV0UmV0dXJuc0NvcnJlY3RWYWx1ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdFVwZGF0ZUFBRE5vdFN1cHBvcnRlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoVGVzdFV0aWxzLnN1cHBvcnRzM0RFUygpKSB7CisgICAgICAgICAgICBzdXBlci50ZXN0VXBkYXRlV2l0aEVtcHR5SW5wdXRSZXR1cm5zQ29ycmVjdFZhbHVlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2VuZXJhdGVkUGFkZGluZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoVGVzdFV0aWxzLnN1cHBvcnRzM0RFUygpKSB7CisgICAgICAgICAgICBzdXBlci50ZXN0VXBkYXRlV2l0aEVtcHR5SW5wdXRSZXR1cm5zQ29ycmVjdFZhbHVlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG9GaW5hbFJlc2V0cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoVGVzdFV0aWxzLnN1cHBvcnRzM0RFUygpKSB7CisgICAgICAgICAgICBzdXBlci50ZXN0VXBkYXRlV2l0aEVtcHR5SW5wdXRSZXR1cm5zQ29ycmVjdFZhbHVlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG9GaW5hbENvcHlTYWZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChUZXN0VXRpbHMuc3VwcG9ydHMzREVTKCkpIHsKKyAgICAgICAgICAgIHN1cGVyLnRlc3RVcGRhdGVXaXRoRW1wdHlJbnB1dFJldHVybnNDb3JyZWN0VmFsdWUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3REZWNyeXB0V2l0aE1pc3NpbmdQYWRkaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChUZXN0VXRpbHMuc3VwcG9ydHMzREVTKCkpIHsKKyAgICAgICAgICAgIHN1cGVyLnRlc3RVcGRhdGVXaXRoRW1wdHlJbnB1dFJldHVybnNDb3JyZWN0VmFsdWUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3REZWNyeXB0V2l0aE1hbmdsZWRQYWRkaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChUZXN0VXRpbHMuc3VwcG9ydHMzREVTKCkpIHsKKyAgICAgICAgICAgIHN1cGVyLnRlc3RVcGRhdGVXaXRoRW1wdHlJbnB1dFJldHVybnNDb3JyZWN0VmFsdWUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWluaXRpYWxpemluZ0luRGVjcnlwdE1vZGVEb2VzTm90VXNlUHJldmlvdXNseVVzZWRJdigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoVGVzdFV0aWxzLnN1cHBvcnRzM0RFUygpKSB7CisgICAgICAgICAgICBzdXBlci50ZXN0VXBkYXRlV2l0aEVtcHR5SW5wdXRSZXR1cm5zQ29ycmVjdFZhbHVlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5pdFJlcXVpcmVzSXZJbkRlY3J5cHRNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChUZXN0VXRpbHMuc3VwcG9ydHMzREVTKCkpIHsKKyAgICAgICAgICAgIHN1cGVyLnRlc3RVcGRhdGVXaXRoRW1wdHlJbnB1dFJldHVybnNDb3JyZWN0VmFsdWUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmF0ZWRJdlN1cnZpdmVzUmVzZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKFRlc3RVdGlscy5zdXBwb3J0czNERVMoKSkgeworICAgICAgICAgICAgc3VwZXIudGVzdFVwZGF0ZVdpdGhFbXB0eUlucHV0UmV0dXJuc0NvcnJlY3RWYWx1ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdEdlbmVyYXRlZEl2RG9lc05vdFN1cnZpdmVSZWluaXRpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChUZXN0VXRpbHMuc3VwcG9ydHMzREVTKCkpIHsKKyAgICAgICAgICAgIHN1cGVyLnRlc3RVcGRhdGVXaXRoRW1wdHlJbnB1dFJldHVybnNDb3JyZWN0VmFsdWUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RFeHBsaWNpdGx5U2V0SXZEb2VzTm90U3Vydml2ZVJlaW5pdGlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKFRlc3RVdGlscy5zdXBwb3J0czNERVMoKSkgeworICAgICAgICAgICAgc3VwZXIudGVzdFVwZGF0ZVdpdGhFbXB0eUlucHV0UmV0dXJuc0NvcnJlY3RWYWx1ZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMva2V5c3RvcmUvc3JjL2FuZHJvaWQva2V5c3RvcmUvY3RzL0RFU2VkZUVDQk5vUGFkZGluZ0NpcGhlclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2tleXN0b3JlL3NyYy9hbmRyb2lkL2tleXN0b3JlL2N0cy9ERVNlZGVFQ0JOb1BhZGRpbmdDaXBoZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE4ZGM0MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2tleXN0b3JlL3NyYy9hbmRyb2lkL2tleXN0b3JlL2N0cy9ERVNlZGVFQ0JOb1BhZGRpbmdDaXBoZXJUZXN0LmphdmEKQEAgLTAsMCArMSwzNiBAQAorcGFja2FnZSBhbmRyb2lkLmtleXN0b3JlLmN0czsKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWxnb3JpdGhtUGFyYW1ldGVyczsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYzsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuSW52YWxpZFBhcmFtZXRlclNwZWNFeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBERVNlZGVFQ0JOb1BhZGRpbmdDaXBoZXJUZXN0IGV4dGVuZHMgREVTZWRlQ2lwaGVyVGVzdEJhc2UgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRUcmFuc2Zvcm1hdGlvbigpIHsKKyAgICAgICAgcmV0dXJuICJERVNlZGUvRUNCL05vUGFkZGluZyI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGJ5dGVbXSBnZXRJdihBbGdvcml0aG1QYXJhbWV0ZXJzIHBhcmFtcykgdGhyb3dzIEludmFsaWRQYXJhbWV0ZXJTcGVjRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHBhcmFtcyAhPSBudWxsKSB7CisgICAgICAgICAgICBmYWlsKCJFQ0IgZG9lcyBub3QgdXNlIElWIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFsZ29yaXRobVBhcmFtZXRlclNwZWMgZ2V0S2F0QWxnb3JpdGhtUGFyYW1ldGVyU3BlYygpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGJ5dGVbXSBnZXRLYXRDaXBoZXJ0ZXh0KCkgeworICAgICAgICByZXR1cm4gSGV4RW5jb2RpbmcuZGVjb2RlKCJhZGUxMTlmOWUzNWFiM2U5YWRlMTE5ZjllMzVhYjNlOSIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBieXRlW10gZ2V0S2F0SXYoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2tleXN0b3JlL3NyYy9hbmRyb2lkL2tleXN0b3JlL2N0cy9ERVNlZGVFQ0JQS0NTN1BhZGRpbmdDaXBoZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9rZXlzdG9yZS9zcmMvYW5kcm9pZC9rZXlzdG9yZS9jdHMvREVTZWRlRUNCUEtDUzdQYWRkaW5nQ2lwaGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNTc5YmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9rZXlzdG9yZS9zcmMvYW5kcm9pZC9rZXlzdG9yZS9jdHMvREVTZWRlRUNCUEtDUzdQYWRkaW5nQ2lwaGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKK3BhY2thZ2UgYW5kcm9pZC5rZXlzdG9yZS5jdHM7CisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFsZ29yaXRobVBhcmFtZXRlcnM7CitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWM7CitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLkludmFsaWRQYXJhbWV0ZXJTcGVjRXhjZXB0aW9uOworCitwdWJsaWMgY2xhc3MgREVTZWRlRUNCUEtDUzdQYWRkaW5nQ2lwaGVyVGVzdCBleHRlbmRzIERFU2VkZUNpcGhlclRlc3RCYXNlIHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VHJhbnNmb3JtYXRpb24oKSB7CisgICAgICAgIHJldHVybiAiREVTZWRlL0VDQi9QS0NTN1BhZGRpbmciOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBieXRlW10gZ2V0SXYoQWxnb3JpdGhtUGFyYW1ldGVycyBwYXJhbXMpIHRocm93cyBJbnZhbGlkUGFyYW1ldGVyU3BlY0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChwYXJhbXMgIT0gbnVsbCkgeworICAgICAgICAgICAgZmFpbCgiRUNCIGRvZXMgbm90IHVzZSBJViIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBbGdvcml0aG1QYXJhbWV0ZXJTcGVjIGdldEthdEFsZ29yaXRobVBhcmFtZXRlclNwZWMoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBieXRlW10gZ2V0S2F0Q2lwaGVydGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIEhleEVuY29kaW5nLmRlY29kZSgiYWRlMTE5ZjllMzVhYjNlOWFkZTExOWY5ZTM1YWIzZTk0YmNiMDFiYmMwZDA1NTI2Iik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGJ5dGVbXSBnZXRLYXRJdigpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMva2V5c3RvcmUvc3JjL2FuZHJvaWQva2V5c3RvcmUvY3RzL0ltcG9ydFdyYXBwZWRLZXlUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9rZXlzdG9yZS9zcmMvYW5kcm9pZC9rZXlzdG9yZS9jdHMvSW1wb3J0V3JhcHBlZEtleVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWQyZTJiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMva2V5c3RvcmUvc3JjL2FuZHJvaWQva2V5c3RvcmUvY3RzL0ltcG9ydFdyYXBwZWRLZXlUZXN0LmphdmEKQEAgLTAsMCArMSwzODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5rZXlzdG9yZS5jdHM7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZWN1cml0eS5rZXltYXN0ZXIuS2V5bWFzdGVyRGVmcy5LTV9BTEdPUklUSE1fM0RFUzsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZWN1cml0eS5rZXltYXN0ZXIuS2V5bWFzdGVyRGVmcy5LTV9BTEdPUklUSE1fQUVTOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlY3VyaXR5LmtleW1hc3Rlci5LZXltYXN0ZXJEZWZzLktNX0tFWV9GT1JNQVRfUkFXOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlY3VyaXR5LmtleW1hc3Rlci5LZXltYXN0ZXJEZWZzLktNX01PREVfQ0JDOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlY3VyaXR5LmtleW1hc3Rlci5LZXltYXN0ZXJEZWZzLktNX01PREVfRUNCOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlY3VyaXR5LmtleW1hc3Rlci5LZXltYXN0ZXJEZWZzLktNX1BBRF9OT05FOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlY3VyaXR5LmtleW1hc3Rlci5LZXltYXN0ZXJEZWZzLktNX1BBRF9QS0NTNzsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZWN1cml0eS5rZXltYXN0ZXIuS2V5bWFzdGVyRGVmcy5LTV9QVVJQT1NFX0RFQ1JZUFQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VjdXJpdHkua2V5bWFzdGVyLktleW1hc3RlckRlZnMuS01fUFVSUE9TRV9FTkNSWVBUOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlY3VyaXR5LmtleXN0b3JlLktleVByb3BlcnRpZXMuUFVSUE9TRV9XUkFQX0tFWTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7CitpbXBvcnQgYW5kcm9pZC5zZWN1cml0eS5rZXlzdG9yZS5LZXlHZW5QYXJhbWV0ZXJTcGVjOworaW1wb3J0IGFuZHJvaWQuc2VjdXJpdHkua2V5c3RvcmUuS2V5UHJvcGVydGllczsKK2ltcG9ydCBhbmRyb2lkLnNlY3VyaXR5LmtleXN0b3JlLlNlY3VyZUtleUltcG9ydFVuYXZhaWxhYmxlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQuc2VjdXJpdHkua2V5c3RvcmUuU3Ryb25nQm94VW5hdmFpbGFibGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5zZWN1cml0eS5rZXlzdG9yZS5XcmFwcGVkS2V5RW50cnk7CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKKworaW1wb3J0IGNvbS5hbmRyb2lkLm9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2Rpbmc7CitpbXBvcnQgY29tLmFuZHJvaWQub3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkVuY29kYWJsZVZlY3RvcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSSW50ZWdlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSTnVsbDsKK2ltcG9ydCBjb20uYW5kcm9pZC5vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2N0ZXRTdHJpbmc7CitpbXBvcnQgY29tLmFuZHJvaWQub3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUlNlcXVlbmNlOworaW1wb3J0IGNvbS5hbmRyb2lkLm9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJTZXQ7CitpbXBvcnQgY29tLmFuZHJvaWQub3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUlRhZ2dlZE9iamVjdDsKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5UGFpcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LktleVBhaXJHZW5lcmF0b3I7CitpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlTdG9yZTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LktleVN0b3JlLkVudHJ5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5U3RvcmVFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5QdWJsaWNLZXk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb207CitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWM7CitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLlJTQUtleUdlblBhcmFtZXRlclNwZWM7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworaW1wb3J0IGphdmF4LmNyeXB0by5DaXBoZXI7CitpbXBvcnQgamF2YXguY3J5cHRvLktleUdlbmVyYXRvcjsKK2ltcG9ydCBqYXZheC5jcnlwdG8uc3BlYy5HQ01QYXJhbWV0ZXJTcGVjOworaW1wb3J0IGphdmF4LmNyeXB0by5zcGVjLkl2UGFyYW1ldGVyU3BlYzsKK2ltcG9ydCBqYXZheC5jcnlwdG8uc3BlYy5PQUVQUGFyYW1ldGVyU3BlYzsKK2ltcG9ydCBqYXZheC5jcnlwdG8uc3BlYy5QU291cmNlOworaW1wb3J0IGphdmF4LmNyeXB0by5zcGVjLlNlY3JldEtleVNwZWM7CisKK3B1YmxpYyBjbGFzcyBJbXBvcnRXcmFwcGVkS2V5VGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxJQVMgPSAibXkga2V5IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1JBUFBJTkdfS0VZX0FMSUFTID0gIm15X2Zhdm9yaXRlX3dyYXBwaW5nX2tleSI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV1JBUFBFRF9GT1JNQVRfVkVSU0lPTiA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdDTV9UQUdfU0laRSA9IDEyODsKKworICAgIFNlY3VyZVJhbmRvbSByYW5kb20gPSBuZXcgU2VjdXJlUmFuZG9tKCk7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5U3RvcmVfSW1wb3J0V3JhcHBlZEtleSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByYW5kb20uc2V0U2VlZCgwKTsKKworICAgICAgICBieXRlW10ga2V5TWF0ZXJpYWwgPSBuZXcgYnl0ZVszMl07CisgICAgICAgIHJhbmRvbS5uZXh0Qnl0ZXMoa2V5TWF0ZXJpYWwpOworICAgICAgICBieXRlW10gbWFzayA9IG5ldyBieXRlWzMyXTsgLy8gWmVybyBtYXNrCisKKyAgICAgICAgS2V5UGFpciBrcDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGtwID0gZ2VuS2V5UGFpcihXUkFQUElOR19LRVlfQUxJQVMsIGZhbHNlKTsKKyAgICAgICAgfSBjYXRjaCAoU2VjdXJlS2V5SW1wb3J0VW5hdmFpbGFibGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGltcG9ydFdyYXBwZWRLZXkod3JhcEtleSgKKyAgICAgICAgICAgICAgICAgICAga3AuZ2V0UHVibGljKCksCisgICAgICAgICAgICAgICAgICAgIGtleU1hdGVyaWFsLAorICAgICAgICAgICAgICAgICAgICBtYXNrLAorICAgICAgICAgICAgICAgICAgICBtYWtlQXV0aExpc3Qoa2V5TWF0ZXJpYWwubGVuZ3RoICogOCwgS01fQUxHT1JJVEhNX0FFUykpKTsKKyAgICAgICAgfSBjYXRjaCAoU2VjdXJlS2V5SW1wb3J0VW5hdmFpbGFibGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gVXNlIEtleQorICAgICAgICBLZXlTdG9yZSBrZXlTdG9yZSA9IEtleVN0b3JlLmdldEluc3RhbmNlKCJBbmRyb2lkS2V5U3RvcmUiKTsKKyAgICAgICAga2V5U3RvcmUubG9hZChudWxsLCBudWxsKTsKKworICAgICAgICBhc3NlcnRUcnVlKCJGYWlsZWQgdG8gbG9hZCBrZXkgYWZ0ZXIgd3JhcHBlZCBpbXBvcnQiLCBrZXlTdG9yZS5jb250YWluc0FsaWFzKEFMSUFTKSk7CisKKyAgICAgICAgS2V5IGtleSA9IGtleVN0b3JlLmdldEtleShBTElBUywgbnVsbCk7CisKKyAgICAgICAgQ2lwaGVyIGMgPSBDaXBoZXIuZ2V0SW5zdGFuY2UoIkFFUy9FQ0IvUEtDUzdQYWRkaW5nIik7CisgICAgICAgIGMuaW5pdChDaXBoZXIuRU5DUllQVF9NT0RFLCBrZXkpOworICAgICAgICBieXRlW10gZW5jcnlwdGVkID0gYy5kb0ZpbmFsKCJoZWxsbywgd29ybGQiLmdldEJ5dGVzKCkpOworCisgICAgICAgIGMgPSBDaXBoZXIuZ2V0SW5zdGFuY2UoIkFFUy9FQ0IvUEtDUzdQYWRkaW5nIik7CisgICAgICAgIGMuaW5pdChDaXBoZXIuREVDUllQVF9NT0RFLCBrZXkpOworCisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgU3RyaW5nKGMuZG9GaW5hbChlbmNyeXB0ZWQpKSwgImhlbGxvLCB3b3JsZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RLZXlTdG9yZV9JbXBvcnRXcmFwcGVkS2V5XzNERVMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIGlmICghVGVzdFV0aWxzLnN1cHBvcnRzM0RFUygpKSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEtleUdlbmVyYXRvciBrZyA9IEtleUdlbmVyYXRvci5nZXRJbnN0YW5jZSgiREVTRURFIik7CisgICAgICAgIGtnLmluaXQoMTY4KTsKKyAgICAgICAgYnl0ZVtdIGtleU1hdGVyaWFsID0ga2cuZ2VuZXJhdGVLZXkoKS5nZXRFbmNvZGVkKCk7CisgICAgICAgIHJhbmRvbS5uZXh0Qnl0ZXMoa2V5TWF0ZXJpYWwpOworICAgICAgICBieXRlW10gbWFzayA9IG5ldyBieXRlWzI0XTsgLy8gWmVybyBtYXNrCisKKyAgICAgICAgS2V5UGFpciBrcDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGtwID0gZ2VuS2V5UGFpcihXUkFQUElOR19LRVlfQUxJQVMsIGZhbHNlKTsKKyAgICAgICAgfSBjYXRjaCAoU2VjdXJlS2V5SW1wb3J0VW5hdmFpbGFibGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGltcG9ydFdyYXBwZWRLZXkod3JhcEtleSgKKyAgICAgICAgICAgICAgICAgICAga3AuZ2V0UHVibGljKCksCisgICAgICAgICAgICAgICAgICAgIGtleU1hdGVyaWFsLAorICAgICAgICAgICAgICAgICAgICBtYXNrLAorICAgICAgICAgICAgICAgICAgICBtYWtlQXV0aExpc3QoMTY4LCBLTV9BTEdPUklUSE1fM0RFUykpKTsKKyAgICAgICAgfSBjYXRjaCAoU2VjdXJlS2V5SW1wb3J0VW5hdmFpbGFibGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gVXNlIEtleQorICAgICAgICBLZXlTdG9yZSBrZXlTdG9yZSA9IEtleVN0b3JlLmdldEluc3RhbmNlKCJBbmRyb2lkS2V5U3RvcmUiKTsKKyAgICAgICAga2V5U3RvcmUubG9hZChudWxsLCBudWxsKTsKKworICAgICAgICBhc3NlcnRUcnVlKCJGYWlsZWQgdG8gbG9hZCBrZXkgYWZ0ZXIgd3JhcHBlZCBpbXBvcnQiLCBrZXlTdG9yZS5jb250YWluc0FsaWFzKEFMSUFTKSk7CisKKyAgICAgICAgS2V5IGtleSA9IGtleVN0b3JlLmdldEtleShBTElBUywgbnVsbCk7CisKKyAgICAgICAgQ2lwaGVyIGMgPSBDaXBoZXIuZ2V0SW5zdGFuY2UoIkRFU2VkZS9DQkMvUEtDUzdQYWRkaW5nIik7CisgICAgICAgIGMuaW5pdChDaXBoZXIuRU5DUllQVF9NT0RFLCBrZXkpOworICAgICAgICBJdlBhcmFtZXRlclNwZWMgcGFyYW1TcGVjID0gbmV3IEl2UGFyYW1ldGVyU3BlYyhjLmdldElWKCkpOworICAgICAgICBieXRlW10gZW5jcnlwdGVkID0gYy5kb0ZpbmFsKCJoZWxsbywgd29ybGQiLmdldEJ5dGVzKCkpOworCisgICAgICAgIGMgPSBDaXBoZXIuZ2V0SW5zdGFuY2UoIkRFU2VkZS9DQkMvUEtDUzdQYWRkaW5nIik7CisgICAgICAgIGMuaW5pdChDaXBoZXIuREVDUllQVF9NT0RFLCBrZXksIHBhcmFtU3BlYyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBTdHJpbmcoYy5kb0ZpbmFsKGVuY3J5cHRlZCkpLCAiaGVsbG8sIHdvcmxkIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEtleVN0b3JlX0ltcG9ydFdyYXBwZWRLZXlfM0RFU19TdHJvbmdCb3goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIGlmICghVGVzdFV0aWxzLnN1cHBvcnRzM0RFUygpKSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBpZiAoVGVzdFV0aWxzLmhhc1N0cm9uZ0JveChnZXRDb250ZXh0KCkpKSB7CisgICAgICAgICAgICBLZXlHZW5lcmF0b3Iga2cgPSBLZXlHZW5lcmF0b3IuZ2V0SW5zdGFuY2UoIkRFU0VERSIpOworICAgICAgICAgICAga2cuaW5pdCgxNjgpOworICAgICAgICAgICAgYnl0ZVtdIGtleU1hdGVyaWFsID0ga2cuZ2VuZXJhdGVLZXkoKS5nZXRFbmNvZGVkKCk7CisgICAgICAgICAgICByYW5kb20ubmV4dEJ5dGVzKGtleU1hdGVyaWFsKTsKKyAgICAgICAgICAgIGJ5dGVbXSBtYXNrID0gbmV3IGJ5dGVbMjRdOyAvLyBaZXJvIG1hc2sKKworICAgICAgICAgICAgaW1wb3J0V3JhcHBlZEtleSh3cmFwS2V5KAorICAgICAgICAgICAgICAgICAgICBnZW5LZXlQYWlyKFdSQVBQSU5HX0tFWV9BTElBUywgdHJ1ZSkuZ2V0UHVibGljKCksCisgICAgICAgICAgICAgICAgICAgIGtleU1hdGVyaWFsLAorICAgICAgICAgICAgICAgICAgICBtYXNrLAorICAgICAgICAgICAgICAgICAgICBtYWtlQXV0aExpc3QoMTY4LCBLTV9BTEdPUklUSE1fM0RFUykpKTsKKworICAgICAgICAgICAgLy8gVXNlIEtleQorICAgICAgICAgICAgS2V5U3RvcmUga2V5U3RvcmUgPSBLZXlTdG9yZS5nZXRJbnN0YW5jZSgiQW5kcm9pZEtleVN0b3JlIik7CisgICAgICAgICAgICBrZXlTdG9yZS5sb2FkKG51bGwsIG51bGwpOworCisgICAgICAgICAgICBhc3NlcnRUcnVlKCJGYWlsZWQgdG8gbG9hZCBrZXkgYWZ0ZXIgd3JhcHBlZCBpbXBvcnQiLCBrZXlTdG9yZS5jb250YWluc0FsaWFzKEFMSUFTKSk7CisKKyAgICAgICAgICAgIEtleSBrZXkgPSBrZXlTdG9yZS5nZXRLZXkoQUxJQVMsIG51bGwpOworCisgICAgICAgICAgICBDaXBoZXIgYyA9IENpcGhlci5nZXRJbnN0YW5jZSgiREVTZWRlL0NCQy9QS0NTN1BhZGRpbmciKTsKKyAgICAgICAgICAgIGMuaW5pdChDaXBoZXIuRU5DUllQVF9NT0RFLCBrZXkpOworICAgICAgICAgICAgSXZQYXJhbWV0ZXJTcGVjIHBhcmFtU3BlYyA9IG5ldyBJdlBhcmFtZXRlclNwZWMoYy5nZXRJVigpKTsKKyAgICAgICAgICAgIGJ5dGVbXSBlbmNyeXB0ZWQgPSBjLmRvRmluYWwoImhlbGxvLCB3b3JsZCIuZ2V0Qnl0ZXMoKSk7CisKKyAgICAgICAgICAgIGMgPSBDaXBoZXIuZ2V0SW5zdGFuY2UoIkRFU2VkZS9DQkMvUEtDUzdQYWRkaW5nIik7CisgICAgICAgICAgICBjLmluaXQoQ2lwaGVyLkRFQ1JZUFRfTU9ERSwga2V5LCBwYXJhbVNwZWMpOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobmV3IFN0cmluZyhjLmRvRmluYWwoZW5jcnlwdGVkKSksICJoZWxsbywgd29ybGQiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZ2VuS2V5UGFpcihXUkFQUElOR19LRVlfQUxJQVMsIHRydWUpOworICAgICAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFN0cm9uZ0JveFVuYXZhaWxhYmxlRXhjZXB0aW9uIHwgU2VjdXJlS2V5SW1wb3J0VW5hdmFpbGFibGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEtleVN0b3JlX0ltcG9ydFdyYXBwZWRLZXlfQUVTX1N0cm9uZ0JveCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoVGVzdFV0aWxzLmhhc1N0cm9uZ0JveChnZXRDb250ZXh0KCkpKSB7CisgICAgICAgICAgICByYW5kb20uc2V0U2VlZCgwKTsKKworICAgICAgICAgICAgYnl0ZVtdIGtleU1hdGVyaWFsID0gbmV3IGJ5dGVbMzJdOworICAgICAgICAgICAgcmFuZG9tLm5leHRCeXRlcyhrZXlNYXRlcmlhbCk7CisgICAgICAgICAgICBieXRlW10gbWFzayA9IG5ldyBieXRlWzMyXTsgLy8gWmVybyBtYXNrCisKKyAgICAgICAgICAgIGltcG9ydFdyYXBwZWRLZXkod3JhcEtleSgKKyAgICAgICAgICAgICAgICAgICAgZ2VuS2V5UGFpcihXUkFQUElOR19LRVlfQUxJQVMsIHRydWUpLmdldFB1YmxpYygpLAorICAgICAgICAgICAgICAgICAgICBrZXlNYXRlcmlhbCwKKyAgICAgICAgICAgICAgICAgICAgbWFzaywKKyAgICAgICAgICAgICAgICAgICAgbWFrZUF1dGhMaXN0KGtleU1hdGVyaWFsLmxlbmd0aCAqIDgsIEtNX0FMR09SSVRITV9BRVMpKSk7CisKKyAgICAgICAgICAgIC8vIFVzZSBLZXkKKyAgICAgICAgICAgIEtleVN0b3JlIGtleVN0b3JlID0gS2V5U3RvcmUuZ2V0SW5zdGFuY2UoIkFuZHJvaWRLZXlTdG9yZSIpOworICAgICAgICAgICAga2V5U3RvcmUubG9hZChudWxsLCBudWxsKTsKKworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIGxvYWQga2V5IGFmdGVyIHdyYXBwZWQgaW1wb3J0Iiwga2V5U3RvcmUuY29udGFpbnNBbGlhcyhBTElBUykpOworCisgICAgICAgICAgICBLZXkga2V5ID0ga2V5U3RvcmUuZ2V0S2V5KEFMSUFTLCBudWxsKTsKKworICAgICAgICAgICAgQ2lwaGVyIGMgPSBDaXBoZXIuZ2V0SW5zdGFuY2UoIkFFUy9DQkMvUEtDUzdQYWRkaW5nIik7CisgICAgICAgICAgICBjLmluaXQoQ2lwaGVyLkVOQ1JZUFRfTU9ERSwga2V5KTsKKyAgICAgICAgICAgIEl2UGFyYW1ldGVyU3BlYyBwYXJhbVNwZWMgPSBuZXcgSXZQYXJhbWV0ZXJTcGVjKGMuZ2V0SVYoKSk7CisKKyAgICAgICAgICAgIGJ5dGVbXSBlbmNyeXB0ZWQgPSBjLmRvRmluYWwoImhlbGxvLCB3b3JsZCIuZ2V0Qnl0ZXMoKSk7CisKKyAgICAgICAgICAgIGMgPSBDaXBoZXIuZ2V0SW5zdGFuY2UoIkFFUy9DQkMvUEtDUzdQYWRkaW5nIik7CisgICAgICAgICAgICBjLmluaXQoQ2lwaGVyLkRFQ1JZUFRfTU9ERSwga2V5LCBwYXJhbVNwZWMpOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobmV3IFN0cmluZyhjLmRvRmluYWwoZW5jcnlwdGVkKSksICJoZWxsbywgd29ybGQiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgIHJhbmRvbS5zZXRTZWVkKDApOworCisgICAgICAgICAgICAgIGJ5dGVbXSBrZXlNYXRlcmlhbCA9IG5ldyBieXRlWzMyXTsKKyAgICAgICAgICAgICAgcmFuZG9tLm5leHRCeXRlcyhrZXlNYXRlcmlhbCk7CisgICAgICAgICAgICAgIGJ5dGVbXSBtYXNrID0gbmV3IGJ5dGVbMzJdOyAvLyBaZXJvIG1hc2sKKworICAgICAgICAgICAgICBpbXBvcnRXcmFwcGVkS2V5KHdyYXBLZXkoCisgICAgICAgICAgICAgICAgICBnZW5LZXlQYWlyKFdSQVBQSU5HX0tFWV9BTElBUywgdHJ1ZSkuZ2V0UHVibGljKCksCisgICAgICAgICAgICAgICAgICBrZXlNYXRlcmlhbCwKKyAgICAgICAgICAgICAgICAgIG1hc2ssCisgICAgICAgICAgICAgICAgICBtYWtlQXV0aExpc3Qoa2V5TWF0ZXJpYWwubGVuZ3RoICogOCwgS01fQUxHT1JJVEhNX0FFUykpKTsKKyAgICAgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgICAgICB9IGNhdGNoIChTdHJvbmdCb3hVbmF2YWlsYWJsZUV4Y2VwdGlvbiB8IFNlY3VyZUtleUltcG9ydFVuYXZhaWxhYmxlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGltcG9ydFdyYXBwZWRLZXkoYnl0ZVtdIHdyYXBwZWRLZXkpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBLZXlTdG9yZSBrZXlTdG9yZSA9IEtleVN0b3JlLmdldEluc3RhbmNlKCJBbmRyb2lkS2V5U3RvcmUiKTsKKyAgICAgICAga2V5U3RvcmUubG9hZChudWxsLCBudWxsKTsKKworICAgICAgICBBbGdvcml0aG1QYXJhbWV0ZXJTcGVjIHNwZWMgPSBuZXcgS2V5R2VuUGFyYW1ldGVyU3BlYy5CdWlsZGVyKFdSQVBQSU5HX0tFWV9BTElBUywKKyAgICAgICAgICAgICAgICBLZXlQcm9wZXJ0aWVzLlBVUlBPU0VfV1JBUF9LRVkpCisgICAgICAgICAgICAgICAgLnNldERpZ2VzdHMoS2V5UHJvcGVydGllcy5ESUdFU1RfU0hBMSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgRW50cnkgd3JhcHBlZEtleUVudHJ5ID0gbmV3IFdyYXBwZWRLZXlFbnRyeSh3cmFwcGVkS2V5LCBXUkFQUElOR19LRVlfQUxJQVMsCisgICAgICAgICAgICAgICAgICAiUlNBL0VDQi9PQUVQUGFkZGluZyIsIHNwZWMpOworICAgICAgICBrZXlTdG9yZS5zZXRFbnRyeShBTElBUywgd3JhcHBlZEtleUVudHJ5LCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYnl0ZVtdIHdyYXBLZXkoUHVibGljS2V5IHB1YmxpY0tleSwgYnl0ZVtdIGtleU1hdGVyaWFsLCBieXRlW10gbWFzaywKKyAgICAgICAgICAgIERFUlNlcXVlbmNlIGF1dGhvcml6YXRpb25MaXN0KQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIEJ1aWxkIGRlc2NyaXB0aW9uCisgICAgICAgIERFUkVuY29kYWJsZVZlY3RvciBkZXNjcmlwdGlvbkl0ZW1zID0gbmV3IERFUkVuY29kYWJsZVZlY3RvcigpOworICAgICAgICBkZXNjcmlwdGlvbkl0ZW1zLmFkZChuZXcgREVSSW50ZWdlcihLTV9LRVlfRk9STUFUX1JBVykpOworICAgICAgICBkZXNjcmlwdGlvbkl0ZW1zLmFkZChhdXRob3JpemF0aW9uTGlzdCk7CisgICAgICAgIERFUlNlcXVlbmNlIHdyYXBwZWRLZXlEZXNjcmlwdGlvbiA9IG5ldyBERVJTZXF1ZW5jZShkZXNjcmlwdGlvbkl0ZW1zKTsKKworICAgICAgICAvLyBHZW5lcmF0ZSAxMiBieXRlIGluaXRpYWxpemF0aW9uIHZlY3RvcgorICAgICAgICBieXRlW10gaXYgPSBuZXcgYnl0ZVsxMl07CisgICAgICAgIHJhbmRvbS5uZXh0Qnl0ZXMoaXYpOworCisgICAgICAgIC8vIEdlbmVyYXRlIDI1NiBiaXQgQUVTIGtleS4gVGhpcyBpcyB0aGUgZXBoZW1lcmFsIGtleSB1c2VkIHRvIGVuY3J5cHQgdGhlIHNlY3VyZSBrZXkuCisgICAgICAgIGJ5dGVbXSBhZXNLZXlCeXRlcyA9IG5ldyBieXRlWzMyXTsKKyAgICAgICAgcmFuZG9tLm5leHRCeXRlcyhhZXNLZXlCeXRlcyk7CisKKyAgICAgICAgLy8gRW5jcnlwdCBlcGhlbWVyYWwga2V5cworICAgICAgICBDaXBoZXIgcGtDaXBoZXIgPSBDaXBoZXIuZ2V0SW5zdGFuY2UoIlJTQS9FQ0IvT0FFUFBhZGRpbmciKTsKKyAgICAgICAgcGtDaXBoZXIuaW5pdChDaXBoZXIuRU5DUllQVF9NT0RFLCBwdWJsaWNLZXkpOworICAgICAgICBieXRlW10gZW5jcnlwdGVkRXBoZW1lcmFsS2V5cyA9IHBrQ2lwaGVyLmRvRmluYWwoYWVzS2V5Qnl0ZXMpOworCisgICAgICAgIC8vIEVuY3J5cHQgc2VjdXJlIGtleQorICAgICAgICBDaXBoZXIgY2lwaGVyID0gQ2lwaGVyLmdldEluc3RhbmNlKCJBRVMvR0NNL05vUGFkZGluZyIpOworICAgICAgICBTZWNyZXRLZXlTcGVjIHNlY3JldEtleVNwZWMgPSBuZXcgU2VjcmV0S2V5U3BlYyhhZXNLZXlCeXRlcywgIkFFUyIpOworICAgICAgICBHQ01QYXJhbWV0ZXJTcGVjIGdjbVBhcmFtZXRlclNwZWMgPSBuZXcgR0NNUGFyYW1ldGVyU3BlYyhHQ01fVEFHX1NJWkUsIGl2KTsKKyAgICAgICAgY2lwaGVyLmluaXQoQ2lwaGVyLkVOQ1JZUFRfTU9ERSwgc2VjcmV0S2V5U3BlYywgZ2NtUGFyYW1ldGVyU3BlYyk7CisgICAgICAgIGJ5dGVbXSBhYWQgPSB3cmFwcGVkS2V5RGVzY3JpcHRpb24uZ2V0RW5jb2RlZCgpOworCisgICAgICAgIGNpcGhlci51cGRhdGVBQUQoYWFkKTsKKyAgICAgICAgYnl0ZVtdIGVuY3J5cHRlZFNlY3VyZUtleSA9IGNpcGhlci5kb0ZpbmFsKGtleU1hdGVyaWFsKTsKKyAgICAgICAgLy8gR2V0IEdDTSB0YWcuIEphdmEgcHV0cyB0aGUgdGFnIGF0IHRoZSBlbmQgb2YgdGhlIGNpcGhlcnRleHQgZGF0YSA6KAorICAgICAgICBpbnQgbGVuID0gZW5jcnlwdGVkU2VjdXJlS2V5Lmxlbmd0aDsKKyAgICAgICAgaW50IHRhZ1NpemUgPSAoR0NNX1RBR19TSVpFIC8gOCk7CisgICAgICAgIGJ5dGVbXSB0YWcgPSBBcnJheXMuY29weU9mUmFuZ2UoZW5jcnlwdGVkU2VjdXJlS2V5LCBsZW4gLSB0YWdTaXplLCBsZW4pOworCisgICAgICAgIC8vIFJlbW92ZSBHQ00gdGFnIGZyb20gZW5kIG9mIG91dHB1dAorICAgICAgICBlbmNyeXB0ZWRTZWN1cmVLZXkgPSBBcnJheXMuY29weU9mUmFuZ2UoZW5jcnlwdGVkU2VjdXJlS2V5LCAwLCBsZW4gLSB0YWdTaXplKTsKKworICAgICAgICAvLyBCdWlsZCBBU04uMSBERVIgZW5jb2RlZCBzZXF1ZW5jZSBXcmFwcGVkS2V5V3JhcHBlcgorICAgICAgICBERVJFbmNvZGFibGVWZWN0b3IgaXRlbXMgPSBuZXcgREVSRW5jb2RhYmxlVmVjdG9yKCk7CisgICAgICAgIGl0ZW1zLmFkZChuZXcgREVSSW50ZWdlcihXUkFQUEVEX0ZPUk1BVF9WRVJTSU9OKSk7CisgICAgICAgIGl0ZW1zLmFkZChuZXcgREVST2N0ZXRTdHJpbmcoZW5jcnlwdGVkRXBoZW1lcmFsS2V5cykpOworICAgICAgICBpdGVtcy5hZGQobmV3IERFUk9jdGV0U3RyaW5nKGl2KSk7CisgICAgICAgIGl0ZW1zLmFkZCh3cmFwcGVkS2V5RGVzY3JpcHRpb24pOworICAgICAgICBpdGVtcy5hZGQobmV3IERFUk9jdGV0U3RyaW5nKGVuY3J5cHRlZFNlY3VyZUtleSkpOworICAgICAgICBpdGVtcy5hZGQobmV3IERFUk9jdGV0U3RyaW5nKHRhZykpOworICAgICAgICByZXR1cm4gbmV3IERFUlNlcXVlbmNlKGl0ZW1zKS5nZXRFbmNvZGVkKEFTTjFFbmNvZGluZy5ERVIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHhvciBvZiB0d28gYnl0ZVtdIGZvciBtYXNraW5nIG9yIHVubWFza2luZyB0cmFuc2l0IGtleXMKKyAgICAgKi8KKyAgICBwcml2YXRlIGJ5dGVbXSB4b3IoYnl0ZVtdIGtleSwgYnl0ZVtdIG1hc2spIHsKKyAgICAgICAgYnl0ZVtdIG91dCA9IG5ldyBieXRlW2tleS5sZW5ndGhdOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2V5Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBvdXRbaV0gPSAoYnl0ZSkgKGtleVtpXSBeIG1hc2tbaV0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBvdXQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBERVJTZXF1ZW5jZSBtYWtlQXV0aExpc3QoaW50IHNpemUsCisgICAgICAgICAgICBpbnQgYWxnb3JpdGhtXykgeworICAgICAgICAvLyBNYWtlIGFuIEF1dGhvcml6YXRpb25MaXN0IHRvIGRlc2NyaWJlIHRoZSBzZWN1cmUga2V5CisgICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3RyYWluaW5nL2FydGljbGVzL3NlY3VyaXR5LWtleS1hdHRlc3RhdGlvbi5odG1sI3ZlcmlmeWluZworICAgICAgICBERVJFbmNvZGFibGVWZWN0b3IgYWxsUHVycG9zZXMgPSBuZXcgREVSRW5jb2RhYmxlVmVjdG9yKCk7CisgICAgICAgIGFsbFB1cnBvc2VzLmFkZChuZXcgREVSSW50ZWdlcihLTV9QVVJQT1NFX0VOQ1JZUFQpKTsKKyAgICAgICAgYWxsUHVycG9zZXMuYWRkKG5ldyBERVJJbnRlZ2VyKEtNX1BVUlBPU0VfREVDUllQVCkpOworICAgICAgICBERVJTZXQgcHVycG9zZVNldCA9IG5ldyBERVJTZXQoYWxsUHVycG9zZXMpOworICAgICAgICBERVJUYWdnZWRPYmplY3QgcHVycG9zZSA9IG5ldyBERVJUYWdnZWRPYmplY3QodHJ1ZSwgMSwgcHVycG9zZVNldCk7CisgICAgICAgIERFUlRhZ2dlZE9iamVjdCBhbGdvcml0aG0gPSBuZXcgREVSVGFnZ2VkT2JqZWN0KHRydWUsIDIsIG5ldyBERVJJbnRlZ2VyKGFsZ29yaXRobV8pKTsKKyAgICAgICAgREVSVGFnZ2VkT2JqZWN0IGtleVNpemUgPQorICAgICAgICAgICAgICAgIG5ldyBERVJUYWdnZWRPYmplY3QodHJ1ZSwgMywgbmV3IERFUkludGVnZXIoc2l6ZSkpOworCisgICAgICAgIERFUkVuY29kYWJsZVZlY3RvciBhbGxCbG9ja01vZGVzID0gbmV3IERFUkVuY29kYWJsZVZlY3RvcigpOworICAgICAgICBhbGxCbG9ja01vZGVzLmFkZChuZXcgREVSSW50ZWdlcihLTV9NT0RFX0VDQikpOworICAgICAgICBhbGxCbG9ja01vZGVzLmFkZChuZXcgREVSSW50ZWdlcihLTV9NT0RFX0NCQykpOworICAgICAgICBERVJTZXQgYmxvY2tNb2RlU2V0ID0gbmV3IERFUlNldChhbGxCbG9ja01vZGVzKTsKKyAgICAgICAgREVSVGFnZ2VkT2JqZWN0IGJsb2NrTW9kZSA9IG5ldyBERVJUYWdnZWRPYmplY3QodHJ1ZSwgNCwgYmxvY2tNb2RlU2V0KTsKKworICAgICAgICBERVJFbmNvZGFibGVWZWN0b3IgYWxsUGFkZGluZ3MgPSBuZXcgREVSRW5jb2RhYmxlVmVjdG9yKCk7CisgICAgICAgIGFsbFBhZGRpbmdzLmFkZChuZXcgREVSSW50ZWdlcihLTV9QQURfUEtDUzcpKTsKKyAgICAgICAgYWxsUGFkZGluZ3MuYWRkKG5ldyBERVJJbnRlZ2VyKEtNX1BBRF9OT05FKSk7CisgICAgICAgIERFUlNldCBwYWRkaW5nU2V0ID0gbmV3IERFUlNldChhbGxQYWRkaW5ncyk7CisgICAgICAgIERFUlRhZ2dlZE9iamVjdCBwYWRkaW5nID0gbmV3IERFUlRhZ2dlZE9iamVjdCh0cnVlLCA2LCBwYWRkaW5nU2V0KTsKKworICAgICAgICBERVJUYWdnZWRPYmplY3Qgbm9BdXRoUmVxdWlyZWQgPSBuZXcgREVSVGFnZ2VkT2JqZWN0KHRydWUsIDUwMywgREVSTnVsbC5JTlNUQU5DRSk7CisKKyAgICAgICAgLy8gQnVpbGQgc2VxdWVuY2UKKyAgICAgICAgREVSRW5jb2RhYmxlVmVjdG9yIGFsbEl0ZW1zID0gbmV3IERFUkVuY29kYWJsZVZlY3RvcigpOworICAgICAgICBhbGxJdGVtcy5hZGQocHVycG9zZSk7CisgICAgICAgIGFsbEl0ZW1zLmFkZChhbGdvcml0aG0pOworICAgICAgICBhbGxJdGVtcy5hZGQoa2V5U2l6ZSk7CisgICAgICAgIGFsbEl0ZW1zLmFkZChibG9ja01vZGUpOworICAgICAgICBhbGxJdGVtcy5hZGQocGFkZGluZyk7CisgICAgICAgIGFsbEl0ZW1zLmFkZChub0F1dGhSZXF1aXJlZCk7CisgICAgICAgIHJldHVybiBuZXcgREVSU2VxdWVuY2UoYWxsSXRlbXMpOworICAgIH0KKworICAgIHByaXZhdGUgS2V5UGFpciBnZW5LZXlQYWlyKFN0cmluZyBhbGlhcywgYm9vbGVhbiBpc1N0cm9uZ0JveEJhY2tlZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEtleVBhaXJHZW5lcmF0b3Iga3BnID0KKyAgICAgICAgICAgICAgICBLZXlQYWlyR2VuZXJhdG9yLmdldEluc3RhbmNlKEtleVByb3BlcnRpZXMuS0VZX0FMR09SSVRITV9SU0EsICJBbmRyb2lkS2V5U3RvcmUiKTsKKworICAgICAgICBrcGcuaW5pdGlhbGl6ZSgKKyAgICAgICAgICAgICAgICBuZXcgS2V5R2VuUGFyYW1ldGVyU3BlYy5CdWlsZGVyKGFsaWFzLCBLZXlQcm9wZXJ0aWVzLlBVUlBPU0VfV1JBUF9LRVkpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RGlnZXN0cyhLZXlQcm9wZXJ0aWVzLkRJR0VTVF9TSEE1MTIsIEtleVByb3BlcnRpZXMuRElHRVNUX1NIQTEpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RW5jcnlwdGlvblBhZGRpbmdzKEtleVByb3BlcnRpZXMuRU5DUllQVElPTl9QQURESU5HX1JTQV9PQUVQKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEJsb2NrTW9kZXMoS2V5UHJvcGVydGllcy5CTE9DS19NT0RFX0VDQikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJc1N0cm9uZ0JveEJhY2tlZChpc1N0cm9uZ0JveEJhY2tlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgcmV0dXJuIGtwZy5nZW5lcmF0ZUtleVBhaXIoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9rZXlzdG9yZS9zcmMvYW5kcm9pZC9rZXlzdG9yZS9jdHMvS2V5QXR0ZXN0YXRpb25UZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9rZXlzdG9yZS9zcmMvYW5kcm9pZC9rZXlzdG9yZS9jdHMvS2V5QXR0ZXN0YXRpb25UZXN0LmphdmEKaW5kZXggZDkwMTY5MC4uNmI5MjVkNCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMva2V5c3RvcmUvc3JjL2FuZHJvaWQva2V5c3RvcmUvY3RzL0tleUF0dGVzdGF0aW9uVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2tleXN0b3JlL3NyYy9hbmRyb2lkL2tleXN0b3JlL2N0cy9LZXlBdHRlc3RhdGlvblRlc3QuamF2YQpAQCAtNjIsNiArNjIsOSBAQAogaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkFycmF5U2V0OwogCitpbXBvcnQgY29tLmFuZHJvaWQub3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDAuWDUwME5hbWU7CitpbXBvcnQgY29tLmFuZHJvaWQub3JnLmJvdW5jeWNhc3RsZS5jZXJ0LmpjYWpjZS5KY2FYNTA5Q2VydGlmaWNhdGVIb2xkZXI7CisKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkS2V5RXhjZXB0aW9uOwpAQCAtNzAsNiArNzMsNyBAQAogaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoUHJvdmlkZXJFeGNlcHRpb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5Qcm92aWRlckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlB1YmxpY0tleTsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlNpZ25hdHVyZUV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGU7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRXhjZXB0aW9uOwpAQCAtNDIyLDcgKzQyNiw3IEBACiAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIENlcnRpZmljYXRlIGNlcnRpZmljYXRlc1tdID0ga2V5U3RvcmUuZ2V0Q2VydGlmaWNhdGVDaGFpbihrZXlzdG9yZUFsaWFzKTsKLSAgICAgICAgICAgIHZlcmlmeUNlcnRpZmljYXRlU2lnbmF0dXJlcyhjZXJ0aWZpY2F0ZXMpOworICAgICAgICAgICAgdmVyaWZ5Q2VydGlmaWNhdGVDaGFpbihjZXJ0aWZpY2F0ZXMpOwogCiAgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUgYXR0ZXN0YXRpb25DZXJ0ID0gKFg1MDlDZXJ0aWZpY2F0ZSkgY2VydGlmaWNhdGVzWzBdOwogICAgICAgICAgICAgQXR0ZXN0YXRpb24gYXR0ZXN0YXRpb24gPSBuZXcgQXR0ZXN0YXRpb24oYXR0ZXN0YXRpb25DZXJ0KTsKQEAgLTQ3Niw3ICs0ODAsNyBAQAogCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBDZXJ0aWZpY2F0ZSBjZXJ0aWZpY2F0ZXNbXSA9IGtleVN0b3JlLmdldENlcnRpZmljYXRlQ2hhaW4oa2V5c3RvcmVBbGlhcyk7Ci0gICAgICAgICAgICB2ZXJpZnlDZXJ0aWZpY2F0ZVNpZ25hdHVyZXMoY2VydGlmaWNhdGVzKTsKKyAgICAgICAgICAgIHZlcmlmeUNlcnRpZmljYXRlQ2hhaW4oY2VydGlmaWNhdGVzKTsKIAogICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlIGF0dGVzdGF0aW9uQ2VydCA9IChYNTA5Q2VydGlmaWNhdGUpIGNlcnRpZmljYXRlc1swXTsKICAgICAgICAgICAgIEF0dGVzdGF0aW9uIGF0dGVzdGF0aW9uID0gbmV3IEF0dGVzdGF0aW9uKGF0dGVzdGF0aW9uQ2VydCk7CkBAIC02ODYsNiArNjkwLDcgQEAKIAogICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgICAgICAgICBhc3NlcnRUaGF0KHRlZUVuZm9yY2VkRGlnZXN0cywgaXMoZXhwZWN0ZWREaWdlc3RzKSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCkBAIC03MTQsOCArNzE5LDggQEAKIAogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgIHByaXZhdGUgdm9pZCBjaGVja0F0dGVzdGF0aW9uU2VjdXJpdHlMZXZlbERlcGVuZGVudFBhcmFtcyhBdHRlc3RhdGlvbiBhdHRlc3RhdGlvbikgewotICAgICAgICBhc3NlcnRUaGF0KCJBdHRlc3RhdGlvbiB2ZXJzaW9uIG11c3QgYmUgMSBvciAyIiwgYXR0ZXN0YXRpb24uZ2V0QXR0ZXN0YXRpb25WZXJzaW9uKCksCi0gICAgICAgICAgICAgICAgZWl0aGVyKGlzKDEpKS5vcihpcygyKSkpOworICAgICAgICBhc3NlcnRUaGF0KCJBdHRlc3RhdGlvbiB2ZXJzaW9uIG11c3QgYmUgMSwgMiwgb3IgMyIsIGF0dGVzdGF0aW9uLmdldEF0dGVzdGF0aW9uVmVyc2lvbigpLAorICAgICAgICAgICAgICAgZWl0aGVyKGlzKDEpKS5vcihpcygyKSkub3IoaXMoMykpKTsKIAogICAgICAgICBBdXRob3JpemF0aW9uTGlzdCB0ZWVFbmZvcmNlZCA9IGF0dGVzdGF0aW9uLmdldFRlZUVuZm9yY2VkKCk7CiAgICAgICAgIEF1dGhvcml6YXRpb25MaXN0IHNvZnR3YXJlRW5mb3JjZWQgPSBhdHRlc3RhdGlvbi5nZXRTb2Z0d2FyZUVuZm9yY2VkKCk7CkBAIC03MjgsNyArNzMzLDcgQEAKICAgICAgICAgICAgICAgICBhc3NlcnRUaGF0KCJURUUgYXR0ZXN0YXRpb24gY2FuIG9ubHkgY29tZSBmcm9tIFRFRSBrZXltYXN0ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgYXR0ZXN0YXRpb24uZ2V0S2V5bWFzdGVyU2VjdXJpdHlMZXZlbCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgaXMoS01fU0VDVVJJVFlfTEVWRUxfVFJVU1RFRF9FTlZJUk9OTUVOVCkpOwotICAgICAgICAgICAgICAgIGFzc2VydFRoYXQoYXR0ZXN0YXRpb24uZ2V0S2V5bWFzdGVyVmVyc2lvbigpLCBlaXRoZXIoaXMoMikpLm9yKGlzKDMpKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VGhhdChhdHRlc3RhdGlvbi5nZXRLZXltYXN0ZXJWZXJzaW9uKCksIGVpdGhlcihpcygyKSkub3IoaXMoMykpLm9yKGlzKDQpKSk7CiAKICAgICAgICAgICAgICAgICBjaGVja1Jvb3RPZlRydXN0KGF0dGVzdGF0aW9uKTsKICAgICAgICAgICAgICAgICBhc3NlcnRUaGF0KHRlZUVuZm9yY2VkLmdldE9zVmVyc2lvbigpLCBpcyhzeXN0ZW1Pc1ZlcnNpb24pKTsKQEAgLTg3NiwxMiArODgxLDM2IEBACiAgICAgICAgIGtleVBhaXJHZW5lcmF0b3IuZ2VuZXJhdGVLZXlQYWlyKCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUNlcnRpZmljYXRlU2lnbmF0dXJlcyhDZXJ0aWZpY2F0ZVtdIGNlcnRDaGFpbikKKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5Q2VydGlmaWNhdGVDaGFpbihDZXJ0aWZpY2F0ZVtdIGNlcnRDaGFpbikKICAgICAgICAgICAgIHRocm93cyBHZW5lcmFsU2VjdXJpdHlFeGNlcHRpb24gewogICAgICAgICBhc3NlcnROb3ROdWxsKGNlcnRDaGFpbik7CiAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgY2VydENoYWluLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNlcnRDaGFpbltpIC0gMV0udmVyaWZ5KGNlcnRDaGFpbltpXS5nZXRQdWJsaWNLZXkoKSk7CisgICAgICAgICAgICAgICAgUHVibGljS2V5IHB1YktleSA9IGNlcnRDaGFpbltpXS5nZXRQdWJsaWNLZXkoKTsKKyAgICAgICAgICAgICAgICBjZXJ0Q2hhaW5baSAtIDFdLnZlcmlmeShwdWJLZXkpOworICAgICAgICAgICAgICAgIGlmIChpID09IGNlcnRDaGFpbi5sZW5ndGggLSAxKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIExhc3QgY2VydCBzaG91bGQgYmUgc2VsZi1zaWduZWQuCisgICAgICAgICAgICAgICAgICAgIGNlcnRDaGFpbltpXS52ZXJpZnkocHViS2V5KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGF0IGlzc3VlciBpbiB0aGUgc2lnbmVkIGNlcnQgbWF0Y2hlcyBzdWJqZWN0IGluIHRoZSBzaWduaW5nIGNlcnQuCisgICAgICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlIHg1MDlDdXJyQ2VydCA9IChYNTA5Q2VydGlmaWNhdGUpIGNlcnRDaGFpbltpXTsKKyAgICAgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUgeDUwOVByZXZDZXJ0ID0gKFg1MDlDZXJ0aWZpY2F0ZSkgY2VydENoYWluW2kgLSAxXTsKKyAgICAgICAgICAgICAgICBYNTAwTmFtZSBzaWduaW5nQ2VydFN1YmplY3QgPQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEpjYVg1MDlDZXJ0aWZpY2F0ZUhvbGRlcih4NTA5Q3VyckNlcnQpLmdldFN1YmplY3QoKTsKKyAgICAgICAgICAgICAgICBYNTAwTmFtZSBzaWduZWRDZXJ0SXNzdWVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBKY2FYNTA5Q2VydGlmaWNhdGVIb2xkZXIoeDUwOVByZXZDZXJ0KS5nZXRJc3N1ZXIoKTsKKyAgICAgICAgICAgICAgICAvLyBVc2UgLnRvQVNOMU9iamVjdCgpLmVxdWFscygpIHJhdGhlciB0aGFuIC5lcXVhbHMoKSBiZWNhdXNlIC5lcXVhbHMoKSBpcyBjYXNlCisgICAgICAgICAgICAgICAgLy8gaW5zZW5zaXRpdmUsIGFuZCB3ZSB3YW50IHRvIHZlcmlmeSBhbiBleGFjdCBtYXRjaC4KKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmVkQ2VydElzc3Vlci50b0FTTjFPYmplY3QoKS5lcXVhbHMoc2lnbmluZ0NlcnRTdWJqZWN0LnRvQVNOMU9iamVjdCgpKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoaSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEZpcnN0IGNlcnQgc2hvdWxkIGhhdmUgc3ViamVjdCAiQ049QW5kcm9pZCBLZXlzdG9yZSBLZXkiLgorICAgICAgICAgICAgICAgICAgICBYNTAwTmFtZSBzaWduZWRDZXJ0U3ViamVjdCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEpjYVg1MDlDZXJ0aWZpY2F0ZUhvbGRlcih4NTA5UHJldkNlcnQpLmdldFN1YmplY3QoKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNpZ25lZENlcnRTdWJqZWN0LCBuZXcgWDUwME5hbWUoIkNOPUFuZHJvaWQgS2V5c3RvcmUgS2V5IikpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gY2F0Y2ggKEludmFsaWRLZXlFeGNlcHRpb24gfCBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB8IE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbgogICAgICAgICAgICAgICAgICAgICB8IE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIHwgU2lnbmF0dXJlRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uKCJGYWlsZWQgdG8gdmVyaWZ5IGNlcnRpZmljYXRlICIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2tleXN0b3JlL3NyYy9hbmRyb2lkL2tleXN0b3JlL2N0cy9LZXlHZW5QYXJhbWV0ZXJTcGVjVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMva2V5c3RvcmUvc3JjL2FuZHJvaWQva2V5c3RvcmUvY3RzL0tleUdlblBhcmFtZXRlclNwZWNUZXN0LmphdmEKaW5kZXggYTNlNWQ5Ni4uOGUzNDA5NiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMva2V5c3RvcmUvc3JjL2FuZHJvaWQva2V5c3RvcmUvY3RzL0tleUdlblBhcmFtZXRlclNwZWNUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMva2V5c3RvcmUvc3JjL2FuZHJvaWQva2V5c3RvcmUvY3RzL0tleUdlblBhcmFtZXRlclNwZWNUZXN0LmphdmEKQEAgLTY2LDYgKzY2LDcgQEAKICAgICAgICAgTW9yZUFzc2VydHMuYXNzZXJ0RW1wdHkoQXJyYXlzLmFzTGlzdChzcGVjLmdldFNpZ25hdHVyZVBhZGRpbmdzKCkpKTsKICAgICAgICAgYXNzZXJ0RmFsc2Uoc3BlYy5pc1VzZXJBdXRoZW50aWNhdGlvblJlcXVpcmVkKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIHNwZWMuZ2V0VXNlckF1dGhlbnRpY2F0aW9uVmFsaWRpdHlEdXJhdGlvblNlY29uZHMoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHNwZWMuaXNVbmxvY2tlZERldmljZVJlcXVpcmVkKCkpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXR0ZXJzUmVmbGVjdGVkSW5HZXR0ZXJzKCkgewpAQCAtOTgsNiArOTksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgS2V5UHJvcGVydGllcy5TSUdOQVRVUkVfUEFERElOR19SU0FfUEtDUzEpCiAgICAgICAgICAgICAgICAgLnNldFVzZXJBdXRoZW50aWNhdGlvblJlcXVpcmVkKHRydWUpCiAgICAgICAgICAgICAgICAgLnNldFVzZXJBdXRoZW50aWNhdGlvblZhbGlkaXR5RHVyYXRpb25TZWNvbmRzKDEyMzQ1KQorICAgICAgICAgICAgICAgIC5zZXRVbmxvY2tlZERldmljZVJlcXVpcmVkKHRydWUpCiAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CiAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJhcmJpdHJhcnkiLCBzcGVjLmdldEtleXN0b3JlQWxpYXMoKSk7CkBAIC0xMjQsNiArMTI2LDcgQEAKICAgICAgICAgICAgICAgICBLZXlQcm9wZXJ0aWVzLlNJR05BVFVSRV9QQURESU5HX1JTQV9QU1MsIEtleVByb3BlcnRpZXMuU0lHTkFUVVJFX1BBRERJTkdfUlNBX1BLQ1MxKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShzcGVjLmlzVXNlckF1dGhlbnRpY2F0aW9uUmVxdWlyZWQoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygxMjM0NSwgc3BlYy5nZXRVc2VyQXV0aGVudGljYXRpb25WYWxpZGl0eUR1cmF0aW9uU2Vjb25kcygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzcGVjLmlzVW5sb2NrZWREZXZpY2VSZXF1aXJlZCgpKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0TnVsbEFsaWFzTm90UGVybWl0dGVkKCkgewpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMva2V5c3RvcmUvc3JjL2FuZHJvaWQva2V5c3RvcmUvY3RzL0tleUdlbmVyYXRvclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2tleXN0b3JlL3NyYy9hbmRyb2lkL2tleXN0b3JlL2N0cy9LZXlHZW5lcmF0b3JUZXN0LmphdmEKaW5kZXggNGE0ZWE5OC4uZWVhZGY0NiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMva2V5c3RvcmUvc3JjL2FuZHJvaWQva2V5c3RvcmUvY3RzL0tleUdlbmVyYXRvclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9rZXlzdG9yZS9zcmMvYW5kcm9pZC9rZXlzdG9yZS9jdHMvS2V5R2VuZXJhdG9yVGVzdC5qYXZhCkBAIC0yMSw2ICsyMSw4IEBACiBpbXBvcnQgYW5kcm9pZC5zZWN1cml0eS5rZXlzdG9yZS5LZXlQcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQudGVzdC5Nb3JlQXNzZXJ0czsKIAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuT2JqZWN0QXJyYXlzOworCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCiBpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOwpAQCAtNDYsNyArNDgsNyBAQAogcHVibGljIGNsYXNzIEtleUdlbmVyYXRvclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUEVDVEVEX1BST1ZJREVSX05BTUUgPSBUZXN0VXRpbHMuRVhQRUNURURfUFJPVklERVJfTkFNRTsKIAotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFWFBFQ1RFRF9BTEdPUklUSE1TID0geworICAgIHN0YXRpYyBTdHJpbmdbXSBFWFBFQ1RFRF9BTEdPUklUSE1TID0gewogICAgICAgICAiQUVTIiwKICAgICAgICAgIkhtYWNTSEExIiwKICAgICAgICAgIkhtYWNTSEEyMjQiLApAQCAtNTUsMTAgKzU3LDE3IEBACiAgICAgICAgICJIbWFjU0hBNTEyIiwKICAgICB9OwogCisgICAgeworICAgICAgICBpZiAoVGVzdFV0aWxzLnN1cHBvcnRzM0RFUygpKSB7CisgICAgICAgICAgICBFWFBFQ1RFRF9BTEdPUklUSE1TID0gT2JqZWN0QXJyYXlzLmNvbmNhdChFWFBFQ1RFRF9BTEdPUklUSE1TLCAiREVTZWRlIik7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBERUZBVUxUX0tFWV9TSVpFUyA9CiAgICAgICAgICAgICBuZXcgVHJlZU1hcDw+KFN0cmluZy5DQVNFX0lOU0VOU0lUSVZFX09SREVSKTsKICAgICBzdGF0aWMgewogICAgICAgICBERUZBVUxUX0tFWV9TSVpFUy5wdXQoIkFFUyIsIDEyOCk7CisgICAgICAgIERFRkFVTFRfS0VZX1NJWkVTLnB1dCgiREVTZWRlIiwgMTY4KTsKICAgICAgICAgREVGQVVMVF9LRVlfU0laRVMucHV0KCJIbWFjU0hBMSIsIDE2MCk7CiAgICAgICAgIERFRkFVTFRfS0VZX1NJWkVTLnB1dCgiSG1hY1NIQTIyNCIsIDIyNCk7CiAgICAgICAgIERFRkFVTFRfS0VZX1NJWkVTLnB1dCgiSG1hY1NIQTI1NiIsIDI1Nik7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9rZXlzdG9yZS9zcmMvYW5kcm9pZC9rZXlzdG9yZS9jdHMvS2V5UGFpckdlbmVyYXRvclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2tleXN0b3JlL3NyYy9hbmRyb2lkL2tleXN0b3JlL2N0cy9LZXlQYWlyR2VuZXJhdG9yVGVzdC5qYXZhCmluZGV4IDlkYmYzZjMuLmFkZWMxNTMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2tleXN0b3JlL3NyYy9hbmRyb2lkL2tleXN0b3JlL2N0cy9LZXlQYWlyR2VuZXJhdG9yVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2tleXN0b3JlL3NyYy9hbmRyb2lkL2tleXN0b3JlL2N0cy9LZXlQYWlyR2VuZXJhdG9yVGVzdC5qYXZhCkBAIC03NzgsNiArNzc4LDcgQEAKICAgICAgICAgICAgICAgICAuc2V0Q2VydGlmaWNhdGVTdWJqZWN0KGNlcnRTdWJqZWN0KQogICAgICAgICAgICAgICAgIC5zZXRDZXJ0aWZpY2F0ZU5vdEJlZm9yZShjZXJ0Tm90QmVmb3JlKQogICAgICAgICAgICAgICAgIC5zZXRDZXJ0aWZpY2F0ZU5vdEFmdGVyKGNlcnROb3RBZnRlcikKKyAgICAgICAgICAgICAgICAuc2V0VW5sb2NrZWREZXZpY2VSZXF1aXJlZCh0cnVlKQogICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKICAgICAgICAgS2V5UGFpciBrZXlQYWlyID0gZ2VuZXJhdG9yLmdlbmVyYXRlS2V5UGFpcigpOwogICAgICAgICBhc3NlcnRHZW5lcmF0ZWRLZXlQYWlyQW5kU2VsZlNpZ25lZENlcnRpZmljYXRlKApAQCAtODQ3LDYgKzg0OCw3IEBACiAgICAgICAgICAgICAgICAgLnNldENlcnRpZmljYXRlU3ViamVjdChjZXJ0U3ViamVjdCkKICAgICAgICAgICAgICAgICAuc2V0Q2VydGlmaWNhdGVOb3RCZWZvcmUoY2VydE5vdEJlZm9yZSkKICAgICAgICAgICAgICAgICAuc2V0Q2VydGlmaWNhdGVOb3RBZnRlcihjZXJ0Tm90QWZ0ZXIpCisgICAgICAgICAgICAgICAgLnNldFVubG9ja2VkRGV2aWNlUmVxdWlyZWQodHJ1ZSkKICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CiAgICAgICAgIEtleVBhaXIga2V5UGFpciA9IGdlbmVyYXRvci5nZW5lcmF0ZUtleVBhaXIoKTsKICAgICAgICAgYXNzZXJ0R2VuZXJhdGVkS2V5UGFpckFuZFNlbGZTaWduZWRDZXJ0aWZpY2F0ZSgKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2tleXN0b3JlL3NyYy9hbmRyb2lkL2tleXN0b3JlL2N0cy9LZXlQcm90ZWN0aW9uVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMva2V5c3RvcmUvc3JjL2FuZHJvaWQva2V5c3RvcmUvY3RzL0tleVByb3RlY3Rpb25UZXN0LmphdmEKaW5kZXggMjM5MjI0OS4uYjA5Njg1YSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMva2V5c3RvcmUvc3JjL2FuZHJvaWQva2V5c3RvcmUvY3RzL0tleVByb3RlY3Rpb25UZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMva2V5c3RvcmUvc3JjL2FuZHJvaWQva2V5c3RvcmUvY3RzL0tleVByb3RlY3Rpb25UZXN0LmphdmEKQEAgLTQ5LDYgKzQ5LDcgQEAKICAgICAgICAgYXNzZXJ0RmFsc2Uoc3BlYy5pc1VzZXJBdXRoZW50aWNhdGlvblJlcXVpcmVkKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIHNwZWMuZ2V0VXNlckF1dGhlbnRpY2F0aW9uVmFsaWRpdHlEdXJhdGlvblNlY29uZHMoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhHYXRlS2VlcGVyLklOVkFMSURfU0VDVVJFX1VTRVJfSUQsIHNwZWMuZ2V0Qm91bmRUb1NwZWNpZmljU2VjdXJlVXNlcklkKCkpOworICAgICAgICBhc3NlcnRGYWxzZShzcGVjLmlzVW5sb2NrZWREZXZpY2VSZXF1aXJlZCgpKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0dGVyc1JlZmxlY3RlZEluR2V0dGVycygpIHsKQEAgLTczLDYgKzc0LDcgQEAKICAgICAgICAgICAgICAgICAuc2V0VXNlckF1dGhlbnRpY2F0aW9uUmVxdWlyZWQodHJ1ZSkKICAgICAgICAgICAgICAgICAuc2V0VXNlckF1dGhlbnRpY2F0aW9uVmFsaWRpdHlEdXJhdGlvblNlY29uZHMoMTIzNDU2KQogICAgICAgICAgICAgICAgIC5zZXRCb3VuZFRvU3BlY2lmaWNTZWN1cmVVc2VySWQoNjU0MzIxKQorICAgICAgICAgICAgICAgIC5zZXRVbmxvY2tlZERldmljZVJlcXVpcmVkKHRydWUpCiAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CiAKICAgICAgICAgYXNzZXJ0RXF1YWxzKApAQCAtOTMsNiArOTUsNyBAQAogICAgICAgICBhc3NlcnRUcnVlKHNwZWMuaXNVc2VyQXV0aGVudGljYXRpb25SZXF1aXJlZCgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEyMzQ1Niwgc3BlYy5nZXRVc2VyQXV0aGVudGljYXRpb25WYWxpZGl0eUR1cmF0aW9uU2Vjb25kcygpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDY1NDMyMSwgc3BlYy5nZXRCb3VuZFRvU3BlY2lmaWNTZWN1cmVVc2VySWQoKSk7CisgICAgICAgIGFzc2VydFRydWUoc3BlYy5pc1VubG9ja2VkRGV2aWNlUmVxdWlyZWQoKSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdFNldEtleVZhbGlkaXR5RW5kRGF0ZUFwcGxpZXNUb0JvdGhFbmREYXRlcygpIHsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2tleXN0b3JlL3NyYy9hbmRyb2lkL2tleXN0b3JlL2N0cy9LZXlTdG9yZVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2tleXN0b3JlL3NyYy9hbmRyb2lkL2tleXN0b3JlL2N0cy9LZXlTdG9yZVRlc3QuamF2YQppbmRleCA2MTdmZmNhLi5mZWYzNDg2IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9rZXlzdG9yZS9zcmMvYW5kcm9pZC9rZXlzdG9yZS9jdHMvS2V5U3RvcmVUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMva2V5c3RvcmUvc3JjL2FuZHJvaWQva2V5c3RvcmUvY3RzL0tleVN0b3JlVGVzdC5qYXZhCkBAIC00MSw2ICs0MSw4IEBACiBpbXBvcnQgamF2YS5zZWN1cml0eS5VbnJlY292ZXJhYmxlS2V5RXhjZXB0aW9uOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZTsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlOworaW1wb3J0IGphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcy5SU0FQcml2YXRlS2V5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcy5SU0FQcml2YXRlQ3J0S2V5OwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CkBAIC0xNjgzLDggKzE2ODUsMTUgQEAKICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuZ2V0S2V5KGFsaWFzLCBudWxsKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsLmdldEtleShhbGlhcywgbnVsbCkpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuZ2V0S2V5KGFsaWFzLCBQQVNTV09SRF9LRVkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWwuZ2V0S2V5KGFsaWFzLCBQQVNTV09SRF9LRVkpKTsKKyAgICAgICAgICAgICAgICBLZXkgYWN0dWFsS2V5ID0gYWN0dWFsLmdldEtleShhbGlhcywgUEFTU1dPUkRfS0VZKTsKKyAgICAgICAgICAgICAgICBLZXkgZXhwZWN0ZWRLZXkgPSBleHBlY3RlZC5nZXRLZXkoYWxpYXMsIFBBU1NXT1JEX0tFWSk7CisgICAgICAgICAgICAgICAgaWYgKGFjdHVhbEtleSBpbnN0YW5jZW9mIFJTQVByaXZhdGVLZXkgJiYKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRLZXkgaW5zdGFuY2VvZiBSU0FQcml2YXRlS2V5KSB7CisgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoKChSU0FQcml2YXRlS2V5KWFjdHVhbEtleSkuZ2V0TW9kdWx1cygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUlNBUHJpdmF0ZUtleSlleHBlY3RlZEtleSkuZ2V0TW9kdWx1cygpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGFjdHVhbEtleSwgZXhwZWN0ZWRLZXkpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZC5nZXRDZXJ0aWZpY2F0ZShhbGlhcyksIGFjdHVhbC5nZXRDZXJ0aWZpY2F0ZShhbGlhcykpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9rZXlzdG9yZS9zcmMvYW5kcm9pZC9rZXlzdG9yZS9jdHMvU2VjcmV0S2V5RmFjdG9yeVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2tleXN0b3JlL3NyYy9hbmRyb2lkL2tleXN0b3JlL2N0cy9TZWNyZXRLZXlGYWN0b3J5VGVzdC5qYXZhCmluZGV4IDAyYzJjZjYuLjcwNTgxZTEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2tleXN0b3JlL3NyYy9hbmRyb2lkL2tleXN0b3JlL2N0cy9TZWNyZXRLZXlGYWN0b3J5VGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2tleXN0b3JlL3NyYy9hbmRyb2lkL2tleXN0b3JlL2N0cy9TZWNyZXRLZXlGYWN0b3J5VGVzdC5qYXZhCkBAIC0yMSw2ICsyMSw4IEBACiBpbXBvcnQgYW5kcm9pZC5zZWN1cml0eS5rZXlzdG9yZS5LZXlQcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQudGVzdC5Nb3JlQXNzZXJ0czsKIAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuT2JqZWN0QXJyYXlzOworCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCiBpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkS2V5RXhjZXB0aW9uOwpAQCAtNDQsNyArNDYsNyBAQAogcHVibGljIGNsYXNzIFNlY3JldEtleUZhY3RvcnlUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBFQ1RFRF9QUk9WSURFUl9OQU1FID0gVGVzdFV0aWxzLkVYUEVDVEVEX1BST1ZJREVSX05BTUU7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFWFBFQ1RFRF9BTEdPUklUSE1TID0geworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIEVYUEVDVEVEX0FMR09SSVRITVMgPSB7CiAgICAgICAgICJBRVMiLAogICAgICAgICAiSG1hY1NIQTEiLAogICAgICAgICAiSG1hY1NIQTIyNCIsCkBAIC01Myw2ICs1NSwxMiBAQAogICAgICAgICAiSG1hY1NIQTUxMiIsCiAgICAgfTsKIAorICAgIHsKKyAgICAgICAgaWYgKFRlc3RVdGlscy5zdXBwb3J0czNERVMoKSkgeworICAgICAgICAgICAgRVhQRUNURURfQUxHT1JJVEhNUyA9IE9iamVjdEFycmF5cy5jb25jYXQoRVhQRUNURURfQUxHT1JJVEhNUywgIkRFU2VkZSIpOworICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgdGVzdEFsZ29yaXRobUxpc3QoKSB7CiAgICAgICAgIC8vIEFzc2VydCB0aGF0IEFuZHJvaWQgS2V5c3RvcmUgUHJvdmlkZXIgZXhwb3NlcyBleGFjdGx5IHRoZSBleHBlY3RlZCBTZWNyZXRLZXlGYWN0b3J5CiAgICAgICAgIC8vIGFsZ29yaXRobXMuIFdlIGRvbid0IGNhcmUgd2hldGhlciB0aGUgYWxnb3JpdGhtcyBhcmUgZXhwb3NlZCB2aWEgYWxpYXNlcywgYXMgbG9uZyBhcwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMva2V5c3RvcmUvc3JjL2FuZHJvaWQva2V5c3RvcmUvY3RzL1Rlc3RVdGlscy5qYXZhIGIvdGVzdHMvdGVzdHMva2V5c3RvcmUvc3JjL2FuZHJvaWQva2V5c3RvcmUvY3RzL1Rlc3RVdGlscy5qYXZhCmluZGV4IDE2NDJlNWMuLmQ0OGM2NDQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2tleXN0b3JlL3NyYy9hbmRyb2lkL2tleXN0b3JlL2N0cy9UZXN0VXRpbHMuamF2YQorKysgYi90ZXN0cy90ZXN0cy9rZXlzdG9yZS9zcmMvYW5kcm9pZC9rZXlzdG9yZS9jdHMvVGVzdFV0aWxzLmphdmEKQEAgLTE3LDYgKzE3LDggQEAKIHBhY2thZ2UgYW5kcm9pZC5rZXlzdG9yZS5jdHM7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQuc2VjdXJpdHkua2V5c3RvcmUuS2V5R2VuUGFyYW1ldGVyU3BlYzsKIGltcG9ydCBhbmRyb2lkLnNlY3VyaXR5LmtleXN0b3JlLktleUluZm87CiBpbXBvcnQgYW5kcm9pZC5zZWN1cml0eS5rZXlzdG9yZS5LZXlQcm9wZXJ0aWVzOwpAQCAtMzcsNiArMzksNyBAQAogaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoUHJvdmlkZXJFeGNlcHRpb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2YXRlS2V5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJvdmlkZXJFeGNlcHRpb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5QdWJsaWNLZXk7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5VbnJlY292ZXJhYmxlRW50cnlFeGNlcHRpb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlOwpAQCAtNzQsNiArNzcsMjIgQEAKICAgICBwcml2YXRlIFRlc3RVdGlscygpIHt9CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgM0RFUyBLZXlTdG9yZSB0ZXN0cyBzaG91bGQgcnVuIG9uIHRoaXMgZGV2aWNlLiAzREVTIHN1cHBvcnQgd2FzIGFkZGVkIGluCisgICAgICogS2V5TWFzdGVyIDQuMCBhbmQgdGhlcmUgc2hvdWxkIGJlIG5vIHNvZnR3YXJlIGZhbGxiYWNrIG9uIGVhcmxpZXIgS2V5TWFzdGVyIHZlcnNpb25zLgorICAgICAqLworICAgIHN0YXRpYyBib29sZWFuIHN1cHBvcnRzM0RFUygpIHsKKyAgICAgICAgcmV0dXJuICJ0cnVlIi5lcXVhbHMoU3lzdGVtUHJvcGVydGllcy5nZXQoInJvLmhhcmR3YXJlLmtleXN0b3JlX2Rlc2VkZSIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGRldmljZSBoYXMgYSBTdHJvbmdCb3ggYmFja2VkIEtleVN0b3JlLgorICAgICAqLworICAgIHN0YXRpYyBib29sZWFuIGhhc1N0cm9uZ0JveChDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKQorICAgICAgICAgICAgLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9TVFJPTkdCT1hfS0VZU1RPUkUpOworICAgIH0KKworICAgIC8qKgogICAgICAqIEFzc2VydHMgdGhlIHRoZSBrZXkgYWxnb3JpdGhtIGFuZCBhbGdvcml0aG0tc3BlY2lmaWMgcGFyYW1ldGVycyBvZiB0aGUgdHdvIGtleXMgaW4gdGhlCiAgICAgICogcHJvdmlkZWQgcGFpciBtYXRjaC4KICAgICAgKi8KQEAgLTYyMyw2ICs2NDIsOCBAQAogICAgICAgICBTdHJpbmcgdHJhbnNmb3JtYXRpb25VcHBlckNhc2UgPSB0cmFuc2Zvcm1hdGlvbi50b1VwcGVyQ2FzZShMb2NhbGUuVVMpOwogICAgICAgICBpZiAodHJhbnNmb3JtYXRpb25VcHBlckNhc2Uuc3RhcnRzV2l0aCgiQUVTLyIpKSB7CiAgICAgICAgICAgICByZXR1cm4gS2V5UHJvcGVydGllcy5LRVlfQUxHT1JJVEhNX0FFUzsKKyAgICAgICAgfSBlbHNlIGlmICh0cmFuc2Zvcm1hdGlvblVwcGVyQ2FzZS5zdGFydHNXaXRoKCJERVNFREUvIikpIHsKKyAgICAgICAgICAgIHJldHVybiBLZXlQcm9wZXJ0aWVzLktFWV9BTEdPUklUSE1fM0RFUzsKICAgICAgICAgfSBlbHNlIGlmICh0cmFuc2Zvcm1hdGlvblVwcGVyQ2FzZS5zdGFydHNXaXRoKCJSU0EvIikpIHsKICAgICAgICAgICAgIHJldHVybiBLZXlQcm9wZXJ0aWVzLktFWV9BTEdPUklUSE1fUlNBOwogICAgICAgICB9IGVsc2UgewpAQCAtNjMyLDEyICs2NTMsMTMgQEAKIAogICAgIHN0YXRpYyBib29sZWFuIGlzQ2lwaGVyU3ltbWV0cmljKFN0cmluZyB0cmFuc2Zvcm1hdGlvbikgewogICAgICAgICBTdHJpbmcgdHJhbnNmb3JtYXRpb25VcHBlckNhc2UgPSB0cmFuc2Zvcm1hdGlvbi50b1VwcGVyQ2FzZShMb2NhbGUuVVMpOwotICAgICAgICBpZiAodHJhbnNmb3JtYXRpb25VcHBlckNhc2Uuc3RhcnRzV2l0aCgiQUVTLyIpKSB7CisgICAgICAgIGlmICh0cmFuc2Zvcm1hdGlvblVwcGVyQ2FzZS5zdGFydHNXaXRoKCJBRVMvIikgfHwgdHJhbnNmb3JtYXRpb25VcHBlckNhc2Uuc3RhcnRzV2l0aCgKKyAgICAgICAgICAgICAgICAiREVTRURFLyIpKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfSBlbHNlIGlmICh0cmFuc2Zvcm1hdGlvblVwcGVyQ2FzZS5zdGFydHNXaXRoKCJSU0EvIikpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuc3VwcG9ydGVkIHRyYW5zZm9ybWF0aW9uOiAiICsgdHJhbnNmb3JtYXRpb24pOworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiWVlaOiBVbnN1cHBvcnRlZCB0cmFuc2Zvcm1hdGlvbjogIiArIHRyYW5zZm9ybWF0aW9uKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNzYxLDcgKzc4Myw4IEBACiAKICAgICBzdGF0aWMgaW50IGdldE1heFN1cHBvcnRlZFBsYWludGV4dElucHV0U2l6ZUJ5dGVzKFN0cmluZyB0cmFuc2Zvcm1hdGlvbiwgS2V5IGtleSkgewogICAgICAgICBTdHJpbmcga2V5QWxnb3JpdGhtID0gZ2V0Q2lwaGVyS2V5QWxnb3JpdGhtKHRyYW5zZm9ybWF0aW9uKTsKLSAgICAgICAgaWYgKEtleVByb3BlcnRpZXMuS0VZX0FMR09SSVRITV9BRVMuZXF1YWxzSWdub3JlQ2FzZShrZXlBbGdvcml0aG0pKSB7CisgICAgICAgIGlmIChLZXlQcm9wZXJ0aWVzLktFWV9BTEdPUklUSE1fQUVTLmVxdWFsc0lnbm9yZUNhc2Uoa2V5QWxnb3JpdGhtKQorICAgICAgICAgICAgICAgIHx8IEtleVByb3BlcnRpZXMuS0VZX0FMR09SSVRITV8zREVTLmVxdWFsc0lnbm9yZUNhc2Uoa2V5QWxnb3JpdGhtKSkgewogICAgICAgICAgICAgcmV0dXJuIEludGVnZXIuTUFYX1ZBTFVFOwogICAgICAgICB9IGVsc2UgaWYgKEtleVByb3BlcnRpZXMuS0VZX0FMR09SSVRITV9SU0EuZXF1YWxzSWdub3JlQ2FzZShrZXlBbGdvcml0aG0pKSB7CiAgICAgICAgICAgICBTdHJpbmcgZW5jcnlwdGlvblBhZGRpbmcgPSBnZXRDaXBoZXJFbmNyeXB0aW9uUGFkZGluZyh0cmFuc2Zvcm1hdGlvbik7CkBAIC04NjYsOCArODg5LDE2IEBACiAKICAgICBzdGF0aWMgS2V5UHJvdGVjdGlvbiBnZXRNaW5pbWFsV29ya2luZ0ltcG9ydFBhcmFtZXRlcnNGb3JDaXBoZXJpbmdXaXRoKAogICAgICAgICAgICAgU3RyaW5nIHRyYW5zZm9ybWF0aW9uLCBpbnQgcHVycG9zZXMsIGJvb2xlYW4gaXZQcm92aWRlZFdoZW5FbmNyeXB0aW5nKSB7CisgICAgICAgIHJldHVybiBnZXRNaW5pbWFsV29ya2luZ0ltcG9ydFBhcmFtZXRlcnNGb3JDaXBoZXJpbmdXaXRoKHRyYW5zZm9ybWF0aW9uLCBwdXJwb3NlcywKKyAgICAgICAgICAgIGl2UHJvdmlkZWRXaGVuRW5jcnlwdGluZywgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBzdGF0aWMgS2V5UHJvdGVjdGlvbiBnZXRNaW5pbWFsV29ya2luZ0ltcG9ydFBhcmFtZXRlcnNGb3JDaXBoZXJpbmdXaXRoKAorICAgICAgICAgICAgU3RyaW5nIHRyYW5zZm9ybWF0aW9uLCBpbnQgcHVycG9zZXMsIGJvb2xlYW4gaXZQcm92aWRlZFdoZW5FbmNyeXB0aW5nLAorICAgICAgICAgICAgYm9vbGVhbiBpc1VubG9ja2VkRGV2aWNlUmVxdWlyZWQsIGJvb2xlYW4gaXNVc2VyQXV0aFJlcXVpcmVkKSB7CiAgICAgICAgIFN0cmluZyBrZXlBbGdvcml0aG0gPSBUZXN0VXRpbHMuZ2V0Q2lwaGVyS2V5QWxnb3JpdGhtKHRyYW5zZm9ybWF0aW9uKTsKLSAgICAgICAgaWYgKEtleVByb3BlcnRpZXMuS0VZX0FMR09SSVRITV9BRVMuZXF1YWxzSWdub3JlQ2FzZShrZXlBbGdvcml0aG0pKSB7CisgICAgICAgIGlmIChLZXlQcm9wZXJ0aWVzLktFWV9BTEdPUklUSE1fQUVTLmVxdWFsc0lnbm9yZUNhc2Uoa2V5QWxnb3JpdGhtKQorICAgICAgICAgICAgfHwgS2V5UHJvcGVydGllcy5LRVlfQUxHT1JJVEhNXzNERVMuZXF1YWxzSWdub3JlQ2FzZShrZXlBbGdvcml0aG0pKSB7CiAgICAgICAgICAgICBTdHJpbmcgZW5jcnlwdGlvblBhZGRpbmcgPSBUZXN0VXRpbHMuZ2V0Q2lwaGVyRW5jcnlwdGlvblBhZGRpbmcodHJhbnNmb3JtYXRpb24pOwogICAgICAgICAgICAgU3RyaW5nIGJsb2NrTW9kZSA9IFRlc3RVdGlscy5nZXRDaXBoZXJCbG9ja01vZGUodHJhbnNmb3JtYXRpb24pOwogICAgICAgICAgICAgYm9vbGVhbiByYW5kb21pemVkRW5jcnlwdGlvblJlcXVpcmVkID0gdHJ1ZTsKQEAgLTg4Miw2ICs5MTMsOSBAQAogICAgICAgICAgICAgICAgICAgICAuc2V0QmxvY2tNb2RlcyhibG9ja01vZGUpCiAgICAgICAgICAgICAgICAgICAgIC5zZXRFbmNyeXB0aW9uUGFkZGluZ3MoZW5jcnlwdGlvblBhZGRpbmcpCiAgICAgICAgICAgICAgICAgICAgIC5zZXRSYW5kb21pemVkRW5jcnlwdGlvblJlcXVpcmVkKHJhbmRvbWl6ZWRFbmNyeXB0aW9uUmVxdWlyZWQpCisgICAgICAgICAgICAgICAgICAgIC5zZXRVbmxvY2tlZERldmljZVJlcXVpcmVkKGlzVW5sb2NrZWREZXZpY2VSZXF1aXJlZCkKKyAgICAgICAgICAgICAgICAgICAgLnNldFVzZXJBdXRoZW50aWNhdGlvblJlcXVpcmVkKGlzVXNlckF1dGhSZXF1aXJlZCkKKyAgICAgICAgICAgICAgICAgICAgLnNldFVzZXJBdXRoZW50aWNhdGlvblZhbGlkaXR5RHVyYXRpb25TZWNvbmRzKDM2MDApCiAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwogICAgICAgICB9IGVsc2UgaWYgKEtleVByb3BlcnRpZXMuS0VZX0FMR09SSVRITV9SU0EuZXF1YWxzSWdub3JlQ2FzZShrZXlBbGdvcml0aG0pKSB7CiAgICAgICAgICAgICBTdHJpbmcgZGlnZXN0ID0gVGVzdFV0aWxzLmdldENpcGhlckRpZ2VzdCh0cmFuc2Zvcm1hdGlvbik7CkBAIC04OTMsNiArOTI3LDkgQEAKICAgICAgICAgICAgICAgICAgICAgLnNldERpZ2VzdHMoKGRpZ2VzdCAhPSBudWxsKSA/IG5ldyBTdHJpbmdbXSB7ZGlnZXN0fSA6IEVtcHR5QXJyYXkuU1RSSU5HKQogICAgICAgICAgICAgICAgICAgICAuc2V0RW5jcnlwdGlvblBhZGRpbmdzKGVuY3J5cHRpb25QYWRkaW5nKQogICAgICAgICAgICAgICAgICAgICAuc2V0UmFuZG9taXplZEVuY3J5cHRpb25SZXF1aXJlZChyYW5kb21pemVkRW5jcnlwdGlvblJlcXVpcmVkKQorICAgICAgICAgICAgICAgICAgICAuc2V0VXNlckF1dGhlbnRpY2F0aW9uUmVxdWlyZWQoaXNVc2VyQXV0aFJlcXVpcmVkKQorICAgICAgICAgICAgICAgICAgICAuc2V0VXNlckF1dGhlbnRpY2F0aW9uVmFsaWRpdHlEdXJhdGlvblNlY29uZHMoMzYwMCkKKyAgICAgICAgICAgICAgICAgICAgLnNldFVubG9ja2VkRGV2aWNlUmVxdWlyZWQoaXNVbmxvY2tlZERldmljZVJlcXVpcmVkKQogICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuc3VwcG9ydGVkIGtleSBhbGdvcml0aG06ICIgKyBrZXlBbGdvcml0aG0pOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMva2V5c3RvcmUvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5QW5kV2luZG93TWFuYWdlcnNTdGF0ZS5qYXZhIGIvdGVzdHMvdGVzdHMva2V5c3RvcmUvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5QW5kV2luZG93TWFuYWdlcnNTdGF0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNzY5Y2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9rZXlzdG9yZS9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlBbmRXaW5kb3dNYW5hZ2Vyc1N0YXRlLmphdmEKQEAgLTAsMCArMSw1NjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW07CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyLlN0YWNrSWQuSU5WQUxJRF9TVEFDS19JRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuV2luZG93Q29uZmlndXJhdGlvbi5BQ1RJVklUWV9UWVBFX1VOREVGSU5FRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuV2luZG93Q29uZmlndXJhdGlvbi5XSU5ET1dJTkdfTU9ERV9GUkVFRk9STTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuV2luZG93Q29uZmlndXJhdGlvbi5XSU5ET1dJTkdfTU9ERV9QSU5ORUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLldpbmRvd0NvbmZpZ3VyYXRpb24uV0lORE9XSU5HX01PREVfU1BMSVRfU0NSRUVOX1BSSU1BUlk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLldpbmRvd0NvbmZpZ3VyYXRpb24uV0lORE9XSU5HX01PREVfVU5ERUZJTkVEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQucG0uQWN0aXZpdHlJbmZvLlJFU0laRV9NT0RFX1JFU0laRUFCTEU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudE5hbWVVdGlscy5nZXRBY3Rpdml0eU5hbWU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLkNvbXBvbmVudE5hbWVVdGlscy5nZXRXaW5kb3dOYW1lOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5TdGF0ZUxvZ2dlci5sb2c7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLlN0YXRlTG9nZ2VyLmxvZ0Fsd2F5czsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uU3RhdGVMb2dnZXIubG9nRTsKKworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuZ3JlYXRlclRoYW47CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5sZXNzVGhhbjsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnNlcnZlci5hbS5BY3Rpdml0eU1hbmFnZXJTdGF0ZS5BY3Rpdml0eVN0YWNrOworaW1wb3J0IGFuZHJvaWQuc2VydmVyLmFtLkFjdGl2aXR5TWFuYWdlclN0YXRlLkFjdGl2aXR5VGFzazsKK2ltcG9ydCBhbmRyb2lkLnNlcnZlci5hbS5XaW5kb3dNYW5hZ2VyU3RhdGUuV2luZG93U3RhY2s7CitpbXBvcnQgYW5kcm9pZC5zZXJ2ZXIuYW0uV2luZG93TWFuYWdlclN0YXRlLldpbmRvd1N0YXRlOworaW1wb3J0IGFuZHJvaWQuc2VydmVyLmFtLldpbmRvd01hbmFnZXJTdGF0ZS5XaW5kb3dUYXNrOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5CaVByZWRpY2F0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQm9vbGVhblN1cHBsaWVyOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU7CisKKy8qKgorICogQ29tYmluZWQgc3RhdGUgb2YgdGhlIGFjdGl2aXR5IG1hbmFnZXIgYW5kIHdpbmRvdyBtYW5hZ2VyLgorICovCitwdWJsaWMgY2xhc3MgQWN0aXZpdHlBbmRXaW5kb3dNYW5hZ2Vyc1N0YXRlIHsKKworICAgIC8vIENsb25lIG9mIGFuZHJvaWQgRGlzcGxheU1ldHJpY3MuREVOU0lUWV9ERUZBVUxUIChERU5TSVRZX01FRElVTSkKKyAgICAvLyAoTmVlZGVkIGluIGhvc3Qtc2lkZSB0ZXN0cyB0byBjb252ZXJ0IGRwIHRvIHB4LikKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElTUExBWV9ERU5TSVRZX0RFRkFVTFQgPSAxNjA7CisKKyAgICAvLyBEZWZhdWx0IG1pbmltYWwgc2l6ZSBvZiByZXNpemFibGUgdGFzaywgdXNlZCBpZiBub25lIGlzIHNldCBleHBsaWNpdGx5LgorICAgIC8vIE11c3QgYmUga2VwdCBpbiBzeW5jIHdpdGggJ2RlZmF1bHRfbWluaW1hbF9zaXplX3Jlc2l6YWJsZV90YXNrJyBkaW1lbiBmcm9tIGZyYW1ld29ya3MvYmFzZS4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9SRVNJWkFCTEVfVEFTS19TSVpFX0RQID0gMjIwOworCisgICAgLy8gRGVmYXVsdCBtaW5pbWFsIHNpemUgb2YgYSByZXNpemFibGUgUGlQIHRhc2ssIHVzZWQgaWYgbm9uZSBpcyBzZXQgZXhwbGljaXRseS4KKyAgICAvLyBNdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoICdkZWZhdWx0X21pbmltYWxfc2l6ZV9waXBfcmVzaXphYmxlX3Rhc2snIGRpbWVuIGZyb20KKyAgICAvLyBmcmFtZXdvcmtzL2Jhc2UuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfUElQX1JFU0laQUJMRV9UQVNLX1NJWkVfRFAgPSAxMDg7CisKKyAgICBwcml2YXRlIEFjdGl2aXR5TWFuYWdlclN0YXRlIG1BbVN0YXRlID0gbmV3IEFjdGl2aXR5TWFuYWdlclN0YXRlKCk7CisgICAgcHJpdmF0ZSBXaW5kb3dNYW5hZ2VyU3RhdGUgbVdtU3RhdGUgPSBuZXcgV2luZG93TWFuYWdlclN0YXRlKCk7CisKKyAgICAvKioKKyAgICAgKiBDb21wdXRlIEFNIGFuZCBXTSBzdGF0ZSBvZiBkZXZpY2UsIGNoZWNrIHNhbml0eSBhbmQgYm91bmRzLgorICAgICAqIFdNIHN0YXRlIHdpbGwgaW5jbHVkZSBvbmx5IHZpc2libGUgd2luZG93cywgc3RhY2sgYW5kIHRhc2sgYm91bmRzIHdpbGwgYmUgY29tcGFyZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd2FpdEZvckFjdGl2aXRpZXNWaXNpYmxlIGFycmF5IG9mIGFjdGl2aXR5IG5hbWVzIHRvIHdhaXQgZm9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvbXB1dGVTdGF0ZShXYWl0Rm9yVmFsaWRBY3Rpdml0eVN0YXRlLi4uIHdhaXRGb3JBY3Rpdml0aWVzVmlzaWJsZSkgeworICAgICAgICB3YWl0Rm9yVmFsaWRTdGF0ZSh0cnVlIC8qIGNvbXBhcmVUYXNrQW5kU3RhY2tCb3VuZHMgKi8sIHdhaXRGb3JBY3Rpdml0aWVzVmlzaWJsZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcHV0ZSBBTSBhbmQgV00gc3RhdGUgb2YgZGV2aWNlLCBjaGVjayBzYW5pdHkgYW5kIGJvdW5kcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb21wYXJlVGFza0FuZFN0YWNrQm91bmRzIHBhc3MgJ3RydWUnIGlmIHN0YWNrIGFuZCB0YXNrIGJvdW5kcyBzaG91bGQgYmUgY29tcGFyZWQsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZhbHNlJyBvdGhlcndpc2UuCisgICAgICogQHBhcmFtIHdhaXRGb3JBY3Rpdml0aWVzVmlzaWJsZSAgYXJyYXkgb2YgYWN0aXZpdHkgc3RhdGVzIHRvIHdhaXQgZm9yLgorICAgICAqLworICAgIHZvaWQgY29tcHV0ZVN0YXRlKGJvb2xlYW4gY29tcGFyZVRhc2tBbmRTdGFja0JvdW5kcywKKyAgICAgICAgICAgIFdhaXRGb3JWYWxpZEFjdGl2aXR5U3RhdGUuLi4gd2FpdEZvckFjdGl2aXRpZXNWaXNpYmxlKSB7CisgICAgICAgIHdhaXRGb3JWYWxpZFN0YXRlKGNvbXBhcmVUYXNrQW5kU3RhY2tCb3VuZHMsIHdhaXRGb3JBY3Rpdml0aWVzVmlzaWJsZSk7CisgICAgfQorCisgICAgLyoqIFdhaXQgZm9yIHRoZSBhY3Rpdml0eSB0byBhcHBlYXIgYW5kIGZvciB2YWxpZCBzdGF0ZSBpbiBBTSBhbmQgV00uICovCisgICAgdm9pZCB3YWl0Rm9yVmFsaWRTdGF0ZShXYWl0Rm9yVmFsaWRBY3Rpdml0eVN0YXRlLi4uIHdhaXRGb3JBY3Rpdml0eVZpc2libGUpIHsKKyAgICAgICAgd2FpdEZvclZhbGlkU3RhdGUoZmFsc2UgLyogY29tcGFyZVRhc2tBbmRTdGFja0JvdW5kcyAqLywgd2FpdEZvckFjdGl2aXR5VmlzaWJsZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2FpdCBmb3IgdGhlIGFjdGl2aXRpZXMgdG8gYXBwZWFyIGluIHByb3BlciBzdGFja3MgYW5kIGZvciB2YWxpZCBzdGF0ZSBpbiBBTSBhbmQgV00uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29tcGFyZVRhc2tBbmRTdGFja0JvdW5kcyBmbGFnIGluZGljYXRpbmcgaWYgd2Ugc2hvdWxkIGNvbXBhcmUgdGFzayBhbmQgc3RhY2sgYm91bmRzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGVxdWFsaXR5LgorICAgICAqIEBwYXJhbSB3YWl0Rm9yQWN0aXZpdGllc1Zpc2libGUgIGFycmF5IG9mIGFjdGl2aXR5IHN0YXRlcyB0byB3YWl0IGZvci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgd2FpdEZvclZhbGlkU3RhdGUoYm9vbGVhbiBjb21wYXJlVGFza0FuZFN0YWNrQm91bmRzLAorICAgICAgICAgICAgV2FpdEZvclZhbGlkQWN0aXZpdHlTdGF0ZS4uLiB3YWl0Rm9yQWN0aXZpdGllc1Zpc2libGUpIHsKKyAgICAgICAgZm9yIChpbnQgcmV0cnkgPSAxOyByZXRyeSA8PSA1OyByZXRyeSsrKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBHZXQgc3RhdGUgb2YgQU0gYW5kIFdNIGF0IHRoZSBzYW1lIHRpbWUgdG8gYXZvaWQgbWlzbWF0Y2hlcyBjYXVzZWQgYnkKKyAgICAgICAgICAgIC8vIHJlcXVlc3RpbmcgZHVtcCBpbiBzb21lIGludGVybWVkaWF0ZSBzdGF0ZS4KKyAgICAgICAgICAgIG1BbVN0YXRlLmNvbXB1dGVTdGF0ZSgpOworICAgICAgICAgICAgbVdtU3RhdGUuY29tcHV0ZVN0YXRlKCk7CisgICAgICAgICAgICBpZiAoc2hvdWxkV2FpdEZvclNhbml0eUNoZWNrKGNvbXBhcmVUYXNrQW5kU3RhY2tCb3VuZHMpCisgICAgICAgICAgICAgICAgICAgIHx8IHNob3VsZFdhaXRGb3JWYWxpZFN0YWNrcyhjb21wYXJlVGFza0FuZFN0YWNrQm91bmRzKQorICAgICAgICAgICAgICAgICAgICB8fCBzaG91bGRXYWl0Rm9yQWN0aXZpdGllcyh3YWl0Rm9yQWN0aXZpdGllc1Zpc2libGUpCisgICAgICAgICAgICAgICAgICAgIHx8IHNob3VsZFdhaXRGb3JXaW5kb3dzKCkpIHsKKyAgICAgICAgICAgICAgICBsb2dBbHdheXMoIioqKldhaXRpbmcgZm9yIHZhbGlkIHN0YWNrcyBhbmQgYWN0aXZpdGllcyBzdGF0ZXMuLi4gcmV0cnk9IiArIHJldHJ5KTsKKyAgICAgICAgICAgICAgICBTeXN0ZW1DbG9jay5zbGVlcCgxMDAwKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGxvZ0UoIioqKldhaXRpbmcgZm9yIHN0YXRlcyBmYWlsZWQ6ICIgKyBBcnJheXMudG9TdHJpbmcod2FpdEZvckFjdGl2aXRpZXNWaXNpYmxlKSk7CisgICAgfQorCisgICAgYm9vbGVhbiB3YWl0Rm9ySG9tZUFjdGl2aXR5VmlzaWJsZSgpIHsKKyAgICAgICAgQ29tcG9uZW50TmFtZSBob21lQWN0aXZpdHkgPSBtQW1TdGF0ZS5nZXRIb21lQWN0aXZpdHlOYW1lKCk7CisgICAgICAgIC8vIFNvbWV0aW1lcyB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBiZWZvcmUgd2Uga25vdyB3aGF0IEhvbWUgQWN0aXZpdHkgaXMKKyAgICAgICAgaWYgKGhvbWVBY3Rpdml0eSA9PSBudWxsKSB7CisgICAgICAgICAgICBsb2coIkNvbXB1dGluZyBzdGF0ZSB0byBkZXRlcm1pbmUgSG9tZSBBY3Rpdml0eSIpOworICAgICAgICAgICAgY29tcHV0ZVN0YXRlKHRydWUpOworICAgICAgICAgICAgaG9tZUFjdGl2aXR5ID0gbUFtU3RhdGUuZ2V0SG9tZUFjdGl2aXR5TmFtZSgpOworICAgICAgICB9CisgICAgICAgIGFzc2VydE5vdE51bGwoImhvbWVBY3Rpdml0eSBzaG91bGQgbm90IGJlIG51bGwiLCBob21lQWN0aXZpdHkpOworICAgICAgICB3YWl0Rm9yVmFsaWRTdGF0ZShuZXcgV2FpdEZvclZhbGlkQWN0aXZpdHlTdGF0ZShob21lQWN0aXZpdHkpKTsKKyAgICAgICAgcmV0dXJuIG1BbVN0YXRlLmlzSG9tZUFjdGl2aXR5VmlzaWJsZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdhaXRGb3JLZXlndWFyZFNob3dpbmdBbmROb3RPY2NsdWRlZCgpIHsKKyAgICAgICAgd2FpdEZvcldpdGhBbVN0YXRlKHN0YXRlIC0+IHN0YXRlLmdldEtleWd1YXJkQ29udHJvbGxlclN0YXRlKCkua2V5Z3VhcmRTaG93aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAhc3RhdGUuZ2V0S2V5Z3VhcmRDb250cm9sbGVyU3RhdGUoKS5rZXlndWFyZE9jY2x1ZGVkLAorICAgICAgICAgICAgICAgICIqKipXYWl0aW5nIGZvciBLZXlndWFyZCBzaG93aW5nLi4uIik7CisgICAgfQorCisgICAgQERlcHJlY2F0ZWQKKyAgICB2b2lkIHdhaXRGb3JGb2N1c2VkU3RhY2soaW50IHN0YWNrSWQpIHsKKyAgICAgICAgd2FpdEZvcldpdGhBbVN0YXRlKHN0YXRlIC0+IHN0YXRlLmdldEZvY3VzZWRTdGFja0lkKCkgPT0gc3RhY2tJZCwKKyAgICAgICAgICAgICAgICAiKioqV2FpdGluZyBmb3IgZm9jdXNlZCBzdGFjay4uLiIpOworICAgIH0KKworICAgIHZvaWQgd2FpdEZvcldpdGhBbVN0YXRlKFByZWRpY2F0ZTxBY3Rpdml0eU1hbmFnZXJTdGF0ZT4gd2FpdENvbmRpdGlvbiwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgd2FpdEZvcigoYW1TdGF0ZSwgd21TdGF0ZSkgLT4gd2FpdENvbmRpdGlvbi50ZXN0KGFtU3RhdGUpLCBtZXNzYWdlKTsKKyAgICB9CisKKyAgICB2b2lkIHdhaXRGb3IoCisgICAgICAgICAgICBCaVByZWRpY2F0ZTxBY3Rpdml0eU1hbmFnZXJTdGF0ZSwgV2luZG93TWFuYWdlclN0YXRlPiB3YWl0Q29uZGl0aW9uLCBTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICB3YWl0Rm9yKG1lc3NhZ2UsICgpIC0+IHsKKyAgICAgICAgICAgIG1BbVN0YXRlLmNvbXB1dGVTdGF0ZSgpOworICAgICAgICAgICAgbVdtU3RhdGUuY29tcHV0ZVN0YXRlKCk7CisgICAgICAgICAgICByZXR1cm4gd2FpdENvbmRpdGlvbi50ZXN0KG1BbVN0YXRlLCBtV21TdGF0ZSk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHZvaWQgd2FpdEZvcihTdHJpbmcgbWVzc2FnZSwgQm9vbGVhblN1cHBsaWVyIHdhaXRDb25kaXRpb24pIHsKKyAgICAgICAgZm9yIChpbnQgcmV0cnkgPSAxOyByZXRyeSA8PSA1OyByZXRyeSsrKSB7CisgICAgICAgICAgICBpZiAod2FpdENvbmRpdGlvbi5nZXRBc0Jvb2xlYW4oKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvZ0Fsd2F5cyhtZXNzYWdlICsgIiByZXRyeT0iICsgcmV0cnkpOworICAgICAgICAgICAgU3lzdGVtQ2xvY2suc2xlZXAoMTAwMCk7CisgICAgICAgIH0KKyAgICAgICAgbG9nRShtZXNzYWdlICsgIiBmYWlsZWQiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgc2hvdWxkIHdhaXQgZm9yIHZhbGlkIHN0YWNrcyBzdGF0ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gc2hvdWxkV2FpdEZvclZhbGlkU3RhY2tzKGJvb2xlYW4gY29tcGFyZVRhc2tBbmRTdGFja0JvdW5kcykgeworICAgICAgICBpZiAoIXRhc2tMaXN0c0luQW1BbmRXbUFyZUVxdWFsKCkpIHsKKyAgICAgICAgICAgIC8vIFdlIHdhbnQgdG8gd2FpdCBmb3IgZXF1YWwgdGFzayBsaXN0cyBpbiBBTSBhbmQgV00gaW4gY2FzZSB3ZSBjYXVnaHQgdGhlbSBpbiB0aGUKKyAgICAgICAgICAgIC8vIG1pZGRsZSBvZiBzb21lIHN0YXRlIGNoYW5nZSBvcGVyYXRpb25zLgorICAgICAgICAgICAgbG9nQWx3YXlzKCIqKip0YXNrTGlzdHNJbkFtQW5kV21BcmVFcXVhbD1mYWxzZSIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzdGFja0JvdW5kc0luQU1BbmRXTUFyZUVxdWFsKCkpIHsKKyAgICAgICAgICAgIC8vIFdlIHdhbnQgdG8gd2FpdCBhIGxpdHRsZSBmb3IgdGhlIHN0YWNrcyBpbiBBTSBhbmQgV00gdG8gaGF2ZSBlcXVhbCBib3VuZHMgYXMgdGhlcmUKKyAgICAgICAgICAgIC8vIG1pZ2h0IGJlIGEgdHJhbnNpdGlvbiBhbmltYXRpb24gb25nb2luZyB3aGVuIHdlIGdvdCB0aGUgc3RhdGVzIGZyb20gV00gQU0gc2VwYXJhdGVseS4KKyAgICAgICAgICAgIGxvZ0Fsd2F5cygiKioqc3RhY2tCb3VuZHNJbkFNQW5kV01BcmVFcXVhbD1mYWxzZSIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIFRlbXBvcmFyeSBmaXggdG8gYXZvaWQgY2F0Y2hpbmcgaW50ZXJtZWRpYXRlIHN0YXRlIHdpdGggZGlmZmVyZW50IHRhc2sgYm91bmRzIGluIEFNCisgICAgICAgICAgICAvLyBhbmQgV00uCisgICAgICAgICAgICBhc3NlcnRWYWxpZEJvdW5kcyhjb21wYXJlVGFza0FuZFN0YWNrQm91bmRzKTsKKyAgICAgICAgfSBjYXRjaCAoQXNzZXJ0aW9uRXJyb3IgZSkgeworICAgICAgICAgICAgbG9nQWx3YXlzKCIqKip0YXNrQm91bmRzSW5BTUFuZFdNQXJlRXF1YWw9ZmFsc2UgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgaW50IHN0YWNrQ291bnQgPSBtQW1TdGF0ZS5nZXRTdGFja0NvdW50KCk7CisgICAgICAgIGlmIChzdGFja0NvdW50ID09IDApIHsKKyAgICAgICAgICAgIGxvZ0Fsd2F5cygiKioqc3RhY2tDb3VudD0iICsgc3RhY2tDb3VudCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBpbnQgcmVzdW1lZEFjdGl2aXRpZXNDb3VudCA9IG1BbVN0YXRlLmdldFJlc3VtZWRBY3Rpdml0aWVzQ291bnQoKTsKKyAgICAgICAgaWYgKCFtQW1TdGF0ZS5nZXRLZXlndWFyZENvbnRyb2xsZXJTdGF0ZSgpLmtleWd1YXJkU2hvd2luZyAmJiByZXN1bWVkQWN0aXZpdGllc0NvdW50ICE9IDEpIHsKKyAgICAgICAgICAgIGxvZ0Fsd2F5cygiKioqcmVzdW1lZEFjdGl2aXRpZXNDb3VudD0iICsgcmVzdW1lZEFjdGl2aXRpZXNDb3VudCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUFtU3RhdGUuZ2V0Rm9jdXNlZEFjdGl2aXR5KCkgPT0gbnVsbCkgeworICAgICAgICAgICAgbG9nQWx3YXlzKCIqKipmb2N1c2VkQWN0aXZpdHk9bnVsbCIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBzaG91bGQgd2FpdCBmb3Igc29tZSBhY3Rpdml0aWVzIHRvIGJlY29tZSB2aXNpYmxlLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBzaG91bGRXYWl0Rm9yQWN0aXZpdGllcyhXYWl0Rm9yVmFsaWRBY3Rpdml0eVN0YXRlLi4uIHdhaXRGb3JBY3Rpdml0aWVzVmlzaWJsZSkgeworICAgICAgICBpZiAod2FpdEZvckFjdGl2aXRpZXNWaXNpYmxlID09IG51bGwgfHwgd2FpdEZvckFjdGl2aXRpZXNWaXNpYmxlLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgLy8gSWYgdGhlIGNhbGxlciBpcyBpbnRlcmVzdGVkIGluIHVzIHdhaXRpbmcgZm9yIHNvbWUgcGFydGljdWxhciBhY3Rpdml0eSB3aW5kb3dzIHRvIGJlCisgICAgICAgIC8vIHZpc2libGUgYmVmb3JlIGNvbXB1dGUgdGhlIHN0YXRlLiBDaGVjayBmb3IgdGhlIHZpc2liaWxpdHkgb2YgdGhvc2UgYWN0aXZpdHkgd2luZG93cworICAgICAgICAvLyBhbmQgZm9yIHBsYWNpbmcgdGhlbSBpbiBjb3JyZWN0IHN0YWNrcyAoaWYgcmVxdWVzdGVkKS4KKyAgICAgICAgYm9vbGVhbiBhbGxBY3Rpdml0eVdpbmRvd3NWaXNpYmxlID0gdHJ1ZTsKKyAgICAgICAgYm9vbGVhbiB0YXNrc0luQ29ycmVjdFN0YWNrcyA9IHRydWU7CisgICAgICAgIExpc3Q8V2luZG93U3RhdGU+IG1hdGNoaW5nV2luZG93U3RhdGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGZvciAoZmluYWwgV2FpdEZvclZhbGlkQWN0aXZpdHlTdGF0ZSBzdGF0ZSA6IHdhaXRGb3JBY3Rpdml0aWVzVmlzaWJsZSkgeworICAgICAgICAgICAgZmluYWwgQ29tcG9uZW50TmFtZSBhY3Rpdml0eU5hbWUgPSBzdGF0ZS5hY3Rpdml0eU5hbWU7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgd2luZG93TmFtZSA9IHN0YXRlLndpbmRvd05hbWU7CisgICAgICAgICAgICBmaW5hbCBpbnQgc3RhY2tJZCA9IHN0YXRlLnN0YWNrSWQ7CisgICAgICAgICAgICBmaW5hbCBpbnQgd2luZG93aW5nTW9kZSA9IHN0YXRlLndpbmRvd2luZ01vZGU7CisgICAgICAgICAgICBmaW5hbCBpbnQgYWN0aXZpdHlUeXBlID0gc3RhdGUuYWN0aXZpdHlUeXBlOworCisgICAgICAgICAgICBtV21TdGF0ZS5nZXRNYXRjaGluZ1Zpc2libGVXaW5kb3dTdGF0ZSh3aW5kb3dOYW1lLCBtYXRjaGluZ1dpbmRvd1N0YXRlcyk7CisgICAgICAgICAgICBib29sZWFuIGFjdGl2aXR5V2luZG93VmlzaWJsZSA9ICFtYXRjaGluZ1dpbmRvd1N0YXRlcy5pc0VtcHR5KCk7CisgICAgICAgICAgICBpZiAoIWFjdGl2aXR5V2luZG93VmlzaWJsZSkgeworICAgICAgICAgICAgICAgIGxvZ0Fsd2F5cygiQWN0aXZpdHkgd2luZG93IG5vdCB2aXNpYmxlOiAiICsgd2luZG93TmFtZSk7CisgICAgICAgICAgICAgICAgYWxsQWN0aXZpdHlXaW5kb3dzVmlzaWJsZSA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpdml0eU5hbWUgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAmJiAhbUFtU3RhdGUuaXNBY3Rpdml0eVZpc2libGUoYWN0aXZpdHlOYW1lKSkgeworICAgICAgICAgICAgICAgIGxvZ0Fsd2F5cygiQWN0aXZpdHkgbm90IHZpc2libGU6ICIgKyBnZXRBY3Rpdml0eU5hbWUoYWN0aXZpdHlOYW1lKSk7CisgICAgICAgICAgICAgICAgYWxsQWN0aXZpdHlXaW5kb3dzVmlzaWJsZSA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB3aW5kb3cgaXMgYWxyZWFkeSB0aGUgY29ycmVjdCBzdGF0ZSByZXF1ZXN0ZWQgYnkgdGVzdC4KKyAgICAgICAgICAgICAgICBib29sZWFuIHdpbmRvd0luQ29ycmVjdFN0YXRlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZm9yIChXaW5kb3dTdGF0ZSB3cyA6IG1hdGNoaW5nV2luZG93U3RhdGVzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGFja0lkICE9IElOVkFMSURfU1RBQ0tfSUQgJiYgd3MuZ2V0U3RhY2tJZCgpICE9IHN0YWNrSWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3dpbmdNb2RlICE9IFdJTkRPV0lOR19NT0RFX1VOREVGSU5FRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHdzLmdldFdpbmRvd2luZ01vZGUoKSAhPSB3aW5kb3dpbmdNb2RlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZpdHlUeXBlICE9IEFDVElWSVRZX1RZUEVfVU5ERUZJTkVECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgd3MuZ2V0QWN0aXZpdHlUeXBlKCkgIT0gYWN0aXZpdHlUeXBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB3aW5kb3dJbkNvcnJlY3RTdGF0ZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghd2luZG93SW5Db3JyZWN0U3RhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nQWx3YXlzKCJXaW5kb3cgaW4gaW5jb3JyZWN0IHN0YWNrOiAiICsgc3RhdGUpOworICAgICAgICAgICAgICAgICAgICB0YXNrc0luQ29ycmVjdFN0YWNrcyA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gIWFsbEFjdGl2aXR5V2luZG93c1Zpc2libGUgfHwgIXRhc2tzSW5Db3JyZWN0U3RhY2tzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBzaG91bGQgd2FpdCB2YWxpZCB3aW5kb3dzIHN0YXRlLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBzaG91bGRXYWl0Rm9yV2luZG93cygpIHsKKyAgICAgICAgaWYgKG1XbVN0YXRlLmdldEZyb250V2luZG93KCkgPT0gbnVsbCkgeworICAgICAgICAgICAgbG9nQWx3YXlzKCIqKipmcm9udFdpbmRvdz1udWxsIik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobVdtU3RhdGUuZ2V0Rm9jdXNlZFdpbmRvdygpID09IG51bGwpIHsKKyAgICAgICAgICAgIGxvZ0Fsd2F5cygiKioqZm9jdXNlZFdpbmRvdz1udWxsIik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobVdtU3RhdGUuZ2V0Rm9jdXNlZEFwcCgpID09IG51bGwpIHsKKyAgICAgICAgICAgIGxvZ0Fsd2F5cygiKioqZm9jdXNlZEFwcD1udWxsIik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gc2hvdWxkV2FpdEZvclNhbml0eUNoZWNrKGJvb2xlYW4gY29tcGFyZVRhc2tBbmRTdGFja0JvdW5kcykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0U2FuaXR5KCk7CisgICAgICAgICAgICBhc3NlcnRWYWxpZEJvdW5kcyhjb21wYXJlVGFza0FuZFN0YWNrQm91bmRzKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGxvZ0Fsd2F5cygiV2FpdGluZyBmb3Igc2FuaXR5IGNoZWNrOiAiICsgdC50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgV2luZG93TWFuYWdlclN0YXRlIGdldFdtU3RhdGUoKSB7CisgICAgICAgIHJldHVybiBtV21TdGF0ZTsKKyAgICB9CisKKyAgICB2b2lkIGFzc2VydFNhbml0eSgpIHsKKyAgICAgICAgYXNzZXJ0VGhhdCgiTXVzdCBoYXZlIHN0YWNrcyIsIG1BbVN0YXRlLmdldFN0YWNrQ291bnQoKSwgZ3JlYXRlclRoYW4oMCkpOworICAgICAgICBpZiAoIW1BbVN0YXRlLmdldEtleWd1YXJkQ29udHJvbGxlclN0YXRlKCkua2V5Z3VhcmRTaG93aW5nKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRoZXJlIHNob3VsZCBiZSBvbmUgYW5kIG9ubHkgb25lIHJlc3VtZWQgYWN0aXZpdHkgaW4gdGhlIHN5c3RlbS4iLAorICAgICAgICAgICAgICAgICAgICAxLCBtQW1TdGF0ZS5nZXRSZXN1bWVkQWN0aXZpdGllc0NvdW50KCkpOworICAgICAgICB9CisgICAgICAgIGFzc2VydE5vdE51bGwoIk11c3QgaGF2ZSBmb2N1cyBhY3Rpdml0eS4iLCBtQW1TdGF0ZS5nZXRGb2N1c2VkQWN0aXZpdHkoKSk7CisKKyAgICAgICAgZm9yIChBY3Rpdml0eVN0YWNrIGFTdGFjayA6IG1BbVN0YXRlLmdldFN0YWNrcygpKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgc3RhY2tJZCA9IGFTdGFjay5tU3RhY2tJZDsKKyAgICAgICAgICAgIGZvciAoQWN0aXZpdHlUYXNrIGFUYXNrIDogYVN0YWNrLmdldFRhc2tzKCkpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlN0YWNrIGNhbiBvbmx5IGNvbnRhaW4gaXRzIG93biB0YXNrcyIsIHN0YWNrSWQsIGFUYXNrLm1TdGFja0lkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydE5vdE51bGwoIk11c3QgaGF2ZSBmcm9udCB3aW5kb3cuIiwgbVdtU3RhdGUuZ2V0RnJvbnRXaW5kb3coKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoIk11c3QgaGF2ZSBmb2N1c2VkIHdpbmRvdy4iLCBtV21TdGF0ZS5nZXRGb2N1c2VkV2luZG93KCkpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJNdXN0IGhhdmUgYXBwLiIsIG1XbVN0YXRlLmdldEZvY3VzZWRBcHAoKSk7CisgICAgfQorCisgICAgQERlcHJlY2F0ZWQKKyAgICB2b2lkIGFzc2VydEZvY3VzZWRTdGFjayhTdHJpbmcgbXNnLCBpbnQgc3RhY2tJZCkgeworICAgICAgICBhc3NlcnRFcXVhbHMobXNnLCBzdGFja0lkLCBtQW1TdGF0ZS5nZXRGb2N1c2VkU3RhY2tJZCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhc3NlcnRWaXNpYmlsaXR5KGZpbmFsIENvbXBvbmVudE5hbWUgYWN0aXZpdHlOYW1lLCBmaW5hbCBib29sZWFuIHZpc2libGUpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHdpbmRvd05hbWUgPSBnZXRXaW5kb3dOYW1lKGFjdGl2aXR5TmFtZSk7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gYWN0aXZpdHlWaXNpYmxlID0gbUFtU3RhdGUuaXNBY3Rpdml0eVZpc2libGUoYWN0aXZpdHlOYW1lKTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiB3aW5kb3dWaXNpYmxlID0gbVdtU3RhdGUuaXNXaW5kb3dWaXNpYmxlKHdpbmRvd05hbWUpOworCisgICAgICAgIGFzc2VydEVxdWFscygiQWN0aXZpdHk9IiArIGdldEFjdGl2aXR5TmFtZShhY3Rpdml0eU5hbWUpICsgIiBtdXN0IiArICh2aXNpYmxlID8gIiIgOiAiIE5PVCIpCisgICAgICAgICAgICAgICAgKyAiIGJlIHZpc2libGUuIiwgdmlzaWJsZSwgYWN0aXZpdHlWaXNpYmxlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJXaW5kb3c9IiArIHdpbmRvd05hbWUgKyAiIG11c3QiICsgKHZpc2libGUgPyAiIiA6ICIgTk9UIikgKyAiIGJlIHZpc2libGUuIiwKKyAgICAgICAgICAgICAgICB2aXNpYmxlLCB3aW5kb3dWaXNpYmxlKTsKKyAgICB9CisKKyAgICBib29sZWFuIHRhc2tMaXN0c0luQW1BbmRXbUFyZUVxdWFsKCkgeworICAgICAgICBmb3IgKEFjdGl2aXR5U3RhY2sgYVN0YWNrIDogbUFtU3RhdGUuZ2V0U3RhY2tzKCkpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBzdGFja0lkID0gYVN0YWNrLm1TdGFja0lkOworICAgICAgICAgICAgZmluYWwgV2luZG93U3RhY2sgd1N0YWNrID0gbVdtU3RhdGUuZ2V0U3RhY2soc3RhY2tJZCk7CisgICAgICAgICAgICBpZiAod1N0YWNrID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBsb2coIldhaXRpbmcgZm9yIHN0YWNrIHNldHVwIGluIFdNLCBzdGFja0lkPSIgKyBzdGFja0lkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoQWN0aXZpdHlUYXNrIGFUYXNrIDogYVN0YWNrLmdldFRhc2tzKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAod1N0YWNrLmdldFRhc2soYVRhc2subVRhc2tJZCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBsb2coIlRhc2sgaXMgaW4gQU0gYnV0IG5vdCBpbiBXTSwgd2FpdGluZyBmb3IgaXQgdG8gc2V0dGxlLCB0YXNrSWQ9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYVRhc2subVRhc2tJZCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoV2luZG93VGFzayB3VGFzayA6IHdTdGFjay5tVGFza3MpIHsKKyAgICAgICAgICAgICAgICBpZiAoYVN0YWNrLmdldFRhc2sod1Rhc2subVRhc2tJZCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBsb2coIlRhc2sgaXMgaW4gV00gYnV0IG5vdCBpbiBBTSwgd2FpdGluZyBmb3IgaXQgdG8gc2V0dGxlLCB0YXNrSWQ9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgd1Rhc2subVRhc2tJZCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbGVhbiBzdGFja0JvdW5kc0luQU1BbmRXTUFyZUVxdWFsKCkgeworICAgICAgICBmb3IgKEFjdGl2aXR5U3RhY2sgYVN0YWNrIDogbUFtU3RhdGUuZ2V0U3RhY2tzKCkpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBzdGFja0lkID0gYVN0YWNrLm1TdGFja0lkOworICAgICAgICAgICAgZmluYWwgV2luZG93U3RhY2sgd1N0YWNrID0gbVdtU3RhdGUuZ2V0U3RhY2soc3RhY2tJZCk7CisgICAgICAgICAgICBpZiAoYVN0YWNrLmlzRnVsbHNjcmVlbigpICE9IHdTdGFjay5pc0Z1bGxzY3JlZW4oKSkgeworICAgICAgICAgICAgICAgIGxvZygiV2FpdGluZyBmb3IgY29ycmVjdCBmdWxsc2NyZWVuIHN0YXRlLCBzdGFja0lkPSIgKyBzdGFja0lkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIFJlY3QgYVN0YWNrQm91bmRzID0gYVN0YWNrLmdldEJvdW5kcygpOworICAgICAgICAgICAgZmluYWwgUmVjdCB3U3RhY2tCb3VuZHMgPSB3U3RhY2suZ2V0Qm91bmRzKCk7CisKKyAgICAgICAgICAgIGlmIChhU3RhY2suaXNGdWxsc2NyZWVuKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoYVN0YWNrQm91bmRzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJXYWl0aW5nIGZvciBjb3JyZWN0IHN0YWNrIHN0YXRlIGluIEFNLCBzdGFja0lkPSIgKyBzdGFja0lkKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIU9iamVjdHMuZXF1YWxzKGFTdGFja0JvdW5kcywgd1N0YWNrQm91bmRzKSkgeworICAgICAgICAgICAgICAgIC8vIElmIHN0YWNrIGlzIG5vdCBmdWxsc2NyZWVuIC0gY29tcGFyaW5nIGJvdW5kcy4gTm90IGRvaW5nIGl0IGFsd2F5cyBiZWNhdXNlCisgICAgICAgICAgICAgICAgLy8gZm9yIGZ1bGxzY3JlZW4gc3RhY2sgYm91bmRzIGluIFdNIGNhbiBiZSBlaXRoZXIgbnVsbCBvciBlcXVhbCB0byBkaXNwbGF5IHNpemUuCisgICAgICAgICAgICAgICAgbG9nKCJXYWl0aW5nIGZvciBzdGFjayBib3VuZCBlcXVhbGl0eSBpbiBBTSBhbmQgV00sIHN0YWNrSWQ9IiArIHN0YWNrSWQpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHZvaWQgYXNzZXJ0VmFsaWRCb3VuZHMoYm9vbGVhbiBjb21wYXJlVGFza0FuZFN0YWNrQm91bmRzKSB7CisgICAgICAgIC8vIEN5Y2xlIHRocm91Z2ggdGhlIHN0YWNrcyBhbmQgdGFza3MgdG8gZmlndXJlIG91dCBpZiB0aGUgaG9tZSBzdGFjayBpcyByZXNpemFibGUKKyAgICAgICAgZmluYWwgQWN0aXZpdHlUYXNrIGhvbWVUYXNrID0gbUFtU3RhdGUuZ2V0SG9tZVRhc2soKTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBob21lU3RhY2tJc1Jlc2l6YWJsZSA9IGhvbWVUYXNrICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiBob21lVGFzay5nZXRSZXNpemVNb2RlKCkgPT0gUkVTSVpFX01PREVfUkVTSVpFQUJMRTsKKworICAgICAgICBmb3IgKEFjdGl2aXR5U3RhY2sgYVN0YWNrIDogbUFtU3RhdGUuZ2V0U3RhY2tzKCkpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBzdGFja0lkID0gYVN0YWNrLm1TdGFja0lkOworICAgICAgICAgICAgZmluYWwgV2luZG93U3RhY2sgd1N0YWNrID0gbVdtU3RhdGUuZ2V0U3RhY2soc3RhY2tJZCk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJzdGFja0lkPSIgKyBzdGFja0lkICsgIiBpbiBBTSBidXQgbm90IGluIFdNPyIsIHdTdGFjayk7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiU3RhY2sgZnVsbHNjcmVlbiBzdGF0ZSBpbiBBTSBhbmQgV00gbXVzdCBiZSBlcXVhbCBzdGFja0lkPSIgKyBzdGFja0lkLAorICAgICAgICAgICAgICAgICAgICBhU3RhY2suaXNGdWxsc2NyZWVuKCksIHdTdGFjay5pc0Z1bGxzY3JlZW4oKSk7CisKKyAgICAgICAgICAgIGZpbmFsIFJlY3QgYVN0YWNrQm91bmRzID0gYVN0YWNrLmdldEJvdW5kcygpOworICAgICAgICAgICAgZmluYWwgUmVjdCB3U3RhY2tCb3VuZHMgPSB3U3RhY2suZ2V0Qm91bmRzKCk7CisKKyAgICAgICAgICAgIGlmIChhU3RhY2suaXNGdWxsc2NyZWVuKCkpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnROdWxsKCJTdGFjayBib3VuZHMgaW4gQU0gbXVzdCBiZSBudWxsIHN0YWNrSWQ9IiArIHN0YWNrSWQsIGFTdGFja0JvdW5kcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiU3RhY2sgYm91bmRzIGluIEFNIGFuZCBXTSBtdXN0IGJlIGVxdWFsIHN0YWNrSWQ9IiArIHN0YWNrSWQsCisgICAgICAgICAgICAgICAgICAgICAgICBhU3RhY2tCb3VuZHMsIHdTdGFja0JvdW5kcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoQWN0aXZpdHlUYXNrIGFUYXNrIDogYVN0YWNrLmdldFRhc2tzKCkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdGFza0lkID0gYVRhc2subVRhc2tJZDsKKyAgICAgICAgICAgICAgICBmaW5hbCBXaW5kb3dUYXNrIHdUYXNrID0gd1N0YWNrLmdldFRhc2sodGFza0lkKTsKKyAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKAorICAgICAgICAgICAgICAgICAgICAgICAgInRhc2tJZD0iICsgdGFza0lkICsgIiBpbiBBTSBidXQgbm90IGluIFdNPyBzdGFja0lkPSIgKyBzdGFja0lkLCB3VGFzayk7CisKKyAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGFUYXNrSXNGdWxsc2NyZWVuID0gYVRhc2suaXNGdWxsc2NyZWVuKCk7CisgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiB3VGFza0lzRnVsbHNjcmVlbiA9IHdUYXNrLmlzRnVsbHNjcmVlbigpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGFzayBmdWxsc2NyZWVuIHN0YXRlIGluIEFNIGFuZCBXTSBtdXN0IGJlIGVxdWFsIHRhc2tJZD0iICsgdGFza0lkCisgICAgICAgICAgICAgICAgICAgICAgICArICIsIHN0YWNrSWQ9IiArIHN0YWNrSWQsIGFUYXNrSXNGdWxsc2NyZWVuLCB3VGFza0lzRnVsbHNjcmVlbik7CisKKyAgICAgICAgICAgICAgICBmaW5hbCBSZWN0IGFUYXNrQm91bmRzID0gYVRhc2suZ2V0Qm91bmRzKCk7CisgICAgICAgICAgICAgICAgZmluYWwgUmVjdCB3VGFza0JvdW5kcyA9IHdUYXNrLmdldEJvdW5kcygpOworCisgICAgICAgICAgICAgICAgaWYgKGFUYXNrSXNGdWxsc2NyZWVuKSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydE51bGwoIlRhc2sgYm91bmRzIGluIEFNIG11c3QgYmUgbnVsbCBmb3IgZnVsbHNjcmVlbiB0YXNrSWQ9IiArIHRhc2tJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVGFza0JvdW5kcyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghaG9tZVN0YWNrSXNSZXNpemFibGUgJiYgbVdtU3RhdGUuaXNEb2NrZWRTdGFja01pbmltaXplZCgpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAhaXNTY3JlZW5Qb3J0cmFpdChhU3RhY2subURpc3BsYXlJZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiBtaW5pbWl6ZWQgdXNpbmcgbm9uLXJlc2l6YWJsZSBsYXVuY2hlciBpbiBsYW5kc2NhcGUgbW9kZSwgaXQgd2lsbCBtb3ZlCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0YXNrIG9mZnNjcmVlbiBpbiB0aGUgbmVnYXRpdmUgeCBkaXJlY3Rpb24gdW5saWtlIHBvcnRyYWl0IHRoYXQgY3JvcHMuCisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSB4IHZhbHVlIGluIHRoZSB0YXNrIGJvdW5kcyB3aWxsIG5vdCBtYXRjaCB0aGUgc3RhY2sgYm91bmRzIHNpbmNlIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IHRoZSB0YXNrIHdhcyBtb3ZlZC4KKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUYXNrIGJvdW5kcyBpbiBBTSBhbmQgV00gbXVzdCBtYXRjaCB3aWR0aCB0YXNrSWQ9IiArIHRhc2tJZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBzdGFja0lkIiArIHN0YWNrSWQsIGFUYXNrQm91bmRzLndpZHRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd1Rhc2tCb3VuZHMud2lkdGgoKSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGFzayBib3VuZHMgaW4gQU0gYW5kIFdNIG11c3QgbWF0Y2ggaGVpZ2h0IHRhc2tJZD0iICsgdGFza0lkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHN0YWNrSWQiICsgc3RhY2tJZCwgYVRhc2tCb3VuZHMuaGVpZ2h0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd1Rhc2tCb3VuZHMuaGVpZ2h0KCkpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRhc2sgYm91bmRzIG11c3QgbWF0Y2ggc3RhY2sgYm91bmRzIHkgdGFza0lkPSIgKyB0YXNrSWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgc3RhY2tJZCIgKyBzdGFja0lkLCBhVGFza0JvdW5kcy50b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd1Rhc2tCb3VuZHMudG9wKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUYXNrIGFuZCBzdGFjayBib3VuZHMgbXVzdCBtYXRjaCB3aWR0aCB0YXNrSWQ9IiArIHRhc2tJZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBzdGFja0lkIiArIHN0YWNrSWQsIGFTdGFja0JvdW5kcy53aWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdUYXNrQm91bmRzLndpZHRoKCkpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRhc2sgYW5kIHN0YWNrIGJvdW5kcyBtdXN0IG1hdGNoIGhlaWdodCB0YXNrSWQ9IiArIHRhc2tJZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBzdGFja0lkIiArIHN0YWNrSWQsIGFTdGFja0JvdW5kcy5oZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3VGFza0JvdW5kcy5oZWlnaHQoKSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGFzayBhbmQgc3RhY2sgYm91bmRzIG11c3QgbWF0Y2ggeSB0YXNrSWQ9IiArIHRhc2tJZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBzdGFja0lkIiArIHN0YWNrSWQsIGFTdGFja0JvdW5kcy50b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd1Rhc2tCb3VuZHMudG9wKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRhc2sgYm91bmRzIGluIEFNIGFuZCBXTSBtdXN0IGJlIGVxdWFsIHRhc2tJZD0iICsgdGFza0lkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBzdGFja0lkPSIgKyBzdGFja0lkLCBhVGFza0JvdW5kcywgd1Rhc2tCb3VuZHMpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChjb21wYXJlVGFza0FuZFN0YWNrQm91bmRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgYVN0YWNrLmdldFdpbmRvd2luZ01vZGUoKSAhPSBXSU5ET1dJTkdfTU9ERV9GUkVFRk9STSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFUYXNrTWluV2lkdGggPSBhVGFzay5nZXRNaW5XaWR0aCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFUYXNrTWluSGVpZ2h0ID0gYVRhc2suZ2V0TWluSGVpZ2h0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhVGFza01pbldpZHRoID09IC0xIHx8IGFUYXNrTWluSGVpZ2h0ID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWluaW1hbCBkaW1lbnNpb24ocykgbm90IHNldCBmb3IgdGFzayAtIGl0IHNob3VsZCBiZSB1c2luZyBkZWZhdWx0cy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVmYXVsdE1pbmltYWxTaXplID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFTdGFjay5nZXRXaW5kb3dpbmdNb2RlKCkgPT0gV0lORE9XSU5HX01PREVfUElOTkVECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGRlZmF1bHRNaW5pbWFsUGlubmVkVGFza1NpemUoYVN0YWNrLm1EaXNwbGF5SWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGRlZmF1bHRNaW5pbWFsVGFza1NpemUoYVN0YWNrLm1EaXNwbGF5SWQpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFUYXNrTWluV2lkdGggPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVRhc2tNaW5XaWR0aCA9IGRlZmF1bHRNaW5pbWFsU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFUYXNrTWluSGVpZ2h0ID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFUYXNrTWluSGVpZ2h0ID0gZGVmYXVsdE1pbmltYWxTaXplOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFTdGFja0JvdW5kcy53aWR0aCgpID49IGFUYXNrTWluV2lkdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgYVN0YWNrQm91bmRzLmhlaWdodCgpID49IGFUYXNrTWluSGVpZ2h0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGFTdGFjay5nZXRXaW5kb3dpbmdNb2RlKCkgPT0gV0lORE9XSU5HX01PREVfUElOTkVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQm91bmRzIGFyZSBub3Qgc21hbGxlciB0aGVuIG1pbmltYWwgcG9zc2libGUsIHNvIHN0YWNrIGFuZCB0YXNrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYm91bmRzIG11c3QgYmUgZXF1YWwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUYXNrIGJvdW5kcyBtdXN0IGJlIGVxdWFsIHRvIHN0YWNrIGJvdW5kcyB0YXNrSWQ9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0YXNrSWQgKyAiLCBzdGFja0lkPSIgKyBzdGFja0lkLCBhU3RhY2tCb3VuZHMsIHdUYXNrQm91bmRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYVN0YWNrLmdldFdpbmRvd2luZ01vZGUoKSA9PSBXSU5ET1dJTkdfTU9ERV9TUExJVF9TQ1JFRU5fUFJJTUFSWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBob21lU3RhY2tJc1Jlc2l6YWJsZSAmJiBtV21TdGF0ZS5pc0RvY2tlZFN0YWNrTWluaW1pemVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQb3J0cmFpdCBpZiB0aGUgZGlzcGxheSBoZWlnaHQgaXMgbGFyZ2VyIHRoYW4gdGhlIHdpZHRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2NyZWVuUG9ydHJhaXQoYVN0YWNrLm1EaXNwbGF5SWQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGFzayB3aWR0aCBtdXN0IGJlIGVxdWFsIHRvIHN0YWNrIHdpZHRoIHRhc2tJZD0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRhc2tJZCArICIsIHN0YWNrSWQ9IiArIHN0YWNrSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVN0YWNrQm91bmRzLndpZHRoKCksIHdUYXNrQm91bmRzLndpZHRoKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRUaGF0KCJUYXNrIGhlaWdodCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBzdGFjayBoZWlnaHQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAidGFza0lkPSIgKyB0YXNrSWQgKyAiLCBzdGFja0lkPSIgKyBzdGFja0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFTdGFja0JvdW5kcy5oZWlnaHQoKSwgbGVzc1RoYW4od1Rhc2tCb3VuZHMuaGVpZ2h0KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUYXNrIGFuZCBzdGFjayB4IHBvc2l0aW9uIG11c3QgYmUgZXF1YWwgdGFza0lkPSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdGFza0lkICsgIiwgc3RhY2tJZD0iICsgc3RhY2tJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3VGFza0JvdW5kcy5sZWZ0LCB3U3RhY2tCb3VuZHMubGVmdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VGhhdCgiVGFzayB3aWR0aCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBzdGFjayB3aWR0aCB0YXNrSWQ9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0YXNrSWQgKyAiLCBzdGFja0lkPSIgKyBzdGFja0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFTdGFja0JvdW5kcy53aWR0aCgpLCBsZXNzVGhhbih3VGFza0JvdW5kcy53aWR0aCgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGFzayBoZWlnaHQgbXVzdCBiZSBlcXVhbCB0byBzdGFjayBoZWlnaHQgdGFza0lkPSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdGFza0lkICsgIiwgc3RhY2tJZD0iICsgc3RhY2tJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhU3RhY2tCb3VuZHMuaGVpZ2h0KCksIHdUYXNrQm91bmRzLmhlaWdodCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUYXNrIGFuZCBzdGFjayB5IHBvc2l0aW9uIG11c3QgYmUgZXF1YWwgdGFza0lkPSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdGFza0lkICsgIiwgc3RhY2tJZD0iICsgc3RhY2tJZCwgd1Rhc2tCb3VuZHMudG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdTdGFja0JvdW5kcy50b3ApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWluaW1hbCBkaW1lbnNpb25zIGFmZmVjdCB0YXNrIHNpemUsIHNvIGJvdW5kcyBvZiB0YXNrIGFuZCBzdGFjayBtdXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmUgZGlmZmVyZW50IC0gd2lsbCBjb21wYXJlIGRpbWVuc2lvbnMgaW5zdGVhZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGFyZ2V0V2lkdGggPSAoaW50KSBNYXRoLm1heChhVGFza01pbldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVN0YWNrQm91bmRzLndpZHRoKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGFzayB3aWR0aCBtdXN0IGJlIHNldCBhY2NvcmRpbmcgdG8gbWluaW1hbCB3aWR0aCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHRhc2tJZD0iICsgdGFza0lkICsgIiwgc3RhY2tJZD0iICsgc3RhY2tJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFdpZHRoLCAoaW50KSB3VGFza0JvdW5kcy53aWR0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGFyZ2V0SGVpZ2h0ID0gKGludCkgTWF0aC5tYXgoYVRhc2tNaW5IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhU3RhY2tCb3VuZHMuaGVpZ2h0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGFzayBoZWlnaHQgbXVzdCBiZSBzZXQgYWNjb3JkaW5nIHRvIG1pbmltYWwgaGVpZ2h0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgdGFza0lkPSIgKyB0YXNrSWQgKyAiLCBzdGFja0lkPSIgKyBzdGFja0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0SGVpZ2h0LCAoaW50KSB3VGFza0JvdW5kcy5oZWlnaHQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sZWFuIGlzU2NyZWVuUG9ydHJhaXQoaW50IGRpc3BsYXlJZCkgeworICAgICAgICBmaW5hbCBSZWN0IGRpc3BsYXlSZWN0ID0gbVdtU3RhdGUuZ2V0RGlzcGxheShkaXNwbGF5SWQpLmdldERpc3BsYXlSZWN0KCk7CisgICAgICAgIHJldHVybiBkaXNwbGF5UmVjdC5oZWlnaHQoKSA+IGRpc3BsYXlSZWN0LndpZHRoKCk7CisgICAgfQorCisgICAgc3RhdGljIGludCBkcFRvUHgoZmxvYXQgZHAsIGludCBkZW5zaXR5RHBpKSB7CisgICAgICAgIHJldHVybiAoaW50KSAoZHAgKiBkZW5zaXR5RHBpIC8gRElTUExBWV9ERU5TSVRZX0RFRkFVTFQgKyAwLjVmKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBkZWZhdWx0TWluaW1hbFRhc2tTaXplKGludCBkaXNwbGF5SWQpIHsKKyAgICAgICAgcmV0dXJuIGRwVG9QeChERUZBVUxUX1JFU0laQUJMRV9UQVNLX1NJWkVfRFAsIG1XbVN0YXRlLmdldERpc3BsYXkoZGlzcGxheUlkKS5nZXREcGkoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgZGVmYXVsdE1pbmltYWxQaW5uZWRUYXNrU2l6ZShpbnQgZGlzcGxheUlkKSB7CisgICAgICAgIHJldHVybiBkcFRvUHgoREVGQVVMVF9QSVBfUkVTSVpBQkxFX1RBU0tfU0laRV9EUCwgbVdtU3RhdGUuZ2V0RGlzcGxheShkaXNwbGF5SWQpLmdldERwaSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9rZXlzdG9yZS9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlNYW5hZ2VyU3RhdGUuamF2YSBiL3Rlc3RzL3Rlc3RzL2tleXN0b3JlL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJTdGF0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NTA3YzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9rZXlzdG9yZS9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlNYW5hZ2VyU3RhdGUuamF2YQpAQCAtMCwwICsxLDM5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbTsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5XaW5kb3dDb25maWd1cmF0aW9uLkFDVElWSVRZX1RZUEVfSE9NRTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50TmFtZVV0aWxzLmdldEFjdGl2aXR5TmFtZTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uUHJvdG9FeHRyYWN0b3JzLmV4dHJhY3Q7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLlN0YXRlTG9nZ2VyLmxvZzsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uU3RhdGVMb2dnZXIubG9nRTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworCitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLmFtLm5hbm8uQWN0aXZpdHlEaXNwbGF5UHJvdG87CitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLmFtLm5hbm8uQWN0aXZpdHlNYW5hZ2VyU2VydmljZUR1bXBBY3Rpdml0aWVzUHJvdG87CitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLmFtLm5hbm8uQWN0aXZpdHlSZWNvcmRQcm90bzsKK2ltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIuYW0ubmFuby5BY3Rpdml0eVN0YWNrUHJvdG87CitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLmFtLm5hbm8uQWN0aXZpdHlTdGFja1N1cGVydmlzb3JQcm90bzsKK2ltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIuYW0ubmFuby5LZXlndWFyZENvbnRyb2xsZXJQcm90bzsKK2ltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIuYW0ubmFuby5UYXNrUmVjb3JkUHJvdG87CitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLndtLm5hbm8uQ29uZmlndXJhdGlvbkNvbnRhaW5lclByb3RvOworCitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkludmFsaWRQcm90b2NvbEJ1ZmZlck5hbm9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgQWN0aXZpdHlNYW5hZ2VyU3RhdGUgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRFVNUF9NT0RFX0FDVElWSVRJRVMgPSAwOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVEVfUEFVU0VEID0gIlBBVVNFRCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVEVfU1RPUFBFRCA9ICJTVE9QUEVEIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEVU1QU1lTX0FDVElWSVRZX0FDVElWSVRJRVMgPSAiZHVtcHN5cyBhY3Rpdml0eSAtLXByb3RvIGFjdGl2aXRpZXMiOworCisgICAgLy8gRGlzcGxheXMgaW4gei1vcmRlciB3aXRoIHRoZSB0b3AgbW9zdCBhdCB0aGUgZnJvbnQgb2YgdGhlIGxpc3QsIHN0YXJ0aW5nIHdpdGggcHJpbWFyeS4KKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8QWN0aXZpdHlEaXNwbGF5PiBtRGlzcGxheXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAvLyBTdGFja3MgaW4gei1vcmRlciB3aXRoIHRoZSB0b3AgbW9zdCBhdCB0aGUgZnJvbnQgb2YgdGhlIGxpc3QsIHN0YXJ0aW5nIHdpdGggcHJpbWFyeSBkaXNwbGF5LgorICAgIHByaXZhdGUgZmluYWwgTGlzdDxBY3Rpdml0eVN0YWNrPiBtU3RhY2tzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgcHJpdmF0ZSBLZXlndWFyZENvbnRyb2xsZXJTdGF0ZSBtS2V5Z3VhcmRDb250cm9sbGVyU3RhdGU7CisgICAgcHJpdmF0ZSBpbnQgbUZvY3VzZWRTdGFja0lkID0gLTE7CisgICAgcHJpdmF0ZSBTdHJpbmcgbVJlc3VtZWRBY3Rpdml0eVJlY29yZCA9IG51bGw7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFN0cmluZz4gbVJlc3VtZWRBY3Rpdml0aWVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICB2b2lkIGNvbXB1dGVTdGF0ZSgpIHsKKyAgICAgICAgY29tcHV0ZVN0YXRlKERVTVBfTU9ERV9BQ1RJVklUSUVTKTsKKyAgICB9CisKKyAgICB2b2lkIGNvbXB1dGVTdGF0ZShpbnQgZHVtcE1vZGUpIHsKKyAgICAgICAgLy8gSXQgaXMgcG9zc2libGUgdGhlIHN5c3RlbSBpcyBpbiB0aGUgbWlkZGxlIG9mIHRyYW5zaXRpb24gdG8gdGhlIHJpZ2h0IHN0YXRlIHdoZW4gd2UgZ2V0CisgICAgICAgIC8vIHRoZSBkdW1wLiBXZSB0cnkgYSBmZXcgdGltZXMgdG8gZ2V0IHRoZSBpbmZvcm1hdGlvbiB3ZSBuZWVkIGJlZm9yZSBnaXZpbmcgdXAuCisgICAgICAgIGludCByZXRyaWVzTGVmdCA9IDM7CisgICAgICAgIGJvb2xlYW4gcmV0cnkgPSBmYWxzZTsKKyAgICAgICAgYnl0ZVtdIGR1bXAgPSBudWxsOworCisgICAgICAgIGxvZygiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7CisgICAgICAgIGxvZygiICAgICBBY3Rpdml0eU1hbmFnZXJTdGF0ZSAgICAgIik7CisgICAgICAgIGxvZygiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7CisKKyAgICAgICAgZG8geworICAgICAgICAgICAgaWYgKHJldHJ5KSB7CisgICAgICAgICAgICAgICAgbG9nKCIqKipJbmNvbXBsZXRlIEFNIHN0YXRlLiBSZXRyeWluZy4uLiIpOworICAgICAgICAgICAgICAgIC8vIFdhaXQgaGFsZiBhIHNlY29uZCBiZXR3ZWVuIHJldHJpZXMgZm9yIGFjdGl2aXR5IG1hbmFnZXIgdG8gZmluaXNoIHRyYW5zaXRpb25pbmcuCisgICAgICAgICAgICAgICAgU3lzdGVtQ2xvY2suc2xlZXAoNTAwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIGR1bXBzeXNDbWQgPSAiIjsKKyAgICAgICAgICAgIHN3aXRjaCAoZHVtcE1vZGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIERVTVBfTU9ERV9BQ1RJVklUSUVTOgorICAgICAgICAgICAgICAgICAgICBkdW1wc3lzQ21kID0gRFVNUFNZU19BQ1RJVklUWV9BQ1RJVklUSUVTOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZHVtcCA9IGV4ZWN1dGVTaGVsbENvbW1hbmQoZHVtcHN5c0NtZCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHBhcnNlU3lzRHVtcFByb3RvKGR1bXApOworICAgICAgICAgICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyTmFub0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJGYWlsZWQgdG8gcGFyc2UgZHVtcHN5czpcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgbmV3IFN0cmluZyhkdW1wLCBTdGFuZGFyZENoYXJzZXRzLlVURl84KSwgZXgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXRyeSA9IG1TdGFja3MuaXNFbXB0eSgpIHx8IG1Gb2N1c2VkU3RhY2tJZCA9PSAtMSB8fCAobVJlc3VtZWRBY3Rpdml0eVJlY29yZCA9PSBudWxsCisgICAgICAgICAgICAgICAgICAgIHx8IG1SZXN1bWVkQWN0aXZpdGllcy5pc0VtcHR5KCkpICYmICFtS2V5Z3VhcmRDb250cm9sbGVyU3RhdGUua2V5Z3VhcmRTaG93aW5nOworICAgICAgICB9IHdoaWxlIChyZXRyeSAmJiByZXRyaWVzTGVmdC0tID4gMCk7CisKKyAgICAgICAgaWYgKG1TdGFja3MuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBsb2dFKCJObyBzdGFja3MgZm91bmQuLi4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUZvY3VzZWRTdGFja0lkID09IC0xKSB7CisgICAgICAgICAgICBsb2dFKCJObyBmb2N1c2VkIHN0YWNrIGZvdW5kLi4uIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1SZXN1bWVkQWN0aXZpdHlSZWNvcmQgPT0gbnVsbCkgeworICAgICAgICAgICAgbG9nRSgiTm8gZm9jdXNlZCBhY3Rpdml0eSBmb3VuZC4uLiIpOworICAgICAgICB9CisgICAgICAgIGlmIChtUmVzdW1lZEFjdGl2aXRpZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBsb2dFKCJObyByZXN1bWVkIGFjdGl2aXRpZXMgZm91bmQuLi4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYnl0ZVtdIGV4ZWN1dGVTaGVsbENvbW1hbmQoU3RyaW5nIGNtZCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgcGZkID0KKyAgICAgICAgICAgICAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VWlBdXRvbWF0aW9uKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXhlY3V0ZVNoZWxsQ29tbWFuZChjbWQpOworICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzUxMl07CisgICAgICAgICAgICBpbnQgYnl0ZXNSZWFkOworICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG5ldyBQYXJjZWxGaWxlRGVzY3JpcHRvci5BdXRvQ2xvc2VJbnB1dFN0cmVhbShwZmQpOworICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHN0ZG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIHdoaWxlICgoYnl0ZXNSZWFkID0gZmlzLnJlYWQoYnVmKSkgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBzdGRvdXQud3JpdGUoYnVmLCAwLCBieXRlc1JlYWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmlzLmNsb3NlKCk7CisgICAgICAgICAgICByZXR1cm4gc3Rkb3V0LnRvQnl0ZUFycmF5KCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlU3lzRHVtcFByb3RvKGJ5dGVbXSBzeXNEdW1wKSB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyTmFub0V4Y2VwdGlvbiB7CisgICAgICAgIHJlc2V0KCk7CisKKyAgICAgICAgQWN0aXZpdHlTdGFja1N1cGVydmlzb3JQcm90byBzdGF0ZSA9IEFjdGl2aXR5TWFuYWdlclNlcnZpY2VEdW1wQWN0aXZpdGllc1Byb3RvLnBhcnNlRnJvbShzeXNEdW1wKQorICAgICAgICAgICAgICAgIC5hY3Rpdml0eVN0YWNrU3VwZXJ2aXNvcjsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0ZS5kaXNwbGF5cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgQWN0aXZpdHlEaXNwbGF5UHJvdG8gYWN0aXZpdHlEaXNwbGF5ID0gc3RhdGUuZGlzcGxheXNbaV07CisgICAgICAgICAgICBtRGlzcGxheXMuYWRkKG5ldyBBY3Rpdml0eURpc3BsYXkoYWN0aXZpdHlEaXNwbGF5LCB0aGlzKSk7CisgICAgICAgIH0KKyAgICAgICAgbUtleWd1YXJkQ29udHJvbGxlclN0YXRlID0gbmV3IEtleWd1YXJkQ29udHJvbGxlclN0YXRlKHN0YXRlLmtleWd1YXJkQ29udHJvbGxlcik7CisgICAgICAgIG1Gb2N1c2VkU3RhY2tJZCA9IHN0YXRlLmZvY3VzZWRTdGFja0lkOworICAgICAgICBpZiAoc3RhdGUucmVzdW1lZEFjdGl2aXR5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1SZXN1bWVkQWN0aXZpdHlSZWNvcmQgPSBzdGF0ZS5yZXN1bWVkQWN0aXZpdHkudGl0bGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVzZXQoKSB7CisgICAgICAgIG1EaXNwbGF5cy5jbGVhcigpOworICAgICAgICBtU3RhY2tzLmNsZWFyKCk7CisgICAgICAgIG1Gb2N1c2VkU3RhY2tJZCA9IC0xOworICAgICAgICBtUmVzdW1lZEFjdGl2aXR5UmVjb3JkID0gbnVsbDsKKyAgICAgICAgbVJlc3VtZWRBY3Rpdml0aWVzLmNsZWFyKCk7CisgICAgICAgIG1LZXlndWFyZENvbnRyb2xsZXJTdGF0ZSA9IG51bGw7CisgICAgfQorCisgICAgaW50IGdldEZvY3VzZWRTdGFja0lkKCkgeworICAgICAgICByZXR1cm4gbUZvY3VzZWRTdGFja0lkOworICAgIH0KKworICAgIFN0cmluZyBnZXRGb2N1c2VkQWN0aXZpdHkoKSB7CisgICAgICAgIHJldHVybiBtUmVzdW1lZEFjdGl2aXR5UmVjb3JkOworICAgIH0KKworICAgIGludCBnZXRSZXN1bWVkQWN0aXZpdGllc0NvdW50KCkgeworICAgICAgICByZXR1cm4gbVJlc3VtZWRBY3Rpdml0aWVzLnNpemUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgS2V5Z3VhcmRDb250cm9sbGVyU3RhdGUgZ2V0S2V5Z3VhcmRDb250cm9sbGVyU3RhdGUoKSB7CisgICAgICAgIHJldHVybiBtS2V5Z3VhcmRDb250cm9sbGVyU3RhdGU7CisgICAgfQorCisgICAgQWN0aXZpdHlTdGFjayBnZXRTdGFja0J5QWN0aXZpdHlUeXBlKGludCBhY3Rpdml0eVR5cGUpIHsKKyAgICAgICAgZm9yIChBY3Rpdml0eVN0YWNrIHN0YWNrIDogbVN0YWNrcykgeworICAgICAgICAgICAgaWYgKGFjdGl2aXR5VHlwZSA9PSBzdGFjay5nZXRBY3Rpdml0eVR5cGUoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGFjazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBMaXN0PEFjdGl2aXR5RGlzcGxheT4gZ2V0RGlzcGxheXMoKSB7CisgICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PD4obURpc3BsYXlzKTsKKyAgICB9CisKKyAgICBMaXN0PEFjdGl2aXR5U3RhY2s+IGdldFN0YWNrcygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8PihtU3RhY2tzKTsKKyAgICB9CisKKyAgICBpbnQgZ2V0U3RhY2tDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIG1TdGFja3Muc2l6ZSgpOworICAgIH0KKworICAgIGJvb2xlYW4gaXNBY3Rpdml0eVZpc2libGUoQ29tcG9uZW50TmFtZSBhY3Rpdml0eU5hbWUpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGZ1bGxOYW1lID0gZ2V0QWN0aXZpdHlOYW1lKGFjdGl2aXR5TmFtZSk7CisgICAgICAgIGZvciAoQWN0aXZpdHlTdGFjayBzdGFjayA6IG1TdGFja3MpIHsKKyAgICAgICAgICAgIGZvciAoQWN0aXZpdHlUYXNrIHRhc2sgOiBzdGFjay5tVGFza3MpIHsKKyAgICAgICAgICAgICAgICBmb3IgKEFjdGl2aXR5IGFjdGl2aXR5IDogdGFzay5tQWN0aXZpdGllcykgeworICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZpdHkubmFtZS5lcXVhbHMoZnVsbE5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWN0aXZpdHkudmlzaWJsZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbGVhbiBpc0hvbWVBY3Rpdml0eVZpc2libGUoKSB7CisgICAgICAgIGZpbmFsIEFjdGl2aXR5IGhvbWVBY3Rpdml0eSA9IGdldEhvbWVBY3Rpdml0eSgpOworICAgICAgICByZXR1cm4gaG9tZUFjdGl2aXR5ICE9IG51bGwgJiYgaG9tZUFjdGl2aXR5LnZpc2libGU7CisgICAgfQorCisgICAgQ29tcG9uZW50TmFtZSBnZXRIb21lQWN0aXZpdHlOYW1lKCkgeworICAgICAgICBBY3Rpdml0eSBhY3Rpdml0eSA9IGdldEhvbWVBY3Rpdml0eSgpOworICAgICAgICBpZiAoYWN0aXZpdHkgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIENvbXBvbmVudE5hbWUudW5mbGF0dGVuRnJvbVN0cmluZyhhY3Rpdml0eS5uYW1lKTsKKyAgICB9CisKKyAgICBBY3Rpdml0eVRhc2sgZ2V0SG9tZVRhc2soKSB7CisgICAgICAgIGZpbmFsIEFjdGl2aXR5U3RhY2sgaG9tZVN0YWNrID0gZ2V0U3RhY2tCeUFjdGl2aXR5VHlwZShBQ1RJVklUWV9UWVBFX0hPTUUpOworICAgICAgICBpZiAoaG9tZVN0YWNrICE9IG51bGwgJiYgIWhvbWVTdGFjay5tVGFza3MuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gaG9tZVN0YWNrLm1UYXNrcy5nZXQoMCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBBY3Rpdml0eSBnZXRIb21lQWN0aXZpdHkoKSB7CisgICAgICAgIGZpbmFsIEFjdGl2aXR5VGFzayBob21lVGFzayA9IGdldEhvbWVUYXNrKCk7CisgICAgICAgIHJldHVybiBob21lVGFzayAhPSBudWxsID8gaG9tZVRhc2subUFjdGl2aXRpZXMuZ2V0KGhvbWVUYXNrLm1BY3Rpdml0aWVzLnNpemUoKSAtIDEpIDogbnVsbDsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgQWN0aXZpdHlEaXNwbGF5IGV4dGVuZHMgQWN0aXZpdHlDb250YWluZXIgeworCisgICAgICAgIGludCBtSWQ7CisgICAgICAgIEFycmF5TGlzdDxBY3Rpdml0eVN0YWNrPiBtU3RhY2tzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICAgICAgQWN0aXZpdHlEaXNwbGF5KEFjdGl2aXR5RGlzcGxheVByb3RvIHByb3RvLCBBY3Rpdml0eU1hbmFnZXJTdGF0ZSBhbVN0YXRlKSB7CisgICAgICAgICAgICBzdXBlcihwcm90by5jb25maWd1cmF0aW9uQ29udGFpbmVyKTsKKyAgICAgICAgICAgIG1JZCA9IHByb3RvLmlkOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm90by5zdGFja3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBBY3Rpdml0eVN0YWNrIGFjdGl2aXR5U3RhY2sgPSBuZXcgQWN0aXZpdHlTdGFjayhwcm90by5zdGFja3NbaV0pOworICAgICAgICAgICAgICAgIG1TdGFja3MuYWRkKGFjdGl2aXR5U3RhY2spOworICAgICAgICAgICAgICAgIC8vIEFsc28gdXBkYXRlIGFjdGl2aXR5IG1hbmFnZXIgc3RhdGUKKyAgICAgICAgICAgICAgICBhbVN0YXRlLm1TdGFja3MuYWRkKGFjdGl2aXR5U3RhY2spOworICAgICAgICAgICAgICAgIGlmIChhY3Rpdml0eVN0YWNrLm1SZXN1bWVkQWN0aXZpdHkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBhbVN0YXRlLm1SZXN1bWVkQWN0aXZpdGllcy5hZGQoYWN0aXZpdHlTdGFjay5tUmVzdW1lZEFjdGl2aXR5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgQWN0aXZpdHlTdGFjayBleHRlbmRzIEFjdGl2aXR5Q29udGFpbmVyIHsKKworICAgICAgICBpbnQgbURpc3BsYXlJZDsKKyAgICAgICAgaW50IG1TdGFja0lkOworICAgICAgICBTdHJpbmcgbVJlc3VtZWRBY3Rpdml0eTsKKyAgICAgICAgQXJyYXlMaXN0PEFjdGl2aXR5VGFzaz4gbVRhc2tzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICAgICAgQWN0aXZpdHlTdGFjayhBY3Rpdml0eVN0YWNrUHJvdG8gcHJvdG8pIHsKKyAgICAgICAgICAgIHN1cGVyKHByb3RvLmNvbmZpZ3VyYXRpb25Db250YWluZXIpOworICAgICAgICAgICAgbVN0YWNrSWQgPSBwcm90by5pZDsKKyAgICAgICAgICAgIG1EaXNwbGF5SWQgPSBwcm90by5kaXNwbGF5SWQ7CisgICAgICAgICAgICBtQm91bmRzID0gZXh0cmFjdChwcm90by5ib3VuZHMpOworICAgICAgICAgICAgbUZ1bGxzY3JlZW4gPSBwcm90by5mdWxsc2NyZWVuOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm90by50YXNrcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIG1UYXNrcy5hZGQobmV3IEFjdGl2aXR5VGFzayhwcm90by50YXNrc1tpXSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHByb3RvLnJlc3VtZWRBY3Rpdml0eSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVJlc3VtZWRBY3Rpdml0eSA9IHByb3RvLnJlc3VtZWRBY3Rpdml0eS50aXRsZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIExpc3Q8QWN0aXZpdHlUYXNrPiBnZXRUYXNrcygpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PD4obVRhc2tzKTsKKyAgICAgICAgfQorCisgICAgICAgIEFjdGl2aXR5VGFzayBnZXRUYXNrKGludCB0YXNrSWQpIHsKKyAgICAgICAgICAgIGZvciAoQWN0aXZpdHlUYXNrIHRhc2sgOiBtVGFza3MpIHsKKyAgICAgICAgICAgICAgICBpZiAodGFza0lkID09IHRhc2subVRhc2tJZCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFzazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBBY3Rpdml0eVRhc2sgZXh0ZW5kcyBBY3Rpdml0eUNvbnRhaW5lciB7CisKKyAgICAgICAgaW50IG1UYXNrSWQ7CisgICAgICAgIGludCBtU3RhY2tJZDsKKyAgICAgICAgUmVjdCBtTGFzdE5vbkZ1bGxzY3JlZW5Cb3VuZHM7CisgICAgICAgIFN0cmluZyBtUmVhbEFjdGl2aXR5OworICAgICAgICBTdHJpbmcgbU9yaWdBY3Rpdml0eTsKKyAgICAgICAgQXJyYXlMaXN0PEFjdGl2aXR5PiBtQWN0aXZpdGllcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBpbnQgbVRhc2tUeXBlID0gLTE7CisgICAgICAgIHByaXZhdGUgaW50IG1SZXNpemVNb2RlOworCisgICAgICAgIEFjdGl2aXR5VGFzayhUYXNrUmVjb3JkUHJvdG8gcHJvdG8pIHsKKyAgICAgICAgICAgIHN1cGVyKHByb3RvLmNvbmZpZ3VyYXRpb25Db250YWluZXIpOworICAgICAgICAgICAgbVRhc2tJZCA9IHByb3RvLmlkOworICAgICAgICAgICAgbVN0YWNrSWQgPSBwcm90by5zdGFja0lkOworICAgICAgICAgICAgbUxhc3ROb25GdWxsc2NyZWVuQm91bmRzID0gZXh0cmFjdChwcm90by5sYXN0Tm9uRnVsbHNjcmVlbkJvdW5kcyk7CisgICAgICAgICAgICBtUmVhbEFjdGl2aXR5ID0gcHJvdG8ucmVhbEFjdGl2aXR5OworICAgICAgICAgICAgbU9yaWdBY3Rpdml0eSA9IHByb3RvLm9yaWdBY3Rpdml0eTsKKyAgICAgICAgICAgIG1UYXNrVHlwZSA9IHByb3RvLmFjdGl2aXR5VHlwZTsKKyAgICAgICAgICAgIG1SZXNpemVNb2RlID0gcHJvdG8ucmVzaXplTW9kZTsKKyAgICAgICAgICAgIG1GdWxsc2NyZWVuID0gcHJvdG8uZnVsbHNjcmVlbjsKKyAgICAgICAgICAgIG1Cb3VuZHMgPSBleHRyYWN0KHByb3RvLmJvdW5kcyk7CisgICAgICAgICAgICBtTWluV2lkdGggPSBwcm90by5taW5XaWR0aDsKKyAgICAgICAgICAgIG1NaW5IZWlnaHQgPSBwcm90by5taW5IZWlnaHQ7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCBwcm90by5hY3Rpdml0aWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgbUFjdGl2aXRpZXMuYWRkKG5ldyBBY3Rpdml0eShwcm90by5hY3Rpdml0aWVzW2ldKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldFJlc2l6ZU1vZGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbVJlc2l6ZU1vZGU7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5Q29udGFpbmVyIHsKKworICAgICAgICBTdHJpbmcgbmFtZTsKKyAgICAgICAgU3RyaW5nIHN0YXRlOworICAgICAgICBib29sZWFuIHZpc2libGU7CisgICAgICAgIGJvb2xlYW4gZnJvbnRPZlRhc2s7CisgICAgICAgIGludCBwcm9jSWQgPSAtMTsKKworICAgICAgICBBY3Rpdml0eShBY3Rpdml0eVJlY29yZFByb3RvIHByb3RvKSB7CisgICAgICAgICAgICBzdXBlcihwcm90by5jb25maWd1cmF0aW9uQ29udGFpbmVyKTsKKyAgICAgICAgICAgIG5hbWUgPSBwcm90by5pZGVudGlmaWVyLnRpdGxlOworICAgICAgICAgICAgc3RhdGUgPSBwcm90by5zdGF0ZTsKKyAgICAgICAgICAgIHZpc2libGUgPSBwcm90by52aXNpYmxlOworICAgICAgICAgICAgZnJvbnRPZlRhc2sgPSBwcm90by5mcm9udE9mVGFzazsKKyAgICAgICAgICAgIGlmIChwcm90by5wcm9jSWQgIT0gMCkgeworICAgICAgICAgICAgICAgIHByb2NJZCA9IHByb3RvLnByb2NJZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBBY3Rpdml0eUNvbnRhaW5lciBleHRlbmRzIFdpbmRvd01hbmFnZXJTdGF0ZS5Db25maWd1cmF0aW9uQ29udGFpbmVyIHsKKyAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gbUZ1bGxzY3JlZW47CisgICAgICAgIHByb3RlY3RlZCBSZWN0IG1Cb3VuZHM7CisgICAgICAgIHByb3RlY3RlZCBpbnQgbU1pbldpZHRoID0gLTE7CisgICAgICAgIHByb3RlY3RlZCBpbnQgbU1pbkhlaWdodCA9IC0xOworCisgICAgICAgIEFjdGl2aXR5Q29udGFpbmVyKENvbmZpZ3VyYXRpb25Db250YWluZXJQcm90byBwcm90bykgeworICAgICAgICAgICAgc3VwZXIocHJvdG8pOworICAgICAgICB9CisKKyAgICAgICAgUmVjdCBnZXRCb3VuZHMoKSB7CisgICAgICAgICAgICByZXR1cm4gbUJvdW5kczsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gaXNGdWxsc2NyZWVuKCkgeworICAgICAgICAgICAgcmV0dXJuIG1GdWxsc2NyZWVuOworICAgICAgICB9CisKKyAgICAgICAgaW50IGdldE1pbldpZHRoKCkgeworICAgICAgICAgICAgcmV0dXJuIG1NaW5XaWR0aDsKKyAgICAgICAgfQorCisgICAgICAgIGludCBnZXRNaW5IZWlnaHQoKSB7CisgICAgICAgICAgICByZXR1cm4gbU1pbkhlaWdodDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBLZXlndWFyZENvbnRyb2xsZXJTdGF0ZSB7CisKKyAgICAgICAgYm9vbGVhbiBrZXlndWFyZFNob3dpbmcgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBrZXlndWFyZE9jY2x1ZGVkID0gZmFsc2U7CisKKyAgICAgICAgS2V5Z3VhcmRDb250cm9sbGVyU3RhdGUoS2V5Z3VhcmRDb250cm9sbGVyUHJvdG8gcHJvdG8pIHsKKyAgICAgICAgICAgIGlmIChwcm90byAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAga2V5Z3VhcmRTaG93aW5nID0gcHJvdG8ua2V5Z3VhcmRTaG93aW5nOworICAgICAgICAgICAgICAgIGtleWd1YXJkT2NjbHVkZWQgPSBwcm90by5rZXlndWFyZE9jY2x1ZGVkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMva2V5c3RvcmUvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlclRlc3RCYXNlLmphdmEgYi90ZXN0cy90ZXN0cy9rZXlzdG9yZS9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlNYW5hZ2VyVGVzdEJhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmMwN2ZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMva2V5c3RvcmUvc3JjL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlclRlc3RCYXNlLmphdmEKQEAgLTAsMCArMSw0MTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW07CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuV2luZG93Q29uZmlndXJhdGlvbi5BQ1RJVklUWV9UWVBFX0FTU0lTVEFOVDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuV2luZG93Q29uZmlndXJhdGlvbi5BQ1RJVklUWV9UWVBFX1JFQ0VOVFM7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLldpbmRvd0NvbmZpZ3VyYXRpb24uQUNUSVZJVFlfVFlQRV9TVEFOREFSRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuV2luZG93Q29uZmlndXJhdGlvbi5BQ1RJVklUWV9UWVBFX1VOREVGSU5FRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50TmFtZVV0aWxzLmdldEFjdGl2aXR5TmFtZTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50TmFtZVV0aWxzLmdldFdpbmRvd05hbWU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLlN0YXRlTG9nZ2VyLmxvZzsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uU3RhdGVMb2dnZXIubG9nQWx3YXlzOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5TdGF0ZUxvZ2dlci5sb2dFOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5VaURldmljZVV0aWxzLnByZXNzQmFja0J1dHRvbjsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uVWlEZXZpY2VVdGlscy5wcmVzc0VudGVyQnV0dG9uOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5VaURldmljZVV0aWxzLnByZXNzSG9tZUJ1dHRvbjsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uVWlEZXZpY2VVdGlscy5wcmVzc1NsZWVwQnV0dG9uOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5VaURldmljZVV0aWxzLnByZXNzVW5sb2NrQnV0dG9uOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5VaURldmljZVV0aWxzLnByZXNzV2FrZXVwQnV0dG9uOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5VaURldmljZVV0aWxzLndhaXRGb3JEZXZpY2VJZGxlOworCitpbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlN5c3RlbVV0aWw7CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBY3Rpdml0eU1hbmFnZXJUZXN0QmFzZSB7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBBTExfQUNUSVZJVFlfVFlQRV9CVVRfSE9NRSA9IHsKKyAgICAgICAgICAgIEFDVElWSVRZX1RZUEVfU1RBTkRBUkQsIEFDVElWSVRZX1RZUEVfQVNTSVNUQU5ULCBBQ1RJVklUWV9UWVBFX1JFQ0VOVFMsCisgICAgICAgICAgICBBQ1RJVklUWV9UWVBFX1VOREVGSU5FRAorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19JRF9QUkVGSVggPSAidGFza0lkIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTV9TVEFDS19MSVNUID0gImFtIHN0YWNrIGxpc3QiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFNX0ZPUkNFX1NUT1BfVEVTVF9QQUNLQUdFID0gImFtIGZvcmNlLXN0b3AgYW5kcm9pZC5zZXJ2ZXIuYW0iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTV9GT1JDRV9TVE9QX1NFQ09ORF9URVNUX1BBQ0tBR0UKKyAgICAgICAgICAgID0gImFtIGZvcmNlLXN0b3AgYW5kcm9pZC5zZXJ2ZXIuYW0uc2Vjb25kIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU1fRk9SQ0VfU1RPUF9USElSRF9URVNUX1BBQ0tBR0UKKyAgICAgICAgICAgID0gImFtIGZvcmNlLXN0b3AgYW5kcm9pZC5zZXJ2ZXIuYW0udGhpcmQiOworCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU1fU1RBUlRfSE9NRV9BQ1RJVklUWV9DT01NQU5EID0KKyAgICAgICAgICAgICJhbSBzdGFydCAtYSBhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiAtYyBhbmRyb2lkLmludGVudC5jYXRlZ29yeS5IT01FIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NLX0NSRURFTlRJQUwgPSAiMTIzNCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVUlfTU9ERV9UWVBFX01BU0sgPSAweDBmOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVSV9NT0RFX1RZUEVfVlJfSEVBRFNFVCA9IDB4MDc7CisKKyAgICBwcm90ZWN0ZWQgQ29udGV4dCBtQ29udGV4dDsKKyAgICBwcm90ZWN0ZWQgQWN0aXZpdHlNYW5hZ2VyIG1BbTsKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGFtIGNvbW1hbmQgdG8gc3RhcnQgdGhlIGdpdmVuIGFjdGl2aXR5IHdpdGggdGhlIGZvbGxvd2luZyBleHRyYSBrZXkvdmFsdWUgcGFpcnMuCisgICAgICogICAgICAgICB7QHBhcmFtIGtleVZhbHVlUGFpcnN9IG11c3QgYmUgYSBsaXN0IG9mIGFyZ3VtZW50cyBkZWZpbmluZyBlYWNoIGtleS92YWx1ZSBleHRyYS4KKyAgICAgKi8KKyAgICAvLyBUT0RPOiBNYWtlIHRoaXMgbW9yZSBnZW5lcmljLCBmb3IgaW5zdGFuY2UgYWNjZXB0aW5nIGZsYWdzIG9yIGV4dHJhcyBvZiBvdGhlciB0eXBlcy4KKyAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRBbVN0YXJ0Q21kKGZpbmFsIENvbXBvbmVudE5hbWUgYWN0aXZpdHlOYW1lLAorICAgICAgICAgICAgZmluYWwgU3RyaW5nLi4uIGtleVZhbHVlUGFpcnMpIHsKKyAgICAgICAgcmV0dXJuIGdldEFtU3RhcnRDbWRJbnRlcm5hbChnZXRBY3Rpdml0eU5hbWUoYWN0aXZpdHlOYW1lKSwga2V5VmFsdWVQYWlycyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEFtU3RhcnRDbWRJbnRlcm5hbChmaW5hbCBTdHJpbmcgYWN0aXZpdHlOYW1lLAorICAgICAgICAgICAgZmluYWwgU3RyaW5nLi4uIGtleVZhbHVlUGFpcnMpIHsKKyAgICAgICAgcmV0dXJuIGFwcGVuZEtleVZhbHVlUGFpcnMoCisgICAgICAgICAgICAgICAgbmV3IFN0cmluZ0J1aWxkZXIoImFtIHN0YXJ0IC1uICIpLmFwcGVuZChhY3Rpdml0eU5hbWUpLAorICAgICAgICAgICAgICAgIGtleVZhbHVlUGFpcnMpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBhcHBlbmRLZXlWYWx1ZVBhaXJzKAorICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBjbWQsIGZpbmFsIFN0cmluZy4uLiBrZXlWYWx1ZVBhaXJzKSB7CisgICAgICAgIGlmIChrZXlWYWx1ZVBhaXJzLmxlbmd0aCAlIDIgIT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImtleVZhbHVlUGFpcnMgbXVzdCBiZSBwYWlycyBvZiBrZXkvdmFsdWUgYXJndW1lbnRzIik7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlWYWx1ZVBhaXJzLmxlbmd0aDsgaSArPSAyKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcga2V5ID0ga2V5VmFsdWVQYWlyc1tpXTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZSA9IGtleVZhbHVlUGFpcnNbaSArIDFdOworICAgICAgICAgICAgY21kLmFwcGVuZCgiIC0tZXMgIikKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChrZXkpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIiAiKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY21kLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEFjdGl2aXR5QW5kV2luZG93TWFuYWdlcnNTdGF0ZSBtQW1XbVN0YXRlID0gbmV3IEFjdGl2aXR5QW5kV2luZG93TWFuYWdlcnNTdGF0ZSgpOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1Db250ZXh0ID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpOworICAgICAgICBtQW0gPSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKEFjdGl2aXR5TWFuYWdlci5jbGFzcyk7CisKKyAgICAgICAgcHJlc3NXYWtldXBCdXR0b24oKTsKKyAgICAgICAgcHJlc3NVbmxvY2tCdXR0b24oKTsKKyAgICAgICAgcHJlc3NIb21lQnV0dG9uKCk7CisgICAgICAgIHJlbW92ZVN0YWNrc1dpdGhBY3Rpdml0eVR5cGVzKEFMTF9BQ1RJVklUWV9UWVBFX0JVVF9IT01FKTsKKyAgICB9CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBTeW5jaHJvbm91cyBleGVjdXRpb24gb2YgcmVtb3ZlU3RhY2tzV2l0aEFjdGl2aXR5VHlwZXMoKSBlbnN1cmVzIHRoYXQgYWxsIGFjdGl2aXRpZXMgYnV0CisgICAgICAgIC8vIGhvbWUgYXJlIGNsZWFuZWQgdXAgZnJvbSB0aGUgc3RhY2sgYXQgdGhlIGVuZCBvZiBlYWNoIHRlc3QuIEFtIGZvcmNlIHN0b3Agc2hlbGwgY29tbWFuZHMKKyAgICAgICAgLy8gbWlnaHQgYmUgYXN5bmNocm9ub3VzIGFuZCBjb3VsZCBpbnRlcnJ1cHQgdGhlIHN0YWNrIGNsZWFudXAgcHJvY2VzcyBpZiBleGVjdXRlZCBmaXJzdC4KKyAgICAgICAgcmVtb3ZlU3RhY2tzV2l0aEFjdGl2aXR5VHlwZXMoQUxMX0FDVElWSVRZX1RZUEVfQlVUX0hPTUUpOworICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKEFNX0ZPUkNFX1NUT1BfVEVTVF9QQUNLQUdFKTsKKyAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChBTV9GT1JDRV9TVE9QX1NFQ09ORF9URVNUX1BBQ0tBR0UpOworICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKEFNX0ZPUkNFX1NUT1BfVEhJUkRfVEVTVF9QQUNLQUdFKTsKKyAgICAgICAgcHJlc3NIb21lQnV0dG9uKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU3RhY2tzV2l0aEFjdGl2aXR5VHlwZXMoaW50Li4uIGFjdGl2aXR5VHlwZXMpIHsKKyAgICAgICAgbUFtLnJlbW92ZVN0YWNrc1dpdGhBY3Rpdml0eVR5cGVzKGFjdGl2aXR5VHlwZXMpOworICAgICAgICB3YWl0Rm9ySWRsZSgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4ZWN1dGVTaGVsbENvbW1hbmQoU3RyaW5nIGNvbW1hbmQpIHsKKyAgICAgICAgbG9nKCJTaGVsbCBjb21tYW5kOiAiICsgY29tbWFuZCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gU3lzdGVtVXRpbAorICAgICAgICAgICAgICAgICAgICAucnVuU2hlbGxDb21tYW5kKEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLCBjb21tYW5kKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy9idWJibGUgaXQgdXAKKyAgICAgICAgICAgIGxvZ0UoIkVycm9yIHJ1bm5pbmcgc2hlbGwgY29tbWFuZDogIiArIGNvbW1hbmQpOworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBsYXVuY2hBY3Rpdml0eShmaW5hbCBDb21wb25lbnROYW1lIGFjdGl2aXR5TmFtZSwgZmluYWwgU3RyaW5nLi4uIGtleVZhbHVlUGFpcnMpIHsKKyAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChnZXRBbVN0YXJ0Q21kKGFjdGl2aXR5TmFtZSwga2V5VmFsdWVQYWlycykpOworICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JWYWxpZFN0YXRlKG5ldyBXYWl0Rm9yVmFsaWRBY3Rpdml0eVN0YXRlKGFjdGl2aXR5TmFtZSkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgd2FpdEZvcklkbGUoKSB7CisgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLndhaXRGb3JJZGxlU3luYygpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGxhdW5jaEhvbWVBY3Rpdml0eSgpIHsKKyAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChBTV9TVEFSVF9IT01FX0FDVElWSVRZX0NPTU1BTkQpOworICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JIb21lQWN0aXZpdHlWaXNpYmxlKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgbGF1bmNoQWN0aXZpdHkoQ29tcG9uZW50TmFtZSBhY3Rpdml0eU5hbWUsIGludCB3aW5kb3dpbmdNb2RlLAorICAgICAgICAgICAgZmluYWwgU3RyaW5nLi4uIGtleVZhbHVlUGFpcnMpIHsKKyAgICAgICAgZXhlY3V0ZVNoZWxsQ29tbWFuZChnZXRBbVN0YXJ0Q21kKGFjdGl2aXR5TmFtZSwga2V5VmFsdWVQYWlycykKKyAgICAgICAgICAgICAgICArICIgLS13aW5kb3dpbmdNb2RlICIgKyB3aW5kb3dpbmdNb2RlKTsKKyAgICAgICAgbUFtV21TdGF0ZS53YWl0Rm9yVmFsaWRTdGF0ZShuZXcgV2FpdEZvclZhbGlkQWN0aXZpdHlTdGF0ZS5CdWlsZGVyKGFjdGl2aXR5TmFtZSkKKyAgICAgICAgICAgICAgICAuc2V0V2luZG93aW5nTW9kZSh3aW5kb3dpbmdNb2RlKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRBY3Rpdml0eVRhc2tXaW5kb3dpbmdNb2RlKENvbXBvbmVudE5hbWUgYWN0aXZpdHlOYW1lLCBpbnQgd2luZG93aW5nTW9kZSkgeworICAgICAgICBmaW5hbCBpbnQgdGFza0lkID0gZ2V0QWN0aXZpdHlUYXNrSWQoYWN0aXZpdHlOYW1lKTsKKyAgICAgICAgbUFtLnNldFRhc2tXaW5kb3dpbmdNb2RlKHRhc2tJZCwgd2luZG93aW5nTW9kZSwgdHJ1ZSAvKiB0b1RvcCAqLyk7CisgICAgICAgIG1BbVdtU3RhdGUud2FpdEZvclZhbGlkU3RhdGUobmV3IFdhaXRGb3JWYWxpZEFjdGl2aXR5U3RhdGUuQnVpbGRlcihhY3Rpdml0eU5hbWUpCisgICAgICAgICAgICAgICAgLnNldEFjdGl2aXR5VHlwZShBQ1RJVklUWV9UWVBFX1NUQU5EQVJEKQorICAgICAgICAgICAgICAgIC5zZXRXaW5kb3dpbmdNb2RlKHdpbmRvd2luZ01vZGUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIEBEZXByZWNhdGVkCisgICAgcHJvdGVjdGVkIGludCBnZXRBY3Rpdml0eVRhc2tJZChmaW5hbCBDb21wb25lbnROYW1lIGFjdGl2aXR5TmFtZSkgeworICAgICAgICBmaW5hbCBTdHJpbmcgd2luZG93TmFtZSA9IGdldFdpbmRvd05hbWUoYWN0aXZpdHlOYW1lKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIG91dHB1dCA9IGV4ZWN1dGVTaGVsbENvbW1hbmQoQU1fU1RBQ0tfTElTVCk7CisgICAgICAgIGZpbmFsIFBhdHRlcm4gYWN0aXZpdHlQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCIoLiopICIgKyB3aW5kb3dOYW1lICsgIiAoLiopIik7CisgICAgICAgIGZvciAoZmluYWwgU3RyaW5nIGxpbmUgOiBvdXRwdXQuc3BsaXQoIlxcbiIpKSB7CisgICAgICAgICAgICBmaW5hbCBNYXRjaGVyIG1hdGNoZXIgPSBhY3Rpdml0eVBhdHRlcm4ubWF0Y2hlcihsaW5lKTsKKyAgICAgICAgICAgIGlmIChtYXRjaGVyLm1hdGNoZXMoKSkgeworICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHdvcmQgOiBsaW5lLnNwbGl0KCJcXHMrIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmQuc3RhcnRzV2l0aChUQVNLX0lEX1BSRUZJWCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB3aXRoQ29sb24gPSB3b3JkLnNwbGl0KCI9IilbMV07CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSW50ZWdlci5wYXJzZUludCh3aXRoQ29sb24uc3Vic3RyaW5nKDAsIHdpdGhDb2xvbi5sZW5ndGgoKSAtIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNUYWJsZXQoKSB7CisgICAgICAgIC8vIExhcmdlciB0aGFuIGFwcHJveCA3IiB0YWJsZXRzCisgICAgICAgIHJldHVybiBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRDb25maWd1cmF0aW9uKCkuc21hbGxlc3RTY3JlZW5XaWR0aERwID49IDYwMDsKKyAgICB9CisKKyAgICAvLyBUT0RPOiBTd2l0Y2ggdG8gdXNpbmcgYSBmZWF0dXJlIGZsYWcsIHdoZW4gYXZhaWxhYmxlLgorICAgIHByb3RlY3RlZCBib29sZWFuIGlzVWlNb2RlTG9ja2VkVG9WckhlYWRzZXQoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBvdXRwdXQgPSBydW5Db21tYW5kQW5kUHJpbnRPdXRwdXQoImR1bXBzeXMgdWltb2RlIik7CisKKyAgICAgICAgSW50ZWdlciBjdXJVaU1vZGUgPSBudWxsOworICAgICAgICBCb29sZWFuIHVpTW9kZUxvY2tlZCA9IG51bGw7CisgICAgICAgIGZvciAoU3RyaW5nIGxpbmUgOiBvdXRwdXQuc3BsaXQoIlxcbiIpKSB7CisgICAgICAgICAgICBsaW5lID0gbGluZS50cmltKCk7CisgICAgICAgICAgICBNYXRjaGVyIG1hdGNoZXIgPSBzQ3VycmVudFVpTW9kZVBhdHRlcm4ubWF0Y2hlcihsaW5lKTsKKyAgICAgICAgICAgIGlmIChtYXRjaGVyLmZpbmQoKSkgeworICAgICAgICAgICAgICAgIGN1clVpTW9kZSA9IEludGVnZXIucGFyc2VJbnQobWF0Y2hlci5ncm91cCgxKSwgMTYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2hlciA9IHNVaU1vZGVMb2NrZWRQYXR0ZXJuLm1hdGNoZXIobGluZSk7CisgICAgICAgICAgICBpZiAobWF0Y2hlci5maW5kKCkpIHsKKyAgICAgICAgICAgICAgICB1aU1vZGVMb2NrZWQgPSBtYXRjaGVyLmdyb3VwKDEpLmVxdWFscygidHJ1ZSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiB1aU1vZGVMb2NrZWRUb1ZySGVhZHNldCA9IChjdXJVaU1vZGUgIT0gbnVsbCkgJiYgKHVpTW9kZUxvY2tlZCAhPSBudWxsKQorICAgICAgICAgICAgICAgICYmICgoY3VyVWlNb2RlICYgVUlfTU9ERV9UWVBFX01BU0spID09IFVJX01PREVfVFlQRV9WUl9IRUFEU0VUKSAmJiB1aU1vZGVMb2NrZWQ7CisKKyAgICAgICAgaWYgKHVpTW9kZUxvY2tlZFRvVnJIZWFkc2V0KSB7CisgICAgICAgICAgICBsb2coIlVJIG1vZGUgaXMgbG9ja2VkIHRvIFZSIGhlYWRzZXQiKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB1aU1vZGVMb2NrZWRUb1ZySGVhZHNldDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0c1NwbGl0U2NyZWVuTXVsdGlXaW5kb3coKSB7CisgICAgICAgIHJldHVybiBBY3Rpdml0eU1hbmFnZXIuc3VwcG9ydHNTcGxpdFNjcmVlbk11bHRpV2luZG93KG1Db250ZXh0KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNEZXZpY2VGZWF0dXJlKGZpbmFsIFN0cmluZyByZXF1aXJlZEZlYXR1cmUpIHsKKyAgICAgICAgcmV0dXJuIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKQorICAgICAgICAgICAgICAgIC5nZXRQYWNrYWdlTWFuYWdlcigpCisgICAgICAgICAgICAgICAgLmhhc1N5c3RlbUZlYXR1cmUocmVxdWlyZWRGZWF0dXJlKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0Rpc3BsYXlPbigpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIG91dHB1dCA9IGV4ZWN1dGVTaGVsbENvbW1hbmQoImR1bXBzeXMgcG93ZXIiKTsKKyAgICAgICAgZmluYWwgTWF0Y2hlciBtYXRjaGVyID0gc0Rpc3BsYXlTdGF0ZVBhdHRlcm4ubWF0Y2hlcihvdXRwdXQpOworICAgICAgICBpZiAobWF0Y2hlci5maW5kKCkpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzdGF0ZSA9IG1hdGNoZXIuZ3JvdXAoMSk7CisgICAgICAgICAgICBsb2coInBvd2VyIHN0YXRlPSIgKyBzdGF0ZSk7CisgICAgICAgICAgICByZXR1cm4gIk9OIi5lcXVhbHMoc3RhdGUpOworICAgICAgICB9CisgICAgICAgIGxvZ0Fsd2F5cygicG93ZXIgc3RhdGUgOigiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByb3RlY3RlZCBjbGFzcyBMb2NrU2NyZWVuU2Vzc2lvbiBpbXBsZW1lbnRzIEF1dG9DbG9zZWFibGUgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Jc0xvY2tEaXNhYmxlZDsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1Mb2NrQ3JlZGVudGlhbFNldDsKKworICAgICAgICBwdWJsaWMgTG9ja1NjcmVlblNlc3Npb24oKSB7CisgICAgICAgICAgICBtSXNMb2NrRGlzYWJsZWQgPSBpc0xvY2tEaXNhYmxlZCgpOworICAgICAgICAgICAgbUxvY2tDcmVkZW50aWFsU2V0ID0gZmFsc2U7CisgICAgICAgICAgICAvLyBFbmFibGUgbG9jayBzY3JlZW4gKHN3aXBlKSBieSBkZWZhdWx0LgorICAgICAgICAgICAgc2V0TG9ja0Rpc2FibGVkKGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBMb2NrU2NyZWVuU2Vzc2lvbiBzZXRMb2NrQ3JlZGVudGlhbCgpIHsKKyAgICAgICAgICAgIG1Mb2NrQ3JlZGVudGlhbFNldCA9IHRydWU7CisgICAgICAgICAgICBydW5Db21tYW5kQW5kUHJpbnRPdXRwdXQoImxvY2tzZXR0aW5ncyBzZXQtcGluICIgKyBMT0NLX0NSRURFTlRJQUwpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTG9ja1NjcmVlblNlc3Npb24gZW50ZXJBbmRDb25maXJtTG9ja0NyZWRlbnRpYWwoKSB7CisgICAgICAgICAgICB3YWl0Rm9yRGV2aWNlSWRsZSgzMDAwKTsKKworICAgICAgICAgICAgcnVuQ29tbWFuZEFuZFByaW50T3V0cHV0KCJpbnB1dCB0ZXh0ICIgKyBMT0NLX0NSRURFTlRJQUwpOworICAgICAgICAgICAgcHJlc3NFbnRlckJ1dHRvbigpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgcmVtb3ZlTG9ja0NyZWRlbnRpYWwoKSB7CisgICAgICAgICAgICBydW5Db21tYW5kQW5kUHJpbnRPdXRwdXQoImxvY2tzZXR0aW5ncyBjbGVhciAtLW9sZCAiICsgTE9DS19DUkVERU5USUFMKTsKKyAgICAgICAgICAgIG1Mb2NrQ3JlZGVudGlhbFNldCA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgTG9ja1NjcmVlblNlc3Npb24gZGlzYWJsZUxvY2tTY3JlZW4oKSB7CisgICAgICAgICAgICBzZXRMb2NrRGlzYWJsZWQodHJ1ZSk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBMb2NrU2NyZWVuU2Vzc2lvbiBzbGVlcERldmljZSgpIHsKKyAgICAgICAgICAgIHByZXNzU2xlZXBCdXR0b24oKTsKKyAgICAgICAgICAgIC8vIE5vdCBhbGwgZGV2aWNlIHZhcmlhbnRzIGxvY2sgd2hlbiB3ZSBnbyB0byBzbGVlcCwgc28gd2UgbmVlZCB0byBleHBsaWNpdGx5IGxvY2sgdGhlCisgICAgICAgICAgICAvLyBkZXZpY2UuIE5vdGUgdGhhdCBwcmVzc1NsZWVwQnV0dG9uKCkgYWJvdmUgaXMgcmVkdW5kYW50IGJlY2F1c2UgdGhlIGFjdGlvbiBhbHNvCisgICAgICAgICAgICAvLyBwdXRzIHRoZSBkZXZpY2UgdG8gc2xlZXAsIGJ1dCBrZXB0IGFyb3VuZCBmb3IgY2xhcml0eS4KKyAgICAgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLmdldFVpQXV0b21hdGlvbigpLnBlcmZvcm1HbG9iYWxBY3Rpb24oCisgICAgICAgICAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlTZXJ2aWNlLkdMT0JBTF9BQ1RJT05fTE9DS19TQ1JFRU4pOworICAgICAgICAgICAgd2FpdEZvckRpc3BsYXlTdGF0ZVdpdGhSZXRyeShmYWxzZSAvKiBkaXNwbGF5T24gKi8gKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIExvY2tTY3JlZW5TZXNzaW9uIHdha2VVcERldmljZSgpIHsKKyAgICAgICAgICAgIHByZXNzV2FrZXVwQnV0dG9uKCk7CisgICAgICAgICAgICB3YWl0Rm9yRGlzcGxheVN0YXRlV2l0aFJldHJ5KHRydWUgLyogZGlzcGxheU9uICovICk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBJZiB0aGUgZGV2aWNlIGhhcyBhIFBJTiBvciBwYXNzd29yZCBzZXQsIHRoaXMgZG9lc24ndCBpbW1lZGlhdGVseSB1bmxvY2sgdGhlIGRldmljZS4KKyAgICAgICAgICogSW5zdGVhZCwgaXQgc2hvd3MgdGhlIGtleWd1YXJkIGFuZCBicmluZ3MgdGhlIGVudHJ5IGZpZWxkIGludG8gZm9jdXMsIHJlYWR5IGZvciBhCisgICAgICAgICAqIGNhbGwgdG8gZW50ZXJBbmRDb25maXJtTG9ja0NyZWRlbnRpYWwoKS4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCBMb2NrU2NyZWVuU2Vzc2lvbiB1bmxvY2tEZXZpY2UoKSB7CisgICAgICAgICAgICBwcmVzc1VubG9ja0J1dHRvbigpOworICAgICAgICAgICAgU3lzdGVtQ2xvY2suc2xlZXAoMjAwKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIExvY2tTY3JlZW5TZXNzaW9uIGdvdG9LZXlndWFyZCgpIHsKKyAgICAgICAgICAgIGlmIChERUJVRyAmJiBpc0xvY2tEaXNhYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgbG9nRSgiTG9ja1NjcmVlblNlc3Npb24uZ290b0tleWd1YXJkKCkgaXMgY2FsbGVkIHdpdGhvdXQgbG9jayBlbmFibGVkLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2xlZXBEZXZpY2UoKTsKKyAgICAgICAgICAgIHdha2VVcERldmljZSgpOworICAgICAgICAgICAgdW5sb2NrRGV2aWNlKCk7CisgICAgICAgICAgICBtQW1XbVN0YXRlLndhaXRGb3JLZXlndWFyZFNob3dpbmdBbmROb3RPY2NsdWRlZCgpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHNldExvY2tEaXNhYmxlZChtSXNMb2NrRGlzYWJsZWQpOworICAgICAgICAgICAgaWYgKG1Mb2NrQ3JlZGVudGlhbFNldCkgeworICAgICAgICAgICAgICAgIHJlbW92ZUxvY2tDcmVkZW50aWFsKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIERpc21pc3MgYWN0aXZlIGtleWd1YXJkIGFmdGVyIGNyZWRlbnRpYWwgaXMgY2xlYXJlZCwgc28ga2V5Z3VhcmQgZG9lc24ndCBhc2sgZm9yCisgICAgICAgICAgICAvLyB0aGUgc3RhbGUgY3JlZGVudGlhbC4KKyAgICAgICAgICAgIHByZXNzQmFja0J1dHRvbigpOworICAgICAgICAgICAgc2xlZXBEZXZpY2UoKTsKKyAgICAgICAgICAgIHdha2VVcERldmljZSgpOworICAgICAgICAgICAgdW5sb2NrRGV2aWNlKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBsb2NrIHNjcmVlbiBpcyBkaXNhYmxlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBsb2NrIHNjcmVlbiBpcyBkaXNhYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzTG9ja0Rpc2FibGVkKCkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGlzTG9ja0Rpc2FibGVkID0gcnVuQ29tbWFuZEFuZFByaW50T3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAibG9ja3NldHRpbmdzIGdldC1kaXNhYmxlZCIpLnRyaW0oKTsKKyAgICAgICAgICAgIHJldHVybiAhIm51bGwiLmVxdWFscyhpc0xvY2tEaXNhYmxlZCkgJiYgQm9vbGVhbi5wYXJzZUJvb2xlYW4oaXNMb2NrRGlzYWJsZWQpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIERpc2FibGUgdGhlIGxvY2sgc2NyZWVuLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbG9ja0Rpc2FibGVkIHRydWUgaWYgc2hvdWxkIGRpc2FibGUsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHNldExvY2tEaXNhYmxlZChib29sZWFuIGxvY2tEaXNhYmxlZCkgeworICAgICAgICAgICAgcnVuQ29tbWFuZEFuZFByaW50T3V0cHV0KCJsb2Nrc2V0dGluZ3Mgc2V0LWRpc2FibGVkICIgKyBsb2NrRGlzYWJsZWQpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgd2FpdEZvckRpc3BsYXlTdGF0ZVdpdGhSZXRyeShib29sZWFuIGRpc3BsYXlPbikgeworICAgICAgICAgICAgZm9yIChpbnQgcmV0cnkgPSAxOyBpc0Rpc3BsYXlPbigpICE9IGRpc3BsYXlPbiAmJiByZXRyeSA8PSA1OyByZXRyeSsrKSB7CisgICAgICAgICAgICAgICAgbG9nQWx3YXlzKCIqKipXYWl0aW5nIGZvciBkaXNwbGF5IHN0YXRlLi4uIHJldHJ5ICIgKyByZXRyeSk7CisgICAgICAgICAgICAgICAgU3lzdGVtQ2xvY2suc2xlZXAoVGltZVVuaXQuU0VDT05EUy50b01pbGxpcygxKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBydW5Db21tYW5kQW5kUHJpbnRPdXRwdXQoU3RyaW5nIGNvbW1hbmQpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIG91dHB1dCA9IGV4ZWN1dGVTaGVsbENvbW1hbmQoY29tbWFuZCk7CisgICAgICAgIGxvZyhvdXRwdXQpOworICAgICAgICByZXR1cm4gb3V0cHV0OworICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgTG9nU2VwYXJhdG9yIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVVuaXF1ZVN0cmluZzsKKworICAgICAgICBwcml2YXRlIExvZ1NlcGFyYXRvcigpIHsKKyAgICAgICAgICAgIG1VbmlxdWVTdHJpbmcgPSBVVUlELnJhbmRvbVVVSUQoKS50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gbVVuaXF1ZVN0cmluZzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRPRE86IE5vdyB0aGF0IG91ciB0ZXN0IGFyZSBkZXZpY2Ugc2lkZSwgd2UgY2FuIGNvbnZlcnQgdGhlc2UgdG8gYSBtb3JlIGRpcmVjdCBjb21tdW5pY2F0aW9uCisgICAgLy8gY2hhbm5lbCB2cy4gZGVwZW5kaW5nIG9uIGxvZ3MuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBzRGlzcGxheVN0YXRlUGF0dGVybiA9CisgICAgICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoIkRpc3BsYXkgUG93ZXI6IHN0YXRlPSguKykiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHNDdXJyZW50VWlNb2RlUGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgibUN1clVpTW9kZT0weChcXGQrKSIpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gc1VpTW9kZUxvY2tlZFBhdHRlcm4gPQorICAgICAgICAgICAgUGF0dGVybi5jb21waWxlKCJtVWlNb2RlTG9ja2VkPSh0cnVlfGZhbHNlKSIpOworCisgICAgcHJvdGVjdGVkIHZvaWQgc3RvcFRlc3RQYWNrYWdlKGZpbmFsIENvbXBvbmVudE5hbWUgYWN0aXZpdHlOYW1lKSB7CisgICAgICAgIGV4ZWN1dGVTaGVsbENvbW1hbmQoImFtIGZvcmNlLXN0b3AgIiArIGFjdGl2aXR5TmFtZS5nZXRQYWNrYWdlTmFtZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9rZXlzdG9yZS9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vQ29tcG9uZW50TmFtZVV0aWxzLmphdmEgYi90ZXN0cy90ZXN0cy9rZXlzdG9yZS9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vQ29tcG9uZW50TmFtZVV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM5ZjU3MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2tleXN0b3JlL3NyYy9hbmRyb2lkL3NlcnZlci9hbS9Db21wb25lbnROYW1lVXRpbHMuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworCitwdWJsaWMgY2xhc3MgQ29tcG9uZW50TmFtZVV0aWxzIHsKKworICAgIC8qKgorICAgICAqIEdldCBjb21wb25lbnQncyBhY3Rpdml0eSBuYW1lLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgYWN0aXZpdHkgbmFtZSBvZiB7QGNvZGUgY29tcG9uZW50TmFtZX0sIHN1Y2ggYXMgImNvbnRleHRQYWNrYWdlLy5TaW1wbGVDbGFzc05hbWUiCisgICAgICogICAgIG9yICJjb250ZXh0UGFja2FnZS9GdWxseUNsYXNzTmFtZSIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QWN0aXZpdHlOYW1lKENvbXBvbmVudE5hbWUgY29tcG9uZW50TmFtZSkgeworICAgICAgICByZXR1cm4gY29tcG9uZW50TmFtZS5mbGF0dGVuVG9TaG9ydFN0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBjb21wb25lbnQncyB3aW5kb3cgbWFuZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHdpbmRvdyBuYW1lIG9mIHtAY29kZSBjb21wb25lbnROYW1lfSwgc3VjaCB0aGF0ICJjb250ZXh0UGFja2FnZS9GdWxseUNsYXNzTmFtZSIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0V2luZG93TmFtZShDb21wb25lbnROYW1lIGNvbXBvbmVudE5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGNvbXBvbmVudE5hbWUuZmxhdHRlblRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMva2V5c3RvcmUvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1Byb3RvRXh0cmFjdG9ycy5qYXZhIGIvdGVzdHMvdGVzdHMva2V5c3RvcmUvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1Byb3RvRXh0cmFjdG9ycy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MGZjNjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9rZXlzdG9yZS9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vUHJvdG9FeHRyYWN0b3JzLmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLldpbmRvd0NvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC5hcHAubmFuby5XaW5kb3dDb25maWd1cmF0aW9uUHJvdG87CitpbXBvcnQgYW5kcm9pZC5jb250ZW50Lm5hbm8uQ29uZmlndXJhdGlvblByb3RvOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5uYW5vLlJlY3RQcm90bzsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIGZvciBleHRyYWN0aW5nIHNvbWUgY29tbW9uIGZyYW1ld29yayBvYmplY3QgZnJvbSBuYW5vIHByb3RvIG9iamVjdHMuCisgKiBOb3JtYWxseSB0aGUgZXh0cmFjdG9ycyB3aWxsIGJlIGluIHRoZSBmcmFtZXdvcmsgb2JqZWN0IGNsYXNzLCBidXQgd2UgZG9uJ3Qgd2FudCB0aGUgZnJhbWV3b3JrIHRvCisgKiBkZXBlbmQgb24gbmFubyBwcm90byBkdWUgdG8gc2l6ZSBjb3N0LgorICogVE9ETzogVGhpcyBjbGFzcyBzaG91bGQgcHJvYmFibHkgYmUgaW4gZnJhbWV3b3Jrcy9iYXNlL2xpYiBwcm9qZWN0IHNvIGl0IGNhbiBiZSB1c2VkCisgKiBvdXRzaWRlIG9mIENUUy4KKyAqLworcHVibGljIGNsYXNzIFByb3RvRXh0cmFjdG9ycyB7CisgICAgcHVibGljIHN0YXRpYyBDb25maWd1cmF0aW9uIGV4dHJhY3QoQ29uZmlndXJhdGlvblByb3RvIHByb3RvKSB7CisgICAgICAgIGZpbmFsIENvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgaWYgKHByb3RvID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBjb25maWc7CisgICAgICAgIH0KKyAgICAgICAgY29uZmlnLndpbmRvd0NvbmZpZ3VyYXRpb24uc2V0VG8oZXh0cmFjdChwcm90by53aW5kb3dDb25maWd1cmF0aW9uKSk7CisgICAgICAgIGNvbmZpZy5kZW5zaXR5RHBpID0gcHJvdG8uZGVuc2l0eURwaTsKKyAgICAgICAgY29uZmlnLm9yaWVudGF0aW9uID0gcHJvdG8ub3JpZW50YXRpb247CisgICAgICAgIGNvbmZpZy5zY3JlZW5IZWlnaHREcCA9IHByb3RvLnNjcmVlbkhlaWdodERwOworICAgICAgICBjb25maWcuc2NyZWVuV2lkdGhEcCA9IHByb3RvLnNjcmVlbldpZHRoRHA7CisgICAgICAgIGNvbmZpZy5zbWFsbGVzdFNjcmVlbldpZHRoRHAgPSBwcm90by5zbWFsbGVzdFNjcmVlbldpZHRoRHA7CisgICAgICAgIGNvbmZpZy5zY3JlZW5MYXlvdXQgPSBwcm90by5zY3JlZW5MYXlvdXQ7CisgICAgICAgIGNvbmZpZy51aU1vZGUgPSBwcm90by51aU1vZGU7CisgICAgICAgIHJldHVybiBjb25maWc7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBXaW5kb3dDb25maWd1cmF0aW9uIGV4dHJhY3QoV2luZG93Q29uZmlndXJhdGlvblByb3RvIHByb3RvKSB7CisgICAgICAgIGZpbmFsIFdpbmRvd0NvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IFdpbmRvd0NvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgaWYgKHByb3RvID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBjb25maWc7CisgICAgICAgIH0KKyAgICAgICAgY29uZmlnLnNldEFwcEJvdW5kcyhleHRyYWN0KHByb3RvLmFwcEJvdW5kcykpOworICAgICAgICBjb25maWcuc2V0V2luZG93aW5nTW9kZShwcm90by53aW5kb3dpbmdNb2RlKTsKKyAgICAgICAgY29uZmlnLnNldEFjdGl2aXR5VHlwZShwcm90by5hY3Rpdml0eVR5cGUpOworICAgICAgICByZXR1cm4gY29uZmlnOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUmVjdCBleHRyYWN0KFJlY3RQcm90byBwcm90bykgeworICAgICAgICBpZiAocHJvdG8gPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBSZWN0KHByb3RvLmxlZnQsIHByb3RvLnRvcCwgcHJvdG8ucmlnaHQsIHByb3RvLmJvdHRvbSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMva2V5c3RvcmUvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1N0YXRlTG9nZ2VyLmphdmEgYi90ZXN0cy90ZXN0cy9rZXlzdG9yZS9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vU3RhdGVMb2dnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWM5YmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMva2V5c3RvcmUvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1N0YXRlTG9nZ2VyLmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbTsKKworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKy8qKgorICogVXRpbCBjbGFzcyB0byBwZXJmb3JtIHNpbXBsZSBzdGF0ZSBsb2dnaW5nLgorICovCitwdWJsaWMgY2xhc3MgU3RhdGVMb2dnZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBUQUcgPSAiS2V5c3RvcmUiOworCisgICAgLyoqCisgICAgICogU2ltcGxlIGluZm8tbGV2ZWwgbG9nZ2luZyBnYXRlZCBieSB7QGxpbmsgI0RFQlVHfSBmbGFnCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbG9nVGV4dCkgeworICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgbG9nVGV4dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nQWx3YXlzKFN0cmluZyBsb2dUZXh0KSB7CisgICAgICAgIExvZy5pKFRBRywgbG9nVGV4dCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZ0UoU3RyaW5nIGxvZ1RleHQpIHsKKyAgICAgICAgTG9nLmUoVEFHLCBsb2dUZXh0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nRShTdHJpbmcgbG9nVGV4dCwgVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgTG9nLmUoVEFHLCBsb2dUZXh0LCBlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9rZXlzdG9yZS9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vVWlEZXZpY2VVdGlscy5qYXZhIGIvdGVzdHMvdGVzdHMva2V5c3RvcmUvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1VpRGV2aWNlVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWI2YWI4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMva2V5c3RvcmUvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1VpRGV2aWNlVXRpbHMuamF2YQpAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW07CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uU3RhdGVMb2dnZXIubG9nRTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LktleUV2ZW50LktFWUNPREVfQVBQX1NXSVRDSDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LktleUV2ZW50LktFWUNPREVfTUVOVTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LktleUV2ZW50LktFWUNPREVfU0xFRVA7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5LZXlFdmVudC5LRVlDT0RFX1dBS0VVUDsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQ7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5LZXlndWFyZE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb2ludDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBvd2VyTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLlVpRGV2aWNlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKKworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Cb29sZWFuU3VwcGxpZXI7CisKKy8qKgorICogSGVscGVyIGNsYXNzIHRvIGludGVyYWN0IHdpdGgge0BsaW5rIFVpRGV2aWNlfS4KKyAqCisgKiBBbGwgcmVmZXJlbmNlcyB0byB7QGxpbmsgVWlEZXZpY2V9IGFuZCB7QGxpbmsgS2V5RXZlbnR9IHNob3VsZCBiZSBoZXJlIGZvciBlYXN5IGRlYnVnZ2luZy4KKyAqLworcHVibGljIGNsYXNzIFVpRGV2aWNlVXRpbHMgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJVaURldmljZVV0aWxzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7CisKKyAgICBzdGF0aWMgdm9pZCB3YWl0Rm9yRGV2aWNlSWRsZShsb25nIHRpbWVvdXQpIHsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJ3YWl0Rm9yRGV2aWNlSWRsZTogdGltZW91dD0iICsgdGltZW91dCk7CisgICAgICAgIGdldERldmljZSgpLndhaXRGb3JJZGxlKHRpbWVvdXQpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3YWtlVXBEZXZpY2UoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJ3YWtlVXBEZXZpY2UiKTsKKyAgICAgICAgZ2V0RGV2aWNlKCkud2FrZVVwKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGRyYWdQb2ludGVyKFBvaW50IGZyb20sIFBvaW50IHRvLCBpbnQgc3RlcHMpIHsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJkcmFnUG9pbnRlcjogZnJvbT0iICsgZnJvbSArICIgdG89IiArIHRvICsgIiBzdGVwcz0iICsgc3RlcHMpOworICAgICAgICBnZXREZXZpY2UoKS5kcmFnKGZyb20ueCwgZnJvbS55LCB0by54LCB0by55LCBzdGVwcyk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgcHJlc3NFbnRlckJ1dHRvbigpIHsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJwcmVzc0VudGVyQnV0dG9uIik7CisgICAgICAgIGdldERldmljZSgpLnByZXNzRW50ZXIoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBwcmVzc0hvbWVCdXR0b24oKSB7CisgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAicHJlc3NIb21lQnV0dG9uIik7CisgICAgICAgIGdldERldmljZSgpLnByZXNzSG9tZSgpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIHByZXNzQmFja0J1dHRvbigpIHsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJwcmVzc0JhY2tCdXR0b24iKTsKKyAgICAgICAgZ2V0RGV2aWNlKCkucHJlc3NCYWNrKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHByZXNzTWVudUJ1dHRvbigpIHsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJwcmVzc01lbnVCdXR0b24iKTsKKyAgICAgICAgZ2V0RGV2aWNlKCkucHJlc3NNZW51KCk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgcHJlc3NTbGVlcEJ1dHRvbigpIHsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJwcmVzc1NsZWVwQnV0dG9uIik7CisgICAgICAgIGZpbmFsIFBvd2VyTWFuYWdlciBwbSA9IGdldENvbnRleHQoKS5nZXRTeXN0ZW1TZXJ2aWNlKFBvd2VyTWFuYWdlci5jbGFzcyk7CisgICAgICAgIHJldHJ5UHJlc3NLZXlDb2RlKEtFWUNPREVfU0xFRVAsICgpIC0+IHBtICE9IG51bGwgJiYgIXBtLmlzSW50ZXJhY3RpdmUoKSwKKyAgICAgICAgICAgICAgICAiKioqV2FpdGluZyBmb3IgZGV2aWNlIHNsZWVwLi4uIik7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgcHJlc3NXYWtldXBCdXR0b24oKSB7CisgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAicHJlc3NXYWtldXBCdXR0b24iKTsKKyAgICAgICAgZmluYWwgUG93ZXJNYW5hZ2VyIHBtID0gZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoUG93ZXJNYW5hZ2VyLmNsYXNzKTsKKyAgICAgICAgcmV0cnlQcmVzc0tleUNvZGUoS0VZQ09ERV9XQUtFVVAsICgpIC0+IHBtICE9IG51bGwgJiYgcG0uaXNJbnRlcmFjdGl2ZSgpLAorICAgICAgICAgICAgICAgICIqKipXYWl0aW5nIGZvciBkZXZpY2Ugd2FrZXVwLi4uIik7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgcHJlc3NVbmxvY2tCdXR0b24oKSB7CisgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAicHJlc3NVbmxvY2tCdXR0b24iKTsKKyAgICAgICAgZmluYWwgS2V5Z3VhcmRNYW5hZ2VyIGtnbSA9IGdldENvbnRleHQoKS5nZXRTeXN0ZW1TZXJ2aWNlKEtleWd1YXJkTWFuYWdlci5jbGFzcyk7CisgICAgICAgIHJldHJ5UHJlc3NLZXlDb2RlKEtFWUNPREVfTUVOVSwgKCkgLT4ga2dtICE9IG51bGwgJiYgIWtnbS5pc0tleWd1YXJkTG9ja2VkKCksCisgICAgICAgICAgICAgICAgIioqKldhaXRpbmcgZm9yIGRldmljZSB1bmxvY2suLi4iKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBwcmVzc0FwcFN3aXRjaEJ1dHRvbigpIHsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJwcmVzc0FwcFN3aXRjaEJ1dHRvbiIpOworICAgICAgICBwcmVzc0tleUNvZGUoS0VZQ09ERV9BUFBfU1dJVENIKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJldHJ5UHJlc3NLZXlDb2RlKGludCBrZXlDb2RlLCBCb29sZWFuU3VwcGxpZXIgd2FpdEZvciwgU3RyaW5nIG1zZykgeworICAgICAgICBpbnQgcmV0cnkgPSAxOworICAgICAgICBkbyB7CisgICAgICAgICAgICBwcmVzc0tleUNvZGUoa2V5Q29kZSk7CisgICAgICAgICAgICBpZiAod2FpdEZvci5nZXRBc0Jvb2xlYW4oKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExvZy5kKFRBRywgbXNnICsgIiByZXRyeT0iICsgcmV0cnkpOworICAgICAgICAgICAgU3lzdGVtQ2xvY2suc2xlZXAoNTApOworICAgICAgICB9IHdoaWxlIChyZXRyeSsrIDwgNSk7CisgICAgICAgIGlmICghd2FpdEZvci5nZXRBc0Jvb2xlYW4oKSkgeworICAgICAgICAgICAgbG9nRShtc2cgKyAiIEZBSUxFRCIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmVzc0tleUNvZGUoaW50IGtleUNvZGUpIHsKKyAgICAgICAgZ2V0RGV2aWNlKCkucHJlc3NLZXlDb2RlKGtleUNvZGUpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFVpRGV2aWNlIGdldERldmljZSgpIHsKKyAgICAgICAgcmV0dXJuIFVpRGV2aWNlLmdldEluc3RhbmNlKEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9rZXlzdG9yZS9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vV2FpdEZvclZhbGlkQWN0aXZpdHlTdGF0ZS5qYXZhIGIvdGVzdHMvdGVzdHMva2V5c3RvcmUvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1dhaXRGb3JWYWxpZEFjdGl2aXR5U3RhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTgwNmE3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMva2V5c3RvcmUvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1dhaXRGb3JWYWxpZEFjdGl2aXR5U3RhdGUuamF2YQpAQCAtMCwwICsxLDE0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZlci5hbTsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXIuU3RhY2tJZC5JTlZBTElEX1NUQUNLX0lEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5XaW5kb3dDb25maWd1cmF0aW9uLkFDVElWSVRZX1RZUEVfQVNTSVNUQU5UOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5XaW5kb3dDb25maWd1cmF0aW9uLkFDVElWSVRZX1RZUEVfSE9NRTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuV2luZG93Q29uZmlndXJhdGlvbi5BQ1RJVklUWV9UWVBFX1JFQ0VOVFM7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLldpbmRvd0NvbmZpZ3VyYXRpb24uQUNUSVZJVFlfVFlQRV9TVEFOREFSRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuV2luZG93Q29uZmlndXJhdGlvbi5BQ1RJVklUWV9UWVBFX1VOREVGSU5FRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuV2luZG93Q29uZmlndXJhdGlvbi5XSU5ET1dJTkdfTU9ERV9GUkVFRk9STTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuV2luZG93Q29uZmlndXJhdGlvbi5XSU5ET1dJTkdfTU9ERV9GVUxMU0NSRUVOOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5XaW5kb3dDb25maWd1cmF0aW9uLldJTkRPV0lOR19NT0RFX1BJTk5FRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuV2luZG93Q29uZmlndXJhdGlvbi5XSU5ET1dJTkdfTU9ERV9TUExJVF9TQ1JFRU5fUFJJTUFSWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuV2luZG93Q29uZmlndXJhdGlvbi5XSU5ET1dJTkdfTU9ERV9TUExJVF9TQ1JFRU5fU0VDT05EQVJZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5XaW5kb3dDb25maWd1cmF0aW9uLldJTkRPV0lOR19NT0RFX1VOREVGSU5FRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50TmFtZVV0aWxzLmdldEFjdGl2aXR5TmFtZTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuYW0uQ29tcG9uZW50TmFtZVV0aWxzLmdldFdpbmRvd05hbWU7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk51bGxhYmxlOworCitwdWJsaWMgY2xhc3MgV2FpdEZvclZhbGlkQWN0aXZpdHlTdGF0ZSB7CisgICAgQE51bGxhYmxlCisgICAgcHVibGljIGZpbmFsIENvbXBvbmVudE5hbWUgYWN0aXZpdHlOYW1lOworICAgIEBOdWxsYWJsZQorICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgd2luZG93TmFtZTsKKyAgICBwdWJsaWMgZmluYWwgaW50IHN0YWNrSWQ7CisgICAgcHVibGljIGZpbmFsIGludCB3aW5kb3dpbmdNb2RlOworICAgIHB1YmxpYyBmaW5hbCBpbnQgYWN0aXZpdHlUeXBlOworCisgICAgcHVibGljIHN0YXRpYyBXYWl0Rm9yVmFsaWRBY3Rpdml0eVN0YXRlIGZvcldpbmRvdyhmaW5hbCBTdHJpbmcgd2luZG93TmFtZSkgeworICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5zZXRXaW5kb3dOYW1lKHdpbmRvd05hbWUpLmJ1aWxkKCk7CisgICAgfQorCisgICAgcHVibGljIFdhaXRGb3JWYWxpZEFjdGl2aXR5U3RhdGUoZmluYWwgQ29tcG9uZW50TmFtZSBhY3Rpdml0eU5hbWUpIHsKKyAgICAgICAgdGhpcy5hY3Rpdml0eU5hbWUgPSBhY3Rpdml0eU5hbWU7CisgICAgICAgIHRoaXMud2luZG93TmFtZSA9IGdldFdpbmRvd05hbWUoYWN0aXZpdHlOYW1lKTsKKyAgICAgICAgdGhpcy5zdGFja0lkID0gSU5WQUxJRF9TVEFDS19JRDsKKyAgICAgICAgdGhpcy53aW5kb3dpbmdNb2RlID0gV0lORE9XSU5HX01PREVfVU5ERUZJTkVEOworICAgICAgICB0aGlzLmFjdGl2aXR5VHlwZSA9IEFDVElWSVRZX1RZUEVfVU5ERUZJTkVEOworICAgIH0KKworICAgIHByaXZhdGUgV2FpdEZvclZhbGlkQWN0aXZpdHlTdGF0ZShmaW5hbCBCdWlsZGVyIGJ1aWxkZXIpIHsKKyAgICAgICAgdGhpcy5hY3Rpdml0eU5hbWUgPSBidWlsZGVyLm1BY3Rpdml0eU5hbWU7CisgICAgICAgIHRoaXMud2luZG93TmFtZSA9IGJ1aWxkZXIubVdpbmRvd05hbWU7CisgICAgICAgIHRoaXMuc3RhY2tJZCA9IGJ1aWxkZXIubVN0YWNrSWQ7CisgICAgICAgIHRoaXMud2luZG93aW5nTW9kZSA9IGJ1aWxkZXIubVdpbmRvd2luZ01vZGU7CisgICAgICAgIHRoaXMuYWN0aXZpdHlUeXBlID0gYnVpbGRlci5tQWN0aXZpdHlUeXBlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigid2FpdDoiKTsKKyAgICAgICAgaWYgKGFjdGl2aXR5TmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiBhY3Rpdml0eT0iKS5hcHBlbmQoZ2V0QWN0aXZpdHlOYW1lKGFjdGl2aXR5TmFtZSkpOworICAgICAgICB9CisgICAgICAgIGlmIChhY3Rpdml0eVR5cGUgIT0gQUNUSVZJVFlfVFlQRV9VTkRFRklORUQpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIHR5cGU9IikuYXBwZW5kKGFjdGl2aXR5VHlwZU5hbWUoYWN0aXZpdHlUeXBlKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHdpbmRvd05hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIgd2luZG93PSIpLmFwcGVuZCh3aW5kb3dOYW1lKTsKKyAgICAgICAgfQorICAgICAgICBpZiAod2luZG93aW5nTW9kZSAhPSBXSU5ET1dJTkdfTU9ERV9VTkRFRklORUQpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIG1vZGU9IikuYXBwZW5kKHdpbmRvd2luZ01vZGVOYW1lKHdpbmRvd2luZ01vZGUpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RhY2tJZCAhPSBJTlZBTElEX1NUQUNLX0lEKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiBzdGFjaz0iKS5hcHBlbmQoc3RhY2tJZCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHdpbmRvd2luZ01vZGVOYW1lKGludCB3aW5kb3dpbmdNb2RlKSB7CisgICAgICAgIHN3aXRjaCAod2luZG93aW5nTW9kZSkgeworICAgICAgICAgICAgY2FzZSBXSU5ET1dJTkdfTU9ERV9VTkRFRklORUQ6IHJldHVybiAiVU5ERUZJTkVEIjsKKyAgICAgICAgICAgIGNhc2UgV0lORE9XSU5HX01PREVfRlVMTFNDUkVFTjogcmV0dXJuICJGVUxMU0NSRUVOIjsKKyAgICAgICAgICAgIGNhc2UgV0lORE9XSU5HX01PREVfUElOTkVEOiByZXR1cm4gIlBJTk5FRCI7CisgICAgICAgICAgICBjYXNlIFdJTkRPV0lOR19NT0RFX1NQTElUX1NDUkVFTl9QUklNQVJZOiByZXR1cm4gIlNQTElUX1NDUkVFTl9QUklNQVJZIjsKKyAgICAgICAgICAgIGNhc2UgV0lORE9XSU5HX01PREVfU1BMSVRfU0NSRUVOX1NFQ09OREFSWTogcmV0dXJuICJTUExJVF9TQ1JFRU5fU0VDT05EQVJZIjsKKyAgICAgICAgICAgIGNhc2UgV0lORE9XSU5HX01PREVfRlJFRUZPUk06IHJldHVybiAiRlJFRUZPUk0iOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIFdJTkRPV0lOR19NT0RFXzogIiArIHdpbmRvd2luZ01vZGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGFjdGl2aXR5VHlwZU5hbWUoaW50IGFjdGl2aXR5VHlwZSkgeworICAgICAgICBzd2l0Y2ggKGFjdGl2aXR5VHlwZSkgeworICAgICAgICAgICAgY2FzZSBBQ1RJVklUWV9UWVBFX1VOREVGSU5FRDogcmV0dXJuICJVTkRFRklORUQiOworICAgICAgICAgICAgY2FzZSBBQ1RJVklUWV9UWVBFX1NUQU5EQVJEOiByZXR1cm4gIlNUQU5EQVJEIjsKKyAgICAgICAgICAgIGNhc2UgQUNUSVZJVFlfVFlQRV9IT01FOiByZXR1cm4gIkhPTUUiOworICAgICAgICAgICAgY2FzZSBBQ1RJVklUWV9UWVBFX1JFQ0VOVFM6IHJldHVybiAiUkVDRU5UUyI7CisgICAgICAgICAgICBjYXNlIEFDVElWSVRZX1RZUEVfQVNTSVNUQU5UOiByZXR1cm4gIkFTU0lTVEFOVCI7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gQUNUSVZJVFlfVFlQRV86ICIgKyBhY3Rpdml0eVR5cGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVyIHsKKyAgICAgICAgQE51bGxhYmxlCisgICAgICAgIHByaXZhdGUgQ29tcG9uZW50TmFtZSBtQWN0aXZpdHlOYW1lID0gbnVsbDsKKyAgICAgICAgQE51bGxhYmxlCisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1XaW5kb3dOYW1lID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVN0YWNrSWQgPSBJTlZBTElEX1NUQUNLX0lEOworICAgICAgICBwcml2YXRlIGludCBtV2luZG93aW5nTW9kZSA9IFdJTkRPV0lOR19NT0RFX1VOREVGSU5FRDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbUFjdGl2aXR5VHlwZSA9IEFDVElWSVRZX1RZUEVfVU5ERUZJTkVEOworCisgICAgICAgIHByaXZhdGUgQnVpbGRlcigpIHt9CisKKyAgICAgICAgcHVibGljIEJ1aWxkZXIoZmluYWwgQ29tcG9uZW50TmFtZSBhY3Rpdml0eU5hbWUpIHsKKyAgICAgICAgICAgIG1BY3Rpdml0eU5hbWUgPSBhY3Rpdml0eU5hbWU7CisgICAgICAgICAgICBtV2luZG93TmFtZSA9IGdldFdpbmRvd05hbWUoYWN0aXZpdHlOYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgQnVpbGRlciBzZXRXaW5kb3dOYW1lKFN0cmluZyB3aW5kb3dOYW1lKSB7CisgICAgICAgICAgICBtV2luZG93TmFtZSA9IHdpbmRvd05hbWU7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFdpbmRvd2luZ01vZGUoaW50IHdpbmRvd2luZ01vZGUpIHsKKyAgICAgICAgICAgIG1XaW5kb3dpbmdNb2RlID0gd2luZG93aW5nTW9kZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0QWN0aXZpdHlUeXBlKGludCBhY3Rpdml0eVR5cGUpIHsKKyAgICAgICAgICAgIG1BY3Rpdml0eVR5cGUgPSBhY3Rpdml0eVR5cGU7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBXYWl0Rm9yVmFsaWRBY3Rpdml0eVN0YXRlIGJ1aWxkKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBXYWl0Rm9yVmFsaWRBY3Rpdml0eVN0YXRlKHRoaXMpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMva2V5c3RvcmUvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1dpbmRvd01hbmFnZXJTdGF0ZS5qYXZhIGIvdGVzdHMvdGVzdHMva2V5c3RvcmUvc3JjL2FuZHJvaWQvc2VydmVyL2FtL1dpbmRvd01hbmFnZXJTdGF0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZDFmNTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9rZXlzdG9yZS9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vV2luZG93TWFuYWdlclN0YXRlLmphdmEKQEAgLTAsMCArMSw1OTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW07CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuV2luZG93Q29uZmlndXJhdGlvbi5BQ1RJVklUWV9UWVBFX1VOREVGSU5FRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuV2luZG93Q29uZmlndXJhdGlvbi5XSU5ET1dJTkdfTU9ERV9VTkRFRklORUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLlByb3RvRXh0cmFjdG9ycy5leHRyYWN0OworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnNlcnZlci5hbS5TdGF0ZUxvZ2dlci5sb2c7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc2VydmVyLmFtLlN0YXRlTG9nZ2VyLmxvZ0U7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5EaXNwbGF5LkRFRkFVTFRfRElTUExBWTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQudmlldy5uYW5vLkRpc3BsYXlJbmZvUHJvdG87CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworCitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLndtLm5hbm8uQXBwVHJhbnNpdGlvblByb3RvOworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci53bS5uYW5vLkFwcFdpbmRvd1Rva2VuUHJvdG87CitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLndtLm5hbm8uQ29uZmlndXJhdGlvbkNvbnRhaW5lclByb3RvOworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci53bS5uYW5vLkRpc3BsYXlQcm90bzsKK2ltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIud20ubmFuby5JZGVudGlmaWVyUHJvdG87CitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLndtLm5hbm8uUGlubmVkU3RhY2tDb250cm9sbGVyUHJvdG87CitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLndtLm5hbm8uU3RhY2tQcm90bzsKK2ltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIud20ubmFuby5UYXNrUHJvdG87CitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLndtLm5hbm8uV2luZG93Q29udGFpbmVyUHJvdG87CitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLndtLm5hbm8uV2luZG93TWFuYWdlclNlcnZpY2VEdW1wUHJvdG87CitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLndtLm5hbm8uV2luZG93U3RhdGVBbmltYXRvclByb3RvOworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci53bS5uYW5vLldpbmRvd1N0YXRlUHJvdG87CitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLndtLm5hbm8uV2luZG93U3VyZmFjZUNvbnRyb2xsZXJQcm90bzsKK2ltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIud20ubmFuby5XaW5kb3dUb2tlblByb3RvOworCitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLkludmFsaWRQcm90b2NvbEJ1ZmZlck5hbm9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK3B1YmxpYyBjbGFzcyBXaW5kb3dNYW5hZ2VyU3RhdGUgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEVU1QU1lTX1dJTkRPVyA9ICJkdW1wc3lzIHdpbmRvdyAtYSAtLXByb3RvIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFSVElOR19XSU5ET1dfUFJFRklYID0gIlN0YXJ0aW5nICI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFQlVHR0VSX1dJTkRPV19QUkVGSVggPSAiV2FpdGluZyBGb3IgRGVidWdnZXI6ICI7CisKKyAgICAvLyBXaW5kb3dzIGluIHotb3JkZXIgd2l0aCB0aGUgdG9wIG1vc3QgYXQgdGhlIGZyb250IG9mIHRoZSBsaXN0LgorICAgIHByaXZhdGUgTGlzdDxXaW5kb3dTdGF0ZT4gbVdpbmRvd1N0YXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAvLyBTdGFja3MgaW4gei1vcmRlciB3aXRoIHRoZSB0b3AgbW9zdCBhdCB0aGUgZnJvbnQgb2YgdGhlIGxpc3QsIHN0YXJ0aW5nIHdpdGggcHJpbWFyeSBkaXNwbGF5LgorICAgIHByaXZhdGUgZmluYWwgTGlzdDxXaW5kb3dTdGFjaz4gbVN0YWNrcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAvLyBTdGFja3Mgb24gYWxsIGF0dGFjaGVkIGRpc3BsYXlzLCBpbiB6LW9yZGVyIHdpdGggdGhlIHRvcCBtb3N0IGF0IHRoZSBmcm9udCBvZiB0aGUgbGlzdC4KKyAgICBwcml2YXRlIGZpbmFsIE1hcDxJbnRlZ2VyLCBMaXN0PFdpbmRvd1N0YWNrPj4gbURpc3BsYXlTdGFja3MKKyAgICAgICAgICAgID0gbmV3IEhhc2hNYXA8PigpOworICAgIHByaXZhdGUgTGlzdDxEaXNwbGF5PiBtRGlzcGxheXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgcHJpdmF0ZSBTdHJpbmcgbUZvY3VzZWRXaW5kb3cgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nIG1Gb2N1c2VkQXBwID0gbnVsbDsKKyAgICBwcml2YXRlIFJlY3QgbURlZmF1bHRQaW5uZWRTdGFja0JvdW5kcyA9IG5ldyBSZWN0KCk7CisgICAgcHJpdmF0ZSBSZWN0IG1QaW5uZWRTdGFja01vdmVtZW50Qm91bmRzID0gbmV3IFJlY3QoKTsKKyAgICBwcml2YXRlIGZpbmFsIExpbmtlZExpc3Q8U3RyaW5nPiBtU3lzRHVtcCA9IG5ldyBMaW5rZWRMaXN0KCk7CisgICAgcHJpdmF0ZSBpbnQgbVJvdGF0aW9uOworICAgIHByaXZhdGUgYm9vbGVhbiBtSXNEb2NrZWRTdGFja01pbmltaXplZDsKKworICAgIHB1YmxpYyB2b2lkIGNvbXB1dGVTdGF0ZSgpIHsKKyAgICAgICAgLy8gSXQgaXMgcG9zc2libGUgdGhlIHN5c3RlbSBpcyBpbiB0aGUgbWlkZGxlIG9mIHRyYW5zaXRpb24gdG8gdGhlIHJpZ2h0IHN0YXRlIHdoZW4gd2UgZ2V0CisgICAgICAgIC8vIHRoZSBkdW1wLiBXZSB0cnkgYSBmZXcgdGltZXMgdG8gZ2V0IHRoZSBpbmZvcm1hdGlvbiB3ZSBuZWVkIGJlZm9yZSBnaXZpbmcgdXAuCisgICAgICAgIGludCByZXRyaWVzTGVmdCA9IDM7CisgICAgICAgIGJvb2xlYW4gcmV0cnkgPSBmYWxzZTsKKyAgICAgICAgYnl0ZVtdIGR1bXAgPSBudWxsOworCisgICAgICAgIGxvZygiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7CisgICAgICAgIGxvZygiICAgICAgV2luZG93TWFuYWdlclN0YXRlICAgICAgIik7CisgICAgICAgIGxvZygiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGlmIChyZXRyeSkgeworICAgICAgICAgICAgICAgIGxvZygiKioqSW5jb21wbGV0ZSBXTSBzdGF0ZS4gUmV0cnlpbmcuLi4iKTsKKyAgICAgICAgICAgICAgICAvLyBXYWl0IGhhbGYgYSBzZWNvbmQgYmV0d2VlbiByZXRyaWVzIGZvciB3aW5kb3cgbWFuYWdlciB0byBmaW5pc2ggdHJhbnNpdGlvbmluZy4uLgorICAgICAgICAgICAgICAgIFN5c3RlbUNsb2NrLnNsZWVwKDUwMCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGR1bXAgPSBleGVjdXRlU2hlbGxDb21tYW5kKERVTVBTWVNfV0lORE9XKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcGFyc2VTeXNEdW1wUHJvdG8oZHVtcCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJOYW5vRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkZhaWxlZCB0byBwYXJzZSBkdW1wc3lzOlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBuZXcgU3RyaW5nKGR1bXAsIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpLCBleCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHJ5ID0gbVdpbmRvd1N0YXRlcy5pc0VtcHR5KCkgfHwgbUZvY3VzZWRBcHAgPT0gbnVsbDsKKyAgICAgICAgfSB3aGlsZSAocmV0cnkgJiYgcmV0cmllc0xlZnQtLSA+IDApOworCisgICAgICAgIGlmIChtV2luZG93U3RhdGVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgbG9nRSgiTm8gV2luZG93cyBmb3VuZC4uLiIpOworICAgICAgICB9CisgICAgICAgIGlmIChtRm9jdXNlZFdpbmRvdyA9PSBudWxsKSB7CisgICAgICAgICAgICBsb2dFKCJObyBGb2N1c2VkIFdpbmRvdy4uLiIpOworICAgICAgICB9CisgICAgICAgIGlmIChtRm9jdXNlZEFwcCA9PSBudWxsKSB7CisgICAgICAgICAgICBsb2dFKCJObyBGb2N1c2VkIEFwcC4uLiIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBieXRlW10gZXhlY3V0ZVNoZWxsQ29tbWFuZChTdHJpbmcgY21kKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBwZmQgPQorICAgICAgICAgICAgICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKS5nZXRVaUF1dG9tYXRpb24oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5leGVjdXRlU2hlbGxDb21tYW5kKGNtZCk7CisgICAgICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbNTEyXTsKKyAgICAgICAgICAgIGludCBieXRlc1JlYWQ7CisgICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IFBhcmNlbEZpbGVEZXNjcmlwdG9yLkF1dG9DbG9zZUlucHV0U3RyZWFtKHBmZCk7CisgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gc3Rkb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgd2hpbGUgKChieXRlc1JlYWQgPSBmaXMucmVhZChidWYpKSAhPSAtMSkgeworICAgICAgICAgICAgICAgIHN0ZG91dC53cml0ZShidWYsIDAsIGJ5dGVzUmVhZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaXMuY2xvc2UoKTsKKyAgICAgICAgICAgIHJldHVybiBzdGRvdXQudG9CeXRlQXJyYXkoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHByaXZhdGUgdm9pZCBwYXJzZVN5c0R1bXBQcm90byhieXRlW10gc3lzRHVtcCkgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlck5hbm9FeGNlcHRpb24geworICAgICAgICByZXNldCgpOworICAgICAgICBXaW5kb3dNYW5hZ2VyU2VydmljZUR1bXBQcm90byBzdGF0ZSA9IFdpbmRvd01hbmFnZXJTZXJ2aWNlRHVtcFByb3RvLnBhcnNlRnJvbShzeXNEdW1wKTsKKyAgICAgICAgTGlzdDxXaW5kb3dTdGF0ZT4gYWxsV2luZG93cyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBNYXA8U3RyaW5nLCBXaW5kb3dTdGF0ZT4gd2luZG93TWFwID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBpZiAoc3RhdGUuZm9jdXNlZFdpbmRvdyAhPSBudWxsKSB7CisgICAgICAgICAgICBtRm9jdXNlZFdpbmRvdyA9IHN0YXRlLmZvY3VzZWRXaW5kb3cudGl0bGU7CisgICAgICAgIH0KKyAgICAgICAgbUZvY3VzZWRBcHAgPSBzdGF0ZS5mb2N1c2VkQXBwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0YXRlLnJvb3RXaW5kb3dDb250YWluZXIuZGlzcGxheXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIERpc3BsYXlQcm90byBkaXNwbGF5UHJvdG8gPSBzdGF0ZS5yb290V2luZG93Q29udGFpbmVyLmRpc3BsYXlzW2ldOworICAgICAgICAgICAgZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoZGlzcGxheVByb3RvKTsKKyAgICAgICAgICAgIG1EaXNwbGF5cy5hZGQoZGlzcGxheSk7CisgICAgICAgICAgICBhbGxXaW5kb3dzLmFkZEFsbChkaXNwbGF5LmdldFdpbmRvd3MoKSk7CisgICAgICAgICAgICBMaXN0PFdpbmRvd1N0YWNrPiBzdGFja3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZGlzcGxheVByb3RvLnN0YWNrcy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgIFN0YWNrUHJvdG8gc3RhY2tQcm90byA9IGRpc3BsYXlQcm90by5zdGFja3Nbal07CisgICAgICAgICAgICAgICAgZmluYWwgV2luZG93U3RhY2sgc3RhY2sgPSBuZXcgV2luZG93U3RhY2soc3RhY2tQcm90byk7CisgICAgICAgICAgICAgICAgbVN0YWNrcy5hZGQoc3RhY2spOworICAgICAgICAgICAgICAgIHN0YWNrcy5hZGQoc3RhY2spOworICAgICAgICAgICAgICAgIGFsbFdpbmRvd3MuYWRkQWxsKHN0YWNrLmdldFdpbmRvd3MoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRGlzcGxheVN0YWNrcy5wdXQoZGlzcGxheS5tRGlzcGxheUlkLCBzdGFja3MpOworCisgICAgICAgICAgICAvLyB1c2UgcHJvcGVydGllcyBmcm9tIHRoZSBkZWZhdWx0IGRpc3BsYXkgb25seQorICAgICAgICAgICAgaWYgKGRpc3BsYXkuZ2V0RGlzcGxheUlkKCkgPT0gREVGQVVMVF9ESVNQTEFZKSB7CisgICAgICAgICAgICAgICAgaWYgKGRpc3BsYXlQcm90by5kb2NrZWRTdGFja0RpdmlkZXJDb250cm9sbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUlzRG9ja2VkU3RhY2tNaW5pbWl6ZWQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlQcm90by5kb2NrZWRTdGFja0RpdmlkZXJDb250cm9sbGVyLm1pbmltaXplZERvY2s7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFBpbm5lZFN0YWNrQ29udHJvbGxlclByb3RvIHBpbm5lZFN0YWNrUHJvdG8gPSBkaXNwbGF5UHJvdG8ucGlubmVkU3RhY2tDb250cm9sbGVyOworICAgICAgICAgICAgICAgIGlmIChwaW5uZWRTdGFja1Byb3RvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbURlZmF1bHRQaW5uZWRTdGFja0JvdW5kcyA9IGV4dHJhY3QocGlubmVkU3RhY2tQcm90by5kZWZhdWx0Qm91bmRzKTsKKyAgICAgICAgICAgICAgICAgICAgbVBpbm5lZFN0YWNrTW92ZW1lbnRCb3VuZHMgPSBleHRyYWN0KHBpbm5lZFN0YWNrUHJvdG8ubW92ZW1lbnRCb3VuZHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKFdpbmRvd1N0YXRlIHcgOiBhbGxXaW5kb3dzKSB7CisgICAgICAgICAgICB3aW5kb3dNYXAucHV0KHcuZ2V0VG9rZW4oKSwgdyk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0ZS5yb290V2luZG93Q29udGFpbmVyLndpbmRvd3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIElkZW50aWZpZXJQcm90byBpZGVudGlmaWVyUHJvdG8gPSBzdGF0ZS5yb290V2luZG93Q29udGFpbmVyLndpbmRvd3NbaV07CisgICAgICAgICAgICBTdHJpbmcgaGFzaF9jb2RlID0gSW50ZWdlci50b0hleFN0cmluZyhpZGVudGlmaWVyUHJvdG8uaGFzaENvZGUpOworICAgICAgICAgICAgbVdpbmRvd1N0YXRlcy5hZGQod2luZG93TWFwLmdldChoYXNoX2NvZGUpKTsKKyAgICAgICAgfQorICAgICAgICBtUm90YXRpb24gPSBzdGF0ZS5yb3RhdGlvbjsKKyAgICAgICAgQXBwVHJhbnNpdGlvblByb3RvIGFwcFRyYW5zaXRpb25Qcm90byA9IHN0YXRlLmFwcFRyYW5zaXRpb247CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2V0TWF0Y2hpbmdWaXNpYmxlV2luZG93U3RhdGUoZmluYWwgU3RyaW5nIHdpbmRvd05hbWUsIExpc3Q8V2luZG93U3RhdGU+IHdpbmRvd0xpc3QpIHsKKyAgICAgICAgd2luZG93TGlzdC5jbGVhcigpOworICAgICAgICBmb3IgKFdpbmRvd1N0YXRlIHdzIDogbVdpbmRvd1N0YXRlcykgeworICAgICAgICAgICAgaWYgKHdzLmlzU2hvd24oKSAmJiB3aW5kb3dOYW1lLmVxdWFscyh3cy5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgd2luZG93TGlzdC5hZGQod3MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFdpbmRvd1N0YXRlIGdldFdpbmRvd0J5UGFja2FnZU5hbWUoU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgd2luZG93VHlwZSkgeworICAgICAgICBmb3IgKFdpbmRvd1N0YXRlIHdzIDogbVdpbmRvd1N0YXRlcykgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSB3cy5nZXROYW1lKCk7CisgICAgICAgICAgICBpZiAobmFtZSA9PSBudWxsIHx8ICFuYW1lLmNvbnRhaW5zKHBhY2thZ2VOYW1lKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHdpbmRvd1R5cGUgIT0gd3MuZ2V0VHlwZSgpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gd3M7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnZXRXaW5kb3dzQnlQYWNrYWdlTmFtZShTdHJpbmcgcGFja2FnZU5hbWUsIExpc3Q8SW50ZWdlcj4gcmVzdHJpY3RUb1R5cGVMaXN0LAorICAgICAgICAgICAgTGlzdDxXaW5kb3dTdGF0ZT4gb3V0V2luZG93TGlzdCkgeworICAgICAgICBvdXRXaW5kb3dMaXN0LmNsZWFyKCk7CisgICAgICAgIGZvciAoV2luZG93U3RhdGUgd3MgOiBtV2luZG93U3RhdGVzKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IHdzLmdldE5hbWUoKTsKKyAgICAgICAgICAgIGlmIChuYW1lID09IG51bGwgfHwgIW5hbWUuY29udGFpbnMocGFja2FnZU5hbWUpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmVzdHJpY3RUb1R5cGVMaXN0ICE9IG51bGwgJiYgIXJlc3RyaWN0VG9UeXBlTGlzdC5jb250YWlucyh3cy5nZXRUeXBlKCkpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXRXaW5kb3dMaXN0LmFkZCh3cyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBEaXNwbGF5IGdldERpc3BsYXkoaW50IGRpc3BsYXlJZCkgeworICAgICAgICBmb3IgKERpc3BsYXkgZGlzcGxheSA6IG1EaXNwbGF5cykgeworICAgICAgICAgICAgaWYgKGRpc3BsYXlJZCA9PSBkaXNwbGF5LmdldERpc3BsYXlJZCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRpc3BsYXk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgTGlzdDxEaXNwbGF5PiBnZXREaXNwbGF5cygpIHsKKyAgICAgICAgcmV0dXJuIG1EaXNwbGF5czsKKyAgICB9CisKKyAgICBTdHJpbmcgZ2V0RnJvbnRXaW5kb3coKSB7CisgICAgICAgIGlmIChtV2luZG93U3RhdGVzID09IG51bGwgfHwgbVdpbmRvd1N0YXRlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtV2luZG93U3RhdGVzLmdldCgwKS5nZXROYW1lKCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRGb2N1c2VkV2luZG93KCkgeworICAgICAgICByZXR1cm4gbUZvY3VzZWRXaW5kb3c7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRGb2N1c2VkQXBwKCkgeworICAgICAgICByZXR1cm4gbUZvY3VzZWRBcHA7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRSb3RhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG1Sb3RhdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiBhdCBsZWFzdCBvbmUgd2luZG93IHdoaWNoIG1hdGNoZXMgcHJvdmlkZWQgd2luZG93IG5hbWUgaXMgdmlzaWJsZS4KKyAgICAgKi8KKyAgICBib29sZWFuIGlzV2luZG93VmlzaWJsZShTdHJpbmcgd2luZG93TmFtZSkgeworICAgICAgICBmb3IgKFdpbmRvd1N0YXRlIHdpbmRvdyA6IG1XaW5kb3dTdGF0ZXMpIHsKKyAgICAgICAgICAgIGlmICh3aW5kb3cuZ2V0TmFtZSgpLmVxdWFscyh3aW5kb3dOYW1lKSkgeworICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuaXNTaG93bigpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgV2luZG93U3RhY2sgZ2V0U3RhY2soaW50IHN0YWNrSWQpIHsKKyAgICAgICAgZm9yIChXaW5kb3dTdGFjayBzdGFjayA6IG1TdGFja3MpIHsKKyAgICAgICAgICAgIGlmIChzdGFja0lkID09IHN0YWNrLm1TdGFja0lkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YWNrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRG9ja2VkU3RhY2tNaW5pbWl6ZWQoKSB7CisgICAgICAgIHJldHVybiBtSXNEb2NrZWRTdGFja01pbmltaXplZDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFpPcmRlcihXaW5kb3dTdGF0ZSB3KSB7CisgICAgICAgIHJldHVybiBtV2luZG93U3RhdGVzLnNpemUoKSAtIG1XaW5kb3dTdGF0ZXMuaW5kZXhPZih3KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVzZXQoKSB7CisgICAgICAgIG1TeXNEdW1wLmNsZWFyKCk7CisgICAgICAgIG1TdGFja3MuY2xlYXIoKTsKKyAgICAgICAgbURpc3BsYXlzLmNsZWFyKCk7CisgICAgICAgIG1XaW5kb3dTdGF0ZXMuY2xlYXIoKTsKKyAgICAgICAgbURpc3BsYXlTdGFja3MuY2xlYXIoKTsKKyAgICAgICAgbUZvY3VzZWRXaW5kb3cgPSBudWxsOworICAgICAgICBtRm9jdXNlZEFwcCA9IG51bGw7CisgICAgICAgIG1Jc0RvY2tlZFN0YWNrTWluaW1pemVkID0gZmFsc2U7CisgICAgICAgIG1EZWZhdWx0UGlubmVkU3RhY2tCb3VuZHMuc2V0RW1wdHkoKTsKKyAgICAgICAgbVBpbm5lZFN0YWNrTW92ZW1lbnRCb3VuZHMuc2V0RW1wdHkoKTsKKyAgICAgICAgbVJvdGF0aW9uID0gMDsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgV2luZG93U3RhY2sgZXh0ZW5kcyBXaW5kb3dDb250YWluZXIgeworCisgICAgICAgIGludCBtU3RhY2tJZDsKKyAgICAgICAgQXJyYXlMaXN0PFdpbmRvd1Rhc2s+IG1UYXNrcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBib29sZWFuIG1XaW5kb3dBbmltYXRpb25CYWNrZ3JvdW5kU3VyZmFjZVNob3dpbmc7CisKKyAgICAgICAgV2luZG93U3RhY2soU3RhY2tQcm90byBwcm90bykgeworICAgICAgICAgICAgc3VwZXIocHJvdG8ud2luZG93Q29udGFpbmVyKTsKKyAgICAgICAgICAgIG1TdGFja0lkID0gcHJvdG8uaWQ7CisgICAgICAgICAgICBtRnVsbHNjcmVlbiA9IHByb3RvLmZpbGxzUGFyZW50OworICAgICAgICAgICAgbUJvdW5kcyA9IGV4dHJhY3QocHJvdG8uYm91bmRzKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdG8udGFza3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBUYXNrUHJvdG8gdGFza1Byb3RvID0gcHJvdG8udGFza3NbaV07CisgICAgICAgICAgICAgICAgV2luZG93VGFzayB0YXNrID0gbmV3IFdpbmRvd1Rhc2sodGFza1Byb3RvKTsKKyAgICAgICAgICAgICAgICBtVGFza3MuYWRkKHRhc2spOworICAgICAgICAgICAgICAgIG1TdWJXaW5kb3dzLmFkZEFsbCh0YXNrLmdldFdpbmRvd3MoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtV2luZG93QW5pbWF0aW9uQmFja2dyb3VuZFN1cmZhY2VTaG93aW5nID0gcHJvdG8uYW5pbWF0aW9uQmFja2dyb3VuZFN1cmZhY2VJc0RpbW1pbmc7CisgICAgICAgIH0KKworICAgICAgICBXaW5kb3dUYXNrIGdldFRhc2soaW50IHRhc2tJZCkgeworICAgICAgICAgICAgZm9yIChXaW5kb3dUYXNrIHRhc2sgOiBtVGFza3MpIHsKKyAgICAgICAgICAgICAgICBpZiAodGFza0lkID09IHRhc2subVRhc2tJZCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFzazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBXaW5kb3dUYXNrIGV4dGVuZHMgV2luZG93Q29udGFpbmVyIHsKKworICAgICAgICBpbnQgbVRhc2tJZDsKKyAgICAgICAgUmVjdCBtVGVtcEluc2V0Qm91bmRzOworICAgICAgICBMaXN0PFN0cmluZz4gbUFwcFRva2VucyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgICAgIFdpbmRvd1Rhc2soVGFza1Byb3RvIHByb3RvKSB7CisgICAgICAgICAgICBzdXBlcihwcm90by53aW5kb3dDb250YWluZXIpOworICAgICAgICAgICAgbVRhc2tJZCA9IHByb3RvLmlkOworICAgICAgICAgICAgbUZ1bGxzY3JlZW4gPSBwcm90by5maWxsc1BhcmVudDsKKyAgICAgICAgICAgIG1Cb3VuZHMgPSBleHRyYWN0KHByb3RvLmJvdW5kcyk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3RvLmFwcFdpbmRvd1Rva2Vucy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIEFwcFdpbmRvd1Rva2VuUHJvdG8gYXBwV2luZG93VG9rZW5Qcm90byA9IHByb3RvLmFwcFdpbmRvd1Rva2Vuc1tpXTsKKyAgICAgICAgICAgICAgICBtQXBwVG9rZW5zLmFkZChhcHBXaW5kb3dUb2tlblByb3RvLm5hbWUpOworICAgICAgICAgICAgICAgIFdpbmRvd1Rva2VuUHJvdG8gd2luZG93VG9rZW5Qcm90byA9IGFwcFdpbmRvd1Rva2VuUHJvdG8ud2luZG93VG9rZW47CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCB3aW5kb3dUb2tlblByb3RvLndpbmRvd3MubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgV2luZG93U3RhdGVQcm90byB3aW5kb3dQcm90byA9IHdpbmRvd1Rva2VuUHJvdG8ud2luZG93c1tqXTsKKyAgICAgICAgICAgICAgICAgICAgV2luZG93U3RhdGUgd2luZG93ID0gbmV3IFdpbmRvd1N0YXRlKHdpbmRvd1Byb3RvKTsKKyAgICAgICAgICAgICAgICAgICAgbVN1YldpbmRvd3MuYWRkKHdpbmRvdyk7CisgICAgICAgICAgICAgICAgICAgIG1TdWJXaW5kb3dzLmFkZEFsbCh3aW5kb3cuZ2V0V2luZG93cygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtVGVtcEluc2V0Qm91bmRzID0gZXh0cmFjdChwcm90by50ZW1wSW5zZXRCb3VuZHMpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIENvbmZpZ3VyYXRpb25Db250YWluZXIgeworICAgICAgICBmaW5hbCBDb25maWd1cmF0aW9uIG1PdmVycmlkZUNvbmZpZ3VyYXRpb24gPSBuZXcgQ29uZmlndXJhdGlvbigpOworICAgICAgICBmaW5hbCBDb25maWd1cmF0aW9uIG1GdWxsQ29uZmlndXJhdGlvbiA9IG5ldyBDb25maWd1cmF0aW9uKCk7CisgICAgICAgIGZpbmFsIENvbmZpZ3VyYXRpb24gbU1lcmdlZE92ZXJyaWRlQ29uZmlndXJhdGlvbiA9IG5ldyBDb25maWd1cmF0aW9uKCk7CisKKyAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRhaW5lcihDb25maWd1cmF0aW9uQ29udGFpbmVyUHJvdG8gcHJvdG8pIHsKKyAgICAgICAgICAgIGlmIChwcm90byA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbU92ZXJyaWRlQ29uZmlndXJhdGlvbi5zZXRUbyhleHRyYWN0KHByb3RvLm92ZXJyaWRlQ29uZmlndXJhdGlvbikpOworICAgICAgICAgICAgbUZ1bGxDb25maWd1cmF0aW9uLnNldFRvKGV4dHJhY3QocHJvdG8uZnVsbENvbmZpZ3VyYXRpb24pKTsKKyAgICAgICAgICAgIG1NZXJnZWRPdmVycmlkZUNvbmZpZ3VyYXRpb24uc2V0VG8oZXh0cmFjdChwcm90by5tZXJnZWRPdmVycmlkZUNvbmZpZ3VyYXRpb24pKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBnZXRXaW5kb3dpbmdNb2RlKCkgeworICAgICAgICAgICAgaWYgKG1GdWxsQ29uZmlndXJhdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkRPV0lOR19NT0RFX1VOREVGSU5FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtRnVsbENvbmZpZ3VyYXRpb24ud2luZG93Q29uZmlndXJhdGlvbi5nZXRXaW5kb3dpbmdNb2RlKCk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgZ2V0QWN0aXZpdHlUeXBlKCkgeworICAgICAgICAgICAgaWYgKG1GdWxsQ29uZmlndXJhdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFDVElWSVRZX1RZUEVfVU5ERUZJTkVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG1GdWxsQ29uZmlndXJhdGlvbi53aW5kb3dDb25maWd1cmF0aW9uLmdldEFjdGl2aXR5VHlwZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGFic3RyYWN0IGNsYXNzIFdpbmRvd0NvbnRhaW5lciBleHRlbmRzIENvbmZpZ3VyYXRpb25Db250YWluZXIgeworCisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIG1GdWxsc2NyZWVuOworICAgICAgICBwcm90ZWN0ZWQgUmVjdCBtQm91bmRzOworICAgICAgICBwcm90ZWN0ZWQgaW50IG1PcmllbnRhdGlvbjsKKyAgICAgICAgcHJvdGVjdGVkIExpc3Q8V2luZG93U3RhdGU+IG1TdWJXaW5kb3dzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICAgICAgV2luZG93Q29udGFpbmVyKFdpbmRvd0NvbnRhaW5lclByb3RvIHByb3RvKSB7CisgICAgICAgICAgICBzdXBlcihwcm90by5jb25maWd1cmF0aW9uQ29udGFpbmVyKTsKKyAgICAgICAgICAgIG1PcmllbnRhdGlvbiA9IHByb3RvLm9yaWVudGF0aW9uOworICAgICAgICB9CisKKyAgICAgICAgUmVjdCBnZXRCb3VuZHMoKSB7CisgICAgICAgICAgICByZXR1cm4gbUJvdW5kczsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gaXNGdWxsc2NyZWVuKCkgeworICAgICAgICAgICAgcmV0dXJuIG1GdWxsc2NyZWVuOworICAgICAgICB9CisKKyAgICAgICAgTGlzdDxXaW5kb3dTdGF0ZT4gZ2V0V2luZG93cygpIHsKKyAgICAgICAgICAgIHJldHVybiBtU3ViV2luZG93czsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBEaXNwbGF5IGV4dGVuZHMgV2luZG93Q29udGFpbmVyIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtRGlzcGxheUlkOworICAgICAgICBwcml2YXRlIFJlY3QgbURpc3BsYXlSZWN0ID0gbmV3IFJlY3QoKTsKKyAgICAgICAgcHJpdmF0ZSBSZWN0IG1BcHBSZWN0ID0gbmV3IFJlY3QoKTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbURwaTsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbU5hbWU7CisKKyAgICAgICAgcHVibGljIERpc3BsYXkoRGlzcGxheVByb3RvIHByb3RvKSB7CisgICAgICAgICAgICBzdXBlcihwcm90by53aW5kb3dDb250YWluZXIpOworICAgICAgICAgICAgbURpc3BsYXlJZCA9IHByb3RvLmlkOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm90by5hYm92ZUFwcFdpbmRvd3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBhZGRXaW5kb3dzRnJvbVRva2VuUHJvdG8ocHJvdG8uYWJvdmVBcHBXaW5kb3dzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdG8uYmVsb3dBcHBXaW5kb3dzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgYWRkV2luZG93c0Zyb21Ub2tlblByb3RvKHByb3RvLmJlbG93QXBwV2luZG93c1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3RvLmltZVdpbmRvd3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBhZGRXaW5kb3dzRnJvbVRva2VuUHJvdG8ocHJvdG8uaW1lV2luZG93c1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRHBpID0gcHJvdG8uZHBpOworICAgICAgICAgICAgRGlzcGxheUluZm9Qcm90byBpbmZvUHJvdG8gPSBwcm90by5kaXNwbGF5SW5mbzsKKyAgICAgICAgICAgIGlmIChpbmZvUHJvdG8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1EaXNwbGF5UmVjdC5zZXQoMCwgMCwgaW5mb1Byb3RvLmxvZ2ljYWxXaWR0aCwgaW5mb1Byb3RvLmxvZ2ljYWxIZWlnaHQpOworICAgICAgICAgICAgICAgIG1BcHBSZWN0LnNldCgwLCAwLCBpbmZvUHJvdG8uYXBwV2lkdGgsIGluZm9Qcm90by5hcHBIZWlnaHQpOworICAgICAgICAgICAgICAgIG1OYW1lID0gaW5mb1Byb3RvLm5hbWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgYWRkV2luZG93c0Zyb21Ub2tlblByb3RvKFdpbmRvd1Rva2VuUHJvdG8gcHJvdG8pIHsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcHJvdG8ud2luZG93cy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgIFdpbmRvd1N0YXRlUHJvdG8gd2luZG93UHJvdG8gPSBwcm90by53aW5kb3dzW2pdOworICAgICAgICAgICAgICAgIFdpbmRvd1N0YXRlIGNoaWxkV2luZG93ID0gbmV3IFdpbmRvd1N0YXRlKHdpbmRvd1Byb3RvKTsKKyAgICAgICAgICAgICAgICBtU3ViV2luZG93cy5hZGQoY2hpbGRXaW5kb3cpOworICAgICAgICAgICAgICAgIG1TdWJXaW5kb3dzLmFkZEFsbChjaGlsZFdpbmRvdy5nZXRXaW5kb3dzKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50IGdldERpc3BsYXlJZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtRGlzcGxheUlkOworICAgICAgICB9CisKKyAgICAgICAgaW50IGdldERwaSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtRHBpOworICAgICAgICB9CisKKyAgICAgICAgUmVjdCBnZXREaXNwbGF5UmVjdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtRGlzcGxheVJlY3Q7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJEaXNwbGF5ICMiICsgbURpc3BsYXlJZCArICI6IG5hbWU9IiArIG1OYW1lICsgIiBtRGlzcGxheVJlY3Q9IiArIG1EaXNwbGF5UmVjdAorICAgICAgICAgICAgICAgICAgICArICIgbUFwcFJlY3Q9IiArIG1BcHBSZWN0OworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBXaW5kb3dTdGF0ZSBleHRlbmRzIFdpbmRvd0NvbnRhaW5lciB7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdJTkRPV19UWVBFX1NUQVJUSU5HID0gMTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdJTkRPV19UWVBFX0VYSVRJTkcgPSAyOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0lORE9XX1RZUEVfREVCVUdHRVIgPSAzOworCisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1OYW1lOworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQXBwVG9rZW47CisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1XaW5kb3dUeXBlOworICAgICAgICBwcml2YXRlIGludCBtVHlwZSA9IDA7CisgICAgICAgIHByaXZhdGUgaW50IG1EaXNwbGF5SWQ7CisgICAgICAgIHByaXZhdGUgaW50IG1TdGFja0lkOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbVNob3duOworICAgICAgICBwcml2YXRlIFJlY3QgbUNvbnRhaW5pbmdGcmFtZSA9IG5ldyBSZWN0KCk7CisgICAgICAgIHByaXZhdGUgUmVjdCBtUGFyZW50RnJhbWUgPSBuZXcgUmVjdCgpOworICAgICAgICBwcml2YXRlIFJlY3QgbUNvbnRlbnRGcmFtZSA9IG5ldyBSZWN0KCk7CisgICAgICAgIHByaXZhdGUgUmVjdCBtRnJhbWUgPSBuZXcgUmVjdCgpOworICAgICAgICBwcml2YXRlIFJlY3QgbUNyb3AgPSBuZXcgUmVjdCgpOworCisgICAgICAgIFdpbmRvd1N0YXRlKFdpbmRvd1N0YXRlUHJvdG8gcHJvdG8pIHsKKyAgICAgICAgICAgIHN1cGVyKHByb3RvLndpbmRvd0NvbnRhaW5lcik7CisgICAgICAgICAgICBJZGVudGlmaWVyUHJvdG8gaWRlbnRpZmllclByb3RvID0gcHJvdG8uaWRlbnRpZmllcjsKKyAgICAgICAgICAgIG1OYW1lID0gaWRlbnRpZmllclByb3RvLnRpdGxlOworICAgICAgICAgICAgbUFwcFRva2VuID0gSW50ZWdlci50b0hleFN0cmluZyhpZGVudGlmaWVyUHJvdG8uaGFzaENvZGUpOworICAgICAgICAgICAgbURpc3BsYXlJZCA9IHByb3RvLmRpc3BsYXlJZDsKKyAgICAgICAgICAgIG1TdGFja0lkID0gcHJvdG8uc3RhY2tJZDsKKyAgICAgICAgICAgIGlmIChwcm90by5hdHRyaWJ1dGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtVHlwZSA9IHByb3RvLmF0dHJpYnV0ZXMudHlwZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFdpbmRvd1N0YXRlQW5pbWF0b3JQcm90byBhbmltYXRvclByb3RvID0gcHJvdG8uYW5pbWF0b3I7CisgICAgICAgICAgICBpZiAoYW5pbWF0b3JQcm90byAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGFuaW1hdG9yUHJvdG8uc3VyZmFjZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIFdpbmRvd1N1cmZhY2VDb250cm9sbGVyUHJvdG8gc3VyZmFjZVByb3RvID0gYW5pbWF0b3JQcm90by5zdXJmYWNlOworICAgICAgICAgICAgICAgICAgICBtU2hvd24gPSBzdXJmYWNlUHJvdG8uc2hvd247CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1Dcm9wID0gZXh0cmFjdChhbmltYXRvclByb3RvLmxhc3RDbGlwUmVjdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRnJhbWUgPSBleHRyYWN0KHByb3RvLmZyYW1lKTsKKyAgICAgICAgICAgIG1Db250YWluaW5nRnJhbWUgPSBleHRyYWN0KHByb3RvLmNvbnRhaW5pbmdGcmFtZSk7CisgICAgICAgICAgICBtUGFyZW50RnJhbWUgPSBleHRyYWN0KHByb3RvLnBhcmVudEZyYW1lKTsKKyAgICAgICAgICAgIG1Db250ZW50RnJhbWUgPSBleHRyYWN0KHByb3RvLmNvbnRlbnRGcmFtZSk7CisgICAgICAgICAgICBpZiAobU5hbWUuc3RhcnRzV2l0aChTVEFSVElOR19XSU5ET1dfUFJFRklYKSkgeworICAgICAgICAgICAgICAgIG1XaW5kb3dUeXBlID0gV0lORE9XX1RZUEVfU1RBUlRJTkc7CisgICAgICAgICAgICAgICAgLy8gRXhpc3RpbmcgY29kZSBkZXBlbmRzIG9uIHRoZSBwcmVmaXggYmVpbmcgcmVtb3ZlZAorICAgICAgICAgICAgICAgIG1OYW1lID0gbU5hbWUuc3Vic3RyaW5nKFNUQVJUSU5HX1dJTkRPV19QUkVGSVgubGVuZ3RoKCkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChwcm90by5hbmltYXRpbmdFeGl0KSB7CisgICAgICAgICAgICAgICAgbVdpbmRvd1R5cGUgPSBXSU5ET1dfVFlQRV9FWElUSU5HOworICAgICAgICAgICAgfSBlbHNlIGlmIChtTmFtZS5zdGFydHNXaXRoKERFQlVHR0VSX1dJTkRPV19QUkVGSVgpKSB7CisgICAgICAgICAgICAgICAgbVdpbmRvd1R5cGUgPSBXSU5ET1dfVFlQRV9TVEFSVElORzsKKyAgICAgICAgICAgICAgICBtTmFtZSA9IG1OYW1lLnN1YnN0cmluZyhERUJVR0dFUl9XSU5ET1dfUFJFRklYLmxlbmd0aCgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVdpbmRvd1R5cGUgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm90by5jaGlsZFdpbmRvd3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBXaW5kb3dTdGF0ZVByb3RvIGNoaWxkUHJvdG8gPSBwcm90by5jaGlsZFdpbmRvd3NbaV07CisgICAgICAgICAgICAgICAgV2luZG93U3RhdGUgY2hpbGRXaW5kb3cgPSBuZXcgV2luZG93U3RhdGUoY2hpbGRQcm90byk7CisgICAgICAgICAgICAgICAgbVN1YldpbmRvd3MuYWRkKGNoaWxkV2luZG93KTsKKyAgICAgICAgICAgICAgICBtU3ViV2luZG93cy5hZGRBbGwoY2hpbGRXaW5kb3cuZ2V0V2luZG93cygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBnZXRUb2tlbigpIHsKKyAgICAgICAgICAgIHJldHVybiBtQXBwVG9rZW47CisgICAgICAgIH0KKworICAgICAgICBpbnQgZ2V0RGlzcGxheUlkKCkgeworICAgICAgICAgICAgcmV0dXJuIG1EaXNwbGF5SWQ7CisgICAgICAgIH0KKworICAgICAgICBpbnQgZ2V0U3RhY2tJZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtU3RhY2tJZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBSZWN0IGdldEZyYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIG1GcmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBSZWN0IGdldENvbnRlbnRGcmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ29udGVudEZyYW1lOworICAgICAgICB9CisKKyAgICAgICAgUmVjdCBnZXRDcm9wKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Dcm9wOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTaG93bigpIHsKKyAgICAgICAgICAgIHJldHVybiBtU2hvd247CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldFR5cGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbVR5cGU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFN0cmluZyBnZXRXaW5kb3dUeXBlU3VmZml4KGludCB3aW5kb3dUeXBlKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHdpbmRvd1R5cGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFdJTkRPV19UWVBFX1NUQVJUSU5HOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiBTVEFSVElORyI7CisgICAgICAgICAgICAgICAgY2FzZSBXSU5ET1dfVFlQRV9FWElUSU5HOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiBFWElUSU5HIjsKKyAgICAgICAgICAgICAgICBjYXNlIFdJTkRPV19UWVBFX0RFQlVHR0VSOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiBERUJVR0dFUiI7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiV2luZG93U3RhdGU6IHsiICsgbUFwcFRva2VuICsgIiAiICsgbU5hbWUKKyAgICAgICAgICAgICAgICAgICAgKyBnZXRXaW5kb3dUeXBlU3VmZml4KG1XaW5kb3dUeXBlKSArICJ9IiArICIgdHlwZT0iICsgbVR5cGUKKyAgICAgICAgICAgICAgICAgICAgKyAiIGNmPSIgKyBtQ29udGFpbmluZ0ZyYW1lICsgIiBwZj0iICsgbVBhcmVudEZyYW1lOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMva2V5c3RvcmUvc3JjL2FuZHJvaWQvc2VydmVyL2FtL2NvbXBvbmVudC9Db21wb25lbnRzQmFzZS5qYXZhIGIvdGVzdHMvdGVzdHMva2V5c3RvcmUvc3JjL2FuZHJvaWQvc2VydmVyL2FtL2NvbXBvbmVudC9Db21wb25lbnRzQmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2YzM0NzEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9rZXlzdG9yZS9zcmMvYW5kcm9pZC9zZXJ2ZXIvYW0vY29tcG9uZW50L0NvbXBvbmVudHNCYXNlLmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2ZXIuYW0uY29tcG9uZW50OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CisKKy8qKgorICogQmFzZSBjbGFzcyBmb3IgQ29tcG9uZW50cyBjb25zdGFudHMgaG9sZGluZyBjbGFzcy4KKyAqCisgKiBFdmVyeSB0ZXN0aW5nIEFQSyBzaG91bGQgaGF2ZSBDb21wb25lbnRzIGNsYXNzIGluIEphdmEgcGFja2FnZSB0aGF0IGVxdWFscyB0byBwYWNrYWdlIG9mIEFQSy4KKyAqIFRob3NlIENvbXBvbmVudHMgY2xhc3Mgc2hvdWxkIGV4dGVuZHMge0BsaW5rIENvbXBvbmVudHNCYXNlfS4KKyAqLworcHVibGljIGNsYXNzIENvbXBvbmVudHNCYXNlIHsKKworICAgIC8qKgorICAgICAqIEJ1aWxkIHtAbGluayBDb21wb25lbnROYW1lfSBjb25zdGFudCB3aGljaCBiZWxvbmdzIHRvIHtAY29kZSBjb21wb25lbnRzQ2xhc3N9J3MgcGFja2FnZS4KKyAgICAgKiBAcGFyYW0gY29tcG9uZW50c0NsYXNzIENvbXBvbmVudHMgY2xhc3Mgb2JqZWN0IHdoaWNoIGhhcyB0aGUgc2FtZSBwYWNrYWdlIG9mIEFQSy4KKyAgICAgKiBAcGFyYW0gY2xhc3NOYW1lIHNpbXBsZSBjbGFzcyBuYW1lIChoYXMgbm8gJy4nKSBvciBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZS4KKyAgICAgKiBAcmV0dXJuIHtAbGluayBDb21wb25lbnROYW1lfSBvYmplY3QuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBDb21wb25lbnROYW1lIGNvbXBvbmVudCgKKyAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBDb21wb25lbnRzQmFzZT4gY29tcG9uZW50c0NsYXNzLCBTdHJpbmcgY2xhc3NOYW1lKSB7CisgICAgICAgIGFzc2VydEZhbHNlKCJjbGFzc05hbWUgc2hvdWxkIG5vdCBzdGFydCB3aXRoICcuJyIsIGNsYXNzTmFtZS5zdGFydHNXaXRoKCIuIikpOworICAgICAgICBmaW5hbCBTdHJpbmcgcGFja2FnZU5hbWUgPSBnZXRQYWNrYWdlTmFtZShjb21wb25lbnRzQ2xhc3MpOworICAgICAgICBmaW5hbCBib29sZWFuIGlzU2ltcGxlQ2xhc3NOYW1lID0gY2xhc3NOYW1lLmluZGV4T2YoJy4nKSA8IDA7CisgICAgICAgIGZpbmFsIFN0cmluZyBmdWxsQ2xhc3NOYW1lID0gaXNTaW1wbGVDbGFzc05hbWUgPyBwYWNrYWdlTmFtZSArICIuIiArIGNsYXNzTmFtZSA6IGNsYXNzTmFtZTsKKyAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnROYW1lKHBhY2thZ2VOYW1lLCBmdWxsQ2xhc3NOYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgcGFja2FnZSBuYW1lIG9mIHtAY29kZSBjb21wb25lbnRzQ2xhc3N9LgorICAgICAqIEBwYXJhbSBjb21wb25lbnRzQ2xhc3MgQ29tcG9uZW50cyBjbGFzcyBvYmplY3Qgd2hpY2ggaGFzIHRoZSBzYW1lIHBhY2thZ2Ugb2YgQVBLLgorICAgICAqIEByZXR1cm4gcGFja2FnZSBuYW1lIG9mIEFQSy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZShDbGFzczw/IGV4dGVuZHMgQ29tcG9uZW50c0Jhc2U+IGNvbXBvbmVudHNDbGFzcykgeworICAgICAgICBhc3NlcnRFcXVhbHMoIkNvbXBvbmVudHMiLCBjb21wb25lbnRzQ2xhc3MuZ2V0U2ltcGxlTmFtZSgpKTsKKyAgICAgICAgcmV0dXJuIGNvbXBvbmVudHNDbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2xpYmNvcmVmaWxlaW8vQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL2xpYmNvcmVmaWxlaW8vQW5kcm9pZC5tawppbmRleCBjZmQ5Nzc1Li45YWYzNzUxIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9saWJjb3JlZmlsZWlvL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvdGVzdHMvbGliY29yZWZpbGVpby9BbmRyb2lkLm1rCkBAIC0yMSwxMSArMjEsMTQgQEAKICMgYW5kIHdoZW4gYnVpbHQgZXhwbGljaXRseSBwdXQgaXQgaW4gdGhlIGRhdGEgcGFydGl0aW9uCiBMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQogCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY3RzdGVzdHJ1bm5lciBqdW5pdCBsZWdhY3ktYW5kcm9pZC10ZXN0CitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY3RzdGVzdHJ1bm5lci1heHQganVuaXQKKworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LmJhc2Uuc3R1YnMKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzTGliY29yZUZpbGVJT1Rlc3RDYXNlcworTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAogCiAjIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0CiBMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbGliY29yZWZpbGVpby9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdGVzdHMvbGliY29yZWZpbGVpby9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDQxMWFhOWQuLjEyNzEwODkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2xpYmNvcmVmaWxlaW8vQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9saWJjb3JlZmlsZWlvL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTM2LDcgKzM2LDcgQEAKICAgICAgICAgPC9yZWNlaXZlcj4KICAgICA8L2FwcGxpY2F0aW9uPgogCi0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5saWJjb3JlZmlsZWlvLmN0cyI+CiAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJsaXN0ZW5lciIKICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZhbHVlPSJjb20uYW5kcm9pZC5jdHMucnVubmVyLkN0c1Rlc3RSdW5MaXN0ZW5lciIvPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbGliY29yZWZpbGVpby9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy90ZXN0cy9saWJjb3JlZmlsZWlvL0FuZHJvaWRUZXN0LnhtbAppbmRleCBjMmIyMzBlLi4wNzRhODMzIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9saWJjb3JlZmlsZWlvL0FuZHJvaWRUZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9saWJjb3JlZmlsZWlvL0FuZHJvaWRUZXN0LnhtbApAQCAtMTQsNiArMTQsNyBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIExlZ2FjeSBMaWJjb3JlIHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJsaWJjb3JlIiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9saWJjb3JlbGVnYWN5MjIvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL2xpYmNvcmVsZWdhY3kyMi9BbmRyb2lkLm1rCmluZGV4IGQyNDY4YzMuLjAyOTViODkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2xpYmNvcmVsZWdhY3kyMi9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3Rlc3RzL2xpYmNvcmVsZWdhY3kyMi9BbmRyb2lkLm1rCkBAIC0yMSw3ICsyMSw3IEBACiAjIGFuZCB3aGVuIGJ1aWx0IGV4cGxpY2l0bHkgcHV0IGl0IGluIHRoZSBkYXRhIHBhcnRpdGlvbgogTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKIAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGN0c3Rlc3RydW5uZXIKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjdHN0ZXN0cnVubmVyLWF4dAogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2xpYmNvcmVsZWdhY3kyMi9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdGVzdHMvbGliY29yZWxlZ2FjeTIyL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggMTMxNjEzZS4uOTg0NzhlNCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbGliY29yZWxlZ2FjeTIyL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvbGliY29yZWxlZ2FjeTIyL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTI0LDcgKzI0LDcgQEAKICAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CiAgICAgPC9hcHBsaWNhdGlvbj4KIAotICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQubGliY29yZWxlZ2FjeTIyLmN0cyIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBvZiBhbmRyb2lkIEFQSXMgbGFzdCBhdmFpbGFibGUgaW4gQVBJIDIyIj4KICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9Imxpc3RlbmVyIgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbG9jYXRpb24vQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL2xvY2F0aW9uL0FuZHJvaWQubWsKaW5kZXggYTBiODE0Mi4uNmQ4OGE0ZCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbG9jYXRpb24vQW5kcm9pZC5taworKysgYi90ZXN0cy90ZXN0cy9sb2NhdGlvbi9BbmRyb2lkLm1rCkBAIC0yNiwxMCArMjYsMTAgQEAKIAogTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKIAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKLSAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsIGN0c3Rlc3RydW5uZXIgYXBhY2hlLWNvbW1vbnMtbWF0aAorTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gdGVsZXBob255LWNvbW1vbiBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicwogCi1MT0NBTF9TREtfVkVSU0lPTiA6PSB0ZXN0X2N1cnJlbnQKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCisgICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgY3RzdGVzdHJ1bm5lci1heHQgYXBhY2hlLWNvbW1vbnMtbWF0aCBwbGF0Zm9ybS10ZXN0LWFubm90YXRpb25zCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYy9hbmRyb2lkL2xvY2F0aW9uL2N0cykgXAogICAgJChjYWxsIGFsbC1wcm90by1maWxlcy11bmRlciwgcHJvdG9zKQpAQCAtNDgsOSArNDgsMTEgQEAKIExPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCiAKICMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cyBjdHNfaW5zdGFudAogCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbCBjdHN0ZXN0cnVubmVyICBhcGFjaGUtY29tbW9ucy1tYXRoCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSB0ZWxlcGhvbnktY29tbW9uIGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCisKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBjdHN0ZXN0cnVubmVyLWF4dCAgYXBhY2hlLWNvbW1vbnMtbWF0aAogCiBMT0NBTF9QUk9UT0NfT1BUSU1JWkVfVFlQRSA6PSBuYW5vCiAKQEAgLTU4LDEwICs2MCw5IEBACiAgICAkKGNhbGwgYWxsLXByb3RvLWZpbGVzLXVuZGVyLCBwcm90b3MpCiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNMb2NhdGlvblRlc3RDYXNlcworTE9DQUxfUFJJVkFURV9QTEFURk9STV9BUElTIDo9IHRydWUKIAogTE9DQUxfSkFDS19GTEFHUyA6PSAtLW11bHRpLWRleCBuYXRpdmUKIExPQ0FMX0RYX0ZMQUdTIDo9IC0tbXVsdGktZGV4CiAKLUxPQ0FMX1NES19WRVJTSU9OIDo9IHRlc3RfY3VycmVudAotCiBpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9sb2NhdGlvbi9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdGVzdHMvbG9jYXRpb24vQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCAxMzU3YTM4Li41NTFkZTA2IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9sb2NhdGlvbi9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL2xvY2F0aW9uL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTE2LDcgKzE2LDggQEAKICAtLT4KIAogPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBwYWNrYWdlPSJhbmRyb2lkLmxvY2F0aW9uLmN0cyI+CisgICAgcGFja2FnZT0iYW5kcm9pZC5sb2NhdGlvbi5jdHMiCisgICAgYW5kcm9pZDp0YXJnZXRTYW5kYm94VmVyc2lvbj0iMiI+CiAKICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkRJU0FCTEVfS0VZR1VBUkQiIC8+CiAgICAgPGFwcGxpY2F0aW9uPgpAQCAtMjgsMTAgKzI5LDE2IEBACiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5BQ0NFU1NfTE9DQVRJT05fRVhUUkFfQ09NTUFORFMiLz4KIAogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX05FVFdPUktfU1RBVEUiIC8+Ci0gICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5BQ0NFU1NfV0lGSV9TVEFURSIgLz4+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5BQ0NFU1NfV0lGSV9TVEFURSIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkNIQU5HRV9XSUZJX1NUQVRFIiAvPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uSU5URVJORVQiIC8+CiAKLSAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfUEhPTkVfU1RBVEUiLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfU01TIi8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX1BIT05FX05VTUJFUlMiLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlJFQ0VJVkVfU01TIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uU0VORF9TTVMiIC8+CisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5sb2NhdGlvbi5jdHMiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgdGVzdHMgb2YgYW5kcm9pZC5sb2NhdGlvbiI+CiAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJsaXN0ZW5lciIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2xvY2F0aW9uL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL2xvY2F0aW9uL0FuZHJvaWRUZXN0LnhtbAppbmRleCA0ZjU1YTkzLi5jNjllMjI0IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9sb2NhdGlvbi9BbmRyb2lkVGVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvbG9jYXRpb24vQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgTG9jYXRpb24gdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImxvY2F0aW9uIiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRhcmdldHByZXAuTG9jYXRpb25DaGVjayIgLz4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2xvY2F0aW9uL3NyYy9hbmRyb2lkL2xvY2F0aW9uL2N0cy9BZGRyZXNzVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvbG9jYXRpb24vc3JjL2FuZHJvaWQvbG9jYXRpb24vY3RzL0FkZHJlc3NUZXN0LmphdmEKaW5kZXggNDExYTY4Ny4uNWU0NGI2MSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbG9jYXRpb24vc3JjL2FuZHJvaWQvbG9jYXRpb24vY3RzL0FkZHJlc3NUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvbG9jYXRpb24vc3JjL2FuZHJvaWQvbG9jYXRpb24vY3RzL0FkZHJlc3NUZXN0LmphdmEKQEAgLTMyOSw2ICszMjksOCBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoYWRkcmVzcy5nZXRQaG9uZSgpLCBwYXJjZWwucmVhZFN0cmluZygpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKGFkZHJlc3MuZ2V0VXJsKCksIHBhcmNlbC5yZWFkU3RyaW5nKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoYWRkcmVzcy5nZXRFeHRyYXMoKSwgcGFyY2VsLnJlYWRCdW5kbGUoKSk7CisKKyAgICAgICAgcGFyY2VsLnJlY3ljbGUoKTsKICAgICB9CiAKICAgICBwcml2YXRlIGNsYXNzIE1vY2tQYXJjZWxhYmxlIGltcGxlbWVudHMgUGFyY2VsYWJsZSB7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9sb2NhdGlvbi9zcmMvYW5kcm9pZC9sb2NhdGlvbi9jdHMvQ3JpdGVyaWFUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9sb2NhdGlvbi9zcmMvYW5kcm9pZC9sb2NhdGlvbi9jdHMvQ3JpdGVyaWFUZXN0LmphdmEKaW5kZXggNDIyZjU2MS4uOTdiNDA3OSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbG9jYXRpb24vc3JjL2FuZHJvaWQvbG9jYXRpb24vY3RzL0NyaXRlcmlhVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2xvY2F0aW9uL3NyYy9hbmRyb2lkL2xvY2F0aW9uL2N0cy9Dcml0ZXJpYVRlc3QuamF2YQpAQCAtMjE3LDUgKzIxNyw3IEBACiAgICAgICAgIGFzc2VydEVxdWFscyhjcml0ZXJpYS5pc0JlYXJpbmdSZXF1aXJlZCgpLCBuZXdDcml0ZXJpYS5pc0JlYXJpbmdSZXF1aXJlZCgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKGNyaXRlcmlhLmlzU3BlZWRSZXF1aXJlZCgpLCBuZXdDcml0ZXJpYS5pc1NwZWVkUmVxdWlyZWQoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhjcml0ZXJpYS5pc0Nvc3RBbGxvd2VkKCksIG5ld0NyaXRlcmlhLmlzQ29zdEFsbG93ZWQoKSk7CisKKyAgICAgICAgcGFyY2VsLnJlY3ljbGUoKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9sb2NhdGlvbi9zcmMvYW5kcm9pZC9sb2NhdGlvbi9jdHMvRW1lcmdlbmN5Q2FsbE1lc3NhZ2VUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9sb2NhdGlvbi9zcmMvYW5kcm9pZC9sb2NhdGlvbi9jdHMvRW1lcmdlbmN5Q2FsbE1lc3NhZ2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdkYmM4OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2xvY2F0aW9uL3NyYy9hbmRyb2lkL2xvY2F0aW9uL2N0cy9FbWVyZ2VuY3lDYWxsTWVzc2FnZVRlc3QuamF2YQpAQCAtMCwwICsxLDMzMyBAQAorcGFja2FnZSBhbmRyb2lkLmxvY2F0aW9uLmN0czsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5TbXNNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlRlbGVwaG9ueU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmFuZHJvaWQubW1zLkNvbnRlbnRUeXBlOworaW1wb3J0IGNvbS5nb29nbGUuYW5kcm9pZC5tbXMuSW52YWxpZEhlYWRlclZhbHVlRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LkNoYXJhY3RlclNldHM7CitpbXBvcnQgY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuRW5jb2RlZFN0cmluZ1ZhbHVlOworaW1wb3J0IGNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LkdlbmVyaWNQZHU7CitpbXBvcnQgY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuUGR1Qm9keTsKK2ltcG9ydCBjb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5QZHVDb21wb3NlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5QZHVIZWFkZXJzOworaW1wb3J0IGNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LlBkdVBhcnNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5QZHVQYXJ0OworaW1wb3J0IGNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LlNlbmRDb25mOworaW1wb3J0IGNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LlNlbmRSZXE7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworLyoqCisgKiBUZXN0IHNlbmRpbmcgU01TIGFuZCBNTVMgdXNpbmcge0BsaW5rIGFuZHJvaWQudGVsZXBob255LlNtc01hbmFnZXJ9LgorICovCitwdWJsaWMgY2xhc3MgRW1lcmdlbmN5Q2FsbE1lc3NhZ2VUZXN0IGV4dGVuZHMgR25zc1Rlc3RDYXNlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRW1lcmdlbmN5Q2FsbE1TR1Rlc3QiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9NTVNfU0VOVCA9ICJDVFNfTU1TX1NFTlRfQUNUSU9OIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIERFRkFVTFRfRVhQSVJZX1RJTUVfU0VDUyA9IFRpbWVVbml0LkRBWVMudG9TZWNvbmRzKDcpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgTU1TX0NPTkZJR19ERUxBWV9NSUxMSVMgPSBUaW1lVW5pdC5TRUNPTkRTLnRvTWlsbGlzKDEpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1BSSU9SSVRZID0gUGR1SGVhZGVycy5QUklPUklUWV9OT1JNQUw7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgc2hvcnQgREVGQVVMVF9EQVRBX1NNU19QT1JUID0gODA5MTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEhPTkVfTlVNQkVSX0tFWSA9ICJhbmRyb2lkLmN0cy5lbWVyZ2VuY3ljYWxsLnBob25lbnVtYmVyIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VCSkVDVCA9ICJDVFMgRW1lcmdlbmN5IENhbGwgTU1TIFRlc3QiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNTVNfTUVTU0FHRV9CT0RZID0gIkNUUyBFbWVyZ2VuY3kgQ2FsbCBNTVMgdGVzdCBtZXNzYWdlIGJvZHkiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTTVNfTUVTU0FHRV9CT0RZID0gIkNUUyBFbWVyZ2VuY3kgQ2FsbCBTbXMgdGVzdCBtZXNzYWdlIGJvZHkiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTTVNfREFUQV9NRVNTQUdFX0JPRFkgPQorICAgICAgICAiQ1RTIEVtZXJnZW5jeSBDYWxsIFNtcyBkYXRhIHRlc3QgbWVzc2FnZSBib2R5IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9QQVJUX0ZJTEVOQU1FID0gInRleHRfMC50eHQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTTUlMX1RFWFQgPQorICAgICAgICAgICAgIjxzbWlsPiIgKworICAgICAgICAgICAgICAgICAgICAiPGhlYWQ+IiArCisgICAgICAgICAgICAgICAgICAgICAgICAiPGxheW91dD4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHJvb3QtbGF5b3V0Lz4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHJlZ2lvbiBoZWlnaHQ9XCIxMDAlJVwiIGlkPVwiVGV4dFwiIGxlZnQ9XCIwJSVcIiB0b3A9XCIwJSVcIiB3aWR0aD1cIjEwMCUlXCIvPiIgKworICAgICAgICAgICAgICAgICAgICAgICAgIjwvbGF5b3V0PiIgKworICAgICAgICAgICAgICAgICAgICAiPC9oZWFkPiIgKworICAgICAgICAgICAgICAgICAgICAiPGJvZHk+IiArCisgICAgICAgICAgICAgICAgICAgICAgICAiPHBhciBkdXI9XCI4MDAwbXNcIj4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHRleHQgc3JjPVwiJXNcIiByZWdpb249XCJUZXh0XCIvPiIgKworICAgICAgICAgICAgICAgICAgICAgICAgIjwvcGFyPiIgKworICAgICAgICAgICAgICAgICAgICAiPC9ib2R5PiIgKworICAgICAgICAgICAgIjwvc21pbD4iOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBTRU5UX1RJTUVPVVRfTUlMTElTID0gVGltZVVuaXQuTUlOVVRFUy50b01pbGxpcyg1KTsgLy8gNSBtaW51dGVzCisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPVklERVJfQVVUSE9SSVRZID0gImVtZXJnZW5jeWNhbGx2ZXJpZmllciI7CisKKyAgICBwcml2YXRlIFJhbmRvbSBtUmFuZG9tOworICAgIHByaXZhdGUgU2VudFJlY2VpdmVyIG1TZW50UmVjZWl2ZXI7CisgICAgcHJpdmF0ZSBUZWxlcGhvbnlNYW5hZ2VyIG1UZWxlcGhvbnlNYW5hZ2VyOworICAgIHByaXZhdGUgUGFja2FnZU1hbmFnZXIgbVBhY2thZ2VNYW5hZ2VyOworCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2VudFJlY2VpdmVyIGV4dGVuZHMgQnJvYWRjYXN0UmVjZWl2ZXIgeworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbVN1Y2Nlc3M7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtRG9uZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb3VudERvd25MYXRjaCBtTGF0Y2g7CisgICAgICAgIHB1YmxpYyBTZW50UmVjZWl2ZXIoKSB7CisgICAgICAgICAgICBtTGF0Y2ggPSAgbmV3IENvdW50RG93bkxhdGNoKDEpOworICAgICAgICAgICAgbVN1Y2Nlc3MgPSBmYWxzZTsKKyAgICAgICAgICAgIG1Eb25lID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgTG9nLmkoVEFHLCAiQWN0aW9uICIgKyBpbnRlbnQuZ2V0QWN0aW9uKCkpOworICAgICAgICAgICAgaWYgKCFBQ1RJT05fTU1TX1NFTlQuZXF1YWxzKGludGVudC5nZXRBY3Rpb24oKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBpbnQgcmVzdWx0Q29kZSA9IGdldFJlc3VsdENvZGUoKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHRDb2RlID09IEFjdGl2aXR5LlJFU1VMVF9PSykgeworICAgICAgICAgICAgICAgIGZpbmFsIGJ5dGVbXSByZXNwb25zZSA9IGludGVudC5nZXRCeXRlQXJyYXlFeHRyYShTbXNNYW5hZ2VyLkVYVFJBX01NU19EQVRBKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBHZW5lcmljUGR1IHBkdSA9IG5ldyBQZHVQYXJzZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UsIHNob3VsZFBhcnNlQ29udGVudERpc3Bvc2l0aW9uKCkpLnBhcnNlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwZHUgIT0gbnVsbCAmJiBwZHUgaW5zdGFuY2VvZiBTZW5kQ29uZikgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU2VuZENvbmYgc2VuZENvbmYgPSAoU2VuZENvbmYpIHBkdTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZW5kQ29uZi5nZXRSZXNwb25zZVN0YXR1cygpID09IFBkdUhlYWRlcnMuUkVTUE9OU0VfU1RBVFVTX09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1Y2Nlc3MgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJTZW5kQ29uZiByZXNwb25zZSBzdGF0dXM9IiArIHNlbmRDb25mLmdldFJlc3BvbnNlU3RhdHVzKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiTm90IGEgU2VuZENvbmY6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGR1ICE9IG51bGwgPyBwZHUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkgOiAiTlVMTCIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkVtcHR5IHJlc3BvbnNlIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJGYWlsdXJlIHJlc3VsdD0iICsgcmVzdWx0Q29kZSk7CisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdENvZGUgPT0gU21zTWFuYWdlci5NTVNfRVJST1JfSFRUUF9GQUlMVVJFKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBodHRwRXJyb3IgPSBpbnRlbnQuZ2V0SW50RXh0cmEoU21zTWFuYWdlci5FWFRSQV9NTVNfSFRUUF9TVEFUVVMsIDApOworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJIVFRQIGZhaWx1cmU9IiArIGh0dHBFcnJvcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbURvbmUgPSB0cnVlOworICAgICAgICAgICAgbUxhdGNoLmNvdW50RG93bigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gd2FpdEZvclN1Y2Nlc3MobG9uZyB0aW1lb3V0TXMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgbUxhdGNoLmF3YWl0KHRpbWVvdXRNcywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgIExvZy5pKFRBRywgIldhaXQgZm9yIHNlbnQ6IGRvbmU9IiArIG1Eb25lICsgIiwgc3VjY2Vzcz0iICsgbVN1Y2Nlc3MpOworICAgICAgICAgICAgcmV0dXJuIG1Eb25lICYmIG1TdWNjZXNzOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKworICAgICAgICBtUmFuZG9tID0gbmV3IFJhbmRvbShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgIG1UZWxlcGhvbnlNYW5hZ2VyID0KKyAgICAgICAgICAgICAgICAoVGVsZXBob255TWFuYWdlcikgbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlRFTEVQSE9OWV9TRVJWSUNFKTsKKyAgICAgICAgbVBhY2thZ2VNYW5hZ2VyID0gbUNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZFNtc01lc3NhZ2UoKSB7CisgICAgICAgIC8vIHRoaXMgdGVzdCBpcyBvbmx5IGZvciBjdHMgdmVyaWZpZXIKKyAgICAgICAgaWYgKCFpc0N0c1ZlcmlmaWVyVGVzdCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU21zTWFuYWdlciBzbXNNYW5hZ2VyID0gU21zTWFuYWdlci5nZXREZWZhdWx0KCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBzZWxmTnVtYmVyID0gZ2V0UGhvbmVOdW1iZXIobUNvbnRleHQpOworICAgICAgICBzbXNNYW5hZ2VyLnNlbmRUZXh0TWVzc2FnZShzZWxmTnVtYmVyLCBudWxsLCBTTVNfTUVTU0FHRV9CT0RZLCBudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZFNtc0RhdGFNZXNzYWdlKCkgeworICAgICAgICAvLyB0aGlzIHRlc3QgaXMgb25seSBmb3IgY3RzIHZlcmlmaWVyCisgICAgICAgIGlmICghaXNDdHNWZXJpZmllclRlc3QoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFNtc01hbmFnZXIgc21zTWFuYWdlciA9IFNtc01hbmFnZXIuZ2V0RGVmYXVsdCgpOworICAgICAgICBmaW5hbCBTdHJpbmcgc2VsZk51bWJlciA9IGdldFBob25lTnVtYmVyKG1Db250ZXh0KTsKKyAgICAgICAgc21zTWFuYWdlci5zZW5kRGF0YU1lc3NhZ2Uoc2VsZk51bWJlciwgbnVsbCwgREVGQVVMVF9EQVRBX1NNU19QT1JULAorICAgICAgICAgICAgU01TX0RBVEFfTUVTU0FHRV9CT0RZLmdldEJ5dGVzKCksIG51bGwsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kTW1zTWVzc2FnZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyB0aGlzIHRlc3QgaXMgb25seSBmb3IgY3RzIHZlcmlmaWVyCisgICAgICAgIGlmICghaXNDdHNWZXJpZmllclRlc3QoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICghbVBhY2thZ2VNYW5hZ2VyLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9URUxFUEhPTlkpCisgICAgICAgICAgICAgfHwgIWRvZXNTdXBwb3J0TU1TKCkpIHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgInRlc3RTZW5kTW1zTWVzc2FnZSBza2lwcGVkOiBubyB0ZWxlcGhvbnkgYXZhaWxhYmxlIG9yIE1NUyBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBMb2cuaShUQUcsICJ0ZXN0U2VuZE1tc01lc3NhZ2UiKTsKKyAgICAgICAgLy8gUHJpbWUgdGhlIE1tc1NlcnZpY2Ugc28gdGhhdCBNTVMgY29uZmlnIGlzIGxvYWRlZAorICAgICAgICBmaW5hbCBTbXNNYW5hZ2VyIHNtc01hbmFnZXIgPSBTbXNNYW5hZ2VyLmdldERlZmF1bHQoKTsKKyAgICAgICAgLy8gTU1TIGNvbmZpZyBpcyBsb2FkZWQgYXN5bmNocm9ub3VzbHkuIFdhaXQgYSBiaXQgc28gaXQgd2lsbCBiZSBsb2FkZWQuCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoTU1TX0NPTkZJR19ERUxBWV9NSUxMSVMpOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCA9IGdldENvbnRleHQoKTsKKyAgICAgICAgLy8gUmVnaXN0ZXIgc2VudCByZWNlaXZlcgorICAgICAgICBtU2VudFJlY2VpdmVyID0gbmV3IFNlbnRSZWNlaXZlcigpOworICAgICAgICBjb250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIobVNlbnRSZWNlaXZlciwgbmV3IEludGVudEZpbHRlcihBQ1RJT05fTU1TX1NFTlQpKTsKKyAgICAgICAgLy8gQ3JlYXRlIGxvY2FsIHByb3ZpZGVyIGZpbGUgZm9yIHNlbmRpbmcgUERVCisgICAgICAgIGZpbmFsIFN0cmluZyBmaWxlTmFtZSA9ICJzZW5kLiIgKyBTdHJpbmcudmFsdWVPZihNYXRoLmFicyhtUmFuZG9tLm5leHRMb25nKCkpKSArICIuZGF0IjsKKyAgICAgICAgZmluYWwgRmlsZSBzZW5kRmlsZSA9IG5ldyBGaWxlKGNvbnRleHQuZ2V0Q2FjaGVEaXIoKSwgZmlsZU5hbWUpOworICAgICAgICBmaW5hbCBTdHJpbmcgc2VsZk51bWJlciA9IGdldFBob25lTnVtYmVyKGNvbnRleHQpOworICAgICAgICBhc3NlcnRUcnVlKCFUZXh0VXRpbHMuaXNFbXB0eShzZWxmTnVtYmVyKSk7CisgICAgICAgIGZpbmFsIGJ5dGVbXSBwZHUgPSBidWlsZFBkdShjb250ZXh0LCBzZWxmTnVtYmVyLCBTVUJKRUNULCBNTVNfTUVTU0FHRV9CT0RZKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChwZHUpOworICAgICAgICBhc3NlcnRUcnVlKHdyaXRlUGR1KHNlbmRGaWxlLCBwZHUpKTsKKyAgICAgICAgZmluYWwgVXJpIGNvbnRlbnRVcmkgPSAobmV3IFVyaS5CdWlsZGVyKCkpCisgICAgICAgICAgICAgICAgLmF1dGhvcml0eShQUk9WSURFUl9BVVRIT1JJVFkpCisgICAgICAgICAgICAgICAgLnBhdGgoZmlsZU5hbWUpCisgICAgICAgICAgICAgICAgLnNjaGVtZShDb250ZW50UmVzb2x2ZXIuU0NIRU1FX0NPTlRFTlQpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIC8vIFNlbmQKKyAgICAgICAgZmluYWwgUGVuZGluZ0ludGVudCBwZW5kaW5nSW50ZW50ID0gUGVuZGluZ0ludGVudC5nZXRCcm9hZGNhc3QoCisgICAgICAgICAgICAgICAgY29udGV4dCwgMCwgbmV3IEludGVudChBQ1RJT05fTU1TX1NFTlQpLCAwKTsKKyAgICAgICAgc21zTWFuYWdlci5zZW5kTXVsdGltZWRpYU1lc3NhZ2UoY29udGV4dCwKKyAgICAgICAgICAgICAgICBjb250ZW50VXJpLCBudWxsLypsb2NhdGlvblVybCovLCBudWxsLypjb25maWdPdmVycmlkZXMqLywgcGVuZGluZ0ludGVudCk7CisgICAgICAgIGFzc2VydFRydWUobVNlbnRSZWNlaXZlci53YWl0Rm9yU3VjY2VzcyhTRU5UX1RJTUVPVVRfTUlMTElTKSk7CisgICAgICAgIHNlbmRGaWxlLmRlbGV0ZSgpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gd3JpdGVQZHUoRmlsZSBmaWxlLCBieXRlW10gcGR1KSB7CisgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gd3JpdGVyID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdyaXRlciA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOworICAgICAgICAgICAgd3JpdGVyLndyaXRlKHBkdSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3RyaW5nIHN0YWNrVHJhY2UgPSBMb2cuZ2V0U3RhY2tUcmFjZVN0cmluZyhlKTsKKyAgICAgICAgICAgIExvZy5pKFRBRywgc3RhY2tUcmFjZSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAod3JpdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGJ1aWxkUGR1KENvbnRleHQgY29udGV4dCwgU3RyaW5nIHNlbGZOdW1iZXIsIFN0cmluZyBzdWJqZWN0LAorICAgICAgIFN0cmluZyB0ZXh0KSB7CisgICAgICAgIGZpbmFsIFNlbmRSZXEgcmVxID0gbmV3IFNlbmRSZXEoKTsKKyAgICAgICAgLy8gRnJvbSwgcGVyIHNwZWMKKyAgICAgICAgcmVxLnNldEZyb20obmV3IEVuY29kZWRTdHJpbmdWYWx1ZShzZWxmTnVtYmVyKSk7CisgICAgICAgIC8vIFRvCisgICAgICAgIGZpbmFsIFN0cmluZ1tdIHJlY2lwaWVudHMgPSBuZXcgU3RyaW5nWzFdOworICAgICAgICByZWNpcGllbnRzWzBdID0gc2VsZk51bWJlcjsKKyAgICAgICAgZmluYWwgRW5jb2RlZFN0cmluZ1ZhbHVlW10gZW5jb2RlZE51bWJlcnMgPSBFbmNvZGVkU3RyaW5nVmFsdWUuZW5jb2RlU3RyaW5ncyhyZWNpcGllbnRzKTsKKyAgICAgICAgaWYgKGVuY29kZWROdW1iZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlcS5zZXRUbyhlbmNvZGVkTnVtYmVycyk7CisgICAgICAgIH0KKyAgICAgICAgLy8gU3ViamVjdAorICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHN1YmplY3QpKSB7CisgICAgICAgICAgICByZXEuc2V0U3ViamVjdChuZXcgRW5jb2RlZFN0cmluZ1ZhbHVlKHN1YmplY3QpKTsKKyAgICAgICAgfQorICAgICAgICAvLyBEYXRlCisgICAgICAgIHJlcS5zZXREYXRlKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC8gMTAwMCk7CisgICAgICAgIC8vIEJvZHkKKyAgICAgICAgZmluYWwgUGR1Qm9keSBib2R5ID0gbmV3IFBkdUJvZHkoKTsKKyAgICAgICAgLy8gQWRkIHRleHQgcGFydC4gQWx3YXlzIGFkZCBhIHNtaWwgcGFydCBmb3IgY29tcGF0aWJpbGl0eSwgd2l0aG91dCBpdCB0aGVyZQorICAgICAgICAvLyBtYXkgYmUgaXNzdWVzIG9uIHNvbWUgY2FycmllcnMvY2xpZW50IGFwcHMKKyAgICAgICAgZmluYWwgaW50IHNpemUgPSBhZGRUZXh0UGFydChib2R5LCB0ZXh0LCB0cnVlLyogYWRkIHRleHQgc21pbCAqLyk7CisgICAgICAgIHJlcS5zZXRCb2R5KGJvZHkpOworICAgICAgICAvLyBNZXNzYWdlIHNpemUKKyAgICAgICAgcmVxLnNldE1lc3NhZ2VTaXplKHNpemUpOworICAgICAgICAvLyBNZXNzYWdlIGNsYXNzCisgICAgICAgIHJlcS5zZXRNZXNzYWdlQ2xhc3MoUGR1SGVhZGVycy5NRVNTQUdFX0NMQVNTX1BFUlNPTkFMX1NUUi5nZXRCeXRlcygpKTsKKyAgICAgICAgLy8gRXhwaXJ5CisgICAgICAgIHJlcS5zZXRFeHBpcnkoREVGQVVMVF9FWFBJUllfVElNRV9TRUNTKTsKKyAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBzZXQgbWV0aG9kcyB0aHJvdyBJbnZhbGlkSGVhZGVyVmFsdWVFeGNlcHRpb24KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIFByaW9yaXR5CisgICAgICAgICAgICByZXEuc2V0UHJpb3JpdHkoREVGQVVMVF9QUklPUklUWSk7CisgICAgICAgICAgICAvLyBEZWxpdmVyeSByZXBvcnQKKyAgICAgICAgICAgIHJlcS5zZXREZWxpdmVyeVJlcG9ydChQZHVIZWFkZXJzLlZBTFVFX05PKTsKKyAgICAgICAgICAgIC8vIFJlYWQgcmVwb3J0CisgICAgICAgICAgICByZXEuc2V0UmVhZFJlcG9ydChQZHVIZWFkZXJzLlZBTFVFX05PKTsKKyAgICAgICAgfSBjYXRjaCAoSW52YWxpZEhlYWRlclZhbHVlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5ldyBQZHVDb21wb3Nlcihjb250ZXh0LCByZXEpLm1ha2UoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgYWRkVGV4dFBhcnQoUGR1Qm9keSBwYiwgU3RyaW5nIG1lc3NhZ2UsIGJvb2xlYW4gYWRkVGV4dFNtaWwpIHsKKyAgICAgICAgZmluYWwgUGR1UGFydCBwYXJ0ID0gbmV3IFBkdVBhcnQoKTsKKyAgICAgICAgLy8gU2V0IENoYXJzZXQgaWYgaXQncyBhIHRleHQgbWVkaWEuCisgICAgICAgIHBhcnQuc2V0Q2hhcnNldChDaGFyYWN0ZXJTZXRzLlVURl84KTsKKyAgICAgICAgLy8gU2V0IENvbnRlbnQtVHlwZS4KKyAgICAgICAgcGFydC5zZXRDb250ZW50VHlwZShDb250ZW50VHlwZS5URVhUX1BMQUlOLmdldEJ5dGVzKCkpOworICAgICAgICAvLyBTZXQgQ29udGVudC1Mb2NhdGlvbi4KKyAgICAgICAgcGFydC5zZXRDb250ZW50TG9jYXRpb24oVEVYVF9QQVJUX0ZJTEVOQU1FLmdldEJ5dGVzKCkpOworICAgICAgICBpbnQgaW5kZXggPSBURVhUX1BBUlRfRklMRU5BTUUubGFzdEluZGV4T2YoIi4iKTsKKyAgICAgICAgU3RyaW5nIGNvbnRlbnRJZCA9IChpbmRleCA9PSAtMSkgPyBURVhUX1BBUlRfRklMRU5BTUUKKyAgICAgICAgICAgICAgICA6IFRFWFRfUEFSVF9GSUxFTkFNRS5zdWJzdHJpbmcoMCwgaW5kZXgpOworICAgICAgICBwYXJ0LnNldENvbnRlbnRJZChjb250ZW50SWQuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIHBhcnQuc2V0RGF0YShtZXNzYWdlLmdldEJ5dGVzKCkpOworICAgICAgICBwYi5hZGRQYXJ0KHBhcnQpOworICAgICAgICBpZiAoYWRkVGV4dFNtaWwpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzbWlsID0gU3RyaW5nLmZvcm1hdChTTUlMX1RFWFQsIFRFWFRfUEFSVF9GSUxFTkFNRSk7CisgICAgICAgICAgICBhZGRTbWlsUGFydChwYiwgc21pbCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhcnQuZ2V0RGF0YSgpLmxlbmd0aDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFNtaWxQYXJ0KFBkdUJvZHkgcGIsIFN0cmluZyBzbWlsKSB7CisgICAgICAgIGZpbmFsIFBkdVBhcnQgc21pbFBhcnQgPSBuZXcgUGR1UGFydCgpOworICAgICAgICBzbWlsUGFydC5zZXRDb250ZW50SWQoInNtaWwiLmdldEJ5dGVzKCkpOworICAgICAgICBzbWlsUGFydC5zZXRDb250ZW50TG9jYXRpb24oInNtaWwueG1sIi5nZXRCeXRlcygpKTsKKyAgICAgICAgc21pbFBhcnQuc2V0Q29udGVudFR5cGUoQ29udGVudFR5cGUuQVBQX1NNSUwuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIHNtaWxQYXJ0LnNldERhdGEoc21pbC5nZXRCeXRlcygpKTsKKyAgICAgICAgcGIuYWRkUGFydCgwLCBzbWlsUGFydCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFBob25lTnVtYmVyKENvbnRleHQgY29udGV4dCkgeworICAgICAgICBmaW5hbCBUZWxlcGhvbnlNYW5hZ2VyIHRlbGVwaG9ueU1hbmFnZXIgPSAoVGVsZXBob255TWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKAorICAgICAgICAgICAgICAgIENvbnRleHQuVEVMRVBIT05ZX1NFUlZJQ0UpOworICAgICAgICBTdHJpbmcgcGhvbmVOdW1iZXIgPSB0ZWxlcGhvbnlNYW5hZ2VyLmdldExpbmUxTnVtYmVyKCk7CisgICAgICAgIGlmIChwaG9uZU51bWJlci50cmltKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBwaG9uZU51bWJlciA9IFN5c3RlbS5nZXRQcm9wZXJ0eShQSE9ORV9OVU1CRVJfS0VZKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGhvbmVOdW1iZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzaG91bGRQYXJzZUNvbnRlbnREaXNwb3NpdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIFNtc01hbmFnZXIKKyAgICAgICAgICAgICAgICAuZ2V0RGVmYXVsdCgpCisgICAgICAgICAgICAgICAgLmdldENhcnJpZXJDb25maWdWYWx1ZXMoKQorICAgICAgICAgICAgICAgIC5nZXRCb29sZWFuKFNtc01hbmFnZXIuTU1TX0NPTkZJR19TVVBQT1JUX01NU19DT05URU5UX0RJU1BPU0lUSU9OLCB0cnVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGRvZXNTdXBwb3J0TU1TKCkgeworICAgICAgICByZXR1cm4gU21zTWFuYWdlcgorICAgICAgICAgICAgICAgIC5nZXREZWZhdWx0KCkKKyAgICAgICAgICAgICAgICAuZ2V0Q2FycmllckNvbmZpZ1ZhbHVlcygpCisgICAgICAgICAgICAgICAgLmdldEJvb2xlYW4oU21zTWFuYWdlci5NTVNfQ09ORklHX01NU19FTkFCTEVELCB0cnVlKTsKKyAgICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9sb2NhdGlvbi9zcmMvYW5kcm9pZC9sb2NhdGlvbi9jdHMvRW1lcmdlbmN5Q2FsbFdpZmlUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9sb2NhdGlvbi9zcmMvYW5kcm9pZC9sb2NhdGlvbi9jdHMvRW1lcmdlbmN5Q2FsbFdpZmlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM2YWM2YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL2xvY2F0aW9uL3NyYy9hbmRyb2lkL2xvY2F0aW9uL2N0cy9FbWVyZ2VuY3lDYWxsV2lmaVRlc3QuamF2YQpAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubG9jYXRpb24uY3RzOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC53aWZpLlNjYW5SZXN1bHQ7CitpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuU29ja2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byB0ZXN0IFdpZmkgcmVhbHRlZCBmZWF0dXJlcy4KKyAqLworcHVibGljIGNsYXNzIEVtZXJnZW5jeUNhbGxXaWZpVGVzdCBleHRlbmRzIEduc3NUZXN0Q2FzZSB7CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFHID0gRW1lcmdlbmN5Q2FsbFdpZmlUZXN0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKTsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTEFUQ0hfTkFNRSA9ICJFbWVyZ2VuY3lDYWxsV2lmaVRlc3QiOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBHT09HTEVfVVJMID0gInd3dy5nb29nbGUuY29tIjsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgV0VCX1BPUlQgPSA4MDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQkFUQ0hfU0NBTl9CU1NJRF9MSU1JVCA9IDI1OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXSUZJX1NDQU5fVElNRU9VVF9TRUMgPSAzMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFNFVFRJTkdTX1BFUklPRF9NUyA9IFRpbWVVbml0LlNFQ09ORFMudG9NaWxsaXMoNCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBJTlRFUk5FVF9DT05ORUNUSU9OX1RJTUVPVVQgPSBUaW1lVW5pdC5TRUNPTkRTLnRvTWlsbGlzKDIpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNSU5fU0NBTl9DT1VOVCA9IDE7CisKKyAgICBwcml2YXRlIFdpZmlNYW5hZ2VyIG1XaWZpTWFuYWdlcjsKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBXaWZpU2NhblJlY2VpdmVyIG1XaWZpU2NhblJlY2VpdmVyOworICAgIHByaXZhdGUgaW50IG1TY2FuQ291bnRlciA9IDA7CisgICAgcHJpdmF0ZSBDb3VudERvd25MYXRjaCBtTGF0Y2g7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICBtQ29udGV4dCA9IGdldENvbnRleHQoKTsKKyAgICAgICAgbVdpZmlNYW5hZ2VyID0gKFdpZmlNYW5hZ2VyKSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKG1Db250ZXh0LldJRklfU0VSVklDRSk7CisgICAgICAgIG1XaWZpU2NhblJlY2VpdmVyID0gbmV3IFdpZmlTY2FuUmVjZWl2ZXIoKTsKKyAgICB9CisKKyAgICBAQXBwTW9kZUZ1bGwocmVhc29uID0gIlJlcXVpcmVzIHJlZ2lzdGVyaW5nIGEgYnJvYWRjYXN0IHJlY2VpdmVyIikKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2lmaVNjYW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtV2lmaVNjYW5SZWNlaXZlciwgbmV3IEludGVudEZpbHRlcigKKyAgICAgICAgICAgICAgICBXaWZpTWFuYWdlci5TQ0FOX1JFU1VMVFNfQVZBSUxBQkxFX0FDVElPTikpOworICAgICAgICBtTGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgICAgIG1XaWZpTWFuYWdlci5zdGFydFNjYW4oKTsKKyAgICAgICAgTG9nLmQoVEFHLCAiV2FpdGluZyBmb3Igd2lmaVNjYW4gdG8gY29tcGxldGUuIik7CisgICAgICAgIG1MYXRjaC5hd2FpdChXSUZJX1NDQU5fVElNRU9VVF9TRUMsIFRpbWVVbml0LlNFQ09ORFMpOworICAgICAgICBpZiAobVNjYW5Db3VudGVyIDwgTUlOX1NDQU5fQ09VTlQpIHsKKyAgICAgICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiRXhwZWN0ZWQgYXQgbGVhc3QgJWQgc2NhbnMgYnV0IG9ubHkgJWQgc2NhbnMgaGFwcGVuZWQiLAorICAgICAgICAgICAgTUlOX1NDQU5fQ09VTlQsIG1TY2FuQ291bnRlcikpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFdpZmlDb25uZWN0aW9uKCkgeworICAgICAgICBib29sZWFuIGlzUmVhY2hhYmxlID0KKyAgICAgICAgICAgIGlzUmVhY2hhYmxlKEdPT0dMRV9VUkwsIFdFQl9QT1JULCAoaW50KUlOVEVSTkVUX0NPTk5FQ1RJT05fVElNRU9VVCk7CisgICAgICAgIGFzc2VydFRydWUoIkNhbiBub3QgY29ubmVjdCB0byBnb29nbGUuY29tLiIKKyAgICAgICAgICsgIiBQbGVhc2UgbWFrZSBzdXJlIGRldmljZSBoYXMgdGhlIGludGVybmV0IGNvbm5lY3Rpb24iLCBpc1JlYWNoYWJsZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1JlYWNoYWJsZShTdHJpbmcgYWRkciwgaW50IG9wZW5Qb3J0LCBpbnQgdGltZU91dE1pbGxpcykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgdHJ5IChTb2NrZXQgc29jID0gbmV3IFNvY2tldCgpKSB7CisgICAgICAgICAgICAgICAgc29jLmNvbm5lY3QobmV3IEluZXRTb2NrZXRBZGRyZXNzKGFkZHIsIG9wZW5Qb3J0KSwgdGltZU91dE1pbGxpcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgV2lmaVNjYW5SZWNlaXZlciBleHRlbmRzIEJyb2FkY2FzdFJlY2VpdmVyIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGMsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgICAgIExpc3QgPFNjYW5SZXN1bHQ+IHNjYW5SZXN1bHRzID0gbVdpZmlNYW5hZ2VyLmdldFNjYW5SZXN1bHRzKCk7CisgICAgICAgICAgICBMb2cuZChUQUcsIFN0cmluZy5mb3JtYXQoIkdvdCBzY2FuIHJlc3VsdHMgd2l0aCBzaXplICVkIiwgc2NhblJlc3VsdHMuc2l6ZSgpKSk7CisgICAgICAgICAgICBmb3IgKFNjYW5SZXN1bHQgcmVzdWx0IDogc2NhblJlc3VsdHMpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsIHJlc3VsdC50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TY2FuQ291bnRlcisrOworICAgICAgICAgICAgbUxhdGNoLmNvdW50RG93bigpOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2xvY2F0aW9uL3NyYy9hbmRyb2lkL2xvY2F0aW9uL2N0cy9HbnNzQ2xvY2tUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9sb2NhdGlvbi9zcmMvYW5kcm9pZC9sb2NhdGlvbi9jdHMvR25zc0Nsb2NrVGVzdC5qYXZhCmluZGV4IGI4ODNmNzQuLjcxZTEwNmEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2xvY2F0aW9uL3NyYy9hbmRyb2lkL2xvY2F0aW9uL2N0cy9HbnNzQ2xvY2tUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvbG9jYXRpb24vc3JjL2FuZHJvaWQvbG9jYXRpb24vY3RzL0duc3NDbG9ja1Rlc3QuamF2YQpAQCAtNjIsNiArNjIsNyBAQAogICAgICAgICBwYXJjZWwuc2V0RGF0YVBvc2l0aW9uKDApOwogICAgICAgICBHbnNzQ2xvY2sgbmV3Q2xvY2sgPSBHbnNzQ2xvY2suQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKHBhcmNlbCk7CiAgICAgICAgIHZlcmlmeVRlc3RWYWx1ZXMobmV3Q2xvY2spOworICAgICAgICBwYXJjZWwucmVjeWNsZSgpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXQoKSB7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9sb2NhdGlvbi9zcmMvYW5kcm9pZC9sb2NhdGlvbi9jdHMvR25zc0hhcmR3YXJlSW5mb1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2xvY2F0aW9uL3NyYy9hbmRyb2lkL2xvY2F0aW9uL2N0cy9HbnNzSGFyZHdhcmVJbmZvVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMzM1ZGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9sb2NhdGlvbi9zcmMvYW5kcm9pZC9sb2NhdGlvbi9jdHMvR25zc0hhcmR3YXJlSW5mb1Rlc3QuamF2YQpAQCAtMCwwICsxLDgwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5sb2NhdGlvbi5jdHM7CisKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisvKioKKyAqIFRlc3QgdGhlIHtAbGluayBMb2NhdGlvbk1hbmFnZXIjZ2V0R25zc1llYXJPZkhhcmR3YXJlfSBhbmQKKyAqIHtAbGluayBMb2NhdGlvbk1hbmFnZXIjZ2V0R25zc0hhcmR3YXJlTW9kZWxOYW1lfSB2YWx1ZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBHbnNzSGFyZHdhcmVJbmZvVGVzdCBleHRlbmRzIEduc3NUZXN0Q2FzZSB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJHbnNzSGFyZHdhcmVJbmZvVGVzdCI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNSU5fSEFSRFdBUkVfWUVBUiA9IDIwMTU7CisKKyAgLyoqCisgICAqIE1pbmltdW0gcGxhdXNpYmxlIGRlc2NyaXB0aXZlIGhhcmR3YXJlIG1vZGVsIG5hbWUgbGVuZ3RoLCBlLmcuICJBQkMxIiBmb3IgZmlyc3QgR05TUyB2ZXJzaW9uCisgICAqIGV2ZXIgc2hpcHBlZCBieSBBQkMgY29tcGFueS4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNSU5fSEFSRFdBUkVfTU9ERUxfTkFNRV9MRU5HVEggPSA0OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUlOX0hBUkRXQVJFX1lFQVJfRk9SX1ZBTElEX1NUUklORyA9IDIwMTg7CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgc3VwZXIuc2V0VXAoKTsKKyAgICBtVGVzdExvY2F0aW9uTWFuYWdlciA9IG5ldyBUZXN0TG9jYXRpb25NYW5hZ2VyKGdldENvbnRleHQoKSk7CisgIH0KKworICAvKioKKyAgICogVmVyaWZ5IGhhcmR3YXJlIHllYXIgaXMgcmVwb3J0ZWQgYXMgMjAxNSBvciBoaWdoZXIsIHdpdGggZXhjZXB0aW9uIHRoYXQgaW4gMjAxNSwgc29tZQorICAgKiBkZXZpZXMgZGlkIG5vdCBpbXBsZW1lbnQgdGhlIHVuZGVybHlpbmcgSEFMIEFQSSwgYW5kIHRodXMgd2lsbCByZXBvcnQgMC4KKyAgICovCisgIHB1YmxpYyB2b2lkIHRlc3RIYXJkd2FyZVllYXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBpZiAoIVRlc3RVdGlscy5kZXZpY2VIYXNHcHNGZWF0dXJlKGdldENvbnRleHQoKSkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQgZ25zc0hhcmR3YXJlWWVhciA9IG1UZXN0TG9jYXRpb25NYW5hZ2VyLmdldExvY2F0aW9uTWFuYWdlcigpLmdldEduc3NZZWFyT2ZIYXJkd2FyZSgpOworICAgIC8vIEFsbG93IDAgdW50aWwgUSwgYXMgb2xkZXIsIHVwZ3JhZGluZyBkZXZpY2VzIG1heSByZXBvcnQgMC4KKyAgICBhc3NlcnRUcnVlKCJIYXJkd2FyZSB5ZWFyIG11c3QgYmUgMjAxNSBvciBoaWdoZXIiLAorICAgICAgICBnbnNzSGFyZHdhcmVZZWFyID49IE1JTl9IQVJEV0FSRV9ZRUFSIHx8IGduc3NIYXJkd2FyZVllYXIgPT0gMCk7CisgIH0KKworICAvKioKKyAgICogVmVyaWZ5IEdOU1MgaGFyZHdhcmUgbW9kZWwgeWVhciBpcyByZXBvcnRlZCBhcyBhIHZhbGlkLCBkZXNjcmlwdGl2ZSB2YWx1ZS4KKyAgICogRGVzY3JpcHRpdmUgaXMgbGltaXRlZCB0byBhIGNoYXJhY3RlciBjb3VudCwgYW5kIG5vdCB0aGUgb2xkZXIgdmFsdWVzLgorICAgKi8KKyAgcHVibGljIHZvaWQgdGVzdEhhcmR3YXJlTW9kZWxOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgaWYgKCFUZXN0VXRpbHMuZGV2aWNlSGFzR3BzRmVhdHVyZShnZXRDb250ZXh0KCkpKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50IGduc3NIYXJkd2FyZVllYXIgPSBtVGVzdExvY2F0aW9uTWFuYWdlci5nZXRMb2NhdGlvbk1hbmFnZXIoKS5nZXRHbnNzWWVhck9mSGFyZHdhcmUoKTsKKyAgICBTdHJpbmcgZ25zc0hhcmR3YXJlTW9kZWxOYW1lID0KKyAgICAgICAgbVRlc3RMb2NhdGlvbk1hbmFnZXIuZ2V0TG9jYXRpb25NYW5hZ2VyKCkuZ2V0R25zc0hhcmR3YXJlTW9kZWxOYW1lKCk7CisgICAgaWYgKGduc3NIYXJkd2FyZVllYXIgPj0gTUlOX0hBUkRXQVJFX1lFQVJfRk9SX1ZBTElEX1NUUklORykgeworICAgICAgYXNzZXJ0VHJ1ZSgiZ25zc0hhcmR3YXJlTW9kZWxOYW1lIG11c3Qgbm90IGJlIG51bGwsIHdoZW4gaGFyZHdhcmUgeWVhciA+PSAyMDE4IiwKKyAgICAgICAgICBnbnNzSGFyZHdhcmVNb2RlbE5hbWUgIT0gbnVsbCk7CisgICAgfQorICAgIGlmIChnbnNzSGFyZHdhcmVNb2RlbE5hbWUgIT0gbnVsbCkgeworICAgICAgYXNzZXJ0VHJ1ZSgiZ25zc0hhcmR3YXJlTW9kZWxOYW1lIG11c3QgYmUgZGVzY3JpcHRpdmUgLSBhdCBsZWFzdCA0IGNoYXJhY3RlcnMgbG9uZyIsCisgICAgICAgICAgZ25zc0hhcmR3YXJlTW9kZWxOYW1lLmxlbmd0aCgpID49IE1JTl9IQVJEV0FSRV9NT0RFTF9OQU1FX0xFTkdUSCk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9sb2NhdGlvbi9zcmMvYW5kcm9pZC9sb2NhdGlvbi9jdHMvR25zc0xvY2F0aW9uUmF0ZUNoYW5nZVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2xvY2F0aW9uL3NyYy9hbmRyb2lkL2xvY2F0aW9uL2N0cy9HbnNzTG9jYXRpb25SYXRlQ2hhbmdlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZWI1ZmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9sb2NhdGlvbi9zcmMvYW5kcm9pZC9sb2NhdGlvbi9jdHMvR25zc0xvY2F0aW9uUmF0ZUNoYW5nZVRlc3QuamF2YQpAQCAtMCwwICsxLDE2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubG9jYXRpb24uY3RzOworCitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOworCisvKioKKyAqIFRlc3QgdGhlICJncHMiIGxvY2F0aW9uIG91dHB1dCB3b3JrcyB0aHJvdWdoIHZhcmlvdXMgcmF0ZSBjaGFuZ2VzCisgKgorICogVGVzdHM6CisgKiAxLiBUb2dnbGUgdGhyb3VnaCB2YXJpb3VzIHJhdGVzLgorICogMi4gTWl4IHRvZ2dsaW5nIHRocm91Z2ggdmFyaW91cyByYXRlcyB3aXRoIHN0YXJ0ICYgc3RvcC4KKyAqCisgKiBJbnNwaXJlZCBieSBidWdzIDY1MjQ2Mjc5LCA2NTQyNTExMAorICovCisKK3B1YmxpYyBjbGFzcyBHbnNzTG9jYXRpb25SYXRlQ2hhbmdlVGVzdCBleHRlbmRzIEduc3NUZXN0Q2FzZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkduc3NMb2NhdGlvblJhdGVDaGFuZ2VUZXN0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTE9DQVRJT05fVE9fQ09MTEVDVF9DT1VOVCA9IDE7CisKKyAgICBwcml2YXRlIFRlc3RMb2NhdGlvbkxpc3RlbmVyIG1Mb2NhdGlvbkxpc3RlbmVyTWFpbjsKKyAgICBwcml2YXRlIFRlc3RMb2NhdGlvbkxpc3RlbmVyIG1Mb2NhdGlvbkxpc3RlbmVyQWZ0ZXJSYXRlQ2hhbmdlczsKKyAgICAvLyBWYXJpb3VzIHJhdGVzLCB3aGVyZSB1bmRlcmx5aW5nIEdOU1MgaGFyZHdhcmUgc3RhdGVzIG1heSBlbnRlciBkaWZmZXJlbnQgbW9kZXMKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBUQkZfTVNFQyA9IHswLCA0XzAwMCwgMjUwXzAwMCwgNl8wMDBfMDAwLCAxMCwgMV8wMDAsIDE2XzAwMCwgNjRfMDAwfTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTE9PUFNfRk9SX1NUUkVTU19URVNUID0gMjA7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICBtVGVzdExvY2F0aW9uTWFuYWdlciA9IG5ldyBUZXN0TG9jYXRpb25NYW5hZ2VyKGdldENvbnRleHQoKSk7CisgICAgICAgIC8vIFVzaW5nIHNlcGFyYXRlIGxpc3RlbmVycywgc28gdGhlIGF3YWl0IHRyaWdnZXIgZm9yIHRoZSBhZnRlci1yYXRlLWNoYW5nZXMgbGlzdGVuZXIgaXMKKyAgICAgICAgLy8gaW5kZXBlbmRlbnQgb2YgYW55IHBvc3NpYmxlIGxvY2F0aW9ucyB0aGF0IGZsb3cgZHVyaW5nIHNldHVwLCBhbmQgcmF0ZSBjaGFuZ2Ugc3RyZXNzCisgICAgICAgIC8vIHRlc3RpbmcKKyAgICAgICAgbUxvY2F0aW9uTGlzdGVuZXJNYWluID0gbmV3IFRlc3RMb2NhdGlvbkxpc3RlbmVyKExPQ0FUSU9OX1RPX0NPTExFQ1RfQ09VTlQpOworICAgICAgICBtTG9jYXRpb25MaXN0ZW5lckFmdGVyUmF0ZUNoYW5nZXMgPSBuZXcgVGVzdExvY2F0aW9uTGlzdGVuZXIoTE9DQVRJT05fVE9fQ09MTEVDVF9DT1VOVCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gVW5yZWdpc3RlciBsaXN0ZW5lcnMKKyAgICAgICAgaWYgKG1Mb2NhdGlvbkxpc3RlbmVyTWFpbiAhPSBudWxsKSB7CisgICAgICAgICAgICBtVGVzdExvY2F0aW9uTWFuYWdlci5yZW1vdmVMb2NhdGlvblVwZGF0ZXMobUxvY2F0aW9uTGlzdGVuZXJNYWluKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUxvY2F0aW9uTGlzdGVuZXJBZnRlclJhdGVDaGFuZ2VzICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1UZXN0TG9jYXRpb25NYW5hZ2VyLnJlbW92ZUxvY2F0aW9uVXBkYXRlcyhtTG9jYXRpb25MaXN0ZW5lckFmdGVyUmF0ZUNoYW5nZXMpOworICAgICAgICB9CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVxdWVzdHMgKEdQUykgTG9jYXRpb25zIGF0IHZhcmlvdXMgcmF0ZXMgdGhhdCBtYXkgc3RyZXNzIHRoZSB1bmRlcmx5aW5nIEdOU1Mgc29mdHdhcmUKKyAgICAgKiBhbmQgZmlybXdhcmUgc3RhdGUgbWFjaGluZSBsYXllcnMsIGVuc3VyaW5nIExvY2F0aW9uIG91dHB1dAorICAgICAqIHJlbWFpbnMgcmVzcG9uc2l2ZSBhZnRlciBhbGwgaXMgZG9uZS4KKyAgICAgKi8KKyAgICBAQXBwTW9kZUZ1bGwocmVhc29uID0gIkZsYWt5IGluIGluc3RhbnQgbW9kZS4iKQorICAgIHB1YmxpYyB2b2lkIHRlc3RWYXJpZWRSYXRlcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIVRlc3RVdGlscy5kZXZpY2VIYXNHcHNGZWF0dXJlKGdldENvbnRleHQoKSkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFNvZnRBc3NlcnQgc29mdEFzc2VydCA9IG5ldyBTb2Z0QXNzZXJ0KFRBRyk7CisgICAgICAgIG1UZXN0TG9jYXRpb25NYW5hZ2VyLnJlcXVlc3RMb2NhdGlvblVwZGF0ZXMobUxvY2F0aW9uTGlzdGVuZXJNYWluKTsKKyAgICAgICAgc29mdEFzc2VydC5hc3NlcnRUcnVlKCJMb2NhdGlvbiBzaG91bGQgYmUgcmVjZWl2ZWQgYXQgdGVzdCBzdGFydCIsCisgICAgICAgICAgICAgICAgbUxvY2F0aW9uTGlzdGVuZXJNYWluLmF3YWl0KCkpOworCisgICAgICAgIGZvciAoaW50IHRpbWVCZXR3ZWVuTG9jYXRpb25zTXNlYyA6IFRCRl9NU0VDKSB7CisgICAgICAgICAgICAvLyBSYXBpZGx5IGNoYW5nZSByYXRlcyByZXF1ZXN0ZWQsIHRvIGVuc3VyZSBHTlNTIHByb3ZpZGVyIHN0YXRlIGNoYW5nZXMgY2FuIGhhbmRsZSB0aGlzCisgICAgICAgICAgICBtVGVzdExvY2F0aW9uTWFuYWdlci5yZXF1ZXN0TG9jYXRpb25VcGRhdGVzKG1Mb2NhdGlvbkxpc3RlbmVyTWFpbiwKKyAgICAgICAgICAgICAgICAgICAgdGltZUJldHdlZW5Mb2NhdGlvbnNNc2VjKTsKKyAgICAgICAgfQorICAgICAgICBtVGVzdExvY2F0aW9uTWFuYWdlci5yZW1vdmVMb2NhdGlvblVwZGF0ZXMobUxvY2F0aW9uTGlzdGVuZXJNYWluKTsKKworICAgICAgICBtVGVzdExvY2F0aW9uTWFuYWdlci5yZXF1ZXN0TG9jYXRpb25VcGRhdGVzKG1Mb2NhdGlvbkxpc3RlbmVyQWZ0ZXJSYXRlQ2hhbmdlcyk7CisgICAgICAgIHNvZnRBc3NlcnQuYXNzZXJ0VHJ1ZSgiTG9jYXRpb24gc2hvdWxkIGJlIHJlY2VpdmVkIGF0IHRlc3QgZW5kIiwKKyAgICAgICAgICAgICAgICBtTG9jYXRpb25MaXN0ZW5lckFmdGVyUmF0ZUNoYW5nZXMuYXdhaXQoKSk7CisKKyAgICAgICAgc29mdEFzc2VydC5hc3NlcnRBbGwoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXF1ZXN0cyAoR1BTKSBMb2NhdGlvbnMgYXQgdmFyaW91cyByYXRlcywgYW5kIHRvZ2dsZXMgYmV0d2VlbiByZXF1ZXN0cyBhbmQgcmVtb3ZhbHMsCisgICAgICogdGhhdCBtYXkgc3RyZXNzIHRoZSB1bmRlcmx5aW5nIEdOU1Mgc29mdHdhcmUKKyAgICAgKiBhbmQgZmlybXdhcmUgc3RhdGUgbWFjaGluZSBsYXllcnMsIGVuc3VyaW5nIExvY2F0aW9uIG91dHB1dCByZW1haW5zIHJlc3BvbnNpdmUKKyAgICAgKiBhZnRlciBhbGwgaXMgZG9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFyaWVkUmF0ZXNPbk9mZigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIVRlc3RVdGlscy5kZXZpY2VIYXNHcHNGZWF0dXJlKGdldENvbnRleHQoKSkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFNvZnRBc3NlcnQgc29mdEFzc2VydCA9IG5ldyBTb2Z0QXNzZXJ0KFRBRyk7CisgICAgICAgIG1UZXN0TG9jYXRpb25NYW5hZ2VyLnJlcXVlc3RMb2NhdGlvblVwZGF0ZXMobUxvY2F0aW9uTGlzdGVuZXJNYWluKTsKKyAgICAgICAgc29mdEFzc2VydC5hc3NlcnRUcnVlKCJMb2NhdGlvbiBzaG91bGQgYmUgcmVjZWl2ZWQgYXQgdGVzdCBzdGFydCIsCisgICAgICAgICAgICAgICAgbUxvY2F0aW9uTGlzdGVuZXJNYWluLmF3YWl0KCkpOworCisgICAgICAgIGZvciAoaW50IHRpbWVCZXR3ZWVuTG9jYXRpb25zTXNlYyA6IFRCRl9NU0VDKSB7CisgICAgICAgICAgICAvLyBSYXBpZGx5IGNoYW5nZSByYXRlcyByZXF1ZXN0ZWQsIHRvIGVuc3VyZSBHTlNTIHByb3ZpZGVyIHN0YXRlIGNoYW5nZXMgY2FuIGhhbmRsZSB0aGlzCisgICAgICAgICAgICBtVGVzdExvY2F0aW9uTWFuYWdlci5yZXF1ZXN0TG9jYXRpb25VcGRhdGVzKG1Mb2NhdGlvbkxpc3RlbmVyTWFpbiwKKyAgICAgICAgICAgICAgICAgICAgdGltZUJldHdlZW5Mb2NhdGlvbnNNc2VjKTsKKyAgICAgICAgICAgIC8vIEFsc28gZmxpcCB0aGUgcmVxdWVzdHMgb24gYW5kIG9mZiBxdWlja2x5CisgICAgICAgICAgICBtVGVzdExvY2F0aW9uTWFuYWdlci5yZW1vdmVMb2NhdGlvblVwZGF0ZXMobUxvY2F0aW9uTGlzdGVuZXJNYWluKTsKKyAgICAgICAgfQorCisgICAgICAgIG1UZXN0TG9jYXRpb25NYW5hZ2VyLnJlcXVlc3RMb2NhdGlvblVwZGF0ZXMobUxvY2F0aW9uTGlzdGVuZXJBZnRlclJhdGVDaGFuZ2VzKTsKKyAgICAgICAgc29mdEFzc2VydC5hc3NlcnRUcnVlKCJMb2NhdGlvbiBzaG91bGQgYmUgcmVjZWl2ZWQgYXQgdGVzdCBlbmQiLAorICAgICAgICAgICAgICAgIG1Mb2NhdGlvbkxpc3RlbmVyQWZ0ZXJSYXRlQ2hhbmdlcy5hd2FpdCgpKTsKKworICAgICAgICBzb2Z0QXNzZXJ0LmFzc2VydEFsbCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcXVlc3RzIChHUFMpIExvY2F0aW9ucyBhdCB2YXJpb3VzIHJhdGVzLCBhbmQgdG9nZ2xlcyBiZXR3ZWVuIHJlcXVlc3RzIGFuZCByZW1vdmFscywKKyAgICAgKiBpbiBtdWx0aXBsZSBsb29wcyB0byBwcm92aWRlIGFkZGl0aW9uYWwgc3RyZXNzIHRvIHRoZSB1bmRlcmx5aW5nIEdOU1Mgc29mdHdhcmUKKyAgICAgKiBhbmQgZmlybXdhcmUgc3RhdGUgbWFjaGluZSBsYXllcnMsIGVuc3VyaW5nIExvY2F0aW9uIG91dHB1dCByZW1haW5zIHJlc3BvbnNpdmUKKyAgICAgKiBhZnRlciBhbGwgaXMgZG9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFyaWVkUmF0ZXNSZXBldGl0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghVGVzdFV0aWxzLmRldmljZUhhc0dwc0ZlYXR1cmUoZ2V0Q29udGV4dCgpKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgU29mdEFzc2VydCBzb2Z0QXNzZXJ0ID0gbmV3IFNvZnRBc3NlcnQoVEFHKTsKKyAgICAgICAgbVRlc3RMb2NhdGlvbk1hbmFnZXIucmVxdWVzdExvY2F0aW9uVXBkYXRlcyhtTG9jYXRpb25MaXN0ZW5lck1haW4pOworICAgICAgICBzb2Z0QXNzZXJ0LmFzc2VydFRydWUoIkxvY2F0aW9uIHNob3VsZCBiZSByZWNlaXZlZCBhdCB0ZXN0IHN0YXJ0IiwKKyAgICAgICAgICAgICAgICBtTG9jYXRpb25MaXN0ZW5lck1haW4uYXdhaXQoKSk7CisKKyAgICAgICAgLy8gVHdvIGxvb3BzLCBmaXJzdCB3aXRob3V0IHJlbW92ZXMsIHRoZW4gd2l0aCByZW1vdmVzCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTE9PUFNfRk9SX1NUUkVTU19URVNUOyBpKyspIHsKKyAgICAgICAgICAgIGZvciAoaW50IHRpbWVCZXR3ZWVuTG9jYXRpb25zTXNlYyA6IFRCRl9NU0VDKSB7CisgICAgICAgICAgICAgICBtVGVzdExvY2F0aW9uTWFuYWdlci5yZXF1ZXN0TG9jYXRpb25VcGRhdGVzKG1Mb2NhdGlvbkxpc3RlbmVyTWFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVCZXR3ZWVuTG9jYXRpb25zTXNlYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBMT09QU19GT1JfU1RSRVNTX1RFU1Q7IGkrKykgeworICAgICAgICAgICAgZm9yIChpbnQgdGltZUJldHdlZW5Mb2NhdGlvbnNNc2VjIDogVEJGX01TRUMpIHsKKyAgICAgICAgICAgICAgICBtVGVzdExvY2F0aW9uTWFuYWdlci5yZXF1ZXN0TG9jYXRpb25VcGRhdGVzKG1Mb2NhdGlvbkxpc3RlbmVyTWFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVCZXR3ZWVuTG9jYXRpb25zTXNlYyk7CisgICAgICAgICAgICAgICAgLy8gQWxzbyBmbGlwIHRoZSByZXF1ZXN0cyBvbiBhbmQgb2ZmIHF1aWNrbHkKKyAgICAgICAgICAgICAgICBtVGVzdExvY2F0aW9uTWFuYWdlci5yZW1vdmVMb2NhdGlvblVwZGF0ZXMobUxvY2F0aW9uTGlzdGVuZXJNYWluKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG1UZXN0TG9jYXRpb25NYW5hZ2VyLnJlcXVlc3RMb2NhdGlvblVwZGF0ZXMobUxvY2F0aW9uTGlzdGVuZXJBZnRlclJhdGVDaGFuZ2VzKTsKKyAgICAgICAgc29mdEFzc2VydC5hc3NlcnRUcnVlKCJMb2NhdGlvbiBzaG91bGQgYmUgcmVjZWl2ZWQgYXQgdGVzdCBlbmQiLAorICAgICAgICAgICAgICAgIG1Mb2NhdGlvbkxpc3RlbmVyQWZ0ZXJSYXRlQ2hhbmdlcy5hd2FpdCgpKTsKKworICAgICAgICBzb2Z0QXNzZXJ0LmFzc2VydEFsbCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2xvY2F0aW9uL3NyYy9hbmRyb2lkL2xvY2F0aW9uL2N0cy9HbnNzTG9jYXRpb25WYWx1ZXNUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9sb2NhdGlvbi9zcmMvYW5kcm9pZC9sb2NhdGlvbi9jdHMvR25zc0xvY2F0aW9uVmFsdWVzVGVzdC5qYXZhCmluZGV4IGIxNjBlZjAuLjJkNjQ2MTIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2xvY2F0aW9uL3NyYy9hbmRyb2lkL2xvY2F0aW9uL2N0cy9HbnNzTG9jYXRpb25WYWx1ZXNUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvbG9jYXRpb24vc3JjL2FuZHJvaWQvbG9jYXRpb24vY3RzL0duc3NMb2NhdGlvblZhbHVlc1Rlc3QuamF2YQpAQCAtMTYsOSArMTYsNyBAQAogCiBwYWNrYWdlIGFuZHJvaWQubG9jYXRpb24uY3RzOwogCi1pbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Dcml0ZXJpYTsKIGltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uOwotaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uTG9jYXRpb25NYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIC8qKgpAQCAtMTQ3LDE0ICsxNDUsMTggQEAKICAgICAgICAgc3VjY2Vzcyk7CiAKICAgICBTb2Z0QXNzZXJ0IHNvZnRBc3NlcnQgPSBuZXcgU29mdEFzc2VydChUQUcpOworICAgIC8vIGRvbid0IGNoZWNrIHNwZWVkIG9mIGZpcnN0IEdOU1MgbG9jYXRpb24gLSBpdCBtYXkgbm90IGJlIHJlYWR5IGluIHNvbWUgY2FzZXMKKyAgICBib29sZWFuIGNoZWNrU3BlZWQgPSBmYWxzZTsKICAgICBmb3IgKExvY2F0aW9uIGxvY2F0aW9uIDogbUxvY2F0aW9uTGlzdGVuZXIuZ2V0UmVjZWl2ZWRMb2NhdGlvbkxpc3QoKSkgewotICAgICAgY2hlY2tMb2NhdGlvblJlZ3VsYXJGaWVsZHMoc29mdEFzc2VydCwgbG9jYXRpb24pOworICAgICAgY2hlY2tMb2NhdGlvblJlZ3VsYXJGaWVsZHMoc29mdEFzc2VydCwgbG9jYXRpb24sIGNoZWNrU3BlZWQpOworICAgICAgY2hlY2tTcGVlZCA9IHRydWU7CiAgICAgfQogCiAgICAgc29mdEFzc2VydC5hc3NlcnRBbGwoKTsKICAgfQogCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja0xvY2F0aW9uUmVndWxhckZpZWxkcyhTb2Z0QXNzZXJ0IHNvZnRBc3NlcnQsIExvY2F0aW9uIGxvY2F0aW9uKSB7CisgIHB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja0xvY2F0aW9uUmVndWxhckZpZWxkcyhTb2Z0QXNzZXJ0IHNvZnRBc3NlcnQsIExvY2F0aW9uIGxvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBjaGVja1NwZWVkKSB7CiAgICAgLy8gRm9yIHRoZSBhbHRpdHVkZTogdGhlIHVuaXQgaXMgbWV0ZXIKICAgICAvLyBUaGUgbG93ZXN0IGV4cG9zZWQgbGFuZCBvbiBFYXJ0aCBpcyBhdCB0aGUgRGVhZCBTZWEgc2hvcmUsIGF0IC00MTMgbWV0ZXJzLgogICAgIC8vIFdoaWxzdCBVbml2ZXJzaXR5IG9mIFRva3lvIEF0YWNhbWEgT2JzZXZhdG9yeSBpcyBvbiA1LDY0MG0gYWJvdmUgc2VhIGxldmVsLgpAQCAtMTkxLDEzICsxOTMsMTYgQEAKICAgICBzb2Z0QXNzZXJ0LmFzc2VydFRydWUoIkxhdGl0dWRlIHNob3VsZCBiZSBpbiB0aGUgcmFuZ2Ugb2YgWy05MC4wLCA5MC4wXSBkZWdyZWVzIiwKICAgICAgICAgbG9jYXRpb24uZ2V0TGF0aXR1ZGUoKSA+PSAtOTAgJiYgbG9jYXRpb24uZ2V0TGF0aXR1ZGUoKSA8PSA5MCk7CiAKLSAgICBzb2Z0QXNzZXJ0LmFzc2VydFRydWUoIkFsbCBHTlNTIGxvY2F0aW9ucyBnZW5lcmF0ZWQgYnkgdGhlIExvY2F0aW9uTWFuYWdlciAiCi0gICAgICAgICsgIm11c3QgaGF2ZSBzcGVlZHMuIiwgbG9jYXRpb24uaGFzU3BlZWQoKSk7CisgICAgaWYgKGNoZWNrU3BlZWQpIHsKKyAgICAgIHNvZnRBc3NlcnQuYXNzZXJ0VHJ1ZSgiQWxsIGJ1dCB0aGUgZmlyc3QgR05TUyBsb2NhdGlvbiBmcm9tIExvY2F0aW9uTWFuYWdlciAiCisgICAgICAgICAgICAgICsgIm11c3QgaGF2ZSBzcGVlZHMuIiwgbG9jYXRpb24uaGFzU3BlZWQoKSk7CisgICAgfQogCi0gICAgLy8gRm9yIHRoZSBzcGVlZCwgZHVyaW5nIHRoZSBjdHMgdGVzdCBkZXZpY2Ugc2hvdWxkbid0IG1vdmUgZmFzdGVyIHRoYW4gMW0vcworICAgIC8vIEZvciB0aGUgc3BlZWQsIGR1cmluZyB0aGUgY3RzIHRlc3QgZGV2aWNlIHNob3VsZG4ndCBtb3ZlIGZhc3RlciB0aGFuIDFtL3MsIGJ1dCBhbGxvd2luZyB1cAorICAgIC8vIHRvIDVtL3MgZm9yIHBvc3NpYmxlIGVhcmx5IGZpeCBub2lzZSBpbiBtb2RlcmF0ZSBzaWduYWwgdGVzdCBlbnZpcm9ubWVudHMKICAgICBpZihsb2NhdGlvbi5oYXNTcGVlZCgpKSB7Ci0gICAgICBzb2Z0QXNzZXJ0LmFzc2VydFRydWUoIkluIHRoZSB0ZXN0IGVudmlvcm1lbnQsIHNwZWVkIHNob3VsZCBiZSBpbiB0aGUgcmFuZ2Ugb2YgWzAsIDFdIG0vcyIsCi0gICAgICAgICAgbG9jYXRpb24uZ2V0U3BlZWQoKSA+PSAwICYmIGxvY2F0aW9uLmdldFNwZWVkKCkgPD0gMSk7CisgICAgICBzb2Z0QXNzZXJ0LmFzc2VydFRydWUoIkluIHRoZSB0ZXN0IGVudmlvcm1lbnQsIHNwZWVkIHNob3VsZCBiZSBpbiB0aGUgcmFuZ2Ugb2YgWzAsIDVdIG0vcyIsCisgICAgICAgICAgbG9jYXRpb24uZ2V0U3BlZWQoKSA+PSAwICYmIGxvY2F0aW9uLmdldFNwZWVkKCkgPD0gNSk7CiAgICAgfQogCiAgIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2xvY2F0aW9uL3NyYy9hbmRyb2lkL2xvY2F0aW9uL2N0cy9HbnNzTWVhc3VyZW1lbnRUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9sb2NhdGlvbi9zcmMvYW5kcm9pZC9sb2NhdGlvbi9jdHMvR25zc01lYXN1cmVtZW50VGVzdC5qYXZhCmluZGV4IDJmYzYzYTguLmM3ZDI4YzkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2xvY2F0aW9uL3NyYy9hbmRyb2lkL2xvY2F0aW9uL2N0cy9HbnNzTWVhc3VyZW1lbnRUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvbG9jYXRpb24vc3JjL2FuZHJvaWQvbG9jYXRpb24vY3RzL0duc3NNZWFzdXJlbWVudFRlc3QuamF2YQpAQCAtODIsNiArODIsNyBAQAogICAgICAgICBwYXJjZWwuc2V0RGF0YVBvc2l0aW9uKDApOwogICAgICAgICBHbnNzTWVhc3VyZW1lbnQgbmV3TWVhc3VyZW1lbnQgPSBHbnNzTWVhc3VyZW1lbnQuQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKHBhcmNlbCk7CiAgICAgICAgIHZlcmlmeVRlc3RWYWx1ZXMobmV3TWVhc3VyZW1lbnQpOworICAgICAgICBwYXJjZWwucmVjeWNsZSgpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXQoKSB7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9sb2NhdGlvbi9zcmMvYW5kcm9pZC9sb2NhdGlvbi9jdHMvR25zc01lYXN1cmVtZW50VmFsdWVzVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvbG9jYXRpb24vc3JjL2FuZHJvaWQvbG9jYXRpb24vY3RzL0duc3NNZWFzdXJlbWVudFZhbHVlc1Rlc3QuamF2YQppbmRleCAwMjNiNjE2Li44ZTJjM2Y4IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9sb2NhdGlvbi9zcmMvYW5kcm9pZC9sb2NhdGlvbi9jdHMvR25zc01lYXN1cmVtZW50VmFsdWVzVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2xvY2F0aW9uL3NyYy9hbmRyb2lkL2xvY2F0aW9uL2N0cy9HbnNzTWVhc3VyZW1lbnRWYWx1ZXNUZXN0LmphdmEKQEAgLTIwLDcgKzIwLDExIEBACiBpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5HbnNzTWVhc3VyZW1lbnRzRXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAoraW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ2RkVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIC8qKgogICogVGVzdCB0aGUge0BsaW5rIEduc3NNZWFzdXJlbWVudH0gdmFsdWVzLgpAQCAtMzEsOCArMzUsOCBAQAogICogMy4gV2FpdCBmb3Ige0BsaW5rICNMT0NBVElPTl9UT19DT0xMRUNUX0NPVU5UfSBsb2NhdGlvbnMuCiAgKiAgICAgICAgICAzLjEgQ29uZmlybSBsb2NhdGlvbnMgaGF2ZSBiZWVuIGZvdW5kLgogICogNC4gQ2hlY2sge0BsaW5rIEduc3NNZWFzdXJlbWVudHNFdmVudH0gc3RhdHVzOiBpZiB0aGUgc3RhdHVzIGlzIG5vdAotICogICAge0BsaW5rIEduc3NNZWFzdXJlbWVudHNFdmVudCNTVEFUVVNfUkVBRFl9LCB0aGUgdGVzdCB3aWxsIGJlIHNraXBwZWQgYmVjYXVzZSBvbmUgb2YgdGhlCi0gKiAgICBmb2xsb3dpbmcgcmVhc29uczoKKyAqICAgIHtAbGluayBHbnNzTWVhc3VyZW1lbnRzRXZlbnQuQ2FsbGJhY2sjU1RBVFVTX1JFQURZfSwgdGhlIHRlc3Qgd2lsbCBiZSBza2lwcGVkIGJlY2F1c2UKKyAqICAgIG9uZSBvZiB0aGUgZm9sbG93aW5nIHJlYXNvbnM6CiAgKiAgICAgICAgICA0LjEgdGhlIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBHUFMgZmVhdHVyZSwKICAqICAgICAgICAgIDQuMiBHUFMgTG9jYXRpb24gaXMgZGlzYWJsZWQgaW4gdGhlIGRldmljZSBhbmQgdGhpcyBpcyBDVFMgKG5vbi12ZXJpZmllcikKICAqICA1LiBWZXJpZnkge0BsaW5rIEduc3NNZWFzdXJlbWVudH1zIChhbGwgbWFuZGF0b3J5IGZpZWxkcyksIHRoZSB0ZXN0IHdpbGwgZmFpbCBpZiBhbnkgb2YgdGhlCkBAIC00MiwxNSArNDYsMTkgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiR25zc01lYXNWYWx1ZXNUZXN0IjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTE9DQVRJT05fVE9fQ09MTEVDVF9DT1VOVCA9IDU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFlFQVJfMjAxNyA9IDIwMTc7CiAKICAgICBwcml2YXRlIFRlc3RHbnNzTWVhc3VyZW1lbnRMaXN0ZW5lciBtTWVhc3VyZW1lbnRMaXN0ZW5lcjsKICAgICBwcml2YXRlIFRlc3RMb2NhdGlvbkxpc3RlbmVyIG1Mb2NhdGlvbkxpc3RlbmVyOworICAgIC8vIFN0b3JlIGxpc3Qgb2YgU2F0ZWxsaXRlcyBpbmNsdWRpbmcgR25zcyBCYW5kLCBjb25zdGVsbGF0aW9uICYgU3ZJZAorICAgIHByaXZhdGUgU2V0PFN0cmluZz4gbUduc3NNZWFzU3ZTdHJpbmdJZHM7CiAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBzdXBlci5zZXRVcCgpOwogCiAgICAgICAgIG1UZXN0TG9jYXRpb25NYW5hZ2VyID0gbmV3IFRlc3RMb2NhdGlvbk1hbmFnZXIoZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgbUduc3NNZWFzU3ZTdHJpbmdJZHMgPSBuZXcgSGFzaFNldDw+KCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC03MCwxMCArNzgsMTEgQEAKICAgICAgKiBJdCBvbmx5IHBlcmZvcm1zIHNhbml0eSBjaGVja3MgZm9yIHRoZSBtZWFzdXJlbWVudHMgcmVjZWl2ZWQuCiAgICAgICogVGhpcyB0ZXN0cyB1c2VzIGFjdHVhbCBkYXRhIHJldHJpZXZlZCBmcm9tIEdQUyBIQUwuCiAgICAgICovCisgICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuMy4zL0MtMy0yLEMtMy0zIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0TGlzdGVuRm9yR25zc01lYXN1cmVtZW50cygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBDaGVja3MgaWYgR1BTIGhhcmR3YXJlIGZlYXR1cmUgaXMgcHJlc2VudCwgc2tpcHMgdGVzdCAocGFzcykgaWYgbm90LAogICAgICAgICAvLyBhbmQgaGFyZCBhc3NlcnRzIHRoYXQgTG9jYXRpb24vR1BTIChQcm92aWRlcikgaXMgdHVybmVkIG9uIGlmIGlzIEN0cyBWZXJpZmllci4KLSAgICAgICBpZiAoIVRlc3RNZWFzdXJlbWVudFV0aWwuY2FuVGVzdFJ1bk9uQ3VycmVudERldmljZShtVGVzdExvY2F0aW9uTWFuYWdlciwKKyAgICAgICAgaWYgKCFUZXN0TWVhc3VyZW1lbnRVdGlsLmNhblRlc3RSdW5PbkN1cnJlbnREZXZpY2UobVRlc3RMb2NhdGlvbk1hbmFnZXIsCiAgICAgICAgICAgICAgICAgVEFHLCBNSU5fSEFSRFdBUkVfWUVBUl9NRUFTVVJFTUVOVFNfUkVRVUlSRUQsIGlzQ3RzVmVyaWZpZXJUZXN0KCkpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KQEAgLTg0LDE3ICs5MywyNCBAQAogICAgICAgICBtTWVhc3VyZW1lbnRMaXN0ZW5lciA9IG5ldyBUZXN0R25zc01lYXN1cmVtZW50TGlzdGVuZXIoVEFHKTsKICAgICAgICAgbVRlc3RMb2NhdGlvbk1hbmFnZXIucmVnaXN0ZXJHbnNzTWVhc3VyZW1lbnRDYWxsYmFjayhtTWVhc3VyZW1lbnRMaXN0ZW5lcik7CiAKKyAgICAgICAgLy8gUmVnaXN0ZXIgYSBzdGF0dXMgY2FsbGJhY2sgdG8gZW5hYmxlIGNoZWNraW5nIFN2cyBhY3Jvc3Mgc3RhdHVzICYgbWVhc3VyZW1lbnRzLgorICAgICAgICAvLyBDb3VudCBpbiBzdGF0dXMgY2FsbGJhY2sgaXMgbm90IGltcG9ydGFudCBhcyB0aGlzIHRlc3QgaXMgcGFzcy9mYWlsIGJhc2VkIG9uCisgICAgICAgIC8vIG1lYXN1cmVtZW50IGNvdW50LCBub3Qgc3RhdHVzIGNvdW50LgorICAgICAgICBUZXN0R25zc1N0YXR1c0NhbGxiYWNrIGduc3NTdGF0dXNDYWxsYmFjayA9IG5ldyBUZXN0R25zc1N0YXR1c0NhbGxiYWNrKFRBRywgMCk7CisgICAgICAgIG1UZXN0TG9jYXRpb25NYW5hZ2VyLnJlZ2lzdGVyR25zc1N0YXR1c0NhbGxiYWNrKGduc3NTdGF0dXNDYWxsYmFjayk7CisKICAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gbUxvY2F0aW9uTGlzdGVuZXIuYXdhaXQoKTsKICAgICAgICAgU29mdEFzc2VydC5mYWlsT3JXYXJuaW5nKGlzTWVhc3VyZW1lbnRUZXN0U3RyaWN0KCksCiAgICAgICAgICAgICAgICAgIlRpbWUgZWxhcHNlZCB3aXRob3V0IGdldHRpbmcgZW5vdWdoIGxvY2F0aW9uIGZpeGVzLiIKICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBQb3NzaWJseSwgdGhlIHRlc3QgaGFzIGJlZW4gcnVuIGRlZXAgaW5kb29ycy4iCiAgICAgICAgICAgICAgICAgICAgICAgICArICIgQ29uc2lkZXIgcmV0cnlpbmcgdGVzdCBvdXRkb29ycy4iLAogICAgICAgICAgICAgICAgIHN1Y2Nlc3MpOworICAgICAgICBtVGVzdExvY2F0aW9uTWFuYWdlci51bnJlZ2lzdGVyR25zc1N0YXR1c0NhbGxiYWNrKGduc3NTdGF0dXNDYWxsYmFjayk7CiAKICAgICAgICAgTG9nLmkoVEFHLCAiTG9jYXRpb24gc3RhdHVzIHJlY2VpdmVkID0gIiArIG1Mb2NhdGlvbkxpc3RlbmVyLmlzTG9jYXRpb25SZWNlaXZlZCgpKTsKIAogICAgICAgICBpZiAoIW1NZWFzdXJlbWVudExpc3RlbmVyLnZlcmlmeVN0YXR1cyhpc01lYXN1cmVtZW50VGVzdFN0cmljdCgpKSkgewotICAgICAgICAgICAgLy8gSWYgdGVzdCBpcyBzdHJpY3QgYW5kIHZlcmlpZnlTdGF0ZSByZXV0cm5zIGZhbHNlLCBhbiBhc3NlcnQgZXhjZXB0aW9uIGhhcHBlbnMgYW5kCisgICAgICAgICAgICAvLyBJZiB0ZXN0IGlzIHN0cmljdCBhbmQgdmVyaWZ5U3RhdHVzIHJldHVybnMgZmFsc2UsIGFuIGFzc2VydCBleGNlcHRpb24gaGFwcGVucyBhbmQKICAgICAgICAgICAgIC8vIHRlc3QgZmFpbHMuICAgSWYgdGVzdCBpcyBub3Qgc3RyaWN0LCB3ZSBhcnJpdmUgaGVyZSwgYW5kOgogICAgICAgICAgICAgcmV0dXJuOyAvLyBleGl0ICh3aXRoIHBhc3MpCiAgICAgICAgIH0KQEAgLTEwMiwxMiArMTE4LDEyIEBACiAgICAgICAgIExpc3Q8R25zc01lYXN1cmVtZW50c0V2ZW50PiBldmVudHMgPSBtTWVhc3VyZW1lbnRMaXN0ZW5lci5nZXRFdmVudHMoKTsKICAgICAgICAgaW50IGV2ZW50Q291bnQgPSBldmVudHMuc2l6ZSgpOwogICAgICAgICBMb2cuaShUQUcsICJOdW1iZXIgb2YgR3BzIEV2ZW50IHJlY2VpdmVkID0gIiArIGV2ZW50Q291bnQpOwotICAgICAgICBTb2Z0QXNzZXJ0LmZhaWxPcldhcm5pbmcoaXNNZWFzdXJlbWVudFRlc3RTdHJpY3QoKSwKLSAgICAgICAgICAgICAgICAiR25zc01lYXN1cmVtZW50RXZlbnQgY291bnQ6IGV4cGVjdGVkID49IDAsIHJlY2VpdmVkID0gIiArIGV2ZW50Q291bnQsCi0gICAgICAgICAgICAgICAgZXZlbnRDb3VudCA+IDApOwogCiAgICAgICAgIFNvZnRBc3NlcnQgc29mdEFzc2VydCA9IG5ldyBTb2Z0QXNzZXJ0KFRBRyk7CiAKKyAgICAgICAgc29mdEFzc2VydC5hc3NlcnRUcnVlKCJHbnNzTWVhc3VyZW1lbnRFdmVudCBjb3VudCIsICJYID4gMCIsCisgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoZXZlbnRDb3VudCksIGV2ZW50Q291bnQgPiAwKTsKKwogICAgICAgICBib29sZWFuIGNhcnJpZXJQaGFzZVF1YWxpdHlQcnJGb3VuZCA9IGZhbHNlOwogICAgICAgICAvLyB3ZSByZWNlaXZlZCBldmVudHMsIHNvIHBlcmZvcm0gYSBxdWljayBzYW5pdHkgY2hlY2sgb24gbWFuZGF0b3J5IGZpZWxkcwogICAgICAgICBmb3IgKEduc3NNZWFzdXJlbWVudHNFdmVudCBldmVudCA6IGV2ZW50cykgewpAQCAtMTE5LDE2ICsxMzUsMzggQEAKICAgICAgICAgICAgIFRlc3RNZWFzdXJlbWVudFV0aWwuYXNzZXJ0R25zc0Nsb2NrRmllbGRzKGV2ZW50LmdldENsb2NrKCksIHNvZnRBc3NlcnQsIHRpbWVJbk5zKTsKIAogICAgICAgICAgICAgZm9yIChHbnNzTWVhc3VyZW1lbnQgbWVhc3VyZW1lbnQgOiBldmVudC5nZXRNZWFzdXJlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIFRlc3RNZWFzdXJlbWVudFV0aWwuYXNzZXJ0QWxsR25zc01lYXN1cmVtZW50TWFuZGF0b3J5RmllbGRzKG1lYXN1cmVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgc29mdEFzc2VydCwgdGltZUluTnMpOworICAgICAgICAgICAgICAgIFRlc3RNZWFzdXJlbWVudFV0aWwuYXNzZXJ0QWxsR25zc01lYXN1cmVtZW50TWFuZGF0b3J5RmllbGRzKG1UZXN0TG9jYXRpb25NYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZW1lbnQsIHNvZnRBc3NlcnQsIHRpbWVJbk5zKTsKICAgICAgICAgICAgICAgICBjYXJyaWVyUGhhc2VRdWFsaXR5UHJyRm91bmQgfD0KICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RNZWFzdXJlbWVudFV0aWwuZ25zc01lYXN1cmVtZW50SGFzQ2FycmllclBoYXNlUHJyKG1lYXN1cmVtZW50KTsKKyAgICAgICAgICAgICAgICBpZiAobWVhc3VyZW1lbnQuaGFzQ2FycmllckZyZXF1ZW5jeUh6KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbUduc3NNZWFzU3ZTdHJpbmdJZHMuYWRkKAorICAgICAgICAgICAgICAgICAgICAgICAgVGVzdE1lYXN1cmVtZW50VXRpbC5nZXRVbmlxdWVTdlN0cmluZ0lkKG1lYXN1cmVtZW50LmdldENvbnN0ZWxsYXRpb25UeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZW1lbnQuZ2V0U3ZpZCgpLCBtZWFzdXJlbWVudC5nZXRDYXJyaWVyRnJlcXVlbmN5SHooKSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1HbnNzTWVhc1N2U3RyaW5nSWRzLmFkZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RNZWFzdXJlbWVudFV0aWwuZ2V0VW5pcXVlU3ZTdHJpbmdJZChtZWFzdXJlbWVudC5nZXRDb25zdGVsbGF0aW9uVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmVtZW50LmdldFN2aWQoKSkpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBzb2Z0QXNzZXJ0LmFzc2VydE9yV2FyblRydWUoaXNNZWFzdXJlbWVudFRlc3RTdHJpY3QoKSwKICAgICAgICAgICAgICAgICAiR05TUyBNZWFzdXJlbWVudHMgUFJScyB3aXRoIENhcnJpZXIgUGhhc2UgIgogICAgICAgICAgICAgICAgICAgICAgICAgKyAibGV2ZWwgdW5jZXJ0YWludGllcy4gIElmIGZhaWxlZCwgcmV0cnkgbmVhciB3aW5kb3cgb3Igb3V0ZG9vcnM/IiwKICAgICAgICAgICAgICAgICBjYXJyaWVyUGhhc2VRdWFsaXR5UHJyRm91bmQpOworICAgICAgICBMb2cuaShUQUcsICJNZWFzIHJlY2VpdmVkIGZvcjoiICsgbUduc3NNZWFzU3ZTdHJpbmdJZHMpOworICAgICAgICBMb2cuaShUQUcsICJTdGF0dXMgUmVjZWl2ZWQgZm9yOiIgKyBnbnNzU3RhdHVzQ2FsbGJhY2suZ2V0R25zc1VzZWRTdlN0cmluZ0lkcygpKTsKKyAgICAgICAgaWYgKG1UZXN0TG9jYXRpb25NYW5hZ2VyLmdldExvY2F0aW9uTWFuYWdlcigpLmdldEduc3NZZWFyT2ZIYXJkd2FyZSgpID49IFlFQVJfMjAxNykgeworICAgICAgICAgICAgLy8gR2V0IGFsbCBTVnMgbWFya2VkIGFzIFVTRUQgaW4gR25zc1N0YXR1cy4gUmVtb3ZlIGFueSBTViBmb3Igd2hpY2ggbWVhc3VyZW1lbnQKKyAgICAgICAgICAgIC8vIGlzIHJlY2VpdmVkLiBUaGUgcmVzdWx0aW5nIGxpc3Qgc2hvdWxkIGlkZWFsbHkgYmUgZW1wdHkgKEhvdyBjYW4geW91IHVzZSBhIFNWCisgICAgICAgICAgICAvLyB3aXRoIG5vIG1lYXN1cmVtZW50KS4gVG8gYWxsb3cgZm9yIHJhY2UgY29uZGl0aW9uIHdoZXJlIHRoZSBsYXN0IEdOU1MgU3RhdHVzCisgICAgICAgICAgICAvLyBoYXMgMSBTViB3aXRoIHVzZWQgZmxhZyBzZXQsIGJ1dCB0aGUgY29ycmVzcG9uZGluZyBtZWFzdXJlbWVudCBoYXMgbm90IHlldCBiZWVuCisgICAgICAgICAgICAvLyByZWNlaXZlZCwgdGhlIGNoZWNrIGlzIGRvbmUgYXMgPD0gMQorICAgICAgICAgICAgU2V0PFN0cmluZz4gc3ZEaWZmID0gZ25zc1N0YXR1c0NhbGxiYWNrLmdldEduc3NVc2VkU3ZTdHJpbmdJZHMoKTsKKyAgICAgICAgICAgIHN2RGlmZi5yZW1vdmVBbGwobUduc3NNZWFzU3ZTdHJpbmdJZHMpOworICAgICAgICAgICAgc29mdEFzc2VydC5hc3NlcnRUcnVlKCJVc2VkIFN2cyB3aXRoIG5vIE1lYXM6ICIgKyAoc3ZEaWZmLmlzRW1wdHkoKSA/ICJOb25lIiA6IHN2RGlmZiksCisgICAgICAgICAgICAgICAgc3ZEaWZmLnNpemUoKSA8PSAxKTsKKyAgICAgICAgfQogICAgICAgICBzb2Z0QXNzZXJ0LmFzc2VydEFsbCgpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2xvY2F0aW9uL3NyYy9hbmRyb2lkL2xvY2F0aW9uL2N0cy9HbnNzTWVhc3VyZW1lbnRXaGVuTm9Mb2NhdGlvblRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL2xvY2F0aW9uL3NyYy9hbmRyb2lkL2xvY2F0aW9uL2N0cy9HbnNzTWVhc3VyZW1lbnRXaGVuTm9Mb2NhdGlvblRlc3QuamF2YQppbmRleCAzMmM1NGM5Li45YWY3YTdkIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9sb2NhdGlvbi9zcmMvYW5kcm9pZC9sb2NhdGlvbi9jdHMvR25zc01lYXN1cmVtZW50V2hlbk5vTG9jYXRpb25UZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvbG9jYXRpb24vc3JjL2FuZHJvaWQvbG9jYXRpb24vY3RzL0duc3NNZWFzdXJlbWVudFdoZW5Ob0xvY2F0aW9uVGVzdC5qYXZhCkBAIC0xOSw4ICsxOSwxMSBAQAogaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uR25zc01lYXN1cmVtZW50OwogaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uR25zc01lYXN1cmVtZW50c0V2ZW50OwogaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uR3BzU3RhdHVzOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCitpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5TeXN0ZW1VdGlsOworCiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKQEAgLTkwLDYgKzkzLDcgQEAKICAgICAvKioKICAgICAgKiBUZXN0IGZvciBHUFMgbWVhc3VyZW1lbnRzIGJlZm9yZSBhIGxvY2F0aW9uIGZpeC4KICAgICAgKi8KKyAgICBAQXBwTW9kZUZ1bGwocmVhc29uID0gIlJlcXVpcmVzIHVzZSBvZiBleHRyYSBMb2NhdGlvbk1hbmFnZXIgY29tbWFuZHMiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RHbnNzTWVhc3VyZW1lbnRXaGVuTm9Mb2NhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBDaGVja3MgaWYgR1BTIGhhcmR3YXJlIGZlYXR1cmUgaXMgcHJlc2VudCwgc2tpcHMgdGVzdCAocGFzcykgaWYgbm90LAogICAgICAgICAvLyBhbmQgaGFyZCBhc3NlcnRzIHRoYXQgTG9jYXRpb24vR1BTIChQcm92aWRlcikgaXMgdHVybmVkIG9uIGlmIGlzIEN0cyBWZXJpZmllci4KQEAgLTk4LDkxICsxMDIsMTE1IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICAvLyBDbGVhciBBLUdQUyBhbmQgc2tpcCB0aGUgdGVzdCBpZiB0aGUgb3BlcmF0aW9uIGZhaWxzLgotICAgICAgICBpZiAoIW1UZXN0TG9jYXRpb25NYW5hZ2VyLnNlbmRFeHRyYUNvbW1hbmQoQUdQU19ERUxFVEVfQ09NTUFORCkpIHsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIkEtR1BTIGZhaWxlZCB0byBjbGVhci4gU2tpcCB0ZXN0LiIpOwotICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAvLyBTZXQgdGhlIGRldmljZSBpbiBhaXJwbGFuZSBtb2RlIHNvIHRoYXQgdGhlIEdQUyBhc3Npc3RhbmNlIGRhdGEgY2Fubm90IGJlIGRvd25sb2FkZWQuCisgICAgICAgIC8vIFRoaXMgcmVzdWx0cyBpbiBHTlNTIG1lYXN1cmVtZW50cyBiZWluZyByZXBvcnRlZCBiZWZvcmUgYSBsb2NhdGlvbiBpcyByZXBvcnRlZC4KKyAgICAgICAgLy8gTk9URTogQ2hhbmdpbmcgZ2xvYmFsIHNldHRpbmcgYWlycGxhbmVfbW9kZV9vbiBpcyBub3QgYWxsb3dlZCBpbiBDdHNWZXJpZmllciBhcHBsaWNhdGlvbi4KKyAgICAgICAgLy8gICAgICAgSGVuY2UsIGFpcnBsYW5lIG1vZGUgaXMgdHVybmVkIG9uIG9ubHkgd2hlbiB0aGlzIHRlc3QgaXMgcnVuIGFzIGEgcmVndWxhciBDVFMgdGVzdAorICAgICAgICAvLyAgICAgICBhbmQgbm90IHdoZW4gaXQgaXMgaW52b2tlZCB0aHJvdWdoIEN0c1ZlcmlmaWVyLgorICAgICAgICBib29sZWFuIGlzQWlycGxhbmVNb2RlT2ZmQmVmb3JlVGVzdCA9IHRydWU7CisgICAgICAgIGlmICghaXNDdHNWZXJpZmllclRlc3QoKSkgeworICAgICAgICAgICAgLy8gUmVjb3JkIHRoZSBzdGF0ZSBvZiB0aGUgYWlycGxhbmUgbW9kZSBiZWZvcmUgdGhlIHRlc3Qgc28gdGhhdCB3ZSBjYW4gcmVzdG9yZSBpdAorICAgICAgICAgICAgLy8gYWZ0ZXIgdGhlIHRlc3QuCisgICAgICAgICAgICBpc0FpcnBsYW5lTW9kZU9mZkJlZm9yZVRlc3QgPSAhVGVzdFV0aWxzLmlzQWlycGxhbmVNb2RlT24oKTsKKyAgICAgICAgICAgIGlmIChpc0FpcnBsYW5lTW9kZU9mZkJlZm9yZVRlc3QpIHsKKyAgICAgICAgICAgICAgICBUZXN0VXRpbHMuc2V0QWlycGxhbmVNb2RlT24oZ2V0Q29udGV4dCgpLCB0cnVlKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIC8vIFJlZ2lzdGVyIGZvciBHUFMgbWVhc3VyZW1lbnRzLgotICAgICAgICBtTWVhc3VyZW1lbnRMaXN0ZW5lciA9IG5ldyBUZXN0R25zc01lYXN1cmVtZW50TGlzdGVuZXIoVEFHLCBFVkVOVFNfQ09VTlQpOwotICAgICAgICBtVGVzdExvY2F0aW9uTWFuYWdlci5yZWdpc3Rlckduc3NNZWFzdXJlbWVudENhbGxiYWNrKG1NZWFzdXJlbWVudExpc3RlbmVyKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIENsZWFyIEEtR1BTIGFuZCBza2lwIHRoZSB0ZXN0IGlmIHRoZSBvcGVyYXRpb24gZmFpbHMuCisgICAgICAgICAgICBpZiAoIW1UZXN0TG9jYXRpb25NYW5hZ2VyLnNlbmRFeHRyYUNvbW1hbmQoQUdQU19ERUxFVEVfQ09NTUFORCkpIHsKKyAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJBLUdQUyBmYWlsZWQgdG8gY2xlYXIuIFNraXAgdGVzdC4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CiAKLSAgICAgICAgLy8gUmVnaXN0ZXIgZm9yIEdwcyBTdGF0dXMgdXBkYXRlcy4KLSAgICAgICAgbUdwc1N0YXR1c0xpc3RlbmVyID0gbmV3IFRlc3RHcHNTdGF0dXNMaXN0ZW5lcihFVkVOVFNfQ09VTlQsIG1UZXN0TG9jYXRpb25NYW5hZ2VyKTsKLSAgICAgICAgbVRlc3RMb2NhdGlvbk1hbmFnZXIuYWRkR3BzU3RhdHVzTGlzdGVuZXIobUdwc1N0YXR1c0xpc3RlbmVyKTsKKyAgICAgICAgICAgIC8vIFJlZ2lzdGVyIGZvciBHUFMgbWVhc3VyZW1lbnRzLgorICAgICAgICAgICAgbU1lYXN1cmVtZW50TGlzdGVuZXIgPSBuZXcgVGVzdEduc3NNZWFzdXJlbWVudExpc3RlbmVyKFRBRywgRVZFTlRTX0NPVU5UKTsKKyAgICAgICAgICAgIG1UZXN0TG9jYXRpb25NYW5hZ2VyLnJlZ2lzdGVyR25zc01lYXN1cmVtZW50Q2FsbGJhY2sobU1lYXN1cmVtZW50TGlzdGVuZXIpOwogCi0gICAgICAgIC8vIFJlZ2lzdGVyIGZvciBsb2NhdGlvbiB1cGRhdGVzLgotICAgICAgICBtTG9jYXRpb25MaXN0ZW5lciA9IG5ldyBUZXN0TG9jYXRpb25MaXN0ZW5lcihMT0NBVElPTlNfQ09VTlQpOwotICAgICAgICBtVGVzdExvY2F0aW9uTWFuYWdlci5yZXF1ZXN0TG9jYXRpb25VcGRhdGVzKG1Mb2NhdGlvbkxpc3RlbmVyKTsKKyAgICAgICAgICAgIC8vIFJlZ2lzdGVyIGZvciBHcHMgU3RhdHVzIHVwZGF0ZXMuCisgICAgICAgICAgICBtR3BzU3RhdHVzTGlzdGVuZXIgPSBuZXcgVGVzdEdwc1N0YXR1c0xpc3RlbmVyKEVWRU5UU19DT1VOVCwgbVRlc3RMb2NhdGlvbk1hbmFnZXIpOworICAgICAgICAgICAgbVRlc3RMb2NhdGlvbk1hbmFnZXIuYWRkR3BzU3RhdHVzTGlzdGVuZXIobUdwc1N0YXR1c0xpc3RlbmVyKTsKIAotICAgICAgICBtTWVhc3VyZW1lbnRMaXN0ZW5lci5hd2FpdFN0YXR1cygpOwotICAgICAgICBpZiAoIW1NZWFzdXJlbWVudExpc3RlbmVyLnZlcmlmeVN0YXR1cyhpc01lYXN1cmVtZW50VGVzdFN0cmljdCgpKSkgewotICAgICAgICAgICAgcmV0dXJuOyAvLyBleGl0IHBlYWNlZnVsbHkgKGlmIG5vdCBhbHJlYWR5IGFzc2VydGVkIG91dCBpbnNpZGUgdmVyaWZ5U3RhdHVzKQorICAgICAgICAgICAgLy8gUmVnaXN0ZXIgZm9yIGxvY2F0aW9uIHVwZGF0ZXMuCisgICAgICAgICAgICBtTG9jYXRpb25MaXN0ZW5lciA9IG5ldyBUZXN0TG9jYXRpb25MaXN0ZW5lcihMT0NBVElPTlNfQ09VTlQpOworICAgICAgICAgICAgbVRlc3RMb2NhdGlvbk1hbmFnZXIucmVxdWVzdExvY2F0aW9uVXBkYXRlcyhtTG9jYXRpb25MaXN0ZW5lcik7CisKKyAgICAgICAgICAgIG1NZWFzdXJlbWVudExpc3RlbmVyLmF3YWl0U3RhdHVzKCk7CisgICAgICAgICAgICBpZiAoIW1NZWFzdXJlbWVudExpc3RlbmVyLnZlcmlmeVN0YXR1cyhpc01lYXN1cmVtZW50VGVzdFN0cmljdCgpKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsgLy8gZXhpdCBwZWFjZWZ1bGx5IChpZiBub3QgYWxyZWFkeSBhc3NlcnRlZCBvdXQgaW5zaWRlIHZlcmlmeVN0YXR1cykKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gV2FpdCBmb3IgdHdvIG1lYXN1cmVtZW50IGV2ZW50cyAtIHRoaXMgaXMgYmV0dGVyIHRoYW4gd2FpdGluZyBmb3IgYSBsb2NhdGlvbgorICAgICAgICAgICAgLy8gY2FsY3VsYXRpb24gYmVjYXVzZSB0aGUgdGVzdCBnZW5lcmFsbHkgY29tcGxldGVzIG11Y2ggZmFzdGVyLgorICAgICAgICAgICAgbU1lYXN1cmVtZW50TGlzdGVuZXIuYXdhaXQoKTsKKworICAgICAgICAgICAgTG9nLmkoVEFHLCAibUxvY2F0aW9uTGlzdGVuZXIuaXNMb2NhdGlvblJlY2VpdmVkKCk6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBtTG9jYXRpb25MaXN0ZW5lci5pc0xvY2F0aW9uUmVjZWl2ZWQoKSk7CisKKyAgICAgICAgICAgIFNvZnRBc3NlcnQuZmFpbE9yV2FybmluZyhpc01lYXN1cmVtZW50VGVzdFN0cmljdCgpLAorICAgICAgICAgICAgICAgICAgICAiTm8gU2F0ZWxsaXRlcyBhcmUgdmlzaWJsZS4gRGV2aWNlIG1heSBiZSBpbmRvb3JzLiAgUmV0cnkgb3V0ZG9vcnM/IiwKKyAgICAgICAgICAgICAgICAgICAgbUdwc1N0YXR1c0xpc3RlbmVyLmlzR3BzU3RhdHVzUmVjZWl2ZWQoKSk7CisKKyAgICAgICAgICAgIExpc3Q8R25zc01lYXN1cmVtZW50c0V2ZW50PiBldmVudHMgPSBtTWVhc3VyZW1lbnRMaXN0ZW5lci5nZXRFdmVudHMoKTsKKyAgICAgICAgICAgIExvZy5pKFRBRywgIk51bWJlciBvZiBHUFMgbWVhc3VyZW1lbnQgZXZlbnRzIHJlY2VpdmVkID0gIiArIGV2ZW50cy5zaXplKCkpOworCisgICAgICAgICAgICBpZiAoZXZlbnRzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIFNvZnRBc3NlcnQuZmFpbE9yV2FybmluZyhpc01lYXN1cmVtZW50VGVzdFN0cmljdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIk5vIG1lYXN1cmVtZW50IGV2ZW50cyByZWNlaXZlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOyAgLy8gQWxsIG9mIHRoZSBmb2xsb3dpbmcgY2hlY2tzIHJlbHkgb24gdGhlcmUgYmVpbmcgbWVhc3VyZW1lbnRzCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEVuc3VyZSB0aGF0IGFmdGVyIGdldHRpbmcgYSBmZXcgKGF0IGxlYXN0IDIpIG1lYXN1cmVtZW50IGV2ZW50cywgdGhhdCB3ZSBzdGlsbAorICAgICAgICAgICAgLy8gZG9uJ3QgaGF2ZSBsb2NhdGlvbiAoaS5lLiB0aGF0IHdlIGdvdCBtZWFzdXJlbWVudHMgYmVmb3JlIGxvY2F0aW9uLikgIEZhaWwsIGlmCisgICAgICAgICAgICAvLyBzdHJpY3QsIHdhcm4sIGlmIG5vdC4KKyAgICAgICAgICAgIFNvZnRBc3NlcnQuZmFpbE9yV2FybmluZyhpc01lYXN1cmVtZW50VGVzdFN0cmljdCgpLAorICAgICAgICAgICAgICAgICAgICAiTG9jYXRpb24gd2FzIHJlY2VpdmVkIGJlZm9yZSAiICsgZXZlbnRzLnNpemUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBHbnNzTWVhc3VyZW1lbnRFdmVudHMgd2l0aCBtZWFzdXJlbWVudHMgd2VyZSByZXBvcnRlZC4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRlc3QgZXhwZWN0cyBhdCBsZWFzdCAiICsgRVZFTlRTX0NPVU5UICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIEduc3NNZWFzdXJlbWVudEV2ZW50cyBiZWZvcmUgYSBsb2NhdGlvbiwgZ2l2ZW4gdGhlIGNvbGQgc3RhcnQiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHN0YXJ0LiBFbnN1cmUgbm8gb3RoZXIgYWN0aXZlIEdQUyBhcHBzIChzbyB0aGUgY29sZCBzdGFydCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgY29tbWFuZCB3b3JrcykgYW5kIHJldHJ5PyIsCisgICAgICAgICAgICAgICAgICAgICFtTG9jYXRpb25MaXN0ZW5lci5pc0xvY2F0aW9uUmVjZWl2ZWQoKSk7CisgICAgICAgICAgICBpZiAobUxvY2F0aW9uTGlzdGVuZXIuaXNMb2NhdGlvblJlY2VpdmVkKCkgJiYgIWlzTWVhc3VyZW1lbnRUZXN0U3RyaWN0KCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47IC8vIGFsbG93IGEgKHBhc3NpbmcpIHJldHVybiwgaWYgbm90IHN0cmljdCwgb3RoZXJ3aXNlIGNvbnRpbnVlCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIElmIGRldmljZSBoYXMgcmVjZWl2ZWQgbWVhc3VyZW1lbnRzIGFsc28gdmVyaWZ5CisgICAgICAgICAgICAvLyB0aGF0IG1hbmRhdG9yeSBmaWVsZHMgb2YgR25zc01lYXN1cmVtZW50IGFyZSBpbiBleHBlY3RlZCByYW5nZXMuCisgICAgICAgICAgICBHbnNzTWVhc3VyZW1lbnRzRXZlbnQgZmlyc3RFdmVudCA9IGV2ZW50cy5nZXQoMCk7CisgICAgICAgICAgICBDb2xsZWN0aW9uPEduc3NNZWFzdXJlbWVudD4gZ3BzTWVhc3VyZW1lbnRzID0gZmlyc3RFdmVudC5nZXRNZWFzdXJlbWVudHMoKTsKKyAgICAgICAgICAgIGludCBzYXRlbGxpdGVDb3VudCA9IGdwc01lYXN1cmVtZW50cy5zaXplKCk7CisgICAgICAgICAgICBpbnRbXSBncHNQcm5zID0gbmV3IGludFtzYXRlbGxpdGVDb3VudF07CisgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICBmb3IgKEduc3NNZWFzdXJlbWVudCBtZWFzdXJlbWVudCA6IGdwc01lYXN1cmVtZW50cykgeworICAgICAgICAgICAgICAgIGdwc1BybnNbaV0gPSBtZWFzdXJlbWVudC5nZXRTdmlkKCk7CisgICAgICAgICAgICAgICAgKytpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTG9nLmkoVEFHLCAiRmlyc3QgR25zc01lYXN1cmVtZW50c0V2ZW50IHdpdGggUFJOcz0iICsgQXJyYXlzLnRvU3RyaW5nKGdwc1BybnMpKTsKKworICAgICAgICAgICAgU29mdEFzc2VydCBzb2Z0QXNzZXJ0ID0gbmV3IFNvZnRBc3NlcnQoVEFHKTsKKyAgICAgICAgICAgIGxvbmcgdGltZUluTnMgPSBmaXJzdEV2ZW50LmdldENsb2NrKCkuZ2V0VGltZU5hbm9zKCk7CisgICAgICAgICAgICBzb2Z0QXNzZXJ0LmFzc2VydFRydWUoIkdQUyBtZWFzdXJlbWVudCBzYXRlbGxpdGUgY291bnQgY2hlY2s6ICIsCisgICAgICAgICAgICAgICAgICAgIHRpbWVJbk5zLCAvLyBldmVudCB0aW1lIGluIG5zCisgICAgICAgICAgICAgICAgICAgICJzYXRlbGxpdGVDb3VudCA+IDAiLCAvLyBleHBlY3RlZCB2YWx1ZQorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKHNhdGVsbGl0ZUNvdW50KSwgLy8gYWN0dWFsIHZhbHVlCisgICAgICAgICAgICAgICAgICAgIHNhdGVsbGl0ZUNvdW50ID4gMCk7IC8vIGNvbmRpdGlvbgorCisgICAgICAgICAgICBUZXN0TWVhc3VyZW1lbnRVdGlsLmFzc2VydEduc3NDbG9ja0ZpZWxkcyhmaXJzdEV2ZW50LmdldENsb2NrKCksIHNvZnRBc3NlcnQsIHRpbWVJbk5zKTsKKworICAgICAgICAgICAgLy8gVmVyaWZ5IG1hbmRhdG9yeSBmaWVsZHMgb2YgR25zc01lYXN1cmVtZW50CisgICAgICAgICAgICBmb3IgKEduc3NNZWFzdXJlbWVudCBtZWFzdXJlbWVudCA6IGdwc01lYXN1cmVtZW50cykgeworICAgICAgICAgICAgICAgIFRlc3RNZWFzdXJlbWVudFV0aWwuYXNzZXJ0QWxsR25zc01lYXN1cmVtZW50TWFuZGF0b3J5RmllbGRzKG1UZXN0TG9jYXRpb25NYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZW1lbnQsIHNvZnRBc3NlcnQsIHRpbWVJbk5zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNvZnRBc3NlcnQuYXNzZXJ0QWxsKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAvLyBTZXQgdGhlIGFpcnBsYW5lIG1vZGUgYmFjayB0byBvZmYgaWYgaXQgd2FzIG9mZiBiZWZvcmUgdGhpcyB0ZXN0LgorICAgICAgICAgICAgaWYgKCFpc0N0c1ZlcmlmaWVyVGVzdCgpICYmIGlzQWlycGxhbmVNb2RlT2ZmQmVmb3JlVGVzdCkgeworICAgICAgICAgICAgICAgIFRlc3RVdGlscy5zZXRBaXJwbGFuZU1vZGVPbihnZXRDb250ZXh0KCksIGZhbHNlKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQotCi0gICAgICAgIC8vIFdhaXQgZm9yIHR3byBtZWFzdXJlbWVudCBldmVudHMgLSB0aGlzIGlzIGJldHRlciB0aGFuIHdhaXRpbmcgZm9yIGEgbG9jYXRpb24gY2FsY3VsYXRpb24KLSAgICAgICAgLy8gYmVjYXVzZSB0aGUgdGVzdCBnZW5lcmFsbHkgY29tcGxldGVzIG11Y2ggZmFzdGVyLgotICAgICAgICBtTWVhc3VyZW1lbnRMaXN0ZW5lci5hd2FpdCgpOwotCi0gICAgICAgIExvZy5pKFRBRywgIm1Mb2NhdGlvbkxpc3RlbmVyLmlzTG9jYXRpb25SZWNlaXZlZCgpOiAiCi0gICAgICAgICAgICAgICAgKyBtTG9jYXRpb25MaXN0ZW5lci5pc0xvY2F0aW9uUmVjZWl2ZWQoKSk7Ci0KLSAgICAgICAgU29mdEFzc2VydC5mYWlsT3JXYXJuaW5nKGlzTWVhc3VyZW1lbnRUZXN0U3RyaWN0KCksCi0gICAgICAgICAgICAgICAgIk5vIFNhdGVsbGl0ZXMgYXJlIHZpc2libGUuIERldmljZSBtYXkgYmUgaW5kb29ycy4gIFJldHJ5IG91dGRvb3JzPyIsCi0gICAgICAgICAgICAgICAgbUdwc1N0YXR1c0xpc3RlbmVyLmlzR3BzU3RhdHVzUmVjZWl2ZWQoKSk7Ci0KLSAgICAgICAgTGlzdDxHbnNzTWVhc3VyZW1lbnRzRXZlbnQ+IGV2ZW50cyA9IG1NZWFzdXJlbWVudExpc3RlbmVyLmdldEV2ZW50cygpOwotICAgICAgICBMb2cuaShUQUcsICJOdW1iZXIgb2YgR1BTIG1lYXN1cmVtZW50IGV2ZW50cyByZWNlaXZlZCA9ICIgKyBldmVudHMuc2l6ZSgpKTsKLQotICAgICAgICBpZiAoZXZlbnRzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgU29mdEFzc2VydC5mYWlsT3JXYXJuaW5nKGlzTWVhc3VyZW1lbnRUZXN0U3RyaWN0KCksICJObyBtZWFzdXJlbWVudCBldmVudHMgcmVjZWl2ZWQiLAotICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgICAgICByZXR1cm47ICAvLyBBbGwgb2YgdGhlIGZvbGxvd2luZyBjaGVja3MgcmVseSBvbiB0aGVyZSBiZWluZyBtZWFzdXJlbWVudHMKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEVuc3VyZSB0aGF0IGFmdGVyIGdldHRpbmcgYSBmZXcgKGF0IGxlYXN0IDIpIG1lYXN1cmVtZW50IGV2ZW50cywgdGhhdCB3ZSBzdGlsbCBkb24ndCBoYXZlCi0gICAgICAgIC8vIGxvY2F0aW9uIChpLmUuIHRoYXQgd2UgZ290IG1lYXN1cmVtZW50cyBiZWZvcmUgbG9jYXRpb24uKSAgRmFpbCwgaWYgc3RyaWN0LCB3YXJuLCBpZiBub3QuCi0gICAgICAgIFNvZnRBc3NlcnQuZmFpbE9yV2FybmluZyhpc01lYXN1cmVtZW50VGVzdFN0cmljdCgpLAotICAgICAgICAgICAgICAgICJMb2NhdGlvbiB3YXMgcmVjZWl2ZWQgYmVmb3JlICIgKyBldmVudHMuc2l6ZSgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgR25zc01lYXN1cmVtZW50RXZlbnRzIHdpdGggbWVhc3VyZW1lbnRzIHdlcmUgcmVwb3J0ZWQuICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIlRlc3QgZXhwZWN0cyBhdCBsZWFzdCAiICsgRVZFTlRTX0NPVU5UICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgR25zc01lYXN1cmVtZW50RXZlbnRzIGJlZm9yZSBhIGxvY2F0aW9uLCBnaXZlbiB0aGUgY29sZCBzdGFydCBzdGFydC4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiRW5zdXJlIG5vIG90aGVyIGFjdGl2ZSBHUFMgYXBwcyAoc28gdGhlIGNvbGQgc3RhcnQgY29tbWFuZCB3b3JrcykgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiYW5kIHJldHJ5PyIsCi0gICAgICAgICAgICAgICAgIW1Mb2NhdGlvbkxpc3RlbmVyLmlzTG9jYXRpb25SZWNlaXZlZCgpKTsKLSAgICAgICAgaWYgKG1Mb2NhdGlvbkxpc3RlbmVyLmlzTG9jYXRpb25SZWNlaXZlZCgpICYmICFpc01lYXN1cmVtZW50VGVzdFN0cmljdCgpKSB7Ci0gICAgICAgICAgICByZXR1cm47IC8vIGFsbG93IGEgKHBhc3NpbmcpIHJldHVybiwgaWYgbm90IHN0cmljdCwgb3RoZXJ3aXNlIGNvbnRpbnVlCi0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiBkZXZpY2UgaGFzIHJlY2VpdmVkIG1lYXN1cmVtZW50cyBhbHNvIHZlcmlmeQotICAgICAgICAvLyB0aGF0IG1hbmRhdG9yeSBmaWVsZHMgb2YgR25zc01lYXN1cmVtZW50IGFyZSBpbiBleHBlY3RlZCByYW5nZXMuCi0gICAgICAgIEduc3NNZWFzdXJlbWVudHNFdmVudCBmaXJzdEV2ZW50ID0gZXZlbnRzLmdldCgwKTsKLSAgICAgICAgQ29sbGVjdGlvbjxHbnNzTWVhc3VyZW1lbnQ+IGdwc01lYXN1cmVtZW50cyA9IGZpcnN0RXZlbnQuZ2V0TWVhc3VyZW1lbnRzKCk7Ci0gICAgICAgIGludCBzYXRlbGxpdGVDb3VudCA9IGdwc01lYXN1cmVtZW50cy5zaXplKCk7Ci0gICAgICAgIGludFtdIGdwc1BybnMgPSBuZXcgaW50W3NhdGVsbGl0ZUNvdW50XTsKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICBmb3IgKEduc3NNZWFzdXJlbWVudCBtZWFzdXJlbWVudCA6IGdwc01lYXN1cmVtZW50cykgewotICAgICAgICAgICAgZ3BzUHJuc1tpXSA9IG1lYXN1cmVtZW50LmdldFN2aWQoKTsKLSAgICAgICAgICAgICsraTsKLSAgICAgICAgfQotICAgICAgICBMb2cuaShUQUcsICJGaXJzdCBHbnNzTWVhc3VyZW1lbnRzRXZlbnQgd2l0aCBQUk5zPSIgKyBBcnJheXMudG9TdHJpbmcoZ3BzUHJucykpOwotCi0gICAgICAgIFNvZnRBc3NlcnQgc29mdEFzc2VydCA9IG5ldyBTb2Z0QXNzZXJ0KFRBRyk7Ci0gICAgICAgIGxvbmcgdGltZUluTnMgPSBmaXJzdEV2ZW50LmdldENsb2NrKCkuZ2V0VGltZU5hbm9zKCk7Ci0gICAgICAgIHNvZnRBc3NlcnQuYXNzZXJ0VHJ1ZSgiR1BTIG1lYXN1cmVtZW50IHNhdGVsbGl0ZSBjb3VudCBjaGVjazogIiwKLSAgICAgICAgICAgICAgICB0aW1lSW5OcywgLy8gZXZlbnQgdGltZSBpbiBucwotICAgICAgICAgICAgICAgICJzYXRlbGxpdGVDb3VudCA+IDAiLCAvLyBleHBlY3RlZCB2YWx1ZQotICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcoc2F0ZWxsaXRlQ291bnQpLCAvLyBhY3R1YWwgdmFsdWUKLSAgICAgICAgICAgICAgICBzYXRlbGxpdGVDb3VudCA+IDApOyAvLyBjb25kaXRpb24KLQotICAgICAgICBUZXN0TWVhc3VyZW1lbnRVdGlsLmFzc2VydEduc3NDbG9ja0ZpZWxkcyhmaXJzdEV2ZW50LmdldENsb2NrKCksIHNvZnRBc3NlcnQsIHRpbWVJbk5zKTsKLQotICAgICAgICAvLyBWZXJpZnkgbWFuZGF0b3J5IGZpZWxkcyBvZiBHbnNzTWVhc3VyZW1lbnQKLSAgICAgICAgZm9yIChHbnNzTWVhc3VyZW1lbnQgbWVhc3VyZW1lbnQgOiBncHNNZWFzdXJlbWVudHMpIHsKLSAgICAgICAgICAgIFRlc3RNZWFzdXJlbWVudFV0aWwuYXNzZXJ0QWxsR25zc01lYXN1cmVtZW50TWFuZGF0b3J5RmllbGRzKG1lYXN1cmVtZW50LAotICAgICAgICAgICAgICAgICAgICBzb2Z0QXNzZXJ0LCB0aW1lSW5Ocyk7Ci0gICAgICAgIH0KLSAgICAgICAgc29mdEFzc2VydC5hc3NlcnRBbGwoKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9sb2NhdGlvbi9zcmMvYW5kcm9pZC9sb2NhdGlvbi9jdHMvR25zc05hdmlnYXRpb25NZXNzYWdlVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvbG9jYXRpb24vc3JjL2FuZHJvaWQvbG9jYXRpb24vY3RzL0duc3NOYXZpZ2F0aW9uTWVzc2FnZVRlc3QuamF2YQppbmRleCBkNjliZThiLi45OWM0MDY3IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9sb2NhdGlvbi9zcmMvYW5kcm9pZC9sb2NhdGlvbi9jdHMvR25zc05hdmlnYXRpb25NZXNzYWdlVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2xvY2F0aW9uL3NyYy9hbmRyb2lkL2xvY2F0aW9uL2N0cy9HbnNzTmF2aWdhdGlvbk1lc3NhZ2VUZXN0LmphdmEKQEAgLTQyLDYgKzQyLDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkdwc05hdk1zZ1Rlc3QiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVFNfQ09VTlQgPSA1OwogICAgIHByaXZhdGUgVGVzdEduc3NOYXZpZ2F0aW9uTWVzc2FnZUxpc3RlbmVyIG1UZXN0R25zc05hdmlnYXRpb25NZXNzYWdlTGlzdGVuZXI7CisgICAgcHJpdmF0ZSBUZXN0TG9jYXRpb25MaXN0ZW5lciBtTG9jYXRpb25MaXN0ZW5lcjsKIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC01MSw2ICs1MiwxMCBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gVW5yZWdpc3RlciBsaXN0ZW5lcnMKKyAgICAgICAgaWYgKG1Mb2NhdGlvbkxpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1UZXN0TG9jYXRpb25NYW5hZ2VyLnJlbW92ZUxvY2F0aW9uVXBkYXRlcyhtTG9jYXRpb25MaXN0ZW5lcik7CisgICAgICAgIH0KICAgICAgICAgLy8gVW5yZWdpc3RlciBHbnNzTmF2aWdhdGlvbk1lc3NhZ2VMaXN0ZW5lcgogICAgICAgICBpZiAobVRlc3RHbnNzTmF2aWdhdGlvbk1lc3NhZ2VMaXN0ZW5lciAhPSBudWxsKSB7CiAgICAgICAgICAgICBtVGVzdExvY2F0aW9uTWFuYWdlcgpAQCAtNzMsNiArNzgsOSBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKKyAgICAgICAgbUxvY2F0aW9uTGlzdGVuZXIgPSBuZXcgVGVzdExvY2F0aW9uTGlzdGVuZXIoRVZFTlRTX0NPVU5UKTsKKyAgICAgICAgbVRlc3RMb2NhdGlvbk1hbmFnZXIucmVxdWVzdExvY2F0aW9uVXBkYXRlcyhtTG9jYXRpb25MaXN0ZW5lcik7CisKICAgICAgICAgLy8gUmVnaXN0ZXIgR3BzIE5hdmlnYXRpb24gTWVzc2FnZSBMaXN0ZW5lci4KICAgICAgICAgbVRlc3RHbnNzTmF2aWdhdGlvbk1lc3NhZ2VMaXN0ZW5lciA9CiAgICAgICAgICAgICAgICAgbmV3IFRlc3RHbnNzTmF2aWdhdGlvbk1lc3NhZ2VMaXN0ZW5lcihUQUcsIEVWRU5UU19DT1VOVCk7CkBAIC0xMzQsNiArMTQyLDcgQEAKICAgICAgICAgR25zc05hdmlnYXRpb25NZXNzYWdlIG5ld01lc3NhZ2UgPQogICAgICAgICAgICAgICAgIEduc3NOYXZpZ2F0aW9uTWVzc2FnZS5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwocGFyY2VsKTsKICAgICAgICAgdmVyaWZ5VGVzdFZhbHVlcyhuZXdNZXNzYWdlKTsKKyAgICAgICAgcGFyY2VsLnJlY3ljbGUoKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzZXQoKSB7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9sb2NhdGlvbi9zcmMvYW5kcm9pZC9sb2NhdGlvbi9jdHMvR25zc1BzZXVkb3JhbmdlVmVyaWZpY2F0aW9uVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvbG9jYXRpb24vc3JjL2FuZHJvaWQvbG9jYXRpb24vY3RzL0duc3NQc2V1ZG9yYW5nZVZlcmlmaWNhdGlvblRlc3QuamF2YQppbmRleCBlYzc4ZWEzLi4wYTlkMmI2IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9sb2NhdGlvbi9zcmMvYW5kcm9pZC9sb2NhdGlvbi9jdHMvR25zc1BzZXVkb3JhbmdlVmVyaWZpY2F0aW9uVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2xvY2F0aW9uL3NyYy9hbmRyb2lkL2xvY2F0aW9uL2N0cy9HbnNzUHNldWRvcmFuZ2VWZXJpZmljYXRpb25UZXN0LmphdmEKQEAgLTIxLDYgKzIxLDcgQEAKIGltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkduc3NNZWFzdXJlbWVudHNFdmVudDsKIGltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkduc3NTdGF0dXM7CiBpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNkZFRlc3Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKQEAgLTM5LDcgKzQwLDcgQEAKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FQVNVUkVNRU5UX0VWRU5UU19UT19DT0xMRUNUX0NPVU5UID0gMTA7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNSU5fU0FURUxMSVRFU19SRVFVSVJFTUVOVCA9IDQ7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZSBTRUNPTkRTX1BFUl9OQU5PID0gMS4wZS05OwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUgUE9TSVRJT05fVEhSRVNIT0xEX0lOX0RFR1JFRVMgPSAwLjAwMzsgLy8gZGVncmVlcyAofj0gMzAwIG1ldGVycykKKwogICAvLyBHUFMvR0xPTkFTUzogYWNjb3JkaW5nIHRvIGh0dHA6Ly9jZG4uaW50ZWNob3Blbi5jb20vcGRmcy13bS8yNzcxMi5wZGYsIHRoZSBwc2V1ZG9yYW5nZSBpbiB0aW1lCiAgIC8vIGlzIDY1LTgzIG1zLCB3aGljaCBpcyAxOCBtcyByYW5nZS4KICAgLy8gR0xPTkFTUzogb3JiaXQgaXMgYSBiaXQgY2xvc2VyIHRoYW4gR1BTLCBzbyB3ZSBhZGQgMC4wMDNtcyB0byB0aGUgcmFuZ2UsIGhlbmNlIGRlbHRhaVNlY29uZHMKQEAgLTU4LDYgKzU5LDEyIEBACiAgIC8vIHRoYXQgYXJlIHRoZSBzaG9ydCBlbmQgb2YgdGhlIHJhbmdlLgogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUgUFNFVURPUkFOR0VfVEhSRVNIT0xEX0JFSURPVV9RWlNTX0lOX1NFQyA9IDAuMDc2OwogCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IExPV19FTk9VR0hfUE9TSVRJT05fVU5DRVJUQUlOVFlfTUVURVJTID0gMTAwOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBMT1dfRU5PVUdIX1ZFTE9DSVRZX1VOQ0VSVEFJTlRZX01QUyA9IDU7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IEhPUklaT05UQUxfT0ZGU0VUX0ZMT09SX01FVEVSUyA9IDEwOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBIT1JJWk9OVEFMX09GRlNFVF9TSUdNQSA9IDM7ICAvLyAzICogdGhlIH42OCVpbGUgbGV2ZWwKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgSE9SSVpPTlRBTF9PRkZTRVRfRkxPT1JfTVBTID0gMTsKKwogICBwcml2YXRlIFRlc3RHbnNzTWVhc3VyZW1lbnRMaXN0ZW5lciBtTWVhc3VyZW1lbnRMaXN0ZW5lcjsKICAgcHJpdmF0ZSBUZXN0TG9jYXRpb25MaXN0ZW5lciBtTG9jYXRpb25MaXN0ZW5lcjsKIApAQCAtMjI0LDkyICsyMzEsMTc0IEBACiAgICAgfQogICB9CiAKLSAgLyoKLSAqIFVzZSBwc2V1ZG9yYW5nZSBjYWxjdWxhdGlvbiBsaWJyYXJ5IHRvIGNhbGN1bGF0ZSBwb3NpdGlvbiB0aGVuIGNvbXBhcmUgdG8gbG9jYXRpb24gZnJvbQotICogTG9jYXRpb24gTWFuYWdlci4KLSAqLwotICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iNy4zLjMiKQotICBwdWJsaWMgdm9pZCB0ZXN0UHNldWRvUG9zaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAvLyBDaGVja3MgaWYgR25zcyBoYXJkd2FyZSBmZWF0dXJlIGlzIHByZXNlbnQsIHNraXBzIHRlc3QgKHBhc3MpIGlmIG5vdCwKLSAgICAvLyBhbmQgaGFyZCBhc3NlcnRzIHRoYXQgTG9jYXRpb24vR25zcyAoUHJvdmlkZXIpIGlzIHR1cm5lZCBvbiBpZiBpcyBDdHMgVmVyaWZpZXIuCi0gICAgLy8gRnJvbSBhbmRyb2lkIE8sIENUUyB0ZXN0cyBzaG91bGQgcnVuIGluIHRoZSBsYWIgd2l0aCBHUFMgc2lnbmFsLgotICAgIGlmICghVGVzdE1lYXN1cmVtZW50VXRpbC5jYW5UZXN0UnVuT25DdXJyZW50RGV2aWNlKG1UZXN0TG9jYXRpb25NYW5hZ2VyLAotICAgICAgICBUQUcsIE1JTl9IQVJEV0FSRV9ZRUFSX01FQVNVUkVNRU5UU19SRVFVSVJFRCwgdHJ1ZSkpIHsKLSAgICAgIHJldHVybjsKKyAgICAvKgorICAgICAqIFVzZSBwc2V1ZG9yYW5nZSBjYWxjdWxhdGlvbiBsaWJyYXJ5IHRvIGNhbGN1bGF0ZSBwb3NpdGlvbiB0aGVuIGNvbXBhcmUgdG8gbG9jYXRpb24gZnJvbQorICAgICAqIExvY2F0aW9uIE1hbmFnZXIuCisgICAgICovCisgICAgQENkZFRlc3QocmVxdWlyZW1lbnQgPSAiNy4zLjMiKQorICAgIEBBcHBNb2RlRnVsbChyZWFzb24gPSAiRmxha3kgaW4gaW5zdGFudCBtb2RlIikKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHNldWRvUG9zaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gQ2hlY2tzIGlmIEduc3MgaGFyZHdhcmUgZmVhdHVyZSBpcyBwcmVzZW50LCBza2lwcyB0ZXN0IChwYXNzKSBpZiBub3QsCisgICAgICAgIC8vIGFuZCBoYXJkIGFzc2VydHMgdGhhdCBMb2NhdGlvbi9HbnNzIChQcm92aWRlcikgaXMgdHVybmVkIG9uIGlmIGlzIEN0cyBWZXJpZmllci4KKyAgICAgICAgLy8gRnJvbSBhbmRyb2lkIE8sIENUUyB0ZXN0cyBzaG91bGQgcnVuIGluIHRoZSBsYWIgd2l0aCBHUFMgc2lnbmFsLgorICAgICAgICBpZiAoIVRlc3RNZWFzdXJlbWVudFV0aWwuY2FuVGVzdFJ1bk9uQ3VycmVudERldmljZShtVGVzdExvY2F0aW9uTWFuYWdlciwKKyAgICAgICAgICAgICAgICBUQUcsIE1JTl9IQVJEV0FSRV9ZRUFSX01FQVNVUkVNRU5UU19SRVFVSVJFRCwgdHJ1ZSkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1Mb2NhdGlvbkxpc3RlbmVyID0gbmV3IFRlc3RMb2NhdGlvbkxpc3RlbmVyKExPQ0FUSU9OX1RPX0NPTExFQ1RfQ09VTlQpOworICAgICAgICBtVGVzdExvY2F0aW9uTWFuYWdlci5yZXF1ZXN0TG9jYXRpb25VcGRhdGVzKG1Mb2NhdGlvbkxpc3RlbmVyKTsKKworICAgICAgICBtTWVhc3VyZW1lbnRMaXN0ZW5lciA9IG5ldyBUZXN0R25zc01lYXN1cmVtZW50TGlzdGVuZXIoVEFHLAorICAgICAgICAgICAgICAgIE1FQVNVUkVNRU5UX0VWRU5UU19UT19DT0xMRUNUX0NPVU5ULCB0cnVlKTsKKyAgICAgICAgbVRlc3RMb2NhdGlvbk1hbmFnZXIucmVnaXN0ZXJHbnNzTWVhc3VyZW1lbnRDYWxsYmFjayhtTWVhc3VyZW1lbnRMaXN0ZW5lcik7CisKKyAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gbUxvY2F0aW9uTGlzdGVuZXIuYXdhaXQoKTsKKworICAgICAgICBMaXN0PExvY2F0aW9uPiByZWNlaXZlZExvY2F0aW9uTGlzdCA9IG1Mb2NhdGlvbkxpc3RlbmVyLmdldFJlY2VpdmVkTG9jYXRpb25MaXN0KCk7CisgICAgICAgIGFzc2VydFRydWUoIlRpbWUgZWxhcHNlZCB3aXRob3V0IGdldHRpbmcgZW5vdWdoIGxvY2F0aW9uIGZpeGVzLiIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBQb3NzaWJseSwgdGhlIHRlc3QgaGFzIGJlZW4gcnVuIGRlZXAgaW5kb29ycy4iCisgICAgICAgICAgICAgICAgICAgICAgICArICIgQ29uc2lkZXIgcmV0cnlpbmcgdGVzdCBvdXRkb29ycy4iLAorICAgICAgICAgICAgICAgIHN1Y2Nlc3MgJiYgcmVjZWl2ZWRMb2NhdGlvbkxpc3Quc2l6ZSgpID4gMCk7CisgICAgICAgIExvY2F0aW9uIGxvY2F0aW9uRnJvbUFwaSA9IHJlY2VpdmVkTG9jYXRpb25MaXN0LmdldCgwKTsKKworICAgICAgICAvLyBTaW5jZSB3ZSBhcmUgY2hlY2tpbmcgdGhlIGV2ZW50Q291bnQgbGF0ZXIsIHRoZXJlIGlzIG5vIG5lZWQgdG8gY2hlY2sgdGhlIHJldHVybiB2YWx1ZQorICAgICAgICAvLyBoZXJlLgorICAgICAgICBtTWVhc3VyZW1lbnRMaXN0ZW5lci5hd2FpdCgpOworCisgICAgICAgIExpc3Q8R25zc01lYXN1cmVtZW50c0V2ZW50PiBldmVudHMgPSBtTWVhc3VyZW1lbnRMaXN0ZW5lci5nZXRFdmVudHMoKTsKKyAgICAgICAgaW50IGV2ZW50Q291bnQgPSBldmVudHMuc2l6ZSgpOworICAgICAgICBMb2cuaShUQUcsICJOdW1iZXIgb2YgR3BzIEV2ZW50IHJlY2VpdmVkID0gIiArIGV2ZW50Q291bnQpOworICAgICAgICBpbnQgZ25zc1llYXJPZkhhcmR3YXJlID0gbVRlc3RMb2NhdGlvbk1hbmFnZXIuZ2V0TG9jYXRpb25NYW5hZ2VyKCkuZ2V0R25zc1llYXJPZkhhcmR3YXJlKCk7CisgICAgICAgIGlmIChldmVudENvdW50ID09IDAgJiYgZ25zc1llYXJPZkhhcmR3YXJlIDwgTUlOX0hBUkRXQVJFX1lFQVJfTUVBU1VSRU1FTlRTX1JFUVVJUkVEKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBMb2cuaShUQUcsICJUaGlzIGlzIGEgZGV2aWNlIGZyb20gMjAxNiBvciBsYXRlci4iKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiR25zc01lYXN1cmVtZW50RXZlbnQgY291bnQ6IGV4cGVjdGVkID4gMCwgcmVjZWl2ZWQgPSAiICsgZXZlbnRDb3VudCwKKyAgICAgICAgICAgICAgICBldmVudENvdW50ID4gMCk7CisKKyAgICAgICAgUHNldWRvcmFuZ2VQb3NpdGlvblZlbG9jaXR5RnJvbVJlYWxUaW1lRXZlbnRzIG1Qc2V1ZG9yYW5nZVBvc2l0aW9uRnJvbVJlYWxUaW1lRXZlbnRzCisgICAgICAgICAgICAgICAgPSBuZXcgUHNldWRvcmFuZ2VQb3NpdGlvblZlbG9jaXR5RnJvbVJlYWxUaW1lRXZlbnRzKCk7CisgICAgICAgIG1Qc2V1ZG9yYW5nZVBvc2l0aW9uRnJvbVJlYWxUaW1lRXZlbnRzLnNldFJlZmVyZW5jZVBvc2l0aW9uKAorICAgICAgICAgICAgICAgIChpbnQpIChsb2NhdGlvbkZyb21BcGkuZ2V0TGF0aXR1ZGUoKSAqIDFFNyksCisgICAgICAgICAgICAgICAgKGludCkgKGxvY2F0aW9uRnJvbUFwaS5nZXRMb25naXR1ZGUoKSAqIDFFNyksCisgICAgICAgICAgICAgICAgKGludCkgKGxvY2F0aW9uRnJvbUFwaS5nZXRBbHRpdHVkZSgpICogMUU3KSk7CisKKyAgICAgICAgTG9nLmkoVEFHLCAiTG9jYXRpb24gZnJvbSBMb2NhdGlvbiBNYW5hZ2VyIgorICAgICAgICAgICAgICAgICsgIiwgTGF0aXR1ZGU6IiArIGxvY2F0aW9uRnJvbUFwaS5nZXRMYXRpdHVkZSgpCisgICAgICAgICAgICAgICAgKyAiLCBMb25naXR1ZGU6IiArIGxvY2F0aW9uRnJvbUFwaS5nZXRMb25naXR1ZGUoKQorICAgICAgICAgICAgICAgICsgIiwgQWx0aXR1ZGU6IiArIGxvY2F0aW9uRnJvbUFwaS5nZXRBbHRpdHVkZSgpKTsKKworICAgICAgICAvLyBFbnN1cmUgYXQgbGVhc3Qgc29tZSBjYWxjdWxhdGVkIGxvY2F0aW9ucyBoYXZlIGEgcmVhc29uYWJseSBsb3cgdW5jZXJ0YWludHkKKyAgICAgICAgYm9vbGVhbiBzb21lTG9jYXRpb25zSGF2ZUxvd1Bvc1VuYyA9IGZhbHNlOworICAgICAgICBib29sZWFuIHNvbWVMb2NhdGlvbnNIYXZlTG93VmVsVW5jID0gZmFsc2U7CisKKyAgICAgICAgaW50IHRvdGFsQ2FsY3VsYXRlZExvY2F0aW9uQ250ID0gMDsKKyAgICAgICAgZm9yIChHbnNzTWVhc3VyZW1lbnRzRXZlbnQgZXZlbnQgOiBldmVudHMpIHsKKyAgICAgICAgICAgIC8vIEluIG1NZWFzdXJlbWVudExpc3RlbmVyLmdldEV2ZW50cygpIHdlIGFscmVhZHkgZmlsdGVyZWQgb3V0IGV2ZW50cywgYXQgdGhpcyBwb2ludAorICAgICAgICAgICAgLy8gZXZlcnkgZXZlbnQgd2lsbCBoYXZlIGF0IGxlYXN0IDQgc2F0ZWxsaXRlcyBpbiBvbmUgY29uc3RlbGxhdGlvbi4KKyAgICAgICAgICAgIG1Qc2V1ZG9yYW5nZVBvc2l0aW9uRnJvbVJlYWxUaW1lRXZlbnRzLmNvbXB1dGVQb3NpdGlvblZlbG9jaXR5U29sdXRpb25zRnJvbVJhd01lYXMoCisgICAgICAgICAgICAgICAgICAgIGV2ZW50KTsKKyAgICAgICAgICAgIGRvdWJsZVtdIGNhbGN1bGF0ZWRMYXRMbmdBbHQgPQorICAgICAgICAgICAgICAgICAgICBtUHNldWRvcmFuZ2VQb3NpdGlvbkZyb21SZWFsVGltZUV2ZW50cy5nZXRQb3NpdGlvblNvbHV0aW9uTGF0TG5nRGVnKCk7CisgICAgICAgICAgICAvLyBpdCB3aWxsIHJldHVybiBOYU4gd2hlbiB0aGVyZSBpcyBubyBlbm91Z2ggbWVhc3VyZW1lbnRzIHRvIGNhbGN1bGF0ZSB0aGUgcG9zaXRpb24KKyAgICAgICAgICAgIGlmIChEb3VibGUuaXNOYU4oY2FsY3VsYXRlZExhdExuZ0FsdFswXSkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdG90YWxDYWxjdWxhdGVkTG9jYXRpb25DbnQrKzsKKyAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJDYWxjdWxhdGVkIExvY2F0aW9uIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBMYXRpdHVkZToiICsgY2FsY3VsYXRlZExhdExuZ0FsdFswXQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBMb25naXR1ZGU6IiArIGNhbGN1bGF0ZWRMYXRMbmdBbHRbMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgQWx0aXR1ZGU6IiArIGNhbGN1bGF0ZWRMYXRMbmdBbHRbMl0pOworCisgICAgICAgICAgICAgICAgZG91YmxlW10gcG9zVmVsVW5jZXJ0YWludGllcyA9CisgICAgICAgICAgICAgICAgICAgICAgICBtUHNldWRvcmFuZ2VQb3NpdGlvbkZyb21SZWFsVGltZUV2ZW50cy5nZXRQb3NpdGlvblZlbG9jaXR5VW5jZXJ0YWludHlFbnUoKTsKKworICAgICAgICAgICAgICAgIGRvdWJsZSBob3Jpem9udGFsUG9zaXRpb25VbmNlcnRhaW50eU1ldGVycyA9CisgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLnNxcnQocG9zVmVsVW5jZXJ0YWludGllc1swXSAqIHBvc1ZlbFVuY2VydGFpbnRpZXNbMF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwb3NWZWxVbmNlcnRhaW50aWVzWzFdICogcG9zVmVsVW5jZXJ0YWludGllc1sxXSk7CisKKyAgICAgICAgICAgICAgICAvLyBUb2xlcmF0ZSBsYXJnZSBvZmZzZXRzLCB3aGVuIHRoZSBkZXZpY2UgcmVwb3J0cyBhIGxhcmdlIHVuY2VydGFpbnR5IC0gd2hpbGUgYWxzbworICAgICAgICAgICAgICAgIC8vIGVuc3VyaW5nIChoZXJlKSB0aGF0IHNvbWUgbG9jYXRpb25zIGFyZSBwcm9kdWNlZCBiZWZvcmUgdGhlIHRlc3QgZW5kcworICAgICAgICAgICAgICAgIC8vIHdpdGggYSByZWFzb25hYmx5IGxvdyBzZXQgb2YgZXJyb3IgZXN0aW1hdGVzCisgICAgICAgICAgICAgICAgaWYgKGhvcml6b250YWxQb3NpdGlvblVuY2VydGFpbnR5TWV0ZXJzIDwgTE9XX0VOT1VHSF9QT1NJVElPTl9VTkNFUlRBSU5UWV9NRVRFUlMpIHsKKyAgICAgICAgICAgICAgICAgICAgc29tZUxvY2F0aW9uc0hhdmVMb3dQb3NVbmMgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFJvb3Qtc3VtLXNxYXVyZSB0aGUgV0xTLCBhbmQgZGV2aWNlIGdlbmVyYXRlZCA2OCVpbGUgYWNjdXJhY2llcyBpcyBhIGNvbnNlcnZhdGl2ZQorICAgICAgICAgICAgICAgIC8vIDY4JWlsZSBvZmZzZXQgKGdpdmVuIGxpa2VseSBjb3JyZWxhdGVkIGVycm9ycykgLSB0aGVuIHRoaXMgaXMgc2NhbGVkIGJ5CisgICAgICAgICAgICAgICAgLy8gaW5pdGlhbGx5IDMgc2lnbWEgdG8gZ2l2ZSBhIGhpZ2ggZW5vdWdoIHRvbGVyYW5jZSB0byBtYWtlIHRoZSB0ZXN0IHRvbGVyYW50CisgICAgICAgICAgICAgICAgLy8gZW5vdWdoIG9mIG5vaXNlIHRvIHBhc3MgcmVsaWFibHkuICBGbG9vciBhZGRzIGFkZGl0aW9uYWwgcm9idXN0bmVzcyBpbiBjYXNlIG9mCisgICAgICAgICAgICAgICAgLy8gc21hbGwgZXJyb3JzIGFuZCBzbWFsbCBlcnJvciBlc3RpbWF0ZXMuCisgICAgICAgICAgICAgICAgZG91YmxlIGhvcml6b250YWxPZmZzZXRUaHJlc2hvbGRNZXRlcnMgPSBIT1JJWk9OVEFMX09GRlNFVF9TSUdNQSAqIE1hdGguc3FydCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGhvcml6b250YWxQb3NpdGlvblVuY2VydGFpbnR5TWV0ZXJzICogaG9yaXpvbnRhbFBvc2l0aW9uVW5jZXJ0YWludHlNZXRlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBsb2NhdGlvbkZyb21BcGkuZ2V0QWNjdXJhY3koKSAqIGxvY2F0aW9uRnJvbUFwaS5nZXRBY2N1cmFjeSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgKyBIT1JJWk9OVEFMX09GRlNFVF9GTE9PUl9NRVRFUlM7CisKKyAgICAgICAgICAgICAgICBMb2NhdGlvbiBjYWxjdWxhdGVkTG9jYXRpb24gPSBuZXcgTG9jYXRpb24oImdwcyIpOworICAgICAgICAgICAgICAgIGNhbGN1bGF0ZWRMb2NhdGlvbi5zZXRMYXRpdHVkZShjYWxjdWxhdGVkTGF0TG5nQWx0WzBdKTsKKyAgICAgICAgICAgICAgICBjYWxjdWxhdGVkTG9jYXRpb24uc2V0TG9uZ2l0dWRlKGNhbGN1bGF0ZWRMYXRMbmdBbHRbMV0pOworICAgICAgICAgICAgICAgIGNhbGN1bGF0ZWRMb2NhdGlvbi5zZXRBbHRpdHVkZShjYWxjdWxhdGVkTGF0TG5nQWx0WzJdKTsKKworICAgICAgICAgICAgICAgIGRvdWJsZSBob3Jpem9udGFsT2Zmc2V0ID0gY2FsY3VsYXRlZExvY2F0aW9uLmRpc3RhbmNlVG8obG9jYXRpb25Gcm9tQXBpKTsKKworICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkNhbGN1bGF0ZWQgTG9jYXRpb24gT2Zmc2V0OiAiICsgaG9yaXpvbnRhbE9mZnNldAorICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBUaHJlc2hvbGQ6ICIgKyBob3Jpem9udGFsT2Zmc2V0VGhyZXNob2xkTWV0ZXJzKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJMYXRpdHVkZSAmIExvbmdpdHVkZSBjYWxjdWxhdGVkIGZyb20gcHNldWRvcmFuZ2VzIHNob3VsZCBiZSBjbG9zZSB0byAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInRob3NlIHJlcG9ydGVkIGZyb20gTG9jYXRpb24gTWFuYWdlci4gIE9mZnNldCA9ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBob3Jpem9udGFsT2Zmc2V0ICsgIiBtZXRlcnMuIFRocmVzaG9sZCA9ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBob3Jpem9udGFsT2Zmc2V0VGhyZXNob2xkTWV0ZXJzICsgIiBtZXRlcnMgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhvcml6b250YWxPZmZzZXQgPCBob3Jpem9udGFsT2Zmc2V0VGhyZXNob2xkTWV0ZXJzKTsKKworICAgICAgICAgICAgICAgIC8vVE9ETzogQ2hlY2sgZm9yIHRoZSBhbHRpdHVkZSBvZmZzZXQKKworICAgICAgICAgICAgICAgIC8vIFRoaXMgMkQgdmVsb2NpdHkgdW5jZXJ0YWludHkgaXMgY29uc2VydmF0aXZlbHkgbGFyZ2VyIHRoYW4gc3BlZWQgdW5jZXJ0YWludHkKKyAgICAgICAgICAgICAgICAvLyBhcyBpdCBhbHNvIGNvbnRhaW5zIHRoZSBlZmZlY3Qgb2YgYmVhcmluZyB1bmNlcnRhaW50eSBhdCBhIGNvbnN0YW50IHNwZWVkCisgICAgICAgICAgICAgICAgZG91YmxlIGhvcml6b250YWxWZWxvY2l0eVVuY2VydGFpbnR5TXBzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguc3FydChwb3NWZWxVbmNlcnRhaW50aWVzWzRdICogcG9zVmVsVW5jZXJ0YWludGllc1s0XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBvc1ZlbFVuY2VydGFpbnRpZXNbNV0gKiBwb3NWZWxVbmNlcnRhaW50aWVzWzVdKTsKKyAgICAgICAgICAgICAgICBpZiAoaG9yaXpvbnRhbFZlbG9jaXR5VW5jZXJ0YWludHlNcHMgPCBMT1dfRU5PVUdIX1ZFTE9DSVRZX1VOQ0VSVEFJTlRZX01QUykgeworICAgICAgICAgICAgICAgICAgICBzb21lTG9jYXRpb25zSGF2ZUxvd1ZlbFVuYyA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gQXNzdW1lIDFtL3MgdW5jZXJ0YWludHkgZnJvbSBBUEksIGZvciB0aGlzIHRlc3QsIGlmIG5vdCBwcm92aWRlZAorICAgICAgICAgICAgICAgIGZsb2F0IHNwZWVkVW5jRnJvbUFwaU1wcyA9IGxvY2F0aW9uRnJvbUFwaS5oYXNTcGVlZEFjY3VyYWN5KCkKKyAgICAgICAgICAgICAgICAgICAgICAgID8gbG9jYXRpb25Gcm9tQXBpLmdldFNwZWVkQWNjdXJhY3lNZXRlcnNQZXJTZWNvbmQoKQorICAgICAgICAgICAgICAgICAgICAgICAgOiBIT1JJWk9OVEFMX09GRlNFVF9GTE9PUl9NUFM7CisKKyAgICAgICAgICAgICAgICAvLyBTaW1pbGFyIDMtc3RhbmRhcmQgZGV2aWF0aW9uIHBsdXMgZmxvb3IgdGhyZXNob2xkIGFzCisgICAgICAgICAgICAgICAgLy8gaG9yaXpvbnRhbE9mZnNldFRocmVzaG9sZE1ldGVycyBhYm92ZQorICAgICAgICAgICAgICAgIGRvdWJsZSBob3Jpem9udGFsU3BlZWRPZmZzZXRUaHJlc2hvbGRNcHMgPSBIT1JJWk9OVEFMX09GRlNFVF9TSUdNQSAqIE1hdGguc3FydCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGhvcml6b250YWxWZWxvY2l0eVVuY2VydGFpbnR5TXBzICogaG9yaXpvbnRhbFZlbG9jaXR5VW5jZXJ0YWludHlNcHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzcGVlZFVuY0Zyb21BcGlNcHMgKiBzcGVlZFVuY0Zyb21BcGlNcHMpCisgICAgICAgICAgICAgICAgICAgICAgICArIEhPUklaT05UQUxfT0ZGU0VUX0ZMT09SX01QUzsKKworICAgICAgICAgICAgICAgIGRvdWJsZVtdIGNhbGN1bGF0ZWRWZWxvY2l0eUVudU1wcyA9CisgICAgICAgICAgICAgICAgICAgICAgICBtUHNldWRvcmFuZ2VQb3NpdGlvbkZyb21SZWFsVGltZUV2ZW50cy5nZXRWZWxvY2l0eVNvbHV0aW9uRW51TXBzKCk7CisgICAgICAgICAgICAgICAgZG91YmxlIGNhbGN1bGF0ZWRIb3Jpem9udGFsU3BlZWRNcHMgPQorICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5zcXJ0KGNhbGN1bGF0ZWRWZWxvY2l0eUVudU1wc1swXSAqIGNhbGN1bGF0ZWRWZWxvY2l0eUVudU1wc1swXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNhbGN1bGF0ZWRWZWxvY2l0eUVudU1wc1sxXSAqIGNhbGN1bGF0ZWRWZWxvY2l0eUVudU1wc1sxXSk7CisKKyAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJDYWxjdWxhdGVkIFNwZWVkOiAiICsgY2FsY3VsYXRlZEhvcml6b250YWxTcGVlZE1wcworICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBSZXBvcnRlZCBTcGVlZDogIiArIGxvY2F0aW9uRnJvbUFwaS5nZXRTcGVlZCgpCisgICAgICAgICAgICAgICAgICAgICAgICArICIsIFRocmVzaG9sZDogIiArIGhvcml6b250YWxTcGVlZE9mZnNldFRocmVzaG9sZE1wcyk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiU3BlZWQgKCIgKyBjYWxjdWxhdGVkSG9yaXpvbnRhbFNwZWVkTXBzICsgIiBtL3MpIGNhbGN1bGF0ZWQgZnJvbSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHBzZXVkb3JhbmdlcyBzaG91bGQgYmUgY2xvc2UgdG8gdGhlIHNwZWVkICgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbG9jYXRpb25Gcm9tQXBpLmdldFNwZWVkKCkgKyAiIG0vcykgcmVwb3J0ZWQgZnJvbSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIExvY2F0aW9uIE1hbmFnZXIuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguYWJzKGNhbGN1bGF0ZWRIb3Jpem9udGFsU3BlZWRNcHMgLSBsb2NhdGlvbkZyb21BcGkuZ2V0U3BlZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCBob3Jpem9udGFsU3BlZWRPZmZzZXRUaHJlc2hvbGRNcHMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiQ2FsY3VsYXRlZCBMb2NhdGlvbiBDb3VudCBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIDAuIiwKKyAgICAgICAgICAgICAgICB0b3RhbENhbGN1bGF0ZWRMb2NhdGlvbkNudCA+IDApOworICAgICAgICBhc3NlcnRUcnVlKCJDYWxjdWxhdGVkIEhvcml6b250YWwgTG9jYXRpb24gVW5jZXJ0YWludHkgc2hvdWxkIGF0IGxlYXN0IG9uY2UgYmUgbGVzcyB0aGFuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgTE9XX0VOT1VHSF9QT1NJVElPTl9VTkNFUlRBSU5UWV9NRVRFUlMsCisgICAgICAgICAgICAgICAgc29tZUxvY2F0aW9uc0hhdmVMb3dQb3NVbmMpOworICAgICAgICBhc3NlcnRUcnVlKCJDYWxjdWxhdGVkIEhvcml6b250YWwgVmVsb2NpdHkgVW5jZXJ0YWludHkgc2hvdWxkIGF0IGxlYXN0IG9uY2UgYmUgbGVzcyB0aGFuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgTE9XX0VOT1VHSF9WRUxPQ0lUWV9VTkNFUlRBSU5UWV9NUFMsCisgICAgICAgICAgICAgICAgc29tZUxvY2F0aW9uc0hhdmVMb3dWZWxVbmMpOwogICAgIH0KLQotICAgIG1Mb2NhdGlvbkxpc3RlbmVyID0gbmV3IFRlc3RMb2NhdGlvbkxpc3RlbmVyKExPQ0FUSU9OX1RPX0NPTExFQ1RfQ09VTlQpOwotICAgIG1UZXN0TG9jYXRpb25NYW5hZ2VyLnJlcXVlc3RMb2NhdGlvblVwZGF0ZXMobUxvY2F0aW9uTGlzdGVuZXIpOwotCi0gICAgbU1lYXN1cmVtZW50TGlzdGVuZXIgPSBuZXcgVGVzdEduc3NNZWFzdXJlbWVudExpc3RlbmVyKFRBRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRUFTVVJFTUVOVF9FVkVOVFNfVE9fQ09MTEVDVF9DT1VOVCwgdHJ1ZSk7Ci0gICAgbVRlc3RMb2NhdGlvbk1hbmFnZXIucmVnaXN0ZXJHbnNzTWVhc3VyZW1lbnRDYWxsYmFjayhtTWVhc3VyZW1lbnRMaXN0ZW5lcik7Ci0KLSAgICBib29sZWFuIHN1Y2Nlc3MgPSBtTG9jYXRpb25MaXN0ZW5lci5hd2FpdCgpOwotCi0gICAgTGlzdDxMb2NhdGlvbj4gcmVjZWl2ZWRMb2NhdGlvbkxpc3QgPSBtTG9jYXRpb25MaXN0ZW5lci5nZXRSZWNlaXZlZExvY2F0aW9uTGlzdCgpOwotICAgIGFzc2VydFRydWUoIlRpbWUgZWxhcHNlZCB3aXRob3V0IGdldHRpbmcgZW5vdWdoIGxvY2F0aW9uIGZpeGVzLiIKLSAgICAgICAgICAgICsgIiBQb3NzaWJseSwgdGhlIHRlc3QgaGFzIGJlZW4gcnVuIGRlZXAgaW5kb29ycy4iCi0gICAgICAgICAgICArICIgQ29uc2lkZXIgcmV0cnlpbmcgdGVzdCBvdXRkb29ycy4iLAotICAgICAgICBzdWNjZXNzICYmIHJlY2VpdmVkTG9jYXRpb25MaXN0LnNpemUoKSA+IDApOwotICAgIExvY2F0aW9uIGxvY2F0aW9uRnJvbUFwaSA9IHJlY2VpdmVkTG9jYXRpb25MaXN0LmdldCgwKTsKLQotICAgIC8vIFNpbmNlIHdlIGFyZSBjaGVja2luZyB0aGUgZXZlbnRDb3VudCBsYXRlciwgdGhlcmUgaXMgbm8gbmVlZCB0byBjaGVjayB0aGUgcmV0dXJuIHZhbHVlIGhlcmUuCi0gICAgbU1lYXN1cmVtZW50TGlzdGVuZXIuYXdhaXQoKTsKLQotICAgIExpc3Q8R25zc01lYXN1cmVtZW50c0V2ZW50PiBldmVudHMgPSBtTWVhc3VyZW1lbnRMaXN0ZW5lci5nZXRFdmVudHMoKTsKLSAgICBpbnQgZXZlbnRDb3VudCA9IGV2ZW50cy5zaXplKCk7Ci0gICAgTG9nLmkoVEFHLCAiTnVtYmVyIG9mIEdwcyBFdmVudCByZWNlaXZlZCA9ICIgKyBldmVudENvdW50KTsKLSAgICBpbnQgZ25zc1llYXJPZkhhcmR3YXJlID0gbVRlc3RMb2NhdGlvbk1hbmFnZXIuZ2V0TG9jYXRpb25NYW5hZ2VyKCkuZ2V0R25zc1llYXJPZkhhcmR3YXJlKCk7Ci0gICAgaWYgKGV2ZW50Q291bnQgPT0gMCAmJiBnbnNzWWVhck9mSGFyZHdhcmUgPCBNSU5fSEFSRFdBUkVfWUVBUl9NRUFTVVJFTUVOVFNfUkVRVUlSRUQpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBMb2cuaShUQUcsICJUaGlzIGlzIGEgZGV2aWNlIGZyb20gMjAxNiBvciBsYXRlci4iKTsKLSAgICBhc3NlcnRUcnVlKCJHbnNzTWVhc3VyZW1lbnRFdmVudCBjb3VudDogZXhwZWN0ZWQgPiAwLCByZWNlaXZlZCA9ICIgKyBldmVudENvdW50LAotICAgICAgICBldmVudENvdW50ID4gMCk7Ci0KLSAgICBQc2V1ZG9yYW5nZVBvc2l0aW9uVmVsb2NpdHlGcm9tUmVhbFRpbWVFdmVudHMgbVBzZXVkb3JhbmdlUG9zaXRpb25Gcm9tUmVhbFRpbWVFdmVudHMKLSAgICAgICAgPSBuZXcgUHNldWRvcmFuZ2VQb3NpdGlvblZlbG9jaXR5RnJvbVJlYWxUaW1lRXZlbnRzKCk7Ci0gICAgbVBzZXVkb3JhbmdlUG9zaXRpb25Gcm9tUmVhbFRpbWVFdmVudHMuc2V0UmVmZXJlbmNlUG9zaXRpb24oCi0gICAgICAgIChpbnQpIChsb2NhdGlvbkZyb21BcGkuZ2V0TGF0aXR1ZGUoKSAqIDFFNyksCi0gICAgICAgIChpbnQpIChsb2NhdGlvbkZyb21BcGkuZ2V0TG9uZ2l0dWRlKCkgKiAxRTcpLAotICAgICAgICAoaW50KSAobG9jYXRpb25Gcm9tQXBpLmdldEFsdGl0dWRlKCkgICogMUU3KSk7Ci0KLSAgICBMb2cuaShUQUcsICJMb2NhdGlvbiBmcm9tIExvY2F0aW9uIE1hbmFnZXIiCi0gICAgICAgICsgIiwgTGF0aXR1ZGU6IiArIGxvY2F0aW9uRnJvbUFwaS5nZXRMYXRpdHVkZSgpCi0gICAgICAgICsgIiwgTG9uZ2l0dWRlOiIgKyBsb2NhdGlvbkZyb21BcGkuZ2V0TG9uZ2l0dWRlKCkKLSAgICAgICAgKyAiLCBBbHRpdHVkZToiICsgbG9jYXRpb25Gcm9tQXBpLmdldEFsdGl0dWRlKCkpOwotCi0KLSAgICBpbnQgdG90YWxDYWxjdWxhdGVkTG9jYXRpb25DbnQgPSAwOwotICAgIGZvcihHbnNzTWVhc3VyZW1lbnRzRXZlbnQgZXZlbnQgOiBldmVudHMpewotICAgICAgLy8gSW4gbU1lYXN1cmVtZW50TGlzdGVuZXIuZ2V0RXZlbnRzKCkgd2UgYWxyZWFkeSBmaWx0ZXJlZCBvdXQgZXZlbnRzLCBhdCB0aGlzIHBvaW50IGV2ZXJ5Ci0gICAgICAvLyBldmVudCB3aWxsIGhhdmUgYXQgbGVhc3QgNCBzYXRlbGxpdGVzIGluIG9uZSBjb25zdGVsbGF0aW9uLgotICAgICAgbVBzZXVkb3JhbmdlUG9zaXRpb25Gcm9tUmVhbFRpbWVFdmVudHMuY29tcHV0ZVBvc2l0aW9uVmVsb2NpdHlTb2x1dGlvbnNGcm9tUmF3TWVhcyhldmVudCk7Ci0gICAgICBkb3VibGVbXSBjYWxjdWxhdGVkTG9jYXRpb24gPQotICAgICAgICAgIG1Qc2V1ZG9yYW5nZVBvc2l0aW9uRnJvbVJlYWxUaW1lRXZlbnRzLmdldFBvc2l0aW9uU29sdXRpb25MYXRMbmdEZWcoKTsKLSAgICAgIC8vIGl0IHdpbGwgcmV0dXJuIE5hTiB3aGVuIHRoZXJlIGlzIG5vIGVub3VnaCBtZWFzdXJlbWVudHMgdG8gY2FsY3VsYXRlIHRoZSBwb3NpdGlvbgotICAgICAgaWYgKERvdWJsZS5pc05hTihjYWxjdWxhdGVkTG9jYXRpb25bMF0pKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIHRvdGFsQ2FsY3VsYXRlZExvY2F0aW9uQ250ICsrOwotICAgICAgICBMb2cuaShUQUcsICJDYWxjdWxhdGVkIExvY2F0aW9uIgotICAgICAgICAgICAgKyAiLCBMYXRpdHVkZToiICsgY2FsY3VsYXRlZExvY2F0aW9uWzBdCi0gICAgICAgICAgICArICIsIExvbmdpdHVkZToiICsgY2FsY3VsYXRlZExvY2F0aW9uWzFdCi0gICAgICAgICAgICArICIsIEFsdGl0dWRlOiIgKyBjYWxjdWxhdGVkTG9jYXRpb25bMl0pOwotCi0gICAgICAgIGFzc2VydFRydWUoIkxhdGl0dWRlIHNob3VsZCBiZSBjbG9zZSB0byAiICsgbG9jYXRpb25Gcm9tQXBpLmdldExhdGl0dWRlKCksCi0gICAgICAgICAgICBNYXRoLmFicyhjYWxjdWxhdGVkTG9jYXRpb25bMF0gLSBsb2NhdGlvbkZyb21BcGkuZ2V0TGF0aXR1ZGUoKSkKLSAgICAgICAgICAgICAgICA8IFBPU0lUSU9OX1RIUkVTSE9MRF9JTl9ERUdSRUVTKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiTG9uZ2l0dWRlIHNob3VsZCBiZSBjbG9zZSB0byIgKyBsb2NhdGlvbkZyb21BcGkuZ2V0TG9uZ2l0dWRlKCksCi0gICAgICAgICAgICBNYXRoLmFicyhjYWxjdWxhdGVkTG9jYXRpb25bMV0gLSBsb2NhdGlvbkZyb21BcGkuZ2V0TG9uZ2l0dWRlKCkpCi0gICAgICAgICAgICAgICAgPCBQT1NJVElPTl9USFJFU0hPTERfSU5fREVHUkVFUyk7Ci0gICAgICAgIC8vVE9ETzogQ2hlY2sgZm9yIHRoZSBhbHRpdHVkZSBhbmQgcG9zaXRpb24gdW5jZXJ0YWludHkuCi0gICAgICB9Ci0gICAgfQotICAgIGFzc2VydFRydWUoIkNhbGN1bGF0ZWQgTG9jYXRpb24gQ291bnQgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiAwLiIsCi0gICAgICAgIHRvdGFsQ2FsY3VsYXRlZExvY2F0aW9uQ250ID4gMCk7Ci0gIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2xvY2F0aW9uL3NyYy9hbmRyb2lkL2xvY2F0aW9uL2N0cy9HbnNzU3RhdHVzVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvbG9jYXRpb24vc3JjL2FuZHJvaWQvbG9jYXRpb24vY3RzL0duc3NTdGF0dXNUZXN0LmphdmEKaW5kZXggZmEzNTQzOC4uMDdhYTA4MyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbG9jYXRpb24vc3JjL2FuZHJvaWQvbG9jYXRpb24vY3RzL0duc3NTdGF0dXNUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvbG9jYXRpb24vc3JjL2FuZHJvaWQvbG9jYXRpb24vY3RzL0duc3NTdGF0dXNUZXN0LmphdmEKQEAgLTMsNiArMyw4IEBACiBpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5HbnNzU3RhdHVzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNkZFRlc3Q7CisKIHB1YmxpYyBjbGFzcyBHbnNzU3RhdHVzVGVzdCBleHRlbmRzIEduc3NUZXN0Q2FzZSAgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJHbnNzU3RhdHVzVGVzdCI7CkBAIC01Niw2ICs1OCw3IEBACiAgIC8qKgogICAgKiBUZXN0cyB2YWx1ZXMgb2Yge0BsaW5rIEduc3NTdGF0dXN9LgogICAgKi8KKyAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuMy4zL0MtMS00IikKICAgcHVibGljIHZvaWQgdGVzdEduc3NTdGF0dXNWYWx1ZXMoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewogICAgIC8vIENoZWNrcyBpZiBHUFMgaGFyZHdhcmUgZmVhdHVyZSBpcyBwcmVzZW50LCBza2lwcyB0ZXN0IChwYXNzKSBpZiBub3QsCiAgICAgLy8gYW5kIGhhcmQgYXNzZXJ0cyB0aGF0IExvY2F0aW9uL0dQUyAoUHJvdmlkZXIpIGlzIHR1cm5lZCBvbiBpZiBpcyBDdHMgVmVyaWZpZXIuCkBAIC03Nyw3ICs4MCw3IEBACiAgICAqIEBwYXJhbSBzdGF0dXMsIEduc3NTdGF0dXMKICAgICogQHBhcmFtIHNvZnRBc3NlcnQsIGN1c3RvbWl6ZWQgYXNzZXJ0IGNsYXNzLgogICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlR25zc1N0YXR1cyhHbnNzU3RhdHVzIHN0YXR1cywgU29mdEFzc2VydCBzb2Z0QXNzZXJ0KSB7CisgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUduc3NTdGF0dXMoR25zc1N0YXR1cyBzdGF0dXMsIFNvZnRBc3NlcnQgc29mdEFzc2VydCkgewogICAgIGludCBzQ291bnQgPSBzdGF0dXMuZ2V0U2F0ZWxsaXRlQ291bnQoKTsKICAgICBMb2cuaShUQUcsICJUb3RhbCBzYXRlbGxpdGU6IiArIHNDb3VudCk7CiAgICAgLy8gdG90YWwgbnVtYmVyIG9mIHNhdGVsbGl0ZXMgZm9yIGFsbCBjb25zdGVsbGF0aW9uIGlzIGxlc3MgdGhhbiAyMDAKQEAgLTg3LDE2ICs5MCwxMiBAQAogICAgICAgICAgICIwLjAgPD0gWCA8PSAzNjAuMCIsCiAgICAgICAgICAgU3RyaW5nLnZhbHVlT2Yoc3RhdHVzLmdldEF6aW11dGhEZWdyZWVzKGkpKSwKICAgICAgICAgICBzdGF0dXMuZ2V0QXppbXV0aERlZ3JlZXMoaSkgPj0gMC4wICYmIHN0YXR1cy5nZXRBemltdXRoRGVncmVlcyhpKSA8PSAzNjAuMCk7Ci0KLSAgICAgIGlmIChzdGF0dXMuaGFzQ2FycmllckZyZXF1ZW5jeUh6KGkpKSB7Ci0gICAgICAgIHNvZnRBc3NlcnQuYXNzZXJ0VHJ1ZSgiY2Fycmllcl9mcmVxdWVuY3lfaHo6IENhcnJpZXIgZnJlcXVlbmN5IGluIGh6IiwKLSAgICAgICAgICAgICJYID4gMC4wIiwKLSAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKHN0YXR1cy5nZXRDYXJyaWVyRnJlcXVlbmN5SHooaSkpLAotICAgICAgICAgICAgc3RhdHVzLmdldENhcnJpZXJGcmVxdWVuY3lIeihpKSA+IDAuMCk7Ci0gICAgICB9CisgICAgICBUZXN0TWVhc3VyZW1lbnRVdGlsLnZlcmlmeUduc3NDYXJyaWVyRnJlcXVlbmN5KHNvZnRBc3NlcnQsIG1UZXN0TG9jYXRpb25NYW5hZ2VyLAorICAgICAgICAgIHN0YXR1cy5oYXNDYXJyaWVyRnJlcXVlbmN5SHooaSksCisgICAgICAgICAgc3RhdHVzLmhhc0NhcnJpZXJGcmVxdWVuY3lIeihpKSA/IHN0YXR1cy5nZXRDYXJyaWVyRnJlcXVlbmN5SHooaSkgOiAwRik7CiAKICAgICAgIHNvZnRBc3NlcnQuYXNzZXJ0VHJ1ZSgiY19uMF9kYmh6OiBDYXJyaWVyLXRvLW5vaXNlIGRlbnNpdHkiLAotICAgICAgICAgICIwLjAgPj0gWCA8PSA2MyIsCisgICAgICAgICAgIjAuMCA8PSBYIDw9IDYzIiwKICAgICAgICAgICBTdHJpbmcudmFsdWVPZihzdGF0dXMuZ2V0Q24wRGJIeihpKSksCiAgICAgICAgICAgc3RhdHVzLmdldENuMERiSHooaSkgPj0gMC4wICYmCiAgICAgICAgICAgICAgIHN0YXR1cy5nZXRDbjBEYkh6KGkpIDw9IDYzLjApOwpAQCAtMTExLDcgKzExMCw3IEBACiAgICAgICBUZXN0TWVhc3VyZW1lbnRVdGlsLnZhbGlkYXRlU3ZpZFN1Yihzb2Z0QXNzZXJ0LCBudWxsLAogICAgICAgICAgIHN0YXR1cy5nZXRDb25zdGVsbGF0aW9uVHlwZShpKSxzdGF0dXMuZ2V0U3ZpZChpKSk7CiAKLSAgICAgIC8vIEZvciB0aG9zZSBmdW5jdGlvbiB3aXRoIGJvb2xlYW4gdHlwZSByZXR1cm4sIGp1c3Qgc2ltcGxseSBjYWxsIHRoZSBmdW5jdGlvbgorICAgICAgLy8gRm9yIHRob3NlIGZ1bmN0aW9uIHdpdGggYm9vbGVhbiB0eXBlIHJldHVybiwganVzdCBzaW1wbHkgY2FsbCB0aGUgZnVuY3Rpb24KICAgICAgIC8vIHRvIG1ha2Ugc3VyZSB0aG9zZSBmdW5jdGlvbiB3b24ndCBjcmFzaCwgYWxzbyBpbmNyZWFzZSB0aGUgdGVzdCBjb3ZlcmFnZS4KICAgICAgIExvZy5pKFRBRywgImhhc0FsbWFuYWNEYXRhOiAiICsgc3RhdHVzLmhhc0FsbWFuYWNEYXRhKGkpKTsKICAgICAgIExvZy5pKFRBRywgImhhc0VwaGVtZXJpc0RhdGE6ICIgKyBzdGF0dXMuaGFzRXBoZW1lcmlzRGF0YShpKSk7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9sb2NhdGlvbi9zcmMvYW5kcm9pZC9sb2NhdGlvbi9jdHMvR25zc1Rlc3RDYXNlLmphdmEgYi90ZXN0cy90ZXN0cy9sb2NhdGlvbi9zcmMvYW5kcm9pZC9sb2NhdGlvbi9jdHMvR25zc1Rlc3RDYXNlLmphdmEKaW5kZXggMDI1ODI0NC4uNWQ3ODc5NSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbG9jYXRpb24vc3JjL2FuZHJvaWQvbG9jYXRpb24vY3RzL0duc3NUZXN0Q2FzZS5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2xvY2F0aW9uL3NyYy9hbmRyb2lkL2xvY2F0aW9uL2N0cy9HbnNzVGVzdENhc2UuamF2YQpAQCAtMTYsNyArMTYsNiBAQAogcGFja2FnZSBhbmRyb2lkLmxvY2F0aW9uLmN0czsKIAogaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogLyoqCiAgKiBCYXNlIFRlc3QgQ2FzZSBjbGFzcyBmb3IgYWxsIEduc3MgVGVzdHMuCkBAIC0zMiwxNCArMzEsMTAgQEAKICAgICBwcm90ZWN0ZWQgR25zc1Rlc3RDYXNlKCkgewogICAgIH0KIAotICAgIC8vIFdoZW4gQ1RTIHRlc3RpbmcgaXMgcnVuIGluIFZlcmlmaWVyIG1vZGUgYWNjZXNzIHRvIEdOU1Mgc2lnbmFscyBpcyBleHBlY3RlZAogICAgIC8vIE9uIGRldmljZXMgdXNpbmcgbmV3ZXIgaGFyZHdhcmUsIEdOU1MgbWVhc3VyZW1lbnQgc3VwcG9ydCBpcyByZXF1aXJlZC4KLSAgICAvLyBIZW5jZSB3aGVuIGJvdGggY29uZGl0aW9ucyBhcmUgdHJ1ZSwgd2UgY2FuIHZlcmlmeSBzdHJpY3RlciB0ZXN0cyBvZiBmdW5jdGlvbmFsaXR5Ci0gICAgLy8gYXZhaWxhYmlsaXR5LgogICAgIHByb3RlY3RlZCBib29sZWFuIGlzTWVhc3VyZW1lbnRUZXN0U3RyaWN0KCkgewotICAgICAgICByZXR1cm4gKChtVGVzdExvY2F0aW9uTWFuYWdlci5nZXRMb2NhdGlvbk1hbmFnZXIoKS5nZXRHbnNzWWVhck9mSGFyZHdhcmUoKSA+PQotICAgICAgICAgICAgICAgICBNSU5fSEFSRFdBUkVfWUVBUl9NRUFTVVJFTUVOVFNfUkVRVUlSRUQpICYmCi0gICAgICAgICAgICAgICAgaXNDdHNWZXJpZmllclRlc3QoKSk7CisgICAgICAgIHJldHVybiAobVRlc3RMb2NhdGlvbk1hbmFnZXIuZ2V0TG9jYXRpb25NYW5hZ2VyKCkuZ2V0R25zc1llYXJPZkhhcmR3YXJlKCkgPj0KKyAgICAgICAgICAgICAgICBNSU5fSEFSRFdBUkVfWUVBUl9NRUFTVVJFTUVOVFNfUkVRVUlSRUQpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHNldFRlc3RBc0N0c1ZlcmlmaWVyVGVzdChib29sZWFuIHZhbHVlKSB7CkBAIC00OSw0ICs0NCw0IEBACiAgICAgcHVibGljIGJvb2xlYW4gaXNDdHNWZXJpZmllclRlc3QoKSB7CiAgICAgICAgIHJldHVybiBtQ3RzVmVyaWZpZXJUZXN0OwogICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9sb2NhdGlvbi9zcmMvYW5kcm9pZC9sb2NhdGlvbi9jdHMvR25zc1R0ZmZUZXN0cy5qYXZhIGIvdGVzdHMvdGVzdHMvbG9jYXRpb24vc3JjL2FuZHJvaWQvbG9jYXRpb24vY3RzL0duc3NUdGZmVGVzdHMuamF2YQppbmRleCAzMzVkZTA3Li5hZjBlMDI1IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9sb2NhdGlvbi9zcmMvYW5kcm9pZC9sb2NhdGlvbi9jdHMvR25zc1R0ZmZUZXN0cy5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2xvY2F0aW9uL3NyYy9hbmRyb2lkL2xvY2F0aW9uL2N0cy9HbnNzVHRmZlRlc3RzLmphdmEKQEAgLTg2LDEyICs4NiwxMiBAQAogICAgKi8KICAgcHJpdmF0ZSB2b2lkIGVuc3VyZU5ldHdvcmtTdGF0dXMoKXsKICAgICBhc3NlcnRUcnVlKCJEZXZpY2UgaGFzIHRvIGNvbm5lY3QgdG8gV2lmaSBvciBDZWxsdWxhciB0byBjb21wbGV0ZSB0aGlzIHRlc3QuIiwKLSAgICAgICAgaXNDb25uZWN0ZWRUb1dpZmlPckNlbGx1bGFyKGdldENvbnRleHQoKSkpOworICAgICAgICBUZXN0VXRpbHMuaXNDb25uZWN0ZWRUb1dpZmlPckNlbGx1bGFyKGdldENvbnRleHQoKSkpOwogCiAgIH0KIAogICBwcml2YXRlIGJvb2xlYW4gaGFzQ2VsbHVsYXJEYXRhKCkgewotICAgIENvbm5lY3Rpdml0eU1hbmFnZXIgY29ubk1hbmFnZXIgPSBnZXRDb25uZWN0aXZpdHlNYW5hZ2VyKGdldENvbnRleHQoKSk7CisgICAgQ29ubmVjdGl2aXR5TWFuYWdlciBjb25uTWFuYWdlciA9IFRlc3RVdGlscy5nZXRDb25uZWN0aXZpdHlNYW5hZ2VyKGdldENvbnRleHQoKSk7CiAgICAgTmV0d29ya0luZm8gY2VsbHVsYXJOZXR3b3JrSW5mbyA9IGNvbm5NYW5hZ2VyLmdldE5ldHdvcmtJbmZvKENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9NT0JJTEUpOwogICAgIC8vIGNoZWNrIHdoZXRoZXIgdGhlIGNlbGx1bGFyIGRhdGEgaXMgT04gaWYgdGhlIGRldmljZSBoYXMgY2VsbHVsYXIgY2FwYWJpbGl0eQogICAgIGlmIChjZWxsdWxhck5ldHdvcmtJbmZvID09IG51bGwpIHsKQEAgLTE0Myw0NCArMTQzLDQgQEAKICAgICBzb2Z0QXNzZXJ0LmFzc2VydFRydWUoIlRlc3QgY2FzZTogIiArIHRlc3ROYW1lICsiLCBUVEZGIHNob3VsZCBiZSBsZXNzIHRoYW4gIiArIHRocmVzaG9sZAogICAgICAgICArICIgLiBJbiBjdXJyZW50IHRlc3QsIFRURkYgdmFsdWUgaXM6ICIgKyB0dGZmVGltZU1pbGxpcywgdHRmZlRpbWVNaWxsaXMgPCB0aHJlc2hvbGQpOwogICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgd2hldGhlciB0aGUgZGV2aWNlIGlzIGN1cnJlbnRseSBjb25uZWN0ZWQgdG8gYSB3aWZpIG9yIGNlbGx1bGFyLgotICAgKgotICAgKiBAcGFyYW0gY29udGV4dCB7QGxpbmsgQ29udGV4dH0gb2JqZWN0Ci0gICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGNvbm5lY3RlZCB0byBXaWZpIG9yIENlbGx1bGFyOyB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ29ubmVjdGVkVG9XaWZpT3JDZWxsdWxhcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICBOZXR3b3JrSW5mbyBpbmZvID0gZ2V0QWN0aXZlTmV0d29ya0luZm8oY29udGV4dCk7Ci0gICAgcmV0dXJuIGluZm8gIT0gbnVsbAotICAgICAgICAmJiBpbmZvLmlzQ29ubmVjdGVkKCkKLSAgICAgICAgJiYgKGluZm8uZ2V0VHlwZSgpID09IENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9XSUZJCi0gICAgICAgICAgICAgICAgIHx8IGluZm8uZ2V0VHlwZSgpID09IENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9NT0JJTEUpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIGFjdGl2ZSBuZXR3b3JrIGluZm8uCi0gICAqCi0gICAqIEBwYXJhbSBjb250ZXh0IHtAbGluayBDb250ZXh0fSBvYmplY3QKLSAgICogQHJldHVybiB7QGxpbmsgTmV0d29ya0luZm99Ci0gICAqLwotICBwcml2YXRlIHN0YXRpYyBOZXR3b3JrSW5mbyBnZXRBY3RpdmVOZXR3b3JrSW5mbyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICBDb25uZWN0aXZpdHlNYW5hZ2VyIGNtID0gZ2V0Q29ubmVjdGl2aXR5TWFuYWdlcihjb250ZXh0KTsKLSAgICBpZiAoY20gIT0gbnVsbCkgewotICAgICAgcmV0dXJuIGNtLmdldEFjdGl2ZU5ldHdvcmtJbmZvKCk7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIGNvbm5lY3Rpdml0eSBtYW5hZ2VyLgotICAgKgotICAgKiBAcGFyYW0gY29udGV4dCB7QGxpbmsgQ29udGV4dH0gb2JqZWN0Ci0gICAqIEByZXR1cm4ge0BsaW5rIENvbm5lY3Rpdml0eU1hbmFnZXJ9Ci0gICAqLwotICBwcml2YXRlIHN0YXRpYyBDb25uZWN0aXZpdHlNYW5hZ2VyIGdldENvbm5lY3Rpdml0eU1hbmFnZXIoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgcmV0dXJuIChDb25uZWN0aXZpdHlNYW5hZ2VyKSBjb250ZXh0LmdldEFwcGxpY2F0aW9uQ29udGV4dCgpCi0gICAgICAgIC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQ09OTkVDVElWSVRZX1NFUlZJQ0UpOwotICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9sb2NhdGlvbi9zcmMvYW5kcm9pZC9sb2NhdGlvbi9jdHMvTG9jYXRpb25NYW5hZ2VyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvbG9jYXRpb24vc3JjL2FuZHJvaWQvbG9jYXRpb24vY3RzL0xvY2F0aW9uTWFuYWdlclRlc3QuamF2YQppbmRleCAzYWYyMTNlLi4wMzY2MTU4IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9sb2NhdGlvbi9zcmMvYW5kcm9pZC9sb2NhdGlvbi9jdHMvTG9jYXRpb25NYW5hZ2VyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2xvY2F0aW9uL3NyYy9hbmRyb2lkL2xvY2F0aW9uL2N0cy9Mb2NhdGlvbk1hbmFnZXJUZXN0LmphdmEKQEAgLTM4LDggKzM4LDExIEBACiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOwogaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC5vcy5Vc2VyTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKIGltcG9ydCBhbmRyb2lkLnRlc3QuVWlUaHJlYWRUZXN0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIApAQCAtNTEsNiArNTQsOSBAQAogICogYW5kcm9pZC5wZXJtaXNzaW9uLkFDQ0VTU19MT0NBVElPTl9FWFRSQV9DT01NQU5EUyB0byBzZW5kIGV4dHJhIGNvbW1hbmRzIHRvIEdQUyBwcm92aWRlcgogICovCiBwdWJsaWMgY2xhc3MgTG9jYXRpb25NYW5hZ2VyVGVzdCBleHRlbmRzIEJhc2VNb2NrTG9jYXRpb25UZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTG9jYXRpb25NYW5hZ2VyVGVzdCI7CisKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFRFU1RfVElNRV9PVVQgPSA1MDAwOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfTU9DS19QUk9WSURFUl9OQU1FID0gInRlc3RfcHJvdmlkZXIiOwpAQCAtMTA0Niw2ICsxMDUyLDcgQEAKICAgICAgICAgbU1hbmFnZXIudW5yZWdpc3Rlckduc3NTdGF0dXNDYWxsYmFjayhjYWxsYmFjayk7CiAgICAgfQogCisgICAgQEFwcE1vZGVGdWxsKHJlYXNvbiA9ICJSZXF1aXJlcyB1c2Ugb2YgZXh0cmEgTG9jYXRpb25NYW5hZ2VyIGNvbW1hbmRzIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZEV4dHJhQ29tbWFuZCgpIHsKICAgICAgICAgLy8gdGhpcyB0ZXN0IGFzc3VtZXMgVEVTVF9NT0NLX1BST1ZJREVSX05BTUUgd2FzIGNyZWF0ZWQgaW4gc2V0VXAuCiAgICAgICAgIGFzc2VydE5vdE51bGwobU1hbmFnZXIuZ2V0UHJvdmlkZXIoVEVTVF9NT0NLX1BST1ZJREVSX05BTUUpKTsKQEAgLTEwOTQsNiArMTEwMSwxMCBAQAogICAgICAqIFRlc3RzIGJhc2ljIHByb3hpbWl0eSBhbGVydCB3aGVuIGVudGVyaW5nIHByb3hpbWl0eQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHRlc3RFbnRlclByb3hpbWl0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIWlzU3lzdGVtVXNlcigpKSB7CisgICAgICAgICAgICBMb2cuaShUQUcsICJTa2lwcGluZyB0ZXN0IG9uIHNlY29uZGFyeSB1c2VyIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KICAgICAgICAgLy8gbmVlZCB0byBtb2NrIHRoZSBmdXNlZCBsb2NhdGlvbiBwcm92aWRlciBmb3IgcHJveGltaXR5IHRlc3RzCiAgICAgICAgIG1vY2tGdXNlZExvY2F0aW9uKCk7CiAKQEAgLTExMDYsNiArMTExNywxMCBAQAogICAgICAqIFRlc3RzIHByb3hpbWl0eSBhbGVydCB3aGVuIGVudGVyaW5nIHByb3hpbWl0eSwgd2l0aCBubyBleHBpcmF0aW9uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdGVzdEVudGVyUHJveGltaXR5X25vZXhwaXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghaXNTeXN0ZW1Vc2VyKCkpIHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgIlNraXBwaW5nIHRlc3Qgb24gc2Vjb25kYXJ5IHVzZXIiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogICAgICAgICAvLyBuZWVkIHRvIG1vY2sgdGhlIGZ1c2VkIGxvY2F0aW9uIHByb3ZpZGVyIGZvciBwcm94aW1pdHkgdGVzdHMKICAgICAgICAgbW9ja0Z1c2VkTG9jYXRpb24oKTsKIApAQCAtMTExOCw2ICsxMTMzLDEwIEBACiAgICAgICogVGVzdHMgYmFzaWMgcHJveGltaXR5IGFsZXJ0IHdoZW4gZXhpdGluZyBwcm94aW1pdHkKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB0ZXN0RXhpdFByb3hpbWl0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIWlzU3lzdGVtVXNlcigpKSB7CisgICAgICAgICAgICBMb2cuaShUQUcsICJTa2lwcGluZyB0ZXN0IG9uIHNlY29uZGFyeSB1c2VyIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KICAgICAgICAgLy8gbmVlZCB0byBtb2NrIHRoZSBmdXNlZCBsb2NhdGlvbiBwcm92aWRlciBmb3IgcHJveGltaXR5IHRlc3RzCiAgICAgICAgIG1vY2tGdXNlZExvY2F0aW9uKCk7CiAKQEAgLTExMzcsNiArMTE1NiwxMCBAQAogICAgICAqIFRlc3RzIGJhc2ljIHByb3hpbWl0eSBhbGVydCB3aGVuIGluaXRpYWxseSB3aXRoaW4gcHJveGltaXR5CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdGVzdEluaXRpYWxseVdpdGhpblByb3hpbWl0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIWlzU3lzdGVtVXNlcigpKSB7CisgICAgICAgICAgICBMb2cuaShUQUcsICJTa2lwcGluZyB0ZXN0IG9uIHNlY29uZGFyeSB1c2VyIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KICAgICAgICAgLy8gbmVlZCB0byBtb2NrIHRoZSBmdXNlZCBsb2NhdGlvbiBwcm92aWRlciBmb3IgcHJveGltaXR5IHRlc3RzCiAgICAgICAgIG1vY2tGdXNlZExvY2F0aW9uKCk7CiAKQEAgLTE1MjMsNCArMTU0Niw5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNTeXN0ZW1Vc2VyKCkgeworICAgICAgICBVc2VyTWFuYWdlciB1c2VyTWFuYWdlciA9IG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoVXNlck1hbmFnZXIuY2xhc3MpOworICAgICAgICByZXR1cm4gdXNlck1hbmFnZXIuaXNTeXN0ZW1Vc2VyKCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbG9jYXRpb24vc3JjL2FuZHJvaWQvbG9jYXRpb24vY3RzL0xvY2F0aW9uVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvbG9jYXRpb24vc3JjL2FuZHJvaWQvbG9jYXRpb24vY3RzL0xvY2F0aW9uVGVzdC5qYXZhCmluZGV4IDNlMjkxY2YuLmU3Y2FkZjIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2xvY2F0aW9uL3NyYy9hbmRyb2lkL2xvY2F0aW9uL2N0cy9Mb2NhdGlvblRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9sb2NhdGlvbi9zcmMvYW5kcm9pZC9sb2NhdGlvbi9jdHMvTG9jYXRpb25UZXN0LmphdmEKQEAgLTQ2OSw2ICs0NjksOCBAQAogICAgICAgICBwYXJjZWwuc2V0RGF0YVBvc2l0aW9uKDApOwogICAgICAgICBMb2NhdGlvbiBuZXdMb2NhdGlvbiA9IExvY2F0aW9uLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChwYXJjZWwpOwogICAgICAgICBhc3NlcnRUZXN0TG9jYXRpb24obmV3TG9jYXRpb24pOworCisgICAgICAgIHBhcmNlbC5yZWN5Y2xlKCk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdFNldHRpbmdJbmplY3RvclNlcnZpY2UoKSB7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9sb2NhdGlvbi9zcmMvYW5kcm9pZC9sb2NhdGlvbi9jdHMvTW1zUGR1UHJvdmlkZXIuamF2YSBiL3Rlc3RzL3Rlc3RzL2xvY2F0aW9uL3NyYy9hbmRyb2lkL2xvY2F0aW9uL2N0cy9NbXNQZHVQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ZDg1OWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9sb2NhdGlvbi9zcmMvYW5kcm9pZC9sb2NhdGlvbi9jdHMvTW1zUGR1UHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmxvY2F0aW9uLmN0czsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3I7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKKworLyoqCisgKiBBIHNpbXBsZSBwcm92aWRlciB0byBzZW5kIE1NUyBQRFUgdG8gcGxhdGZvcm0gTU1TIHNlcnZpY2UKKyAqLworcHVibGljIGNsYXNzIE1tc1BkdVByb3ZpZGVyIGV4dGVuZHMgQ29udGVudFByb3ZpZGVyIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEN1cnNvciBxdWVyeShVcmkgdXJpLCBTdHJpbmdbXSBwcm9qZWN0aW9uLCBTdHJpbmcgc2VsZWN0aW9uLCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzLAorICAgICAgICAgICAgU3RyaW5nIHNvcnRPcmRlcikgeworICAgICAgICAvLyBOb3Qgc3VwcG9ydGVkCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZShVcmkgdXJpKSB7CisgICAgICAgIC8vIE5vdCBzdXBwb3J0ZWQKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFVyaSBpbnNlcnQoVXJpIHVyaSwgQ29udGVudFZhbHVlcyB2YWx1ZXMpIHsKKyAgICAgICAgLy8gTm90IHN1cHBvcnRlZAorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGRlbGV0ZShVcmkgdXJpLCBTdHJpbmcgc2VsZWN0aW9uLCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzKSB7CisgICAgICAgIC8vIE5vdCBzdXBwb3J0ZWQKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCB1cGRhdGUoVXJpIHVyaSwgQ29udGVudFZhbHVlcyB2YWx1ZXMsIFN0cmluZyBzZWxlY3Rpb24sIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MpIHsKKyAgICAgICAgLy8gTm90IHN1cHBvcnRlZAorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUGFyY2VsRmlsZURlc2NyaXB0b3Igb3BlbkZpbGUoVXJpIHVyaSwgU3RyaW5nIGZpbGVNb2RlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoZ2V0Q29udGV4dCgpLmdldENhY2hlRGlyKCksIHVyaS5nZXRQYXRoKCkpOworICAgICAgICBpbnQgbW9kZSA9IChUZXh0VXRpbHMuZXF1YWxzKGZpbGVNb2RlLCAiciIpID8gUGFyY2VsRmlsZURlc2NyaXB0b3IuTU9ERV9SRUFEX09OTFkgOgorICAgICAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yLk1PREVfV1JJVEVfT05MWQorICAgICAgICAgICAgICAgICAgICAgICAgfFBhcmNlbEZpbGVEZXNjcmlwdG9yLk1PREVfVFJVTkNBVEUKKyAgICAgICAgICAgICAgICAgICAgICAgIHxQYXJjZWxGaWxlRGVzY3JpcHRvci5NT0RFX0NSRUFURSk7CisgICAgICAgIHJldHVybiBQYXJjZWxGaWxlRGVzY3JpcHRvci5vcGVuKGZpbGUsIG1vZGUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2xvY2F0aW9uL3NyYy9hbmRyb2lkL2xvY2F0aW9uL2N0cy9UZXN0R25zc01lYXN1cmVtZW50TGlzdGVuZXIuamF2YSBiL3Rlc3RzL3Rlc3RzL2xvY2F0aW9uL3NyYy9hbmRyb2lkL2xvY2F0aW9uL2N0cy9UZXN0R25zc01lYXN1cmVtZW50TGlzdGVuZXIuamF2YQppbmRleCAxYjhjM2MzLi44N2EzZjc3IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9sb2NhdGlvbi9zcmMvYW5kcm9pZC9sb2NhdGlvbi9jdHMvVGVzdEduc3NNZWFzdXJlbWVudExpc3RlbmVyLmphdmEKKysrIGIvdGVzdHMvdGVzdHMvbG9jYXRpb24vc3JjL2FuZHJvaWQvbG9jYXRpb24vY3RzL1Rlc3RHbnNzTWVhc3VyZW1lbnRMaXN0ZW5lci5qYXZhCkBAIC0yNSw3ICsyNSw2IEBACiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiAKIC8qKgogICogVXNlZCBmb3IgcmVjZWl2aW5nIEdQUyBzYXRlbGxpdGUgbWVhc3VyZW1lbnRzIGZyb20gdGhlIEdQUyBlbmdpbmUuCkBAIC0zOCw4ICszNyw3IEBACiAgICAgcHJpdmF0ZSBib29sZWFuIGZpbHRlckJ5RXZlbnRTaXplID0gZmFsc2U7CiAgICAgLy8gVGltZW91dCBpbiBzZWMgZm9yIGNvdW50IGRvd24gbGF0Y2ggd2FpdAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfVElNRU9VVF9JTl9TRUMgPSAxMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVBU19USU1FT1VUX0lOX1NFQyA9IDYwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT1dfREVDT0RFRF9NRUFTVVJFTUVOVF9TVEFURV9CSVQgPSAzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRUFTX1RJTUVPVVRfSU5fU0VDID0gNzU7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENfVE9fTjBfVEhSRVNIT0xEX0RCX0haID0gMTg7CiAgICAgcHJpdmF0ZSB2b2xhdGlsZSBpbnQgbVN0YXR1cyA9IC0xOwogCkBAIC04OSwxNSArODcsMTUgQEAKICAgICAgICAgICAgICAgICBIYXNoTWFwPEludGVnZXIsIEludGVnZXI+IGNvbnN0ZWxsYXRpb25FdmVudENvdW50ID0gbmV3IEhhc2hNYXA8PigpOwogICAgICAgICAgICAgICAgIEduc3NDbG9jayBnbnNzQ2xvY2sgPSBldmVudC5nZXRDbG9jaygpOwogICAgICAgICAgICAgICAgIGlmICghZ25zc0Nsb2NrLmhhc0Z1bGxCaWFzTmFub3MoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBJZiBkZXZpY2VzIGRvZXMgbm90IGhhdmUgRnVsbEJpYXNOYW5vcyB5ZXQsIGl0IHdpbGwgYmUgZGlmZmljdWx0IHRvIGNoZWNrIHRoZSBxdWFsaXR5LCBzbyBhd2FpdCAKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBmbGFnIGFzIHdlbGwuCisgICAgICAgICAgICAgICAgICAgIC8vIElmIGRldmljZXMgZG9lcyBub3QgaGF2ZSBGdWxsQmlhc05hbm9zIHlldCwgaXQgd2lsbCBiZSBkaWZmaWN1bHQgdG8gY2hlY2sKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHF1YWxpdHksIHNvIGF3YWl0IHRoaXMgZmxhZyBhcyB3ZWxsLgogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGZvciAoR25zc01lYXN1cmVtZW50IGduc3NNZWFzdXJlbWVudCA6IGV2ZW50LmdldE1lYXN1cmVtZW50cygpKXsKICAgICAgICAgICAgICAgICAgICAgaW50IGNvbnN0ZWxsYXRpb25UeXBlID0gZ25zc01lYXN1cmVtZW50LmdldENvbnN0ZWxsYXRpb25UeXBlKCk7CiAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBtZWFzdXJlbWVudCdzIHNpZ25hbCBsZXZlbCBpcyB0b28gc21hbGwgaWdub3JlCiAgICAgICAgICAgICAgICAgICAgIGlmIChnbnNzTWVhc3VyZW1lbnQuZ2V0Q24wRGJIeigpIDwgQ19UT19OMF9USFJFU0hPTERfREJfSFogfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIChnbnNzTWVhc3VyZW1lbnQuZ2V0U3RhdGUoKSAmICgxTCA8PCBUT1dfREVDT0RFRF9NRUFTVVJFTUVOVF9TVEFURV9CSVQpKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAoZ25zc01lYXN1cmVtZW50LmdldFN0YXRlKCkgJiBHbnNzTWVhc3VyZW1lbnQuU1RBVEVfVE9XX0RFQ09ERUQpID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlmIChjb25zdGVsbGF0aW9uRXZlbnRDb3VudC5jb250YWluc0tleShjb25zdGVsbGF0aW9uVHlwZSkpIHsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2xvY2F0aW9uL3NyYy9hbmRyb2lkL2xvY2F0aW9uL2N0cy9UZXN0R25zc1N0YXR1c0NhbGxiYWNrLmphdmEgYi90ZXN0cy90ZXN0cy9sb2NhdGlvbi9zcmMvYW5kcm9pZC9sb2NhdGlvbi9jdHMvVGVzdEduc3NTdGF0dXNDYWxsYmFjay5qYXZhCmluZGV4IDM4Yjc0OWYuLjc2Yzk0ZGEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2xvY2F0aW9uL3NyYy9hbmRyb2lkL2xvY2F0aW9uL2N0cy9UZXN0R25zc1N0YXR1c0NhbGxiYWNrLmphdmEKKysrIGIvdGVzdHMvdGVzdHMvbG9jYXRpb24vc3JjL2FuZHJvaWQvbG9jYXRpb24vY3RzL1Rlc3RHbnNzU3RhdHVzQ2FsbGJhY2suamF2YQpAQCAtMTksMTAgKzE5LDkgQEAKIGltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkduc3NTdGF0dXM7CiAKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKIAogLyoqCiAgKiBVc2VkIGZvciByZWNlaXZpbmcgbm90aWZpY2F0aW9ucyB3aGVuIEdOU1Mgc3RhdHVzIGhhcyBjaGFuZ2VkLgpAQCAtMzAsNyArMjksNiBAQAogY2xhc3MgVGVzdEduc3NTdGF0dXNDYWxsYmFjayBleHRlbmRzIEduc3NTdGF0dXMuQ2FsbGJhY2sgewogCiAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVRhZzsKLSAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gbUdwc1N0YXR1c1JlY2VpdmVkOwogICAgIHByaXZhdGUgR25zc1N0YXR1cyBtR25zc1N0YXR1cyA9IG51bGw7CiAgICAgLy8gVGltZW91dCBpbiBzZWMgZm9yIGNvdW50IGRvd24gbGF0Y2ggd2FpdAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUSU1FT1VUX0lOX1NFQyA9IDkwOwpAQCAtMzksOCArMzcsOCBAQAogICAgIHByaXZhdGUgZmluYWwgQ291bnREb3duTGF0Y2ggbUxhdGNoVHRmZjsKICAgICBwcml2YXRlIGZpbmFsIENvdW50RG93bkxhdGNoIG1MYXRjaFN0b3A7CiAKLSAgICAvLyBTdG9yZSBsaXN0IG9mIFBybiBmb3IgU2F0ZWxsaXRlcy4KLSAgICBwcml2YXRlIExpc3Q8TGlzdDxJbnRlZ2VyPj4gbUdwc1NhdGVsbGl0ZVBybnM7CisgICAgLy8gU3RvcmUgbGlzdCBvZiBTYXRlbGxpdGVzIGluY2x1ZGluZyBHbnNzIEJhbmQsIGNvbnN0ZWxsYXRpb24gJiBTdklkCisgICAgcHJpdmF0ZSBTZXQ8U3RyaW5nPiBtR25zc1VzZWRTdlN0cmluZ0lkczsKIAogICAgIFRlc3RHbnNzU3RhdHVzQ2FsbGJhY2soU3RyaW5nIHRhZywgaW50IGdwc1N0YXR1c0NvdW50VG9Db2xsZWN0KSB7CiAgICAgICAgIHRoaXMubVRhZyA9IHRhZzsKQEAgLTQ4LDcgKzQ2LDcgQEAKICAgICAgICAgbUxhdGNoU3RhdHVzID0gbmV3IENvdW50RG93bkxhdGNoKGdwc1N0YXR1c0NvdW50VG9Db2xsZWN0KTsKICAgICAgICAgbUxhdGNoVHRmZiA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKICAgICAgICAgbUxhdGNoU3RvcCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKLSAgICAgICAgbUdwc1NhdGVsbGl0ZVBybnMgPSBuZXcgQXJyYXlMaXN0PExpc3Q8SW50ZWdlcj4+KCk7CisgICAgICAgIG1HbnNzVXNlZFN2U3RyaW5nSWRzID0gbmV3IEhhc2hTZXQ8PigpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtNzMsMzIgKzcxLDM2IEBACiAgICAgcHVibGljIHZvaWQgb25TYXRlbGxpdGVTdGF0dXNDaGFuZ2VkKEduc3NTdGF0dXMgc3RhdHVzKSB7CiAgICAgICAgIExvZy5pKG1UYWcsICJHbnNzIFN0YXR1cyBMaXN0ZW5lciBSZWNlaXZlZCBTdGF0dXMgVXBkYXRlIik7CiAgICAgICAgIG1HbnNzU3RhdHVzID0gc3RhdHVzOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0YXR1cy5nZXRTYXRlbGxpdGVDb3VudCgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmICghc3RhdHVzLnVzZWRJbkZpeChpKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YXR1cy5oYXNDYXJyaWVyRnJlcXVlbmN5SHooaSkpIHsKKyAgICAgICAgICAgICAgICBtR25zc1VzZWRTdlN0cmluZ0lkcy5hZGQoCisgICAgICAgICAgICAgICAgICAgIFRlc3RNZWFzdXJlbWVudFV0aWwuZ2V0VW5pcXVlU3ZTdHJpbmdJZChzdGF0dXMuZ2V0Q29uc3RlbGxhdGlvblR5cGUoaSksCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZ2V0U3ZpZChpKSwgc3RhdHVzLmdldENhcnJpZXJGcmVxdWVuY3lIeihpKSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtR25zc1VzZWRTdlN0cmluZ0lkcy5hZGQoCisgICAgICAgICAgICAgICAgICAgIFRlc3RNZWFzdXJlbWVudFV0aWwuZ2V0VW5pcXVlU3ZTdHJpbmdJZChzdGF0dXMuZ2V0Q29uc3RlbGxhdGlvblR5cGUoaSksCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZ2V0U3ZpZChpKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIG1MYXRjaFN0YXR1cy5jb3VudERvd24oKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIFBSTnMgKHBzZXVkby1yYW5kb20gbnVtYmVyKSBmb3IgdGhlIHNhdGVsbGl0ZS4KKyAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIFNWIFN0cmluZyBJZHMgd2hpY2ggd2VyZSB1c2VkIGluIGZpeCBkdXJpbmcgdGhlIGNvbGxlY3QKICAgICAgKgotICAgICAqIEByZXR1cm4gbGlzdCBvZiBQUk5zIG51bWJlcgorICAgICAqIEByZXR1cm4gbUduc3NVc2VkU3ZTdHJpbmdJZHMgLSBTZXQgb2YgU1Ygc3RyaW5nIElkcwogICAgICAqLwotICAgIHB1YmxpYyBMaXN0PExpc3Q8SW50ZWdlcj4+IGdldEdwc1NhdGVsbGl0ZVBybnMoKSB7Ci0gICAgICAgIHJldHVybiBtR3BzU2F0ZWxsaXRlUHJuczsKKyAgICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0R25zc1VzZWRTdlN0cmluZ0lkcygpIHsKKyAgICAgICAgcmV0dXJuIG1HbnNzVXNlZFN2U3RyaW5nSWRzOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENoZWNrIGlmIEdQUyBTdGF0dXMgaXMgcmVjZWl2ZWQuCisgICAgICogR2V0IEdOU1MgU3RhdHVzLgogICAgICAqCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIEdQUyBTdGF0dXMgaXMgcmVjZWl2ZWQgYW5kIHtAY29kZSBmYWxzZX0KLSAgICAgKiAgICAgICAgIGlmIEdQUyBTdGF0dXMgaXMgbm90IHJlY2VpdmVkLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzR3BzU3RhdHVzUmVjZWl2ZWQoKSB7Ci0gICAgICAgIHJldHVybiBtR3BzU3RhdHVzUmVjZWl2ZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IEdQUyBTdGF0dXMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIG1HcHNTdGF0dXMgR1BTIFN0YXR1cworICAgICAqIEByZXR1cm4gbUduc3NTdGF0dXMgR05TUyBTdGF0dXMKICAgICAgKi8KICAgICBwdWJsaWMgR25zc1N0YXR1cyBnZXRHbnNzU3RhdHVzKCkgewogICAgICAgICByZXR1cm4gbUduc3NTdGF0dXM7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9sb2NhdGlvbi9zcmMvYW5kcm9pZC9sb2NhdGlvbi9jdHMvVGVzdExvY2F0aW9uTWFuYWdlci5qYXZhIGIvdGVzdHMvdGVzdHMvbG9jYXRpb24vc3JjL2FuZHJvaWQvbG9jYXRpb24vY3RzL1Rlc3RMb2NhdGlvbk1hbmFnZXIuamF2YQppbmRleCAzOTBkNDUwLi4zNzA5OTliIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9sb2NhdGlvbi9zcmMvYW5kcm9pZC9sb2NhdGlvbi9jdHMvVGVzdExvY2F0aW9uTWFuYWdlci5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2xvY2F0aW9uL3NyYy9hbmRyb2lkL2xvY2F0aW9uL2N0cy9UZXN0TG9jYXRpb25NYW5hZ2VyLmphdmEKQEAgLTEwNSwxMSArMTA1LDExIEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gbG9jYXRpb25MaXN0ZW5lciBsb2NhdGlvbiBsaXN0ZW5lciBmb3IgcmVxdWVzdAogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RMb2NhdGlvblVwZGF0ZXMoTG9jYXRpb25MaXN0ZW5lciBsb2NhdGlvbkxpc3RlbmVyKSB7CisgICAgcHVibGljIHZvaWQgcmVxdWVzdExvY2F0aW9uVXBkYXRlcyhMb2NhdGlvbkxpc3RlbmVyIGxvY2F0aW9uTGlzdGVuZXIsIGludCBtaW5UaW1lTXNlYykgewogICAgICAgICBpZiAobUxvY2F0aW9uTWFuYWdlci5nZXRQcm92aWRlcihMb2NhdGlvbk1hbmFnZXIuR1BTX1BST1ZJREVSKSAhPSBudWxsKSB7CiAgICAgICAgICAgICBMb2cuaShUQUcsICJSZXF1ZXN0IExvY2F0aW9uIHVwZGF0ZXMuIik7CiAgICAgICAgICAgICBtTG9jYXRpb25NYW5hZ2VyLnJlcXVlc3RMb2NhdGlvblVwZGF0ZXMoTG9jYXRpb25NYW5hZ2VyLkdQU19QUk9WSURFUiwKLSAgICAgICAgICAgICAgICAgICAgMCAvKiBtaW5UaW1lKi8sCisgICAgICAgICAgICAgICAgICAgIG1pblRpbWVNc2VjLAogICAgICAgICAgICAgICAgICAgICAwIC8qIG1pbkRpc3RhbmNlICovLAogICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbkxpc3RlbmVyLAogICAgICAgICAgICAgICAgICAgICBMb29wZXIuZ2V0TWFpbkxvb3BlcigpKTsKQEAgLTExNyw2ICsxMTcsMTUgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTZWUge0Bjb2RlIExvY2F0aW9uTWFuYWdlciNyZXF1ZXN0TG9jYXRpb25VcGRhdGVzfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsb2NhdGlvbkxpc3RlbmVyIGxvY2F0aW9uIGxpc3RlbmVyIGZvciByZXF1ZXN0CisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVxdWVzdExvY2F0aW9uVXBkYXRlcyhMb2NhdGlvbkxpc3RlbmVyIGxvY2F0aW9uTGlzdGVuZXIpIHsKKyAgICAgICAgcmVxdWVzdExvY2F0aW9uVXBkYXRlcyhsb2NhdGlvbkxpc3RlbmVyLCAwIC8qIG1pblRpbWVNc2VjICovKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBTZWUge0Bjb2RlIExvY2F0aW9uTWFuYWdlciNyZXF1ZXN0TmV0d29ya0xvY2F0aW9uVXBkYXRlc30uCiAgICAgICoKICAgICAgKiBAcGFyYW0gbG9jYXRpb25MaXN0ZW5lciBsb2NhdGlvbiBsaXN0ZW5lciBmb3IgcmVxdWVzdApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbG9jYXRpb24vc3JjL2FuZHJvaWQvbG9jYXRpb24vY3RzL1Rlc3RNZWFzdXJlbWVudFV0aWwuamF2YSBiL3Rlc3RzL3Rlc3RzL2xvY2F0aW9uL3NyYy9hbmRyb2lkL2xvY2F0aW9uL2N0cy9UZXN0TWVhc3VyZW1lbnRVdGlsLmphdmEKaW5kZXggNGI2M2IxYS4uNDM3ZWIyMSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbG9jYXRpb24vc3JjL2FuZHJvaWQvbG9jYXRpb24vY3RzL1Rlc3RNZWFzdXJlbWVudFV0aWwuamF2YQorKysgYi90ZXN0cy90ZXN0cy9sb2NhdGlvbi9zcmMvYW5kcm9pZC9sb2NhdGlvbi9jdHMvVGVzdE1lYXN1cmVtZW50VXRpbC5qYXZhCkBAIC0xOCwxOCArMTgsMTUgQEAKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQXBpTGV2ZWxVdGlsOwogCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uR25zc0Nsb2NrOwogaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uR25zc01lYXN1cmVtZW50OwogaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uR25zc05hdmlnYXRpb25NZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uR25zc1N0YXR1czsKIGltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLQogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CkBAIC01OCwxMSArNTUsMjEgQEAKICAgICAgICAgICAgICIgYSBmdWxsIGJ1Z3JlcG9ydC4iOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFlFQVJfMjAxNiA9IDIwMTY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFlFQVJfMjAxNyA9IDIwMTc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFlFQVJfMjAxOCA9IDIwMTg7CisKKyAgICBwcml2YXRlIGVudW0gR25zc0JhbmQgeworICAgICAgICBHTlNTX0wxLAorICAgICAgICBHTlNTX0wyLAorICAgICAgICBHTlNTX0w1LAorICAgICAgICBHTlNTX0U2CisgICAgfQogCiAgICAgLy8gVGhlIHZhbGlkIEduc3MgbmF2aWdhdGlvbiBtZXNzYWdlIHR5cGUgYXMgbGlzdGVkIGluCiAgICAgLy8gYW5kcm9pZC9oYXJkd2FyZS9saWJoYXJkd2FyZS9pbmNsdWRlL2hhcmR3YXJlL2dwcy5oCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTZXQ8SW50ZWdlcj4gR05TU19OQVZJR0FUSU9OX01FU1NBR0VfVFlQRSA9CiAgICAgICAgIG5ldyBIYXNoU2V0PEludGVnZXI+KEFycmF5cy5hc0xpc3QoCisgICAgICAgICAgICBHbnNzTmF2aWdhdGlvbk1lc3NhZ2UuVFlQRV9VTktOT1dOLAogICAgICAgICAgICAgR25zc05hdmlnYXRpb25NZXNzYWdlLlRZUEVfR1BTX0wxQ0EsCiAgICAgICAgICAgICBHbnNzTmF2aWdhdGlvbk1lc3NhZ2UuVFlQRV9HUFNfTDJDTkFWLAogICAgICAgICAgICAgR25zc05hdmlnYXRpb25NZXNzYWdlLlRZUEVfR1BTX0w1Q05BViwKQEAgLTkzLDEwICsxMDAsOCBAQAogICAgICAgICB9CiAKICAgICAgICAgLy8gSWYgZGV2aWNlIGRvZXMgbm90IGhhdmUgYSBHUFMsIHNraXAgdGhlIHRlc3QuCi0gICAgICAgIFBhY2thZ2VNYW5hZ2VyIHBtID0gdGVzdExvY2F0aW9uTWFuYWdlci5nZXRDb250ZXh0KCkuZ2V0UGFja2FnZU1hbmFnZXIoKTsKLSAgICAgICAgaWYgKCFwbS5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfTE9DQVRJT05fR1BTKSkgewotICAgICAgICAgIExvZy53KHRlc3RUYWcsICJHUFMgZmVhdHVyZSBub3QgcHJlc2VudCBvbiBkZXZpY2UsIHNraXBwaW5nIEdQUyB0ZXN0LiIpOwotICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFUZXN0VXRpbHMuZGV2aWNlSGFzR3BzRmVhdHVyZSh0ZXN0TG9jYXRpb25NYW5hZ2VyLmdldENvbnRleHQoKSkpIHsKKyAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKICAgICAgICAgLy8gSWYgZGV2aWNlIGhhcyBhIEdQUywgYnV0IGl0J3MgdHVybmVkIG9mZiBpbiBzZXR0aW5ncywgYW5kIHRoaXMgaXMgQ1RTIHZlcmlmaWVyLApAQCAtMTY5LDE3ICsxNzQsMjAgQEAKICAgICAgKiBBc3NlcnQgYWxsIG1hbmRhdG9yeSBmaWVsZHMgaW4gR25zcyBNZWFzdXJlbWVudCBhcmUgaW4gZXhwZWN0ZWQgcmFuZ2UuCiAgICAgICogU2VlIG1hbmRhdG9yeSBmaWVsZHMgaW4ge0Bjb2RlIGdwcy5ofS4KICAgICAgKgorICAgICAqIEBwYXJhbSB0ZXN0TG9jYXRpb25NYW5hZ2VyIFRlc3RMb2NhdGlvbk1hbmFnZXIKICAgICAgKiBAcGFyYW0gbWVhc3VyZW1lbnQgR25zc01lYXN1cmVtZW50CiAgICAgICogQHBhcmFtIHNvZnRBc3NlcnQgIGN1c3RvbSBTb2Z0QXNzZXJ0CiAgICAgICogQHBhcmFtIHRpbWVJbk5zICAgIGV2ZW50IHRpbWUgaW4gbnMKICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0QWxsR25zc01lYXN1cmVtZW50TWFuZGF0b3J5RmllbGRzKEduc3NNZWFzdXJlbWVudCBtZWFzdXJlbWVudCwKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0QWxsR25zc01lYXN1cmVtZW50TWFuZGF0b3J5RmllbGRzKAorICAgICAgICBUZXN0TG9jYXRpb25NYW5hZ2VyIHRlc3RMb2NhdGlvbk1hbmFnZXIsIEduc3NNZWFzdXJlbWVudCBtZWFzdXJlbWVudCwKICAgICAgICAgU29mdEFzc2VydCBzb2Z0QXNzZXJ0LCBsb25nIHRpbWVJbk5zKSB7CiAKICAgICAgICAgdmVyaWZ5U3ZpZChtZWFzdXJlbWVudCwgc29mdEFzc2VydCwgdGltZUluTnMpOwogICAgICAgICB2ZXJpZnlSZWNlaXZlZFNhdGVsbGl0ZVZlaGljbGVUaW1lSW5OcyhtZWFzdXJlbWVudCwgc29mdEFzc2VydCwgdGltZUluTnMpOwogICAgICAgICB2ZXJpZnlBY2N1bXVsYXRlZERlbHRhUmFuZ2VzKG1lYXN1cmVtZW50LCBzb2Z0QXNzZXJ0LCB0aW1lSW5Ocyk7CiAKKyAgICAgICAgaW50IGduc3NZZWFyT2ZIYXJkd2FyZSA9IHRlc3RMb2NhdGlvbk1hbmFnZXIuZ2V0TG9jYXRpb25NYW5hZ2VyKCkuZ2V0R25zc1llYXJPZkhhcmR3YXJlKCk7CiAgICAgICAgIGludCBzdGF0ZSA9IG1lYXN1cmVtZW50LmdldFN0YXRlKCk7CiAgICAgICAgIHNvZnRBc3NlcnQuYXNzZXJ0VHJ1ZSgic3RhdGU6IFNhdGVsbGl0ZSBjb2RlIHN5bmMgc3RhdGUiLAogICAgICAgICAgICAgICAgIHRpbWVJbk5zLApAQCAtMjE4LDE0ICsyMjYsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZW1lbnQuZ2V0UHNldWRvcmFuZ2VSYXRlVW5jZXJ0YWludHlNZXRlcnNQZXJTZWNvbmQoKSksCiAgICAgICAgICAgICAgICAgbWVhc3VyZW1lbnQuZ2V0UHNldWRvcmFuZ2VSYXRlVW5jZXJ0YWludHlNZXRlcnNQZXJTZWNvbmQoKSA+IDAuMCk7CiAKLSAgICAgICAgLy8gQ2hlY2sgY2Fycmllcl9mcmVxdWVuY3lfaHouCi0gICAgICAgIGlmIChtZWFzdXJlbWVudC5oYXNDYXJyaWVyRnJlcXVlbmN5SHooKSkgewotICAgICAgICAgICAgc29mdEFzc2VydC5hc3NlcnRUcnVlKCJjYXJyaWVyX2ZyZXF1ZW5jeV9oejogQ2FycmllciBmcmVxdWVuY3kgaW4gaHoiLAotICAgICAgICAgICAgICAgICAgICB0aW1lSW5OcywKLSAgICAgICAgICAgICAgICAgICAgIlggPiAwLjAiLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihtZWFzdXJlbWVudC5nZXRDYXJyaWVyRnJlcXVlbmN5SHooKSksCi0gICAgICAgICAgICAgICAgICAgIG1lYXN1cmVtZW50LmdldENhcnJpZXJGcmVxdWVuY3lIeigpID4gMC4wKTsKLSAgICAgICAgfQorICAgICAgICB2ZXJpZnlHbnNzQ2FycmllckZyZXF1ZW5jeShzb2Z0QXNzZXJ0LCB0ZXN0TG9jYXRpb25NYW5hZ2VyLAorICAgICAgICAgICAgICAgIG1lYXN1cmVtZW50Lmhhc0NhcnJpZXJGcmVxdWVuY3lIeigpLAorICAgICAgICAgICAgICAgIG1lYXN1cmVtZW50Lmhhc0NhcnJpZXJGcmVxdWVuY3lIeigpID8gbWVhc3VyZW1lbnQuZ2V0Q2FycmllckZyZXF1ZW5jeUh6KCkgOiAwRik7CiAKICAgICAgICAgLy8gQ2hlY2sgY2Fycmllcl9waGFzZS4KICAgICAgICAgaWYgKG1lYXN1cmVtZW50Lmhhc0NhcnJpZXJQaGFzZSgpKSB7CkBAIC0yNjUsNiArMjY4LDE0IEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBDaGVjayBBdXRvbWF0aWMgR2FpbiBDb250cm9sIGxldmVsIGluIGRCLgorICAgICAgICAvLyBBcyBwZXIgQ0REIDcuMy4zIC8gQy0zLTMgWWVhciAyMTA3KyBzaG91bGQgaGF2ZSBBR0MgbGV2ZWwgcHJlc2VudAorICAgICAgICBpZiAoZ25zc1llYXJPZkhhcmR3YXJlID49IFlFQVJfMjAxNykgeworICAgICAgICAgICAgc29mdEFzc2VydC5hc3NlcnRUcnVlKCJBR0MgbGV2ZWwgaW4gbWVhc3VyZW1lbnQiLAorICAgICAgICAgICAgICAgICAgICB0aW1lSW5OcywKKyAgICAgICAgICAgICAgICAgICAgIlggPT0gdHJ1ZSIsCisgICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKG1lYXN1cmVtZW50Lmhhc0F1dG9tYXRpY0dhaW5Db250cm9sTGV2ZWxEYigpKSwKKyAgICAgICAgICAgICAgICAgICAgbWVhc3VyZW1lbnQuaGFzQXV0b21hdGljR2FpbkNvbnRyb2xMZXZlbERiKCkpOworICAgICAgICB9CiAgICAgICAgIGlmIChtZWFzdXJlbWVudC5oYXNBdXRvbWF0aWNHYWluQ29udHJvbExldmVsRGIoKSkgewogICAgICAgICAgICAgc29mdEFzc2VydC5hc3NlcnRUcnVlKCJBdXRvbWF0aWMgR2FpbiBDb250cm9sIGxldmVsIGluIGRCIiwKICAgICAgICAgICAgICAgICB0aW1lSW5OcywKQEAgLTI4OCwxNiArMjk5LDI1IEBACiAKICAgICAgICAgaW50IGFjY3VtdWxhdGVkRGVsdGFSYW5nZVN0YXRlID0gbWVhc3VyZW1lbnQuZ2V0QWNjdW11bGF0ZWREZWx0YVJhbmdlU3RhdGUoKTsKICAgICAgICAgc29mdEFzc2VydC5hc3NlcnRUcnVlKCJhY2N1bXVsYXRlZF9kZWx0YV9yYW5nZV9zdGF0ZTogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiQWNjdW11bGF0ZWQgZGVsdGEgcmFuZ2Ugc3RhdGUiLAorICAgICAgICAgICAgICAgICJBY2N1bXVsYXRlZCBkZWx0YSByYW5nZSBzdGF0ZSIsCiAgICAgICAgICAgICAgICAgdGltZUluTnMsCi0gICAgICAgICAgICAgICAgIjAgPD0gWCA8PSA3IiwKKyAgICAgICAgICAgICAgICAiWCAmIH5BRFJfU1RBVEVfQUxMID09IDAiLAogICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKGFjY3VtdWxhdGVkRGVsdGFSYW5nZVN0YXRlKSwKLSAgICAgICAgICAgICAgICBhY2N1bXVsYXRlZERlbHRhUmFuZ2VTdGF0ZSA+PSAwICYmIGFjY3VtdWxhdGVkRGVsdGFSYW5nZVN0YXRlIDw9IDcpOwotICAgICAgICBpZiAoYWNjdW11bGF0ZWREZWx0YVJhbmdlU3RhdGUgPiAwKSB7CisgICAgICAgICAgICAgICAgKGFjY3VtdWxhdGVkRGVsdGFSYW5nZVN0YXRlICYgfkduc3NNZWFzdXJlbWVudC5BRFJfU1RBVEVfQUxMKSA9PSAwKTsKKyAgICAgICAgc29mdEFzc2VydC5hc3NlcnRUcnVlKCJhY2N1bXVsYXRlZF9kZWx0YV9yYW5nZV9zdGF0ZTogIiArCisgICAgICAgICAgICAgICAgIkFjY3VtdWxhdGVkIGRlbHRhIHJhbmdlIHN0YXRlIiwKKyAgICAgICAgICAgICAgICB0aW1lSW5OcywKKyAgICAgICAgICAgICAgICAiQURSX1NUQVRFX0hBTEZfQ1lDTEVfUkVQT1JURUQsIG9yICFBRFJfU1RBVEVfSEFMRl9DWUNMRV9SRVNPTFZFRCIsCisgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoYWNjdW11bGF0ZWREZWx0YVJhbmdlU3RhdGUpLAorICAgICAgICAgICAgICAgICgoYWNjdW11bGF0ZWREZWx0YVJhbmdlU3RhdGUgJgorICAgICAgICAgICAgICAgICAgR25zc01lYXN1cmVtZW50LkFEUl9TVEFURV9IQUxGX0NZQ0xFX1JFUE9SVEVEKSAhPSAwKSB8fAorICAgICAgICAgICAgICAgICAoYWNjdW11bGF0ZWREZWx0YVJhbmdlU3RhdGUgJgorICAgICAgICAgICAgICAgICAgR25zc01lYXN1cmVtZW50LkFEUl9TVEFURV9IQUxGX0NZQ0xFX1JFU09MVkVEKSA9PSAwKTsKKyAgICAgICAgaWYgKChhY2N1bXVsYXRlZERlbHRhUmFuZ2VTdGF0ZSAmIEduc3NNZWFzdXJlbWVudC5BRFJfU1RBVEVfVkFMSUQpICE9IDApIHsKICAgICAgICAgICAgIGRvdWJsZSBhY2N1bXVsYXRlZERlbHRhUmFuZ2VJbk1ldGVycyA9CiAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmVtZW50LmdldEFjY3VtdWxhdGVkRGVsdGFSYW5nZU1ldGVycygpOwogICAgICAgICAgICAgc29mdEFzc2VydC5hc3NlcnRUcnVlKCJhY2N1bXVsYXRlZF9kZWx0YV9yYW5nZV9tOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWNjdW11bGF0ZWQgZGVsdGEgcmFuZ2UgaW4gbWV0ZXIiLAorICAgICAgICAgICAgICAgICAgICAiQWNjdW11bGF0ZWQgZGVsdGEgcmFuZ2UgaW4gbWV0ZXIiLAogICAgICAgICAgICAgICAgICAgICB0aW1lSW5OcywKICAgICAgICAgICAgICAgICAgICAgIlggIT0gMC4wIiwKICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoYWNjdW11bGF0ZWREZWx0YVJhbmdlSW5NZXRlcnMpLApAQCAtMzA1LDcgKzMyNSw3IEBACiAgICAgICAgICAgICBkb3VibGUgYWNjdW11bGF0ZWREZWx0YVJhbmdlVW5jZXJ0YWludHkgPQogICAgICAgICAgICAgICAgICAgICBtZWFzdXJlbWVudC5nZXRBY2N1bXVsYXRlZERlbHRhUmFuZ2VVbmNlcnRhaW50eU1ldGVycygpOwogICAgICAgICAgICAgc29mdEFzc2VydC5hc3NlcnRUcnVlKCJhY2N1bXVsYXRlZF9kZWx0YV9yYW5nZV91bmNlcnRhaW50eV9tOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWNjdW11bGF0ZWQgZGVsdGEgcmFuZ2UgdW5jZXJ0YWludHkgaW4gbWV0ZXIiLAorICAgICAgICAgICAgICAgICAgICAiQWNjdW11bGF0ZWQgZGVsdGEgcmFuZ2UgdW5jZXJ0YWludHkgaW4gbWV0ZXIiLAogICAgICAgICAgICAgICAgICAgICB0aW1lSW5OcywKICAgICAgICAgICAgICAgICAgICAgIlggPiAwLjAiLAogICAgICAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihhY2N1bXVsYXRlZERlbHRhUmFuZ2VVbmNlcnRhaW50eSksCkBAIC0zMjMsNyArMzQzLDYgQEAKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZlcmlmeVN2aWQoR25zc01lYXN1cmVtZW50IG1lYXN1cmVtZW50LCBTb2Z0QXNzZXJ0IHNvZnRBc3NlcnQsCiAgICAgICAgIGxvbmcgdGltZUluTnMpIHsKIAotICAgICAgICBTdHJpbmcgc3ZpZExvZ01lc3NhZ2VGb3JtYXQgPSAic3ZpZDogU3BhY2UgVmVoaWNsZSBJRC4gQ29uc3RlbGxhdGlvbiB0eXBlID0gJXMiOwogICAgICAgICBpbnQgY29uc3RlbGxhdGlvblR5cGUgPSBtZWFzdXJlbWVudC5nZXRDb25zdGVsbGF0aW9uVHlwZSgpOwogICAgICAgICBpbnQgc3ZpZCA9IG1lYXN1cmVtZW50LmdldFN2aWQoKTsKICAgICAgICAgdmFsaWRhdGVTdmlkU3ViKHNvZnRBc3NlcnQsIHRpbWVJbk5zLCBjb25zdGVsbGF0aW9uVHlwZSwgc3ZpZCk7CkBAIC02MzUsNyArNjU0LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRSZWNlaXZlZFN2VGltZU5zTG9nTWVzc2FnZShTdHJpbmcgY29uc3RlbGxhdGlvblR5cGUsIFN0cmluZyBzdGF0ZSkgeworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRSZWNlaXZlZFN2VGltZU5zTG9nTWVzc2FnZShTdHJpbmcgc3RhdGUsIFN0cmluZyBjb25zdGVsbGF0aW9uVHlwZSkgewogICAgICAgICByZXR1cm4gInJlY2VpdmVkX3N2X3RpbWVfbnM6IFJlY2VpdmVkIFNWIFRpbWUtb2YtV2VlayBpbiBucy4gQ29uc3RlbGxhdGlvbiB0eXBlID0gIgogICAgICAgICAgICAgICAgICsgY29uc3RlbGxhdGlvblR5cGUgKyAiLiBTdGF0ZSA9ICIgKyBzdGF0ZTsKICAgICB9CkBAIC03MDcsNiArNzI2LDM0IEBACiAgICAgICAgIH0KICAgICB9CiAKKworICAgIC8qKgorICAgICAqIEdldCBhIHVuaXF1ZSBzdHJpbmcgZm9yIHRoZSBTViBpbmNsdWRpbmcgdGhlIGNvbnN0ZWxsYXRpb24gYW5kIHRoZSBkZWZhdWx0IEwxIGJhbmQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29uc3RlbGxhdGlvblR5cGUgR25zcyBDb25zdGVsbGF0aW9uIHR5cGUKKyAgICAgKiBAcGFyYW0gc3ZJZCBHbnNzIFN2IElkZW50aWZpZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVbmlxdWVTdlN0cmluZ0lkKGludCBjb25zdGVsbGF0aW9uVHlwZSwgaW50IHN2SWQpIHsKKyAgICAgICAgcmV0dXJuIGdldFVuaXF1ZVN2U3RyaW5nSWQoY29uc3RlbGxhdGlvblR5cGUsIHN2SWQsIEduc3NCYW5kLkdOU1NfTDEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIHVuaXF1ZSBzdHJpbmcgZm9yIHRoZSBTViBpbmNsdWRpbmcgdGhlIGNvbnN0ZWxsYXRpb24gYW5kIHRoZSBiYW5kLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnN0ZWxsYXRpb25UeXBlIEduc3MgQ29uc3RlbGxhdGlvbiB0eXBlCisgICAgICogQHBhcmFtIHN2SWQgR25zcyBTdiBJZGVudGlmaWVyCisgICAgICogQHBhcmFtIGNhcnJpZXJGcmVxdWVuY3lIeiBDYXJyaWVyIEZyZXF1ZW5jeSBmb3IgU3YgaW4gSHoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVbmlxdWVTdlN0cmluZ0lkKGludCBjb25zdGVsbGF0aW9uVHlwZSwgaW50IHN2SWQsCisgICAgICAgIGZsb2F0IGNhcnJpZXJGcmVxdWVuY3lIeikgeworICAgICAgICByZXR1cm4gZ2V0VW5pcXVlU3ZTdHJpbmdJZChjb25zdGVsbGF0aW9uVHlwZSwgc3ZJZCwKKyAgICAgICAgICAgIGZyZXF1ZW5jeVRvR25zc0JhbmQoY2FycmllckZyZXF1ZW5jeUh6KSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFVuaXF1ZVN2U3RyaW5nSWQoaW50IGNvbnN0ZWxsYXRpb25UeXBlLCBpbnQgc3ZJZCwgR25zc0JhbmQgZ25zc0JhbmQpIHsKKyAgICAgICAgcmV0dXJuIGduc3NCYW5kLnRvU3RyaW5nKCkgKyAiLiIgKyBjb25zdGVsbGF0aW9uVHlwZSArICIuIiArIHN2SWQ7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQXNzZXJ0IGFsbCBtYW5kYXRvcnkgZmllbGRzIGluIEduc3MgTmF2aWdhdGlvbiBNZXNzYWdlIGFyZSBpbiBleHBlY3RlZCByYW5nZS4KICAgICAgKiBTZWUgbWFuZGF0b3J5IGZpZWxkcyBpbiB7QGNvZGUgZ3BzLmh9LgpAQCAtNzU1LDYgKzgwMiwzNyBAQAogICAgICAgICBzb2Z0QXNzZXJ0LmFzc2VydEFsbCgpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEFzc2VydHMgcHJlc2VuY2Ugb2YgQ2FycmllckZyZXF1ZW5jeSBhbmQgdGhlIHZhbHVlcyBhcmUgaW4gZXhwZWN0ZWQgcmFuZ2UuCisgICAgICogQXMgcGVyIENERCA3LjMuMyAvIEMtMy0zIFllYXIgMjEwNysgc2hvdWxkIGhhdmUgQ2FycmllciBGcmVxdWVuY3kgcHJlc2VudAorICAgICAqIEFzIG9mIDIwMTgsIHBlciBodHRwOi8vd3d3Lm5hdmlwZWRpYS5uZXQvaW5kZXgucGhwL0dOU1Nfc2lnbmFsLCBhbGwga25vd24gR05TUyBiYW5kcworICAgICAqIGxpZSB3aXRoaW4gMiBmcmVxdWVuY3kgcmFuZ2VzIFsxMTAwLTEzMDBdICYgWzE1MDAtMTcwMF0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc29mdEFzc2VydCBjdXN0b20gU29mdEFzc2VydAorICAgICAqIEBwYXJhbSB0ZXN0TG9jYXRpb25NYW5hZ2VyIFRlc3RMb2NhdGlvbk1hbmFnZXIKKyAgICAgKiBAcGFyYW0gaGFzQ2FycmllckZyZXF1ZW5jeSBXaGV0aGVyIGNhcnJpZXJGcmVxdWVuY3kgaXMgcHJlc2VudAorICAgICAqIEBwYXJhbSBjYXJyaWVyRnJlcXVlbmN5SHogVmFsdWUgb2YgY2FycmllciBmcmVxdWVuY3kgaW4gSHogaWYgaGFzQ2FycmllckZyZXF1ZW5jeSBpcyB0cnVlLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXQgaXMgaWdub3JlZCB3aGVuIGhhc0NhcnJpZXJGcmVxdWVuY3kgaXMgZmFsc2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHZlcmlmeUduc3NDYXJyaWVyRnJlcXVlbmN5KFNvZnRBc3NlcnQgc29mdEFzc2VydCwKKyAgICAgICAgVGVzdExvY2F0aW9uTWFuYWdlciB0ZXN0TG9jYXRpb25NYW5hZ2VyLAorICAgICAgICBib29sZWFuIGhhc0NhcnJpZXJGcmVxdWVuY3ksIGZsb2F0IGNhcnJpZXJGcmVxdWVuY3lIeikgeworICAgICAgICAvLyBFbmZvcmNpbmcgQ2FycmllckZyZXF1ZW5jeUh6IGNoZWNrIG9ubHkgZm9yIHllYXIgMjAxOCsKKyAgICAgICAgaWYgKHRlc3RMb2NhdGlvbk1hbmFnZXIuZ2V0TG9jYXRpb25NYW5hZ2VyKCkuZ2V0R25zc1llYXJPZkhhcmR3YXJlKCkgPj0gWUVBUl8yMDE4KSB7CisgICAgICAgICAgICBzb2Z0QXNzZXJ0LmFzc2VydFRydWUoIk1lYXN1cmVtZW50IGhhcyBDYXJyaWVyIEZyZXF1ZW5jeTogIiArIGhhc0NhcnJpZXJGcmVxdWVuY3ksCisgICAgICAgICAgICAgICAgICAgIGhhc0NhcnJpZXJGcmVxdWVuY3kpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGhhc0NhcnJpZXJGcmVxdWVuY3kpIHsKKyAgICAgICAgICAgIGZsb2F0IGZyZXF1ZW5jeU1oeiA9IGNhcnJpZXJGcmVxdWVuY3lIei8xZTZGOworICAgICAgICAgICAgc29mdEFzc2VydC5hc3NlcnRUcnVlKCJjYXJyaWVyX2ZyZXF1ZW5jeV9taHo6IENhcnJpZXIgZnJlcXVlbmN5IGluIE1oeiIsCisgICAgICAgICAgICAgICAgIjExMDAgPCBYIDwgMTMwMCB8fCAxNTAwIDwgWCA8IDE3MDAiLAorICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKGZyZXF1ZW5jeU1oeiksCisgICAgICAgICAgICAgICAgKGZyZXF1ZW5jeU1oeiA+IDExMDAuMCAmJiBmcmVxdWVuY3lNaHogPCAxMzAwLjApIHx8CisgICAgICAgICAgICAgICAgICAgIChmcmVxdWVuY3lNaHogPiAxNTAwLjAgJiYgZnJlcXVlbmN5TWh6IDwgMTcwMC4wKSk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0R25zc05hdk1lc3NhZ2VUeXBlcygpIHsKICAgICAgICAgU3RyaW5nQnVpbGRlciB0eXBlc1N0ciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAgICAgICAgIGZvciAoaW50IHR5cGUgOiBHTlNTX05BVklHQVRJT05fTUVTU0FHRV9UWVBFKSB7CkBAIC03NjQsNCArODQyLDI1IEBACiAKICAgICAgICAgcmV0dXJuIHR5cGVzU3RyLmxlbmd0aCgpID4gMiA/IHR5cGVzU3RyLnN1YnN0cmluZygwLCB0eXBlc1N0ci5sZW5ndGgoKSAtIDIpIDogIiI7CiAgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGJhbmQgaW5mb3JtYXRpb24gaXMgYXMgb2YgMjAxOCwgcGVyIGh0dHA6Ly93d3cubmF2aXBlZGlhLm5ldC9pbmRleC5waHAvR05TU19zaWduYWwKKyAgICAgKiBCYW5kcyBhcmUgY29tYmluZWQgZm9yIHNpbXBsaWNpdHkgYXMgdGhlIGNvbnN0ZWxsYXRpb24gaXMgYWxzbyB0cmFja2VkLgorICAgICAqCisgICAgICogQHBhcmFtIGZyZXF1ZW5jeUh6IEZyZXF1ZW5jeSBpbiBIegorICAgICAqIEByZXR1cm4gR25zc0JhbmQgd2hlcmUgdGhlIGZyZXF1ZW5jeSBsaWVzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIEduc3NCYW5kIGZyZXF1ZW5jeVRvR25zc0JhbmQoZmxvYXQgZnJlcXVlbmN5SHopIHsKKyAgICAgICAgZmxvYXQgZnJlcXVlbmN5TWh6ID0gZnJlcXVlbmN5SHovMWU2RjsKKyAgICAgICAgaWYgKGZyZXF1ZW5jeU1oeiA+PSAxMTUxICYmIGZyZXF1ZW5jeU1oeiA8PSAxMjE0KSB7CisgICAgICAgICAgICByZXR1cm4gR25zc0JhbmQuR05TU19MNTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZnJlcXVlbmN5TWh6ID4gMTIxNCAmJiBmcmVxdWVuY3lNaHogPD0gMTI1NSkgeworICAgICAgICAgICAgcmV0dXJuIEduc3NCYW5kLkdOU1NfTDI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZyZXF1ZW5jeU1oeiA+IDEyNTUgJiYgZnJlcXVlbmN5TWh6IDw9IDEzMDApIHsKKyAgICAgICAgICAgIHJldHVybiBHbnNzQmFuZC5HTlNTX0U2OworICAgICAgICB9CisgICAgICAgIHJldHVybiBHbnNzQmFuZC5HTlNTX0wxOyAvLyBkZWZhdWx0IHRvIEwxIGJhbmQKKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9sb2NhdGlvbi9zcmMvYW5kcm9pZC9sb2NhdGlvbi9jdHMvVGVzdFV0aWxzLmphdmEgYi90ZXN0cy90ZXN0cy9sb2NhdGlvbi9zcmMvYW5kcm9pZC9sb2NhdGlvbi9jdHMvVGVzdFV0aWxzLmphdmEKaW5kZXggMTEzYWY0OS4uM2EwMTAwYiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbG9jYXRpb24vc3JjL2FuZHJvaWQvbG9jYXRpb24vY3RzL1Rlc3RVdGlscy5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL2xvY2F0aW9uL3NyYy9hbmRyb2lkL2xvY2F0aW9uL2N0cy9UZXN0VXRpbHMuamF2YQpAQCAtMTYsMTQgKzE2LDI3IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5sb2NhdGlvbi5jdHM7CiAKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuQ29ubmVjdGl2aXR5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5TeXN0ZW1VdGlsOworCiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiAKIHB1YmxpYyBjbGFzcyBUZXN0VXRpbHMgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTG9jYXRpb25UZXN0VXRpbHMiOworCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBTVEFOREFSRF9XQUlUX1RJTUVfTVMgPSA1MDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFNUQU5EQVJEX1NMRUVQX1RJTUVfTVMgPSA1MDsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEQVRBX0NPTk5FQ1RJT05fQ0hFQ0tfSU5URVJWQUxfTVMgPSA1MDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERBVEFfQ09OTkVDVElPTl9DSEVDS19DT1VOVCA9IDEwOyAvLyA1MDAgKiAxMCAtIFJvdWdobHkgNSBzZWNzIHdhaXQKKwogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB3YWl0Rm9yKENvdW50RG93bkxhdGNoIGxhdGNoLCBpbnQgdGltZUluU2VjKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewogICAgICAgICAvLyBTaW5jZSBsYXRlIDIwMTQsIGlmIHRoZSBtYWluIHRocmVhZCBoYXMgYmVlbiBvY2N1cGllZCBmb3IgbG9uZyBlbm91Z2gsIEFuZHJvaWQgd2lsbAogICAgICAgICAvLyBpbmNyZWFzZSBpdHMgcHJpb3JpdHkuIFN1Y2ggbmV3IGJlaGF2aW9yIGNhbiBjYXVzZXMgc3RhcnZhdGlvbiB0byB0aGUgYmFja2dyb3VuZCB0aHJlYWQgLQpAQCAtNDcsNiArNjAsNyBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CisKICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gd2FpdEZvcldpdGhDb25kaXRpb24oaW50IHRpbWVJblNlYywgQ2FsbGFibGU8Qm9vbGVhbj4gY2FsbGJhY2spCiAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBsb25nIHdhaXRUaW1lUm91bmRzID0gKFRpbWVVbml0LlNFQ09ORFMudG9NaWxsaXModGltZUluU2VjKSkgLyBTVEFOREFSRF9TTEVFUF9USU1FX01TOwpAQCAtNTcsNCArNzEsOTAgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAorICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkZXZpY2VIYXNHcHNGZWF0dXJlKENvbnRleHQgY29udGV4dCkgeworICAgICAgICAvLyBJZiBkZXZpY2UgZG9lcyBub3QgaGF2ZSBhIEdQUywgc2tpcCB0aGUgdGVzdC4KKyAgICAgICAgaWYgKGNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKS5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfTE9DQVRJT05fR1BTKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgTG9nLncoVEFHLCAiR1BTIGZlYXR1cmUgbm90IHByZXNlbnQgb24gZGV2aWNlLCBza2lwcGluZyBHUFMgdGVzdC4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgZGV2aWNlIGlzIGN1cnJlbnRseSBjb25uZWN0ZWQgdG8gYSB3aWZpIG9yIGNlbGx1bGFyLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQge0BsaW5rIENvbnRleHR9IG9iamVjdAorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGNvbm5lY3RlZCB0byBXaWZpIG9yIENlbGx1bGFyOyB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Nvbm5lY3RlZFRvV2lmaU9yQ2VsbHVsYXIoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIE5ldHdvcmtJbmZvIGluZm8gPSBnZXRBY3RpdmVOZXR3b3JrSW5mbyhjb250ZXh0KTsKKyAgICAgICAgcmV0dXJuIGluZm8gIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIGluZm8uaXNDb25uZWN0ZWQoKQorICAgICAgICAgICAgICAgICYmIChpbmZvLmdldFR5cGUoKSA9PSBDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfV0lGSQorICAgICAgICAgICAgICAgIHx8IGluZm8uZ2V0VHlwZSgpID09IENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9NT0JJTEUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGFjdGl2ZSBuZXR3b3JrIGluZm8uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCB7QGxpbmsgQ29udGV4dH0gb2JqZWN0CisgICAgICogQHJldHVybiB7QGxpbmsgTmV0d29ya0luZm99CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgTmV0d29ya0luZm8gZ2V0QWN0aXZlTmV0d29ya0luZm8oQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIENvbm5lY3Rpdml0eU1hbmFnZXIgY20gPSBnZXRDb25uZWN0aXZpdHlNYW5hZ2VyKGNvbnRleHQpOworICAgICAgICBpZiAoY20gIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGNtLmdldEFjdGl2ZU5ldHdvcmtJbmZvKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgY29ubmVjdGl2aXR5IG1hbmFnZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCB7QGxpbmsgQ29udGV4dH0gb2JqZWN0CisgICAgICogQHJldHVybiB7QGxpbmsgQ29ubmVjdGl2aXR5TWFuYWdlcn0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENvbm5lY3Rpdml0eU1hbmFnZXIgZ2V0Q29ubmVjdGl2aXR5TWFuYWdlcihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIChDb25uZWN0aXZpdHlNYW5hZ2VyKSBjb250ZXh0LmdldEFwcGxpY2F0aW9uQ29udGV4dCgpCisgICAgICAgICAgICAgICAgLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5DT05ORUNUSVZJVFlfU0VSVklDRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHNldHRpbmcge0Bjb2RlIGFpcnBsYW5lX21vZGVfb259IGlzIHNldCB0byAxLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FpcnBsYW5lTW9kZU9uKCkgeworICAgICAgICByZXR1cm4gU3lzdGVtVXRpbC5ydW5TaGVsbENvbW1hbmQoInNldHRpbmdzIGdldCBnbG9iYWwgYWlycGxhbmVfbW9kZV9vbiIpCisgICAgICAgICAgICAgICAgLnRyaW0oKS5lcXVhbHMoIjEiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGFuZ2VzIHRoZSBzZXR0aW5nIHtAY29kZSBhaXJwbGFuZV9tb2RlX29ufSB0byAxIGlmIHtAY29kZSBlbmFibGVBaXJwbGFuZU1vZGV9CisgICAgICogaXMge0Bjb2RlIHRydWV9LiBPdGhlcndpc2UsIGl0IGlzIHNldCB0byAwLgorICAgICAqCisgICAgICogPHA+V2FpdHMgZm9yIGEgY2VydGFpbiB0aW1lIGR1cmF0aW9uIGZvciBuZXR3b3JrIGNvbm5lY3Rpb25zIHRvIHR1cm4gb24vb2ZmIGJhc2VkIG9uCisgICAgICoge0Bjb2RlIGVuYWJsZUFpcnBsYW5lTW9kZX0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEFpcnBsYW5lTW9kZU9uKENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgIGJvb2xlYW4gZW5hYmxlQWlycGxhbmVNb2RlKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBMb2cuaShUQUcsICJTZXR0aW5nIGFpcnBsYW5lX21vZGVfb24gdG8gIiArIGVuYWJsZUFpcnBsYW5lTW9kZSk7CisgICAgICAgIFN5c3RlbVV0aWwucnVuU2hlbGxDb21tYW5kKCJjbWQgY29ubmVjdGl2aXR5IGFpcnBsYW5lLW1vZGUgIgorICAgICAgICAgICAgICAgICsgKGVuYWJsZUFpcnBsYW5lTW9kZSA/ICJlbmFibGUiIDogImRpc2FibGUiKSk7CisKKyAgICAgICAgLy8gV2FpdCBmb3IgYSBmZXcgc2Vjb25kcyB1bnRpbCB0aGUgYWlycGxhbmUgbW9kZSBjaGFuZ2VzIHRha2UgZWZmZWN0LiBUaGUgYWlycGxhbmUgbW9kZSBvbgorICAgICAgICAvLyBzdGF0ZSBhbmQgdGhlIFdpRmkvY2VsbCBjb25uZWN0ZWQgc3RhdGUgYXJlIG9wcG9zaXRlLiBTbywgd2Ugd2FpdCB3aGlsZSB0aGV5IGFyZSB0aGUKKyAgICAgICAgLy8gc2FtZSBvciB1bnRpbCB0aGUgc3BlY2lmaWVkIHRpbWUgaW50ZXJ2YWwgZXhwaXJlcy4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gTm90ZSB0aGF0IGluIHVudXN1YWwgY2FzZXMgd2hlcmUgdGhlIFdpRmkvY2VsbCBhcmUgbm90IGluIGEgY29ubmVjdGVkIHN0YXRlIGJlZm9yZQorICAgICAgICAvLyB0dXJuaW5nIG9uIGFpcnBsYW5lIG1vZGUsIHRoZW4gdHVybmluZyBvZmYgYWlycGxhbmUgbW9kZSB3b24ndCByZXN0b3JlIGVpdGhlciBvZgorICAgICAgICAvLyB0aGVzZSBjb25uZWN0aW9ucywgYW5kIHRoZW4gdGhlIHdhaXQgdGltZSBiZWxvdyB3aWxsIGJlIHdhc3RlZnVsLgorICAgICAgICBpbnQgZGF0YUNvbm5lY3Rpb25DaGVja0NvdW50ID0gREFUQV9DT05ORUNUSU9OX0NIRUNLX0NPVU5UOworICAgICAgICB3aGlsZSAoZW5hYmxlQWlycGxhbmVNb2RlID09IGlzQ29ubmVjdGVkVG9XaWZpT3JDZWxsdWxhcihjb250ZXh0KSkgeworICAgICAgICAgICAgaWYgKC0tZGF0YUNvbm5lY3Rpb25DaGVja0NvdW50IDw9IDApIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJBaXJwbGFuZSBtb2RlICIgKyAoZW5hYmxlQWlycGxhbmVNb2RlID8gIm9uIiA6ICJvZmYiKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHNldHRpbmcgZGlkIG5vdCB0YWtlIGVmZmVjdCBvbiBXaUZpL2NlbGwgY29ubmVjdGVkIHN0YXRlLiIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChEQVRBX0NPTk5FQ1RJT05fQ0hFQ0tfSU5URVJWQUxfTVMpOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbG9jYXRpb24yL0FuZHJvaWQubWsgYi90ZXN0cy90ZXN0cy9sb2NhdGlvbjIvQW5kcm9pZC5tawppbmRleCA1YjlmMzI3Li4zZDIyYmI3IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9sb2NhdGlvbjIvQW5kcm9pZC5taworKysgYi90ZXN0cy90ZXN0cy9sb2NhdGlvbjIvQW5kcm9pZC5tawpAQCAtMjIsMTUgKzIyLDE4IEBACiBMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQogCiAjIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0Ci1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMgY3RzX2luc3RhbnQKIAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGN0c3Rlc3RydW5uZXIganVuaXQgbGVnYWN5LWFuZHJvaWQtdGVzdAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGN0c3Rlc3RydW5uZXItYXh0IGp1bml0CisKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIAogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0xvY2F0aW9uMlRlc3RDYXNlcwogCiAjIHVuY29tbWVudCB3aGVuIExvY2F0aW9uLkVYVFJBX05PX0dQU19MT0NBVElPTiBpcyByZW1vdmVkCi0jTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVuCisjTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorTE9DQUxfUFJJVkFURV9QTEFURk9STV9BUElTIDo9IHRydWUKIAogaW5jbHVkZSAkKEJVSUxEX0NUU19QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbG9jYXRpb24yL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy90ZXN0cy9sb2NhdGlvbjIvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA3NjZhYWI0Li5mZjliYzNjIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9sb2NhdGlvbjIvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9sb2NhdGlvbjIvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMTYsNyArMTYsOCBAQAogIC0tPgogCiA8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHBhY2thZ2U9ImFuZHJvaWQubG9jYXRpb24yLmN0cyI+CisgICAgcGFja2FnZT0iYW5kcm9pZC5sb2NhdGlvbjIuY3RzIgorICAgIGFuZHJvaWQ6dGFyZ2V0U2FuZGJveFZlcnNpb249IjIiPgogCiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5ESVNBQkxFX0tFWUdVQVJEIiAvPgogICAgIDxhcHBsaWNhdGlvbj4KQEAgLTI2LDcgKzI3LDcgQEAKICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkFDQ0VTU19DT0FSU0VfTE9DQVRJT04iLz4KICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkFDQ0VTU19MT0NBVElPTl9FWFRSQV9DT01NQU5EUyIvPgogCi0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5sb2NhdGlvbjIuY3RzIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIG9mIGFuZHJvaWQubG9jYXRpb24iPgogICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0ibGlzdGVuZXIiCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9sb2NhdGlvbjIvQW5kcm9pZFRlc3QueG1sIGIvdGVzdHMvdGVzdHMvbG9jYXRpb24yL0FuZHJvaWRUZXN0LnhtbAppbmRleCAzNDQzMDk4Li40MTJmZDFkIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9sb2NhdGlvbjIvQW5kcm9pZFRlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL2xvY2F0aW9uMi9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBMb2NhdGlvbiB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0ibG9jYXRpb24iIC8+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGFyZ2V0cHJlcC5Mb2NhdGlvbkNoZWNrIiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbG9jYXRpb24yL3NyYy9hbmRyb2lkL2xvY2F0aW9uMi9jdHMvTG9jYXRpb25NYW5hZ2VyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvbG9jYXRpb24yL3NyYy9hbmRyb2lkL2xvY2F0aW9uMi9jdHMvTG9jYXRpb25NYW5hZ2VyVGVzdC5qYXZhCmluZGV4IDJlODQyNjQuLjk2YzQxYWEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL2xvY2F0aW9uMi9zcmMvYW5kcm9pZC9sb2NhdGlvbjIvY3RzL0xvY2F0aW9uTWFuYWdlclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9sb2NhdGlvbjIvc3JjL2FuZHJvaWQvbG9jYXRpb24yL2N0cy9Mb2NhdGlvbk1hbmFnZXJUZXN0LmphdmEKQEAgLTMxLDYgKzMxLDcgQEAKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXJUaHJlYWQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIGltcG9ydCBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdENhc2U7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LlVpVGhyZWFkVGVzdDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwpAQCAtMjYwLDYgKzI2MSw3IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAQXBwTW9kZUZ1bGwKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZEV4dHJhQ29tbWFuZCgpIHsKICAgICAgICAgYWRkVGVzdFByb3ZpZGVyKExvY2F0aW9uTWFuYWdlci5ORVRXT1JLX1BST1ZJREVSLCBDcml0ZXJpYS5BQ0NVUkFDWV9DT0FSU0UsIHRydWUsIGZhbHNlLCB0cnVlKTsKICAgICAgICAgYWRkVGVzdFByb3ZpZGVyKExvY2F0aW9uTWFuYWdlci5HUFNfUFJPVklERVIsIENyaXRlcmlhLkFDQ1VSQUNZX0ZJTkUsIGZhbHNlLCB0cnVlLCBmYWxzZSk7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9tZWRpYS9BbmRyb2lkLmJwIGIvdGVzdHMvdGVzdHMvbWVkaWEvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTE0ZjU0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvQW5kcm9pZC5icApAQCAtMCwwICsxLDE5IEBACithbmRyb2lkX2xpYnJhcnlfaW1wb3J0IHsKKyAgICBuYW1lOiAiY3RzLm1lZGlhLmhlaWZ3cml0ZXJfaGVpZndyaXRlci1ub2RlcHMiLAorICAgIGFhcnM6IFsiYW5kcm9pZHgvaGVpZndyaXRlci8xLjEuMC1hbHBoYTAxL2hlaWZ3cml0ZXItMS4xLjAtYWxwaGEwMS5hYXIiXSwKKyAgICBzZGtfdmVyc2lvbjogImN1cnJlbnQiLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJhbmRyb2lkeC5hbm5vdGF0aW9uX2Fubm90YXRpb24iLAorICAgIF0sCit9CisKK2FuZHJvaWRfbGlicmFyeSB7CisgICAgbmFtZTogImN0cy5tZWRpYS5oZWlmd3JpdGVyX2hlaWZ3cml0ZXIiLAorICAgIHNka192ZXJzaW9uOiAiY3VycmVudCIsCisgICAgbWFuaWZlc3Q6ICJhbmRyb2lkeC9oZWlmd3JpdGVyLzEuMS4wLWFscGhhMDEvQW5kcm9pZE1hbmlmZXN0LnhtbCIsCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImN0cy5tZWRpYS5oZWlmd3JpdGVyX2hlaWZ3cml0ZXItbm9kZXBzIiwKKyAgICAgICAgImFuZHJvaWR4LmFubm90YXRpb25fYW5ub3RhdGlvbiIsCisgICAgXSwKKyAgICBqYXZhX3ZlcnNpb246ICIxLjciLAorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbWVkaWEvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL21lZGlhL0FuZHJvaWQubWsKaW5kZXggZTAzZWI3Ni4uNGQyZGQxYiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbWVkaWEvQW5kcm9pZC5taworKysgYi90ZXN0cy90ZXN0cy9tZWRpYS9BbmRyb2lkLm1rCkBAIC00NSwxOCArNDUsMjMgQEAKIExPQ0FMX01VTFRJTElCIDo9IGJvdGgKIAogTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKLSAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsIFwKLSAgICBjdHNkZXZpY2V1dGlsbGVnYWN5IFwKKyAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBcCisgICAgY3RzZGV2aWNldXRpbGxlZ2FjeS1heHQgXAogICAgIGN0c21lZGlhdXRpbCBcCi0gICAgY3RzdGVzdHJ1bm5lciBcCisgICAgY3RzdGVzdHJ1bm5lci1heHQgaGFtY3Jlc3QtbGlicmFyeSBcCiAgICAgY3RzdGVzdHNlcnZlciBcCiAgICAganVuaXQgXAotICAgIGxlZ2FjeS1hbmRyb2lkLXRlc3QgXAogICAgIG5ka2F1ZGlvIFwKLSAgICB0ZXN0bmcKKyAgICB0ZXN0bmcgXAorICAgIHRydXRoLXByZWJ1aWx0IFwKKyAgICBtb2NraXRvLXRhcmdldC1taW51cy1qdW5pdDQgXAorICAgIGN0cy5tZWRpYS5oZWlmd3JpdGVyX2hlaWZ3cml0ZXIgXAorICAgIGFuZHJvaWR4Lm1lZGlhX21lZGlhIFwKIAogTE9DQUxfSk5JX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogICAgIGxpYmF1ZGlvX2puaSBcCisgICAgbGliYysrIFwKKyAgICBsaWJjdHNjb2RlY3V0aWxzX2puaSBcCiAgICAgbGliY3RzaW1hZ2VyZWFkZXJfam5pIFwKICAgICBsaWJjdHNtZWRpYWRybV9qbmkgXAogICAgIGxpYmN0c21lZGlhY29kZWNfam5pIFwKQEAgLTY2LDE4ICs3MSwyMyBAQAogIyBkbyBub3QgY29tcHJlc3MgVlA5IHZpZGVvIGZpbGVzCiBMT0NBTF9BQVBUX0ZMQUdTIDo9IC0wIC52cDkKIExPQ0FMX0FBUFRfRkxBR1MgKz0gLTAgLnRzCitMT0NBTF9BQVBUX0ZMQUdTICs9IC0wIC5oZWljCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIAogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c01lZGlhVGVzdENhc2VzCiAKLSMgdW5jb21tZW50IHdoZW4gYi8xMzI0OTczNyBpcyBmaXhlZAorIyBUaGlzIHRlc3QgdXNlcyBwcml2YXRlIEFQSXMKICNMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CitMT0NBTF9QUklWQVRFX1BMQVRGT1JNX0FQSVMgOj0gdHJ1ZQogCi1MT0NBTF9KQVZBX0xJQlJBUklFUyArPSBhbmRyb2lkLnRlc3QucnVubmVyIG9yZy5hcGFjaGUuaHR0cC5sZWdhY3kKK0xPQ0FMX0pBVkFfTElCUkFSSUVTICs9IFwKKyAgICBvcmcuYXBhY2hlLmh0dHAubGVnYWN5IFwKKyAgICBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicyBcCisgICAgYW5kcm9pZC50ZXN0LnJ1bm5lci5zdHVicwogCiAjIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0Ci1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMgY3RzX2luc3RhbnQKIAogaW5jbHVkZSAkKEJVSUxEX0NUU19QQUNLQUdFKQogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9tZWRpYS9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdGVzdHMvbWVkaWEvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA0ODJjZDZhLi44YTI2ZWVhIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9tZWRpYS9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL21lZGlhL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTE1LDcgKzE1LDggQEAKIC0tPgogCiA8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHBhY2thZ2U9ImFuZHJvaWQubWVkaWEuY3RzIj4KKyAgICBwYWNrYWdlPSJhbmRyb2lkLm1lZGlhLmN0cyIKKyAgICBhbmRyb2lkOnRhcmdldFNhbmRib3hWZXJzaW9uPSIyIj4KIAogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX05FVFdPUktfU1RBVEUiLz4KICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkFDQ0VTU19XSUZJX1NUQVRFIi8+CkBAIC0yOSw4ICszMCw5IEBACiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9TRVRUSU5HUyIgLz4KICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlNFVF9WT0xVTUVfS0VZX0xPTkdfUFJFU1NfTElTVEVORVIiIC8+CiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5TRVRfTUVESUFfS0VZX0xJU1RFTkVSIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uSU5URVJBQ1RfQUNST1NTX1VTRVJTIi8+CiAKLSAgICA8YXBwbGljYXRpb24+CisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bmV0d29ya1NlY3VyaXR5Q29uZmlnPSJAeG1sL25ldHdvcmtfc2VjdXJpdHlfY29uZmlnIj4KICAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CiAgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJvcmcuYXBhY2hlLmh0dHAubGVnYWN5IiBhbmRyb2lkOnJlcXVpcmVkPSJmYWxzZSIgLz4KIApAQCAtODcsNiArODksNyBAQAogICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkZSQU1FV09SS19JTlNUUlVNRU5UQVRJT05fVEVTVCIgLz4KICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KICAgICAgICAgPC9hY3Rpdml0eT4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5tZWRpYS5jdHMuTW9ja0FjdGl2aXR5IiAvPgogICAgICAgICA8c2VydmljZSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQubWVkaWEuY3RzLlJlbW90ZVZpcnR1YWxEaXNwbGF5U2VydmljZSIKICAgICAgICAgICAgIGFuZHJvaWQ6cHJvY2Vzcz0iOnJlbW90ZVNlcnZpY2UiID4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgpAQCAtMTAwLDE3ICsxMDMsMTIgQEAKICAgICAgICAgPC9zZXJ2aWNlPgogICAgIDwvYXBwbGljYXRpb24+CiAKLSAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLm1lZGlhLmN0cyIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBvZiBhbmRyb2lkLm1lZGlhIj4KICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9Imxpc3RlbmVyIgogICAgICAgICAgICAgYW5kcm9pZDp2YWx1ZT0iY29tLmFuZHJvaWQuY3RzLnJ1bm5lci5DdHNUZXN0UnVuTGlzdGVuZXIiIC8+CiAgICAgPC9pbnN0cnVtZW50YXRpb24+CiAKLSAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiCi0gICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQubWVkaWEuY3RzIgotICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iTWVkaWFQbGF5ZXIgU3RyZWFtaW5nIHRlc3RzIEluc3RydW1lbnRhdGlvblJ1bm5lciI+Ci0gICAgPC9pbnN0cnVtZW50YXRpb24+Ci0KIDwvbWFuaWZlc3Q+CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL21lZGlhL0FuZHJvaWRUZXN0LnhtbAppbmRleCBmN2QwNmIxLi42ZTVlNGQzIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9tZWRpYS9BbmRyb2lkVGVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgTWVkaWEgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9Im1lZGlhIiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRhcmdldHByZXAuTWVkaWFQcmVwYXJlciI+CiAgICAgICAgIDxvcHRpb24gbmFtZT0iaW1hZ2VzLW9ubHkiIHZhbHVlPSJ0cnVlIiAvPgpAQCAtMjksOCArMzAsMTIgQEAKICAgICA8L3RhcmdldF9wcmVwYXJlcj4KICAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuQW5kcm9pZEpVbml0VGVzdCIgPgogICAgICAgICA8b3B0aW9uIG5hbWU9InBhY2thZ2UiIHZhbHVlPSJhbmRyb2lkLm1lZGlhLmN0cyIgLz4KKyAgICAgICAgPCEtLSBzZXR1cCBjYW4gYmUgZXhwZW5zaXZlIHNvIGxpbWl0IHRoZSBudW1iZXIgb2Ygc2hhcmRzIC0tPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImFqdXItbWF4LXNoYXJkIiB2YWx1ZT0iNSIgLz4KICAgICAgICAgPCEtLSB0ZXN0LXRpbWVvdXQgdW5pdCBpcyBtcywgdmFsdWUgPSAzMCBtaW4gLS0+CiAgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC10aW1lb3V0IiB2YWx1ZT0iMTgwMDAwMCIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJydW50aW1lLWhpbnQiIHZhbHVlPSI0aCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJleGNsdWRlLWFubm90YXRpb24iIHZhbHVlPSJvcmcuanVuaXQuSWdub3JlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImhpZGRlbi1hcGktY2hlY2tzIiB2YWx1ZT0iZmFsc2UiIC8+CiAgICAgPC90ZXN0PgogPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbWVkaWEvT1dORVJTIGIvdGVzdHMvdGVzdHMvbWVkaWEvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZmRkMGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9tZWRpYS9PV05FUlMKQEAgLTAsMCArMSw4IEBACityYWNoYWRAZ29vZ2xlLmNvbQorZWxhdXJlbnRAZ29vZ2xlLmNvbQorbGFqb3NAZ29vZ2xlLmNvbQorbWFyY29uZUBnb29nbGUuY29tCitzdW5nc29vQGdvb2dsZS5jb20KK2phZXdhbkBnb29nbGUuY29tCit3amlhQGdvb2dsZS5jb20KK2p0aW5rZXJAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbWVkaWEvYW5kcm9pZHgvaGVpZndyaXRlci8xLjEuMC1hbHBoYTAxL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy90ZXN0cy9tZWRpYS9hbmRyb2lkeC9oZWlmd3JpdGVyLzEuMS4wLWFscGhhMDEvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODZiYmIxYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL21lZGlhL2FuZHJvaWR4L2hlaWZ3cml0ZXIvMS4xLjAtYWxwaGEwMS9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iYW5kcm9pZHguaGVpZndyaXRlciIgPgorCisgICAgPHVzZXMtc2RrIGFuZHJvaWQ6bWluU2RrVmVyc2lvbj0iMjgiIC8+CisKKzwvbWFuaWZlc3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbWVkaWEvYW5kcm9pZHgvaGVpZndyaXRlci8xLjEuMC1hbHBoYTAxL2hlaWZ3cml0ZXItMS4xLjAtYWxwaGEwMS1zb3VyY2VzLmphciBiL3Rlc3RzL3Rlc3RzL21lZGlhL2FuZHJvaWR4L2hlaWZ3cml0ZXIvMS4xLjAtYWxwaGEwMS9oZWlmd3JpdGVyLTEuMS4wLWFscGhhMDEtc291cmNlcy5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEyMzE1MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL21lZGlhL2FuZHJvaWR4L2hlaWZ3cml0ZXIvMS4xLjAtYWxwaGEwMS9oZWlmd3JpdGVyLTEuMS4wLWFscGhhMDEtc291cmNlcy5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbWVkaWEvYW5kcm9pZHgvaGVpZndyaXRlci8xLjEuMC1hbHBoYTAxL2hlaWZ3cml0ZXItMS4xLjAtYWxwaGEwMS1zb3VyY2VzLmphci5tZDUgYi90ZXN0cy90ZXN0cy9tZWRpYS9hbmRyb2lkeC9oZWlmd3JpdGVyLzEuMS4wLWFscGhhMDEvaGVpZndyaXRlci0xLjEuMC1hbHBoYTAxLXNvdXJjZXMuamFyLm1kNQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTc0ZmI3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvYW5kcm9pZHgvaGVpZndyaXRlci8xLjEuMC1hbHBoYTAxL2hlaWZ3cml0ZXItMS4xLjAtYWxwaGEwMS1zb3VyY2VzLmphci5tZDUKQEAgLTAsMCArMSBAQAorYjIyZWJmYTgxYWFmMDYzNWExMTU4MTYxZGFhYjNkMzIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9tZWRpYS9hbmRyb2lkeC9oZWlmd3JpdGVyLzEuMS4wLWFscGhhMDEvaGVpZndyaXRlci0xLjEuMC1hbHBoYTAxLXNvdXJjZXMuamFyLnNoYTEgYi90ZXN0cy90ZXN0cy9tZWRpYS9hbmRyb2lkeC9oZWlmd3JpdGVyLzEuMS4wLWFscGhhMDEvaGVpZndyaXRlci0xLjEuMC1hbHBoYTAxLXNvdXJjZXMuamFyLnNoYTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE0ZTZiZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL21lZGlhL2FuZHJvaWR4L2hlaWZ3cml0ZXIvMS4xLjAtYWxwaGEwMS9oZWlmd3JpdGVyLTEuMS4wLWFscGhhMDEtc291cmNlcy5qYXIuc2hhMQpAQCAtMCwwICsxIEBACisyOWY1M2FiMmQwNDQzYTE5OWYwYzA3N2Q1YTUwMjI1MjMwNTQ3ZDQ1ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbWVkaWEvYW5kcm9pZHgvaGVpZndyaXRlci8xLjEuMC1hbHBoYTAxL2hlaWZ3cml0ZXItMS4xLjAtYWxwaGEwMS5hYXIgYi90ZXN0cy90ZXN0cy9tZWRpYS9hbmRyb2lkeC9oZWlmd3JpdGVyLzEuMS4wLWFscGhhMDEvaGVpZndyaXRlci0xLjEuMC1hbHBoYTAxLmFhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2EyZjBiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvYW5kcm9pZHgvaGVpZndyaXRlci8xLjEuMC1hbHBoYTAxL2hlaWZ3cml0ZXItMS4xLjAtYWxwaGEwMS5hYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbWVkaWEvYW5kcm9pZHgvaGVpZndyaXRlci8xLjEuMC1hbHBoYTAxL2hlaWZ3cml0ZXItMS4xLjAtYWxwaGEwMS5hYXIubWQ1IGIvdGVzdHMvdGVzdHMvbWVkaWEvYW5kcm9pZHgvaGVpZndyaXRlci8xLjEuMC1hbHBoYTAxL2hlaWZ3cml0ZXItMS4xLjAtYWxwaGEwMS5hYXIubWQ1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjZDIwMmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9tZWRpYS9hbmRyb2lkeC9oZWlmd3JpdGVyLzEuMS4wLWFscGhhMDEvaGVpZndyaXRlci0xLjEuMC1hbHBoYTAxLmFhci5tZDUKQEAgLTAsMCArMSBAQAorMGMzYjVkOWY1NWVkMjI1YjVmY2IzN2ZkOWUzNWM0ODIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9tZWRpYS9hbmRyb2lkeC9oZWlmd3JpdGVyLzEuMS4wLWFscGhhMDEvaGVpZndyaXRlci0xLjEuMC1hbHBoYTAxLmFhci5zaGExIGIvdGVzdHMvdGVzdHMvbWVkaWEvYW5kcm9pZHgvaGVpZndyaXRlci8xLjEuMC1hbHBoYTAxL2hlaWZ3cml0ZXItMS4xLjAtYWxwaGEwMS5hYXIuc2hhMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWY1OTk5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvYW5kcm9pZHgvaGVpZndyaXRlci8xLjEuMC1hbHBoYTAxL2hlaWZ3cml0ZXItMS4xLjAtYWxwaGEwMS5hYXIuc2hhMQpAQCAtMCwwICsxIEBACitkZDdiNmE4MjE3NzMxMTM5MzcxMDQ0ZGU2Y2NkYTlkMmUxNmI1NDlhClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbWVkaWEvYW5kcm9pZHgvaGVpZndyaXRlci8xLjEuMC1hbHBoYTAxL2hlaWZ3cml0ZXItMS4xLjAtYWxwaGEwMS5wb20gYi90ZXN0cy90ZXN0cy9tZWRpYS9hbmRyb2lkeC9oZWlmd3JpdGVyLzEuMS4wLWFscGhhMDEvaGVpZndyaXRlci0xLjEuMC1hbHBoYTAxLnBvbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDBjNTBlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvYW5kcm9pZHgvaGVpZndyaXRlci8xLjEuMC1hbHBoYTAxL2hlaWZ3cml0ZXItMS4xLjAtYWxwaGEwMS5wb20KQEAgLTAsMCArMSwzNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0IHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiIHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCisgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgPGdyb3VwSWQ+YW5kcm9pZHguaGVpZndyaXRlcjwvZ3JvdXBJZD4KKyAgPGFydGlmYWN0SWQ+aGVpZndyaXRlcjwvYXJ0aWZhY3RJZD4KKyAgPHZlcnNpb24+MS4xLjAtYWxwaGEwMTwvdmVyc2lvbj4KKyAgPHBhY2thZ2luZz5hYXI8L3BhY2thZ2luZz4KKyAgPG5hbWU+QW5kcm9pZCBTdXBwb3J0IEhlaWZXcml0ZXI8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5BbmRyb2lkIFN1cHBvcnQgSGVpZldyaXRlciBmb3Igd3JpdGluZyBIRUlGIHN0aWxsIGltYWdlczwvZGVzY3JpcHRpb24+CisgIDx1cmw+aHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS90b29scy9leHRyYXMvc3VwcG9ydC1saWJyYXJ5Lmh0bWw8L3VybD4KKyAgPGluY2VwdGlvblllYXI+MjAxODwvaW5jZXB0aW9uWWVhcj4KKyAgPGxpY2Vuc2VzPgorICAgIDxsaWNlbnNlPgorICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIuMDwvbmFtZT4KKyAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dDwvdXJsPgorICAgICAgPGRpc3RyaWJ1dGlvbj5yZXBvPC9kaXN0cmlidXRpb24+CisgICAgPC9saWNlbnNlPgorICA8L2xpY2Vuc2VzPgorICA8ZGV2ZWxvcGVycz4KKyAgICA8ZGV2ZWxvcGVyPgorICAgICAgPG5hbWU+VGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdDwvbmFtZT4KKyAgICA8L2RldmVsb3Blcj4KKyAgPC9kZXZlbG9wZXJzPgorICA8c2NtPgorICAgIDxjb25uZWN0aW9uPnNjbTpnaXQ6aHR0cHM6Ly9hbmRyb2lkLmdvb2dsZXNvdXJjZS5jb20vcGxhdGZvcm0vZnJhbWV3b3Jrcy9zdXBwb3J0PC9jb25uZWN0aW9uPgorICAgIDx1cmw+aHR0cDovL3NvdXJjZS5hbmRyb2lkLmNvbTwvdXJsPgorICA8L3NjbT4KKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmFuZHJvaWR4LmFubm90YXRpb248L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5hbm5vdGF0aW9uPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4xLjAtcmMwMTwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbWVkaWEvYW5kcm9pZHgvaGVpZndyaXRlci8xLjEuMC1hbHBoYTAxL2hlaWZ3cml0ZXItMS4xLjAtYWxwaGEwMS5wb20ubWQ1IGIvdGVzdHMvdGVzdHMvbWVkaWEvYW5kcm9pZHgvaGVpZndyaXRlci8xLjEuMC1hbHBoYTAxL2hlaWZ3cml0ZXItMS4xLjAtYWxwaGEwMS5wb20ubWQ1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYzA3ZDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9tZWRpYS9hbmRyb2lkeC9oZWlmd3JpdGVyLzEuMS4wLWFscGhhMDEvaGVpZndyaXRlci0xLjEuMC1hbHBoYTAxLnBvbS5tZDUKQEAgLTAsMCArMSBAQAorMDY1ZjFjN2EwMDUxMDNlYmEwZTA4YWFiYTc4Njk4M2YKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9tZWRpYS9hbmRyb2lkeC9oZWlmd3JpdGVyLzEuMS4wLWFscGhhMDEvaGVpZndyaXRlci0xLjEuMC1hbHBoYTAxLnBvbS5zaGExIGIvdGVzdHMvdGVzdHMvbWVkaWEvYW5kcm9pZHgvaGVpZndyaXRlci8xLjEuMC1hbHBoYTAxL2hlaWZ3cml0ZXItMS4xLjAtYWxwaGEwMS5wb20uc2hhMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTA3M2UzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvYW5kcm9pZHgvaGVpZndyaXRlci8xLjEuMC1hbHBoYTAxL2hlaWZ3cml0ZXItMS4xLjAtYWxwaGEwMS5wb20uc2hhMQpAQCAtMCwwICsxIEBACis0NDM4ZDg5Y2QxZjI2YmVlOGZhOTgzZDlmY2QyNzMxZjU1ODM4NTcxClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbWVkaWEvYXNzZXRzL3VubXV4ZWRfMTAwMGsvMDAudHMgYi90ZXN0cy90ZXN0cy9tZWRpYS9hc3NldHMvdW5tdXhlZF8xMDAway8wMC50cwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM2YTdhMC4uMDAwMDAwMAotLS0gYS90ZXN0cy90ZXN0cy9tZWRpYS9hc3NldHMvdW5tdXhlZF8xMDAway8wMC50cworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL2Fzc2V0cy91bm11eGVkXzEwMDBrLzAxLmtleSBiL3Rlc3RzL3Rlc3RzL21lZGlhL2Fzc2V0cy91bm11eGVkXzEwMDBrLzAxLmtleQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUyMDdlOC4uMDAwMDAwMAotLS0gYS90ZXN0cy90ZXN0cy9tZWRpYS9hc3NldHMvdW5tdXhlZF8xMDAway8wMS5rZXkKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9tZWRpYS9hc3NldHMvdW5tdXhlZF8xMDAway8wMS50cyBiL3Rlc3RzL3Rlc3RzL21lZGlhL2Fzc2V0cy91bm11eGVkXzEwMDBrLzAxLnRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGFjMjc3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL3Rlc3RzL21lZGlhL2Fzc2V0cy91bm11eGVkXzEwMDBrLzAxLnRzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbWVkaWEvYXNzZXRzL3VubXV4ZWRfMTAwMGsvMDIudHMgYi90ZXN0cy90ZXN0cy9tZWRpYS9hc3NldHMvdW5tdXhlZF8xMDAway8wMi50cwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgxMDQyNC4uMDAwMDAwMAotLS0gYS90ZXN0cy90ZXN0cy9tZWRpYS9hc3NldHMvdW5tdXhlZF8xMDAway8wMi50cworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL2Fzc2V0cy91bm11eGVkXzEwMDBrLzAzLnRzIGIvdGVzdHMvdGVzdHMvbWVkaWEvYXNzZXRzL3VubXV4ZWRfMTAwMGsvMDMudHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNmRhOTAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvdGVzdHMvbWVkaWEvYXNzZXRzL3VubXV4ZWRfMTAwMGsvMDMudHMKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9tZWRpYS9hc3NldHMvdW5tdXhlZF8xMDAway8wNC50cyBiL3Rlc3RzL3Rlc3RzL21lZGlhL2Fzc2V0cy91bm11eGVkXzEwMDBrLzA0LnRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjZhODQ5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL3Rlc3RzL21lZGlhL2Fzc2V0cy91bm11eGVkXzEwMDBrLzA0LnRzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbWVkaWEvYXNzZXRzL3VubXV4ZWRfMTAwMGsvMDUudHMgYi90ZXN0cy90ZXN0cy9tZWRpYS9hc3NldHMvdW5tdXhlZF8xMDAway8wNS50cwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYwOWI1Zi4uMDAwMDAwMAotLS0gYS90ZXN0cy90ZXN0cy9tZWRpYS9hc3NldHMvdW5tdXhlZF8xMDAway8wNS50cworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL2Fzc2V0cy91bm11eGVkXzEwMDBrLzA2LnRzIGIvdGVzdHMvdGVzdHMvbWVkaWEvYXNzZXRzL3VubXV4ZWRfMTAwMGsvMDYudHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5Y2RkNWIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvdGVzdHMvbWVkaWEvYXNzZXRzL3VubXV4ZWRfMTAwMGsvMDYudHMKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9tZWRpYS9hc3NldHMvdW5tdXhlZF8xMDAway8wNy50cyBiL3Rlc3RzL3Rlc3RzL21lZGlhL2Fzc2V0cy91bm11eGVkXzEwMDBrLzA3LnRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjI3NjlkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL3Rlc3RzL21lZGlhL2Fzc2V0cy91bm11eGVkXzEwMDBrLzA3LnRzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbWVkaWEvYXNzZXRzL3VubXV4ZWRfMTAwMGsvMDgudHMgYi90ZXN0cy90ZXN0cy9tZWRpYS9hc3NldHMvdW5tdXhlZF8xMDAway8wOC50cwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcwYmMzNy4uMDAwMDAwMAotLS0gYS90ZXN0cy90ZXN0cy9tZWRpYS9hc3NldHMvdW5tdXhlZF8xMDAway8wOC50cworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL2Fzc2V0cy91bm11eGVkXzEwMDBrLzA5LnRzIGIvdGVzdHMvdGVzdHMvbWVkaWEvYXNzZXRzL3VubXV4ZWRfMTAwMGsvMDkudHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZGM1NmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvdGVzdHMvbWVkaWEvYXNzZXRzL3VubXV4ZWRfMTAwMGsvMDkudHMKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9tZWRpYS9hc3NldHMvdW5tdXhlZF8xMDAway8xMC50cyBiL3Rlc3RzL3Rlc3RzL21lZGlhL2Fzc2V0cy91bm11eGVkXzEwMDBrLzEwLnRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjJmN2QwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL3Rlc3RzL21lZGlhL2Fzc2V0cy91bm11eGVkXzEwMDBrLzEwLnRzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbWVkaWEvYXNzZXRzL3VubXV4ZWRfMTAwMGsvMTEudHMgYi90ZXN0cy90ZXN0cy9tZWRpYS9hc3NldHMvdW5tdXhlZF8xMDAway8xMS50cwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDcxNjMzMi4uMDAwMDAwMAotLS0gYS90ZXN0cy90ZXN0cy9tZWRpYS9hc3NldHMvdW5tdXhlZF8xMDAway8xMS50cworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL2Fzc2V0cy91bm11eGVkXzEwMDBrLzEyLnRzIGIvdGVzdHMvdGVzdHMvbWVkaWEvYXNzZXRzL3VubXV4ZWRfMTAwMGsvMTIudHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YTMwY2UuLjAwMDAwMDAKLS0tIGEvdGVzdHMvdGVzdHMvbWVkaWEvYXNzZXRzL3VubXV4ZWRfMTAwMGsvMTIudHMKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9tZWRpYS9hc3NldHMvdW5tdXhlZF8xMDAway9pbmRleC5tM3U4IGIvdGVzdHMvdGVzdHMvbWVkaWEvYXNzZXRzL3VubXV4ZWRfMTAwMGsvaW5kZXgubTN1OApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc0NmVjMC4uMDAwMDAwMAotLS0gYS90ZXN0cy90ZXN0cy9tZWRpYS9hc3NldHMvdW5tdXhlZF8xMDAway9pbmRleC5tM3U4CisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotI0VYVE0zVQotI0VYVC1YLVZFUlNJT046NgotI0VYVC1YLVRBUkdFVERVUkFUSU9OOjEyCi0jRVhULVgtUExBWUxJU1QtVFlQRTpWT0QKLSNFWFRJTkY6MTIsCi0wMC50cwotI0VYVC1YLUtFWTpNRVRIT0Q9U0FNUExFLUFFUyxVUkk9IjAxLmtleSIsSVY9MHg2RjI3Mjg3RjZGRjZCMTBBNDVGOTAzMzY5NzcwM0UyNixLRVlGT1JNQVQ9ImlkZW50aXR5IgotI0VYVC1YLURJU0NPTlRJTlVJVFkKLSNFWFRJTkY6OSwKLTAxLnRzCi0jRVhUSU5GOjksCi0wMi50cwotI0VYVElORjoxMiwKLTAzLnRzCi0jRVhUSU5GOjksCi0wNC50cwotI0VYVElORjo5LAotMDUudHMKLSNFWFRJTkY6MTIsCi0wNi50cwotI0VYVElORjo5LAotMDcudHMKLSNFWFRJTkY6OSwKLTA4LnRzCi0jRVhUSU5GOjEyLAotMDkudHMKLSNFWFRJTkY6OSwKLTEwLnRzCi0jRVhUSU5GOjksCi0xMS50cwotI0VYVC1YLUVORExJU1QKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9tZWRpYS9saWJhdWRpb2puaS9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvbWVkaWEvbGliYXVkaW9qbmkvQW5kcm9pZC5tawppbmRleCBkMWIxY2VkLi5hZjlkOTg5IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9tZWRpYS9saWJhdWRpb2puaS9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3Rlc3RzL21lZGlhL2xpYmF1ZGlvam5pL0FuZHJvaWQubWsKQEAgLTM1LDcgKzM1LDcgQEAKIAkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgd2lsaGVsbSkKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJhbmRyb2lkIGxpYmxvZyBsaWJuYXRpdmVoZWxwZXJfY29tcGF0X2xpYmMrKyBsaWJPcGVuU0xFUwotTE9DQUxfQ1hYX1NUTCA6PSBsaWJjKytfc3RhdGljCitMT0NBTF9DWFhfU1RMIDo9IGxpYmMrKwogCiBMT0NBTF9DRkxBR1MgOj0gLVdlcnJvciAtV2FsbAogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9tZWRpYS9saWJpbWFnZXJlYWRlcmpuaS9BSW1hZ2VSZWFkZXJDdHMuY3BwIGIvdGVzdHMvdGVzdHMvbWVkaWEvbGliaW1hZ2VyZWFkZXJqbmkvQUltYWdlUmVhZGVyQ3RzLmNwcAppbmRleCBjMDk4ZjVmLi5iZjdhYWNjIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9tZWRpYS9saWJpbWFnZXJlYWRlcmpuaS9BSW1hZ2VSZWFkZXJDdHMuY3BwCisrKyBiL3Rlc3RzL3Rlc3RzL21lZGlhL2xpYmltYWdlcmVhZGVyam5pL0FJbWFnZVJlYWRlckN0cy5jcHAKQEAgLTM0OCw3ICszNDgsNyBAQAogICAgICAgICAgICAgLy8gVmVyaXR5IHRoYXQgb3V0RmVuY2VGZCdzIHZhbHVlIHdpbGwgYmUgY2hhbmdlZCBieQogICAgICAgICAgICAgLy8gQUltYWdlUmVhZGVyX2FjcXVpcmVOZXh0SW1hZ2VBc3luYy4KICAgICAgICAgICAgIHJldCA9IEFJbWFnZVJlYWRlcl9hY3F1aXJlTmV4dEltYWdlQXN5bmMocmVhZGVyLCAmb3V0SW1hZ2UsICZvdXRGZW5jZUZkKTsKLSAgICAgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LIHx8IG91dEltYWdlID09IG51bGxwdHIgfHwgb3V0RmVuY2VGZCAhPSBrRHVtbXlGZW5jZUZkKSB7CisgICAgICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSyB8fCBvdXRJbWFnZSA9PSBudWxscHRyIHx8IG91dEZlbmNlRmQgPT0gMCkgewogICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWNxdWlyZSBpbWFnZSwgcmV0PSVkLCBvdXRJYW1nZT0lcCwgb3V0RmVuY2VGZD0lZC4iLCByZXQsIG91dEltYWdlLAogICAgICAgICAgICAgICAgICAgICAgIG91dEZlbmNlRmQpOwogICAgICAgICAgICAgICAgIHJldHVybjsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL2xpYmltYWdlcmVhZGVyam5pL0FuZHJvaWQubWsgYi90ZXN0cy90ZXN0cy9tZWRpYS9saWJpbWFnZXJlYWRlcmpuaS9BbmRyb2lkLm1rCmluZGV4IDcwNjk5YTcuLjZjZTU5MWMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL21lZGlhL2xpYmltYWdlcmVhZGVyam5pL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvbGliaW1hZ2VyZWFkZXJqbmkvQW5kcm9pZC5tawpAQCAtMzEsOCArMzEsNyBAQAogICAgIGxpYm5hdGl2ZXdpbmRvdyBcCiAgICAgbGlibG9nCiAKLUxPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKLUxPQ0FMX05ES19TVExfVkFSSUFOVCA6PSBjKytfc3RhdGljCitMT0NBTF9DWFhfU1RMIDo9IGxpYmMrKwogCiBMT0NBTF9DRkxBR1MgOj0gLVdlcnJvciAtV2FsbAogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9tZWRpYS9saWJtZWRpYW5ka2puaS9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvbWVkaWEvbGlibWVkaWFuZGtqbmkvQW5kcm9pZC5tawppbmRleCAyODdmYzNlLi5lMGFmN2RjIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9tZWRpYS9saWJtZWRpYW5ka2puaS9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3Rlc3RzL21lZGlhL2xpYm1lZGlhbmRram5pL0FuZHJvaWQubWsKQEAgLTE1LDYgKzE1LDM3IEBACiBMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCiAKICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQnVpbGRzIGxpYmN0c2NvZGVjdXRpbHNfam5pLnNvCisjCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFIDo9IGxpYmN0c2NvZGVjdXRpbHNfam5pCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgIGNvZGVjLXV0aWxzLWpuaS5jcHAgXAorICBtZDVfdXRpbHMuY3BwCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICAkKEpOSV9IX0lOQ0xVREUpIFwKKyAgc3lzdGVtL2NvcmUvaW5jbHVkZQorCitMT0NBTF9DX0lOQ0xVREVTICs9ICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBtZWRpYW5kaykKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisgIGxpYm5hdGl2ZWhlbHBlcl9jb21wYXRfbGliYysrIFwKKyAgbGlibG9nCisKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKKworTE9DQUxfTkRLX1NUTF9WQVJJQU5UIDo9IHN5c3RlbQorCitMT0NBTF9DRkxBR1MgOj0gLVdlcnJvciAtV2FsbCAtREVHTF9FR0xFWFRfUFJPVE9UWVBFUyAtc3RkPWdudSsrMTQKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIEJ1aWxkcyBsaWJjdHNtZWRpYWNvZGVjX2puaS5zbwogIwogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCkBAIC0yNSw4ICs1Niw2IEBACiAKIExPQ0FMX1NSQ19GSUxFUyA6PSBcCiAgIG5hdGl2ZS1tZWRpYS1qbmkuY3BwIFwKLSAgY29kZWMtdXRpbHMtam5pLmNwcCAgXAotICBtZDVfdXRpbHMuY3BwIFwKICAgbmF0aXZlX21lZGlhX3V0aWxzLmNwcCBcCiAgIG5hdGl2ZV9tZWRpYV9kZWNvZGVyX3NvdXJjZS5jcHAgXAogICBuYXRpdmVfbWVkaWFfZW5jb2Rlcl9qbmkuY3BwCkBAIC00MCwxNCArNjksMTQgQEAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogICBsaWJhbmRyb2lkIGxpYm5hdGl2ZWhlbHBlcl9jb21wYXRfbGliYysrIFwKICAgbGlibG9nIGxpYm1lZGlhbmRrIGxpYkVHTAotTE9DQUxfTkRLX1NUTF9WQVJJQU5UIDo9IGMrK19zdGF0aWMKIAotTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorTE9DQUxfQ1hYX1NUTCA6PSBsaWJjKysKIAogTE9DQUxfQ0ZMQUdTIDo9IC1XZXJyb3IgLVdhbGwgLURFR0xfRUdMRVhUX1BST1RPVFlQRVMgLXN0ZD1nbnUrKzE0CiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKIAorCiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIEJ1aWxkcyBsaWJjdHNtZWRpYWRybV9qbmkuc28KICMKQEAgLTc1LDEwICsxMDQsOCBAQAogICBsaWJhbmRyb2lkIGxpYm5hdGl2ZWhlbHBlcl9jb21wYXRfbGliYysrIFwKICAgbGlibG9nIGxpYm1lZGlhbmRrIGxpYmRsIGxpYkVHTAogCi1MT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50Ci0KIExPQ0FMX0NGTEFHUyA6PSAtV2Vycm9yIC1XYWxsIC1ERUdMX0VHTEVYVF9QUk9UT1RZUEVTCiAKLUxPQ0FMX05ES19TVExfVkFSSUFOVCA6PSBjKytfc3RhdGljCitMT0NBTF9DWFhfU1RMIDo9IGxpYmMrKwogCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9tZWRpYS9saWJtZWRpYW5ka2puaS9DdHNNZWRpYURybUpuaU9uTG9hZC5jcHAgYi90ZXN0cy90ZXN0cy9tZWRpYS9saWJtZWRpYW5ka2puaS9DdHNNZWRpYURybUpuaU9uTG9hZC5jcHAKaW5kZXggMjQ3MTRhMy4uMTY3NzYzMSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbWVkaWEvbGlibWVkaWFuZGtqbmkvQ3RzTWVkaWFEcm1KbmlPbkxvYWQuY3BwCisrKyBiL3Rlc3RzL3Rlc3RzL21lZGlhL2xpYm1lZGlhbmRram5pL0N0c01lZGlhRHJtSm5pT25Mb2FkLmNwcApAQCAtMTcsNyArMTcsNyBAQAogI2luY2x1ZGUgPGpuaS5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAKLWV4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9tZWRpYV9jdHNfTmF0aXZlQ2xlYXJLZXlTeXN0ZW1UZXN0KEpOSUVudiopOworZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX21lZGlhX2N0c19OYXRpdmVNZWRpYURybUNsZWFya2V5VGVzdChKTklFbnYqKTsKIAogamludCBKTklfT25Mb2FkKEphdmFWTSAqdm0sIHZvaWQgKi8qcmVzZXJ2ZWQqLykgewogICAgIEpOSUVudiAqZW52ID0gTlVMTDsKQEAgLTI2LDcgKzI2LDcgQEAKICAgICAgICAgcmV0dXJuIEpOSV9FUlI7CiAgICAgfQogCi0gICAgaWYgKHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfY3RzX05hdGl2ZUNsZWFyS2V5U3lzdGVtVGVzdChlbnYpKSB7CisgICAgaWYgKHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfY3RzX05hdGl2ZU1lZGlhRHJtQ2xlYXJrZXlUZXN0KGVudikpIHsKICAgICAgICAgcmV0dXJuIEpOSV9FUlI7CiAgICAgfQogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9tZWRpYS9saWJtZWRpYW5ka2puaS9jb2RlYy11dGlscy1qbmkuY3BwIGIvdGVzdHMvdGVzdHMvbWVkaWEvbGlibWVkaWFuZGtqbmkvY29kZWMtdXRpbHMtam5pLmNwcAppbmRleCBjYjQzNjNlLi41NTI1ZTRlIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9tZWRpYS9saWJtZWRpYW5ka2puaS9jb2RlYy11dGlscy1qbmkuY3BwCisrKyBiL3Rlc3RzL3Rlc3RzL21lZGlhL2xpYm1lZGlhbmRram5pL2NvZGVjLXV0aWxzLWpuaS5jcHAKQEAgLTI0LDggKzI0LDE1IEBACiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8am5pLmg+CiAKLSNpbmNsdWRlIDxTY29wZWRMb2NhbFJlZi5oPgotI2luY2x1ZGUgPEpOSUhlbHAuaD4KKy8vIHdvcmthcm91bmQgZm9yIHVzaW5nIFNjb3BlZExvY2FsUmVmIHdpdGggc3lzdGVtIHJ1bnRpbWUKKy8vIFRPRE86IFJlbW92ZSB0aGlzIGFmdGVyIGIvNzQ2MzIxMDQgaXMgZml4ZWQKK25hbWVzcGFjZSBzdGQKK3sKKyAgdHlwZWRlZiBkZWNsdHlwZShudWxscHRyKSBudWxscHRyX3Q7Cit9CisKKyNpbmNsdWRlIDxuYXRpdmVoZWxwZXIvSk5JSGVscC5oPgorI2luY2x1ZGUgPG5hdGl2ZWhlbHBlci9TY29wZWRMb2NhbFJlZi5oPgogCiAjaW5jbHVkZSA8bWF0aC5oPgogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9tZWRpYS9saWJtZWRpYW5ka2puaS9uYXRpdmUtbWVkaWEtam5pLmNwcCBiL3Rlc3RzL3Rlc3RzL21lZGlhL2xpYm1lZGlhbmRram5pL25hdGl2ZS1tZWRpYS1qbmkuY3BwCmluZGV4IDk0MzllZDEuLmFmMjhhODAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL21lZGlhL2xpYm1lZGlhbmRram5pL25hdGl2ZS1tZWRpYS1qbmkuY3BwCisrKyBiL3Rlc3RzL3Rlc3RzL21lZGlhL2xpYm1lZGlhbmRram5pL25hdGl2ZS1tZWRpYS1qbmkuY3BwCkBAIC0yMiw3ICsyMiw5IEBACiAKICNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxqbmkuaD4KKyNpbmNsdWRlIDxtdXRleD4KICNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8cXVldWU+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KQEAgLTM1LDYgKzM3LDcgQEAKICNpbmNsdWRlICJtZWRpYS9OZGtNZWRpYUV4dHJhY3Rvci5oIgogI2luY2x1ZGUgIm1lZGlhL05ka01lZGlhQ29kZWMuaCIKICNpbmNsdWRlICJtZWRpYS9OZGtNZWRpYUNyeXB0by5oIgorI2luY2x1ZGUgIm1lZGlhL05ka01lZGlhRGF0YVNvdXJjZS5oIgogI2luY2x1ZGUgIm1lZGlhL05ka01lZGlhRm9ybWF0LmgiCiAjaW5jbHVkZSAibWVkaWEvTmRrTWVkaWFNdXhlci5oIgogCkBAIC03Niw3ICs3OSwxNjggQEAKICAgICB9CiB9OwogCitzdHJ1Y3QgRmREYXRhU291cmNlIHsKIAorICAgIEZkRGF0YVNvdXJjZShpbnQgZmQsIGpsb25nIG9mZnNldCwgamxvbmcgc2l6ZSkKKyAgICAgICAgOiBtRmQoZmQpLAorICAgICAgICAgIG1PZmZzZXQob2Zmc2V0KSwKKyAgICAgICAgICBtU2l6ZShzaXplKSB7CisgICAgfQorCisgICAgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgICAgIHNzaXplX3Qgc3NpemUgPSBzaXplOworICAgICAgICBpZiAoIWRhdGEgfHwgb2Zmc2V0IDwgMCB8fCBvZmZzZXQgPj0gbVNpemUgfHwgb2Zmc2V0ICsgc3NpemUgPCBvZmZzZXQpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAob2Zmc2V0ICsgc3NpemUgPiBtU2l6ZSkgeworICAgICAgICAgICAgc3NpemUgPSBtU2l6ZSAtIG9mZnNldDsKKyAgICAgICAgfQorICAgICAgICBpZiAobHNlZWsobUZkLCBtT2Zmc2V0ICsgb2Zmc2V0LCBTRUVLX1NFVCkgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlYWQobUZkLCBkYXRhLCBzc2l6ZSk7CisgICAgfQorCisgICAgc3NpemVfdCBnZXRTaXplKCkgeworICAgICAgICByZXR1cm4gbVNpemU7CisgICAgfQorCisgICAgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgOjpjbG9zZShtRmQpOworICAgIH0KKworcHJpdmF0ZToKKworICAgIGludCBtRmQ7CisgICAgb2ZmNjRfdCBtT2Zmc2V0OworICAgIGludDY0X3QgbVNpemU7CisKK307CisKK3N0YXRpYyBzc2l6ZV90IEZkU291cmNlUmVhZEF0KHZvaWQgKnVzZXJkYXRhLCBvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBGZERhdGFTb3VyY2UgKnNyYyA9IChGZERhdGFTb3VyY2UqKSB1c2VyZGF0YTsKKyAgICByZXR1cm4gc3JjLT5yZWFkQXQob2Zmc2V0LCBkYXRhLCBzaXplKTsKK30KKworc3RhdGljIHNzaXplX3QgRmRTb3VyY2VHZXRTaXplKHZvaWQgKnVzZXJkYXRhKSB7CisgICAgRmREYXRhU291cmNlICpzcmMgPSAoRmREYXRhU291cmNlKikgdXNlcmRhdGE7CisgICAgcmV0dXJuIHNyYy0+Z2V0U2l6ZSgpOworfQorCitzdGF0aWMgdm9pZCBGZFNvdXJjZUNsb3NlKHZvaWQgKnVzZXJkYXRhKSB7CisgICAgRmREYXRhU291cmNlICpzcmMgPSAoRmREYXRhU291cmNlKikgdXNlcmRhdGE7CisgICAgc3JjLT5jbG9zZSgpOworfQorCitjbGFzcyBDYWxsYmFja0RhdGEgeworICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgIHN0ZDo6cXVldWU8aW50MzJfdD4gbUlucHV0QnVmZmVySWRzOworICAgIHN0ZDo6cXVldWU8aW50MzJfdD4gbU91dHB1dEJ1ZmZlcklkczsKKyAgICBzdGQ6OnF1ZXVlPEFNZWRpYUNvZGVjQnVmZmVySW5mbz4gbU91dHB1dEJ1ZmZlckluZm9zOworICAgIHN0ZDo6cXVldWU8QU1lZGlhRm9ybWF0Kj4gbUZvcm1hdHM7CisKK3B1YmxpYzoKKyAgICBDYWxsYmFja0RhdGEoKSB7IH0KKworICAgIH5DYWxsYmFja0RhdGEoKSB7CisgICAgICAgIG1NdXRleC5sb2NrKCk7CisgICAgICAgIHdoaWxlICghbUZvcm1hdHMuZW1wdHkoKSkgeworICAgICAgICAgICAgQU1lZGlhRm9ybWF0KiBmb3JtYXQgPSBtRm9ybWF0cy5mcm9udCgpOworICAgICAgICAgICAgbUZvcm1hdHMucG9wKCk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKGZvcm1hdCk7CisgICAgICAgIH0KKyAgICAgICAgbU11dGV4LnVubG9jaygpOworICAgIH0KKworICAgIHZvaWQgYWRkSW5wdXRCdWZmZXJJZChpbnQzMl90IGluZGV4KSB7CisgICAgICAgIG1NdXRleC5sb2NrKCk7CisgICAgICAgIG1JbnB1dEJ1ZmZlcklkcy5wdXNoKGluZGV4KTsKKyAgICAgICAgbU11dGV4LnVubG9jaygpOworICAgIH0KKworICAgIGludDMyX3QgZ2V0SW5wdXRCdWZmZXJJZCgpIHsKKyAgICAgICAgaW50MzJfdCBpZCA9IC0xOworICAgICAgICBtTXV0ZXgubG9jaygpOworICAgICAgICBpZiAoIW1JbnB1dEJ1ZmZlcklkcy5lbXB0eSgpKSB7CisgICAgICAgICAgICBpZCA9IG1JbnB1dEJ1ZmZlcklkcy5mcm9udCgpOworICAgICAgICAgICAgbUlucHV0QnVmZmVySWRzLnBvcCgpOworICAgICAgICB9CisgICAgICAgIG1NdXRleC51bmxvY2soKTsKKyAgICAgICAgcmV0dXJuIGlkOworICAgIH0KKworICAgIHZvaWQgYWRkT3V0cHV0QnVmZmVyKGludDMyX3QgaW5kZXgsIEFNZWRpYUNvZGVjQnVmZmVySW5mbyAqYnVmZmVySW5mbykgeworICAgICAgICBtTXV0ZXgubG9jaygpOworICAgICAgICBtT3V0cHV0QnVmZmVySWRzLnB1c2goaW5kZXgpOworICAgICAgICBtT3V0cHV0QnVmZmVySW5mb3MucHVzaCgqYnVmZmVySW5mbyk7CisgICAgICAgIG1NdXRleC51bmxvY2soKTsKKyAgICB9CisKKyAgICB2b2lkIGFkZE91dHB1dEZvcm1hdChBTWVkaWFGb3JtYXQgKmZvcm1hdCkgeworICAgICAgICBtTXV0ZXgubG9jaygpOworICAgICAgICBtT3V0cHV0QnVmZmVySWRzLnB1c2goQU1FRElBQ09ERUNfSU5GT19PVVRQVVRfRk9STUFUX0NIQU5HRUQpOworICAgICAgICBtRm9ybWF0cy5wdXNoKGZvcm1hdCk7CisgICAgICAgIG1NdXRleC51bmxvY2soKTsKKyAgICB9CisKKyAgICBpbnQzMl90IGdldE91dHB1dChBTWVkaWFDb2RlY0J1ZmZlckluZm8gKmJ1ZmZlckluZm8sIEFNZWRpYUZvcm1hdCAqKmZvcm1hdCkgeworICAgICAgICBpbnQzMl90IGlkID0gQU1FRElBQ09ERUNfSU5GT19UUllfQUdBSU5fTEFURVI7CisgICAgICAgIG1NdXRleC5sb2NrKCk7CisgICAgICAgIGlmICghbU91dHB1dEJ1ZmZlcklkcy5lbXB0eSgpKSB7CisgICAgICAgICAgICBpZCA9IG1PdXRwdXRCdWZmZXJJZHMuZnJvbnQoKTsKKyAgICAgICAgICAgIG1PdXRwdXRCdWZmZXJJZHMucG9wKCk7CisKKyAgICAgICAgICAgIGlmIChpZCA+PSAwKSB7CisgICAgICAgICAgICAgICAgKmJ1ZmZlckluZm8gPSBtT3V0cHV0QnVmZmVySW5mb3MuZnJvbnQoKTsKKyAgICAgICAgICAgICAgICBtT3V0cHV0QnVmZmVySW5mb3MucG9wKCk7CisgICAgICAgICAgICB9IGVsc2UgeyAgLy8gQU1FRElBQ09ERUNfSU5GT19PVVRQVVRfRk9STUFUX0NIQU5HRUQKKyAgICAgICAgICAgICAgICAqZm9ybWF0ID0gbUZvcm1hdHMuZnJvbnQoKTsKKyAgICAgICAgICAgICAgICBtRm9ybWF0cy5wb3AoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtTXV0ZXgudW5sb2NrKCk7CisgICAgICAgIHJldHVybiBpZDsKKyAgICB9Cit9OworCitzdGF0aWMgdm9pZCBPbklucHV0QXZhaWxhYmxlQ0IoCisgICAgICAgIEFNZWRpYUNvZGVjICogLyogYU1lZGlhQ29kZWMgKi8sCisgICAgICAgIHZvaWQgKnVzZXJkYXRhLAorICAgICAgICBpbnQzMl90IGluZGV4KSB7CisgICAgQUxPR1YoIk9uSW5wdXRBdmFpbGFibGVDQjogaW5kZXgoJWQpIiwgaW5kZXgpOworICAgIENhbGxiYWNrRGF0YSAqY2FsbGJhY2tEYXRhID0gKENhbGxiYWNrRGF0YSAqKXVzZXJkYXRhOworICAgIGNhbGxiYWNrRGF0YS0+YWRkSW5wdXRCdWZmZXJJZChpbmRleCk7Cit9CisKK3N0YXRpYyB2b2lkIE9uT3V0cHV0QXZhaWxhYmxlQ0IoCisgICAgICAgIEFNZWRpYUNvZGVjICogLyogYU1lZGlhQ29kZWMgKi8sCisgICAgICAgIHZvaWQgKnVzZXJkYXRhLAorICAgICAgICBpbnQzMl90IGluZGV4LAorICAgICAgICBBTWVkaWFDb2RlY0J1ZmZlckluZm8gKmJ1ZmZlckluZm8pIHsKKyAgICBBTE9HVigiT25PdXRwdXRBdmFpbGFibGVDQjogaW5kZXgoJWQpLCAoJWQsICVkLCAlbGxkLCAweCV4KSIsCisgICAgICAgICAgaW5kZXgsIGJ1ZmZlckluZm8tPm9mZnNldCwgYnVmZmVySW5mby0+c2l6ZSwKKyAgICAgICAgICAobG9uZyBsb25nKWJ1ZmZlckluZm8tPnByZXNlbnRhdGlvblRpbWVVcywgYnVmZmVySW5mby0+ZmxhZ3MpOworICAgIENhbGxiYWNrRGF0YSAqY2FsbGJhY2tEYXRhID0gKENhbGxiYWNrRGF0YSAqKXVzZXJkYXRhOworICAgIGNhbGxiYWNrRGF0YS0+YWRkT3V0cHV0QnVmZmVyKGluZGV4LCBidWZmZXJJbmZvKTsKK30KKworc3RhdGljIHZvaWQgT25Gb3JtYXRDaGFuZ2VkQ0IoCisgICAgICAgIEFNZWRpYUNvZGVjICogLyogYU1lZGlhQ29kZWMgKi8sCisgICAgICAgIHZvaWQgKnVzZXJkYXRhLAorICAgICAgICBBTWVkaWFGb3JtYXQgKmZvcm1hdCkgeworICAgIEFMT0dWKCJPbkZvcm1hdENoYW5nZWRDQjogZm9ybWF0KCVzKSIsIEFNZWRpYUZvcm1hdF90b1N0cmluZyhmb3JtYXQpKTsKKyAgICBDYWxsYmFja0RhdGEgKmNhbGxiYWNrRGF0YSA9IChDYWxsYmFja0RhdGEgKil1c2VyZGF0YTsKKyAgICBjYWxsYmFja0RhdGEtPmFkZE91dHB1dEZvcm1hdChmb3JtYXQpOworfQorCitzdGF0aWMgdm9pZCBPbkVycm9yQ0IoCisgICAgICAgIEFNZWRpYUNvZGVjICogLyogYU1lZGlhQ29kZWMgKi8sCisgICAgICAgIHZvaWQgKiAvKiB1c2VyZGF0YSAqLywKKyAgICAgICAgbWVkaWFfc3RhdHVzX3QgZXJyLAorICAgICAgICBpbnQzMl90IGFjdGlvbkNvZGUsCisgICAgICAgIGNvbnN0IGNoYXIgKmRldGFpbCkgeworICAgIEFMT0dWKCJPbkVycm9yQ0I6IGVyciglZCksIGFjdGlvbkNvZGUoJWQpLCBkZXRhaWwoJXMpIiwgZXJyLCBhY3Rpb25Db2RlLCBkZXRhaWwpOworfQogCiBqb2JqZWN0IHRlc3RFeHRyYWN0b3IoQU1lZGlhRXh0cmFjdG9yICpleCwgSk5JRW52ICplbnYpIHsKIApAQCAtMTIxLDcgKzI4NSw4IEBACiAgICAgdWludDhfdCAqYnVmID0gbmV3IHVpbnQ4X3RbYnVmc2l6ZV07CiAgICAgd2hpbGUodHJ1ZSkgewogICAgICAgICBpbnQgbiA9IEFNZWRpYUV4dHJhY3Rvcl9yZWFkU2FtcGxlRGF0YShleCwgYnVmLCBidWZzaXplKTsKLSAgICAgICAgaWYgKG4gPCAwKSB7CisgICAgICAgIHNzaXplX3Qgc2FtcGxlU2l6ZSA9IEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVTaXplKGV4KTsKKyAgICAgICAgaWYgKG4gPCAwIHx8IG4gIT0gc2FtcGxlU2l6ZSkgewogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgc2l6ZXMuYWRkKG4pOwpAQCAtMjE5LDE0ICszODQsNzEgQEAKICAgICByZXR1cm4gc3VtOwogfQogCi1leHRlcm4gIkMiIGpvYmplY3QgSmF2YV9hbmRyb2lkX21lZGlhX2N0c19OYXRpdmVEZWNvZGVyVGVzdF9nZXREZWNvZGVkRGF0YU5hdGl2ZShKTklFbnYgKmVudiwKLSAgICAgICAgamNsYXNzIC8qY2xhenoqLywgaW50IGZkLCBqbG9uZyBvZmZzZXQsIGpsb25nIHNpemUpIHsKLSAgICBBTE9HVigiZ2V0RGVjb2RlZERhdGFOYXRpdmUiKTsKLQorZXh0ZXJuICJDIiBqbG9uZyBKYXZhX2FuZHJvaWRfbWVkaWFfY3RzX05hdGl2ZURlY29kZXJUZXN0X2dldEV4dHJhY3RvckZpbGVEdXJhdGlvbk5hdGl2ZSgKKyAgICAgICAgSk5JRW52ICogLyplbnYqLywgamNsYXNzIC8qY2xhenoqLywgaW50IGZkLCBqbG9uZyBvZmZzZXQsIGpsb25nIHNpemUpCit7CiAgICAgQU1lZGlhRXh0cmFjdG9yICpleCA9IEFNZWRpYUV4dHJhY3Rvcl9uZXcoKTsKICAgICBpbnQgZXJyID0gQU1lZGlhRXh0cmFjdG9yX3NldERhdGFTb3VyY2VGZChleCwgZmQsIG9mZnNldCwgc2l6ZSk7CiAgICAgaWYgKGVyciAhPSAwKSB7CiAgICAgICAgIEFMT0dFKCJzZXREYXRhU291cmNlIGVycm9yOiAlZCIsIGVycik7CisgICAgICAgIEFNZWRpYUV4dHJhY3Rvcl9kZWxldGUoZXgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGludDY0X3QgZHVyYXRpb25VcyA9IC0xOworICAgIEFNZWRpYUZvcm1hdCAqZm9ybWF0ID0gQU1lZGlhRXh0cmFjdG9yX2dldEZpbGVGb3JtYXQoZXgpOworICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQ2NChmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sICZkdXJhdGlvblVzKTsKKyAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKGZvcm1hdCk7CisgICAgQU1lZGlhRXh0cmFjdG9yX2RlbGV0ZShleCk7CisgICAgcmV0dXJuIGR1cmF0aW9uVXM7Cit9CisKK2V4dGVybiAiQyIgamxvbmcgSmF2YV9hbmRyb2lkX21lZGlhX2N0c19OYXRpdmVEZWNvZGVyVGVzdF9nZXRFeHRyYWN0b3JDYWNoZWREdXJhdGlvbk5hdGl2ZSgKKyAgICAgICAgSk5JRW52ICogZW52LCBqY2xhc3MgLypjbGF6eiovLCBqc3RyaW5nIGpwYXRoKQoreworICAgIEFNZWRpYUV4dHJhY3RvciAqZXggPSBBTWVkaWFFeHRyYWN0b3JfbmV3KCk7CisKKyAgICBjb25zdCBjaGFyICp0bXAgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGpwYXRoLCBOVUxMKTsKKyAgICBpZiAodG1wID09IE5VTEwpIHsgIC8vIE91dCBvZiBtZW1vcnkKKyAgICAgICAgQU1lZGlhRXh0cmFjdG9yX2RlbGV0ZShleCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpbnQgZXJyID0gQU1lZGlhRXh0cmFjdG9yX3NldERhdGFTb3VyY2UoZXgsIHRtcCk7CisKKyAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhqcGF0aCwgdG1wKTsKKworICAgIGlmIChlcnIgIT0gMCkgeworICAgICAgICBBTE9HRSgic2V0RGF0YVNvdXJjZSBlcnJvcjogJWQiLCBlcnIpOworICAgICAgICBBTWVkaWFFeHRyYWN0b3JfZGVsZXRlKGV4KTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGludDY0X3QgY2FjaGVkRHVyYXRpb25VcyA9IEFNZWRpYUV4dHJhY3Rvcl9nZXRDYWNoZWREdXJhdGlvbihleCk7CisgICAgQU1lZGlhRXh0cmFjdG9yX2RlbGV0ZShleCk7CisgICAgcmV0dXJuIGNhY2hlZER1cmF0aW9uVXM7CisKK30KKworZXh0ZXJuICJDIiBqb2JqZWN0IEphdmFfYW5kcm9pZF9tZWRpYV9jdHNfTmF0aXZlRGVjb2RlclRlc3RfZ2V0RGVjb2RlZERhdGFOYXRpdmUoSk5JRW52ICplbnYsCisgICAgICAgIGpjbGFzcyAvKmNsYXp6Ki8sIGludCBmZCwgamxvbmcgb2Zmc2V0LCBqbG9uZyBzaXplLCBqYm9vbGVhbiB3cmFwRmQsIGpib29sZWFuIHVzZUNhbGxiYWNrKSB7CisgICAgQUxPR1YoImdldERlY29kZWREYXRhTmF0aXZlIik7CisKKyAgICBGZERhdGFTb3VyY2UgZmRTcmMoZmQsIG9mZnNldCwgc2l6ZSk7CisgICAgQU1lZGlhRXh0cmFjdG9yICpleCA9IEFNZWRpYUV4dHJhY3Rvcl9uZXcoKTsKKyAgICBBTWVkaWFEYXRhU291cmNlICpuZGtTcmMgPSBBTWVkaWFEYXRhU291cmNlX25ldygpOworCisgICAgaW50IGVycjsKKyAgICBpZiAod3JhcEZkKSB7CisgICAgICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0VXNlcmRhdGEobmRrU3JjLCAmZmRTcmMpOworICAgICAgICBBTWVkaWFEYXRhU291cmNlX3NldFJlYWRBdChuZGtTcmMsIEZkU291cmNlUmVhZEF0KTsKKyAgICAgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRHZXRTaXplKG5ka1NyYywgRmRTb3VyY2VHZXRTaXplKTsKKyAgICAgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRDbG9zZShuZGtTcmMsIEZkU291cmNlQ2xvc2UpOworICAgICAgICBlcnIgPSBBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZUN1c3RvbShleCwgbmRrU3JjKTsKKyAgICB9IGVsc2UgeworICAgICAgICBlcnIgPSBBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZUZkKGV4LCBmZCwgb2Zmc2V0LCBzaXplKTsKKyAgICB9CisgICAgaWYgKGVyciAhPSAwKSB7CisgICAgICAgIEFMT0dFKCJzZXREYXRhU291cmNlIGVycm9yOiAlZCIsIGVycik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIApAQCAtMjM0LDkgKzQ1NiwxMSBAQAogCiAgICAgQU1lZGlhQ29kZWMgKipjb2RlYyA9IG5ldyBBTWVkaWFDb2RlYypbbnVtdHJhY2tzXTsKICAgICBBTWVkaWFGb3JtYXQgKipmb3JtYXQgPSBuZXcgQU1lZGlhRm9ybWF0KltudW10cmFja3NdOworICAgIG1lbXNldChmb3JtYXQsIDAsIHNpemVvZihBTWVkaWFGb3JtYXQqKSAqIG51bXRyYWNrcyk7CiAgICAgYm9vbCAqc2F3SW5wdXRFT1MgPSBuZXcgYm9vbFtudW10cmFja3NdOwogICAgIGJvb2wgKnNhd091dHB1dEVPUyA9IG5ldyBib29sW251bXRyYWNrc107CiAgICAgc2ltcGxldmVjdG9yPGludD4gKnNpemVzID0gbmV3IHNpbXBsZXZlY3RvcjxpbnQ+W251bXRyYWNrc107CisgICAgQ2FsbGJhY2tEYXRhICpjYWxsYmFja0RhdGEgPSBuZXcgQ2FsbGJhY2tEYXRhW251bXRyYWNrc107CiAKICAgICBBTE9HVigiaW5wdXQgaGFzICVkIHRyYWNrcyIsIG51bXRyYWNrcyk7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW10cmFja3M7IGkrKykgewpAQCAtMjUwLDYgKzQ3NCwxNSBAQAogICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKG1pbWUsICJhdWRpby8iLCA2KSB8fCAhc3RybmNtcChtaW1lLCAidmlkZW8vIiwgNikpIHsKICAgICAgICAgICAgIGNvZGVjW2ldID0gQU1lZGlhQ29kZWNfY3JlYXRlRGVjb2RlckJ5VHlwZShtaW1lKTsKICAgICAgICAgICAgIEFNZWRpYUNvZGVjX2NvbmZpZ3VyZShjb2RlY1tpXSwgZm9ybWF0LCBOVUxMIC8qIHN1cmZhY2UgKi8sIE5VTEwgLyogY3J5cHRvICovLCAwKTsKKyAgICAgICAgICAgIGlmICh1c2VDYWxsYmFjaykgeworICAgICAgICAgICAgICAgIEFNZWRpYUNvZGVjT25Bc3luY05vdGlmeUNhbGxiYWNrIGFDQiA9IHsKKyAgICAgICAgICAgICAgICAgICAgT25JbnB1dEF2YWlsYWJsZUNCLAorICAgICAgICAgICAgICAgICAgICBPbk91dHB1dEF2YWlsYWJsZUNCLAorICAgICAgICAgICAgICAgICAgICBPbkZvcm1hdENoYW5nZWRDQiwKKyAgICAgICAgICAgICAgICAgICAgT25FcnJvckNCCisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBBTWVkaWFDb2RlY19zZXRBc3luY05vdGlmeUNhbGxiYWNrKGNvZGVjW2ldLCBhQ0IsICZjYWxsYmFja0RhdGFbaV0pOworICAgICAgICAgICAgfQogICAgICAgICAgICAgQU1lZGlhQ29kZWNfc3RhcnQoY29kZWNbaV0pOwogICAgICAgICAgICAgc2F3SW5wdXRFT1NbaV0gPSBmYWxzZTsKICAgICAgICAgICAgIHNhd091dHB1dEVPU1tpXSA9IGZhbHNlOwpAQCAtMjY0LDcgKzQ5NywxMiBAQAogICAgIHdoaWxlKGVvc0NvdW50IDwgbnVtdHJhY2tzKSB7CiAgICAgICAgIGludCB0ID0gQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZVRyYWNrSW5kZXgoZXgpOwogICAgICAgICBpZiAodCA+PTApIHsKLSAgICAgICAgICAgIHNzaXplX3QgYnVmaWR4ID0gQU1lZGlhQ29kZWNfZGVxdWV1ZUlucHV0QnVmZmVyKGNvZGVjW3RdLCA1MDAwKTsKKyAgICAgICAgICAgIHNzaXplX3QgYnVmaWR4OworICAgICAgICAgICAgaWYgKHVzZUNhbGxiYWNrKSB7CisgICAgICAgICAgICAgICAgYnVmaWR4ID0gY2FsbGJhY2tEYXRhW3RdLmdldElucHV0QnVmZmVySWQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnVmaWR4ID0gQU1lZGlhQ29kZWNfZGVxdWV1ZUlucHV0QnVmZmVyKGNvZGVjW3RdLCA1MDAwKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIEFMT0dWKCJ0cmFjayAlZCwgaW5wdXQgYnVmZmVyICV6ZCIsIHQsIGJ1ZmlkeCk7CiAgICAgICAgICAgICBpZiAoYnVmaWR4ID49IDApIHsKICAgICAgICAgICAgICAgICBzaXplX3QgYnVmc2l6ZTsKQEAgLTI4OSw3ICs1MjcsMTIgQEAKICAgICAgICAgICAgICAgICBpZiAoIXNhd0lucHV0RU9TW3R0XSkgewogICAgICAgICAgICAgICAgICAgICAvLyB3ZSByYW4gb3V0IG9mIHNhbXBsZXMgd2l0aG91dCBldmVyIHNpZ25hbGluZyBFT1MgdG8gdGhlIGNvZGVjLAogICAgICAgICAgICAgICAgICAgICAvLyBzbyBkbyB0aGF0IG5vdwotICAgICAgICAgICAgICAgICAgICBpbnQgYnVmaWR4ID0gQU1lZGlhQ29kZWNfZGVxdWV1ZUlucHV0QnVmZmVyKGNvZGVjW3R0XSwgNTAwMCk7CisgICAgICAgICAgICAgICAgICAgIGludCBidWZpZHg7CisgICAgICAgICAgICAgICAgICAgIGlmICh1c2VDYWxsYmFjaykgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVmaWR4ID0gY2FsbGJhY2tEYXRhW3R0XS5nZXRJbnB1dEJ1ZmZlcklkKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBidWZpZHggPSBBTWVkaWFDb2RlY19kZXF1ZXVlSW5wdXRCdWZmZXIoY29kZWNbdHRdLCA1MDAwKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpZiAoYnVmaWR4ID49IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUNvZGVjX3F1ZXVlSW5wdXRCdWZmZXIoY29kZWNbdHRdLCBidWZpZHgsIDAsIDAsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUNPREVDX0JVRkZFUl9GTEFHX0VORF9PRl9TVFJFQU0pOwpAQCAtMzAxLDkgKzU0NCwxNSBAQAogCiAgICAgICAgIC8vIGNoZWNrIGFsbCBjb2RlY3MgZm9yIGF2YWlsYWJsZSBkYXRhCiAgICAgICAgIEFNZWRpYUNvZGVjQnVmZmVySW5mbyBpbmZvOworICAgICAgICBBTWVkaWFGb3JtYXQgKm91dHB1dEZvcm1hdDsKICAgICAgICAgZm9yIChpbnQgdHQgPSAwOyB0dCA8IG51bXRyYWNrczsgdHQrKykgewogICAgICAgICAgICAgaWYgKCFzYXdPdXRwdXRFT1NbdHRdKSB7Ci0gICAgICAgICAgICAgICAgaW50IHN0YXR1cyA9IEFNZWRpYUNvZGVjX2RlcXVldWVPdXRwdXRCdWZmZXIoY29kZWNbdHRdLCAmaW5mbywgMSk7CisgICAgICAgICAgICAgICAgaW50IHN0YXR1czsKKyAgICAgICAgICAgICAgICBpZiAodXNlQ2FsbGJhY2spIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gY2FsbGJhY2tEYXRhW3R0XS5nZXRPdXRwdXQoJmluZm8sICZvdXRwdXRGb3JtYXQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFNZWRpYUNvZGVjX2RlcXVldWVPdXRwdXRCdWZmZXIoY29kZWNbdHRdLCAmaW5mbywgMSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIEFMT0dWKCJkZXF1ZXVlb3V0cHV0IG9uIHRyYWNrICVkOiAlZCIsIHR0LCBzdGF0dXMpOwogICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPj0gMCkgewogICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby5mbGFncyAmIEFNRURJQUNPREVDX0JVRkZFUl9GTEFHX0VORF9PRl9TVFJFQU0pIHsKQEAgLTMyMiw3ICs1NzEsMTQgQEAKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PSBBTUVESUFDT0RFQ19JTkZPX09VVFBVVF9CVUZGRVJTX0NIQU5HRUQpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm91dHB1dCBidWZmZXJzIGNoYW5nZWQgZm9yIHRyYWNrICVkIiwgdHQpOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09IEFNRURJQUNPREVDX0lORk9fT1VUUFVUX0ZPUk1BVF9DSEFOR0VEKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1hdFt0dF0gPSBBTWVkaWFDb2RlY19nZXRPdXRwdXRGb3JtYXQoY29kZWNbdHRdKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1hdFt0dF0gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShmb3JtYXRbdHRdKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAodXNlQ2FsbGJhY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdFt0dF0gPSBvdXRwdXRGb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRbdHRdID0gQU1lZGlhQ29kZWNfZ2V0T3V0cHV0Rm9ybWF0KGNvZGVjW3R0XSk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImZvcm1hdCBjaGFuZ2VkIGZvciB0cmFjayAlZDogJXMiLCB0dCwgQU1lZGlhRm9ybWF0X3RvU3RyaW5nKGZvcm1hdFt0dF0pKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PSBBTUVESUFDT0RFQ19JTkZPX1RSWV9BR0FJTl9MQVRFUikgewogICAgICAgICAgICAgICAgICAgICBBTE9HVigibm8gb3V0cHV0IGJ1ZmZlciByaWdodCBub3cgZm9yIHRyYWNrICVkIiwgdHQpOwpAQCAtMzU2LDYgKzYxMiw3IEBACiAgICAgfQogICAgIGVudi0+UmVsZWFzZUludEFycmF5RWxlbWVudHMocmV0LCBvcmcsIDApOwogCisgICAgZGVsZXRlW10gY2FsbGJhY2tEYXRhOwogICAgIGRlbGV0ZVtdIHNpemVzOwogICAgIGRlbGV0ZVtdIHNhd091dHB1dEVPUzsKICAgICBkZWxldGVbXSBzYXdJbnB1dEVPUzsKQEAgLTM2Nyw2ICs2MjQsNyBAQAogICAgIGRlbGV0ZVtdIGZvcm1hdDsKICAgICBkZWxldGVbXSBjb2RlYzsKICAgICBBTWVkaWFFeHRyYWN0b3JfZGVsZXRlKGV4KTsKKyAgICBBTWVkaWFEYXRhU291cmNlX2RlbGV0ZShuZGtTcmMpOwogICAgIHJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL2xpYm1lZGlhbmRram5pL25hdGl2ZS1tZWRpYWRybS1qbmkuY3BwIGIvdGVzdHMvdGVzdHMvbWVkaWEvbGlibWVkaWFuZGtqbmkvbmF0aXZlLW1lZGlhZHJtLWpuaS5jcHAKaW5kZXggYTk0YmJiMC4uZWE5NTU3NCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbWVkaWEvbGlibWVkaWFuZGtqbmkvbmF0aXZlLW1lZGlhZHJtLWpuaS5jcHAKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvbGlibWVkaWFuZGtqbmkvbmF0aXZlLW1lZGlhZHJtLWpuaS5jcHAKQEAgLTE5LDEyICsxOSwxMyBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCisjaW5jbHVkZSA8bGlzdD4KICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8am5pLmg+Ci0jaW5jbHVkZSA8Sk5JSGVscC5oPgorI2luY2x1ZGUgPG5hdGl2ZWhlbHBlci9KTklIZWxwLmg+CiAKICNpbmNsdWRlIDxhbmRyb2lkL25hdGl2ZV93aW5kb3dfam5pLmg+CiAKQEAgLTY0LDYgKzY1LDggQEAKICAgICAweGFjLCAweGUzLCAweDNjLCAweDFlLCAweDUyLCAweGUyLCAweGZiLCAweDRiCiB9OwogCisvLyBUaGUgdGVzdCBjb250ZW50IGlzIG5vdCBwYWNrYWdlZCB3aXRoIGNsZWFya2V5IFVVSUQsCisvLyB3ZSBoYXZlIHRvIHVzZSBhIGNhbm5lZCBjbGVhcmtleSBwc3NoIGZvciB0aGUgdGVzdC4KIHN0YXRpYyBjb25zdCB1aW50OF90IGtDbGVhcmtleVBzc2hbXSA9IHsKICAgICAvLyBCTUZGIGJveCBoZWFkZXIgKDQgYnl0ZXMgc2l6ZSArICdwc3NoJykKICAgICAweDAwLCAweDAwLCAweDAwLCAweDM0LCAweDcwLCAweDczLCAweDczLCAweDY4LApAQCAtMTI2LDcgKzEyOSw3IEBACiAgICAgcmV0dXJuIGp1dWlkOwogfQogCi1leHRlcm4gIkMiIGpib29sZWFuIEphdmFfYW5kcm9pZF9tZWRpYV9jdHNfTmF0aXZlQ2xlYXJLZXlTeXN0ZW1UZXN0X2lzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkTmF0aXZlKAorZXh0ZXJuICJDIiBqYm9vbGVhbiBKYXZhX2FuZHJvaWRfbWVkaWFfY3RzX05hdGl2ZU1lZGlhRHJtQ2xlYXJrZXlUZXN0X2lzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkTmF0aXZlKAogICAgIEpOSUVudiogZW52LCBqY2xhc3MgLypjbGF6eiovLCBqYnl0ZUFycmF5IHV1aWQpIHsKIAogICAgIGlmIChOVUxMID09IHV1aWQpIHsKQEAgLTE1OCw3ICsxNjEsNyBAQAogICAgICAgICBwbGF5YmFja1BhcmFtcywgZ0ZpZWxkSWRzLnZpZGVvVXJsKSk7CiB9CiAKLWV4dGVybiAiQyIgamJvb2xlYW4gSmF2YV9hbmRyb2lkX21lZGlhX2N0c19OYXRpdmVDbGVhcktleVN5c3RlbVRlc3RfdGVzdEdldFByb3BlcnR5U3RyaW5nTmF0aXZlKAorZXh0ZXJuICJDIiBqYm9vbGVhbiBKYXZhX2FuZHJvaWRfbWVkaWFfY3RzX05hdGl2ZU1lZGlhRHJtQ2xlYXJrZXlUZXN0X3Rlc3RHZXRQcm9wZXJ0eVN0cmluZ05hdGl2ZSgKICAgICBKTklFbnYqIGVudiwgamNsYXNzIGNsYXp6LCBqYnl0ZUFycmF5IHV1aWQsCiAgICAganN0cmluZyBuYW1lLCBqb2JqZWN0IG91dFZhbHVlKSB7CiAKQEAgLTIwMyw3ICsyMDYsNyBAQAogICAgIHJldHVybiBKTklfVFJVRTsKIH0KIAotZXh0ZXJuICJDIiBqYm9vbGVhbiBKYXZhX2FuZHJvaWRfbWVkaWFfY3RzX05hdGl2ZUNsZWFyS2V5U3lzdGVtVGVzdF9fdGVzdFBzc2hOYXRpdmUoCitleHRlcm4gIkMiIGpib29sZWFuIEphdmFfYW5kcm9pZF9tZWRpYV9jdHNfTmF0aXZlTWVkaWFEcm1DbGVhcmtleVRlc3RfX3Rlc3RQc3NoTmF0aXZlKAogICAgIEpOSUVudiogZW52LCBqY2xhc3MgLypjbGF6eiovLCBqYnl0ZUFycmF5IHV1aWQsIGpzdHJpbmcgdmlkZW9VcmwpIHsKIAogICAgIGlmIChOVUxMID09IHV1aWQgfHwgTlVMTCA9PSB2aWRlb1VybCkgewpAQCAtNTQxLDcgKzU0NCw3IEBACiAgICAgam5pVGhyb3dFeGNlcHRpb25GbXQoZW52LCAiamF2YS9sYW5nL1J1bnRpbWVFeGNlcHRpb24iLCBlcnJvck1lc3NhZ2UuY19zdHIoKSwgc3RhdHVzKTsKIH0KIAotZXh0ZXJuICJDIiBqYm9vbGVhbiBKYXZhX2FuZHJvaWRfbWVkaWFfY3RzX05hdGl2ZUNsZWFyS2V5U3lzdGVtVGVzdF90ZXN0Q2xlYXJLZXlQbGF5YmFja05hdGl2ZSgKK2V4dGVybiAiQyIgamJvb2xlYW4gSmF2YV9hbmRyb2lkX21lZGlhX2N0c19OYXRpdmVNZWRpYURybUNsZWFya2V5VGVzdF90ZXN0Q2xlYXJLZXlQbGF5YmFja05hdGl2ZSgKICAgICBKTklFbnYqIGVudiwgamNsYXNzIC8qY2xhenoqLywgamJ5dGVBcnJheSB1dWlkLCBqb2JqZWN0IHBsYXliYWNrUGFyYW1zKSB7CiAgICAgaWYgKE5VTEwgPT0gdXVpZCB8fCBOVUxMID09IHBsYXliYWNrUGFyYW1zKSB7CiAgICAgICAgIGpuaVRocm93RXhjZXB0aW9uKGVudiwgImphdmEvbGFuZy9OdWxsUG9pbnRlckV4Y2VwdGlvbiIsCkBAIC02NDYsNyArNjQ5LDcgQEAKICAgICByZXR1cm4gSk5JX1RSVUU7CiB9CiAKLWV4dGVybiAiQyIgamJvb2xlYW4gSmF2YV9hbmRyb2lkX21lZGlhX2N0c19OYXRpdmVDbGVhcktleVN5c3RlbVRlc3RfdGVzdFF1ZXJ5S2V5U3RhdHVzTmF0aXZlKAorZXh0ZXJuICJDIiBqYm9vbGVhbiBKYXZhX2FuZHJvaWRfbWVkaWFfY3RzX05hdGl2ZU1lZGlhRHJtQ2xlYXJrZXlUZXN0X3Rlc3RRdWVyeUtleVN0YXR1c05hdGl2ZSgKICAgICBKTklFbnYqIGVudiwgamNsYXNzIC8qY2xhenoqLywgamJ5dGVBcnJheSB1dWlkKSB7CiAKICAgICBpZiAoTlVMTCA9PSB1dWlkKSB7CkBAIC03MzksMzIgKzc0Miw5MSBAQAogICAgIHJldHVybiBKTklfVFJVRTsKIH0KIAorZXh0ZXJuICJDIiBqYm9vbGVhbiBKYXZhX2FuZHJvaWRfbWVkaWFfY3RzX05hdGl2ZU1lZGlhRHJtQ2xlYXJrZXlUZXN0X3Rlc3RGaW5kU2Vzc2lvbklkTmF0aXZlKAorICAgIEpOSUVudiogZW52LCBqY2xhc3MgLypjbGF6eiovLCBqYnl0ZUFycmF5IHV1aWQpIHsKKworICAgIGlmIChOVUxMID09IHV1aWQpIHsKKyAgICAgICAgam5pVGhyb3dFeGNlcHRpb24oZW52LCAiamF2YS9sYW5nL051bGxQb2ludGVyRXhjZXB0aW9uIiwgIm51bGwgdXVpZCIpOworICAgICAgICByZXR1cm4gSk5JX0ZBTFNFOworICAgIH0KKworICAgIFV1aWQganV1aWQgPSBqYnl0ZUFycmF5VG9VdWlkKGVudiwgdXVpZCk7CisgICAgaWYgKCFpc1V1aWRTaXplVmFsaWQoanV1aWQpKSB7CisgICAgICAgIGpuaVRocm93RXhjZXB0aW9uRm10KGVudiwgImphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iLAorICAgICAgICAgICAgICAgICJpbnZhbGlkIFVVSUQgc2l6ZSwgZXhwZWN0ZWQgJXUgYnl0ZXMiLCBrVXVpZFNpemUpOworICAgICAgICByZXR1cm4gSk5JX0ZBTFNFOworICAgIH0KKworICAgIEFNZWRpYU9iamVjdHMgYU1lZGlhT2JqZWN0czsKKyAgICBtZWRpYV9zdGF0dXNfdCBzdGF0dXMgPSBBTUVESUFfT0s7CisgICAgYU1lZGlhT2JqZWN0cy5zZXREcm0oQU1lZGlhRHJtX2NyZWF0ZUJ5VVVJRCgmanV1aWRbMF0pKTsKKyAgICBpZiAoTlVMTCA9PSBhTWVkaWFPYmplY3RzLmdldERybSgpKSB7CisgICAgICAgIGpuaVRocm93RXhjZXB0aW9uKGVudiwgImphdmEvbGFuZy9SdW50aW1lRXhjZXB0aW9uIiwgImZhaWxlZCB0byBjcmVhdGUgZHJtIik7CisgICAgICAgIHJldHVybiBKTklfRkFMU0U7CisgICAgfQorCisgICAgLy8gU3RvcmVzIGR1cGxpY2F0ZXMgb2Ygc2Vzc2lvbiBpZC4KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3Rvcjx1aW50OF90PiA+IHNpZHM7CisKKyAgICBzdGQ6Omxpc3Q8QU1lZGlhRHJtU2Vzc2lvbklkPiBzZXNzaW9uSWRzOworICAgIEFNZWRpYURybVNlc3Npb25JZCBzZXNzaW9uSWQ7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyArK2kpIHsKKyAgICAgICAgc3RhdHVzID0gQU1lZGlhRHJtX29wZW5TZXNzaW9uKGFNZWRpYU9iamVjdHMuZ2V0RHJtKCksICZzZXNzaW9uSWQpOworICAgICAgICBpZiAoc3RhdHVzICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgam5pVGhyb3dFeGNlcHRpb24oZW52LCAiamF2YS9sYW5nL1J1bnRpbWVFeGNlcHRpb24iLCAib3BlblNlc3Npb24gZmFpbGVkIik7CisgICAgICAgICAgICByZXR1cm4gSk5JX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgLy8gQWxsb2NhdGVzIGEgbmV3IHBvaW50ZXIgdG8gZHVwbGljYXRlIHRoZSBzZXNzaW9uIGlkIHJldHVybmVkIGJ5CisgICAgICAgIC8vIEFNZWRpYURybV9vcGVuU2Vzc2lvbi4gVGhlc2UgbmV3IHBvaW50ZXJzIHdpbGwgYmUgcGFzc2VkIHRvCisgICAgICAgIC8vIEFNZWRpYURybV9jbG9zZVNlc3Npb24sIHdoaWNoIHZlcmlmaWVzIHRoYXQgdGhlIG5kaworICAgICAgICAvLyBjYW4gZmluZCB0aGUgc2Vzc2lvbiBpZCBldmVuIGlmIHRoZSBwb2ludGVyIGhhcyBjaGFuZ2VkLgorICAgICAgICBzaWRzLnB1c2hfYmFjayhzdGQ6OnZlY3Rvcjx1aW50OF90PihzZXNzaW9uSWQubGVuZ3RoKSk7CisgICAgICAgIG1lbWNweShzaWRzLmF0KGkpLmRhdGEoKSwgc2Vzc2lvbklkLnB0ciwgc2Vzc2lvbklkLmxlbmd0aCk7CisgICAgICAgIHNlc3Npb25JZC5wdHIgPSBzdGF0aWNfY2FzdDx1aW50OF90ICo+KHNpZHMuYXQoaSkuZGF0YSgpKTsKKyAgICAgICAgc2Vzc2lvbklkcy5wdXNoX2JhY2soc2Vzc2lvbklkKTsKKyAgICB9CisKKyAgICBmb3IgKGF1dG8gc2Vzc2lvbklkIDogc2Vzc2lvbklkcykgeworICAgICAgICBzdGF0dXMgPSBBTWVkaWFEcm1fY2xvc2VTZXNzaW9uKGFNZWRpYU9iamVjdHMuZ2V0RHJtKCksICZzZXNzaW9uSWQpOworICAgICAgICBpZiAoc3RhdHVzICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgam5pVGhyb3dFeGNlcHRpb24oZW52LCAiamF2YS9sYW5nL1J1bnRpbWVFeGNlcHRpb24iLCAiY2xvc2VTZXNzaW9uIGZhaWxlZCIpOworICAgICAgICAgICAgcmV0dXJuIEpOSV9GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBKTklfVFJVRTsKK30KKwogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBnTWV0aG9kc1tdID0gewogICAgIHsgImlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkTmF0aXZlIiwgIihbQilaIiwKLSAgICAgICAgICAgICh2b2lkICopSmF2YV9hbmRyb2lkX21lZGlhX2N0c19OYXRpdmVDbGVhcktleVN5c3RlbVRlc3RfaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWROYXRpdmUgfSwKKyAgICAgICAgICAgICh2b2lkICopSmF2YV9hbmRyb2lkX21lZGlhX2N0c19OYXRpdmVNZWRpYURybUNsZWFya2V5VGVzdF9pc0NyeXB0b1NjaGVtZVN1cHBvcnRlZE5hdGl2ZSB9LAogCiAgICAgeyAidGVzdENsZWFyS2V5UGxheWJhY2tOYXRpdmUiLAotICAgICAgICAgICAgIihbQkxhbmRyb2lkL21lZGlhL2N0cy9OYXRpdmVDbGVhcktleVN5c3RlbVRlc3QkUGxheWJhY2tQYXJhbXM7KVoiLAotICAgICAgICAgICAgKHZvaWQgKilKYXZhX2FuZHJvaWRfbWVkaWFfY3RzX05hdGl2ZUNsZWFyS2V5U3lzdGVtVGVzdF90ZXN0Q2xlYXJLZXlQbGF5YmFja05hdGl2ZSB9LAorICAgICAgICAgICAgIihbQkxhbmRyb2lkL21lZGlhL2N0cy9OYXRpdmVNZWRpYURybUNsZWFya2V5VGVzdCRQbGF5YmFja1BhcmFtczspWiIsCisgICAgICAgICAgICAodm9pZCAqKUphdmFfYW5kcm9pZF9tZWRpYV9jdHNfTmF0aXZlTWVkaWFEcm1DbGVhcmtleVRlc3RfdGVzdENsZWFyS2V5UGxheWJhY2tOYXRpdmUgfSwKIAogICAgIHsgInRlc3RHZXRQcm9wZXJ0eVN0cmluZ05hdGl2ZSIsCiAgICAgICAgICAgICAiKFtCTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmdCdWZmZXI7KVoiLAotICAgICAgICAgICAgKHZvaWQgKilKYXZhX2FuZHJvaWRfbWVkaWFfY3RzX05hdGl2ZUNsZWFyS2V5U3lzdGVtVGVzdF90ZXN0R2V0UHJvcGVydHlTdHJpbmdOYXRpdmUgfSwKKyAgICAgICAgICAgICh2b2lkICopSmF2YV9hbmRyb2lkX21lZGlhX2N0c19OYXRpdmVNZWRpYURybUNsZWFya2V5VGVzdF90ZXN0R2V0UHJvcGVydHlTdHJpbmdOYXRpdmUgfSwKIAogICAgIHsgInRlc3RQc3NoTmF0aXZlIiwgIihbQkxqYXZhL2xhbmcvU3RyaW5nOylaIiwKLSAgICAgICAgICAgICh2b2lkICopSmF2YV9hbmRyb2lkX21lZGlhX2N0c19OYXRpdmVDbGVhcktleVN5c3RlbVRlc3RfX3Rlc3RQc3NoTmF0aXZlIH0sCisgICAgICAgICAgICAodm9pZCAqKUphdmFfYW5kcm9pZF9tZWRpYV9jdHNfTmF0aXZlTWVkaWFEcm1DbGVhcmtleVRlc3RfX3Rlc3RQc3NoTmF0aXZlIH0sCiAKICAgICB7ICJ0ZXN0UXVlcnlLZXlTdGF0dXNOYXRpdmUiLCAiKFtCKVoiLAotICAgICAgICAgICAgKHZvaWQgKilKYXZhX2FuZHJvaWRfbWVkaWFfY3RzX05hdGl2ZUNsZWFyS2V5U3lzdGVtVGVzdF90ZXN0UXVlcnlLZXlTdGF0dXNOYXRpdmUgfSwKKyAgICAgICAgICAgICh2b2lkICopSmF2YV9hbmRyb2lkX21lZGlhX2N0c19OYXRpdmVNZWRpYURybUNsZWFya2V5VGVzdF90ZXN0UXVlcnlLZXlTdGF0dXNOYXRpdmUgfSwKKworICAgIHsgInRlc3RGaW5kU2Vzc2lvbklkTmF0aXZlIiwgIihbQilaIiwKKyAgICAgICAgICAgICh2b2lkICopSmF2YV9hbmRyb2lkX21lZGlhX2N0c19OYXRpdmVNZWRpYURybUNsZWFya2V5VGVzdF90ZXN0RmluZFNlc3Npb25JZE5hdGl2ZSB9LAogfTsKIAotaW50IHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfY3RzX05hdGl2ZUNsZWFyS2V5U3lzdGVtVGVzdChKTklFbnYqIGVudikgeworaW50IHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfY3RzX05hdGl2ZU1lZGlhRHJtQ2xlYXJrZXlUZXN0KEpOSUVudiogZW52KSB7CiAgICAgamludCByZXN1bHQgPSBKTklfRVJSOwogICAgIGpjbGFzcyB0ZXN0Q2xhc3MgPQotICAgICAgICBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9jdHMvTmF0aXZlQ2xlYXJLZXlTeXN0ZW1UZXN0Iik7CisgICAgICAgIGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL2N0cy9OYXRpdmVNZWRpYURybUNsZWFya2V5VGVzdCIpOwogICAgIGlmICh0ZXN0Q2xhc3MpIHsKICAgICAgICAgamNsYXNzIHBsYXliYWNrUGFyYW1zQ2xhc3MgPSBlbnYtPkZpbmRDbGFzcygKLSAgICAgICAgICAgICJhbmRyb2lkL21lZGlhL2N0cy9OYXRpdmVDbGVhcktleVN5c3RlbVRlc3QkUGxheWJhY2tQYXJhbXMiKTsKKyAgICAgICAgICAgICJhbmRyb2lkL21lZGlhL2N0cy9OYXRpdmVNZWRpYURybUNsZWFya2V5VGVzdCRQbGF5YmFja1BhcmFtcyIpOwogICAgICAgICBpZiAocGxheWJhY2tQYXJhbXNDbGFzcykgewogICAgICAgICAgICAgamNsYXNzIHN1cmZhY2VDbGFzcyA9CiAgICAgICAgICAgICAgICAgZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvdmlldy9TdXJmYWNlIik7CkBAIC03ODUsNyArODQ3LDcgQEAKICAgICAgICAgfQogCiAgICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIk5hdGl2ZUNsZWFyS2V5U3lzdGVtVGVzdCBjbGFzcyBub3QgZm91bmQiKTsKKyAgICAgICAgQUxPR0UoIk5hdGl2ZU1lZGlhRHJtQ2xlYXJrZXlUZXN0IGNsYXNzIG5vdCBmb3VuZCIpOwogICAgIH0KIAogICAgIHJlc3VsdCA9IGVudi0+UmVnaXN0ZXJOYXRpdmVzKHRlc3RDbGFzcywgZ01ldGhvZHMsCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9tZWRpYS9saWJuZGthdWRpby9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvbWVkaWEvbGlibmRrYXVkaW8vQW5kcm9pZC5tawppbmRleCAyOWUyMTE4Li45ODJjNjMwIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9tZWRpYS9saWJuZGthdWRpby9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3Rlc3RzL21lZGlhL2xpYm5ka2F1ZGlvL0FuZHJvaWQubWsKQEAgLTM3LDcgKzM3LDcgQEAKICAgQXVkaW9SZWNvcmRlci5jcHAgXAogICBjb21fYW5kcm9pZF9uZGthdWRpb19BdWRpb1JlY29yZGVyLmNwcAogCi1MT0NBTF9DWFhfU1RMIDo9IGxpYmMrK19zdGF0aWMKK0xPQ0FMX0NYWF9TVEwgOj0gbGliYysrCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGlibG9nIGxpYk9wZW5TTEVTCiAKQEAgLTU2LDQgKzU2LDYgQEAKIAogTE9DQUxfQ0VSVElGSUNBVEUgOj0gcGxhdGZvcm0KIAorTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorCiBpbmNsdWRlICQoQlVJTERfU1RBVElDX0pBVkFfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3Jlcy9yYXcvY29sb3JfMTc2eDE0NF9idDIwMjBfbHJfaGxnX2gyNjUubXA0IGIvdGVzdHMvdGVzdHMvbWVkaWEvcmVzL3Jhdy9jb2xvcl8xNzZ4MTQ0X2J0MjAyMF9scl9obGdfaDI2NS5tcDQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ4MTUxYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL21lZGlhL3Jlcy9yYXcvY29sb3JfMTc2eDE0NF9idDIwMjBfbHJfaGxnX2gyNjUubXA0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3Jlcy9yYXcvY29sb3JfMTc2eDE0NF9idDIwMjBfbHJfc21wdGUyMDg0X2gyNjUubXA0IGIvdGVzdHMvdGVzdHMvbWVkaWEvcmVzL3Jhdy9jb2xvcl8xNzZ4MTQ0X2J0MjAyMF9scl9zbXB0ZTIwODRfaDI2NS5tcDQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIxMjM3ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL21lZGlhL3Jlcy9yYXcvY29sb3JfMTc2eDE0NF9idDIwMjBfbHJfc21wdGUyMDg0X2gyNjUubXA0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3Jlcy9yYXcvaGVpZndyaXRlcl9pbnB1dC5oZWljIGIvdGVzdHMvdGVzdHMvbWVkaWEvcmVzL3Jhdy9oZWlmd3JpdGVyX2lucHV0LmhlaWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY0NTczYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL21lZGlhL3Jlcy9yYXcvaGVpZndyaXRlcl9pbnB1dC5oZWljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3Jlcy9yYXcvbm9pc2VfMWNoXzI5XzRraHpfYW90NDJfMTlfbHVmc19kcmNfY29uZmlnX2NoYW5nZV9tcDQubTRhIGIvdGVzdHMvdGVzdHMvbWVkaWEvcmVzL3Jhdy9ub2lzZV8xY2hfMjlfNGtoel9hb3Q0Ml8xOV9sdWZzX2RyY19jb25maWdfY2hhbmdlX21wNC5tNGEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGJiOGRhZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL21lZGlhL3Jlcy9yYXcvbm9pc2VfMWNoXzI5XzRraHpfYW90NDJfMTlfbHVmc19kcmNfY29uZmlnX2NoYW5nZV9tcDQubTRhCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3Jlcy9yYXcvbm9pc2VfMWNoXzM4XzRraHpfYW90NDJfMTlfbHVmc19jb25maWdfY2hhbmdlX21wNC5tNGEgYi90ZXN0cy90ZXN0cy9tZWRpYS9yZXMvcmF3L25vaXNlXzFjaF8zOF80a2h6X2FvdDQyXzE5X2x1ZnNfY29uZmlnX2NoYW5nZV9tcDQubTRhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQ5N2ZmOTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9tZWRpYS9yZXMvcmF3L25vaXNlXzFjaF8zOF80a2h6X2FvdDQyXzE5X2x1ZnNfY29uZmlnX2NoYW5nZV9tcDQubTRhCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3Jlcy9yYXcvbm9pc2VfMmNoXzA4a2h6X2FvdDQyXzE5X2x1ZnNfbXA0Lm00YSBiL3Rlc3RzL3Rlc3RzL21lZGlhL3Jlcy9yYXcvbm9pc2VfMmNoXzA4a2h6X2FvdDQyXzE5X2x1ZnNfbXA0Lm00YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zNmRlMWIwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvcmVzL3Jhdy9ub2lzZV8yY2hfMDhraHpfYW90NDJfMTlfbHVmc19tcDQubTRhCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3Jlcy9yYXcvbm9pc2VfMmNoXzEya2h6X2FvdDQyXzE5X2x1ZnNfbXA0Lm00YSBiL3Rlc3RzL3Rlc3RzL21lZGlhL3Jlcy9yYXcvbm9pc2VfMmNoXzEya2h6X2FvdDQyXzE5X2x1ZnNfbXA0Lm00YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43Y2Q3OTIzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvcmVzL3Jhdy9ub2lzZV8yY2hfMTJraHpfYW90NDJfMTlfbHVmc19tcDQubTRhCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3Jlcy9yYXcvbm9pc2VfMmNoXzE5XzJraHpfYW90NDJfbm9fbHVkdF9tcDQubTRhIGIvdGVzdHMvdGVzdHMvbWVkaWEvcmVzL3Jhdy9ub2lzZV8yY2hfMTlfMmtoel9hb3Q0Ml9ub19sdWR0X21wNC5tNGEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmVmZGIxNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL21lZGlhL3Jlcy9yYXcvbm9pc2VfMmNoXzE5XzJraHpfYW90NDJfbm9fbHVkdF9tcDQubTRhCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3Jlcy9yYXcvbm9pc2VfMmNoXzIyXzA1a2h6X2FvdDQyXzE5X2x1ZnNfbXA0Lm00YSBiL3Rlc3RzL3Rlc3RzL21lZGlhL3Jlcy9yYXcvbm9pc2VfMmNoXzIyXzA1a2h6X2FvdDQyXzE5X2x1ZnNfbXA0Lm00YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hMTY0MDM2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvcmVzL3Jhdy9ub2lzZV8yY2hfMjJfMDVraHpfYW90NDJfMTlfbHVmc19tcDQubTRhCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3Jlcy9yYXcvbm9pc2VfMmNoXzMya2h6X2FvdDQyXzE5X2x1ZnNfZHJjX21wNC5tNGEgYi90ZXN0cy90ZXN0cy9tZWRpYS9yZXMvcmF3L25vaXNlXzJjaF8zMmtoel9hb3Q0Ml8xOV9sdWZzX2RyY19tcDQubTRhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU4MDZkM2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9tZWRpYS9yZXMvcmF3L25vaXNlXzJjaF8zMmtoel9hb3Q0Ml8xOV9sdWZzX2RyY19tcDQubTRhCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3Jlcy9yYXcvbm9pc2VfMmNoXzM1XzI4a2h6X2FvdDQyXzE5X2x1ZnNfZHJjX2NvbmZpZ19jaGFuZ2VfbXA0Lm00YSBiL3Rlc3RzL3Rlc3RzL21lZGlhL3Jlcy9yYXcvbm9pc2VfMmNoXzM1XzI4a2h6X2FvdDQyXzE5X2x1ZnNfZHJjX2NvbmZpZ19jaGFuZ2VfbXA0Lm00YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41MzM2ZDFiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvcmVzL3Jhdy9ub2lzZV8yY2hfMzVfMjhraHpfYW90NDJfMTlfbHVmc19kcmNfY29uZmlnX2NoYW5nZV9tcDQubTRhCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3Jlcy9yYXcvbm9pc2VfMmNoXzQ0XzFraHpfYW90NDJfMTlfbHVmc19jb25maWdfY2hhbmdlX21wNC5tNGEgYi90ZXN0cy90ZXN0cy9tZWRpYS9yZXMvcmF3L25vaXNlXzJjaF80NF8xa2h6X2FvdDQyXzE5X2x1ZnNfY29uZmlnX2NoYW5nZV9tcDQubTRhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBkYWY3ZmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9tZWRpYS9yZXMvcmF3L25vaXNlXzJjaF80NF8xa2h6X2FvdDQyXzE5X2x1ZnNfY29uZmlnX2NoYW5nZV9tcDQubTRhCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3Jlcy9yYXcvbm9pc2VfMmNoXzQ4a2h6X2FvdDQyXzE5X2x1ZnNfbXA0Lm00YSBiL3Rlc3RzL3Rlc3RzL21lZGlhL3Jlcy9yYXcvbm9pc2VfMmNoXzQ4a2h6X2FvdDQyXzE5X2x1ZnNfbXA0Lm00YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kYmZkNjEzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvcmVzL3Jhdy9ub2lzZV8yY2hfNDhraHpfYW90NDJfMTlfbHVmc19tcDQubTRhCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3Jlcy9yYXcvbm9pc2VfMmNoXzY0a2h6X2FvdDQyXzE5X2x1ZnNfbXA0Lm00YSBiL3Rlc3RzL3Rlc3RzL21lZGlhL3Jlcy9yYXcvbm9pc2VfMmNoXzY0a2h6X2FvdDQyXzE5X2x1ZnNfbXA0Lm00YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNzczOWRmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvcmVzL3Jhdy9ub2lzZV8yY2hfNjRraHpfYW90NDJfMTlfbHVmc19tcDQubTRhCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3Jlcy9yYXcvbm9pc2VfMmNoXzg4XzJraHpfYW90NDJfMTlfbHVmc19tcDQubTRhIGIvdGVzdHMvdGVzdHMvbWVkaWEvcmVzL3Jhdy9ub2lzZV8yY2hfODhfMmtoel9hb3Q0Ml8xOV9sdWZzX21wNC5tNGEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzkzZWE1ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL21lZGlhL3Jlcy9yYXcvbm9pc2VfMmNoXzg4XzJraHpfYW90NDJfMTlfbHVmc19tcDQubTRhCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3Jlcy9yYXcvdGVzdG1wM180Lm1wMyBiL3Rlc3RzL3Rlc3RzL21lZGlhL3Jlcy9yYXcvdGVzdG1wM180Lm1wMwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yMDk4ZWJkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvcmVzL3Jhdy90ZXN0bXAzXzQubXAzCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3Jlcy9yYXcvdmlkZW9fMTI4MHg3MjBfaGV2Y19oZHIxMF9zdGF0aWNfM21icHMubXA0IGIvdGVzdHMvdGVzdHMvbWVkaWEvcmVzL3Jhdy92aWRlb18xMjgweDcyMF9oZXZjX2hkcjEwX3N0YXRpY18zbWJwcy5tcDQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcxNTBkNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL21lZGlhL3Jlcy9yYXcvdmlkZW9fMTI4MHg3MjBfaGV2Y19oZHIxMF9zdGF0aWNfM21icHMubXA0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3Jlcy9yYXcvdmlkZW9fMTI4MHg3MjBfbWt2X2gyNjVfNTAwa2Jwc18yNWZwc19hYWNfc3RlcmVvXzEyOGticHNfNDQxMDBoei5ta3YgYi90ZXN0cy90ZXN0cy9tZWRpYS9yZXMvcmF3L3ZpZGVvXzEyODB4NzIwX21rdl9oMjY1XzUwMGticHNfMjVmcHNfYWFjX3N0ZXJlb18xMjhrYnBzXzQ0MTAwaHoubWt2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNmQzYWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9tZWRpYS9yZXMvcmF3L3ZpZGVvXzEyODB4NzIwX21rdl9oMjY1XzUwMGticHNfMjVmcHNfYWFjX3N0ZXJlb18xMjhrYnBzXzQ0MTAwaHoubWt2CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3Jlcy9yYXcvdmlkZW9fMTI4MHg3MjBfdnA5X2hkcl9zdGF0aWNfM21icHMubWt2IGIvdGVzdHMvdGVzdHMvbWVkaWEvcmVzL3Jhdy92aWRlb18xMjgweDcyMF92cDlfaGRyX3N0YXRpY18zbWJwcy5ta3YKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA2NzdmZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL21lZGlhL3Jlcy9yYXcvdmlkZW9fMTI4MHg3MjBfdnA5X2hkcl9zdGF0aWNfM21icHMubWt2CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi90ZXN0cy90ZXN0cy9tZWRpYS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCmluZGV4IGIwMWI4ZWMuLjAxOGFiNzAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL21lZGlhL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApAQCAtMTYsNCArMTYsNSBAQAogPHJlc291cmNlcz4KICAgICA8c3RyaW5nIG5hbWU9InRlc3RfdXNlcl9yb3V0ZV9uYW1lIj5Vc2VyIHJvdXRlXCdzIG5hbWUgZm9yIHRlc3Q8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRlc3Rfcm91dGVfY2F0ZWdvcnlfbmFtZSI+Um91dGUgY2F0ZWdvcnlcJ3MgbmFtZSBmb3IgdGVzdDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGVzdF9sb2NhbGl6YWJsZV90aXRsZSI+VHJhbnNsYXRhYmxlIFJpbmd0b25lIFRpdGxlPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9tZWRpYS9yZXMveG1sL25ldHdvcmtfc2VjdXJpdHlfY29uZmlnLnhtbCBiL3Rlc3RzL3Rlc3RzL21lZGlhL3Jlcy94bWwvbmV0d29ya19zZWN1cml0eV9jb25maWcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNWMwOWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9tZWRpYS9yZXMveG1sL25ldHdvcmtfc2VjdXJpdHlfY29uZmlnLnhtbApAQCAtMCwwICsxLDQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8bmV0d29yay1zZWN1cml0eS1jb25maWc+CisgICAgPGJhc2UtY29uZmlnIGNsZWFydGV4dFRyYWZmaWNQZXJtaXR0ZWQ9InRydWUiLz4KKzwvbmV0d29yay1zZWN1cml0eS1jb25maWc+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvLmdvdXRwdXRzdHJlYW0tOUtaWUpaIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzLy5nb3V0cHV0c3RyZWFtLTlLWllKWgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTc2OWFjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzLy5nb3V0cHV0c3RyZWFtLTlLWllKWgpAQCAtMCwwICsxLDgxNCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS5jdHM7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkJ1ZmZlcmluZ1BhcmFtczsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkRhdGFTb3VyY2VEZXNjOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFGb3JtYXQ7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcjI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcjIuVHJhY2tJbmZvOworaW1wb3J0IGFuZHJvaWQubWVkaWEuVGltZWRNZXRhRGF0YTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmN0cy5UZXN0VXRpbHMuTW9uaXRvcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Qb3dlck1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CitpbXBvcnQgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5jdHMuQ3RzVGVzdFNlcnZlcjsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuRHluYW1pY0NvbmZpZ0RldmljZVNpZGU7CitpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5NZWRpYVV0aWxzOworCitpbXBvcnQgamF2YS5uZXQuSHR0cENvb2tpZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBUZXN0cyBvZiBNZWRpYVBsYXllcjIgc3RyZWFtaW5nIGNhcGFiaWxpdGllcy4KKyAqLworQEFwcE1vZGVGdWxsKHJlYXNvbiA9ICJUT0RPOiBldmFsdWF0ZSBhbmQgcG9ydCB0byBpbnN0YW50IikKK3B1YmxpYyBjbGFzcyBTdHJlYW1pbmdNZWRpYVBsYXllcjJUZXN0IGV4dGVuZHMgTWVkaWFQbGF5ZXIyVGVzdEJhc2UgeworICAgIC8vIFRPRE86IHJlbW92ZSB0aGlzIGZsYWcgdG8gZW5hYmxlIHRlc3RzLgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gSUdOT1JFX1RFU1RTID0gdHJ1ZTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3RyZWFtaW5nTWVkaWFQbGF5ZXIyVGVzdCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9IMjYzX0FNUl9WSURFT18xX0tFWSA9CisgICAgICAgICAgICAic3RyZWFtaW5nX21lZGlhX3BsYXllcl90ZXN0X2h0dHBfaDI2M19hbXJfdmlkZW8xIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9IMjYzX0FNUl9WSURFT18yX0tFWSA9CisgICAgICAgICAgICAic3RyZWFtaW5nX21lZGlhX3BsYXllcl90ZXN0X2h0dHBfaDI2M19hbXJfdmlkZW8yIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9IMjY0X0JBU0VfQUFDX1ZJREVPXzFfS0VZID0KKyAgICAgICAgICAgICJzdHJlYW1pbmdfbWVkaWFfcGxheWVyX3Rlc3RfaHR0cF9oMjY0X2Jhc2VfYWFjX3ZpZGVvMSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfSDI2NF9CQVNFX0FBQ19WSURFT18yX0tFWSA9CisgICAgICAgICAgICAic3RyZWFtaW5nX21lZGlhX3BsYXllcl90ZXN0X2h0dHBfaDI2NF9iYXNlX2FhY192aWRlbzIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX01QRUc0X1NQX0FBQ19WSURFT18xX0tFWSA9CisgICAgICAgICAgICAic3RyZWFtaW5nX21lZGlhX3BsYXllcl90ZXN0X2h0dHBfbXBlZzRfc3BfYWFjX3ZpZGVvMSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfTVBFRzRfU1BfQUFDX1ZJREVPXzJfS0VZID0KKyAgICAgICAgICAgICJzdHJlYW1pbmdfbWVkaWFfcGxheWVyX3Rlc3RfaHR0cF9tcGVnNF9zcF9hYWNfdmlkZW8yIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX05BTUUgPSAiQ3RzTWVkaWFUZXN0Q2FzZXMiOworICAgIHByaXZhdGUgRHluYW1pY0NvbmZpZ0RldmljZVNpZGUgZHluYW1pY0NvbmZpZzsKKworICAgIHByaXZhdGUgQ3RzVGVzdFNlcnZlciBtU2VydmVyOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbUlucHV0VXJsOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gaWYgbGF1bmNoZWQgd2l0aCBJbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIHRvIHBhc3MgYSBjb21tYW5kIGxpbmUgYXJndW1lbnQKKyAgICAgICAgaWYgKGdldEluc3RydW1lbnRhdGlvbigpIGluc3RhbmNlb2YgSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcikgeworICAgICAgICAgICAgSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciB0ZXN0UnVubmVyID0KKyAgICAgICAgICAgICAgICAgICAgKEluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIpZ2V0SW5zdHJ1bWVudGF0aW9uKCk7CisKKyAgICAgICAgICAgIEJ1bmRsZSBhcmd1bWVudHMgPSB0ZXN0UnVubmVyLmdldEFyZ3VtZW50cygpOworICAgICAgICAgICAgbUlucHV0VXJsID0gYXJndW1lbnRzLmdldFN0cmluZygidXJsIik7CisgICAgICAgICAgICBMb2cudihUQUcsICJzZXRVcDogYXJndW1lbnRzOiAiICsgYXJndW1lbnRzKTsKKyAgICAgICAgICAgIGlmIChtSW5wdXRVcmwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIExvZy52KFRBRywgInNldFVwOiBhcmd1bWVudHNbdXJsXSAiICsgbUlucHV0VXJsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgIGR5bmFtaWNDb25maWcgPSBuZXcgRHluYW1pY0NvbmZpZ0RldmljZVNpZGUoTU9EVUxFX05BTUUpOworICAgIH0KKworLyogUlRTUCB0ZXN0cyBhcmUgbW9yZSBmbGFreSBhbmQgdnVsbmVyYWJsZSB0byBuZXR3b3JrIGNvbmRpdGlvbi4KKyAgIERpc2FibGUgdW50aWwgYmV0dGVyIHNvbHV0aW9uIGlzIGF2YWlsYWJsZQorICAgIC8vIFN0cmVhbWluZyBSVFNQIHZpZGVvIGZyb20gWW91VHViZQorICAgIHB1YmxpYyB2b2lkIHRlc3RSVFNQX0gyNjNfQU1SX1ZpZGVvMSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBwbGF5VmlkZW9UZXN0KCJydHNwOi8vdjIuY2FjaGU3LmMueW91dHViZS5jb20vdmlkZW8uM2dwP2NpZD0weDI3MWRlOTc1NjA2NTY3N2UiCisgICAgICAgICAgICAgICAgKyAiJmZtdD0xMyZ1c2VyPWFuZHJvaWQtZGV2aWNlLXRlc3QiLCAxNzYsIDE0NCk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RSVFNQX0gyNjNfQU1SX1ZpZGVvMigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBwbGF5VmlkZW9UZXN0KCJydHNwOi8vdjIuY2FjaGU3LmMueW91dHViZS5jb20vdmlkZW8uM2dwP2NpZD0weGM4MDY1ODQ5NWFmNjA2MTciCisgICAgICAgICAgICAgICAgKyAiJmZtdD0xMyZ1c2VyPWFuZHJvaWQtZGV2aWNlLXRlc3QiLCAxNzYsIDE0NCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJUU1BfTVBFRzRTUF9BQUNfVmlkZW8xKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHBsYXlWaWRlb1Rlc3QoInJ0c3A6Ly92Mi5jYWNoZTcuYy55b3V0dWJlLmNvbS92aWRlby4zZ3A/Y2lkPTB4MjcxZGU5NzU2MDY1Njc3ZSIKKyAgICAgICAgICAgICAgICArICImZm10PTE3JnVzZXI9YW5kcm9pZC1kZXZpY2UtdGVzdCIsIDE3NiwgMTQ0KTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdFJUU1BfTVBFRzRTUF9BQUNfVmlkZW8yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHBsYXlWaWRlb1Rlc3QoInJ0c3A6Ly92Mi5jYWNoZTcuYy55b3V0dWJlLmNvbS92aWRlby4zZ3A/Y2lkPTB4YzgwNjU4NDk1YWY2MDYxNyIKKyAgICAgICAgICAgICAgICArICImZm10PTE3JnVzZXI9YW5kcm9pZC1kZXZpY2UtdGVzdCIsIDE3NiwgMTQ0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UlRTUF9IMjY0QmFzZV9BQUNfVmlkZW8xKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHBsYXlWaWRlb1Rlc3QoInJ0c3A6Ly92Mi5jYWNoZTcuYy55b3V0dWJlLmNvbS92aWRlby4zZ3A/Y2lkPTB4MjcxZGU5NzU2MDY1Njc3ZSIKKyAgICAgICAgICAgICAgICArICImZm10PTE4JnVzZXI9YW5kcm9pZC1kZXZpY2UtdGVzdCIsIDQ4MCwgMjcwKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdFJUU1BfSDI2NEJhc2VfQUFDX1ZpZGVvMigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBwbGF5VmlkZW9UZXN0KCJydHNwOi8vdjIuY2FjaGU3LmMueW91dHViZS5jb20vdmlkZW8uM2dwP2NpZD0weGM4MDY1ODQ5NWFmNjA2MTciCisgICAgICAgICAgICAgICAgKyAiJmZtdD0xOCZ1c2VyPWFuZHJvaWQtZGV2aWNlLXRlc3QiLCA0ODAsIDI3MCk7CisgICAgfQorKi8KKyAgICAvLyBTdHJlYW1pbmcgSFRUUCB2aWRlbyBmcm9tIFlvdVR1YmUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SFRUUF9IMjYzX0FNUl9WaWRlbzEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKElHTk9SRV9URVNUUykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICghTWVkaWFVdGlscy5jaGVja0RlY29kZXIoTWVkaWFGb3JtYXQuTUlNRVRZUEVfVklERU9fSDI2MywKKyAgICAgICAgICAgICAgICAgIE1lZGlhRm9ybWF0Lk1JTUVUWVBFX0FVRElPX0FNUl9OQikpIHsKKyAgICAgICAgICAgIHJldHVybjsgLy8gc2tpcAorICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHVybFN0cmluZyA9IGR5bmFtaWNDb25maWcuZ2V0VmFsdWUoSFRUUF9IMjYzX0FNUl9WSURFT18xX0tFWSk7CisgICAgICAgIHBsYXlWaWRlb1Rlc3QodXJsU3RyaW5nLCAxNzYsIDE0NCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEhUVFBfSDI2M19BTVJfVmlkZW8yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChJR05PUkVfVEVTVFMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIU1lZGlhVXRpbHMuY2hlY2tEZWNvZGVyKE1lZGlhRm9ybWF0Lk1JTUVUWVBFX1ZJREVPX0gyNjMsCisgICAgICAgICAgICAgICAgICBNZWRpYUZvcm1hdC5NSU1FVFlQRV9BVURJT19BTVJfTkIpKSB7CisgICAgICAgICAgICByZXR1cm47IC8vIHNraXAKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyB1cmxTdHJpbmcgPSBkeW5hbWljQ29uZmlnLmdldFZhbHVlKEhUVFBfSDI2M19BTVJfVklERU9fMl9LRVkpOworICAgICAgICBwbGF5VmlkZW9UZXN0KHVybFN0cmluZywgMTc2LCAxNDQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RIVFRQX01QRUc0U1BfQUFDX1ZpZGVvMSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoSUdOT1JFX1RFU1RTKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFNZWRpYVV0aWxzLmNoZWNrRGVjb2RlcihNZWRpYUZvcm1hdC5NSU1FVFlQRV9WSURFT19NUEVHNCkpIHsKKyAgICAgICAgICAgIHJldHVybjsgLy8gc2tpcAorICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHVybFN0cmluZyA9IGR5bmFtaWNDb25maWcuZ2V0VmFsdWUoSFRUUF9NUEVHNF9TUF9BQUNfVklERU9fMV9LRVkpOworICAgICAgICBwbGF5VmlkZW9UZXN0KHVybFN0cmluZywgMTc2LCAxNDQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RIVFRQX01QRUc0U1BfQUFDX1ZpZGVvMigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoSUdOT1JFX1RFU1RTKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFNZWRpYVV0aWxzLmNoZWNrRGVjb2RlcihNZWRpYUZvcm1hdC5NSU1FVFlQRV9WSURFT19NUEVHNCkpIHsKKyAgICAgICAgICAgIHJldHVybjsgLy8gc2tpcAorICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHVybFN0cmluZyA9IGR5bmFtaWNDb25maWcuZ2V0VmFsdWUoSFRUUF9NUEVHNF9TUF9BQUNfVklERU9fMl9LRVkpOworICAgICAgICBwbGF5VmlkZW9UZXN0KHVybFN0cmluZywgMTc2LCAxNDQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RIVFRQX0gyNjRCYXNlX0FBQ19WaWRlbzEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKElHTk9SRV9URVNUUykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICghTWVkaWFVdGlscy5jaGVja0RlY29kZXIoTWVkaWFGb3JtYXQuTUlNRVRZUEVfVklERU9fQVZDKSkgeworICAgICAgICAgICAgcmV0dXJuOyAvLyBza2lwCisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgdXJsU3RyaW5nID0gZHluYW1pY0NvbmZpZy5nZXRWYWx1ZShIVFRQX0gyNjRfQkFTRV9BQUNfVklERU9fMV9LRVkpOworICAgICAgICBwbGF5VmlkZW9UZXN0KHVybFN0cmluZywgNjQwLCAzNjApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RIVFRQX0gyNjRCYXNlX0FBQ19WaWRlbzIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKElHTk9SRV9URVNUUykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICghTWVkaWFVdGlscy5jaGVja0RlY29kZXIoTWVkaWFGb3JtYXQuTUlNRVRZUEVfVklERU9fQVZDKSkgeworICAgICAgICAgICAgcmV0dXJuOyAvLyBza2lwCisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgdXJsU3RyaW5nID0gZHluYW1pY0NvbmZpZy5nZXRWYWx1ZShIVFRQX0gyNjRfQkFTRV9BQUNfVklERU9fMl9LRVkpOworICAgICAgICBwbGF5VmlkZW9UZXN0KHVybFN0cmluZywgNjQwLCAzNjApOworICAgIH0KKworICAgIC8vIFN0cmVhbWluZyBITFMgdmlkZW8gZnJvbSBZb3VUdWJlCisgICAgcHVibGljIHZvaWQgdGVzdEhMUygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoSUdOT1JFX1RFU1RTKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFNZWRpYVV0aWxzLmNoZWNrRGVjb2RlcihNZWRpYUZvcm1hdC5NSU1FVFlQRV9WSURFT19BVkMpKSB7CisgICAgICAgICAgICByZXR1cm47IC8vIHNraXAKKyAgICAgICAgfQorCisgICAgICAgIC8vIFBsYXkgc3RyZWFtIGZvciA2MCBzZWNvbmRzCisgICAgICAgIHBsYXlMaXZlVmlkZW9UZXN0KCJodHRwOi8vd3d3LnlvdXR1YmUuY29tL2FwaS9tYW5pZmVzdC9obHNfdmFyaWFudC9pZC8iCisgICAgICAgICAgICAgICAgKyAiMDE2ODcyNGQwMmJkOTk0NS9pdGFnLzUvc291cmNlL3lvdXR1YmUvcGxheWxpc3RfdHlwZS9EVlIvaXAvIgorICAgICAgICAgICAgICAgICsgIjAuMC4wLjAvaXBiaXRzLzAvZXhwaXJlLzE5MDAwMDAwMDAwL3NwYXJhbXMvaXAsaXBiaXRzLGV4cGlyZSIKKyAgICAgICAgICAgICAgICArICIsaWQsaXRhZyxzb3VyY2UscGxheWxpc3RfdHlwZS9zaWduYXR1cmUvNzczQUI4QUNDNjhBOTZFNUFBNDgiCisgICAgICAgICAgICAgICAgKyAiMTk5NkFENkExQkJDQjcwRENCODcuOTU3MzNCNTQ0QUNDNUYwMUExMjIzQTgzN0QyQ0YwNERGODVBMzM2IgorICAgICAgICAgICAgICAgICsgIjAva2V5L2lrMC9maWxlL20zdTgiLCA2MCAqIDEwMDApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RIbHNXaXRoSGVhZGVyc0Nvb2tpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKElHTk9SRV9URVNUUykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICghTWVkaWFVdGlscy5jaGVja0RlY29kZXIoTWVkaWFGb3JtYXQuTUlNRVRZUEVfVklERU9fQVZDKSkgeworICAgICAgICAgICAgcmV0dXJuOyAvLyBza2lwCisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBVcmkgdXJpID0gVXJpLnBhcnNlKAorICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnlvdXR1YmUuY29tL2FwaS9tYW5pZmVzdC9obHNfdmFyaWFudC9pZC8iCisgICAgICAgICAgICAgICAgKyAiMDE2ODcyNGQwMmJkOTk0NS9pdGFnLzUvc291cmNlL3lvdXR1YmUvcGxheWxpc3RfdHlwZS9EVlIvaXAvIgorICAgICAgICAgICAgICAgICsgIjAuMC4wLjAvaXBiaXRzLzAvZXhwaXJlLzE5MDAwMDAwMDAwL3NwYXJhbXMvaXAsaXBiaXRzLGV4cGlyZSIKKyAgICAgICAgICAgICAgICArICIsaWQsaXRhZyxzb3VyY2UscGxheWxpc3RfdHlwZS9zaWduYXR1cmUvNzczQUI4QUNDNjhBOTZFNUFBNDgiCisgICAgICAgICAgICAgICAgKyAiMTk5NkFENkExQkJDQjcwRENCODcuOTU3MzNCNTQ0QUNDNUYwMUExMjIzQTgzN0QyQ0YwNERGODVBMzM2IgorICAgICAgICAgICAgICAgICsgIjAva2V5L2lrMC9maWxlL20zdTgiKTsKKworICAgICAgICAvLyBUT0RPOiBkdW1teSB2YWx1ZXMgZm9yIGhlYWRlcnMvY29va2llcyB0aWxsIHdlIGZpbmQgYSBzZXJ2ZXIgdGhhdCBhY3R1YWxseSBuZWVkcyB0aGVtCisgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIGhlYWRlcnMucHV0KCJoZWFkZXIwIiwgInZhbHVlMCIpOworICAgICAgICBoZWFkZXJzLnB1dCgiaGVhZGVyMSIsICJ2YWx1ZTEiKTsKKworICAgICAgICBTdHJpbmcgY29va2llTmFtZSA9ICJhdXRoXzEyMzQ1NjciOworICAgICAgICBTdHJpbmcgY29va2llVmFsdWUgPSAiMDEyMzQ1Njc4OUFCQ0RFRjAxMjM0NTY3ODlBQkNERUYiOworICAgICAgICBIdHRwQ29va2llIGNvb2tpZSA9IG5ldyBIdHRwQ29va2llKGNvb2tpZU5hbWUsIGNvb2tpZVZhbHVlKTsKKyAgICAgICAgY29va2llLnNldEh0dHBPbmx5KHRydWUpOworICAgICAgICBjb29raWUuc2V0RG9tYWluKCJ3d3cueW91dHViZS5jb20iKTsKKyAgICAgICAgY29va2llLnNldFBhdGgoIi8iKTsgICAgICAgIC8vIGFsbCBwYXRocworICAgICAgICBjb29raWUuc2V0U2VjdXJlKGZhbHNlKTsKKyAgICAgICAgY29va2llLnNldERpc2NhcmQoZmFsc2UpOworICAgICAgICBjb29raWUuc2V0TWF4QWdlKDI0ICogMzYwMCk7ICAvLyAyNGhycworCisgICAgICAgIGphdmEudXRpbC5WZWN0b3I8SHR0cENvb2tpZT4gY29va2llcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yPEh0dHBDb29raWU+KCk7CisgICAgICAgIGNvb2tpZXMuYWRkKGNvb2tpZSk7CisKKyAgICAgICAgLy8gUGxheSBzdHJlYW0gZm9yIDYwIHNlY29uZHMKKyAgICAgICAgcGxheUxpdmVWaWRlb1Rlc3QodXJpLCBoZWFkZXJzLCBjb29raWVzLCA2MCAqIDEwMDApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RIbHNTYW1wbGVBZXNfYmJiX2F1ZGlvX29ubHlfb3ZlcnJpZGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKElHTk9SRV9URVNUUykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICghTWVkaWFVdGlscy5jaGVja0RlY29kZXIoTWVkaWFGb3JtYXQuTUlNRVRZUEVfVklERU9fQVZDKSkgeworICAgICAgICAgICAgcmV0dXJuOyAvLyBza2lwCisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgZGVmYXVsdFVybCA9ICJodHRwOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS93dm1lZGlhL2NlbmMvaGxzL3NhbXBsZV9hZXMvIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJiYl8xMDgwcF8zMGZwc18xMW1pbi9hdWRpb19vbmx5L3Byb2dfaW5kZXgubTN1OCI7CisKKyAgICAgICAgLy8gaWYgdXJsIG92ZXJyaWRlIHByb3ZpZGVkCisgICAgICAgIFN0cmluZyB0ZXN0VXJsID0gKG1JbnB1dFVybCAhPSBudWxsKSA/IG1JbnB1dFVybCA6IGRlZmF1bHRVcmw7CisKKyAgICAgICAgLy8gUGxheSBzdHJlYW0gZm9yIDYwIHNlY29uZHMKKyAgICAgICAgcGxheUxpdmVBdWRpb09ubHlUZXN0KAorICAgICAgICAgICAgICAgIHRlc3RVcmwsCisgICAgICAgICAgICAgICAgNjAgKiAxMDAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGxzU2FtcGxlQWVzX2JiYl91bm11eGVkXzE1MDBrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChJR05PUkVfVEVTVFMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIU1lZGlhVXRpbHMuY2hlY2tEZWNvZGVyKE1lZGlhRm9ybWF0Lk1JTUVUWVBFX1ZJREVPX0FWQykpIHsKKyAgICAgICAgICAgIHJldHVybjsgLy8gc2tpcAorICAgICAgICB9CisKKyAgICAgICAgLy8gUGxheSBzdHJlYW0gZm9yIDYwIHNlY29uZHMKKyAgICAgICAgcGxheUxpdmVWaWRlb1Rlc3QoCisgICAgICAgICAgICAgICAgImh0dHA6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3d2bWVkaWEvY2VuYy9obHMvc2FtcGxlX2Flcy8iICsKKyAgICAgICAgICAgICAgICAiYmJiXzEwODBwXzMwZnBzXzExbWluL3VubXV4ZWRfMTUwMGsvcHJvZ19pbmRleC5tM3U4IiwKKyAgICAgICAgICAgICAgICA2MCAqIDEwMDApOworICAgIH0KKworCisgICAgLy8gU3RyZWFtaW5nIGF1ZGlvIGZyb20gbG9jYWwgSFRUUCBzZXJ2ZXIKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGxheU1wM1N0cmVhbTEoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgaWYgKElHTk9SRV9URVNUUykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGxvY2FsSHR0cEF1ZGlvU3RyZWFtVGVzdCgicmluZ2VyLm1wMyIsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RQbGF5TXAzU3RyZWFtMigpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBpZiAoSUdOT1JFX1RFU1RTKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbG9jYWxIdHRwQXVkaW9TdHJlYW1UZXN0KCJyaW5nZXIubXAzIiwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdFBsYXlNcDNTdHJlYW1SZWRpcmVjdCgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBpZiAoSUdOT1JFX1RFU1RTKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbG9jYWxIdHRwQXVkaW9TdHJlYW1UZXN0KCJyaW5nZXIubXAzIiwgdHJ1ZSwgZmFsc2UpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGxheU1wM1N0cmVhbU5vTGVuZ3RoKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGlmIChJR05PUkVfVEVTVFMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBsb2NhbEh0dHBBdWRpb1N0cmVhbVRlc3QoIm5vaXNlYW5kY2hpcnBzLm1wMyIsIGZhbHNlLCB0cnVlKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdFBsYXlPZ2dTdHJlYW0oKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgaWYgKElHTk9SRV9URVNUUykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGxvY2FsSHR0cEF1ZGlvU3RyZWFtVGVzdCgibm9pc2VhbmRjaGlycHMub2dnIiwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdFBsYXlPZ2dTdHJlYW1SZWRpcmVjdCgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBpZiAoSUdOT1JFX1RFU1RTKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbG9jYWxIdHRwQXVkaW9TdHJlYW1UZXN0KCJub2lzZWFuZGNoaXJwcy5vZ2ciLCB0cnVlLCBmYWxzZSk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RQbGF5T2dnU3RyZWFtTm9MZW5ndGgoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgaWYgKElHTk9SRV9URVNUUykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGxvY2FsSHR0cEF1ZGlvU3RyZWFtVGVzdCgibm9pc2VhbmRjaGlycHMub2dnIiwgZmFsc2UsIHRydWUpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGxheU1wM1N0cmVhbTFTc2woKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgaWYgKElHTk9SRV9URVNUUykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGxvY2FsSHR0cHNBdWRpb1N0cmVhbVRlc3QoInJpbmdlci5tcDMiLCBmYWxzZSwgZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBsb2NhbEh0dHBBdWRpb1N0cmVhbVRlc3QoZmluYWwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gcmVkaXJlY3QsIGJvb2xlYW4gbm9sZW5ndGgpCisgICAgICAgICAgICB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgbVNlcnZlciA9IG5ldyBDdHNUZXN0U2VydmVyKG1Db250ZXh0KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmluZyBzdHJlYW1fdXJsID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChyZWRpcmVjdCkgeworICAgICAgICAgICAgICAgIC8vIFN0YWdlZnJpZ2h0IGRvZXNuJ3QgaGF2ZSBhIGxpbWl0LCBidXQgd2UgY2FuJ3QgdGVzdCBzdXBwb3J0IG9mIGluZmluaXRlIHJlZGlyZWN0cworICAgICAgICAgICAgICAgIC8vIFVwIHRvIDQgcmVkaXJlY3RzIHNlZW1zIHJlYXNvbmFibGUgdGhvdWdoLgorICAgICAgICAgICAgICAgIHN0cmVhbV91cmwgPSBtU2VydmVyLmdldFJlZGlyZWN0aW5nQXNzZXRVcmwobmFtZSwgNCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0cmVhbV91cmwgPSBtU2VydmVyLmdldEFzc2V0VXJsKG5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5vbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtX3VybCA9IHN0cmVhbV91cmwgKyAiPyIgKyBDdHNUZXN0U2VydmVyLk5PTEVOR1RIX1BPU1RGSVg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghTWVkaWFVdGlscy5jaGVja0NvZGVjc0ZvclBhdGgobUNvbnRleHQsIHN0cmVhbV91cmwpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBza2lwCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIFVyaSB1cmkgPSBVcmkucGFyc2Uoc3RyZWFtX3VybCk7CisgICAgICAgICAgICBtUGxheWVyLnNldERhdGFTb3VyY2UobmV3IERhdGFTb3VyY2VEZXNjLkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAuc2V0RGF0YVNvdXJjZShtQ29udGV4dCwgdXJpKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgICAgIG1QbGF5ZXIuc2V0RGlzcGxheShnZXRBY3Rpdml0eSgpLmdldFN1cmZhY2VIb2xkZXIoKSk7CisgICAgICAgICAgICBtUGxheWVyLnNldFNjcmVlbk9uV2hpbGVQbGF5aW5nKHRydWUpOworCisgICAgICAgICAgICBtT25CdWZmZXJpbmdVcGRhdGVDYWxsZWQucmVzZXQoKTsKKyAgICAgICAgICAgIE1lZGlhUGxheWVyMi5NZWRpYVBsYXllcjJFdmVudENhbGxiYWNrIGVjYiA9CisgICAgICAgICAgICAgICAgbmV3IE1lZGlhUGxheWVyMi5NZWRpYVBsYXllcjJFdmVudENhbGxiYWNrKCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCwgaW50IHdoYXQsIGludCBleHRyYSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbCgiTWVkaWEgcGxheWVyIGhhZCBlcnJvciAiICsgd2hhdCArICIgcGxheWluZyAiICsgbmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25JbmZvKE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkLCBpbnQgd2hhdCwgaW50IGV4dHJhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2hhdCA9PSBNZWRpYVBsYXllcjIuTUVESUFfSU5GT19QUkVQQVJFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PblByZXBhcmVDYWxsZWQuc2lnbmFsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gTWVkaWFQbGF5ZXIyLk1FRElBX0lORk9fQlVGRkVSSU5HX1VQREFURSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PbkJ1ZmZlcmluZ1VwZGF0ZUNhbGxlZC5zaWduYWwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICBtUGxheWVyLnNldE1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2sobUV4ZWN1dG9yLCBlY2IpOworCisgICAgICAgICAgICBhc3NlcnRGYWxzZShtT25CdWZmZXJpbmdVcGRhdGVDYWxsZWQuaXNTaWduYWxsZWQoKSk7CisKKyAgICAgICAgICAgIG1QbGF5ZXIucHJlcGFyZSgpOworICAgICAgICAgICAgbU9uUHJlcGFyZUNhbGxlZC53YWl0Rm9yU2lnbmFsKCk7CisKKyAgICAgICAgICAgIGlmIChub2xlbmd0aCkgeworICAgICAgICAgICAgICAgIG1QbGF5ZXIucGxheSgpOworICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChMT05HX1NMRUVQX1RJTUUpOworICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKG1QbGF5ZXIuaXNQbGF5aW5nKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtT25CdWZmZXJpbmdVcGRhdGVDYWxsZWQud2FpdEZvclNpZ25hbCgpOworICAgICAgICAgICAgICAgIG1QbGF5ZXIucGxheSgpOworICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChTTEVFUF9USU1FKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1QbGF5ZXIuc3RvcCgpOworICAgICAgICAgICAgbVBsYXllci5yZXNldCgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgbVNlcnZlci5zaHV0ZG93bigpOworICAgICAgICB9CisgICAgfQorICAgIHByaXZhdGUgdm9pZCBsb2NhbEh0dHBzQXVkaW9TdHJlYW1UZXN0KGZpbmFsIFN0cmluZyBuYW1lLCBib29sZWFuIHJlZGlyZWN0LCBib29sZWFuIG5vbGVuZ3RoKQorICAgICAgICAgICAgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIG1TZXJ2ZXIgPSBuZXcgQ3RzVGVzdFNlcnZlcihtQ29udGV4dCwgdHJ1ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmcgc3RyZWFtX3VybCA9IG51bGw7CisgICAgICAgICAgICBpZiAocmVkaXJlY3QpIHsKKyAgICAgICAgICAgICAgICAvLyBTdGFnZWZyaWdodCBkb2Vzbid0IGhhdmUgYSBsaW1pdCwgYnV0IHdlIGNhbid0IHRlc3Qgc3VwcG9ydCBvZiBpbmZpbml0ZSByZWRpcmVjdHMKKyAgICAgICAgICAgICAgICAvLyBVcCB0byA0IHJlZGlyZWN0cyBzZWVtcyByZWFzb25hYmxlIHRob3VnaC4KKyAgICAgICAgICAgICAgICBzdHJlYW1fdXJsID0gbVNlcnZlci5nZXRSZWRpcmVjdGluZ0Fzc2V0VXJsKG5hbWUsIDQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdHJlYW1fdXJsID0gbVNlcnZlci5nZXRBc3NldFVybChuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChub2xlbmd0aCkgeworICAgICAgICAgICAgICAgIHN0cmVhbV91cmwgPSBzdHJlYW1fdXJsICsgIj8iICsgQ3RzVGVzdFNlcnZlci5OT0xFTkdUSF9QT1NURklYOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBVcmkgdXJpID0gVXJpLnBhcnNlKHN0cmVhbV91cmwpOworICAgICAgICAgICAgbVBsYXllci5zZXREYXRhU291cmNlKG5ldyBEYXRhU291cmNlRGVzYy5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgLnNldERhdGFTb3VyY2UobUNvbnRleHQsIHVyaSkKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgICAgICBtUGxheWVyLnNldERpc3BsYXkoZ2V0QWN0aXZpdHkoKS5nZXRTdXJmYWNlSG9sZGVyKCkpOworICAgICAgICAgICAgbVBsYXllci5zZXRTY3JlZW5PbldoaWxlUGxheWluZyh0cnVlKTsKKworICAgICAgICAgICAgbU9uQnVmZmVyaW5nVXBkYXRlQ2FsbGVkLnJlc2V0KCk7CisKKyAgICAgICAgICAgIE1lZGlhUGxheWVyMi5NZWRpYVBsYXllcjJFdmVudENhbGxiYWNrIGVjYiA9CisgICAgICAgICAgICAgICAgbmV3IE1lZGlhUGxheWVyMi5NZWRpYVBsYXllcjJFdmVudENhbGxiYWNrKCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCwgaW50IHdoYXQsIGludCBleHRyYSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbU9uRXJyb3JDYWxsZWQuc2lnbmFsKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25JbmZvKE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkLCBpbnQgd2hhdCwgaW50IGV4dHJhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2hhdCA9PSBNZWRpYVBsYXllcjIuTUVESUFfSU5GT19QUkVQQVJFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PblByZXBhcmVDYWxsZWQuc2lnbmFsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gTWVkaWFQbGF5ZXIyLk1FRElBX0lORk9fQlVGRkVSSU5HX1VQREFURSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PbkJ1ZmZlcmluZ1VwZGF0ZUNhbGxlZC5zaWduYWwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICBtUGxheWVyLnNldE1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2sobUV4ZWN1dG9yLCBlY2IpOworCisgICAgICAgICAgICBhc3NlcnRGYWxzZShtT25CdWZmZXJpbmdVcGRhdGVDYWxsZWQuaXNTaWduYWxsZWQoKSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1QbGF5ZXIucHJlcGFyZSgpOworICAgICAgICAgICAgICAgIG1PbkVycm9yQ2FsbGVkLndhaXRGb3JTaWduYWwoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIG1TZXJ2ZXIuc2h1dGRvd24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRPRE86IHVuaGlkZSB0aGlzIHRlc3Qgd2hlbiB3ZSBzb3J0IG91dCBob3cgdG8gZXhwb3NlIGJ1ZmZlcmluZyBjb250cm9sIEFQSS4KKyAgICBwcml2YXRlIHZvaWQgZG9UZXN0QnVmZmVyaW5nKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gInJpbmdlci5tcDMiOworICAgICAgICBtU2VydmVyID0gbmV3IEN0c1Rlc3RTZXJ2ZXIobUNvbnRleHQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RyaW5nIHN0cmVhbV91cmwgPSBtU2VydmVyLmdldEFzc2V0VXJsKG5hbWUpOworCisgICAgICAgICAgICBpZiAoIU1lZGlhVXRpbHMuY2hlY2tDb2RlY3NGb3JQYXRoKG1Db250ZXh0LCBzdHJlYW1fdXJsKSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgImNhbiBub3QgZmluZCBzdHJlYW0gIiArIHN0cmVhbV91cmwgKyAiLCBza2lwcGluZyB0ZXN0Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBza2lwCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE1vbml0b3Igb25TZXRCdWZmZXJpbmdQYXJhbXNDYWxsZWQgPSBuZXcgTW9uaXRvcigpOworICAgICAgICAgICAgTWVkaWFQbGF5ZXIyLk1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2sgZWNiID0KKyAgICAgICAgICAgICAgICBuZXcgTWVkaWFQbGF5ZXIyLk1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2soKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkLCBpbnQgd2hhdCwgaW50IGV4dHJhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsKCJNZWRpYSBwbGF5ZXIgaGFkIGVycm9yICIgKyB3aGF0ICsgIiBwbGF5aW5nICIgKyBuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25JbmZvKE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkLCBpbnQgd2hhdCwgaW50IGV4dHJhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2hhdCA9PSBNZWRpYVBsYXllcjIuTUVESUFfSU5GT19CVUZGRVJJTkdfVVBEQVRFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU9uQnVmZmVyaW5nVXBkYXRlQ2FsbGVkLnNpZ25hbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNhbGxDb21wbGV0ZWQoTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdoYXQsIGludCBzdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aGF0ID09IE1lZGlhUGxheWVyMi5DQUxMX0NPTVBMRVRFRF9TRVRfQlVGRkVSSU5HX1BBUkFNUykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYWxsU3RhdHVzID0gc3RhdHVzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uU2V0QnVmZmVyaW5nUGFyYW1zQ2FsbGVkLnNpZ25hbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIG1QbGF5ZXIuc2V0TWVkaWFQbGF5ZXIyRXZlbnRDYWxsYmFjayhtRXhlY3V0b3IsIGVjYik7CisKKyAgICAgICAgICAgIC8vIGdldEJ1ZmZlcmluZ1BhcmFtcyBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIHNldERhdGFTb3VyY2UuCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEJ1ZmZlcmluZ1BhcmFtcyBwYXJhbXMgPSBtUGxheWVyLmdldEJ1ZmZlcmluZ1BhcmFtcygpOworICAgICAgICAgICAgICAgIGZhaWwoIk1lZGlhUGxheWVyMiBmYWlsZWQgdG8gY2hlY2sgc3RhdGUgZm9yIGdldEJ1ZmZlcmluZ1BhcmFtcyIpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBzZXRCdWZmZXJpbmdQYXJhbXMgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBzZXREYXRhU291cmNlLgorICAgICAgICAgICAgQnVmZmVyaW5nUGFyYW1zIHBhcmFtcyA9IG5ldyBCdWZmZXJpbmdQYXJhbXMuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgIC5zZXRJbml0aWFsTWFya01zKDIpCisgICAgICAgICAgICAgICAgICAgIC5zZXRSZXN1bWVQbGF5YmFja01hcmtNcygzKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgICAgIG1DYWxsU3RhdHVzID0gTWVkaWFQbGF5ZXIyLkNBTExfU1RBVFVTX05PX0VSUk9SOworICAgICAgICAgICAgb25TZXRCdWZmZXJpbmdQYXJhbXNDYWxsZWQucmVzZXQoKTsKKyAgICAgICAgICAgIG1QbGF5ZXIuc2V0QnVmZmVyaW5nUGFyYW1zKHBhcmFtcyk7CisgICAgICAgICAgICBvblNldEJ1ZmZlcmluZ1BhcmFtc0NhbGxlZC53YWl0Rm9yU2lnbmFsKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKG1DYWxsU3RhdHVzICE9IE1lZGlhUGxheWVyMi5DQUxMX1NUQVRVU19OT19FUlJPUik7CisKKyAgICAgICAgICAgIGZpbmFsIFVyaSB1cmkgPSBVcmkucGFyc2Uoc3RyZWFtX3VybCk7CisgICAgICAgICAgICBtUGxheWVyLnNldERhdGFTb3VyY2UobmV3IERhdGFTb3VyY2VEZXNjLkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAuc2V0RGF0YVNvdXJjZShtQ29udGV4dCwgdXJpKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgICAgIG1QbGF5ZXIuc2V0RGlzcGxheShnZXRBY3Rpdml0eSgpLmdldFN1cmZhY2VIb2xkZXIoKSk7CisgICAgICAgICAgICBtUGxheWVyLnNldFNjcmVlbk9uV2hpbGVQbGF5aW5nKHRydWUpOworCisgICAgICAgICAgICBtT25CdWZmZXJpbmdVcGRhdGVDYWxsZWQucmVzZXQoKTsKKworICAgICAgICAgICAgYXNzZXJ0RmFsc2UobU9uQnVmZmVyaW5nVXBkYXRlQ2FsbGVkLmlzU2lnbmFsbGVkKCkpOworCisgICAgICAgICAgICBwYXJhbXMgPSBtUGxheWVyLmdldEJ1ZmZlcmluZ1BhcmFtcygpOworCisgICAgICAgICAgICBpbnQgbmV3TWFyayA9IHBhcmFtcy5nZXRJbml0aWFsTWFya01zKCkgKyAyOworICAgICAgICAgICAgQnVmZmVyaW5nUGFyYW1zIG5ld1BhcmFtcyA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBCdWZmZXJpbmdQYXJhbXMuQnVpbGRlcihwYXJhbXMpLnNldEluaXRpYWxNYXJrTXMobmV3TWFyaykuYnVpbGQoKTsKKworICAgICAgICAgICAgb25TZXRCdWZmZXJpbmdQYXJhbXNDYWxsZWQucmVzZXQoKTsKKyAgICAgICAgICAgIG1QbGF5ZXIuc2V0QnVmZmVyaW5nUGFyYW1zKG5ld1BhcmFtcyk7CisgICAgICAgICAgICBvblNldEJ1ZmZlcmluZ1BhcmFtc0NhbGxlZC53YWl0Rm9yU2lnbmFsKCk7CisKKyAgICAgICAgICAgIGludCBjaGVja01hcmsgPSAtMTsKKyAgICAgICAgICAgIEJ1ZmZlcmluZ1BhcmFtcyBjaGVja1BhcmFtcyA9IG1QbGF5ZXIuZ2V0QnVmZmVyaW5nUGFyYW1zKCk7CisgICAgICAgICAgICBjaGVja01hcmsgPSBjaGVja1BhcmFtcy5nZXRJbml0aWFsTWFya01zKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIm1hcmtzIGRvIG5vdCBtYXRjaCIsIG5ld01hcmssIGNoZWNrTWFyayk7CisKKyAgICAgICAgICAgIC8vIFRPRE86IGFkZCBtb3JlIGR5bmFtaWMgY2hlY2tpbmcsIGUuZy4sIGJ1ZmZlcmluZyBzaGFsbCBub3QgZXhjZWVkIHByZS1zZXQgbWFyay4KKworICAgICAgICAgICAgbVBsYXllci5yZXNldCgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgbVNlcnZlci5zaHV0ZG93bigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFBsYXlIbHNTdHJlYW0oKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgaWYgKElHTk9SRV9URVNUUykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICghTWVkaWFVdGlscy5jaGVja0RlY29kZXIoTWVkaWFGb3JtYXQuTUlNRVRZUEVfVklERU9fQVZDKSkgeworICAgICAgICAgICAgcmV0dXJuOyAvLyBza2lwCisgICAgICAgIH0KKyAgICAgICAgbG9jYWxIbHNUZXN0KCJobHMubTN1OCIsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFBsYXlIbHNTdHJlYW1XaXRoUXVlcnlTdHJpbmcoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgaWYgKElHTk9SRV9URVNUUykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICghTWVkaWFVdGlscy5jaGVja0RlY29kZXIoTWVkaWFGb3JtYXQuTUlNRVRZUEVfVklERU9fQVZDKSkgeworICAgICAgICAgICAgcmV0dXJuOyAvLyBza2lwCisgICAgICAgIH0KKyAgICAgICAgbG9jYWxIbHNUZXN0KCJobHMubTN1OCIsIHRydWUsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGxheUhsc1N0cmVhbVdpdGhSZWRpcmVjdCgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBpZiAoSUdOT1JFX1RFU1RTKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFNZWRpYVV0aWxzLmNoZWNrRGVjb2RlcihNZWRpYUZvcm1hdC5NSU1FVFlQRV9WSURFT19BVkMpKSB7CisgICAgICAgICAgICByZXR1cm47IC8vIHNraXAKKyAgICAgICAgfQorICAgICAgICBsb2NhbEhsc1Rlc3QoImhscy5tM3U4IiwgZmFsc2UsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQbGF5SGxzU3RyZWFtV2l0aFRpbWVkSWQzKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGlmIChJR05PUkVfVEVTVFMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIU1lZGlhVXRpbHMuY2hlY2tEZWNvZGVyKE1lZGlhRm9ybWF0Lk1JTUVUWVBFX1ZJREVPX0FWQykpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIkRldmljZSBkb2Vzbid0IGhhdmUgdmlkZW8gY29kZWMsIHNraXBwaW5nIHRlc3QiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1TZXJ2ZXIgPSBuZXcgQ3RzVGVzdFNlcnZlcihtQ29udGV4dCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBjb3VudGVyIG11c3QgYmUgZmluYWwgaWYgd2Ugd2FudCB0byBhY2Nlc3MgaXQgaW5zaWRlIG9uVGltZWRNZXRhRGF0YTsKKyAgICAgICAgICAgIC8vIHVzZSBBdG9taWNJbnRlZ2VyIHNvIHdlIGNhbiBoYXZlIGEgZmluYWwgY291bnRlciBvYmplY3Qgd2l0aCBtdXRhYmxlIGludGVnZXIgdmFsdWUuCisgICAgICAgICAgICBmaW5hbCBBdG9taWNJbnRlZ2VyIGNvdW50ZXIgPSBuZXcgQXRvbWljSW50ZWdlcigpOworICAgICAgICAgICAgU3RyaW5nIHN0cmVhbV91cmwgPSBtU2VydmVyLmdldEFzc2V0VXJsKCJwcm9nX2luZGV4Lm0zdTgiKTsKKyAgICAgICAgICAgIGZpbmFsIFVyaSB1cmkgPSBVcmkucGFyc2Uoc3RyZWFtX3VybCk7CisgICAgICAgICAgICBtUGxheWVyLnNldERhdGFTb3VyY2UobmV3IERhdGFTb3VyY2VEZXNjLkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAuc2V0RGF0YVNvdXJjZShtQ29udGV4dCwgdXJpKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgICAgICAgICBtUGxheWVyLnNldERpc3BsYXkoZ2V0QWN0aXZpdHkoKS5nZXRTdXJmYWNlSG9sZGVyKCkpOworICAgICAgICAgICAgbVBsYXllci5zZXRTY3JlZW5PbldoaWxlUGxheWluZyh0cnVlKTsKKyAgICAgICAgICAgIG1QbGF5ZXIuc2V0V2FrZU1vZGUobUNvbnRleHQsIFBvd2VyTWFuYWdlci5QQVJUSUFMX1dBS0VfTE9DSyk7CisKKyAgICAgICAgICAgIGZpbmFsIE9iamVjdCBjb21wbGV0aW9uID0gbmV3IE9iamVjdCgpOworICAgICAgICAgICAgTWVkaWFQbGF5ZXIyLk1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2sgZWNiID0KKyAgICAgICAgICAgICAgICBuZXcgTWVkaWFQbGF5ZXIyLk1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2soKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBydW47CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkluZm8oTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsIGludCB3aGF0LCBpbnQgZXh0cmEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aGF0ID09IE1lZGlhUGxheWVyMi5NRURJQV9JTkZPX1BSRVBBUkVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU9uUHJlcGFyZUNhbGxlZC5zaWduYWwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBNZWRpYVBsYXllcjIuTUVESUFfSU5GT19QTEFZQkFDS19DT01QTEVURSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydW4rKyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5ZXIuc2Vla1RvKDAsIE1lZGlhUGxheWVyMi5TRUVLX1BSRVZJT1VTX1NZTkMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGxheWVyLnBsYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGxheWVyLnN0b3AoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChjb21wbGV0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uLm5vdGlmeSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblRpbWVkTWV0YURhdGFBdmFpbGFibGUoTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsCisgICAgICAgICAgICAgICAgICAgICAgICBUaW1lZE1ldGFEYXRhIG1kKSB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ZXIuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgICAgICAgICAgICAgICAgIGxvbmcgcG9zID0gbXAuZ2V0Q3VycmVudFBvc2l0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIGxvbmcgdGltZVVzID0gbWQuZ2V0VGltZXN0YW1wKCk7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSByYXdEYXRhID0gbWQuZ2V0TWV0YURhdGEoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gUmF3IGRhdGEgY29udGFpbnMgYW4gaWQzIHRhZyBob2xkaW5nIHRoZSBkZWNpbWFsIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZgorICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYXNzb2NpYXRlZCB0aW1lIHN0YW1wIHJvdW5kZWQgdG8gdGhlIGNsb3Nlc3QgaGFsZiBzZWNvbmQuCisKKyAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSAzOyAvLyAiSUQzIgorICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMjsgLy8gdmVyc2lvbgorICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMTsgLy8gZmxhZ3MKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDQ7IC8vIHNpemUKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDQ7IC8vICJUWFhYIgorICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gNDsgLy8gZnJhbWUgc2l6ZQorICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMjsgLy8gZnJhbWUgZmxhZ3MKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDE7IC8vICJceDAzIiA6IFVURi04IGVuY29kZWQgVW5pY29kZQorICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMTsgLy8gIlx4MDAiIDogbnVsbC10ZXJtaW5hdGVkIGVtcHR5IGRlc2NyaXB0aW9uCisKKyAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCA9IHJhd0RhdGEubGVuZ3RoOworICAgICAgICAgICAgICAgICAgICBsZW5ndGggLT0gb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICBsZW5ndGggLT0gMTsgLy8gIlx4MDAiIDogdGVybWluYXRpbmcgbnVsbAorCisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkYXRhID0gbmV3IFN0cmluZyhyYXdEYXRhLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIGludCBkYXRhVGltZVVzID0gSW50ZWdlci5wYXJzZUludChkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVGltZWQgSUQzIHRpbWVzdGFtcCBkb2VzIG5vdCBtYXRjaCBjb250ZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLmFicyhkYXRhVGltZVVzIC0gdGltZVVzKSA8IDUwMDAwMCk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIlRpbWVkIElEMyBhcnJpdmVzIGFmdGVyIHRpbWVzdGFtcCIsIHBvcyAqIDEwMDAgPCB0aW1lVXMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2FsbENvbXBsZXRlZChNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aGF0LCBpbnQgc3RhdHVzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh3aGF0ID09IE1lZGlhUGxheWVyMi5DQUxMX0NPTVBMRVRFRF9QTEFZKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtT25QbGF5Q2FsbGVkLnNpZ25hbCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIG1QbGF5ZXIuc2V0TWVkaWFQbGF5ZXIyRXZlbnRDYWxsYmFjayhtRXhlY3V0b3IsIGVjYik7CisKKyAgICAgICAgICAgIG1QbGF5ZXIucHJlcGFyZSgpOworICAgICAgICAgICAgbU9uUHJlcGFyZUNhbGxlZC53YWl0Rm9yU2lnbmFsKCk7CisKKyAgICAgICAgICAgIG1PblBsYXlDYWxsZWQucmVzZXQoKTsKKyAgICAgICAgICAgIG1QbGF5ZXIucGxheSgpOworICAgICAgICAgICAgbU9uUGxheUNhbGxlZC53YWl0Rm9yU2lnbmFsKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJNZWRpYVBsYXllcjIgbm90IHBsYXlpbmciLCBtUGxheWVyLmlzUGxheWluZygpKTsKKworICAgICAgICAgICAgaW50IGkgPSAtMTsKKyAgICAgICAgICAgIExpc3Q8VHJhY2tJbmZvPiB0cmFja0luZm9zID0gbVBsYXllci5nZXRUcmFja0luZm8oKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0cmFja0luZm9zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgVHJhY2tJbmZvIHRyYWNrSW5mbyA9IHRyYWNrSW5mb3MuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmICh0cmFja0luZm8uZ2V0VHJhY2tUeXBlKCkgPT0gVHJhY2tJbmZvLk1FRElBX1RSQUNLX1RZUEVfTUVUQURBVEEpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiU3RyZWFtIGhhcyBubyB0aW1lZCBJRDMgdHJhY2siLCBpID49IDApOworICAgICAgICAgICAgbVBsYXllci5zZWxlY3RUcmFjayhpKTsKKworICAgICAgICAgICAgc3luY2hyb25pemVkIChjb21wbGV0aW9uKSB7CisgICAgICAgICAgICAgICAgY29tcGxldGlvbi53YWl0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRoZXJlIGFyZSBhIHRvdGFsIG9mIDE5IG1ldGFkYXRhIGFjY2VzcyB1bml0cyBpbiB0aGUgdGVzdCBzdHJlYW07IGV2ZXJ5IG9uZSBvZiB0aGVtCisgICAgICAgICAgICAvLyBzaG91bGQgYmUgcmVjZWl2ZWQgdHdpY2U6IG9uY2UgYmVmb3JlIHRoZSBzZWVrIGFuZCBvbmNlIGFmdGVyLgorICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IG51bWJlciBvZiB0aW1lZCBJRDNzIHJlY2lldmVkIiwgY291bnRlci5nZXQoKSA9PSAzOCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBtU2VydmVyLnNodXRkb3duKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBXb3JrZXJXaXRoUGxheWVyIGltcGxlbWVudHMgUnVubmFibGUgeworICAgICAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtTG9jayA9IG5ldyBPYmplY3QoKTsKKyAgICAgICAgcHJpdmF0ZSBMb29wZXIgbUxvb3BlcjsKKyAgICAgICAgcHJpdmF0ZSBNZWRpYVBsYXllcjIgbVBsYXllcjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIHdvcmtlciB0aHJlYWQgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gVGhlIHRocmVhZAorICAgICAgICAgKiB0aGVuIHJ1bnMgYSB7QGxpbmsgYW5kcm9pZC5vcy5Mb29wZXJ9LgorICAgICAgICAgKiBAcGFyYW0gbmFtZSBBIG5hbWUgZm9yIHRoZSBuZXcgdGhyZWFkCisgICAgICAgICAqLworICAgICAgICBXb3JrZXJXaXRoUGxheWVyKFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobnVsbCwgdGhpcywgbmFtZSk7CisgICAgICAgICAgICB0LnNldFByaW9yaXR5KFRocmVhZC5NSU5fUFJJT1JJVFkpOworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgICAgIHdoaWxlIChtTG9vcGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLndhaXQoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNZWRpYVBsYXllcjIgZ2V0UGxheWVyKCkgeworICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgICAgIExvb3Blci5wcmVwYXJlKCk7CisgICAgICAgICAgICAgICAgbUxvb3BlciA9IExvb3Blci5teUxvb3BlcigpOworICAgICAgICAgICAgICAgIG1QbGF5ZXIgPSBNZWRpYVBsYXllcjIuY3JlYXRlKCk7CisgICAgICAgICAgICAgICAgbUxvY2subm90aWZ5QWxsKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBMb29wZXIubG9vcCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcXVpdCgpIHsKKyAgICAgICAgICAgIG1Mb29wZXIucXVpdCgpOworICAgICAgICAgICAgbVBsYXllci5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEJsb2NraW5nUmVhZFJlbGVhc2UoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgaWYgKElHTk9SRV9URVNUUykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbVNlcnZlciA9IG5ldyBDdHNUZXN0U2VydmVyKG1Db250ZXh0KTsKKworICAgICAgICBXb3JrZXJXaXRoUGxheWVyIHdvcmtlciA9IG5ldyBXb3JrZXJXaXRoUGxheWVyKCJwbGF5ZXIiKTsKKyAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXIyIG1wID0gd29ya2VyLmdldFBsYXllcigpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IG1TZXJ2ZXIuZ2V0RGVsYXllZEFzc2V0VXJsKCJub2lzZWFuZGNoaXJwcy5vZ2ciLCAxNTAwMCk7CisgICAgICAgICAgICBmaW5hbCBVcmkgdXJpID0gVXJpLnBhcnNlKHBhdGgpOworICAgICAgICAgICAgbXAuc2V0RGF0YVNvdXJjZShuZXcgRGF0YVNvdXJjZURlc2MuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgIC5zZXREYXRhU291cmNlKG1Db250ZXh0LCB1cmkpCisgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAgICAgTWVkaWFQbGF5ZXIyLk1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2sgZWNiID0KKyAgICAgICAgICAgICAgICBuZXcgTWVkaWFQbGF5ZXIyLk1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2soKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkluZm8oTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsIGludCB3aGF0LCBpbnQgZXh0cmEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aGF0ID09IE1lZGlhUGxheWVyMi5NRURJQV9JTkZPX1BSRVBBUkVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbCgicHJlcGFyZSBzaG91bGQgbm90IHN1Y2NlZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICBtcC5zZXRNZWRpYVBsYXllcjJFdmVudENhbGxiYWNrKG1FeGVjdXRvciwgZWNiKTsKKworICAgICAgICAgICAgbXAucHJlcGFyZSgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOworICAgICAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpOworICAgICAgICAgICAgbXAuY2xvc2UoKTsKKyAgICAgICAgICAgIGxvbmcgZW5kID0gU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCk7CisgICAgICAgICAgICBsb25nIHJlbGVhc2VEdXJhdGlvbiA9IChlbmQgLSBzdGFydCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJyZWxlYXNlIHRvb2sgdG9vIGxvbmc6ICIgKyByZWxlYXNlRHVyYXRpb24sIHJlbGVhc2VEdXJhdGlvbiA8IDEwMDApOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgbVNlcnZlci5zaHV0ZG93bigpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZ2l2ZSB0aGUgd29ya2VyIGEgYml0IG9mIHRpbWUgdG8gc3RhcnQgcHJvY2Vzc2luZyB0aGUgbWVzc2FnZSBiZWZvcmUgc2h1dHRpbmcgaXQgZG93bgorICAgICAgICBUaHJlYWQuc2xlZXAoNTAwMCk7CisgICAgICAgIHdvcmtlci5xdWl0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGxvY2FsSGxzVGVzdChmaW5hbCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBhcHBlbmRRdWVyeVN0cmluZywgYm9vbGVhbiByZWRpcmVjdCkKKyAgICAgICAgICAgIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBtU2VydmVyID0gbmV3IEN0c1Rlc3RTZXJ2ZXIobUNvbnRleHQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RyaW5nIHN0cmVhbV91cmwgPSBudWxsOworICAgICAgICAgICAgaWYgKHJlZGlyZWN0KSB7CisgICAgICAgICAgICAgICAgc3RyZWFtX3VybCA9IG1TZXJ2ZXIuZ2V0UXVlcnlSZWRpcmVjdGluZ0Fzc2V0VXJsKG5hbWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdHJlYW1fdXJsID0gbVNlcnZlci5nZXRBc3NldFVybChuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhcHBlbmRRdWVyeVN0cmluZykgeworICAgICAgICAgICAgICAgIHN0cmVhbV91cmwgKz0gIj9mb289YmFyL2JheiI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBsYXlMaXZlVmlkZW9UZXN0KHN0cmVhbV91cmwsIDEwKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIG1TZXJ2ZXIuc2h1dGRvd24oKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9BZGFwdGl2ZVBsYXliYWNrVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL0FkYXB0aXZlUGxheWJhY2tUZXN0LmphdmEKaW5kZXggMmU3YTg0OC4uZGE5OWExMiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL0FkYXB0aXZlUGxheWJhY2tUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL0FkYXB0aXZlUGxheWJhY2tUZXN0LmphdmEKQEAgLTI4LDkgKzI4LDEyIEBACiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvZGVjTGlzdDsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRXh0cmFjdG9yOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFGb3JtYXQ7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2U7CiAKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLk1lZGlhVXRpbHM7CisKIGltcG9ydCBhbmRyb2lkLm9wZW5nbC5HTEVTMjA7CiBpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMDsKIApAQCAtNDQsNiArNDcsNyBAQAogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CiBpbXBvcnQgamF2YS51dGlsLnppcC5DUkMzMjsKIAorQEFwcE1vZGVGdWxsCiBwdWJsaWMgY2xhc3MgQWRhcHRpdmVQbGF5YmFja1Rlc3QgZXh0ZW5kcyBNZWRpYVBsYXllclRlc3RCYXNlIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkFkYXB0aXZlUGxheWJhY2tUZXN0IjsKICAgICBwcml2YXRlIGJvb2xlYW4gc2FuaXR5ID0gZmFsc2U7CkBAIC01Myw3ICs1Nyw2IEBACiAgICAgICAgIHJldHVybiBmYWN0b3J5LmNyZWF0ZUNvZGVjTGlzdCgKICAgICAgICAgICAgICAgICBtQ29udGV4dCwKICAgICAgICAgICAgICAgICBNZWRpYUZvcm1hdC5NSU1FVFlQRV9WSURFT19BVkMsCi0gICAgICAgICAgICAgICAgIk9NWC5nb29nbGUuaDI2NC5kZWNvZGVyIiwKICAgICAgICAgICAgICAgICBSLnJhdy52aWRlb180ODB4MzYwX21wNF9oMjY0XzEwMDBrYnBzXzI1ZnBzX2FhY19zdGVyZW9fMTI4a2Jwc180NDEwMGh6LAogICAgICAgICAgICAgICAgIFIucmF3LnZpZGVvXzEyODB4NzIwX21wNF9oMjY0XzEwMDBrYnBzXzI1ZnBzX2FhY19zdGVyZW9fMTI4a2Jwc180NDEwMGh6LAogICAgICAgICAgICAgICAgIFIucmF3LmJiYl9zMV83MjB4NDgwX21wNF9oMjY0X21wM18ybWJwc18zMGZwc19hYWNfbGNfNWNoXzMyMGticHNfNDgwMDBoeik7CkBAIC02Myw3ICs2Niw2IEBACiAgICAgICAgIHJldHVybiBmYWN0b3J5LmNyZWF0ZUNvZGVjTGlzdCgKICAgICAgICAgICAgICAgICBtQ29udGV4dCwKICAgICAgICAgICAgICAgICBNZWRpYUZvcm1hdC5NSU1FVFlQRV9WSURFT19IRVZDLAotICAgICAgICAgICAgICAgICJPTVguZ29vZ2xlLmhldmMuZGVjb2RlciIsCiAgICAgICAgICAgICAgICAgUi5yYXcuYmJiX3MxXzcyMHg0ODBfbXA0X2hldmNfbXAzXzE2MDBrYnBzXzMwZnBzX2FhY19oZV82Y2hfMjQwa2Jwc180ODAwMGh6LAogICAgICAgICAgICAgICAgIFIucmF3LmJiYl9zNF8xMjgweDcyMF9tcDRfaGV2Y19tcDMxXzRtYnBzXzMwZnBzX2FhY19oZV9zdGVyZW9fODBrYnBzXzMyMDAwaHosCiAgICAgICAgICAgICAgICAgUi5yYXcuYmJiX3MxXzM1MngyODhfbXA0X2hldmNfbXAyXzYwMGticHNfMzBmcHNfYWFjX2hlX3N0ZXJlb185NmticHNfNDgwMDBoeik7CkBAIC03Myw3ICs3NSw2IEBACiAgICAgICAgIHJldHVybiBmYWN0b3J5LmNyZWF0ZUNvZGVjTGlzdCgKICAgICAgICAgICAgICAgICBtQ29udGV4dCwKICAgICAgICAgICAgICAgICBNZWRpYUZvcm1hdC5NSU1FVFlQRV9WSURFT19IMjYzLAotICAgICAgICAgICAgICAgICJPTVguZ29vZ2xlLmgyNjMuZGVjb2RlciIsCiAgICAgICAgICAgICAgICAgUi5yYXcudmlkZW9fMTc2eDE0NF8zZ3BfaDI2M18zMDBrYnBzXzEyZnBzX2FhY19zdGVyZW9fMTI4a2Jwc18yMjA1MGh6LAogICAgICAgICAgICAgICAgIFIucmF3LnZpZGVvXzM1MngyODhfM2dwX2gyNjNfMzAwa2Jwc18xMmZwc19hYWNfc3RlcmVvXzEyOGticHNfMjIwNTBoeik7CiAgICAgfQpAQCAtODIsOCArODMsNiBAQAogICAgICAgICByZXR1cm4gZmFjdG9yeS5jcmVhdGVDb2RlY0xpc3QoCiAgICAgICAgICAgICAgICAgbUNvbnRleHQsCiAgICAgICAgICAgICAgICAgTWVkaWFGb3JtYXQuTUlNRVRZUEVfVklERU9fTVBFRzQsCi0gICAgICAgICAgICAgICAgIk9NWC5nb29nbGUubXBlZzQuZGVjb2RlciIsCi0KICAgICAgICAgICAgICAgICBSLnJhdy52aWRlb18xMjgweDcyMF9tcDRfbXBlZzRfMTAwMGticHNfMjVmcHNfYWFjX3N0ZXJlb18xMjhrYnBzXzQ0MTAwaHosCiAgICAgICAgICAgICAgICAgUi5yYXcudmlkZW9fNDgweDM2MF9tcDRfbXBlZzRfODYwa2Jwc18yNWZwc19hYWNfc3RlcmVvXzEyOGticHNfNDQxMDBoeiwKICAgICAgICAgICAgICAgICBSLnJhdy52aWRlb18xNzZ4MTQ0X21wNF9tcGVnNF8zMDBrYnBzXzI1ZnBzX2FhY19zdGVyZW9fMTI4a2Jwc180NDEwMGh6KTsKQEAgLTkzLDcgKzkyLDYgQEAKICAgICAgICAgcmV0dXJuIGZhY3RvcnkuY3JlYXRlQ29kZWNMaXN0KAogICAgICAgICAgICAgICAgIG1Db250ZXh0LAogICAgICAgICAgICAgICAgIE1lZGlhRm9ybWF0Lk1JTUVUWVBFX1ZJREVPX1ZQOCwKLSAgICAgICAgICAgICAgICAiT01YLmdvb2dsZS52cDguZGVjb2RlciIsCiAgICAgICAgICAgICAgICAgUi5yYXcudmlkZW9fNDgweDM2MF93ZWJtX3ZwOF8zMzNrYnBzXzI1ZnBzX3ZvcmJpc19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LAogICAgICAgICAgICAgICAgIFIucmF3LmJiYl9zM18xMjgweDcyMF93ZWJtX3ZwOF84bWJwc182MGZwc19vcHVzXzZjaF8zODRrYnBzXzQ4MDAwaHosCiAgICAgICAgICAgICAgICAgUi5yYXcuYmJiX3MxXzMyMHgxODBfd2VibV92cDhfODAwa2Jwc18zMGZwc19vcHVzXzVjaF8zMjBrYnBzXzQ4MDAwaHopOwpAQCAtMTAzLDcgKzEwMSw2IEBACiAgICAgICAgIHJldHVybiBmYWN0b3J5LmNyZWF0ZUNvZGVjTGlzdCgKICAgICAgICAgICAgICAgICBtQ29udGV4dCwKICAgICAgICAgICAgICAgICBNZWRpYUZvcm1hdC5NSU1FVFlQRV9WSURFT19WUDksCi0gICAgICAgICAgICAgICAgIk9NWC5nb29nbGUudnA5LmRlY29kZXIiLAogICAgICAgICAgICAgICAgIFIucmF3LnZpZGVvXzQ4MHgzNjBfd2VibV92cDlfMzMza2Jwc18yNWZwc192b3JiaXNfc3RlcmVvXzEyOGticHNfNDgwMDBoeiwKICAgICAgICAgICAgICAgICBSLnJhdy5iYmJfczRfMTI4MHg3MjBfd2VibV92cDlfMHAzMV80bWJwc18zMGZwc19vcHVzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHosCiAgICAgICAgICAgICAgICAgUi5yYXcuYmJiX3MxXzMyMHgxODBfd2VibV92cDlfMHAxMV82MDBrYnBzXzMwZnBzX3ZvcmJpc19tb25vXzY0a2Jwc180ODAwMGh6KTsKQEAgLTEyNDEsOSArMTIzOCwxMCBAQAogICAgICAgICByZXR1cm4gY29weTsKICAgICB9CiAKLSAgICBwdWJsaWMgTWVkaWFGb3JtYXQgZ2V0QWRhcHRpdmVGb3JtYXQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgcHVibGljIE1lZGlhRm9ybWF0IGdldEFkYXB0aXZlRm9ybWF0KGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IG1heElucHV0U2l6ZSkgewogICAgICAgICBtQWRhcHRpdmVGb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfTUFYX1dJRFRILCB3aWR0aCk7CiAgICAgICAgIG1BZGFwdGl2ZUZvcm1hdC5zZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9NQVhfSEVJR0hULCBoZWlnaHQpOworICAgICAgICBtQWRhcHRpdmVGb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfTUFYX0lOUFVUX1NJWkUsIG1heElucHV0U2l6ZSk7CiAgICAgICAgIHJldHVybiBtQWRhcHRpdmVGb3JtYXQ7CiAgICAgfQogCkBAIC0xMjUxLDYgKzEyNDksMTQgQEAKICAgICAgICAgcmV0dXJuIG1Gb3JtYXQuZ2V0U3RyaW5nKE1lZGlhRm9ybWF0LktFWV9NSU1FKTsKICAgICB9CiAKKyAgICBwdWJsaWMgaW50IGdldE1heElucHV0U2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1Gb3JtYXQuZ2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfTUFYX0lOUFVUX1NJWkUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1heElucHV0U2l6ZShpbnQgbWF4SW5wdXRTaXplKSB7CisgICAgICAgIG1Gb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfTUFYX0lOUFVUX1NJWkUsIG1heElucHV0U2l6ZSk7CisgICAgfQorCiAgICAgcHVibGljIGludCBnZXRXaWR0aCgpIHsKICAgICAgICAgcmV0dXJuIG1Gb3JtYXQuZ2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfV0lEVEgpOwogICAgIH0KQEAgLTEzMDgsNiArMTMxNCw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBpbnQgbWF4SW5wdXRTaXplID0gMDsKICAgICAgICAgQnl0ZUJ1ZmZlciByZWFkQnVmID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSgyMDAwMDAwKTsKICAgICAgICAgZm9yIChpbnQgaXggPSAwOyBpeCA8IG51bUZyYW1lczsgaXgrKykgewogICAgICAgICAgICAgaW50IHNhbXBsZVNpemUgPSBleHRyYWN0b3IucmVhZFNhbXBsZURhdGEocmVhZEJ1ZiwgMCAvKiBvZmZzZXQgKi8pOwpAQCAtMTMxOSw2ICsxMzI2LDExIEBACiAgICAgICAgICAgICAgICAgZm9yIChCeXRlQnVmZmVyIGNzZDogY3NkcykgewogICAgICAgICAgICAgICAgICAgICBzYW1wbGVTaXplICs9IGNzZC5jYXBhY2l0eSgpOwogICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChtYXhJbnB1dFNpemUgPCBzYW1wbGVTaXplKSB7CisgICAgICAgICAgICAgICAgICAgIG1heElucHV0U2l6ZSA9IHNhbXBsZVNpemU7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBidWYgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKHNhbXBsZVNpemUpOwogICAgICAgICAgICAgICAgIGZvciAoQnl0ZUJ1ZmZlciBjc2Q6IGNzZHMpIHsKICAgICAgICAgICAgICAgICAgICAgY3NkLmNsZWFyKCk7CkBAIC0xMzM4LDYgKzEzNTAsMTAgQEAKICAgICAgICAgfQogICAgICAgICBleHRyYWN0b3IucmVsZWFzZSgpOwogICAgICAgICB0ZXN0RmQuY2xvc2UoKTsKKworICAgICAgICAvKiBPdmVycmlkZSBNQVhfSU5QVVRfU0laRSBpbiBmb3JtYXQsIGFzIENTRCBpcyBiZWluZyBjb21iaW5lZAorICAgICAgICAgKiB3aXRoIG9uZSBvZiB0aGUgaW5wdXQgYnVmZmVycyAqLworICAgICAgICBtZWRpYS5zZXRNYXhJbnB1dFNpemUobWF4SW5wdXRTaXplKTsKICAgICAgICAgcmV0dXJuIG1lZGlhOwogICAgIH0KIH0KQEAgLTEzODgsNyArMTQwNCw3IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBRyA9ICJBZGFwdGl2ZUNvZGVjRmFtaWx5IjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTlVNX0ZSQU1FUyA9IEFkYXB0aXZlUGxheWJhY2tUZXN0Lk5VTV9GUkFNRVM7CiAKLSAgICBwdWJsaWMgQ29kZWNGYW1pbHkoQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgbWltZSwgU3RyaW5nIGV4cGxpY2l0Q29kZWNOYW1lLCBpbnQgLi4uIHJlc291cmNlcykgeworICAgIHB1YmxpYyBDb2RlY0ZhbWlseShDb250ZXh0IGNvbnRleHQsIFN0cmluZyBtaW1lLCBpbnQgLi4uIHJlc291cmNlcykgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgLyogcmVhZCBhbGwgbWVkaWEgKi8KICAgICAgICAgICAgIE1lZGlhW10gbWVkaWFMaXN0ID0gbmV3IE1lZGlhW3Jlc291cmNlcy5sZW5ndGhdOwpAQCAtMTQxOCwxMCArMTQzNCw2IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHR5cGUgOiBjb2RlY0luZm8uZ2V0U3VwcG9ydGVkVHlwZXMoKSkgewogICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5lcXVhbHMobWltZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1hcmsgdGhlIGV4cGxpY2l0bHkgbmFtZWQgY29kZWMgYXMgaW5jbHVkZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlY0luZm8uZ2V0TmFtZSgpLmVxdWFscyhleHBsaWNpdENvZGVjTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBsaWNpdENvZGVjTmFtZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBhZGQobmV3IENvZGVjKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY0luZm8uZ2V0TmFtZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY0luZm8uZ2V0Q2FwYWJpbGl0aWVzRm9yVHlwZShtaW1lKSwKQEAgLTE0MzAsMTUgKzE0NDIsNiBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiB0ZXN0IGlmIHRoZSBleHBsaWNpdGx5IG5hbWVkIGNvZGVjIGlzIHByZXNlbnQgb24gdGhlIHN5c3RlbSAqLwotICAgICAgICAgICAgaWYgKGV4cGxpY2l0Q29kZWNOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBNZWRpYUNvZGVjIGNvZGVjID0gTWVkaWFDb2RlYy5jcmVhdGVCeUNvZGVjTmFtZShleHBsaWNpdENvZGVjTmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvZGVjICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29kZWMucmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICBhZGQobmV3IENvZGVjKGV4cGxpY2l0Q29kZWNOYW1lLCBudWxsLCBtZWRpYUxpc3QpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CiAgICAgICAgICAgICBMb2cud3RmKCJDb25zdHJ1Y3RvciBmYWlsZWQiLCB0KTsKICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJjb25zdHJ1Y3RvciBmYWlsZWQiLCB0KTsKQEAgLTE0NDYsMjMgKzE0NDksMTIgQEAKICAgICB9CiB9CiAKLS8qIG5hbWVkIGNvZGVjIGlmIGV4aXN0cyAqLwotY2xhc3MgQ29kZWNCeU5hbWUgZXh0ZW5kcyBDb2RlY0xpc3QgewotICAgIHB1YmxpYyBDb2RlY0J5TmFtZShDb250ZXh0IGNvbnRleHQsIFN0cmluZyBtaW1lLCBTdHJpbmcgY29kZWNOYW1lLCBpbnQgLi4uIHJlc291cmNlcykgewotICAgICAgICBmb3IgKENvZGVjIGM6IG5ldyBDb2RlY0ZhbWlseShjb250ZXh0LCBtaW1lLCBjb2RlY05hbWUsIHJlc291cmNlcykpIHsKLSAgICAgICAgICAgIGlmIChjLm5hbWUuZXF1YWxzKGNvZGVjTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBhZGQoYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KIC8qIGFsbCBjb2RlY3Mgb2YgbWltZSwgZXhjZXB0IG5hbWVkIGNvZGVjIGlmIGV4aXN0cyAqLwotY2xhc3MgQ29kZWNGYW1pbHlFeGNlcHQgZXh0ZW5kcyBDb2RlY0xpc3QgewotICAgIHB1YmxpYyBDb2RlY0ZhbWlseUV4Y2VwdCgKLSAgICAgICAgICAgIENvbnRleHQgY29udGV4dCwgU3RyaW5nIG1pbWUsIFN0cmluZyBleGNlcHRDb2RlY05hbWUsIGludCAuLi4gcmVzb3VyY2VzKSB7Ci0gICAgICAgIGZvciAoQ29kZWMgYzogbmV3IENvZGVjRmFtaWx5KGNvbnRleHQsIG1pbWUsIG51bGwsIHJlc291cmNlcykpIHsKLSAgICAgICAgICAgIGlmICghYy5uYW1lLmVxdWFscyhleGNlcHRDb2RlY05hbWUpKSB7CitjbGFzcyBDb2RlY0ZhbWlseVNwZWNpZmljIGV4dGVuZHMgQ29kZWNMaXN0IHsKKyAgICBwdWJsaWMgQ29kZWNGYW1pbHlTcGVjaWZpYygKKyAgICAgICAgICAgIENvbnRleHQgY29udGV4dCwgU3RyaW5nIG1pbWUsIGJvb2xlYW4gaXNHb29nbGUsIGludCAuLi4gcmVzb3VyY2VzKSB7CisgICAgICAgIGZvciAoQ29kZWMgYzogbmV3IENvZGVjRmFtaWx5KGNvbnRleHQsIG1pbWUsIHJlc291cmNlcykpIHsKKyAgICAgICAgICAgIGlmIChNZWRpYVV0aWxzLmlzR29vZ2xlKGMubmFtZSkgPT0gaXNHb29nbGUpIHsKICAgICAgICAgICAgICAgICBhZGQoYyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTE0NzAsNDIgKzE0NjIsMjMgQEAKIH0KIAogY2xhc3MgQ29kZWNGYWN0b3J5IHsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNDb2RlYyhTdHJpbmcgY29kZWNOYW1lKSB7Ci0gICAgICAgIE1lZGlhQ29kZWNMaXN0IGxpc3QgPSBuZXcgTWVkaWFDb2RlY0xpc3QoTWVkaWFDb2RlY0xpc3QuQUxMX0NPREVDUyk7Ci0gICAgICAgIGZvciAoTWVkaWFDb2RlY0luZm8gaW5mbyA6IGxpc3QuZ2V0Q29kZWNJbmZvcygpKSB7Ci0gICAgICAgICAgICBpZiAoY29kZWNOYW1lLmVxdWFscyhpbmZvLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCiAgICAgcHVibGljIENvZGVjTGlzdCBjcmVhdGVDb2RlY0xpc3QoCi0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsIFN0cmluZyBtaW1lLCBTdHJpbmcgZ29vZ2xlQ29kZWNOYW1lLCBpbnQgLi4ucmVzb3VyY2VzKSB7Ci0gICAgICAgIGlmICghaGFzQ29kZWMoZ29vZ2xlQ29kZWNOYW1lKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBDb2RlY0ZhbWlseShjb250ZXh0LCBtaW1lLCBnb29nbGVDb2RlY05hbWUsIHJlc291cmNlcyk7CisgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsIFN0cmluZyBtaW1lLCBpbnQgLi4ucmVzb3VyY2VzKSB7CisgICAgICAgIHJldHVybiBuZXcgQ29kZWNGYW1pbHkoY29udGV4dCwgbWltZSwgcmVzb3VyY2VzKTsKICAgICB9CiB9CiAKIGNsYXNzIFNXQ29kZWNGYWN0b3J5IGV4dGVuZHMgQ29kZWNGYWN0b3J5IHsKICAgICBwdWJsaWMgQ29kZWNMaXN0IGNyZWF0ZUNvZGVjTGlzdCgKLSAgICAgICAgICAgIENvbnRleHQgY29udGV4dCwgU3RyaW5nIG1pbWUsIFN0cmluZyBnb29nbGVDb2RlY05hbWUsIGludCAuLi5yZXNvdXJjZXMpIHsKLSAgICAgICAgaWYgKCFoYXNDb2RlYyhnb29nbGVDb2RlY05hbWUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IENvZGVjQnlOYW1lKGNvbnRleHQsIG1pbWUsIGdvb2dsZUNvZGVjTmFtZSwgcmVzb3VyY2VzKTsKKyAgICAgICAgICAgIENvbnRleHQgY29udGV4dCwgU3RyaW5nIG1pbWUsIGludCAuLi5yZXNvdXJjZXMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDb2RlY0ZhbWlseVNwZWNpZmljKGNvbnRleHQsIG1pbWUsIHRydWUsIHJlc291cmNlcyk7CiAgICAgfQogfQogCiBjbGFzcyBIV0NvZGVjRmFjdG9yeSBleHRlbmRzIENvZGVjRmFjdG9yeSB7CiAgICAgcHVibGljIENvZGVjTGlzdCBjcmVhdGVDb2RlY0xpc3QoCi0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsIFN0cmluZyBtaW1lLCBTdHJpbmcgZ29vZ2xlQ29kZWNOYW1lLCBpbnQgLi4ucmVzb3VyY2VzKSB7Ci0gICAgICAgIGlmICghaGFzQ29kZWMoZ29vZ2xlQ29kZWNOYW1lKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBDb2RlY0ZhbWlseUV4Y2VwdChjb250ZXh0LCBtaW1lLCBnb29nbGVDb2RlY05hbWUsIHJlc291cmNlcyk7CisgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsIFN0cmluZyBtaW1lLCBpbnQgLi4ucmVzb3VyY2VzKSB7CisgICAgICAgIHJldHVybiBuZXcgQ29kZWNGYW1pbHlTcGVjaWZpYyhjb250ZXh0LCBtaW1lLCBmYWxzZSwgcmVzb3VyY2VzKTsKICAgICB9CiB9CiAKQEAgLTE2MzMsMTAgKzE2MDYsMTYgQEAKICAgICAgICAgICAgIGZvcm1hdCA9IGMubWVkaWFMaXN0W2ldLmdldEZvcm1hdCgpOwogICAgICAgICB9IGVsc2UgaWYgKG1Gb3JtYXRUeXBlID09IEZPUk1BVF9BREFQVElWRV9GSVJTVCAmJiBjLmFkYXB0aXZlKSB7CiAgICAgICAgICAgICBmb3JtYXQgPSBjLm1lZGlhTGlzdFtpXS5nZXRBZGFwdGl2ZUZvcm1hdCgKLSAgICAgICAgICAgICAgICBjLm1lZGlhTGlzdFtpXS5nZXRXaWR0aCgpLCBjLm1lZGlhTGlzdFtpXS5nZXRIZWlnaHQoKSk7CisgICAgICAgICAgICAgICAgYy5tZWRpYUxpc3RbaV0uZ2V0V2lkdGgoKSwgYy5tZWRpYUxpc3RbaV0uZ2V0SGVpZ2h0KCksIGMubWVkaWFMaXN0W2ldLmdldE1heElucHV0U2l6ZSgpKTsKKyAgICAgICAgICAgIGZvciAoTWVkaWEgbWVkaWEgOiBjLm1lZGlhTGlzdCkgeworICAgICAgICAgICAgICAgIC8qIGdldCB0aGUgbGFyZ2VzdCBtYXggaW5wdXQgc2l6ZSBmb3IgYWxsIG1lZGlhIGFuZCB1c2UgdGhhdCAqLworICAgICAgICAgICAgICAgIGlmIChtZWRpYS5nZXRNYXhJbnB1dFNpemUoKSA+IGZvcm1hdC5nZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9NQVhfSU5QVVRfU0laRSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0LnNldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX01BWF9JTlBVVF9TSVpFLCBtZWRpYS5nZXRNYXhJbnB1dFNpemUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKG1Gb3JtYXRUeXBlID09IEZPUk1BVF9BREFQVElWRV9MQVJHRVNUICYmIGMuYWRhcHRpdmUpIHsKICAgICAgICAgICAgIC8qIHVwZGF0ZSBhZGFwdGl2ZSBmb3JtYXQgdG8gbWF4IHNpemUgdXNlZCAqLwotICAgICAgICAgICAgZm9ybWF0ID0gYy5tZWRpYUxpc3RbaV0uZ2V0QWRhcHRpdmVGb3JtYXQoMCwgMCk7CisgICAgICAgICAgICBmb3JtYXQgPSBjLm1lZGlhTGlzdFtpXS5nZXRBZGFwdGl2ZUZvcm1hdCgwLCAwLCAwKTsKICAgICAgICAgICAgIGZvciAoTWVkaWEgbWVkaWEgOiBjLm1lZGlhTGlzdCkgewogICAgICAgICAgICAgICAgIC8qIGdldCB0aGUgbGFyZ2VzdCB3aWR0aCwgYW5kIHRoZSBsYXJnZXN0IGhlaWdodCBpbmRlcGVuZGVudGx5ICovCiAgICAgICAgICAgICAgICAgaWYgKG1lZGlhLmdldFdpZHRoKCkgPiBmb3JtYXQuZ2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfTUFYX1dJRFRIKSkgewpAQCAtMTY0NSw2ICsxNjI0LDkgQEAKICAgICAgICAgICAgICAgICBpZiAobWVkaWEuZ2V0SGVpZ2h0KCkgPiBmb3JtYXQuZ2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfTUFYX0hFSUdIVCkpIHsKICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LnNldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX01BWF9IRUlHSFQsIG1lZGlhLmdldEhlaWdodCgpKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1lZGlhLmdldE1heElucHV0U2l6ZSgpID4gZm9ybWF0LmdldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX01BWF9JTlBVVF9TSVpFKSkgeworICAgICAgICAgICAgICAgICAgICBmb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfTUFYX0lOUFVUX1NJWkUsIG1lZGlhLmdldE1heElucHV0U2l6ZSgpKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZvcm1hdDsKQEAgLTE3ODQsNCArMTc2NiwzIEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiB9Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9BdWRpb0VmZmVjdFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9BdWRpb0VmZmVjdFRlc3QuamF2YQppbmRleCBiYWE5MjZlLi5hZTg0NThjIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvQXVkaW9FZmZlY3RUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL0F1ZGlvRWZmZWN0VGVzdC5qYXZhCkBAIC0zMSwxMCArMzEsMTIgQEAKIGltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUmVjb3JkZXI7CiAKIGltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGphdmEudXRpbC5VVUlEOwogCitAQXBwTW9kZUZ1bGwocmVhc29uID0gIkR5bmFtaWMgY29uZ2ljIG5vdCBzdXBwb3J0ZWQiKQogcHVibGljIGNsYXNzIEF1ZGlvRWZmZWN0VGVzdCBleHRlbmRzIFBvc3RQcm9jVGVzdEJhc2UgewogCiAgICAgcHJpdmF0ZSBTdHJpbmcgVEFHID0gIkF1ZGlvRWZmZWN0VGVzdCI7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvQXVkaW9Gb2N1c1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9BdWRpb0ZvY3VzVGVzdC5qYXZhCmluZGV4IGFmYzI3MmUuLmYxNTZhZGEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9BdWRpb0ZvY3VzVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9BdWRpb0ZvY3VzVGVzdC5qYXZhCkBAIC0xNiwxMiArMTYsMTUgQEAKIAogcGFja2FnZSBhbmRyb2lkLm1lZGlhLmN0czsKIAoraW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQXR0cmlidXRlczsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvRm9jdXNSZXF1ZXN0OwogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyLk9uQXVkaW9Gb2N1c0NoYW5nZUxpc3RlbmVyOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXJUaHJlYWQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ3RzQW5kcm9pZFRlc3RDYXNlOwogCkBAIC0zOCw2ICs0MSwxMCBAQAogICAgICAgICAgICAgLnNldFVzYWdlKEF1ZGlvQXR0cmlidXRlcy5VU0FHRV9NRURJQSkKICAgICAgICAgICAgIC5zZXRDb250ZW50VHlwZShBdWRpb0F0dHJpYnV0ZXMuQ09OVEVOVF9UWVBFX01VU0lDKQogICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXVkaW9BdHRyaWJ1dGVzIEFUVFJfQTExWSA9IG5ldyBBdWRpb0F0dHJpYnV0ZXMuQnVpbGRlcigpCisgICAgICAgICAgICAuc2V0VXNhZ2UoQXVkaW9BdHRyaWJ1dGVzLlVTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWSkKKyAgICAgICAgICAgIC5zZXRDb250ZW50VHlwZShBdWRpb0F0dHJpYnV0ZXMuQ09OVEVOVF9UWVBFX1NQRUVDSCkKKyAgICAgICAgICAgIC5idWlsZCgpOwogCiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEF1ZGlvRm9jdXNSZXF1ZXN0RGVsYXlOb0xpc3RlbmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0xNjQsMjMgKzE3MSw3NyBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RBdWRpb0ZvY3VzUmVxdWVzdEdhaW5Mb3NzVHJhbnNpZW50RHVjaygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoaGFzQXV0b21vdGl2ZUZlYXR1cmUoZ2V0Q29udGV4dCgpKSkgeworICAgICAgICAgICAgTG9nLmkoVEFHLCJUZXN0IHRlc3RBdWRpb0ZvY3VzUmVxdWVzdEdhaW5Mb3NzVHJhbnNpZW50RHVjayAiCisgICAgICAgICAgICAgICAgICAgICsgInNraXBwZWQ6IG5vdCByZXF1aXJlZCBmb3IgQXV0byBwbGF0Zm9ybSIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKICAgICAgICAgZmluYWwgQXVkaW9BdHRyaWJ1dGVzW10gYXR0cmlidXRlcyA9IHsgQVRUUl9EUklWRV9ESVIsIEFUVFJfTUVESUEgfTsKICAgICAgICAgZG9UZXN0VHdvUGxheWVyc0dhaW5Mb3NzKEF1ZGlvTWFuYWdlci5BVURJT0ZPQ1VTX0dBSU5fVFJBTlNJRU5UX01BWV9EVUNLLCBhdHRyaWJ1dGVzLAogICAgICAgICAgICAgICAgIGZhbHNlIC8qbm8gaGFuZGxlciovKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0QXVkaW9Gb2N1c1JlcXVlc3RHYWluTG9zc1RyYW5zaWVudER1Y2tIYW5kbGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChoYXNBdXRvbW90aXZlRmVhdHVyZShnZXRDb250ZXh0KCkpKSB7CisgICAgICAgICAgICBMb2cuaShUQUcsIlRlc3QgdGVzdEF1ZGlvRm9jdXNSZXF1ZXN0R2Fpbkxvc3NUcmFuc2llbnREdWNrSGFuZGxlciAiCisgICAgICAgICAgICAgICAgICAgICsgInNraXBwZWQ6IG5vdCByZXF1aXJlZCBmb3IgQXV0byBwbGF0Zm9ybSIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKICAgICAgICAgZmluYWwgQXVkaW9BdHRyaWJ1dGVzW10gYXR0cmlidXRlcyA9IHsgQVRUUl9EUklWRV9ESVIsIEFUVFJfTUVESUEgfTsKICAgICAgICAgZG9UZXN0VHdvUGxheWVyc0dhaW5Mb3NzKEF1ZGlvTWFuYWdlci5BVURJT0ZPQ1VTX0dBSU5fVFJBTlNJRU5UX01BWV9EVUNLLCBhdHRyaWJ1dGVzLAogICAgICAgICAgICAgICAgIHRydWUgLyp3aXRoIGhhbmRsZXIqLyk7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgdGVzdEF1ZGlvRm9jdXNSZXF1ZXN0Rm9yY2VEdWNrTm90QTExeSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoaGFzQXV0b21vdGl2ZUZlYXR1cmUoZ2V0Q29udGV4dCgpKSkgeworICAgICAgICAgICAgTG9nLmkoVEFHLCJUZXN0IHRlc3RBdWRpb0ZvY3VzUmVxdWVzdEZvcmNlRHVja05vdEExMXkgIgorICAgICAgICAgICAgICAgICAgICArICJza2lwcGVkOiBub3QgcmVxdWlyZWQgZm9yIEF1dG8gcGxhdGZvcm0iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHZlcmlmeSBhIHJlcXVlc3QgdGhhdCBpcyAiZm9yY2UgZHVjayInZCBzdGlsbCBjYXVzZXMgbG9zcyBvZiBmb2N1cyBiZWNhdXNlIGl0IGRvZXNuJ3QKKyAgICAgICAgLy8gY29tZSBmcm9tIGFuIEExMXkgc2VydmljZSwgYW5kIHJlcXVlc3RzIGFyZSBmcm9tIHNhbWUgdWlkCisgICAgICAgIGZpbmFsIEF1ZGlvQXR0cmlidXRlc1tdIGF0dHJpYnV0ZXMgPSB7QVRUUl9NRURJQSwgQVRUUl9BMTFZfTsKKyAgICAgICAgZG9UZXN0VHdvUGxheWVyc0dhaW5Mb3NzKEF1ZGlvTWFuYWdlci5BVURJT0ZPQ1VTX0dBSU5fVFJBTlNJRU5UX01BWV9EVUNLLCBhdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgIGZhbHNlIC8qbm8gaGFuZGxlciovLCB0cnVlIC8qIGZvcmNlRHVja2luZyAqLyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lIGlmIGF1dG9tb3RpdmUgZmVhdHVyZSBpcyBhdmFpbGFibGUKKyAgICAgKiBAcGFyYW0gY29udGV4dCBjb250ZXh0IHRvIHF1ZXJ5CisgICAgICogQHJldHVybiB0cnVlIGlmIGF1dG9tb3RpdmUgZmVhdHVyZSBpcyBhdmFpbGFibGUKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGhhc0F1dG9tb3RpdmVGZWF0dXJlKENvbnRleHQgY29udGV4dCkgeworICAgICAgICByZXR1cm4gY29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9BVVRPTU9USVZFKTsKKyAgICB9CisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gVGVzdCB1dGlsaXRpZXMKKwogICAgIC8qKgogICAgICAqIFRlc3QgZm9jdXMgcmVxdWVzdCBhbmQgYWJhbmRvbiBiZXR3ZWVuIHR3byBmb2N1cyBvd25lcnMKICAgICAgKiBAcGFyYW0gZ2FpblR5cGUgZm9jdXMgZ2FpbiBvZiB0aGUgZm9jdXMgb3duZXIgb24gdG9wICg9PSAybmQgZm9jdXMgcmVxdWVzdGVyKQogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBkb1Rlc3RUd29QbGF5ZXJzR2Fpbkxvc3MoaW50IGdhaW5UeXBlLCBBdWRpb0F0dHJpYnV0ZXNbXSBhdHRyaWJ1dGVzLAogICAgICAgICAgICAgYm9vbGVhbiB1c2VIYW5kbGVySW5MaXN0ZW5lcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGRvVGVzdFR3b1BsYXllcnNHYWluTG9zcyhnYWluVHlwZSwgYXR0cmlidXRlcywgdXNlSGFuZGxlckluTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgZmFsc2UgLypmb3JjZUR1Y2tpbmcqLyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2FtZSBhcyB7QGxpbmsgI2RvVGVzdFR3b1BsYXllcnNHYWluTG9zcyhpbnQsIEF1ZGlvQXR0cmlidXRlc1tdLCBib29sZWFuKX0gd2l0aCBmb3JjZUR1Y2tpbmcKKyAgICAgKiAgIHNldCB0byBmYWxzZS4KKyAgICAgKiBAcGFyYW0gZ2FpblR5cGUKKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlcworICAgICAqIEBwYXJhbSB1c2VIYW5kbGVySW5MaXN0ZW5lcgorICAgICAqIEBwYXJhbSBmb3JjZUR1Y2tpbmcgdmFsdWUgdXNlZCBmb3Igc2V0Rm9yY2VEdWNraW5nIGluIHJlcXVlc3QgZm9yIGZvY3VzIHJlcXVlc3RlciBhdCB0b3Agb2YKKyAgICAgKiAgIHN0YWNrIChzZWNvbmQgcmVxdWVzdGVyIGluIHRlc3QpLgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGRvVGVzdFR3b1BsYXllcnNHYWluTG9zcyhpbnQgZ2FpblR5cGUsIEF1ZGlvQXR0cmlidXRlc1tdIGF0dHJpYnV0ZXMsCisgICAgICAgICAgICBib29sZWFuIHVzZUhhbmRsZXJJbkxpc3RlbmVyLCBib29sZWFuIGZvcmNlRHVja2luZykgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIGludCBOQl9GT0NVU19PV05FUlMgPSAyOwogICAgICAgICBpZiAoTkJfRk9DVVNfT1dORVJTICE9IGF0dHJpYnV0ZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHRlc3Q6IGludmFsaWQgbnVtYmVyIG9mIGF0dHJpYnV0ZXMiKTsKQEAgLTIxNiwxNSArMjc3LDE4IEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBOQl9GT0NVU19PV05FUlMgOyBpKyspIHsKICAgICAgICAgICAgICAgICBmb2N1c0xpc3RlbmVyc1tpXSA9IG5ldyBGb2N1c0NoYW5nZUxpc3RlbmVyKCk7CisgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBmb3JjZUR1Y2sgPSBpID09IE5CX0ZPQ1VTX09XTkVSUyAtIDEgPyBmb3JjZUR1Y2tpbmcgOiBmYWxzZTsKICAgICAgICAgICAgICAgICBpZiAoaCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIGZvY3VzUmVxdWVzdHNbaV0gPSBuZXcgQXVkaW9Gb2N1c1JlcXVlc3QuQnVpbGRlcihmb2N1c0dhaW5zW2ldKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRBdWRpb0F0dHJpYnV0ZXMoYXR0cmlidXRlc1tpXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0T25BdWRpb0ZvY3VzQ2hhbmdlTGlzdGVuZXIoZm9jdXNMaXN0ZW5lcnNbaV0sIGggLypoYW5kbGVyKi8pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZvcmNlRHVja2luZyhmb3JjZUR1Y2spCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgZm9jdXNSZXF1ZXN0c1tpXSA9IG5ldyBBdWRpb0ZvY3VzUmVxdWVzdC5CdWlsZGVyKGZvY3VzR2FpbnNbaV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEF1ZGlvQXR0cmlidXRlcyhhdHRyaWJ1dGVzW2ldKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRPbkF1ZGlvRm9jdXNDaGFuZ2VMaXN0ZW5lcihmb2N1c0xpc3RlbmVyc1tpXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0Rm9yY2VEdWNraW5nKGZvcmNlRHVjaykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0yNDQsOCArMzA4LDE1IEBACiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIjFzdCBhYmFuZG9uIGZhaWxlZCIsIEF1ZGlvTWFuYWdlci5BVURJT0ZPQ1VTX1JFUVVFU1RfR1JBTlRFRCwgcmVzKTsKICAgICAgICAgICAgIGZvY3VzUmVxdWVzdHNbMV0gPSBudWxsOwogICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFRFU1RfVElNSU5HX1RPTEVSQU5DRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkZvY3VzIGdhaW4gbm90IGRpc3BhdGNoZWQiLCBBdWRpb01hbmFnZXIuQVVESU9GT0NVU19HQUlOLAotICAgICAgICAgICAgICAgICAgICBmb2N1c0xpc3RlbmVyc1swXS5nZXRGb2N1c0NoYW5nZUFuZFJlc2V0KCkpOworICAgICAgICAgICAgLy8gd2hlbiBmb2N1cyB3YXMgbG9zdCBiZWNhdXNlIGl0IHdhcyByZXF1ZXN0ZWQgd2l0aCBHQUlOLCBmb2N1cyBpcyBub3QgZ2l2ZW4gYmFjaworICAgICAgICAgICAgaWYgKGdhaW5UeXBlICE9IEF1ZGlvTWFuYWdlci5BVURJT0ZPQ1VTX0dBSU4pIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkZvY3VzIGdhaW4gbm90IGRpc3BhdGNoZWQiLCBBdWRpb01hbmFnZXIuQVVESU9GT0NVU19HQUlOLAorICAgICAgICAgICAgICAgICAgICAgICAgZm9jdXNMaXN0ZW5lcnNbMF0uZ2V0Rm9jdXNDaGFuZ2VBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gdmVyaWZ5IHRoZXJlIHdhcyBubyBmb2N1cyBjaGFuZ2UgYmVjYXVzZSBmb2N1cyB1c2VyIDAgd2FzIGtpY2tlZCBvdXQgb2Ygc3RhY2sKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkZvY3VzIGNoYW5nZSB3YXMgZGlzcGF0Y2hlZCIsIEF1ZGlvTWFuYWdlci5BVURJT0ZPQ1VTX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICBmb2N1c0xpc3RlbmVyc1swXS5nZXRGb2N1c0NoYW5nZUFuZFJlc2V0KCkpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgcmVzID0gYW0uYWJhbmRvbkF1ZGlvRm9jdXNSZXF1ZXN0KGZvY3VzUmVxdWVzdHNbMF0pOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIybmQgYWJhbmRvbiBmYWlsZWQiLCBBdWRpb01hbmFnZXIuQVVESU9GT0NVU19SRVFVRVNUX0dSQU5URUQsIHJlcyk7CiAgICAgICAgICAgICBmb2N1c1JlcXVlc3RzWzBdID0gbnVsbDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9BdWRpb01hbmFnZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvQXVkaW9NYW5hZ2VyVGVzdC5qYXZhCmluZGV4IGFiN2U0YjYuLjY3MTExZTkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9BdWRpb01hbmFnZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL0F1ZGlvTWFuYWdlclRlc3QuamF2YQpAQCAtMjYsOCArMjYsOSBAQAogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLkF1ZGlvTWFuYWdlci5SSU5HRVJfTU9ERV9OT1JNQUw7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyLlJJTkdFUl9NT0RFX1NJTEVOVDsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXIuUklOR0VSX01PREVfVklCUkFURTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLkF1ZGlvTWFuYWdlci5TVFJFQU1fQUNDRVNTSUJJTElUWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLkF1ZGlvTWFuYWdlci5TVFJFQU1fUklORzsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXIuVVNFX0RFRkFVTFRfU1RSRUFNX1RZUEU7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyLlZJQlJBVEVfU0VUVElOR19PRkY7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyLlZJQlJBVEVfU0VUVElOR19PTjsKQEAgLTM3LDE0ICszOCwyMCBAQAogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlN5c3RlbS5TT1VORF9FRkZFQ1RTX0VOQUJMRUQ7CiAKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uQ2hhbm5lbDsKIGltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb25NYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9TeXN0ZW07CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0RldmljZUluZm87CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1pY3JvcGhvbmVJbmZvOwogaW1wb3J0IGFuZHJvaWQub3MuVmlicmF0b3I7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5TeXN0ZW07CiBpbXBvcnQgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RDYXNlOwpAQCAtNTIsMTAgKzU5LDEzIEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LlNvdW5kRWZmZWN0Q29uc3RhbnRzOwogCiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogcHVibGljIGNsYXNzIEF1ZGlvTWFuYWdlclRlc3QgZXh0ZW5kcyBJbnN0cnVtZW50YXRpb25UZXN0Q2FzZSB7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBRyA9ICJBdWRpb01hbmFnZXJUZXN0IjsKIAorICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGxvbmcgTVVURV9ERUxBWSA9IDUwOwogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBNUDNfVE9fUExBWSA9IFIucmF3LnRlc3RtcDM7CiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgbG9uZyBUSU1FX1RPX1BMQVkgPSAyMDAwOwogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBUFBPUFNfT1BfU1RSID0gImFuZHJvaWQ6d3JpdGVfc2V0dGluZ3MiOwpAQCAtNzcsNiArODcsOCBAQAogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBBU1lOQ19USU1JTkdfVE9MRVJBTkNFX01TID0gNTA7CiAgICAgcHJpdmF0ZSBpbnQgbU9yaWdpbmFsUmluZ2VyTW9kZTsKICAgICBwcml2YXRlIE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiBtT3JpZ2luYWxTdHJlYW1Wb2x1bWVzID0gbmV3IEhhc2hNYXA8PigpOworICAgIHByaXZhdGUgTm90aWZpY2F0aW9uTWFuYWdlci5Qb2xpY3kgbU9yaWdpbmFsTm90aWZpY2F0aW9uUG9saWN5OworICAgIHByaXZhdGUgaW50IG1PcmlnaW5hbFplbjsKIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0xMTQsNiArMTI2LDE5IEBACiAgICAgICAgIGZvciAoaW50IHN0cmVhbVR5cGUgOiBzdHJlYW1UeXBlcykgewogICAgICAgICAgICAgbU9yaWdpbmFsU3RyZWFtVm9sdW1lcy5wdXQoc3RyZWFtVHlwZSwgbUF1ZGlvTWFuYWdlci5nZXRTdHJlYW1Wb2x1bWUoc3RyZWFtVHlwZSkpOwogICAgICAgICB9CisKKyAgICAgICAgaWYgKG1TdXBwb3J0Tm90aWZpY2F0aW9uUG9saWN5QWNjZXNzKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFV0aWxzLnRvZ2dsZU5vdGlmaWNhdGlvblBvbGljeUFjY2VzcygKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCksIGdldEluc3RydW1lbnRhdGlvbigpLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBtT3JpZ2luYWxOb3RpZmljYXRpb25Qb2xpY3kgPSBtTm0uZ2V0Tm90aWZpY2F0aW9uUG9saWN5KCk7CisgICAgICAgICAgICAgICAgbU9yaWdpbmFsWmVuID0gbU5tLmdldEN1cnJlbnRJbnRlcnJ1cHRpb25GaWx0ZXIoKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgc2V0SW50ZXJydXB0aW9uRmlsdGVyKE5vdGlmaWNhdGlvbk1hbmFnZXIuSU5URVJSVVBUSU9OX0ZJTFRFUl9BTEwpOworICAgICAgICAgICAgICAgIFV0aWxzLnRvZ2dsZU5vdGlmaWNhdGlvblBvbGljeUFjY2VzcygKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCksIGdldEluc3RydW1lbnRhdGlvbigpLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTEyNCw2ICsxNDksOCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgVXRpbHMudG9nZ2xlTm90aWZpY2F0aW9uUG9saWN5QWNjZXNzKAogICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpLCBnZXRJbnN0cnVtZW50YXRpb24oKSwgdHJ1ZSk7CisgICAgICAgICAgICBtTm0uc2V0Tm90aWZpY2F0aW9uUG9saWN5KG1PcmlnaW5hbE5vdGlmaWNhdGlvblBvbGljeSk7CisgICAgICAgICAgICBzZXRJbnRlcnJ1cHRpb25GaWx0ZXIobU9yaWdpbmFsWmVuKTsKIAogICAgICAgICAgICAgLy8gUmVjb3ZlciB0aGUgdm9sdW1lIGFuZCB0aGUgcmluZ2VyIG1vZGUgdGhhdCB0aGUgdGVzdCBtYXkgaGF2ZSBvdmVyd3JpdHRlbi4KICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PEludGVnZXIsIEludGVnZXI+IGUgOiBtT3JpZ2luYWxTdHJlYW1Wb2x1bWVzLmVudHJ5U2V0KCkpIHsKQEAgLTEzNyw2ICsxNjQsNyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQEFwcE1vZGVGdWxsKHJlYXNvbiA9ICJJbnN0YW50IGFwcHMgY2Fubm90IGhvbGQgYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9BVURJT19TRVRUSU5HUyIpCiAgICAgcHVibGljIHZvaWQgdGVzdE1pY3JvcGhvbmVNdXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0TWljcm9waG9uZU11dGUodHJ1ZSk7CiAgICAgICAgIGFzc2VydFRydWUobUF1ZGlvTWFuYWdlci5pc01pY3JvcGhvbmVNdXRlKCkpOwpAQCAtMTQ0LDYgKzE3Miw4MCBAQAogICAgICAgICBhc3NlcnRGYWxzZShtQXVkaW9NYW5hZ2VyLmlzTWljcm9waG9uZU11dGUoKSk7CiAgICAgfQogCisgICAgQEFwcE1vZGVGdWxsKHJlYXNvbiA9ICJJbnN0YW50IGFwcHMgY2Fubm90IGhvbGQgYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9BVURJT19TRVRUSU5HUyIpCisgICAgcHVibGljIHZvaWQgdGVzdE1pY3JvcGhvbmVNdXRlSW50ZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFNraXAgdGhpcyB0ZXN0IGZvciBhdXRvbW90aXZlLgorICAgICAgICAvLyBUaGlzIHRlc3RzIGxpc3RlbnMgZm9yIEFDVElPTl9NSUNST1BIT05FX01VVEVfQ0hBTkdFRCB3aGljaCBBdWRpb1NlcnZpY2Ugb25seSBicm9hZGNhc3RzCisgICAgICAgIC8vIHRvIHN5c3RlbSB1c2VyLiBBdXRvbW90aXZlIGRldmljZXMsIHdoaWNoIHJ1bnMgaW4gc2Vjb25kYXJ5IHVzZXIsIHdpbGwgZmFpbCB0aGlzIHRlc3QuCisgICAgICAgIGlmIChtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9BVVRPTU9USVZFKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZpbmFsIE15QmxvY2tpbmdJbnRlbnRSZWNlaXZlciByZWNlaXZlciA9IG5ldyBNeUJsb2NraW5nSW50ZW50UmVjZWl2ZXIoKTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBpbml0aWFsTWljTXV0ZSA9IG1BdWRpb01hbmFnZXIuaXNNaWNyb3Bob25lTXV0ZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihyZWNlaXZlciwKKyAgICAgICAgICAgICAgICAgICAgbmV3IEludGVudEZpbHRlcihBdWRpb01hbmFnZXIuQUNUSU9OX01JQ1JPUEhPTkVfTVVURV9DSEFOR0VEKSk7CisgICAgICAgICAgICAvLyBjaGFuZ2UgdGhlIG1pYyBtdXRlIHN0YXRlCisgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLnNldE1pY3JvcGhvbmVNdXRlKCFpbml0aWFsTWljTXV0ZSk7CisgICAgICAgICAgICAvLyB2ZXJpZnkgYSBjaGFuZ2Ugd2FzIHJlcG9ydGVkCisgICAgICAgICAgICBmaW5hbCBib29sZWFuIGludGVudEZpcmVkID0gcmVjZWl2ZXIud2FpdEZvck1pY011dGVDaGFuZ2VkKDUwMC8qbXMqLyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJBQ1RJT05fTUlDUk9QSE9ORV9NVVRFX0NIQU5HRUQgd2Fzbid0IGZpcmVkIiwgaW50ZW50RmlyZWQpOworICAgICAgICAgICAgLy8gdmVyaWZ5IHRoZSBtaWMgbXV0ZSBzdGF0ZSBpcyBleHBlY3RlZAorICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBuZXdNaWNNdXRlID0gbUF1ZGlvTWFuYWdlci5pc01pY3JvcGhvbmVNdXRlKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJuZXcgbWljIG11dGUgc3RhdGUgbm90IGFzIGV4cGVjdGVkICgiICsgIWluaXRpYWxNaWNNdXRlICsgIikiLAorICAgICAgICAgICAgICAgICAgICBuZXdNaWNNdXRlID09ICFpbml0aWFsTWljTXV0ZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBtQ29udGV4dC51bnJlZ2lzdGVyUmVjZWl2ZXIocmVjZWl2ZXIpOworICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRNaWNyb3Bob25lTXV0ZShpbml0aWFsTWljTXV0ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBoZWxwZXIgY2xhc3MgdG8gc2ltcGxpZnkgdGhhdCBhYnN0cmFjdHMgb3V0IHRoZSBoYW5kbGluZyBvZiBzcHVyaW91cyB3YWtldXBzIGluIE9iamVjdC53YWl0KCkKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBTYWZlV2FpdE9iamVjdCB7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtUXVpdCA9IGZhbHNlOworCisgICAgICAgIHB1YmxpYyB2b2lkIHNhZmVOb3RpZnkoKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgICAgICBtUXVpdCA9IHRydWU7CisgICAgICAgICAgICAgICAgdGhpcy5ub3RpZnkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNhZmVXYWl0KGxvbmcgbWlsbGlzKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgbG9uZyB0aW1lT3V0VGltZSA9IGphdmEubGFuZy5TeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIG1pbGxpczsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgICAgIHdoaWxlICghbVF1aXQpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgbG9uZyB0aW1lVG9XYWl0ID0gdGltZU91dFRpbWUgLSBqYXZhLmxhbmcuU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0aW1lVG9XYWl0IDwgMCkgeyBicmVhazsgfQorICAgICAgICAgICAgICAgICAgICB0aGlzLndhaXQodGltZVRvV2FpdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgTXlCbG9ja2luZ0ludGVudFJlY2VpdmVyIGV4dGVuZHMgQnJvYWRjYXN0UmVjZWl2ZXIgeworICAgICAgICBwcml2YXRlIGZpbmFsIFNhZmVXYWl0T2JqZWN0IG1Mb2NrID0gbmV3IFNhZmVXYWl0T2JqZWN0KCk7CisgICAgICAgIC8vIHN0YXRlIHByb3RlY3RlZCBieSBtTG9jaworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUludGVudFJlY2VpdmVkID0gZmFsc2U7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgICAgICBtSW50ZW50UmVjZWl2ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIG1Mb2NrLnNhZmVOb3RpZnkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIHdhaXRGb3JNaWNNdXRlQ2hhbmdlZChsb25nIHRpbWVPdXRNcykgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnNhZmVXYWl0KHRpbWVPdXRNcyk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeyB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG1JbnRlbnRSZWNlaXZlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHRlc3RTb3VuZEVmZmVjdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLnB1dEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwgU09VTkRfRUZGRUNUU19FTkFCTEVELCAxKTsKIApAQCAtMTc2LDYgKzI3OCwzMiBAQAogICAgICAgICBtQXVkaW9NYW5hZ2VyLnBsYXlTb3VuZEVmZmVjdChBdWRpb01hbmFnZXIuRlhfRk9DVVNfTkFWSUdBVElPTl9SSUdIVCwgdm9sdW1lKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tpbmdaZW5Nb2RlQmxvY2tEb2VzTm90UmVxdWlyZU5vdGlmaWNhdGlvblBvbGljeUFjY2VzcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIW1TdXBwb3J0Tm90aWZpY2F0aW9uUG9saWN5QWNjZXNzKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIHNldCB6ZW4gbW9kZSB0byBwcmlvcml0eSBvbmx5LCBzbyBwbGF5U291bmRFZmZlY3Qgd2lsbCBjaGVjayBub3RpZmljYXRpb24gcG9saWN5CisgICAgICAgICAgICBVdGlscy50b2dnbGVOb3RpZmljYXRpb25Qb2xpY3lBY2Nlc3MobUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSwgZ2V0SW5zdHJ1bWVudGF0aW9uKCksCisgICAgICAgICAgICAgICAgICAgIHRydWUpOworICAgICAgICAgICAgc2V0SW50ZXJydXB0aW9uRmlsdGVyKE5vdGlmaWNhdGlvbk1hbmFnZXIuSU5URVJSVVBUSU9OX0ZJTFRFUl9QUklPUklUWSk7CisgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0ucHV0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLCBTT1VORF9FRkZFQ1RTX0VOQUJMRUQsIDEpOworCisgICAgICAgICAgICAvLyB0YWtlIGF3YXkgd3JpdGUtbm90aWZpY2F0aW9uIHBvbGljeSBhY2Nlc3MgZnJvbSB0aGUgcGFja2FnZQorICAgICAgICAgICAgVXRpbHMudG9nZ2xlTm90aWZpY2F0aW9uUG9saWN5QWNjZXNzKG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCksIGdldEluc3RydW1lbnRhdGlvbigpLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisKKyAgICAgICAgICAgIC8vIHBsYXlTb3VuZEVmZmVjdCBzaG91bGQgTk9UIHRocm93IGEgc2VjdXJpdHkgZXhjZXB0aW9uOyBhbGwgYXBwcyBoYXZlIHJlYWQtYWNjZXNzCisgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLnBsYXlTb3VuZEVmZmVjdChTb3VuZEVmZmVjdENvbnN0YW50cy5DTElDSyk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBVdGlscy50b2dnbGVOb3RpZmljYXRpb25Qb2xpY3lBY2Nlc3MobUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSwgZ2V0SW5zdHJ1bWVudGF0aW9uKCksCisgICAgICAgICAgICAgICAgICAgIHRydWUpOworICAgICAgICAgICAgc2V0SW50ZXJydXB0aW9uRmlsdGVyKE5vdGlmaWNhdGlvbk1hbmFnZXIuSU5URVJSVVBUSU9OX0ZJTFRFUl9BTEwpOworICAgICAgICAgICAgVXRpbHMudG9nZ2xlTm90aWZpY2F0aW9uUG9saWN5QWNjZXNzKG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCksIGdldEluc3RydW1lbnRhdGlvbigpLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCB0ZXN0TXVzaWNBY3RpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKG1BdWRpb01hbmFnZXIuaXNNdXNpY0FjdGl2ZSgpKSB7CiAgICAgICAgICAgICByZXR1cm47CkBAIC0xOTMsNiArMzIxLDcgQEAKICAgICAgICAgYXNzZXJ0RmFsc2UobUF1ZGlvTWFuYWdlci5pc011c2ljQWN0aXZlKCkpOwogICAgIH0KIAorICAgIEBBcHBNb2RlRnVsbChyZWFzb24gPSAiSW5zdGFudCBhcHBzIGNhbm5vdCBob2xkIGFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfQVVESU9fU0VUVElOR1MiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0TW9kZShNT0RFX1JJTkdUT05FKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKE1PREVfUklOR1RPTkUsIG1BdWRpb01hbmFnZXIuZ2V0TW9kZSgpKTsKQEAgLTIwMyw2ICszMzIsNyBAQAogICAgIH0KIAogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCisgICAgQEFwcE1vZGVGdWxsKHJlYXNvbiA9ICJJbnN0YW50IGFwcHMgY2Fubm90IGhvbGQgYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9BVURJT19TRVRUSU5HUyIpCiAgICAgcHVibGljIHZvaWQgdGVzdFJvdXRpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gc2V0Qmx1ZXRvb3RoQTJkcE9uIGlzIGEgbm8tb3AsIGFuZCBnZXRSb3V0aW5nIHNob3VsZCBhbHdheXMgcmV0dXJuIC0xCiAgICAgICAgIC8vIEF1ZGlvTWFuYWdlci5NT0RFX0NVUlJFTlQKQEAgLTQ1OCw0NiArNTg4LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHRlc3RWb2x1bWVEbmRBZmZlY3RlZFN0cmVhbSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAobUhhc1ZpYnJhdG9yIHx8IG1Ta2lwUmluZ2VyVGVzdHMgfHwgIW1TdXBwb3J0Tm90aWZpY2F0aW9uUG9saWN5QWNjZXNzKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgVXRpbHMudG9nZ2xlTm90aWZpY2F0aW9uUG9saWN5QWNjZXNzKAotICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCksIGdldEluc3RydW1lbnRhdGlvbigpLCB0cnVlKTsKLSAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRTdHJlYW1Wb2x1bWUoCi0gICAgICAgICAgICAgICAgQXVkaW9NYW5hZ2VyLlNUUkVBTV9TWVNURU0sIDcsIEF1ZGlvTWFuYWdlci5GTEFHX0FMTE9XX1JJTkdFUl9NT0RFUyk7Ci0gICAgICAgIG1BdWRpb01hbmFnZXIuc2V0UmluZ2VyTW9kZShBdWRpb01hbmFnZXIuUklOR0VSX01PREVfTk9STUFMKTsKLSAgICAgICAgVXRpbHMudG9nZ2xlTm90aWZpY2F0aW9uUG9saWN5QWNjZXNzKAotICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCksIGdldEluc3RydW1lbnRhdGlvbigpLCBmYWxzZSk7Ci0gICAgICAgIC8vIDcgdG8gMCwgZmFpbC4KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0U3RyZWFtVm9sdW1lKAotICAgICAgICAgICAgICAgICAgICBBdWRpb01hbmFnZXIuU1RSRUFNX1NZU1RFTSwgMCwgQXVkaW9NYW5hZ2VyLkZMQUdfQUxMT1dfUklOR0VSX01PREVTKTsKLSAgICAgICAgICAgIGZhaWwoIkFwcHMgd2l0aG91dCBub3RpZmljYXRpb24gcG9saWN5IGFjY2VzcyBjYW5ub3QgY2hhbmdlIHJpbmdlciBtb2RlIik7Ci0gICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHt9Ci0KLSAgICAgICAgLy8gNyB0byAxOiBzdWNjZXNzCi0gICAgICAgIG1BdWRpb01hbmFnZXIuc2V0U3RyZWFtVm9sdW1lKAotICAgICAgICAgICAgICAgIEF1ZGlvTWFuYWdlci5TVFJFQU1fU1lTVEVNLCAxLCBBdWRpb01hbmFnZXIuRkxBR19BTExPV19SSU5HRVJfTU9ERVMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInNldFN0cmVhbVZvbHVtZSBkaWQgbm90IGNoYW5nZSB2b2x1bWUiLAotICAgICAgICAgICAgICAgIDEsIG1BdWRpb01hbmFnZXIuZ2V0U3RyZWFtVm9sdW1lKEF1ZGlvTWFuYWdlci5TVFJFQU1fU1lTVEVNKSk7Ci0KLSAgICAgICAgLy8gMCB0byBub24temVybzogZmFpbC4KLSAgICAgICAgVXRpbHMudG9nZ2xlTm90aWZpY2F0aW9uUG9saWN5QWNjZXNzKAotICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCksIGdldEluc3RydW1lbnRhdGlvbigpLCB0cnVlKTsKLSAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRSaW5nZXJNb2RlKEF1ZGlvTWFuYWdlci5SSU5HRVJfTU9ERV9TSUxFTlQpOwotICAgICAgICBtQXVkaW9NYW5hZ2VyLnNldFN0cmVhbVZvbHVtZSgKLSAgICAgICAgICAgICAgICBBdWRpb01hbmFnZXIuU1RSRUFNX1NZU1RFTSwgMCwgQXVkaW9NYW5hZ2VyLkZMQUdfQUxMT1dfUklOR0VSX01PREVTKTsKLSAgICAgICAgVXRpbHMudG9nZ2xlTm90aWZpY2F0aW9uUG9saWN5QWNjZXNzKAotICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCksIGdldEluc3RydW1lbnRhdGlvbigpLCBmYWxzZSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0U3RyZWFtVm9sdW1lKAotICAgICAgICAgICAgICAgICAgICBBdWRpb01hbmFnZXIuU1RSRUFNX1NZU1RFTSwgNiwgQXVkaW9NYW5hZ2VyLkZMQUdfQUxMT1dfUklOR0VSX01PREVTKTsKLSAgICAgICAgICAgIGZhaWwoIkFwcHMgd2l0aG91dCBub3RpZmljYXRpb24gcG9saWN5IGFjY2VzcyBjYW5ub3QgY2hhbmdlIHJpbmdlciBtb2RlIik7Ci0gICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHt9Ci0gICAgfQotCiAgICAgcHVibGljIHZvaWQgdGVzdFZvbHVtZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBpZiAoIW1TdXBwb3J0Tm90aWZpY2F0aW9uUG9saWN5QWNjZXNzKSB7CiAgICAgICAgICAgICByZXR1cm47CkBAIC02OTEsNiArNzgxLDEzIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0Vm9pY2VDYWxsVm9sdW1lVG9aZXJvUGVybWlzc2lvbigpIHsKKyAgICAgICAgLy8gVmVyaWZ5IHRoYXQgb25seSBhcHBzIHdpdGggTU9ESUZZX1BIT05FX1NUQVRFIGNhbiBzZXQgVk9JQ0VfQ0FMTF9TVFJFQU0gdG8gMAorICAgICAgICBtQXVkaW9NYW5hZ2VyLnNldFN0cmVhbVZvbHVtZShBdWRpb01hbmFnZXIuU1RSRUFNX1ZPSUNFX0NBTEwsIDAsIDApOworICAgICAgICBhc3NlcnRUcnVlKCJNT0RJRllfUEhPTkVfU1RBVEUgaXMgcmVxdWlyZWQgaW4gb3JkZXIgdG8gc2V0IHZvaWNlIGNhbGwgdm9sdW1lIHRvIDAiLAorICAgICAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLmdldFN0cmVhbVZvbHVtZShBdWRpb01hbmFnZXIuU1RSRUFNX1ZPSUNFX0NBTEwpICE9IDApOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHRlc3RNdXRlRml4ZWRWb2x1bWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgaW50W10gc3RyZWFtcyA9IHsKICAgICAgICAgICAgICAgICBBdWRpb01hbmFnZXIuU1RSRUFNX1ZPSUNFX0NBTEwsCkBAIC04MDIsMTIgKzg5OSwxMyBAQAogCiAgICAgICAgIGludCBtdXRlQWZmZWN0ZWRTdHJlYW1zID0gU3lzdGVtLmdldEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKICAgICAgICAgICAgICAgICBTeXN0ZW0uTVVURV9TVFJFQU1TX0FGRkVDVEVELAotICAgICAgICAgICAgICAgIC8vIFNhbWUgZGVmYXVsdHMgYXMgaW4gQXVkaW9TZXJ2aWNlLiBTaG91bGQgYmUga2VwdCBpbgotICAgICAgICAgICAgICAgIC8vIHN5bmMuCi0gICAgICAgICAgICAgICAgKCgxIDw8IEF1ZGlvTWFuYWdlci5TVFJFQU1fTVVTSUMpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IEF1ZGlvTWFuYWdlci5TVFJFQU1fUklORykgfAotICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgQXVkaW9NYW5hZ2VyLlNUUkVBTV9OT1RJRklDQVRJT04pIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IEF1ZGlvTWFuYWdlci5TVFJFQU1fU1lTVEVNKSkpOworICAgICAgICAgICAgICAgIC8vIHNhbWUgZGVmYXVsdHMgYXMgaW4gQXVkaW9TZXJ2aWNlLiBTaG91bGQgYmUga2VwdCBpbiBzeW5jLgorICAgICAgICAgICAgICAgICAoMSA8PCBTVFJFQU1fTVVTSUMpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBBdWRpb01hbmFnZXIuU1RSRUFNX1JJTkcpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBBdWRpb01hbmFnZXIuU1RSRUFNX05PVElGSUNBVElPTikgfAorICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IEF1ZGlvTWFuYWdlci5TVFJFQU1fU1lTVEVNKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgQXVkaW9NYW5hZ2VyLlNUUkVBTV9WT0lDRV9DQUxMKSk7CisKICAgICAgICAgVXRpbHMudG9nZ2xlTm90aWZpY2F0aW9uUG9saWN5QWNjZXNzKAogICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCksIGdldEluc3RydW1lbnRhdGlvbigpLCB0cnVlKTsKICAgICAgICAgLy8gVGhpcyBlbnN1cmVzIHdlJ3JlIG91dCBvZiB2aWJyYXRlIG9yIHNpbGVudCBtb2Rlcy4KQEAgLTgzNywzNCArOTM1LDQxIEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHRlc3RTdHJlYW1NdXRpbmcoaW50IHN0cmVhbSkgewotICAgICAgICBtQXVkaW9NYW5hZ2VyLmFkanVzdFN0cmVhbVZvbHVtZShzdHJlYW0sIEF1ZGlvTWFuYWdlci5BREpVU1RfTVVURSwgMCk7Ci0gICAgICAgIGFzc2VydFRydWUoIk11dGluZyBzdHJlYW0gIiArIHN0cmVhbSArICIgZmFpbGVkLiIsCi0gICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5pc1N0cmVhbU11dGUoc3RyZWFtKSk7CisgICAgICAgIC8vIFZvaWNlIGNhbGwgcmVxdWlyZXMgTU9ESUZZX1BIT05FX1NUQVRFLCBzbyB3ZSBzaG91bGQgbm90IGJlIGFibGUgdG8gbXV0ZQorICAgICAgICBpZiAoc3RyZWFtID09IEF1ZGlvTWFuYWdlci5TVFJFQU1fVk9JQ0VfQ0FMTCkgeworICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5hZGp1c3RTdHJlYW1Wb2x1bWUoc3RyZWFtLCBBdWRpb01hbmFnZXIuQURKVVNUX01VVEUsIDApOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoIk11dGluZyB2b2ljZSBjYWxsIHN0cmVhbSAoIiArIHN0cmVhbSArICIpIHNob3VsZCByZXF1aXJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJNT0RJRllfUEhPTkVfU1RBVEUuIiwgbUF1ZGlvTWFuYWdlci5pc1N0cmVhbU11dGUoc3RyZWFtKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLmFkanVzdFN0cmVhbVZvbHVtZShzdHJlYW0sIEF1ZGlvTWFuYWdlci5BREpVU1RfTVVURSwgMCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJNdXRpbmcgc3RyZWFtICIgKyBzdHJlYW0gKyAiIGZhaWxlZC4iLAorICAgICAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLmlzU3RyZWFtTXV0ZShzdHJlYW0pKTsKIAotICAgICAgICBtQXVkaW9NYW5hZ2VyLmFkanVzdFN0cmVhbVZvbHVtZShzdHJlYW0sIEF1ZGlvTWFuYWdlci5BREpVU1RfVU5NVVRFLCAwKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIlVubXV0aW5nIHN0cmVhbSAiICsgc3RyZWFtICsgIiBmYWlsZWQuIiwKLSAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLmlzU3RyZWFtTXV0ZShzdHJlYW0pKTsKKyAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuYWRqdXN0U3RyZWFtVm9sdW1lKHN0cmVhbSwgQXVkaW9NYW5hZ2VyLkFESlVTVF9VTk1VVEUsIDApOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoIlVubXV0aW5nIHN0cmVhbSAiICsgc3RyZWFtICsgIiBmYWlsZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5pc1N0cmVhbU11dGUoc3RyZWFtKSk7CiAKLSAgICAgICAgbUF1ZGlvTWFuYWdlci5hZGp1c3RTdHJlYW1Wb2x1bWUoc3RyZWFtLCBBdWRpb01hbmFnZXIuQURKVVNUX1RPR0dMRV9NVVRFLCAwKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVG9nZ2xpbmcgbXV0ZSBvbiBzdHJlYW0gIiArIHN0cmVhbSArICIgZmFpbGVkLiIsCi0gICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5pc1N0cmVhbU11dGUoc3RyZWFtKSk7CisgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLmFkanVzdFN0cmVhbVZvbHVtZShzdHJlYW0sIEF1ZGlvTWFuYWdlci5BREpVU1RfVE9HR0xFX01VVEUsIDApOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVG9nZ2xpbmcgbXV0ZSBvbiBzdHJlYW0gIiArIHN0cmVhbSArICIgZmFpbGVkLiIsCisgICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuaXNTdHJlYW1NdXRlKHN0cmVhbSkpOwogCi0gICAgICAgIG1BdWRpb01hbmFnZXIuYWRqdXN0U3RyZWFtVm9sdW1lKHN0cmVhbSwgQXVkaW9NYW5hZ2VyLkFESlVTVF9UT0dHTEVfTVVURSwgMCk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJUb2dnbGluZyBtdXRlIG9uIHN0cmVhbSAiICsgc3RyZWFtICsgIiBmYWlsZWQuIiwKLSAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLmlzU3RyZWFtTXV0ZShzdHJlYW0pKTsKKyAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuYWRqdXN0U3RyZWFtVm9sdW1lKHN0cmVhbSwgQXVkaW9NYW5hZ2VyLkFESlVTVF9UT0dHTEVfTVVURSwgMCk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZSgiVG9nZ2xpbmcgbXV0ZSBvbiBzdHJlYW0gIiArIHN0cmVhbSArICIgZmFpbGVkLiIsCisgICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuaXNTdHJlYW1NdXRlKHN0cmVhbSkpOwogCi0gICAgICAgIG1BdWRpb01hbmFnZXIuc2V0U3RyZWFtTXV0ZShzdHJlYW0sIHRydWUpOwotICAgICAgICBhc3NlcnRUcnVlKCJNdXRpbmcgc3RyZWFtICIgKyBzdHJlYW0gKyAiIHVzaW5nIHNldFN0cmVhbU11dGUgZmFpbGVkIiwKLSAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLmlzU3RyZWFtTXV0ZShzdHJlYW0pKTsKKyAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0U3RyZWFtTXV0ZShzdHJlYW0sIHRydWUpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiTXV0aW5nIHN0cmVhbSAiICsgc3RyZWFtICsgIiB1c2luZyBzZXRTdHJlYW1NdXRlIGZhaWxlZCIsCisgICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuaXNTdHJlYW1NdXRlKHN0cmVhbSkpOwogCi0gICAgICAgIC8vIG11dGUgaXQgdGhyZWUgbW9yZSB0aW1lcyB0byB2ZXJpZnkgdGhlIHJlZiBjb3VudGluZyBpcyBnb25lLgotICAgICAgICBtQXVkaW9NYW5hZ2VyLnNldFN0cmVhbU11dGUoc3RyZWFtLCB0cnVlKTsKLSAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRTdHJlYW1NdXRlKHN0cmVhbSwgdHJ1ZSk7Ci0gICAgICAgIG1BdWRpb01hbmFnZXIuc2V0U3RyZWFtTXV0ZShzdHJlYW0sIHRydWUpOworICAgICAgICAgICAgLy8gbXV0ZSBpdCB0aHJlZSBtb3JlIHRpbWVzIHRvIHZlcmlmeSB0aGUgcmVmIGNvdW50aW5nIGlzIGdvbmUuCisgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLnNldFN0cmVhbU11dGUoc3RyZWFtLCB0cnVlKTsKKyAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0U3RyZWFtTXV0ZShzdHJlYW0sIHRydWUpOworICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRTdHJlYW1NdXRlKHN0cmVhbSwgdHJ1ZSk7CiAKLSAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRTdHJlYW1NdXRlKHN0cmVhbSwgZmFsc2UpOwotICAgICAgICBhc3NlcnRGYWxzZSgiVW5tdXRpbmcgc3RyZWFtICIgKyBzdHJlYW0gKyAiIHVzaW5nIHNldFN0cmVhbU11dGUgZmFpbGVkLiIsCi0gICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5pc1N0cmVhbU11dGUoc3RyZWFtKSk7CisgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLnNldFN0cmVhbU11dGUoc3RyZWFtLCBmYWxzZSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZSgiVW5tdXRpbmcgc3RyZWFtICIgKyBzdHJlYW0gKyAiIHVzaW5nIHNldFN0cmVhbU11dGUgZmFpbGVkLiIsCisgICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuaXNTdHJlYW1NdXRlKHN0cmVhbSkpOworICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdFNldEludmFsaWRSaW5nZXJNb2RlKCkgewpAQCAtOTA0LDggKzEwMDksOCBAQAogICAgICAgICAgICAgVXRpbHMudG9nZ2xlTm90aWZpY2F0aW9uUG9saWN5QWNjZXNzKAogICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpLCBnZXRJbnN0cnVtZW50YXRpb24oKSwgdHJ1ZSk7CiAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLnNldFN0cmVhbVZvbHVtZShBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDLCAxLCAwKTsKLSAgICAgICAgICAgIHNldEludGVycnVwdGlvbkZpbHRlcihOb3RpZmljYXRpb25NYW5hZ2VyLklOVEVSUlVQVElPTl9GSUxURVJfQUxBUk1TKTsKIAorICAgICAgICAgICAgc2V0SW50ZXJydXB0aW9uRmlsdGVyKE5vdGlmaWNhdGlvbk1hbmFnZXIuSU5URVJSVVBUSU9OX0ZJTFRFUl9BTEFSTVMpOwogICAgICAgICAgICAgaW50IG11c2ljVm9sdW1lID0gbUF1ZGlvTWFuYWdlci5nZXRTdHJlYW1Wb2x1bWUoQXVkaW9NYW5hZ2VyLlNUUkVBTV9NVVNJQyk7CiAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLmFkanVzdFN0cmVhbVZvbHVtZSgKICAgICAgICAgICAgICAgICAgICAgQXVkaW9NYW5hZ2VyLlNUUkVBTV9NVVNJQywgQXVkaW9NYW5hZ2VyLkFESlVTVF9SQUlTRSwgMCk7CkBAIC05MjgsMTIgKzEwMzMsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSwgZ2V0SW5zdHJ1bWVudGF0aW9uKCksIHRydWUpOwogICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRTdHJlYW1Wb2x1bWUoQXVkaW9NYW5hZ2VyLlNUUkVBTV9SSU5HLCAxLCAwKTsKICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0U3RyZWFtVm9sdW1lKEF1ZGlvTWFuYWdlci5TVFJFQU1fTVVTSUMsIDEsIDApOworCiAgICAgICAgICAgICBzZXRJbnRlcnJ1cHRpb25GaWx0ZXIoTm90aWZpY2F0aW9uTWFuYWdlci5JTlRFUlJVUFRJT05fRklMVEVSX05PTkUpOwogCiAgICAgICAgICAgICBpbnQgbXVzaWNWb2x1bWUgPSBtQXVkaW9NYW5hZ2VyLmdldFN0cmVhbVZvbHVtZShBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDKTsKICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0U3RyZWFtVm9sdW1lKEF1ZGlvTWFuYWdlci5TVFJFQU1fTVVTSUMsIDcsIDApOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG11c2ljVm9sdW1lLCBtQXVkaW9NYW5hZ2VyLmdldFN0cmVhbVZvbHVtZShBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDKSk7Ci0KICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0U3RyZWFtVm9sdW1lKEF1ZGlvTWFuYWdlci5TVFJFQU1fUklORywgNywgMCk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoNywgbUF1ZGlvTWFuYWdlci5nZXRTdHJlYW1Wb2x1bWUoQXVkaW9NYW5hZ2VyLlNUUkVBTV9SSU5HKSk7CiAgICAgICAgIH0gZmluYWxseSB7CkBAIC05NTQsNyArMTA1OSw2IEBACiAKICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0U3RyZWFtVm9sdW1lKEF1ZGlvTWFuYWdlci5TVFJFQU1fTVVTSUMsIDMsIDApOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIG1BdWRpb01hbmFnZXIuZ2V0U3RyZWFtVm9sdW1lKEF1ZGlvTWFuYWdlci5TVFJFQU1fTVVTSUMpKTsKLQogICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRTdHJlYW1Wb2x1bWUoQXVkaW9NYW5hZ2VyLlNUUkVBTV9SSU5HLCA3LCAwKTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscyg3LCBtQXVkaW9NYW5hZ2VyLmdldFN0cmVhbVZvbHVtZShBdWRpb01hbmFnZXIuU1RSRUFNX1JJTkcpKTsKICAgICAgICAgfSBmaW5hbGx5IHsKQEAgLTk2MiwxMSArMTA2NiwzOTMgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRTdHJlYW1Wb2x1bWVJblByaW9yaXR5T25seU1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG1Ta2lwUmluZ2VyVGVzdHMgfHwgIW1TdXBwb3J0Tm90aWZpY2F0aW9uUG9saWN5QWNjZXNzKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgVXRpbHMudG9nZ2xlTm90aWZpY2F0aW9uUG9saWN5QWNjZXNzKAorICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCksIGdldEluc3RydW1lbnRhdGlvbigpLCB0cnVlKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gdHVybiBvZmYgemVuLCBzZXQgc3RyZWFtIHZvbHVtZXMgdG8gY2hlY2sgZm9yIGxhdGVyCisgICAgICAgICAgICBzZXRJbnRlcnJ1cHRpb25GaWx0ZXIoTm90aWZpY2F0aW9uTWFuYWdlci5JTlRFUlJVUFRJT05fRklMVEVSX0FMTCk7CisKKyAgICAgICAgICAgIGZpbmFsIGludCB0ZXN0UmluZ2VyVm9sID0gZ2V0VGVzdFJpbmdlclZvbCgpOworICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRTdHJlYW1Wb2x1bWUoQXVkaW9NYW5hZ2VyLlNUUkVBTV9NVVNJQywgMSwgMCk7CisgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLnNldFN0cmVhbVZvbHVtZShBdWRpb01hbmFnZXIuU1RSRUFNX0FMQVJNLCAxLCAwKTsKKyAgICAgICAgICAgIGludCBtdXNpY1ZvbHVtZSA9IG1BdWRpb01hbmFnZXIuZ2V0U3RyZWFtVm9sdW1lKEF1ZGlvTWFuYWdlci5TVFJFQU1fTVVTSUMpOworICAgICAgICAgICAgaW50IGFsYXJtVm9sdW1lID0gbUF1ZGlvTWFuYWdlci5nZXRTdHJlYW1Wb2x1bWUoQXVkaW9NYW5hZ2VyLlNUUkVBTV9BTEFSTSk7CisKKyAgICAgICAgICAgIC8vIGRpc2FsbG93IGFsbCBzb3VuZHMgaW4gcHJpb3JpdHkgb25seSwgdHVybiBvbiBwcmlvcml0eSBvbmx5IERORCwgdHJ5IHRvIGNoYW5nZSB2b2x1bWUKKyAgICAgICAgICAgIG1ObS5zZXROb3RpZmljYXRpb25Qb2xpY3kobmV3IE5vdGlmaWNhdGlvbk1hbmFnZXIuUG9saWN5KDAsIDAgLCAwKSk7CisgICAgICAgICAgICBzZXRJbnRlcnJ1cHRpb25GaWx0ZXIoTm90aWZpY2F0aW9uTWFuYWdlci5JTlRFUlJVUFRJT05fRklMVEVSX1BSSU9SSVRZKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChNVVRFX0RFTEFZKTsgLy8gZGVsYXkgZm9yIHN0cmVhbXMgdG8gZ2V0IGludG8gY29ycmVjdCBtdXRlIHN0YXRlcworICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRTdHJlYW1Wb2x1bWUoQXVkaW9NYW5hZ2VyLlNUUkVBTV9NVVNJQywgMywgMCk7CisgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLnNldFN0cmVhbVZvbHVtZShBdWRpb01hbmFnZXIuU1RSRUFNX0FMQVJNLCA1LCAwKTsKKyAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0U3RyZWFtVm9sdW1lKEF1ZGlvTWFuYWdlci5TVFJFQU1fUklORywgdGVzdFJpbmdlclZvbCwgMCk7CisKKyAgICAgICAgICAgIC8vIFR1cm4gb2ZmIHplbiBhbmQgbWFrZSBzdXJlIHN0cmVhbSBsZXZlbHMgYXJlIHN0aWxsIHRoZSBzYW1lIHByaW9yIHRvIHplbgorICAgICAgICAgICAgLy8gYXNpZGUgZnJvbSByaW5nZXIgc2luY2UgcmluZ2VyIGNhbiBleGl0IGRuZAorICAgICAgICAgICAgc2V0SW50ZXJydXB0aW9uRmlsdGVyKE5vdGlmaWNhdGlvbk1hbmFnZXIuSU5URVJSVVBUSU9OX0ZJTFRFUl9BTEwpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG11c2ljVm9sdW1lLCBtQXVkaW9NYW5hZ2VyLmdldFN0cmVhbVZvbHVtZShBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYWxhcm1Wb2x1bWUsIG1BdWRpb01hbmFnZXIuZ2V0U3RyZWFtVm9sdW1lKEF1ZGlvTWFuYWdlci5TVFJFQU1fQUxBUk0pKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0ZXN0UmluZ2VyVm9sLCBtQXVkaW9NYW5hZ2VyLmdldFN0cmVhbVZvbHVtZShBdWRpb01hbmFnZXIuU1RSRUFNX1JJTkcpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHNldEludGVycnVwdGlvbkZpbHRlcihOb3RpZmljYXRpb25NYW5hZ2VyLklOVEVSUlVQVElPTl9GSUxURVJfQUxMKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBZGp1c3RWb2x1bWVJblByaW9yaXR5T25seSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAobVNraXBSaW5nZXJUZXN0cyB8fCAhbVN1cHBvcnROb3RpZmljYXRpb25Qb2xpY3lBY2Nlc3MpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFV0aWxzLnRvZ2dsZU5vdGlmaWNhdGlvblBvbGljeUFjY2VzcygKKyAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpLCBnZXRJbnN0cnVtZW50YXRpb24oKSwgdHJ1ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyB0dXJuIG9mZiB6ZW4sIHNldCBzdHJlYW0gdm9sdW1lcyB0byBjaGVjayBmb3IgbGF0ZXIKKyAgICAgICAgICAgIHNldEludGVycnVwdGlvbkZpbHRlcihOb3RpZmljYXRpb25NYW5hZ2VyLklOVEVSUlVQVElPTl9GSUxURVJfQUxMKTsKKyAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0U3RyZWFtVm9sdW1lKEF1ZGlvTWFuYWdlci5TVFJFQU1fUklORywgMSwgMCk7CisgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLnNldFN0cmVhbVZvbHVtZShBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDLCAxLCAwKTsKKyAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0U3RyZWFtVm9sdW1lKEF1ZGlvTWFuYWdlci5TVFJFQU1fQUxBUk0sIDEsIDApOworICAgICAgICAgICAgaW50IHJpbmdWb2x1bWUgPSBtQXVkaW9NYW5hZ2VyLmdldFN0cmVhbVZvbHVtZShBdWRpb01hbmFnZXIuU1RSRUFNX1JJTkcpOworICAgICAgICAgICAgaW50IG11c2ljVm9sdW1lID0gbUF1ZGlvTWFuYWdlci5nZXRTdHJlYW1Wb2x1bWUoQXVkaW9NYW5hZ2VyLlNUUkVBTV9NVVNJQyk7CisgICAgICAgICAgICBpbnQgYWxhcm1Wb2x1bWUgPSBtQXVkaW9NYW5hZ2VyLmdldFN0cmVhbVZvbHVtZShBdWRpb01hbmFnZXIuU1RSRUFNX0FMQVJNKTsKKworICAgICAgICAgICAgLy8gZGlzYWxsb3cgYWxsIHNvdW5kcyBpbiBwcmlvcml0eSBvbmx5LCB0dXJuIG9uIHByaW9yaXR5IG9ubHkgRE5ELCB0cnkgdG8gY2hhbmdlIHZvbHVtZQorICAgICAgICAgICAgbU5tLnNldE5vdGlmaWNhdGlvblBvbGljeShuZXcgTm90aWZpY2F0aW9uTWFuYWdlci5Qb2xpY3koMCwgMCwgMCkpOworICAgICAgICAgICAgc2V0SW50ZXJydXB0aW9uRmlsdGVyKE5vdGlmaWNhdGlvbk1hbmFnZXIuSU5URVJSVVBUSU9OX0ZJTFRFUl9QUklPUklUWSk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoTVVURV9ERUxBWSk7IC8vIGRlbGF5IGZvciBzdHJlYW1zIHRvIGJlIGdldCBpbnRvIGNvcnJlY3QgbXV0ZSBzdGF0ZXMKKyAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuYWRqdXN0U3RyZWFtVm9sdW1lKAorICAgICAgICAgICAgICAgICAgICBBdWRpb01hbmFnZXIuU1RSRUFNX1JJTkcsIEF1ZGlvTWFuYWdlci5BREpVU1RfUkFJU0UsIDApOworICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5hZGp1c3RTdHJlYW1Wb2x1bWUoCisgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWFuYWdlci5TVFJFQU1fTVVTSUMsIEF1ZGlvTWFuYWdlci5BREpVU1RfUkFJU0UsIDApOworICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5hZGp1c3RTdHJlYW1Wb2x1bWUoCisgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWFuYWdlci5TVFJFQU1fQUxBUk0sIEF1ZGlvTWFuYWdlci5BREpVU1RfUkFJU0UsIDApOworCisgICAgICAgICAgICAvLyBUdXJuIG9mZiB6ZW4gYW5kIG1ha2Ugc3VyZSBzdHJlYW0gbGV2ZWxzIGFyZSBzdGlsbCB0aGUgc2FtZSBwcmlvciB0byB6ZW4KKyAgICAgICAgICAgIC8vIGFzaWRlIGZyb20gcmluZ2VyIHNpbmNlIHJpbmdlciBjYW4gZXhpdCBkbmQKKyAgICAgICAgICAgIHNldEludGVycnVwdGlvbkZpbHRlcihOb3RpZmljYXRpb25NYW5hZ2VyLklOVEVSUlVQVElPTl9GSUxURVJfQUxMKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhtdXNpY1ZvbHVtZSwgbUF1ZGlvTWFuYWdlci5nZXRTdHJlYW1Wb2x1bWUoQXVkaW9NYW5hZ2VyLlNUUkVBTV9NVVNJQykpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGFsYXJtVm9sdW1lLCBtQXVkaW9NYW5hZ2VyLmdldFN0cmVhbVZvbHVtZShBdWRpb01hbmFnZXIuU1RSRUFNX0FMQVJNKSk7CisKKyAgICAgICAgICAgIGludCB2b2x1bWVEZWx0YSA9CisgICAgICAgICAgICAgICAgICAgIGdldFZvbHVtZURlbHRhKG1BdWRpb01hbmFnZXIuZ2V0U3RyZWFtVm9sdW1lKEF1ZGlvTWFuYWdlci5TVFJFQU1fUklORykpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJpbmdWb2x1bWUgKyB2b2x1bWVEZWx0YSwKKyAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5nZXRTdHJlYW1Wb2x1bWUoQXVkaW9NYW5hZ2VyLlNUUkVBTV9SSU5HKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzZXRJbnRlcnJ1cHRpb25GaWx0ZXIoTm90aWZpY2F0aW9uTWFuYWdlci5JTlRFUlJVUFRJT05fRklMVEVSX0FMTCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJpb3JpdHlPbmx5TXV0ZUFsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAobVNraXBSaW5nZXJUZXN0cyB8fCAhbVN1cHBvcnROb3RpZmljYXRpb25Qb2xpY3lBY2Nlc3MpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFV0aWxzLnRvZ2dsZU5vdGlmaWNhdGlvblBvbGljeUFjY2VzcygKKyAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpLCBnZXRJbnN0cnVtZW50YXRpb24oKSwgdHJ1ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBlbnN1cmUgdm9sdW1lIGlzIG5vdCBtdXRlZC8wIHRvIHN0YXJ0IHRlc3QKKyAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0U3RyZWFtVm9sdW1lKEF1ZGlvTWFuYWdlci5TVFJFQU1fTVVTSUMsIDEsIDApOworICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRTdHJlYW1Wb2x1bWUoQXVkaW9NYW5hZ2VyLlNUUkVBTV9BTEFSTSwgMSwgMCk7CisgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLnNldFN0cmVhbVZvbHVtZShBdWRpb01hbmFnZXIuU1RSRUFNX1NZU1RFTSwgMSwgMCk7CisgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLnNldFN0cmVhbVZvbHVtZShBdWRpb01hbmFnZXIuU1RSRUFNX1JJTkcsIDEsIDApOworCisgICAgICAgICAgICAvLyBkaXNhbGxvdyBhbGwgc291bmRzIGluIHByaW9yaXR5IG9ubHksIHR1cm4gb24gcHJpb3JpdHkgb25seSBETkQKKyAgICAgICAgICAgIG1ObS5zZXROb3RpZmljYXRpb25Qb2xpY3kobmV3IE5vdGlmaWNhdGlvbk1hbmFnZXIuUG9saWN5KDAsIDAsIDApKTsKKyAgICAgICAgICAgIHNldEludGVycnVwdGlvbkZpbHRlcihOb3RpZmljYXRpb25NYW5hZ2VyLklOVEVSUlVQVElPTl9GSUxURVJfUFJJT1JJVFkpOworCisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoTVVURV9ERUxBWSk7IC8vIGRlbGF5IGZvciBzdHJlYW1zIHRvIGJlIGdldCBpbnRvIGNvcnJlY3QgbXV0ZSBzdGF0ZXMKKyAgICAgICAgICAgIGFzc2VydFRydWUoIk11c2ljIChtZWRpYSkgc3RyZWFtIHNob3VsZCBiZSBtdXRlZCIsCisgICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuaXNTdHJlYW1NdXRlKEF1ZGlvTWFuYWdlci5TVFJFQU1fTVVTSUMpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlN5c3RlbSBzdHJlYW0gc2hvdWxkIGJlIG11dGVkIiwKKyAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5pc1N0cmVhbU11dGUoQXVkaW9NYW5hZ2VyLlNUUkVBTV9TWVNURU0pKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkFsYXJtIHN0cmVhbSBzaG91bGQgYmUgbXV0ZWQiLAorICAgICAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLmlzU3RyZWFtTXV0ZShBdWRpb01hbmFnZXIuU1RSRUFNX0FMQVJNKSk7CisKKyAgICAgICAgICAgIC8vIFRlc3QgcmVxdWlyZXMgdGhhdCB0aGUgcGhvbmUncyBkZWZhdWx0IHN0YXRlIGhhcyBubyBjaGFubmVscyB0aGF0IGNhbiBieXBhc3MgZG5kCisgICAgICAgICAgICBhc3NlcnRUcnVlKCJSaW5nZXIgc3RyZWFtIHNob3VsZCBiZSBtdXRlZCIsCisgICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuaXNTdHJlYW1NdXRlKEF1ZGlvTWFuYWdlci5TVFJFQU1fUklORykpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgc2V0SW50ZXJydXB0aW9uRmlsdGVyKE5vdGlmaWNhdGlvbk1hbmFnZXIuSU5URVJSVVBUSU9OX0ZJTFRFUl9BTEwpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFByaW9yaXR5T25seU1lZGlhQWxsb3dlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAobVNraXBSaW5nZXJUZXN0cyB8fCAhbVN1cHBvcnROb3RpZmljYXRpb25Qb2xpY3lBY2Nlc3MpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBVdGlscy50b2dnbGVOb3RpZmljYXRpb25Qb2xpY3lBY2Nlc3MoCisgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSwgZ2V0SW5zdHJ1bWVudGF0aW9uKCksIHRydWUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gZW5zdXJlIHZvbHVtZSBpcyBub3QgbXV0ZWQvMCB0byBzdGFydCB0ZXN0CisgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLnNldFN0cmVhbVZvbHVtZShBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDLCAxLCAwKTsKKyAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0U3RyZWFtVm9sdW1lKEF1ZGlvTWFuYWdlci5TVFJFQU1fQUxBUk0sIDEsIDApOworICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRTdHJlYW1Wb2x1bWUoQXVkaW9NYW5hZ2VyLlNUUkVBTV9TWVNURU0sIDEsIDApOworICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRTdHJlYW1Wb2x1bWUoQXVkaW9NYW5hZ2VyLlNUUkVBTV9SSU5HLCAxLCAwKTsKKworICAgICAgICAgICAgLy8gYWxsb3cgb25seSBtZWRpYSBpbiBwcmlvcml0eSBvbmx5CisgICAgICAgICAgICBtTm0uc2V0Tm90aWZpY2F0aW9uUG9saWN5KG5ldyBOb3RpZmljYXRpb25NYW5hZ2VyLlBvbGljeSgKKyAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uTWFuYWdlci5Qb2xpY3kuUFJJT1JJVFlfQ0FURUdPUllfTUVESUEsIDAsIDApKTsKKyAgICAgICAgICAgIHNldEludGVycnVwdGlvbkZpbHRlcihOb3RpZmljYXRpb25NYW5hZ2VyLklOVEVSUlVQVElPTl9GSUxURVJfUFJJT1JJVFkpOworCisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoTVVURV9ERUxBWSk7IC8vIGRlbGF5IGZvciBzdHJlYW1zIHRvIGJlIGdldCBpbnRvIGNvcnJlY3QgbXV0ZSBzdGF0ZXMKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKCJNdXNpYyAobWVkaWEpIHN0cmVhbSBzaG91bGQgbm90IGJlIG11dGVkIiwKKyAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5pc1N0cmVhbU11dGUoQXVkaW9NYW5hZ2VyLlNUUkVBTV9NVVNJQykpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiU3lzdGVtIHN0cmVhbSBzaG91bGQgYmUgbXV0ZWQiLAorICAgICAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLmlzU3RyZWFtTXV0ZShBdWRpb01hbmFnZXIuU1RSRUFNX1NZU1RFTSkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQWxhcm0gc3RyZWFtIHNob3VsZCBiZSBtdXRlZCIsCisgICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuaXNTdHJlYW1NdXRlKEF1ZGlvTWFuYWdlci5TVFJFQU1fQUxBUk0pKTsKKworICAgICAgICAgICAgLy8gVGVzdCByZXF1aXJlcyB0aGF0IHRoZSBwaG9uZSdzIGRlZmF1bHQgc3RhdGUgaGFzIG5vIGNoYW5uZWxzIHRoYXQgY2FuIGJ5cGFzcyBkbmQKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlJpbmdlciBzdHJlYW0gc2hvdWxkIGJlIG11dGVkIiwKKyAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5pc1N0cmVhbU11dGUoQXVkaW9NYW5hZ2VyLlNUUkVBTV9SSU5HKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzZXRJbnRlcnJ1cHRpb25GaWx0ZXIoTm90aWZpY2F0aW9uTWFuYWdlci5JTlRFUlJVUFRJT05fRklMVEVSX0FMTCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJpb3JpdHlPbmx5U3lzdGVtQWxsb3dlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAobVNraXBSaW5nZXJUZXN0cyB8fCAhbVN1cHBvcnROb3RpZmljYXRpb25Qb2xpY3lBY2Nlc3MpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFV0aWxzLnRvZ2dsZU5vdGlmaWNhdGlvblBvbGljeUFjY2VzcygKKyAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpLCBnZXRJbnN0cnVtZW50YXRpb24oKSwgdHJ1ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBlbnN1cmUgdm9sdW1lIGlzIG5vdCBtdXRlZC8wIHRvIHN0YXJ0IHRlc3QKKyAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0U3RyZWFtVm9sdW1lKEF1ZGlvTWFuYWdlci5TVFJFQU1fTVVTSUMsIDEsIDApOworICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRTdHJlYW1Wb2x1bWUoQXVkaW9NYW5hZ2VyLlNUUkVBTV9BTEFSTSwgMSwgMCk7CisgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLnNldFN0cmVhbVZvbHVtZShBdWRpb01hbmFnZXIuU1RSRUFNX1NZU1RFTSwgMSwgMCk7CisgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLnNldFN0cmVhbVZvbHVtZShBdWRpb01hbmFnZXIuU1RSRUFNX1JJTkcsIDEsIDApOworCisgICAgICAgICAgICAvLyBhbGxvdyBvbmx5IHN5c3RlbSBpbiBwcmlvcml0eSBvbmx5CisgICAgICAgICAgICBtTm0uc2V0Tm90aWZpY2F0aW9uUG9saWN5KG5ldyBOb3RpZmljYXRpb25NYW5hZ2VyLlBvbGljeSgKKyAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uTWFuYWdlci5Qb2xpY3kuUFJJT1JJVFlfQ0FURUdPUllfU1lTVEVNLCAwLCAwKSk7CisgICAgICAgICAgICBzZXRJbnRlcnJ1cHRpb25GaWx0ZXIoTm90aWZpY2F0aW9uTWFuYWdlci5JTlRFUlJVUFRJT05fRklMVEVSX1BSSU9SSVRZKTsKKworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKE1VVEVfREVMQVkpOyAvLyBkZWxheSBmb3Igc3RyZWFtcyB0byBiZSBnZXQgaW50byBjb3JyZWN0IG11dGUgc3RhdGVzCisgICAgICAgICAgICBhc3NlcnRUcnVlKCJNdXNpYyAobWVkaWEpIHN0cmVhbSBzaG91bGQgYmUgbXV0ZWQiLAorICAgICAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLmlzU3RyZWFtTXV0ZShBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZSgiU3lzdGVtIHN0cmVhbSBzaG91bGQgbm90IGJlIG11dGVkIiwKKyAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5pc1N0cmVhbU11dGUoQXVkaW9NYW5hZ2VyLlNUUkVBTV9TWVNURU0pKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkFsYXJtIHN0cmVhbSBzaG91bGQgYmUgbXV0ZWQiLAorICAgICAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLmlzU3RyZWFtTXV0ZShBdWRpb01hbmFnZXIuU1RSRUFNX0FMQVJNKSk7CisKKyAgICAgICAgICAgIC8vIFRlc3QgcmVxdWlyZXMgdGhhdCB0aGUgcGhvbmUncyBkZWZhdWx0IHN0YXRlIGhhcyBubyBjaGFubmVscyB0aGF0IGNhbiBieXBhc3MgZG5kCisgICAgICAgICAgICBhc3NlcnRUcnVlKCJSaW5nZXIgc3RyZWFtIHNob3VsZCBiZSBtdXRlZCIsCisgICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuaXNTdHJlYW1NdXRlKEF1ZGlvTWFuYWdlci5TVFJFQU1fUklORykpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgc2V0SW50ZXJydXB0aW9uRmlsdGVyKE5vdGlmaWNhdGlvbk1hbmFnZXIuSU5URVJSVVBUSU9OX0ZJTFRFUl9BTEwpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFByaW9yaXR5T25seUFsYXJtc0FsbG93ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG1Ta2lwUmluZ2VyVGVzdHMgfHwgIW1TdXBwb3J0Tm90aWZpY2F0aW9uUG9saWN5QWNjZXNzKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBVdGlscy50b2dnbGVOb3RpZmljYXRpb25Qb2xpY3lBY2Nlc3MoCisgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSwgZ2V0SW5zdHJ1bWVudGF0aW9uKCksIHRydWUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gZW5zdXJlIHZvbHVtZSBpcyBub3QgbXV0ZWQvMCB0byBzdGFydCB0ZXN0CisgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLnNldFN0cmVhbVZvbHVtZShBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDLCAxLCAwKTsKKyAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0U3RyZWFtVm9sdW1lKEF1ZGlvTWFuYWdlci5TVFJFQU1fQUxBUk0sIDEsIDApOworICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRTdHJlYW1Wb2x1bWUoQXVkaW9NYW5hZ2VyLlNUUkVBTV9TWVNURU0sIDEsIDApOworICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRTdHJlYW1Wb2x1bWUoQXVkaW9NYW5hZ2VyLlNUUkVBTV9SSU5HLCAxLCAwKTsKKworICAgICAgICAgICAgLy8gYWxsb3cgb25seSBhbGFybXMgaW4gcHJpb3JpdHkgb25seQorICAgICAgICAgICAgbU5tLnNldE5vdGlmaWNhdGlvblBvbGljeShuZXcgTm90aWZpY2F0aW9uTWFuYWdlci5Qb2xpY3koCisgICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbk1hbmFnZXIuUG9saWN5LlBSSU9SSVRZX0NBVEVHT1JZX0FMQVJNUywgMCwgMCkpOworICAgICAgICAgICAgc2V0SW50ZXJydXB0aW9uRmlsdGVyKE5vdGlmaWNhdGlvbk1hbmFnZXIuSU5URVJSVVBUSU9OX0ZJTFRFUl9QUklPUklUWSk7CisKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChNVVRFX0RFTEFZKTsgLy8gZGVsYXkgZm9yIHN0cmVhbXMgdG8gYmUgZ2V0IGludG8gY29ycmVjdCBtdXRlIHN0YXRlcworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiTXVzaWMgKG1lZGlhKSBzdHJlYW0gc2hvdWxkIGJlIG11dGVkIiwKKyAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5pc1N0cmVhbU11dGUoQXVkaW9NYW5hZ2VyLlNUUkVBTV9NVVNJQykpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiU3lzdGVtIHN0cmVhbSBzaG91bGQgYmUgbXV0ZWQiLAorICAgICAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLmlzU3RyZWFtTXV0ZShBdWRpb01hbmFnZXIuU1RSRUFNX1NZU1RFTSkpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoIkFsYXJtIHN0cmVhbSBzaG91bGQgbm90IGJlIG11dGVkIiwKKyAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5pc1N0cmVhbU11dGUoQXVkaW9NYW5hZ2VyLlNUUkVBTV9BTEFSTSkpOworCisgICAgICAgICAgICAvLyBUZXN0IHJlcXVpcmVzIHRoYXQgdGhlIHBob25lJ3MgZGVmYXVsdCBzdGF0ZSBoYXMgbm8gY2hhbm5lbHMgdGhhdCBjYW4gYnlwYXNzIGRuZAorICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiUmluZ2VyIHN0cmVhbSBzaG91bGQgYmUgbXV0ZWQiLAorICAgICAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLmlzU3RyZWFtTXV0ZShBdWRpb01hbmFnZXIuU1RSRUFNX1JJTkcpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHNldEludGVycnVwdGlvbkZpbHRlcihOb3RpZmljYXRpb25NYW5hZ2VyLklOVEVSUlVQVElPTl9GSUxURVJfQUxMKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQcmlvcml0eU9ubHlSaW5nZXJBbGxvd2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChtU2tpcFJpbmdlclRlc3RzIHx8ICFtU3VwcG9ydE5vdGlmaWNhdGlvblBvbGljeUFjY2VzcykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgVXRpbHMudG9nZ2xlTm90aWZpY2F0aW9uUG9saWN5QWNjZXNzKAorICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCksIGdldEluc3RydW1lbnRhdGlvbigpLCB0cnVlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIGVuc3VyZSB2b2x1bWUgaXMgbm90IG11dGVkLzAgdG8gc3RhcnQgdGVzdAorICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRTdHJlYW1Wb2x1bWUoQXVkaW9NYW5hZ2VyLlNUUkVBTV9NVVNJQywgMSwgMCk7CisgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLnNldFN0cmVhbVZvbHVtZShBdWRpb01hbmFnZXIuU1RSRUFNX0FMQVJNLCAxLCAwKTsKKyAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0U3RyZWFtVm9sdW1lKEF1ZGlvTWFuYWdlci5TVFJFQU1fU1lTVEVNLCAxLCAwKTsKKyAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0U3RyZWFtVm9sdW1lKEF1ZGlvTWFuYWdlci5TVFJFQU1fUklORywgMSwgMCk7CisKKyAgICAgICAgICAgIC8vIGFsbG93IG9ubHkgcmVtaW5kZXJzIGluIHByaW9yaXR5IG9ubHkKKyAgICAgICAgICAgIG1ObS5zZXROb3RpZmljYXRpb25Qb2xpY3kobmV3IE5vdGlmaWNhdGlvbk1hbmFnZXIuUG9saWN5KAorICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25NYW5hZ2VyLlBvbGljeS5QUklPUklUWV9DQVRFR09SWV9SRU1JTkRFUlMsIDAsIDApKTsKKyAgICAgICAgICAgIHNldEludGVycnVwdGlvbkZpbHRlcihOb3RpZmljYXRpb25NYW5hZ2VyLklOVEVSUlVQVElPTl9GSUxURVJfUFJJT1JJVFkpOworCisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoTVVURV9ERUxBWSk7IC8vIGRlbGF5IGZvciBzdHJlYW1zIHRvIGJlIG11dGVkCisgICAgICAgICAgICBhc3NlcnRUcnVlKCJNdXNpYyAobWVkaWEpIHN0cmVhbSBzaG91bGQgYmUgbXV0ZWQiLAorICAgICAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLmlzU3RyZWFtTXV0ZShBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJTeXN0ZW0gc3RyZWFtIHNob3VsZCBiZSBtdXRlZCIsCisgICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuaXNTdHJlYW1NdXRlKEF1ZGlvTWFuYWdlci5TVFJFQU1fU1lTVEVNKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJBbGFybSBzdHJlYW0gc2hvdWxkIGJlIG11dGVkIiwKKyAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5pc1N0cmVhbU11dGUoQXVkaW9NYW5hZ2VyLlNUUkVBTV9BTEFSTSkpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoIlJpbmdlciBzdHJlYW0gc2hvdWxkIG5vdCBiZSBtdXRlZCIsCisgICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuaXNTdHJlYW1NdXRlKEF1ZGlvTWFuYWdlci5TVFJFQU1fUklORykpOworCisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzZXRJbnRlcnJ1cHRpb25GaWx0ZXIoTm90aWZpY2F0aW9uTWFuYWdlci5JTlRFUlJVUFRJT05fRklMVEVSX0FMTCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJpb3JpdHlPbmx5Q2hhbm5lbHNDYW5CeXBhc3NEbmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIE5PVElGSUNBVElPTl9DSEFOTkVMX0lEID0gInRlc3RfaWQiOworICAgICAgICBpZiAobVNraXBSaW5nZXJUZXN0cyB8fCAhbVN1cHBvcnROb3RpZmljYXRpb25Qb2xpY3lBY2Nlc3MpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFV0aWxzLnRvZ2dsZU5vdGlmaWNhdGlvblBvbGljeUFjY2VzcygKKyAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpLCBnZXRJbnN0cnVtZW50YXRpb24oKSwgdHJ1ZSk7CisgICAgICAgIE5vdGlmaWNhdGlvbkNoYW5uZWwgY2hhbm5lbCA9IG5ldyBOb3RpZmljYXRpb25DaGFubmVsKE5PVElGSUNBVElPTl9DSEFOTkVMX0lELCAiVEVTVCIsCisgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uTWFuYWdlci5JTVBPUlRBTkNFX0RFRkFVTFQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gZW5zdXJlIHZvbHVtZSBpcyBub3QgbXV0ZWQvMCB0byBzdGFydCB0ZXN0CisgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLnNldFN0cmVhbVZvbHVtZShBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDLCAxLCAwKTsKKyAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0U3RyZWFtVm9sdW1lKEF1ZGlvTWFuYWdlci5TVFJFQU1fQUxBUk0sIDEsIDApOworICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRTdHJlYW1Wb2x1bWUoQXVkaW9NYW5hZ2VyLlNUUkVBTV9TWVNURU0sIDEsIDApOworICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRTdHJlYW1Wb2x1bWUoQXVkaW9NYW5hZ2VyLlNUUkVBTV9SSU5HLCAxLCAwKTsKKworICAgICAgICAgICAgLy8gY3JlYXRlIGEgY2hhbm5lbCB0aGF0IGNhbiBieXBhc3MgZG5kCisgICAgICAgICAgICBjaGFubmVsLnNldEJ5cGFzc0RuZCh0cnVlKTsKKyAgICAgICAgICAgIG1ObS5jcmVhdGVOb3RpZmljYXRpb25DaGFubmVsKGNoYW5uZWwpOworCisgICAgICAgICAgICAvLyBhbGxvdyBub3RoaW5nCisgICAgICAgICAgICBtTm0uc2V0Tm90aWZpY2F0aW9uUG9saWN5KG5ldyBOb3RpZmljYXRpb25NYW5hZ2VyLlBvbGljeSgwLDAsIDApKTsKKyAgICAgICAgICAgIHNldEludGVycnVwdGlvbkZpbHRlcihOb3RpZmljYXRpb25NYW5hZ2VyLklOVEVSUlVQVElPTl9GSUxURVJfUFJJT1JJVFkpOworCisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoTVVURV9ERUxBWSk7IC8vIGRlbGF5IGZvciBzdHJlYW1zIHRvIGJlIG11dGVkCisgICAgICAgICAgICBhc3NlcnRUcnVlKCJNdXNpYyAobWVkaWEpIHN0cmVhbSBzaG91bGQgYmUgbXV0ZWQiLAorICAgICAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLmlzU3RyZWFtTXV0ZShBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJTeXN0ZW0gc3RyZWFtIHNob3VsZCBiZSBtdXRlZCIsCisgICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuaXNTdHJlYW1NdXRlKEF1ZGlvTWFuYWdlci5TVFJFQU1fU1lTVEVNKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJBbGFybSBzdHJlYW0gc2hvdWxkIGJlIG11dGVkIiwKKyAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5pc1N0cmVhbU11dGUoQXVkaW9NYW5hZ2VyLlNUUkVBTV9BTEFSTSkpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoIlJpbmdlciBzdHJlYW0gc2hvdWxkIG5vdCBiZSBtdXRlZCIsCisgICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuaXNTdHJlYW1NdXRlKEF1ZGlvTWFuYWdlci5TVFJFQU1fUklORykpOworCisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzZXRJbnRlcnJ1cHRpb25GaWx0ZXIoTm90aWZpY2F0aW9uTWFuYWdlci5JTlRFUlJVUFRJT05fRklMVEVSX0FMTCk7CisgICAgICAgICAgICBtTm0uZGVsZXRlTm90aWZpY2F0aW9uQ2hhbm5lbChOT1RJRklDQVRJT05fQ0hBTk5FTF9JRCk7CisgICAgICAgICAgICBVdGlscy50b2dnbGVOb3RpZmljYXRpb25Qb2xpY3lBY2Nlc3MobUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSwgZ2V0SW5zdHJ1bWVudGF0aW9uKCksCisgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKworICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgdGVzdEFkanVzdFZvbHVtZVdpdGhJbGxlZ2FsRGlyZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIENhbGwgdGhlIG1ldGhvZCB3aXRoIGlsbGVnYWwgZGlyZWN0aW9uLiBTeXN0ZW0gc2hvdWxkIG5vdCByZWJvb3QuCiAgICAgICAgIG1BdWRpb01hbmFnZXIuYWRqdXN0Vm9sdW1lKDM3LCAwKTsKICAgICB9CiAKKyAgICBwcml2YXRlIGZpbmFsIGludFtdIFBVQkxJQ19TVFJFQU1fVFlQRVMgPSB7IEF1ZGlvTWFuYWdlci5TVFJFQU1fVk9JQ0VfQ0FMTCwKKyAgICAgICAgICAgIEF1ZGlvTWFuYWdlci5TVFJFQU1fU1lTVEVNLCBBdWRpb01hbmFnZXIuU1RSRUFNX1JJTkcsIEF1ZGlvTWFuYWdlci5TVFJFQU1fTVVTSUMsCisgICAgICAgICAgICBBdWRpb01hbmFnZXIuU1RSRUFNX0FMQVJNLCBBdWRpb01hbmFnZXIuU1RSRUFNX05PVElGSUNBVElPTiwKKyAgICAgICAgICAgIEF1ZGlvTWFuYWdlci5TVFJFQU1fRFRNRiwgIEF1ZGlvTWFuYWdlci5TVFJFQU1fQUNDRVNTSUJJTElUWSB9OworCisgICAgcHVibGljIHZvaWQgdGVzdEdldFN0cmVhbVZvbHVtZURiV2l0aElsbGVnYWxBcmd1bWVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRXhjZXB0aW9uIGV4ID0gbnVsbDsKKyAgICAgICAgLy8gaW52YWxpZCBzdHJlYW0gdHlwZQorICAgICAgICB0cnkgeworICAgICAgICAgICAgZmxvYXQgZ2FpbiA9IG1BdWRpb01hbmFnZXIuZ2V0U3RyZWFtVm9sdW1lRGIoLTEwMCAvKnN0cmVhbVR5cGUqLywgMCwKKyAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VJbmZvLlRZUEVfQlVJTFRJTl9TUEVBS0VSKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGV4ID0gZTsgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgICAgICBhc3NlcnROb3ROdWxsKCJObyBleGNlcHRpb24gd2FzIHRocm93biBmb3IgYW4gaW52YWxpZCBzdHJlYW0gdHlwZSIsIGV4KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBleGNlcHRpb24gdGhyb3duIGZvciBpbnZhbGlkIHN0cmVhbSB0eXBlIiwKKyAgICAgICAgICAgICAgICBleC5nZXRDbGFzcygpLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpOworCisgICAgICAgIC8vIGludmFsaWQgdm9sdW1lIGluZGV4CisgICAgICAgIGV4ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZsb2F0IGdhaW4gPSBtQXVkaW9NYW5hZ2VyLmdldFN0cmVhbVZvbHVtZURiKEF1ZGlvTWFuYWdlci5TVFJFQU1fTVVTSUMsIC0xMDEgLyp2b2x1bWUqLywKKyAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VJbmZvLlRZUEVfQlVJTFRJTl9TUEVBS0VSKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGV4ID0gZTsgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgICAgICBhc3NlcnROb3ROdWxsKCJObyBleGNlcHRpb24gd2FzIHRocm93biBmb3IgYW4gaW52YWxpZCB2b2x1bWUgaW5kZXgiLCBleCk7CisgICAgICAgIGFzc2VydEVxdWFscygiV3JvbmcgZXhjZXB0aW9uIHRocm93biBmb3IgaW52YWxpZCB2b2x1bWUgaW5kZXgiLAorICAgICAgICAgICAgICAgIGV4LmdldENsYXNzKCksIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyk7CisKKyAgICAgICAgLy8gaW52YWxpZCBvdXQgb2YgcmFuZ2Ugdm9sdW1lIGluZGV4CisgICAgICAgIGV4ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIGludCBtYXhWb2wgPSBtQXVkaW9NYW5hZ2VyLmdldFN0cmVhbU1heFZvbHVtZShBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDKTsKKyAgICAgICAgICAgIGZsb2F0IGdhaW4gPSBtQXVkaW9NYW5hZ2VyLmdldFN0cmVhbVZvbHVtZURiKEF1ZGlvTWFuYWdlci5TVFJFQU1fTVVTSUMsIG1heFZvbCArIDEsCisgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlSW5mby5UWVBFX0JVSUxUSU5fU1BFQUtFUik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBleCA9IGU7IC8vIGV4cGVjdGVkCisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiTm8gZXhjZXB0aW9uIHdhcyB0aHJvd24gZm9yIGFuIGludmFsaWQgb3V0IG9mIHJhbmdlIHZvbHVtZSBpbmRleCIsIGV4KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBleGNlcHRpb24gdGhyb3duIGZvciBpbnZhbGlkIG91dCBvZiByYW5nZSB2b2x1bWUgaW5kZXgiLAorICAgICAgICAgICAgICAgIGV4LmdldENsYXNzKCksIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyk7CisKKyAgICAgICAgLy8gaW52YWxpZCBkZXZpY2UgdHlwZQorICAgICAgICBleCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmbG9hdCBnYWluID0gbUF1ZGlvTWFuYWdlci5nZXRTdHJlYW1Wb2x1bWVEYihBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDLCAwLAorICAgICAgICAgICAgICAgICAgICAtMTAyIC8qZGV2aWNlVHlwZSovKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGV4ID0gZTsgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgICAgICBhc3NlcnROb3ROdWxsKCJObyBleGNlcHRpb24gd2FzIHRocm93biBmb3IgYW4gaW52YWxpZCBkZXZpY2UgdHlwZSIsIGV4KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBleGNlcHRpb24gdGhyb3duIGZvciBpbnZhbGlkIGRldmljZSB0eXBlIiwKKyAgICAgICAgICAgICAgICBleC5nZXRDbGFzcygpLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpOworCisgICAgICAgIC8vIGludmFsaWQgaW5wdXQgZGV2aWNlIHR5cGUKKyAgICAgICAgZXggPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmxvYXQgZ2FpbiA9IG1BdWRpb01hbmFnZXIuZ2V0U3RyZWFtVm9sdW1lRGIoQXVkaW9NYW5hZ2VyLlNUUkVBTV9NVVNJQywgMCwKKyAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VJbmZvLlRZUEVfQlVJTFRJTl9NSUMpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZXggPSBlOyAvLyBleHBlY3RlZAorICAgICAgICB9CisgICAgICAgIGFzc2VydE5vdE51bGwoIk5vIGV4Y2VwdGlvbiB3YXMgdGhyb3duIGZvciBhbiBpbnZhbGlkIGlucHV0IGRldmljZSB0eXBlIiwgZXgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIldyb25nIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGludmFsaWQgaW5wdXQgZGV2aWNlIHR5cGUiLAorICAgICAgICAgICAgICAgIGV4LmdldENsYXNzKCksIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldFN0cmVhbVZvbHVtZURiKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoaW50IHN0cmVhbVR5cGUgOiBQVUJMSUNfU1RSRUFNX1RZUEVTKSB7CisgICAgICAgICAgICAvLyB2ZXJpZnkgbWluaW51bSBpbmRleCBpcyBzdHJpY3RseSBpbmZlcmlvciB0byBtYXhpbXVtIGluZGV4CisgICAgICAgICAgICBmaW5hbCBpbnQgbWluSW5kZXggPSBtQXVkaW9NYW5hZ2VyLmdldFN0cmVhbU1pblZvbHVtZShzdHJlYW1UeXBlKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBtYXhJbmRleCA9IG1BdWRpb01hbmFnZXIuZ2V0U3RyZWFtTWF4Vm9sdW1lKHN0cmVhbVR5cGUpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiTWluIHZvbCBpbmRleCAoIiArIG1pbkluZGV4ICsgIikgZm9yIHN0cmVhbSAiICsgc3RyZWFtVHlwZSArICIgbm90IGluZmVyaW9yIgorICAgICAgICAgICAgICAgICAgICArICIgdG8gbWF4IHZvbCBpbmRleCAoIiArIG1heEluZGV4ICsgIikiLCBtaW5JbmRleCA8PSBtYXhJbmRleCk7CisgICAgICAgICAgICBmbG9hdCBwcmV2R2FpbiA9IEZsb2F0Lk5FR0FUSVZFX0lORklOSVRZOworICAgICAgICAgICAgLy8gdmVyaWZ5IGdhaW4gaW5jcmVhc2VzIHdpdGggdGhlIHZvbHVtZSBpbmRpY2VzCisgICAgICAgICAgICBmb3IgKGludCBpZHggPSBtaW5JbmRleCA7IGlkeCA8PSBtYXhJbmRleCA7IGlkeCsrKSB7CisgICAgICAgICAgICAgICAgZmxvYXQgZ2FpbiA9IG1BdWRpb01hbmFnZXIuZ2V0U3RyZWFtVm9sdW1lRGIoc3RyZWFtVHlwZSwgaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VJbmZvLlRZUEVfQlVJTFRJTl9TUEVBS0VSKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJOb24tbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nIGdhaW4gYXQgaW5kZXggIiArIGlkeCArICIgZm9yIHN0cmVhbSIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgc3RyZWFtVHlwZSwgcHJldkdhaW4gPD0gZ2Fpbik7CisgICAgICAgICAgICAgICAgcHJldkdhaW4gPSBnYWluOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgdGVzdEFkanVzdFN1Z2dlc3RlZFN0cmVhbVZvbHVtZVdpdGhJbGxlZ2FsQXJndW1lbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIENhbGwgdGhlIG1ldGhvZCB3aXRoIGlsbGVnYWwgZGlyZWN0aW9uLiBTeXN0ZW0gc2hvdWxkIG5vdCByZWJvb3QuCiAgICAgICAgIG1BdWRpb01hbmFnZXIuYWRqdXN0U3VnZ2VzdGVkU3RyZWFtVm9sdW1lKDM3LCBBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDLCAwKTsKQEAgLTk3NSw2ICsxNDYxLDM3IEBACiAgICAgICAgIG1BdWRpb01hbmFnZXIuYWRqdXN0U3VnZ2VzdGVkU3RyZWFtVm9sdW1lKEF1ZGlvTWFuYWdlci5BREpVU1RfUkFJU0UsIDY2NzQ3LCAwKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TWljcm9waG9uZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpLmhhc1N5c3RlbUZlYXR1cmUoCisgICAgICAgICAgICAgICAgUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9NSUNST1BIT05FKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIExpc3Q8TWljcm9waG9uZUluZm8+IG1pY3JvcGhvbmVzID0gbUF1ZGlvTWFuYWdlci5nZXRNaWNyb3Bob25lcygpOworICAgICAgICBhc3NlcnRUcnVlKG1pY3JvcGhvbmVzLnNpemUoKSA+IDApOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1pY3JvcGhvbmVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBNaWNyb3Bob25lSW5mbyBtaWNyb3Bob25lID0gbWljcm9waG9uZXMuZ2V0KGkpOworICAgICAgICAgICAgTG9nLmkoVEFHLCAiZGV2aWNlSWQ6IiArIG1pY3JvcGhvbmUuZ2V0RGVzY3JpcHRpb24oKSk7CisgICAgICAgICAgICBMb2cuaShUQUcsICJwb3J0SWQ6IiArIG1pY3JvcGhvbmUuZ2V0SWQoKSk7CisgICAgICAgICAgICBMb2cuaShUQUcsICJ0eXBlOiIgKyBtaWNyb3Bob25lLmdldFR5cGUoKSk7CisgICAgICAgICAgICBMb2cuaShUQUcsICJhZGRyZXNzOiIgKyBtaWNyb3Bob25lLmdldEFkZHJlc3MoKSk7CisgICAgICAgICAgICBMb2cuaShUQUcsICJkZXZpY2VMb2NhdGlvbjoiICsgbWljcm9waG9uZS5nZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIExvZy5pKFRBRywgImRldmljZUdyb3VwOiIgKyBtaWNyb3Bob25lLmdldEdyb3VwKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiIGluZGV4OiIgKyBtaWNyb3Bob25lLmdldEluZGV4SW5UaGVHcm91cCgpKTsKKyAgICAgICAgICAgIE1pY3JvcGhvbmVJbmZvLkNvb3JkaW5hdGUzRiBwb3NpdGlvbiA9IG1pY3JvcGhvbmUuZ2V0UG9zaXRpb24oKTsKKyAgICAgICAgICAgIExvZy5pKFRBRywgInBvc2l0aW9uOiIgKyBwb3NpdGlvbi54ICsgIiAiICsgcG9zaXRpb24ueSArICIgIiArIHBvc2l0aW9uLnopOworICAgICAgICAgICAgTWljcm9waG9uZUluZm8uQ29vcmRpbmF0ZTNGIG9yaWVudGF0aW9uID0gbWljcm9waG9uZS5nZXRPcmllbnRhdGlvbigpOworICAgICAgICAgICAgTG9nLmkoVEFHLCAib3JpZW50YXRpb246IiArIG9yaWVudGF0aW9uLnggKyAiICIKKyAgICAgICAgICAgICAgICAgICAgKyBvcmllbnRhdGlvbi55ICsgIiAiICsgb3JpZW50YXRpb24ueik7CisgICAgICAgICAgICBMb2cuaShUQUcsICJmcmVxdWVuY3lSZXNwb25zZToiICsgbWljcm9waG9uZS5nZXRGcmVxdWVuY3lSZXNwb25zZSgpKTsKKyAgICAgICAgICAgIExvZy5pKFRBRywgImNoYW5uZWxNYXBwaW5nOiIgKyBtaWNyb3Bob25lLmdldENoYW5uZWxNYXBwaW5nKCkpOworICAgICAgICAgICAgTG9nLmkoVEFHLCAic2Vuc2l0aXZpdHk6IiArIG1pY3JvcGhvbmUuZ2V0U2Vuc2l0aXZpdHkoKSk7CisgICAgICAgICAgICBMb2cuaShUQUcsICJtYXggc3BsOiIgKyBtaWNyb3Bob25lLmdldE1heFNwbCgpKTsKKyAgICAgICAgICAgIExvZy5pKFRBRywgIm1pbiBzcGw6IiArIG1pY3JvcGhvbmUuZ2V0TWluU3BsKCkpOworICAgICAgICAgICAgTG9nLmkoVEFHLCAiZGlyZWN0aW9uYWxpdHk6IiArIG1pY3JvcGhvbmUuZ2V0RGlyZWN0aW9uYWxpdHkoKSk7CisgICAgICAgICAgICBMb2cuaShUQUcsICItLS0tLS0tLS0tLS0tLSIpOworICAgICAgICB9CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIHNldEludGVycnVwdGlvbkZpbHRlcihpbnQgZmlsdGVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgbU5tLnNldEludGVycnVwdGlvbkZpbHRlcihmaWx0ZXIpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgewpAQCAtOTg5LDQgKzE1MDYsMTQgQEAKICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQogCisgICAgcHJpdmF0ZSBpbnQgZ2V0VGVzdFJpbmdlclZvbCgpIHsKKyAgICAgICAgZmluYWwgaW50IGN1cnJlbnRSaW5nVm9sID0gbUF1ZGlvTWFuYWdlci5nZXRTdHJlYW1Wb2x1bWUoU1RSRUFNX1JJTkcpOworICAgICAgICBmaW5hbCBpbnQgbWF4UmluZ1ZvbCA9IG1BdWRpb01hbmFnZXIuZ2V0U3RyZWFtTWF4Vm9sdW1lKFNUUkVBTV9SSU5HKTsKKyAgICAgICAgaWYgKGN1cnJlbnRSaW5nVm9sICE9IG1heFJpbmdWb2wpIHsKKyAgICAgICAgICAgIHJldHVybiBtYXhSaW5nVm9sOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG1heFJpbmdWb2wgLSAxOworICAgICAgICB9CisgICAgfQorCiB9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvQXVkaW9QbGF5YmFja0NvbmZpZ3VyYXRpb25UZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvQXVkaW9QbGF5YmFja0NvbmZpZ3VyYXRpb25UZXN0LmphdmEKaW5kZXggZTVmOTM4NS4uMjA3YzJhMiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL0F1ZGlvUGxheWJhY2tDb25maWd1cmF0aW9uVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9BdWRpb1BsYXliYWNrQ29uZmlndXJhdGlvblRlc3QuamF2YQpAQCAtMzcsNyArMzcsNyBAQAogcHVibGljIGNsYXNzIEF1ZGlvUGxheWJhY2tDb25maWd1cmF0aW9uVGVzdCBleHRlbmRzIEN0c0FuZHJvaWRUZXN0Q2FzZSB7CiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBRyA9ICJBdWRpb1BsYXliYWNrQ29uZmlndXJhdGlvblRlc3QiOwogCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFRFU1RfVElNSU5HX1RPTEVSQU5DRV9NUyA9IDUwOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBURVNUX1RJTUlOR19UT0xFUkFOQ0VfTVMgPSAxNTA7CiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFRFU1RfVElNRU9VVF9TT1VORFBPT0xfTE9BRF9NUyA9IDMwMDA7CiAKICAgICAvLyBub3QgZGVjbGFyZWQgaW5zaWRlIHRlc3Qgc28gaXQgY2FuIGJlIHJlbGVhc2VkIGluIGNhc2Ugb2YgZmFpbHVyZQpAQCAtNTEsMTMgKzUxLDE0IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyB0cnkvY2F0Y2ggZm9yIGV2ZXJ5IG1ldGhvZCBpbiBjYXNlIHRoZSB0ZXN0cyBsZWZ0IHRoZSBvYmplY3RzIGluIHZhcmlvdXMgc3RhdGVzCiAgICAgICAgIGlmIChtTXAgIT0gbnVsbCkgewotICAgICAgICAgICAgbU1wLnN0b3AoKTsKLSAgICAgICAgICAgIG1NcC5yZWxlYXNlKCk7CisgICAgICAgICAgICB0cnkgeyBtTXAuc3RvcCgpOyB9IGNhdGNoIChFeGNlcHRpb24gZSkge30KKyAgICAgICAgICAgIHRyeSB7IG1NcC5yZWxlYXNlKCk7IH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQogICAgICAgICAgICAgbU1wID0gbnVsbDsKICAgICAgICAgfQogICAgICAgICBpZiAobVNwICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TcC5yZWxlYXNlKCk7CisgICAgICAgICAgICB0cnkgeyBtU3AucmVsZWFzZSgpOyB9IGNhdGNoIChFeGNlcHRpb24gZSkge30KICAgICAgICAgICAgIG1TcCA9IG51bGw7CiAgICAgICAgIH0KICAgICB9CkBAIC04MCw3ICs4MSw3IEBACiAgICAgICAgIG1NcCA9IE1lZGlhUGxheWVyLmNyZWF0ZShnZXRDb250ZXh0KCksIFIucmF3LnNpbmUxa2h6czQwZGJsb25nLAogICAgICAgICAgICAgICAgIGFhLCBhbS5nZW5lcmF0ZUF1ZGlvU2Vzc2lvbklkKCkpOwogICAgICAgICBtTXAuc3RhcnQoKTsKLSAgICAgICAgVGhyZWFkLnNsZWVwKDIqVEVTVF9USU1JTkdfVE9MRVJBTkNFX01TKTsvLyB3YWl0aW5nIGZvciBwbGF5YmFjayB0byBzdGFydAorICAgICAgICBUaHJlYWQuc2xlZXAoVEVTVF9USU1JTkdfVE9MRVJBTkNFX01TKTsvLyB3YWl0aW5nIGZvciBwbGF5YmFjayB0byBzdGFydAogICAgICAgICBMaXN0PEF1ZGlvUGxheWJhY2tDb25maWd1cmF0aW9uPiBjb25maWdzID0gYW0uZ2V0QWN0aXZlUGxheWJhY2tDb25maWd1cmF0aW9ucygpOwogICAgICAgICBtTXAuc3RvcCgpOwogICAgICAgICBhc3NlcnRUcnVlKCJObyBwbGF5YmFjayByZXBvcnRlZCIsIGNvbmZpZ3Muc2l6ZSgpID4gMCk7CkBAIC0xMzEsNyArMTMyLDcgQEAKICAgICAgICAgICAgICAgICBuYkFjdGl2ZVBsYXllcnNCZWZvcmVTdGFydCAvKmV4cGVjdGVkKi8sIGNvbmZpZ3Muc2l6ZSgpKTsKIAogICAgICAgICBtTXAuc3RhcnQoKTsKLSAgICAgICAgVGhyZWFkLnNsZWVwKDIqVEVTVF9USU1JTkdfVE9MRVJBTkNFX01TKTsvLyB3YWl0aW5nIGZvciBwbGF5YmFjayB0byBzdGFydAorICAgICAgICBUaHJlYWQuc2xlZXAoVEVTVF9USU1JTkdfVE9MRVJBTkNFX01TKTsvLyB3YWl0aW5nIGZvciBwbGF5YmFjayB0byBzdGFydAogICAgICAgICBjb25maWdzID0gYW0uZ2V0QWN0aXZlUGxheWJhY2tDb25maWd1cmF0aW9ucygpOwogICAgICAgICBhc3NlcnRFcXVhbHMoImFjdGl2ZSBNZWRpYVBsYXllciwgbnVtYmVyIG9mIGNvbmZpZ3Mgc2hvdWxkIGhhdmUgaW5jcmVhc2VkIiwKICAgICAgICAgICAgICAgICBuYkFjdGl2ZVBsYXllcnNCZWZvcmVTdGFydCArIDEgLypleHBlY3RlZCovLApAQCAtMTQ1LDExICsxNDYsMTEgQEAKICAgICAgICAgZmluYWwgTWV0aG9kIGdldENsaWVudFBpZE1ldGhvZCA9IGNvbmZDbGFzcy5nZXREZWNsYXJlZE1ldGhvZCgiZ2V0Q2xpZW50UGlkIik7CiAgICAgICAgIGZpbmFsIE1ldGhvZCBnZXRQbGF5ZXJUeXBlTWV0aG9kID0gY29uZkNsYXNzLmdldERlY2xhcmVkTWV0aG9kKCJnZXRQbGF5ZXJUeXBlIik7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJbnRlZ2VyIHVpZCA9IChJbnRlZ2VyKSBnZXRDbGllbnRVaWRNZXRob2QuaW52b2tlKGNvbmZpZywgbnVsbCk7CisgICAgICAgICAgICBJbnRlZ2VyIHVpZCA9IChJbnRlZ2VyKSBnZXRDbGllbnRVaWRNZXRob2QuaW52b2tlKGNvbmZpZywgKE9iamVjdFtdKSBudWxsKTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscygidWlkIGlzbid0IHByb3RlY3RlZCIsIC0xIC8qZXhwZWN0ZWQqLywgdWlkLmludFZhbHVlKCkpOwotICAgICAgICAgICAgSW50ZWdlciBwaWQgPSAoSW50ZWdlcikgZ2V0Q2xpZW50UGlkTWV0aG9kLmludm9rZShjb25maWcsIG51bGwpOworICAgICAgICAgICAgSW50ZWdlciBwaWQgPSAoSW50ZWdlcikgZ2V0Q2xpZW50UGlkTWV0aG9kLmludm9rZShjb25maWcsIChPYmplY3RbXSkgbnVsbCk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInBpZCBpc24ndCBwcm90ZWN0ZWQiLCAtMSAvKmV4cGVjdGVkKi8sIHBpZC5pbnRWYWx1ZSgpKTsKLSAgICAgICAgICAgIEludGVnZXIgdHlwZSA9IChJbnRlZ2VyKSBnZXRQbGF5ZXJUeXBlTWV0aG9kLmludm9rZShjb25maWcsIG51bGwpOworICAgICAgICAgICAgSW50ZWdlciB0eXBlID0gKEludGVnZXIpIGdldFBsYXllclR5cGVNZXRob2QuaW52b2tlKGNvbmZpZywgKE9iamVjdFtdKSBudWxsKTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscygicGxheWVyIHR5cGUgaXNuJ3QgcHJvdGVjdGVkIiwgLTEgLypleHBlY3RlZCovLCB0eXBlLmludFZhbHVlKCkpOwogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHRocm93biBkdXJpbmcgcmVmbGVjdGlvbiBvbiBjb25maWcgcHJpdmlsZWdlZCBmaWVsZHMiKyBlKTsKQEAgLTIwNSw3ICsyMDYsNyBAQAogICAgICAgICAgICAgICAgICAgICBuYkFjdGl2ZVBsYXllcnNCZWZvcmVTdGFydCArIDEvKmV4cGVjdGVkKi8sIGNhbGxiYWNrLmdldE5iQ29uZmlncygpKTsKICAgICAgICAgICAgIGFzc2VydFRydWUoIkFjdGl2ZSBwbGF5ZXIsIGF0dHJpYnV0ZXMgbm90IGZvdW5kIiwgaGFzQXR0cihjYWxsYmFjay5nZXRDb25maWdzKCksIGFhKSk7CiAKLSAgICAgICAgICAgIC8vIHN0b3BwaW5nIHJlY29yZGluZzogY2FsbGJhY2sgaXMgY2FsbGVkIHdpdGggbm8gbWF0Y2gKKyAgICAgICAgICAgIC8vIHN0b3BwaW5nIHBsYXliYWNrOiBjYWxsYmFjayBpcyBjYWxsZWQgd2l0aCBubyBtYXRjaAogICAgICAgICAgICAgY2FsbGJhY2sucmVzZXQoKTsKICAgICAgICAgICAgIG1NcC5wYXVzZSgpOwogICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFRFU1RfVElNSU5HX1RPTEVSQU5DRV9NUyk7CkBAIC0yMTUsNyArMjE2LDcgQEAKICAgICAgICAgICAgIGFzc2VydEVxdWFscygibnVtYmVyIG9mIGFjdGl2ZSBwbGF5ZXJzIG5vdCBleHBlY3RlZCBhZnRlciBwYXVzZSIsCiAgICAgICAgICAgICAgICAgICAgIG5iQWN0aXZlUGxheWVyc0JlZm9yZVN0YXJ0LypleHBlY3RlZCovLCBjYWxsYmFjay5nZXROYkNvbmZpZ3MoKSk7CiAKLSAgICAgICAgICAgIC8vIHVucmVnaXN0ZXIgY2FsbGJhY2sgYW5kIHN0YXJ0IHJlY29yZGluZyBhZ2FpbgorICAgICAgICAgICAgLy8gdW5yZWdpc3RlciBjYWxsYmFjayBhbmQgc3RhcnQgcGxheWJhY2sgYWdhaW4KICAgICAgICAgICAgIGFtLnVucmVnaXN0ZXJBdWRpb1BsYXliYWNrQ2FsbGJhY2soY2FsbGJhY2spOwogICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFRFU1RfVElNSU5HX1RPTEVSQU5DRV9NUyk7CiAgICAgICAgICAgICBjYWxsYmFjay5yZXNldCgpOwpAQCAtMjM1LDYgKzIzNiw1OCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgdGVzdENhbGxiYWNrTWVkaWFQbGF5ZXJSZWxlYXNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEhhbmRsZXJUaHJlYWQgaGFuZGxlclRocmVhZCA9IG5ldyBIYW5kbGVyVGhyZWFkKFRBRyk7CisgICAgICAgIGhhbmRsZXJUaHJlYWQuc3RhcnQoKTsKKyAgICAgICAgZmluYWwgSGFuZGxlciBoID0gbmV3IEhhbmRsZXIoaGFuZGxlclRocmVhZC5nZXRMb29wZXIoKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEF1ZGlvTWFuYWdlciBhbSA9IG5ldyBBdWRpb01hbmFnZXIoZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIkNvdWxkIG5vdCBjcmVhdGUgQXVkaW9NYW5hZ2VyIiwgYW0pOworCisgICAgICAgICAgICBmaW5hbCBBdWRpb0F0dHJpYnV0ZXMgYWEgPSAobmV3IEF1ZGlvQXR0cmlidXRlcy5CdWlsZGVyKCkpCisgICAgICAgICAgICAgICAgICAgIC5zZXRVc2FnZShURVNUX1VTQUdFKQorICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudFR5cGUoVEVTVF9DT05URU5UKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgICAgICAgICAgbU1wID0gTWVkaWFQbGF5ZXIuY3JlYXRlKGdldENvbnRleHQoKSwgUi5yYXcuc2luZTFraHpzNDBkYmxvbmcsCisgICAgICAgICAgICAgICAgICAgIGFhLCBhbS5nZW5lcmF0ZUF1ZGlvU2Vzc2lvbklkKCkpOworCisgICAgICAgICAgICBNeUF1ZGlvUGxheWJhY2tDYWxsYmFjayBjYWxsYmFjayA9IG5ldyBNeUF1ZGlvUGxheWJhY2tDYWxsYmFjaygpOworICAgICAgICAgICAgYW0ucmVnaXN0ZXJBdWRpb1BsYXliYWNrQ2FsbGJhY2soY2FsbGJhY2ssIGggLypoYW5kbGVyKi8pOworCisgICAgICAgICAgICAvLyBxdWVyeSBob3cgbWFueSBhY3RpdmUgcGxheWVycyBiZWZvcmUgc3RhcnRpbmcgdGhlIE1lZGlhUGxheWVyCisgICAgICAgICAgICBMaXN0PEF1ZGlvUGxheWJhY2tDb25maWd1cmF0aW9uPiBjb25maWdzID0gYW0uZ2V0QWN0aXZlUGxheWJhY2tDb25maWd1cmF0aW9ucygpOworICAgICAgICAgICAgZmluYWwgaW50IG5iQWN0aXZlUGxheWVyc0JlZm9yZVN0YXJ0ID0gY29uZmlncy5zaXplKCk7CisKKyAgICAgICAgICAgIG1NcC5zdGFydCgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFRFU1RfVElNSU5HX1RPTEVSQU5DRV9NUyk7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygib25QbGF5YmFja0NvbmZpZ0NoYW5nZWQgY2FsbCBjb3VudCBub3QgZXhwZWN0ZWQiLAorICAgICAgICAgICAgICAgICAgICAxLypleHBlY3RlZCovLCBjYWxsYmFjay5nZXRDYkludm9jYXRpb25OdW1iZXIoKSk7IC8vb25seSBvbmUgc3RhcnQgY2FsbAorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJudW1iZXIgb2YgYWN0aXZlIHBsYXllcnMgbm90IGV4cGVjdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgLy8gb25lIG1vcmUgcGxheWVyIGFjdGl2ZQorICAgICAgICAgICAgICAgICAgICBuYkFjdGl2ZVBsYXllcnNCZWZvcmVTdGFydCArIDEvKmV4cGVjdGVkKi8sIGNhbGxiYWNrLmdldE5iQ29uZmlncygpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkFjdGl2ZSBwbGF5ZXIsIGF0dHJpYnV0ZXMgbm90IGZvdW5kIiwgaGFzQXR0cihjYWxsYmFjay5nZXRDb25maWdzKCksIGFhKSk7CisKKyAgICAgICAgICAgIC8vIHJlbGVhc2UgdGhlIHBsYXllciB3aXRob3V0IHN0b3BwaW5nIG9yIHBhdXNpbmcgaXQgZmlyc3QKKyAgICAgICAgICAgIGNhbGxiYWNrLnJlc2V0KCk7CisgICAgICAgICAgICBtTXAucmVsZWFzZSgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFRFU1RfVElNSU5HX1RPTEVSQU5DRV9NUyk7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygib25QbGF5YmFja0NvbmZpZ0NoYW5nZWQgY2FsbCBjb3VudCBub3QgZXhwZWN0ZWQgYWZ0ZXIgcmVsZWFzZSIsCisgICAgICAgICAgICAgICAgICAgIDEvKmV4cGVjdGVkKi8sIGNhbGxiYWNrLmdldENiSW52b2NhdGlvbk51bWJlcigpKTsvL29ubHkgcmVsZWFzZSBjYWxsIHNpbmNlIHJlc2V0CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIm51bWJlciBvZiBhY3RpdmUgcGxheWVycyBub3QgZXhwZWN0ZWQgYWZ0ZXIgcmVsZWFzZSIsCisgICAgICAgICAgICAgICAgICAgIG5iQWN0aXZlUGxheWVyc0JlZm9yZVN0YXJ0LypleHBlY3RlZCovLCBjYWxsYmFjay5nZXROYkNvbmZpZ3MoKSk7CisKKyAgICAgICAgICAgIGFtLnVucmVnaXN0ZXJBdWRpb1BsYXliYWNrQ2FsbGJhY2soY2FsbGJhY2spOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGggIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGguZ2V0TG9vcGVyKCkucXVpdCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgdGVzdEdldHRlclNvdW5kUG9vbCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBpZiAoIWlzVmFsaWRQbGF0Zm9ybSgidGVzdFNvdW5kUG9vbCIpKSByZXR1cm47CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9BdWRpb1ByZXNlbnRhdGlvblRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9BdWRpb1ByZXNlbnRhdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjdmY2E1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL0F1ZGlvUHJlc2VudGF0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEuY3RzOworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1ByZXNlbnRhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DdHNBbmRyb2lkVGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK3B1YmxpYyBjbGFzcyBBdWRpb1ByZXNlbnRhdGlvblRlc3QgZXh0ZW5kcyBDdHNBbmRyb2lkVGVzdENhc2UgeworICAgIHByaXZhdGUgU3RyaW5nIFRBRyA9ICJBdWRpb1ByZXNlbnRhdGlvblRlc3QiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBPUlRfTE9HX05BTUUgPSAiQ3RzTWVkaWFUZXN0Q2FzZXMiOworCisgICAgcHVibGljIHZvaWQgdGVzdEdldHRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgaW50IFBSRVNFTlRBVElPTl9JRCA9IDQyOworICAgICAgICBmaW5hbCBpbnQgUFJPR1JBTV9JRCA9IDQzOworICAgICAgICBmaW5hbCBNYXA8TG9jYWxlLCBTdHJpbmc+IExBQkVMUyA9IGdlbmVyYXRlTGFiZWxzKCk7CisgICAgICAgIGZpbmFsIExvY2FsZSBMT0NBTEUgPSBMb2NhbGUuVVM7CisgICAgICAgIGZpbmFsIGludCBNQVNURVJJTkdfSU5ESUNBVElPTiA9IEF1ZGlvUHJlc2VudGF0aW9uLk1BU1RFUkVEX0ZPUl9TVEVSRU87CisgICAgICAgIGZpbmFsIGJvb2xlYW4gSEFTX0FVRElPX0RFU0NSSVBUSU9OID0gZmFsc2U7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gSEFTX1NQT0tFTl9TVUJUSVRMRVMgPSB0cnVlOworICAgICAgICBmaW5hbCBib29sZWFuIEhBU19ESUFMT0dVRV9FTkhBTkNFTUVOVCA9IHRydWU7CisKKyAgICAgICAgQXVkaW9QcmVzZW50YXRpb24gcHJlc2VudGF0aW9uID0gbmV3IEF1ZGlvUHJlc2VudGF0aW9uKAorICAgICAgICAgICAgICAgIFBSRVNFTlRBVElPTl9JRCwKKyAgICAgICAgICAgICAgICBQUk9HUkFNX0lELAorICAgICAgICAgICAgICAgIGxhYmVsc0xvY2FsZVRvU3RyaW5nKExBQkVMUyksCisgICAgICAgICAgICAgICAgTE9DQUxFLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgTUFTVEVSSU5HX0lORElDQVRJT04sCisgICAgICAgICAgICAgICAgSEFTX0FVRElPX0RFU0NSSVBUSU9OLAorICAgICAgICAgICAgICAgIEhBU19TUE9LRU5fU1VCVElUTEVTLAorICAgICAgICAgICAgICAgIEhBU19ESUFMT0dVRV9FTkhBTkNFTUVOVCk7CisgICAgICAgIGFzc2VydEVxdWFscyhQUkVTRU5UQVRJT05fSUQsIHByZXNlbnRhdGlvbi5nZXRQcmVzZW50YXRpb25JZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFBST0dSQU1fSUQsIHByZXNlbnRhdGlvbi5nZXRQcm9ncmFtSWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhMQUJFTFMudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLAorICAgICAgICAgICAgICAgIHByZXNlbnRhdGlvbi5nZXRMYWJlbHMoKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTE9DQUxFLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSwKKyAgICAgICAgICAgICAgICBwcmVzZW50YXRpb24uZ2V0TG9jYWxlKCkudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BU1RFUklOR19JTkRJQ0FUSU9OLCBwcmVzZW50YXRpb24uZ2V0TWFzdGVyaW5nSW5kaWNhdGlvbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEhBU19BVURJT19ERVNDUklQVElPTiwgcHJlc2VudGF0aW9uLmhhc0F1ZGlvRGVzY3JpcHRpb24oKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhIQVNfU1BPS0VOX1NVQlRJVExFUywgcHJlc2VudGF0aW9uLmhhc1Nwb2tlblN1YnRpdGxlcygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEhBU19ESUFMT0dVRV9FTkhBTkNFTUVOVCwgcHJlc2VudGF0aW9uLmhhc0RpYWxvZ3VlRW5oYW5jZW1lbnQoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTWFwPExvY2FsZSwgU3RyaW5nPiBnZW5lcmF0ZUxhYmVscygpIHsKKyAgICAgICAgTWFwPExvY2FsZSwgU3RyaW5nPiByZXN1bHQgPSBuZXcgSGFzaE1hcDxMb2NhbGUsIFN0cmluZz4oKTsKKyAgICAgICAgcmVzdWx0LnB1dChMb2NhbGUuVVMsIExvY2FsZS5VUy5nZXREaXNwbGF5TGFuZ3VhZ2UoKSk7CisgICAgICAgIHJlc3VsdC5wdXQoTG9jYWxlLkZSRU5DSCwgTG9jYWxlLkZSRU5DSC5nZXREaXNwbGF5TGFuZ3VhZ2UoKSk7CisgICAgICAgIHJlc3VsdC5wdXQoTG9jYWxlLkdFUk1BTiwgTG9jYWxlLkdFUk1BTi5nZXREaXNwbGF5TGFuZ3VhZ2UoKSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiBsYWJlbHNMb2NhbGVUb1N0cmluZyhNYXA8TG9jYWxlLCBTdHJpbmc+IGxvY2FsZXNNYXApIHsKKyAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiByZXN1bHQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAgICAgZm9yIChNYXAuRW50cnk8TG9jYWxlLCBTdHJpbmc+IGVudHJ5IDogbG9jYWxlc01hcC5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICByZXN1bHQucHV0KGVudHJ5LmdldEtleSgpLnRvU3RyaW5nKCksIGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL0F1ZGlvUmVjb3JkQXBwT3BUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvQXVkaW9SZWNvcmRBcHBPcFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWFkMzllCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL0F1ZGlvUmVjb3JkQXBwT3BUZXN0LmphdmEKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEuY3RzOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLkFwcE9wc01hbmFnZXIuT1BfUkVDT1JEX0FVRElPOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLnRydXRoLlRydXRoLmFzc2VydFRoYXQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uQXJndW1lbnRNYXRjaGVycy5lcTsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5tb2NrOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnRpbWVvdXQ7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8udmVyaWZ5OworCitpbXBvcnQgYW5kcm9pZC5hcHAuQXBwT3BzTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BcHBPcHNNYW5hZ2VyLk9uT3BBY3RpdmVDaGFuZ2VkTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Gb3JtYXQ7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1JlY29yZDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUmVjb3JkZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG87CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworLyoqCisgKiBUZXN0cyBmb3IgbWVkaWEgZnJhbWV3b3JrIGJlaGF2aW9ycyByZWxhdGVkIHRvIGFwcCBvcHMuCisgKi8KK0BSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgQXVkaW9SZWNvcmRBcHBPcFRlc3QgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgQVBQX09QX0NIQU5HRV9USU1FT1VUX01JTExJUyA9IFRpbWVVbml0LlNFQ09ORFMudG9NaWxsaXMoMik7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWNvcmRBcHBPcHMoKSB7CisgICAgICAgIGlmICghaGFzTWljcm9waG9uZSgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBTdHJpbmcgcGFja2FnZU5hbWUgPSBnZXRDb250ZXh0KCkuZ2V0UGFja2FnZU5hbWUoKTsKKyAgICAgICAgZmluYWwgaW50IHVpZCA9IFByb2Nlc3MubXlVaWQoKTsKKworICAgICAgICBmaW5hbCBBcHBPcHNNYW5hZ2VyIGFwcE9wc01hbmFnZXIgPSBnZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShBcHBPcHNNYW5hZ2VyLmNsYXNzKTsKKyAgICAgICAgZmluYWwgT25PcEFjdGl2ZUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA9IG1vY2soT25PcEFjdGl2ZUNoYW5nZWRMaXN0ZW5lci5jbGFzcyk7CisKKyAgICAgICAgQXVkaW9SZWNvcmQgcmVjb3JkZXIgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gU2V0dXAgYSByZWNvcmRlcgorICAgICAgICAgICAgZmluYWwgQXVkaW9SZWNvcmQgY2FuZGlkYXRlUmVjb3JkZXIgPSBuZXcgQXVkaW9SZWNvcmQuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgIC5zZXRBdWRpb1NvdXJjZShNZWRpYVJlY29yZGVyLkF1ZGlvU291cmNlLk1JQykKKyAgICAgICAgICAgICAgICAgICAgLnNldEJ1ZmZlclNpemVJbkJ5dGVzKDEwMjQpCisgICAgICAgICAgICAgICAgICAgIC5zZXRBdWRpb0Zvcm1hdChuZXcgQXVkaW9Gb3JtYXQuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFNhbXBsZVJhdGUoODAwMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q2hhbm5lbE1hc2soQXVkaW9Gb3JtYXQuQ0hBTk5FTF9JTl9NT05PKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRFbmNvZGluZyhBdWRpb0Zvcm1hdC5FTkNPRElOR19QQ01fMTZCSVQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworCisgICAgICAgICAgICAvLyBUaGUgYXBwIG9wIHNob3VsZCBiZSByZXBvcnRlZCBhcyBub3Qgc3RhcnRlZAorICAgICAgICAgICAgYXNzZXJ0VGhhdChhcHBPcHNNYW5hZ2VyLmlzT3BlcmF0aW9uQWN0aXZlKE9QX1JFQ09SRF9BVURJTywKKyAgICAgICAgICAgICAgICAgICAgdWlkLCBwYWNrYWdlTmFtZSkpLmlzRmFsc2UoKTsKKworICAgICAgICAgICAgLy8gU3RhcnQgd2F0Y2hpbmcgZm9yIGFwcCBvcCBhY3RpdmUKKyAgICAgICAgICAgIGFwcE9wc01hbmFnZXIuc3RhcnRXYXRjaGluZ0FjdGl2ZShuZXcgaW50W10ge09QX1JFQ09SRF9BVURJT30sIGxpc3RlbmVyKTsKKworICAgICAgICAgICAgLy8gU3RhcnQgcmVjb3JkaW5nCisgICAgICAgICAgICBjYW5kaWRhdGVSZWNvcmRlci5zdGFydFJlY29yZGluZygpOworICAgICAgICAgICAgcmVjb3JkZXIgPSBjYW5kaWRhdGVSZWNvcmRlcjsKKworICAgICAgICAgICAgLy8gVGhlIGFwcCBvcCBzaG91bGQgc3RhcnQKKyAgICAgICAgICAgIHZlcmlmeShsaXN0ZW5lciwgdGltZW91dChBUFBfT1BfQ0hBTkdFX1RJTUVPVVRfTUlMTElTKQorICAgICAgICAgICAgICAgICAgICAub25seSgpKS5vbk9wQWN0aXZlQ2hhbmdlZChlcShPUF9SRUNPUkRfQVVESU8pLAorICAgICAgICAgICAgICAgICAgICBlcSh1aWQpLCBlcShwYWNrYWdlTmFtZSksIGVxKHRydWUpKTsKKworICAgICAgICAgICAgLy8gVGhlIGFwcCBvcCBzaG91bGQgYmUgcmVwb3J0ZWQgYXMgc3RhcnRlZAorICAgICAgICAgICAgYXNzZXJ0VGhhdChhcHBPcHNNYW5hZ2VyLmlzT3BlcmF0aW9uQWN0aXZlKE9QX1JFQ09SRF9BVURJTywKKyAgICAgICAgICAgICAgICAgICAgdWlkLCBwYWNrYWdlTmFtZSkpLmlzVHJ1ZSgpOworCisKKyAgICAgICAgICAgIC8vIFN0YXJ0IHdpdGggYSBjbGVhbiBzbGF0ZQorICAgICAgICAgICAgTW9ja2l0by5yZXNldChsaXN0ZW5lcik7CisKKyAgICAgICAgICAgIC8vIFN0b3AgcmVjb3JkaW5nCisgICAgICAgICAgICByZWNvcmRlci5zdG9wKCk7CisgICAgICAgICAgICByZWNvcmRlci5yZWxlYXNlKCk7CisgICAgICAgICAgICByZWNvcmRlciA9IG51bGw7CisKKyAgICAgICAgICAgIC8vIFRoZSBhcHAgb3Agc2hvdWxkIHN0b3AKKyAgICAgICAgICAgIHZlcmlmeShsaXN0ZW5lciwgdGltZW91dChBUFBfT1BfQ0hBTkdFX1RJTUVPVVRfTUlMTElTKQorICAgICAgICAgICAgICAgICAgICAub25seSgpKS5vbk9wQWN0aXZlQ2hhbmdlZChlcShPUF9SRUNPUkRfQVVESU8pLAorICAgICAgICAgICAgICAgICAgICBlcSh1aWQpLCBlcShwYWNrYWdlTmFtZSksIGVxKGZhbHNlKSk7CisKKyAgICAgICAgICAgIC8vIFRoZSBhcHAgb3Agc2hvdWxkIGJlIHJlcG9ydGVkIGFzIG5vdCBzdGFydGVkCisgICAgICAgICAgICBhc3NlcnRUaGF0KGFwcE9wc01hbmFnZXIuaXNPcGVyYXRpb25BY3RpdmUoT1BfUkVDT1JEX0FVRElPLAorICAgICAgICAgICAgICAgICAgICB1aWQsIHBhY2thZ2VOYW1lKSkuaXNGYWxzZSgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHJlY29yZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZWNvcmRlci5zdG9wKCk7CisgICAgICAgICAgICAgICAgcmVjb3JkZXIucmVsZWFzZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhcHBPcHNNYW5hZ2VyLnN0b3BXYXRjaGluZ0FjdGl2ZShsaXN0ZW5lcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGhhc01pY3JvcGhvbmUoKSB7CisgICAgICAgIHJldHVybiBnZXRDb250ZXh0KCkuZ2V0UGFja2FnZU1hbmFnZXIoKS5oYXNTeXN0ZW1GZWF0dXJlKAorICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfTUlDUk9QSE9ORSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgQ29udGV4dCBnZXRDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VGFyZ2V0Q29udGV4dCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9BdWRpb1JlY29yZFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9BdWRpb1JlY29yZFRlc3QuamF2YQppbmRleCA4ZmQxYjdhLi4wODlmOTE0IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvQXVkaW9SZWNvcmRUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL0F1ZGlvUmVjb3JkVGVzdC5qYXZhCkBAIC0xNiwzMiArMTYsNTIgQEAKIAogcGFja2FnZSBhbmRyb2lkLm1lZGlhLmN0czsKIAoraW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0VGhyb3dzOworCiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvRm9ybWF0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9SZWNvcmQ7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1JlY29yZC5PblJlY29yZFBvc2l0aW9uVXBkYXRlTGlzdGVuZXI7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1RpbWVzdGFtcDsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvVHJhY2s7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVJlY29yZGVyOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTeW5jRXZlbnQ7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NaWNyb3Bob25lSW5mbzsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlByZXN1Ym1pdDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DdHNBbmRyb2lkVGVzdENhc2U7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5EZXZpY2VSZXBvcnRMb2c7CiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5SZXN1bHRUeXBlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuUmVzdWx0VW5pdDsKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlN5c3RlbVV0aWw7CiAKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uU2hvcnRCdWZmZXI7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAotcHVibGljIGNsYXNzIEF1ZGlvUmVjb3JkVGVzdCBleHRlbmRzIEN0c0FuZHJvaWRUZXN0Q2FzZSB7CitAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIEF1ZGlvUmVjb3JkVGVzdCB7CiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBRyA9ICJBdWRpb1JlY29yZFRlc3QiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBPUlRfTE9HX05BTUUgPSAiQ3RzTWVkaWFUZXN0Q2FzZXMiOwogICAgIHByaXZhdGUgQXVkaW9SZWNvcmQgbUF1ZGlvUmVjb3JkOwpAQCAtNjEsMTAgKzgxLDggQEAKICAgICAgICAgfQogICAgIH07CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghaGFzTWljcm9waG9uZSgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KQEAgLTEwMCwxMyArMTE4LDEyIEBACiAgICAgICAgIGFzc2VydE5vdE51bGwobUF1ZGlvUmVjb3JkKTsKICAgICB9CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChoYXNNaWNyb3Bob25lKCkpIHsKICAgICAgICAgICAgIG1BdWRpb1JlY29yZC5yZWxlYXNlKCk7CiAgICAgICAgICAgICBtTG9vcGVyLnF1aXQoKTsKICAgICAgICAgfQotICAgICAgICBzdXBlci50ZWFyRG93bigpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCByZXNldCgpIHsKQEAgLTExNSw2ICsxMzIsNyBAQAogICAgICAgICBtSXNIYW5kbGVNZXNzYWdlQ2FsbGVkID0gZmFsc2U7CiAgICAgfQogCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QXVkaW9SZWNvcmRQcm9wZXJ0aWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghaGFzTWljcm9waG9uZSgpKSB7CiAgICAgICAgICAgICByZXR1cm47CkBAIC0xMzMsNiArMTUxLDcgQEAKICAgICAgICAgYXNzZXJ0VHJ1ZShidWZmZXJTaXplID4gMCk7CiAgICAgfQogCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QXVkaW9SZWNvcmRPUCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBpZiAoIWhhc01pY3JvcGhvbmUoKSkgewogICAgICAgICAgICAgcmV0dXJuOwpAQCAtMjM1LDYgKzI1NCw3IEBACiAgICAgICAgIGFzc2VydEVxdWFscyhBdWRpb1JlY29yZC5TVEFURV9VTklOSVRJQUxJWkVELCBtQXVkaW9SZWNvcmQuZ2V0U3RhdGUoKSk7CiAgICAgfQogCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QXVkaW9SZWNvcmRSZXNhbXBsZXJNb25vOEJpdCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBkb1Rlc3QoInJlc2FtcGxlcl9tb25vXzhiaXQiLCB0cnVlIC8qbG9jYWxSZWNvcmQqLywgZmFsc2UgLypjdXN0b21IYW5kbGVyKi8sCiAgICAgICAgICAgICAgICAgMSAvKnBlcmlvZHNQZXJTZWNvbmQqLywgMSAvKm1hcmtlclBlcmlvZHNQZXJTZWNvbmQqLywKQEAgLTI0Myw2ICsyNjMsNyBAQAogICAgICAgICAgICAgICAgIEF1ZGlvRm9ybWF0LkNIQU5ORUxfSU5fTU9OTywgQXVkaW9Gb3JtYXQuRU5DT0RJTkdfUENNXzhCSVQpOwogICAgIH0KIAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEF1ZGlvUmVjb3JkUmVzYW1wbGVyU3RlcmVvOEJpdCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBkb1Rlc3QoInJlc2FtcGxlcl9zdGVyZW9fOGJpdCIsIHRydWUgLypsb2NhbFJlY29yZCovLCBmYWxzZSAvKmN1c3RvbUhhbmRsZXIqLywKICAgICAgICAgICAgICAgICAwIC8qcGVyaW9kc1BlclNlY29uZCovLCAzIC8qbWFya2VyUGVyaW9kc1BlclNlY29uZCovLApAQCAtMjUxLDYgKzI3MiwxNyBAQAogICAgICAgICAgICAgICAgIEF1ZGlvRm9ybWF0LkNIQU5ORUxfSU5fU1RFUkVPLCBBdWRpb0Zvcm1hdC5FTkNPRElOR19QQ01fOEJJVCk7CiAgICAgfQogCisgICAgQFByZXN1Ym1pdAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEF1ZGlvUmVjb3JkTG9jYWxNb25vMTZCaXRTaG9ydCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkb1Rlc3QoImxvY2FsX21vbm9fMTZiaXRfc2hvcnQiLCB0cnVlIC8qbG9jYWxSZWNvcmQqLywgZmFsc2UgLypjdXN0b21IYW5kbGVyKi8sCisgICAgICAgICAgICAgICAgMzAgLypwZXJpb2RzUGVyU2Vjb25kKi8sIDIgLyptYXJrZXJQZXJpb2RzUGVyU2Vjb25kKi8sCisgICAgICAgICAgICAgICAgZmFsc2UgLyp1c2VCeXRlQnVmZmVyKi8sIHRydWUgLypibG9ja2luZyovLAorICAgICAgICAgICAgICAgIGZhbHNlIC8qYXVkaXRSZWNvcmRpbmcqLywgZmFsc2UgLyppc0NoYW5uZWxJbmRleCovLCA4MDAwIC8qVEVTVF9TUiovLAorICAgICAgICAgICAgICAgIEF1ZGlvRm9ybWF0LkNIQU5ORUxfSU5fTU9OTywgQXVkaW9Gb3JtYXQuRU5DT0RJTkdfUENNXzE2QklULCA1MDAgLypURVNUX1RJTUVfTVMqLyk7CisgICAgfQorCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QXVkaW9SZWNvcmRMb2NhbE1vbm8xNkJpdCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBkb1Rlc3QoImxvY2FsX21vbm9fMTZiaXQiLCB0cnVlIC8qbG9jYWxSZWNvcmQqLywgZmFsc2UgLypjdXN0b21IYW5kbGVyKi8sCiAgICAgICAgICAgICAgICAgMzAgLypwZXJpb2RzUGVyU2Vjb25kKi8sIDIgLyptYXJrZXJQZXJpb2RzUGVyU2Vjb25kKi8sCkBAIC0yNTksNiArMjkxLDcgQEAKICAgICAgICAgICAgICAgICBBdWRpb0Zvcm1hdC5DSEFOTkVMX0lOX01PTk8sIEF1ZGlvRm9ybWF0LkVOQ09ESU5HX1BDTV8xNkJJVCk7CiAgICAgfQogCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QXVkaW9SZWNvcmRTdGVyZW8xNkJpdCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBkb1Rlc3QoInN0ZXJlb18xNmJpdCIsIGZhbHNlIC8qbG9jYWxSZWNvcmQqLywgZmFsc2UgLypjdXN0b21IYW5kbGVyKi8sCiAgICAgICAgICAgICAgICAgMiAvKnBlcmlvZHNQZXJTZWNvbmQqLywgMiAvKm1hcmtlclBlcmlvZHNQZXJTZWNvbmQqLywKQEAgLTI2Nyw2ICszMDAsNyBAQAogICAgICAgICAgICAgICAgIEF1ZGlvRm9ybWF0LkNIQU5ORUxfSU5fU1RFUkVPLCBBdWRpb0Zvcm1hdC5FTkNPRElOR19QQ01fMTZCSVQpOwogICAgIH0KIAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEF1ZGlvUmVjb3JkTW9ub0Zsb2F0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGRvVGVzdCgibW9ub19mbG9hdCIsIGZhbHNlIC8qbG9jYWxSZWNvcmQqLywgdHJ1ZSAvKmN1c3RvbUhhbmRsZXIqLywKICAgICAgICAgICAgICAgICAzMCAvKnBlcmlvZHNQZXJTZWNvbmQqLywgMiAvKm1hcmtlclBlcmlvZHNQZXJTZWNvbmQqLywKQEAgLTI3NSw2ICszMDksNyBAQAogICAgICAgICAgICAgICAgIEF1ZGlvRm9ybWF0LkNIQU5ORUxfSU5fTU9OTywgQXVkaW9Gb3JtYXQuRU5DT0RJTkdfUENNX0ZMT0FUKTsKICAgICB9CiAKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RBdWRpb1JlY29yZExvY2FsTm9uYmxvY2tpbmdTdGVyZW9GbG9hdCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBkb1Rlc3QoImxvY2FsX25vbmJsb2NraW5nX3N0ZXJlb19mbG9hdCIsIHRydWUgLypsb2NhbFJlY29yZCovLCB0cnVlIC8qY3VzdG9tSGFuZGxlciovLAogICAgICAgICAgICAgICAgIDIgLypwZXJpb2RzUGVyU2Vjb25kKi8sIDAgLyptYXJrZXJQZXJpb2RzUGVyU2Vjb25kKi8sCkBAIC0yODQsNiArMzE5LDcgQEAKICAgICB9CiAKICAgICAvLyBBdWRpdCBtb2RlcyB3b3JrIGJlc3Qgd2l0aCBub24tYmxvY2tpbmcgbW9kZQorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEF1ZGlvUmVjb3JkQXVkaXRCeXRlQnVmZmVyUmVzYW1wbGVyU3RlcmVvRmxvYXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKGlzTG93UmFtRGV2aWNlKCkpIHsKICAgICAgICAgICAgIHJldHVybjsgLy8gc2tpcC4gRklYTUU6IHJlZW5hYmxlIHdoZW4gQUYgbWVtb3J5IGFsbG9jYXRpb24gaXMgdXBkYXRlZC4KQEAgLTI5Niw2ICszMzIsNyBAQAogICAgICAgICAgICAgICAgIEF1ZGlvRm9ybWF0LkNIQU5ORUxfSU5fU1RFUkVPLCBBdWRpb0Zvcm1hdC5FTkNPRElOR19QQ01fRkxPQVQpOwogICAgIH0KIAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEF1ZGlvUmVjb3JkQXVkaXRDaGFubmVsSW5kZXhNb25vRmxvYXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZG9UZXN0KCJhdWRpdF9jaGFubmVsX2luZGV4X21vbm9fZmxvYXQiLCB0cnVlIC8qbG9jYWxSZWNvcmQqLywgdHJ1ZSAvKmN1c3RvbUhhbmRsZXIqLywKICAgICAgICAgICAgICAgICAyIC8qcGVyaW9kc1BlclNlY29uZCovLCAwIC8qbWFya2VyUGVyaW9kc1BlclNlY29uZCovLApAQCAtMzA2LDYgKzM0Myw3IEBACiAKICAgICAvLyBBdWRpdCBidWZmZXJzIGNhbiBydW4gb3V0IG9mIHNwYWNlIHdpdGggaGlnaCBzYW1wbGUgcmF0ZSwKICAgICAvLyBzbyBrZWVwIHRoZSBjaGFubmVscyBhbmQgcGNtIGVuY29kaW5nIGxvdworICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEF1ZGlvUmVjb3JkQXVkaXRDaGFubmVsSW5kZXgyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChpc0xvd1JhbURldmljZSgpKSB7CiAgICAgICAgICAgICByZXR1cm47IC8vIHNraXAuIEZJWE1FOiByZWVuYWJsZSB3aGVuIEFGIG1lbW9yeSBhbGxvY2F0aW9uIGlzIHVwZGF0ZWQuCkBAIC0zMjAsNiArMzU4LDcgQEAKIAogICAgIC8vIEF1ZGl0IGJ1ZmZlcnMgY2FuIHJ1biBvdXQgb2Ygc3BhY2Ugd2l0aCBoaWdoIG51bWJlcnMgb2YgY2hhbm5lbHMsCiAgICAgLy8gc28ga2VlcCB0aGUgc2FtcGxlIHJhdGUgbG93LgorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEF1ZGlvUmVjb3JkQXVkaXRDaGFubmVsSW5kZXg1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGRvVGVzdCgiYXVkaXRfY2hhbm5lbF9pbmRleF81IiwgdHJ1ZSAvKmxvY2FsUmVjb3JkKi8sIHRydWUgLypjdXN0b21IYW5kbGVyKi8sCiAgICAgICAgICAgICAgICAgMiAvKnBlcmlvZHNQZXJTZWNvbmQqLywgMCAvKm1hcmtlclBlcmlvZHNQZXJTZWNvbmQqLywKQEAgLTMzMSw2ICszNzAsNyBAQAogCiAgICAgLy8gVGVzdCBBdWRpb1JlY29yZC5CdWlsZGVyIHRvIHZlcmlmeSB0aGUgb2JzZXJ2ZWQgY29uZmlndXJhdGlvbiBvZiBhbiBBdWRpb1JlY29yZCBidWlsdCB3aXRoCiAgICAgLy8gYW4gZW1wdHkgQnVpbGRlciBtYXRjaGVzIHRoZSBkb2N1bWVudGF0aW9uIC8gZXhwZWN0ZWQgdmFsdWVzCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QXVkaW9SZWNvcmRCdWlsZGVyRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBpZiAoIWhhc01pY3JvcGhvbmUoKSkgewogICAgICAgICAgICAgcmV0dXJuOwpAQCAtMzYwLDYgKzQwMCw3IEBACiAKICAgICAvLyBUZXN0IEF1ZGlvUmVjb3JkLkJ1aWxkZXIgdG8gdmVyaWZ5IHRoZSBvYnNlcnZlZCBjb25maWd1cmF0aW9uIG9mIGFuIEF1ZGlvUmVjb3JkIGJ1aWx0IHdpdGgKICAgICAvLyBhbiBpbmNvbXBsZXRlIEF1ZGlvRm9ybWF0IG1hdGNoZXMgdGhlIGRvY3VtZW50YXRpb24gLyBleHBlY3RlZCB2YWx1ZXMKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RBdWRpb1JlY29yZEJ1aWxkZXJQYXJ0aWFsRm9ybWF0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghaGFzTWljcm9waG9uZSgpKSB7CiAgICAgICAgICAgICByZXR1cm47CkBAIC0zOTEsNiArNDMyLDcgQEAKIAogICAgIC8vIFRlc3QgQXVkaW9SZWNvcmQuQnVpbGRlciB0byB2ZXJpZnkgdGhlIG9ic2VydmVkIGNvbmZpZ3VyYXRpb24gb2YgYW4gQXVkaW9SZWNvcmQgbWF0Y2hlcwogICAgIC8vIHRoZSBwYXJhbWV0ZXJzIHVzZWQgaW4gdGhlIGJ1aWxkZXIKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RBdWRpb1JlY29yZEJ1aWxkZXJQYXJhbXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFoYXNNaWNyb3Bob25lKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKQEAgLTQzMiw2ICs0NzQsNyBAQAogICAgIH0KIAogICAgIC8vIFRlc3QgQXVkaW9SZWNvcmQgdG8gZW5zdXJlIHdlIGNhbiBidWlsZCBhZnRlciBhIGZhaWx1cmUuCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QXVkaW9SZWNvcmRCdWZmZXJTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghaGFzTWljcm9waG9uZSgpKSB7CiAgICAgICAgICAgICByZXR1cm47CkBAIC00NjcsNiArNTEwLDcgQEAKICAgICAgICAgYXNzZXJ0VHJ1ZShURVNUX05BTUUgKyAiOiBidWZmZXIgZnJhbWUgY291bnQiLCBvYnNlcnZlZEJ1ZmZlclNpemUyID4gMCk7CiAgICAgfQogCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZXN0YW1wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghaGFzTWljcm9waG9uZSgpKSB7CiAgICAgICAgICAgICByZXR1cm47CkBAIC01NjIsNiArNjA2LDc2IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWNvcmROb0RhdGFGb3JJZGxlVWlkcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIWhhc01pY3JvcGhvbmUoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgQXVkaW9SZWNvcmQgcmVjb3JkZXIgPSBudWxsOworCisgICAgICAgIC8vIFdlIHdpbGwgcmVjb3JkIGF1ZGlvIGZvciAyMCBzZWMgZnJvbSBhY3RpdmUgYW5kIGlkbGUgc3RhdGUgZXhwZWN0aW5nCisgICAgICAgIC8vIHRoZSByZWNvcmRpbmcgZnJvbSBhY3RpdmUgc3RhdGUgdG8gaGF2ZSBkYXRhIHdoaWxlIGZyb20gaWRsZSBzaWxlbmNlLgorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gRW5zdXJlIG5vIHJhY2UgYW5kIFVJRCBhY3RpdmUKKyAgICAgICAgICAgIG1ha2VNeVVpZFN0YXRlQWN0aXZlKCk7CisKKyAgICAgICAgICAgIC8vIFNldHVwIGEgcmVjb3JkZXIKKyAgICAgICAgICAgIGZpbmFsIEF1ZGlvUmVjb3JkIGNhbmRpZGF0ZVJlY29yZGVyID0gbmV3IEF1ZGlvUmVjb3JkLkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAuc2V0QXVkaW9Tb3VyY2UoTWVkaWFSZWNvcmRlci5BdWRpb1NvdXJjZS5NSUMpCisgICAgICAgICAgICAgICAgICAgIC5zZXRCdWZmZXJTaXplSW5CeXRlcygxMDI0KQorICAgICAgICAgICAgICAgICAgICAuc2V0QXVkaW9Gb3JtYXQobmV3IEF1ZGlvRm9ybWF0LkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTYW1wbGVSYXRlKDgwMDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldENoYW5uZWxNYXNrKEF1ZGlvRm9ybWF0LkNIQU5ORUxfSU5fTU9OTykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RW5jb2RpbmcoQXVkaW9Gb3JtYXQuRU5DT0RJTkdfUENNXzE2QklUKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgICAgICAgICAgLy8gVW5sZWFzaCBpdCA6UAorICAgICAgICAgICAgY2FuZGlkYXRlUmVjb3JkZXIuc3RhcnRSZWNvcmRpbmcoKTsKKyAgICAgICAgICAgIHJlY29yZGVyID0gY2FuZGlkYXRlUmVjb3JkZXI7CisKKyAgICAgICAgICAgIGZpbmFsIGludCBzYW1wbGVDb3VudCA9IEF1ZGlvSGVscGVyLmZyYW1lQ291bnRGcm9tTXNlYyg2MDAwLAorICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGVSZWNvcmRlci5nZXRGb3JtYXQoKSkgKiBjYW5kaWRhdGVSZWNvcmRlci5nZXRGb3JtYXQoKQorICAgICAgICAgICAgICAgICAgICAuZ2V0Q2hhbm5lbENvdW50KCk7CisgICAgICAgICAgICBmaW5hbCBTaG9ydEJ1ZmZlciBidWZmZXIgPSBTaG9ydEJ1ZmZlci5hbGxvY2F0ZShzYW1wbGVDb3VudCk7CisKKyAgICAgICAgICAgIC8vIFJlYWQgZml2ZSBzZWNvbmRzIG9mIGRhdGEKKyAgICAgICAgICAgIHJlYWREYXRhVGltZWQocmVjb3JkZXIsIDUwMDAsIGJ1ZmZlcik7CisgICAgICAgICAgICAvLyBFbnN1cmUgd2UgcmVhZCBub24tZW1wdHkgYnl0ZXMuIFNvbWUgc3lzdGVtcyBvbmx5CisgICAgICAgICAgICAvLyBlbXVsYXRlIGF1ZGlvIGRldmljZXMgYW5kIGRvIG5vdCBwcm92aWRlIGFueSBhY3R1YWwgYXVkaW8gZGF0YS4KKyAgICAgICAgICAgIGlmIChpc0F1ZGlvU2lsZW50KGJ1ZmZlcikpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJSZWNvcmRpbmcgZG9lcyBub3QgcHJvZHVjZSBhdWRpbyBkYXRhIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBTdGFydCBjbGVhbgorICAgICAgICAgICAgYnVmZmVyLmNsZWFyKCk7CisgICAgICAgICAgICAvLyBGb3JjZSBpZGxlIHRoZSBwYWNrYWdlCisgICAgICAgICAgICBtYWtlTXlVaWRTdGF0ZUlkbGUoKTsKKyAgICAgICAgICAgIC8vIFJlYWQgZml2ZSBzZWNvbmRzIG9mIGRhdGEKKyAgICAgICAgICAgIHJlYWREYXRhVGltZWQocmVjb3JkZXIsIDUwMDAsIGJ1ZmZlcik7CisgICAgICAgICAgICAvLyBFbnN1cmUgd2UgcmVhZCBlbXB0eSBieXRlcworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiUmVjb3JkaW5nIHdhcyBub3Qgc2lsZW5jZWQgd2hpbGUgVUlEIGlkbGUiLCBpc0F1ZGlvU2lsZW50KGJ1ZmZlcikpOworCisgICAgICAgICAgICAvLyBTdGFydCBjbGVhbgorICAgICAgICAgICAgYnVmZmVyLmNsZWFyKCk7CisgICAgICAgICAgICAvLyBSZXNldCB0byBhY3RpdmUKKyAgICAgICAgICAgIG1ha2VNeVVpZFN0YXRlQWN0aXZlKCk7CisgICAgICAgICAgICAvLyBSZWFkIGZpdmUgc2Vjb25kcyBvZiBkYXRhCisgICAgICAgICAgICByZWFkRGF0YVRpbWVkKHJlY29yZGVyLCA1MDAwLCBidWZmZXIpOworICAgICAgICAgICAgLy8gRW5zdXJlIHdlIHJlYWQgbm9uLWVtcHR5IGJ5dGVzCisgICAgICAgICAgICBhc3NlcnRGYWxzZSgiUmVjb3JkaW5nIHdhcyBzaWxlbmNlZCB3aGlsZSBVSUQgYWN0aXZlIiwgaXNBdWRpb1NpbGVudChidWZmZXIpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChyZWNvcmRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmVjb3JkZXIuc3RvcCgpOworICAgICAgICAgICAgICAgIHJlY29yZGVyLnJlbGVhc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc2V0TXlVaWRTdGF0ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U3luY2hyb25pemVkUmVjb3JkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghaGFzTWljcm9waG9uZSgpKSB7CiAgICAgICAgICAgICByZXR1cm47CkBAIC03MDAsNiArODE0LDcyIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWb2ljZUNhbGxBdWRpb1NvdXJjZVBlcm1pc3Npb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghaGFzTWljcm9waG9uZSgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBWT0lDRV9DQUxMLCBWT0lDRV9ET1dOTElOSyBhbmQgVk9JQ0VfVVBMSU5LIGF1ZGlvIHNvdXJjZXMgY2Fubm90CisgICAgICAgIC8vIGJlIHVzZWQgYnkgYXBwcyB0aGF0IGRvbid0IGhhdmUgdGhlIENBUFRVUkVfQVVESU9fT1VUUFVUIHBlcm1pc3Npb25zCisgICAgICAgIGZpbmFsIGludFtdIHZvaWNlQ2FsbEF1ZGlvU291cmNlcyA9IG5ldyBpbnQgW10ge01lZGlhUmVjb3JkZXIuQXVkaW9Tb3VyY2UuVk9JQ0VfQ0FMTCwKKyAgICAgICAgICAgIE1lZGlhUmVjb3JkZXIuQXVkaW9Tb3VyY2UuVk9JQ0VfRE9XTkxJTkssCisgICAgICAgICAgICBNZWRpYVJlY29yZGVyLkF1ZGlvU291cmNlLlZPSUNFX1VQTElOS307CisKKyAgICAgICAgZm9yIChpbnQgc291cmNlIDogdm9pY2VDYWxsQXVkaW9Tb3VyY2VzKSB7CisgICAgICAgICAgICAvLyBBdWRpb1JlY29yZC5CdWlsZGVyIHNob3VsZCBmYWlsIHdoZW4gdHJ5aW5nIHRvIHVzZQorICAgICAgICAgICAgLy8gb25lIG9mIHRoZSB2b2ljZSBjYWxsIGF1ZGlvIHNvdXJjZXMuCisgICAgICAgICAgICBhc3NlcnRUaHJvd3MoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXVkaW9SZWNvcmQuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0QXVkaW9Tb3VyY2Uoc291cmNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEF1ZGlvRm9ybWF0KG5ldyBBdWRpb0Zvcm1hdC5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEVuY29kaW5nKEF1ZGlvRm9ybWF0LkVOQ09ESU5HX1BDTV8xNkJJVCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFNhbXBsZVJhdGUoODAwMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldENoYW5uZWxNYXNrKEF1ZGlvRm9ybWF0LkNIQU5ORUxfSU5fTU9OTykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsgfSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHJpbnRNaWNyb3Bob25lSW5mbyhNaWNyb3Bob25lSW5mbyBtaWNyb3Bob25lKSB7CisgICAgICAgIExvZy5pKFRBRywgImRldmljZUlkOiIgKyBtaWNyb3Bob25lLmdldERlc2NyaXB0aW9uKCkpOworICAgICAgICBMb2cuaShUQUcsICJwb3J0SWQ6IiArIG1pY3JvcGhvbmUuZ2V0SWQoKSk7CisgICAgICAgIExvZy5pKFRBRywgInR5cGU6IiArIG1pY3JvcGhvbmUuZ2V0VHlwZSgpKTsKKyAgICAgICAgTG9nLmkoVEFHLCAiYWRkcmVzczoiICsgbWljcm9waG9uZS5nZXRBZGRyZXNzKCkpOworICAgICAgICBMb2cuaShUQUcsICJkZXZpY2VMb2NhdGlvbjoiICsgbWljcm9waG9uZS5nZXRMb2NhdGlvbigpKTsKKyAgICAgICAgTG9nLmkoVEFHLCAiZGV2aWNlR3JvdXA6IiArIG1pY3JvcGhvbmUuZ2V0R3JvdXAoKQorICAgICAgICAgICAgKyAiIGluZGV4OiIgKyBtaWNyb3Bob25lLmdldEluZGV4SW5UaGVHcm91cCgpKTsKKyAgICAgICAgTWljcm9waG9uZUluZm8uQ29vcmRpbmF0ZTNGIHBvc2l0aW9uID0gbWljcm9waG9uZS5nZXRQb3NpdGlvbigpOworICAgICAgICBMb2cuaShUQUcsICJwb3NpdGlvbjoiICsgcG9zaXRpb24ueCArICIsIiArIHBvc2l0aW9uLnkgKyAiLCIgKyBwb3NpdGlvbi56KTsKKyAgICAgICAgTWljcm9waG9uZUluZm8uQ29vcmRpbmF0ZTNGIG9yaWVudGF0aW9uID0gbWljcm9waG9uZS5nZXRPcmllbnRhdGlvbigpOworICAgICAgICBMb2cuaShUQUcsICJvcmllbnRhdGlvbjoiICsgb3JpZW50YXRpb24ueCArICIsIiArIG9yaWVudGF0aW9uLnkgKyAiLCIgKyBvcmllbnRhdGlvbi56KTsKKyAgICAgICAgTG9nLmkoVEFHLCAiZnJlcXVlbmN5UmVzcG9uc2U6IiArIG1pY3JvcGhvbmUuZ2V0RnJlcXVlbmN5UmVzcG9uc2UoKSk7CisgICAgICAgIExvZy5pKFRBRywgImNoYW5uZWxNYXBwaW5nOiIgKyBtaWNyb3Bob25lLmdldENoYW5uZWxNYXBwaW5nKCkpOworICAgICAgICBMb2cuaShUQUcsICJzZW5zaXRpdml0eToiICsgbWljcm9waG9uZS5nZXRTZW5zaXRpdml0eSgpKTsKKyAgICAgICAgTG9nLmkoVEFHLCAibWF4IHNwbDoiICsgbWljcm9waG9uZS5nZXRNYXhTcGwoKSk7CisgICAgICAgIExvZy5pKFRBRywgIm1pbiBzcGw6IiArIG1pY3JvcGhvbmUuZ2V0TWluU3BsKCkpOworICAgICAgICBMb2cuaShUQUcsICJkaXJlY3Rpb25hbGl0eToiICsgbWljcm9waG9uZS5nZXREaXJlY3Rpb25hbGl0eSgpKTsKKyAgICAgICAgTG9nLmkoVEFHLCAiKioqKioqIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QWN0aXZlTWljcm9waG9uZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFoYXNNaWNyb3Bob25lKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtQXVkaW9SZWNvcmQuc3RhcnRSZWNvcmRpbmcoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIExpc3Q8TWljcm9waG9uZUluZm8+IGFjdGl2ZU1pY3JvcGhvbmVzID0gbUF1ZGlvUmVjb3JkLmdldEFjdGl2ZU1pY3JvcGhvbmVzKCk7CisgICAgICAgIGFzc2VydFRydWUoYWN0aXZlTWljcm9waG9uZXMuc2l6ZSgpID4gMCk7CisgICAgICAgIGZvciAoTWljcm9waG9uZUluZm8gYWN0aXZlTWljcm9waG9uZSA6IGFjdGl2ZU1pY3JvcGhvbmVzKSB7CisgICAgICAgICAgICBwcmludE1pY3JvcGhvbmVJbmZvKGFjdGl2ZU1pY3JvcGhvbmUpOworICAgICAgICB9CisgICAgfQorCiAgICAgcHJpdmF0ZSBBdWRpb1JlY29yZCBjcmVhdGVBdWRpb1JlY29yZCgKICAgICAgICAgICAgIGludCBhdWRpb1NvdXJjZSwgaW50IHNhbXBsZVJhdGVJbkh6LAogICAgICAgICAgICAgaW50IGNoYW5uZWxDb25maWcsIGludCBhdWRpb0Zvcm1hdCwgaW50IGJ1ZmZlclNpemVJbkJ5dGVzLApAQCAtNzQzLDExICs5MjMsMjEgQEAKICAgICAgICAgICAgIGJvb2xlYW4gdXNlQnl0ZUJ1ZmZlciwgYm9vbGVhbiBibG9ja2luZywKICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYXVkaXRSZWNvcmRpbmcsIGZpbmFsIGJvb2xlYW4gaXNDaGFubmVsSW5kZXgsCiAgICAgICAgICAgICBmaW5hbCBpbnQgVEVTVF9TUiwgZmluYWwgaW50IFRFU1RfQ09ORiwgZmluYWwgaW50IFRFU1RfRk9STUFUKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgaW50IFRFU1RfVElNRV9NUyA9IGF1ZGl0UmVjb3JkaW5nID8gNjAwMDAgOiAyMDAwOworICAgICAgICBkb1Rlc3QocmVwb3J0TmFtZSwgbG9jYWxSZWNvcmQsIGN1c3RvbUhhbmRsZXIsIHBlcmlvZHNQZXJTZWNvbmQsIG1hcmtlclBlcmlvZHNQZXJTZWNvbmQsCisgICAgICAgICAgICAgICAgdXNlQnl0ZUJ1ZmZlciwgYmxvY2tpbmcsIGF1ZGl0UmVjb3JkaW5nLCBpc0NoYW5uZWxJbmRleCwKKyAgICAgICAgICAgICAgICBURVNUX1NSLCBURVNUX0NPTkYsIFRFU1RfRk9STUFULCBURVNUX1RJTUVfTVMpOworICAgIH0KKyAgICBwcml2YXRlIHZvaWQgZG9UZXN0KFN0cmluZyByZXBvcnROYW1lLCBib29sZWFuIGxvY2FsUmVjb3JkLCBib29sZWFuIGN1c3RvbUhhbmRsZXIsCisgICAgICAgICAgICBpbnQgcGVyaW9kc1BlclNlY29uZCwgaW50IG1hcmtlclBlcmlvZHNQZXJTZWNvbmQsCisgICAgICAgICAgICBib29sZWFuIHVzZUJ5dGVCdWZmZXIsIGJvb2xlYW4gYmxvY2tpbmcsCisgICAgICAgICAgICBmaW5hbCBib29sZWFuIGF1ZGl0UmVjb3JkaW5nLCBmaW5hbCBib29sZWFuIGlzQ2hhbm5lbEluZGV4LAorICAgICAgICAgICAgZmluYWwgaW50IFRFU1RfU1IsIGZpbmFsIGludCBURVNUX0NPTkYsIGZpbmFsIGludCBURVNUX0ZPUk1BVCwgZmluYWwgaW50IFRFU1RfVElNRV9NUykKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBpZiAoIWhhc01pY3JvcGhvbmUoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIC8vIGF1ZGl0IHJlY29yZGluZyBwbGF5cyBiYWNrIHJlY29yZGVkIGF1ZGlvLCBzbyB1c2UgbG9uZ2VyIHRlc3QgdGltaW5nCi0gICAgICAgIGZpbmFsIGludCBURVNUX1RJTUVfTVMgPSBhdWRpdFJlY29yZGluZyA/IDYwMDAwIDogMjAwMDsKICAgICAgICAgZmluYWwgaW50IFRFU1RfU09VUkNFID0gTWVkaWFSZWNvcmRlci5BdWRpb1NvdXJjZS5ERUZBVUxUOwogICAgICAgICBtSXNIYW5kbGVNZXNzYWdlQ2FsbGVkID0gZmFsc2U7CiAKQEAgLTExNDgsNyArMTMzOCw3IEBACiAgICAgICAgICAgICAgICAgUmVzdWx0VW5pdC5NUyk7CiAgICAgICAgIGxvZy5zZXRTdW1tYXJ5KCJ1bmlmaWVkX2Fic19kaWZmIiwgKHBlcmlvZGljU3RhdC5nZXRBdmdBYnMoKSArIG1hcmtlclN0YXQuZ2V0QXZnQWJzKCkpIC8gMiwKICAgICAgICAgICAgICAgICBSZXN1bHRUeXBlLkxPV0VSX0JFVFRFUiwgUmVzdWx0VW5pdC5NUyk7Ci0gICAgICAgIGxvZy5zdWJtaXQoZ2V0SW5zdHJ1bWVudGF0aW9uKCkpOworICAgICAgICBsb2cuc3VibWl0KEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpKTsKICAgICB9CiAKICAgICBwcml2YXRlIGNsYXNzIE1vY2tPblJlY29yZFBvc2l0aW9uVXBkYXRlTGlzdGVuZXIKQEAgLTEyNjcsNCArMTQ1Nyw1OSBAQAogICAgIHByaXZhdGUgdm9pZCBwcmludFRpbWVzdGFtcChTdHJpbmcgcywgQXVkaW9UaW1lc3RhbXAgYXRzKSB7CiAgICAgICAgIExvZy5kKFRBRywgcyArICI6ICBwb3M6ICIgKyBhdHMuZnJhbWVQb3NpdGlvbiArICIgIHRpbWU6ICIgKyBhdHMubmFub1RpbWUpOwogICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVhZERhdGFUaW1lZChBdWRpb1JlY29yZCByZWNvcmRlciwgbG9uZyBkdXJhdGlvbk1pbGxpcywKKyAgICAgICAgICAgIFNob3J0QnVmZmVyIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgc2hvcnRbXSBidWZmZXIgPSBuZXcgc2hvcnRbMTAyNF07CisgICAgICAgIGZpbmFsIGxvbmcgc3RhcnRUaW1lTWlsbGlzID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CisgICAgICAgIGZpbmFsIGxvbmcgc3RvcFRpbWVNaWxsaXMgPSBzdGFydFRpbWVNaWxsaXMgKyBkdXJhdGlvbk1pbGxpczsKKyAgICAgICAgd2hpbGUgKFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpIDwgc3RvcFRpbWVNaWxsaXMpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCByZWFkQ291bnQgPSByZWNvcmRlci5yZWFkKGJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCk7CisgICAgICAgICAgICBpZiAocmVhZENvdW50IDw9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQucHV0KGJ1ZmZlciwgMCwgcmVhZENvdW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNBdWRpb1NpbGVudChTaG9ydEJ1ZmZlciBidWZmZXIpIHsKKyAgICAgICAgLy8gQWx3YXlzIG5lZWQgc29tZSBieXRlcyByZWFkCisgICAgICAgIGFzc2VydFRydWUoIkJ1ZmZlciBzaG91bGQgaGF2ZSBzb21lIGRhdGEiLCBidWZmZXIucG9zaXRpb24oKSA+IDApOworCisgICAgICAgIC8vIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIHRyYW5zaXRpb24gZnJvbSBlbXB0eSB0byBub24gZW1wdHkgYnl0ZXMKKyAgICAgICAgLy8gaGFwcGVuZWQgaW4gdGhlIG1pZGRsZSBvZiB0aGUgcmVhZCBkYXRhIGR1ZSB0byB0aGUgYXN5bmMgbmF0dXJlIG9mCisgICAgICAgIC8vIHRoZSBzeXN0ZW0uIFRoZXJlZm9yZSwgd2UgbG9vayBmb3IgdGhlIHRyYW5zaXRpb25zIGZyb20gbm9uLWVtcHR5CisgICAgICAgIC8vIHRvIGVtcHR5IGFuZCBmcm9tIGVtcHR5IHRvIG5vbi1lbXB0eSB2YWx1ZXMgZm9yIHJvYnVzdG5lc3MuCisgICAgICAgIGludCB0b3RhbFNpbGVuY2VDb3VudCA9IDA7CisgICAgICAgIGZpbmFsIGludCB2YWx1ZUNvdW50ID0gYnVmZmVyLnBvc2l0aW9uKCk7CisgICAgICAgIGZvciAoaW50IGkgPSB2YWx1ZUNvdW50IC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIGZpbmFsIHNob3J0IHZhbHVlID0gYnVmZmVyLmdldChpKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgdG90YWxTaWxlbmNlQ291bnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdG90YWxTaWxlbmNlQ291bnQgPiB2YWx1ZUNvdW50IC8gMjsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIG1ha2VNeVVpZFN0YXRlQWN0aXZlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGNvbW1hbmQgPSAiY21kIG1lZGlhLmF1ZGlvX3BvbGljeSBzZXQtdWlkLXN0YXRlICIKKyAgICAgICAgICAgICAgICArIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldFRhcmdldENvbnRleHQoKS5nZXRQYWNrYWdlTmFtZSgpICsgIiBhY3RpdmUiOworICAgICAgICBTeXN0ZW1VdGlsLnJ1blNoZWxsQ29tbWFuZChJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKSwgY29tbWFuZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBtYWtlTXlVaWRTdGF0ZUlkbGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgY29tbWFuZCA9ICJjbWQgbWVkaWEuYXVkaW9fcG9saWN5IHNldC11aWQtc3RhdGUgIgorICAgICAgICAgICAgICAgICsgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0VGFyZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VOYW1lKCkgKyAiIGlkbGUiOworICAgICAgICBTeXN0ZW1VdGlsLnJ1blNoZWxsQ29tbWFuZChJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKSwgY29tbWFuZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCByZXNldE15VWlkU3RhdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgY29tbWFuZCA9ICJjbWQgbWVkaWEuYXVkaW9fcG9saWN5IHJlc2V0LXVpZC1zdGF0ZSAiCisgICAgICAgICAgICAgICAgKyAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0VGFyZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VOYW1lKCk7CisgICAgICAgIFN5c3RlbVV0aWwucnVuU2hlbGxDb21tYW5kKEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLCBjb21tYW5kKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBDb250ZXh0IGdldENvbnRleHQoKSB7CisgICAgICAgIHJldHVybiBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKS5nZXRUYXJnZXRDb250ZXh0KCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL0F1ZGlvUmVjb3JkaW5nQ29uZmlndXJhdGlvblRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9BdWRpb1JlY29yZGluZ0NvbmZpZ3VyYXRpb25UZXN0LmphdmEKaW5kZXggMDY4MDg3ZC4uZWI3Mjk2ZiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL0F1ZGlvUmVjb3JkaW5nQ29uZmlndXJhdGlvblRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvQXVkaW9SZWNvcmRpbmdDb25maWd1cmF0aW9uVGVzdC5qYXZhCkBAIC0zMTksOSArMzE5LDkgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGZpbmFsIE1ldGhvZCBnZXRDbGllbnRVaWRNZXRob2QgPSBjb25mQ2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoImdldENsaWVudFVpZCIpOwogICAgICAgICAgICAgZmluYWwgTWV0aG9kIGdldENsaWVudFBhY2thZ2VOYW1lID0gY29uZkNsYXNzLmdldERlY2xhcmVkTWV0aG9kKCJnZXRDbGllbnRQYWNrYWdlTmFtZSIpOwotICAgICAgICAgICAgSW50ZWdlciB1aWQgPSAoSW50ZWdlcikgZ2V0Q2xpZW50VWlkTWV0aG9kLmludm9rZShjb25maWcsIG51bGwpOworICAgICAgICAgICAgSW50ZWdlciB1aWQgPSAoSW50ZWdlcikgZ2V0Q2xpZW50VWlkTWV0aG9kLmludm9rZShjb25maWcsIChPYmplY3RbXSkgbnVsbCk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImNsaWVudCB1aWQgaXNuJ3QgcHJvdGVjdGVkIiwgLTEgLypleHBlY3RlZCovLCB1aWQuaW50VmFsdWUoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGdldENsaWVudFBhY2thZ2VOYW1lLmludm9rZShjb25maWcsIG51bGwpOworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBnZXRDbGllbnRQYWNrYWdlTmFtZS5pbnZva2UoY29uZmlnLCAoT2JqZWN0W10pIG51bGwpOwogICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiY2xpZW50IHBhY2thZ2UgbmFtZSBpcyBudWxsIiwgbmFtZSk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImNsaWVudCBwYWNrYWdlIG5hbWUgaXNuJ3QgcHJvdGVjdGVkIiwgMCAvKmV4cGVjdGVkKi8sIG5hbWUubGVuZ3RoKCkpOwogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL0F1ZGlvVHJhY2tMYXRlbmN5VGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL0F1ZGlvVHJhY2tMYXRlbmN5VGVzdC5qYXZhCmluZGV4IGJhZGJhNjYuLjViODljZTAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9BdWRpb1RyYWNrTGF0ZW5jeVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvQXVkaW9UcmFja0xhdGVuY3lUZXN0LmphdmEKQEAgLTI1LDYgKzI1LDcgQEAKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvVGltZXN0YW1wOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9UcmFjazsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLlBsYXliYWNrUGFyYW1zOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DdHNBbmRyb2lkVGVzdENhc2U7CkBAIC00OCw2ICs0OSw3IEBACiAvLyBXYXJucyBpZiBub3QuIFRoaXMgY2FuIGhhcHBlbiBpZiB0aGVyZSBpcyBubyBGYXN0IE1peGVyIG9yIGlmIGEgRmFzdFRyYWNrCiAvLyBpcyBub3QgYXZhaWxhYmxlLgogCitAQXBwTW9kZUZ1bGwocmVhc29uID0gIlRoZSBBUElzIHdvdWxkIGVpdGhlciB3b3JrIGNvcnJlY3RseSBvciBub3QgYXQgYWxsIGZvciBpbnN0YW50IGFwcHMiKQogcHVibGljIGNsYXNzIEF1ZGlvVHJhY2tMYXRlbmN5VGVzdCBleHRlbmRzIEN0c0FuZHJvaWRUZXN0Q2FzZSB7CiAgICAgcHJpdmF0ZSBTdHJpbmcgVEFHID0gIkF1ZGlvVHJhY2tMYXRlbmN5VGVzdCI7CiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgbG9uZyBOQU5PU19QRVJfTUlMTElTRUNPTkQgPSAxMDAwMDAwTDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9BdWRpb1RyYWNrVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL0F1ZGlvVHJhY2tUZXN0LmphdmEKaW5kZXggM2Q4NTNkNC4uNThhMTU5NiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL0F1ZGlvVHJhY2tUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL0F1ZGlvVHJhY2tUZXN0LmphdmEKQEAgLTIyLDExICsyMiwxNSBAQAogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9BdHRyaWJ1dGVzOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Gb3JtYXQ7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1ByZXNlbnRhdGlvbjsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvVGltZXN0YW1wOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9UcmFjazsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLlBsYXliYWNrUGFyYW1zOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5QcmVzdWJtaXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5MYXJnZVRlc3Q7CisKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkN0c0FuZHJvaWRUZXN0Q2FzZTsKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkRldmljZVJlcG9ydExvZzsKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlJlc3VsdFR5cGU7CkBAIC0zNSw2ICszOSw4IEBACiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLm5pby5GbG9hdEJ1ZmZlcjsKIGltcG9ydCBqYXZhLm5pby5TaG9ydEJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogCiBwdWJsaWMgY2xhc3MgQXVkaW9UcmFja1Rlc3QgZXh0ZW5kcyBDdHNBbmRyb2lkVGVzdENhc2UgewogICAgIHByaXZhdGUgU3RyaW5nIFRBRyA9ICJBdWRpb1RyYWNrVGVzdCI7CkBAIC0xNDYxLDYgKzE0NjcsMzIgQEAKICAgICAgICAgdHJhY2sucmVsZWFzZSgpOwogICAgIH0KIAorICAgIEBQcmVzdWJtaXQKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGxheVN0YXRpY0RhdGFTaG9ydCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIWhhc0F1ZGlvT3V0cHV0KCkpIHsKKyAgICAgICAgICAgIExvZy53KFRBRywiQVVESU9fT1VUUFVUIGZlYXR1cmUgbm90IGZvdW5kLiBUaGlzIHN5c3RlbSBtaWdodCBub3QgaGF2ZSBhIHZhbGlkICIKKyAgICAgICAgICAgICAgICAgICAgKyAiYXVkaW8gb3V0cHV0IEhBTCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIGNvbnN0YW50cyBmb3IgdGVzdAorICAgICAgICBmaW5hbCBTdHJpbmcgVEVTVF9OQU1FID0gInRlc3RQbGF5U3RhdGljRGF0YVNob3J0IjsKKyAgICAgICAgZmluYWwgaW50IFRFU1RfRk9STUFUID0gQXVkaW9Gb3JtYXQuRU5DT0RJTkdfUENNX0ZMT0FUOworICAgICAgICBmaW5hbCBpbnQgVEVTVF9TUiA9IDQ4MDAwOworICAgICAgICBmaW5hbCBpbnQgVEVTVF9DT05GID0gQXVkaW9Gb3JtYXQuQ0hBTk5FTF9PVVRfTU9OTzsKKyAgICAgICAgZmluYWwgaW50IFRFU1RfTU9ERSA9IEF1ZGlvVHJhY2suTU9ERV9TVEFUSUM7CisgICAgICAgIGZpbmFsIGludCBURVNUX1NUUkVBTV9UWVBFID0gQXVkaW9NYW5hZ2VyLlNUUkVBTV9NVVNJQzsKKyAgICAgICAgZmluYWwgZG91YmxlIFRFU1RfU1dFRVAgPSAxMDA7CisgICAgICAgIGZpbmFsIGludCBURVNUX0xPT1BTID0gMTsKKyAgICAgICAgZmluYWwgZG91YmxlIFRFU1RfRlJFUVVFTkNZID0gNDAwOworICAgICAgICBmaW5hbCBsb25nIFdBSVRfVElNRV9NUyA9IDE1MDsgLy8gY29tcGVuc2F0ZSBmb3IgY29sZCBzdGFydCB3aGVuIHJ1biBpbiBpc29sYXRpb24uCisgICAgICAgIGZpbmFsIGRvdWJsZSBURVNUX0xPT1BfRFVSQVRJT04gPSAwLjI1OworCisgICAgICAgIHBsYXlPbmNlU3RhdGljRGF0YShURVNUX05BTUUsIFRFU1RfTU9ERSwgVEVTVF9TVFJFQU1fVFlQRSwgVEVTVF9TV0VFUCwKKyAgICAgICAgICAgICAgICBURVNUX0xPT1BTLCBURVNUX0ZPUk1BVCwgVEVTVF9GUkVRVUVOQ1ksIFRFU1RfU1IsIFRFU1RfQ09ORiwKKyAgICAgICAgICAgICAgICBXQUlUX1RJTUVfTVMsIFRFU1RfTE9PUF9EVVJBVElPTik7CisKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCB0ZXN0UGxheVN0YXRpY0RhdGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFoYXNBdWRpb091dHB1dCgpKSB7CiAgICAgICAgICAgICBMb2cudyhUQUcsIkFVRElPX09VVFBVVCBmZWF0dXJlIG5vdCBmb3VuZC4gVGhpcyBzeXN0ZW0gbWlnaHQgbm90IGhhdmUgYSB2YWxpZCAiCkBAIC0xNDg3LDkwICsxNTE5LDExOCBAQAogICAgICAgICBmaW5hbCBpbnQgVEVTVF9TVFJFQU1fVFlQRSA9IEF1ZGlvTWFuYWdlci5TVFJFQU1fTVVTSUM7CiAgICAgICAgIGZpbmFsIGRvdWJsZSBURVNUX1NXRUVQID0gMTAwOwogICAgICAgICBmaW5hbCBpbnQgVEVTVF9MT09QUyA9IDE7CisgICAgICAgIGZpbmFsIGRvdWJsZSBURVNUX0xPT1BfRFVSQVRJT049MTsKIAogICAgICAgICBmb3IgKGludCBURVNUX0ZPUk1BVCA6IFRFU1RfRk9STUFUX0FSUkFZKSB7CiAgICAgICAgICAgICBkb3VibGUgZnJlcXVlbmN5ID0gNDAwOyAvLyBmcmVxdWVuY3kgY2hhbmdlcyBmb3IgZWFjaCB0ZXN0CiAgICAgICAgICAgICBmb3IgKGludCBURVNUX1NSIDogVEVTVF9TUl9BUlJBWSkgewogICAgICAgICAgICAgICAgIGZvciAoaW50IFRFU1RfQ09ORiA6IFRFU1RfQ09ORl9BUlJBWSkgewotICAgICAgICAgICAgICAgICAgICAvLyAtLS0tLS0tLSBpbml0aWFsaXphdGlvbiAtLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc2Vjb25kcyA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBjaGFubmVsQ291bnQgPSBJbnRlZ2VyLmJpdENvdW50KFRFU1RfQ09ORik7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBidWZmZXJGcmFtZXMgPSBzZWNvbmRzICogVEVTVF9TUjsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGJ1ZmZlclNhbXBsZXMgPSBidWZmZXJGcmFtZXMgKiBjaGFubmVsQ291bnQ7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBidWZmZXJTaXplID0gYnVmZmVyU2FtcGxlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXVkaW9Gb3JtYXQuZ2V0Qnl0ZXNQZXJTYW1wbGUoVEVTVF9GT1JNQVQpOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBkb3VibGUgdGVzdEZyZXF1ZW5jeSA9IGZyZXF1ZW5jeSAvIGNoYW5uZWxDb3VudDsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBNSUxMSVNFQ09ORFNfUEVSX1NFQ09ORCA9IDEwMDA7Ci0gICAgICAgICAgICAgICAgICAgIEF1ZGlvVHJhY2sgdHJhY2sgPSBuZXcgQXVkaW9UcmFjayhURVNUX1NUUkVBTV9UWVBFLCBURVNUX1NSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RfQ09ORiwgVEVTVF9GT1JNQVQsIGJ1ZmZlclNpemUsIFRFU1RfTU9ERSk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhURVNUX05BTUUsIEF1ZGlvVHJhY2suU1RBVEVfTk9fU1RBVElDX0RBVEEsIHRyYWNrLmdldFN0YXRlKCkpOworICAgICAgICAgICAgICAgICAgICBwbGF5T25jZVN0YXRpY0RhdGEoVEVTVF9OQU1FLCBURVNUX01PREUsIFRFU1RfU1RSRUFNX1RZUEUsIFRFU1RfU1dFRVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9MT09QUywgVEVTVF9GT1JNQVQsIGZyZXF1ZW5jeSwgVEVTVF9TUiwgVEVTVF9DT05GLCBXQUlUX01TRUMsIFRFU1RfTE9PUF9EVVJBVElPTik7CiAKLSAgICAgICAgICAgICAgICAgICAgLy8gLS0tLS0tLS0gdGVzdCAtLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICAgICAgICAgICAgIC8vIHRlc3Qgc2V0TG9vcFBvaW50cyBhbmQgc2V0UG9zaXRpb24gY2FuIGJlIGNhbGxlZCBoZXJlLgotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoVEVTVF9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuQXVkaW9UcmFjay5TVUNDRVNTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLnNldFBsYXliYWNrSGVhZFBvc2l0aW9uKGJ1ZmZlckZyYW1lcy8yKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhURVNUX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5BdWRpb1RyYWNrLlNVQ0NFU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2suc2V0TG9vcFBvaW50cygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLypzdGFydEluRnJhbWVzKi8sIGJ1ZmZlckZyYW1lcywgMTAgLypsb29wQ291bnQqLykpOwotICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IG5lZWQgdG8gd3JpdGUgb25jZSB0byB0aGUgc3RhdGljIHRyYWNrCi0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoVEVTVF9GT1JNQVQpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBBdWRpb0Zvcm1hdC5FTkNPRElOR19QQ01fOEJJVDogewotICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZSBkYXRhW10gPSBBdWRpb0hlbHBlci5jcmVhdGVTb3VuZERhdGFJbkJ5dGVBcnJheSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyU2FtcGxlcywgVEVTVF9TUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdEZyZXF1ZW5jeSwgVEVTVF9TV0VFUCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoVEVTVF9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJTYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay53cml0ZShkYXRhLCAwIC8qb2Zmc2V0SW5CeXRlcyovLCBkYXRhLmxlbmd0aCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBBdWRpb0Zvcm1hdC5FTkNPRElOR19QQ01fMTZCSVQ6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IGRhdGFbXSA9IEF1ZGlvSGVscGVyLmNyZWF0ZVNvdW5kRGF0YUluU2hvcnRBcnJheSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyU2FtcGxlcywgVEVTVF9TUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdEZyZXF1ZW5jeSwgVEVTVF9TV0VFUCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoVEVTVF9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJTYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay53cml0ZShkYXRhLCAwIC8qb2Zmc2V0SW5CeXRlcyovLCBkYXRhLmxlbmd0aCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBBdWRpb0Zvcm1hdC5FTkNPRElOR19QQ01fRkxPQVQ6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGRhdGFbXSA9IEF1ZGlvSGVscGVyLmNyZWF0ZVNvdW5kRGF0YUluRmxvYXRBcnJheSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyU2FtcGxlcywgVEVTVF9TUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdEZyZXF1ZW5jeSwgVEVTVF9TV0VFUCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoVEVTVF9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJTYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay53cml0ZShkYXRhLCAwIC8qb2Zmc2V0SW5CeXRlcyovLCBkYXRhLmxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1RyYWNrLldSSVRFX0JMT0NLSU5HKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhURVNUX05BTUUsIEF1ZGlvVHJhY2suU1RBVEVfSU5JVElBTElaRUQsIHRyYWNrLmdldFN0YXRlKCkpOwotICAgICAgICAgICAgICAgICAgICAvLyB0ZXN0IHNldExvb3BQb2ludHMgYW5kIHNldFBvc2l0aW9uIGNhbiBiZSBjYWxsZWQgaGVyZS4KLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFRFU1RfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLkF1ZGlvVHJhY2suU1VDQ0VTUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay5zZXRQbGF5YmFja0hlYWRQb3NpdGlvbigwIC8qcG9zaXRpb25JbkZyYW1lcyovKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhURVNUX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5BdWRpb1RyYWNrLlNVQ0NFU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2suc2V0TG9vcFBvaW50cygwIC8qc3RhcnRJbkZyYW1lcyovLCBidWZmZXJGcmFtZXMsIFRFU1RfTE9PUFMpKTsKLQotICAgICAgICAgICAgICAgICAgICB0cmFjay5wbGF5KCk7Ci0gICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChzZWNvbmRzICogTUlMTElTRUNPTkRTX1BFUl9TRUNPTkQgKiAoVEVTVF9MT09QUyArIDEpKTsKLSAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFdBSVRfTVNFQyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgcG9zaXRpb24gYWZ0ZXIgbG9vcGluZy4gQXVkaW9UcmFjay5nZXRQbGF5YmFja0hlYWRQb3NpdGlvbigpIHJldHVybnMKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJ1bm5pbmcgY291bnQgb2YgZnJhbWVzIHBsYXllZCwgbm90IHRoZSBhY3R1YWwgc3RhdGljIGJ1ZmZlciBwb3NpdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgaW50IHBvc2l0aW9uID0gdHJhY2suZ2V0UGxheWJhY2tIZWFkUG9zaXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFRFU1RfTkFNRSwgYnVmZmVyRnJhbWVzICogKFRFU1RfTE9PUFMgKyAxKSwgcG9zaXRpb24pOwotCi0gICAgICAgICAgICAgICAgICAgIHRyYWNrLnN0b3AoKTsKLSAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFdBSVRfTVNFQyk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIC0tLS0tLS0tIHRlYXIgZG93biAtLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgICAgICAgICB0cmFjay5yZWxlYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgIGZyZXF1ZW5jeSArPSA3MDsgLy8gaW5jcmVtZW50IHRlc3QgdG9uZSBmcmVxdWVuY3kKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgcGxheU9uY2VTdGF0aWNEYXRhKFN0cmluZyB0ZXN0TmFtZSwgaW50IHRlc3RNb2RlLCBpbnQgdGVzdFN0cmVhbVR5cGUsCisgICAgICAgICAgICBkb3VibGUgdGVzdFN3ZWVwLCBpbnQgdGVzdExvb3BzLCBpbnQgdGVzdEZvcm1hdCwgZG91YmxlIHRlc3RGcmVxdWVuY3ksIGludCB0ZXN0U3IsCisgICAgICAgICAgICBpbnQgdGVzdENvbmYsIGxvbmcgd2FpdE1zZWMsIGRvdWJsZSB0ZXN0TG9vcER1cmF0aW9uKQorICAgICAgICAgICAgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gLS0tLS0tLS0gaW5pdGlhbGl6YXRpb24gLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgZmluYWwgaW50IGNoYW5uZWxDb3VudCA9IEludGVnZXIuYml0Q291bnQodGVzdENvbmYpOworICAgICAgICBmaW5hbCBpbnQgYnVmZmVyRnJhbWVzID0gKGludCkodGVzdExvb3BEdXJhdGlvbiAqIHRlc3RTcik7CisgICAgICAgIGZpbmFsIGludCBidWZmZXJTYW1wbGVzID0gYnVmZmVyRnJhbWVzICogY2hhbm5lbENvdW50OworICAgICAgICBmaW5hbCBpbnQgYnVmZmVyU2l6ZSA9IGJ1ZmZlclNhbXBsZXMKKyAgICAgICAgICAgICAgICAqIEF1ZGlvRm9ybWF0LmdldEJ5dGVzUGVyU2FtcGxlKHRlc3RGb3JtYXQpOworICAgICAgICBmaW5hbCBkb3VibGUgZnJlcXVlbmN5ID0gdGVzdEZyZXF1ZW5jeSAvIGNoYW5uZWxDb3VudDsKKyAgICAgICAgZmluYWwgbG9uZyBNSUxMSVNFQ09ORFNfUEVSX1NFQ09ORCA9IDEwMDA7CisgICAgICAgIEF1ZGlvVHJhY2sgdHJhY2sgPSBuZXcgQXVkaW9UcmFjayh0ZXN0U3RyZWFtVHlwZSwgdGVzdFNyLAorICAgICAgICAgICAgICAgIHRlc3RDb25mLCB0ZXN0Rm9ybWF0LCBidWZmZXJTaXplLCB0ZXN0TW9kZSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0ZXN0TmFtZSwgQXVkaW9UcmFjay5TVEFURV9OT19TVEFUSUNfREFUQSwgdHJhY2suZ2V0U3RhdGUoKSk7CisKKyAgICAgICAgLy8gLS0tLS0tLS0gdGVzdCAtLS0tLS0tLS0tLS0tLQorCisgICAgICAgIC8vIHRlc3Qgc2V0TG9vcFBvaW50cyBhbmQgc2V0UG9zaXRpb24gY2FuIGJlIGNhbGxlZCBoZXJlLgorICAgICAgICBhc3NlcnRFcXVhbHModGVzdE5hbWUsCisgICAgICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5BdWRpb1RyYWNrLlNVQ0NFU1MsCisgICAgICAgICAgICAgICAgdHJhY2suc2V0UGxheWJhY2tIZWFkUG9zaXRpb24oYnVmZmVyRnJhbWVzLzIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3ROYW1lLAorICAgICAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuQXVkaW9UcmFjay5TVUNDRVNTLAorICAgICAgICAgICAgICAgIHRyYWNrLnNldExvb3BQb2ludHMoCisgICAgICAgICAgICAgICAgICAgICAgICAwIC8qc3RhcnRJbkZyYW1lcyovLCBidWZmZXJGcmFtZXMsIDEwIC8qbG9vcENvdW50Ki8pKTsKKyAgICAgICAgLy8gb25seSBuZWVkIHRvIHdyaXRlIG9uY2UgdG8gdGhlIHN0YXRpYyB0cmFjaworICAgICAgICBzd2l0Y2ggKHRlc3RGb3JtYXQpIHsKKyAgICAgICAgY2FzZSBBdWRpb0Zvcm1hdC5FTkNPRElOR19QQ01fOEJJVDogeworICAgICAgICAgICAgYnl0ZSBkYXRhW10gPSBBdWRpb0hlbHBlci5jcmVhdGVTb3VuZERhdGFJbkJ5dGVBcnJheSgKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyU2FtcGxlcywgdGVzdFNyLAorICAgICAgICAgICAgICAgICAgICBmcmVxdWVuY3ksIHRlc3RTd2VlcCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModGVzdE5hbWUsCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgIHRyYWNrLndyaXRlKGRhdGEsIDAgLypvZmZzZXRJbkJ5dGVzKi8sIGRhdGEubGVuZ3RoKSk7CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEF1ZGlvRm9ybWF0LkVOQ09ESU5HX1BDTV8xNkJJVDogeworICAgICAgICAgICAgc2hvcnQgZGF0YVtdID0gQXVkaW9IZWxwZXIuY3JlYXRlU291bmREYXRhSW5TaG9ydEFycmF5KAorICAgICAgICAgICAgICAgICAgICBidWZmZXJTYW1wbGVzLCB0ZXN0U3IsCisgICAgICAgICAgICAgICAgICAgIGZyZXF1ZW5jeSwgdGVzdFN3ZWVwKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0ZXN0TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgdHJhY2sud3JpdGUoZGF0YSwgMCAvKm9mZnNldEluQnl0ZXMqLywgZGF0YS5sZW5ndGgpKTsKKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgQXVkaW9Gb3JtYXQuRU5DT0RJTkdfUENNX0ZMT0FUOiB7CisgICAgICAgICAgICBmbG9hdCBkYXRhW10gPSBBdWRpb0hlbHBlci5jcmVhdGVTb3VuZERhdGFJbkZsb2F0QXJyYXkoCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclNhbXBsZXMsIHRlc3RTciwKKyAgICAgICAgICAgICAgICAgICAgZnJlcXVlbmN5LCB0ZXN0U3dlZXApOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3ROYW1lLAorICAgICAgICAgICAgICAgICAgICBidWZmZXJTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICB0cmFjay53cml0ZShkYXRhLCAwIC8qb2Zmc2V0SW5CeXRlcyovLCBkYXRhLmxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1RyYWNrLldSSVRFX0JMT0NLSU5HKSk7CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscyh0ZXN0TmFtZSwgQXVkaW9UcmFjay5TVEFURV9JTklUSUFMSVpFRCwgdHJhY2suZ2V0U3RhdGUoKSk7CisgICAgICAgIC8vIHRlc3Qgc2V0TG9vcFBvaW50cyBhbmQgc2V0UG9zaXRpb24gY2FuIGJlIGNhbGxlZCBoZXJlLgorICAgICAgICBhc3NlcnRFcXVhbHModGVzdE5hbWUsCisgICAgICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5BdWRpb1RyYWNrLlNVQ0NFU1MsCisgICAgICAgICAgICAgICAgdHJhY2suc2V0UGxheWJhY2tIZWFkUG9zaXRpb24oMCAvKnBvc2l0aW9uSW5GcmFtZXMqLykpOworICAgICAgICBhc3NlcnRFcXVhbHModGVzdE5hbWUsCisgICAgICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5BdWRpb1RyYWNrLlNVQ0NFU1MsCisgICAgICAgICAgICAgICAgdHJhY2suc2V0TG9vcFBvaW50cygwIC8qc3RhcnRJbkZyYW1lcyovLCBidWZmZXJGcmFtZXMsIHRlc3RMb29wcykpOworCisgICAgICAgIHRyYWNrLnBsYXkoKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKChpbnQpKHRlc3RMb29wRHVyYXRpb24gKiBNSUxMSVNFQ09ORFNfUEVSX1NFQ09ORCkgKiAodGVzdExvb3BzICsgMSkpOworICAgICAgICBUaHJlYWQuc2xlZXAod2FpdE1zZWMpOworCisgICAgICAgIC8vIENoZWNrIHBvc2l0aW9uIGFmdGVyIGxvb3BpbmcuIEF1ZGlvVHJhY2suZ2V0UGxheWJhY2tIZWFkUG9zaXRpb24oKSByZXR1cm5zCisgICAgICAgIC8vIHRoZSBydW5uaW5nIGNvdW50IG9mIGZyYW1lcyBwbGF5ZWQsIG5vdCB0aGUgYWN0dWFsIHN0YXRpYyBidWZmZXIgcG9zaXRpb24uCisgICAgICAgIGludCBwb3NpdGlvbiA9IHRyYWNrLmdldFBsYXliYWNrSGVhZFBvc2l0aW9uKCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0ZXN0TmFtZSwgYnVmZmVyRnJhbWVzICogKHRlc3RMb29wcyArIDEpLCBwb3NpdGlvbik7CisKKyAgICAgICAgdHJhY2suc3RvcCgpOworICAgICAgICBUaHJlYWQuc2xlZXAod2FpdE1zZWMpOworICAgICAgICAvLyAtLS0tLS0tLSB0ZWFyIGRvd24gLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgdHJhY2sucmVsZWFzZSgpOworICAgIH0KKworICAgIEBQcmVzdWJtaXQKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGxheVN0cmVhbURhdGFTaG9ydCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBjb25zdGFudHMgZm9yIHRlc3QKKyAgICAgICAgZmluYWwgU3RyaW5nIFRFU1RfTkFNRSA9ICJ0ZXN0UGxheVN0cmVhbURhdGFTaG9ydCI7CisgICAgICAgIGZpbmFsIGludCBURVNUX0ZPUk1BVCA9IEF1ZGlvRm9ybWF0LkVOQ09ESU5HX1BDTV8xNkJJVDsKKyAgICAgICAgZmluYWwgaW50IFRFU1RfU1IgPSA0ODAwMDsKKyAgICAgICAgZmluYWwgaW50IFRFU1RfQ09ORiA9IEF1ZGlvRm9ybWF0LkNIQU5ORUxfT1VUX1NURVJFTzsKKyAgICAgICAgZmluYWwgaW50IFRFU1RfTU9ERSA9IEF1ZGlvVHJhY2suTU9ERV9TVFJFQU07CisgICAgICAgIGZpbmFsIGludCBURVNUX1NUUkVBTV9UWVBFID0gQXVkaW9NYW5hZ2VyLlNUUkVBTV9NVVNJQzsKKyAgICAgICAgZmluYWwgZmxvYXQgVEVTVF9TV0VFUCA9IDA7IC8vIHNpbmUgd2F2ZSBvbmx5CisgICAgICAgIGZpbmFsIGJvb2xlYW4gVEVTVF9JU19MT1dfUkFNX0RFVklDRSA9IGlzTG93UmFtRGV2aWNlKCk7CisgICAgICAgIGZpbmFsIGRvdWJsZSBURVNUX0ZSRVFVRU5DWSA9IDEwMDA7CisgICAgICAgIGZpbmFsIGxvbmcgTk9fV0FJVCA9IDA7CisKKyAgICAgICAgcGxheU9uY2VTdHJlYW1EYXRhKFRFU1RfTkFNRSwgVEVTVF9NT0RFLCBURVNUX1NUUkVBTV9UWVBFLCBURVNUX1NXRUVQLAorICAgICAgICAgICAgICAgIFRFU1RfSVNfTE9XX1JBTV9ERVZJQ0UsIFRFU1RfRk9STUFULCBURVNUX0ZSRVFVRU5DWSwgVEVTVF9TUiwgVEVTVF9DT05GLAorICAgICAgICAgICAgICAgIE5PX1dBSVQpOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHRlc3RQbGF5U3RyZWFtRGF0YSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBjb25zdGFudHMgZm9yIHRlc3QKICAgICAgICAgZmluYWwgU3RyaW5nIFRFU1RfTkFNRSA9ICJ0ZXN0UGxheVN0cmVhbURhdGEiOwpAQCAtMTYwNyw5NCArMTY2NywxMDUgQEAKICAgICAgICAgICAgIGRvdWJsZSBmcmVxdWVuY3kgPSA0MDA7IC8vIGZyZXF1ZW5jeSBjaGFuZ2VzIGZvciBlYWNoIHRlc3QKICAgICAgICAgICAgIGZvciAoaW50IFRFU1RfU1IgOiBURVNUX1NSX0FSUkFZKSB7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgVEVTVF9DT05GIDogVEVTVF9DT05GX0FSUkFZKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBjaGFubmVsQ291bnQgPSBJbnRlZ2VyLmJpdENvdW50KFRFU1RfQ09ORik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChURVNUX0lTX0xPV19SQU1fREVWSUNFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKFRFU1RfU1IgPiA5NjAwMCB8fCBjaGFubmVsQ291bnQgPiA0KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIGlnbm9yZS4gRklYTUU6IHJlZW5hYmxlIHdoZW4gQUYgbWVtb3J5IGFsbG9jYXRpb24gaXMgdXBkYXRlZC4KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyAtLS0tLS0tLSBpbml0aWFsaXphdGlvbiAtLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbWluQnVmZmVyU2l6ZSA9IEF1ZGlvVHJhY2suZ2V0TWluQnVmZmVyU2l6ZShURVNUX1NSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RfQ09ORiwgVEVTVF9GT1JNQVQpOyAvLyBpbiBieXRlcwotICAgICAgICAgICAgICAgICAgICBBdWRpb1RyYWNrIHRyYWNrID0gbmV3IEF1ZGlvVHJhY2soVEVTVF9TVFJFQU1fVFlQRSwgVEVTVF9TUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVNUX0NPTkYsIFRFU1RfRk9STUFULCBtaW5CdWZmZXJTaXplLCBURVNUX01PREUpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKFRFU1RfTkFNRSwgdHJhY2suZ2V0U3RhdGUoKSA9PSBBdWRpb1RyYWNrLlNUQVRFX0lOSVRJQUxJWkVEKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBjb21wdXRlIHBhcmFtZXRlcnMgZm9yIHRoZSBzb3VyY2Ugc2lnbmFsIGRhdGEuCi0gICAgICAgICAgICAgICAgICAgIEF1ZGlvRm9ybWF0IGZvcm1hdCA9IHRyYWNrLmdldEZvcm1hdCgpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoVEVTVF9OQU1FLCBURVNUX1NSLCBmb3JtYXQuZ2V0U2FtcGxlUmF0ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFRFU1RfTkFNRSwgVEVTVF9DT05GLCBmb3JtYXQuZ2V0Q2hhbm5lbE1hc2soKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhURVNUX05BTUUsIGNoYW5uZWxDb3VudCwgZm9ybWF0LmdldENoYW5uZWxDb3VudCgpKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFRFU1RfTkFNRSwgVEVTVF9GT1JNQVQsIGZvcm1hdC5nZXRFbmNvZGluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHNvdXJjZVNhbXBsZXMgPSBjaGFubmVsQ291bnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1ZGlvSGVscGVyLmZyYW1lQ291bnRGcm9tTXNlYyg1MDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQpOyAvLyBkdXJhdGlvbiBvZiB0ZXN0IHRvbmVzCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGRvdWJsZSB0ZXN0RnJlcXVlbmN5ID0gZnJlcXVlbmN5IC8gY2hhbm5lbENvdW50OwotCi0gICAgICAgICAgICAgICAgICAgIGludCB3cml0dGVuID0gMDsKLSAgICAgICAgICAgICAgICAgICAgLy8gRm9yIHN0cmVhbWluZyB0cmFja3MsIGl0J3Mgb2sgdG8gaXNzdWUgdGhlIHBsYXkoKSBjb21tYW5kCi0gICAgICAgICAgICAgICAgICAgIC8vIGJlZm9yZSBhbnkgYXVkaW8gaXMgd3JpdHRlbi4KLSAgICAgICAgICAgICAgICAgICAgdHJhY2sucGxheSgpOwotICAgICAgICAgICAgICAgICAgICAvLyAtLS0tLS0tLSB0ZXN0IC0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgICAgICAgICAgICAgLy8gc2FtcGxlc1BlcldyaXRlIGNhbiBiZSBhbnkgcG9zaXRpdmUgdmFsdWUuCi0gICAgICAgICAgICAgICAgICAgIC8vIFdlIHByZWZlciB0aGlzIHRvIGJlIGEgbXVsdGlwbGUgb2YgY2hhbm5lbENvdW50IHNvIHdyaXRlKCkKLSAgICAgICAgICAgICAgICAgICAgLy8gZG9lcyBub3QgcmV0dXJuIGEgc2hvcnQgY291bnQuCi0gICAgICAgICAgICAgICAgICAgIC8vIElmIHNhbXBsZXNQZXJXcml0ZSBpcyB2ZXJ5IGxhcmdlLCBpdCBpcyBsaW1pdGVkIHRvIHRoZSBkYXRhIGxlbmd0aAotICAgICAgICAgICAgICAgICAgICAvLyBhbmQgd2Ugc2ltcGx5IHdyaXRlIChibG9ja2luZykgdGhlIGVudGlyZSBzb3VyY2UgZGF0YSBhbmQgbm90IGV2ZW4gbG9vcC4KLSAgICAgICAgICAgICAgICAgICAgLy8gV2UgY2hvb3NlIGEgdmFsdWUgaGVyZSB3aGljaCBzaW11bGF0ZXMgZG91YmxlIGJ1ZmZlciB3cml0ZXMuCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBidWZmZXJzID0gMjsgLy8gZG91YmxlIGJ1ZmZlcmluZyBtb2RlCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBzYW1wbGVzUGVyV3JpdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0cmFjay5nZXRCdWZmZXJTaXplSW5GcmFtZXMoKSAvIGJ1ZmZlcnMpICogY2hhbm5lbENvdW50OwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKFRFU1RfRk9STUFUKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQXVkaW9Gb3JtYXQuRU5DT0RJTkdfUENNXzhCSVQ6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGUgZGF0YVtdID0gQXVkaW9IZWxwZXIuY3JlYXRlU291bmREYXRhSW5CeXRlQXJyYXkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZVNhbXBsZXMsIFRFU1RfU1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RGcmVxdWVuY3ksIFRFU1RfU1dFRVApOwotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHdyaXR0ZW4gPCBkYXRhLmxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzYW1wbGVzID0gTWF0aC5taW4oZGF0YS5sZW5ndGggLSB3cml0dGVuLCBzYW1wbGVzUGVyV3JpdGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXQgPSB0cmFjay53cml0ZShkYXRhLCB3cml0dGVuLCBzYW1wbGVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoVEVTVF9OQU1FLCBzYW1wbGVzLCByZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXR0ZW4gKz0gcmV0OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBBdWRpb0Zvcm1hdC5FTkNPRElOR19QQ01fMTZCSVQ6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IGRhdGFbXSA9IEF1ZGlvSGVscGVyLmNyZWF0ZVNvdW5kRGF0YUluU2hvcnRBcnJheSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlU2FtcGxlcywgVEVTVF9TUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdEZyZXF1ZW5jeSwgVEVTVF9TV0VFUCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAod3JpdHRlbiA8IGRhdGEubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNhbXBsZXMgPSBNYXRoLm1pbihkYXRhLmxlbmd0aCAtIHdyaXR0ZW4sIHNhbXBsZXNQZXJXcml0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJldCA9IHRyYWNrLndyaXRlKGRhdGEsIHdyaXR0ZW4sIHNhbXBsZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhURVNUX05BTUUsIHNhbXBsZXMsIHJldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdHRlbiArPSByZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEF1ZGlvRm9ybWF0LkVOQ09ESU5HX1BDTV9GTE9BVDogewotICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZGF0YVtdID0gQXVkaW9IZWxwZXIuY3JlYXRlU291bmREYXRhSW5GbG9hdEFycmF5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VTYW1wbGVzLCBURVNUX1NSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0RnJlcXVlbmN5LCBURVNUX1NXRUVQKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh3cml0dGVuIDwgZGF0YS5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2FtcGxlcyA9IE1hdGgubWluKGRhdGEubGVuZ3RoIC0gd3JpdHRlbiwgc2FtcGxlc1BlcldyaXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmV0ID0gdHJhY2sud3JpdGUoZGF0YSwgd3JpdHRlbiwgc2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvVHJhY2suV1JJVEVfQkxPQ0tJTkcpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhURVNUX05BTUUsIHNhbXBsZXMsIHJldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdHRlbiArPSByZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gRm9yIHN0cmVhbWluZyB0cmFja3MsIEF1ZGlvVHJhY2suc3RvcCgpIGRvZXNuJ3QgaW1tZWRpYXRlbHkgc3RvcCBwbGF5YmFjay4KLSAgICAgICAgICAgICAgICAgICAgLy8gUmF0aGVyLCBpdCBhbGxvd3MgdGhlIHJlbWFpbmluZyBkYXRhIGluIHRoZSBpbnRlcm5hbCBidWZmZXIgdG8gZHJhaW4uCi0gICAgICAgICAgICAgICAgICAgIHRyYWNrLnN0b3AoKTsKLSAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFdBSVRfTVNFQyk7IC8vIHdhaXQgZm9yIHRoZSBkYXRhIHRvIGRyYWluLgotICAgICAgICAgICAgICAgICAgICAvLyAtLS0tLS0tLSB0ZWFyIGRvd24gLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgICAgICAgICAgdHJhY2sucmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoV0FJVF9NU0VDKTsgLy8gd2FpdCBmb3IgcmVsZWFzZSB0byBjb21wbGV0ZQorICAgICAgICAgICAgICAgICAgICBwbGF5T25jZVN0cmVhbURhdGEoVEVTVF9OQU1FLCBURVNUX01PREUsIFRFU1RfU1RSRUFNX1RZUEUsIFRFU1RfU1dFRVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9JU19MT1dfUkFNX0RFVklDRSwgVEVTVF9GT1JNQVQsIGZyZXF1ZW5jeSwgVEVTVF9TUiwgVEVTVF9DT05GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdBSVRfTVNFQyk7CiAgICAgICAgICAgICAgICAgICAgIGZyZXF1ZW5jeSArPSA1MDsgLy8gaW5jcmVtZW50IHRlc3QgdG9uZSBmcmVxdWVuY3kKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgcGxheU9uY2VTdHJlYW1EYXRhKFN0cmluZyB0ZXN0TmFtZSwgaW50IHRlc3RNb2RlLCBpbnQgdGVzdFN0cmVhbSwKKyAgICAgICAgICAgIGZsb2F0IHRlc3RTd2VlcCwgYm9vbGVhbiBpc0xvd1JhbURldmljZSwgaW50IHRlc3RGb3JtYXQsIGRvdWJsZSB0ZXN0RnJlcXVlbmN5LAorICAgICAgICAgICAgaW50IHRlc3RTciwgaW50IHRlc3RDb25mLCBsb25nIHdhaXRNc2VjKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBpbnQgY2hhbm5lbENvdW50ID0gSW50ZWdlci5iaXRDb3VudCh0ZXN0Q29uZik7CisgICAgICAgIGlmIChpc0xvd1JhbURldmljZQorICAgICAgICAgICAgICAgICYmICh0ZXN0U3IgPiA5NjAwMCB8fCBjaGFubmVsQ291bnQgPiA0KSkgeworICAgICAgICAgICAgcmV0dXJuOyAvLyBpZ25vcmUuIEZJWE1FOiByZWVuYWJsZSB3aGVuIEFGIG1lbW9yeSBhbGxvY2F0aW9uIGlzIHVwZGF0ZWQuCisgICAgICAgIH0KKyAgICAgICAgLy8gLS0tLS0tLS0gaW5pdGlhbGl6YXRpb24gLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgZmluYWwgaW50IG1pbkJ1ZmZlclNpemUgPSBBdWRpb1RyYWNrLmdldE1pbkJ1ZmZlclNpemUodGVzdFNyLAorICAgICAgICAgICAgICAgIHRlc3RDb25mLCB0ZXN0Rm9ybWF0KTsgLy8gaW4gYnl0ZXMKKyAgICAgICAgQXVkaW9UcmFjayB0cmFjayA9IG5ldyBBdWRpb1RyYWNrKHRlc3RTdHJlYW0sIHRlc3RTciwKKyAgICAgICAgICAgICAgICB0ZXN0Q29uZiwgdGVzdEZvcm1hdCwgbWluQnVmZmVyU2l6ZSwgdGVzdE1vZGUpOworICAgICAgICBhc3NlcnRUcnVlKHRlc3ROYW1lLCB0cmFjay5nZXRTdGF0ZSgpID09IEF1ZGlvVHJhY2suU1RBVEVfSU5JVElBTElaRUQpOworCisgICAgICAgIC8vIGNvbXB1dGUgcGFyYW1ldGVycyBmb3IgdGhlIHNvdXJjZSBzaWduYWwgZGF0YS4KKyAgICAgICAgQXVkaW9Gb3JtYXQgZm9ybWF0ID0gdHJhY2suZ2V0Rm9ybWF0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0ZXN0TmFtZSwgdGVzdFNyLCBmb3JtYXQuZ2V0U2FtcGxlUmF0ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3ROYW1lLCB0ZXN0Q29uZiwgZm9ybWF0LmdldENoYW5uZWxNYXNrKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModGVzdE5hbWUsIGNoYW5uZWxDb3VudCwgZm9ybWF0LmdldENoYW5uZWxDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3ROYW1lLCB0ZXN0Rm9ybWF0LCBmb3JtYXQuZ2V0RW5jb2RpbmcoKSk7CisgICAgICAgIGZpbmFsIGludCBzb3VyY2VTYW1wbGVzID0gY2hhbm5lbENvdW50CisgICAgICAgICAgICAgICAgKiBBdWRpb0hlbHBlci5mcmFtZUNvdW50RnJvbU1zZWMoNTAwLAorICAgICAgICAgICAgICAgIGZvcm1hdCk7IC8vIGR1cmF0aW9uIG9mIHRlc3QgdG9uZXMKKyAgICAgICAgZmluYWwgZG91YmxlIGZyZXF1ZW5jeSA9IHRlc3RGcmVxdWVuY3kgLyBjaGFubmVsQ291bnQ7CisKKyAgICAgICAgaW50IHdyaXR0ZW4gPSAwOworICAgICAgICAvLyBGb3Igc3RyZWFtaW5nIHRyYWNrcywgaXQncyBvayB0byBpc3N1ZSB0aGUgcGxheSgpIGNvbW1hbmQKKyAgICAgICAgLy8gYmVmb3JlIGFueSBhdWRpbyBpcyB3cml0dGVuLgorICAgICAgICB0cmFjay5wbGF5KCk7CisgICAgICAgIC8vIC0tLS0tLS0tIHRlc3QgLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAvLyBzYW1wbGVzUGVyV3JpdGUgY2FuIGJlIGFueSBwb3NpdGl2ZSB2YWx1ZS4KKyAgICAgICAgLy8gV2UgcHJlZmVyIHRoaXMgdG8gYmUgYSBtdWx0aXBsZSBvZiBjaGFubmVsQ291bnQgc28gd3JpdGUoKQorICAgICAgICAvLyBkb2VzIG5vdCByZXR1cm4gYSBzaG9ydCBjb3VudC4KKyAgICAgICAgLy8gSWYgc2FtcGxlc1BlcldyaXRlIGlzIHZlcnkgbGFyZ2UsIGl0IGlzIGxpbWl0ZWQgdG8gdGhlIGRhdGEgbGVuZ3RoCisgICAgICAgIC8vIGFuZCB3ZSBzaW1wbHkgd3JpdGUgKGJsb2NraW5nKSB0aGUgZW50aXJlIHNvdXJjZSBkYXRhIGFuZCBub3QgZXZlbiBsb29wLgorICAgICAgICAvLyBXZSBjaG9vc2UgYSB2YWx1ZSBoZXJlIHdoaWNoIHNpbXVsYXRlcyBkb3VibGUgYnVmZmVyIHdyaXRlcy4KKyAgICAgICAgZmluYWwgaW50IGJ1ZmZlcnMgPSAyOyAvLyBkb3VibGUgYnVmZmVyaW5nIG1vZGUKKyAgICAgICAgZmluYWwgaW50IHNhbXBsZXNQZXJXcml0ZSA9CisgICAgICAgICAgICAgICAgKHRyYWNrLmdldEJ1ZmZlclNpemVJbkZyYW1lcygpIC8gYnVmZmVycykgKiBjaGFubmVsQ291bnQ7CisgICAgICAgIHN3aXRjaCAodGVzdEZvcm1hdCkgeworICAgICAgICAgICAgY2FzZSBBdWRpb0Zvcm1hdC5FTkNPRElOR19QQ01fOEJJVDogeworICAgICAgICAgICAgICAgIGJ5dGUgZGF0YVtdID0gQXVkaW9IZWxwZXIuY3JlYXRlU291bmREYXRhSW5CeXRlQXJyYXkoCisgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VTYW1wbGVzLCB0ZXN0U3IsCisgICAgICAgICAgICAgICAgICAgICAgICBmcmVxdWVuY3ksIHRlc3RTd2VlcCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKHdyaXR0ZW4gPCBkYXRhLmxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICBpbnQgc2FtcGxlcyA9IE1hdGgubWluKGRhdGEubGVuZ3RoIC0gd3JpdHRlbiwgc2FtcGxlc1BlcldyaXRlKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHJldCA9IHRyYWNrLndyaXRlKGRhdGEsIHdyaXR0ZW4sIHNhbXBsZXMpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHModGVzdE5hbWUsIHNhbXBsZXMsIHJldCk7CisgICAgICAgICAgICAgICAgICAgIHdyaXR0ZW4gKz0gcmV0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBdWRpb0Zvcm1hdC5FTkNPRElOR19QQ01fMTZCSVQ6IHsKKyAgICAgICAgICAgICAgICBzaG9ydCBkYXRhW10gPSBBdWRpb0hlbHBlci5jcmVhdGVTb3VuZERhdGFJblNob3J0QXJyYXkoCisgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VTYW1wbGVzLCB0ZXN0U3IsCisgICAgICAgICAgICAgICAgICAgICAgICBmcmVxdWVuY3ksIHRlc3RTd2VlcCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKHdyaXR0ZW4gPCBkYXRhLmxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICBpbnQgc2FtcGxlcyA9IE1hdGgubWluKGRhdGEubGVuZ3RoIC0gd3JpdHRlbiwgc2FtcGxlc1BlcldyaXRlKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHJldCA9IHRyYWNrLndyaXRlKGRhdGEsIHdyaXR0ZW4sIHNhbXBsZXMpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHModGVzdE5hbWUsIHNhbXBsZXMsIHJldCk7CisgICAgICAgICAgICAgICAgICAgIHdyaXR0ZW4gKz0gcmV0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBdWRpb0Zvcm1hdC5FTkNPRElOR19QQ01fRkxPQVQ6IHsKKyAgICAgICAgICAgICAgICBmbG9hdCBkYXRhW10gPSBBdWRpb0hlbHBlci5jcmVhdGVTb3VuZERhdGFJbkZsb2F0QXJyYXkoCisgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VTYW1wbGVzLCB0ZXN0U3IsCisgICAgICAgICAgICAgICAgICAgICAgICBmcmVxdWVuY3ksIHRlc3RTd2VlcCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKHdyaXR0ZW4gPCBkYXRhLmxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICBpbnQgc2FtcGxlcyA9IE1hdGgubWluKGRhdGEubGVuZ3RoIC0gd3JpdHRlbiwgc2FtcGxlc1BlcldyaXRlKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHJldCA9IHRyYWNrLndyaXRlKGRhdGEsIHdyaXR0ZW4sIHNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9UcmFjay5XUklURV9CTE9DS0lORyk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyh0ZXN0TmFtZSwgc2FtcGxlcywgcmV0KTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdHRlbiArPSByZXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyBGb3Igc3RyZWFtaW5nIHRyYWNrcywgQXVkaW9UcmFjay5zdG9wKCkgZG9lc24ndCBpbW1lZGlhdGVseSBzdG9wIHBsYXliYWNrLgorICAgICAgICAvLyBSYXRoZXIsIGl0IGFsbG93cyB0aGUgcmVtYWluaW5nIGRhdGEgaW4gdGhlIGludGVybmFsIGJ1ZmZlciB0byBkcmFpbi4KKyAgICAgICAgdHJhY2suc3RvcCgpOworICAgICAgICBUaHJlYWQuc2xlZXAod2FpdE1zZWMpOyAvLyB3YWl0IGZvciB0aGUgZGF0YSB0byBkcmFpbi4KKyAgICAgICAgLy8gLS0tLS0tLS0gdGVhciBkb3duIC0tLS0tLS0tLS0tLS0tCisgICAgICAgIHRyYWNrLnJlbGVhc2UoKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKHdhaXRNc2VjKTsgLy8gd2FpdCBmb3IgcmVsZWFzZSB0byBjb21wbGV0ZQorICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHRlc3RQbGF5U3RyZWFtQnl0ZUJ1ZmZlcigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBjb25zdGFudHMgZm9yIHRlc3QKICAgICAgICAgZmluYWwgU3RyaW5nIFRFU1RfTkFNRSA9ICJ0ZXN0UGxheVN0cmVhbUJ5dGVCdWZmZXIiOwpAQCAtMjE5NSw2ICsyMjY2LDY3IEBACiAgICAgICAgIHRyYWNrLnJlbGVhc2UoKTsKICAgICB9CiAKKyAgICAvLyBUZXN0IHRoYXQgQXVkaW9UcmFjayBzdG9wIGxpbWl0cyBkcmFpbiB0byBvbmx5IHRob3NlIGZyYW1lcyB3cml0dGVuIGF0IHRoZSB0aW1lIG9mIHN0b3AuCisgICAgLy8gVGhpcyBlbnN1cmVzIGNvbnNpc3RlbnQgc3RvcCBiZWhhdmlvciBvbiBBbmRyb2lkIFAgYW5kIGJleW9uZCwgd2hlcmUgZGF0YSB3cml0dGVuCisgICAgLy8gaW1tZWRpYXRlbHkgYWZ0ZXIgYSBzdG9wIGRvZXNuJ3QgZ2V0IGNhdWdodCBpbiB0aGUgZHJhaW4uCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdG9wRHJhaW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIFRFU1RfTkFNRSA9ICJ0ZXN0U3RvcERyYWluIjsKKyAgICAgICAgZmluYWwgaW50IFRFU1RfU1IgPSA4MDAwOworICAgICAgICBmaW5hbCBpbnQgVEVTVF9DT05GID0gQXVkaW9Gb3JtYXQuQ0hBTk5FTF9PVVRfTU9OTzsgLy8gcmVxdWlyZWQgZm9yIHRlc3QKKyAgICAgICAgZmluYWwgaW50IFRFU1RfRk9STUFUID0gQXVkaW9Gb3JtYXQuRU5DT0RJTkdfUENNXzhCSVQ7IC8vIHJlcXVpcmVkIGZvciB0ZXN0CisgICAgICAgIGZpbmFsIGludCBURVNUX01PREUgPSBBdWRpb1RyYWNrLk1PREVfU1RSRUFNOyAvLyByZXF1aXJlZCBmb3IgdGVzdAorICAgICAgICBmaW5hbCBpbnQgVEVTVF9TVFJFQU1fVFlQRSA9IEF1ZGlvTWFuYWdlci5TVFJFQU1fTVVTSUM7CisKKyAgICAgICAgZmluYWwgaW50IGNoYW5uZWxDb3VudCA9IEF1ZGlvRm9ybWF0LmNoYW5uZWxDb3VudEZyb21PdXRDaGFubmVsTWFzayhURVNUX0NPTkYpOworICAgICAgICBmaW5hbCBpbnQgYnl0ZXNQZXJTYW1wbGUgPSBBdWRpb0Zvcm1hdC5nZXRCeXRlc1BlclNhbXBsZShURVNUX0ZPUk1BVCk7CisgICAgICAgIGZpbmFsIGludCBieXRlc1BlckZyYW1lID0gY2hhbm5lbENvdW50ICogYnl0ZXNQZXJTYW1wbGU7CisgICAgICAgIGZpbmFsIGludCBmcmFtZUNvdW50ID0gVEVTVF9TUiAqIDM7IC8vIDMgc2Vjb25kcyBvZiBidWZmZXIuCisgICAgICAgIGZpbmFsIGludCBidWZmZXJTaXplSW5CeXRlcyA9IGZyYW1lQ291bnQgKiBieXRlc1BlckZyYW1lOworCisgICAgICAgIGZpbmFsIEF1ZGlvVHJhY2sgdHJhY2sgPSBuZXcgQXVkaW9UcmFjaygKKyAgICAgICAgICAgICAgICBURVNUX1NUUkVBTV9UWVBFLCBURVNUX1NSLCBURVNUX0NPTkYsIFRFU1RfRk9STUFULCBidWZmZXJTaXplSW5CeXRlcywgVEVTVF9NT0RFKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gQ3JlYXRlIDYgc2Vjb25kcyBvZiBkYXRhLCBidXQgc2VuZCBkb3duIG9ubHkgMyBzZWNvbmRzIHRvIGZpbGwgYnVmZmVyLgorICAgICAgICAgICAgZmluYWwgYnl0ZVtdIHNvdW5kRGF0YSA9IEF1ZGlvSGVscGVyLmNyZWF0ZVNvdW5kRGF0YUluQnl0ZUFycmF5KAorICAgICAgICAgICAgICAgICAgICBidWZmZXJTaXplSW5CeXRlcyAqIDIsIFRFU1RfU1IsIDYwMCAvKiBmcmVxdWVuY3kgKi8sIDAgLyogc3dlZXAgKi8pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJjYW5ub3QgZmlsbCBBdWRpb1RyYWNrIGJ1ZmZlciIsCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclNpemVJbkJ5dGVzLAorICAgICAgICAgICAgICAgICAgICB0cmFjay53cml0ZShzb3VuZERhdGEsIDAgLyogb2Zmc2V0SW5CeXRlcyAqLywgYnVmZmVyU2l6ZUluQnl0ZXMpKTsKKworICAgICAgICAgICAgLy8gU2V0IHRoZSB0cmFjayBwbGF5aW5nLgorICAgICAgICAgICAgdHJhY2sucGxheSgpOworCisgICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIHRpbWluZ3MgaGVyZSBhcmUgdmVyeSBnZW5lcm91cyBmb3Igb3VyIHRlc3QgKHJlYWxseSB0aGUKKyAgICAgICAgICAgIC8vIGdyYW51bGFyaXR5IHdlIG5lZWQgaXMgb24gdGhlIG9yZGVyIG9mIGEgc2Vjb25kKS4gIElmIHdlIGRvbid0IGdldCBzY2hlZHVsZWQKKyAgICAgICAgICAgIC8vIHRvIHJ1biB3aXRoaW4gYWJvdXQgYSBzZWNvbmQgb3Igc28gLSB0aGlzIHNob3VsZCBiZSBleHRyZW1lbHkgcmFyZSAtCisgICAgICAgICAgICAvLyB0aGUgcmVzdWx0IHNob3VsZCBiZSBhIGZhbHNlIHBhc3MgKHJhdGhlciB0aGFuIGEgZmFsc2UgZmFpbCkuCisKKyAgICAgICAgICAgIC8vIEFmdGVyIDEuNSBzZWNvbmRzIHN0b3AuCisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTUwMCAvKiBtaWxsaXMgKi8pOyAvLyBBc3N1bWUgZGV2aWNlIHN0YXJ0cyB3aXRoaW4gMS41IHNlYy4KKyAgICAgICAgICAgIHRyYWNrLnN0b3AoKTsKKworICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIGRyYWluIDEuNSBzZWNvbmRzIGFuZCBmaWxsIGFub3RoZXIgMyBzZWNvbmRzIG9mIGRhdGEuCisgICAgICAgICAgICAvLyBXZSBzaG91bGRuJ3QgYmUgYWJsZSB0byB3cml0ZSA2IHNlY29uZHMgb2YgZGF0YSAtIHRoYXQgaW5kaWNhdGVzIHN0b3AgY29udGludWVzCisgICAgICAgICAgICAvLyB0byBkcmFpbiBiZXlvbmQgdGhlIGZyYW1lcyB3cml0dGVuIGF0IHRoZSB0aW1lIG9mIHN0b3AuCisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gMDsKKyAgICAgICAgICAgIHdoaWxlIChsZW5ndGggPCBzb3VuZERhdGEubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDgwMCAvKiBtaWxsaXMgKi8pOyAvLyBhc3N1bWUgbGFyZ2VyIHRoYW4gQUYgdGhyZWFkIGxvb3AgcGVyaW9kCisgICAgICAgICAgICAgICAgZmluYWwgaW50IGRlbHRhID0gdHJhY2sud3JpdGUoc291bmREYXRhLCBsZW5ndGgsIHNvdW5kRGF0YS5sZW5ndGggLSBsZW5ndGgpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoInRyYWNrIHdyaXRlIGVycm9yOiAiICsgZGVsdGEsIGRlbHRhID49IDApOworICAgICAgICAgICAgICAgIGlmIChkZWx0YSA9PSAwKSBicmVhazsKKyAgICAgICAgICAgICAgICBsZW5ndGggKz0gZGVsdGE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENoZWNrIHRvIHNlZSB3ZSBsaW1pdCB0aGUgZGF0YSBkcmFpbmVkIChzaG91bGQgYmUgYWJsZSB0byBleGFjdGx5IGZpbGwgdGhlIGJ1ZmZlcikuCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInN0b3AgZHJhaW4gbXVzdCBiZSBsaW1pdGVkICIgKyBidWZmZXJTaXplSW5CeXRlcyArICIgIT0gIiArIGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyU2l6ZUluQnl0ZXMsIGxlbmd0aCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB0cmFjay5yZWxlYXNlKCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCB0ZXN0VmFyaWFibGVTcGVlZFBsYXliYWNrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghaGFzQXVkaW9PdXRwdXQoKSkgewogICAgICAgICAgICAgTG9nLncoVEFHLCJBVURJT19PVVRQVVQgZmVhdHVyZSBub3QgZm91bmQuIFRoaXMgc3lzdGVtIG1pZ2h0IG5vdCBoYXZlIGEgdmFsaWQgIgpAQCAtMjM1OCw2ICsyNDkwLDM4IEBACiAgICAgICAgIGFzc2VydFRydWUoVEVTVF9OQU1FICsgIjogYnVmZmVyIGZyYW1lIGNvdW50Iiwgb2JzZXJ2ZWRCdWZmZXJTaXplMiA+IDApOwogICAgIH0KIAorICAgIC8vIFRlc3QgQXVkaW9UcmFjayB0byBzZWUgaWYgdGhlcmUgYXJlIGFueSBwcm9ibGVtcyB3aXRoIGxhcmdlIGZyYW1lIGNvdW50cy4KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXVkaW9UcmFja0xhcmdlRnJhbWVDb3VudCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBjb25zdGFudHMgZm9yIHRlc3QKKyAgICAgICAgZmluYWwgU3RyaW5nIFRFU1RfTkFNRSA9ICJ0ZXN0QXVkaW9UcmFja0xhcmdlRnJhbWVDb3VudCI7CisgICAgICAgIGZpbmFsIGludFtdIEJVRkZFUl9TSVpFUyA9IHsgNDI5NDk2OCwgNDI5NDk2ODAsIDQyOTQ5NjgwMCwgSW50ZWdlci5NQVhfVkFMVUUgfTsKKyAgICAgICAgZmluYWwgaW50W10gTU9ERVMgPSB7IEF1ZGlvVHJhY2suTU9ERV9TVEFUSUMsIEF1ZGlvVHJhY2suTU9ERV9TVFJFQU0gfTsKKworICAgICAgICBmb3IgKGludCBtb2RlIDogTU9ERVMpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGJ1ZmZlclNpemVJbkJ5dGVzIDogQlVGRkVSX1NJWkVTKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgQXVkaW9UcmFjayB0cmFjayA9IG5ldyBBdWRpb1RyYWNrLkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEF1ZGlvRm9ybWF0KG5ldyBBdWRpb0Zvcm1hdC5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RW5jb2RpbmcoQXVkaW9Gb3JtYXQuRU5DT0RJTkdfUENNXzhCSVQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFNhbXBsZVJhdGUoNDQxMDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldENoYW5uZWxNYXNrKEF1ZGlvRm9ybWF0LkNIQU5ORUxfT1VUX01PTk8pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0VHJhbnNmZXJNb2RlKG1vZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0QnVmZmVyU2l6ZUluQnl0ZXMoYnVmZmVyU2l6ZUluQnl0ZXMpIC8vIDEgYnl0ZSA9PSAxIGZyYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhY2sucmVsZWFzZSgpOyAvLyBPSyB0byBzdWNjZXNzZnVsbHkgY29tcGxldGUKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIDsgLy8gT0sgdG8gdGhyb3cgdW5zdXBwb3J0ZWQgZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNldFByZXNlbnRhdGlvbkRlZmF1bHRUcmFjaygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBBdWRpb1RyYWNrIHRyYWNrID0gbmV3IEF1ZGlvVHJhY2suQnVpbGRlcigpLmJ1aWxkKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhBdWRpb1RyYWNrLkVSUk9SLCB0cmFjay5zZXRQcmVzZW50YXRpb24oY3JlYXRlQXVkaW9QcmVzZW50YXRpb24oKSkpOworICAgIH0KKwogLyogRG8gbm90IHJ1biBpbiBKQi1NUjEuIHdpbGwgYmUgcmUtb3BlbmVkIGluIHRoZSBuZXh0IHBsYXRmb3JtIHJlbGVhc2UuCiAgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlTGVha2FnZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBmaW5hbCBpbnQgQlVGRkVSX1NJWkUgPSA2MDAgKiAxMDI0OwpAQCAtMjM5OCw0ICsyNTYyLDE1IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIHN0YXRpYyBBdWRpb1ByZXNlbnRhdGlvbiBjcmVhdGVBdWRpb1ByZXNlbnRhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBdWRpb1ByZXNlbnRhdGlvbigKKyAgICAgICAgICAgICAgICA0MiAvKnByZXNlbnRhdGlvbklkKi8sCisgICAgICAgICAgICAgICAgNDMgLypwcm9ncmFtSWQqLywKKyAgICAgICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKSwKKyAgICAgICAgICAgICAgICBMb2NhbGUuVVMudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICBBdWRpb1ByZXNlbnRhdGlvbi5NQVNURVJJTkdfTk9UX0lORElDQVRFRCwKKyAgICAgICAgICAgICAgICBmYWxzZSAvKmF1ZGlvRGVzY3JpcHRpb25BdmFpbGFibGUqLywKKyAgICAgICAgICAgICAgICBmYWxzZSAvKnNwb2tlblN1YnRpdGxlc0F2YWlsYWJsZSovLAorICAgICAgICAgICAgICAgIGZhbHNlIC8qZGlhbG9ndWVFbmhhbmNlbWVudEF2YWlsYWJsZSovKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvQ2xlYXJLZXlTeXN0ZW1UZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvQ2xlYXJLZXlTeXN0ZW1UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE0ZmE2Y2YuLjAwMDAwMDAKLS0tIGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL0NsZWFyS2V5U3lzdGVtVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLm1lZGlhLmN0czsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5DYW1jb3JkZXJQcm9maWxlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb2RlY0luZm8uQ29kZWNDYXBhYmlsaXRpZXM7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvZGVjTGlzdDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRHJtOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFEcm1FeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUZvcm1hdDsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQmFzZTY0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VIb2xkZXI7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkFwaUxldmVsVXRpbDsKLQotaW1wb3J0IG9yZy5qc29uLkpTT05BcnJheTsKLWltcG9ydCBvcmcuanNvbi5KU09ORXhjZXB0aW9uOwotaW1wb3J0IG9yZy5qc29uLkpTT05PYmplY3Q7Ci0KLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVVVJRDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwotCi0vKioKLSAqIFRlc3RzIG9mIE1lZGlhUGxheWVyIHN0cmVhbWluZyBjYXBhYmlsaXRpZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGVhcktleVN5c3RlbVRlc3QgZXh0ZW5kcyBNZWRpYVBsYXllclRlc3RCYXNlIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gQ2xlYXJLZXlTeXN0ZW1UZXN0LmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKLQotICAgIC8vIEFkZCBhZGRpdGlvbmFsIGtleXMgaGVyZSBpZiB0aGUgY29udGVudCBoYXMgbW9yZSBrZXlzLgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBDTEVBUl9LRVlfQ0VOQyA9IHsKLSAgICAgICAgICAgIChieXRlKTB4M2YsIChieXRlKTB4MGEsIChieXRlKTB4MzMsIChieXRlKTB4ZjMsIChieXRlKTB4NDAsIChieXRlKTB4OTgsIChieXRlKTB4YjksIChieXRlKTB4ZTIsCi0gICAgICAgICAgICAoYnl0ZSkweDJiLCAoYnl0ZSkweGMwLCAoYnl0ZSkweDc4LCAoYnl0ZSkweGUwLCAoYnl0ZSkweGExLCAoYnl0ZSkweGI1LCAoYnl0ZSkweGU4LCAoYnl0ZSkweDU0IH07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gQ0xFQVJfS0VZX1dFQk0gPSAiX0NMRUFSX0tFWV9XRUJNXyIuZ2V0Qnl0ZXMoKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT05ORUNUSU9OX1JFVFJJRVMgPSAxMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0xFRVBfVElNRV9NUyA9IDEwMDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZJREVPX1dJRFRIX0NFTkMgPSAxMjgwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWSURFT19IRUlHSFRfQ0VOQyA9IDcyMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVklERU9fV0lEVEhfV0VCTSA9IDM1MjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVklERU9fSEVJR0hUX1dFQk0gPSAyODg7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZJREVPX1dJRFRIX01QRUcyVFMgPSAzMjA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZJREVPX0hFSUdIVF9NUEVHMlRTID0gMjQwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgUExBWV9USU1FX01TID0gVGltZVVuaXQuTUlMTElTRUNPTkRTLmNvbnZlcnQoMjUsIFRpbWVVbml0LlNFQ09ORFMpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNSU1FX1ZJREVPX0FWQyA9IE1lZGlhRm9ybWF0Lk1JTUVUWVBFX1ZJREVPX0FWQzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlNRV9WSURFT19WUDggPSBNZWRpYUZvcm1hdC5NSU1FVFlQRV9WSURFT19WUDg7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVcmkgQ0VOQ19BVURJT19VUkwgPSBVcmkucGFyc2UoCi0gICAgICAgICAgICAiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3d2bWVkaWEvY2xlYXIvaDI2NC9sbGFtYS9sbGFtYV9hYWNfYXVkaW8ubXA0Iik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVXJpIENFTkNfVklERU9fVVJMID0gVXJpLnBhcnNlKAotICAgICAgICAgICAgImh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS93dm1lZGlhL2NsZWFya2V5L2xsYW1hX2gyNjRfbWFpbl83MjBwXzgwMDAubXA0Iik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVXJpIFdFQk1fVVJMID0gVXJpLnBhcnNlKAotICAgICAgICAgICAgImFuZHJvaWQucmVzb3VyY2U6Ly9hbmRyb2lkLm1lZGlhLmN0cy8iICsgUi5yYXcudmlkZW9fMzIweDI0MF93ZWJtX3ZwOF84MDBrYnBzXzMwZnBzX3ZvcmJpc19zdGVyZW9fMTI4a2Jwc180NDEwMGh6X2NyeXB0KTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVcmkgTVBFRzJUU19TQ1JBTUJMRURfVVJMID0gVXJpLnBhcnNlKAotICAgICAgICAgICAgImFuZHJvaWQucmVzb3VyY2U6Ly9hbmRyb2lkLm1lZGlhLmN0cy8iICsgUi5yYXcuc2VnbWVudDAwMDAwMV9zY3JhbWJsZWQpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVyaSBNUEVHMlRTX0NMRUFSX1VSTCA9IFVyaS5wYXJzZSgKLSAgICAgICAgICAgICJhbmRyb2lkLnJlc291cmNlOi8vYW5kcm9pZC5tZWRpYS5jdHMvIiArIFIucmF3LnNlZ21lbnQwMDAwMDEpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVVJRCBDT01NT05fUFNTSF9TQ0hFTUVfVVVJRCA9Ci0gICAgICAgICAgICBuZXcgVVVJRCgweDEwNzdlZmVjYzBiMjRkMDJMLCAweGFjZTMzYzFlNTJlMmZiNGJMKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVVUlEIENMRUFSS0VZX1NDSEVNRV9VVUlEID0KLSAgICAgICAgICAgIG5ldyBVVUlEKDB4ZTI3MTlkNThhOTg1YjNjOUwsIDB4NzgxYWIwMzBhZjc4ZDMwZUwpOwotCi0gICAgcHJpdmF0ZSBieXRlW10gbURybUluaXREYXRhOwotICAgIHByaXZhdGUgYnl0ZVtdIG1TZXNzaW9uSWQ7Ci0gICAgcHJpdmF0ZSBMb29wZXIgbUxvb3BlcjsKLSAgICBwcml2YXRlIE1lZGlhQ29kZWNDbGVhcktleVBsYXllciBtTWVkaWFDb2RlY1BsYXllcjsKLSAgICBwcml2YXRlIE1lZGlhRHJtIG1Ecm0gPSBudWxsOwotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOwotICAgIHByaXZhdGUgU3VyZmFjZUhvbGRlciBtU3VyZmFjZUhvbGRlcjsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIGlmIChmYWxzZSA9PSBkZXZpY2VIYXNNZWRpYURybSgpKSB7Ci0gICAgICAgICAgICB0ZWFyRG93bigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNXYXRjaERldmljZSgpIHsKLSAgICAgICAgcmV0dXJuIG1Db250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCkuaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX1dBVENIKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gZGV2aWNlSGFzTWVkaWFEcm0oKSB7Ci0gICAgICAgIC8vIENsZWFyS2V5IGlzIGludHJvZHVjZWQgYWZ0ZXIgS2l0S2F0LgotICAgICAgICBpZiAoQXBpTGV2ZWxVdGlsLmlzQXRNb3N0KGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTl9DT0RFUy5LSVRLQVQpKSB7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICJUaGlzIHRlc3QgaXMgZGVzaWduZWQgdG8gd29yayBhZnRlciBBbmRyb2lkIEtpdEthdC4iKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFeHRyYWN0cyBrZXkgaWRzIGZyb20gdGhlIHBzc2ggYmxvYiByZXR1cm5lZCBieSBnZXRLZXlSZXF1ZXN0KCkgYW5kCi0gICAgICogcGxhY2VzIGl0IGluIGtleUlkcy4KLSAgICAgKiBrZXlSZXF1ZXN0QmxvYiBmb3JtYXQgKHNlY3Rpb24gNS4xLjMuMSk6Ci0gICAgICogaHR0cHM6Ly9kdmNzLnczLm9yZy9oZy9odG1sLW1lZGlhL3Jhdy1maWxlL2RlZmF1bHQvZW5jcnlwdGVkLW1lZGlhL2VuY3J5cHRlZC1tZWRpYS5odG1sI2NsZWFyLWtleQotICAgICAqCi0gICAgICogQHJldHVybiBzaXplIG9mIGtleUlkcyB2ZWN0b3IgdGhhdCBjb250YWlucyB0aGUga2V5IGlkcywgMCBmb3IgZXJyb3IKLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBnZXRLZXlJZHMoYnl0ZVtdIGtleVJlcXVlc3RCbG9iLCBWZWN0b3I8U3RyaW5nPiBrZXlJZHMpIHsKLSAgICAgICAgaWYgKDAgPT0ga2V5UmVxdWVzdEJsb2IubGVuZ3RoIHx8IGtleUlkcyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgU3RyaW5nIGpzb25MaWNlbnNlUmVxdWVzdCA9IG5ldyBTdHJpbmcoa2V5UmVxdWVzdEJsb2IpOwotICAgICAgICBrZXlJZHMuY2xlYXIoKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgSlNPTk9iamVjdCBsaWNlbnNlID0gbmV3IEpTT05PYmplY3QoanNvbkxpY2Vuc2VSZXF1ZXN0KTsKLSAgICAgICAgICAgIGZpbmFsIEpTT05BcnJheSBpZHMgPSBsaWNlbnNlLmdldEpTT05BcnJheSgia2lkcyIpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoKCk7ICsraSkgewotICAgICAgICAgICAgICAgIGtleUlkcy5hZGQoaWRzLmdldFN0cmluZyhpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEpTT05FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiSW52YWxpZCBKU09OIGxpY2Vuc2UgPSAiICsganNvbkxpY2Vuc2VSZXF1ZXN0KTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBrZXlJZHMuc2l6ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIEpTT04gV2ViIEtleSBzdHJpbmcuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEpTT04gV2ViIEtleSBzdHJpbmcuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlSnNvbldlYktleVNldChWZWN0b3I8U3RyaW5nPiBrZXlJZHMsIFZlY3RvcjxTdHJpbmc+IGtleXMpIHsKLSAgICAgICAgU3RyaW5nIGp3a1NldCA9ICJ7XCJrZXlzXCI6WyI7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2V5SWRzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgaWQgPSBuZXcgU3RyaW5nKGtleUlkcy5nZXQoaSkuZ2V0Qnl0ZXMoQ2hhcnNldC5mb3JOYW1lKCJVVEYtOCIpKSk7Ci0gICAgICAgICAgICBTdHJpbmcga2V5ID0gbmV3IFN0cmluZyhrZXlzLmdldChpKS5nZXRCeXRlcyhDaGFyc2V0LmZvck5hbWUoIlVURi04IikpKTsKLQotICAgICAgICAgICAgandrU2V0ICs9ICJ7XCJrdHlcIjpcIm9jdFwiLFwia2lkXCI6XCIiICsgaWQgKwotICAgICAgICAgICAgICAgICAgICAiXCIsXCJrXCI6XCIiICsga2V5ICsgIlwifSI7Ci0gICAgICAgIH0KLSAgICAgICAgandrU2V0ICs9ICJdfSI7Ci0gICAgICAgIHJldHVybiBqd2tTZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmVzIGNsZWFyIGtleSBpZHMgZnJvbSBnZXRLZXlSZXF1ZXN0KCksIGNyZWF0ZSBKU09OIFdlYiBLZXkKLSAgICAgKiBzZXQgYW5kIHNlbmQgaXQgdG8gdGhlIENETSB2aWEgcHJvdmlkZUtleVJlc3BvbnNlKCkuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGdldEtleXMoTWVkaWFEcm0gZHJtLCBTdHJpbmcgaW5pdERhdGFUeXBlLAotICAgICAgICAgICAgYnl0ZVtdIHNlc3Npb25JZCwgYnl0ZVtdIGRybUluaXREYXRhLCBieXRlW11bXSBjbGVhcktleXMpIHsKLSAgICAgICAgTWVkaWFEcm0uS2V5UmVxdWVzdCBkcm1SZXF1ZXN0ID0gbnVsbDs7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBkcm1SZXF1ZXN0ID0gZHJtLmdldEtleVJlcXVlc3Qoc2Vzc2lvbklkLCBkcm1Jbml0RGF0YSwgaW5pdERhdGFUeXBlLAotICAgICAgICAgICAgICAgICAgICBNZWRpYURybS5LRVlfVFlQRV9TVFJFQU1JTkcsIG51bGwpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIkZhaWxlZCB0byBnZXQga2V5IHJlcXVlc3Q6ICIgKyBlLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkcm1SZXF1ZXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCBnZXRLZXlSZXF1ZXN0Iik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBWZWN0b3I8U3RyaW5nPiBrZXlJZHMgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLSAgICAgICAgaWYgKDAgPT0gZ2V0S2V5SWRzKGRybVJlcXVlc3QuZ2V0RGF0YSgpLCBrZXlJZHMpKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJObyBrZXkgaWRzIGZvdW5kIGluIGluaXREYXRhIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY2xlYXJLZXlzLmxlbmd0aCAhPSBrZXlJZHMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJNaXNtYXRjaCBudW1iZXIgb2Yga2V5IGlkcyBhbmQga2V5czogaWRzPSIgKwotICAgICAgICAgICAgICAgICAgICBrZXlJZHMuc2l6ZSgpICsgIiwga2V5cz0iICsgY2xlYXJLZXlzLmxlbmd0aCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBCYXNlNjQgZW5jb2RlcyBjbGVhcmtleXMuIEtleXMgYXJlIGtub3duIHRvIHRoZSBhcHBsaWNhdGlvbi4KLSAgICAgICAgVmVjdG9yPFN0cmluZz4ga2V5cyA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsZWFyS2V5cy5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgU3RyaW5nIGNsZWFyS2V5ID0gQmFzZTY0LmVuY29kZVRvU3RyaW5nKGNsZWFyS2V5c1tpXSwKLSAgICAgICAgICAgICAgICAgICAgQmFzZTY0Lk5PX1BBRERJTkcgfCBCYXNlNjQuTk9fV1JBUCk7Ci0gICAgICAgICAgICBrZXlzLmFkZChjbGVhcktleSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgandrU2V0ID0gY3JlYXRlSnNvbldlYktleVNldChrZXlJZHMsIGtleXMpOwotICAgICAgICBieXRlW10ganNvblJlc3BvbnNlID0gandrU2V0LmdldEJ5dGVzKENoYXJzZXQuZm9yTmFtZSgiVVRGLTgiKSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZHJtLnByb3ZpZGVLZXlSZXNwb25zZShzZXNzaW9uSWQsIGpzb25SZXNwb25zZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byBwcm92aWRlIGtleSByZXNwb25zZTogIiArIGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIHByb3ZpZGUga2V5IHJlc3BvbnNlOiAiICsgZS50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgQE5vbk51bGwgTWVkaWFEcm0gc3RhcnREcm0oZmluYWwgYnl0ZVtdW10gY2xlYXJLZXlzLCBmaW5hbCBTdHJpbmcgaW5pdERhdGFUeXBlLCBmaW5hbCBVVUlEIGRybVNjaGVtZVV1aWQpIHsKLSAgICAgICAgaWYgKCFNZWRpYURybS5pc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChkcm1TY2hlbWVVdWlkKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJDcnlwdG8gc2NoZW1lIGlzIG5vdCBzdXBwb3J0ZWQuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBuZXcgVGhyZWFkKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Ecm0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgdG8gc3RhcnREcm06IGFscmVhZHkgc3RhcnRlZCIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIFNldCB1cCBhIGxvb3BlciB0byBoYW5kbGUgZXZlbnRzCi0gICAgICAgICAgICAgICAgTG9vcGVyLnByZXBhcmUoKTsKLQotICAgICAgICAgICAgICAgIC8vIFNhdmUgdGhlIGxvb3BlciBzbyB0aGF0IHdlIGNhbiB0ZXJtaW5hdGUgdGhpcyB0aHJlYWQKLSAgICAgICAgICAgICAgICAvLyBhZnRlciB3ZSBhcmUgZG9uZSB3aXRoIGl0LgotICAgICAgICAgICAgICAgIG1Mb29wZXIgPSBMb29wZXIubXlMb29wZXIoKTsKLQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Ecm0gPSBuZXcgTWVkaWFEcm0oZHJtU2NoZW1lVXVpZCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoTWVkaWFEcm1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgdG8gY3JlYXRlIE1lZGlhRHJtOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkKG1Mb2NrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Ecm0uc2V0T25FdmVudExpc3RlbmVyKG5ldyBNZWRpYURybS5PbkV2ZW50TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25FdmVudChNZWRpYURybSBtZCwgYnl0ZVtdIHNlc3Npb25JZCwgaW50IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4dHJhLCBieXRlW10gZGF0YSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQgPT0gTWVkaWFEcm0uRVZFTlRfS0VZX1JFUVVJUkVEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJNZWRpYURybSBldmVudDogS2V5IHJlcXVpcmVkIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRLZXlzKG1Ecm0sIGluaXREYXRhVHlwZSwgbVNlc3Npb25JZCwgbURybUluaXREYXRhLCBjbGVhcktleXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50ID09IE1lZGlhRHJtLkVWRU5UX0tFWV9FWFBJUkVEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJNZWRpYURybSBldmVudDogS2V5IGV4cGlyZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEtleXMobURybSwgaW5pdERhdGFUeXBlLCBtU2Vzc2lvbklkLCBtRHJtSW5pdERhdGEsIGNsZWFyS2V5cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJFdmVudHMgbm90IHN1cHBvcnRlZCIgKyBldmVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICAgICAgbUxvY2subm90aWZ5KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIExvb3Blci5sb29wKCk7ICAvLyBCbG9ja3MgZm9yZXZlciB1bnRpbCBMb29wZXIucXVpdCgpIGlzIGNhbGxlZC4KLSAgICAgICAgICAgIH0KLSAgICAgICAgfS5zdGFydCgpOwotCi0gICAgICAgIC8vIHdhaXQgZm9yIG1Ecm0gdG8gYmUgY3JlYXRlZAotICAgICAgICBzeW5jaHJvbml6ZWQobUxvY2spIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbUxvY2sud2FpdCgxMDAwKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1Ecm07Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHN0b3BEcm0oTWVkaWFEcm0gZHJtKSB7Ci0gICAgICAgIGlmIChkcm0gIT0gbURybSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiaW52YWxpZCBkcm0gc3BlY2lmaWVkIGluIHN0b3BEcm0iKTsKLSAgICAgICAgfQotICAgICAgICBtTG9vcGVyLnF1aXQoKTsKLSAgICAgICAgbURybS5yZWxlYXNlKCk7Ci0gICAgICAgIG1Ecm0gPSBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgQE5vbk51bGwgYnl0ZVtdIG9wZW5TZXNzaW9uKE1lZGlhRHJtIGRybSkgewotICAgICAgICBieXRlW10gbVNlc3Npb25JZCA9IG51bGw7Ci0gICAgICAgIGJvb2xlYW4gbVJldHJ5T3BlbjsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtUmV0cnlPcGVuID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgbVNlc3Npb25JZCA9IGRybS5vcGVuU2Vzc2lvbigpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBtUmV0cnlPcGVuID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSB3aGlsZSAobVJldHJ5T3Blbik7Ci0gICAgICAgIHJldHVybiBtU2Vzc2lvbklkOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjbG9zZVNlc3Npb24oTWVkaWFEcm0gZHJtLCBieXRlW10gc2Vzc2lvbklkKSB7Ci0gICAgICAgIGRybS5jbG9zZVNlc3Npb24oc2Vzc2lvbklkKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNSZXNvbHV0aW9uU3VwcG9ydGVkKFN0cmluZyBtaW1lLCBTdHJpbmdbXSBmZWF0dXJlcywKLSAgICAgICAgICAgIGludCB2aWRlb1dpZHRoLCBpbnQgdmlkZW9IZWlnaHQpIHsKLSAgICAgICAgaWYgKEFwaUxldmVsVXRpbC5pc0JlZm9yZShhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT05fQ09ERVMuSkVMTFlfQkVBTikpIHsKLSAgICAgICAgICAgIGlmICAodmlkZW9IZWlnaHQgPD0gMTQ0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENhbWNvcmRlclByb2ZpbGUuaGFzUHJvZmlsZShDYW1jb3JkZXJQcm9maWxlLlFVQUxJVFlfUUNJRik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHZpZGVvSGVpZ2h0IDw9IDI0MCkgewotICAgICAgICAgICAgICAgIHJldHVybiBDYW1jb3JkZXJQcm9maWxlLmhhc1Byb2ZpbGUoQ2FtY29yZGVyUHJvZmlsZS5RVUFMSVRZX1FWR0EpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh2aWRlb0hlaWdodCA8PSAyODgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQ2FtY29yZGVyUHJvZmlsZS5oYXNQcm9maWxlKENhbWNvcmRlclByb2ZpbGUuUVVBTElUWV9DSUYpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh2aWRlb0hlaWdodCA8PSA0ODApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQ2FtY29yZGVyUHJvZmlsZS5oYXNQcm9maWxlKENhbWNvcmRlclByb2ZpbGUuUVVBTElUWV80ODBQKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodmlkZW9IZWlnaHQgPD0gNzIwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENhbWNvcmRlclByb2ZpbGUuaGFzUHJvZmlsZShDYW1jb3JkZXJQcm9maWxlLlFVQUxJVFlfNzIwUCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHZpZGVvSGVpZ2h0IDw9IDEwODApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQ2FtY29yZGVyUHJvZmlsZS5oYXNQcm9maWxlKENhbWNvcmRlclByb2ZpbGUuUVVBTElUWV8xMDgwUCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIE1lZGlhRm9ybWF0IGZvcm1hdCA9IE1lZGlhRm9ybWF0LmNyZWF0ZVZpZGVvRm9ybWF0KG1pbWUsIHZpZGVvV2lkdGgsIHZpZGVvSGVpZ2h0KTsKLSAgICAgICAgZm9yIChTdHJpbmcgZmVhdHVyZTogZmVhdHVyZXMpIHsKLSAgICAgICAgICAgIGZvcm1hdC5zZXRGZWF0dXJlRW5hYmxlZChmZWF0dXJlLCB0cnVlKTsKLSAgICAgICAgfQotICAgICAgICBNZWRpYUNvZGVjTGlzdCBtY2wgPSBuZXcgTWVkaWFDb2RlY0xpc3QoTWVkaWFDb2RlY0xpc3QuQUxMX0NPREVDUyk7Ci0gICAgICAgIGlmIChtY2wuZmluZERlY29kZXJGb3JGb3JtYXQoZm9ybWF0KSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICJjb3VsZCBub3QgZmluZCBjb2RlYyBmb3IgIiArIGZvcm1hdCk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgY2xlYXIga2V5IHN5c3RlbSBwbGF5YmFjay4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdGVzdENsZWFyS2V5UGxheWJhY2soCi0gICAgICAgICAgICBVVUlEIGRybVNjaGVtZVV1aWQsCi0gICAgICAgICAgICBTdHJpbmcgdmlkZW9NaW1lLCBTdHJpbmdbXSB2aWRlb0ZlYXR1cmVzLAotICAgICAgICAgICAgU3RyaW5nIGluaXREYXRhVHlwZSwgYnl0ZVtdW10gY2xlYXJLZXlzLAotICAgICAgICAgICAgVXJpIGF1ZGlvVXJsLCBib29sZWFuIGF1ZGlvRW5jcnlwdGVkLAotICAgICAgICAgICAgVXJpIHZpZGVvVXJsLCBib29sZWFuIHZpZGVvRW5jcnlwdGVkLAotICAgICAgICAgICAgaW50IHZpZGVvV2lkdGgsIGludCB2aWRlb0hlaWdodCwgYm9vbGVhbiBzY3JhbWJsZWQpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIGlmIChpc1dhdGNoRGV2aWNlKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIE1lZGlhRHJtIGRybSA9IG51bGw7Ci0gICAgICAgIG1TZXNzaW9uSWQgPSBudWxsOwotICAgICAgICBpZiAoIXNjcmFtYmxlZCkgewotICAgICAgICAgICAgZHJtID0gc3RhcnREcm0oY2xlYXJLZXlzLCBpbml0RGF0YVR5cGUsIGRybVNjaGVtZVV1aWQpOwotICAgICAgICAgICAgbVNlc3Npb25JZCA9IG9wZW5TZXNzaW9uKGRybSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWlzUmVzb2x1dGlvblN1cHBvcnRlZCh2aWRlb01pbWUsIHZpZGVvRmVhdHVyZXMsIHZpZGVvV2lkdGgsIHZpZGVvSGVpZ2h0KSkgewotICAgICAgICAgICAgTG9nLmkoVEFHLCAiRGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgIiArCi0gICAgICAgICAgICAgICAgICAgIHZpZGVvV2lkdGggKyAieCIgKyB2aWRlb0hlaWdodCArICIgcmVzb2x1dGlvbiBmb3IgIiArIHZpZGVvTWltZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBJQ29ubmVjdGlvblN0YXR1cyBjb25uZWN0aW9uU3RhdHVzID0gbmV3IENvbm5lY3Rpb25TdGF0dXMobUNvbnRleHQpOwotICAgICAgICBpZiAoIWNvbm5lY3Rpb25TdGF0dXMuaXNBdmFpbGFibGUoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJOZXR3b3JrIGlzIG5vdCBhdmFpbGFibGUsIHJlYXNvbjogIiArCi0gICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25TdGF0dXMuZ2V0Tm90Q29ubmVjdGVkUmVhc29uKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgZGV2aWNlIGlzIG5vdCBvbmxpbmUsIHJlY2hlY2sgdGhlIHN0YXR1cyBhIGZldyB0aW1lcy4KLSAgICAgICAgaW50IHJldHJpZXMgPSAwOwotICAgICAgICB3aGlsZSAoIWNvbm5lY3Rpb25TdGF0dXMuaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgaWYgKHJldHJpZXMrKyA+PSBDT05ORUNUSU9OX1JFVFJJRVMpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkRldmljZSBpcyBub3Qgb25saW5lLCByZWFzb246ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvblN0YXR1cy5nZXROb3RDb25uZWN0ZWRSZWFzb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDApOwotICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbm5lY3Rpb25TdGF0dXMudGVzdENvbm5lY3Rpb24odmlkZW9VcmwpOwotCi0gICAgICAgIG1NZWRpYUNvZGVjUGxheWVyID0gbmV3IE1lZGlhQ29kZWNDbGVhcktleVBsYXllcigKLSAgICAgICAgICAgICAgICBnZXRBY3Rpdml0eSgpLmdldFN1cmZhY2VIb2xkZXIoKSwKLSAgICAgICAgICAgICAgICBtU2Vzc2lvbklkLCBzY3JhbWJsZWQsCi0gICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkpOwotCi0gICAgICAgIG1NZWRpYUNvZGVjUGxheWVyLnNldEF1ZGlvRGF0YVNvdXJjZShhdWRpb1VybCwgbnVsbCwgYXVkaW9FbmNyeXB0ZWQpOwotICAgICAgICBtTWVkaWFDb2RlY1BsYXllci5zZXRWaWRlb0RhdGFTb3VyY2UodmlkZW9VcmwsIG51bGwsIHZpZGVvRW5jcnlwdGVkKTsKLSAgICAgICAgbU1lZGlhQ29kZWNQbGF5ZXIuc3RhcnQoKTsKLSAgICAgICAgbU1lZGlhQ29kZWNQbGF5ZXIucHJlcGFyZSgpOwotICAgICAgICBpZiAoIXNjcmFtYmxlZCkgewotICAgICAgICAgICAgbURybUluaXREYXRhID0gbU1lZGlhQ29kZWNQbGF5ZXIuZ2V0RHJtSW5pdERhdGEoKTsKLSAgICAgICAgICAgIGdldEtleXMobURybSwgaW5pdERhdGFUeXBlLCBtU2Vzc2lvbklkLCBtRHJtSW5pdERhdGEsIGNsZWFyS2V5cyk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gc3RhcnRzIHZpZGVvIHBsYXliYWNrCi0gICAgICAgIG1NZWRpYUNvZGVjUGxheWVyLnN0YXJ0VGhyZWFkKCk7Ci0KLSAgICAgICAgbG9uZyB0aW1lT3V0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyBQTEFZX1RJTUVfTVM7Ci0gICAgICAgIHdoaWxlICh0aW1lT3V0ID4gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgJiYgIW1NZWRpYUNvZGVjUGxheWVyLmlzRW5kZWQoKSkgewotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNMRUVQX1RJTUVfTVMpOwotICAgICAgICAgICAgaWYgKG1NZWRpYUNvZGVjUGxheWVyLmdldEN1cnJlbnRQb3NpdGlvbigpID49IG1NZWRpYUNvZGVjUGxheWVyLmdldER1cmF0aW9uKCkgKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiY3VycmVudCBwb3MgPSAiICsgbU1lZGlhQ29kZWNQbGF5ZXIuZ2V0Q3VycmVudFBvc2l0aW9uKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgIj49IGR1cmF0aW9uID0gIiArIG1NZWRpYUNvZGVjUGxheWVyLmdldER1cmF0aW9uKCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgTG9nLmQoVEFHLCAicGxheVZpZGVvIHBsYXllci5yZXNldCgpIik7Ci0gICAgICAgIG1NZWRpYUNvZGVjUGxheWVyLnJlc2V0KCk7Ci0gICAgICAgIGlmICghc2NyYW1ibGVkKSB7Ci0gICAgICAgICAgICBjbG9zZVNlc3Npb24oZHJtLCBtU2Vzc2lvbklkKTsKLSAgICAgICAgICAgIHN0b3BEcm0oZHJtKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBxdWVyeUtleVN0YXR1cyhATm9uTnVsbCBmaW5hbCBNZWRpYURybSBkcm0sIEBOb25OdWxsIGZpbmFsIGJ5dGVbXSBzZXNzaW9uSWQpIHsKLSAgICAgICAgZmluYWwgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4ga2V5U3RhdHVzID0gZHJtLnF1ZXJ5S2V5U3RhdHVzKHNlc3Npb25JZCk7Ci0gICAgICAgIGlmIChrZXlTdGF0dXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJxdWVyeUtleVN0YXR1czogZW1wdHkga2V5IHN0YXR1cyIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgU2V0PFN0cmluZz4ga2V5U2V0ID0ga2V5U3RhdHVzLmtleVNldCgpOwotICAgICAgICBmaW5hbCBpbnQgbnVtS2V5cyA9IGtleVNldC5zaXplKCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZ1tdIGtleXMgPSBrZXlTZXQudG9BcnJheShuZXcgU3RyaW5nW251bUtleXNdKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1LZXlzOyArK2kpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBrZXkgPSBrZXlzW2ldOwotICAgICAgICAgICAgTG9nLmkoVEFHLCAicXVlcnlLZXlTdGF0dXM6IGtleT0iICsga2V5ICsgIiwgdmFsdWU9IiArIGtleVN0YXR1cy5nZXQoa2V5KSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UXVlcnlLZXlTdGF0dXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGlzV2F0Y2hEZXZpY2UoKSkgewotICAgICAgICAgICAgLy8gc2tpcCB0aGlzIHRlc3Qgb24gd2F0Y2ggYmVjYXVzZSBpdCBjYWxscwotICAgICAgICAgICAgLy8gYWRkVHJhY2sgdGhhdCByZXF1aXJlcyBjb2RlYwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgTWVkaWFEcm0gZHJtID0gc3RhcnREcm0obmV3IGJ5dGVbXVtdIHsgQ0xFQVJfS0VZX0NFTkMgfSwgImNlbmMiLAotICAgICAgICAgICAgICAgIENMRUFSS0VZX1NDSEVNRV9VVUlEKTsKLQotICAgICAgICBtU2Vzc2lvbklkID0gb3BlblNlc3Npb24oZHJtKTsKLQotICAgICAgICAvLyBUZXN0IGRlZmF1bHQga2V5IHN0YXR1cywgc2hvdWxkIG5vdCBiZSBkZWZpbmVkCi0gICAgICAgIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGtleVN0YXR1cyA9IGRybS5xdWVyeUtleVN0YXR1cyhtU2Vzc2lvbklkKTsKLSAgICAgICAgaWYgKCFrZXlTdGF0dXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBjbG9zZVNlc3Npb24oZHJtLCBtU2Vzc2lvbklkKTsKLSAgICAgICAgICAgIHN0b3BEcm0oZHJtKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigicXVlcnkgZGVmYXVsdCBrZXkgc3RhdHVzIGZhaWxlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGVzdCB2YWxpZCBrZXkgc3RhdHVzCi0gICAgICAgIG1NZWRpYUNvZGVjUGxheWVyID0gbmV3IE1lZGlhQ29kZWNDbGVhcktleVBsYXllcigKLSAgICAgICAgICAgICAgICBnZXRBY3Rpdml0eSgpLmdldFN1cmZhY2VIb2xkZXIoKSwKLSAgICAgICAgICAgICAgICBtU2Vzc2lvbklkLCBmYWxzZSwKLSAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKSk7Ci0gICAgICAgIG1NZWRpYUNvZGVjUGxheWVyLnNldEF1ZGlvRGF0YVNvdXJjZShDRU5DX0FVRElPX1VSTCwgbnVsbCwgZmFsc2UpOwotICAgICAgICBtTWVkaWFDb2RlY1BsYXllci5zZXRWaWRlb0RhdGFTb3VyY2UoQ0VOQ19WSURFT19VUkwsIG51bGwsIHRydWUpOwotICAgICAgICBtTWVkaWFDb2RlY1BsYXllci5zdGFydCgpOwotICAgICAgICBtTWVkaWFDb2RlY1BsYXllci5wcmVwYXJlKCk7Ci0KLSAgICAgICAgbURybUluaXREYXRhID0gbU1lZGlhQ29kZWNQbGF5ZXIuZ2V0RHJtSW5pdERhdGEoKTsKLSAgICAgICAgZ2V0S2V5cyhkcm0sICJjZW5jIiwgbVNlc3Npb25JZCwgbURybUluaXREYXRhLCBuZXcgYnl0ZVtdW10geyBDTEVBUl9LRVlfQ0VOQyB9KTsKLSAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gdHJ1ZTsKLSAgICAgICAgaWYgKCFxdWVyeUtleVN0YXR1cyhkcm0sIG1TZXNzaW9uSWQpKSB7Ci0gICAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBtTWVkaWFDb2RlY1BsYXllci5yZXNldCgpOwotICAgICAgICBjbG9zZVNlc3Npb24oZHJtLCBtU2Vzc2lvbklkKTsKLSAgICAgICAgc3RvcERybShkcm0pOwotICAgICAgICBpZiAoIXN1Y2Nlc3MpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigicXVlcnkga2V5IHN0YXR1cyBmYWlsZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDbGVhcktleVBsYXliYWNrQ2VuYygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0Q2xlYXJLZXlQbGF5YmFjaygKLSAgICAgICAgICAgIENPTU1PTl9QU1NIX1NDSEVNRV9VVUlELAotICAgICAgICAgICAgLy8gdXNpbmcgc2VjdXJlIGNvZGVjIGV2ZW4gdGhvdWdoIGl0IGlzIGNsZWFyIGtleSBEUk0KLSAgICAgICAgICAgIE1JTUVfVklERU9fQVZDLCBuZXcgU3RyaW5nW10geyBDb2RlY0NhcGFiaWxpdGllcy5GRUFUVVJFX1NlY3VyZVBsYXliYWNrIH0sCi0gICAgICAgICAgICAiY2VuYyIsIG5ldyBieXRlW11bXSB7IENMRUFSX0tFWV9DRU5DIH0sCi0gICAgICAgICAgICBDRU5DX0FVRElPX1VSTCwgZmFsc2UsCi0gICAgICAgICAgICBDRU5DX1ZJREVPX1VSTCwgdHJ1ZSwKLSAgICAgICAgICAgIFZJREVPX1dJRFRIX0NFTkMsIFZJREVPX0hFSUdIVF9DRU5DLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENsZWFyS2V5UGxheWJhY2tDZW5jMigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0Q2xlYXJLZXlQbGF5YmFjaygKLSAgICAgICAgICAgIENMRUFSS0VZX1NDSEVNRV9VVUlELAotICAgICAgICAgICAgLy8gdXNpbmcgc2VjdXJlIGNvZGVjIGV2ZW4gdGhvdWdoIGl0IGlzIGNsZWFyIGtleSBEUk0KLSAgICAgICAgICAgIE1JTUVfVklERU9fQVZDLCBuZXcgU3RyaW5nW10geyBDb2RlY0NhcGFiaWxpdGllcy5GRUFUVVJFX1NlY3VyZVBsYXliYWNrIH0sCi0gICAgICAgICAgICAiY2VuYyIsIG5ldyBieXRlW11bXSB7IENMRUFSX0tFWV9DRU5DIH0sCi0gICAgICAgICAgICBDRU5DX0FVRElPX1VSTCwgZmFsc2UsCi0gICAgICAgICAgICBDRU5DX1ZJREVPX1VSTCwgdHJ1ZSwKLSAgICAgICAgICAgIFZJREVPX1dJRFRIX0NFTkMsIFZJREVPX0hFSUdIVF9DRU5DLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENsZWFyS2V5UGxheWJhY2tXZWJtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RDbGVhcktleVBsYXliYWNrKAotICAgICAgICAgICAgQ0xFQVJLRVlfU0NIRU1FX1VVSUQsCi0gICAgICAgICAgICBNSU1FX1ZJREVPX1ZQOCwgbmV3IFN0cmluZ1swXSwKLSAgICAgICAgICAgICJ3ZWJtIiwgbmV3IGJ5dGVbXVtdIHsgQ0xFQVJfS0VZX1dFQk0gfSwKLSAgICAgICAgICAgIFdFQk1fVVJMLCB0cnVlLAotICAgICAgICAgICAgV0VCTV9VUkwsIHRydWUsCi0gICAgICAgICAgICBWSURFT19XSURUSF9XRUJNLCBWSURFT19IRUlHSFRfV0VCTSwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDbGVhcktleVBsYXliYWNrTXBlZzJ0cygpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAoaXNMb3dSYW0oKSAmJiAhaXNUVigpKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJTa2lwcGluZyB0ZXN0Q2xlYXJLZXlQbGF5YmFja01wZWcydHMuIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICB0ZXN0Q2xlYXJLZXlQbGF5YmFjaygKLSAgICAgICAgICAgIENMRUFSS0VZX1NDSEVNRV9VVUlELAotICAgICAgICAgICAgTUlNRV9WSURFT19BVkMsIG5ldyBTdHJpbmdbMF0sCi0gICAgICAgICAgICAibXBlZzJ0cyIsIG51bGwsCi0gICAgICAgICAgICBNUEVHMlRTX1NDUkFNQkxFRF9VUkwsIGZhbHNlLAotICAgICAgICAgICAgTVBFRzJUU19TQ1JBTUJMRURfVVJMLCBmYWxzZSwKLSAgICAgICAgICAgIFZJREVPX1dJRFRIX01QRUcyVFMsIFZJREVPX0hFSUdIVF9NUEVHMlRTLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGxheWJhY2tNcGVnMnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RDbGVhcktleVBsYXliYWNrKAotICAgICAgICAgICAgQ0xFQVJLRVlfU0NIRU1FX1VVSUQsCi0gICAgICAgICAgICBNSU1FX1ZJREVPX0FWQywgbmV3IFN0cmluZ1swXSwKLSAgICAgICAgICAgICJtcGVnMnRzIiwgbnVsbCwKLSAgICAgICAgICAgIE1QRUcyVFNfQ0xFQVJfVVJMLCBmYWxzZSwKLSAgICAgICAgICAgIE1QRUcyVFNfQ0xFQVJfVVJMLCBmYWxzZSwKLSAgICAgICAgICAgIFZJREVPX1dJRFRIX01QRUcyVFMsIFZJREVPX0hFSUdIVF9NUEVHMlRTLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzVFYoKSB7Ci0gICAgICAgIHJldHVybiBtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9MRUFOQkFDS19PTkxZKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNMb3dSYW0oKSB7Ci0gICAgICAgIEFjdGl2aXR5TWFuYWdlciBhbSA9IChBY3Rpdml0eU1hbmFnZXIpIG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BQ1RJVklUWV9TRVJWSUNFKTsKLSAgICAgICAgcmV0dXJuIGFtLmlzTG93UmFtRGV2aWNlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL0NvZGVjVXRpbHMuamF2YSBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9Db2RlY1V0aWxzLmphdmEKaW5kZXggMjRjMTE3NC4uYWU3ODViMiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL0NvZGVjVXRpbHMuamF2YQorKysgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvQ29kZWNVdGlscy5qYXZhCkBAIC0zOCw3ICszOCw3IEBACiAgICAgLyoqIExvYWQgam5pIG9uIGluaXRpYWxpemF0aW9uICovCiAgICAgc3RhdGljIHsKICAgICAgICAgTG9nLmkoVEFHLCAiYmVmb3JlIGxvYWRsaWJyYXJ5Iik7Ci0gICAgICAgIFN5c3RlbS5sb2FkTGlicmFyeSgiY3RzbWVkaWFjb2RlY19qbmkiKTsKKyAgICAgICAgU3lzdGVtLmxvYWRMaWJyYXJ5KCJjdHNjb2RlY3V0aWxzX2puaSIpOwogICAgICAgICBMb2cuaShUQUcsICJhZnRlciBsb2FkbGlicmFyeSIpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL0RlY29kZUFjY3VyYWN5VGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL0RlY29kZUFjY3VyYWN5VGVzdC5qYXZhCmluZGV4IDcwNDIyMTMuLjJhMDU2ZTQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9EZWNvZGVBY2N1cmFjeVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvRGVjb2RlQWNjdXJhY3lUZXN0LmphdmEKQEAgLTI1LDYgKzI1LDcgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRm9ybWF0OworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogCkBAIC00OCw2ICs0OSw3IEBACiAKIEBUYXJnZXRBcGkoMjQpCiBAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorQEFwcE1vZGVGdWxsKHJlYXNvbiA9ICJUaGVyZSBzaG91bGQgYmUgbm8gaW5zdGFudCBhcHBzIHNwZWNpZmljIGJlaGF2aW9yIHJlbGF0ZWQgdG8gYWNjdXJhY3kiKQogcHVibGljIGNsYXNzIERlY29kZUFjY3VyYWN5VGVzdCBleHRlbmRzIERlY29kZUFjY3VyYWN5VGVzdEJhc2UgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IERlY29kZUFjY3VyYWN5VGVzdC5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvRGVjb2RlQWNjdXJhY3lUZXN0QmFzZS5qYXZhIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL0RlY29kZUFjY3VyYWN5VGVzdEJhc2UuamF2YQppbmRleCA3MmVkZGYxLi43ZTUzMTcwIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvRGVjb2RlQWNjdXJhY3lUZXN0QmFzZS5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9EZWNvZGVBY2N1cmFjeVRlc3RCYXNlLmphdmEKQEAgLTE1LDE1ICsxNSwxMCBAQAogICovCiBwYWNrYWdlIGFuZHJvaWQubWVkaWEuY3RzOwogCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS5jdHMuUjsKLQogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkFwaUxldmVsVXRpbDsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLk1lZGlhVXRpbHM7Ci0KLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uVGFyZ2V0QXBpOwogaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5TdXBwcmVzc0xpbnQ7CitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLlRhcmdldEFwaTsKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwpAQCAtMzgsMTIgKzMzLDExIEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5TdXJmYWNlVGV4dHVyZTsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29kZWM7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvZGVjLkJ1ZmZlckluZm87Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvZGVjLkNvZGVjRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb2RlY0luZm8uVmlkZW9DYXBhYmlsaXRpZXM7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvZGVjTGlzdDsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRXh0cmFjdG9yOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFGb3JtYXQ7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQubWVkaWEuY3RzLlI7CiBpbXBvcnQgYW5kcm9pZC5vcGVuZ2wuRUdMMTQ7CiBpbXBvcnQgYW5kcm9pZC5vcGVuZ2wuR0xFUzExRXh0OwogaW1wb3J0IGFuZHJvaWQub3BlbmdsLkdMRVMyMDsKQEAgLTUzLDEwICs0Nyw4IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOwogaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlBhaXI7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OwogaW1wb3J0IGFuZHJvaWQudmlldy5QaXhlbENvcHk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlBpeGVsQ29weS5PblBpeGVsQ29weUZpbmlzaGVkTGlzdGVuZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2U7CkBAIC02NywxMyArNTksMjIgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlJlbGF0aXZlTGF5b3V0OwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkFwaUxldmVsVXRpbDsKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLk1lZGlhVXRpbHM7CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKKwogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS5uaW8uQnl0ZU9yZGVyOwogaW1wb3J0IGphdmEubmlvLkZsb2F0QnVmZmVyOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogCiBpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTDEwOwogaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb25maWc7CkBAIC04MSwxMCArODIsNiBAQAogaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xEaXNwbGF5OwogaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xTdXJmYWNlOwogCi1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlJ1bGU7Ci0KIEBUYXJnZXRBcGkoMTYpCiBwdWJsaWMgY2xhc3MgRGVjb2RlQWNjdXJhY3lUZXN0QmFzZSB7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9EZWNvZGVyQ29uZm9ybWFuY2VUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvRGVjb2RlckNvbmZvcm1hbmNlVGVzdC5qYXZhCmluZGV4IDUwYTIwMTEuLjU4MjkzZjkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9EZWNvZGVyQ29uZm9ybWFuY2VUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL0RlY29kZXJDb25mb3JtYW5jZVRlc3QuamF2YQpAQCAtMjUsNiArMjUsNyBAQAogaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb2RlY0luZm87CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUV4dHJhY3RvcjsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRm9ybWF0OworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5SYW5nZTsKIApAQCAtNTEsNiArNTIsNyBAQAogICogcmVmZXJlbmNlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSB0ZXN0IHZlY3Rvci4gVGVzdCB2ZWN0b3IgbWQ1IHN1bXMgYXJlCiAgKiBiYXNlZCBvbiB0aGUgWVVWIDQyMCBwbGFubmFyIGZvcm1hdC4KICAqLworQEFwcE1vZGVGdWxsKHJlYXNvbiA9ICJUaGVyZSBzaG91bGQgYmUgbm8gaW5zdGFudCBhcHBzIHNwZWNpZmljIGJlaGF2aW9yIHJlbGF0ZWQgdG8gY29uZm9ybWFuY2UiKQogcHVibGljIGNsYXNzIERlY29kZXJDb25mb3JtYW5jZVRlc3QgZXh0ZW5kcyBNZWRpYVBsYXllclRlc3RCYXNlIHsKICAgICBwcml2YXRlIHN0YXRpYyBlbnVtIFN0YXR1cyB7CiAgICAgICAgIEZBSUwsCkBAIC0xMzYsNiArMTM4LDcgQEAKICAgICAgICAgbUV4dHJhY3Rvci5zZXREYXRhU291cmNlKHRlc3RGZC5nZXRGaWxlRGVzY3JpcHRvcigpLCB0ZXN0RmQuZ2V0U3RhcnRPZmZzZXQoKSwgdGVzdEZkLmdldExlbmd0aCgpKTsKICAgICAgICAgbUV4dHJhY3Rvci5zZWxlY3RUcmFjaygwKTsKIAorICAgICAgICBtRGVjb2RlciA9IE1lZGlhQ29kZWMuY3JlYXRlQnlDb2RlY05hbWUoZGVjb2Rlck5hbWUpOwogICAgICAgICBNZWRpYUNvZGVjSW5mbyBjb2RlY0luZm8gPSBtRGVjb2Rlci5nZXRDb2RlY0luZm8oKTsKICAgICAgICAgTWVkaWFDb2RlY0luZm8uQ29kZWNDYXBhYmlsaXRpZXMgY2FwcyA9IGNvZGVjSW5mby5nZXRDYXBhYmlsaXRpZXNGb3JUeXBlKG1pbWUpOwogICAgICAgICBpZiAoIWNhcHMuaXNGb3JtYXRTdXBwb3J0ZWQobUV4dHJhY3Rvci5nZXRUcmFja0Zvcm1hdCgwKSkpIHsKQEAgLTE1MSw3ICsxNTQsNiBAQAogICAgICAgICB9CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1EZWNvZGVyID0gTWVkaWFDb2RlYy5jcmVhdGVCeUNvZGVjTmFtZShkZWNvZGVyTmFtZSk7CiAgICAgICAgICAgICBpZiAoTWVkaWFVdGlscy52ZXJpZnlEZWNvZGVyKG1EZWNvZGVyLCBtRXh0cmFjdG9yLCBmcmFtZU1ENVN1bXMpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIFN0YXR1cy5QQVNTOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL0RlY29kZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvRGVjb2RlclRlc3QuamF2YQppbmRleCA4MTg1ODc0Li42MTkyYzBmIDEwMDc1NQotLS0gYS90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvRGVjb2RlclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvRGVjb2RlclRlc3QuamF2YQpAQCAtMjcsMTEgKzI3LDEzIEBACiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5JbWFnZTsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29kZWM7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvZGVjLkJ1ZmZlckluZm87CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvZGVjTGlzdDsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29kZWNJbmZvOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb2RlY0luZm8uQ29kZWNDYXBhYmlsaXRpZXM7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUV4dHJhY3RvcjsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRm9ybWF0OworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKQEAgLTUwLDEwICs1MiwxNCBAQAogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLnppcC5DUkMzMjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKIAogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLk1lZGlhQ29kZWNJbmZvLkNvZGVjUHJvZmlsZUxldmVsLio7CiAKK0BBcHBNb2RlRnVsbChyZWFzb24gPSAiVGhlcmUgc2hvdWxkIGJlIG5vIGluc3RhbnQgYXBwcyBzcGVjaWZpYyBiZWhhdmlvciByZWxhdGVkIHRvIGRlY29kZXJzIikKIHB1YmxpYyBjbGFzcyBEZWNvZGVyVGVzdCBleHRlbmRzIE1lZGlhUGxheWVyVGVzdEJhc2UgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRGVjb2RlclRlc3QiOwogCkBAIC0zNTIsNiArMzU4LDE4IEBACiAgICAgICAgICAgICAgICAgUi5yYXcuY29sb3JfMTc2eDE0NF9zcmdiX2xyX3Nkcl9oMjY1LCA0IC8qIHRlc3RJZCAqLywKICAgICAgICAgICAgICAgICBNZWRpYUZvcm1hdC5DT0xPUl9SQU5HRV9MSU1JVEVELCBNZWRpYUZvcm1hdC5DT0xPUl9TVEFOREFSRF9CVDcwOSwKICAgICAgICAgICAgICAgICAyIC8qIE1lZGlhRm9ybWF0LkNPTE9SX1RSQU5TRkVSX1NSR0IgKi8pOworICAgICAgICAvLyBUZXN0IHRoZSBtYWluMTAgc3RyZWFtcyB3aXRoIHN1cmZhY2UgYXMgdGhlIGRlY29kZXIgbWlnaHQKKyAgICAgICAgLy8gc3VwcG9ydCBvcGFxdWUgYnVmZmVycyBvbmx5LgorICAgICAgICB0ZXN0Q29sb3JBc3BlY3RzKAorICAgICAgICAgICAgICAgIFIucmF3LmNvbG9yXzE3NngxNDRfYnQyMDIwX2xyX3NtcHRlMjA4NF9oMjY1LCA1IC8qIHRlc3RJZCAqLywKKyAgICAgICAgICAgICAgICBNZWRpYUZvcm1hdC5DT0xPUl9SQU5HRV9MSU1JVEVELCBNZWRpYUZvcm1hdC5DT0xPUl9TVEFOREFSRF9CVDIwMjAsCisgICAgICAgICAgICAgICAgTWVkaWFGb3JtYXQuQ09MT1JfVFJBTlNGRVJfU1QyMDg0LAorICAgICAgICAgICAgICAgIGdldEFjdGl2aXR5KCkuZ2V0U3VyZmFjZUhvbGRlcigpLmdldFN1cmZhY2UoKSk7CisgICAgICAgIHRlc3RDb2xvckFzcGVjdHMoCisgICAgICAgICAgICAgICAgUi5yYXcuY29sb3JfMTc2eDE0NF9idDIwMjBfbHJfaGxnX2gyNjUsIDYgLyogdGVzdElkICovLAorICAgICAgICAgICAgICAgIE1lZGlhRm9ybWF0LkNPTE9SX1JBTkdFX0xJTUlURUQsIE1lZGlhRm9ybWF0LkNPTE9SX1NUQU5EQVJEX0JUMjAyMCwKKyAgICAgICAgICAgICAgICBNZWRpYUZvcm1hdC5DT0xPUl9UUkFOU0ZFUl9ITEcsCisgICAgICAgICAgICAgICAgZ2V0QWN0aXZpdHkoKS5nZXRTdXJmYWNlSG9sZGVyKCkuZ2V0U3VyZmFjZSgpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTM5Miw2ICs0MTAsMTMgQEAKICAgICBwcml2YXRlIHZvaWQgdGVzdENvbG9yQXNwZWN0cygKICAgICAgICAgICAgIGludCByZXMsIGludCB0ZXN0SWQsIGludCBleHBlY3RSYW5nZSwgaW50IGV4cGVjdFN0YW5kYXJkLCBpbnQgZXhwZWN0VHJhbnNmZXIpCiAgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdENvbG9yQXNwZWN0cygKKyAgICAgICAgICAgICAgICByZXMsIHRlc3RJZCwgZXhwZWN0UmFuZ2UsIGV4cGVjdFN0YW5kYXJkLCBleHBlY3RUcmFuc2ZlciwgbnVsbCAvKnN1cmZhY2UqLyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RDb2xvckFzcGVjdHMoCisgICAgICAgICAgICBpbnQgcmVzLCBpbnQgdGVzdElkLCBpbnQgZXhwZWN0UmFuZ2UsIGludCBleHBlY3RTdGFuZGFyZCwgaW50IGV4cGVjdFRyYW5zZmVyLAorICAgICAgICAgICAgU3VyZmFjZSBzdXJmYWNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgTWVkaWFGb3JtYXQgZm9ybWF0ID0gTWVkaWFVdGlscy5nZXRUcmFja0Zvcm1hdEZvclJlc291cmNlKG1Db250ZXh0LCByZXMsICJ2aWRlbyIpOwogICAgICAgICBNZWRpYUZvcm1hdCBtaW1lRm9ybWF0ID0gbmV3IE1lZGlhRm9ybWF0KCk7CiAgICAgICAgIG1pbWVGb3JtYXQuc2V0U3RyaW5nKE1lZGlhRm9ybWF0LktFWV9NSU1FLCBmb3JtYXQuZ2V0U3RyaW5nKE1lZGlhRm9ybWF0LktFWV9NSU1FKSk7CkBAIC00MDAsMjEgKzQyNSwyMSBAQAogICAgICAgICAgICAgaWYgKCFNZWRpYVV0aWxzLnN1cHBvcnRzKGRlY29kZXJOYW1lLCBmb3JtYXQpKSB7CiAgICAgICAgICAgICAgICAgTWVkaWFVdGlscy5za2lwVGVzdChkZWNvZGVyTmFtZSArICIgY2Fubm90IHBsYXkgcmVzb3VyY2UgIiArIHJlcyk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRlc3RDb2xvckFzcGVjdHMoCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyTmFtZSwgcmVzLCB0ZXN0SWQsIGV4cGVjdFJhbmdlLCBleHBlY3RTdGFuZGFyZCwgZXhwZWN0VHJhbnNmZXIpOworICAgICAgICAgICAgICAgIHRlc3RDb2xvckFzcGVjdHMoZGVjb2Rlck5hbWUsIHJlcywgdGVzdElkLAorICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0UmFuZ2UsIGV4cGVjdFN0YW5kYXJkLCBleHBlY3RUcmFuc2Zlciwgc3VyZmFjZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgdGVzdENvbG9yQXNwZWN0cygKICAgICAgICAgICAgIFN0cmluZyBkZWNvZGVyTmFtZSwgaW50IHJlcywgaW50IHRlc3RJZCwgaW50IGV4cGVjdFJhbmdlLAotICAgICAgICAgICAgaW50IGV4cGVjdFN0YW5kYXJkLCBpbnQgZXhwZWN0VHJhbnNmZXIpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgaW50IGV4cGVjdFN0YW5kYXJkLCBpbnQgZXhwZWN0VHJhbnNmZXIsIFN1cmZhY2Ugc3VyZmFjZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEFzc2V0RmlsZURlc2NyaXB0b3IgZmQgPSBtUmVzb3VyY2VzLm9wZW5SYXdSZXNvdXJjZUZkKHJlcyk7CiAgICAgICAgIE1lZGlhRXh0cmFjdG9yIGV4ID0gbmV3IE1lZGlhRXh0cmFjdG9yKCk7CiAgICAgICAgIGV4LnNldERhdGFTb3VyY2UoZmQuZ2V0RmlsZURlc2NyaXB0b3IoKSwgZmQuZ2V0U3RhcnRPZmZzZXQoKSwgZmQuZ2V0TGVuZ3RoKCkpOwogICAgICAgICBNZWRpYUZvcm1hdCBmb3JtYXQgPSBleC5nZXRUcmFja0Zvcm1hdCgwKTsKICAgICAgICAgTWVkaWFDb2RlYyBkZWMgPSBNZWRpYUNvZGVjLmNyZWF0ZUJ5Q29kZWNOYW1lKGRlY29kZXJOYW1lKTsKLSAgICAgICAgZGVjLmNvbmZpZ3VyZShmb3JtYXQsIG51bGwsIG51bGwsIDApOworICAgICAgICBkZWMuY29uZmlndXJlKGZvcm1hdCwgc3VyZmFjZSwgbnVsbCwgMCk7CiAgICAgICAgIGRlYy5zdGFydCgpOwogICAgICAgICBCeXRlQnVmZmVyW10gYnVmID0gZGVjLmdldElucHV0QnVmZmVycygpOwogICAgICAgICBleC5zZWxlY3RUcmFjaygwKTsKQEAgLTQ5NCw2ICs1MTksOCBAQAogICAgICAgICB9CiAgICAgICAgIGxvZy5zdWJtaXQoZ2V0SW5zdHJ1bWVudGF0aW9uKCkpOwogCisgICAgICAgIGFzc2VydFRydWUocmFuZ2VNYXRjaCAmJiBjb2xvck1hdGNoICYmIHRyYW5zZmVyTWF0Y2gpOworCiAgICAgICAgIGRlYy5yZWxlYXNlKCk7CiAgICAgICAgIGV4LnJlbGVhc2UoKTsKICAgICAgICAgZmQuY2xvc2UoKTsKQEAgLTY3Myw2ICs3MDAsMjA2IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VnA5SGRyU3RhdGljTWV0YWRhdGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHN0YXRpY0luZm8gPQorICAgICAgICAgICAgICAgICIwMCBkMCA4NCA4MCAzZSBjMiAzMyBjNCAgODYgNGMgMWQgYjggMGIgMTMgM2QgNDIgIiArCisgICAgICAgICAgICAgICAgIjQwIGU4IDAzIDY0IDAwIGU4IDAzIDJjICAwMSAgICAgICAgICAgICAgICAgICAgICAiIDsKKyAgICAgICAgdGVzdEhkclN0YXRpY01ldGFkYXRhKFIucmF3LnZpZGVvXzEyODB4NzIwX3ZwOV9oZHJfc3RhdGljXzNtYnBzLAorICAgICAgICAgICAgICAgIHN0YXRpY0luZm8sIHRydWUgLyptZXRhZGF0YUluQ29udGFpbmVyKi8sICJ0ZXN0VnA5SGRyU3RhdGljTWV0YWRhdGEiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SDI2NUhEUjEwU3RhdGljTWV0YWRhdGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gRXhwZWN0ZWQgdmFsdWUgb2YgTWVkaWFGb3JtYXQuS0VZX0hEUl9TVEFUSUNfSU5GTyBrZXkuCisgICAgICAgIC8vIFRoZSBhc3NvY2lhdGVkIHZhbHVlIGlzIGEgQnl0ZUJ1ZmZlci4gVGhpcyBidWZmZXIgY29udGFpbnMgdGhlIHJhdyBjb250ZW50cyBvZiB0aGUKKyAgICAgICAgLy8gU3RhdGljIE1ldGFkYXRhIERlc2NyaXB0b3IgKGluY2x1ZGluZyB0aGUgZGVzY3JpcHRvciBJRCkgb2YgYW4gSERNSSBEeW5hbWljIFJhbmdlIGFuZAorICAgICAgICAvLyBNYXN0ZXJpbmcgSW5mb0ZyYW1lIGFzIGRlZmluZWQgYnkgQ1RBLTg2MS4zLgorICAgICAgICAvLyBNZWRpYSBmcmFtZXdvcmtzIHB1dHMgdGhlIGRpc3BsYXkgcHJpbWFyaWVzIGluIFJHQiBvcmRlciwgaGVyZSB3ZSB2ZXJpZnkgdGhlIHRocmVlCisgICAgICAgIC8vIHByaW1hcmllcyBhcmUgaW5kZWVkIGluIHRoaXMgb3JkZXIgYW5kIGZhaWwgb3RoZXJ3aXNlLgorICAgICAgICBmaW5hbCBTdHJpbmcgc3RhdGljSW5mbyA9CisgICAgICAgICAgICAgICAgIjAwIGQwIDg0IDgwIDNlIGMyIDMzIGM0ICA4NiA0YyAxZCBiOCAwYiAxMyAzZCA0MiAiICsKKyAgICAgICAgICAgICAgICAiNDAgZTggMDMgMDAgMDAgZTggMDMgOTAgIDAxICAgICAgICAgICAgICAgICAgICAgICIgOworICAgICAgICB0ZXN0SGRyU3RhdGljTWV0YWRhdGEoUi5yYXcudmlkZW9fMTI4MHg3MjBfaGV2Y19oZHIxMF9zdGF0aWNfM21icHMsCisgICAgICAgICAgICAgICAgc3RhdGljSW5mbywgZmFsc2UgLyptZXRhZGF0YUluQ29udGFpbmVyKi8sICJ0ZXN0SDI2NUhEUjEwU3RhdGljTWV0YWRhdGEiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdEhkclN0YXRpY01ldGFkYXRhKAorICAgICAgICAgICAgaW50IHJlcywgU3RyaW5nIHBhdHRlcm4sIGJvb2xlYW4gbWV0YWRhdGFJbkNvbnRhaW5lciwgU3RyaW5nIHRlc3ROYW1lKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEFzc2V0RmlsZURlc2NyaXB0b3IgaW5mZCA9IG51bGw7CisgICAgICAgIE1lZGlhRXh0cmFjdG9yIGV4dHJhY3RvciA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGluZmQgPSBtUmVzb3VyY2VzLm9wZW5SYXdSZXNvdXJjZUZkKHJlcyk7CisgICAgICAgICAgICBleHRyYWN0b3IgPSBuZXcgTWVkaWFFeHRyYWN0b3IoKTsKKyAgICAgICAgICAgIGV4dHJhY3Rvci5zZXREYXRhU291cmNlKGluZmQuZ2V0RmlsZURlc2NyaXB0b3IoKSwKKyAgICAgICAgICAgICAgICAgICAgaW5mZC5nZXRTdGFydE9mZnNldCgpLCBpbmZkLmdldExlbmd0aCgpKTsKKworICAgICAgICAgICAgTWVkaWFGb3JtYXQgZm9ybWF0ID0gbnVsbDsKKyAgICAgICAgICAgIGludCB0cmFja0luZGV4ID0gLTE7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dHJhY3Rvci5nZXRUcmFja0NvdW50KCk7IGkrKykgeworICAgICAgICAgICAgICAgIGZvcm1hdCA9IGV4dHJhY3Rvci5nZXRUcmFja0Zvcm1hdChpKTsKKyAgICAgICAgICAgICAgICBpZiAoZm9ybWF0LmdldFN0cmluZyhNZWRpYUZvcm1hdC5LRVlfTUlNRSkuc3RhcnRzV2l0aCgidmlkZW8vIikpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhY2tJbmRleCA9IGk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRXh0cmFjdG9yIGZhaWxlZCB0byBleHRyYWN0IHZpZGVvIHRyYWNrIiwKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0ICE9IG51bGwgJiYgdHJhY2tJbmRleCA+PSAwKTsKKyAgICAgICAgICAgIGlmIChtZXRhZGF0YUluQ29udGFpbmVyKSB7CisgICAgICAgICAgICAgICAgdmVyaWZ5SGRyU3RhdGljSW5mbygiRXh0cmFjdG9yIGZhaWxlZCB0byBleHRyYWN0IHN0YXRpYyBpbmZvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgcGF0dGVybiwgbWV0YWRhdGFJbkNvbnRhaW5lciwgdGVzdE5hbWUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBleHRyYWN0b3Iuc2VsZWN0VHJhY2sodHJhY2tJbmRleCk7CisgICAgICAgICAgICBMb2cudihUQUcsICJmb3JtYXQgIiArIGZvcm1hdCk7CisKKyAgICAgICAgICAgIFN0cmluZyBtaW1lID0gZm9ybWF0LmdldFN0cmluZyhNZWRpYUZvcm1hdC5LRVlfTUlNRSk7CisgICAgICAgICAgICAvLyBzZXR0aW5nIHByb2ZpbGUgYW5kIGxldmVsCisgICAgICAgICAgICBpZiAoTWVkaWFGb3JtYXQuTUlNRVRZUEVfVklERU9fSEVWQy5lcXVhbHMobWltZSkpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkV4dHJhY3RvciBzZXQgd3JvbmcgcHJvZmlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYUNvZGVjSW5mby5Db2RlY1Byb2ZpbGVMZXZlbC5IRVZDUHJvZmlsZU1haW4xMEhEUjEwLAorICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LmdldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX1BST0ZJTEUpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoTWVkaWFGb3JtYXQuTUlNRVRZUEVfVklERU9fVlA5LmVxdWFscyhtaW1lKSkgeworICAgICAgICAgICAgICAgIC8vIFRoZSBtdXhlciBtaWdodCBub3QgaGF2ZSBwdXQgVlA5IENTRCBpbiB0aGUgbWt2LCB3ZSBtYW51YWxseSBwYXRjaAorICAgICAgICAgICAgICAgIC8vIGl0IGhlcmUgc28gdGhhdCB3ZSBvbmx5IHRlc3QgSERSIHdoZW4gZGVjb2RlciBzdXBwb3J0cyBpdC4KKyAgICAgICAgICAgICAgICBmb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfUFJPRklMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhQ29kZWNJbmZvLkNvZGVjUHJvZmlsZUxldmVsLlZQOVByb2ZpbGUySERSKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZmFpbCgiQ29kZWMgIiArIG1pbWUgKyAiIHNob3VsZG4ndCBiZSB0ZXN0ZWQgd2l0aCB0aGlzIHRlc3QhIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmdbXSBkZWNvZGVyTmFtZXMgPSBNZWRpYVV0aWxzLmdldERlY29kZXJOYW1lcyhmb3JtYXQpOworCisgICAgICAgICAgICBpZiAoZGVjb2Rlck5hbWVzID09IG51bGwgfHwgZGVjb2Rlck5hbWVzLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgTWVkaWFVdGlscy5za2lwVGVzdCgiTm8gdmlkZW8gY29kZWNzIHN1cHBvcnRzIEhEUiIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgU3VyZmFjZSBzdXJmYWNlID0gZ2V0QWN0aXZpdHkoKS5nZXRTdXJmYWNlSG9sZGVyKCkuZ2V0U3VyZmFjZSgpOworICAgICAgICAgICAgZmluYWwgTWVkaWFFeHRyYWN0b3IgZmluYWxFeHRyYWN0b3IgPSBleHRyYWN0b3I7CisKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIG5hbWUgOiBkZWNvZGVyTmFtZXMpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJUZXN0aW5nIGNhbmRpY2F0ZSBkZWNvZGVyICIgKyBuYW1lKTsKKyAgICAgICAgICAgICAgICBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICAgICAgICAgICAgICBleHRyYWN0b3Iuc2Vla1RvKDAsIE1lZGlhRXh0cmFjdG9yLlNFRUtfVE9fUFJFVklPVVNfU1lOQyk7CisKKyAgICAgICAgICAgICAgICBNZWRpYUNvZGVjIGRlY29kZXIgPSBNZWRpYUNvZGVjLmNyZWF0ZUJ5Q29kZWNOYW1lKG5hbWUpOworICAgICAgICAgICAgICAgIGRlY29kZXIuc2V0Q2FsbGJhY2sobmV3IE1lZGlhQ29kZWMuQ2FsbGJhY2soKSB7CisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbUlucHV0RU9TOworICAgICAgICAgICAgICAgICAgICBib29sZWFuIG1PdXRwdXRSZWNlaXZlZDsKKworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25PdXRwdXRCdWZmZXJBdmFpbGFibGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFDb2RlYyBjb2RlYywgaW50IGluZGV4LCBCdWZmZXJJbmZvIGluZm8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtT3V0cHV0UmVjZWl2ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhRm9ybWF0IGJ1ZmZlckZvcm1hdCA9IGNvZGVjLmdldE91dHB1dEZvcm1hdChpbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJnb3Qgb3V0cHV0IGJ1ZmZlcjogZm9ybWF0ICIgKyBidWZmZXJGb3JtYXQpOworCisgICAgICAgICAgICAgICAgICAgICAgICBjb2RlYy5yZWxlYXNlT3V0cHV0QnVmZmVyKGluZGV4LCAgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgdmVyaWZ5SGRyU3RhdGljSW5mbygiT3V0cHV0IGJ1ZmZlciBoYXMgd3Jvbmcgc3RhdGljIGluZm8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJGb3JtYXQsIHBhdHRlcm4sIG1ldGFkYXRhSW5Db250YWluZXIsIHRlc3ROYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRSZWNlaXZlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbklucHV0QnVmZmVyQXZhaWxhYmxlKE1lZGlhQ29kZWMgY29kZWMsIGludCBpbmRleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2VlcCBxdWV1aW5nIHVudGlsIGludHB1dCBFT1MsIG9yIGZpcnN0IG91dHB1dCBidWZmZXIgcmVjZWl2ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUlucHV0RU9TIHx8IG1PdXRwdXRSZWNlaXZlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBpbnB1dEJ1ZmZlciA9IGNvZGVjLmdldElucHV0QnVmZmVyKGluZGV4KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmFsRXh0cmFjdG9yLmdldFNhbXBsZVRyYWNrSW5kZXgoKSA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjLnF1ZXVlSW5wdXRCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwgMCwgMCwgMCwgTWVkaWFDb2RlYy5CVUZGRVJfRkxBR19FTkRfT0ZfU1RSRUFNKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRFT1MgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IGZpbmFsRXh0cmFjdG9yLnJlYWRTYW1wbGVEYXRhKGlucHV0QnVmZmVyLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHRpbWVzdGFtcCA9IGZpbmFsRXh0cmFjdG9yLmdldFNhbXBsZVRpbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbEV4dHJhY3Rvci5hZHZhbmNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWMucXVldWVJbnB1dEJ1ZmZlcihpbmRleCwgMCwgc2l6ZSwgdGltZXN0YW1wLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKE1lZGlhQ29kZWMgY29kZWMsIE1lZGlhQ29kZWMuQ29kZWNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiZ290IGNvZGVjIGV4Y2VwdGlvbiIsIGUpOworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbCgicmVjZWl2ZWQgY29kZWMgZXJyb3IgZHVyaW5nIGRlY29kZSIgKyBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbk91dHB1dEZvcm1hdENoYW5nZWQoTWVkaWFDb2RlYyBjb2RlYywgTWVkaWFGb3JtYXQgZm9ybWF0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJnb3Qgb3V0cHV0IGZvcm1hdDogIiArIGZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgICAgICB2ZXJpZnlIZHJTdGF0aWNJbmZvKCJPdXRwdXQgZm9ybWF0IGhhcyB3cm9uZyBzdGF0aWMgaW5mbyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgcGF0dGVybiwgbWV0YWRhdGFJbkNvbnRhaW5lciwgdGVzdE5hbWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgZGVjb2Rlci5jb25maWd1cmUoZm9ybWF0LCBzdXJmYWNlLCBudWxsLypjcnlwdG8qLywgMC8qZmxhZ3MqLyk7CisgICAgICAgICAgICAgICAgZGVjb2Rlci5zdGFydCgpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUobGF0Y2guYXdhaXQoMjAwMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBmYWlsKCJwbGF5YmFjayBpbnRlcnJ1cHRlZCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZWNvZGVyLnN0b3AoKTsKKyAgICAgICAgICAgICAgICBkZWNvZGVyLnJlbGVhc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChleHRyYWN0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGV4dHJhY3Rvci5yZWxlYXNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW5mZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW5mZC5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUhkclN0YXRpY0luZm8oCisgICAgICAgICAgICBTdHJpbmcgcmVhc29uLCBNZWRpYUZvcm1hdCBmb3JtYXQsIFN0cmluZyBwYXR0ZXJuLAorICAgICAgICAgICAgYm9vbGVhbiBmYWlsT25NaXNtYXRjaCwgU3RyaW5nIHRlc3ROYW1lKSB7CisgICAgICAgIEJ5dGVCdWZmZXIgc3RhdGljTWV0YWRhdGFCdWZmZXIgPSBmb3JtYXQuY29udGFpbnNLZXkoImhkci1zdGF0aWMtaW5mbyIpID8KKyAgICAgICAgICAgICAgICBmb3JtYXQuZ2V0Qnl0ZUJ1ZmZlcigiaGRyLXN0YXRpYy1pbmZvIikgOiBudWxsOworICAgICAgICBhc3NlcnRUcnVlKHJlYXNvbiArICI6IGVtcHR5IiwKKyAgICAgICAgICAgICAgICBzdGF0aWNNZXRhZGF0YUJ1ZmZlciAhPSBudWxsICYmIHN0YXRpY01ldGFkYXRhQnVmZmVyLnJlbWFpbmluZygpID4gMCk7CisKKyAgICAgICAgaWYgKCFBcnJheXMuZXF1YWxzKGxvYWRCeXRlQXJyYXlGcm9tU3RyaW5nKHBhdHRlcm4pLCBzdGF0aWNNZXRhZGF0YUJ1ZmZlci5hcnJheSgpKSkgeworICAgICAgICAgICAgLy8gbG9nIG1pc21hdGNoCisgICAgICAgICAgICBEZXZpY2VSZXBvcnRMb2cgbG9nID0gbmV3IERldmljZVJlcG9ydExvZygiQ3RzTWVkaWFUZXN0Q2FzZXMiLCB0ZXN0TmFtZSk7CisKKyAgICAgICAgICAgIGxvZy5hZGRWYWx1ZSgicmVhc29uIiwgcmVhc29uICsgIjogbWlzbWF0Y2giLCBSZXN1bHRUeXBlLk5FVVRSQUwsIFJlc3VsdFVuaXQuTk9ORSk7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIGZvciAoYnl0ZSBiIDogc3RhdGljTWV0YWRhdGFCdWZmZXIuYXJyYXkoKSkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChTdHJpbmcuZm9ybWF0KCIlMDJYICIsIGIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvZy5hZGRWYWx1ZSgibWV0YWRhdGFfYWN0dWFsIiwgc2IudG9TdHJpbmcoKSwgUmVzdWx0VHlwZS5ORVVUUkFMLCBSZXN1bHRVbml0Lk5PTkUpOworICAgICAgICAgICAgbG9nLmFkZFZhbHVlKCJtZXRhZGF0YV9leHBlY3RlZCIsIHBhdHRlcm4sIFJlc3VsdFR5cGUuTkVVVFJBTCwgUmVzdWx0VW5pdC5OT05FKTsKKyAgICAgICAgICAgIGxvZy5zZXRTdW1tYXJ5KCJyZXN1bHQiLCAwLCBSZXN1bHRUeXBlLkhJR0hFUl9CRVRURVIsIFJlc3VsdFVuaXQuQ09VTlQpOworICAgICAgICAgICAgbG9nLnN1Ym1pdChnZXRJbnN0cnVtZW50YXRpb24oKSk7CisKKyAgICAgICAgICAgIGlmIChmYWlsT25NaXNtYXRjaCkgeworICAgICAgICAgICAgICAgIGZhaWwocmVhc29uICsgIjogbWlzbWF0Y2giKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGhlbHBlciB0byBsb2FkIGJ5dGVbXSBmcm9tIGEgU3RyaW5nCisgICAgcHJpdmF0ZSBieXRlW10gbG9hZEJ5dGVBcnJheUZyb21TdHJpbmcoZmluYWwgU3RyaW5nIHN0cikgeworICAgICAgICBQYXR0ZXJuIHBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoIlswLTlhLWZBLUZdezJ9Iik7CisgICAgICAgIE1hdGNoZXIgbWF0Y2hlciA9IHBhdHRlcm4ubWF0Y2hlcihzdHIpOworICAgICAgICAvLyBhbGxvY2F0ZSBhIGxhcmdlIGVub3VnaCBieXRlIGFycmF5IGZpcnN0CisgICAgICAgIGJ5dGVbXSB0ZW1wQXJyYXkgPSBuZXcgYnl0ZVtzdHIubGVuZ3RoKCkgLyAyXTsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICB3aGlsZSAobWF0Y2hlci5maW5kKCkpIHsKKyAgICAgICAgICB0ZW1wQXJyYXlbaSsrXSA9IChieXRlKUludGVnZXIucGFyc2VJbnQobWF0Y2hlci5ncm91cCgpLCAxNik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEFycmF5cy5jb3B5T2ZSYW5nZSh0ZW1wQXJyYXksIDAsIGkpOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHRlc3REZWNvZGVGcmFnbWVudGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHRlc3REZWNvZGVGcmFnbWVudGVkKFIucmF3LnZpZGVvXzQ4MHgzNjBfbXA0X2gyNjRfMTM1MGticHNfMzBmcHNfYWFjX3N0ZXJlb18xMjhrYnBzXzQ0MTAwaHosCiAgICAgICAgICAgICAgICAgUi5yYXcudmlkZW9fNDgweDM2MF9tcDRfaDI2NF8xMzUwa2Jwc18zMGZwc19hYWNfc3RlcmVvXzEyOGticHNfNDQxMDBoel9mcmFnbWVudGVkKTsKQEAgLTIwNDUsMTggKzIyNzIsMTQgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGlmIChmYWxzZSkgewogICAgICAgICAgICAgICAgIC8vIGNoYW5nZSB0byBmb3JjZSB0ZXN0aW5nIHNvZnR3YXJlIGNvZGVjcwotICAgICAgICAgICAgICAgIGlmIChtaW1lLmNvbnRhaW5zKCJhdmMiKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWVkaWFDb2RlYy5jcmVhdGVCeUNvZGVjTmFtZSgiT01YLmdvb2dsZS5oMjY0LmRlY29kZXIiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1pbWUuY29udGFpbnMoImhldmMiKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWVkaWFDb2RlYy5jcmVhdGVCeUNvZGVjTmFtZSgiT01YLmdvb2dsZS5oZXZjLmRlY29kZXIiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1pbWUuY29udGFpbnMoIjNncHAiKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWVkaWFDb2RlYy5jcmVhdGVCeUNvZGVjTmFtZSgiT01YLmdvb2dsZS5oMjYzLmRlY29kZXIiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1pbWUuY29udGFpbnMoIm1wNHYiKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWVkaWFDb2RlYy5jcmVhdGVCeUNvZGVjTmFtZSgiT01YLmdvb2dsZS5tcGVnNC5kZWNvZGVyIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtaW1lLmNvbnRhaW5zKCJ2cDgiKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWVkaWFDb2RlYy5jcmVhdGVCeUNvZGVjTmFtZSgiT01YLmdvb2dsZS52cDguZGVjb2RlciIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWltZS5jb250YWlucygidnA5IikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1lZGlhQ29kZWMuY3JlYXRlQnlDb2RlY05hbWUoIk9NWC5nb29nbGUudnA5LmRlY29kZXIiKTsKKyAgICAgICAgICAgICAgICBNZWRpYUZvcm1hdCBmb3JtYXQgPSBuZXcgTWVkaWFGb3JtYXQoKTsKKyAgICAgICAgICAgICAgICBmb3JtYXQuc2V0U3RyaW5nKE1lZGlhRm9ybWF0LktFWV9NSU1FLCBtaW1lKTsKKyAgICAgICAgICAgICAgICBTdHJpbmdbXSBjb2RlY3MgPQorICAgICAgICAgICAgICAgICAgICBNZWRpYVV0aWxzLmdldERlY29kZXJOYW1lcyhCb29sZWFuLlRSVUUgLyogaXNHb29nICovLCBmb3JtYXQpOworICAgICAgICAgICAgICAgIGlmIChjb2RlY3MubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWVkaWFDb2RlYy5jcmVhdGVCeUNvZGVjTmFtZShjb2RlY3NbMF0pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBNZWRpYUNvZGVjLmNyZWF0ZURlY29kZXJCeVR5cGUobWltZSk7CkBAIC0yOTQxLDQgKzMxNjQsMyBAQAogICAgICAgICByZXR1cm4gcG0uaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX1ZSX01PREVfSElHSF9QRVJGT1JNQU5DRSk7CiAgICAgfQogfQotCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvRGVjb2RlclRlc3RBYWNEcmMuamF2YSBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9EZWNvZGVyVGVzdEFhY0RyYy5qYXZhCmluZGV4IDk5Nzk2N2MuLjRiYTFhZGMgMTAwNzU1Ci0tLSBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9EZWNvZGVyVGVzdEFhY0RyYy5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9EZWNvZGVyVGVzdEFhY0RyYy5qYXZhCkBAIC0xNiwyOSArMTYsMjYgQEAKIAogcGFja2FnZSBhbmRyb2lkLm1lZGlhLmN0czsKIAotaW1wb3J0IGFuZHJvaWQubWVkaWEuY3RzLlI7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKIAogaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0RmlsZURlc2NyaXB0b3I7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5jdHMuRGVjb2RlclRlc3QuQXVkaW9QYXJhbWV0ZXI7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvZGVjOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb2RlY0luZm87Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvZGVjSW5mby5Db2RlY0NhcGFiaWxpdGllczsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRXh0cmFjdG9yOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFGb3JtYXQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5jdHMuRGVjb2RlclRlc3QuQXVkaW9QYXJhbWV0ZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5jdHMuUjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DdHNBbmRyb2lkVGVzdENhc2U7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKIAotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKQEAgLTYzLDcgKzYwLDcgQEAKICAgICAgICAgLy8gZnVsbCBib29zdCwgZnVsbCBjdXQsIHRhcmdldCByZWYgbGV2ZWw6IC0yM2RCRlMsIGhlYXZ5IGNvbXByZXNzaW9uOiBubwogICAgICAgICBEcmNQYXJhbXMgZHJjUGFyYW1zID0gbmV3IERyY1BhcmFtcygxMjcsIDEyNywgOTIsIDApOwogICAgICAgICBzaG9ydFtdIGRlY1NhbXBsZXMgPSBkZWNvZGVUb01lbW9yeShkZWNQYXJhbXMsIFIucmF3LnNpbmVfMmNoXzQ4a2h6X2FvdDVfZHJjbGV2ZWxfbXA0LAotICAgICAgICAgICAgICAgIC0xLCBudWxsLCBkcmNQYXJhbXMpOworICAgICAgICAgICAgICAgIC0xLCBudWxsLCBkcmNQYXJhbXMsIG51bGwgLypkZWNvZGVyTmFtZTogdXNlIGRlZmF1bHQgZGVjb2RlciovKTsKICAgICAgICAgRGVjb2RlclRlc3QgZGVjVGVzdGVyID0gbmV3IERlY29kZXJUZXN0KCk7CiAgICAgICAgIGRlY1Rlc3Rlci5jaGVja0VuZXJneShkZWNTYW1wbGVzLCBkZWNQYXJhbXMsIDIsIDAuNzBmKTsKICAgICB9CkBAIC03Niw3ICs3Myw3IEBACiAgICAgcHVibGljIHZvaWQgdGVzdERlY29kZUFhY0RyY0Z1bGxNNGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgZGVjUGFyYW1zID0gbmV3IEF1ZGlvUGFyYW1ldGVyKCk7CiAgICAgICAgIHNob3J0W10gZGVjU2FtcGxlcyA9IGRlY29kZVRvTWVtb3J5KGRlY1BhcmFtcywgUi5yYXcuc2luZV8yY2hfNDhraHpfYW90NV9kcmNmdWxsX21wNCwKLSAgICAgICAgICAgICAgICAtMSwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICAgICAgLTEsIG51bGwsIG51bGwsIG51bGwgLypkZWNvZGVyTmFtZTogdXNlIGRlZmF1bHQgZGVjb2RlciovKTsKICAgICAgICAgRGVjb2RlclRlc3QgZGVjVGVzdGVyID0gbmV3IERlY29kZXJUZXN0KCk7CiAgICAgICAgIGRlY1Rlc3Rlci5jaGVja0VuZXJneShkZWNTYW1wbGVzLCBkZWNQYXJhbXMsIDIsIDAuODBmKTsKICAgICB9CkBAIC05MSw3ICs4OCw3IEBACiAgICAgICAgIC8vIGhhbGYgYm9vc3QsIGhhbGYgY3V0LCB0YXJnZXQgcmVmIGxldmVsOiAtMjBkQkZTLCBoZWF2eSBjb21wcmVzc2lvbjogbm8KICAgICAgICAgRHJjUGFyYW1zIGRyY1BhcmFtcyA9IG5ldyBEcmNQYXJhbXMoNjMsIDYzLCA4MCwgMCk7CiAgICAgICAgIHNob3J0W10gZGVjU2FtcGxlcyA9IGRlY29kZVRvTWVtb3J5KGRlY1BhcmFtcywgUi5yYXcuc2luZV8yY2hfNDhraHpfYW90Ml9kcmNoYWxmX21wNCwKLSAgICAgICAgICAgICAgICAtMSwgbnVsbCwgZHJjUGFyYW1zKTsKKyAgICAgICAgICAgICAgICAtMSwgbnVsbCwgZHJjUGFyYW1zLCBudWxsIC8qZGVjb2Rlck5hbWU6IHVzZSBkZWZhdWx0IGRlY29kZXIqLyk7CiAgICAgICAgIERlY29kZXJUZXN0IGRlY1Rlc3RlciA9IG5ldyBEZWNvZGVyVGVzdCgpOwogICAgICAgICBkZWNUZXN0ZXIuY2hlY2tFbmVyZ3koZGVjU2FtcGxlcywgZGVjUGFyYW1zLCAyLCAwLjgwZik7CiAgICAgfQpAQCAtMTA2LDcgKzEwMyw3IEBACiAgICAgICAgIC8vIG5vIGJvb3N0LCBubyBjdXQsIHRhcmdldCByZWYgbGV2ZWw6IC0xNmRCRlMsIGhlYXZ5IGNvbXByZXNzaW9uOiBubwogICAgICAgICBEcmNQYXJhbXMgZHJjUGFyYW1zID0gbmV3IERyY1BhcmFtcygwLCAwLCA2NCwgMCk7ICAgICAgIC8vIG5vcm1hbGl6ZSB0byAtMTZkQkZTCiAgICAgICAgIHNob3J0W10gZGVjU2FtcGxlcyA9IGRlY29kZVRvTWVtb3J5KGRlY1BhcmFtcywgUi5yYXcuc2luZV8yY2hfNDhraHpfYW90NV9kcmNvZmZfbXA0LAotICAgICAgICAgICAgICAgIC0xLCBudWxsLCBkcmNQYXJhbXMpOworICAgICAgICAgICAgICAgIC0xLCBudWxsLCBkcmNQYXJhbXMsIG51bGwgLypkZWNvZGVyTmFtZTogdXNlIGRlZmF1bHQgZGVjb2RlciovKTsKICAgICAgICAgRGVjb2RlclRlc3QgZGVjVGVzdGVyID0gbmV3IERlY29kZXJUZXN0KCk7CiAgICAgICAgIGRlY1Rlc3Rlci5jaGVja0VuZXJneShkZWNTYW1wbGVzLCBkZWNQYXJhbXMsIDIsIDAuODBmKTsKICAgICB9CkBAIC0xMjEsNyArMTE4LDcgQEAKICAgICAgICAgLy8gZnVsbCBib29zdCwgZnVsbCBjdXQsIHRhcmdldCByZWYgbGV2ZWw6IC0xNmRCRlMsIGhlYXZ5IGNvbXByZXNzaW9uOiB5ZXMKICAgICAgICAgRHJjUGFyYW1zIGRyY1BhcmFtcyA9IG5ldyBEcmNQYXJhbXMoMTI3LCAxMjcsIDY0LCAxKTsKICAgICAgICAgc2hvcnRbXSBkZWNTYW1wbGVzID0gZGVjb2RlVG9NZW1vcnkoZGVjUGFyYW1zLCBSLnJhdy5zaW5lXzJjaF80OGtoel9hb3QyX2RyY2hlYXZ5X21wNCwKLSAgICAgICAgICAgICAgICAtMSwgbnVsbCwgZHJjUGFyYW1zKTsKKyAgICAgICAgICAgICAgICAtMSwgbnVsbCwgZHJjUGFyYW1zLCBudWxsIC8qZGVjb2Rlck5hbWU6IHVzZSBkZWZhdWx0IGRlY29kZXIqLyk7CiAgICAgICAgIERlY29kZXJUZXN0IGRlY1Rlc3RlciA9IG5ldyBEZWNvZGVyVGVzdCgpOwogICAgICAgICBkZWNUZXN0ZXIuY2hlY2tFbmVyZ3koZGVjU2FtcGxlcywgZGVjUGFyYW1zLCAyLCAwLjgwZik7CiAgICAgfQpAQCAtMTM0LDEwICsxMzEsNjIgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGVjb2RlQWFjRHJjQ2xpcE00YSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBBdWRpb1BhcmFtZXRlciBkZWNQYXJhbXMgPSBuZXcgQXVkaW9QYXJhbWV0ZXIoKTsKICAgICAgICAgc2hvcnRbXSBkZWNTYW1wbGVzID0gZGVjb2RlVG9NZW1vcnkoZGVjUGFyYW1zLCBSLnJhdy5zaW5lXzJjaF80OGtoel9hb3Q1X2RyY2NsaXBfbXA0LAotICAgICAgICAgICAgICAgIC0xLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgICAgICAtMSwgbnVsbCwgbnVsbCwgbnVsbCAvKmRlY29kZXJOYW1lOiB1c2UgZGVmYXVsdCBkZWNvZGVyKi8pOwogICAgICAgICBjaGVja0NsaXBwaW5nKGRlY1NhbXBsZXMsIGRlY1BhcmFtcywgMjQ4LjBmIC8qIEh6ICovKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGRlY29kZXIgdGFyZ2V0IGxldmVsLgorICAgICAqIFRoZSBhY3R1YWwgZGVmYXVsdCB2YWx1ZSB1c2VkIGJ5IHRoZSBkZWNvZGVyIGNhbiBkaWZmZXIgYmV0d2VlbiBwbGF0Zm9ybXMsIG9yIGV2ZW4gZGV2aWNlcywKKyAgICAgKiBidXQgdGVzdHMgd2lsbCBtZWFzdXJlIGVuZXJneSByZWxhdGl2ZSB0byB0aGlzIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfREVDT0RFUl9UQVJHRVRfTEVWRUwgPSA2NDsgLy8gLTE2LjAgZEJGcworCisgICAgLyoqCisgICAgICogVGVzdCBVU0FDIGRlY29kZXIgd2l0aCBkaWZmZXJlbnQgdGFyZ2V0IGxvdWRuZXNzIGxldmVscworICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERlY29kZVVzYWNMb3VkbmVzc000YSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBMb2cudihUQUcsICJTVEFSVCB0ZXN0RGVjb2RlVXNhY0xvdWRuZXNzTTRhIik7CisKKyAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gYWFjRGVjb2Rlck5hbWVzID0gRGVjb2RlclRlc3RYaGVBYWMuaW5pdEFhY0RlY29kZXJOYW1lcygpOworICAgICAgICBhc3NlcnRUcnVlKCJObyBBQUMgZGVjb2RlciBmb3VuZCIsIGFhY0RlY29kZXJOYW1lcy5zaXplKCkgPiAwKTsKKworICAgICAgICBmb3IgKFN0cmluZyBhYWNEZWNOYW1lIDogYWFjRGVjb2Rlck5hbWVzKSB7CisgICAgICAgICAgICAvLyB0ZXN0IGRlZmF1bHQgbG91ZG5lc3MKKyAgICAgICAgICAgIC8vIGRlY29kZXJUYXJnZXRMZXZlbCA9IDY0IC0tPiB0YXJnZXQgb3V0cHV0IGxldmVsID0gLTE2LjAgZEJGcworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjaGVja1VzYWNMb3VkbmVzcyhERUZBVUxUX0RFQ09ERVJfVEFSR0VUX0xFVkVMLCAxLCAxLjBmLCBhYWNEZWNOYW1lKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAidGVzdERlY29kZVVzYWNMb3VkbmVzc000YSBmb3IgZGVmYXVsdCBsb3VkbmVzcyBmYWlsZWQgZm9yICIgKworICAgICAgICAgICAgICAgICAgICAgICAgYWFjRGVjTmFtZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHRlc3QgbG91ZG5lc3MgYm9vc3QKKyAgICAgICAgICAgIC8vIGRlY29kZXJUYXJnZXRMZXZlbCA9IDQwIC0tPiB0YXJnZXQgb3V0cHV0IGxldmVsID0gLTEwLjAgZEJGcworICAgICAgICAgICAgLy8gbm9ybUZhY3RvciA9IDEvKDEwXigtNi8xMCkpID0gMy45OGYKKyAgICAgICAgICAgIC8vICAgd2hlcmUgIi02IiBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBkZWZhdWx0IGxldmVsICgtMTYpLCBhbmQgLTEwIGZvciB0aGlzIHRlc3QKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY2hlY2tVc2FjTG91ZG5lc3MoNDAsIDEsIChmbG9hdCkoMS4wZi9NYXRoLnBvdygxMC4wZiwgLTYuMGYvMTAuMGYpKSwgYWFjRGVjTmFtZSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy52KFRBRywgInRlc3REZWNvZGVVc2FjTG91ZG5lc3NNNGEgZm9yIGxvdWRuZXNzIGJvb3N0IGZhaWxlZCBmb3IgIiArIGFhY0RlY05hbWUpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyB0ZXN0IGxvdWRuZXNzIGF0dGVudWF0aW9uCisgICAgICAgICAgICAvLyBkZWNvZGVyVGFyZ2V0TGV2ZWwgPSA5NiAtLT4gdGFyZ2V0IG91dHB1dCBsZXZlbCA9IC0yNC4wIGRCRnMKKyAgICAgICAgICAgIC8vIG5vcm1GYWN0b3IgPSAxLygxMF4oOC8xMCkpID0gMC4xNWYKKyAgICAgICAgICAgIC8vICAgICB3aGVyZSA4IGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGRlZmF1bHQgbGV2ZWwgKC0xNiksIGFuZCAtMjQgZm9yIHRoaXMgdGVzdAorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjaGVja1VzYWNMb3VkbmVzcyg5NiwgMCwgKGZsb2F0KSgxLjBmL01hdGgucG93KDEwLjBmLCA4LjBmLzEwLjBmKSksIGFhY0RlY05hbWUpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudihUQUcsICJ0ZXN0RGVjb2RlVXNhY0xvdWRuZXNzTTRhIGZvciBsb3VkbmVzcyBhdHRlbnVhdGlvbiBmYWlsZWQgZm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgYWFjRGVjTmFtZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKICAgICAvKioKICAgICAgKiAgSW50ZXJuYWwgdXRpbGl0aWVzCkBAIC0yNTksMjggKzMwOCw4MSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLyoqCisgICAgICogVVNBQyB0ZXN0IERSQyBsb3VkbmVzcworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjaGVja1VzYWNMb3VkbmVzcyhpbnQgZGVjb2RlclRhcmdldExldmVsLCBpbnQgaGVhdnksIGZsb2F0IG5vcm1GYWN0b3IsCisgICAgICAgICAgICBTdHJpbmcgZGVjb2Rlck5hbWUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBBdWRpb1BhcmFtZXRlciBkZWNQYXJhbXMgPSBuZXcgQXVkaW9QYXJhbWV0ZXIoKTsKKyAgICAgICAgRHJjUGFyYW1zIGRyY1BhcmFtc19kZWYgID0gbmV3IERyY1BhcmFtcygxMjcsIDEyNywgREVGQVVMVF9ERUNPREVSX1RBUkdFVF9MRVZFTCwgMSk7CisgICAgICAgIERyY1BhcmFtcyBkcmNQYXJhbXNfdGVzdCA9IG5ldyBEcmNQYXJhbXMoMTI3LCAxMjcsIGRlY29kZXJUYXJnZXRMZXZlbCwgaGVhdnkpOworCisgICAgICAgIHNob3J0W10gZGVjU2FtcGxlc19kZWYgPSBkZWNvZGVUb01lbW9yeShkZWNQYXJhbXMsIFIucmF3Lm5vaXNlXzJjaF80OGtoel9hb3Q0Ml8xOV9sdWZzX21wNCwKKyAgICAgICAgICAgICAgICAtMSwgbnVsbCwgZHJjUGFyYW1zX2RlZiwgZGVjb2Rlck5hbWUpOworICAgICAgICBzaG9ydFtdIGRlY1NhbXBsZXNfdGVzdCA9IGRlY29kZVRvTWVtb3J5KGRlY1BhcmFtcywgUi5yYXcubm9pc2VfMmNoXzQ4a2h6X2FvdDQyXzE5X2x1ZnNfbXA0LAorICAgICAgICAgICAgICAgIC0xLCBudWxsLCBkcmNQYXJhbXNfdGVzdCwgZGVjb2Rlck5hbWUpOworCisgICAgICAgIERlY29kZXJUZXN0WGhlQWFjIGRlY1Rlc3RlclhoZUFhYyA9IG5ldyBEZWNvZGVyVGVzdFhoZUFhYygpOworICAgICAgICBmbG9hdFtdIG5yZ19kZWYgID0gZGVjVGVzdGVyWGhlQWFjLmNoZWNrRW5lcmd5VVNBQyhkZWNTYW1wbGVzX2RlZiwgZGVjUGFyYW1zLCAyLCAxKTsKKyAgICAgICAgZmxvYXRbXSBucmdfdGVzdCA9IGRlY1Rlc3RlclhoZUFhYy5jaGVja0VuZXJneVVTQUMoZGVjU2FtcGxlc190ZXN0LCBkZWNQYXJhbXMsIDIsIDEpOworCisgICAgICAgIGZsb2F0W10gbnJnVGhyZXNob2xkID0gezI2MDI1MTA1OTU2MjAuMGYsIDIzNTQ2NTI0NDM2NTcuMGZ9OworCisgICAgICAgIC8vIENoZWNrIGRlZmF1bHQgbG91ZG5lc3MgYmVoYXZpb3IKKyAgICAgICAgaWYgKG5yZ19kZWZbMF0gPiBucmdUaHJlc2hvbGRbMF0gfHwgbnJnX2RlZlswXSA8IG5yZ1RocmVzaG9sZFsxXSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiRGVmYXVsdCBsb3VkbmVzcyBiZWhhdmlvciBub3QgYXMgZXhwZWN0ZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IG5yZ1JhdGlvID0gbnJnX2RlZlswXS9ucmdfdGVzdFswXTsKKworICAgICAgICAvLyBDaGVjayBmb3IgbG91ZG5lc3MgYm9vc3QvYXR0ZW51YXRpb24gaWYgZGVjb2RlclRhcmdldExldmVsIGRldmlhdGVzIGZyb20gZGVmYXVsdCB2YWx1ZQorICAgICAgICAvLyB1c2VkIGluIHRoZXNlIHRlc3RzIChub3RlIHRoYXQgdGhlIGRlZmF1bHQgdGFyZ2V0IGxldmVsIGNhbiBjaGFuZ2UgZnJvbSBwbGF0Zm9ybQorICAgICAgICAvLyB0byBwbGF0Zm9ybSwgb3IgZGV2aWNlIHRvIGRldmljZSkKKyAgICAgICAgaWYgKChkZWNvZGVyVGFyZ2V0TGV2ZWwgPCBERUZBVUxUX0RFQ09ERVJfVEFSR0VUX0xFVkVMKSAvLyBib29zdGVkIGxvdWRuZXNzCisgICAgICAgICAgICAgICAgJiYgKG5yZ19kZWZbMF0gPiBucmdfdGVzdFswXSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlNpZ25hbCBub3QgYXR0ZW51YXRlZCIpOworICAgICAgICB9IGVsc2UgaWYgKChkZWNvZGVyVGFyZ2V0TGV2ZWwgPiBERUZBVUxUX0RFQ09ERVJfVEFSR0VUX0xFVkVMKSAvLyBhdHRlbnVhdGVkIGxvdWRuZXNzCisgICAgICAgICAgICAgICAgJiYgKG5yZ19kZWZbMF0gPCBucmdfdGVzdFswXSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlNpZ25hbCBub3QgYm9vc3RlZCIpOworICAgICAgICB9CisgICAgICAgIG5yZ1JhdGlvID0gbnJnUmF0aW8gKiBub3JtRmFjdG9yOworCisgICAgICAgIC8vIENoZWNrIHdoZXRoZXIgbG91ZG5lc3MgYmVoYXZpb3IgaXMgYXMgZXhwZWN0ZWQKKyAgICAgICAgaWYgKG5yZ1JhdGlvID4gMS4wNWYgfHwgbnJnUmF0aW8gPCAwLjk1ZiApeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiTG91ZG5lc3MgYmVoYXZpb3Igbm90IGFzIGV4cGVjdGVkIik7CisgICAgICAgIH0KKyAgICB9CisKIAogICAgIC8qKgotICAgICAqICBDbGFzcyBoYW5kbGluZyBhbGwgTVBFRy00IER5bmFtaWMgUmFuZ2UgQ29udHJvbCAoRFJDKSBwYXJhbWV0ZXIgcmVsZXZhbnQgZm9yIHRlc3RpbmcKKyAgICAgKiAgQ2xhc3MgaGFuZGxpbmcgYWxsIE1QRUctNCBhbmQgTVBFRy1EIER5bmFtaWMgUmFuZ2UgQ29udHJvbCAoRFJDKSBwYXJhbWV0ZXIgcmVsZXZhbnQgZm9yIHRlc3RpbmcKICAgICAgKi8KLSAgICBwcml2YXRlIGNsYXNzIERyY1BhcmFtcyB7Ci0gICAgICAgIGludCBib29zdDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNjYWxpbmcgb2YgYm9vc3RpbmcgZ2FpbnMKLSAgICAgICAgaW50IGN1dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2NhbGluZyBvZiBjb21wcmVzc2luZyBnYWlucwotICAgICAgICBpbnQgZGVjb2RlclRhcmdldExldmVsOyAgICAgICAgICAgICAvLyBkZXNpcmVkIHRhcmdldCBvdXRwdXQgbGV2ZWwgKGZvciBub3JtYWxpemF0aW9uKQotICAgICAgICBpbnQgaGVhdnk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbi0vZGlzYWJsZSBoZWF2eSBjb21wcmVzc2lvbgorICAgIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgRHJjUGFyYW1zIHsKKyAgICAgICAgaW50IG1Cb29zdDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNjYWxpbmcgb2YgYm9vc3RpbmcgZ2FpbnMKKyAgICAgICAgaW50IG1DdXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNjYWxpbmcgb2YgY29tcHJlc3NpbmcgZ2FpbnMKKyAgICAgICAgaW50IG1EZWNvZGVyVGFyZ2V0TGV2ZWw7ICAgICAgICAgICAgIC8vIGRlc2lyZWQgdGFyZ2V0IG91dHB1dCBsZXZlbCAoZm9yIG5vcm1hbGl6YXRpb24pCisgICAgICAgIGludCBtSGVhdnk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbi0vZGlzYWJsZSBoZWF2eSBjb21wcmVzc2lvbgorICAgICAgICBpbnQgbUVmZmVjdFR5cGU7ICAgICAgICAgICAgICAgICAgICAgLy8gTVBFRy1EIERSQyBFZmZlY3QgVHlwZQogCiAgICAgICAgIHB1YmxpYyBEcmNQYXJhbXMoKSB7Ci0gICAgICAgICAgICB0aGlzLmJvb3N0ID0gMTI3OyAgICAgICAgICAgICAgIC8vIG5vIHNjYWxpbmcKLSAgICAgICAgICAgIHRoaXMuY3V0ID0gMTI3OyAgICAgICAgICAgICAgICAgLy8gbm8gc2NhbGluZwotICAgICAgICAgICAgdGhpcy5kZWNvZGVyVGFyZ2V0TGV2ZWwgPSA2NDsgICAvLyAtMTYuMCBkQkZzCi0gICAgICAgICAgICB0aGlzLmhlYXZ5ID0gMTsgICAgICAgICAgICAgICAgIC8vIGVuYWJsZWQKKyAgICAgICAgICAgIG1Cb29zdCA9IDEyNzsgICAgICAgICAgICAgICAvLyBubyBzY2FsaW5nCisgICAgICAgICAgICBtQ3V0ICAgPSAxMjc7ICAgICAgICAgICAgICAgLy8gbm8gc2NhbGluZworICAgICAgICAgICAgbUhlYXZ5ID0gMTsgICAgICAgICAgICAgICAgIC8vIGVuYWJsZWQKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBEcmNQYXJhbXMoaW50IGJvb3N0LCBpbnQgY3V0LCBpbnQgZGVjb2RlclRhcmdldExldmVsLCBpbnQgaGVhdnkpIHsKLSAgICAgICAgICAgIHRoaXMuYm9vc3QgPSBib29zdDsKLSAgICAgICAgICAgIHRoaXMuY3V0ID0gY3V0OwotICAgICAgICAgICAgdGhpcy5kZWNvZGVyVGFyZ2V0TGV2ZWwgPSBkZWNvZGVyVGFyZ2V0TGV2ZWw7Ci0gICAgICAgICAgICB0aGlzLmhlYXZ5ID0gaGVhdnk7CisgICAgICAgICAgICBtQm9vc3QgPSBib29zdDsKKyAgICAgICAgICAgIG1DdXQgPSBjdXQ7CisgICAgICAgICAgICBtRGVjb2RlclRhcmdldExldmVsID0gZGVjb2RlclRhcmdldExldmVsOworICAgICAgICAgICAgbUhlYXZ5ID0gaGVhdnk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRHJjUGFyYW1zKGludCBib29zdCwgaW50IGN1dCwgaW50IGRlY29kZXJUYXJnZXRMZXZlbCwgaW50IGhlYXZ5LCBpbnQgZWZmZWN0VHlwZSkgeworICAgICAgICAgICAgbUJvb3N0ID0gYm9vc3Q7CisgICAgICAgICAgICBtQ3V0ID0gY3V0OworICAgICAgICAgICAgbURlY29kZXJUYXJnZXRMZXZlbCA9IGRlY29kZXJUYXJnZXRMZXZlbDsKKyAgICAgICAgICAgIG1IZWF2eSA9IGhlYXZ5OworICAgICAgICAgICAgbUVmZmVjdFR5cGUgPSBlZmZlY3RUeXBlOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yOTAsNyArMzkyLDcgQEAKICAgICAvLyAgICAgICAgICAtIG5vIG5lZWQvdXNlIG9mIHJlc2V0TW9kZSwgY29uZmlnTW9kZQogICAgIC8vICAgICAgIFNwbGl0IG1ldGhvZCBzbyBjb2RlIGNhbiBiZSBzaGFyZWQKICAgICBwcml2YXRlIHNob3J0W10gZGVjb2RlVG9NZW1vcnkoQXVkaW9QYXJhbWV0ZXIgYXVkaW9QYXJhbXMsIGludCB0ZXN0aW5wdXQsCi0gICAgICAgICAgICBpbnQgZW9zc2FtcGxlLCBMaXN0PExvbmc+IHRpbWVzdGFtcHMsIERyY1BhcmFtcyBkcmNQYXJhbXMpCisgICAgICAgICAgICBpbnQgZW9zc2FtcGxlLCBMaXN0PExvbmc+IHRpbWVzdGFtcHMsIERyY1BhcmFtcyBkcmNQYXJhbXMsIFN0cmluZyBkZWNvZGVyTmFtZSkKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKICAgICAgICAgU3RyaW5nIGxvY2FsVGFnID0gVEFHICsgIiNkZWNvZGVUb01lbW9yeSI7CkBAIC0zMTUsMTUgKzQxNywyMSBAQAogICAgICAgICBhc3NlcnRUcnVlKCJub3QgYW4gYXVkaW8gZmlsZSIsIG1pbWUuc3RhcnRzV2l0aCgiYXVkaW8vIikpOwogCiAgICAgICAgIE1lZGlhRm9ybWF0IGNvbmZpZ0Zvcm1hdCA9IGZvcm1hdDsKLSAgICAgICAgY29kZWMgPSBNZWRpYUNvZGVjLmNyZWF0ZURlY29kZXJCeVR5cGUobWltZSk7CisgICAgICAgIGlmIChkZWNvZGVyTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICBjb2RlYyA9IE1lZGlhQ29kZWMuY3JlYXRlRGVjb2RlckJ5VHlwZShtaW1lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvZGVjID0gTWVkaWFDb2RlYy5jcmVhdGVCeUNvZGVjTmFtZShkZWNvZGVyTmFtZSk7CisgICAgICAgIH0KIAogICAgICAgICAvLyBzZXQgRFJDIHBhcmFtZXRlcnMKICAgICAgICAgaWYgKGRyY1BhcmFtcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb25maWdGb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfQUFDX0RSQ19CT09TVF9GQUNUT1IsIGRyY1BhcmFtcy5ib29zdCk7Ci0gICAgICAgICAgICBjb25maWdGb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfQUFDX0RSQ19BVFRFTlVBVElPTl9GQUNUT1IsIGRyY1BhcmFtcy5jdXQpOwotICAgICAgICAgICAgY29uZmlnRm9ybWF0LnNldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0FBQ19EUkNfVEFSR0VUX1JFRkVSRU5DRV9MRVZFTCwKLSAgICAgICAgICAgICAgICAgICAgZHJjUGFyYW1zLmRlY29kZXJUYXJnZXRMZXZlbCk7Ci0gICAgICAgICAgICBjb25maWdGb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfQUFDX0RSQ19IRUFWWV9DT01QUkVTU0lPTiwgZHJjUGFyYW1zLmhlYXZ5KTsKKyAgICAgICAgICAgIGNvbmZpZ0Zvcm1hdC5zZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9BQUNfRFJDX0JPT1NUX0ZBQ1RPUiwgZHJjUGFyYW1zLm1Cb29zdCk7CisgICAgICAgICAgICBjb25maWdGb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfQUFDX0RSQ19BVFRFTlVBVElPTl9GQUNUT1IsIGRyY1BhcmFtcy5tQ3V0KTsKKyAgICAgICAgICAgIGlmIChkcmNQYXJhbXMubURlY29kZXJUYXJnZXRMZXZlbCAhPSAwKSB7CisgICAgICAgICAgICAgICAgY29uZmlnRm9ybWF0LnNldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0FBQ19EUkNfVEFSR0VUX1JFRkVSRU5DRV9MRVZFTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRyY1BhcmFtcy5tRGVjb2RlclRhcmdldExldmVsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbmZpZ0Zvcm1hdC5zZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9BQUNfRFJDX0hFQVZZX0NPTVBSRVNTSU9OLCBkcmNQYXJhbXMubUhlYXZ5KTsKICAgICAgICAgfQogICAgICAgICBMb2cudihsb2NhbFRhZywgImNvbmZpZ3VyaW5nIHdpdGggIiArIGNvbmZpZ0Zvcm1hdCk7CiAgICAgICAgIGNvZGVjLmNvbmZpZ3VyZShjb25maWdGb3JtYXQsIG51bGwgLyogc3VyZmFjZSAqLywgbnVsbCAvKiBjcnlwdG8gKi8sIDAgLyogZmxhZ3MgKi8pOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL0RlY29kZXJUZXN0WGhlQWFjLmphdmEgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvRGVjb2RlclRlc3RYaGVBYWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hNGI4ZTRlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL0RlY29kZXJUZXN0WGhlQWFjLmphdmEKQEAgLTAsMCArMSw5NTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEuY3RzOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0RmlsZURlc2NyaXB0b3I7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvZGVjOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb2RlY0luZm87CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvZGVjTGlzdDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRXh0cmFjdG9yOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFGb3JtYXQ7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5jdHMuRGVjb2RlclRlc3QuQXVkaW9QYXJhbWV0ZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5jdHMuRGVjb2RlclRlc3RBYWNEcmMuRHJjUGFyYW1zOworaW1wb3J0IGFuZHJvaWQubWVkaWEuY3RzLlI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIERlY29kZXJUZXN0WGhlQWFjIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkRlY29kZXJUZXN0WGhlQWFjIjsKKworICAgIHByaXZhdGUgUmVzb3VyY2VzIG1SZXNvdXJjZXM7CisKKyAgICAvLyBsaXN0IG9mIGFsbCBBQUMgZGVjb2RlcnMgYXMgZW51bWVyYXRlZCB0aHJvdWdoIHRoZSBNZWRpYUNvZGVjTGlzdAorICAgIC8vIGxhenkgaW5pdGlhbGl6YXRpb24gaW4gc2V0VXAoKQorICAgIHByaXZhdGUgc3RhdGljIEFycmF5TGlzdDxTdHJpbmc+IHNBYWNEZWNvZGVyTmFtZXM7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgSW5zdHJ1bWVudGF0aW9uIGluc3QgPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChpbnN0KTsKKyAgICAgICAgbVJlc291cmNlcyA9IGluc3QuZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpOworICAgICAgICAvLyBidWlsZCBhIGxpc3Qgb2YgYWxsIEFBQyBkZWNvZGVycyBvbiB3aGljaCB0byBydW4gdGhlIHRlc3QKKyAgICAgICAgaWYgKHNBYWNEZWNvZGVyTmFtZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgc0FhY0RlY29kZXJOYW1lcyA9IGluaXRBYWNEZWNvZGVyTmFtZXMoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgQXJyYXlMaXN0PFN0cmluZz4gaW5pdEFhY0RlY29kZXJOYW1lcygpIHsKKyAgICAgICAgLy8gYXQgbGVhc3QgMSBBQUMgZGVjb2RlciBleHBlY3RlZAorICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBhYWNEZWNvZGVyTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oMSk7CisgICAgICAgIGZpbmFsIE1lZGlhQ29kZWNMaXN0IG1lZGlhQ29kZWNMaXN0ID0gbmV3IE1lZGlhQ29kZWNMaXN0KE1lZGlhQ29kZWNMaXN0LlJFR1VMQVJfQ09ERUNTKTsKKyAgICAgICAgZmluYWwgTWVkaWFDb2RlY0luZm9bXSBtZWRpYUNvZGVjSW5mb3MgPSBtZWRpYUNvZGVjTGlzdC5nZXRDb2RlY0luZm9zKCk7CisgICAgICAgIGZvciAoTWVkaWFDb2RlY0luZm8gbWVkaWFDb2RlY0luZm8gOiBtZWRpYUNvZGVjSW5mb3MpIHsKKyAgICAgICAgICAgIGlmIChtZWRpYUNvZGVjSW5mby5pc0VuY29kZXIoKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gbWltZVR5cGVzID0gbWVkaWFDb2RlY0luZm8uZ2V0U3VwcG9ydGVkVHlwZXMoKTsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIG1pbWVUeXBlIDogbWltZVR5cGVzKSB7CisgICAgICAgICAgICAgICAgaWYgKE1lZGlhRm9ybWF0Lk1JTUVUWVBFX0FVRElPX0FBQy5lcXVhbHNJZ25vcmVDYXNlKG1pbWVUeXBlKSkgeworICAgICAgICAgICAgICAgICAgICBhYWNEZWNvZGVyTmFtZXMuYWRkKG1lZGlhQ29kZWNJbmZvLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYWFjRGVjb2Rlck5hbWVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZlcmlmeSB0aGUgY29ycmVjdCBkZWNvZGluZyBvZiBVU0FDIGJpdHN0cmVhbXMgd2l0aCBkaWZmZXJlbnQgTVBFRy1EIERSQyBlZmZlY3QgdHlwZXMuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVjb2RlVXNhY0RyY0VmZmVjdFR5cGVNNGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTG9nLnYoVEFHLCAiU1RBUlQgdGVzdERlY29kZVVzYWNEcmNFZmZlY3RUeXBlTTRhIik7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiTm8gQUFDIGRlY29kZXIgZm91bmQiLCBzQWFjRGVjb2Rlck5hbWVzLnNpemUoKSA+IDApOworCisgICAgICAgIGZvciAoU3RyaW5nIGFhY0RlY05hbWUgOiBzQWFjRGVjb2Rlck5hbWVzKSB7CisgICAgICAgICAgICBMb2cudihUQUcsICJ0ZXN0RGVjb2RlVXNhY0RyY0VmZmVjdFR5cGVNNGEgcnVubmluZyBmb3IgZGVjPSIgKyBhYWNEZWNOYW1lKTsKKyAgICAgICAgICAgIC8vIHRlc3QgRFJDIGVmZmVjdFR5cGVJRCAxICJOSUdIVCIKKyAgICAgICAgICAgIC8vIEwgLTNkQiAtPiBub3JtYWxpemF0aW9uIGZhY3RvciA9IDEvKDEwXigtMy8xMCkpID0gMC41MDExZgorICAgICAgICAgICAgLy8gUiArM2RCIC0+IG5vcm1hbGl6YXRpb24gZmFjdG9yID0gMS8oMTBeKCAzLzEwKSkgPSAxLjk5NTJmCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNoZWNrVXNhY0RyY0VmZmVjdFR5cGUoMSwgMC41MDExZiwgMS45OTUyZiwgIk5pZ2h0IiwgMiwgMCwgYWFjRGVjTmFtZSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy52KFRBRywgInRlc3REZWNvZGVVc2FjRHJjRWZmZWN0VHlwZU00YSBOaWdodC8yLzAgZmFpbGVkIGZvciBkZWM9IiArIGFhY0RlY05hbWUpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyB0ZXN0IERSQyBlZmZlY3RUeXBlSUQgMiAiTk9JU1kiCisgICAgICAgICAgICAvLyBMICszZEIgLT4gbm9ybWFsaXphdGlvbiBmYWN0b3IgPSAxLygxMF4oIDMvMTApKSA9IDEuOTk1MmYKKyAgICAgICAgICAgIC8vIFIgLTZkQiAtPiBub3JtYWxpemF0aW9uIGZhY3RvciA9IDEvKDEwXigtNi8xMCkpID0gMC4yNTExZgorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjaGVja1VzYWNEcmNFZmZlY3RUeXBlKDIsIDEuOTk1MmYsIDAuMjUxMWYsICJOb2lzeSIsIDIsIDAsIGFhY0RlY05hbWUpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudihUQUcsICJ0ZXN0RGVjb2RlVXNhY0RyY0VmZmVjdFR5cGVNNGEgTm9pc3kvMi8wIGZhaWxlZCBmb3IgZGVjPSIgKyBhYWNEZWNOYW1lKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gdGVzdCBEUkMgZWZmZWN0VHlwZUlEIDMgIkxJTUlURUQiCisgICAgICAgICAgICAvLyBMIC02ZEIgLT4gbm9ybWFsaXphdGlvbiBmYWN0b3IgPSAxLygxMF4oLTYvMTApKSA9IDAuMjUxMWYKKyAgICAgICAgICAgIC8vIFIgKzZkQiAtPiBub3JtYWxpemF0aW9uIGZhY3RvciA9IDEvKDEwXiggNi8xMCkpID0gMy45ODEwZgorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjaGVja1VzYWNEcmNFZmZlY3RUeXBlKDMsIDAuMjUxMWYsIDMuOTgxMGYsICJMaW1pdGVkIiwgMiwgMCwgYWFjRGVjTmFtZSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy52KFRBRywgInRlc3REZWNvZGVVc2FjRHJjRWZmZWN0VHlwZU00YSBMaW1pdGVkLzIvMCBmYWlsZWQgZm9yIGRlYz0iCisgICAgICAgICAgICAgICAgICAgICAgICArIGFhY0RlY05hbWUpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyB0ZXN0IERSQyBlZmZlY3RUeXBlSUQgNiAiR0VORVJBTCIKKyAgICAgICAgICAgIC8vIEwgKzZkQiAtPiBub3JtYWxpemF0aW9uIGZhY3RvciA9IDEvKDEwXiggNi8xMCkpID0gMy45ODEwZgorICAgICAgICAgICAgLy8gUiAtM2RCIC0+IG5vcm1hbGl6YXRpb24gZmFjdG9yID0gMS8oMTBeKC0zLzEwKSkgPSAwLjUwMTFmCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNoZWNrVXNhY0RyY0VmZmVjdFR5cGUoNiwgMy45ODEwZiwgMC41MDExZiwgIkdlbmVyYWwiLCAyLCAwLCBhYWNEZWNOYW1lKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAidGVzdERlY29kZVVzYWNEcmNFZmZlY3RUeXBlTTRhIEdlbmVyYWwvMi8wIGZhaWxlZCBmb3IgZGVjPSIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgYWFjRGVjTmFtZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHRlc3QgRFJDIGVmZmVjdFR5cGVJRCAxICJOSUdIVCIKKyAgICAgICAgICAgIC8vIEwgICAgLTZkQiAtPiBub3JtYWxpemF0aW9uIGZhY3RvciA9IDEvKDEwXigtNi8xMCkpID0gMC4yNTExZgorICAgICAgICAgICAgLy8gUiAgICArNmRCIC0+IG5vcm1hbGl6YXRpb24gZmFjdG9yID0gMS8oMTBeKCA2LzEwKSkgPSAzLjk4MTBmCisgICAgICAgICAgICAvLyBtb25vIC02ZEIgLT4gbm9ybWFsaXphdGlvbiBmYWN0b3IgPSAxLygxMF4oLTYvMTApKSA9IDAuMjUxMWYKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY2hlY2tVc2FjRHJjRWZmZWN0VHlwZSgxLCAwLjI1MTFmLCAzLjk4MTBmLCAiTmlnaHQiLCAyLCAxLCBhYWNEZWNOYW1lKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAidGVzdERlY29kZVVzYWNEcmNFZmZlY3RUeXBlTTRhIE5pZ2h0LzIvMSBmb3IgZGVjPSIgKyBhYWNEZWNOYW1lKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY2hlY2tVc2FjRHJjRWZmZWN0VHlwZSgxLCAwLjI1MTFmLCAwLjBmLCAiTmlnaHQiLCAxLCAxLCBhYWNEZWNOYW1lKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAidGVzdERlY29kZVVzYWNEcmNFZmZlY3RUeXBlTTRhIE5pZ2h0LzEvMSBmb3IgZGVjPSIgKyBhYWNEZWNOYW1lKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gdGVzdCBEUkMgZWZmZWN0VHlwZUlEIDIgIk5PSVNZIgorICAgICAgICAgICAgLy8gTCAgICArNmRCIC0+IG5vcm1hbGl6YXRpb24gZmFjdG9yID0gMS8oMTBeKCA2LzEwKSkgICA9IDMuOTgxMGYKKyAgICAgICAgICAgIC8vIFIgICAgLTlkQiAtPiBub3JtYWxpemF0aW9uIGZhY3RvciA9IDEvKDEwXigtOS8xMCkpICA9IDAuMTI1OGYKKyAgICAgICAgICAgIC8vIG1vbm8gKzZkQiAtPiBub3JtYWxpemF0aW9uIGZhY3RvciA9IDEvKDEwXiggNi8xMCkpICAgPSAzLjk4MTBmCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNoZWNrVXNhY0RyY0VmZmVjdFR5cGUoMiwgMy45ODEwZiwgMC4xMjU4ZiwgIk5vaXN5IiwgMiwgMSwgYWFjRGVjTmFtZSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy52KFRBRywgInRlc3REZWNvZGVVc2FjRHJjRWZmZWN0VHlwZU00YSBOb2lzeS8yLzEgZm9yIGRlYz0iICsgYWFjRGVjTmFtZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNoZWNrVXNhY0RyY0VmZmVjdFR5cGUoMiwgMy45ODEwZiwgMC4wZiwgIk5vaXN5IiwgMSwgMSwgYWFjRGVjTmFtZSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy52KFRBRywgInRlc3REZWNvZGVVc2FjRHJjRWZmZWN0VHlwZU00YSBOaWdodC8yLzEgZm9yIGRlYz0iICsgYWFjRGVjTmFtZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHRlc3QgRFJDIGVmZmVjdFR5cGVJRCAzICJMSU1JVEVEIgorICAgICAgICAgICAgLy8gTCAgICAtOWRCIC0+IG5vcm1hbGl6YXRpb24gZmFjdG9yID0gMS8oMTBeKC05LzEwKSkgPSAwLjEyNThmCisgICAgICAgICAgICAvLyBSICAgICs5ZEIgLT4gbm9ybWFsaXphdGlvbiBmYWN0b3IgPSAxLygxMF4oIDkvMTApKSA9IDcuOTQzMmYKKyAgICAgICAgICAgIC8vIG1vbm8gLTlkQiAtPiBub3JtYWxpemF0aW9uIGZhY3RvciA9IDEvKDEwXigtOS8xMCkpID0gMC4xMjU4ZgorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjaGVja1VzYWNEcmNFZmZlY3RUeXBlKDMsIDAuMTI1OGYsIDcuOTQzMmYsICJMaW1pdGVkIiwgMiwgMSwgYWFjRGVjTmFtZSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy52KFRBRywgInRlc3REZWNvZGVVc2FjRHJjRWZmZWN0VHlwZU00YSBMaW1pdGVkLzIvMSBmb3IgZGVjPSIgKyBhYWNEZWNOYW1lKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY2hlY2tVc2FjRHJjRWZmZWN0VHlwZSgzLCAwLjEyNThmLCAwLjBmLCAiTGltaXRlZCIsIDEsIDEsIGFhY0RlY05hbWUpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudihUQUcsICJ0ZXN0RGVjb2RlVXNhY0RyY0VmZmVjdFR5cGVNNGEgTGltaXRlZC8xLzEgZm9yIGRlYz0iICsgYWFjRGVjTmFtZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHRlc3QgRFJDIGVmZmVjdFR5cGVJRCA2ICJHRU5FUkFMIgorICAgICAgICAgICAgLy8gTCAgICArOWRCIC0+IG5vcm1hbGl6YXRpb24gZmFjdG9yID0gMS8oMTBeKCA5LzEwKSkgPSA3Ljk0MzJmCisgICAgICAgICAgICAvLyBSICAgIC02ZEIgLT4gbm9ybWFsaXphdGlvbiBmYWN0b3IgPSAxLygxMF4oLTYvMTApKSAgPSAwLjI1MTFmCisgICAgICAgICAgICAvLyBtb25vICs5ZEIgLT4gbm9ybWFsaXphdGlvbiBmYWN0b3IgPSAxLygxMF4oIDkvMTApKSA9IDcuOTQzMmYKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY2hlY2tVc2FjRHJjRWZmZWN0VHlwZSg2LCA3Ljk0MzJmLCAwLjI1MTFmLCAiR2VuZXJhbCIsIDIsIDEsIGFhY0RlY05hbWUpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudihUQUcsICJ0ZXN0RGVjb2RlVXNhY0RyY0VmZmVjdFR5cGVNNGEgR2VuZXJhbC8yLzEgZm9yIGRlYz0iICsgYWFjRGVjTmFtZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNoZWNrVXNhY0RyY0VmZmVjdFR5cGUoNiwgNy45NDMyZiwgMC4wZiwgIkdlbmVyYWwiLCAxLCAxLCBhYWNEZWNOYW1lKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAidGVzdERlY29kZVVzYWNEcmNFZmZlY3RUeXBlTTRhIEdlbmVyYWwvMS8xIGZvciBkZWM9IiArIGFhY0RlY05hbWUpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVmVyaWZ5IHRoZSBjb3JyZWN0IGRlY29kaW5nIG9mIFVTQUMgYml0c3RyZWFtcyB3aXRoIGNvbmZpZyBjaGFuZ2VzLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERlY29kZVVzYWNTdHJlYW1Td2l0Y2hpbmdNNGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTG9nLnYoVEFHLCAiU1RBUlQgdGVzdERlY29kZVVzYWNTdHJlYW1Td2l0Y2hpbmdNNGEiKTsKKworICAgICAgICBhc3NlcnRUcnVlKCJObyBBQUMgZGVjb2RlciBmb3VuZCIsIHNBYWNEZWNvZGVyTmFtZXMuc2l6ZSgpID4gMCk7CisKKyAgICAgICAgZm9yIChTdHJpbmcgYWFjRGVjTmFtZSA6IHNBYWNEZWNvZGVyTmFtZXMpIHsKKyAgICAgICAgICAgIC8vIFN0ZXJlbworICAgICAgICAgICAgLy8gc3dpdGNoIGJldHdlZW4gU0JSIHJhdGlvcyBhbmQgc3RlcmVvIG1vZGVzCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNoZWNrVXNhY1N0cmVhbVN3aXRjaGluZygyLjU0NTk4MjlFMTJmLCAyLAorICAgICAgICAgICAgICAgICAgICAgICAgUi5yYXcubm9pc2VfMmNoXzQ0XzFraHpfYW90NDJfMTlfbHVmc19jb25maWdfY2hhbmdlX21wNCwgYWFjRGVjTmFtZSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy52KFRBRywgInRlc3REZWNvZGVVc2FjU3RyZWFtU3dpdGNoaW5nTTRhIGZhaWxlZCAyY2ggc2JyL3N0ZXJlbyBzd2l0Y2ggZm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgYWFjRGVjTmFtZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE1vbm8KKyAgICAgICAgICAgIC8vIHN3aXRjaCBiZXR3ZWVuIFNCUiByYXRpb3MgYW5kIHN0ZXJlbyBtb2RlcworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjaGVja1VzYWNTdHJlYW1Td2l0Y2hpbmcoMi4yNDY2OTEyNkUxMmYsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICBSLnJhdy5ub2lzZV8xY2hfMzhfNGtoel9hb3Q0Ml8xOV9sdWZzX2NvbmZpZ19jaGFuZ2VfbXA0LCBhYWNEZWNOYW1lKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAidGVzdERlY29kZVVzYWNTdHJlYW1Td2l0Y2hpbmdNNGEgZmFpbGVkIDFjaCBzYnIvc3RlcmVvIHN3aXRjaCBmb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBhYWNEZWNOYW1lKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU3RlcmVvCisgICAgICAgICAgICAvLyBzd2l0Y2ggYmV0d2VlbiBVU0FDIG1vZGVzCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNoZWNrVXNhY1N0cmVhbVN3aXRjaGluZygyLjFFMTJmLCAyLAorICAgICAgICAgICAgICAgICAgICAgICAgUi5yYXcubm9pc2VfMmNoXzM1XzI4a2h6X2FvdDQyXzE5X2x1ZnNfZHJjX2NvbmZpZ19jaGFuZ2VfbXA0LCBhYWNEZWNOYW1lKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAidGVzdERlY29kZVVzYWNTdHJlYW1Td2l0Y2hpbmdNNGEgZmFpbGVkIDJjaCBVU0FDIG1vZGUgc3dpdGNoIGZvciAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGFhY0RlY05hbWUpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBNb25vCisgICAgICAgICAgICAvLyBzd2l0Y2ggYmV0d2VlbiBVU0FDIG1vZGVzCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNoZWNrVXNhY1N0cmVhbVN3aXRjaGluZygxLjdFMTJmLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgUi5yYXcubm9pc2VfMWNoXzI5XzRraHpfYW90NDJfMTlfbHVmc19kcmNfY29uZmlnX2NoYW5nZV9tcDQsIGFhY0RlY05hbWUpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudihUQUcsICJ0ZXN0RGVjb2RlVXNhY1N0cmVhbVN3aXRjaGluZ000YSBmYWlsZWQgMWNoIFVTQUMgbW9kZSBzd2l0Y2ggZm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgYWFjRGVjTmFtZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWZXJpZnkgdGhlIGNvcnJlY3QgZGVjb2Rpbmcgb2YgVVNBQyBiaXRzdHJlYW1zIHdpdGggdmFyaW91cyBzYW1wbGluZyByYXRlcy4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REZWNvZGVVc2FjU2FtcGxpbmdSYXRlc000YSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBMb2cudihUQUcsICJTVEFSVCB0ZXN0RGVjb2RlVXNhY1NhbXBsaW5nUmF0ZXNNNGEiKTsKKworICAgICAgICBhc3NlcnRUcnVlKCJObyBBQUMgZGVjb2RlciBmb3VuZCIsIHNBYWNEZWNvZGVyTmFtZXMuc2l6ZSgpID4gMCk7CisKKyAgICAgICAgZm9yIChTdHJpbmcgYWFjRGVjTmFtZSA6IHNBYWNEZWNvZGVyTmFtZXMpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY2hlY2tVc2FjU2FtcGxpbmdSYXRlKFIucmF3Lm5vaXNlXzJjaF8wOGtoel9hb3Q0Ml8xOV9sdWZzX21wNCwgYWFjRGVjTmFtZSk7CisgICAgICAgICAgICAgICAgY2hlY2tVc2FjU2FtcGxpbmdSYXRlKFIucmF3Lm5vaXNlXzJjaF8xMmtoel9hb3Q0Ml8xOV9sdWZzX21wNCwgYWFjRGVjTmFtZSk7CisgICAgICAgICAgICAgICAgY2hlY2tVc2FjU2FtcGxpbmdSYXRlKFIucmF3Lm5vaXNlXzJjaF8yMl8wNWtoel9hb3Q0Ml8xOV9sdWZzX21wNCwgYWFjRGVjTmFtZSk7CisgICAgICAgICAgICAgICAgY2hlY2tVc2FjU2FtcGxpbmdSYXRlKFIucmF3Lm5vaXNlXzJjaF82NGtoel9hb3Q0Ml8xOV9sdWZzX21wNCwgYWFjRGVjTmFtZSk7CisgICAgICAgICAgICAgICAgY2hlY2tVc2FjU2FtcGxpbmdSYXRlKFIucmF3Lm5vaXNlXzJjaF84OF8ya2h6X2FvdDQyXzE5X2x1ZnNfbXA0LCBhYWNEZWNOYW1lKTsKKyAgICAgICAgICAgICAgICBjaGVja1VzYWNTYW1wbGluZ1JhdGVXb0xvdWRuZXNzKFIucmF3Lm5vaXNlXzJjaF8xOV8ya2h6X2FvdDQyX25vX2x1ZHRfbXA0LAorICAgICAgICAgICAgICAgICAgICAgICAgYWFjRGVjTmFtZSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy52KFRBRywgInRlc3REZWNvZGVVc2FjU2FtcGxpbmdSYXRlc000YSBmb3IgZGVjb2RlciIgKyBhYWNEZWNOYW1lKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogIEludGVybmFsIHV0aWxpdGllcworICAgICAqLworCisgICAgLyoqCisgICAgICogVVNBQyB0ZXN0IERSQyBFZmZlY3QgVHlwZQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjaGVja1VzYWNEcmNFZmZlY3RUeXBlKGludCBlZmZlY3RUeXBlSUQsIGZsb2F0IG5vcm1GYWN0b3JfTCwgZmxvYXQgbm9ybUZhY3Rvcl9SLAorICAgICAgICAgICAgICAgICBTdHJpbmcgZWZmZWN0VHlwZU5hbWUsIGludCBuQ2gsIGludCBhZ2dyZXNzaXZlRHJjLCBTdHJpbmcgZGVjb2Rlck5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGludCB0ZXN0aW5wdXQgPSAtMTsKKyAgICAgICAgQXVkaW9QYXJhbWV0ZXIgZGVjUGFyYW1zID0gbmV3IEF1ZGlvUGFyYW1ldGVyKCk7CisgICAgICAgIERyY1BhcmFtcyBkcmNQYXJhbXNfZGVmICA9IG5ldyBEcmNQYXJhbXMoMTI3LCAxMjcsIDk2LCAwLCAtMSk7CisgICAgICAgIERyY1BhcmFtcyBkcmNQYXJhbXNfdGVzdCA9IG5ldyBEcmNQYXJhbXMoMTI3LCAxMjcsIDk2LCAwLCBlZmZlY3RUeXBlSUQpOworCisgICAgICAgIGlmIChhZ2dyZXNzaXZlRHJjID09IDApIHsKKyAgICAgICAgICAgIHRlc3RpbnB1dCA9IFIucmF3Lm5vaXNlXzJjaF8zMmtoel9hb3Q0Ml8xOV9sdWZzX2RyY19tcDQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobkNoID09IDIpIHsKKyAgICAgICAgICAgICAgICB0ZXN0aW5wdXQgPSBSLnJhdy5ub2lzZV8yY2hfMzVfMjhraHpfYW90NDJfMTlfbHVmc19kcmNfY29uZmlnX2NoYW5nZV9tcDQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG5DaCA9PSAxKXsKKyAgICAgICAgICAgICAgICB0ZXN0aW5wdXQgPSBSLnJhdy5ub2lzZV8xY2hfMjlfNGtoel9hb3Q0Ml8xOV9sdWZzX2RyY19jb25maWdfY2hhbmdlX21wNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNob3J0W10gZGVjU2FtcGxlc19kZWYgID0gZGVjb2RlVG9NZW1vcnkoZGVjUGFyYW1zLCB0ZXN0aW5wdXQsCisgICAgICAgICAgICAgICAgLTEsIG51bGwsIGRyY1BhcmFtc19kZWYsIGRlY29kZXJOYW1lKTsKKyAgICAgICAgc2hvcnRbXSBkZWNTYW1wbGVzX3Rlc3QgPSBkZWNvZGVUb01lbW9yeShkZWNQYXJhbXMsIHRlc3RpbnB1dCwKKyAgICAgICAgICAgICAgICAtMSwgbnVsbCwgZHJjUGFyYW1zX3Rlc3QsIGRlY29kZXJOYW1lKTsKKworICAgICAgICBmbG9hdFtdIG5yZ19kZWYgID0gY2hlY2tFbmVyZ3lVU0FDKGRlY1NhbXBsZXNfZGVmLCBkZWNQYXJhbXMsIG5DaCwgMSwgMCk7CisgICAgICAgIGZsb2F0W10gbnJnX3Rlc3QgPSBjaGVja0VuZXJneVVTQUMoZGVjU2FtcGxlc190ZXN0LCBkZWNQYXJhbXMsIG5DaCwgMSwgMSk7CisKKyAgICAgICAgaWYgKG5DaCA9PSAyKSB7CisgICAgICAgICAgICBmbG9hdCBucmdSYXRpb19MID0gKG5yZ190ZXN0WzFdL25yZ19kZWZbMV0pL25vcm1GYWN0b3JfTDsKKyAgICAgICAgICAgIGZsb2F0IG5yZ1JhdGlvX1IgPSAobnJnX3Rlc3RbMl0vbnJnX2RlZlsyXSkvbm9ybUZhY3Rvcl9SOworICAgICAgICAgICAgaWYgKChucmdSYXRpb19SID4gMS4wNWYgfHwgbnJnUmF0aW9fUiA8IDAuOTVmKSAKKyAgICAgICAgICAgICAgICAgICAgfHwgKG5yZ1JhdGlvX0wgPiAxLjA1ZiB8fCBucmdSYXRpb19MIDwgMC45NWYpICl7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiRFJDIEVmZmVjdCBUeXBlICciICsgZWZmZWN0VHlwZU5hbWUgKyAiJyBub3QgYXMgZXhwZWN0ZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChuQ2ggPT0gMSl7CisgICAgICAgICAgICBmbG9hdCBucmdSYXRpb19MID0gKG5yZ190ZXN0WzBdL25yZ19kZWZbMF0pL25vcm1GYWN0b3JfTDsKKyAgICAgICAgICAgIGlmIChucmdSYXRpb19MID4gMS4wNWYgfHwgbnJnUmF0aW9fTCA8IDAuOTVmKXsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJEUkMgRWZmZWN0IFR5cGUgJyIgKyBlZmZlY3RUeXBlTmFtZSArICInIG5vdCBhcyBleHBlY3RlZCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVVNBQyB0ZXN0IHN0cmVhbSBzd2l0Y2hpbmcKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY2hlY2tVc2FjU3RyZWFtU3dpdGNoaW5nKGZsb2F0IG5yZ19yZWYsIGludCBlbmNOY2gsIGludCB0ZXN0aW5wdXQsCisgICAgICAgICAgICBTdHJpbmcgZGVjb2Rlck5hbWUpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIEF1ZGlvUGFyYW1ldGVyIGRlY1BhcmFtcyA9IG5ldyBBdWRpb1BhcmFtZXRlcigpOworICAgICAgICBEcmNQYXJhbXMgZHJjUGFyYW1zICAgICAgPSBuZXcgRHJjUGFyYW1zKDEyNywgMTI3LCA2NCwgMCwgLTEpOworCisgICAgICAgIC8vIENoZWNrIHN0ZXJlbyBzdHJlYW0gc3dpdGNoaW5nCisgICAgICAgIHNob3J0W10gZGVjU2FtcGxlcyA9IGRlY29kZVRvTWVtb3J5KGRlY1BhcmFtcywgdGVzdGlucHV0LAorICAgICAgICAgICAgICAgIC0xLCBudWxsLCBkcmNQYXJhbXMsIGRlY29kZXJOYW1lKTsKKyAgICAgICAgZmxvYXRbXSBucmcgPSBjaGVja0VuZXJneVVTQUMoZGVjU2FtcGxlcywgZGVjUGFyYW1zLCBlbmNOY2gsIDEpOworCisgICAgICAgIGZsb2F0IG5yZ1JhdGlvID0gbnJnWzBdIC8gbnJnX3JlZjsKKworICAgICAgICAvLyBDaGVjayBpZiBlbmVyZ3kgbGV2ZWxzIGFyZSB3aXRoaW4gMTUlIG9mIHRoZSByZWZlcmVuY2UKKyAgICAgICAgLy8gRW5lcmd5IGRyb3BzIHdpdGhpbiB0aGUgZGVjb2RlZCBzdHJlYW0gYXJlIGNoZWNrZWQgYnkgY2hlY2tFbmVyZ3lVU0FDKCkgd2l0aGluIGV2ZXJ5CisgICAgICAgIC8vIDI1MG1zIGludGVydmFsCisgICAgICAgIGlmIChucmdSYXRpbyA+IDEuMTVmIHx8IG5yZ1JhdGlvIDwgMC44NWYgKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJDb25maWcgc3dpdGNoaW5nIG5vdCBhcyBleHBlY3RlZCIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVVNBQyB0ZXN0IHNhbXBsaW5nIHJhdGUKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY2hlY2tVc2FjU2FtcGxpbmdSYXRlKGludCB0ZXN0aW5wdXQsIFN0cmluZyBkZWNvZGVyTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEF1ZGlvUGFyYW1ldGVyIGRlY1BhcmFtcyAgPSBuZXcgQXVkaW9QYXJhbWV0ZXIoKTsKKyAgICAgICAgRHJjUGFyYW1zIGRyY1BhcmFtc19kZWYgICA9IG5ldyBEcmNQYXJhbXMoMTI3LCAxMjcsIDY0LCAwLCAtMSk7CisgICAgICAgIERyY1BhcmFtcyBkcmNQYXJhbXNfdGVzdCAgPSBuZXcgRHJjUGFyYW1zKDEyNywgMTI3LCA5NiwgMCwgLTEpOworCisgICAgICAgIHNob3J0W10gZGVjU2FtcGxlc19kZWYgID0gZGVjb2RlVG9NZW1vcnkoZGVjUGFyYW1zLCB0ZXN0aW5wdXQsCisgICAgICAgICAgICAgICAgLTEsIG51bGwsIGRyY1BhcmFtc19kZWYsIGRlY29kZXJOYW1lKTsKKyAgICAgICAgc2hvcnRbXSBkZWNTYW1wbGVzX3Rlc3QgPSBkZWNvZGVUb01lbW9yeShkZWNQYXJhbXMsIHRlc3RpbnB1dCwKKyAgICAgICAgICAgICAgICAtMSwgbnVsbCwgZHJjUGFyYW1zX3Rlc3QsIGRlY29kZXJOYW1lKTsKKworICAgICAgICBmbG9hdFtdIG5yZ19kZWYgID0gY2hlY2tFbmVyZ3lVU0FDKGRlY1NhbXBsZXNfZGVmLCBkZWNQYXJhbXMsIDIsIDEpOworICAgICAgICBmbG9hdFtdIG5yZ190ZXN0ID0gY2hlY2tFbmVyZ3lVU0FDKGRlY1NhbXBsZXNfdGVzdCwgZGVjUGFyYW1zLCAyLCAxKTsKKworICAgICAgICBmbG9hdCBucmdSYXRpbyA9IG5yZ19kZWZbMF0vbnJnX3Rlc3RbMF07CisKKyAgICAgICAgLy8gbm9ybUZhY3RvciA9IDEvKDEwXigtOC8xMCkpID0gNi4zZgorICAgICAgICBucmdSYXRpbyA9IG5yZ1JhdGlvIC8gNi4zZjsKKworICAgICAgICAvLyBDaGVjayB3aGV0aGVyIGJlaGF2aW9yIGlzIGFzIGV4cGVjdGVkCisgICAgICAgIGlmIChucmdSYXRpbyA+IDEuMDVmIHx8IG5yZ1JhdGlvIDwgMC45NWYgKXsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlNhbXBsaW5nIHJhdGUgbm90IHN1cHBvcnRlZCIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVVNBQyB0ZXN0IHNhbXBsaW5nIHJhdGUgZm9yIHN0cmVhbXMgd2l0aG91dCBsb3VkbmVzcyBhcHBsaWNhdGlvbgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjaGVja1VzYWNTYW1wbGluZ1JhdGVXb0xvdWRuZXNzKGludCB0ZXN0aW5wdXQsIFN0cmluZyBkZWNvZGVyTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgQXVkaW9QYXJhbWV0ZXIgZGVjUGFyYW1zICA9IG5ldyBBdWRpb1BhcmFtZXRlcigpOworICAgICAgICBEcmNQYXJhbXMgZHJjUGFyYW1zICAgICAgID0gbmV3IERyY1BhcmFtcygpOworCisgICAgICAgIHNob3J0W10gZGVjU2FtcGxlcyA9IGRlY29kZVRvTWVtb3J5KGRlY1BhcmFtcywgdGVzdGlucHV0LCAtMSwgbnVsbCwgZHJjUGFyYW1zLCBkZWNvZGVyTmFtZSk7CisKKyAgICAgICAgZmxvYXRbXSBucmcgPSBjaGVja0VuZXJneVVTQUMoZGVjU2FtcGxlcywgZGVjUGFyYW1zLCAyLCAxKTsKKworICAgICAgICBmbG9hdCBucmdfcmVmICA9IDMuMTU3NjYzOTRFMTJmOworICAgICAgICBmbG9hdCBucmdSYXRpbyA9IG5yZ19yZWYvbnJnWzBdOworCisgICAgICAgIC8vIENoZWNrIHdoZXRoZXIgYmVoYXZpb3IgaXMgYXMgZXhwZWN0ZWQKKyAgICAgICAgaWYgKG5yZ1JhdGlvID4gMS4wNWYgfHwgbnJnUmF0aW8gPCAwLjk1ZiApeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiU2FtcGxpbmcgcmF0ZSBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtIGEgc2VnbWVudGVkIGVuZXJneSBhbmFseXNpcyBvbiBnaXZlbiBhdWRpbyBzaWduYWwgc2FtcGxlcyBhbmQgcnVuIHNldmVyYWwgdGVzdHMgb24KKyAgICAgKiB0aGUgZW5lcmd5IHZhbHVlcy4KKyAgICAgKgorICAgICAqIFRoZSBtYWluIHB1cnBvc2UgaXMgdG8gdmVyaWZ5IHdoZXRoZXIgYSBVU0FDIGRlY29kZXIgaW1wbGVtZW50YXRpb24gYXBwbGllcyBTcGVjdHJhbCBCYW5kCisgICAgICogUmVwbGljYXRpb24gKFNCUiksIFBhcmFtZXRyaWMgU3RlcmVvIChQUykgYW5kIER5bmFtaWMgUmFuZ2UgQ29udHJvbCAoRFJDKSBjb3JyZWN0bHkuIEFsbAorICAgICAqIHRvb2xzIGFyZSBpbmhlcmVudCBwYXJ0cyB0byBlaXRoZXIgdGhlIE1QRUctRCBVU0FDIGF1ZGlvIGNvZGVjIG9yIHRoZSBNUEVHLUQgRFJDIHRvb2wuCisgICAgICoKKyAgICAgKiBJbiBhZGRpdGlvbiwgdGhpcyB0ZXN0IGNhbiB2ZXJpZnkgdGhlIGNvcnJlY3QgZGVjb2Rpbmcgb2YgbXVsdGktY2hhbm5lbCAoZS5nLiA1LjEgY2hhbm5lbCkKKyAgICAgKiBzdHJlYW1zIG9yIHRoZSBjcmVhdGlvbiBvZiBhIGRvd25taXhlZCBzaWduYWwuCisgICAgICoKKyAgICAgKiBOb3RlOiBUaGlzIHRlc3QgcHJvY2VkdXJlIGlzIG5vdCBhbiBNUEVHIENvbmZvcm1hbmNlIFRlc3QgYW5kIGNhbiBub3Qgc2VydmUgYXMgYSByZXBsYWNlbWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZWNTYW1wbGVzIHRoZSBkZWNvZGVkIGF1ZGlvIHNhbXBsZXMgdG8gYmUgdGVzdGVkCisgICAgICogQHBhcmFtIGRlY1BhcmFtcyB0aGUgYXVkaW8gcGFyYW1ldGVycyBvZiB0aGUgZ2l2ZW4gYXVkaW8gc2FtcGxlcyAoZGVjU2FtcGxlcykKKyAgICAgKiBAcGFyYW0gZW5jTmNoIHRoZSBlbmNvZGVkIG51bWJlciBvZiBhdWRpbyBjaGFubmVscyAobnVtYmVyIG9mIGNoYW5uZWxzIG9mIHRoZSBvcmlnaW5hbAorICAgICAqICAgICAgICAgICAgICAgaW5wdXQpCisgICAgICogQHBhcmFtIGRyY0NvbnRleHQgaW5kaWNhdGUgdG8gdXNlIHRlc3QgY3JpdGVyaWEgYXBwbGljYWJsZSBmb3IgRFJDIHRlc3RpbmcKKyAgICAgKiBAcmV0dXJuIGFycmF5IG9mIGVuZXJnaWVzLCBhdCBpbmRleCAwOiBhY2N1bXVsYXRlZCBlbmVyZ3kgb2YgYWxsIGNoYW5uZWxzLCBhbmQKKyAgICAgKiAgICAgaW5kZXggMSBhbmQgb3ZlciBjb250YWluIHRoZSBpbmRpdmlkdWFsIGNoYW5uZWwgZW5lcmdpZXMKKyAgICAgKiBAdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmxvYXRbXSBjaGVja0VuZXJneVVTQUMoc2hvcnRbXSBkZWNTYW1wbGVzLCBBdWRpb1BhcmFtZXRlciBkZWNQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbmNOY2gsIGludCBkcmNDb250ZXh0KQorICAgIHsKKyAgICAgICAgZmluYWwgZmxvYXRbXSBucmcgPSBjaGVja0VuZXJneVVTQUMoZGVjU2FtcGxlcywgZGVjUGFyYW1zLCBlbmNOY2gsIGRyY0NvbnRleHQsICAwKTsKKyAgICAgICAgcmV0dXJuIG5yZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTYW1lIGFzIHtAbGluayAjY2hlY2tFbmVyZ3lVU0FDKHNob3J0W10sIEF1ZGlvUGFyYW1ldGVyLCBpbnQsIGludCl9IGJ1dCB3aXRoIERSQyBlZmZlYyB0eXBlCisgICAgICogQHBhcmFtIGRlY1NhbXBsZXMKKyAgICAgKiBAcGFyYW0gZGVjUGFyYW1zCisgICAgICogQHBhcmFtIGVuY05jaAorICAgICAqIEBwYXJhbSBkcmNDb250ZXh0CisgICAgICogQHBhcmFtIGRyY0FwcGxpZWQgaW5kaWNhdGUgaWYgTVBFRy1EIERSQyBFZmZlY3QgVHlwZSBoYXMgYmVlbiBhcHBsaWVkCisgICAgICogQHJldHVybgorICAgICAqIEB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbgorICAgICAqLworICAgIHByaXZhdGUgZmxvYXRbXSBjaGVja0VuZXJneVVTQUMoc2hvcnRbXSBkZWNTYW1wbGVzLCBBdWRpb1BhcmFtZXRlciBkZWNQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW5jTmNoLCBpbnQgZHJjQ29udGV4dCwgIGludCBkcmNBcHBsaWVkKQorICAgICAgICAgICAgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFN0cmluZyBsb2NhbFRhZyA9IFRBRyArICIjY2hlY2tFbmVyZ3lVU0FDIjsKKworICAgICAgICAvLyB0aGUgbnVtYmVyIG9mIHNlZ21lbnRzIHBlciBibG9jaworICAgICAgICBmaW5hbCBpbnQgblNlZ1BlckJsayA9IDQ7CisgICAgICAgIC8vIHRoZSBudW1iZXIgb2YgaW5wdXQgY2hhbm5lbHMKKyAgICAgICAgZmluYWwgaW50IG5DaCA9IGVuY05jaDsKKyAgICAgICAgLy8gbGVuZ3RoIG9mIG9uZSAoTEIvSEIpIGJsb2NrIFtzYW1wbGVzXQorICAgICAgICBmaW5hbCBpbnQgbkJsa1NtcCA9IGRlY1BhcmFtcy5nZXRTYW1wbGluZ1JhdGUoKTsKKyAgICAgICAgLy8gbGVuZ3RoIG9mIG9uZSBzZWdtZW50IFtzYW1wbGVzXQorICAgICAgICBmaW5hbCBpbnQgblNlZ1NtcCA9IG5CbGtTbXAgLyBuU2VnUGVyQmxrOworICAgICAgICAvLyBhY3R1YWwgIyBzYW1wbGVzIHBlciBjaGFubmVsICh0b3RhbCkKKyAgICAgICAgZmluYWwgaW50IHNtcGxQZXJDaGFuID0gZGVjU2FtcGxlcy5sZW5ndGggLyBuQ2g7CisgICAgICAgIC8vIGFjdHVhbCAjIHNhbXBsZXMgcGVyIHNlZ21lbnQgKGFsbCBjaCkKKyAgICAgICAgZmluYWwgaW50IG5TZWdTbXBUb3QgPSBuU2VnU21wICogbkNoOworICAgICAgICAvLyBzaWduYWwgb2Zmc2V0IGJldHdlZW4gY2hhbnMgW3NlZ21lbnRzXQorICAgICAgICBmaW5hbCBpbnQgblNlZ0NoT2Zmc3QgPSAyICogblNlZ1BlckJsazsKKyAgICAgICAgLy8gLy8gdGhlIG51bWJlciBvZiBjaGFubmVscyB0byBiZSBhbmFseXplZAorICAgICAgICBmaW5hbCBpbnQgcHJvY05jaCA9IE1hdGgubWluKG5DaCwgZW5jTmNoKTsKKyAgICAgICAgLy8gYWxsIG9yaWdpbmFsIGNvbmZpZ3Mgd2l0aCBtb3JlIHRoYW4gZml2ZSBjaGFubmVsIGhhdmUgYW4gTEZFCisgICAgICAgIGZpbmFsIGludCBlbmNFZmZOY2ggPSAoZW5jTmNoID4gNSkgPyBlbmNOY2gtMSA6IGVuY05jaDsKKyAgICAgICAgLy8gZXhwZWN0ZWQgbnVtYmVyIG9mIGRlY29kZWQgYXVkaW8gc2FtcGxlcworICAgICAgICBmaW5hbCBpbnQgZXhwU21wbFBlckNoYW4gPSBNYXRoLm1heChlbmNFZmZOY2gsIDIpICogblNlZ0NoT2Zmc3QgKiBuU2VnU21wOworICAgICAgICAvLyBmbGFnIHRlbGxpbmcgdGhhdCBpbnB1dCBpcyBkbXggc2lnbmFsCisgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNEbXggPSBuQ2ggPCBlbmNOY2g7CisgICAgICAgIGZpbmFsIGZsb2F0IG5yZ1JhdGlvVGhyZXNoID0gMC4wZjsKKyAgICAgICAgLy8gdGhlIG51bSBhbmFseXplZCBjaGFubmVscyB3aXRoIHNpZ25hbAorICAgICAgICBpbnQgZWZmUHJvY05jaCA9IHByb2NOY2g7CisKKyAgICAgICAgLy8gZ2V0IHRoZSBzaWduYWwgb2Zmc2V0IGJ5IGNvdW50aW5nIHplcm8gc2FtcGxlcyBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgKG92ZXIgYWxsIGNoYW5uZWxzKQorICAgICAgICAvLyBzYW1wbGUgdmFsdWUgdGhyZXNob2xkIDQgc2lnbmFsIHNlYXJjaAorICAgICAgICBmaW5hbCBpbnQgemVyb1NpZ1RocmVzaCA9IDE7CisgICAgICAgIC8vIHJlY2VpdmVzIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0aGF0IGFyZSBpbiBmcm9udCBvZiB0aGUgYWN0dWFsIHNpZ25hbAorICAgICAgICBpbnQgc2lnbmFsU3RhcnQgPSBzbXBsUGVyQ2hhbjsKKyAgICAgICAgLy8gcmVjZWl2ZXMgdGhlIG51bWJlciBvZiBudWxsIHNhbXBsZXMgKHBlciBjaGFuKSBhdCB0aGUgdmVyeSBiZWdpbm5pbmcKKyAgICAgICAgaW50IG5vaXNlU3RhcnQgPSBzaWduYWxTdGFydDsKKworICAgICAgICBmb3IgKGludCBzbXBsID0gMDsgc21wbCA8IGRlY1NhbXBsZXMubGVuZ3RoOyBzbXBsKyspIHsKKyAgICAgICAgICAgIGludCB2YWx1ZSA9IE1hdGguYWJzKGRlY1NhbXBsZXNbc21wbF0pOworCisgICAgICAgICAgICBpZiAodmFsdWUgPiAwICYmIG5vaXNlU3RhcnQgPT0gc2lnbmFsU3RhcnQpIHsKKyAgICAgICAgICAgICAgICAvLyBzdG9yZSBzdGFydCBvZiBwcmVwZW5kZWQgbm9pc2UgKGNhbiBiZSBzYW1lIGFzIHNpZ25hbFN0YXJ0KQorICAgICAgICAgICAgICAgIG5vaXNlU3RhcnQgPSBzbXBsIC8gbkNoOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodmFsdWUgPiB6ZXJvU2lnVGhyZXNoKSB7CisgICAgICAgICAgICAgICAgLy8gc3RvcmUgc2lnbmFsIHN0YXJ0IG9mZnNldCBbc2FtcGxlc10KKyAgICAgICAgICAgICAgICBzaWduYWxTdGFydCA9IHNtcGwgLyBuQ2g7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzaWduYWxTdGFydCA9IChzaWduYWxTdGFydCA+IG5vaXNlU3RhcnQrMSkgPyBzaWduYWxTdGFydCA6IG5vaXNlU3RhcnQ7CisKKyAgICAgICAgLy8gY2hlY2sgaWYgdGhlIGRlY29kZXIgcmVwcm9kdWNlZCBhIHdhdmVmb3JtIG9yIGtlcHQgc2lsZW50CisgICAgICAgIGFzc2VydFRydWUgKCJubyBzaWduYWwgZm91bmQgaW4gYW55IGNoYW5uZWwhIiwgc2lnbmFsU3RhcnQgPCBzbXBsUGVyQ2hhbik7CisKKyAgICAgICAgLy8gbWF4IG51bSBzZWcgdGhhdCBmaXQgaW50byBzaWduYWwKKyAgICAgICAgZmluYWwgaW50IHRvdFNlZyA9IChzbXBsUGVyQ2hhbiAtIHNpZ25hbFN0YXJ0KSAvIG5TZWdTbXA7CisgICAgICAgIC8vIG1heCBudW0gcmVsZXZhbnQgc2FtcGxlcyAocGVyIGNoYW5uZWwpCisgICAgICAgIGZpbmFsIGludCB0b3RTbXAgPSBuU2VnU21wICogdG90U2VnOworCisgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBudW1iZXIgb2YgcmVwcm9kdWNlZCBzZWdtZW50cyBpbiB0aGUgYXVkaW8gZmlsZSBpcyB2YWxpZAorICAgICAgICBhc3NlcnRUcnVlKCJubyBzZWdtZW50cyBsZWZ0IHRvIHRlc3QgYWZ0ZXIgc2lnbmFsIHNlYXJjaCIsIHRvdFNlZyA+IDApOworCisgICAgICAgIC8vIGdldCB0aGUgZW5lcmdpZXMgYW5kIHRoZSBjaGFubmVsIG9mZnNldHMgYnkgc2VhcmNoaW5nIGZvciB0aGUgZmlyc3Qgc2VnbWVudCBhYm92ZSB0aGUKKyAgICAgICAgLy8gZW5lcmd5IHRocmVzaG9sZDoKKyAgICAgICAgLy8gcmF0aW8gb2YgemVyb05yZ1RocmVzaCB0byB0aGUgbWF4IG5yZworICAgICAgICBmaW5hbCBkb3VibGUgemVyb01heE5yZ1JhdGlvID0gMC4wMDFmOworICAgICAgICAvLyB0aHJlc2hvbGQgdG8gY2xhc3NpZnkgc2VnbWVudCBlbmVyZ2llcworICAgICAgICBkb3VibGUgemVyb05yZ1RocmVzaCA9IG5TZWdTbXAgKiBuU2VnU21wOworICAgICAgICAvLyB3aWxsIHN0b3JlIHRoZSBtYXggc2VnIG5yZyBvdmVyIGFsbCBjaAorICAgICAgICBkb3VibGUgdG90TWF4TnJnID0gMC4wZjsKKyAgICAgICAgLy8gYXJyYXkgcmVjZWl2aW5nIHRoZSBzZWdtZW50IGVuZXJnaWVzCisgICAgICAgIGRvdWJsZVtdW10gbnJnID0gbmV3IGRvdWJsZVtwcm9jTmNoXVt0b3RTZWddOworICAgICAgICAvLyBhcnJheSBmb3IgY2hhbm5lbCBvZmZzZXRzCisgICAgICAgIGludFtdIG9mZnNldCA9IG5ldyBpbnRbcHJvY05jaF07CisgICAgICAgIC8vIGFycmF5IHJlY2VpdmluZyB0aGUgc2VnbWVudCBlbmVyZ3kgc3RhdHVzIG92ZXIgYWxsIGNoYW5uZWxzCisgICAgICAgIGJvb2xlYW5bXSBzaWdTZWcgPSBuZXcgYm9vbGVhblt0b3RTZWddOworICAgICAgICAvLyBlbmVyZ3kgcGVyIGNoYW5uZWwKKyAgICAgICAgZG91YmxlW10gbnJnUGVyQ2hhbm5lbCA9IG5ldyBkb3VibGVbcHJvY05jaF07CisgICAgICAgIC8vIHJldHVybiB2YWx1ZTogWzBdOiB0b3RhbCBlbmVyZ3kgb2YgYWxsIGNoYW5uZWxzCisgICAgICAgIC8vICAgICAgICAgICAgICAgWzEgLi4uIHByb2NOY2ggKyAxXTogZW5lcmd5IG9mIHRoZSBpbmRpdmlkdWFsIGNoYW5uZWxzCisgICAgICAgIGZsb2F0W10gbnJnVG90YWwgPSBuZXcgZmxvYXRbcHJvY05jaCArIDFdOworICAgICAgICAvLyBtYXBwaW5nIGFycmF5IHRvIHNvcnQgY2hhbm5lbHMKKyAgICAgICAgaW50W10gY2hNYXAgPSBuZXcgaW50W25DaF07CisKKyAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSBzZWdtZW50YWwgZW5lcmd5IGZvciBlYWNoIGNoYW5uZWwKKyAgICAgICAgZm9yIChpbnQgY2ggPSAwOyBjaCA8IHByb2NOY2g7IGNoKyspIHsKKyAgICAgICAgICAgIG9mZnNldFtjaF0gPSAtMTsKKworICAgICAgICAgICAgZm9yIChpbnQgc2VnID0gMDsgc2VnIDwgdG90U2VnOyBzZWcrKykgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBzbXBTdGFydCA9IChzaWduYWxTdGFydCAqIG5DaCkgKyAoc2VnICogblNlZ1NtcFRvdCkgKyBjaDsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc21wU3RvcCA9IHNtcFN0YXJ0ICsgblNlZ1NtcFRvdDsKKworICAgICAgICAgICAgICAgIGZvciAoaW50IHNtcGwgPSBzbXBTdGFydDsgc21wbCA8IHNtcFN0b3A7IHNtcGwgKz0gbkNoKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGFjY3VtdWxhdGUgdG90YWwgZW5lcmd5IHBlciBjaGFubmVsCisgICAgICAgICAgICAgICAgICAgIG5yZ1BlckNoYW5uZWxbY2hdICs9IGRlY1NhbXBsZXNbc21wbF0gKiBkZWNTYW1wbGVzW3NtcGxdOworICAgICAgICAgICAgICAgICAgICAvLyBhY2N1bXVsYXRlIHNlZ21lbnQgZW5lcmd5CisgICAgICAgICAgICAgICAgICAgIG5yZ1tjaF1bc2VnXSArPSBucmdQZXJDaGFubmVsW2NoXTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBzdG9yZSAxc3Qgc2VnbWVudCAoaW5kZXgpIHBlciBjaGFubmVsIHdoaWNoIGhhcyBlbmVyZ3kgYWJvdmUgdGhlIHRocmVzaG9sZCB0byBnZXQKKyAgICAgICAgICAgICAgICAvLyB0aGUgY2ggb2Zmc2V0cworICAgICAgICAgICAgICAgIGlmIChucmdbY2hdW3NlZ10gPiB6ZXJvTnJnVGhyZXNoICYmIG9mZnNldFtjaF0gPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldFtjaF0gPSBzZWcgLyBuU2VnQ2hPZmZzdDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBzdG9yZSB0aGUgbWF4IHNlZ21lbnQgbnJnIG92ZXIgYWxsIGNoCisgICAgICAgICAgICAgICAgaWYgKG5yZ1tjaF1bc2VnXSA+IHRvdE1heE5yZykgeworICAgICAgICAgICAgICAgICAgICB0b3RNYXhOcmcgPSBucmdbY2hdW3NlZ107CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gc3RvcmUgd2hldGhlciB0aGUgY2hhbm5lbCBoYXMgZW5lcmd5IGluIHRoaXMgc2VnbWVudAorICAgICAgICAgICAgICAgIHNpZ1NlZ1tzZWddIHw9IG5yZ1tjaF1bc2VnXSA+IHplcm9OcmdUaHJlc2g7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGlmIG9uZSBjaGFubmVsIGhhcyBubyBzaWduYWwgaXQgaXMgbW9zdCBwcm9iYWJseSB0aGUgTEZFIHRoZSBMRkUgaXMgbm8KKyAgICAgICAgICAgIC8vIGVmZmVjdGl2ZSBjaGFubmVsCisgICAgICAgICAgICBpZiAob2Zmc2V0W2NoXSA8IDApIHsKKyAgICAgICAgICAgICAgICBlZmZQcm9jTmNoIC09IDE7CisgICAgICAgICAgICAgICAgb2Zmc2V0W2NoXSA9IGVmZlByb2NOY2g7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHJlY2FsY3VsYXRlIHRoZSB6ZXJvIHNpZ25hbCB0aHJlc2hvbGQgYmFzZWQgb24gdGhlIDFzdCBjaGFubmVscyBtYXggZW5lcmd5IGZvcgorICAgICAgICAgICAgLy8gYWxsIHN1YnNlcXVlbnQgY2hlY2tzCisgICAgICAgICAgICBpZiAoY2ggPT0gMCkgeworICAgICAgICAgICAgICAgIHplcm9OcmdUaHJlc2ggPSB6ZXJvTWF4TnJnUmF0aW8gKiB0b3RNYXhOcmc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBjaGVjayBpZiB0aGUgTEZFIGlzIGRlY29kZWQgcHJvcGVybHkKKyAgICAgICAgYXNzZXJ0VHJ1ZSgibW9yZSB0aGFuIG9uZSBMRkUgZGV0ZWN0ZWQiLCBlZmZQcm9jTmNoID49IHByb2NOY2ggLSAxKTsKKworICAgICAgICAvLyBjaGVjayBpZiB0aGUgYW1vdW50IG9mIHNhbXBsZXMgaXMgdmFsaWQKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJsZXNzIHNhbXBsZXMgZGVjb2RlZCB0aGFuIGV4cGVjdGVkOiAlZCA8ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY1NhbXBsZXMubGVuZ3RoIC0gKHNpZ25hbFN0YXJ0ICogbkNoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdFNtcCAqIGVmZlByb2NOY2gpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjU2FtcGxlcy5sZW5ndGggLSAoc2lnbmFsU3RhcnQgKiBuQ2gpID49IHRvdFNtcCAqIGVmZlByb2NOY2gpOworCisgICAgICAgIC8vIGZvciBtdWx0aS1jaGFubmVsIHNpZ25hbHMgdGhlIG9ubHkgdmFsaWQgZnJvbnQgY2hhbm5lbCBvcmRlcnMKKyAgICAgICAgLy8gYXJlIEwsIFIsIEMgb3IgQywgTCwgUiAoTD1sZWZ0LCBSPXJpZ2h0LCBDPWNlbnRlcikKKyAgICAgICAgaWYgKHByb2NOY2ggPj0gNSkgeworICAgICAgICAgICAgZmluYWwgaW50W10gZnJvbnRDaE1hcDEgPSB7MiwgMCwgMX07CisgICAgICAgICAgICBmaW5hbCBpbnRbXSBmcm9udENoTWFwMiA9IHswLCAxLCAyfTsKKworICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIGNoYW5uZWwgbWFwcGluZyBpcyB2YWxpZAorICAgICAgICAgICAgaWYgKCEoQXJyYXlzLmVxdWFscyhBcnJheXMuY29weU9mUmFuZ2Uob2Zmc2V0LCAwLCAzKSwgZnJvbnRDaE1hcDEpCisgICAgICAgICAgICAgICAgICAgIHx8IEFycmF5cy5lcXVhbHMoQXJyYXlzLmNvcHlPZlJhbmdlKG9mZnNldCwgMCwgMyksIGZyb250Q2hNYXAyKSkpIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJ3cm9uZyBmcm9udCBjaGFubmVsIG1hcHBpbmciKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGNyZWF0ZSBtYXBwaW5nIHRhYmxlIHRvIGFkZHJlc3MgY2hhbm5lbHMgZnJvbSBmcm9udCB0byBiYWNrIHRoZSBMRkUgbXVzdCBiZSBsYXN0CisgICAgICAgIGlmIChkcmNDb250ZXh0ID09IDApIHsKKyAgICAgICAgICAgIC8vIGNoZWNrIHdoZXRoZXIgZXZlcnkgY2hhbm5lbCBvY2N1cnMgZXhhY3RseSBvbmNlCisgICAgICAgICAgICBmb3IgKGludCBjaCA9IDA7IGNoIDwgZWZmUHJvY05jaDsgY2grKykgeworICAgICAgICAgICAgICAgIGludCBvY2N1cnJlZCA9IDA7CisKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpZHggPSAwOyBpZHggPCBwcm9jTmNoOyBpZHgrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0W2lkeF0gPT0gY2gpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9jY3VycmVkICs9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBjaE1hcFtjaF0gPSBpZHg7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiBvbmUgY2hhbm5lbCBpcyBtYXBwZWQgbW9yZSB0aGFuIG9uZSB0aW1lCisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJjaGFubmVsICVkIG9jY3VycyAlZCB0aW1lcyBpbiB0aGUgbWFwcGluZyIsIGNoLCBvY2N1cnJlZCksCisgICAgICAgICAgICAgICAgICAgICAgICBvY2N1cnJlZCA9PSAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaW50IGNoID0gMDsgY2ggPCBwcm9jTmNoOyBjaCsrKSB7CisgICAgICAgICAgICAgICAgY2hNYXBbY2hdID0gY2g7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyByZWZlcmVuY2UgbWluIGVuZXJneSBmb3IgdGhlIDFzdCBjaDsgb3RoZXJzIHdpbGwgYmUgY29tcGFyZWQgYWdhaW5zdCAxc3QKKyAgICAgICAgZG91YmxlIHJlZk1pbk5yZyA9IHplcm9OcmdUaHJlc2g7CisKKyAgICAgICAgLy8gY2FsY3VsYXRlIHRvdGFsIGVuZXJneSwgbWluIGFuZCBtYXggZW5lcmd5CisgICAgICAgIGZvciAoaW50IGNoID0gMDsgY2ggPCBwcm9jTmNoOyBjaCsrKSB7CisgICAgICAgICAgICAvLyByZXNvbHZlIGNoYW5uZWwgbWFwcGluZworICAgICAgICAgICAgaW50IGlkeCA9IGNoTWFwW2NoXTsKKyAgICAgICAgICAgIC8vIHNpZ25hbCBvZmZzZXQgW3NlZ21lbnRzXQorICAgICAgICAgICAgZmluYWwgaW50IG9mc3QgPSBvZmZzZXRbaWR4XSAqIG5TZWdDaE9mZnN0OworCisgICAgICAgICAgICBpZiAoY2ggPD0gZWZmUHJvY05jaCAmJiBvZnN0IDwgdG90U2VnKSB7CisgICAgICAgICAgICAgICAgLy8gdGhlIGxhc3Qgc2VnbWVudCB0aGF0IGhhcyBlbmVyZ3kKKyAgICAgICAgICAgICAgICBpbnQgbnJnU2VnRW5kOworICAgICAgICAgICAgICAgIC8vIHRoZSBudW1iZXIgb2Ygc2VnbWVudHMgd2l0aCBlbmVyZ3kKKyAgICAgICAgICAgICAgICBpbnQgbnJnU2VnOworCisgICAgICAgICAgICAgICAgaWYgKGRyY0NvbnRleHQgPT0gMCkgeworCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBmaXJzdCBjaGFubmVsIG9mIGEgbW9ubyBvciBzdGVyZW8gc2lnbmFsIGhhcyBmdWxsIHNpZ25hbCBhbGwgb3RoZXJzIGhhdmUKKyAgICAgICAgICAgICAgICAgICAgLy8gb25lIExCICsgb25lIEhCIGJsb2NrCisgICAgICAgICAgICAgICAgICAgIGlmICgoZW5jTmNoIDw9IDIpICYmIChjaCA9PSAwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbnJnU2VnID0gdG90U2VnOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbnJnU2VnID0gTWF0aC5taW4odG90U2VnLCAoMiAqIG5TZWdQZXJCbGspICsgb2ZzdCkgLSBvZnN0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbnJnU2VnID0gdG90U2VnOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG5yZ1NlZ0VuZCA9IG9mc3QgKyBucmdTZWc7CisKKyAgICAgICAgICAgICAgICAvLyBmaW5kIG1pbiBhbmQgbWF4IGVuZXJneSBvZiBhbGwgc2VnbWVudHMgdGhhdCBzaG91bGQgaGF2ZSBzaWduYWwKKyAgICAgICAgICAgICAgICBkb3VibGUgbWluTnJnID0gbnJnW2lkeF1bb2ZzdF07IC8vIGNoYW5uZWxzIG1pbmltdW0gc2VnbWVudCBlbmVyZ3kKKyAgICAgICAgICAgICAgICBkb3VibGUgbWF4TnJnID0gbnJnW2lkeF1bb2ZzdF07IC8vIGNoYW5uZWxzIG1heGltdW0gc2VnbWVudCBlbmVyZ3kKKworICAgICAgICAgICAgICAgIC8vIHZhbHVlcyBvZiAxc3Qgc2VnbWVudCBhbHJlYWR5IGFzc2lnbmVkCisgICAgICAgICAgICAgICAgZm9yIChpbnQgc2VnID0gb2ZzdCArIDE7IHNlZyA8IG5yZ1NlZ0VuZDsgc2VnKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5yZ1tpZHhdW3NlZ10gPCBtaW5OcmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbk5yZyA9IG5yZ1tpZHhdW3NlZ107CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAobnJnW2lkeF1bc2VnXSA+IG1heE5yZykgeworICAgICAgICAgICAgICAgICAgICAgICAgbWF4TnJnID0gbnJnW2lkeF1bc2VnXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBlbmVyZ3kgb2YgdGhpcyBjaGFubmVsIGlzID4gMAorICAgICAgICAgICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgibWF4IGVuZXJneSBvZiBjaGFubmVsICVkIGlzIHplcm8iLCBjaCksbWF4TnJnID4gMC4wZik7CisKKyAgICAgICAgICAgICAgICBpZiAoZHJjQ29udGV4dCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRoZSBjaGFubmVscyBtaW5pbXVtIGVuZXJneSA+PSByZWZNaW5OcmcKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJjaGFubmVsICVkIGhhcyBub3QgZW5vdWdoIGVuZXJneSIsIGNoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5OcmcgPj0gcmVmTWluTnJnKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlIDg1JSBvZiAxc3QgY2hhbm5lbHMgbWluIGVuZXJneSBhcyByZWZlcmVuY2UgdGhlIG90aGVyIGNocyBtdXN0IG1lZXQKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZk1pbk5yZyA9IG1pbk5yZyAqIDAuODVmOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzRG14ICYmIChjaCA9PSAxKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gY2FzZSBvZiBkb3dubWl4ZWQgc2lnbmFsIHRoZSBlbmVyZ3kgY2FuIGJlIGxvd2VyIGRlcGVuZGluZyBvbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZk1pbk5yZyAqPSAwLjUwZjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSBhbmQgY2hlY2sgdGhlIGVuZXJneSByYXRpbworICAgICAgICAgICAgICAgICAgICBmaW5hbCBkb3VibGUgbnJnUmF0aW8gPSBtaW5OcmcgLyBtYXhOcmc7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHRocmVzaG9sZCBpcyBleGNlZWRlZAorICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoImVuZXJneSByYXRpbyBvZiBjaGFubmVsICVkIGJlbG93IHRocmVzaG9sZCIsIGNoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBucmdSYXRpbyA+PSBucmdSYXRpb1RocmVzaCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0RteCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5yZ1NlZ0VuZCA8IHRvdFNlZykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNpZGVyIHRoYXQgc29tZSBub2lzZSBjYW4gZXh0ZW5kIGludG8gdGhlIHN1YnNlcXVlbnQgc2VnbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG93IHRoaXMgdG8gYmUgYXQgbWF4IDIwJSBvZiB0aGUgY2hhbm5lbHMgbWluaW11bSBlbmVyZ3kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgibWluIGVuZXJneSBhZnRlciBub2lzZSBhYm92ZSB0aHJlc2hvbGQgKCUuMmYpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5yZ1tpZHhdW25yZ1NlZ0VuZF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnJnW2lkeF1bbnJnU2VnRW5kXSA8IG1pbk5yZyAqIDAuMjBmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBucmdTZWdFbmQgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBhbGwgc3Vic2VxdWVudCBzZWdtZW50cyBpbiBjYXNlIG9mIGEgZG93bm1peGVkIHNpZ25hbAorICAgICAgICAgICAgICAgICAgICAgICAgbnJnU2VnRW5kID0gdG90U2VnOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gemVyby1vdXQgdGhlIHZlcmlmaWVkIGVuZXJnaWVzIHRvIHNpbXBsaWZ5IHRoZSBzdWJzZXF1ZW50IGNoZWNrCisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IHNlZyA9IG9mc3Q7IHNlZyA8IG5yZ1NlZ0VuZDsgc2VnKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5yZ1tpZHhdW3NlZ10gPSAwLjBmOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgemVybyBzaWduYWwgcGFydHMKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgc2VnID0gMDsgc2VnIDwgdG90U2VnOyBzZWcrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJzZWdtZW50ICVkIGluIGNoYW5uZWwgJWQgaGFzIHNpZ25hbCB3aGVyZSBzaG91bGQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJiZSBub25lICglLjJmKSIsIHNlZywgY2gsIG5yZ1tpZHhdW3NlZ10pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBucmdbaWR4XVtzZWddIDwgemVyb05yZ1RocmVzaCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHRlc3Qgd2hldGhlciBlYWNoIHNlZ21lbnQgaGFzIGVuZXJneSBpbiBhdCBsZWFzdCBvbmUgY2hhbm5lbAorICAgICAgICAgICAgZm9yIChpbnQgc2VnID0gMDsgc2VnIDwgdG90U2VnOyBzZWcrKykgeworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgibm8gY2hhbm5lbCBoYXMgZW5lcmd5IGluIHNlZ21lbnQgJWQiLCBzZWcpLCBzaWdTZWdbc2VnXSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG5yZ1RvdGFsWzBdICAgICArPSAoZmxvYXQpbnJnUGVyQ2hhbm5lbFtjaF07CisgICAgICAgICAgICBucmdUb3RhbFtjaCArIDFdID0gKGZsb2F0KW5yZ1BlckNoYW5uZWxbY2hdOworICAgICAgICB9CisKKyAgICAgICAgZmxvYXQgZXJyb3JNYXJnaW4gPSAwLjBmOworICAgICAgICBpZiAoZHJjQXBwbGllZCA9PSAwKSB7CisgICAgICAgICAgICBlcnJvck1hcmdpbiA9IDAuMjVmOworICAgICAgICB9IGVsc2UgaWYgKGRyY0FwcGxpZWQgPT0gMSkgeworICAgICAgICAgICAgZXJyb3JNYXJnaW4gPSAwLjQwZjsKKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IHRvdFNlZ0VuZXJneSA9IDAuMGY7CisgICAgICAgIGZsb2F0W10gc2VnRW5lcmd5ID0gbmV3IGZsb2F0W3RvdFNlZ107CisgICAgICAgIGZvciAoaW50IHNlZyA9IHRvdFNlZyAtIDE7IHNlZyA+PSAwOyBzZWctLSkgeworICAgICAgICAgICAgaWYgKHNlZyAhPSAwKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgY2ggPSAwOyBjaCA8IG5DaDsgY2grKykgeworICAgICAgICAgICAgICAgICAgICBzZWdFbmVyZ3lbc2VnXSArPSBucmdbY2hdW3NlZ10gLSBucmdbY2hdW3NlZyAtIDFdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0b3RTZWdFbmVyZ3kgKz0gc2VnRW5lcmd5W3NlZ107CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGNoID0gMDsgY2ggPCBuQ2g7IGNoKyspIHsKKyAgICAgICAgICAgICAgICAgICAgc2VnRW5lcmd5W3NlZ10gKz0gbnJnW2NoXVtzZWddOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmbG9hdCBhdmdTZWdFbmVyZ3kgPSB0b3RTZWdFbmVyZ3kgLyAodG90U2VnIC0gMSk7CisgICAgICAgIGZvciAoaW50IHNlZyA9IDE7IHNlZyA8IHRvdFNlZzsgc2VnKyspIHsKKyAgICAgICAgICAgIGZsb2F0IGVuZXJneVJhdGlvID0gc2VnRW5lcmd5W3NlZ10gLyBhdmdTZWdFbmVyZ3k7CisgICAgICAgICAgICBpZiAoKGVuZXJneVJhdGlvID4gKDEuMGYgKyBlcnJvck1hcmdpbikgKSB8fCAoZW5lcmd5UmF0aW8gPCAoMS4wZiAtIGVycm9yTWFyZ2luKSApKSB7CisgICAgICAgICAgICAgICAgZmFpbCgiRW5lcmd5IGRyb3Agb3V0Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyByZXR1cm4gbnJnVG90YWw6IFswXTogYWNjdW11bGF0ZWQgZW5lcmd5IG9mIGFsbCBjaGFubmVscywgWzEgLi4uIF0gY2hhbm5lbCBlbmVyZ2llcworICAgICAgICByZXR1cm4gbnJnVG90YWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVjb2RlcyBhIGNvbXByZXNzZWQgYml0c3RyZWFtIGluIHRoZSBJU09CTUZGIGludG8gdGhlIFJBTSBvZiB0aGUgZGV2aWNlLgorICAgICAqCisgICAgICogVGhlIGRlY29kZXIgZGVjb2RlcyBjb21wcmVzc2VkIGF1ZGlvIGRhdGEgYXMgc3RvcmVkIGluIHRoZSBJU08gQmFzZSBNZWRpYSBGaWxlIEZvcm1hdAorICAgICAqIChJU09CTUZGKSBha2EgLm1wNC8ubTRhLiBUaGUgZGVjb2RlciBpcyBub3QgcmVwcm9kdWNpbmcgdGhlIHdhdmVmb3JtIGJ1dCBzdG9yZXMgdGhlIGRlY29kZWQKKyAgICAgKiBzYW1wbGVzIGluIHRoZSBSQU0gb2YgdGhlIGRldmljZSB1bmRlciB0ZXN0LgorICAgICAqCisgICAgICogQHBhcmFtIGF1ZGlvUGFyYW1zIHRoZSBkZWNvZGVyIHBhcmFtZXRlciBjb25maWd1cmF0aW9uCisgICAgICogQHBhcmFtIHRlc3RpbnB1dCB0aGUgY29tcHJlc3NlZCBhdWRpbyBzdHJlYW0KKyAgICAgKiBAcGFyYW0gZW9zc2FtcGxlIHRoZSBFbmQtT2YtU3RyZWFtIGluZGljYXRvcgorICAgICAqIEBwYXJhbSB0aW1lc3RhbXBzIHRoZSB0aW1lIHN0YW1wcyB0byBkZWNvZGUKKyAgICAgKiBAcGFyYW0gZHJjUGFyYW1zIHRoZSBNUEVHLUQgRFJDIGRlY29kZXIgcGFyYW1ldGVyIGNvbmZpZ3VyYXRpb24KKyAgICAgKiBAcGFyYW0gZGVjb2Rlck5hbWUgaWYgbm9uIG51bGwsIHRoZSBuYW1lIG9mIHRoZSBkZWNvZGVyIHRvIHVzZSBmb3IgdGhlIGRlY29kaW5nLCBvdGhlcndpc2UKKyAgICAgKiAgICAgdGhlIGRlZmF1bHQgZGVjb2RlciBmb3IgdGhlIGZvcm1hdCB3aWxsIGJlIHVzZWQKKyAgICAgKiBAdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc2hvcnRbXSBkZWNvZGVUb01lbW9yeShBdWRpb1BhcmFtZXRlciBhdWRpb1BhcmFtcywgaW50IHRlc3RpbnB1dCwKKyAgICAgICAgICAgIGludCBlb3NzYW1wbGUsIExpc3Q8TG9uZz4gdGltZXN0YW1wcywgRHJjUGFyYW1zIGRyY1BhcmFtcywgU3RyaW5nIGRlY29kZXJOYW1lKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICAvLyBUT0RPOiBjb2RlIGlzIHRoZSBzYW1lIGFzIGluIERlY29kZXJUZXN0LCBkaWZmZXJlbmNlcyBhcmU6CisgICAgICAgIC8vICAgICAgICAgIC0gYWRkaXRpb24gb2YgYXBwbGljYXRpb24gb2YgRFJDIHBhcmFtZXRlcnMKKyAgICAgICAgLy8gICAgICAgICAgLSBubyBuZWVkL3VzZSBvZiByZXNldE1vZGUsIGNvbmZpZ01vZGUKKyAgICAgICAgLy8gICAgICAgU3BsaXQgbWV0aG9kIHNvIGNvZGUgY2FuIGJlIHNoYXJlZAorCisgICAgICAgIGZpbmFsIFN0cmluZyBsb2NhbFRhZyA9IFRBRyArICIjZGVjb2RlVG9NZW1vcnkiOworICAgICAgICBzaG9ydCBbXSBkZWNvZGVkID0gbmV3IHNob3J0WzBdOworICAgICAgICBpbnQgZGVjb2RlZElkeCA9IDA7CisKKyAgICAgICAgQXNzZXRGaWxlRGVzY3JpcHRvciB0ZXN0RmQgPSBtUmVzb3VyY2VzLm9wZW5SYXdSZXNvdXJjZUZkKHRlc3RpbnB1dCk7CisKKyAgICAgICAgTWVkaWFFeHRyYWN0b3IgZXh0cmFjdG9yOworICAgICAgICBNZWRpYUNvZGVjIGNvZGVjOworICAgICAgICBCeXRlQnVmZmVyW10gY29kZWNJbnB1dEJ1ZmZlcnM7CisgICAgICAgIEJ5dGVCdWZmZXJbXSBjb2RlY091dHB1dEJ1ZmZlcnM7CisKKyAgICAgICAgZXh0cmFjdG9yID0gbmV3IE1lZGlhRXh0cmFjdG9yKCk7CisgICAgICAgIGV4dHJhY3Rvci5zZXREYXRhU291cmNlKHRlc3RGZC5nZXRGaWxlRGVzY3JpcHRvcigpLCB0ZXN0RmQuZ2V0U3RhcnRPZmZzZXQoKSwKKyAgICAgICAgICAgICAgICB0ZXN0RmQuZ2V0TGVuZ3RoKCkpOworICAgICAgICB0ZXN0RmQuY2xvc2UoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIndyb25nIG51bWJlciBvZiB0cmFja3MiLCAxLCBleHRyYWN0b3IuZ2V0VHJhY2tDb3VudCgpKTsKKyAgICAgICAgTWVkaWFGb3JtYXQgZm9ybWF0ID0gZXh0cmFjdG9yLmdldFRyYWNrRm9ybWF0KDApOworICAgICAgICBTdHJpbmcgbWltZSA9IGZvcm1hdC5nZXRTdHJpbmcoTWVkaWFGb3JtYXQuS0VZX01JTUUpOworICAgICAgICBhc3NlcnRUcnVlKCJub3QgYW4gYXVkaW8gZmlsZSIsIG1pbWUuc3RhcnRzV2l0aCgiYXVkaW8vIikpOworCisgICAgICAgIE1lZGlhRm9ybWF0IGNvbmZpZ0Zvcm1hdCA9IGZvcm1hdDsKKyAgICAgICAgaWYgKGRlY29kZXJOYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIGNvZGVjID0gTWVkaWFDb2RlYy5jcmVhdGVEZWNvZGVyQnlUeXBlKG1pbWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29kZWMgPSBNZWRpYUNvZGVjLmNyZWF0ZUJ5Q29kZWNOYW1lKGRlY29kZXJOYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHNldCBEUkMgcGFyYW1ldGVycworICAgICAgICBpZiAoZHJjUGFyYW1zICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvbmZpZ0Zvcm1hdC5zZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9BQUNfRFJDX0JPT1NUX0ZBQ1RPUiwgZHJjUGFyYW1zLm1Cb29zdCk7CisgICAgICAgICAgICBjb25maWdGb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfQUFDX0RSQ19BVFRFTlVBVElPTl9GQUNUT1IsIGRyY1BhcmFtcy5tQ3V0KTsKKyAgICAgICAgICAgIGlmIChkcmNQYXJhbXMubURlY29kZXJUYXJnZXRMZXZlbCAhPSAwKSB7CisgICAgICAgICAgICAgICAgY29uZmlnRm9ybWF0LnNldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0FBQ19EUkNfVEFSR0VUX1JFRkVSRU5DRV9MRVZFTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRyY1BhcmFtcy5tRGVjb2RlclRhcmdldExldmVsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbmZpZ0Zvcm1hdC5zZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9BQUNfRFJDX0hFQVZZX0NPTVBSRVNTSU9OLCBkcmNQYXJhbXMubUhlYXZ5KTsKKyAgICAgICAgICAgIGlmIChkcmNQYXJhbXMubUVmZmVjdFR5cGUgIT0gMCl7CisgICAgICAgICAgICAgICAgY29uZmlnRm9ybWF0LnNldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0FBQ19EUkNfRUZGRUNUX1RZUEUsCisgICAgICAgICAgICAgICAgICAgICAgICBkcmNQYXJhbXMubUVmZmVjdFR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgTG9nLnYobG9jYWxUYWcsICJjb25maWd1cmluZyB3aXRoICIgKyBjb25maWdGb3JtYXQpOworICAgICAgICBjb2RlYy5jb25maWd1cmUoY29uZmlnRm9ybWF0LCBudWxsIC8qIHN1cmZhY2UgKi8sIG51bGwgLyogY3J5cHRvICovLCAwIC8qIGZsYWdzICovKTsKKworICAgICAgICBjb2RlYy5zdGFydCgpOworICAgICAgICBjb2RlY0lucHV0QnVmZmVycyA9IGNvZGVjLmdldElucHV0QnVmZmVycygpOworICAgICAgICBjb2RlY091dHB1dEJ1ZmZlcnMgPSBjb2RlYy5nZXRPdXRwdXRCdWZmZXJzKCk7CisKKyAgICAgICAgZXh0cmFjdG9yLnNlbGVjdFRyYWNrKDApOworCisgICAgICAgIC8vIHN0YXJ0IGRlY29kaW5nCisgICAgICAgIGZpbmFsIGxvbmcga1RpbWVPdXRVcyA9IDUwMDA7CisgICAgICAgIE1lZGlhQ29kZWMuQnVmZmVySW5mbyBpbmZvID0gbmV3IE1lZGlhQ29kZWMuQnVmZmVySW5mbygpOworICAgICAgICBib29sZWFuIHNhd0lucHV0RU9TID0gZmFsc2U7CisgICAgICAgIGJvb2xlYW4gc2F3T3V0cHV0RU9TID0gZmFsc2U7CisgICAgICAgIGludCBub091dHB1dENvdW50ZXIgPSAwOworICAgICAgICBpbnQgc2FtcGxlY291bnRlciA9IDA7CisKKyAgICAgICAgLy8gbWFpbiBkZWNvZGluZyBsb29wCisgICAgICAgIHdoaWxlICghc2F3T3V0cHV0RU9TICYmIG5vT3V0cHV0Q291bnRlciA8IDUwKSB7CisgICAgICAgICAgICBub091dHB1dENvdW50ZXIrKzsKKyAgICAgICAgICAgIGlmICghc2F3SW5wdXRFT1MpIHsKKyAgICAgICAgICAgICAgICBpbnQgaW5wdXRCdWZJbmRleCA9IGNvZGVjLmRlcXVldWVJbnB1dEJ1ZmZlcihrVGltZU91dFVzKTsKKworICAgICAgICAgICAgICAgIGlmIChpbnB1dEJ1ZkluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBkc3RCdWYgPSBjb2RlY0lucHV0QnVmZmVyc1tpbnB1dEJ1ZkluZGV4XTsKKworICAgICAgICAgICAgICAgICAgICBpbnQgc2FtcGxlU2l6ZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0b3IucmVhZFNhbXBsZURhdGEoZHN0QnVmLCAwIC8qIG9mZnNldCAqLyk7CisKKyAgICAgICAgICAgICAgICAgICAgbG9uZyBwcmVzZW50YXRpb25UaW1lVXMgPSAwOworCisgICAgICAgICAgICAgICAgICAgIGlmIChzYW1wbGVTaXplIDwgMCAmJiBlb3NzYW1wbGUgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsKCJ0ZXN0IGlzIGJyb2tlbjogbmV2ZXIgcmVhY2hlZCBlb3Mgc2FtcGxlIik7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoc2FtcGxlU2l6ZSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInNhdyBpbnB1dCBFT1MuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBzYXdJbnB1dEVPUyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVTaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzYW1wbGVjb3VudGVyID09IGVvc3NhbXBsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhd0lucHV0RU9TID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZWNvdW50ZXIrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnRhdGlvblRpbWVVcyA9IGV4dHJhY3Rvci5nZXRTYW1wbGVUaW1lKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjb2RlYy5xdWV1ZUlucHV0QnVmZmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0QnVmSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBvZmZzZXQgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzZW50YXRpb25UaW1lVXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F3SW5wdXRFT1MgPyBNZWRpYUNvZGVjLkJVRkZFUl9GTEFHX0VORF9PRl9TVFJFQU0gOiAwKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIXNhd0lucHV0RU9TKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0b3IuYWR2YW5jZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgcmVzID0gY29kZWMuZGVxdWV1ZU91dHB1dEJ1ZmZlcihpbmZvLCBrVGltZU91dFVzKTsKKworICAgICAgICAgICAgaWYgKHJlcyA+PSAwKSB7CisgICAgICAgICAgICAgICAgLy9Mb2cuZChUQUcsICJnb3QgZnJhbWUsIHNpemUgIiArIGluZm8uc2l6ZSArICIvIiArIGluZm8ucHJlc2VudGF0aW9uVGltZVVzKTsKKworICAgICAgICAgICAgICAgIGlmIChpbmZvLnNpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIG5vT3V0cHV0Q291bnRlciA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlmICh0aW1lc3RhbXBzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcHMuYWRkKGluZm8ucHJlc2VudGF0aW9uVGltZVVzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGludCBvdXRwdXRCdWZJbmRleCA9IHJlczsKKyAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIGJ1ZiA9IGNvZGVjT3V0cHV0QnVmZmVyc1tvdXRwdXRCdWZJbmRleF07CisKKyAgICAgICAgICAgICAgICBpZiAoZGVjb2RlZElkeCArIChpbmZvLnNpemUgLyAyKSA+PSBkZWNvZGVkLmxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICBkZWNvZGVkID0gQXJyYXlzLmNvcHlPZihkZWNvZGVkLCBkZWNvZGVkSWR4ICsgKGluZm8uc2l6ZSAvIDIpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBidWYucG9zaXRpb24oaW5mby5vZmZzZXQpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5mby5zaXplOyBpICs9IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVjb2RlZFtkZWNvZGVkSWR4KytdID0gYnVmLmdldFNob3J0KCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY29kZWMucmVsZWFzZU91dHB1dEJ1ZmZlcihvdXRwdXRCdWZJbmRleCwgZmFsc2UgLyogcmVuZGVyICovKTsKKworICAgICAgICAgICAgICAgIGlmICgoaW5mby5mbGFncyAmIE1lZGlhQ29kZWMuQlVGRkVSX0ZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJzYXcgb3V0cHV0IEVPUy4iKTsKKyAgICAgICAgICAgICAgICAgICAgc2F3T3V0cHV0RU9TID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcyA9PSBNZWRpYUNvZGVjLklORk9fT1VUUFVUX0JVRkZFUlNfQ0hBTkdFRCkgeworICAgICAgICAgICAgICAgIGNvZGVjT3V0cHV0QnVmZmVycyA9IGNvZGVjLmdldE91dHB1dEJ1ZmZlcnMoKTsKKworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm91dHB1dCBidWZmZXJzIGhhdmUgY2hhbmdlZC4iKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzID09IE1lZGlhQ29kZWMuSU5GT19PVVRQVVRfRk9STUFUX0NIQU5HRUQpIHsKKyAgICAgICAgICAgICAgICBNZWRpYUZvcm1hdCBvZm9ybWF0ID0gY29kZWMuZ2V0T3V0cHV0Rm9ybWF0KCk7CisgICAgICAgICAgICAgICAgYXVkaW9QYXJhbXMuc2V0TnVtQ2hhbm5lbHMob2Zvcm1hdC5nZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9DSEFOTkVMX0NPVU5UKSk7CisgICAgICAgICAgICAgICAgYXVkaW9QYXJhbXMuc2V0U2FtcGxpbmdSYXRlKG9mb3JtYXQuZ2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfU0FNUExFX1JBVEUpKTsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvdXRwdXQgZm9ybWF0IGhhcyBjaGFuZ2VkIHRvICIgKyBvZm9ybWF0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZGVxdWV1ZU91dHB1dEJ1ZmZlciByZXR1cm5lZCAiICsgcmVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChub091dHB1dENvdW50ZXIgPj0gNTApIHsKKyAgICAgICAgICAgIGZhaWwoImRlY29kZXIgc3RvcHBlZCBvdXRwdXR0aW5nIGRhdGEiKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvZGVjLnN0b3AoKTsKKyAgICAgICAgY29kZWMucmVsZWFzZSgpOworICAgICAgICByZXR1cm4gZGVjb2RlZDsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL0R5bmFtaWNzUHJvY2Vzc2luZ1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9EeW5hbWljc1Byb2Nlc3NpbmdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ3ZTcwNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9EeW5hbWljc1Byb2Nlc3NpbmdUZXN0LmphdmEKQEAgLTAsMCArMSwxNTEyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLmN0czsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEuY3RzLlI7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvRm9ybWF0OworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpb2Z4LkF1ZGlvRWZmZWN0OworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW9meC5EeW5hbWljc1Byb2Nlc3Npbmc7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpb2Z4LkR5bmFtaWNzUHJvY2Vzc2luZy5CYW5kQmFzZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvZnguRHluYW1pY3NQcm9jZXNzaW5nLkJhbmRTdGFnZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvZnguRHluYW1pY3NQcm9jZXNzaW5nLkNoYW5uZWw7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpb2Z4LkR5bmFtaWNzUHJvY2Vzc2luZy5FcTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvZnguRHluYW1pY3NQcm9jZXNzaW5nLkVxQmFuZDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvZnguRHluYW1pY3NQcm9jZXNzaW5nLkxpbWl0ZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpb2Z4LkR5bmFtaWNzUHJvY2Vzc2luZy5NYmM7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpb2Z4LkR5bmFtaWNzUHJvY2Vzc2luZy5NYmNCYW5kOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK3B1YmxpYyBjbGFzcyBEeW5hbWljc1Byb2Nlc3NpbmdUZXN0IGV4dGVuZHMgUG9zdFByb2NUZXN0QmFzZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkR5bmFtaWNzUHJvY2Vzc2luZ1Rlc3QiOworICAgIHByaXZhdGUgRHluYW1pY3NQcm9jZXNzaW5nIG1EUDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNSU5fQ0hBTk5FTF9DT1VOVCA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgRVBTSUxPTiA9IDAuMDAwMDFmOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1ZBUklBTlQgPQorICAgICAgICAgICAgRHluYW1pY3NQcm9jZXNzaW5nLlZBUklBTlRfRkFWT1JfRlJFUVVFTkNZX1JFU09MVVRJT047CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUZBVUxUX1BSRUVRX0lOX1VTRSA9IHRydWU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfUFJFRVFfQkFORF9DT1VOVCA9IDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUZBVUxUX01CQ19JTl9VU0UgPSB0cnVlOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX01CQ19CQU5EX0NPVU5UID0gMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFRkFVTFRfUE9TVEVRX0lOX1VTRSA9IHRydWU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfUE9TVEVRX0JBTkRfQ09VTlQgPSAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVGQVVMVF9MSU1JVEVSX0lOX1VTRSA9IHRydWU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgREVGQVVMVF9GUkFNRV9EVVJBVElPTiA9IDkuNWY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgREVGQVVMVF9JTlBVVF9HQUlOID0gLTEyLjVmOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRFU1RfQ0hBTk5FTF9DT1VOVCA9IDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgVEVTVF9HQUlOMSA9IDEyLjFmOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IFRFU1RfR0FJTjIgPSAtMi44ZjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEVTVF9DSEFOTkVMX0lOREVYID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEVTVF9CQU5EX0lOREVYID0gMDsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gRHluYW1pY3NQcm9jZXNzaW5nIHRlc3RzOgorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gMCAtIGNvbnN0cnVjdG9ycworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8vIFRlc3QgY2FzZSAwLjA6IHRlc3QgY29uc3RydWN0b3IgYW5kIHJlbGVhc2UKKyAgICBAQXBwTW9kZUZ1bGwocmVhc29uID0gIkZhaWxzIGZvciBpbnN0YW50IGJ1dCBub3QgZW5vdWdoIHRvIGJsb2NrIHRoZSByZWxlYXNlIikKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MF8wQ29uc3RydWN0b3JBbmRSZWxlYXNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghaGFzQXVkaW9PdXRwdXQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBBdWRpb01hbmFnZXIgYW0gPSAoQXVkaW9NYW5hZ2VyKSBnZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkFVRElPX1NFUlZJQ0UpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgibnVsbCBBdWRpb01hbmFnZXIiLCBhbSk7CisgICAgICAgICAgICBjcmVhdGVEeW5hbWljc1Byb2Nlc3NpbmcoQXVkaW9NYW5hZ2VyLkFVRElPX1NFU1NJT05fSURfR0VORVJBVEUpOworICAgICAgICAgICAgcmVsZWFzZUR5bmFtaWNzUHJvY2Vzc2luZygpOworCisgICAgICAgICAgICBmaW5hbCBpbnQgc2Vzc2lvbiA9IGFtLmdlbmVyYXRlQXVkaW9TZXNzaW9uSWQoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImNhbm5vdCBnZW5lcmF0ZSBuZXcgc2Vzc2lvbiIsIHNlc3Npb24gIT0gQXVkaW9NYW5hZ2VyLkVSUk9SKTsKKyAgICAgICAgICAgIGNyZWF0ZUR5bmFtaWNzUHJvY2Vzc2luZyhzZXNzaW9uKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHJlbGVhc2VEeW5hbWljc1Byb2Nlc3NpbmcoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QwXzFDb25zdHJ1Y3RvcldpdGhDb25maWdBbmRSZWxlYXNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghaGFzQXVkaW9PdXRwdXQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjcmVhdGVEZWZhdWx0RWZmZWN0KCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICByZWxlYXNlRHluYW1pY3NQcm9jZXNzaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIDEgLSBjcmVhdGUgd2l0aCBwYXJhbWV0ZXJzCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgcHVibGljIHZvaWQgdGVzdDFfMFBhcmFtZXRlcnNFbmdpbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFoYXNBdWRpb091dHB1dCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNyZWF0ZURlZmF1bHRFZmZlY3QoKTsKKworICAgICAgICAgICAgLy8gQ2hlY2sgUGFyYW1ldGVyczoKKyAgICAgICAgICAgIER5bmFtaWNzUHJvY2Vzc2luZy5Db25maWcgZW5naW5lQ29uZmlnID0gbURQLmdldENvbmZpZygpOworICAgICAgICAgICAgZmluYWwgZmxvYXQgcHJlZmVycmVkRnJhbWVEdXJhdGlvbiA9IGVuZ2luZUNvbmZpZy5nZXRQcmVmZXJyZWRGcmFtZUR1cmF0aW9uKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInByZWZlcnJlZEZyYW1lRHVyYXRpb24gaXMgZGlmZmVyZW50IiwgREVGQVVMVF9GUkFNRV9EVVJBVElPTiwKKyAgICAgICAgICAgICAgICAgICAgcHJlZmVycmVkRnJhbWVEdXJhdGlvbiwgRVBTSUxPTik7CisKKyAgICAgICAgICAgIGZpbmFsIGludCBwcmVFcUJhbmRDb3VudCA9IGVuZ2luZUNvbmZpZy5nZXRQcmVFcUJhbmRDb3VudCgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJwcmVFcUJhbmRDb3VudCBpcyBkaWZmZXJlbnQiLCBERUZBVUxUX1BSRUVRX0JBTkRfQ09VTlQsIHByZUVxQmFuZENvdW50KTsKKworICAgICAgICAgICAgZmluYWwgaW50IG1iY0JhbmRDb3VudCA9IGVuZ2luZUNvbmZpZy5nZXRNYmNCYW5kQ291bnQoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygibWJjQmFuZENvdW50IGlzIGRpZmZlcmVudCIsIERFRkFVTFRfTUJDX0JBTkRfQ09VTlQsIG1iY0JhbmRDb3VudCk7CisKKyAgICAgICAgICAgIGZpbmFsIGludCBwb3N0RXFCYW5kQ291bnQgPSBlbmdpbmVDb25maWcuZ2V0UG9zdEVxQmFuZENvdW50KCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInBvc3RFcUJhbmRDb3VudCBpcyBkaWZmZXJlbnQiLCBERUZBVUxUX1BPU1RFUV9CQU5EX0NPVU5ULAorICAgICAgICAgICAgICAgICAgICBwb3N0RXFCYW5kQ291bnQpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcmVsZWFzZUR5bmFtaWNzUHJvY2Vzc2luZygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDFfMVBhcmFtZXRlcnNDaGFubmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghaGFzQXVkaW9PdXRwdXQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjcmVhdGVEZWZhdWx0RWZmZWN0KCk7CisKKyAgICAgICAgICAgIC8vIENoZWNrIFBhcmFtZXRlcnM6CisgICAgICAgICAgICBmaW5hbCBpbnQgY2hhbm5lbENvdW50ID0gbURQLmdldENoYW5uZWxDb3VudCgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgidW5leHBlY3RlZCBjaGFubmVsIGNvdW50IiwgY2hhbm5lbENvdW50ID49IE1JTl9DSEFOTkVMX0NPVU5UKTsKKworICAgICAgICAgICAgQ2hhbm5lbCBjaGFubmVsID0gbURQLmdldENoYW5uZWxCeUNoYW5uZWxJbmRleChURVNUX0NIQU5ORUxfSU5ERVgpOworCisgICAgICAgICAgICBmaW5hbCBmbG9hdCBpbnB1dEdhaW4gPSBjaGFubmVsLmdldElucHV0R2FpbigpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbnB1dEdhaW4gaXMgZGlmZmVyZW50IiwgREVGQVVMVF9JTlBVVF9HQUlOLCBpbnB1dEdhaW4sIEVQU0lMT04pOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcmVsZWFzZUR5bmFtaWNzUHJvY2Vzc2luZygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDFfMlBhcmFtZXRlcnNQcmVFcSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIWhhc0F1ZGlvT3V0cHV0KCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgY3JlYXRlRGVmYXVsdEVmZmVjdCgpOworCisgICAgICAgICAgICBEeW5hbWljc1Byb2Nlc3NpbmcuRXEgZXEgPSBtRFAuZ2V0UHJlRXFCeUNoYW5uZWxJbmRleChURVNUX0NIQU5ORUxfSU5ERVgpOworCisgICAgICAgICAgICBmaW5hbCBib29sZWFuIGluVXNlID0gZXEuaXNJblVzZSgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJpblVzZSBpcyBkaWZmZXJlbnQiLCBERUZBVUxUX1BSRUVRX0lOX1VTRSwgaW5Vc2UpOworCisgICAgICAgICAgICBmaW5hbCBpbnQgYmFuZENvdW50ID0gZXEuZ2V0QmFuZENvdW50KCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImJhbmQgY291bnQgaXMgZGlmZmVyZW50IiwgREVGQVVMVF9QUkVFUV9CQU5EX0NPVU5ULCBiYW5kQ291bnQpOworICAgICAgICAgICAgcmVsZWFzZUR5bmFtaWNzUHJvY2Vzc2luZygpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcmVsZWFzZUR5bmFtaWNzUHJvY2Vzc2luZygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDFfM1BhcmFtZXRlcnNNYmMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFoYXNBdWRpb091dHB1dCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNyZWF0ZURlZmF1bHRFZmZlY3QoKTsKKworICAgICAgICAgICAgRHluYW1pY3NQcm9jZXNzaW5nLk1iYyBtYmMgPSBtRFAuZ2V0TWJjQnlDaGFubmVsSW5kZXgoVEVTVF9DSEFOTkVMX0lOREVYKTsKKworICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpblVzZSA9IG1iYy5pc0luVXNlKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImluVXNlIGlzIGRpZmZlcmVudCIsIERFRkFVTFRfTUJDX0lOX1VTRSwgaW5Vc2UpOworCisgICAgICAgICAgICBmaW5hbCBpbnQgYmFuZENvdW50ID0gbWJjLmdldEJhbmRDb3VudCgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJiYW5kIGNvdW50IGlzIGRpZmZlcmVudCIsIERFRkFVTFRfTUJDX0JBTkRfQ09VTlQsIGJhbmRDb3VudCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICByZWxlYXNlRHluYW1pY3NQcm9jZXNzaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MV80UGFyYW1ldGVyc1Bvc3RFcSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIWhhc0F1ZGlvT3V0cHV0KCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgY3JlYXRlRGVmYXVsdEVmZmVjdCgpOworCisgICAgICAgICAgICBEeW5hbWljc1Byb2Nlc3NpbmcuRXEgZXEgPSBtRFAuZ2V0UG9zdEVxQnlDaGFubmVsSW5kZXgoVEVTVF9DSEFOTkVMX0lOREVYKTsKKworICAgICAgICAgICAgYm9vbGVhbiBpblVzZSA9IGVxLmlzSW5Vc2UoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiaW5Vc2UgaXMgZGlmZmVyZW50IiwgREVGQVVMVF9QT1NURVFfSU5fVVNFLCBpblVzZSk7CisKKyAgICAgICAgICAgIGludCBiYW5kQ291bnQgPSBlcS5nZXRCYW5kQ291bnQoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiYmFuZCBjb3VudCBpcyBkaWZmZXJlbnQiLCBERUZBVUxUX1BPU1RFUV9CQU5EX0NPVU5ULCBiYW5kQ291bnQpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcmVsZWFzZUR5bmFtaWNzUHJvY2Vzc2luZygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDFfNVBhcmFtZXRlcnNMaW1pdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghaGFzQXVkaW9PdXRwdXQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNyZWF0ZURlZmF1bHRFZmZlY3QoKTsKKworICAgICAgICAgICAgRHluYW1pY3NQcm9jZXNzaW5nLkxpbWl0ZXIgbGltaXRlciA9IG1EUC5nZXRMaW1pdGVyQnlDaGFubmVsSW5kZXgoVEVTVF9DSEFOTkVMX0lOREVYKTsKKworICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpblVzZSA9IGxpbWl0ZXIuaXNJblVzZSgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJpblVzZSBpcyBkaWZmZXJlbnQiLCBERUZBVUxUX0xJTUlURVJfSU5fVVNFLCBpblVzZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICByZWxlYXNlRHluYW1pY3NQcm9jZXNzaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MV82Q2hhbm5lbF9wZXJTdGFnZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIWhhc0F1ZGlvT3V0cHV0KCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjcmVhdGVEZWZhdWx0RWZmZWN0KCk7CisKKyAgICAgICAgICAgIENoYW5uZWwgY2hhbm5lbCA9IG1EUC5nZXRDaGFubmVsQnlDaGFubmVsSW5kZXgoVEVTVF9DSEFOTkVMX0lOREVYKTsKKworICAgICAgICAgICAgLy8gUGVyIFN0YWdlCisgICAgICAgICAgICBtRFAuc2V0SW5wdXRHYWluQWxsQ2hhbm5lbHNUbyhURVNUX0dBSU4xKTsKKworICAgICAgICAgICAgRXEgcHJlRXEgPSBtRFAuZ2V0UHJlRXFCeUNoYW5uZWxJbmRleChURVNUX0NIQU5ORUxfSU5ERVgpOworICAgICAgICAgICAgRXFCYW5kIHByZUVxQmFuZCA9IHByZUVxLmdldEJhbmQoVEVTVF9CQU5EX0lOREVYKTsKKyAgICAgICAgICAgIHByZUVxQmFuZC5zZXRHYWluKFRFU1RfR0FJTjEpOworICAgICAgICAgICAgcHJlRXEuc2V0QmFuZChURVNUX0JBTkRfSU5ERVgsIHByZUVxQmFuZCk7CisgICAgICAgICAgICBtRFAuc2V0UHJlRXFBbGxDaGFubmVsc1RvKHByZUVxKTsKKworICAgICAgICAgICAgTWJjIG1iYyA9IG1EUC5nZXRNYmNCeUNoYW5uZWxJbmRleChURVNUX0NIQU5ORUxfSU5ERVgpOworICAgICAgICAgICAgTWJjQmFuZCBtYmNCYW5kID0gbWJjLmdldEJhbmQoVEVTVF9CQU5EX0lOREVYKTsKKyAgICAgICAgICAgIG1iY0JhbmQuc2V0UHJlR2FpbihURVNUX0dBSU4xKTsKKyAgICAgICAgICAgIG1iYy5zZXRCYW5kKFRFU1RfQkFORF9JTkRFWCwgbWJjQmFuZCk7CisgICAgICAgICAgICBtRFAuc2V0TWJjQWxsQ2hhbm5lbHNUbyhtYmMpOworCisgICAgICAgICAgICBFcSBwb3N0RXEgPSBtRFAuZ2V0UG9zdEVxQnlDaGFubmVsSW5kZXgoVEVTVF9DSEFOTkVMX0lOREVYKTsKKyAgICAgICAgICAgIEVxQmFuZCBwb3N0RXFCYW5kID0gcG9zdEVxLmdldEJhbmQoVEVTVF9CQU5EX0lOREVYKTsKKyAgICAgICAgICAgIHBvc3RFcUJhbmQuc2V0R2FpbihURVNUX0dBSU4xKTsKKyAgICAgICAgICAgIHBvc3RFcS5zZXRCYW5kKFRFU1RfQkFORF9JTkRFWCwgcG9zdEVxQmFuZCk7CisgICAgICAgICAgICBtRFAuc2V0UG9zdEVxQWxsQ2hhbm5lbHNUbyhwb3N0RXEpOworCisgICAgICAgICAgICBMaW1pdGVyIGxpbWl0ZXIgPSBtRFAuZ2V0TGltaXRlckJ5Q2hhbm5lbEluZGV4KFRFU1RfQ0hBTk5FTF9JTkRFWCk7CisgICAgICAgICAgICBsaW1pdGVyLnNldFBvc3RHYWluKFRFU1RfR0FJTjEpOworICAgICAgICAgICAgbURQLnNldExpbWl0ZXJBbGxDaGFubmVsc1RvKGxpbWl0ZXIpOworCisgICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50ID0gbURQLmdldENoYW5uZWxDb3VudCgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFubmVsQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIENoYW5uZWwgY2hhbm5lbFRlc3QgPSBtRFAuZ2V0Q2hhbm5lbEJ5Q2hhbm5lbEluZGV4KGkpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiaW5wdXRHYWluIGlzIGRpZmZlcmVudCBpbiBjaGFubmVsICIgKyBpLCBURVNUX0dBSU4xLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbFRlc3QuZ2V0SW5wdXRHYWluKCksIEVQU0lMT04pOworCisgICAgICAgICAgICAgICAgRXEgcHJlRXFUZXN0ID0gbmV3IEVxKG1EUC5nZXRQcmVFcUJ5Q2hhbm5lbEluZGV4KGkpKTsKKyAgICAgICAgICAgICAgICBFcUJhbmQgcHJlRXFCYW5kVGVzdCA9IHByZUVxVGVzdC5nZXRCYW5kKFRFU1RfQkFORF9JTkRFWCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJwcmVFUUJhbmQgZ2FpbiBpcyBkaWZmZXJlbnQgaW4gY2hhbm5lbCAiICsgaSArICIgYmFuZCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RfQkFORF9JTkRFWCwgVEVTVF9HQUlOMSwgcHJlRXFCYW5kVGVzdC5nZXRHYWluKCksIEVQU0lMT04pOworCisgICAgICAgICAgICAgICAgTWJjIG1iY1Rlc3QgPSBuZXcgTWJjKG1EUC5nZXRNYmNCeUNoYW5uZWxJbmRleChpKSk7CisgICAgICAgICAgICAgICAgTWJjQmFuZCBtYmNCYW5kVGVzdCA9IG1iY1Rlc3QuZ2V0QmFuZChURVNUX0JBTkRfSU5ERVgpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygibWJjQmFuZCBwcmVHYWluIGlzIGRpZmZlcmVudCBpbiBjaGFubmVsICIgKyBpICsgIiBiYW5kICIgKworICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9CQU5EX0lOREVYLCBURVNUX0dBSU4xLCBtYmNCYW5kVGVzdC5nZXRQcmVHYWluKCksIEVQU0lMT04pOworCisgICAgICAgICAgICAgICAgRXEgcG9zdEVxVGVzdCA9IG5ldyBFcShtRFAuZ2V0UG9zdEVxQnlDaGFubmVsSW5kZXgoaSkpOworICAgICAgICAgICAgICAgIEVxQmFuZCBwb3N0RXFCYW5kVGVzdCA9IHBvc3RFcVRlc3QuZ2V0QmFuZChURVNUX0JBTkRfSU5ERVgpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygicG9zdEVRQmFuZCBnYWluIGlzIGRpZmZlcmVudCBpbiBjaGFubmVsICIgKyBpICsgIiBiYW5kICIgKworICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9CQU5EX0lOREVYLCBURVNUX0dBSU4xLCBwb3N0RXFCYW5kVGVzdC5nZXRHYWluKCksIEVQU0lMT04pOworCisgICAgICAgICAgICAgICAgTGltaXRlciBsaW1pdGVyVGVzdCA9IG5ldyBMaW1pdGVyKG1EUC5nZXRMaW1pdGVyQnlDaGFubmVsSW5kZXgoaSkpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygibGltaXRlciBnYWluIGlzIGRpZmZlcmVudCBpbiBjaGFubmVsICIgKyBpLAorICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9HQUlOMSwgbGltaXRlclRlc3QuZ2V0UG9zdEdhaW4oKSwgRVBTSUxPTik7CisKKyAgICAgICAgICAgICAgICAvLyBjaGFuZ2UgYnkgU3RhZ2UKKyAgICAgICAgICAgICAgICBtRFAuc2V0SW5wdXRHYWluYnlDaGFubmVsKGksIFRFU1RfR0FJTjIpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiaW5wdXRHYWluIGlzIGRpZmZlcmVudCBpbiBjaGFubmVsICIgKyBpLCBURVNUX0dBSU4yLAorICAgICAgICAgICAgICAgICAgICAgICAgbURQLmdldElucHV0R2FpbkJ5Q2hhbm5lbEluZGV4KGkpLCBFUFNJTE9OKTsKKworICAgICAgICAgICAgICAgIHByZUVxQmFuZFRlc3Quc2V0R2FpbihURVNUX0dBSU4yKTsKKyAgICAgICAgICAgICAgICBwcmVFcVRlc3Quc2V0QmFuZChURVNUX0JBTkRfSU5ERVgsIHByZUVxQmFuZFRlc3QpOworICAgICAgICAgICAgICAgIG1EUC5zZXRQcmVFcUJ5Q2hhbm5lbEluZGV4KGksIHByZUVxVGVzdCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJwcmVFUUJhbmQgZ2FpbiBpcyBkaWZmZXJlbnQgaW4gY2hhbm5lbCAiICsgaSArICIgYmFuZCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RfQkFORF9JTkRFWCwgVEVTVF9HQUlOMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EUC5nZXRQcmVFcUJhbmRCeUNoYW5uZWxJbmRleChpLCBURVNUX0JBTkRfSU5ERVgpLmdldEdhaW4oKSwgRVBTSUxPTik7CisKKyAgICAgICAgICAgICAgICBtYmNCYW5kVGVzdC5zZXRQcmVHYWluKFRFU1RfR0FJTjIpOworICAgICAgICAgICAgICAgIG1iY1Rlc3Quc2V0QmFuZChURVNUX0JBTkRfSU5ERVgsIG1iY0JhbmRUZXN0KTsKKyAgICAgICAgICAgICAgICBtRFAuc2V0TWJjQnlDaGFubmVsSW5kZXgoaSwgbWJjVGVzdCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJtYmNCYW5kIHByZUdhaW4gaXMgZGlmZmVyZW50IGluIGNoYW5uZWwgIiArIGkgKyAiIGJhbmQgIiArCisgICAgICAgICAgICAgICAgICAgICAgICBURVNUX0JBTkRfSU5ERVgsIFRFU1RfR0FJTjIsCisgICAgICAgICAgICAgICAgICAgICAgICBtRFAuZ2V0TWJjQmFuZEJ5Q2hhbm5lbEluZGV4KGksIFRFU1RfQkFORF9JTkRFWCkuZ2V0UHJlR2FpbigpLCBFUFNJTE9OKTsKKworICAgICAgICAgICAgICAgIHBvc3RFcUJhbmRUZXN0LnNldEdhaW4oVEVTVF9HQUlOMik7CisgICAgICAgICAgICAgICAgcG9zdEVxVGVzdC5zZXRCYW5kKFRFU1RfQkFORF9JTkRFWCwgcG9zdEVxQmFuZFRlc3QpOworICAgICAgICAgICAgICAgIG1EUC5zZXRQb3N0RXFCeUNoYW5uZWxJbmRleChpLCBwb3N0RXFUZXN0KTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInBvc3RFUUJhbmQgZ2FpbiBpcyBkaWZmZXJlbnQgaW4gY2hhbm5lbCAiICsgaSArICIgYmFuZCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RfQkFORF9JTkRFWCwgVEVTVF9HQUlOMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EUC5nZXRQb3N0RXFCYW5kQnlDaGFubmVsSW5kZXgoaSwgVEVTVF9CQU5EX0lOREVYKS5nZXRHYWluKCksIEVQU0lMT04pOworCisgICAgICAgICAgICAgICAgbGltaXRlclRlc3Quc2V0UG9zdEdhaW4oVEVTVF9HQUlOMik7CisgICAgICAgICAgICAgICAgbURQLnNldExpbWl0ZXJCeUNoYW5uZWxJbmRleChpLCBsaW1pdGVyVGVzdCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJsaW1pdGVyIGdhaW4gaXMgZGlmZmVyZW50IGluIGNoYW5uZWwgIiArIGksCisgICAgICAgICAgICAgICAgICAgICAgICBURVNUX0dBSU4yLCBtRFAuZ2V0TGltaXRlckJ5Q2hhbm5lbEluZGV4KGkpLmdldFBvc3RHYWluKCksIEVQU0lMT04pOworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcmVsZWFzZUR5bmFtaWNzUHJvY2Vzc2luZygpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MV83Q2hhbm5lbF9wZXJCYW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghaGFzQXVkaW9PdXRwdXQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjcmVhdGVEZWZhdWx0RWZmZWN0KCk7CisKKyAgICAgICAgICAgIENoYW5uZWwgY2hhbm5lbCA9IG1EUC5nZXRDaGFubmVsQnlDaGFubmVsSW5kZXgoVEVTVF9DSEFOTkVMX0lOREVYKTsKKworICAgICAgICAgICAgLy8gUGVyIEJhbmQKKyAgICAgICAgICAgIEVxQmFuZCBwcmVFcUJhbmQgPSBtRFAuZ2V0UHJlRXFCYW5kQnlDaGFubmVsSW5kZXgoVEVTVF9DSEFOTkVMX0lOREVYLCBURVNUX0JBTkRfSU5ERVgpOworICAgICAgICAgICAgcHJlRXFCYW5kLnNldEdhaW4oVEVTVF9HQUlOMSk7CisgICAgICAgICAgICBtRFAuc2V0UHJlRXFCYW5kQWxsQ2hhbm5lbHNUbyhURVNUX0JBTkRfSU5ERVgsIHByZUVxQmFuZCk7CisKKyAgICAgICAgICAgIE1iY0JhbmQgbWJjQmFuZCA9IG1EUC5nZXRNYmNCYW5kQnlDaGFubmVsSW5kZXgoVEVTVF9DSEFOTkVMX0lOREVYLCBURVNUX0JBTkRfSU5ERVgpOworICAgICAgICAgICAgbWJjQmFuZC5zZXRQcmVHYWluKFRFU1RfR0FJTjEpOworICAgICAgICAgICAgbURQLnNldE1iY0JhbmRBbGxDaGFubmVsc1RvKFRFU1RfQkFORF9JTkRFWCwgbWJjQmFuZCk7CisKKyAgICAgICAgICAgIEVxQmFuZCBwb3N0RXFCYW5kID0gbURQLmdldFBvc3RFcUJhbmRCeUNoYW5uZWxJbmRleChURVNUX0NIQU5ORUxfSU5ERVgsCisgICAgICAgICAgICAgICAgICAgIFRFU1RfQkFORF9JTkRFWCk7CisgICAgICAgICAgICBwb3N0RXFCYW5kLnNldEdhaW4oVEVTVF9HQUlOMSk7CisgICAgICAgICAgICBtRFAuc2V0UG9zdEVxQmFuZEFsbENoYW5uZWxzVG8oVEVTVF9CQU5EX0lOREVYLCBwb3N0RXFCYW5kKTsKKworICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCA9IG1EUC5nZXRDaGFubmVsQ291bnQoKTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFubmVsQ291bnQ7IGkrKykgeworCisgICAgICAgICAgICAgICAgRXFCYW5kIHByZUVxQmFuZFRlc3QgPSBuZXcgRXFCYW5kKG1EUC5nZXRQcmVFcUJhbmRCeUNoYW5uZWxJbmRleChpLAorICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9CQU5EX0lOREVYKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJwcmVFUUJhbmQgZ2FpbiBpcyBkaWZmZXJlbnQgaW4gY2hhbm5lbCAiICsgaSArICIgYmFuZCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RfQkFORF9JTkRFWCwgVEVTVF9HQUlOMSwgcHJlRXFCYW5kVGVzdC5nZXRHYWluKCksIEVQU0lMT04pOworCisgICAgICAgICAgICAgICAgTWJjQmFuZCBtYmNCYW5kVGVzdCA9IG5ldyBNYmNCYW5kKG1EUC5nZXRNYmNCYW5kQnlDaGFubmVsSW5kZXgoaSwgVEVTVF9CQU5EX0lOREVYKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJtYmNCYW5kIHByZUdhaW4gaXMgZGlmZmVyZW50IGluIGNoYW5uZWwgIiArIGkgKyAiIGJhbmQgIiArCisgICAgICAgICAgICAgICAgICAgICAgICBURVNUX0JBTkRfSU5ERVgsIFRFU1RfR0FJTjEsIG1iY0JhbmRUZXN0LmdldFByZUdhaW4oKSwgRVBTSUxPTik7CisKKyAgICAgICAgICAgICAgICBFcUJhbmQgcG9zdEVxQmFuZFRlc3QgPSBuZXcgRXFCYW5kKG1EUC5nZXRQb3N0RXFCYW5kQnlDaGFubmVsSW5kZXgoaSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RfQkFORF9JTkRFWCkpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygicG9zdEVRQmFuZCBnYWluIGlzIGRpZmZlcmVudCBpbiBjaGFubmVsICIgKyBpICsgIiBiYW5kICIgKworICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9CQU5EX0lOREVYLCBURVNUX0dBSU4xLCBwb3N0RXFCYW5kVGVzdC5nZXRHYWluKCksIEVQU0lMT04pOworCisgICAgICAgICAgICAgICAgLy8gY2hhbmdlIHBlciBCYW5kCisgICAgICAgICAgICAgICAgcHJlRXFCYW5kVGVzdC5zZXRHYWluKFRFU1RfR0FJTjIpOworICAgICAgICAgICAgICAgIG1EUC5zZXRQcmVFcUJhbmRCeUNoYW5uZWxJbmRleChpLCBURVNUX0JBTkRfSU5ERVgsIHByZUVxQmFuZFRlc3QpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygicHJlRVFCYW5kIGdhaW4gaXMgZGlmZmVyZW50IGluIGNoYW5uZWwgIiArIGkgKyAiIGJhbmQgIiArCisgICAgICAgICAgICAgICAgICAgICAgICBURVNUX0JBTkRfSU5ERVgsIFRFU1RfR0FJTjIsCisgICAgICAgICAgICAgICAgICAgICAgICBtRFAuZ2V0UHJlRXFCYW5kQnlDaGFubmVsSW5kZXgoaSwgVEVTVF9CQU5EX0lOREVYKS5nZXRHYWluKCksIEVQU0lMT04pOworCisgICAgICAgICAgICAgICAgbWJjQmFuZFRlc3Quc2V0UHJlR2FpbihURVNUX0dBSU4yKTsKKyAgICAgICAgICAgICAgICBtRFAuc2V0TWJjQmFuZEJ5Q2hhbm5lbEluZGV4KGksIFRFU1RfQkFORF9JTkRFWCwgbWJjQmFuZFRlc3QpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygibWJjQmFuZCBwcmVHYWluIGlzIGRpZmZlcmVudCBpbiBjaGFubmVsICIgKyBpICsgIiBiYW5kICIgKworICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9CQU5EX0lOREVYLCBURVNUX0dBSU4yLAorICAgICAgICAgICAgICAgICAgICAgICAgbURQLmdldE1iY0JhbmRCeUNoYW5uZWxJbmRleChpLCBURVNUX0JBTkRfSU5ERVgpLmdldFByZUdhaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVQU0lMT04pOworCisgICAgICAgICAgICAgICAgcG9zdEVxQmFuZFRlc3Quc2V0R2FpbihURVNUX0dBSU4yKTsKKyAgICAgICAgICAgICAgICBtRFAuc2V0UG9zdEVxQmFuZEJ5Q2hhbm5lbEluZGV4KGksIFRFU1RfQkFORF9JTkRFWCwgcG9zdEVxQmFuZFRlc3QpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygicG9zdEVRQmFuZCBnYWluIGlzIGRpZmZlcmVudCBpbiBjaGFubmVsICIgKyBpICsgIiBiYW5kICIgKworICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9CQU5EX0lOREVYLCBURVNUX0dBSU4yLAorICAgICAgICAgICAgICAgICAgICAgICAgbURQLmdldFBvc3RFcUJhbmRCeUNoYW5uZWxJbmRleChpLCBURVNUX0JBTkRfSU5ERVgpLmdldEdhaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVQU0lMT04pOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICByZWxlYXNlRHluYW1pY3NQcm9jZXNzaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MV84Q2hhbm5lbF9zZXRBbGxDaGFubmVsc1RvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghaGFzQXVkaW9PdXRwdXQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjcmVhdGVEZWZhdWx0RWZmZWN0KCk7CisKKyAgICAgICAgICAgIENoYW5uZWwgY2hhbm5lbCA9IG1EUC5nZXRDaGFubmVsQnlDaGFubmVsSW5kZXgoVEVTVF9DSEFOTkVMX0lOREVYKTsKKyAgICAgICAgICAgIC8vIGdldCBTdGFnZXMsIGFwcGx5IGFsbCBjaGFubmVscworICAgICAgICAgICAgRXEgcHJlRXEgPSBuZXcgRXEobURQLmdldFByZUVxQnlDaGFubmVsSW5kZXgoVEVTVF9DSEFOTkVMX0lOREVYKSk7CisgICAgICAgICAgICBFcUJhbmQgcHJlRXFCYW5kID0gbmV3IEVxQmFuZChwcmVFcS5nZXRCYW5kKFRFU1RfQkFORF9JTkRFWCkpOworICAgICAgICAgICAgcHJlRXFCYW5kLnNldEdhaW4oVEVTVF9HQUlOMSk7CisgICAgICAgICAgICBwcmVFcS5zZXRCYW5kKFRFU1RfQkFORF9JTkRFWCwgcHJlRXFCYW5kKTsKKyAgICAgICAgICAgIGNoYW5uZWwuc2V0UHJlRXEocHJlRXEpOworCisgICAgICAgICAgICBNYmMgbWJjID0gbmV3IE1iYyhtRFAuZ2V0TWJjQnlDaGFubmVsSW5kZXgoVEVTVF9DSEFOTkVMX0lOREVYKSk7CisgICAgICAgICAgICBNYmNCYW5kIG1iY0JhbmQgPSBuZXcgTWJjQmFuZChtYmMuZ2V0QmFuZChURVNUX0JBTkRfSU5ERVgpKTsKKyAgICAgICAgICAgIG1iY0JhbmQuc2V0UHJlR2FpbihURVNUX0dBSU4xKTsKKyAgICAgICAgICAgIG1iYy5zZXRCYW5kKFRFU1RfQkFORF9JTkRFWCwgbWJjQmFuZCk7CisgICAgICAgICAgICBjaGFubmVsLnNldE1iYyhtYmMpOworCisgICAgICAgICAgICBFcSBwb3N0RXEgPSBuZXcgRXEobURQLmdldFBvc3RFcUJ5Q2hhbm5lbEluZGV4KFRFU1RfQ0hBTk5FTF9JTkRFWCkpOworICAgICAgICAgICAgRXFCYW5kIHBvc3RFcUJhbmQgPSBuZXcgRXFCYW5kKHBvc3RFcS5nZXRCYW5kKFRFU1RfQkFORF9JTkRFWCkpOworICAgICAgICAgICAgcG9zdEVxQmFuZC5zZXRHYWluKFRFU1RfR0FJTjEpOworICAgICAgICAgICAgcG9zdEVxLnNldEJhbmQoVEVTVF9CQU5EX0lOREVYLCBwb3N0RXFCYW5kKTsKKyAgICAgICAgICAgIGNoYW5uZWwuc2V0UG9zdEVxKHBvc3RFcSk7CisKKyAgICAgICAgICAgIExpbWl0ZXIgbGltaXRlciA9IG5ldyBMaW1pdGVyKG1EUC5nZXRMaW1pdGVyQnlDaGFubmVsSW5kZXgoVEVTVF9DSEFOTkVMX0lOREVYKSk7CisgICAgICAgICAgICBsaW1pdGVyLnNldFBvc3RHYWluKFRFU1RfR0FJTjEpOworICAgICAgICAgICAgY2hhbm5lbC5zZXRMaW1pdGVyKGxpbWl0ZXIpOworCisgICAgICAgICAgICBtRFAuc2V0QWxsQ2hhbm5lbHNUbyhjaGFubmVsKTsKKworICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCA9IG1EUC5nZXRDaGFubmVsQ291bnQoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hhbm5lbENvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInByZUVRQmFuZCBnYWluIGlzIGRpZmZlcmVudCBpbiBjaGFubmVsICIgKyBpICsgIiBiYW5kICIgKworICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9CQU5EX0lOREVYLCBURVNUX0dBSU4xLAorICAgICAgICAgICAgICAgICAgICAgICAgbURQLmdldFByZUVxQmFuZEJ5Q2hhbm5lbEluZGV4KGksIFRFU1RfQkFORF9JTkRFWCkuZ2V0R2FpbigpLCBFUFNJTE9OKTsKKworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygibWJjQmFuZCBwcmVHYWluIGlzIGRpZmZlcmVudCBpbiBjaGFubmVsICIgKyBpICsgIiBiYW5kICIgKworICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9CQU5EX0lOREVYLCBURVNUX0dBSU4xLAorICAgICAgICAgICAgICAgICAgICAgICAgbURQLmdldE1iY0JhbmRCeUNoYW5uZWxJbmRleChpLCBURVNUX0JBTkRfSU5ERVgpLmdldFByZUdhaW4oKSwgRVBTSUxPTik7CisKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInBvc3RFUUJhbmQgZ2FpbiBpcyBkaWZmZXJlbnQgaW4gY2hhbm5lbCAiICsgaSArICIgYmFuZCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RfQkFORF9JTkRFWCwgVEVTVF9HQUlOMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EUC5nZXRQb3N0RXFCYW5kQnlDaGFubmVsSW5kZXgoaSwgVEVTVF9CQU5EX0lOREVYKS5nZXRHYWluKCksIEVQU0lMT04pOworCisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJsaW1pdGVyIGdhaW4gaXMgZGlmZmVyZW50IGluIGNoYW5uZWwgIiArIGksCisgICAgICAgICAgICAgICAgICAgICAgICBURVNUX0dBSU4xLCBtRFAuZ2V0TGltaXRlckJ5Q2hhbm5lbEluZGV4KGkpLmdldFBvc3RHYWluKCksIEVQU0lMT04pOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICByZWxlYXNlRHluYW1pY3NQcm9jZXNzaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MV85Q2hhbm5lbF9zZXRDaGFubmVsVG8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFoYXNBdWRpb091dHB1dCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNyZWF0ZURlZmF1bHRFZmZlY3QoKTsKKworICAgICAgICAgICAgQ2hhbm5lbCBjaGFubmVsID0gbURQLmdldENoYW5uZWxCeUNoYW5uZWxJbmRleChURVNUX0NIQU5ORUxfSU5ERVgpOworCisgICAgICAgICAgICBFcSBwcmVFcSA9IG5ldyBFcShtRFAuZ2V0UHJlRXFCeUNoYW5uZWxJbmRleChURVNUX0NIQU5ORUxfSU5ERVgpKTsKKyAgICAgICAgICAgIEVxQmFuZCBwcmVFcUJhbmQgPSBuZXcgRXFCYW5kKHByZUVxLmdldEJhbmQoVEVTVF9CQU5EX0lOREVYKSk7CisKKyAgICAgICAgICAgIE1iYyBtYmMgPSBuZXcgTWJjKG1EUC5nZXRNYmNCeUNoYW5uZWxJbmRleChURVNUX0NIQU5ORUxfSU5ERVgpKTsKKyAgICAgICAgICAgIE1iY0JhbmQgbWJjQmFuZCA9IG5ldyBNYmNCYW5kKG1iYy5nZXRCYW5kKFRFU1RfQkFORF9JTkRFWCkpOworCisgICAgICAgICAgICBFcSBwb3N0RXEgPSBuZXcgRXEobURQLmdldFBvc3RFcUJ5Q2hhbm5lbEluZGV4KFRFU1RfQ0hBTk5FTF9JTkRFWCkpOworICAgICAgICAgICAgRXFCYW5kIHBvc3RFcUJhbmQgPSBuZXcgRXFCYW5kKHBvc3RFcS5nZXRCYW5kKFRFU1RfQkFORF9JTkRFWCkpOworCisgICAgICAgICAgICBMaW1pdGVyIGxpbWl0ZXIgPSBuZXcgTGltaXRlcihtRFAuZ2V0TGltaXRlckJ5Q2hhbm5lbEluZGV4KFRFU1RfQ0hBTk5FTF9JTkRFWCkpOworCisgICAgICAgICAgICAvLyBnZXQgU3RhZ2VzLCBhcHBseSBwZXIgY2hhbm5lbAorICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCA9IG1EUC5nZXRDaGFubmVsQ291bnQoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hhbm5lbENvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBmbG9hdCBnYWluID0gaSAlIDIgPT0gMCA/IFRFU1RfR0FJTjEgOiBURVNUX0dBSU4yOworCisgICAgICAgICAgICAgICAgcHJlRXFCYW5kLnNldEdhaW4oZ2Fpbik7CisgICAgICAgICAgICAgICAgcHJlRXEuc2V0QmFuZChURVNUX0JBTkRfSU5ERVgsIHByZUVxQmFuZCk7CisgICAgICAgICAgICAgICAgY2hhbm5lbC5zZXRQcmVFcShwcmVFcSk7CisKKyAgICAgICAgICAgICAgICBtYmNCYW5kLnNldFByZUdhaW4oZ2Fpbik7CisgICAgICAgICAgICAgICAgbWJjLnNldEJhbmQoVEVTVF9CQU5EX0lOREVYLCBtYmNCYW5kKTsKKyAgICAgICAgICAgICAgICBjaGFubmVsLnNldE1iYyhtYmMpOworCisgICAgICAgICAgICAgICAgcG9zdEVxQmFuZC5zZXRHYWluKGdhaW4pOworICAgICAgICAgICAgICAgIHBvc3RFcS5zZXRCYW5kKFRFU1RfQkFORF9JTkRFWCwgcG9zdEVxQmFuZCk7CisgICAgICAgICAgICAgICAgY2hhbm5lbC5zZXRQb3N0RXEocG9zdEVxKTsKKworICAgICAgICAgICAgICAgIGxpbWl0ZXIuc2V0UG9zdEdhaW4oZ2Fpbik7CisgICAgICAgICAgICAgICAgY2hhbm5lbC5zZXRMaW1pdGVyKGxpbWl0ZXIpOworCisgICAgICAgICAgICAgICAgbURQLnNldENoYW5uZWxUbyhpLCBjaGFubmVsKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFubmVsQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGZsb2F0IGV4cGVjdGVkR2FpbiA9IGkgJSAyID09IDAgPyBURVNUX0dBSU4xIDogVEVTVF9HQUlOMjsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInByZUVRQmFuZCBnYWluIGlzIGRpZmZlcmVudCBpbiBjaGFubmVsICIgKyBpICsgIiBiYW5kICIgKworICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9CQU5EX0lOREVYLCBleHBlY3RlZEdhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICBtRFAuZ2V0UHJlRXFCYW5kQnlDaGFubmVsSW5kZXgoaSwgVEVTVF9CQU5EX0lOREVYKS5nZXRHYWluKCksCisgICAgICAgICAgICAgICAgICAgICAgICBFUFNJTE9OKTsKKworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygibWJjQmFuZCBwcmVHYWluIGlzIGRpZmZlcmVudCBpbiBjaGFubmVsICIgKyBpICsgIiBiYW5kICIgKworICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9CQU5EX0lOREVYLCBleHBlY3RlZEdhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICBtRFAuZ2V0TWJjQmFuZEJ5Q2hhbm5lbEluZGV4KGksIFRFU1RfQkFORF9JTkRFWCkuZ2V0UHJlR2FpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgRVBTSUxPTik7CisKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInBvc3RFUUJhbmQgZ2FpbiBpcyBkaWZmZXJlbnQgaW4gY2hhbm5lbCAiICsgaSArICIgYmFuZCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RfQkFORF9JTkRFWCwgZXhwZWN0ZWRHYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgbURQLmdldFBvc3RFcUJhbmRCeUNoYW5uZWxJbmRleChpLCBURVNUX0JBTkRfSU5ERVgpLmdldEdhaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVQU0lMT04pOworCisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJsaW1pdGVyIGdhaW4gaXMgZGlmZmVyZW50IGluIGNoYW5uZWwgIiArIGksCisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZEdhaW4sIG1EUC5nZXRMaW1pdGVyQnlDaGFubmVsSW5kZXgoaSkuZ2V0UG9zdEdhaW4oKSwgRVBTSUxPTik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHJlbGVhc2VEeW5hbWljc1Byb2Nlc3NpbmcoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gMiAtIGNvbmZpZyBidWlsZGVyIHRlc3RzCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgcHVibGljIHZvaWQgdGVzdDJfMENvbmZpZ0Jhc2ljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghaGFzQXVkaW9PdXRwdXQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIER5bmFtaWNzUHJvY2Vzc2luZy5Db25maWcgY29uZmlnID0gZ2V0QnVpbGRlcldpdGhWYWx1ZXMoKS5idWlsZCgpOworCisgICAgICAgIGFzc2VydEVxdWFscygiZ2V0VmFyaWFudCBpcyBkaWZmZXJlbnQiLCBERUZBVUxUX1ZBUklBTlQsCisgICAgICAgICAgICAgICAgY29uZmlnLmdldFZhcmlhbnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiaXNQcmVFcUluVXNlIGlzIGRpZmZlcmVudCIsIERFRkFVTFRfUFJFRVFfSU5fVVNFLAorICAgICAgICAgICAgICAgIGNvbmZpZy5pc1ByZUVxSW5Vc2UoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZ2V0UHJlRXFCYW5kQ291bnQgaXMgZGlmZmVyZW50IiwgREVGQVVMVF9QUkVFUV9CQU5EX0NPVU5ULAorICAgICAgICAgICAgICAgIGNvbmZpZy5nZXRQcmVFcUJhbmRDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpc01iY0luVXNlIGlzIGRpZmZlcmVudCIsIERFRkFVTFRfTUJDX0lOX1VTRSwKKyAgICAgICAgICAgICAgICBjb25maWcuaXNNYmNJblVzZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXRNYmNCYW5kQ291bnQgaXMgZGlmZmVyZW50IiwgREVGQVVMVF9NQkNfQkFORF9DT1VOVCwKKyAgICAgICAgICAgICAgICBjb25maWcuZ2V0TWJjQmFuZENvdW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImlzUG9zdEVxSW5Vc2UgaXMgZGlmZmVyZW50IiwgREVGQVVMVF9QT1NURVFfSU5fVVNFLAorICAgICAgICAgICAgICAgIGNvbmZpZy5pc1Bvc3RFcUluVXNlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImdldFBvc3RFcUJhbmRDb3VudCBpcyBkaWZmZXJlbnQiLCBERUZBVUxUX1BPU1RFUV9CQU5EX0NPVU5ULAorICAgICAgICAgICAgICAgIGNvbmZpZy5nZXRQb3N0RXFCYW5kQ291bnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiaXNMaW1pdGVySW5Vc2UgaXMgZGlmZmVyZW50IiwgREVGQVVMVF9MSU1JVEVSX0lOX1VTRSwKKyAgICAgICAgICAgICAgICBjb25maWcuaXNMaW1pdGVySW5Vc2UoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZ2V0UHJlZmVycmVkRnJhbWVEdXJhdGlvbiBpcyBkaWZmZXJlbnQiLCBERUZBVUxUX0ZSQU1FX0RVUkFUSU9OLAorICAgICAgICAgICAgICAgIGNvbmZpZy5nZXRQcmVmZXJyZWRGcmFtZUR1cmF0aW9uKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QyXzFDb25maWdDaGFubmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghaGFzQXVkaW9PdXRwdXQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIER5bmFtaWNzUHJvY2Vzc2luZy5Db25maWcgY29uZmlnID0gZ2V0QnVpbGRlcldpdGhWYWx1ZXMoVEVTVF9DSEFOTkVMX0NPVU5UKS5idWlsZCgpOworCisgICAgICAgIC8vIHBlciBjaGFubmVsCisgICAgICAgIENoYW5uZWwgY2hhbm5lbCA9IGNvbmZpZy5nZXRDaGFubmVsQnlDaGFubmVsSW5kZXgoVEVTVF9DSEFOTkVMX0lOREVYKTsKKyAgICAgICAgLy8gY2hhbmdlIHNvbWUgcGFyYW1ldGVycworICAgICAgICBjaGFubmVsLnNldElucHV0R2FpbihURVNUX0dBSU4xKTsKKworICAgICAgICAvLyBnZXQgc3RhZ2VzIGZyb20gY2hhbm5lbAorICAgICAgICBFcSBwcmVFcSA9IGNoYW5uZWwuZ2V0UHJlRXEoKTsKKyAgICAgICAgRXFCYW5kIHByZUVxQmFuZCA9IHByZUVxLmdldEJhbmQoVEVTVF9CQU5EX0lOREVYKTsKKyAgICAgICAgcHJlRXFCYW5kLnNldEdhaW4oVEVTVF9HQUlOMSk7CisgICAgICAgIGNoYW5uZWwuc2V0UHJlRXFCYW5kKFRFU1RfQkFORF9JTkRFWCwgcHJlRXFCYW5kKTsKKworICAgICAgICBNYmMgbWJjID0gY2hhbm5lbC5nZXRNYmMoKTsKKyAgICAgICAgTWJjQmFuZCBtYmNCYW5kID0gbWJjLmdldEJhbmQoVEVTVF9CQU5EX0lOREVYKTsKKyAgICAgICAgbWJjQmFuZC5zZXRQcmVHYWluKFRFU1RfR0FJTjEpOworICAgICAgICBjaGFubmVsLnNldE1iY0JhbmQoVEVTVF9CQU5EX0lOREVYLCBtYmNCYW5kKTsKKworICAgICAgICBFcSBwb3N0RXEgPSBjaGFubmVsLmdldFBvc3RFcSgpOworICAgICAgICBFcUJhbmQgcG9zdEVxQmFuZCA9IHBvc3RFcS5nZXRCYW5kKFRFU1RfQkFORF9JTkRFWCk7CisgICAgICAgIHBvc3RFcUJhbmQuc2V0R2FpbihURVNUX0dBSU4xKTsKKyAgICAgICAgY2hhbm5lbC5zZXRQb3N0RXFCYW5kKFRFU1RfQkFORF9JTkRFWCwgcG9zdEVxQmFuZCk7CisKKyAgICAgICAgTGltaXRlciBsaW1pdGVyID0gY2hhbm5lbC5nZXRMaW1pdGVyKCk7CisgICAgICAgIGxpbWl0ZXIuc2V0UG9zdEdhaW4oVEVTVF9HQUlOMSk7CisgICAgICAgIGNoYW5uZWwuc2V0TGltaXRlcihsaW1pdGVyKTsKKworICAgICAgICBjb25maWcuc2V0QWxsQ2hhbm5lbHNUbyhjaGFubmVsKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBURVNUX0NIQU5ORUxfQ09VTlQ7IGkrKykgeworICAgICAgICAgICAgQ2hhbm5lbCBjaGFubmVsVGVzdCA9IG5ldyBDaGFubmVsKGNvbmZpZy5nZXRDaGFubmVsQnlDaGFubmVsSW5kZXgoaSkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbnB1dEdhaW4gaXMgZGlmZmVyZW50IGluIGNoYW5uZWwgIiArIGksIFRFU1RfR0FJTjEsCisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxUZXN0LmdldElucHV0R2FpbigpLCBFUFNJTE9OKTsKKworICAgICAgICAgICAgRXFCYW5kIHByZUVxQmFuZFRlc3QgPSBuZXcgRXFCYW5kKGNoYW5uZWxUZXN0LmdldFByZUVxQmFuZChURVNUX0JBTkRfSU5ERVgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygicHJlRVFCYW5kIGdhaW4gaXMgZGlmZmVyZW50IGluIGNoYW5uZWwgIiArIGkgKyAiIGJhbmQgIiArIFRFU1RfQkFORF9JTkRFWCwKKyAgICAgICAgICAgICAgICAgICAgVEVTVF9HQUlOMSwgcHJlRXFCYW5kVGVzdC5nZXRHYWluKCksIEVQU0lMT04pOworCisgICAgICAgICAgICBNYmNCYW5kIG1iY0JhbmRUZXN0ID0gbmV3IE1iY0JhbmQoY2hhbm5lbFRlc3QuZ2V0TWJjQmFuZChURVNUX0JBTkRfSU5ERVgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygibWJjQmFuZCBwcmVHYWluIGlzIGRpZmZlcmVudCBpbiBjaGFubmVsICIgKyBpICsgIiBiYW5kICIgKworICAgICAgICAgICAgICAgICAgICBURVNUX0JBTkRfSU5ERVgsIFRFU1RfR0FJTjEsIG1iY0JhbmRUZXN0LmdldFByZUdhaW4oKSwgRVBTSUxPTik7CisKKyAgICAgICAgICAgIEVxQmFuZCBwb3N0RXFCYW5kVGVzdCA9IG5ldyBFcUJhbmQoY2hhbm5lbFRlc3QuZ2V0UG9zdEVxQmFuZChURVNUX0JBTkRfSU5ERVgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygicG9zdEVRQmFuZCBnYWluIGlzIGRpZmZlcmVudCBpbiBjaGFubmVsICIgKyBpICsgIiBiYW5kICIgKworICAgICAgICAgICAgICAgICAgICBURVNUX0JBTkRfSU5ERVgsIFRFU1RfR0FJTjEsIHBvc3RFcUJhbmRUZXN0LmdldEdhaW4oKSwgRVBTSUxPTik7CisKKyAgICAgICAgICAgIExpbWl0ZXIgbGltaXRlclRlc3QgPSBuZXcgTGltaXRlcihjaGFubmVsVGVzdC5nZXRMaW1pdGVyKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJsaW1pdGVyIGdhaW4gaXMgZGlmZmVyZW50IGluIGNoYW5uZWwgIiArIGksCisgICAgICAgICAgICAgICAgICAgIFRFU1RfR0FJTjEsIGxpbWl0ZXJUZXN0LmdldFBvc3RHYWluKCksIEVQU0lMT04pOworCisgICAgICAgICAgICAvLy8gY2hhbmdlcyBwZXIgY2hhbm5lbEluZGV4CisgICAgICAgICAgICBjaGFubmVsVGVzdC5zZXRJbnB1dEdhaW4oVEVTVF9HQUlOMik7CisgICAgICAgICAgICBwcmVFcUJhbmRUZXN0LnNldEdhaW4oVEVTVF9HQUlOMik7CisgICAgICAgICAgICBjaGFubmVsVGVzdC5zZXRQcmVFcUJhbmQoVEVTVF9CQU5EX0lOREVYLCBwcmVFcUJhbmRUZXN0KTsKKyAgICAgICAgICAgIG1iY0JhbmRUZXN0LnNldFByZUdhaW4oVEVTVF9HQUlOMik7CisgICAgICAgICAgICBjaGFubmVsVGVzdC5zZXRNYmNCYW5kKFRFU1RfQkFORF9JTkRFWCwgbWJjQmFuZFRlc3QpOworICAgICAgICAgICAgcG9zdEVxQmFuZFRlc3Quc2V0R2FpbihURVNUX0dBSU4yKTsKKyAgICAgICAgICAgIGNoYW5uZWxUZXN0LnNldFBvc3RFcUJhbmQoVEVTVF9CQU5EX0lOREVYLCBwb3N0RXFCYW5kVGVzdCk7CisgICAgICAgICAgICBsaW1pdGVyVGVzdC5zZXRQb3N0R2FpbihURVNUX0dBSU4yKTsKKyAgICAgICAgICAgIGNoYW5uZWxUZXN0LnNldExpbWl0ZXIobGltaXRlclRlc3QpOworICAgICAgICAgICAgY29uZmlnLnNldENoYW5uZWxUbyhpLCBjaGFubmVsVGVzdCk7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiaW5wdXRHYWluIGlzIGRpZmZlcmVudCBpbiBjaGFubmVsICIgKyBpLCBURVNUX0dBSU4yLAorICAgICAgICAgICAgICAgICAgICBjb25maWcuZ2V0SW5wdXRHYWluQnlDaGFubmVsSW5kZXgoaSksIEVQU0lMT04pOworCisgICAgICAgICAgICAvLyBnZXQgYnkgbW9kdWxlCisgICAgICAgICAgICBFcSBwcmVFcVRlc3QgPSBjb25maWcuZ2V0UHJlRXFCeUNoYW5uZWxJbmRleChpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygicHJlRVFCYW5kIGdhaW4gaXMgZGlmZmVyZW50IGluIGNoYW5uZWwgIiArIGkgKyAiIGJhbmQgIiArIFRFU1RfQkFORF9JTkRFWCwKKyAgICAgICAgICAgICAgICAgICAgVEVTVF9HQUlOMiwgcHJlRXFUZXN0LmdldEJhbmQoVEVTVF9CQU5EX0lOREVYKS5nZXRHYWluKCksIEVQU0lMT04pOworCisgICAgICAgICAgICBNYmMgbWJjVGVzdCA9IGNvbmZpZy5nZXRNYmNCeUNoYW5uZWxJbmRleChpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygibWJjQmFuZCBwcmVHYWluIGlzIGRpZmZlcmVudCBpbiBjaGFubmVsICIgKyBpICsgIiBiYW5kICIgKworICAgICAgICAgICAgICAgICAgICBURVNUX0JBTkRfSU5ERVgsIFRFU1RfR0FJTjIsIG1iY1Rlc3QuZ2V0QmFuZChURVNUX0JBTkRfSU5ERVgpLmdldFByZUdhaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgRVBTSUxPTik7CisKKyAgICAgICAgICAgIEVxIHBvc3RFcVRlc3QgPSBjb25maWcuZ2V0UG9zdEVxQnlDaGFubmVsSW5kZXgoaSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInBvc3RFUUJhbmQgZ2FpbiBpcyBkaWZmZXJlbnQgaW4gY2hhbm5lbCAiICsgaSArICIgYmFuZCAiICsKKyAgICAgICAgICAgICAgICAgICAgVEVTVF9CQU5EX0lOREVYLCBURVNUX0dBSU4yLCBwb3N0RXFUZXN0LmdldEJhbmQoVEVTVF9CQU5EX0lOREVYKS5nZXRHYWluKCksCisgICAgICAgICAgICAgICAgICAgIEVQU0lMT04pOworCisgICAgICAgICAgICBsaW1pdGVyVGVzdCA9IGNvbmZpZy5nZXRMaW1pdGVyQnlDaGFubmVsSW5kZXgoaSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImxpbWl0ZXIgZ2FpbiBpcyBkaWZmZXJlbnQgaW4gY2hhbm5lbCAiICsgaSwKKyAgICAgICAgICAgICAgICAgICAgVEVTVF9HQUlOMiwgbGltaXRlclRlc3QuZ2V0UG9zdEdhaW4oKSwgRVBTSUxPTik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Ml8yQ29uZmlnQ2hhbm5lbF9wZXJTdGFnZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIWhhc0F1ZGlvT3V0cHV0KCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIER5bmFtaWNzUHJvY2Vzc2luZy5Db25maWcgY29uZmlnID0gZ2V0QnVpbGRlcldpdGhWYWx1ZXMoVEVTVF9DSEFOTkVMX0NPVU5UKS5idWlsZCgpOworCisgICAgICAgIC8vIFBlciBTdGFnZQorICAgICAgICBjb25maWcuc2V0SW5wdXRHYWluQWxsQ2hhbm5lbHNUbyhURVNUX0dBSU4xKTsKKworICAgICAgICBFcSBwcmVFcSA9IGNvbmZpZy5nZXRQcmVFcUJ5Q2hhbm5lbEluZGV4KFRFU1RfQ0hBTk5FTF9JTkRFWCk7CisgICAgICAgIEVxQmFuZCBwcmVFcUJhbmQgPSBwcmVFcS5nZXRCYW5kKFRFU1RfQkFORF9JTkRFWCk7CisgICAgICAgIHByZUVxQmFuZC5zZXRHYWluKFRFU1RfR0FJTjEpOworICAgICAgICBwcmVFcS5zZXRCYW5kKFRFU1RfQkFORF9JTkRFWCwgcHJlRXFCYW5kKTsKKyAgICAgICAgY29uZmlnLnNldFByZUVxQWxsQ2hhbm5lbHNUbyhwcmVFcSk7CisKKyAgICAgICAgTWJjIG1iYyA9IGNvbmZpZy5nZXRNYmNCeUNoYW5uZWxJbmRleChURVNUX0NIQU5ORUxfSU5ERVgpOworICAgICAgICBNYmNCYW5kIG1iY0JhbmQgPSBtYmMuZ2V0QmFuZChURVNUX0JBTkRfSU5ERVgpOworICAgICAgICBtYmNCYW5kLnNldFByZUdhaW4oVEVTVF9HQUlOMSk7CisgICAgICAgIG1iYy5zZXRCYW5kKFRFU1RfQkFORF9JTkRFWCwgbWJjQmFuZCk7CisgICAgICAgIGNvbmZpZy5zZXRNYmNBbGxDaGFubmVsc1RvKG1iYyk7CisKKyAgICAgICAgRXEgcG9zdEVxID0gY29uZmlnLmdldFBvc3RFcUJ5Q2hhbm5lbEluZGV4KFRFU1RfQ0hBTk5FTF9JTkRFWCk7CisgICAgICAgIEVxQmFuZCBwb3N0RXFCYW5kID0gcG9zdEVxLmdldEJhbmQoVEVTVF9CQU5EX0lOREVYKTsKKyAgICAgICAgcG9zdEVxQmFuZC5zZXRHYWluKFRFU1RfR0FJTjEpOworICAgICAgICBwb3N0RXEuc2V0QmFuZChURVNUX0JBTkRfSU5ERVgsIHBvc3RFcUJhbmQpOworICAgICAgICBjb25maWcuc2V0UG9zdEVxQWxsQ2hhbm5lbHNUbyhwb3N0RXEpOworCisgICAgICAgIExpbWl0ZXIgbGltaXRlciA9IGNvbmZpZy5nZXRMaW1pdGVyQnlDaGFubmVsSW5kZXgoVEVTVF9DSEFOTkVMX0lOREVYKTsKKyAgICAgICAgbGltaXRlci5zZXRQb3N0R2FpbihURVNUX0dBSU4xKTsKKyAgICAgICAgY29uZmlnLnNldExpbWl0ZXJBbGxDaGFubmVsc1RvKGxpbWl0ZXIpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgVEVTVF9DSEFOTkVMX0NPVU5UOyBpKyspIHsKKyAgICAgICAgICAgIENoYW5uZWwgY2hhbm5lbFRlc3QgPSBjb25maWcuZ2V0Q2hhbm5lbEJ5Q2hhbm5lbEluZGV4KGkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbnB1dEdhaW4gaXMgZGlmZmVyZW50IGluIGNoYW5uZWwgIiArIGksIFRFU1RfR0FJTjEsCisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxUZXN0LmdldElucHV0R2FpbigpLCBFUFNJTE9OKTsKKworICAgICAgICAgICAgRXEgcHJlRXFUZXN0ID0gbmV3IEVxKGNvbmZpZy5nZXRQcmVFcUJ5Q2hhbm5lbEluZGV4KGkpKTsKKyAgICAgICAgICAgIEVxQmFuZCBwcmVFcUJhbmRUZXN0ID0gcHJlRXFUZXN0LmdldEJhbmQoVEVTVF9CQU5EX0lOREVYKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygicHJlRVFCYW5kIGdhaW4gaXMgZGlmZmVyZW50IGluIGNoYW5uZWwgIiArIGkgKyAiIGJhbmQgIiArIFRFU1RfQkFORF9JTkRFWCwKKyAgICAgICAgICAgICAgICAgICAgVEVTVF9HQUlOMSwgcHJlRXFCYW5kVGVzdC5nZXRHYWluKCksIEVQU0lMT04pOworCisgICAgICAgICAgICBNYmMgbWJjVGVzdCA9IG5ldyBNYmMoY29uZmlnLmdldE1iY0J5Q2hhbm5lbEluZGV4KGkpKTsKKyAgICAgICAgICAgIE1iY0JhbmQgbWJjQmFuZFRlc3QgPSBtYmNUZXN0LmdldEJhbmQoVEVTVF9CQU5EX0lOREVYKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygibWJjQmFuZCBwcmVHYWluIGlzIGRpZmZlcmVudCBpbiBjaGFubmVsICIgKyBpICsgIiBiYW5kICIgKworICAgICAgICAgICAgICAgICAgICBURVNUX0JBTkRfSU5ERVgsIFRFU1RfR0FJTjEsIG1iY0JhbmRUZXN0LmdldFByZUdhaW4oKSwgRVBTSUxPTik7CisKKyAgICAgICAgICAgIEVxIHBvc3RFcVRlc3QgPSBuZXcgRXEoY29uZmlnLmdldFBvc3RFcUJ5Q2hhbm5lbEluZGV4KGkpKTsKKyAgICAgICAgICAgIEVxQmFuZCBwb3N0RXFCYW5kVGVzdCA9IHBvc3RFcVRlc3QuZ2V0QmFuZChURVNUX0JBTkRfSU5ERVgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJwb3N0RVFCYW5kIGdhaW4gaXMgZGlmZmVyZW50IGluIGNoYW5uZWwgIiArIGkgKyAiIGJhbmQgIiArCisgICAgICAgICAgICAgICAgICAgIFRFU1RfQkFORF9JTkRFWCwgVEVTVF9HQUlOMSwgcG9zdEVxQmFuZFRlc3QuZ2V0R2FpbigpLCBFUFNJTE9OKTsKKworICAgICAgICAgICAgTGltaXRlciBsaW1pdGVyVGVzdCA9IG5ldyBMaW1pdGVyKGNvbmZpZy5nZXRMaW1pdGVyQnlDaGFubmVsSW5kZXgoaSkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJsaW1pdGVyIGdhaW4gaXMgZGlmZmVyZW50IGluIGNoYW5uZWwgIiArIGksCisgICAgICAgICAgICAgICAgICAgIFRFU1RfR0FJTjEsIGxpbWl0ZXJUZXN0LmdldFBvc3RHYWluKCksIEVQU0lMT04pOworCisgICAgICAgICAgICAvLyBjaGFuZ2UgYnkgU3RhZ2UKKyAgICAgICAgICAgIGNvbmZpZy5zZXRJbnB1dEdhaW5CeUNoYW5uZWxJbmRleChpLCBURVNUX0dBSU4yKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiaW5wdXRHYWluIGlzIGRpZmZlcmVudCBpbiBjaGFubmVsICIgKyBpLCBURVNUX0dBSU4yLAorICAgICAgICAgICAgICAgICAgICBjb25maWcuZ2V0SW5wdXRHYWluQnlDaGFubmVsSW5kZXgoaSksIEVQU0lMT04pOworCisgICAgICAgICAgICBwcmVFcUJhbmRUZXN0LnNldEdhaW4oVEVTVF9HQUlOMik7CisgICAgICAgICAgICBwcmVFcVRlc3Quc2V0QmFuZChURVNUX0JBTkRfSU5ERVgsIHByZUVxQmFuZFRlc3QpOworICAgICAgICAgICAgY29uZmlnLnNldFByZUVxQnlDaGFubmVsSW5kZXgoaSwgcHJlRXFUZXN0KTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygicHJlRVFCYW5kIGdhaW4gaXMgZGlmZmVyZW50IGluIGNoYW5uZWwgIiArIGkgKyAiIGJhbmQgIiArIFRFU1RfQkFORF9JTkRFWCwKKyAgICAgICAgICAgICAgICAgICAgVEVTVF9HQUlOMiwgY29uZmlnLmdldFByZUVxQmFuZEJ5Q2hhbm5lbEluZGV4KGksIFRFU1RfQkFORF9JTkRFWCkuZ2V0R2FpbigpLAorICAgICAgICAgICAgICAgICAgICBFUFNJTE9OKTsKKworICAgICAgICAgICAgbWJjQmFuZFRlc3Quc2V0UHJlR2FpbihURVNUX0dBSU4yKTsKKyAgICAgICAgICAgIG1iY1Rlc3Quc2V0QmFuZChURVNUX0JBTkRfSU5ERVgsIG1iY0JhbmRUZXN0KTsKKyAgICAgICAgICAgIGNvbmZpZy5zZXRNYmNCeUNoYW5uZWxJbmRleChpLCBtYmNUZXN0KTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygibWJjQmFuZCBwcmVHYWluIGlzIGRpZmZlcmVudCBpbiBjaGFubmVsICIgKyBpICsgIiBiYW5kICIgKworICAgICAgICAgICAgICAgICAgICBURVNUX0JBTkRfSU5ERVgsIFRFU1RfR0FJTjIsCisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5nZXRNYmNCYW5kQnlDaGFubmVsSW5kZXgoaSwgVEVTVF9CQU5EX0lOREVYKS5nZXRQcmVHYWluKCksIEVQU0lMT04pOworCisgICAgICAgICAgICBwb3N0RXFCYW5kVGVzdC5zZXRHYWluKFRFU1RfR0FJTjIpOworICAgICAgICAgICAgcG9zdEVxVGVzdC5zZXRCYW5kKFRFU1RfQkFORF9JTkRFWCwgcG9zdEVxQmFuZFRlc3QpOworICAgICAgICAgICAgY29uZmlnLnNldFBvc3RFcUJ5Q2hhbm5lbEluZGV4KGksIHBvc3RFcVRlc3QpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJwb3N0RVFCYW5kIGdhaW4gaXMgZGlmZmVyZW50IGluIGNoYW5uZWwgIiArIGkgKyAiIGJhbmQgIiArCisgICAgICAgICAgICAgICAgICAgIFRFU1RfQkFORF9JTkRFWCwgVEVTVF9HQUlOMiwKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLmdldFBvc3RFcUJhbmRCeUNoYW5uZWxJbmRleChpLCBURVNUX0JBTkRfSU5ERVgpLmdldEdhaW4oKSwgRVBTSUxPTik7CisKKyAgICAgICAgICAgIGxpbWl0ZXJUZXN0LnNldFBvc3RHYWluKFRFU1RfR0FJTjIpOworICAgICAgICAgICAgY29uZmlnLnNldExpbWl0ZXJCeUNoYW5uZWxJbmRleChpLCBsaW1pdGVyVGVzdCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImxpbWl0ZXIgZ2FpbiBpcyBkaWZmZXJlbnQgaW4gY2hhbm5lbCAiICsgaSwKKyAgICAgICAgICAgICAgICAgICAgVEVTVF9HQUlOMiwgY29uZmlnLmdldExpbWl0ZXJCeUNoYW5uZWxJbmRleChpKS5nZXRQb3N0R2FpbigpLCBFUFNJTE9OKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QyXzNDb25maWdDaGFubmVsX3BlckJhbmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFoYXNBdWRpb091dHB1dCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgRHluYW1pY3NQcm9jZXNzaW5nLkNvbmZpZyBjb25maWcgPSBnZXRCdWlsZGVyV2l0aFZhbHVlcyhURVNUX0NIQU5ORUxfQ09VTlQpLmJ1aWxkKCk7CisKKyAgICAgICAgLy8gUGVyIEJhbmQKKyAgICAgICAgRXFCYW5kIHByZUVxQmFuZCA9IGNvbmZpZy5nZXRQcmVFcUJhbmRCeUNoYW5uZWxJbmRleChURVNUX0NIQU5ORUxfSU5ERVgsIFRFU1RfQkFORF9JTkRFWCk7CisgICAgICAgIHByZUVxQmFuZC5zZXRHYWluKFRFU1RfR0FJTjEpOworICAgICAgICBjb25maWcuc2V0UHJlRXFCYW5kQWxsQ2hhbm5lbHNUbyhURVNUX0JBTkRfSU5ERVgsIHByZUVxQmFuZCk7CisKKyAgICAgICAgTWJjQmFuZCBtYmNCYW5kID0gY29uZmlnLmdldE1iY0JhbmRCeUNoYW5uZWxJbmRleChURVNUX0NIQU5ORUxfSU5ERVgsIFRFU1RfQkFORF9JTkRFWCk7CisgICAgICAgIG1iY0JhbmQuc2V0UHJlR2FpbihURVNUX0dBSU4xKTsKKyAgICAgICAgY29uZmlnLnNldE1iY0JhbmRBbGxDaGFubmVsc1RvKFRFU1RfQkFORF9JTkRFWCwgbWJjQmFuZCk7CisKKyAgICAgICAgRXFCYW5kIHBvc3RFcUJhbmQgPSBjb25maWcuZ2V0UG9zdEVxQmFuZEJ5Q2hhbm5lbEluZGV4KFRFU1RfQ0hBTk5FTF9JTkRFWCwgVEVTVF9CQU5EX0lOREVYKTsKKyAgICAgICAgcG9zdEVxQmFuZC5zZXRHYWluKFRFU1RfR0FJTjEpOworICAgICAgICBjb25maWcuc2V0UG9zdEVxQmFuZEFsbENoYW5uZWxzVG8oVEVTVF9CQU5EX0lOREVYLCBwb3N0RXFCYW5kKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFRFU1RfQ0hBTk5FTF9DT1VOVDsgaSsrKSB7CisKKyAgICAgICAgICAgIEVxQmFuZCBwcmVFcUJhbmRUZXN0ID0gbmV3IEVxQmFuZChjb25maWcuZ2V0UHJlRXFCYW5kQnlDaGFubmVsSW5kZXgoaSwKKyAgICAgICAgICAgICAgICAgICAgVEVTVF9CQU5EX0lOREVYKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInByZUVRQmFuZCBnYWluIGlzIGRpZmZlcmVudCBpbiBjaGFubmVsICIgKyBpICsgIiBiYW5kICIgKyBURVNUX0JBTkRfSU5ERVgsCisgICAgICAgICAgICAgICAgICAgIFRFU1RfR0FJTjEsIHByZUVxQmFuZFRlc3QuZ2V0R2FpbigpLCBFUFNJTE9OKTsKKworICAgICAgICAgICAgTWJjQmFuZCBtYmNCYW5kVGVzdCA9IG5ldyBNYmNCYW5kKGNvbmZpZy5nZXRNYmNCYW5kQnlDaGFubmVsSW5kZXgoaSwgVEVTVF9CQU5EX0lOREVYKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIm1iY0JhbmQgcHJlR2FpbiBpcyBkaWZmZXJlbnQgaW4gY2hhbm5lbCAiICsgaSArICIgYmFuZCAiICsKKyAgICAgICAgICAgICAgICAgICAgVEVTVF9CQU5EX0lOREVYLCBURVNUX0dBSU4xLCBtYmNCYW5kVGVzdC5nZXRQcmVHYWluKCksIEVQU0lMT04pOworCisgICAgICAgICAgICBFcUJhbmQgcG9zdEVxQmFuZFRlc3QgPSBuZXcgRXFCYW5kKGNvbmZpZy5nZXRQb3N0RXFCYW5kQnlDaGFubmVsSW5kZXgoaSwKKyAgICAgICAgICAgICAgICAgICAgVEVTVF9CQU5EX0lOREVYKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInBvc3RFUUJhbmQgZ2FpbiBpcyBkaWZmZXJlbnQgaW4gY2hhbm5lbCAiICsgaSArICIgYmFuZCAiICsKKyAgICAgICAgICAgICAgICAgICAgVEVTVF9CQU5EX0lOREVYLCBURVNUX0dBSU4xLCBwb3N0RXFCYW5kVGVzdC5nZXRHYWluKCksIEVQU0lMT04pOworCisgICAgICAgICAgICAvLyBjaGFuZ2UgcGVyIEJhbmQKKyAgICAgICAgICAgIHByZUVxQmFuZFRlc3Quc2V0R2FpbihURVNUX0dBSU4yKTsKKyAgICAgICAgICAgIGNvbmZpZy5zZXRQcmVFcUJhbmRCeUNoYW5uZWxJbmRleChpLCBURVNUX0JBTkRfSU5ERVgsIHByZUVxQmFuZFRlc3QpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJwcmVFUUJhbmQgZ2FpbiBpcyBkaWZmZXJlbnQgaW4gY2hhbm5lbCAiICsgaSArICIgYmFuZCAiICsgVEVTVF9CQU5EX0lOREVYLAorICAgICAgICAgICAgICAgICAgICBURVNUX0dBSU4yLCBjb25maWcuZ2V0UHJlRXFCYW5kQnlDaGFubmVsSW5kZXgoaSwgVEVTVF9CQU5EX0lOREVYKS5nZXRHYWluKCksCisgICAgICAgICAgICAgICAgICAgIEVQU0lMT04pOworCisgICAgICAgICAgICBtYmNCYW5kVGVzdC5zZXRQcmVHYWluKFRFU1RfR0FJTjIpOworICAgICAgICAgICAgY29uZmlnLnNldE1iY0JhbmRCeUNoYW5uZWxJbmRleChpLCBURVNUX0JBTkRfSU5ERVgsIG1iY0JhbmRUZXN0KTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygibWJjQmFuZCBwcmVHYWluIGlzIGRpZmZlcmVudCBpbiBjaGFubmVsICIgKyBpICsgIiBiYW5kICIgKworICAgICAgICAgICAgICAgICAgICBURVNUX0JBTkRfSU5ERVgsIFRFU1RfR0FJTjIsCisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5nZXRNYmNCYW5kQnlDaGFubmVsSW5kZXgoaSwgVEVTVF9CQU5EX0lOREVYKS5nZXRQcmVHYWluKCksIEVQU0lMT04pOworCisgICAgICAgICAgICBwb3N0RXFCYW5kVGVzdC5zZXRHYWluKFRFU1RfR0FJTjIpOworICAgICAgICAgICAgY29uZmlnLnNldFBvc3RFcUJhbmRCeUNoYW5uZWxJbmRleChpLCBURVNUX0JBTkRfSU5ERVgsIHBvc3RFcUJhbmRUZXN0KTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygicG9zdEVRQmFuZCBnYWluIGlzIGRpZmZlcmVudCBpbiBjaGFubmVsICIgKyBpICsgIiBiYW5kICIgKworICAgICAgICAgICAgICAgICAgICBURVNUX0JBTkRfSU5ERVgsIFRFU1RfR0FJTjIsCisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5nZXRQb3N0RXFCYW5kQnlDaGFubmVsSW5kZXgoaSwgVEVTVF9CQU5EX0lOREVYKS5nZXRHYWluKCksIEVQU0lMT04pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDJfNENoYW5uZWxfcGVyU3RhZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFoYXNBdWRpb091dHB1dCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgRHluYW1pY3NQcm9jZXNzaW5nLkNvbmZpZyBjb25maWcgPSBnZXRCdWlsZGVyV2l0aFZhbHVlcyhNSU5fQ0hBTk5FTF9DT1VOVCkuYnVpbGQoKTsKKworICAgICAgICBDaGFubmVsIGNoYW5uZWwgPSBuZXcgQ2hhbm5lbChjb25maWcuZ2V0Q2hhbm5lbEJ5Q2hhbm5lbEluZGV4KFRFU1RfQ0hBTk5FTF9JTkRFWCkpOworCisgICAgICAgIGNoYW5uZWwuc2V0SW5wdXRHYWluKFRFU1RfR0FJTjEpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNoYW5uZWwgZ2FpbiBpcyBkaWZmZXJlbnQiLCBURVNUX0dBSU4xLCBjaGFubmVsLmdldElucHV0R2FpbigpLCBFUFNJTE9OKTsKKworICAgICAgICAvLyBzZXQgYnkgc3RhZ2UKKyAgICAgICAgRXEgcHJlRXEgPSBuZXcgRXEoY2hhbm5lbC5nZXRQcmVFcSgpKTsKKyAgICAgICAgRXFCYW5kIHByZUVxQmFuZCA9IG5ldyBFcUJhbmQocHJlRXEuZ2V0QmFuZChURVNUX0JBTkRfSU5ERVgpKTsKKyAgICAgICAgcHJlRXFCYW5kLnNldEdhaW4oVEVTVF9HQUlOMSk7CisgICAgICAgIHByZUVxLnNldEJhbmQoVEVTVF9CQU5EX0lOREVYLCBwcmVFcUJhbmQpOworICAgICAgICBjaGFubmVsLnNldFByZUVxKHByZUVxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwcmVFUUJhbmQgZ2FpbiBpcyBkaWZmZXJlbnQgaW4gYmFuZCAiICsgVEVTVF9CQU5EX0lOREVYLAorICAgICAgICAgICAgICAgIFRFU1RfR0FJTjEsIGNoYW5uZWwuZ2V0UHJlRXEoKS5nZXRCYW5kKFRFU1RfQkFORF9JTkRFWCkuZ2V0R2FpbigpLCBFUFNJTE9OKTsKKyAgICAgICAgcHJlRXFCYW5kLnNldEdhaW4oVEVTVF9HQUlOMik7CisgICAgICAgIHByZUVxLnNldEJhbmQoVEVTVF9CQU5EX0lOREVYLCBwcmVFcUJhbmQpOworICAgICAgICBjaGFubmVsLnNldFByZUVxKHByZUVxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwcmVFUUJhbmQgZ2FpbiBpcyBkaWZmZXJlbnQgaW4gYmFuZCAiICsgVEVTVF9CQU5EX0lOREVYLAorICAgICAgICAgICAgICAgIFRFU1RfR0FJTjIsIGNoYW5uZWwuZ2V0UHJlRXEoKS5nZXRCYW5kKFRFU1RfQkFORF9JTkRFWCkuZ2V0R2FpbigpLCBFUFNJTE9OKTsKKworICAgICAgICBNYmMgbWJjID0gbmV3IE1iYyhjaGFubmVsLmdldE1iYygpKTsKKyAgICAgICAgTWJjQmFuZCBtYmNCYW5kID0gbmV3IE1iY0JhbmQobWJjLmdldEJhbmQoVEVTVF9CQU5EX0lOREVYKSk7CisgICAgICAgIG1iY0JhbmQuc2V0UHJlR2FpbihURVNUX0dBSU4xKTsKKyAgICAgICAgbWJjLnNldEJhbmQoVEVTVF9CQU5EX0lOREVYLCBtYmNCYW5kKTsKKyAgICAgICAgY2hhbm5lbC5zZXRNYmMobWJjKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJtYmNCYW5kIHByZUdhaW4gaXMgZGlmZmVyZW50IGluIGJhbmQgIiArIFRFU1RfQkFORF9JTkRFWCwKKyAgICAgICAgICAgICAgICBURVNUX0dBSU4xLCBjaGFubmVsLmdldE1iYygpLmdldEJhbmQoVEVTVF9CQU5EX0lOREVYKS5nZXRQcmVHYWluKCksIEVQU0lMT04pOworICAgICAgICBtYmNCYW5kLnNldFByZUdhaW4oVEVTVF9HQUlOMik7CisgICAgICAgIG1iYy5zZXRCYW5kKFRFU1RfQkFORF9JTkRFWCwgbWJjQmFuZCk7CisgICAgICAgIGNoYW5uZWwuc2V0TWJjKG1iYyk7CisgICAgICAgIGFzc2VydEVxdWFscygibWJjQmFuZCBwcmVHYWluIGlzIGRpZmZlcmVudCBpbiBiYW5kICIgKyBURVNUX0JBTkRfSU5ERVgsCisgICAgICAgICAgICAgICAgVEVTVF9HQUlOMiwgY2hhbm5lbC5nZXRNYmMoKS5nZXRCYW5kKFRFU1RfQkFORF9JTkRFWCkuZ2V0UHJlR2FpbigpLCBFUFNJTE9OKTsKKworICAgICAgICBFcSBwb3N0RXEgPSBuZXcgRXEoY2hhbm5lbC5nZXRQb3N0RXEoKSk7CisgICAgICAgIEVxQmFuZCBwb3N0RXFCYW5kID0gbmV3IEVxQmFuZChwb3N0RXEuZ2V0QmFuZChURVNUX0JBTkRfSU5ERVgpKTsKKyAgICAgICAgcG9zdEVxQmFuZC5zZXRHYWluKFRFU1RfR0FJTjEpOworICAgICAgICBwb3N0RXEuc2V0QmFuZChURVNUX0JBTkRfSU5ERVgsIHBvc3RFcUJhbmQpOworICAgICAgICBjaGFubmVsLnNldFBvc3RFcShwb3N0RXEpOworICAgICAgICBhc3NlcnRFcXVhbHMoInBvc3RFcUJhbmQgZ2FpbiBpcyBkaWZmZXJlbnQgaW4gYmFuZCAiICsgVEVTVF9CQU5EX0lOREVYLAorICAgICAgICAgICAgICAgIFRFU1RfR0FJTjEsIGNoYW5uZWwuZ2V0UG9zdEVxKCkuZ2V0QmFuZChURVNUX0JBTkRfSU5ERVgpLmdldEdhaW4oKSwgRVBTSUxPTik7CisgICAgICAgIHBvc3RFcUJhbmQuc2V0R2FpbihURVNUX0dBSU4yKTsKKyAgICAgICAgcG9zdEVxLnNldEJhbmQoVEVTVF9CQU5EX0lOREVYLCBwb3N0RXFCYW5kKTsKKyAgICAgICAgY2hhbm5lbC5zZXRQb3N0RXEocG9zdEVxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwb3N0RVFCYW5kIGdhaW4gaXMgZGlmZmVyZW50IGluIGJhbmQgIiArIFRFU1RfQkFORF9JTkRFWCwKKyAgICAgICAgICAgICAgICBURVNUX0dBSU4yLCBjaGFubmVsLmdldFBvc3RFcSgpLmdldEJhbmQoVEVTVF9CQU5EX0lOREVYKS5nZXRHYWluKCksIEVQU0lMT04pOworCisgICAgICAgIExpbWl0ZXIgbGltaXRlciA9IG5ldyBMaW1pdGVyKGNoYW5uZWwuZ2V0TGltaXRlcigpKTsKKyAgICAgICAgbGltaXRlci5zZXRQb3N0R2FpbihURVNUX0dBSU4xKTsKKyAgICAgICAgY2hhbm5lbC5zZXRMaW1pdGVyKGxpbWl0ZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImxpbWl0ZXIgZ2FpbiBpcyBkaWZmZXJlbnQiLAorICAgICAgICAgICAgICAgIFRFU1RfR0FJTjEsIGNoYW5uZWwuZ2V0TGltaXRlcigpLmdldFBvc3RHYWluKCksIEVQU0lMT04pOworICAgICAgICBsaW1pdGVyLnNldFBvc3RHYWluKFRFU1RfR0FJTjIpOworICAgICAgICBjaGFubmVsLnNldExpbWl0ZXIobGltaXRlcik7CisgICAgICAgIGFzc2VydEVxdWFscygibGltaXRlciBnYWluIGlzIGRpZmZlcmVudCIsCisgICAgICAgICAgICAgICAgVEVTVF9HQUlOMiwgY2hhbm5lbC5nZXRMaW1pdGVyKCkuZ2V0UG9zdEdhaW4oKSwgRVBTSUxPTik7CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Ml81Q2hhbm5lbF9wZXJCYW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghaGFzQXVkaW9PdXRwdXQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIER5bmFtaWNzUHJvY2Vzc2luZy5Db25maWcgY29uZmlnID0gZ2V0QnVpbGRlcldpdGhWYWx1ZXMoTUlOX0NIQU5ORUxfQ09VTlQpLmJ1aWxkKCk7CisKKyAgICAgICAgQ2hhbm5lbCBjaGFubmVsID0gbmV3IENoYW5uZWwoY29uZmlnLmdldENoYW5uZWxCeUNoYW5uZWxJbmRleChURVNUX0NIQU5ORUxfSU5ERVgpKTsKKworICAgICAgICBjaGFubmVsLnNldElucHV0R2FpbihURVNUX0dBSU4xKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjaGFubmVsIGdhaW4gaXMgZGlmZmVyZW50IiwgVEVTVF9HQUlOMSwgY2hhbm5lbC5nZXRJbnB1dEdhaW4oKSwgRVBTSUxPTik7CisKKyAgICAgICAgLy8gc2V0IGJ5IGJhbmQKKyAgICAgICAgRXFCYW5kIHByZUVxQmFuZCA9IG5ldyBFcUJhbmQoY2hhbm5lbC5nZXRQcmVFcUJhbmQoVEVTVF9CQU5EX0lOREVYKSk7CisgICAgICAgIHByZUVxQmFuZC5zZXRHYWluKFRFU1RfR0FJTjEpOworICAgICAgICBjaGFubmVsLnNldFByZUVxQmFuZChURVNUX0JBTkRfSU5ERVgsIHByZUVxQmFuZCk7CisgICAgICAgIGFzc2VydEVxdWFscygicHJlRVFCYW5kIGdhaW4gaXMgZGlmZmVyZW50IGluIGJhbmQgIiArIFRFU1RfQkFORF9JTkRFWCwKKyAgICAgICAgICAgICAgICBURVNUX0dBSU4xLCBjaGFubmVsLmdldFByZUVxQmFuZChURVNUX0JBTkRfSU5ERVgpLmdldEdhaW4oKSwgRVBTSUxPTik7CisgICAgICAgIHByZUVxQmFuZC5zZXRHYWluKFRFU1RfR0FJTjIpOworICAgICAgICBjaGFubmVsLnNldFByZUVxQmFuZChURVNUX0JBTkRfSU5ERVgsIHByZUVxQmFuZCk7CisgICAgICAgIGFzc2VydEVxdWFscygicHJlRVFCYW5kIGdhaW4gaXMgZGlmZmVyZW50IGluIGJhbmQgIiArIFRFU1RfQkFORF9JTkRFWCwKKyAgICAgICAgICAgICAgICBURVNUX0dBSU4yLCBjaGFubmVsLmdldFByZUVxQmFuZChURVNUX0JBTkRfSU5ERVgpLmdldEdhaW4oKSwgRVBTSUxPTik7CisKKyAgICAgICAgTWJjQmFuZCBtYmNCYW5kID0gbmV3IE1iY0JhbmQoY2hhbm5lbC5nZXRNYmNCYW5kKFRFU1RfQkFORF9JTkRFWCkpOworICAgICAgICBtYmNCYW5kLnNldFByZUdhaW4oVEVTVF9HQUlOMSk7CisgICAgICAgIGNoYW5uZWwuc2V0TWJjQmFuZChURVNUX0JBTkRfSU5ERVgsIG1iY0JhbmQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm1iY0JhbmQgcHJlR2FpbiBpcyBkaWZmZXJlbnQgaW4gYmFuZCAiICsgVEVTVF9CQU5EX0lOREVYLAorICAgICAgICAgICAgICAgIFRFU1RfR0FJTjEsIGNoYW5uZWwuZ2V0TWJjQmFuZChURVNUX0JBTkRfSU5ERVgpLmdldFByZUdhaW4oKSwgRVBTSUxPTik7CisgICAgICAgIG1iY0JhbmQuc2V0UHJlR2FpbihURVNUX0dBSU4yKTsKKyAgICAgICAgY2hhbm5lbC5zZXRNYmNCYW5kKFRFU1RfQkFORF9JTkRFWCwgbWJjQmFuZCk7CisgICAgICAgIGFzc2VydEVxdWFscygibWJjQmFuZCBwcmVHYWluIGlzIGRpZmZlcmVudCBpbiBiYW5kICIgKyBURVNUX0JBTkRfSU5ERVgsCisgICAgICAgICAgICAgICAgVEVTVF9HQUlOMiwgY2hhbm5lbC5nZXRNYmNCYW5kKFRFU1RfQkFORF9JTkRFWCkuZ2V0UHJlR2FpbigpLCBFUFNJTE9OKTsKKworICAgICAgICBFcUJhbmQgcG9zdEVxQmFuZCA9IG5ldyBFcUJhbmQoY2hhbm5lbC5nZXRQb3N0RXFCYW5kKFRFU1RfQkFORF9JTkRFWCkpOworICAgICAgICBwb3N0RXFCYW5kLnNldEdhaW4oVEVTVF9HQUlOMSk7CisgICAgICAgIGNoYW5uZWwuc2V0UG9zdEVxQmFuZChURVNUX0JBTkRfSU5ERVgsIHBvc3RFcUJhbmQpOworICAgICAgICBhc3NlcnRFcXVhbHMoInBvc3RFcUJhbmQgZ2FpbiBpcyBkaWZmZXJlbnQgaW4gYmFuZCAiICsgVEVTVF9CQU5EX0lOREVYLAorICAgICAgICAgICAgICAgIFRFU1RfR0FJTjEsIGNoYW5uZWwuZ2V0UG9zdEVxQmFuZChURVNUX0JBTkRfSU5ERVgpLmdldEdhaW4oKSwgRVBTSUxPTik7CisgICAgICAgIHBvc3RFcUJhbmQuc2V0R2FpbihURVNUX0dBSU4yKTsKKyAgICAgICAgY2hhbm5lbC5zZXRQb3N0RXFCYW5kKFRFU1RfQkFORF9JTkRFWCwgcG9zdEVxQmFuZCk7CisgICAgICAgIGFzc2VydEVxdWFscygicG9zdEVxQmFuZCBnYWluIGlzIGRpZmZlcmVudCBpbiBiYW5kICIgKyBURVNUX0JBTkRfSU5ERVgsCisgICAgICAgICAgICAgICAgVEVTVF9HQUlOMiwgY2hhbm5lbC5nZXRQb3N0RXFCYW5kKFRFU1RfQkFORF9JTkRFWCkuZ2V0R2FpbigpLCBFUFNJTE9OKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Ml82RXEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFoYXNBdWRpb091dHB1dCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgYm9vbGVhbiBpblVzZSA9IHRydWU7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gZW5hYmxlZCA9IHRydWU7CisgICAgICAgIGZpbmFsIGludCBiYW5kQ291bnQgPSAzOworCisgICAgICAgIEVxIGVxID0gbmV3IEVxKGluVXNlLCBlbmFibGVkLCBiYW5kQ291bnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoImVxIGluVXNlIGlzIGRpZmZlcmVudCIsIGluVXNlLCBlcS5pc0luVXNlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImVxIGVuYWJsZWQgaXMgZGlmZmVyZW50IiwgZW5hYmxlZCwgZXEuaXNFbmFibGVkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImVxIGJhbmRDb3VudCBpcyBkaWZmZXJlbnQiLCBiYW5kQ291bnQsIGVxLmdldEJhbmRDb3VudCgpKTsKKworICAgICAgICAvLyBjaGFuZ2VzCisgICAgICAgIGVxLnNldEVuYWJsZWQoIWVuYWJsZWQpOworICAgICAgICBhc3NlcnRFcXVhbHMoImVxIGVuYWJsZWQgaXMgZGlmZmVyZW50IiwgIWVuYWJsZWQsIGVxLmlzRW5hYmxlZCgpKTsKKworICAgICAgICAvLyBiYW5kcworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJhbmRDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBmbG9hdCBmcmVxdWVuY3kgPSAoaSArIDEpICogMTAwLjNmOworICAgICAgICAgICAgZmluYWwgZmxvYXQgZ2FpbiA9IChpICsgMSkgKiAxMC4xZjsKKyAgICAgICAgICAgIEVxQmFuZCBlcUJhbmQgPSBuZXcgRXFCYW5kKGVxLmdldEJhbmQoaSkpOworCisgICAgICAgICAgICBlcUJhbmQuc2V0RW5hYmxlZChlbmFibGVkKTsKKyAgICAgICAgICAgIGVxQmFuZC5zZXRDdXRvZmZGcmVxdWVuY3koZnJlcXVlbmN5KTsKKyAgICAgICAgICAgIGVxQmFuZC5zZXRHYWluKGdhaW4pOworCisgICAgICAgICAgICBlcS5zZXRCYW5kKGksIGVxQmFuZCk7CisKKyAgICAgICAgICAgIC8vIGNvbXBhcmUKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZXEgZW5hYmxlZCBpcyBkaWZmZXJlbnQgaW4gYmFuZCAiICsgaSwgZW5hYmxlZCwKKyAgICAgICAgICAgICAgICAgICAgZXEuZ2V0QmFuZChpKS5pc0VuYWJsZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImVxIGN1dG9mZkZyZXF1ZW5jeSBpcyBkaWZmZXJlbnQgaW4gYmFuZCAiICsgaSwKKyAgICAgICAgICAgICAgICAgICAgZnJlcXVlbmN5LCBlcS5nZXRCYW5kKGkpLmdldEN1dG9mZkZyZXF1ZW5jeSgpLCBFUFNJTE9OKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZXEgZXFCYW5kIGdhaW4gaXMgZGlmZmVyZW50IGluIGJhbmQgIiArIGksCisgICAgICAgICAgICAgICAgICAgIGdhaW4sIGVxLmdldEJhbmQoaSkuZ2V0R2FpbigpLCBFUFNJTE9OKTsKKworICAgICAgICAgICAgLy8gRXFCYW5kIGNvbnN0cnVjdG9yCisgICAgICAgICAgICBFcUJhbmQgZXFCYW5kMiA9IG5ldyBFcUJhbmQoZW5hYmxlZCwgZnJlcXVlbmN5LCBnYWluKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJlcSBlbmFibGVkIGlzIGRpZmZlcmVudCBpbiBiYW5kICIgKyBpLCBlbmFibGVkLAorICAgICAgICAgICAgICAgICAgICBlcUJhbmQyLmlzRW5hYmxlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZXEgY3V0b2ZmRnJlcXVlbmN5IGlzIGRpZmZlcmVudCBpbiBiYW5kICIgKyBpLAorICAgICAgICAgICAgICAgICAgICBmcmVxdWVuY3ksIGVxQmFuZDIuZ2V0Q3V0b2ZmRnJlcXVlbmN5KCksIEVQU0lMT04pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJlcSBlcUJhbmQgZ2FpbiBpcyBkaWZmZXJlbnQgaW4gYmFuZCAiICsgaSwKKyAgICAgICAgICAgICAgICAgICAgZ2FpbiwgZXFCYW5kMi5nZXRHYWluKCksIEVQU0lMT04pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDJfN01iYygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIWhhc0F1ZGlvT3V0cHV0KCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGJvb2xlYW4gaW5Vc2UgPSB0cnVlOworICAgICAgICBmaW5hbCBib29sZWFuIGVuYWJsZWQgPSB0cnVlOworICAgICAgICBmaW5hbCBpbnQgYmFuZENvdW50ID0gMzsKKworICAgICAgICBNYmMgbWJjID0gbmV3IE1iYyhpblVzZSwgZW5hYmxlZCwgYmFuZENvdW50KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJtYmMgaW5Vc2UgaXMgZGlmZmVyZW50IiwgaW5Vc2UsIG1iYy5pc0luVXNlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm1iYyBlbmFibGVkIGlzIGRpZmZlcmVudCIsIGVuYWJsZWQsIG1iYy5pc0VuYWJsZWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygibWJjIGJhbmRDb3VudCBpcyBkaWZmZXJlbnQiLCBiYW5kQ291bnQsIG1iYy5nZXRCYW5kQ291bnQoKSk7CisKKyAgICAgICAgLy8gY2hhbmdlcworICAgICAgICBtYmMuc2V0RW5hYmxlZCghZW5hYmxlZCk7CisgICAgICAgIGFzc2VydEVxdWFscygiZW5hYmxlZCBpcyBkaWZmZXJlbnQiLCAhZW5hYmxlZCwgbWJjLmlzRW5hYmxlZCgpKTsKKworICAgICAgICAvLyBiYW5kcworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJhbmRDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBpICsgMTsKKyAgICAgICAgICAgIGZpbmFsIGZsb2F0IGZyZXF1ZW5jeSA9IGluZGV4ICogMTAwLjNmOworICAgICAgICAgICAgZmluYWwgZmxvYXQgYXR0YWNrVGltZSA9IGluZGV4ICogMy4yZjsKKyAgICAgICAgICAgIGZpbmFsIGZsb2F0IHJlbGVhc2VUaW1lID0gMiAqIGF0dGFja1RpbWU7CisgICAgICAgICAgICBmaW5hbCBmbG9hdCByYXRpbyA9IGluZGV4ICogMS4yZjsKKyAgICAgICAgICAgIGZpbmFsIGZsb2F0IHRocmVzaG9sZCA9IGluZGV4ICogKC0xMi44Zik7CisgICAgICAgICAgICBmaW5hbCBmbG9hdCBrbmVlV2lkdGggPSBpbmRleCAqIDAuM2Y7CisgICAgICAgICAgICBmaW5hbCBmbG9hdCBub2lzZUdhdGVUaHJlc2hvbGQgPSBpbmRleCAqICgtMjAuMWYpOworICAgICAgICAgICAgZmluYWwgZmxvYXQgZXhwYW5kZXJSYXRpbyA9IGluZGV4ICogMS4xZjsKKyAgICAgICAgICAgIGZpbmFsIGZsb2F0IHByZUdhaW4gPSBpbmRleCAqIDEwLjFmOworICAgICAgICAgICAgZmluYWwgZmxvYXQgcG9zdEdhaW4gPSBpbmRleCAqICgtMC4yZik7CisgICAgICAgICAgICBNYmNCYW5kIG1iY0JhbmQgPSBuZXcgTWJjQmFuZChtYmMuZ2V0QmFuZChpKSk7CisKKyAgICAgICAgICAgIG1iY0JhbmQuc2V0RW5hYmxlZChlbmFibGVkKTsKKyAgICAgICAgICAgIG1iY0JhbmQuc2V0Q3V0b2ZmRnJlcXVlbmN5KGZyZXF1ZW5jeSk7CisgICAgICAgICAgICBtYmNCYW5kLnNldEF0dGFja1RpbWUoYXR0YWNrVGltZSk7CisgICAgICAgICAgICBtYmNCYW5kLnNldFJlbGVhc2VUaW1lKHJlbGVhc2VUaW1lKTsKKyAgICAgICAgICAgIG1iY0JhbmQuc2V0UmF0aW8ocmF0aW8pOworICAgICAgICAgICAgbWJjQmFuZC5zZXRUaHJlc2hvbGQodGhyZXNob2xkKTsKKyAgICAgICAgICAgIG1iY0JhbmQuc2V0S25lZVdpZHRoKGtuZWVXaWR0aCk7CisgICAgICAgICAgICBtYmNCYW5kLnNldE5vaXNlR2F0ZVRocmVzaG9sZChub2lzZUdhdGVUaHJlc2hvbGQpOworICAgICAgICAgICAgbWJjQmFuZC5zZXRFeHBhbmRlclJhdGlvKGV4cGFuZGVyUmF0aW8pOworICAgICAgICAgICAgbWJjQmFuZC5zZXRQcmVHYWluKHByZUdhaW4pOworICAgICAgICAgICAgbWJjQmFuZC5zZXRQb3N0R2Fpbihwb3N0R2Fpbik7CisKKyAgICAgICAgICAgIG1iYy5zZXRCYW5kKGksIG1iY0JhbmQpOworCisgICAgICAgICAgICAvLyBjb21wYXJlCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIm1iYyBlbmFibGVkIGlzIGRpZmZlcmVudCIsIGVuYWJsZWQsIG1iYy5nZXRCYW5kKGkpLmlzRW5hYmxlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygibWJjIGN1dG9mZkZyZXF1ZW5jeSBpcyBkaWZmZXJlbnQgaW4gYmFuZCAiICsgaSwKKyAgICAgICAgICAgICAgICAgICAgZnJlcXVlbmN5LCBtYmMuZ2V0QmFuZChpKS5nZXRDdXRvZmZGcmVxdWVuY3koKSwgRVBTSUxPTik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIm1iYyBhdHRhY2tUaW1lIGlzIGRpZmZlcmVudCBpbiBiYW5kICIgKyBpLAorICAgICAgICAgICAgICAgICAgICBhdHRhY2tUaW1lLCBtYmMuZ2V0QmFuZChpKS5nZXRBdHRhY2tUaW1lKCksIEVQU0lMT04pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJtYmMgcmVsZWFzZVRpbWUgaXMgZGlmZmVyZW50IGluIGJhbmQgIiArIGksCisgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VUaW1lLCBtYmMuZ2V0QmFuZChpKS5nZXRSZWxlYXNlVGltZSgpLCBFUFNJTE9OKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygibWJjIHJhdGlvIGlzIGRpZmZlcmVudCBpbiBiYW5kICIgKyBpLAorICAgICAgICAgICAgICAgICAgICByYXRpbywgbWJjLmdldEJhbmQoaSkuZ2V0UmF0aW8oKSwgRVBTSUxPTik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIm1iYyB0aHJlc2hvbGQgaXMgZGlmZmVyZW50IGluIGJhbmQgIiArIGksCisgICAgICAgICAgICAgICAgICAgIHRocmVzaG9sZCwgbWJjLmdldEJhbmQoaSkuZ2V0VGhyZXNob2xkKCksIEVQU0lMT04pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJtYmMga25lZVdpZHRoIGlzIGRpZmZlcmVudCBpbiBiYW5kICIgKyBpLAorICAgICAgICAgICAgICAgICAgICBrbmVlV2lkdGgsIG1iYy5nZXRCYW5kKGkpLmdldEtuZWVXaWR0aCgpLCBFUFNJTE9OKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygibWJjIG5vaXNlR2F0ZVRocmVzaG9sZCBpcyBkaWZmZXJlbnQgaW4gYmFuZCAiICsgaSwKKyAgICAgICAgICAgICAgICAgICAgbm9pc2VHYXRlVGhyZXNob2xkLCBtYmMuZ2V0QmFuZChpKS5nZXROb2lzZUdhdGVUaHJlc2hvbGQoKSwgRVBTSUxPTik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIm1iYyBleHBhbmRlclJhdGlvIGlzIGRpZmZlcmVudCBpbiBiYW5kICIgKyBpLAorICAgICAgICAgICAgICAgICAgICBleHBhbmRlclJhdGlvLCBtYmMuZ2V0QmFuZChpKS5nZXRFeHBhbmRlclJhdGlvKCksIEVQU0lMT04pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJtYmMgcHJlR2FpbiBpcyBkaWZmZXJlbnQgaW4gYmFuZCAiICsgaSwKKyAgICAgICAgICAgICAgICAgICAgcHJlR2FpbiwgbWJjLmdldEJhbmQoaSkuZ2V0UHJlR2FpbigpLCBFUFNJTE9OKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygibWJjIHBvc3RHYWluIGlzIGRpZmZlcmVudCBpbiBiYW5kICIgKyBpLAorICAgICAgICAgICAgICAgICAgICBwb3N0R2FpbiwgbWJjLmdldEJhbmQoaSkuZ2V0UG9zdEdhaW4oKSwgRVBTSUxPTik7CisKKyAgICAgICAgICAgIC8vIE1iY0JhbmQgY29uc3RydWN0b3IKKyAgICAgICAgICAgIE1iY0JhbmQgbWJjQmFuZDIgPSBuZXcgTWJjQmFuZChlbmFibGVkLCBmcmVxdWVuY3ksIGF0dGFja1RpbWUsIHJlbGVhc2VUaW1lLCByYXRpbywKKyAgICAgICAgICAgICAgICAgICAgdGhyZXNob2xkLCBrbmVlV2lkdGgsIG5vaXNlR2F0ZVRocmVzaG9sZCwgZXhwYW5kZXJSYXRpbywgcHJlR2FpbiwgcG9zdEdhaW4pOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIm1iYyBlbmFibGVkIGlzIGRpZmZlcmVudCIsIGVuYWJsZWQsIG1iY0JhbmQyLmlzRW5hYmxlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygibWJjIGN1dG9mZkZyZXF1ZW5jeSBpcyBkaWZmZXJlbnQgaW4gYmFuZCAiICsgaSwKKyAgICAgICAgICAgICAgICAgICAgZnJlcXVlbmN5LCBtYmNCYW5kMi5nZXRDdXRvZmZGcmVxdWVuY3koKSwgRVBTSUxPTik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIm1iYyBhdHRhY2tUaW1lIGlzIGRpZmZlcmVudCBpbiBiYW5kICIgKyBpLAorICAgICAgICAgICAgICAgICAgICBhdHRhY2tUaW1lLCBtYmNCYW5kMi5nZXRBdHRhY2tUaW1lKCksIEVQU0lMT04pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJtYmMgcmVsZWFzZVRpbWUgaXMgZGlmZmVyZW50IGluIGJhbmQgIiArIGksCisgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VUaW1lLCBtYmNCYW5kMi5nZXRSZWxlYXNlVGltZSgpLCBFUFNJTE9OKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygibWJjIHJhdGlvIGlzIGRpZmZlcmVudCBpbiBiYW5kICIgKyBpLAorICAgICAgICAgICAgICAgICAgICByYXRpbywgbWJjQmFuZDIuZ2V0UmF0aW8oKSwgRVBTSUxPTik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIm1iYyB0aHJlc2hvbGQgaXMgZGlmZmVyZW50IGluIGJhbmQgIiArIGksCisgICAgICAgICAgICAgICAgICAgIHRocmVzaG9sZCwgbWJjQmFuZDIuZ2V0VGhyZXNob2xkKCksIEVQU0lMT04pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJtYmMga25lZVdpZHRoIGlzIGRpZmZlcmVudCBpbiBiYW5kICIgKyBpLAorICAgICAgICAgICAgICAgICAgICBrbmVlV2lkdGgsIG1iY0JhbmQyLmdldEtuZWVXaWR0aCgpLCBFUFNJTE9OKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygibWJjIG5vaXNlR2F0ZVRocmVzaG9sZCBpcyBkaWZmZXJlbnQgaW4gYmFuZCAiICsgaSwKKyAgICAgICAgICAgICAgICAgICAgbm9pc2VHYXRlVGhyZXNob2xkLCBtYmNCYW5kMi5nZXROb2lzZUdhdGVUaHJlc2hvbGQoKSwgRVBTSUxPTik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIm1iYyBleHBhbmRlclJhdGlvIGlzIGRpZmZlcmVudCBpbiBiYW5kICIgKyBpLAorICAgICAgICAgICAgICAgICAgICBleHBhbmRlclJhdGlvLCBtYmNCYW5kMi5nZXRFeHBhbmRlclJhdGlvKCksIEVQU0lMT04pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJtYmMgcHJlR2FpbiBpcyBkaWZmZXJlbnQgaW4gYmFuZCAiICsgaSwKKyAgICAgICAgICAgICAgICAgICAgcHJlR2FpbiwgbWJjQmFuZDIuZ2V0UHJlR2FpbigpLCBFUFNJTE9OKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygibWJjIHBvc3RHYWluIGlzIGRpZmZlcmVudCBpbiBiYW5kICIgKyBpLAorICAgICAgICAgICAgICAgICAgICBwb3N0R2FpbiwgbWJjQmFuZDIuZ2V0UG9zdEdhaW4oKSwgRVBTSUxPTik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Ml84TGltaXRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIWhhc0F1ZGlvT3V0cHV0KCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGJvb2xlYW4gaW5Vc2UgPSB0cnVlOworICAgICAgICBmaW5hbCBib29sZWFuIGVuYWJsZWQgPSB0cnVlOworICAgICAgICBmaW5hbCBpbnQgbGlua0dyb3VwID0gNDsKKyAgICAgICAgZmluYWwgZmxvYXQgYXR0YWNrVGltZSA9IDMuMmY7CisgICAgICAgIGZpbmFsIGZsb2F0IHJlbGVhc2VUaW1lID0gMiAqIGF0dGFja1RpbWU7CisgICAgICAgIGZpbmFsIGZsb2F0IHJhdGlvID0gMS4yZjsKKyAgICAgICAgZmluYWwgZmxvYXQgdGhyZXNob2xkID0gKC0xMi44Zik7CisgICAgICAgIGZpbmFsIGZsb2F0IHBvc3RHYWluID0gKC0wLjJmKTsKKworICAgICAgICBMaW1pdGVyIGxpbWl0ZXIgPSBuZXcgTGltaXRlcihpblVzZSwgZW5hYmxlZCwgbGlua0dyb3VwLCBhdHRhY2tUaW1lLCByZWxlYXNlVGltZSwgcmF0aW8sCisgICAgICAgICAgICAgICAgdGhyZXNob2xkLCBwb3N0R2Fpbik7CisgICAgICAgIGFzc2VydEVxdWFscygibGltaXRlciBpblVzZSBpcyBkaWZmZXJlbnQiLCBpblVzZSwgbGltaXRlci5pc0luVXNlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImxpbWl0ZXIgZW5hYmxlZCBpcyBkaWZmZXJlbnQiLCBlbmFibGVkLCBsaW1pdGVyLmlzRW5hYmxlZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJsaW1pdGVyIGxpbmtHcm91cCBpcyBkaWZmZXJlbnQiLCBsaW5rR3JvdXAsIGxpbWl0ZXIuZ2V0TGlua0dyb3VwKCkpOworCisgICAgICAgIC8vIGRlZmF1bHRzCisgICAgICAgIGFzc2VydEVxdWFscygibGltaXRlciBhdHRhY2tUaW1lIGlzIGRpZmZlcmVudCIsCisgICAgICAgICAgICAgICAgYXR0YWNrVGltZSwgbGltaXRlci5nZXRBdHRhY2tUaW1lKCksIEVQU0lMT04pOworICAgICAgICBhc3NlcnRFcXVhbHMoImxpbWl0ZXIgcmVsZWFzZVRpbWUgaXMgZGlmZmVyZW50IiwKKyAgICAgICAgICAgICAgICByZWxlYXNlVGltZSwgbGltaXRlci5nZXRSZWxlYXNlVGltZSgpLCBFUFNJTE9OKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJsaW1pdGVyIHJhdGlvIGlzIGRpZmZlcmVudCIsCisgICAgICAgICAgICAgICAgcmF0aW8sIGxpbWl0ZXIuZ2V0UmF0aW8oKSwgRVBTSUxPTik7CisgICAgICAgIGFzc2VydEVxdWFscygibGltaXRlciB0aHJlc2hvbGQgaXMgZGlmZmVyZW50IiwKKyAgICAgICAgICAgICAgICB0aHJlc2hvbGQsIGxpbWl0ZXIuZ2V0VGhyZXNob2xkKCksIEVQU0lMT04pOworICAgICAgICBhc3NlcnRFcXVhbHMoImxpbWl0ZXIgcG9zdEdhaW4gaXMgZGlmZmVyZW50IiwKKyAgICAgICAgICAgICAgICBwb3N0R2FpbiwgbGltaXRlci5nZXRQb3N0R2FpbigpLCBFUFNJTE9OKTsKKworICAgICAgICAvLyBjaGFuZ2VzCisgICAgICAgIGZpbmFsIGJvb2xlYW4gbmV3RW5hYmxlZCA9ICFlbmFibGVkOworICAgICAgICBmaW5hbCBpbnQgbmV3TGlua0dyb3VwID0gNzsKKyAgICAgICAgZmluYWwgZmxvYXQgbmV3QXR0YWNrVGltZSA9IGF0dGFja1RpbWUgKyAxMDsKKyAgICAgICAgZmluYWwgZmxvYXQgbmV3UmVsZWFzZVRpbWUgPSByZWxlYXNlVGltZSArIDEwOworICAgICAgICBmaW5hbCBmbG9hdCBuZXdSYXRpbyA9IHJhdGlvICsgMmY7CisgICAgICAgIGZpbmFsIGZsb2F0IG5ld1RocmVzaG9sZCA9IHRocmVzaG9sZCAtIDIwZjsKKyAgICAgICAgZmluYWwgZmxvYXQgbmV3UG9zdEdhaW4gPSBwb3N0R2FpbiArIDNmOworCisgICAgICAgIGxpbWl0ZXIuc2V0RW5hYmxlZChuZXdFbmFibGVkKTsKKyAgICAgICAgbGltaXRlci5zZXRMaW5rR3JvdXAobmV3TGlua0dyb3VwKTsKKyAgICAgICAgbGltaXRlci5zZXRBdHRhY2tUaW1lKG5ld0F0dGFja1RpbWUpOworICAgICAgICBsaW1pdGVyLnNldFJlbGVhc2VUaW1lKG5ld1JlbGVhc2VUaW1lKTsKKyAgICAgICAgbGltaXRlci5zZXRSYXRpbyhuZXdSYXRpbyk7CisgICAgICAgIGxpbWl0ZXIuc2V0VGhyZXNob2xkKG5ld1RocmVzaG9sZCk7CisgICAgICAgIGxpbWl0ZXIuc2V0UG9zdEdhaW4obmV3UG9zdEdhaW4pOworCisgICAgICAgIGFzc2VydEVxdWFscygibGltaXRlciBlbmFibGVkIGlzIGRpZmZlcmVudCIsIG5ld0VuYWJsZWQsIGxpbWl0ZXIuaXNFbmFibGVkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImxpbWl0ZXIgbGlua0dyb3VwIGlzIGRpZmZlcmVudCIsIG5ld0xpbmtHcm91cCwgbGltaXRlci5nZXRMaW5rR3JvdXAoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygibGltaXRlciBhdHRhY2tUaW1lIGlzIGRpZmZlcmVudCIsCisgICAgICAgICAgICAgICAgbmV3QXR0YWNrVGltZSwgbGltaXRlci5nZXRBdHRhY2tUaW1lKCksIEVQU0lMT04pOworICAgICAgICBhc3NlcnRFcXVhbHMoImxpbWl0ZXIgcmVsZWFzZVRpbWUgaXMgZGlmZmVyZW50IiwKKyAgICAgICAgICAgICAgICBuZXdSZWxlYXNlVGltZSwgbGltaXRlci5nZXRSZWxlYXNlVGltZSgpLCBFUFNJTE9OKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJsaW1pdGVyIHJhdGlvIGlzIGRpZmZlcmVudCIsCisgICAgICAgICAgICAgICAgbmV3UmF0aW8sIGxpbWl0ZXIuZ2V0UmF0aW8oKSwgRVBTSUxPTik7CisgICAgICAgIGFzc2VydEVxdWFscygibGltaXRlciB0aHJlc2hvbGQgaXMgZGlmZmVyZW50IiwKKyAgICAgICAgICAgICAgICBuZXdUaHJlc2hvbGQsIGxpbWl0ZXIuZ2V0VGhyZXNob2xkKCksIEVQU0lMT04pOworICAgICAgICBhc3NlcnRFcXVhbHMoImxpbWl0ZXIgcG9zdEdhaW4gaXMgZGlmZmVyZW50IiwKKyAgICAgICAgICAgICAgICBuZXdQb3N0R2FpbiwgbGltaXRlci5nZXRQb3N0R2FpbigpLCBFUFNJTE9OKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Ml85QmFuZFN0YWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghaGFzQXVkaW9PdXRwdXQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgYm9vbGVhbiBpblVzZSA9IHRydWU7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gZW5hYmxlZCA9IHRydWU7CisgICAgICAgIGZpbmFsIGludCBiYW5kQ291bnQgPSAzOworCisgICAgICAgIEJhbmRTdGFnZSBiYW5kU3RhZ2UgPSBuZXcgQmFuZFN0YWdlKGluVXNlLCBlbmFibGVkLCBiYW5kQ291bnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoImJhbmRTdGFnZSBpblVzZSBpcyBkaWZmZXJlbnQiLCBpblVzZSwgYmFuZFN0YWdlLmlzSW5Vc2UoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYmFuZFN0YWdlIGVuYWJsZWQgaXMgZGlmZmVyZW50IiwgZW5hYmxlZCwgYmFuZFN0YWdlLmlzRW5hYmxlZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiYW5kU3RhZ2UgYmFuZENvdW50IGlzIGRpZmZlcmVudCIsIGJhbmRDb3VudCwgYmFuZFN0YWdlLmdldEJhbmRDb3VudCgpKTsKKworICAgICAgICAvLyBjaGFuZ2UKKyAgICAgICAgYmFuZFN0YWdlLnNldEVuYWJsZWQoIWVuYWJsZWQpOworICAgICAgICBhc3NlcnRFcXVhbHMoImJhbmRTdGFnZSBlbmFibGVkIGlzIGRpZmZlcmVudCIsICFlbmFibGVkLCBiYW5kU3RhZ2UuaXNFbmFibGVkKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QyXzEwU3RhZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFoYXNBdWRpb091dHB1dCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBib29sZWFuIGluVXNlID0gdHJ1ZTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBlbmFibGVkID0gdHJ1ZTsKKyAgICAgICAgZmluYWwgaW50IGJhbmRDb3VudCA9IDM7CisKKyAgICAgICAgRHluYW1pY3NQcm9jZXNzaW5nLlN0YWdlIHN0YWdlID0gbmV3IER5bmFtaWNzUHJvY2Vzc2luZy5TdGFnZShpblVzZSwgZW5hYmxlZCk7CisgICAgICAgIGFzc2VydEVxdWFscygic3RhZ2UgaW5Vc2UgaXMgZGlmZmVyZW50IiwgaW5Vc2UsIHN0YWdlLmlzSW5Vc2UoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygic3RhZ2UgZW5hYmxlZCBpcyBkaWZmZXJlbnQiLCBlbmFibGVkLCBzdGFnZS5pc0VuYWJsZWQoKSk7CisKKyAgICAgICAgLy8gY2hhbmdlCisgICAgICAgIHN0YWdlLnNldEVuYWJsZWQoIWVuYWJsZWQpOworICAgICAgICBhc3NlcnRFcXVhbHMoInN0YWdlIGVuYWJsZWQgaXMgZGlmZmVyZW50IiwgIWVuYWJsZWQsIHN0YWdlLmlzRW5hYmxlZCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Ml8xMUJhbmRCYXNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghaGFzQXVkaW9PdXRwdXQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgYm9vbGVhbiBlbmFibGVkID0gdHJ1ZTsKKyAgICAgICAgZmluYWwgZmxvYXQgZnJlcXVlbmN5ID0gMTAwLjNmOworCisgICAgICAgIEJhbmRCYXNlIGJhbmRCYXNlID0gbmV3IEJhbmRCYXNlKGVuYWJsZWQsIGZyZXF1ZW5jeSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiYW5kQmFzZSBlbmFibGVkIGlzIGRpZmZlcmVudCIsIGVuYWJsZWQsIGJhbmRCYXNlLmlzRW5hYmxlZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiYW5kQmFzZSBjdXRvZmZGcmVxdWVuY3kgaXMgZGlmZmVyZW50IiwKKyAgICAgICAgICAgICAgICBmcmVxdWVuY3ksIGJhbmRCYXNlLmdldEN1dG9mZkZyZXF1ZW5jeSgpLCBFUFNJTE9OKTsKKworICAgICAgICAvLyBjaGFuZ2UKKyAgICAgICAgZmluYWwgZmxvYXQgbmV3RnJlcXVlbmN5ID0gZnJlcXVlbmN5ICsgMTBmOworICAgICAgICBiYW5kQmFzZS5zZXRFbmFibGVkKCFlbmFibGVkKTsKKyAgICAgICAgYmFuZEJhc2Uuc2V0Q3V0b2ZmRnJlcXVlbmN5KG5ld0ZyZXF1ZW5jeSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYmFuZEJhc2UgZW5hYmxlZCBpcyBkaWZmZXJlbnQiLCAhZW5hYmxlZCwgYmFuZEJhc2UuaXNFbmFibGVkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImJhbmRCYXNlIGN1dG9mZkZyZXF1ZW5jeSBpcyBkaWZmZXJlbnQiLAorICAgICAgICAgICAgICAgIG5ld0ZyZXF1ZW5jeSwgYmFuZEJhc2UuZ2V0Q3V0b2ZmRnJlcXVlbmN5KCksIEVQU0lMT04pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QyXzEyQ2hhbm5lbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIWhhc0F1ZGlvT3V0cHV0KCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGZsb2F0IGlucHV0R2FpbiA9IDMuNGY7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gcHJlRXFJblVzZSA9IHRydWU7CisgICAgICAgIGZpbmFsIGludCBwcmVFcUJhbmRDb3VudCA9IDM7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gbWJjSW5Vc2UgPSB0cnVlOworICAgICAgICBmaW5hbCBpbnQgbWJjQmFuZENvdW50ID0gNDsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBwb3N0RXFJblVzZSA9IHRydWU7CisgICAgICAgIGZpbmFsIGludCBwb3N0RXFCYW5kQ291bnQgPSA1OworICAgICAgICBmaW5hbCBib29sZWFuIGxpbWl0ZXJJblVzZSA9IHRydWU7CisKKyAgICAgICAgQ2hhbm5lbCBjaGFubmVsID0gbmV3IENoYW5uZWwoaW5wdXRHYWluLCBwcmVFcUluVXNlLCBwcmVFcUJhbmRDb3VudCwgbWJjSW5Vc2UsCisgICAgICAgICAgICAgICAgbWJjQmFuZENvdW50LCBwb3N0RXFJblVzZSwgcG9zdEVxQmFuZENvdW50LCBsaW1pdGVySW5Vc2UpOworCisgICAgICAgIGFzc2VydEVxdWFscygiY2hhbm5lbCBpbnB1dEdhaW4gaXMgZGlmZmVyZW50IiwgaW5wdXRHYWluLAorICAgICAgICAgICAgICAgIGNoYW5uZWwuZ2V0SW5wdXRHYWluKCksIEVQU0lMT04pOworICAgICAgICBhc3NlcnRFcXVhbHMoImNoYW5uZWwgcHJlRXFJblVzZSBpcyBkaWZmZXJlbnQiLCBwcmVFcUluVXNlLCBjaGFubmVsLmdldFByZUVxKCkuaXNJblVzZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjaGFubmVsIHByZUVxQmFuZENvdW50IGlzIGRpZmZlcmVudCIsIHByZUVxQmFuZENvdW50LAorICAgICAgICAgICAgICAgIGNoYW5uZWwuZ2V0UHJlRXEoKS5nZXRCYW5kQ291bnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY2hhbm5lbCBtYmNJblVzZSBpcyBkaWZmZXJlbnQiLCBtYmNJblVzZSwgY2hhbm5lbC5nZXRNYmMoKS5pc0luVXNlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNoYW5uZWwgbWJjQmFuZENvdW50IGlzIGRpZmZlcmVudCIsIG1iY0JhbmRDb3VudCwKKyAgICAgICAgICAgICAgICBjaGFubmVsLmdldE1iYygpLmdldEJhbmRDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjaGFubmVsIHBvc3RFcUluVXNlIGlzIGRpZmZlcmVudCIsIHBvc3RFcUluVXNlLAorICAgICAgICAgICAgICAgIGNoYW5uZWwuZ2V0UG9zdEVxKCkuaXNJblVzZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjaGFubmVsIHBvc3RFcUJhbmRDb3VudCBpcyBkaWZmZXJlbnQiLCBwb3N0RXFCYW5kQ291bnQsCisgICAgICAgICAgICAgICAgY2hhbm5lbC5nZXRQb3N0RXEoKS5nZXRCYW5kQ291bnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY2hhbm5lbCBsaW1pdGVySW5Vc2UgaXMgZGlmZmVyZW50IiwgbGltaXRlckluVXNlLAorICAgICAgICAgICAgICAgIGNoYW5uZWwuZ2V0TGltaXRlcigpLmlzSW5Vc2UoKSk7CisgICAgfQorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gMyAtIEJ1aWxkZXIKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0M18wQnVpbGRlcl9zdGFnZXNBbGxDaGFubmVscygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIWhhc0F1ZGlvT3V0cHV0KCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIER5bmFtaWNzUHJvY2Vzc2luZy5Db25maWcgY29uZmlnID0gZ2V0QnVpbGRlcldpdGhWYWx1ZXMoTUlOX0NIQU5ORUxfQ09VTlQpLmJ1aWxkKCk7CisgICAgICAgIER5bmFtaWNzUHJvY2Vzc2luZy5Db25maWcuQnVpbGRlciBidWlsZGVyID0gZ2V0QnVpbGRlcldpdGhWYWx1ZXMoVEVTVF9DSEFOTkVMX0NPVU5UKTsKKworICAgICAgICAvLyBnZXQgU3RhZ2VzLCBhcHBseSBhbGwgY2hhbm5lbHMKKyAgICAgICAgRXEgcHJlRXEgPSBuZXcgRXEoY29uZmlnLmdldFByZUVxQnlDaGFubmVsSW5kZXgoVEVTVF9DSEFOTkVMX0lOREVYKSk7CisgICAgICAgIEVxQmFuZCBwcmVFcUJhbmQgPSBuZXcgRXFCYW5kKHByZUVxLmdldEJhbmQoVEVTVF9CQU5EX0lOREVYKSk7CisgICAgICAgIHByZUVxQmFuZC5zZXRHYWluKFRFU1RfR0FJTjEpOworICAgICAgICBwcmVFcS5zZXRCYW5kKFRFU1RfQkFORF9JTkRFWCwgcHJlRXFCYW5kKTsKKyAgICAgICAgYnVpbGRlci5zZXRQcmVFcUFsbENoYW5uZWxzVG8ocHJlRXEpOworCisgICAgICAgIE1iYyBtYmMgPSBuZXcgTWJjKGNvbmZpZy5nZXRNYmNCeUNoYW5uZWxJbmRleChURVNUX0NIQU5ORUxfSU5ERVgpKTsKKyAgICAgICAgTWJjQmFuZCBtYmNCYW5kID0gbmV3IE1iY0JhbmQobWJjLmdldEJhbmQoVEVTVF9CQU5EX0lOREVYKSk7CisgICAgICAgIG1iY0JhbmQuc2V0UHJlR2FpbihURVNUX0dBSU4xKTsKKyAgICAgICAgbWJjLnNldEJhbmQoVEVTVF9CQU5EX0lOREVYLCBtYmNCYW5kKTsKKyAgICAgICAgYnVpbGRlci5zZXRNYmNBbGxDaGFubmVsc1RvKG1iYyk7CisKKyAgICAgICAgRXEgcG9zdEVxID0gbmV3IEVxKGNvbmZpZy5nZXRQb3N0RXFCeUNoYW5uZWxJbmRleChURVNUX0NIQU5ORUxfSU5ERVgpKTsKKyAgICAgICAgRXFCYW5kIHBvc3RFcUJhbmQgPSBuZXcgRXFCYW5kKHBvc3RFcS5nZXRCYW5kKFRFU1RfQkFORF9JTkRFWCkpOworICAgICAgICBwb3N0RXFCYW5kLnNldEdhaW4oVEVTVF9HQUlOMSk7CisgICAgICAgIHBvc3RFcS5zZXRCYW5kKFRFU1RfQkFORF9JTkRFWCwgcG9zdEVxQmFuZCk7CisgICAgICAgIGJ1aWxkZXIuc2V0UG9zdEVxQWxsQ2hhbm5lbHNUbyhwb3N0RXEpOworCisgICAgICAgIExpbWl0ZXIgbGltaXRlciA9IG5ldyBMaW1pdGVyKGNvbmZpZy5nZXRMaW1pdGVyQnlDaGFubmVsSW5kZXgoVEVTVF9DSEFOTkVMX0lOREVYKSk7CisgICAgICAgIGxpbWl0ZXIuc2V0UG9zdEdhaW4oVEVTVF9HQUlOMSk7CisgICAgICAgIGJ1aWxkZXIuc2V0TGltaXRlckFsbENoYW5uZWxzVG8obGltaXRlcik7CisKKyAgICAgICAgLy8gYnVpbGQgYW5kIGNvbXBhcmUKKyAgICAgICAgRHluYW1pY3NQcm9jZXNzaW5nLkNvbmZpZyBuZXdDb25maWcgPSBidWlsZGVyLmJ1aWxkKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgVEVTVF9DSEFOTkVMX0NPVU5UOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygicHJlRVFCYW5kIGdhaW4gaXMgZGlmZmVyZW50IGluIGNoYW5uZWwgIiArIGkgKyAiIGJhbmQgIiArIFRFU1RfQkFORF9JTkRFWCwKKyAgICAgICAgICAgICAgICAgICAgVEVTVF9HQUlOMSwgbmV3Q29uZmlnLmdldFByZUVxQmFuZEJ5Q2hhbm5lbEluZGV4KGksIFRFU1RfQkFORF9JTkRFWCkuZ2V0R2FpbigpLAorICAgICAgICAgICAgICAgICAgICBFUFNJTE9OKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJtYmNCYW5kIHByZUdhaW4gaXMgZGlmZmVyZW50IGluIGNoYW5uZWwgIiArIGkgKyAiIGJhbmQgIiArCisgICAgICAgICAgICAgICAgICAgIFRFU1RfQkFORF9JTkRFWCwgVEVTVF9HQUlOMSwKKyAgICAgICAgICAgICAgICAgICAgbmV3Q29uZmlnLmdldE1iY0JhbmRCeUNoYW5uZWxJbmRleChpLCBURVNUX0JBTkRfSU5ERVgpLmdldFByZUdhaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgRVBTSUxPTik7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygicG9zdEVRQmFuZCBnYWluIGlzIGRpZmZlcmVudCBpbiBjaGFubmVsICIgKyBpICsgIiBiYW5kICIgKworICAgICAgICAgICAgICAgICAgICBURVNUX0JBTkRfSU5ERVgsIFRFU1RfR0FJTjEsCisgICAgICAgICAgICAgICAgICAgIG5ld0NvbmZpZy5nZXRQb3N0RXFCYW5kQnlDaGFubmVsSW5kZXgoaSwgVEVTVF9CQU5EX0lOREVYKS5nZXRHYWluKCksCisgICAgICAgICAgICAgICAgICAgIEVQU0lMT04pOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImxpbWl0ZXIgZ2FpbiBpcyBkaWZmZXJlbnQgaW4gY2hhbm5lbCAiICsgaSwKKyAgICAgICAgICAgICAgICAgICAgVEVTVF9HQUlOMSwgbmV3Q29uZmlnLmdldExpbWl0ZXJCeUNoYW5uZWxJbmRleChpKS5nZXRQb3N0R2FpbigpLCBFUFNJTE9OKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QzXzFCdWlsZGVyX3N0YWdlc0J5Q2hhbm5lbEluZGV4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghaGFzQXVkaW9PdXRwdXQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgRHluYW1pY3NQcm9jZXNzaW5nLkNvbmZpZyBjb25maWcgPSBnZXRCdWlsZGVyV2l0aFZhbHVlcyhNSU5fQ0hBTk5FTF9DT1VOVCkuYnVpbGQoKTsKKyAgICAgICAgRHluYW1pY3NQcm9jZXNzaW5nLkNvbmZpZy5CdWlsZGVyIGJ1aWxkZXIgPSBnZXRCdWlsZGVyV2l0aFZhbHVlcyhURVNUX0NIQU5ORUxfQ09VTlQpOworCisgICAgICAgIEVxIHByZUVxID0gbmV3IEVxKGNvbmZpZy5nZXRQcmVFcUJ5Q2hhbm5lbEluZGV4KFRFU1RfQ0hBTk5FTF9JTkRFWCkpOworICAgICAgICBFcUJhbmQgcHJlRXFCYW5kID0gbmV3IEVxQmFuZChwcmVFcS5nZXRCYW5kKFRFU1RfQkFORF9JTkRFWCkpOworCisgICAgICAgIE1iYyBtYmMgPSBuZXcgTWJjKGNvbmZpZy5nZXRNYmNCeUNoYW5uZWxJbmRleChURVNUX0NIQU5ORUxfSU5ERVgpKTsKKyAgICAgICAgTWJjQmFuZCBtYmNCYW5kID0gbmV3IE1iY0JhbmQobWJjLmdldEJhbmQoVEVTVF9CQU5EX0lOREVYKSk7CisKKyAgICAgICAgRXEgcG9zdEVxID0gbmV3IEVxKGNvbmZpZy5nZXRQb3N0RXFCeUNoYW5uZWxJbmRleChURVNUX0NIQU5ORUxfSU5ERVgpKTsKKyAgICAgICAgRXFCYW5kIHBvc3RFcUJhbmQgPSBuZXcgRXFCYW5kKHBvc3RFcS5nZXRCYW5kKFRFU1RfQkFORF9JTkRFWCkpOworCisgICAgICAgIExpbWl0ZXIgbGltaXRlciA9IG5ldyBMaW1pdGVyKGNvbmZpZy5nZXRMaW1pdGVyQnlDaGFubmVsSW5kZXgoVEVTVF9DSEFOTkVMX0lOREVYKSk7CisKKyAgICAgICAgLy8gZ2V0IFN0YWdlcywgYXBwbHkgcGVyIGNoYW5uZWwKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBURVNUX0NIQU5ORUxfQ09VTlQ7IGkrKykgeworICAgICAgICAgICAgZmxvYXQgZ2FpbiA9IGkgJSAyID09IDAgPyBURVNUX0dBSU4xIDogVEVTVF9HQUlOMjsKKworICAgICAgICAgICAgYnVpbGRlci5zZXRJbnB1dEdhaW5CeUNoYW5uZWxJbmRleChpLCBnYWluKTsKKworICAgICAgICAgICAgcHJlRXFCYW5kLnNldEdhaW4oZ2Fpbik7CisgICAgICAgICAgICBwcmVFcS5zZXRCYW5kKFRFU1RfQkFORF9JTkRFWCwgcHJlRXFCYW5kKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0UHJlRXFCeUNoYW5uZWxJbmRleChpLCBwcmVFcSk7CisKKyAgICAgICAgICAgIG1iY0JhbmQuc2V0UHJlR2FpbihnYWluKTsKKyAgICAgICAgICAgIG1iYy5zZXRCYW5kKFRFU1RfQkFORF9JTkRFWCwgbWJjQmFuZCk7CisgICAgICAgICAgICBidWlsZGVyLnNldE1iY0J5Q2hhbm5lbEluZGV4KGksIG1iYyk7CisKKyAgICAgICAgICAgIHBvc3RFcUJhbmQuc2V0R2FpbihnYWluKTsKKyAgICAgICAgICAgIHBvc3RFcS5zZXRCYW5kKFRFU1RfQkFORF9JTkRFWCwgcG9zdEVxQmFuZCk7CisgICAgICAgICAgICBidWlsZGVyLnNldFBvc3RFcUJ5Q2hhbm5lbEluZGV4KGksIHBvc3RFcSk7CisKKyAgICAgICAgICAgIGxpbWl0ZXIuc2V0UG9zdEdhaW4oZ2Fpbik7CisgICAgICAgICAgICBidWlsZGVyLnNldExpbWl0ZXJCeUNoYW5uZWxJbmRleChpLCBsaW1pdGVyKTsKKyAgICAgICAgfQorICAgICAgICAvLyBidWlsZCBhbmQgY29tcGFyZQorICAgICAgICBEeW5hbWljc1Byb2Nlc3NpbmcuQ29uZmlnIG5ld0NvbmZpZyA9IGJ1aWxkZXIuYnVpbGQoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBURVNUX0NIQU5ORUxfQ09VTlQ7IGkrKykgeworICAgICAgICAgICAgZmxvYXQgZXhwZWN0ZWRHYWluID0gaSAlIDIgPT0gMCA/IFRFU1RfR0FJTjEgOiBURVNUX0dBSU4yOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImlucHV0R2FpbiBpcyBkaWZmZXJlbnQgaW4gY2hhbm5lbCAiICsgaSwKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRHYWluLAorICAgICAgICAgICAgICAgICAgICBuZXdDb25maWcuZ2V0SW5wdXRHYWluQnlDaGFubmVsSW5kZXgoaSksCisgICAgICAgICAgICAgICAgICAgIEVQU0lMT04pOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInByZUVRQmFuZCBnYWluIGlzIGRpZmZlcmVudCBpbiBjaGFubmVsICIgKyBpICsgIiBiYW5kICIgKyBURVNUX0JBTkRfSU5ERVgsCisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkR2FpbiwKKyAgICAgICAgICAgICAgICAgICAgbmV3Q29uZmlnLmdldFByZUVxQmFuZEJ5Q2hhbm5lbEluZGV4KGksIFRFU1RfQkFORF9JTkRFWCkuZ2V0R2FpbigpLAorICAgICAgICAgICAgICAgICAgICBFUFNJTE9OKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJtYmNCYW5kIHByZUdhaW4gaXMgZGlmZmVyZW50IGluIGNoYW5uZWwgIiArIGkgKyAiIGJhbmQgIiArCisgICAgICAgICAgICAgICAgICAgIFRFU1RfQkFORF9JTkRFWCwgZXhwZWN0ZWRHYWluLAorICAgICAgICAgICAgICAgICAgICBuZXdDb25maWcuZ2V0TWJjQmFuZEJ5Q2hhbm5lbEluZGV4KGksIFRFU1RfQkFORF9JTkRFWCkuZ2V0UHJlR2FpbigpLAorICAgICAgICAgICAgICAgICAgICBFUFNJTE9OKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJwb3N0RVFCYW5kIGdhaW4gaXMgZGlmZmVyZW50IGluIGNoYW5uZWwgIiArIGkgKyAiIGJhbmQgIiArCisgICAgICAgICAgICAgICAgICAgIFRFU1RfQkFORF9JTkRFWCwgZXhwZWN0ZWRHYWluLAorICAgICAgICAgICAgICAgICAgICBuZXdDb25maWcuZ2V0UG9zdEVxQmFuZEJ5Q2hhbm5lbEluZGV4KGksIFRFU1RfQkFORF9JTkRFWCkuZ2V0R2FpbigpLAorICAgICAgICAgICAgICAgICAgICBFUFNJTE9OKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJsaW1pdGVyIGdhaW4gaXMgZGlmZmVyZW50IGluIGNoYW5uZWwgIiArIGksCisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkR2FpbiwgbmV3Q29uZmlnLmdldExpbWl0ZXJCeUNoYW5uZWxJbmRleChpKS5nZXRQb3N0R2FpbigpLCBFUFNJTE9OKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QzXzJCdWlsZGVyX3NldEFsbENoYW5uZWxzVG8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFoYXNBdWRpb091dHB1dCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBEeW5hbWljc1Byb2Nlc3NpbmcuQ29uZmlnIGNvbmZpZyA9IGdldEJ1aWxkZXJXaXRoVmFsdWVzKE1JTl9DSEFOTkVMX0NPVU5UKS5idWlsZCgpOworICAgICAgICBEeW5hbWljc1Byb2Nlc3NpbmcuQ29uZmlnLkJ1aWxkZXIgYnVpbGRlciA9IGdldEJ1aWxkZXJXaXRoVmFsdWVzKFRFU1RfQ0hBTk5FTF9DT1VOVCk7CisKKyAgICAgICAgQ2hhbm5lbCBjaGFubmVsID0gbmV3IENoYW5uZWwoY29uZmlnLmdldENoYW5uZWxCeUNoYW5uZWxJbmRleChURVNUX0NIQU5ORUxfSU5ERVgpKTsKKworICAgICAgICAvLyBnZXQgU3RhZ2VzLCBhcHBseSBhbGwgY2hhbm5lbHMKKyAgICAgICAgRXEgcHJlRXEgPSBuZXcgRXEoY29uZmlnLmdldFByZUVxQnlDaGFubmVsSW5kZXgoVEVTVF9DSEFOTkVMX0lOREVYKSk7CisgICAgICAgIEVxQmFuZCBwcmVFcUJhbmQgPSBuZXcgRXFCYW5kKHByZUVxLmdldEJhbmQoVEVTVF9CQU5EX0lOREVYKSk7CisgICAgICAgIHByZUVxQmFuZC5zZXRHYWluKFRFU1RfR0FJTjEpOworICAgICAgICBwcmVFcS5zZXRCYW5kKFRFU1RfQkFORF9JTkRFWCwgcHJlRXFCYW5kKTsKKyAgICAgICAgY2hhbm5lbC5zZXRQcmVFcShwcmVFcSk7CisKKyAgICAgICAgTWJjIG1iYyA9IG5ldyBNYmMoY29uZmlnLmdldE1iY0J5Q2hhbm5lbEluZGV4KFRFU1RfQ0hBTk5FTF9JTkRFWCkpOworICAgICAgICBNYmNCYW5kIG1iY0JhbmQgPSBuZXcgTWJjQmFuZChtYmMuZ2V0QmFuZChURVNUX0JBTkRfSU5ERVgpKTsKKyAgICAgICAgbWJjQmFuZC5zZXRQcmVHYWluKFRFU1RfR0FJTjEpOworICAgICAgICBtYmMuc2V0QmFuZChURVNUX0JBTkRfSU5ERVgsIG1iY0JhbmQpOworICAgICAgICBjaGFubmVsLnNldE1iYyhtYmMpOworCisgICAgICAgIEVxIHBvc3RFcSA9IG5ldyBFcShjb25maWcuZ2V0UG9zdEVxQnlDaGFubmVsSW5kZXgoVEVTVF9DSEFOTkVMX0lOREVYKSk7CisgICAgICAgIEVxQmFuZCBwb3N0RXFCYW5kID0gbmV3IEVxQmFuZChwb3N0RXEuZ2V0QmFuZChURVNUX0JBTkRfSU5ERVgpKTsKKyAgICAgICAgcG9zdEVxQmFuZC5zZXRHYWluKFRFU1RfR0FJTjEpOworICAgICAgICBwb3N0RXEuc2V0QmFuZChURVNUX0JBTkRfSU5ERVgsIHBvc3RFcUJhbmQpOworICAgICAgICBjaGFubmVsLnNldFBvc3RFcShwb3N0RXEpOworCisgICAgICAgIExpbWl0ZXIgbGltaXRlciA9IG5ldyBMaW1pdGVyKGNvbmZpZy5nZXRMaW1pdGVyQnlDaGFubmVsSW5kZXgoVEVTVF9DSEFOTkVMX0lOREVYKSk7CisgICAgICAgIGxpbWl0ZXIuc2V0UG9zdEdhaW4oVEVTVF9HQUlOMSk7CisgICAgICAgIGNoYW5uZWwuc2V0TGltaXRlcihsaW1pdGVyKTsKKworICAgICAgICBidWlsZGVyLnNldEFsbENoYW5uZWxzVG8oY2hhbm5lbCk7CisgICAgICAgIC8vIGJ1aWxkIGFuZCBjb21wYXJlCisgICAgICAgIER5bmFtaWNzUHJvY2Vzc2luZy5Db25maWcgbmV3Q29uZmlnID0gYnVpbGRlci5idWlsZCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFRFU1RfQ0hBTk5FTF9DT1VOVDsgaSsrKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInByZUVRQmFuZCBnYWluIGlzIGRpZmZlcmVudCBpbiBjaGFubmVsICIgKyBpICsgIiBiYW5kICIgKyBURVNUX0JBTkRfSU5ERVgsCisgICAgICAgICAgICAgICAgICAgIFRFU1RfR0FJTjEsIG5ld0NvbmZpZy5nZXRQcmVFcUJhbmRCeUNoYW5uZWxJbmRleChpLCBURVNUX0JBTkRfSU5ERVgpLmdldEdhaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgRVBTSUxPTik7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygibWJjQmFuZCBwcmVHYWluIGlzIGRpZmZlcmVudCBpbiBjaGFubmVsICIgKyBpICsgIiBiYW5kICIgKworICAgICAgICAgICAgICAgICAgICBURVNUX0JBTkRfSU5ERVgsIFRFU1RfR0FJTjEsCisgICAgICAgICAgICAgICAgICAgIG5ld0NvbmZpZy5nZXRNYmNCYW5kQnlDaGFubmVsSW5kZXgoaSwgVEVTVF9CQU5EX0lOREVYKS5nZXRQcmVHYWluKCksCisgICAgICAgICAgICAgICAgICAgIEVQU0lMT04pOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInBvc3RFUUJhbmQgZ2FpbiBpcyBkaWZmZXJlbnQgaW4gY2hhbm5lbCAiICsgaSArICIgYmFuZCAiICsKKyAgICAgICAgICAgICAgICAgICAgVEVTVF9CQU5EX0lOREVYLCBURVNUX0dBSU4xLAorICAgICAgICAgICAgICAgICAgICBuZXdDb25maWcuZ2V0UG9zdEVxQmFuZEJ5Q2hhbm5lbEluZGV4KGksIFRFU1RfQkFORF9JTkRFWCkuZ2V0R2FpbigpLAorICAgICAgICAgICAgICAgICAgICBFUFNJTE9OKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJsaW1pdGVyIGdhaW4gaXMgZGlmZmVyZW50IGluIGNoYW5uZWwgIiArIGksCisgICAgICAgICAgICAgICAgICAgIFRFU1RfR0FJTjEsIG5ld0NvbmZpZy5nZXRMaW1pdGVyQnlDaGFubmVsSW5kZXgoaSkuZ2V0UG9zdEdhaW4oKSwgRVBTSUxPTik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0M18zQnVpbGRlcl9zZXRDaGFubmVsVG8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFoYXNBdWRpb091dHB1dCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBEeW5hbWljc1Byb2Nlc3NpbmcuQ29uZmlnIGNvbmZpZyA9IGdldEJ1aWxkZXJXaXRoVmFsdWVzKE1JTl9DSEFOTkVMX0NPVU5UKS5idWlsZCgpOworICAgICAgICBEeW5hbWljc1Byb2Nlc3NpbmcuQ29uZmlnLkJ1aWxkZXIgYnVpbGRlciA9IGdldEJ1aWxkZXJXaXRoVmFsdWVzKFRFU1RfQ0hBTk5FTF9DT1VOVCk7CisKKyAgICAgICAgQ2hhbm5lbCBjaGFubmVsID0gbmV3IENoYW5uZWwoY29uZmlnLmdldENoYW5uZWxCeUNoYW5uZWxJbmRleChURVNUX0NIQU5ORUxfSU5ERVgpKTsKKworICAgICAgICBFcSBwcmVFcSA9IG5ldyBFcShjb25maWcuZ2V0UHJlRXFCeUNoYW5uZWxJbmRleChURVNUX0NIQU5ORUxfSU5ERVgpKTsKKyAgICAgICAgRXFCYW5kIHByZUVxQmFuZCA9IG5ldyBFcUJhbmQocHJlRXEuZ2V0QmFuZChURVNUX0JBTkRfSU5ERVgpKTsKKworICAgICAgICBNYmMgbWJjID0gbmV3IE1iYyhjb25maWcuZ2V0TWJjQnlDaGFubmVsSW5kZXgoVEVTVF9DSEFOTkVMX0lOREVYKSk7CisgICAgICAgIE1iY0JhbmQgbWJjQmFuZCA9IG5ldyBNYmNCYW5kKG1iYy5nZXRCYW5kKFRFU1RfQkFORF9JTkRFWCkpOworCisgICAgICAgIEVxIHBvc3RFcSA9IG5ldyBFcShjb25maWcuZ2V0UG9zdEVxQnlDaGFubmVsSW5kZXgoVEVTVF9DSEFOTkVMX0lOREVYKSk7CisgICAgICAgIEVxQmFuZCBwb3N0RXFCYW5kID0gbmV3IEVxQmFuZChwb3N0RXEuZ2V0QmFuZChURVNUX0JBTkRfSU5ERVgpKTsKKworICAgICAgICBMaW1pdGVyIGxpbWl0ZXIgPSBuZXcgTGltaXRlcihjb25maWcuZ2V0TGltaXRlckJ5Q2hhbm5lbEluZGV4KFRFU1RfQ0hBTk5FTF9JTkRFWCkpOworCisgICAgICAgIC8vIGdldCBTdGFnZXMsIGFwcGx5IHBlciBjaGFubmVsCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgVEVTVF9DSEFOTkVMX0NPVU5UOyBpKyspIHsKKyAgICAgICAgICAgIGZsb2F0IGdhaW4gPSBpICUgMiA9PSAwID8gVEVTVF9HQUlOMSA6IFRFU1RfR0FJTjI7CisKKyAgICAgICAgICAgIHByZUVxQmFuZC5zZXRHYWluKGdhaW4pOworICAgICAgICAgICAgcHJlRXEuc2V0QmFuZChURVNUX0JBTkRfSU5ERVgsIHByZUVxQmFuZCk7CisgICAgICAgICAgICBjaGFubmVsLnNldFByZUVxKHByZUVxKTsKKworICAgICAgICAgICAgbWJjQmFuZC5zZXRQcmVHYWluKGdhaW4pOworICAgICAgICAgICAgbWJjLnNldEJhbmQoVEVTVF9CQU5EX0lOREVYLCBtYmNCYW5kKTsKKyAgICAgICAgICAgIGNoYW5uZWwuc2V0TWJjKG1iYyk7CisKKyAgICAgICAgICAgIHBvc3RFcUJhbmQuc2V0R2FpbihnYWluKTsKKyAgICAgICAgICAgIHBvc3RFcS5zZXRCYW5kKFRFU1RfQkFORF9JTkRFWCwgcG9zdEVxQmFuZCk7CisgICAgICAgICAgICBjaGFubmVsLnNldFBvc3RFcShwb3N0RXEpOworCisgICAgICAgICAgICBsaW1pdGVyLnNldFBvc3RHYWluKGdhaW4pOworICAgICAgICAgICAgY2hhbm5lbC5zZXRMaW1pdGVyKGxpbWl0ZXIpOworCisgICAgICAgICAgICBidWlsZGVyLnNldENoYW5uZWxUbyhpLCBjaGFubmVsKTsKKyAgICAgICAgfQorICAgICAgICAvLyBidWlsZCBhbmQgY29tcGFyZQorICAgICAgICBEeW5hbWljc1Byb2Nlc3NpbmcuQ29uZmlnIG5ld0NvbmZpZyA9IGJ1aWxkZXIuYnVpbGQoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBURVNUX0NIQU5ORUxfQ09VTlQ7IGkrKykgeworICAgICAgICAgICAgZmxvYXQgZXhwZWN0ZWRHYWluID0gaSAlIDIgPT0gMCA/IFRFU1RfR0FJTjEgOiBURVNUX0dBSU4yOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJwcmVFUUJhbmQgZ2FpbiBpcyBkaWZmZXJlbnQgaW4gY2hhbm5lbCAiICsgaSArICIgYmFuZCAiICsgVEVTVF9CQU5EX0lOREVYLAorICAgICAgICAgICAgICAgICAgICBleHBlY3RlZEdhaW4sCisgICAgICAgICAgICAgICAgICAgIG5ld0NvbmZpZy5nZXRQcmVFcUJhbmRCeUNoYW5uZWxJbmRleChpLCBURVNUX0JBTkRfSU5ERVgpLmdldEdhaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgRVBTSUxPTik7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygibWJjQmFuZCBwcmVHYWluIGlzIGRpZmZlcmVudCBpbiBjaGFubmVsICIgKyBpICsgIiBiYW5kICIgKworICAgICAgICAgICAgICAgICAgICBURVNUX0JBTkRfSU5ERVgsIGV4cGVjdGVkR2FpbiwKKyAgICAgICAgICAgICAgICAgICAgbmV3Q29uZmlnLmdldE1iY0JhbmRCeUNoYW5uZWxJbmRleChpLCBURVNUX0JBTkRfSU5ERVgpLmdldFByZUdhaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgRVBTSUxPTik7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygicG9zdEVRQmFuZCBnYWluIGlzIGRpZmZlcmVudCBpbiBjaGFubmVsICIgKyBpICsgIiBiYW5kICIgKworICAgICAgICAgICAgICAgICAgICBURVNUX0JBTkRfSU5ERVgsIGV4cGVjdGVkR2FpbiwKKyAgICAgICAgICAgICAgICAgICAgbmV3Q29uZmlnLmdldFBvc3RFcUJhbmRCeUNoYW5uZWxJbmRleChpLCBURVNUX0JBTkRfSU5ERVgpLmdldEdhaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgRVBTSUxPTik7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygibGltaXRlciBnYWluIGlzIGRpZmZlcmVudCBpbiBjaGFubmVsICIgKyBpLAorICAgICAgICAgICAgICAgICAgICBleHBlY3RlZEdhaW4sIG5ld0NvbmZpZy5nZXRMaW1pdGVyQnlDaGFubmVsSW5kZXgoaSkuZ2V0UG9zdEdhaW4oKSwgRVBTSUxPTik7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBwcml2YXRlIG1ldGhvZHMKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlRHluYW1pY3NQcm9jZXNzaW5nKGludCBzZXNzaW9uKSB7CisgICAgICAgIGNyZWF0ZUR5bmFtaWNzUHJvY2Vzc2luZ1dpdGhDb25maWcoc2Vzc2lvbiwgbnVsbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUR5bmFtaWNzUHJvY2Vzc2luZ1dpdGhDb25maWcoaW50IHNlc3Npb24sIER5bmFtaWNzUHJvY2Vzc2luZy5Db25maWcgY29uZmlnKSB7CisgICAgICAgIHJlbGVhc2VEeW5hbWljc1Byb2Nlc3NpbmcoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1EUCA9IChjb25maWcgPT0gbnVsbCA/IG5ldyBEeW5hbWljc1Byb2Nlc3Npbmcoc2Vzc2lvbikKKyAgICAgICAgICAgICAgICAgICAgOiBuZXcgRHluYW1pY3NQcm9jZXNzaW5nKDAgLyogcHJpb3JpdHkgKi8sIHNlc3Npb24sIGNvbmZpZykpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiY3JlYXRlRHluYW1pY3NQcm9jZXNzaW5nV2l0aENvbmZpZygpIER5bmFtaWNzUHJvY2Vzc2luZyBub3QgZm91bmQiCisgICAgICAgICAgICAgICAgICAgICsgImV4Y2VwdGlvbjogIiwgZSk7CisgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgImNyZWF0ZUR5bmFtaWNzUHJvY2Vzc2luZ1dpdGhDb25maWcoKSBFZmZlY3QgbGlicmFyeSBub3QgbG9hZGVkIGV4Y2VwdGlvbjogIiwKKyAgICAgICAgICAgICAgICAgICAgZSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiY291bGQgbm90IGNyZWF0ZSBEeW5hbWljc1Byb2Nlc3NpbmciLCBtRFApOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWxlYXNlRHluYW1pY3NQcm9jZXNzaW5nKCkgeworICAgICAgICBpZiAobURQICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1EUC5yZWxlYXNlKCk7CisgICAgICAgICAgICBtRFAgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZURlZmF1bHRFZmZlY3QoKSB7CisgICAgICAgIER5bmFtaWNzUHJvY2Vzc2luZy5Db25maWcgY29uZmlnID0gZ2V0QnVpbGRlcldpdGhWYWx1ZXMoKS5idWlsZCgpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJudWxsIGNvbmZpZyIsIGNvbmZpZyk7CisKKyAgICAgICAgQXVkaW9NYW5hZ2VyIGFtID0gKEF1ZGlvTWFuYWdlcikgZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BVURJT19TRVJWSUNFKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgibnVsbCBBdWRpb01hbmFnZXIiLCBhbSk7CisKKyAgICAgICAgaW50IHNlc3Npb24gPSBhbS5nZW5lcmF0ZUF1ZGlvU2Vzc2lvbklkKCk7CisgICAgICAgIGFzc2VydFRydWUoImNhbm5vdCBnZW5lcmF0ZSBuZXcgc2Vzc2lvbiIsIHNlc3Npb24gIT0gQXVkaW9NYW5hZ2VyLkVSUk9SKTsKKworICAgICAgICBjcmVhdGVEeW5hbWljc1Byb2Nlc3NpbmdXaXRoQ29uZmlnKHNlc3Npb24sIGNvbmZpZyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBEeW5hbWljc1Byb2Nlc3NpbmcuQ29uZmlnLkJ1aWxkZXIgZ2V0QnVpbGRlcihpbnQgY2hhbm5lbENvdW50KSB7CisgICAgICAgIC8vIHNpbXBsZSBjb25maWcKKyAgICAgICAgRHluYW1pY3NQcm9jZXNzaW5nLkNvbmZpZy5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgRHluYW1pY3NQcm9jZXNzaW5nLkNvbmZpZy5CdWlsZGVyKAorICAgICAgICAgICAgICAgIERFRkFVTFRfVkFSSUFOVCAvKiB2YXJpYW50ICovLAorICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudC8qIGNoYW5uZWxzICovLAorICAgICAgICAgICAgICAgIERFRkFVTFRfUFJFRVFfSU5fVVNFIC8qIGVuYWJsZSBwcmVFUSAqLywKKyAgICAgICAgICAgICAgICBERUZBVUxUX1BSRUVRX0JBTkRfQ09VTlQgLyogcHJlRXEgYmFuZHMgKi8sCisgICAgICAgICAgICAgICAgREVGQVVMVF9NQkNfSU5fVVNFIC8qIGVuYWJsZSBtYmMgKi8sCisgICAgICAgICAgICAgICAgREVGQVVMVF9NQkNfQkFORF9DT1VOVCAvKiBtYmMgYmFuZHMgKi8sCisgICAgICAgICAgICAgICAgREVGQVVMVF9QT1NURVFfSU5fVVNFIC8qIGVuYWJsZSBwb3N0RXEgKi8sCisgICAgICAgICAgICAgICAgREVGQVVMVF9QT1NURVFfQkFORF9DT1VOVCAvKiBwb3N0RXEgYmFuZHMgKi8sCisgICAgICAgICAgICAgICAgREVGQVVMVF9MSU1JVEVSX0lOX1VTRSAvKiBlbmFibGUgbGltaXRlciAqLyk7CisKKyAgICAgICAgcmV0dXJuIGJ1aWxkZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBEeW5hbWljc1Byb2Nlc3NpbmcuQ29uZmlnLkJ1aWxkZXIgZ2V0QnVpbGRlcldpdGhWYWx1ZXMoaW50IGNoYW5uZWxDb3VudCkgeworICAgICAgICAvLyBzaW1wbGUgY29uZmlnCisgICAgICAgIER5bmFtaWNzUHJvY2Vzc2luZy5Db25maWcuQnVpbGRlciBidWlsZGVyID0gZ2V0QnVpbGRlcihjaGFubmVsQ291bnQpOworCisgICAgICAgIC8vIFNldCBEZWZhdWx0cworICAgICAgICBidWlsZGVyLnNldFByZWZlcnJlZEZyYW1lRHVyYXRpb24oREVGQVVMVF9GUkFNRV9EVVJBVElPTik7CisgICAgICAgIGJ1aWxkZXIuc2V0SW5wdXRHYWluQWxsQ2hhbm5lbHNUbyhERUZBVUxUX0lOUFVUX0dBSU4pOworICAgICAgICByZXR1cm4gYnVpbGRlcjsKKyAgICB9CisKKyAgICBwcml2YXRlIER5bmFtaWNzUHJvY2Vzc2luZy5Db25maWcuQnVpbGRlciBnZXRCdWlsZGVyV2l0aFZhbHVlcygpIHsKKyAgICAgICAgcmV0dXJuIGdldEJ1aWxkZXJXaXRoVmFsdWVzKE1JTl9DSEFOTkVMX0NPVU5UKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9FbmNvZGVEZWNvZGVUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvRW5jb2RlRGVjb2RlVGVzdC5qYXZhCmluZGV4IDg1MDhlZjIuLjNlYTc4ZDEgMTAwNzU1Ci0tLSBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9FbmNvZGVEZWNvZGVUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL0VuY29kZURlY29kZVRlc3QuamF2YQpAQCAtMjMsMTIgKzIzLDE0IEBACiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvZGVjTGlzdDsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRm9ybWF0OwogaW1wb3J0IGFuZHJvaWQub3BlbmdsLkdMRVMyMDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKIGltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUmVxdWlyZXNEZXZpY2U7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuTWVkaWFVdGlsczsKKwogaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvRW5jb2RlVmlydHVhbERpc3BsYXlUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvRW5jb2RlVmlydHVhbERpc3BsYXlUZXN0LmphdmEKaW5kZXggOWEzMzkyYS4uOTBjNjU3MiAxMDA3NTUKLS0tIGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL0VuY29kZVZpcnR1YWxEaXNwbGF5VGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9FbmNvZGVWaXJ0dWFsRGlzcGxheVRlc3QuamF2YQpAQCAtMTcsMzQgKzE3LDM0IEBACiBwYWNrYWdlIGFuZHJvaWQubWVkaWEuY3RzOwogCiBpbXBvcnQgYW5kcm9pZC5hcHAuUHJlc2VudGF0aW9uOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb2RlYzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29kZWNJbmZvOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb2RlY0xpc3Q7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUZvcm1hdDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkNvbG9yRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5kaXNwbGF5LkRpc3BsYXlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuZGlzcGxheS5WaXJ0dWFsRGlzcGxheTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29kZWM7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvZGVjSW5mbzsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29kZWNMaXN0OworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFGb3JtYXQ7CiBpbXBvcnQgYW5kcm9pZC5vcGVuZ2wuR0xFUzIwOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKIGltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUmVxdWlyZXNEZXZpY2U7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuRGlzcGxheTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwLkxheW91dFBhcmFtczsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworCiBpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIAotCiAvKioKICAqIFRlc3RzIGNvbm5lY3RpbmcgYSB2aXJ0dWFsIGRpc3BsYXkgdG8gdGhlIGlucHV0IG9mIGEgTWVkaWFDb2RlYyBlbmNvZGVyLgogICogPHA+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvRW5jb2RlVmlydHVhbERpc3BsYXlXaXRoQ29tcG9zaXRpb25UZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvRW5jb2RlVmlydHVhbERpc3BsYXlXaXRoQ29tcG9zaXRpb25UZXN0LmphdmEKaW5kZXggODEzNzQyYS4uOWU2YzU5OSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL0VuY29kZVZpcnR1YWxEaXNwbGF5V2l0aENvbXBvc2l0aW9uVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9FbmNvZGVWaXJ0dWFsRGlzcGxheVdpdGhDb21wb3NpdGlvblRlc3QuamF2YQpAQCAtMjMsMTcgKzIzLDE1IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2VydmljZUNvbm5lY3Rpb247CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5TdXJmYWNlVGV4dHVyZTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlR5cGVmYWNlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQ29sb3JEcmF3YWJsZTsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmRpc3BsYXkuRGlzcGxheU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5kaXNwbGF5LlZpcnR1YWxEaXNwbGF5OwogaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb2RlYzsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29kZWMuQnVmZmVySW5mbzsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29kZWNJbmZvOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb2RlY0luZm8uQ29kZWNDYXBhYmlsaXRpZXM7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvZGVjSW5mby5Db2RlY1Byb2ZpbGVMZXZlbDsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29kZWNMaXN0OwogaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFGb3JtYXQ7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5jdHMuUjsKIGltcG9ydCBhbmRyb2lkLm9wZW5nbC5HTEVTMTFFeHQ7CiBpbXBvcnQgYW5kcm9pZC5vcGVuZ2wuR0xFUzIwOwogaW1wb3J0IGFuZHJvaWQub3BlbmdsLk1hdHJpeDsKQEAgLTQzLDMxICs0MSwzMCBAQAogaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKIGltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUmVxdWlyZXNEZXZpY2U7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNpemU7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkRpc3BsYXk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2U7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlRleHR1cmVWaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cC5MYXlvdXRQYXJhbXM7CiBpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRhYmxlTGF5b3V0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRhYmxlUm93OwogCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS5jdHMuUjsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwogCiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLm5pby5CeXRlT3JkZXI7CiBpbXBvcnQgamF2YS5uaW8uRmxvYXRCdWZmZXI7CiBpbXBvcnQgamF2YS5uaW8uSW50QnVmZmVyOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TZW1hcGhvcmU7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CkBAIC04OSw4ICs4Niw4IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBERUZBVUxUX1dBSVRfVElNRU9VVF9VUyA9IDMwMDAwMDA7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1JfUkVEID0gIG1ha2VDb2xvcigxMDAsIDAsIDApOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT0xPUl9CTFVFID0gIG1ha2VDb2xvcigwLCAxMDAsIDApOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT0xPUl9HUkVFTiA9ICBtYWtlQ29sb3IoMCwgMCwgMTAwKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1JfR1JFRU4gPSAgbWFrZUNvbG9yKDAsIDEwMCwgMCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTE9SX0JMVUUgPSAgbWFrZUNvbG9yKDAsIDAsIDEwMCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTE9SX0dSRVkgPSAgbWFrZUNvbG9yKDEwMCwgMTAwLCAxMDApOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJJVFJBVEVfMTA4MHAgPSAyMDAwMDAwMDsKQEAgLTE1MSw2ICsxNDgsMzEgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZW5kZXJpbmc4MDB4NDgwUm90YXRlZDkwKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIHRlc3RSZW5kZXJpbmc4MDB4NDgwUm90YXRlZCg5MCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlbmRlcmluZzgwMHg0ODBSb3RhdGVkMTgwKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIHRlc3RSZW5kZXJpbmc4MDB4NDgwUm90YXRlZCgxODApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZW5kZXJpbmc4MDB4NDgwUm90YXRlZDI3MCgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICB0ZXN0UmVuZGVyaW5nODAweDQ4MFJvdGF0ZWQoMjcwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVuZGVyaW5nODAweDQ4MFJvdGF0ZWQzNjAoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgdGVzdFJlbmRlcmluZzgwMHg0ODBSb3RhdGVkKDM2MCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RSZW5kZXJpbmc4MDB4NDgwUm90YXRlZChpbnQgZGVncmVlcykgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIExvZy5pKFRBRywgInRlc3RSZW5kZXJpbmc4MDB4NDgwUm90YXRlZCAiICsgZGVncmVlcyk7CisgICAgICAgIGlmIChpc0NvbmN1cnJlbnRFbmNvZGluZ0RlY29kaW5nU3VwcG9ydGVkKDgwMCwgNDgwLCBCSVRSQVRFXzgwMHg0ODApKSB7CisgICAgICAgICAgICBydW5UZXN0UmVuZGVyaW5nSW5TZXBhcmF0ZVRocmVhZCg4MDAsIDQ4MCwgZmFsc2UsIGZhbHNlLCBkZWdyZWVzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgIlNLSVBQSU5HIHRlc3RSZW5kZXJpbmc4MDB4NDgwUm90YXRlZCIgKyBkZWdyZWVzICsgIjpjb2RlYyBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVuZGVyaW5nTWF4UmVzb2x1dGlvbkxvY2FsbHkoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgTG9nLmkoVEFHLCAidGVzdFJlbmRlcmluZ01heFJlc29sdXRpb25Mb2NhbGx5Iik7CiAgICAgICAgIFNpemUgbWF4UmVzID0gY2hlY2tNYXhDb25jdXJyZW50RW5jb2RpbmdEZWNvZGluZ1Jlc29sdXRpb24oKTsKQEAgLTIwOSwxMSArMjMxLDE3IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHJ1blRlc3RSZW5kZXJpbmdJblNlcGFyYXRlVGhyZWFkKGZpbmFsIGludCB3LCBmaW5hbCBpbnQgaCwKICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcnVuUmVtb3RlbHksIGZpbmFsIGJvb2xlYW4gbXVsdGlwbGVXaW5kb3dzKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgcnVuVGVzdFJlbmRlcmluZ0luU2VwYXJhdGVUaHJlYWQodywgaCwgcnVuUmVtb3RlbHksIG11bHRpcGxlV2luZG93cywgLyogZGVncmVlcyAqLyAwKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcnVuVGVzdFJlbmRlcmluZ0luU2VwYXJhdGVUaHJlYWQoZmluYWwgaW50IHcsIGZpbmFsIGludCBoLAorICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBydW5SZW1vdGVseSwgZmluYWwgYm9vbGVhbiBtdWx0aXBsZVdpbmRvd3MsIGZpbmFsIGludCBkZWdyZWVzKQorICAgICAgICAgICAgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIG1UZXN0RXhjZXB0aW9uID0gbnVsbDsKICAgICAgICAgVGhyZWFkIHJlbmRlcmluZ1RocmVhZCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgewogICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewogICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGRvVGVzdFJlbmRlcmluZ091dHB1dCh3LCBoLCBydW5SZW1vdGVseSwgbXVsdGlwbGVXaW5kb3dzKTsKKyAgICAgICAgICAgICAgICAgICAgZG9UZXN0UmVuZGVyaW5nT3V0cHV0KHcsIGgsIHJ1blJlbW90ZWx5LCBtdWx0aXBsZVdpbmRvd3MsIGRlZ3JlZXMpOwogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CiAgICAgICAgICAgICAgICAgICAgIHQucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgICAgICAgICAgICAgIG1UZXN0RXhjZXB0aW9uID0gdDsKQEAgLTIyOCw4ICsyNTYsOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGRvVGVzdFJlbmRlcmluZ091dHB1dChpbnQgdywgaW50IGgsIGJvb2xlYW4gcnVuUmVtb3RlbHksIGJvb2xlYW4gbXVsdGlwbGVXaW5kb3dzKQotICAgICAgICAgICAgdGhyb3dzIFRocm93YWJsZSB7CisgICAgcHJpdmF0ZSB2b2lkIGRvVGVzdFJlbmRlcmluZ091dHB1dChpbnQgdywgaW50IGgsIGJvb2xlYW4gcnVuUmVtb3RlbHksIGJvb2xlYW4gbXVsdGlwbGVXaW5kb3dzLAorICAgICAgICAgICAgaW50IGRlZ3JlZXMpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBpZiAoREJHKSB7CiAgICAgICAgICAgICBMb2cuaShUQUcsICJkb1Rlc3RSZW5kZXJpbmdPdXRwdXQgZm9yIHc6IiArIHcgKyAiIGg6IiArIGgpOwogICAgICAgICB9CkBAIC0yMzcsNiArMjY1LDkgQEAKICAgICAgICAgICAgIG1Jc1F1aXR0aW5nID0gZmFsc2U7CiAgICAgICAgICAgICBtRGVjb2RlciA9IE1lZGlhQ29kZWMuY3JlYXRlRGVjb2RlckJ5VHlwZShNSU1FX1RZUEUpOwogICAgICAgICAgICAgTWVkaWFGb3JtYXQgZGVjb2RlckZvcm1hdCA9IE1lZGlhRm9ybWF0LmNyZWF0ZVZpZGVvRm9ybWF0KE1JTUVfVFlQRSwgdywgaCk7CisgICAgICAgICAgICBpZiAoZGVncmVlcyAhPSAwKSB7CisgICAgICAgICAgICAgICAgZGVjb2RlckZvcm1hdC5zZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9ST1RBVElPTiwgZGVncmVlcyk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBtRGVjb2RpbmdTdXJmYWNlID0gbmV3IE91dHB1dFN1cmZhY2UodywgaCk7CiAgICAgICAgICAgICBtRGVjb2Rlci5jb25maWd1cmUoZGVjb2RlckZvcm1hdCwgbURlY29kaW5nU3VyZmFjZS5nZXRTdXJmYWNlKCksIG51bGwsIDApOwogICAgICAgICAgICAgbURlY29kZXIuc3RhcnQoKTsKQEAgLTI5OSwxNSArMzMwLDE4IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIFJlbmRlcmVyIHJlbmRlcmVyID0gbnVsbDsKKyAgICAgICAgICAgIENvbnRleHQgY29udGV4dCA9IGdldENvbnRleHQoKTsKKyAgICAgICAgICAgIFN1cmZhY2Ugd2luZG93U3VyZmFjZSA9IGNvbXBvc2l0b3IuZ2V0V2luZG93U3VyZmFjZShtdWx0aXBsZVdpbmRvd3M/IDEgOiAwKTsKICAgICAgICAgICAgIGlmIChydW5SZW1vdGVseSkgewotICAgICAgICAgICAgICAgIG1SZW1vdGVQcmVzZW50YXRpb24gPSBuZXcgUmVtb3RlVmlydHVhbERpc3BsYXlQcmVzZW50YXRpb24oZ2V0Q29udGV4dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRvci5nZXRXaW5kb3dTdXJmYWNlKG11bHRpcGxlV2luZG93cz8gMSA6IDApLCB3LCBoKTsKKyAgICAgICAgICAgICAgICBtUmVtb3RlUHJlc2VudGF0aW9uID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSZW1vdGVWaXJ0dWFsRGlzcGxheVByZXNlbnRhdGlvbihjb250ZXh0LCB3aW5kb3dTdXJmYWNlLCB3LCBoKTsKICAgICAgICAgICAgICAgICBtUmVtb3RlUHJlc2VudGF0aW9uLmNvbm5lY3QoKTsKICAgICAgICAgICAgICAgICBtUmVtb3RlUHJlc2VudGF0aW9uLnN0YXJ0KCk7CiAgICAgICAgICAgICAgICAgcmVuZGVyZXIgPSBtUmVtb3RlUHJlc2VudGF0aW9uOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtTG9jYWxQcmVzZW50YXRpb24gPSBuZXcgVmlydHVhbERpc3BsYXlQcmVzZW50YXRpb24oZ2V0Q29udGV4dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRvci5nZXRXaW5kb3dTdXJmYWNlKG11bHRpcGxlV2luZG93cz8gMSA6IDApLCB3LCBoKTsKKyAgICAgICAgICAgICAgICBtTG9jYWxQcmVzZW50YXRpb24gPSAoZGVncmVlcyA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgPyBuZXcgVmlydHVhbERpc3BsYXlQcmVzZW50YXRpb24oY29udGV4dCwgd2luZG93U3VyZmFjZSwgdywgaCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3IFJvdGF0ZVZpcnR1YWxEaXNwbGF5UHJlc2VudGF0aW9uKGNvbnRleHQsIHdpbmRvd1N1cmZhY2UsIHcsIGgpOwogICAgICAgICAgICAgICAgIG1Mb2NhbFByZXNlbnRhdGlvbi5jcmVhdGVWaXJ0dWFsRGlzcGxheSgpOwogICAgICAgICAgICAgICAgIG1Mb2NhbFByZXNlbnRhdGlvbi5jcmVhdGVQcmVzZW50YXRpb24oKTsKICAgICAgICAgICAgICAgICByZW5kZXJlciA9IG1Mb2NhbFByZXNlbnRhdGlvbjsKQEAgLTMxNiwxMCArMzUwLDE0IEBACiAgICAgICAgICAgICBpZiAoREJHKSB7CiAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAic3RhcnQgcmVuZGVyaW5nIGFuZCBjaGVjayIpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVuZGVyQ29sb3JBbmRDaGVja1Jlc3VsdChyZW5kZXJlciwgdywgaCwgQ09MT1JfUkVEKTsKLSAgICAgICAgICAgIHJlbmRlckNvbG9yQW5kQ2hlY2tSZXN1bHQocmVuZGVyZXIsIHcsIGgsIENPTE9SX0JMVUUpOwotICAgICAgICAgICAgcmVuZGVyQ29sb3JBbmRDaGVja1Jlc3VsdChyZW5kZXJlciwgdywgaCwgQ09MT1JfR1JFRU4pOwotICAgICAgICAgICAgcmVuZGVyQ29sb3JBbmRDaGVja1Jlc3VsdChyZW5kZXJlciwgdywgaCwgQ09MT1JfR1JFWSk7CisgICAgICAgICAgICBpZiAoZGVncmVlcyA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmVuZGVyQ29sb3JBbmRDaGVja1Jlc3VsdChyZW5kZXJlciwgdywgaCwgQ09MT1JfUkVEKTsKKyAgICAgICAgICAgICAgICByZW5kZXJDb2xvckFuZENoZWNrUmVzdWx0KHJlbmRlcmVyLCB3LCBoLCBDT0xPUl9CTFVFKTsKKyAgICAgICAgICAgICAgICByZW5kZXJDb2xvckFuZENoZWNrUmVzdWx0KHJlbmRlcmVyLCB3LCBoLCBDT0xPUl9HUkVFTik7CisgICAgICAgICAgICAgICAgcmVuZGVyQ29sb3JBbmRDaGVja1Jlc3VsdChyZW5kZXJlciwgdywgaCwgQ09MT1JfR1JFWSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlbmRlclJvdGF0aW9uQW5kQ2hlY2tSZXN1bHQocmVuZGVyZXIsIHcsIGgsIGRlZ3JlZXMpOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBtSXNRdWl0dGluZyA9IHRydWU7CiAgICAgICAgICAgICBpZiAocnVuUmVtb3RlbHkpIHsKQEAgLTM3Niw2ICs0MTQsNjcgQEAKICAgICAgICAgZmFpbCgiQ29sb3IgZGlkIG5vdCBtYXRjaCIpOwogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCByZW5kZXJSb3RhdGlvbkFuZENoZWNrUmVzdWx0KFJlbmRlcmVyIHJlbmRlcmVyLCBpbnQgdywgaW50IGgsCisgICAgICAgICAgICBpbnQgZGVncmVlcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEJ1ZmZlckluZm8gaW5mbyA9IG5ldyBCdWZmZXJJbmZvKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX01BWF9SRVRSWTsgaSsrKSB7CisgICAgICAgICAgICByZW5kZXJlci5kb1JlbmRlcmluZygtMSk7CisgICAgICAgICAgICBpbnQgYnVmZmVySW5kZXggPSBtRGVjb2Rlci5kZXF1ZXVlT3V0cHV0QnVmZmVyKGluZm8sICBERUZBVUxUX1dBSVRfVElNRU9VVF9VUyk7CisgICAgICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiZGVjb2RlciBkZXF1ZXVlT3V0cHV0QnVmZmVyIHJldHVybmVkICIgKyBidWZmZXJJbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYnVmZmVySW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRGVjb2Rlci5yZWxlYXNlT3V0cHV0QnVmZmVyKGJ1ZmZlckluZGV4LCB0cnVlKTsKKyAgICAgICAgICAgIGlmIChtRGVjb2RpbmdTdXJmYWNlLmNoZWNrRm9yTmV3SW1hZ2UoSU1BR0VfV0FJVF9USU1FT1VUX01TKSkgeworICAgICAgICAgICAgICAgIG1EZWNvZGluZ1N1cmZhY2UuZHJhd0ltYWdlKCk7CisgICAgICAgICAgICAgICAgaWYgKGNoZWNrUm90YXRlZEZyYW1lUXVhZHJhbnRzKHcsIGgsIGRlZ3JlZXMpKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIm91dHB1dCByb3RhdGVkICIgKyBkZWdyZWVzICsgIiBkZWdyZWVzIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYoREJHKSB7CisgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAibm8gcmVuZGVyaW5nIHlldCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZhaWwoIkZyYW1lIG5vdCBwcm9wZXJseSByb3RhdGVkIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrUm90YXRlZEZyYW1lUXVhZHJhbnRzKGludCB3LCBpbnQgaCwgaW50IGRlZ3JlZXMpIHsKKyAgICAgICAgLy8gUmVhZCBhIHBpeGVsIGZyb20gZWFjaCBxdWFkcmFudCBvZiB0aGUgc3VyZmFjZS4KKyAgICAgICAgaW50IHd3ID0gdyAvIDQ7CisgICAgICAgIGludCBoaCA9IGggLyA0OworICAgICAgICAvLyBjb29yZHMgaXMgb3JkZXJlZCBjb3VudGVyIGNsb2Nrd2lzZSAobm90ZSwgZ2wgMCwwIGlzIGJvdHRvbSBsZWZ0KQorICAgICAgICBpbnRbXVtdIGNvb3JkcyA9IG5ldyBpbnRbXVtdIHt7d3csIGhofSwge3d3ICogMywgaGh9LCB7d3cgKiAzLCBoaCAqIDN9LCB7d3csIGhoICogM319OworICAgICAgICBMaXN0PEludGVnZXI+IGV4cGVjdGVkID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIExpc3Q8SW50ZWdlcj4gY29sb3JzID0gQXJyYXlzLmFzTGlzdCgKKyAgICAgICAgICAgICAgICBuZXcgSW50ZWdlcltdIHtDT0xPUl9HUkVFTiwgQ09MT1JfQkxVRSwgQ09MT1JfUkVELCBDT0xPUl9HUkVZfSk7CisgICAgICAgIGV4cGVjdGVkLmFkZEFsbChjb2xvcnMpOworICAgICAgICBleHBlY3RlZC5hZGRBbGwoY29sb3JzKTsKKyAgICAgICAgaW50IG9mZnNldCA9IChkZWdyZWVzIC8gOTApICUgNDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGludFtdIGMgPSBjb29yZHNbaV07CisgICAgICAgICAgICBpbnQgeCA9IGNbMF07CisgICAgICAgICAgICBpbnQgeSA9IGNbMV07CisgICAgICAgICAgICBHTEVTMjAuZ2xSZWFkUGl4ZWxzKHgsIHksIDEsIDEsIEdMRVMyMC5HTF9SR0JBLCBHTEVTMjAuR0xfVU5TSUdORURfQllURSwgbVBpeGVsQnVmKTsKKyAgICAgICAgICAgIGludCByID0gbVBpeGVsQnVmLmdldCgwKSAmIDB4ZmY7CisgICAgICAgICAgICBpbnQgZyA9IG1QaXhlbEJ1Zi5nZXQoMSkgJiAweGZmOworICAgICAgICAgICAgaW50IGIgPSBtUGl4ZWxCdWYuZ2V0KDIpICYgMHhmZjsKKyAgICAgICAgICAgIC8vIGFkZGluZyB0aGUgb2Zmc2V0IHRvIHJvdGF0ZSBleHBlY3RlZCBjb2xvcnMgY2xvY2t3aXNlCisgICAgICAgICAgICBpbnQgY29sb3IgPSBleHBlY3RlZC5nZXQob2Zmc2V0ICsgaSk7CisgICAgICAgICAgICBpbnQgcmVkRXhwZWN0ZWQgPSAoY29sb3IgPj4gMTYpICYgMHhmZjsKKyAgICAgICAgICAgIGludCBncmVlbkV4cGVjdGVkID0gKGNvbG9yID4+IDgpICYgMHhmZjsKKyAgICAgICAgICAgIGludCBibHVlRXhwZWN0ZWQgPSBjb2xvciAmIDB4ZmY7CisgICAgICAgICAgICBMb2cuaShUQUcsIFN0cmluZy5mb3JtYXQoIiglZCwlZCkgZXhwZWN0aW5nICVkLCVkLCVkIHNhdyAlZCwlZCwlZCIsCisgICAgICAgICAgICAgICAgICAgIHgsIHksIHJlZEV4cGVjdGVkLCBncmVlbkV4cGVjdGVkLCBibHVlRXhwZWN0ZWQsIHIsIGcsIGIpKTsKKyAgICAgICAgICAgIGlmICghYXBwcm94RXF1YWxzKHJlZEV4cGVjdGVkLCByKSB8fCAhYXBwcm94RXF1YWxzKGdyZWVuRXhwZWN0ZWQsIGcpCisgICAgICAgICAgICAgICAgICAgIHx8ICFhcHByb3hFcXVhbHMoYmx1ZUV4cGVjdGVkLCBiKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKICAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tTdXJmYWNlRnJhbWVDb2xvcihpbnQgdywgaW50IGgsIGludCBjb2xvcikgewogICAgICAgICAvLyBSZWFkIGEgcGl4ZWwgZnJvbSB0aGUgY2VudGVyIG9mIHRoZSBzdXJmYWNlLiAgTWlnaHQgd2FudCB0byByZWFkIGZyb20gbXVsdGlwbGUgcG9pbnRzCiAgICAgICAgIC8vIGFuZCBhdmVyYWdlIHRoZW0gdG9nZXRoZXIuCkBAIC0xMDc5LDYgKzExNzgsMTkgQEAKICAgICAgICAgdm9pZCBkb1JlbmRlcmluZyhmaW5hbCBpbnQgY29sb3IpIHRocm93cyBFeGNlcHRpb247CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUm90YXRlVmlydHVhbERpc3BsYXlQcmVzZW50YXRpb24gZXh0ZW5kcyBWaXJ0dWFsRGlzcGxheVByZXNlbnRhdGlvbiB7CisKKyAgICAgICAgUm90YXRlVmlydHVhbERpc3BsYXlQcmVzZW50YXRpb24oQ29udGV4dCBjb250ZXh0LCBTdXJmYWNlIHN1cmZhY2UsIGludCB3LCBpbnQgaCkgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgc3VyZmFjZSwgdywgaCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIFRlc3RQcmVzZW50YXRpb25CYXNlIGRvQ3JlYXRlUHJlc2VudGF0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXN0Um90YXRlUHJlc2VudGF0aW9uKG1Db250ZXh0LCBtVmlydHVhbERpc3BsYXkuZ2V0RGlzcGxheSgpKTsKKyAgICAgICAgfQorCisgICAgfQorCiAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVmlydHVhbERpc3BsYXlQcmVzZW50YXRpb24gaW1wbGVtZW50cyBSZW5kZXJlciB7CiAgICAgICAgIHByb3RlY3RlZCBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwogICAgICAgICBwcm90ZWN0ZWQgZmluYWwgU3VyZmFjZSBtU3VyZmFjZTsKQEAgLTExOTYsNiArMTMwOCw1MCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGVzdFJvdGF0ZVByZXNlbnRhdGlvbiBleHRlbmRzIFRlc3RQcmVzZW50YXRpb25CYXNlIHsKKyAgICAgICAgc3RhdGljIGZpbmFsIGludFtdIGtDb2xvcnMgPSBuZXcgaW50W10ge0NPTE9SX0dSRVksIENPTE9SX1JFRCwgQ09MT1JfR1JFRU4sIENPTE9SX0JMVUV9OworICAgICAgICBwcml2YXRlIGZpbmFsIEltYWdlVmlld1tdIG1RdWFkcmFudHMgPSBuZXcgSW1hZ2VWaWV3WzRdOworCisgICAgICAgIHB1YmxpYyBUZXN0Um90YXRlUHJlc2VudGF0aW9uKENvbnRleHQgb3V0ZXJDb250ZXh0LCBEaXNwbGF5IGRpc3BsYXkpIHsKKyAgICAgICAgICAgIHN1cGVyKG91dGVyQ29udGV4dCwgZGlzcGxheSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgICAgIENvbnRleHQgY3R4ID0gZ2V0Q29udGV4dCgpOworICAgICAgICAgICAgVGFibGVMYXlvdXQgdGFibGUgPSBuZXcgVGFibGVMYXlvdXQoY3R4KTsKKyAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgZmlsbCA9IG5ldyBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zKAorICAgICAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpOworICAgICAgICAgICAgVGFibGVMYXlvdXQuTGF5b3V0UGFyYW1zIGZpbGxUYWJsZSA9IG5ldyBUYWJsZUxheW91dC5MYXlvdXRQYXJhbXMoCisgICAgICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULCBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwgMWYpOworICAgICAgICAgICAgVGFibGVSb3cuTGF5b3V0UGFyYW1zIGZpbGxSb3cgPSBuZXcgVGFibGVSb3cuTGF5b3V0UGFyYW1zKAorICAgICAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsIDFmKTsKKyAgICAgICAgICAgIHRhYmxlLnNldExheW91dFBhcmFtcyhmaWxsKTsKKyAgICAgICAgICAgIHRhYmxlLnNldFN0cmV0Y2hBbGxDb2x1bW5zKHRydWUpOworICAgICAgICAgICAgVGFibGVSb3cgcm93c1tdID0gbmV3IFRhYmxlUm93W10ge25ldyBUYWJsZVJvdyhjdHgpLCBuZXcgVGFibGVSb3coY3R4KX07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1RdWFkcmFudHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBtUXVhZHJhbnRzW2ldID0gbmV3IEltYWdlVmlldyhjdHgpOworICAgICAgICAgICAgICAgIG1RdWFkcmFudHNbaV0uc2V0SW1hZ2VEcmF3YWJsZShuZXcgQ29sb3JEcmF3YWJsZShrQ29sb3JzW2ldKSk7CisgICAgICAgICAgICAgICAgcm93c1tpIC8gMl0uYWRkVmlldyhtUXVhZHJhbnRzW2ldLCBmaWxsUm93KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoVGFibGVSb3cgcm93OiByb3dzKSB7CisgICAgICAgICAgICAgICAgdGFibGUuYWRkVmlldyhyb3csIGZpbGxUYWJsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXRDb250ZW50Vmlldyh0YWJsZSk7CisgICAgICAgICAgICBMb2cudihUQUcsICJzZXRDb250ZW50Vmlldyh0YWJsZSkiKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBkb1JlbmRlcmluZyhpbnQgY29sb3IpIHsKKyAgICAgICAgICAgIExvZy52KFRBRywgImRvUmVuZGVyaW5nOiBpZ25vcmluZyBjb2xvcjogIiArIEludGVnZXIudG9IZXhTdHJpbmcoY29sb3IpKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVF1YWRyYW50cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIG1RdWFkcmFudHNbaV0uc2V0SW1hZ2VEcmF3YWJsZShuZXcgQ29sb3JEcmF3YWJsZShrQ29sb3JzW2ldKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKwogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRvcFdpbmRvd1ByZXNlbnRhdGlvbiBleHRlbmRzIFRlc3RQcmVzZW50YXRpb25CYXNlIHsKICAgICAgICAgcHJpdmF0ZSBGcmFtZUxheW91dFtdIG1XaW5kb3dzTGF5b3V0ID0gbmV3IEZyYW1lTGF5b3V0W01BWF9OVU1fV0lORE9XU107CiAgICAgICAgIHByaXZhdGUgQ29tcG9zaXRpb25UZXh0dXJlVmlld1tdIG1XaW5kb3dzID0gbmV3IENvbXBvc2l0aW9uVGV4dHVyZVZpZXdbTUFYX05VTV9XSU5ET1dTXTsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9FbnZSZXZlcmJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvRW52UmV2ZXJiVGVzdC5qYXZhCmluZGV4IDRjZmI3NDQuLjE0Y2FkNzEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9FbnZSZXZlcmJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL0VudlJldmVyYlRlc3QuamF2YQpAQCAtMjEsOSArMjEsMTEgQEAKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvZnguRW52aXJvbm1lbnRhbFJldmVyYjsKIGltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCitAQXBwTW9kZUZ1bGwocmVhc29uID0gIkZhaWxzIGluIGluc3RhbnQgbW9kZSIpCiBwdWJsaWMgY2xhc3MgRW52UmV2ZXJiVGVzdCBleHRlbmRzIFBvc3RQcm9jVGVzdEJhc2UgewogCiAgICAgcHJpdmF0ZSBTdHJpbmcgVEFHID0gIkVudlJldmVyYlRlc3QiOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL0VxdWFsaXplclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9FcXVhbGl6ZXJUZXN0LmphdmEKaW5kZXggYThiZDk4YS4uN2M0MDVhNSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL0VxdWFsaXplclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvRXF1YWxpemVyVGVzdC5qYXZhCkBAIC0yNyw3ICsyNyw3IEBACiBwdWJsaWMgY2xhc3MgRXF1YWxpemVyVGVzdCBleHRlbmRzIFBvc3RQcm9jVGVzdEJhc2UgewogCiAgICAgcHJpdmF0ZSBTdHJpbmcgVEFHID0gIkVxdWFsaXplclRlc3QiOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBNSU5fTlVNQkVSX09GX0JBTkRTID0gNDsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgTUlOX05VTUJFUl9PRl9CQU5EUyA9IDI7CiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IE1BWF9MRVZFTF9SQU5HRV9MT1cgPSAwOyAgICAgICAgICAgICAvLyAwZEIKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgTUlOX0xFVkVMX1JBTkdFX0hJR0ggPSAwOyAgICAgICAgICAgIC8vIDBkQgogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBURVNUX0ZSRVFVRU5DWV9NSUxMSUhFUlRaID0gMTAwMDAwMDsgLy8gMWtIegpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL0V4aWZJbnRlcmZhY2VUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvRXhpZkludGVyZmFjZVRlc3QuamF2YQppbmRleCBmMGIzMDNiLi5mNzVhNmZkIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvRXhpZkludGVyZmFjZVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvRXhpZkludGVyZmFjZVRlc3QuamF2YQpAQCAtMjIsNiArMjIsNyBAQAogaW1wb3J0IGFuZHJvaWQubWVkaWEuRXhpZkludGVyZmFjZTsKIGltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OwogaW1wb3J0IGFuZHJvaWQub3MuRmlsZVV0aWxzOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIGltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC5zeXN0ZW0uRXJybm9FeGNlcHRpb247CkBAIC00Miw2ICs0Myw3IEBACiBpbXBvcnQgbGliY29yZS5pby5Jb1V0aWxzOwogaW1wb3J0IGxpYmNvcmUuaW8uU3RyZWFtczsKIAorQEFwcE1vZGVGdWxsKHJlYXNvbiA9ICJJbnN0YW50IGFwcHMgY2Fubm90IGFjY2VzcyB0aGUgU0QgY2FyZCIpCiBwdWJsaWMgY2xhc3MgRXhpZkludGVyZmFjZVRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBFeGlmSW50ZXJmYWNlLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFZFUkJPU0UgPSBmYWxzZTsgIC8vIGxvdHMgb2YgbG9nZ2luZwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL0V4dHJhY3REZWNvZGVFZGl0RW5jb2RlTXV4VGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL0V4dHJhY3REZWNvZGVFZGl0RW5jb2RlTXV4VGVzdC5qYXZhCmluZGV4IDcyYTc0YzEuLjZhY2Q1YjYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9FeHRyYWN0RGVjb2RlRWRpdEVuY29kZU11eFRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvRXh0cmFjdERlY29kZUVkaXRFbmNvZGVNdXhUZXN0LmphdmEKQEAgLTI5LDYgKzI5LDcgQEAKIGltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTXV4ZXI7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcjsKIGltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIGltcG9ydCBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZTsKQEAgLTU5LDYgKzYwLDcgQEAKICAqIE1lZGlhTXV4ZXIuCiAgKi8KIEBUYXJnZXRBcGkoMTgpCitAQXBwTW9kZUZ1bGwocmVhc29uID0gIkluc3RhbnQgYXBwcyBjYW5ub3QgYWNjZXNzIHRoZSBTRCBjYXJkIikKIHB1YmxpYyBjbGFzcyBFeHRyYWN0RGVjb2RlRWRpdEVuY29kZU11eFRlc3QKICAgICAgICAgZXh0ZW5kcyBBY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjxNZWRpYVN0dWJBY3Rpdml0eT4gewogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvSGVpZldyaXRlclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9IZWlmV3JpdGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYzk3MmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvSGVpZldyaXRlclRlc3QuamF2YQpAQCAtMCwwICsxLDYyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS5jdHM7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZHguaGVpZndyaXRlci5IZWlmV3JpdGVyLklOUFVUX01PREVfQklUTUFQOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkeC5oZWlmd3JpdGVyLkhlaWZXcml0ZXIuSU5QVVRfTU9ERV9CVUZGRVI7CitpbXBvcnQgc3RhdGljIGFuZHJvaWR4LmhlaWZ3cml0ZXIuSGVpZldyaXRlci5JTlBVVF9NT0RFX1NVUkZBQ0U7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuSW1hZ2VGb3JtYXQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFFeHRyYWN0b3I7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUZvcm1hdDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI7CitpbXBvcnQgYW5kcm9pZC5vcGVuZ2wuR0xFUzIwOworaW1wb3J0IGFuZHJvaWQub3MuRW52aXJvbm1lbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlclRocmVhZDsKK2ltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOworaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTm9uTnVsbDsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGFuZHJvaWR4LmhlaWZ3cml0ZXIuSGVpZldyaXRlcjsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuTWVkaWFVdGlsczsKKworaW1wb3J0IGphdmEuaW8uQ2xvc2VhYmxlOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK0BBcHBNb2RlRnVsbChyZWFzb24gPSAiSW5zdGFudCBhcHBzIGNhbm5vdCBhY2Nlc3MgdGhlIFNEIGNhcmQiKQorcHVibGljIGNsYXNzIEhlaWZXcml0ZXJUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gSGVpZldyaXRlclRlc3QuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERVTVBfWVVWX0lOUFVUID0gZmFsc2U7CisKKyAgICBwcml2YXRlIHN0YXRpYyBieXRlW11bXSBURVNUX1lVVl9DT0xPUlMgPSB7CisgICAgICAgICAgICB7KGJ5dGUpIDI1NSwgKGJ5dGUpIDAsIChieXRlKSAwfSwKKyAgICAgICAgICAgIHsoYnl0ZSkgMjU1LCAoYnl0ZSkgMCwgKGJ5dGUpIDI1NX0sCisgICAgICAgICAgICB7KGJ5dGUpIDI1NSwgKGJ5dGUpIDI1NSwgKGJ5dGUpIDI1NX0sCisgICAgICAgICAgICB7KGJ5dGUpIDI1NSwgKGJ5dGUpIDI1NSwgKGJ5dGUpIDB9LAorICAgIH07CisgICAgcHJpdmF0ZSBzdGF0aWMgQ29sb3IgQ09MT1JfQkxPQ0sgPQorICAgICAgICAgICAgQ29sb3IudmFsdWVPZigxLjBmLCAxLjBmLCAxLjBmKTsKKyAgICBwcml2YXRlIHN0YXRpYyBDb2xvcltdIENPTE9SX0JBUlMgPSB7CisgICAgICAgICAgICBDb2xvci52YWx1ZU9mKDAuMGYsIDAuMGYsIDAuMGYpLAorICAgICAgICAgICAgQ29sb3IudmFsdWVPZigwLjBmLCAwLjBmLCAwLjY0ZiksCisgICAgICAgICAgICBDb2xvci52YWx1ZU9mKDAuMGYsIDAuNjRmLCAwLjBmKSwKKyAgICAgICAgICAgIENvbG9yLnZhbHVlT2YoMC4wZiwgMC42NGYsIDAuNjRmKSwKKyAgICAgICAgICAgIENvbG9yLnZhbHVlT2YoMC42NGYsIDAuMGYsIDAuMGYpLAorICAgICAgICAgICAgQ29sb3IudmFsdWVPZigwLjY0ZiwgMC4wZiwgMC42NGYpLAorICAgICAgICAgICAgQ29sb3IudmFsdWVPZigwLjY0ZiwgMC42NGYsIDAuMGYpLAorICAgIH07CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IEJPUkRFUl9XSURUSCA9IDE2OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFSUZXUklURVJfSU5QVVQgPSAiaGVpZndyaXRlcl9pbnB1dC5oZWljIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBJTUFHRV9SRVNPVVJDRVMgPSBuZXcgaW50W10geworICAgICAgICAgICAgUi5yYXcuaGVpZndyaXRlcl9pbnB1dAorICAgIH07CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gSU1BR0VfRklMRU5BTUVTID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgIEhFSUZXUklURVJfSU5QVVQKKyAgICB9OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPVVRQVVRfRklMRU5BTUUgPSAib3V0cHV0LmhlaWMiOworCisgICAgcHJpdmF0ZSBJbnB1dFN1cmZhY2UgbUlucHV0RWdsU3VyZmFjZTsKKyAgICBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXI7CisgICAgcHJpdmF0ZSBpbnQgbUlucHV0SW5kZXg7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IElNQUdFX1JFU09VUkNFUy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgU3RyaW5nIG91dHB1dFBhdGggPSBuZXcgRmlsZShFbnZpcm9ubWVudC5nZXRFeHRlcm5hbFN0b3JhZ2VEaXJlY3RvcnkoKSwKKyAgICAgICAgICAgICAgICAgICAgSU1BR0VfRklMRU5BTUVTW2ldKS5nZXRBYnNvbHV0ZVBhdGgoKTsKKworICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBudWxsOworICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IGdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKS5vcGVuUmF3UmVzb3VyY2UoSU1BR0VfUkVTT1VSQ0VTW2ldKTsKKyAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRwdXRQYXRoKTsKKyAgICAgICAgICAgICAgICBjb3B5KGlucHV0U3RyZWFtLCBvdXRwdXRTdHJlYW0pOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBjbG9zZVF1aWV0bHkoaW5wdXRTdHJlYW0pOworICAgICAgICAgICAgICAgIGNsb3NlUXVpZXRseShvdXRwdXRTdHJlYW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgSGFuZGxlclRocmVhZCBoYW5kbGVyVGhyZWFkID0gbmV3IEhhbmRsZXJUaHJlYWQoCisgICAgICAgICAgICAgICAgIkhlaWZFbmNvZGVyVGhyZWFkIiwgUHJvY2Vzcy5USFJFQURfUFJJT1JJVFlfRk9SRUdST1VORCk7CisgICAgICAgIGhhbmRsZXJUaHJlYWQuc3RhcnQoKTsKKyAgICAgICAgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcihoYW5kbGVyVGhyZWFkLmdldExvb3BlcigpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IElNQUdFX1JFU09VUkNFUy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgU3RyaW5nIGltYWdlRmlsZVBhdGggPQorICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZShFbnZpcm9ubWVudC5nZXRFeHRlcm5hbFN0b3JhZ2VEaXJlY3RvcnkoKSwgSU1BR0VfRklMRU5BTUVTW2ldKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgICAgIEZpbGUgaW1hZ2VGaWxlID0gbmV3IEZpbGUoaW1hZ2VGaWxlUGF0aCk7CisgICAgICAgICAgICBpZiAoaW1hZ2VGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgaW1hZ2VGaWxlLmRlbGV0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdElucHV0QnVmZmVyX05vR3JpZF9Ob0hhbmRsZXIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgVGVzdENvbmZpZy5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgVGVzdENvbmZpZy5CdWlsZGVyKElOUFVUX01PREVfQlVGRkVSLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBkb1Rlc3RGb3JWYXJpb3VzTnVtYmVySW1hZ2VzKGJ1aWxkZXIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnB1dEJ1ZmZlcl9HcmlkX05vSGFuZGxlcigpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBUZXN0Q29uZmlnLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBUZXN0Q29uZmlnLkJ1aWxkZXIoSU5QVVRfTU9ERV9CVUZGRVIsIHRydWUsIGZhbHNlKTsKKyAgICAgICAgZG9UZXN0Rm9yVmFyaW91c051bWJlckltYWdlcyhidWlsZGVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5wdXRCdWZmZXJfTm9HcmlkX0hhbmRsZXIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgVGVzdENvbmZpZy5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgVGVzdENvbmZpZy5CdWlsZGVyKElOUFVUX01PREVfQlVGRkVSLCBmYWxzZSwgdHJ1ZSk7CisgICAgICAgIGRvVGVzdEZvclZhcmlvdXNOdW1iZXJJbWFnZXMoYnVpbGRlcik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdElucHV0QnVmZmVyX0dyaWRfSGFuZGxlcigpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBUZXN0Q29uZmlnLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBUZXN0Q29uZmlnLkJ1aWxkZXIoSU5QVVRfTU9ERV9CVUZGRVIsIHRydWUsIHRydWUpOworICAgICAgICBkb1Rlc3RGb3JWYXJpb3VzTnVtYmVySW1hZ2VzKGJ1aWxkZXIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnB1dFN1cmZhY2VfTm9HcmlkX05vSGFuZGxlcigpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBUZXN0Q29uZmlnLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBUZXN0Q29uZmlnLkJ1aWxkZXIoSU5QVVRfTU9ERV9TVVJGQUNFLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBkb1Rlc3RGb3JWYXJpb3VzTnVtYmVySW1hZ2VzKGJ1aWxkZXIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnB1dFN1cmZhY2VfR3JpZF9Ob0hhbmRsZXIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgVGVzdENvbmZpZy5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgVGVzdENvbmZpZy5CdWlsZGVyKElOUFVUX01PREVfU1VSRkFDRSwgdHJ1ZSwgZmFsc2UpOworICAgICAgICBkb1Rlc3RGb3JWYXJpb3VzTnVtYmVySW1hZ2VzKGJ1aWxkZXIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnB1dFN1cmZhY2VfTm9HcmlkX0hhbmRsZXIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgVGVzdENvbmZpZy5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgVGVzdENvbmZpZy5CdWlsZGVyKElOUFVUX01PREVfU1VSRkFDRSwgZmFsc2UsIHRydWUpOworICAgICAgICBkb1Rlc3RGb3JWYXJpb3VzTnVtYmVySW1hZ2VzKGJ1aWxkZXIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnB1dFN1cmZhY2VfR3JpZF9IYW5kbGVyKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIFRlc3RDb25maWcuQnVpbGRlciBidWlsZGVyID0gbmV3IFRlc3RDb25maWcuQnVpbGRlcihJTlBVVF9NT0RFX1NVUkZBQ0UsIHRydWUsIHRydWUpOworICAgICAgICBkb1Rlc3RGb3JWYXJpb3VzTnVtYmVySW1hZ2VzKGJ1aWxkZXIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnB1dEJpdG1hcF9Ob0dyaWRfTm9IYW5kbGVyKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIFRlc3RDb25maWcuQnVpbGRlciBidWlsZGVyID0gbmV3IFRlc3RDb25maWcuQnVpbGRlcihJTlBVVF9NT0RFX0JJVE1BUCwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBJTUFHRV9SRVNPVVJDRVMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIFN0cmluZyBpbnB1dFBhdGggPSBuZXcgRmlsZShFbnZpcm9ubWVudC5nZXRFeHRlcm5hbFN0b3JhZ2VEaXJlY3RvcnkoKSwKKyAgICAgICAgICAgICAgICAgICAgSU1BR0VfRklMRU5BTUVTW2ldKS5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgICAgIGRvVGVzdEZvclZhcmlvdXNOdW1iZXJJbWFnZXMoYnVpbGRlci5zZXRJbnB1dFBhdGgoaW5wdXRQYXRoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5wdXRCaXRtYXBfR3JpZF9Ob0hhbmRsZXIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgVGVzdENvbmZpZy5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgVGVzdENvbmZpZy5CdWlsZGVyKElOUFVUX01PREVfQklUTUFQLCB0cnVlLCBmYWxzZSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgSU1BR0VfUkVTT1VSQ0VTLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBTdHJpbmcgaW5wdXRQYXRoID0gbmV3IEZpbGUoRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlRGlyZWN0b3J5KCksCisgICAgICAgICAgICAgICAgICAgIElNQUdFX0ZJTEVOQU1FU1tpXSkuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgICAgICBkb1Rlc3RGb3JWYXJpb3VzTnVtYmVySW1hZ2VzKGJ1aWxkZXIuc2V0SW5wdXRQYXRoKGlucHV0UGF0aCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdElucHV0Qml0bWFwX05vR3JpZF9IYW5kbGVyKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIFRlc3RDb25maWcuQnVpbGRlciBidWlsZGVyID0gbmV3IFRlc3RDb25maWcuQnVpbGRlcihJTlBVVF9NT0RFX0JJVE1BUCwgZmFsc2UsIHRydWUpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IElNQUdFX1JFU09VUkNFUy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgU3RyaW5nIGlucHV0UGF0aCA9IG5ldyBGaWxlKEVudmlyb25tZW50LmdldEV4dGVybmFsU3RvcmFnZURpcmVjdG9yeSgpLAorICAgICAgICAgICAgICAgICAgICBJTUFHRV9GSUxFTkFNRVNbaV0pLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICAgICAgZG9UZXN0Rm9yVmFyaW91c051bWJlckltYWdlcyhidWlsZGVyLnNldElucHV0UGF0aChpbnB1dFBhdGgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnB1dEJpdG1hcF9HcmlkX0hhbmRsZXIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgVGVzdENvbmZpZy5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgVGVzdENvbmZpZy5CdWlsZGVyKElOUFVUX01PREVfQklUTUFQLCB0cnVlLCB0cnVlKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBJTUFHRV9SRVNPVVJDRVMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIFN0cmluZyBpbnB1dFBhdGggPSBuZXcgRmlsZShFbnZpcm9ubWVudC5nZXRFeHRlcm5hbFN0b3JhZ2VEaXJlY3RvcnkoKSwKKyAgICAgICAgICAgICAgICAgICAgSU1BR0VfRklMRU5BTUVTW2ldKS5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgICAgIGRvVGVzdEZvclZhcmlvdXNOdW1iZXJJbWFnZXMoYnVpbGRlci5zZXRJbnB1dFBhdGgoaW5wdXRQYXRoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNhbkVuY29kZUhlaWMoKSB7CisgICAgICAgIHJldHVybiBNZWRpYVV0aWxzLmhhc0VuY29kZXIoTWVkaWFGb3JtYXQuTUlNRVRZUEVfVklERU9fSEVWQykKKyAgICAgICAgICAgIHx8IE1lZGlhVXRpbHMuaGFzRW5jb2RlcihNZWRpYUZvcm1hdC5NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkb1Rlc3RGb3JWYXJpb3VzTnVtYmVySW1hZ2VzKFRlc3RDb25maWcuQnVpbGRlciBidWlsZGVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFjYW5FbmNvZGVIZWljKCkpIHsKKyAgICAgICAgICAgIE1lZGlhVXRpbHMuc2tpcFRlc3QoImhlaWMgZW5jb2RpbmcgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIGRldmljZSIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgYnVpbGRlci5zZXROdW1JbWFnZXMoNCk7CisgICAgICAgIGRvVGVzdChidWlsZGVyLnNldFJvdGF0aW9uKDI3MCkuYnVpbGQoKSk7CisgICAgICAgIGRvVGVzdChidWlsZGVyLnNldFJvdGF0aW9uKDE4MCkuYnVpbGQoKSk7CisgICAgICAgIGRvVGVzdChidWlsZGVyLnNldFJvdGF0aW9uKDkwKS5idWlsZCgpKTsKKyAgICAgICAgZG9UZXN0KGJ1aWxkZXIuc2V0Um90YXRpb24oMCkuYnVpbGQoKSk7CisgICAgICAgIGRvVGVzdChidWlsZGVyLnNldE51bUltYWdlcygxKS5idWlsZCgpKTsKKyAgICAgICAgZG9UZXN0KGJ1aWxkZXIuc2V0TnVtSW1hZ2VzKDgpLmJ1aWxkKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjbG9zZVF1aWV0bHkoQ2xvc2VhYmxlIGNsb3NlYWJsZSkgeworICAgICAgICBpZiAoY2xvc2VhYmxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY2xvc2VhYmxlLmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJldGhyb3duKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgcmV0aHJvd247CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgY29weShJbnB1dFN0cmVhbSBpbiwgT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IHRvdGFsID0gMDsKKyAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzgxOTJdOworICAgICAgICBpbnQgYzsKKyAgICAgICAgd2hpbGUgKChjID0gaW4ucmVhZChidWZmZXIpKSAhPSAtMSkgeworICAgICAgICAgICAgdG90YWwgKz0gYzsKKyAgICAgICAgICAgIG91dC53cml0ZShidWZmZXIsIDAsIGMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0b3RhbDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUZXN0Q29uZmlnIHsKKyAgICAgICAgZmluYWwgaW50IG1JbnB1dE1vZGU7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gbVVzZUdyaWQ7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gbVVzZUhhbmRsZXI7CisgICAgICAgIGZpbmFsIGludCBtTWF4TnVtSW1hZ2VzOworICAgICAgICBmaW5hbCBpbnQgbUFjdHVhbE51bUltYWdlczsKKyAgICAgICAgZmluYWwgaW50IG1XaWR0aDsKKyAgICAgICAgZmluYWwgaW50IG1IZWlnaHQ7CisgICAgICAgIGZpbmFsIGludCBtUm90YXRpb247CisgICAgICAgIGZpbmFsIGludCBtUXVhbGl0eTsKKyAgICAgICAgZmluYWwgU3RyaW5nIG1JbnB1dFBhdGg7CisgICAgICAgIGZpbmFsIFN0cmluZyBtT3V0cHV0UGF0aDsKKyAgICAgICAgZmluYWwgQml0bWFwW10gbUJpdG1hcHM7CisKKyAgICAgICAgVGVzdENvbmZpZyhpbnQgaW5wdXRNb2RlLCBib29sZWFuIHVzZUdyaWQsIGJvb2xlYW4gdXNlSGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICBpbnQgbWF4TnVtSW1hZ2VzLCBpbnQgYWN0dWFsTnVtSW1hZ2VzLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgaW50IHJvdGF0aW9uLCBpbnQgcXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICBTdHJpbmcgaW5wdXRQYXRoLCBTdHJpbmcgb3V0cHV0UGF0aCwgQml0bWFwW10gYml0bWFwcykgeworICAgICAgICAgICAgbUlucHV0TW9kZSA9IGlucHV0TW9kZTsKKyAgICAgICAgICAgIG1Vc2VHcmlkID0gdXNlR3JpZDsKKyAgICAgICAgICAgIG1Vc2VIYW5kbGVyID0gdXNlSGFuZGxlcjsKKyAgICAgICAgICAgIG1NYXhOdW1JbWFnZXMgPSBtYXhOdW1JbWFnZXM7CisgICAgICAgICAgICBtQWN0dWFsTnVtSW1hZ2VzID0gYWN0dWFsTnVtSW1hZ2VzOworICAgICAgICAgICAgbVdpZHRoID0gd2lkdGg7CisgICAgICAgICAgICBtSGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICAgICAgbVJvdGF0aW9uID0gcm90YXRpb247CisgICAgICAgICAgICBtUXVhbGl0eSA9IHF1YWxpdHk7CisgICAgICAgICAgICBtSW5wdXRQYXRoID0gaW5wdXRQYXRoOworICAgICAgICAgICAgbU91dHB1dFBhdGggPSBvdXRwdXRQYXRoOworICAgICAgICAgICAgbUJpdG1hcHMgPSBiaXRtYXBzOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIGNsYXNzIEJ1aWxkZXIgeworICAgICAgICAgICAgZmluYWwgaW50IG1JbnB1dE1vZGU7CisgICAgICAgICAgICBmaW5hbCBib29sZWFuIG1Vc2VHcmlkOworICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBtVXNlSGFuZGxlcjsKKyAgICAgICAgICAgIGludCBtTWF4TnVtSW1hZ2VzOworICAgICAgICAgICAgaW50IG1OdW1JbWFnZXM7CisgICAgICAgICAgICBpbnQgbVdpZHRoOworICAgICAgICAgICAgaW50IG1IZWlnaHQ7CisgICAgICAgICAgICBpbnQgbVJvdGF0aW9uOworICAgICAgICAgICAgZmluYWwgaW50IG1RdWFsaXR5OworICAgICAgICAgICAgU3RyaW5nIG1JbnB1dFBhdGg7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbU91dHB1dFBhdGg7CisgICAgICAgICAgICBCaXRtYXBbXSBtQml0bWFwczsKKyAgICAgICAgICAgIGJvb2xlYW4gbU51bUltYWdlc1NldEV4cGxpY2l0bHk7CisKKworICAgICAgICAgICAgQnVpbGRlcihpbnQgaW5wdXRNb2RlLCBib29sZWFuIHVzZUdyaWRzLCBib29sZWFuIHVzZUhhbmRsZXIpIHsKKyAgICAgICAgICAgICAgICBtSW5wdXRNb2RlID0gaW5wdXRNb2RlOworICAgICAgICAgICAgICAgIG1Vc2VHcmlkID0gdXNlR3JpZHM7CisgICAgICAgICAgICAgICAgbVVzZUhhbmRsZXIgPSB1c2VIYW5kbGVyOworICAgICAgICAgICAgICAgIG1NYXhOdW1JbWFnZXMgPSBtTnVtSW1hZ2VzID0gNDsKKyAgICAgICAgICAgICAgICBtV2lkdGggPSAxOTIwOworICAgICAgICAgICAgICAgIG1IZWlnaHQgPSAxMDgwOworICAgICAgICAgICAgICAgIG1Sb3RhdGlvbiA9IDA7CisgICAgICAgICAgICAgICAgbVF1YWxpdHkgPSAxMDA7CisgICAgICAgICAgICAgICAgbU91dHB1dFBhdGggPSBuZXcgRmlsZShFbnZpcm9ubWVudC5nZXRFeHRlcm5hbFN0b3JhZ2VEaXJlY3RvcnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9VVFBVVF9GSUxFTkFNRSkuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEJ1aWxkZXIgc2V0SW5wdXRQYXRoKFN0cmluZyBpbnB1dFBhdGgpIHsKKyAgICAgICAgICAgICAgICBtSW5wdXRQYXRoID0gKG1JbnB1dE1vZGUgPT0gSU5QVVRfTU9ERV9CSVRNQVApID8gaW5wdXRQYXRoIDogbnVsbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQnVpbGRlciBzZXROdW1JbWFnZXMoaW50IG51bUltYWdlcykgeworICAgICAgICAgICAgICAgIG1OdW1JbWFnZXNTZXRFeHBsaWNpdGx5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtTnVtSW1hZ2VzID0gbnVtSW1hZ2VzOworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBCdWlsZGVyIHNldFJvdGF0aW9uKGludCByb3RhdGlvbikgeworICAgICAgICAgICAgICAgIG1Sb3RhdGlvbiA9IHJvdGF0aW9uOworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIHZvaWQgbG9hZEJpdG1hcElucHV0cygpIHsKKyAgICAgICAgICAgICAgICBpZiAobUlucHV0TW9kZSAhPSBJTlBVVF9NT0RFX0JJVE1BUCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIgcmV0cmlldmVyID0gbmV3IE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIoKTsKKyAgICAgICAgICAgICAgICByZXRyaWV2ZXIuc2V0RGF0YVNvdXJjZShtSW5wdXRQYXRoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgaGFzSW1hZ2UgPSByZXRyaWV2ZXIuZXh0cmFjdE1ldGFkYXRhKAorICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFNZXRhZGF0YVJldHJpZXZlci5NRVRBREFUQV9LRVlfSEFTX0lNQUdFKTsKKyAgICAgICAgICAgICAgICBpZiAoISJ5ZXMiLmVxdWFscyhoYXNJbWFnZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibm8gYml0bWFwIGZvdW5kISIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtTWF4TnVtSW1hZ2VzID0gTWF0aC5taW4obU1heE51bUltYWdlcywgSW50ZWdlci5wYXJzZUludChyZXRyaWV2ZXIuZXh0cmFjdE1ldGFkYXRhKAorICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFNZXRhZGF0YVJldHJpZXZlci5NRVRBREFUQV9LRVlfSU1BR0VfQ09VTlQpKSk7CisgICAgICAgICAgICAgICAgaWYgKCFtTnVtSW1hZ2VzU2V0RXhwbGljaXRseSkgeworICAgICAgICAgICAgICAgICAgICBtTnVtSW1hZ2VzID0gbU1heE51bUltYWdlczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUJpdG1hcHMgPSBuZXcgQml0bWFwW21NYXhOdW1JbWFnZXNdOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUJpdG1hcHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgbUJpdG1hcHNbaV0gPSByZXRyaWV2ZXIuZ2V0SW1hZ2VBdEluZGV4KGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtV2lkdGggPSBtQml0bWFwc1swXS5nZXRXaWR0aCgpOworICAgICAgICAgICAgICAgIG1IZWlnaHQgPSBtQml0bWFwc1swXS5nZXRIZWlnaHQoKTsKKyAgICAgICAgICAgICAgICByZXRyaWV2ZXIucmVsZWFzZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIHZvaWQgY2xlYW51cFN0YWxlT3V0cHV0cygpIHsKKyAgICAgICAgICAgICAgICBGaWxlIG91dHB1dEZpbGUgPSBuZXcgRmlsZShtT3V0cHV0UGF0aCk7CisgICAgICAgICAgICAgICAgaWYgKG91dHB1dEZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0RmlsZS5kZWxldGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFRlc3RDb25maWcgYnVpbGQoKSB7CisgICAgICAgICAgICAgICAgY2xlYW51cFN0YWxlT3V0cHV0cygpOworICAgICAgICAgICAgICAgIGxvYWRCaXRtYXBJbnB1dHMoKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGVzdENvbmZpZyhtSW5wdXRNb2RlLCBtVXNlR3JpZCwgbVVzZUhhbmRsZXIsIG1NYXhOdW1JbWFnZXMsIG1OdW1JbWFnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQsIG1Sb3RhdGlvbiwgbVF1YWxpdHksIG1JbnB1dFBhdGgsIG1PdXRwdXRQYXRoLCBtQml0bWFwcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiVGVzdENvbmZpZyIKKyAgICAgICAgICAgICAgICAgICAgKyAiOiBtSW5wdXRNb2RlICIgKyBtSW5wdXRNb2RlCisgICAgICAgICAgICAgICAgICAgICsgIiwgbVVzZUdyaWQgIiArIG1Vc2VHcmlkCisgICAgICAgICAgICAgICAgICAgICsgIiwgbVVzZUhhbmRsZXIgIiArIG1Vc2VIYW5kbGVyCisgICAgICAgICAgICAgICAgICAgICsgIiwgbU1heE51bUltYWdlcyAiICsgbU1heE51bUltYWdlcworICAgICAgICAgICAgICAgICAgICArICIsIG1OdW1JbWFnZXMgIiArIG1BY3R1YWxOdW1JbWFnZXMKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBtV2lkdGggIiArIG1XaWR0aAorICAgICAgICAgICAgICAgICAgICArICIsIG1IZWlnaHQgIiArIG1IZWlnaHQKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBtUm90YXRpb24gIiArIG1Sb3RhdGlvbgorICAgICAgICAgICAgICAgICAgICArICIsIG1RdWFsaXR5ICIgKyBtUXVhbGl0eQorICAgICAgICAgICAgICAgICAgICArICIsIG1JbnB1dFBhdGggIiArIG1JbnB1dFBhdGgKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBtT3V0cHV0UGF0aCAiICsgbU91dHB1dFBhdGg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZG9UZXN0KGZpbmFsIFRlc3RDb25maWcgY29uZmlnKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgaW50IHdpZHRoID0gY29uZmlnLm1XaWR0aDsKKyAgICAgICAgZmluYWwgaW50IGhlaWdodCA9IGNvbmZpZy5tSGVpZ2h0OworICAgICAgICBmaW5hbCBpbnQgYWN0dWFsTnVtSW1hZ2VzID0gY29uZmlnLm1BY3R1YWxOdW1JbWFnZXM7CisKKyAgICAgICAgbUlucHV0SW5kZXggPSAwOworICAgICAgICBIZWlmV3JpdGVyIGhlaWZXcml0ZXIgPSBudWxsOworICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBudWxsOworICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgInN0YXJ0ZWQ6ICIgKyBjb25maWcpOworCisgICAgICAgICAgICBoZWlmV3JpdGVyID0gbmV3IEhlaWZXcml0ZXIuQnVpbGRlcigKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLm1PdXRwdXRQYXRoLCB3aWR0aCwgaGVpZ2h0LCBjb25maWcubUlucHV0TW9kZSkKKyAgICAgICAgICAgICAgICAgICAgLnNldFJvdGF0aW9uKGNvbmZpZy5tUm90YXRpb24pCisgICAgICAgICAgICAgICAgICAgIC5zZXRHcmlkRW5hYmxlZChjb25maWcubVVzZUdyaWQpCisgICAgICAgICAgICAgICAgICAgIC5zZXRNYXhJbWFnZXMoY29uZmlnLm1NYXhOdW1JbWFnZXMpCisgICAgICAgICAgICAgICAgICAgIC5zZXRRdWFsaXR5KGNvbmZpZy5tUXVhbGl0eSkKKyAgICAgICAgICAgICAgICAgICAgLnNldFByaW1hcnlJbmRleChjb25maWcubU1heE51bUltYWdlcyAtIDEpCisgICAgICAgICAgICAgICAgICAgIC5zZXRIYW5kbGVyKGNvbmZpZy5tVXNlSGFuZGxlciA/IG1IYW5kbGVyIDogbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisKKyAgICAgICAgICAgIGlmIChjb25maWcubUlucHV0TW9kZSA9PSBJTlBVVF9NT0RFX1NVUkZBQ0UpIHsKKyAgICAgICAgICAgICAgICBtSW5wdXRFZ2xTdXJmYWNlID0gbmV3IElucHV0U3VyZmFjZShoZWlmV3JpdGVyLmdldElucHV0U3VyZmFjZSgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaGVpZldyaXRlci5zdGFydCgpOworCisgICAgICAgICAgICBpZiAoY29uZmlnLm1JbnB1dE1vZGUgPT0gSU5QVVRfTU9ERV9CVUZGRVIpIHsKKyAgICAgICAgICAgICAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlW3dpZHRoICogaGVpZ2h0ICogMyAvIDJdOworCisgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5tSW5wdXRQYXRoICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGNvbmZpZy5tSW5wdXRQYXRoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoRFVNUF9ZVVZfSU5QVVQpIHsKKyAgICAgICAgICAgICAgICAgICAgRmlsZSBvdXRwdXRGaWxlID0gbmV3IEZpbGUoIi9zZGNhcmQvaW5wdXQueXV2Iik7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dEZpbGUuY3JlYXRlTmV3RmlsZSgpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRwdXRGaWxlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFjdHVhbE51bUltYWdlczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAiZmlsbFl1dkJ1ZmZlcjogIiArIGkpOworICAgICAgICAgICAgICAgICAgICBmaWxsWXV2QnVmZmVyKGksIGRhdGEsIHdpZHRoLCBoZWlnaHQsIGlucHV0U3RyZWFtKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERVTVBfWVVWX0lOUFVUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJAQEAgZHVtcGluZyBpbnB1dCBZVVYiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbS53cml0ZShkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBoZWlmV3JpdGVyLmFkZFl1dkJ1ZmZlcihJbWFnZUZvcm1hdC5ZVVZfNDIwXzg4OCwgZGF0YSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChjb25maWcubUlucHV0TW9kZSA9PSBJTlBVVF9NT0RFX1NVUkZBQ0UpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgaW5wdXQgc3VyZmFjZSBpcyBhIHN1cmZhY2UgdGV4dHVyZSB1c2luZyBzaW5nbGUgYnVmZmVyIG1vZGUsIGRyYXdzIHdpbGwgYmUKKyAgICAgICAgICAgICAgICAvLyBibG9ja2VkIHVudGlsIG9uRnJhbWVBdmFpbGFibGUgaXMgZG9uZSB3aXRoIHRoZSBidWZmZXIsIHdoaWNoIGlzIGRlcGVuZGFudCBvbgorICAgICAgICAgICAgICAgIC8vIGhvdyBmYXN0IE1lZGlhQ29kZWMgcHJvY2Vzc2VzIHRoZW0sIHdoaWNoIGlzIGZ1cnRoZXIgZGVwZW5kZW50IG9uIGhvdyBmYXN0IHRoZQorICAgICAgICAgICAgICAgIC8vIE1lZGlhQ29kZWMgY2FsbGJhY2tzIGFyZSBoYW5kbGVkLiBXZSBjYW4ndCBwdXQgZHJhd3Mgb24gdGhlIHNhbWUgbG9vcGVyIHRoYXQKKyAgICAgICAgICAgICAgICAvLyBoYW5kbGVzIE1lZGlhQ29kZWMgY2FsbGJhY2ssIGl0IHdpbGwgY2F1c2UgZGVhZGxvY2suCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhY3R1YWxOdW1JbWFnZXM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgImRyYXdGcmFtZTogIiArIGkpOworICAgICAgICAgICAgICAgICAgICBkcmF3RnJhbWUod2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGhlaWZXcml0ZXIuc2V0SW5wdXRFbmRPZlN0cmVhbVRpbWVzdGFtcCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAgKiBjb21wdXRlUHJlc2VudGF0aW9uVGltZShhY3R1YWxOdW1JbWFnZXMgLSAxKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy5tSW5wdXRNb2RlID09IElOUFVUX01PREVfQklUTUFQKSB7CisgICAgICAgICAgICAgICAgQml0bWFwW10gYml0bWFwcyA9IGNvbmZpZy5tQml0bWFwczsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1hdGgubWluKGJpdG1hcHMubGVuZ3RoLCBhY3R1YWxOdW1JbWFnZXMpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJhZGRCaXRtYXA6ICIgKyBpKTsKKyAgICAgICAgICAgICAgICAgICAgaGVpZldyaXRlci5hZGRCaXRtYXAoYml0bWFwc1tpXSk7CisgICAgICAgICAgICAgICAgICAgIGJpdG1hcHNbaV0ucmVjeWNsZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaGVpZldyaXRlci5zdG9wKDMwMDApOworICAgICAgICAgICAgLy8gVGhlIHRlc3Qgc2V0cyB0aGUgcHJpbWFyeSBpbmRleCB0byB0aGUgbGFzdCBpbWFnZS4KKyAgICAgICAgICAgIC8vIEhvd2V2ZXIsIGlmIHdlJ3JlIHRlc3RpbmcgZWFybHkgYWJvcnQsIHRoZSBsYXN0IGltYWdlIHdpbGwgbm90IGJlCisgICAgICAgICAgICAvLyBwcmVzZW50IGFuZCB0aGUgbXV4ZXIgaXMgc3VwcG9zZWQgdG8gc2V0IGl0IHRvIDAgYnkgZGVmYXVsdC4KKyAgICAgICAgICAgIGludCBleHBlY3RlZFByaW1hcnkgPSBjb25maWcubU1heE51bUltYWdlcyAtIDE7CisgICAgICAgICAgICBpbnQgZXhwZWN0ZWRJbWFnZUNvdW50ID0gY29uZmlnLm1NYXhOdW1JbWFnZXM7CisgICAgICAgICAgICBpZiAoYWN0dWFsTnVtSW1hZ2VzIDwgY29uZmlnLm1NYXhOdW1JbWFnZXMpIHsKKyAgICAgICAgICAgICAgICBleHBlY3RlZFByaW1hcnkgPSAwOworICAgICAgICAgICAgICAgIGV4cGVjdGVkSW1hZ2VDb3VudCA9IGFjdHVhbE51bUltYWdlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZlcmlmeVJlc3VsdChjb25maWcubU91dHB1dFBhdGgsIHdpZHRoLCBoZWlnaHQsIGNvbmZpZy5tUm90YXRpb24sCisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkSW1hZ2VDb3VudCwgZXhwZWN0ZWRQcmltYXJ5LCBjb25maWcubVVzZUdyaWQsCisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5tSW5wdXRNb2RlID09IElOUFVUX01PREVfU1VSRkFDRSk7CisgICAgICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgImZpbmlzaGVkOiBQQVNTIik7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChvdXRwdXRTdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGlucHV0U3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQorCisgICAgICAgICAgICBpZiAoaGVpZldyaXRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaGVpZldyaXRlci5jbG9zZSgpOworICAgICAgICAgICAgICAgIGhlaWZXcml0ZXIgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1JbnB1dEVnbFN1cmZhY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgYWxzbyByZWxlYXNlcyB0aGUgc3VyZmFjZSBmcm9tIGVuY29kZXIuCisgICAgICAgICAgICAgICAgbUlucHV0RWdsU3VyZmFjZS5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgbUlucHV0RWdsU3VyZmFjZSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGxvbmcgY29tcHV0ZVByZXNlbnRhdGlvblRpbWUoaW50IGZyYW1lSW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIDEzMiArIChsb25nKWZyYW1lSW5kZXggKiAxMDAwMDAwOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBmaWxsWXV2QnVmZmVyKGludCBmcmFtZUluZGV4LCBATm9uTnVsbCBieXRlW10gZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBGaWxlSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpbnB1dFN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICBpbnB1dFN0cmVhbS5yZWFkKGRhdGEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnl0ZVtdIGNvbG9yID0gVEVTVF9ZVVZfQ09MT1JTW2ZyYW1lSW5kZXggJSBURVNUX1lVVl9DT0xPUlMubGVuZ3RoXTsKKyAgICAgICAgICAgIGludCBzaXplWSA9IHdpZHRoICogaGVpZ2h0OworICAgICAgICAgICAgQXJyYXlzLmZpbGwoZGF0YSwgMCwgc2l6ZVksIGNvbG9yWzBdKTsKKyAgICAgICAgICAgIEFycmF5cy5maWxsKGRhdGEsIHNpemVZLCBzaXplWSAqIDUgLyA0LCBjb2xvclsxXSk7CisgICAgICAgICAgICBBcnJheXMuZmlsbChkYXRhLCBzaXplWSAqIDUgLyA0LCBzaXplWSAqIDMgLyAyLCBjb2xvclsyXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZHJhd0ZyYW1lKGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgICAgICBtSW5wdXRFZ2xTdXJmYWNlLm1ha2VDdXJyZW50KCk7CisgICAgICAgIGdlbmVyYXRlU3VyZmFjZUZyYW1lKG1JbnB1dEluZGV4LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgbUlucHV0RWdsU3VyZmFjZS5zZXRQcmVzZW50YXRpb25UaW1lKDEwMDAgKiBjb21wdXRlUHJlc2VudGF0aW9uVGltZShtSW5wdXRJbmRleCkpOworICAgICAgICBtSW5wdXRFZ2xTdXJmYWNlLnN3YXBCdWZmZXJzKCk7CisgICAgICAgIG1JbnB1dEluZGV4Kys7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgUmVjdCBnZXRDb2xvckJhclJlY3QoaW50IGluZGV4LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICAgICAgaW50IGJhcldpZHRoID0gKHdpZHRoIC0gQk9SREVSX1dJRFRIICogMikgLyBDT0xPUl9CQVJTLmxlbmd0aDsKKyAgICAgICAgcmV0dXJuIG5ldyBSZWN0KEJPUkRFUl9XSURUSCArIGJhcldpZHRoICogaW5kZXgsIEJPUkRFUl9XSURUSCwKKyAgICAgICAgICAgICAgICBCT1JERVJfV0lEVEggKyBiYXJXaWR0aCAqIChpbmRleCArIDEpLCBoZWlnaHQgLSBCT1JERVJfV0lEVEgpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFJlY3QgZ2V0Q29sb3JCbG9ja1JlY3QoaW50IGluZGV4LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICAgICAgaW50IGJsb2NrQ2VudGVyWCA9ICh3aWR0aCAvIDUpICogKGluZGV4ICUgNCArIDEpOworICAgICAgICByZXR1cm4gbmV3IFJlY3QoYmxvY2tDZW50ZXJYIC0gd2lkdGggLyAxMCwgaGVpZ2h0IC8gNiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrQ2VudGVyWCArIHdpZHRoIC8gMTAsIGhlaWdodCAvIDMpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZVN1cmZhY2VGcmFtZShpbnQgZnJhbWVJbmRleCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgIEdMRVMyMC5nbFZpZXdwb3J0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICBHTEVTMjAuZ2xEaXNhYmxlKEdMRVMyMC5HTF9TQ0lTU09SX1RFU1QpOworICAgICAgICBHTEVTMjAuZ2xDbGVhckNvbG9yKDEuMGYsIDAuMGYsIDAuMGYsIDEuMGYpOworICAgICAgICBHTEVTMjAuZ2xDbGVhcihHTEVTMjAuR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgICAgIEdMRVMyMC5nbEVuYWJsZShHTEVTMjAuR0xfU0NJU1NPUl9URVNUKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IENPTE9SX0JBUlMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIFJlY3QgciA9IGdldENvbG9yQmFyUmVjdChpLCB3aWR0aCwgaGVpZ2h0KTsKKworICAgICAgICAgICAgR0xFUzIwLmdsU2Npc3NvcihyLmxlZnQsIHIudG9wLCByLndpZHRoKCksIHIuaGVpZ2h0KCkpOworICAgICAgICAgICAgZmluYWwgQ29sb3IgY29sb3IgPSBDT0xPUl9CQVJTW2ldOworICAgICAgICAgICAgR0xFUzIwLmdsQ2xlYXJDb2xvcihjb2xvci5yZWQoKSwgY29sb3IuZ3JlZW4oKSwgY29sb3IuYmx1ZSgpLCAxLjBmKTsKKyAgICAgICAgICAgIEdMRVMyMC5nbENsZWFyKEdMRVMyMC5HTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICAgICAgfQorCisgICAgICAgIFJlY3QgciA9IGdldENvbG9yQmxvY2tSZWN0KGZyYW1lSW5kZXgsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICBHTEVTMjAuZ2xTY2lzc29yKHIubGVmdCwgci50b3AsIHIud2lkdGgoKSwgci5oZWlnaHQoKSk7CisgICAgICAgIEdMRVMyMC5nbENsZWFyQ29sb3IoMC41ZiwgMC41ZiwgMC41ZiwgMS4wZik7CisgICAgICAgIEdMRVMyMC5nbENsZWFyKEdMRVMyMC5HTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICAgICAgci5pbnNldChCT1JERVJfV0lEVEgsIEJPUkRFUl9XSURUSCk7CisgICAgICAgIEdMRVMyMC5nbFNjaXNzb3Ioci5sZWZ0LCByLnRvcCwgci53aWR0aCgpLCByLmhlaWdodCgpKTsKKyAgICAgICAgR0xFUzIwLmdsQ2xlYXJDb2xvcihDT0xPUl9CTE9DSy5yZWQoKSwgQ09MT1JfQkxPQ0suZ3JlZW4oKSwgQ09MT1JfQkxPQ0suYmx1ZSgpLCAxLjBmKTsKKyAgICAgICAgR0xFUzIwLmdsQ2xlYXIoR0xFUzIwLkdMX0NPTE9SX0JVRkZFUl9CSVQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZXMgaWYgdHdvIGNvbG9yIHZhbHVlcyBhcmUgYXBwcm94aW1hdGVseSBlcXVhbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGFwcHJveEVxdWFscyhDb2xvciBleHBlY3RlZCwgQ29sb3IgYWN0dWFsKSB7CisgICAgICAgIGZpbmFsIGZsb2F0IE1BWF9ERUxUQSA9IDAuMDI1ZjsKKyAgICAgICAgcmV0dXJuIChNYXRoLmFicyhleHBlY3RlZC5yZWQoKSAtIGFjdHVhbC5yZWQoKSkgPD0gTUFYX0RFTFRBKQorICAgICAgICAgICAgJiYgKE1hdGguYWJzKGV4cGVjdGVkLmdyZWVuKCkgLSBhY3R1YWwuZ3JlZW4oKSkgPD0gTUFYX0RFTFRBKQorICAgICAgICAgICAgJiYgKE1hdGguYWJzKGV4cGVjdGVkLmJsdWUoKSAtIGFjdHVhbC5ibHVlKCkpIDw9IE1BWF9ERUxUQSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeVJlc3VsdCgKKyAgICAgICAgICAgIFN0cmluZyBmaWxlbmFtZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgcm90YXRpb24sCisgICAgICAgICAgICBpbnQgaW1hZ2VDb3VudCwgaW50IHByaW1hcnksIGJvb2xlYW4gdXNlR3JpZCwgYm9vbGVhbiBjaGVja0NvbG9yKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIgcmV0cmlldmVyID0gbmV3IE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIoKTsKKyAgICAgICAgcmV0cmlldmVyLnNldERhdGFTb3VyY2UoZmlsZW5hbWUpOworICAgICAgICBTdHJpbmcgaGFzSW1hZ2UgPSByZXRyaWV2ZXIuZXh0cmFjdE1ldGFkYXRhKE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuTUVUQURBVEFfS0VZX0hBU19JTUFHRSk7CisgICAgICAgIGlmICghInllcyIuZXF1YWxzKGhhc0ltYWdlKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiTm8gaW1hZ2VzIGZvdW5kIGluIGZpbGUgIiArIGZpbGVuYW1lKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoIldyb25nIHdpZHRoIiwgd2lkdGgsCisgICAgICAgICAgICAgICAgSW50ZWdlci5wYXJzZUludChyZXRyaWV2ZXIuZXh0cmFjdE1ldGFkYXRhKAorICAgICAgICAgICAgICAgICAgICBNZWRpYU1ldGFkYXRhUmV0cmlldmVyLk1FVEFEQVRBX0tFWV9JTUFHRV9XSURUSCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBoZWlnaHQiLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgSW50ZWdlci5wYXJzZUludChyZXRyaWV2ZXIuZXh0cmFjdE1ldGFkYXRhKAorICAgICAgICAgICAgICAgICAgICBNZWRpYU1ldGFkYXRhUmV0cmlldmVyLk1FVEFEQVRBX0tFWV9JTUFHRV9IRUlHSFQpKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiV3Jvbmcgcm90YXRpb24iLCByb3RhdGlvbiwKKyAgICAgICAgICAgICAgICBJbnRlZ2VyLnBhcnNlSW50KHJldHJpZXZlci5leHRyYWN0TWV0YWRhdGEoCisgICAgICAgICAgICAgICAgICAgIE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuTUVUQURBVEFfS0VZX0lNQUdFX1JPVEFUSU9OKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIldyb25nIGltYWdlIGNvdW50IiwgaW1hZ2VDb3VudCwKKyAgICAgICAgICAgICAgICBJbnRlZ2VyLnBhcnNlSW50KHJldHJpZXZlci5leHRyYWN0TWV0YWRhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYU1ldGFkYXRhUmV0cmlldmVyLk1FVEFEQVRBX0tFWV9JTUFHRV9DT1VOVCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBwcmltYXJ5IGluZGV4IiwgcHJpbWFyeSwKKyAgICAgICAgICAgICAgICBJbnRlZ2VyLnBhcnNlSW50KHJldHJpZXZlci5leHRyYWN0TWV0YWRhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYU1ldGFkYXRhUmV0cmlldmVyLk1FVEFEQVRBX0tFWV9JTUFHRV9QUklNQVJZKSkpOworICAgICAgICByZXRyaWV2ZXIucmVsZWFzZSgpOworCisgICAgICAgIGlmICh1c2VHcmlkKSB7CisgICAgICAgICAgICBNZWRpYUV4dHJhY3RvciBleHRyYWN0b3IgPSBuZXcgTWVkaWFFeHRyYWN0b3IoKTsKKyAgICAgICAgICAgIGV4dHJhY3Rvci5zZXREYXRhU291cmNlKGZpbGVuYW1lKTsKKyAgICAgICAgICAgIE1lZGlhRm9ybWF0IGZvcm1hdCA9IGV4dHJhY3Rvci5nZXRUcmFja0Zvcm1hdCgwKTsKKyAgICAgICAgICAgIGludCB0aWxlV2lkdGggPSBmb3JtYXQuZ2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfVElMRV9XSURUSCk7CisgICAgICAgICAgICBpbnQgdGlsZUhlaWdodCA9IGZvcm1hdC5nZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9USUxFX0hFSUdIVCk7CisgICAgICAgICAgICBpbnQgZ3JpZFJvd3MgPSBmb3JtYXQuZ2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfR1JJRF9ST1dTKTsKKyAgICAgICAgICAgIGludCBncmlkQ29scyA9IGZvcm1hdC5nZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9HUklEX0NPTFVNTlMpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvbmcgdGlsZSB3aWR0aCBvciBncmlkIGNvbHMiLAorICAgICAgICAgICAgICAgICAgICAoKHdpZHRoICsgdGlsZVdpZHRoIC0gMSkgLyB0aWxlV2lkdGgpID09IGdyaWRDb2xzKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIldyb25nIHRpbGUgaGVpZ2h0IG9yIGdyaWQgcm93cyIsCisgICAgICAgICAgICAgICAgICAgICgoaGVpZ2h0ICsgdGlsZUhlaWdodCAtIDEpIC8gdGlsZUhlaWdodCkgPT0gZ3JpZFJvd3MpOworICAgICAgICAgICAgZXh0cmFjdG9yLnJlbGVhc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjaGVja0NvbG9yKSB7CisgICAgICAgICAgICBCaXRtYXAgYml0bWFwID0gQml0bWFwRmFjdG9yeS5kZWNvZGVGaWxlKGZpbGVuYW1lKTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBDT0xPUl9CQVJTLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgUmVjdCByID0gZ2V0Q29sb3JCYXJSZWN0KGksIHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkNvbG9yIGJhciAiICsgaSArICIgZG9lc24ndCBtYXRjaCIsIGFwcHJveEVxdWFscyhDT0xPUl9CQVJTW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3IudmFsdWVPZihiaXRtYXAuZ2V0UGl4ZWwoci5jZW50ZXJYKCksIHIuY2VudGVyWSgpKSkpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgUmVjdCByID0gZ2V0Q29sb3JCbG9ja1JlY3QocHJpbWFyeSwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJDb2xvciBibG9jayBkb2Vzbid0IG1hdGNoIiwgYXBwcm94RXF1YWxzKENPTE9SX0JMT0NLLAorICAgICAgICAgICAgICAgICAgICBDb2xvci52YWx1ZU9mKGJpdG1hcC5nZXRQaXhlbChyLmNlbnRlclgoKSwgaGVpZ2h0IC0gci5jZW50ZXJZKCkpKSkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL0ltYWdlUmVhZGVyRGVjb2RlclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9JbWFnZVJlYWRlckRlY29kZXJUZXN0LmphdmEKaW5kZXggZGNhYzhmMC4uNTQwZTNmZiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL0ltYWdlUmVhZGVyRGVjb2RlclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvSW1hZ2VSZWFkZXJEZWNvZGVyVGVzdC5qYXZhCkBAIC0zMjAsOCArMzIwLDcgQEAKICAgICAgICAgQXJyYXlMaXN0PERlY29kZXI+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8RGVjb2Rlcj4oKTsKIAogICAgICAgICBmb3IgKE1lZGlhQ29kZWNJbmZvIGluZm8gOiBtY2wuZ2V0Q29kZWNJbmZvcygpKSB7Ci0gICAgICAgICAgICBpZiAoaW5mby5pc0VuY29kZXIoKQotICAgICAgICAgICAgICAgICAgICB8fCBpbmZvLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoIm9teC5nb29nbGUuIikgIT0gZ29vZykgeworICAgICAgICAgICAgaWYgKGluZm8uaXNFbmNvZGVyKCkgfHwgTWVkaWFVdGlscy5pc0dvb2dsZShpbmZvLmdldE5hbWUoKSkgIT0gZ29vZykgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgQ29kZWNDYXBhYmlsaXRpZXMgY2FwcyA9IG51bGw7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvSmV0UGxheWVyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL0pldFBsYXllclRlc3QuamF2YQppbmRleCBkY2U3OTJhLi45ZDAxMDczIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvSmV0UGxheWVyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9KZXRQbGF5ZXJUZXN0LmphdmEKQEAgLTI1LDYgKzI1LDcgQEAKIGltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKQEAgLTY2LDYgKzY3LDcgQEAKICAgICAgICAgc3VwZXIudGVhckRvd24oKTsKICAgICB9CiAKKyAgICBAQXBwTW9kZUZ1bGwocmVhc29uID0gIkluc3RhbnQgYXBwcyBjYW5ub3QgYWNjZXNzIHRoZSBTRCBjYXJkIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0TG9hZEpldEZyb21QYXRoKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIGFzc2VydFRydWUobUpldFBsYXllci5jbGVhclF1ZXVlKCkpOwogICAgICAgICBwcmVwYXJlRmlsZSgpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL0xvdWRuZXNzRW5oYW5jZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvTG91ZG5lc3NFbmhhbmNlclRlc3QuamF2YQppbmRleCAyNWQzYjRjLi5hM2FhOTcxIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvTG91ZG5lc3NFbmhhbmNlclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvTG91ZG5lc3NFbmhhbmNlclRlc3QuamF2YQpAQCAtMjQsNiArMjQsNyBAQAogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXI7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpb2Z4LkxvdWRuZXNzRW5oYW5jZXI7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOwogaW1wb3J0IGphdmEudXRpbC5VVUlEOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW9meC5WaXN1YWxpemVyOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW9meC5WaXN1YWxpemVyLk1lYXN1cmVtZW50UGVha1JtczsKQEAgLTMxLDYgKzMyLDcgQEAKIGltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKK0BBcHBNb2RlRnVsbChyZWFzb24gPSAiRHluYW1pYyBjb25maWcgZGlzYWJsZWQuIikKIHB1YmxpYyBjbGFzcyBMb3VkbmVzc0VuaGFuY2VyVGVzdCBleHRlbmRzIFBvc3RQcm9jVGVzdEJhc2UgewogCiAgICAgcHJpdmF0ZSBTdHJpbmcgVEFHID0gIkxvdWRuZXNzRW5oYW5jZXJUZXN0IjsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9NZWRpYUJyb3dzZXJTZXJ2aWNlVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL01lZGlhQnJvd3NlclNlcnZpY2VUZXN0LmphdmEKaW5kZXggOTljMGFjMS4uMDkxMTUxYyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL01lZGlhQnJvd3NlclNlcnZpY2VUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL01lZGlhQnJvd3NlclNlcnZpY2VUZXN0LmphdmEKQEAgLTE1LDEwICsxNSwxNCBAQAogICovCiBwYWNrYWdlIGFuZHJvaWQubWVkaWEuY3RzOwogCitpbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuY3RzLlV0aWxzLmNvbXBhcmVSZW1vdGVVc2VySW5mbzsKKwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuYnJvd3NlLk1lZGlhQnJvd3NlcjsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLmJyb3dzZS5NZWRpYUJyb3dzZXIuTWVkaWFJdGVtOworaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYVNlc3Npb25NYW5hZ2VyLlJlbW90ZVVzZXJJbmZvOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuUHJvY2VzczsKIGltcG9ydCBhbmRyb2lkLnNlcnZpY2UubWVkaWEuTWVkaWFCcm93c2VyU2VydmljZTsKIGltcG9ydCBhbmRyb2lkLnNlcnZpY2UubWVkaWEuTWVkaWFCcm93c2VyU2VydmljZS5Ccm93c2VyUm9vdDsKIGltcG9ydCBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdENhc2U7CkBAIC0yNiw3ICszMCw3IEBACiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIC8qKgotICogVGVzdCB7QGxpbmsgYW5kcm9pZC5tZWRpYS5icm93c2UuTWVkaWFCcm93c2VyU2VydmljZX0uCisgKiBUZXN0IHtAbGluayBhbmRyb2lkLnNlcnZpY2UubWVkaWEuTWVkaWFCcm93c2VyU2VydmljZX0uCiAgKi8KIHB1YmxpYyBjbGFzcyBNZWRpYUJyb3dzZXJTZXJ2aWNlVGVzdCBleHRlbmRzIEluc3RydW1lbnRhdGlvblRlc3RDYXNlIHsKICAgICAvLyBUaGUgbWF4aW11bSB0aW1lIHRvIHdhaXQgZm9yIGFuIG9wZXJhdGlvbi4KQEAgLTg5LDYgKzkzLDcgQEAKICAgICB9OwogCiAgICAgcHJpdmF0ZSBNZWRpYUJyb3dzZXIgbU1lZGlhQnJvd3NlcjsKKyAgICBwcml2YXRlIFJlbW90ZVVzZXJJbmZvIG1Ccm93c2VySW5mbzsKICAgICBwcml2YXRlIFN0dWJNZWRpYUJyb3dzZXJTZXJ2aWNlIG1NZWRpYUJyb3dzZXJTZXJ2aWNlOwogICAgIHByaXZhdGUgYm9vbGVhbiBtT25DaGlsZHJlbkxvYWRlZDsKICAgICBwcml2YXRlIGJvb2xlYW4gbU9uQ2hpbGRyZW5Mb2FkZWRXaXRoT3B0aW9uczsKQEAgLTEwNiw2ICsxMTEsMTAgQEAKICAgICAgICAgICAgICAgICBtUm9vdEhpbnRzLnB1dEJvb2xlYW4oTWVkaWFCcm93c2VyU2VydmljZS5Ccm93c2VyUm9vdC5FWFRSQV9TVUdHRVNURUQsIHRydWUpOwogICAgICAgICAgICAgICAgIG1NZWRpYUJyb3dzZXIgPSBuZXcgTWVkaWFCcm93c2VyKGdldEluc3RydW1lbnRhdGlvbigpLmdldFRhcmdldENvbnRleHQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RfQlJPV1NFUl9TRVJWSUNFLCBtQ29ubmVjdGlvbkNhbGxiYWNrLCBtUm9vdEhpbnRzKTsKKyAgICAgICAgICAgICAgICBtQnJvd3NlckluZm8gPSBuZXcgUmVtb3RlVXNlckluZm8oCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRUYXJnZXRDb250ZXh0KCkuZ2V0UGFja2FnZU5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFByb2Nlc3MubXlQaWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFByb2Nlc3MubXlVaWQoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0pOwogICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewpAQCAtMTkxLDYgKzIwMCwyNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgdGVzdEdldEJyb3dzZXJJbmZvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7CisgICAgICAgICAgICAvLyBTdHViTWVkaWFCcm93c2VyU2VydmljZSBzdG9yZXMgdGhlIGJyb3dzZXIgaW5mbyBpbiBpdHMgb25HZXRSb290KCkuCisgICAgICAgICAgICBhc3NlcnRUcnVlKGNvbXBhcmVSZW1vdGVVc2VySW5mbyhtQnJvd3NlckluZm8sIFN0dWJNZWRpYUJyb3dzZXJTZXJ2aWNlLnNCcm93c2VySW5mbykpOworCisgICAgICAgICAgICBTdHViTWVkaWFCcm93c2VyU2VydmljZS5jbGVhckJyb3dzZXJJbmZvKCk7CisgICAgICAgICAgICBtTWVkaWFCcm93c2VyLnN1YnNjcmliZShTdHViTWVkaWFCcm93c2VyU2VydmljZS5NRURJQV9JRF9ST09ULCBtU3Vic2NyaXB0aW9uQ2FsbGJhY2spOworICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoVElNRV9PVVRfTVMpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtT25DaGlsZHJlbkxvYWRlZCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGNvbXBhcmVSZW1vdGVVc2VySW5mbyhtQnJvd3NlckluZm8sIFN0dWJNZWRpYUJyb3dzZXJTZXJ2aWNlLnNCcm93c2VySW5mbykpOworCisgICAgICAgICAgICBTdHViTWVkaWFCcm93c2VyU2VydmljZS5jbGVhckJyb3dzZXJJbmZvKCk7CisgICAgICAgICAgICBtTWVkaWFCcm93c2VyLmdldEl0ZW0oU3R1Yk1lZGlhQnJvd3NlclNlcnZpY2UuTUVESUFfSURfQ0hJTERSRU5bMF0sIG1JdGVtQ2FsbGJhY2spOworICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoVElNRV9PVVRfTVMpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtT25JdGVtTG9hZGVkKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoY29tcGFyZVJlbW90ZVVzZXJJbmZvKG1Ccm93c2VySW5mbywgU3R1Yk1lZGlhQnJvd3NlclNlcnZpY2Uuc0Jyb3dzZXJJbmZvKSk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCB0ZXN0QnJvd3NlclJvb3QoKSB7CiAgICAgICAgIGZpbmFsIFN0cmluZyBpZCA9ICJ0ZXN0LWlkIjsKICAgICAgICAgZmluYWwgU3RyaW5nIGtleSA9ICJ0ZXN0LWtleSI7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvTWVkaWFCcm93c2VyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL01lZGlhQnJvd3NlclRlc3QuamF2YQppbmRleCBmZDhjM2IxLi5jNDAxYzc1IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvTWVkaWFCcm93c2VyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9NZWRpYUJyb3dzZXJUZXN0LmphdmEKQEAgLTMwMCw2ICszMDAsMjQgQEAKICAgICAgICAgICAgICAgICBtU3Vic2NyaXB0aW9uQ2FsbGJhY2subUxhc3RPcHRpb25zLmdldEludChNZWRpYUJyb3dzZXIuRVhUUkFfUEFHRV9TSVpFKSk7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgdGVzdFN1YnNjcmlwdGlvbkNhbGxiYWNrTm90Q2FsbGVkQWZ0ZXJEaXNjb25uZWN0KCkgeworICAgICAgICBjcmVhdGVNZWRpYUJyb3dzZXIoVEVTVF9CUk9XU0VSX1NFUlZJQ0UpOworICAgICAgICBjb25uZWN0TWVkaWFCcm93c2VyU2VydmljZSgpOworICAgICAgICBtTWVkaWFCcm93c2VyLnN1YnNjcmliZShTdHViTWVkaWFCcm93c2VyU2VydmljZS5NRURJQV9JRF9ST09ULCBtU3Vic2NyaXB0aW9uQ2FsbGJhY2spOworICAgICAgICBtTWVkaWFCcm93c2VyLmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgcmVzZXRDYWxsYmFja3MoKTsKKyAgICAgICAgU3R1Yk1lZGlhQnJvd3NlclNlcnZpY2Uuc0luc3RhbmNlLm5vdGlmeUNoaWxkcmVuQ2hhbmdlZCgKKyAgICAgICAgICAgICAgICBTdHViTWVkaWFCcm93c2VyU2VydmljZS5NRURJQV9JRF9ST09UKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTTEVFUF9NUyk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgSW50ZXJydXB0ZWRFeGNlcHRpb24gb2NjdXJyZWQuIik7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1TdWJzY3JpcHRpb25DYWxsYmFjay5tQ2hpbGRyZW5Mb2FkZWRDb3VudCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtU3Vic2NyaXB0aW9uQ2FsbGJhY2subUNoaWxkcmVuTG9hZGVkV2l0aE9wdGlvbkNvdW50KTsKKyAgICAgICAgYXNzZXJ0TnVsbChtU3Vic2NyaXB0aW9uQ2FsbGJhY2subUxhc3RQYXJlbnRJZCk7CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgdGVzdFVuc3Vic2NyaWJlRm9yTXVsdGlwbGVTdWJzY3JpcHRpb25zKCkgewogICAgICAgICBjcmVhdGVNZWRpYUJyb3dzZXIoVEVTVF9CUk9XU0VSX1NFUlZJQ0UpOwogICAgICAgICBjb25uZWN0TWVkaWFCcm93c2VyU2VydmljZSgpOwpAQCAtNDM2LDYgKzQ1NCwyMSBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoU3R1Yk1lZGlhQnJvd3NlclNlcnZpY2UuTUVESUFfSURfSU5WQUxJRCwgbUl0ZW1DYWxsYmFjay5tTGFzdEVycm9ySWQpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHRlc3RJdGVtQ2FsbGJhY2tOb3RDYWxsZWRBZnRlckRpc2Nvbm5lY3QoKSB7CisgICAgICAgIGNyZWF0ZU1lZGlhQnJvd3NlcihURVNUX0JST1dTRVJfU0VSVklDRSk7CisgICAgICAgIGNvbm5lY3RNZWRpYUJyb3dzZXJTZXJ2aWNlKCk7CisgICAgICAgIG1NZWRpYUJyb3dzZXIuZ2V0SXRlbShTdHViTWVkaWFCcm93c2VyU2VydmljZS5NRURJQV9JRF9DSElMRFJFTlswXSwgbUl0ZW1DYWxsYmFjayk7CisgICAgICAgIG1NZWRpYUJyb3dzZXIuZGlzY29ubmVjdCgpOworICAgICAgICByZXNldENhbGxiYWNrcygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNMRUVQX01TKTsKKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBvY2N1cnJlZC4iKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnROdWxsKG1JdGVtQ2FsbGJhY2subUxhc3RNZWRpYUl0ZW0pOworICAgICAgICBhc3NlcnROdWxsKG1JdGVtQ2FsbGJhY2subUxhc3RFcnJvcklkKTsKKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgY3JlYXRlTWVkaWFCcm93c2VyKGZpbmFsIENvbXBvbmVudE5hbWUgY29tcG9uZW50KSB7CiAgICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpLnJ1bk9uTWFpblN5bmMobmV3IFJ1bm5hYmxlKCkgewogICAgICAgICAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvTWVkaWFDYXNUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvTWVkaWFDYXNUZXN0LmphdmEKaW5kZXggZjNhYWFhYi4uZjI4NjEzYSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL01lZGlhQ2FzVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9NZWRpYUNhc1Rlc3QuamF2YQpAQCAtMTYsOSArMTYsOSBAQAogCiBwYWNrYWdlIGFuZHJvaWQubWVkaWEuY3RzOwogCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ2FzOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDYXMuUGx1Z2luRGVzY3JpcHRvcjsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ2FzLlNlc3Npb247CkBAIC0yOSwxMiArMjksMTIgQEAKIGltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRGVzY3JhbWJsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlclRocmVhZDsKLWltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKIGltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUmVxdWlyZXNEZXZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKKwogaW1wb3J0IGphdmEubGFuZy5BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwpAQCAtMTQ1LDExICsxNDUsNiBAQAogICAgICAgICAgICAgIjY1IDc5IDY5IDZlIDc0IDVmIDZkIDY5ICA2ZSAzZCAzMiAzNSAyMCA3MyA2MyA2NSIgKwogICAgICAgICAgICAgIjZlIDY1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgOwogCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGV4dChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgc3VwZXIuc2V0Q29udGV4dChjb250ZXh0KTsKLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBUZXN0IHRoYXQgYWxsIGVudW1lcmF0ZWQgQ0Egc3lzdGVtcyBjYW4gYmUgaW5zdGFudGlhdGVkLgogICAgICAqCkBAIC0xNTksMTEgKzE1NCwxMCBAQAogICAgICAqIGJlIGluc3RhbnRpYXRlZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB0ZXN0RW51bWVyYXRlUGx1Z2lucygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoaXNMb3dSYW0oKSAmJiAhaXNUVigpKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJTa2lwcGluZyB0ZXN0RW51bWVyYXRlUGx1Z2lucy4iKTsKLSAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKGlzTG93UmFtKCkgJiYgIWlzVFYoKSl7CisgICAgICAgICAgIExvZy5kKFRBRywgIlNraXBwaW5nIHRlc3RFbnVtZXRhZVBsdWdpbnMuIik7CisgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotCiAgICAgICAgIFBsdWdpbkRlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IE1lZGlhQ2FzLmVudW1lcmF0ZVBsdWdpbnMoKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgTG9nLmQoVEFHLCAiZGVzY2lwdG9yWyIgKyBpICsgIl06IGlkPSIgKyBkZXNjcmlwdG9yc1tpXS5nZXRTeXN0ZW1JZCgpCkBAIC0yMDYsMTEgKzIwMCwxMCBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkU3lzdGVtSWRGYWlscygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoaXNMb3dSYW0oKSAmJiAhaXNUVigpKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJTa2lwcGluZyB0ZXN0SW52YWxpZFN5c3RlbUlkRmFpbHMuIik7Ci0gICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChpc0xvd1JhbSgpICYmICFpc1RWKCkpeworICAgICAgICAgICBMb2cuZChUQUcsICJTa2lwcGluZyB0ZXN0SW52YWxpZFN5c3RlbUlkRmFpbHMuIik7CisgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotCiAgICAgICAgIGFzc2VydEZhbHNlKCJJbnZhbGlkIGlkICIgKyBzSW52YWxpZFN5c3RlbUlkICsgIiBzaG91bGQgbm90IGJlIHN1cHBvcnRlZCIsCiAgICAgICAgICAgICAgICAgTWVkaWFDYXMuaXNTeXN0ZW1JZFN1cHBvcnRlZChzSW52YWxpZFN5c3RlbUlkKSk7CiAKQEAgLTI0MiwxMiArMjM1LDEwIEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdENsZWFyS2V5UGx1Z2luSW5zdGFsbGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChpc0xvd1JhbSgpICYmICFpc1RWKCkpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIlNraXBwaW5nIHRlc3RDbGVhcktleVBsdWdpbkluc3RhbGxlZC4iKTsKLSAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKGlzTG93UmFtKCkgJiYgIWlzVFYoKSl7CisgICAgICAgICAgIExvZy5kKFRBRywgIlNraXBwaW5nIHRlc3RDbGVhcktleVBsdWdpbkluc3RhbGxlZC4iKTsKKyAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0KLQogICAgICAgICBQbHVnaW5EZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSBNZWRpYUNhcy5lbnVtZXJhdGVQbHVnaW5zKCk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yc1tpXS5nZXRTeXN0ZW1JZCgpID09IHNDbGVhcktleVN5c3RlbUlkKSB7CkBAIC0yNjEsMTEgKzI1MiwxMCBAQAogICAgICAqIFRlc3QgdGhhdCB2YWxpZCBjYWxsIHNlcXVlbmNlcyBzdWNjZWVkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHRlc3RDbGVhcktleUFwaXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGlzTG93UmFtKCkgJiYgIWlzVFYoKSkgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiU2tpcHBpbmcgdGVzdENsZWFyS2V5QXBpcy4iKTsKLSAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKGlzTG93UmFtKCkgJiYgIWlzVFYoKSl7CisgICAgICAgICAgIExvZy5kKFRBRywgIlNraXBwaW5nIHRlc3RDbGVhcktleUFwaXMuIik7CisgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotCiAgICAgICAgIE1lZGlhQ2FzIG1lZGlhQ2FzID0gbnVsbDsKICAgICAgICAgTWVkaWFEZXNjcmFtYmxlciBkZXNjcmFtYmxlciA9IG51bGw7CiAKQEAgLTM0NSwxMiArMzM1LDEwIEBACiAgICAgICogVGVzdCB0aGF0IGFsbCBzZXNzaW9ucyBhcmUgY2xvc2VkIGFmdGVyIGEgTWVkaWFDYXMgb2JqZWN0IGlzIHJlbGVhc2VkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHRlc3RDbGVhcktleVNlc3Npb25DbG9zZWRBZnRlclJlbGVhc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGlzTG93UmFtKCkgJiYgIWlzVFYoKSkgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiU2tpcHBpbmcgdGVzdENsZWFyS2V5U2Vzc2lvbkNsb3NlZEFmdGVyUmVsZWFzZS4iKTsKLSAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKGlzTG93UmFtKCkgJiYgIWlzVFYoKSl7CisgICAgICAgICAgIExvZy5kKFRBRywgIlNraXBwaW5nIHRlc3RDbGVhcktleVNlc3Npb25DbG9zZWRBZnRlclJlbGVhc2UuIik7CisgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotCi0KICAgICAgICAgTWVkaWFDYXMgbWVkaWFDYXMgPSBudWxsOwogICAgICAgICBNZWRpYURlc2NyYW1ibGVyIGRlc2NyYW1ibGVyID0gbnVsbDsKIApAQCAtNDAwLDExICszODgsMTAgQEAKICAgICAgKiBUZXN0IHRoYXQgaW52YWxpZCBjYWxsIHNlcXVlbmNlcyBmYWlsIHdpdGggZXhwZWN0ZWQgZXhjZXB0aW9ucy4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJLZXlFeGNlcHRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChpc0xvd1JhbSgpICYmICFpc1RWKCkpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIlNraXBwaW5nIHRlc3RDbGVhcktleUV4Y2VwdGlvbnMuIik7Ci0gICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChpc0xvd1JhbSgpICYmICFpc1RWKCkpeworICAgICAgICAgICBMb2cuZChUQUcsICJTa2lwcGluZyB0ZXN0Q2xlYXJLZXlFeGNlcHRpb25zLiIpOworICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLQogICAgICAgICBNZWRpYUNhcyBtZWRpYUNhcyA9IG51bGw7CiAgICAgICAgIE1lZGlhRGVzY3JhbWJsZXIgZGVzY3JhbWJsZXIgPSBudWxsOwogCkBAIC02MDMsMTIgKzU5MCwxMSBAQAogICAgIH0KIAogICAgIHByaXZhdGUgYm9vbGVhbiBpc1RWKCkgewotICAgICAgICByZXR1cm4gZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VNYW5hZ2VyKCkuaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX0xFQU5CQUNLX09OTFkpOworICAgICAgICByZXR1cm4gbUNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKS5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfTEVBTkJBQ0tfT05MWSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBib29sZWFuIGlzTG93UmFtKCkgewogICAgICAgICBBY3Rpdml0eU1hbmFnZXIgYW0gPSAoQWN0aXZpdHlNYW5hZ2VyKSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQUNUSVZJVFlfU0VSVklDRSk7CiAgICAgICAgIHJldHVybiBhbS5pc0xvd1JhbURldmljZSgpOwogICAgIH0KLQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL01lZGlhQ29kZWNDYXBhYmlsaXRpZXNUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvTWVkaWFDb2RlY0NhcGFiaWxpdGllc1Rlc3QuamF2YQppbmRleCAzOTdkNmYxLi5jYzVkZWZlIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvTWVkaWFDb2RlY0NhcGFiaWxpdGllc1Rlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvTWVkaWFDb2RlY0NhcGFiaWxpdGllc1Rlc3QuamF2YQpAQCAtMzMsNiArMzMsNyBAQAogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLk1lZGlhRm9ybWF0Lk1JTUVUWVBFX1ZJREVPX1ZQOTsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyOwogaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkFwaUxldmVsVXRpbDsKQEAgLTQ4LDYgKzQ5LDcgQEAKIC8qKgogICogQmFzaWMgc2FuaXR5IHRlc3Qgb2YgZGF0YSByZXR1cm5lZCBieSBNZWRpYUNvZGVDYXBhYmlsaXRpZXMuCiAgKi8KK0BBcHBNb2RlRnVsbChyZWFzb24gPSAiRHluYW1pYyBjb25maWcgZGlzYWJsZWQuIikKIHB1YmxpYyBjbGFzcyBNZWRpYUNvZGVjQ2FwYWJpbGl0aWVzVGVzdCBleHRlbmRzIE1lZGlhUGxheWVyVGVzdEJhc2UgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYUNvZGVjQ2FwYWJpbGl0aWVzVGVzdCI7CkBAIC00OTAsNiArNDkyLDg5IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIE1lZGlhRm9ybWF0IGNyZWF0ZVZpZGVvRm9ybWF0Rm9yQml0cmF0ZU1vZGUoU3RyaW5nIG1pbWUsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgIGludCBiaXRyYXRlTW9kZSwgQ29kZWNDYXBhYmlsaXRpZXMgY2FwcykgeworICAgICAgICBNZWRpYUNvZGVjSW5mby5FbmNvZGVyQ2FwYWJpbGl0aWVzIGVuY29kZXJDYXBzID0gY2Fwcy5nZXRFbmNvZGVyQ2FwYWJpbGl0aWVzKCk7CisgICAgICAgIGlmICghZW5jb2RlckNhcHMuaXNCaXRyYXRlTW9kZVN1cHBvcnRlZChiaXRyYXRlTW9kZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgVmlkZW9DYXBhYmlsaXRpZXMgdmlkQ2FwcyA9IGNhcHMuZ2V0VmlkZW9DYXBhYmlsaXRpZXMoKTsKKyAgICAgICAgTWVkaWFGb3JtYXQgZm9ybWF0ID0gTWVkaWFGb3JtYXQuY3JlYXRlVmlkZW9Gb3JtYXQobWltZSwgd2lkdGgsIGhlaWdodCk7CisKKyAgICAgICAgLy8gYml0cmF0ZQorICAgICAgICBpbnQgbWF4V2lkdGggPSB2aWRDYXBzLmdldFN1cHBvcnRlZFdpZHRocygpLmdldFVwcGVyKCk7CisgICAgICAgIGludCBtYXhIZWlnaHQgPSB2aWRDYXBzLmdldFN1cHBvcnRlZEhlaWdodHNGb3Iod2lkdGgpLmdldFVwcGVyKCk7CisgICAgICAgIGludCBtYXhSYXRlID0gdmlkQ2Fwcy5nZXRTdXBwb3J0ZWRGcmFtZVJhdGVzRm9yKHdpZHRoLCBoZWlnaHQpLmdldFVwcGVyKCkuaW50VmFsdWUoKTsKKyAgICAgICAgZm9ybWF0LnNldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0JJVFJBVEVfTU9ERSwgYml0cmF0ZU1vZGUpOworICAgICAgICBpZiAoYml0cmF0ZU1vZGUgPT0gTWVkaWFDb2RlY0luZm8uRW5jb2RlckNhcGFiaWxpdGllcy5CSVRSQVRFX01PREVfQ1EpIHsKKyAgICAgICAgICAgIGludCBxdWFsaXR5ID0gZW5jb2RlckNhcHMuZ2V0UXVhbGl0eVJhbmdlKCkuZ2V0TG93ZXIoKTsKKyAgICAgICAgICAgIExvZy5pKFRBRywgInJlYXNvbmFibGUgcXVhbGl0eSBmb3IgIiArIHdpZHRoICsgIngiICsgaGVpZ2h0ICsgIkAiICsgbWF4UmF0ZQorICAgICAgICAgICAgICAgICAgICArICIgIiArIG1pbWUgKyAiID0gIiArIHF1YWxpdHkpOworICAgICAgICAgICAgZm9ybWF0LnNldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX1FVQUxJVFksIHF1YWxpdHkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IGJpdHJhdGUgPSB2aWRDYXBzLmdldEJpdHJhdGVSYW5nZSgpLmNsYW1wKAorICAgICAgICAgICAgICAgICAgICAoaW50KSh2aWRDYXBzLmdldEJpdHJhdGVSYW5nZSgpLmdldFVwcGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIE1hdGguc3FydCgoZG91YmxlKW1heFdpZHRoICogbWF4SGVpZ2h0IC8gd2lkdGggLyBoZWlnaHQpKSk7CisgICAgICAgICAgICBMb2cuaShUQUcsICJyZWFzb25hYmxlIGJpdHJhdGUgZm9yICIgKyB3aWR0aCArICJ4IiArIGhlaWdodCArICJAIiArIG1heFJhdGUKKyAgICAgICAgICAgICAgICAgICAgKyAiICIgKyBtaW1lICsgIiA9ICIgKyBiaXRyYXRlICsgIiBtb2RlICIgKyBiaXRyYXRlTW9kZSk7CisgICAgICAgICAgICBmb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfQklUX1JBVEUsIGJpdHJhdGUpOworICAgICAgICB9CisgICAgICAgIGZvcm1hdC5zZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9GUkFNRV9SQVRFLCBtYXhSYXRlKTsKKyAgICAgICAgZm9ybWF0LnNldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0lfRlJBTUVfSU5URVJWQUwsIElGUkFNRV9JTlRFUlZBTCk7CisgICAgICAgIGZvcm1hdC5zZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9DT0xPUl9GT1JNQVQsCisgICAgICAgICAgICAgICAgQ29kZWNDYXBhYmlsaXRpZXMuQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGUpOworCisgICAgICAgIHJldHVybiBmb3JtYXQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFsbEFkdmVydGlzZWRWaWRlb0VuY29kZXJCaXRyYXRlTW9kZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBib29sZWFuIHNraXBwZWQgPSB0cnVlOworICAgICAgICBmaW5hbCBpbnRbXSBtb2RlcyA9IHsKKyAgICAgICAgICAgICAgICBNZWRpYUNvZGVjSW5mby5FbmNvZGVyQ2FwYWJpbGl0aWVzLkJJVFJBVEVfTU9ERV9DUSwKKyAgICAgICAgICAgICAgICBNZWRpYUNvZGVjSW5mby5FbmNvZGVyQ2FwYWJpbGl0aWVzLkJJVFJBVEVfTU9ERV9WQlIsCisgICAgICAgICAgICAgICAgTWVkaWFDb2RlY0luZm8uRW5jb2RlckNhcGFiaWxpdGllcy5CSVRSQVRFX01PREVfQ0JSCisgICAgICAgIH07CisgICAgICAgIGZvciAoTWVkaWFDb2RlY0luZm8gaW5mbyA6IG1BbGxJbmZvcykgeworICAgICAgICAgICAgaWYgKCFpbmZvLmlzRW5jb2RlcigpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIG1pbWU6IGluZm8uZ2V0U3VwcG9ydGVkVHlwZXMoKSkgeworICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNWaWRlbyA9IGlzVmlkZW9NaW1lKG1pbWUpOworICAgICAgICAgICAgICAgIGlmICghaXNWaWRlbykgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2tpcHBlZCA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgaW50IG51bVN1cHBvcnRlZE1vZGVzID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBtb2RlIDogbW9kZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgTWVkaWFGb3JtYXQgZm9ybWF0ID0gY3JlYXRlVmlkZW9Gb3JtYXRGb3JCaXRyYXRlTW9kZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW1lLCAxNzYsIDE0NCwgbW9kZSwgaW5mby5nZXRDYXBhYmlsaXRpZXNGb3JUeXBlKG1pbWUpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1hdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBNZWRpYUNvZGVjIGNvZGVjID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjID0gTWVkaWFDb2RlYy5jcmVhdGVCeUNvZGVjTmFtZShpbmZvLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2RlYy5jb25maWd1cmUoZm9ybWF0LCBudWxsIC8qIHN1cmZhY2UgKi8sIG51bGwgLyogY3J5cHRvICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYUNvZGVjLkNPTkZJR1VSRV9GTEFHX0VOQ09ERSk7CisgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZWMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjLnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBudW1TdXBwb3J0ZWRNb2RlcysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGluZm8uZ2V0TmFtZSgpICsgIiBoYXMgbm8gc3VwcG9ydGVkIGJpdHJhdGUgbW9kZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBudW1TdXBwb3J0ZWRNb2RlcyA+IDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChza2lwcGVkKSB7CisgICAgICAgICAgICBNZWRpYVV0aWxzLnNraXBUZXN0KCJubyB2aWRlbyBlbmNvZGVycyBmb3VuZCIpOworICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgdGVzdEFsbE5vblR1bm5lbGVkVmlkZW9Db2RlY3NTdXBwb3J0RmxleGlibGVZVVYoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBib29sZWFuIHNraXBwZWQgPSB0cnVlOwogICAgICAgICBmb3IgKE1lZGlhQ29kZWNJbmZvIGluZm8gOiBtQWxsSW5mb3MpIHsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9NZWRpYUNvZGVjTGlzdFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9NZWRpYUNvZGVjTGlzdFRlc3QuamF2YQppbmRleCA5ODdkMzY1Li4zMTFjNzkxIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvTWVkaWFDb2RlY0xpc3RUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL01lZGlhQ29kZWNMaXN0VGVzdC5qYXZhCkBAIC0xOSwxNiArMTksMTggQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvZGVjOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb2RlY0luZm87Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvZGVjSW5mby5Db2RlY1Byb2ZpbGVMZXZlbDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29kZWNJbmZvLkNvZGVjQ2FwYWJpbGl0aWVzOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb2RlY0luZm8uQXVkaW9DYXBhYmlsaXRpZXM7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvZGVjSW5mby5WaWRlb0NhcGFiaWxpdGllczsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29kZWNJbmZvLkNvZGVjQ2FwYWJpbGl0aWVzOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb2RlY0luZm8uRW5jb2RlckNhcGFiaWxpdGllczsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29kZWNJbmZvLlZpZGVvQ2FwYWJpbGl0aWVzOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb2RlY0xpc3Q7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUZvcm1hdDsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUmVxdWlyZXNEZXZpY2U7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKKwogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CkBAIC0zNiw2ICszOCw4IEBACiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIAorQFNtYWxsVGVzdAorQFJlcXVpcmVzRGV2aWNlCiBwdWJsaWMgY2xhc3MgTWVkaWFDb2RlY0xpc3RUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFDb2RlY0xpc3RUZXN0IjsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9NZWRpYUNvZGVjVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL01lZGlhQ29kZWNUZXN0LmphdmEKaW5kZXggNjEyOThlOC4uZjMwZTBjOSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL01lZGlhQ29kZWNUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL01lZGlhQ29kZWNUZXN0LmphdmEKQEAgLTE2LDM1ICsxNiwzOCBAQAogCiBwYWNrYWdlIGFuZHJvaWQubWVkaWEuY3RzOwogCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS5jdHMuUjsKLQogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRGaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29kZWM7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvZGVjLkJ1ZmZlckluZm87CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvZGVjLkNvZGVjRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb2RlYy5DcnlwdG9JbmZvOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb2RlYy5DcnlwdG9JbmZvLlBhdHRlcm47CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvZGVjSW5mbzsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29kZWNJbmZvLkNvZGVjQ2FwYWJpbGl0aWVzOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb2RlY0luZm8uQ29kZWNQcm9maWxlTGV2ZWw7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvZGVjTGlzdDsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ3J5cHRvOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFEcm07CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUV4dHJhY3RvcjsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRm9ybWF0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb2RlY0luZm8uQ29kZWNDYXBhYmlsaXRpZXM7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvZGVjSW5mby5Db2RlY1Byb2ZpbGVMZXZlbDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmN0cy5SOwogaW1wb3J0IGFuZHJvaWQub3BlbmdsLkdMRVMyMDsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOwogaW1wb3J0IGFuZHJvaWQub3MuUGVyc2lzdGFibGVCdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CiBpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlJlcXVpcmVzRGV2aWNlOwogaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZTsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CisKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLk1lZGlhVXRpbHM7CiAKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKQEAgLTk3Niw2ICs5NzksOSBAQAogICAgICAgICAgICAgLy8gcmUtY29uZmlndXJlLCB0aGlzIHRpbWUgd2l0aG91dCBhbiBpbnB1dCBzdXJmYWNlCiAgICAgICAgICAgICBpZiAoVkVSQk9TRSkgTG9nLmQoVEFHLCAicmVjb25maWd1cmluZyIpOwogICAgICAgICAgICAgZW5jb2Rlci5zdG9wKCk7CisgICAgICAgICAgICAvLyBVc2Ugbm9uLW9wYXF1ZSBjb2xvciBmb3JtYXQgZm9yIGJ5dGUgYnVmZmVyIG1vZGUuCisgICAgICAgICAgICBmb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfQ09MT1JfRk9STUFULAorICAgICAgICAgICAgICAgICAgICBNZWRpYUNvZGVjSW5mby5Db2RlY0NhcGFiaWxpdGllcy5DT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZSk7CiAgICAgICAgICAgICBlbmNvZGVyLmNvbmZpZ3VyZShmb3JtYXQsIG51bGwsIG51bGwsIE1lZGlhQ29kZWMuQ09ORklHVVJFX0ZMQUdfRU5DT0RFKTsKICAgICAgICAgICAgIGVuY29kZXIuc3RhcnQoKTsKICAgICAgICAgICAgIGlmIChWRVJCT1NFKSBMb2cuZChUQUcsICJyZWNvbmZpZ3VyZWQiKTsKQEAgLTE4MDEsNCArMTgwNywyNTcgQEAKICAgICAgICAgICAgIGRybS5jbG9zZVNlc3Npb24oc2Vzc2lvbklkKTsKICAgICAgICAgfQogICAgIH0KKworICAgIGFic3RyYWN0IGNsYXNzIEJ5dGVCdWZmZXJTdHJlYW0geworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgQnl0ZUJ1ZmZlciByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uOworICAgIH0KKworICAgIGNsYXNzIE1lZGlhQ29kZWNTdHJlYW0gZXh0ZW5kcyBCeXRlQnVmZmVyU3RyZWFtIHsKKyAgICAgICAgcHJpdmF0ZSBCeXRlQnVmZmVyU3RyZWFtIG1CdWZmZXJJbnB1dFN0cmVhbTsKKyAgICAgICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBtSW5wdXRTdHJlYW07CisgICAgICAgIHByaXZhdGUgTWVkaWFDb2RlYyBtQ29kZWM7CisgICAgICAgIEJ1ZmZlckluZm8gbUluZm8gPSBuZXcgQnVmZmVySW5mbygpOworICAgICAgICBib29sZWFuIG1TYXdPdXRwdXRFT1M7CisgICAgICAgIGJvb2xlYW4gbVNhd0lucHV0RU9TOworICAgICAgICBib29sZWFuIG1FbmNvZGU7CisgICAgICAgIGJvb2xlYW4gbVNlbnRDb25maWc7CisKKyAgICAgICAgLy8gcmVzdWx0IHN0cmVhbQorICAgICAgICBwcml2YXRlIGJ5dGVbXSBtQnVmID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBieXRlW10gbUNhY2hlID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbUJ1ZkluID0gMDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbUJ1Zk91dCA9IDA7CisgICAgICAgIHByaXZhdGUgaW50IG1CdWZDb3VudGVyID0gMDsKKworICAgICAgICAvLyBoZWxwZXIgZm9yIGJ5dGV3aXNlIHJlYWQoKQorICAgICAgICBwcml2YXRlIGJ5dGVbXSBtT25lQnl0ZSA9IG5ldyBieXRlWzFdOworCisgICAgICAgIHByaXZhdGUgTWVkaWFDb2RlY1N0cmVhbSgKKyAgICAgICAgICAgICAgICBNZWRpYUZvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgYm9vbGVhbiBlbmNvZGUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgU3RyaW5nIG1pbWUgPSBmb3JtYXQuZ2V0U3RyaW5nKE1lZGlhRm9ybWF0LktFWV9NSU1FKTsKKyAgICAgICAgICAgIG1FbmNvZGUgPSBlbmNvZGU7CisgICAgICAgICAgICBpZiAobUVuY29kZSkgeworICAgICAgICAgICAgICAgIG1Db2RlYyA9IE1lZGlhQ29kZWMuY3JlYXRlRW5jb2RlckJ5VHlwZShtaW1lKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUNvZGVjID0gTWVkaWFDb2RlYy5jcmVhdGVEZWNvZGVyQnlUeXBlKG1pbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNvZGVjLmNvbmZpZ3VyZShmb3JtYXQsbnVsbCwgbnVsbCwgZW5jb2RlID8gTWVkaWFDb2RlYy5DT05GSUdVUkVfRkxBR19FTkNPREUgOiAwKTsKKyAgICAgICAgICAgIG1Db2RlYy5zdGFydCgpOworICAgICAgICB9CisKKyAgICAgICAgTWVkaWFDb2RlY1N0cmVhbSgKKyAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dCwKKyAgICAgICAgICAgICAgICBNZWRpYUZvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgYm9vbGVhbiBlbmNvZGUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgdGhpcyhmb3JtYXQsIGVuY29kZSk7CisgICAgICAgICAgICBtSW5wdXRTdHJlYW0gPSBpbnB1dDsKKyAgICAgICAgfQorCisgICAgICAgIE1lZGlhQ29kZWNTdHJlYW0oCisgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlclN0cmVhbSBpbnB1dCwKKyAgICAgICAgICAgICAgICBNZWRpYUZvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgYm9vbGVhbiBlbmNvZGUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgdGhpcyhmb3JtYXQsIGVuY29kZSk7CisgICAgICAgICAgICBtQnVmZmVySW5wdXRTdHJlYW0gPSBpbnB1dDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgICAgICBpZiAobVNhd091dHB1dEVPUykgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBmaXJzdCBwdXNoIGFzIG11Y2ggZGF0YSBpbnRvIHRoZSBjb2RlYyBhcyBwb3NzaWJsZQorICAgICAgICAgICAgd2hpbGUgKCFtU2F3SW5wdXRFT1MpIHsKKyAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJzZW5kaW5nIGRhdGEgdG8gIiArIG1Db2RlYy5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIGludCBpbmRleCA9IG1Db2RlYy5kZXF1ZXVlSW5wdXRCdWZmZXIoNTAwMCk7CisgICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBubyBpbnB1dCBidWZmZXIgY3VycmVudGx5IGF2YWlsYWJsZQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIGJ1ZiA9IG1Db2RlYy5nZXRJbnB1dEJ1ZmZlcihpbmRleCk7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICBpbnQgaW5CdWZMZW4gPSBidWYubGltaXQoKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IG51bVJlYWQgPSAwOworCisgICAgICAgICAgICAgICAgICAgIGlmIChtQnVmZmVySW5wdXRTdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBpbiA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gPSBtQnVmZmVySW5wdXRTdHJlYW0ucmVhZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoaW4gIT0gbnVsbCAmJiBpbi5saW1pdCgpID09IDApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2F3SW5wdXRFT1MgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbiA9IGluLmxpbWl0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtUmVhZCArPSBuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5wdXQoaW4pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1JbnB1dFN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUJ1ZiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ1ZiA9IG5ldyBieXRlW2luQnVmTGVuXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobnVtUmVhZCA9IDA7IG51bVJlYWQgPCBpbkJ1ZkxlbjsgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG4gPSBtSW5wdXRTdHJlYW0ucmVhZChtQnVmLCBudW1SZWFkLCBpbkJ1ZkxlbiAtIG51bVJlYWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TYXdJbnB1dEVPUyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1SZWFkICs9IG47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBidWYucHV0KG1CdWYsIDAsIG51bVJlYWQpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbCgibm8gaW5wdXQiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGludCBmbGFncyA9IG1TYXdJbnB1dEVPUyA/IE1lZGlhQ29kZWMuQlVGRkVSX0ZMQUdfRU5EX09GX1NUUkVBTSA6IDA7CisgICAgICAgICAgICAgICAgICAgIGlmICghbUVuY29kZSAmJiAhbVNlbnRDb25maWcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzIHw9IE1lZGlhQ29kZWMuQlVGRkVSX0ZMQUdfQ09ERUNfQ09ORklHOworICAgICAgICAgICAgICAgICAgICAgICAgbVNlbnRDb25maWcgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgInF1ZXVpbmcgaW5wdXQgYnVmZmVyICIgKyBpbmRleCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgc2l6ZSAiICsgbnVtUmVhZCArICIsIGZsYWdzOiAiICsgZmxhZ3MgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgb24gIiArIG1Db2RlYy5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBtQ29kZWMucXVldWVJbnB1dEJ1ZmZlcihpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIG9mZnNldCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1SZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogcHJlc2VudGF0aW9uVGltZVVzICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAicXVldWVkIGlucHV0IGJ1ZmZlciAiICsgaW5kZXggKyAiLCBzaXplICIgKyBudW1SZWFkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIG5vdyByZWFkIGRhdGEgZnJvbSB0aGUgY29kZWMKKyAgICAgICAgICAgIExvZy5pKFRBRywgInJlYWRpbmcgZnJvbSAiICsgbUNvZGVjLmdldE5hbWUoKSk7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBtQ29kZWMuZGVxdWV1ZU91dHB1dEJ1ZmZlcihtSW5mbywgNTAwMCk7CisgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgIExvZy5pKFRBRywgImdvdCAiICsgbUluZm8uc2l6ZSArICIgYnl0ZXMgZnJvbSAiICsgbUNvZGVjLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBvdXQgPSBtQ29kZWMuZ2V0T3V0cHV0QnVmZmVyKGluZGV4KTsKKyAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIHJldCA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUobUluZm8uc2l6ZSk7CisgICAgICAgICAgICAgICAgcmV0LnB1dChvdXQpOworICAgICAgICAgICAgICAgIG1Db2RlYy5yZWxlYXNlT3V0cHV0QnVmZmVyKGluZGV4LCAgZmFsc2UgLyogcmVuZGVyICovKTsKKyAgICAgICAgICAgICAgICBpZiAoKG1JbmZvLmZsYWdzICYgTWVkaWFDb2RlYy5CVUZGRVJfRkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgInNhdyBvdXRwdXQgRU9TIG9uICIgKyBtQ29kZWMuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgbVNhd091dHB1dEVPUyA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldC5mbGlwKCk7IC8vIHByZXBhcmUgYnVmZmVyIGZvciByZWFkaW5nIGZyb20gaXQKKyAgICAgICAgICAgICAgICAvLyBYWFggY2hjayB0aGF0IGZpcnN0IGVuY29kZWQgYnVmZmVyIGhhcyBDU0QgZmxhZ3Mgc2V0CisgICAgICAgICAgICAgICAgaWYgKG1FbmNvZGUgJiYgbUJ1ZkNvdW50ZXIrKyA9PSAwICYmIChtSW5mby5mbGFncyAmIE1lZGlhQ29kZWMuQlVGRkVSX0ZMQUdfQ09ERUNfQ09ORklHKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGZhaWwoImZpcnN0IGVuY29kZWQgYnVmZmVyIG1pc3NpbmcgQ1NEIGZsYWciKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5kZXggPT0gTWVkaWFDb2RlYy5JTkZPX09VVFBVVF9GT1JNQVRfQ0hBTkdFRCkgeworICAgICAgICAgICAgICAgIExvZy5pKFRBRywgbUNvZGVjLmdldE5hbWUoKSArICIgbmV3IGZvcm1hdDogIiArIG1Db2RlYy5nZXRPdXRwdXRGb3JtYXQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSgwKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKG1JbnB1dFN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1JbnB1dFN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgbUlucHV0U3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiAobUNvZGVjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBtQ29kZWMgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICAgICAgaWYgKG1Db2RlYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiTWVkaWFDb2RlY0lucHV0U3RyZWFtIHdhc24ndCBjbG9zZWQiKTsKKyAgICAgICAgICAgICAgICBtQ29kZWMucmVsZWFzZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIGNsYXNzIEJ5dGVCdWZmZXJJbnB1dFN0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtIHsKKyAgICAgICAgQnl0ZUJ1ZmZlclN0cmVhbSBtSW5wdXQ7CisgICAgICAgIEJ5dGVCdWZmZXIgbUJ1ZmZlcjsKKworICAgICAgICBwdWJsaWMgQnl0ZUJ1ZmZlcklucHV0U3RyZWFtKEJ5dGVCdWZmZXJTdHJlYW0gaW4pIHsKKyAgICAgICAgICAgIG1JbnB1dCA9IGluOworICAgICAgICAgICAgbUJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoMCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHdoaWxlIChtQnVmZmVyICE9IG51bGwgJiYgIW1CdWZmZXIuaGFzUmVtYWluaW5nKCkpIHsKKyAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJyZWFkaW5nIGJ1ZmZlciIpOworICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBtSW5wdXQucmVhZCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobUJ1ZmZlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gKDB4ZmYgJiBtQnVmZmVyLmdldCgpKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIGludCBjb21wYXJlU3RyZWFtcyhJbnB1dFN0cmVhbSB0ZXN0LCBJbnB1dFN0cmVhbSByZWZlcmVuY2UpIHsKKyAgICAgICAgTG9nLmkoVEFHLCAiY29tcGFyZVN0cmVhbXMiKTsKKyAgICAgICAgQnVmZmVyZWRJbnB1dFN0cmVhbSBidWZmZXJlZF90ZXN0ID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0odGVzdCk7CisgICAgICAgIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gYnVmZmVyZWRfcmVmZXJlbmNlID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0ocmVmZXJlbmNlKTsKKyAgICAgICAgaW50IG51bXJlYWQgPSAwOworICAgICAgICB0cnkgeworICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICBpbnQgYjEgPSBidWZmZXJlZF90ZXN0LnJlYWQoKTsKKyAgICAgICAgICAgICAgICBpbnQgYjIgPSBidWZmZXJlZF9yZWZlcmVuY2UucmVhZCgpOworICAgICAgICAgICAgICAgIGlmIChiMSAhPSBiMikgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJzdHJlYW1zIGRpZmZlciBhdCAiICsgbnVtcmVhZCArICI6ICIgKyBiMSArICIvIiArIGIyKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYjEgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAic3RyZWFtcyBlbmRlZCBhdCAiICsgbnVtcmVhZCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBudW1yZWFkKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJyZWFkIGVycm9yIiwgZSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgTG9nLmkoVEFHLCAiY29tcGFyZVN0cmVhbXMgcmVhZCAiICsgbnVtcmVhZCk7CisgICAgICAgIHJldHVybiBudW1yZWFkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGbGFjSWRlbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzb3VyY2VzIHJlcyA9IG1Db250ZXh0LmdldFJlc291cmNlcygpOworICAgICAgICBJbnB1dFN0cmVhbSBwY21TdHJlYW0xID0gcmVzLm9wZW5SYXdSZXNvdXJjZShSLnJhdy5zaW5lc3dlZXByYXcpOworCisgICAgICAgIE1lZGlhRm9ybWF0IGVuY29kZUZvcm1hdCA9IG5ldyBNZWRpYUZvcm1hdCgpOworICAgICAgICBlbmNvZGVGb3JtYXQuc2V0U3RyaW5nKE1lZGlhRm9ybWF0LktFWV9NSU1FLCBNZWRpYUZvcm1hdC5NSU1FVFlQRV9BVURJT19GTEFDKTsKKyAgICAgICAgZW5jb2RlRm9ybWF0LnNldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX1NBTVBMRV9SQVRFLCA0NDEwMCk7CisgICAgICAgIGVuY29kZUZvcm1hdC5zZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9DSEFOTkVMX0NPVU5ULCAyKTsKKyAgICAgICAgZW5jb2RlRm9ybWF0LnNldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0ZMQUNfQ09NUFJFU1NJT05fTEVWRUwsIDUpOworCisgICAgICAgIE1lZGlhRm9ybWF0IGRlY29kZUZvcm1hdCA9IG5ldyBNZWRpYUZvcm1hdCgpOworICAgICAgICBkZWNvZGVGb3JtYXQuc2V0U3RyaW5nKE1lZGlhRm9ybWF0LktFWV9NSU1FLCBNZWRpYUZvcm1hdC5NSU1FVFlQRV9BVURJT19GTEFDKTsKKyAgICAgICAgZGVjb2RlRm9ybWF0LnNldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX1NBTVBMRV9SQVRFLCA0NDEwMCk7CisgICAgICAgIGRlY29kZUZvcm1hdC5zZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9DSEFOTkVMX0NPVU5ULCAyKTsKKworICAgICAgICBNZWRpYUNvZGVjU3RyZWFtIHJhd1RvQW1yID0gbmV3IE1lZGlhQ29kZWNTdHJlYW0ocGNtU3RyZWFtMSwgZW5jb2RlRm9ybWF0LCB0cnVlKTsKKyAgICAgICAgTWVkaWFDb2RlY1N0cmVhbSBhbXJUb1JhdyA9IG5ldyBNZWRpYUNvZGVjU3RyZWFtKHJhd1RvQW1yLCBkZWNvZGVGb3JtYXQsIGZhbHNlKTsKKworICAgICAgICBBc3NldEZpbGVEZXNjcmlwdG9yIG1hc3RlckZkID0gcmVzLm9wZW5SYXdSZXNvdXJjZUZkKFIucmF3LnNpbmVzd2VlcHJhdyk7CisgICAgICAgIGxvbmcgbWFzdGVyTGVuZ3RoID0gbWFzdGVyRmQuZ2V0TGVuZ3RoKCk7CisgICAgICAgIExvZy5pKFRBRywgInNvdXJjZSBsZW5ndGg6ICIgKyBtYXN0ZXJMZW5ndGgpOworICAgICAgICBtYXN0ZXJGZC5jbG9zZSgpOworCisgICAgICAgIElucHV0U3RyZWFtIHBjbVN0cmVhbTIgPSByZXMub3BlblJhd1Jlc291cmNlKFIucmF3LnNpbmVzd2VlcHJhdyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJub3QgaWRlbnRpY2FsIGFmdGVyIGNvbXByZXNzaW9uIiwKKyAgICAgICAgICAgICAgICBtYXN0ZXJMZW5ndGgsCisgICAgICAgICAgICAgICAgY29tcGFyZVN0cmVhbXMobmV3IEJ5dGVCdWZmZXJJbnB1dFN0cmVhbShhbXJUb1JhdyksIHBjbVN0cmVhbTIpKTsKKyAgICAgICAgcGNtU3RyZWFtMS5jbG9zZSgpOworICAgICAgICBwY21TdHJlYW0yLmNsb3NlKCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL01lZGlhQ29udHJvbGxlclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9NZWRpYUNvbnRyb2xsZXJUZXN0LmphdmEKaW5kZXggZWMzNzBlZi4uZjRiMmIzOSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL01lZGlhQ29udHJvbGxlclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvTWVkaWFDb250cm9sbGVyVGVzdC5qYXZhCkBAIC0xNSwxOSArMTUsMjQgQEAKICAqLwogcGFja2FnZSBhbmRyb2lkLm1lZGlhLmN0czsKIAotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9BdHRyaWJ1dGVzOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLmN0cy5VdGlscy5jb21wYXJlUmVtb3RlVXNlckluZm87CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuUmF0aW5nOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuVm9sdW1lUHJvdmlkZXI7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLk1lZGlhQ29udHJvbGxlcjsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uTWVkaWFTZXNzaW9uOworaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYVNlc3Npb25NYW5hZ2VyLlJlbW90ZVVzZXJJbmZvOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5QbGF5YmFja1N0YXRlLkN1c3RvbUFjdGlvbjsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOworaW1wb3J0IGFuZHJvaWQub3MuUHJvY2VzczsKIGltcG9ydCBhbmRyb2lkLm9zLlJlc3VsdFJlY2VpdmVyOwogaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwogCiAvKioKICAqIFRlc3Qge0BsaW5rIGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYUNvbnRyb2xsZXJ9LgpAQCAtNDQsNiArNDksNyBAQAogICAgIHByaXZhdGUgTWVkaWFTZXNzaW9uIG1TZXNzaW9uOwogICAgIHByaXZhdGUgTWVkaWFTZXNzaW9uQ2FsbGJhY2sgbUNhbGxiYWNrID0gbmV3IE1lZGlhU2Vzc2lvbkNhbGxiYWNrKCk7CiAgICAgcHJpdmF0ZSBNZWRpYUNvbnRyb2xsZXIgbUNvbnRyb2xsZXI7CisgICAgcHJpdmF0ZSBSZW1vdGVVc2VySW5mbyBtQ29udHJvbGxlckluZm87CiAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewpAQCAtNTEsNiArNTcsOCBAQAogICAgICAgICBtU2Vzc2lvbiA9IG5ldyBNZWRpYVNlc3Npb24oZ2V0Q29udGV4dCgpLCBTRVNTSU9OX1RBRyk7CiAgICAgICAgIG1TZXNzaW9uLnNldENhbGxiYWNrKG1DYWxsYmFjaywgbUhhbmRsZXIpOwogICAgICAgICBtQ29udHJvbGxlciA9IG1TZXNzaW9uLmdldENvbnRyb2xsZXIoKTsKKyAgICAgICAgbUNvbnRyb2xsZXJJbmZvID0gbmV3IFJlbW90ZVVzZXJJbmZvKAorICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5nZXRQYWNrYWdlTmFtZSgpLCBQcm9jZXNzLm15UGlkKCksIFByb2Nlc3MubXlVaWQoKSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdEdldFBhY2thZ2VOYW1lKCkgewpAQCAtODEsNiArODksNyBAQAogICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtQ2FsbGJhY2subUNvbW1hbmRDYWxsYmFjayk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY29tbWFuZCwgbUNhbGxiYWNrLm1Db21tYW5kKTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscyhFWFRSQVNfVkFMVUUsIG1DYWxsYmFjay5tRXh0cmFzLmdldFN0cmluZyhFWFRSQVNfS0VZKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGNvbXBhcmVSZW1vdGVVc2VySW5mbyhtQ29udHJvbGxlckluZm8sIG1DYWxsYmFjay5tQ2FsbGVySW5mbykpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xNDIsNTAgKzE1MSw0MyBAQAogICAgICAgICAgICAgY29udHJvbHMucGxheSgpOwogICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoVElNRV9PVVRfTVMpOwogICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtQ2FsbGJhY2subU9uUGxheUNhbGxlZCk7Ci0gICAgICAgICAgICAvLyBqdXN0IGNhbGwgdGhlIGNhbGxiYWNrIG9uY2UgZGlyZWN0bHkgc28gaXQncyBtYXJrZWQgYXMgdGVzdGVkCi0gICAgICAgICAgICBjYWxsYmFjay5vblBsYXkoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoY29tcGFyZVJlbW90ZVVzZXJJbmZvKG1Db250cm9sbGVySW5mbywgbUNhbGxiYWNrLm1DYWxsZXJJbmZvKSk7CiAKICAgICAgICAgICAgIG1DYWxsYmFjay5yZXNldCgpOwogICAgICAgICAgICAgY29udHJvbHMucGF1c2UoKTsKICAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFRJTUVfT1VUX01TKTsKICAgICAgICAgICAgIGFzc2VydFRydWUobUNhbGxiYWNrLm1PblBhdXNlQ2FsbGVkKTsKLSAgICAgICAgICAgIC8vIGp1c3QgY2FsbCB0aGUgY2FsbGJhY2sgb25jZSBkaXJlY3RseSBzbyBpdCdzIG1hcmtlZCBhcyB0ZXN0ZWQKLSAgICAgICAgICAgIGNhbGxiYWNrLm9uUGF1c2UoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoY29tcGFyZVJlbW90ZVVzZXJJbmZvKG1Db250cm9sbGVySW5mbywgbUNhbGxiYWNrLm1DYWxsZXJJbmZvKSk7CiAKICAgICAgICAgICAgIG1DYWxsYmFjay5yZXNldCgpOwogICAgICAgICAgICAgY29udHJvbHMuc3RvcCgpOwogICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoVElNRV9PVVRfTVMpOwogICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtQ2FsbGJhY2subU9uU3RvcENhbGxlZCk7Ci0gICAgICAgICAgICAvLyBqdXN0IGNhbGwgdGhlIGNhbGxiYWNrIG9uY2UgZGlyZWN0bHkgc28gaXQncyBtYXJrZWQgYXMgdGVzdGVkCi0gICAgICAgICAgICBjYWxsYmFjay5vblN0b3AoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoY29tcGFyZVJlbW90ZVVzZXJJbmZvKG1Db250cm9sbGVySW5mbywgbUNhbGxiYWNrLm1DYWxsZXJJbmZvKSk7CiAKICAgICAgICAgICAgIG1DYWxsYmFjay5yZXNldCgpOwogICAgICAgICAgICAgY29udHJvbHMuZmFzdEZvcndhcmQoKTsKICAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFRJTUVfT1VUX01TKTsKICAgICAgICAgICAgIGFzc2VydFRydWUobUNhbGxiYWNrLm1PbkZhc3RGb3J3YXJkQ2FsbGVkKTsKLSAgICAgICAgICAgIC8vIGp1c3QgY2FsbCB0aGUgY2FsbGJhY2sgb25jZSBkaXJlY3RseSBzbyBpdCdzIG1hcmtlZCBhcyB0ZXN0ZWQKLSAgICAgICAgICAgIGNhbGxiYWNrLm9uRmFzdEZvcndhcmQoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoY29tcGFyZVJlbW90ZVVzZXJJbmZvKG1Db250cm9sbGVySW5mbywgbUNhbGxiYWNrLm1DYWxsZXJJbmZvKSk7CiAKICAgICAgICAgICAgIG1DYWxsYmFjay5yZXNldCgpOwogICAgICAgICAgICAgY29udHJvbHMucmV3aW5kKCk7CiAgICAgICAgICAgICBtV2FpdExvY2sud2FpdChUSU1FX09VVF9NUyk7CiAgICAgICAgICAgICBhc3NlcnRUcnVlKG1DYWxsYmFjay5tT25SZXdpbmRDYWxsZWQpOwotICAgICAgICAgICAgLy8ganVzdCBjYWxsIHRoZSBjYWxsYmFjayBvbmNlIGRpcmVjdGx5IHNvIGl0J3MgbWFya2VkIGFzIHRlc3RlZAotICAgICAgICAgICAgY2FsbGJhY2sub25SZXdpbmQoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoY29tcGFyZVJlbW90ZVVzZXJJbmZvKG1Db250cm9sbGVySW5mbywgbUNhbGxiYWNrLm1DYWxsZXJJbmZvKSk7CiAKICAgICAgICAgICAgIG1DYWxsYmFjay5yZXNldCgpOwogICAgICAgICAgICAgY29udHJvbHMuc2tpcFRvUHJldmlvdXMoKTsKICAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFRJTUVfT1VUX01TKTsKICAgICAgICAgICAgIGFzc2VydFRydWUobUNhbGxiYWNrLm1PblNraXBUb1ByZXZpb3VzQ2FsbGVkKTsKLSAgICAgICAgICAgIC8vIGp1c3QgY2FsbCB0aGUgY2FsbGJhY2sgb25jZSBkaXJlY3RseSBzbyBpdCdzIG1hcmtlZCBhcyB0ZXN0ZWQKLSAgICAgICAgICAgIGNhbGxiYWNrLm9uU2tpcFRvUHJldmlvdXMoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoY29tcGFyZVJlbW90ZVVzZXJJbmZvKG1Db250cm9sbGVySW5mbywgbUNhbGxiYWNrLm1DYWxsZXJJbmZvKSk7CiAKICAgICAgICAgICAgIG1DYWxsYmFjay5yZXNldCgpOwogICAgICAgICAgICAgY29udHJvbHMuc2tpcFRvTmV4dCgpOwogICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoVElNRV9PVVRfTVMpOwogICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtQ2FsbGJhY2subU9uU2tpcFRvTmV4dENhbGxlZCk7Ci0gICAgICAgICAgICAvLyBqdXN0IGNhbGwgdGhlIGNhbGxiYWNrIG9uY2UgZGlyZWN0bHkgc28gaXQncyBtYXJrZWQgYXMgdGVzdGVkCi0gICAgICAgICAgICBjYWxsYmFjay5vblNraXBUb05leHQoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoY29tcGFyZVJlbW90ZVVzZXJJbmZvKG1Db250cm9sbGVySW5mbywgbUNhbGxiYWNrLm1DYWxsZXJJbmZvKSk7CiAKICAgICAgICAgICAgIG1DYWxsYmFjay5yZXNldCgpOwogICAgICAgICAgICAgZmluYWwgbG9uZyBzZWVrUG9zaXRpb24gPSAxMDAwOwpAQCAtMTkzLDggKzE5NSw3IEBACiAgICAgICAgICAgICBtV2FpdExvY2sud2FpdChUSU1FX09VVF9NUyk7CiAgICAgICAgICAgICBhc3NlcnRUcnVlKG1DYWxsYmFjay5tT25TZWVrVG9DYWxsZWQpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNlZWtQb3NpdGlvbiwgbUNhbGxiYWNrLm1TZWVrUG9zaXRpb24pOwotICAgICAgICAgICAgLy8ganVzdCBjYWxsIHRoZSBjYWxsYmFjayBvbmNlIGRpcmVjdGx5IHNvIGl0J3MgbWFya2VkIGFzIHRlc3RlZAotICAgICAgICAgICAgY2FsbGJhY2sub25TZWVrVG8obUNhbGxiYWNrLm1TZWVrUG9zaXRpb24pOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb21wYXJlUmVtb3RlVXNlckluZm8obUNvbnRyb2xsZXJJbmZvLCBtQ2FsbGJhY2subUNhbGxlckluZm8pKTsKIAogICAgICAgICAgICAgbUNhbGxiYWNrLnJlc2V0KCk7CiAgICAgICAgICAgICBmaW5hbCBSYXRpbmcgcmF0aW5nID0gUmF0aW5nLm5ld1N0YXJSYXRpbmcoUmF0aW5nLlJBVElOR181X1NUQVJTLCAzZik7CkBAIC0yMDMsOCArMjA0LDcgQEAKICAgICAgICAgICAgIGFzc2VydFRydWUobUNhbGxiYWNrLm1PblNldFJhdGluZ0NhbGxlZCk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMocmF0aW5nLmdldFJhdGluZ1N0eWxlKCksIG1DYWxsYmFjay5tUmF0aW5nLmdldFJhdGluZ1N0eWxlKCkpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJhdGluZy5nZXRTdGFyUmF0aW5nKCksIG1DYWxsYmFjay5tUmF0aW5nLmdldFN0YXJSYXRpbmcoKSk7Ci0gICAgICAgICAgICAvLyBqdXN0IGNhbGwgdGhlIGNhbGxiYWNrIG9uY2UgZGlyZWN0bHkgc28gaXQncyBtYXJrZWQgYXMgdGVzdGVkCi0gICAgICAgICAgICBjYWxsYmFjay5vblNldFJhdGluZyhtQ2FsbGJhY2subVJhdGluZyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGNvbXBhcmVSZW1vdGVVc2VySW5mbyhtQ29udHJvbGxlckluZm8sIG1DYWxsYmFjay5tQ2FsbGVySW5mbykpOwogCiAgICAgICAgICAgICBtQ2FsbGJhY2sucmVzZXQoKTsKICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZWRpYUlkID0gInRlc3QtbWVkaWEtaWQiOwpAQCAtMjE1LDggKzIxNSw3IEBACiAgICAgICAgICAgICBhc3NlcnRUcnVlKG1DYWxsYmFjay5tT25QbGF5RnJvbU1lZGlhSWRDYWxsZWQpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG1lZGlhSWQsIG1DYWxsYmFjay5tTWVkaWFJZCk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoRVhUUkFTX1ZBTFVFLCBtQ2FsbGJhY2subUV4dHJhcy5nZXRTdHJpbmcoRVhUUkFTX0tFWSkpOwotICAgICAgICAgICAgLy8ganVzdCBjYWxsIHRoZSBjYWxsYmFjayBvbmNlIGRpcmVjdGx5IHNvIGl0J3MgbWFya2VkIGFzIHRlc3RlZAotICAgICAgICAgICAgY2FsbGJhY2sub25QbGF5RnJvbU1lZGlhSWQobUNhbGxiYWNrLm1NZWRpYUlkLCBtQ2FsbGJhY2subUV4dHJhcyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGNvbXBhcmVSZW1vdGVVc2VySW5mbyhtQ29udHJvbGxlckluZm8sIG1DYWxsYmFjay5tQ2FsbGVySW5mbykpOwogCiAgICAgICAgICAgICBtQ2FsbGJhY2sucmVzZXQoKTsKICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBxdWVyeSA9ICJ0ZXN0LXF1ZXJ5IjsKQEAgLTIyNSw4ICsyMjQsNyBAQAogICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtQ2FsbGJhY2subU9uUGxheUZyb21TZWFyY2hDYWxsZWQpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHF1ZXJ5LCBtQ2FsbGJhY2subVF1ZXJ5KTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscyhFWFRSQVNfVkFMVUUsIG1DYWxsYmFjay5tRXh0cmFzLmdldFN0cmluZyhFWFRSQVNfS0VZKSk7Ci0gICAgICAgICAgICAvLyBqdXN0IGNhbGwgdGhlIGNhbGxiYWNrIG9uY2UgZGlyZWN0bHkgc28gaXQncyBtYXJrZWQgYXMgdGVzdGVkCi0gICAgICAgICAgICBjYWxsYmFjay5vblBsYXlGcm9tU2VhcmNoKG1DYWxsYmFjay5tUXVlcnksIG1DYWxsYmFjay5tRXh0cmFzKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoY29tcGFyZVJlbW90ZVVzZXJJbmZvKG1Db250cm9sbGVySW5mbywgbUNhbGxiYWNrLm1DYWxsZXJJbmZvKSk7CiAKICAgICAgICAgICAgIG1DYWxsYmFjay5yZXNldCgpOwogICAgICAgICAgICAgZmluYWwgVXJpIHVyaSA9IFVyaS5wYXJzZSgiY29udGVudDovL3Rlc3QvcG9wY29ybi5tb2QiKTsKQEAgLTIzNSw4ICsyMzMsNyBAQAogICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtQ2FsbGJhY2subU9uUGxheUZyb21VcmlDYWxsZWQpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHVyaSwgbUNhbGxiYWNrLm1VcmkpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEVYVFJBU19WQUxVRSwgbUNhbGxiYWNrLm1FeHRyYXMuZ2V0U3RyaW5nKEVYVFJBU19LRVkpKTsKLSAgICAgICAgICAgIC8vIGp1c3QgY2FsbCB0aGUgY2FsbGJhY2sgb25jZSBkaXJlY3RseSBzbyBpdCdzIG1hcmtlZCBhcyB0ZXN0ZWQKLSAgICAgICAgICAgIGNhbGxiYWNrLm9uUGxheUZyb21VcmkobUNhbGxiYWNrLm1VcmksIG1DYWxsYmFjay5tRXh0cmFzKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoY29tcGFyZVJlbW90ZVVzZXJJbmZvKG1Db250cm9sbGVySW5mbywgbUNhbGxiYWNrLm1DYWxsZXJJbmZvKSk7CiAKICAgICAgICAgICAgIG1DYWxsYmFjay5yZXNldCgpOwogICAgICAgICAgICAgZmluYWwgU3RyaW5nIGFjdGlvbiA9ICJ0ZXN0LWFjdGlvbiI7CkBAIC0yNDUsOCArMjQyLDcgQEAKICAgICAgICAgICAgIGFzc2VydFRydWUobUNhbGxiYWNrLm1PbkN1c3RvbUFjdGlvbkNhbGxlZCk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYWN0aW9uLCBtQ2FsbGJhY2subUFjdGlvbik7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoRVhUUkFTX1ZBTFVFLCBtQ2FsbGJhY2subUV4dHJhcy5nZXRTdHJpbmcoRVhUUkFTX0tFWSkpOwotICAgICAgICAgICAgLy8ganVzdCBjYWxsIHRoZSBjYWxsYmFjayBvbmNlIGRpcmVjdGx5IHNvIGl0J3MgbWFya2VkIGFzIHRlc3RlZAotICAgICAgICAgICAgY2FsbGJhY2sub25DdXN0b21BY3Rpb24obUNhbGxiYWNrLm1BY3Rpb24sIG1DYWxsYmFjay5tRXh0cmFzKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoY29tcGFyZVJlbW90ZVVzZXJJbmZvKG1Db250cm9sbGVySW5mbywgbUNhbGxiYWNrLm1DYWxsZXJJbmZvKSk7CiAKICAgICAgICAgICAgIG1DYWxsYmFjay5yZXNldCgpOwogICAgICAgICAgICAgbUNhbGxiYWNrLm1PbkN1c3RvbUFjdGlvbkNhbGxlZCA9IGZhbHNlOwpAQCAtMjU3LDggKzI1Myw3IEBACiAgICAgICAgICAgICBhc3NlcnRUcnVlKG1DYWxsYmFjay5tT25DdXN0b21BY3Rpb25DYWxsZWQpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGFjdGlvbiwgbUNhbGxiYWNrLm1BY3Rpb24pOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEVYVFJBU19WQUxVRSwgbUNhbGxiYWNrLm1FeHRyYXMuZ2V0U3RyaW5nKEVYVFJBU19LRVkpKTsKLSAgICAgICAgICAgIC8vIGp1c3QgY2FsbCB0aGUgY2FsbGJhY2sgb25jZSBkaXJlY3RseSBzbyBpdCdzIG1hcmtlZCBhcyB0ZXN0ZWQKLSAgICAgICAgICAgIGNhbGxiYWNrLm9uQ3VzdG9tQWN0aW9uKG1DYWxsYmFjay5tQWN0aW9uLCBtQ2FsbGJhY2subUV4dHJhcyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGNvbXBhcmVSZW1vdGVVc2VySW5mbyhtQ29udHJvbGxlckluZm8sIG1DYWxsYmFjay5tQ2FsbGVySW5mbykpOwogCiAgICAgICAgICAgICBtQ2FsbGJhY2sucmVzZXQoKTsKICAgICAgICAgICAgIGZpbmFsIGxvbmcgcXVldWVJdGVtSWQgPSAxMDAwOwpAQCAtMjY2LDE1ICsyNjEsMTMgQEAKICAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFRJTUVfT1VUX01TKTsKICAgICAgICAgICAgIGFzc2VydFRydWUobUNhbGxiYWNrLm1PblNraXBUb1F1ZXVlSXRlbUNhbGxlZCk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMocXVldWVJdGVtSWQsIG1DYWxsYmFjay5tUXVldWVJdGVtSWQpOwotICAgICAgICAgICAgLy8ganVzdCBjYWxsIHRoZSBjYWxsYmFjayBvbmNlIGRpcmVjdGx5IHNvIGl0J3MgbWFya2VkIGFzIHRlc3RlZAotICAgICAgICAgICAgY2FsbGJhY2sub25Ta2lwVG9RdWV1ZUl0ZW0obUNhbGxiYWNrLm1RdWV1ZUl0ZW1JZCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGNvbXBhcmVSZW1vdGVVc2VySW5mbyhtQ29udHJvbGxlckluZm8sIG1DYWxsYmFjay5tQ2FsbGVySW5mbykpOwogCiAgICAgICAgICAgICBtQ2FsbGJhY2sucmVzZXQoKTsKICAgICAgICAgICAgIGNvbnRyb2xzLnByZXBhcmUoKTsKICAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFRJTUVfT1VUX01TKTsKICAgICAgICAgICAgIGFzc2VydFRydWUobUNhbGxiYWNrLm1PblByZXBhcmVDYWxsZWQpOwotICAgICAgICAgICAgLy8ganVzdCBjYWxsIHRoZSBjYWxsYmFjayBvbmNlIGRpcmVjdGx5IHNvIGl0J3MgbWFya2VkIGFzIHRlc3RlZAotICAgICAgICAgICAgY2FsbGJhY2sub25QcmVwYXJlKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGNvbXBhcmVSZW1vdGVVc2VySW5mbyhtQ29udHJvbGxlckluZm8sIG1DYWxsYmFjay5tQ2FsbGVySW5mbykpOwogCiAgICAgICAgICAgICBtQ2FsbGJhY2sucmVzZXQoKTsKICAgICAgICAgICAgIGNvbnRyb2xzLnByZXBhcmVGcm9tTWVkaWFJZChtZWRpYUlkLCBleHRyYXMpOwpAQCAtMjgyLDggKzI3NSw3IEBACiAgICAgICAgICAgICBhc3NlcnRUcnVlKG1DYWxsYmFjay5tT25QcmVwYXJlRnJvbU1lZGlhSWRDYWxsZWQpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG1lZGlhSWQsIG1DYWxsYmFjay5tTWVkaWFJZCk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoRVhUUkFTX1ZBTFVFLCBtQ2FsbGJhY2subUV4dHJhcy5nZXRTdHJpbmcoRVhUUkFTX0tFWSkpOwotICAgICAgICAgICAgLy8ganVzdCBjYWxsIHRoZSBjYWxsYmFjayBvbmNlIGRpcmVjdGx5IHNvIGl0J3MgbWFya2VkIGFzIHRlc3RlZAotICAgICAgICAgICAgY2FsbGJhY2sub25QcmVwYXJlRnJvbU1lZGlhSWQobUNhbGxiYWNrLm1NZWRpYUlkLCBtQ2FsbGJhY2subUV4dHJhcyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGNvbXBhcmVSZW1vdGVVc2VySW5mbyhtQ29udHJvbGxlckluZm8sIG1DYWxsYmFjay5tQ2FsbGVySW5mbykpOwogCiAgICAgICAgICAgICBtQ2FsbGJhY2sucmVzZXQoKTsKICAgICAgICAgICAgIGNvbnRyb2xzLnByZXBhcmVGcm9tU2VhcmNoKHF1ZXJ5LCBleHRyYXMpOwpAQCAtMjkxLDggKzI4Myw3IEBACiAgICAgICAgICAgICBhc3NlcnRUcnVlKG1DYWxsYmFjay5tT25QcmVwYXJlRnJvbVNlYXJjaENhbGxlZCk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMocXVlcnksIG1DYWxsYmFjay5tUXVlcnkpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEVYVFJBU19WQUxVRSwgbUNhbGxiYWNrLm1FeHRyYXMuZ2V0U3RyaW5nKEVYVFJBU19LRVkpKTsKLSAgICAgICAgICAgIC8vIGp1c3QgY2FsbCB0aGUgY2FsbGJhY2sgb25jZSBkaXJlY3RseSBzbyBpdCdzIG1hcmtlZCBhcyB0ZXN0ZWQKLSAgICAgICAgICAgIGNhbGxiYWNrLm9uUHJlcGFyZUZyb21TZWFyY2gobUNhbGxiYWNrLm1RdWVyeSwgbUNhbGxiYWNrLm1FeHRyYXMpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb21wYXJlUmVtb3RlVXNlckluZm8obUNvbnRyb2xsZXJJbmZvLCBtQ2FsbGJhY2subUNhbGxlckluZm8pKTsKIAogICAgICAgICAgICAgbUNhbGxiYWNrLnJlc2V0KCk7CiAgICAgICAgICAgICBjb250cm9scy5wcmVwYXJlRnJvbVVyaSh1cmksIGV4dHJhcyk7CkBAIC0zMDAsOSArMjkxLDUwIEBACiAgICAgICAgICAgICBhc3NlcnRUcnVlKG1DYWxsYmFjay5tT25QcmVwYXJlRnJvbVVyaUNhbGxlZCk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHModXJpLCBtQ2FsbGJhY2subVVyaSk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoRVhUUkFTX1ZBTFVFLCBtQ2FsbGJhY2subUV4dHJhcy5nZXRTdHJpbmcoRVhUUkFTX0tFWSkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb21wYXJlUmVtb3RlVXNlckluZm8obUNvbnRyb2xsZXJJbmZvLCBtQ2FsbGJhY2subUNhbGxlckluZm8pKTsKKworICAgICAgICAgICAgbUNhbGxiYWNrLnJlc2V0KCk7CisgICAgICAgICAgICBLZXlFdmVudCBldmVudCA9IG5ldyBLZXlFdmVudChLZXlFdmVudC5BQ1RJT05fRE9XTiwgS2V5RXZlbnQuS0VZQ09ERV9NRURJQV9TVE9QKTsKKyAgICAgICAgICAgIG1Db250cm9sbGVyLmRpc3BhdGNoTWVkaWFCdXR0b25FdmVudChldmVudCk7CisgICAgICAgICAgICBtV2FpdExvY2sud2FpdChUSU1FX09VVF9NUyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKG1DYWxsYmFjay5tT25NZWRpYUJ1dHRvbkV2ZW50Q2FsbGVkKTsKKyAgICAgICAgICAgIC8vIEtleUV2ZW50IGRvZXNuJ3Qgb3ZlcnJpZGUgZXF1YWxzLgorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEtleUV2ZW50LkFDVElPTl9ET1dOLCBtQ2FsbGJhY2subUtleUV2ZW50LmdldEFjdGlvbigpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhLZXlFdmVudC5LRVlDT0RFX01FRElBX1NUT1AsIG1DYWxsYmFjay5tS2V5RXZlbnQuZ2V0S2V5Q29kZSgpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoY29tcGFyZVJlbW90ZVVzZXJJbmZvKG1Db250cm9sbGVySW5mbywgbUNhbGxiYWNrLm1DYWxsZXJJbmZvKSk7CisKKyAgICAgICAgICAgIC8vIGp1c3QgY2FsbCB0aGUgY2FsbGJhY2sgb25jZSBkaXJlY3RseSBzbyBpdCdzIG1hcmtlZCBhcyB0ZXN0ZWQKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY2FsbGJhY2sub25QbGF5KCk7CisgICAgICAgICAgICAgICAgY2FsbGJhY2sub25QYXVzZSgpOworICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uU3RvcCgpOworICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uRmFzdEZvcndhcmQoKTsKKyAgICAgICAgICAgICAgICBjYWxsYmFjay5vblJld2luZCgpOworICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uU2tpcFRvUHJldmlvdXMoKTsKKyAgICAgICAgICAgICAgICBjYWxsYmFjay5vblNraXBUb05leHQoKTsKKyAgICAgICAgICAgICAgICBjYWxsYmFjay5vblNlZWtUbyhtQ2FsbGJhY2subVNlZWtQb3NpdGlvbik7CisgICAgICAgICAgICAgICAgY2FsbGJhY2sub25TZXRSYXRpbmcobUNhbGxiYWNrLm1SYXRpbmcpOworICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUGxheUZyb21NZWRpYUlkKG1DYWxsYmFjay5tTWVkaWFJZCwgbUNhbGxiYWNrLm1FeHRyYXMpOworICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUGxheUZyb21TZWFyY2gobUNhbGxiYWNrLm1RdWVyeSwgbUNhbGxiYWNrLm1FeHRyYXMpOworICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUGxheUZyb21VcmkobUNhbGxiYWNrLm1VcmksIG1DYWxsYmFjay5tRXh0cmFzKTsKKyAgICAgICAgICAgICAgICBjYWxsYmFjay5vbkN1c3RvbUFjdGlvbihtQ2FsbGJhY2subUFjdGlvbiwgbUNhbGxiYWNrLm1FeHRyYXMpOworICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uQ3VzdG9tQWN0aW9uKG1DYWxsYmFjay5tQWN0aW9uLCBtQ2FsbGJhY2subUV4dHJhcyk7CisgICAgICAgICAgICAgICAgY2FsbGJhY2sub25Ta2lwVG9RdWV1ZUl0ZW0obUNhbGxiYWNrLm1RdWV1ZUl0ZW1JZCk7CisgICAgICAgICAgICAgICAgY2FsbGJhY2sub25QcmVwYXJlKCk7CisgICAgICAgICAgICAgICAgY2FsbGJhY2sub25QcmVwYXJlRnJvbU1lZGlhSWQobUNhbGxiYWNrLm1NZWRpYUlkLCBtQ2FsbGJhY2subUV4dHJhcyk7CisgICAgICAgICAgICAgICAgY2FsbGJhY2sub25QcmVwYXJlRnJvbVNlYXJjaChtQ2FsbGJhY2subVF1ZXJ5LCBtQ2FsbGJhY2subUV4dHJhcyk7CisgICAgICAgICAgICAgICAgY2FsbGJhY2sub25QcmVwYXJlRnJvbVVyaShVcmkucGFyc2UoImh0dHA6Ly9kLmFuZHJvaWQuY29tIiksIG1DYWxsYmFjay5tRXh0cmFzKTsKKyAgICAgICAgICAgICAgICBJbnRlbnQgbWVkaWFCdXR0b25JbnRlbnQgPSBuZXcgSW50ZW50KEludGVudC5BQ1RJT05fTUVESUFfQlVUVE9OKTsKKyAgICAgICAgICAgICAgICBtZWRpYUJ1dHRvbkludGVudC5wdXRFeHRyYShJbnRlbnQuRVhUUkFfS0VZX0VWRU5ULCBldmVudCk7CisgICAgICAgICAgICAgICAgY2FsbGJhY2sub25NZWRpYUJ1dHRvbkV2ZW50KG1lZGlhQnV0dG9uSW50ZW50KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIC8vIEV4cGVjdGVkLCBzaW5jZSB0aGUgTWVkaWFTZXNzaW9uLmdldEN1cnJlbnRDb250cm9sbGVySW5mbygpIGlzIGNhbGxlZCBpbiBldmVyeQorICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrIG1ldGhvZCwgYnV0IG5vIGNvbnRyb2xsZXIgaXMgc2VuZGluZyBhbnkgY29tbWFuZC4KKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAorICAgIC8qCiAgICAgcHVibGljIHZvaWQgdGVzdFBsYXliYWNrSW5mbygpIHsKICAgICAgICAgZmluYWwgaW50IHBsYXliYWNrVHlwZSA9IE1lZGlhQ29udHJvbGxlci5QbGF5YmFja0luZm8uUExBWUJBQ0tfVFlQRV9MT0NBTDsKICAgICAgICAgZmluYWwgaW50IHZvbHVtZUNvbnRyb2wgPSBWb2x1bWVQcm92aWRlci5WT0xVTUVfQ09OVFJPTF9BQlNPTFVURTsKQEAgLTMxOSw2ICszNTEsNyBAQAogICAgICAgICBhc3NlcnRFcXVhbHMobWF4Vm9sdW1lLCBpbmZvLmdldE1heFZvbHVtZSgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKGN1cnJlbnRWb2x1bWUsIGluZm8uZ2V0Q3VycmVudFZvbHVtZSgpKTsKICAgICB9CisgICAgKi8KIAogICAgIHByaXZhdGUgY2xhc3MgTWVkaWFTZXNzaW9uQ2FsbGJhY2sgZXh0ZW5kcyBNZWRpYVNlc3Npb24uQ2FsbGJhY2sgewogICAgICAgICBwcml2YXRlIGxvbmcgbVNlZWtQb3NpdGlvbjsKQEAgLTMzMSw2ICszNjQsOCBAQAogICAgICAgICBwcml2YXRlIFN0cmluZyBtQ29tbWFuZDsKICAgICAgICAgcHJpdmF0ZSBCdW5kbGUgbUV4dHJhczsKICAgICAgICAgcHJpdmF0ZSBSZXN1bHRSZWNlaXZlciBtQ29tbWFuZENhbGxiYWNrOworICAgICAgICBwcml2YXRlIEtleUV2ZW50IG1LZXlFdmVudDsKKyAgICAgICAgcHJpdmF0ZSBSZW1vdGVVc2VySW5mbyBtQ2FsbGVySW5mbzsKIAogICAgICAgICBwcml2YXRlIGJvb2xlYW4gbU9uUGxheUNhbGxlZDsKICAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1PblBhdXNlQ2FsbGVkOwpAQCAtMzUxLDYgKzM4Niw3IEBACiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtT25QcmVwYXJlRnJvbU1lZGlhSWRDYWxsZWQ7CiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtT25QcmVwYXJlRnJvbVNlYXJjaENhbGxlZDsKICAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1PblByZXBhcmVGcm9tVXJpQ2FsbGVkOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbU9uTWVkaWFCdXR0b25FdmVudENhbGxlZDsKIAogICAgICAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKICAgICAgICAgICAgIG1TZWVrUG9zaXRpb24gPSAtMTsKQEAgLTM2Myw2ICszOTksOCBAQAogICAgICAgICAgICAgbUV4dHJhcyA9IG51bGw7CiAgICAgICAgICAgICBtQ29tbWFuZCA9IG51bGw7CiAgICAgICAgICAgICBtQ29tbWFuZENhbGxiYWNrID0gbnVsbDsKKyAgICAgICAgICAgIG1LZXlFdmVudCA9IG51bGw7CisgICAgICAgICAgICBtQ2FsbGVySW5mbyA9IG51bGw7CiAKICAgICAgICAgICAgIG1PblBsYXlDYWxsZWQgPSBmYWxzZTsKICAgICAgICAgICAgIG1PblBhdXNlQ2FsbGVkID0gZmFsc2U7CkBAIC0zODMsMTIgKzQyMSwxNCBAQAogICAgICAgICAgICAgbU9uUHJlcGFyZUZyb21NZWRpYUlkQ2FsbGVkID0gZmFsc2U7CiAgICAgICAgICAgICBtT25QcmVwYXJlRnJvbVNlYXJjaENhbGxlZCA9IGZhbHNlOwogICAgICAgICAgICAgbU9uUHJlcGFyZUZyb21VcmlDYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIG1Pbk1lZGlhQnV0dG9uRXZlbnRDYWxsZWQgPSBmYWxzZTsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBvblBsYXkoKSB7CiAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewogICAgICAgICAgICAgICAgIG1PblBsYXlDYWxsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIG1DYWxsZXJJbmZvID0gbVNlc3Npb24uZ2V0Q3VycmVudENvbnRyb2xsZXJJbmZvKCk7CiAgICAgICAgICAgICAgICAgbVdhaXRMb2NrLm5vdGlmeSgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0zOTcsNiArNDM3LDcgQEAKICAgICAgICAgcHVibGljIHZvaWQgb25QYXVzZSgpIHsKICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7CiAgICAgICAgICAgICAgICAgbU9uUGF1c2VDYWxsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIG1DYWxsZXJJbmZvID0gbVNlc3Npb24uZ2V0Q3VycmVudENvbnRyb2xsZXJJbmZvKCk7CiAgICAgICAgICAgICAgICAgbVdhaXRMb2NrLm5vdGlmeSgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC00MDUsNiArNDQ2LDcgQEAKICAgICAgICAgcHVibGljIHZvaWQgb25TdG9wKCkgewogICAgICAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKICAgICAgICAgICAgICAgICBtT25TdG9wQ2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtQ2FsbGVySW5mbyA9IG1TZXNzaW9uLmdldEN1cnJlbnRDb250cm9sbGVySW5mbygpOwogICAgICAgICAgICAgICAgIG1XYWl0TG9jay5ub3RpZnkoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNDEzLDYgKzQ1NSw3IEBACiAgICAgICAgIHB1YmxpYyB2b2lkIG9uRmFzdEZvcndhcmQoKSB7CiAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewogICAgICAgICAgICAgICAgIG1PbkZhc3RGb3J3YXJkQ2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtQ2FsbGVySW5mbyA9IG1TZXNzaW9uLmdldEN1cnJlbnRDb250cm9sbGVySW5mbygpOwogICAgICAgICAgICAgICAgIG1XYWl0TG9jay5ub3RpZnkoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNDIxLDYgKzQ2NCw3IEBACiAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmV3aW5kKCkgewogICAgICAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKICAgICAgICAgICAgICAgICBtT25SZXdpbmRDYWxsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIG1DYWxsZXJJbmZvID0gbVNlc3Npb24uZ2V0Q3VycmVudENvbnRyb2xsZXJJbmZvKCk7CiAgICAgICAgICAgICAgICAgbVdhaXRMb2NrLm5vdGlmeSgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC00MjksNiArNDczLDcgQEAKICAgICAgICAgcHVibGljIHZvaWQgb25Ta2lwVG9QcmV2aW91cygpIHsKICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7CiAgICAgICAgICAgICAgICAgbU9uU2tpcFRvUHJldmlvdXNDYWxsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIG1DYWxsZXJJbmZvID0gbVNlc3Npb24uZ2V0Q3VycmVudENvbnRyb2xsZXJJbmZvKCk7CiAgICAgICAgICAgICAgICAgbVdhaXRMb2NrLm5vdGlmeSgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC00MzcsNiArNDgyLDcgQEAKICAgICAgICAgcHVibGljIHZvaWQgb25Ta2lwVG9OZXh0KCkgewogICAgICAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKICAgICAgICAgICAgICAgICBtT25Ta2lwVG9OZXh0Q2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtQ2FsbGVySW5mbyA9IG1TZXNzaW9uLmdldEN1cnJlbnRDb250cm9sbGVySW5mbygpOwogICAgICAgICAgICAgICAgIG1XYWl0TG9jay5ub3RpZnkoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNDQ2LDYgKzQ5Miw3IEBACiAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewogICAgICAgICAgICAgICAgIG1PblNlZWtUb0NhbGxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgbVNlZWtQb3NpdGlvbiA9IHBvczsKKyAgICAgICAgICAgICAgICBtQ2FsbGVySW5mbyA9IG1TZXNzaW9uLmdldEN1cnJlbnRDb250cm9sbGVySW5mbygpOwogICAgICAgICAgICAgICAgIG1XYWl0TG9jay5ub3RpZnkoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNDU1LDYgKzUwMiw3IEBACiAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewogICAgICAgICAgICAgICAgIG1PblNldFJhdGluZ0NhbGxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgbVJhdGluZyA9IHJhdGluZzsKKyAgICAgICAgICAgICAgICBtQ2FsbGVySW5mbyA9IG1TZXNzaW9uLmdldEN1cnJlbnRDb250cm9sbGVySW5mbygpOwogICAgICAgICAgICAgICAgIG1XYWl0TG9jay5ub3RpZnkoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNDY1LDYgKzUxMyw3IEBACiAgICAgICAgICAgICAgICAgbU9uUGxheUZyb21NZWRpYUlkQ2FsbGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBtTWVkaWFJZCA9IG1lZGlhSWQ7CiAgICAgICAgICAgICAgICAgbUV4dHJhcyA9IGV4dHJhczsKKyAgICAgICAgICAgICAgICBtQ2FsbGVySW5mbyA9IG1TZXNzaW9uLmdldEN1cnJlbnRDb250cm9sbGVySW5mbygpOwogICAgICAgICAgICAgICAgIG1XYWl0TG9jay5ub3RpZnkoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNDc1LDYgKzUyNCw3IEBACiAgICAgICAgICAgICAgICAgbU9uUGxheUZyb21TZWFyY2hDYWxsZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgIG1RdWVyeSA9IHF1ZXJ5OwogICAgICAgICAgICAgICAgIG1FeHRyYXMgPSBleHRyYXM7CisgICAgICAgICAgICAgICAgbUNhbGxlckluZm8gPSBtU2Vzc2lvbi5nZXRDdXJyZW50Q29udHJvbGxlckluZm8oKTsKICAgICAgICAgICAgICAgICBtV2FpdExvY2subm90aWZ5KCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTQ4NSw2ICs1MzUsNyBAQAogICAgICAgICAgICAgICAgIG1PblBsYXlGcm9tVXJpQ2FsbGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBtVXJpID0gdXJpOwogICAgICAgICAgICAgICAgIG1FeHRyYXMgPSBleHRyYXM7CisgICAgICAgICAgICAgICAgbUNhbGxlckluZm8gPSBtU2Vzc2lvbi5nZXRDdXJyZW50Q29udHJvbGxlckluZm8oKTsKICAgICAgICAgICAgICAgICBtV2FpdExvY2subm90aWZ5KCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTQ5NSw2ICs1NDYsNyBAQAogICAgICAgICAgICAgICAgIG1PbkN1c3RvbUFjdGlvbkNhbGxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgbUFjdGlvbiA9IGFjdGlvbjsKICAgICAgICAgICAgICAgICBtRXh0cmFzID0gZXh0cmFzOworICAgICAgICAgICAgICAgIG1DYWxsZXJJbmZvID0gbVNlc3Npb24uZ2V0Q3VycmVudENvbnRyb2xsZXJJbmZvKCk7CiAgICAgICAgICAgICAgICAgbVdhaXRMb2NrLm5vdGlmeSgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC01MDQsNiArNTU2LDcgQEAKICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7CiAgICAgICAgICAgICAgICAgbU9uU2tpcFRvUXVldWVJdGVtQ2FsbGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBtUXVldWVJdGVtSWQgPSBpZDsKKyAgICAgICAgICAgICAgICBtQ2FsbGVySW5mbyA9IG1TZXNzaW9uLmdldEN1cnJlbnRDb250cm9sbGVySW5mbygpOwogICAgICAgICAgICAgICAgIG1XYWl0TG9jay5ub3RpZnkoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNTE1LDYgKzU2OCw3IEBACiAgICAgICAgICAgICAgICAgbUNvbW1hbmQgPSBjb21tYW5kOwogICAgICAgICAgICAgICAgIG1FeHRyYXMgPSBleHRyYXM7CiAgICAgICAgICAgICAgICAgbUNvbW1hbmRDYWxsYmFjayA9IGNiOworICAgICAgICAgICAgICAgIG1DYWxsZXJJbmZvID0gbVNlc3Npb24uZ2V0Q3VycmVudENvbnRyb2xsZXJJbmZvKCk7CiAgICAgICAgICAgICAgICAgbVdhaXRMb2NrLm5vdGlmeSgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC01MjMsNiArNTc3LDcgQEAKICAgICAgICAgcHVibGljIHZvaWQgb25QcmVwYXJlKCkgewogICAgICAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKICAgICAgICAgICAgICAgICBtT25QcmVwYXJlQ2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtQ2FsbGVySW5mbyA9IG1TZXNzaW9uLmdldEN1cnJlbnRDb250cm9sbGVySW5mbygpOwogICAgICAgICAgICAgICAgIG1XYWl0TG9jay5ub3RpZnkoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNTMzLDYgKzU4OCw3IEBACiAgICAgICAgICAgICAgICAgbU9uUHJlcGFyZUZyb21NZWRpYUlkQ2FsbGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBtTWVkaWFJZCA9IG1lZGlhSWQ7CiAgICAgICAgICAgICAgICAgbUV4dHJhcyA9IGV4dHJhczsKKyAgICAgICAgICAgICAgICBtQ2FsbGVySW5mbyA9IG1TZXNzaW9uLmdldEN1cnJlbnRDb250cm9sbGVySW5mbygpOwogICAgICAgICAgICAgICAgIG1XYWl0TG9jay5ub3RpZnkoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNTQzLDYgKzU5OSw3IEBACiAgICAgICAgICAgICAgICAgbU9uUHJlcGFyZUZyb21TZWFyY2hDYWxsZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgIG1RdWVyeSA9IHF1ZXJ5OwogICAgICAgICAgICAgICAgIG1FeHRyYXMgPSBleHRyYXM7CisgICAgICAgICAgICAgICAgbUNhbGxlckluZm8gPSBtU2Vzc2lvbi5nZXRDdXJyZW50Q29udHJvbGxlckluZm8oKTsKICAgICAgICAgICAgICAgICBtV2FpdExvY2subm90aWZ5KCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTU1Myw4ICs2MTAsMjAgQEAKICAgICAgICAgICAgICAgICBtT25QcmVwYXJlRnJvbVVyaUNhbGxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgbVVyaSA9IHVyaTsKICAgICAgICAgICAgICAgICBtRXh0cmFzID0gZXh0cmFzOworICAgICAgICAgICAgICAgIG1DYWxsZXJJbmZvID0gbVNlc3Npb24uZ2V0Q3VycmVudENvbnRyb2xsZXJJbmZvKCk7CiAgICAgICAgICAgICAgICAgbVdhaXRMb2NrLm5vdGlmeSgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uTWVkaWFCdXR0b25FdmVudChJbnRlbnQgbWVkaWFCdXR0b25JbnRlbnQpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7CisgICAgICAgICAgICAgICAgbU9uTWVkaWFCdXR0b25FdmVudENhbGxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgbUNhbGxlckluZm8gPSBtU2Vzc2lvbi5nZXRDdXJyZW50Q29udHJvbGxlckluZm8oKTsKKyAgICAgICAgICAgICAgICBtS2V5RXZlbnQgPSBtZWRpYUJ1dHRvbkludGVudC5nZXRQYXJjZWxhYmxlRXh0cmEoSW50ZW50LkVYVFJBX0tFWV9FVkVOVCk7CisgICAgICAgICAgICAgICAgbVdhaXRMb2NrLm5vdGlmeSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHN1cGVyLm9uTWVkaWFCdXR0b25FdmVudChtZWRpYUJ1dHRvbkludGVudCk7CisgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvTWVkaWFEcm1DbGVhcmtleVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9NZWRpYURybUNsZWFya2V5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzYzAyZjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvTWVkaWFEcm1DbGVhcmtleVRlc3QuamF2YQpAQCAtMCwwICsxLDEwMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLm1lZGlhLmN0czsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5DYW1jb3JkZXJQcm9maWxlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb2RlY0luZm8uQ29kZWNDYXBhYmlsaXRpZXM7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvZGVjTGlzdDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRHJtOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFEcm1FeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUZvcm1hdDsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkJhc2U2NDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyOworCitpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5BcGlMZXZlbFV0aWw7CisKK2ltcG9ydCBvcmcuanNvbi5KU09OQXJyYXk7CitpbXBvcnQgb3JnLmpzb24uSlNPTkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuanNvbi5KU09OT2JqZWN0OworCitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5VVUlEOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk5vbk51bGw7CisKKy8qKgorICogVGVzdHMgb2YgTWVkaWFQbGF5ZXIgc3RyZWFtaW5nIGNhcGFiaWxpdGllcy4KKyAqLworcHVibGljIGNsYXNzIE1lZGlhRHJtQ2xlYXJrZXlUZXN0IGV4dGVuZHMgTWVkaWFQbGF5ZXJUZXN0QmFzZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IE1lZGlhRHJtQ2xlYXJrZXlUZXN0LmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKworICAgIC8vIEFkZCBhZGRpdGlvbmFsIGtleXMgaGVyZSBpZiB0aGUgY29udGVudCBoYXMgbW9yZSBrZXlzLgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBDTEVBUl9LRVlfQ0VOQyA9IHsKKyAgICAgICAgICAgIChieXRlKTB4M2YsIChieXRlKTB4MGEsIChieXRlKTB4MzMsIChieXRlKTB4ZjMsIChieXRlKTB4NDAsIChieXRlKTB4OTgsIChieXRlKTB4YjksIChieXRlKTB4ZTIsCisgICAgICAgICAgICAoYnl0ZSkweDJiLCAoYnl0ZSkweGMwLCAoYnl0ZSkweDc4LCAoYnl0ZSkweGUwLCAoYnl0ZSkweGExLCAoYnl0ZSkweGI1LCAoYnl0ZSkweGU4LCAoYnl0ZSkweDU0IH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gQ0xFQVJfS0VZX1dFQk0gPSAiX0NMRUFSX0tFWV9XRUJNXyIuZ2V0Qnl0ZXMoKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT05ORUNUSU9OX1JFVFJJRVMgPSAxMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTlVNQkVSX09GX1NFQ1VSRV9TVE9QUyA9IDEwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTTEVFUF9USU1FX01TID0gMTAwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVklERU9fV0lEVEhfQ0VOQyA9IDEyODA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZJREVPX0hFSUdIVF9DRU5DID0gNzIwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWSURFT19XSURUSF9XRUJNID0gMzUyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWSURFT19IRUlHSFRfV0VCTSA9IDI4ODsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVklERU9fV0lEVEhfTVBFRzJUUyA9IDMyMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVklERU9fSEVJR0hUX01QRUcyVFMgPSAyNDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBQTEFZX1RJTUVfTVMgPSBUaW1lVW5pdC5NSUxMSVNFQ09ORFMuY29udmVydCgyNSwgVGltZVVuaXQuU0VDT05EUyk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTUVfVklERU9fQVZDID0gTWVkaWFGb3JtYXQuTUlNRVRZUEVfVklERU9fQVZDOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNSU1FX1ZJREVPX1ZQOCA9IE1lZGlhRm9ybWF0Lk1JTUVUWVBFX1ZJREVPX1ZQODsKKworICAgIC8vIFByb3BlcnR5IEtleXMKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxHT1JJVEhNU19QUk9QRVJUWV9LRVkgPSBNZWRpYURybS5QUk9QRVJUWV9BTEdPUklUSE1TOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9QUk9QRVJUWV9LRVkgPSBNZWRpYURybS5QUk9QRVJUWV9ERVNDUklQVElPTjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVWSUNFSURfUFJPUEVSVFlfS0VZID0gImRldmljZUlkIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5WQUxJRF9QUk9QRVJUWV9LRVkgPSAiaW52YWxpZCBwcm9wZXJ0eSBrZXkiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSVNURU5FUl9URVNUX1NVUFBPUlRfUFJPUEVSVFlfS0VZID0gImxpc3RlbmVyVGVzdFN1cHBvcnQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWRU5ET1JfUFJPUEVSVFlfS0VZID0gTWVkaWFEcm0uUFJPUEVSVFlfVkVORE9SOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX1BST1BFUlRZX0tFWSA9IE1lZGlhRHJtLlBST1BFUlRZX1ZFUlNJT047CisKKyAgICAvLyBFcnJvciBtZXNzYWdlCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUl9NU0dfQ1JZUFRPX1NDSEVNRV9OT1RfU1VQUE9SVEVEID0gIkNyeXB0byBzY2hlbWUgaXMgbm90IHN1cHBvcnRlZCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVcmkgQ0VOQ19BVURJT19VUkwgPSBVcmkucGFyc2UoCisgICAgICAgICAgICAiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3d2bWVkaWEvY2xlYXIvaDI2NC9sbGFtYS9sbGFtYV9hYWNfYXVkaW8ubXA0Iik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVXJpIENFTkNfVklERU9fVVJMID0gVXJpLnBhcnNlKAorICAgICAgICAgICAgImh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS93dm1lZGlhL2NsZWFya2V5L2xsYW1hX2gyNjRfbWFpbl83MjBwXzgwMDAubXA0Iik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVXJpIFdFQk1fVVJMID0gVXJpLnBhcnNlKAorICAgICAgICAgICAgImFuZHJvaWQucmVzb3VyY2U6Ly9hbmRyb2lkLm1lZGlhLmN0cy8iICsgUi5yYXcudmlkZW9fMzIweDI0MF93ZWJtX3ZwOF84MDBrYnBzXzMwZnBzX3ZvcmJpc19zdGVyZW9fMTI4a2Jwc180NDEwMGh6X2NyeXB0KTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVcmkgTVBFRzJUU19TQ1JBTUJMRURfVVJMID0gVXJpLnBhcnNlKAorICAgICAgICAgICAgImFuZHJvaWQucmVzb3VyY2U6Ly9hbmRyb2lkLm1lZGlhLmN0cy8iICsgUi5yYXcuc2VnbWVudDAwMDAwMV9zY3JhbWJsZWQpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVyaSBNUEVHMlRTX0NMRUFSX1VSTCA9IFVyaS5wYXJzZSgKKyAgICAgICAgICAgICJhbmRyb2lkLnJlc291cmNlOi8vYW5kcm9pZC5tZWRpYS5jdHMvIiArIFIucmF3LnNlZ21lbnQwMDAwMDEpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVVJRCBDT01NT05fUFNTSF9TQ0hFTUVfVVVJRCA9CisgICAgICAgICAgICBuZXcgVVVJRCgweDEwNzdlZmVjYzBiMjRkMDJMLCAweGFjZTMzYzFlNTJlMmZiNGJMKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVVUlEIENMRUFSS0VZX1NDSEVNRV9VVUlEID0KKyAgICAgICAgICAgIG5ldyBVVUlEKDB4ZTI3MTlkNThhOTg1YjNjOUwsIDB4NzgxYWIwMzBhZjc4ZDMwZUwpOworCisgICAgcHJpdmF0ZSBieXRlW10gbURybUluaXREYXRhOworICAgIHByaXZhdGUgYnl0ZVtdIG1TZXNzaW9uSWQ7CisgICAgcHJpdmF0ZSBMb29wZXIgbUxvb3BlcjsKKyAgICBwcml2YXRlIE1lZGlhQ29kZWNDbGVhcktleVBsYXllciBtTWVkaWFDb2RlY1BsYXllcjsKKyAgICBwcml2YXRlIE1lZGlhRHJtIG1Ecm0gPSBudWxsOworICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOworICAgIHByaXZhdGUgU3VyZmFjZUhvbGRlciBtU3VyZmFjZUhvbGRlcjsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgIGlmIChmYWxzZSA9PSBkZXZpY2VIYXNNZWRpYURybSgpKSB7CisgICAgICAgICAgICB0ZWFyRG93bigpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNXYXRjaERldmljZSgpIHsKKyAgICAgICAgcmV0dXJuIG1Db250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCkuaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX1dBVENIKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gZGV2aWNlSGFzTWVkaWFEcm0oKSB7CisgICAgICAgIC8vIENsZWFyS2V5IGlzIGludHJvZHVjZWQgYWZ0ZXIgS2l0S2F0LgorICAgICAgICBpZiAoQXBpTGV2ZWxVdGlsLmlzQXRNb3N0KGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTl9DT0RFUy5LSVRLQVQpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXh0cmFjdHMga2V5IGlkcyBmcm9tIHRoZSBwc3NoIGJsb2IgcmV0dXJuZWQgYnkgZ2V0S2V5UmVxdWVzdCgpIGFuZAorICAgICAqIHBsYWNlcyBpdCBpbiBrZXlJZHMuCisgICAgICoga2V5UmVxdWVzdEJsb2IgZm9ybWF0IChzZWN0aW9uIDUuMS4zLjEpOgorICAgICAqIGh0dHBzOi8vZHZjcy53My5vcmcvaGcvaHRtbC1tZWRpYS9yYXctZmlsZS9kZWZhdWx0L2VuY3J5cHRlZC1tZWRpYS9lbmNyeXB0ZWQtbWVkaWEuaHRtbCNjbGVhci1rZXkKKyAgICAgKgorICAgICAqIEByZXR1cm4gc2l6ZSBvZiBrZXlJZHMgdmVjdG9yIHRoYXQgY29udGFpbnMgdGhlIGtleSBpZHMsIDAgZm9yIGVycm9yCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZ2V0S2V5SWRzKGJ5dGVbXSBrZXlSZXF1ZXN0QmxvYiwgVmVjdG9yPFN0cmluZz4ga2V5SWRzKSB7CisgICAgICAgIGlmICgwID09IGtleVJlcXVlc3RCbG9iLmxlbmd0aCB8fCBrZXlJZHMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIFN0cmluZyBqc29uTGljZW5zZVJlcXVlc3QgPSBuZXcgU3RyaW5nKGtleVJlcXVlc3RCbG9iKTsKKyAgICAgICAga2V5SWRzLmNsZWFyKCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEpTT05PYmplY3QgbGljZW5zZSA9IG5ldyBKU09OT2JqZWN0KGpzb25MaWNlbnNlUmVxdWVzdCk7CisgICAgICAgICAgICBmaW5hbCBKU09OQXJyYXkgaWRzID0gbGljZW5zZS5nZXRKU09OQXJyYXkoImtpZHMiKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaWRzLmxlbmd0aCgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBrZXlJZHMuYWRkKGlkcy5nZXRTdHJpbmcoaSkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChKU09ORXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkludmFsaWQgSlNPTiBsaWNlbnNlID0gIiArIGpzb25MaWNlbnNlUmVxdWVzdCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4ga2V5SWRzLnNpemUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIHRoZSBKU09OIFdlYiBLZXkgc3RyaW5nLgorICAgICAqCisgICAgICogQHJldHVybiBKU09OIFdlYiBLZXkgc3RyaW5nLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZUpzb25XZWJLZXlTZXQoVmVjdG9yPFN0cmluZz4ga2V5SWRzLCBWZWN0b3I8U3RyaW5nPiBrZXlzKSB7CisgICAgICAgIFN0cmluZyBqd2tTZXQgPSAie1wia2V5c1wiOlsiOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtleUlkcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgU3RyaW5nIGlkID0gbmV3IFN0cmluZyhrZXlJZHMuZ2V0KGkpLmdldEJ5dGVzKENoYXJzZXQuZm9yTmFtZSgiVVRGLTgiKSkpOworICAgICAgICAgICAgU3RyaW5nIGtleSA9IG5ldyBTdHJpbmcoa2V5cy5nZXQoaSkuZ2V0Qnl0ZXMoQ2hhcnNldC5mb3JOYW1lKCJVVEYtOCIpKSk7CisKKyAgICAgICAgICAgIGp3a1NldCArPSAie1wia3R5XCI6XCJvY3RcIixcImtpZFwiOlwiIiArIGlkICsKKyAgICAgICAgICAgICAgICAgICAgIlwiLFwia1wiOlwiIiArIGtleSArICJcIn0iOworICAgICAgICB9CisgICAgICAgIGp3a1NldCArPSAiXX0iOworICAgICAgICByZXR1cm4gandrU2V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyBjbGVhciBrZXkgaWRzIGZyb20gZ2V0S2V5UmVxdWVzdCgpLCBjcmVhdGUgSlNPTiBXZWIgS2V5CisgICAgICogc2V0IGFuZCBzZW5kIGl0IHRvIHRoZSBDRE0gdmlhIHByb3ZpZGVLZXlSZXNwb25zZSgpLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBnZXRLZXlzKE1lZGlhRHJtIGRybSwgU3RyaW5nIGluaXREYXRhVHlwZSwKKyAgICAgICAgICAgIGJ5dGVbXSBzZXNzaW9uSWQsIGJ5dGVbXSBkcm1Jbml0RGF0YSwgYnl0ZVtdW10gY2xlYXJLZXlzKSB7CisgICAgICAgIE1lZGlhRHJtLktleVJlcXVlc3QgZHJtUmVxdWVzdCA9IG51bGw7OworICAgICAgICB0cnkgeworICAgICAgICAgICAgZHJtUmVxdWVzdCA9IGRybS5nZXRLZXlSZXF1ZXN0KHNlc3Npb25JZCwgZHJtSW5pdERhdGEsIGluaXREYXRhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgTWVkaWFEcm0uS0VZX1RZUEVfU1RSRUFNSU5HLCBudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBMb2cuaShUQUcsICJGYWlsZWQgdG8gZ2V0IGtleSByZXF1ZXN0OiAiICsgZS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZHJtUmVxdWVzdCA9PSBudWxsKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgZ2V0S2V5UmVxdWVzdCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgVmVjdG9yPFN0cmluZz4ga2V5SWRzID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7CisgICAgICAgIGlmICgwID09IGdldEtleUlkcyhkcm1SZXF1ZXN0LmdldERhdGEoKSwga2V5SWRzKSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiTm8ga2V5IGlkcyBmb3VuZCBpbiBpbml0RGF0YSIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNsZWFyS2V5cy5sZW5ndGggIT0ga2V5SWRzLnNpemUoKSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiTWlzbWF0Y2ggbnVtYmVyIG9mIGtleSBpZHMgYW5kIGtleXM6IGlkcz0iICsKKyAgICAgICAgICAgICAgICAgICAga2V5SWRzLnNpemUoKSArICIsIGtleXM9IiArIGNsZWFyS2V5cy5sZW5ndGgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gQmFzZTY0IGVuY29kZXMgY2xlYXJrZXlzLiBLZXlzIGFyZSBrbm93biB0byB0aGUgYXBwbGljYXRpb24uCisgICAgICAgIFZlY3RvcjxTdHJpbmc+IGtleXMgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGVhcktleXMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIFN0cmluZyBjbGVhcktleSA9IEJhc2U2NC5lbmNvZGVUb1N0cmluZyhjbGVhcktleXNbaV0sCisgICAgICAgICAgICAgICAgICAgIEJhc2U2NC5OT19QQURESU5HIHwgQmFzZTY0Lk5PX1dSQVApOworICAgICAgICAgICAga2V5cy5hZGQoY2xlYXJLZXkpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGp3a1NldCA9IGNyZWF0ZUpzb25XZWJLZXlTZXQoa2V5SWRzLCBrZXlzKTsKKyAgICAgICAgYnl0ZVtdIGpzb25SZXNwb25zZSA9IGp3a1NldC5nZXRCeXRlcyhDaGFyc2V0LmZvck5hbWUoIlVURi04IikpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGRybS5wcm92aWRlS2V5UmVzcG9uc2Uoc2Vzc2lvbklkLCBqc29uUmVzcG9uc2UpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgdG8gcHJvdmlkZSBrZXkgcmVzcG9uc2U6ICIgKyBlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byBwcm92aWRlIGtleSByZXNwb25zZTogIiArIGUudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIEBOb25OdWxsIE1lZGlhRHJtIHN0YXJ0RHJtKGZpbmFsIGJ5dGVbXVtdIGNsZWFyS2V5cywgZmluYWwgU3RyaW5nIGluaXREYXRhVHlwZSwgZmluYWwgVVVJRCBkcm1TY2hlbWVVdWlkKSB7CisgICAgICAgIGlmICghTWVkaWFEcm0uaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoZHJtU2NoZW1lVXVpZCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFUlJfTVNHX0NSWVBUT19TQ0hFTUVfTk9UX1NVUFBPUlRFRCk7CisgICAgICAgIH0KKworICAgICAgICBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgaWYgKG1Ecm0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgdG8gc3RhcnREcm06IGFscmVhZHkgc3RhcnRlZCIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIFNldCB1cCBhIGxvb3BlciB0byBoYW5kbGUgZXZlbnRzCisgICAgICAgICAgICAgICAgTG9vcGVyLnByZXBhcmUoKTsKKworICAgICAgICAgICAgICAgIC8vIFNhdmUgdGhlIGxvb3BlciBzbyB0aGF0IHdlIGNhbiB0ZXJtaW5hdGUgdGhpcyB0aHJlYWQKKyAgICAgICAgICAgICAgICAvLyBhZnRlciB3ZSBhcmUgZG9uZSB3aXRoIGl0LgorICAgICAgICAgICAgICAgIG1Mb29wZXIgPSBMb29wZXIubXlMb29wZXIoKTsKKworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG1Ecm0gPSBuZXcgTWVkaWFEcm0oZHJtU2NoZW1lVXVpZCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTWVkaWFEcm1FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgdG8gY3JlYXRlIE1lZGlhRHJtOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkKG1Mb2NrKSB7CisgICAgICAgICAgICAgICAgICAgIG1Ecm0uc2V0T25FdmVudExpc3RlbmVyKG5ldyBNZWRpYURybS5PbkV2ZW50TGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25FdmVudChNZWRpYURybSBtZCwgYnl0ZVtdIHNlc3Npb25JZCwgaW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4dHJhLCBieXRlW10gZGF0YSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQgPT0gTWVkaWFEcm0uRVZFTlRfS0VZX1JFUVVJUkVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJNZWRpYURybSBldmVudDogS2V5IHJlcXVpcmVkIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRLZXlzKG1Ecm0sIGluaXREYXRhVHlwZSwgbVNlc3Npb25JZCwgbURybUluaXREYXRhLCBjbGVhcktleXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50ID09IE1lZGlhRHJtLkVWRU5UX0tFWV9FWFBJUkVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJNZWRpYURybSBldmVudDogS2V5IGV4cGlyZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEtleXMobURybSwgaW5pdERhdGFUeXBlLCBtU2Vzc2lvbklkLCBtRHJtSW5pdERhdGEsIGNsZWFyS2V5cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJFdmVudHMgbm90IHN1cHBvcnRlZCIgKyBldmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2subm90aWZ5KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIExvb3Blci5sb29wKCk7ICAvLyBCbG9ja3MgZm9yZXZlciB1bnRpbCBMb29wZXIucXVpdCgpIGlzIGNhbGxlZC4KKyAgICAgICAgICAgIH0KKyAgICAgICAgfS5zdGFydCgpOworCisgICAgICAgIC8vIHdhaXQgZm9yIG1Ecm0gdG8gYmUgY3JlYXRlZAorICAgICAgICBzeW5jaHJvbml6ZWQobUxvY2spIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbUxvY2sud2FpdCgxMDAwKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1Ecm07CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHN0b3BEcm0oTWVkaWFEcm0gZHJtKSB7CisgICAgICAgIGlmIChkcm0gIT0gbURybSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiaW52YWxpZCBkcm0gc3BlY2lmaWVkIGluIHN0b3BEcm0iKTsKKyAgICAgICAgfQorICAgICAgICBtTG9vcGVyLnF1aXQoKTsKKyAgICAgICAgbURybS5jbG9zZSgpOworICAgICAgICBtRHJtID0gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIEBOb25OdWxsIGJ5dGVbXSBvcGVuU2Vzc2lvbihNZWRpYURybSBkcm0pIHsKKyAgICAgICAgYnl0ZVtdIG1TZXNzaW9uSWQgPSBudWxsOworICAgICAgICBib29sZWFuIG1SZXRyeU9wZW47CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVJldHJ5T3BlbiA9IGZhbHNlOworICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQgPSBkcm0ub3BlblNlc3Npb24oKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbVJldHJ5T3BlbiA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKG1SZXRyeU9wZW4pOworICAgICAgICByZXR1cm4gbVNlc3Npb25JZDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2xvc2VTZXNzaW9uKE1lZGlhRHJtIGRybSwgYnl0ZVtdIHNlc3Npb25JZCkgeworICAgICAgICBkcm0uY2xvc2VTZXNzaW9uKHNlc3Npb25JZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzUmVzb2x1dGlvblN1cHBvcnRlZChTdHJpbmcgbWltZSwgU3RyaW5nW10gZmVhdHVyZXMsCisgICAgICAgICAgICBpbnQgdmlkZW9XaWR0aCwgaW50IHZpZGVvSGVpZ2h0KSB7CisgICAgICAgIGlmIChBcGlMZXZlbFV0aWwuaXNCZWZvcmUoYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OX0NPREVTLkpFTExZX0JFQU4pKSB7CisgICAgICAgICAgICBpZiAgKHZpZGVvSGVpZ2h0IDw9IDE0NCkgeworICAgICAgICAgICAgICAgIHJldHVybiBDYW1jb3JkZXJQcm9maWxlLmhhc1Byb2ZpbGUoQ2FtY29yZGVyUHJvZmlsZS5RVUFMSVRZX1FDSUYpOworICAgICAgICAgICAgfSBlbHNlIGlmICh2aWRlb0hlaWdodCA8PSAyNDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ2FtY29yZGVyUHJvZmlsZS5oYXNQcm9maWxlKENhbWNvcmRlclByb2ZpbGUuUVVBTElUWV9RVkdBKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodmlkZW9IZWlnaHQgPD0gMjg4KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIENhbWNvcmRlclByb2ZpbGUuaGFzUHJvZmlsZShDYW1jb3JkZXJQcm9maWxlLlFVQUxJVFlfQ0lGKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodmlkZW9IZWlnaHQgPD0gNDgwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIENhbWNvcmRlclByb2ZpbGUuaGFzUHJvZmlsZShDYW1jb3JkZXJQcm9maWxlLlFVQUxJVFlfNDgwUCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHZpZGVvSGVpZ2h0IDw9IDcyMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBDYW1jb3JkZXJQcm9maWxlLmhhc1Byb2ZpbGUoQ2FtY29yZGVyUHJvZmlsZS5RVUFMSVRZXzcyMFApOworICAgICAgICAgICAgfSBlbHNlIGlmICh2aWRlb0hlaWdodCA8PSAxMDgwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIENhbWNvcmRlclByb2ZpbGUuaGFzUHJvZmlsZShDYW1jb3JkZXJQcm9maWxlLlFVQUxJVFlfMTA4MFApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBNZWRpYUZvcm1hdCBmb3JtYXQgPSBNZWRpYUZvcm1hdC5jcmVhdGVWaWRlb0Zvcm1hdChtaW1lLCB2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCk7CisgICAgICAgIGZvciAoU3RyaW5nIGZlYXR1cmU6IGZlYXR1cmVzKSB7CisgICAgICAgICAgICBmb3JtYXQuc2V0RmVhdHVyZUVuYWJsZWQoZmVhdHVyZSwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICAgICAgTWVkaWFDb2RlY0xpc3QgbWNsID0gbmV3IE1lZGlhQ29kZWNMaXN0KE1lZGlhQ29kZWNMaXN0LkFMTF9DT0RFQ1MpOworICAgICAgICBpZiAobWNsLmZpbmREZWNvZGVyRm9yRm9ybWF0KGZvcm1hdCkgPT0gbnVsbCkgeworICAgICAgICAgICAgTG9nLmkoVEFHLCAiY291bGQgbm90IGZpbmQgY29kZWMgZm9yICIgKyBmb3JtYXQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIGNsZWFyIGtleSBzeXN0ZW0gcGxheWJhY2suCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RDbGVhcktleVBsYXliYWNrKAorICAgICAgICAgICAgVVVJRCBkcm1TY2hlbWVVdWlkLAorICAgICAgICAgICAgU3RyaW5nIHZpZGVvTWltZSwgU3RyaW5nW10gdmlkZW9GZWF0dXJlcywKKyAgICAgICAgICAgIFN0cmluZyBpbml0RGF0YVR5cGUsIGJ5dGVbXVtdIGNsZWFyS2V5cywKKyAgICAgICAgICAgIFVyaSBhdWRpb1VybCwgYm9vbGVhbiBhdWRpb0VuY3J5cHRlZCwKKyAgICAgICAgICAgIFVyaSB2aWRlb1VybCwgYm9vbGVhbiB2aWRlb0VuY3J5cHRlZCwKKyAgICAgICAgICAgIGludCB2aWRlb1dpZHRoLCBpbnQgdmlkZW9IZWlnaHQsIGJvb2xlYW4gc2NyYW1ibGVkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoaXNXYXRjaERldmljZSgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBNZWRpYURybSBkcm0gPSBudWxsOworICAgICAgICBtU2Vzc2lvbklkID0gbnVsbDsKKyAgICAgICAgaWYgKCFzY3JhbWJsZWQpIHsKKyAgICAgICAgICAgIGRybSA9IHN0YXJ0RHJtKGNsZWFyS2V5cywgaW5pdERhdGFUeXBlLCBkcm1TY2hlbWVVdWlkKTsKKyAgICAgICAgICAgIG1TZXNzaW9uSWQgPSBvcGVuU2Vzc2lvbihkcm0pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFpc1Jlc29sdXRpb25TdXBwb3J0ZWQodmlkZW9NaW1lLCB2aWRlb0ZlYXR1cmVzLCB2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCkpIHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgIkRldmljZSBkb2VzIG5vdCBzdXBwb3J0ICIgKworICAgICAgICAgICAgICAgICAgICB2aWRlb1dpZHRoICsgIngiICsgdmlkZW9IZWlnaHQgKyAiIHJlc29sdXRpb24gZm9yICIgKyB2aWRlb01pbWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgSUNvbm5lY3Rpb25TdGF0dXMgY29ubmVjdGlvblN0YXR1cyA9IG5ldyBDb25uZWN0aW9uU3RhdHVzKG1Db250ZXh0KTsKKyAgICAgICAgaWYgKCFjb25uZWN0aW9uU3RhdHVzLmlzQXZhaWxhYmxlKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiTmV0d29yayBpcyBub3QgYXZhaWxhYmxlLCByZWFzb246ICIgKworICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uU3RhdHVzLmdldE5vdENvbm5lY3RlZFJlYXNvbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIGRldmljZSBpcyBub3Qgb25saW5lLCByZWNoZWNrIHRoZSBzdGF0dXMgYSBmZXcgdGltZXMuCisgICAgICAgIGludCByZXRyaWVzID0gMDsKKyAgICAgICAgd2hpbGUgKCFjb25uZWN0aW9uU3RhdHVzLmlzQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgICAgIGlmIChyZXRyaWVzKysgPj0gQ09OTkVDVElPTl9SRVRSSUVTKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJEZXZpY2UgaXMgbm90IG9ubGluZSwgcmVhc29uOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25TdGF0dXMuZ2V0Tm90Q29ubmVjdGVkUmVhc29uKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25uZWN0aW9uU3RhdHVzLnRlc3RDb25uZWN0aW9uKHZpZGVvVXJsKTsKKworICAgICAgICBtTWVkaWFDb2RlY1BsYXllciA9IG5ldyBNZWRpYUNvZGVjQ2xlYXJLZXlQbGF5ZXIoCisgICAgICAgICAgICAgICAgZ2V0QWN0aXZpdHkoKS5nZXRTdXJmYWNlSG9sZGVyKCksCisgICAgICAgICAgICAgICAgbVNlc3Npb25JZCwgc2NyYW1ibGVkLAorICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFJlc291cmNlcygpKTsKKworICAgICAgICBtTWVkaWFDb2RlY1BsYXllci5zZXRBdWRpb0RhdGFTb3VyY2UoYXVkaW9VcmwsIG51bGwsIGF1ZGlvRW5jcnlwdGVkKTsKKyAgICAgICAgbU1lZGlhQ29kZWNQbGF5ZXIuc2V0VmlkZW9EYXRhU291cmNlKHZpZGVvVXJsLCBudWxsLCB2aWRlb0VuY3J5cHRlZCk7CisgICAgICAgIG1NZWRpYUNvZGVjUGxheWVyLnN0YXJ0KCk7CisgICAgICAgIG1NZWRpYUNvZGVjUGxheWVyLnByZXBhcmUoKTsKKyAgICAgICAgaWYgKCFzY3JhbWJsZWQpIHsKKyAgICAgICAgICAgIG1Ecm1Jbml0RGF0YSA9IG1NZWRpYUNvZGVjUGxheWVyLmdldERybUluaXREYXRhKCk7CisgICAgICAgICAgICBnZXRLZXlzKG1Ecm0sIGluaXREYXRhVHlwZSwgbVNlc3Npb25JZCwgbURybUluaXREYXRhLCBjbGVhcktleXMpOworICAgICAgICB9CisgICAgICAgIC8vIHN0YXJ0cyB2aWRlbyBwbGF5YmFjaworICAgICAgICBtTWVkaWFDb2RlY1BsYXllci5zdGFydFRocmVhZCgpOworCisgICAgICAgIGxvbmcgdGltZU91dCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgUExBWV9USU1FX01TOworICAgICAgICB3aGlsZSAodGltZU91dCA+IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICYmICFtTWVkaWFDb2RlY1BsYXllci5pc0VuZGVkKCkpIHsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTTEVFUF9USU1FX01TKTsKKyAgICAgICAgICAgIGlmIChtTWVkaWFDb2RlY1BsYXllci5nZXRDdXJyZW50UG9zaXRpb24oKSA+PSBtTWVkaWFDb2RlY1BsYXllci5nZXREdXJhdGlvbigpICkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImN1cnJlbnQgcG9zID0gIiArIG1NZWRpYUNvZGVjUGxheWVyLmdldEN1cnJlbnRQb3NpdGlvbigpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICI+PSBkdXJhdGlvbiA9ICIgKyBtTWVkaWFDb2RlY1BsYXllci5nZXREdXJhdGlvbigpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIExvZy5kKFRBRywgInBsYXlWaWRlbyBwbGF5ZXIucmVzZXQoKSIpOworICAgICAgICBtTWVkaWFDb2RlY1BsYXllci5yZXNldCgpOworICAgICAgICBpZiAoIXNjcmFtYmxlZCkgeworICAgICAgICAgICAgY2xvc2VTZXNzaW9uKGRybSwgbVNlc3Npb25JZCk7CisgICAgICAgICAgICBzdG9wRHJtKGRybSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gcXVlcnlLZXlTdGF0dXMoQE5vbk51bGwgZmluYWwgTWVkaWFEcm0gZHJtLCBATm9uTnVsbCBmaW5hbCBieXRlW10gc2Vzc2lvbklkKSB7CisgICAgICAgIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGtleVN0YXR1cyA9IGRybS5xdWVyeUtleVN0YXR1cyhzZXNzaW9uSWQpOworICAgICAgICBpZiAoa2V5U3RhdHVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAicXVlcnlLZXlTdGF0dXM6IGVtcHR5IGtleSBzdGF0dXMiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFNldDxTdHJpbmc+IGtleVNldCA9IGtleVN0YXR1cy5rZXlTZXQoKTsKKyAgICAgICAgZmluYWwgaW50IG51bUtleXMgPSBrZXlTZXQuc2l6ZSgpOworICAgICAgICBmaW5hbCBTdHJpbmdbXSBrZXlzID0ga2V5U2V0LnRvQXJyYXkobmV3IFN0cmluZ1tudW1LZXlzXSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtS2V5czsgKytpKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcga2V5ID0ga2V5c1tpXTsKKyAgICAgICAgICAgIExvZy5pKFRBRywgInF1ZXJ5S2V5U3RhdHVzOiBrZXk9IiArIGtleSArICIsIHZhbHVlPSIgKyBrZXlTdGF0dXMuZ2V0KGtleSkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFF1ZXJ5S2V5U3RhdHVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpc1dhdGNoRGV2aWNlKCkpIHsKKyAgICAgICAgICAgIC8vIHNraXAgdGhpcyB0ZXN0IG9uIHdhdGNoIGJlY2F1c2UgaXQgY2FsbHMKKyAgICAgICAgICAgIC8vIGFkZFRyYWNrIHRoYXQgcmVxdWlyZXMgY29kZWMKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIE1lZGlhRHJtIGRybSA9IHN0YXJ0RHJtKG5ldyBieXRlW11bXSB7IENMRUFSX0tFWV9DRU5DIH0sICJjZW5jIiwKKyAgICAgICAgICAgICAgICBDTEVBUktFWV9TQ0hFTUVfVVVJRCk7CisKKyAgICAgICAgbVNlc3Npb25JZCA9IG9wZW5TZXNzaW9uKGRybSk7CisKKyAgICAgICAgLy8gVGVzdCBkZWZhdWx0IGtleSBzdGF0dXMsIHNob3VsZCBub3QgYmUgZGVmaW5lZAorICAgICAgICBmaW5hbCBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBrZXlTdGF0dXMgPSBkcm0ucXVlcnlLZXlTdGF0dXMobVNlc3Npb25JZCk7CisgICAgICAgIGlmICgha2V5U3RhdHVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgY2xvc2VTZXNzaW9uKGRybSwgbVNlc3Npb25JZCk7CisgICAgICAgICAgICBzdG9wRHJtKGRybSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoInF1ZXJ5IGRlZmF1bHQga2V5IHN0YXR1cyBmYWlsZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRlc3QgdmFsaWQga2V5IHN0YXR1cworICAgICAgICBtTWVkaWFDb2RlY1BsYXllciA9IG5ldyBNZWRpYUNvZGVjQ2xlYXJLZXlQbGF5ZXIoCisgICAgICAgICAgICAgICAgZ2V0QWN0aXZpdHkoKS5nZXRTdXJmYWNlSG9sZGVyKCksCisgICAgICAgICAgICAgICAgbVNlc3Npb25JZCwgZmFsc2UsCisgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkpOworICAgICAgICBtTWVkaWFDb2RlY1BsYXllci5zZXRBdWRpb0RhdGFTb3VyY2UoQ0VOQ19BVURJT19VUkwsIG51bGwsIGZhbHNlKTsKKyAgICAgICAgbU1lZGlhQ29kZWNQbGF5ZXIuc2V0VmlkZW9EYXRhU291cmNlKENFTkNfVklERU9fVVJMLCBudWxsLCB0cnVlKTsKKyAgICAgICAgbU1lZGlhQ29kZWNQbGF5ZXIuc3RhcnQoKTsKKyAgICAgICAgbU1lZGlhQ29kZWNQbGF5ZXIucHJlcGFyZSgpOworCisgICAgICAgIG1Ecm1Jbml0RGF0YSA9IG1NZWRpYUNvZGVjUGxheWVyLmdldERybUluaXREYXRhKCk7CisgICAgICAgIGdldEtleXMoZHJtLCAiY2VuYyIsIG1TZXNzaW9uSWQsIG1Ecm1Jbml0RGF0YSwgbmV3IGJ5dGVbXVtdIHsgQ0xFQVJfS0VZX0NFTkMgfSk7CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9IHRydWU7CisgICAgICAgIGlmICghcXVlcnlLZXlTdGF0dXMoZHJtLCBtU2Vzc2lvbklkKSkgeworICAgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgbU1lZGlhQ29kZWNQbGF5ZXIucmVzZXQoKTsKKyAgICAgICAgY2xvc2VTZXNzaW9uKGRybSwgbVNlc3Npb25JZCk7CisgICAgICAgIHN0b3BEcm0oZHJtKTsKKyAgICAgICAgaWYgKCFzdWNjZXNzKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoInF1ZXJ5IGtleSBzdGF0dXMgZmFpbGVkIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJLZXlQbGF5YmFja0NlbmMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdENsZWFyS2V5UGxheWJhY2soCisgICAgICAgICAgICBDT01NT05fUFNTSF9TQ0hFTUVfVVVJRCwKKyAgICAgICAgICAgIC8vIHVzaW5nIHNlY3VyZSBjb2RlYyBldmVuIHRob3VnaCBpdCBpcyBjbGVhciBrZXkgRFJNCisgICAgICAgICAgICBNSU1FX1ZJREVPX0FWQywgbmV3IFN0cmluZ1tdIHsgQ29kZWNDYXBhYmlsaXRpZXMuRkVBVFVSRV9TZWN1cmVQbGF5YmFjayB9LAorICAgICAgICAgICAgImNlbmMiLCBuZXcgYnl0ZVtdW10geyBDTEVBUl9LRVlfQ0VOQyB9LAorICAgICAgICAgICAgQ0VOQ19BVURJT19VUkwsIGZhbHNlICAvKiBhdWRpb0VuY3J5cHRlZCAqLywKKyAgICAgICAgICAgIENFTkNfVklERU9fVVJMLCB0cnVlIC8qIHZpZGVvRW5jcnlwdGVkICovLAorICAgICAgICAgICAgVklERU9fV0lEVEhfQ0VOQywgVklERU9fSEVJR0hUX0NFTkMsIGZhbHNlIC8qIHNjcmFtYmxlZCAqLyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENsZWFyS2V5UGxheWJhY2tDZW5jMigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0Q2xlYXJLZXlQbGF5YmFjaygKKyAgICAgICAgICAgIENMRUFSS0VZX1NDSEVNRV9VVUlELAorICAgICAgICAgICAgLy8gdXNpbmcgc2VjdXJlIGNvZGVjIGV2ZW4gdGhvdWdoIGl0IGlzIGNsZWFyIGtleSBEUk0KKyAgICAgICAgICAgIE1JTUVfVklERU9fQVZDLCBuZXcgU3RyaW5nW10geyBDb2RlY0NhcGFiaWxpdGllcy5GRUFUVVJFX1NlY3VyZVBsYXliYWNrIH0sCisgICAgICAgICAgICAiY2VuYyIsIG5ldyBieXRlW11bXSB7IENMRUFSX0tFWV9DRU5DIH0sCisgICAgICAgICAgICBDRU5DX0FVRElPX1VSTCwgZmFsc2UgLyogYXVkaW9FbmNyeXB0ZWQgKi8gLAorICAgICAgICAgICAgQ0VOQ19WSURFT19VUkwsIHRydWUgLyogdmlkZW9FbmNyeXB0ZWQgKi8sCisgICAgICAgICAgICBWSURFT19XSURUSF9DRU5DLCBWSURFT19IRUlHSFRfQ0VOQywgZmFsc2UgLyogc2NyYW1ibGVkICovKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJLZXlQbGF5YmFja1dlYm0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdENsZWFyS2V5UGxheWJhY2soCisgICAgICAgICAgICBDTEVBUktFWV9TQ0hFTUVfVVVJRCwKKyAgICAgICAgICAgIE1JTUVfVklERU9fVlA4LCBuZXcgU3RyaW5nWzBdLAorICAgICAgICAgICAgIndlYm0iLCBuZXcgYnl0ZVtdW10geyBDTEVBUl9LRVlfV0VCTSB9LAorICAgICAgICAgICAgV0VCTV9VUkwsIHRydWUgLyogYXVkaW9FbmNyeXB0ZWQgKi8sCisgICAgICAgICAgICBXRUJNX1VSTCwgdHJ1ZSAvKiB2aWRlb0VuY3J5cHRlZCAqLywKKyAgICAgICAgICAgIFZJREVPX1dJRFRIX1dFQk0sIFZJREVPX0hFSUdIVF9XRUJNLCBmYWxzZSAvKiBzY3JhbWJsZWQgKi8pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDbGVhcktleVBsYXliYWNrTXBlZzJ0cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgTG9nLmUoVEFHLCAidGVzdENsZWFyS2V5UGxheWJhY2tNcGVnMnRzIC0gY2hlY2sgYmVmb3JlIHJldHVybiAiKTsKKyAgICAgICAgICAgIGlmIChpc0xvd1JhbSgpJiYgIWlzVFYoKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgTG9nLmUoVEFHLCAidGVzdENsZWFyS2V5UGxheWJhY2tNcGVnMnRzIC0gY2hlY2sgYWZ0ZXIgcmV0dXJuICIpOworICAgICAgICB0ZXN0Q2xlYXJLZXlQbGF5YmFjaygKKyAgICAgICAgICAgIENMRUFSS0VZX1NDSEVNRV9VVUlELAorICAgICAgICAgICAgTUlNRV9WSURFT19BVkMsIG5ldyBTdHJpbmdbMF0sCisgICAgICAgICAgICAibXBlZzJ0cyIsIG51bGwsCisgICAgICAgICAgICBNUEVHMlRTX1NDUkFNQkxFRF9VUkwsIGZhbHNlIC8qIGF1ZGlvRW5jcnlwdGVkICovLAorICAgICAgICAgICAgTVBFRzJUU19TQ1JBTUJMRURfVVJMLCBmYWxzZSAvKiB2aWRlb0VuY3J5cHRlZCAqLywKKyAgICAgICAgICAgIFZJREVPX1dJRFRIX01QRUcyVFMsIFZJREVPX0hFSUdIVF9NUEVHMlRTLCB0cnVlIC8qIHNjcmFtYmxlZCAqLyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFBsYXliYWNrTXBlZzJ0cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0Q2xlYXJLZXlQbGF5YmFjaygKKyAgICAgICAgICAgIENMRUFSS0VZX1NDSEVNRV9VVUlELAorICAgICAgICAgICAgTUlNRV9WSURFT19BVkMsIG5ldyBTdHJpbmdbMF0sCisgICAgICAgICAgICAibXBlZzJ0cyIsIG51bGwsCisgICAgICAgICAgICBNUEVHMlRTX0NMRUFSX1VSTCwgZmFsc2UgLyogYXVkaW9FbmNyeXB0ZWQgKi8sCisgICAgICAgICAgICBNUEVHMlRTX0NMRUFSX1VSTCwgZmFsc2UgLyogdmlkZW9FbmNyeXB0ZWQgKi8sCisgICAgICAgICAgICBWSURFT19XSURUSF9NUEVHMlRTLCBWSURFT19IRUlHSFRfTVBFRzJUUywgZmFsc2UgLyogc2NyYW1ibGVkICovKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRTdHJpbmdQcm9wZXJ0eShmaW5hbCBNZWRpYURybSBkcm0sICBmaW5hbCBTdHJpbmcga2V5KSB7CisgICAgICAgIFN0cmluZyB2YWx1ZSA9ICIiOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdmFsdWUgPSBkcm0uZ2V0UHJvcGVydHlTdHJpbmcoa2V5KTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIEV4cGVjdGVkIGV4Y2VwdGlvbiBmb3IgaW52YWxpZCBrZXkKKyAgICAgICAgICAgIExvZy5kKFRBRywgIkV4cGVjdGVkIHJlc3VsdDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlLmdldE1lc3NhZ2UoKSArICItIiArIGtleSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIHByaXZhdGUgYnl0ZVtdIGdldEJ5dGVBcnJheVByb3BlcnR5KGZpbmFsIE1lZGlhRHJtIGRybSwgIGZpbmFsIFN0cmluZyBrZXkpIHsKKyAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbMF07CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBieXRlcyA9IGRybS5nZXRQcm9wZXJ0eUJ5dGVBcnJheShrZXkpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gRXhwZWN0ZWQgZXhjZXB0aW9uIGZvciBpbnZhbGlkIGtleQorICAgICAgICAgICAgTG9nLmQoVEFHLCAiRXhwZWN0ZWQ6ICIgKyBlLmdldE1lc3NhZ2UoKSArICIgLSAiICsga2V5KTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlLmdldE1lc3NhZ2UoKSArICItIiArIGtleSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ5dGVzOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRTdHJpbmdQcm9wZXJ0eShmaW5hbCBNZWRpYURybSBkcm0sIGZpbmFsIFN0cmluZyBrZXksIGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZHJtLnNldFByb3BlcnR5U3RyaW5nKGtleSwgdmFsdWUpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gRXhwZWN0ZWQgZXhjZXB0aW9uIGZvciBpbnZhbGlkIGtleQorICAgICAgICAgICAgTG9nLmQoVEFHLCAiRXhwZWN0ZWQ6ICIgKyBlLmdldE1lc3NhZ2UoKSArICIgLSAiICsga2V5KTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlLmdldE1lc3NhZ2UoKSArICItIiArIGtleSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0Qnl0ZUFycmF5UHJvcGVydHkoZmluYWwgTWVkaWFEcm0gZHJtLCBmaW5hbCBTdHJpbmcga2V5LCBmaW5hbCBieXRlW10gYnl0ZXMpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGRybS5zZXRQcm9wZXJ0eUJ5dGVBcnJheShrZXksIGJ5dGVzKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIEV4cGVjdGVkIGV4Y2VwdGlvbiBmb3IgaW52YWxpZCBrZXkKKyAgICAgICAgICAgIExvZy5kKFRBRywgIkV4cGVjdGVkOiAiICsgZS5nZXRNZXNzYWdlKCkgKyAiIC0gIiArIGtleSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZS5nZXRNZXNzYWdlKCkgKyAiLSIgKyBrZXkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldFByb3BlcnRpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHdhdGNoSGFzTm9DbGVhcmtleVN1cHBvcnQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgTWVkaWFEcm0gZHJtID0gc3RhcnREcm0obmV3IGJ5dGVbXVtdIHsgQ0xFQVJfS0VZX0NFTkMgfSwKKyAgICAgICAgICAgICAgICAiY2VuYyIsIENMRUFSS0VZX1NDSEVNRV9VVUlEKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyB0ZXN0cyB3aWxsIG5vdCB2ZXJpZnkgdGhlIHZhbHVlIHdlIGFyZSBnZXR0aW5nCisgICAgICAgICAgICAvLyBiYWNrIHNpbmNlIGl0IGNvdWxkIGNoYW5nZSBpbiB0aGUgZnV0dXJlLgorICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gc0tleXMgPSB7CisgICAgICAgICAgICAgICAgICAgIERFU0NSSVBUSU9OX1BST1BFUlRZX0tFWSwgTElTVEVORVJfVEVTVF9TVVBQT1JUX1BST1BFUlRZX0tFWSwKKyAgICAgICAgICAgICAgICAgICAgVkVORE9SX1BST1BFUlRZX0tFWSwgVkVSU0lPTl9QUk9QRVJUWV9LRVl9OworICAgICAgICAgICAgU3RyaW5nIHZhbHVlOworICAgICAgICAgICAgZm9yIChTdHJpbmcga2V5IDogc0tleXMpIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGdldFN0cmluZ1Byb3BlcnR5KGRybSwga2V5KTsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJnZXRQcm9wZXJ0eVN0cmluZyByZXR1cm5zOiAiICsga2V5ICsgIiwgIiArIHZhbHVlKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiRmFpbGVkIHRvIGdldCBwcm9wZXJ0eSBmb3I6ICIgKyBrZXkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNhbm5vdEhhbmRsZUdldFByb3BlcnR5Qnl0ZUFycmF5KGRybSkpIHsKKyAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJTa2lwcGluZyB0ZXN0R2V0UHJvcGVydGllczogYnl0ZSBhcnJheSBwcm9wZXJ0aWVzIG5vdCBpbXBsZW1lbnRlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJvbiBkZXZpY2VzIGxhdW5jaGVkIGJlZm9yZSBQIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBieXRlW10gYnl0ZXMgPSBnZXRCeXRlQXJyYXlQcm9wZXJ0eShkcm0sIERFVklDRUlEX1BST1BFUlRZX0tFWSk7CisgICAgICAgICAgICBpZiAoMCA9PSBieXRlcy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkZhaWxlZCB0byBnZXQgcHJvcGVydHkgZm9yOiAiICsgREVWSUNFSURfUFJPUEVSVFlfS0VZKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVGVzdCB3aXRoIGFuIGludmFsaWQgcHJvcGVydHkga2V5LgorICAgICAgICAgICAgdmFsdWUgPSBnZXRTdHJpbmdQcm9wZXJ0eShkcm0sIElOVkFMSURfUFJPUEVSVFlfS0VZKTsKKyAgICAgICAgICAgIGJ5dGVzID0gZ2V0Qnl0ZUFycmF5UHJvcGVydHkoZHJtLCBJTlZBTElEX1BST1BFUlRZX0tFWSk7CisgICAgICAgICAgICBpZiAoIXZhbHVlLmlzRW1wdHkoKSB8fCAwICE9IGJ5dGVzLmxlbmd0aCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiZ2V0IHByb3BlcnR5IGZhaWxlZCB1c2luZyBhbiBpbnZhbGlkIHByb3BlcnR5IGtleSIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgc3RvcERybShkcm0pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNldFByb3BlcnRpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHdhdGNoSGFzTm9DbGVhcmtleVN1cHBvcnQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgTWVkaWFEcm0gZHJtID0gc3RhcnREcm0obmV3IGJ5dGVbXVtde0NMRUFSX0tFWV9DRU5DfSwKKyAgICAgICAgICAgICAgICAiY2VuYyIsIENMRUFSS0VZX1NDSEVNRV9VVUlEKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGNhbm5vdEhhbmRsZVNldFByb3BlcnR5U3RyaW5nKGRybSkpIHsKKyAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJTa2lwcGluZyB0ZXN0U2V0UHJvcGVydGllczogc2V0IHByb3BlcnR5IHN0cmluZyBub3QgaW1wbGVtZW50ZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAib24gZGV2aWNlcyBsYXVuY2hlZCBiZWZvcmUgUCIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVGVzdCBzZXR0aW5nIHByZWRlZmluZWQgc3RyaW5nIHByb3BlcnR5CisgICAgICAgICAgICAvLyAtIFNhdmUgdGhlIHZhbHVlIHRvIGJlIHJlc3RvcmVkIGxhdGVyCisgICAgICAgICAgICAvLyAtIFNldCB0aGUgcHJvcGVydHkgdmFsdWUKKyAgICAgICAgICAgIC8vIC0gQ2hlY2sgdGhlIHZhbHVlIHRoYXQgd2FzIHNldAorICAgICAgICAgICAgLy8gLSBSZXN0b3JlIHByZXZpb3VzIHZhbHVlCisgICAgICAgICAgICBTdHJpbmcgbGlzdGVuZXJUZXN0U3VwcG9ydCA9IGdldFN0cmluZ1Byb3BlcnR5KGRybSwgTElTVEVORVJfVEVTVF9TVVBQT1JUX1BST1BFUlRZX0tFWSk7CisKKyAgICAgICAgICAgIHNldFN0cmluZ1Byb3BlcnR5KGRybSwgTElTVEVORVJfVEVTVF9TVVBQT1JUX1BST1BFUlRZX0tFWSwgInRlc3RpbmciKTsKKworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gZ2V0U3RyaW5nUHJvcGVydHkoZHJtLCBMSVNURU5FUl9URVNUX1NVUFBPUlRfUFJPUEVSVFlfS0VZKTsKKyAgICAgICAgICAgIGlmICghdmFsdWUuZXF1YWxzKCJ0ZXN0aW5nIikpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkZhaWxlZCB0byBzZXQgcHJvcGVydHk6ICIgKyBMSVNURU5FUl9URVNUX1NVUFBPUlRfUFJPUEVSVFlfS0VZKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2V0U3RyaW5nUHJvcGVydHkoZHJtLCBMSVNURU5FUl9URVNUX1NVUFBPUlRfUFJPUEVSVFlfS0VZLCBsaXN0ZW5lclRlc3RTdXBwb3J0KTsKKworICAgICAgICAgICAgLy8gVGVzdCBzZXR0aW5nIGltbXV0YWJsZSBwcm9wZXJ0aWVzCisgICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBkZWZhdWx0SW1tdXRhYmxlUHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworICAgICAgICAgICAgZGVmYXVsdEltbXV0YWJsZVByb3BlcnRpZXMucHV0KEFMR09SSVRITVNfUFJPUEVSVFlfS0VZLAorICAgICAgICAgICAgICAgICAgICBnZXRTdHJpbmdQcm9wZXJ0eShkcm0sIEFMR09SSVRITVNfUFJPUEVSVFlfS0VZKSk7CisgICAgICAgICAgICBkZWZhdWx0SW1tdXRhYmxlUHJvcGVydGllcy5wdXQoREVTQ1JJUFRJT05fUFJPUEVSVFlfS0VZLAorICAgICAgICAgICAgICAgICAgICBnZXRTdHJpbmdQcm9wZXJ0eShkcm0sIERFU0NSSVBUSU9OX1BST1BFUlRZX0tFWSkpOworICAgICAgICAgICAgZGVmYXVsdEltbXV0YWJsZVByb3BlcnRpZXMucHV0KFZFTkRPUl9QUk9QRVJUWV9LRVksCisgICAgICAgICAgICAgICAgICAgIGdldFN0cmluZ1Byb3BlcnR5KGRybSwgVkVORE9SX1BST1BFUlRZX0tFWSkpOworICAgICAgICAgICAgZGVmYXVsdEltbXV0YWJsZVByb3BlcnRpZXMucHV0KFZFUlNJT05fUFJPUEVSVFlfS0VZLAorICAgICAgICAgICAgICAgICAgICBnZXRTdHJpbmdQcm9wZXJ0eShkcm0sIFZFUlNJT05fUFJPUEVSVFlfS0VZKSk7CisKKyAgICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGltbXV0YWJsZVByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAgICAgICAgIGltbXV0YWJsZVByb3BlcnRpZXMucHV0KEFMR09SSVRITVNfUFJPUEVSVFlfS0VZLCAiYnJ1dGUgZm9yY2UiKTsKKyAgICAgICAgICAgIGltbXV0YWJsZVByb3BlcnRpZXMucHV0KERFU0NSSVBUSU9OX1BST1BFUlRZX0tFWSwgInRlc3Rpbmcgb25seSIpOworICAgICAgICAgICAgaW1tdXRhYmxlUHJvcGVydGllcy5wdXQoVkVORE9SX1BST1BFUlRZX0tFWSwgIm15IEdvb2dsZSIpOworICAgICAgICAgICAgaW1tdXRhYmxlUHJvcGVydGllcy5wdXQoVkVSU0lPTl9QUk9QRVJUWV9LRVksICJ1bmRlZmluZWQiKTsKKworICAgICAgICAgICAgZm9yIChTdHJpbmcga2V5IDogaW1tdXRhYmxlUHJvcGVydGllcy5rZXlTZXQoKSkgeworICAgICAgICAgICAgICAgIHNldFN0cmluZ1Byb3BlcnR5KGRybSwga2V5LCBpbW11dGFibGVQcm9wZXJ0aWVzLmdldChrZXkpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVmVyaWZ5IHRoZSBpbW11dGFibGUgcHJvcGVydGllcyBoYXZlIG5vdCBiZWVuIHNldAorICAgICAgICAgICAgZm9yIChTdHJpbmcga2V5IDogaW1tdXRhYmxlUHJvcGVydGllcy5rZXlTZXQoKSkgeworICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0U3RyaW5nUHJvcGVydHkoZHJtLCBrZXkpOworICAgICAgICAgICAgICAgIGlmICghZGVmYXVsdEltbXV0YWJsZVByb3BlcnRpZXMuZ2V0KGtleSkuZXF1YWxzKGdldFN0cmluZ1Byb3BlcnR5KGRybSwga2V5KSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJJbW11dGFibGUgcHJvcGVydHkgaGFzIGNoYW5nZWQsIGtleT0iICsga2V5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRlc3Qgc2V0UHJvcGVydHlCeXRlQXJyYXkgZm9yIGltbXV0YWJsZSBwcm9wZXJ0eQorICAgICAgICAgICAgZmluYWwgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbXSB7CisgICAgICAgICAgICAgICAgICAgIDB4ZiwgMHhlLCAweGQsIDB4YywgMHhiLCAweGEsIDB4OSwgMHg4LAorICAgICAgICAgICAgICAgICAgICAweDcsIDB4NiwgMHg1LCAweDQsIDB4MywgMHgyLCAweDEsIDB4MH07CisKKyAgICAgICAgICAgIGZpbmFsIGJ5dGVbXSBkZXZpY2VJZCA9IGdldEJ5dGVBcnJheVByb3BlcnR5KGRybSwgREVWSUNFSURfUFJPUEVSVFlfS0VZKTsKKworICAgICAgICAgICAgc2V0Qnl0ZUFycmF5UHJvcGVydHkoZHJtLCBERVZJQ0VJRF9QUk9QRVJUWV9LRVksIGJ5dGVzKTsKKworICAgICAgICAgICAgLy8gVmVyaWZ5IGRldmljZUlkIGhhcyBub3QgY2hhbmdlZAorICAgICAgICAgICAgaWYgKCFBcnJheXMuZXF1YWxzKGRldmljZUlkLCBnZXRCeXRlQXJyYXlQcm9wZXJ0eShkcm0sIERFVklDRUlEX1BST1BFUlRZX0tFWSkpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJGYWlsZWQgdG8gc2V0IGJ5dGUgYXJyYXkgZm9yIGtleT0iICsgREVWSUNFSURfUFJPUEVSVFlfS0VZKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHN0b3BEcm0oZHJtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBDTEVBUktFWV9NQVhfU0VTU0lPTlMgPSAxMDsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXROdW1iZXJPZlNlc3Npb25zKCkgeworICAgICAgICBpZiAod2F0Y2hIYXNOb0NsZWFya2V5U3VwcG9ydCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBNZWRpYURybSBkcm0gPSBzdGFydERybShuZXcgYnl0ZVtdW10geyBDTEVBUl9LRVlfQ0VOQyB9LAorICAgICAgICAgICAgICAgICJjZW5jIiwgQ0xFQVJLRVlfU0NIRU1FX1VVSUQpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoZ2V0Q2xlYXJrZXlWZXJzaW9uKGRybSkuZXF1YWxzKCIxLjAiKSkgeworICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIlNraXBwaW5nIHRlc3RHZXROdW1iZXJPZlNlc3Npb25zOiBub3Qgc3VwcG9ydGVkIGJ5IGNsZWFya2V5IDEuMCIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IG1heFNlc3Npb25Db3VudCA9IGRybS5nZXRNYXhTZXNzaW9uQ291bnQoKTsKKyAgICAgICAgICAgIGlmIChtYXhTZXNzaW9uQ291bnQgIT0gQ0xFQVJLRVlfTUFYX1NFU1NJT05TKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJleHBlY3RlZCBtYXggc2Vzc2lvbiBjb3VudCB0byBiZSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIENMRUFSS0VZX01BWF9TRVNTSU9OUyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgaW5pdGlhbE9wZW5TZXNzaW9uQ291bnQgPSBkcm0uZ2V0T3BlblNlc3Npb25Db3VudCgpOworICAgICAgICAgICAgaWYgKGluaXRpYWxPcGVuU2Vzc2lvbkNvdW50ID09IG1heFNlc3Npb25Db3VudCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiYWxsIHNlc3Npb25zIG9wZW4sIGNhbid0IGRvIGluY3JlbWVudCB0ZXN0Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtU2Vzc2lvbklkID0gb3BlblNlc3Npb24oZHJtKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKGRybS5nZXRPcGVuU2Vzc2lvbkNvdW50KCkgIT0gaW5pdGlhbE9wZW5TZXNzaW9uQ291bnQgKyAxKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigib3BlblNlc3Npb25Db3VudCBkaWRuJ3QgaW5jcmVtZW50Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBjbG9zZVNlc3Npb24oZHJtLCBtU2Vzc2lvbklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHN0b3BEcm0oZHJtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RIZGNwTGV2ZWxzKCkgeworICAgICAgICBpZiAod2F0Y2hIYXNOb0NsZWFya2V5U3VwcG9ydCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBNZWRpYURybSBkcm0gPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZHJtID0gbmV3IE1lZGlhRHJtKENMRUFSS0VZX1NDSEVNRV9VVUlEKTsKKworICAgICAgICAgICAgaWYgKGdldENsZWFya2V5VmVyc2lvbihkcm0pLmVxdWFscygiMS4wIikpIHsKKyAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJTa2lwcGluZyB0ZXN0SGRjcExldmVsczogbm90IHN1cHBvcnRlZCBieSBjbGVhcmtleSAxLjAiKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChkcm0uZ2V0Q29ubmVjdGVkSGRjcExldmVsKCkgIT0gTWVkaWFEcm0uSERDUF9OT05FKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJleHBlY3RlZCBjb25uZWN0ZWQgaGRjcCBsZXZlbCB0byBiZSBIRENQX05PTkUiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGRybS5nZXRNYXhIZGNwTGV2ZWwoKSAhPSBNZWRpYURybS5IRENQX05PX0RJR0lUQUxfT1VUUFVUKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJleHBlY3RlZCBtYXggaGRjcCBsZXZlbCB0byBiZSBIRENQX05PX0RJR0lUQUxfT1VUUFVUIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiVW5leHBlY3RlZCBleGNlcHRpb24gIiwgZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoZHJtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBkcm0uY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTZWN1cml0eUxldmVscygpIHsKKyAgICAgICAgaWYgKHdhdGNoSGFzTm9DbGVhcmtleVN1cHBvcnQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgTWVkaWFEcm0gZHJtID0gbnVsbDsKKyAgICAgICAgYnl0ZVtdIHNlc3Npb25JZCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBkcm0gPSBuZXcgTWVkaWFEcm0oQ0xFQVJLRVlfU0NIRU1FX1VVSUQpOworCisgICAgICAgICAgICBpZiAoZ2V0Q2xlYXJrZXlWZXJzaW9uKGRybSkuZXF1YWxzKCIxLjAiKSkgeworICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIlNraXBwaW5nIHRlc3RTZWN1cml0eUxldmVsczogbm90IHN1cHBvcnRlZCBieSBjbGVhcmtleSAxLjAiKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNlc3Npb25JZCA9IGRybS5vcGVuU2Vzc2lvbihNZWRpYURybS5TRUNVUklUWV9MRVZFTF9TV19TRUNVUkVfQ1JZUFRPKTsKKyAgICAgICAgICAgIGlmIChkcm0uZ2V0U2VjdXJpdHlMZXZlbChzZXNzaW9uSWQpICE9IE1lZGlhRHJtLlNFQ1VSSVRZX0xFVkVMX1NXX1NFQ1VSRV9DUllQVE8pIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImV4cGVjdGVkIHNlY3VyaXR5IGxldmVsIHRvIGJlIFNFQ1VSSVRZX0xFVkVMX1NXX1NFQ1VSRV9DUllQVE8iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRybS5jbG9zZVNlc3Npb24oc2Vzc2lvbklkKTsKKyAgICAgICAgICAgIHNlc3Npb25JZCA9IG51bGw7CisKKyAgICAgICAgICAgIHNlc3Npb25JZCA9IGRybS5vcGVuU2Vzc2lvbigpOworICAgICAgICAgICAgaWYgKGRybS5nZXRTZWN1cml0eUxldmVsKHNlc3Npb25JZCkgIT0gTWVkaWFEcm0uU0VDVVJJVFlfTEVWRUxfU1dfU0VDVVJFX0NSWVBUTykgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiZXhwZWN0ZWQgc2VjdXJpdHkgbGV2ZWwgdG8gYmUgU0VDVVJJVFlfTEVWRUxfU1dfU0VDVVJFX0NSWVBUTyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZHJtLmNsb3NlU2Vzc2lvbihzZXNzaW9uSWQpOworICAgICAgICAgICAgc2Vzc2lvbklkID0gbnVsbDsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzZXNzaW9uSWQgPSBkcm0ub3BlblNlc3Npb24oTWVkaWFEcm0uU0VDVVJJVFlfTEVWRUxfU1dfU0VDVVJFX0RFQ09ERSk7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8qIGNhdWdodCBleHBlY3RlZCBleGNlcHRpb24gKi8KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbiAoImRpZCd0IGdldCBleHBlY3RlZCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgd2hpbGUgb3BlbmluZyBhIHNlc3Npb24gd2l0aCBkaXNhbGxvd2VkIHNlY3VyaXR5IGxldmVsIik7CisgICAgICAgICAgICB9IGZpbmFsbHkgIHsKKyAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbklkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZHJtLmNsb3NlU2Vzc2lvbihzZXNzaW9uSWQpOworICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiAiLCBlKTsKKyAgICAgICAgfSBmaW5hbGx5ICB7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbklkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBkcm0uY2xvc2VTZXNzaW9uKHNlc3Npb25JZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZHJtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBkcm0uY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VjdXJlU3RvcCgpIHsKKyAgICAgICAgaWYgKHdhdGNoSGFzTm9DbGVhcmtleVN1cHBvcnQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgTWVkaWFEcm0gZHJtID0gc3RhcnREcm0obmV3IGJ5dGVbXVtdIHtDTEVBUl9LRVlfQ0VOQ30sICJjZW5jIiwgQ0xFQVJLRVlfU0NIRU1FX1VVSUQpOworCisgICAgICAgIGJ5dGVbXSBzZXNzaW9uSWQgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGdldENsZWFya2V5VmVyc2lvbihkcm0pLmVxdWFscygiMS4wIikpIHsKKyAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJTa2lwcGluZyB0ZXN0U2VjdXJlU3RvcDogbm90IHN1cHBvcnRlZCBpbiBDbGVhcktleSB2MS4wIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkcm0ucmVtb3ZlQWxsU2VjdXJlU3RvcHMoKTsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIlRlc3QgZ2V0U2VjdXJlU3RvcHMgZnJvbSBhbiBlbXB0eSBsaXN0LiIpOworICAgICAgICAgICAgTGlzdDxieXRlW10+IHNlY3VyZVN0b3BzID0gZHJtLmdldFNlY3VyZVN0b3BzKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHNlY3VyZVN0b3BzLmlzRW1wdHkoKSk7CisKKyAgICAgICAgICAgIExvZy5kKFRBRywgIlRlc3QgZ2V0U2VjdXJlU3RvcElkcyBmcm9tIGFuIGVtcHR5IGxpc3QuIik7CisgICAgICAgICAgICBMaXN0PGJ5dGVbXT4gc2VjdXJlU3RvcElkcyA9IGRybS5nZXRTZWN1cmVTdG9wSWRzKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHNlY3VyZVN0b3BJZHMuaXNFbXB0eSgpKTsKKworICAgICAgICAgICAgbVNlc3Npb25JZCA9IG9wZW5TZXNzaW9uKGRybSk7CisKKyAgICAgICAgICAgIG1NZWRpYUNvZGVjUGxheWVyID0gbmV3IE1lZGlhQ29kZWNDbGVhcktleVBsYXllcigKKyAgICAgICAgICAgICAgICAgICAgZ2V0QWN0aXZpdHkoKS5nZXRTdXJmYWNlSG9sZGVyKCksIG1TZXNzaW9uSWQsIGZhbHNlLCBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKSk7CisgICAgICAgICAgICBtTWVkaWFDb2RlY1BsYXllci5zZXRBdWRpb0RhdGFTb3VyY2UoQ0VOQ19BVURJT19VUkwsIG51bGwsIGZhbHNlKTsKKyAgICAgICAgICAgIG1NZWRpYUNvZGVjUGxheWVyLnNldFZpZGVvRGF0YVNvdXJjZShDRU5DX1ZJREVPX1VSTCwgbnVsbCwgdHJ1ZSk7CisgICAgICAgICAgICBtTWVkaWFDb2RlY1BsYXllci5zdGFydCgpOworICAgICAgICAgICAgbU1lZGlhQ29kZWNQbGF5ZXIucHJlcGFyZSgpOworICAgICAgICAgICAgbURybUluaXREYXRhID0gbU1lZGlhQ29kZWNQbGF5ZXIuZ2V0RHJtSW5pdERhdGEoKTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1CRVJfT0ZfU0VDVVJFX1NUT1BTOyArK2kpIHsKKyAgICAgICAgICAgICAgICBnZXRLZXlzKGRybSwgImNlbmMiLCBtU2Vzc2lvbklkLCBtRHJtSW5pdERhdGEsIG5ldyBieXRlW11bXSB7Q0xFQVJfS0VZX0NFTkN9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExvZy5kKFRBRywgIlRlc3QgZ2V0U2VjdXJlU3RvcHMuIik7CisgICAgICAgICAgICBzZWN1cmVTdG9wcyA9IGRybS5nZXRTZWN1cmVTdG9wcygpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKE5VTUJFUl9PRl9TRUNVUkVfU1RPUFMsIHNlY3VyZVN0b3BzLnNpemUoKSk7CisKKyAgICAgICAgICAgIExvZy5kKFRBRywgIlRlc3QgZ2V0U2VjdXJlU3RvcElkcy4iKTsKKyAgICAgICAgICAgIHNlY3VyZVN0b3BJZHMgPSBkcm0uZ2V0U2VjdXJlU3RvcElkcygpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKE5VTUJFUl9PRl9TRUNVUkVfU1RPUFMsIHNlY3VyZVN0b3BJZHMuc2l6ZSgpKTsKKworICAgICAgICAgICAgTG9nLmQoVEFHLCAiVGVzdCBnZXRTZWN1cmVTdG9wIHVzaW5nIHNlY3VyZSBzdG9wIElkcy4iKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VjdXJlU3RvcHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBieXRlW10gc2VjdXJlU3RvcCA9IGRybS5nZXRTZWN1cmVTdG9wKHNlY3VyZVN0b3BJZHMuZ2V0KGkpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoc2VjdXJlU3RvcHMuZ2V0KGkpLCBzZWN1cmVTdG9wKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIExvZy5kKFRBRywgIlRlc3QgcmVtb3ZlU2VjdXJlU3RvcCBnaXZlbiBhIHNlY3VyZSBzdG9wIElkLiIpOworICAgICAgICAgICAgZHJtLnJlbW92ZVNlY3VyZVN0b3Aoc2VjdXJlU3RvcElkcy5nZXQoTlVNQkVSX09GX1NFQ1VSRV9TVE9QUyAtIDEpKTsKKyAgICAgICAgICAgIHNlY3VyZVN0b3BzID0gZHJtLmdldFNlY3VyZVN0b3BzKCk7CisgICAgICAgICAgICBzZWN1cmVTdG9wSWRzID0gZHJtLmdldFNlY3VyZVN0b3BJZHMoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhOVU1CRVJfT0ZfU0VDVVJFX1NUT1BTIC0gMSwgc2VjdXJlU3RvcHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhOVU1CRVJfT0ZfU0VDVVJFX1NUT1BTIC0gMSwgc2VjdXJlU3RvcElkcy5zaXplKCkpOworCisgICAgICAgICAgICBMb2cuZChUQUcsICJUZXN0IHJlbGVhc2VTZWN1cmVTdG9wcyBnaXZlbiBhIHJlbGVhc2UgbWVzc2FnZS4iKTsKKyAgICAgICAgICAgIC8vIFNpbXVsYXRlIHNlcnZlciByZXNwb25zZSBtZXNzYWdlIGJ5IHJlbW92aW5nCisgICAgICAgICAgICAvLyBldmVyeSBvdGhlciBzZWN1cmUgc3RvcHMgdG8gbWFrZSBpdCBpbnRlcmVzdGluZy4KKyAgICAgICAgICAgIExpc3Q8Ynl0ZVtdPiByZWxlYXNlTGlzdCA9IG5ldyBBcnJheUxpc3Q8Ynl0ZVtdPigpOworICAgICAgICAgICAgaW50IHJlbGVhc2VMaXN0U2l6ZSA9IDA7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlY3VyZVN0b3BzLnNpemUoKTsgaSArPSAyKSB7CisgICAgICAgICAgICAgICAgYnl0ZVtdIHNlY3VyZVN0b3AgPSBzZWN1cmVTdG9wcy5nZXQoaSk7CisgICAgICAgICAgICAgICAgcmVsZWFzZUxpc3QuYWRkKHNlY3VyZVN0b3ApOworICAgICAgICAgICAgICAgIHJlbGVhc2VMaXN0U2l6ZSArPSBzZWN1cmVTdG9wLmxlbmd0aDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ2xlYXJLZXkncyByZWxlYXNlIG1lc3NhZ2UgZm9ybWF0ICh0aGlzIGlzIGEgZm9ybWF0IHNoYXJlZCBiZXR3ZWVuCisgICAgICAgICAgICAvLyB0aGUgc2VydmVyIGFuZCB0aGUgZHJtIHNlcnZpY2UpLgorICAgICAgICAgICAgLy8gVGhlIGNsZWFya2V5IGltcGxlbWVudGF0aW9uIGV4cGVjdHMgdGhlIG1lc3NhZ2UgdG8gY29udGFpbgorICAgICAgICAgICAgLy8gYSA0IGJ5dGUgY291bnQgb2YgdGhlIG51bWJlciBvZiBmaXhlZCBsZW5ndGggc2VjdXJlIHN0b3BzCisgICAgICAgICAgICAvLyB0byBmb2xsb3cuCisgICAgICAgICAgICBTdHJpbmcgY291bnQgPSBTdHJpbmcuZm9ybWF0KCIlMDRkIiwgcmVsZWFzZUxpc3Quc2l6ZSgpKTsKKyAgICAgICAgICAgIGJ5dGVbXSByZWxlYXNlTWVzc2FnZSA9IG5ldyBieXRlW2NvdW50Lmxlbmd0aCgpICsgcmVsZWFzZUxpc3RTaXplXTsKKworICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IGNvdW50LmdldEJ5dGVzKCk7CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgMCwgcmVsZWFzZU1lc3NhZ2UsIDAsIGNvdW50Lmxlbmd0aCgpKTsKKworICAgICAgICAgICAgaW50IGRlc3RQb3NpdGlvbiA9IGNvdW50Lmxlbmd0aCgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWxlYXNlTGlzdC5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgIGJ5dGVbXSBzZWN1cmVTdG9wID0gcmVsZWFzZUxpc3QuZ2V0KGkpOworICAgICAgICAgICAgICAgIGludCBzZWN1cmVTdG9wU2l6ZSA9IHNlY3VyZVN0b3AubGVuZ3RoOworICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoc2VjdXJlU3RvcCwgMCwgcmVsZWFzZU1lc3NhZ2UsIGRlc3RQb3NpdGlvbiwgc2VjdXJlU3RvcFNpemUpOworICAgICAgICAgICAgICAgIGRlc3RQb3NpdGlvbiArPSBzZWN1cmVTdG9wU2l6ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZHJtLnJlbGVhc2VTZWN1cmVTdG9wcyhyZWxlYXNlTWVzc2FnZSk7CisgICAgICAgICAgICBzZWN1cmVTdG9wcyA9IGRybS5nZXRTZWN1cmVTdG9wcygpOworICAgICAgICAgICAgc2VjdXJlU3RvcElkcyA9IGRybS5nZXRTZWN1cmVTdG9wSWRzKCk7CisgICAgICAgICAgICAvLyBBbGwgb2RkIG51bWJlcmVkIHNlY3VyZSBzdG9wcyBhcmUgcmVtb3ZlZCBpbiB0aGUgdGVzdCwKKyAgICAgICAgICAgIC8vIGxlYXZpbmcgMm5kLCA0dGgsIDZ0aCBhbmQgdGhlIDh0aCBlbGVtZW50LgorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKChOVU1CRVJfT0ZfU0VDVVJFX1NUT1BTIC0gMSkgLyAyLCBzZWN1cmVTdG9wcy5zaXplKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKChOVU1CRVJfT0ZfU0VDVVJFX1NUT1BTIC0gMSApIC8gMiwgc2VjdXJlU3RvcElkcy5zaXplKCkpOworCisgICAgICAgICAgICBMb2cuZChUQUcsICJUZXN0IHJlbW92ZUFsbFNlY3VyZVN0b3BzLiIpOworICAgICAgICAgICAgZHJtLnJlbW92ZUFsbFNlY3VyZVN0b3BzKCk7CisgICAgICAgICAgICBzZWN1cmVTdG9wcyA9IGRybS5nZXRTZWN1cmVTdG9wcygpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzZWN1cmVTdG9wcy5pc0VtcHR5KCkpOworICAgICAgICAgICAgc2VjdXJlU3RvcElkcyA9IGRybS5nZXRTZWN1cmVTdG9wSWRzKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHNlY3VyZVN0b3BJZHMuaXNFbXB0eSgpKTsKKworICAgICAgICAgICAgbU1lZGlhQ29kZWNQbGF5ZXIucmVzZXQoKTsKKyAgICAgICAgICAgIGNsb3NlU2Vzc2lvbihkcm0sIG1TZXNzaW9uSWQpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiIsIGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHNlc3Npb25JZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZHJtLmNsb3NlU2Vzc2lvbihzZXNzaW9uSWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RvcERybShkcm0pOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Q2xlYXJrZXlWZXJzaW9uKE1lZGlhRHJtIGRybSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGRybS5nZXRQcm9wZXJ0eVN0cmluZygidmVyc2lvbiIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuICJ1bmF2YWlsYWJsZSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gY2Fubm90SGFuZGxlR2V0UHJvcGVydHlCeXRlQXJyYXkoTWVkaWFEcm0gZHJtKSB7CisgICAgICAgIGJvb2xlYW4gYXBpTm90U3VwcG9ydGVkID0gZmFsc2U7CisgICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlWzBdOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYnl0ZXMgPSBkcm0uZ2V0UHJvcGVydHlCeXRlQXJyYXkoREVWSUNFSURfUFJPUEVSVFlfS0VZKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIEV4cGVjdGVkIGV4Y2VwdGlvbiBmb3IgaW52YWxpZCBrZXkgb3IgYXBpIG5vdCBpbXBsZW1lbnRlZAorICAgICAgICAgICAgYXBpTm90U3VwcG9ydGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYXBpTm90U3VwcG9ydGVkOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBjYW5ub3RIYW5kbGVTZXRQcm9wZXJ0eVN0cmluZyhNZWRpYURybSBkcm0pIHsKKyAgICAgICAgYm9vbGVhbiBhcGlOb3RTdXBwb3J0ZWQgPSBmYWxzZTsKKyAgICAgICAgZmluYWwgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbMF07CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBkcm0uc2V0UHJvcGVydHlTdHJpbmcoTElTVEVORVJfVEVTVF9TVVBQT1JUX1BST1BFUlRZX0tFWSwgInRlc3RpbmciKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIEV4cGVjdGVkIGV4Y2VwdGlvbiBmb3IgaW52YWxpZCBrZXkgb3IgYXBpIG5vdCBpbXBsZW1lbnRlZAorICAgICAgICAgICAgYXBpTm90U3VwcG9ydGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYXBpTm90U3VwcG9ydGVkOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiB3YXRjaEhhc05vQ2xlYXJrZXlTdXBwb3J0KCkgeworICAgICAgICBpZiAoIU1lZGlhRHJtLmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKENMRUFSS0VZX1NDSEVNRV9VVUlEKSkgeworICAgICAgICAgICAgaWYgKGlzV2F0Y2hEZXZpY2UoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRVJSX01TR19DUllQVE9fU0NIRU1FX05PVF9TVVBQT1JURUQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNUVigpIHsKKyAgICAgICAgcmV0dXJuIG1Db250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCkuaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX0xFQU5CQUNLX09OTFkpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc0xvd1JhbSgpIHsKKyAgICAgICAgIEFjdGl2aXR5TWFuYWdlciBhbSA9IChBY3Rpdml0eU1hbmFnZXIpIG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BQ1RJVklUWV9TRVJWSUNFKTsKKyAgICAgICAgIHJldHVybiBhbS5pc0xvd1JhbURldmljZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9NZWRpYURybU1ldHJpY3NUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvTWVkaWFEcm1NZXRyaWNzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3YWUyYzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvTWVkaWFEcm1NZXRyaWNzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTg5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS5jdHM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmNvbnRhaW5zSW5BbnlPcmRlcjsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmxlc3NUaGFuT3JFcXVhbFRvOworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYURybTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRHJtLk1lZGlhRHJtU3RhdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5QZXJzaXN0YWJsZUJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uaW8uQmFzZUVuY29kaW5nOworaW1wb3J0IGphdmEudXRpbC5CYXNlNjQ7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ0pvaW5lcjsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKKworCisvKioKKyAqIE1lZGlhRHJtIHRlc3RzIGNvdmVyaW5nIHtAbGluayBNZWRpYURybSNnZXRNZXRyaWNzfSBhbmQgcmVsYXRlZAorICogZnVuY3Rpb25hbGl0eS4KKyAqLworcHVibGljIGNsYXNzIE1lZGlhRHJtTWV0cmljc1Rlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBNZWRpYURybU1ldHJpY3NUZXN0LmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVVUlEIENMRUFSS0VZX1NDSEVNRV9VVUlEID0KKyAgICAgICAgICAgIG5ldyBVVUlEKDB4ZTI3MTlkNThhOTg1YjNjOUwsIDB4NzgxYWIwMzBhZjc4ZDMwZUwpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHT09HTEVfQ0xFQVJLRVlfVkVORE9SX0lEID0gIkdvb2dsZS5DbGVhcktleSBDRE0iOworCisgICAgcHJpdmF0ZSBTdHJpbmcgZHVtcEJ1bmRsZUtleXMoUGVyc2lzdGFibGVCdW5kbGUgYnVuZGxlKSB7CisgICAgICBTdHJpbmdKb2luZXIgam9pbmVyID0gbmV3IFN0cmluZ0pvaW5lcigiLCIpOworICAgICAgZm9yIChTdHJpbmcga2V5IDogYnVuZGxlLmtleVNldCgpKSB7CisgICAgICAgIGpvaW5lci5hZGQoa2V5KTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBqb2luZXIudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRDbGVhcmtleVZlcnNpb24oTWVkaWFEcm0gZHJtKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gZHJtLmdldFByb3BlcnR5U3RyaW5nKCJ2ZXJzaW9uIik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gInVuYXZhaWxhYmxlIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRNZXRyaWNzRW1wdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTWVkaWFEcm0gZHJtID0gbmV3IE1lZGlhRHJtKENMRUFSS0VZX1NDSEVNRV9VVUlEKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChkcm0pOworCisgICAgICAgIGlmIChnZXRDbGVhcmtleVZlcnNpb24oZHJtKS5lcXVhbHMoIjEuMCIpKSB7CisgICAgICAgICAgICBMb2cuaShUQUcsICJTa2lwcGluZyB0ZXN0R2V0TWV0cmljc0VtcHR5OiBub3Qgc3VwcG9ydGVkIGluIENsZWFyS2V5IHYxLjAiKTsKKyAgICAgICAgICAgIGRybS5jbG9zZSgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgUGVyc2lzdGFibGVCdW5kbGUgbWV0cmljcyA9IGRybS5nZXRNZXRyaWNzKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwobWV0cmljcyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1ldHJpY3Mua2V5U2V0KCkuc2l6ZSgpKTsKKyAgICAgICAgLy8gVGhlIGNsZWFyIGtleSBwbHVnaW4gbWV0cmljcyBzaG91bGQgYmUgaW5jbHVkZWQuCisgICAgICAgIGFzc2VydFRydWUobWV0cmljcy5rZXlTZXQoKS5jb250YWlucyhHT09HTEVfQ0xFQVJLRVlfVkVORE9SX0lEKSk7CisgICAgICAgIGRybS5jbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRNZXRyaWNzU2Vzc2lvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBNZWRpYURybSBkcm0gPSBuZXcgTWVkaWFEcm0oQ0xFQVJLRVlfU0NIRU1FX1VVSUQpOworICAgICAgICBhc3NlcnROb3ROdWxsKGRybSk7CisKKyAgICAgICAgaWYgKGdldENsZWFya2V5VmVyc2lvbihkcm0pLmVxdWFscygiMS4wIikpIHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgIlNraXBwaW5nIHRlc3RHZXRNZXRyaWNzU2Vzc2lvbjogbm90IHN1cHBvcnRlZCBpbiBDbGVhcktleSB2MS4wIik7CisgICAgICAgICAgICBkcm0uY2xvc2UoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGJ5dGVbXSBzaWQxID0gZHJtLm9wZW5TZXNzaW9uKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoc2lkMSk7CisgICAgICAgIGJ5dGVbXSBzaWQyID0gZHJtLm9wZW5TZXNzaW9uKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoc2lkMik7CisKKyAgICAgICAgZHJtLmNsb3NlU2Vzc2lvbihzaWQxKTsKKyAgICAgICAgZHJtLmNsb3NlU2Vzc2lvbihzaWQyKTsKKworICAgICAgICBQZXJzaXN0YWJsZUJ1bmRsZSBtZXRyaWNzID0gZHJtLmdldE1ldHJpY3MoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtZXRyaWNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGR1bXBCdW5kbGVLZXlzKG1ldHJpY3MpLCA1LCBtZXRyaWNzLmtleVNldCgpLnNpemUoKSk7CisgICAgICAgIC8vIFRoZSBjbGVhciBrZXkgcGx1Z2luIG1ldHJpY3Mgc2hvdWxkIGJlIGluY2x1ZGVkLgorICAgICAgICBhc3NlcnRUcnVlKG1ldHJpY3Mua2V5U2V0KCkuY29udGFpbnMoR09PR0xFX0NMRUFSS0VZX1ZFTkRPUl9JRCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygyLCBtZXRyaWNzLmdldExvbmcoCisgICAgICAgICAgICBNZWRpYURybS5NZXRyaWNzQ29uc3RhbnRzLk9QRU5fU0VTU0lPTl9PS19DT1VOVCwgLTEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBtZXRyaWNzLmdldExvbmcoCisgICAgICAgICAgICBNZWRpYURybS5NZXRyaWNzQ29uc3RhbnRzLk9QRU5fU0VTU0lPTl9FUlJPUl9DT1VOVCwgLTEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG1ldHJpY3MuZ2V0TG9uZygKKyAgICAgICAgICAgIE1lZGlhRHJtLk1ldHJpY3NDb25zdGFudHMuQ0xPU0VfU0VTU0lPTl9PS19DT1VOVCwgLTEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBtZXRyaWNzLmdldExvbmcoCisgICAgICAgICAgICBNZWRpYURybS5NZXRyaWNzQ29uc3RhbnRzLkNMT1NFX1NFU1NJT05fRVJST1JfQ09VTlQsIC0xKSk7CisKKyAgICAgICAgUGVyc2lzdGFibGVCdW5kbGUgc3RhcnRUaW1lc01zID0gbWV0cmljcy5nZXRQZXJzaXN0YWJsZUJ1bmRsZSgKKyAgICAgICAgICAgIE1lZGlhRHJtLk1ldHJpY3NDb25zdGFudHMuU0VTU0lPTl9TVEFSVF9USU1FU19NUyk7CisgICAgICAgIGFzc2VydE5vdE51bGwoc3RhcnRUaW1lc01zKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHN0YXJ0VGltZXNNcy5rZXlTZXQoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRUaGF0KCJTdGFydCB0aW1lcyBjb250YWluIGFsbCBzZXNzaW9uIGlkcy4gIiwKKyAgICAgICAgICAgIHN0YXJ0VGltZXNNcy5rZXlTZXQoKSwgY29udGFpbnNJbkFueU9yZGVyKAorICAgICAgICAgICAgICAgIEJhc2VFbmNvZGluZy5iYXNlMTYoKS5lbmNvZGUoc2lkMSkudG9Mb3dlckNhc2UoKSwKKyAgICAgICAgICAgICAgICBCYXNlRW5jb2RpbmcuYmFzZTE2KCkuZW5jb2RlKHNpZDIpLnRvTG93ZXJDYXNlKCkpKTsKKworICAgICAgICBQZXJzaXN0YWJsZUJ1bmRsZSBlbmRUaW1lc01zID0gbWV0cmljcy5nZXRQZXJzaXN0YWJsZUJ1bmRsZSgKKyAgICAgICAgICAgIE1lZGlhRHJtLk1ldHJpY3NDb25zdGFudHMuU0VTU0lPTl9FTkRfVElNRVNfTVMpOworICAgICAgICBhc3NlcnROb3ROdWxsKGVuZFRpbWVzTXMpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgZW5kVGltZXNNcy5rZXlTZXQoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRUaGF0KCJFbmQgdGltZXMgY29udGFpbiBhbGwgc2Vzc2lvbiBpZHMuIiwKKyAgICAgICAgICAgIGVuZFRpbWVzTXMua2V5U2V0KCksIGNvbnRhaW5zSW5BbnlPcmRlcigKKyAgICAgICAgICAgICAgICBCYXNlRW5jb2RpbmcuYmFzZTE2KCkuZW5jb2RlKHNpZDEpLnRvTG93ZXJDYXNlKCksCisgICAgICAgICAgICAgICAgQmFzZUVuY29kaW5nLmJhc2UxNigpLmVuY29kZShzaWQyKS50b0xvd2VyQ2FzZSgpKSk7CisgICAgICAgZHJtLmNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldE1ldHJpY3NHZXRLZXlSZXF1ZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE1lZGlhRHJtIGRybSA9IG5ldyBNZWRpYURybShDTEVBUktFWV9TQ0hFTUVfVVVJRCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoZHJtKTsKKworICAgICAgICBpZiAoZ2V0Q2xlYXJrZXlWZXJzaW9uKGRybSkuZXF1YWxzKCIxLjAiKSkgeworICAgICAgICAgICAgTG9nLmkoVEFHLCAiU2tpcHBpbmcgdGVzdEdldE1ldHJpY3NHZXRLZXlSZXF1ZXN0OiBub3Qgc3VwcG9ydGVkIGluIENsZWFyS2V5IHYxLjAiKTsKKyAgICAgICAgICAgIGRybS5jbG9zZSgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgYnl0ZVtdIHNpZCA9IGRybS5vcGVuU2Vzc2lvbigpOworICAgICAgICBhc3NlcnROb3ROdWxsKHNpZCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBkcm0uZ2V0S2V5UmVxdWVzdChzaWQsIG51bGwsICIiLCAyLCBudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoTWVkaWFEcm1TdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgLy8gRXhjZXB0aW9uIGV4cGVjdGVkLgorICAgICAgICB9CisKKyAgICAgICAgZHJtLmNsb3NlU2Vzc2lvbihzaWQpOworCisgICAgICAgIFBlcnNpc3RhYmxlQnVuZGxlIG1ldHJpY3MgPSBkcm0uZ2V0TWV0cmljcygpOworICAgICAgICBhc3NlcnROb3ROdWxsKG1ldHJpY3MpOworCisgICAgICAgIC8vIFZlcmlmeSB0aGUgY291bnQgb2YgbWV0cmljLCBvcGVyYXRpb24gY291bnRzIGFuZCBlcnJvcnMuCisgICAgICAgIGFzc2VydEVxdWFscyg3LCBtZXRyaWNzLmtleVNldCgpLnNpemUoKSk7CisgICAgICAgIC8vIFRoZSBjbGVhciBrZXkgcGx1Z2luIG1ldHJpY3Mgc2hvdWxkIGJlIGluY2x1ZGVkLgorICAgICAgICBhc3NlcnRUcnVlKG1ldHJpY3Mua2V5U2V0KCkuY29udGFpbnMoR09PR0xFX0NMRUFSS0VZX1ZFTkRPUl9JRCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbWV0cmljcy5nZXRMb25nKAorICAgICAgICAgICAgTWVkaWFEcm0uTWV0cmljc0NvbnN0YW50cy5PUEVOX1NFU1NJT05fT0tfQ09VTlQsIC0xKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtZXRyaWNzLmdldExvbmcoCisgICAgICAgICAgICBNZWRpYURybS5NZXRyaWNzQ29uc3RhbnRzLkNMT1NFX1NFU1NJT05fT0tfQ09VTlQsIC0xKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtZXRyaWNzLmdldExvbmcoCisgICAgICAgICAgICBNZWRpYURybS5NZXRyaWNzQ29uc3RhbnRzLkdFVF9LRVlfUkVRVUVTVF9FUlJPUl9DT1VOVCkpOworICAgICAgICBsb25nW10gZXJyb3JMaXN0ID0gbWV0cmljcy5nZXRMb25nQXJyYXkoCisgICAgICAgICAgICBNZWRpYURybS5NZXRyaWNzQ29uc3RhbnRzLkdFVF9LRVlfUkVRVUVTVF9FUlJPUl9MSVNUKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGVycm9yTGlzdC5sZW5ndGgpOworICAgICAgICBhc3NlcnRGYWxzZShlcnJvckxpc3RbMF0gPT0gMCk7CisKKyAgICAgICAgLy8gVmVyaWZ5IHRoZSBzdGFydCBhbmQgZW5kIHRpbWUgZ3JvdXBzIGluIHRoZSBuZXN0ZWQKKyAgICAgICAgLy8gUGVyc2lzdGFibGVCdW5kbGVzLgorICAgICAgICBTdHJpbmcgaGV4U2lkID0gQmFzZUVuY29kaW5nLmJhc2UxNigpLmVuY29kZShzaWQpLnRvTG93ZXJDYXNlKCk7CisgICAgICAgIFBlcnNpc3RhYmxlQnVuZGxlIHN0YXJ0VGltZXNNcyA9IG1ldHJpY3MuZ2V0UGVyc2lzdGFibGVCdW5kbGUoCisgICAgICAgICAgICBNZWRpYURybS5NZXRyaWNzQ29uc3RhbnRzLlNFU1NJT05fU1RBUlRfVElNRVNfTVMpOworICAgICAgICBhc3NlcnROb3ROdWxsKHN0YXJ0VGltZXNNcyk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBzdGFydFRpbWVzTXMua2V5U2V0KCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHN0YXJ0VGltZXNNcy5rZXlTZXQoKS50b0FycmF5KClbMF0sIGhleFNpZCk7CisKKyAgICAgICAgUGVyc2lzdGFibGVCdW5kbGUgZW5kVGltZXNNcyA9IG1ldHJpY3MuZ2V0UGVyc2lzdGFibGVCdW5kbGUoCisgICAgICAgICAgICBNZWRpYURybS5NZXRyaWNzQ29uc3RhbnRzLlNFU1NJT05fRU5EX1RJTUVTX01TKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChlbmRUaW1lc01zKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGVuZFRpbWVzTXMua2V5U2V0KCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGVuZFRpbWVzTXMua2V5U2V0KCkudG9BcnJheSgpWzBdLCBoZXhTaWQpOworICAgICAgICBhc3NlcnRUaGF0KHN0YXJ0VGltZXNNcy5nZXRMb25nKGhleFNpZCksCisgICAgICAgICAgICBsZXNzVGhhbk9yRXF1YWxUbyhlbmRUaW1lc01zLmdldExvbmcoaGV4U2lkKSkpOworICAgICAgICBkcm0uY2xvc2UoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvTWVkaWFFeHRyYWN0b3JUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvTWVkaWFFeHRyYWN0b3JUZXN0LmphdmEKaW5kZXggYjZmMzRmNC4uN2RjOTEzMCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL01lZGlhRXh0cmFjdG9yVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9NZWRpYUV4dHJhY3RvclRlc3QuamF2YQpAQCAtMjAsNiArMjAsNyBAQAogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldEZpbGVEZXNjcmlwdG9yOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9QcmVzZW50YXRpb247CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYURhdGFTb3VyY2U7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUV4dHJhY3RvcjsKIGltcG9ydCBhbmRyb2lkLm9zLlBlcnNpc3RhYmxlQnVuZGxlOwpAQCAtMjcsNiArMjgsNyBAQAogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiBwdWJsaWMgY2xhc3MgTWVkaWFFeHRyYWN0b3JUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKICAgICBwcm90ZWN0ZWQgUmVzb3VyY2VzIG1SZXNvdXJjZXM7CkBAIC0xMjIsNCArMTI0LDExIEBACiAgICAgICAgIH0KIAogICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBdWRpb1ByZXNlbnRhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgVGVzdE1lZGlhRGF0YVNvdXJjZSBkYXRhU291cmNlID0gc2V0RGF0YVNvdXJjZShSLnJhdy50ZXN0dmlkZW8pOworICAgICAgICBMaXN0PEF1ZGlvUHJlc2VudGF0aW9uPiBwcmVzZW50YXRpb25zID0gbUV4dHJhY3Rvci5nZXRBdWRpb1ByZXNlbnRhdGlvbnMoMCAvKnRyYWNrSW5kZXgqLyk7CisgICAgICAgIGFzc2VydE5vdE51bGwocHJlc2VudGF0aW9ucyk7CisgICAgICAgIGFzc2VydFRydWUocHJlc2VudGF0aW9ucy5pc0VtcHR5KCkpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9NZWRpYU1ldGFkYXRhUmV0cmlldmVyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL01lZGlhTWV0YWRhdGFSZXRyaWV2ZXJUZXN0LmphdmEKaW5kZXggNThkODAzZS4uZGQwZmEwOSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL01lZGlhTWV0YWRhdGFSZXRyaWV2ZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL01lZGlhTWV0YWRhdGFSZXRyaWV2ZXJUZXN0LmphdmEKQEAgLTE2LDMxICsxNiw0MCBAQAogCiBwYWNrYWdlIGFuZHJvaWQubWVkaWEuY3RzOwogCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS5jdHMuUjsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0RmlsZURlc2NyaXB0b3I7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYURhdGFTb3VyY2U7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhUmV0cmlldmVyOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5SZXF1aXJlc0RldmljZTsKLWltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLk1lZGlhVXRpbHM7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfV0FUQ0g7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YVJldHJpZXZlci5PUFRJT05fQ0xPU0VTVDsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhUmV0cmlldmVyLk9QVElPTl9DTE9TRVNUX1NZTkM7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YVJldHJpZXZlci5PUFRJT05fTkVYVF9TWU5DOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuT1BUSU9OX1BSRVZJT1VTX1NZTkM7CiAKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldEZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRGF0YVNvdXJjZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRXh0cmFjdG9yOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFGb3JtYXQ7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhUmV0cmlldmVyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuY3RzLlI7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5SZXF1aXJlc0RldmljZTsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuTWVkaWFVdGlsczsKKwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKIAogQFNtYWxsVGVzdAogQFJlcXVpcmVzRGV2aWNlCitAQXBwTW9kZUZ1bGwocmVhc29uID0gIk5vIGludGVyYWN0aW9uIHdpdGggc3lzdGVtIHNlcnZlciIpCiBwdWJsaWMgY2xhc3MgTWVkaWFNZXRhZGF0YVJldHJpZXZlclRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFNZXRhZGF0YVJldHJpZXZlclRlc3QiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gU0FWRV9CSVRNQVBfT1VUUFVUID0gZmFsc2U7CkBAIC00OSw2ICs1OCwxOSBAQAogICAgIHByb3RlY3RlZCBNZWRpYU1ldGFkYXRhUmV0cmlldmVyIG1SZXRyaWV2ZXI7CiAgICAgcHJpdmF0ZSBQYWNrYWdlTWFuYWdlciBtUGFja2FnZU1hbmFnZXI7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgQk9SREVSX1dJRFRIID0gMTY7CisgICAgcHJpdmF0ZSBzdGF0aWMgQ29sb3IgQ09MT1JfQkxPQ0sgPQorICAgICAgICAgICAgQ29sb3IudmFsdWVPZigxLjBmLCAxLjBmLCAxLjBmKTsKKyAgICBwcml2YXRlIHN0YXRpYyBDb2xvcltdIENPTE9SX0JBUlMgPSB7CisgICAgICAgICAgICBDb2xvci52YWx1ZU9mKDAuMGYsIDAuMGYsIDAuMGYpLAorICAgICAgICAgICAgQ29sb3IudmFsdWVPZigwLjBmLCAwLjBmLCAwLjY0ZiksCisgICAgICAgICAgICBDb2xvci52YWx1ZU9mKDAuMGYsIDAuNjRmLCAwLjBmKSwKKyAgICAgICAgICAgIENvbG9yLnZhbHVlT2YoMC4wZiwgMC42NGYsIDAuNjRmKSwKKyAgICAgICAgICAgIENvbG9yLnZhbHVlT2YoMC42NGYsIDAuMGYsIDAuMGYpLAorICAgICAgICAgICAgQ29sb3IudmFsdWVPZigwLjY0ZiwgMC4wZiwgMC42NGYpLAorICAgICAgICAgICAgQ29sb3IudmFsdWVPZigwLjY0ZiwgMC42NGYsIDAuMGYpLAorICAgIH07CisKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBzdXBlci5zZXRVcCgpOwpAQCAtMjk2LDYgKzMxOCw2MyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCB0ZXN0R2V0RnJhbWVBdFRpbWUoaW50IG9wdGlvbiwgaW50W11bXSB0ZXN0Q2FzZXMpIHsKKyAgICAgICAgdGVzdEdldEZyYW1lQXQodGVzdENhc2VzLCAocikgLT4geworICAgICAgICAgICAgTGlzdDxCaXRtYXA+IGJpdG1hcHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGVzdENhc2VzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgYml0bWFwcy5hZGQoci5nZXRGcmFtZUF0VGltZSh0ZXN0Q2FzZXNbaV1bMF0sIG9wdGlvbikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGJpdG1hcHM7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRGcmFtZUF0SW5kZXgoKSB7CisgICAgICAgIGludFtdW10gdGVzdENhc2VzID0geyB7IDYwLCA2MCB9LCB7IDczLCA3MyB9LCB7IDc2LCA3NiB9LCB7IDg4LCA4OCB9LCB7IDk0LCA5NH0gfTsKKworICAgICAgICB0ZXN0R2V0RnJhbWVBdCh0ZXN0Q2FzZXMsIChyKSAtPiB7CisgICAgICAgICAgICBMaXN0PEJpdG1hcD4gYml0bWFwcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0Q2FzZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBiaXRtYXBzLmFkZChyLmdldEZyYW1lQXRJbmRleCh0ZXN0Q2FzZXNbaV1bMF0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBiaXRtYXBzOworICAgICAgICB9KTsKKworICAgICAgICBNZWRpYU1ldGFkYXRhUmV0cmlldmVyLkJpdG1hcFBhcmFtcyBwYXJhbXMgPSBuZXcgTWVkaWFNZXRhZGF0YVJldHJpZXZlci5CaXRtYXBQYXJhbXMoKTsKKyAgICAgICAgcGFyYW1zLnNldFByZWZlcnJlZENvbmZpZyhCaXRtYXAuQ29uZmlnLlJHQl81NjUpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byBzZXQgcHJlZmVycmVkIGNvbmZpZyIsCisgICAgICAgICAgICAgICAgQml0bWFwLkNvbmZpZy5SR0JfNTY1LCBwYXJhbXMuZ2V0UHJlZmVycmVkQ29uZmlnKCkpOworCisgICAgICAgIHRlc3RHZXRGcmFtZUF0KHRlc3RDYXNlcywgKHIpIC0+IHsKKyAgICAgICAgICAgIExpc3Q8Qml0bWFwPiBiaXRtYXBzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRlc3RDYXNlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIEJpdG1hcCBiaXRtYXAgPSByLmdldEZyYW1lQXRJbmRleCh0ZXN0Q2FzZXNbaV1bMF0sIHBhcmFtcyk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJpdG1hcC5Db25maWcuUkdCXzU2NSwgcGFyYW1zLmdldEFjdHVhbENvbmZpZygpKTsKKyAgICAgICAgICAgICAgICBiaXRtYXBzLmFkZChiaXRtYXApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGJpdG1hcHM7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRGcmFtZXNBdEluZGV4KCkgeworICAgICAgICBpbnRbXVtdIHRlc3RDYXNlcyA9IHsgeyAyNywgMjcgfSwgeyAyOCwgMjggfSwgeyAyOSwgMjkgfSwgeyAzMCwgMzAgfSwgeyAzMSwgMzF9IH07CisKKyAgICAgICAgdGVzdEdldEZyYW1lQXQodGVzdENhc2VzLCAocikgLT4geworICAgICAgICAgICAgcmV0dXJuIHIuZ2V0RnJhbWVzQXRJbmRleCh0ZXN0Q2FzZXNbMF1bMF0sIHRlc3RDYXNlcy5sZW5ndGgpOworICAgICAgICB9KTsKKworICAgICAgICBNZWRpYU1ldGFkYXRhUmV0cmlldmVyLkJpdG1hcFBhcmFtcyBwYXJhbXMgPSBuZXcgTWVkaWFNZXRhZGF0YVJldHJpZXZlci5CaXRtYXBQYXJhbXMoKTsKKyAgICAgICAgcGFyYW1zLnNldFByZWZlcnJlZENvbmZpZyhCaXRtYXAuQ29uZmlnLlJHQl81NjUpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byBzZXQgcHJlZmVycmVkIGNvbmZpZyIsCisgICAgICAgICAgICAgICAgQml0bWFwLkNvbmZpZy5SR0JfNTY1LCBwYXJhbXMuZ2V0UHJlZmVycmVkQ29uZmlnKCkpOworCisgICAgICAgIHRlc3RHZXRGcmFtZUF0KHRlc3RDYXNlcywgKHIpIC0+IHsKKyAgICAgICAgICAgIExpc3Q8Qml0bWFwPiBiaXRtYXBzID0gci5nZXRGcmFtZXNBdEluZGV4KHRlc3RDYXNlc1swXVswXSwgdGVzdENhc2VzLmxlbmd0aCwgcGFyYW1zKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhCaXRtYXAuQ29uZmlnLlJHQl81NjUsIHBhcmFtcy5nZXRBY3R1YWxDb25maWcoKSk7CisgICAgICAgICAgICByZXR1cm4gYml0bWFwczsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RHZXRGcmFtZUF0KGludFtdW10gdGVzdENhc2VzLAorICAgICAgICAgICAgRnVuY3Rpb248TWVkaWFNZXRhZGF0YVJldHJpZXZlciwgTGlzdDxCaXRtYXA+ID4gYml0bWFwUmV0cmlldmVyKSB7CiAgICAgICAgIGludCByZXNJZCA9IFIucmF3LmJpbmFyeV9jb3VudGVyXzMyMHgyNDBfMzBmcHNfNjAwZnJhbWVzOwogICAgICAgICBpZiAoIU1lZGlhVXRpbHMuaGFzQ29kZWNGb3JSZXNvdXJjZUFuZERvbWFpbihnZXRDb250ZXh0KCksIHJlc0lkLCAidmlkZW8vIikKICAgICAgICAgICAgICYmIG1QYWNrYWdlTWFuYWdlci5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfV0FUQ0gpKSB7CkBAIC0zMTMsMjQgKzM5MiwyMyBAQAogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBmYWlsKCJVbmFibGUgdG8gY2xvc2UgZmlsZSIpOwogICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50W10gdGVzdENhc2UgOiB0ZXN0Q2FzZXMpIHsKLSAgICAgICAgICAgIGdldFZpZGVvRnJhbWVBbmRWZXJpZnkocmV0cmlldmVyLCB0ZXN0Q2FzZVswXSwgdGVzdENhc2VbMV0sIG9wdGlvbik7CisKKyAgICAgICAgTGlzdDxCaXRtYXA+IGJpdG1hcHMgPSBiaXRtYXBSZXRyaWV2ZXIuYXBwbHkocmV0cmlldmVyKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRlc3RDYXNlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdmVyaWZ5VmlkZW9GcmFtZShiaXRtYXBzLmdldChpKSwgdGVzdENhc2VzW2ldKTsKICAgICAgICAgfQogICAgICAgICByZXRyaWV2ZXIucmVsZWFzZSgpOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBnZXRWaWRlb0ZyYW1lQW5kVmVyaWZ5KAotICAgICAgICAgICAgTWVkaWFNZXRhZGF0YVJldHJpZXZlciByZXRyaWV2ZXIsIGxvbmcgdGltZVVzLCBsb25nIGV4cGVjdGVkQ291bnRlciwgaW50IG9wdGlvbikgeworICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlWaWRlb0ZyYW1lKEJpdG1hcCBiaXRtYXAsIGludFtdIHRlc3RDYXNlKSB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBCaXRtYXAgYml0bWFwID0gcmV0cmlldmVyLmdldEZyYW1lQXRUaW1lKHRpbWVVcywgb3B0aW9uKTsKLSAgICAgICAgICAgIGlmIChiaXRtYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZhaWwoIkZhaWxlZCB0byBnZXQgYml0bWFwIGF0IHRpbWUgIiArIHRpbWVVcyArICIgd2l0aCBvcHRpb24gIiArIG9wdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkNvdW50ZXIgdmFsdWUgaW5jb3JyZWN0IGF0IHRpbWUgIiArIHRpbWVVcyArICIgd2l0aCBvcHRpb24gIiArIG9wdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRDb3VudGVyLCBDb2RlY1V0aWxzLnJlYWRCaW5hcnlDb3VudGVyRnJvbUJpdG1hcChiaXRtYXApKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkZhaWxlZCB0byBnZXQgYml0bWFwIGZvciAiICsgdGVzdENhc2VbMF0sIGJpdG1hcCAhPSBudWxsKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiQ291bnRlciB2YWx1ZSBpbmNvcnJlY3QgZm9yICIgKyB0ZXN0Q2FzZVswXSwKKyAgICAgICAgICAgICAgICAgICAgdGVzdENhc2VbMV0sIENvZGVjVXRpbHMucmVhZEJpbmFyeUNvdW50ZXJGcm9tQml0bWFwKGJpdG1hcCkpOwogCiAgICAgICAgICAgICBpZiAoU0FWRV9CSVRNQVBfT1VUUFVUKSB7Ci0gICAgICAgICAgICAgICAgQ29kZWNVdGlscy5zYXZlQml0bWFwVG9GaWxlKGJpdG1hcCwgInRlc3QiICsgdGltZVVzICsgIi5qcGciKTsKKyAgICAgICAgICAgICAgICBDb2RlY1V0aWxzLnNhdmVCaXRtYXBUb0ZpbGUoYml0bWFwLCAidGVzdF8iICsgdGVzdENhc2VbMF0gKyAiLmpwZyIpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGdldHRpbmcgYml0bWFwOiAiICsgZSk7CkBAIC01MTgsNCArNTk2LDE0NyBAQAogICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGdldHRpbmcgYml0bWFwOiAiICsgZSk7CiAgICAgICAgIH0KICAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SW1hZ2VBdEluZGV4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghTWVkaWFVdGlscy5oYXNEZWNvZGVyKE1lZGlhRm9ybWF0Lk1JTUVUWVBFX1ZJREVPX0hFVkMpKSB7CisgICAgICAgICAgICBNZWRpYVV0aWxzLnNraXBUZXN0KCJubyB2aWRlbyBkZWNvZGVycyBmb3IgcmVzb3VyY2UiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHRlc3RHZXRJbWFnZShSLnJhdy5oZWlmd3JpdGVyX2lucHV0LCAxOTIwLCAxMDgwLCAwIC8qcm90YXRpb24qLywKKyAgICAgICAgICAgICAgICA0IC8qaW1hZ2VDb3VudCovLCAzIC8qcHJpbWFyeSovLCB0cnVlIC8qdXNlR3JpZCovLCB0cnVlIC8qY2hlY2tDb2xvciovKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmVzIGlmIHR3byBjb2xvciB2YWx1ZXMgYXJlIGFwcHJveGltYXRlbHkgZXF1YWwuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBhcHByb3hFcXVhbHMoQ29sb3IgZXhwZWN0ZWQsIENvbG9yIGFjdHVhbCkgeworICAgICAgICBmaW5hbCBmbG9hdCBNQVhfREVMVEEgPSAwLjAyNWY7CisgICAgICAgIHJldHVybiAoTWF0aC5hYnMoZXhwZWN0ZWQucmVkKCkgLSBhY3R1YWwucmVkKCkpIDw9IE1BWF9ERUxUQSkKKyAgICAgICAgICAgICYmIChNYXRoLmFicyhleHBlY3RlZC5ncmVlbigpIC0gYWN0dWFsLmdyZWVuKCkpIDw9IE1BWF9ERUxUQSkKKyAgICAgICAgICAgICYmIChNYXRoLmFicyhleHBlY3RlZC5ibHVlKCkgLSBhY3R1YWwuYmx1ZSgpKSA8PSBNQVhfREVMVEEpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFJlY3QgZ2V0Q29sb3JCYXJSZWN0KGludCBpbmRleCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgIGludCBiYXJXaWR0aCA9ICh3aWR0aCAtIEJPUkRFUl9XSURUSCAqIDIpIC8gQ09MT1JfQkFSUy5sZW5ndGg7CisgICAgICAgIHJldHVybiBuZXcgUmVjdChCT1JERVJfV0lEVEggKyBiYXJXaWR0aCAqIGluZGV4LCBCT1JERVJfV0lEVEgsCisgICAgICAgICAgICAgICAgQk9SREVSX1dJRFRIICsgYmFyV2lkdGggKiAoaW5kZXggKyAxKSwgaGVpZ2h0IC0gQk9SREVSX1dJRFRIKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBSZWN0IGdldENvbG9yQmxvY2tSZWN0KGludCBpbmRleCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgIGludCBibG9ja0NlbnRlclggPSAod2lkdGggLyA1KSAqIChpbmRleCAlIDQgKyAxKTsKKyAgICAgICAgcmV0dXJuIG5ldyBSZWN0KGJsb2NrQ2VudGVyWCAtIHdpZHRoIC8gMTAsIGhlaWdodCAvIDYsCisgICAgICAgICAgICAgICAgICAgICAgICBibG9ja0NlbnRlclggKyB3aWR0aCAvIDEwLCBoZWlnaHQgLyAzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdEdldEltYWdlKAorICAgICAgICAgICAgaW50IHJlc0lkLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCByb3RhdGlvbiwKKyAgICAgICAgICAgIGludCBpbWFnZUNvdW50LCBpbnQgcHJpbWFyeSwgYm9vbGVhbiB1c2VHcmlkLCBib29sZWFuIGNoZWNrQ29sb3IpCisgICAgICAgICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBNZWRpYU1ldGFkYXRhUmV0cmlldmVyIHJldHJpZXZlciA9IG51bGw7CisgICAgICAgIE1lZGlhRXh0cmFjdG9yIGV4dHJhY3RvciA9IG51bGw7CisgICAgICAgIEFzc2V0RmlsZURlc2NyaXB0b3IgYWZkID0gbnVsbDsKKyAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXRyaWV2ZXIgPSBuZXcgTWVkaWFNZXRhZGF0YVJldHJpZXZlcigpOworCisgICAgICAgICAgICBSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpOworICAgICAgICAgICAgYWZkID0gcmVzb3VyY2VzLm9wZW5SYXdSZXNvdXJjZUZkKHJlc0lkKTsKKworICAgICAgICAgICAgcmV0cmlldmVyLnNldERhdGFTb3VyY2UoYWZkLmdldEZpbGVEZXNjcmlwdG9yKCksIGFmZC5nZXRTdGFydE9mZnNldCgpLCBhZmQuZ2V0TGVuZ3RoKCkpOworCisgICAgICAgICAgICAvLyBWZXJpZnkgaW1hZ2UgcmVsYXRlZCBtZXRhIGtleXMuCisgICAgICAgICAgICBTdHJpbmcgaGFzSW1hZ2UgPSByZXRyaWV2ZXIuZXh0cmFjdE1ldGFkYXRhKAorICAgICAgICAgICAgICAgICAgICBNZWRpYU1ldGFkYXRhUmV0cmlldmVyLk1FVEFEQVRBX0tFWV9IQVNfSU1BR0UpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiTm8gaW1hZ2VzIGZvdW5kIGluIHJlc0lkICIgKyByZXNJZCwgInllcyIuZXF1YWxzKGhhc0ltYWdlKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIldyb25nIHdpZHRoIiwgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIucGFyc2VJbnQocmV0cmlldmVyLmV4dHJhY3RNZXRhZGF0YSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYU1ldGFkYXRhUmV0cmlldmVyLk1FVEFEQVRBX0tFWV9JTUFHRV9XSURUSCkpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiV3JvbmcgaGVpZ2h0IiwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnBhcnNlSW50KHJldHJpZXZlci5leHRyYWN0TWV0YWRhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFNZXRhZGF0YVJldHJpZXZlci5NRVRBREFUQV9LRVlfSU1BR0VfSEVJR0hUKSkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyByb3RhdGlvbiIsIHJvdGF0aW9uLAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnBhcnNlSW50KHJldHJpZXZlci5leHRyYWN0TWV0YWRhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFNZXRhZGF0YVJldHJpZXZlci5NRVRBREFUQV9LRVlfSU1BR0VfUk9UQVRJT04pKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIldyb25nIGltYWdlIGNvdW50IiwgaW1hZ2VDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci5wYXJzZUludChyZXRyaWV2ZXIuZXh0cmFjdE1ldGFkYXRhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuTUVUQURBVEFfS0VZX0lNQUdFX0NPVU5UKSkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBwcmltYXJ5IGluZGV4IiwgcHJpbWFyeSwKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci5wYXJzZUludChyZXRyaWV2ZXIuZXh0cmFjdE1ldGFkYXRhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuTUVUQURBVEFfS0VZX0lNQUdFX1BSSU1BUlkpKSk7CisKKyAgICAgICAgICAgIGlmIChjaGVja0NvbG9yKSB7CisgICAgICAgICAgICAgICAgQml0bWFwIGJpdG1hcCA9IG51bGw7CisgICAgICAgICAgICAgICAgLy8gRm9yIGVhY2ggaW1hZ2UgaW4gdGhlIGltYWdlIGNvbGxlY3Rpb24sIGNoZWNrIHRoZSA3IGNvbG9yIGJhcnMnIGNvbG9yLgorICAgICAgICAgICAgICAgIC8vIEFsc28gY2hlY2sgdGhlIHBvc2l0aW9uIG9mIHRoZSBjb2xvciBibG9jaywgd2hpY2ggc2hvdWxkIG1vdmUgbGVmdC10by1yaWdodAorICAgICAgICAgICAgICAgIC8vIHdpdGggdGhlIGluZGV4LgorICAgICAgICAgICAgICAgIGZvciAoaW50IGltYWdlSW5kZXggPSAwOyBpbWFnZUluZGV4IDwgaW1hZ2VDb3VudDsgaW1hZ2VJbmRleCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGJpdG1hcCA9IHJldHJpZXZlci5nZXRJbWFnZUF0SW5kZXgoaW1hZ2VJbmRleCk7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgYmFySW5kZXggPSAwOyBiYXJJbmRleCA8IENPTE9SX0JBUlMubGVuZ3RoOyBiYXJJbmRleCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBSZWN0IHIgPSBnZXRDb2xvckJhclJlY3QoYmFySW5kZXgsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQ29sb3IgYmFyICIgKyBiYXJJbmRleCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZm9yIGltYWdlICIgKyBpbWFnZUluZGV4ICsgIiBkb2Vzbid0IG1hdGNoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwcm94RXF1YWxzKENPTE9SX0JBUlNbYmFySW5kZXhdLCBDb2xvci52YWx1ZU9mKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdG1hcC5nZXRQaXhlbChyLmNlbnRlclgoKSwgci5jZW50ZXJZKCkpKSkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgUmVjdCByID0gZ2V0Q29sb3JCbG9ja1JlY3QoaW1hZ2VJbmRleCwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkNvbG9yIGJsb2NrIGZvciBpbWFnZSAiICsgaW1hZ2VJbmRleCArICIgZG9lc24ndCBtYXRjaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwcm94RXF1YWxzKENPTE9SX0JMT0NLLCBDb2xvci52YWx1ZU9mKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0bWFwLmdldFBpeGVsKHIuY2VudGVyWCgpLCBoZWlnaHQgLSByLmNlbnRlclkoKSkpKSk7CisgICAgICAgICAgICAgICAgICAgIGJpdG1hcC5yZWN5Y2xlKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIGNvbG9yIGJsb2NrIHBvc2l0aW9uIG9uIHRoZSBwcmltYXJ5IGltYWdlLgorICAgICAgICAgICAgICAgIFJlY3QgciA9IGdldENvbG9yQmxvY2tSZWN0KHByaW1hcnksIHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgICAgIGJpdG1hcCA9IHJldHJpZXZlci5nZXRQcmltYXJ5SW1hZ2UoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJDb2xvciBibG9jayBmb3IgcHJpbWFyeSBpbWFnZSBkb2Vzbid0IG1hdGNoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwcHJveEVxdWFscyhDT0xPUl9CTE9DSywgQ29sb3IudmFsdWVPZigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0bWFwLmdldFBpeGVsKHIuY2VudGVyWCgpLCBoZWlnaHQgLSByLmNlbnRlclkoKSkpKSk7CisgICAgICAgICAgICAgICAgYml0bWFwLnJlY3ljbGUoKTsKKworICAgICAgICAgICAgICAgIC8vIENoZWNrIHRoZSBjb2xvciBibG9jayBwb3NpdGlvbiBvbiB0aGUgYml0bWFwIGRlY29kZWQgYnkgQml0bWFwRmFjdG9yeS4KKyAgICAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBtYXRjaCB0aGUgcHJpbWFyeSBpbWFnZSBhcyB3ZWxsLgorICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtID0gZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLm9wZW5SYXdSZXNvdXJjZShyZXNJZCk7CisgICAgICAgICAgICAgICAgYml0bWFwID0gQml0bWFwRmFjdG9yeS5kZWNvZGVTdHJlYW0oaW5wdXRTdHJlYW0pOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkNvbG9yIGJsb2NrIGZvciBiaXRtYXAgZGVjb2RpbmcgZG9lc24ndCBtYXRjaCIsCisgICAgICAgICAgICAgICAgICAgICAgICBhcHByb3hFcXVhbHMoQ09MT1JfQkxPQ0ssIENvbG9yLnZhbHVlT2YoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdG1hcC5nZXRQaXhlbChyLmNlbnRlclgoKSwgaGVpZ2h0IC0gci5jZW50ZXJZKCkpKSkpOworICAgICAgICAgICAgICAgIGJpdG1hcC5yZWN5Y2xlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENoZWNrIHRoZSBncmlkIGNvbmZpZ3VyYXRpb24gcmVsYXRlZCBrZXlzLgorICAgICAgICAgICAgaWYgKHVzZUdyaWQpIHsKKyAgICAgICAgICAgICAgICBleHRyYWN0b3IgPSBuZXcgTWVkaWFFeHRyYWN0b3IoKTsKKyAgICAgICAgICAgICAgICBleHRyYWN0b3Iuc2V0RGF0YVNvdXJjZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGFmZC5nZXRGaWxlRGVzY3JpcHRvcigpLCBhZmQuZ2V0U3RhcnRPZmZzZXQoKSwgYWZkLmdldExlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICBNZWRpYUZvcm1hdCBmb3JtYXQgPSBleHRyYWN0b3IuZ2V0VHJhY2tGb3JtYXQoMCk7CisgICAgICAgICAgICAgICAgaW50IHRpbGVXaWR0aCA9IGZvcm1hdC5nZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9USUxFX1dJRFRIKTsKKyAgICAgICAgICAgICAgICBpbnQgdGlsZUhlaWdodCA9IGZvcm1hdC5nZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9USUxFX0hFSUdIVCk7CisgICAgICAgICAgICAgICAgaW50IGdyaWRSb3dzID0gZm9ybWF0LmdldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0dSSURfUk9XUyk7CisgICAgICAgICAgICAgICAgaW50IGdyaWRDb2xzID0gZm9ybWF0LmdldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0dSSURfQ09MVU1OUyk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvbmcgdGlsZSB3aWR0aCBvciBncmlkIGNvbHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgKCh3aWR0aCArIHRpbGVXaWR0aCAtIDEpIC8gdGlsZVdpZHRoKSA9PSBncmlkQ29scyk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvbmcgdGlsZSBoZWlnaHQgb3IgZ3JpZCByb3dzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICgoaGVpZ2h0ICsgdGlsZUhlaWdodCAtIDEpIC8gdGlsZUhlaWdodCkgPT0gZ3JpZFJvd3MpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJVbmFibGUgdG8gb3BlbiBmaWxlIik7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAocmV0cmlldmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXRyaWV2ZXIucmVsZWFzZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGV4dHJhY3RvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZXh0cmFjdG9yLnJlbGVhc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhZmQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGFmZC5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGlucHV0U3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL01lZGlhTXV4ZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvTWVkaWFNdXhlclRlc3QuamF2YQppbmRleCAxNWQwOGEzLi4wYjA3NWUyIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvTWVkaWFNdXhlclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvTWVkaWFNdXhlclRlc3QuamF2YQpAQCAtMjUsNiArMjUsNyBAQAogaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YVJldHJpZXZlcjsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTXV4ZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCkBAIC0zNiw2ICszNyw3IEBACiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIAorQEFwcE1vZGVGdWxsKHJlYXNvbiA9ICJObyBpbnRlcmFjdGlvbiB3aXRoIHN5c3RlbSBzZXJ2ZXIiKQogcHVibGljIGNsYXNzIE1lZGlhTXV4ZXJUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhTXV4ZXJUZXN0IjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFZFUkJPU0UgPSBmYWxzZTsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9NZWRpYVBsYXllcjJEcm1UZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvTWVkaWFQbGF5ZXIyRHJtVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YTRlZDYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvTWVkaWFQbGF5ZXIyRHJtVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTYxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLm1lZGlhLmN0czsKKworaW1wb3J0IGFuZHJvaWQuTWFuaWZlc3Q7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7CitpbXBvcnQgYW5kcm9pZC5vcy5FbnZpcm9ubWVudDsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTGFyZ2VUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TZGtTdXBwcmVzczsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuR3JhbnRQZXJtaXNzaW9uUnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworCitpbXBvcnQgamF2YS5pby5GaWxlOworCisvKioKKyAqIFRlc3RzIGZvciB0aGUgTWVkaWFQbGF5ZXIyIEFQSSBhbmQgbG9jYWwgdmlkZW8vYXVkaW8gcGxheWJhY2suCisgKgorICogVGhlIGZpbGVzIGluIHJlcy9yYXcgdXNlZCBieSB0ZXN0TG9jYWxWaWRlbyogYXJlIChjKSBjb3B5cmlnaHQgMjAwOCwKKyAqIEJsZW5kZXIgRm91bmRhdGlvbiAvIHd3dy5iaWdidWNrYnVubnkub3JnLCBhbmQgYXJlIGxpY2Vuc2VkIHVuZGVyIHRoZSBDcmVhdGl2ZSBDb21tb25zCisgKiBBdHRyaWJ1dGlvbiAzLjAgTGljZW5zZSBhdCBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS8zLjAvdXMvLgorICovCitATGFyZ2VUZXN0CitAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQorQFNka1N1cHByZXNzKG1pblNka1ZlcnNpb24gPSBCdWlsZC5WRVJTSU9OX0NPREVTLlApCitAQXBwTW9kZUZ1bGwocmVhc29uID0gIkluc3RhbnQgYXBwcyBjYW5ub3QgaG9sZCBSRUFEL1dSSVRFX0VYVEVSTkFMX1NUT1JBR0UiKQorcHVibGljIGNsYXNzIE1lZGlhUGxheWVyMkRybVRlc3QgZXh0ZW5kcyBNZWRpYVBsYXllcjJEcm1UZXN0QmFzZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJNZWRpYVBsYXllcjJEcm1UZXN0IjsKKworICAgIEBSdWxlCisgICAgcHVibGljIEdyYW50UGVybWlzc2lvblJ1bGUgbVJ1bnRpbWVQZXJtaXNzaW9uUnVsZSA9CisgICAgICAgICAgICBHcmFudFBlcm1pc3Npb25SdWxlLmdyYW50KE1hbmlmZXN0LnBlcm1pc3Npb24uV1JJVEVfRVhURVJOQUxfU1RPUkFHRSk7CisKKyAgICBAQmVmb3JlCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICB9CisKKyAgICBAQWZ0ZXIKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIEFzc2V0IGhlbHBlcnMKKworICAgIHByaXZhdGUgc3RhdGljIFVyaSBnZXRVcmlGcm9tRmlsZShTdHJpbmcgcGF0aCkgeworICAgICAgICByZXR1cm4gVXJpLmZyb21GaWxlKG5ldyBGaWxlKGdldERvd25sb2FkZWRQYXRoKHBhdGgpKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldERvd25sb2FkZWRQYXRoKFN0cmluZyBmaWxlTmFtZSkgeworICAgICAgICByZXR1cm4gZ2V0RG93bmxvYWRlZEZvbGRlcigpICsgRmlsZS5zZXBhcmF0b3IgKyBmaWxlTmFtZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RG93bmxvYWRlZEZvbGRlcigpIHsKKyAgICAgICAgcmV0dXJuIEVudmlyb25tZW50LmdldEV4dGVybmFsU3RvcmFnZVB1YmxpY0RpcmVjdG9yeSgKKyAgICAgICAgICAgICAgICBFbnZpcm9ubWVudC5ESVJFQ1RPUllfRE9XTkxPQURTKS5nZXRQYXRoKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmVzb2x1dGlvbiB7CisgICAgICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzSEQ7CisgICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgd2lkdGg7CisgICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgaGVpZ2h0OworCisgICAgICAgIFJlc29sdXRpb24oYm9vbGVhbiBpc0hELCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICAgICAgICAgIHRoaXMuaXNIRCA9IGlzSEQ7CisgICAgICAgICAgICB0aGlzLndpZHRoID0gd2lkdGg7CisgICAgICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFJlc29sdXRpb24gUkVTXzcyMFAgID0gbmV3IFJlc29sdXRpb24odHJ1ZSwgMTI4MCwgIDcyMCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb2x1dGlvbiBSRVNfQVVESU8gPSBuZXcgUmVzb2x1dGlvbihmYWxzZSwgICAwLCAgICAwKTsKKworCisgICAgLy8gQXNzZXRzCisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVcmkgQ0VOQ19BVURJT19VUkwgPSBVcmkucGFyc2UoCisgICAgICAgICAgICAiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3d2bWVkaWEvY2VuYy9jbGVhcmtleS9jYXJfY2VuYy0yMDEyMDgyNy04Yy1wc3NoLm1wNCIpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVyaSBDRU5DX0FVRElPX1VSTF9ET1dOTE9BREVEID0gZ2V0VXJpRnJvbUZpbGUoImNhcl9jZW5jLTIwMTIwODI3LThjLm1wNCIpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVXJpIENFTkNfVklERU9fVVJMID0gVXJpLnBhcnNlKAorICAgICAgICAgICAgImh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS93dm1lZGlhL2NlbmMvY2xlYXJrZXkvY2FyX2NlbmMtMjAxMjA4MjctODgtcHNzaC5tcDQiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVcmkgQ0VOQ19WSURFT19VUkxfRE9XTkxPQURFRCA9IGdldFVyaUZyb21GaWxlKCJjYXJfY2VuYy0yMDEyMDgyNy04OC5tcDQiKTsKKworCisgICAgLy8gVGVzdHMKKworICAgIEBUZXN0CisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDQVJfQ0xFQVJLRVlfQVVESU9fRE9XTkxPQURFRF9WMF9TWU5DKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGRvd25sb2FkKENFTkNfQVVESU9fVVJMLAorICAgICAgICAgICAgICAgIENFTkNfQVVESU9fVVJMX0RPV05MT0FERUQsCisgICAgICAgICAgICAgICAgUkVTX0FVRElPLAorICAgICAgICAgICAgICAgIE1vZHVsYXJEcm1UZXN0VHlwZS5WMF9TWU5DX1RFU1QpOworICAgIH0KKworICAgIEBUZXN0CisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDQVJfQ0xFQVJLRVlfQVVESU9fRE9XTkxPQURFRF9WMV9BU1lOQygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkb3dubG9hZChDRU5DX0FVRElPX1VSTCwKKyAgICAgICAgICAgICAgICBDRU5DX0FVRElPX1VSTF9ET1dOTE9BREVELAorICAgICAgICAgICAgICAgIFJFU19BVURJTywKKyAgICAgICAgICAgICAgICBNb2R1bGFyRHJtVGVzdFR5cGUuVjFfQVNZTkNfVEVTVCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENBUl9DTEVBUktFWV9BVURJT19ET1dOTE9BREVEX1YyX1NZTkNfQ09ORklHKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGRvd25sb2FkKENFTkNfQVVESU9fVVJMLAorICAgICAgICAgICAgICAgIENFTkNfQVVESU9fVVJMX0RPV05MT0FERUQsCisgICAgICAgICAgICAgICAgUkVTX0FVRElPLAorICAgICAgICAgICAgICAgIE1vZHVsYXJEcm1UZXN0VHlwZS5WMl9TWU5DX0NPTkZJR19URVNUKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q0FSX0NMRUFSS0VZX0FVRElPX0RPV05MT0FERURfVjNfQVNZTkNfRFJNUFJFUEFSRUQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZG93bmxvYWQoQ0VOQ19BVURJT19VUkwsCisgICAgICAgICAgICAgICAgQ0VOQ19BVURJT19VUkxfRE9XTkxPQURFRCwKKyAgICAgICAgICAgICAgICBSRVNfQVVESU8sCisgICAgICAgICAgICAgICAgTW9kdWxhckRybVRlc3RUeXBlLlYzX0FTWU5DX0RSTVBSRVBBUkVEX1RFU1QpOworICAgIH0KKworICAgIC8vIGhlbHBlcnMKKworICAgIHByaXZhdGUgdm9pZCBzdHJlYW0oVXJpIHVyaSwgUmVzb2x1dGlvbiByZXMsIE1vZHVsYXJEcm1UZXN0VHlwZSB0ZXN0VHlwZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHBsYXlNb2R1bGFyRHJtVmlkZW8odXJpLCByZXMud2lkdGgsIHJlcy5oZWlnaHQsIHRlc3RUeXBlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZG93bmxvYWQoVXJpIHJlbW90ZSwgVXJpIGxvY2FsLCBSZXNvbHV0aW9uIHJlcywgTW9kdWxhckRybVRlc3RUeXBlIHRlc3RUeXBlKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHBsYXlNb2R1bGFyRHJtVmlkZW9Eb3dubG9hZChyZW1vdGUsIGxvY2FsLCByZXMud2lkdGgsIHJlcy5oZWlnaHQsIHRlc3RUeXBlKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9NZWRpYVBsYXllcjJEcm1UZXN0QmFzZS5qYXZhIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL01lZGlhUGxheWVyMkRybVRlc3RCYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhkNWNiOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9NZWRpYVBsYXllcjJEcm1UZXN0QmFzZS5qYXZhCkBAIC0wLDAgKzEsMTAxOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS5jdHM7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LkNvbnRleHQuS0VZR1VBUkRfU0VSVklDRTsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkRvd25sb2FkTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5Eb3dubG9hZE1hbmFnZXIuUmVxdWVzdDsKK2ltcG9ydCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb247CitpbXBvcnQgYW5kcm9pZC5hcHAuS2V5Z3VhcmRNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYURybTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlJlc291cmNlQnVzeUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlVuc3VwcG9ydGVkU2NoZW1lRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQubWVkaWEuY3RzLlRlc3RVdGlscy5Nb25pdG9yOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLlBvd2VyTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQudXRpbC5CYXNlNjQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKKworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uQ2FsbFN1cGVyOworaW1wb3J0IGFuZHJvaWR4Lm1lZGlhLkRhdGFTb3VyY2VEZXNjOworaW1wb3J0IGFuZHJvaWR4Lm1lZGlhLk1lZGlhUGxheWVyMjsKK2ltcG9ydCBhbmRyb2lkeC5tZWRpYS5NZWRpYVBsYXllcjIuRHJtSW5mbzsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworCitpbXBvcnQgb3JnLmpzb24uSlNPTkFycmF5OworaW1wb3J0IG9yZy5qc29uLkpTT05FeGNlcHRpb247CitpbXBvcnQgb3JnLmpzb24uSlNPTk9iamVjdDsKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CisKKy8qKgorICogQmFzZSBjbGFzcyBmb3IgRFJNIHRlc3RzIHdoaWNoIHVzZSBNZWRpYVBsYXllcjIgdG8gcGxheSBhdWRpbyBvciB2aWRlby4KKyAqLworcHVibGljIGNsYXNzIE1lZGlhUGxheWVyMkRybVRlc3RCYXNlIHsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBTVFJFQU1fUkVUUklFUyA9IDM7CisKKyAgICBwcm90ZWN0ZWQgTW9uaXRvciBtU2V0RGF0YVNvdXJjZUNhbGxDb21wbGV0ZWQgPSBuZXcgTW9uaXRvcigpOworICAgIHByb3RlY3RlZCBNb25pdG9yIG1PblByZXBhcmVkQ2FsbGVkID0gbmV3IE1vbml0b3IoKTsKKyAgICBwcm90ZWN0ZWQgTW9uaXRvciBtT25WaWRlb1NpemVDaGFuZ2VkQ2FsbGVkID0gbmV3IE1vbml0b3IoKTsKKyAgICBwcm90ZWN0ZWQgTW9uaXRvciBtT25QbGF5YmFja0NvbXBsZXRlZCA9IG5ldyBNb25pdG9yKCk7CisgICAgcHJvdGVjdGVkIE1vbml0b3IgbU9uRHJtSW5mb0NhbGxlZCA9IG5ldyBNb25pdG9yKCk7CisgICAgcHJvdGVjdGVkIE1vbml0b3IgbU9uRHJtUHJlcGFyZWRDYWxsZWQgPSBuZXcgTW9uaXRvcigpOworICAgIHByb3RlY3RlZCBpbnQgbUNhbGxTdGF0dXMgPSBNZWRpYVBsYXllcjIuQ0FMTF9TVEFUVVNfTk9fRVJST1I7CisKKyAgICBwcm90ZWN0ZWQgQ29udGV4dCBtQ29udGV4dDsKKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VzIG1SZXNvdXJjZXM7CisKKyAgICBwcm90ZWN0ZWQgTWVkaWFQbGF5ZXIyIG1QbGF5ZXIgPSBudWxsOworICAgIHByb3RlY3RlZCBNZWRpYVN0dWJBY3Rpdml0eSBtQWN0aXZpdHk7CisgICAgcHJvdGVjdGVkIEluc3RydW1lbnRhdGlvbiBtSW5zdHJ1bWVudGF0aW9uOworCisgICAgcHJvdGVjdGVkIEV4ZWN1dG9yU2VydmljZSBtRXhlY3V0b3I7CisgICAgcHJvdGVjdGVkIE1lZGlhUGxheWVyMi5FdmVudENhbGxiYWNrIG1FQ2IgPSBudWxsOworCisgICAgQFJ1bGUKKyAgICBwdWJsaWMgQWN0aXZpdHlUZXN0UnVsZTxNZWRpYVN0dWJBY3Rpdml0eT4gbUFjdGl2aXR5UnVsZSA9CisgICAgICAgICAgICBuZXcgQWN0aXZpdHlUZXN0UnVsZTw+KE1lZGlhU3R1YkFjdGl2aXR5LmNsYXNzKTsKKyAgICBwdWJsaWMgUG93ZXJNYW5hZ2VyLldha2VMb2NrIG1TY3JlZW5Mb2NrOworICAgIHByaXZhdGUgS2V5Z3VhcmRNYW5hZ2VyIG1LZXlndWFyZE1hbmFnZXI7CisKKyAgICBAQmVmb3JlCisgICAgQENhbGxTdXBlcgorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIG1JbnN0cnVtZW50YXRpb24gPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKTsKKyAgICAgICAgbUtleWd1YXJkTWFuYWdlciA9IChLZXlndWFyZE1hbmFnZXIpCisgICAgICAgICAgICAgICAgbUluc3RydW1lbnRhdGlvbi5nZXRUYXJnZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShLRVlHVUFSRF9TRVJWSUNFKTsKKyAgICAgICAgbUFjdGl2aXR5ID0gbUFjdGl2aXR5UnVsZS5nZXRBY3Rpdml0eSgpOworICAgICAgICBtQWN0aXZpdHlSdWxlLnJ1bk9uVWlUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgLy8gS2VlcCBzY3JlZW4gb24gd2hpbGUgdGVzdGluZy4KKyAgICAgICAgICAgICAgICBtQWN0aXZpdHkuZ2V0V2luZG93KCkuYWRkRmxhZ3MoV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19LRUVQX1NDUkVFTl9PTik7CisgICAgICAgICAgICAgICAgbUFjdGl2aXR5LnNldFR1cm5TY3JlZW5Pbih0cnVlKTsKKyAgICAgICAgICAgICAgICBtQWN0aXZpdHkuc2V0U2hvd1doZW5Mb2NrZWQodHJ1ZSk7CisgICAgICAgICAgICAgICAgbUtleWd1YXJkTWFuYWdlci5yZXF1ZXN0RGlzbWlzc0tleWd1YXJkKG1BY3Rpdml0eSwgbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLndhaXRGb3JJZGxlU3luYygpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQWN0aXZpdHlSdWxlLnJ1bk9uVWlUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgbVBsYXllciA9IE1lZGlhUGxheWVyMi5jcmVhdGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0KKworICAgICAgICBtQ29udGV4dCA9IG1JbnN0cnVtZW50YXRpb24uZ2V0VGFyZ2V0Q29udGV4dCgpOworICAgICAgICBtUmVzb3VyY2VzID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCk7CisKKyAgICAgICAgbUV4ZWN1dG9yID0gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbCgxKTsKKyAgICB9CisKKyAgICBAQWZ0ZXIKKyAgICBAQ2FsbFN1cGVyCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgaWYgKG1QbGF5ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVBsYXllci5jbG9zZSgpOworICAgICAgICAgICAgbVBsYXllciA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgbUV4ZWN1dG9yLnNodXRkb3duKCk7CisgICAgICAgIG1BY3Rpdml0eSA9IG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJlcGFyZUZhaWxlZEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7fQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gTW9kdWxhciBEUk0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFQbGF5ZXIyRHJtVGVzdEJhc2UiOworCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgUExBWV9USU1FX01TID0gNjAgKiAxMDAwOworICAgIHByb3RlY3RlZCBieXRlW10gbUtleVNldElkOworICAgIHByb3RlY3RlZCBib29sZWFuIG1BdWRpb09ubHk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gQ0xFQVJfS0VZX0NFTkMgPSB7CisgICAgICAgICAgICAoYnl0ZSkgMHgxYSwgKGJ5dGUpIDB4OGEsIChieXRlKSAweDIwLCAoYnl0ZSkgMHg5NSwKKyAgICAgICAgICAgIChieXRlKSAweGU0LCAoYnl0ZSkgMHhkZSwgKGJ5dGUpIDB4YjIsIChieXRlKSAweGQyLAorICAgICAgICAgICAgKGJ5dGUpIDB4OWUsIChieXRlKSAweGM4LCAoYnl0ZSkgMHgxNiwgKGJ5dGUpIDB4YWMsCisgICAgICAgICAgICAoYnl0ZSkgMHg3YiwgKGJ5dGUpIDB4YWUsIChieXRlKSAweDIwLCAoYnl0ZSkgMHg4MgorICAgICAgICAgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVVSUQgQ0xFQVJLRVlfU0NIRU1FX1VVSUQgPQorICAgICAgICAgICAgbmV3IFVVSUQoMHgxMDc3ZWZlY2MwYjI0ZDAyTCwgMHhhY2UzM2MxZTUyZTJmYjRiTCk7CisKKyAgICBmaW5hbCBieXRlW10gbUNsZWFyS2V5UHNzaCA9IGhleFN0cmluZ1RvQnl0ZUFycmF5KAorICAgICAgICAgICAgIjAwMDAwMDM0NzA3MzczNjgiICAgIC8vIEJNRkYgYm94IGhlYWRlciAoNCBieXRlcyBzaXplICsgJ3Bzc2gnKQorICAgICAgICAgICAgKyAiMDEwMDAwMDAiICAgICAgICAgIC8vIEZ1bGwgYm94IGhlYWRlciAodmVyc2lvbiA9IDEgZmxhZ3MgPSAwKQorICAgICAgICAgICAgKyAiMTA3N2VmZWNjMGIyNGQwMiIgIC8vIFN5c3RlbUlECisgICAgICAgICAgICArICJhY2UzM2MxZTUyZTJmYjRiIgorICAgICAgICAgICAgKyAiMDAwMDAwMDEiICAgICAgICAgIC8vIE51bWJlciBvZiBrZXkgaWRzCisgICAgICAgICAgICArICI2MDA2MWUwMTdlNDc3ZTg3IiAgLy8gS2V5IGlkCisgICAgICAgICAgICArICI3ZTU3ZDAwZDFlZDAwZDFlIgorICAgICAgICAgICAgKyAiMDAwMDAwMDAiICAgICAgICAgIC8vIFNpemUgb2YgRGF0YSwgbXVzdCBiZSB6ZXJvCisgICAgICAgICAgICApOworCisKKyAgICBwcm90ZWN0ZWQgZW51bSBNb2R1bGFyRHJtVGVzdFR5cGUgeworICAgICAgICBWMF9TWU5DX1RFU1QsCisgICAgICAgIFYxX0FTWU5DX1RFU1QsCisgICAgICAgIFYyX1NZTkNfQ09ORklHX1RFU1QsCisgICAgICAgIFYzX0FTWU5DX0RSTVBSRVBBUkVEX1RFU1QsCisgICAgICAgIFY0X1NZTkNfT0ZGTElORV9LRVksCisgICAgfQorCisgICAgLy8gVE9ETzogQWZ0ZXIgbGl2aW5nIG9uIHRoZXNlIHRlc3RzIGZvciBhIHdoaWxlLCB3ZSBjYW4gY29uc2lkZXIgZ3JvdXBpbmcgdGhlbSBiYXNlZCBvbgorICAgIC8vIHRoZSBhc3NldCBzdWNoIHRoYXQgZWFjaCBhc3NldCBpcyBkb3dubG9hZGVkIG9uY2UgYW5kIHBsYXllZCBiYWNrIHdpdGggbXVsdGlwbGUgdGVzdHMuCisgICAgcHJvdGVjdGVkIHZvaWQgcGxheU1vZHVsYXJEcm1WaWRlb0Rvd25sb2FkKFVyaSB1cmksIFVyaSBwYXRoLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICBNb2R1bGFyRHJtVGVzdFR5cGUgdGVzdFR5cGUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBsb25nIGRvd25sb2FkVGltZU91dFNlY29uZHMgPSA2MDA7CisgICAgICAgIExvZy5pKFRBRywgIkRvd25sb2FkaW5nIGZpbGU6IiArIHBhdGgpOworICAgICAgICBNZWRpYURvd25sb2FkTWFuYWdlciBtZWRpYURvd25sb2FkTWFuYWdlciA9IG5ldyBNZWRpYURvd25sb2FkTWFuYWdlcihtQ29udGV4dCk7CisgICAgICAgIGZpbmFsIGxvbmcgaWQgPSBtZWRpYURvd25sb2FkTWFuYWdlci5kb3dubG9hZEZpbGVXaXRoUmV0cmllcygKKyAgICAgICAgICAgICAgICB1cmksIHBhdGgsIGRvd25sb2FkVGltZU91dFNlY29uZHMsIFNUUkVBTV9SRVRSSUVTKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIkRvd25sb2FkICIgKyB1cmkgKyAiIGZhaWxlZC4iLCBpZCA9PSAtMSk7CisgICAgICAgIFVyaSBmaWxlID0gbWVkaWFEb3dubG9hZE1hbmFnZXIuZ2V0VXJpRm9yRG93bmxvYWRlZEZpbGUoaWQpOworICAgICAgICBMb2cuaShUQUcsICJEb3dubG9hZGVkIGZpbGU6IiArIHBhdGggKyAiIGlkOiIgKyBpZCArICIgdXJpOiIgKyBmaWxlKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcGxheU1vZHVsYXJEcm1WaWRlbyhmaWxlLCB3aWR0aCwgaGVpZ2h0LCB0ZXN0VHlwZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBtZWRpYURvd25sb2FkTWFuYWdlci5yZW1vdmVGaWxlKGlkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHBsYXlNb2R1bGFyRHJtVmlkZW8oVXJpIHVyaSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgTW9kdWxhckRybVRlc3RUeXBlIHRlc3RUeXBlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gRm9yY2UgZ2MgZm9yIGEgY2xlYW4gc3RhcnQKKyAgICAgICAgU3lzdGVtLmdjKCk7CisKKyAgICAgICAgcGxheU1vZHVsYXJEcm1WaWRlb1dpdGhSZXRyaWVzKHVyaSwgd2lkdGgsIGhlaWdodCwgUExBWV9USU1FX01TLCB0ZXN0VHlwZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgcGxheU1vZHVsYXJEcm1WaWRlb1dpdGhSZXRyaWVzKFVyaSBmaWxlLCBJbnRlZ2VyIHdpZHRoLCBJbnRlZ2VyIGhlaWdodCwKKyAgICAgICAgICAgIGludCBwbGF5VGltZSwgTW9kdWxhckRybVRlc3RUeXBlIHRlc3RUeXBlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBmaXJzdCB0aGUgc3luY2hyb25vdXMgdmFyaWF0aW9uCisgICAgICAgIGJvb2xlYW4gcGxheWVkU3VjY2Vzc2Z1bGx5ID0gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU1RSRUFNX1JFVFJJRVM7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBMb2cudihUQUcsICJwbGF5VmlkZW9XaXRoUmV0cmllcygiICsgdGVzdFR5cGUgKyAiKSB0cnkgIiArIGkpOworICAgICAgICAgICAgICAgIHBsYXlMb2FkZWRNb2R1bGFyRHJtVmlkZW8oZmlsZSwgd2lkdGgsIGhlaWdodCwgcGxheVRpbWUsIHRlc3RUeXBlKTsKKworICAgICAgICAgICAgICAgIHBsYXllZFN1Y2Nlc3NmdWxseSA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGNhdGNoIChQcmVwYXJlRmFpbGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyB3ZSBjYW4gZmFpbCBiZWNhdXNlIG9mIG5ldHdvcmsgaXNzdWVzLCBzbyB0cnkgYWdhaW4KKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJwbGF5VmlkZW9XaXRoUmV0cmllcygiICsgdGVzdFR5cGUgKyAiKSBmYWlsZWQgb24gdHJ5ICIgKyBpCisgICAgICAgICAgICAgICAgICAgICAgICArICIsIHRyeWluZyBwbGF5YmFjayBhZ2FpbiIpOworICAgICAgICAgICAgICAgIG1QbGF5ZXIucmVzZXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKCJTdHJlYW0gZGlkIG5vdCBwbGF5IHN1Y2Nlc3NmdWxseSBhZnRlciBhbGwgYXR0ZW1wdHMgKHN5bmNEcm1TZXR1cCkiLAorICAgICAgICAgICAgICAgIHBsYXllZFN1Y2Nlc3NmdWxseSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGxheSBhIHZpZGVvIHdoaWNoIGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkIHdpdGggc2V0RGF0YVNvdXJjZSgpLgorICAgICAqIFRoZSBEUk0gc2V0dXAgaXMgcGVyZm9ybWVkIHN5bmNocm9ub3VzbHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZSBkYXRhIHNvdXJjZQorICAgICAqIEBwYXJhbSB3aWR0aCB3aWR0aCBvZiB0aGUgdmlkZW8gdG8gdmVyaWZ5LCBvciBudWxsIHRvIHNraXAgdmVyaWZpY2F0aW9uCisgICAgICogQHBhcmFtIGhlaWdodCBoZWlnaHQgb2YgdGhlIHZpZGVvIHRvIHZlcmlmeSwgb3IgbnVsbCB0byBza2lwIHZlcmlmaWNhdGlvbgorICAgICAqIEBwYXJhbSBwbGF5VGltZSBsZW5ndGggb2YgdGltZSB0byBwbGF5IHZpZGVvLCBvciAwIHRvIHBsYXkgZW50aXJlIHZpZGVvCisgICAgICogQHBhcmFtIHRlc3RUeXBlIHRlc3QgdHlwZQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwbGF5TG9hZGVkTW9kdWxhckRybVZpZGVvKGZpbmFsIFVyaSBmaWxlLCBmaW5hbCBJbnRlZ2VyIHdpZHRoLAorICAgICAgICAgICAgZmluYWwgSW50ZWdlciBoZWlnaHQsIGludCBwbGF5VGltZSwgTW9kdWxhckRybVRlc3RUeXBlIHRlc3RUeXBlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBzd2l0Y2ggKHRlc3RUeXBlKSB7CisgICAgICAgICAgICBjYXNlIFYwX1NZTkNfVEVTVDoKKyAgICAgICAgICAgIGNhc2UgVjFfQVNZTkNfVEVTVDoKKyAgICAgICAgICAgIGNhc2UgVjJfU1lOQ19DT05GSUdfVEVTVDoKKyAgICAgICAgICAgIGNhc2UgVjNfQVNZTkNfRFJNUFJFUEFSRURfVEVTVDoKKyAgICAgICAgICAgICAgICBwbGF5TG9hZGVkTW9kdWxhckRybVZpZGVvX0dlbmVyaWMoZmlsZSwgd2lkdGgsIGhlaWdodCwgcGxheVRpbWUsIHRlc3RUeXBlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBWNF9TWU5DX09GRkxJTkVfS0VZOgorICAgICAgICAgICAgICAgIHBsYXlMb2FkZWRNb2R1bGFyRHJtVmlkZW9fVjRfb2ZmbGluZUtleShmaWxlLCB3aWR0aCwgaGVpZ2h0LCBwbGF5VGltZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcGxheUxvYWRlZE1vZHVsYXJEcm1WaWRlb19HZW5lcmljKGZpbmFsIFVyaSBmaWxlLCBmaW5hbCBJbnRlZ2VyIHdpZHRoLAorICAgICAgICAgICAgZmluYWwgSW50ZWdlciBoZWlnaHQsIGludCBwbGF5VGltZSwgTW9kdWxhckRybVRlc3RUeXBlIHRlc3RUeXBlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBmaW5hbCBmbG9hdCB2b2x1bWUgPSAwLjVmOworCisgICAgICAgIG1BdWRpb09ubHkgPSAod2lkdGggPT0gMCk7CisKKyAgICAgICAgbUNhbGxTdGF0dXMgPSBNZWRpYVBsYXllcjIuQ0FMTF9TVEFUVVNfTk9fRVJST1I7CisgICAgICAgIG1FQ2IgPSBuZXcgTWVkaWFQbGF5ZXIyLkV2ZW50Q2FsbGJhY2soKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25WaWRlb1NpemVDaGFuZ2VkKE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkLCBpbnQgdywgaW50IGgpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiVmlkZW9TaXplQ2hhbmdlZCIgKyAiIHc6IiArIHcgKyAiIGg6IiArIGgpOworICAgICAgICAgICAgICAgICAgICBtT25WaWRlb1NpemVDaGFuZ2VkQ2FsbGVkLnNpZ25hbCgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsIGludCB3aGF0LCBpbnQgZXh0cmEpIHsKKyAgICAgICAgICAgICAgICAgICAgZmFpbCgiTWVkaWEgcGxheWVyIGhhZCBlcnJvciAiICsgd2hhdCArICIgcGxheWluZyB2aWRlbyIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uSW5mbyhNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCwgaW50IHdoYXQsIGludCBleHRyYSkgeworICAgICAgICAgICAgICAgICAgICBpZiAod2hhdCA9PSBNZWRpYVBsYXllcjIuTUVESUFfSU5GT19QUkVQQVJFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbU9uUHJlcGFyZWRDYWxsZWQuc2lnbmFsKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBNZWRpYVBsYXllcjIuTUVESUFfSU5GT19QTEFZQkFDS19DT01QTEVURSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAicGxheUxvYWRlZFZpZGVvOiBvbkluZm9fUGxheWJhY2tDb21wbGV0ZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgbU9uUGxheWJhY2tDb21wbGV0ZWQuc2lnbmFsKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNhbGxDb21wbGV0ZWQoTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2hhdCwgaW50IHN0YXR1cykgeworICAgICAgICAgICAgICAgICAgICBpZiAod2hhdCA9PSBNZWRpYVBsYXllcjIuQ0FMTF9DT01QTEVURURfU0VUX0RBVEFfU09VUkNFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ2FsbFN0YXR1cyA9IHN0YXR1czsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TZXREYXRhU291cmNlQ2FsbENvbXBsZXRlZC5zaWduYWwoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgbVBsYXllci5zZXRFdmVudENhbGxiYWNrKG1FeGVjdXRvciwgbUVDYik7CisgICAgICAgIExvZy52KFRBRywgInBsYXlMb2FkZWRWaWRlbzogc2V0RGF0YVNvdXJjZSgpIik7CisgICAgICAgIG1QbGF5ZXIuc2V0RGF0YVNvdXJjZShuZXcgRGF0YVNvdXJjZURlc2MuQnVpbGRlcigpLnNldERhdGFTb3VyY2UobUNvbnRleHQsIGZpbGUpLmJ1aWxkKCkpOworICAgICAgICBtU2V0RGF0YVNvdXJjZUNhbGxDb21wbGV0ZWQud2FpdEZvclNpZ25hbCgpOworICAgICAgICBpZiAobUNhbGxTdGF0dXMgIT0gTWVkaWFQbGF5ZXIyLkNBTExfU1RBVFVTX05PX0VSUk9SKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUHJlcGFyZUZhaWxlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgU3VyZmFjZUhvbGRlciBzdXJmYWNlSG9sZGVyID0gbUFjdGl2aXR5LmdldFN1cmZhY2VIb2xkZXIoKTsKKyAgICAgICAgc3VyZmFjZUhvbGRlci5zZXRLZWVwU2NyZWVuT24odHJ1ZSk7CisgICAgICAgIG1QbGF5ZXIuc2V0U3VyZmFjZShzdXJmYWNlSG9sZGVyLmdldFN1cmZhY2UoKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN3aXRjaCAodGVzdFR5cGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFYwX1NZTkNfVEVTVDoKKyAgICAgICAgICAgICAgICAgICAgcHJlcGFyZVBsYXllckFuZERybV9WMF9zeW5jRHJtU2V0dXAoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFYxX0FTWU5DX1RFU1Q6CisgICAgICAgICAgICAgICAgICAgIHByZXBhcmVQbGF5ZXJBbmREcm1fVjFfYXN5bmNEcm1TZXR1cCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgVjJfU1lOQ19DT05GSUdfVEVTVDoKKyAgICAgICAgICAgICAgICAgICAgcHJlcGFyZVBsYXllckFuZERybV9WMl9zeW5jRHJtU2V0dXBQbHVzQ29uZmlnKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBWM19BU1lOQ19EUk1QUkVQQVJFRF9URVNUOgorICAgICAgICAgICAgICAgICAgICBwcmVwYXJlUGxheWVyQW5kRHJtX1YzX2FzeW5jRHJtU2V0dXBQbHVzRHJtUHJlcGFyZWRMaXN0ZW5lcigpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgbmV3IFByZXBhcmVGYWlsZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIExvZy52KFRBRywgInBsYXlMb2FkZWRWaWRlbzogcGxheSgpIik7CisgICAgICAgIG1QbGF5ZXIucGxheSgpOworICAgICAgICBpZiAoIW1BdWRpb09ubHkpIHsKKyAgICAgICAgICAgIG1PblZpZGVvU2l6ZUNoYW5nZWRDYWxsZWQud2FpdEZvclNpZ25hbCgpOworICAgICAgICB9CisgICAgICAgIG1QbGF5ZXIuc2V0UGxheWVyVm9sdW1lKHZvbHVtZSk7CisKKyAgICAgICAgLy8gd2FpdGluZyB0byBjb21wbGV0ZQorICAgICAgICBpZiAocGxheVRpbWUgPT0gMCkgeworICAgICAgICAgICAgTG9nLnYoVEFHLCAicGxheUxvYWRlZFZpZGVvOiB3YWl0aW5nIGZvciBwbGF5YmFjayBjb21wbGV0aW9uIik7CisgICAgICAgICAgICBtT25QbGF5YmFja0NvbXBsZXRlZC53YWl0Rm9yU2lnbmFsKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMb2cudihUQUcsICJwbGF5TG9hZGVkVmlkZW86IHdhaXRpbmcgd2hpbGUgcGxheWluZyBmb3IgIiArIHBsYXlUaW1lKTsKKyAgICAgICAgICAgIG1PblBsYXliYWNrQ29tcGxldGVkLndhaXRGb3JTaWduYWwocGxheVRpbWUpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIExvZy52KFRBRywgInBsYXlMb2FkZWRWaWRlbzogcmVsZWFzZURybSIpOworICAgICAgICAgICAgbVBsYXllci5yZWxlYXNlRHJtKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgbmV3IFByZXBhcmVGYWlsZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcmVwYXJlUGxheWVyQW5kRHJtX1YwX3N5bmNEcm1TZXR1cCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBMb2cudihUQUcsICJwcmVwYXJlUGxheWVyQW5kRHJtX1YwOiBjYWxsaW5nIHByZXBhcmUoKSIpOworICAgICAgICBtUGxheWVyLnByZXBhcmUoKTsKKyAgICAgICAgbU9uUHJlcGFyZWRDYWxsZWQud2FpdEZvclNpZ25hbCgpOworICAgICAgICBpZiAobUNhbGxTdGF0dXMgIT0gTWVkaWFQbGF5ZXIyLkNBTExfU1RBVFVTX05PX0VSUk9SKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIERybUluZm8gZHJtSW5mbyA9IG1QbGF5ZXIuZ2V0RHJtSW5mbygpOworICAgICAgICBpZiAoZHJtSW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICBzZXR1cERybShkcm1JbmZvLCB0cnVlIC8qIHByZXBhcmVEcm0gKi8sIHRydWUgLyogc3luY2hyb25vdXNOZXR3b3JraW5nICovLAorICAgICAgICAgICAgICAgICAgICBNZWRpYURybS5LRVlfVFlQRV9TVFJFQU1JTkcpOworICAgICAgICAgICAgTG9nLnYoVEFHLCAicHJlcGFyZVBsYXllckFuZERybV9WMDogc2V0dXBEcm0gZG9uZSEiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcmVwYXJlUGxheWVyQW5kRHJtX1YxX2FzeW5jRHJtU2V0dXAoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBBdG9taWNCb29sZWFuIGFzeW5jU2V0dXBEcm1FcnJvciA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKKworICAgICAgICBtUGxheWVyLnNldERybUV2ZW50Q2FsbGJhY2sobUV4ZWN1dG9yLCBuZXcgTWVkaWFQbGF5ZXIyLkRybUV2ZW50Q2FsbGJhY2soKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRHJtSW5mbyhNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCwgRHJtSW5mbyBkcm1JbmZvKSB7CisgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAicHJlcGFyZVBsYXllckFuZERybV9WMTogb25Ecm1JbmZvIiArIGRybUluZm8pOworCisgICAgICAgICAgICAgICAgLy8gaW4gdGhlIGNhbGxiYWNrIChhc3luYyBtb2RlKSBzbyBoYW5kbGluZyBleGNlcHRpb25zIGhlcmUKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzZXR1cERybShkcm1JbmZvLCB0cnVlIC8qIHByZXBhcmVEcm0gKi8sIHRydWUgLyogc3luY2hyb25vdXNOZXR3b3JraW5nICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhRHJtLktFWV9UWVBFX1NUUkVBTUlORyk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAicHJlcGFyZVBsYXllckFuZERybV9WMTogc2V0dXBEcm0gRVhDRVBUSU9OICIgKyBlKTsKKyAgICAgICAgICAgICAgICAgICAgYXN5bmNTZXR1cERybUVycm9yLnNldCh0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtT25Ecm1JbmZvQ2FsbGVkLnNpZ25hbCgpOworICAgICAgICAgICAgICAgIExvZy52KFRBRywgInByZXBhcmVQbGF5ZXJBbmREcm1fVjE6IG9uRHJtSW5mbyBkb25lISIpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBMb2cudihUQUcsICJwcmVwYXJlUGxheWVyQW5kRHJtX1YxOiBjYWxsaW5nIHByZXBhcmUoKSIpOworICAgICAgICBtUGxheWVyLnByZXBhcmUoKTsKKworICAgICAgICBtT25Ecm1JbmZvQ2FsbGVkLndhaXRGb3JTaWduYWwoKTsKKworICAgICAgICAvLyBXYWl0aW5nIHRpbGwgdGhlIHBsYXllciBpcyBwcmVwYXJlZAorICAgICAgICBtT25QcmVwYXJlZENhbGxlZC53YWl0Rm9yU2lnbmFsKCk7CisKKyAgICAgICAgLy8gdG8gaGFuZGxlIHNldHVwRHJtIGVycm9yIChhc3luYykgaW4gdGhlIG1haW4gdGhyZWFkIHJhdGhlciB0aGFuIHRoZSBjYWxsYmFjaworICAgICAgICBpZiAoYXN5bmNTZXR1cERybUVycm9yLmdldCgpKSB7CisgICAgICAgICAgICBmYWlsKCJwcmVwYXJlUGxheWVyQW5kRHJtX1YxOiBzZXR1cERybSIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHByZXBhcmVQbGF5ZXJBbmREcm1fVjJfc3luY0RybVNldHVwUGx1c0NvbmZpZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtUGxheWVyLnNldE9uRHJtQ29uZmlnSGVscGVyKG5ldyBNZWRpYVBsYXllcjIuT25Ecm1Db25maWdIZWxwZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRHJtQ29uZmlnKE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHdpZGV2aW5lU2VjdXJpdHlMZXZlbDMgPSAiTDMiOworICAgICAgICAgICAgICAgIFN0cmluZyBzZWN1cml0eUxldmVsUHJvcGVydHkgPSAic2VjdXJpdHlMZXZlbCI7CisKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGV2ZWwgPSBtcC5nZXREcm1Qcm9wZXJ0eVN0cmluZyhzZWN1cml0eUxldmVsUHJvcGVydHkpOworICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJwcmVwYXJlUGxheWVyQW5kRHJtX1YyOiBnZXREcm1Qcm9wZXJ0eVN0cmluZzogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2VjdXJpdHlMZXZlbFByb3BlcnR5ICsgIiAtPiAiICsgbGV2ZWwpOworICAgICAgICAgICAgICAgICAgICBtcC5zZXREcm1Qcm9wZXJ0eVN0cmluZyhzZWN1cml0eUxldmVsUHJvcGVydHksIHdpZGV2aW5lU2VjdXJpdHlMZXZlbDMpOworICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IG1wLmdldERybVByb3BlcnR5U3RyaW5nKHNlY3VyaXR5TGV2ZWxQcm9wZXJ0eSk7CisgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgInByZXBhcmVQbGF5ZXJBbmREcm1fVjI6IGdldERybVByb3BlcnR5U3RyaW5nOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzZWN1cml0eUxldmVsUHJvcGVydHkgKyAiIC0+ICIgKyBsZXZlbCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTWVkaWFQbGF5ZXIyLk5vRHJtU2NoZW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAicHJlcGFyZVBsYXllckFuZERybV9WMjogTm9Ecm1TY2hlbWVFeGNlcHRpb24iKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJwcmVwYXJlUGxheWVyQW5kRHJtX1YyOiBvbkRybUNvbmZpZyBFWENFUFRJT04gIiArIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgTG9nLnYoVEFHLCAicHJlcGFyZVBsYXllckFuZERybV9WMjogY2FsbGluZyBwcmVwYXJlKCkiKTsKKyAgICAgICAgbVBsYXllci5wcmVwYXJlKCk7CisKKyAgICAgICAgbU9uUHJlcGFyZWRDYWxsZWQud2FpdEZvclNpZ25hbCgpOworICAgICAgICBpZiAobUNhbGxTdGF0dXMgIT0gTWVkaWFQbGF5ZXIyLkNBTExfU1RBVFVTX05PX0VSUk9SKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIERybUluZm8gZHJtSW5mbyA9IG1QbGF5ZXIuZ2V0RHJtSW5mbygpOworICAgICAgICBpZiAoZHJtSW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICBzZXR1cERybShkcm1JbmZvLCB0cnVlIC8qIHByZXBhcmVEcm0gKi8sIHRydWUgLyogc3luY2hyb25vdXNOZXR3b3JraW5nICovLAorICAgICAgICAgICAgICAgICAgICBNZWRpYURybS5LRVlfVFlQRV9TVFJFQU1JTkcpOworICAgICAgICAgICAgTG9nLnYoVEFHLCAicHJlcGFyZVBsYXllckFuZERybV9WMjogc2V0dXBEcm0gZG9uZSEiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcmVwYXJlUGxheWVyQW5kRHJtX1YzX2FzeW5jRHJtU2V0dXBQbHVzRHJtUHJlcGFyZWRMaXN0ZW5lcigpCisgICAgICAgICAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBBdG9taWNCb29sZWFuIGFzeW5jU2V0dXBEcm1FcnJvciA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKKworICAgICAgICBtUGxheWVyLnNldERybUV2ZW50Q2FsbGJhY2sobUV4ZWN1dG9yLCBuZXcgTWVkaWFQbGF5ZXIyLkRybUV2ZW50Q2FsbGJhY2soKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRHJtSW5mbyhNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCwgRHJtSW5mbyBkcm1JbmZvKSB7CisgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAicHJlcGFyZVBsYXllckFuZERybV9WMzogb25Ecm1JbmZvIiArIGRybUluZm8pOworCisgICAgICAgICAgICAgICAgLy8gRFJNIHByZXBlcmF0aW9uCisgICAgICAgICAgICAgICAgTGlzdDxVVUlEPiBzdXBwb3J0ZWRTY2hlbWVzID0gZHJtSW5mby5nZXRTdXBwb3J0ZWRTY2hlbWVzKCk7CisgICAgICAgICAgICAgICAgaWYgKHN1cHBvcnRlZFNjaGVtZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgInByZXBhcmVQbGF5ZXJBbmREcm1fVjM6IG9uRHJtSW5mbzogTm8gc3VwcG9ydGVkU2NoZW1lcyIpOworICAgICAgICAgICAgICAgICAgICBhc3luY1NldHVwRHJtRXJyb3Iuc2V0KHRydWUpOworICAgICAgICAgICAgICAgICAgICBtT25Ecm1JbmZvQ2FsbGVkLnNpZ25hbCgpOworICAgICAgICAgICAgICAgICAgICAvLyB3ZSB3b24ndCBjYWxsIHByZXBhcmVEcm0gYW55bW9yZSBidXQgbmVlZCB0byBnZXQgcGFzc2VkIHRoZSB3YWl0CisgICAgICAgICAgICAgICAgICAgIG1PbkRybVByZXBhcmVkQ2FsbGVkLnNpZ25hbCgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gc2V0dGluZyB1cCB3aXRoIHRoZSBmaXJzdCBzdXBwb3J0ZWQgVVVJRAorICAgICAgICAgICAgICAgIC8vIGluc3RlYWQgb2Ygc3VwcG9ydGVkU2NoZW1lc1swXSBpbiBHVFMKKyAgICAgICAgICAgICAgICBVVUlEIGRybVNjaGVtZSA9IENMRUFSS0VZX1NDSEVNRV9VVUlEOworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInByZXBhcmVQbGF5ZXJBbmREcm1fVjM6IG9uRHJtSW5mbzogc2VsZWN0ZWQgIiArIGRybVNjaGVtZSk7CisKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJwcmVwYXJlUGxheWVyQW5kRHJtX1YzOiBvbkRybUluZm86IGNhbGxpbmcgcHJlcGFyZURybSIpOworICAgICAgICAgICAgICAgICAgICBtcC5wcmVwYXJlRHJtKGRybVNjaGVtZSk7CisgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgInByZXBhcmVQbGF5ZXJBbmREcm1fVjM6IG9uRHJtSW5mbzogY2FsbGVkIHByZXBhcmVEcm0iKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJwcmVwYXJlUGxheWVyQW5kRHJtX1YzOiBvbkRybUluZm86IHByZXBhcmVEcm0gZXhjZXB0aW9uICIgKyBlKTsKKyAgICAgICAgICAgICAgICAgICAgYXN5bmNTZXR1cERybUVycm9yLnNldCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgbU9uRHJtSW5mb0NhbGxlZC5zaWduYWwoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBnZXQgcGFzc2VkIHRoZSB3YWl0CisgICAgICAgICAgICAgICAgICAgIG1PbkRybVByZXBhcmVkQ2FsbGVkLnNpZ25hbCgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbU9uRHJtSW5mb0NhbGxlZC5zaWduYWwoKTsKKyAgICAgICAgICAgICAgICBMb2cudihUQUcsICJwcmVwYXJlUGxheWVyQW5kRHJtX1YzOiBvbkRybUluZm8gZG9uZSEiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkRybVByZXBhcmVkKE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkLCBpbnQgc3RhdHVzKSB7CisgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAicHJlcGFyZVBsYXllckFuZERybV9WMzogb25Ecm1QcmVwYXJlZCBzdGF0dXM6ICIgKyBzdGF0dXMpOworCisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgicHJlcGFyZVBsYXllckFuZERybV9WMzogb25Ecm1QcmVwYXJlZCBkaWQgbm90IHN1Y2NlZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID09IE1lZGlhUGxheWVyMi5QUkVQQVJFX0RSTV9TVEFUVVNfU1VDQ0VTUyk7CisKKyAgICAgICAgICAgICAgICBEcm1JbmZvIGRybUluZm8gPSBtUGxheWVyLmdldERybUluZm8oKTsKKworICAgICAgICAgICAgICAgIC8vIGluIHRoZSBjYWxsYmFjayAoYXN5bmMgbW9kZSkgc28gaGFuZGxpbmcgZXhjZXB0aW9ucyBoZXJlCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgc2V0dXBEcm0oZHJtSW5mbywgZmFsc2UgLyogcHJlcGFyZURybSAqLywgdHJ1ZSAvKiBzeW5jaHJvbm91c05ldHdvcmtpbmcgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFEcm0uS0VZX1RZUEVfU1RSRUFNSU5HKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJwcmVwYXJlUGxheWVyQW5kRHJtX1YzOiBzZXR1cERybSBFWENFUFRJT04gIiArIGUpOworICAgICAgICAgICAgICAgICAgICBhc3luY1NldHVwRHJtRXJyb3Iuc2V0KHRydWUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1PbkRybVByZXBhcmVkQ2FsbGVkLnNpZ25hbCgpOworICAgICAgICAgICAgICAgIExvZy52KFRBRywgInByZXBhcmVQbGF5ZXJBbmREcm1fVjM6IG9uRHJtUHJlcGFyZWQgZG9uZSEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgTG9nLnYoVEFHLCAicHJlcGFyZVBsYXllckFuZERybV9WMzogY2FsbGluZyBwcmVwYXJlKCkiKTsKKyAgICAgICAgbVBsYXllci5wcmVwYXJlKCk7CisKKyAgICAgICAgLy8gV2FpdGluZyB0aWxsIHRoZSBwbGF5ZXIgaXMgcHJlcGFyZWQKKyAgICAgICAgbU9uUHJlcGFyZWRDYWxsZWQud2FpdEZvclNpZ25hbCgpOworCisgICAgICAgIC8vIFVubGlrZSB2Mywgb25Ecm1QcmVwYXJlZCBpcyBub3Qgc3luY2VkIHRvIG9uUHJlcGFyZWQgYi9jIG9mIGl0cyBvd24gdGhyZWFkIGhhbmRsZXIKKyAgICAgICAgbU9uRHJtUHJlcGFyZWRDYWxsZWQud2FpdEZvclNpZ25hbCgpOworCisgICAgICAgIC8vIHRvIGhhbmRsZSBzZXR1cERybSBlcnJvciAoYXN5bmMpIGluIHRoZSBtYWluIHRocmVhZCByYXRoZXIgdGhhbiB0aGUgY2FsbGJhY2sKKyAgICAgICAgaWYgKGFzeW5jU2V0dXBEcm1FcnJvci5nZXQoKSkgeworICAgICAgICAgICAgZmFpbCgicHJlcGFyZVBsYXllckFuZERybV9WMzogc2V0dXBEcm0iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwbGF5TG9hZGVkTW9kdWxhckRybVZpZGVvX1Y0X29mZmxpbmVLZXkoZmluYWwgVXJpIGZpbGUsIGZpbmFsIEludGVnZXIgd2lkdGgsCisgICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIGhlaWdodCwgaW50IHBsYXlUaW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgZmxvYXQgdm9sdW1lID0gMC41ZjsKKworICAgICAgICBtQXVkaW9Pbmx5ID0gKHdpZHRoID09IDApOworCisgICAgICAgIFN1cmZhY2VIb2xkZXIgc3VyZmFjZUhvbGRlciA9IG1BY3Rpdml0eS5nZXRTdXJmYWNlSG9sZGVyKCk7CisgICAgICAgIExvZy52KFRBRywgInBsYXlMb2FkZWRNb2R1bGFyRHJtVmlkZW9fVjRfb2ZmbGluZUtleTogc2V0U3VyZmFjZSAiICsgc3VyZmFjZUhvbGRlcik7CisgICAgICAgIG1QbGF5ZXIuc2V0U3VyZmFjZShzdXJmYWNlSG9sZGVyLmdldFN1cmZhY2UoKSk7CisgICAgICAgIHN1cmZhY2VIb2xkZXIuc2V0S2VlcFNjcmVlbk9uKHRydWUpOworCisgICAgICAgIG1DYWxsU3RhdHVzID0gTWVkaWFQbGF5ZXIyLkNBTExfU1RBVFVTX05PX0VSUk9SOworICAgICAgICBEcm1JbmZvIGRybUluZm8gPSBudWxsOworCisgICAgICAgIGZvciAoaW50IHJvdW5kID0gMDsgcm91bmQgPCAyOyByb3VuZCsrKSB7CisgICAgICAgICAgICBib29sZWFuIGtleVJlcXVlc3RSb3VuZCA9IChyb3VuZCA9PSAwKTsKKyAgICAgICAgICAgIGJvb2xlYW4gcmVzdG9yZVJvdW5kID0gKHJvdW5kID09IDEpOworICAgICAgICAgICAgTG9nLnYoVEFHLCAicGxheUxvYWRlZFZpZGVvOiByb3VuZCAiICsgcm91bmQpOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1QbGF5ZXIuc2V0RXZlbnRDYWxsYmFjayhtRXhlY3V0b3IsIG1FQ2IpOworCisgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAicGxheUxvYWRlZFZpZGVvOiBzZXREYXRhU291cmNlKCkiKTsKKyAgICAgICAgICAgICAgICBtUGxheWVyLnNldERhdGFTb3VyY2UoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGF0YVNvdXJjZURlc2MuQnVpbGRlcigpLnNldERhdGFTb3VyY2UobUNvbnRleHQsIGZpbGUpLmJ1aWxkKCkpOworCisgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAicGxheUxvYWRlZFZpZGVvOiBwcmVwYXJlKCkiKTsKKyAgICAgICAgICAgICAgICBtUGxheWVyLnByZXBhcmUoKTsKKyAgICAgICAgICAgICAgICBtT25QcmVwYXJlZENhbGxlZC53YWl0Rm9yU2lnbmFsKCk7CisKKyAgICAgICAgICAgICAgICAvLyBidXQgcHJlcGFyaW5nIHRoZSBEUk0gZXZlcnkgdGltZSB3aXRoIHByb3BlciBrZXkgcmVxdWVzdCB0eXBlCisgICAgICAgICAgICAgICAgZHJtSW5mbyA9IG1QbGF5ZXIuZ2V0RHJtSW5mbygpOworICAgICAgICAgICAgICAgIGlmIChkcm1JbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGtleVJlcXVlc3RSb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXNraW5nIGZvciBvZmZsaW5lIGtleXMKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldHVwRHJtKGRybUluZm8sIHRydWUgLyogcHJlcGFyZURybSAqLywgdHJ1ZSAvKiBzeW5jaHJvbm91c05ldHdvcmtpbmcgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYURybS5LRVlfVFlQRV9PRkZMSU5FKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXN0b3JlUm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldHVwRHJtUmVzdG9yZShkcm1JbmZvLCB0cnVlIC8qIHByZXBhcmVEcm0gKi8pOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbCgicHJlcGFyZVBsYXllcjogdW5leHBlY3RlZCByb3VuZCAiICsgcm91bmQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgInByZXBhcmVQbGF5ZXI6IHNldHVwRHJtIGRvbmUhIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJlcGFyZUZhaWxlZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMb2cudihUQUcsICJwbGF5TG9hZGVkVmlkZW86IHBsYXkoKSIpOworICAgICAgICAgICAgbVBsYXllci5wbGF5KCk7CisgICAgICAgICAgICBpZiAoIW1BdWRpb09ubHkpIHsKKyAgICAgICAgICAgICAgICBtT25WaWRlb1NpemVDaGFuZ2VkQ2FsbGVkLndhaXRGb3JTaWduYWwoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1QbGF5ZXIuc2V0UGxheWVyVm9sdW1lKHZvbHVtZSk7CisKKyAgICAgICAgICAgIC8vIHdhaXRpbmcgdG8gY29tcGxldGUKKyAgICAgICAgICAgIGlmIChwbGF5VGltZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAicGxheUxvYWRlZFZpZGVvOiB3YWl0aW5nIGZvciBwbGF5YmFjayBjb21wbGV0aW9uIik7CisgICAgICAgICAgICAgICAgbU9uUGxheWJhY2tDb21wbGV0ZWQud2FpdEZvclNpZ25hbCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMb2cudihUQUcsICJwbGF5TG9hZGVkVmlkZW86IHdhaXRpbmcgd2hpbGUgcGxheWluZyBmb3IgIiArIHBsYXlUaW1lKTsKKyAgICAgICAgICAgICAgICBtT25QbGF5YmFja0NvbXBsZXRlZC53YWl0Rm9yU2lnbmFsKHBsYXlUaW1lKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAoZHJtSW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXN0b3JlUm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbGVhc2luZyB0aGUgb2ZmbGluZSBrZXkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldHVwRHJtKG51bGwgLyogZHJtSW5mbyAqLywgZmFsc2UgLyogcHJlcGFyZURybSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogc3luY2hyb25vdXNOZXR3b3JraW5nICovLCBNZWRpYURybS5LRVlfVFlQRV9SRUxFQVNFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgInBsYXlMb2FkZWRWaWRlbzogcmVsZWFzZWQgb2ZmbGluZSBrZXlzIik7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJwbGF5TG9hZGVkVmlkZW86IHJlbGVhc2VEcm0iKTsKKyAgICAgICAgICAgICAgICAgICAgbVBsYXllci5yZWxlYXNlRHJtKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBQcmVwYXJlRmFpbGVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChrZXlSZXF1ZXN0Um91bmQpIHsKKyAgICAgICAgICAgICAgICBtT25QcmVwYXJlZENhbGxlZC5yZXNldCgpOworICAgICAgICAgICAgICAgIG1PblZpZGVvU2l6ZUNoYW5nZWRDYWxsZWQucmVzZXQoKTsKKyAgICAgICAgICAgICAgICBtT25QbGF5YmFja0NvbXBsZXRlZC5yZXNldCgpOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBzbGVlcEJldHdlZW5Sb3VuZHMgPSAxMDAwOworICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChzbGVlcEJldHdlZW5Sb3VuZHMpOworCisgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAicGxheUxvYWRlZFZpZGVvOiByZXNldCIpOworICAgICAgICAgICAgICAgIG1QbGF5ZXIucmVzZXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAgLy8gZm9yCisgICAgfQorCisgICAgLy8gQ29udmVydHMgYSBCTUZGIFBTU0ggaW5pdERhdGEgdG8gYSByYXcgY2VuYyBpbml0RGF0YQorICAgIHByb3RlY3RlZCBieXRlW10gbWFrZUNlbmNQU1NIKFVVSUQgdXVpZCwgYnl0ZVtdIGJtZmZQc3NoRGF0YSkgeworICAgICAgICBieXRlW10gcHNzaF9oZWFkZXIgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpICdwJywgKGJ5dGUpICdzJywgKGJ5dGUpICdzJywgKGJ5dGUpICdoJyB9OworICAgICAgICBieXRlW10gcHNzaF92ZXJzaW9uID0gbmV3IGJ5dGVbXSB7IDEsIDAsIDAsIDAgfTsKKyAgICAgICAgaW50IGJveFNpemVCeXRlQ291bnQgPSA0OworICAgICAgICBpbnQgdXVpZEJ5dGVDb3VudCA9IDE2OworICAgICAgICBpbnQgZGF0YVNpemVCeXRlQ291bnQgPSA0OworICAgICAgICAvLyBQZXIgIlczQyBjZW5jIEluaXRpYWxpemF0aW9uIERhdGEgRm9ybWF0IiBkb2N1bWVudDoKKyAgICAgICAgLy8gYm94IHNpemUgKyAncHNzaCcgKyB2ZXJzaW9uICsgdXVpZCArIHBheWxvYWQgKyBzaXplIG9mIGRhdGEKKyAgICAgICAgaW50IGJveFNpemUgPSBib3hTaXplQnl0ZUNvdW50ICsgcHNzaF9oZWFkZXIubGVuZ3RoICsgcHNzaF92ZXJzaW9uLmxlbmd0aAorICAgICAgICAgICAgICAgICsgdXVpZEJ5dGVDb3VudCArIGJtZmZQc3NoRGF0YS5sZW5ndGggKyBkYXRhU2l6ZUJ5dGVDb3VudDsKKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsKKworICAgICAgICAvLyB0aGUgZGVmYXVsdCB3cml0ZSBpcyBiaWctZW5kaWFuLCBpLmUuLCBuZXR3b3JrIGJ5dGUgb3JkZXIKKyAgICAgICAgQnl0ZUJ1ZmZlciByYXdQc3NoID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShib3hTaXplKTsKKyAgICAgICAgcmF3UHNzaC5wdXRJbnQoYm94U2l6ZSk7CisgICAgICAgIHJhd1Bzc2gucHV0KHBzc2hfaGVhZGVyKTsKKyAgICAgICAgcmF3UHNzaC5wdXQocHNzaF92ZXJzaW9uKTsKKyAgICAgICAgcmF3UHNzaC5wdXRMb25nKHV1aWQuZ2V0TW9zdFNpZ25pZmljYW50Qml0cygpKTsKKyAgICAgICAgcmF3UHNzaC5wdXRMb25nKHV1aWQuZ2V0TGVhc3RTaWduaWZpY2FudEJpdHMoKSk7CisgICAgICAgIHJhd1Bzc2gucHV0KGJtZmZQc3NoRGF0YSk7CisgICAgICAgIHJhd1Bzc2gucHV0SW50KGRhdGFTaXplKTsKKworICAgICAgICByZXR1cm4gcmF3UHNzaC5hcnJheSgpOworICAgIH0KKworICAgIC8qCisgICAgICogU2V0cyB1cCB0aGUgRFJNIGZvciB0aGUgZmlyc3QgRFJNIHNjaGVtZSBmcm9tIHRoZSBzdXBwb3J0ZWQgbGlzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkcm1JbmZvIERSTSBpbmZvIG9mIHRoZSBzb3VyY2UKKyAgICAgKiBAcGFyYW0gcHJlcGFyZURybSB3aGV0aGVyIHByZXBhcmVEcm0gc2hvdWxkIGJlIGNhbGxlZAorICAgICAqIEBwYXJhbSBzeW5jaHJvbm91c05ldHdvcmtpbmcgd2hldGhlciB0aGUgbmV0d29yayBvcGVyYXRpb24gb2Yga2V5IHJlcXVlc3QvcmVzcG9uc2Ugd2lsbAorICAgICAqICAgICAgICBiZSBwZXJmb3JtZWQgc3luY2hyb25vdXNseQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXR1cERybShEcm1JbmZvIGRybUluZm8sIGJvb2xlYW4gcHJlcGFyZURybSwgYm9vbGVhbiBzeW5jaHJvbm91c05ldHdvcmtpbmcsCisgICAgICAgICAgICBpbnQga2V5VHlwZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIExvZy5kKFRBRywgInNldHVwRHJtOiBkcm1JbmZvOiAiICsgZHJtSW5mbyArICIgcHJlcGFyZURybTogIiArIHByZXBhcmVEcm0KKyAgICAgICAgICAgICAgICArICIgc3luY2hyb25vdXNOZXR3b3JraW5nOiAiICsgc3luY2hyb25vdXNOZXR3b3JraW5nKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJ5dGVbXSBpbml0RGF0YSA9IG51bGw7CisgICAgICAgICAgICBTdHJpbmcgbWltZSA9IG51bGw7CisgICAgICAgICAgICBTdHJpbmcga2V5VHlwZVN0ciA9ICJVbmV4cGVjdGVkIjsKKworICAgICAgICAgICAgc3dpdGNoIChrZXlUeXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBNZWRpYURybS5LRVlfVFlQRV9TVFJFQU1JTkc6CisgICAgICAgICAgICAgICAgY2FzZSBNZWRpYURybS5LRVlfVFlQRV9PRkZMSU5FOgorICAgICAgICAgICAgICAgICAgICAvLyBEUk0gcHJlcGFyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgTGlzdDxVVUlEPiBzdXBwb3J0ZWRTY2hlbWVzID0gZHJtSW5mby5nZXRTdXBwb3J0ZWRTY2hlbWVzKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdXBwb3J0ZWRTY2hlbWVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbCgic2V0dXBEcm06IE5vIHN1cHBvcnRlZFNjaGVtZXMiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIGluc3RlYWQgb2Ygc3VwcG9ydGVkU2NoZW1lc1swXSBpbiBHVFMKKyAgICAgICAgICAgICAgICAgICAgVVVJRCBkcm1TY2hlbWUgPSBDTEVBUktFWV9TQ0hFTUVfVVVJRDsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAic2V0dXBEcm06IHNlbGVjdGVkICIgKyBkcm1TY2hlbWUpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChwcmVwYXJlRHJtKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtUGxheWVyLnByZXBhcmVEcm0oZHJtU2NoZW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBwc3NoRGF0YSA9IGRybUluZm8uZ2V0UHNzaCgpLmdldChkcm1TY2hlbWUpOworICAgICAgICAgICAgICAgICAgICAvLyBkaXZlcmdpbmcgZnJvbSBHVFMKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBzc2hEYXRhID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluaXREYXRhID0gbUNsZWFyS2V5UHNzaDsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInNldHVwRHJtOiBDTEVBUktFWSBzY2hlbWUgbm90IGZvdW5kIGluIFBTU0guIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgVXNpbmcgZGVmYXVsdCBkYXRhLiIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2FuIHNraXAgY29udmVyc2lvbiBpZiBDbGVhcktleSBhZGRzIHN1cHBvcnQgZm9yIEJNRkYgaW5pdERhdGEgYi82NDg2MzExMgorICAgICAgICAgICAgICAgICAgICAgICAgaW5pdERhdGEgPSBtYWtlQ2VuY1BTU0goQ0xFQVJLRVlfU0NIRU1FX1VVSUQsIHBzc2hEYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJzZXR1cERybTogaW5pdERhdGFbIiArIGRybVNjaGVtZSArICJdOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBBcnJheXMudG9TdHJpbmcoaW5pdERhdGEpKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBkaXZlcmdpbmcgZnJvbSBHVFMKKyAgICAgICAgICAgICAgICAgICAgbWltZSA9ICJjZW5jIjsKKworICAgICAgICAgICAgICAgICAgICBrZXlUeXBlU3RyID0gKGtleVR5cGUgPT0gTWVkaWFEcm0uS0VZX1RZUEVfU1RSRUFNSU5HKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gIktFWV9UWVBFX1NUUkVBTUlORyIgOiAiS0VZX1RZUEVfT0ZGTElORSI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNZWRpYURybS5LRVlfVFlQRV9SRUxFQVNFOgorICAgICAgICAgICAgICAgICAgICBpZiAobUtleVNldElkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwoInNldHVwRHJtOiBLRVlfVFlQRV9SRUxFQVNFIHJlcXVpcmVzIGEgdmFsaWQga2V5U2V0SWQuIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAga2V5VHlwZVN0ciA9ICJLRVlfVFlQRV9SRUxFQVNFIjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBmYWlsKCJzZXR1cERybTogVW5leHBlY3RlZCBrZXlUeXBlICIgKyBrZXlUeXBlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgTWVkaWFEcm0uS2V5UmVxdWVzdCByZXF1ZXN0ID0gbVBsYXllci5nZXREcm1LZXlSZXF1ZXN0KAorICAgICAgICAgICAgICAgICAgICAoa2V5VHlwZSA9PSBNZWRpYURybS5LRVlfVFlQRV9SRUxFQVNFKSA/IG1LZXlTZXRJZCA6IG51bGwsCisgICAgICAgICAgICAgICAgICAgIGluaXREYXRhLAorICAgICAgICAgICAgICAgICAgICBtaW1lLAorICAgICAgICAgICAgICAgICAgICBrZXlUeXBlLAorICAgICAgICAgICAgICAgICAgICBudWxsIC8qIG9wdGlvbmFsS2V5UmVxdWVzdFBhcmFtZXRlcnMgKi8KKyAgICAgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgTG9nLmQoVEFHLCAic2V0dXBEcm06IG1QbGF5ZXIuZ2V0RHJtS2V5UmVxdWVzdCgiICsga2V5VHlwZVN0cgorICAgICAgICAgICAgICAgICAgICArICIpIHJlcXVlc3QgLT4gIiArIHJlcXVlc3QpOworCisgICAgICAgICAgICAvLyBkaXZlcmdpbmcgZnJvbSBHVFMKKyAgICAgICAgICAgIGJ5dGVbXVtdIGNsZWFyS2V5cyA9IG5ldyBieXRlW11bXSB7IENMRUFSX0tFWV9DRU5DIH07CisgICAgICAgICAgICBieXRlW10gcmVzcG9uc2UgPSBjcmVhdGVLZXlzUmVzcG9uc2UocmVxdWVzdCwgY2xlYXJLZXlzKTsKKworICAgICAgICAgICAgLy8gbnVsbCBpcyByZXR1cm5lZCB3aGVuIHRoZSByZXNwb25zZSBpcyBmb3IgYSBzdHJlYW1pbmcgb3IgcmVsZWFzZSByZXF1ZXN0LgorICAgICAgICAgICAgYnl0ZVtdIGtleVNldElkID0gbVBsYXllci5wcm92aWRlRHJtS2V5UmVzcG9uc2UoCisgICAgICAgICAgICAgICAgICAgIChrZXlUeXBlID09IE1lZGlhRHJtLktFWV9UWVBFX1JFTEVBU0UpID8gbUtleVNldElkIDogbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UpOworICAgICAgICAgICAgTG9nLmQoVEFHLCAic2V0dXBEcm06IHByb3ZpZGVEcm1LZXlSZXNwb25zZSAtPiAiICsgQXJyYXlzLnRvU3RyaW5nKGtleVNldElkKSk7CisgICAgICAgICAgICAvLyBzdG9yaW5nIG9mZmxpbmUga2V5IGZvciBhIGxhdGVyIHJlc3RvcmUKKyAgICAgICAgICAgIG1LZXlTZXRJZCA9IChrZXlUeXBlID09IE1lZGlhRHJtLktFWV9UWVBFX09GRkxJTkUpID8ga2V5U2V0SWQgOiBudWxsOworCisgICAgICAgIH0gY2F0Y2ggKE1lZGlhUGxheWVyMi5Ob0RybVNjaGVtZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJzZXR1cERybTogTm9Ecm1TY2hlbWVFeGNlcHRpb24iKTsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9IGNhdGNoIChNZWRpYVBsYXllcjIuUHJvdmlzaW9uaW5nTmV0d29ya0Vycm9yRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgInNldHVwRHJtOiBQcm92aXNpb25pbmdOZXR3b3JrRXJyb3JFeGNlcHRpb24iKTsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9IGNhdGNoIChNZWRpYVBsYXllcjIuUHJvdmlzaW9uaW5nU2VydmVyRXJyb3JFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAic2V0dXBEcm06IFByb3Zpc2lvbmluZ1NlcnZlckVycm9yRXhjZXB0aW9uIik7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRTY2hlbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAic2V0dXBEcm06IFVuc3VwcG9ydGVkU2NoZW1lRXhjZXB0aW9uIik7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfSBjYXRjaCAoUmVzb3VyY2VCdXN5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgInNldHVwRHJtOiBSZXNvdXJjZUJ1c3lFeGNlcHRpb24iKTsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAic2V0dXBEcm06IEV4Y2VwdGlvbiAiICsgZSk7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQorICAgIH0gLy8gc2V0dXBEcm0KKworICAgIHByaXZhdGUgdm9pZCBzZXR1cERybVJlc3RvcmUoRHJtSW5mbyBkcm1JbmZvLCBib29sZWFuIHByZXBhcmVEcm0pIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBMb2cuZChUQUcsICJzZXR1cERybVJlc3RvcmU6IGRybUluZm86ICIgKyBkcm1JbmZvICsgIiBwcmVwYXJlRHJtOiAiICsgcHJlcGFyZURybSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAocHJlcGFyZURybSkgeworICAgICAgICAgICAgICAgIC8vIERSTSBwcmVwYXJhdGlvbgorICAgICAgICAgICAgICAgIExpc3Q8VVVJRD4gc3VwcG9ydGVkU2NoZW1lcyA9IGRybUluZm8uZ2V0U3VwcG9ydGVkU2NoZW1lcygpOworICAgICAgICAgICAgICAgIGlmIChzdXBwb3J0ZWRTY2hlbWVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBmYWlsKCJzZXR1cERybVJlc3RvcmU6IE5vIHN1cHBvcnRlZFNjaGVtZXMiKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBpbnN0ZWFkIG9mIHN1cHBvcnRlZFNjaGVtZXNbMF0gaW4gR1RTCisgICAgICAgICAgICAgICAgVVVJRCBkcm1TY2hlbWUgPSBDTEVBUktFWV9TQ0hFTUVfVVVJRDsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJzZXR1cERybVJlc3RvcmU6IHNlbGVjdGVkICIgKyBkcm1TY2hlbWUpOworCisgICAgICAgICAgICAgICAgbVBsYXllci5wcmVwYXJlRHJtKGRybVNjaGVtZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtS2V5U2V0SWQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZhaWwoInNldHVwRHJtUmVzdG9yZTogT2ZmbGluZSBrZXkgaGFzIG5vdCBiZWVuIHNldHVwLiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtUGxheWVyLnJlc3RvcmVEcm1LZXlzKG1LZXlTZXRJZCk7CisKKyAgICAgICAgfSBjYXRjaCAoTWVkaWFQbGF5ZXIyLk5vRHJtU2NoZW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy52KFRBRywgInNldHVwRHJtUmVzdG9yZTogTm9Ecm1TY2hlbWVFeGNlcHRpb24iKTsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLnYoVEFHLCAic2V0dXBEcm1SZXN0b3JlOiBFeGNlcHRpb24gIiArIGUpOworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0KKyAgICB9IC8vIHNldHVwRHJtUmVzdG9yZQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIERpdmVyZ2luZyBmcm9tIEdUUworCisgICAgLy8gQ2xlYXJrZXkgaGVscGVycworCisgICAgLyoqCisgICAgICogQ29udmVydCBhIGhleCBzdHJpbmcgaW50byBieXRlIGFycmF5LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBoZXhTdHJpbmdUb0J5dGVBcnJheShTdHJpbmcgcykgeworICAgICAgICBpbnQgbGVuID0gcy5sZW5ndGgoKTsKKyAgICAgICAgYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVtsZW4gLyAyXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkgKz0gMikgeworICAgICAgICAgICAgZGF0YVtpIC8gMl0gPSAoYnl0ZSkgKChDaGFyYWN0ZXIuZGlnaXQocy5jaGFyQXQoaSksIDE2KSA8PCA0KQorICAgICAgICAgICAgICAgICAgICArIENoYXJhY3Rlci5kaWdpdChzLmNoYXJBdChpICsgMSksIDE2KSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXh0cmFjdHMga2V5IGlkcyBmcm9tIHRoZSBwc3NoIGJsb2IgcmV0dXJuZWQgYnkgZ2V0RHJtS2V5UmVxdWVzdCgpIGFuZAorICAgICAqIHBsYWNlcyBpdCBpbiBrZXlJZHMuCisgICAgICoga2V5UmVxdWVzdEJsb2IgZm9ybWF0IChzZWN0aW9uIDUuMS4zLjEpOgorICAgICAqIGh0dHBzOi8vZHZjcy53My5vcmcvaGcvaHRtbC1tZWRpYS9yYXctZmlsZS9kZWZhdWx0L2VuY3J5cHRlZC1tZWRpYS9lbmNyeXB0ZWQtbWVkaWEuaHRtbAorICAgICAqCisgICAgICogQHJldHVybiBzaXplIG9mIGtleUlkcyB2ZWN0b3IgdGhhdCBjb250YWlucyB0aGUga2V5IGlkcywgMCBmb3IgZXJyb3IKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBnZXRLZXlJZHMoYnl0ZVtdIGtleVJlcXVlc3RCbG9iLCBWZWN0b3I8U3RyaW5nPiBrZXlJZHMpIHsKKyAgICAgICAgaWYgKDAgPT0ga2V5UmVxdWVzdEJsb2IubGVuZ3RoIHx8IGtleUlkcyA9PSBudWxsKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJnZXRLZXlJZHM6IEVtcHR5IGtleVJlcXVlc3RCbG9iIG9yIG51bGwga2V5SWRzLiIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcganNvbkxpY2Vuc2VSZXF1ZXN0ID0gbmV3IFN0cmluZyhrZXlSZXF1ZXN0QmxvYik7CisgICAgICAgIGtleUlkcy5jbGVhcigpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBKU09OT2JqZWN0IGxpY2Vuc2UgPSBuZXcgSlNPTk9iamVjdChqc29uTGljZW5zZVJlcXVlc3QpOworICAgICAgICAgICAgTG9nLnYoVEFHLCAiZ2V0S2V5SWRzOiBsaWNlbnNlOiAiICsgbGljZW5zZSk7CisgICAgICAgICAgICBmaW5hbCBKU09OQXJyYXkgaWRzID0gbGljZW5zZS5nZXRKU09OQXJyYXkoImtpZHMiKTsKKyAgICAgICAgICAgIExvZy52KFRBRywgImdldEtleUlkczogaWRzOiAiICsgaWRzKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaWRzLmxlbmd0aCgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBrZXlJZHMuYWRkKGlkcy5nZXRTdHJpbmcoaSkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChKU09ORXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkludmFsaWQgSlNPTiBsaWNlbnNlID0gIiArIGpzb25MaWNlbnNlUmVxdWVzdCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4ga2V5SWRzLnNpemUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIHRoZSBKU09OIFdlYiBLZXkgc3RyaW5nLgorICAgICAqCisgICAgICogQHJldHVybiBKU09OIFdlYiBLZXkgc3RyaW5nLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZUpzb25XZWJLZXlTZXQoVmVjdG9yPFN0cmluZz4ga2V5SWRzLCBWZWN0b3I8U3RyaW5nPiBrZXlzKSB7CisgICAgICAgIFN0cmluZyBqd2tTZXQgPSAie1wia2V5c1wiOlsiOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtleUlkcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgU3RyaW5nIGlkID0gbmV3IFN0cmluZyhrZXlJZHMuZ2V0KGkpLmdldEJ5dGVzKENoYXJzZXQuZm9yTmFtZSgiVVRGLTgiKSkpOworICAgICAgICAgICAgU3RyaW5nIGtleSA9IG5ldyBTdHJpbmcoa2V5cy5nZXQoaSkuZ2V0Qnl0ZXMoQ2hhcnNldC5mb3JOYW1lKCJVVEYtOCIpKSk7CisKKyAgICAgICAgICAgIGp3a1NldCArPSAie1wia3R5XCI6XCJvY3RcIixcImtpZFwiOlwiIiArIGlkICsgIlwiLFwia1wiOlwiIiArIGtleSArICJcIn0iOworICAgICAgICB9CisgICAgICAgIGp3a1NldCArPSAiXX0iOworICAgICAgICByZXR1cm4gandrU2V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyBjbGVhciBrZXkgaWRzIGZyb20gS2V5UmVxdWVzdCBhbmQgY3JlYXRlcyB0aGUgcmVzcG9uc2UgaW4gcGxhY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBieXRlW10gY3JlYXRlS2V5c1Jlc3BvbnNlKE1lZGlhRHJtLktleVJlcXVlc3Qga2V5UmVxdWVzdCwgYnl0ZVtdW10gY2xlYXJLZXlzKSB7CisKKyAgICAgICAgVmVjdG9yPFN0cmluZz4ga2V5SWRzID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7CisgICAgICAgIGlmICgwID09IGdldEtleUlkcyhrZXlSZXF1ZXN0LmdldERhdGEoKSwga2V5SWRzKSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiTm8ga2V5IGlkcyBmb3VuZCBpbiBpbml0RGF0YSIpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2xlYXJLZXlzLmxlbmd0aCAhPSBrZXlJZHMuc2l6ZSgpKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJNaXNtYXRjaCBudW1iZXIgb2Yga2V5IGlkcyBhbmQga2V5czogaWRzPSIKKyAgICAgICAgICAgICAgICAgICAgKyBrZXlJZHMuc2l6ZSgpICsgIiwga2V5cz0iICsgY2xlYXJLZXlzLmxlbmd0aCk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEJhc2U2NCBlbmNvZGVzIGNsZWFya2V5cy4gS2V5cyBhcmUga25vd24gdG8gdGhlIGFwcGxpY2F0aW9uLgorICAgICAgICBWZWN0b3I8U3RyaW5nPiBrZXlzID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xlYXJLZXlzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBTdHJpbmcgY2xlYXJLZXkgPSBCYXNlNjQuZW5jb2RlVG9TdHJpbmcoY2xlYXJLZXlzW2ldLAorICAgICAgICAgICAgICAgICAgICBCYXNlNjQuTk9fUEFERElORyB8IEJhc2U2NC5OT19XUkFQKTsKKyAgICAgICAgICAgIGtleXMuYWRkKGNsZWFyS2V5KTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBqd2tTZXQgPSBjcmVhdGVKc29uV2ViS2V5U2V0KGtleUlkcywga2V5cyk7CisgICAgICAgIGJ5dGVbXSBqc29uUmVzcG9uc2UgPSBqd2tTZXQuZ2V0Qnl0ZXMoQ2hhcnNldC5mb3JOYW1lKCJVVEYtOCIpKTsKKworICAgICAgICByZXR1cm4ganNvblJlc3BvbnNlOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBQbGF5YmFjay9kb3dubG9hZCBoZWxwZXJzCisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNZWRpYURvd25sb2FkTWFuYWdlciB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFEb3dubG9hZE1hbmFnZXIiOworCisgICAgICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBEb3dubG9hZE1hbmFnZXIgbURvd25sb2FkTWFuYWdlcjsKKworICAgICAgICBNZWRpYURvd25sb2FkTWFuYWdlcihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgICAgIG1Eb3dubG9hZE1hbmFnZXIgPQorICAgICAgICAgICAgICAgICAgICAoRG93bmxvYWRNYW5hZ2VyKSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuRE9XTkxPQURfU0VSVklDRSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgbG9uZyBkb3dubG9hZEZpbGVXaXRoUmV0cmllcyhVcmkgdXJpLCBVcmkgZmlsZSwgbG9uZyB0aW1lb3V0LCBpbnQgcmV0cmllcykKKyAgICAgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGxvbmcgaWQgPSAtMTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmV0cmllczsgaSsrKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaWQgPSBkb3dubG9hZEZpbGUodXJpLCBmaWxlLCB0aW1lb3V0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlkICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHJlbW92ZUZpbGUoaWQpOworICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJEb3dubG9hZCBmYWlsZWQgIiArIGkgKyAiIHRpbWVzICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBpZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nIGRvd25sb2FkRmlsZShVcmkgdXJpLCBVcmkgZmlsZSwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgInVyaToiICsgdXJpICsgIiBmaWxlOiIgKyBmaWxlICsgIiB3YWl0OiIgKyB0aW1lb3V0ICsgIiBTZWNzIik7CisgICAgICAgICAgICBmaW5hbCBEb3dubG9hZFJlY2VpdmVyIHJlY2VpdmVyID0gbmV3IERvd25sb2FkUmVjZWl2ZXIoKTsKKyAgICAgICAgICAgIGxvbmcgaWQgPSAtMTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgSW50ZW50RmlsdGVyIGludGVudEZpbHRlciA9CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZW50RmlsdGVyKERvd25sb2FkTWFuYWdlci5BQ1RJT05fRE9XTkxPQURfQ09NUExFVEUpOworICAgICAgICAgICAgICAgIG1Db250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIocmVjZWl2ZXIsIGludGVudEZpbHRlcik7CisKKyAgICAgICAgICAgICAgICBSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdCh1cmkpOworICAgICAgICAgICAgICAgIHJlcXVlc3Quc2V0RGVzdGluYXRpb25VcmkoZmlsZSk7CisgICAgICAgICAgICAgICAgaWQgPSBtRG93bmxvYWRNYW5hZ2VyLmVucXVldWUocmVxdWVzdCk7CisgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiZW5xdWV1ZToiICsgaWQpOworCisgICAgICAgICAgICAgICAgcmVjZWl2ZXIud2FpdEZvckRvd25sb2FkQ29tcGxldGUodGltZW91dCwgaWQpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBtQ29udGV4dC51bnJlZ2lzdGVyUmVjZWl2ZXIocmVjZWl2ZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGlkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlRmlsZShsb25nIGlkKSB7CisgICAgICAgICAgICBMb2cuaShUQUcsICJyZW1vdmVGaWxlOiIgKyBpZCk7CisgICAgICAgICAgICBtRG93bmxvYWRNYW5hZ2VyLnJlbW92ZShpZCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVXJpIGdldFVyaUZvckRvd25sb2FkZWRGaWxlKGxvbmcgaWQpIHsKKyAgICAgICAgICAgIHJldHVybiBtRG93bmxvYWRNYW5hZ2VyLmdldFVyaUZvckRvd25sb2FkZWRGaWxlKGlkKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgZmluYWwgY2xhc3MgRG93bmxvYWRSZWNlaXZlciBleHRlbmRzIEJyb2FkY2FzdFJlY2VpdmVyIHsKKyAgICAgICAgICAgIHByaXZhdGUgSGFzaFNldDxMb25nPiBtQ29tcGxldGVJZHMgPSBuZXcgSGFzaFNldDw+KCk7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUNvbXBsZXRlSWRzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChEb3dubG9hZE1hbmFnZXIuQUNUSU9OX0RPV05MT0FEX0NPTVBMRVRFLmVxdWFscyhpbnRlbnQuZ2V0QWN0aW9uKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ29tcGxldGVJZHMuYWRkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnQuZ2V0TG9uZ0V4dHJhKERvd25sb2FkTWFuYWdlci5FWFRSQV9ET1dOTE9BRF9JRCwgLTEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db21wbGV0ZUlkcy5ub3RpZnlBbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzQ29tcGxldGVMb2NrZWQobG9uZy4uLiBpZHMpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGxvbmcgaWQgOiBpZHMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtQ29tcGxldGVJZHMuY29udGFpbnMoaWQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdhaXRGb3JEb3dubG9hZENvbXBsZXRlKGxvbmcgdGltZW91dFNlY3MsIGxvbmcuLi4gd2FpdEZvcklkcykKKyAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBpZiAod2FpdEZvcklkcy5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNaXNzaW5nIElEcyB0byB3YWl0IGZvciIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgc3RhcnRUaW1lID0gU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCk7CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Db21wbGV0ZUlkcykgeworICAgICAgICAgICAgICAgICAgICAgICAgbUNvbXBsZXRlSWRzLndhaXQoMTAwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNDb21wbGV0ZUxvY2tlZCh3YWl0Rm9ySWRzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gd2hpbGUgKChTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKSAtIHN0YXJ0VGltZSkgPCB0aW1lb3V0U2VjcyAqIDEwMDApOworCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIlRpbWVvdXQgd2FpdGluZyBmb3IgSURzICIgKyBBcnJheXMudG9TdHJpbmcod2FpdEZvcklkcykKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIjsgcmVjZWl2ZWQgIiArIG1Db21wbGV0ZUlkcy50b1N0cmluZygpCisgICAgICAgICAgICAgICAgICAgICAgICArICIuICBNYWtlIHN1cmUgeW91IGhhdmUgV2lGaSBvciBzb21lIG90aGVyIGNvbm5lY3Rpdml0eSBmb3IgdGhpcyB0ZXN0LiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9ICAvLyBNZWRpYURvd25sb2FkTWFuYWdlcgorCit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvTWVkaWFQbGF5ZXIyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL01lZGlhUGxheWVyMlRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTRmN2I5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL01lZGlhUGxheWVyMlRlc3QuamF2YQpAQCAtMCwwICsxLDIyODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQubWVkaWEuY3RzOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRGaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLkNhbWVyYTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQXR0cmlidXRlczsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkRhdGFTb3VyY2VEZXNjOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWEyRGF0YVNvdXJjZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRm9ybWF0OworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YVJldHJpZXZlcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyMjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUmVjb3JkZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVRpbWVzdGFtcDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlBsYXliYWNrUGFyYW1zOworaW1wb3J0IGFuZHJvaWQubWVkaWEuU3VidGl0bGVEYXRhOworaW1wb3J0IGFuZHJvaWQubWVkaWEuU3luY1BhcmFtczsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvZnguQXVkaW9FZmZlY3Q7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpb2Z4LlZpc3VhbGl6ZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5jdHMuUjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmN0cy5UZXN0VXRpbHMuTW9uaXRvcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5FbnZpcm9ubWVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBvd2VyTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlJlcXVpcmVzRGV2aWNlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworCitpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5NZWRpYVV0aWxzOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07CisKKy8qKgorICogVGVzdHMgZm9yIHRoZSBNZWRpYVBsYXllcjIgQVBJIGFuZCBsb2NhbCB2aWRlby9hdWRpbyBwbGF5YmFjay4KKyAqCisgKiBUaGUgZmlsZXMgaW4gcmVzL3JhdyB1c2VkIGJ5IHRlc3RMb2NhbFZpZGVvKiBhcmUgKGMpIGNvcHlyaWdodCAyMDA4LAorICogQmxlbmRlciBGb3VuZGF0aW9uIC8gd3d3LmJpZ2J1Y2tidW5ueS5vcmcsIGFuZCBhcmUgbGljZW5zZWQgdW5kZXIgdGhlIENyZWF0aXZlIENvbW1vbnMKKyAqIEF0dHJpYnV0aW9uIDMuMCBMaWNlbnNlIGF0IGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LzMuMC91cy8uCisgKi8KK0BTbWFsbFRlc3QKK0BSZXF1aXJlc0RldmljZQorQEFwcE1vZGVGdWxsKHJlYXNvbiA9ICJUT0RPOiBldmFsdWF0ZSBhbmQgcG9ydCB0byBpbnN0YW50IikKK3B1YmxpYyBjbGFzcyBNZWRpYVBsYXllcjJUZXN0IGV4dGVuZHMgTWVkaWFQbGF5ZXIyVGVzdEJhc2UgeworICAgIC8vIFRPRE86IHJlbW92ZSB0aGlzIGZsYWcgdG8gZW5hYmxlIHRlc3RzLgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gSUdOT1JFX1RFU1RTID0gdHJ1ZTsKKworICAgIHByaXZhdGUgU3RyaW5nIFJFQ09SREVEX0ZJTEU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiTWVkaWFQbGF5ZXIyVGVzdCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgIFJFQ09SREVEX1ZJREVPX1dJRFRIICA9IDE3NjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgIFJFQ09SREVEX1ZJREVPX0hFSUdIVCA9IDE0NDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFJFQ09SREVEX0RVUkFUSU9OX01TICA9IDMwMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgRkxPQVRfVE9MRVJBTkNFID0gLjAwMDFmOworCisgICAgcHJpdmF0ZSBmaW5hbCBWZWN0b3I8SW50ZWdlcj4gbVRpbWVkVGV4dFRyYWNrSW5kZXggPSBuZXcgVmVjdG9yPD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIE1vbml0b3IgbU9uVGltZWRUZXh0Q2FsbGVkID0gbmV3IE1vbml0b3IoKTsKKyAgICBwcml2YXRlIGludCBtU2VsZWN0ZWRUaW1lZFRleHRJbmRleDsKKworICAgIHByaXZhdGUgZmluYWwgVmVjdG9yPEludGVnZXI+IG1TdWJ0aXRsZVRyYWNrSW5kZXggPSBuZXcgVmVjdG9yPD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIE1vbml0b3IgbU9uU3VidGl0bGVEYXRhQ2FsbGVkID0gbmV3IE1vbml0b3IoKTsKKyAgICBwcml2YXRlIGludCBtU2VsZWN0ZWRTdWJ0aXRsZUluZGV4OworCisgICAgcHJpdmF0ZSBGaWxlIG1PdXRGaWxlOworCisgICAgcHJpdmF0ZSBpbnQgbUJvdW5kc0NvdW50OworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgUkVDT1JERURfRklMRSA9IG5ldyBGaWxlKEVudmlyb25tZW50LmdldEV4dGVybmFsU3RvcmFnZURpcmVjdG9yeSgpLAorICAgICAgICAgICAgICAgICJtZWRpYXBsYXllcl9yZWNvcmQub3V0IikuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgIG1PdXRGaWxlID0gbmV3IEZpbGUoUkVDT1JERURfRklMRSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICAgICAgaWYgKG1PdXRGaWxlICE9IG51bGwgJiYgbU91dEZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIG1PdXRGaWxlLmRlbGV0ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQnVnIDEzNjUyOTI3CisgICAgcHVibGljIHZvaWQgdGVzdFZvcmJpc0NyYXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChJR05PUkVfVEVTVFMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBNZWRpYVBsYXllcjIgbXAgPSBtUGxheWVyOworICAgICAgICBNZWRpYVBsYXllcjIgbXAyID0gbVBsYXllcjI7CisgICAgICAgIEFzc2V0RmlsZURlc2NyaXB0b3IgYWZkMiA9IG1SZXNvdXJjZXMub3BlblJhd1Jlc291cmNlRmQoUi5yYXcudGVzdG1wM18yKTsKKyAgICAgICAgbXAyLnNldERhdGFTb3VyY2UobmV3IERhdGFTb3VyY2VEZXNjLkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXREYXRhU291cmNlKGFmZDIuZ2V0RmlsZURlc2NyaXB0b3IoKSwgYWZkMi5nZXRTdGFydE9mZnNldCgpLCBhZmQyLmdldExlbmd0aCgpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgTW9uaXRvciBvblByZXBhcmVDYWxsZWQgPSBuZXcgTW9uaXRvcigpOworICAgICAgICBNb25pdG9yIG9uRXJyb3JDYWxsZWQgPSBuZXcgTW9uaXRvcigpOworICAgICAgICBNZWRpYVBsYXllcjIuTWVkaWFQbGF5ZXIyRXZlbnRDYWxsYmFjayBlY2IgPSBuZXcgTWVkaWFQbGF5ZXIyLk1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2soKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uSW5mbyhNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCwgaW50IHdoYXQsIGludCBleHRyYSkgeworICAgICAgICAgICAgICAgIGlmICh3aGF0ID09IE1lZGlhUGxheWVyMi5NRURJQV9JTkZPX1BSRVBBUkVEKSB7CisgICAgICAgICAgICAgICAgICAgIG9uUHJlcGFyZUNhbGxlZC5zaWduYWwoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCwgaW50IHdoYXQsIGludCBleHRyYSkgeworICAgICAgICAgICAgICAgIG9uRXJyb3JDYWxsZWQuc2lnbmFsKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIG1wMi5zZXRNZWRpYVBsYXllcjJFdmVudENhbGxiYWNrKG1FeGVjdXRvciwgZWNiKTsKKyAgICAgICAgbXAyLnByZXBhcmUoKTsKKyAgICAgICAgb25QcmVwYXJlQ2FsbGVkLndhaXRGb3JTaWduYWwoKTsKKyAgICAgICAgYWZkMi5jbG9zZSgpOworICAgICAgICBtcDIuY2xlYXJNZWRpYVBsYXllcjJFdmVudENhbGxiYWNrKCk7CisKKyAgICAgICAgbXAyLmxvb3BDdXJyZW50KHRydWUpOworICAgICAgICBtcDIucGxheSgpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBBc3NldEZpbGVEZXNjcmlwdG9yIGFmZCA9IG1SZXNvdXJjZXMub3BlblJhd1Jlc291cmNlRmQoUi5yYXcuYnVnMTM2NTI5MjcpOworICAgICAgICAgICAgICAgIG1wLnNldERhdGFTb3VyY2UobmV3IERhdGFTb3VyY2VEZXNjLkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldERhdGFTb3VyY2UoYWZkLmdldEZpbGVEZXNjcmlwdG9yKCksIGFmZC5nZXRTdGFydE9mZnNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmZC5nZXRMZW5ndGgoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgICAgICAgICBtcC5zZXRNZWRpYVBsYXllcjJFdmVudENhbGxiYWNrKG1FeGVjdXRvciwgZWNiKTsKKyAgICAgICAgICAgICAgICBvblByZXBhcmVDYWxsZWQucmVzZXQoKTsKKyAgICAgICAgICAgICAgICBtcC5wcmVwYXJlKCk7CisgICAgICAgICAgICAgICAgb25FcnJvckNhbGxlZC53YWl0Rm9yU2lnbmFsKCk7CisgICAgICAgICAgICAgICAgYWZkLmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkIHRvIGZhaWwKKyAgICAgICAgICAgICAgICBMb2cuaSgiQEBAIiwgImZhaWxlZDogIiArIGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDUwMCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJtZWRpYSBwbGF5ZXIgZGllZCIsIG1wMi5pc1BsYXlpbmcoKSk7CisgICAgICAgICAgICBtcC5yZXNldCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFBsYXlOdWxsU291cmNlUGF0aCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoSUdOT1JFX1RFU1RTKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgTW9uaXRvciBvblNldERhdGFTb3VyY2VDYWxsZWQgPSBuZXcgTW9uaXRvcigpOworICAgICAgICBNZWRpYVBsYXllcjIuTWVkaWFQbGF5ZXIyRXZlbnRDYWxsYmFjayBlY2IgPSBuZXcgTWVkaWFQbGF5ZXIyLk1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2soKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2FsbENvbXBsZXRlZChNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCwgaW50IHdoYXQsIGludCBzdGF0dXMpIHsKKyAgICAgICAgICAgICAgICBpZiAod2hhdCA9PSBNZWRpYVBsYXllcjIuQ0FMTF9DT01QTEVURURfU0VUX0RBVEFfU09VUkNFKSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoc3RhdHVzICE9IE1lZGlhUGxheWVyMi5DQUxMX1NUQVRVU19OT19FUlJPUik7CisgICAgICAgICAgICAgICAgICAgIG9uU2V0RGF0YVNvdXJjZUNhbGxlZC5zaWduYWwoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHN5bmNocm9uaXplZCAobUV2ZW50Q2JMb2NrKSB7CisgICAgICAgICAgICBtRXZlbnRDYWxsYmFja3MuYWRkKGVjYik7CisgICAgICAgIH0KKworICAgICAgICBvblNldERhdGFTb3VyY2VDYWxsZWQucmVzZXQoKTsKKyAgICAgICAgbVBsYXllci5zZXREYXRhU291cmNlKChEYXRhU291cmNlRGVzYyludWxsKTsKKyAgICAgICAgb25TZXREYXRhU291cmNlQ2FsbGVkLndhaXRGb3JTaWduYWwoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGxheUF1ZGlvRnJvbURhdGFVUkkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKElHTk9SRV9URVNUUykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZpbmFsIGludCBtcDNEdXJhdGlvbiA9IDM0OTA5OworICAgICAgICBmaW5hbCBpbnQgdG9sZXJhbmNlID0gNzA7CisgICAgICAgIGZpbmFsIGludCBzZWVrRHVyYXRpb24gPSAxMDA7CisKKyAgICAgICAgLy8gVGhpcyBpcyAiUi5yYXcudGVzdG1wM18yIiwgYmFzZTY0LWVuY29kZWQuCisgICAgICAgIGZpbmFsIGludCByZXNpZCA9IFIucmF3LnRlc3RtcDNfMzsKKworICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG1Db250ZXh0LmdldFJlc291cmNlcygpLm9wZW5SYXdSZXNvdXJjZShyZXNpZCk7CisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMpKTsKKworICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBidWlsZGVyLmFwcGVuZCgiZGF0YTo7YmFzZTY0LCIpOworICAgICAgICBidWlsZGVyLmFwcGVuZChyZWFkZXIucmVhZExpbmUoKSk7CisgICAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2UoYnVpbGRlci50b1N0cmluZygpKTsKKworICAgICAgICBNZWRpYVBsYXllcjIgbXAgPSBjcmVhdGVNZWRpYVBsYXllcjIobUNvbnRleHQsIHVyaSk7CisKKyAgICAgICAgTW9uaXRvciBvblByZXBhcmVDYWxsZWQgPSBuZXcgTW9uaXRvcigpOworICAgICAgICBNb25pdG9yIG9uUGxheUNhbGxlZCA9IG5ldyBNb25pdG9yKCk7CisgICAgICAgIE1vbml0b3Igb25TZWVrVG9DYWxsZWQgPSBuZXcgTW9uaXRvcigpOworICAgICAgICBNb25pdG9yIG9uTG9vcEN1cnJlbnRDYWxsZWQgPSBuZXcgTW9uaXRvcigpOworICAgICAgICBNZWRpYVBsYXllcjIuTWVkaWFQbGF5ZXIyRXZlbnRDYWxsYmFjayBlY2IgPSBuZXcgTWVkaWFQbGF5ZXIyLk1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2soKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uSW5mbyhNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCwgaW50IHdoYXQsIGludCBleHRyYSkgeworICAgICAgICAgICAgICAgIGlmICh3aGF0ID09IE1lZGlhUGxheWVyMi5NRURJQV9JTkZPX1BSRVBBUkVEKSB7CisgICAgICAgICAgICAgICAgICAgIG9uUHJlcGFyZUNhbGxlZC5zaWduYWwoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25DYWxsQ29tcGxldGVkKE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkLCBpbnQgd2hhdCwgaW50IHN0YXR1cykgeworICAgICAgICAgICAgICAgIGlmICh3aGF0ID09IE1lZGlhUGxheWVyMi5DQUxMX0NPTVBMRVRFRF9QTEFZKSB7CisgICAgICAgICAgICAgICAgICAgIG9uUGxheUNhbGxlZC5zaWduYWwoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gTWVkaWFQbGF5ZXIyLkNBTExfQ09NUExFVEVEX0xPT1BfQ1VSUkVOVCkgeworICAgICAgICAgICAgICAgICAgICBvbkxvb3BDdXJyZW50Q2FsbGVkLnNpZ25hbCgpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBNZWRpYVBsYXllcjIuQ0FMTF9DT01QTEVURURfU0VFS19UTykgeworICAgICAgICAgICAgICAgICAgICBvblNlZWtUb0NhbGxlZC5zaWduYWwoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIG1wLnNldE1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2sobUV4ZWN1dG9yLCBlY2IpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBBdWRpb0F0dHJpYnV0ZXMgYXR0cmlidXRlcyA9IG5ldyBBdWRpb0F0dHJpYnV0ZXMuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgIC5zZXRJbnRlcm5hbExlZ2FjeVN0cmVhbVR5cGUoQXVkaW9NYW5hZ2VyLlNUUkVBTV9NVVNJQykKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgICAgICBtcC5zZXRBdWRpb0F0dHJpYnV0ZXMoYXR0cmlidXRlcyk7CisgICAgICAgICAgICBtcC5zZXRXYWtlTW9kZShtQ29udGV4dCwgUG93ZXJNYW5hZ2VyLlBBUlRJQUxfV0FLRV9MT0NLKTsKKworICAgICAgICAgICAgYXNzZXJ0RmFsc2UobXAuaXNQbGF5aW5nKCkpOworICAgICAgICAgICAgb25QbGF5Q2FsbGVkLnJlc2V0KCk7CisgICAgICAgICAgICBtcC5wbGF5KCk7CisgICAgICAgICAgICBvblBsYXlDYWxsZWQud2FpdEZvclNpZ25hbCgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtcC5pc1BsYXlpbmcoKSk7CisKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKG1wLmlzTG9vcGluZygpKTsKKyAgICAgICAgICAgIG9uTG9vcEN1cnJlbnRDYWxsZWQucmVzZXQoKTsKKyAgICAgICAgICAgIG1wLmxvb3BDdXJyZW50KHRydWUpOworICAgICAgICAgICAgb25Mb29wQ3VycmVudENhbGxlZC53YWl0Rm9yU2lnbmFsKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKG1wLmlzTG9vcGluZygpKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG1wM0R1cmF0aW9uLCBtcC5nZXREdXJhdGlvbigpLCB0b2xlcmFuY2UpOworICAgICAgICAgICAgbG9uZyBwb3MgPSBtcC5nZXRDdXJyZW50UG9zaXRpb24oKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocG9zID49IDApOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShwb3MgPCBtcDNEdXJhdGlvbiAtIHNlZWtEdXJhdGlvbik7CisKKyAgICAgICAgICAgIG9uU2Vla1RvQ2FsbGVkLnJlc2V0KCk7CisgICAgICAgICAgICBtcC5zZWVrVG8ocG9zICsgc2Vla0R1cmF0aW9uLCBNZWRpYVBsYXllcjIuU0VFS19QUkVWSU9VU19TWU5DKTsKKyAgICAgICAgICAgIG9uU2Vla1RvQ2FsbGVkLndhaXRGb3JTaWduYWwoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhwb3MgKyBzZWVrRHVyYXRpb24sIG1wLmdldEN1cnJlbnRQb3NpdGlvbigpLCB0b2xlcmFuY2UpOworCisgICAgICAgICAgICAvLyB0ZXN0IHBhdXNlIGFuZCByZXN0YXJ0CisgICAgICAgICAgICBtcC5wYXVzZSgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNMRUVQX1RJTUUpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UobXAuaXNQbGF5aW5nKCkpOworICAgICAgICAgICAgb25QbGF5Q2FsbGVkLnJlc2V0KCk7CisgICAgICAgICAgICBtcC5wbGF5KCk7CisgICAgICAgICAgICBvblBsYXlDYWxsZWQud2FpdEZvclNpZ25hbCgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtcC5pc1BsYXlpbmcoKSk7CisKKyAgICAgICAgICAgIC8vIHRlc3Qgc3RvcCBhbmQgcmVzdGFydAorICAgICAgICAgICAgbXAucmVzZXQoKTsKKyAgICAgICAgICAgIG1wLnNldE1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2sobUV4ZWN1dG9yLCBlY2IpOworICAgICAgICAgICAgbXAuc2V0RGF0YVNvdXJjZShuZXcgRGF0YVNvdXJjZURlc2MuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgIC5zZXREYXRhU291cmNlKG1Db250ZXh0LCB1cmkpCisgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgICAgIG9uUHJlcGFyZUNhbGxlZC5yZXNldCgpOworICAgICAgICAgICAgbXAucHJlcGFyZSgpOworICAgICAgICAgICAgb25QcmVwYXJlQ2FsbGVkLndhaXRGb3JTaWduYWwoKTsKKworICAgICAgICAgICAgYXNzZXJ0RmFsc2UobXAuaXNQbGF5aW5nKCkpOworICAgICAgICAgICAgb25QbGF5Q2FsbGVkLnJlc2V0KCk7CisgICAgICAgICAgICBtcC5wbGF5KCk7CisgICAgICAgICAgICBvblBsYXlDYWxsZWQud2FpdEZvclNpZ25hbCgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtcC5pc1BsYXlpbmcoKSk7CisKKyAgICAgICAgICAgIC8vIHdhaXRpbmcgdG8gY29tcGxldGUKKyAgICAgICAgICAgIHdoaWxlKG1wLmlzUGxheWluZygpKSB7CisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNMRUVQX1RJTUUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgbXAuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQbGF5QXVkaW8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKElHTk9SRV9URVNUUykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZpbmFsIGludCByZXNpZCA9IFIucmF3LnRlc3RtcDNfMjsKKyAgICAgICAgZmluYWwgaW50IG1wM0R1cmF0aW9uID0gMzQ5MDk7CisgICAgICAgIGZpbmFsIGludCB0b2xlcmFuY2UgPSA3MDsKKyAgICAgICAgZmluYWwgaW50IHNlZWtEdXJhdGlvbiA9IDEwMDsKKworICAgICAgICBNZWRpYVBsYXllcjIgbXAgPSBjcmVhdGVNZWRpYVBsYXllcjIobUNvbnRleHQsIHJlc2lkKTsKKworICAgICAgICBNb25pdG9yIG9uUHJlcGFyZUNhbGxlZCA9IG5ldyBNb25pdG9yKCk7CisgICAgICAgIE1vbml0b3Igb25QbGF5Q2FsbGVkID0gbmV3IE1vbml0b3IoKTsKKyAgICAgICAgTW9uaXRvciBvblNlZWtUb0NhbGxlZCA9IG5ldyBNb25pdG9yKCk7CisgICAgICAgIE1vbml0b3Igb25Mb29wQ3VycmVudENhbGxlZCA9IG5ldyBNb25pdG9yKCk7CisgICAgICAgIE1lZGlhUGxheWVyMi5NZWRpYVBsYXllcjJFdmVudENhbGxiYWNrIGVjYiA9IG5ldyBNZWRpYVBsYXllcjIuTWVkaWFQbGF5ZXIyRXZlbnRDYWxsYmFjaygpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25JbmZvKE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkLCBpbnQgd2hhdCwgaW50IGV4dHJhKSB7CisgICAgICAgICAgICAgICAgaWYgKHdoYXQgPT0gTWVkaWFQbGF5ZXIyLk1FRElBX0lORk9fUFJFUEFSRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgb25QcmVwYXJlQ2FsbGVkLnNpZ25hbCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNhbGxDb21wbGV0ZWQoTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsIGludCB3aGF0LCBpbnQgc3RhdHVzKSB7CisgICAgICAgICAgICAgICAgaWYgKHdoYXQgPT0gTWVkaWFQbGF5ZXIyLkNBTExfQ09NUExFVEVEX1BMQVkpIHsKKyAgICAgICAgICAgICAgICAgICAgb25QbGF5Q2FsbGVkLnNpZ25hbCgpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBNZWRpYVBsYXllcjIuQ0FMTF9DT01QTEVURURfTE9PUF9DVVJSRU5UKSB7CisgICAgICAgICAgICAgICAgICAgIG9uTG9vcEN1cnJlbnRDYWxsZWQuc2lnbmFsKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IE1lZGlhUGxheWVyMi5DQUxMX0NPTVBMRVRFRF9TRUVLX1RPKSB7CisgICAgICAgICAgICAgICAgICAgIG9uU2Vla1RvQ2FsbGVkLnNpZ25hbCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgbXAuc2V0TWVkaWFQbGF5ZXIyRXZlbnRDYWxsYmFjayhtRXhlY3V0b3IsIGVjYik7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEF1ZGlvQXR0cmlidXRlcyBhdHRyaWJ1dGVzID0gbmV3IEF1ZGlvQXR0cmlidXRlcy5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgLnNldEludGVybmFsTGVnYWN5U3RyZWFtVHlwZShBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgICAgIG1wLnNldEF1ZGlvQXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKKyAgICAgICAgICAgIG1wLnNldFdha2VNb2RlKG1Db250ZXh0LCBQb3dlck1hbmFnZXIuUEFSVElBTF9XQUtFX0xPQ0spOworCisgICAgICAgICAgICBhc3NlcnRGYWxzZShtcC5pc1BsYXlpbmcoKSk7CisgICAgICAgICAgICBvblBsYXlDYWxsZWQucmVzZXQoKTsKKyAgICAgICAgICAgIG1wLnBsYXkoKTsKKyAgICAgICAgICAgIG9uUGxheUNhbGxlZC53YWl0Rm9yU2lnbmFsKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKG1wLmlzUGxheWluZygpKTsKKworICAgICAgICAgICAgYXNzZXJ0RmFsc2UobXAuaXNMb29waW5nKCkpOworICAgICAgICAgICAgb25Mb29wQ3VycmVudENhbGxlZC5yZXNldCgpOworICAgICAgICAgICAgbXAubG9vcEN1cnJlbnQodHJ1ZSk7CisgICAgICAgICAgICBvbkxvb3BDdXJyZW50Q2FsbGVkLndhaXRGb3JTaWduYWwoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobXAuaXNMb29waW5nKCkpOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobXAzRHVyYXRpb24sIG1wLmdldER1cmF0aW9uKCksIHRvbGVyYW5jZSk7CisgICAgICAgICAgICBsb25nIHBvcyA9IG1wLmdldEN1cnJlbnRQb3NpdGlvbigpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShwb3MgPj0gMCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHBvcyA8IG1wM0R1cmF0aW9uIC0gc2Vla0R1cmF0aW9uKTsKKworICAgICAgICAgICAgb25TZWVrVG9DYWxsZWQucmVzZXQoKTsKKyAgICAgICAgICAgIG1wLnNlZWtUbyhwb3MgKyBzZWVrRHVyYXRpb24sIE1lZGlhUGxheWVyMi5TRUVLX1BSRVZJT1VTX1NZTkMpOworICAgICAgICAgICAgb25TZWVrVG9DYWxsZWQud2FpdEZvclNpZ25hbCgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHBvcyArIHNlZWtEdXJhdGlvbiwgbXAuZ2V0Q3VycmVudFBvc2l0aW9uKCksIHRvbGVyYW5jZSk7CisKKyAgICAgICAgICAgIC8vIHRlc3QgcGF1c2UgYW5kIHJlc3RhcnQKKyAgICAgICAgICAgIG1wLnBhdXNlKCk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0xFRVBfVElNRSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShtcC5pc1BsYXlpbmcoKSk7CisgICAgICAgICAgICBvblBsYXlDYWxsZWQucmVzZXQoKTsKKyAgICAgICAgICAgIG1wLnBsYXkoKTsKKyAgICAgICAgICAgIG9uUGxheUNhbGxlZC53YWl0Rm9yU2lnbmFsKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKG1wLmlzUGxheWluZygpKTsKKworICAgICAgICAgICAgLy8gdGVzdCBzdG9wIGFuZCByZXN0YXJ0CisgICAgICAgICAgICBtcC5yZXNldCgpOworICAgICAgICAgICAgQXNzZXRGaWxlRGVzY3JpcHRvciBhZmQgPSBtUmVzb3VyY2VzLm9wZW5SYXdSZXNvdXJjZUZkKHJlc2lkKTsKKyAgICAgICAgICAgIG1wLnNldERhdGFTb3VyY2UobmV3IERhdGFTb3VyY2VEZXNjLkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAuc2V0RGF0YVNvdXJjZShhZmQuZ2V0RmlsZURlc2NyaXB0b3IoKSwgYWZkLmdldFN0YXJ0T2Zmc2V0KCksIGFmZC5nZXRMZW5ndGgoKSkKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgICAgICBtcC5zZXRNZWRpYVBsYXllcjJFdmVudENhbGxiYWNrKG1FeGVjdXRvciwgZWNiKTsKKyAgICAgICAgICAgIG9uUHJlcGFyZUNhbGxlZC5yZXNldCgpOworICAgICAgICAgICAgbXAucHJlcGFyZSgpOworICAgICAgICAgICAgb25QcmVwYXJlQ2FsbGVkLndhaXRGb3JTaWduYWwoKTsKKyAgICAgICAgICAgIGFmZC5jbG9zZSgpOworCisgICAgICAgICAgICBhc3NlcnRGYWxzZShtcC5pc1BsYXlpbmcoKSk7CisgICAgICAgICAgICBvblBsYXlDYWxsZWQucmVzZXQoKTsKKyAgICAgICAgICAgIG1wLnBsYXkoKTsKKyAgICAgICAgICAgIG9uUGxheUNhbGxlZC53YWl0Rm9yU2lnbmFsKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKG1wLmlzUGxheWluZygpKTsKKworICAgICAgICAgICAgLy8gd2FpdGluZyB0byBjb21wbGV0ZQorICAgICAgICAgICAgd2hpbGUobXAuaXNQbGF5aW5nKCkpIHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0xFRVBfVElNRSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBtcC5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENvbmN1cmVudFBsYXlBdWRpbygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoSUdOT1JFX1RFU1RTKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgaW50IHJlc2lkID0gUi5yYXcudGVzdDFtMXM7IC8vIE1QMyBsb25nZXIgdGhhbiAxbSBhcmUgdXN1YWx5IG9mZmxvYWRlZAorICAgICAgICBmaW5hbCBpbnQgdG9sZXJhbmNlID0gNzA7CisKKyAgICAgICAgTGlzdDxNZWRpYVBsYXllcjI+IG1wcyA9IFN0cmVhbS5nZW5lcmF0ZSgoKSAtPiBjcmVhdGVNZWRpYVBsYXllcjIobUNvbnRleHQsIHJlc2lkKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxpbWl0KDUpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZvciAoTWVkaWFQbGF5ZXIyIG1wIDogbXBzKSB7CisgICAgICAgICAgICAgICAgTW9uaXRvciBvblBsYXlDYWxsZWQgPSBuZXcgTW9uaXRvcigpOworICAgICAgICAgICAgICAgIE1vbml0b3Igb25Mb29wQ3VycmVudENhbGxlZCA9IG5ldyBNb25pdG9yKCk7CisgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXIyLk1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2sgZWNiID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IE1lZGlhUGxheWVyMi5NZWRpYVBsYXllcjJFdmVudENhbGxiYWNrKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNhbGxDb21wbGV0ZWQoTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aGF0LCBpbnQgc3RhdHVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdoYXQgPT0gTWVkaWFQbGF5ZXIyLkNBTExfQ09NUExFVEVEX1BMQVkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25QbGF5Q2FsbGVkLnNpZ25hbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBNZWRpYVBsYXllcjIuQ0FMTF9DT01QTEVURURfTE9PUF9DVVJSRU5UKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uTG9vcEN1cnJlbnRDYWxsZWQuc2lnbmFsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIG1wLnNldE1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2sobUV4ZWN1dG9yLCBlY2IpOworCisgICAgICAgICAgICAgICAgQXVkaW9BdHRyaWJ1dGVzIGF0dHJpYnV0ZXMgPSBuZXcgQXVkaW9BdHRyaWJ1dGVzLkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEludGVybmFsTGVnYWN5U3RyZWFtVHlwZShBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgICAgICAgICAgbXAuc2V0QXVkaW9BdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOworICAgICAgICAgICAgICAgIG1wLnNldFdha2VNb2RlKG1Db250ZXh0LCBQb3dlck1hbmFnZXIuUEFSVElBTF9XQUtFX0xPQ0spOworCisgICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UobXAuaXNQbGF5aW5nKCkpOworICAgICAgICAgICAgICAgIG9uUGxheUNhbGxlZC5yZXNldCgpOworICAgICAgICAgICAgICAgIG1wLnBsYXkoKTsKKyAgICAgICAgICAgICAgICBvblBsYXlDYWxsZWQud2FpdEZvclNpZ25hbCgpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUobXAuaXNQbGF5aW5nKCkpOworCisgICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UobXAuaXNMb29waW5nKCkpOworICAgICAgICAgICAgICAgIG9uTG9vcEN1cnJlbnRDYWxsZWQucmVzZXQoKTsKKyAgICAgICAgICAgICAgICBtcC5sb29wQ3VycmVudCh0cnVlKTsKKyAgICAgICAgICAgICAgICBvbkxvb3BDdXJyZW50Q2FsbGVkLndhaXRGb3JTaWduYWwoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKG1wLmlzTG9vcGluZygpKTsKKworICAgICAgICAgICAgICAgIGxvbmcgcG9zID0gbXAuZ2V0Q3VycmVudFBvc2l0aW9uKCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShwb3MgPj0gMCk7CisKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0xFRVBfVElNRSk7IC8vIERlbGF5IGVhY2ggdHJhY2sgdG8gYmUgYWJsZSB0byBlYXIgdGhlbQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCBhbGwgbXAzIGFyZSBwbGF5aW5nIGNvbmN1cnJlbnRseSBoZXJlCisgICAgICAgICAgICBmb3IgKE1lZGlhUGxheWVyMiBtcCA6IG1wcykgeworICAgICAgICAgICAgICAgIGxvbmcgcG9zID0gbXAuZ2V0Q3VycmVudFBvc2l0aW9uKCk7CisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNMRUVQX1RJTUUpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhwb3MgKyBTTEVFUF9USU1FLCBtcC5nZXRDdXJyZW50UG9zaXRpb24oKSwgdG9sZXJhbmNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIG1wcy5mb3JFYWNoKE1lZGlhUGxheWVyMjo6Y2xvc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFBsYXlBdWRpb0xvb3BpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKElHTk9SRV9URVNUUykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZpbmFsIGludCByZXNpZCA9IFIucmF3LnRlc3RtcDM7CisKKyAgICAgICAgTWVkaWFQbGF5ZXIyIG1wID0gY3JlYXRlTWVkaWFQbGF5ZXIyKG1Db250ZXh0LCByZXNpZCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBBdWRpb0F0dHJpYnV0ZXMgYXR0cmlidXRlcyA9IG5ldyBBdWRpb0F0dHJpYnV0ZXMuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgIC5zZXRJbnRlcm5hbExlZ2FjeVN0cmVhbVR5cGUoQXVkaW9NYW5hZ2VyLlNUUkVBTV9NVVNJQykKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgICAgICBtcC5zZXRBdWRpb0F0dHJpYnV0ZXMoYXR0cmlidXRlcyk7CisgICAgICAgICAgICBtcC5zZXRXYWtlTW9kZShtQ29udGV4dCwgUG93ZXJNYW5hZ2VyLlBBUlRJQUxfV0FLRV9MT0NLKTsKKyAgICAgICAgICAgIG1wLmxvb3BDdXJyZW50KHRydWUpOworICAgICAgICAgICAgTW9uaXRvciBvbkNvbXBsZXRpb25DYWxsZWQgPSBuZXcgTW9uaXRvcigpOworICAgICAgICAgICAgTW9uaXRvciBvblBsYXlDYWxsZWQgPSBuZXcgTW9uaXRvcigpOworICAgICAgICAgICAgTWVkaWFQbGF5ZXIyLk1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2sgZWNiID0KKyAgICAgICAgICAgICAgICBuZXcgTWVkaWFQbGF5ZXIyLk1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2soKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkluZm8oTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdoYXQsIGludCBleHRyYSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoIkBAQCIsICJnb3Qgb25jb21wbGV0aW9uIik7CisgICAgICAgICAgICAgICAgICAgICAgICBvbkNvbXBsZXRpb25DYWxsZWQuc2lnbmFsKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DYWxsQ29tcGxldGVkKE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aGF0LCBpbnQgc3RhdHVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2hhdCA9PSBNZWRpYVBsYXllcjIuQ0FMTF9DT01QTEVURURfUExBWSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uUGxheUNhbGxlZC5zaWduYWwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICBtcC5zZXRNZWRpYVBsYXllcjJFdmVudENhbGxiYWNrKG1FeGVjdXRvciwgZWNiKTsKKworICAgICAgICAgICAgYXNzZXJ0RmFsc2UobXAuaXNQbGF5aW5nKCkpOworICAgICAgICAgICAgb25QbGF5Q2FsbGVkLnJlc2V0KCk7CisgICAgICAgICAgICBtcC5wbGF5KCk7CisgICAgICAgICAgICBvblBsYXlDYWxsZWQud2FpdEZvclNpZ25hbCgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtcC5pc1BsYXlpbmcoKSk7CisKKyAgICAgICAgICAgIGxvbmcgZHVyYXRpb24gPSBtcC5nZXREdXJhdGlvbigpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKGR1cmF0aW9uICogNCk7IC8vIGFsbG93IGZvciBzZXZlcmFsIGxvb3BzCisgICAgICAgICAgICBhc3NlcnRUcnVlKG1wLmlzUGxheWluZygpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygid3JvbmcgbnVtYmVyIG9mIGNvbXBsZXRpb24gc2lnbmFscyIsIDAsCisgICAgICAgICAgICAgICAgICAgIG9uQ29tcGxldGlvbkNhbGxlZC5nZXROdW1TaWduYWwoKSk7CisgICAgICAgICAgICBtcC5sb29wQ3VycmVudChmYWxzZSk7CisKKyAgICAgICAgICAgIC8vIHdhaXQgZm9yIHBsYXliYWNrIHRvIGZpbmlzaAorICAgICAgICAgICAgd2hpbGUobXAuaXNQbGF5aW5nKCkpIHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0xFRVBfVElNRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIndyb25nIG51bWJlciBvZiBjb21wbGV0aW9uIHNpZ25hbHMiLCAxLAorICAgICAgICAgICAgICAgICAgICBvbkNvbXBsZXRpb25DYWxsZWQuZ2V0TnVtU2lnbmFsKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgbXAuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQbGF5TWlkaSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoSUdOT1JFX1RFU1RTKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgaW50IHJlc2lkID0gUi5yYXcubWlkaThzZWM7CisgICAgICAgIGZpbmFsIGludCBtaWRpRHVyYXRpb24gPSA4MDAwOworICAgICAgICBmaW5hbCBpbnQgdG9sZXJhbmNlID0gNzA7CisgICAgICAgIGZpbmFsIGludCBzZWVrRHVyYXRpb24gPSAxMDAwOworCisgICAgICAgIE1lZGlhUGxheWVyMiBtcCA9IGNyZWF0ZU1lZGlhUGxheWVyMihtQ29udGV4dCwgcmVzaWQpOworCisgICAgICAgIE1vbml0b3Igb25QcmVwYXJlQ2FsbGVkID0gbmV3IE1vbml0b3IoKTsKKyAgICAgICAgTW9uaXRvciBvblNlZWtUb0NhbGxlZCA9IG5ldyBNb25pdG9yKCk7CisgICAgICAgIE1vbml0b3Igb25Mb29wQ3VycmVudENhbGxlZCA9IG5ldyBNb25pdG9yKCk7CisgICAgICAgIE1lZGlhUGxheWVyMi5NZWRpYVBsYXllcjJFdmVudENhbGxiYWNrIGVjYiA9CisgICAgICAgICAgICBuZXcgTWVkaWFQbGF5ZXIyLk1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2soKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25JbmZvKE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkLCBpbnQgd2hhdCwgaW50IGV4dHJhKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh3aGF0ID09IE1lZGlhUGxheWVyMi5NRURJQV9JTkZPX1BSRVBBUkVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvblByZXBhcmVDYWxsZWQuc2lnbmFsKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNhbGxDb21wbGV0ZWQoTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2hhdCwgaW50IHN0YXR1cykgeworICAgICAgICAgICAgICAgICAgICBpZiAod2hhdCA9PSBNZWRpYVBsYXllcjIuQ0FMTF9DT01QTEVURURfTE9PUF9DVVJSRU5UKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvbkxvb3BDdXJyZW50Q2FsbGVkLnNpZ25hbCgpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gTWVkaWFQbGF5ZXIyLkNBTExfQ09NUExFVEVEX1NFRUtfVE8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9uU2Vla1RvQ2FsbGVkLnNpZ25hbCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgbXAuc2V0TWVkaWFQbGF5ZXIyRXZlbnRDYWxsYmFjayhtRXhlY3V0b3IsIGVjYik7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEF1ZGlvQXR0cmlidXRlcyBhdHRyaWJ1dGVzID0gbmV3IEF1ZGlvQXR0cmlidXRlcy5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgLnNldEludGVybmFsTGVnYWN5U3RyZWFtVHlwZShBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgICAgIG1wLnNldEF1ZGlvQXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKKyAgICAgICAgICAgIG1wLnNldFdha2VNb2RlKG1Db250ZXh0LCBQb3dlck1hbmFnZXIuUEFSVElBTF9XQUtFX0xPQ0spOworCisgICAgICAgICAgICBtcC5wbGF5KCk7CisKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKG1wLmlzTG9vcGluZygpKTsKKyAgICAgICAgICAgIG9uTG9vcEN1cnJlbnRDYWxsZWQucmVzZXQoKTsKKyAgICAgICAgICAgIG1wLmxvb3BDdXJyZW50KHRydWUpOworICAgICAgICAgICAgb25Mb29wQ3VycmVudENhbGxlZC53YWl0Rm9yU2lnbmFsKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKG1wLmlzTG9vcGluZygpKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG1pZGlEdXJhdGlvbiwgbXAuZ2V0RHVyYXRpb24oKSwgdG9sZXJhbmNlKTsKKyAgICAgICAgICAgIGxvbmcgcG9zID0gbXAuZ2V0Q3VycmVudFBvc2l0aW9uKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHBvcyA+PSAwKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocG9zIDwgbWlkaUR1cmF0aW9uIC0gc2Vla0R1cmF0aW9uKTsKKworICAgICAgICAgICAgb25TZWVrVG9DYWxsZWQucmVzZXQoKTsKKyAgICAgICAgICAgIG1wLnNlZWtUbyhwb3MgKyBzZWVrRHVyYXRpb24sIE1lZGlhUGxheWVyMi5TRUVLX1BSRVZJT1VTX1NZTkMpOworICAgICAgICAgICAgb25TZWVrVG9DYWxsZWQud2FpdEZvclNpZ25hbCgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHBvcyArIHNlZWtEdXJhdGlvbiwgbXAuZ2V0Q3VycmVudFBvc2l0aW9uKCksIHRvbGVyYW5jZSk7CisKKyAgICAgICAgICAgIC8vIHRlc3Qgc3RvcCBhbmQgcmVzdGFydAorICAgICAgICAgICAgbXAucmVzZXQoKTsKKyAgICAgICAgICAgIEFzc2V0RmlsZURlc2NyaXB0b3IgYWZkID0gbVJlc291cmNlcy5vcGVuUmF3UmVzb3VyY2VGZChyZXNpZCk7CisgICAgICAgICAgICBtcC5zZXREYXRhU291cmNlKG5ldyBEYXRhU291cmNlRGVzYy5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgLnNldERhdGFTb3VyY2UoYWZkLmdldEZpbGVEZXNjcmlwdG9yKCksIGFmZC5nZXRTdGFydE9mZnNldCgpLCBhZmQuZ2V0TGVuZ3RoKCkpCisgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAgICAgbXAuc2V0TWVkaWFQbGF5ZXIyRXZlbnRDYWxsYmFjayhtRXhlY3V0b3IsIGVjYik7CisgICAgICAgICAgICBvblByZXBhcmVDYWxsZWQucmVzZXQoKTsKKyAgICAgICAgICAgIG1wLnByZXBhcmUoKTsKKyAgICAgICAgICAgIG9uUHJlcGFyZUNhbGxlZC53YWl0Rm9yU2lnbmFsKCk7CisgICAgICAgICAgICBhZmQuY2xvc2UoKTsKKworICAgICAgICAgICAgbXAucGxheSgpOworCisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0xFRVBfVElNRSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBtcC5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIE91dHB1dExpc3RlbmVyIHsKKyAgICAgICAgaW50IG1TZXNzaW9uOworICAgICAgICBBdWRpb0VmZmVjdCBtVmM7CisgICAgICAgIFZpc3VhbGl6ZXIgbVZpczsKKyAgICAgICAgYnl0ZSBbXSBtVmlzRGF0YTsKKyAgICAgICAgYm9vbGVhbiBtU291bmREZXRlY3RlZDsKKyAgICAgICAgT3V0cHV0TGlzdGVuZXIoaW50IHNlc3Npb24pIHsKKyAgICAgICAgICAgIG1TZXNzaW9uID0gc2Vzc2lvbjsKKyAgICAgICAgICAgIC8vIGNyZWF0aW5nIGEgdm9sdW1lIGNvbnRyb2xsZXIgb24gb3V0cHV0IG1peCBlbnN1cmVzIHRoYXQgcm8uYXVkaW8uc2lsZW50IG11dGVzCisgICAgICAgICAgICAvLyBhdWRpbyBhZnRlciB0aGUgZWZmZWN0cyBhbmQgbm90IGJlZm9yZQorICAgICAgICAgICAgbVZjID0gbmV3IEF1ZGlvRWZmZWN0KAorICAgICAgICAgICAgICAgICAgICBBdWRpb0VmZmVjdC5FRkZFQ1RfVFlQRV9OVUxMLAorICAgICAgICAgICAgICAgICAgICBVVUlELmZyb21TdHJpbmcoIjExOTM0MWEwLTg0NjktMTFkZi04MWY5LTAwMDJhNWQ1YzUxYiIpLAorICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICBzZXNzaW9uKTsKKyAgICAgICAgICAgIG1WYy5zZXRFbmFibGVkKHRydWUpOworICAgICAgICAgICAgbVZpcyA9IG5ldyBWaXN1YWxpemVyKHNlc3Npb24pOworICAgICAgICAgICAgaW50IHNpemUgPSAyNTY7CisgICAgICAgICAgICBpbnRbXSByYW5nZSA9IFZpc3VhbGl6ZXIuZ2V0Q2FwdHVyZVNpemVSYW5nZSgpOworICAgICAgICAgICAgaWYgKHNpemUgPCByYW5nZVswXSkgeworICAgICAgICAgICAgICAgIHNpemUgPSByYW5nZVswXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzaXplID4gcmFuZ2VbMV0pIHsKKyAgICAgICAgICAgICAgICBzaXplID0gcmFuZ2VbMV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnRUcnVlKG1WaXMuc2V0Q2FwdHVyZVNpemUoc2l6ZSkgPT0gVmlzdWFsaXplci5TVUNDRVNTKTsKKworICAgICAgICAgICAgbVZpcy5zZXREYXRhQ2FwdHVyZUxpc3RlbmVyKG5ldyBWaXN1YWxpemVyLk9uRGF0YUNhcHR1cmVMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbldhdmVGb3JtRGF0YUNhcHR1cmUoVmlzdWFsaXplciB2aXN1YWxpemVyLAorICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIHdhdmVmb3JtLCBpbnQgc2FtcGxpbmdSYXRlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghbVNvdW5kRGV0ZWN0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd2F2ZWZvcm0ubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA4IGJpdCB1bnNpZ25lZCBQQ00sIHplcm8gbGV2ZWwgaXMgYXQgMTI4LCB3aGljaCBpcyAtMTI4IHdoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWVuIGFzIGEgc2lnbmVkIGJ5dGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2F2ZWZvcm1baV0gIT0gLTEyOCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU291bmREZXRlY3RlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRmZ0RGF0YUNhcHR1cmUoVmlzdWFsaXplciB2aXN1YWxpemVyLCBieXRlW10gZmZ0LCBpbnQgc2FtcGxpbmdSYXRlKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwgMTAwMDAgLyogbWlsbGlIZXJ0eiAqLywgdHJ1ZSAvKiBQQ00gKi8sIGZhbHNlIC8qIEZGVCAqLyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKG1WaXMuc2V0RW5hYmxlZCh0cnVlKSA9PSBWaXN1YWxpemVyLlNVQ0NFU1MpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCByZXNldCgpIHsKKyAgICAgICAgICAgIG1Tb3VuZERldGVjdGVkID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGhlYXJkU291bmQoKSB7CisgICAgICAgICAgICByZXR1cm4gbVNvdW5kRGV0ZWN0ZWQ7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHJlbGVhc2UoKSB7CisgICAgICAgICAgICBtVmlzLnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1WYy5yZWxlYXNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGxheUF1ZGlvVHdpY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKElHTk9SRV9URVNUUykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZpbmFsIGludCByZXNpZCA9IFIucmF3LmNhbWVyYV9jbGljazsKKworICAgICAgICBNZWRpYVBsYXllcjIgbXAgPSBjcmVhdGVNZWRpYVBsYXllcjIobUNvbnRleHQsIHJlc2lkKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEF1ZGlvQXR0cmlidXRlcyBhdHRyaWJ1dGVzID0gbmV3IEF1ZGlvQXR0cmlidXRlcy5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgLnNldEludGVybmFsTGVnYWN5U3RyZWFtVHlwZShBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgICAgIG1wLnNldEF1ZGlvQXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKKyAgICAgICAgICAgIG1wLnNldFdha2VNb2RlKG1Db250ZXh0LCBQb3dlck1hbmFnZXIuUEFSVElBTF9XQUtFX0xPQ0spOworCisgICAgICAgICAgICBPdXRwdXRMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBPdXRwdXRMaXN0ZW5lcihtcC5nZXRBdWRpb1Nlc3Npb25JZCgpKTsKKworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNMRUVQX1RJTUUpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoIm5vaXNlIGhlYXJkIGJlZm9yZSB0ZXN0IHN0YXJ0ZWQiLCBsaXN0ZW5lci5oZWFyZFNvdW5kKCkpOworCisgICAgICAgICAgICBtcC5wbGF5KCk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0xFRVBfVElNRSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZSgicGxheWVyIHdhcyBzdGlsbCBwbGF5aW5nIGFmdGVyICIgKyBTTEVFUF9USU1FICsgIiBtcyIsIG1wLmlzUGxheWluZygpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIm5vdGhpbmcgaGVhcmQgd2hpbGUgdGVzdCByYW4iLCBsaXN0ZW5lci5oZWFyZFNvdW5kKCkpOworICAgICAgICAgICAgbGlzdGVuZXIucmVzZXQoKTsKKyAgICAgICAgICAgIG1wLnNlZWtUbygwLCBNZWRpYVBsYXllcjIuU0VFS19QUkVWSU9VU19TWU5DKTsKKyAgICAgICAgICAgIG1wLnBsYXkoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTTEVFUF9USU1FKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIm5vdGhpbmcgaGVhcmQgd2hlbiBzb3VuZCB3YXMgcmVwbGF5ZWQiLCBsaXN0ZW5lci5oZWFyZFNvdW5kKCkpOworICAgICAgICAgICAgbGlzdGVuZXIucmVsZWFzZSgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgbXAuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQbGF5VmlkZW8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKElHTk9SRV9URVNUUykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHBsYXlWaWRlb1Rlc3QoUi5yYXcudGVzdHZpZGVvLCAzNTIsIDI4OCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgcmVzZXRpbmcgYSBzdXJmYWNlIGR1cmluZyB2aWRlbyBwbGF5YmFjaworICAgICAqIEFmdGVyIHJlc2V0aW5nLCB0aGUgdmlkZW8gc2hvdWxkIGNvbnRpbnVlIHBsYXlpbmcKKyAgICAgKiBmcm9tIHRoZSB0aW1lIHNldERpc3BsYXkoKSB3YXMgY2FsbGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFZpZGVvU3VyZmFjZVJlc2V0dGluZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoSUdOT1JFX1RFU1RTKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgaW50IHRvbGVyYW5jZSA9IDE1MDsKKyAgICAgICAgZmluYWwgaW50IGF1ZGlvTGF0ZW5jeVRvbGVyYW5jZSA9IDEwMDA7ICAvKiBjb3ZlcnMgYXVkaW8gcGF0aCBsYXRlbmN5IHZhcmlhYmlsaXR5ICovCisgICAgICAgIGZpbmFsIGludCBzZWVrUG9zID0gNDc2MDsgIC8vIFRoaXMgaXMgdGhlIEktZnJhbWUgcG9zaXRpb24KKworICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBzZWVrRG9uZSA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKworICAgICAgICBNZWRpYVBsYXllcjIuTWVkaWFQbGF5ZXIyRXZlbnRDYWxsYmFjayBlY2IgPSBuZXcgTWVkaWFQbGF5ZXIyLk1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2soKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2FsbENvbXBsZXRlZChNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCwgaW50IHdoYXQsIGludCBzdGF0dXMpIHsKKyAgICAgICAgICAgICAgICBpZiAod2hhdCA9PSBNZWRpYVBsYXllcjIuQ0FMTF9DT01QTEVURURfU0VFS19UTykgeworICAgICAgICAgICAgICAgICAgICBzZWVrRG9uZS5jb3VudERvd24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHN5bmNocm9uaXplZCAobUV2ZW50Q2JMb2NrKSB7CisgICAgICAgICAgICBtRXZlbnRDYWxsYmFja3MuYWRkKGVjYik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWNoZWNrTG9hZFJlc291cmNlKFIucmF3LnRlc3R2aWRlbykpIHsKKyAgICAgICAgICAgIHJldHVybjsgLy8gc2tpcDsKKyAgICAgICAgfQorICAgICAgICBwbGF5TG9hZGVkVmlkZW8oMzUyLCAyODgsIC0xKTsKKworICAgICAgICBUaHJlYWQuc2xlZXAoU0xFRVBfVElNRSk7CisKKyAgICAgICAgbG9uZyBwb3NCZWZvcmUgPSBtUGxheWVyLmdldEN1cnJlbnRQb3NpdGlvbigpOworICAgICAgICBtUGxheWVyLnNldERpc3BsYXkoZ2V0QWN0aXZpdHkoKS5nZXRTdXJmYWNlSG9sZGVyMigpKTsKKyAgICAgICAgbG9uZyBwb3NBZnRlciA9IG1QbGF5ZXIuZ2V0Q3VycmVudFBvc2l0aW9uKCk7CisKKyAgICAgICAgLyogdGVtcG9yYXJpbHkgZGlzYWJsZSB0aW1lc3RhbXAgY2hlY2tpbmcgYmVjYXVzZSBNZWRpYVBsYXllcjIgbm93IHNlZWtzIHRvIEktZnJhbWUKKyAgICAgICAgICogcG9zaXRpb24sIGluc3RlYWQgb2YgcmVxdWVzdGVkIHBvc2l0aW9uLiBzZXREaXNwbGF5IGludm92bGVzIGEgc2VlayBvcGVyYXRpb24KKyAgICAgICAgICogaW50ZXJuYWxseS4KKyAgICAgICAgICovCisgICAgICAgIC8vIFRPRE86IHVuY29tbWVudCBvdXQgbGluZSBiZWxvdyB3aGVuIE1lZGlhUGxheWVyMiBjYW4gc2VlayB0byByZXF1ZXN0ZWQgcG9zaXRpb24uCisgICAgICAgIC8vIGFzc2VydEVxdWFscyhwb3NBZnRlciwgcG9zQmVmb3JlLCB0b2xlcmFuY2UpOworICAgICAgICBhc3NlcnRUcnVlKG1QbGF5ZXIuaXNQbGF5aW5nKCkpOworCisgICAgICAgIFRocmVhZC5zbGVlcChTTEVFUF9USU1FKTsKKworICAgICAgICBtUGxheWVyLnNlZWtUbyhzZWVrUG9zLCBNZWRpYVBsYXllcjIuU0VFS19QUkVWSU9VU19TWU5DKTsKKyAgICAgICAgc2Vla0RvbmUuYXdhaXQoKTsKKyAgICAgICAgcG9zQWZ0ZXIgPSBtUGxheWVyLmdldEN1cnJlbnRQb3NpdGlvbigpOworICAgICAgICBhc3NlcnRFcXVhbHMoc2Vla1BvcywgcG9zQWZ0ZXIsIHRvbGVyYW5jZSArIGF1ZGlvTGF0ZW5jeVRvbGVyYW5jZSk7CisKKyAgICAgICAgVGhyZWFkLnNsZWVwKFNMRUVQX1RJTUUgLyAyKTsKKyAgICAgICAgcG9zQmVmb3JlID0gbVBsYXllci5nZXRDdXJyZW50UG9zaXRpb24oKTsKKyAgICAgICAgbVBsYXllci5zZXREaXNwbGF5KG51bGwpOworICAgICAgICBwb3NBZnRlciA9IG1QbGF5ZXIuZ2V0Q3VycmVudFBvc2l0aW9uKCk7CisgICAgICAgIC8vIFRPRE86IHVuY29tbWVudCBvdXQgbGluZSBiZWxvdyB3aGVuIE1lZGlhUGxheWVyMiBjYW4gc2VlayB0byByZXF1ZXN0ZWQgcG9zaXRpb24uCisgICAgICAgIC8vIGFzc2VydEVxdWFscyhwb3NBZnRlciwgcG9zQmVmb3JlLCB0b2xlcmFuY2UpOworICAgICAgICBhc3NlcnRUcnVlKG1QbGF5ZXIuaXNQbGF5aW5nKCkpOworCisgICAgICAgIFRocmVhZC5zbGVlcChTTEVFUF9USU1FKTsKKworICAgICAgICBwb3NCZWZvcmUgPSBtUGxheWVyLmdldEN1cnJlbnRQb3NpdGlvbigpOworICAgICAgICBtUGxheWVyLnNldERpc3BsYXkoZ2V0QWN0aXZpdHkoKS5nZXRTdXJmYWNlSG9sZGVyKCkpOworICAgICAgICBwb3NBZnRlciA9IG1QbGF5ZXIuZ2V0Q3VycmVudFBvc2l0aW9uKCk7CisKKyAgICAgICAgLy8gVE9ETzogdW5jb21tZW50IG91dCBsaW5lIGJlbG93IHdoZW4gTWVkaWFQbGF5ZXIyIGNhbiBzZWVrIHRvIHJlcXVlc3RlZCBwb3NpdGlvbi4KKyAgICAgICAgLy8gYXNzZXJ0RXF1YWxzKHBvc0FmdGVyLCBwb3NCZWZvcmUsIHRvbGVyYW5jZSk7CisgICAgICAgIGFzc2VydFRydWUobVBsYXllci5pc1BsYXlpbmcoKSk7CisKKyAgICAgICAgVGhyZWFkLnNsZWVwKFNMRUVQX1RJTUUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZWNvcmRlZFZpZGVvUGxheWJhY2swKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChJR05PUkVfVEVTVFMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0ZXN0UmVjb3JkZWRWaWRlb1BsYXliYWNrV2l0aEFuZ2xlKDApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZWNvcmRlZFZpZGVvUGxheWJhY2s5MCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoSUdOT1JFX1RFU1RTKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdGVzdFJlY29yZGVkVmlkZW9QbGF5YmFja1dpdGhBbmdsZSg5MCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlY29yZGVkVmlkZW9QbGF5YmFjazE4MCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoSUdOT1JFX1RFU1RTKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdGVzdFJlY29yZGVkVmlkZW9QbGF5YmFja1dpdGhBbmdsZSgxODApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZWNvcmRlZFZpZGVvUGxheWJhY2syNzAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKElHTk9SRV9URVNUUykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRlc3RSZWNvcmRlZFZpZGVvUGxheWJhY2tXaXRoQW5nbGUoMjcwKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaGFzQ2FtZXJhKCkgeworICAgICAgICByZXR1cm4gZ2V0QWN0aXZpdHkoKS5nZXRQYWNrYWdlTWFuYWdlcigpLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9DQU1FUkEpOworICAgIH0KKworICAgIHByaXZhdGUgQ2FtZXJhIG1DYW1lcmE7CisgICAgcHJpdmF0ZSB2b2lkIHRlc3RSZWNvcmRlZFZpZGVvUGxheWJhY2tXaXRoQW5nbGUoaW50IGFuZ2xlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IHdpZHRoID0gUkVDT1JERURfVklERU9fV0lEVEg7CisgICAgICAgIGludCBoZWlnaHQgPSBSRUNPUkRFRF9WSURFT19IRUlHSFQ7CisgICAgICAgIGZpbmFsIFN0cmluZyBmaWxlID0gUkVDT1JERURfRklMRTsKKyAgICAgICAgZmluYWwgbG9uZyBkdXJhdGlvbk1zID0gUkVDT1JERURfRFVSQVRJT05fTVM7CisKKyAgICAgICAgaWYgKCFoYXNDYW1lcmEoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBpc1N1cHBvcnRlZCA9IGZhbHNlOworICAgICAgICBtQ2FtZXJhID0gQ2FtZXJhLm9wZW4oMCk7CisgICAgICAgIENhbWVyYS5QYXJhbWV0ZXJzIHBhcmFtZXRlcnMgPSBtQ2FtZXJhLmdldFBhcmFtZXRlcnMoKTsKKyAgICAgICAgTGlzdDxDYW1lcmEuU2l6ZT4gdmlkZW9TaXplcyA9IHBhcmFtZXRlcnMuZ2V0U3VwcG9ydGVkVmlkZW9TaXplcygpOworICAgICAgICAvLyBnZXRTdXBwb3J0ZWRWaWRlb1NpemVzIHJldHVybnMgbnVsbCB3aGVuIHNlcGFyYXRlIHZpZGVvL3ByZXZpZXcgc2l6ZQorICAgICAgICAvLyBpcyBub3Qgc3VwcG9ydGVkLgorICAgICAgICBpZiAodmlkZW9TaXplcyA9PSBudWxsKSB7CisgICAgICAgICAgICB2aWRlb1NpemVzID0gcGFyYW1ldGVycy5nZXRTdXBwb3J0ZWRQcmV2aWV3U2l6ZXMoKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKENhbWVyYS5TaXplIHNpemUgOiB2aWRlb1NpemVzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc2l6ZS53aWR0aCA9PSB3aWR0aCAmJiBzaXplLmhlaWdodCA9PSBoZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBpc1N1cHBvcnRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUNhbWVyYS5yZWxlYXNlKCk7CisgICAgICAgIG1DYW1lcmEgPSBudWxsOworICAgICAgICBpZiAoIWlzU3VwcG9ydGVkKSB7CisgICAgICAgICAgICB3aWR0aCA9IHZpZGVvU2l6ZXMuZ2V0KDApLndpZHRoOworICAgICAgICAgICAgaGVpZ2h0ID0gdmlkZW9TaXplcy5nZXQoMCkuaGVpZ2h0OworICAgICAgICB9CisgICAgICAgIGNoZWNrT3JpZW50YXRpb24oYW5nbGUpOworICAgICAgICByZWNvcmRWaWRlbyh3aWR0aCwgaGVpZ2h0LCBhbmdsZSwgZmlsZSwgZHVyYXRpb25Ncyk7CisgICAgICAgIGNoZWNrRGlzcGxheWVkVmlkZW9TaXplKHdpZHRoLCBoZWlnaHQsIGFuZ2xlLCBmaWxlKTsKKyAgICAgICAgY2hlY2tWaWRlb1JvdGF0aW9uQW5nbGUoYW5nbGUsIGZpbGUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja09yaWVudGF0aW9uKGludCBhbmdsZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydFRydWUoYW5nbGUgPj0gMCk7CisgICAgICAgIGFzc2VydFRydWUoYW5nbGUgPCAzNjApOworICAgICAgICBhc3NlcnRUcnVlKChhbmdsZSAlIDkwKSA9PSAwKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVjb3JkVmlkZW8oCisgICAgICAgICAgICBpbnQgdywgaW50IGgsIGludCBhbmdsZSwgU3RyaW5nIGZpbGUsIGxvbmcgZHVyYXRpb25NcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgTWVkaWFSZWNvcmRlciByZWNvcmRlciA9IG5ldyBNZWRpYVJlY29yZGVyKCk7CisgICAgICAgIHJlY29yZGVyLnNldFZpZGVvU291cmNlKE1lZGlhUmVjb3JkZXIuVmlkZW9Tb3VyY2UuQ0FNRVJBKTsKKyAgICAgICAgcmVjb3JkZXIuc2V0QXVkaW9Tb3VyY2UoTWVkaWFSZWNvcmRlci5BdWRpb1NvdXJjZS5NSUMpOworICAgICAgICByZWNvcmRlci5zZXRPdXRwdXRGb3JtYXQoTWVkaWFSZWNvcmRlci5PdXRwdXRGb3JtYXQuREVGQVVMVCk7CisgICAgICAgIHJlY29yZGVyLnNldFZpZGVvRW5jb2RlcihNZWRpYVJlY29yZGVyLlZpZGVvRW5jb2Rlci5ERUZBVUxUKTsKKyAgICAgICAgcmVjb3JkZXIuc2V0QXVkaW9FbmNvZGVyKE1lZGlhUmVjb3JkZXIuQXVkaW9FbmNvZGVyLkRFRkFVTFQpOworICAgICAgICByZWNvcmRlci5zZXRPdXRwdXRGaWxlKGZpbGUpOworICAgICAgICByZWNvcmRlci5zZXRPcmllbnRhdGlvbkhpbnQoYW5nbGUpOworICAgICAgICByZWNvcmRlci5zZXRWaWRlb1NpemUodywgaCk7CisgICAgICAgIHJlY29yZGVyLnNldFByZXZpZXdEaXNwbGF5KGdldEFjdGl2aXR5KCkuZ2V0U3VyZmFjZUhvbGRlcjIoKS5nZXRTdXJmYWNlKCkpOworICAgICAgICByZWNvcmRlci5wcmVwYXJlKCk7CisgICAgICAgIHJlY29yZGVyLnN0YXJ0KCk7CisgICAgICAgIFRocmVhZC5zbGVlcChkdXJhdGlvbk1zKTsKKyAgICAgICAgcmVjb3JkZXIuc3RvcCgpOworICAgICAgICByZWNvcmRlci5yZWxlYXNlKCk7CisgICAgICAgIHJlY29yZGVyID0gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tEaXNwbGF5ZWRWaWRlb1NpemUoCisgICAgICAgICAgICBpbnQgdywgaW50IGgsIGludCBhbmdsZSwgU3RyaW5nIGZpbGUpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIGludCBkaXNwbGF5V2lkdGggID0gdzsKKyAgICAgICAgaW50IGRpc3BsYXlIZWlnaHQgPSBoOworICAgICAgICBpZiAoKGFuZ2xlICUgMTgwKSAhPSAwKSB7CisgICAgICAgICAgICBkaXNwbGF5V2lkdGggID0gaDsKKyAgICAgICAgICAgIGRpc3BsYXlIZWlnaHQgPSB3OworICAgICAgICB9CisgICAgICAgIHBsYXlWaWRlb1Rlc3QoZmlsZSwgZGlzcGxheVdpZHRoLCBkaXNwbGF5SGVpZ2h0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tWaWRlb1JvdGF0aW9uQW5nbGUoaW50IGFuZ2xlLCBTdHJpbmcgZmlsZSkgeworICAgICAgICBNZWRpYU1ldGFkYXRhUmV0cmlldmVyIHJldHJpZXZlciA9IG5ldyBNZWRpYU1ldGFkYXRhUmV0cmlldmVyKCk7CisgICAgICAgIHJldHJpZXZlci5zZXREYXRhU291cmNlKGZpbGUpOworICAgICAgICBTdHJpbmcgcm90YXRpb24gPSByZXRyaWV2ZXIuZXh0cmFjdE1ldGFkYXRhKAorICAgICAgICAgICAgICAgIE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuTUVUQURBVEFfS0VZX1ZJREVPX1JPVEFUSU9OKTsKKyAgICAgICAgcmV0cmlldmVyLnJlbGVhc2UoKTsKKyAgICAgICAgcmV0cmlldmVyID0gbnVsbDsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChyb3RhdGlvbik7CisgICAgICAgIGFzc2VydEVxdWFscyhJbnRlZ2VyLnBhcnNlSW50KHJvdGF0aW9uKSwgYW5nbGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQbGF5bGlzdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoSUdOT1JFX1RFU1RTKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFjaGVja0xvYWRSZXNvdXJjZSgKKyAgICAgICAgICAgICAgICBSLnJhdy52aWRlb180ODB4MzYwX21wNF9oMjY0XzEwMDBrYnBzXzMwZnBzX2FhY19zdGVyZW9fMTI4a2Jwc180NDEwMGh6KSkgeworICAgICAgICAgICAgcmV0dXJuOyAvLyBza2lwCisgICAgICAgIH0KKyAgICAgICAgRGF0YVNvdXJjZURlc2MgZHNkMSA9IGNyZWF0ZURhdGFTb3VyY2VEZXNjKAorICAgICAgICAgICAgICAgIFIucmF3LnZpZGVvXzQ4MHgzNjBfbXA0X2gyNjRfMTAwMGticHNfMzBmcHNfYWFjX3N0ZXJlb18xMjhrYnBzXzQ0MTAwaHopOworICAgICAgICBEYXRhU291cmNlRGVzYyBkc2QyID0gY3JlYXRlRGF0YVNvdXJjZURlc2MoCisgICAgICAgICAgICAgICAgUi5yYXcudGVzdHZpZGVvKTsKKyAgICAgICAgQXJyYXlMaXN0PERhdGFTb3VyY2VEZXNjPiBuZXh0RFNEcyA9IG5ldyBBcnJheUxpc3Q8RGF0YVNvdXJjZURlc2M+KDIpOworICAgICAgICBuZXh0RFNEcy5hZGQoZHNkMik7CisgICAgICAgIG5leHREU0RzLmFkZChkc2QxKTsKKworICAgICAgICBtUGxheWVyLnNldE5leHREYXRhU291cmNlcyhuZXh0RFNEcyk7CisKKyAgICAgICAgTW9uaXRvciBvbkNvbXBsZXRpb24xQ2FsbGVkID0gbmV3IE1vbml0b3IoKTsKKyAgICAgICAgTW9uaXRvciBvbkNvbXBsZXRpb24yQ2FsbGVkID0gbmV3IE1vbml0b3IoKTsKKyAgICAgICAgTWVkaWFQbGF5ZXIyLk1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2sgZWNiID0gbmV3IE1lZGlhUGxheWVyMi5NZWRpYVBsYXllcjJFdmVudENhbGxiYWNrKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkluZm8oTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsIGludCB3aGF0LCBpbnQgZXh0cmEpIHsKKyAgICAgICAgICAgICAgICBpZiAod2hhdCA9PSBNZWRpYVBsYXllcjIuTUVESUFfSU5GT19QUkVQQVJFRCkgeworICAgICAgICAgICAgICAgICAgICBMb2cuaShMT0dfVEFHLCAidGVzdFBsYXlsaXN0OiBwcmVwYXJlZCBkc2QgTWVkaWFJZD0iICsgZHNkLmdldE1lZGlhSWQoKSk7CisgICAgICAgICAgICAgICAgICAgIG1PblByZXBhcmVDYWxsZWQuc2lnbmFsKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IE1lZGlhUGxheWVyMi5NRURJQV9JTkZPX1BMQVlCQUNLX0NPTVBMRVRFKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkc2QgPT0gZHNkMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgb25Db21wbGV0aW9uMUNhbGxlZC5zaWduYWwoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkc2QgPT0gZHNkMikgeworICAgICAgICAgICAgICAgICAgICAgICAgb25Db21wbGV0aW9uMkNhbGxlZC5zaWduYWwoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1PbkNvbXBsZXRpb25DYWxsZWQuc2lnbmFsKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHN5bmNocm9uaXplZCAobUV2ZW50Q2JMb2NrKSB7CisgICAgICAgICAgICBtRXZlbnRDYWxsYmFja3MuYWRkKGVjYik7CisgICAgICAgIH0KKworICAgICAgICBtT25Db21wbGV0aW9uQ2FsbGVkLnJlc2V0KCk7CisgICAgICAgIG9uQ29tcGxldGlvbjFDYWxsZWQucmVzZXQoKTsKKyAgICAgICAgb25Db21wbGV0aW9uMkNhbGxlZC5yZXNldCgpOworCisgICAgICAgIG1QbGF5ZXIuc2V0RGlzcGxheShtQWN0aXZpdHkuZ2V0U3VyZmFjZUhvbGRlcigpKTsKKworICAgICAgICBtUGxheWVyLnByZXBhcmUoKTsKKworICAgICAgICBtUGxheWVyLnBsYXkoKTsKKworICAgICAgICBtT25Db21wbGV0aW9uQ2FsbGVkLndhaXRGb3JTaWduYWwoKTsKKyAgICAgICAgb25Db21wbGV0aW9uMkNhbGxlZC53YWl0Rm9yU2lnbmFsKCk7CisgICAgICAgIG9uQ29tcGxldGlvbjFDYWxsZWQud2FpdEZvclNpZ25hbCgpOworCisgICAgICAgIG1QbGF5ZXIucmVzZXQoKTsKKyAgICB9CisKKyAgICAvLyBzZXRQbGF5YmFja1BhcmFtcygpIHdpdGggbm9uLXplcm8gc3BlZWQgc2hvdWxkIE5PVCBzdGFydCBwbGF5YmFjay4KKyAgICAvLyBUT0RPOiBlbmFibGUgdGhpcyB0ZXN0IHdoZW4gTWVkaWFQbGF5ZXIyLnNldFBsYXliYWNrUGFyYW1zKCkgaXMgZml4ZWQKKyAgICAvKgorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRQbGF5YmFja1BhcmFtc1Bvc2l0aXZlU3BlZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKElHTk9SRV9URVNUUykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICghY2hlY2tMb2FkUmVzb3VyY2UoCisgICAgICAgICAgICAgICAgUi5yYXcudmlkZW9fNDgweDM2MF9tcDRfaDI2NF8xMDAwa2Jwc18zMGZwc19hYWNfc3RlcmVvXzEyOGticHNfNDQxMDBoeikpIHsKKyAgICAgICAgICAgIHJldHVybjsgLy8gc2tpcAorICAgICAgICB9CisKKyAgICAgICAgTWVkaWFQbGF5ZXIyLk1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2sgZWNiID0gbmV3IE1lZGlhUGxheWVyMi5NZWRpYVBsYXllcjJFdmVudENhbGxiYWNrKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkluZm8oTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsIGludCB3aGF0LCBpbnQgZXh0cmEpIHsKKyAgICAgICAgICAgICAgICBpZiAod2hhdCA9PSBNZWRpYVBsYXllcjIuTUVESUFfSU5GT19QUkVQQVJFRCkgeworICAgICAgICAgICAgICAgICAgICBtT25QcmVwYXJlQ2FsbGVkLnNpZ25hbCgpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBNZWRpYVBsYXllcjIuTUVESUFfSU5GT19QTEFZQkFDS19DT01QTEVURSkgeworICAgICAgICAgICAgICAgICAgICBtT25Db21wbGV0aW9uQ2FsbGVkLnNpZ25hbCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNhbGxDb21wbGV0ZWQoTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsIGludCB3aGF0LCBpbnQgc3RhdHVzKSB7CisgICAgICAgICAgICAgICAgaWYgKHdoYXQgPT0gTWVkaWFQbGF5ZXIyLkNBTExfQ09NUExFVEVEX1NFRUtfVE8pIHsKKyAgICAgICAgICAgICAgICAgICAgbU9uU2Vla0NvbXBsZXRlQ2FsbGVkLnNpZ25hbCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgc3luY2hyb25pemVkIChtRXZlbnRDYkxvY2spIHsKKyAgICAgICAgICAgIG1FdmVudENhbGxiYWNrcy5hZGQoZWNiKTsKKyAgICAgICAgfQorCisgICAgICAgIG1PbkNvbXBsZXRpb25DYWxsZWQucmVzZXQoKTsKKyAgICAgICAgbVBsYXllci5zZXREaXNwbGF5KG1BY3Rpdml0eS5nZXRTdXJmYWNlSG9sZGVyKCkpOworCisgICAgICAgIG1PblByZXBhcmVDYWxsZWQucmVzZXQoKTsKKyAgICAgICAgbVBsYXllci5wcmVwYXJlKCk7CisgICAgICAgIG1PblByZXBhcmVDYWxsZWQud2FpdEZvclNpZ25hbCgpOworCisgICAgICAgIG1PblNlZWtDb21wbGV0ZUNhbGxlZC5yZXNldCgpOworICAgICAgICBtUGxheWVyLnNlZWtUbygwLCBNZWRpYVBsYXllcjIuU0VFS19QUkVWSU9VU19TWU5DKTsKKyAgICAgICAgbU9uU2Vla0NvbXBsZXRlQ2FsbGVkLndhaXRGb3JTaWduYWwoKTsKKworICAgICAgICBmaW5hbCBmbG9hdCBwbGF5YmFja1JhdGUgPSAxLjBmOworCisgICAgICAgIGludCBwbGF5VGltZSA9IDIwMDA7ICAvLyBUaGUgdGVzdGluZyBjbGlwIGlzIGFib3V0IDEwIHNlY29uZCBsb25nLgorICAgICAgICBtUGxheWVyLnNldFBsYXliYWNrUGFyYW1zKG5ldyBQbGF5YmFja1BhcmFtcygpLnNldFNwZWVkKHBsYXliYWNrUmF0ZSkpOworICAgICAgICBhc3NlcnRUcnVlKCJNZWRpYVBsYXllcjIgc2hvdWxkIGJlIHBsYXlpbmciLCBtUGxheWVyLmlzUGxheWluZygpKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKHBsYXlUaW1lKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiTWVkaWFQbGF5ZXIyIHNob3VsZCBzdGlsbCBiZSBwbGF5aW5nIiwKKyAgICAgICAgICAgICAgICBtUGxheWVyLmdldEN1cnJlbnRQb3NpdGlvbigpID4gMCk7CisKKyAgICAgICAgbG9uZyBkdXJhdGlvbiA9IG1QbGF5ZXIuZ2V0RHVyYXRpb24oKTsKKyAgICAgICAgbU9uU2Vla0NvbXBsZXRlQ2FsbGVkLnJlc2V0KCk7CisgICAgICAgIG1QbGF5ZXIuc2Vla1RvKGR1cmF0aW9uIC0gMTAwMCwgTWVkaWFQbGF5ZXIyLlNFRUtfUFJFVklPVVNfU1lOQyk7CisgICAgICAgIG1PblNlZWtDb21wbGV0ZUNhbGxlZC53YWl0Rm9yU2lnbmFsKCk7CisKKyAgICAgICAgbU9uQ29tcGxldGlvbkNhbGxlZC53YWl0Rm9yU2lnbmFsKCk7CisgICAgICAgIGFzc2VydEZhbHNlKCJNZWRpYVBsYXllcjIgc2hvdWxkIG5vdCBiZSBwbGF5aW5nIiwgbVBsYXllci5pc1BsYXlpbmcoKSk7CisgICAgICAgIGxvbmcgZW9zUG9zaXRpb24gPSBtUGxheWVyLmdldEN1cnJlbnRQb3NpdGlvbigpOworCisgICAgICAgIG1QbGF5ZXIuc2V0UGxheWJhY2tQYXJhbXMobmV3IFBsYXliYWNrUGFyYW1zKCkuc2V0U3BlZWQocGxheWJhY2tSYXRlKSk7CisgICAgICAgIGFzc2VydFRydWUoIk1lZGlhUGxheWVyMiBzaG91bGQgYmUgcGxheWluZyBhZnRlciBFT1MiLCBtUGxheWVyLmlzUGxheWluZygpKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKHBsYXlUaW1lKTsKKyAgICAgICAgbG9uZyBwb3NpdGlvbiA9IG1QbGF5ZXIuZ2V0Q3VycmVudFBvc2l0aW9uKCk7CisgICAgICAgIGFzc2VydFRydWUoIk1lZGlhUGxheWVyMiBzaG91bGQgc3RpbGwgYmUgcGxheWluZyBhZnRlciBFT1MiLAorICAgICAgICAgICAgICAgIHBvc2l0aW9uID4gMCAmJiBwb3NpdGlvbiA8IGVvc1Bvc2l0aW9uKTsKKworICAgICAgICBtUGxheWVyLnJlc2V0KCk7CisgICAgfQorICAgICovCisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGxheWJhY2tSYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChJR05PUkVfVEVTVFMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBpbnQgdG9sZXJhbmNlTXMgPSAxMDAwOworICAgICAgICBpZiAoIWNoZWNrTG9hZFJlc291cmNlKAorICAgICAgICAgICAgICAgIFIucmF3LnZpZGVvXzQ4MHgzNjBfbXA0X2gyNjRfMTAwMGticHNfMzBmcHNfYWFjX3N0ZXJlb18xMjhrYnBzXzQ0MTAwaHopKSB7CisgICAgICAgICAgICByZXR1cm47IC8vIHNraXAKKyAgICAgICAgfQorCisgICAgICAgIE1lZGlhUGxheWVyMi5NZWRpYVBsYXllcjJFdmVudENhbGxiYWNrIGVjYiA9IG5ldyBNZWRpYVBsYXllcjIuTWVkaWFQbGF5ZXIyRXZlbnRDYWxsYmFjaygpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25JbmZvKE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkLCBpbnQgd2hhdCwgaW50IGV4dHJhKSB7CisgICAgICAgICAgICAgICAgaWYgKHdoYXQgPT0gTWVkaWFQbGF5ZXIyLk1FRElBX0lORk9fUFJFUEFSRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgbU9uUHJlcGFyZUNhbGxlZC5zaWduYWwoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHN5bmNocm9uaXplZCAobUV2ZW50Q2JMb2NrKSB7CisgICAgICAgICAgICBtRXZlbnRDYWxsYmFja3MuYWRkKGVjYik7CisgICAgICAgIH0KKyAgICAgICAgbVBsYXllci5zZXREaXNwbGF5KG1BY3Rpdml0eS5nZXRTdXJmYWNlSG9sZGVyKCkpOworCisgICAgICAgIG1PblByZXBhcmVDYWxsZWQucmVzZXQoKTsKKyAgICAgICAgbVBsYXllci5wcmVwYXJlKCk7CisgICAgICAgIG1PblByZXBhcmVDYWxsZWQud2FpdEZvclNpZ25hbCgpOworCisgICAgICAgIFN5bmNQYXJhbXMgc3luYyA9IG5ldyBTeW5jUGFyYW1zKCkuYWxsb3dEZWZhdWx0cygpOworICAgICAgICBtUGxheWVyLnNldFN5bmNQYXJhbXMoc3luYyk7CisgICAgICAgIHN5bmMgPSBtUGxheWVyLmdldFN5bmNQYXJhbXMoKTsKKworICAgICAgICBmbG9hdFtdIHJhdGVzID0geyAwLjI1ZiwgMC41ZiwgMS4wZiwgMi4wZiB9OworICAgICAgICBmb3IgKGZsb2F0IHBsYXliYWNrUmF0ZSA6IHJhdGVzKSB7CisgICAgICAgICAgICBtUGxheWVyLnNlZWtUbygwLCBNZWRpYVBsYXllcjIuU0VFS19QUkVWSU9VU19TWU5DKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKKyAgICAgICAgICAgIGludCBwbGF5VGltZSA9IDQwMDA7ICAvLyBUaGUgdGVzdGluZyBjbGlwIGlzIGFib3V0IDEwIHNlY29uZCBsb25nLgorICAgICAgICAgICAgbVBsYXllci5zZXRQbGF5YmFja1BhcmFtcyhuZXcgUGxheWJhY2tQYXJhbXMoKS5zZXRTcGVlZChwbGF5YmFja1JhdGUpKTsKKyAgICAgICAgICAgIG1QbGF5ZXIucGxheSgpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKHBsYXlUaW1lKTsKKyAgICAgICAgICAgIFBsYXliYWNrUGFyYW1zIHBicCA9IG1QbGF5ZXIuZ2V0UGxheWJhY2tQYXJhbXMoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgcGxheWJhY2tSYXRlLCBwYnAuZ2V0U3BlZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgRkxPQVRfVE9MRVJBTkNFICsgcGxheWJhY2tSYXRlICogc3luYy5nZXRUb2xlcmFuY2UoKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJNZWRpYVBsYXllcjIgc2hvdWxkIHN0aWxsIGJlIHBsYXlpbmciLCBtUGxheWVyLmlzUGxheWluZygpKTsKKworICAgICAgICAgICAgbG9uZyBwbGF5ZWRNZWRpYUR1cmF0aW9uTXMgPSBtUGxheWVyLmdldEN1cnJlbnRQb3NpdGlvbigpOworICAgICAgICAgICAgaW50IGRpZmYgPSBNYXRoLmFicygoaW50KShwbGF5ZWRNZWRpYUR1cmF0aW9uTXMgLyBwbGF5YmFja1JhdGUpIC0gcGxheVRpbWUpOworICAgICAgICAgICAgaWYgKGRpZmYgPiB0b2xlcmFuY2VNcykgeworICAgICAgICAgICAgICAgIGZhaWwoIk1lZGlhIHBsYXllciBoYWQgZXJyb3IgaW4gcGxheWJhY2sgcmF0ZSAiICsgcGxheWJhY2tSYXRlCisgICAgICAgICAgICAgICAgICAgICArICIsIHBsYXkgdGltZSBpcyAiICsgcGxheVRpbWUgKyAiIHZzIGV4cGVjdGVkICIgKyBwbGF5ZWRNZWRpYUR1cmF0aW9uTXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVBsYXllci5wYXVzZSgpOworICAgICAgICAgICAgcGJwID0gbVBsYXllci5nZXRQbGF5YmFja1BhcmFtcygpOworICAgICAgICAgICAgLy8gVE9ETzogcGF1c2UoKSBzaG91bGQgTk9UIGNoYW5nZSBQbGF5YmFja1BhcmFtcy4KKyAgICAgICAgICAgIC8vIGFzc2VydEVxdWFscygwLmYsIHBicC5nZXRTcGVlZCgpLCBGTE9BVF9UT0xFUkFOQ0UpOworICAgICAgICB9CisgICAgICAgIG1QbGF5ZXIucmVzZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2Vla01vZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChJR05PUkVfVEVTVFMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBUaGlzIGNsaXAgaGFzIDIgSSBmcmFtZXMgYXQgNjY2ODd1cyBhbmQgNDI5OTY4N3VzLgorICAgICAgICBpZiAoIWNoZWNrTG9hZFJlc291cmNlKAorICAgICAgICAgICAgICAgIFIucmF3LmJiYl9zMV8zMjB4MjQwX21wNF9oMjY0X21wMl84MDBrYnBzXzMwZnBzX2FhY19sY181Y2hfMjQwa2Jwc180NDEwMGh6KSkgeworICAgICAgICAgICAgcmV0dXJuOyAvLyBza2lwCisgICAgICAgIH0KKworICAgICAgICBNZWRpYVBsYXllcjIuTWVkaWFQbGF5ZXIyRXZlbnRDYWxsYmFjayBlY2IgPSBuZXcgTWVkaWFQbGF5ZXIyLk1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2soKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uSW5mbyhNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCwgaW50IHdoYXQsIGludCBleHRyYSkgeworICAgICAgICAgICAgICAgIGlmICh3aGF0ID09IE1lZGlhUGxheWVyMi5NRURJQV9JTkZPX1BSRVBBUkVEKSB7CisgICAgICAgICAgICAgICAgICAgIG1PblByZXBhcmVDYWxsZWQuc2lnbmFsKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2FsbENvbXBsZXRlZChNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCwgaW50IHdoYXQsIGludCBzdGF0dXMpIHsKKyAgICAgICAgICAgICAgICBpZiAod2hhdCA9PSBNZWRpYVBsYXllcjIuQ0FMTF9DT01QTEVURURfU0VFS19UTykgeworICAgICAgICAgICAgICAgICAgICBtT25TZWVrQ29tcGxldGVDYWxsZWQuc2lnbmFsKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBzeW5jaHJvbml6ZWQgKG1FdmVudENiTG9jaykgeworICAgICAgICAgICAgbUV2ZW50Q2FsbGJhY2tzLmFkZChlY2IpOworICAgICAgICB9CisKKyAgICAgICAgbVBsYXllci5zZXREaXNwbGF5KG1BY3Rpdml0eS5nZXRTdXJmYWNlSG9sZGVyKCkpOworCisgICAgICAgIG1PblByZXBhcmVDYWxsZWQucmVzZXQoKTsKKyAgICAgICAgbVBsYXllci5wcmVwYXJlKCk7CisgICAgICAgIG1PblByZXBhcmVDYWxsZWQud2FpdEZvclNpZ25hbCgpOworCisgICAgICAgIG1PblNlZWtDb21wbGV0ZUNhbGxlZC5yZXNldCgpOworICAgICAgICBtUGxheWVyLnBsYXkoKTsKKworICAgICAgICBmaW5hbCBsb25nIHNlZWtQb3NNcyA9IDMwMDA7CisgICAgICAgIGZpbmFsIGxvbmcgdGltZVRvbGVyYW5jZU1zID0gMTAwOworICAgICAgICBmaW5hbCBsb25nIHN5bmNUaW1lMU1zID0gNjc7CisgICAgICAgIGZpbmFsIGxvbmcgc3luY1RpbWUyTXMgPSA0MzAwOworCisgICAgICAgIC8vIFRPRE86IHRpZ2h0ZW4gY2hlY2tpbmcgcmFuZ2UuIEZvciBub3csIGVuc3VyZSBtZWRpYXBsYXllciBkb2Vzbid0CisgICAgICAgIC8vIHNlZWsgdG8gcHJldmlvdXMgc3luYyBvciBuZXh0IHN5bmMuCisgICAgICAgIGxvbmcgY3AgPSBydW5TZWVrTW9kZShNZWRpYVBsYXllcjIuU0VFS19DTE9TRVNULCBzZWVrUG9zTXMpOworICAgICAgICBhc3NlcnRUcnVlKCJNZWRpYVBsYXllcjIgZGlkIG5vdCBzZWVrIHRvIGNsb3Nlc3QgcG9zaXRpb24iLAorICAgICAgICAgICAgICAgIGNwID4gc2Vla1Bvc01zICYmIGNwIDwgc3luY1RpbWUyTXMpOworCisgICAgICAgIC8vIFRPRE86IHRpZ2h0ZW4gY2hlY2tpbmcgcmFuZ2UuIEZvciBub3csIGVuc3VyZSBtZWRpYXBsYXllciBkb2Vzbid0CisgICAgICAgIC8vIHNlZWsgdG8gY2xvc2VzdCBwb3NpdGlvbiBvciBuZXh0IHN5bmMuCisgICAgICAgIGNwID0gcnVuU2Vla01vZGUoTWVkaWFQbGF5ZXIyLlNFRUtfUFJFVklPVVNfU1lOQywgc2Vla1Bvc01zKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiTWVkaWFQbGF5ZXIyIGRpZCBub3Qgc2VlayB0byBwcmVpdm91cyBzeW5jIHBvc2l0aW9uIiwKKyAgICAgICAgICAgICAgICBjcCA8IHNlZWtQb3NNcyAtIHRpbWVUb2xlcmFuY2VNcyk7CisKKyAgICAgICAgLy8gVE9ETzogdGlnaHRlbiBjaGVja2luZyByYW5nZS4gRm9yIG5vdywgZW5zdXJlIG1lZGlhcGxheWVyIGRvZXNuJ3QKKyAgICAgICAgLy8gc2VlayB0byBjbG9zZXN0IHBvc2l0aW9uIG9yIHByZXZpb3VzIHN5bmMuCisgICAgICAgIGNwID0gcnVuU2Vla01vZGUoTWVkaWFQbGF5ZXIyLlNFRUtfTkVYVF9TWU5DLCBzZWVrUG9zTXMpOworICAgICAgICBhc3NlcnRUcnVlKCJNZWRpYVBsYXllcjIgZGlkIG5vdCBzZWVrIHRvIG5leHQgc3luYyBwb3NpdGlvbiIsCisgICAgICAgICAgICAgICAgY3AgPiBzeW5jVGltZTJNcyAtIHRpbWVUb2xlcmFuY2VNcyk7CisKKyAgICAgICAgLy8gVE9ETzogdGlnaHRlbiBjaGVja2luZyByYW5nZS4gRm9yIG5vdywgZW5zdXJlIG1lZGlhcGxheWVyIGRvZXNuJ3QKKyAgICAgICAgLy8gc2VlayB0byBjbG9zZXN0IHBvc2l0aW9uIG9yIHByZXZpb3VzIHN5bmMuCisgICAgICAgIGNwID0gcnVuU2Vla01vZGUoTWVkaWFQbGF5ZXIyLlNFRUtfQ0xPU0VTVF9TWU5DLCBzZWVrUG9zTXMpOworICAgICAgICBhc3NlcnRUcnVlKCJNZWRpYVBsYXllcjIgZGlkIG5vdCBzZWVrIHRvIGNsb3Nlc3Qgc3luYyBwb3NpdGlvbiIsCisgICAgICAgICAgICAgICAgY3AgPiBzeW5jVGltZTJNcyAtIHRpbWVUb2xlcmFuY2VNcyk7CisKKyAgICAgICAgbVBsYXllci5yZXNldCgpOworICAgIH0KKworICAgIHByaXZhdGUgbG9uZyBydW5TZWVrTW9kZShpbnQgc2Vla01vZGUsIGxvbmcgc2Vla1Bvc01zKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgaW50IHNsZWVwSW50ZXJ2YWxNcyA9IDEwMDsKKyAgICAgICAgaW50IHRpbWVSZW1haW5lZE1zID0gMTAwMDA7ICAvLyB0b3RhbCB0aW1lIGZvciB0ZXN0aW5nCisgICAgICAgIGZpbmFsIGludCB0aW1lVG9sZXJhbmNlTXMgPSAxMDA7CisKKyAgICAgICAgbVBsYXllci5zZWVrVG8oc2Vla1Bvc01zLCBzZWVrTW9kZSk7CisgICAgICAgIG1PblNlZWtDb21wbGV0ZUNhbGxlZC53YWl0Rm9yU2lnbmFsKCk7CisgICAgICAgIG1PblNlZWtDb21wbGV0ZUNhbGxlZC5yZXNldCgpOworICAgICAgICBsb25nIGNwID0gLXNlZWtQb3NNczsKKyAgICAgICAgd2hpbGUgKHRpbWVSZW1haW5lZE1zID4gMCkgeworICAgICAgICAgICAgY3AgPSBtUGxheWVyLmdldEN1cnJlbnRQb3NpdGlvbigpOworICAgICAgICAgICAgLy8gV2FpdCB0aWxsIE1lZGlhUGxheWVyMiBzdGFydHMgcmVuZGVyaW5nIHNpbmNlIE1lZGlhUGxheWVyMiBjYWNoZXMKKyAgICAgICAgICAgIC8vIHNlZWsgcG9zaXRpb24gYXMgY3VycmVudCBwb3NpdGlvbi4KKyAgICAgICAgICAgIGlmIChjcCA8IHNlZWtQb3NNcyAtIHRpbWVUb2xlcmFuY2VNcyB8fCBjcCA+IHNlZWtQb3NNcyArIHRpbWVUb2xlcmFuY2VNcykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGltZVJlbWFpbmVkTXMgLT0gc2xlZXBJbnRlcnZhbE1zOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKHNsZWVwSW50ZXJ2YWxNcyk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZSgiTWVkaWFQbGF5ZXIyIGRpZCBub3QgZmluaXNoIHNlZWtpbmcgaW4gdGltZSBmb3IgbW9kZSAiICsgc2Vla01vZGUsCisgICAgICAgICAgICAgICAgdGltZVJlbWFpbmVkTXMgPiAwKTsKKyAgICAgICAgcmV0dXJuIGNwOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRUaW1lc3RhbXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKElHTk9SRV9URVNUUykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZpbmFsIGludCB0b2xlcmFuY2VVcyA9IDEwMDAwMDsKKyAgICAgICAgZmluYWwgZmxvYXQgcGxheWJhY2tSYXRlID0gMS4wZjsKKyAgICAgICAgaWYgKCFjaGVja0xvYWRSZXNvdXJjZSgKKyAgICAgICAgICAgICAgICBSLnJhdy52aWRlb180ODB4MzYwX21wNF9oMjY0XzEwMDBrYnBzXzMwZnBzX2FhY19zdGVyZW9fMTI4a2Jwc180NDEwMGh6KSkgeworICAgICAgICAgICAgcmV0dXJuOyAvLyBza2lwCisgICAgICAgIH0KKworICAgICAgICBNb25pdG9yIG9uUGF1c2VDYWxsZWQgPSBuZXcgTW9uaXRvcigpOworICAgICAgICBNZWRpYVBsYXllcjIuTWVkaWFQbGF5ZXIyRXZlbnRDYWxsYmFjayBlY2IgPSBuZXcgTWVkaWFQbGF5ZXIyLk1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2soKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uSW5mbyhNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCwgaW50IHdoYXQsIGludCBleHRyYSkgeworICAgICAgICAgICAgICAgIGlmICh3aGF0ID09IE1lZGlhUGxheWVyMi5NRURJQV9JTkZPX1BSRVBBUkVEKSB7CisgICAgICAgICAgICAgICAgICAgIG1PblByZXBhcmVDYWxsZWQuc2lnbmFsKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2FsbENvbXBsZXRlZChNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCwgaW50IHdoYXQsIGludCBzdGF0dXMpIHsKKyAgICAgICAgICAgICAgICBpZiAod2hhdCA9PSBNZWRpYVBsYXllcjIuQ0FMTF9DT01QTEVURURfUEFVU0UpIHsKKyAgICAgICAgICAgICAgICAgICAgb25QYXVzZUNhbGxlZC5zaWduYWwoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHN5bmNocm9uaXplZCAobUV2ZW50Q2JMb2NrKSB7CisgICAgICAgICAgICBtRXZlbnRDYWxsYmFja3MuYWRkKGVjYik7CisgICAgICAgIH0KKworICAgICAgICBtUGxheWVyLnNldERpc3BsYXkobUFjdGl2aXR5LmdldFN1cmZhY2VIb2xkZXIoKSk7CisKKyAgICAgICAgbU9uUHJlcGFyZUNhbGxlZC5yZXNldCgpOworICAgICAgICBtUGxheWVyLnByZXBhcmUoKTsKKyAgICAgICAgbU9uUHJlcGFyZUNhbGxlZC53YWl0Rm9yU2lnbmFsKCk7CisKKyAgICAgICAgbVBsYXllci5wbGF5KCk7CisgICAgICAgIG1QbGF5ZXIuc2V0UGxheWJhY2tQYXJhbXMobmV3IFBsYXliYWNrUGFyYW1zKCkuc2V0U3BlZWQocGxheWJhY2tSYXRlKSk7CisgICAgICAgIFRocmVhZC5zbGVlcChTTEVFUF9USU1FKTsgIC8vIGxldCBwbGF5ZXIgZ2V0IGludG8gc3RhYmxlIHN0YXRlLgorICAgICAgICBsb25nIG50MSA9IFN5c3RlbS5uYW5vVGltZSgpOworICAgICAgICBNZWRpYVRpbWVzdGFtcCB0czEgPSBtUGxheWVyLmdldFRpbWVzdGFtcCgpOworICAgICAgICBsb25nIG50MiA9IFN5c3RlbS5uYW5vVGltZSgpOworICAgICAgICBhc3NlcnRUcnVlKCJNZWRpYSBwbGF5ZXIgc2hvdWxkIHJldHVybiBhIHZhbGlkIHRpbWUgc3RhbXAiLCB0czEgIT0gbnVsbCk7CisgICAgICAgIGFzc2VydEVxdWFscygiTWVkaWFQbGF5ZXIyIGhhZCBlcnJvciBpbiBjbG9ja1JhdGUgIiArIHRzMS5nZXRNZWRpYUNsb2NrUmF0ZSgpLAorICAgICAgICAgICAgICAgIHBsYXliYWNrUmF0ZSwgdHMxLmdldE1lZGlhQ2xvY2tSYXRlKCksIDAuMDAxZik7CisgICAgICAgIGFzc2VydFRydWUoIlRoZSBuYW5vVGltZSBvZiBNZWRpYSB0aW1lc3RhbXAgc2hvdWxkIGJlIHRha2VuIHdoZW4gZ2V0VGltZXN0YW1wIGlzIGNhbGxlZC4iLAorICAgICAgICAgICAgICAgIG50MSA8PSB0czEuZ2V0QW5jaG9yU3l0ZW1OYW5vVGltZSgpICYmIHRzMS5nZXRBbmNob3JTeXRlbU5hbm9UaW1lKCkgPD0gbnQyKTsKKworICAgICAgICBvblBhdXNlQ2FsbGVkLnJlc2V0KCk7CisgICAgICAgIG1QbGF5ZXIucGF1c2UoKTsKKyAgICAgICAgb25QYXVzZUNhbGxlZC53YWl0Rm9yU2lnbmFsKCk7CisgICAgICAgIHRzMSA9IG1QbGF5ZXIuZ2V0VGltZXN0YW1wKCk7CisgICAgICAgIGFzc2VydFRydWUoIk1lZGlhIHBsYXllciBzaG91bGQgcmV0dXJuIGEgdmFsaWQgdGltZSBzdGFtcCIsIHRzMSAhPSBudWxsKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiTWVkaWEgcGxheWVyIHNob3VsZCBoYXZlIHBsYXkgcmF0ZSBvZiAwLjBmIHdoZW4gcGF1c2VkIiwKKyAgICAgICAgICAgICAgICB0czEuZ2V0TWVkaWFDbG9ja1JhdGUoKSA9PSAwLjBmKTsKKworICAgICAgICBtUGxheWVyLnNlZWtUbygwLCBNZWRpYVBsYXllcjIuU0VFS19QUkVWSU9VU19TWU5DKTsKKyAgICAgICAgbVBsYXllci5wbGF5KCk7CisgICAgICAgIFRocmVhZC5zbGVlcChTTEVFUF9USU1FKTsgIC8vIGxldCBwbGF5ZXIgZ2V0IGludG8gc3RhYmxlIHN0YXRlLgorICAgICAgICBpbnQgcGxheVRpbWUgPSA0MDAwOyAgLy8gVGhlIHRlc3RpbmcgY2xpcCBpcyBhYm91dCAxMCBzZWNvbmQgbG9uZy4KKyAgICAgICAgdHMxID0gbVBsYXllci5nZXRUaW1lc3RhbXAoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiTWVkaWEgcGxheWVyIHNob3VsZCByZXR1cm4gYSB2YWxpZCB0aW1lIHN0YW1wIiwgdHMxICE9IG51bGwpOworICAgICAgICBUaHJlYWQuc2xlZXAocGxheVRpbWUpOworICAgICAgICBNZWRpYVRpbWVzdGFtcCB0czIgPSBtUGxheWVyLmdldFRpbWVzdGFtcCgpOworICAgICAgICBhc3NlcnRUcnVlKCJNZWRpYSBwbGF5ZXIgc2hvdWxkIHJldHVybiBhIHZhbGlkIHRpbWUgc3RhbXAiLCB0czIgIT0gbnVsbCk7CisgICAgICAgIGFzc2VydFRydWUoIlRoZSBjbG9ja1JhdGUgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkLiIsCisgICAgICAgICAgICAgICAgdHMxLmdldE1lZGlhQ2xvY2tSYXRlKCkgPT0gdHMyLmdldE1lZGlhQ2xvY2tSYXRlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIk1lZGlhUGxheWVyMiBoYWQgZXJyb3IgaW4gdGltZXN0YW1wLiIsCisgICAgICAgICAgICAgICAgdHMxLmdldEFuY2hvck1lZGlhVGltZVVzKCkgKyAobG9uZykocGxheVRpbWUgKiB0czEuZ2V0TWVkaWFDbG9ja1JhdGUoKSAqIDEwMDApLAorICAgICAgICAgICAgICAgIHRzMi5nZXRBbmNob3JNZWRpYVRpbWVVcygpLCB0b2xlcmFuY2VVcyk7CisKKyAgICAgICAgbVBsYXllci5yZXNldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMb2NhbFZpZGVvX01LVl9IMjY1XzEyODB4NzIwXzUwMGticHNfMjVmcHNfQUFDX1N0ZXJlb18xMjhrYnBzXzQ0MTAwSHooKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChJR05PUkVfVEVTVFMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBwbGF5VmlkZW9UZXN0KAorICAgICAgICAgICAgICAgIFIucmF3LnZpZGVvXzEyODB4NzIwX21rdl9oMjY1XzUwMGticHNfMjVmcHNfYWFjX3N0ZXJlb18xMjhrYnBzXzQ0MTAwaHosIDEyODAsIDcyMCk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RMb2NhbFZpZGVvX01QNF9IMjY0XzQ4MHgzNjBfNTAwa2Jwc18yNWZwc19BQUNfU3RlcmVvXzEyOGticHNfNDQxMTBIeigpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKElHTk9SRV9URVNUUykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHBsYXlWaWRlb1Rlc3QoCisgICAgICAgICAgICAgICAgUi5yYXcudmlkZW9fNDgweDM2MF9tcDRfaDI2NF81MDBrYnBzXzI1ZnBzX2FhY19zdGVyZW9fMTI4a2Jwc180NDEwMGh6LCA0ODAsIDM2MCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExvY2FsVmlkZW9fTVA0X0gyNjRfNDgweDM2MF81MDBrYnBzXzMwZnBzX0FBQ19TdGVyZW9fMTI4a2Jwc180NDExMEh6KCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoSUdOT1JFX1RFU1RTKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgcGxheVZpZGVvVGVzdCgKKyAgICAgICAgICAgICAgICBSLnJhdy52aWRlb180ODB4MzYwX21wNF9oMjY0XzUwMGticHNfMzBmcHNfYWFjX3N0ZXJlb18xMjhrYnBzXzQ0MTAwaHosIDQ4MCwgMzYwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9jYWxWaWRlb19NUDRfSDI2NF80ODB4MzYwXzEwMDBrYnBzXzI1ZnBzX0FBQ19TdGVyZW9fMTI4a2Jwc180NDExMEh6KCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoSUdOT1JFX1RFU1RTKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgcGxheVZpZGVvVGVzdCgKKyAgICAgICAgICAgICAgICBSLnJhdy52aWRlb180ODB4MzYwX21wNF9oMjY0XzEwMDBrYnBzXzI1ZnBzX2FhY19zdGVyZW9fMTI4a2Jwc180NDEwMGh6LCA0ODAsIDM2MCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExvY2FsVmlkZW9fTVA0X0gyNjRfNDgweDM2MF8xMDAwa2Jwc18zMGZwc19BQUNfU3RlcmVvXzEyOGticHNfNDQxMTBIeigpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKElHTk9SRV9URVNUUykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHBsYXlWaWRlb1Rlc3QoCisgICAgICAgICAgICAgICAgUi5yYXcudmlkZW9fNDgweDM2MF9tcDRfaDI2NF8xMDAwa2Jwc18zMGZwc19hYWNfc3RlcmVvXzEyOGticHNfNDQxMDBoeiwgNDgwLCAzNjApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMb2NhbFZpZGVvX01QNF9IMjY0XzQ4MHgzNjBfMTM1MGticHNfMjVmcHNfQUFDX1N0ZXJlb18xMjhrYnBzXzQ0MTEwSHooKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChJR05PUkVfVEVTVFMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBwbGF5VmlkZW9UZXN0KAorICAgICAgICAgICAgICAgIFIucmF3LnZpZGVvXzQ4MHgzNjBfbXA0X2gyNjRfMTM1MGticHNfMjVmcHNfYWFjX3N0ZXJlb18xMjhrYnBzXzQ0MTAwaHosIDQ4MCwgMzYwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9jYWxWaWRlb19NUDRfSDI2NF80ODB4MzYwXzEzNTBrYnBzXzMwZnBzX0FBQ19TdGVyZW9fMTI4a2Jwc180NDExMEh6KCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoSUdOT1JFX1RFU1RTKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgcGxheVZpZGVvVGVzdCgKKyAgICAgICAgICAgICAgICBSLnJhdy52aWRlb180ODB4MzYwX21wNF9oMjY0XzEzNTBrYnBzXzMwZnBzX2FhY19zdGVyZW9fMTI4a2Jwc180NDEwMGh6LCA0ODAsIDM2MCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExvY2FsVmlkZW9fTVA0X0gyNjRfNDgweDM2MF8xMzUwa2Jwc18zMGZwc19BQUNfU3RlcmVvXzEyOGticHNfNDQxMTBIel9mcmFnKCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoSUdOT1JFX1RFU1RTKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgcGxheVZpZGVvVGVzdCgKKyAgICAgICAgICAgICAgICBSLnJhdy52aWRlb180ODB4MzYwX21wNF9oMjY0XzEzNTBrYnBzXzMwZnBzX2FhY19zdGVyZW9fMTI4a2Jwc180NDEwMGh6X2ZyYWdtZW50ZWQsCisgICAgICAgICAgICAgICAgNDgwLCAzNjApOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgdGVzdExvY2FsVmlkZW9fTVA0X0gyNjRfNDgweDM2MF8xMzUwa2Jwc18zMGZwc19BQUNfU3RlcmVvXzE5MmticHNfNDQxMTBIeigpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKElHTk9SRV9URVNUUykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHBsYXlWaWRlb1Rlc3QoCisgICAgICAgICAgICAgICAgUi5yYXcudmlkZW9fNDgweDM2MF9tcDRfaDI2NF8xMzUwa2Jwc18zMGZwc19hYWNfc3RlcmVvXzE5MmticHNfNDQxMDBoeiwgNDgwLCAzNjApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMb2NhbFZpZGVvXzNncF9IMjYzXzE3NngxNDRfNTZrYnBzXzEyZnBzX0FBQ19Nb25vXzI0a2Jwc18xMTAyNUh6KCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoSUdOT1JFX1RFU1RTKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgcGxheVZpZGVvVGVzdCgKKyAgICAgICAgICAgICAgICBSLnJhdy52aWRlb18xNzZ4MTQ0XzNncF9oMjYzXzU2a2Jwc18xMmZwc19hYWNfbW9ub18yNGticHNfMTEwMjVoeiwgMTc2LCAxNDQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMb2NhbFZpZGVvXzNncF9IMjYzXzE3NngxNDRfNTZrYnBzXzEyZnBzX0FBQ19Nb25vXzI0a2Jwc18yMjA1MEh6KCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoSUdOT1JFX1RFU1RTKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgcGxheVZpZGVvVGVzdCgKKyAgICAgICAgICAgICAgICBSLnJhdy52aWRlb18xNzZ4MTQ0XzNncF9oMjYzXzU2a2Jwc18xMmZwc19hYWNfbW9ub18yNGticHNfMjIwNTBoeiwgMTc2LCAxNDQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMb2NhbFZpZGVvXzNncF9IMjYzXzE3NngxNDRfNTZrYnBzXzEyZnBzX0FBQ19TdGVyZW9fMjRrYnBzXzExMDI1SHooKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChJR05PUkVfVEVTVFMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBwbGF5VmlkZW9UZXN0KAorICAgICAgICAgICAgICAgIFIucmF3LnZpZGVvXzE3NngxNDRfM2dwX2gyNjNfNTZrYnBzXzEyZnBzX2FhY19zdGVyZW9fMjRrYnBzXzExMDI1aHosIDE3NiwgMTQ0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9jYWxWaWRlb18zZ3BfSDI2M18xNzZ4MTQ0XzU2a2Jwc18xMmZwc19BQUNfU3RlcmVvXzI0a2Jwc18yMjA1MEh6KCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoSUdOT1JFX1RFU1RTKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgcGxheVZpZGVvVGVzdCgKKyAgICAgICAgICAgICAgICBSLnJhdy52aWRlb18xNzZ4MTQ0XzNncF9oMjYzXzU2a2Jwc18xMmZwc19hYWNfc3RlcmVvXzI0a2Jwc18xMTAyNWh6LCAxNzYsIDE0NCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExvY2FsVmlkZW9fM2dwX0gyNjNfMTc2eDE0NF81NmticHNfMTJmcHNfQUFDX1N0ZXJlb18xMjhrYnBzXzExMDI1SHooKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChJR05PUkVfVEVTVFMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBwbGF5VmlkZW9UZXN0KAorICAgICAgICAgICAgICAgIFIucmF3LnZpZGVvXzE3NngxNDRfM2dwX2gyNjNfNTZrYnBzXzEyZnBzX2FhY19zdGVyZW9fMTI4a2Jwc18xMTAyNWh6LCAxNzYsIDE0NCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExvY2FsVmlkZW9fM2dwX0gyNjNfMTc2eDE0NF81NmticHNfMTJmcHNfQUFDX1N0ZXJlb18xMjhrYnBzXzIyMDUwSHooKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChJR05PUkVfVEVTVFMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBwbGF5VmlkZW9UZXN0KAorICAgICAgICAgICAgICAgIFIucmF3LnZpZGVvXzE3NngxNDRfM2dwX2gyNjNfNTZrYnBzXzEyZnBzX2FhY19zdGVyZW9fMTI4a2Jwc18xMTAyNWh6LCAxNzYsIDE0NCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExvY2FsVmlkZW9fM2dwX0gyNjNfMTc2eDE0NF81NmticHNfMjVmcHNfQUFDX01vbm9fMjRrYnBzXzExMDI1SHooKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChJR05PUkVfVEVTVFMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBwbGF5VmlkZW9UZXN0KAorICAgICAgICAgICAgICAgIFIucmF3LnZpZGVvXzE3NngxNDRfM2dwX2gyNjNfNTZrYnBzXzI1ZnBzX2FhY19tb25vXzI0a2Jwc18xMTAyNWh6LCAxNzYsIDE0NCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExvY2FsVmlkZW9fM2dwX0gyNjNfMTc2eDE0NF81NmticHNfMjVmcHNfQUFDX01vbm9fMjRrYnBzXzIyMDUwSHooKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChJR05PUkVfVEVTVFMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBwbGF5VmlkZW9UZXN0KAorICAgICAgICAgICAgICAgIFIucmF3LnZpZGVvXzE3NngxNDRfM2dwX2gyNjNfNTZrYnBzXzI1ZnBzX2FhY19tb25vXzI0a2Jwc18yMjA1MGh6LCAxNzYsIDE0NCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExvY2FsVmlkZW9fM2dwX0gyNjNfMTc2eDE0NF81NmticHNfMjVmcHNfQUFDX1N0ZXJlb18yNGticHNfMTEwMjVIeigpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKElHTk9SRV9URVNUUykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHBsYXlWaWRlb1Rlc3QoCisgICAgICAgICAgICAgICAgUi5yYXcudmlkZW9fMTc2eDE0NF8zZ3BfaDI2M181NmticHNfMjVmcHNfYWFjX3N0ZXJlb18yNGticHNfMTEwMjVoeiwgMTc2LCAxNDQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMb2NhbFZpZGVvXzNncF9IMjYzXzE3NngxNDRfNTZrYnBzXzI1ZnBzX0FBQ19TdGVyZW9fMjRrYnBzXzIyMDUwSHooKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChJR05PUkVfVEVTVFMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBwbGF5VmlkZW9UZXN0KAorICAgICAgICAgICAgICAgIFIucmF3LnZpZGVvXzE3NngxNDRfM2dwX2gyNjNfNTZrYnBzXzI1ZnBzX2FhY19zdGVyZW9fMjRrYnBzXzExMDI1aHosIDE3NiwgMTQ0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9jYWxWaWRlb18zZ3BfSDI2M18xNzZ4MTQ0XzU2a2Jwc18yNWZwc19BQUNfU3RlcmVvXzEyOGticHNfMTEwMjVIeigpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKElHTk9SRV9URVNUUykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHBsYXlWaWRlb1Rlc3QoCisgICAgICAgICAgICAgICAgUi5yYXcudmlkZW9fMTc2eDE0NF8zZ3BfaDI2M181NmticHNfMjVmcHNfYWFjX3N0ZXJlb18xMjhrYnBzXzExMDI1aHosIDE3NiwgMTQ0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9jYWxWaWRlb18zZ3BfSDI2M18xNzZ4MTQ0XzU2a2Jwc18yNWZwc19BQUNfU3RlcmVvXzEyOGticHNfMjIwNTBIeigpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKElHTk9SRV9URVNUUykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHBsYXlWaWRlb1Rlc3QoCisgICAgICAgICAgICAgICAgUi5yYXcudmlkZW9fMTc2eDE0NF8zZ3BfaDI2M181NmticHNfMjVmcHNfYWFjX3N0ZXJlb18xMjhrYnBzXzExMDI1aHosIDE3NiwgMTQ0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9jYWxWaWRlb18zZ3BfSDI2M18xNzZ4MTQ0XzMwMGticHNfMTJmcHNfQUFDX01vbm9fMjRrYnBzXzExMDI1SHooKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChJR05PUkVfVEVTVFMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBwbGF5VmlkZW9UZXN0KAorICAgICAgICAgICAgICAgIFIucmF3LnZpZGVvXzE3NngxNDRfM2dwX2gyNjNfMzAwa2Jwc18xMmZwc19hYWNfbW9ub18yNGticHNfMTEwMjVoeiwgMTc2LCAxNDQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMb2NhbFZpZGVvXzNncF9IMjYzXzE3NngxNDRfMzAwa2Jwc18xMmZwc19BQUNfTW9ub18yNGticHNfMjIwNTBIeigpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKElHTk9SRV9URVNUUykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHBsYXlWaWRlb1Rlc3QoCisgICAgICAgICAgICAgICAgUi5yYXcudmlkZW9fMTc2eDE0NF8zZ3BfaDI2M18zMDBrYnBzXzEyZnBzX2FhY19tb25vXzI0a2Jwc18yMjA1MGh6LCAxNzYsIDE0NCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExvY2FsVmlkZW9fM2dwX0gyNjNfMTc2eDE0NF8zMDBrYnBzXzEyZnBzX0FBQ19TdGVyZW9fMjRrYnBzXzExMDI1SHooKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChJR05PUkVfVEVTVFMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBwbGF5VmlkZW9UZXN0KAorICAgICAgICAgICAgICAgIFIucmF3LnZpZGVvXzE3NngxNDRfM2dwX2gyNjNfMzAwa2Jwc18xMmZwc19hYWNfc3RlcmVvXzI0a2Jwc18xMTAyNWh6LCAxNzYsIDE0NCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExvY2FsVmlkZW9fM2dwX0gyNjNfMTc2eDE0NF8zMDBrYnBzXzEyZnBzX0FBQ19TdGVyZW9fMjRrYnBzXzIyMDUwSHooKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChJR05PUkVfVEVTVFMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBwbGF5VmlkZW9UZXN0KAorICAgICAgICAgICAgICAgIFIucmF3LnZpZGVvXzE3NngxNDRfM2dwX2gyNjNfMzAwa2Jwc18xMmZwc19hYWNfc3RlcmVvXzI0a2Jwc18xMTAyNWh6LCAxNzYsIDE0NCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExvY2FsVmlkZW9fM2dwX0gyNjNfMTc2eDE0NF8zMDBrYnBzXzEyZnBzX0FBQ19TdGVyZW9fMTI4a2Jwc18xMTAyNUh6KCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoSUdOT1JFX1RFU1RTKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgcGxheVZpZGVvVGVzdCgKKyAgICAgICAgICAgICAgICBSLnJhdy52aWRlb18xNzZ4MTQ0XzNncF9oMjYzXzMwMGticHNfMTJmcHNfYWFjX3N0ZXJlb18xMjhrYnBzXzExMDI1aHosIDE3NiwgMTQ0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9jYWxWaWRlb18zZ3BfSDI2M18xNzZ4MTQ0XzMwMGticHNfMTJmcHNfQUFDX1N0ZXJlb18xMjhrYnBzXzIyMDUwSHooKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChJR05PUkVfVEVTVFMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBwbGF5VmlkZW9UZXN0KAorICAgICAgICAgICAgICAgIFIucmF3LnZpZGVvXzE3NngxNDRfM2dwX2gyNjNfMzAwa2Jwc18xMmZwc19hYWNfc3RlcmVvXzEyOGticHNfMTEwMjVoeiwgMTc2LCAxNDQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMb2NhbFZpZGVvXzNncF9IMjYzXzE3NngxNDRfMzAwa2Jwc18yNWZwc19BQUNfTW9ub18yNGticHNfMTEwMjVIeigpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKElHTk9SRV9URVNUUykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHBsYXlWaWRlb1Rlc3QoCisgICAgICAgICAgICAgICAgUi5yYXcudmlkZW9fMTc2eDE0NF8zZ3BfaDI2M18zMDBrYnBzXzI1ZnBzX2FhY19tb25vXzI0a2Jwc18xMTAyNWh6LCAxNzYsIDE0NCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExvY2FsVmlkZW9fM2dwX0gyNjNfMTc2eDE0NF8zMDBrYnBzXzI1ZnBzX0FBQ19Nb25vXzI0a2Jwc18yMjA1MEh6KCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoSUdOT1JFX1RFU1RTKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgcGxheVZpZGVvVGVzdCgKKyAgICAgICAgICAgICAgICBSLnJhdy52aWRlb18xNzZ4MTQ0XzNncF9oMjYzXzMwMGticHNfMjVmcHNfYWFjX21vbm9fMjRrYnBzXzIyMDUwaHosIDE3NiwgMTQ0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9jYWxWaWRlb18zZ3BfSDI2M18xNzZ4MTQ0XzMwMGticHNfMjVmcHNfQUFDX1N0ZXJlb18yNGticHNfMTEwMjVIeigpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKElHTk9SRV9URVNUUykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHBsYXlWaWRlb1Rlc3QoCisgICAgICAgICAgICAgICAgUi5yYXcudmlkZW9fMTc2eDE0NF8zZ3BfaDI2M18zMDBrYnBzXzI1ZnBzX2FhY19zdGVyZW9fMjRrYnBzXzExMDI1aHosIDE3NiwgMTQ0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9jYWxWaWRlb18zZ3BfSDI2M18xNzZ4MTQ0XzMwMGticHNfMjVmcHNfQUFDX1N0ZXJlb18yNGticHNfMjIwNTBIeigpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKElHTk9SRV9URVNUUykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHBsYXlWaWRlb1Rlc3QoCisgICAgICAgICAgICAgICAgUi5yYXcudmlkZW9fMTc2eDE0NF8zZ3BfaDI2M18zMDBrYnBzXzI1ZnBzX2FhY19zdGVyZW9fMjRrYnBzXzExMDI1aHosIDE3NiwgMTQ0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9jYWxWaWRlb18zZ3BfSDI2M18xNzZ4MTQ0XzMwMGticHNfMjVmcHNfQUFDX1N0ZXJlb18xMjhrYnBzXzExMDI1SHooKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChJR05PUkVfVEVTVFMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBwbGF5VmlkZW9UZXN0KAorICAgICAgICAgICAgICAgIFIucmF3LnZpZGVvXzE3NngxNDRfM2dwX2gyNjNfMzAwa2Jwc18yNWZwc19hYWNfc3RlcmVvXzEyOGticHNfMTEwMjVoeiwgMTc2LCAxNDQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMb2NhbFZpZGVvXzNncF9IMjYzXzE3NngxNDRfMzAwa2Jwc18yNWZwc19BQUNfU3RlcmVvXzEyOGticHNfMjIwNTBIeigpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKElHTk9SRV9URVNUUykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHBsYXlWaWRlb1Rlc3QoCisgICAgICAgICAgICAgICAgUi5yYXcudmlkZW9fMTc2eDE0NF8zZ3BfaDI2M18zMDBrYnBzXzI1ZnBzX2FhY19zdGVyZW9fMTI4a2Jwc18yMjA1MGh6LCAxNzYsIDE0NCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlYWRTdWJ0aXRsZVRyYWNrcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtU3VidGl0bGVUcmFja0luZGV4LmNsZWFyKCk7CisgICAgICAgIExpc3Q8TWVkaWFQbGF5ZXIyLlRyYWNrSW5mbz4gdHJhY2tJbmZvcyA9IG1QbGF5ZXIuZ2V0VHJhY2tJbmZvKCk7CisgICAgICAgIGlmICh0cmFja0luZm9zID09IG51bGwgfHwgdHJhY2tJbmZvcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgVmVjdG9yPEludGVnZXI+IHN1YnRpdGxlVHJhY2tJbmRleCA9IG5ldyBWZWN0b3I8PigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRyYWNrSW5mb3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUodHJhY2tJbmZvcy5nZXQoaSkgIT0gbnVsbCk7CisgICAgICAgICAgICBpZiAodHJhY2tJbmZvcy5nZXQoaSkuZ2V0VHJhY2tUeXBlKCkgPT0KKyAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXIyLlRyYWNrSW5mby5NRURJQV9UUkFDS19UWVBFX1NVQlRJVExFKSB7CisgICAgICAgICAgICAgICAgc3VidGl0bGVUcmFja0luZGV4LmFkZChpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG1TdWJ0aXRsZVRyYWNrSW5kZXguYWRkQWxsKHN1YnRpdGxlVHJhY2tJbmRleCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNlbGVjdFN1YnRpdGxlVHJhY2soaW50IGluZGV4KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IHRyYWNrSW5kZXggPSBtU3VidGl0bGVUcmFja0luZGV4LmdldChpbmRleCk7CisgICAgICAgIG1QbGF5ZXIuc2VsZWN0VHJhY2sodHJhY2tJbmRleCk7CisgICAgICAgIG1TZWxlY3RlZFN1YnRpdGxlSW5kZXggPSBpbmRleDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGVzZWxlY3RTdWJ0aXRsZVRyYWNrKGludCBpbmRleCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGludCB0cmFja0luZGV4ID0gbVN1YnRpdGxlVHJhY2tJbmRleC5nZXQoaW5kZXgpOworICAgICAgICBtT25EZXNlbGVjdFRyYWNrQ2FsbGVkLnJlc2V0KCk7CisgICAgICAgIG1QbGF5ZXIuZGVzZWxlY3RUcmFjayh0cmFja0luZGV4KTsKKyAgICAgICAgbU9uRGVzZWxlY3RUcmFja0NhbGxlZC53YWl0Rm9yU2lnbmFsKCk7CisgICAgICAgIGlmIChtU2VsZWN0ZWRTdWJ0aXRsZUluZGV4ID09IGluZGV4KSB7CisgICAgICAgICAgICBtU2VsZWN0ZWRTdWJ0aXRsZUluZGV4ID0gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVzZWxlY3RUcmFja0ZvclN1YnRpdGxlVHJhY2tzKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGlmIChJR05PUkVfVEVTVFMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWNoZWNrTG9hZFJlc291cmNlKFIucmF3LnRlc3R2aWRlb193aXRoXzJfc3VidGl0bGVfdHJhY2tzKSkgeworICAgICAgICAgICAgcmV0dXJuOyAvLyBza2lwOworICAgICAgICB9CisKKyAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkud2FpdEZvcklkbGVTeW5jKCk7CisKKyAgICAgICAgTWVkaWFQbGF5ZXIyLk1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2sgZWNiID0gbmV3IE1lZGlhUGxheWVyMi5NZWRpYVBsYXllcjJFdmVudENhbGxiYWNrKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkluZm8oTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsIGludCB3aGF0LCBpbnQgZXh0cmEpIHsKKyAgICAgICAgICAgICAgICBpZiAod2hhdCA9PSBNZWRpYVBsYXllcjIuTUVESUFfSU5GT19QUkVQQVJFRCkgeworICAgICAgICAgICAgICAgICAgICBtT25QcmVwYXJlQ2FsbGVkLnNpZ25hbCgpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBNZWRpYVBsYXllcjIuTUVESUFfSU5GT19NRVRBREFUQV9VUERBVEUpIHsKKyAgICAgICAgICAgICAgICAgICAgbU9uSW5mb0NhbGxlZC5zaWduYWwoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25DYWxsQ29tcGxldGVkKE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkLCBpbnQgd2hhdCwgaW50IHN0YXR1cykgeworICAgICAgICAgICAgICAgIGlmICh3aGF0ID09IE1lZGlhUGxheWVyMi5DQUxMX0NPTVBMRVRFRF9TRUVLX1RPKSB7CisgICAgICAgICAgICAgICAgICAgIG1PblNlZWtDb21wbGV0ZUNhbGxlZC5zaWduYWwoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gTWVkaWFQbGF5ZXIyLkNBTExfQ09NUExFVEVEX1BMQVkpIHsKKyAgICAgICAgICAgICAgICAgICAgbU9uUGxheUNhbGxlZC5zaWduYWwoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gTWVkaWFQbGF5ZXIyLkNBTExfQ09NUExFVEVEX0RFU0VMRUNUX1RSQUNLKSB7CisgICAgICAgICAgICAgICAgICAgIG1DYWxsU3RhdHVzID0gc3RhdHVzOworICAgICAgICAgICAgICAgICAgICBtT25EZXNlbGVjdFRyYWNrQ2FsbGVkLnNpZ25hbCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgc3luY2hyb25pemVkIChtRXZlbnRDYkxvY2spIHsKKyAgICAgICAgICAgIG1FdmVudENhbGxiYWNrcy5hZGQoZWNiKTsKKyAgICAgICAgfQorCisgICAgICAgIG1QbGF5ZXIuc2V0T25TdWJ0aXRsZURhdGFMaXN0ZW5lcihuZXcgTWVkaWFQbGF5ZXIyLk9uU3VidGl0bGVEYXRhTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VidGl0bGVEYXRhKE1lZGlhUGxheWVyMiBtcCwgU3VidGl0bGVEYXRhIGRhdGEpIHsKKyAgICAgICAgICAgICAgICBpZiAoZGF0YSAhPSBudWxsICYmIGRhdGEuZ2V0RGF0YSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbU9uU3VidGl0bGVEYXRhQ2FsbGVkLnNpZ25hbCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgbVBsYXllci5zZXREaXNwbGF5KGdldEFjdGl2aXR5KCkuZ2V0U3VyZmFjZUhvbGRlcigpKTsKKyAgICAgICAgbVBsYXllci5zZXRTY3JlZW5PbldoaWxlUGxheWluZyh0cnVlKTsKKyAgICAgICAgbVBsYXllci5zZXRXYWtlTW9kZShtQ29udGV4dCwgUG93ZXJNYW5hZ2VyLlBBUlRJQUxfV0FLRV9MT0NLKTsKKworICAgICAgICBtT25QcmVwYXJlQ2FsbGVkLnJlc2V0KCk7CisgICAgICAgIG1QbGF5ZXIucHJlcGFyZSgpOworICAgICAgICBtT25QcmVwYXJlQ2FsbGVkLndhaXRGb3JTaWduYWwoKTsKKworICAgICAgICBtT25QbGF5Q2FsbGVkLnJlc2V0KCk7CisgICAgICAgIG1QbGF5ZXIucGxheSgpOworICAgICAgICBtT25QbGF5Q2FsbGVkLndhaXRGb3JTaWduYWwoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtUGxheWVyLmlzUGxheWluZygpKTsKKworICAgICAgICAvLyBDbG9zZWQgY2FwdGlvbiB0cmFja3MgYXJlIGluLWJhbmQuCisgICAgICAgIC8vIFNvLCB0aG9zZSB0cmFja3Mgd2lsbCBiZSBmb3VuZCBhZnRlciBwcm9jZXNzaW5nIGEgbnVtYmVyIG9mIGZyYW1lcy4KKyAgICAgICAgbU9uSW5mb0NhbGxlZC53YWl0Rm9yU2lnbmFsKDE1MDApOworCisgICAgICAgIG1PbkluZm9DYWxsZWQucmVzZXQoKTsKKyAgICAgICAgbU9uSW5mb0NhbGxlZC53YWl0Rm9yU2lnbmFsKDE1MDApOworCisgICAgICAgIHJlYWRTdWJ0aXRsZVRyYWNrcygpOworCisgICAgICAgIC8vIFJ1biB0d2ljZSB0byBjaGVjayBpZiByZXBlYXRlZCBzZWxlY3Rpb24tZGVzZWxlY3Rpb24gb24gdGhlIHNhbWUgdHJhY2sgd29ya3Mgd2VsbC4KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgICAgIC8vIFdhaXRzIHVudGlsIGF0IGxlYXN0IG9uZSBzdWJ0aXRsZSBpcyBmaXJlZC4gVGltZW91dCBpcyAyLjUgc2Vjb25kcy4KKyAgICAgICAgICAgIHNlbGVjdFN1YnRpdGxlVHJhY2soaSk7CisgICAgICAgICAgICBtT25TdWJ0aXRsZURhdGFDYWxsZWQucmVzZXQoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobU9uU3VidGl0bGVEYXRhQ2FsbGVkLndhaXRGb3JTaWduYWwoMjUwMCkpOworCisgICAgICAgICAgICAvLyBUcnkgZGVzZWxlY3RpbmcgdHJhY2suCisgICAgICAgICAgICBkZXNlbGVjdFN1YnRpdGxlVHJhY2soaSk7CisgICAgICAgICAgICBtT25TdWJ0aXRsZURhdGFDYWxsZWQucmVzZXQoKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKG1PblN1YnRpdGxlRGF0YUNhbGxlZC53YWl0Rm9yU2lnbmFsKDE1MDApKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIERlc2VsZWN0aW5nIHVuc2VsZWN0ZWQgdHJhY2s6IGV4cGVjdGVkIGVycm9yIHN0YXR1cworICAgICAgICBtQ2FsbFN0YXR1cyA9IE1lZGlhUGxheWVyMi5DQUxMX1NUQVRVU19OT19FUlJPUjsKKyAgICAgICAgZGVzZWxlY3RTdWJ0aXRsZVRyYWNrKDApOworICAgICAgICBhc3NlcnRUcnVlKG1DYWxsU3RhdHVzICE9IE1lZGlhUGxheWVyMi5DQUxMX1NUQVRVU19OT19FUlJPUik7CisKKyAgICAgICAgbVBsYXllci5yZXNldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VTdWJ0aXRsZVRyYWNrKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGlmIChJR05PUkVfVEVTVFMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWNoZWNrTG9hZFJlc291cmNlKFIucmF3LnRlc3R2aWRlb193aXRoXzJfc3VidGl0bGVfdHJhY2tzKSkgeworICAgICAgICAgICAgcmV0dXJuOyAvLyBza2lwOworICAgICAgICB9CisKKyAgICAgICAgbVBsYXllci5zZXRPblN1YnRpdGxlRGF0YUxpc3RlbmVyKG5ldyBNZWRpYVBsYXllcjIuT25TdWJ0aXRsZURhdGFMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25TdWJ0aXRsZURhdGEoTWVkaWFQbGF5ZXIyIG1wLCBTdWJ0aXRsZURhdGEgZGF0YSkgeworICAgICAgICAgICAgICAgIGlmIChkYXRhICE9IG51bGwgJiYgZGF0YS5nZXREYXRhKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtT25TdWJ0aXRsZURhdGFDYWxsZWQuc2lnbmFsKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBNZWRpYVBsYXllcjIuTWVkaWFQbGF5ZXIyRXZlbnRDYWxsYmFjayBlY2IgPSBuZXcgTWVkaWFQbGF5ZXIyLk1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2soKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uSW5mbyhNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCwgaW50IHdoYXQsIGludCBleHRyYSkgeworICAgICAgICAgICAgICAgIGlmICh3aGF0ID09IE1lZGlhUGxheWVyMi5NRURJQV9JTkZPX1BSRVBBUkVEKSB7CisgICAgICAgICAgICAgICAgICAgIG1PblByZXBhcmVDYWxsZWQuc2lnbmFsKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IE1lZGlhUGxheWVyMi5NRURJQV9JTkZPX01FVEFEQVRBX1VQREFURSkgeworICAgICAgICAgICAgICAgICAgICBtT25JbmZvQ2FsbGVkLnNpZ25hbCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNhbGxDb21wbGV0ZWQoTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsIGludCB3aGF0LCBpbnQgc3RhdHVzKSB7CisgICAgICAgICAgICAgICAgaWYgKHdoYXQgPT0gTWVkaWFQbGF5ZXIyLkNBTExfQ09NUExFVEVEX1BMQVkpIHsKKyAgICAgICAgICAgICAgICAgICAgbU9uUGxheUNhbGxlZC5zaWduYWwoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHN5bmNocm9uaXplZCAobUV2ZW50Q2JMb2NrKSB7CisgICAgICAgICAgICBtRXZlbnRDYWxsYmFja3MuYWRkKGVjYik7CisgICAgICAgIH0KKworICAgICAgICBtUGxheWVyLnNldERpc3BsYXkoZ2V0QWN0aXZpdHkoKS5nZXRTdXJmYWNlSG9sZGVyKCkpOworICAgICAgICBtUGxheWVyLnNldFNjcmVlbk9uV2hpbGVQbGF5aW5nKHRydWUpOworICAgICAgICBtUGxheWVyLnNldFdha2VNb2RlKG1Db250ZXh0LCBQb3dlck1hbmFnZXIuUEFSVElBTF9XQUtFX0xPQ0spOworCisgICAgICAgIG1PblByZXBhcmVDYWxsZWQucmVzZXQoKTsKKyAgICAgICAgbVBsYXllci5wcmVwYXJlKCk7CisgICAgICAgIG1PblByZXBhcmVDYWxsZWQud2FpdEZvclNpZ25hbCgpOworCisgICAgICAgIG1PblBsYXlDYWxsZWQucmVzZXQoKTsKKyAgICAgICAgbVBsYXllci5wbGF5KCk7CisgICAgICAgIG1PblBsYXlDYWxsZWQud2FpdEZvclNpZ25hbCgpOworICAgICAgICBhc3NlcnRUcnVlKG1QbGF5ZXIuaXNQbGF5aW5nKCkpOworCisgICAgICAgIC8vIENsb3NlZCBjYXB0aW9uIHRyYWNrcyBhcmUgaW4tYmFuZC4KKyAgICAgICAgLy8gU28sIHRob3NlIHRyYWNrcyB3aWxsIGJlIGZvdW5kIGFmdGVyIHByb2Nlc3NpbmcgYSBudW1iZXIgb2YgZnJhbWVzLgorICAgICAgICBtT25JbmZvQ2FsbGVkLndhaXRGb3JTaWduYWwoMTUwMCk7CisKKyAgICAgICAgbU9uSW5mb0NhbGxlZC5yZXNldCgpOworICAgICAgICBtT25JbmZvQ2FsbGVkLndhaXRGb3JTaWduYWwoMTUwMCk7CisKKyAgICAgICAgcmVhZFN1YnRpdGxlVHJhY2tzKCk7CisKKyAgICAgICAgLy8gV2FpdHMgdW50aWwgYXQgbGVhc3QgdHdvIGNhcHRpb25zIGFyZSBmaXJlZC4gVGltZW91dCBpcyAyLjUgc2VjLgorICAgICAgICBzZWxlY3RTdWJ0aXRsZVRyYWNrKDApOworICAgICAgICBhc3NlcnRUcnVlKG1PblN1YnRpdGxlRGF0YUNhbGxlZC53YWl0Rm9yQ291bnRlZFNpZ25hbHMoMiwgMjUwMCkgPj0gMik7CisKKyAgICAgICAgbU9uU3VidGl0bGVEYXRhQ2FsbGVkLnJlc2V0KCk7CisgICAgICAgIHNlbGVjdFN1YnRpdGxlVHJhY2soMSk7CisgICAgICAgIGFzc2VydFRydWUobU9uU3VidGl0bGVEYXRhQ2FsbGVkLndhaXRGb3JDb3VudGVkU2lnbmFscygyLCAyNTAwKSA+PSAyKTsKKworICAgICAgICBtUGxheWVyLnJlc2V0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldFRyYWNrSW5mb0ZvclZpZGVvV2l0aFN1YnRpdGxlVHJhY2tzKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGlmIChJR05PUkVfVEVTVFMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWNoZWNrTG9hZFJlc291cmNlKFIucmF3LnRlc3R2aWRlb193aXRoXzJfc3VidGl0bGVfdHJhY2tzKSkgeworICAgICAgICAgICAgcmV0dXJuOyAvLyBza2lwOworICAgICAgICB9CisKKyAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkud2FpdEZvcklkbGVTeW5jKCk7CisKKyAgICAgICAgTWVkaWFQbGF5ZXIyLk1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2sgZWNiID0gbmV3IE1lZGlhUGxheWVyMi5NZWRpYVBsYXllcjJFdmVudENhbGxiYWNrKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkluZm8oTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsIGludCB3aGF0LCBpbnQgZXh0cmEpIHsKKyAgICAgICAgICAgICAgICBpZiAod2hhdCA9PSBNZWRpYVBsYXllcjIuTUVESUFfSU5GT19QUkVQQVJFRCkgeworICAgICAgICAgICAgICAgICAgICBtT25QcmVwYXJlQ2FsbGVkLnNpZ25hbCgpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBNZWRpYVBsYXllcjIuTUVESUFfSU5GT19NRVRBREFUQV9VUERBVEUpIHsKKyAgICAgICAgICAgICAgICAgICAgbU9uSW5mb0NhbGxlZC5zaWduYWwoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25DYWxsQ29tcGxldGVkKE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkLCBpbnQgd2hhdCwgaW50IHN0YXR1cykgeworICAgICAgICAgICAgICAgIGlmICh3aGF0ID09IE1lZGlhUGxheWVyMi5DQUxMX0NPTVBMRVRFRF9QTEFZKSB7CisgICAgICAgICAgICAgICAgICAgIG1PblBsYXlDYWxsZWQuc2lnbmFsKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBzeW5jaHJvbml6ZWQgKG1FdmVudENiTG9jaykgeworICAgICAgICAgICAgbUV2ZW50Q2FsbGJhY2tzLmFkZChlY2IpOworICAgICAgICB9CisKKyAgICAgICAgbVBsYXllci5zZXREaXNwbGF5KGdldEFjdGl2aXR5KCkuZ2V0U3VyZmFjZUhvbGRlcigpKTsKKyAgICAgICAgbVBsYXllci5zZXRTY3JlZW5PbldoaWxlUGxheWluZyh0cnVlKTsKKyAgICAgICAgbVBsYXllci5zZXRXYWtlTW9kZShtQ29udGV4dCwgUG93ZXJNYW5hZ2VyLlBBUlRJQUxfV0FLRV9MT0NLKTsKKworICAgICAgICBtT25QcmVwYXJlQ2FsbGVkLnJlc2V0KCk7CisgICAgICAgIG1QbGF5ZXIucHJlcGFyZSgpOworICAgICAgICBtT25QcmVwYXJlQ2FsbGVkLndhaXRGb3JTaWduYWwoKTsKKworICAgICAgICBtT25QbGF5Q2FsbGVkLnJlc2V0KCk7CisgICAgICAgIG1QbGF5ZXIucGxheSgpOworICAgICAgICBtT25QbGF5Q2FsbGVkLndhaXRGb3JTaWduYWwoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtUGxheWVyLmlzUGxheWluZygpKTsKKworICAgICAgICAvLyBUaGUgbWVkaWEgbWV0YWRhdGEgd2lsbCBiZSBjaGFuZ2VkIHdoaWxlIHBsYXlpbmcgc2luY2UgY2xvc2VkIGNhcHRpb24gdHJhY2tzIGFyZSBpbi1iYW5kCisgICAgICAgIC8vIGFuZCB0aG9zZSB0cmFja3Mgd2lsbCBiZSBmb3VuZCBhZnRlciBwcm9jZXNzaW5nIGEgbnVtYmVyIG9mIGZyYW1lcy4gVGhlc2UgdHJhY2tzIHdpbGwgYmUKKyAgICAgICAgLy8gZm91bmQgd2l0aGluIG9uZSBzZWNvbmQuCisgICAgICAgIG1PbkluZm9DYWxsZWQud2FpdEZvclNpZ25hbCgxNTAwKTsKKworICAgICAgICBtT25JbmZvQ2FsbGVkLnJlc2V0KCk7CisgICAgICAgIG1PbkluZm9DYWxsZWQud2FpdEZvclNpZ25hbCgxNTAwKTsKKworICAgICAgICByZWFkU3VidGl0bGVUcmFja3MoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG1TdWJ0aXRsZVRyYWNrSW5kZXguc2l6ZSgpKTsKKworICAgICAgICBtUGxheWVyLnJlc2V0KCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAgVGhpcyB0ZXN0IGFzc3VtZXMgdGhlIHJlc291cmNlcyBiZWluZyB0ZXN0ZWQgYXJlIGJldHdlZW4gOCBhbmQgMTQgc2Vjb25kcyBsb25nCisgICAgICogIFRoZSBvbmVzIGJlaW5nIHVzZWQgaGVyZSBhcmUgMTAgc2Vjb25kcyBsb25nLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RSZXN1bWVBdEVuZCgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBpZiAoSUdOT1JFX1RFU1RTKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaW50IHRlc3RzUnVuID0KKyAgICAgICAgICAgIHRlc3RSZXN1bWVBdEVuZChSLnJhdy5sb3Vkc29mdG1wMykgKworICAgICAgICAgICAgdGVzdFJlc3VtZUF0RW5kKFIucmF3LmxvdWRzb2Z0d2F2KSArCisgICAgICAgICAgICB0ZXN0UmVzdW1lQXRFbmQoUi5yYXcubG91ZHNvZnRvZ2cpICsKKyAgICAgICAgICAgIHRlc3RSZXN1bWVBdEVuZChSLnJhdy5sb3Vkc29mdGl0dW5lcykgKworICAgICAgICAgICAgdGVzdFJlc3VtZUF0RW5kKFIucmF3LmxvdWRzb2Z0ZmFhYykgKworICAgICAgICAgICAgdGVzdFJlc3VtZUF0RW5kKFIucmF3LmxvdWRzb2Z0YWFjKTsKKyAgICAgICAgaWYgKHRlc3RzUnVuID09IDApIHsKKyAgICAgICAgICAgIE1lZGlhVXRpbHMuc2tpcFRlc3QoIm5vIGRlY29kZXIgZm91bmQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHJldHVybnMgMSBpZiB0ZXN0IHdhcyBydW4sIDAgb3RoZXJ3aXNlCisgICAgcHJpdmF0ZSBpbnQgdGVzdFJlc3VtZUF0RW5kKGludCByZXMpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBpZiAoIWxvYWRSZXNvdXJjZShyZXMpKSB7CisgICAgICAgICAgICBMb2cuaShMT0dfVEFHLCAidGVzdFJlc3VtZUF0RW5kOiBObyBkZWNvZGVyIGZvdW5kIGZvciAiICsKKyAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZUVudHJ5TmFtZShyZXMpICsKKyAgICAgICAgICAgICAgICAiIC0tLSBza2lwcGluZy4iKTsKKyAgICAgICAgICAgIHJldHVybiAwOyAvLyBza2lwCisgICAgICAgIH0KKyAgICAgICAgbU9uQ29tcGxldGlvbkNhbGxlZC5yZXNldCgpOworICAgICAgICBNZWRpYVBsYXllcjIuTWVkaWFQbGF5ZXIyRXZlbnRDYWxsYmFjayBlY2IgPSBuZXcgTWVkaWFQbGF5ZXIyLk1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2soKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uSW5mbyhNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCwgaW50IHdoYXQsIGludCBleHRyYSkgeworICAgICAgICAgICAgICAgIGlmICh3aGF0ID09IE1lZGlhUGxheWVyMi5NRURJQV9JTkZPX1BSRVBBUkVEKSB7CisgICAgICAgICAgICAgICAgICAgIG1PblByZXBhcmVDYWxsZWQuc2lnbmFsKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IE1lZGlhUGxheWVyMi5NRURJQV9JTkZPX1BMQVlCQUNLX0NPTVBMRVRFKSB7CisgICAgICAgICAgICAgICAgICAgIG1PbkNvbXBsZXRpb25DYWxsZWQuc2lnbmFsKCk7CisgICAgICAgICAgICAgICAgICAgIG1QbGF5ZXIucGxheSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgbVBsYXllci5zZXRNZWRpYVBsYXllcjJFdmVudENhbGxiYWNrKG1FeGVjdXRvciwgZWNiKTsKKworICAgICAgICBtT25QcmVwYXJlQ2FsbGVkLnJlc2V0KCk7CisgICAgICAgIG1QbGF5ZXIucHJlcGFyZSgpOworICAgICAgICBtT25QcmVwYXJlQ2FsbGVkLndhaXRGb3JTaWduYWwoKTsKKworICAgICAgICAvLyBza2lwIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBmaWxlIHNvIHdlIHJlYWNoIEVPRiBzb29uZXIKKyAgICAgICAgbVBsYXllci5zZWVrVG8oNTAwMCwgTWVkaWFQbGF5ZXIyLlNFRUtfUFJFVklPVVNfU1lOQyk7CisgICAgICAgIG1QbGF5ZXIucGxheSgpOworICAgICAgICAvLyBzbGVlcCBsb25nIGVub3VnaCB0aGF0IHdlIHJlc3RhcnQgcGxheWJhY2sgYXQgbGVhc3Qgb25jZSwgYnV0IG5vIG1vcmUKKyAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDAwKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiTWVkaWFQbGF5ZXIyIHNob3VsZCBzdGlsbCBiZSBwbGF5aW5nIiwgbVBsYXllci5pc1BsYXlpbmcoKSk7CisgICAgICAgIG1QbGF5ZXIucmVzZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3cm9uZyBudW1iZXIgb2YgcmVwZXRpdGlvbnMiLCAxLCBtT25Db21wbGV0aW9uQ2FsbGVkLmdldE51bVNpZ25hbCgpKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFBvc2l0aW9uQXRFbmQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgaWYgKElHTk9SRV9URVNUUykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGludCB0ZXN0c1J1biA9CisgICAgICAgICAgICB0ZXN0UG9zaXRpb25BdEVuZChSLnJhdy50ZXN0MW0xc2hpZ2hzdGVyZW8pICsKKyAgICAgICAgICAgIHRlc3RQb3NpdGlvbkF0RW5kKFIucmF3LmxvdWRzb2Z0bXAzKSArCisgICAgICAgICAgICB0ZXN0UG9zaXRpb25BdEVuZChSLnJhdy5sb3Vkc29mdHdhdikgKworICAgICAgICAgICAgdGVzdFBvc2l0aW9uQXRFbmQoUi5yYXcubG91ZHNvZnRvZ2cpICsKKyAgICAgICAgICAgIHRlc3RQb3NpdGlvbkF0RW5kKFIucmF3LmxvdWRzb2Z0aXR1bmVzKSArCisgICAgICAgICAgICB0ZXN0UG9zaXRpb25BdEVuZChSLnJhdy5sb3Vkc29mdGZhYWMpICsKKyAgICAgICAgICAgIHRlc3RQb3NpdGlvbkF0RW5kKFIucmF3LmxvdWRzb2Z0YWFjKTsKKyAgICAgICAgaWYgKHRlc3RzUnVuID09IDApIHsKKyAgICAgICAgICAgIE1lZGlhVXRpbHMuc2tpcFRlc3QoTE9HX1RBRywgIm5vIGRlY29kZXIgZm91bmQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgaW50IHRlc3RQb3NpdGlvbkF0RW5kKGludCByZXMpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBpZiAoIWxvYWRSZXNvdXJjZShyZXMpKSB7CisgICAgICAgICAgICBMb2cuaShMT0dfVEFHLCAidGVzdFBvc2l0aW9uQXRFbmQ6IE5vIGRlY29kZXIgZm91bmQgZm9yICIgKworICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKHJlcykgKworICAgICAgICAgICAgICAgICIgLS0tIHNraXBwaW5nLiIpOworICAgICAgICAgICAgcmV0dXJuIDA7IC8vIHNraXAKKyAgICAgICAgfQorICAgICAgICBBdWRpb0F0dHJpYnV0ZXMgYXR0cmlidXRlcyA9IG5ldyBBdWRpb0F0dHJpYnV0ZXMuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldEludGVybmFsTGVnYWN5U3RyZWFtVHlwZShBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICBtUGxheWVyLnNldEF1ZGlvQXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKKworICAgICAgICBtT25Db21wbGV0aW9uQ2FsbGVkLnJlc2V0KCk7CisgICAgICAgIE1lZGlhUGxheWVyMi5NZWRpYVBsYXllcjJFdmVudENhbGxiYWNrIGVjYiA9IG5ldyBNZWRpYVBsYXllcjIuTWVkaWFQbGF5ZXIyRXZlbnRDYWxsYmFjaygpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25JbmZvKE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkLCBpbnQgd2hhdCwgaW50IGV4dHJhKSB7CisgICAgICAgICAgICAgICAgaWYgKHdoYXQgPT0gTWVkaWFQbGF5ZXIyLk1FRElBX0lORk9fUFJFUEFSRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgbU9uUHJlcGFyZUNhbGxlZC5zaWduYWwoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gTWVkaWFQbGF5ZXIyLk1FRElBX0lORk9fUExBWUJBQ0tfQ09NUExFVEUpIHsKKyAgICAgICAgICAgICAgICAgICAgbU9uQ29tcGxldGlvbkNhbGxlZC5zaWduYWwoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25DYWxsQ29tcGxldGVkKE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkLCBpbnQgd2hhdCwgaW50IHN0YXR1cykgeworICAgICAgICAgICAgICAgIGlmICh3aGF0ID09IE1lZGlhUGxheWVyMi5DQUxMX0NPTVBMRVRFRF9QTEFZKSB7CisgICAgICAgICAgICAgICAgICAgIG1PblBsYXlDYWxsZWQuc2lnbmFsKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBtUGxheWVyLnNldE1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2sobUV4ZWN1dG9yLCBlY2IpOworCisgICAgICAgIG1PblByZXBhcmVDYWxsZWQucmVzZXQoKTsKKyAgICAgICAgbVBsYXllci5wcmVwYXJlKCk7CisgICAgICAgIG1PblByZXBhcmVDYWxsZWQud2FpdEZvclNpZ25hbCgpOworCisgICAgICAgIGxvbmcgZHVyYXRpb24gPSBtUGxheWVyLmdldER1cmF0aW9uKCk7CisgICAgICAgIGFzc2VydFRydWUoInJlc291cmNlIHRvbyBzaG9ydCIsIGR1cmF0aW9uID4gNjAwMCk7CisgICAgICAgIG1QbGF5ZXIuc2Vla1RvKGR1cmF0aW9uIC0gNTAwMCwgTWVkaWFQbGF5ZXIyLlNFRUtfUFJFVklPVVNfU1lOQyk7CisgICAgICAgIG1PblBsYXlDYWxsZWQucmVzZXQoKTsKKyAgICAgICAgbVBsYXllci5wbGF5KCk7CisgICAgICAgIG1PblBsYXlDYWxsZWQud2FpdEZvclNpZ25hbCgpOworICAgICAgICB3aGlsZSAobVBsYXllci5pc1BsYXlpbmcoKSkgeworICAgICAgICAgICAgTG9nLmkoIkBAQEAiLCAicG9zaXRpb246ICIgKyBtUGxheWVyLmdldEN1cnJlbnRQb3NpdGlvbigpKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcCg1MDApOworICAgICAgICB9CisgICAgICAgIExvZy5pKCJAQEBAIiwgImZpbmFsIHBvc2l0aW9uOiAiICsgbVBsYXllci5nZXRDdXJyZW50UG9zaXRpb24oKSk7CisgICAgICAgIGFzc2VydFRydWUobVBsYXllci5nZXRDdXJyZW50UG9zaXRpb24oKSA+IGR1cmF0aW9uIC0gMTAwMCk7CisgICAgICAgIG1QbGF5ZXIucmVzZXQoKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENhbGxiYWNrKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGlmIChJR05PUkVfVEVTVFMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBpbnQgbXA0RHVyYXRpb24gPSA4NDg0OworCisgICAgICAgIGlmICghY2hlY2tMb2FkUmVzb3VyY2UoUi5yYXcudGVzdHZpZGVvKSkgeworICAgICAgICAgICAgcmV0dXJuOyAvLyBza2lwOworICAgICAgICB9CisKKyAgICAgICAgbVBsYXllci5zZXREaXNwbGF5KGdldEFjdGl2aXR5KCkuZ2V0U3VyZmFjZUhvbGRlcigpKTsKKyAgICAgICAgbVBsYXllci5zZXRTY3JlZW5PbldoaWxlUGxheWluZyh0cnVlKTsKKworICAgICAgICBtT25Db21wbGV0aW9uQ2FsbGVkLnJlc2V0KCk7CisgICAgICAgIE1lZGlhUGxheWVyMi5NZWRpYVBsYXllcjJFdmVudENhbGxiYWNrIGVjYiA9IG5ldyBNZWRpYVBsYXllcjIuTWVkaWFQbGF5ZXIyRXZlbnRDYWxsYmFjaygpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25WaWRlb1NpemVDaGFuZ2VkKE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkLAorICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBtT25WaWRlb1NpemVDaGFuZ2VkQ2FsbGVkLnNpZ25hbCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsIGludCB3aGF0LCBpbnQgZXh0cmEpIHsKKyAgICAgICAgICAgICAgICBtT25FcnJvckNhbGxlZC5zaWduYWwoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkluZm8oTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsIGludCB3aGF0LCBpbnQgZXh0cmEpIHsKKyAgICAgICAgICAgICAgICBtT25JbmZvQ2FsbGVkLnNpZ25hbCgpOworCisgICAgICAgICAgICAgICAgaWYgKHdoYXQgPT0gTWVkaWFQbGF5ZXIyLk1FRElBX0lORk9fUFJFUEFSRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgbU9uUHJlcGFyZUNhbGxlZC5zaWduYWwoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gTWVkaWFQbGF5ZXIyLk1FRElBX0lORk9fUExBWUJBQ0tfQ09NUExFVEUpIHsKKyAgICAgICAgICAgICAgICAgICAgbU9uQ29tcGxldGlvbkNhbGxlZC5zaWduYWwoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25DYWxsQ29tcGxldGVkKE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkLCBpbnQgd2hhdCwgaW50IHN0YXR1cykgeworICAgICAgICAgICAgICAgIGlmICh3aGF0ID09IE1lZGlhUGxheWVyMi5DQUxMX0NPTVBMRVRFRF9TRUVLX1RPKSB7CisgICAgICAgICAgICAgICAgICAgIG1PblNlZWtDb21wbGV0ZUNhbGxlZC5zaWduYWwoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gTWVkaWFQbGF5ZXIyLkNBTExfQ09NUExFVEVEX1BMQVkpIHsKKyAgICAgICAgICAgICAgICAgICAgbU9uUGxheUNhbGxlZC5zaWduYWwoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHN5bmNocm9uaXplZCAobUV2ZW50Q2JMb2NrKSB7CisgICAgICAgICAgICBtRXZlbnRDYWxsYmFja3MuYWRkKGVjYik7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRGYWxzZShtT25QcmVwYXJlQ2FsbGVkLmlzU2lnbmFsbGVkKCkpOworICAgICAgICBhc3NlcnRGYWxzZShtT25WaWRlb1NpemVDaGFuZ2VkQ2FsbGVkLmlzU2lnbmFsbGVkKCkpOworICAgICAgICBtUGxheWVyLnByZXBhcmUoKTsKKyAgICAgICAgbU9uUHJlcGFyZUNhbGxlZC53YWl0Rm9yU2lnbmFsKCk7CisgICAgICAgIG1PblZpZGVvU2l6ZUNoYW5nZWRDYWxsZWQud2FpdEZvclNpZ25hbCgpOworCisgICAgICAgIG1PblNlZWtDb21wbGV0ZUNhbGxlZC5yZXNldCgpOworICAgICAgICBtUGxheWVyLnNlZWtUbyhtcDREdXJhdGlvbiA+PiAxLCBNZWRpYVBsYXllcjIuU0VFS19QUkVWSU9VU19TWU5DKTsKKyAgICAgICAgbU9uU2Vla0NvbXBsZXRlQ2FsbGVkLndhaXRGb3JTaWduYWwoKTsKKworICAgICAgICBhc3NlcnRGYWxzZShtT25Db21wbGV0aW9uQ2FsbGVkLmlzU2lnbmFsbGVkKCkpOworICAgICAgICBtUGxheWVyLnBsYXkoKTsKKyAgICAgICAgbU9uUGxheUNhbGxlZC53YWl0Rm9yU2lnbmFsKCk7CisgICAgICAgIHdoaWxlKG1QbGF5ZXIuaXNQbGF5aW5nKCkpIHsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTTEVFUF9USU1FKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRGYWxzZShtUGxheWVyLmlzUGxheWluZygpKTsKKyAgICAgICAgbU9uQ29tcGxldGlvbkNhbGxlZC53YWl0Rm9yU2lnbmFsKCk7CisgICAgICAgIGFzc2VydEZhbHNlKG1PbkVycm9yQ2FsbGVkLmlzU2lnbmFsbGVkKCkpOworICAgICAgICBtUGxheWVyLnJlc2V0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlY29yZEFuZFBsYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKElHTk9SRV9URVNUUykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICghaGFzTWljcm9waG9uZSgpKSB7CisgICAgICAgICAgICBNZWRpYVV0aWxzLnNraXBUZXN0KExPR19UQUcsICJubyBtaWNyb3Bob25lIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFNZWRpYVV0aWxzLmNoZWNrRGVjb2RlcihNZWRpYUZvcm1hdC5NSU1FVFlQRV9BVURJT19BTVJfTkIpCisgICAgICAgICAgICAgICAgfHwgIU1lZGlhVXRpbHMuY2hlY2tFbmNvZGVyKE1lZGlhRm9ybWF0Lk1JTUVUWVBFX0FVRElPX0FNUl9OQikpIHsKKyAgICAgICAgICAgIHJldHVybjsgLy8gc2tpcAorICAgICAgICB9CisgICAgICAgIEZpbGUgb3V0cHV0RmlsZSA9IG5ldyBGaWxlKEVudmlyb25tZW50LmdldEV4dGVybmFsU3RvcmFnZURpcmVjdG9yeSgpLAorICAgICAgICAgICAgICAgICJyZWNvcmRfYW5kX3BsYXkuM2dwIik7CisgICAgICAgIFN0cmluZyBvdXRwdXRGaWxlTG9jYXRpb24gPSBvdXRwdXRGaWxlLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVjb3JkTWVkaWEob3V0cHV0RmlsZUxvY2F0aW9uKTsKKworICAgICAgICAgICAgVXJpIHVyaSA9IFVyaS5wYXJzZShvdXRwdXRGaWxlTG9jYXRpb24pOworICAgICAgICAgICAgTWVkaWFQbGF5ZXIyIG1wID0gTWVkaWFQbGF5ZXIyLmNyZWF0ZSgpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtcC5zZXREYXRhU291cmNlKG5ldyBEYXRhU291cmNlRGVzYy5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXREYXRhU291cmNlKG1Db250ZXh0LCB1cmkpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgICAgICAgICAgICAgbXAucHJlcGFyZSgpOworICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChTTEVFUF9USU1FKTsKKyAgICAgICAgICAgICAgICBwbGF5QW5kU3RvcChtcCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIG1wLmNsb3NlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbXAgPSBjcmVhdGVNZWRpYVBsYXllcjIobUNvbnRleHQsIHVyaSk7CisgICAgICAgICAgICAgICAgcGxheUFuZFN0b3AobXApOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpZiAobXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtcC5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtcCA9IGNyZWF0ZU1lZGlhUGxheWVyMihtQ29udGV4dCwgdXJpLCBnZXRBY3Rpdml0eSgpLmdldFN1cmZhY2VIb2xkZXIoKSk7CisgICAgICAgICAgICAgICAgcGxheUFuZFN0b3AobXApOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpZiAobXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtcC5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIG91dHB1dEZpbGUuZGVsZXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcGxheUFuZFN0b3AoTWVkaWFQbGF5ZXIyIG1wKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbXAucGxheSgpOworICAgICAgICBUaHJlYWQuc2xlZXAoU0xFRVBfVElNRSk7CisgICAgICAgIG1wLnJlc2V0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlY29yZE1lZGlhKFN0cmluZyBvdXRwdXRGaWxlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTWVkaWFSZWNvcmRlciBtciA9IG5ldyBNZWRpYVJlY29yZGVyKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtci5zZXRBdWRpb1NvdXJjZShNZWRpYVJlY29yZGVyLkF1ZGlvU291cmNlLk1JQyk7CisgICAgICAgICAgICBtci5zZXRPdXRwdXRGb3JtYXQoTWVkaWFSZWNvcmRlci5PdXRwdXRGb3JtYXQuVEhSRUVfR1BQKTsKKyAgICAgICAgICAgIG1yLnNldEF1ZGlvRW5jb2RlcihNZWRpYVJlY29yZGVyLkF1ZGlvRW5jb2Rlci5BTVJfTkIpOworICAgICAgICAgICAgbXIuc2V0T3V0cHV0RmlsZShvdXRwdXRGaWxlKTsKKworICAgICAgICAgICAgbXIucHJlcGFyZSgpOworICAgICAgICAgICAgbXIuc3RhcnQoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTTEVFUF9USU1FKTsKKyAgICAgICAgICAgIG1yLnN0b3AoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIG1yLnJlbGVhc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBoYXNNaWNyb3Bob25lKCkgeworICAgICAgICByZXR1cm4gZ2V0QWN0aXZpdHkoKS5nZXRQYWNrYWdlTWFuYWdlcigpLmhhc1N5c3RlbUZlYXR1cmUoCisgICAgICAgICAgICAgICAgUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9NSUNST1BIT05FKTsKKyAgICB9CisKKyAgICAvLyBTbW9rZSB0ZXN0IHBsYXliYWNrIGZyb20gYSBNZWRpYTJEYXRhU291cmNlLgorICAgIHB1YmxpYyB2b2lkIHRlc3RQbGF5YmFja0Zyb21BTWVkaWEyRGF0YVNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoSUdOT1JFX1RFU1RTKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgaW50IHJlc2lkID0gUi5yYXcudmlkZW9fNDgweDM2MF9tcDRfaDI2NF8xMzUwa2Jwc18zMGZwc19hYWNfc3RlcmVvXzE5MmticHNfNDQxMDBoejsKKyAgICAgICAgZmluYWwgaW50IGR1cmF0aW9uID0gMTAwMDA7CisKKyAgICAgICAgaWYgKCFNZWRpYVV0aWxzLmhhc0NvZGVjc0ZvclJlc291cmNlKG1Db250ZXh0LCByZXNpZCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFRlc3RNZWRpYTJEYXRhU291cmNlIGRhdGFTb3VyY2UgPQorICAgICAgICAgICAgICAgIFRlc3RNZWRpYTJEYXRhU291cmNlLmZyb21Bc3NldEZkKG1SZXNvdXJjZXMub3BlblJhd1Jlc291cmNlRmQocmVzaWQpKTsKKyAgICAgICAgLy8gVGVzdCByZXR1cm5pbmcgLTEgZnJvbSBnZXRTaXplKCkgdG8gaW5kaWNhdGUgdW5rbm93biBzaXplLgorICAgICAgICBkYXRhU291cmNlLnJldHVybkZyb21HZXRTaXplKC0xKTsKKyAgICAgICAgbVBsYXllci5zZXREYXRhU291cmNlKG5ldyBEYXRhU291cmNlRGVzYy5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0RGF0YVNvdXJjZShkYXRhU291cmNlKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgcGxheUxvYWRlZFZpZGVvKG51bGwsIG51bGwsIC0xKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtUGxheWVyLmlzUGxheWluZygpKTsKKworICAgICAgICAvLyBUZXN0IHBhdXNlIGFuZCByZXN0YXJ0LgorICAgICAgICBtUGxheWVyLnBhdXNlKCk7CisgICAgICAgIFRocmVhZC5zbGVlcChTTEVFUF9USU1FKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobVBsYXllci5pc1BsYXlpbmcoKSk7CisKKyAgICAgICAgTWVkaWFQbGF5ZXIyLk1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2sgZWNiID0gbmV3IE1lZGlhUGxheWVyMi5NZWRpYVBsYXllcjJFdmVudENhbGxiYWNrKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkluZm8oTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsIGludCB3aGF0LCBpbnQgZXh0cmEpIHsKKyAgICAgICAgICAgICAgICBpZiAod2hhdCA9PSBNZWRpYVBsYXllcjIuTUVESUFfSU5GT19QUkVQQVJFRCkgeworICAgICAgICAgICAgICAgICAgICBtT25QcmVwYXJlQ2FsbGVkLnNpZ25hbCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNhbGxDb21wbGV0ZWQoTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsIGludCB3aGF0LCBpbnQgc3RhdHVzKSB7CisgICAgICAgICAgICAgICAgaWYgKHdoYXQgPT0gTWVkaWFQbGF5ZXIyLkNBTExfQ09NUExFVEVEX1BMQVkpIHsKKyAgICAgICAgICAgICAgICAgICAgbU9uUGxheUNhbGxlZC5zaWduYWwoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIG1QbGF5ZXIuc2V0TWVkaWFQbGF5ZXIyRXZlbnRDYWxsYmFjayhtRXhlY3V0b3IsIGVjYik7CisKKyAgICAgICAgbU9uUGxheUNhbGxlZC5yZXNldCgpOworICAgICAgICBtUGxheWVyLnBsYXkoKTsKKyAgICAgICAgbU9uUGxheUNhbGxlZC53YWl0Rm9yU2lnbmFsKCk7CisgICAgICAgIGFzc2VydFRydWUobVBsYXllci5pc1BsYXlpbmcoKSk7CisKKyAgICAgICAgLy8gVGVzdCByZXNldC4KKyAgICAgICAgbVBsYXllci5yZXNldCgpOworICAgICAgICBtUGxheWVyLnNldERhdGFTb3VyY2UobmV3IERhdGFTb3VyY2VEZXNjLkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXREYXRhU291cmNlKGRhdGFTb3VyY2UpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIG1QbGF5ZXIuc2V0TWVkaWFQbGF5ZXIyRXZlbnRDYWxsYmFjayhtRXhlY3V0b3IsIGVjYik7CisKKyAgICAgICAgbU9uUHJlcGFyZUNhbGxlZC5yZXNldCgpOworICAgICAgICBtUGxheWVyLnByZXBhcmUoKTsKKyAgICAgICAgbU9uUHJlcGFyZUNhbGxlZC53YWl0Rm9yU2lnbmFsKCk7CisKKyAgICAgICAgbU9uUGxheUNhbGxlZC5yZXNldCgpOworICAgICAgICBtUGxheWVyLnBsYXkoKTsKKyAgICAgICAgbU9uUGxheUNhbGxlZC53YWl0Rm9yU2lnbmFsKCk7CisgICAgICAgIGFzc2VydFRydWUobVBsYXllci5pc1BsYXlpbmcoKSk7CisKKyAgICAgICAgLy8gVGVzdCBzZWVrLiBOb3RlOiB0aGUgc2VlayBwb3NpdGlvbiBpcyBjYWNoZWQgYW5kIHJldHVybmVkIGFzIHRoZQorICAgICAgICAvLyBjdXJyZW50IHBvc2l0aW9uIHNvIHRoZXJlJ3Mgbm8gcG9pbnQgaW4gY29tcGFyaW5nIHRoZW0uCisgICAgICAgIG1QbGF5ZXIuc2Vla1RvKGR1cmF0aW9uIC0gU0xFRVBfVElNRSwgTWVkaWFQbGF5ZXIyLlNFRUtfUFJFVklPVVNfU1lOQyk7CisgICAgICAgIHdoaWxlIChtUGxheWVyLmlzUGxheWluZygpKSB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0xFRVBfVElNRSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TnVsbE1lZGlhMkRhdGFTb3VyY2VJc1JlamVjdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChJR05PUkVfVEVTVFMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBNZWRpYVBsYXllcjIuTWVkaWFQbGF5ZXIyRXZlbnRDYWxsYmFjayBlY2IgPSBuZXcgTWVkaWFQbGF5ZXIyLk1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2soKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2FsbENvbXBsZXRlZChNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCwgaW50IHdoYXQsIGludCBzdGF0dXMpIHsKKyAgICAgICAgICAgICAgICBpZiAod2hhdCA9PSBNZWRpYVBsYXllcjIuQ0FMTF9DT01QTEVURURfU0VUX0RBVEFfU09VUkNFKSB7CisgICAgICAgICAgICAgICAgICAgIG1DYWxsU3RhdHVzID0gc3RhdHVzOworICAgICAgICAgICAgICAgICAgICBtT25QbGF5Q2FsbGVkLnNpZ25hbCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgbVBsYXllci5zZXRNZWRpYVBsYXllcjJFdmVudENhbGxiYWNrKG1FeGVjdXRvciwgZWNiKTsKKworICAgICAgICBtQ2FsbFN0YXR1cyA9IE1lZGlhUGxheWVyMi5DQUxMX1NUQVRVU19OT19FUlJPUjsKKyAgICAgICAgbVBsYXllci5zZXREYXRhU291cmNlKChEYXRhU291cmNlRGVzYyludWxsKTsKKyAgICAgICAgbU9uUGxheUNhbGxlZC53YWl0Rm9yU2lnbmFsKCk7CisgICAgICAgIGFzc2VydFRydWUobUNhbGxTdGF0dXMgIT0gTWVkaWFQbGF5ZXIyLkNBTExfU1RBVFVTX05PX0VSUk9SKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWVkaWEyRGF0YVNvdXJjZUlzQ2xvc2VkT25SZXNldCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoSUdOT1JFX1RFU1RTKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgTWVkaWFQbGF5ZXIyLk1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2sgZWNiID0gbmV3IE1lZGlhUGxheWVyMi5NZWRpYVBsYXllcjJFdmVudENhbGxiYWNrKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNhbGxDb21wbGV0ZWQoTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsIGludCB3aGF0LCBpbnQgc3RhdHVzKSB7CisgICAgICAgICAgICAgICAgaWYgKHdoYXQgPT0gTWVkaWFQbGF5ZXIyLkNBTExfQ09NUExFVEVEX1NFVF9EQVRBX1NPVVJDRSkgeworICAgICAgICAgICAgICAgICAgICBtQ2FsbFN0YXR1cyA9IHN0YXR1czsKKyAgICAgICAgICAgICAgICAgICAgbU9uUGxheUNhbGxlZC5zaWduYWwoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIG1QbGF5ZXIuc2V0TWVkaWFQbGF5ZXIyRXZlbnRDYWxsYmFjayhtRXhlY3V0b3IsIGVjYik7CisKKyAgICAgICAgVGVzdE1lZGlhMkRhdGFTb3VyY2UgZGF0YVNvdXJjZSA9IG5ldyBUZXN0TWVkaWEyRGF0YVNvdXJjZShuZXcgYnl0ZVswXSk7CisgICAgICAgIG1QbGF5ZXIuc2V0RGF0YVNvdXJjZShuZXcgRGF0YVNvdXJjZURlc2MuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldERhdGFTb3VyY2UoZGF0YVNvdXJjZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgICAgIG1PblBsYXlDYWxsZWQud2FpdEZvclNpZ25hbCgpOworICAgICAgICBtUGxheWVyLnJlc2V0KCk7CisgICAgICAgIGFzc2VydFRydWUoZGF0YVNvdXJjZS5pc0Nsb3NlZCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGxheWJhY2tGYWlsc0lmTWVkaWEyRGF0YVNvdXJjZVRocm93cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoSUdOT1JFX1RFU1RTKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgaW50IHJlc2lkID0gUi5yYXcudmlkZW9fNDgweDM2MF9tcDRfaDI2NF8xMzUwa2Jwc18zMGZwc19hYWNfc3RlcmVvXzE5MmticHNfNDQxMDBoejsKKyAgICAgICAgaWYgKCFNZWRpYVV0aWxzLmhhc0NvZGVjc0ZvclJlc291cmNlKG1Db250ZXh0LCByZXNpZCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHNldE9uRXJyb3JMaXN0ZW5lcigpOworICAgICAgICBUZXN0TWVkaWEyRGF0YVNvdXJjZSBkYXRhU291cmNlID0KKyAgICAgICAgICAgICAgICBUZXN0TWVkaWEyRGF0YVNvdXJjZS5mcm9tQXNzZXRGZChtUmVzb3VyY2VzLm9wZW5SYXdSZXNvdXJjZUZkKHJlc2lkKSk7CisgICAgICAgIG1QbGF5ZXIuc2V0RGF0YVNvdXJjZShuZXcgRGF0YVNvdXJjZURlc2MuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldERhdGFTb3VyY2UoZGF0YVNvdXJjZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgTWVkaWFQbGF5ZXIyLk1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2sgZWNiID0gbmV3IE1lZGlhUGxheWVyMi5NZWRpYVBsYXllcjJFdmVudENhbGxiYWNrKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkluZm8oTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsIGludCB3aGF0LCBpbnQgZXh0cmEpIHsKKyAgICAgICAgICAgICAgICBpZiAod2hhdCA9PSBNZWRpYVBsYXllcjIuTUVESUFfSU5GT19QUkVQQVJFRCkgeworICAgICAgICAgICAgICAgICAgICBtT25QcmVwYXJlQ2FsbGVkLnNpZ25hbCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgc3luY2hyb25pemVkIChtRXZlbnRDYkxvY2spIHsKKyAgICAgICAgICAgIG1FdmVudENhbGxiYWNrcy5hZGQoZWNiKTsKKyAgICAgICAgfQorCisgICAgICAgIG1PblByZXBhcmVDYWxsZWQucmVzZXQoKTsKKyAgICAgICAgbVBsYXllci5wcmVwYXJlKCk7CisgICAgICAgIG1PblByZXBhcmVDYWxsZWQud2FpdEZvclNpZ25hbCgpOworCisgICAgICAgIGRhdGFTb3VyY2UudGhyb3dGcm9tUmVhZEF0KCk7CisgICAgICAgIG1QbGF5ZXIucGxheSgpOworICAgICAgICBhc3NlcnRUcnVlKG1PbkVycm9yQ2FsbGVkLndhaXRGb3JTaWduYWwoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFBsYXliYWNrRmFpbHNJZk1lZGlhMkRhdGFTb3VyY2VSZXR1cm5zQW5FcnJvcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoSUdOT1JFX1RFU1RTKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgaW50IHJlc2lkID0gUi5yYXcudmlkZW9fNDgweDM2MF9tcDRfaDI2NF8xMzUwa2Jwc18zMGZwc19hYWNfc3RlcmVvXzE5MmticHNfNDQxMDBoejsKKyAgICAgICAgaWYgKCFNZWRpYVV0aWxzLmhhc0NvZGVjc0ZvclJlc291cmNlKG1Db250ZXh0LCByZXNpZCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFRlc3RNZWRpYTJEYXRhU291cmNlIGRhdGFTb3VyY2UgPQorICAgICAgICAgICAgICAgIFRlc3RNZWRpYTJEYXRhU291cmNlLmZyb21Bc3NldEZkKG1SZXNvdXJjZXMub3BlblJhd1Jlc291cmNlRmQocmVzaWQpKTsKKyAgICAgICAgbVBsYXllci5zZXREYXRhU291cmNlKG5ldyBEYXRhU291cmNlRGVzYy5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0RGF0YVNvdXJjZShkYXRhU291cmNlKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBzZXRPbkVycm9yTGlzdGVuZXIoKTsKKyAgICAgICAgTWVkaWFQbGF5ZXIyLk1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2sgZWNiID0gbmV3IE1lZGlhUGxheWVyMi5NZWRpYVBsYXllcjJFdmVudENhbGxiYWNrKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkluZm8oTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsIGludCB3aGF0LCBpbnQgZXh0cmEpIHsKKyAgICAgICAgICAgICAgICBpZiAod2hhdCA9PSBNZWRpYVBsYXllcjIuTUVESUFfSU5GT19QUkVQQVJFRCkgeworICAgICAgICAgICAgICAgICAgICBtT25QcmVwYXJlQ2FsbGVkLnNpZ25hbCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgc3luY2hyb25pemVkIChtRXZlbnRDYkxvY2spIHsKKyAgICAgICAgICAgIG1FdmVudENhbGxiYWNrcy5hZGQoZWNiKTsKKyAgICAgICAgfQorCisgICAgICAgIG1PblByZXBhcmVDYWxsZWQucmVzZXQoKTsKKyAgICAgICAgbVBsYXllci5wcmVwYXJlKCk7CisgICAgICAgIG1PblByZXBhcmVDYWxsZWQud2FpdEZvclNpZ25hbCgpOworCisgICAgICAgIGRhdGFTb3VyY2UucmV0dXJuRnJvbVJlYWRBdCgtMik7CisgICAgICAgIG1QbGF5ZXIucGxheSgpOworICAgICAgICBhc3NlcnRUcnVlKG1PbkVycm9yQ2FsbGVkLndhaXRGb3JTaWduYWwoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL01lZGlhUGxheWVyMlRlc3RCYXNlLmphdmEgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvTWVkaWFQbGF5ZXIyVGVzdEJhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTc1ZDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL01lZGlhUGxheWVyMlRlc3RCYXNlLmphdmEKQEAgLTAsMCArMSw1OTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQubWVkaWEuY3RzOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRGaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQXR0cmlidXRlczsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkRhdGFTb3VyY2VEZXNjOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFUaW1lc3RhbXA7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5UaW1lZE1ldGFEYXRhOworaW1wb3J0IGFuZHJvaWQubWVkaWEuVGltZWRUZXh0OworaW1wb3J0IGFuZHJvaWQubWVkaWEuY3RzLlRlc3RVdGlscy5Nb25pdG9yOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLlBlcnNpc3RhYmxlQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudGVzdC5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlcjsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuTWVkaWFVdGlsczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuSHR0cENvb2tpZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLyoqCisgKiBCYXNlIGNsYXNzIGZvciB0ZXN0cyB3aGljaCB1c2UgTWVkaWFQbGF5ZXIyIHRvIHBsYXkgYXVkaW8gb3IgdmlkZW8uCisgKi8KK3B1YmxpYyBjbGFzcyBNZWRpYVBsYXllcjJUZXN0QmFzZSBleHRlbmRzIEFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyPE1lZGlhU3R1YkFjdGl2aXR5PiB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoTWVkaWFQbGF5ZXIyVGVzdEJhc2UuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFNMRUVQX1RJTUUgPSAxMDAwOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IExPTkdfU0xFRVBfVElNRSA9IDYwMDA7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgU1RSRUFNX1JFVFJJRVMgPSAyMDsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gc1VzZVNjYWxlVG9GaXRNb2RlID0gZmFsc2U7CisKKyAgICBwcm90ZWN0ZWQgTW9uaXRvciBtT25WaWRlb1NpemVDaGFuZ2VkQ2FsbGVkID0gbmV3IE1vbml0b3IoKTsKKyAgICBwcm90ZWN0ZWQgTW9uaXRvciBtT25WaWRlb1JlbmRlcmluZ1N0YXJ0Q2FsbGVkID0gbmV3IE1vbml0b3IoKTsKKyAgICBwcm90ZWN0ZWQgTW9uaXRvciBtT25CdWZmZXJpbmdVcGRhdGVDYWxsZWQgPSBuZXcgTW9uaXRvcigpOworICAgIHByb3RlY3RlZCBNb25pdG9yIG1PblByZXBhcmVDYWxsZWQgPSBuZXcgTW9uaXRvcigpOworICAgIHByb3RlY3RlZCBNb25pdG9yIG1PblBsYXlDYWxsZWQgPSBuZXcgTW9uaXRvcigpOworICAgIHByb3RlY3RlZCBNb25pdG9yIG1PbkRlc2VsZWN0VHJhY2tDYWxsZWQgPSBuZXcgTW9uaXRvcigpOworICAgIHByb3RlY3RlZCBNb25pdG9yIG1PblNlZWtDb21wbGV0ZUNhbGxlZCA9IG5ldyBNb25pdG9yKCk7CisgICAgcHJvdGVjdGVkIE1vbml0b3IgbU9uQ29tcGxldGlvbkNhbGxlZCA9IG5ldyBNb25pdG9yKCk7CisgICAgcHJvdGVjdGVkIE1vbml0b3IgbU9uSW5mb0NhbGxlZCA9IG5ldyBNb25pdG9yKCk7CisgICAgcHJvdGVjdGVkIE1vbml0b3IgbU9uRXJyb3JDYWxsZWQgPSBuZXcgTW9uaXRvcigpOworICAgIHByb3RlY3RlZCBpbnQgbUNhbGxTdGF0dXM7CisKKyAgICBwcm90ZWN0ZWQgQ29udGV4dCBtQ29udGV4dDsKKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VzIG1SZXNvdXJjZXM7CisKKyAgICBwcm90ZWN0ZWQgRXhlY3V0b3JTZXJ2aWNlIG1FeGVjdXRvcjsKKworICAgIHByb3RlY3RlZCBNZWRpYVBsYXllcjIgbVBsYXllciA9IG51bGw7CisgICAgcHJvdGVjdGVkIE1lZGlhUGxheWVyMiBtUGxheWVyMiA9IG51bGw7CisgICAgcHJvdGVjdGVkIE1lZGlhU3R1YkFjdGl2aXR5IG1BY3Rpdml0eTsKKworICAgIHByb3RlY3RlZCBmaW5hbCBPYmplY3QgbUV2ZW50Q2JMb2NrID0gbmV3IE9iamVjdCgpOworICAgIHByb3RlY3RlZCBMaXN0PE1lZGlhUGxheWVyMi5NZWRpYVBsYXllcjJFdmVudENhbGxiYWNrPiBtRXZlbnRDYWxsYmFja3MgPQorICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxNZWRpYVBsYXllcjIuTWVkaWFQbGF5ZXIyRXZlbnRDYWxsYmFjaz4oKTsKKyAgICBwcm90ZWN0ZWQgZmluYWwgT2JqZWN0IG1FdmVudENiTG9jazIgPSBuZXcgT2JqZWN0KCk7CisgICAgcHJvdGVjdGVkIExpc3Q8TWVkaWFQbGF5ZXIyLk1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2s+IG1FdmVudENhbGxiYWNrczIgPQorICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxNZWRpYVBsYXllcjIuTWVkaWFQbGF5ZXIyRXZlbnRDYWxsYmFjaz4oKTsKKworICAgIC8vIGNvbnZlbmllbmNlIGZ1bmN0aW9ucyB0byBjcmVhdGUgTWVkaWFQbGF5ZXIyCisgICAgcHJvdGVjdGVkIHN0YXRpYyBNZWRpYVBsYXllcjIgY3JlYXRlTWVkaWFQbGF5ZXIyKENvbnRleHQgY29udGV4dCwgVXJpIHVyaSkgeworICAgICAgICByZXR1cm4gY3JlYXRlTWVkaWFQbGF5ZXIyKGNvbnRleHQsIHVyaSwgbnVsbCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBNZWRpYVBsYXllcjIgY3JlYXRlTWVkaWFQbGF5ZXIyKENvbnRleHQgY29udGV4dCwgVXJpIHVyaSwKKyAgICAgICAgICAgIFN1cmZhY2VIb2xkZXIgaG9sZGVyKSB7CisgICAgICAgIEF1ZGlvTWFuYWdlciBhbSA9IChBdWRpb01hbmFnZXIpY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQVVESU9fU0VSVklDRSk7CisgICAgICAgIGludCBzID0gYW0uZ2VuZXJhdGVBdWRpb1Nlc3Npb25JZCgpOworICAgICAgICByZXR1cm4gY3JlYXRlTWVkaWFQbGF5ZXIyKGNvbnRleHQsIHVyaSwgaG9sZGVyLCBudWxsLCBzID4gMCA/IHMgOiAwKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIE1lZGlhUGxheWVyMiBjcmVhdGVNZWRpYVBsYXllcjIoQ29udGV4dCBjb250ZXh0LCBVcmkgdXJpLCBTdXJmYWNlSG9sZGVyIGhvbGRlciwKKyAgICAgICAgICAgIEF1ZGlvQXR0cmlidXRlcyBhdWRpb0F0dHJpYnV0ZXMsIGludCBhdWRpb1Nlc3Npb25JZCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgTWVkaWFQbGF5ZXIyIG1wID0gTWVkaWFQbGF5ZXIyLmNyZWF0ZSgpOworICAgICAgICAgICAgZmluYWwgQXVkaW9BdHRyaWJ1dGVzIGFhID0gYXVkaW9BdHRyaWJ1dGVzICE9IG51bGwgPyBhdWRpb0F0dHJpYnV0ZXMgOgorICAgICAgICAgICAgICAgICAgICBuZXcgQXVkaW9BdHRyaWJ1dGVzLkJ1aWxkZXIoKS5idWlsZCgpOworICAgICAgICAgICAgbXAuc2V0QXVkaW9BdHRyaWJ1dGVzKGFhKTsKKyAgICAgICAgICAgIG1wLnNldEF1ZGlvU2Vzc2lvbklkKGF1ZGlvU2Vzc2lvbklkKTsKKyAgICAgICAgICAgIG1wLnNldERhdGFTb3VyY2UobmV3IERhdGFTb3VyY2VEZXNjLkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAuc2V0RGF0YVNvdXJjZShjb250ZXh0LCB1cmkpCisgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgICAgIGlmIChob2xkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1wLnNldERpc3BsYXkoaG9sZGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE1vbml0b3Igb25QcmVwYXJlQ2FsbGVkID0gbmV3IE1vbml0b3IoKTsKKyAgICAgICAgICAgIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvciA9IEV4ZWN1dG9ycy5uZXdGaXhlZFRocmVhZFBvb2woMSk7CisgICAgICAgICAgICBNZWRpYVBsYXllcjIuTWVkaWFQbGF5ZXIyRXZlbnRDYWxsYmFjayBlY2IgPQorICAgICAgICAgICAgICAgIG5ldyBNZWRpYVBsYXllcjIuTWVkaWFQbGF5ZXIyRXZlbnRDYWxsYmFjaygpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uSW5mbyhNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCwgaW50IHdoYXQsIGludCBleHRyYSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdoYXQgPT0gTWVkaWFQbGF5ZXIyLk1FRElBX0lORk9fUFJFUEFSRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblByZXBhcmVDYWxsZWQuc2lnbmFsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgbXAuc2V0TWVkaWFQbGF5ZXIyRXZlbnRDYWxsYmFjayhleGVjdXRvciwgZWNiKTsKKyAgICAgICAgICAgIG1wLnByZXBhcmUoKTsKKyAgICAgICAgICAgIG9uUHJlcGFyZUNhbGxlZC53YWl0Rm9yU2lnbmFsKCk7CisgICAgICAgICAgICBtcC5jbGVhck1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2soKTsKKyAgICAgICAgICAgIGV4ZWN1dG9yLnNodXRkb3duKCk7CisgICAgICAgICAgICByZXR1cm4gbXA7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgTE9HLndhcm5pbmcoImNyZWF0ZSBmYWlsZWQ6IiArIGV4KTsKKyAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgTE9HLndhcm5pbmcoImNyZWF0ZSBmYWlsZWQ6IiArIGV4KTsKKyAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgTE9HLndhcm5pbmcoImNyZWF0ZSBmYWlsZWQ6IiArIGV4KTsKKyAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgTWVkaWFQbGF5ZXIyIGNyZWF0ZU1lZGlhUGxheWVyMihDb250ZXh0IGNvbnRleHQsIGludCByZXNpZCkgeworICAgICAgICBBdWRpb01hbmFnZXIgYW0gPSAoQXVkaW9NYW5hZ2VyKWNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkFVRElPX1NFUlZJQ0UpOworICAgICAgICBpbnQgcyA9IGFtLmdlbmVyYXRlQXVkaW9TZXNzaW9uSWQoKTsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZU1lZGlhUGxheWVyMihjb250ZXh0LCByZXNpZCwgbnVsbCwgcyA+IDAgPyBzIDogMCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBNZWRpYVBsYXllcjIgY3JlYXRlTWVkaWFQbGF5ZXIyKENvbnRleHQgY29udGV4dCwgaW50IHJlc2lkLAorICAgICAgICAgICAgQXVkaW9BdHRyaWJ1dGVzIGF1ZGlvQXR0cmlidXRlcywgaW50IGF1ZGlvU2Vzc2lvbklkKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBBc3NldEZpbGVEZXNjcmlwdG9yIGFmZCA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkub3BlblJhd1Jlc291cmNlRmQocmVzaWQpOworICAgICAgICAgICAgaWYgKGFmZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE1lZGlhUGxheWVyMiBtcCA9IE1lZGlhUGxheWVyMi5jcmVhdGUoKTsKKworICAgICAgICAgICAgZmluYWwgQXVkaW9BdHRyaWJ1dGVzIGFhID0gYXVkaW9BdHRyaWJ1dGVzICE9IG51bGwgPyBhdWRpb0F0dHJpYnV0ZXMgOgorICAgICAgICAgICAgICAgICAgICBuZXcgQXVkaW9BdHRyaWJ1dGVzLkJ1aWxkZXIoKS5idWlsZCgpOworICAgICAgICAgICAgbXAuc2V0QXVkaW9BdHRyaWJ1dGVzKGFhKTsKKyAgICAgICAgICAgIG1wLnNldEF1ZGlvU2Vzc2lvbklkKGF1ZGlvU2Vzc2lvbklkKTsKKworICAgICAgICAgICAgbXAuc2V0RGF0YVNvdXJjZShuZXcgRGF0YVNvdXJjZURlc2MuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgIC5zZXREYXRhU291cmNlKGFmZC5nZXRGaWxlRGVzY3JpcHRvcigpLCBhZmQuZ2V0U3RhcnRPZmZzZXQoKSwgYWZkLmdldExlbmd0aCgpKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgICAgIE1vbml0b3Igb25QcmVwYXJlQ2FsbGVkID0gbmV3IE1vbml0b3IoKTsKKyAgICAgICAgICAgIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvciA9IEV4ZWN1dG9ycy5uZXdGaXhlZFRocmVhZFBvb2woMSk7CisgICAgICAgICAgICBNZWRpYVBsYXllcjIuTWVkaWFQbGF5ZXIyRXZlbnRDYWxsYmFjayBlY2IgPQorICAgICAgICAgICAgICAgIG5ldyBNZWRpYVBsYXllcjIuTWVkaWFQbGF5ZXIyRXZlbnRDYWxsYmFjaygpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uSW5mbyhNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCwgaW50IHdoYXQsIGludCBleHRyYSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdoYXQgPT0gTWVkaWFQbGF5ZXIyLk1FRElBX0lORk9fUFJFUEFSRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblByZXBhcmVDYWxsZWQuc2lnbmFsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgbXAuc2V0TWVkaWFQbGF5ZXIyRXZlbnRDYWxsYmFjayhleGVjdXRvciwgZWNiKTsKKyAgICAgICAgICAgIG1wLnByZXBhcmUoKTsKKyAgICAgICAgICAgIG9uUHJlcGFyZUNhbGxlZC53YWl0Rm9yU2lnbmFsKCk7CisgICAgICAgICAgICBtcC5jbGVhck1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2soKTsKKyAgICAgICAgICAgIGFmZC5jbG9zZSgpOworICAgICAgICAgICAgZXhlY3V0b3Iuc2h1dGRvd24oKTsKKyAgICAgICAgICAgIHJldHVybiBtcDsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIExPRy53YXJuaW5nKCJjcmVhdGUgZmFpbGVkOiIgKyBleCk7CisgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBMT0cud2FybmluZygiY3JlYXRlIGZhaWxlZDoiICsgZXgpOworICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBMT0cud2FybmluZygiY3JlYXRlIGZhaWxlZDoiICsgZXgpOworICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBMT0cud2FybmluZygiY3JlYXRlIGZhaWxlZDoiICsgZXgpOworICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIE1lZGlhUGxheWVyMlRlc3RCYXNlKCkgeworICAgICAgICBzdXBlcihNZWRpYVN0dWJBY3Rpdml0eS5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgbUFjdGl2aXR5ID0gZ2V0QWN0aXZpdHkoKTsKKyAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkud2FpdEZvcklkbGVTeW5jKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBydW5UZXN0T25VaVRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBtUGxheWVyID0gTWVkaWFQbGF5ZXIyLmNyZWF0ZSgpOworICAgICAgICAgICAgICAgICAgICBtUGxheWVyMiA9IE1lZGlhUGxheWVyMi5jcmVhdGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0KKyAgICAgICAgbUNvbnRleHQgPSBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRUYXJnZXRDb250ZXh0KCk7CisgICAgICAgIG1SZXNvdXJjZXMgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKTsKKyAgICAgICAgbUV4ZWN1dG9yID0gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbCgxKTsKKworICAgICAgICBzZXRVcE1QMkVDYihtUGxheWVyLCBtRXZlbnRDYkxvY2ssIG1FdmVudENhbGxiYWNrcyk7CisgICAgICAgIHNldFVwTVAyRUNiKG1QbGF5ZXIyLCBtRXZlbnRDYkxvY2syLCBtRXZlbnRDYWxsYmFja3MyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAobVBsYXllciAhPSBudWxsKSB7CisgICAgICAgICAgICBtUGxheWVyLmNsb3NlKCk7CisgICAgICAgICAgICBtUGxheWVyID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAobVBsYXllcjIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVBsYXllcjIuY2xvc2UoKTsKKyAgICAgICAgICAgIG1QbGF5ZXIyID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBtRXhlY3V0b3Iuc2h1dGRvd24oKTsKKyAgICAgICAgbUFjdGl2aXR5ID0gbnVsbDsKKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcE1QMkVDYihNZWRpYVBsYXllcjIgbXAsIE9iamVjdCBjYkxvY2ssCisgICAgICAgICAgICBMaXN0PE1lZGlhUGxheWVyMi5NZWRpYVBsYXllcjJFdmVudENhbGxiYWNrPiBlY2JzKSB7CisgICAgICAgIG1wLnNldE1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2sobUV4ZWN1dG9yLCBuZXcgTWVkaWFQbGF5ZXIyLk1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2soKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVmlkZW9TaXplQ2hhbmdlZChNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCwgaW50IHcsIGludCBoKSB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChjYkxvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChNZWRpYVBsYXllcjIuTWVkaWFQbGF5ZXIyRXZlbnRDYWxsYmFjayBlY2IgOiBlY2JzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlY2Iub25WaWRlb1NpemVDaGFuZ2VkKG1wLCBkc2QsIHcsIGgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVGltZWRUZXh0KE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkLCBUaW1lZFRleHQgdGV4dCkgeworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoY2JMb2NrKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoTWVkaWFQbGF5ZXIyLk1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2sgZWNiIDogZWNicykgeworICAgICAgICAgICAgICAgICAgICAgICAgZWNiLm9uVGltZWRUZXh0KG1wLCBkc2QsIHRleHQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVGltZWRNZXRhRGF0YUF2YWlsYWJsZShNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCwKKyAgICAgICAgICAgICAgICAgICAgVGltZWRNZXRhRGF0YSBkYXRhKSB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChjYkxvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChNZWRpYVBsYXllcjIuTWVkaWFQbGF5ZXIyRXZlbnRDYWxsYmFjayBlY2IgOiBlY2JzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlY2Iub25UaW1lZE1ldGFEYXRhQXZhaWxhYmxlKG1wLCBkc2QsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsIGludCB3aGF0LCBpbnQgZXh0cmEpIHsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGNiTG9jaykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKE1lZGlhUGxheWVyMi5NZWRpYVBsYXllcjJFdmVudENhbGxiYWNrIGVjYiA6IGVjYnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVjYi5vbkVycm9yKG1wLCBkc2QsIHdoYXQsIGV4dHJhKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkluZm8oTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsIGludCB3aGF0LCBpbnQgZXh0cmEpIHsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGNiTG9jaykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKE1lZGlhUGxheWVyMi5NZWRpYVBsYXllcjJFdmVudENhbGxiYWNrIGVjYiA6IGVjYnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVjYi5vbkluZm8obXAsIGRzZCwgd2hhdCwgZXh0cmEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2FsbENvbXBsZXRlZChNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCwgaW50IHdoYXQsIGludCBzdGF0dXMpIHsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGNiTG9jaykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKE1lZGlhUGxheWVyMi5NZWRpYVBsYXllcjJFdmVudENhbGxiYWNrIGVjYiA6IGVjYnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVjYi5vbkNhbGxDb21wbGV0ZWQobXAsIGRzZCwgd2hhdCwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbk1lZGlhVGltZUNoYW5nZWQoTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsCisgICAgICAgICAgICAgICAgICAgIE1lZGlhVGltZXN0YW1wIHRpbWVzdGFtcCkgeworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoY2JMb2NrKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoTWVkaWFQbGF5ZXIyLk1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2sgZWNiIDogZWNicykgeworICAgICAgICAgICAgICAgICAgICAgICAgZWNiLm9uTWVkaWFUaW1lQ2hhbmdlZChtcCwgZHNkLCB0aW1lc3RhbXApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ29tbWFuZExhYmVsUmVhY2hlZChNZWRpYVBsYXllcjIgbXAsIE9iamVjdCBsYWJlbCkgeworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoY2JMb2NrKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoTWVkaWFQbGF5ZXIyLk1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2sgZWNiIDogZWNicykgeworICAgICAgICAgICAgICAgICAgICAgICAgZWNiLm9uQ29tbWFuZExhYmVsUmVhY2hlZChtcCwgbGFiZWwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICAvLyByZXR1cm5zIHRydWUgb24gc3VjY2VzcworICAgIHByb3RlY3RlZCBib29sZWFuIGxvYWRSZXNvdXJjZShpbnQgcmVzaWQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIU1lZGlhVXRpbHMuaGFzQ29kZWNzRm9yUmVzb3VyY2UobUNvbnRleHQsIHJlc2lkKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQXNzZXRGaWxlRGVzY3JpcHRvciBhZmQgPSBtUmVzb3VyY2VzLm9wZW5SYXdSZXNvdXJjZUZkKHJlc2lkKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1QbGF5ZXIuc2V0RGF0YVNvdXJjZShuZXcgRGF0YVNvdXJjZURlc2MuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgIC5zZXREYXRhU291cmNlKGFmZC5nZXRGaWxlRGVzY3JpcHRvcigpLCBhZmQuZ2V0U3RhcnRPZmZzZXQoKSwgYWZkLmdldExlbmd0aCgpKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgICAgIC8vIEFsdGhvdWdoIGl0IGlzIG9ubHkgbWVhbnQgZm9yIHZpZGVvIHBsYXliYWNrLCBpdCBzaG91bGQgbm90CisgICAgICAgICAgICAvLyBjYXVzZSBpc3N1ZXMgZm9yIGF1ZGlvLW9ubHkgcGxheWJhY2suCisgICAgICAgICAgICBpbnQgdmlkZW9TY2FsaW5nTW9kZSA9IHNVc2VTY2FsZVRvRml0TW9kZT8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyMi5WSURFT19TQ0FMSU5HX01PREVfU0NBTEVfVE9fRklUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBNZWRpYVBsYXllcjIuVklERU9fU0NBTElOR19NT0RFX1NDQUxFX1RPX0ZJVF9XSVRIX0NST1BQSU5HOworCisgICAgICAgICAgICBtUGxheWVyLnNldFZpZGVvU2NhbGluZ01vZGUodmlkZW9TY2FsaW5nTW9kZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAvLyBUT0RPOiBjbG9zZSBhZmQgb25seSBhZnRlciBzZXREYXRhU291cmNlIGlzIGNvbmZpcm1lZC4KKyAgICAgICAgICAgIC8vIGFmZC5jbG9zZSgpOworICAgICAgICB9CisgICAgICAgIHNVc2VTY2FsZVRvRml0TW9kZSA9ICFzVXNlU2NhbGVUb0ZpdE1vZGU7ICAvLyBBbHRlcm5hdGUgdGhlIHNjYWxpbmcgbW9kZQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgRGF0YVNvdXJjZURlc2MgY3JlYXRlRGF0YVNvdXJjZURlc2MoaW50IHJlc2lkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFNZWRpYVV0aWxzLmhhc0NvZGVjc0ZvclJlc291cmNlKG1Db250ZXh0LCByZXNpZCkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQXNzZXRGaWxlRGVzY3JpcHRvciBhZmQgPSBtUmVzb3VyY2VzLm9wZW5SYXdSZXNvdXJjZUZkKHJlc2lkKTsKKyAgICAgICAgcmV0dXJuIG5ldyBEYXRhU291cmNlRGVzYy5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0RGF0YVNvdXJjZShhZmQuZ2V0RmlsZURlc2NyaXB0b3IoKSwgYWZkLmdldFN0YXJ0T2Zmc2V0KCksIGFmZC5nZXRMZW5ndGgoKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjaGVja0xvYWRSZXNvdXJjZShpbnQgcmVzaWQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZXR1cm4gTWVkaWFVdGlscy5jaGVjayhsb2FkUmVzb3VyY2UocmVzaWQpLCAibm8gZGVjb2RlciBmb3VuZCIpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGxvYWRTdWJ0aXRsZVNvdXJjZShpbnQgcmVzaWQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBBc3NldEZpbGVEZXNjcmlwdG9yIGFmZCA9IG1SZXNvdXJjZXMub3BlblJhd1Jlc291cmNlRmQocmVzaWQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbVBsYXllci5hZGRUaW1lZFRleHRTb3VyY2UoYWZkLmdldEZpbGVEZXNjcmlwdG9yKCksIGFmZC5nZXRTdGFydE9mZnNldCgpLAorICAgICAgICAgICAgICAgICAgICAgIGFmZC5nZXRMZW5ndGgoKSwgTWVkaWFQbGF5ZXIyLk1FRElBX01JTUVUWVBFX1RFWFRfU1VCUklQKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGFmZC5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgcGxheUxpdmVWaWRlb1Rlc3QoU3RyaW5nIHBhdGgsIGludCBwbGF5VGltZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHBsYXlWaWRlb1dpdGhSZXRyaWVzKHBhdGgsIG51bGwsIG51bGwsIHBsYXlUaW1lKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBwbGF5TGl2ZUF1ZGlvT25seVRlc3QoU3RyaW5nIHBhdGgsIGludCBwbGF5VGltZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHBsYXlWaWRlb1dpdGhSZXRyaWVzKHBhdGgsIC0xLCAtMSwgcGxheVRpbWUpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHBsYXlWaWRlb1Rlc3QoU3RyaW5nIHBhdGgsIGludCB3aWR0aCwgaW50IGhlaWdodCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHBsYXlWaWRlb1dpdGhSZXRyaWVzKHBhdGgsIHdpZHRoLCBoZWlnaHQsIDApOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHBsYXlWaWRlb1dpdGhSZXRyaWVzKFN0cmluZyBwYXRoLCBJbnRlZ2VyIHdpZHRoLCBJbnRlZ2VyIGhlaWdodCwgaW50IHBsYXlUaW1lKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGJvb2xlYW4gcGxheWVkU3VjY2Vzc2Z1bGx5ID0gZmFsc2U7CisgICAgICAgIGZpbmFsIFVyaSB1cmkgPSBVcmkucGFyc2UocGF0aCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU1RSRUFNX1JFVFJJRVM7IGkrKykgeworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtUGxheWVyLnNldERhdGFTb3VyY2UobmV3IERhdGFTb3VyY2VEZXNjLkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAuc2V0RGF0YVNvdXJjZShtQ29udGV4dCwgdXJpKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgICAgICAgICBwbGF5TG9hZGVkVmlkZW8od2lkdGgsIGhlaWdodCwgcGxheVRpbWUpOworICAgICAgICAgICAgcGxheWVkU3VjY2Vzc2Z1bGx5ID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0gY2F0Y2ggKFByZXBhcmVGYWlsZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gcHJlcGFyZSgpIGNhbiBmYWlsIGJlY2F1c2Ugb2YgbmV0d29yayBpc3N1ZXMsIHNvIHRyeSBhZ2FpbgorICAgICAgICAgICAgTE9HLndhcm5pbmcoInByZXBhcmUoKSBmYWlsZWQgb24gdHJ5ICIgKyBpICsgIiwgdHJ5aW5nIHBsYXliYWNrIGFnYWluIik7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoIlN0cmVhbSBkaWQgbm90IHBsYXkgc3VjY2Vzc2Z1bGx5IGFmdGVyIGFsbCBhdHRlbXB0cyIsIHBsYXllZFN1Y2Nlc3NmdWxseSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgcGxheVZpZGVvVGVzdChpbnQgcmVzaWQsIGludCB3aWR0aCwgaW50IGhlaWdodCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghY2hlY2tMb2FkUmVzb3VyY2UocmVzaWQpKSB7CisgICAgICAgICAgICByZXR1cm47IC8vIHNraXAKKyAgICAgICAgfQorCisgICAgICAgIHBsYXlMb2FkZWRWaWRlbyh3aWR0aCwgaGVpZ2h0LCAwKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBwbGF5TGl2ZVZpZGVvVGVzdCgKKyAgICAgICAgICAgIFVyaSB1cmksIE1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVycywgTGlzdDxIdHRwQ29va2llPiBjb29raWVzLAorICAgICAgICAgICAgaW50IHBsYXlUaW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcGxheVZpZGVvV2l0aFJldHJpZXModXJpLCBoZWFkZXJzLCBjb29raWVzLCBudWxsIC8qIHdpZHRoICovLCBudWxsIC8qIGhlaWdodCAqLywgcGxheVRpbWUpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHBsYXlWaWRlb1dpdGhSZXRyaWVzKAorICAgICAgICAgICAgVXJpIHVyaSwgTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzLCBMaXN0PEh0dHBDb29raWU+IGNvb2tpZXMsCisgICAgICAgICAgICBJbnRlZ2VyIHdpZHRoLCBJbnRlZ2VyIGhlaWdodCwgaW50IHBsYXlUaW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYm9vbGVhbiBwbGF5ZWRTdWNjZXNzZnVsbHkgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTVFJFQU1fUkVUUklFUzsgaSsrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1QbGF5ZXIuc2V0RGF0YVNvdXJjZShuZXcgRGF0YVNvdXJjZURlc2MuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RGF0YVNvdXJjZShnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRUYXJnZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJpLCBoZWFkZXJzLCBjb29raWVzKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICAgICAgICAgIHBsYXlMb2FkZWRWaWRlbyh3aWR0aCwgaGVpZ2h0LCBwbGF5VGltZSk7CisgICAgICAgICAgICAgICAgcGxheWVkU3VjY2Vzc2Z1bGx5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFByZXBhcmVGYWlsZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIHByZXBhcmUoKSBjYW4gZmFpbCBiZWNhdXNlIG9mIG5ldHdvcmsgaXNzdWVzLCBzbyB0cnkgYWdhaW4KKyAgICAgICAgICAgICAgICAvLyBwbGF5TG9hZGVkVmlkZW8gYWxyZWFkeSBoYXMgcmVzZXQgdGhlIHBsYXllciBzbyB3ZSBjYW4gdHJ5IGFnYWluIHNhZmVseS4KKyAgICAgICAgICAgICAgICBMT0cud2FybmluZygicHJlcGFyZSgpIGZhaWxlZCBvbiB0cnkgIiArIGkgKyAiLCB0cnlpbmcgcGxheWJhY2sgYWdhaW4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKCJTdHJlYW0gZGlkIG5vdCBwbGF5IHN1Y2Nlc3NmdWxseSBhZnRlciBhbGwgYXR0ZW1wdHMiLCBwbGF5ZWRTdWNjZXNzZnVsbHkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBsYXkgYSB2aWRlbyB3aGljaCBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZCB3aXRoIHNldERhdGFTb3VyY2UoKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3aWR0aCB3aWR0aCBvZiB0aGUgdmlkZW8gdG8gdmVyaWZ5LCBvciBudWxsIHRvIHNraXAgdmVyaWZpY2F0aW9uCisgICAgICogQHBhcmFtIGhlaWdodCBoZWlnaHQgb2YgdGhlIHZpZGVvIHRvIHZlcmlmeSwgb3IgbnVsbCB0byBza2lwIHZlcmlmaWNhdGlvbgorICAgICAqIEBwYXJhbSBwbGF5VGltZSBsZW5ndGggb2YgdGltZSB0byBwbGF5IHZpZGVvLCBvciAwIHRvIHBsYXkgZW50aXJlIHZpZGVvLgorICAgICAqIHdpdGggYSBub24tbmVnYXRpdmUgdmFsdWUsIHRoaXMgbWV0aG9kIHN0b3BzIHRoZSBwbGF5YmFjayBhZnRlciB0aGUgbGVuZ3RoIG9mCisgICAgICogdGltZSBvciB0aGUgZHVyYXRpb24gdGhlIHZpZGVvIGlzIGVsYXBzZWQuIFdpdGggYSB2YWx1ZSBvZiAtMSwKKyAgICAgKiB0aGlzIG1ldGhvZCBzaW1wbHkgc3RhcnRzIHRoZSB2aWRlbyBhbmQgcmV0dXJucyBpbW1lZGlhdGVseSB3aXRob3V0CisgICAgICogc3RvcGluZyB0aGUgdmlkZW8gcGxheWJhY2suCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcGxheUxvYWRlZFZpZGVvKGZpbmFsIEludGVnZXIgd2lkdGgsIGZpbmFsIEludGVnZXIgaGVpZ2h0LCBpbnQgcGxheVRpbWUpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgZmxvYXQgdm9sdW1lID0gMC41ZjsKKworICAgICAgICBib29sZWFuIGF1ZGlvT25seSA9ICh3aWR0aCAhPSBudWxsICYmIHdpZHRoLmludFZhbHVlKCkgPT0gLTEpIHx8CisgICAgICAgICAgICAgICAgKGhlaWdodCAhPSBudWxsICYmIGhlaWdodC5pbnRWYWx1ZSgpID09IC0xKTsKKworICAgICAgICBtUGxheWVyLnNldERpc3BsYXkobUFjdGl2aXR5LmdldFN1cmZhY2VIb2xkZXIoKSk7CisgICAgICAgIG1QbGF5ZXIuc2V0U2NyZWVuT25XaGlsZVBsYXlpbmcodHJ1ZSk7CisKKyAgICAgICAgc3luY2hyb25pemVkIChtRXZlbnRDYkxvY2spIHsKKyAgICAgICAgICAgIG1FdmVudENhbGxiYWNrcy5hZGQobmV3IE1lZGlhUGxheWVyMi5NZWRpYVBsYXllcjJFdmVudENhbGxiYWNrKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVmlkZW9TaXplQ2hhbmdlZChNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCwgaW50IHcsIGludCBoKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh3ID09IDAgJiYgaCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHNpemUgb2YgMHgwIGNhbiBiZSBzZW50IGluaXRpYWxseSBvbmUgdGltZSB3aGVuIHVzaW5nIE51UGxheWVyLgorICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UobU9uVmlkZW9TaXplQ2hhbmdlZENhbGxlZC5pc1NpZ25hbGxlZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtT25WaWRlb1NpemVDaGFuZ2VkQ2FsbGVkLnNpZ25hbCgpOworICAgICAgICAgICAgICAgICAgICBpZiAod2lkdGggIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHdpZHRoLmludFZhbHVlKCksIHcpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChoZWlnaHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGhlaWdodC5pbnRWYWx1ZSgpLCBoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsIGludCB3aGF0LCBpbnQgZXh0cmEpIHsKKyAgICAgICAgICAgICAgICAgICAgZmFpbCgiTWVkaWEgcGxheWVyIGhhZCBlcnJvciAiICsgd2hhdCArICIgcGxheWluZyB2aWRlbyIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uSW5mbyhNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCwgaW50IHdoYXQsIGludCBleHRyYSkgeworICAgICAgICAgICAgICAgICAgICBpZiAod2hhdCA9PSBNZWRpYVBsYXllcjIuTUVESUFfSU5GT19WSURFT19SRU5ERVJJTkdfU1RBUlQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1PblZpZGVvUmVuZGVyaW5nU3RhcnRDYWxsZWQuc2lnbmFsKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBNZWRpYVBsYXllcjIuTUVESUFfSU5GT19QUkVQQVJFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbU9uUHJlcGFyZUNhbGxlZC5zaWduYWwoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2FsbENvbXBsZXRlZChNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aGF0LCBpbnQgc3RhdHVzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh3aGF0ID09IE1lZGlhUGxheWVyMi5DQUxMX0NPTVBMRVRFRF9QTEFZKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtT25QbGF5Q2FsbGVkLnNpZ25hbCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBtT25QcmVwYXJlQ2FsbGVkLnJlc2V0KCk7CisgICAgICAgICAgbVBsYXllci5wcmVwYXJlKCk7CisgICAgICAgICAgbU9uUHJlcGFyZUNhbGxlZC53YWl0Rm9yU2lnbmFsKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgbVBsYXllci5yZXNldCgpOworICAgICAgICAgIHRocm93IG5ldyBQcmVwYXJlRmFpbGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBtT25QbGF5Q2FsbGVkLnJlc2V0KCk7CisgICAgICAgIG1QbGF5ZXIucGxheSgpOworICAgICAgICBtT25QbGF5Q2FsbGVkLndhaXRGb3JTaWduYWwoKTsKKyAgICAgICAgaWYgKCFhdWRpb09ubHkpIHsKKyAgICAgICAgICAgIG1PblZpZGVvU2l6ZUNoYW5nZWRDYWxsZWQud2FpdEZvclNpZ25hbCgpOworICAgICAgICAgICAgbU9uVmlkZW9SZW5kZXJpbmdTdGFydENhbGxlZC53YWl0Rm9yU2lnbmFsKCk7CisgICAgICAgIH0KKyAgICAgICAgbVBsYXllci5zZXRQbGF5ZXJWb2x1bWUodm9sdW1lKTsKKworICAgICAgICAvLyB3YWl0aW5nIHRvIGNvbXBsZXRlCisgICAgICAgIGlmIChwbGF5VGltZSA9PSAtMSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKHBsYXlUaW1lID09IDApIHsKKyAgICAgICAgICAgIHdoaWxlIChtUGxheWVyLmlzUGxheWluZygpKSB7CisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNMRUVQX1RJTUUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKHBsYXlUaW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHZhbGlkYXRlIGEgZmV3IE1lZGlhTWV0cmljcy4KKyAgICAgICAgUGVyc2lzdGFibGVCdW5kbGUgbWV0cmljcyA9IG1QbGF5ZXIuZ2V0TWV0cmljcygpOworICAgICAgICBpZiAobWV0cmljcyA9PSBudWxsKSB7CisgICAgICAgICAgICBmYWlsKCJNZWRpYVBsYXllcjIuZ2V0TWV0cmljcygpIHJldHVybmVkIG51bGwgbWV0cmljcyIpOworICAgICAgICB9IGVsc2UgaWYgKG1ldHJpY3MuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBmYWlsKCJNZWRpYVBsYXllcjIuZ2V0TWV0cmljcygpIHJldHVybmVkIGVtcHR5IG1ldHJpY3MiKTsKKyAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgaW50IHNpemUgPSBtZXRyaWNzLnNpemUoKTsKKyAgICAgICAgICAgIFNldDxTdHJpbmc+IGtleXMgPSBtZXRyaWNzLmtleVNldCgpOworCisgICAgICAgICAgICBpZiAoa2V5cyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmFpbCgiTWVkaWFNZXRyaWNzU2V0IHJldHVybmVkIG5vIGtleXMiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5cy5zaXplKCkgIT0gc2l6ZSkgeworICAgICAgICAgICAgICAgIGZhaWwoIk1lZGlhTWV0cmljc1NldC5rZXlzKCkuc2l6ZSgpIG1pc21hdGNoIE1lZGlhTWV0cmljc1NldC5zaXplKCkiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gd2UgcGxheWVkIHNvbWV0aGluZzsgc28gb25lIG9mIHRoZXNlIHNob3VsZCBiZSBub24tbnVsbAorICAgICAgICAgICAgU3RyaW5nIHZtaW1lID0gbWV0cmljcy5nZXRTdHJpbmcoTWVkaWFQbGF5ZXIyLk1ldHJpY3NDb25zdGFudHMuTUlNRV9UWVBFX1ZJREVPLCBudWxsKTsKKyAgICAgICAgICAgIFN0cmluZyBhbWltZSA9IG1ldHJpY3MuZ2V0U3RyaW5nKE1lZGlhUGxheWVyMi5NZXRyaWNzQ29uc3RhbnRzLk1JTUVfVFlQRV9BVURJTywgbnVsbCk7CisgICAgICAgICAgICBpZiAodm1pbWUgPT0gbnVsbCAmJiBhbWltZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmFpbCgiZ2V0TWV0cmljcygpIHJldHVybmVkIG5laXRoZXIgdmlkZW8gbm9yIGF1ZGlvIG1pbWUgdmFsdWUiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbG9uZyBkdXJhdGlvbiA9IG1ldHJpY3MuZ2V0TG9uZyhNZWRpYVBsYXllcjIuTWV0cmljc0NvbnN0YW50cy5EVVJBVElPTiwgLTIpOworICAgICAgICAgICAgaWYgKGR1cmF0aW9uID09IC0yKSB7CisgICAgICAgICAgICAgICAgZmFpbCgiZ2V0TWV0cmljcygpIGRpZG4ndCByZXR1cm4gYSBkdXJhdGlvbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9uZyBwbGF5aW5nID0gbWV0cmljcy5nZXRMb25nKE1lZGlhUGxheWVyMi5NZXRyaWNzQ29uc3RhbnRzLlBMQVlJTkcsIC0yKTsKKyAgICAgICAgICAgIGlmIChwbGF5aW5nID09IC0yKSB7CisgICAgICAgICAgICAgICAgZmFpbCgiZ2V0TWV0cmljcygpIGRpZG4ndCByZXR1cm4gYSBwbGF5aW5nIHRpbWUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgha2V5cy5jb250YWlucyhNZWRpYVBsYXllcjIuTWV0cmljc0NvbnN0YW50cy5QTEFZSU5HKSkgeworICAgICAgICAgICAgICAgIGZhaWwoIk1lZGlhTWV0cmljc1NldC5rZXlzKCkgbWlzc2luZzogIiArIE1lZGlhUGxheWVyMi5NZXRyaWNzQ29uc3RhbnRzLlBMQVlJTkcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbVBsYXllci5zdG9wKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJlcGFyZUZhaWxlZEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7fQorCisgICAgcHVibGljIGJvb2xlYW4gaXNUdigpIHsKKyAgICAgICAgUGFja2FnZU1hbmFnZXIgcG0gPSBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRUYXJnZXRDb250ZXh0KCkuZ2V0UGFja2FnZU1hbmFnZXIoKTsKKyAgICAgICAgcmV0dXJuIHBtLmhhc1N5c3RlbUZlYXR1cmUocG0uRkVBVFVSRV9URUxFVklTSU9OKQorICAgICAgICAgICAgICAgICYmIHBtLmhhc1N5c3RlbUZlYXR1cmUocG0uRkVBVFVSRV9MRUFOQkFDSyk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gY2hlY2tUdigpIHsKKyAgICAgICAgcmV0dXJuIE1lZGlhVXRpbHMuY2hlY2soaXNUdigpLCAibm90IGEgVFYiKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRPbkVycm9yTGlzdGVuZXIoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUV2ZW50Q2JMb2NrKSB7CisgICAgICAgICAgICBtRXZlbnRDYWxsYmFja3MuYWRkKG5ldyBNZWRpYVBsYXllcjIuTWVkaWFQbGF5ZXIyRXZlbnRDYWxsYmFjaygpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkLCBpbnQgd2hhdCwgaW50IGV4dHJhKSB7CisgICAgICAgICAgICAgICAgICAgIG1PbkVycm9yQ2FsbGVkLnNpZ25hbCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL01lZGlhUGxheWVyRHJtVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL01lZGlhUGxheWVyRHJtVGVzdC5qYXZhCmluZGV4IDgyNjQ1MDguLjA4YmEwOWQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9NZWRpYVBsYXllckRybVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvTWVkaWFQbGF5ZXJEcm1UZXN0LmphdmEKQEAgLTE1LDUyICsxNSwxNSBAQAogICovCiBwYWNrYWdlIGFuZHJvaWQubWVkaWEuY3RzOwogCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS5jdHMuUjsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0RmlsZURlc2NyaXB0b3I7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwotaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuQ2FtZXJhOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb2RlYzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRGF0YVNvdXJjZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRXh0cmFjdG9yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFGb3JtYXQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhUmV0cmlldmVyOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllci5PbkVycm9yTGlzdGVuZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVJlY29yZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFUaW1lc3RhbXA7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5QbGF5YmFja1BhcmFtczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlN1YnRpdGxlRGF0YTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlN5bmNQYXJhbXM7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5UaW1lZFRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpb2Z4LkF1ZGlvRWZmZWN0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW9meC5WaXN1YWxpemVyOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKIGltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OwotaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlBvd2VyTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOwogaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5SZXF1aXJlc0RldmljZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5NZWRpYVV0aWxzOworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CiAKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLWltcG9ydCBqYXZhLnV0aWwuVVVJRDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yOwogCiAvKioKICAqIFRlc3RzIGZvciB0aGUgTWVkaWFQbGF5ZXIgQVBJIGFuZCBsb2NhbCB2aWRlby9hdWRpbyBwbGF5YmFjay4KQEAgLTcxLDYgKzM0LDcgQEAKICAqLwogQFNtYWxsVGVzdAogQFJlcXVpcmVzRGV2aWNlCitAQXBwTW9kZUZ1bGwocmVhc29uID0gIlRPRE86IGV2YWx1YXRlIGFuZCBwb3J0IHRvIGluc3RhbnQiKQogcHVibGljIGNsYXNzIE1lZGlhUGxheWVyRHJtVGVzdCBleHRlbmRzIE1lZGlhUGxheWVyRHJtVGVzdEJhc2UgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiTWVkaWFQbGF5ZXJEcm1UZXN0IjsKQEAgLTEyMSwxMSArODUsMTEgQEAKICAgICAvLyBBc3NldHMKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVyaSBDRU5DX0FVRElPX1VSTCA9IFVyaS5wYXJzZSgKLSAgICAgICAgICAgICJodHRwOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS93dm1lZGlhL2NlbmMvY2xlYXJrZXkvY2FyX2NlbmMtMjAxMjA4MjctOGMtcHNzaC5tcDQiKTsKKyAgICAgICAgICAgICJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vd3ZtZWRpYS9jZW5jL2NsZWFya2V5L2Nhcl9jZW5jLTIwMTIwODI3LThjLXBzc2gubXA0Iik7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVXJpIENFTkNfQVVESU9fVVJMX0RPV05MT0FERUQgPSBnZXRVcmlGcm9tRmlsZSgiY2FyX2NlbmMtMjAxMjA4MjctOGMubXA0Iik7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVcmkgQ0VOQ19WSURFT19VUkwgPSBVcmkucGFyc2UoCi0gICAgICAgICAgICAiaHR0cDovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vd3ZtZWRpYS9jZW5jL2NsZWFya2V5L2Nhcl9jZW5jLTIwMTIwODI3LTg4LXBzc2gubXA0Iik7CisgICAgICAgICAgICAiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3d2bWVkaWEvY2VuYy9jbGVhcmtleS9jYXJfY2VuYy0yMDEyMDgyNy04OC1wc3NoLm1wNCIpOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVyaSBDRU5DX1ZJREVPX1VSTF9ET1dOTE9BREVEID0gZ2V0VXJpRnJvbUZpbGUoImNhcl9jZW5jLTIwMTIwODI3LTg4Lm1wNCIpOwogCiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9NZWRpYVBsYXllckRybVRlc3RCYXNlLmphdmEgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvTWVkaWFQbGF5ZXJEcm1UZXN0QmFzZS5qYXZhCmluZGV4IDk0ZTc1ZWIuLmI2NWM2OTAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9NZWRpYVBsYXllckRybVRlc3RCYXNlLmphdmEKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL01lZGlhUGxheWVyRHJtVGVzdEJhc2UuamF2YQpAQCAtMzAsNyArMzAsNyBAQAogaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIuRHJtSW5mbzsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLlJlc291cmNlQnVzeUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLlVuc3VwcG9ydGVkU2NoZW1lRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuY3RzLk1lZGlhUGxheWVyVGVzdEJhc2UuTW9uaXRvcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmN0cy5UZXN0VXRpbHMuTW9uaXRvcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlclRocmVhZDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9NZWRpYVBsYXllckZsYWt5TmV0d29ya1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9NZWRpYVBsYXllckZsYWt5TmV0d29ya1Rlc3QuamF2YQppbmRleCA1ZmM3MWZmLi5hNGJhNjM3IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvTWVkaWFQbGF5ZXJGbGFreU5ldHdvcmtUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL01lZGlhUGxheWVyRmxha3lOZXR3b3JrVGVzdC5qYXZhCkBAIC0xNiwxMCArMTYsMTIgQEAKIHBhY2thZ2UgYW5kcm9pZC5tZWRpYS5jdHM7CiAKIGltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuY3RzLlRlc3RVdGlscy5Nb25pdG9yOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CiBpbXBvcnQgYW5kcm9pZC53ZWJraXQuY3RzLkN0c1Rlc3RTZXJ2ZXI7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLk1lZGlhVXRpbHM7CkBAIC00NCw2ICs0Niw3IEBACiAgKiBFeGVjdXRlcyBhIHJhbmdlIG9mIHRlc3RzIG9uIE1lZGlhUGxheWVyIHdoaWxlIHN0cmVhbWluZyBhIHZpZGVvCiAgKiBmcm9tIGFuIEhUVFAgc2VydmVyIG92ZXIgYSBzaW11bGF0ZWQgImZsYWt5IiBuZXR3b3JrLgogICovCitAQXBwTW9kZUZ1bGwocmVhc29uID0gIlRPRE86IGV2YWx1YXRlIGFuZCBwb3J0IHRvIGluc3RhbnQiKQogcHVibGljIGNsYXNzIE1lZGlhUGxheWVyRmxha3lOZXR3b3JrVGVzdCBleHRlbmRzIE1lZGlhUGxheWVyVGVzdEJhc2UgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQS0cgPSAiYW5kcm9pZC5tZWRpYS5jdHMiOwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvTWVkaWFQbGF5ZXJTdXJmYWNlVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL01lZGlhUGxheWVyU3VyZmFjZVRlc3QuamF2YQppbmRleCA0MjlkNTZlLi5lMDFlMmMxIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvTWVkaWFQbGF5ZXJTdXJmYWNlVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9NZWRpYVBsYXllclN1cmZhY2VUZXN0LmphdmEKQEAgLTE3LDE0ICsxNywxNyBAQAogcGFja2FnZSBhbmRyb2lkLm1lZGlhLmN0czsKIAogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIGltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUmVxdWlyZXNEZXZpY2U7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKKwogLyoqCiAgKi8KIEBTbWFsbFRlc3QKIEBSZXF1aXJlc0RldmljZQorQEFwcE1vZGVGdWxsKHJlYXNvbiA9ICJUT0RPOiBldmFsdWF0ZSBhbmQgcG9ydCB0byBpbnN0YW50IikKIHB1YmxpYyBjbGFzcyBNZWRpYVBsYXllclN1cmZhY2VUZXN0IGV4dGVuZHMgQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI8TWVkaWFQbGF5ZXJTdXJmYWNlU3R1YkFjdGl2aXR5PiB7CiAKICAgICBwdWJsaWMgTWVkaWFQbGF5ZXJTdXJmYWNlVGVzdCgpIHsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9NZWRpYVBsYXllclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9NZWRpYVBsYXllclRlc3QuamF2YQppbmRleCBjN2I2NGU1Li4zNDJjYmE3IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvTWVkaWFQbGF5ZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL01lZGlhUGxheWVyVGVzdC5qYXZhCkBAIC0xNiw4ICsxNiw2IEBACiBwYWNrYWdlIGFuZHJvaWQubWVkaWEuY3RzOwogCiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuY3RzLlI7Ci0KIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldEZpbGVEZXNjcmlwdG9yOwpAQCAtMjUsMTMgKzIzLDEwIEBACiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5DYW1lcmE7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5DYW1jb3JkZXJQcm9maWxlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb2RlYzsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRGF0YVNvdXJjZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRXh0cmFjdG9yOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFGb3JtYXQ7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhUmV0cmlldmVyOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllci5PbkVycm9yTGlzdGVuZXI7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllci5PblNlZWtDb21wbGV0ZUxpc3RlbmVyOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIuT25UaW1lZFRleHRMaXN0ZW5lcjsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUmVjb3JkZXI7CkBAIC00MiwyMCArMzcsMjQgQEAKIGltcG9ydCBhbmRyb2lkLm1lZGlhLlRpbWVkVGV4dDsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvZnguQXVkaW9FZmZlY3Q7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpb2Z4LlZpc3VhbGl6ZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5jdHMuUjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmN0cy5UZXN0VXRpbHMuTW9uaXRvcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5FbnZpcm9ubWVudDsKLWltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5Qb3dlck1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIGltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUmVxdWlyZXNEZXZpY2U7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuTWVkaWFVdGlsczsKIAoraW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnRpb25GYWlsZWRFcnJvcjsKKwogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CkBAIC02NSwxMiArNjQsMTMgQEAKIGltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwogaW1wb3J0IGphdmEudXRpbC5VVUlEOwogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQmxvY2tpbmdEZXF1ZTsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5MaW5rZWRCbG9ja2luZ0RlcXVlOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOwogaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKIGltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0aW9uRmFpbGVkRXJyb3I7CiAKIC8qKgogICogVGVzdHMgZm9yIHRoZSBNZWRpYVBsYXllciBBUEkgYW5kIGxvY2FsIHZpZGVvL2F1ZGlvIHBsYXliYWNrLgpAQCAtODEsNiArODEsNyBAQAogICovCiBAU21hbGxUZXN0CiBAUmVxdWlyZXNEZXZpY2UKK0BBcHBNb2RlRnVsbChyZWFzb24gPSAiVE9ETzogZXZhbHVhdGUgYW5kIHBvcnQgdG8gaW5zdGFudCIpCiBwdWJsaWMgY2xhc3MgTWVkaWFQbGF5ZXJUZXN0IGV4dGVuZHMgTWVkaWFQbGF5ZXJUZXN0QmFzZSB7CiAKICAgICBwcml2YXRlIFN0cmluZyBSRUNPUkRFRF9GSUxFOwpAQCAtOTksNiArMTAwLDggQEAKICAgICBwcml2YXRlIGZpbmFsIE1vbml0b3IgbU9uU3VidGl0bGVEYXRhQ2FsbGVkID0gbmV3IE1vbml0b3IoKTsKICAgICBwcml2YXRlIGludCBtU2VsZWN0ZWRTdWJ0aXRsZUluZGV4OwogCisgICAgcHJpdmF0ZSBmaW5hbCBNb25pdG9yIG1Pbk1lZGlhVGltZURpc2NvbnRpbnVpdHlDYWxsZWQgPSBuZXcgTW9uaXRvcigpOworCiAgICAgcHJpdmF0ZSBGaWxlIG1PdXRGaWxlOwogCiAgICAgcHJpdmF0ZSBpbnQgbUJvdW5kc0NvdW50OwpAQCAtMTM2MCw2ICsxMzYzLDc2IEBACiAgICAgICAgIG1NZWRpYVBsYXllci5zdG9wKCk7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgdGVzdE1lZGlhVGltZURpc2NvbnRpbnVpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFjaGVja0xvYWRSZXNvdXJjZSgKKyAgICAgICAgICAgICAgICBSLnJhdy5iYmJfczFfMzIweDI0MF9tcDRfaDI2NF9tcDJfODAwa2Jwc18zMGZwc19hYWNfbGNfNWNoXzI0MGticHNfNDQxMDBoeikpIHsKKyAgICAgICAgICAgIHJldHVybjsgLy8gc2tpcAorICAgICAgICB9CisKKyAgICAgICAgbU1lZGlhUGxheWVyLnNldE9uU2Vla0NvbXBsZXRlTGlzdGVuZXIoCisgICAgICAgICAgICAgICAgbmV3IE1lZGlhUGxheWVyLk9uU2Vla0NvbXBsZXRlTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblNlZWtDb21wbGV0ZShNZWRpYVBsYXllciBtcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbU9uU2Vla0NvbXBsZXRlQ2FsbGVkLnNpZ25hbCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGZpbmFsIEJsb2NraW5nRGVxdWU8TWVkaWFUaW1lc3RhbXA+IHRpbWVzdGFtcHMgPSBuZXcgTGlua2VkQmxvY2tpbmdEZXF1ZTw+KCk7CisgICAgICAgIG1NZWRpYVBsYXllci5zZXRPbk1lZGlhVGltZURpc2NvbnRpbnVpdHlMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICBuZXcgTWVkaWFQbGF5ZXIuT25NZWRpYVRpbWVEaXNjb250aW51aXR5TGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbk1lZGlhVGltZURpc2NvbnRpbnVpdHkoTWVkaWFQbGF5ZXIgbXAsIE1lZGlhVGltZXN0YW1wIHRpbWVzdGFtcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbU9uTWVkaWFUaW1lRGlzY29udGludWl0eUNhbGxlZC5zaWduYWwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcHMuYWRkKHRpbWVzdGFtcCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgbU1lZGlhUGxheWVyLnNldERpc3BsYXkobUFjdGl2aXR5LmdldFN1cmZhY2VIb2xkZXIoKSk7CisgICAgICAgIG1NZWRpYVBsYXllci5wcmVwYXJlKCk7CisKKyAgICAgICAgLy8gVGltZXN0YW1wIG5lZWRzIHRvIGJlIHJlcG9ydGVkIHdoZW4gcGxheWJhY2sgc3RhcnRzLgorICAgICAgICBtT25NZWRpYVRpbWVEaXNjb250aW51aXR5Q2FsbGVkLnJlc2V0KCk7CisgICAgICAgIG1NZWRpYVBsYXllci5zdGFydCgpOworICAgICAgICBkbyB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKG1Pbk1lZGlhVGltZURpc2NvbnRpbnVpdHlDYWxsZWQud2FpdEZvclNpZ25hbCgxMDAwKSk7CisgICAgICAgIH0gd2hpbGUgKHRpbWVzdGFtcHMuZ2V0TGFzdCgpLmdldE1lZGlhQ2xvY2tSYXRlKCkgIT0gMS4wZik7CisKKyAgICAgICAgLy8gVGltZXN0YW1wIG5lZWRzIHRvIGJlIHJlcG9ydGVkIHdoZW4gc2Vla2luZyBpcyBkb25lLgorICAgICAgICBtT25TZWVrQ29tcGxldGVDYWxsZWQucmVzZXQoKTsKKyAgICAgICAgbU9uTWVkaWFUaW1lRGlzY29udGludWl0eUNhbGxlZC5yZXNldCgpOworICAgICAgICBtTWVkaWFQbGF5ZXIuc2Vla1RvKDMwMDApOworICAgICAgICBtT25TZWVrQ29tcGxldGVDYWxsZWQud2FpdEZvclNpZ25hbCgpOworICAgICAgICBkbyB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKG1Pbk1lZGlhVGltZURpc2NvbnRpbnVpdHlDYWxsZWQud2FpdEZvclNpZ25hbCgxMDAwKSk7CisgICAgICAgIH0gd2hpbGUgKHRpbWVzdGFtcHMuZ2V0TGFzdCgpLmdldE1lZGlhQ2xvY2tSYXRlKCkgIT0gMS4wZik7CisKKyAgICAgICAgLy8gVGltZXN0YW1wIG5lZWRzIHRvIGJlIHVwZGF0ZWQgd2hlbiBwbGF5YmFjayByYXRlIGNoYW5nZXMuCisgICAgICAgIG1Pbk1lZGlhVGltZURpc2NvbnRpbnVpdHlDYWxsZWQucmVzZXQoKTsKKyAgICAgICAgbU1lZGlhUGxheWVyLnNldFBsYXliYWNrUGFyYW1zKG5ldyBQbGF5YmFja1BhcmFtcygpLnNldFNwZWVkKDAuNWYpKTsKKyAgICAgICAgZG8geworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtT25NZWRpYVRpbWVEaXNjb250aW51aXR5Q2FsbGVkLndhaXRGb3JTaWduYWwoMTAwMCkpOworICAgICAgICB9IHdoaWxlICh0aW1lc3RhbXBzLmdldExhc3QoKS5nZXRNZWRpYUNsb2NrUmF0ZSgpICE9IDAuNWYpOworCisgICAgICAgIC8vIFRpbWVzdGFtcCBuZWVkcyB0byBiZSB1cGRhdGVkIHdoZW4gcGxheWVyIGlzIHBhdXNlZC4KKyAgICAgICAgbU9uTWVkaWFUaW1lRGlzY29udGludWl0eUNhbGxlZC5yZXNldCgpOworICAgICAgICBtTWVkaWFQbGF5ZXIucGF1c2UoKTsKKyAgICAgICAgZG8geworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtT25NZWRpYVRpbWVEaXNjb250aW51aXR5Q2FsbGVkLndhaXRGb3JTaWduYWwoMTAwMCkpOworICAgICAgICB9IHdoaWxlICh0aW1lc3RhbXBzLmdldExhc3QoKS5nZXRNZWRpYUNsb2NrUmF0ZSgpICE9IDAuMGYpOworCisgICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIGlzIG5vIG1vcmUgbm90aWZpY2F0aW9uIGFmdGVyIGNsZWFyaW5nIGxpc3RlbmVyLgorICAgICAgICBtTWVkaWFQbGF5ZXIuY2xlYXJPbk1lZGlhVGltZURpc2NvbnRpbnVpdHlMaXN0ZW5lcigpOworICAgICAgICBtTWVkaWFQbGF5ZXIuc3RhcnQoKTsKKyAgICAgICAgbU9uTWVkaWFUaW1lRGlzY29udGludWl0eUNhbGxlZC5yZXNldCgpOworICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtT25NZWRpYVRpbWVEaXNjb250aW51aXR5Q2FsbGVkLmdldE51bVNpZ25hbCgpKTsKKworICAgICAgICBtTWVkaWFQbGF5ZXIucmVzZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9jYWxWaWRlb19NS1ZfSDI2NV8xMjgweDcyMF81MDBrYnBzXzI1ZnBzX0FBQ19TdGVyZW9fMTI4a2Jwc180NDEwMEh6KCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBwbGF5VmlkZW9UZXN0KAorICAgICAgICAgICAgICAgIFIucmF3LnZpZGVvXzEyODB4NzIwX21rdl9oMjY1XzUwMGticHNfMjVmcHNfYWFjX3N0ZXJlb18xMjhrYnBzXzQ0MTAwaHosIDEyODAsIDcyMCk7CisgICAgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RMb2NhbFZpZGVvX01QNF9IMjY0XzQ4MHgzNjBfNTAwa2Jwc18yNWZwc19BQUNfU3RlcmVvXzEyOGticHNfNDQxMTBIeigpCiAgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgcGxheVZpZGVvVGVzdCgKQEAgLTE3MDMsNiArMTc3Niw2MiBAQAogICAgICAgICBtTWVkaWFQbGF5ZXIuc3RvcCgpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHRlc3RPblN1YnRpdGxlRGF0YUxpc3RlbmVyKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGlmICghY2hlY2tMb2FkUmVzb3VyY2UoUi5yYXcudGVzdHZpZGVvX3dpdGhfMl9zdWJ0aXRsZV90cmFja3MpKSB7CisgICAgICAgICAgICByZXR1cm47IC8vIHNraXA7CisgICAgICAgIH0KKworICAgICAgICBtTWVkaWFQbGF5ZXIuc2V0T25TdWJ0aXRsZURhdGFMaXN0ZW5lcihuZXcgTWVkaWFQbGF5ZXIuT25TdWJ0aXRsZURhdGFMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25TdWJ0aXRsZURhdGEoTWVkaWFQbGF5ZXIgbXAsIFN1YnRpdGxlRGF0YSBkYXRhKSB7CisgICAgICAgICAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCAmJiBkYXRhLmdldERhdGEoKSAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBkYXRhLmdldFRyYWNrSW5kZXgoKSA9PSBtU3VidGl0bGVUcmFja0luZGV4LmdldCgwKSkgeworICAgICAgICAgICAgICAgICAgICBtT25TdWJ0aXRsZURhdGFDYWxsZWQuc2lnbmFsKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgbU1lZGlhUGxheWVyLnNldE9uSW5mb0xpc3RlbmVyKG5ldyBNZWRpYVBsYXllci5PbkluZm9MaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gb25JbmZvKE1lZGlhUGxheWVyIG1wLCBpbnQgd2hhdCwgaW50IGV4dHJhKSB7CisgICAgICAgICAgICAgICAgaWYgKHdoYXQgPT0gTWVkaWFQbGF5ZXIuTUVESUFfSU5GT19NRVRBREFUQV9VUERBVEUpIHsKKyAgICAgICAgICAgICAgICAgICAgbU9uSW5mb0NhbGxlZC5zaWduYWwoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBtTWVkaWFQbGF5ZXIuc2V0RGlzcGxheShnZXRBY3Rpdml0eSgpLmdldFN1cmZhY2VIb2xkZXIoKSk7CisgICAgICAgIG1NZWRpYVBsYXllci5zZXRTY3JlZW5PbldoaWxlUGxheWluZyh0cnVlKTsKKyAgICAgICAgbU1lZGlhUGxheWVyLnNldFdha2VNb2RlKG1Db250ZXh0LCBQb3dlck1hbmFnZXIuUEFSVElBTF9XQUtFX0xPQ0spOworCisgICAgICAgIG1NZWRpYVBsYXllci5wcmVwYXJlKCk7CisgICAgICAgIG1NZWRpYVBsYXllci5zdGFydCgpOworICAgICAgICBhc3NlcnRUcnVlKG1NZWRpYVBsYXllci5pc1BsYXlpbmcoKSk7CisKKyAgICAgICAgLy8gQ2xvc2VkIGNhcHRpb24gdHJhY2tzIGFyZSBpbi1iYW5kLgorICAgICAgICAvLyBTbywgdGhvc2UgdHJhY2tzIHdpbGwgYmUgZm91bmQgYWZ0ZXIgcHJvY2Vzc2luZyBhIG51bWJlciBvZiBmcmFtZXMuCisgICAgICAgIG1PbkluZm9DYWxsZWQud2FpdEZvclNpZ25hbCgxNTAwKTsKKworICAgICAgICBtT25JbmZvQ2FsbGVkLnJlc2V0KCk7CisgICAgICAgIG1PbkluZm9DYWxsZWQud2FpdEZvclNpZ25hbCgxNTAwKTsKKworICAgICAgICByZWFkU3VidGl0bGVUcmFja3MoKTsKKworICAgICAgICAvLyBXYWl0cyB1bnRpbCBhdCBsZWFzdCB0d28gY2FwdGlvbnMgYXJlIGZpcmVkLiBUaW1lb3V0IGlzIDIuNSBzZWMuCisgICAgICAgIHNlbGVjdFN1YnRpdGxlVHJhY2soMCk7CisgICAgICAgIGFzc2VydFRydWUobU9uU3VidGl0bGVEYXRhQ2FsbGVkLndhaXRGb3JDb3VudGVkU2lnbmFscygyLCAyNTAwKSA+PSAyKTsKKworICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBpcyBubyBtb3JlIG5vdGlmaWNhdGlvbiBhZnRlciBjbGVhcmluZyBsaXN0ZW5lci4KKyAgICAgICAgbU1lZGlhUGxheWVyLmNsZWFyT25TdWJ0aXRsZURhdGFMaXN0ZW5lcigpOworICAgICAgICBtTWVkaWFQbGF5ZXIuc2Vla1RvKDApOworICAgICAgICBtTWVkaWFQbGF5ZXIuc3RhcnQoKTsKKyAgICAgICAgbU9uU3VidGl0bGVEYXRhQ2FsbGVkLnJlc2V0KCk7CisgICAgICAgIFRocmVhZC5zbGVlcCgyNTAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1PblN1YnRpdGxlRGF0YUNhbGxlZC5nZXROdW1TaWduYWwoKSk7CisKKyAgICAgICAgbU1lZGlhUGxheWVyLnN0b3AoKTsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0VHJhY2tJbmZvRm9yVmlkZW9XaXRoU3VidGl0bGVUcmFja3MoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgaWYgKCFjaGVja0xvYWRSZXNvdXJjZShSLnJhdy50ZXN0dmlkZW9fd2l0aF8yX3N1YnRpdGxlX3RyYWNrcykpIHsKICAgICAgICAgICAgIHJldHVybjsgLy8gc2tpcDsKQEAgLTE4NTgsNiArMTk4NywxNCBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VUaW1lZFRleHRUcmFjaygpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICB0ZXN0Q2hhbmdlVGltZWRUZXh0VHJhY2tXaXRoU3BlZWQoMS4wZik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENoYW5nZVRpbWVkVGV4dFRyYWNrRmFzdCgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICB0ZXN0Q2hhbmdlVGltZWRUZXh0VHJhY2tXaXRoU3BlZWQoMi4wZik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RDaGFuZ2VUaW1lZFRleHRUcmFja1dpdGhTcGVlZChmbG9hdCBzcGVlZCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIHRlc3RUaW1lZFRleHQoUi5yYXcudGVzdHZpZGVvX3dpdGhfMl90aW1lZHRleHRfdHJhY2tzLCAyLAogICAgICAgICAgICAgICAgIG5ldyBpbnRbXSB7Ui5yYXcudGVzdF9zdWJ0aXRsZTFfc3J0LCBSLnJhdy50ZXN0X3N1YnRpdGxlMl9zcnR9LAogICAgICAgICAgICAgICAgIG5ldyBWZXJpZnlBbmRTaWduYWxUaW1lZFRleHQoKSwKQEAgLTE4NjgsNiArMjAwNSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbU9uVGltZWRUZXh0Q2FsbGVkLnJlc2V0KCk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYVBsYXllci5zdGFydCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwZWVkICE9IDEuMGYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFQbGF5ZXIuc2V0UGxheWJhY2tQYXJhbXMobmV3IFBsYXliYWNrUGFyYW1zKCkuc2V0U3BlZWQoc3BlZWQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtTWVkaWFQbGF5ZXIuaXNQbGF5aW5nKCkpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXYWl0cyB1bnRpbCBhdCBsZWFzdCB0d28gc3VidGl0bGVzIGFyZSBmaXJlZC4gVGltZW91dCBpcyAyLjUgc2VjLgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL01lZGlhUGxheWVyVGVzdEJhc2UuamF2YSBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9NZWRpYVBsYXllclRlc3RCYXNlLmphdmEKaW5kZXggOTIxZGI1YS4uZjAxNjY1YSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL01lZGlhUGxheWVyVGVzdEJhc2UuamF2YQorKysgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvTWVkaWFQbGF5ZXJUZXN0QmFzZS5qYXZhCkBAIC0yMCw2ICsyMCw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldEZpbGVEZXNjcmlwdG9yOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5jdHMuVGVzdFV0aWxzLk1vbml0b3I7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwogaW1wb3J0IGFuZHJvaWQub3MuUGVyc2lzdGFibGVCdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyOwpAQCAtNDQsNTggKzQ1LDYgQEAKICAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBTVFJFQU1fUkVUUklFUyA9IDIwOwogICAgIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBzVXNlU2NhbGVUb0ZpdE1vZGUgPSBmYWxzZTsKIAotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTW9uaXRvciB7Ci0gICAgICAgIHByaXZhdGUgaW50IG51bVNpZ25hbDsKLQotICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVzZXQoKSB7Ci0gICAgICAgICAgICBudW1TaWduYWwgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNpZ25hbCgpIHsKLSAgICAgICAgICAgIG51bVNpZ25hbCsrOwotICAgICAgICAgICAgbm90aWZ5QWxsKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gd2FpdEZvclNpZ25hbCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXR1cm4gd2FpdEZvckNvdW50ZWRTaWduYWxzKDEpID4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IHdhaXRGb3JDb3VudGVkU2lnbmFscyhpbnQgdGFyZ2V0Q291bnQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICB3aGlsZSAobnVtU2lnbmFsIDwgdGFyZ2V0Q291bnQpIHsKLSAgICAgICAgICAgICAgICB3YWl0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVtU2lnbmFsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHdhaXRGb3JTaWduYWwobG9uZyB0aW1lb3V0TXMpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXR1cm4gd2FpdEZvckNvdW50ZWRTaWduYWxzKDEsIHRpbWVvdXRNcykgPiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgd2FpdEZvckNvdW50ZWRTaWduYWxzKGludCB0YXJnZXRDb3VudCwgbG9uZyB0aW1lb3V0TXMpCi0gICAgICAgICAgICAgICAgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGlmICh0aW1lb3V0TXMgPT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiB3YWl0Rm9yQ291bnRlZFNpZ25hbHModGFyZ2V0Q291bnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbG9uZyBkZWFkbGluZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgdGltZW91dE1zOwotICAgICAgICAgICAgd2hpbGUgKG51bVNpZ25hbCA8IHRhcmdldENvdW50KSB7Ci0gICAgICAgICAgICAgICAgbG9uZyBkZWxheSA9IGRlYWRsaW5lIC0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGRlbGF5IDw9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHdhaXQoZGVsYXkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bVNpZ25hbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc1NpZ25hbGxlZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBudW1TaWduYWwgPj0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldE51bVNpZ25hbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBudW1TaWduYWw7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBwcm90ZWN0ZWQgTW9uaXRvciBtT25WaWRlb1NpemVDaGFuZ2VkQ2FsbGVkID0gbmV3IE1vbml0b3IoKTsKICAgICBwcm90ZWN0ZWQgTW9uaXRvciBtT25WaWRlb1JlbmRlcmluZ1N0YXJ0Q2FsbGVkID0gbmV3IE1vbml0b3IoKTsKICAgICBwcm90ZWN0ZWQgTW9uaXRvciBtT25CdWZmZXJpbmdVcGRhdGVDYWxsZWQgPSBuZXcgTW9uaXRvcigpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL01lZGlhUmFuZG9tVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL01lZGlhUmFuZG9tVGVzdC5qYXZhCmluZGV4IGE4ZmM3MDMuLmUwMTY3MzAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9NZWRpYVJhbmRvbVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvTWVkaWFSYW5kb21UZXN0LmphdmEKQEAgLTIwLDYgKzIwLDcgQEAKIAogaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFSZWNvcmRlcjsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlcjsKIGltcG9ydCBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI7CiBpbXBvcnQgYW5kcm9pZC5vcy5FbnZpcm9ubWVudDsKQEAgLTQwLDYgKzQxLDcgQEAKICAqIEJsZW5kZXIgRm91bmRhdGlvbiAvIHd3dy5iaWdidWNrYnVubnkub3JnLCBhbmQgYXJlIGxpY2Vuc2VkIHVuZGVyIHRoZSBDcmVhdGl2ZSBDb21tb25zCiAgKiBBdHRyaWJ1dGlvbiAzLjAgTGljZW5zZSBhdCBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS8zLjAvdXMvLgogICovCitAQXBwTW9kZUZ1bGwocmVhc29uID0gIlRPRE86IGV2YWx1YXRlIGFuZCBwb3J0IHRvIGluc3RhbnQiKQogcHVibGljIGNsYXNzIE1lZGlhUmFuZG9tVGVzdCBleHRlbmRzIEFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyPE1lZGlhU3R1YkFjdGl2aXR5PiB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVJhbmRvbVRlc3QiOwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvTWVkaWFSZWNvcmRlclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9NZWRpYVJlY29yZGVyVGVzdC5qYXZhCmluZGV4IDM3ODI0MTYuLjZjNzEyZWUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9NZWRpYVJlY29yZGVyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9NZWRpYVJlY29yZGVyVGVzdC5qYXZhCkBAIC0xNSw2ICsxNSw4IEBACiAgKi8KIHBhY2thZ2UgYW5kcm9pZC5tZWRpYS5jdHM7CiAKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5NZWRpYUNvZGVjSW5mby5Db2RlY1Byb2ZpbGVMZXZlbC4qOworCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3I7CkBAIC0yMiwzMSArMjQsMzEgQEAKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLkNhbWVyYTsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkNhbWNvcmRlclByb2ZpbGU7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5FbmNvZGVyQ2FwYWJpbGl0aWVzOworaW1wb3J0IGFuZHJvaWQubWVkaWEuRW5jb2RlckNhcGFiaWxpdGllcy5WaWRlb0VuY29kZXJDYXA7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvZGVjOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb2RlY0luZm87CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvZGVjSW5mby5Db2RlY0NhcGFiaWxpdGllczsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29kZWNMaXN0OwogaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFFeHRyYWN0b3I7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUZvcm1hdDsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVJlY29yZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuRW5jb2RlckNhcGFiaWxpdGllcy5WaWRlb0VuY29kZXJDYXA7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvZGVjSW5mby5Db2RlY0NhcGFiaWxpdGllczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29kZWNJbmZvLkNvZGVjUHJvZmlsZUxldmVsOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFSZWNvcmRlci5PbkVycm9yTGlzdGVuZXI7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVJlY29yZGVyLk9uSW5mb0xpc3RlbmVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YVJldHJpZXZlcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1pY3JvcGhvbmVJbmZvOwogaW1wb3J0IGFuZHJvaWQub3BlbmdsLkdMRVMyMDsKIGltcG9ydCBhbmRyb2lkLm9zLkNvbmRpdGlvblZhcmlhYmxlOwogaW1wb3J0IGFuZHJvaWQub3MuRW52aXJvbm1lbnQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBhbmRyb2lkLm9zLlBlcnNpc3RhYmxlQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIGltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUmVxdWlyZXNEZXZpY2U7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyOwogaW1wb3J0IGFuZHJvaWQudGVzdC5VaVRocmVhZFRlc3Q7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZTsKIAotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuTWVkaWFVdGlsczsKIApAQCAtNTUsNyArNTcsNiBAQAogaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZTsKLWltcG9ydCBqYXZhLmxhbmcuSW50ZXJydXB0ZWRFeGNlcHRpb247CiBpbXBvcnQgamF2YS5sYW5nLlJ1bm5hYmxlOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CkBAIC02MywxMCArNjQsOSBAQAogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuTWVkaWFDb2RlY0luZm8uQ29kZWNQcm9maWxlTGV2ZWwuKjsKLQogQFNtYWxsVGVzdAogQFJlcXVpcmVzRGV2aWNlCitAQXBwTW9kZUZ1bGwocmVhc29uID0gIlRPRE86IGV2YWx1YXRlIGFuZCBwb3J0IHRvIGluc3RhbnQiKQogcHVibGljIGNsYXNzIE1lZGlhUmVjb3JkZXJUZXN0IGV4dGVuZHMgQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI8TWVkaWFTdHViQWN0aXZpdHk+IHsKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFSZWNvcmRlclRlc3QiOwogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIE9VVFBVVF9QQVRIOwpAQCAtNjA3LDYgKzYwNyw0OCBAQAogICAgICAgICByZXR1cm4gMTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QWN0aXZlTWljcm9waG9uZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFoYXNNaWNyb3Bob25lKCkgfHwgIWhhc0FhYygpKSB7CisgICAgICAgICAgICBNZWRpYVV0aWxzLnNraXBUZXN0KCJubyBhdWRpbyBjb2RlY3Mgb3IgbWljcm9waG9uZSIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1NZWRpYVJlY29yZGVyLnNldEF1ZGlvU291cmNlKE1lZGlhUmVjb3JkZXIuQXVkaW9Tb3VyY2UuTUlDKTsKKyAgICAgICAgbU1lZGlhUmVjb3JkZXIuc2V0T3V0cHV0Rm9ybWF0KE1lZGlhUmVjb3JkZXIuT3V0cHV0Rm9ybWF0LlRIUkVFX0dQUCk7CisgICAgICAgIG1NZWRpYVJlY29yZGVyLnNldE91dHB1dEZpbGUoT1VUUFVUX1BBVEgpOworICAgICAgICBtTWVkaWFSZWNvcmRlci5zZXRBdWRpb0VuY29kZXIoTWVkaWFSZWNvcmRlci5BdWRpb0VuY29kZXIuQUFDKTsKKyAgICAgICAgbU1lZGlhUmVjb3JkZXIuc2V0TWF4RmlsZVNpemUoTUFYX0ZJTEVfU0laRSAqIDEwKTsKKyAgICAgICAgbU1lZGlhUmVjb3JkZXIucHJlcGFyZSgpOworICAgICAgICBtTWVkaWFSZWNvcmRlci5zdGFydCgpOworICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7CisgICAgICAgIExpc3Q8TWljcm9waG9uZUluZm8+IGFjdGl2ZU1pY3JvcGhvbmVzID0gbU1lZGlhUmVjb3JkZXIuZ2V0QWN0aXZlTWljcm9waG9uZXMoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShhY3RpdmVNaWNyb3Bob25lcy5zaXplKCkgPiAwKTsKKyAgICAgICAgZm9yIChNaWNyb3Bob25lSW5mbyBhY3RpdmVNaWNyb3Bob25lIDogYWN0aXZlTWljcm9waG9uZXMpIHsKKyAgICAgICAgICAgIHByaW50TWljcm9waG9uZUluZm8oYWN0aXZlTWljcm9waG9uZSk7CisgICAgICAgIH0KKyAgICAgICAgbU1lZGlhUmVjb3JkZXIuc3RvcCgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcmludE1pY3JvcGhvbmVJbmZvKE1pY3JvcGhvbmVJbmZvIG1pY3JvcGhvbmUpIHsKKyAgICAgICAgTG9nLmkoVEFHLCAiZGV2aWNlSWQ6IiArIG1pY3JvcGhvbmUuZ2V0RGVzY3JpcHRpb24oKSk7CisgICAgICAgIExvZy5pKFRBRywgInBvcnRJZDoiICsgbWljcm9waG9uZS5nZXRJZCgpKTsKKyAgICAgICAgTG9nLmkoVEFHLCAidHlwZToiICsgbWljcm9waG9uZS5nZXRUeXBlKCkpOworICAgICAgICBMb2cuaShUQUcsICJhZGRyZXNzOiIgKyBtaWNyb3Bob25lLmdldEFkZHJlc3MoKSk7CisgICAgICAgIExvZy5pKFRBRywgImRldmljZUxvY2F0aW9uOiIgKyBtaWNyb3Bob25lLmdldExvY2F0aW9uKCkpOworICAgICAgICBMb2cuaShUQUcsICJkZXZpY2VHcm91cDoiICsgbWljcm9waG9uZS5nZXRHcm91cCgpCisgICAgICAgICAgICArICIgaW5kZXg6IiArIG1pY3JvcGhvbmUuZ2V0SW5kZXhJblRoZUdyb3VwKCkpOworICAgICAgICBNaWNyb3Bob25lSW5mby5Db29yZGluYXRlM0YgcG9zaXRpb24gPSBtaWNyb3Bob25lLmdldFBvc2l0aW9uKCk7CisgICAgICAgIExvZy5pKFRBRywgInBvc2l0aW9uOiIgKyBwb3NpdGlvbi54ICsgIiwiICsgcG9zaXRpb24ueSArICIsIiArIHBvc2l0aW9uLnopOworICAgICAgICBNaWNyb3Bob25lSW5mby5Db29yZGluYXRlM0Ygb3JpZW50YXRpb24gPSBtaWNyb3Bob25lLmdldE9yaWVudGF0aW9uKCk7CisgICAgICAgIExvZy5pKFRBRywgIm9yaWVudGF0aW9uOiIgKyBvcmllbnRhdGlvbi54ICsgIiwiICsgb3JpZW50YXRpb24ueSArICIsIiArIG9yaWVudGF0aW9uLnopOworICAgICAgICBMb2cuaShUQUcsICJmcmVxdWVuY3lSZXNwb25zZToiICsgbWljcm9waG9uZS5nZXRGcmVxdWVuY3lSZXNwb25zZSgpKTsKKyAgICAgICAgTG9nLmkoVEFHLCAiY2hhbm5lbE1hcHBpbmc6IiArIG1pY3JvcGhvbmUuZ2V0Q2hhbm5lbE1hcHBpbmcoKSk7CisgICAgICAgIExvZy5pKFRBRywgInNlbnNpdGl2aXR5OiIgKyBtaWNyb3Bob25lLmdldFNlbnNpdGl2aXR5KCkpOworICAgICAgICBMb2cuaShUQUcsICJtYXggc3BsOiIgKyBtaWNyb3Bob25lLmdldE1heFNwbCgpKTsKKyAgICAgICAgTG9nLmkoVEFHLCAibWluIHNwbDoiICsgbWljcm9waG9uZS5nZXRNaW5TcGwoKSk7CisgICAgICAgIExvZy5pKFRBRywgImRpcmVjdGlvbmFsaXR5OiIgKyBtaWNyb3Bob25lLmdldERpcmVjdGlvbmFsaXR5KCkpOworICAgICAgICBMb2cuaShUQUcsICIqKioqKioiKTsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVjb3JkQXVkaW9Gcm9tQXVkaW9Tb3VyY2VVbnByb2Nlc3NlZCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBpZiAoIWhhc01pY3JvcGhvbmUoKSB8fCAhaGFzQW1yTmIoKSkgewogICAgICAgICAgICAgTWVkaWFVdGlscy5za2lwVGVzdCgibm8gYXVkaW8gY29kZWNzIG9yIG1pY3JvcGhvbmUiKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9NZWRpYVJvdXRlclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9NZWRpYVJvdXRlclRlc3QuamF2YQppbmRleCA0YjkxYTc5Li5mMDVmY2Q3IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvTWVkaWFSb3V0ZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL01lZGlhUm91dGVyVGVzdC5qYXZhCkBAIC0zMCw2ICszMCw3IEBACiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm87CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Vc2VyUm91dGVJbmZvOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuUmVtb3RlQ29udHJvbENsaWVudDsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CiBpbXBvcnQgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RDYXNlOwogCiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CkBAIC0zOCw2ICszOSw3IEBACiAvKioKICAqIFRlc3Qge0BsaW5rIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXJ9LgogICovCitAQXBwTW9kZUZ1bGwocmVhc29uID0gIlRPRE86IGV2YWx1YXRlIGFuZCBwb3J0IHRvIGluc3RhbnQiKQogcHVibGljIGNsYXNzIE1lZGlhUm91dGVyVGVzdCBleHRlbmRzIEluc3RydW1lbnRhdGlvblRlc3RDYXNlIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBURVNUX1JPVVRFX05BTUVfUkVTT1VSQ0VfSUQgPSBSLnN0cmluZy50ZXN0X3VzZXJfcm91dGVfbmFtZTsKQEAgLTM0OSw4ICszNTEsNyBAQAogICAgICAgICBNZWRpYVJvdXRlci5TaW1wbGVDYWxsYmFjayBtcnNjID0gKE1lZGlhUm91dGVyLlNpbXBsZUNhbGxiYWNrKSBjYWxsYmFjazsKIAogICAgICAgICBmaW5hbCBpbnQgYWxsUm91dGVUeXBlcyA9IE1lZGlhUm91dGVyLlJPVVRFX1RZUEVfTElWRV9BVURJTwotICAgICAgICAgICAgICAgIHwgTWVkaWFSb3V0ZXIuUk9VVEVfVFlQRV9MSVZFX1ZJREVPIHwgTWVkaWFSb3V0ZXIuUk9VVEVfVFlQRV9SRU1PVEVfRElTUExBWQotICAgICAgICAgICAgICAgIHwgTWVkaWFSb3V0ZXIuUk9VVEVfVFlQRV9VU0VSOworICAgICAgICAgICAgICAgIHwgTWVkaWFSb3V0ZXIuUk9VVEVfVFlQRV9MSVZFX1ZJREVPIHwgTWVkaWFSb3V0ZXIuUk9VVEVfVFlQRV9VU0VSOwogICAgICAgICBtTWVkaWFSb3V0ZXIuYWRkQ2FsbGJhY2soYWxsUm91dGVUeXBlcywgY2FsbGJhY2spOwogCiAgICAgICAgIC8vIFRlc3Qgb25Sb3V0ZUFkZGVkKCkuCkBAIC0zNjMsNyArMzY0LDcgQEAKICAgICAgICAgbXJjLm9uUm91dGVBZGRlZChtTWVkaWFSb3V0ZXIsIGNhbGxiYWNrLm1BZGRlZFJvdXRlKTsKICAgICAgICAgbXJzYy5vblJvdXRlQWRkZWQobU1lZGlhUm91dGVyLCBjYWxsYmFjay5tQWRkZWRSb3V0ZSk7CiAKLSAgICAgICAgUm91dGVJbmZvIHByZXZTZWxlY3RlZFJvdXRlID0gbU1lZGlhUm91dGVyLmdldFNlbGVjdGVkUm91dGUoKTsKKyAgICAgICAgUm91dGVJbmZvIHByZXZTZWxlY3RlZFJvdXRlID0gbU1lZGlhUm91dGVyLmdldFNlbGVjdGVkUm91dGUoYWxsUm91dGVUeXBlcyk7CiAKICAgICAgICAgLy8gVGVzdCBvblJvdXRlU2VsZWN0ZWQoKSBhbmQgb25Sb3V0ZVVuc2VsZWN0ZWQoKS4KICAgICAgICAgY2FsbGJhY2sucmVzZXQoKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9NZWRpYVNjYW5uZXJDb25uZWN0aW9uVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL01lZGlhU2Nhbm5lckNvbm5lY3Rpb25UZXN0LmphdmEKaW5kZXggMmJkNjk5Zi4uZmU0MGZhYSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL01lZGlhU2Nhbm5lckNvbm5lY3Rpb25UZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL01lZGlhU2Nhbm5lckNvbm5lY3Rpb25UZXN0LmphdmEKQEAgLTI1LDYgKzI1LDcgQEAKIGltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Nhbm5lckNvbm5lY3Rpb24uTWVkaWFTY2FubmVyQ29ubmVjdGlvbkNsaWVudDsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIGltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwogCiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5GaWxlQ29weUhlbHBlcjsKQEAgLTM0LDYgKzM1LDcgQEAKIGltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIAorQEFwcE1vZGVGdWxsKHJlYXNvbiA9ICJUT0RPOiBldmFsdWF0ZSBhbmQgcG9ydCB0byBpbnN0YW50IikKIHB1YmxpYyBjbGFzcyBNZWRpYVNjYW5uZXJDb25uZWN0aW9uVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVESUFfVFlQRSA9ICJhdWRpby9tcGVnIjsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9NZWRpYVNjYW5uZXJOb3RpZmljYXRpb25UZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvTWVkaWFTY2FubmVyTm90aWZpY2F0aW9uVGVzdC5qYXZhCmluZGV4IGEyMGU4NzQuLjUyZGE2NDEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9NZWRpYVNjYW5uZXJOb3RpZmljYXRpb25UZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL01lZGlhU2Nhbm5lck5vdGlmaWNhdGlvblRlc3QuamF2YQpAQCAtMjEsNiArMjEsNyBAQAogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIGltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwpAQCAtMjksNiArMzAsNyBAQAogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogCitAQXBwTW9kZUZ1bGwocmVhc29uID0gIlRPRE86IGV2YWx1YXRlIGFuZCBwb3J0IHRvIGluc3RhbnQiKQogcHVibGljIGNsYXNzIE1lZGlhU2Nhbm5lck5vdGlmaWNhdGlvblRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgewogCiAgICAgcHVibGljIHZvaWQgdGVzdE1lZGlhU2Nhbm5lck5vdGlmaWNhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL01lZGlhU2Nhbm5lclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9NZWRpYVNjYW5uZXJUZXN0LmphdmEKaW5kZXggMTM3YjdjZi4uODliNTZlOCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL01lZGlhU2Nhbm5lclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvTWVkaWFTY2FubmVyVGVzdC5qYXZhCkBAIC0xNiw4ICsxNiw2IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5tZWRpYS5jdHM7CiAKLWltcG9ydCBhbmRyb2lkLm1lZGlhLmN0cy5SOwotCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFVyaXM7CkBAIC0zMCwxOCArMjgsMjEgQEAKIGltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNjYW5uZXJDb25uZWN0aW9uOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTY2FubmVyQ29ubmVjdGlvbi5NZWRpYVNjYW5uZXJDb25uZWN0aW9uQ2xpZW50OworaW1wb3J0IGFuZHJvaWQubWVkaWEuY3RzLlI7CiBpbXBvcnQgYW5kcm9pZC5tdHAuTXRwQ29uc3RhbnRzOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUmVxdWlyZXNEZXZpY2U7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5FbnZpcm9ubWVudDsKIGltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlJlcXVpcmVzRGV2aWNlOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuTWVkaWFTdG9yZTsKIGltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworCiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5GaWxlQ29weUhlbHBlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlBvbGxpbmdDaGVjazsKIApAQCAtNTAsNiArNTEsNyBAQAogCiBAU21hbGxUZXN0CiBAUmVxdWlyZXNEZXZpY2UKK0BBcHBNb2RlRnVsbChyZWFzb24gPSAiVE9ETzogZXZhbHVhdGUgYW5kIHBvcnQgdG8gaW5zdGFudCIpCiBwdWJsaWMgY2xhc3MgTWVkaWFTY2FubmVyVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVESUFfVFlQRSA9ICJhdWRpby9tcGVnIjsKQEAgLTExMCw2ICsxMTIsNzYgQEAKICAgICAgICAgICAgICAgICAiX2RhdGEgbGlrZSA/IiwgbmV3IFN0cmluZ1tdIHsgbUZpbGVEaXIgKyAiJSJ9KTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9jYWxpemVSaW5ndG9uZVRpdGxlcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtTWVkaWFTY2FubmVyQ29ubmVjdGlvbkNsaWVudCA9IG5ldyBNb2NrTWVkaWFTY2FubmVyQ29ubmVjdGlvbkNsaWVudCgpOworICAgICAgICBtTWVkaWFTY2FubmVyQ29ubmVjdGlvbiA9IG5ldyBNb2NrTWVkaWFTY2FubmVyQ29ubmVjdGlvbihnZXRDb250ZXh0KCksCisgICAgICAgICAgICBtTWVkaWFTY2FubmVyQ29ubmVjdGlvbkNsaWVudCk7CisKKyAgICAgICAgYXNzZXJ0RmFsc2UobU1lZGlhU2Nhbm5lckNvbm5lY3Rpb24uaXNDb25uZWN0ZWQoKSk7CisKKyAgICAgICAgLy8gc3RhcnQgY29ubmVjdGlvbiBhbmQgd2FpdCB1bnRpbCBjb25uZWN0ZWQKKyAgICAgICAgbU1lZGlhU2Nhbm5lckNvbm5lY3Rpb24uY29ubmVjdCgpOworICAgICAgICBjaGVja0Nvbm5lY3Rpb25TdGF0ZSh0cnVlKTsKKworICAgICAgICAvLyBXcml0ZSB1bmxvY2FsaXphYmxlIGF1ZGlvIGZpbGUgYW5kIHNjYW4gdG8gaW5zZXJ0IGludG8gZGF0YWJhc2UKKyAgICAgICAgZmluYWwgU3RyaW5nIHVubG9jYWxpemFibGVQYXRoID0gbUZpbGVEaXIgKyAiL3VubG9jYWxpemFibGUubXAzIjsKKyAgICAgICAgd3JpdGVGaWxlKFIucmF3LnRlc3RtcDMsIHVubG9jYWxpemFibGVQYXRoKTsKKyAgICAgICAgbU1lZGlhU2Nhbm5lckNvbm5lY3Rpb24uc2NhbkZpbGUodW5sb2NhbGl6YWJsZVBhdGgsIG51bGwpOworICAgICAgICBjaGVja01lZGlhU2Nhbm5lckNvbm5lY3Rpb24oKTsKKyAgICAgICAgZmluYWwgVXJpIG1lZGlhMVVyaSA9IG1NZWRpYVNjYW5uZXJDb25uZWN0aW9uQ2xpZW50Lm1lZGlhVXJpOworCisgICAgICAgIC8vIEVuc3VyZSB1bmxvY2FsaXphYmxlIHRpdGxlcyBjb21lIGJhY2sgY29ycmVjdGx5CisgICAgICAgIGZpbmFsIENvbnRlbnRSZXNvbHZlciByZXMgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHVubG9jYWxpemVkVGl0bGUgPSAiQ2hpbWV5IFBob25lIjsKKyAgICAgICAgQ3Vyc29yIGMgPSByZXMucXVlcnkobWVkaWExVXJpLCBuZXcgU3RyaW5nW10geyAidGl0bGUiIH0sIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYy5nZXRDb3VudCgpKTsKKyAgICAgICAgYy5tb3ZlVG9GaXJzdCgpOworICAgICAgICBhc3NlcnRFcXVhbHModW5sb2NhbGl6ZWRUaXRsZSwgYy5nZXRTdHJpbmcoMCkpOworCisgICAgICAgIG1NZWRpYVNjYW5uZXJDb25uZWN0aW9uQ2xpZW50LnJlc2V0KCk7CisKKyAgICAgICAgLy8gV3JpdGUgbG9jYWxpemFibGUgYXVkaW8gZmlsZSBhbmQgc2NhbiB0byBpbnNlcnQgaW50byBkYXRhYmFzZQorICAgICAgICBmaW5hbCBTdHJpbmcgbG9jYWxpemFibGVQYXRoID0gbUZpbGVEaXIgKyAiL2xvY2FsaXphYmxlLm1wMyI7CisgICAgICAgIHdyaXRlRmlsZShSLnJhdy50ZXN0bXAzXzQsIGxvY2FsaXphYmxlUGF0aCk7CisgICAgICAgIG1NZWRpYVNjYW5uZXJDb25uZWN0aW9uLnNjYW5GaWxlKGxvY2FsaXphYmxlUGF0aCwgbnVsbCk7CisgICAgICAgIGNoZWNrTWVkaWFTY2FubmVyQ29ubmVjdGlvbigpOworICAgICAgICBmaW5hbCBVcmkgbWVkaWEyVXJpID0gbU1lZGlhU2Nhbm5lckNvbm5lY3Rpb25DbGllbnQubWVkaWFVcmk7CisKKyAgICAgICAgLy8gRW5zdXJlIGxvY2FsaXplZCB0aXRsZSBjb21lcyBiYWNrIGxvY2FsaXplZAorICAgICAgICBmaW5hbCBTdHJpbmcgbG9jYWxpemVkVGl0bGUgPSBtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcudGVzdF9sb2NhbGl6YWJsZV90aXRsZSk7CisgICAgICAgIGMgPSByZXMucXVlcnkobWVkaWEyVXJpLCBuZXcgU3RyaW5nW10geyAidGl0bGUiIH0sIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYy5nZXRDb3VudCgpKTsKKyAgICAgICAgYy5tb3ZlVG9GaXJzdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMobG9jYWxpemVkVGl0bGUsIGMuZ2V0U3RyaW5nKDApKTsKKworICAgICAgICAvLyBVcGRhdGUgbG9jYWxpemFibGUgYXVkaW8gZmlsZSB0byBoYXZlIHVubG9jYWxpemFibGUgdGl0bGUKKyAgICAgICAgZmluYWwgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOworICAgICAgICBmaW5hbCBTdHJpbmcgbmV3VGl0bGUgPSAiTmV3IFRpdGxlIjsKKyAgICAgICAgdmFsdWVzLnB1dCgidGl0bGUiLCBuZXdUaXRsZSk7CisgICAgICAgIHJlcy51cGRhdGUobWVkaWEyVXJpLCB2YWx1ZXMsIG51bGwsIG51bGwpOworCisgICAgICAgIC8vIEVuc3VyZSB0aXRsZSBjb21lcyBiYWNrIGNvcnJlY3RseQorICAgICAgICBjID0gcmVzLnF1ZXJ5KG1lZGlhMlVyaSwgbmV3IFN0cmluZ1tdIHsgInRpdGxlIiB9LCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGMuZ2V0Q291bnQoKSk7CisgICAgICAgIGMubW92ZVRvRmlyc3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ld1RpdGxlLCBjLmdldFN0cmluZygwKSk7CisKKyAgICAgICAgLy8gVXBkYXRlIGF1ZGlvIGZpbGUgdG8gaGF2ZSBsb2NhbGl6YWJsZSB0aXRsZSBvbmNlIGFnYWluCisgICAgICAgIGZpbmFsIFN0cmluZyBuZXdMb2NhbGl6YWJsZVRpdGxlID0KKyAgICAgICAgICAgICJhbmRyb2lkLnJlc291cmNlOi8vYW5kcm9pZC5tZWRpYS5jdHMvc3RyaW5nL3Rlc3RfbG9jYWxpemFibGVfdGl0bGUiOworICAgICAgICB2YWx1ZXMucHV0KCJ0aXRsZSIsIG5ld0xvY2FsaXphYmxlVGl0bGUpOworICAgICAgICByZXMudXBkYXRlKG1lZGlhMlVyaSwgdmFsdWVzLCBudWxsLCBudWxsKTsKKworICAgICAgICAvLyBFbnN1cmUgdGl0bGUgY29tZXMgYmFjayBsb2NhbGl6ZWQKKyAgICAgICAgYyA9IHJlcy5xdWVyeShtZWRpYTJVcmksIG5ldyBTdHJpbmdbXSB7ICJ0aXRsZSIgfSwgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBjLmdldENvdW50KCkpOworICAgICAgICBjLm1vdmVUb0ZpcnN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhsb2NhbGl6ZWRUaXRsZSwgYy5nZXRTdHJpbmcoMCkpOworCisgICAgICAgIG1NZWRpYVNjYW5uZXJDb25uZWN0aW9uLmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgYy5jbG9zZSgpOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHRlc3RNZWRpYVNjYW5uZXIoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKICAgICAgICAgbU1lZGlhU2Nhbm5lckNvbm5lY3Rpb25DbGllbnQgPSBuZXcgTW9ja01lZGlhU2Nhbm5lckNvbm5lY3Rpb25DbGllbnQoKTsKICAgICAgICAgbU1lZGlhU2Nhbm5lckNvbm5lY3Rpb24gPSBuZXcgTW9ja01lZGlhU2Nhbm5lckNvbm5lY3Rpb24oZ2V0Q29udGV4dCgpLApAQCAtMzIxLDExICszOTMsMjEgQEAKICAgICAgICAgbU1lZGlhU2Nhbm5lckNvbm5lY3Rpb24uY29ubmVjdCgpOwogICAgICAgICBjaGVja0Nvbm5lY3Rpb25TdGF0ZSh0cnVlKTsKIAorICAgICAgICAvLyB0ZXN0IHVubG9jYWxpemFibGUgZmlsZQorICAgICAgICBjYW5vbmljYWxpemVUZXN0KFIucmF3LnRlc3RtcDMpOworCisgICAgICAgIG1NZWRpYVNjYW5uZXJDb25uZWN0aW9uQ2xpZW50LnJlc2V0KCk7CisKKyAgICAgICAgLy8gdGVzdCBsb2NhbGl6YWJsZSBmaWxlCisgICAgICAgIGNhbm9uaWNhbGl6ZVRlc3QoUi5yYXcudGVzdG1wM180KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2Fub25pY2FsaXplVGVzdChpbnQgcmVzSWQpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyB3cml0ZSBmaWxlIGFuZCBzY2FuIHRvIGluc2VydCBpbnRvIGRhdGFiYXNlCiAgICAgICAgIFN0cmluZyBmaWxlRGlyID0gRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlRGlyZWN0b3J5KCkgKyAiLyIKICAgICAgICAgICAgICAgICArIGdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpICsgIi9jYW5vbmljYWx0ZXN0LSIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gZmlsZURpciArICIvdGVzdC5tcDMiOwotICAgICAgICB3cml0ZUZpbGUoUi5yYXcudGVzdG1wMywgZmlsZU5hbWUpOworICAgICAgICB3cml0ZUZpbGUocmVzSWQsIGZpbGVOYW1lKTsKICAgICAgICAgbU1lZGlhU2Nhbm5lckNvbm5lY3Rpb24uc2NhbkZpbGUoZmlsZU5hbWUsIE1FRElBX1RZUEUpOwogICAgICAgICBjaGVja01lZGlhU2Nhbm5lckNvbm5lY3Rpb24oKTsKIApAQCAtMzUwLDcgKzQzMiw3IEBACiAgICAgICAgIC8vIHdyaXRlIHNhbWUgZmlsZSBhZ2FpbiBhbmQgc2NhbiB0byBpbnNlcnQgaW50byBkYXRhYmFzZQogICAgICAgICBtTWVkaWFTY2FubmVyQ29ubmVjdGlvbkNsaWVudC5yZXNldCgpOwogICAgICAgICBTdHJpbmcgZmlsZU5hbWUyID0gZmlsZURpciArICIvdGVzdDIubXAzIjsKLSAgICAgICAgd3JpdGVGaWxlKFIucmF3LnRlc3RtcDMsIGZpbGVOYW1lMik7CisgICAgICAgIHdyaXRlRmlsZShyZXNJZCwgZmlsZU5hbWUyKTsKICAgICAgICAgbU1lZGlhU2Nhbm5lckNvbm5lY3Rpb24uc2NhbkZpbGUoZmlsZU5hbWUyLCBNRURJQV9UWVBFKTsKICAgICAgICAgY2hlY2tNZWRpYVNjYW5uZXJDb25uZWN0aW9uKCk7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9NZWRpYVNlc3Npb25NYW5hZ2VyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL01lZGlhU2Vzc2lvbk1hbmFnZXJUZXN0LmphdmEKaW5kZXggN2NhMTMxMC4uOTI2YWJkOCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL01lZGlhU2Vzc2lvbk1hbmFnZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL01lZGlhU2Vzc2lvbk1hbmFnZXJUZXN0LmphdmEKQEAgLTE1LDEzICsxNSwxMyBAQAogICovCiBwYWNrYWdlIGFuZHJvaWQubWVkaWEuY3RzOwogCitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuU3lzdGVtVXRpbDsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYUNvbnRyb2xsZXI7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLk1lZGlhU2Vzc2lvbjsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uTWVkaWFTZXNzaW9uTWFuYWdlcjsKQEAgLTM5LDYgKzM5LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKIAorQEFwcE1vZGVGdWxsKHJlYXNvbiA9ICJUT0RPOiBldmFsdWF0ZSBhbmQgcG9ydCB0byBpbnN0YW50IikKIHB1YmxpYyBjbGFzcyBNZWRpYVNlc3Npb25NYW5hZ2VyVGVzdCBleHRlbmRzIEluc3RydW1lbnRhdGlvblRlc3RDYXNlIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhU2Vzc2lvbk1hbmFnZXJUZXN0IjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVElNRU9VVF9NUyA9IDMwMDA7CkBAIC0xMDUsOSArMTA2LDEwIEBACiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0T25Wb2x1bWVLZXlMb25nUHJlc3NMaXN0ZW5lcigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRUYXJnZXRDb250ZXh0KCk7Ci0gICAgICAgIGlmIChjb250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCkuaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX0xFQU5CQUNLKSB8fAotICAgICAgICAgICAgY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRCb29sZWFuKFJlc291cmNlcy5nZXRTeXN0ZW0oKS5nZXRJZGVudGlmaWVyKAotICAgICAgICAgICAgICAgImNvbmZpZ19oYW5kbGVWb2x1bWVLZXlzSW5XaW5kb3dNYW5hZ2VyIiwgImJvb2wiLCAiYW5kcm9pZCIpKSkgeworICAgICAgICBpZiAoY29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9MRUFOQkFDSykKKyAgICAgICAgICAgICAgICB8fCBjb250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCkuaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX1dBVENIKQorICAgICAgICAgICAgICAgIHx8IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0Qm9vbGVhbihSZXNvdXJjZXMuZ2V0U3lzdGVtKCkuZ2V0SWRlbnRpZmllcigKKyAgICAgICAgICAgICAgICAgICAgICAgICJjb25maWdfaGFuZGxlVm9sdW1lS2V5c0luV2luZG93TWFuYWdlciIsICJib29sIiwgImFuZHJvaWQiKSkpIHsKICAgICAgICAgICAgIC8vIFNraXAgdGhpcyB0ZXN0LCBiZWNhdXNlIHRoZSBQaG9uZVdpbmRvd01hbmFnZXIgZGlzcGF0Y2hlcyB2b2x1bWUga2V5CiAgICAgICAgICAgICAvLyBldmVudHMgZGlyZWN0bHkgdG8gdGhlIGF1ZGlvIHNlcnZpY2UgdG8gY2hhbmdlIHRoZSBzeXN0ZW0gdm9sdW1lLgogICAgICAgICAgICAgcmV0dXJuOwpAQCAtMTQ5LDU5ICsxNTEsMTIwIEBACiAgICAgICAgIGhhbmRsZXJUaHJlYWQuc3RhcnQoKTsKICAgICAgICAgSGFuZGxlciBoYW5kbGVyID0gbmV3IEhhbmRsZXIoaGFuZGxlclRocmVhZC5nZXRMb29wZXIoKSk7CiAKLSAgICAgICAgTWVkaWFTZXNzaW9uQ2FsbGJhY2sgY2FsbGJhY2sgPSBuZXcgTWVkaWFTZXNzaW9uQ2FsbGJhY2soMik7Ci0gICAgICAgIE1lZGlhU2Vzc2lvbiBzZXNzaW9uID0gbmV3IE1lZGlhU2Vzc2lvbihnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRUYXJnZXRDb250ZXh0KCksIFRBRyk7Ci0gICAgICAgIHNlc3Npb24uc2V0RmxhZ3MoTWVkaWFTZXNzaW9uLkZMQUdfSEFORExFU19NRURJQV9CVVRUT05TCi0gICAgICAgICAgICAgICAgfCBNZWRpYVNlc3Npb24uRkxBR19IQU5ETEVTX1RSQU5TUE9SVF9DT05UUk9MUyk7Ci0gICAgICAgIHNlc3Npb24uc2V0Q2FsbGJhY2soY2FsbGJhY2ssIGhhbmRsZXIpOwotICAgICAgICBQbGF5YmFja1N0YXRlIHN0YXRlID0gbmV3IFBsYXliYWNrU3RhdGUuQnVpbGRlcigpCi0gICAgICAgICAgICAgICAgLnNldFN0YXRlKFBsYXliYWNrU3RhdGUuU1RBVEVfUExBWUlORywgMCwgMS4wZikuYnVpbGQoKTsKLSAgICAgICAgLy8gRmFrZSB0aGUgbWVkaWEgc2Vzc2lvbiBzZXJ2aWNlIHNvIHRoaXMgc2Vzc2lvbiBjYW4gdGFrZSB0aGUgbWVkaWEga2V5IGV2ZW50cy4KLSAgICAgICAgc2Vzc2lvbi5zZXRQbGF5YmFja1N0YXRlKHN0YXRlKTsKLSAgICAgICAgc2Vzc2lvbi5zZXRBY3RpdmUodHJ1ZSk7CisgICAgICAgIE1lZGlhU2Vzc2lvbiBzZXNzaW9uID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNlc3Npb24gPSBuZXcgTWVkaWFTZXNzaW9uKGdldEluc3RydW1lbnRhdGlvbigpLmdldFRhcmdldENvbnRleHQoKSwgVEFHKTsKKyAgICAgICAgICAgIE1lZGlhU2Vzc2lvbkNhbGxiYWNrIGNhbGxiYWNrID0gbmV3IE1lZGlhU2Vzc2lvbkNhbGxiYWNrKDIsIHNlc3Npb24pOworICAgICAgICAgICAgc2Vzc2lvbi5zZXRGbGFncyhNZWRpYVNlc3Npb24uRkxBR19IQU5ETEVTX01FRElBX0JVVFRPTlMKKyAgICAgICAgICAgICAgICAgICAgfCBNZWRpYVNlc3Npb24uRkxBR19IQU5ETEVTX1RSQU5TUE9SVF9DT05UUk9MUyk7CisgICAgICAgICAgICBzZXNzaW9uLnNldENhbGxiYWNrKGNhbGxiYWNrLCBoYW5kbGVyKTsKKyAgICAgICAgICAgIFBsYXliYWNrU3RhdGUgc3RhdGUgPSBuZXcgUGxheWJhY2tTdGF0ZS5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgLnNldFN0YXRlKFBsYXliYWNrU3RhdGUuU1RBVEVfUExBWUlORywgMCwgMS4wZikuYnVpbGQoKTsKKyAgICAgICAgICAgIC8vIEZha2UgdGhlIG1lZGlhIHNlc3Npb24gc2VydmljZSBzbyB0aGlzIHNlc3Npb24gY2FuIHRha2UgdGhlIG1lZGlhIGtleSBldmVudHMuCisgICAgICAgICAgICBzZXNzaW9uLnNldFBsYXliYWNrU3RhdGUoc3RhdGUpOworICAgICAgICAgICAgc2Vzc2lvbi5zZXRBY3RpdmUodHJ1ZSk7CiAKLSAgICAgICAgLy8gQSBtZWRpYSBwbGF5YmFjayBpcyBhbHNvIG5lZWRlZCB0byByZWNlaXZlIG1lZGlhIGtleSBldmVudHMuCi0gICAgICAgIFV0aWxzLmFzc2VydE1lZGlhUGxheWJhY2tTdGFydGVkKGdldEluc3RydW1lbnRhdGlvbigpLmdldFRhcmdldENvbnRleHQoKSk7CisgICAgICAgICAgICAvLyBBIG1lZGlhIHBsYXliYWNrIGlzIGFsc28gbmVlZGVkIHRvIHJlY2VpdmUgbWVkaWEga2V5IGV2ZW50cy4KKyAgICAgICAgICAgIFV0aWxzLmFzc2VydE1lZGlhUGxheWJhY2tTdGFydGVkKGdldEluc3RydW1lbnRhdGlvbigpLmdldFRhcmdldENvbnRleHQoKSk7CiAKLSAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlIGxpc3RlbmVyIGlzIGNhbGxlZCBmb3IgbWVkaWEga2V5IGV2ZW50LAotICAgICAgICAvLyBhbmQgYW55IG90aGVyIG1lZGlhIHNlc3Npb25zIGRvbid0IGdldCB0aGUga2V5LgotICAgICAgICBNZWRpYUtleUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IE1lZGlhS2V5TGlzdGVuZXIoMiwgdHJ1ZSwgaGFuZGxlcik7Ci0gICAgICAgIG1TZXNzaW9uTWFuYWdlci5zZXRPbk1lZGlhS2V5TGlzdGVuZXIobGlzdGVuZXIsIGhhbmRsZXIpOwotICAgICAgICBpbmplY3RJbnB1dEV2ZW50KEtleUV2ZW50LktFWUNPREVfSEVBRFNFVEhPT0ssIGZhbHNlKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShsaXN0ZW5lci5tQ291bnREb3duTGF0Y2guYXdhaXQoVElNRU9VVF9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhsaXN0ZW5lci5tS2V5RXZlbnRzLnNpemUoKSwgMik7Ci0gICAgICAgIGFzc2VydEtleUV2ZW50RXF1YWxzKGxpc3RlbmVyLm1LZXlFdmVudHMuZ2V0KDApLAotICAgICAgICAgICAgICAgIEtleUV2ZW50LktFWUNPREVfSEVBRFNFVEhPT0ssIEtleUV2ZW50LkFDVElPTl9ET1dOLCAwKTsKLSAgICAgICAgYXNzZXJ0S2V5RXZlbnRFcXVhbHMobGlzdGVuZXIubUtleUV2ZW50cy5nZXQoMSksCi0gICAgICAgICAgICAgICAgS2V5RXZlbnQuS0VZQ09ERV9IRUFEU0VUSE9PSywgS2V5RXZlbnQuQUNUSU9OX1VQLCAwKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoY2FsbGJhY2subUNvdW50RG93bkxhdGNoLmF3YWl0KFdBSVRfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2FsbGJhY2subUtleUV2ZW50cy5zaXplKCksIDApOworICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlIGxpc3RlbmVyIGlzIGNhbGxlZCBmb3IgbWVkaWEga2V5IGV2ZW50LAorICAgICAgICAgICAgLy8gYW5kIGFueSBvdGhlciBtZWRpYSBzZXNzaW9ucyBkb24ndCBnZXQgdGhlIGtleS4KKyAgICAgICAgICAgIE1lZGlhS2V5TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTWVkaWFLZXlMaXN0ZW5lcigyLCB0cnVlLCBoYW5kbGVyKTsKKyAgICAgICAgICAgIG1TZXNzaW9uTWFuYWdlci5zZXRPbk1lZGlhS2V5TGlzdGVuZXIobGlzdGVuZXIsIGhhbmRsZXIpOworICAgICAgICAgICAgaW5qZWN0SW5wdXRFdmVudChLZXlFdmVudC5LRVlDT0RFX0hFQURTRVRIT09LLCBmYWxzZSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGxpc3RlbmVyLm1Db3VudERvd25MYXRjaC5hd2FpdChUSU1FT1VUX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhsaXN0ZW5lci5tS2V5RXZlbnRzLnNpemUoKSwgMik7CisgICAgICAgICAgICBhc3NlcnRLZXlFdmVudEVxdWFscyhsaXN0ZW5lci5tS2V5RXZlbnRzLmdldCgwKSwKKyAgICAgICAgICAgICAgICAgICAgS2V5RXZlbnQuS0VZQ09ERV9IRUFEU0VUSE9PSywgS2V5RXZlbnQuQUNUSU9OX0RPV04sIDApOworICAgICAgICAgICAgYXNzZXJ0S2V5RXZlbnRFcXVhbHMobGlzdGVuZXIubUtleUV2ZW50cy5nZXQoMSksCisgICAgICAgICAgICAgICAgICAgIEtleUV2ZW50LktFWUNPREVfSEVBRFNFVEhPT0ssIEtleUV2ZW50LkFDVElPTl9VUCwgMCk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShjYWxsYmFjay5tQ291bnREb3duTGF0Y2guYXdhaXQoV0FJVF9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2FsbGJhY2subUtleUV2ZW50cy5zaXplKCksIDApOwogCi0gICAgICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBsaXN0ZW5lciBpcyBjYWxsZWQgZm9yIG1lZGlhIGtleSBldmVudCwKLSAgICAgICAgLy8gYW5kIGFub3RoZXIgbWVkaWEgc2Vzc2lvbiBnZXRzIHRoZSBrZXkuCi0gICAgICAgIGxpc3RlbmVyID0gbmV3IE1lZGlhS2V5TGlzdGVuZXIoMiwgZmFsc2UsIGhhbmRsZXIpOwotICAgICAgICBtU2Vzc2lvbk1hbmFnZXIuc2V0T25NZWRpYUtleUxpc3RlbmVyKGxpc3RlbmVyLCBoYW5kbGVyKTsKLSAgICAgICAgaW5qZWN0SW5wdXRFdmVudChLZXlFdmVudC5LRVlDT0RFX0hFQURTRVRIT09LLCBmYWxzZSk7Ci0gICAgICAgIGFzc2VydFRydWUobGlzdGVuZXIubUNvdW50RG93bkxhdGNoLmF3YWl0KFRJTUVPVVRfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOwotICAgICAgICBhc3NlcnRFcXVhbHMobGlzdGVuZXIubUtleUV2ZW50cy5zaXplKCksIDIpOwotICAgICAgICBhc3NlcnRLZXlFdmVudEVxdWFscyhsaXN0ZW5lci5tS2V5RXZlbnRzLmdldCgwKSwKLSAgICAgICAgICAgICAgICBLZXlFdmVudC5LRVlDT0RFX0hFQURTRVRIT09LLCBLZXlFdmVudC5BQ1RJT05fRE9XTiwgMCk7Ci0gICAgICAgIGFzc2VydEtleUV2ZW50RXF1YWxzKGxpc3RlbmVyLm1LZXlFdmVudHMuZ2V0KDEpLAotICAgICAgICAgICAgICAgIEtleUV2ZW50LktFWUNPREVfSEVBRFNFVEhPT0ssIEtleUV2ZW50LkFDVElPTl9VUCwgMCk7Ci0gICAgICAgIGFzc2VydFRydWUoY2FsbGJhY2subUNvdW50RG93bkxhdGNoLmF3YWl0KFRJTUVPVVRfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2FsbGJhY2subUtleUV2ZW50cy5zaXplKCksIDIpOwotICAgICAgICBhc3NlcnRLZXlFdmVudEVxdWFscyhjYWxsYmFjay5tS2V5RXZlbnRzLmdldCgwKSwKLSAgICAgICAgICAgICAgICBLZXlFdmVudC5LRVlDT0RFX0hFQURTRVRIT09LLCBLZXlFdmVudC5BQ1RJT05fRE9XTiwgMCk7Ci0gICAgICAgIGFzc2VydEtleUV2ZW50RXF1YWxzKGNhbGxiYWNrLm1LZXlFdmVudHMuZ2V0KDEpLAotICAgICAgICAgICAgICAgIEtleUV2ZW50LktFWUNPREVfSEVBRFNFVEhPT0ssIEtleUV2ZW50LkFDVElPTl9VUCwgMCk7CisgICAgICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgbGlzdGVuZXIgaXMgY2FsbGVkIGZvciBtZWRpYSBrZXkgZXZlbnQsCisgICAgICAgICAgICAvLyBhbmQgYW5vdGhlciBtZWRpYSBzZXNzaW9uIGdldHMgdGhlIGtleS4KKyAgICAgICAgICAgIGxpc3RlbmVyID0gbmV3IE1lZGlhS2V5TGlzdGVuZXIoMiwgZmFsc2UsIGhhbmRsZXIpOworICAgICAgICAgICAgbVNlc3Npb25NYW5hZ2VyLnNldE9uTWVkaWFLZXlMaXN0ZW5lcihsaXN0ZW5lciwgaGFuZGxlcik7CisgICAgICAgICAgICBpbmplY3RJbnB1dEV2ZW50KEtleUV2ZW50LktFWUNPREVfSEVBRFNFVEhPT0ssIGZhbHNlKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobGlzdGVuZXIubUNvdW50RG93bkxhdGNoLmF3YWl0KFRJTUVPVVRfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGxpc3RlbmVyLm1LZXlFdmVudHMuc2l6ZSgpLCAyKTsKKyAgICAgICAgICAgIGFzc2VydEtleUV2ZW50RXF1YWxzKGxpc3RlbmVyLm1LZXlFdmVudHMuZ2V0KDApLAorICAgICAgICAgICAgICAgICAgICBLZXlFdmVudC5LRVlDT0RFX0hFQURTRVRIT09LLCBLZXlFdmVudC5BQ1RJT05fRE9XTiwgMCk7CisgICAgICAgICAgICBhc3NlcnRLZXlFdmVudEVxdWFscyhsaXN0ZW5lci5tS2V5RXZlbnRzLmdldCgxKSwKKyAgICAgICAgICAgICAgICAgICAgS2V5RXZlbnQuS0VZQ09ERV9IRUFEU0VUSE9PSywgS2V5RXZlbnQuQUNUSU9OX1VQLCAwKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoY2FsbGJhY2subUNvdW50RG93bkxhdGNoLmF3YWl0KFRJTUVPVVRfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNhbGxiYWNrLm1LZXlFdmVudHMuc2l6ZSgpLCAyKTsKKyAgICAgICAgICAgIGFzc2VydEtleUV2ZW50RXF1YWxzKGNhbGxiYWNrLm1LZXlFdmVudHMuZ2V0KDApLAorICAgICAgICAgICAgICAgICAgICBLZXlFdmVudC5LRVlDT0RFX0hFQURTRVRIT09LLCBLZXlFdmVudC5BQ1RJT05fRE9XTiwgMCk7CisgICAgICAgICAgICBhc3NlcnRLZXlFdmVudEVxdWFscyhjYWxsYmFjay5tS2V5RXZlbnRzLmdldCgxKSwKKyAgICAgICAgICAgICAgICAgICAgS2V5RXZlbnQuS0VZQ09ERV9IRUFEU0VUSE9PSywgS2V5RXZlbnQuQUNUSU9OX1VQLCAwKTsKIAotICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgbGlzdGVuZXIgaXNuJ3QgY2FsbGVkIGFueW1vcmUuCi0gICAgICAgIGxpc3RlbmVyID0gbmV3IE1lZGlhS2V5TGlzdGVuZXIoMSwgdHJ1ZSwgaGFuZGxlcik7Ci0gICAgICAgIG1TZXNzaW9uTWFuYWdlci5zZXRPbk1lZGlhS2V5TGlzdGVuZXIobGlzdGVuZXIsIGhhbmRsZXIpOwotICAgICAgICBtU2Vzc2lvbk1hbmFnZXIuc2V0T25NZWRpYUtleUxpc3RlbmVyKG51bGwsIGhhbmRsZXIpOwotICAgICAgICBpbmplY3RJbnB1dEV2ZW50KEtleUV2ZW50LktFWUNPREVfSEVBRFNFVEhPT0ssIGZhbHNlKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UobGlzdGVuZXIubUNvdW50RG93bkxhdGNoLmF3YWl0KFdBSVRfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOwotICAgICAgICBhc3NlcnRFcXVhbHMobGlzdGVuZXIubUtleUV2ZW50cy5zaXplKCksIDApOworICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlIGxpc3RlbmVyIGlzbid0IGNhbGxlZCBhbnltb3JlLgorICAgICAgICAgICAgbGlzdGVuZXIgPSBuZXcgTWVkaWFLZXlMaXN0ZW5lcigxLCB0cnVlLCBoYW5kbGVyKTsKKyAgICAgICAgICAgIG1TZXNzaW9uTWFuYWdlci5zZXRPbk1lZGlhS2V5TGlzdGVuZXIobGlzdGVuZXIsIGhhbmRsZXIpOworICAgICAgICAgICAgbVNlc3Npb25NYW5hZ2VyLnNldE9uTWVkaWFLZXlMaXN0ZW5lcihudWxsLCBoYW5kbGVyKTsKKyAgICAgICAgICAgIGluamVjdElucHV0RXZlbnQoS2V5RXZlbnQuS0VZQ09ERV9IRUFEU0VUSE9PSywgZmFsc2UpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UobGlzdGVuZXIubUNvdW50RG93bkxhdGNoLmF3YWl0KFdBSVRfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGxpc3RlbmVyLm1LZXlFdmVudHMuc2l6ZSgpLCAwKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXNzaW9uLnJlbGVhc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdGVVc2VySW5mbygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBDb250ZXh0IGNvbnRleHQgPSBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRUYXJnZXRDb250ZXh0KCk7CisgICAgICAgIEhhbmRsZXJUaHJlYWQgaGFuZGxlclRocmVhZCA9IG5ldyBIYW5kbGVyVGhyZWFkKFRBRyk7CisgICAgICAgIGhhbmRsZXJUaHJlYWQuc3RhcnQoKTsKKyAgICAgICAgSGFuZGxlciBoYW5kbGVyID0gbmV3IEhhbmRsZXIoaGFuZGxlclRocmVhZC5nZXRMb29wZXIoKSk7CisKKyAgICAgICAgTWVkaWFTZXNzaW9uIHNlc3Npb24gPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2Vzc2lvbiA9IG5ldyBNZWRpYVNlc3Npb24oY29udGV4dCAsIFRBRyk7CisgICAgICAgICAgICBNZWRpYVNlc3Npb25DYWxsYmFjayBjYWxsYmFjayA9IG5ldyBNZWRpYVNlc3Npb25DYWxsYmFjayg1LCBzZXNzaW9uKTsKKyAgICAgICAgICAgIHNlc3Npb24uc2V0RmxhZ3MoTWVkaWFTZXNzaW9uLkZMQUdfSEFORExFU19NRURJQV9CVVRUT05TCisgICAgICAgICAgICAgICAgICAgIHwgTWVkaWFTZXNzaW9uLkZMQUdfSEFORExFU19UUkFOU1BPUlRfQ09OVFJPTFMpOworICAgICAgICAgICAgc2Vzc2lvbi5zZXRDYWxsYmFjayhjYWxsYmFjaywgaGFuZGxlcik7CisgICAgICAgICAgICBQbGF5YmFja1N0YXRlIHN0YXRlID0gbmV3IFBsYXliYWNrU3RhdGUuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgIC5zZXRTdGF0ZShQbGF5YmFja1N0YXRlLlNUQVRFX1BMQVlJTkcsIDAsIDEuMGYpLmJ1aWxkKCk7CisgICAgICAgICAgICAvLyBGYWtlIHRoZSBtZWRpYSBzZXNzaW9uIHNlcnZpY2Ugc28gdGhpcyBzZXNzaW9uIGNhbiB0YWtlIHRoZSBtZWRpYSBrZXkgZXZlbnRzLgorICAgICAgICAgICAgc2Vzc2lvbi5zZXRQbGF5YmFja1N0YXRlKHN0YXRlKTsKKyAgICAgICAgICAgIHNlc3Npb24uc2V0QWN0aXZlKHRydWUpOworCisgICAgICAgICAgICAvLyBBIG1lZGlhIHBsYXliYWNrIGlzIGFsc28gbmVlZGVkIHRvIHJlY2VpdmUgbWVkaWEga2V5IGV2ZW50cy4KKyAgICAgICAgICAgIFV0aWxzLmFzc2VydE1lZGlhUGxheWJhY2tTdGFydGVkKGNvbnRleHQpOworCisgICAgICAgICAgICAvLyBEaXNwYXRjaCBrZXkgZXZlbnRzIDUgdGltZXMuCisgICAgICAgICAgICBLZXlFdmVudCBldmVudCA9IG5ldyBLZXlFdmVudChLZXlFdmVudC5BQ1RJT05fRE9XTiwgS2V5RXZlbnQuS0VZQ09ERV9NRURJQV9QTEFZKTsKKyAgICAgICAgICAgIC8vICgxKSwgKDIpOiBkaXNwYXRjaCB0aHJvdWdoIGtleSAtLSB0aGlzIHdpbGwgdHJpZ2dlciBldmVudCB0d2ljZSBmb3IgdXAgJiBkb3duLgorICAgICAgICAgICAgaW5qZWN0SW5wdXRFdmVudChLZXlFdmVudC5LRVlDT0RFX0hFQURTRVRIT09LLCBmYWxzZSk7CisgICAgICAgICAgICAvLyAoMyk6IGRpc3BhdGNoIHRocm91Z2ggY29udHJvbGxlcgorICAgICAgICAgICAgc2Vzc2lvbi5nZXRDb250cm9sbGVyKCkuZGlzcGF0Y2hNZWRpYUJ1dHRvbkV2ZW50KGV2ZW50KTsKKworICAgICAgICAgICAgLy8gQ3JlYXRpbmcgYW5vdGhlciBjb250cm9sbGVyLgorICAgICAgICAgICAgTWVkaWFDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBuZXcgTWVkaWFDb250cm9sbGVyKGNvbnRleHQsIHNlc3Npb24uZ2V0U2Vzc2lvblRva2VuKCkpOworICAgICAgICAgICAgLy8gKDQpOiBkaXNwYXRjaCB0aHJvdWdoIGRpZmZlcmVudCBjb250cm9sbGVyLgorICAgICAgICAgICAgY29udHJvbGxlci5kaXNwYXRjaE1lZGlhQnV0dG9uRXZlbnQoZXZlbnQpOworICAgICAgICAgICAgLy8gKDUpOiBkaXNwYXRjaCB0aHJvdWdoIHRoZSBzYW1lIGNvbnRyb2xsZXIKKyAgICAgICAgICAgIGNvbnRyb2xsZXIuZGlzcGF0Y2hNZWRpYUJ1dHRvbkV2ZW50KGV2ZW50KTsKKworICAgICAgICAgICAgLy8gV2FpdC4KKyAgICAgICAgICAgIGFzc2VydFRydWUoY2FsbGJhY2subUNvdW50RG93bkxhdGNoLmF3YWl0KFRJTUVPVVRfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworCisgICAgICAgICAgICAvLyBDYWxsZXIgb2YgKDEpIH4gKDQpIHNob3VsZG4ndCBiZSB0aGUgc2FtZSBhcyBhbnkgb3RoZXJzLgorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpICsrKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Tm90U2FtZShjYWxsYmFjay5tQ2FsbGVycy5nZXQoaSksIGNhbGxiYWNrLm1DYWxsZXJzLmdldChqKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gQ2FsbGVyIG9mICg1KSBzaG91bGQgYmUgdGhlIHNhbWUgYXMgKDQpLCBzaW5jZSB0aGV5J3JlIGNhbGxlZCBmcm9tIHRoZSBzYW1lCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2FsbGJhY2subUNhbGxlcnMuZ2V0KDMpLCBjYWxsYmFjay5tQ2FsbGVycy5nZXQoNCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNlc3Npb24ucmVsZWFzZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSBjbGFzcyBWb2x1bWVLZXlMb25nUHJlc3NMaXN0ZW5lcgpAQCAtMjQ4LDEwICszMTEsMTMgQEAKIAogICAgIHByaXZhdGUgY2xhc3MgTWVkaWFTZXNzaW9uQ2FsbGJhY2sgZXh0ZW5kcyBNZWRpYVNlc3Npb24uQ2FsbGJhY2sgewogICAgICAgICBwcml2YXRlIGZpbmFsIENvdW50RG93bkxhdGNoIG1Db3VudERvd25MYXRjaDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVNlc3Npb24gbVNlc3Npb247CiAgICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxLZXlFdmVudD4gbUtleUV2ZW50cyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBwcml2YXRlIGZpbmFsIExpc3Q8TWVkaWFTZXNzaW9uTWFuYWdlci5SZW1vdGVVc2VySW5mbz4gbUNhbGxlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAotICAgICAgICBwcml2YXRlIE1lZGlhU2Vzc2lvbkNhbGxiYWNrKGludCBjb3VudCkgeworICAgICAgICBwcml2YXRlIE1lZGlhU2Vzc2lvbkNhbGxiYWNrKGludCBjb3VudCwgTWVkaWFTZXNzaW9uIHNlc3Npb24pIHsKICAgICAgICAgICAgIG1Db3VudERvd25MYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaChjb3VudCk7CisgICAgICAgICAgICBtU2Vzc2lvbiA9IHNlc3Npb247CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbk1lZGlhQnV0dG9uRXZlbnQoSW50ZW50IG1lZGlhQnV0dG9uSW50ZW50KSB7CkBAIC0yNTksNiArMzI1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgSW50ZW50LkVYVFJBX0tFWV9FVkVOVCk7CiAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGV2ZW50KTsKICAgICAgICAgICAgIG1LZXlFdmVudHMuYWRkKGV2ZW50KTsKKyAgICAgICAgICAgIG1DYWxsZXJzLmFkZChtU2Vzc2lvbi5nZXRDdXJyZW50Q29udHJvbGxlckluZm8oKSk7CiAgICAgICAgICAgICBtQ291bnREb3duTGF0Y2guY291bnREb3duKCk7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL01lZGlhU2Vzc2lvblRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9NZWRpYVNlc3Npb25UZXN0LmphdmEKaW5kZXggY2M2ZjE4Ni4uYzE2ZDgxYyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL01lZGlhU2Vzc2lvblRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvTWVkaWFTZXNzaW9uVGVzdC5qYXZhCkBAIC0xNSw2ICsxNSw5IEBACiAgKi8KIHBhY2thZ2UgYW5kcm9pZC5tZWRpYS5jdHM7CiAKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5BdWRpb0F0dHJpYnV0ZXMuVVNBR0VfR0FNRTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5jdHMuVXRpbHMuY29tcGFyZVJlbW90ZVVzZXJJbmZvOworCiBpbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKQEAgLTI4LDIwICszMSwyNCBAQAogaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYUNvbnRyb2xsZXI7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLk1lZGlhU2Vzc2lvbjsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uTWVkaWFTZXNzaW9uLlF1ZXVlSXRlbTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uTWVkaWFTZXNzaW9uTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uTWVkaWFTZXNzaW9uTWFuYWdlci5SZW1vdGVVc2VySW5mbzsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uUGxheWJhY2tTdGF0ZTsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIGltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKIAorQEFwcE1vZGVGdWxsKHJlYXNvbiA9ICJUT0RPOiBldmFsdWF0ZSBhbmQgcG9ydCB0byBpbnN0YW50IikKIHB1YmxpYyBjbGFzcyBNZWRpYVNlc3Npb25UZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKICAgICAvLyBUaGUgbWF4aW11bSB0aW1lIHRvIHdhaXQgZm9yIGFuIG9wZXJhdGlvbiB0aGF0IGlzIGV4cGVjdGVkIHRvIHN1Y2NlZWQuCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBUSU1FX09VVF9NUyA9IDMwMDBMOwpAQCAtNjIsMTIgKzY5LDE1IEBACiAgICAgcHJpdmF0ZSBPYmplY3QgbVdhaXRMb2NrID0gbmV3IE9iamVjdCgpOwogICAgIHByaXZhdGUgTWVkaWFDb250cm9sbGVyQ2FsbGJhY2sgbUNhbGxiYWNrID0gbmV3IE1lZGlhQ29udHJvbGxlckNhbGxiYWNrKCk7CiAgICAgcHJpdmF0ZSBNZWRpYVNlc3Npb24gbVNlc3Npb247CisgICAgcHJpdmF0ZSBSZW1vdGVVc2VySW5mbyBtS2V5RGlzcGF0Y2hlckluZm87CiAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBzdXBlci5zZXRVcCgpOwogICAgICAgICBtQXVkaW9NYW5hZ2VyID0gKEF1ZGlvTWFuYWdlcikgZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BVURJT19TRVJWSUNFKTsKICAgICAgICAgbVNlc3Npb24gPSBuZXcgTWVkaWFTZXNzaW9uKGdldENvbnRleHQoKSwgVEVTVF9TRVNTSU9OX1RBRyk7CisgICAgICAgIG1LZXlEaXNwYXRjaGVySW5mbyA9IG5ldyBNZWRpYVNlc3Npb25NYW5hZ2VyLlJlbW90ZVVzZXJJbmZvKAorICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5nZXRQYWNrYWdlTmFtZSgpLCBQcm9jZXNzLm15UGlkKCksIFByb2Nlc3MubXlVaWQoKSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC04OCw3ICs5OCw3IEBACiAgICAgICAgIC8vIFZlcmlmeSBieSBnZXR0aW5nIHRoZSBjb250cm9sbGVyIGFuZCBjaGVja2luZyBhbGwgaXRzIGZpZWxkcwogICAgICAgICBNZWRpYUNvbnRyb2xsZXIgY29udHJvbGxlciA9IG1TZXNzaW9uLmdldENvbnRyb2xsZXIoKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChjb250cm9sbGVyKTsKLSAgICAgICAgdmVyaWZ5TmV3U2Vzc2lvbihjb250cm9sbGVyLCBURVNUX1NFU1NJT05fVEFHKTsKKyAgICAgICAgdmVyaWZ5TmV3U2Vzc2lvbihjb250cm9sbGVyKTsKICAgICB9CiAKICAgICAvKioKQEAgLTMwMCwxNSArMzEwLDEzIEBACiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoVm9sdW1lUHJvdmlkZXIuVk9MVU1FX0NPTlRST0xfRklYRUQsIGluZm8uZ2V0Vm9sdW1lQ29udHJvbCgpKTsKIAogICAgICAgICAgICAgLy8gdGVzdCBzZXRQbGF5YmFja1RvTG9jYWwKLSAgICAgICAgICAgIEF1ZGlvQXR0cmlidXRlcyBhdHRycyA9IG5ldyBBdWRpb0F0dHJpYnV0ZXMuQnVpbGRlcigpLmFkZFRhZyhURVNUX1ZBTFVFKS5idWlsZCgpOworICAgICAgICAgICAgQXVkaW9BdHRyaWJ1dGVzIGF0dHJzID0gbmV3IEF1ZGlvQXR0cmlidXRlcy5CdWlsZGVyKCkuc2V0VXNhZ2UoVVNBR0VfR0FNRSkuYnVpbGQoKTsKICAgICAgICAgICAgIG1TZXNzaW9uLnNldFBsYXliYWNrVG9Mb2NhbChhdHRycyk7CiAKICAgICAgICAgICAgIGluZm8gPSBjb250cm9sbGVyLmdldFBsYXliYWNrSW5mbygpOwogICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChpbmZvKTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYUNvbnRyb2xsZXIuUGxheWJhY2tJbmZvLlBMQVlCQUNLX1RZUEVfTE9DQUwsIGluZm8uZ2V0UGxheWJhY2tUeXBlKCkpOwotICAgICAgICAgICAgU2V0PFN0cmluZz4gdGFncyA9IGluZm8uZ2V0QXVkaW9BdHRyaWJ1dGVzKCkuZ2V0VGFncygpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCh0YWdzKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUodGFncy5jb250YWlucyhURVNUX1ZBTFVFKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYXR0cnMsIGluZm8uZ2V0QXVkaW9BdHRyaWJ1dGVzKCkpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zMzYsMzYgKzM0NCw0MyBAQAogICAgICAgICBzaW11bGF0ZU1lZGlhS2V5SW5wdXQoS2V5RXZlbnQuS0VZQ09ERV9NRURJQV9QTEFZKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShzZXNzaW9uQ2FsbGJhY2suYXdhaXQoVElNRV9PVVRfTVMpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNlc3Npb25DYWxsYmFjay5tT25QbGF5Q2FsbGVkQ291bnQpOworICAgICAgICBhc3NlcnRUcnVlKGNvbXBhcmVSZW1vdGVVc2VySW5mbyhtS2V5RGlzcGF0Y2hlckluZm8sIHNlc3Npb25DYWxsYmFjay5tQ2FsbGVySW5mbykpOwogCiAgICAgICAgIHNlc3Npb25DYWxsYmFjay5yZXNldCgxKTsKICAgICAgICAgc2ltdWxhdGVNZWRpYUtleUlucHV0KEtleUV2ZW50LktFWUNPREVfTUVESUFfUEFVU0UpOwogICAgICAgICBhc3NlcnRUcnVlKHNlc3Npb25DYWxsYmFjay5hd2FpdChUSU1FX09VVF9NUykpOwogICAgICAgICBhc3NlcnRUcnVlKHNlc3Npb25DYWxsYmFjay5tT25QYXVzZUNhbGxlZCk7CisgICAgICAgIGFzc2VydFRydWUoY29tcGFyZVJlbW90ZVVzZXJJbmZvKG1LZXlEaXNwYXRjaGVySW5mbywgc2Vzc2lvbkNhbGxiYWNrLm1DYWxsZXJJbmZvKSk7CiAKICAgICAgICAgc2Vzc2lvbkNhbGxiYWNrLnJlc2V0KDEpOwogICAgICAgICBzaW11bGF0ZU1lZGlhS2V5SW5wdXQoS2V5RXZlbnQuS0VZQ09ERV9NRURJQV9ORVhUKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShzZXNzaW9uQ2FsbGJhY2suYXdhaXQoVElNRV9PVVRfTVMpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShzZXNzaW9uQ2FsbGJhY2subU9uU2tpcFRvTmV4dENhbGxlZCk7CisgICAgICAgIGFzc2VydFRydWUoY29tcGFyZVJlbW90ZVVzZXJJbmZvKG1LZXlEaXNwYXRjaGVySW5mbywgc2Vzc2lvbkNhbGxiYWNrLm1DYWxsZXJJbmZvKSk7CiAKICAgICAgICAgc2Vzc2lvbkNhbGxiYWNrLnJlc2V0KDEpOwogICAgICAgICBzaW11bGF0ZU1lZGlhS2V5SW5wdXQoS2V5RXZlbnQuS0VZQ09ERV9NRURJQV9QUkVWSU9VUyk7CiAgICAgICAgIGFzc2VydFRydWUoc2Vzc2lvbkNhbGxiYWNrLmF3YWl0KFRJTUVfT1VUX01TKSk7CiAgICAgICAgIGFzc2VydFRydWUoc2Vzc2lvbkNhbGxiYWNrLm1PblNraXBUb1ByZXZpb3VzQ2FsbGVkKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb21wYXJlUmVtb3RlVXNlckluZm8obUtleURpc3BhdGNoZXJJbmZvLCBzZXNzaW9uQ2FsbGJhY2subUNhbGxlckluZm8pKTsKIAogICAgICAgICBzZXNzaW9uQ2FsbGJhY2sucmVzZXQoMSk7CiAgICAgICAgIHNpbXVsYXRlTWVkaWFLZXlJbnB1dChLZXlFdmVudC5LRVlDT0RFX01FRElBX1NUT1ApOwogICAgICAgICBhc3NlcnRUcnVlKHNlc3Npb25DYWxsYmFjay5hd2FpdChUSU1FX09VVF9NUykpOwogICAgICAgICBhc3NlcnRUcnVlKHNlc3Npb25DYWxsYmFjay5tT25TdG9wQ2FsbGVkKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb21wYXJlUmVtb3RlVXNlckluZm8obUtleURpc3BhdGNoZXJJbmZvLCBzZXNzaW9uQ2FsbGJhY2subUNhbGxlckluZm8pKTsKIAogICAgICAgICBzZXNzaW9uQ2FsbGJhY2sucmVzZXQoMSk7CiAgICAgICAgIHNpbXVsYXRlTWVkaWFLZXlJbnB1dChLZXlFdmVudC5LRVlDT0RFX01FRElBX0ZBU1RfRk9SV0FSRCk7CiAgICAgICAgIGFzc2VydFRydWUoc2Vzc2lvbkNhbGxiYWNrLmF3YWl0KFRJTUVfT1VUX01TKSk7CiAgICAgICAgIGFzc2VydFRydWUoc2Vzc2lvbkNhbGxiYWNrLm1PbkZhc3RGb3J3YXJkQ2FsbGVkKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb21wYXJlUmVtb3RlVXNlckluZm8obUtleURpc3BhdGNoZXJJbmZvLCBzZXNzaW9uQ2FsbGJhY2subUNhbGxlckluZm8pKTsKIAogICAgICAgICBzZXNzaW9uQ2FsbGJhY2sucmVzZXQoMSk7CiAgICAgICAgIHNpbXVsYXRlTWVkaWFLZXlJbnB1dChLZXlFdmVudC5LRVlDT0RFX01FRElBX1JFV0lORCk7CiAgICAgICAgIGFzc2VydFRydWUoc2Vzc2lvbkNhbGxiYWNrLmF3YWl0KFRJTUVfT1VUX01TKSk7CiAgICAgICAgIGFzc2VydFRydWUoc2Vzc2lvbkNhbGxiYWNrLm1PblJld2luZENhbGxlZCk7CisgICAgICAgIGFzc2VydFRydWUoY29tcGFyZVJlbW90ZVVzZXJJbmZvKG1LZXlEaXNwYXRjaGVySW5mbywgc2Vzc2lvbkNhbGxiYWNrLm1DYWxsZXJJbmZvKSk7CiAKICAgICAgICAgLy8gVGVzdCBQTEFZX1BBVVNFIGJ1dHRvbiB0d2ljZS4KICAgICAgICAgLy8gRmlyc3QsIHNpbXVsYXRlIFBMQVlfUEFVU0UgYnV0dG9uIHdoaWxlIGluIFNUQVRFX1BBVVNFRC4KQEAgLTM3NCw2ICszODksNyBAQAogICAgICAgICBzaW11bGF0ZU1lZGlhS2V5SW5wdXQoS2V5RXZlbnQuS0VZQ09ERV9NRURJQV9QTEFZX1BBVVNFKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShzZXNzaW9uQ2FsbGJhY2suYXdhaXQoVElNRV9PVVRfTVMpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNlc3Npb25DYWxsYmFjay5tT25QbGF5Q2FsbGVkQ291bnQpOworICAgICAgICBhc3NlcnRUcnVlKGNvbXBhcmVSZW1vdGVVc2VySW5mbyhtS2V5RGlzcGF0Y2hlckluZm8sIHNlc3Npb25DYWxsYmFjay5tQ2FsbGVySW5mbykpOwogCiAgICAgICAgIC8vIE5leHQsIHNpbXVsYXRlIFBMQVlfUEFVU0UgYnV0dG9uIHdoaWxlIGluIFNUQVRFX1BMQVlJTkcuCiAgICAgICAgIHNlc3Npb25DYWxsYmFjay5yZXNldCgxKTsKQEAgLTM4MSw2ICszOTcsNyBAQAogICAgICAgICBzaW11bGF0ZU1lZGlhS2V5SW5wdXQoS2V5RXZlbnQuS0VZQ09ERV9NRURJQV9QTEFZX1BBVVNFKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShzZXNzaW9uQ2FsbGJhY2suYXdhaXQoVElNRV9PVVRfTVMpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShzZXNzaW9uQ2FsbGJhY2subU9uUGF1c2VDYWxsZWQpOworICAgICAgICBhc3NlcnRUcnVlKGNvbXBhcmVSZW1vdGVVc2VySW5mbyhtS2V5RGlzcGF0Y2hlckluZm8sIHNlc3Npb25DYWxsYmFjay5tQ2FsbGVySW5mbykpOwogCiAgICAgICAgIC8vIERvdWJsZSB0YXAgb2YgUExBWV9QQVVTRSBpcyB0aGUgbmV4dCB0cmFjayBpbnN0ZWFkIG9mIGNoYW5naW5nIFBMQVkvUEFVU0UuCiAgICAgICAgIHNlc3Npb25DYWxsYmFjay5yZXNldCgyKTsKQEAgLTM5MSw2ICs0MDgsNyBAQAogICAgICAgICBhc3NlcnRUcnVlKHNlc3Npb25DYWxsYmFjay5tT25Ta2lwVG9OZXh0Q2FsbGVkKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHNlc3Npb25DYWxsYmFjay5tT25QbGF5Q2FsbGVkQ291bnQpOwogICAgICAgICBhc3NlcnRGYWxzZShzZXNzaW9uQ2FsbGJhY2subU9uUGF1c2VDYWxsZWQpOworICAgICAgICBhc3NlcnRUcnVlKGNvbXBhcmVSZW1vdGVVc2VySW5mbyhtS2V5RGlzcGF0Y2hlckluZm8sIHNlc3Npb25DYWxsYmFjay5tQ2FsbGVySW5mbykpOwogCiAgICAgICAgIC8vIFRlc3QgaWYgUExBWV9QQVVTRSBkb3VibGUgdGFwIGlzIGNvbnNpZGVyZWQgYXMgdHdvIHNpbmdsZSB0YXBzIHdoZW4gYW5vdGhlciBtZWRpYQogICAgICAgICAvLyBrZXkgaXMgcHJlc3NlZC4KQEAgLTQwMiw2ICs0MjAsNyBAQAogICAgICAgICBhc3NlcnRUcnVlKHNlc3Npb25DYWxsYmFjay5hd2FpdChUSU1FX09VVF9NUykpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMiwgc2Vzc2lvbkNhbGxiYWNrLm1PblBsYXlDYWxsZWRDb3VudCk7CiAgICAgICAgIGFzc2VydFRydWUoc2Vzc2lvbkNhbGxiYWNrLm1PblN0b3BDYWxsZWQpOworICAgICAgICBhc3NlcnRUcnVlKGNvbXBhcmVSZW1vdGVVc2VySW5mbyhtS2V5RGlzcGF0Y2hlckluZm8sIHNlc3Npb25DYWxsYmFjay5tQ2FsbGVySW5mbykpOwogCiAgICAgICAgIC8vIFRlc3QgaWYgbWVkaWEga2V5cyBhcmUgaGFuZGxlZCBpbiBvcmRlci4KICAgICAgICAgc2Vzc2lvbkNhbGxiYWNrLnJlc2V0KDIpOwpAQCAtNDExLDEyICs0MzAsMzQgQEAKICAgICAgICAgYXNzZXJ0VHJ1ZShzZXNzaW9uQ2FsbGJhY2suYXdhaXQoVElNRV9PVVRfTVMpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNlc3Npb25DYWxsYmFjay5tT25QbGF5Q2FsbGVkQ291bnQpOwogICAgICAgICBhc3NlcnRUcnVlKHNlc3Npb25DYWxsYmFjay5tT25TdG9wQ2FsbGVkKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb21wYXJlUmVtb3RlVXNlckluZm8obUtleURpc3BhdGNoZXJJbmZvLCBzZXNzaW9uQ2FsbGJhY2subUNhbGxlckluZm8pKTsKICAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKICAgICAgICAgICAgIGFzc2VydEVxdWFscyhQbGF5YmFja1N0YXRlLlNUQVRFX1NUT1BQRUQsCiAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uLmdldENvbnRyb2xsZXIoKS5nZXRQbGF5YmFja1N0YXRlKCkuZ2V0U3RhdGUoKSk7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBUZXN0cyB7QGxpbmsgTWVkaWFTZXNzaW9uI3NldENhbGxiYWNrfSB3aXRoIHtAY29kZSBudWxsfS4gTm8gY2FsbGJhY2tzIHdpbGwgYmUgY2FsbGVkCisgICAgICogb25jZSB7QGNvZGUgc2V0Q2FsbGJhY2sobnVsbCl9IGlzIGRvbmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFNldENhbGxiYWNrV2l0aE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTWVkaWFTZXNzaW9uQ2FsbGJhY2sgc2Vzc2lvbkNhbGxiYWNrID0gbmV3IE1lZGlhU2Vzc2lvbkNhbGxiYWNrKCk7CisgICAgICAgIG1TZXNzaW9uLnNldENhbGxiYWNrKHNlc3Npb25DYWxsYmFjaywgbUhhbmRsZXIpOworICAgICAgICBtU2Vzc2lvbi5zZXRGbGFncyhNZWRpYVNlc3Npb24uRkxBR19IQU5ETEVTX1RSQU5TUE9SVF9DT05UUk9MUyk7CisgICAgICAgIG1TZXNzaW9uLnNldEFjdGl2ZSh0cnVlKTsKKworICAgICAgICBNZWRpYUNvbnRyb2xsZXIgY29udHJvbGxlciA9IG1TZXNzaW9uLmdldENvbnRyb2xsZXIoKTsKKyAgICAgICAgc2V0UGxheWJhY2tTdGF0ZShQbGF5YmFja1N0YXRlLlNUQVRFX1BMQVlJTkcpOworCisgICAgICAgIHNlc3Npb25DYWxsYmFjay5yZXNldCgxKTsKKyAgICAgICAgbVNlc3Npb24uc2V0Q2FsbGJhY2sobnVsbCwgbUhhbmRsZXIpOworCisgICAgICAgIGNvbnRyb2xsZXIuZ2V0VHJhbnNwb3J0Q29udHJvbHMoKS5wYXVzZSgpOworICAgICAgICBhc3NlcnRGYWxzZShzZXNzaW9uQ2FsbGJhY2suYXdhaXQoV0FJVF9NUykpOworICAgICAgICBhc3NlcnRGYWxzZSgiQ2FsbGJhY2sgc2hvdWxkbid0IGJlIGNhbGxlZC4iLCBzZXNzaW9uQ2FsbGJhY2subU9uUGF1c2VDYWxsZWQpOworICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCBzZXRQbGF5YmFja1N0YXRlKGludCBzdGF0ZSkgewogICAgICAgICBmaW5hbCBsb25nIGFsbEFjdGlvbnMgPSBQbGF5YmFja1N0YXRlLkFDVElPTl9QTEFZIHwgUGxheWJhY2tTdGF0ZS5BQ1RJT05fUEFVU0UKICAgICAgICAgICAgICAgICB8IFBsYXliYWNrU3RhdGUuQUNUSU9OX1BMQVlfUEFVU0UgfCBQbGF5YmFja1N0YXRlLkFDVElPTl9TVE9QCkBAIC00NDksNiArNDkwLDggQEAKICAgICAgICAgbVNlc3Npb24ucmVsZWFzZSgpOwogICAgIH0KIAorICAgIC8vIFRoaXMgdXNlcyBwdWJsaWMgQVBJcyB0byBkaXNwYXRjaCBrZXkgZXZlbnRzLCBzbyBzZXNzaW9ucyB3b3VsZCBjb25zaWRlciB0aGlzIGFzCisgICAgLy8gJ21lZGlhIGtleSBldmVudCBmcm9tIHRoaXMgYXBwbGljYXRpb24nLgogICAgIHByaXZhdGUgdm9pZCBzaW11bGF0ZU1lZGlhS2V5SW5wdXQoaW50IGtleUNvZGUpIHsKICAgICAgICAgbUF1ZGlvTWFuYWdlci5kaXNwYXRjaE1lZGlhS2V5RXZlbnQobmV3IEtleUV2ZW50KEtleUV2ZW50LkFDVElPTl9ET1dOLCBrZXlDb2RlKSk7CiAgICAgICAgIG1BdWRpb01hbmFnZXIuZGlzcGF0Y2hNZWRpYUtleUV2ZW50KG5ldyBLZXlFdmVudChLZXlFdmVudC5BQ1RJT05fVVAsIGtleUNvZGUpKTsKQEAgLTQ5Miw3ICs1MzUsNyBAQAogICAgICAqCiAgICAgICogQHBhcmFtIGNvbnRyb2xsZXIgVGhlIGNvbnRyb2xsZXIgZm9yIHRoZSBzZXNzaW9uCiAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHZlcmlmeU5ld1Nlc3Npb24oTWVkaWFDb250cm9sbGVyIGNvbnRyb2xsZXIsIFN0cmluZyB0YWcpIHsKKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5TmV3U2Vzc2lvbihNZWRpYUNvbnRyb2xsZXIgY29udHJvbGxlcikgewogICAgICAgICBhc3NlcnRFcXVhbHMoIk5ldyBzZXNzaW9uIGhhcyB1bmV4cGVjdGVkIGNvbmZpZ3VyYXRpb24iLCAwTCwgY29udHJvbGxlci5nZXRGbGFncygpKTsKICAgICAgICAgYXNzZXJ0TnVsbCgiTmV3IHNlc3Npb24gaGFzIHVuZXhwZWN0ZWQgY29uZmlndXJhdGlvbiIsIGNvbnRyb2xsZXIuZ2V0RXh0cmFzKCkpOwogICAgICAgICBhc3NlcnROdWxsKCJOZXcgc2Vzc2lvbiBoYXMgdW5leHBlY3RlZCBjb25maWd1cmF0aW9uIiwgY29udHJvbGxlci5nZXRNZXRhZGF0YSgpKTsKQEAgLTUwNyw3ICs1NTAsNiBAQAogCiAgICAgICAgIGFzc2VydE5vdE51bGwoY29udHJvbGxlci5nZXRTZXNzaW9uVG9rZW4oKSk7CiAgICAgICAgIGFzc2VydE5vdE51bGwoY29udHJvbGxlci5nZXRUcmFuc3BvcnRDb250cm9scygpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRhZywgY29udHJvbGxlci5nZXRUYWcoKSk7CiAKICAgICAgICAgTWVkaWFDb250cm9sbGVyLlBsYXliYWNrSW5mbyBpbmZvID0gY29udHJvbGxlci5nZXRQbGF5YmFja0luZm8oKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChpbmZvKTsKQEAgLTYzNyw2ICs2NzksNyBAQAogICAgICAgICBwcml2YXRlIGJvb2xlYW4gbU9uUmV3aW5kQ2FsbGVkOwogICAgICAgICBwcml2YXRlIGJvb2xlYW4gbU9uU2tpcFRvUHJldmlvdXNDYWxsZWQ7CiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtT25Ta2lwVG9OZXh0Q2FsbGVkOworICAgICAgICBwcml2YXRlIFJlbW90ZVVzZXJJbmZvIG1DYWxsZXJJbmZvOwogCiAgICAgICAgIHB1YmxpYyB2b2lkIHJlc2V0KGludCBjb3VudCkgewogICAgICAgICAgICAgbUxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKGNvdW50KTsKQEAgLTY2MCw2ICs3MDMsNyBAQAogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgb25QbGF5KCkgewogICAgICAgICAgICAgbU9uUGxheUNhbGxlZENvdW50Kys7CisgICAgICAgICAgICBtQ2FsbGVySW5mbyA9IG1TZXNzaW9uLmdldEN1cnJlbnRDb250cm9sbGVySW5mbygpOwogICAgICAgICAgICAgc2V0UGxheWJhY2tTdGF0ZShQbGF5YmFja1N0YXRlLlNUQVRFX1BMQVlJTkcpOwogICAgICAgICAgICAgbUxhdGNoLmNvdW50RG93bigpOwogICAgICAgICB9CkBAIC02NjcsNiArNzExLDcgQEAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uUGF1c2UoKSB7CiAgICAgICAgICAgICBtT25QYXVzZUNhbGxlZCA9IHRydWU7CisgICAgICAgICAgICBtQ2FsbGVySW5mbyA9IG1TZXNzaW9uLmdldEN1cnJlbnRDb250cm9sbGVySW5mbygpOwogICAgICAgICAgICAgc2V0UGxheWJhY2tTdGF0ZShQbGF5YmFja1N0YXRlLlNUQVRFX1BBVVNFRCk7CiAgICAgICAgICAgICBtTGF0Y2guY291bnREb3duKCk7CiAgICAgICAgIH0KQEAgLTY3NCw2ICs3MTksNyBAQAogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgb25TdG9wKCkgewogICAgICAgICAgICAgbU9uU3RvcENhbGxlZCA9IHRydWU7CisgICAgICAgICAgICBtQ2FsbGVySW5mbyA9IG1TZXNzaW9uLmdldEN1cnJlbnRDb250cm9sbGVySW5mbygpOwogICAgICAgICAgICAgc2V0UGxheWJhY2tTdGF0ZShQbGF5YmFja1N0YXRlLlNUQVRFX1NUT1BQRUQpOwogICAgICAgICAgICAgbUxhdGNoLmNvdW50RG93bigpOwogICAgICAgICB9CkBAIC02ODEsMjQgKzcyNywyOCBAQAogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgb25GYXN0Rm9yd2FyZCgpIHsKICAgICAgICAgICAgIG1PbkZhc3RGb3J3YXJkQ2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIG1DYWxsZXJJbmZvID0gbVNlc3Npb24uZ2V0Q3VycmVudENvbnRyb2xsZXJJbmZvKCk7CiAgICAgICAgICAgICBtTGF0Y2guY291bnREb3duKCk7CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgb25SZXdpbmQoKSB7CiAgICAgICAgICAgICBtT25SZXdpbmRDYWxsZWQgPSB0cnVlOworICAgICAgICAgICAgbUNhbGxlckluZm8gPSBtU2Vzc2lvbi5nZXRDdXJyZW50Q29udHJvbGxlckluZm8oKTsKICAgICAgICAgICAgIG1MYXRjaC5jb3VudERvd24oKTsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBvblNraXBUb1ByZXZpb3VzKCkgewogICAgICAgICAgICAgbU9uU2tpcFRvUHJldmlvdXNDYWxsZWQgPSB0cnVlOworICAgICAgICAgICAgbUNhbGxlckluZm8gPSBtU2Vzc2lvbi5nZXRDdXJyZW50Q29udHJvbGxlckluZm8oKTsKICAgICAgICAgICAgIG1MYXRjaC5jb3VudERvd24oKTsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBvblNraXBUb05leHQoKSB7CiAgICAgICAgICAgICBtT25Ta2lwVG9OZXh0Q2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIG1DYWxsZXJJbmZvID0gbVNlc3Npb24uZ2V0Q3VycmVudENvbnRyb2xsZXJJbmZvKCk7CiAgICAgICAgICAgICBtTGF0Y2guY291bnREb3duKCk7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvTWVkaWFTeW5jVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL01lZGlhU3luY1Rlc3QuamF2YQppbmRleCAyYWRlZGUxLi5mZTc1MmY4IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvTWVkaWFTeW5jVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9NZWRpYVN5bmNUZXN0LmphdmEKQEAgLTM1LDYgKzM1LDcgQEAKIGltcG9ydCBhbmRyb2lkLm1lZGlhLlN5bmNQYXJhbXM7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlclRocmVhZDsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2U7CkBAIC01Nyw2ICs1OCw3IEBACiAgKiBCbGVuZGVyIEZvdW5kYXRpb24gLyB3d3cuYmlnYnVja2J1bm55Lm9yZywgYW5kIGFyZSBsaWNlbnNlZCB1bmRlciB0aGUgQ3JlYXRpdmUgQ29tbW9ucwogICogQXR0cmlidXRpb24gMy4wIExpY2Vuc2UgYXQgaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMy4wL3VzLy4KICAqLworQEFwcE1vZGVGdWxsKHJlYXNvbiA9ICJUT0RPOiBldmFsdWF0ZSBhbmQgcG9ydCB0byBpbnN0YW50IikKIHB1YmxpYyBjbGFzcyBNZWRpYVN5bmNUZXN0IGV4dGVuZHMgQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI8TWVkaWFTdHViQWN0aXZpdHk+IHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJNZWRpYVN5bmNUZXN0IjsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL01pZGlTb2xvVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL01pZGlTb2xvVGVzdC5qYXZhCmluZGV4IGIxMzNlZDkuLmQ0MjU2YmIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9NaWRpU29sb1Rlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvTWlkaVNvbG9UZXN0LmphdmEKQEAgLTE2LDYgKzE2LDcgQEAKIAogcGFja2FnZSBhbmRyb2lkLm1lZGlhLmN0czsKIAoraW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogCiAKQEAgLTM4LDYgKzM5LDcgQEAKICAqIFRlc3QgTUlESSB3aGVuIHRoZXJlIG1heSBiZSBubyBNSURJIGRldmljZXMgYXZhaWxhYmxlLiBUaGVyZSBpcyBub3QgbXVjaCB3ZQogICogY2FuIHRlc3Qgd2l0aG91dCBhIGRldmljZS4KICAqLworQEFwcE1vZGVGdWxsKHJlYXNvbiA9ICJUT0RPOiBldmFsdWF0ZSBhbmQgcG9ydCB0byBpbnN0YW50IikKIHB1YmxpYyBjbGFzcyBNaWRpU29sb1Rlc3QgZXh0ZW5kcyBDdHNBbmRyb2lkVGVzdENhc2UgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWlkaVNvbG9UZXN0IjsKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgTE9DQUxfU1RPUkFHRV9TSVpFID0gMjU2OwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL01vY2tBY3Rpdml0eS5qYXZhIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL01vY2tBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyOGNmYWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvTW9ja0FjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLmN0czsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworCitwdWJsaWMgY2xhc3MgTW9ja0FjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL01vY2tQbGF5ZXIuamF2YSBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9Nb2NrUGxheWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjczZjcwNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9Nb2NrUGxheWVyLmphdmEKQEAgLTAsMCArMSwyMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS5jdHM7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQXR0cmlidXRlczsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkRhdGFTb3VyY2VEZXNjOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXJCYXNlOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTm9uTnVsbDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXJyYXlNYXA7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjsKKworLyoqCisgKiBBIG1vY2sgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIE1lZGlhUGxheWVyQmFzZX0gZm9yIHRlc3RpbmcuCisgKi8KK3B1YmxpYyBjbGFzcyBNb2NrUGxheWVyIGV4dGVuZHMgTWVkaWFQbGF5ZXJCYXNlIHsKKyAgICBwdWJsaWMgZmluYWwgQ291bnREb3duTGF0Y2ggbUNvdW50RG93bkxhdGNoOworCisgICAgcHVibGljIGJvb2xlYW4gbVBsYXlDYWxsZWQ7CisgICAgcHVibGljIGJvb2xlYW4gbVBhdXNlQ2FsbGVkOworICAgIHB1YmxpYyBib29sZWFuIG1TdG9wQ2FsbGVkOworICAgIHB1YmxpYyBib29sZWFuIG1QcmVwYXJlQ2FsbGVkOworICAgIHB1YmxpYyBib29sZWFuIG1TZWVrVG9DYWxsZWQ7CisgICAgcHVibGljIGxvbmcgbVNlZWtQb3NpdGlvbjsKKyAgICBwdWJsaWMgbG9uZyBtQ3VycmVudFBvc2l0aW9uOworICAgIHB1YmxpYyBsb25nIG1CdWZmZXJlZFBvc2l0aW9uOworICAgIHB1YmxpYyBAUGxheWVyU3RhdGUgaW50IG1MYXN0UGxheWVyU3RhdGU7CisKKyAgICBwdWJsaWMgQXJyYXlNYXA8UGxheWVyRXZlbnRDYWxsYmFjaywgRXhlY3V0b3I+IG1DYWxsYmFja3MgPSBuZXcgQXJyYXlNYXA8PigpOworCisgICAgcHJpdmF0ZSBBdWRpb0F0dHJpYnV0ZXMgbUF1ZGlvQXR0cmlidXRlczsKKworICAgIHB1YmxpYyBNb2NrUGxheWVyKGludCBjb3VudCkgeworICAgICAgICBtQ291bnREb3duTGF0Y2ggPSAoY291bnQgPiAwKSA/IG5ldyBDb3VudERvd25MYXRjaChjb3VudCkgOiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgICAgICAvLyBuby1vcAorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgeworICAgICAgICAvLyBuby1vcAorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHBsYXkoKSB7CisgICAgICAgIG1QbGF5Q2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgaWYgKG1Db3VudERvd25MYXRjaCAhPSBudWxsKSB7CisgICAgICAgICAgICBtQ291bnREb3duTGF0Y2guY291bnREb3duKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBwYXVzZSgpIHsKKyAgICAgICAgbVBhdXNlQ2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgaWYgKG1Db3VudERvd25MYXRjaCAhPSBudWxsKSB7CisgICAgICAgICAgICBtQ291bnREb3duTGF0Y2guY291bnREb3duKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUT0RPOiBVbmNvbW1lbnQgb3IgcmVtb3ZlCisgICAgLyoKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkgeworICAgICAgICBtU3RvcENhbGxlZCA9IHRydWU7CisgICAgICAgIGlmIChtQ291bnREb3duTGF0Y2ggIT0gbnVsbCkgeworICAgICAgICAgICAgbUNvdW50RG93bkxhdGNoLmNvdW50RG93bigpOworICAgICAgICB9CisgICAgfQorICAgICovCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBwcmVwYXJlKCkgeworICAgICAgICBtUHJlcGFyZUNhbGxlZCA9IHRydWU7CisgICAgICAgIGlmIChtQ291bnREb3duTGF0Y2ggIT0gbnVsbCkgeworICAgICAgICAgICAgbUNvdW50RG93bkxhdGNoLmNvdW50RG93bigpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2Vla1RvKGxvbmcgcG9zKSB7CisgICAgICAgIG1TZWVrVG9DYWxsZWQgPSB0cnVlOworICAgICAgICBtU2Vla1Bvc2l0aW9uID0gcG9zOworICAgICAgICBpZiAobUNvdW50RG93bkxhdGNoICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Db3VudERvd25MYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNraXBUb05leHQoKSB7CisgICAgICAgIC8vIE5vLW9wLiBUaGlzIHNraXBUb05leHQoKSBtZWFucyAnc2tpcCB0byBuZXh0IGl0ZW0gaW4gdGhlIHNldE5leHREYXRhU291cmNlcygpJworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0UGxheWVyU3RhdGUoKSB7CisgICAgICAgIHJldHVybiBtTGFzdFBsYXllclN0YXRlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGdldEN1cnJlbnRQb3NpdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG1DdXJyZW50UG9zaXRpb247CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgZ2V0QnVmZmVyZWRQb3NpdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG1CdWZmZXJlZFBvc2l0aW9uOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0QnVmZmVyaW5nU3RhdGUoKSB7CisgICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlclBsYXllckV2ZW50Q2FsbGJhY2soQE5vbk51bGwgRXhlY3V0b3IgZXhlY3V0b3IsCisgICAgICAgICAgICBATm9uTnVsbCBQbGF5ZXJFdmVudENhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIG1DYWxsYmFja3MucHV0KGNhbGxiYWNrLCBleGVjdXRvcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdW5yZWdpc3RlclBsYXllckV2ZW50Q2FsbGJhY2soQE5vbk51bGwgUGxheWVyRXZlbnRDYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICBtQ2FsbGJhY2tzLnJlbW92ZShjYWxsYmFjayk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbm90aWZ5UGxheWJhY2tTdGF0ZShmaW5hbCBpbnQgc3RhdGUpIHsKKyAgICAgICAgbUxhc3RQbGF5ZXJTdGF0ZSA9IHN0YXRlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1DYWxsYmFja3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIFBsYXllckV2ZW50Q2FsbGJhY2sgY2FsbGJhY2sgPSBtQ2FsbGJhY2tzLmtleUF0KGkpOworICAgICAgICAgICAgZmluYWwgRXhlY3V0b3IgZXhlY3V0b3IgPSBtQ2FsbGJhY2tzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICBleGVjdXRvci5leGVjdXRlKCgpIC0+IGNhbGxiYWNrLm9uUGxheWVyU3RhdGVDaGFuZ2VkKHRoaXMsIHN0YXRlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlDdXJyZW50RGF0YVNvdXJjZUNoYW5nZWQoRGF0YVNvdXJjZURlc2MgZHNkKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUNhbGxiYWNrcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgZmluYWwgUGxheWVyRXZlbnRDYWxsYmFjayBjYWxsYmFjayA9IG1DYWxsYmFja3Mua2V5QXQoaSk7CisgICAgICAgICAgICBmaW5hbCBFeGVjdXRvciBleGVjdXRvciA9IG1DYWxsYmFja3MudmFsdWVBdChpKTsKKyAgICAgICAgICAgIGV4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gY2FsbGJhY2sub25DdXJyZW50RGF0YVNvdXJjZUNoYW5nZWQodGhpcywgZHNkKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlNZWRpYVByZXBhcmVkKERhdGFTb3VyY2VEZXNjIGRzZCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1DYWxsYmFja3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIFBsYXllckV2ZW50Q2FsbGJhY2sgY2FsbGJhY2sgPSBtQ2FsbGJhY2tzLmtleUF0KGkpOworICAgICAgICAgICAgZmluYWwgRXhlY3V0b3IgZXhlY3V0b3IgPSBtQ2FsbGJhY2tzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICBleGVjdXRvci5leGVjdXRlKCgpIC0+IGNhbGxiYWNrLm9uTWVkaWFQcmVwYXJlZCh0aGlzLCBkc2QpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG5vdGlmeUJ1ZmZlcmluZ1N0YXRlQ2hhbmdlZChEYXRhU291cmNlRGVzYyBkc2QsIEBCdWZmU3RhdGUgaW50IGJ1ZmZTdGF0ZSkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1DYWxsYmFja3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIFBsYXllckV2ZW50Q2FsbGJhY2sgY2FsbGJhY2sgPSBtQ2FsbGJhY2tzLmtleUF0KGkpOworICAgICAgICAgICAgZmluYWwgRXhlY3V0b3IgZXhlY3V0b3IgPSBtQ2FsbGJhY2tzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICBleGVjdXRvci5leGVjdXRlKCgpIC0+IGNhbGxiYWNrLm9uQnVmZmVyaW5nU3RhdGVDaGFuZ2VkKHRoaXMsIGRzZCwgYnVmZlN0YXRlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlFcnJvcihpbnQgd2hhdCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1DYWxsYmFja3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIFBsYXllckV2ZW50Q2FsbGJhY2sgY2FsbGJhY2sgPSBtQ2FsbGJhY2tzLmtleUF0KGkpOworICAgICAgICAgICAgZmluYWwgRXhlY3V0b3IgZXhlY3V0b3IgPSBtQ2FsbGJhY2tzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICAvLyBUT0RPOiBVbmNvbW1lbnQgb3IgcmVtb3ZlCisgICAgICAgICAgICAvL2V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gY2FsbGJhY2sub25FcnJvcihudWxsLCB3aGF0LCAwKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRBdWRpb0F0dHJpYnV0ZXMoQXVkaW9BdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKKyAgICAgICAgbUF1ZGlvQXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEF1ZGlvQXR0cmlidXRlcyBnZXRBdWRpb0F0dHJpYnV0ZXMoKSB7CisgICAgICAgIHJldHVybiBtQXVkaW9BdHRyaWJ1dGVzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldERhdGFTb3VyY2UoQE5vbk51bGwgRGF0YVNvdXJjZURlc2MgZHNkKSB7CisgICAgICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0TmV4dERhdGFTb3VyY2UoQE5vbk51bGwgRGF0YVNvdXJjZURlc2MgZHNkKSB7CisgICAgICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0TmV4dERhdGFTb3VyY2VzKEBOb25OdWxsIExpc3Q8RGF0YVNvdXJjZURlc2M+IGRzZHMpIHsKKyAgICAgICAgLy8gVE9ETzogSW1wbGVtZW50IHRoaXMKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRGF0YVNvdXJjZURlc2MgZ2V0Q3VycmVudERhdGFTb3VyY2UoKSB7CisgICAgICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGxvb3BDdXJyZW50KGJvb2xlYW4gbG9vcCkgeworICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFBsYXliYWNrU3BlZWQoZmxvYXQgc3BlZWQpIHsKKyAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRQbGF5ZXJWb2x1bWUoZmxvYXQgdm9sdW1lKSB7CisgICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZsb2F0IGdldFBsYXllclZvbHVtZSgpIHsKKyAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9OYXRpdmVDbGVhcktleVN5c3RlbVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9OYXRpdmVDbGVhcktleVN5c3RlbVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ0YTAyNC4uMDAwMDAwMAotLS0gYS90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvTmF0aXZlQ2xlYXJLZXlTeXN0ZW1UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEuY3RzOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFEcm07Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2U7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkFwaUxldmVsVXRpbDsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLk1lZGlhVXRpbHM7Ci1pbXBvcnQgY29tLmdvb2dsZS5hbmRyb2lkLmNvbGxlY3QuTGlzdHM7Ci0KLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlVVSUQ7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQubWF0Y2hlcnMuSlVuaXRNYXRjaGVycy5jb250YWluc1N0cmluZzsKLQotLyoqCi0gKiBUZXN0cyBNZWRpYURybSBOREsgQVBJcy4gQ2xlYXJLZXkgc3lzdGVtIHVzZXMgYSBzdWJzZXQgb2YgTkRLIEFQSXMsCi0gKiB0aGlzIHRlc3Qgb25seSB0ZXN0cyB0aGUgQVBJcyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgQ2xlYXJLZXkgc3lzdGVtLgotICovCi1wdWJsaWMgY2xhc3MgTmF0aXZlQ2xlYXJLZXlTeXN0ZW1UZXN0IGV4dGVuZHMgTWVkaWFQbGF5ZXJUZXN0QmFzZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IE5hdGl2ZUNsZWFyS2V5U3lzdGVtVGVzdC5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVElPTl9SRVRSSUVTID0gMTA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZJREVPX1dJRFRIX0NFTkMgPSAxMjgwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWSURFT19IRUlHSFRfQ0VOQyA9IDcyMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVNPX0JNRkZfVklERU9fTUlNRV9UWVBFID0gInZpZGVvL2F2YyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElTT19CTUZGX0FVRElPX01JTUVfVFlQRSA9ICJhdWRpby9hdmMiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVyaSBDRU5DX0FVRElPX1VSTCA9IFVyaS5wYXJzZSgKLSAgICAgICAgImh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS93dm1lZGlhL2NsZWFyL2gyNjQvbGxhbWEvIiArCi0gICAgICAgICJsbGFtYV9hYWNfYXVkaW8ubXA0Iik7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVcmkgQ0VOQ19DTEVBUktFWV9WSURFT19VUkwgPSBVcmkucGFyc2UoCi0gICAgICAgICJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vd3ZtZWRpYS9jbGVhcmtleS8iICsKLSAgICAgICAgImxsYW1hX2gyNjRfbWFpbl83MjBwXzgwMDAubXA0Iik7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVVVJRF9CWVRFX1NJWkUgPSAxNjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVVUlEIENPTU1PTl9QU1NIX1NDSEVNRV9VVUlEID0KLSAgICAgICAgICAgIG5ldyBVVUlEKDB4MTA3N2VmZWNjMGIyNGQwMkwsIDB4YWNlMzNjMWU1MmUyZmI0YkwpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVVSUQgQ0xFQVJLRVlfU0NIRU1FX1VVSUQgPQotICAgICAgICAgICAgbmV3IFVVSUQoMHhlMjcxOWQ1OGE5ODViM2M5TCwgMHg3ODFhYjAzMGFmNzhkMzBlTCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVVJRCBCQURfU0NIRU1FX1VVSUQgPQotICAgICAgICAgICAgbmV3IFVVSUQoMHhmZmZmZmZmZmZmZmZmZmZmTCwgMHhmZmZmZmZmZmZmZmZmZmZmTCk7Ci0gICAgcHJpdmF0ZSBNZWRpYUNvZGVjQ2xlYXJLZXlQbGF5ZXIgbU1lZGlhQ29kZWNQbGF5ZXI7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3lzdGVtLmxvYWRMaWJyYXJ5KCJjdHNtZWRpYWRybV9qbmkiKTsKLSAgICAgICAgfSBjYXRjaCAoVW5zYXRpc2ZpZWRMaW5rRXJyb3IgZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiTmF0aXZlQ2xlYXJLZXlTeXN0ZW1UZXN0OiBFcnJvciBsb2FkaW5nIEpOSSBsaWJyYXJ5Iik7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTeXN0ZW0ubG9hZExpYnJhcnkoIm1lZGlhbmRrIik7Ci0gICAgICAgIH0gY2F0Y2ggKFVuc2F0aXNmaWVkTGlua0Vycm9yIGUpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIk5hdGl2ZUNsZWFyS2V5U3lzdGVtVGVzdDogRXJyb3IgbG9hZGluZyBKTkkgbGlicmFyeSIpOwotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGxheWJhY2tQYXJhbXMgewotICAgICAgICBwdWJsaWMgU3VyZmFjZSBzdXJmYWNlOwotICAgICAgICBwdWJsaWMgU3RyaW5nIG1pbWVUeXBlOwotICAgICAgICBwdWJsaWMgU3RyaW5nIGF1ZGlvVXJsOwotICAgICAgICBwdWJsaWMgU3RyaW5nIHZpZGVvVXJsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIGlmIChmYWxzZSA9PSBkZXZpY2VIYXNNZWRpYURybSgpKSB7Ci0gICAgICAgICAgICB0ZWFyRG93bigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gd2F0Y2hIYXNOb0NsZWFya2V5U3VwcG9ydCgpIHsKLSAgICAgICAgaWYgKCFNZWRpYURybS5pc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChDTEVBUktFWV9TQ0hFTUVfVVVJRCkpIHsKLSAgICAgICAgICAgIGlmIChpc1dhdGNoRGV2aWNlKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJDcnlwdG8gc2NoZW1lIGlzIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzV2F0Y2hEZXZpY2UoKSB7Ci0gICAgICAgIHJldHVybiBtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9XQVRDSCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGRldmljZUhhc01lZGlhRHJtKCkgewotICAgICAgICAvLyBDbGVhcktleSBpcyBpbnRyb2R1Y2VkIGFmdGVyIEtpdEthdC4KLSAgICAgICAgaWYgKEFwaUxldmVsVXRpbC5pc0F0TW9zdChhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT05fQ09ERVMuS0lUS0FUKSkgewotICAgICAgICAgICAgTG9nLmkoVEFHLCAiVGhpcyB0ZXN0IGlzIGRlc2lnbmVkIHRvIHdvcmsgYWZ0ZXIgQW5kcm9pZCBLaXRLYXQuIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIHV1aWRCeXRlQXJyYXkoVVVJRCB1dWlkKSB7Ci0gICAgICAgIEJ5dGVCdWZmZXIgYnVmZmVyID0gQnl0ZUJ1ZmZlci53cmFwKG5ldyBieXRlW1VVSURfQllURV9TSVpFXSk7Ci0gICAgICAgIGJ1ZmZlci5wdXRMb25nKHV1aWQuZ2V0TW9zdFNpZ25pZmljYW50Qml0cygpKTsKLSAgICAgICAgYnVmZmVyLnB1dExvbmcodXVpZC5nZXRMZWFzdFNpZ25pZmljYW50Qml0cygpKTsKLSAgICAgICAgcmV0dXJuIGJ1ZmZlci5hcnJheSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAod2F0Y2hIYXNOb0NsZWFya2V5U3VwcG9ydCgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnRUcnVlKGlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkTmF0aXZlKHV1aWRCeXRlQXJyYXkoQ09NTU9OX1BTU0hfU0NIRU1FX1VVSUQpKSk7Ci0gICAgICAgIGFzc2VydFRydWUoaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWROYXRpdmUodXVpZEJ5dGVBcnJheShDTEVBUktFWV9TQ0hFTUVfVVVJRCkpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SXNDcnlwdG9TY2hlbWVOb3RTdXBwb3J0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0RmFsc2UoaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWROYXRpdmUodXVpZEJ5dGVBcnJheShCQURfU0NIRU1FX1VVSUQpKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBzc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gVGhlIHRlc3QgdXNlcyBhIGNhbm5lZCBQU1NIIHRoYXQgY29udGFpbnMgdGhlIGNvbW1vbiBib3ggVVVJRC4KLSAgICAgICAgYXNzZXJ0VHJ1ZSh0ZXN0UHNzaE5hdGl2ZSh1dWlkQnl0ZUFycmF5KENPTU1PTl9QU1NIX1NDSEVNRV9VVUlEKSwKLSAgICAgICAgICAgICAgICBDRU5DX0NMRUFSS0VZX1ZJREVPX1VSTC50b1N0cmluZygpKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFF1ZXJ5S2V5U3RhdHVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh3YXRjaEhhc05vQ2xlYXJrZXlTdXBwb3J0KCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydFRydWUodGVzdFF1ZXJ5S2V5U3RhdHVzTmF0aXZlKHV1aWRCeXRlQXJyYXkoQ0xFQVJLRVlfU0NIRU1FX1VVSUQpKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdldFByb3BlcnR5U3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh3YXRjaEhhc05vQ2xlYXJrZXlTdXBwb3J0KCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ0J1ZmZlciB2YWx1ZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgdGVzdEdldFByb3BlcnR5U3RyaW5nTmF0aXZlKHV1aWRCeXRlQXJyYXkoQ0xFQVJLRVlfU0NIRU1FX1VVSUQpLCAiZGVzY3JpcHRpb24iLCB2YWx1ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiQ2xlYXJLZXkgQ0RNIiwgdmFsdWUudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgdmFsdWUuZGVsZXRlKDAsIHZhbHVlLmxlbmd0aCgpKTsKLSAgICAgICAgdGVzdEdldFByb3BlcnR5U3RyaW5nTmF0aXZlKHV1aWRCeXRlQXJyYXkoQ0xFQVJLRVlfU0NIRU1FX1VVSUQpLCAiZGVzY3JpcHRpb24iLCB2YWx1ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiQ2xlYXJLZXkgQ0RNIiwgdmFsdWUudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFVua25vd25Qcm9wZXJ0eVN0cmluZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmdCdWZmZXIgdmFsdWUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRlc3RHZXRQcm9wZXJ0eVN0cmluZ05hdGl2ZSh1dWlkQnl0ZUFycmF5KENMRUFSS0VZX1NDSEVNRV9VVUlEKSwKLSAgICAgICAgICAgICAgICAgICAgInVua25vd24tcHJvcGVydHkiLCB2YWx1ZSk7Ci0gICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uIik7Ci0gICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAidGVzdFVua25vd25Qcm9wZXJ0eVN0cmluZyBlcnJvciA9ICciICsgZS5nZXRNZXNzYWdlKCkgKyAiJyIpOwotICAgICAgICAgICAgYXNzZXJ0VGhhdChlLmdldE1lc3NhZ2UoKSwgY29udGFpbnNTdHJpbmcoImdldCBwcm9wZXJ0eSBzdHJpbmcgcmV0dXJucyIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZhbHVlLmRlbGV0ZSgwLCB2YWx1ZS5sZW5ndGgoKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0ZXN0R2V0UHJvcGVydHlTdHJpbmdOYXRpdmUodXVpZEJ5dGVBcnJheShDTEVBUktFWV9TQ0hFTUVfVVVJRCksCi0gICAgICAgICAgICAgICAgICAgICJ1bmtub3duLXByb3BlcnR5IiwgdmFsdWUpOwotICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgInRlc3RVbmtub3duUHJvcGVydHlTdHJpbmcgZXJyb3IgPSAnIiArIGUuZ2V0TWVzc2FnZSgpICsgIiciKTsKLSAgICAgICAgICAgIGFzc2VydFRoYXQoZS5nZXRNZXNzYWdlKCksIGNvbnRhaW5zU3RyaW5nKCJnZXQgcHJvcGVydHkgc3RyaW5nIHJldHVybnMiKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyBuYXRpdmUgY2xlYXIga2V5IHN5c3RlbSBwbGF5YmFjay4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdGVzdENsZWFyS2V5UGxheWJhY2soCi0gICAgICAgICAgICBVVUlEIGRybVNjaGVtZVV1aWQsIFN0cmluZyBtaW1lVHlwZSwgLypTdHJpbmcgaW5pdERhdGFUeXBlLCovIFVyaSBhdWRpb1VybCwgVXJpIHZpZGVvVXJsLAotICAgICAgICAgICAgaW50IHZpZGVvV2lkdGgsIGludCB2aWRlb0hlaWdodCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKGlzV2F0Y2hEZXZpY2UoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZE5hdGl2ZSh1dWlkQnl0ZUFycmF5KGRybVNjaGVtZVV1aWQpKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJDcnlwdG8gc2NoZW1lIGlzIG5vdCBzdXBwb3J0ZWQuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBJQ29ubmVjdGlvblN0YXR1cyBjb25uZWN0aW9uU3RhdHVzID0gbmV3IENvbm5lY3Rpb25TdGF0dXMobUNvbnRleHQpOwotICAgICAgICBpZiAoIWNvbm5lY3Rpb25TdGF0dXMuaXNBdmFpbGFibGUoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJOZXR3b3JrIGlzIG5vdCBhdmFpbGFibGUsIHJlYXNvbjogIiArCi0gICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25TdGF0dXMuZ2V0Tm90Q29ubmVjdGVkUmVhc29uKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgZGV2aWNlIGlzIG5vdCBvbmxpbmUsIHJlY2hlY2sgdGhlIHN0YXR1cyBhIGZldyB0aW1lcy4KLSAgICAgICAgaW50IHJldHJpZXMgPSAwOwotICAgICAgICB3aGlsZSAoIWNvbm5lY3Rpb25TdGF0dXMuaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgaWYgKHJldHJpZXMrKyA+PSBDT05ORUNUSU9OX1JFVFJJRVMpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkRldmljZSBpcyBub3Qgb25saW5lLCByZWFzb246ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvblN0YXR1cy5nZXROb3RDb25uZWN0ZWRSZWFzb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDApOwotICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjb25uZWN0aW9uU3RhdHVzLnRlc3RDb25uZWN0aW9uKHZpZGVvVXJsKTsKLQotICAgICAgICBpZiAoIU1lZGlhVXRpbHMuY2hlY2tDb2RlY3NGb3JQYXRoKG1Db250ZXh0LCB2aWRlb1VybC50b1N0cmluZygpKSkgewotICAgICAgICAgICAgTG9nLmkoVEFHLCAiRGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgIiArCi0gICAgICAgICAgICAgICAgICB2aWRlb1dpZHRoICsgIngiICsgdmlkZW9IZWlnaHQgKyAiIHJlc29sdXRpb24gZm9yICIgKyBtaW1lVHlwZSk7Ci0gICAgICAgICAgICByZXR1cm47ICAvLyBza2lwCi0gICAgICAgIH0KLQotICAgICAgICBQbGF5YmFja1BhcmFtcyBwYXJhbXMgPSBuZXcgUGxheWJhY2tQYXJhbXMoKTsKLSAgICAgICAgcGFyYW1zLnN1cmZhY2UgPSBtQWN0aXZpdHkuZ2V0U3VyZmFjZUhvbGRlcigpLmdldFN1cmZhY2UoKTsKLSAgICAgICAgcGFyYW1zLm1pbWVUeXBlID0gbWltZVR5cGU7Ci0gICAgICAgIHBhcmFtcy5hdWRpb1VybCA9IGF1ZGlvVXJsLnRvU3RyaW5nKCk7Ci0gICAgICAgIHBhcmFtcy52aWRlb1VybCA9IHZpZGVvVXJsLnRvU3RyaW5nKCk7Ci0KLSAgICAgICAgaWYgKCF0ZXN0Q2xlYXJLZXlQbGF5YmFja05hdGl2ZSgKLSAgICAgICAgICAgIHV1aWRCeXRlQXJyYXkoZHJtU2NoZW1lVXVpZCksIHBhcmFtcykpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxzIHBsYXkgYmFjayB1c2luZyBuYXRpdmUgbWVkaWEgZHJtIEFQSXMuIik7Ci0gICAgICAgIH0KLSAgICAgICAgcGFyYW1zLnN1cmZhY2UucmVsZWFzZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgQXJyYXlMaXN0PEludGVnZXI+IGludFZlcnNpb24oU3RyaW5nIHZlcnNpb24pIHsKLSAgICAgICAgU3RyaW5nIHZlcnNpb25zW10gPSB2ZXJzaW9uLnNwbGl0KCJcXC4iKTsKLQotICAgICAgICBBcnJheUxpc3Q8SW50ZWdlcj4gdmVyc2lvbk51bWJlcnMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKLSAgICAgICAgZm9yIChTdHJpbmcgc3ViVmVyc2lvbiA6IHZlcnNpb25zKSB7Ci0gICAgICAgICAgICB2ZXJzaW9uTnVtYmVycy5hZGQoSW50ZWdlci5wYXJzZUludChzdWJWZXJzaW9uKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZlcnNpb25OdW1iZXJzOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBib29sZWFuIGlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkTmF0aXZlKGZpbmFsIGJ5dGVbXSB1dWlkKTsKLQotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBib29sZWFuIHRlc3RDbGVhcktleVBsYXliYWNrTmF0aXZlKGZpbmFsIGJ5dGVbXSB1dWlkLAotICAgICAgICAgICAgUGxheWJhY2tQYXJhbXMgcGFyYW1zKTsKLQotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBib29sZWFuIHRlc3RHZXRQcm9wZXJ0eVN0cmluZ05hdGl2ZShmaW5hbCBieXRlW10gdXVpZCwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lLCBTdHJpbmdCdWZmZXIgdmFsdWUpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gdGVzdFBzc2hOYXRpdmUoZmluYWwgYnl0ZVtdIHV1aWQsIGZpbmFsIFN0cmluZyB2aWRlb1VybCk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiB0ZXN0UXVlcnlLZXlTdGF0dXNOYXRpdmUoZmluYWwgYnl0ZVtdIHV1aWQpOwotCi0gICAgcHVibGljIHZvaWQgdGVzdENsZWFyS2V5UGxheWJhY2tDZW5jKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RDbGVhcktleVBsYXliYWNrKAotICAgICAgICAgICAgQ09NTU9OX1BTU0hfU0NIRU1FX1VVSUQsCi0gICAgICAgICAgICBJU09fQk1GRl9WSURFT19NSU1FX1RZUEUsCi0gICAgICAgICAgICBDRU5DX0FVRElPX1VSTCwKLSAgICAgICAgICAgIENFTkNfQ0xFQVJLRVlfVklERU9fVVJMLAotICAgICAgICAgICAgVklERU9fV0lEVEhfQ0VOQywgVklERU9fSEVJR0hUX0NFTkMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDbGVhcktleVBsYXliYWNrQ2VuYzIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdENsZWFyS2V5UGxheWJhY2soCi0gICAgICAgICAgICBDTEVBUktFWV9TQ0hFTUVfVVVJRCwKLSAgICAgICAgICAgIElTT19CTUZGX1ZJREVPX01JTUVfVFlQRSwKLSAgICAgICAgICAgIENFTkNfQVVESU9fVVJMLAotICAgICAgICAgICAgQ0VOQ19DTEVBUktFWV9WSURFT19VUkwsCi0gICAgICAgICAgICBWSURFT19XSURUSF9DRU5DLCBWSURFT19IRUlHSFRfQ0VOQyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL05hdGl2ZURlY29kZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvTmF0aXZlRGVjb2RlclRlc3QuamF2YQppbmRleCAzMmNmNjYxLi4zMTNjZmUzIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvTmF0aXZlRGVjb2RlclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvTmF0aXZlRGVjb2RlclRlc3QuamF2YQpAQCAtMzAsNiArMzAsNyBAQAogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKIGltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3I7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2U7CiBpbXBvcnQgYW5kcm9pZC53ZWJraXQuY3RzLkN0c1Rlc3RTZXJ2ZXI7CkBAIC01MSw2ICs1Miw3IEBACiBpbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLnV0aWwuVVVJRDsKIAorQEFwcE1vZGVGdWxsKHJlYXNvbiA9ICJUT0RPOiBldmFsdWF0ZSBhbmQgcG9ydCB0byBpbnN0YW50IikKIHB1YmxpYyBjbGFzcyBOYXRpdmVEZWNvZGVyVGVzdCBleHRlbmRzIE1lZGlhUGxheWVyVGVzdEJhc2UgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRGVjb2RlclRlc3QiOwogCkBAIC0xODMsNiArMTg1LDQ2IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludFtdIGdldFNhbXBsZVNpemVzTmF0aXZlKGludCBmZCwgbG9uZyBvZmZzZXQsIGxvbmcgc2l6ZSk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludFtdIGdldFNhbXBsZVNpemVzTmF0aXZlUGF0aChTdHJpbmcgcGF0aCk7CiAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXh0cmFjdG9yRmlsZUR1cmF0aW9uTmF0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGludCByZXMgPSBSLnJhdy52aWRlb18xMjgweDcyMF9tcDRfaDI2NF8xMDAwa2Jwc18yNWZwc19hYWNfc3RlcmVvXzEyOGticHNfNDQxMDBoejsKKyAgICAgICAgdGVzdEV4dHJhY3RvckZpbGVEdXJhdGlvbk5hdGl2ZShyZXMpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0RXh0cmFjdG9yRmlsZUR1cmF0aW9uTmF0aXZlKGludCByZXMpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIEFzc2V0RmlsZURlc2NyaXB0b3IgZmQgPSBtUmVzb3VyY2VzLm9wZW5SYXdSZXNvdXJjZUZkKHJlcyk7CisgICAgICAgIGxvbmcgZHVyYXRpb25VcyA9IGdldEV4dHJhY3RvckZpbGVEdXJhdGlvbk5hdGl2ZSgKKyAgICAgICAgICAgICAgICBmZC5nZXRQYXJjZWxGaWxlRGVzY3JpcHRvcigpLmdldEZkKCksIGZkLmdldFN0YXJ0T2Zmc2V0KCksIGZkLmdldExlbmd0aCgpKTsKKworICAgICAgICBNZWRpYUV4dHJhY3RvciBleCA9IG5ldyBNZWRpYUV4dHJhY3RvcigpOworICAgICAgICBleC5zZXREYXRhU291cmNlKGZkLmdldEZpbGVEZXNjcmlwdG9yKCksIGZkLmdldFN0YXJ0T2Zmc2V0KCksIGZkLmdldExlbmd0aCgpKTsKKworICAgICAgICBpbnQgbnVtdHJhY2tzID0gZXguZ2V0VHJhY2tDb3VudCgpOworICAgICAgICBsb25nIGFEdXJhdGlvblVzID0gLTEsIHZEdXJhdGlvblVzID0gLTE7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtdHJhY2tzOyBpKyspIHsKKyAgICAgICAgICAgIE1lZGlhRm9ybWF0IGZvcm1hdCA9IGV4LmdldFRyYWNrRm9ybWF0KGkpOworICAgICAgICAgICAgU3RyaW5nIG1pbWUgPSBmb3JtYXQuZ2V0U3RyaW5nKE1lZGlhRm9ybWF0LktFWV9NSU1FKTsKKyAgICAgICAgICAgIGlmIChtaW1lLnN0YXJ0c1dpdGgoImF1ZGlvLyIpKSB7CisgICAgICAgICAgICAgICAgYUR1cmF0aW9uVXMgPSBmb3JtYXQuZ2V0TG9uZyhNZWRpYUZvcm1hdC5LRVlfRFVSQVRJT04pOworICAgICAgICAgICAgfSBlbHNlIGlmIChtaW1lLnN0YXJ0c1dpdGgoInZpZGVvLyIpKSB7CisgICAgICAgICAgICAgICAgdkR1cmF0aW9uVXMgPSBmb3JtYXQuZ2V0TG9uZyhNZWRpYUZvcm1hdC5LRVlfRFVSQVRJT04pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZHVyYXRpb24gaW5jb25zaXN0ZW5jeSIsCisgICAgICAgICAgICAgICAgZHVyYXRpb25VcyA8IDAgfHwgZHVyYXRpb25VcyA+PSBhRHVyYXRpb25VcyAmJiBkdXJhdGlvblVzID49IHZEdXJhdGlvblVzKTsKKworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBsb25nIGdldEV4dHJhY3RvckZpbGVEdXJhdGlvbk5hdGl2ZShpbnQgZmQsIGxvbmcgb2Zmc2V0LCBsb25nIHNpemUpOworCisgICAgcHVibGljIHZvaWQgdGVzdEV4dHJhY3RvckNhY2hlZER1cmF0aW9uTmF0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEN0c1Rlc3RTZXJ2ZXIgZm9vID0gbmV3IEN0c1Rlc3RTZXJ2ZXIobUNvbnRleHQpOworICAgICAgICBsb25nIGNhY2hlZER1cmF0aW9uVXMgPSBnZXRFeHRyYWN0b3JDYWNoZWREdXJhdGlvbk5hdGl2ZShmb28uZ2V0QXNzZXRVcmwoInJpbmdlci5tcDMiKSk7CisgICAgICAgIGFzc2VydFRydWUoImNhY2hlZCBkdXJhdGlvbiBuZWdhdGl2ZSIsIGNhY2hlZER1cmF0aW9uVXMgPj0gMCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGxvbmcgZ2V0RXh0cmFjdG9yQ2FjaGVkRHVyYXRpb25OYXRpdmUoU3RyaW5nIHVyaSk7CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGVjb2RlcigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBpbnQgdGVzdHNSdW4gPQpAQCAtMjAzLDcgKzI0NSwyNyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgdGVzdERhdGFTb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IHRlc3RzUnVuID0gdGVzdERlY29kZXIoUi5yYXcudmlkZW9fMTc2eDE0NF8zZ3BfaDI2M18zMDBrYnBzXzEyZnBzX2FhY19tb25vXzI0a2Jwc18xMTAyNWh6LAorICAgICAgICAgICAgICAgIC8qIHdyYXBGZCAqLyB0cnVlLCAvKiB1c2VDYWxsYmFjayAqLyBmYWxzZSk7CisgICAgICAgIGlmICh0ZXN0c1J1biA9PSAwKSB7CisgICAgICAgICAgICBNZWRpYVV0aWxzLnNraXBUZXN0KCJubyBkZWNvZGVycyBmb3VuZCIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERhdGFTb3VyY2VXaXRoQ2FsbGJhY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IHRlc3RzUnVuID0gdGVzdERlY29kZXIoUi5yYXcudmlkZW9fMTc2eDE0NF8zZ3BfaDI2M18zMDBrYnBzXzEyZnBzX2FhY19tb25vXzI0a2Jwc18xMTAyNWh6LAorICAgICAgICAgICAgICAgIC8qIHdyYXBGZCAqLyB0cnVlLCAvKiB1c2VDYWxsYmFjayAqLyB0cnVlKTsKKyAgICAgICAgaWYgKHRlc3RzUnVuID09IDApIHsKKyAgICAgICAgICAgIE1lZGlhVXRpbHMuc2tpcFRlc3QoIm5vIGRlY29kZXJzIGZvdW5kIik7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwcml2YXRlIGludCB0ZXN0RGVjb2RlcihpbnQgcmVzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHRlc3REZWNvZGVyKHJlcywgLyogd3JhcEZkICovIGZhbHNlLCAvKiB1c2VDYWxsYmFjayAqLyBmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgdGVzdERlY29kZXIoaW50IHJlcywgYm9vbGVhbiB3cmFwRmQsIGJvb2xlYW4gdXNlQ2FsbGJhY2spIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBpZiAoIU1lZGlhVXRpbHMuaGFzQ29kZWNzRm9yUmVzb3VyY2UobUNvbnRleHQsIHJlcykpIHsKICAgICAgICAgICAgIHJldHVybiAwOyAvLyBza2lwCiAgICAgICAgIH0KQEAgLTIxMyw3ICsyNzUsOCBAQAogICAgICAgICBpbnRbXSBqZGF0YSA9IGdldERlY29kZWREYXRhKAogICAgICAgICAgICAgICAgIGZkLmdldEZpbGVEZXNjcmlwdG9yKCksIGZkLmdldFN0YXJ0T2Zmc2V0KCksIGZkLmdldExlbmd0aCgpKTsKICAgICAgICAgaW50W10gbmRhdGEgPSBnZXREZWNvZGVkRGF0YU5hdGl2ZSgKLSAgICAgICAgICAgICAgICBmZC5nZXRQYXJjZWxGaWxlRGVzY3JpcHRvcigpLmdldEZkKCksIGZkLmdldFN0YXJ0T2Zmc2V0KCksIGZkLmdldExlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICBmZC5nZXRQYXJjZWxGaWxlRGVzY3JpcHRvcigpLmdldEZkKCksIGZkLmdldFN0YXJ0T2Zmc2V0KCksIGZkLmdldExlbmd0aCgpLCB3cmFwRmQsCisgICAgICAgICAgICAgICAgdXNlQ2FsbGJhY2spOwogCiAgICAgICAgIGZkLmNsb3NlKCk7CiAgICAgICAgIExvZy5pKCJAQEAiLCBBcnJheXMudG9TdHJpbmcoamRhdGEpKTsKQEAgLTM4NCw3ICs0NDcsOCBAQAogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnRbXSBnZXREZWNvZGVkRGF0YU5hdGl2ZShpbnQgZmQsIGxvbmcgb2Zmc2V0LCBsb25nIHNpemUpCisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludFtdIGdldERlY29kZWREYXRhTmF0aXZlKGludCBmZCwgbG9uZyBvZmZzZXQsIGxvbmcgc2l6ZSwgYm9vbGVhbiB3cmFwRmQsCisgICAgICAgICAgICBib29sZWFuIHVzZUNhbGxiYWNrKQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgcHVibGljIHZvaWQgdGVzdFZpZGVvUGxheWJhY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9OYXRpdmVFbmNvZGVyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL05hdGl2ZUVuY29kZXJUZXN0LmphdmEKaW5kZXggMDhiYzhmOC4uNWNhY2ZlMSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL05hdGl2ZUVuY29kZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL05hdGl2ZUVuY29kZXJUZXN0LmphdmEKQEAgLTIzLDYgKzIzLDcgQEAKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5vcy5FbnZpcm9ubWVudDsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlOwogaW1wb3J0IGFuZHJvaWQud2Via2l0LmN0cy5DdHNUZXN0U2VydmVyOwpAQCAtNDQsNiArNDUsNyBAQAogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLlVVSUQ7CiAKK0BBcHBNb2RlRnVsbChyZWFzb24gPSAiVE9ETzogZXZhbHVhdGUgYW5kIHBvcnQgdG8gaW5zdGFudCIpCiBwdWJsaWMgY2xhc3MgTmF0aXZlRW5jb2RlclRlc3QgZXh0ZW5kcyBNZWRpYVBsYXllclRlc3RCYXNlIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk5hdGl2ZUVuY29kZXJUZXN0IjsKICAgICBwcml2YXRlIHN0YXRpYyBSZXNvdXJjZXMgbVJlc291cmNlczsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9OYXRpdmVJbWFnZVJlYWRlclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9OYXRpdmVJbWFnZVJlYWRlclRlc3QuamF2YQppbmRleCAxZDU3NjA5Li41ZGUzMDlhIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvTmF0aXZlSW1hZ2VSZWFkZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL05hdGl2ZUltYWdlUmVhZGVyVGVzdC5qYXZhCkBAIC0xNiw2ICsxNiw3IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5tZWRpYS5jdHM7CiAKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlOwpAQCAtMjMsNiArMjQsNyBAQAogLyoqCiAgKiBWZXJpZmljYXRpb24gdGVzdCBmb3IgQUltYWdlUmVhZGVyLgogICovCitAQXBwTW9kZUZ1bGwocmVhc29uID0gIlRPRE86IGV2YWx1YXRlIGFuZCBwb3J0IHRvIGluc3RhbnQiKQogcHVibGljIGNsYXNzIE5hdGl2ZUltYWdlUmVhZGVyVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJOYXRpdmVJbWFnZVJlYWRlclRlc3QiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gVkVSQk9TRSA9IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL05hdGl2ZU1lZGlhRHJtQ2xlYXJrZXlUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvTmF0aXZlTWVkaWFEcm1DbGVhcmtleVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTc5MGI1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL05hdGl2ZU1lZGlhRHJtQ2xlYXJrZXlUZXN0LmphdmEKQEAgLTAsMCArMSwyOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLm1lZGlhLmN0czsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRHJtOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZTsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQXBpTGV2ZWxVdGlsOworaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuTWVkaWFVdGlsczsKK2ltcG9ydCBjb20uZ29vZ2xlLmFuZHJvaWQuY29sbGVjdC5MaXN0czsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5tYXRjaGVycy5KVW5pdE1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nOworCisvKioKKyAqIFRlc3RzIE1lZGlhRHJtIE5ESyBBUElzLiBDbGVhcktleSBzeXN0ZW0gdXNlcyBhIHN1YnNldCBvZiBOREsgQVBJcywKKyAqIHRoaXMgdGVzdCBvbmx5IHRlc3RzIHRoZSBBUElzIHRoYXQgYXJlIHN1cHBvcnRlZCBieSBDbGVhcktleSBzeXN0ZW0uCisgKi8KK0BBcHBNb2RlRnVsbChyZWFzb24gPSAiVE9ETzogZXZhbHVhdGUgYW5kIHBvcnQgdG8gaW5zdGFudCIpCitwdWJsaWMgY2xhc3MgTmF0aXZlTWVkaWFEcm1DbGVhcmtleVRlc3QgZXh0ZW5kcyBNZWRpYVBsYXllclRlc3RCYXNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gTmF0aXZlTWVkaWFEcm1DbGVhcmtleVRlc3QuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RJT05fUkVUUklFUyA9IDEwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWSURFT19XSURUSF9DRU5DID0gMTI4MDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVklERU9fSEVJR0hUX0NFTkMgPSA3MjA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElTT19CTUZGX1ZJREVPX01JTUVfVFlQRSA9ICJ2aWRlby9hdmMiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJU09fQk1GRl9BVURJT19NSU1FX1RZUEUgPSAiYXVkaW8vYXZjIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVcmkgQ0VOQ19BVURJT19VUkwgPSBVcmkucGFyc2UoCisgICAgICAgICJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vd3ZtZWRpYS9jbGVhci9oMjY0L2xsYW1hLyIgKworICAgICAgICAibGxhbWFfYWFjX2F1ZGlvLm1wNCIpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVXJpIENFTkNfQ0xFQVJLRVlfVklERU9fVVJMID0gVXJpLnBhcnNlKAorICAgICAgICAiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3d2bWVkaWEvY2xlYXJrZXkvIiArCisgICAgICAgICJsbGFtYV9oMjY0X21haW5fNzIwcF84MDAwLm1wNCIpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVVSURfQllURV9TSVpFID0gMTY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVVJRCBDT01NT05fUFNTSF9TQ0hFTUVfVVVJRCA9CisgICAgICAgICAgICBuZXcgVVVJRCgweDEwNzdlZmVjYzBiMjRkMDJMLCAweGFjZTMzYzFlNTJlMmZiNGJMKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVVUlEIENMRUFSS0VZX1NDSEVNRV9VVUlEID0KKyAgICAgICAgICAgIG5ldyBVVUlEKDB4ZTI3MTlkNThhOTg1YjNjOUwsIDB4NzgxYWIwMzBhZjc4ZDMwZUwpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVVSUQgQkFEX1NDSEVNRV9VVUlEID0KKyAgICAgICAgICAgIG5ldyBVVUlEKDB4ZmZmZmZmZmZmZmZmZmZmZkwsIDB4ZmZmZmZmZmZmZmZmZmZmZkwpOworICAgIHByaXZhdGUgTWVkaWFDb2RlY0NsZWFyS2V5UGxheWVyIG1NZWRpYUNvZGVjUGxheWVyOworCisgICAgc3RhdGljIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN5c3RlbS5sb2FkTGlicmFyeSgiY3RzbWVkaWFkcm1fam5pIik7CisgICAgICAgIH0gY2F0Y2ggKFVuc2F0aXNmaWVkTGlua0Vycm9yIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIk5hdGl2ZU1lZGlhRHJtQ2xlYXJrZXlUZXN0OiBFcnJvciBsb2FkaW5nIEpOSSBsaWJyYXJ5Iik7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTeXN0ZW0ubG9hZExpYnJhcnkoIm1lZGlhbmRrIik7CisgICAgICAgIH0gY2F0Y2ggKFVuc2F0aXNmaWVkTGlua0Vycm9yIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIk5hdGl2ZU1lZGlhRHJtQ2xlYXJrZXlUZXN0OiBFcnJvciBsb2FkaW5nIEpOSSBsaWJyYXJ5Iik7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQbGF5YmFja1BhcmFtcyB7CisgICAgICAgIHB1YmxpYyBTdXJmYWNlIHN1cmZhY2U7CisgICAgICAgIHB1YmxpYyBTdHJpbmcgbWltZVR5cGU7CisgICAgICAgIHB1YmxpYyBTdHJpbmcgYXVkaW9Vcmw7CisgICAgICAgIHB1YmxpYyBTdHJpbmcgdmlkZW9Vcmw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgaWYgKGZhbHNlID09IGRldmljZUhhc01lZGlhRHJtKCkpIHsKKyAgICAgICAgICAgIHRlYXJEb3duKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiB3YXRjaEhhc05vQ2xlYXJrZXlTdXBwb3J0KCkgeworICAgICAgICBpZiAoIU1lZGlhRHJtLmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKENMRUFSS0VZX1NDSEVNRV9VVUlEKSkgeworICAgICAgICAgICAgaWYgKGlzV2F0Y2hEZXZpY2UoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkNyeXB0byBzY2hlbWUgaXMgbm90IHN1cHBvcnRlZCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNXYXRjaERldmljZSgpIHsKKyAgICAgICAgcmV0dXJuIG1Db250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCkuaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX1dBVENIKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gZGV2aWNlSGFzTWVkaWFEcm0oKSB7CisgICAgICAgIC8vIENsZWFyS2V5IGlzIGludHJvZHVjZWQgYWZ0ZXIgS2l0S2F0LgorICAgICAgICBpZiAoQXBpTGV2ZWxVdGlsLmlzQXRNb3N0KGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTl9DT0RFUy5LSVRLQVQpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIHV1aWRCeXRlQXJyYXkoVVVJRCB1dWlkKSB7CisgICAgICAgIEJ5dGVCdWZmZXIgYnVmZmVyID0gQnl0ZUJ1ZmZlci53cmFwKG5ldyBieXRlW1VVSURfQllURV9TSVpFXSk7CisgICAgICAgIGJ1ZmZlci5wdXRMb25nKHV1aWQuZ2V0TW9zdFNpZ25pZmljYW50Qml0cygpKTsKKyAgICAgICAgYnVmZmVyLnB1dExvbmcodXVpZC5nZXRMZWFzdFNpZ25pZmljYW50Qml0cygpKTsKKyAgICAgICAgcmV0dXJuIGJ1ZmZlci5hcnJheSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAod2F0Y2hIYXNOb0NsZWFya2V5U3VwcG9ydCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRUcnVlKGlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkTmF0aXZlKHV1aWRCeXRlQXJyYXkoQ09NTU9OX1BTU0hfU0NIRU1FX1VVSUQpKSk7CisgICAgICAgIGFzc2VydFRydWUoaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWROYXRpdmUodXVpZEJ5dGVBcnJheShDTEVBUktFWV9TQ0hFTUVfVVVJRCkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNDcnlwdG9TY2hlbWVOb3RTdXBwb3J0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RmFsc2UoaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWROYXRpdmUodXVpZEJ5dGVBcnJheShCQURfU0NIRU1FX1VVSUQpKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFBzc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gVGhlIHRlc3QgdXNlcyBhIGNhbm5lZCBQU1NIIHRoYXQgY29udGFpbnMgdGhlIGNvbW1vbiBib3ggVVVJRC4KKyAgICAgICAgYXNzZXJ0VHJ1ZSh0ZXN0UHNzaE5hdGl2ZSh1dWlkQnl0ZUFycmF5KENPTU1PTl9QU1NIX1NDSEVNRV9VVUlEKSwKKyAgICAgICAgICAgICAgICBDRU5DX0NMRUFSS0VZX1ZJREVPX1VSTC50b1N0cmluZygpKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFF1ZXJ5S2V5U3RhdHVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICh3YXRjaEhhc05vQ2xlYXJrZXlTdXBwb3J0KCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydFRydWUodGVzdFF1ZXJ5S2V5U3RhdHVzTmF0aXZlKHV1aWRCeXRlQXJyYXkoQ0xFQVJLRVlfU0NIRU1FX1VVSUQpKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZpbmRTZXNzaW9uSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHdhdGNoSGFzTm9DbGVhcmtleVN1cHBvcnQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSh0ZXN0RmluZFNlc3Npb25JZE5hdGl2ZSh1dWlkQnl0ZUFycmF5KENMRUFSS0VZX1NDSEVNRV9VVUlEKSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRQcm9wZXJ0eVN0cmluZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAod2F0Y2hIYXNOb0NsZWFya2V5U3VwcG9ydCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmdCdWZmZXIgdmFsdWUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIHRlc3RHZXRQcm9wZXJ0eVN0cmluZ05hdGl2ZSh1dWlkQnl0ZUFycmF5KENMRUFSS0VZX1NDSEVNRV9VVUlEKSwgImRlc2NyaXB0aW9uIiwgdmFsdWUpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkNsZWFyS2V5IENETSIsIHZhbHVlLnRvU3RyaW5nKCkpOworCisgICAgICAgIHZhbHVlLmRlbGV0ZSgwLCB2YWx1ZS5sZW5ndGgoKSk7CisgICAgICAgIHRlc3RHZXRQcm9wZXJ0eVN0cmluZ05hdGl2ZSh1dWlkQnl0ZUFycmF5KENMRUFSS0VZX1NDSEVNRV9VVUlEKSwgImRlc2NyaXB0aW9uIiwgdmFsdWUpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkNsZWFyS2V5IENETSIsIHZhbHVlLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RVbmtub3duUHJvcGVydHlTdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHZhbHVlID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0ZXN0R2V0UHJvcGVydHlTdHJpbmdOYXRpdmUodXVpZEJ5dGVBcnJheShDTEVBUktFWV9TQ0hFTUVfVVVJRCksCisgICAgICAgICAgICAgICAgICAgICJ1bmtub3duLXByb3BlcnR5IiwgdmFsdWUpOworICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgInRlc3RVbmtub3duUHJvcGVydHlTdHJpbmcgZXJyb3IgPSAnIiArIGUuZ2V0TWVzc2FnZSgpICsgIiciKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoZS5nZXRNZXNzYWdlKCksIGNvbnRhaW5zU3RyaW5nKCJnZXQgcHJvcGVydHkgc3RyaW5nIHJldHVybnMiKSk7CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZS5kZWxldGUoMCwgdmFsdWUubGVuZ3RoKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGVzdEdldFByb3BlcnR5U3RyaW5nTmF0aXZlKHV1aWRCeXRlQXJyYXkoQ0xFQVJLRVlfU0NIRU1FX1VVSUQpLAorICAgICAgICAgICAgICAgICAgICAidW5rbm93bi1wcm9wZXJ0eSIsIHZhbHVlKTsKKyAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJ0ZXN0VW5rbm93blByb3BlcnR5U3RyaW5nIGVycm9yID0gJyIgKyBlLmdldE1lc3NhZ2UoKSArICInIik7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGUuZ2V0TWVzc2FnZSgpLCBjb250YWluc1N0cmluZygiZ2V0IHByb3BlcnR5IHN0cmluZyByZXR1cm5zIikpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgbmF0aXZlIGNsZWFyIGtleSBzeXN0ZW0gcGxheWJhY2suCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RDbGVhcktleVBsYXliYWNrKAorICAgICAgICAgICAgVVVJRCBkcm1TY2hlbWVVdWlkLCBTdHJpbmcgbWltZVR5cGUsIC8qU3RyaW5nIGluaXREYXRhVHlwZSwqLyBVcmkgYXVkaW9VcmwsIFVyaSB2aWRlb1VybCwKKyAgICAgICAgICAgIGludCB2aWRlb1dpZHRoLCBpbnQgdmlkZW9IZWlnaHQpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIGlmIChpc1dhdGNoRGV2aWNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWROYXRpdmUodXVpZEJ5dGVBcnJheShkcm1TY2hlbWVVdWlkKSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQ3J5cHRvIHNjaGVtZSBpcyBub3Qgc3VwcG9ydGVkLiIpOworICAgICAgICB9CisKKyAgICAgICAgSUNvbm5lY3Rpb25TdGF0dXMgY29ubmVjdGlvblN0YXR1cyA9IG5ldyBDb25uZWN0aW9uU3RhdHVzKG1Db250ZXh0KTsKKyAgICAgICAgaWYgKCFjb25uZWN0aW9uU3RhdHVzLmlzQXZhaWxhYmxlKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiTmV0d29yayBpcyBub3QgYXZhaWxhYmxlLCByZWFzb246ICIgKworICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uU3RhdHVzLmdldE5vdENvbm5lY3RlZFJlYXNvbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIGRldmljZSBpcyBub3Qgb25saW5lLCByZWNoZWNrIHRoZSBzdGF0dXMgYSBmZXcgdGltZXMuCisgICAgICAgIGludCByZXRyaWVzID0gMDsKKyAgICAgICAgd2hpbGUgKCFjb25uZWN0aW9uU3RhdHVzLmlzQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgICAgIGlmIChyZXRyaWVzKysgPj0gQ09OTkVDVElPTl9SRVRSSUVTKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJEZXZpY2UgaXMgbm90IG9ubGluZSwgcmVhc29uOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25TdGF0dXMuZ2V0Tm90Q29ubmVjdGVkUmVhc29uKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29ubmVjdGlvblN0YXR1cy50ZXN0Q29ubmVjdGlvbih2aWRlb1VybCk7CisKKyAgICAgICAgaWYgKCFNZWRpYVV0aWxzLmNoZWNrQ29kZWNzRm9yUGF0aChtQ29udGV4dCwgdmlkZW9VcmwudG9TdHJpbmcoKSkpIHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgIkRldmljZSBkb2VzIG5vdCBzdXBwb3J0ICIgKworICAgICAgICAgICAgICAgICAgdmlkZW9XaWR0aCArICJ4IiArIHZpZGVvSGVpZ2h0ICsgIiByZXNvbHV0aW9uIGZvciAiICsgbWltZVR5cGUpOworICAgICAgICAgICAgcmV0dXJuOyAgLy8gc2tpcAorICAgICAgICB9CisKKyAgICAgICAgUGxheWJhY2tQYXJhbXMgcGFyYW1zID0gbmV3IFBsYXliYWNrUGFyYW1zKCk7CisgICAgICAgIHBhcmFtcy5zdXJmYWNlID0gbUFjdGl2aXR5LmdldFN1cmZhY2VIb2xkZXIoKS5nZXRTdXJmYWNlKCk7CisgICAgICAgIHBhcmFtcy5taW1lVHlwZSA9IG1pbWVUeXBlOworICAgICAgICBwYXJhbXMuYXVkaW9VcmwgPSBhdWRpb1VybC50b1N0cmluZygpOworICAgICAgICBwYXJhbXMudmlkZW9VcmwgPSB2aWRlb1VybC50b1N0cmluZygpOworCisgICAgICAgIGlmICghdGVzdENsZWFyS2V5UGxheWJhY2tOYXRpdmUoCisgICAgICAgICAgICB1dWlkQnl0ZUFycmF5KGRybVNjaGVtZVV1aWQpLCBwYXJhbXMpKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJGYWlscyBwbGF5IGJhY2sgdXNpbmcgbmF0aXZlIG1lZGlhIGRybSBBUElzLiIpOworICAgICAgICB9CisgICAgICAgIHBhcmFtcy5zdXJmYWNlLnJlbGVhc2UoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEFycmF5TGlzdDxJbnRlZ2VyPiBpbnRWZXJzaW9uKFN0cmluZyB2ZXJzaW9uKSB7CisgICAgICAgIFN0cmluZyB2ZXJzaW9uc1tdID0gdmVyc2lvbi5zcGxpdCgiXFwuIik7CisKKyAgICAgICAgQXJyYXlMaXN0PEludGVnZXI+IHZlcnNpb25OdW1iZXJzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgICAgIGZvciAoU3RyaW5nIHN1YlZlcnNpb24gOiB2ZXJzaW9ucykgeworICAgICAgICAgICAgdmVyc2lvbk51bWJlcnMuYWRkKEludGVnZXIucGFyc2VJbnQoc3ViVmVyc2lvbikpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2ZXJzaW9uTnVtYmVyczsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZE5hdGl2ZShmaW5hbCBieXRlW10gdXVpZCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiB0ZXN0Q2xlYXJLZXlQbGF5YmFja05hdGl2ZShmaW5hbCBieXRlW10gdXVpZCwKKyAgICAgICAgICAgIFBsYXliYWNrUGFyYW1zIHBhcmFtcyk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiB0ZXN0RmluZFNlc3Npb25JZE5hdGl2ZShmaW5hbCBieXRlW10gdXVpZCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiB0ZXN0R2V0UHJvcGVydHlTdHJpbmdOYXRpdmUoZmluYWwgYnl0ZVtdIHV1aWQsCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSwgU3RyaW5nQnVmZmVyIHZhbHVlKTsKKworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBib29sZWFuIHRlc3RQc3NoTmF0aXZlKGZpbmFsIGJ5dGVbXSB1dWlkLCBmaW5hbCBTdHJpbmcgdmlkZW9VcmwpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gdGVzdFF1ZXJ5S2V5U3RhdHVzTmF0aXZlKGZpbmFsIGJ5dGVbXSB1dWlkKTsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RDbGVhcktleVBsYXliYWNrQ2VuYygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0Q2xlYXJLZXlQbGF5YmFjaygKKyAgICAgICAgICAgIENPTU1PTl9QU1NIX1NDSEVNRV9VVUlELAorICAgICAgICAgICAgSVNPX0JNRkZfVklERU9fTUlNRV9UWVBFLAorICAgICAgICAgICAgQ0VOQ19BVURJT19VUkwsCisgICAgICAgICAgICBDRU5DX0NMRUFSS0VZX1ZJREVPX1VSTCwKKyAgICAgICAgICAgIFZJREVPX1dJRFRIX0NFTkMsIFZJREVPX0hFSUdIVF9DRU5DKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJLZXlQbGF5YmFja0NlbmMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RDbGVhcktleVBsYXliYWNrKAorICAgICAgICAgICAgQ0xFQVJLRVlfU0NIRU1FX1VVSUQsCisgICAgICAgICAgICBJU09fQk1GRl9WSURFT19NSU1FX1RZUEUsCisgICAgICAgICAgICBDRU5DX0FVRElPX1VSTCwKKyAgICAgICAgICAgIENFTkNfQ0xFQVJLRVlfVklERU9fVVJMLAorICAgICAgICAgICAgVklERU9fV0lEVEhfQ0VOQywgVklERU9fSEVJR0hUX0NFTkMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9QYXJhbXNUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvUGFyYW1zVGVzdC5qYXZhCmluZGV4IDZjZjliZTYuLjQ3Mjg5YTIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9QYXJhbXNUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL1BhcmFtc1Rlc3QuamF2YQpAQCAtMjIsNiArMjIsNyBAQAogaW1wb3J0IGFuZHJvaWQubWVkaWEuUGxheWJhY2tQYXJhbXM7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5TeW5jUGFyYW1zOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIGltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwogCiAvKioKQEAgLTI5LDYgKzMwLDcgQEAKICAqCiAgKiBJbiBwYXJ0aWN1bGFyLCBjaGVjayBQYXJhbXMgb2JqZWN0cycgYmVoYXZpb3IuCiAgKi8KK0BBcHBNb2RlRnVsbChyZWFzb24gPSAiVE9ETzogZXZhbHVhdGUgYW5kIHBvcnQgdG8gaW5zdGFudCIpCiBwdWJsaWMgY2xhc3MgUGFyYW1zVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJQYXJhbXNUZXN0IjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBGTE9BVF9UT0xFUkFOQ0UgPSAuMDAwMDFmOwpAQCAtMzczLDU5ICszNzUsMTggQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0QnVmZmVyaW5nUGFyYW1zQnVpbGRlckFuZEdldCgpIHsKLSAgICAgICAgZmluYWwgaW50IGluaXRpYWxNb2RlID0gQnVmZmVyaW5nUGFyYW1zLkJVRkZFUklOR19NT0RFX1RJTUVfVEhFTl9TSVpFOwogICAgICAgICBmaW5hbCBpbnQgaW5pdGlhbE1hcmtNcyA9IDI7Ci0gICAgICAgIGZpbmFsIGludCBpbml0aWFsTWFya0tCID0gMjA7Ci0gICAgICAgIGZpbmFsIGludCByZWJ1ZmZlcmluZ01vZGUgPSBCdWZmZXJpbmdQYXJhbXMuQlVGRkVSSU5HX01PREVfVElNRV9USEVOX1NJWkU7Ci0gICAgICAgIGZpbmFsIGludCByZWJ1ZmZlcmluZ01hcmtMb3dNcyA9IDE7Ci0gICAgICAgIGZpbmFsIGludCByZWJ1ZmZlcmluZ01hcmtIaWdoTXMgPSAzOwotICAgICAgICBmaW5hbCBpbnQgcmVidWZmZXJpbmdNYXJrTG93S0IgPSAxMDsKLSAgICAgICAgZmluYWwgaW50IHJlYnVmZmVyaW5nTWFya0hpZ2hLQiA9IDMwOworICAgICAgICBmaW5hbCBpbnQgcmVzdW1lUGxheWJhY2tNYXJrTXMgPSAzOwogCiAgICAgICAgIEJ1ZmZlcmluZ1BhcmFtcyBwMSA9IG5ldyBCdWZmZXJpbmdQYXJhbXMuQnVpbGRlcigpCi0gICAgICAgICAgICAgICAgLnNldEluaXRpYWxCdWZmZXJpbmdNb2RlKGluaXRpYWxNb2RlKQotICAgICAgICAgICAgICAgIC5zZXRJbml0aWFsQnVmZmVyaW5nV2F0ZXJtYXJrTXMoaW5pdGlhbE1hcmtNcykKLSAgICAgICAgICAgICAgICAuc2V0SW5pdGlhbEJ1ZmZlcmluZ1dhdGVybWFya0tCKGluaXRpYWxNYXJrS0IpCi0gICAgICAgICAgICAgICAgLnNldFJlYnVmZmVyaW5nTW9kZShyZWJ1ZmZlcmluZ01vZGUpCi0gICAgICAgICAgICAgICAgLnNldFJlYnVmZmVyaW5nV2F0ZXJtYXJrTG93TXMocmVidWZmZXJpbmdNYXJrTG93TXMpCi0gICAgICAgICAgICAgICAgLnNldFJlYnVmZmVyaW5nV2F0ZXJtYXJrSGlnaE1zKHJlYnVmZmVyaW5nTWFya0hpZ2hNcykKLSAgICAgICAgICAgICAgICAuc2V0UmVidWZmZXJpbmdXYXRlcm1hcmtMb3dLQihyZWJ1ZmZlcmluZ01hcmtMb3dLQikKLSAgICAgICAgICAgICAgICAuc2V0UmVidWZmZXJpbmdXYXRlcm1hcmtIaWdoS0IocmVidWZmZXJpbmdNYXJrSGlnaEtCKQorICAgICAgICAgICAgICAgIC5zZXRJbml0aWFsTWFya01zKGluaXRpYWxNYXJrTXMpCisgICAgICAgICAgICAgICAgLnNldFJlc3VtZVBsYXliYWNrTWFya01zKHJlc3VtZVBsYXliYWNrTWFya01zKQogICAgICAgICAgICAgICAgIC5idWlsZCgpOwogCi0gICAgICAgIGFzc2VydEVxdWFscygiaW5pdGlhbCBidWZmZXJpbmcgbW9kZSBzaG91bGQgbWF0Y2giLAotICAgICAgICAgICAgICAgIHAxLmdldEluaXRpYWxCdWZmZXJpbmdNb2RlKCksIGluaXRpYWxNb2RlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZWJ1ZmZlcmluZyBtb2RlIHNob3VsZCBtYXRjaCIsCi0gICAgICAgICAgICAgICAgcDEuZ2V0UmVidWZmZXJpbmdNb2RlKCksIHJlYnVmZmVyaW5nTW9kZSk7CiAgICAgICAgIGFzc2VydEVxdWFscygiaW50aWFsIG1hcmtNcyBzaG91bGQgbWF0Y2giLAotICAgICAgICAgICAgICAgIHAxLmdldEluaXRpYWxCdWZmZXJpbmdXYXRlcm1hcmtNcygpLCBpbml0aWFsTWFya01zKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbnRpYWwgbWFya0tCIHNob3VsZCBtYXRjaCIsCi0gICAgICAgICAgICAgICAgcDEuZ2V0SW5pdGlhbEJ1ZmZlcmluZ1dhdGVybWFya0tCKCksIGluaXRpYWxNYXJrS0IpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInJlYnVmZmVyaW5nIGxvdyBtYXJrTXMgc2hvdWxkIG1hdGNoIiwKLSAgICAgICAgICAgICAgICBwMS5nZXRSZWJ1ZmZlcmluZ1dhdGVybWFya0xvd01zKCksIHJlYnVmZmVyaW5nTWFya0xvd01zKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZWJ1ZmZlcmluZyBsb3cgbWFya0tCIHNob3VsZCBtYXRjaCIsCi0gICAgICAgICAgICAgICAgcDEuZ2V0UmVidWZmZXJpbmdXYXRlcm1hcmtMb3dLQigpLCByZWJ1ZmZlcmluZ01hcmtMb3dLQik7Ci0gICAgICAgIGFzc2VydEVxdWFscygicmVidWZmZXJpbmcgaGlnaCBtYXJrTXMgc2hvdWxkIG1hdGNoIiwKLSAgICAgICAgICAgICAgICBwMS5nZXRSZWJ1ZmZlcmluZ1dhdGVybWFya0hpZ2hNcygpLCByZWJ1ZmZlcmluZ01hcmtIaWdoTXMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInJlYnVmZmVyaW5nIGhpZ2ggbWFya0tCIHNob3VsZCBtYXRjaCIsCi0gICAgICAgICAgICAgICAgcDEuZ2V0UmVidWZmZXJpbmdXYXRlcm1hcmtIaWdoS0IoKSwgcmVidWZmZXJpbmdNYXJrSGlnaEtCKTsKLQotICAgICAgICBmaW5hbCBpbnQgcmVidWZmZXJpbmdNYXJrTG93TXNQYWlyID0gNDsKLSAgICAgICAgZmluYWwgaW50IHJlYnVmZmVyaW5nTWFya0hpZ2hNc1BhaXIgPSA1OwotICAgICAgICBmaW5hbCBpbnQgcmVidWZmZXJpbmdNYXJrTG93S0JQYWlyID0gNDA7Ci0gICAgICAgIGZpbmFsIGludCByZWJ1ZmZlcmluZ01hcmtIaWdoS0JQYWlyID0gNTA7Ci0gICAgICAgIEJ1ZmZlcmluZ1BhcmFtcyBwMiA9IG5ldyBCdWZmZXJpbmdQYXJhbXMuQnVpbGRlcihwMSkKLSAgICAgICAgICAgICAgICAuc2V0UmVidWZmZXJpbmdXYXRlcm1hcmtzTXMocmVidWZmZXJpbmdNYXJrTG93TXNQYWlyLCByZWJ1ZmZlcmluZ01hcmtIaWdoTXNQYWlyKQotICAgICAgICAgICAgICAgIC5zZXRSZWJ1ZmZlcmluZ1dhdGVybWFya3NLQihyZWJ1ZmZlcmluZ01hcmtMb3dLQlBhaXIsIHJlYnVmZmVyaW5nTWFya0hpZ2hLQlBhaXIpCi0gICAgICAgICAgICAgICAgLmJ1aWxkKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicGFpcmVkIGxvdyBtYXJrTXMgc2hvdWxkIG1hdGNoIiwKLSAgICAgICAgICAgICAgICBwMi5nZXRSZWJ1ZmZlcmluZ1dhdGVybWFya0xvd01zKCksIHJlYnVmZmVyaW5nTWFya0xvd01zUGFpcik7Ci0gICAgICAgIGFzc2VydEVxdWFscygicGFpcmVkIGxvdyBtYXJrS0Igc2hvdWxkIG1hdGNoIiwKLSAgICAgICAgICAgICAgICBwMi5nZXRSZWJ1ZmZlcmluZ1dhdGVybWFya0xvd0tCKCksIHJlYnVmZmVyaW5nTWFya0xvd0tCUGFpcik7Ci0gICAgICAgIGFzc2VydEVxdWFscygicGFpcmVkIGhpZ2ggbWFya01zIHNob3VsZCBtYXRjaCIsCi0gICAgICAgICAgICAgICAgcDIuZ2V0UmVidWZmZXJpbmdXYXRlcm1hcmtIaWdoTXMoKSwgcmVidWZmZXJpbmdNYXJrSGlnaE1zUGFpcik7Ci0gICAgICAgIGFzc2VydEVxdWFscygicGFpcmVkIGhpZ2ggbWFya0tCIHNob3VsZCBtYXRjaCIsCi0gICAgICAgICAgICAgICAgcDIuZ2V0UmVidWZmZXJpbmdXYXRlcm1hcmtIaWdoS0IoKSwgcmVidWZmZXJpbmdNYXJrSGlnaEtCUGFpcik7CisgICAgICAgICAgICAgICAgcDEuZ2V0SW5pdGlhbE1hcmtNcygpLCBpbml0aWFsTWFya01zKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZXN1bWUgcGxheWJhY2sgbWFya01zIHNob3VsZCBtYXRjaCIsCisgICAgICAgICAgICAgICAgcDEuZ2V0UmVzdW1lUGxheWJhY2tNYXJrTXMoKSwgcmVzdW1lUGxheWJhY2tNYXJrTXMpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RCdWZmZXJpbmdQYXJhbXNEZXNjcmliZUNvbnRlbnRzKCkgewpAQCAtNDM0LDI0ICszOTUsMTIgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0QnVmZmVyaW5nUGFyYW1zV3JpdGVUb1BhcmNlbCgpIHsKLSAgICAgICAgZmluYWwgaW50IGluaXRpYWxNb2RlID0gQnVmZmVyaW5nUGFyYW1zLkJVRkZFUklOR19NT0RFX1RJTUVfVEhFTl9TSVpFOwogICAgICAgICBmaW5hbCBpbnQgaW5pdGlhbE1hcmtNcyA9IDI7Ci0gICAgICAgIGZpbmFsIGludCBpbml0aWFsTWFya0tCID0gMjA7Ci0gICAgICAgIGZpbmFsIGludCByZWJ1ZmZlcmluZ01vZGUgPSBCdWZmZXJpbmdQYXJhbXMuQlVGRkVSSU5HX01PREVfVElNRV9USEVOX1NJWkU7Ci0gICAgICAgIGZpbmFsIGludCByZWJ1ZmZlcmluZ01hcmtMb3dNcyA9IDE7Ci0gICAgICAgIGZpbmFsIGludCByZWJ1ZmZlcmluZ01hcmtIaWdoTXMgPSAzOwotICAgICAgICBmaW5hbCBpbnQgcmVidWZmZXJpbmdNYXJrTG93S0IgPSAxMDsKLSAgICAgICAgZmluYWwgaW50IHJlYnVmZmVyaW5nTWFya0hpZ2hLQiA9IDMwOworICAgICAgICBmaW5hbCBpbnQgcmVzdW1lUGxheWJhY2tNYXJrTXMgPSAzOwogCiAgICAgICAgIEJ1ZmZlcmluZ1BhcmFtcyBwID0gbmV3IEJ1ZmZlcmluZ1BhcmFtcy5CdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAuc2V0SW5pdGlhbEJ1ZmZlcmluZ01vZGUoaW5pdGlhbE1vZGUpCi0gICAgICAgICAgICAgICAgLnNldEluaXRpYWxCdWZmZXJpbmdXYXRlcm1hcmtNcyhpbml0aWFsTWFya01zKQotICAgICAgICAgICAgICAgIC5zZXRJbml0aWFsQnVmZmVyaW5nV2F0ZXJtYXJrS0IoaW5pdGlhbE1hcmtLQikKLSAgICAgICAgICAgICAgICAuc2V0UmVidWZmZXJpbmdNb2RlKHJlYnVmZmVyaW5nTW9kZSkKLSAgICAgICAgICAgICAgICAuc2V0UmVidWZmZXJpbmdXYXRlcm1hcmtMb3dNcyhyZWJ1ZmZlcmluZ01hcmtMb3dNcykKLSAgICAgICAgICAgICAgICAuc2V0UmVidWZmZXJpbmdXYXRlcm1hcmtIaWdoTXMocmVidWZmZXJpbmdNYXJrSGlnaE1zKQotICAgICAgICAgICAgICAgIC5zZXRSZWJ1ZmZlcmluZ1dhdGVybWFya0xvd0tCKHJlYnVmZmVyaW5nTWFya0xvd0tCKQotICAgICAgICAgICAgICAgIC5zZXRSZWJ1ZmZlcmluZ1dhdGVybWFya0hpZ2hLQihyZWJ1ZmZlcmluZ01hcmtIaWdoS0IpCisgICAgICAgICAgICAgICAgLnNldEluaXRpYWxNYXJrTXMoaW5pdGlhbE1hcmtNcykKKyAgICAgICAgICAgICAgICAuc2V0UmVzdW1lUGxheWJhY2tNYXJrTXMocmVzdW1lUGxheWJhY2tNYXJrTXMpCiAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CiAKICAgICAgICAgUGFyY2VsIHBhcmNlbCA9IFBhcmNlbC5vYnRhaW4oKTsKQEAgLTQ1OSwyMiArNDA4LDEwIEBACiAgICAgICAgIHBhcmNlbC5zZXREYXRhUG9zaXRpb24oMCk7CiAgICAgICAgIEJ1ZmZlcmluZ1BhcmFtcyBxID0gQnVmZmVyaW5nUGFyYW1zLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChwYXJjZWwpOwogCi0gICAgICAgIGFzc2VydEVxdWFscygiaW5pdGlhbCBidWZmZXJpbmcgbW9kZSBzaG91bGQgbWF0Y2giLAotICAgICAgICAgICAgICAgIHAuZ2V0SW5pdGlhbEJ1ZmZlcmluZ01vZGUoKSwgcS5nZXRJbml0aWFsQnVmZmVyaW5nTW9kZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZWJ1ZmZlcmluZyBtb2RlIHNob3VsZCBtYXRjaCIsCi0gICAgICAgICAgICAgICAgcC5nZXRSZWJ1ZmZlcmluZ01vZGUoKSwgcS5nZXRSZWJ1ZmZlcmluZ01vZGUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaW5pdGlhbCBidWZmZXJpbmcgbWFya01zIHNob3VsZCBtYXRjaCIsCi0gICAgICAgICAgICAgICAgcC5nZXRJbml0aWFsQnVmZmVyaW5nV2F0ZXJtYXJrTXMoKSwgcS5nZXRJbml0aWFsQnVmZmVyaW5nV2F0ZXJtYXJrTXMoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaW5pdGlhbCBidWZmZXJpbmcgbWFya0tCIHNob3VsZCBtYXRjaCIsCi0gICAgICAgICAgICAgICAgcC5nZXRJbml0aWFsQnVmZmVyaW5nV2F0ZXJtYXJrS0IoKSwgcS5nZXRJbml0aWFsQnVmZmVyaW5nV2F0ZXJtYXJrS0IoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicmVidWZmZXJpbmcgbG93IG1hcmtNcyBzaG91bGQgbWF0Y2giLAotICAgICAgICAgICAgICAgIHAuZ2V0UmVidWZmZXJpbmdXYXRlcm1hcmtMb3dNcygpLCBxLmdldFJlYnVmZmVyaW5nV2F0ZXJtYXJrTG93TXMoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicmVidWZmZXJpbmcgbG93IG1hcmtLQiBzaG91bGQgbWF0Y2giLAotICAgICAgICAgICAgICAgIHAuZ2V0UmVidWZmZXJpbmdXYXRlcm1hcmtMb3dLQigpLCBxLmdldFJlYnVmZmVyaW5nV2F0ZXJtYXJrTG93S0IoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicmVidWZmZXJpbmcgaGlnaCBtYXJrTXMgc2hvdWxkIG1hdGNoIiwKLSAgICAgICAgICAgICAgICBwLmdldFJlYnVmZmVyaW5nV2F0ZXJtYXJrSGlnaE1zKCksIHEuZ2V0UmVidWZmZXJpbmdXYXRlcm1hcmtIaWdoTXMoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicmVidWZmZXJpbmcgaGlnaCBtYXJrS0Igc2hvdWxkIG1hdGNoIiwKLSAgICAgICAgICAgICAgICBwLmdldFJlYnVmZmVyaW5nV2F0ZXJtYXJrSGlnaEtCKCksIHEuZ2V0UmVidWZmZXJpbmdXYXRlcm1hcmtIaWdoS0IoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiaW5pdGlhbCBtYXJrTXMgc2hvdWxkIG1hdGNoIiwKKyAgICAgICAgICAgICAgICBwLmdldEluaXRpYWxNYXJrTXMoKSwgcS5nZXRJbml0aWFsTWFya01zKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInJlc3VtZSBwbGF5YmFjayBtYXJrTXMgc2hvdWxkIG1hdGNoIiwKKyAgICAgICAgICAgICAgICBwLmdldFJlc3VtZVBsYXliYWNrTWFya01zKCksIHEuZ2V0UmVzdW1lUGxheWJhY2tNYXJrTXMoKSk7CiAKICAgICAgICAgcGFyY2VsLnJlY3ljbGUoKTsKICAgICB9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvUGxheWJhY2tTdGF0ZVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9QbGF5YmFja1N0YXRlVGVzdC5qYXZhCmluZGV4IGJhOTY3ODQuLjg1NTk1NzAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9QbGF5YmFja1N0YXRlVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9QbGF5YmFja1N0YXRlVGVzdC5qYXZhCkBAIC0yMCw2ICsyMCw3IEBACiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLlBsYXliYWNrU3RhdGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOwogaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwpAQCAtMjcsNiArMjgsNyBAQAogLyoqCiAgKiBUZXN0IHtAbGluayBhbmRyb2lkLm1lZGlhLnNlc3Npb24uUGxheWJhY2tTdGF0ZX0uCiAgKi8KK0BBcHBNb2RlRnVsbChyZWFzb24gPSAiVE9ETzogZXZhbHVhdGUgYW5kIHBvcnQgdG8gaW5zdGFudCIpCiBwdWJsaWMgY2xhc3MgUGxheWJhY2tTdGF0ZVRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBURVNUX1BPU0lUSU9OID0gMjAwMDBMOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL1ByZXNlbnRhdGlvblN5bmNUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvUHJlc2VudGF0aW9uU3luY1Rlc3QuamF2YQppbmRleCBlZmEyZTBhLi4yM2I3MTczIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvUHJlc2VudGF0aW9uU3luY1Rlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvUHJlc2VudGF0aW9uU3luY1Rlc3QuamF2YQpAQCAtMjEsNiArMjEsNyBAQAogaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKIGltcG9ydCBhbmRyb2lkLm9zLlRyYWNlOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIGltcG9ydCBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlN1cHByZXNzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CkBAIC0zNCw2ICszNSw3IEBACiAgKiBTdXJmYWNlRmxpbmdlciBhbGxvd3MgYSAiZGVzaXJlZCBwcmVzZW50YXRpb24gdGltZSIgdmFsdWUgdG8gYmUgcGFzc2VkIGFsb25nIHdpdGggYnVmZmVycyBvZgogICogZGF0YS4gIFRoaXMgZXhlcmNpc2VzIHRoYXQgZmVhdHVyZS4KICAqLworQEFwcE1vZGVGdWxsKHJlYXNvbiA9ICJUT0RPOiBldmFsdWF0ZSBhbmQgcG9ydCB0byBpbnN0YW50IikKIHB1YmxpYyBjbGFzcyBQcmVzZW50YXRpb25TeW5jVGVzdCBleHRlbmRzIEFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyPE1lZGlhU3R1YkFjdGl2aXR5PgogICAgICAgICBpbXBsZW1lbnRzIFN1cmZhY2VIb2xkZXIuQ2FsbGJhY2sgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiUHJlc2VudGF0aW9uU3luY1Rlc3QiOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL1ByZXNldFJldmVyYlRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9QcmVzZXRSZXZlcmJUZXN0LmphdmEKaW5kZXggYmE2ZDA4Yy4uOTg0ODAxNSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL1ByZXNldFJldmVyYlRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvUHJlc2V0UmV2ZXJiVGVzdC5qYXZhCkBAIC0yMSw5ICsyMSwxMSBAQAogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW9meC5QcmVzZXRSZXZlcmI7CiBpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOwogaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAorQEFwcE1vZGVGdWxsKHJlYXNvbiA9ICJUT0RPOiBldmFsdWF0ZSBhbmQgcG9ydCB0byBpbnN0YW50IikKIHB1YmxpYyBjbGFzcyBQcmVzZXRSZXZlcmJUZXN0IGV4dGVuZHMgUG9zdFByb2NUZXN0QmFzZSB7CiAKICAgICBwcml2YXRlIFN0cmluZyBUQUcgPSAiUHJlc2V0UmV2ZXJiVGVzdCI7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvUmVtb3RlQ29udHJvbGxlclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9SZW1vdGVDb250cm9sbGVyVGVzdC5qYXZhCmluZGV4IDI1MTE4ODkuLjgwMjA4NmEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9SZW1vdGVDb250cm9sbGVyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9SZW1vdGVDb250cm9sbGVyVGVzdC5qYXZhCkBAIC0xOSw2ICsxOSw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5SZW1vdGVDb250cm9sbGVyOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuUmVtb3RlQ29udHJvbGxlci5PbkNsaWVudFVwZGF0ZUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIGltcG9ydCBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdENhc2U7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LlVpVGhyZWFkVGVzdDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CkBAIC0zNiw2ICszNyw3IEBACiAvKioKICAqIFRlc3RzIGZvciB7QGxpbmsgUmVtb3RlQ29udHJvbGxlcn0uCiAgKi8KK0BBcHBNb2RlRnVsbChyZWFzb24gPSAiVE9ETzogZXZhbHVhdGUgYW5kIHBvcnQgdG8gaW5zdGFudCIpCiBwdWJsaWMgY2xhc3MgUmVtb3RlQ29udHJvbGxlclRlc3QgZXh0ZW5kcyBJbnN0cnVtZW50YXRpb25UZXN0Q2FzZSB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8SW50ZWdlcj4gTUVESUFfS0VZX0VWRU5UID0gbmV3IEhhc2hTZXQ8SW50ZWdlcj4oKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9SZXNvdXJjZU1hbmFnZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvUmVzb3VyY2VNYW5hZ2VyVGVzdC5qYXZhCmluZGV4IGI1NDFhOTcuLjExNTcwMWIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9SZXNvdXJjZU1hbmFnZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL1Jlc291cmNlTWFuYWdlclRlc3QuamF2YQpAQCAtMTcsMTIgKzE3LDE1IEBACiBwYWNrYWdlIGFuZHJvaWQubWVkaWEuY3RzOwogCiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOwogaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5SZXF1aXJlc0RldmljZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKIGltcG9ydCBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworCiBAU21hbGxUZXN0CiBAUmVxdWlyZXNEZXZpY2UKK0BBcHBNb2RlRnVsbChyZWFzb24gPSAiVE9ETzogZXZhbHVhdGUgYW5kIHBvcnQgdG8gaW5zdGFudCIpCiBwdWJsaWMgY2xhc3MgUmVzb3VyY2VNYW5hZ2VyVGVzdAogICAgICAgICBleHRlbmRzIEFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyPFJlc291cmNlTWFuYWdlclN0dWJBY3Rpdml0eT4gewogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvUmluZ3RvbmVNYW5hZ2VyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL1Jpbmd0b25lTWFuYWdlclRlc3QuamF2YQppbmRleCA4YWMzZjI3Li44NjRhMGZhIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvUmluZ3RvbmVNYW5hZ2VyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9SaW5ndG9uZU1hbmFnZXJUZXN0LmphdmEKQEAgLTI4LDEwICsyOCwxMiBAQAogaW1wb3J0IGFuZHJvaWQubWVkaWEuUmluZ3RvbmU7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5SaW5ndG9uZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOwogaW1wb3J0IGFuZHJvaWQudGVzdC5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCitAQXBwTW9kZUZ1bGwocmVhc29uID0gIlRPRE86IGV2YWx1YXRlIGFuZCBwb3J0IHRvIGluc3RhbnQiKQogcHVibGljIGNsYXNzIFJpbmd0b25lTWFuYWdlclRlc3QKICAgICAgICAgZXh0ZW5kcyBBY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjxSaW5ndG9uZVBpY2tlckFjdGl2aXR5PiB7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9SaW5ndG9uZVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9SaW5ndG9uZVRlc3QuamF2YQppbmRleCAwOTJhYzBiLi5jN2RkYmQ4IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvUmluZ3RvbmVUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL1Jpbmd0b25lVGVzdC5qYXZhCkBAIC0yMCwxNCArMjAsMTcgQEAKIGltcG9ydCBhbmRyb2lkLmFwcC5VaUF1dG9tYXRpb247CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9BdHRyaWJ1dGVzOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuUmluZ3RvbmU7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5SaW5ndG9uZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOwogaW1wb3J0IGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCitAQXBwTW9kZUZ1bGwocmVhc29uID0gIlRPRE86IGV2YWx1YXRlIGFuZCBwb3J0IHRvIGluc3RhbnQiKQogcHVibGljIGNsYXNzIFJpbmd0b25lVGVzdCBleHRlbmRzIEluc3RydW1lbnRhdGlvblRlc3RDYXNlIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlJpbmd0b25lVGVzdCI7CiAKQEAgLTE2Miw0ICsxNjUsMzIgQEAKICAgICAgICAgbVJpbmd0b25lLnN0b3AoKTsKICAgICAgICAgYXNzZXJ0RmFsc2UobVJpbmd0b25lLmlzUGxheWluZygpKTsKICAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9vcGluZ1ZvbHVtZSgpIHsKKyAgICAgICAgaWYgKGlzVFYoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICghaGFzQXVkaW9PdXRwdXQoKSkgeworICAgICAgICAgICAgTG9nLmkoVEFHLCAiU2tpcHBpbmcgdGVzdFJpbmd0b25lKCk6IGRldmljZSBkb2Vzbid0IGhhdmUgYXVkaW8gb3V0cHV0LiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgVXJpIHVyaSA9IFJpbmd0b25lTWFuYWdlci5nZXRWYWxpZFJpbmd0b25lVXJpKG1Db250ZXh0KTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgicmluZ3RvbmUgd2FzIHVuZXhwZWN0ZWRseSBudWxsIiwgdXJpKTsKKyAgICAgICAgUmluZ3RvbmVNYW5hZ2VyLnNldEFjdHVhbERlZmF1bHRSaW5ndG9uZVVyaShtQ29udGV4dCwgUmluZ3RvbmVNYW5hZ2VyLlRZUEVfUklOR1RPTkUsIHVyaSk7CisgICAgICAgIGFzc2VydE5vdE51bGwobVJpbmd0b25lLmdldFRpdGxlKG1Db250ZXh0KSk7CisgICAgICAgIGZpbmFsIEF1ZGlvQXR0cmlidXRlcyByaW5ndG9uZUFhID0gbmV3IEF1ZGlvQXR0cmlidXRlcy5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0VXNhZ2UoQXVkaW9BdHRyaWJ1dGVzLlVTQUdFX05PVElGSUNBVElPTl9SSU5HVE9ORSkuCisgICAgICAgICAgICAgICAgYnVpbGQoKTsKKyAgICAgICAgbVJpbmd0b25lLnNldEF1ZGlvQXR0cmlidXRlcyhyaW5ndG9uZUFhKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJpbmd0b25lQWEsIG1SaW5ndG9uZS5nZXRBdWRpb0F0dHJpYnV0ZXMoKSk7CisgICAgICAgIG1SaW5ndG9uZS5zZXRMb29waW5nKHRydWUpOworICAgICAgICBtUmluZ3RvbmUuc2V0Vm9sdW1lKDAuNWYpOworICAgICAgICBtUmluZ3RvbmUucGxheSgpOworICAgICAgICBhc3NlcnRUcnVlKCJjb3VsZG4ndCBwbGF5IHJpbmd0b25lICIgKyB1cmksIG1SaW5ndG9uZS5pc1BsYXlpbmcoKSk7CisgICAgICAgIGFzc2VydFRydWUobVJpbmd0b25lLmlzTG9vcGluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbnZhbGlkIHJpbmd0b25lIHBsYXllciB2b2x1bWUiLCAwLjVmLCBtUmluZ3RvbmUuZ2V0Vm9sdW1lKCkpOworICAgICAgICBtUmluZ3RvbmUuc3RvcCgpOworICAgICAgICBhc3NlcnRGYWxzZShtUmluZ3RvbmUuaXNQbGF5aW5nKCkpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9Sb3V0aW5nVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL1JvdXRpbmdUZXN0LmphdmEKaW5kZXggNzYxNDU2OC4uYzQ0OGU5OCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL1JvdXRpbmdUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL1JvdXRpbmdUZXN0LmphdmEKQEAgLTE5LDM1ICsxOSw2NSBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKIAoraW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9BdHRyaWJ1dGVzOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9EZXZpY2VJbmZvOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Gb3JtYXQ7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1JlY29yZDsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUm91dGluZzsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvVHJhY2s7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRm9ybWF0OwogaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFSZWNvcmRlcjsKIAoraW1wb3J0IGFuZHJvaWQub3MuRW52aXJvbm1lbnQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CiAKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKIAogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLk1lZGlhVXRpbHM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5sYW5nLlJ1bm5hYmxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKIAogLyoqCi0gKiBBdWRpb1RyYWNrIC8gQXVkaW9SZWNvcmQgcHJlZmVycmVkIGRldmljZSBhbmQgcm91dGluZyBsaXN0ZW5lciB0ZXN0cy4KKyAqIEF1ZGlvVHJhY2sgLyBBdWRpb1JlY29yZCAvIE1lZGlhUGxheWVyIC8gTWVkaWFSZWNvcmRlciBwcmVmZXJyZWQgZGV2aWNlCisgKiBhbmQgcm91dGluZyBsaXN0ZW5lciB0ZXN0cy4KICAqIFRoZSByb3V0aW5nIHRlc3RzIGFyZSBtb3N0bHkgaGVyZSB0byBleGVyY2lzZSB0aGUgcm91dGluZyBjb2RlLCBhcyBhbiBhY3R1YWwgdGVzdCB3b3VsZCByZXF1aXJlCiAgKiBhZGRpbmcgLyByZW1vdmluZyBhbiBhdWRpbyBkZXZpY2UgZm9yIHRoZSBsaXN0ZW5lcnMgdG8gYmUgY2FsbGVkLgogICogVGhlIHJvdXRpbmcgbGlzdGVuZXIgY29kZSBpcyBkZXNpZ25lZCB0byBydW4gZm9yIHR3byB2ZXJzaW9ucyBvZiB0aGUgcm91dGluZyBjb2RlOgogICogIC0gdGhlIGRlcHJlY2F0ZWQgQXVkaW9UcmFjay5PblJvdXRpbmdDaGFuZ2VkTGlzdGVuZXIgYW5kIEF1ZGlvUmVjb3JkLk9uUm91dGluZ0NoYW5nZWRMaXN0ZW5lcgogICogIC0gdGhlIE4gQXVkaW9Sb3V0aW5nLk9uUm91dGluZ0NoYW5nZWRMaXN0ZW5lcgogICovCitAQXBwTW9kZUZ1bGwocmVhc29uID0gIlRPRE86IGV2YWx1YXRlIGFuZCBwb3J0IHRvIGluc3RhbnQiKQogcHVibGljIGNsYXNzIFJvdXRpbmdUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlJvdXRpbmdUZXN0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1dBSVRJTkdfUk9VVElOR19DSEFOR0VEX0NPVU5UID0gMzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFdBSVRfUk9VVElOR19DSEFOR0VfVElNRV9NUyA9IDEwMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFVRElPX0JJVF9SQVRFX0lOX0JQUyA9IDEyMjAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBVURJT19TQU1QTEVfUkFURV9IWiA9IDgwMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBNQVhfRklMRV9TSVpFX0JZVEUgPSA1MDAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRUNPUkRfVElNRV9NUyA9IDMwMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PEludGVnZXI+IEFWQUlMQUJMRV9JTlBVVF9ERVZJQ0VTX1RZUEUgPSBuZXcgSGFzaFNldDw+KAorICAgICAgICBBcnJheXMuYXNMaXN0KEF1ZGlvRGV2aWNlSW5mby5UWVBFX0JVSUxUSU5fTUlDKSk7CiAKKyAgICBwcml2YXRlIGJvb2xlYW4gbVJvdXRpbmdDaGFuZ2VkOworICAgIHByaXZhdGUgYm9vbGVhbiBtUm91dGluZ0NoYW5nZWREZXRlY3RlZDsKICAgICBwcml2YXRlIEF1ZGlvTWFuYWdlciBtQXVkaW9NYW5hZ2VyOworICAgIHByaXZhdGUgQ291bnREb3duTGF0Y2ggbVJvdXRpbmdDaGFuZ2VkTGF0Y2g7CisgICAgcHJpdmF0ZSBGaWxlIG1PdXRGaWxlOworICAgIHByaXZhdGUgTG9vcGVyIG1Sb3V0aW5nQ2hhbmdlZExvb3BlcjsKKyAgICBwcml2YXRlIE9iamVjdCBtUm91dGluZ0NoYW5nZWRMb2NrID0gbmV3IE9iamVjdCgpOwogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTU4LDYgKzg4LDE0IEBACiAgICAgICAgIGFzc2VydE5vdE51bGwobUF1ZGlvTWFuYWdlcik7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG1PdXRGaWxlICE9IG51bGwgJiYgbU91dEZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIG1PdXRGaWxlLmRlbGV0ZSgpOworICAgICAgICB9CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorCiAgICAgcHJpdmF0ZSBBdWRpb1RyYWNrIGFsbG9jQXVkaW9UcmFjaygpIHsKICAgICAgICAgaW50IGJ1ZmZlclNpemUgPQogICAgICAgICAgICAgICAgIEF1ZGlvVHJhY2suZ2V0TWluQnVmZmVyU2l6ZSgKQEAgLTEwNCw2ICsxNDIsNjYgQEAKICAgICAgICAgYXVkaW9UcmFjay5yZWxlYXNlKCk7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgdGVzdF9hdWRpb1RyYWNrX2luY2FsbE11c2ljUm91dGluZ1Blcm1pc3Npb25zKCkgeworICAgICAgICBpZiAoIW1Db250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCkuaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX0FVRElPX09VVFBVVCkpIHsKKyAgICAgICAgICAgIC8vIENhbid0IGRvIGl0IHNvIHNraXAgdGhpcyB0ZXN0CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBvbmx5IGFwcHMgd2l0aCBNT0RJRllfUEhPTkVfU1RBVEUgcGVybWlzc2lvbiBjYW4gcm91dGUgcGxheWJhY2sKKyAgICAgICAgLy8gdG8gdGhlIHVwbGluayBzdHJlYW0gZHVyaW5nIGEgcGhvbmUgY2FsbCwgc28gdGhpcyB0ZXN0IG1ha2VzIHN1cmUgdGhhdAorICAgICAgICAvLyBhdWRpbyBpcyByZS1yb3V0ZWQgdG8gZGVmYXVsdCBkZXZpY2Ugd2hlbiB0aGUgcGVybWlzc2lvbiBpcyBtaXNzaW5nCisKKyAgICAgICAgQXVkaW9EZXZpY2VJbmZvIHRlbGVwaG9ueURldmljZSA9IGdldFRlbGVwaG9ueURldmljZUFuZFNldEluQ29tbXVuaWNhdGlvbk1vZGUoKTsKKyAgICAgICAgaWYgKHRlbGVwaG9ueURldmljZSA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBDYW4ndCBkbyBpdCBzbyBza2lwIHRoaXMgdGVzdAorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgQXVkaW9UcmFjayBhdWRpb1RyYWNrID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXVkaW9UcmFjayA9IGFsbG9jQXVkaW9UcmFjaygpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhdWRpb1RyYWNrKTsKKworICAgICAgICAgICAgYXVkaW9UcmFjay5zZXRQcmVmZXJyZWREZXZpY2UodGVsZXBob255RGV2aWNlKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhBdWRpb0RldmljZUluZm8uVFlQRV9URUxFUEhPTlksIGF1ZGlvVHJhY2suZ2V0UHJlZmVycmVkRGV2aWNlKCkuZ2V0VHlwZSgpKTsKKworICAgICAgICAgICAgYXVkaW9UcmFjay5wbGF5KCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGF1ZGlvVHJhY2suZ2V0Um91dGVkRGV2aWNlKCkuZ2V0VHlwZSgpICE9IEF1ZGlvRGV2aWNlSW5mby5UWVBFX1RFTEVQSE9OWSk7CisKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChhdWRpb1RyYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhdWRpb1RyYWNrLnN0b3AoKTsKKyAgICAgICAgICAgICAgICBhdWRpb1RyYWNrLnJlbGVhc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0TW9kZShBdWRpb01hbmFnZXIuTU9ERV9OT1JNQUwpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBBdWRpb0RldmljZUluZm8gZ2V0VGVsZXBob255RGV2aWNlQW5kU2V0SW5Db21tdW5pY2F0aW9uTW9kZSgpIHsKKyAgICAgICAgLy8gZ2V0IHRoZSBvdXRwdXQgZGV2aWNlIGZvciB0ZWxlcGhvbnkKKyAgICAgICAgQXVkaW9EZXZpY2VJbmZvIHRlbGVwaG9ueURldmljZSA9IG51bGw7CisgICAgICAgIEF1ZGlvRGV2aWNlSW5mb1tdIGRldmljZUxpc3QgPSBtQXVkaW9NYW5hZ2VyLmdldERldmljZXMoQXVkaW9NYW5hZ2VyLkdFVF9ERVZJQ0VTX09VVFBVVFMpOworICAgICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgZGV2aWNlTGlzdC5sZW5ndGg7IGluZGV4KyspIHsKKyAgICAgICAgICAgIGlmIChkZXZpY2VMaXN0W2luZGV4XS5nZXRUeXBlKCkgPT0gQXVkaW9EZXZpY2VJbmZvLlRZUEVfVEVMRVBIT05ZKSB7CisgICAgICAgICAgICAgICAgdGVsZXBob255RGV2aWNlID0gZGV2aWNlTGlzdFtpbmRleF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAodGVsZXBob255RGV2aWNlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgLy8gc2ltdWxhdGUgYW4gaW4gY2FsbCBzdGF0ZSB1c2luZyBNT0RFX0lOX0NPTU1VTklDQVRJT04gc2luY2UKKyAgICAgICAgLy8gQXVkaW9NYW5hZ2VyLnNldE1vZGUgcmVxdWlyZXMgTU9ESUZZX1BIT05FX1NUQVRFIHBlcm1pc3Npb24KKyAgICAgICAgLy8gZm9yIHNldE1vZGUgd2l0aCBNT0RFX0lOX0NBTEwuCisgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0TW9kZShBdWRpb01hbmFnZXIuTU9ERV9JTl9DT01NVU5JQ0FUSU9OKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEF1ZGlvTWFuYWdlci5NT0RFX0lOX0NPTU1VTklDQVRJT04sIG1BdWRpb01hbmFnZXIuZ2V0TW9kZSgpKTsKKworICAgICAgICByZXR1cm4gdGVsZXBob255RGV2aWNlOworICAgIH0KKwogICAgIC8qCiAgICAgICogdGVzdHMgaWYgdGhlIExvb3BlciBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkIGhhcyBiZWVuIHByZXBhcmVkLAogICAgICAqIElmIG5vdCwgaXQgbWFrZXMgb25lLCBwcmVwYXJlcyBpdCBhbmQgcmV0dXJucyBpdC4KQEAgLTQ1NSw0ICs1NTMsMzMzIEBACiAgICAgICAgIGF1ZGlvUmVjb3JkLnN0b3AoKTsKICAgICAgICAgYXVkaW9SZWNvcmQucmVsZWFzZSgpOwogICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgQXVkaW9Sb3V0aW5nTGlzdGVuZXIgaW1wbGVtZW50cyBBdWRpb1JvdXRpbmcuT25Sb3V0aW5nQ2hhbmdlZExpc3RlbmVyCisgICAgeworICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRpbmdDaGFuZ2VkKEF1ZGlvUm91dGluZyBhdWRpb1JvdXRpbmcpIHsKKyAgICAgICAgICAgIGlmIChtUm91dGluZ0NoYW5nZWRMYXRjaCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVJvdXRpbmdDaGFuZ2VkTGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Sb3V0aW5nQ2hhbmdlZExvY2spIHsKKyAgICAgICAgICAgICAgICBtUm91dGluZ0NoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIG1Sb3V0aW5nQ2hhbmdlZExvY2subm90aWZ5KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIE1lZGlhUGxheWVyIGFsbG9jTWVkaWFQbGF5ZXIoKSB7CisgICAgICAgIGZpbmFsIGludCByZXNpZCA9IFIucmF3LnRlc3RtcDNfMjsKKyAgICAgICAgTWVkaWFQbGF5ZXIgbWVkaWFQbGF5ZXIgPSBNZWRpYVBsYXllci5jcmVhdGUobUNvbnRleHQsIHJlc2lkKTsKKyAgICAgICAgbWVkaWFQbGF5ZXIuc2V0QXVkaW9BdHRyaWJ1dGVzKAorICAgICAgICAgICAgICAgIG5ldyBBdWRpb0F0dHJpYnV0ZXMuQnVpbGRlcigpLnNldFVzYWdlKEF1ZGlvQXR0cmlidXRlcy5VU0FHRV9NRURJQSkuYnVpbGQoKSk7CisgICAgICAgIG1lZGlhUGxheWVyLnN0YXJ0KCk7CisgICAgICAgIHJldHVybiBtZWRpYVBsYXllcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X21lZGlhUGxheWVyX3ByZWZlcnJlZERldmljZSgpIHsKKyAgICAgICAgaWYgKCFtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9BVURJT19PVVRQVVQpKSB7CisgICAgICAgICAgICAvLyBDYW4ndCBkbyBpdCBzbyBza2lwIHRoaXMgdGVzdAorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgTWVkaWFQbGF5ZXIgbWVkaWFQbGF5ZXIgPSBhbGxvY01lZGlhUGxheWVyKCk7CisgICAgICAgIGFzc2VydFRydWUobWVkaWFQbGF5ZXIuaXNQbGF5aW5nKCkpOworCisgICAgICAgIC8vIE5vbmUgc2VsZWN0ZWQgKG5ldyBNZWRpYVBsYXllciksIHNvIGNoZWNrIGZvciBkZWZhdWx0CisgICAgICAgIGFzc2VydE51bGwobWVkaWFQbGF5ZXIuZ2V0UHJlZmVycmVkRGV2aWNlKCkpOworCisgICAgICAgIC8vIHJlc2V0cyB0byBkZWZhdWx0CisgICAgICAgIGFzc2VydFRydWUobWVkaWFQbGF5ZXIuc2V0UHJlZmVycmVkRGV2aWNlKG51bGwpKTsKKworICAgICAgICAvLyB0ZXN0IGVhY2ggZGV2aWNlCisgICAgICAgIEF1ZGlvRGV2aWNlSW5mb1tdIGRldmljZUxpc3QgPSBtQXVkaW9NYW5hZ2VyLmdldERldmljZXMoQXVkaW9NYW5hZ2VyLkdFVF9ERVZJQ0VTX09VVFBVVFMpOworICAgICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgZGV2aWNlTGlzdC5sZW5ndGg7IGluZGV4KyspIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUobWVkaWFQbGF5ZXIuc2V0UHJlZmVycmVkRGV2aWNlKGRldmljZUxpc3RbaW5kZXhdKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKG1lZGlhUGxheWVyLmdldFByZWZlcnJlZERldmljZSgpID09IGRldmljZUxpc3RbaW5kZXhdKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIGRlZmF1bHRzIGFnYWluCisgICAgICAgIGFzc2VydFRydWUobWVkaWFQbGF5ZXIuc2V0UHJlZmVycmVkRGV2aWNlKG51bGwpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChtZWRpYVBsYXllci5nZXRQcmVmZXJyZWREZXZpY2UoKSk7CisKKyAgICAgICAgbWVkaWFQbGF5ZXIuc3RvcCgpOworICAgICAgICBtZWRpYVBsYXllci5yZWxlYXNlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdF9tZWRpYVBsYXllcl9nZXRSb3V0ZWREZXZpY2UoKSB7CisgICAgICAgIGlmICghbUNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKS5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfQVVESU9fT1VUUFVUKSkgeworICAgICAgICAgICAgLy8gQ2FuJ3QgZG8gaXQgc28gc2tpcCB0aGlzIHRlc3QKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIE1lZGlhUGxheWVyIG1lZGlhUGxheWVyID0gYWxsb2NNZWRpYVBsYXllcigpOworICAgICAgICBhc3NlcnRUcnVlKG1lZGlhUGxheWVyLmlzUGxheWluZygpKTsKKworICAgICAgICAvLyBTbGVlcCBmb3IgMXMgdG8gZW5zdXJlIHRoZSBvdXRwdXQgZGV2aWNlIG9wZW4KKyAgICAgICAgU3lzdGVtQ2xvY2suc2xlZXAoMTAwMCk7CisKKyAgICAgICAgLy8gTm8gZXhwbGljaXQgcm91dGUKKyAgICAgICAgQXVkaW9EZXZpY2VJbmZvIHJvdXRlZERldmljZSA9IG1lZGlhUGxheWVyLmdldFJvdXRlZERldmljZSgpOworICAgICAgICBhc3NlcnROb3ROdWxsKHJvdXRlZERldmljZSk7CisKKyAgICAgICAgbWVkaWFQbGF5ZXIuc3RvcCgpOworICAgICAgICBtZWRpYVBsYXllci5yZWxlYXNlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdF9NZWRpYVBsYXllcl9Sb3V0aW5nTGlzdGVuZXIoKSB7CisgICAgICAgIGlmICghbUNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKS5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfQVVESU9fT1VUUFVUKSkgeworICAgICAgICAgICAgLy8gQ2FuJ3QgZG8gaXQgc28gc2tpcCB0aGlzIHRlc3QKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIE1lZGlhUGxheWVyIG1lZGlhUGxheWVyID0gYWxsb2NNZWRpYVBsYXllcigpOworCisgICAgICAgIC8vIG51bGwgbGlzdGVuZXIKKyAgICAgICAgbWVkaWFQbGF5ZXIuYWRkT25Sb3V0aW5nQ2hhbmdlZExpc3RlbmVyKG51bGwsIG51bGwpOworCisgICAgICAgIEF1ZGlvUm91dGluZ0xpc3RlbmVyIGxpc3RlbmVyID0gbmV3IEF1ZGlvUm91dGluZ0xpc3RlbmVyKCk7CisgICAgICAgIEF1ZGlvUm91dGluZ0xpc3RlbmVyIHNvbWVPdGhlckxpc3RlbmVyID0gbmV3IEF1ZGlvUm91dGluZ0xpc3RlbmVyKCk7CisKKyAgICAgICAgLy8gYWRkIGEgbGlzdGVuZXIKKyAgICAgICAgbWVkaWFQbGF5ZXIuYWRkT25Sb3V0aW5nQ2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyLCBudWxsKTsKKworICAgICAgICAvLyByZW1vdmUgbGlzdGVuZXJzCisgICAgICAgIC8vIHJlbW92ZSBhIGxpc3RlbmVyIHdlIGRpZG4ndCBhZGQKKyAgICAgICAgbWVkaWFQbGF5ZXIucmVtb3ZlT25Sb3V0aW5nQ2hhbmdlZExpc3RlbmVyKHNvbWVPdGhlckxpc3RlbmVyKTsKKyAgICAgICAgLy8gcmVtb3ZlIGEgdmFsaWQgbGlzdGVuZXIKKyAgICAgICAgbWVkaWFQbGF5ZXIucmVtb3ZlT25Sb3V0aW5nQ2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyKTsKKworICAgICAgICBMb29wZXIgbXlMb29wZXIgPSBwcmVwYXJlSWZOZWVkZWRMb29wZXIoKTsKKworICAgICAgICBtZWRpYVBsYXllci5hZGRPblJvdXRpbmdDaGFuZ2VkTGlzdGVuZXIobGlzdGVuZXIsIG5ldyBIYW5kbGVyKCkpOworICAgICAgICBtZWRpYVBsYXllci5yZW1vdmVPblJvdXRpbmdDaGFuZ2VkTGlzdGVuZXIobGlzdGVuZXIpOworCisgICAgICAgIG1lZGlhUGxheWVyLnN0b3AoKTsKKyAgICAgICAgbWVkaWFQbGF5ZXIucmVsZWFzZSgpOworICAgICAgICBpZiAobXlMb29wZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbXlMb29wZXIucXVpdCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdF9NZWRpYVBsYXllcl9Sb3V0aW5nQ2hhbmdlZENhbGxiYWNrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghbUNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKS5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfQVVESU9fT1VUUFVUKSkgeworICAgICAgICAgICAgLy8gQ2FuJ3QgZG8gaXQgc28gc2tpcCB0aGlzIHRlc3QKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIEF1ZGlvRGV2aWNlSW5mb1tdIGRldmljZXMgPSBtQXVkaW9NYW5hZ2VyLmdldERldmljZXMoQXVkaW9NYW5hZ2VyLkdFVF9ERVZJQ0VTX09VVFBVVFMpOworICAgICAgICBpZiAoZGV2aWNlcy5sZW5ndGggPCAyKSB7CisgICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIHdlIGNhbm5vdCBzd2l0Y2ggb3V0cHV0IGRldmljZSwgdGhhdCBtYXkgY2F1c2UgdGhlIHRlc3QgZmFpbC4KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1Sb3V0aW5nQ2hhbmdlZCA9IGZhbHNlOworICAgICAgICBtUm91dGluZ0NoYW5nZWRMb29wZXIgPSBudWxsOworICAgICAgICBtUm91dGluZ0NoYW5nZWREZXRlY3RlZCA9IGZhbHNlOworICAgICAgICAvLyBDcmVhdGUgTWVkaWFQbGF5ZXIgaW4gYW5vdGhlciB0aHJlYWQgdG8gbWFrZSBzdXJlIHRoZXJlIGlzIGEgbG9vcGVyIGFjdGl2ZSBmb3IgZXZlbnRzLgorICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBMb29wZXIucHJlcGFyZSgpOworICAgICAgICAgICAgICAgIC8vIEtlZXAgbG9vcGVyIHRvIHRlcm1pbmF0ZSB3aGVuIHRoZSB0ZXN0IGlzIGZpbmlzaGVkLgorICAgICAgICAgICAgICAgIG1Sb3V0aW5nQ2hhbmdlZExvb3BlciA9IExvb3Blci5teUxvb3BlcigpOworICAgICAgICAgICAgICAgIEF1ZGlvUm91dGluZ0xpc3RlbmVyIGxpc3RlbmVyID0gbmV3IEF1ZGlvUm91dGluZ0xpc3RlbmVyKCk7CisgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXIgbWVkaWFQbGF5ZXIgPSBhbGxvY01lZGlhUGxheWVyKCk7CisgICAgICAgICAgICAgICAgbWVkaWFQbGF5ZXIuYWRkT25Sb3V0aW5nQ2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyLCBudWxsKTsKKyAgICAgICAgICAgICAgICAvLyBXaXRoIHNldHRpbmcgcHJlZmVycmVkIGRldmljZSwgdGhlIG91dHB1dCBkZXZpY2UgbWF5IHN3aXRjaC4KKyAgICAgICAgICAgICAgICAvLyBQb3N0IHRoZSByZXF1ZXN0IGRlbGF5ZWQgdG8gZW5zdXJlIHRoZSBtZXNzYWdlIHF1ZXVlIGlzIHJ1bm5pbmcKKyAgICAgICAgICAgICAgICAvLyBzbyB0aGF0IHRoZSByb3V0aW5nIGNoYW5nZWQgZXZlbnQgY2FuIGJlIGhhbmRsZWQgY29ycmVjdGx5LgorICAgICAgICAgICAgICAgIEhhbmRsZXIgaGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7CisgICAgICAgICAgICAgICAgaGFuZGxlci5wb3N0RGVsYXllZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZUluZm8gcm91dGVkRGV2aWNlID0gbWVkaWFQbGF5ZXIuZ2V0Um91dGVkRGV2aWNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm91dGVkRGV2aWNlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZUluZm9bXSBkZXZpY2VzID0gbUF1ZGlvTWFuYWdlci5nZXREZXZpY2VzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01hbmFnZXIuR0VUX0RFVklDRVNfT1VUUFVUUyk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEF1ZGlvRGV2aWNlSW5mbyBkZXZpY2UgOiBkZXZpY2VzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdXRlZERldmljZS5nZXRJZCgpICE9IGRldmljZS5nZXRJZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhUGxheWVyLnNldFByZWZlcnJlZERldmljZShkZXZpY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFdBSVRfUk9VVElOR19DSEFOR0VfVElNRV9NUyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VJbmZvIGN1cnJlbnRSb3V0ZWREZXZpY2UgPSBtZWRpYVBsYXllci5nZXRSb3V0ZWREZXZpY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRSb3V0ZWREZXZpY2UgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGN1cnJlbnRSb3V0ZWREZXZpY2UuZ2V0SWQoKSAhPSByb3V0ZWREZXZpY2UuZ2V0SWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJvdXRpbmdDaGFuZ2VkRGV0ZWN0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9LCAxMDAwKTsKKyAgICAgICAgICAgICAgICBMb29wZXIubG9vcCgpOworICAgICAgICAgICAgICAgIG1lZGlhUGxheWVyLnJlbW92ZU9uUm91dGluZ0NoYW5nZWRMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgbWVkaWFQbGF5ZXIuc3RvcCgpOworICAgICAgICAgICAgICAgIG1lZGlhUGxheWVyLnJlbGVhc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgdC5zdGFydCgpOworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Sb3V0aW5nQ2hhbmdlZExvY2spIHsKKyAgICAgICAgICAgIG1Sb3V0aW5nQ2hhbmdlZExvY2sud2FpdChXQUlUX1JPVVRJTkdfQ0hBTkdFX1RJTUVfTVMKKyAgICAgICAgICAgICAgICAgICAgKiBNQVhfV0FJVElOR19ST1VUSU5HX0NIQU5HRURfQ09VTlQpOworICAgICAgICB9CisgICAgICAgIGlmIChtUm91dGluZ0NoYW5nZWRMb29wZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVJvdXRpbmdDaGFuZ2VkTG9vcGVyLnF1aXRTYWZlbHkoKTsKKyAgICAgICAgICAgIG1Sb3V0aW5nQ2hhbmdlZExvb3BlciA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgdC5qb2luKCk7CisgICAgICAgIGFzc2VydFRydWUoIlJvdXRpbmcgY2hhbmdlZCBjYWxsYmFjayBoYXMgbm90IGJlZW4gY2FsbGVkIiwKKyAgICAgICAgICAgICAgICAobVJvdXRpbmdDaGFuZ2VkIHx8ICFtUm91dGluZ0NoYW5nZWREZXRlY3RlZCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RfbWVkaWFQbGF5ZXJfaW5jYWxsTXVzaWNSb3V0aW5nUGVybWlzc2lvbnMoKSB7CisgICAgICAgIGlmICghbUNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKS5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfQVVESU9fT1VUUFVUKSkgeworICAgICAgICAgICAgLy8gQ2FuJ3QgZG8gaXQgc28gc2tpcCB0aGlzIHRlc3QKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG9ubHkgYXBwcyB3aXRoIE1PRElGWV9QSE9ORV9TVEFURSBwZXJtaXNzaW9uIGNhbiByb3V0ZSBwbGF5YmFjaworICAgICAgICAvLyB0byB0aGUgdXBsaW5rIHN0cmVhbSBkdXJpbmcgYSBwaG9uZSBjYWxsLCBzbyB0aGlzIHRlc3QgbWFrZXMgc3VyZSB0aGF0CisgICAgICAgIC8vIGF1ZGlvIGlzIHJlLXJvdXRlZCB0byBkZWZhdWx0IGRldmljZSB3aGVuIHRoZSBwZXJtaXNzaW9uIGlzIG1pc3NpbmcKKworICAgICAgICBBdWRpb0RldmljZUluZm8gdGVsZXBob255RGV2aWNlID0gZ2V0VGVsZXBob255RGV2aWNlQW5kU2V0SW5Db21tdW5pY2F0aW9uTW9kZSgpOworICAgICAgICBpZiAodGVsZXBob255RGV2aWNlID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIENhbid0IGRvIGl0IHNvIHNraXAgdGhpcyB0ZXN0CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBNZWRpYVBsYXllciBtZWRpYVBsYXllciA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1lZGlhUGxheWVyID0gYWxsb2NNZWRpYVBsYXllcigpOworCisgICAgICAgICAgICBtZWRpYVBsYXllci5zZXRQcmVmZXJyZWREZXZpY2UodGVsZXBob255RGV2aWNlKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhBdWRpb0RldmljZUluZm8uVFlQRV9URUxFUEhPTlksIG1lZGlhUGxheWVyLmdldFByZWZlcnJlZERldmljZSgpLmdldFR5cGUoKSk7CisKKyAgICAgICAgICAgIC8vIFNsZWVwIGZvciAxcyB0byBlbnN1cmUgdGhlIG91dHB1dCBkZXZpY2Ugb3BlbgorICAgICAgICAgICAgU3lzdGVtQ2xvY2suc2xlZXAoMTAwMCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKG1lZGlhUGxheWVyLmdldFJvdXRlZERldmljZSgpLmdldFR5cGUoKSAhPSBBdWRpb0RldmljZUluZm8uVFlQRV9URUxFUEhPTlkpOworCisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAobWVkaWFQbGF5ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1lZGlhUGxheWVyLnN0b3AoKTsKKyAgICAgICAgICAgICAgICBtZWRpYVBsYXllci5yZWxlYXNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLnNldE1vZGUoQXVkaW9NYW5hZ2VyLk1PREVfTk9STUFMKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgTWVkaWFSZWNvcmRlciBhbGxvY01lZGlhUmVjb3JkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIG91dHB1dFBhdGggPSBuZXcgRmlsZShFbnZpcm9ubWVudC5nZXRFeHRlcm5hbFN0b3JhZ2VEaXJlY3RvcnkoKSwKKyAgICAgICAgICAgICJyZWNvcmQub3V0IikuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgIG1PdXRGaWxlID0gbmV3IEZpbGUob3V0cHV0UGF0aCk7CisgICAgICAgIE1lZGlhUmVjb3JkZXIgbWVkaWFSZWNvcmRlciA9IG5ldyBNZWRpYVJlY29yZGVyKCk7CisgICAgICAgIG1lZGlhUmVjb3JkZXIuc2V0QXVkaW9Tb3VyY2UoTWVkaWFSZWNvcmRlci5BdWRpb1NvdXJjZS5NSUMpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbWVkaWFSZWNvcmRlci5nZXRNYXhBbXBsaXR1ZGUoKSk7CisgICAgICAgIG1lZGlhUmVjb3JkZXIuc2V0T3V0cHV0Rm9ybWF0KE1lZGlhUmVjb3JkZXIuT3V0cHV0Rm9ybWF0LlRIUkVFX0dQUCk7CisgICAgICAgIG1lZGlhUmVjb3JkZXIuc2V0T3V0cHV0RmlsZShvdXRwdXRQYXRoKTsKKyAgICAgICAgbWVkaWFSZWNvcmRlci5zZXRBdWRpb0VuY29kZXIoTWVkaWFSZWNvcmRlci5BdWRpb0VuY29kZXIuQUFDKTsKKyAgICAgICAgbWVkaWFSZWNvcmRlci5zZXRBdWRpb0NoYW5uZWxzKEF1ZGlvRm9ybWF0LkNIQU5ORUxfT1VUX0RFRkFVTFQpOworICAgICAgICBtZWRpYVJlY29yZGVyLnNldEF1ZGlvU2FtcGxpbmdSYXRlKEFVRElPX1NBTVBMRV9SQVRFX0haKTsKKyAgICAgICAgbWVkaWFSZWNvcmRlci5zZXRBdWRpb0VuY29kaW5nQml0UmF0ZShBVURJT19CSVRfUkFURV9JTl9CUFMpOworICAgICAgICBtZWRpYVJlY29yZGVyLnNldE1heEZpbGVTaXplKE1BWF9GSUxFX1NJWkVfQllURSk7CisgICAgICAgIG1lZGlhUmVjb3JkZXIucHJlcGFyZSgpOworICAgICAgICBtZWRpYVJlY29yZGVyLnN0YXJ0KCk7CisgICAgICAgIC8vIFNsZWVwIGEgd2hpbGUgdG8gZW5zdXJlIHRoZSB1bmRlcmx5aW5nIEF1ZGlvUmVjb3JkIGlzIGluaXRpYWxpemVkLgorICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7CisgICAgICAgIHJldHVybiBtZWRpYVJlY29yZGVyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RfbWVkaWFSZWNvcmRlcl9wcmVmZXJyZWREZXZpY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9NSUNST1BIT05FKQorICAgICAgICAgICAgICAgIHx8ICFNZWRpYVV0aWxzLmhhc0VuY29kZXIoTWVkaWFGb3JtYXQuTUlNRVRZUEVfQVVESU9fQUFDKSkgeworICAgICAgICAgICAgTWVkaWFVdGlscy5za2lwVGVzdCgibm8gYXVkaW8gY29kZWNzIG9yIG1pY3JvcGhvbmUiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIE1lZGlhUmVjb3JkZXIgbWVkaWFSZWNvcmRlciA9IGFsbG9jTWVkaWFSZWNvcmRlcigpOworCisgICAgICAgIC8vIE5vbmUgc2VsZWN0ZWQgKG5ldyBNZWRpYVBsYXllciksIHNvIGNoZWNrIGZvciBkZWZhdWx0CisgICAgICAgIGFzc2VydE51bGwobWVkaWFSZWNvcmRlci5nZXRQcmVmZXJyZWREZXZpY2UoKSk7CisKKyAgICAgICAgLy8gcmVzZXRzIHRvIGRlZmF1bHQKKyAgICAgICAgYXNzZXJ0VHJ1ZShtZWRpYVJlY29yZGVyLnNldFByZWZlcnJlZERldmljZShudWxsKSk7CisKKyAgICAgICAgLy8gdGVzdCBlYWNoIGRldmljZQorICAgICAgICBBdWRpb0RldmljZUluZm9bXSBkZXZpY2VMaXN0ID0gbUF1ZGlvTWFuYWdlci5nZXREZXZpY2VzKEF1ZGlvTWFuYWdlci5HRVRfREVWSUNFU19JTlBVVFMpOworICAgICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgZGV2aWNlTGlzdC5sZW5ndGg7IGluZGV4KyspIHsKKyAgICAgICAgICAgIGlmICghQVZBSUxBQkxFX0lOUFVUX0RFVklDRVNfVFlQRS5jb250YWlucyhkZXZpY2VMaXN0W2luZGV4XS5nZXRUeXBlKCkpKSB7CisgICAgICAgICAgICAgICAgLy8gT25seSB0cnkgdG8gc2V0IGRldmljZXMgd2hvc2UgdHlwZSBpcyBjb250YWluZWQgaW4gcHJlZGVmaW5lZCBzZXQgYXMgcHJlZmVycmVkCisgICAgICAgICAgICAgICAgLy8gZGV2aWNlIGluIGNhc2Ugb2YgcGVybWlzc2lvbiBkZW5pZWQgd2hlbiBzd2l0Y2hpbmcgaW5wdXQgZGV2aWNlLgorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtZWRpYVJlY29yZGVyLnNldFByZWZlcnJlZERldmljZShkZXZpY2VMaXN0W2luZGV4XSkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtZWRpYVJlY29yZGVyLmdldFByZWZlcnJlZERldmljZSgpID09IGRldmljZUxpc3RbaW5kZXhdKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIGRlZmF1bHRzIGFnYWluCisgICAgICAgIGFzc2VydFRydWUobWVkaWFSZWNvcmRlci5zZXRQcmVmZXJyZWREZXZpY2UobnVsbCkpOworICAgICAgICBhc3NlcnROdWxsKG1lZGlhUmVjb3JkZXIuZ2V0UHJlZmVycmVkRGV2aWNlKCkpOworICAgICAgICBUaHJlYWQuc2xlZXAoUkVDT1JEX1RJTUVfTVMpOworCisgICAgICAgIG1lZGlhUmVjb3JkZXIuc3RvcCgpOworICAgICAgICBtZWRpYVJlY29yZGVyLnJlbGVhc2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X21lZGlhUmVjb3JkZXJfZ2V0Um91dGVkRGV2aWNlSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9NSUNST1BIT05FKQorICAgICAgICAgICAgfHwgIU1lZGlhVXRpbHMuaGFzRW5jb2RlcihNZWRpYUZvcm1hdC5NSU1FVFlQRV9BVURJT19BQUMpKSB7CisgICAgICAgICAgICBNZWRpYVV0aWxzLnNraXBUZXN0KCJubyBhdWRpbyBjb2RlY3Mgb3IgbWljcm9waG9uZSIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgTWVkaWFSZWNvcmRlciBtZWRpYVJlY29yZGVyID0gYWxsb2NNZWRpYVJlY29yZGVyKCk7CisKKyAgICAgICAgQXVkaW9EZXZpY2VJbmZvIHJvdXRlZERldmljZSA9IG1lZGlhUmVjb3JkZXIuZ2V0Um91dGVkRGV2aWNlKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwocm91dGVkRGV2aWNlKTsgLy8gd2UgcHJvYmFibHkgY2FuJ3Qgc2F5IGFueXRoaW5nIG1vcmUgdGhhbiB0aGlzCisgICAgICAgIFRocmVhZC5zbGVlcChSRUNPUkRfVElNRV9NUyk7CisKKyAgICAgICAgbWVkaWFSZWNvcmRlci5zdG9wKCk7CisgICAgICAgIG1lZGlhUmVjb3JkZXIucmVsZWFzZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RfbWVkaWFSZWNvcmRlcl9Sb3V0aW5nTGlzdGVuZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9NSUNST1BIT05FKQorICAgICAgICAgICAgfHwgIU1lZGlhVXRpbHMuaGFzRW5jb2RlcihNZWRpYUZvcm1hdC5NSU1FVFlQRV9BVURJT19BQUMpKSB7CisgICAgICAgICAgICBNZWRpYVV0aWxzLnNraXBUZXN0KCJubyBhdWRpbyBjb2RlY3Mgb3IgbWljcm9waG9uZSIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgTWVkaWFSZWNvcmRlciBtZWRpYVJlY29yZGVyID0gYWxsb2NNZWRpYVJlY29yZGVyKCk7CisKKyAgICAgICAgLy8gbnVsbCBsaXN0ZW5lcgorICAgICAgICBtZWRpYVJlY29yZGVyLmFkZE9uUm91dGluZ0NoYW5nZWRMaXN0ZW5lcihudWxsLCBudWxsKTsKKworICAgICAgICBBdWRpb1JvdXRpbmdMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBBdWRpb1JvdXRpbmdMaXN0ZW5lcigpOworICAgICAgICBBdWRpb1JvdXRpbmdMaXN0ZW5lciBzb21lT3RoZXJMaXN0ZW5lciA9IG5ldyBBdWRpb1JvdXRpbmdMaXN0ZW5lcigpOworCisgICAgICAgIC8vIGFkZCBhIGxpc3RlbmVyCisgICAgICAgIG1lZGlhUmVjb3JkZXIuYWRkT25Sb3V0aW5nQ2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyLCBudWxsKTsKKworICAgICAgICAvLyByZW1vdmUgbGlzdGVuZXJzIHdlIGRpZG4ndCBhZGQKKyAgICAgICAgbWVkaWFSZWNvcmRlci5yZW1vdmVPblJvdXRpbmdDaGFuZ2VkTGlzdGVuZXIoc29tZU90aGVyTGlzdGVuZXIpOworICAgICAgICAvLyByZW1vdmUgYSB2YWxpZCBsaXN0ZW5lcgorICAgICAgICBtZWRpYVJlY29yZGVyLnJlbW92ZU9uUm91dGluZ0NoYW5nZWRMaXN0ZW5lcihsaXN0ZW5lcik7CisKKyAgICAgICAgTG9vcGVyIG15TG9vcGVyID0gcHJlcGFyZUlmTmVlZGVkTG9vcGVyKCk7CisgICAgICAgIG1lZGlhUmVjb3JkZXIuYWRkT25Sb3V0aW5nQ2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyLCBuZXcgSGFuZGxlcigpKTsKKyAgICAgICAgbWVkaWFSZWNvcmRlci5yZW1vdmVPblJvdXRpbmdDaGFuZ2VkTGlzdGVuZXIobGlzdGVuZXIpOworCisgICAgICAgIFRocmVhZC5zbGVlcChSRUNPUkRfVElNRV9NUyk7CisKKyAgICAgICAgbWVkaWFSZWNvcmRlci5zdG9wKCk7CisgICAgICAgIG1lZGlhUmVjb3JkZXIucmVsZWFzZSgpOworICAgICAgICBpZiAobXlMb29wZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbXlMb29wZXIucXVpdCgpOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL1NvdW5kUG9vbEFhY1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9Tb3VuZFBvb2xBYWNUZXN0LmphdmEKaW5kZXggOWUzN2UzOS4uZGJmNDIyYyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL1NvdW5kUG9vbEFhY1Rlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvU291bmRQb29sQWFjVGVzdC5qYXZhCkBAIC0xNyw3ICsxNyw5IEBACiBwYWNrYWdlIGFuZHJvaWQubWVkaWEuY3RzOwogCiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5jdHMuUjsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CiAKK0BBcHBNb2RlRnVsbChyZWFzb24gPSAiVE9ETzogZXZhbHVhdGUgYW5kIHBvcnQgdG8gaW5zdGFudCIpCiBwdWJsaWMgY2xhc3MgU291bmRQb29sQWFjVGVzdCBleHRlbmRzIFNvdW5kUG9vbFRlc3QgewogCiAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvU291bmRQb29sTWlkaVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9Tb3VuZFBvb2xNaWRpVGVzdC5qYXZhCmluZGV4IGQ3OTAwZTEuLjIxOGMyNzkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9Tb3VuZFBvb2xNaWRpVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9Tb3VuZFBvb2xNaWRpVGVzdC5qYXZhCkBAIC0xNyw3ICsxNyw5IEBACiBwYWNrYWdlIGFuZHJvaWQubWVkaWEuY3RzOwogCiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5jdHMuUjsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CiAKK0BBcHBNb2RlRnVsbChyZWFzb24gPSAiVE9ETzogZXZhbHVhdGUgYW5kIHBvcnQgdG8gaW5zdGFudCIpCiBwdWJsaWMgY2xhc3MgU291bmRQb29sTWlkaVRlc3QgZXh0ZW5kcyBTb3VuZFBvb2xUZXN0IHsKIAogICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL1NvdW5kUG9vbE9nZ1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9Tb3VuZFBvb2xPZ2dUZXN0LmphdmEKaW5kZXggNzAzMzBiZS4uOTc0OTE1NyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL1NvdW5kUG9vbE9nZ1Rlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvU291bmRQb29sT2dnVGVzdC5qYXZhCkBAIC0xNyw3ICsxNyw5IEBACiBwYWNrYWdlIGFuZHJvaWQubWVkaWEuY3RzOwogCiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5jdHMuUjsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CiAKK0BBcHBNb2RlRnVsbChyZWFzb24gPSAiVE9ETzogZXZhbHVhdGUgYW5kIHBvcnQgdG8gaW5zdGFudCIpCiBwdWJsaWMgY2xhc3MgU291bmRQb29sT2dnVGVzdCBleHRlbmRzIFNvdW5kUG9vbFRlc3QgewogCiAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvU291bmRQb29sVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL1NvdW5kUG9vbFRlc3QuamF2YQppbmRleCA4M2YzMzNiLi5lZDNlYTFlIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvU291bmRQb29sVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9Tb3VuZFBvb2xUZXN0LmphdmEKQEAgLTI0LDYgKzI0LDcgQEAKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQXR0cmlidXRlczsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLlNvdW5kUG9vbDsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKQEAgLTMzLDYgKzM0LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOwogCitAQXBwTW9kZUZ1bGwocmVhc29uID0gIlRPRE86IGV2YWx1YXRlIGFuZCBwb3J0IHRvIGluc3RhbnQiKQogYWJzdHJhY3QgY2xhc3MgU291bmRQb29sVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU09VTkRQT09MX1NUUkVBTVMgPSA0OwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL1N0cmVhbWluZ01lZGlhUGxheWVyMlRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9TdHJlYW1pbmdNZWRpYVBsYXllcjJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE3NjlhYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9TdHJlYW1pbmdNZWRpYVBsYXllcjJUZXN0LmphdmEKQEAgLTAsMCArMSw4MTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQubWVkaWEuY3RzOworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS5CdWZmZXJpbmdQYXJhbXM7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5EYXRhU291cmNlRGVzYzsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRm9ybWF0OworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIyLlRyYWNrSW5mbzsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlRpbWVkTWV0YURhdGE7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5jdHMuVGVzdFV0aWxzLk1vbml0b3I7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOworaW1wb3J0IGFuZHJvaWQub3MuUG93ZXJNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOworaW1wb3J0IGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuY3RzLkN0c1Rlc3RTZXJ2ZXI7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkR5bmFtaWNDb25maWdEZXZpY2VTaWRlOworaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuTWVkaWFVdGlsczsKKworaW1wb3J0IGphdmEubmV0Lkh0dHBDb29raWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogVGVzdHMgb2YgTWVkaWFQbGF5ZXIyIHN0cmVhbWluZyBjYXBhYmlsaXRpZXMuCisgKi8KK0BBcHBNb2RlRnVsbChyZWFzb24gPSAiVE9ETzogZXZhbHVhdGUgYW5kIHBvcnQgdG8gaW5zdGFudCIpCitwdWJsaWMgY2xhc3MgU3RyZWFtaW5nTWVkaWFQbGF5ZXIyVGVzdCBleHRlbmRzIE1lZGlhUGxheWVyMlRlc3RCYXNlIHsKKyAgICAvLyBUT0RPOiByZW1vdmUgdGhpcyBmbGFnIHRvIGVuYWJsZSB0ZXN0cy4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIElHTk9SRV9URVNUUyA9IHRydWU7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlN0cmVhbWluZ01lZGlhUGxheWVyMlRlc3QiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfSDI2M19BTVJfVklERU9fMV9LRVkgPQorICAgICAgICAgICAgInN0cmVhbWluZ19tZWRpYV9wbGF5ZXJfdGVzdF9odHRwX2gyNjNfYW1yX3ZpZGVvMSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfSDI2M19BTVJfVklERU9fMl9LRVkgPQorICAgICAgICAgICAgInN0cmVhbWluZ19tZWRpYV9wbGF5ZXJfdGVzdF9odHRwX2gyNjNfYW1yX3ZpZGVvMiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfSDI2NF9CQVNFX0FBQ19WSURFT18xX0tFWSA9CisgICAgICAgICAgICAic3RyZWFtaW5nX21lZGlhX3BsYXllcl90ZXN0X2h0dHBfaDI2NF9iYXNlX2FhY192aWRlbzEiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX0gyNjRfQkFTRV9BQUNfVklERU9fMl9LRVkgPQorICAgICAgICAgICAgInN0cmVhbWluZ19tZWRpYV9wbGF5ZXJfdGVzdF9odHRwX2gyNjRfYmFzZV9hYWNfdmlkZW8yIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9NUEVHNF9TUF9BQUNfVklERU9fMV9LRVkgPQorICAgICAgICAgICAgInN0cmVhbWluZ19tZWRpYV9wbGF5ZXJfdGVzdF9odHRwX21wZWc0X3NwX2FhY192aWRlbzEiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX01QRUc0X1NQX0FBQ19WSURFT18yX0tFWSA9CisgICAgICAgICAgICAic3RyZWFtaW5nX21lZGlhX3BsYXllcl90ZXN0X2h0dHBfbXBlZzRfc3BfYWFjX3ZpZGVvMiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRV9OQU1FID0gIkN0c01lZGlhVGVzdENhc2VzIjsKKyAgICBwcml2YXRlIER5bmFtaWNDb25maWdEZXZpY2VTaWRlIGR5bmFtaWNDb25maWc7CisKKyAgICBwcml2YXRlIEN0c1Rlc3RTZXJ2ZXIgbVNlcnZlcjsKKworICAgIHByaXZhdGUgU3RyaW5nIG1JbnB1dFVybDsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGlmIGxhdW5jaGVkIHdpdGggSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciB0byBwYXNzIGEgY29tbWFuZCBsaW5lIGFyZ3VtZW50CisgICAgICAgIGlmIChnZXRJbnN0cnVtZW50YXRpb24oKSBpbnN0YW5jZW9mIEluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIpIHsKKyAgICAgICAgICAgIEluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIgdGVzdFJ1bm5lciA9CisgICAgICAgICAgICAgICAgICAgIChJbnN0cnVtZW50YXRpb25UZXN0UnVubmVyKWdldEluc3RydW1lbnRhdGlvbigpOworCisgICAgICAgICAgICBCdW5kbGUgYXJndW1lbnRzID0gdGVzdFJ1bm5lci5nZXRBcmd1bWVudHMoKTsKKyAgICAgICAgICAgIG1JbnB1dFVybCA9IGFyZ3VtZW50cy5nZXRTdHJpbmcoInVybCIpOworICAgICAgICAgICAgTG9nLnYoVEFHLCAic2V0VXA6IGFyZ3VtZW50czogIiArIGFyZ3VtZW50cyk7CisgICAgICAgICAgICBpZiAobUlucHV0VXJsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBMb2cudihUQUcsICJzZXRVcDogYXJndW1lbnRzW3VybF0gIiArIG1JbnB1dFVybCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICBkeW5hbWljQ29uZmlnID0gbmV3IER5bmFtaWNDb25maWdEZXZpY2VTaWRlKE1PRFVMRV9OQU1FKTsKKyAgICB9CisKKy8qIFJUU1AgdGVzdHMgYXJlIG1vcmUgZmxha3kgYW5kIHZ1bG5lcmFibGUgdG8gbmV0d29yayBjb25kaXRpb24uCisgICBEaXNhYmxlIHVudGlsIGJldHRlciBzb2x1dGlvbiBpcyBhdmFpbGFibGUKKyAgICAvLyBTdHJlYW1pbmcgUlRTUCB2aWRlbyBmcm9tIFlvdVR1YmUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UlRTUF9IMjYzX0FNUl9WaWRlbzEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcGxheVZpZGVvVGVzdCgicnRzcDovL3YyLmNhY2hlNy5jLnlvdXR1YmUuY29tL3ZpZGVvLjNncD9jaWQ9MHgyNzFkZTk3NTYwNjU2NzdlIgorICAgICAgICAgICAgICAgICsgIiZmbXQ9MTMmdXNlcj1hbmRyb2lkLWRldmljZS10ZXN0IiwgMTc2LCAxNDQpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UlRTUF9IMjYzX0FNUl9WaWRlbzIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcGxheVZpZGVvVGVzdCgicnRzcDovL3YyLmNhY2hlNy5jLnlvdXR1YmUuY29tL3ZpZGVvLjNncD9jaWQ9MHhjODA2NTg0OTVhZjYwNjE3IgorICAgICAgICAgICAgICAgICsgIiZmbXQ9MTMmdXNlcj1hbmRyb2lkLWRldmljZS10ZXN0IiwgMTc2LCAxNDQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSVFNQX01QRUc0U1BfQUFDX1ZpZGVvMSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBwbGF5VmlkZW9UZXN0KCJydHNwOi8vdjIuY2FjaGU3LmMueW91dHViZS5jb20vdmlkZW8uM2dwP2NpZD0weDI3MWRlOTc1NjA2NTY3N2UiCisgICAgICAgICAgICAgICAgKyAiJmZtdD0xNyZ1c2VyPWFuZHJvaWQtZGV2aWNlLXRlc3QiLCAxNzYsIDE0NCk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RSVFNQX01QRUc0U1BfQUFDX1ZpZGVvMigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBwbGF5VmlkZW9UZXN0KCJydHNwOi8vdjIuY2FjaGU3LmMueW91dHViZS5jb20vdmlkZW8uM2dwP2NpZD0weGM4MDY1ODQ5NWFmNjA2MTciCisgICAgICAgICAgICAgICAgKyAiJmZtdD0xNyZ1c2VyPWFuZHJvaWQtZGV2aWNlLXRlc3QiLCAxNzYsIDE0NCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJUU1BfSDI2NEJhc2VfQUFDX1ZpZGVvMSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBwbGF5VmlkZW9UZXN0KCJydHNwOi8vdjIuY2FjaGU3LmMueW91dHViZS5jb20vdmlkZW8uM2dwP2NpZD0weDI3MWRlOTc1NjA2NTY3N2UiCisgICAgICAgICAgICAgICAgKyAiJmZtdD0xOCZ1c2VyPWFuZHJvaWQtZGV2aWNlLXRlc3QiLCA0ODAsIDI3MCk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RSVFNQX0gyNjRCYXNlX0FBQ19WaWRlbzIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcGxheVZpZGVvVGVzdCgicnRzcDovL3YyLmNhY2hlNy5jLnlvdXR1YmUuY29tL3ZpZGVvLjNncD9jaWQ9MHhjODA2NTg0OTVhZjYwNjE3IgorICAgICAgICAgICAgICAgICsgIiZmbXQ9MTgmdXNlcj1hbmRyb2lkLWRldmljZS10ZXN0IiwgNDgwLCAyNzApOworICAgIH0KKyovCisgICAgLy8gU3RyZWFtaW5nIEhUVFAgdmlkZW8gZnJvbSBZb3VUdWJlCisgICAgcHVibGljIHZvaWQgdGVzdEhUVFBfSDI2M19BTVJfVmlkZW8xKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChJR05PUkVfVEVTVFMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIU1lZGlhVXRpbHMuY2hlY2tEZWNvZGVyKE1lZGlhRm9ybWF0Lk1JTUVUWVBFX1ZJREVPX0gyNjMsCisgICAgICAgICAgICAgICAgICBNZWRpYUZvcm1hdC5NSU1FVFlQRV9BVURJT19BTVJfTkIpKSB7CisgICAgICAgICAgICByZXR1cm47IC8vIHNraXAKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyB1cmxTdHJpbmcgPSBkeW5hbWljQ29uZmlnLmdldFZhbHVlKEhUVFBfSDI2M19BTVJfVklERU9fMV9LRVkpOworICAgICAgICBwbGF5VmlkZW9UZXN0KHVybFN0cmluZywgMTc2LCAxNDQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RIVFRQX0gyNjNfQU1SX1ZpZGVvMigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoSUdOT1JFX1RFU1RTKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFNZWRpYVV0aWxzLmNoZWNrRGVjb2RlcihNZWRpYUZvcm1hdC5NSU1FVFlQRV9WSURFT19IMjYzLAorICAgICAgICAgICAgICAgICAgTWVkaWFGb3JtYXQuTUlNRVRZUEVfQVVESU9fQU1SX05CKSkgeworICAgICAgICAgICAgcmV0dXJuOyAvLyBza2lwCisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgdXJsU3RyaW5nID0gZHluYW1pY0NvbmZpZy5nZXRWYWx1ZShIVFRQX0gyNjNfQU1SX1ZJREVPXzJfS0VZKTsKKyAgICAgICAgcGxheVZpZGVvVGVzdCh1cmxTdHJpbmcsIDE3NiwgMTQ0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SFRUUF9NUEVHNFNQX0FBQ19WaWRlbzEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKElHTk9SRV9URVNUUykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICghTWVkaWFVdGlscy5jaGVja0RlY29kZXIoTWVkaWFGb3JtYXQuTUlNRVRZUEVfVklERU9fTVBFRzQpKSB7CisgICAgICAgICAgICByZXR1cm47IC8vIHNraXAKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyB1cmxTdHJpbmcgPSBkeW5hbWljQ29uZmlnLmdldFZhbHVlKEhUVFBfTVBFRzRfU1BfQUFDX1ZJREVPXzFfS0VZKTsKKyAgICAgICAgcGxheVZpZGVvVGVzdCh1cmxTdHJpbmcsIDE3NiwgMTQ0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SFRUUF9NUEVHNFNQX0FBQ19WaWRlbzIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKElHTk9SRV9URVNUUykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICghTWVkaWFVdGlscy5jaGVja0RlY29kZXIoTWVkaWFGb3JtYXQuTUlNRVRZUEVfVklERU9fTVBFRzQpKSB7CisgICAgICAgICAgICByZXR1cm47IC8vIHNraXAKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyB1cmxTdHJpbmcgPSBkeW5hbWljQ29uZmlnLmdldFZhbHVlKEhUVFBfTVBFRzRfU1BfQUFDX1ZJREVPXzJfS0VZKTsKKyAgICAgICAgcGxheVZpZGVvVGVzdCh1cmxTdHJpbmcsIDE3NiwgMTQ0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SFRUUF9IMjY0QmFzZV9BQUNfVmlkZW8xKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChJR05PUkVfVEVTVFMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIU1lZGlhVXRpbHMuY2hlY2tEZWNvZGVyKE1lZGlhRm9ybWF0Lk1JTUVUWVBFX1ZJREVPX0FWQykpIHsKKyAgICAgICAgICAgIHJldHVybjsgLy8gc2tpcAorICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHVybFN0cmluZyA9IGR5bmFtaWNDb25maWcuZ2V0VmFsdWUoSFRUUF9IMjY0X0JBU0VfQUFDX1ZJREVPXzFfS0VZKTsKKyAgICAgICAgcGxheVZpZGVvVGVzdCh1cmxTdHJpbmcsIDY0MCwgMzYwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SFRUUF9IMjY0QmFzZV9BQUNfVmlkZW8yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChJR05PUkVfVEVTVFMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIU1lZGlhVXRpbHMuY2hlY2tEZWNvZGVyKE1lZGlhRm9ybWF0Lk1JTUVUWVBFX1ZJREVPX0FWQykpIHsKKyAgICAgICAgICAgIHJldHVybjsgLy8gc2tpcAorICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHVybFN0cmluZyA9IGR5bmFtaWNDb25maWcuZ2V0VmFsdWUoSFRUUF9IMjY0X0JBU0VfQUFDX1ZJREVPXzJfS0VZKTsKKyAgICAgICAgcGxheVZpZGVvVGVzdCh1cmxTdHJpbmcsIDY0MCwgMzYwKTsKKyAgICB9CisKKyAgICAvLyBTdHJlYW1pbmcgSExTIHZpZGVvIGZyb20gWW91VHViZQorICAgIHB1YmxpYyB2b2lkIHRlc3RITFMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKElHTk9SRV9URVNUUykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICghTWVkaWFVdGlscy5jaGVja0RlY29kZXIoTWVkaWFGb3JtYXQuTUlNRVRZUEVfVklERU9fQVZDKSkgeworICAgICAgICAgICAgcmV0dXJuOyAvLyBza2lwCisgICAgICAgIH0KKworICAgICAgICAvLyBQbGF5IHN0cmVhbSBmb3IgNjAgc2Vjb25kcworICAgICAgICBwbGF5TGl2ZVZpZGVvVGVzdCgiaHR0cDovL3d3dy55b3V0dWJlLmNvbS9hcGkvbWFuaWZlc3QvaGxzX3ZhcmlhbnQvaWQvIgorICAgICAgICAgICAgICAgICsgIjAxNjg3MjRkMDJiZDk5NDUvaXRhZy81L3NvdXJjZS95b3V0dWJlL3BsYXlsaXN0X3R5cGUvRFZSL2lwLyIKKyAgICAgICAgICAgICAgICArICIwLjAuMC4wL2lwYml0cy8wL2V4cGlyZS8xOTAwMDAwMDAwMC9zcGFyYW1zL2lwLGlwYml0cyxleHBpcmUiCisgICAgICAgICAgICAgICAgKyAiLGlkLGl0YWcsc291cmNlLHBsYXlsaXN0X3R5cGUvc2lnbmF0dXJlLzc3M0FCOEFDQzY4QTk2RTVBQTQ4IgorICAgICAgICAgICAgICAgICsgIjE5OTZBRDZBMUJCQ0I3MERDQjg3Ljk1NzMzQjU0NEFDQzVGMDFBMTIyM0E4MzdEMkNGMDRERjg1QTMzNiIKKyAgICAgICAgICAgICAgICArICIwL2tleS9pazAvZmlsZS9tM3U4IiwgNjAgKiAxMDAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGxzV2l0aEhlYWRlcnNDb29raWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChJR05PUkVfVEVTVFMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIU1lZGlhVXRpbHMuY2hlY2tEZWNvZGVyKE1lZGlhRm9ybWF0Lk1JTUVUWVBFX1ZJREVPX0FWQykpIHsKKyAgICAgICAgICAgIHJldHVybjsgLy8gc2tpcAorICAgICAgICB9CisKKyAgICAgICAgZmluYWwgVXJpIHVyaSA9IFVyaS5wYXJzZSgKKyAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy55b3V0dWJlLmNvbS9hcGkvbWFuaWZlc3QvaGxzX3ZhcmlhbnQvaWQvIgorICAgICAgICAgICAgICAgICsgIjAxNjg3MjRkMDJiZDk5NDUvaXRhZy81L3NvdXJjZS95b3V0dWJlL3BsYXlsaXN0X3R5cGUvRFZSL2lwLyIKKyAgICAgICAgICAgICAgICArICIwLjAuMC4wL2lwYml0cy8wL2V4cGlyZS8xOTAwMDAwMDAwMC9zcGFyYW1zL2lwLGlwYml0cyxleHBpcmUiCisgICAgICAgICAgICAgICAgKyAiLGlkLGl0YWcsc291cmNlLHBsYXlsaXN0X3R5cGUvc2lnbmF0dXJlLzc3M0FCOEFDQzY4QTk2RTVBQTQ4IgorICAgICAgICAgICAgICAgICsgIjE5OTZBRDZBMUJCQ0I3MERDQjg3Ljk1NzMzQjU0NEFDQzVGMDFBMTIyM0E4MzdEMkNGMDRERjg1QTMzNiIKKyAgICAgICAgICAgICAgICArICIwL2tleS9pazAvZmlsZS9tM3U4Iik7CisKKyAgICAgICAgLy8gVE9ETzogZHVtbXkgdmFsdWVzIGZvciBoZWFkZXJzL2Nvb2tpZXMgdGlsbCB3ZSBmaW5kIGEgc2VydmVyIHRoYXQgYWN0dWFsbHkgbmVlZHMgdGhlbQorICAgICAgICBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBoZWFkZXJzLnB1dCgiaGVhZGVyMCIsICJ2YWx1ZTAiKTsKKyAgICAgICAgaGVhZGVycy5wdXQoImhlYWRlcjEiLCAidmFsdWUxIik7CisKKyAgICAgICAgU3RyaW5nIGNvb2tpZU5hbWUgPSAiYXV0aF8xMjM0NTY3IjsKKyAgICAgICAgU3RyaW5nIGNvb2tpZVZhbHVlID0gIjAxMjM0NTY3ODlBQkNERUYwMTIzNDU2Nzg5QUJDREVGIjsKKyAgICAgICAgSHR0cENvb2tpZSBjb29raWUgPSBuZXcgSHR0cENvb2tpZShjb29raWVOYW1lLCBjb29raWVWYWx1ZSk7CisgICAgICAgIGNvb2tpZS5zZXRIdHRwT25seSh0cnVlKTsKKyAgICAgICAgY29va2llLnNldERvbWFpbigid3d3LnlvdXR1YmUuY29tIik7CisgICAgICAgIGNvb2tpZS5zZXRQYXRoKCIvIik7ICAgICAgICAvLyBhbGwgcGF0aHMKKyAgICAgICAgY29va2llLnNldFNlY3VyZShmYWxzZSk7CisgICAgICAgIGNvb2tpZS5zZXREaXNjYXJkKGZhbHNlKTsKKyAgICAgICAgY29va2llLnNldE1heEFnZSgyNCAqIDM2MDApOyAgLy8gMjRocnMKKworICAgICAgICBqYXZhLnV0aWwuVmVjdG9yPEh0dHBDb29raWU+IGNvb2tpZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcjxIdHRwQ29va2llPigpOworICAgICAgICBjb29raWVzLmFkZChjb29raWUpOworCisgICAgICAgIC8vIFBsYXkgc3RyZWFtIGZvciA2MCBzZWNvbmRzCisgICAgICAgIHBsYXlMaXZlVmlkZW9UZXN0KHVyaSwgaGVhZGVycywgY29va2llcywgNjAgKiAxMDAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGxzU2FtcGxlQWVzX2JiYl9hdWRpb19vbmx5X292ZXJyaWRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChJR05PUkVfVEVTVFMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIU1lZGlhVXRpbHMuY2hlY2tEZWNvZGVyKE1lZGlhRm9ybWF0Lk1JTUVUWVBFX1ZJREVPX0FWQykpIHsKKyAgICAgICAgICAgIHJldHVybjsgLy8gc2tpcAorICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGRlZmF1bHRVcmwgPSAiaHR0cDovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vd3ZtZWRpYS9jZW5jL2hscy9zYW1wbGVfYWVzLyIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYmJfMTA4MHBfMzBmcHNfMTFtaW4vYXVkaW9fb25seS9wcm9nX2luZGV4Lm0zdTgiOworCisgICAgICAgIC8vIGlmIHVybCBvdmVycmlkZSBwcm92aWRlZAorICAgICAgICBTdHJpbmcgdGVzdFVybCA9IChtSW5wdXRVcmwgIT0gbnVsbCkgPyBtSW5wdXRVcmwgOiBkZWZhdWx0VXJsOworCisgICAgICAgIC8vIFBsYXkgc3RyZWFtIGZvciA2MCBzZWNvbmRzCisgICAgICAgIHBsYXlMaXZlQXVkaW9Pbmx5VGVzdCgKKyAgICAgICAgICAgICAgICB0ZXN0VXJsLAorICAgICAgICAgICAgICAgIDYwICogMTAwMCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEhsc1NhbXBsZUFlc19iYmJfdW5tdXhlZF8xNTAwaygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoSUdOT1JFX1RFU1RTKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFNZWRpYVV0aWxzLmNoZWNrRGVjb2RlcihNZWRpYUZvcm1hdC5NSU1FVFlQRV9WSURFT19BVkMpKSB7CisgICAgICAgICAgICByZXR1cm47IC8vIHNraXAKKyAgICAgICAgfQorCisgICAgICAgIC8vIFBsYXkgc3RyZWFtIGZvciA2MCBzZWNvbmRzCisgICAgICAgIHBsYXlMaXZlVmlkZW9UZXN0KAorICAgICAgICAgICAgICAgICJodHRwOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS93dm1lZGlhL2NlbmMvaGxzL3NhbXBsZV9hZXMvIiArCisgICAgICAgICAgICAgICAgImJiYl8xMDgwcF8zMGZwc18xMW1pbi91bm11eGVkXzE1MDBrL3Byb2dfaW5kZXgubTN1OCIsCisgICAgICAgICAgICAgICAgNjAgKiAxMDAwKTsKKyAgICB9CisKKworICAgIC8vIFN0cmVhbWluZyBhdWRpbyBmcm9tIGxvY2FsIEhUVFAgc2VydmVyCisgICAgcHVibGljIHZvaWQgdGVzdFBsYXlNcDNTdHJlYW0xKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGlmIChJR05PUkVfVEVTVFMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBsb2NhbEh0dHBBdWRpb1N0cmVhbVRlc3QoInJpbmdlci5tcDMiLCBmYWxzZSwgZmFsc2UpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGxheU1wM1N0cmVhbTIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgaWYgKElHTk9SRV9URVNUUykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGxvY2FsSHR0cEF1ZGlvU3RyZWFtVGVzdCgicmluZ2VyLm1wMyIsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RQbGF5TXAzU3RyZWFtUmVkaXJlY3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgaWYgKElHTk9SRV9URVNUUykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGxvY2FsSHR0cEF1ZGlvU3RyZWFtVGVzdCgicmluZ2VyLm1wMyIsIHRydWUsIGZhbHNlKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdFBsYXlNcDNTdHJlYW1Ob0xlbmd0aCgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBpZiAoSUdOT1JFX1RFU1RTKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbG9jYWxIdHRwQXVkaW9TdHJlYW1UZXN0KCJub2lzZWFuZGNoaXJwcy5tcDMiLCBmYWxzZSwgdHJ1ZSk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RQbGF5T2dnU3RyZWFtKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGlmIChJR05PUkVfVEVTVFMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBsb2NhbEh0dHBBdWRpb1N0cmVhbVRlc3QoIm5vaXNlYW5kY2hpcnBzLm9nZyIsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RQbGF5T2dnU3RyZWFtUmVkaXJlY3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgaWYgKElHTk9SRV9URVNUUykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGxvY2FsSHR0cEF1ZGlvU3RyZWFtVGVzdCgibm9pc2VhbmRjaGlycHMub2dnIiwgdHJ1ZSwgZmFsc2UpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGxheU9nZ1N0cmVhbU5vTGVuZ3RoKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGlmIChJR05PUkVfVEVTVFMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBsb2NhbEh0dHBBdWRpb1N0cmVhbVRlc3QoIm5vaXNlYW5kY2hpcnBzLm9nZyIsIGZhbHNlLCB0cnVlKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdFBsYXlNcDNTdHJlYW0xU3NsKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGlmIChJR05PUkVfVEVTVFMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBsb2NhbEh0dHBzQXVkaW9TdHJlYW1UZXN0KCJyaW5nZXIubXAzIiwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbG9jYWxIdHRwQXVkaW9TdHJlYW1UZXN0KGZpbmFsIFN0cmluZyBuYW1lLCBib29sZWFuIHJlZGlyZWN0LCBib29sZWFuIG5vbGVuZ3RoKQorICAgICAgICAgICAgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIG1TZXJ2ZXIgPSBuZXcgQ3RzVGVzdFNlcnZlcihtQ29udGV4dCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmcgc3RyZWFtX3VybCA9IG51bGw7CisgICAgICAgICAgICBpZiAocmVkaXJlY3QpIHsKKyAgICAgICAgICAgICAgICAvLyBTdGFnZWZyaWdodCBkb2Vzbid0IGhhdmUgYSBsaW1pdCwgYnV0IHdlIGNhbid0IHRlc3Qgc3VwcG9ydCBvZiBpbmZpbml0ZSByZWRpcmVjdHMKKyAgICAgICAgICAgICAgICAvLyBVcCB0byA0IHJlZGlyZWN0cyBzZWVtcyByZWFzb25hYmxlIHRob3VnaC4KKyAgICAgICAgICAgICAgICBzdHJlYW1fdXJsID0gbVNlcnZlci5nZXRSZWRpcmVjdGluZ0Fzc2V0VXJsKG5hbWUsIDQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdHJlYW1fdXJsID0gbVNlcnZlci5nZXRBc3NldFVybChuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChub2xlbmd0aCkgeworICAgICAgICAgICAgICAgIHN0cmVhbV91cmwgPSBzdHJlYW1fdXJsICsgIj8iICsgQ3RzVGVzdFNlcnZlci5OT0xFTkdUSF9QT1NURklYOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIU1lZGlhVXRpbHMuY2hlY2tDb2RlY3NGb3JQYXRoKG1Db250ZXh0LCBzdHJlYW1fdXJsKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsgLy8gc2tpcAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBVcmkgdXJpID0gVXJpLnBhcnNlKHN0cmVhbV91cmwpOworICAgICAgICAgICAgbVBsYXllci5zZXREYXRhU291cmNlKG5ldyBEYXRhU291cmNlRGVzYy5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgLnNldERhdGFTb3VyY2UobUNvbnRleHQsIHVyaSkKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgICAgICBtUGxheWVyLnNldERpc3BsYXkoZ2V0QWN0aXZpdHkoKS5nZXRTdXJmYWNlSG9sZGVyKCkpOworICAgICAgICAgICAgbVBsYXllci5zZXRTY3JlZW5PbldoaWxlUGxheWluZyh0cnVlKTsKKworICAgICAgICAgICAgbU9uQnVmZmVyaW5nVXBkYXRlQ2FsbGVkLnJlc2V0KCk7CisgICAgICAgICAgICBNZWRpYVBsYXllcjIuTWVkaWFQbGF5ZXIyRXZlbnRDYWxsYmFjayBlY2IgPQorICAgICAgICAgICAgICAgIG5ldyBNZWRpYVBsYXllcjIuTWVkaWFQbGF5ZXIyRXZlbnRDYWxsYmFjaygpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsIGludCB3aGF0LCBpbnQgZXh0cmEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwoIk1lZGlhIHBsYXllciBoYWQgZXJyb3IgIiArIHdoYXQgKyAiIHBsYXlpbmcgIiArIG5hbWUpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uSW5mbyhNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCwgaW50IHdoYXQsIGludCBleHRyYSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdoYXQgPT0gTWVkaWFQbGF5ZXIyLk1FRElBX0lORk9fUFJFUEFSRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT25QcmVwYXJlQ2FsbGVkLnNpZ25hbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IE1lZGlhUGxheWVyMi5NRURJQV9JTkZPX0JVRkZFUklOR19VUERBVEUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT25CdWZmZXJpbmdVcGRhdGVDYWxsZWQuc2lnbmFsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgbVBsYXllci5zZXRNZWRpYVBsYXllcjJFdmVudENhbGxiYWNrKG1FeGVjdXRvciwgZWNiKTsKKworICAgICAgICAgICAgYXNzZXJ0RmFsc2UobU9uQnVmZmVyaW5nVXBkYXRlQ2FsbGVkLmlzU2lnbmFsbGVkKCkpOworCisgICAgICAgICAgICBtUGxheWVyLnByZXBhcmUoKTsKKyAgICAgICAgICAgIG1PblByZXBhcmVDYWxsZWQud2FpdEZvclNpZ25hbCgpOworCisgICAgICAgICAgICBpZiAobm9sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBtUGxheWVyLnBsYXkoKTsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoTE9OR19TTEVFUF9USU1FKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShtUGxheWVyLmlzUGxheWluZygpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbU9uQnVmZmVyaW5nVXBkYXRlQ2FsbGVkLndhaXRGb3JTaWduYWwoKTsKKyAgICAgICAgICAgICAgICBtUGxheWVyLnBsYXkoKTsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0xFRVBfVElNRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUGxheWVyLnN0b3AoKTsKKyAgICAgICAgICAgIG1QbGF5ZXIucmVzZXQoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIG1TZXJ2ZXIuc2h1dGRvd24oKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwcml2YXRlIHZvaWQgbG9jYWxIdHRwc0F1ZGlvU3RyZWFtVGVzdChmaW5hbCBTdHJpbmcgbmFtZSwgYm9vbGVhbiByZWRpcmVjdCwgYm9vbGVhbiBub2xlbmd0aCkKKyAgICAgICAgICAgIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBtU2VydmVyID0gbmV3IEN0c1Rlc3RTZXJ2ZXIobUNvbnRleHQsIHRydWUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RyaW5nIHN0cmVhbV91cmwgPSBudWxsOworICAgICAgICAgICAgaWYgKHJlZGlyZWN0KSB7CisgICAgICAgICAgICAgICAgLy8gU3RhZ2VmcmlnaHQgZG9lc24ndCBoYXZlIGEgbGltaXQsIGJ1dCB3ZSBjYW4ndCB0ZXN0IHN1cHBvcnQgb2YgaW5maW5pdGUgcmVkaXJlY3RzCisgICAgICAgICAgICAgICAgLy8gVXAgdG8gNCByZWRpcmVjdHMgc2VlbXMgcmVhc29uYWJsZSB0aG91Z2guCisgICAgICAgICAgICAgICAgc3RyZWFtX3VybCA9IG1TZXJ2ZXIuZ2V0UmVkaXJlY3RpbmdBc3NldFVybChuYW1lLCA0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RyZWFtX3VybCA9IG1TZXJ2ZXIuZ2V0QXNzZXRVcmwobmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobm9sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBzdHJlYW1fdXJsID0gc3RyZWFtX3VybCArICI/IiArIEN0c1Rlc3RTZXJ2ZXIuTk9MRU5HVEhfUE9TVEZJWDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgVXJpIHVyaSA9IFVyaS5wYXJzZShzdHJlYW1fdXJsKTsKKyAgICAgICAgICAgIG1QbGF5ZXIuc2V0RGF0YVNvdXJjZShuZXcgRGF0YVNvdXJjZURlc2MuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgIC5zZXREYXRhU291cmNlKG1Db250ZXh0LCB1cmkpCisgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAgICAgbVBsYXllci5zZXREaXNwbGF5KGdldEFjdGl2aXR5KCkuZ2V0U3VyZmFjZUhvbGRlcigpKTsKKyAgICAgICAgICAgIG1QbGF5ZXIuc2V0U2NyZWVuT25XaGlsZVBsYXlpbmcodHJ1ZSk7CisKKyAgICAgICAgICAgIG1PbkJ1ZmZlcmluZ1VwZGF0ZUNhbGxlZC5yZXNldCgpOworCisgICAgICAgICAgICBNZWRpYVBsYXllcjIuTWVkaWFQbGF5ZXIyRXZlbnRDYWxsYmFjayBlY2IgPQorICAgICAgICAgICAgICAgIG5ldyBNZWRpYVBsYXllcjIuTWVkaWFQbGF5ZXIyRXZlbnRDYWxsYmFjaygpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsIGludCB3aGF0LCBpbnQgZXh0cmEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1PbkVycm9yQ2FsbGVkLnNpZ25hbCgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uSW5mbyhNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCwgaW50IHdoYXQsIGludCBleHRyYSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdoYXQgPT0gTWVkaWFQbGF5ZXIyLk1FRElBX0lORk9fUFJFUEFSRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT25QcmVwYXJlQ2FsbGVkLnNpZ25hbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IE1lZGlhUGxheWVyMi5NRURJQV9JTkZPX0JVRkZFUklOR19VUERBVEUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT25CdWZmZXJpbmdVcGRhdGVDYWxsZWQuc2lnbmFsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgbVBsYXllci5zZXRNZWRpYVBsYXllcjJFdmVudENhbGxiYWNrKG1FeGVjdXRvciwgZWNiKTsKKworICAgICAgICAgICAgYXNzZXJ0RmFsc2UobU9uQnVmZmVyaW5nVXBkYXRlQ2FsbGVkLmlzU2lnbmFsbGVkKCkpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtUGxheWVyLnByZXBhcmUoKTsKKyAgICAgICAgICAgICAgICBtT25FcnJvckNhbGxlZC53YWl0Rm9yU2lnbmFsKCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBtU2VydmVyLnNodXRkb3duKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUT0RPOiB1bmhpZGUgdGhpcyB0ZXN0IHdoZW4gd2Ugc29ydCBvdXQgaG93IHRvIGV4cG9zZSBidWZmZXJpbmcgY29udHJvbCBBUEkuCisgICAgcHJpdmF0ZSB2b2lkIGRvVGVzdEJ1ZmZlcmluZygpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9ICJyaW5nZXIubXAzIjsKKyAgICAgICAgbVNlcnZlciA9IG5ldyBDdHNUZXN0U2VydmVyKG1Db250ZXh0KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmluZyBzdHJlYW1fdXJsID0gbVNlcnZlci5nZXRBc3NldFVybChuYW1lKTsKKworICAgICAgICAgICAgaWYgKCFNZWRpYVV0aWxzLmNoZWNrQ29kZWNzRm9yUGF0aChtQ29udGV4dCwgc3RyZWFtX3VybCkpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJjYW4gbm90IGZpbmQgc3RyZWFtICIgKyBzdHJlYW1fdXJsICsgIiwgc2tpcHBpbmcgdGVzdCIpOworICAgICAgICAgICAgICAgIHJldHVybjsgLy8gc2tpcAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBNb25pdG9yIG9uU2V0QnVmZmVyaW5nUGFyYW1zQ2FsbGVkID0gbmV3IE1vbml0b3IoKTsKKyAgICAgICAgICAgIE1lZGlhUGxheWVyMi5NZWRpYVBsYXllcjJFdmVudENhbGxiYWNrIGVjYiA9CisgICAgICAgICAgICAgICAgbmV3IE1lZGlhUGxheWVyMi5NZWRpYVBsYXllcjJFdmVudENhbGxiYWNrKCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCwgaW50IHdoYXQsIGludCBleHRyYSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbCgiTWVkaWEgcGxheWVyIGhhZCBlcnJvciAiICsgd2hhdCArICIgcGxheWluZyAiICsgbmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uSW5mbyhNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCwgaW50IHdoYXQsIGludCBleHRyYSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdoYXQgPT0gTWVkaWFQbGF5ZXIyLk1FRElBX0lORk9fQlVGRkVSSU5HX1VQREFURSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PbkJ1ZmZlcmluZ1VwZGF0ZUNhbGxlZC5zaWduYWwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DYWxsQ29tcGxldGVkKE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aGF0LCBpbnQgc3RhdHVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2hhdCA9PSBNZWRpYVBsYXllcjIuQ0FMTF9DT01QTEVURURfU0VUX0JVRkZFUklOR19QQVJBTVMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FsbFN0YXR1cyA9IHN0YXR1czsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblNldEJ1ZmZlcmluZ1BhcmFtc0NhbGxlZC5zaWduYWwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICBtUGxheWVyLnNldE1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2sobUV4ZWN1dG9yLCBlY2IpOworCisgICAgICAgICAgICAvLyBnZXRCdWZmZXJpbmdQYXJhbXMgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBzZXREYXRhU291cmNlLgorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBCdWZmZXJpbmdQYXJhbXMgcGFyYW1zID0gbVBsYXllci5nZXRCdWZmZXJpbmdQYXJhbXMoKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJNZWRpYVBsYXllcjIgZmFpbGVkIHRvIGNoZWNrIHN0YXRlIGZvciBnZXRCdWZmZXJpbmdQYXJhbXMiKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gc2V0QnVmZmVyaW5nUGFyYW1zIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgc2V0RGF0YVNvdXJjZS4KKyAgICAgICAgICAgIEJ1ZmZlcmluZ1BhcmFtcyBwYXJhbXMgPSBuZXcgQnVmZmVyaW5nUGFyYW1zLkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAuc2V0SW5pdGlhbE1hcmtNcygyKQorICAgICAgICAgICAgICAgICAgICAuc2V0UmVzdW1lUGxheWJhY2tNYXJrTXMoMykKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgICAgICBtQ2FsbFN0YXR1cyA9IE1lZGlhUGxheWVyMi5DQUxMX1NUQVRVU19OT19FUlJPUjsKKyAgICAgICAgICAgIG9uU2V0QnVmZmVyaW5nUGFyYW1zQ2FsbGVkLnJlc2V0KCk7CisgICAgICAgICAgICBtUGxheWVyLnNldEJ1ZmZlcmluZ1BhcmFtcyhwYXJhbXMpOworICAgICAgICAgICAgb25TZXRCdWZmZXJpbmdQYXJhbXNDYWxsZWQud2FpdEZvclNpZ25hbCgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtQ2FsbFN0YXR1cyAhPSBNZWRpYVBsYXllcjIuQ0FMTF9TVEFUVVNfTk9fRVJST1IpOworCisgICAgICAgICAgICBmaW5hbCBVcmkgdXJpID0gVXJpLnBhcnNlKHN0cmVhbV91cmwpOworICAgICAgICAgICAgbVBsYXllci5zZXREYXRhU291cmNlKG5ldyBEYXRhU291cmNlRGVzYy5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgLnNldERhdGFTb3VyY2UobUNvbnRleHQsIHVyaSkKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgICAgICBtUGxheWVyLnNldERpc3BsYXkoZ2V0QWN0aXZpdHkoKS5nZXRTdXJmYWNlSG9sZGVyKCkpOworICAgICAgICAgICAgbVBsYXllci5zZXRTY3JlZW5PbldoaWxlUGxheWluZyh0cnVlKTsKKworICAgICAgICAgICAgbU9uQnVmZmVyaW5nVXBkYXRlQ2FsbGVkLnJlc2V0KCk7CisKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKG1PbkJ1ZmZlcmluZ1VwZGF0ZUNhbGxlZC5pc1NpZ25hbGxlZCgpKTsKKworICAgICAgICAgICAgcGFyYW1zID0gbVBsYXllci5nZXRCdWZmZXJpbmdQYXJhbXMoKTsKKworICAgICAgICAgICAgaW50IG5ld01hcmsgPSBwYXJhbXMuZ2V0SW5pdGlhbE1hcmtNcygpICsgMjsKKyAgICAgICAgICAgIEJ1ZmZlcmluZ1BhcmFtcyBuZXdQYXJhbXMgPQorICAgICAgICAgICAgICAgICAgICBuZXcgQnVmZmVyaW5nUGFyYW1zLkJ1aWxkZXIocGFyYW1zKS5zZXRJbml0aWFsTWFya01zKG5ld01hcmspLmJ1aWxkKCk7CisKKyAgICAgICAgICAgIG9uU2V0QnVmZmVyaW5nUGFyYW1zQ2FsbGVkLnJlc2V0KCk7CisgICAgICAgICAgICBtUGxheWVyLnNldEJ1ZmZlcmluZ1BhcmFtcyhuZXdQYXJhbXMpOworICAgICAgICAgICAgb25TZXRCdWZmZXJpbmdQYXJhbXNDYWxsZWQud2FpdEZvclNpZ25hbCgpOworCisgICAgICAgICAgICBpbnQgY2hlY2tNYXJrID0gLTE7CisgICAgICAgICAgICBCdWZmZXJpbmdQYXJhbXMgY2hlY2tQYXJhbXMgPSBtUGxheWVyLmdldEJ1ZmZlcmluZ1BhcmFtcygpOworICAgICAgICAgICAgY2hlY2tNYXJrID0gY2hlY2tQYXJhbXMuZ2V0SW5pdGlhbE1hcmtNcygpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJtYXJrcyBkbyBub3QgbWF0Y2giLCBuZXdNYXJrLCBjaGVja01hcmspOworCisgICAgICAgICAgICAvLyBUT0RPOiBhZGQgbW9yZSBkeW5hbWljIGNoZWNraW5nLCBlLmcuLCBidWZmZXJpbmcgc2hhbGwgbm90IGV4Y2VlZCBwcmUtc2V0IG1hcmsuCisKKyAgICAgICAgICAgIG1QbGF5ZXIucmVzZXQoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIG1TZXJ2ZXIuc2h1dGRvd24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQbGF5SGxzU3RyZWFtKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGlmIChJR05PUkVfVEVTVFMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIU1lZGlhVXRpbHMuY2hlY2tEZWNvZGVyKE1lZGlhRm9ybWF0Lk1JTUVUWVBFX1ZJREVPX0FWQykpIHsKKyAgICAgICAgICAgIHJldHVybjsgLy8gc2tpcAorICAgICAgICB9CisgICAgICAgIGxvY2FsSGxzVGVzdCgiaGxzLm0zdTgiLCBmYWxzZSwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQbGF5SGxzU3RyZWFtV2l0aFF1ZXJ5U3RyaW5nKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGlmIChJR05PUkVfVEVTVFMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIU1lZGlhVXRpbHMuY2hlY2tEZWNvZGVyKE1lZGlhRm9ybWF0Lk1JTUVUWVBFX1ZJREVPX0FWQykpIHsKKyAgICAgICAgICAgIHJldHVybjsgLy8gc2tpcAorICAgICAgICB9CisgICAgICAgIGxvY2FsSGxzVGVzdCgiaGxzLm0zdTgiLCB0cnVlLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFBsYXlIbHNTdHJlYW1XaXRoUmVkaXJlY3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgaWYgKElHTk9SRV9URVNUUykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICghTWVkaWFVdGlscy5jaGVja0RlY29kZXIoTWVkaWFGb3JtYXQuTUlNRVRZUEVfVklERU9fQVZDKSkgeworICAgICAgICAgICAgcmV0dXJuOyAvLyBza2lwCisgICAgICAgIH0KKyAgICAgICAgbG9jYWxIbHNUZXN0KCJobHMubTN1OCIsIGZhbHNlLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGxheUhsc1N0cmVhbVdpdGhUaW1lZElkMygpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBpZiAoSUdOT1JFX1RFU1RTKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFNZWRpYVV0aWxzLmNoZWNrRGVjb2RlcihNZWRpYUZvcm1hdC5NSU1FVFlQRV9WSURFT19BVkMpKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJEZXZpY2UgZG9lc24ndCBoYXZlIHZpZGVvIGNvZGVjLCBza2lwcGluZyB0ZXN0Iik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBtU2VydmVyID0gbmV3IEN0c1Rlc3RTZXJ2ZXIobUNvbnRleHQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gY291bnRlciBtdXN0IGJlIGZpbmFsIGlmIHdlIHdhbnQgdG8gYWNjZXNzIGl0IGluc2lkZSBvblRpbWVkTWV0YURhdGE7CisgICAgICAgICAgICAvLyB1c2UgQXRvbWljSW50ZWdlciBzbyB3ZSBjYW4gaGF2ZSBhIGZpbmFsIGNvdW50ZXIgb2JqZWN0IHdpdGggbXV0YWJsZSBpbnRlZ2VyIHZhbHVlLgorICAgICAgICAgICAgZmluYWwgQXRvbWljSW50ZWdlciBjb3VudGVyID0gbmV3IEF0b21pY0ludGVnZXIoKTsKKyAgICAgICAgICAgIFN0cmluZyBzdHJlYW1fdXJsID0gbVNlcnZlci5nZXRBc3NldFVybCgicHJvZ19pbmRleC5tM3U4Iik7CisgICAgICAgICAgICBmaW5hbCBVcmkgdXJpID0gVXJpLnBhcnNlKHN0cmVhbV91cmwpOworICAgICAgICAgICAgbVBsYXllci5zZXREYXRhU291cmNlKG5ldyBEYXRhU291cmNlRGVzYy5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgLnNldERhdGFTb3VyY2UobUNvbnRleHQsIHVyaSkKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICAgICAgbVBsYXllci5zZXREaXNwbGF5KGdldEFjdGl2aXR5KCkuZ2V0U3VyZmFjZUhvbGRlcigpKTsKKyAgICAgICAgICAgIG1QbGF5ZXIuc2V0U2NyZWVuT25XaGlsZVBsYXlpbmcodHJ1ZSk7CisgICAgICAgICAgICBtUGxheWVyLnNldFdha2VNb2RlKG1Db250ZXh0LCBQb3dlck1hbmFnZXIuUEFSVElBTF9XQUtFX0xPQ0spOworCisgICAgICAgICAgICBmaW5hbCBPYmplY3QgY29tcGxldGlvbiA9IG5ldyBPYmplY3QoKTsKKyAgICAgICAgICAgIE1lZGlhUGxheWVyMi5NZWRpYVBsYXllcjJFdmVudENhbGxiYWNrIGVjYiA9CisgICAgICAgICAgICAgICAgbmV3IE1lZGlhUGxheWVyMi5NZWRpYVBsYXllcjJFdmVudENhbGxiYWNrKCkgeworICAgICAgICAgICAgICAgICAgICBpbnQgcnVuOworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25JbmZvKE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkLCBpbnQgd2hhdCwgaW50IGV4dHJhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2hhdCA9PSBNZWRpYVBsYXllcjIuTUVESUFfSU5GT19QUkVQQVJFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PblByZXBhcmVDYWxsZWQuc2lnbmFsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gTWVkaWFQbGF5ZXIyLk1FRElBX0lORk9fUExBWUJBQ0tfQ09NUExFVEUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVuKysgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGxheWVyLnNlZWtUbygwLCBNZWRpYVBsYXllcjIuU0VFS19QUkVWSU9VU19TWU5DKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXllci5wbGF5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXllci5zdG9wKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoY29tcGxldGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbi5ub3RpZnkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25UaW1lZE1ldGFEYXRhQXZhaWxhYmxlKE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkLAorICAgICAgICAgICAgICAgICAgICAgICAgVGltZWRNZXRhRGF0YSBtZCkgeworICAgICAgICAgICAgICAgICAgICBjb3VudGVyLmluY3JlbWVudEFuZEdldCgpOworICAgICAgICAgICAgICAgICAgICBsb25nIHBvcyA9IG1wLmdldEN1cnJlbnRQb3NpdGlvbigpOworICAgICAgICAgICAgICAgICAgICBsb25nIHRpbWVVcyA9IG1kLmdldFRpbWVzdGFtcCgpOworICAgICAgICAgICAgICAgICAgICBieXRlW10gcmF3RGF0YSA9IG1kLmdldE1ldGFEYXRhKCk7CisgICAgICAgICAgICAgICAgICAgIC8vIFJhdyBkYXRhIGNvbnRhaW5zIGFuIGlkMyB0YWcgaG9sZGluZyB0aGUgZGVjaW1hbCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGFzc29jaWF0ZWQgdGltZSBzdGFtcCByb3VuZGVkIHRvIHRoZSBjbG9zZXN0IGhhbGYgc2Vjb25kLgorCisgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMzsgLy8gIklEMyIKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDI7IC8vIHZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDE7IC8vIGZsYWdzCisgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSA0OyAvLyBzaXplCisgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSA0OyAvLyAiVFhYWCIKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDQ7IC8vIGZyYW1lIHNpemUKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDI7IC8vIGZyYW1lIGZsYWdzCisgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSAxOyAvLyAiXHgwMyIgOiBVVEYtOCBlbmNvZGVkIFVuaWNvZGUKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDE7IC8vICJceDAwIiA6IG51bGwtdGVybWluYXRlZCBlbXB0eSBkZXNjcmlwdGlvbgorCisgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGggPSByYXdEYXRhLmxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoIC09IG9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoIC09IDE7IC8vICJceDAwIiA6IHRlcm1pbmF0aW5nIG51bGwKKworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGF0YSA9IG5ldyBTdHJpbmcocmF3RGF0YSwgb2Zmc2V0LCBsZW5ndGgpOworICAgICAgICAgICAgICAgICAgICBpbnQgZGF0YVRpbWVVcyA9IEludGVnZXIucGFyc2VJbnQoZGF0YSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIlRpbWVkIElEMyB0aW1lc3RhbXAgZG9lcyBub3QgbWF0Y2ggY29udGVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5hYnMoZGF0YVRpbWVVcyAtIHRpbWVVcykgPCA1MDAwMDApOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJUaW1lZCBJRDMgYXJyaXZlcyBhZnRlciB0aW1lc3RhbXAiLCBwb3MgKiAxMDAwIDwgdGltZVVzKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNhbGxDb21wbGV0ZWQoTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2hhdCwgaW50IHN0YXR1cykgeworICAgICAgICAgICAgICAgICAgICBpZiAod2hhdCA9PSBNZWRpYVBsYXllcjIuQ0FMTF9DT01QTEVURURfUExBWSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbU9uUGxheUNhbGxlZC5zaWduYWwoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBtUGxheWVyLnNldE1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2sobUV4ZWN1dG9yLCBlY2IpOworCisgICAgICAgICAgICBtUGxheWVyLnByZXBhcmUoKTsKKyAgICAgICAgICAgIG1PblByZXBhcmVDYWxsZWQud2FpdEZvclNpZ25hbCgpOworCisgICAgICAgICAgICBtT25QbGF5Q2FsbGVkLnJlc2V0KCk7CisgICAgICAgICAgICBtUGxheWVyLnBsYXkoKTsKKyAgICAgICAgICAgIG1PblBsYXlDYWxsZWQud2FpdEZvclNpZ25hbCgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiTWVkaWFQbGF5ZXIyIG5vdCBwbGF5aW5nIiwgbVBsYXllci5pc1BsYXlpbmcoKSk7CisKKyAgICAgICAgICAgIGludCBpID0gLTE7CisgICAgICAgICAgICBMaXN0PFRyYWNrSW5mbz4gdHJhY2tJbmZvcyA9IG1QbGF5ZXIuZ2V0VHJhY2tJbmZvKCk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdHJhY2tJbmZvcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIFRyYWNrSW5mbyB0cmFja0luZm8gPSB0cmFja0luZm9zLmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAodHJhY2tJbmZvLmdldFRyYWNrVHlwZSgpID09IFRyYWNrSW5mby5NRURJQV9UUkFDS19UWVBFX01FVEFEQVRBKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydFRydWUoIlN0cmVhbSBoYXMgbm8gdGltZWQgSUQzIHRyYWNrIiwgaSA+PSAwKTsKKyAgICAgICAgICAgIG1QbGF5ZXIuc2VsZWN0VHJhY2soaSk7CisKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoY29tcGxldGlvbikgeworICAgICAgICAgICAgICAgIGNvbXBsZXRpb24ud2FpdCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUaGVyZSBhcmUgYSB0b3RhbCBvZiAxOSBtZXRhZGF0YSBhY2Nlc3MgdW5pdHMgaW4gdGhlIHRlc3Qgc3RyZWFtOyBldmVyeSBvbmUgb2YgdGhlbQorICAgICAgICAgICAgLy8gc2hvdWxkIGJlIHJlY2VpdmVkIHR3aWNlOiBvbmNlIGJlZm9yZSB0aGUgc2VlayBhbmQgb25jZSBhZnRlci4KKyAgICAgICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCBudW1iZXIgb2YgdGltZWQgSUQzcyByZWNpZXZlZCIsIGNvdW50ZXIuZ2V0KCkgPT0gMzgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgbVNlcnZlci5zaHV0ZG93bigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgV29ya2VyV2l0aFBsYXllciBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbUxvY2sgPSBuZXcgT2JqZWN0KCk7CisgICAgICAgIHByaXZhdGUgTG9vcGVyIG1Mb29wZXI7CisgICAgICAgIHByaXZhdGUgTWVkaWFQbGF5ZXIyIG1QbGF5ZXI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSB3b3JrZXIgdGhyZWFkIHdpdGggdGhlIGdpdmVuIG5hbWUuIFRoZSB0aHJlYWQKKyAgICAgICAgICogdGhlbiBydW5zIGEge0BsaW5rIGFuZHJvaWQub3MuTG9vcGVyfS4KKyAgICAgICAgICogQHBhcmFtIG5hbWUgQSBuYW1lIGZvciB0aGUgbmV3IHRocmVhZAorICAgICAgICAgKi8KKyAgICAgICAgV29ya2VyV2l0aFBsYXllcihTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG51bGwsIHRoaXMsIG5hbWUpOworICAgICAgICAgICAgdC5zZXRQcmlvcml0eShUaHJlYWQuTUlOX1BSSU9SSVRZKTsKKyAgICAgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAobUxvb3BlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtTG9jay53YWl0KCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTWVkaWFQbGF5ZXIyIGdldFBsYXllcigpIHsKKyAgICAgICAgICAgIHJldHVybiBtUGxheWVyOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgICAgICBMb29wZXIucHJlcGFyZSgpOworICAgICAgICAgICAgICAgIG1Mb29wZXIgPSBMb29wZXIubXlMb29wZXIoKTsKKyAgICAgICAgICAgICAgICBtUGxheWVyID0gTWVkaWFQbGF5ZXIyLmNyZWF0ZSgpOworICAgICAgICAgICAgICAgIG1Mb2NrLm5vdGlmeUFsbCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTG9vcGVyLmxvb3AoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHF1aXQoKSB7CisgICAgICAgICAgICBtTG9vcGVyLnF1aXQoKTsKKyAgICAgICAgICAgIG1QbGF5ZXIuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RCbG9ja2luZ1JlYWRSZWxlYXNlKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGlmIChJR05PUkVfVEVTVFMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1TZXJ2ZXIgPSBuZXcgQ3RzVGVzdFNlcnZlcihtQ29udGV4dCk7CisKKyAgICAgICAgV29ya2VyV2l0aFBsYXllciB3b3JrZXIgPSBuZXcgV29ya2VyV2l0aFBsYXllcigicGxheWVyIik7CisgICAgICAgIGZpbmFsIE1lZGlhUGxheWVyMiBtcCA9IHdvcmtlci5nZXRQbGF5ZXIoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBtU2VydmVyLmdldERlbGF5ZWRBc3NldFVybCgibm9pc2VhbmRjaGlycHMub2dnIiwgMTUwMDApOworICAgICAgICAgICAgZmluYWwgVXJpIHVyaSA9IFVyaS5wYXJzZShwYXRoKTsKKyAgICAgICAgICAgIG1wLnNldERhdGFTb3VyY2UobmV3IERhdGFTb3VyY2VEZXNjLkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAuc2V0RGF0YVNvdXJjZShtQ29udGV4dCwgdXJpKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgICAgIE1lZGlhUGxheWVyMi5NZWRpYVBsYXllcjJFdmVudENhbGxiYWNrIGVjYiA9CisgICAgICAgICAgICAgICAgbmV3IE1lZGlhUGxheWVyMi5NZWRpYVBsYXllcjJFdmVudENhbGxiYWNrKCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25JbmZvKE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkLCBpbnQgd2hhdCwgaW50IGV4dHJhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2hhdCA9PSBNZWRpYVBsYXllcjIuTUVESUFfSU5GT19QUkVQQVJFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwoInByZXBhcmUgc2hvdWxkIG5vdCBzdWNjZWVkIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgbXAuc2V0TWVkaWFQbGF5ZXIyRXZlbnRDYWxsYmFjayhtRXhlY3V0b3IsIGVjYik7CisKKyAgICAgICAgICAgIG1wLnByZXBhcmUoKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKKyAgICAgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKTsKKyAgICAgICAgICAgIG1wLmNsb3NlKCk7CisgICAgICAgICAgICBsb25nIGVuZCA9IFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpOworICAgICAgICAgICAgbG9uZyByZWxlYXNlRHVyYXRpb24gPSAoZW5kIC0gc3RhcnQpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgicmVsZWFzZSB0b29rIHRvbyBsb25nOiAiICsgcmVsZWFzZUR1cmF0aW9uLCByZWxlYXNlRHVyYXRpb24gPCAxMDAwKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIG1TZXJ2ZXIuc2h1dGRvd24oKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGdpdmUgdGhlIHdvcmtlciBhIGJpdCBvZiB0aW1lIHRvIHN0YXJ0IHByb2Nlc3NpbmcgdGhlIG1lc3NhZ2UgYmVmb3JlIHNodXR0aW5nIGl0IGRvd24KKyAgICAgICAgVGhyZWFkLnNsZWVwKDUwMDApOworICAgICAgICB3b3JrZXIucXVpdCgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBsb2NhbEhsc1Rlc3QoZmluYWwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gYXBwZW5kUXVlcnlTdHJpbmcsIGJvb2xlYW4gcmVkaXJlY3QpCisgICAgICAgICAgICB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgbVNlcnZlciA9IG5ldyBDdHNUZXN0U2VydmVyKG1Db250ZXh0KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmluZyBzdHJlYW1fdXJsID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChyZWRpcmVjdCkgeworICAgICAgICAgICAgICAgIHN0cmVhbV91cmwgPSBtU2VydmVyLmdldFF1ZXJ5UmVkaXJlY3RpbmdBc3NldFVybChuYW1lKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RyZWFtX3VybCA9IG1TZXJ2ZXIuZ2V0QXNzZXRVcmwobmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYXBwZW5kUXVlcnlTdHJpbmcpIHsKKyAgICAgICAgICAgICAgICBzdHJlYW1fdXJsICs9ICI/Zm9vPWJhci9iYXoiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwbGF5TGl2ZVZpZGVvVGVzdChzdHJlYW1fdXJsLCAxMCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBtU2VydmVyLnNodXRkb3duKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvU3RyZWFtaW5nTWVkaWFQbGF5ZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvU3RyZWFtaW5nTWVkaWFQbGF5ZXJUZXN0LmphdmEKaW5kZXggODBlYzc4OS4uNjBhOTJiMSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL1N0cmVhbWluZ01lZGlhUGxheWVyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9TdHJlYW1pbmdNZWRpYVBsYXllclRlc3QuamF2YQpAQCAtMTYsMTAgKzE2LDYgQEAKIHBhY2thZ2UgYW5kcm9pZC5tZWRpYS5jdHM7CiAKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkJ1ZmZlcmluZ1BhcmFtczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29kZWNJbmZvOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb2RlY0luZm8uQ29kZWNDYXBhYmlsaXRpZXM7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvZGVjSW5mby5WaWRlb0NhcGFiaWxpdGllczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29kZWNMaXN0OwogaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFGb3JtYXQ7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcjsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyLlRyYWNrSW5mbzsKQEAgLTI5LDYgKzI1LDcgQEAKIGltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKIGltcG9ydCBhbmRyb2lkLm9zLlBvd2VyTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIGltcG9ydCBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQud2Via2l0LmN0cy5DdHNUZXN0U2VydmVyOwpAQCAtNTIsNiArNDksNyBAQAogLyoqCiAgKiBUZXN0cyBvZiBNZWRpYVBsYXllciBzdHJlYW1pbmcgY2FwYWJpbGl0aWVzLgogICovCitAQXBwTW9kZUZ1bGwocmVhc29uID0gIlRPRE86IGV2YWx1YXRlIGFuZCBwb3J0IHRvIGluc3RhbnQiKQogcHVibGljIGNsYXNzIFN0cmVhbWluZ01lZGlhUGxheWVyVGVzdCBleHRlbmRzIE1lZGlhUGxheWVyVGVzdEJhc2UgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTdHJlYW1pbmdNZWRpYVBsYXllclRlc3QiOwpAQCAtMTkwLDcgKzE4OCw4IEBACiAKICAgICAgICAgLy8gUGxheSBzdHJlYW0gZm9yIDYwIHNlY29uZHMKICAgICAgICAgLy8gbGltaXQgcmF0ZSB0byB3b3JrYXJvdW5kIG11bHRpcGxpY2F0aW9uIG92ZXJmbG93IGluIGZyYW1ld29yawotICAgICAgICBsb2NhbEhsc1Rlc3QoImhsc192YXJpYW50L2luZGV4Lm0zdTgiLCA2MCAqIDEwMDAsIExPQ0FMX0hMU19CSVRTX1BFUl9NUywgZmFsc2UgLyppc0F1ZGlvT25seSovKTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBpc0F1ZGlvT25seSA9IGZhbHNlOworICAgICAgICBsb2NhbEhsc1Rlc3QoImhsc192YXJpYW50L2luZGV4Lm0zdTgiLCA2MCAqIDEwMDAsIExPQ0FMX0hMU19CSVRTX1BFUl9NUywgaXNBdWRpb09ubHkpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RIbHNXaXRoSGVhZGVyc0Nvb2tpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTIxOCw3ICsyMTcsOCBAQAogCiAgICAgICAgIC8vIFBsYXkgc3RyZWFtIGZvciA2MCBzZWNvbmRzCiAgICAgICAgIC8vIGxpbWl0IHJhdGUgdG8gd29ya2Fyb3VuZCBtdWx0aXBsaWNhdGlvbiBvdmVyZmxvdyBpbiBmcmFtZXdvcmsKLSAgICAgICAgbG9jYWxIbHNUZXN0KCJobHNfdmFyaWFudC9pbmRleC5tM3U4IiwgNjAgKiAxMDAwLCBMT0NBTF9ITFNfQklUU19QRVJfTVMsIGZhbHNlIC8qaXNBdWRpb09ubHkqLyk7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNBdWRpb09ubHkgPSBmYWxzZTsKKyAgICAgICAgbG9jYWxIbHNUZXN0KCJobHNfdmFyaWFudC9pbmRleC5tM3U4IiwgNjAgKiAxMDAwLCBMT0NBTF9ITFNfQklUU19QRVJfTVMsIGlzQXVkaW9Pbmx5KTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0SGxzU2FtcGxlQWVzX2JiYl9hdWRpb19vbmx5X292ZXJyaWRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0yNDEsMzUgKzI0MSwxOCBAQAogICAgICAgICAgICAgcmV0dXJuOyAvLyBza2lwCiAgICAgICAgIH0KIAotICAgICAgICBNZWRpYUNvZGVjTGlzdCBtY2wgPSBuZXcgTWVkaWFDb2RlY0xpc3QoTWVkaWFDb2RlY0xpc3QuUkVHVUxBUl9DT0RFQ1MpOwotICAgICAgICBmb3IgKE1lZGlhQ29kZWNJbmZvIGluZm8gOiBtY2wuZ2V0Q29kZWNJbmZvcygpKSB7Ci0gICAgICAgICAgICBpZiAoaW5mby5pc0VuY29kZXIoKQotICAgICAgICAgICAgICAgIHx8IGluZm8uZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgib214Lmdvb2dsZS4iKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBDb2RlY0NhcGFiaWxpdGllcyBjYXBzID0gaW5mby5nZXRDYXBhYmlsaXRpZXNGb3JUeXBlKE1lZGlhRm9ybWF0Lk1JTUVUWVBFX1ZJREVPX0FWQyk7Ci0gICAgICAgICAgICAgICAgVmlkZW9DYXBhYmlsaXRpZXMgdmNhcHMgPSBjYXBzLmdldFZpZGVvQ2FwYWJpbGl0aWVzKCk7CisgICAgICAgIE1lZGlhRm9ybWF0IGZvcm1hdCA9IE1lZGlhRm9ybWF0LmNyZWF0ZVZpZGVvRm9ybWF0KE1lZGlhRm9ybWF0Lk1JTUVUWVBFX1ZJREVPX0FWQywgMTkyMCwgMTA4MCk7CisgICAgICAgIFN0cmluZ1tdIGRlY29kZXJOYW1lcyA9IE1lZGlhVXRpbHMuZ2V0RGVjb2Rlck5hbWVzKGZhbHNlLCBmb3JtYXQpOwogCi0gICAgICAgICAgICAgICAgLy8gUGxheSAxMDgwcCBzdHJlYW0gZm9yIDYwIHNlY29uZHMgaWYgcGxhdGZvcm0gc3VwcG9ydHMuCi0gICAgICAgICAgICAgICAgaWYgKHZjYXBzLmFyZVNpemVBbmRSYXRlU3VwcG9ydGVkKDE5MjAgLDEwODAsIDMwKSkgewotICAgICAgICAgICAgICAgICAgICBsb2NhbEhsc1Rlc3QoInVubXV4ZWRfMTUwMGsvaW5kZXgubTN1OCIsIDYwICogMTAwMCwgLTEsIGZhbHNlIC8qaXNBdWRpb09ubHkqLyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKGRlY29kZXJOYW1lcy5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgTWVkaWFVdGlscy5za2lwVGVzdCgiTm8gZGVjb2RlcnMgZm9yICIgKyBmb3JtYXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gUGxheSBzdHJlYW0gZm9yIDYwIHNlY29uZHMKKyAgICAgICAgICAgIGxvY2FsSGxzVGVzdCgidW5tdXhlZF8xNTAway9pbmRleC5tM3U4IiwgNjAgKiAxMDAwLCAtMSwgZmFsc2UgLyppc0F1ZGlvT25seSovKTsKICAgICAgICAgfQogICAgIH0KIAogCi0gICAgcHVibGljIHZvaWQgdGVzdEhsc1NhbXBsZUFlc19iYmJfdW5tdXhlZF8xMDAwaygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIU1lZGlhVXRpbHMuY2hlY2tEZWNvZGVyKE1lZGlhRm9ybWF0Lk1JTUVUWVBFX1ZJREVPX0FWQykpIHsKLSAgICAgICAgICAgIHJldHVybjsgLy8gc2tpcAotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUGxheSA0ODBwIHN0cmVhbSBmb3IgNjAgc2Vjb25kcwotICAgICAgICBsb2NhbEhsc1Rlc3QoInVubXV4ZWRfMTAwMGsvaW5kZXgubTN1OCIsIDYwICogMTAwMCwgLTEsIGZhbHNlIC8qaXNBdWRpb09ubHkqLyk7Ci0gICAgfQotCiAgICAgLy8gU3RyZWFtaW5nIGF1ZGlvIGZyb20gbG9jYWwgSFRUUCBzZXJ2ZXIKICAgICBwdWJsaWMgdm9pZCB0ZXN0UGxheU1wM1N0cmVhbTEoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgbG9jYWxIdHRwQXVkaW9TdHJlYW1UZXN0KCJyaW5nZXIubXAzIiwgZmFsc2UsIGZhbHNlKTsKQEAgLTQxNCwxMCArMzk3LDIyIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBza2lwCiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIGdldERlZmF1bHRCdWZmZXJpbmdQYXJhbXMgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBzZXREYXRhU291cmNlLgorICAgICAgICAgICAgLy8gZ2V0QnVmZmVyaW5nUGFyYW1zIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgc2V0RGF0YVNvdXJjZS4KICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgQnVmZmVyaW5nUGFyYW1zIHBhcmFtcyA9IG1NZWRpYVBsYXllci5nZXREZWZhdWx0QnVmZmVyaW5nUGFyYW1zKCk7Ci0gICAgICAgICAgICAgICAgZmFpbCgiTWVkaWFQbGF5ZXIgZmFpbGVkIHRvIGNoZWNrIHN0YXRlIGZvciBnZXREZWZhdWx0QnVmZmVyaW5nUGFyYW1zIik7CisgICAgICAgICAgICAgICAgQnVmZmVyaW5nUGFyYW1zIHBhcmFtcyA9IG1NZWRpYVBsYXllci5nZXRCdWZmZXJpbmdQYXJhbXMoKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJNZWRpYVBsYXllciBmYWlsZWQgdG8gY2hlY2sgc3RhdGUgZm9yIGdldEJ1ZmZlcmluZ1BhcmFtcyIpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBzZXRCdWZmZXJpbmdQYXJhbXMgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBzZXREYXRhU291cmNlLgorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBCdWZmZXJpbmdQYXJhbXMgcGFyYW1zID0gbmV3IEJ1ZmZlcmluZ1BhcmFtcy5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJbml0aWFsTWFya01zKDIpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UmVzdW1lUGxheWJhY2tNYXJrTXMoMykKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICAgICAgICAgIG1NZWRpYVBsYXllci5zZXRCdWZmZXJpbmdQYXJhbXMocGFyYW1zKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJNZWRpYVBsYXllciBmYWlsZWQgdG8gY2hlY2sgc3RhdGUgZm9yIHNldEJ1ZmZlcmluZ1BhcmFtcyIpOwogICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZAogICAgICAgICAgICAgfQpAQCAtNDQ0LDMzICs0MzksMTcgQEAKIAogICAgICAgICAgICAgYXNzZXJ0RmFsc2UobU9uQnVmZmVyaW5nVXBkYXRlQ2FsbGVkLmlzU2lnbmFsbGVkKCkpOwogCi0gICAgICAgICAgICBCdWZmZXJpbmdQYXJhbXMgcGFyYW1zID0gbU1lZGlhUGxheWVyLmdldERlZmF1bHRCdWZmZXJpbmdQYXJhbXMoKTsKKyAgICAgICAgICAgIEJ1ZmZlcmluZ1BhcmFtcyBwYXJhbXMgPSBtTWVkaWFQbGF5ZXIuZ2V0QnVmZmVyaW5nUGFyYW1zKCk7CiAKLSAgICAgICAgICAgIGludCBuZXdNYXJrID0gLTE7Ci0gICAgICAgICAgICBCdWZmZXJpbmdQYXJhbXMgbmV3UGFyYW1zID0gbnVsbDsKLSAgICAgICAgICAgIGludCBpbml0aWFsQnVmZmVyaW5nTW9kZSA9IHBhcmFtcy5nZXRJbml0aWFsQnVmZmVyaW5nTW9kZSgpOwotICAgICAgICAgICAgaWYgKGluaXRpYWxCdWZmZXJpbmdNb2RlID09IEJ1ZmZlcmluZ1BhcmFtcy5CVUZGRVJJTkdfTU9ERV9TSVpFX09OTFkKLSAgICAgICAgICAgICAgICAgICAgfHwgaW5pdGlhbEJ1ZmZlcmluZ01vZGUgPT0gQnVmZmVyaW5nUGFyYW1zLkJVRkZFUklOR19NT0RFX1RJTUVfVEhFTl9TSVpFKSB7Ci0gICAgICAgICAgICAgICAgbmV3TWFyayA9IHBhcmFtcy5nZXRJbml0aWFsQnVmZmVyaW5nV2F0ZXJtYXJrS0IoKSArIDE7Ci0gICAgICAgICAgICAgICAgbmV3UGFyYW1zID0gbmV3IEJ1ZmZlcmluZ1BhcmFtcy5CdWlsZGVyKHBhcmFtcykuc2V0SW5pdGlhbEJ1ZmZlcmluZ1dhdGVybWFya0tCKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3TWFyaykuYnVpbGQoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5pdGlhbEJ1ZmZlcmluZ01vZGUgPT0gQnVmZmVyaW5nUGFyYW1zLkJVRkZFUklOR19NT0RFX1RJTUVfT05MWSkgewotICAgICAgICAgICAgICAgIG5ld01hcmsgPSBwYXJhbXMuZ2V0SW5pdGlhbEJ1ZmZlcmluZ1dhdGVybWFya01zKCkgKyAxOwotICAgICAgICAgICAgICAgIG5ld1BhcmFtcyA9IG5ldyBCdWZmZXJpbmdQYXJhbXMuQnVpbGRlcihwYXJhbXMpLnNldEluaXRpYWxCdWZmZXJpbmdXYXRlcm1hcmtNcygKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld01hcmspLmJ1aWxkKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG5ld1BhcmFtcyA9IHBhcmFtczsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBuZXdNYXJrID0gcGFyYW1zLmdldEluaXRpYWxNYXJrTXMoKSArIDI7CisgICAgICAgICAgICBCdWZmZXJpbmdQYXJhbXMgbmV3UGFyYW1zID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IEJ1ZmZlcmluZ1BhcmFtcy5CdWlsZGVyKHBhcmFtcykuc2V0SW5pdGlhbE1hcmtNcyhuZXdNYXJrKS5idWlsZCgpOworCiAgICAgICAgICAgICBtTWVkaWFQbGF5ZXIuc2V0QnVmZmVyaW5nUGFyYW1zKG5ld1BhcmFtcyk7CiAKICAgICAgICAgICAgIGludCBjaGVja01hcmsgPSAtMTsKICAgICAgICAgICAgIEJ1ZmZlcmluZ1BhcmFtcyBjaGVja1BhcmFtcyA9IG1NZWRpYVBsYXllci5nZXRCdWZmZXJpbmdQYXJhbXMoKTsKLSAgICAgICAgICAgIGlmIChpbml0aWFsQnVmZmVyaW5nTW9kZSA9PSBCdWZmZXJpbmdQYXJhbXMuQlVGRkVSSU5HX01PREVfU0laRV9PTkxZCi0gICAgICAgICAgICAgICAgICAgIHx8IGluaXRpYWxCdWZmZXJpbmdNb2RlID09IEJ1ZmZlcmluZ1BhcmFtcy5CVUZGRVJJTkdfTU9ERV9USU1FX1RIRU5fU0laRSkgewotICAgICAgICAgICAgICAgIGNoZWNrTWFyayA9IGNoZWNrUGFyYW1zLmdldEluaXRpYWxCdWZmZXJpbmdXYXRlcm1hcmtLQigpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChpbml0aWFsQnVmZmVyaW5nTW9kZSA9PSBCdWZmZXJpbmdQYXJhbXMuQlVGRkVSSU5HX01PREVfVElNRV9PTkxZKSB7Ci0gICAgICAgICAgICAgICAgY2hlY2tNYXJrID0gY2hlY2tQYXJhbXMuZ2V0SW5pdGlhbEJ1ZmZlcmluZ1dhdGVybWFya01zKCk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBjaGVja01hcmsgPSBjaGVja1BhcmFtcy5nZXRJbml0aWFsTWFya01zKCk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIm1hcmtzIGRvIG5vdCBtYXRjaCIsIG5ld01hcmssIGNoZWNrTWFyayk7CiAKICAgICAgICAgICAgIC8vIFRPRE86IGFkZCBtb3JlIGR5bmFtaWMgY2hlY2tpbmcsIGUuZy4sIGJ1ZmZlcmluZyBzaGFsbCBub3QgZXhjZWVkIHByZS1zZXQgbWFyay4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9TdHViTWVkaWFCcm93c2VyU2VydmljZS5qYXZhIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL1N0dWJNZWRpYUJyb3dzZXJTZXJ2aWNlLmphdmEKaW5kZXggNzJlYzhhOS4uOTE5MGQxMCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL1N0dWJNZWRpYUJyb3dzZXJTZXJ2aWNlLmphdmEKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL1N0dWJNZWRpYUJyb3dzZXJTZXJ2aWNlLmphdmEKQEAgLTE5LDE1ICsxOSwxNiBAQAogaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFEZXNjcmlwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLmJyb3dzZS5NZWRpYUJyb3dzZXIuTWVkaWFJdGVtOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYVNlc3Npb247CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLk1lZGlhU2Vzc2lvbk1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLm1lZGlhLk1lZGlhQnJvd3NlclNlcnZpY2U7CiAKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OworCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotCiAvKioKICAqIFN0dWIgaW1wbGVtZW50YXRpb24gb2YgKEBsaW5rIGFuZHJvaWQuc2VydmljZS5tZWRpYS5NZWRpYUJyb3dzZXJTZXJ2aWNlfS4KICAqLwpAQCAtNDcsMTIgKzQ4LDE4IEBACiAKICAgICBzdGF0aWMgU3R1Yk1lZGlhQnJvd3NlclNlcnZpY2Ugc0luc3RhbmNlOwogCi0gICAgLyogcGFja2FnZSBwcml2YXRlICovIHN0YXRpYyBNZWRpYVNlc3Npb24gc1Nlc3Npb247CisgICAgc3RhdGljIE1lZGlhU2Vzc2lvbiBzU2Vzc2lvbjsKKyAgICBzdGF0aWMgTWVkaWFTZXNzaW9uTWFuYWdlci5SZW1vdGVVc2VySW5mbyBzQnJvd3NlckluZm87CisKICAgICBwcml2YXRlIEJ1bmRsZSBtRXh0cmFzOwogICAgIHByaXZhdGUgUmVzdWx0PExpc3Q8TWVkaWFJdGVtPj4gbVBlbmRpbmdMb2FkQ2hpbGRyZW5SZXN1bHQ7CiAgICAgcHJpdmF0ZSBSZXN1bHQ8TWVkaWFJdGVtPiBtUGVuZGluZ0xvYWRJdGVtUmVzdWx0OwogICAgIHByaXZhdGUgQnVuZGxlIG1QZW5kaW5nUm9vdEhpbnRzOwogCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNsZWFyQnJvd3NlckluZm8oKSB7CisgICAgICAgIHNCcm93c2VySW5mbyA9IG51bGw7CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25DcmVhdGUoKSB7CiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKCk7CkBAIC03MSw2ICs3OCw3IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgQnJvd3NlclJvb3Qgb25HZXRSb290KFN0cmluZyBjbGllbnRQYWNrYWdlTmFtZSwgaW50IGNsaWVudFVpZCwgQnVuZGxlIHJvb3RIaW50cykgeworICAgICAgICBzQnJvd3NlckluZm8gPSBnZXRDdXJyZW50QnJvd3NlckluZm8oKTsKICAgICAgICAgbUV4dHJhcyA9IG5ldyBCdW5kbGUoKTsKICAgICAgICAgbUV4dHJhcy5wdXRTdHJpbmcoRVhUUkFTX0tFWSwgRVhUUkFTX1ZBTFVFKTsKICAgICAgICAgcmV0dXJuIG5ldyBCcm93c2VyUm9vdChNRURJQV9JRF9ST09ULCBtRXh0cmFzKTsKQEAgLTg1LDEzICs5MywxNCBAQAogICAgICAgICAgICAgICAgIG1lZGlhSXRlbXMuYWRkKG5ldyBNZWRpYUl0ZW0obmV3IE1lZGlhRGVzY3JpcHRpb24uQnVpbGRlcigpCiAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0TWVkaWFJZChpZCkuc2V0RXh0cmFzKHJvb3RIaW50cykuYnVpbGQoKSwgTWVkaWFJdGVtLkZMQUdfQlJPV1NBQkxFKSk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBzQnJvd3NlckluZm8gPSBnZXRDdXJyZW50QnJvd3NlckluZm8oKTsKICAgICAgICAgICAgIHJlc3VsdC5zZW5kUmVzdWx0KG1lZGlhSXRlbXMpOwogICAgICAgICB9IGVsc2UgaWYgKE1FRElBX0lEX0NISUxEUkVOX0RFTEFZRUQuZXF1YWxzKHBhcmVudE1lZGlhSWQpKSB7CiAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0TnVsbChtUGVuZGluZ0xvYWRDaGlsZHJlblJlc3VsdCk7CiAgICAgICAgICAgICBtUGVuZGluZ0xvYWRDaGlsZHJlblJlc3VsdCA9IHJlc3VsdDsKICAgICAgICAgICAgIG1QZW5kaW5nUm9vdEhpbnRzID0gZ2V0QnJvd3NlclJvb3RIaW50cygpOwogICAgICAgICAgICAgcmVzdWx0LmRldGFjaCgpOwotICAgICAgICB9IGVsc2UgaWYgKE1FRElBX0lEX0lOVkFMSUQuZXF1YWxzKHBhcmVudE1lZGlhSWQpKXsKKyAgICAgICAgfSBlbHNlIGlmIChNRURJQV9JRF9JTlZBTElELmVxdWFscyhwYXJlbnRNZWRpYUlkKSkgewogICAgICAgICAgICAgcmVzdWx0LnNlbmRSZXN1bHQobnVsbCk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMTAsNiArMTE5LDcgQEAKICAgICAgICAgICAgICAgICByZXN1bHQuc2VuZFJlc3VsdChuZXcgTWVkaWFJdGVtKG5ldyBNZWRpYURlc2NyaXB0aW9uLkJ1aWxkZXIoKQogICAgICAgICAgICAgICAgICAgICAgICAgLnNldE1lZGlhSWQoaWQpLnNldEV4dHJhcyhnZXRCcm93c2VyUm9vdEhpbnRzKCkpLmJ1aWxkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhSXRlbS5GTEFHX0JST1dTQUJMRSkpOworICAgICAgICAgICAgICAgIHNCcm93c2VySW5mbyA9IGdldEN1cnJlbnRCcm93c2VySW5mbygpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL1Rlc3RNZWRpYTJEYXRhU291cmNlLmphdmEgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvVGVzdE1lZGlhMkRhdGFTb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmI1OWI1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL1Rlc3RNZWRpYTJEYXRhU291cmNlLmphdmEKQEAgLTAsMCArMSwxMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS5jdHM7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0RmlsZURlc2NyaXB0b3I7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5jdHMuVGVzdFV0aWxzLk1vbml0b3I7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYTJEYXRhU291cmNlOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisvKioKKyAqIEEgTWVkaWEyRGF0YVNvdXJjZSB0aGF0IHJlYWRzIGZyb20gYSBieXRlIGFycmF5IGZvciB1c2UgaW4gdGVzdHMuCisgKi8KK0BBcHBNb2RlRnVsbChyZWFzb24gPSAiVE9ETzogZXZhbHVhdGUgYW5kIHBvcnQgdG8gaW5zdGFudCIpCitwdWJsaWMgY2xhc3MgVGVzdE1lZGlhMkRhdGFTb3VyY2UgZXh0ZW5kcyBNZWRpYTJEYXRhU291cmNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlRlc3RNZWRpYTJEYXRhU291cmNlIjsKKworICAgIHByaXZhdGUgYnl0ZVtdIG1EYXRhOworCisgICAgcHJpdmF0ZSBib29sZWFuIG1UaHJvd0Zyb21SZWFkQXQ7CisgICAgcHJpdmF0ZSBib29sZWFuIG1UaHJvd0Zyb21HZXRTaXplOworICAgIHByaXZhdGUgSW50ZWdlciBtUmV0dXJuRnJvbVJlYWRBdDsKKyAgICBwcml2YXRlIExvbmcgbVJldHVybkZyb21HZXRTaXplOworICAgIHByaXZhdGUgYm9vbGVhbiBtSXNDbG9zZWQ7CisKKyAgICAvLyBSZWFkIGFuIGFzc2V0IGZkIGludG8gYSBuZXcgYnl0ZSBhcnJheSBkYXRhIHNvdXJjZS4gQ2xvc2VzIGFmZC4KKyAgICBwdWJsaWMgc3RhdGljIFRlc3RNZWRpYTJEYXRhU291cmNlIGZyb21Bc3NldEZkKEFzc2V0RmlsZURlc2NyaXB0b3IgYWZkKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBhZmQuY3JlYXRlSW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBzaXplID0gKGludCkgYWZkLmdldERlY2xhcmVkTGVuZ3RoKCk7CisgICAgICAgICAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlWyhpbnQpIHNpemVdOworICAgICAgICAgICAgaW50IHdyaXRlSW5kZXggPSAwOworICAgICAgICAgICAgaW50IG51bVJlYWQgPSAwOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIG51bVJlYWQgPSBpbi5yZWFkKGRhdGEsIHdyaXRlSW5kZXgsIHNpemUgLSB3cml0ZUluZGV4KTsKKyAgICAgICAgICAgICAgICB3cml0ZUluZGV4ICs9IG51bVJlYWQ7CisgICAgICAgICAgICB9IHdoaWxlIChudW1SZWFkID49IDApOworICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXN0TWVkaWEyRGF0YVNvdXJjZShkYXRhKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGFmZC5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFRlc3RNZWRpYTJEYXRhU291cmNlKGJ5dGVbXSBkYXRhKSB7CisgICAgICAgIG1EYXRhID0gZGF0YTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCByZWFkQXQobG9uZyBwb3NpdGlvbiwgYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IHNpemUpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAobVRocm93RnJvbVJlYWRBdCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJUZXN0IGV4Y2VwdGlvbiBmcm9tIHJlYWRBdCgpIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1SZXR1cm5Gcm9tUmVhZEF0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtUmV0dXJuRnJvbVJlYWRBdDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENsYW1wIHJlYWRzIHBhc3QgdGhlIGVuZCBvZiB0aGUgc291cmNlLgorICAgICAgICBpZiAocG9zaXRpb24gPj0gbURhdGEubGVuZ3RoKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7IC8vIC0xIGluZGljYXRlcyBFT0YKKyAgICAgICAgfQorICAgICAgICBpZiAocG9zaXRpb24gKyBzaXplID4gbURhdGEubGVuZ3RoKSB7CisgICAgICAgICAgICBzaXplIC09IChwb3NpdGlvbiArIHNpemUpIC0gbURhdGEubGVuZ3RoOworICAgICAgICB9CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobURhdGEsIChpbnQpcG9zaXRpb24sIGJ1ZmZlciwgb2Zmc2V0LCBzaXplKTsKKyAgICAgICAgcmV0dXJuIHNpemU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHN5bmNocm9uaXplZCBsb25nIGdldFNpemUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAobVRocm93RnJvbUdldFNpemUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiVGVzdCBleGNlcHRpb24gZnJvbSBnZXRTaXplKCkiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobVJldHVybkZyb21HZXRTaXplICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtUmV0dXJuRnJvbUdldFNpemU7CisgICAgICAgIH0KKworICAgICAgICBMb2cudihUQUcsICJnZXRTaXplOiAiICsgbURhdGEubGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIG1EYXRhLmxlbmd0aDsKKyAgICB9CisKKyAgICAvLyBOb3RlOiBpdCdzIGZpbmUgdG8ga2VlcCB1c2luZyB0aGlzIGRhdGEgc291cmNlIGFmdGVyIGNsb3NpbmcgaXQuCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNsb3NlKCkgeworICAgICAgICBMb2cudihUQUcsICJjbG9zZSgpIik7CisgICAgICAgIG1Jc0Nsb3NlZCA9IHRydWU7CisgICAgfQorCisgICAgLy8gV2hldGhlciBjbG9zZSgpIGhhcyBiZWVuIGNhbGxlZC4KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNDbG9zZWQoKSB7CisgICAgICAgIHJldHVybiBtSXNDbG9zZWQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGhyb3dGcm9tUmVhZEF0KCkgeworICAgICAgICBtVGhyb3dGcm9tUmVhZEF0ID0gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aHJvd0Zyb21HZXRTaXplKCkgeworICAgICAgICBtVGhyb3dGcm9tR2V0U2l6ZSA9IHRydWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmV0dXJuRnJvbVJlYWRBdChpbnQgbnVtUmVhZCkgeworICAgICAgICBtUmV0dXJuRnJvbVJlYWRBdCA9IG51bVJlYWQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmV0dXJuRnJvbUdldFNpemUobG9uZyBzaXplKSB7CisgICAgICAgIG1SZXR1cm5Gcm9tR2V0U2l6ZSA9IHNpemU7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvVGVzdE1lZGlhRGF0YVNvdXJjZS5qYXZhIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL1Rlc3RNZWRpYURhdGFTb3VyY2UuamF2YQppbmRleCBhMTA4NDBiLi5lNDEyMjM5IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvVGVzdE1lZGlhRGF0YVNvdXJjZS5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9UZXN0TWVkaWFEYXRhU291cmNlLmphdmEKQEAgLTE3LDggKzE3LDkgQEAKIHBhY2thZ2UgYW5kcm9pZC5tZWRpYS5jdHM7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0RmlsZURlc2NyaXB0b3I7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5jdHMuTWVkaWFQbGF5ZXJUZXN0QmFzZS5Nb25pdG9yOworaW1wb3J0IGFuZHJvaWQubWVkaWEuY3RzLlRlc3RVdGlscy5Nb25pdG9yOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFEYXRhU291cmNlOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCiBpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CkBAIC0yOCw2ICsyOSw3IEBACiAvKioKICAqIEEgTWVkaWFEYXRhU291cmNlIHRoYXQgcmVhZHMgZnJvbSBhIGJ5dGUgYXJyYXkgZm9yIHVzZSBpbiB0ZXN0cy4KICAqLworQEFwcE1vZGVGdWxsKHJlYXNvbiA9ICJUT0RPOiBldmFsdWF0ZSBhbmQgcG9ydCB0byBpbnN0YW50IikKIHB1YmxpYyBjbGFzcyBUZXN0TWVkaWFEYXRhU291cmNlIGV4dGVuZHMgTWVkaWFEYXRhU291cmNlIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlRlc3RNZWRpYURhdGFTb3VyY2UiOwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvVGVzdFV0aWxzLmphdmEgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvVGVzdFV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY0YTg1NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9UZXN0VXRpbHMuamF2YQpAQCAtMCwwICsxLDEyMSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLmN0czsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQubWVkaWEuRGF0YVNvdXJjZURlc2M7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLk1lZGlhU2Vzc2lvbk1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOworCitpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCisvKioKKyAqIFV0aWxpdGllcyBmb3IgdGVzdHMuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBUZXN0VXRpbHMgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXQUlUX1RJTUVfTVMgPSAxMDAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXQUlUX1NFUlZJQ0VfVElNRV9NUyA9IDUwMDA7CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlcyBjb250ZW50cyBvZiB0d28gYnVuZGxlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhIGEgYnVuZGxlCisgICAgICogQHBhcmFtIGIgYW5vdGhlciBidW5kbGUKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0d28gYnVuZGxlcyBhcmUgdGhlIHNhbWUuIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLiBUaGlzIG1heSBiZQorICAgICAqICAgICBpbmNvcnJlY3QgaWYgYW55IGJ1bmRsZSBjb250YWlucyBhIGJ1bmRsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXF1YWxzKEJ1bmRsZSBhLCBCdW5kbGUgYikgeworICAgICAgICBpZiAoYSA9PSBiKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICghYS5rZXlTZXQoKS5jb250YWluc0FsbChiLmtleVNldCgpKQorICAgICAgICAgICAgICAgIHx8ICFiLmtleVNldCgpLmNvbnRhaW5zQWxsKGEua2V5U2V0KCkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChTdHJpbmcga2V5IDogYS5rZXlTZXQoKSkgeworICAgICAgICAgICAgaWYgKCFPYmplY3RzLmVxdWFscyhhLmdldChrZXkpLCBiLmdldChrZXkpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1vbml0b3IgeworICAgICAgICBwcml2YXRlIGludCBtTnVtU2lnbmFsOworCisgICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZXNldCgpIHsKKyAgICAgICAgICAgIG1OdW1TaWduYWwgPSAwOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNpZ25hbCgpIHsKKyAgICAgICAgICAgIG1OdW1TaWduYWwrKzsKKyAgICAgICAgICAgIG5vdGlmeUFsbCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHdhaXRGb3JTaWduYWwoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIHdhaXRGb3JDb3VudGVkU2lnbmFscygxKSA+IDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCB3YWl0Rm9yQ291bnRlZFNpZ25hbHMoaW50IHRhcmdldENvdW50KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICAgICAgd2hpbGUgKG1OdW1TaWduYWwgPCB0YXJnZXRDb3VudCkgeworICAgICAgICAgICAgICAgIHdhaXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtTnVtU2lnbmFsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHdhaXRGb3JTaWduYWwobG9uZyB0aW1lb3V0TXMpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gd2FpdEZvckNvdW50ZWRTaWduYWxzKDEsIHRpbWVvdXRNcykgPiAwOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgd2FpdEZvckNvdW50ZWRTaWduYWxzKGludCB0YXJnZXRDb3VudCwgbG9uZyB0aW1lb3V0TXMpCisgICAgICAgICAgICAgICAgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmICh0aW1lb3V0TXMgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiB3YWl0Rm9yQ291bnRlZFNpZ25hbHModGFyZ2V0Q291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9uZyBkZWFkbGluZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgdGltZW91dE1zOworICAgICAgICAgICAgd2hpbGUgKG1OdW1TaWduYWwgPCB0YXJnZXRDb3VudCkgeworICAgICAgICAgICAgICAgIGxvbmcgZGVsYXkgPSBkZWFkbGluZSAtIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgICAgIGlmIChkZWxheSA8PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3YWl0KGRlbGF5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtTnVtU2lnbmFsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzU2lnbmFsbGVkKCkgeworICAgICAgICAgICAgcmV0dXJuIG1OdW1TaWduYWwgPj0gMTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldE51bVNpZ25hbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTnVtU2lnbmFsOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL1RvbmVHZW5lcmF0b3JUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvVG9uZUdlbmVyYXRvclRlc3QuamF2YQppbmRleCAyM2VlMzljLi45MWZmMmY4IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvVG9uZUdlbmVyYXRvclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvVG9uZUdlbmVyYXRvclRlc3QuamF2YQpAQCAtMTgsOCArMTgsMTAgQEAKIAogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuVG9uZUdlbmVyYXRvcjsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKIAorQEFwcE1vZGVGdWxsKHJlYXNvbiA9ICJUT0RPOiBldmFsdWF0ZSBhbmQgcG9ydCB0byBpbnN0YW50IikKIHB1YmxpYyBjbGFzcyBUb25lR2VuZXJhdG9yVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0U3luY0dlbmVyYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvVXRpbHMuamF2YSBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9VdGlscy5qYXZhCmluZGV4IDIxMWFhNGUuLjc1M2RhNGUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9VdGlscy5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9VdGlscy5qYXZhCkBAIC0xOSwxNiArMTksMTQgQEAKIGltcG9ydCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb247CiBpbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmFwcC5VaUF1dG9tYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUGxheWJhY2tDb25maWd1cmF0aW9uOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLk1lZGlhU2Vzc2lvbk1hbmFnZXIuUmVtb3RlVXNlckluZm87CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlclRocmVhZDsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7Ci1pbXBvcnQgY29tLmdvb2dsZS5hbmRyb2lkLmNvbGxlY3QuTGlzdHM7CiBpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwpAQCAtNDEsNyArMzksNyBAQAogCiBwdWJsaWMgY2xhc3MgVXRpbHMgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQ3RzTWVkaWFUZXN0VXRpbCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRFU1RfVElNSU5HX1RPTEVSQU5DRV9NUyA9IDUwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBURVNUX1RJTUlOR19UT0xFUkFOQ0VfTVMgPSA1MDA7CiAKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgZW5hYmxlQXBwT3BzKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIG9wZXJhdGlvbiwKICAgICAgICAgICAgIEluc3RydW1lbnRhdGlvbiBpbnN0cnVtZW50YXRpb24pIHsKQEAgLTExMyw2ICsxMTEsMTcgQEAKICAgICAgICAgICAgICAgICBubS5pc05vdGlmaWNhdGlvblBvbGljeUFjY2Vzc0dyYW50ZWQoKSk7CiAgICAgfQogCisgICAgc3RhdGljIGJvb2xlYW4gY29tcGFyZVJlbW90ZVVzZXJJbmZvKFJlbW90ZVVzZXJJbmZvIGEsIFJlbW90ZVVzZXJJbmZvIGIpIHsKKyAgICAgICAgaWYgKGEgPT0gbnVsbCAmJiBiID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYS5nZXRQYWNrYWdlTmFtZSgpLmVxdWFscyhiLmdldFBhY2thZ2VOYW1lKCkpCisgICAgICAgICAgICAgICAgJiYgYS5nZXRQaWQoKSA9PSBiLmdldFBpZCgpCisgICAgICAgICAgICAgICAgJiYgYS5nZXRVaWQoKSA9PSBiLmdldFVpZCgpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIEFzc2VydCB0aGF0IGEgbWVkaWEgcGxheWJhY2sgaXMgc3RhcnRlZCBhbmQgYW4gYWN0aXZlIHtAbGluayBBdWRpb1BsYXliYWNrQ29uZmlndXJhdGlvbn0KICAgICAgKiBpcyBjcmVhdGVkIG9uY2UuIFRoZSBwbGF5YmFjayB3aWxsIGJlIHN0b3BwZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhhdC4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9WaWRlb0RlY29kZXJQZXJmVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL1ZpZGVvRGVjb2RlclBlcmZUZXN0LmphdmEKaW5kZXggYzcxMDFiNS4uY2U5NzM3OSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL1ZpZGVvRGVjb2RlclBlcmZUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL1ZpZGVvRGVjb2RlclBlcmZUZXN0LmphdmEKQEAgLTI1LDYgKzI1LDcgQEAKIGltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29kZWNJbmZvLlZpZGVvQ2FwYWJpbGl0aWVzOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFFeHRyYWN0b3I7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUZvcm1hdDsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuUGFpcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZTsKQEAgLTM5LDYgKzQwLDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwogCitAQXBwTW9kZUZ1bGwocmVhc29uID0gIlRPRE86IGV2YWx1YXRlIGFuZCBwb3J0IHRvIGluc3RhbnQiKQogcHVibGljIGNsYXNzIFZpZGVvRGVjb2RlclBlcmZUZXN0IGV4dGVuZHMgTWVkaWFQbGF5ZXJUZXN0QmFzZSB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJWaWRlb0RlY29kZXJQZXJmVGVzdCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUE9SVF9MT0dfTkFNRSA9ICJDdHNNZWRpYVRlc3RDYXNlcyI7CkBAIC0zMzEsOCArMzMzLDkgQEAKICAgICAgICAgUi5yYXcuYmJiX3MxXzMyMHgyNDBfbXA0X2gyNjRfbXAyXzgwMGticHNfMzBmcHNfYWFjX2xjXzVjaF8yNDBrYnBzXzQ0MTAwaHosCiAgICAgfTsKIAotICAgIHB1YmxpYyB2b2lkIHRlc3RBdmNDb3VudDAzMjB4MDI0MCgpIHRocm93cyBFeGNlcHRpb24geyBjb3VudChzQXZjTWVkaWEwMzIweDAyNDAsIDEsIDQpOyB9CisgICAgcHVibGljIHZvaWQgdGVzdEF2Y0NvdW50MDMyMHgwMjQwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IGNvdW50KHNBdmNNZWRpYTAzMjB4MDI0MCwgMiwgNCk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0QXZjR29vZzBQZXJmMDMyMHgwMjQwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoc0F2Y01lZGlhMDMyMHgwMjQwLCBHT09HLCAwKTsgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RBdmNHb29nMVBlcmYwMzIweDAyNDAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihzQXZjTWVkaWEwMzIweDAyNDAsIEdPT0csIDEpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdEF2Y090aGVyMFBlcmYwMzIweDAyNDAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihzQXZjTWVkaWEwMzIweDAyNDAsIE9USEVSLCAwKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RBdmNPdGhlcjFQZXJmMDMyMHgwMjQwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoc0F2Y01lZGlhMDMyMHgwMjQwLCBPVEhFUiwgMSk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0QXZjT3RoZXIyUGVyZjAzMjB4MDI0MCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKHNBdmNNZWRpYTAzMjB4MDI0MCwgT1RIRVIsIDIpOyB9CkBAIC0zNDIsOCArMzQ1LDkgQEAKICAgICAgICAgUi5yYXcuYmJiX3MxXzcyMHg0ODBfbXA0X2gyNjRfbXAzXzJtYnBzXzMwZnBzX2FhY19sY181Y2hfMzIwa2Jwc180ODAwMGh6LAogICAgIH07CiAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXZjQ291bnQwNzIweDA0ODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgY291bnQoc0F2Y01lZGlhMDcyMHgwNDgwLCAxLCA0KTsgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RBdmNDb3VudDA3MjB4MDQ4MCgpIHRocm93cyBFeGNlcHRpb24geyBjb3VudChzQXZjTWVkaWEwNzIweDA0ODAsIDIsIDQpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdEF2Y0dvb2cwUGVyZjA3MjB4MDQ4MCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKHNBdmNNZWRpYTA3MjB4MDQ4MCwgR09PRywgMCk7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXZjR29vZzFQZXJmMDcyMHgwNDgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoc0F2Y01lZGlhMDcyMHgwNDgwLCBHT09HLCAxKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RBdmNPdGhlcjBQZXJmMDcyMHgwNDgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoc0F2Y01lZGlhMDcyMHgwNDgwLCBPVEhFUiwgMCk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0QXZjT3RoZXIxUGVyZjA3MjB4MDQ4MCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKHNBdmNNZWRpYTA3MjB4MDQ4MCwgT1RIRVIsIDEpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdEF2Y090aGVyMlBlcmYwNzIweDA0ODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihzQXZjTWVkaWEwNzIweDA0ODAsIE9USEVSLCAyKTsgfQpAQCAtMzU2LDggKzM2MCw5IEBACiAgICAgICAgIFIucmF3LmJiYl9zM18xMjgweDcyMF9tcDRfaDI2NF9tcDMyXzhtYnBzXzYwZnBzX2FhY19oZV92Ml82Y2hfMTQ0a2Jwc180NDEwMGh6LAogICAgIH07CiAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXZjQ291bnQxMjgweDA3MjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgY291bnQoc0F2Y01lZGlhMTI4MHgwNzIwLCAxLCA0KTsgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RBdmNDb3VudDEyODB4MDcyMCgpIHRocm93cyBFeGNlcHRpb24geyBjb3VudChzQXZjTWVkaWExMjgweDA3MjAsIDIsIDQpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdEF2Y0dvb2cwUGVyZjEyODB4MDcyMCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKHNBdmNNZWRpYTEyODB4MDcyMCwgR09PRywgMCk7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXZjR29vZzFQZXJmMTI4MHgwNzIwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoc0F2Y01lZGlhMTI4MHgwNzIwLCBHT09HLCAxKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RBdmNPdGhlcjBQZXJmMTI4MHgwNzIwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoc0F2Y01lZGlhMTI4MHgwNzIwLCBPVEhFUiwgMCk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0QXZjT3RoZXIxUGVyZjEyODB4MDcyMCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKHNBdmNNZWRpYTEyODB4MDcyMCwgT1RIRVIsIDEpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdEF2Y090aGVyMlBlcmYxMjgweDA3MjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihzQXZjTWVkaWExMjgweDA3MjAsIE9USEVSLCAyKTsgfQpAQCAtMzcxLDggKzM3Niw5IEBACiAgICAgICAgIFIucmF3LmJiYl9zMl8xOTIweDEwODBfbXA0X2gyNjRfbXA0Ml8yMG1icHNfNjBmcHNfYWFjX2hlX3YyXzVjaF8xNjBrYnBzXzQ4MDAwaHosCiAgICAgfTsKIAotICAgIHB1YmxpYyB2b2lkIHRlc3RBdmNDb3VudDE5MjB4MTA4MCgpIHRocm93cyBFeGNlcHRpb24geyBjb3VudChzQXZjTWVkaWExOTIweDEwODAsIDEsIDQpOyB9CisgICAgcHVibGljIHZvaWQgdGVzdEF2Y0NvdW50MTkyMHgxMDgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IGNvdW50KHNBdmNNZWRpYTE5MjB4MTA4MCwgMiwgNCk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0QXZjR29vZzBQZXJmMTkyMHgxMDgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoc0F2Y01lZGlhMTkyMHgxMDgwLCBHT09HLCAwKTsgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RBdmNHb29nMVBlcmYxOTIweDEwODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihzQXZjTWVkaWExOTIweDEwODAsIEdPT0csIDEpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdEF2Y090aGVyMFBlcmYxOTIweDEwODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihzQXZjTWVkaWExOTIweDEwODAsIE9USEVSLCAwKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RBdmNPdGhlcjFQZXJmMTkyMHgxMDgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoc0F2Y01lZGlhMTkyMHgxMDgwLCBPVEhFUiwgMSk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0QXZjT3RoZXIyUGVyZjE5MjB4MTA4MCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKHNBdmNNZWRpYTE5MjB4MTA4MCwgT1RIRVIsIDIpOyB9CkBAIC0zODQsOCArMzkwLDkgQEAKICAgICAgICAgUi5yYXcudmlkZW9fMTc2eDE0NF8zZ3BfaDI2M18zMDBrYnBzXzEyZnBzX2FhY19zdGVyZW9fMTI4a2Jwc18yMjA1MGh6LAogICAgIH07CiAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SDI2M0NvdW50MDE3NngwMTQ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7IGNvdW50KHNIMjYzTWVkaWEwMTc2eDAxNDQsIDEsIDIpOyB9CisgICAgcHVibGljIHZvaWQgdGVzdEgyNjNDb3VudDAxNzZ4MDE0NCgpIHRocm93cyBFeGNlcHRpb24geyBjb3VudChzSDI2M01lZGlhMDE3NngwMTQ0LCAyLCAyKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RIMjYzR29vZzBQZXJmMDE3NngwMTQ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoc0gyNjNNZWRpYTAxNzZ4MDE0NCwgR09PRywgMCk7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SDI2M0dvb2cxUGVyZjAxNzZ4MDE0NCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKHNIMjYzTWVkaWEwMTc2eDAxNDQsIEdPT0csIDEpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdEgyNjNPdGhlcjBQZXJmMDE3NngwMTQ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoc0gyNjNNZWRpYTAxNzZ4MDE0NCwgT1RIRVIsIDApOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdEgyNjNPdGhlcjFQZXJmMDE3NngwMTQ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoc0gyNjNNZWRpYTAxNzZ4MDE0NCwgT1RIRVIsIDEpOyB9CiAKQEAgLTM5Myw4ICs0MDAsOSBAQAogICAgICAgICBSLnJhdy52aWRlb18zNTJ4Mjg4XzNncF9oMjYzXzMwMGticHNfMTJmcHNfYWFjX3N0ZXJlb18xMjhrYnBzXzIyMDUwaHosCiAgICAgfTsKIAotICAgIHB1YmxpYyB2b2lkIHRlc3RIMjYzQ291bnQwMzUyeDAyODgoKSB0aHJvd3MgRXhjZXB0aW9uIHsgY291bnQoc0gyNjNNZWRpYTAzNTJ4MDI4OCwgMSwgMik7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SDI2M0NvdW50MDM1MngwMjg4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7IGNvdW50KHNIMjYzTWVkaWEwMzUyeDAyODgsIDIsIDIpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdEgyNjNHb29nMFBlcmYwMzUyeDAyODgoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihzSDI2M01lZGlhMDM1MngwMjg4LCBHT09HLCAwKTsgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RIMjYzR29vZzFQZXJmMDM1MngwMjg4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoc0gyNjNNZWRpYTAzNTJ4MDI4OCwgR09PRywgMSk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0SDI2M090aGVyMFBlcmYwMzUyeDAyODgoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihzSDI2M01lZGlhMDM1MngwMjg4LCBPVEhFUiwgMCk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0SDI2M090aGVyMVBlcmYwMzUyeDAyODgoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihzSDI2M01lZGlhMDM1MngwMjg4LCBPVEhFUiwgMSk7IH0KIApAQCAtNDA4LDggKzQxNiw5IEBACiAgICAgICAgIFIucmF3LmJiYl9zMV8zNTJ4Mjg4X21wNF9oZXZjX21wMl82MDBrYnBzXzMwZnBzX2FhY19oZV9zdGVyZW9fOTZrYnBzXzQ4MDAwaHosCiAgICAgfTsKIAotICAgIHB1YmxpYyB2b2lkIHRlc3RIZXZjQ291bnQwMzUyeDAyODgoKSB0aHJvd3MgRXhjZXB0aW9uIHsgY291bnQoc0hldmNNZWRpYTAzNTJ4MDI4OCwgMSwgNCk7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGV2Y0NvdW50MDM1MngwMjg4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7IGNvdW50KHNIZXZjTWVkaWEwMzUyeDAyODgsIDIsIDQpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdEhldmNHb29nMFBlcmYwMzUyeDAyODgoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihzSGV2Y01lZGlhMDM1MngwMjg4LCBHT09HLCAwKTsgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RIZXZjR29vZzFQZXJmMDM1MngwMjg4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoc0hldmNNZWRpYTAzNTJ4MDI4OCwgR09PRywgMSk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0SGV2Y090aGVyMFBlcmYwMzUyeDAyODgoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihzSGV2Y01lZGlhMDM1MngwMjg4LCBPVEhFUiwgMCk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0SGV2Y090aGVyMVBlcmYwMzUyeDAyODgoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihzSGV2Y01lZGlhMDM1MngwMjg4LCBPVEhFUiwgMSk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0SGV2Y090aGVyMlBlcmYwMzUyeDAyODgoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihzSGV2Y01lZGlhMDM1MngwMjg4LCBPVEhFUiwgMik7IH0KQEAgLTQxOSw4ICs0MjgsOSBAQAogICAgICAgICBSLnJhdy5iYmJfczFfNjQweDM2MF9tcDRfaGV2Y19tcDIxXzE2MDBrYnBzXzMwZnBzX2FhY19oZV82Y2hfMjg4a2Jwc180NDEwMGh6LAogICAgIH07CiAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGV2Y0NvdW50MDY0MHgwMzYwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IGNvdW50KHNIZXZjTWVkaWEwNjQweDAzNjAsIDEsIDQpOyB9CisgICAgcHVibGljIHZvaWQgdGVzdEhldmNDb3VudDA2NDB4MDM2MCgpIHRocm93cyBFeGNlcHRpb24geyBjb3VudChzSGV2Y01lZGlhMDY0MHgwMzYwLCAyLCA0KTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RIZXZjR29vZzBQZXJmMDY0MHgwMzYwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoc0hldmNNZWRpYTA2NDB4MDM2MCwgR09PRywgMCk7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGV2Y0dvb2cxUGVyZjA2NDB4MDM2MCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKHNIZXZjTWVkaWEwNjQweDAzNjAsIEdPT0csIDEpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdEhldmNPdGhlcjBQZXJmMDY0MHgwMzYwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoc0hldmNNZWRpYTA2NDB4MDM2MCwgT1RIRVIsIDApOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdEhldmNPdGhlcjFQZXJmMDY0MHgwMzYwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoc0hldmNNZWRpYTA2NDB4MDM2MCwgT1RIRVIsIDEpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdEhldmNPdGhlcjJQZXJmMDY0MHgwMzYwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoc0hldmNNZWRpYTA2NDB4MDM2MCwgT1RIRVIsIDIpOyB9CkBAIC00MzAsOCArNDQwLDkgQEAKICAgICAgICAgUi5yYXcuYmJiX3MxXzcyMHg0ODBfbXA0X2hldmNfbXAzXzE2MDBrYnBzXzMwZnBzX2FhY19oZV82Y2hfMjQwa2Jwc180ODAwMGh6LAogICAgIH07CiAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGV2Y0NvdW50MDcyMHgwNDgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IGNvdW50KHNIZXZjTWVkaWEwNzIweDA0ODAsIDEsIDQpOyB9CisgICAgcHVibGljIHZvaWQgdGVzdEhldmNDb3VudDA3MjB4MDQ4MCgpIHRocm93cyBFeGNlcHRpb24geyBjb3VudChzSGV2Y01lZGlhMDcyMHgwNDgwLCAyLCA0KTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RIZXZjR29vZzBQZXJmMDcyMHgwNDgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoc0hldmNNZWRpYTA3MjB4MDQ4MCwgR09PRywgMCk7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGV2Y0dvb2cxUGVyZjA3MjB4MDQ4MCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKHNIZXZjTWVkaWEwNzIweDA0ODAsIEdPT0csIDEpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdEhldmNPdGhlcjBQZXJmMDcyMHgwNDgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoc0hldmNNZWRpYTA3MjB4MDQ4MCwgT1RIRVIsIDApOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdEhldmNPdGhlcjFQZXJmMDcyMHgwNDgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoc0hldmNNZWRpYTA3MjB4MDQ4MCwgT1RIRVIsIDEpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdEhldmNPdGhlcjJQZXJmMDcyMHgwNDgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoc0hldmNNZWRpYTA3MjB4MDQ4MCwgT1RIRVIsIDIpOyB9CkBAIC00NDEsOCArNDUyLDkgQEAKICAgICAgICAgUi5yYXcuYmJiX3M0XzEyODB4NzIwX21wNF9oZXZjX21wMzFfNG1icHNfMzBmcHNfYWFjX2hlX3N0ZXJlb184MGticHNfMzIwMDBoeiwKICAgICB9OwogCi0gICAgcHVibGljIHZvaWQgdGVzdEhldmNDb3VudDEyODB4MDcyMCgpIHRocm93cyBFeGNlcHRpb24geyBjb3VudChzSGV2Y01lZGlhMTI4MHgwNzIwLCAxLCA0KTsgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RIZXZjQ291bnQxMjgweDA3MjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgY291bnQoc0hldmNNZWRpYTEyODB4MDcyMCwgMiwgNCk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0SGV2Y0dvb2cwUGVyZjEyODB4MDcyMCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKHNIZXZjTWVkaWExMjgweDA3MjAsIEdPT0csIDApOyB9CisgICAgcHVibGljIHZvaWQgdGVzdEhldmNHb29nMVBlcmYxMjgweDA3MjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihzSGV2Y01lZGlhMTI4MHgwNzIwLCBHT09HLCAxKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RIZXZjT3RoZXIwUGVyZjEyODB4MDcyMCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKHNIZXZjTWVkaWExMjgweDA3MjAsIE9USEVSLCAwKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RIZXZjT3RoZXIxUGVyZjEyODB4MDcyMCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKHNIZXZjTWVkaWExMjgweDA3MjAsIE9USEVSLCAxKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RIZXZjT3RoZXIyUGVyZjEyODB4MDcyMCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKHNIZXZjTWVkaWExMjgweDA3MjAsIE9USEVSLCAyKTsgfQpAQCAtNDUyLDggKzQ2NCw5IEBACiAgICAgICAgIFIucmF3LmJiYl9zMl8xOTIweDEwODBfbXA0X2hldmNfbXA0MV8xMG1icHNfNjBmcHNfYWFjX2xjXzZjaF8zODRrYnBzXzIyMDUwaHosCiAgICAgfTsKIAotICAgIHB1YmxpYyB2b2lkIHRlc3RIZXZjQ291bnQxOTIweDEwODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgY291bnQoc0hldmNNZWRpYTE5MjB4MTA4MCwgMSwgNCk7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGV2Y0NvdW50MTkyMHgxMDgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IGNvdW50KHNIZXZjTWVkaWExOTIweDEwODAsIDIsIDQpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdEhldmNHb29nMFBlcmYxOTIweDEwODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihzSGV2Y01lZGlhMTkyMHgxMDgwLCBHT09HLCAwKTsgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RIZXZjR29vZzFQZXJmMTkyMHgxMDgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoc0hldmNNZWRpYTE5MjB4MTA4MCwgR09PRywgMSk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0SGV2Y090aGVyMFBlcmYxOTIweDEwODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihzSGV2Y01lZGlhMTkyMHgxMDgwLCBPVEhFUiwgMCk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0SGV2Y090aGVyMVBlcmYxOTIweDEwODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihzSGV2Y01lZGlhMTkyMHgxMDgwLCBPVEhFUiwgMSk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0SGV2Y090aGVyMlBlcmYxOTIweDEwODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihzSGV2Y01lZGlhMTkyMHgxMDgwLCBPVEhFUiwgMik7IH0KQEAgLTQ2NSw4ICs0NzgsOSBAQAogICAgICAgICBSLnJhdy5iYmJfczJfMzg0MHgyMTYwX21wNF9oZXZjX21wNTFfMjBtYnBzXzYwZnBzX2FhY19sY182Y2hfMzg0a2Jwc18zMjAwMGh6LAogICAgIH07CiAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGV2Y0NvdW50Mzg0MHgyMTYwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IGNvdW50KHNIZXZjTWVkaWEzODQweDIxNjAsIDEsIDQpOyB9CisgICAgcHVibGljIHZvaWQgdGVzdEhldmNDb3VudDM4NDB4MjE2MCgpIHRocm93cyBFeGNlcHRpb24geyBjb3VudChzSGV2Y01lZGlhMzg0MHgyMTYwLCAyLCA0KTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RIZXZjR29vZzBQZXJmMzg0MHgyMTYwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoc0hldmNNZWRpYTM4NDB4MjE2MCwgR09PRywgMCk7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGV2Y0dvb2cxUGVyZjM4NDB4MjE2MCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKHNIZXZjTWVkaWEzODQweDIxNjAsIEdPT0csIDEpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdEhldmNPdGhlcjBQZXJmMzg0MHgyMTYwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoc0hldmNNZWRpYTM4NDB4MjE2MCwgT1RIRVIsIDApOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdEhldmNPdGhlcjFQZXJmMzg0MHgyMTYwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoc0hldmNNZWRpYTM4NDB4MjE2MCwgT1RIRVIsIDEpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdEhldmNPdGhlcjJQZXJmMzg0MHgyMTYwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoc0hldmNNZWRpYTM4NDB4MjE2MCwgT1RIRVIsIDIpOyB9CkBAIC00OTAsOCArNTA0LDkgQEAKICAgICAgICAgUi5yYXcudmlkZW9fMTc2eDE0NF9tcDRfbXBlZzRfMzAwa2Jwc18yNWZwc19hYWNfc3RlcmVvXzEyOGticHNfNDQxMDBoeiwKICAgICB9OwogCi0gICAgcHVibGljIHZvaWQgdGVzdE1wZWc0Q291bnQwMTc2eDAxNDQoKSB0aHJvd3MgRXhjZXB0aW9uIHsgY291bnQoc01wZWc0TWVkaWEwMTc2eDAxNDQsIDEsIDQpOyB9CisgICAgcHVibGljIHZvaWQgdGVzdE1wZWc0Q291bnQwMTc2eDAxNDQoKSB0aHJvd3MgRXhjZXB0aW9uIHsgY291bnQoc01wZWc0TWVkaWEwMTc2eDAxNDQsIDIsIDQpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdE1wZWc0R29vZzBQZXJmMDE3NngwMTQ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoc01wZWc0TWVkaWEwMTc2eDAxNDQsIEdPT0csIDApOyB9CisgICAgcHVibGljIHZvaWQgdGVzdE1wZWc0R29vZzFQZXJmMDE3NngwMTQ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoc01wZWc0TWVkaWEwMTc2eDAxNDQsIEdPT0csIDEpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdE1wZWc0T3RoZXIwUGVyZjAxNzZ4MDE0NCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKHNNcGVnNE1lZGlhMDE3NngwMTQ0LCBPVEhFUiwgMCk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0TXBlZzRPdGhlcjFQZXJmMDE3NngwMTQ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoc01wZWc0TWVkaWEwMTc2eDAxNDQsIE9USEVSLCAxKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RNcGVnNE90aGVyMlBlcmYwMTc2eDAxNDQoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihzTXBlZzRNZWRpYTAxNzZ4MDE0NCwgT1RIRVIsIDIpOyB9CkBAIC01MDEsOCArNTE2LDkgQEAKICAgICAgICAgUi5yYXcudmlkZW9fNDgweDM2MF9tcDRfbXBlZzRfODYwa2Jwc18yNWZwc19hYWNfc3RlcmVvXzEyOGticHNfNDQxMDBoeiwKICAgICB9OwogCi0gICAgcHVibGljIHZvaWQgdGVzdE1wZWc0Q291bnQwNDgweDAzNjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgY291bnQoc01wZWc0TWVkaWEwNDgweDAzNjAsIDEsIDQpOyB9CisgICAgcHVibGljIHZvaWQgdGVzdE1wZWc0Q291bnQwNDgweDAzNjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgY291bnQoc01wZWc0TWVkaWEwNDgweDAzNjAsIDIsIDQpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdE1wZWc0R29vZzBQZXJmMDQ4MHgwMzYwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoc01wZWc0TWVkaWEwNDgweDAzNjAsIEdPT0csIDApOyB9CisgICAgcHVibGljIHZvaWQgdGVzdE1wZWc0R29vZzFQZXJmMDQ4MHgwMzYwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoc01wZWc0TWVkaWEwNDgweDAzNjAsIEdPT0csIDEpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdE1wZWc0T3RoZXIwUGVyZjA0ODB4MDM2MCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKHNNcGVnNE1lZGlhMDQ4MHgwMzYwLCBPVEhFUiwgMCk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0TXBlZzRPdGhlcjFQZXJmMDQ4MHgwMzYwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoc01wZWc0TWVkaWEwNDgweDAzNjAsIE9USEVSLCAxKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RNcGVnNE90aGVyMlBlcmYwNDgweDAzNjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihzTXBlZzRNZWRpYTA0ODB4MDM2MCwgT1RIRVIsIDIpOyB9CkBAIC01MTQsOCArNTMwLDkgQEAKICAgICAgICAgUi5yYXcudmlkZW9fMTI4MHg3MjBfbXA0X21wZWc0XzEwMDBrYnBzXzI1ZnBzX2FhY19zdGVyZW9fMTI4a2Jwc180NDEwMGh6LAogICAgIH07CiAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXBlZzRDb3VudDEyODB4MDcyMCgpIHRocm93cyBFeGNlcHRpb24geyBjb3VudChzTXBlZzRNZWRpYTEyODB4MDcyMCwgMSwgNCk7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXBlZzRDb3VudDEyODB4MDcyMCgpIHRocm93cyBFeGNlcHRpb24geyBjb3VudChzTXBlZzRNZWRpYTEyODB4MDcyMCwgMiwgNCk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0TXBlZzRHb29nMFBlcmYxMjgweDA3MjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihzTXBlZzRNZWRpYTEyODB4MDcyMCwgR09PRywgMCk7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXBlZzRHb29nMVBlcmYxMjgweDA3MjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihzTXBlZzRNZWRpYTEyODB4MDcyMCwgR09PRywgMSk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0TXBlZzRPdGhlcjBQZXJmMTI4MHgwNzIwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoc01wZWc0TWVkaWExMjgweDA3MjAsIE9USEVSLCAwKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RNcGVnNE90aGVyMVBlcmYxMjgweDA3MjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihzTXBlZzRNZWRpYTEyODB4MDcyMCwgT1RIRVIsIDEpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdE1wZWc0T3RoZXIyUGVyZjEyODB4MDcyMCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKHNNcGVnNE1lZGlhMTI4MHgwNzIwLCBPVEhFUiwgMik7IH0KQEAgLTUyNyw4ICs1NDQsOSBAQAogICAgICAgICBSLnJhdy5iYmJfczFfMzIweDE4MF93ZWJtX3ZwOF84MDBrYnBzXzMwZnBzX29wdXNfNWNoXzMyMGticHNfNDgwMDBoeiwKICAgICB9OwogCi0gICAgcHVibGljIHZvaWQgdGVzdFZwOENvdW50MDMyMHgwMTgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IGNvdW50KHNWcDhNZWRpYTAzMjB4MDE4MCwgMSwgMik7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VnA4Q291bnQwMzIweDAxODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgY291bnQoc1ZwOE1lZGlhMDMyMHgwMTgwLCAyLCAyKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RWcDhHb29nMFBlcmYwMzIweDAxODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihzVnA4TWVkaWEwMzIweDAxODAsIEdPT0csIDApOyB9CisgICAgcHVibGljIHZvaWQgdGVzdFZwOEdvb2cxUGVyZjAzMjB4MDE4MCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKHNWcDhNZWRpYTAzMjB4MDE4MCwgR09PRywgMSk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0VnA4T3RoZXIwUGVyZjAzMjB4MDE4MCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKHNWcDhNZWRpYTAzMjB4MDE4MCwgT1RIRVIsIDApOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdFZwOE90aGVyMVBlcmYwMzIweDAxODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihzVnA4TWVkaWEwMzIweDAxODAsIE9USEVSLCAxKTsgfQogCkBAIC01MzYsOCArNTU0LDkgQEAKICAgICAgICAgUi5yYXcuYmJiX3MxXzY0MHgzNjBfd2VibV92cDhfMm1icHNfMzBmcHNfdm9yYmlzXzVjaF8zMjBrYnBzXzQ4MDAwaHosCiAgICAgfTsKIAotICAgIHB1YmxpYyB2b2lkIHRlc3RWcDhDb3VudDA2NDB4MDM2MCgpIHRocm93cyBFeGNlcHRpb24geyBjb3VudChzVnA4TWVkaWEwNjQweDAzNjAsIDEsIDIpOyB9CisgICAgcHVibGljIHZvaWQgdGVzdFZwOENvdW50MDY0MHgwMzYwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IGNvdW50KHNWcDhNZWRpYTA2NDB4MDM2MCwgMiwgMik7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0VnA4R29vZzBQZXJmMDY0MHgwMzYwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoc1ZwOE1lZGlhMDY0MHgwMzYwLCBHT09HLCAwKTsgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RWcDhHb29nMVBlcmYwNjQweDAzNjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihzVnA4TWVkaWEwNjQweDAzNjAsIEdPT0csIDEpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdFZwOE90aGVyMFBlcmYwNjQweDAzNjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihzVnA4TWVkaWEwNjQweDAzNjAsIE9USEVSLCAwKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RWcDhPdGhlcjFQZXJmMDY0MHgwMzYwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoc1ZwOE1lZGlhMDY0MHgwMzYwLCBPVEhFUiwgMSk7IH0KIApAQCAtNTQ3LDggKzU2Niw5IEBACiAgICAgICAgIFIucmF3LmJiYl9zM18xMjgweDcyMF93ZWJtX3ZwOF84bWJwc182MGZwc19vcHVzXzZjaF8zODRrYnBzXzQ4MDAwaHosCiAgICAgfTsKIAotICAgIHB1YmxpYyB2b2lkIHRlc3RWcDhDb3VudDEyODB4MDcyMCgpIHRocm93cyBFeGNlcHRpb24geyBjb3VudChzVnA4TWVkaWExMjgweDA3MjAsIDEsIDIpOyB9CisgICAgcHVibGljIHZvaWQgdGVzdFZwOENvdW50MTI4MHgwNzIwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IGNvdW50KHNWcDhNZWRpYTEyODB4MDcyMCwgMiwgMik7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0VnA4R29vZzBQZXJmMTI4MHgwNzIwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoc1ZwOE1lZGlhMTI4MHgwNzIwLCBHT09HLCAwKTsgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RWcDhHb29nMVBlcmYxMjgweDA3MjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihzVnA4TWVkaWExMjgweDA3MjAsIEdPT0csIDEpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdFZwOE90aGVyMFBlcmYxMjgweDA3MjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihzVnA4TWVkaWExMjgweDA3MjAsIE9USEVSLCAwKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RWcDhPdGhlcjFQZXJmMTI4MHgwNzIwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoc1ZwOE1lZGlhMTI4MHgwNzIwLCBPVEhFUiwgMSk7IH0KIApAQCAtNTU4LDggKzU3OCw5IEBACiAgICAgICAgIFIucmF3LmJiYl9zMl8xOTIweDEwODBfd2VibV92cDhfMjBtYnBzXzYwZnBzX3ZvcmJpc182Y2hfMzg0a2Jwc180ODAwMGh6LAogICAgIH07CiAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VnA4Q291bnQxOTIweDEwODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgY291bnQoc1ZwOE1lZGlhMTkyMHgxMDgwLCAxLCAyKTsgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RWcDhDb3VudDE5MjB4MTA4MCgpIHRocm93cyBFeGNlcHRpb24geyBjb3VudChzVnA4TWVkaWExOTIweDEwODAsIDIsIDIpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdFZwOEdvb2cwUGVyZjE5MjB4MTA4MCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKHNWcDhNZWRpYTE5MjB4MTA4MCwgR09PRywgMCk7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VnA4R29vZzFQZXJmMTkyMHgxMDgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoc1ZwOE1lZGlhMTkyMHgxMDgwLCBHT09HLCAxKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RWcDhPdGhlcjBQZXJmMTkyMHgxMDgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoc1ZwOE1lZGlhMTkyMHgxMDgwLCBPVEhFUiwgMCk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0VnA4T3RoZXIxUGVyZjE5MjB4MTA4MCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKHNWcDhNZWRpYTE5MjB4MTA4MCwgT1RIRVIsIDEpOyB9CiAKQEAgLTU2OSw4ICs1OTAsOSBAQAogICAgICAgICBSLnJhdy5iYmJfczFfMzIweDE4MF93ZWJtX3ZwOV8wcDExXzYwMGticHNfMzBmcHNfdm9yYmlzX21vbm9fNjRrYnBzXzQ4MDAwaHosCiAgICAgfTsKIAotICAgIHB1YmxpYyB2b2lkIHRlc3RWcDlDb3VudDAzMjB4MDE4MCgpIHRocm93cyBFeGNlcHRpb24geyBjb3VudChzVnA5TWVkaWEwMzIweDAxODAsIDEsIDQpOyB9CisgICAgcHVibGljIHZvaWQgdGVzdFZwOUNvdW50MDMyMHgwMTgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IGNvdW50KHNWcDlNZWRpYTAzMjB4MDE4MCwgMiwgNCk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0VnA5R29vZzBQZXJmMDMyMHgwMTgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoc1ZwOU1lZGlhMDMyMHgwMTgwLCBHT09HLCAwKTsgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RWcDlHb29nMVBlcmYwMzIweDAxODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihzVnA5TWVkaWEwMzIweDAxODAsIEdPT0csIDEpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdFZwOU90aGVyMFBlcmYwMzIweDAxODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihzVnA5TWVkaWEwMzIweDAxODAsIE9USEVSLCAwKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RWcDlPdGhlcjFQZXJmMDMyMHgwMTgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoc1ZwOU1lZGlhMDMyMHgwMTgwLCBPVEhFUiwgMSk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0VnA5T3RoZXIyUGVyZjAzMjB4MDE4MCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKHNWcDlNZWRpYTAzMjB4MDE4MCwgT1RIRVIsIDIpOyB9CkBAIC01ODAsOCArNjAyLDkgQEAKICAgICAgICAgUi5yYXcuYmJiX3MxXzY0MHgzNjBfd2VibV92cDlfMHAyMV8xNjAwa2Jwc18zMGZwc192b3JiaXNfc3RlcmVvXzEyOGticHNfNDgwMDBoeiwKICAgICB9OwogCi0gICAgcHVibGljIHZvaWQgdGVzdFZwOUNvdW50MDY0MHgwMzYwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IGNvdW50KHNWcDlNZWRpYTA2NDB4MDM2MCwgMSwgNCk7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VnA5Q291bnQwNjQweDAzNjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgY291bnQoc1ZwOU1lZGlhMDY0MHgwMzYwLCAyLCA0KTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RWcDlHb29nMFBlcmYwNjQweDAzNjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihzVnA5TWVkaWEwNjQweDAzNjAsIEdPT0csIDApOyB9CisgICAgcHVibGljIHZvaWQgdGVzdFZwOUdvb2cxUGVyZjA2NDB4MDM2MCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKHNWcDlNZWRpYTA2NDB4MDM2MCwgR09PRywgMSk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0VnA5T3RoZXIwUGVyZjA2NDB4MDM2MCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKHNWcDlNZWRpYTA2NDB4MDM2MCwgT1RIRVIsIDApOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdFZwOU90aGVyMVBlcmYwNjQweDAzNjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihzVnA5TWVkaWEwNjQweDAzNjAsIE9USEVSLCAxKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RWcDlPdGhlcjJQZXJmMDY0MHgwMzYwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoc1ZwOU1lZGlhMDY0MHgwMzYwLCBPVEhFUiwgMik7IH0KQEAgLTU5MSw4ICs2MTQsOSBAQAogICAgICAgICBSLnJhdy5iYmJfczRfMTI4MHg3MjBfd2VibV92cDlfMHAzMV80bWJwc18zMGZwc19vcHVzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHosCiAgICAgfTsKIAotICAgIHB1YmxpYyB2b2lkIHRlc3RWcDlDb3VudDEyODB4MDcyMCgpIHRocm93cyBFeGNlcHRpb24geyBjb3VudChzVnA5TWVkaWExMjgweDA3MjAsIDEsIDQpOyB9CisgICAgcHVibGljIHZvaWQgdGVzdFZwOUNvdW50MTI4MHgwNzIwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IGNvdW50KHNWcDlNZWRpYTEyODB4MDcyMCwgMiwgNCk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0VnA5R29vZzBQZXJmMTI4MHgwNzIwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoc1ZwOU1lZGlhMTI4MHgwNzIwLCBHT09HLCAwKTsgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RWcDlHb29nMVBlcmYxMjgweDA3MjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihzVnA5TWVkaWExMjgweDA3MjAsIEdPT0csIDEpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdFZwOU90aGVyMFBlcmYxMjgweDA3MjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihzVnA5TWVkaWExMjgweDA3MjAsIE9USEVSLCAwKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RWcDlPdGhlcjFQZXJmMTI4MHgwNzIwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoc1ZwOU1lZGlhMTI4MHgwNzIwLCBPVEhFUiwgMSk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0VnA5T3RoZXIyUGVyZjEyODB4MDcyMCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKHNWcDlNZWRpYTEyODB4MDcyMCwgT1RIRVIsIDIpOyB9CkBAIC02MDIsOCArNjI2LDkgQEAKICAgICAgICAgUi5yYXcuYmJiX3MyXzE5MjB4MTA4MF93ZWJtX3ZwOV8wcDQxXzEwbWJwc182MGZwc192b3JiaXNfNmNoXzM4NGticHNfMjIwNTBoeiwKICAgICB9OwogCi0gICAgcHVibGljIHZvaWQgdGVzdFZwOUNvdW50MTkyMHgxMDgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IGNvdW50KHNWcDlNZWRpYTE5MjB4MTA4MCwgMSwgNCk7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VnA5Q291bnQxOTIweDEwODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgY291bnQoc1ZwOU1lZGlhMTkyMHgxMDgwLCAyLCA0KTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RWcDlHb29nMFBlcmYxOTIweDEwODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihzVnA5TWVkaWExOTIweDEwODAsIEdPT0csIDApOyB9CisgICAgcHVibGljIHZvaWQgdGVzdFZwOUdvb2cxUGVyZjE5MjB4MTA4MCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKHNWcDlNZWRpYTE5MjB4MTA4MCwgR09PRywgMSk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0VnA5T3RoZXIwUGVyZjE5MjB4MTA4MCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKHNWcDlNZWRpYTE5MjB4MTA4MCwgT1RIRVIsIDApOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdFZwOU90aGVyMVBlcmYxOTIweDEwODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihzVnA5TWVkaWExOTIweDEwODAsIE9USEVSLCAxKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RWcDlPdGhlcjJQZXJmMTkyMHgxMDgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoc1ZwOU1lZGlhMTkyMHgxMDgwLCBPVEhFUiwgMik7IH0KQEAgLTYxNSw4ICs2NDAsOSBAQAogICAgICAgICBSLnJhdy5iYmJfczJfMzg0MHgyMTYwX3dlYm1fdnA5XzBwNTFfMjBtYnBzXzYwZnBzX3ZvcmJpc182Y2hfMzg0a2Jwc18zMjAwMGh6LAogICAgIH07CiAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VnA5Q291bnQzODQweDIxNjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgY291bnQoc1ZwOU1lZGlhMzg0MHgyMTYwLCAxLCA0KTsgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RWcDlDb3VudDM4NDB4MjE2MCgpIHRocm93cyBFeGNlcHRpb24geyBjb3VudChzVnA5TWVkaWEzODQweDIxNjAsIDIsIDQpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdFZwOUdvb2cwUGVyZjM4NDB4MjE2MCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKHNWcDlNZWRpYTM4NDB4MjE2MCwgR09PRywgMCk7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VnA5R29vZzFQZXJmMzg0MHgyMTYwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoc1ZwOU1lZGlhMzg0MHgyMTYwLCBHT09HLCAxKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RWcDlPdGhlcjBQZXJmMzg0MHgyMTYwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoc1ZwOU1lZGlhMzg0MHgyMTYwLCBPVEhFUiwgMCk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0VnA5T3RoZXIxUGVyZjM4NDB4MjE2MCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKHNWcDlNZWRpYTM4NDB4MjE2MCwgT1RIRVIsIDEpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdFZwOU90aGVyMlBlcmYzODQweDIxNjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihzVnA5TWVkaWEzODQweDIxNjAsIE9USEVSLCAyKTsgfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL1ZpZGVvRWRpdG9yVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL1ZpZGVvRWRpdG9yVGVzdC5qYXZhCmluZGV4IGMxMDk3ZjguLmI5NTQzMWUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9WaWRlb0VkaXRvclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvVmlkZW9FZGl0b3JUZXN0LmphdmEKQEAgLTE4LDggKzE4LDEwIEBACiAKIGltcG9ydCBhbmRyb2lkLm1lZGlhLmN0cy5SOwogCitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOwogaW1wb3J0IGFuZHJvaWQudGVzdC5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjsKIAorQEFwcE1vZGVGdWxsKHJlYXNvbiA9ICJUT0RPOiBldmFsdWF0ZSBhbmQgcG9ydCB0byBpbnN0YW50IikKIHB1YmxpYyBjbGFzcyBWaWRlb0VkaXRvclRlc3QgZXh0ZW5kcyBBY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjxNZWRpYVN0dWJBY3Rpdml0eT4gewogCiAgICAgcHVibGljIFZpZGVvRWRpdG9yVGVzdCgpIHsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9WaWRlb0VuY29kZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvVmlkZW9FbmNvZGVyVGVzdC5qYXZhCmluZGV4IDhkYmRlZmIuLjNhMjE2NWQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9WaWRlb0VuY29kZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL1ZpZGVvRW5jb2RlclRlc3QuamF2YQpAQCAtMzMsNiArMzMsNyBAQAogaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFGb3JtYXQ7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU11eGVyOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuUGFpcjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuUmFuZ2U7CkBAIC01NCw2ICs1NSw3IEBACiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogCitAQXBwTW9kZUZ1bGwocmVhc29uID0gIlRPRE86IGV2YWx1YXRlIGFuZCBwb3J0IHRvIGluc3RhbnQiKQogcHVibGljIGNsYXNzIFZpZGVvRW5jb2RlclRlc3QgZXh0ZW5kcyBNZWRpYVBsYXllclRlc3RCYXNlIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1NBTVBMRV9TSVpFID0gMjU2ICogMTAyNDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlZpZGVvRW5jb2RlclRlc3QiOwpAQCAtMTE5MCw4ICsxMTkyLDcgQEAKICAgICAgICAgQXJyYXlMaXN0PEVuY29kZXI+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8RW5jb2Rlcj4oKTsKIAogICAgICAgICBmb3IgKE1lZGlhQ29kZWNJbmZvIGluZm8gOiBtY2wuZ2V0Q29kZWNJbmZvcygpKSB7Ci0gICAgICAgICAgICBpZiAoIWluZm8uaXNFbmNvZGVyKCkKLSAgICAgICAgICAgICAgICAgICAgfHwgaW5mby5nZXROYW1lKCkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCJvbXguZ29vZ2xlLiIpICE9IGdvb2cpIHsKKyAgICAgICAgICAgIGlmICghaW5mby5pc0VuY29kZXIoKSB8fCBNZWRpYVV0aWxzLmlzR29vZ2xlKGluZm8uZ2V0TmFtZSgpKSAhPSBnb29nKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBDb2RlY0NhcGFiaWxpdGllcyBjYXBzID0gbnVsbDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9WaWRlb1N1cmZhY2VWaWV3LmphdmEgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvVmlkZW9TdXJmYWNlVmlldy5qYXZhCmluZGV4IDc2YzMwMTUuLmNiMGI5NTggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9WaWRlb1N1cmZhY2VWaWV3LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL1ZpZGVvU3VyZmFjZVZpZXcuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogCiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5jdHMuUjsKIAoraW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogCiBpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbmZpZzsKQEAgLTMxLDYgKzMyLDcgQEAKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlOwogCitAQXBwTW9kZUZ1bGwocmVhc29uID0gIlRPRE86IGV2YWx1YXRlIGFuZCBwb3J0IHRvIGluc3RhbnQiKQogY2xhc3MgVmlkZW9TdXJmYWNlVmlldyBleHRlbmRzIEdMU3VyZmFjZVZpZXcgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiVmlkZW9TdXJmYWNlVmlldyI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNMRUVQX1RJTUVfTVMgPSAxMDAwOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL1ZpcnR1YWxpemVyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL1ZpcnR1YWxpemVyVGVzdC5qYXZhCmluZGV4IDNmYWUyNmMuLjUyYjdlN2EgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9WaXJ0dWFsaXplclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvVmlydHVhbGl6ZXJUZXN0LmphdmEKQEAgLTIxLDYgKzIxLDcgQEAKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvRm9ybWF0OwogaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW9meC5WaXJ0dWFsaXplcjsKIGltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCkBAIC0yOCw2ICsyOSw3IEBACiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogCitAQXBwTW9kZUZ1bGwocmVhc29uID0gIlRPRE86IGV2YWx1YXRlIGFuZCBwb3J0IHRvIGluc3RhbnQiKQogcHVibGljIGNsYXNzIFZpcnR1YWxpemVyVGVzdCBleHRlbmRzIFBvc3RQcm9jVGVzdEJhc2UgewogCiAgICAgcHJpdmF0ZSBTdHJpbmcgVEFHID0gIlZpcnR1YWxpemVyVGVzdCI7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvVmlzdWFsaXplclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9WaXN1YWxpemVyVGVzdC5qYXZhCmluZGV4IDE0MWUzMzkuLjkyYWEyMDIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9WaXN1YWxpemVyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9WaXN1YWxpemVyVGVzdC5qYXZhCkBAIC0yNiwxMCArMjYsMTIgQEAKIGltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvZnguVmlzdWFsaXplcjsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvZnguVmlzdWFsaXplci5NZWFzdXJlbWVudFBlYWtSbXM7CiBpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOwogaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CiBpbXBvcnQgamF2YS51dGlsLlVVSUQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAorQEFwcE1vZGVGdWxsKHJlYXNvbiA9ICJUT0RPOiBldmFsdWF0ZSBhbmQgcG9ydCB0byBpbnN0YW50IikKIHB1YmxpYyBjbGFzcyBWaXN1YWxpemVyVGVzdCBleHRlbmRzIFBvc3RQcm9jVGVzdEJhc2UgewogCiAgICAgcHJpdmF0ZSBTdHJpbmcgVEFHID0gIlZpc3VhbGl6ZXJUZXN0IjsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9Wb2x1bWVTaGFwZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvVm9sdW1lU2hhcGVyVGVzdC5qYXZhCmluZGV4IDMwZjA3ZTIuLmZhYzY1OWQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9Wb2x1bWVTaGFwZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL1ZvbHVtZVNoYXBlclRlc3QuamF2YQpAQCAtMTgsMjYgKzE4LDI1IEBACiAKIGltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0VGhyb3dzOwogCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS5jdHMuUjsKLQogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0F0dHJpYnV0ZXM7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0Zvcm1hdDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvU3lzdGVtOworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9UcmFjazsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuUGxheWJhY2tQYXJhbXM7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5Wb2x1bWVTaGFwZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5jdHMuUjsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKIGltcG9ydCBhbmRyb2lkLm9zLlBvd2VyTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLkZsYWt5VGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLkxhcmdlVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuRmxha3lUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5MYXJnZVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ3RzQW5kcm9pZFRlc3RDYXNlOwogCiBpbXBvcnQgamF2YS5sYW5nLkF1dG9DbG9zZWFibGU7CkBAIC01Miw2ICs1MSw3IEBACiAgKgogICogYWRiIGxvZ2NhdCB8IGdyZXAgVm9sdW1lU2hhcGVyVGVzdAogICovCitAQXBwTW9kZUZ1bGwocmVhc29uID0gIlRPRE86IGV2YWx1YXRlIGFuZCBwb3J0IHRvIGluc3RhbnQiKQogcHVibGljIGNsYXNzIFZvbHVtZVNoYXBlclRlc3QgZXh0ZW5kcyBDdHNBbmRyb2lkVGVzdENhc2UgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiVm9sdW1lU2hhcGVyVGVzdCI7CiAKQEAgLTIwNCw3ICsyMDQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvQXR0cmlidXRlcy5VU0FHRV9NRURJQSAgLy8gb2ZmbG9hZCBhbGxvd2VkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBBdWRpb0F0dHJpYnV0ZXMuVVNBR0VfTk9USUZJQ0FUSU9OKSAvLyBvZmZsb2FkIG5vdCBhbGxvd2VkCiAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpLAotICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtLm5ld0F1ZGlvU2Vzc2lvbklkKCkpOworICAgICAgICAgICAgICAgIG5ldyBBdWRpb01hbmFnZXIoZ2V0Q29udGV4dCgpKS5nZW5lcmF0ZUF1ZGlvU2Vzc2lvbklkKCkpOwogICAgICAgICBtZWRpYVBsYXllci5zZXRXYWtlTW9kZShnZXRDb250ZXh0KCksIFBvd2VyTWFuYWdlci5QQVJUSUFMX1dBS0VfTE9DSyk7CiAgICAgICAgIG1lZGlhUGxheWVyLnNldExvb3BpbmcodHJ1ZSk7CiAgICAgICAgIHJldHVybiBtZWRpYVBsYXllcjsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9WcHhDb2RlY1Rlc3RCYXNlLmphdmEgYi90ZXN0cy90ZXN0cy9tZWRpYS9zcmMvYW5kcm9pZC9tZWRpYS9jdHMvVnB4Q29kZWNUZXN0QmFzZS5qYXZhCmluZGV4IGRmOTM3MmYuLjQ4ZmFmNDkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9WcHhDb2RlY1Rlc3RCYXNlLmphdmEKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL1ZweENvZGVjVGVzdEJhc2UuamF2YQpAQCAtMzIsNiArMzIsOCBAQAogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5jdHMuUjsKIAoraW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuTWVkaWFVdGlsczsKKwogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CkBAIC01NSw3ICs1Nyw2IEBACiAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlZQeENvZGVjVGVzdEJhc2UiOwogICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZQOF9NSU1FID0gTWVkaWFGb3JtYXQuTUlNRVRZUEVfVklERU9fVlA4OwogICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZQOV9NSU1FID0gTWVkaWFGb3JtYXQuTUlNRVRZUEVfVklERU9fVlA5OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHT09HTEVfQ09ERUNfUFJFRklYID0gIm9teC5nb29nbGUuIjsKICAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTRENBUkRfRElSID0KICAgICAgICAgICAgIEVudmlyb25tZW50LmdldEV4dGVybmFsU3RvcmFnZURpcmVjdG9yeSgpLmdldEFic29sdXRlUGF0aCgpOwogCkBAIC02Myw5ICs2NCw4IEBACiAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBsb25nIERFRkFVTFRfREVRVUVVRV9USU1FT1VUX1VTID0gMjAwMDAwOwogICAgIC8vIERlZmF1bHQgdGltZW91dCBmb3IgTWVkaWFFbmNvZGVyQXN5bmMgLSAzMCBzZWMuCiAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBsb25nIERFRkFVTFRfRU5DT0RFX1RJTUVPVVRfTVMgPSAzMDAwMDsKLSAgICAvLyBEZWZhdWx0IHN5bmMgZnJhbWUgaW50ZXJ2YWwgaW4gZnJhbWVzICh6ZXJvIG1lYW5zIGFsbG93IHRoZSBlbmNvZGVyIHRvIGF1dG8tc2VsZWN0Ci0gICAgLy8ga2V5IGZyYW1lIGludGVydmFsKS4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1lOQ19GUkFNRV9JTlRFUlZBTCA9IDA7CisgICAgLy8gRGVmYXVsdCBzeW5jIGZyYW1lIGludGVydmFsIGluIGZyYW1lcworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTWU5DX0ZSQU1FX0lOVEVSVkFMID0gMzA7CiAgICAgLy8gVmlkZW8gYml0cmF0ZSB0eXBlIC0gc2hvdWxkIGJlIHNldCB0byBPTVhfVmlkZW9fQ29udHJvbFJhdGVDb25zdGFudCBmcm9tIE9NWF9WaWRlby5oCiAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVklERU9fQ29udHJvbFJhdGVWYXJpYWJsZSA9IDE7CiAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVklERU9fQ29udHJvbFJhdGVDb25zdGFudCA9IDI7CkBAIC0xMDAsNyArMTAwLDcgQEAKICAgICAgICAgICAgIHRoaXMuY29sb3JGb3JtYXQgPSBjb2xvckZvcm1hdDsKICAgICAgICAgfQogICAgICAgICBwdWJsaWMgYm9vbGVhbiAgaXNHb29nbGVDb2RlYygpIHsKLSAgICAgICAgICAgIHJldHVybiBjb2RlY05hbWUudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKEdPT0dMRV9DT0RFQ19QUkVGSVgpOworICAgICAgICAgICAgcmV0dXJuIE1lZGlhVXRpbHMuaXNHb29nbGUoY29kZWNOYW1lKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgY29kZWNOYW1lOyAvLyBPcGVuTWF4IGNvbXBvbmVudCBuYW1lIGZvciBWUHggY29kZWMuCkBAIC0xMzgsOCArMTM4LDcgQEAKICAgICAgICAgICAgIExvZy52KFRBRywgY29kZWNJbmZvLmdldE5hbWUoKSk7CiAgICAgICAgICAgICAvLyBUT0RPOiByZW1vdmUgZGVwZW5kZW5jZSBvZiBHb29nbGUgZnJvbSB0aGUgdGVzdAogICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBHb29nbGUgY29kZWMgLSB3ZSBzaG91bGQgaWdub3JlIGl0LgotICAgICAgICAgICAgYm9vbGVhbiBpc0dvb2dsZUNvZGVjID0KLSAgICAgICAgICAgICAgICBjb2RlY0luZm8uZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChHT09HTEVfQ09ERUNfUFJFRklYKTsKKyAgICAgICAgICAgIGJvb2xlYW4gaXNHb29nbGVDb2RlYyA9IE1lZGlhVXRpbHMuaXNHb29nbGUoY29kZWNJbmZvLmdldE5hbWUoKSk7CiAgICAgICAgICAgICBpZiAoIWlzR29vZ2xlQ29kZWMgJiYgZm9yY2VHb29nbGVDb2RlYykgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQpAQCAtMzY4LDI0ICszNjcsMjcgQEAKIAogICAgIC8qKgogICAgICAqIFBhY2tzIFlVVjQyMCBmcmFtZSBieSBtb3ZpbmcgaXQgdG8gYSBzbWFsbGVyIHNpemUgYnVmZmVyIHdpdGggc3RyaWRlIGFuZCBzbGljZQotICAgICAqIGhlaWdodCBlcXVhbCB0byB0aGUgb3JpZ2luYWwgZnJhbWUgd2lkdGggYW5kIGhlaWdodC4KKyAgICAgKiBoZWlnaHQgZXF1YWwgdG8gdGhlIGNyb3Agd2luZG93LgogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBQYWNrWVVWNDIwKGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gUGFja1lVVjQyMChpbnQgbGVmdCwgaW50IHRvcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAogICAgICAgICAgICAgaW50IHN0cmlkZSwgaW50IHNsaWNlSGVpZ2h0LCBieXRlW10gc3JjKSB7CiAgICAgICAgIGJ5dGVbXSBkc3QgPSBuZXcgYnl0ZVt3aWR0aCAqIGhlaWdodCAqIDMgLyAyXTsKICAgICAgICAgLy8gWSBjb3B5LgogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7Ci0gICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHNyYywgaSAqIHN0cmlkZSwgZHN0LCBpICogd2lkdGgsIHdpZHRoKTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoc3JjLCAoaSArIHRvcCkgKiBzdHJpZGUgKyBsZWZ0LCBkc3QsIGkgKiB3aWR0aCwgd2lkdGgpOwogICAgICAgICB9CiAgICAgICAgIC8vIFUgYW5kIFYgY29weS4KICAgICAgICAgaW50IHVfc3JjX29mZnNldCA9IHN0cmlkZSAqIHNsaWNlSGVpZ2h0OwogICAgICAgICBpbnQgdl9zcmNfb2Zmc2V0ID0gdV9zcmNfb2Zmc2V0ICsgdV9zcmNfb2Zmc2V0IC8gNDsKICAgICAgICAgaW50IHVfZHN0X29mZnNldCA9IHdpZHRoICogaGVpZ2h0OwogICAgICAgICBpbnQgdl9kc3Rfb2Zmc2V0ID0gdV9kc3Rfb2Zmc2V0ICsgdV9kc3Rfb2Zmc2V0IC8gNDsKKyAgICAgICAgLy8gRG93bnNhbXBsZSBhbmQgYWxpZ24gdG8gZmxvb3ItMiBmb3IgY3JvcCBvcmlnaW4uCisgICAgICAgIGxlZnQgLz0gMjsKKyAgICAgICAgdG9wIC89IDI7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGVpZ2h0IC8gMjsgaSsrKSB7Ci0gICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHNyYywgdV9zcmNfb2Zmc2V0ICsgaSAqIChzdHJpZGUgLyAyKSwKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoc3JjLCB1X3NyY19vZmZzZXQgKyAoaSArIHRvcCkgKiAoc3RyaWRlIC8gMikgKyBsZWZ0LAogICAgICAgICAgICAgICAgICAgICBkc3QsIHVfZHN0X29mZnNldCArIGkgKiAod2lkdGggLyAyKSwgd2lkdGggLyAyKTsKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoc3JjLCB2X3NyY19vZmZzZXQgKyBpICogKHN0cmlkZSAvIDIpLAorICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShzcmMsIHZfc3JjX29mZnNldCArIChpICsgdG9wKSAqIChzdHJpZGUgLyAyKSArIGxlZnQsCiAgICAgICAgICAgICAgICAgICAgIGRzdCwgdl9kc3Rfb2Zmc2V0ICsgaSAqICh3aWR0aCAvIDIpLCB3aWR0aCAvIDIpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBkc3Q7CkBAIC01MzMsNiArNTM1LDEwIEBACiAgICAgICAgIGludCBmcmFtZUNvdW50ID0gaXZmLmdldEZyYW1lQ291bnQoKTsKICAgICAgICAgaW50IGZyYW1lU3RyaWRlID0gZnJhbWVXaWR0aDsKICAgICAgICAgaW50IGZyYW1lU2xpY2VIZWlnaHQgPSBmcmFtZUhlaWdodDsKKyAgICAgICAgaW50IGNyb3BMZWZ0ID0gMDsKKyAgICAgICAgaW50IGNyb3BUb3AgPSAwOworICAgICAgICBpbnQgY3JvcFdpZHRoID0gZnJhbWVXaWR0aDsKKyAgICAgICAgaW50IGNyb3BIZWlnaHQgPSBmcmFtZUhlaWdodDsKICAgICAgICAgYXNzZXJ0VHJ1ZShmcmFtZVdpZHRoID4gMCk7CiAgICAgICAgIGFzc2VydFRydWUoZnJhbWVIZWlnaHQgPiAwKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShmcmFtZUNvdW50ID4gMCk7CkBAIC02MzUsNiArNjQxLDI4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB4ICIgKyBmcmFtZVNsaWNlSGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICAgZnJhbWVTdHJpZGUgPSBNYXRoLm1heChmcmFtZVdpZHRoLCBmcmFtZVN0cmlkZSk7CiAgICAgICAgICAgICAgICAgICAgIGZyYW1lU2xpY2VIZWlnaHQgPSBNYXRoLm1heChmcmFtZUhlaWdodCwgZnJhbWVTbGljZUhlaWdodCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gUGFyc2UgY3JvcCB3aW5kb3cgZm9yIHRoZSBhcmVhIG9mIHJlY29yZGluZyBkZWNvZGVkIGZyYW1lIGRhdGEuCisgICAgICAgICAgICAgICAgICAgIGlmIChmb3JtYXQuY29udGFpbnNLZXkoImNyb3AtbGVmdCIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjcm9wTGVmdCA9IGZvcm1hdC5nZXRJbnRlZ2VyKCJjcm9wLWxlZnQiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybWF0LmNvbnRhaW5zS2V5KCJjcm9wLXRvcCIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjcm9wVG9wID0gZm9ybWF0LmdldEludGVnZXIoImNyb3AtdG9wIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1hdC5jb250YWluc0tleSgiY3JvcC1yaWdodCIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjcm9wV2lkdGggPSBmb3JtYXQuZ2V0SW50ZWdlcigiY3JvcC1yaWdodCIpIC0gY3JvcExlZnQgKyAxOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgY3JvcFdpZHRoID0gZnJhbWVXaWR0aDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybWF0LmNvbnRhaW5zS2V5KCJjcm9wLWJvdHRvbSIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjcm9wSGVpZ2h0ID0gZm9ybWF0LmdldEludGVnZXIoImNyb3AtYm90dG9tIikgLSBjcm9wVG9wICsgMTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNyb3BIZWlnaHQgPSBmcmFtZUhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJGcmFtZSBjcm9wIHdpbmRvdyBvcmlnaW46ICIgKyBjcm9wTGVmdCArICIgeCAiICsgY3JvcFRvcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgc2l6ZTogIiArIGNyb3BXaWR0aCArICIgeCAiICsgY3JvcEhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgIGNyb3BXaWR0aCA9IE1hdGgubWluKGZyYW1lV2lkdGggLSBjcm9wTGVmdCwgY3JvcFdpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgY3JvcEhlaWdodCA9IE1hdGgubWluKGZyYW1lSGVpZ2h0IC0gY3JvcFRvcCwgY3JvcEhlaWdodCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJlc3VsdCA9IGRlY29kZXIuZGVxdWV1ZU91dHB1dEJ1ZmZlcihidWZmZXJJbmZvLCBERUZBVUxUX0RFUVVFVUVfVElNRU9VVF9VUyk7CiAgICAgICAgICAgICB9CkBAIC02NjEsMTEgKzY4OSwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lID0gTlYxMlRvWVVWNDIwKGZyYW1lV2lkdGgsIGZyYW1lSGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVTdHJpZGUsIGZyYW1lU2xpY2VIZWlnaHQsIGZyYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGludCB3cml0ZUxlbmd0aCA9IE1hdGgubWluKGZyYW1lV2lkdGggKiBmcmFtZUhlaWdodCAqIDMgLyAyLCBmcmFtZS5sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdyaXRlTGVuZ3RoID0gTWF0aC5taW4oY3JvcFdpZHRoICogY3JvcEhlaWdodCAqIDMgLyAyLCBmcmFtZS5sZW5ndGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGFjayBmcmFtZSBpZiBuZWNlc3NhcnkuCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVMZW5ndGggPCBmcmFtZS5sZW5ndGggJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZyYW1lU3RyaWRlID4gZnJhbWVXaWR0aCB8fCBmcmFtZVNsaWNlSGVpZ2h0ID4gZnJhbWVIZWlnaHQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUgPSBQYWNrWVVWNDIwKGZyYW1lV2lkdGgsIGZyYW1lSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZnJhbWVTdHJpZGUgPiBjcm9wV2lkdGggfHwgZnJhbWVTbGljZUhlaWdodCA+IGNyb3BIZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUgPSBQYWNrWVVWNDIwKGNyb3BMZWZ0LCBjcm9wVG9wLCBjcm9wV2lkdGgsIGNyb3BIZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZVN0cmlkZSwgZnJhbWVTbGljZUhlaWdodCwgZnJhbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgeXV2LndyaXRlKGZyYW1lLCAwLCB3cml0ZUxlbmd0aCk7CkBAIC0yMDE4LDQgKzIwNDYsMyBAQAogICAgICAgICByZXR1cm4gc3RhdGlzdGljczsKICAgICB9CiB9Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhL3NyYy9hbmRyb2lkL21lZGlhL2N0cy9WcHhFbmNvZGVyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL1ZweEVuY29kZXJUZXN0LmphdmEKaW5kZXggODk4NGY3YS4uNmVmMmE2NSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL1ZweEVuY29kZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWEvc3JjL2FuZHJvaWQvbWVkaWEvY3RzL1ZweEVuY29kZXJUZXN0LmphdmEKQEAgLTIwLDYgKzIwLDcgQEAKIGltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29kZWNJbmZvOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb2RlY0xpc3Q7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUZvcm1hdDsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLmN0cy5SOwogCkBAIC0zNSw2ICszNiw3IEBACiAgKiBUaGUgc3RyZWFtIGlzIGxhdGVyIGRlY29kZWQgYnkgdnA4L3ZwOSBkZWNvZGVyIHRvIHZlcmlmeSBmcmFtZXMgYXJlIGRlY29kYWJsZSBhbmQgdG8KICAqIGNhbGN1bGF0ZSBQU05SIHZhbHVlcyBmb3IgdmFyaW91cyBiaXRyYXRlcy4KICAqLworQEFwcE1vZGVGdWxsKHJlYXNvbiA9ICJUT0RPOiBldmFsdWF0ZSBhbmQgcG9ydCB0byBpbnN0YW50IikKIHB1YmxpYyBjbGFzcyBWcHhFbmNvZGVyVGVzdCBleHRlbmRzIFZweENvZGVjVGVzdEJhc2UgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQ09ERURfSVZGX0JBU0UgPSAiZm9vdGJhbGwiOwpAQCAtNjUsNyArNjcsNyBAQAogICAgIC8vIE1heGltdW0gYWxsb3dlZCBhdmVyYWdlIFBTTlIgZGlmZmVyZW5jZSBvZiB0aGUgZW5jb2RlciBydW5uaW5nIGluIGEgbG9vcGVyIHRocmVhZCB3aXRoIDAgbXMKICAgICAvLyBidWZmZXIgZGVxdWV1ZSB0aW1lb3V0IGNvbXBhcmluZyB0byB0aGUgZW5jb2RlciBydW5uaW5nIGluIGEgY2FsbGVlJ3MgdGhyZWFkIHdpdGggMTAwIG1zCiAgICAgLy8gYnVmZmVyIGRlcXVldWUgdGltZW91dC4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUgTUFYX0FTWU5DX0FWRVJBR0VfUFNOUl9ESUZGRVJFTkNFID0gMC41OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZSBNQVhfQVNZTkNfQVZFUkFHRV9QU05SX0RJRkZFUkVOQ0UgPSAxLjU7CiAgICAgLy8gTWF4aW11bSBhbGxvd2VkIG1pbmltdW0gUFNOUiBkaWZmZXJlbmNlIG9mIHRoZSBlbmNvZGVyIHJ1bm5pbmcgaW4gYSBsb29wZXIgdGhyZWFkCiAgICAgLy8gY29tcGFyaW5nIHRvIHRoZSBlbmNvZGVyIHJ1bm5pbmcgaW4gYSBjYWxsZWUncyB0aHJlYWQuCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIE1BWF9BU1lOQ19NSU5JTVVNX1BTTlJfRElGRkVSRU5DRSA9IDI7CkBAIC0xMDUsMTAgKzEwNywxNSBAQAogCiAgICAgICAgICAgICBWcHhFbmNvZGluZ1N0YXRpc3RpY3Mgc3RhdGlzdGljcyA9IGNvbXB1dGVFbmNvZGluZ1N0YXRpc3RpY3MoYnVmSW5mbyk7CiAKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiU3RyZWFtIGJpdHJhdGUgIiArIHN0YXRpc3RpY3MubUF2ZXJhZ2VCaXRyYXRlICsKKyAgICAgICAgICAgIC8qIEFsbG93IGFjaGlldmVkIGJpdHJhdGUgdG8gYmUgc21hbGxlciB0aGFuIHRhcmdldCBiaXRyYXRlIGZvcgorICAgICAgICAgICAgICogVklERU9fQ29udHJvbFJhdGVWYXJpYWJsZSBtb2RlICovCisgICAgICAgICAgICBpZiAoKHBhcmFtcy5iaXRyYXRlVHlwZSA9PSBWSURFT19Db250cm9sUmF0ZUNvbnN0YW50KSB8fAorICAgICAgICAgICAgICAgIChzdGF0aXN0aWNzLm1BdmVyYWdlQml0cmF0ZSA+IHRhcmdldEJpdHJhdGUpKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJTdHJlYW0gYml0cmF0ZSAiICsgc3RhdGlzdGljcy5tQXZlcmFnZUJpdHJhdGUgKwogICAgICAgICAgICAgICAgICAgICAiIGlzIGRpZmZlcmVudCBmcm9tIHRoZSB0YXJnZXQgIiArIHRhcmdldEJpdHJhdGUsCiAgICAgICAgICAgICAgICAgICAgIHRhcmdldEJpdHJhdGUsIHN0YXRpc3RpY3MubUF2ZXJhZ2VCaXRyYXRlLAogICAgICAgICAgICAgICAgICAgICBNQVhfQklUUkFURV9WQVJJQVRJT04gKiB0YXJnZXRCaXRyYXRlKTsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgZGVjb2RlKHBhcmFtcy5vdXRwdXRJdmZGaWxlbmFtZSwgbnVsbCwgY29kZWNNaW1lVHlwZSwgRlBTLCBwYXJhbXMuZm9yY2VHb29nbGVFbmNvZGVyKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbWVkaWFzdHJlc3MvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL21lZGlhc3RyZXNzL0FuZHJvaWQubWsKaW5kZXggMDIxM2MwMC4uYTFmMjRlYiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbWVkaWFzdHJlc3MvQW5kcm9pZC5taworKysgYi90ZXN0cy90ZXN0cy9tZWRpYXN0cmVzcy9BbmRyb2lkLm1rCkBAIC0yNiw3ICsyNiw5IEBACiAjIEluY2x1ZGUgYm90aCB0aGUgMzIgYW5kIDY0IGJpdCB2ZXJzaW9ucwogTE9DQUxfTVVMVElMSUIgOj0gYm90aAogCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY3RzdGVzdHJ1bm5lciBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY3RzdGVzdHJ1bm5lci1heHQgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQKKworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lci5zdHVicyBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicwogCiBMT0NBTF9IT1NUX1NIQVJFRF9MSUJSQVJJRVMgOj0gY29tcGF0aWJpbGl0eS1kZXZpY2UtbWVkaWEtcHJlY29uZGl0aW9ucwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9tZWRpYXN0cmVzcy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdGVzdHMvbWVkaWFzdHJlc3MvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBlNGFiMzZjLi5hYWUxYWJkIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9tZWRpYXN0cmVzcy9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL21lZGlhc3RyZXNzL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTM5LDcgKzM5LDcgQEAKICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5tZWRpYXN0cmVzcy5jdHMuTmF0aXZlTWVkaWFBY3Rpdml0eSIKICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Ik5hdGl2ZU1lZGlhIiAvPgogICAgIDwvYXBwbGljYXRpb24+Ci0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5tZWRpYXN0cmVzcy5jdHMiCiAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJNZWRpYSBzdHJlc3MgdGVzdHMgSW5zdHJ1bWVudGF0aW9uUnVubmVyIiA+CiAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJsaXN0ZW5lciIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhc3RyZXNzL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL21lZGlhc3RyZXNzL0FuZHJvaWRUZXN0LnhtbAppbmRleCA2Y2MxZGQ0Li5jOTViNzRkIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9tZWRpYXN0cmVzcy9BbmRyb2lkVGVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWFzdHJlc3MvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgTWVkaWEgU3RyZXNzIHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJtZWRpYSIgLz4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50YXJnZXRwcmVwLkR5bmFtaWNDb25maWdQdXNoZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9InRhcmdldCIgdmFsdWU9ImRldmljZSIgLz4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhc3RyZXNzL2puaS9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvbWVkaWFzdHJlc3Mvam5pL0FuZHJvaWQubWsKaW5kZXggNjc1NmJjMy4uNjZjYTA1ZSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbWVkaWFzdHJlc3Mvam5pL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWFzdHJlc3Mvam5pL0FuZHJvaWQubWsKQEAgLTI3LDggKzI3LDkgQEAKIExPQ0FMX0NfSU5DTFVERVMgKz0gJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIHdpbGhlbG0pCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYW5kcm9pZCBsaWJuYXRpdmVoZWxwZXJfY29tcGF0X2xpYmMrKyBsaWJsb2cgbGliT3Blbk1BWEFMCi1MT0NBTF9DWFhfU1RMIDo9IGxpYmMrK19zdGF0aWMKK0xPQ0FMX05ES19TVExfVkFSSUFOVCA6PSBub25lCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CiAKLUxPQ0FMX0NGTEFHUyA6PSAtV25vLXVudXNlZC1wYXJhbWV0ZXIKK0xPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yIC1Xbm8tdW51c2VkLXBhcmFtZXRlciAtV25vLXVudXNlZC12YXJpYWJsZQogCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9tZWRpYXN0cmVzcy9qbmkvbmF0aXZlLW1lZGlhLWpuaS5jcHAgYi90ZXN0cy90ZXN0cy9tZWRpYXN0cmVzcy9qbmkvbmF0aXZlLW1lZGlhLWpuaS5jcHAKaW5kZXggNGExMDVlMS4uNDJmYWMyMCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbWVkaWFzdHJlc3Mvam5pL25hdGl2ZS1tZWRpYS1qbmkuY3BwCisrKyBiL3Rlc3RzL3Rlc3RzL21lZGlhc3RyZXNzL2puaS9uYXRpdmUtbWVkaWEtam5pLmNwcApAQCAtMTA2LDcgKzEwNiw3IEBACiAgICAgICAgIHJldHVybiBKTklfRkFMU0U7CiAgICAgfQogICAgIGFzc2VydCgxIDw9IG5iUmVhZCAmJiBuYlJlYWQgPD0gTkJfQlVGRkVSUyk7Ci0gICAgQUxPR1YoIkluaXRpYWxseSBxdWV1ZWluZyAldSBidWZmZXJzIG9mICV1IGJ5dGVzIGVhY2giLCBuYlJlYWQsIEJVRkZFUl9TSVpFKTsKKyAgICBBTE9HVigiSW5pdGlhbGx5IHF1ZXVlaW5nICV6dSBidWZmZXJzIG9mICV1IGJ5dGVzIGVhY2giLCBuYlJlYWQsIEJVRkZFUl9TSVpFKTsKIAogICAgIC8qIEVucXVldWUgdGhlIGNvbnRlbnQgb2Ygb3VyIGNhY2hlIGJlZm9yZSBzdGFydGluZyB0byBwbGF5LAogICAgICAgIHdlIGRvbid0IHdhbnQgdG8gc3RhcnZlIHRoZSBwbGF5ZXIgKi8KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21lZGlhc3RyZXNzL3NyYy9hbmRyb2lkL21lZGlhc3RyZXNzL2N0cy9Xb3JrRGlyLmphdmEgYi90ZXN0cy90ZXN0cy9tZWRpYXN0cmVzcy9zcmMvYW5kcm9pZC9tZWRpYXN0cmVzcy9jdHMvV29ya0Rpci5qYXZhCmluZGV4IDJhZjNjNmIuLmY3ZDAzNDkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL21lZGlhc3RyZXNzL3NyYy9hbmRyb2lkL21lZGlhc3RyZXNzL2N0cy9Xb3JrRGlyLmphdmEKKysrIGIvdGVzdHMvdGVzdHMvbWVkaWFzdHJlc3Mvc3JjL2FuZHJvaWQvbWVkaWFzdHJlc3MvY3RzL1dvcmtEaXIuamF2YQpAQCAtMTgsMTIgKzE4LDEzIEBACiAKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwogCi1pbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwogCitpbXBvcnQgamF2YS5pby5GaWxlOworCiBwdWJsaWMgY2xhc3MgV29ya0RpciB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVESUFfUEFUSF9JTlNUUl9BUkdfS0VZID0gIm1lZGlhLXBhdGgiOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbWlkaS9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvbWlkaS9BbmRyb2lkLm1rCmluZGV4IGNlZmUzY2MuLjIxY2RhODUgMTAwNzU1Ci0tLSBhL3Rlc3RzL3Rlc3RzL21pZGkvQW5kcm9pZC5taworKysgYi90ZXN0cy90ZXN0cy9taWRpL0FuZHJvaWQubWsKQEAgLTI1LDcgKzI1LDkgQEAKICMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKIExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiAKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsIGN0c3Rlc3RydW5uZXIKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBjdHN0ZXN0cnVubmVyLWF4dAorCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicwogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21pZGkvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL21pZGkvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA5NzFmNGZiLi5mOWRiMTc4IDEwMDc1NQotLS0gYS90ZXN0cy90ZXN0cy9taWRpL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvbWlkaS9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0zNyw3ICszNyw3IEBACiAKICAgICA8IS0tICBzZWxmLWluc3RydW1lbnRpbmcgdGVzdCBwYWNrYWdlLiAtLT4KICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyBNSURJIHRlc3RzIgogICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQubWlkaS5jdHMiID4KICAgICAgICAgPG1ldGEtZGF0YQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbWlkaS9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy90ZXN0cy9taWRpL0FuZHJvaWRUZXN0LnhtbAppbmRleCBmMGIzY2NlLi4yM2MzMDVlIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9taWRpL0FuZHJvaWRUZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9taWRpL0FuZHJvaWRUZXN0LnhtbApAQCAtMTQsNyArMTQsMTEgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBNSURJIHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJtZWRpYSIgLz4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlN3aXRjaFVzZXJUYXJnZXRQcmVwYXJlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0idXNlci10eXBlIiB2YWx1ZT0ic3lzdGVtIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJDdHNNaWRpVGVzdENhc2VzLmFwayIgLz4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL21pZGkvc3JjL2FuZHJvaWQvbWlkaS9jdHMvTWlkaUVjaG9UZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9taWRpL3NyYy9hbmRyb2lkL21pZGkvY3RzL01pZGlFY2hvVGVzdC5qYXZhCmluZGV4IDI3NzExYWQuLmExYTIxNTYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL21pZGkvc3JjL2FuZHJvaWQvbWlkaS9jdHMvTWlkaUVjaG9UZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvbWlkaS9zcmMvYW5kcm9pZC9taWRpL2N0cy9NaWRpRWNob1Rlc3QuamF2YQpAQCAtMzEsOCArMzEsNiBAQAogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNkZFRlc3Q7Ci0KIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKQEAgLTMyOCw3ICszMjYsNiBAQAogICAgICAgICB0ZWFyRG93bkVjaG9TZXJ2ZXIobWMpOwogICAgIH0KIAotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI1LjkvQy0xLTIiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvU21hbGxNZXNzYWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFBhY2thZ2VNYW5hZ2VyIHBtID0gbUNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKTsKICAgICAgICAgaWYgKCFwbS5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfTUlESSkpIHsKQEAgLTQxNCw3ICs0MTEsNiBAQAogICAgICAgICB0ZWFyRG93bkVjaG9TZXJ2ZXIobWMpOwogICAgIH0KIAotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI1LjkvQy0xLTIiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvTXVsdGlwbGVNZXNzYWdlcygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBQYWNrYWdlTWFuYWdlciBwbSA9IG1Db250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7CiAgICAgICAgIGlmICghcG0uaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX01JREkpKSB7CkBAIC00ODksNyArNDg1LDYgQEAKICAgICB9CiAKICAgICAvLyBXaGF0IGhhcHBlbnMgaWYgdGhlIGFwcCBkb2VzIGJhZCB0aGluZ3MuCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjUuOS9DLTEtMiIpCiAgICAgcHVibGljIHZvaWQgdGVzdEVjaG9CYWRCZWhhdmlvcigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBQYWNrYWdlTWFuYWdlciBwbSA9IG1Db250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7CiAgICAgICAgIGlmICghcG0uaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX01JREkpKSB7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9tdWx0aXVzZXIvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL211bHRpdXNlci9BbmRyb2lkLm1rCmluZGV4IDk5MmI1ZmUuLmRmYmRmMWQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL211bHRpdXNlci9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3Rlc3RzL211bHRpdXNlci9BbmRyb2lkLm1rCkBAIC0yMSwxMyArMjEsMTUgQEAKIExPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCiAKICMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cyBjdHNfaW5zdGFudAogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNNdWx0aVVzZXJUZXN0Q2FzZXMKIAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGN0c3Rlc3RydW5uZXIgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGN0c3Rlc3RydW5uZXItYXh0IGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0CisKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCiAKIExPQ0FMX1NES19WRVJTSU9OIDo9IHRlc3RfY3VycmVudAogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9tdWx0aXVzZXIvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL211bHRpdXNlci9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGY5ODNmYWQuLmZjNmYzZDkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL211bHRpdXNlci9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL211bHRpdXNlci9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0xNywxMyArMTcsMTQgQEAKICAgLS0+CiAKIDxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgICAgcGFja2FnZT0iYW5kcm9pZC5tdWx0aXVzZXIuY3RzIj4KKyAgICAgICAgICBwYWNrYWdlPSJhbmRyb2lkLm11bHRpdXNlci5jdHMiCisgICAgICAgICAgYW5kcm9pZDp0YXJnZXRTYW5kYm94VmVyc2lvbj0iMiI+CiAKICAgICA8YXBwbGljYXRpb24+CiAgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgogICAgIDwvYXBwbGljYXRpb24+CiAKLSAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLm11bHRpdXNlci5jdHMiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJNdWx0aXVzZXIgdGVzdHMiLz4KIDwvbWFuaWZlc3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbXVsdGl1c2VyL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL211bHRpdXNlci9BbmRyb2lkVGVzdC54bWwKaW5kZXggODIzZWM1Zi4uMmVkYjJlYyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbXVsdGl1c2VyL0FuZHJvaWRUZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9tdWx0aXVzZXIvQW5kcm9pZFRlc3QueG1sCkBAIC0xNSw2ICsxNSw3IEBACiAgIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKICAgLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgTXVsdGl1c2VyIHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJmcmFtZXdvcmsiIC8+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CiAgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL211bHRpdXNlci9zcmMvYW5kcm9pZC9tdWx0aXVzZXIvY3RzL1NwbGl0U3lzdGVtVXNlclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL211bHRpdXNlci9zcmMvYW5kcm9pZC9tdWx0aXVzZXIvY3RzL1NwbGl0U3lzdGVtVXNlclRlc3QuamF2YQppbmRleCAzZTkxMjJiLi40NWZkNmQ4IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9tdWx0aXVzZXIvc3JjL2FuZHJvaWQvbXVsdGl1c2VyL2N0cy9TcGxpdFN5c3RlbVVzZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvbXVsdGl1c2VyL3NyYy9hbmRyb2lkL211bHRpdXNlci9jdHMvU3BsaXRTeXN0ZW1Vc2VyVGVzdC5qYXZhCkBAIC0yMCwyNyArMjAsMjAgQEAKIAogaW1wb3J0IGFuZHJvaWQub3MuVXNlck1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RDYXNlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIHB1YmxpYyBjbGFzcyBTcGxpdFN5c3RlbVVzZXJUZXN0IGV4dGVuZHMgSW5zdHJ1bWVudGF0aW9uVGVzdENhc2UgewogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IFNwbGl0U3lzdGVtVXNlclRlc3QuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOwotCiAgICAgcHVibGljIHZvaWQgdGVzdFNwbGl0U3lzdGVtVXNlcklzRGlzYWJsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gVmVyaWZ5IHRoYXQgYW0gZ2V0LWN1cnJlbnQtdXNlciBhbmQgVXNlck1hbmFnZXIuaXNTeXN0ZW1Vc2VyIGJvdGggcmV0dXJuIDAKLSAgICAgICAgU3RyaW5nIGN1clVzZXIgPSBTeXN0ZW1VdGlsLnJ1blNoZWxsQ29tbWFuZChnZXRJbnN0cnVtZW50YXRpb24oKSwgImFtIGdldC1jdXJyZW50LXVzZXIiKTsKLSAgICAgICAgTG9nLmkoVEFHLCAiYW0gZ2V0LWN1cnJlbnQtdXNlcjogIiArIGN1clVzZXIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlRlc3QgbXVzdCBiZSBydW5uaW5nIHVuZGVyIHVzZXIgMCIsICIwIiwgdHJpbShjdXJVc2VyKSk7Ci0gICAgICAgIFVzZXJNYW5hZ2VyIHVtID0gZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoVXNlck1hbmFnZXIuY2xhc3MpOwotICAgICAgICBhc3NlcnRUcnVlKCJUZXN0IG11c3QgYmUgcnVubmluZyB1bmRlciBzeXN0ZW0gdXNlciIsIHVtLmlzU3lzdGVtVXNlcigpKTsKLQotICAgICAgICAvLyBDaGVjayB0aGF0IHJvLmZ3LnN5c3RlbV91c2VyX3NwbGl0IHByb3BlcnR5IGlzIG5vdCBzZXQKKyAgICAgICAgLy8gQ2hlY2sgdGhhdCByby5mdy5zeXN0ZW1fdXNlcl9zcGxpdCBwcm9wZXJ0eSBpcyBub3Qgc2V0LgogICAgICAgICBTdHJpbmcgc3BsaXRFbmFibGVkU3RyID0gdHJpbShTeXN0ZW1VdGlsLnJ1blNoZWxsQ29tbWFuZChnZXRJbnN0cnVtZW50YXRpb24oKSwKICAgICAgICAgICAgICAgICAiZ2V0cHJvcCByby5mdy5zeXN0ZW1fdXNlcl9zcGxpdCIpKTsKICAgICAgICAgYm9vbGVhbiBzcGxpdEVuYWJsZWQgPSAieSIuZXF1YWxzKHNwbGl0RW5hYmxlZFN0cikgfHwgInllcyIuZXF1YWxzKHNwbGl0RW5hYmxlZFN0cikKICAgICAgICAgICAgICAgICB8fCAiMSIuZXF1YWxzKHNwbGl0RW5hYmxlZFN0cikgfHwgInRydWUiLmVxdWFscyhzcGxpdEVuYWJsZWRTdHIpCiAgICAgICAgICAgICAgICAgfHwgIm9uIi5lcXVhbHMoc3BsaXRFbmFibGVkU3RyKTsKICAgICAgICAgYXNzZXJ0RmFsc2UoInJvLmZ3LnN5c3RlbV91c2VyX3NwbGl0IG11c3Qgbm90IGJlIGVuYWJsZWQiLCBzcGxpdEVuYWJsZWQpOworCisgICAgICAgIC8vIENoZWNrIFVzZXJNYW5hZ2VyLmlzU3BsaXRTeXN0ZW1Vc2VyIHJldHVybnMgZmFsc2UgYXMgd2VsbC4KKyAgICAgICAgYXNzZXJ0RmFsc2UoIlVzZXJNYW5hZ2VyLmlzU3BsaXRTeXN0ZW1Vc2VyIG11c3QgYmUgZmFsc2UiLCBVc2VyTWFuYWdlci5pc1NwbGl0U3lzdGVtVXNlcigpKTsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdHJpbShTdHJpbmcgcykgewpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbmF0aXZlaGFyZHdhcmUvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL25hdGl2ZWhhcmR3YXJlL0FuZHJvaWQubWsKaW5kZXggMzg2ODhiZS4uY2U2NThkMyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbmF0aXZlaGFyZHdhcmUvQW5kcm9pZC5taworKysgYi90ZXN0cy90ZXN0cy9uYXRpdmVoYXJkd2FyZS9BbmRyb2lkLm1rCkBAIC0xNCw4MSArMTQsMjggQEAKIAogTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCiAKLSMKLSMgUmV1c2FibGUgdGVzdCBjbGFzc2VzIGFuZCBoZWxwZXJzLgotIwogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKLUxPQ0FMX01PRFVMRSA6PSBjdHMtbmF0aXZlaGFyZHdhcmUtdGVzdHMKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNOYXRpdmVIYXJkd2FyZVRlc3RDYXNlcwogCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworIyBJbmNsdWRlIGJvdGggdGhlIDMyIGFuZCA2NCBiaXQgdmVyc2lvbnMKK0xPQ0FMX01VTFRJTElCIDo9IGJvdGgKIAotTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKLQotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwKLQotTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gcGxhdGZvcm0tdGVzdC1hbm5vdGF0aW9ucwotCi1MT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50Ci0KLUxPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKLQotaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19KQVZBX0xJQlJBUlkpCi0KLSMKLSMgSk5JIGNvbXBvbmVudHMgZm9yIHRlc3RpbmcgTkRLLgotIwotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRSA6PSBsaWJjdHMtbmF0aXZlaGFyZHdhcmUtbmRrLWpuaQotCi1MT0NBTF9DRkxBR1MgKz0gLVdlcnJvciAtV2FsbCAtV2V4dHJhCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSBcCi0gICAgam5pL0FIYXJkd2FyZUJ1ZmZlclRlc3QuY3BwIFwKLSAgICBqbmkvYW5kcm9pZF9oYXJkd2FyZV9jdHNfQUhhcmR3YXJlQnVmZmVyTmF0aXZlVGVzdC5jcHAgXAotICAgIGpuaS9OYXRpdmVUZXN0SGVscGVyLmNwcAotCi1MT0NBTF9DX0lOQ0xVREVTIDo9ICQoSk5JX0hfSU5DTFVERSkKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJhbmRyb2lkIGxpYmxvZwotCi1MT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50Ci0KLUxPQ0FMX05ES19TVExfVkFSSUFOVCA6PSBjKytfc2hhcmVkCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKLQotIwotIyBDdHNOYXRpdmVIYXJkd2FyZVRlc3RDYXNlcyBwYWNrYWdlCi0jCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLQorIyBXaGVuIGJ1aWx0LCBleHBsaWNpdGx5IHB1dCBpdCBpbiB0aGUgZGF0YSBwYXJ0aXRpb24uCiBMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQogCiAjIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0CiBMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cwogCi0jIGluY2x1ZGUgYm90aCB0aGUgMzIgYW5kIDY0IGJpdCB2ZXJzaW9ucwotTE9DQUxfTVVMVElMSUIgOj0gYm90aAorTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gcGxhdGZvcm0tdGVzdC1hbm5vdGF0aW9ucyBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicworTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0IGN0c3Rlc3RydW5uZXItYXh0IG5hdGl2ZXRlc3RoZWxwZXIKK0xPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmFoYXJkd2FyZWJ1ZmZlcnRlc3QKIAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKLSAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsIFwKLSAgICBjdHN0ZXN0cnVubmVyIFwKLSAgICBjdHMtbmF0aXZlaGFyZHdhcmUtdGVzdHMgXAotCi1MT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdHMtbmF0aXZlaGFyZHdhcmUtbmRrLWpuaQotCi1MT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzTmF0aXZlSGFyZHdhcmVUZXN0Q2FzZXMKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIAogTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAogCi1MT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyCi0KLUxPQ0FMX05ES19TVExfVkFSSUFOVCA6PSBjKytfc2hhcmVkCi0KIGluY2x1ZGUgJChCVUlMRF9DVFNfUEFDS0FHRSkKKworIyBJbmNsdWRlIHRoZSBhc3NvY2lhdGVkIGxpYnJhcnkncyBtYWtlZmlsZS4KK2luY2x1ZGUgJChMT0NBTF9QQVRIKS9qbmkvQW5kcm9pZC5tawpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbmF0aXZlaGFyZHdhcmUvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL25hdGl2ZWhhcmR3YXJlL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggZjQ1M2ZhOC4uODY2ZTMwYSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbmF0aXZlaGFyZHdhcmUvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9uYXRpdmVoYXJkd2FyZS9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yNCw3ICsyNCw3IEBACiAgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgogICAgIDwvYXBwbGljYXRpb24+CiAKLSAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmhhcmR3YXJlLm5hdGl2ZWhhcmR3YXJlLmN0cyIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyBuYXRpdmUgaGFyZHdhcmUgdGVzdHMiPgogICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0ibGlzdGVuZXIiCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9uYXRpdmVoYXJkd2FyZS9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy90ZXN0cy9uYXRpdmVoYXJkd2FyZS9BbmRyb2lkVGVzdC54bWwKaW5kZXggMDc0YTk2Mi4uNDM0NTdiMyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbmF0aXZlaGFyZHdhcmUvQW5kcm9pZFRlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL25hdGl2ZWhhcmR3YXJlL0FuZHJvaWRUZXN0LnhtbApAQCAtMTQsNiArMTQsNyBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIE5hdGl2ZSBIYXJkd2FyZSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0idnIiIC8+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CiAgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL25hdGl2ZWhhcmR3YXJlL2puaS9BSGFyZHdhcmVCdWZmZXJHTFRlc3QuY3BwIGIvdGVzdHMvdGVzdHMvbmF0aXZlaGFyZHdhcmUvam5pL0FIYXJkd2FyZUJ1ZmZlckdMVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQwZDM3YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL25hdGl2ZWhhcmR3YXJlL2puaS9BSGFyZHdhcmVCdWZmZXJHTFRlc3QuY3BwCkBAIC0wLDAgKzEsMjAxMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxFR0wvZWdsLmg+CisjaW5jbHVkZSA8RUdML2VnbGV4dC5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgorI2luY2x1ZGUgPEdMRVMzL2dsMzIuaD4KKworI2luY2x1ZGUgPGFycmF5PgorI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlX2J1ZmZlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbG9nLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2RlZmluZSBOT19FUlJPUiAwCisjZGVmaW5lIExPR19UQUcgIkFIQkdMVGVzdCIKKyNkZWZpbmUgQUxPR0koLi4uKSBfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX0lORk8sIExPR19UQUcsIF9fVkFfQVJHU19fKQorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgeworCisvLyBUaGUgJ3N0cmlkZScgZmllbGQgaXMgaWdub3JlZCBieSBBSGFyZHdhcmVCdWZmZXJfYWxsb2NhdGUsIHNvIHdlIGNhbiB1c2UgaXQKKy8vIHRvIHBhc3MgdGhlc2UgZmxhZ3MuCitlbnVtIFRlc3RGbGFncyB7CisgICAga0dsRm9ybWF0ID0gMHgxLCAgLy8gVGhlICdmb3JtYXQnIGZpZWxkIHNwZWNpZmllcyBhIEdMIGZvcm1hdC4KKyAgICBrVXNlU3JnYiA9IDB4MiwgIC8vIFdoZXRoZXIgdG8gdXNlIHRoZSBzUkdCIHRyYW5zZmVyIGZ1bmN0aW9uLgorfTsKKworI2RlZmluZSBGT1JNQVRfQ0FTRSh4KSBjYXNlIEFIQVJEV0FSRUJVRkZFUl9GT1JNQVRfIyN4OiByZXR1cm4gI3g7IGJyZWFrCisjZGVmaW5lIEdMX0ZPUk1BVF9DQVNFKHgpIGNhc2UgeDogcmV0dXJuICN4OyBicmVhazsKK2NvbnN0IGNoYXIqIEFIQkZvcm1hdEFzU3RyaW5nKGludDMyX3QgZm9ybWF0KSB7CisgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgICAgRk9STUFUX0NBU0UoUjhHOEI4QThfVU5PUk0pOworICAgICAgICBGT1JNQVRfQ0FTRShSOEc4QjhYOF9VTk9STSk7CisgICAgICAgIEZPUk1BVF9DQVNFKFI4RzhCOF9VTk9STSk7CisgICAgICAgIEZPUk1BVF9DQVNFKFI1RzZCNV9VTk9STSk7CisgICAgICAgIEZPUk1BVF9DQVNFKFIxNkcxNkIxNkExNl9GTE9BVCk7CisgICAgICAgIEZPUk1BVF9DQVNFKFIxMEcxMEIxMEEyX1VOT1JNKTsKKyAgICAgICAgRk9STUFUX0NBU0UoQkxPQik7CisgICAgICAgIEZPUk1BVF9DQVNFKEQxNl9VTk9STSk7CisgICAgICAgIEZPUk1BVF9DQVNFKEQyNF9VTk9STSk7CisgICAgICAgIEZPUk1BVF9DQVNFKEQyNF9VTk9STV9TOF9VSU5UKTsKKyAgICAgICAgRk9STUFUX0NBU0UoRDMyX0ZMT0FUKTsKKyAgICAgICAgRk9STUFUX0NBU0UoRDMyX0ZMT0FUX1M4X1VJTlQpOworICAgICAgICBGT1JNQVRfQ0FTRShTOF9VSU5UKTsKKyAgICAgICAgR0xfRk9STUFUX0NBU0UoR0xfUkdCOCk7CisgICAgICAgIEdMX0ZPUk1BVF9DQVNFKEdMX1JHQkE4KTsKKyAgICAgICAgR0xfRk9STUFUX0NBU0UoR0xfUkdCNTY1KTsKKyAgICAgICAgR0xfRk9STUFUX0NBU0UoR0xfU1JHQjhfQUxQSEE4KTsKKyAgICAgICAgR0xfRk9STUFUX0NBU0UoR0xfUkdCQTE2Rik7CisgICAgICAgIEdMX0ZPUk1BVF9DQVNFKEdMX1JHQjEwX0EyKTsKKyAgICAgICAgR0xfRk9STUFUX0NBU0UoR0xfU1RFTkNJTF9JTkRFWDgpOworICAgICAgICBHTF9GT1JNQVRfQ0FTRShHTF9ERVBUSDI0X1NURU5DSUw4KTsKKyAgICB9CisgICAgcmV0dXJuICIiOworfQorCitzdGQ6OnN0cmluZyBHZXRUZXN0TmFtZShjb25zdCA6OnRlc3Rpbmc6OlRlc3RQYXJhbUluZm88QUhhcmR3YXJlQnVmZmVyX0Rlc2M+JiBpbmZvKSB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG5hbWU7CisgICAgY29uc3QgY2hhciogZm9ybWF0X3N0cmluZyA9IEFIQkZvcm1hdEFzU3RyaW5nKGluZm8ucGFyYW0uZm9ybWF0KTsKKyAgICBpZiAoc3RybGVuKGZvcm1hdF9zdHJpbmcpID09IDApIHsKKyAgICAgICAgbmFtZSA8PCBpbmZvLmluZGV4OworICAgIH0gZWxzZSB7CisgICAgICAgIG5hbWUgPDwgZm9ybWF0X3N0cmluZzsKKyAgICAgICAgaWYgKGluZm8ucGFyYW0uc3RyaWRlICYga1VzZVNyZ2IpIHsKKyAgICAgICAgICAgIG5hbWUgPDwgIl9zUkdCIjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbmFtZS5zdHIoKTsKK30KKwordW5pb24gSW50RmxvYXQgeworICAgIHVpbnQzMl90IGk7CisgICAgZmxvYXQgZjsKK307CisKKy8vIENvcGllZCBmcm9tIGFuZHJvaWQudXRpbC5IYWxmCitmbG9hdCBGbG9hdEZyb21IYWxmKHVpbnQxNl90IGJpdHMpIHsKKyAgICB1aW50MzJfdCBzID0gYml0cyAmIDB4ODAwMDsKKyAgICB1aW50MzJfdCBlID0gKGJpdHMgJiAweDdDMDApID4+IDEwOworICAgIHVpbnQzMl90IG0gPSBiaXRzICYgMHgzRkY7CisgICAgdWludDMyX3Qgb3V0RSA9IDA7CisgICAgdWludDMyX3Qgb3V0TSA9IDA7CisgICAgaWYgKGUgPT0gMCkgeyAvLyBEZW5vcm1hbCBvciAwCisgICAgICAgIGlmIChtICE9IDApIHsKKyAgICAgICAgICAgIC8vIENvbnZlcnQgZGVub3JtIGZwMTYgaW50byBub3JtYWxpemVkIGZwMzIKKyAgICAgICAgICAgIEludEZsb2F0IHVpZjsKKyAgICAgICAgICAgIHVpZi5pID0gKDEyNiA8PCAyMyk7CisgICAgICAgICAgICBmbG9hdCBkZW5vcm1hbCA9IHVpZi5mOworICAgICAgICAgICAgdWlmLmkgKz0gbTsKKyAgICAgICAgICAgIGZsb2F0IG8gPSB1aWYuZiAtIGRlbm9ybWFsOworICAgICAgICAgICAgcmV0dXJuIHMgPT0gMCA/IG8gOiAtbzsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG91dE0gPSBtIDw8IDEzOworICAgICAgICBpZiAoZSA9PSAweDFmKSB7IC8vIEluZmluaXRlIG9yIE5hTgorICAgICAgICAgICAgb3V0RSA9IDB4ZmY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdXRFID0gZSAtIDE1ICsgMTI3OworICAgICAgICB9CisgICAgfQorICAgIEludEZsb2F0IHJlc3VsdDsKKyAgICByZXN1bHQuaSA9IChzIDw8IDE2KSB8IChvdXRFIDw8IDIzKSB8IG91dE07CisgICAgcmV0dXJuIHJlc3VsdC5mOworfQorCitpbnQgTWlwTGV2ZWxDb3VudCh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSB7CisgICAgcmV0dXJuIDEgKyBzdGF0aWNfY2FzdDxpbnQ+KHN0ZDo6Zmxvb3Ioc3RkOjpsb2cyKHN0YXRpY19jYXN0PGZsb2F0PihzdGQ6Om1heCh3aWR0aCwgaGVpZ2h0KSkpKSk7Cit9CisKK3VpbnQzMl90IFJvdW5kVXBUb1Bvd2VyT2YyKHVpbnQzMl90IHZhbHVlKSB7CisgICAgcmV0dXJuIHZhbHVlID09IDB1ID8gdmFsdWUgOiAxdSA8PCAoMzIgLSBfX2J1aWx0aW5fY2x6KHZhbHVlIC0gMSkpOworfQorCitib29sIEZvcm1hdEhhc0FscGhhKHVpbnQzMl90IGZvcm1hdCkgeworICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgICAgIGNhc2UgQUhBUkRXQVJFQlVGRkVSX0ZPUk1BVF9SOEc4QjhBOF9VTk9STToKKyAgICAgICAgY2FzZSBBSEFSRFdBUkVCVUZGRVJfRk9STUFUX1IxNkcxNkIxNkExNl9GTE9BVDoKKyAgICAgICAgY2FzZSBBSEFSRFdBUkVCVUZGRVJfRk9STUFUX1IxMEcxMEIxMEEyX1VOT1JNOgorICAgICAgICAvLyBUaGlzIG1heSBsb29rIHNjYXJ5LCBidXQgZm9ydHVuYXRlbHkgQUhhcmR3YXJlQnVmZmVyIGZvcm1hdHMgYW5kIEdMIHBpeGVsIGZvcm1hdHMKKyAgICAgICAgLy8gZG8gbm90IG92ZXJsYXAuCisgICAgICAgIGNhc2UgR0xfUkdCQTg6CisgICAgICAgIGNhc2UgR0xfUkdCMTBfQTI6CisgICAgICAgIGNhc2UgR0xfUkdCQTE2RjoKKyAgICAgICAgY2FzZSBHTF9TUkdCOF9BTFBIQTg6CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworYm9vbCBGb3JtYXRJc0Zsb2F0KHVpbnQzMl90IGZvcm1hdCkgeworICAgIHJldHVybiBmb3JtYXQgPT0gQUhBUkRXQVJFQlVGRkVSX0ZPUk1BVF9SMTZHMTZCMTZBMTZfRkxPQVQgfHwgZm9ybWF0ID09IEdMX1JHQkExNkY7Cit9CisKK3ZvaWQgVXBsb2FkRGF0YShjb25zdCBBSGFyZHdhcmVCdWZmZXJfRGVzYyYgZGVzYywgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IHZvaWQqIGRhdGEpIHsKKyAgICBpZiAoZGVzYy5sYXllcnMgPD0gMSkgeworICAgICAgICBnbFRleFN1YkltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgMCwgMCwgZGVzYy53aWR0aCwgZGVzYy5oZWlnaHQsIGZvcm1hdCwgdHlwZSwgZGF0YSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBsYXllciA9IDA7IGxheWVyIDwgZGVzYy5sYXllcnM7ICsrbGF5ZXIpIHsKKyAgICAgICAgICAgIGdsVGV4U3ViSW1hZ2UzRChHTF9URVhUVVJFXzJEX0FSUkFZLCAwLCAwLCAwLCBsYXllciwgZGVzYy53aWR0aCwgZGVzYy5oZWlnaHQsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCB0eXBlLCBkYXRhKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gVXBsb2FkcyBvcGFxdWUgcmVkIHRvIHRoZSBjdXJyZW50bHkgYm91bmQgdGV4dHVyZS4KK3ZvaWQgVXBsb2FkUmVkUGl4ZWxzKGNvbnN0IEFIYXJkd2FyZUJ1ZmZlcl9EZXNjJiBkZXNjKSB7CisgICAgY29uc3QgYm9vbCB1c2Vfc3JnYiA9IGRlc2Muc3RyaWRlICYga1VzZVNyZ2I7CisgICAgZ2xQaXhlbFN0b3JlaShHTF9VTlBBQ0tfQUxJR05NRU5ULCAxKTsKKyAgICBzd2l0Y2ggKGRlc2MuZm9ybWF0KSB7CisgICAgICAgIGNhc2UgQUhBUkRXQVJFQlVGRkVSX0ZPUk1BVF9SNUc2QjVfVU5PUk06CisgICAgICAgIGNhc2UgQUhBUkRXQVJFQlVGRkVSX0ZPUk1BVF9SOEc4QjhfVU5PUk06CisgICAgICAgIGNhc2UgQUhBUkRXQVJFQlVGRkVSX0ZPUk1BVF9SOEc4QjhYOF9VTk9STToKKyAgICAgICAgY2FzZSBHTF9SR0I1NjU6CisgICAgICAgIGNhc2UgR0xfUkdCODogeworICAgICAgICAgICAgLy8gR0xfUkdCNTY1IHN1cHBvcnRzIHVwbG9hZGluZyBHTF9VTlNJR05FRF9CWVRFIGRhdGEuCisgICAgICAgICAgICBjb25zdCBpbnQgc2l6ZSA9IGRlc2Mud2lkdGggKiBkZXNjLmhlaWdodCAqIDM7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBwaXhlbHMobmV3IHVpbnQ4X3Rbc2l6ZV0pOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpICs9IDMpIHsKKyAgICAgICAgICAgICAgICBwaXhlbHNbaV0gPSB1c2Vfc3JnYiA/IDE4OCA6IDI1NTsKKyAgICAgICAgICAgICAgICBwaXhlbHNbaSArIDFdID0gMDsKKyAgICAgICAgICAgICAgICBwaXhlbHNbaSArIDJdID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFVwbG9hZERhdGEoZGVzYywgR0xfUkdCLCBHTF9VTlNJR05FRF9CWVRFLCBwaXhlbHMuZ2V0KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBBSEFSRFdBUkVCVUZGRVJfRk9STUFUX1I4RzhCOEE4X1VOT1JNOgorICAgICAgICBjYXNlIEdMX1JHQkE4OgorICAgICAgICBjYXNlIEdMX1NSR0I4X0FMUEhBODogeworICAgICAgICAgICAgY29uc3QgaW50IHNpemUgPSBkZXNjLndpZHRoICogZGVzYy5oZWlnaHQgKiA0OworICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gcGl4ZWxzKG5ldyB1aW50OF90W3NpemVdKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSArPSA0KSB7CisgICAgICAgICAgICAgICAgcGl4ZWxzW2ldID0gdXNlX3NyZ2IgPyAxODggOiAyNTU7CisgICAgICAgICAgICAgICAgcGl4ZWxzW2kgKyAxXSA9IDA7CisgICAgICAgICAgICAgICAgcGl4ZWxzW2kgKyAyXSA9IDA7CisgICAgICAgICAgICAgICAgcGl4ZWxzW2kgKyAzXSA9IHVzZV9zcmdiID8gMTI4IDogMjU1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgVXBsb2FkRGF0YShkZXNjLCBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCBwaXhlbHMuZ2V0KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBBSEFSRFdBUkVCVUZGRVJfRk9STUFUX1IxNkcxNkIxNkExNl9GTE9BVDoKKyAgICAgICAgY2FzZSBHTF9SR0JBMTZGOiB7CisgICAgICAgICAgICBjb25zdCBpbnQgc2l6ZSA9IGRlc2Mud2lkdGggKiBkZXNjLmhlaWdodCAqIDQ7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8ZmxvYXRbXT4gcGl4ZWxzKG5ldyBmbG9hdFtzaXplXSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkgKz0gNCkgeworICAgICAgICAgICAgICAgIHBpeGVsc1tpXSA9IDEuZjsKKyAgICAgICAgICAgICAgICBwaXhlbHNbaSArIDFdID0gMC5mOworICAgICAgICAgICAgICAgIHBpeGVsc1tpICsgMl0gPSAwLmY7CisgICAgICAgICAgICAgICAgcGl4ZWxzW2kgKyAzXSA9IDEuZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFVwbG9hZERhdGEoZGVzYywgR0xfUkdCQSwgR0xfRkxPQVQsIHBpeGVscy5nZXQoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEFIQVJEV0FSRUJVRkZFUl9GT1JNQVRfUjEwRzEwQjEwQTJfVU5PUk06CisgICAgICAgIGNhc2UgR0xfUkdCMTBfQTI6IHsKKyAgICAgICAgICAgIGNvbnN0IGludCBzaXplID0gZGVzYy53aWR0aCAqIGRlc2MuaGVpZ2h0OworICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQzMl90W10+IHBpeGVscyhuZXcgdWludDMyX3Rbc2l6ZV0pOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgICAgICAgICAgICAvLyBPcGFxdWUgcmVkIGlzIHRvcCAyIGJpdHMgYW5kIGJvdHRvbSAxMCBiaXRzIHNldC4KKyAgICAgICAgICAgICAgICBwaXhlbHNbaV0gPSAweGMwMDAwM2ZmOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVXBsb2FkRGF0YShkZXNjLCBHTF9SR0JBLCBHTF9VTlNJR05FRF9JTlRfMl8xMF8xMF8xMF9SRVZfRVhULCBwaXhlbHMuZ2V0KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDogRkFJTCgpIDw8ICJVbnJlY29nbml6ZWQgQUhhcmR3YXJlQnVmZmVyIGZvcm1hdCI7IGJyZWFrOworICAgIH0KKyAgICBFWFBFQ1RfRVEoR0xlbnVte0dMX05PX0VSUk9SfSwgZ2xHZXRFcnJvcigpKTsKK30KKworLy8gRHJhd3MgdGhlIGZvbGxvd2luZyBjaGVja2VyYm9hcmQgcGF0dGVybiB1c2luZyBnbFNjaXNzb3IgYW5kIGdsQ2xlYXIuCisvLyBUaGUgbnVtYmVyIGFmdGVyIHRoZSBjb2xvciBpcyB0aGUgc3RlbmNpbCB2YWx1ZSBhbmQgdGhlIGZsb2F0aW5nIHBvaW50IG51bWJlciBpcyB0aGUgZGVwdGggdmFsdWUuCisvLyBUaGUgcGF0dGVybiBpcyBhc3ltbWV0cmljIHRvIGRldGVjdCBjb29yZGluYXRlIHN5c3RlbSBtaXh1cHMuCisvLyAgICAgICAgKy0tLS0tKy0tLS0tKyAoVywgSCkKKy8vICAgICAgICB8IE9SMSB8IE9CMiB8CisvLyAgICAgICAgfCAwLjUgfCAwLjAgfAorLy8gICAgICAgICstLS0tLSstLS0tLSsgIFRiID0gdHJhbnNwYXJlbnQgYmxhY2sKKy8vICAgICAgICB8IFRiMCB8IE9HMyB8ICBPUiA9IG9wYXF1ZSByZWQKKy8vICAgICAgICB8IDEuMCB8IDEuMCB8ICBPRyA9IG9wYXF1ZSBncmVlbgorLy8gKDAsIDApICstLS0tLSstLS0tLSsgIE9CID0gb3BhcXVlIGJsdWUKKy8vCit2b2lkIERyYXdDaGVja2VyYm9hcmQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgZ2xFbmFibGUoR0xfU0NJU1NPUl9URVNUKTsKKyAgICBjb25zdCBHTGJpdGZpZWxkIGFsbF9iaXRzID0gR0xfQ09MT1JfQlVGRkVSX0JJVCB8IEdMX0RFUFRIX0JVRkZFUl9CSVQgfCBHTF9TVEVOQ0lMX0JVRkZFUl9CSVQ7CisKKyAgICBnbENsZWFyQ29sb3IoMC5mLCAwLmYsIDAuZiwgMC5mKTsKKyAgICBnbENsZWFyRGVwdGhmKDEuMGYpOworICAgIGdsQ2xlYXJTdGVuY2lsKDApOworICAgIGdsU2Npc3NvcigwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICBnbENsZWFyKGFsbF9iaXRzKTsKKworICAgIGdsQ2xlYXJDb2xvcigxLmYsIDAuZiwgMC5mLCAxLmYpOworICAgIGdsQ2xlYXJEZXB0aGYoMC41Zik7CisgICAgZ2xDbGVhclN0ZW5jaWwoMSk7CisgICAgZ2xTY2lzc29yKDAsIGhlaWdodCAvIDIsIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMik7CisgICAgZ2xDbGVhcihhbGxfYml0cyk7CisKKyAgICBnbENsZWFyQ29sb3IoMC5mLCAxLmYsIDAuZiwgMS5mKTsKKyAgICBnbENsZWFyRGVwdGhmKDEuMGYpOworICAgIGdsQ2xlYXJTdGVuY2lsKDMpOworICAgIGdsU2Npc3Nvcih3aWR0aCAvIDIsIDAsIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMik7CisgICAgZ2xDbGVhcihhbGxfYml0cyk7CisKKyAgICBnbENsZWFyQ29sb3IoMC5mLCAwLmYsIDEuZiwgMS5mKTsKKyAgICBnbENsZWFyRGVwdGhmKDAuZik7CisgICAgZ2xDbGVhclN0ZW5jaWwoMik7CisgICAgZ2xTY2lzc29yKHdpZHRoIC8gMiwgaGVpZ2h0IC8gMiwgd2lkdGggLyAyLCBoZWlnaHQgLyAyKTsKKyAgICBnbENsZWFyKGFsbF9iaXRzKTsKKworICAgIGdsRGlzYWJsZShHTF9TQ0lTU09SX1RFU1QpOworICAgIEVYUEVDVF9FUShHTGVudW17R0xfTk9fRVJST1J9LCBnbEdldEVycm9yKCkpOworfQorCitlbnVtIEdvbGRlbkNvbG9yIHsKKyAgICBrWmVybywgIC8vIGFsbCB6ZXJvLCBpLmUuLCB0cmFuc3BhcmVudCBibGFjaworICAgIGtCbGFjaywgIC8vIG9wYXF1ZSBibGFjaworICAgIGtXaGl0ZSwgIC8vIG9wYXF1ZSB3aGl0ZQorICAgIGtSZWQsICAvLyBvcGFxdWUgcmVkCisgICAga0dyZWVuLCAgLy8gb3BhcXVlIGdyZWVuCisgICAga0JsdWUsICAvLyBvcGFxdWUgYmx1ZQorICAgIGtSZWQ1MCwgIC8vIDUwJSBwcmVtdWx0aXBsaWVkIHJlZCwgaS5lLiwgKDAuNSwgMCwgMCwgMC41KQorICAgIGtSZWQ1MFNyZ2IsICAvLyA1MCUgcHJlbXVsdGlwbGllZCByZWQgdW5kZXIgc1JHQiB0cmFuc2ZlciBmdW5jdGlvbgorICAgIGtSZWQ1MEFscGhhMTAwLCAgLy8gT3BhcXVlIDUwJSByZWQKK307CisKK3N0cnVjdCBHb2xkZW5QaXhlbCB7CisgICAgaW50IHg7CisgICAgaW50IHk7CisgICAgR29sZGVuQ29sb3IgY29sb3I7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgQ2hlY2tHb2xkZW5QaXhlbChpbnQgeCwgaW50IHksIGNvbnN0IHN0ZDo6YXJyYXk8VCwgND4mIGdvbGRlbiwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OmFycmF5PFQsIDQ+JiBhY3R1YWwpIHsKKyAgICBFWFBFQ1RfRVEoR0xlbnVte0dMX05PX0VSUk9SfSwgZ2xHZXRFcnJvcigpKTsKKyAgICBFWFBFQ1RfRVEoZ29sZGVuLCBhY3R1YWwpIDw8ICJQaXhlbCBkb2Vzbid0IG1hdGNoIGF0IFg9IiA8PCB4IDw8ICIsIFk9IiA8PCB5OworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgQ2hlY2tHb2xkZW5QaXhlbChpbnQgeCwgaW50IHksIGNvbnN0IHN0ZDo6YXJyYXk8VCwgND4mIG1pbmltdW0sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjphcnJheTxULCA0PiYgbWF4aW11bSwgY29uc3Qgc3RkOjphcnJheTxULCA0PiYgYWN0dWFsKSB7CisgICAgRVhQRUNUX0VRKEdMZW51bXtHTF9OT19FUlJPUn0sIGdsR2V0RXJyb3IoKSk7CisgICAgYm9vbCBpbl9yYW5nZSA9IHRydWU7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyArK2kpIHsKKyAgICAgICAgaWYgKGFjdHVhbFtpXSA8IG1pbmltdW1baV0gfHwgYWN0dWFsW2ldID4gbWF4aW11bVtpXSkgeworICAgICAgICAgICAgaW5fcmFuZ2UgPSBmYWxzZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmICghaW5fcmFuZ2UpIHsKKyAgICAgICAgRVhQRUNUX05FKGFjdHVhbCwgYWN0dWFsKSA8PCAiUGl4ZWwgb3V0IG9mIGFjY2VwdGFibGUgcmFuZ2UgYXQgWD0iIDw8IHggPDwgIiwgWT0iIDw8IHk7CisgICAgfQorfQorCit2b2lkIENoZWNrR29sZGVuUGl4ZWwoY29uc3QgR29sZGVuUGl4ZWwmIGdvbGRlbiwgY29uc3Qgc3RkOjphcnJheTx1aW50OF90LCA0PiYgcGl4ZWwsCisgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0KSB7CisgICAgc3RkOjphcnJheTx1aW50OF90LCA0PiBnb2xkZW5fcGl4ZWwgPSB7MCwgMCwgMCwgMjU1fTsKKyAgICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDQ+IGdvbGRlbl9tYXggPSB7MCwgMCwgMCwgMjU1fTsKKyAgICBib29sIHVzZV9yYW5nZSA9IGZhbHNlOworICAgIC8vIEFkanVzdCBjb2xvciB2YWx1ZXMuCisgICAgc3dpdGNoIChnb2xkZW4uY29sb3IpIHsKKyAgICAgICAgY2FzZSBrUmVkOiBnb2xkZW5fcGl4ZWxbMF0gPSAyNTU7IGJyZWFrOworICAgICAgICBjYXNlIGtSZWQ1MDoKKyAgICAgICAgY2FzZSBrUmVkNTBBbHBoYTEwMDoKKyAgICAgICAgICAgIHVzZV9yYW5nZSA9IHRydWU7CisgICAgICAgICAgICBnb2xkZW5fcGl4ZWxbMF0gPSAxMjc7CisgICAgICAgICAgICBnb2xkZW5fbWF4WzBdID0gMTI4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Uga1JlZDUwU3JnYjoKKyAgICAgICAgICAgIHVzZV9yYW5nZSA9IHRydWU7CisgICAgICAgICAgICBnb2xkZW5fcGl4ZWxbMF0gPSAxODc7CisgICAgICAgICAgICBnb2xkZW5fbWF4WzBdID0gMTg4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Uga0dyZWVuOiBnb2xkZW5fcGl4ZWxbMV0gPSAyNTU7IGJyZWFrOworICAgICAgICBjYXNlIGtCbHVlOiBnb2xkZW5fcGl4ZWxbMl0gPSAyNTU7IGJyZWFrOworICAgICAgICBjYXNlIGtaZXJvOiBpZiAoRm9ybWF0SGFzQWxwaGEoZm9ybWF0KSkgZ29sZGVuX3BpeGVsWzNdID0gMDsgYnJlYWs7CisgICAgICAgIGNhc2Uga1doaXRlOiBnb2xkZW5fcGl4ZWxbMF0gPSAyNTU7IGdvbGRlbl9waXhlbFsxXSA9IDI1NTsgZ29sZGVuX3BpeGVsWzJdID0gMjU1OyBicmVhazsKKyAgICAgICAgY2FzZSBrQmxhY2s6IGJyZWFrOworICAgICAgICBkZWZhdWx0OiBGQUlMKCkgPDwgIlVucmVjb2duaXplZCBnb2xkZW4gcGl4ZWwgY29sb3IiOworICAgIH0KKyAgICAvLyBBZGp1c3QgYWxwaGEuCisgICAgaWYgKGdvbGRlbi5jb2xvciA9PSBrUmVkNTAgfHwgZ29sZGVuLmNvbG9yID09IGtSZWQ1MFNyZ2IpIHsKKyAgICAgICAgaWYgKGZvcm1hdCA9PSBHTF9SR0IxMF9BMiB8fCBmb3JtYXQgPT0gQUhBUkRXQVJFQlVGRkVSX0ZPUk1BVF9SMTBHMTBCMTBBMl9VTk9STSkgeworICAgICAgICAgICAgZ29sZGVuX3BpeGVsWzNdID0gODU7CisgICAgICAgICAgICBnb2xkZW5fbWF4WzNdID0gMTcwOworICAgICAgICB9IGVsc2UgaWYgKEZvcm1hdEhhc0FscGhhKGZvcm1hdCkpIHsKKyAgICAgICAgICAgIGdvbGRlbl9waXhlbFszXSA9IDEyNzsKKyAgICAgICAgICAgIGdvbGRlbl9tYXhbM10gPSAxMjg7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gQWRqdXN0IGNvbG9yIHJhbmdlIGZvciBSR0I1NjUuCisgICAgaWYgKChnb2xkZW4uY29sb3IgPT0ga1JlZDUwIHx8IGdvbGRlbi5jb2xvciA9PSBrUmVkNTBBbHBoYTEwMCkgJiYKKyAgICAgICAgKGZvcm1hdCA9PSBHTF9SR0I1NjUgfHwgZm9ybWF0ID09IEFIQVJEV0FSRUJVRkZFUl9GT1JNQVRfUjVHNkI1X1VOT1JNKSkgeworICAgICAgICBnb2xkZW5fcGl4ZWxbMF0gPSAxMjM7CisgICAgICAgIGdvbGRlbl9tYXhbMF0gPSAxMzI7CisgICAgfQorCisgICAgaWYgKHVzZV9yYW5nZSkgeworICAgICAgICBDaGVja0dvbGRlblBpeGVsKGdvbGRlbi54LCBnb2xkZW4ueSwgZ29sZGVuX3BpeGVsLCBnb2xkZW5fbWF4LCBwaXhlbCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQ2hlY2tHb2xkZW5QaXhlbChnb2xkZW4ueCwgZ29sZGVuLnksIGdvbGRlbl9waXhlbCwgcGl4ZWwpOworICAgIH0KK30KKwordm9pZCBDaGVja0dvbGRlblBpeGVsKGNvbnN0IEdvbGRlblBpeGVsJiBnb2xkZW4sIGNvbnN0IHN0ZDo6YXJyYXk8ZmxvYXQsIDQ+JiBwaXhlbCkgeworICAgIHN0ZDo6YXJyYXk8ZmxvYXQsIDQ+IGdvbGRlbl9waXhlbCA9IHswLmYsIDAuZiwgMC5mLCAxLmZ9OworICAgIHN3aXRjaCAoZ29sZGVuLmNvbG9yKSB7CisgICAgICAgIGNhc2Uga1JlZDogZ29sZGVuX3BpeGVsWzBdID0gMS5mOyBicmVhazsKKyAgICAgICAgY2FzZSBrUmVkNTA6IGdvbGRlbl9waXhlbFswXSA9IDAuNWY7IGdvbGRlbl9waXhlbFszXSA9IDAuNWY7IGJyZWFrOworICAgICAgICBjYXNlIGtHcmVlbjogZ29sZGVuX3BpeGVsWzFdID0gMS5mOyBicmVhazsKKyAgICAgICAgY2FzZSBrQmx1ZTogZ29sZGVuX3BpeGVsWzJdID0gMS5mOyBicmVhazsKKyAgICAgICAgY2FzZSBrWmVybzogZ29sZGVuX3BpeGVsWzNdID0gMC5mOyBicmVhazsKKyAgICAgICAgY2FzZSBrV2hpdGU6IGdvbGRlbl9waXhlbFswXSA9IDEuZjsgZ29sZGVuX3BpeGVsWzFdID0gMS5mOyBnb2xkZW5fcGl4ZWxbMl0gPSAxLmY7IGJyZWFrOworICAgICAgICBjYXNlIGtCbGFjazogYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IEZBSUwoKSA8PCAiVW5yZWNvZ25pemVkIGdvbGRlbiBwaXhlbCBjb2xvciI7CisgICAgfQorICAgIENoZWNrR29sZGVuUGl4ZWwoZ29sZGVuLngsIGdvbGRlbi55LCBnb2xkZW5fcGl4ZWwsIHBpeGVsKTsKK30KKwordm9pZCBDaGVja0dvbGRlblBpeGVscyhjb25zdCBzdGQ6OnZlY3RvcjxHb2xkZW5QaXhlbD4mIGdvbGRlbnMsIHVpbnQzMl90IGZvcm1hdCkgeworICAgIC8vIFdlIGN1cnJlbnRseSBkbyBub3QgdGVzdCBhbnkgZmxvYXQgZm9ybWF0cyB0aGF0IGRvbid0IGhhdmUgYWxwaGEuCisgICAgRVhQRUNUX1RSVUUoRm9ybWF0SXNGbG9hdChmb3JtYXQpID8gRm9ybWF0SGFzQWxwaGEoZm9ybWF0KSA6IHRydWUpOworICAgIGdsUGl4ZWxTdG9yZWkoR0xfUEFDS19BTElHTk1FTlQsIDEpOworICAgIC8vIEluIE9wZW5HTCwgWSBheGlzIGdyb3dzIHVwLCBzbyBib3R0b20gPSBtaW5pbXVtIFkgY29vcmRpbmF0ZS4KKyAgICBpbnQgYm90dG9tID0gSU5UX01BWCwgbGVmdCA9IElOVF9NQVgsIHJpZ2h0ID0gMCwgdG9wID0gMDsKKyAgICBmb3IgKGNvbnN0IEdvbGRlblBpeGVsJiBnb2xkZW4gOiBnb2xkZW5zKSB7CisgICAgICAgIGxlZnQgPSBzdGQ6Om1pbihsZWZ0LCBnb2xkZW4ueCk7CisgICAgICAgIHJpZ2h0ID0gc3RkOjptYXgocmlnaHQsIGdvbGRlbi54KTsKKyAgICAgICAgYm90dG9tID0gc3RkOjptaW4oYm90dG9tLCBnb2xkZW4ueSk7CisgICAgICAgIHRvcCA9IHN0ZDo6bWF4KHRvcCwgZ29sZGVuLnkpOworICAgICAgICBpZiAoRm9ybWF0SXNGbG9hdChmb3JtYXQpKSB7CisgICAgICAgICAgICBzdGQ6OmFycmF5PGZsb2F0LCA0PiBwaXhlbCA9IHswLjVmLCAwLjVmLCAwLjVmLCAwLjVmfTsKKyAgICAgICAgICAgIGdsUmVhZFBpeGVscyhnb2xkZW4ueCwgZ29sZGVuLnksIDEsIDEsIEdMX1JHQkEsIEdMX0ZMT0FULCBwaXhlbC5kYXRhKCkpOworICAgICAgICAgICAgQ2hlY2tHb2xkZW5QaXhlbChnb2xkZW4sIHBpeGVsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0ZDo6YXJyYXk8dWludDhfdCwgND4gcGl4ZWwgPSB7MTI3LCAxMjcsIDEyNywgMTI3fTsKKyAgICAgICAgICAgIGdsUmVhZFBpeGVscyhnb2xkZW4ueCwgZ29sZGVuLnksIDEsIDEsIEdMX1JHQkEsIEdMX1VOU0lHTkVEX0JZVEUsIHBpeGVsLmRhdGEoKSk7CisgICAgICAgICAgICBDaGVja0dvbGRlblBpeGVsKGdvbGRlbiwgcGl4ZWwsIGZvcm1hdCk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gUmVwZWF0IHRoZSB0ZXN0LCBidXQgcmVhZCBiYWNrIGFsbCB0aGUgbmVjZXNzYXJ5IHBpeGVscyBpbiBhIHNpbmdsZSBnbFJlYWRQaXhlbHMgY2FsbC4KKyAgICBjb25zdCBpbnQgd2lkdGggPSByaWdodCAtIGxlZnQgKyAxOworICAgIGNvbnN0IGludCBoZWlnaHQgPSB0b3AgLSBib3R0b20gKyAxOworICAgIGlmIChGb3JtYXRJc0Zsb2F0KGZvcm1hdCkpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGZsb2F0W10+IHBpeGVscyhuZXcgZmxvYXRbd2lkdGggKiBoZWlnaHQgKiA0XSk7CisgICAgICAgIGdsUmVhZFBpeGVscyhsZWZ0LCBib3R0b20sIHdpZHRoLCBoZWlnaHQsIEdMX1JHQkEsIEdMX0ZMT0FULCBwaXhlbHMuZ2V0KCkpOworICAgICAgICBFWFBFQ1RfRVEoR0xlbnVte0dMX05PX0VSUk9SfSwgZ2xHZXRFcnJvcigpKTsKKyAgICAgICAgZm9yIChjb25zdCBHb2xkZW5QaXhlbCYgZ29sZGVuIDogZ29sZGVucykgeworICAgICAgICAgICAgZmxvYXQqIHBpeGVsID0gcGl4ZWxzLmdldCgpICsgKChnb2xkZW4ueSAtIGJvdHRvbSkgKiB3aWR0aCArIGdvbGRlbi54IC0gbGVmdCkgKiA0OworICAgICAgICAgICAgc3RkOjphcnJheTxmbG9hdCwgND4gcGl4ZWxfYXJyYXk7CisgICAgICAgICAgICBtZW1jcHkocGl4ZWxfYXJyYXkuZGF0YSgpLCBwaXhlbCwgNCAqIHNpemVvZihmbG9hdCkpOworICAgICAgICAgICAgQ2hlY2tHb2xkZW5QaXhlbChnb2xkZW4sIHBpeGVsX2FycmF5KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IHBpeGVscyhuZXcgdWludDhfdFt3aWR0aCAqIGhlaWdodCAqIDRdKTsKKyAgICAgICAgZ2xSZWFkUGl4ZWxzKGxlZnQsIGJvdHRvbSwgd2lkdGgsIGhlaWdodCwgR0xfUkdCQSwgR0xfVU5TSUdORURfQllURSwgcGl4ZWxzLmdldCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEdMZW51bXtHTF9OT19FUlJPUn0sIGdsR2V0RXJyb3IoKSk7CisgICAgICAgIGZvciAoY29uc3QgR29sZGVuUGl4ZWwmIGdvbGRlbiA6IGdvbGRlbnMpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QqIHBpeGVsID0gcGl4ZWxzLmdldCgpICsgKChnb2xkZW4ueSAtIGJvdHRvbSkgKiB3aWR0aCArIGdvbGRlbi54IC0gbGVmdCkgKiA0OworICAgICAgICAgICAgc3RkOjphcnJheTx1aW50OF90LCA0PiBwaXhlbF9hcnJheTsKKyAgICAgICAgICAgIG1lbWNweShwaXhlbF9hcnJheS5kYXRhKCksIHBpeGVsLCA0KTsKKyAgICAgICAgICAgIENoZWNrR29sZGVuUGl4ZWwoZ29sZGVuLCBwaXhlbF9hcnJheSwgZm9ybWF0KTsKKyAgICAgICAgfQorICAgIH0KK30KKworY29uc3QgY2hhcioga1ZlcnRleFNoYWRlciA9IFIiZ2xzbCgjdmVyc2lvbiAxMDAKKyAgICBhdHRyaWJ1dGUgdmVjMiBhUG9zaXRpb247CisgICAgYXR0cmlidXRlIGZsb2F0IGFEZXB0aDsKKyAgICB1bmlmb3JtIG1lZGl1bXAgZmxvYXQgdVNjYWxlOworICAgIHZhcnlpbmcgbWVkaXVtcCB2ZWMyIHZUZXhDb29yZHM7CisgICAgdm9pZCBtYWluKCkgeworICAgICAgICB2VGV4Q29vcmRzID0gKHZlYzIoMS4wKSArIGFQb3NpdGlvbikgKiAwLjU7CisgICAgICAgIGdsX1Bvc2l0aW9uLnh5ID0gYVBvc2l0aW9uICogdVNjYWxlOworICAgICAgICBnbF9Qb3NpdGlvbi56ID0gYURlcHRoOworICAgICAgICBnbF9Qb3NpdGlvbi53ID0gMS4wOworICAgIH0KKylnbHNsIjsKKworY29uc3QgY2hhcioga1RleHR1cmVGcmFnbWVudFNoYWRlciA9IFIiZ2xzbCgjdmVyc2lvbiAxMDAKKyAgICBwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsKKyAgICB2YXJ5aW5nIG1lZGl1bXAgdmVjMiB2VGV4Q29vcmRzOworICAgIHVuaWZvcm0gbG93cCBzYW1wbGVyMkQgdVRleHR1cmU7CisgICAgdm9pZCBtYWluKCkgeworICAgICAgICBnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQodVRleHR1cmUsIHZUZXhDb29yZHMpOworICAgIH0KKylnbHNsIjsKKworY29uc3QgY2hhcioga0N1YmVNYXBGcmFnbWVudFNoYWRlciA9IFIiZ2xzbCgjdmVyc2lvbiAxMDAKKyAgICBwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsKKyAgICB2YXJ5aW5nIG1lZGl1bXAgdmVjMiB2VGV4Q29vcmRzOworICAgIHVuaWZvcm0gbG93cCBzYW1wbGVyQ3ViZSB1VGV4dHVyZTsKKyAgICB1bmlmb3JtIG1lZGl1bXAgdmVjMyB1RmFjZVZlY3RvcjsKKyAgICB2b2lkIG1haW4oKSB7CisgICAgICAgIHZlYzIgc2NhbGVkVGV4Q29vcmRzID0gKDIuMCAqIHZUZXhDb29yZHMpIC0gdmVjMigxLjApOworICAgICAgICB2ZWMzIGNvb3JkcyA9IHVGYWNlVmVjdG9yOworICAgICAgICBpZiAodUZhY2VWZWN0b3IueCA+IDAuMCkgeworICAgICAgICAgICAgY29vcmRzLnogPSAtc2NhbGVkVGV4Q29vcmRzLng7CisgICAgICAgICAgICBjb29yZHMueSA9IC1zY2FsZWRUZXhDb29yZHMueTsKKyAgICAgICAgfQorICAgICAgICBpZiAodUZhY2VWZWN0b3IueCA8IDAuMCkgeworICAgICAgICAgICAgY29vcmRzLnogPSBzY2FsZWRUZXhDb29yZHMueDsKKyAgICAgICAgICAgIGNvb3Jkcy55ID0gLXNjYWxlZFRleENvb3Jkcy55OworICAgICAgICB9CisgICAgICAgIGlmICh1RmFjZVZlY3Rvci55ID4gMC4wKSB7CisgICAgICAgICAgICBjb29yZHMueCA9IHNjYWxlZFRleENvb3Jkcy54OworICAgICAgICAgICAgY29vcmRzLnogPSBzY2FsZWRUZXhDb29yZHMueTsKKyAgICAgICAgfQorICAgICAgICBpZiAodUZhY2VWZWN0b3IueSA8IDAuMCkgeworICAgICAgICAgICAgY29vcmRzLnggPSBzY2FsZWRUZXhDb29yZHMueDsKKyAgICAgICAgICAgIGNvb3Jkcy56ID0gLXNjYWxlZFRleENvb3Jkcy55OworICAgICAgICB9CisgICAgICAgIGlmICh1RmFjZVZlY3Rvci56ID4gMC4wKSB7CisgICAgICAgICAgICBjb29yZHMueCA9IHNjYWxlZFRleENvb3Jkcy54OworICAgICAgICAgICAgY29vcmRzLnkgPSAtc2NhbGVkVGV4Q29vcmRzLnk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHVGYWNlVmVjdG9yLnogPCAwLjApIHsKKyAgICAgICAgICAgIGNvb3Jkcy54ID0gLXNjYWxlZFRleENvb3Jkcy54OworICAgICAgICAgICAgY29vcmRzLnkgPSAtc2NhbGVkVGV4Q29vcmRzLnk7CisgICAgICAgIH0KKyAgICAgICAgZ2xfRnJhZ0NvbG9yID0gdGV4dHVyZUN1YmUodVRleHR1cmUsIGNvb3Jkcyk7CisgICAgfQorKWdsc2wiOworCitjb25zdCBjaGFyKiBrQ29sb3JGcmFnbWVudFNoYWRlciA9IFIiZ2xzbCgjdmVyc2lvbiAxMDAKKyAgICBwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsKKyAgICB1bmlmb3JtIGxvd3AgdmVjNCB1Q29sb3I7CisgICAgdm9pZCBtYWluKCkgeworICAgICAgICBnbF9GcmFnQ29sb3IgPSB1Q29sb3I7CisgICAgfQorKWdsc2wiOworCitjb25zdCBjaGFyKiBrVmVydGV4U2hhZGVyRXMzeCA9IFIiZ2xzbCgKKyAgICBpbiB2ZWMyIGFQb3NpdGlvbjsKKyAgICBpbiBmbG9hdCBhRGVwdGg7CisgICAgdW5pZm9ybSBtZWRpdW1wIGZsb2F0IHVTY2FsZTsKKyAgICBvdXQgbWVkaXVtcCB2ZWMyIHZUZXhDb29yZHM7CisgICAgdm9pZCBtYWluKCkgeworICAgICAgICB2VGV4Q29vcmRzID0gKHZlYzIoMS4wKSArIGFQb3NpdGlvbikgKiAwLjU7CisgICAgICAgIGdsX1Bvc2l0aW9uLnh5ID0gYVBvc2l0aW9uICogdVNjYWxlOworICAgICAgICBnbF9Qb3NpdGlvbi56ID0gYURlcHRoOworICAgICAgICBnbF9Qb3NpdGlvbi53ID0gMS4wOworICAgIH0KKylnbHNsIjsKKworY29uc3QgY2hhcioga1NzYm9Db21wdXRlU2hhZGVyRXMzMSA9IFIiZ2xzbCgjdmVyc2lvbiAzMTAgZXMKKyAgICBsYXlvdXQobG9jYWxfc2l6ZV94ID0gMSkgaW47CisgICAgbGF5b3V0KHN0ZDQzMCwgYmluZGluZz0wKSBidWZmZXIgT3V0cHV0IHsKKyAgICAgICAgdWludCBkYXRhW107CisgICAgfSBiT3V0cHV0OworICAgIHZvaWQgbWFpbigpIHsKKyAgICAgICAgYk91dHB1dC5kYXRhW2dsX0dsb2JhbEludm9jYXRpb25JRC54XSA9CisgICAgICAgICAgICBnbF9HbG9iYWxJbnZvY2F0aW9uSUQueCAqIDN1OworICAgIH0KKylnbHNsIjsKKworY29uc3QgY2hhcioga0FycmF5RnJhZ21lbnRTaGFkZXJFczMwID0gUiJnbHNsKCN2ZXJzaW9uIDMwMCBlcworICAgIHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OworICAgIGluIG1lZGl1bXAgdmVjMiB2VGV4Q29vcmRzOworICAgIHVuaWZvcm0gbG93cCBzYW1wbGVyMkRBcnJheSB1VGV4dHVyZTsKKyAgICB1bmlmb3JtIG1lZGl1bXAgZmxvYXQgdUxheWVyOworICAgIG91dCBtZWRpdW1wIHZlYzQgY29sb3I7CisgICAgdm9pZCBtYWluKCkgeworICAgICAgICBjb2xvciA9IHRleHR1cmUodVRleHR1cmUsIHZlYzModlRleENvb3JkcywgdUxheWVyKSk7CisgICAgfQorKWdsc2wiOworCitjb25zdCBjaGFyKiBrQ3ViZU1hcEFycmF5RnJhZ21lbnRTaGFkZXJFczMyID0gUiJnbHNsKCN2ZXJzaW9uIDMyMCBlcworICAgIHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OworICAgIGluIG1lZGl1bXAgdmVjMiB2VGV4Q29vcmRzOworICAgIHVuaWZvcm0gbG93cCBzYW1wbGVyQ3ViZUFycmF5IHVUZXh0dXJlOworICAgIHVuaWZvcm0gbWVkaXVtcCBmbG9hdCB1TGF5ZXI7CisgICAgdW5pZm9ybSBtZWRpdW1wIHZlYzMgdUZhY2VWZWN0b3I7CisgICAgb3V0IG1lZGl1bXAgdmVjNCBjb2xvcjsKKyAgICB2b2lkIG1haW4oKSB7CisgICAgICAgIHZlYzIgc2NhbGVkVGV4Q29vcmRzID0gKDIuMCAqIHZUZXhDb29yZHMpIC0gdmVjMigxLjApOworICAgICAgICB2ZWM0IGNvb3JkcyA9IHZlYzQodUZhY2VWZWN0b3IsIHVMYXllcik7CisgICAgICAgIGlmICh1RmFjZVZlY3Rvci54ID4gMC4wKSB7CisgICAgICAgICAgICBjb29yZHMueiA9IC1zY2FsZWRUZXhDb29yZHMueDsKKyAgICAgICAgICAgIGNvb3Jkcy55ID0gLXNjYWxlZFRleENvb3Jkcy55OworICAgICAgICB9CisgICAgICAgIGlmICh1RmFjZVZlY3Rvci54IDwgMC4wKSB7CisgICAgICAgICAgICBjb29yZHMueiA9IHNjYWxlZFRleENvb3Jkcy54OworICAgICAgICAgICAgY29vcmRzLnkgPSAtc2NhbGVkVGV4Q29vcmRzLnk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHVGYWNlVmVjdG9yLnkgPiAwLjApIHsKKyAgICAgICAgICAgIGNvb3Jkcy54ID0gc2NhbGVkVGV4Q29vcmRzLng7CisgICAgICAgICAgICBjb29yZHMueiA9IHNjYWxlZFRleENvb3Jkcy55OworICAgICAgICB9CisgICAgICAgIGlmICh1RmFjZVZlY3Rvci55IDwgMC4wKSB7CisgICAgICAgICAgICBjb29yZHMueCA9IHNjYWxlZFRleENvb3Jkcy54OworICAgICAgICAgICAgY29vcmRzLnogPSAtc2NhbGVkVGV4Q29vcmRzLnk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHVGYWNlVmVjdG9yLnogPiAwLjApIHsKKyAgICAgICAgICAgIGNvb3Jkcy54ID0gc2NhbGVkVGV4Q29vcmRzLng7CisgICAgICAgICAgICBjb29yZHMueSA9IC1zY2FsZWRUZXhDb29yZHMueTsKKyAgICAgICAgfQorICAgICAgICBpZiAodUZhY2VWZWN0b3IueiA8IDAuMCkgeworICAgICAgICAgICAgY29vcmRzLnggPSAtc2NhbGVkVGV4Q29vcmRzLng7CisgICAgICAgICAgICBjb29yZHMueSA9IC1zY2FsZWRUZXhDb29yZHMueTsKKyAgICAgICAgfQorICAgICAgICBjb2xvciA9IHRleHR1cmUodVRleHR1cmUsIGNvb3Jkcyk7CisgICAgfQorKWdsc2wiOworCitjb25zdCBjaGFyKiBrU3RlbmNpbEZyYWdtZW50U2hhZGVyRXMzMCA9IFIiZ2xzbCgjdmVyc2lvbiAzMDAgZXMKKyAgICBwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsKKyAgICBpbiBtZWRpdW1wIHZlYzIgdlRleENvb3JkczsKKyAgICB1bmlmb3JtIGxvd3AgdXNhbXBsZXIyRCB1VGV4dHVyZTsKKyAgICBvdXQgbWVkaXVtcCB2ZWM0IGNvbG9yOworICAgIHZvaWQgbWFpbigpIHsKKyAgICAgICAgdXZlYzQgc3RlbmNpbCA9IHRleHR1cmUodVRleHR1cmUsIHZUZXhDb29yZHMpOworICAgICAgICBjb2xvci5yID0gc3RlbmNpbC54ID09IDF1ID8gMS4wIDogMC4wOworICAgICAgICBjb2xvci5nID0gc3RlbmNpbC54ID09IDN1ID8gMS4wIDogMC4wOworICAgICAgICBjb2xvci5iID0gc3RlbmNpbC54ID09IDJ1ID8gMS4wIDogMC4wOworICAgICAgICBjb2xvci5hID0gc3RlbmNpbC54ID09IDB1ID8gMC4wIDogMS4wOworICAgIH0KKylnbHNsIjsKKworY29uc3QgY2hhcioga1N0ZW5jaWxBcnJheUZyYWdtZW50U2hhZGVyRXMzMCA9IFIiZ2xzbCgjdmVyc2lvbiAzMDAgZXMKKyAgICBwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsKKyAgICBpbiBtZWRpdW1wIHZlYzIgdlRleENvb3JkczsKKyAgICB1bmlmb3JtIGxvd3AgdXNhbXBsZXIyREFycmF5IHVUZXh0dXJlOworICAgIHVuaWZvcm0gbWVkaXVtcCBmbG9hdCB1TGF5ZXI7CisgICAgb3V0IG1lZGl1bXAgdmVjNCBjb2xvcjsKKyAgICB2b2lkIG1haW4oKSB7CisgICAgICAgIHV2ZWM0IHN0ZW5jaWwgPSB0ZXh0dXJlKHVUZXh0dXJlLCB2ZWMzKHZUZXhDb29yZHMsIHVMYXllcikpOworICAgICAgICBjb2xvci5yID0gc3RlbmNpbC54ID09IDF1ID8gMS4wIDogMC4wOworICAgICAgICBjb2xvci5nID0gc3RlbmNpbC54ID09IDN1ID8gMS4wIDogMC4wOworICAgICAgICBjb2xvci5iID0gc3RlbmNpbC54ID09IDJ1ID8gMS4wIDogMC4wOworICAgICAgICBjb2xvci5hID0gc3RlbmNpbC54ID09IDB1ID8gMC4wIDogMS4wOworICAgIH0KKylnbHNsIjsKKworLy8gSW50ZXJsZWF2ZWQgWCBhbmQgWSBjb29yZGluYXRlcyBmb3IgMiB0cmlhbmdsZXMgZm9ybWluZyBhIHF1YWQgd2l0aCBDQ1cKKy8vIG9yaWVudGF0aW9uLgorY29uc3QgZmxvYXQga1F1YWRQb3NpdGlvbnNbXSA9IHsKKyAgICAtMS5mLCAtMS5mLCAxLmYsIDEuZiwgLTEuZiwgMS5mLAorICAgIC0xLmYsIC0xLmYsIDEuZiwgLTEuZiwgMS5mLCAxLmYsCit9OworY29uc3QgR0xzaXplaSBrUXVhZFZlcnRleENvdW50ID0gNjsKKworLy8gSW50ZXJsZWF2ZWQgWCwgWSBhbmQgWiBjb29yZGluYXRlcyBmb3IgNCB0cmlhbmdsZXMgZm9ybWluZyBhICJweXJhbWlkIiBhcworLy8gc2VlbiBmcm9tIGFib3ZlLiBUaGUgY2VudGVyIHZlcnRleCBoYXMgWj0xLCB3aGlsZSB0aGUgZWRnZSB2ZXJ0aWNlcyBoYXZlIFo9LTEuCisvLyBJdCBsb29rcyBsaWtlIHRoaXM6CisvLworLy8gICAgICAgICstLS0rIDEsIDEKKy8vICAgICAgICB8XCAvfAorLy8gICAgICAgIHwgeCB8CisvLyAgICAgICAgfC8gXHwKKy8vIC0xLCAtMSArLS0tKworY29uc3QgZmxvYXQga1B5cmFtaWRQb3NpdGlvbnNbXSA9IHsKKyAgICAtMS5mLCAtMS5mLCAtMS5mLCAwLmYsIDAuZiwgMS5mLCAtMS5mLCAxLmYsIC0xLmYsCisgICAgLTEuZiwgMS5mLCAtMS5mLCAwLmYsIDAuZiwgMS5mLCAxLmYsIDEuZiwgLTEuZiwKKyAgICAxLmYsIDEuZiwgLTEuZiwgMC5mLCAwLmYsIDEuZiwgMS5mLCAtMS5mLCAtMS5mLAorICAgIDEuZiwgLTEuZiwgLTEuZiwgMC5mLCAwLmYsIDEuZiwgLTEuZiwgLTEuZiwgLTEuZiwKK307Citjb25zdCBHTHNpemVpIGtQeXJhbWlkVmVydGV4Q291bnQgPSAxMjsKKworfSAgLy8gbmFtZXNwYWNlCisKK2NsYXNzIEFIYXJkd2FyZUJ1ZmZlckdMVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08QUhhcmR3YXJlQnVmZmVyX0Rlc2M+IHsKK3B1YmxpYzoKKyAgICBlbnVtIEF0dGFjaG1lbnRUeXBlIHsKKyAgICAgICAga05vbmUsCisgICAgICAgIGtCdWZmZXJBc1RleHR1cmUsCisgICAgICAgIGtCdWZmZXJBc1JlbmRlcmJ1ZmZlciwKKyAgICAgICAga1JlbmRlcmJ1ZmZlciwKKyAgICB9OworCisgICAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYm9vbCBTZXRVcEJ1ZmZlcihjb25zdCBBSGFyZHdhcmVCdWZmZXJfRGVzYyYgZGVzYyk7CisgICAgdm9pZCBTZXRVcFByb2dyYW0oY29uc3Qgc3RkOjpzdHJpbmcmIHZlcnRleF9zb3VyY2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiBmcmFnbWVudF9zb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIG1lc2gsIGZsb2F0IHNjYWxlLCBpbnQgdGV4dHVyZV91bml0ID0gMCk7CisgICAgdm9pZCBTZXRVcFRleHR1cmUoY29uc3QgQUhhcmR3YXJlQnVmZmVyX0Rlc2MmIGRlc2MsIGludCB1bml0KTsKKyAgICB2b2lkIFNldFVwQnVmZmVyT2JqZWN0KHVpbnQzMl90IHNpemUsIEdMZW51bSB0YXJnZXQsIEdMYml0ZmllbGQgZmxhZ3MpOworICAgIHZvaWQgU2V0VXBGcmFtZWJ1ZmZlcihpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBsYXllciwgQXR0YWNobWVudFR5cGUgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dGFjaG1lbnRUeXBlIGRlcHRoID0ga05vbmUsIEF0dGFjaG1lbnRUeXBlIHN0ZW5jaWwgPSBrTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0YWNobWVudFR5cGUgZGVwdGhfc3RlbmNpbCA9IGtOb25lLCBpbnQgbGV2ZWwgPSAwKTsKKyAgICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGU7CisKKyAgICB2b2lkIE1ha2VDdXJyZW50KGludCB3aGljaCkgeworICAgICAgICBpZiAoR2V0UGFyYW0oKS5zdHJpZGUgJiBrR2xGb3JtYXQpIHJldHVybjsKKyAgICAgICAgbVdoaWNoID0gd2hpY2g7CisgICAgICAgIGVnbE1ha2VDdXJyZW50KG1EaXNwbGF5LCBtU3VyZmFjZSwgbVN1cmZhY2UsIG1Db250ZXh0W21XaGljaF0pOworICAgIH0KKyAgICBib29sIEhhc0VHTEV4dGVuc2lvbihjb25zdCBzdGQ6OnN0cmluZyYgcykgeworICAgICAgICByZXR1cm4gbUVHTEV4dGVuc2lvbnMuZmluZChzKSAhPSBtRUdMRXh0ZW5zaW9ucy5lbmQoKTsKKyAgICB9CisgICAgYm9vbCBIYXNHTEV4dGVuc2lvbihjb25zdCBzdGQ6OnN0cmluZyYgcykgeworICAgICAgICByZXR1cm4gbUdMRXh0ZW5zaW9ucy5maW5kKHMpICE9IG1HTEV4dGVuc2lvbnMuZW5kKCk7CisgICAgfQorICAgIGJvb2wgSXNGb3JtYXRDb2xvclJlbmRlcmFibGUodWludDMyX3QgZm9ybWF0LCBib29sIHVzZV9zcmdiKSB7CisgICAgICAgIGlmICh1c2Vfc3JnYikgeworICAgICAgICAgICAgLy8gQWNjb3JkaW5nIHRvIHRoZSBzcGVjLCBHTF9TUkdCOCBpcyBub3QgY29sb3ItcmVuZGVyYWJsZS4KKyAgICAgICAgICAgIHJldHVybiBmb3JtYXQgPT0gQUhBUkRXQVJFQlVGRkVSX0ZPUk1BVF9SOEc4QjhBOF9VTk9STSB8fCBmb3JtYXQgPT0gR0xfU1JHQjhfQUxQSEE4OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGZvcm1hdCA9PSBHTF9SR0JBMTZGIHx8IGZvcm1hdCA9PSBBSEFSRFdBUkVCVUZGRVJfRk9STUFUX1IxNkcxNkIxNkExNl9GTE9BVCkgeworICAgICAgICAgICAgICAgIHJldHVybiBtR0xWZXJzaW9uID49IDMyIHx8IEhhc0dMRXh0ZW5zaW9uKCJHTF9FWFRfY29sb3JfYnVmZmVyX2Zsb2F0Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworcHJvdGVjdGVkOgorICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBtRUdMRXh0ZW5zaW9uczsKKyAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gbUdMRXh0ZW5zaW9uczsKKyAgICBFR0xEaXNwbGF5IG1EaXNwbGF5ID0gRUdMX05PX0RJU1BMQVk7CisgICAgRUdMU3VyZmFjZSBtU3VyZmFjZSA9IEVHTF9OT19TVVJGQUNFOworICAgIEVHTENvbnRleHQgbUNvbnRleHRbMl0gPSB7IEVHTF9OT19DT05URVhULCBFR0xfTk9fQ09OVEVYVCB9OworICAgIGludCBtV2hpY2ggPSAwOyAgLy8gV2hpY2ggb2YgdGhlIHR3byBFR0wgY29udGV4dHMgaXMgY3VycmVudC4KKyAgICBpbnQgbUNvbnRleHRDb3VudCA9IDI7ICAvLyBXaWxsIGJlIDIgaW4gQUhCIHRlc3QgY2FzZXMgYW5kIDEgaW4gcHVyZSBHTCB0ZXN0IGNhc2VzLgorICAgIGludCBtR0xWZXJzaW9uID0gMDsgIC8vIG1ham9yX3ZlcnNpb24gKiAxMCArIG1pbm9yX3ZlcnNpb24KKworICAgIEFIYXJkd2FyZUJ1ZmZlciogbUJ1ZmZlciA9IG51bGxwdHI7CisgICAgRUdMSW1hZ2VLSFIgbUVHTEltYWdlID0gRUdMX05PX0lNQUdFX0tIUjsKKyAgICBHTGVudW0gbVRleFRhcmdldCA9IEdMX05PTkU7CisgICAgR0x1aW50IG1Qcm9ncmFtID0gMDsKKyAgICBHTGludCBtQ29sb3JMb2NhdGlvbiA9IC0xOworICAgIEdMaW50IG1GYWNlVmVjdG9yTG9jYXRpb24gPSAtMTsKKyAgICBHTHVpbnQgbVRleHR1cmVzWzJdID0geyAwLCAwIH07CisgICAgR0x1aW50IG1CdWZmZXJPYmplY3RzWzJdID0geyAwLCAwIH07CisgICAgR0x1aW50IG1GcmFtZWJ1ZmZlcnNbMl0gPSB7IDAsIDAgfTsKKyAgICBHTGludCBtTWF4VGV4dHVyZVVuaXRzID0gMDsKK307CisKK3ZvaWQgQUhhcmR3YXJlQnVmZmVyR0xUZXN0OjpTZXRVcCgpIHsKKyAgICBtRGlzcGxheSA9IGVnbEdldERpc3BsYXkoRUdMX0RFRkFVTFRfRElTUExBWSk7CisgICAgZWdsSW5pdGlhbGl6ZShtRGlzcGxheSwgTlVMTCwgTlVMTCk7CisKKyAgICAvLyBUcnkgY3JlYXRpbmcgYW4gT3BlbkdMIEVTIDMueCBjb250ZXh0IGFuZCBmYWxsIGJhY2sgdG8gMi54IGlmIHRoYXQgZmFpbHMuCisgICAgLy8gQ3JlYXRlIHR3byBjb250ZXh0cyBmb3IgY3Jvc3MtY29udGV4dCBpbWFnZSBzaGFyaW5nIHRlc3RzLgorICAgIEVHTENvbmZpZyBmaXJzdF9jb25maWc7CisgICAgRUdMaW50IGNvbmZpZ19hdHRyaWJfbGlzdFtdID0geworICAgICAgICBFR0xfUkVEX1NJWkUsIDgsCisgICAgICAgIEVHTF9HUkVFTl9TSVpFLCA4LAorICAgICAgICBFR0xfQkxVRV9TSVpFLCA4LAorICAgICAgICBFR0xfQUxQSEFfU0laRSwgOCwKKyAgICAgICAgRUdMX1JFTkRFUkFCTEVfVFlQRSwgRUdMX09QRU5HTF9FUzNfQklUX0tIUiwKKyAgICAgICAgRUdMX05PTkUKKyAgICB9OworICAgIEVHTGludCBudW1fY29uZmlnID0gMDsKKyAgICBlZ2xDaG9vc2VDb25maWcobURpc3BsYXksIGNvbmZpZ19hdHRyaWJfbGlzdCwgJmZpcnN0X2NvbmZpZywgMSwgJm51bV9jb25maWcpOworICAgIGlmIChudW1fY29uZmlnID09IDApIHsKKyAgICAgICAgLy8gVGhlcmUgYXJlIG5vIGNvbmZpZ3Mgd2l0aCB0aGUgRVMgMy4wIGJpdCwgZmFsbCBiYWNrIHRvIEVTIDIuMC4KKyAgICAgICAgY29uZmlnX2F0dHJpYl9saXN0WzhdID0gRUdMX05PTkU7CisgICAgICAgIGNvbmZpZ19hdHRyaWJfbGlzdFs5XSA9IEVHTF9OT05FOworICAgICAgICBlZ2xDaG9vc2VDb25maWcobURpc3BsYXksIGNvbmZpZ19hdHRyaWJfbGlzdCwgJmZpcnN0X2NvbmZpZywgMSwgJm51bV9jb25maWcpOworICAgIH0KKyAgICBBU1NFUlRfR1QobnVtX2NvbmZpZywgMCk7CisKKyAgICBFR0xpbnQgY29udGV4dF9hdHRyaWJfbGlzdFtdID0geworICAgICAgICBFR0xfQ09OVEVYVF9DTElFTlRfVkVSU0lPTiwgMywKKyAgICAgICAgRUdMX05PTkUKKyAgICB9OworICAgIC8vIFRyeSBjcmVhdGluZyBhbiBFUyAzLjAgY29udGV4dCwgYnV0IGRvbid0IGJvdGhlciBpZiB0aGVyZSB3ZXJlIG5vIEVTIDMuMCBjb21wYXRpYmxlIGNvbmZpZ3MuCisgICAgaWYgKGNvbmZpZ19hdHRyaWJfbGlzdFs5XSAhPSBFR0xfTk9ORSkgeworICAgICAgICBtQ29udGV4dFswXSA9IGVnbENyZWF0ZUNvbnRleHQobURpc3BsYXksIGZpcnN0X2NvbmZpZywgRUdMX05PX0NPTlRFWFQsIGNvbnRleHRfYXR0cmliX2xpc3QpOworICAgIH0KKyAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgY29udGV4dCB5ZXQsIGZhbGwgYmFjayB0byBFUyAyLjAuCisgICAgaWYgKG1Db250ZXh0WzBdID09IEVHTF9OT19DT05URVhUKSB7CisgICAgICAgIGNvbnRleHRfYXR0cmliX2xpc3RbMV0gPSAyOworICAgICAgICBtQ29udGV4dFswXSA9IGVnbENyZWF0ZUNvbnRleHQobURpc3BsYXksIGZpcnN0X2NvbmZpZywgRUdMX05PX0NPTlRFWFQsIGNvbnRleHRfYXR0cmliX2xpc3QpOworICAgIH0KKyAgICBtQ29udGV4dFsxXSA9IGVnbENyZWF0ZUNvbnRleHQobURpc3BsYXksIGZpcnN0X2NvbmZpZywgRUdMX05PX0NPTlRFWFQsIGNvbnRleHRfYXR0cmliX2xpc3QpOworICAgIEFTU0VSVF9ORShFR0xfTk9fQ09OVEVYVCwgbUNvbnRleHRbMF0pOworICAgIEFTU0VSVF9ORShFR0xfTk9fQ09OVEVYVCwgbUNvbnRleHRbMV0pOworCisgICAgLy8gUGFyc2UgRUdMIGV4dGVuc2lvbiBzdHJpbmdzIGludG8gYSBzZXQgZm9yIGVhc2llciBwcm9jZXNzaW5nLgorICAgIHN0ZDo6aXN0cmluZ3N0cmVhbSBlZ2xleHRfc3RyZWFtKGVnbFF1ZXJ5U3RyaW5nKG1EaXNwbGF5LCBFR0xfRVhURU5TSU9OUykpOworICAgIG1FR0xFeHRlbnNpb25zID0gc3RkOjpzZXQ8c3RkOjpzdHJpbmc+eworICAgICAgICBzdGQ6OmlzdHJlYW1faXRlcmF0b3I8c3RkOjpzdHJpbmc+e2VnbGV4dF9zdHJlYW19LAorICAgICAgICBzdGQ6OmlzdHJlYW1faXRlcmF0b3I8c3RkOjpzdHJpbmc+e30KKyAgICB9OworICAgIC8vIENyZWF0ZSBhIDF4MSBwYnVmZmVyIHN1cmZhY2UgaWYgc3VyZmFjZWxlc3MgY29udGV4dHMgYXJlIG5vdCBzdXBwb3J0ZWQuCisgICAgaWYgKCFIYXNFR0xFeHRlbnNpb24oIkVHTF9LSFJfc3VyZmFjZWxlc3NfY29udGV4dCIpKSB7CisgICAgICAgIEVHTGludCBjb25zdCBzdXJmYWNlX2F0dHJpYl9saXN0W10gPSB7CisgICAgICAgICAgICBFR0xfV0lEVEgsIDEsCisgICAgICAgICAgICBFR0xfSEVJR0hULCAxLAorICAgICAgICAgICAgRUdMX05PTkUKKyAgICAgICAgfTsKKyAgICAgICAgbVN1cmZhY2UgPSBlZ2xDcmVhdGVQYnVmZmVyU3VyZmFjZShtRGlzcGxheSwgZmlyc3RfY29uZmlnLCBzdXJmYWNlX2F0dHJpYl9saXN0KTsKKyAgICB9CisgICAgRUdMQm9vbGVhbiByZXN1bHQgPSBlZ2xNYWtlQ3VycmVudChtRGlzcGxheSwgbVN1cmZhY2UsIG1TdXJmYWNlLCBtQ29udGV4dFswXSk7CisgICAgQVNTRVJUX0VRKEVHTEJvb2xlYW57RUdMX1RSVUV9LCByZXN1bHQpOworCisgICAgLy8gUGFyc2UgR0wgZXh0ZW5zaW9uIHN0cmluZ3MgaW50byBhIHNldCBmb3IgZWFzaWVyIHByb2Nlc3NpbmcuCisgICAgc3RkOjppc3RyaW5nc3RyZWFtIGdsZXh0X3N0cmVhbShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihnbEdldFN0cmluZyhHTF9FWFRFTlNJT05TKSkpOworICAgIG1HTEV4dGVuc2lvbnMgPSBzdGQ6OnNldDxzdGQ6OnN0cmluZz57CisgICAgICAgIHN0ZDo6aXN0cmVhbV9pdGVyYXRvcjxzdGQ6OnN0cmluZz57Z2xleHRfc3RyZWFtfSwKKyAgICAgICAgc3RkOjppc3RyZWFtX2l0ZXJhdG9yPHN0ZDo6c3RyaW5nPnt9CisgICAgfTsKKyAgICAvLyBQYXJzZSBHTCB2ZXJzaW9uLiBGaW5kIHRoZSBmaXJzdCBkb3QsIHRoZW4gdHJlYXQgdGhlIGRpZ2l0IGJlZm9yZSBpdCBhcyB0aGUgbWFqb3IgdmVyc2lvbgorICAgIC8vIGFuZCB0aGUgZGlnaXQgYWZ0ZXIgaXQgYXMgdGhlIG1pbm9yIHZlcnNpb24uCisgICAgc3RkOjpzdHJpbmcgdmVyc2lvbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGdsR2V0U3RyaW5nKEdMX1ZFUlNJT04pKTsKKyAgICBzdGQ6OnNpemVfdCBkb3RfcG9zID0gdmVyc2lvbi5maW5kKCcuJyk7CisgICAgQVNTRVJUX1RSVUUoZG90X3BvcyA+IDAgJiYgZG90X3BvcyA8IHZlcnNpb24uc2l6ZSgpIC0gMSk7CisgICAgbUdMVmVyc2lvbiA9ICh2ZXJzaW9uW2RvdF9wb3MgLSAxXSAtICcwJykgKiAxMCArICh2ZXJzaW9uW2RvdF9wb3MgKyAxXSAtICcwJyk7CisgICAgQVNTRVJUX0dFKG1HTFZlcnNpb24sIDIwKTsKKyAgICBnbEdldEludGVnZXJ2KEdMX01BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTLCAmbU1heFRleHR1cmVVbml0cyk7Cit9CisKK2Jvb2wgQUhhcmR3YXJlQnVmZmVyR0xUZXN0OjpTZXRVcEJ1ZmZlcihjb25zdCBBSGFyZHdhcmVCdWZmZXJfRGVzYyYgZGVzYykgeworICAgIGNvbnN0IGJvb2wgdXNlX3NyZ2IgPSBkZXNjLnN0cmlkZSAmIGtVc2VTcmdiOworICAgIGlmIChkZXNjLnVzYWdlICYgQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0dQVV9DVUJFX01BUCkgeworICAgICAgICBpZiAoZGVzYy5sYXllcnMgPiA2KSB7CisgICAgICAgICAgICBpZiAobUdMVmVyc2lvbiA8IDMyKSB7CisgICAgICAgICAgICAgICAgQUxPR0koIlRlc3Qgc2tpcHBlZDogY3ViZSBtYXAgYXJyYXlzIHJlcXVpcmUgR0wgRVMgMy4yLCBmb3VuZCAlZC4lZCIsCisgICAgICAgICAgICAgICAgICAgICAgbUdMVmVyc2lvbiAvIDEwLCBtR0xWZXJzaW9uICUgMTApOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1UZXhUYXJnZXQgPSBHTF9URVhUVVJFX0NVQkVfTUFQX0FSUkFZOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVRleFRhcmdldCA9IEdMX1RFWFRVUkVfQ1VCRV9NQVA7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoZGVzYy5sYXllcnMgPiAxKSB7CisgICAgICAgICAgICBpZiAobUdMVmVyc2lvbiA8IDMwKSB7CisgICAgICAgICAgICAgICAgQUxPR0koIlRlc3Qgc2tpcHBlZDogdGV4dHVyZSBhcnJheXMgcmVxdWlyZSBHTCBFUyAzLjAsIGZvdW5kICVkLiVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBtR0xWZXJzaW9uIC8gMTAsIG1HTFZlcnNpb24gJSAxMCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVRleFRhcmdldCA9IEdMX1RFWFRVUkVfMkRfQVJSQVk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtVGV4VGFyZ2V0ID0gR0xfVEVYVFVSRV8yRDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoKGRlc2MuZm9ybWF0ID09IEdMX1JHQjggfHwgZGVzYy5mb3JtYXQgPT0gR0xfUkdCQTgpICYmCisgICAgICAgIChkZXNjLnVzYWdlICYgQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0dQVV9DT0xPUl9PVVRQVVQpICYmCisgICAgICAgIG1HTFZlcnNpb24gPCAzMCAmJiAhSGFzR0xFeHRlbnNpb24oIkdMX09FU19yZ2I4X3JnYmE4IikpIHsKKyAgICAgICAgQUxPR0koIlRlc3Qgc2tpcHBlZDogR0xfUkdCOC9HTF9SR0JBOCByZW5kZXJidWZmZXJzIHJlcXVpcmUgR0wgRVMgMy4wIG9yICIKKyAgICAgICAgICAgICAgIkdMX09FU19yZ2I4X3JnYmE4LCBidXQgbmVpdGhlciB3ZXJlIGZvdW5kLiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChkZXNjLmZvcm1hdCA9PSBHTF9TUkdCOF9BTFBIQTggJiYgbUdMVmVyc2lvbiA8IDMwICYmCisgICAgICAgICFIYXNHTEV4dGVuc2lvbigiR0xfRVhUX3NSR0IiKSkgeworICAgICAgICBBTE9HSSgiVGVzdCBza2lwcGVkOiBHTF9TUkdCOF9BTFBIQTggcmVxdWlyZXMgR0wgRVMgMy4wIG9yIEdMX0VYVF9zUkdCLCAiCisgICAgICAgICAgICAgICJidXQgbmVpdGhlciB3ZXJlIGZvdW5kLiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChkZXNjLmZvcm1hdCA9PSBHTF9SR0IxMF9BMiAmJiBtR0xWZXJzaW9uIDwgMzApIHsKKyAgICAgICAgQUxPR0koIlRlc3Qgc2tpcHBlZDogR0xfUkdCMTBfQTIgcmVxdWlyZXMgR0wgRVMgMy4wLCBmb3VuZCAlZC4lZCIsCisgICAgICAgICAgICAgIG1HTFZlcnNpb24gLyAxMCwgbUdMVmVyc2lvbiAlIDEwKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoZGVzYy5mb3JtYXQgPT0gR0xfUkdCQTE2RiAmJiBtR0xWZXJzaW9uIDwgMzApIHsKKyAgICAgICAgQUxPR0koIlRlc3Qgc2tpcHBlZDogR0xfUkdCQTE2RiByZXF1aXJlcyBHTCBFUyAzLjAsIGZvdW5kICVkLiVkIiwKKyAgICAgICAgICAgICAgbUdMVmVyc2lvbiAvIDEwLCBtR0xWZXJzaW9uICUgMTApOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChkZXNjLmZvcm1hdCA9PSBHTF9ERVBUSF9DT01QT05FTlQxNiAmJgorICAgICAgICAoZGVzYy51c2FnZSAmIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9HUFVfU0FNUExFRF9JTUFHRSkgJiYKKyAgICAgICAgbUdMVmVyc2lvbiA8IDMwICYmICFIYXNHTEV4dGVuc2lvbigiR0xfT0VTX2RlcHRoX3RleHR1cmUiKSkgeworICAgICAgICBBTE9HSSgiVGVzdCBza2lwcGVkOiBkZXB0aCB0ZXh0dXJlcyByZXF1aXJlIEdMIEVTIDMuMCBvciAiCisgICAgICAgICAgICAgICJHTF9PRVNfZGVwdGhfdGV4dHVyZSwgYnV0IG5laXRoZXIgd2VyZSBmb3VuZC4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoZGVzYy5mb3JtYXQgPT0gR0xfREVQVEgyNF9TVEVOQ0lMOCAmJgorICAgICAgICAoZGVzYy51c2FnZSAmIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9HUFVfU0FNUExFRF9JTUFHRSkgJiYKKyAgICAgICAgbUdMVmVyc2lvbiA8IDMwICYmICFIYXNHTEV4dGVuc2lvbigiR0xfT0VTX3BhY2tlZF9kZXB0aF9zdGVuY2lsIikpIHsKKyAgICAgICAgQUxPR0koIlRlc3Qgc2tpcHBlZDogZGVwdGgtc3RlbmNpbCB0ZXh0dXJlcyByZXF1aXJlIEdMIEVTIDMuMCBvciAiCisgICAgICAgICAgICAgICJHTF9PRVNfcGFja2VkX2RlcHRoX3N0ZW5jaWwsIGJ1dCBuZWl0aGVyIHdlcmUgZm91bmQuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgLy8gRm9yIGNvbnRyb2wgY2FzZXMgdXNpbmcgR0wgZm9ybWF0cywgdGhlIHRlc3Qgc2hvdWxkIGJlIHJ1biBpbiBhIHNpbmdsZQorICAgIC8vIGNvbnRleHQsIHdpdGhvdXQgdXNpbmcgQUhhcmR3YXJlQnVmZmVyLiBUaGlzIHNpbXBsaWZpZXMgdmVyaWZ5aW5nIHRoYXQKKyAgICAvLyB0aGUgdGVzdCBiZWhhdmVzIGFzIGV4cGVjdGVkIGV2ZW4gaWYgdGhlIEFIYXJkd2FyZUJ1ZmZlciBmb3JtYXQgdW5kZXIKKyAgICAvLyB0ZXN0IGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgaWYgKGRlc2Muc3RyaWRlICYga0dsRm9ybWF0KSB7CisgICAgICAgIG1Db250ZXh0Q291bnQgPSAxOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBUaGUgY29kZSBiZWxvdyB3aWxsIG9ubHkgZXhlY3V0ZSBpZiB3ZSBhcmUgYWxsb2NhdGluZyBhIHJlYWwgQUhhcmR3YXJlQnVmZmVyLgorICAgIGlmICh1c2Vfc3JnYiAmJiAhSGFzRUdMRXh0ZW5zaW9uKCJFR0xfRVhUX2ltYWdlX2dsX2NvbG9yc3BhY2UiKSkgeworICAgICAgICBBTE9HSSgiVGVzdCBza2lwcGVkOiBzUkdCIGhhcmR3YXJlIGJ1ZmZlcnMgcmVxdWlyZSBFR0xfRVhUX2ltYWdlX2dsX2NvbG9yc3BhY2UiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoZGVzYy51c2FnZSAmIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9HUFVfQ1VCRV9NQVAgJiYKKyAgICAgICAgIUhhc0dMRXh0ZW5zaW9uKCJHTF9FWFRfRUdMX2ltYWdlX3N0b3JhZ2UiKSkgeworICAgICAgICBBTE9HSSgiVGVzdCBza2lwcGVkOiBjdWJlIG1hcCBhcnJheSBoYXJkd2FyZSBidWZmZXJzIHJlcXVpcmUgIgorICAgICAgICAgICAgICAiR0xfRVhUX0VHTF9pbWFnZV9zdG9yYWdlIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKGRlc2MudXNhZ2UgJiBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfR1BVX01JUE1BUF9DT01QTEVURSAmJgorICAgICAgICAhSGFzR0xFeHRlbnNpb24oIkdMX0VYVF9FR0xfaW1hZ2Vfc3RvcmFnZSIpKSB7CisgICAgICAgIEFMT0dJKCJUZXN0IHNraXBwZWQ6IG1pcG1hcHBlZCBoYXJkd2FyZSBidWZmZXJzIHJlcXVpcmUgIgorICAgICAgICAgICAgICAiR0xfRVhUX0VHTF9pbWFnZV9zdG9yYWdlIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbnQgcmVzdWx0ID0gQUhhcmR3YXJlQnVmZmVyX2FsbG9jYXRlKCZkZXNjLCAmbUJ1ZmZlcik7CisgICAgLy8gU2tpcCBpZiB0aGlzIGZvcm1hdCBjYW5ub3QgYmUgYWxsb2NhdGVkLgorICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0koIlRlc3Qgc2tpcHBlZDogJXMgbm90IHN1cHBvcnRlZCIsCisgICAgICAgICAgICAgIEFIQkZvcm1hdEFzU3RyaW5nKGRlc2MuZm9ybWF0KSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgLy8gRG8gbm90IGNyZWF0ZSB0aGUgRUdMSW1hZ2UgaWYgdGhpcyBpcyBhIGJsb2IgZm9ybWF0LgorICAgIGlmIChkZXNjLmZvcm1hdCA9PSBBSEFSRFdBUkVCVUZGRVJfRk9STUFUX0JMT0IpIHJldHVybiB0cnVlOworCisgICAgRUdMaW50IGF0dHJpYl9saXN0WzNdID0geyBFR0xfTk9ORSwgRUdMX05PTkUsIEVHTF9OT05FIH07CisgICAgaWYgKHVzZV9zcmdiKSB7CisgICAgICAgIGF0dHJpYl9saXN0WzBdID0gRUdMX0dMX0NPTE9SU1BBQ0VfS0hSOworICAgICAgICBhdHRyaWJfbGlzdFsxXSA9IEVHTF9HTF9DT0xPUlNQQUNFX1NSR0JfS0hSOworICAgIH0KKyAgICBtRUdMSW1hZ2UgPSBlZ2xDcmVhdGVJbWFnZUtIUigKKyAgICAgICAgbURpc3BsYXksIEVHTF9OT19DT05URVhULCBFR0xfTkFUSVZFX0JVRkZFUl9BTkRST0lELAorICAgICAgICBlZ2xHZXROYXRpdmVDbGllbnRCdWZmZXJBTkRST0lEKG1CdWZmZXIpLCBhdHRyaWJfbGlzdCk7CisgICAgRVhQRUNUX05FKEVHTF9OT19JTUFHRV9LSFIsIG1FR0xJbWFnZSk7CisgICAgcmV0dXJuIG1FR0xJbWFnZSAhPSBFR0xfTk9fSU1BR0VfS0hSOworfQorCit2b2lkIEFIYXJkd2FyZUJ1ZmZlckdMVGVzdDo6U2V0VXBQcm9ncmFtKGNvbnN0IHN0ZDo6c3RyaW5nJiB2ZXJ0ZXhfc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZnJhZ21lbnRfc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogbWVzaCwgZmxvYXQgc2NhbGUsIGludCB0ZXh0dXJlX3VuaXQpIHsKKyAgICBBU1NFUlRfRVEoMFUsIG1Qcm9ncmFtKTsKKyAgICBHTGludCBzdGF0dXMgPSBHTF9GQUxTRTsKKyAgICBtUHJvZ3JhbSA9IGdsQ3JlYXRlUHJvZ3JhbSgpOworICAgIEdMdWludCB2ZXJ0ZXhfc2hhZGVyID0gZ2xDcmVhdGVTaGFkZXIoR0xfVkVSVEVYX1NIQURFUik7CisgICAgY29uc3QgY2hhciogdmVydGV4X3NvdXJjZV9jc3RyID0gdmVydGV4X3NvdXJjZS5jX3N0cigpOworICAgIGdsU2hhZGVyU291cmNlKHZlcnRleF9zaGFkZXIsIDEsICZ2ZXJ0ZXhfc291cmNlX2NzdHIsIG51bGxwdHIpOworICAgIGdsQ29tcGlsZVNoYWRlcih2ZXJ0ZXhfc2hhZGVyKTsKKyAgICBnbEdldFNoYWRlcml2KHZlcnRleF9zaGFkZXIsIEdMX0NPTVBJTEVfU1RBVFVTLCAmc3RhdHVzKTsKKyAgICBBU1NFUlRfRVEoR0xfVFJVRSwgc3RhdHVzKSA8PCAiVmVydGV4IHNoYWRlciBjb21waWxhdGlvbiBmYWlsZWQiOworICAgIEdMdWludCBmcmFnbWVudF9zaGFkZXIgPSBnbENyZWF0ZVNoYWRlcihHTF9GUkFHTUVOVF9TSEFERVIpOworICAgIGNvbnN0IGNoYXIqIGZyYWdtZW50X3NvdXJjZV9jc3RyID0gZnJhZ21lbnRfc291cmNlLmNfc3RyKCk7CisgICAgZ2xTaGFkZXJTb3VyY2UoZnJhZ21lbnRfc2hhZGVyLCAxLCAmZnJhZ21lbnRfc291cmNlX2NzdHIsIG51bGxwdHIpOworICAgIGdsQ29tcGlsZVNoYWRlcihmcmFnbWVudF9zaGFkZXIpOworICAgIGdsR2V0U2hhZGVyaXYoZnJhZ21lbnRfc2hhZGVyLCBHTF9DT01QSUxFX1NUQVRVUywgJnN0YXR1cyk7CisgICAgQVNTRVJUX0VRKEdMX1RSVUUsIHN0YXR1cykgPDwgIkZyYWdtZW50IHNoYWRlciBjb21waWxhdGlvbiBmYWlsZWQiOworICAgIGdsQXR0YWNoU2hhZGVyKG1Qcm9ncmFtLCB2ZXJ0ZXhfc2hhZGVyKTsKKyAgICBnbEF0dGFjaFNoYWRlcihtUHJvZ3JhbSwgZnJhZ21lbnRfc2hhZGVyKTsKKyAgICBnbExpbmtQcm9ncmFtKG1Qcm9ncmFtKTsKKyAgICBnbEdldFByb2dyYW1pdihtUHJvZ3JhbSwgR0xfTElOS19TVEFUVVMsICZzdGF0dXMpOworICAgIEFTU0VSVF9FUShHTF9UUlVFLCBzdGF0dXMpIDw8ICJTaGFkZXIgcHJvZ3JhbSBsaW5raW5nIGZhaWxlZCI7CisgICAgZ2xEZXRhY2hTaGFkZXIobVByb2dyYW0sIHZlcnRleF9zaGFkZXIpOworICAgIGdsRGV0YWNoU2hhZGVyKG1Qcm9ncmFtLCBmcmFnbWVudF9zaGFkZXIpOworICAgIGdsRGVsZXRlU2hhZGVyKHZlcnRleF9zaGFkZXIpOworICAgIGdsRGVsZXRlU2hhZGVyKGZyYWdtZW50X3NoYWRlcik7CisgICAgZ2xVc2VQcm9ncmFtKG1Qcm9ncmFtKTsKKyAgICBBU1NFUlRfRVEoR0xlbnVte0dMX05PX0VSUk9SfSwgZ2xHZXRFcnJvcigpKTsKKworICAgIEdMaW50IGFfcG9zaXRpb25fbG9jYXRpb24gPSBnbEdldEF0dHJpYkxvY2F0aW9uKG1Qcm9ncmFtLCAiYVBvc2l0aW9uIik7CisgICAgR0xpbnQgYV9kZXB0aF9sb2NhdGlvbiA9IGdsR2V0QXR0cmliTG9jYXRpb24obVByb2dyYW0sICJhRGVwdGgiKTsKKyAgICBpZiAobWVzaCA9PSBrUXVhZFBvc2l0aW9ucykgeworICAgICAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIoYV9wb3NpdGlvbl9sb2NhdGlvbiwgMiwgR0xfRkxPQVQsIEdMX1RSVUUsIDAsIGtRdWFkUG9zaXRpb25zKTsKKyAgICAgICAgZ2xWZXJ0ZXhBdHRyaWIxZihhX2RlcHRoX2xvY2F0aW9uLCAwLmYpOworICAgICAgICBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGFfcG9zaXRpb25fbG9jYXRpb24pOworICAgIH0gZWxzZSBpZiAobWVzaCA9PSBrUHlyYW1pZFBvc2l0aW9ucykgeworICAgICAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIoYV9wb3NpdGlvbl9sb2NhdGlvbiwgMiwgR0xfRkxPQVQsIEdMX1RSVUUsIDMgKiBzaXplb2YoZmxvYXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1B5cmFtaWRQb3NpdGlvbnMpOworICAgICAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIoYV9kZXB0aF9sb2NhdGlvbiwgMSwgR0xfRkxPQVQsIEdMX1RSVUUsIDMgKiBzaXplb2YoZmxvYXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1B5cmFtaWRQb3NpdGlvbnMgKyAyKTsKKyAgICAgICAgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShhX3Bvc2l0aW9uX2xvY2F0aW9uKTsKKyAgICAgICAgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShhX2RlcHRoX2xvY2F0aW9uKTsKKyAgICB9IGVsc2UgeworICAgICAgICBGQUlMKCkgPDwgIlVua25vd24gbWVzaCI7CisgICAgfQorICAgIGdsVW5pZm9ybTFmKGdsR2V0VW5pZm9ybUxvY2F0aW9uKG1Qcm9ncmFtLCAidVNjYWxlIiksIHNjYWxlKTsKKyAgICBtQ29sb3JMb2NhdGlvbiA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uKG1Qcm9ncmFtLCAidUNvbG9yIik7CisgICAgaWYgKG1Db2xvckxvY2F0aW9uID49IDApIHsKKyAgICAgICAgZ2xVbmlmb3JtNGYobUNvbG9yTG9jYXRpb24sIDEuZiwgMC5mLCAwLmYsIDEuZik7CisgICAgfQorICAgIEdMaW50IHVfdGV4dHVyZV9sb2NhdGlvbiA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uKG1Qcm9ncmFtLCAidVRleHR1cmUiKTsKKyAgICBpZiAodV90ZXh0dXJlX2xvY2F0aW9uID49IDApIHsKKyAgICAgICAgZ2xVbmlmb3JtMWkodV90ZXh0dXJlX2xvY2F0aW9uLCB0ZXh0dXJlX3VuaXQpOworICAgIH0KKyAgICBHTGludCB1X2xheWVyX2xvY2F0aW9uID0gZ2xHZXRVbmlmb3JtTG9jYXRpb24obVByb2dyYW0sICJ1TGF5ZXIiKTsKKyAgICBpZiAodV9sYXllcl9sb2NhdGlvbiA+PSAwKSB7CisgICAgICAgIGdsVW5pZm9ybTFmKHVfbGF5ZXJfbG9jYXRpb24sIHN0YXRpY19jYXN0PGZsb2F0PihHZXRQYXJhbSgpLmxheWVycyAtIDEpKTsKKyAgICB9CisgICAgbUZhY2VWZWN0b3JMb2NhdGlvbiA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uKG1Qcm9ncmFtLCAidUZhY2VWZWN0b3IiKTsKK30KKwordm9pZCBBSGFyZHdhcmVCdWZmZXJHTFRlc3Q6OlNldFVwVGV4dHVyZShjb25zdCBBSGFyZHdhcmVCdWZmZXJfRGVzYyYgZGVzYywgaW50IHVuaXQpIHsKKyAgICBHTHVpbnQmIHRleHR1cmUgPSBtVGV4dHVyZXNbbVdoaWNoXTsKKyAgICBnbEdlblRleHR1cmVzKDEsICZ0ZXh0dXJlKTsKKyAgICBnbEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTAgKyB1bml0KTsKKyAgICBnbEJpbmRUZXh0dXJlKG1UZXhUYXJnZXQsIHRleHR1cmUpOworICAgIC8vIElmIHRoZSB0ZXh0dXJlIGRvZXMgbm90IGhhdmUgbWlwbWFwcywgc2V0IGEgZmlsdGVyIHRoYXQgZG9lcyBub3QgcmVxdWlyZSB0aGVtLgorICAgIGlmICghKGRlc2MudXNhZ2UgJiBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfR1BVX01JUE1BUF9DT01QTEVURSkpIHsKKyAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKG1UZXhUYXJnZXQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTkVBUkVTVCk7CisgICAgfQorICAgIGlmIChkZXNjLnN0cmlkZSAmIGtHbEZvcm1hdCkgeworICAgICAgICBpbnQgbGV2ZWxzID0gMTsKKyAgICAgICAgaWYgKGRlc2MudXNhZ2UgJiBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfR1BVX01JUE1BUF9DT01QTEVURSkgeworICAgICAgICAgICAgbGV2ZWxzID0gTWlwTGV2ZWxDb3VudChkZXNjLndpZHRoLCBkZXNjLmhlaWdodCk7CisgICAgICAgIH0KKyAgICAgICAgLy8ga0dsRm9ybWF0IGlzIHNldCBpbiB0aGUgc3RyaWRlIGZpZWxkLCBzbyBpbnRlcnByZXQgZGVzYy5mb3JtYXQgYXMgYSBHTCBmb3JtYXQuCisgICAgICAgIGlmICgoZGVzYy51c2FnZSAmIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9HUFVfQ1VCRV9NQVApID8gZGVzYy5sYXllcnMgPiA2IDogZGVzYy5sYXllcnMgPiAxKSB7CisgICAgICAgICAgICBnbFRleFN0b3JhZ2UzRChtVGV4VGFyZ2V0LCBsZXZlbHMsIGRlc2MuZm9ybWF0LCBkZXNjLndpZHRoLCBkZXNjLmhlaWdodCwgZGVzYy5sYXllcnMpOworICAgICAgICB9IGVsc2UgaWYgKG1HTFZlcnNpb24gPj0gMzApIHsKKyAgICAgICAgICAgIGdsVGV4U3RvcmFnZTJEKG1UZXhUYXJnZXQsIGxldmVscywgZGVzYy5mb3JtYXQsIGRlc2Mud2lkdGgsIGRlc2MuaGVpZ2h0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIENvbXBhdGliaWxpdHkgY29kZSBmb3IgRVMgMi4wIGdvZXMgaGVyZS4KKyAgICAgICAgICAgIEdMZW51bSBpbnRlcm5hbF9mb3JtYXQgPSAwLCBmb3JtYXQgPSAwLCB0eXBlID0gMDsKKyAgICAgICAgICAgIHN3aXRjaCAoZGVzYy5mb3JtYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEdMX1JHQjg6CisgICAgICAgICAgICAgICAgICAgIGludGVybmFsX2Zvcm1hdCA9IEdMX1JHQjsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gR0xfUkdCOworICAgICAgICAgICAgICAgICAgICB0eXBlID0gR0xfVU5TSUdORURfQllURTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHTF9SR0JBODoKKyAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWxfZm9ybWF0ID0gR0xfUkdCQTsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gR0xfUkdCQTsKKyAgICAgICAgICAgICAgICAgICAgdHlwZSA9IEdMX1VOU0lHTkVEX0JZVEU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR0xfU1JHQjhfQUxQSEE4OgorICAgICAgICAgICAgICAgICAgICAvLyBBdmFpbGFibGUgdGhyb3VnaCBHTF9FWFRfc1JHQi4KKyAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWxfZm9ybWF0ID0gR0xfU1JHQl9BTFBIQV9FWFQ7CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IEdMX1JHQkE7CisgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBHTF9VTlNJR05FRF9CWVRFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdMX0RFUFRIX0NPTVBPTkVOVDE2OgorICAgICAgICAgICAgICAgICAgICAvLyBBdmFpbGFibGUgdGhyb3VnaCBHTF9PRVNfZGVwdGhfdGV4dHVyZS4KKyAgICAgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoZXNlIGFyZSB0cmVhdGVkIGFzIGx1bWluYW5jZSB0ZXh0dXJlcywgbm90IGFzIHJlZCB0ZXh0dXJlcy4KKyAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWxfZm9ybWF0ID0gR0xfREVQVEhfQ09NUE9ORU5UOworICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBHTF9ERVBUSF9DT01QT05FTlQ7CisgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBHTF9VTlNJR05FRF9TSE9SVDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHTF9ERVBUSDI0X1NURU5DSUw4OgorICAgICAgICAgICAgICAgICAgICAvLyBBdmFpbGFibGUgdGhyb3VnaCBHTF9PRVNfcGFja2VkX2RlcHRoX3N0ZW5jaWwuCisgICAgICAgICAgICAgICAgICAgIGludGVybmFsX2Zvcm1hdCA9IEdMX0RFUFRIX1NURU5DSUxfT0VTOworICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBHTF9ERVBUSF9TVEVOQ0lMOworICAgICAgICAgICAgICAgICAgICB0eXBlID0gR0xfVU5TSUdORURfSU5UXzI0Xzg7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIEZBSUwoKSA8PCAiVW5yZWNvZ25pemVkIEdMIGZvcm1hdCI7IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGRlc2MudXNhZ2UgJiBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfR1BVX0NVQkVfTUFQKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgZmFjZSA9IDA7IGZhY2UgPCA2OyArK2ZhY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgd2lkdGggPSBkZXNjLndpZHRoOworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBoZWlnaHQgPSBkZXNjLmhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbGV2ZWwgPSAwOyBsZXZlbCA8IGxldmVsczsgKytsZXZlbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCArIGZhY2UsIGxldmVsLCBpbnRlcm5hbF9mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgMCwgZm9ybWF0LCB0eXBlLCBudWxscHRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoIC89IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgLz0gMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdWludDMyX3Qgd2lkdGggPSBkZXNjLndpZHRoOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGhlaWdodCA9IGRlc2MuaGVpZ2h0OworICAgICAgICAgICAgICAgIGZvciAoaW50IGxldmVsID0gMDsgbGV2ZWwgPCBsZXZlbHM7ICsrbGV2ZWwpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2xUZXhJbWFnZTJEKG1UZXhUYXJnZXQsIGxldmVsLCBpbnRlcm5hbF9mb3JtYXQsIHdpZHRoLCBoZWlnaHQsIDAsIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsIG51bGxwdHIpOworICAgICAgICAgICAgICAgICAgICB3aWR0aCAvPSAyOworICAgICAgICAgICAgICAgICAgICBoZWlnaHQgLz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoSGFzR0xFeHRlbnNpb24oIkdMX0VYVF9FR0xfaW1hZ2Vfc3RvcmFnZSIpKSB7CisgICAgICAgICAgICBnbEVHTEltYWdlVGFyZ2V0VGV4U3RvcmFnZUVYVChtVGV4VGFyZ2V0LCBzdGF0aWNfY2FzdDxHTGVnbEltYWdlT0VTPihtRUdMSW1hZ2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnbEVHTEltYWdlVGFyZ2V0VGV4dHVyZTJET0VTKG1UZXhUYXJnZXQsIHN0YXRpY19jYXN0PEdMZWdsSW1hZ2VPRVM+KG1FR0xJbWFnZSkpOworICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9FUShHTGVudW17R0xfTk9fRVJST1J9LCBnbEdldEVycm9yKCkpOworfQorCit2b2lkIEFIYXJkd2FyZUJ1ZmZlckdMVGVzdDo6U2V0VXBCdWZmZXJPYmplY3QodWludDMyX3Qgc2l6ZSwgR0xlbnVtIHRhcmdldCwgR0xiaXRmaWVsZCBmbGFncykgeworICAgIGdsR2VuQnVmZmVycygxLCAmbUJ1ZmZlck9iamVjdHNbbVdoaWNoXSk7CisgICAgZ2xCaW5kQnVmZmVyKHRhcmdldCwgbUJ1ZmZlck9iamVjdHNbbVdoaWNoXSk7CisgICAgZ2xCdWZmZXJTdG9yYWdlRXh0ZXJuYWxFWFQodGFyZ2V0LCAwLCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVnbEdldE5hdGl2ZUNsaWVudEJ1ZmZlckFORFJPSUQobUJ1ZmZlciksIGZsYWdzKTsKKyAgICBBU1NFUlRfRVEoR0xlbnVte0dMX05PX0VSUk9SfSwgZ2xHZXRFcnJvcigpKTsKK30KKwordm9pZCBBSGFyZHdhcmVCdWZmZXJHTFRlc3Q6OlNldFVwRnJhbWVidWZmZXIoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgbGF5ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRhY2htZW50VHlwZSBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dGFjaG1lbnRUeXBlIGRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0YWNobWVudFR5cGUgc3RlbmNpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dGFjaG1lbnRUeXBlIGRlcHRoX3N0ZW5jaWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGV2ZWwpIHsKKyAgICBBdHRhY2htZW50VHlwZSBhdHRhY2htZW50X3R5cGVzW10gPSB7IGNvbG9yLCBkZXB0aCwgc3RlbmNpbCwgZGVwdGhfc3RlbmNpbCB9OworICAgIEdMZW51bSBhdHRhY2htZW50X3BvaW50c1tdID0geworICAgICAgICBHTF9DT0xPUl9BVFRBQ0hNRU5UMCwgR0xfREVQVEhfQVRUQUNITUVOVCwgR0xfU1RFTkNJTF9BVFRBQ0hNRU5ULAorICAgICAgICBHTF9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQKKyAgICB9OworICAgIEdMZW51bSBkZWZhdWx0X2Zvcm1hdHNbXSA9IHsKKyAgICAgICAgR0xfUkdCQTgsIEdMX0RFUFRIX0NPTVBPTkVOVDE2LCBHTF9TVEVOQ0lMX0lOREVYOCwgR0xfREVQVEgyNF9TVEVOQ0lMOAorICAgIH07CisgICAgR0x1aW50JiBmYm8gPSBtRnJhbWVidWZmZXJzW21XaGljaF07CisgICAgZ2xHZW5GcmFtZWJ1ZmZlcnMoMSwgJmZibyk7CisgICAgZ2xCaW5kRnJhbWVidWZmZXIoR0xfRlJBTUVCVUZGRVIsIGZibyk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyArK2kpIHsKKyAgICAgICAgc3dpdGNoIChhdHRhY2htZW50X3R5cGVzW2ldKSB7CisgICAgICAgICAgICBjYXNlIGtOb25lOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBrQnVmZmVyQXNUZXh0dXJlOgorICAgICAgICAgICAgICAgIEFTU0VSVF9ORSgwVSwgbVRleHR1cmVzW21XaGljaF0pOworICAgICAgICAgICAgICAgIGlmIChtVGV4VGFyZ2V0ID09IEdMX1RFWFRVUkVfMkQpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRChHTF9GUkFNRUJVRkZFUiwgYXR0YWNobWVudF9wb2ludHNbaV0sIG1UZXhUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRleHR1cmVzW21XaGljaF0sIGxldmVsKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1UZXhUYXJnZXQgPT0gR0xfVEVYVFVSRV9DVUJFX01BUCkgeworICAgICAgICAgICAgICAgICAgICBnbEZyYW1lYnVmZmVyVGV4dHVyZTJEKEdMX0ZSQU1FQlVGRkVSLCBhdHRhY2htZW50X3BvaW50c1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyBsYXllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGV4dHVyZXNbbVdoaWNoXSwgbGV2ZWwpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGdsRnJhbWVidWZmZXJUZXh0dXJlTGF5ZXIoR0xfRlJBTUVCVUZGRVIsIGF0dGFjaG1lbnRfcG9pbnRzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UZXh0dXJlc1ttV2hpY2hdLCBsZXZlbCwgbGF5ZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga0J1ZmZlckFzUmVuZGVyYnVmZmVyOiB7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKDAsIGxheWVyKTsKKyAgICAgICAgICAgICAgICBHTHVpbnQgcmVuZGVyYnVmZmVyID0gMDsKKyAgICAgICAgICAgICAgICBnbEdlblJlbmRlcmJ1ZmZlcnMoMSwgJnJlbmRlcmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgZ2xCaW5kUmVuZGVyYnVmZmVyKEdMX1JFTkRFUkJVRkZFUiwgcmVuZGVyYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEoR0xlbnVte0dMX05PX0VSUk9SfSwgZ2xHZXRFcnJvcigpKTsKKyAgICAgICAgICAgICAgICBpZiAoR2V0UGFyYW0oKS5zdHJpZGUgJiBrR2xGb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2xSZW5kZXJidWZmZXJTdG9yYWdlKEdMX1JFTkRFUkJVRkZFUiwgR2V0UGFyYW0oKS5mb3JtYXQsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGdsRUdMSW1hZ2VUYXJnZXRSZW5kZXJidWZmZXJTdG9yYWdlT0VTKEdMX1JFTkRFUkJVRkZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8R0xlZ2xJbWFnZU9FUz4obUVHTEltYWdlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXIoR0xfRlJBTUVCVUZGRVIsIGF0dGFjaG1lbnRfcG9pbnRzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xfUkVOREVSQlVGRkVSLCByZW5kZXJidWZmZXIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBrUmVuZGVyYnVmZmVyOiB7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKDAsIGxheWVyKTsKKyAgICAgICAgICAgICAgICBHTHVpbnQgcmVuZGVyYnVmZmVyID0gMDsKKyAgICAgICAgICAgICAgICBnbEdlblJlbmRlcmJ1ZmZlcnMoMSwgJnJlbmRlcmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgZ2xCaW5kUmVuZGVyYnVmZmVyKEdMX1JFTkRFUkJVRkZFUiwgcmVuZGVyYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2UoR0xfUkVOREVSQlVGRkVSLCBkZWZhdWx0X2Zvcm1hdHNbaV0sIHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgICAgIGdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXIoR0xfRlJBTUVCVUZGRVIsIGF0dGFjaG1lbnRfcG9pbnRzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xfUkVOREVSQlVGRkVSLCByZW5kZXJidWZmZXIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDogRkFJTCgpIDw8ICJVbnJlY29nbml6ZWQgYmluZGluZyB0eXBlIjsKKyAgICAgICAgfQorICAgIH0KKyAgICBBU1NFUlRfRVEoR0xlbnVte0dMX05PX0VSUk9SfSwgZ2xHZXRFcnJvcigpKTsKKyAgICBBU1NFUlRfRVEoR0xlbnVte0dMX0ZSQU1FQlVGRkVSX0NPTVBMRVRFfSwKKyAgICAgICAgICAgICAgZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzKEdMX0ZSQU1FQlVGRkVSKSk7CisgICAgZ2xWaWV3cG9ydCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKK30KKwordm9pZCBBSGFyZHdhcmVCdWZmZXJHTFRlc3Q6OlRlYXJEb3duKCkgeworICAgIGVnbE1ha2VDdXJyZW50KG1EaXNwbGF5LCBFR0xfTk9fU1VSRkFDRSwgRUdMX05PX1NVUkZBQ0UsIEVHTF9OT19DT05URVhUKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgICAgICAvLyBBbGwgR0wgb2JqZWN0cyB3aWxsIGJlIGRlbGV0ZWQgYWxvbmcgd2l0aCB0aGUgY29udGV4dC4KKyAgICAgICAgZWdsRGVzdHJveUNvbnRleHQobURpc3BsYXksIG1Db250ZXh0W2ldKTsKKyAgICB9CisgICAgaWYgKG1CdWZmZXIgIT0gbnVsbHB0cikgeworICAgICAgICBlZ2xEZXN0cm95SW1hZ2VLSFIobURpc3BsYXksIG1FR0xJbWFnZSk7CisgICAgICAgIEFIYXJkd2FyZUJ1ZmZlcl9yZWxlYXNlKG1CdWZmZXIpOworICAgIH0KKyAgICBpZiAobVN1cmZhY2UgIT0gRUdMX05PX1NVUkZBQ0UpIHsKKyAgICAgICAgZWdsRGVzdHJveVN1cmZhY2UobURpc3BsYXksIG1TdXJmYWNlKTsKKyAgICB9CisgICAgZWdsVGVybWluYXRlKG1EaXNwbGF5KTsKK30KKworCitjbGFzcyBCbG9iVGVzdCA6IHB1YmxpYyBBSGFyZHdhcmVCdWZmZXJHTFRlc3QgeworcHVibGljOgorICAgIGJvb2wgU2V0VXBCdWZmZXIoY29uc3QgQUhhcmR3YXJlQnVmZmVyX0Rlc2MmIGRlc2MpIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKCFIYXNHTEV4dGVuc2lvbigiR0xfRVhUX2V4dGVybmFsX2J1ZmZlciIpKSB7CisgICAgICAgICAgICBBTE9HSSgiVGVzdCBza2lwcGVkOiBHTF9FWFRfZXh0ZXJuYWxfYnVmZmVyIG5vdCBwcmVzZW50Iik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEFIYXJkd2FyZUJ1ZmZlckdMVGVzdDo6U2V0VXBCdWZmZXIoZGVzYyk7CisgICAgfQorfTsKKworLy8gVmVyaWZpZXMgdGhhdCBhIGJsb2IgYnVmZmVyIGNhbiBiZSB1c2VkIHRvIHN1cHBseSB2ZXJ0ZXggYXR0cmlidXRlcyB0byBhIHNoYWRlci4KK1RFU1RfUChCbG9iVGVzdCwgR3B1RGF0YUJ1ZmZlclZlcnRleEJ1ZmZlcikgeworICAgIEFIYXJkd2FyZUJ1ZmZlcl9EZXNjIGRlc2MgPSBHZXRQYXJhbSgpOworICAgIGRlc2Mud2lkdGggPSBzaXplb2Yga1F1YWRQb3NpdGlvbnM7CisgICAgZGVzYy51c2FnZSA9IEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9HUFVfREFUQV9CVUZGRVI7CisgICAgaWYgKCFTZXRVcEJ1ZmZlcihkZXNjKSkgcmV0dXJuOworCisgICAgU2V0VXBQcm9ncmFtKGtWZXJ0ZXhTaGFkZXIsIGtDb2xvckZyYWdtZW50U2hhZGVyLCBrUXVhZFBvc2l0aW9ucywgMC41Zik7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Db250ZXh0Q291bnQ7ICsraSkgeworICAgICAgICBNYWtlQ3VycmVudChpKTsKKyAgICAgICAgU2V0VXBCdWZmZXJPYmplY3QoZGVzYy53aWR0aCwgR0xfQVJSQVlfQlVGRkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHTF9EWU5BTUlDX1NUT1JBR0VfQklUX0VYVCB8IEdMX01BUF9XUklURV9CSVQpOworICAgIH0KKyAgICBmbG9hdCogZGF0YSA9IHN0YXRpY19jYXN0PGZsb2F0Kj4oCisgICAgICAgIGdsTWFwQnVmZmVyUmFuZ2UoR0xfQVJSQVlfQlVGRkVSLCAwLCBkZXNjLndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdMX01BUF9XUklURV9CSVQgfCBHTF9NQVBfSU5WQUxJREFURV9CVUZGRVJfQklUKSk7CisgICAgQVNTRVJUX05FKGRhdGEsIG51bGxwdHIpIDw8ICJnbE1hcEJ1ZmZlclJhbmdlIG9uIGEgYmxvYiBidWZmZXIgZmFpbGVkIjsKKyAgICBtZW1jcHkoZGF0YSwga1F1YWRQb3NpdGlvbnMsIGRlc2Mud2lkdGgpOworICAgIGdsVW5tYXBCdWZmZXIoR0xfQVJSQVlfQlVGRkVSKTsKKyAgICBnbEZpbmlzaCgpOworCisgICAgTWFrZUN1cnJlbnQoMCk7CisgICAgU2V0VXBGcmFtZWJ1ZmZlcig0MCwgNDAsIDAsIGtSZW5kZXJidWZmZXIpOworICAgIEdMaW50IGFfcG9zaXRpb25fbG9jYXRpb24gPSBnbEdldEF0dHJpYkxvY2F0aW9uKG1Qcm9ncmFtLCAiYVBvc2l0aW9uIik7CisgICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKGFfcG9zaXRpb25fbG9jYXRpb24sIDIsIEdMX0ZMT0FULCBHTF9UUlVFLCAwLCAwKTsKKyAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVTLCAwLCBrUXVhZFZlcnRleENvdW50KTsKKyAgICBFWFBFQ1RfRVEoR0xlbnVte0dMX05PX0VSUk9SfSwgZ2xHZXRFcnJvcigpKTsKKworICAgIC8vIENoZWNrIHRoZSByZW5kZXJlZCBwaXhlbHMuIFRoZXJlIHNob3VsZCBiZSBhIHJlZCBzcXVhcmUgaW4gdGhlIG1pZGRsZS4KKyAgICBzdGQ6OnZlY3RvcjxHb2xkZW5QaXhlbD4gZ29sZGVuc3sKKyAgICAgICAgezUsIDM1LCBrWmVyb30sIHsxNSwgMzUsIGtaZXJvfSwgezI1LCAzNSwga1plcm99LCB7MzUsIDM1LCBrWmVyb30sCisgICAgICAgIHs1LCAyNSwga1plcm99LCB7MTUsIDI1LCBrUmVkfSwgIHsyNSwgMjUsIGtSZWR9LCAgezM1LCAyNSwga1plcm99LAorICAgICAgICB7NSwgMTUsIGtaZXJvfSwgezE1LCAxNSwga1JlZH0sICB7MjUsIDE1LCBrUmVkfSwgIHszNSwgMTUsIGtaZXJvfSwKKyAgICAgICAgezUsICA1LCBrWmVyb30sIHsxNSwgIDUsIGtaZXJvfSwgezI1LCA1LCAga1plcm99LCB7MzUsIDUsICBrWmVyb30sCisgICAgfTsKKyAgICBDaGVja0dvbGRlblBpeGVscyhnb2xkZW5zLCBHTF9SR0JBOCk7Cit9CisKKy8vIFZlcmlmaWVzIHRoYXQgYSBibG9iIGJ1ZmZlciBjYW4gYmUgZGlyZWN0bHkgYWNjZXNzZWQgZnJvbSB0aGUgQ1BVLgorVEVTVF9QKEJsb2JUZXN0LCBHcHVEYXRhQnVmZmVyQ3B1V3JpdGUpIHsKKyAgICBBSGFyZHdhcmVCdWZmZXJfRGVzYyBkZXNjID0gR2V0UGFyYW0oKTsKKyAgICBkZXNjLndpZHRoID0gc2l6ZW9mIGtRdWFkUG9zaXRpb25zOworICAgIGRlc2MudXNhZ2UgPSBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfQ1BVX1dSSVRFX1JBUkVMWSB8IEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9HUFVfREFUQV9CVUZGRVI7CisgICAgaWYgKCFTZXRVcEJ1ZmZlcihkZXNjKSkgcmV0dXJuOworCisgICAgU2V0VXBQcm9ncmFtKGtWZXJ0ZXhTaGFkZXIsIGtDb2xvckZyYWdtZW50U2hhZGVyLCBrUXVhZFBvc2l0aW9ucywgMC41Zik7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Db250ZXh0Q291bnQ7ICsraSkgeworICAgICAgICBNYWtlQ3VycmVudChpKTsKKyAgICAgICAgU2V0VXBCdWZmZXJPYmplY3QoZGVzYy53aWR0aCwgR0xfQVJSQVlfQlVGRkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHTF9EWU5BTUlDX1NUT1JBR0VfQklUX0VYVCB8IEdMX01BUF9XUklURV9CSVQpOworICAgIH0KKworICAgIC8vIENsZWFyIHRoZSBidWZmZXIgdG8gemVybworICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiB6ZXJvX2RhdGEoZGVzYy53aWR0aCAvIHNpemVvZihmbG9hdCksIDAuZik7CisgICAgZ2xCdWZmZXJTdWJEYXRhKEdMX0FSUkFZX0JVRkZFUiwgMCwgZGVzYy53aWR0aCwgemVyb19kYXRhLmRhdGEoKSk7CisgICAgZ2xGaW5pc2goKTsKKworICAgIC8vIFVwbG9hZCBhY3R1YWwgZGF0YSB3aXRoIENQVSBhY2Nlc3MKKyAgICBmbG9hdCogZGF0YSA9IG51bGxwdHI7CisgICAgaW50IHJlc3VsdCA9IEFIYXJkd2FyZUJ1ZmZlcl9sb2NrKG1CdWZmZXIsIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9DUFVfV1JJVEVfUkFSRUxZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgbnVsbHB0ciwgcmVpbnRlcnByZXRfY2FzdDx2b2lkKio+KCZkYXRhKSk7CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCByZXN1bHQpOworICAgIG1lbWNweShkYXRhLCBrUXVhZFBvc2l0aW9ucywgZGVzYy53aWR0aCk7CisgICAgQUhhcmR3YXJlQnVmZmVyX3VubG9jayhtQnVmZmVyLCBudWxscHRyKTsKKworICAgIC8vIFJlbmRlciB0aGUgYnVmZmVyIGluIHRoZSBvdGhlciBjb250ZXh0CisgICAgTWFrZUN1cnJlbnQoMCk7CisgICAgU2V0VXBGcmFtZWJ1ZmZlcig0MCwgNDAsIDAsIGtSZW5kZXJidWZmZXIpOworICAgIEdMaW50IGFfcG9zaXRpb25fbG9jYXRpb24gPSBnbEdldEF0dHJpYkxvY2F0aW9uKG1Qcm9ncmFtLCAiYVBvc2l0aW9uIik7CisgICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKGFfcG9zaXRpb25fbG9jYXRpb24sIDIsIEdMX0ZMT0FULCBHTF9UUlVFLCAwLCAwKTsKKyAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVTLCAwLCBrUXVhZFZlcnRleENvdW50KTsKKyAgICBFWFBFQ1RfRVEoR0xlbnVte0dMX05PX0VSUk9SfSwgZ2xHZXRFcnJvcigpKTsKKworICAgIC8vIENoZWNrIHRoZSByZW5kZXJlZCBwaXhlbHMuIFRoZXJlIHNob3VsZCBiZSBhIHJlZCBzcXVhcmUgaW4gdGhlIG1pZGRsZS4KKyAgICBzdGQ6OnZlY3RvcjxHb2xkZW5QaXhlbD4gZ29sZGVuc3sKKyAgICAgICAgezUsIDM1LCBrWmVyb30sIHsxNSwgMzUsIGtaZXJvfSwgezI1LCAzNSwga1plcm99LCB7MzUsIDM1LCBrWmVyb30sCisgICAgICAgIHs1LCAyNSwga1plcm99LCB7MTUsIDI1LCBrUmVkfSwgIHsyNSwgMjUsIGtSZWR9LCAgezM1LCAyNSwga1plcm99LAorICAgICAgICB7NSwgMTUsIGtaZXJvfSwgezE1LCAxNSwga1JlZH0sICB7MjUsIDE1LCBrUmVkfSwgIHszNSwgMTUsIGtaZXJvfSwKKyAgICAgICAgezUsICA1LCBrWmVyb30sIHsxNSwgIDUsIGtaZXJvfSwgezI1LCA1LCAga1plcm99LCB7MzUsIDUsICBrWmVyb30sCisgICAgfTsKKyAgICBDaGVja0dvbGRlblBpeGVscyhnb2xkZW5zLCBHTF9SR0JBOCk7Cit9CisKKy8vIFZlcmlmaWVzIHRoYXQgZGF0YSB3cml0dGVuIGludG8gYSBibG9iIGJ1ZmZlciBmcm9tIHRoZSBHUFUgY2FuIGJlIHJlYWQgb24gdGhlIENQVS4KK1RFU1RfUChCbG9iVGVzdCwgR3B1RGF0YUJ1ZmZlckNwdVJlYWQpIHsKKyAgICBpZiAobUdMVmVyc2lvbiA8IDMxKSB7CisgICAgICAgIEFMT0dJKCJUZXN0IHNraXBwZWQ6IHNoYWRlciBzdG9yYWdlIGJ1ZmZlciBvYmplY3RzIHJlcXVpcmUgRVMgMy4xKywgZm91bmQgJWQuJWQiLAorICAgICAgICAgICAgICBtR0xWZXJzaW9uIC8gMTAsIG1HTFZlcnNpb24gJSAxMCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY29uc3QgaW50IGtCdWZmZXJFbGVtZW50cyA9IDE2OworICAgIEFIYXJkd2FyZUJ1ZmZlcl9EZXNjIGRlc2MgPSBHZXRQYXJhbSgpOworICAgIGRlc2Mud2lkdGggPSBrQnVmZmVyRWxlbWVudHMgKiBzaXplb2YoaW50KTsKKyAgICBkZXNjLnVzYWdlID0gQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0NQVV9SRUFEX1JBUkVMWSB8IEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9HUFVfREFUQV9CVUZGRVI7CisgICAgaWYgKCFTZXRVcEJ1ZmZlcihkZXNjKSkgcmV0dXJuOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtQ29udGV4dENvdW50OyArK2kpIHsKKyAgICAgICAgTWFrZUN1cnJlbnQoaSk7CisgICAgICAgIFNldFVwQnVmZmVyT2JqZWN0KGRlc2Mud2lkdGgsIEdMX1NIQURFUl9TVE9SQUdFX0JVRkZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR0xfRFlOQU1JQ19TVE9SQUdFX0JJVF9FWFQgfCBHTF9NQVBfUkVBRF9CSVQpOworICAgIH0KKworICAgIC8vIENsZWFyIHRoZSBidWZmZXIgdG8gemVybworICAgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGludD4gZXhwZWN0ZWRfZGF0YShrQnVmZmVyRWxlbWVudHMsIDBVKTsKKyAgICBnbEJ1ZmZlclN1YkRhdGEoR0xfU0hBREVSX1NUT1JBR0VfQlVGRkVSLCAwLCBkZXNjLndpZHRoLCBleHBlY3RlZF9kYXRhLmRhdGEoKSk7CisgICAgZ2xGaW5pc2goKTsKKworICAgIC8vIFdyaXRlIGludG8gdGhlIGJ1ZmZlciB3aXRoIGEgY29tcHV0ZSBzaGFkZXIKKyAgICBHTGludCBzdGF0dXMgPSAwOworICAgIG1Qcm9ncmFtID0gZ2xDcmVhdGVQcm9ncmFtKCk7CisgICAgR0x1aW50IHNoYWRlciA9IGdsQ3JlYXRlU2hhZGVyKEdMX0NPTVBVVEVfU0hBREVSKTsKKyAgICBnbFNoYWRlclNvdXJjZShzaGFkZXIsIDEsICZrU3Nib0NvbXB1dGVTaGFkZXJFczMxLCBudWxscHRyKTsKKyAgICBnbENvbXBpbGVTaGFkZXIoc2hhZGVyKTsKKyAgICBnbEdldFNoYWRlcml2KHNoYWRlciwgR0xfQ09NUElMRV9TVEFUVVMsICZzdGF0dXMpOworICAgIEFTU0VSVF9FUShHTF9UUlVFLCBzdGF0dXMpIDw8ICJDb21wdXRlIHNoYWRlciBjb21waWxhdGlvbiBmYWlsZWQiOworICAgIGdsQXR0YWNoU2hhZGVyKG1Qcm9ncmFtLCBzaGFkZXIpOworICAgIGdsTGlua1Byb2dyYW0obVByb2dyYW0pOworICAgIGdsR2V0UHJvZ3JhbWl2KG1Qcm9ncmFtLCBHTF9MSU5LX1NUQVRVUywgJnN0YXR1cyk7CisgICAgQVNTRVJUX0VRKEdMX1RSVUUsIHN0YXR1cykgPDwgIlNoYWRlciBwcm9ncmFtIGxpbmtpbmcgZmFpbGVkIjsKKyAgICBnbERldGFjaFNoYWRlcihtUHJvZ3JhbSwgc2hhZGVyKTsKKyAgICBnbERlbGV0ZVNoYWRlcihzaGFkZXIpOworICAgIGdsVXNlUHJvZ3JhbShtUHJvZ3JhbSk7CisgICAgQVNTRVJUX0VRKEdMZW51bXtHTF9OT19FUlJPUn0sIGdsR2V0RXJyb3IoKSk7CisgICAgZ2xCaW5kQnVmZmVyQmFzZShHTF9TSEFERVJfU1RPUkFHRV9CVUZGRVIsIDAsIG1CdWZmZXJPYmplY3RzW21XaGljaF0pOworICAgIGdsRGlzcGF0Y2hDb21wdXRlKGtCdWZmZXJFbGVtZW50cywgMSwgMSk7CisgICAgZ2xNZW1vcnlCYXJyaWVyKEdMX0JVRkZFUl9VUERBVEVfQkFSUklFUl9CSVQpOworICAgIGdsRmluaXNoKCk7CisgICAgRVhQRUNUX0VRKEdMZW51bXtHTF9OT19FUlJPUn0sIGdsR2V0RXJyb3IoKSk7CisKKyAgICAvLyBJbnNwZWN0IHRoZSBkYXRhIHdyaXR0ZW4gaW50byB0aGUgYnVmZmVyIHVzaW5nIENQVSBhY2Nlc3MuCisgICAgTWFrZUN1cnJlbnQoMCk7CisgICAgdW5zaWduZWQgaW50KiBkYXRhID0gbnVsbHB0cjsKKyAgICBpbnQgcmVzdWx0ID0gQUhhcmR3YXJlQnVmZmVyX2xvY2sobUJ1ZmZlciwgQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0NQVV9SRUFEX1JBUkVMWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsIG51bGxwdHIsIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCoqPigmZGF0YSkpOworICAgIEFTU0VSVF9FUShOT19FUlJPUiwgcmVzdWx0KTsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gczsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtCdWZmZXJFbGVtZW50czsgKytpKSB7CisJCWV4cGVjdGVkX2RhdGFbaV0gPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KGkgKiAzKTsKKyAgICAgICAgcyA8PCBkYXRhW2ldIDw8ICIsICI7CisgICAgfQorICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAoZXhwZWN0ZWRfZGF0YS5kYXRhKCksIGRhdGEsIGRlc2Mud2lkdGgpKSA8PCBzLnN0cigpOworICAgIEFIYXJkd2FyZUJ1ZmZlcl91bmxvY2sobUJ1ZmZlciwgbnVsbHB0cik7Cit9CisKKy8vIFRoZSBmaXJzdCBjYXNlIHRlc3RzIGFuIG9yZGluYXJ5IEdMIGJ1ZmZlciwgd2hpbGUgdGhlIHNlY29uZCBvbmUgdGVzdHMgYW4gQUhCLWJhY2tlZCBidWZmZXIuCitJTlNUQU5USUFURV9URVNUX0NBU0VfUCgKKyAgICBCbG9iLCBCbG9iVGVzdCwKKyAgICA6OnRlc3Rpbmc6OlZhbHVlcygKKyAgICAgICAgQUhhcmR3YXJlQnVmZmVyX0Rlc2N7MSwgMSwgMSwgQUhBUkRXQVJFQlVGRkVSX0ZPUk1BVF9CTE9CLCAwLCAwLCAwLCAwfSksCisgICAgJkdldFRlc3ROYW1lKTsKKworCitjbGFzcyBDb2xvclRlc3QgOiBwdWJsaWMgQUhhcmR3YXJlQnVmZmVyR0xUZXN0IHsKK3B1YmxpYzoKKyAgICBib29sIFNldFVwQnVmZmVyKGNvbnN0IEFIYXJkd2FyZUJ1ZmZlcl9EZXNjJiBkZXNjKSBvdmVycmlkZSB7CisgICAgICAgIGlmICgoZGVzYy51c2FnZSAmIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9HUFVfQ09MT1JfT1VUUFVUKSAmJgorICAgICAgICAgICAgIUlzRm9ybWF0Q29sb3JSZW5kZXJhYmxlKGRlc2MuZm9ybWF0LCBkZXNjLnN0cmlkZSAmIGtVc2VTcmdiKSkgeworICAgICAgICAgICAgQUxPR0koIlRlc3Qgc2tpcHBlZDogcmVxdWlyZXMgR1BVX0NPTE9SX09VVFBVVCwgYnV0IGZvcm1hdCBpcyBub3QgY29sb3ItcmVuZGVyYWJsZSIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBBSGFyZHdhcmVCdWZmZXJHTFRlc3Q6OlNldFVwQnVmZmVyKGRlc2MpOworICAgIH0KK307CisKKy8vIFZlcmlmeSB0aGF0IHdoZW4gYWxsb2NhdGluZyBhbiBBSGFyZHdhcmVCdWZmZXIgc3VjY2VlZHMgd2l0aCBHUFVfQ09MT1JfT1VUUFVULAorLy8gaXQgY2FuIGJlIGJvdW5kIGFzIGEgZnJhbWVidWZmZXIgYXR0YWNobWVudCwgZ2xDbGVhcidlZCBhbmQgdGhlbiByZWFkIGZyb20KKy8vIGFub3RoZXIgY29udGV4dCB1c2luZyBnbFJlYWRQaXhlbHMuCitURVNUX1AoQ29sb3JUZXN0LCBHcHVDb2xvck91dHB1dElzUmVuZGVyYWJsZSkgeworICAgIEFIYXJkd2FyZUJ1ZmZlcl9EZXNjIGRlc2MgPSBHZXRQYXJhbSgpOworICAgIGRlc2Mud2lkdGggPSAxMDA7CisgICAgZGVzYy5oZWlnaHQgPSAxMDA7CisgICAgZGVzYy51c2FnZSA9IEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9HUFVfQ09MT1JfT1VUUFVUOworICAgIC8vIFRoaXMgdGVzdCBkb2VzIG5vdCBtYWtlIHNlbnNlIGZvciBsYXllcmVkIGJ1ZmZlcnMgLSBkb24ndCBib3RoZXIgdGVzdGluZyB0aGVtLgorICAgIGlmIChkZXNjLmxheWVycyA+IDEpIHJldHVybjsKKyAgICBpZiAoIVNldFVwQnVmZmVyKGRlc2MpKSByZXR1cm47CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Db250ZXh0Q291bnQ7ICsraSkgeworICAgICAgICBNYWtlQ3VycmVudChpKTsKKyAgICAgICAgU2V0VXBGcmFtZWJ1ZmZlcihkZXNjLndpZHRoLCBkZXNjLmhlaWdodCwgMCwga0J1ZmZlckFzUmVuZGVyYnVmZmVyKTsKKyAgICB9CisKKyAgICAvLyBEcmF3IGEgc2ltcGxlIGNoZWNrZXJib2FyZCBwYXR0ZXJuIGluIHRoZSBzZWNvbmQgY29udGV4dCwgd2hpY2ggd2lsbAorICAgIC8vIGJlIGN1cnJlbnQgYWZ0ZXIgdGhlIGxvb3AgYWJvdmUsIHRoZW4gcmVhZCBpdCBpbiB0aGUgZmlyc3QuCisgICAgRHJhd0NoZWNrZXJib2FyZChkZXNjLndpZHRoLCBkZXNjLmhlaWdodCk7CisgICAgZ2xGaW5pc2goKTsKKworICAgIE1ha2VDdXJyZW50KDApOworICAgIHN0ZDo6dmVjdG9yPEdvbGRlblBpeGVsPiBnb2xkZW5zeworICAgICAgICB7MTAsIDkwLCBrUmVkfSwgIHs0MCwgOTAsIGtSZWR9LCAgezYwLCA5MCwga0JsdWV9LCAgezkwLCA5MCwga0JsdWV9LAorICAgICAgICB7MTAsIDYwLCBrUmVkfSwgIHs0MCwgNjAsIGtSZWR9LCAgezYwLCA2MCwga0JsdWV9LCAgezkwLCA2MCwga0JsdWV9LAorICAgICAgICB7MTAsIDQwLCBrWmVyb30sIHs0MCwgNDAsIGtaZXJvfSwgezYwLCA0MCwga0dyZWVufSwgezkwLCA0MCwga0dyZWVufSwKKyAgICAgICAgezEwLCAxMCwga1plcm99LCB7NDAsIDEwLCBrWmVyb30sIHs2MCwgMTAsIGtHcmVlbn0sIHs5MCwgMTAsIGtHcmVlbn0sCisgICAgfTsKKyAgICBDaGVja0dvbGRlblBpeGVscyhnb2xkZW5zLCBkZXNjLmZvcm1hdCk7Cit9CisKKy8vIFZlcmlmaWVzIHRoYXQgdGhlIGNvbnRlbnQgb2YgR1BVX0NPTE9SX09VVFBVVCBidWZmZXJzIGNhbiBiZSByZWFkIG9uIHRoZSBDUFUuCitURVNUX1AoQ29sb3JUZXN0LCBHcHVDb2xvck91dHB1dENwdVJlYWQpIHsKKyAgICBBSGFyZHdhcmVCdWZmZXJfRGVzYyBkZXNjID0gR2V0UGFyYW0oKTsKKyAgICBkZXNjLndpZHRoID0gMTA7CisgICAgZGVzYy5oZWlnaHQgPSAxMDsKKyAgICBkZXNjLnVzYWdlID0gQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0dQVV9DT0xPUl9PVVRQVVQgfCBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfQ1BVX1JFQURfUkFSRUxZOworICAgIC8vIFRoaXMgdGVzdCBkb2VzIG5vdCBtYWtlIHNlbnNlIGZvciBHTCBmb3JtYXRzLiBMYXllcmVkIGJ1ZmZlcnMgZG8gbm90IHN1cHBvcnQgQ1BVIGFjY2Vzcy4KKyAgICBpZiAoKGRlc2Muc3RyaWRlICYga0dsRm9ybWF0KSB8fCBkZXNjLmxheWVycyA+IDEpIHJldHVybjsKKyAgICBpZiAoIVNldFVwQnVmZmVyKGRlc2MpKSByZXR1cm47CisKKyAgICBNYWtlQ3VycmVudCgxKTsKKyAgICBTZXRVcEZyYW1lYnVmZmVyKGRlc2Mud2lkdGgsIGRlc2MuaGVpZ2h0LCAwLCBrQnVmZmVyQXNSZW5kZXJidWZmZXIpOworICAgIC8vIERyYXcgYSBzaW1wbGUgY2hlY2tlcmJvYXJkIHBhdHRlcm4gaW4gdGhlIHNlY29uZCBjb250ZXh0LCB3aGljaCB3aWxsCisgICAgLy8gYmUgY3VycmVudCBhZnRlciB0aGUgbG9vcCBhYm92ZSwgdGhlbiByZWFkIGl0IGluIHRoZSBmaXJzdC4KKyAgICBEcmF3Q2hlY2tlcmJvYXJkKGRlc2Mud2lkdGgsIGRlc2MuaGVpZ2h0KTsKKyAgICBnbEZpbmlzaCgpOworCisgICAgTWFrZUN1cnJlbnQoMCk7CisgICAgLy8gUmV0cmlldmUgdGhlIHN0cmlkZSBhbmQgbG9jayB0aGUgYnVmZmVyIGZvciBDUFUgYWNjZXNzLgorICAgIEFIYXJkd2FyZUJ1ZmZlcl9kZXNjcmliZShtQnVmZmVyLCAmZGVzYyk7CisgICAgdm9pZCogZGF0YSA9IG51bGxwdHI7CisgICAgaW50IHJlc3VsdCA9IEFIYXJkd2FyZUJ1ZmZlcl9sb2NrKG1CdWZmZXIsIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9DUFVfUkVBRF9SQVJFTFksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLCBudWxscHRyLCAmZGF0YSk7CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCByZXN1bHQpOworCisgICAgc3RkOjp2ZWN0b3I8R29sZGVuUGl4ZWw+IGdvbGRlbnN7CisgICAgICAgIHswLCA5LCBrUmVkfSwgIHs0LCA5LCBrUmVkfSwgIHs1LCA5LCBrQmx1ZX0sICB7OSwgOSwga0JsdWV9LAorICAgICAgICB7MCwgNSwga1JlZH0sICB7NCwgNSwga1JlZH0sICB7NSwgNSwga0JsdWV9LCAgezksIDUsIGtCbHVlfSwKKyAgICAgICAgezAsIDQsIGtaZXJvfSwgezQsIDQsIGtaZXJvfSwgezUsIDQsIGtHcmVlbn0sIHs5LCA0LCBrR3JlZW59LAorICAgICAgICB7MCwgMCwga1plcm99LCB7NCwgMCwga1plcm99LCB7NSwgMCwga0dyZWVufSwgezksIDAsIGtHcmVlbn0sCisgICAgfTsKKyAgICBmb3IgKGNvbnN0IEdvbGRlblBpeGVsJiBnb2xkZW4gOiBnb2xkZW5zKSB7CisgICAgICAgIHB0cmRpZmZfdCByb3dfb2Zmc2V0ID0gZ29sZGVuLnkgKiBkZXNjLnN0cmlkZTsKKyAgICAgICAgc3dpdGNoIChkZXNjLmZvcm1hdCkgeworICAgICAgICAgICAgY2FzZSBBSEFSRFdBUkVCVUZGRVJfRk9STUFUX1I4RzhCOEE4X1VOT1JNOgorICAgICAgICAgICAgY2FzZSBBSEFSRFdBUkVCVUZGRVJfRk9STUFUX1I4RzhCOFg4X1VOT1JNOiB7CisgICAgICAgICAgICAgICAgdWludDhfdCogcGl4ZWwgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihkYXRhKSArIChyb3dfb2Zmc2V0ICsgZ29sZGVuLngpICogNDsKKyAgICAgICAgICAgICAgICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDQ+IHBpeGVsX3RvX2NoZWNrOworICAgICAgICAgICAgICAgIG1lbWNweShwaXhlbF90b19jaGVjay5kYXRhKCksIHBpeGVsLCA0KTsKKyAgICAgICAgICAgICAgICBpZiAoZGVzYy5mb3JtYXQgPT0gQUhBUkRXQVJFQlVGRkVSX0ZPUk1BVF9SOEc4QjhYOF9VTk9STSkgeworICAgICAgICAgICAgICAgICAgICBwaXhlbF90b19jaGVja1szXSA9IDI1NTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ2hlY2tHb2xkZW5QaXhlbChnb2xkZW4sIHBpeGVsX3RvX2NoZWNrLCBkZXNjLmZvcm1hdCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEFIQVJEV0FSRUJVRkZFUl9GT1JNQVRfUjhHOEI4X1VOT1JNOiB7CisgICAgICAgICAgICAgICAgdWludDhfdCogcGl4ZWwgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihkYXRhKSArIChyb3dfb2Zmc2V0ICsgZ29sZGVuLngpICogMzsKKyAgICAgICAgICAgICAgICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDQ+IHBpeGVsX3RvX2NoZWNrOworICAgICAgICAgICAgICAgIG1lbWNweShwaXhlbF90b19jaGVjay5kYXRhKCksIHBpeGVsLCAzKTsKKyAgICAgICAgICAgICAgICBwaXhlbF90b19jaGVja1szXSA9IDI1NTsKKyAgICAgICAgICAgICAgICBDaGVja0dvbGRlblBpeGVsKGdvbGRlbiwgcGl4ZWxfdG9fY2hlY2ssIGRlc2MuZm9ybWF0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQUhBUkRXQVJFQlVGRkVSX0ZPUk1BVF9SNUc2QjVfVU5PUk06IHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCogcGl4ZWwgPSByZWludGVycHJldF9jYXN0PHVpbnQxNl90Kj4oCisgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGRhdGEpICsgKHJvd19vZmZzZXQgKyBnb2xkZW4ueCkgKiAyKTsKKyAgICAgICAgICAgICAgICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDQ+IHBpeGVsX3RvX2NoZWNrID0geworICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90PigoKCpwaXhlbCAmIDB4RjgwMCkgPj4gMTEpICogKDI1NS4vMzEuKSksCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KCgoKnBpeGVsICYgMHgwN0UwKSA+PiA1KSAqICgyNTUuLzYzLikpLAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90PigoKnBpeGVsICYgMHgwMDFGKSAqICgyNTUuLzMxLikpLAorICAgICAgICAgICAgICAgICAgICAyNTUsCisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBDaGVja0dvbGRlblBpeGVsKGdvbGRlbiwgcGl4ZWxfdG9fY2hlY2ssIGRlc2MuZm9ybWF0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQUhBUkRXQVJFQlVGRkVSX0ZPUk1BVF9SMTZHMTZCMTZBMTZfRkxPQVQ6IHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCogcGl4ZWwgPSByZWludGVycHJldF9jYXN0PHVpbnQxNl90Kj4oCisgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGRhdGEpICsgKHJvd19vZmZzZXQgKyBnb2xkZW4ueCkgKiA4KTsKKyAgICAgICAgICAgICAgICBzdGQ6OmFycmF5PGZsb2F0LCA0PiBwaXhlbF90b19jaGVjazsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBwaXhlbF90b19jaGVja1tpXSA9IEZsb2F0RnJvbUhhbGYocGl4ZWxbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDaGVja0dvbGRlblBpeGVsKGdvbGRlbiwgcGl4ZWxfdG9fY2hlY2spOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBBSEFSRFdBUkVCVUZGRVJfRk9STUFUX1IxMEcxMEIxMEEyX1VOT1JNOiB7CisgICAgICAgICAgICAgICAgdWludDMyX3QqIHBpeGVsID0gcmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCo+KAorICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihkYXRhKSArIChyb3dfb2Zmc2V0ICsgZ29sZGVuLngpICogNCk7CisgICAgICAgICAgICAgICAgc3RkOjphcnJheTx1aW50OF90LCA0PiBwaXhlbF90b19jaGVjayA9IHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4oKCpwaXhlbCAmIDB4MDAwMDAzRkYpICogKDI1NS4vMTAyMy4pKSwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4oKCgqcGl4ZWwgJiAweDAwMEZGQzAwKSA+PiAxMCkgKiAoMjU1Li8xMDIzLikpLAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90PigoKCpwaXhlbCAmIDB4M0ZGMDAwMDApID4+IDIwKSAqICgyNTUuLzEwMjMuKSksCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KCgoKnBpeGVsICYgMHhDMDAwMDAwMCkgPj4gMzApICogKDI1NS4vMy4pKSwKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIENoZWNrR29sZGVuUGl4ZWwoZ29sZGVuLCBwaXhlbF90b19jaGVjaywgZGVzYy5mb3JtYXQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDogRkFJTCgpIDw8ICJVbnJlY29nbml6ZWQgQUhhcmR3YXJlQnVmZmVyIGZvcm1hdCI7IGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIEFIYXJkd2FyZUJ1ZmZlcl91bmxvY2sobUJ1ZmZlciwgbnVsbHB0cik7Cit9CisKKy8vIFZlcmlmeSB0aGF0IHdoZW4gYWxsb2NhdGluZyBhbiBBSGFyZHdhcmVCdWZmZXIgc3VjY2VlZHMgd2l0aCBHUFVfU0FNUExFRF9JTUFHRSwKKy8vIGl0IGNhbiBiZSBib3VuZCBhcyBhIHRleHR1cmUsIHNldCB0byBhIGNvbG9yIHdpdGggZ2xUZXhTdWJJbWFnZTJEIGFuZCBzYW1wbGVkCisvLyBmcm9tIGluIGEgZnJhZ21lbnQgc2hhZGVyLgorVEVTVF9QKENvbG9yVGVzdCwgR3B1U2FtcGxlZEltYWdlQ2FuQmVTYW1wbGVkKSB7CisgICAgQUhhcmR3YXJlQnVmZmVyX0Rlc2MgZGVzYyA9IEdldFBhcmFtKCk7CisgICAgZGVzYy51c2FnZSA9IEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9HUFVfU0FNUExFRF9JTUFHRTsKKyAgICBpZiAoIVNldFVwQnVmZmVyKGRlc2MpKSByZXR1cm47CisKKyAgICAvLyBCaW5kIHRoZSBFR0xJbWFnZSB0byB0ZXh0dXJlcyBpbiBib3RoIGNvbnRleHRzLgorICAgIGNvbnN0IGludCBrVGV4dHVyZVVuaXQgPSA2ICUgbU1heFRleHR1cmVVbml0czsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Db250ZXh0Q291bnQ7ICsraSkgeworICAgICAgICBNYWtlQ3VycmVudChpKTsKKyAgICAgICAgU2V0VXBUZXh0dXJlKGRlc2MsIGtUZXh0dXJlVW5pdCk7CisgICAgICAgIGdsVGV4UGFyYW1ldGVyaShtVGV4VGFyZ2V0LCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX05FQVJFU1QpOworICAgICAgICBnbFRleFBhcmFtZXRlcmkobVRleFRhcmdldCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9ORUFSRVNUKTsKKyAgICB9CisgICAgLy8gSW4gdGhlIHNlY29uZCBjb250ZXh0LCB1cGxvYWQgb3BhcXVlIHJlZCB0byB0aGUgdGV4dHVyZS4KKyAgICBVcGxvYWRSZWRQaXhlbHMoZGVzYyk7CisgICAgZ2xGaW5pc2goKTsKKworICAgIC8vIEluIHRoZSBmaXJzdCBjb250ZXh0LCBkcmF3IGEgcXVhZCB0aGF0IHNhbXBsZXMgZnJvbSB0aGUgdGV4dHVyZS4KKyAgICBNYWtlQ3VycmVudCgwKTsKKyAgICBTZXRVcEZyYW1lYnVmZmVyKDQwLCA0MCwgMCwga1JlbmRlcmJ1ZmZlcik7CisgICAgZ2xDbGVhckNvbG9yKDAuZiwgMC5mLCAwLmYsIDAuZik7CisgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKKworICAgIGlmIChkZXNjLmxheWVycyA+IDEpIHsKKyAgICAgICAgU2V0VXBQcm9ncmFtKHN0ZDo6c3RyaW5nKCIjdmVyc2lvbiAzMDAgZXMiKSArIGtWZXJ0ZXhTaGFkZXJFczN4LCBrQXJyYXlGcmFnbWVudFNoYWRlckVzMzAsCisgICAgICAgICAgICAgICAgICAgICBrUXVhZFBvc2l0aW9ucywgMC41Ziwga1RleHR1cmVVbml0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBTZXRVcFByb2dyYW0oa1ZlcnRleFNoYWRlciwga1RleHR1cmVGcmFnbWVudFNoYWRlciwga1F1YWRQb3NpdGlvbnMsIDAuNWYsIGtUZXh0dXJlVW5pdCk7CisgICAgfQorICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRVMsIDAsIGtRdWFkVmVydGV4Q291bnQpOworICAgIEVYUEVDVF9FUShHTGVudW17R0xfTk9fRVJST1J9LCBnbEdldEVycm9yKCkpOworCisgICAgLy8gQ2hlY2sgdGhlIHJlbmRlcmVkIHBpeGVscy4gVGhlcmUgc2hvdWxkIGJlIGEgcmVkIHNxdWFyZSBpbiB0aGUgbWlkZGxlLgorICAgIEdvbGRlbkNvbG9yIGNvbG9yID0ga1JlZDsKKyAgICBpZiAoZGVzYy5zdHJpZGUgJiBrVXNlU3JnYikgeworICAgICAgICBjb2xvciA9IEZvcm1hdEhhc0FscGhhKGRlc2MuZm9ybWF0KSA/IGtSZWQ1MCA6IGtSZWQ1MEFscGhhMTAwOworICAgIH0KKyAgICBzdGQ6OnZlY3RvcjxHb2xkZW5QaXhlbD4gZ29sZGVuc3sKKyAgICAgICAgezUsIDM1LCBrWmVyb30sIHsxNSwgMzUsIGtaZXJvfSwgezI1LCAzNSwga1plcm99LCB7MzUsIDM1LCBrWmVyb30sCisgICAgICAgIHs1LCAyNSwga1plcm99LCB7MTUsIDI1LCBjb2xvcn0sIHsyNSwgMjUsIGNvbG9yfSwgezM1LCAyNSwga1plcm99LAorICAgICAgICB7NSwgMTUsIGtaZXJvfSwgezE1LCAxNSwgY29sb3J9LCB7MjUsIDE1LCBjb2xvcn0sIHszNSwgMTUsIGtaZXJvfSwKKyAgICAgICAgezUsICA1LCBrWmVyb30sIHsxNSwgIDUsIGtaZXJvfSwgezI1LCA1LCAga1plcm99LCB7MzUsIDUsICBrWmVyb30sCisgICAgfTsKKyAgICBDaGVja0dvbGRlblBpeGVscyhnb2xkZW5zLCBHTF9SR0JBOCk7Cit9CisKKy8vIFZlcmlmeSB0aGF0IGJ1ZmZlcnMgd2hpY2ggaGF2ZSBib3RoIEdQVV9TQU1QTEVEX0lNQUdFIGFuZCBHUFVfQ09MT1JfT1VUUFVUCisvLyBjYW4gYmUgYm90aCByZW5kZXJlZCBhbmQgc2FtcGxlZCBhcyBhIHRleHR1cmUuCitURVNUX1AoQ29sb3JUZXN0LCBHcHVDb2xvck91dHB1dEFuZFNhbXBsZWRJbWFnZSkgeworICAgIEFIYXJkd2FyZUJ1ZmZlcl9EZXNjIGRlc2MgPSBHZXRQYXJhbSgpOworICAgIGRlc2MudXNhZ2UgPSBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfR1BVX0NPTE9SX09VVFBVVCB8IEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9HUFVfU0FNUExFRF9JTUFHRTsKKyAgICBpZiAoIVNldFVwQnVmZmVyKGRlc2MpKSByZXR1cm47CisKKyAgICAvLyBCaW5kIHRoZSBFR0xJbWFnZSB0byB0ZXh0dXJlcyBpbiBib3RoIGNvbnRleHRzLgorICAgIGNvbnN0IGludCBrVGV4dHVyZVVuaXQgPSAxICUgbU1heFRleHR1cmVVbml0czsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Db250ZXh0Q291bnQ7ICsraSkgeworICAgICAgICBNYWtlQ3VycmVudChpKTsKKyAgICAgICAgU2V0VXBUZXh0dXJlKGRlc2MsIGtUZXh0dXJlVW5pdCk7CisgICAgICAgIGdsVGV4UGFyYW1ldGVyaShtVGV4VGFyZ2V0LCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX05FQVJFU1QpOworICAgICAgICBnbFRleFBhcmFtZXRlcmkobVRleFRhcmdldCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9ORUFSRVNUKTsKKyAgICB9CisKKyAgICAvLyBJbiB0aGUgc2Vjb25kIGNvbnRleHQsIGRyYXcgYSBjaGVja2VyYm9hcmQgcGF0dGVybi4KKyAgICBTZXRVcEZyYW1lYnVmZmVyKGRlc2Mud2lkdGgsIGRlc2MuaGVpZ2h0LCBkZXNjLmxheWVycyAtIDEsIGtCdWZmZXJBc1RleHR1cmUpOworICAgIERyYXdDaGVja2VyYm9hcmQoZGVzYy53aWR0aCwgZGVzYy5oZWlnaHQpOworICAgIGdsRmluaXNoKCk7CisKKyAgICAvLyBJbiB0aGUgZmlyc3QgY29udGV4dCwgZHJhdyBhIHF1YWQgdGhhdCBzYW1wbGVzIGZyb20gdGhlIHRleHR1cmUuCisgICAgTWFrZUN1cnJlbnQoMCk7CisgICAgU2V0VXBGcmFtZWJ1ZmZlcig0MCwgNDAsIDAsIGtSZW5kZXJidWZmZXIpOworICAgIGdsQ2xlYXJDb2xvcigwLmYsIDAuZiwgMC5mLCAwLmYpOworICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisKKyAgICBpZiAoZGVzYy5sYXllcnMgPiAxKSB7CisgICAgICAgIFNldFVwUHJvZ3JhbShzdGQ6OnN0cmluZygiI3ZlcnNpb24gMzAwIGVzIikgKyBrVmVydGV4U2hhZGVyRXMzeCwga0FycmF5RnJhZ21lbnRTaGFkZXJFczMwLAorICAgICAgICAgICAgICAgICAgICAga1F1YWRQb3NpdGlvbnMsIDAuNWYsIGtUZXh0dXJlVW5pdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgU2V0VXBQcm9ncmFtKGtWZXJ0ZXhTaGFkZXIsIGtUZXh0dXJlRnJhZ21lbnRTaGFkZXIsIGtRdWFkUG9zaXRpb25zLCAwLjVmLCBrVGV4dHVyZVVuaXQpOworICAgIH0KKyAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVTLCAwLCBrUXVhZFZlcnRleENvdW50KTsKKyAgICBFWFBFQ1RfRVEoR0xlbnVte0dMX05PX0VSUk9SfSwgZ2xHZXRFcnJvcigpKTsKKworICAgIC8vIENoZWNrIHRoZSByZW5kZXJlZCBwaXhlbHMuIFRoZSBsb3dlciBsZWZ0IGFyZWEgb2YgdGhlIGNoZWNrZXJib2FyZCB3aWxsCisgICAgLy8gYmUgZWl0aGVyIHRyYW5zcGFyZW50IG9yIG9wYXF1ZSBibGFjayBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgdGV4dHVyZQorICAgIC8vIGZvcm1hdCBoYXMgYW4gYWxwaGEgY2hhbm5lbC4KKyAgICBjb25zdCBHb2xkZW5Db2xvciBrQ0JCbGFjayA9IEZvcm1hdEhhc0FscGhhKGRlc2MuZm9ybWF0KSA/IGtaZXJvIDoga0JsYWNrOworICAgIHN0ZDo6dmVjdG9yPEdvbGRlblBpeGVsPiBnb2xkZW5zeworICAgICAgICB7NSwgMzUsIGtaZXJvfSwgezE1LCAzNSwga1plcm99LCAgICB7MjUsIDM1LCBrWmVyb30sICB7MzUsIDM1LCBrWmVyb30sCisgICAgICAgIHs1LCAyNSwga1plcm99LCB7MTUsIDI1LCBrUmVkfSwgICAgIHsyNSwgMjUsIGtCbHVlfSwgIHszNSwgMjUsIGtaZXJvfSwKKyAgICAgICAgezUsIDE1LCBrWmVyb30sIHsxNSwgMTUsIGtDQkJsYWNrfSwgezI1LCAxNSwga0dyZWVufSwgezM1LCAxNSwga1plcm99LAorICAgICAgICB7NSwgNSwgIGtaZXJvfSwgezE1LCA1LCAga1plcm99LCAgICB7MjUsIDUsICBrWmVyb30sICB7MzUsIDUsICBrWmVyb30sCisgICAgfTsKKyAgICBDaGVja0dvbGRlblBpeGVscyhnb2xkZW5zLCBHTF9SR0JBOCk7Cit9CisKK1RFU1RfUChDb2xvclRlc3QsIE1pcG1hcENvbXBsZXRlKSB7CisgICAgaWYgKG1HTFZlcnNpb24gPCAzMCkgeworICAgICAgICBBTE9HSSgiVGVzdCBza2lwcGVkOiByZWFkaW5nIGZyb20gbm9uemVybyBsZXZlbCBvZiBhIG1pcG1hcCByZXF1aXJlcyBFUyAzLjArLCAiCisgICAgICAgICAgICAgICJmb3VuZCAlZC4lZCIsIG1HTFZlcnNpb24gLyAxMCwgbUdMVmVyc2lvbiAlIDEwKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjb25zdCBpbnQga051bVRpbGVzID0gODsKKyAgICBBSGFyZHdhcmVCdWZmZXJfRGVzYyBkZXNjID0gR2V0UGFyYW0oKTsKKyAgICAvLyBFbnN1cmUgdGhhdCB0aGUgY2hlY2tlcmJvYXJkIHRpbGVzIGhhdmUgZXF1YWwgc2l6ZSBhdCBldmVyeSBsZXZlbCBvZiB0aGUgbWlwbWFwLgorICAgIGRlc2Mud2lkdGggPSBzdGQ6Om1heCg4dSwgUm91bmRVcFRvUG93ZXJPZjIoZGVzYy53aWR0aCkpOworICAgIGRlc2MuaGVpZ2h0ID0gc3RkOjptYXgoOHUsIFJvdW5kVXBUb1Bvd2VyT2YyKGRlc2MuaGVpZ2h0KSk7CisgICAgZGVzYy51c2FnZSA9CisgICAgICAgIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9HUFVfQ09MT1JfT1VUUFVUIHwKKyAgICAgICAgQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0dQVV9TQU1QTEVEX0lNQUdFIHwKKyAgICAgICAgQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0dQVV9NSVBNQVBfQ09NUExFVEU7CisgICAgaWYgKCFTZXRVcEJ1ZmZlcihkZXNjKSkgcmV0dXJuOworCisgICAgY29uc3QgaW50IGtUZXh0dXJlVW5pdCA9IDcgJSBtTWF4VGV4dHVyZVVuaXRzOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUNvbnRleHRDb3VudDsgKytpKSB7CisgICAgICAgIE1ha2VDdXJyZW50KGkpOworICAgICAgICBTZXRVcFRleHR1cmUoZGVzYywga1RleHR1cmVVbml0KTsKKyAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKG1UZXhUYXJnZXQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTElORUFSX01JUE1BUF9MSU5FQVIpOworICAgIH0KKworICAgIC8vIERyYXcgY2hlY2tlcmJvYXJkIGZvciBtaXBtYXBwaW5nLgorICAgIGNvbnN0IGludCBrVGlsZVdpZHRoID0gZGVzYy53aWR0aCAvIGtOdW1UaWxlczsKKyAgICBjb25zdCBpbnQga1RpbGVIZWlnaHQgPSBkZXNjLmhlaWdodCAvIGtOdW1UaWxlczsKKyAgICBTZXRVcEZyYW1lYnVmZmVyKGRlc2Mud2lkdGgsIGRlc2MuaGVpZ2h0LCBkZXNjLmxheWVycyAtIDEsIGtCdWZmZXJBc1RleHR1cmUpOworICAgIGdsRW5hYmxlKEdMX1NDSVNTT1JfVEVTVCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtVGlsZXM7ICsraSkgeworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGtOdW1UaWxlczsgKytqKSB7CisgICAgICAgICAgICBjb25zdCBmbG9hdCB2ID0gKGkgJiAxKSBeIChqICYgMSkgPyAxLmYgOiAwLmY7CisgICAgICAgICAgICBnbENsZWFyQ29sb3IodiwgMC5mLCAwLmYsIHYpOworICAgICAgICAgICAgZ2xTY2lzc29yKGkgKiBrVGlsZVdpZHRoLCBqICoga1RpbGVIZWlnaHQsIGtUaWxlV2lkdGgsIGtUaWxlSGVpZ2h0KTsKKyAgICAgICAgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZ2xEaXNhYmxlKEdMX1NDSVNTT1JfVEVTVCk7CisgICAgZ2xHZW5lcmF0ZU1pcG1hcChtVGV4VGFyZ2V0KTsKKyAgICBnbEZpbmlzaCgpOworCisgICAgTWFrZUN1cnJlbnQoMCk7CisgICAgU2V0VXBGcmFtZWJ1ZmZlcigxLCAxLCBkZXNjLmxheWVycyAtIDEsIGtCdWZmZXJBc1RleHR1cmUsIGtOb25lLCBrTm9uZSwga05vbmUsCisgICAgICAgICAgICAgICAgICAgICBNaXBMZXZlbENvdW50KGRlc2Mud2lkdGgsIGRlc2MuaGVpZ2h0KSAtIDEpOworICAgIHN0ZDo6dmVjdG9yPEdvbGRlblBpeGVsPiBnb2xkZW5ze3swLCAwLCAoZGVzYy5zdHJpZGUgJiBrVXNlU3JnYikgPyBrUmVkNTBTcmdiIDoga1JlZDUwfX07CisgICAgQ2hlY2tHb2xkZW5QaXhlbHMoZ29sZGVucywgZGVzYy5mb3JtYXQpOworfQorCitURVNUX1AoQ29sb3JUZXN0LCBDdWJlbWFwU2FtcGxpbmcpIHsKKyAgICBBSGFyZHdhcmVCdWZmZXJfRGVzYyBkZXNjID0gR2V0UGFyYW0oKTsKKyAgICBkZXNjLnVzYWdlID0KKyAgICAgICAgQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0dQVV9DT0xPUl9PVVRQVVQgfAorICAgICAgICBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfR1BVX1NBTVBMRURfSU1BR0UgfAorICAgICAgICBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfR1BVX0NVQkVfTUFQOworICAgIGRlc2MuaGVpZ2h0ID0gZGVzYy53aWR0aDsKKyAgICBkZXNjLmxheWVycyAqPSA2OworICAgIGlmICghU2V0VXBCdWZmZXIoZGVzYykpIHJldHVybjsKKworICAgIGNvbnN0IGludCBrVGV4dHVyZVVuaXQgPSA0ICUgbU1heFRleHR1cmVVbml0czsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Db250ZXh0Q291bnQ7ICsraSkgeworICAgICAgICBNYWtlQ3VycmVudChpKTsKKyAgICAgICAgU2V0VXBUZXh0dXJlKGRlc2MsIGtUZXh0dXJlVW5pdCk7CisgICAgfQorCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2OyArK2kpIHsKKyAgICAgICAgU2V0VXBGcmFtZWJ1ZmZlcihkZXNjLndpZHRoLCBkZXNjLmhlaWdodCwgZGVzYy5sYXllcnMgLSA2ICsgaSwga0J1ZmZlckFzVGV4dHVyZSk7CisgICAgICAgIERyYXdDaGVja2VyYm9hcmQoZGVzYy53aWR0aCwgZGVzYy5oZWlnaHQpOworICAgIH0KKyAgICBnbEZpbmlzaCgpOworCisgICAgTWFrZUN1cnJlbnQoMCk7CisgICAgaWYgKGRlc2MubGF5ZXJzID4gNikgeworICAgICAgICBTZXRVcFByb2dyYW0oc3RkOjpzdHJpbmcoIiN2ZXJzaW9uIDMyMCBlcyIpICsga1ZlcnRleFNoYWRlckVzM3gsCisgICAgICAgICAgICAgICAgICAgICBrQ3ViZU1hcEFycmF5RnJhZ21lbnRTaGFkZXJFczMyLCBrUXVhZFBvc2l0aW9ucywgMC41Ziwga1RleHR1cmVVbml0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBTZXRVcFByb2dyYW0oa1ZlcnRleFNoYWRlciwga0N1YmVNYXBGcmFnbWVudFNoYWRlciwga1F1YWRQb3NpdGlvbnMsIDAuNWYsIGtUZXh0dXJlVW5pdCk7CisgICAgfQorICAgIFNldFVwRnJhbWVidWZmZXIoNDAsIDQwLCAwLCBrUmVuZGVyYnVmZmVyKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDY7ICsraSkgeworICAgICAgICBmbG9hdCBmYWNlX3ZlY3RvclszXSA9IHswLmYsIDAuZiwgMC5mfTsKKyAgICAgICAgZmFjZV92ZWN0b3JbaSAvIDJdID0gKGkgJSAyKSA/IC0xLmYgOiAxLmY7CisgICAgICAgIGdsVW5pZm9ybTNmdihtRmFjZVZlY3RvckxvY2F0aW9uLCAxLCBmYWNlX3ZlY3Rvcik7CisgICAgICAgIGdsQ2xlYXJDb2xvcigwLmYsIDAuZiwgMC5mLCAwLmYpOworICAgICAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOworICAgICAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVTLCAwLCBrUXVhZFZlcnRleENvdW50KTsKKworICAgICAgICBjb25zdCBHb2xkZW5Db2xvciBrQ0JCbGFjayA9IEZvcm1hdEhhc0FscGhhKGRlc2MuZm9ybWF0KSA/IGtaZXJvIDoga0JsYWNrOworICAgICAgICBzdGQ6OnZlY3RvcjxHb2xkZW5QaXhlbD4gZ29sZGVuc3sKKyAgICAgICAgICAgIHs1LCAzNSwga1plcm99LCB7MTUsIDM1LCBrWmVyb30sICAgIHsyNSwgMzUsIGtaZXJvfSwgIHszNSwgMzUsIGtaZXJvfSwKKyAgICAgICAgICAgIHs1LCAyNSwga1plcm99LCB7MTUsIDI1LCBrUmVkfSwgICAgIHsyNSwgMjUsIGtCbHVlfSwgIHszNSwgMjUsIGtaZXJvfSwKKyAgICAgICAgICAgIHs1LCAxNSwga1plcm99LCB7MTUsIDE1LCBrQ0JCbGFja30sIHsyNSwgMTUsIGtHcmVlbn0sIHszNSwgMTUsIGtaZXJvfSwKKyAgICAgICAgICAgIHs1LCA1LCAga1plcm99LCB7MTUsIDUsICBrWmVyb30sICAgIHsyNSwgNSwgIGtaZXJvfSwgIHszNSwgNSwgIGtaZXJvfSwKKyAgICAgICAgfTsKKyAgICAgICAgQ2hlY2tHb2xkZW5QaXhlbHMoZ29sZGVucywgR0xfUkdCQTgpOworICAgIH0KK30KKworVEVTVF9QKENvbG9yVGVzdCwgQ3ViZW1hcE1pcG1hcHMpIHsKKyAgICBpZiAobUdMVmVyc2lvbiA8IDMwKSB7CisgICAgICAgIEFMT0dJKCJUZXN0IHNraXBwZWQ6IHJlYWRpbmcgZnJvbSBub256ZXJvIGxldmVsIG9mIGEgbWlwbWFwIHJlcXVpcmVzIEVTIDMuMCssICIKKyAgICAgICAgICAgICAgImZvdW5kICVkLiVkIiwgbUdMVmVyc2lvbiAvIDEwLCBtR0xWZXJzaW9uICUgMTApOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGNvbnN0IGludCBrTnVtVGlsZXMgPSA4OworICAgIEFIYXJkd2FyZUJ1ZmZlcl9EZXNjIGRlc2MgPSBHZXRQYXJhbSgpOworICAgIGRlc2MudXNhZ2UgPQorICAgICAgICBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfR1BVX0NPTE9SX09VVFBVVCB8CisgICAgICAgIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9HUFVfU0FNUExFRF9JTUFHRSB8CisgICAgICAgIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9HUFVfQ1VCRV9NQVAgfAorICAgICAgICBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfR1BVX01JUE1BUF9DT01QTEVURTsKKyAgICAvLyBFbnN1cmUgdGhhdCB0aGUgY2hlY2tlcmJvYXJkIHRpbGVzIGhhdmUgZXF1YWwgc2l6ZSBhdCBldmVyeSBsZXZlbCBvZiB0aGUgbWlwbWFwLgorICAgIGRlc2Mud2lkdGggPSBzdGQ6Om1heCg4dSwgUm91bmRVcFRvUG93ZXJPZjIoZGVzYy53aWR0aCkpOworICAgIGRlc2MuaGVpZ2h0ID0gZGVzYy53aWR0aDsKKyAgICBkZXNjLmxheWVycyAqPSA2OworICAgIGlmICghU2V0VXBCdWZmZXIoZGVzYykpIHJldHVybjsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUNvbnRleHRDb3VudDsgKytpKSB7CisgICAgICAgIE1ha2VDdXJyZW50KGkpOworICAgICAgICBTZXRVcFRleHR1cmUoZGVzYywgNSk7CisgICAgfQorCisgICAgY29uc3QgaW50IGtUaWxlU2l6ZSA9IGRlc2Mud2lkdGggLyBrTnVtVGlsZXM7CisgICAgZ2xFbmFibGUoR0xfU0NJU1NPUl9URVNUKTsKKyAgICBmb3IgKGludCBmYWNlID0gMDsgZmFjZSA8IDY7ICsrZmFjZSkgeworICAgICAgICBTZXRVcEZyYW1lYnVmZmVyKGRlc2Mud2lkdGgsIGRlc2MuaGVpZ2h0LCBkZXNjLmxheWVycyAtIDYgKyBmYWNlLCBrQnVmZmVyQXNUZXh0dXJlKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtVGlsZXM7ICsraSkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwga051bVRpbGVzOyArK2opIHsKKyAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCB2ID0gKGkgJiAxKSBeIChqICYgMSkgPyAxLmYgOiAwLmY7CisgICAgICAgICAgICAgICAgZ2xDbGVhckNvbG9yKHYsIDAuZiwgMC5mLCB2KTsKKyAgICAgICAgICAgICAgICBnbFNjaXNzb3IoaSAqIGtUaWxlU2l6ZSwgaiAqIGtUaWxlU2l6ZSwga1RpbGVTaXplLCBrVGlsZVNpemUpOworICAgICAgICAgICAgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZ2xEaXNhYmxlKEdMX1NDSVNTT1JfVEVTVCk7CisgICAgZ2xHZW5lcmF0ZU1pcG1hcChtVGV4VGFyZ2V0KTsKKyAgICBnbEZpbmlzaCgpOworCisgICAgTWFrZUN1cnJlbnQoMCk7CisgICAgZm9yIChpbnQgZmFjZSA9IDA7IGZhY2UgPCA2OyArK2ZhY2UpIHsKKyAgICAgICAgU2V0VXBGcmFtZWJ1ZmZlcigxLCAxLCBkZXNjLmxheWVycyAtIDYgKyBmYWNlLCBrQnVmZmVyQXNUZXh0dXJlLCBrTm9uZSwga05vbmUsIGtOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1pcExldmVsQ291bnQoZGVzYy53aWR0aCwgZGVzYy5oZWlnaHQpIC0gMSk7CisgICAgICAgIHN0ZDo6dmVjdG9yPEdvbGRlblBpeGVsPiBnb2xkZW5ze3swLCAwLCAoZGVzYy5zdHJpZGUgJiBrVXNlU3JnYikgPyBrUmVkNTBTcmdiIDoga1JlZDUwfX07CisgICAgICAgIENoZWNrR29sZGVuUGl4ZWxzKGdvbGRlbnMsIGRlc2MuZm9ybWF0KTsKKyAgICB9Cit9CisKKy8vIFRoZSAnc3RyaWRlJyBmaWVsZCBpcyB1c2VkIHRvIHBhc3MgYSBjb21iaW5hdGlvbiBvZiBUZXN0RmxhZ3MuCitJTlNUQU5USUFURV9URVNUX0NBU0VfUCgKKyAgICBTaW5nbGVMYXllciwgQ29sb3JUZXN0LAorICAgIDo6dGVzdGluZzo6VmFsdWVzKAorICAgICAgICBBSGFyZHdhcmVCdWZmZXJfRGVzY3s3NSwgMzMsIDEsIEdMX1JHQjgsIDAsIGtHbEZvcm1hdCwgMCwgMH0sCisgICAgICAgIEFIYXJkd2FyZUJ1ZmZlcl9EZXNjezY0LCA4MCwgMSwgR0xfUkdCQTgsIDAsIGtHbEZvcm1hdCwgMCwgMH0sCisgICAgICAgIEFIYXJkd2FyZUJ1ZmZlcl9EZXNjezQ5LCAyMywgMSwgR0xfU1JHQjhfQUxQSEE4LCAwLCBrR2xGb3JtYXQgfCBrVXNlU3JnYiwgMCwgMH0sCisgICAgICAgIC8vIFRPRE86IGVuYWJsZSBmb3IgQW5kcm9pZCBRLgorICAgICAgICAvLyBBSGFyZHdhcmVCdWZmZXJfRGVzY3s2MywgNzgsIDEsIEdMX1JHQjU2NSwgMCwga0dsRm9ybWF0LCAwLCAwfSwKKyAgICAgICAgQUhhcmR3YXJlQnVmZmVyX0Rlc2N7NDIsIDQxLCAxLCBHTF9SR0JBMTZGLCAwLCBrR2xGb3JtYXQsIDAsIDB9LAorICAgICAgICBBSGFyZHdhcmVCdWZmZXJfRGVzY3szNywgNjMsIDEsIEdMX1JHQjEwX0EyLCAwLCBrR2xGb3JtYXQsIDAsIDB9LAorICAgICAgICBBSGFyZHdhcmVCdWZmZXJfRGVzY3szMywgMjAsIDEsIEFIQVJEV0FSRUJVRkZFUl9GT1JNQVRfUjhHOEI4QThfVU5PUk0sIDAsIDAsIDAsIDB9LAorICAgICAgICBBSGFyZHdhcmVCdWZmZXJfRGVzY3szMywgMjAsIDEsIEFIQVJEV0FSRUJVRkZFUl9GT1JNQVRfUjhHOEI4QThfVU5PUk0sIDAsIGtVc2VTcmdiLCAwLCAwfSwKKyAgICAgICAgQUhhcmR3YXJlQnVmZmVyX0Rlc2N7MjAsIDEwLCAxLCBBSEFSRFdBUkVCVUZGRVJfRk9STUFUX1I4RzhCOFg4X1VOT1JNLCAwLCAwLCAwLCAwfSwKKyAgICAgICAgQUhhcmR3YXJlQnVmZmVyX0Rlc2N7MjAsIDEwLCAxLCBBSEFSRFdBUkVCVUZGRVJfRk9STUFUX1I4RzhCOFg4X1VOT1JNLCAwLCBrVXNlU3JnYiwgMCwgMH0sCisgICAgICAgIEFIYXJkd2FyZUJ1ZmZlcl9EZXNjezE2LCAyMCwgMSwgQUhBUkRXQVJFQlVGRkVSX0ZPUk1BVF9SOEc4QjhfVU5PUk0sIDAsIDAsIDAsIDB9LAorICAgICAgICBBSGFyZHdhcmVCdWZmZXJfRGVzY3sxNiwgMjAsIDEsIEFIQVJEV0FSRUJVRkZFUl9GT1JNQVRfUjhHOEI4X1VOT1JNLCAwLCBrVXNlU3JnYiwgMCwgMH0sCisgICAgICAgIEFIYXJkd2FyZUJ1ZmZlcl9EZXNjezEwLCAyMCwgMSwgQUhBUkRXQVJFQlVGRkVSX0ZPUk1BVF9SNUc2QjVfVU5PUk0sIDAsIDAsIDAsIDB9LAorICAgICAgICBBSGFyZHdhcmVCdWZmZXJfRGVzY3sxMCwgMjAsIDEsIEFIQVJEV0FSRUJVRkZFUl9GT1JNQVRfUjE2RzE2QjE2QTE2X0ZMT0FULCAwLCAwLCAwLCAwfSwKKyAgICAgICAgQUhhcmR3YXJlQnVmZmVyX0Rlc2N7MTAsIDIwLCAxLCBBSEFSRFdBUkVCVUZGRVJfRk9STUFUX1IxMEcxMEIxMEEyX1VOT1JNLCAwLCAwLCAwLCAwfSksCisgICAgJkdldFRlc3ROYW1lKTsKKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoCisgICAgTXVsdGlwbGVMYXllcnMsIENvbG9yVGVzdCwKKyAgICA6OnRlc3Rpbmc6OlZhbHVlcygKKyAgICAgICAgQUhhcmR3YXJlQnVmZmVyX0Rlc2N7NzUsIDMzLCA1LCBHTF9SR0I4LCAwLCBrR2xGb3JtYXQsIDAsIDB9LAorICAgICAgICBBSGFyZHdhcmVCdWZmZXJfRGVzY3s2NCwgODAsIDYsIEdMX1JHQkE4LCAwLCBrR2xGb3JtYXQsIDAsIDB9LAorICAgICAgICBBSGFyZHdhcmVCdWZmZXJfRGVzY3szMywgMjgsIDQsIEdMX1NSR0I4X0FMUEhBOCwgMCwga0dsRm9ybWF0IHwga1VzZVNyZ2IsIDAsIDB9LAorICAgICAgICBBSGFyZHdhcmVCdWZmZXJfRGVzY3s0MiwgNDEsIDMsIEdMX1JHQkExNkYsIDAsIGtHbEZvcm1hdCwgMCwgMH0sCisgICAgICAgIC8vIFRPRE86IGVuYWJsZSBmb3IgQW5kcm9pZCBRLgorICAgICAgICAvLyBBSGFyZHdhcmVCdWZmZXJfRGVzY3s2MywgNzgsIDMsIEdMX1JHQjU2NSwgMCwga0dsRm9ybWF0LCAwLCAwfSwKKyAgICAgICAgQUhhcmR3YXJlQnVmZmVyX0Rlc2N7MzcsIDYzLCA0LCBHTF9SR0IxMF9BMiwgMCwga0dsRm9ybWF0LCAwLCAwfSwKKyAgICAgICAgQUhhcmR3YXJlQnVmZmVyX0Rlc2N7MjUsIDc3LCA3LCBBSEFSRFdBUkVCVUZGRVJfRk9STUFUX1I4RzhCOEE4X1VOT1JNLCAwLCAwLCAwLCAwfSwKKyAgICAgICAgQUhhcmR3YXJlQnVmZmVyX0Rlc2N7MjUsIDc3LCA3LCBBSEFSRFdBUkVCVUZGRVJfRk9STUFUX1I4RzhCOEE4X1VOT1JNLCAwLCBrVXNlU3JnYiwgMCwgMH0sCisgICAgICAgIEFIYXJkd2FyZUJ1ZmZlcl9EZXNjezMwLCAzMCwgMywgQUhBUkRXQVJFQlVGRkVSX0ZPUk1BVF9SOEc4QjhYOF9VTk9STSwgMCwgMCwgMCwgMH0sCisgICAgICAgIEFIYXJkd2FyZUJ1ZmZlcl9EZXNjezMwLCAzMCwgMywgQUhBUkRXQVJFQlVGRkVSX0ZPUk1BVF9SOEc4QjhYOF9VTk9STSwgMCwga1VzZVNyZ2IsIDAsIDB9LAorICAgICAgICBBSGFyZHdhcmVCdWZmZXJfRGVzY3s1MCwgNTAsIDQsIEFIQVJEV0FSRUJVRkZFUl9GT1JNQVRfUjhHOEI4X1VOT1JNLCAwLCAwLCAwLCAwfSwKKyAgICAgICAgQUhhcmR3YXJlQnVmZmVyX0Rlc2N7NTAsIDUwLCA0LCBBSEFSRFdBUkVCVUZGRVJfRk9STUFUX1I4RzhCOF9VTk9STSwgMCwga1VzZVNyZ2IsIDAsIDB9LAorICAgICAgICBBSGFyZHdhcmVCdWZmZXJfRGVzY3syMCwgMTAsIDIsIEFIQVJEV0FSRUJVRkZFUl9GT1JNQVRfUjVHNkI1X1VOT1JNLCAwLCAwLCAwLCAwfSwKKyAgICAgICAgQUhhcmR3YXJlQnVmZmVyX0Rlc2N7MjAsIDIwLCA0LCBBSEFSRFdBUkVCVUZGRVJfRk9STUFUX1IxNkcxNkIxNkExNl9GTE9BVCwgMCwgMCwgMCwgMH0sCisgICAgICAgIEFIYXJkd2FyZUJ1ZmZlcl9EZXNjezMwLCAyMCwgMTYsIEFIQVJEV0FSRUJVRkZFUl9GT1JNQVRfUjEwRzEwQjEwQTJfVU5PUk0sIDAsIDAsIDAsIDB9KSwKKyAgICAmR2V0VGVzdE5hbWUpOworCisKK2NsYXNzIERlcHRoVGVzdCA6IHB1YmxpYyBBSGFyZHdhcmVCdWZmZXJHTFRlc3Qge307CisKKy8vIFZlcmlmeSB0aGF0IGRlcHRoIHRlc3RpbmcgYWdhaW5zdCBhIGRlcHRoIGJ1ZmZlciByZW5kZXJlZCBpbiBhbm90aGVyIGNvbnRleHQKKy8vIHdvcmtzIGNvcnJlY3RseS4KK1RFU1RfUChEZXB0aFRlc3QsIERlcHRoQWZmZWN0c0RyYXdBY3Jvc3NDb250ZXh0cykgeworICAgIEFIYXJkd2FyZUJ1ZmZlcl9EZXNjIGRlc2MgPSBHZXRQYXJhbSgpOworICAgIGRlc2Mud2lkdGggPSA0MDsKKyAgICBkZXNjLmhlaWdodCA9IDQwOworICAgIGRlc2MudXNhZ2UgPSBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfR1BVX0NPTE9SX09VVFBVVDsKKyAgICAvLyBUaGlzIHRlc3QgZG9lcyBub3QgbWFrZSBzZW5zZSBmb3IgbGF5ZXJlZCBidWZmZXJzIC0gZG9uJ3QgYm90aGVyIHRlc3RpbmcgdGhlbS4KKyAgICBpZiAoZGVzYy5sYXllcnMgPiAxKSByZXR1cm47CisgICAgaWYgKCFTZXRVcEJ1ZmZlcihkZXNjKSkgcmV0dXJuOworCisgICAgLy8gQmluZCB0aGUgRUdMSW1hZ2UgdG8gcmVuZGVyYnVmZmVycyBhbmQgZnJhbWVidWZmZXJzIGluIGJvdGggY29udGV4dHMuCisgICAgLy8gVGhlIGRlcHRoIGJ1ZmZlciBpcyBzaGFyZWQsIGJ1dCB0aGUgY29sb3IgYnVmZmVyIGlzIG5vdC4KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Db250ZXh0Q291bnQ7ICsraSkgeworICAgICAgICBNYWtlQ3VycmVudChpKTsKKyAgICAgICAgU2V0VXBGcmFtZWJ1ZmZlcig0MCwgNDAsIDAsIGtSZW5kZXJidWZmZXIsIGtCdWZmZXJBc1JlbmRlcmJ1ZmZlcik7CisgICAgfQorCisgICAgLy8gSW4gdGhlIHNlY29uZCBjb250ZXh0LCBjbGVhciB0aGUgZGVwdGggYnVmZmVyIHRvIGEgY2hlY2tlcmJvYXJkIHBhdHRlcm4uCisgICAgRHJhd0NoZWNrZXJib2FyZCg0MCwgNDApOworICAgIGdsRmluaXNoKCk7CisKKyAgICAvLyBJbiB0aGUgZmlyc3QgY29udGV4dCwgY2xlYXIgdGhlIGNvbG9yIGJ1ZmZlciBvbmx5LCB0aGVuIGRyYXcgYSByZWQgcHlyYW1pZC4KKyAgICBNYWtlQ3VycmVudCgwKTsKKyAgICBTZXRVcFByb2dyYW0oa1ZlcnRleFNoYWRlciwga0NvbG9yRnJhZ21lbnRTaGFkZXIsIGtQeXJhbWlkUG9zaXRpb25zLCAxLmYpOworICAgIGdsQ2xlYXJDb2xvcigwLmYsIDAuZiwgMC5mLCAwLmYpOworICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgZ2xFbmFibGUoR0xfREVQVEhfVEVTVCk7CisgICAgZ2xEZXB0aEZ1bmMoR0xfTEVTUyk7CisgICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFUywgMCwga1B5cmFtaWRWZXJ0ZXhDb3VudCk7CisgICAgRVhQRUNUX0VRKEdMZW51bXtHTF9OT19FUlJPUn0sIGdsR2V0RXJyb3IoKSk7CisKKyAgICAvLyBDaGVjayBnb2xkZW4gcGl4ZWxzLgorICAgIHN0ZDo6dmVjdG9yPEdvbGRlblBpeGVsPiBnb2xkZW5zeworICAgICAgICB7NSwgMzUsIGtSZWR9LCB7MTUsIDM1LCBrUmVkfSwgIHsyNSwgMzUsIGtaZXJvfSwgezM1LCAzNSwga1plcm99LAorICAgICAgICB7NSwgMjUsIGtSZWR9LCB7MTUsIDI1LCBrWmVyb30sIHsyNSwgMjUsIGtaZXJvfSwgezM1LCAyNSwga1plcm99LAorICAgICAgICB7NSwgMTUsIGtSZWR9LCB7MTUsIDE1LCBrUmVkfSwgIHsyNSwgMTUsIGtSZWR9LCAgezM1LCAxNSwga1JlZH0sCisgICAgICAgIHs1LCA1LCAga1JlZH0sIHsxNSwgNSwgIGtSZWR9LCAgezI1LCA1LCAga1JlZH0sICB7MzUsIDUsICBrUmVkfSwKKyAgICB9OworICAgIENoZWNrR29sZGVuUGl4ZWxzKGdvbGRlbnMsIEdMX1JHQkE4KTsKK30KKworLy8gVmVyaWZ5IHRoYXQgZGVwdGggYnVmZmVycyB3aXRoIHVzYWdlIEdQVV9TQU1QTEVEX0lNQUdFIGNhbiBiZSB1c2VkIGFzIHRleHR1cmVzLgorVEVTVF9QKERlcHRoVGVzdCwgRGVwdGhDYW5CZVNhbXBsZWQpIHsKKyAgICBBSGFyZHdhcmVCdWZmZXJfRGVzYyBkZXNjID0gR2V0UGFyYW0oKTsKKyAgICBkZXNjLnVzYWdlID0gQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0dQVV9DT0xPUl9PVVRQVVQgfCBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfR1BVX1NBTVBMRURfSU1BR0U7CisgICAgaWYgKCFTZXRVcEJ1ZmZlcihkZXNjKSkgcmV0dXJuOworCisgICAgLy8gQmluZCB0aGUgRUdMSW1hZ2UgdG8gcmVuZGVyYnVmZmVycyBhbmQgZnJhbWVidWZmZXJzIGluIGJvdGggY29udGV4dHMuCisgICAgLy8gVGhlIGRlcHRoIGJ1ZmZlciBpcyBzaGFyZWQsIGJ1dCB0aGUgY29sb3IgYnVmZmVyIGlzIG5vdC4KKyAgICBjb25zdCBpbnQga1RleHR1cmVVbml0ID0gMyAlIG1NYXhUZXh0dXJlVW5pdHM7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICAgICAgTWFrZUN1cnJlbnQoaSk7CisgICAgICAgIFNldFVwVGV4dHVyZShkZXNjLCBrVGV4dHVyZVVuaXQpOworICAgICAgICBnbFRleFBhcmFtZXRlcmkobVRleFRhcmdldCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9ORUFSRVNUKTsKKyAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKG1UZXhUYXJnZXQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTkVBUkVTVCk7CisgICAgfQorCisgICAgLy8gSW4gdGhlIHNlY29uZCBjb250ZXh0LCBhdHRhY2ggdGhlIGRlcHRoIHRleHR1cmUgdG8gdGhlIGZyYW1lYnVmZmVyIGFuZCBjbGVhciB0byAxLgorICAgIFNldFVwRnJhbWVidWZmZXIoZGVzYy53aWR0aCwgZGVzYy5oZWlnaHQsIGRlc2MubGF5ZXJzIC0gMSwga05vbmUsIGtCdWZmZXJBc1RleHR1cmUpOworICAgIGdsQ2xlYXJEZXB0aGYoMS5mKTsKKyAgICBnbENsZWFyKEdMX0RFUFRIX0JVRkZFUl9CSVQpOworICAgIGdsRmluaXNoKCk7CisKKyAgICAvLyBJbiB0aGUgZmlyc3QgY29udGV4dCwgZHJhdyBhIHF1YWQgdXNpbmcgdGhlIGRlcHRoIHRleHR1cmUuCisgICAgTWFrZUN1cnJlbnQoMCk7CisgICAgU2V0VXBGcmFtZWJ1ZmZlcig0MCwgNDAsIDAsIGtSZW5kZXJidWZmZXIpOworICAgIGdsQ2xlYXJDb2xvcigwLmYsIDAuZiwgMC5mLCAwLmYpOworICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgaWYgKGRlc2MubGF5ZXJzID4gMSkgeworICAgICAgICBTZXRVcFByb2dyYW0oc3RkOjpzdHJpbmcoIiN2ZXJzaW9uIDMwMCBlcyIpICsga1ZlcnRleFNoYWRlckVzM3gsIGtBcnJheUZyYWdtZW50U2hhZGVyRXMzMCwKKyAgICAgICAgICAgICAgICAgICAgIGtRdWFkUG9zaXRpb25zLCAwLjVmLCBrVGV4dHVyZVVuaXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIFNldFVwUHJvZ3JhbShrVmVydGV4U2hhZGVyLCBrVGV4dHVyZUZyYWdtZW50U2hhZGVyLCBrUXVhZFBvc2l0aW9ucywgMC41Ziwga1RleHR1cmVVbml0KTsKKyAgICB9CisgICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFUywgMCwga1F1YWRWZXJ0ZXhDb3VudCk7CisgICAgRVhQRUNUX0VRKEdMZW51bXtHTF9OT19FUlJPUn0sIGdsR2V0RXJyb3IoKSk7CisgICAgZ2xGaW5pc2goKTsKKworICAgIC8vIENoZWNrIHRoZSByZW5kZXJlZCBwaXhlbHMuIFRoZXJlIHNob3VsZCBiZSBhIHNxdWFyZSBpbiB0aGUgbWlkZGxlLgorICAgIGNvbnN0IEdvbGRlbkNvbG9yIGtEZXB0aCA9IG1HTFZlcnNpb24gPCAzMCA/IGtXaGl0ZSA6IGtSZWQ7CisgICAgc3RkOjp2ZWN0b3I8R29sZGVuUGl4ZWw+IGdvbGRlbnN7CisgICAgICAgIHs1LCAzNSwga1plcm99LCB7MTUsIDM1LCBrWmVyb30sICB7MjUsIDM1LCBrWmVyb30sICB7MzUsIDM1LCBrWmVyb30sCisgICAgICAgIHs1LCAyNSwga1plcm99LCB7MTUsIDI1LCBrRGVwdGh9LCB7MjUsIDI1LCBrRGVwdGh9LCB7MzUsIDI1LCBrWmVyb30sCisgICAgICAgIHs1LCAxNSwga1plcm99LCB7MTUsIDE1LCBrRGVwdGh9LCB7MjUsIDE1LCBrRGVwdGh9LCB7MzUsIDE1LCBrWmVyb30sCisgICAgICAgIHs1LCAgNSwga1plcm99LCB7MTUsICA1LCBrWmVyb30sICB7MjUsIDUsICBrWmVyb30sICB7MzUsIDUsICBrWmVyb30sCisgICAgfTsKKyAgICBDaGVja0dvbGRlblBpeGVscyhnb2xkZW5zLCBHTF9SR0JBOCk7Cit9CisKK1RFU1RfUChEZXB0aFRlc3QsIERlcHRoQ3ViZW1hcFNhbXBsaW5nKSB7CisgICAgQUhhcmR3YXJlQnVmZmVyX0Rlc2MgZGVzYyA9IEdldFBhcmFtKCk7CisgICAgZGVzYy51c2FnZSA9CisgICAgICAgIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9HUFVfQ09MT1JfT1VUUFVUIHwKKyAgICAgICAgQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0dQVV9TQU1QTEVEX0lNQUdFIHwKKyAgICAgICAgQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0dQVV9DVUJFX01BUDsKKyAgICBkZXNjLmhlaWdodCA9IGRlc2Mud2lkdGg7CisgICAgZGVzYy5sYXllcnMgKj0gNjsKKyAgICBpZiAoIVNldFVwQnVmZmVyKGRlc2MpKSByZXR1cm47CisKKyAgICBjb25zdCBpbnQga1RleHR1cmVVbml0ID0gOSAlIG1NYXhUZXh0dXJlVW5pdHM7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtQ29udGV4dENvdW50OyArK2kpIHsKKyAgICAgICAgTWFrZUN1cnJlbnQoaSk7CisgICAgICAgIFNldFVwVGV4dHVyZShkZXNjLCBrVGV4dHVyZVVuaXQpOworICAgICAgICBnbFRleFBhcmFtZXRlcmkobVRleFRhcmdldCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9ORUFSRVNUKTsKKyAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKG1UZXhUYXJnZXQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTkVBUkVTVCk7CisgICAgfQorCisgICAgZ2xFbmFibGUoR0xfU0NJU1NPUl9URVNUKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDY7ICsraSkgeworICAgICAgICBTZXRVcEZyYW1lYnVmZmVyKGRlc2Mud2lkdGgsIGRlc2MuaGVpZ2h0LCBkZXNjLmxheWVycyAtIDYgKyBpLCBrTm9uZSwga0J1ZmZlckFzVGV4dHVyZSk7CisgICAgICAgIGdsQ2xlYXJEZXB0aGYoMC5mKTsKKyAgICAgICAgZ2xTY2lzc29yKDAsIDAsIGRlc2Mud2lkdGgsIGRlc2MuaGVpZ2h0KTsKKyAgICAgICAgZ2xDbGVhcihHTF9ERVBUSF9CVUZGRVJfQklUKTsKKyAgICAgICAgZ2xDbGVhckRlcHRoZigxLmYpOworICAgICAgICBnbFNjaXNzb3IoMCwgMCwgZGVzYy53aWR0aCAvIDIsIGRlc2MuaGVpZ2h0IC8gMik7CisgICAgICAgIGdsQ2xlYXIoR0xfREVQVEhfQlVGRkVSX0JJVCk7CisgICAgICAgIGdsU2Npc3NvcihkZXNjLndpZHRoIC8gMiwgZGVzYy5oZWlnaHQgLyAyLCBkZXNjLndpZHRoIC8gMiwgZGVzYy5oZWlnaHQgLyAyKTsKKyAgICAgICAgZ2xDbGVhcihHTF9ERVBUSF9CVUZGRVJfQklUKTsKKyAgICB9CisgICAgZ2xEaXNhYmxlKEdMX1NDSVNTT1JfVEVTVCk7CisgICAgZ2xGaW5pc2goKTsKKworICAgIE1ha2VDdXJyZW50KDApOworICAgIGlmIChkZXNjLmxheWVycyA+IDYpIHsKKyAgICAgICAgU2V0VXBQcm9ncmFtKHN0ZDo6c3RyaW5nKCIjdmVyc2lvbiAzMjAgZXMiKSArIGtWZXJ0ZXhTaGFkZXJFczN4LAorICAgICAgICAgICAgICAgICAgICAga0N1YmVNYXBBcnJheUZyYWdtZW50U2hhZGVyRXMzMiwga1F1YWRQb3NpdGlvbnMsIDAuNWYsIGtUZXh0dXJlVW5pdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgU2V0VXBQcm9ncmFtKGtWZXJ0ZXhTaGFkZXIsIGtDdWJlTWFwRnJhZ21lbnRTaGFkZXIsIGtRdWFkUG9zaXRpb25zLCAwLjVmLCBrVGV4dHVyZVVuaXQpOworICAgIH0KKyAgICBTZXRVcEZyYW1lYnVmZmVyKDQwLCA0MCwgMCwga1JlbmRlcmJ1ZmZlcik7CisgICAgY29uc3QgR29sZGVuQ29sb3Iga0RlcHRoID0gbUdMVmVyc2lvbiA8IDMwID8ga1doaXRlOiBrUmVkOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgKytpKSB7CisgICAgICAgIGZsb2F0IGZhY2VfdmVjdG9yWzNdID0gezAuZiwgMC5mLCAwLmZ9OworICAgICAgICBmYWNlX3ZlY3RvcltpIC8gMl0gPSAoaSAlIDIpID8gLTEuZiA6IDEuZjsKKyAgICAgICAgZ2xVbmlmb3JtM2Z2KG1GYWNlVmVjdG9yTG9jYXRpb24sIDEsIGZhY2VfdmVjdG9yKTsKKyAgICAgICAgZ2xDbGVhckNvbG9yKDAuZiwgMC5mLCAwLmYsIDAuZik7CisgICAgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRVMsIDAsIGtRdWFkVmVydGV4Q291bnQpOworCisgICAgICAgIHN0ZDo6dmVjdG9yPEdvbGRlblBpeGVsPiBnb2xkZW5zeworICAgICAgICAgICAgezUsIDM1LCBrWmVyb30sIHsxNSwgMzUsIGtaZXJvfSwgIHsyNSwgMzUsIGtaZXJvfSwgIHszNSwgMzUsIGtaZXJvfSwKKyAgICAgICAgICAgIHs1LCAyNSwga1plcm99LCB7MTUsIDI1LCBrQmxhY2t9LCB7MjUsIDI1LCBrRGVwdGh9LCB7MzUsIDI1LCBrWmVyb30sCisgICAgICAgICAgICB7NSwgMTUsIGtaZXJvfSwgezE1LCAxNSwga0RlcHRofSwgezI1LCAxNSwga0JsYWNrfSwgezM1LCAxNSwga1plcm99LAorICAgICAgICAgICAgezUsIDUsICBrWmVyb30sIHsxNSwgNSwgIGtaZXJvfSwgIHsyNSwgNSwgIGtaZXJvfSwgIHszNSwgNSwgIGtaZXJvfSwKKyAgICAgICAgfTsKKyAgICAgICAgQ2hlY2tHb2xkZW5QaXhlbHMoZ29sZGVucywgR0xfUkdCQTgpOworICAgIH0KK30KKworLy8gVGhlICdzdHJpZGUnIGZpZWxkIGlzIHVzZWQgdG8gcGFzcyBhIGNvbWJpbmF0aW9uIG9mIFRlc3RGbGFncy4KK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKAorICAgIFNpbmdsZUxheWVyLCBEZXB0aFRlc3QsCisgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgIEFIYXJkd2FyZUJ1ZmZlcl9EZXNjezE2LCAyNCwgMSwgR0xfREVQVEhfQ09NUE9ORU5UMTYsIDAsIGtHbEZvcm1hdCwgMCwgMH0sCisgICAgICAgIEFIYXJkd2FyZUJ1ZmZlcl9EZXNjezE2LCAyNCwgMSwgQUhBUkRXQVJFQlVGRkVSX0ZPUk1BVF9EMTZfVU5PUk0sIDAsIDAsIDAsIDB9LAorICAgICAgICBBSGFyZHdhcmVCdWZmZXJfRGVzY3s0NCwgMjEsIDEsIEFIQVJEV0FSRUJVRkZFUl9GT1JNQVRfRDI0X1VOT1JNLCAwLCAwLCAwLCAwfSwKKyAgICAgICAgQUhhcmR3YXJlQnVmZmVyX0Rlc2N7NTcsIDMzLCAxLCBBSEFSRFdBUkVCVUZGRVJfRk9STUFUX0QyNF9VTk9STV9TOF9VSU5ULCAwLCAwLCAwLCAwfSwKKyAgICAgICAgQUhhcmR3YXJlQnVmZmVyX0Rlc2N7MjAsIDEwLCAxLCBBSEFSRFdBUkVCVUZGRVJfRk9STUFUX0QzMl9GTE9BVCwgMCwgMCwgMCwgMH0sCisgICAgICAgIEFIYXJkd2FyZUJ1ZmZlcl9EZXNjezU3LCAzMywgMSwgQUhBUkRXQVJFQlVGRkVSX0ZPUk1BVF9EMzJfRkxPQVRfUzhfVUlOVCwgMCwgMCwgMCwgMH0pLAorICAgICZHZXRUZXN0TmFtZSk7CisKKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoCisgICAgTXVsdGlwbGVMYXllcnMsIERlcHRoVGVzdCwKKyAgICA6OnRlc3Rpbmc6OlZhbHVlcygKKyAgICAgICAgQUhhcmR3YXJlQnVmZmVyX0Rlc2N7MTYsIDI0LCA2LCBHTF9ERVBUSF9DT01QT05FTlQxNiwgMCwga0dsRm9ybWF0LCAwLCAwfSwKKyAgICAgICAgQUhhcmR3YXJlQnVmZmVyX0Rlc2N7MTYsIDI0LCA2LCBBSEFSRFdBUkVCVUZGRVJfRk9STUFUX0QxNl9VTk9STSwgMCwgMCwgMCwgMH0sCisgICAgICAgIEFIYXJkd2FyZUJ1ZmZlcl9EZXNjezQ0LCAyMSwgNCwgQUhBUkRXQVJFQlVGRkVSX0ZPUk1BVF9EMjRfVU5PUk0sIDAsIDAsIDAsIDB9LAorICAgICAgICBBSGFyZHdhcmVCdWZmZXJfRGVzY3s1NywgMzMsIDcsIEFIQVJEV0FSRUJVRkZFUl9GT1JNQVRfRDI0X1VOT1JNX1M4X1VJTlQsIDAsIDAsIDAsIDB9LAorICAgICAgICBBSGFyZHdhcmVCdWZmZXJfRGVzY3syMCwgMTAsIDUsIEFIQVJEV0FSRUJVRkZFUl9GT1JNQVRfRDMyX0ZMT0FULCAwLCAwLCAwLCAwfSwKKyAgICAgICAgQUhhcmR3YXJlQnVmZmVyX0Rlc2N7NTcsIDMzLCAzLCBBSEFSRFdBUkVCVUZGRVJfRk9STUFUX0QzMl9GTE9BVF9TOF9VSU5ULCAwLCAwLCAwLCAwfSksCisgICAgJkdldFRlc3ROYW1lKTsKKworCitjbGFzcyBTdGVuY2lsVGVzdCA6IHB1YmxpYyBBSGFyZHdhcmVCdWZmZXJHTFRlc3Qge307CisKKy8vIFZlcmlmeSB0aGF0IHN0ZW5jaWwgdGVzdGluZyBhZ2FpbnN0IGEgc3RlbmNpbCBidWZmZXIgcmVuZGVyZWQgaW4gYW5vdGhlciBjb250ZXh0CisvLyB3b3JrcyBjb3JyZWN0bHkuCitURVNUX1AoU3RlbmNpbFRlc3QsIFN0ZW5jaWxBZmZlY3RzRHJhd0Fjcm9zc0NvbnRleHRzKSB7CisgICAgQUhhcmR3YXJlQnVmZmVyX0Rlc2MgZGVzYyA9IEdldFBhcmFtKCk7CisgICAgZGVzYy53aWR0aCA9IDQwOworICAgIGRlc2MuaGVpZ2h0ID0gNDA7CisgICAgZGVzYy51c2FnZSA9IEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9HUFVfQ09MT1JfT1VUUFVUOworICAgIC8vIFRoaXMgdGVzdCBkb2VzIG5vdCBtYWtlIHNlbnNlIGZvciBsYXllcmVkIGJ1ZmZlcnMgLSBkb24ndCBib3RoZXIgdGVzdGluZyB0aGVtLgorICAgIGlmIChkZXNjLmxheWVycyA+IDEpIHJldHVybjsKKyAgICBpZiAoIVNldFVwQnVmZmVyKGRlc2MpKSByZXR1cm47CisKKyAgICAvLyBCaW5kIHRoZSBFR0xJbWFnZSB0byByZW5kZXJidWZmZXJzIGFuZCBmcmFtZWJ1ZmZlcnMgaW4gYm90aCBjb250ZXh0cy4KKyAgICAvLyBUaGUgZGVwdGggYnVmZmVyIGlzIHNoYXJlZCwgYnV0IHRoZSBjb2xvciBidWZmZXIgaXMgbm90LgorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUNvbnRleHRDb3VudDsgKytpKSB7CisgICAgICAgIE1ha2VDdXJyZW50KGkpOworICAgICAgICBTZXRVcEZyYW1lYnVmZmVyKDQwLCA0MCwgMCwga1JlbmRlcmJ1ZmZlciwga05vbmUsIGtCdWZmZXJBc1JlbmRlcmJ1ZmZlcik7CisgICAgfQorCisgICAgLy8gSW4gdGhlIHNlY29uZCBjb250ZXh0LCBjbGVhciB0aGUgc3RlbmNpbCBidWZmZXIgdG8gYSBjaGVja2VyYm9hcmQgcGF0dGVybi4KKyAgICBEcmF3Q2hlY2tlcmJvYXJkKDQwLCA0MCk7CisgICAgZ2xGaW5pc2goKTsKKworICAgIC8vIEluIHRoZSBmaXJzdCBjb250ZXh0LCBjbGVhciB0aGUgY29sb3IgYnVmZmVyIG9ubHksIHRoZW4gZHJhdyBhIGZsYXQgcXVhZC4KKyAgICBNYWtlQ3VycmVudCgwKTsKKyAgICBTZXRVcFByb2dyYW0oa1ZlcnRleFNoYWRlciwga0NvbG9yRnJhZ21lbnRTaGFkZXIsIGtRdWFkUG9zaXRpb25zLCAxLmYpOworICAgIGdsQ2xlYXJDb2xvcigwLmYsIDAuZiwgMC5mLCAwLmYpOworICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgZ2xFbmFibGUoR0xfU1RFTkNJTF9URVNUKTsKKyAgICBnbFN0ZW5jaWxGdW5jKEdMX0FMV0FZUywgMCwgMHhGRik7CisgICAgZ2xTdGVuY2lsT3AoR0xfS0VFUCwgR0xfSU5DUiwgR0xfSU5DUik7CisgICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFUywgMCwga1F1YWRWZXJ0ZXhDb3VudCk7CisgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICBnbFN0ZW5jaWxGdW5jKEdMX0VRVUFMLCAyLCAweEZGKTsKKyAgICBnbFN0ZW5jaWxPcChHTF9LRUVQLCBHTF9LRUVQLCBHTF9LRUVQKTsKKyAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVTLCAwLCBrUXVhZFZlcnRleENvdW50KTsKKyAgICBnbFVuaWZvcm00ZihtQ29sb3JMb2NhdGlvbiwgMC5mLCAxLmYsIDAuZiwgMS5mKTsKKyAgICBnbFN0ZW5jaWxGdW5jKEdMX0VRVUFMLCA0LCAweEZGKTsKKyAgICBnbFN0ZW5jaWxPcChHTF9LRUVQLCBHTF9LRUVQLCBHTF9LRUVQKTsKKyAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVTLCAwLCBrUXVhZFZlcnRleENvdW50KTsKKyAgICBFWFBFQ1RfRVEoR0xlbnVte0dMX05PX0VSUk9SfSwgZ2xHZXRFcnJvcigpKTsKKworICAgIC8vIENoZWNrIGdvbGRlbiBwaXhlbHMuCisgICAgc3RkOjp2ZWN0b3I8R29sZGVuUGl4ZWw+IGdvbGRlbnN7CisgICAgICAgIHs1LCAzNSwga1JlZH0sICB7MTUsIDM1LCBrUmVkfSwgIHsyNSwgMzUsIGtaZXJvfSwgIHszNSwgMzUsIGtaZXJvfSwKKyAgICAgICAgezUsIDI1LCBrUmVkfSwgIHsxNSwgMjUsIGtSZWR9LCAgezI1LCAyNSwga1plcm99LCAgezM1LCAyNSwga1plcm99LAorICAgICAgICB7NSwgMTUsIGtaZXJvfSwgezE1LCAxNSwga1plcm99LCB7MjUsIDE1LCBrR3JlZW59LCB7MzUsIDE1LCBrR3JlZW59LAorICAgICAgICB7NSwgNSwgIGtaZXJvfSwgezE1LCA1LCAga1plcm99LCB7MjUsIDUsICBrR3JlZW59LCB7MzUsIDUsICBrR3JlZW59LAorICAgIH07CisgICAgQ2hlY2tHb2xkZW5QaXhlbHMoZ29sZGVucywgR0xfUkdCQTgpOworfQorCisvLyBWZXJpZnkgdGhhdCBzdGVuY2lsIHRlc3RpbmcgYWdhaW5zdCBhIHN0ZW5jaWwgYnVmZmVyIHJlbmRlcmVkIGluIGFub3RoZXIgY29udGV4dAorLy8gd29ya3MgY29ycmVjdGx5LgorVEVTVF9QKFN0ZW5jaWxUZXN0LCBTdGVuY2lsVGV4dHVyZSkgeworICAgIEFIYXJkd2FyZUJ1ZmZlcl9EZXNjIGRlc2MgPSBHZXRQYXJhbSgpOworICAgIGRlc2MudXNhZ2UgPSBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfR1BVX0NPTE9SX09VVFBVVCB8IEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9HUFVfU0FNUExFRF9JTUFHRTsKKyAgICBjb25zdCBib29sIGtQdXJlU3RlbmNpbCA9CisgICAgICAgIGRlc2MuZm9ybWF0ID09IEdMX1NURU5DSUxfSU5ERVg4IHx8IGRlc2MuZm9ybWF0ID09IEFIQVJEV0FSRUJVRkZFUl9GT1JNQVRfUzhfVUlOVDsKKyAgICAvLyBQdXJlIHN0ZW5jaWwgdGV4dHVyZXMgYXJlIG9ubHkgc3VwcG9ydGVkIHdpdGggYW4gZXh0ZW5zaW9uLiBOb3RlOiB3ZSBkb24ndCBleGl0IGZvciB0aGUKKyAgICAvLyBBSEIgZm9ybWF0IGhlcmUsIGJlY2F1c2Ugd2Ugd2FudCB0byBlbnN1cmUgdGhhdCBidWZmZXIgYWxsb2NhdGlvbiBmYWlscyB3aXRoIHRoZQorICAgIC8vIEdQVV9TQU1QTEVEX0lNQUdFIHVzYWdlIGZsYWcgaWYgdGhlIGltcGxlbWVudGF0aW9uIGRvZXNuJ3Qgc3VwcG9ydCBwdXJlIHN0ZW5jaWwgdGV4dHVyZXMuCisgICAgaWYgKGRlc2MuZm9ybWF0ID09IEdMX1NURU5DSUxfSU5ERVg4ICYmICFIYXNHTEV4dGVuc2lvbigiR0xfT0VTX3RleHR1cmVfc3RlbmNpbDgiKSkgcmV0dXJuOworICAgIC8vIFN0ZW5jaWwgc2FtcGxpbmcgZnJvbSBkZXB0aC1zdGVuY2lsIHRleHR1cmVzIHdhcyBpbnRyb2R1Y2VkIGluIEVTIDMuMS4KKyAgICBpZiAoIWtQdXJlU3RlbmNpbCAmJiBtR0xWZXJzaW9uIDwgMzEpIHJldHVybjsKKyAgICBpZiAoIVNldFVwQnVmZmVyKGRlc2MpKSByZXR1cm47CisKKyAgICBjb25zdCBpbnQga1RleHR1cmVVbml0ID0gOCAlIG1NYXhUZXh0dXJlVW5pdHM7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtQ29udGV4dENvdW50OyArK2kpIHsKKyAgICAgICAgTWFrZUN1cnJlbnQoaSk7CisgICAgICAgIFNldFVwVGV4dHVyZShkZXNjLCBrVGV4dHVyZVVuaXQpOworICAgICAgICBnbFRleFBhcmFtZXRlcmkobVRleFRhcmdldCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9ORUFSRVNUKTsKKyAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKG1UZXhUYXJnZXQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTkVBUkVTVCk7CisgICAgICAgIGlmICgha1B1cmVTdGVuY2lsKSB7CisgICAgICAgICAgICBnbFRleFBhcmFtZXRlcmkobVRleFRhcmdldCwgR0xfREVQVEhfU1RFTkNJTF9URVhUVVJFX01PREUsIEdMX1NURU5DSUxfSU5ERVgpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gSW4gdGhlIHNlY29uZCBjb250ZXh0LCBjbGVhciB0aGUgc3RlbmNpbCBidWZmZXIgdG8gYSBjaGVja2VyYm9hcmQgcGF0dGVybi4KKyAgICBTZXRVcEZyYW1lYnVmZmVyKGRlc2Mud2lkdGgsIGRlc2MuaGVpZ2h0LCBkZXNjLmxheWVycyAtIDEsCisgICAgICAgICAgICAgICAgICAgICBrTm9uZSwga05vbmUsIGtCdWZmZXJBc1RleHR1cmUpOworICAgIERyYXdDaGVja2VyYm9hcmQoZGVzYy53aWR0aCwgZGVzYy5oZWlnaHQpOworICAgIGdsRmluaXNoKCk7CisKKyAgICAvLyBJbiB0aGUgZmlyc3QgY29udGV4dCwgcmVjb25zdHJ1Y3QgdGhlIGNoZWNrZXJib2FyZCB3aXRoIGEgc3BlY2lhbCBzaGFkZXIuCisgICAgTWFrZUN1cnJlbnQoMCk7CisgICAgU2V0VXBQcm9ncmFtKHN0ZDo6c3RyaW5nKCIjdmVyc2lvbiAzMDAgZXMiKSArIGtWZXJ0ZXhTaGFkZXJFczN4LAorICAgICAgICAgICAgICAgICBkZXNjLmxheWVycyA+IDEgPyBrU3RlbmNpbEFycmF5RnJhZ21lbnRTaGFkZXJFczMwIDoga1N0ZW5jaWxGcmFnbWVudFNoYWRlckVzMzAsCisgICAgICAgICAgICAgICAgIGtRdWFkUG9zaXRpb25zLCAxLmYsIGtUZXh0dXJlVW5pdCk7CisgICAgU2V0VXBGcmFtZWJ1ZmZlcig0MCwgNDAsIDAsIGtSZW5kZXJidWZmZXIpOworICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRVMsIDAsIGtRdWFkVmVydGV4Q291bnQpOworICAgIEVYUEVDVF9FUShHTGVudW17R0xfTk9fRVJST1J9LCBnbEdldEVycm9yKCkpOworCisgICAgLy8gQ2hlY2sgZ29sZGVuIHBpeGVscy4KKyAgICBzdGQ6OnZlY3RvcjxHb2xkZW5QaXhlbD4gZ29sZGVuc3sKKyAgICAgICAgezUsIDM1LCBrUmVkfSwgIHsxNSwgMzUsIGtSZWR9LCAgezI1LCAzNSwga0JsdWV9LCAgezM1LCAzNSwga0JsdWV9LAorICAgICAgICB7NSwgMjUsIGtSZWR9LCAgezE1LCAyNSwga1JlZH0sICB7MjUsIDI1LCBrQmx1ZX0sICB7MzUsIDI1LCBrQmx1ZX0sCisgICAgICAgIHs1LCAxNSwga1plcm99LCB7MTUsIDE1LCBrWmVyb30sIHsyNSwgMTUsIGtHcmVlbn0sIHszNSwgMTUsIGtHcmVlbn0sCisgICAgICAgIHs1LCA1LCAga1plcm99LCB7MTUsIDUsICBrWmVyb30sIHsyNSwgNSwgIGtHcmVlbn0sIHszNSwgNSwgIGtHcmVlbn0sCisgICAgfTsKKyAgICBDaGVja0dvbGRlblBpeGVscyhnb2xkZW5zLCBHTF9SR0JBOCk7Cit9CisKKy8vIFRoZSAnc3RyaWRlJyBmaWVsZCBpcyB1c2VkIHRvIHBhc3MgYSBjb21iaW5hdGlvbiBvZiBUZXN0RmxhZ3MuCitJTlNUQU5USUFURV9URVNUX0NBU0VfUCgKKyAgICBTaW5nbGVMYXllciwgU3RlbmNpbFRlc3QsCisgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgIEFIYXJkd2FyZUJ1ZmZlcl9EZXNjezQ5LCA1NywgMSwgR0xfU1RFTkNJTF9JTkRFWDgsIDAsIGtHbEZvcm1hdCwgMCwgMH0sCisgICAgICAgIEFIYXJkd2FyZUJ1ZmZlcl9EZXNjezM2LCA1MCwgMSwgR0xfREVQVEgyNF9TVEVOQ0lMOCwgMCwga0dsRm9ybWF0LCAwLCAwfSwKKyAgICAgICAgQUhhcmR3YXJlQnVmZmVyX0Rlc2N7MjYsIDI5LCAxLCBBSEFSRFdBUkVCVUZGRVJfRk9STUFUX1M4X1VJTlQsIDAsIDAsIDAsIDB9LAorICAgICAgICBBSGFyZHdhcmVCdWZmZXJfRGVzY3s1NywgMzMsIDEsIEFIQVJEV0FSRUJVRkZFUl9GT1JNQVRfRDI0X1VOT1JNX1M4X1VJTlQsIDAsIDAsIDAsIDB9LAorICAgICAgICBBSGFyZHdhcmVCdWZmZXJfRGVzY3sxNywgMjMsIDEsIEFIQVJEV0FSRUJVRkZFUl9GT1JNQVRfRDMyX0ZMT0FUX1M4X1VJTlQsIDAsIDAsIDAsIDB9KSwKKyAgICAmR2V0VGVzdE5hbWUpOworCitJTlNUQU5USUFURV9URVNUX0NBU0VfUCgKKyAgICBNdWx0aXBsZUxheWVycywgU3RlbmNpbFRlc3QsCisgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgIEFIYXJkd2FyZUJ1ZmZlcl9EZXNjezQ5LCA1NywgMywgR0xfU1RFTkNJTF9JTkRFWDgsIDAsIGtHbEZvcm1hdCwgMCwgMH0sCisgICAgICAgIEFIYXJkd2FyZUJ1ZmZlcl9EZXNjezM2LCA1MCwgNiwgR0xfREVQVEgyNF9TVEVOQ0lMOCwgMCwga0dsRm9ybWF0LCAwLCAwfSwKKyAgICAgICAgQUhhcmR3YXJlQnVmZmVyX0Rlc2N7MjYsIDI5LCA1LCBBSEFSRFdBUkVCVUZGRVJfRk9STUFUX1M4X1VJTlQsIDAsIDAsIDAsIDB9LAorICAgICAgICBBSGFyZHdhcmVCdWZmZXJfRGVzY3s1NywgMzMsIDQsIEFIQVJEV0FSRUJVRkZFUl9GT1JNQVRfRDI0X1VOT1JNX1M4X1VJTlQsIDAsIDAsIDAsIDB9LAorICAgICAgICBBSGFyZHdhcmVCdWZmZXJfRGVzY3sxNywgMjMsIDcsIEFIQVJEV0FSRUJVRkZFUl9GT1JNQVRfRDMyX0ZMT0FUX1M4X1VJTlQsIDAsIDAsIDAsIDB9KSwKKyAgICAmR2V0VGVzdE5hbWUpOworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbmF0aXZlaGFyZHdhcmUvam5pL0FIYXJkd2FyZUJ1ZmZlclRlc3QuY3BwIGIvdGVzdHMvdGVzdHMvbmF0aXZlaGFyZHdhcmUvam5pL0FIYXJkd2FyZUJ1ZmZlclRlc3QuY3BwCmluZGV4IGYwY2JkMGMuLjExNjc3MWEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL25hdGl2ZWhhcmR3YXJlL2puaS9BSGFyZHdhcmVCdWZmZXJUZXN0LmNwcAorKysgYi90ZXN0cy90ZXN0cy9uYXRpdmVoYXJkd2FyZS9qbmkvQUhhcmR3YXJlQnVmZmVyVGVzdC5jcHAKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNCw4ICsxNCw2IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSAiQUhhcmR3YXJlQnVmZmVyVGVzdC5oIgotCiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CkBAIC0yNiw3MCArMjQsMTM3IEBACiAjaW5jbHVkZSA8c3RyaW5nPgogCiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZV9idWZmZXIuaD4KLSNkZWZpbmUgTE9HX1RBRyAiQUhhcmR3YXJlQnVmZmVyVGVzdCIKLSNpbmNsdWRlICJOYXRpdmVUZXN0SGVscGVyLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKICNkZWZpbmUgQkFEX1ZBTFVFIC1FSU5WQUwKICNkZWZpbmUgTk9fRVJST1IgMAogCi1zdGF0aWMgc3RkOjpzdHJpbmcgQnVpbGRIZXhGYWlsdXJlTWVzc2FnZSh1aW50NjRfdCBleHBlY3RlZCwKLSAgICAgICAgdWludDY0X3QgYWN0dWFsLCBjb25zdCBjaGFyKiB0eXBlKSB7Ci0gICAgc3RkOjpvc3RyaW5nc3RyZWFtIHNzOwotICAgIHNzIDw8IHR5cGUgPDwgIiAweCIgPDwgc3RkOjpoZXggPDwgYWN0dWFsCi0gICAgICAgICAgICA8PCAiIGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkICIgPDwgdHlwZSA8PCAiIDB4IiA8PCBzdGQ6OmhleAotICAgICAgICAgICAgPDwgZXhwZWN0ZWQ7Ci0gICAgcmV0dXJuIHNzLnN0cigpOworbmFtZXNwYWNlIHsKKworI2RlZmluZSBGT1JNQVRfQ0FTRSh4KSBjYXNlIEFIQVJEV0FSRUJVRkZFUl9GT1JNQVRfICMjIHg6IG9zIDw8ICN4IDsgYnJlYWsKKwordm9pZCBQcmludEFoYkZvcm1hdChzdGQ6Om9zdHJlYW0mIG9zLCB1aW50NjRfdCBmb3JtYXQpIHsKKyAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgICAgICBGT1JNQVRfQ0FTRShSOEc4QjhBOF9VTk9STSk7CisgICAgICAgIEZPUk1BVF9DQVNFKFI4RzhCOFg4X1VOT1JNKTsKKyAgICAgICAgRk9STUFUX0NBU0UoUjhHOEI4X1VOT1JNKTsKKyAgICAgICAgRk9STUFUX0NBU0UoUjVHNkI1X1VOT1JNKTsKKyAgICAgICAgRk9STUFUX0NBU0UoUjE2RzE2QjE2QTE2X0ZMT0FUKTsKKyAgICAgICAgRk9STUFUX0NBU0UoUjEwRzEwQjEwQTJfVU5PUk0pOworICAgICAgICBGT1JNQVRfQ0FTRShCTE9CKTsKKyAgICAgICAgRk9STUFUX0NBU0UoRDE2X1VOT1JNKTsKKyAgICAgICAgRk9STUFUX0NBU0UoRDI0X1VOT1JNKTsKKyAgICAgICAgRk9STUFUX0NBU0UoRDI0X1VOT1JNX1M4X1VJTlQpOworICAgICAgICBGT1JNQVRfQ0FTRShEMzJfRkxPQVQpOworICAgICAgICBGT1JNQVRfQ0FTRShEMzJfRkxPQVRfUzhfVUlOVCk7CisgICAgICAgIEZPUk1BVF9DQVNFKFM4X1VJTlQpOworICAgICAgICBkZWZhdWx0OiBvcyA8PCAidW5rbm93biI7IGJyZWFrOworICAgIH0KIH0KIAotc3RhdGljIHN0ZDo6c3RyaW5nIEJ1aWxkRmFpbHVyZU1lc3NhZ2UodWludDMyX3QgZXhwZWN0ZWQsCi0gICAgICAgIHVpbnQzMl90IGFjdHVhbCwgY29uc3QgY2hhciogdHlwZSkgewotICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzczsKLSAgICBzcyA8PCAiQnVmZmVyICIgPDwgdHlwZSA8PCAiIGRvIG5vdCBtYXRjaCIgPDwgIjogIiA8PCBhY3R1YWwgPDwgIiAhPSAiIDw8IGV4cGVjdGVkOwotICAgIHJldHVybiBzcy5zdHIoKTsKKyNkZWZpbmUgQklUU19DQVNFKHgpIGNhc2UgQUhBUkRXQVJFQlVGRkVSX1VTQUdFXyAjIyB4OiBvcyA8PCAjeCA7IGJyZWFrCisjZGVmaW5lIFBSSU5UX0ZMQUcoeCkgXAorICAgIGRvIHsgaWYgKHVzYWdlICYgQUhBUkRXQVJFQlVGRkVSX1VTQUdFXyAjIyB4KSB7IG9zIDw8ICN4IDw8ICIgIjsgfSB9IHdoaWxlICgwKQorCit2b2lkIFByaW50QWhiVXNhZ2Uoc3RkOjpvc3RyZWFtJiBvcywgdWludDY0X3QgdXNhZ2UpIHsKKyAgICBpZiAodXNhZ2UgPT0gMCkgeworICAgICAgICBvcyA8PCAibm9uZSI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3dpdGNoICh1c2FnZSAmIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9DUFVfUkVBRF9NQVNLKSB7CisgICAgICAgIEJJVFNfQ0FTRShDUFVfUkVBRF9ORVZFUik7CisgICAgICAgIEJJVFNfQ0FTRShDUFVfUkVBRF9SQVJFTFkpOworICAgICAgICBCSVRTX0NBU0UoQ1BVX1JFQURfT0ZURU4pOworICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICB9CisgICAgc3dpdGNoICh1c2FnZSAmIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9DUFVfV1JJVEVfTUFTSykgeworICAgICAgICBCSVRTX0NBU0UoQ1BVX1dSSVRFX05FVkVSKTsKKyAgICAgICAgQklUU19DQVNFKENQVV9XUklURV9SQVJFTFkpOworICAgICAgICBCSVRTX0NBU0UoQ1BVX1dSSVRFX09GVEVOKTsKKyAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgfQorCisgICAgUFJJTlRfRkxBRyhHUFVfU0FNUExFRF9JTUFHRSk7CisgICAgUFJJTlRfRkxBRyhHUFVfQ09MT1JfT1VUUFVUKTsKKyAgICBQUklOVF9GTEFHKFBST1RFQ1RFRF9DT05URU5UKTsKKyAgICBQUklOVF9GTEFHKFZJREVPX0VOQ09ERSk7CisgICAgUFJJTlRfRkxBRyhTRU5TT1JfRElSRUNUX0RBVEEpOworICAgIFBSSU5UX0ZMQUcoR1BVX0RBVEFfQlVGRkVSKTsKKyAgICBQUklOVF9GTEFHKEdQVV9DVUJFX01BUCk7CisgICAgUFJJTlRfRkxBRyhHUFVfTUlQTUFQX0NPTVBMRVRFKTsKKworICAgIFBSSU5UX0ZMQUcoVkVORE9SXzApOworICAgIFBSSU5UX0ZMQUcoVkVORE9SXzEpOworICAgIFBSSU5UX0ZMQUcoVkVORE9SXzIpOworICAgIFBSSU5UX0ZMQUcoVkVORE9SXzMpOworICAgIFBSSU5UX0ZMQUcoVkVORE9SXzQpOworICAgIFBSSU5UX0ZMQUcoVkVORE9SXzUpOworICAgIFBSSU5UX0ZMQUcoVkVORE9SXzYpOworICAgIFBSSU5UX0ZMQUcoVkVORE9SXzcpOworICAgIFBSSU5UX0ZMQUcoVkVORE9SXzgpOworICAgIFBSSU5UX0ZMQUcoVkVORE9SXzkpOworICAgIFBSSU5UX0ZMQUcoVkVORE9SXzEwKTsKKyAgICBQUklOVF9GTEFHKFZFTkRPUl8xMSk7CisgICAgUFJJTlRfRkxBRyhWRU5ET1JfMTIpOworICAgIFBSSU5UX0ZMQUcoVkVORE9SXzEzKTsKKyAgICBQUklOVF9GTEFHKFZFTkRPUl8xNCk7CisgICAgUFJJTlRfRkxBRyhWRU5ET1JfMTUpOworICAgIFBSSU5UX0ZMQUcoVkVORE9SXzE2KTsKKyAgICBQUklOVF9GTEFHKFZFTkRPUl8xNyk7CisgICAgUFJJTlRfRkxBRyhWRU5ET1JfMTgpOworICAgIFBSSU5UX0ZMQUcoVkVORE9SXzE5KTsKIH0KIAotc3RhdGljIHN0ZDo6c3RyaW5nIENoZWNrQUhhcmR3YXJlQnVmZmVyTWF0Y2hlc0Rlc2MoCi0gICAgICAgIEFIYXJkd2FyZUJ1ZmZlciogYWJ1ZmZlciwgY29uc3QgQUhhcmR3YXJlQnVmZmVyX0Rlc2MmIGRlc2MpIHsKLSAgICBBSGFyZHdhcmVCdWZmZXJfRGVzYyBidWZmZXJEZXNjOwotICAgIEFIYXJkd2FyZUJ1ZmZlcl9kZXNjcmliZShhYnVmZmVyLCAmYnVmZmVyRGVzYyk7Ci0gICAgaWYgKGJ1ZmZlckRlc2Mud2lkdGggIT0gZGVzYy53aWR0aCkKLSAgICAgICAgcmV0dXJuIEJ1aWxkRmFpbHVyZU1lc3NhZ2UoZGVzYy53aWR0aCwgYnVmZmVyRGVzYy53aWR0aCwgIndpZHRocyIpOwotICAgIGlmIChidWZmZXJEZXNjLmhlaWdodCAhPSBkZXNjLmhlaWdodCkKLSAgICAgICAgcmV0dXJuIEJ1aWxkRmFpbHVyZU1lc3NhZ2UoZGVzYy5oZWlnaHQsIGJ1ZmZlckRlc2MuaGVpZ2h0LCAiaGVpZ2h0cyIpOwotICAgIGlmIChidWZmZXJEZXNjLmxheWVycyAhPSBkZXNjLmxheWVycykKLSAgICAgICAgcmV0dXJuIEJ1aWxkRmFpbHVyZU1lc3NhZ2UoZGVzYy5sYXllcnMsIGJ1ZmZlckRlc2MubGF5ZXJzLCAibGF5ZXJzIik7Ci0gICAgaWYgKGJ1ZmZlckRlc2MudXNhZ2UgIT0gZGVzYy51c2FnZSkKLSAgICAgICAgcmV0dXJuIEJ1aWxkSGV4RmFpbHVyZU1lc3NhZ2UoZGVzYy51c2FnZSwgYnVmZmVyRGVzYy51c2FnZSwgInVzYWdlIik7Ci0gICAgaWYgKGJ1ZmZlckRlc2MuZm9ybWF0ICE9IGRlc2MuZm9ybWF0KQotICAgICAgICByZXR1cm4gQnVpbGRGYWlsdXJlTWVzc2FnZShkZXNjLmZvcm1hdCwgYnVmZmVyRGVzYy5mb3JtYXQsICJmb3JtYXRzIik7Ci0gICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7CitBSGFyZHdhcmVCdWZmZXJfRGVzYyBHZXREZXNjcmlwdGlvbihBSGFyZHdhcmVCdWZmZXIqIGJ1ZmZlcikgeworICAgIEFIYXJkd2FyZUJ1ZmZlcl9EZXNjIGRlc2NyaXB0aW9uOworICAgIEFIYXJkd2FyZUJ1ZmZlcl9kZXNjcmliZShidWZmZXIsICZkZXNjcmlwdGlvbik7CisgICAgcmV0dXJuIGRlc2NyaXB0aW9uOwogfQogCi1ib29sIEFIYXJkd2FyZUJ1ZmZlclRlc3Q6OlNldFVwKCkgeyByZXR1cm4gdHJ1ZTsgfQorfSAgLy8gbmFtZXNwYWNlCiAKLXZvaWQgQUhhcmR3YXJlQnVmZmVyVGVzdDo6VGVhckRvd24oKSB7fQorLy8gR1Rlc3QgcHJpbnRlciBmb3IgQUhhcmR3YXJlQnVmZmVyX0Rlc2MuIEhhcyB0byBiZSBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4KK3ZvaWQgUHJpbnRUbyhjb25zdCBBSGFyZHdhcmVCdWZmZXJfRGVzYyYgZGVzYywgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgICAgKm9zIDw8ICJBSGFyZHdhcmVCdWZmZXJfRGVzYyAiIDw8IGRlc2Mud2lkdGggPDwgIngiIDw8IGRlc2MuaGVpZ2h0OworICAgIGlmIChkZXNjLmxheWVycyA+IDEpIHsKKyAgICAgICAgKm9zIDw8ICIsICIgPDwgZGVzYy5sYXllcnMgPDwgIiBsYXllcnMiOworICAgIH0KKyAgICAqb3MgPDwgIiwgdXNhZ2UgPSAiOworICAgIFByaW50QWhiVXNhZ2UoKm9zLCBkZXNjLnVzYWdlKTsKKyAgICAqb3MgPDwgIiwgZm9ybWF0ID0gIjsKKyAgICBQcmludEFoYkZvcm1hdCgqb3MsIGRlc2MuZm9ybWF0KTsKK30KKworLy8gRXF1YWxpdHkgb3BlcmF0b3JzIGZvciBBSGFyZHdhcmVCdWZmZXJfRGVzYy4gSGF2ZSB0byBiZSBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4KK2Jvb2wgb3BlcmF0b3I9PShjb25zdCBBSGFyZHdhcmVCdWZmZXJfRGVzYyYgYSwgY29uc3QgQUhhcmR3YXJlQnVmZmVyX0Rlc2MmIGIpIHsKKyAgICByZXR1cm4gYS53aWR0aCA9PSBiLndpZHRoICYmIGEuaGVpZ2h0ID09IGIuaGVpZ2h0ICYmIGEubGF5ZXJzID09IGIubGF5ZXJzICYmCisgICAgICAgIGEudXNhZ2UgPT0gYi51c2FnZSAmJiBhLmZvcm1hdCA9PSBiLmZvcm1hdDsKK30KK2Jvb2wgb3BlcmF0b3IhPShjb25zdCBBSGFyZHdhcmVCdWZmZXJfRGVzYyYgYSwgY29uc3QgQUhhcmR3YXJlQnVmZmVyX0Rlc2MmIGIpIHsKKyAgICByZXR1cm4gIShhID09IGIpOworfQorCituYW1lc3BhY2UgYW5kcm9pZCB7CiAKIC8vIFRlc3QgdGhhdCBwYXNzaW5nIGluIE5VTEwgdmFsdWVzIHRvIGFsbG9jYXRlIHdvcmtzIGFzIGV4cGVjdGVkLgotdm9pZCBBSGFyZHdhcmVCdWZmZXJUZXN0Ojp0ZXN0QUhhcmR3YXJlQnVmZmVyX2FsbG9jYXRlX0ZhaWxzV2l0aE51bGxJbnB1dChKTklFbnYqIGVudikgeworVEVTVChBSGFyZHdhcmVCdWZmZXJUZXN0LCBBbGxvY2F0ZUZhaWxzV2l0aE51bGxJbnB1dCkgewogICAgIEFIYXJkd2FyZUJ1ZmZlciogYnVmZmVyOwogICAgIEFIYXJkd2FyZUJ1ZmZlcl9EZXNjIGRlc2M7CiAKICAgICBtZW1zZXQoJmRlc2MsIDAsIHNpemVvZihBSGFyZHdhcmVCdWZmZXJfRGVzYykpOwogCiAgICAgaW50IHJlcyA9IEFIYXJkd2FyZUJ1ZmZlcl9hbGxvY2F0ZSgmZGVzYywgTlVMTCk7Ci0gICAgQVNTRVJUX0VRKEJBRF9WQUxVRSwgcmVzKTsKKyAgICBFWFBFQ1RfRVEoQkFEX1ZBTFVFLCByZXMpOwogICAgIHJlcyA9IEFIYXJkd2FyZUJ1ZmZlcl9hbGxvY2F0ZShOVUxMLCAmYnVmZmVyKTsKLSAgICBBU1NFUlRfRVEoQkFEX1ZBTFVFLCByZXMpOworICAgIEVYUEVDVF9FUShCQURfVkFMVUUsIHJlcyk7CiAgICAgcmVzID0gQUhhcmR3YXJlQnVmZmVyX2FsbG9jYXRlKE5VTEwsIE5VTEwpOwotICAgIEFTU0VSVF9FUShCQURfVkFMVUUsIHJlcyk7CisgICAgRVhQRUNUX0VRKEJBRF9WQUxVRSwgcmVzKTsKIH0KIAogLy8gVGVzdCB0aGF0IHBhc3NpbmcgaW4gTlVMTCB2YWx1ZXMgdG8gYWxsb2NhdGUgd29ya3MgYXMgZXhwZWN0ZWQuCi12b2lkIEFIYXJkd2FyZUJ1ZmZlclRlc3Q6OnRlc3RBSGFyZHdhcmVCdWZmZXJfYWxsb2NhdGVfQmxvYkZvcm1hdFJlcXVpcmVzSGVpZ2h0MShKTklFbnYqIGVudikgeworVEVTVChBSGFyZHdhcmVCdWZmZXJUZXN0LCBCbG9iRm9ybWF0UmVxdWlyZXNIZWlnaHQxKSB7CiAgICAgQUhhcmR3YXJlQnVmZmVyKiBidWZmZXI7CiAgICAgQUhhcmR3YXJlQnVmZmVyX0Rlc2MgZGVzYyA9IHt9OwogCkBAIC05OSwxOCArMTY0LDE4IEBACiAgICAgZGVzYy51c2FnZSA9IEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9DUFVfUkVBRF9SQVJFTFk7CiAgICAgZGVzYy5mb3JtYXQgPSBBSEFSRFdBUkVCVUZGRVJfRk9STUFUX0JMT0I7CiAgICAgaW50IHJlcyA9IEFIYXJkd2FyZUJ1ZmZlcl9hbGxvY2F0ZSgmZGVzYywgJmJ1ZmZlcik7Ci0gICAgQVNTRVJUX0VRKEJBRF9WQUxVRSwgcmVzKTsKKyAgICBFWFBFQ1RfRVEoQkFEX1ZBTFVFLCByZXMpOwogCiAgICAgZGVzYy5oZWlnaHQgPSAxOwogICAgIHJlcyA9IEFIYXJkd2FyZUJ1ZmZlcl9hbGxvY2F0ZSgmZGVzYywgJmJ1ZmZlcik7Ci0gICAgQVNTRVJUX0VRKE5PX0VSUk9SLCByZXMpOwotICAgIEFTU0VSVF9FUShzdGQ6OnN0cmluZygpLCBDaGVja0FIYXJkd2FyZUJ1ZmZlck1hdGNoZXNEZXNjKGJ1ZmZlciwgZGVzYykpOworICAgIEVYUEVDVF9FUShOT19FUlJPUiwgcmVzKTsKKyAgICBFWFBFQ1RfRVEoZGVzYywgR2V0RGVzY3JpcHRpb24oYnVmZmVyKSk7CiAgICAgQUhhcmR3YXJlQnVmZmVyX3JlbGVhc2UoYnVmZmVyKTsKICAgICBidWZmZXIgPSBOVUxMOwogfQogCiAvLyBUZXN0IHRoYXQgYWxsb2NhdGUgY2FuIGNyZWF0ZSBhbiBBSGFyZHdhcmVCdWZmZXIgY29ycmVjdGx5Lgotdm9pZCBBSGFyZHdhcmVCdWZmZXJUZXN0Ojp0ZXN0QUhhcmR3YXJlQnVmZmVyX2FsbG9jYXRlX1N1Y2NlZWRzKEpOSUVudiogZW52KSB7CitURVNUKEFIYXJkd2FyZUJ1ZmZlclRlc3QsIEFsbG9jYXRlU3VjY2VlZHMpIHsKICAgICBBSGFyZHdhcmVCdWZmZXIqIGJ1ZmZlciA9IE5VTEw7CiAgICAgQUhhcmR3YXJlQnVmZmVyX0Rlc2MgZGVzYyA9IHt9OwogCkBAIC0xMjAsOCArMTg1LDggQEAKICAgICBkZXNjLnVzYWdlID0gQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0dQVV9TQU1QTEVEX0lNQUdFOwogICAgIGRlc2MuZm9ybWF0ID0gQUhBUkRXQVJFQlVGRkVSX0ZPUk1BVF9SOEc4QjhBOF9VTk9STTsKICAgICBpbnQgcmVzID0gQUhhcmR3YXJlQnVmZmVyX2FsbG9jYXRlKCZkZXNjLCAmYnVmZmVyKTsKLSAgICBBU1NFUlRfRVEoTk9fRVJST1IsIHJlcyk7Ci0gICAgQVNTRVJUX0VRKHN0ZDo6c3RyaW5nKCksIENoZWNrQUhhcmR3YXJlQnVmZmVyTWF0Y2hlc0Rlc2MoYnVmZmVyLCBkZXNjKSk7CisgICAgRVhQRUNUX0VRKE5PX0VSUk9SLCByZXMpOworICAgIEVYUEVDVF9FUShkZXNjLCBHZXREZXNjcmlwdGlvbihidWZmZXIpKTsKICAgICBBSGFyZHdhcmVCdWZmZXJfcmVsZWFzZShidWZmZXIpOwogICAgIGJ1ZmZlciA9IE5VTEw7CiAKQEAgLTEzMSwxMiArMTk2LDEyIEBACiAgICAgZGVzYy51c2FnZSA9IEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9HUFVfU0FNUExFRF9JTUFHRTsKICAgICBkZXNjLmZvcm1hdCA9IEFIQVJEV0FSRUJVRkZFUl9GT1JNQVRfUjVHNkI1X1VOT1JNOwogICAgIHJlcyA9IEFIYXJkd2FyZUJ1ZmZlcl9hbGxvY2F0ZSgmZGVzYywgJmJ1ZmZlcik7Ci0gICAgQVNTRVJUX0VRKE5PX0VSUk9SLCByZXMpOwotICAgIEFTU0VSVF9FUShzdGQ6OnN0cmluZygpLCBDaGVja0FIYXJkd2FyZUJ1ZmZlck1hdGNoZXNEZXNjKGJ1ZmZlciwgZGVzYykpOworICAgIEVYUEVDVF9FUShOT19FUlJPUiwgcmVzKTsKKyAgICBFWFBFQ1RfRVEoZGVzYywgR2V0RGVzY3JpcHRpb24oYnVmZmVyKSk7CiAgICAgQUhhcmR3YXJlQnVmZmVyX3JlbGVhc2UoYnVmZmVyKTsKIH0KIAotdm9pZCBBSGFyZHdhcmVCdWZmZXJUZXN0Ojp0ZXN0QUhhcmR3YXJlQnVmZmVyX2Rlc2NyaWJlX1N1Y2NlZWRzKEpOSUVudiogZW52KSB7CitURVNUKEFIYXJkd2FyZUJ1ZmZlclRlc3QsIERlc2NyaWJlU3VjY2VlZHMpIHsKICAgICBBSGFyZHdhcmVCdWZmZXIqIGJ1ZmZlciA9IE5VTEw7CiAgICAgQUhhcmR3YXJlQnVmZmVyX0Rlc2MgZGVzYyA9IHt9OwogCkBAIC0xNDYsMzkgKzIxMSwzOSBAQAogICAgIGRlc2MudXNhZ2UgPSBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfR1BVX1NBTVBMRURfSU1BR0U7CiAgICAgZGVzYy5mb3JtYXQgPSBBSEFSRFdBUkVCVUZGRVJfRk9STUFUX1I4RzhCOEE4X1VOT1JNOwogICAgIGludCByZXMgPSBBSGFyZHdhcmVCdWZmZXJfYWxsb2NhdGUoJmRlc2MsICZidWZmZXIpOwotICAgIEFTU0VSVF9FUShOT19FUlJPUiwgcmVzKTsKKyAgICBFWFBFQ1RfRVEoTk9fRVJST1IsIHJlcyk7CiAKLSAgICBBSGFyZHdhcmVCdWZmZXJfRGVzYyBleHBlY3RlZF9kZXNjOwotICAgIG1lbXNldCgmZXhwZWN0ZWRfZGVzYywgMCwgc2l6ZW9mKEFIYXJkd2FyZUJ1ZmZlcl9EZXNjKSk7Ci0gICAgQUhhcmR3YXJlQnVmZmVyX2Rlc2NyaWJlKE5VTEwsICZkZXNjKTsKLSAgICBBU1NFUlRfRVEoMFUsIGV4cGVjdGVkX2Rlc2Mud2lkdGgpOworICAgIC8vIERlc2NyaXB0aW9uIG9mIGEgbnVsbCBidWZmZXIgc2hvdWxkIGJlIGFsbCB6ZXJvcy4KKyAgICBBSGFyZHdhcmVCdWZmZXJfRGVzYyBzY3JhdGNoX2Rlc2M7CisgICAgbWVtc2V0KCZzY3JhdGNoX2Rlc2MsIDAsIHNpemVvZihBSGFyZHdhcmVCdWZmZXJfRGVzYykpOworICAgIEFIYXJkd2FyZUJ1ZmZlcl9kZXNjcmliZShOVUxMLCAmc2NyYXRjaF9kZXNjKTsKKyAgICBFWFBFQ1RfRVEoMFUsIHNjcmF0Y2hfZGVzYy53aWR0aCk7CisgICAgRVhQRUNUX0VRKDBVLCBzY3JhdGNoX2Rlc2MuaGVpZ2h0KTsKKworICAgIC8vIFRoaXMgc2hvdWxkbid0IGNyYXNoLgogICAgIEFIYXJkd2FyZUJ1ZmZlcl9kZXNjcmliZShidWZmZXIsIE5VTEwpOwotICAgIEFTU0VSVF9FUSgwVSwgZXhwZWN0ZWRfZGVzYy53aWR0aCk7Ci0gICAgQUhhcmR3YXJlQnVmZmVyX2Rlc2NyaWJlKGJ1ZmZlciwgJmRlc2MpOwotICAgIEFTU0VSVF9FUShzdGQ6OnN0cmluZygpLCBDaGVja0FIYXJkd2FyZUJ1ZmZlck1hdGNoZXNEZXNjKGJ1ZmZlciwgZGVzYykpOwogCisgICAgLy8gRGVzY3JpcHRpb24gb2YgY3JlYXRlZCBidWZmZXIgc2hvdWxkIG1hdGNoIHJlcXVzdGVkIGRlc2NyaXB0aW9uLgorICAgIEVYUEVDVF9FUShkZXNjLCBHZXREZXNjcmlwdGlvbihidWZmZXIpKTsKICAgICBBSGFyZHdhcmVCdWZmZXJfcmVsZWFzZShidWZmZXIpOwogfQogCiBzdHJ1Y3QgQ2xpZW50RGF0YSB7CiAgICAgaW50IGZkOwotICAgIEpOSUVudiogZW52OwogICAgIEFIYXJkd2FyZUJ1ZmZlciogYnVmZmVyOwotICAgIENsaWVudERhdGEoaW50IGZkX2luLCBKTklFbnYqIGVudl9pbiwgQUhhcmR3YXJlQnVmZmVyKiBidWZmZXJfaW4pCi0gICAgICAgICAgICA6IGZkKGZkX2luKSwgZW52KGVudl9pbiksIGJ1ZmZlcihidWZmZXJfaW4pIHt9CisgICAgQ2xpZW50RGF0YShpbnQgZmRfaW4sIEFIYXJkd2FyZUJ1ZmZlciogYnVmZmVyX2luKQorICAgICAgICAgICAgOiBmZChmZF9pbiksIGJ1ZmZlcihidWZmZXJfaW4pIHt9CiB9OwogCiBzdGF0aWMgdm9pZCogY2xpZW50RnVuY3Rpb24odm9pZCogZGF0YSkgewogICAgIENsaWVudERhdGEqIHBkYXRhID0gcmVpbnRlcnByZXRfY2FzdDxDbGllbnREYXRhKj4oZGF0YSk7CiAgICAgaW50IGVyciA9IEFIYXJkd2FyZUJ1ZmZlcl9zZW5kSGFuZGxlVG9Vbml4U29ja2V0KHBkYXRhLT5idWZmZXIsIHBkYXRhLT5mZCk7Ci0gICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICBmYWlsKHBkYXRhLT5lbnYsICJFcnJvciBzZW5kaW5nIGhhbmRsZSB0byBzb2NrZXQ6ICVkIiwgZXJyKTsKLSAgICB9CisgICAgRVhQRUNUX0VRKE5PX0VSUk9SLCBlcnIpOwogICAgIGNsb3NlKHBkYXRhLT5mZCk7CiAgICAgcmV0dXJuIDA7CiB9CiAKLXZvaWQgQUhhcmR3YXJlQnVmZmVyVGVzdDo6dGVzdEFIYXJkd2FyZUJ1ZmZlcl9TZW5kQW5kUmVjdl9TdWNjZWVkcyhKTklFbnYqIGVudikgeworVEVTVChBSGFyZHdhcmVCdWZmZXJUZXN0LCBTZW5kQW5kUmVjdlN1Y2NlZWRzKSB7CiAgICAgQUhhcmR3YXJlQnVmZmVyKiBidWZmZXIgPSBOVUxMOwogICAgIEFIYXJkd2FyZUJ1ZmZlcl9EZXNjIGRlc2MgPSB7fTsKIApAQCAtMTkwLDQzICsyNTUsNDMgQEAKIAogICAgIC8vIFRlc3QgdGhhdCBhbiBpbnZhbGlkIGJ1ZmZlciBmYWlscy4KICAgICBpbnQgZXJyID0gQUhhcmR3YXJlQnVmZmVyX3NlbmRIYW5kbGVUb1VuaXhTb2NrZXQoTlVMTCwgMCk7Ci0gICAgQVNTRVJUX0VRKEJBRF9WQUxVRSwgZXJyKTsKKyAgICBFWFBFQ1RfRVEoQkFEX1ZBTFVFLCBlcnIpOwogICAgIGVyciA9IDA7CiAgICAgZXJyID0gQUhhcmR3YXJlQnVmZmVyX3NlbmRIYW5kbGVUb1VuaXhTb2NrZXQoYnVmZmVyLCAwKTsKLSAgICBBU1NFUlRfRVEoQkFEX1ZBTFVFLCBlcnIpOworICAgIEVYUEVDVF9FUShCQURfVkFMVUUsIGVycik7CiAKICAgICAvLyBBbGxvY2F0ZSB0aGUgYnVmZmVyLgogICAgIGVyciA9IEFIYXJkd2FyZUJ1ZmZlcl9hbGxvY2F0ZSgmZGVzYywgJmJ1ZmZlcik7Ci0gICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBlcnIpOworICAgIEVYUEVDVF9FUShOT19FUlJPUiwgZXJyKTsKIAogICAgIGludCBmZHNbMl07CiAgICAgZXJyID0gc29ja2V0cGFpcihBRl9VTklYLCBTT0NLX1NUUkVBTSB8IFNPQ0tfQ0xPRVhFQywgMCwgZmRzKTsKIAogICAgIC8vIExhdW5jaCBhIGNsaWVudCB0aGF0IHdpbGwgc2VuZCB0aGUgYnVmZmVyIGJhY2suCi0gICAgQ2xpZW50RGF0YSBkYXRhKGZkc1sxXSwgZW52LCBidWZmZXIpOworICAgIENsaWVudERhdGEgZGF0YShmZHNbMV0sIGJ1ZmZlcik7CiAgICAgcHRocmVhZF90IHRocmVhZDsKLSAgICBBU1NFUlRfRVEoMCwgcHRocmVhZF9jcmVhdGUoJnRocmVhZCwgTlVMTCwgY2xpZW50RnVuY3Rpb24sICZkYXRhKSk7CisgICAgRVhQRUNUX0VRKDAsIHB0aHJlYWRfY3JlYXRlKCZ0aHJlYWQsIE5VTEwsIGNsaWVudEZ1bmN0aW9uLCAmZGF0YSkpOwogCiAgICAgLy8gUmVjZWl2ZSB0aGUgYnVmZmVyLgogICAgIGVyciA9IEFIYXJkd2FyZUJ1ZmZlcl9yZWN2SGFuZGxlRnJvbVVuaXhTb2NrZXQoZmRzWzBdLCBOVUxMKTsKLSAgICBBU1NFUlRfRVEoQkFEX1ZBTFVFLCBlcnIpOworICAgIEVYUEVDVF9FUShCQURfVkFMVUUsIGVycik7CiAKICAgICBBSGFyZHdhcmVCdWZmZXIqIHJlY2VpdmVkID0gTlVMTDsKICAgICBlcnIgPSBBSGFyZHdhcmVCdWZmZXJfcmVjdkhhbmRsZUZyb21Vbml4U29ja2V0KGZkc1swXSwgJnJlY2VpdmVkKTsKLSAgICBBU1NFUlRfRVEoTk9fRVJST1IsIGVycik7Ci0gICAgQVNTRVJUX1RSVUUocmVjZWl2ZWQgIT0gTlVMTCk7Ci0gICAgQVNTRVJUX0VRKHN0ZDo6c3RyaW5nKCksIENoZWNrQUhhcmR3YXJlQnVmZmVyTWF0Y2hlc0Rlc2MocmVjZWl2ZWQsIGRlc2MpKTsKKyAgICBFWFBFQ1RfRVEoTk9fRVJST1IsIGVycik7CisgICAgRVhQRUNUX1RSVUUocmVjZWl2ZWQgIT0gTlVMTCk7CisgICAgRVhQRUNUX0VRKGRlc2MsIEdldERlc2NyaXB0aW9uKHJlY2VpdmVkKSk7CiAKICAgICB2b2lkKiByZXRfdmFsOwotICAgIEFTU0VSVF9FUSgwLCBwdGhyZWFkX2pvaW4odGhyZWFkLCAmcmV0X3ZhbCkpOwotICAgIEFTU0VSVF9FUShOVUxMLCByZXRfdmFsKTsKKyAgICBFWFBFQ1RfRVEoMCwgcHRocmVhZF9qb2luKHRocmVhZCwgJnJldF92YWwpKTsKKyAgICBFWFBFQ1RfRVEoTlVMTCwgcmV0X3ZhbCk7CiAgICAgY2xvc2UoZmRzWzBdKTsKIAogICAgIEFIYXJkd2FyZUJ1ZmZlcl9yZWxlYXNlKGJ1ZmZlcik7CiAgICAgQUhhcmR3YXJlQnVmZmVyX3JlbGVhc2UocmVjZWl2ZWQpOwogfQogCi12b2lkIEFIYXJkd2FyZUJ1ZmZlclRlc3Q6OnRlc3RBSGFyZHdhcmVCdWZmZXJfTG9ja19hbmRfVW5sb2NrX1N1Y2NlZWQoSk5JRW52KiBlbnYpIHsKK1RFU1QoQUhhcmR3YXJlQnVmZmVyVGVzdCwgTG9ja0FuZFVubG9ja1N1Y2NlZWQpIHsKICAgICBBSGFyZHdhcmVCdWZmZXIqIGJ1ZmZlciA9IE5VTEw7CiAgICAgQUhhcmR3YXJlQnVmZmVyX0Rlc2MgZGVzYyA9IHt9OwogCkBAIC0yMzgsNDYgKzMwMyw1MiBAQAogCiAgICAgLy8gVGVzdCB0aGF0IGFuIGludmFsaWQgYnVmZmVyIGZhaWxzLgogICAgIGludCBlcnIgPSBBSGFyZHdhcmVCdWZmZXJfbG9jayhOVUxMLCAwLCAtMSwgTlVMTCwgTlVMTCk7Ci0gICAgQVNTRVJUX0VRKEJBRF9WQUxVRSwgZXJyKTsKKyAgICBFWFBFQ1RfRVEoQkFEX1ZBTFVFLCBlcnIpOwogICAgIGVyciA9IDA7CiAKICAgICAvLyBBbGxvY2F0ZSB0aGUgYnVmZmVyLgogICAgIGVyciA9IEFIYXJkd2FyZUJ1ZmZlcl9hbGxvY2F0ZSgmZGVzYywgJmJ1ZmZlcik7Ci0gICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBlcnIpOworICAgIEVYUEVDVF9FUShOT19FUlJPUiwgZXJyKTsKICAgICB2b2lkKiBidWZmZXJEYXRhID0gTlVMTDsKICAgICBlcnIgPSBBSGFyZHdhcmVCdWZmZXJfbG9jayhidWZmZXIsIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9DUFVfUkVBRF9SQVJFTFksIC0xLAogICAgICAgICAgIE5VTEwsICZidWZmZXJEYXRhKTsKLSAgICBBU1NFUlRfRVEoTk9fRVJST1IsIGVycik7Ci0gICAgQVNTRVJUX1RSVUUoYnVmZmVyRGF0YSAhPSBOVUxMKTsKKyAgICBFWFBFQ1RfRVEoTk9fRVJST1IsIGVycik7CisgICAgRVhQRUNUX1RSVUUoYnVmZmVyRGF0YSAhPSBOVUxMKTsKICAgICBpbnQzMl90IGZlbmNlID0gLTE7CiAgICAgZXJyID0gQUhhcmR3YXJlQnVmZmVyX3VubG9jayhidWZmZXIsICZmZW5jZSk7CiAKICAgICBBSGFyZHdhcmVCdWZmZXJfcmVsZWFzZShidWZmZXIpOwogfQogCi12b2lkIEFIYXJkd2FyZUJ1ZmZlclRlc3Q6OnRlc3RBSGFyZHdhcmVCdWZmZXJTdXBwb3J0c0xheWVyZWRCdWZmZXJzRm9yVnIoSk5JRW52KiBlbnYpIHsKK1RFU1QoQUhhcmR3YXJlQnVmZmVyVGVzdCwgUHJvdGVjdGVkQ29udGVudEFuZENwdVJlYWRJbmNvbXBhdGlibGUpIHsKICAgICBBSGFyZHdhcmVCdWZmZXIqIGJ1ZmZlciA9IE5VTEw7CiAgICAgQUhhcmR3YXJlQnVmZmVyX0Rlc2MgZGVzYyA9IHt9OwotCi0gICAgZGVzYy53aWR0aCA9IDI7Ci0gICAgZGVzYy5oZWlnaHQgPSA0OwotICAgIGRlc2MubGF5ZXJzID0gMjsKLSAgICBkZXNjLnVzYWdlID0gQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0dQVV9TQU1QTEVEX0lNQUdFOworICAgIGRlc2Mud2lkdGggPSAxMjA7CisgICAgZGVzYy5oZWlnaHQgPSAyNDA7CisgICAgZGVzYy5sYXllcnMgPSAxOworICAgIGRlc2MudXNhZ2UgPSBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfR1BVX0NPTE9SX09VVFBVVCB8IEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9DUFVfUkVBRF9PRlRFTjsKICAgICBkZXNjLmZvcm1hdCA9IEFIQVJEV0FSRUJVRkZFUl9GT1JNQVRfUjhHOEI4QThfVU5PUk07Ci0gICAgaW50IHJlcyA9IEFIYXJkd2FyZUJ1ZmZlcl9hbGxvY2F0ZSgmZGVzYywgJmJ1ZmZlcik7Ci0gICAgQVNTRVJUX0VRKE5PX0VSUk9SLCByZXMpOwotICAgIEFTU0VSVF9FUShzdGQ6OnN0cmluZygpLCBDaGVja0FIYXJkd2FyZUJ1ZmZlck1hdGNoZXNEZXNjKGJ1ZmZlciwgZGVzYykpOwotICAgIEFIYXJkd2FyZUJ1ZmZlcl9yZWxlYXNlKGJ1ZmZlcik7Ci0gICAgYnVmZmVyID0gTlVMTDsKIAotICAgIGRlc2Mud2lkdGggPSA0OwotICAgIGRlc2MuaGVpZ2h0ID0gMTI7Ci0gICAgZGVzYy5sYXllcnMgPSAzOwotICAgIGRlc2MudXNhZ2UgPSBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfR1BVX1NBTVBMRURfSU1BR0U7Ci0gICAgZGVzYy5mb3JtYXQgPSBBSEFSRFdBUkVCVUZGRVJfRk9STUFUX1I1RzZCNV9VTk9STTsKLSAgICByZXMgPSBBSGFyZHdhcmVCdWZmZXJfYWxsb2NhdGUoJmRlc2MsICZidWZmZXIpOwotICAgIEFTU0VSVF9FUShOT19FUlJPUiwgcmVzKTsKLSAgICBBU1NFUlRfRVEoc3RkOjpzdHJpbmcoKSwgQ2hlY2tBSGFyZHdhcmVCdWZmZXJNYXRjaGVzRGVzYyhidWZmZXIsIGRlc2MpKTsKKyAgICAvLyBBbGxvY2F0aW9uIG9mIGEgQ1BVLXJlYWRhYmxlIGJ1ZmZlciBzaG91bGQgc3VjY2VlZC4uLgorICAgIGludCBlcnIgPSBBSGFyZHdhcmVCdWZmZXJfYWxsb2NhdGUoJmRlc2MsICZidWZmZXIpOworICAgIEVYUEVDVF9FUShOT19FUlJPUiwgZXJyKTsKKyAgICBBSGFyZHdhcmVCdWZmZXJfcmVsZWFzZShidWZmZXIpOworICAgIGJ1ZmZlciA9IG51bGxwdHI7CisKKyAgICAvLyAuLi5idXQgbm90IGlmIGl0J3MgYSBwcm90ZWN0ZWQgYnVmZmVyLgorICAgIGRlc2MudXNhZ2UgPQorICAgICAgICBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfR1BVX0NPTE9SX09VVFBVVCB8CisgICAgICAgIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9DUFVfUkVBRF9PRlRFTiB8CisgICAgICAgIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9QUk9URUNURURfQ09OVEVOVDsKKyAgICBlcnIgPSBBSGFyZHdhcmVCdWZmZXJfYWxsb2NhdGUoJmRlc2MsICZidWZmZXIpOworICAgIEVYUEVDVF9ORShOT19FUlJPUiwgZXJyKTsKKworICAgIGRlc2MudXNhZ2UgPQorICAgICAgICBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfR1BVX0NPTE9SX09VVFBVVCB8CisgICAgICAgIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9DUFVfUkVBRF9SQVJFTFkgfAorICAgICAgICBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfUFJPVEVDVEVEX0NPTlRFTlQ7CisgICAgZXJyID0gQUhhcmR3YXJlQnVmZmVyX2FsbG9jYXRlKCZkZXNjLCAmYnVmZmVyKTsKKyAgICBFWFBFQ1RfTkUoTk9fRVJST1IsIGVycik7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL25hdGl2ZWhhcmR3YXJlL2puaS9BSGFyZHdhcmVCdWZmZXJUZXN0LmggYi90ZXN0cy90ZXN0cy9uYXRpdmVoYXJkd2FyZS9qbmkvQUhhcmR3YXJlQnVmZmVyVGVzdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWE3YmNiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL3Rlc3RzL25hdGl2ZWhhcmR3YXJlL2puaS9BSGFyZHdhcmVCdWZmZXJUZXN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBSEFSRFdBUkVCVUZGRVJfVEVTVF9ICi0jZGVmaW5lIEFIQVJEV0FSRUJVRkZFUl9URVNUX0gKLQotI2luY2x1ZGUgIk5hdGl2ZUhhcmR3YXJlVGVzdC5oIgotCi0jaW5jbHVkZSA8am5pLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgQUhhcmR3YXJlQnVmZmVyVGVzdCA6IHB1YmxpYyBOYXRpdmVIYXJkd2FyZVRlc3QgewotcHVibGljOgotICAgIGJvb2wgU2V0VXAoKSBvdmVycmlkZTsKLSAgICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGU7Ci0gICAgdmlydHVhbCB+QUhhcmR3YXJlQnVmZmVyVGVzdCgpID0gZGVmYXVsdDsKLQotICAgIC8vIHRlc3RzCi0gICAgdm9pZCB0ZXN0QUhhcmR3YXJlQnVmZmVyX2FsbG9jYXRlX0ZhaWxzV2l0aE51bGxJbnB1dChKTklFbnYgKmVudik7Ci0gICAgdm9pZCB0ZXN0QUhhcmR3YXJlQnVmZmVyX2FsbG9jYXRlX0Jsb2JGb3JtYXRSZXF1aXJlc0hlaWdodDEoSk5JRW52ICplbnYpOwotICAgIHZvaWQgdGVzdEFIYXJkd2FyZUJ1ZmZlcl9hbGxvY2F0ZV9TdWNjZWVkcyhKTklFbnYgKmVudik7Ci0gICAgdm9pZCB0ZXN0QUhhcmR3YXJlQnVmZmVyX2Rlc2NyaWJlX1N1Y2NlZWRzKEpOSUVudiAqZW52KTsKLSAgICB2b2lkIHRlc3RBSGFyZHdhcmVCdWZmZXJfU2VuZEFuZFJlY3ZfU3VjY2VlZHMoSk5JRW52ICplbnYpOwotICAgIHZvaWQgdGVzdEFIYXJkd2FyZUJ1ZmZlcl9Mb2NrX2FuZF9VbmxvY2tfU3VjY2VlZChKTklFbnYgKmVudik7Ci0gICAgdm9pZCB0ZXN0QUhhcmR3YXJlQnVmZmVyU3VwcG9ydHNMYXllcmVkQnVmZmVyc0ZvclZyKEpOSUVudiAqZW52KTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFIQVJEV0FSRUJVRkZFUl9URVNUX0gKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL25hdGl2ZWhhcmR3YXJlL2puaS9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvbmF0aXZlaGFyZHdhcmUvam5pL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRkZjA0ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL25hdGl2ZWhhcmR3YXJlL2puaS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzUgQEAKKyMgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IGxpYmFoYXJkd2FyZWJ1ZmZlcnRlc3QKK0xPQ0FMX01VTFRJTElCIDo9IGJvdGgKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICBBSGFyZHdhcmVCdWZmZXJHTFRlc3QuY3BwIFwKKyAgICBBSGFyZHdhcmVCdWZmZXJUZXN0LmNwcCBcCisgICAgR1Rlc3RNYWluLmNwcAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmFuZHJvaWQgbGlibG9nIGxpYkVHTCBsaWJHTEVTdjIgbGliR0xFU3YzCisKK0xPQ0FMX1dIT0xFX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGlibmF0aXZldGVzdGhlbHBlcl9qbmkKKworTE9DQUxfQ0ZMQUdTIDo9IC1XZXJyb3IgLVdhbGwgLVdleHRyYSAtREVHTF9FR0xFWFRfUFJPVE9UWVBFUyAtREdMX0dMRVhUX1BST1RPVFlQRVMKKworTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorTE9DQUxfTkRLX1NUTF9WQVJJQU5UIDo9IGMrK19zdGF0aWMKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbmF0aXZlaGFyZHdhcmUvam5pL0dUZXN0TWFpbi5jcHAgYi90ZXN0cy90ZXN0cy9uYXRpdmVoYXJkd2FyZS9qbmkvR1Rlc3RNYWluLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmQzYTE2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvbmF0aXZlaGFyZHdhcmUvam5pL0dUZXN0TWFpbi5jcHAKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICByZXR1cm4gUlVOX0FMTF9URVNUUygpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbmF0aXZlaGFyZHdhcmUvam5pL05hdGl2ZUhhcmR3YXJlVGVzdC5oIGIvdGVzdHMvdGVzdHMvbmF0aXZlaGFyZHdhcmUvam5pL05hdGl2ZUhhcmR3YXJlVGVzdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjNmZGE5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL3Rlc3RzL25hdGl2ZWhhcmR3YXJlL2puaS9OYXRpdmVIYXJkd2FyZVRlc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE5BVElWRUhBUkRXQVJFX1RFU1RfSAotI2RlZmluZSBOQVRJVkVIQVJEV0FSRV9URVNUX0gKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBOYXRpdmVIYXJkd2FyZVRlc3QgewotcHVibGljOgotICAgIHZpcnR1YWwgYm9vbCBTZXRVcCgpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSA9IDA7Ci0gICAgdmlydHVhbCB+TmF0aXZlSGFyZHdhcmVUZXN0KCkgPSBkZWZhdWx0OwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gTkFUSVZFSEFSRFdBUkVfVEVTVF9ICmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9uYXRpdmVoYXJkd2FyZS9qbmkvTmF0aXZlVGVzdEhlbHBlci5jcHAgYi90ZXN0cy90ZXN0cy9uYXRpdmVoYXJkd2FyZS9qbmkvTmF0aXZlVGVzdEhlbHBlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MzdkMGMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvdGVzdHMvbmF0aXZlaGFyZHdhcmUvam5pL05hdGl2ZVRlc3RIZWxwZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0jaW5jbHVkZSAiTmF0aXZlVGVzdEhlbHBlci5oIgotCi0jaW5jbHVkZSA8Y3N0ZGxpYj4KLSNpbmNsdWRlIDxjc3RyaW5nPgotCi1leHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfaGFyZHdhcmVfY3RzX0FIYXJkd2FyZUJ1ZmZlck5hdGl2ZVRlc3QoSk5JRW52KiBlbnYpOwotCi12b2lkIGZhaWwoSk5JRW52KiBlbnYsIGNvbnN0IGNoYXIqIGZvcm1hdCwgLi4uKSB7Ci0gICAgdmFfbGlzdCBhcmdzOwotCi0gICAgdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKLSAgICBjaGFyICptc2c7Ci0gICAgdmFzcHJpbnRmKCZtc2csIGZvcm1hdCwgYXJncyk7Ci0gICAgdmFfZW5kKGFyZ3MpOwotCi0gICAgamNsYXNzIGV4Q2xhc3M7Ci0gICAgY29uc3QgY2hhciAqY2xhc3NOYW1lID0gImphdmEvbGFuZy9Bc3NlcnRpb25FcnJvciI7Ci0gICAgZXhDbGFzcyA9IGVudi0+RmluZENsYXNzKGNsYXNzTmFtZSk7Ci0gICAgZW52LT5UaHJvd05ldyhleENsYXNzLCBtc2cpOwotICAgIGZyZWUobXNnKTsKLX0KLQotamludCBKTklfT25Mb2FkKEphdmFWTSAqdm0sIHZvaWQgKikgewotICAgIEpOSUVudiAqZW52ID0gTlVMTDsKLSAgICBpZiAodm0tPkdldEVudigodm9pZCoqKSZlbnYsIEpOSV9WRVJTSU9OXzFfNCkgIT0gSk5JX09LKSB7Ci0gICAgICAgIHJldHVybiBKTklfRVJSOwotICAgIH0KLSAgICBpZiAocmVnaXN0ZXJfYW5kcm9pZF9oYXJkd2FyZV9jdHNfQUhhcmR3YXJlQnVmZmVyTmF0aXZlVGVzdChlbnYpKSB7Ci0gICAgICAgIHJldHVybiBKTklfRVJSOwotICAgIH0KLSAgICByZXR1cm4gSk5JX1ZFUlNJT05fMV80OwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbmF0aXZlaGFyZHdhcmUvam5pL05hdGl2ZVRlc3RIZWxwZXIuaCBiL3Rlc3RzL3Rlc3RzL25hdGl2ZWhhcmR3YXJlL2puaS9OYXRpdmVUZXN0SGVscGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjYzhkN2YuLjAwMDAwMDAKLS0tIGEvdGVzdHMvdGVzdHMvbmF0aXZlaGFyZHdhcmUvam5pL05hdGl2ZVRlc3RIZWxwZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGpuaS5oPgotCi0jaW5jbHVkZSA8YW5kcm9pZC9sb2cuaD4KLSNkZWZpbmUgQUxPR1YoLi4uKSBfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX1ZFUkJPU0UsIFRBRywgX19WQV9BUkdTX18pCi0jZGVmaW5lIEFMT0dFKC4uLikgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19FUlJPUiwgVEFHLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgQUxPR0koLi4uKSBfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX0lORk8sIFRBRywgX19WQV9BUkdTX18pCi0KLSNkZWZpbmUgQVNTRVJUKGNvbmRpdGlvbiwgZm9ybWF0LCBhcmdzLi4uKSBcCi0gICAgICAgIGlmICghKGNvbmRpdGlvbikpIHsgXAotICAgICAgICAgICAgZmFpbChlbnYsIGZvcm1hdCwgIyMgYXJncyk7IFwKLSAgICAgICAgICAgIHJldHVybjsgXAotICAgICAgICB9Ci0KLS8vIGd0ZXN0IHN0eWxlIGFzc2VydAotI2RlZmluZSBBU1NFUlRfVFJVRShhKSBBU1NFUlQoKGEpLCAiYXNzZXJ0IGZhaWxlZCBvbiAoIiAjYSAiKSBhdCAiIF9fRklMRV9fICI6JWQiLCBfX0xJTkVfXykKLSNkZWZpbmUgQVNTRVJUX0ZBTFNFKGEpIEFTU0VSVCghKGEpLCAiYXNzZXJ0IGZhaWxlZCBvbiAoISIgI2EgIikgYXQgIiBfX0ZJTEVfXyAiOiVkIiwgX19MSU5FX18pCi0jZGVmaW5lIEFTU0VSVF9FUShhLCBiKSBcCi0gICAgICAgIEFTU0VSVCgoYSkgPT0gKGIpLCAiYXNzZXJ0IGZhaWxlZCBvbiAoIiAjYSAiID09ICIgI2IgIikgYXQgIiBfX0ZJTEVfXyAiOiVkIiwgX19MSU5FX18pCi0jZGVmaW5lIEFTU0VSVF9ORShhLCBiKSBcCi0gICAgICAgIEFTU0VSVCgoYSkgIT0gKGIpLCAiYXNzZXJ0IGZhaWxlZCBvbiAoIiAjYSAiICE9ICIgI2IgIikgYXQgIiBfX0ZJTEVfXyAiOiVkIiwgX19MSU5FX18pCi0jZGVmaW5lIEFTU0VSVF9HVChhLCBiKSBcCi0gICAgICAgIEFTU0VSVCgoYSkgPiAoYiksICJhc3NlcnQgZmFpbGVkIG9uICgiICNhICIgPiAiICNiICIpIGF0ICIgX19GSUxFX18gIjolZCIsIF9fTElORV9fKQotI2RlZmluZSBBU1NFUlRfR0UoYSwgYikgXAotICAgICAgICBBU1NFUlQoKGEpID49IChiKSwgImFzc2VydCBmYWlsZWQgb24gKCIgI2EgIiA+PSAiICNiICIpIGF0ICIgX19GSUxFX18gIjolZCIsIF9fTElORV9fKQotI2RlZmluZSBBU1NFUlRfTFQoYSwgYikgXAotICAgICAgICBBU1NFUlQoKGEpIDwgKGIpLCAiYXNzZXJ0IGZhaWxlZCBvbiAoIiAjYSAiIDwgIiAjYiAiKSBhdCAiIF9fRklMRV9fICI6JWQiLCBfX0xJTkVfXykKLSNkZWZpbmUgQVNTRVJUX0xFKGEsIGIpIFwKLSAgICAgICAgQVNTRVJUKChhKSA8PSAoYiksICJhc3NlcnQgZmFpbGVkIG9uICgiICNhICIgPD0gIiAjYiAiKSBhdCAiIF9fRklMRV9fICI6JWQiLCBfX0xJTkVfXykKLSNkZWZpbmUgQVNTRVJUX05VTEwoYSkgXAotICAgICAgICBBU1NFUlQoKGEpID09IG51bGxwdHIsICJhc3NlcnQgZmFpbGVkIG9uIGlzTnVsbCgiICNhICIpIGF0ICIgX19GSUxFX18gIjolZCIsIF9fTElORV9fKQotI2RlZmluZSBBU1NFUlRfTk9UX05VTEwoYSkgXAotICAgICAgICBBU1NFUlQoKGEpICE9IG51bGxwdHIsICJhc3NlcnQgZmFpbGVkIG9uIGlzTm90TnVsbCgiICNhICIpIGF0ICIgX19GSUxFX18gIjolZCIsIF9fTElORV9fKQotI2RlZmluZSBBU1NFUlRfTkFOKGEpIFwKLSAgICAgICAgQVNTRVJUKGlzbmFuKGEpLCAiYXNzZXJ0IGZhaWxlZCBvbiBpc05hbigiICNhICIpIGF0ICIgX19GSUxFX18gIjolZCIsIF9fTElORV9fKQotI2RlZmluZSBBU1NFUlRfRU1QVFlfQ1NUUihhKSBkbyB7IFwKLSAgICAgICAgY29uc3QgY2hhciAqdG1wID0gYTsgXAotICAgICAgICBBU1NFUlQodG1wICE9IG51bGxwdHIsIFwKLSAgICAgICAgICAgICAgICJhc3NlcnQgZmFpbGVkIG9uIChlbXB0eV9jc3RyKCIgI2EgIik6ICIgI2EgIiAhPSBudWxscHRyKSAiIFwKLSAgICAgICAgICAgICAgICJhdCAiIF9fRklMRV9fICI6JWQiLCBfX0xJTkVfXyk7IFwKLSAgICAgICAgQVNTRVJUKHRtcFswXSA9PSAnXDAnLCBcCi0gICAgICAgICAgICAgICAiYXNzZXJ0IGZhaWxlZCBvbiAoZW1wdHlfY3N0cigiICNhICIpOiBzdHJsZW4oKSA9PSAwKSAiIFwKLSAgICAgICAgICAgICAgICJhdCAiIF9fRklMRV9fICI6JWQiLCBfX0xJTkVfXyk7IFwKLSAgICB9IHdoaWxlIChmYWxzZSkKLQotCi12b2lkIGZhaWwoSk5JRW52KiBlbnYsIGNvbnN0IGNoYXIqIGZvcm1hdCwgLi4uKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL25hdGl2ZWhhcmR3YXJlL2puaS9hbmRyb2lkX2hhcmR3YXJlX2N0c19BSGFyZHdhcmVCdWZmZXJOYXRpdmVUZXN0LmNwcCBiL3Rlc3RzL3Rlc3RzL25hdGl2ZWhhcmR3YXJlL2puaS9hbmRyb2lkX2hhcmR3YXJlX2N0c19BSGFyZHdhcmVCdWZmZXJOYXRpdmVUZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA4NTBjNy4uMDAwMDAwMAotLS0gYS90ZXN0cy90ZXN0cy9uYXRpdmVoYXJkd2FyZS9qbmkvYW5kcm9pZF9oYXJkd2FyZV9jdHNfQUhhcmR3YXJlQnVmZmVyTmF0aXZlVGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLSNpbmNsdWRlICJBSGFyZHdhcmVCdWZmZXJUZXN0LmgiCi0jZGVmaW5lIFRBRyAiQUhhcmR3YXJlQnVmZmVyVGVzdCIKLSNpbmNsdWRlICJOYXRpdmVUZXN0SGVscGVyLmgiCi0KLW5hbWVzcGFjZSB7Ci0KLXVzaW5nIGFuZHJvaWQ6OkFIYXJkd2FyZUJ1ZmZlclRlc3Q7Ci0KLSNkZWZpbmUgUkVUVVJOX09OX0VYQ0VQVElPTigpIGRvIHsgaWYgKGVudi0+RXhjZXB0aW9uQ2hlY2soKSkgeyByZXR1cm47IH0gfSB3aGlsZShmYWxzZSkKLQotamxvbmcgc2V0VXAoSk5JRW52KiwgamNsYXNzKSB7Ci0gICAgQUhhcmR3YXJlQnVmZmVyVGVzdCogdGVzdCA9IG5ldyBBSGFyZHdhcmVCdWZmZXJUZXN0KCk7Ci0gICAgaWYgKHRlc3QgIT0gbnVsbHB0cikgewotICAgICAgICB0ZXN0LT5TZXRVcCgpOwotICAgIH0KLSAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxqbG9uZz4odGVzdCk7Ci19Ci0KLXZvaWQgdGVhckRvd24oSk5JRW52KiwgamNsYXNzLCBqbG9uZyBpbnN0YW5jZSkgewotICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PEFIYXJkd2FyZUJ1ZmZlclRlc3QqPihpbnN0YW5jZSk7Ci19Ci0KLXZvaWQgdGVzdChKTklFbnYqIGVudiwgamNsYXNzLCBqbG9uZyBpbnN0YW5jZSwgamJvb2xlYW4gdnJIaWdoUGVyZm9ybWFuY2VTdXBwb3J0ZWQpIHsKLSAgICBBSGFyZHdhcmVCdWZmZXJUZXN0ICp0ZXN0ID0gcmVpbnRlcnByZXRfY2FzdDxBSGFyZHdhcmVCdWZmZXJUZXN0Kj4oaW5zdGFuY2UpOwotICAgIEFTU0VSVF9OT1RfTlVMTCh0ZXN0KTsKLQotICAgIEFMT0dJKCJ0ZXN0QUhhcmR3YXJlQnVmZmVyX2FsbG9jYXRlX0ZhaWxzV2l0aE51bGxJbnB1dCIpOwotICAgIHRlc3QtPnRlc3RBSGFyZHdhcmVCdWZmZXJfYWxsb2NhdGVfRmFpbHNXaXRoTnVsbElucHV0KGVudik7Ci0gICAgUkVUVVJOX09OX0VYQ0VQVElPTigpOwotCi0gICAgQUxPR0koInRlc3RBSGFyZHdhcmVCdWZmZXJfYWxsb2NhdGVfQmxvYkZvcm1hdFJlcXVpcmVzSGVpZ2h0MSIpOwotICAgIHRlc3QtPnRlc3RBSGFyZHdhcmVCdWZmZXJfYWxsb2NhdGVfQmxvYkZvcm1hdFJlcXVpcmVzSGVpZ2h0MShlbnYpOwotICAgIFJFVFVSTl9PTl9FWENFUFRJT04oKTsKLQotICAgIEFMT0dJKCJ0ZXN0QUhhcmR3YXJlQnVmZmVyX2FsbG9jYXRlX1N1Y2NlZWRzIik7Ci0gICAgdGVzdC0+dGVzdEFIYXJkd2FyZUJ1ZmZlcl9hbGxvY2F0ZV9TdWNjZWVkcyhlbnYpOwotICAgIFJFVFVSTl9PTl9FWENFUFRJT04oKTsKLQotICAgIEFMT0dJKCJ0ZXN0QUhhcmR3YXJlQnVmZmVyX2Rlc2NyaWJlX1N1Y2NlZWRzIik7Ci0gICAgdGVzdC0+dGVzdEFIYXJkd2FyZUJ1ZmZlcl9kZXNjcmliZV9TdWNjZWVkcyhlbnYpOwotICAgIFJFVFVSTl9PTl9FWENFUFRJT04oKTsKLQotICAgIEFMT0dJKCJ0ZXN0QUhhcmR3YXJlQnVmZmVyX1NlbmRBbmRSZWN2X1N1Y2NlZWRzIik7Ci0gICAgdGVzdC0+dGVzdEFIYXJkd2FyZUJ1ZmZlcl9TZW5kQW5kUmVjdl9TdWNjZWVkcyhlbnYpOwotICAgIFJFVFVSTl9PTl9FWENFUFRJT04oKTsKLQotICAgIEFMT0dJKCJ0ZXN0QUhhcmR3YXJlQnVmZmVyX0xvY2tfYW5kX1VubG9ja19TdWNjZWVkIik7Ci0gICAgdGVzdC0+dGVzdEFIYXJkd2FyZUJ1ZmZlcl9Mb2NrX2FuZF9VbmxvY2tfU3VjY2VlZChlbnYpOwotICAgIFJFVFVSTl9PTl9FWENFUFRJT04oKTsKLQotICAgIGlmICh2ckhpZ2hQZXJmb3JtYW5jZVN1cHBvcnRlZCA9PSBKTklfVFJVRSkgewotICAgICAgICBBTE9HSSgidGVzdEFIYXJkd2FyZUJ1ZmZlcl9Mb2NrX2FuZF9VbmxvY2tfU3VjY2VlZCIpOwotICAgICAgICB0ZXN0LT50ZXN0QUhhcmR3YXJlQnVmZmVyU3VwcG9ydHNMYXllcmVkQnVmZmVyc0ZvclZyKGVudik7Ci0gICAgICAgIFJFVFVSTl9PTl9FWENFUFRJT04oKTsKLSAgICB9Ci19Ci0KLUpOSU5hdGl2ZU1ldGhvZCBnTWV0aG9kc1tdID0gewotICAgIHsibmF0aXZlU2V0VXAiLCAiKClKIiwgKHZvaWQgKilzZXRVcH0sCi0gICAgeyJuYXRpdmVUZWFyRG93biIsICIoSilWIiwgKHZvaWQgKil0ZWFyRG93bn0sCi0gICAgeyJuYXRpdmVUZXN0IiwgIihKWilWIiwgKHZvaWQgKil0ZXN0fSwKLX07Ci0KLX0gLy8gbmFtZXNwYWNlCi0KLWludCByZWdpc3Rlcl9hbmRyb2lkX2hhcmR3YXJlX2N0c19BSGFyZHdhcmVCdWZmZXJOYXRpdmVUZXN0KEpOSUVudiogZW52KSB7Ci0gICAgamNsYXNzIGNsYXp6ID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvaGFyZHdhcmUvY3RzL0FIYXJkd2FyZUJ1ZmZlck5hdGl2ZVRlc3QiKTsKLSAgICByZXR1cm4gZW52LT5SZWdpc3Rlck5hdGl2ZXMoY2xhenosIGdNZXRob2RzLAotICAgICAgICAgICAgc2l6ZW9mKGdNZXRob2RzKSAvIHNpemVvZihKTklOYXRpdmVNZXRob2QpKTsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL25hdGl2ZWhhcmR3YXJlL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2N0cy9BSGFyZHdhcmVCdWZmZXJOYXRpdmVUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9uYXRpdmVoYXJkd2FyZS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9jdHMvQUhhcmR3YXJlQnVmZmVyTmF0aXZlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTYyNzVmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL3Rlc3RzL25hdGl2ZWhhcmR3YXJlL3NyYy9hbmRyb2lkL2hhcmR3YXJlL2N0cy9BSGFyZHdhcmVCdWZmZXJOYXRpdmVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmhhcmR3YXJlLmN0czsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DZGRUZXN0OwotCi0vKioKLSAqIENoZWNrIEFIYXJkd2FyZUJ1ZmZlciBmdW5jdGlvbmFsaXR5LgotICoKLSAqIFRoaXMgaXMgdGhlIHBsYWNlIHRvIGltcGxlbWVudCBBSGFyZHdhcmVCdWZmZXIgTkRLIENUUyB0ZXN0cy4KLSAqLwotQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuOS4yL0MtMS0xMCIpCi1wdWJsaWMgY2xhc3MgQUhhcmR3YXJlQnVmZmVyTmF0aXZlVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7Ci0gICAgcHJvdGVjdGVkIG5hdGl2ZSBsb25nIG5hdGl2ZVNldFVwKCk7Ci0gICAgcHJvdGVjdGVkIG5hdGl2ZSB2b2lkIG5hdGl2ZVRlYXJEb3duKGxvbmcgaW5zdGFuY2UpOwotICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlVGVzdChsb25nIGluc3RhbmNlLCBib29sZWFuIHZySGlnaFBlcmZvcm1hbmNlU3VwcG9ydGVkKTsKLSAgICBwcml2YXRlIGxvbmcgbU5hdGl2ZUluc3RhbmNlOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgU3lzdGVtLmxvYWRMaWJyYXJ5KCJjdHMtbmF0aXZlaGFyZHdhcmUtbmRrLWpuaSIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIG1OYXRpdmVJbnN0YW5jZSA9IG5hdGl2ZVNldFVwKCk7Ci0gICAgICAgIGFzc2VydFRydWUoImNyZWF0ZSBuYXRpdmUgaW5zdGFuY2UgZmFpbGVkIiwgbU5hdGl2ZUluc3RhbmNlICE9IDApOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG5hdGl2ZVRlYXJEb3duKG1OYXRpdmVJbnN0YW5jZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5hdGl2ZSgpIHRocm93cyBBc3NlcnRpb25FcnJvciB7Ci0gICAgICAgIFBhY2thZ2VNYW5hZ2VyIHBtID0gZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VNYW5hZ2VyKCk7Ci0gICAgICAgIG5hdGl2ZVRlc3QobU5hdGl2ZUluc3RhbmNlLCBwbS5oYXNTeXN0ZW1GZWF0dXJlKAotICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfVlJfTU9ERV9ISUdIX1BFUkZPUk1BTkNFKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbmF0aXZlaGFyZHdhcmUvc3JjL2FuZHJvaWQvaGFyZHdhcmUvbmF0aXZlaGFyZHdhcmUvY3RzL0FIYXJkd2FyZUJ1ZmZlck5hdGl2ZVRlc3RzLmphdmEgYi90ZXN0cy90ZXN0cy9uYXRpdmVoYXJkd2FyZS9zcmMvYW5kcm9pZC9oYXJkd2FyZS9uYXRpdmVoYXJkd2FyZS9jdHMvQUhhcmR3YXJlQnVmZmVyTmF0aXZlVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDk0OTM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvbmF0aXZlaGFyZHdhcmUvc3JjL2FuZHJvaWQvaGFyZHdhcmUvbmF0aXZlaGFyZHdhcmUvY3RzL0FIYXJkd2FyZUJ1ZmZlck5hdGl2ZVRlc3RzLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5oYXJkd2FyZS5uYXRpdmVoYXJkd2FyZS5jdHM7CisKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgY29tLmFuZHJvaWQuZ3Rlc3RydW5uZXIuR3Rlc3RSdW5uZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuZ3Rlc3RydW5uZXIuVGFyZ2V0TGlicmFyeTsKKworQFJ1bldpdGgoR3Rlc3RSdW5uZXIuY2xhc3MpCitAVGFyZ2V0TGlicmFyeSgiYWhhcmR3YXJlYnVmZmVydGVzdCIpCitwdWJsaWMgY2xhc3MgQUhhcmR3YXJlQnVmZmVyTmF0aXZlVGVzdHMge30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL25hdGl2ZWhhcmR3YXJlL3NyYy9hbmRyb2lkL2hhcmR3YXJlL25hdGl2ZWhhcmR3YXJlL2N0cy9IYXJkd2FyZUJ1ZmZlclZyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvbmF0aXZlaGFyZHdhcmUvc3JjL2FuZHJvaWQvaGFyZHdhcmUvbmF0aXZlaGFyZHdhcmUvY3RzL0hhcmR3YXJlQnVmZmVyVnJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYwMjJmYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL25hdGl2ZWhhcmR3YXJlL3NyYy9hbmRyb2lkL2hhcmR3YXJlL25hdGl2ZWhhcmR3YXJlL2N0cy9IYXJkd2FyZUJ1ZmZlclZyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuaGFyZHdhcmUubmF0aXZlaGFyZHdhcmUuY3RzOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLkhhcmR3YXJlQnVmZmVyOworaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNkZFRlc3Q7CisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgbGF5ZXJlZCBidWZmZXJzIGFyZSBzdXBwb3J0ZWQgd2hlbiBWUiBmZWF0dXJlIGlzIHByZXNlbnQuCisgKi8KK3B1YmxpYyBjbGFzcyBIYXJkd2FyZUJ1ZmZlclZyVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CisKKyAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iNy45LjIvQy0xLTEwIikKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGF5ZXJlZEJ1ZmZlcnNGb3JWcigpIHRocm93cyBBc3NlcnRpb25FcnJvciB7CisgICAgICAgIGJvb2xlYW4gbUlzVnJIZWFkc2V0ID0gKGdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKS5nZXRDb25maWd1cmF0aW9uKCkudWlNb2RlCisgICAgICAgICAgICAmIENvbmZpZ3VyYXRpb24uVUlfTU9ERV9UWVBFX01BU0spID09IENvbmZpZ3VyYXRpb24uVUlfTU9ERV9UWVBFX1ZSX0hFQURTRVQ7CisKKyAgICAgICAgLy8gU29tZSBwaG9uZXMgdXBncmFkaW5nIGZyb20gb2xkZXIgQW5kcm9pZCB2ZXJzaW9ucyBoYXZlIHRoZSBoaWdoIHBlcmZvcm1hbmNlIFZSIGZlYXR1cmUsCisgICAgICAgIC8vIGJ1dCBjYW5ub3QgbWVldCB0aGlzIHJlcXVpcmVtZW50LiBPbmx5IGFjdHVhbGx5IGNoZWNrIGl0IGZvciBzdGFuZGFsb25lIFZSIGhlYWRzZXRzLgorICAgICAgICBQYWNrYWdlTWFuYWdlciBwbSA9IGdldENvbnRleHQoKS5nZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICBpZiAoIXBtLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9WUl9NT0RFX0hJR0hfUEVSRk9STUFOQ0UpIHx8ICFtSXNWckhlYWRzZXQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBsb25nIGZsYWdzID0gSGFyZHdhcmVCdWZmZXIuVVNBR0VfR1BVX1NBTVBMRURfSU1BR0UgfCBIYXJkd2FyZUJ1ZmZlci5VU0FHRV9HUFVfQ09MT1JfT1VUUFVUOworICAgICAgICBmaW5hbCBpbnQgZm9ybWF0c1tdID0geworICAgICAgICAgICAgSGFyZHdhcmVCdWZmZXIuUkdCXzU2NSwKKyAgICAgICAgICAgIEhhcmR3YXJlQnVmZmVyLlJHQkFfODg4OCwKKyAgICAgICAgICAgIEhhcmR3YXJlQnVmZmVyLlJHQkFfMTAxMDEwMiwKKyAgICAgICAgICAgIEhhcmR3YXJlQnVmZmVyLlJHQkFfRlAxNiwKKyAgICAgICAgfTsKKyAgICAgICAgZm9yIChmaW5hbCBpbnQgZm9ybWF0IDogZm9ybWF0cykgeworICAgICAgICAgICAgSGFyZHdhcmVCdWZmZXIgYnVmZmVyID0gSGFyZHdhcmVCdWZmZXIuY3JlYXRlKDIsIDQsIGZvcm1hdCwgMiwgZmxhZ3MpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGJ1ZmZlci5nZXRXaWR0aCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyg0LCBidWZmZXIuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGJ1ZmZlci5nZXRMYXllcnMoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZm9ybWF0LCBidWZmZXIuZ2V0Rm9ybWF0KCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGZsYWdzLCBidWZmZXIuZ2V0VXNhZ2UoKSk7CisKKyAgICAgICAgICAgIGJ1ZmZlciA9IEhhcmR3YXJlQnVmZmVyLmNyZWF0ZSgzNDUsIDIzMSwgZm9ybWF0LCA1LCBmbGFncyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMzQ1LCBidWZmZXIuZ2V0V2lkdGgoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMjMxLCBidWZmZXIuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDUsIGJ1ZmZlci5nZXRMYXllcnMoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZm9ybWF0LCBidWZmZXIuZ2V0Rm9ybWF0KCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGZsYWdzLCBidWZmZXIuZ2V0VXNhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9uYXRpdmVtZWRpYS9hYXVkaW8vQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL25hdGl2ZW1lZGlhL2FhdWRpby9BbmRyb2lkLm1rCmluZGV4IDJmNjQxMzEuLmI0NzBmZjYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL25hdGl2ZW1lZGlhL2FhdWRpby9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3Rlc3RzL25hdGl2ZW1lZGlhL2FhdWRpby9BbmRyb2lkLm1rCkBAIC0xLDQgKzEsNCBAQAotIyBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAjCiAjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xMiw0MCArMTIsMzAgQEAKICMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAotIyBCdWlsZCB0aGUgdW5pdCB0ZXN0cy4KLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCiAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFIDo9IEN0c05hdGl2ZU1lZGlhQUF1ZGlvVGVzdENhc2VzCi1MT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQSkvbmF0aXZldGVzdAorCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzTmF0aXZlTWVkaWFBQXVkaW9UZXN0Q2FzZXMKKworIyBJbmNsdWRlIGJvdGggdGhlIDMyIGFuZCA2NCBiaXQgdmVyc2lvbnMKIExPQ0FMX01VTFRJTElCIDo9IGJvdGgKLUxPQ0FMX01PRFVMRV9TVEVNXzMyIDo9ICQoTE9DQUxfTU9EVUxFKTMyCi1MT0NBTF9NT0RVTEVfU1RFTV82NCA6PSAkKExPQ0FMX01PRFVMRSk2NAogCi1MT0NBTF9TUkNfRklMRVMgOj0gXAotICAgIHNyYy90ZXN0X2FhdWRpby5jcHAgXAotICAgIHNyYy90ZXN0X2FhdWRpb19jYWxsYmFjay5jcHAgXAotICAgIHNyYy90ZXN0X2FhdWRpb19taXNjLmNwcCBcCi0gICAgc3JjL3Rlc3RfYWF1ZGlvX21tYXAuY3BwIFwKLSAgICBzcmMvdGVzdF9hYXVkaW9fc3RyZWFtX2J1aWxkZXIuY3BwIFwKLSAgICBzcmMvdXRpbHMuY3BwIFwKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgbGliYWF1ZGlvIFwKLSAgICBsaWJsb2cgXAotCi1MT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJndGVzdF9uZGtfYysrIFwKLQotTE9DQUxfQ1RTX1RFU1RfUEFDS0FHRSA6PSBhbmRyb2lkLm5hdGl2ZW1lZGlhLmFhdWRpbworIyBXaGVuIGJ1aWx0LCBleHBsaWNpdGx5IHB1dCBpdCBpbiB0aGUgZGF0YSBwYXJ0aXRpb24uCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQogCiAjIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0CiBMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cwogCi1MT0NBTF9DRkxBR1MgOj0gLVdlcnJvciAtV2FsbAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGN0c3Rlc3RydW5uZXItYXh0IG5hdGl2ZXRlc3RoZWxwZXIKKworTE9DQUxfSk5JX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGlibmF0aXZlYWF1ZGlvdGVzdAorCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKIExPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKLUxPQ0FMX05ES19TVExfVkFSSUFOVCA6PSBjKytfc3RhdGljCiAKLWluY2x1ZGUgJChCVUlMRF9DVFNfRVhFQ1VUQUJMRSkKK2luY2x1ZGUgJChCVUlMRF9DVFNfUEFDS0FHRSkKKworIyBJbmNsdWRlIHRoZSBhc3NvY2lhdGVkIGxpYnJhcnkncyBtYWtlZmlsZS4KK2luY2x1ZGUgJChMT0NBTF9QQVRIKS9qbmkvQW5kcm9pZC5tawpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbmF0aXZlbWVkaWEvYWF1ZGlvL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy90ZXN0cy9uYXRpdmVtZWRpYS9hYXVkaW8vQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGM0MjJhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvbmF0aXZlbWVkaWEvYWF1ZGlvL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwzMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJhbmRyb2lkLm5hdGl2ZW1lZGlhLmFhdWRpbyI+CisKKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkRJU0FCTEVfS0VZR1VBUkQiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRUNPUkRfQVVESU8iIC8+CisgICAgPGFwcGxpY2F0aW9uPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPCEtLSBUaGlzIGlzIGEgc2VsZi1pbnN0cnVtZW50aW5nIHRlc3QgcGFja2FnZS4gLS0+CisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5uYXRpdmVtZWRpYS5hYXVkaW8iCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgdGVzdHMgb2YgbmF0aXZlIEFBdWRpbyBBUEkiPgorICAgIDwvaW5zdHJ1bWVudGF0aW9uPgorCis8L21hbmlmZXN0PgorCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9uYXRpdmVtZWRpYS9hYXVkaW8vQW5kcm9pZFRlc3QueG1sIGIvdGVzdHMvdGVzdHMvbmF0aXZlbWVkaWEvYWF1ZGlvL0FuZHJvaWRUZXN0LnhtbAppbmRleCA3MDMwZDBjLi5iNzk2ZWE2IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9uYXRpdmVtZWRpYS9hYXVkaW8vQW5kcm9pZFRlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL25hdGl2ZW1lZGlhL2FhdWRpby9BbmRyb2lkVGVzdC54bWwKQEAgLTE1LDE2ICsxNSwxNCBAQAogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgTmF0aXZlIE1lZGlhIEFBdWRpbyB0ZXN0IGNhc2VzIj4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9Im1lZGlhIiAvPgotICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRhcmdldHByZXAuRmlsZVB1c2hlciI+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cCIgdmFsdWU9InRydWUiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9IkN0c05hdGl2ZU1lZGlhQUF1ZGlvVGVzdENhc2VzLT4vZGF0YS9sb2NhbC90bXAvQ3RzTmF0aXZlTWVkaWFBQXVkaW9UZXN0Q2FzZXMiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iYXBwZW5kLWJpdG5lc3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CisgICAgPG9wdGlvbiBuYW1lPSJub3Qtc2hhcmRhYmxlIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzTmF0aXZlTWVkaWFBQXVkaW9UZXN0Q2FzZXMuYXBrIiAvPgogICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgotICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5HVGVzdCIgPgotICAgICAgICA8b3B0aW9uIG5hbWU9Im5hdGl2ZS10ZXN0LWRldmljZS1wYXRoIiB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9Im1vZHVsZS1uYW1lIiB2YWx1ZT0iQ3RzTmF0aXZlTWVkaWFBQXVkaW9UZXN0Q2FzZXMiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0icnVudGltZS1oaW50IiB2YWx1ZT0iMm0iIC8+Ci0gICAgICAgIDwhLS0gdGVzdC10aW1lb3V0IHVuaXQgaXMgbXMsIHZhbHVlID0gMiBtaW4gLS0+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtdGltZW91dCIgdmFsdWU9IjEyMDAwMCIgLz4KKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuQW5kcm9pZEpVbml0VGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9InBhY2thZ2UiIHZhbHVlPSJhbmRyb2lkLm5hdGl2ZW1lZGlhLmFhdWRpbyIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJydW50aW1lLWhpbnQiIHZhbHVlPSIybTBzIiAvPgogICAgIDwvdGVzdD4KIDwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL25hdGl2ZW1lZGlhL2FhdWRpby9qbmkvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL25hdGl2ZW1lZGlhL2FhdWRpby9qbmkvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjEyNDVlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvbmF0aXZlbWVkaWEvYWF1ZGlvL2puaS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNDQgQEAKKyMgQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBCdWlsZCB0aGUgdW5pdCB0ZXN0cy4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IGxpYm5hdGl2ZWFhdWRpb3Rlc3QKK0xPQ0FMX01VTFRJTElCIDo9IGJvdGgKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICB0ZXN0X2FhdWRpby5jcHAgXAorICAgIHRlc3RfYWF1ZGlvX2F0dHJpYnV0ZXMuY3BwIFwKKyAgICB0ZXN0X2FhdWRpb19jYWxsYmFjay5jcHAgXAorICAgIHRlc3RfYWF1ZGlvX21tYXAuY3BwIFwKKyAgICB0ZXN0X2FhdWRpb19taXNjLmNwcCBcCisgICAgdGVzdF9hYXVkaW9fc3RyZWFtX2J1aWxkZXIuY3BwIFwKKyAgICB0ZXN0X3Nlc3Npb25faWQuY3BwIFwKKyAgICB1dGlscy5jcHAgXAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJhYXVkaW8gXAorICAgIGxpYmxvZworCitMT0NBTF9XSE9MRV9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYm5hdGl2ZXRlc3RoZWxwZXJfam5pCisKK0xPQ0FMX0NGTEFHUyA6PSAtV2Vycm9yIC1XYWxsCisKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKK0xPQ0FMX05ES19TVExfVkFSSUFOVCA6PSBjKytfc3RhdGljCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL25hdGl2ZW1lZGlhL2FhdWRpby9qbmkvdGVzdF9hYXVkaW8uY3BwIGIvdGVzdHMvdGVzdHMvbmF0aXZlbWVkaWEvYWF1ZGlvL2puaS90ZXN0X2FhdWRpby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzcwM2EzOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL25hdGl2ZW1lZGlhL2FhdWRpby9qbmkvdGVzdF9hYXVkaW8uY3BwCkBAIC0wLDAgKzEsMzcwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJBQXVkaW9UZXN0IgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHR1cGxlPgorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9sb2cuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSAidGVzdF9hYXVkaW8uaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorCit1c2luZyBTdHJlYW1UZXN0UGFyYW1zID0gc3RkOjp0dXBsZTxhYXVkaW9fc2hhcmluZ19tb2RlX3QsIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3Q+OworZW51bSB7CisgICAgUEFSQU1fU0hBUklOR19NT0RFID0gMCwKKyAgICBQQVJBTV9QRVJGX01PREUKK307CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBnZXRUZXN0TmFtZShjb25zdCA6OnRlc3Rpbmc6OlRlc3RQYXJhbUluZm88U3RyZWFtVGVzdFBhcmFtcz4mIGluZm8pIHsKKyAgICByZXR1cm4gc3RkOjpzdHJpbmcoKSArIHNoYXJpbmdNb2RlVG9TdHJpbmcoc3RkOjpnZXQ8UEFSQU1fU0hBUklOR19NT0RFPihpbmZvLnBhcmFtKSkgKworICAgICAgICAgICAgIl9fIiArIHBlcmZvcm1hbmNlTW9kZVRvU3RyaW5nKHN0ZDo6Z2V0PFBBUkFNX1BFUkZfTU9ERT4oaW5mby5wYXJhbSkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgQUF1ZGlvU3RyZWFtVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08U3RyZWFtVGVzdFBhcmFtcz4geworICBwcm90ZWN0ZWQ6CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlcigpIGNvbnN0IHsgcmV0dXJuIG1IZWxwZXItPmJ1aWxkZXIoKTsgfQorICAgIEFBdWRpb1N0cmVhbSogc3RyZWFtKCkgY29uc3QgeyByZXR1cm4gbUhlbHBlci0+c3RyZWFtKCk7IH0KKyAgICBjb25zdCBTdHJlYW1CdWlsZGVySGVscGVyOjpQYXJhbWV0ZXJzJiBhY3R1YWwoKSBjb25zdCB7IHJldHVybiBtSGVscGVyLT5hY3R1YWwoKTsgfQorICAgIGludDMyX3QgZnJhbWVzUGVyQnVyc3QoKSBjb25zdCB7IHJldHVybiBtSGVscGVyLT5mcmFtZXNQZXJCdXJzdCgpOyB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VD4gbUhlbHBlcjsKKyAgICBib29sIG1TZXR1cFN1Y2Nlc2Z1bCA9IGZhbHNlOworICAgIHN0ZDo6dW5pcXVlX3B0cjxpbnQxNl90W10+IG1EYXRhOworfTsKKworCitjbGFzcyBBQXVkaW9JbnB1dFN0cmVhbVRlc3QgOiBwdWJsaWMgQUF1ZGlvU3RyZWFtVGVzdDxJbnB1dFN0cmVhbUJ1aWxkZXJIZWxwZXI+IHsKKyAgcHJvdGVjdGVkOgorICAgIHZvaWQgU2V0VXAoKSBvdmVycmlkZTsKKworICAgIGludDMyX3QgbUZyYW1lc1BlclJlYWQ7Cit9OworCit2b2lkIEFBdWRpb0lucHV0U3RyZWFtVGVzdDo6U2V0VXAoKSB7CisgICAgbVNldHVwU3VjY2VzZnVsID0gZmFsc2U7CisgICAgaWYgKCFkZXZpY2VTdXBwb3J0c0ZlYXR1cmUoRkVBVFVSRV9SRUNPUkRJTkcpKSByZXR1cm47CisgICAgbUhlbHBlci5yZXNldChuZXcgSW5wdXRTdHJlYW1CdWlsZGVySGVscGVyKAorICAgICAgICAgICAgICAgICAgICBzdGQ6OmdldDxQQVJBTV9TSEFSSU5HX01PREU+KEdldFBhcmFtKCkpLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OmdldDxQQVJBTV9QRVJGX01PREU+KEdldFBhcmFtKCkpKSk7CisgICAgbUhlbHBlci0+aW5pdEJ1aWxkZXIoKTsKKyAgICBtSGVscGVyLT5jcmVhdGVBbmRWZXJpZnlTdHJlYW0oJm1TZXR1cFN1Y2Nlc2Z1bCk7CisgICAgaWYgKCFtU2V0dXBTdWNjZXNmdWwpIHJldHVybjsKKworICAgIG1GcmFtZXNQZXJSZWFkID0gZnJhbWVzUGVyQnVyc3QoKTsKKyAgICBjb25zdCBpbnQzMl90IGZyYW1lc1Blck1zZWMgPSBhY3R1YWwoKS5zYW1wbGVSYXRlIC8gTUlMTElTX1BFUl9TRUNPTkQ7CisgICAgLy8gU29tZSBETUEgbWlnaHQgdXNlIHZlcnkgc2hvcnQgYnVyc3RzIG9mIDE2IGZyYW1lcy4gV2UgZG9uJ3QgbmVlZCB0byByZWFkIHN1Y2ggc21hbGwKKyAgICAvLyBidWZmZXJzLiBCdXQgaXQgaGVscHMgdG8gdXNlIGEgbXVsdGlwbGUgb2YgdGhlIGJ1cnN0IHNpemUgZm9yIHByZWRpY3RhYmxlIHNjaGVkdWxpbmcuCisgICAgd2hpbGUgKG1GcmFtZXNQZXJSZWFkIDwgZnJhbWVzUGVyTXNlYykgeworICAgICAgICBtRnJhbWVzUGVyUmVhZCAqPSAyOworICAgIH0KKyAgICBtRGF0YS5yZXNldChuZXcgaW50MTZfdFttRnJhbWVzUGVyUmVhZCAqIGFjdHVhbCgpLmNoYW5uZWxDb3VudF0pOworfQorCitURVNUX1AoQUF1ZGlvSW5wdXRTdHJlYW1UZXN0LCB0ZXN0UmVhZGluZykgeworICAgIGlmICghbVNldHVwU3VjY2VzZnVsKSByZXR1cm47CisKKyAgICBjb25zdCBpbnQzMl90IGZyYW1lc1RvUmVjb3JkID0gYWN0dWFsKCkuc2FtcGxlUmF0ZTsgIC8vIDEgc2Vjb25kCisgICAgRVhQRUNUX0VRKDAsIEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkKHN0cmVhbSgpKSk7CisgICAgRVhQRUNUX0VRKDAsIEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNXcml0dGVuKHN0cmVhbSgpKSk7CisgICAgbUhlbHBlci0+c3RhcnRTdHJlYW0oKTsKKyAgICAvLyBTZWUgYi82MjA5MDExMy4gRm9yIGxlZ2FjeSBwYXRoLCB0aGUgZGV2aWNlIGlzIG9ubHkga25vd24gYWZ0ZXIKKyAgICAvLyB0aGUgc3RyZWFtIGhhcyBiZWVuIHN0YXJ0ZWQuCisgICAgQVNTRVJUX05FKEFBVURJT19VTlNQRUNJRklFRCwgQUF1ZGlvU3RyZWFtX2dldERldmljZUlkKHN0cmVhbSgpKSk7CisgICAgZm9yIChpbnQzMl90IGZyYW1lc0xlZnQgPSBmcmFtZXNUb1JlY29yZDsgZnJhbWVzTGVmdCA+IDA7ICkgeworICAgICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtX3JlYWQoCisgICAgICAgICAgICAgICAgc3RyZWFtKCksICZtRGF0YVswXSwgc3RkOjptaW4oZnJhbWVzVG9SZWNvcmQsIG1GcmFtZXNQZXJSZWFkKSwKKyAgICAgICAgICAgICAgICBERUZBVUxUX1JFQURfVElNRU9VVCk7CisgICAgICAgIEFTU0VSVF9HVChyZXN1bHQsIDApOworICAgICAgICBmcmFtZXNMZWZ0IC09IHJlc3VsdDsKKyAgICB9CisgICAgbUhlbHBlci0+c3RvcFN0cmVhbSgpOworICAgIEVYUEVDVF9HRShBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUmVhZChzdHJlYW0oKSksIGZyYW1lc1RvUmVjb3JkKTsKKyAgICBFWFBFQ1RfR0UoQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1dyaXR0ZW4oc3RyZWFtKCkpLCBmcmFtZXNUb1JlY29yZCk7CisgICAgRVhQRUNUX0dFKEFBdWRpb1N0cmVhbV9nZXRYUnVuQ291bnQoc3RyZWFtKCkpLCAwKTsKK30KKworVEVTVF9QKEFBdWRpb0lucHV0U3RyZWFtVGVzdCwgdGVzdFN0YXJ0UmVhZFN0b3ApIHsKKyAgICBpZiAoIW1TZXR1cFN1Y2Nlc2Z1bCkgcmV0dXJuOworCisgICAgLy8gVXNlIDEvOCBzZWNvbmQgYXMgc3RhcnQtc3RvcHMgdGFrZSBhIGxvdCBtb3JlIHRpbWUgdGhhbiBqdXN0IHJlY29yZGluZy4KKyAgICBjb25zdCBpbnQzMl90IGZyYW1lc1RvUmVjb3JkID0gYWN0dWFsKCkuc2FtcGxlUmF0ZSAvIDg7CisgICAgRVhQRUNUX0VRKDAsIEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkKHN0cmVhbSgpKSk7CisgICAgRVhQRUNUX0VRKDAsIEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNXcml0dGVuKHN0cmVhbSgpKSk7CisgICAgZm9yIChpbnQzMl90IGZyYW1lc0xlZnQgPSBmcmFtZXNUb1JlY29yZDsgZnJhbWVzTGVmdCA+IDA7ICkgeworICAgICAgICBtSGVscGVyLT5zdGFydFN0cmVhbSgpOworICAgICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtX3JlYWQoCisgICAgICAgICAgICAgICAgc3RyZWFtKCksICZtRGF0YVswXSwgc3RkOjptaW4oZnJhbWVzVG9SZWNvcmQsIG1GcmFtZXNQZXJSZWFkKSwKKyAgICAgICAgICAgICAgICBERUZBVUxUX1JFQURfVElNRU9VVCk7CisgICAgICAgIEFTU0VSVF9HVChyZXN1bHQsIDApOworICAgICAgICBmcmFtZXNMZWZ0IC09IHJlc3VsdDsKKyAgICAgICAgbUhlbHBlci0+c3RvcFN0cmVhbSgpOworICAgIH0KKyAgICBFWFBFQ1RfR0UoQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1JlYWQoc3RyZWFtKCkpLCBmcmFtZXNUb1JlY29yZCk7CisgICAgRVhQRUNUX0dFKEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNXcml0dGVuKHN0cmVhbSgpKSwgZnJhbWVzVG9SZWNvcmQpOworfQorCitURVNUX1AoQUF1ZGlvSW5wdXRTdHJlYW1UZXN0LCB0ZXN0UmVhZENvdW50ZXJGcmVlemVBZnRlclN0b3ApIHsKKyAgICBpZiAoIW1TZXR1cFN1Y2Nlc2Z1bCkgcmV0dXJuOworCisgICAgY29uc3QgaW50MzJfdCBmcmFtZXNUb1JlY29yZCA9IGFjdHVhbCgpLnNhbXBsZVJhdGUgLyAxMDsgIC8vIDEvMTAgc2Vjb25kCisgICAgRVhQRUNUX0VRKDAsIEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkKHN0cmVhbSgpKSk7CisgICAgRVhQRUNUX0VRKDAsIEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNXcml0dGVuKHN0cmVhbSgpKSk7CisgICAgbUhlbHBlci0+c3RhcnRTdHJlYW0oKTsKKyAgICBmb3IgKGludDMyX3QgZnJhbWVzTGVmdCA9IGZyYW1lc1RvUmVjb3JkOyBmcmFtZXNMZWZ0ID4gMDsgKSB7CisgICAgICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TdHJlYW1fcmVhZCgKKyAgICAgICAgICAgICAgICBzdHJlYW0oKSwgJm1EYXRhWzBdLCBzdGQ6Om1pbihmcmFtZXNUb1JlY29yZCwgbUZyYW1lc1BlclJlYWQpLAorICAgICAgICAgICAgICAgIERFRkFVTFRfUkVBRF9USU1FT1VUKTsKKyAgICAgICAgQVNTRVJUX0dUKHJlc3VsdCwgMCk7CisgICAgICAgIGZyYW1lc0xlZnQgLT0gcmVzdWx0OworICAgIH0KKyAgICBtSGVscGVyLT5zdG9wU3RyZWFtKCk7CisgICAgY29uc3QgaW50MzJfdCBmcmFtZXNSZWFkQXRTdG9wID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1JlYWQoc3RyZWFtKCkpOworICAgIGNvbnN0IGludDMyX3QgZnJhbWVzV3JpdHRlbkF0U3RvcCA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNXcml0dGVuKHN0cmVhbSgpKTsKKyAgICBBU1NFUlRfRVEoMCwgVEVNUF9GQUlMVVJFX1JFVFJZKHVzbGVlcCgxMDAgKiBNSUNST1NfUEVSX01JTExJU0VDT05EKSkpOworICAgIEVYUEVDVF9FUShmcmFtZXNSZWFkQXRTdG9wLCBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUmVhZChzdHJlYW0oKSkpOworICAgIEVYUEVDVF9FUShmcmFtZXNXcml0dGVuQXRTdG9wLCBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzV3JpdHRlbihzdHJlYW0oKSkpOworfQorCitURVNUX1AoQUF1ZGlvSW5wdXRTdHJlYW1UZXN0LCB0ZXN0UGF1c2VBbmRGbHVzaE5vdFN1cHBvcnRlZCkgeworICAgIGlmICghbVNldHVwU3VjY2VzZnVsKSByZXR1cm47CisgICAgbUhlbHBlci0+c3RhcnRTdHJlYW0oKTsKKyAgICBFWFBFQ1RfRVEoQUFVRElPX0VSUk9SX1VOSU1QTEVNRU5URUQsIEFBdWRpb1N0cmVhbV9yZXF1ZXN0UGF1c2Uoc3RyZWFtKCkpKTsKKyAgICBFWFBFQ1RfRVEoQUFVRElPX0VSUk9SX1VOSU1QTEVNRU5URUQsIEFBdWRpb1N0cmVhbV9yZXF1ZXN0Rmx1c2goc3RyZWFtKCkpKTsKKyAgICBtSGVscGVyLT5zdG9wU3RyZWFtKCk7Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFNQTSwgQUF1ZGlvSW5wdXRTdHJlYW1UZXN0LAorICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQsIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkUpLAorICAgICAgICAgICAgICAgIC8vIFJlY29yZGluZyBpbiBQT1dFUl9TQVZJTkcgbW9kZSBpc24ndCBzdXBwb3J0ZWQsIGIvNjIyOTE3NzUuCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVELCBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFLCBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoCisgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSwgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfUE9XRVJfU0FWSU5HKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoCisgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSwgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1kpKSwKKyAgICAgICAgJmdldFRlc3ROYW1lKTsKKworCitjbGFzcyBBQXVkaW9PdXRwdXRTdHJlYW1UZXN0IDogcHVibGljIEFBdWRpb1N0cmVhbVRlc3Q8T3V0cHV0U3RyZWFtQnVpbGRlckhlbHBlcj4geworICBwcm90ZWN0ZWQ6CisgICAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlOworfTsKKwordm9pZCBBQXVkaW9PdXRwdXRTdHJlYW1UZXN0OjpTZXRVcCgpIHsKKyAgICBtU2V0dXBTdWNjZXNmdWwgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZVN1cHBvcnRzRmVhdHVyZShGRUFUVVJFX1BMQVlCQUNLKSkgcmV0dXJuOworICAgIG1IZWxwZXIucmVzZXQobmV3IE91dHB1dFN0cmVhbUJ1aWxkZXJIZWxwZXIoCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6Z2V0PFBBUkFNX1NIQVJJTkdfTU9ERT4oR2V0UGFyYW0oKSksCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6Z2V0PFBBUkFNX1BFUkZfTU9ERT4oR2V0UGFyYW0oKSkpKTsKKyAgICBtSGVscGVyLT5pbml0QnVpbGRlcigpOworCisgICAgbUhlbHBlci0+Y3JlYXRlQW5kVmVyaWZ5U3RyZWFtKCZtU2V0dXBTdWNjZXNmdWwpOworICAgIGlmICghbVNldHVwU3VjY2VzZnVsKSByZXR1cm47CisKKyAgICAvLyBBbGxvY2F0ZSBhIGJ1ZmZlciBmb3IgdGhlIGF1ZGlvIGRhdGEuCisgICAgLy8gVE9ETyBoYW5kbGUgcG9zc2liaWxpdHkgb2Ygb3RoZXIgZGF0YSBmb3JtYXRzCisgICAgc2l6ZV90IGRhdGFTaXplU2FtcGxlcyA9IGZyYW1lc1BlckJ1cnN0KCkgKiBhY3R1YWwoKS5jaGFubmVsQ291bnQ7CisgICAgbURhdGEucmVzZXQobmV3IGludDE2X3RbZGF0YVNpemVTYW1wbGVzXSk7CisgICAgbWVtc2V0KCZtRGF0YVswXSwgMCwgZGF0YVNpemVTYW1wbGVzKTsKK30KKworVEVTVF9QKEFBdWRpb091dHB1dFN0cmVhbVRlc3QsIHRlc3RXcml0aW5nKSB7CisgICAgaWYgKCFtU2V0dXBTdWNjZXNmdWwpIHJldHVybjsKKworICAgIC8vIFByaW1lIHRoZSBidWZmZXIuCisgICAgaW50MzJfdCBmcmFtZXNXcml0dGVuID0gMDsKKyAgICBpbnQ2NF90IGZyYW1lc1RvdGFsID0gMDsKKyAgICBpbnQ2NF90IHRpbWVvdXROYW5vcyA9IDA7CisgICAgZG8geworICAgICAgICBmcmFtZXNXcml0dGVuID0gQUF1ZGlvU3RyZWFtX3dyaXRlKAorICAgICAgICAgICAgICAgIHN0cmVhbSgpLCAmbURhdGFbMF0sIGZyYW1lc1BlckJ1cnN0KCksIHRpbWVvdXROYW5vcyk7CisgICAgICAgIC8vIFRoZXJlIHNob3VsZCBiZSBzb21lIHJvb20gZm9yIHByaW1pbmcgdGhlIGJ1ZmZlci4KKyAgICAgICAgZnJhbWVzVG90YWwgKz0gZnJhbWVzV3JpdHRlbjsKKyAgICAgICAgQVNTRVJUX0dFKGZyYW1lc1dyaXR0ZW4sIDApOworICAgICAgICBBU1NFUlRfTEUoZnJhbWVzV3JpdHRlbiwgZnJhbWVzUGVyQnVyc3QoKSk7CisgICAgfSB3aGlsZSAoZnJhbWVzV3JpdHRlbiA+IDApOworICAgIEFTU0VSVF9UUlVFKGZyYW1lc1RvdGFsID4gMCk7CisKKyAgICBpbnQgd3JpdGVMb29wcyA9IDA7CisgICAgaW50NjRfdCBhYXVkaW9GcmFtZXNSZWFkID0gMDsKKyAgICBpbnQ2NF90IGFhdWRpb0ZyYW1lc1JlYWRQcmV2ID0gMDsKKyAgICBpbnQ2NF90IGFhdWRpb0ZyYW1lc1JlYWRGaW5hbCA9IDA7CisgICAgaW50NjRfdCBhYXVkaW9GcmFtZXNXcml0dGVuID0gMDsKKyAgICAvLyBTdGFydC93cml0ZS9wYXVzZSBtb3JlIHRoYW4gb25jZSB0byBzZWUgaWYgaXQgZmFpbHMgYWZ0ZXIgdGhlIGZpcnN0IHRpbWUuCisgICAgLy8gV3JpdGUgc29tZSBkYXRhIGFuZCBtZWFzdXJlIHRoZSByYXRlIHRvIHNlZSBpZiB0aGUgdGltaW5nIGlzIE9LLgorICAgIGZvciAoaW50IG51bUxvb3BzID0gMDsgbnVtTG9vcHMgPCAyOyBudW1Mb29wcysrKSB7CisgICAgICAgIG1IZWxwZXItPnN0YXJ0U3RyZWFtKCk7CisgICAgICAgIC8vIFNlZSBiLzYyMDkwMTEzLiBGb3IgbGVnYWN5IHBhdGgsIHRoZSBkZXZpY2UgaXMgb25seSBrbm93biBhZnRlcgorICAgICAgICAvLyB0aGUgc3RyZWFtIGhhcyBiZWVuIHN0YXJ0ZWQuCisgICAgICAgIEFTU0VSVF9ORShBQVVESU9fVU5TUEVDSUZJRUQsIEFBdWRpb1N0cmVhbV9nZXREZXZpY2VJZChzdHJlYW0oKSkpOworCisgICAgICAgIC8vIFdyaXRlIHNvbWUgZGF0YSB3aGlsZSB3ZSBhcmUgcnVubmluZy4gUmVhZCBjb3VudGVyIHNob3VsZCBiZSBhZHZhbmNpbmcuCisgICAgICAgIHdyaXRlTG9vcHMgPSAxICogYWN0dWFsKCkuc2FtcGxlUmF0ZSAvIGZyYW1lc1BlckJ1cnN0KCk7IC8vIDEgc2Vjb25kCisgICAgICAgIEFTU0VSVF9MVCgyLCB3cml0ZUxvb3BzKTsgLy8gZGV0ZWN0IGFic3VyZGx5IGhpZ2ggZnJhbWVzUGVyQnVyc3QKKyAgICAgICAgdGltZW91dE5hbm9zID0gMTAwICogKE5BTk9TX1BFUl9TRUNPTkQgKiBmcmFtZXNQZXJCdXJzdCgpIC8KKyAgICAgICAgICAgICAgICBhY3R1YWwoKS5zYW1wbGVSYXRlKTsgLy8gTiBidXJzdHMKKyAgICAgICAgZnJhbWVzV3JpdHRlbiA9IDE7CisgICAgICAgIGFhdWRpb0ZyYW1lc1JlYWQgPSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUmVhZChzdHJlYW0oKSk7CisgICAgICAgIGFhdWRpb0ZyYW1lc1JlYWRQcmV2ID0gYWF1ZGlvRnJhbWVzUmVhZDsKKyAgICAgICAgaW50NjRfdCBiZWdpblRpbWUgPSBnZXROYW5vc2Vjb25kcyhDTE9DS19NT05PVE9OSUMpOworICAgICAgICBkbyB7CisgICAgICAgICAgICBmcmFtZXNXcml0dGVuID0gQUF1ZGlvU3RyZWFtX3dyaXRlKAorICAgICAgICAgICAgICAgICAgICBzdHJlYW0oKSwgJm1EYXRhWzBdLCBmcmFtZXNQZXJCdXJzdCgpLCB0aW1lb3V0TmFub3MpOworICAgICAgICAgICAgRVhQRUNUX0VRKGZyYW1lc1BlckJ1cnN0KCksIGZyYW1lc1dyaXR0ZW4pOworCisgICAgICAgICAgICBmcmFtZXNUb3RhbCArPSBmcmFtZXNXcml0dGVuOworICAgICAgICAgICAgYWF1ZGlvRnJhbWVzV3JpdHRlbiA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNXcml0dGVuKHN0cmVhbSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShmcmFtZXNUb3RhbCwgYWF1ZGlvRnJhbWVzV3JpdHRlbik7CisKKyAgICAgICAgICAgIC8vIFRyeSB0byBnZXQgYSBtb3JlIGFjY3VyYXRlIG1lYXN1cmUgb2YgdGhlIHNhbXBsZSByYXRlLgorICAgICAgICAgICAgaWYgKGJlZ2luVGltZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgYWF1ZGlvRnJhbWVzUmVhZCA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkKHN0cmVhbSgpKTsKKyAgICAgICAgICAgICAgICBpZiAoYWF1ZGlvRnJhbWVzUmVhZCA+IGFhdWRpb0ZyYW1lc1JlYWRQcmV2KSB7IC8vIGlzIHJlYWQgcG9pbnRlciBhZHZhbmNpbmcKKyAgICAgICAgICAgICAgICAgICAgYmVnaW5UaW1lID0gZ2V0TmFub3NlY29uZHMoQ0xPQ0tfTU9OT1RPTklDKTsKKyAgICAgICAgICAgICAgICAgICAgYWF1ZGlvRnJhbWVzUmVhZFByZXYgPSBhYXVkaW9GcmFtZXNSZWFkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoZnJhbWVzV3JpdHRlbiA+IDAgJiYgd3JpdGVMb29wcy0tID4gMCk7CisKKyAgICAgICAgYWF1ZGlvRnJhbWVzUmVhZEZpbmFsID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1JlYWQoc3RyZWFtKCkpOworICAgICAgICBBU1NFUlRfR1QoYWF1ZGlvRnJhbWVzUmVhZEZpbmFsLCAwKTsKKyAgICAgICAgRVhQRUNUX0dUKGFhdWRpb0ZyYW1lc1JlYWRGaW5hbCwgYWF1ZGlvRnJhbWVzUmVhZFByZXYpOworCisKKyAgICAgICAgLy8gVE9ETyB3aHkgaXMgQXVkaW9UcmFjayBwYXRoIHNvIGluYWNjdXJhdGU/CisgICAgICAgIC8qIFNlZSBiLzM4MjY4NTQ3LCB0aGVyZSBpcyBubyB3YXkgdG8gc3BlY2lmeSB0aGF0IE1NQVAgbW9kZSBuZWVkcyB0byBiZSB1c2VkLAorICAgICAgICAgICBldmVuIEVYQ0xVU0lWRSBtb2RlIG1heSBmYWxsIGJhY2sgdG8gbGVnYWN5CisgICAgICAgIGNvbnN0IGludDY0X3QgZW5kVGltZSA9IGdldE5hbm9zZWNvbmRzKENMT0NLX01PTk9UT05JQyk7CisgICAgICAgIGNvbnN0IGRvdWJsZSByYXRlVG9sZXJhbmNlID0gMjAwLjA7IC8vIGFyYml0cmFyeSB0b2xlcmFuY2UgZm9yIHNhbXBsZSByYXRlCisgICAgICAgIGlmIChzdGQ6OmdldDxQQVJBTV9TSEFSSU5HX01PREU+KEdldFBhcmFtKCkpICE9IEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEKSB7CisgICAgICAgICAgICAvLyBDYWxjdWxhdGUgYXBwcm94aW1hdGUgc2FtcGxlIHJhdGUgYW5kIGNvbXBhcmUgd2l0aCBzdHJlYW0gcmF0ZS4KKyAgICAgICAgICAgIGRvdWJsZSBzZWNvbmRzID0gKGVuZFRpbWUgLSBiZWdpblRpbWUpIC8gKGRvdWJsZSkgTkFOT1NfUEVSX1NFQ09ORDsKKyAgICAgICAgICAgIGRvdWJsZSBtZWFzdXJlZFJhdGUgPSAoYWF1ZGlvRnJhbWVzUmVhZEZpbmFsIC0gYWF1ZGlvRnJhbWVzUmVhZFByZXYpIC8gc2Vjb25kczsKKyAgICAgICAgICAgIEFTU0VSVF9ORUFSKGFjdHVhbCgpLnNhbXBsZVJhdGUsIG1lYXN1cmVkUmF0ZSwgcmF0ZVRvbGVyYW5jZSk7CisgICAgICAgIH0KKyAgICAgICAgKi8KKworICAgICAgICBtSGVscGVyLT5wYXVzZVN0cmVhbSgpOworICAgIH0KKyAgICBFWFBFQ1RfR0UoQUF1ZGlvU3RyZWFtX2dldFhSdW5Db3VudChzdHJlYW0oKSksIDApOworCisgICAgLy8gTWFrZSBzdXJlIHRoZSByZWFkIGNvdW50ZXIgaXMgbm90IGFkdmFuY2luZyB3aGVuIHdlIGFyZSBwYXVzZWQuCisgICAgYWF1ZGlvRnJhbWVzUmVhZCA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkKHN0cmVhbSgpKTsKKyAgICBBU1NFUlRfR0UoYWF1ZGlvRnJhbWVzUmVhZCwgYWF1ZGlvRnJhbWVzUmVhZEZpbmFsKTsgLy8gbW9ub3RvbmljIGluY3JlYXNlCisgICAgLy8gQ3VycmVudGx5IG5vdCBwb3NzaWJsZSB0byBlbmZvcmNlIGZvciBBQXVkaW8gb3ZlciBBdWRpb1RyYWNrIChiLzMzMzU0NzE1KS4KKyAgICAvLyBBU1NFUlRfRVEoMCwgVEVNUF9GQUlMVVJFX1JFVFJZKHVzbGVlcCgxMDAgKiBNSUNST1NfUEVSX01JTExJU0VDT05EKSkpOworICAgIC8vIEVYUEVDVF9FUShhYXVkaW9GcmFtZXNSZWFkLCBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUmVhZChzdHJlYW0oKSkpOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLSBURVNUIEZMVVNIIC0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gUHJpbWUgdGhlIGJ1ZmZlci4KKyAgICB0aW1lb3V0TmFub3MgPSAwOworICAgIHdyaXRlTG9vcHMgPSAxMDAwOworICAgIGRvIHsKKyAgICAgICAgZnJhbWVzV3JpdHRlbiA9IEFBdWRpb1N0cmVhbV93cml0ZSgKKyAgICAgICAgICAgICAgICBzdHJlYW0oKSwgJm1EYXRhWzBdLCBmcmFtZXNQZXJCdXJzdCgpLCB0aW1lb3V0TmFub3MpOworICAgICAgICBmcmFtZXNUb3RhbCArPSBmcmFtZXNXcml0dGVuOworICAgIH0gd2hpbGUgKGZyYW1lc1dyaXR0ZW4gPiAwICYmIHdyaXRlTG9vcHMtLSA+IDApOworICAgIEVYUEVDVF9FUSgwLCBmcmFtZXNXcml0dGVuKTsKKworICAgIG1IZWxwZXItPmZsdXNoU3RyZWFtKCk7CisKKyAgICAvLyBBZnRlciBhIGZsdXNoLCB0aGUgcmVhZCBjb3VudGVyIHNob3VsZCBiZSBjYXVnaHQgdXAgd2l0aCB0aGUgd3JpdGUgY291bnRlci4KKyAgICBhYXVkaW9GcmFtZXNXcml0dGVuID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1dyaXR0ZW4oc3RyZWFtKCkpOworICAgIEVYUEVDVF9FUShmcmFtZXNUb3RhbCwgYWF1ZGlvRnJhbWVzV3JpdHRlbik7CisgICAgYWF1ZGlvRnJhbWVzUmVhZCA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkKHN0cmVhbSgpKTsKKyAgICBFWFBFQ1RfRVEoYWF1ZGlvRnJhbWVzV3JpdHRlbiwgYWF1ZGlvRnJhbWVzUmVhZCk7CisKKyAgICBzbGVlcCgxKTsgLy8gRklYTUUgLSBUaGUgd3JpdGUgcmV0dXJucyAwIGlmIHdlIHJlbW92ZSB0aGlzIHNsZWVwISBXaHk/CisKKyAgICAvLyBUaGUgYnVmZmVyIHNob3VsZCBiZSBlbXB0eSBhZnRlciBhIGZsdXNoIHNvIHdlIHNob3VsZCBiZSBhYmxlIHRvIHdyaXRlLgorICAgIGZyYW1lc1dyaXR0ZW4gPSBBQXVkaW9TdHJlYW1fd3JpdGUoc3RyZWFtKCksICZtRGF0YVswXSwgZnJhbWVzUGVyQnVyc3QoKSwgdGltZW91dE5hbm9zKTsKKyAgICAvLyBUaGVyZSBzaG91bGQgYmUgc29tZSByb29tIGZvciBwcmltaW5nIHRoZSBidWZmZXIuCisgICAgQVNTRVJUX0dUKGZyYW1lc1dyaXR0ZW4sIDApOworICAgIEFTU0VSVF9MRShmcmFtZXNXcml0dGVuLCBmcmFtZXNQZXJCdXJzdCgpKTsKK30KKworLy8gTWFrZSBzdXJlIHRoZSByZWFkIGFuZCB3cml0ZSBmcmFtZSBjb3VudGVycyBkbyBub3QgZGl2ZXJnZSBieSBtb3JlIHRoYW4gdGhlCisvLyBjYXBhY2l0eSBvZiB0aGUgYnVmZmVyLgorVEVTVF9QKEFBdWRpb091dHB1dFN0cmVhbVRlc3QsIHRlc3RXcml0ZVN0b3BXcml0ZSkgeworICAgIGlmICghbVNldHVwU3VjY2VzZnVsKSByZXR1cm47CisKKyAgICBpbnQzMl90IGZyYW1lc1dyaXR0ZW4gPSAwOworICAgIGludDY0X3QgZnJhbWVzVG90YWwgPSAwOworICAgIGludDY0X3QgdGltZW91dE5hbm9zID0gMDsKKyAgICBpbnQzMl90IHdyaXRlTG9vcHMgPSAwOworICAgIGludDY0X3QgYWF1ZGlvRnJhbWVzUmVhZCA9IDA7CisgICAgaW50NjRfdCBhYXVkaW9GcmFtZXNXcml0dGVuID0gMDsKKyAgICBpbnQzMl90IGZyYW1lQ2FwYWNpdHkgPSBBQXVkaW9TdHJlYW1fZ2V0QnVmZmVyQ2FwYWNpdHlJbkZyYW1lcyhzdHJlYW0oKSk7CisKKyAgICAvLyBTdGFydC93cml0ZS9zdG9wIG1vcmUgdGhhbiBvbmNlIHRvIHNlZSBpZiBpdCBmYWlscyBhZnRlciB0aGUgZmlyc3QgdGltZS4KKyAgICBmb3IgKGludCBudW1Mb29wcyA9IDA7IG51bUxvb3BzIDwgMjsgbnVtTG9vcHMrKykgeworICAgICAgICBtSGVscGVyLT5zdGFydFN0cmVhbSgpOworCisgICAgICAgIC8vIFdyaXRlIHNvbWUgZGF0YSB3aGlsZSB3ZSBhcmUgcnVubmluZy4gUmVhZCBjb3VudGVyIHNob3VsZCBiZSBhZHZhbmNpbmcuCisgICAgICAgIHdyaXRlTG9vcHMgPSAxICogYWN0dWFsKCkuc2FtcGxlUmF0ZSAvIGZyYW1lc1BlckJ1cnN0KCk7IC8vIDEgc2Vjb25kCisgICAgICAgIEFTU0VSVF9MVCgyLCB3cml0ZUxvb3BzKTsgLy8gZGV0ZWN0IGFic3VyZGx5IGhpZ2ggZnJhbWVzUGVyQnVyc3QKKworICAgICAgICAvLyBDYWxjdWxhdGUgYSByZWFzb25hYmxlIHRpbWVvdXQgdmFsdWUuCisgICAgICAgIGNvbnN0IGludDMyX3QgdGltZW91dEJ1cnN0cyA9IDIwOworICAgICAgICB0aW1lb3V0TmFub3MgPSB0aW1lb3V0QnVyc3RzICogKE5BTk9TX1BFUl9TRUNPTkQgKiBmcmFtZXNQZXJCdXJzdCgpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbCgpLnNhbXBsZVJhdGUpOworICAgICAgICAvLyBBY2NvdW50IGZvciBjb2xkIHN0YXJ0IGxhdGVuY3kuCisgICAgICAgIHRpbWVvdXROYW5vcyA9IHN0ZDo6bWF4KHRpbWVvdXROYW5vcywgNDAwICogTkFOT1NfUEVSX01JTExJU0VDT05EKTsKKworICAgICAgICBkbyB7CisgICAgICAgICAgICBmcmFtZXNXcml0dGVuID0gQUF1ZGlvU3RyZWFtX3dyaXRlKAorICAgICAgICAgICAgICAgICAgICBzdHJlYW0oKSwgJm1EYXRhWzBdLCBmcmFtZXNQZXJCdXJzdCgpLCB0aW1lb3V0TmFub3MpOworICAgICAgICAgICAgRVhQRUNUX0VRKGZyYW1lc1BlckJ1cnN0KCksIGZyYW1lc1dyaXR0ZW4pOworICAgICAgICAgICAgZnJhbWVzVG90YWwgKz0gZnJhbWVzV3JpdHRlbjsKKworICAgICAgICAgICAgYWF1ZGlvRnJhbWVzV3JpdHRlbiA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNXcml0dGVuKHN0cmVhbSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShmcmFtZXNUb3RhbCwgYWF1ZGlvRnJhbWVzV3JpdHRlbik7CisgICAgICAgICAgICBhYXVkaW9GcmFtZXNSZWFkID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1JlYWQoc3RyZWFtKCkpOworCisgICAgICAgICAgICAvLyBIb3cgbWFueSBmcmFtZXMgYXJlIHNpdHRpbmcgaW4gdGhlIGJ1ZmZlcj8KKyAgICAgICAgICAgIGludDMyX3Qgd3JpdHRlbkJ1dE5vdFJlYWQgPSAoaW50MzJfdCkoYWF1ZGlvRnJhbWVzV3JpdHRlbiAtIGFhdWRpb0ZyYW1lc1JlYWQpOworICAgICAgICAgICAgQVNTRVJUX0xFKHdyaXR0ZW5CdXROb3RSZWFkLCBmcmFtZUNhcGFjaXR5KTsKKyAgICAgICAgICAgIC8vIEl0IGlzIGxlZ2FsIGZvciB3cml0dGVuQnV0Tm90UmVhZCB0byBiZSBuZWdhdGl2ZSBiZWNhdXNlCisgICAgICAgICAgICAvLyBNTUFQIEhXIGNhbiB1bmRlcnJ1biB0aGUgRklGTy4KKyAgICAgICAgfSB3aGlsZSAoZnJhbWVzV3JpdHRlbiA+IDAgJiYgd3JpdGVMb29wcy0tID4gMCk7CisKKyAgICAgICAgbUhlbHBlci0+c3RvcFN0cmVhbSgpOworICAgIH0KK30KKworLy8gTm90ZSB0aGF0IHRoZSB0ZXN0IGZvciBFWENMVVNJVkUgc2hhcmluZyBtb2RlIG1heSBmYWlsIGdyYWNlZnVsbHkgaWYKKy8vIHRoaXMgbW9kZSBpc24ndCBzdXBwb3J0ZWQgYnkgdGhlIHBsYXRmb3JtLgorSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoU1BNLCBBQXVkaW9PdXRwdXRTdHJlYW1UZXN0LAorICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQsIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkUpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRCwgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1kpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRCwgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfUE9XRVJfU0FWSU5HKSwKKworICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSwgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORSksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKAorICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUsIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoCisgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSwgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfUE9XRVJfU0FWSU5HKSksCisgICAgICAgICZnZXRUZXN0TmFtZSk7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9uYXRpdmVtZWRpYS9hYXVkaW8vc3JjL3Rlc3RfYWF1ZGlvLmggYi90ZXN0cy90ZXN0cy9uYXRpdmVtZWRpYS9hYXVkaW8vam5pL3Rlc3RfYWF1ZGlvLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL3Rlc3RzL25hdGl2ZW1lZGlhL2FhdWRpby9zcmMvdGVzdF9hYXVkaW8uaApyZW5hbWUgdG8gdGVzdHMvdGVzdHMvbmF0aXZlbWVkaWEvYWF1ZGlvL2puaS90ZXN0X2FhdWRpby5oCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9uYXRpdmVtZWRpYS9hYXVkaW8vam5pL3Rlc3RfYWF1ZGlvX2F0dHJpYnV0ZXMuY3BwIGIvdGVzdHMvdGVzdHMvbmF0aXZlbWVkaWEvYWF1ZGlvL2puaS90ZXN0X2FhdWRpb19hdHRyaWJ1dGVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWQzMzE5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvbmF0aXZlbWVkaWEvYWF1ZGlvL2puaS90ZXN0X2FhdWRpb19hdHRyaWJ1dGVzLmNwcApAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIFRlc3QgQUF1ZGlvIGF0dHJpYnV0ZXMgc3VjaCBhcyBVc2FnZSwgQ29udGVudFR5cGUgYW5kIElucHV0UHJlc2V0LgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSAidXRpbHMuaCIKKworY29uc3RleHByIGludDY0X3Qga05hbm9zUGVyU2Vjb25kID0gMTAwMDAwMDAwMDsKK2NvbnN0ZXhwciBpbnQga051bUZyYW1lcyA9IDI1NjsKK2NvbnN0ZXhwciBpbnQga0NoYW5uZWxDb3VudCA9IDI7CisKK2NvbnN0ZXhwciBpbnQzMl90IERPTlRfU0VUID0gLTEwMDA7CisKK3N0YXRpYyB2b2lkIGNoZWNrQXR0cmlidXRlcyhhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IHBlcmZNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb191c2FnZV90IHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19jb250ZW50X3R5cGVfdCBjb250ZW50VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9faW5wdXRfcHJlc2V0X3QgcHJlc2V0ID0gRE9OVF9TRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiA9IEFBVURJT19ESVJFQ1RJT05fT1VUUFVUKSB7CisgICAgaWYgKGRpcmVjdGlvbiA9PSBBQVVESU9fRElSRUNUSU9OX0lOUFVUCisgICAgICAgICAgICAmJiAhZGV2aWNlU3VwcG9ydHNGZWF0dXJlKEZFQVRVUkVfUkVDT1JESU5HKSkgcmV0dXJuOworICAgIGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBBQVVESU9fRElSRUNUSU9OX09VVFBVVAorICAgICAgICAgICAgJiYgIWRldmljZVN1cHBvcnRzRmVhdHVyZShGRUFUVVJFX1BMQVlCQUNLKSkgcmV0dXJuOworCisgICAgZmxvYXQgKmJ1ZmZlciA9IG5ldyBmbG9hdFtrTnVtRnJhbWVzICoga0NoYW5uZWxDb3VudF07CisKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyICphYXVkaW9CdWlsZGVyID0gbnVsbHB0cjsKKyAgICBBQXVkaW9TdHJlYW0gKmFhdWRpb1N0cmVhbSA9IG51bGxwdHI7CisKKyAgICAvLyBVc2UgYW4gQUF1ZGlvU3RyZWFtQnVpbGRlciB0byBjb250YWluIHJlcXVlc3RlZCBwYXJhbWV0ZXJzLgorICAgIEFTU0VSVF9FUShBQVVESU9fT0ssIEFBdWRpb19jcmVhdGVTdHJlYW1CdWlsZGVyKCZhYXVkaW9CdWlsZGVyKSk7CisKKyAgICAvLyBSZXF1ZXN0IHN0cmVhbSBwcm9wZXJ0aWVzLgorICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0UGVyZm9ybWFuY2VNb2RlKGFhdWRpb0J1aWxkZXIsIHBlcmZNb2RlKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldERpcmVjdGlvbihhYXVkaW9CdWlsZGVyLCBkaXJlY3Rpb24pOworCisgICAgLy8gU2V0IHRoZSBhdHRyaWJ1dGUgaW4gdGhlIGJ1aWxkZXIuCisgICAgaWYgKHVzYWdlICE9IERPTlRfU0VUKSB7CisgICAgICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0VXNhZ2UoYWF1ZGlvQnVpbGRlciwgdXNhZ2UpOworICAgIH0KKyAgICBpZiAoY29udGVudFR5cGUgIT0gRE9OVF9TRVQpIHsKKyAgICAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRDb250ZW50VHlwZShhYXVkaW9CdWlsZGVyLCBjb250ZW50VHlwZSk7CisgICAgfQorICAgIGlmIChwcmVzZXQgIT0gRE9OVF9TRVQpIHsKKyAgICAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRJbnB1dFByZXNldChhYXVkaW9CdWlsZGVyLCBwcmVzZXQpOworICAgIH0KKworICAgIC8vIENyZWF0ZSBhbiBBQXVkaW9TdHJlYW0gdXNpbmcgdGhlIEJ1aWxkZXIuCisgICAgQVNTRVJUX0VRKEFBVURJT19PSywgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKGFhdWRpb0J1aWxkZXIsICZhYXVkaW9TdHJlYW0pKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX2RlbGV0ZShhYXVkaW9CdWlsZGVyKTsKKworICAgIC8vIE1ha2Ugc3VyZSB3ZSBnZXQgdGhlIHNhbWUgYXR0cmlidXRlcyBiYWNrIGZyb20gdGhlIHN0cmVhbS4KKyAgICBhYXVkaW9fdXNhZ2VfdCBleHBlY3RlZFVzYWdlID0KKyAgICAgICAgICAgICh1c2FnZSA9PSBET05UX1NFVCB8fCB1c2FnZSA9PSBBQVVESU9fVU5TUEVDSUZJRUQpCisgICAgICAgICAgICA/IEFBVURJT19VU0FHRV9NRURJQSAvLyBkZWZhdWx0CisgICAgICAgICAgICA6IHVzYWdlOworICAgIEVYUEVDVF9FUShleHBlY3RlZFVzYWdlLCBBQXVkaW9TdHJlYW1fZ2V0VXNhZ2UoYWF1ZGlvU3RyZWFtKSk7CisKKyAgICBhYXVkaW9fY29udGVudF90eXBlX3QgZXhwZWN0ZWRDb250ZW50VHlwZSA9CisgICAgICAgICAgICAoY29udGVudFR5cGUgPT0gRE9OVF9TRVQgfHwgY29udGVudFR5cGUgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKQorICAgICAgICAgICAgPyBBQVVESU9fQ09OVEVOVF9UWVBFX01VU0lDIC8vIGRlZmF1bHQKKyAgICAgICAgICAgIDogY29udGVudFR5cGU7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkQ29udGVudFR5cGUsIEFBdWRpb1N0cmVhbV9nZXRDb250ZW50VHlwZShhYXVkaW9TdHJlYW0pKTsKKworICAgIGFhdWRpb19pbnB1dF9wcmVzZXRfdCBleHBlY3RlZFByZXNldCA9CisgICAgICAgICAgICAocHJlc2V0ID09IERPTlRfU0VUIHx8IHByZXNldCA9PSBBQVVESU9fVU5TUEVDSUZJRUQpCisgICAgICAgICAgICA/IEFBVURJT19JTlBVVF9QUkVTRVRfVk9JQ0VfUkVDT0dOSVRJT04gLy8gZGVmYXVsdAorICAgICAgICAgICAgOiBwcmVzZXQ7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkUHJlc2V0LCBBQXVkaW9TdHJlYW1fZ2V0SW5wdXRQcmVzZXQoYWF1ZGlvU3RyZWFtKSk7CisKKyAgICBFWFBFQ1RfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KGFhdWRpb1N0cmVhbSkpOworCisgICAgaWYgKGRpcmVjdGlvbiA9PSBBQVVESU9fRElSRUNUSU9OX0lOUFVUKSB7CisgICAgICAgIEVYUEVDVF9FUShrTnVtRnJhbWVzLAorICAgICAgICAgICAgICAgICAgQUF1ZGlvU3RyZWFtX3JlYWQoYWF1ZGlvU3RyZWFtLCBidWZmZXIsIGtOdW1GcmFtZXMsIGtOYW5vc1BlclNlY29uZCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIEVYUEVDVF9FUShrTnVtRnJhbWVzLAorICAgICAgICAgICAgICAgICAgQUF1ZGlvU3RyZWFtX3dyaXRlKGFhdWRpb1N0cmVhbSwgYnVmZmVyLCBrTnVtRnJhbWVzLCBrTmFub3NQZXJTZWNvbmQpKTsKKyAgICB9CisKKyAgICBFWFBFQ1RfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0b3AoYWF1ZGlvU3RyZWFtKSk7CisKKyAgICBFWFBFQ1RfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1fY2xvc2UoYWF1ZGlvU3RyZWFtKSk7CisgICAgZGVsZXRlW10gYnVmZmVyOworfQorCitzdGF0aWMgY29uc3QgYWF1ZGlvX3VzYWdlX3Qgc1VzYWdlc1tdID0geworICAgIERPTlRfU0VULAorICAgIEFBVURJT19VTlNQRUNJRklFRCwKKyAgICBBQVVESU9fVVNBR0VfTUVESUEsCisgICAgQUFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT04sCisgICAgQUFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORywKKyAgICBBQVVESU9fVVNBR0VfQUxBUk0sCisgICAgQUFVRElPX1VTQUdFX05PVElGSUNBVElPTiwKKyAgICBBQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1JJTkdUT05FLAorICAgIEFBVURJT19VU0FHRV9OT1RJRklDQVRJT05fRVZFTlQsCisgICAgQUFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWSwKKyAgICBBQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFLAorICAgIEFBVURJT19VU0FHRV9BU1NJU1RBTkNFX1NPTklGSUNBVElPTiwKKyAgICBBQVVESU9fVVNBR0VfR0FNRSwKKyAgICBBQVVESU9fVVNBR0VfQVNTSVNUQU5UCit9OworCitzdGF0aWMgY29uc3QgYWF1ZGlvX2NvbnRlbnRfdHlwZV90IHNDb250ZW50eXBlc1tdID0geworICAgIERPTlRfU0VULAorICAgIEFBVURJT19VTlNQRUNJRklFRCwKKyAgICBBQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSCwKKyAgICBBQVVESU9fQ09OVEVOVF9UWVBFX01VU0lDLAorICAgIEFBVURJT19DT05URU5UX1RZUEVfTU9WSUUsCisgICAgQUFVRElPX0NPTlRFTlRfVFlQRV9TT05JRklDQVRJT04KK307CisKK3N0YXRpYyBjb25zdCBhYXVkaW9faW5wdXRfcHJlc2V0X3Qgc0lucHV0UHJlc2V0c1tdID0geworICAgIERPTlRfU0VULAorICAgIEFBVURJT19VTlNQRUNJRklFRCwKKyAgICBBQVVESU9fSU5QVVRfUFJFU0VUX0dFTkVSSUMsCisgICAgQUFVRElPX0lOUFVUX1BSRVNFVF9DQU1DT1JERVIsCisgICAgQUFVRElPX0lOUFVUX1BSRVNFVF9WT0lDRV9SRUNPR05JVElPTiwKKyAgICBBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX0NPTU1VTklDQVRJT04sCisgICAgQUFVRElPX0lOUFVUX1BSRVNFVF9VTlBST0NFU1NFRCwKK307CisKKworc3RhdGljIHZvaWQgY2hlY2tBdHRyaWJ1dGVzVXNhZ2UoYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBwZXJmTW9kZSkgeworICAgIGZvciAoYWF1ZGlvX3VzYWdlX3QgdXNhZ2UgOiBzVXNhZ2VzKSB7CisgICAgICAgIC8vIFRoZXJlIGNhbiBiZSBhIHJhY2UgY29uZGl0aW9uIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gZGV2aWNlcywKKyAgICAgICAgLy8gd2hpY2ggY2FuIGNhdXNlIGFuIHVuZXhwZWN0ZWQgZGlzY29ubmVjdGlvbiBvZiB0aGUgc3RyZWFtLgorICAgICAgICB1c2xlZXAoNTAwICogMTAwMCk7IC8vIHdhaXQgZm9yIHByZXZpb3VzIHN0cmVhbSB0byBjb21wbGV0ZWx5IGNsb3NlCisgICAgICAgIGNoZWNrQXR0cmlidXRlcyhwZXJmTW9kZSwgdXNhZ2UsIERPTlRfU0VUKTsKKyAgICB9CisgICAgdXNsZWVwKDUwMCAqIDEwMDApOyAvLyB3YWl0IGZvciBwcmV2aW91cyBzdHJlYW0gdG8gY29tcGxldGVseSBjbG9zZQorfQorCitzdGF0aWMgdm9pZCBjaGVja0F0dHJpYnV0ZXNDb250ZW50VHlwZShhYXVkaW9faW5wdXRfcHJlc2V0X3QgcGVyZk1vZGUpIHsKKyAgICBmb3IgKGFhdWRpb19jb250ZW50X3R5cGVfdCBjb250ZW50VHlwZSA6IHNDb250ZW50eXBlcykgeworICAgICAgICBjaGVja0F0dHJpYnV0ZXMocGVyZk1vZGUsIERPTlRfU0VULCBjb250ZW50VHlwZSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjaGVja0F0dHJpYnV0ZXNJbnB1dFByZXNldChhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IHBlcmZNb2RlKSB7CisgICAgZm9yIChhYXVkaW9faW5wdXRfcHJlc2V0X3QgaW5wdXRQcmVzZXQgOiBzSW5wdXRQcmVzZXRzKSB7CisgICAgICAgIGNoZWNrQXR0cmlidXRlcyhwZXJmTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERPTlRfU0VULAorICAgICAgICAgICAgICAgICAgICAgICAgRE9OVF9TRVQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFByZXNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19ESVJFQ1RJT05fSU5QVVQpOworICAgIH0KK30KKworVEVTVCh0ZXN0X2F0dHJpYnV0ZXMsIGFhdWRpb191c2FnZV9wZXJmbm9uZSkgeworICAgIGNoZWNrQXR0cmlidXRlc1VzYWdlKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkUpOworfQorCitURVNUKHRlc3RfYXR0cmlidXRlcywgYWF1ZGlvX2NvbnRlbnRfdHlwZV9wZXJmbm9uZSkgeworICAgIGNoZWNrQXR0cmlidXRlc0NvbnRlbnRUeXBlKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkUpOworfQorCitURVNUKHRlc3RfYXR0cmlidXRlcywgYWF1ZGlvX2lucHV0X3ByZXNldF9wZXJmbm9uZSkgeworICAgIGNoZWNrQXR0cmlidXRlc0lucHV0UHJlc2V0KEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkUpOworfQorCitURVNUKHRlc3RfYXR0cmlidXRlcywgYWF1ZGlvX3VzYWdlX2xvd2xhdCkgeworICAgIGNoZWNrQXR0cmlidXRlc1VzYWdlKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZKTsKK30KKworVEVTVCh0ZXN0X2F0dHJpYnV0ZXMsIGFhdWRpb19jb250ZW50X3R5cGVfbG93bGF0KSB7CisgICAgY2hlY2tBdHRyaWJ1dGVzQ29udGVudFR5cGUoQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1kpOworfQorCitURVNUKHRlc3RfYXR0cmlidXRlcywgYWF1ZGlvX2lucHV0X3ByZXNldF9sb3dsYXQpIHsKKyAgICBjaGVja0F0dHJpYnV0ZXNJbnB1dFByZXNldChBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9uYXRpdmVtZWRpYS9hYXVkaW8vam5pL3Rlc3RfYWF1ZGlvX2NhbGxiYWNrLmNwcCBiL3Rlc3RzL3Rlc3RzL25hdGl2ZW1lZGlhL2FhdWRpby9qbmkvdGVzdF9hYXVkaW9fY2FsbGJhY2suY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxM2I0MGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9uYXRpdmVtZWRpYS9hYXVkaW8vam5pL3Rlc3RfYWF1ZGlvX2NhbGxiYWNrLmNwcApAQCAtMCwwICsxLDMzNCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQUF1ZGlvVGVzdCIKKworI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDx0dXBsZT4KKworI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2xvZy5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlICJ0ZXN0X2FhdWRpby5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisKK3N0YXRpYyBpbnQzMl90IG1lYXN1cmVMYXRlbmN5KEFBdWRpb1N0cmVhbSAqc3RyZWFtKSB7CisgICAgaW50NjRfdCBwcmVzZW50YXRpb25UaW1lID0gMDsKKyAgICBpbnQ2NF90IHByZXNlbnRhdGlvblBvc2l0aW9uID0gMDsKKyAgICBpbnQ2NF90IG5vdyA9IGdldE5hbm9zZWNvbmRzKCk7CisgICAgaW50MzJfdCBzYW1wbGVSYXRlID0gQUF1ZGlvU3RyZWFtX2dldFNhbXBsZVJhdGUoc3RyZWFtKTsKKyAgICBpbnQ2NF90IGZyYW1lc1dyaXR0ZW4gPSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzV3JpdHRlbihzdHJlYW0pOworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TdHJlYW1fZ2V0VGltZXN0YW1wKHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTE9DS19NT05PVE9OSUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByZXNlbnRhdGlvblBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmVzZW50YXRpb25UaW1lKTsKKyAgICBpZiAocmVzdWx0IDwgMCkgeworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAvLyBDYWxjdWxhdGUgd2hlbiB0aGUgbGFzdCBmcmFtZSB3cml0dGVuIHdvdWxkIGJlIHBsYXllZC4KKyAgICBpbnQ2NF90IGRlbHRhRnJhbWVzID0gZnJhbWVzV3JpdHRlbiAtIHByZXNlbnRhdGlvblBvc2l0aW9uOworICAgIGlmIChkZWx0YUZyYW1lcyA8IDApIHsKKyAgICAgICAgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19XQVJOLCBMT0dfVEFHLCAiVW5kZXJydW4gZGV0ZWN0ZWQ6ICVsbGQgZnJhbWVzIiwKKyAgICAgICAgICAgICAgICAobG9uZyBsb25nKSgtZGVsdGFGcmFtZXMpKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGludDY0X3QgY2FsY3VsYXRlZERlbHRhTmFub3MgPSBkZWx0YUZyYW1lcyAqIE5BTk9TX1BFUl9TRUNPTkQgLyBzYW1wbGVSYXRlOworICAgIGludDY0X3QgY2FsY3VsYXRlZFRpbWVOYW5vcyA9IHByZXNlbnRhdGlvblRpbWUgKyAgY2FsY3VsYXRlZERlbHRhTmFub3M7CisgICAgaW50NjRfdCBsYXRlbmN5TmFub3MgPSBjYWxjdWxhdGVkVGltZU5hbm9zIC0gbm93OworICAgIGludDMyX3QgbGF0ZW5jeU1pbGxpcyA9IChpbnQzMl90KSAoKGxhdGVuY3lOYW5vcyArIE5BTk9TX1BFUl9NSUxMSVNFQ09ORCAtIDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBOQU5PU19QRVJfTUlMTElTRUNPTkQpOworICAgIHJldHVybiBsYXRlbmN5TWlsbGlzOworfQorCit1c2luZyBDYlRlc3RQYXJhbXMgPSBzdGQ6OnR1cGxlPGFhdWRpb19zaGFyaW5nX21vZGVfdCwgaW50MzJfdCwgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdD47CitlbnVtIHsKKyAgICBQQVJBTV9TSEFSSU5HX01PREUgPSAwLAorICAgIFBBUkFNX0ZSQU1FU19QRVJfQ0IsCisgICAgUEFSQU1fUEVSRl9NT0RFCit9OworCitzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0VGVzdE5hbWUoY29uc3QgOjp0ZXN0aW5nOjpUZXN0UGFyYW1JbmZvPENiVGVzdFBhcmFtcz4mIGluZm8pIHsKKyAgICByZXR1cm4gc3RkOjpzdHJpbmcoKSArIHNoYXJpbmdNb2RlVG9TdHJpbmcoc3RkOjpnZXQ8UEFSQU1fU0hBUklOR19NT0RFPihpbmZvLnBhcmFtKSkgKworICAgICAgICAgICAgIl9fIiArIHN0ZDo6dG9fc3RyaW5nKHN0ZDo6Z2V0PFBBUkFNX0ZSQU1FU19QRVJfQ0I+KGluZm8ucGFyYW0pKSArCisgICAgICAgICAgICAiX18iICsgcGVyZm9ybWFuY2VNb2RlVG9TdHJpbmcoc3RkOjpnZXQ8UEFSQU1fUEVSRl9NT0RFPihpbmZvLnBhcmFtKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBBQXVkaW9TdHJlYW1DYWxsYmFja1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPENiVGVzdFBhcmFtcz4geworICBwcm90ZWN0ZWQ6CisgICAgc3RydWN0IEFBdWRpb0NhbGxiYWNrVGVzdERhdGEgeworICAgICAgICBpbnQzMl90IGV4cGVjdGVkRnJhbWVzUGVyQ2FsbGJhY2s7CisgICAgICAgIGludDMyX3QgYWN0dWFsRnJhbWVzUGVyQ2FsbGJhY2s7CisgICAgICAgIGludDMyX3QgbWluTGF0ZW5jeTsKKyAgICAgICAgaW50MzJfdCBtYXhMYXRlbmN5OworICAgICAgICBzdGQ6OmF0b21pYzxhYXVkaW9fcmVzdWx0X3Q+IGNhbGxiYWNrRXJyb3I7CisgICAgICAgIHN0ZDo6YXRvbWljPGludDMyX3Q+IGNhbGxiYWNrQ291bnQ7CisKKyAgICAgICAgQUF1ZGlvQ2FsbGJhY2tUZXN0RGF0YSgpIHsKKyAgICAgICAgICAgIHJlc2V0KDApOworICAgICAgICB9CisgICAgICAgIHZvaWQgcmVzZXQoaW50MzJfdCBleHBlY3RlZEZyYW1lc1BlckNiKSB7CisgICAgICAgICAgICBleHBlY3RlZEZyYW1lc1BlckNhbGxiYWNrID0gZXhwZWN0ZWRGcmFtZXNQZXJDYjsKKyAgICAgICAgICAgIGFjdHVhbEZyYW1lc1BlckNhbGxiYWNrID0gMDsKKyAgICAgICAgICAgIG1pbkxhdGVuY3kgPSBJTlQzMl9NQVg7CisgICAgICAgICAgICBtYXhMYXRlbmN5ID0gMDsKKyAgICAgICAgICAgIGNhbGxiYWNrRXJyb3IgPSBBQVVESU9fT0s7CisgICAgICAgICAgICBjYWxsYmFja0NvdW50ID0gMDsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHVwZGF0ZUZyYW1lQ291bnQoaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICAgICAgICAgIGlmIChudW1GcmFtZXMgIT0gZXhwZWN0ZWRGcmFtZXNQZXJDYWxsYmFjaykgeworICAgICAgICAgICAgICAgIC8vIHJlY29yZCB1bmV4cGVjdGVkIGZyYW1lY291bnRzCisgICAgICAgICAgICAgICAgYWN0dWFsRnJhbWVzUGVyQ2FsbGJhY2sgPSBudW1GcmFtZXM7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdHVhbEZyYW1lc1BlckNhbGxiYWNrID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyByZWNvcmQgYXQgbGVhc3Qgb25lIGZyYW1lIGNvdW50CisgICAgICAgICAgICAgICAgYWN0dWFsRnJhbWVzUGVyQ2FsbGJhY2sgPSBudW1GcmFtZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdm9pZCB1cGRhdGVMYXRlbmN5KGludDMyX3QgbGF0ZW5jeSkgeworICAgICAgICAgICAgaWYgKGxhdGVuY3kgPD0gMCkgcmV0dXJuOworICAgICAgICAgICAgbWluTGF0ZW5jeSA9IHN0ZDo6bWluKG1pbkxhdGVuY3ksIGxhdGVuY3kpOworICAgICAgICAgICAgbWF4TGF0ZW5jeSA9IHN0ZDo6bWF4KG1heExhdGVuY3ksIGxhdGVuY3kpOworICAgICAgICB9CisgICAgfTsKKworICAgIHN0YXRpYyB2b2lkIE15RXJyb3JDYWxsYmFja1Byb2MoQUF1ZGlvU3RyZWFtICpzdHJlYW0sIHZvaWQgKnVzZXJEYXRhLCBhYXVkaW9fcmVzdWx0X3QgZXJyb3IpOworCisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlcigpIGNvbnN0IHsgcmV0dXJuIG1IZWxwZXItPmJ1aWxkZXIoKTsgfQorICAgIEFBdWRpb1N0cmVhbSogc3RyZWFtKCkgY29uc3QgeyByZXR1cm4gbUhlbHBlci0+c3RyZWFtKCk7IH0KKyAgICBjb25zdCBTdHJlYW1CdWlsZGVySGVscGVyOjpQYXJhbWV0ZXJzJiBhY3R1YWwoKSBjb25zdCB7IHJldHVybiBtSGVscGVyLT5hY3R1YWwoKTsgfQorCisgICAgc3RkOjp1bmlxdWVfcHRyPFQ+IG1IZWxwZXI7CisgICAgYm9vbCBtU2V0dXBTdWNjZXNmdWwgPSBmYWxzZTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QUF1ZGlvQ2FsbGJhY2tUZXN0RGF0YT4gbUNiRGF0YTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit2b2lkIEFBdWRpb1N0cmVhbUNhbGxiYWNrVGVzdDxUPjo6TXlFcnJvckNhbGxiYWNrUHJvYygKKyAgICAgICAgQUF1ZGlvU3RyZWFtKiAvKnN0cmVhbSovLCB2b2lkICp1c2VyRGF0YSwgYWF1ZGlvX3Jlc3VsdF90IGVycm9yKSB7CisgICAgQUF1ZGlvQ2FsbGJhY2tUZXN0RGF0YSAqbXlEYXRhID0gc3RhdGljX2Nhc3Q8QUF1ZGlvQ2FsbGJhY2tUZXN0RGF0YSo+KHVzZXJEYXRhKTsKKyAgICBteURhdGEtPmNhbGxiYWNrRXJyb3IgPSBlcnJvcjsKK30KKworCitjbGFzcyBBQXVkaW9JbnB1dFN0cmVhbUNhbGxiYWNrVGVzdCA6IHB1YmxpYyBBQXVkaW9TdHJlYW1DYWxsYmFja1Rlc3Q8SW5wdXRTdHJlYW1CdWlsZGVySGVscGVyPiB7CisgIHByb3RlY3RlZDoKKyAgICB2b2lkIFNldFVwKCkgb3ZlcnJpZGU7CisKKyAgICBzdGF0aWMgYWF1ZGlvX2RhdGFfY2FsbGJhY2tfcmVzdWx0X3QgTXlEYXRhQ2FsbGJhY2tQcm9jKAorICAgICAgICAgICAgQUF1ZGlvU3RyZWFtICpzdHJlYW0sIHZvaWQgKnVzZXJEYXRhLCB2b2lkICphdWRpb0RhdGEsIGludDMyX3QgbnVtRnJhbWVzKTsKK307CisKK2FhdWRpb19kYXRhX2NhbGxiYWNrX3Jlc3VsdF90IEFBdWRpb0lucHV0U3RyZWFtQ2FsbGJhY2tUZXN0OjpNeURhdGFDYWxsYmFja1Byb2MoCisgICAgICAgIEFBdWRpb1N0cmVhbSogLypzdHJlYW0qLywgdm9pZCAqdXNlckRhdGEsIHZvaWQqIC8qYXVkaW9EYXRhKi8sIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgQUF1ZGlvQ2FsbGJhY2tUZXN0RGF0YSAqbXlEYXRhID0gc3RhdGljX2Nhc3Q8QUF1ZGlvQ2FsbGJhY2tUZXN0RGF0YSo+KHVzZXJEYXRhKTsKKyAgICBteURhdGEtPnVwZGF0ZUZyYW1lQ291bnQobnVtRnJhbWVzKTsKKyAgICAvLyBObyBsYXRlbmN5IG1lYXN1cmVtZW50IGFzIHRoZXJlIGlzIG5vIEFQSSBmb3IgcXVlcnlpbmcgY2FwdHVyZSBwb3NpdGlvbi4KKyAgICBteURhdGEtPmNhbGxiYWNrQ291bnQrKzsKKyAgICByZXR1cm4gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9DT05USU5VRTsKK30KKwordm9pZCBBQXVkaW9JbnB1dFN0cmVhbUNhbGxiYWNrVGVzdDo6U2V0VXAoKSB7CisgICAgbVNldHVwU3VjY2VzZnVsID0gZmFsc2U7CisgICAgaWYgKCFkZXZpY2VTdXBwb3J0c0ZlYXR1cmUoRkVBVFVSRV9SRUNPUkRJTkcpKSByZXR1cm47CisgICAgbUhlbHBlci5yZXNldChuZXcgSW5wdXRTdHJlYW1CdWlsZGVySGVscGVyKAorICAgICAgICAgICAgICAgICAgICBzdGQ6OmdldDxQQVJBTV9TSEFSSU5HX01PREU+KEdldFBhcmFtKCkpLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OmdldDxQQVJBTV9QRVJGX01PREU+KEdldFBhcmFtKCkpKSk7CisgICAgbUhlbHBlci0+aW5pdEJ1aWxkZXIoKTsKKworICAgIGludDMyX3QgZnJhbWVzUGVyRGF0YUNhbGxiYWNrID0gc3RkOjpnZXQ8UEFSQU1fRlJBTUVTX1BFUl9DQj4oR2V0UGFyYW0oKSk7CisgICAgbUNiRGF0YS5yZXNldChuZXcgQUF1ZGlvQ2FsbGJhY2tUZXN0RGF0YSgpKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEVycm9yQ2FsbGJhY2soYnVpbGRlcigpLCAmTXlFcnJvckNhbGxiYWNrUHJvYywgbUNiRGF0YS5nZXQoKSk7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXREYXRhQ2FsbGJhY2soYnVpbGRlcigpLCAmTXlEYXRhQ2FsbGJhY2tQcm9jLCBtQ2JEYXRhLmdldCgpKTsKKyAgICBpZiAoZnJhbWVzUGVyRGF0YUNhbGxiYWNrICE9IEFBVURJT19VTlNQRUNJRklFRCkgeworICAgICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEZyYW1lc1BlckRhdGFDYWxsYmFjayhidWlsZGVyKCksIGZyYW1lc1BlckRhdGFDYWxsYmFjayk7CisgICAgfQorCisgICAgbUhlbHBlci0+Y3JlYXRlQW5kVmVyaWZ5U3RyZWFtKCZtU2V0dXBTdWNjZXNmdWwpOworfQorCisvLyBUZXN0IFJlYWRpbmcgZnJvbSBhbiBBQXVkaW9TdHJlYW0gdXNpbmcgYSBDYWxsYmFjaworVEVTVF9QKEFBdWRpb0lucHV0U3RyZWFtQ2FsbGJhY2tUZXN0LCB0ZXN0UmVjb3JkaW5nKSB7CisgICAgaWYgKCFtU2V0dXBTdWNjZXNmdWwpIHJldHVybjsKKworICAgIGNvbnN0IGludDMyX3QgZnJhbWVzUGVyRGF0YUNhbGxiYWNrID0gc3RkOjpnZXQ8UEFSQU1fRlJBTUVTX1BFUl9DQj4oR2V0UGFyYW0oKSk7CisgICAgY29uc3QgaW50MzJfdCBhY3R1YWxGcmFtZXNQZXJEYXRhQ2FsbGJhY2sgPSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUGVyRGF0YUNhbGxiYWNrKHN0cmVhbSgpKTsKKyAgICBpZiAoZnJhbWVzUGVyRGF0YUNhbGxiYWNrICE9IEFBVURJT19VTlNQRUNJRklFRCkgeworICAgICAgICBBU1NFUlRfRVEoZnJhbWVzUGVyRGF0YUNhbGxiYWNrLCBhY3R1YWxGcmFtZXNQZXJEYXRhQ2FsbGJhY2spOworICAgIH0KKworICAgIG1DYkRhdGEtPnJlc2V0KGFjdHVhbEZyYW1lc1BlckRhdGFDYWxsYmFjayk7CisKKyAgICBtSGVscGVyLT5zdGFydFN0cmVhbSgpOworICAgIC8vIFNlZSBiLzYyMDkwMTEzLiBGb3IgbGVnYWN5IHBhdGgsIHRoZSBkZXZpY2UgaXMgb25seSBrbm93biBhZnRlcgorICAgIC8vIHRoZSBzdHJlYW0gaGFzIGJlZW4gc3RhcnRlZC4KKyAgICBFWFBFQ1RfTkUoQUFVRElPX1VOU1BFQ0lGSUVELCBBQXVkaW9TdHJlYW1fZ2V0RGV2aWNlSWQoc3RyZWFtKCkpKTsKKyAgICBzbGVlcCgyKTsgLy8gbGV0IHRoZSBzdHJlYW0gcnVuCisKKyAgICBBU1NFUlRfRVEoQUFVRElPX09LLCBtQ2JEYXRhLT5jYWxsYmFja0Vycm9yKTsKKyAgICBBU1NFUlRfR1QobUNiRGF0YS0+Y2FsbGJhY2tDb3VudCwgMTApOworCisgICAgbUhlbHBlci0+c3RvcFN0cmVhbSgpOworCisgICAgaW50MzJfdCBvbGRDYWxsYmFja0NvdW50ID0gbUNiRGF0YS0+Y2FsbGJhY2tDb3VudDsKKyAgICBFWFBFQ1RfR1Qob2xkQ2FsbGJhY2tDb3VudCwgMTApOworICAgIHNsZWVwKDEpOworICAgIEVYUEVDVF9FUShvbGRDYWxsYmFja0NvdW50LCBtQ2JEYXRhLT5jYWxsYmFja0NvdW50KTsgLy8gZXhwZWN0IG5vdCBhZHZhbmNpbmcKKworICAgIGlmIChmcmFtZXNQZXJEYXRhQ2FsbGJhY2sgIT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7CisgICAgICAgIEFTU0VSVF9FUShmcmFtZXNQZXJEYXRhQ2FsbGJhY2ssIG1DYkRhdGEtPmFjdHVhbEZyYW1lc1BlckNhbGxiYWNrKTsKKyAgICB9CisKKyAgICBBU1NFUlRfRVEoQUFVRElPX09LLCBtQ2JEYXRhLT5jYWxsYmFja0Vycm9yKTsKK30KKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoU1BNLCBBQXVkaW9JbnB1dFN0cmVhbUNhbGxiYWNrVGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKAorICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQsCisgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FKSwKKyAgICAgICAgICAgICAgICAvLyBjYiBidWZmZXIgc2l6ZTogYXJiaXRyYXJ5IHByaW1lIG51bWJlciA8IDE5MgorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRCwgMTA5LCBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FKSwKKyAgICAgICAgICAgICAgICAvLyBjYiBidWZmZXIgc2l6ZTogYXJiaXRyYXJ5IHByaW1lIG51bWJlciA+IDE5MgorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRCwgMjIzLCBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FKSwKKyAgICAgICAgICAgICAgICAvLyBSZWNvcmRpbmcgaW4gUE9XRVJfU0FWSU5HIG1vZGUgaXNuJ3Qgc3VwcG9ydGVkLCBiLzYyMjkxNzc1LgorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVELAorICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1kpKSwKKyAgICAgICAgJmdldFRlc3ROYW1lKTsKKworCitjbGFzcyBBQXVkaW9PdXRwdXRTdHJlYW1DYWxsYmFja1Rlc3QgOiBwdWJsaWMgQUF1ZGlvU3RyZWFtQ2FsbGJhY2tUZXN0PE91dHB1dFN0cmVhbUJ1aWxkZXJIZWxwZXI+IHsKKyAgcHJvdGVjdGVkOgorICAgIHZvaWQgU2V0VXAoKSBvdmVycmlkZTsKKworICAgIHN0YXRpYyBhYXVkaW9fZGF0YV9jYWxsYmFja19yZXN1bHRfdCBNeURhdGFDYWxsYmFja1Byb2MoCisgICAgICAgICAgICBBQXVkaW9TdHJlYW0gKnN0cmVhbSwgdm9pZCAqdXNlckRhdGEsIHZvaWQgKmF1ZGlvRGF0YSwgaW50MzJfdCBudW1GcmFtZXMpOworfTsKKworLy8gQ2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBmaWxscyB0aGUgYXVkaW8gb3V0cHV0IGJ1ZmZlci4KK2FhdWRpb19kYXRhX2NhbGxiYWNrX3Jlc3VsdF90IEFBdWRpb091dHB1dFN0cmVhbUNhbGxiYWNrVGVzdDo6TXlEYXRhQ2FsbGJhY2tQcm9jKAorICAgICAgICBBQXVkaW9TdHJlYW0gKnN0cmVhbSwgdm9pZCAqdXNlckRhdGEsIHZvaWQgKmF1ZGlvRGF0YSwgaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICBpbnQzMl90IGNoYW5uZWxDb3VudCA9IEFBdWRpb1N0cmVhbV9nZXRDaGFubmVsQ291bnQoc3RyZWFtKTsKKyAgICBpbnQzMl90IG51bVNhbXBsZXMgPSBjaGFubmVsQ291bnQgKiBudW1GcmFtZXM7CisgICAgaWYgKEFBdWRpb1N0cmVhbV9nZXRGb3JtYXQoc3RyZWFtKSA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYpIHsKKyAgICAgICAgaW50MTZfdCAqc2hvcnREYXRhID0gKGludDE2X3QgKikgYXVkaW9EYXRhOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVNhbXBsZXM7IGkrKykgKnNob3J0RGF0YSsrID0gMDsKKyAgICB9IGVsc2UgaWYgKEFBdWRpb1N0cmVhbV9nZXRGb3JtYXQoc3RyZWFtKSA9PSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgeworICAgICAgICBmbG9hdCAqZmxvYXREYXRhID0gKGZsb2F0ICopIGF1ZGlvRGF0YTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspICpmbG9hdERhdGErKyA9IDAuMGY7CisgICAgfQorCisgICAgQUF1ZGlvQ2FsbGJhY2tUZXN0RGF0YSAqbXlEYXRhID0gc3RhdGljX2Nhc3Q8QUF1ZGlvQ2FsbGJhY2tUZXN0RGF0YSo+KHVzZXJEYXRhKTsKKyAgICBteURhdGEtPnVwZGF0ZUZyYW1lQ291bnQobnVtRnJhbWVzKTsKKyAgICBteURhdGEtPnVwZGF0ZUxhdGVuY3kobWVhc3VyZUxhdGVuY3koc3RyZWFtKSk7CisgICAgbXlEYXRhLT5jYWxsYmFja0NvdW50Kys7CisgICAgcmV0dXJuIEFBVURJT19DQUxMQkFDS19SRVNVTFRfQ09OVElOVUU7Cit9CisKK3ZvaWQgQUF1ZGlvT3V0cHV0U3RyZWFtQ2FsbGJhY2tUZXN0OjpTZXRVcCgpIHsKKyAgICBtU2V0dXBTdWNjZXNmdWwgPSBmYWxzZTsKKyAgICBpZiAoIWRldmljZVN1cHBvcnRzRmVhdHVyZShGRUFUVVJFX1BMQVlCQUNLKSkgcmV0dXJuOworICAgIG1IZWxwZXIucmVzZXQobmV3IE91dHB1dFN0cmVhbUJ1aWxkZXJIZWxwZXIoCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6Z2V0PFBBUkFNX1NIQVJJTkdfTU9ERT4oR2V0UGFyYW0oKSksCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6Z2V0PFBBUkFNX1BFUkZfTU9ERT4oR2V0UGFyYW0oKSkpKTsKKyAgICBtSGVscGVyLT5pbml0QnVpbGRlcigpOworCisgICAgaW50MzJfdCBmcmFtZXNQZXJEYXRhQ2FsbGJhY2sgPSBzdGQ6OmdldDxQQVJBTV9GUkFNRVNfUEVSX0NCPihHZXRQYXJhbSgpKTsKKyAgICBtQ2JEYXRhLnJlc2V0KG5ldyBBQXVkaW9DYWxsYmFja1Rlc3REYXRhKCkpOworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RXJyb3JDYWxsYmFjayhidWlsZGVyKCksICZNeUVycm9yQ2FsbGJhY2tQcm9jLCBtQ2JEYXRhLmdldCgpKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldERhdGFDYWxsYmFjayhidWlsZGVyKCksICZNeURhdGFDYWxsYmFja1Byb2MsIG1DYkRhdGEuZ2V0KCkpOworICAgIGlmIChmcmFtZXNQZXJEYXRhQ2FsbGJhY2sgIT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7CisgICAgICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RnJhbWVzUGVyRGF0YUNhbGxiYWNrKGJ1aWxkZXIoKSwgZnJhbWVzUGVyRGF0YUNhbGxiYWNrKTsKKyAgICB9CisKKyAgICBtSGVscGVyLT5jcmVhdGVBbmRWZXJpZnlTdHJlYW0oJm1TZXR1cFN1Y2Nlc2Z1bCk7Cit9CisKKy8vIFRlc3QgV3JpdGluZyB0byBhbiBBQXVkaW9TdHJlYW0gdXNpbmcgYSBDYWxsYmFjaworVEVTVF9QKEFBdWRpb091dHB1dFN0cmVhbUNhbGxiYWNrVGVzdCwgdGVzdFBsYXliYWNrKSB7CisgICAgaWYgKCFtU2V0dXBTdWNjZXNmdWwpIHJldHVybjsKKworICAgIGNvbnN0IGludDMyX3QgZnJhbWVzUGVyRGF0YUNhbGxiYWNrID0gc3RkOjpnZXQ8UEFSQU1fRlJBTUVTX1BFUl9DQj4oR2V0UGFyYW0oKSk7CisgICAgY29uc3QgaW50MzJfdCBhY3R1YWxGcmFtZXNQZXJEYXRhQ2FsbGJhY2sgPSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUGVyRGF0YUNhbGxiYWNrKHN0cmVhbSgpKTsKKyAgICBpZiAoZnJhbWVzUGVyRGF0YUNhbGxiYWNrICE9IEFBVURJT19VTlNQRUNJRklFRCkgeworICAgICAgICBBU1NFUlRfRVEoZnJhbWVzUGVyRGF0YUNhbGxiYWNrLCBhY3R1YWxGcmFtZXNQZXJEYXRhQ2FsbGJhY2spOworICAgIH0KKworICAgIC8vIFN0YXJ0L3N0b3AgbW9yZSB0aGFuIG9uY2UgdG8gc2VlIGlmIGl0IGZhaWxzIGFmdGVyIHRoZSBmaXJzdCB0aW1lLgorICAgIC8vIFdyaXRlIHNvbWUgZGF0YSBhbmQgbWVhc3VyZSB0aGUgcmF0ZSB0byBzZWUgaWYgdGhlIHRpbWluZyBpcyBPSy4KKyAgICBmb3IgKGludCBsb29wSW5kZXggPSAwOyBsb29wSW5kZXggPCAyOyBsb29wSW5kZXgrKykgeworICAgICAgICBtQ2JEYXRhLT5yZXNldChhY3R1YWxGcmFtZXNQZXJEYXRhQ2FsbGJhY2spOworCisgICAgICAgIG1IZWxwZXItPnN0YXJ0U3RyZWFtKCk7CisgICAgICAgIC8vIFNlZSBiLzYyMDkwMTEzLiBGb3IgbGVnYWN5IHBhdGgsIHRoZSBkZXZpY2UgaXMgb25seSBrbm93biBhZnRlcgorICAgICAgICAvLyB0aGUgc3RyZWFtIGhhcyBiZWVuIHN0YXJ0ZWQuCisgICAgICAgIEVYUEVDVF9ORShBQVVESU9fVU5TUEVDSUZJRUQsIEFBdWRpb1N0cmVhbV9nZXREZXZpY2VJZChzdHJlYW0oKSkpOworICAgICAgICBzbGVlcCgyKTsgLy8gbGV0IHRoZSBzdHJlYW0gcnVuCisKKyAgICAgICAgQVNTRVJUX0VRKEFBVURJT19PSywgbUNiRGF0YS0+Y2FsbGJhY2tFcnJvcik7CisgICAgICAgIEFTU0VSVF9HVChtQ2JEYXRhLT5jYWxsYmFja0NvdW50LCAxMCk7CisKKyAgICAgICAgLy8gRm9yIG1vcmUgY292ZXJhZ2UsIGFsdGVybmF0ZSBwYXVzaW5nIGFuZCBzdG9wcGluZy4KKyAgICAgICAgaWYgKChsb29wSW5kZXggJiAxKSA9PSAwKSB7CisgICAgICAgICAgICBtSGVscGVyLT5wYXVzZVN0cmVhbSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUhlbHBlci0+c3RvcFN0cmVhbSgpOworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBvbGRDYWxsYmFja0NvdW50ID0gbUNiRGF0YS0+Y2FsbGJhY2tDb3VudDsKKyAgICAgICAgRVhQRUNUX0dUKG9sZENhbGxiYWNrQ291bnQsIDEwKTsKKyAgICAgICAgc2xlZXAoMSk7CisgICAgICAgIEVYUEVDVF9FUShvbGRDYWxsYmFja0NvdW50LCBtQ2JEYXRhLT5jYWxsYmFja0NvdW50KTsgLy8gZXhwZWN0IG5vdCBhZHZhbmNpbmcKKworICAgICAgICBpZiAoZnJhbWVzUGVyRGF0YUNhbGxiYWNrICE9IEFBVURJT19VTlNQRUNJRklFRCkgeworICAgICAgICAgICAgQVNTRVJUX0VRKGZyYW1lc1BlckRhdGFDYWxsYmFjaywgbUNiRGF0YS0+YWN0dWFsRnJhbWVzUGVyQ2FsbGJhY2spOworICAgICAgICB9CisKKyAgICAgICAgRVhQRUNUX0dFKG1DYkRhdGEtPm1pbkxhdGVuY3ksIDEpOyAgIC8vIEFic3VyZGx5IGxvdworICAgICAgICAvLyBXZSBvbmx5IGlzc3VlIGEgd2FybmluZyBoZXJlIGJlY2F1c2UgdGhlIENERCBkb2VzIG5vdCBtYW5kYXRlIGEgc3BlY2lmaWMgbWluaW11bSBsYXRlbmN5CisgICAgICAgIGlmIChtQ2JEYXRhLT5tYXhMYXRlbmN5ID4gMzAwKSB7CisgICAgICAgICAgICBfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX1dBUk4sIExPR19UQUcsCisgICAgICAgICAgICAgICAgICAgICJTdXNwaWNpb3VzbHkgaGlnaCBjYWxsYmFjayBsYXRlbmN5OiAlZCIsIG1DYkRhdGEtPm1heExhdGVuY3kpOworICAgICAgICB9CisgICAgICAgIC8vcHJpbnRmKCJsYXRlbmN5OiAlZCwgJWRcbiIsIG1DYkRhdGEtPm1pbkxhdGVuY3ksIG1DYkRhdGEtPm1heExhdGVuY3kpOworICAgIH0KKworICAgIEFTU0VSVF9FUShBQVVESU9fT0ssIG1DYkRhdGEtPmNhbGxiYWNrRXJyb3IpOworfQorCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChTUE0sIEFBdWRpb091dHB1dFN0cmVhbUNhbGxiYWNrVGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKAorICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQsCisgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FKSwKKyAgICAgICAgICAgICAgICAvLyBjYiBidWZmZXIgc2l6ZTogYXJiaXRyYXJ5IHByaW1lIG51bWJlciA8IDE5MgorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRCwgMTA5LCBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FKSwKKyAgICAgICAgICAgICAgICAvLyBjYiBidWZmZXIgc2l6ZTogYXJiaXRyYXJ5IHByaW1lIG51bWJlciA+IDE5MgorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRCwgMjIzLCBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoCisgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX1BPV0VSX1NBVklORyksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKAorICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQsCisgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSkpLAorICAgICAgICAmZ2V0VGVzdE5hbWUpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbmF0aXZlbWVkaWEvYWF1ZGlvL2puaS90ZXN0X2FhdWRpb19taXNjLmNwcCBiL3Rlc3RzL3Rlc3RzL25hdGl2ZW1lZGlhL2FhdWRpby9qbmkvdGVzdF9hYXVkaW9fbWlzYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFlZDlmNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL25hdGl2ZW1lZGlhL2FhdWRpby9qbmkvdGVzdF9hYXVkaW9fbWlzYy5jcHAKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIiwgRU5VTV9DQU5OT1RfQ0hBTkdFKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQUF1ZGlvVGVzdCIKKworI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2xvZy5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKy8vIE1ha2Ugc3VyZSBlbnVtcyBkbyBub3QgY2hhbmdlIHZhbHVlLgorVEVTVCh0ZXN0X2FhdWRpb19taXNjLCBhYXVkaW9fZnJlZXplX2VudW1zKSB7CisKKyNkZWZpbmUgRU5VTV9DQU5OT1RfQ0hBTkdFICJlbnVtIGluIEFQSSBjYW5ub3QgY2hhbmdlIgorCisgICAgc3RhdGljX2Fzc2VydCgwID09IEFBVURJT19ESVJFQ1RJT05fT1VUUFVULCBFTlVNX0NBTk5PVF9DSEFOR0UpOworICAgIHN0YXRpY19hc3NlcnQoMSA9PSBBQVVESU9fRElSRUNUSU9OX0lOUFVULCBFTlVNX0NBTk5PVF9DSEFOR0UpOworCisgICAgc3RhdGljX2Fzc2VydCgtMSA9PSBBQVVESU9fRk9STUFUX0lOVkFMSUQsIEVOVU1fQ0FOTk9UX0NIQU5HRSk7CisgICAgc3RhdGljX2Fzc2VydCgwID09IEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQsIEVOVU1fQ0FOTk9UX0NIQU5HRSk7CisgICAgc3RhdGljX2Fzc2VydCgxID09IEFBVURJT19GT1JNQVRfUENNX0kxNiwgRU5VTV9DQU5OT1RfQ0hBTkdFKTsKKyAgICBzdGF0aWNfYXNzZXJ0KDIgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQsIEVOVU1fQ0FOTk9UX0NIQU5HRSk7CisKKyAgICBzdGF0aWNfYXNzZXJ0KDAgPT0gQUFVRElPX09LLCBFTlVNX0NBTk5PVF9DSEFOR0UpOworICAgIHN0YXRpY19hc3NlcnQoLTkwMCA9PSBBQVVESU9fRVJST1JfQkFTRSwgRU5VTV9DQU5OT1RfQ0hBTkdFKTsKKyAgICBzdGF0aWNfYXNzZXJ0KC04OTkgPT0gQUFVRElPX0VSUk9SX0RJU0NPTk5FQ1RFRCwgRU5VTV9DQU5OT1RfQ0hBTkdFKTsKKyAgICBzdGF0aWNfYXNzZXJ0KC04OTggPT0gQUFVRElPX0VSUk9SX0lMTEVHQUxfQVJHVU1FTlQsIEVOVU1fQ0FOTk9UX0NIQU5HRSk7CisgICAgLy8gcmVzZXJ2ZWQKKyAgICBzdGF0aWNfYXNzZXJ0KC04OTYgPT0gQUFVRElPX0VSUk9SX0lOVEVSTkFMLCBFTlVNX0NBTk5PVF9DSEFOR0UpOworICAgIHN0YXRpY19hc3NlcnQoLTg5NSA9PSBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURSwgRU5VTV9DQU5OT1RfQ0hBTkdFKTsKKyAgICAvLyByZXNlcnZlZAorICAgIC8vIHJlc2VydmVkCisgICAgc3RhdGljX2Fzc2VydCgtODkyID09IEFBVURJT19FUlJPUl9JTlZBTElEX0hBTkRMRSwgRU5VTV9DQU5OT1RfQ0hBTkdFKTsKKyAgICAvLyByZXNlcnZlZAorICAgIHN0YXRpY19hc3NlcnQoLTg5MCA9PSBBQVVESU9fRVJST1JfVU5JTVBMRU1FTlRFRCwgRU5VTV9DQU5OT1RfQ0hBTkdFKTsKKyAgICBzdGF0aWNfYXNzZXJ0KC04ODkgPT0gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFLCBFTlVNX0NBTk5PVF9DSEFOR0UpOworICAgIHN0YXRpY19hc3NlcnQoLTg4OCA9PSBBQVVESU9fRVJST1JfTk9fRlJFRV9IQU5ETEVTLCBFTlVNX0NBTk5PVF9DSEFOR0UpOworICAgIHN0YXRpY19hc3NlcnQoLTg4NyA9PSBBQVVESU9fRVJST1JfTk9fTUVNT1JZLCBFTlVNX0NBTk5PVF9DSEFOR0UpOworICAgIHN0YXRpY19hc3NlcnQoLTg4NiA9PSBBQVVESU9fRVJST1JfTlVMTCwgRU5VTV9DQU5OT1RfQ0hBTkdFKTsKKyAgICBzdGF0aWNfYXNzZXJ0KC04ODUgPT0gQUFVRElPX0VSUk9SX1RJTUVPVVQsIEVOVU1fQ0FOTk9UX0NIQU5HRSk7CisgICAgc3RhdGljX2Fzc2VydCgtODg0ID09IEFBVURJT19FUlJPUl9XT1VMRF9CTE9DSywgRU5VTV9DQU5OT1RfQ0hBTkdFKTsKKyAgICBzdGF0aWNfYXNzZXJ0KC04ODMgPT0gQUFVRElPX0VSUk9SX0lOVkFMSURfRk9STUFULCBFTlVNX0NBTk5PVF9DSEFOR0UpOworICAgIHN0YXRpY19hc3NlcnQoLTg4MiA9PSBBQVVESU9fRVJST1JfT1VUX09GX1JBTkdFLCBFTlVNX0NBTk5PVF9DSEFOR0UpOworICAgIHN0YXRpY19hc3NlcnQoLTg4MSA9PSBBQVVESU9fRVJST1JfTk9fU0VSVklDRSwgRU5VTV9DQU5OT1RfQ0hBTkdFKTsKKworICAgIHN0YXRpY19hc3NlcnQoMCA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX1VOSU5JVElBTElaRUQsIEVOVU1fQ0FOTk9UX0NIQU5HRSk7CisgICAgc3RhdGljX2Fzc2VydCgxID09IEFBVURJT19TVFJFQU1fU1RBVEVfVU5LTk9XTiwgRU5VTV9DQU5OT1RfQ0hBTkdFKTsKKyAgICBzdGF0aWNfYXNzZXJ0KDIgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9PUEVOLCBFTlVNX0NBTk5PVF9DSEFOR0UpOworICAgIHN0YXRpY19hc3NlcnQoMyA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJUSU5HLCBFTlVNX0NBTk5PVF9DSEFOR0UpOworICAgIHN0YXRpY19hc3NlcnQoNCA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJURUQsIEVOVU1fQ0FOTk9UX0NIQU5HRSk7CisgICAgc3RhdGljX2Fzc2VydCg1ID09IEFBVURJT19TVFJFQU1fU1RBVEVfUEFVU0lORywgRU5VTV9DQU5OT1RfQ0hBTkdFKTsKKyAgICBzdGF0aWNfYXNzZXJ0KDYgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9QQVVTRUQsIEVOVU1fQ0FOTk9UX0NIQU5HRSk7CisgICAgc3RhdGljX2Fzc2VydCg3ID09IEFBVURJT19TVFJFQU1fU1RBVEVfRkxVU0hJTkcsIEVOVU1fQ0FOTk9UX0NIQU5HRSk7CisgICAgc3RhdGljX2Fzc2VydCg4ID09IEFBVURJT19TVFJFQU1fU1RBVEVfRkxVU0hFRCwgRU5VTV9DQU5OT1RfQ0hBTkdFKTsKKyAgICBzdGF0aWNfYXNzZXJ0KDkgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUElORywgRU5VTV9DQU5OT1RfQ0hBTkdFKTsKKyAgICBzdGF0aWNfYXNzZXJ0KDEwID09IEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBFRCwgRU5VTV9DQU5OT1RfQ0hBTkdFKTsKKyAgICBzdGF0aWNfYXNzZXJ0KDExID09IEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0lORywgRU5VTV9DQU5OT1RfQ0hBTkdFKTsKKyAgICBzdGF0aWNfYXNzZXJ0KDEyID09IEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0VELCBFTlVNX0NBTk5PVF9DSEFOR0UpOworCisgICAgc3RhdGljX2Fzc2VydCgwID09IEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFLCBFTlVNX0NBTk5PVF9DSEFOR0UpOworICAgIHN0YXRpY19hc3NlcnQoMSA9PSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRCwgRU5VTV9DQU5OT1RfQ0hBTkdFKTsKKworICAgIHN0YXRpY19hc3NlcnQoMCA9PSBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX0NPTlRJTlVFLCBFTlVNX0NBTk5PVF9DSEFOR0UpOworICAgIHN0YXRpY19hc3NlcnQoMSA9PSBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1AsIEVOVU1fQ0FOTk9UX0NIQU5HRSk7CisKKyAgICBzdGF0aWNfYXNzZXJ0KDEgPT0gQUFVRElPX1VTQUdFX01FRElBLCBFTlVNX0NBTk5PVF9DSEFOR0UpOworICAgIHN0YXRpY19hc3NlcnQoMiA9PSBBQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTiwgRU5VTV9DQU5OT1RfQ0hBTkdFKTsKKyAgICBzdGF0aWNfYXNzZXJ0KDMgPT0gQUFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORywgRU5VTV9DQU5OT1RfQ0hBTkdFKTsKKyAgICBzdGF0aWNfYXNzZXJ0KDQgPT0gQUFVRElPX1VTQUdFX0FMQVJNLCBFTlVNX0NBTk5PVF9DSEFOR0UpOworICAgIHN0YXRpY19hc3NlcnQoNSA9PSBBQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OLCBFTlVNX0NBTk5PVF9DSEFOR0UpOworICAgIHN0YXRpY19hc3NlcnQoNiA9PSBBQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1JJTkdUT05FLCBFTlVNX0NBTk5PVF9DSEFOR0UpOworICAgIHN0YXRpY19hc3NlcnQoMTAgPT0gQUFVRElPX1VTQUdFX05PVElGSUNBVElPTl9FVkVOVCwgRU5VTV9DQU5OT1RfQ0hBTkdFKTsKKyAgICBzdGF0aWNfYXNzZXJ0KDExID09IEFBVURJT19VU0FHRV9BU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFksIEVOVU1fQ0FOTk9UX0NIQU5HRSk7CisgICAgc3RhdGljX2Fzc2VydCgxMiA9PSBBQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFLCBFTlVNX0NBTk5PVF9DSEFOR0UpOworICAgIHN0YXRpY19hc3NlcnQoMTMgPT0gQUFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OLCBFTlVNX0NBTk5PVF9DSEFOR0UpOworICAgIHN0YXRpY19hc3NlcnQoMTQgPT0gQUFVRElPX1VTQUdFX0dBTUUsIEVOVU1fQ0FOTk9UX0NIQU5HRSk7CisgICAgc3RhdGljX2Fzc2VydCgxNiA9PSBBQVVESU9fVVNBR0VfQVNTSVNUQU5ULCBFTlVNX0NBTk5PVF9DSEFOR0UpOworCisgICAgc3RhdGljX2Fzc2VydCgxID09IEFBVURJT19DT05URU5UX1RZUEVfU1BFRUNILCBFTlVNX0NBTk5PVF9DSEFOR0UpOworICAgIHN0YXRpY19hc3NlcnQoMiA9PSBBQVVESU9fQ09OVEVOVF9UWVBFX01VU0lDLCBFTlVNX0NBTk5PVF9DSEFOR0UpOworICAgIHN0YXRpY19hc3NlcnQoMyA9PSBBQVVESU9fQ09OVEVOVF9UWVBFX01PVklFLCBFTlVNX0NBTk5PVF9DSEFOR0UpOworICAgIHN0YXRpY19hc3NlcnQoNCA9PSBBQVVESU9fQ09OVEVOVF9UWVBFX1NPTklGSUNBVElPTiwgRU5VTV9DQU5OT1RfQ0hBTkdFKTsKKworICAgIHN0YXRpY19hc3NlcnQoMSA9PSBBQVVESU9fSU5QVVRfUFJFU0VUX0dFTkVSSUMsIEVOVU1fQ0FOTk9UX0NIQU5HRSk7CisgICAgc3RhdGljX2Fzc2VydCg1ID09IEFBVURJT19JTlBVVF9QUkVTRVRfQ0FNQ09SREVSLCBFTlVNX0NBTk5PVF9DSEFOR0UpOworICAgIHN0YXRpY19hc3NlcnQoNiA9PSBBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX1JFQ09HTklUSU9OLCBFTlVNX0NBTk5PVF9DSEFOR0UpOworICAgIHN0YXRpY19hc3NlcnQoNyA9PSBBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX0NPTU1VTklDQVRJT04sIEVOVU1fQ0FOTk9UX0NIQU5HRSk7CisgICAgc3RhdGljX2Fzc2VydCg5ID09IEFBVURJT19JTlBVVF9QUkVTRVRfVU5QUk9DRVNTRUQsIEVOVU1fQ0FOTk9UX0NIQU5HRSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9uYXRpdmVtZWRpYS9hYXVkaW8vc3JjL3Rlc3RfYWF1ZGlvX21tYXAuY3BwIGIvdGVzdHMvdGVzdHMvbmF0aXZlbWVkaWEvYWF1ZGlvL2puaS90ZXN0X2FhdWRpb19tbWFwLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvdGVzdHMvbmF0aXZlbWVkaWEvYWF1ZGlvL3NyYy90ZXN0X2FhdWRpb19tbWFwLmNwcApyZW5hbWUgdG8gdGVzdHMvdGVzdHMvbmF0aXZlbWVkaWEvYWF1ZGlvL2puaS90ZXN0X2FhdWRpb19tbWFwLmNwcApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbmF0aXZlbWVkaWEvYWF1ZGlvL2puaS90ZXN0X2FhdWRpb19zdHJlYW1fYnVpbGRlci5jcHAgYi90ZXN0cy90ZXN0cy9uYXRpdmVtZWRpYS9hYXVkaW8vam5pL3Rlc3RfYWF1ZGlvX3N0cmVhbV9idWlsZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzEzYjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvbmF0aXZlbWVkaWEvYWF1ZGlvL2puaS90ZXN0X2FhdWRpb19zdHJlYW1fYnVpbGRlci5jcHAKQEAgLTAsMCArMSwzMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkFBdWRpb1Rlc3QiCisKKyNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9sb2cuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSAidXRpbHMuaCIKKworLy8gQ3JlYXRlcyBhIGJ1aWxkZXIsIHRoZSBjYWxsZXIgdGFrZXMgb3duZXJzaGlwCitzdGF0aWMgdm9pZCBjcmVhdGVfc3RyZWFtX2J1aWxkZXIoQUF1ZGlvU3RyZWFtQnVpbGRlcioqIGFhdWRpb0J1aWxkZXIpIHsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvX2NyZWF0ZVN0cmVhbUJ1aWxkZXIoYWF1ZGlvQnVpbGRlcik7CisgICAgQVNTRVJUX0VRKEFBVURJT19PSywgcmVzdWx0KTsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgKmFhdWRpb0J1aWxkZXIpOworfQorCitlbnVtIGNsYXNzIEV4cGVjdCB7IEZBSUwsIFNVQ0NFRUQsIE5PVF9DUkFTSCB9OworCisvLyBUcmllcyB0byBvcGVuIGFuIGF1ZGlvIHN0cmVhbSB1c2luZyBhIHByaW1lZCBCdWlsZGVyLgorLy8gVGFrZXMgb3duZXJzaGlwIG9mIHRoZSBCdWlsZGVyLgorc3RhdGljIHZvaWQgdHJ5X29wZW5pbmdfYXVkaW9fc3RyZWFtKEFBdWRpb1N0cmVhbUJ1aWxkZXIgKmFhdWRpb0J1aWxkZXIsIEV4cGVjdCBleHBlY3QpIHsKKyAgICAvLyBDcmVhdGUgYW4gQUF1ZGlvU3RyZWFtIHVzaW5nIHRoZSBCdWlsZGVyLgorICAgIEFBdWRpb1N0cmVhbSAqYWF1ZGlvU3RyZWFtID0gbnVsbHB0cjsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKGFhdWRpb0J1aWxkZXIsICZhYXVkaW9TdHJlYW0pOworICAgIGlmIChleHBlY3QgPT0gRXhwZWN0OjpGQUlMKSB7CisgICAgICAgIEFTU0VSVF9ORShBQVVESU9fT0ssIHJlc3VsdCk7CisgICAgICAgIEFTU0VSVF9FUShudWxscHRyLCBhYXVkaW9TdHJlYW0pOworICAgIH0gZWxzZSBpZiAoZXhwZWN0ID09IEV4cGVjdDo6U1VDQ0VFRCkgeworICAgICAgICBBU1NFUlRfRVEoQUFVRElPX09LLCByZXN1bHQpOworICAgICAgICBBU1NFUlRfTkUobnVsbHB0ciwgYWF1ZGlvU3RyZWFtKTsKKyAgICB9IGVsc2UgeyAvLyBOT1RfQ1JBU0gKKyAgICAgICAgQVNTRVJUX1RSVUUoKChyZXN1bHQgPCAwKSAmJiAoYWF1ZGlvU3RyZWFtID09IG51bGxwdHIpKQorICAgICAgICAgICAgICAgIHx8ICgocmVzdWx0ID09IEFBVURJT19PSykgJiYgKGFhdWRpb1N0cmVhbSAhPSBudWxscHRyKSkpOworICAgIH0KKworICAgIC8vIENsZWFudXAKKyAgICBBU1NFUlRfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1CdWlsZGVyX2RlbGV0ZShhYXVkaW9CdWlsZGVyKSk7CisgICAgaWYgKGFhdWRpb1N0cmVhbSAhPSBudWxscHRyKSB7CisgICAgICAgIEFTU0VSVF9FUShBQVVESU9fT0ssIEFBdWRpb1N0cmVhbV9jbG9zZShhYXVkaW9TdHJlYW0pKTsKKyAgICB9Cit9CisKKy8vIFRlc3QgY3JlYXRpbmcgYSBkZWZhdWx0IHN0cmVhbSB3aXRoIHNwZWNpZmljIGRldmljZXMKK3N0YXRpYyB2b2lkIHJ1bnRlc3RfYWF1ZGlvX2RldmljZXMoaW50MzJfdCBkZXZpY2VJZCwgRXhwZWN0IGV4cGVjdCkgeworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXIgKmFhdWRpb0J1aWxkZXIgPSBudWxscHRyOworICAgIGNyZWF0ZV9zdHJlYW1fYnVpbGRlcigmYWF1ZGlvQnVpbGRlcik7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXREZXZpY2VJZChhYXVkaW9CdWlsZGVyLCBkZXZpY2VJZCk7CisgICAgdHJ5X29wZW5pbmdfYXVkaW9fc3RyZWFtKGFhdWRpb0J1aWxkZXIsIGV4cGVjdCk7Cit9CisKK1RFU1QodGVzdF9hYXVkaW8sIGFhdWRpb19zdHJlYW1fZGV2aWNlX3Vuc3BlY2lmaWVkKSB7CisgICAgcnVudGVzdF9hYXVkaW9fZGV2aWNlcyhBQVVESU9fVU5TUEVDSUZJRUQsIEV4cGVjdDo6Tk9UX0NSQVNIKTsKK30KKworLyogRklYTUUgLSB3aHkgY2FuIHdlIG9wZW4gdGhpcyBkZXZpY2U/IFdoYXQgaXMgYW4gaWxsZWdhbCBkZXZpY2VJZD8KK1RFU1QodGVzdF9hYXVkaW8sIGFhdWRpb19zdHJlYW1fZGV2aWNlX2Fic3VyZCkgeworICAgIHJ1bnRlc3RfYWF1ZGlvX2RldmljZXMoMTk3MzY0NTksIHRydWUpOworfQorKi8KKy8qIEZJWE1FIHJldmlldworVEVTVCh0ZXN0X2FhdWRpbywgYWF1ZGlvX3N0cmVhbV9kZXZpY2VfcmVhc29uYWJsZSkgeworICAgIHJ1bnRlc3RfYWF1ZGlvX2RldmljZXMoMSwgZmFsc2UpOworfQorKi8KKworLyogRklYTUUgLSB3aHkgY2FuIHdlIG9wZW4gdGhpcyBkZXZpY2U/IFdoYXQgaXMgYW4gaWxsZWdhbCBkZXZpY2VJZD8KK1RFU1QodGVzdF9hYXVkaW8sIGFhdWRpb19zdHJlYW1fZGV2aWNlX25lZ2F0aXZlKSB7CisgICAgcnVudGVzdF9hYXVkaW9fZGV2aWNlcygtNzY1LCB0cnVlKTsKK30KKyovCisKKy8vIFRlc3QgY3JlYXRpbmcgYSBkZWZhdWx0IHN0cmVhbSB3aXRoIGV2ZXJ5dGhpbmcgdW5zcGVjaWZpZWQuCitURVNUKHRlc3RfYWF1ZGlvLCBhYXVkaW9fc3RyZWFtX3Vuc3BlY2lmaWVkKSB7CisgICAgaWYgKCFkZXZpY2VTdXBwb3J0c0ZlYXR1cmUoRkVBVFVSRV9QTEFZQkFDSykpIHJldHVybjsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyICphYXVkaW9CdWlsZGVyID0gbnVsbHB0cjsKKyAgICBjcmVhdGVfc3RyZWFtX2J1aWxkZXIoJmFhdWRpb0J1aWxkZXIpOworCisgICAgLy8gQ3JlYXRlIGFuIEFBdWRpb1N0cmVhbSB1c2luZyB0aGUgQnVpbGRlci4KKyAgICBBQXVkaW9TdHJlYW0gKmFhdWRpb1N0cmVhbSA9IG51bGxwdHI7CisgICAgQVNTRVJUX0VRKEFBVURJT19PSywgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKGFhdWRpb0J1aWxkZXIsICZhYXVkaW9TdHJlYW0pKTsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgYWF1ZGlvU3RyZWFtKTsKKworICAgIC8vIENsZWFudXAKKyAgICBFWFBFQ1RfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1CdWlsZGVyX2RlbGV0ZShhYXVkaW9CdWlsZGVyKSk7CisgICAgRVhQRUNUX0VRKEFBVURJT19PSywgQUF1ZGlvU3RyZWFtX2Nsb3NlKGFhdWRpb1N0cmVhbSkpOworfQorCitjbGFzcyBBQXVkaW9TdHJlYW1CdWlsZGVyU2FtcGxpbmdSYXRlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08aW50MzJfdD4geworICBwdWJsaWM6CisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldFRlc3ROYW1lKGNvbnN0IDo6dGVzdGluZzo6VGVzdFBhcmFtSW5mbzxpbnQzMl90PiYgaW5mbykgeworICAgICAgICByZXR1cm4gaW5mby5wYXJhbSA+PSAwID8gc3RkOjp0b19zdHJpbmcoaW5mby5wYXJhbSkgOiAiXyIgKyBzdGQ6OnRvX3N0cmluZygtaW5mby5wYXJhbSk7CisgICAgfQorICBwcm90ZWN0ZWQ6CisgICAgc3RhdGljIGJvb2wgaXNWYWxpZFNhbXBsaW5nUmF0ZShpbnQzMl90IHNyKSB7CisgICAgICAgIHJldHVybiBzciA9PSBBQVVESU9fVU5TUEVDSUZJRUQgfHwgKHNyID49IDgwMDAgJiYgc3IgPD0gMTAwMDAwMCk7CisgICAgfQorfTsKKworVEVTVF9QKEFBdWRpb1N0cmVhbUJ1aWxkZXJTYW1wbGluZ1JhdGVUZXN0LCBvcGVuU3RyZWFtKSB7CisgICAgaWYgKCFkZXZpY2VTdXBwb3J0c0ZlYXR1cmUoRkVBVFVSRV9QTEFZQkFDSykpIHJldHVybjsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyICphYXVkaW9CdWlsZGVyID0gbnVsbHB0cjsKKyAgICBjcmVhdGVfc3RyZWFtX2J1aWxkZXIoJmFhdWRpb0J1aWxkZXIpOworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0U2FtcGxlUmF0ZShhYXVkaW9CdWlsZGVyLCBHZXRQYXJhbSgpKTsKKyAgICB0cnlfb3BlbmluZ19hdWRpb19zdHJlYW0oCisgICAgICAgICAgICBhYXVkaW9CdWlsZGVyLCBpc1ZhbGlkU2FtcGxpbmdSYXRlKEdldFBhcmFtKCkpID8gRXhwZWN0OjpTVUNDRUVEIDogRXhwZWN0OjpGQUlMKTsKK30KKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoU1IsIEFBdWRpb1N0cmVhbUJ1aWxkZXJTYW1wbGluZ1JhdGVUZXN0LAorICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygKKyAgICAgICAgICAgICAgICAvLyBDb21tb25seSB1c2VkIHZhbHVlcworICAgICAgICAgICAgICAgIEFBVURJT19VTlNQRUNJRklFRCwgODAwMCwgMTEwMjUsIDE2MDAwLCAyMjA1MCwgNDQxMDAsIDQ4MDAwLCA4ODIwMCwgOTYwMDAsCisgICAgICAgICAgICAgICAgMTc2NDAwLCAxOTIwMDAsIDM4NDAwMCwKKyAgICAgICAgICAgICAgICAvLyBPZGQgdmFsdWVzCisgICAgICAgICAgICAgICAgQUFVRElPX1VOU1BFQ0lGSUVEIC0gMSwgQUFVRElPX1VOU1BFQ0lGSUVEICsgMSwgMTIzNCwgMTAwMDAwMDApLAorICAgICAgICAmQUF1ZGlvU3RyZWFtQnVpbGRlclNhbXBsaW5nUmF0ZVRlc3Q6OmdldFRlc3ROYW1lKTsKKworY2xhc3MgQUF1ZGlvU3RyZWFtQnVpbGRlckNoYW5uZWxDb3VudFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPGludDMyX3Q+IHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRUZXN0TmFtZShjb25zdCA6OnRlc3Rpbmc6OlRlc3RQYXJhbUluZm88aW50MzJfdD4mIGluZm8pIHsKKyAgICAgICAgcmV0dXJuIGluZm8ucGFyYW0gPj0gMCA/IHN0ZDo6dG9fc3RyaW5nKGluZm8ucGFyYW0pIDogIl8iICsgc3RkOjp0b19zdHJpbmcoLWluZm8ucGFyYW0pOworICAgIH0KKyAgcHJvdGVjdGVkOgorICAgIHN0YXRpYyBib29sIGlzVmFsaWRDaGFubmVsQ291bnQoaW50MzJfdCBjYykgeworICAgICAgICByZXR1cm4gY2MgPT0gQUFVRElPX1VOU1BFQ0lGSUVEIHx8IChjYyA+PSAxICYmIGNjIDw9IDgpOworICAgIH0KK307CisKK1RFU1RfUChBQXVkaW9TdHJlYW1CdWlsZGVyQ2hhbm5lbENvdW50VGVzdCwgb3BlblN0cmVhbSkgeworICAgIGlmICghZGV2aWNlU3VwcG9ydHNGZWF0dXJlKEZFQVRVUkVfUExBWUJBQ0spKSByZXR1cm47CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlciAqYWF1ZGlvQnVpbGRlciA9IG51bGxwdHI7CisgICAgY3JlYXRlX3N0cmVhbV9idWlsZGVyKCZhYXVkaW9CdWlsZGVyKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldENoYW5uZWxDb3VudChhYXVkaW9CdWlsZGVyLCBHZXRQYXJhbSgpKTsKKyAgICB0cnlfb3BlbmluZ19hdWRpb19zdHJlYW0oCisgICAgICAgICAgICBhYXVkaW9CdWlsZGVyLCBpc1ZhbGlkQ2hhbm5lbENvdW50KEdldFBhcmFtKCkpID8gRXhwZWN0OjpTVUNDRUVEIDogRXhwZWN0OjpGQUlMKTsKK30KKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQ0MsIEFBdWRpb1N0cmVhbUJ1aWxkZXJDaGFubmVsQ291bnRUZXN0LAorICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygKKyAgICAgICAgICAgICAgICAvLyBSZWFzb25hYmxlIHZhbHVlcworICAgICAgICAgICAgICAgIEFBVURJT19VTlNQRUNJRklFRCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwKKyAgICAgICAgICAgICAgICAvLyBPZGQgdmFsdWVzCisgICAgICAgICAgICAgICAgQUFVRElPX1VOU1BFQ0lGSUVEIC0gMSwgOSwgMTAwLCAxMDAwMDAwLCAxMDAwMDAwMCksCisgICAgICAgICZBQXVkaW9TdHJlYW1CdWlsZGVyQ2hhbm5lbENvdW50VGVzdDo6Z2V0VGVzdE5hbWUpOworCitjbGFzcyBBQXVkaW9TdHJlYW1CdWlsZGVyRm9ybWF0VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08YWF1ZGlvX2Zvcm1hdF90PiB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0VGVzdE5hbWUoY29uc3QgOjp0ZXN0aW5nOjpUZXN0UGFyYW1JbmZvPGFhdWRpb19mb3JtYXRfdD4mIGluZm8pIHsKKyAgICAgICAgcmV0dXJuIGluZm8ucGFyYW0gPj0gMCA/IHN0ZDo6dG9fc3RyaW5nKGluZm8ucGFyYW0pIDogIl8iICsgc3RkOjp0b19zdHJpbmcoLWluZm8ucGFyYW0pOworICAgIH0KKyAgcHJvdGVjdGVkOgorICAgIHN0YXRpYyBib29sIGlzVmFsaWRGb3JtYXQoYWF1ZGlvX2Zvcm1hdF90IGYpIHsKKyAgICAgICAgc3dpdGNoIChmKSB7CisgICAgICAgICAgICBjYXNlIEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQ6CisgICAgICAgICAgICBjYXNlIEFBVURJT19GT1JNQVRfUENNX0kxNjoKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK307CisKK1RFU1RfUChBQXVkaW9TdHJlYW1CdWlsZGVyRm9ybWF0VGVzdCwgb3BlblN0cmVhbSkgeworICAgIGlmICghZGV2aWNlU3VwcG9ydHNGZWF0dXJlKEZFQVRVUkVfUExBWUJBQ0spKSByZXR1cm47CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlciAqYWF1ZGlvQnVpbGRlciA9IG51bGxwdHI7CisgICAgY3JlYXRlX3N0cmVhbV9idWlsZGVyKCZhYXVkaW9CdWlsZGVyKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEZvcm1hdChhYXVkaW9CdWlsZGVyLCBHZXRQYXJhbSgpKTsKKyAgICB0cnlfb3BlbmluZ19hdWRpb19zdHJlYW0oCisgICAgICAgICAgICBhYXVkaW9CdWlsZGVyLCBpc1ZhbGlkRm9ybWF0KEdldFBhcmFtKCkpID8gRXhwZWN0OjpTVUNDRUVEIDogRXhwZWN0OjpGQUlMKTsKK30KKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoRiwgQUF1ZGlvU3RyZWFtQnVpbGRlckZvcm1hdFRlc3QsCisgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKAorICAgICAgICAgICAgICAgIC8vIFJlYXNvbmFibGUgdmFsdWVzCisgICAgICAgICAgICAgICAgQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRCwgQUFVRElPX0ZPUk1BVF9QQ01fSTE2LCBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCwKKyAgICAgICAgICAgICAgICAvLyBPZGQgdmFsdWVzCisgICAgICAgICAgICAgICAgQUFVRElPX0ZPUk1BVF9JTlZBTElELCBBQVVESU9fRk9STUFUX0lOVkFMSUQgLSAxLCAxMDAsIDEwMDAwMDAsIDEwMDAwMDAwKSwKKyAgICAgICAgJkFBdWRpb1N0cmVhbUJ1aWxkZXJGb3JtYXRUZXN0OjpnZXRUZXN0TmFtZSk7CisKK2NsYXNzIEFBdWRpb1N0cmVhbUJ1aWxkZXJTaGFyaW5nTW9kZVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPGFhdWRpb19zaGFyaW5nX21vZGVfdD4geworICBwdWJsaWM6CisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldFRlc3ROYW1lKGNvbnN0IDo6dGVzdGluZzo6VGVzdFBhcmFtSW5mbzxhYXVkaW9fc2hhcmluZ19tb2RlX3Q+JiBpbmZvKSB7CisgICAgICAgIHJldHVybiBpbmZvLnBhcmFtID49IDAgPyBzdGQ6OnRvX3N0cmluZyhpbmZvLnBhcmFtKSA6ICJfIiArIHN0ZDo6dG9fc3RyaW5nKC1pbmZvLnBhcmFtKTsKKyAgICB9CisgIHByb3RlY3RlZDoKKyAgICBzdGF0aWMgYm9vbCBpc1ZhbGlkU2hhcmluZ01vZGUoYWF1ZGlvX3NoYXJpbmdfbW9kZV90IGYpIHsKKyAgICAgICAgcmV0dXJuIGYgPT0gQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQgfHwgZiA9PSBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRTsKKyAgICB9Cit9OworCitURVNUX1AoQUF1ZGlvU3RyZWFtQnVpbGRlclNoYXJpbmdNb2RlVGVzdCwgb3BlblN0cmVhbSkgeworICAgIGlmICghZGV2aWNlU3VwcG9ydHNGZWF0dXJlKEZFQVRVUkVfUExBWUJBQ0spKSByZXR1cm47CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlciAqYWF1ZGlvQnVpbGRlciA9IG51bGxwdHI7CisgICAgY3JlYXRlX3N0cmVhbV9idWlsZGVyKCZhYXVkaW9CdWlsZGVyKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEZvcm1hdChhYXVkaW9CdWlsZGVyLCBHZXRQYXJhbSgpKTsKKyAgICB0cnlfb3BlbmluZ19hdWRpb19zdHJlYW0oCisgICAgICAgICAgICBhYXVkaW9CdWlsZGVyLCBpc1ZhbGlkU2hhcmluZ01vZGUoR2V0UGFyYW0oKSkgPyBFeHBlY3Q6OlNVQ0NFRUQgOiBFeHBlY3Q6OkZBSUwpOworfQorCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChTTSwgQUF1ZGlvU3RyZWFtQnVpbGRlclNoYXJpbmdNb2RlVGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgICAgICAgICAgLy8gUmVhc29uYWJsZSB2YWx1ZXMKKyAgICAgICAgICAgICAgICBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRCwgQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUsCisgICAgICAgICAgICAgICAgLy8gT2RkIHZhbHVlcworICAgICAgICAgICAgICAgIC0xLCAxMDAsIDEwMDAwMDAsIDEwMDAwMDAwKSwKKyAgICAgICAgJkFBdWRpb1N0cmVhbUJ1aWxkZXJTaGFyaW5nTW9kZVRlc3Q6OmdldFRlc3ROYW1lKTsKKworY2xhc3MgQUF1ZGlvU3RyZWFtQnVpbGRlckRpcmVjdGlvblRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPGFhdWRpb19kaXJlY3Rpb25fdD4geworICBwdWJsaWM6CisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldFRlc3ROYW1lKGNvbnN0IDo6dGVzdGluZzo6VGVzdFBhcmFtSW5mbzxhYXVkaW9fZGlyZWN0aW9uX3Q+JiBpbmZvKSB7CisgICAgICAgIHJldHVybiBpbmZvLnBhcmFtID49IDAgPyBzdGQ6OnRvX3N0cmluZyhpbmZvLnBhcmFtKSA6ICJfIiArIHN0ZDo6dG9fc3RyaW5nKC1pbmZvLnBhcmFtKTsKKyAgICB9CisgIHByb3RlY3RlZDoKKyAgICBzdGF0aWMgYm9vbCBpc1ZhbGlkU2hhcmluZ01vZGUoYWF1ZGlvX2RpcmVjdGlvbl90IGYpIHsKKyAgICAgICAgcmV0dXJuIGYgPT0gQUFVRElPX0RJUkVDVElPTl9PVVRQVVQgfHwgZiA9PSBBQVVESU9fRElSRUNUSU9OX0lOUFVUOworICAgIH0KK307CisKK1RFU1RfUChBQXVkaW9TdHJlYW1CdWlsZGVyRGlyZWN0aW9uVGVzdCwgb3BlblN0cmVhbSkgeworICAgIGlmIChHZXRQYXJhbSgpID09IEFBVURJT19ESVJFQ1RJT05fT1VUUFVUCisgICAgICAgICAgICAmJiAhZGV2aWNlU3VwcG9ydHNGZWF0dXJlKEZFQVRVUkVfUExBWUJBQ0spKSByZXR1cm47CisgICAgaWYgKEdldFBhcmFtKCkgPT0gQUFVRElPX0RJUkVDVElPTl9JTlBVVAorICAgICAgICAgICAgJiYgIWRldmljZVN1cHBvcnRzRmVhdHVyZShGRUFUVVJFX1JFQ09SRElORykpIHJldHVybjsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyICphYXVkaW9CdWlsZGVyID0gbnVsbHB0cjsKKyAgICBjcmVhdGVfc3RyZWFtX2J1aWxkZXIoJmFhdWRpb0J1aWxkZXIpOworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0Rm9ybWF0KGFhdWRpb0J1aWxkZXIsIEdldFBhcmFtKCkpOworICAgIHRyeV9vcGVuaW5nX2F1ZGlvX3N0cmVhbSgKKyAgICAgICAgICAgIGFhdWRpb0J1aWxkZXIsIGlzVmFsaWRTaGFyaW5nTW9kZShHZXRQYXJhbSgpKSA/IEV4cGVjdDo6U1VDQ0VFRCA6IEV4cGVjdDo6RkFJTCk7Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFNELCBBQXVkaW9TdHJlYW1CdWlsZGVyRGlyZWN0aW9uVGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgICAgICAgICAgLy8gUmVhc29uYWJsZSB2YWx1ZXMKKyAgICAgICAgICAgICAgICBBQVVESU9fRElSRUNUSU9OX09VVFBVVCwgQUFVRElPX0RJUkVDVElPTl9JTlBVVCwKKyAgICAgICAgICAgICAgICAvLyBPZGQgdmFsdWVzCisgICAgICAgICAgICAgICAgLTEsIDEwMCwgMTAwMDAwMCwgMTAwMDAwMDApLAorICAgICAgICAmQUF1ZGlvU3RyZWFtQnVpbGRlckRpcmVjdGlvblRlc3Q6OmdldFRlc3ROYW1lKTsKKworY2xhc3MgQUF1ZGlvU3RyZWFtQnVpbGRlckJ1ZmZlckNhcGFjaXR5VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08aW50MzJfdD4geworICBwdWJsaWM6CisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldFRlc3ROYW1lKGNvbnN0IDo6dGVzdGluZzo6VGVzdFBhcmFtSW5mbzxpbnQzMl90PiYgaW5mbykgeworICAgICAgICByZXR1cm4gaW5mby5wYXJhbSA+PSAwID8gc3RkOjp0b19zdHJpbmcoaW5mby5wYXJhbSkgOiAiXyIgKyBzdGQ6OnRvX3N0cmluZygtaW5mby5wYXJhbSk7CisgICAgfQorICBwcm90ZWN0ZWQ6CisgICAgLy8gVGhlcmUgaXMgbm8gaGFyZCBkZWZpbmVkIGxpbWl0LCB0aGUgYWN0dWFsIG1heGltdW0gY2FwYWNpdHkgZGVwZW5kcworICAgIC8vIG9uIHRoZSBpbXBsZW1lbnRhdGlvbi4KKyAgICBzdGF0aWMgYm9vbCBpc1ZhbGlkQ2FwYWNpdHkoaW50MzJfdCBiYykgeworICAgICAgICByZXR1cm4gYmMgPT0gQUFVRElPX1VOU1BFQ0lGSUVEIHx8IGJjID49IDA7CisgICAgfQorfTsKKworVEVTVF9QKEFBdWRpb1N0cmVhbUJ1aWxkZXJCdWZmZXJDYXBhY2l0eVRlc3QsIG9wZW5TdHJlYW0pIHsKKyAgICBpZiAoIWRldmljZVN1cHBvcnRzRmVhdHVyZShGRUFUVVJFX1BMQVlCQUNLKSkgcmV0dXJuOworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXIgKmFhdWRpb0J1aWxkZXIgPSBudWxscHRyOworICAgIGNyZWF0ZV9zdHJlYW1fYnVpbGRlcigmYWF1ZGlvQnVpbGRlcik7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRCdWZmZXJDYXBhY2l0eUluRnJhbWVzKGFhdWRpb0J1aWxkZXIsIEdldFBhcmFtKCkpOworICAgIHRyeV9vcGVuaW5nX2F1ZGlvX3N0cmVhbSgKKyAgICAgICAgICAgIGFhdWRpb0J1aWxkZXIsIGlzVmFsaWRDYXBhY2l0eShHZXRQYXJhbSgpKSA/IEV4cGVjdDo6U1VDQ0VFRCA6IEV4cGVjdDo6RkFJTCk7Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKEJDLCBBQXVkaW9TdHJlYW1CdWlsZGVyQnVmZmVyQ2FwYWNpdHlUZXN0LAorICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygKKyAgICAgICAgICAgICAgICAvLyBSZWFzb25hYmxlIHZhbHVlcyB0aGF0IHNob3VsZCBub3QgZmFpbAorICAgICAgICAgICAgICAgIEFBVURJT19VTlNQRUNJRklFRCwgOCAqIDE5MiwgMiAqIDEwMjQsCisgICAgICAgICAgICAgICAgLy8gT2RkIHZhbHVlcworICAgICAgICAgICAgICAgIEFBVURJT19VTlNQRUNJRklFRCAtIDEpLAorICAgICAgICAmQUF1ZGlvU3RyZWFtQnVpbGRlckJ1ZmZlckNhcGFjaXR5VGVzdDo6Z2V0VGVzdE5hbWUpOworCitjbGFzcyBBQXVkaW9TdHJlYW1CdWlsZGVyUGVyZk1vZGVUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90PiB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0VGVzdE5hbWUoY29uc3QgOjp0ZXN0aW5nOjpUZXN0UGFyYW1JbmZvPGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3Q+JiBpbmZvKSB7CisgICAgICAgIHJldHVybiBpbmZvLnBhcmFtID49IDAgPyBzdGQ6OnRvX3N0cmluZyhpbmZvLnBhcmFtKSA6ICJfIiArIHN0ZDo6dG9fc3RyaW5nKC1pbmZvLnBhcmFtKTsKKyAgICB9CisgIHByb3RlY3RlZDoKKyAgICBzdGF0aWMgYm9vbCBpc1ZhbGlkUGVyZk1vZGUoYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBwbSkgeworICAgICAgICBzd2l0Y2ggKHBtKSB7CisgICAgICAgICAgICBjYXNlIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkU6CisgICAgICAgICAgICBjYXNlIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX1BPV0VSX1NBVklORzoKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1k6CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK307CisKK1RFU1RfUChBQXVkaW9TdHJlYW1CdWlsZGVyUGVyZk1vZGVUZXN0LCBvcGVuU3RyZWFtKSB7CisgICAgaWYgKCFkZXZpY2VTdXBwb3J0c0ZlYXR1cmUoRkVBVFVSRV9QTEFZQkFDSykpIHJldHVybjsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyICphYXVkaW9CdWlsZGVyID0gbnVsbHB0cjsKKyAgICBjcmVhdGVfc3RyZWFtX2J1aWxkZXIoJmFhdWRpb0J1aWxkZXIpOworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0UGVyZm9ybWFuY2VNb2RlKGFhdWRpb0J1aWxkZXIsIEdldFBhcmFtKCkpOworICAgIHRyeV9vcGVuaW5nX2F1ZGlvX3N0cmVhbSgKKyAgICAgICAgICAgIGFhdWRpb0J1aWxkZXIsIGlzVmFsaWRQZXJmTW9kZShHZXRQYXJhbSgpKSA/IEV4cGVjdDo6U1VDQ0VFRCA6IEV4cGVjdDo6RkFJTCk7Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFBNLCBBQXVkaW9TdHJlYW1CdWlsZGVyUGVyZk1vZGVUZXN0LAorICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygKKyAgICAgICAgICAgICAgICAvLyBSZWFzb25hYmxlIHZhbHVlcworICAgICAgICAgICAgICAgIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkUsCisgICAgICAgICAgICAgICAgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfUE9XRVJfU0FWSU5HLAorICAgICAgICAgICAgICAgIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZLAorICAgICAgICAgICAgICAgIC8vIE9kZCB2YWx1ZXMKKyAgICAgICAgICAgICAgICBBQVVESU9fVU5TUEVDSUZJRUQgLSAxLCBBQVVESU9fVU5TUEVDSUZJRUQsIDEwMCwgMTAwMDAwMCwgMTAwMDAwMDApLAorICAgICAgICAmQUF1ZGlvU3RyZWFtQnVpbGRlclBlcmZNb2RlVGVzdDo6Z2V0VGVzdE5hbWUpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbmF0aXZlbWVkaWEvYWF1ZGlvL2puaS90ZXN0X3Nlc3Npb25faWQuY3BwIGIvdGVzdHMvdGVzdHMvbmF0aXZlbWVkaWEvYWF1ZGlvL2puaS90ZXN0X3Nlc3Npb25faWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZGU2ZTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9uYXRpdmVtZWRpYS9hYXVkaW8vam5pL3Rlc3Rfc2Vzc2lvbl9pZC5jcHAKQEAgLTAsMCArMSwxNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBUZXN0IEFBdWRpbyBTZXNzaW9uSWQsIHdoaWNoIGlzIHVzZWQgdG8gYXNzb2NpYXRlIEVmZmVjdHMgd2l0aCBhIHN0cmVhbQorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSAidGVzdF9hYXVkaW8uaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorCitjb25zdGV4cHIgaW50IGtOdW1GcmFtZXMgPSAyNTY7Citjb25zdGV4cHIgaW50IGtDaGFubmVsQ291bnQgPSAyOworCisvLyBUZXN0IEFBVURJT19TRVNTSU9OX0lEX05PTkUgZGVmYXVsdAorc3RhdGljIHZvaWQgY2hlY2tTZXNzaW9uSWROb25lKGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgcGVyZk1vZGUpIHsKKyAgICBpZiAoIWRldmljZVN1cHBvcnRzRmVhdHVyZShGRUFUVVJFX1BMQVlCQUNLKSkgcmV0dXJuOworCisgICAgZmxvYXQgKmJ1ZmZlciA9IG5ldyBmbG9hdFtrTnVtRnJhbWVzICoga0NoYW5uZWxDb3VudF07CisKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyICphYXVkaW9CdWlsZGVyID0gbnVsbHB0cjsKKworICAgIEFBdWRpb1N0cmVhbSAqYWF1ZGlvU3RyZWFtMSA9IG51bGxwdHI7CisgICAgaW50MzJfdCAgICAgICBzZXNzaW9uSWQxID0gMDsKKworICAgIC8vIFVzZSBhbiBBQXVkaW9TdHJlYW1CdWlsZGVyIHRvIGNvbnRhaW4gcmVxdWVzdGVkIHBhcmFtZXRlcnMuCisgICAgQVNTRVJUX0VRKEFBVURJT19PSywgQUF1ZGlvX2NyZWF0ZVN0cmVhbUJ1aWxkZXIoJmFhdWRpb0J1aWxkZXIpKTsKKworICAgIC8vIFJlcXVlc3Qgc3RyZWFtIHByb3BlcnRpZXMuCisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRQZXJmb3JtYW5jZU1vZGUoYWF1ZGlvQnVpbGRlciwgcGVyZk1vZGUpOworCisgICAgLy8gQ3JlYXRlIGFuIEFBdWRpb1N0cmVhbSB1c2luZyB0aGUgQnVpbGRlci4KKyAgICBBU1NFUlRfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oYWF1ZGlvQnVpbGRlciwgJmFhdWRpb1N0cmVhbTEpKTsKKworICAgIC8vIFNpbmNlIHdlIGRpZCBub3QgcmVxdWVzdCBvciBzcGVjaWZ5IGEgU2Vzc2lvbklELCB3ZSBzaG91bGQgZ2V0IE5PTkUKKyAgICBzZXNzaW9uSWQxID0gQUF1ZGlvU3RyZWFtX2dldFNlc3Npb25JZChhYXVkaW9TdHJlYW0xKTsKKyAgICBBU1NFUlRfRVEoQUFVRElPX1NFU1NJT05fSURfTk9ORSwgc2Vzc2lvbklkMSk7CisKKyAgICBBU1NFUlRfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KGFhdWRpb1N0cmVhbTEpKTsKKworICAgIEFTU0VSVF9FUShrTnVtRnJhbWVzLCBBQXVkaW9TdHJlYW1fd3JpdGUoYWF1ZGlvU3RyZWFtMSwgYnVmZmVyLCBrTnVtRnJhbWVzLCBOQU5PU19QRVJfU0VDT05EKSk7CisKKyAgICBFWFBFQ1RfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0b3AoYWF1ZGlvU3RyZWFtMSkpOworCisgICAgRVhQRUNUX0VRKEFBVURJT19PSywgQUF1ZGlvU3RyZWFtX2Nsb3NlKGFhdWRpb1N0cmVhbTEpKTsKKyAgICBkZWxldGVbXSBidWZmZXI7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9kZWxldGUoYWF1ZGlvQnVpbGRlcik7Cit9CisKK1RFU1QodGVzdF9zZXNzaW9uX2lkLCBhYXVkaW9fc2Vzc2lvbl9pZF9ub25lX3BlcmZub25lKSB7CisgICAgY2hlY2tTZXNzaW9uSWROb25lKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkUpOworfQorCitURVNUKHRlc3Rfc2Vzc2lvbl9pZCwgYWF1ZGlvX3Nlc3Npb25faWRfbm9uZV9sb3dsYXQpIHsKKyAgICBjaGVja1Nlc3Npb25JZE5vbmUoQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1kpOworfQorCisvLyBUZXN0IEFBVURJT19TRVNTSU9OX0lEX0FMTE9DQVRFCitzdGF0aWMgdm9pZCBjaGVja1Nlc3Npb25JZEFsbG9jYXRlKGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgcGVyZk1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24pIHsKKyAgICAvLyBTaW5jZSB0aGlzIHRlc3QgY3JlYXRlcyBzdHJlYW1zIGluIGJvdGggZGlyZWN0aW9ucywgaXQgY2FuJ3Qgd29yaworICAgIC8vIGlmIGVpdGhlciBvZiB0aGVtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGRldmljZS4KKyAgICBpZiAoIWRldmljZVN1cHBvcnRzRmVhdHVyZShGRUFUVVJFX1JFQ09SRElORykKKyAgICAgICAgICAgIHx8ICFkZXZpY2VTdXBwb3J0c0ZlYXR1cmUoRkVBVFVSRV9QTEFZQkFDSykpIHJldHVybjsKKworICAgIGZsb2F0ICpidWZmZXIgPSBuZXcgZmxvYXRba051bUZyYW1lcyAqIGtDaGFubmVsQ291bnRdOworCisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlciAqYWF1ZGlvQnVpbGRlciA9IG51bGxwdHI7CisKKyAgICBBQXVkaW9TdHJlYW0gKmFhdWRpb1N0cmVhbTEgPSBudWxscHRyOworICAgIGludDMyX3QgICAgICAgc2Vzc2lvbklkMSA9IDA7CisgICAgQUF1ZGlvU3RyZWFtICphYXVkaW9TdHJlYW0yID0gbnVsbHB0cjsKKyAgICBpbnQzMl90ICAgICAgIHNlc3Npb25JZDIgPSAwOworCisgICAgLy8gVXNlIGFuIEFBdWRpb1N0cmVhbUJ1aWxkZXIgdG8gY29udGFpbiByZXF1ZXN0ZWQgcGFyYW1ldGVycy4KKyAgICBBU1NFUlRfRVEoQUFVRElPX09LLCBBQXVkaW9fY3JlYXRlU3RyZWFtQnVpbGRlcigmYWF1ZGlvQnVpbGRlcikpOworCisgICAgLy8gUmVxdWVzdCBzdHJlYW0gcHJvcGVydGllcy4KKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFBlcmZvcm1hbmNlTW9kZShhYXVkaW9CdWlsZGVyLCBwZXJmTW9kZSk7CisgICAgLy8gVGhpcyBzdHJlYW0gY291bGQgYmUgaW5wdXQgb3Igb3V0cHV0LgorICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RGlyZWN0aW9uKGFhdWRpb0J1aWxkZXIsIGRpcmVjdGlvbik7CisKKyAgICAvLyBBc2sgQUF1ZGlvIHRvIGFsbG9jYXRlIGEgU2Vzc2lvbiBJRC4KKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNlc3Npb25JZChhYXVkaW9CdWlsZGVyLCBBQVVESU9fU0VTU0lPTl9JRF9BTExPQ0FURSk7CisKKyAgICAvLyBDcmVhdGUgYW4gQUF1ZGlvU3RyZWFtIHVzaW5nIHRoZSBCdWlsZGVyLgorICAgIEFTU0VSVF9FUShBQVVESU9fT0ssIEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbShhYXVkaW9CdWlsZGVyLCAmYWF1ZGlvU3RyZWFtMSkpOworCisgICAgLy8gR2V0IHRoZSBhbGxvY2F0ZWQgSUQgZnJvbSB0aGUgc3RyZWFtLgorICAgIHNlc3Npb25JZDEgPSBBQXVkaW9TdHJlYW1fZ2V0U2Vzc2lvbklkKGFhdWRpb1N0cmVhbTEpOworCisgICAgLy8gQ2hlY2sgZm9yIGludmFsaWQgc2Vzc2lvbiBJRHMuCisgICAgQVNTRVJUX05FKEFBVURJT19TRVNTSU9OX0lEX05PTkUsIHNlc3Npb25JZDEpOworICAgIEFTU0VSVF9ORShBQVVESU9fU0VTU0lPTl9JRF9BTExPQ0FURSwgc2Vzc2lvbklkMSk7CisKKyAgICBBU1NFUlRfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KGFhdWRpb1N0cmVhbTEpKTsKKworICAgIGlmIChkaXJlY3Rpb24gPT0gQUFVRElPX0RJUkVDVElPTl9JTlBVVCkgeworICAgICAgICBBU1NFUlRfRVEoa051bUZyYW1lcywgQUF1ZGlvU3RyZWFtX3JlYWQoYWF1ZGlvU3RyZWFtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwga051bUZyYW1lcywgTkFOT1NfUEVSX1NFQ09ORCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVF9FUShrTnVtRnJhbWVzLCBBQXVkaW9TdHJlYW1fd3JpdGUoYWF1ZGlvU3RyZWFtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBrTnVtRnJhbWVzLCBOQU5PU19QRVJfU0VDT05EKSk7CisgICAgfQorCisgICAgRVhQRUNUX0VRKEFBVURJT19PSywgQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdG9wKGFhdWRpb1N0cmVhbTEpKTsKKworICAgIC8vIE5vdyBvcGVuIGEgc2Vjb25kIHN0cmVhbSB1c2luZyB0aGUgc2FtZSBzZXNzaW9uIElELiA9PT09PT09PT09PT09PT09PT0KKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNlc3Npb25JZChhYXVkaW9CdWlsZGVyLCBzZXNzaW9uSWQxKTsKKworICAgIC8vIFJldmVyc2UgZGlyZWN0aW9uIGZvciBzZWNvbmQgc3RyZWFtLgorICAgIGFhdWRpb19kaXJlY3Rpb25fdCBvdGhlckRpcmVjdGlvbiA9IChkaXJlY3Rpb24gPT0gQUFVRElPX0RJUkVDVElPTl9PVVRQVVQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBBQVVESU9fRElSRUNUSU9OX0lOUFVUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBBQVVESU9fRElSRUNUSU9OX09VVFBVVDsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldERpcmVjdGlvbihhYXVkaW9CdWlsZGVyLCBvdGhlckRpcmVjdGlvbik7CisKKyAgICAvLyBDcmVhdGUgYW4gQUF1ZGlvU3RyZWFtIHVzaW5nIHRoZSBCdWlsZGVyLgorICAgIEFTU0VSVF9FUShBQVVESU9fT0ssIEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbShhYXVkaW9CdWlsZGVyLCAmYWF1ZGlvU3RyZWFtMikpOworCisgICAgLy8gR2V0IHRoZSBhbGxvY2F0ZWQgSUQgZnJvbSB0aGUgc3RyZWFtLgorICAgIC8vIEl0IHNob3VsZCBtYXRjaCB0aGUgSUQgdGhhdCB3ZSBzZXQgaXQgdG8gaW4gdGhlIGJ1aWxkZXIuCisgICAgc2Vzc2lvbklkMiA9IEFBdWRpb1N0cmVhbV9nZXRTZXNzaW9uSWQoYWF1ZGlvU3RyZWFtMik7CisgICAgQVNTRVJUX0VRKHNlc3Npb25JZDEsIHNlc3Npb25JZDIpOworCisgICAgQVNTRVJUX0VRKEFBVURJT19PSywgQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdGFydChhYXVkaW9TdHJlYW0yKSk7CisKKyAgICBpZiAob3RoZXJEaXJlY3Rpb24gPT0gQUFVRElPX0RJUkVDVElPTl9JTlBVVCkgeworICAgICAgICBBU1NFUlRfRVEoa051bUZyYW1lcywgQUF1ZGlvU3RyZWFtX3JlYWQoYWF1ZGlvU3RyZWFtMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsIGtOdW1GcmFtZXMsIE5BTk9TX1BFUl9TRUNPTkQpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBU1NFUlRfRVEoa051bUZyYW1lcywgQUF1ZGlvU3RyZWFtX3dyaXRlKGFhdWRpb1N0cmVhbTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBrTnVtRnJhbWVzLCBOQU5PU19QRVJfU0VDT05EKSk7CisgICAgfQorCisgICAgRVhQRUNUX0VRKEFBVURJT19PSywgQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdG9wKGFhdWRpb1N0cmVhbTIpKTsKKworICAgIEVYUEVDVF9FUShBQVVESU9fT0ssIEFBdWRpb1N0cmVhbV9jbG9zZShhYXVkaW9TdHJlYW0yKSk7CisKKworICAgIEVYUEVDVF9FUShBQVVESU9fT0ssIEFBdWRpb1N0cmVhbV9jbG9zZShhYXVkaW9TdHJlYW0xKSk7CisgICAgZGVsZXRlW10gYnVmZmVyOworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfZGVsZXRlKGFhdWRpb0J1aWxkZXIpOworfQorCitURVNUKHRlc3Rfc2Vzc2lvbl9pZCwgYWF1ZGlvX3Nlc3Npb25faWRfYWxsb2NfcGVyZm5vbmVfaW4pIHsKKyAgICBjaGVja1Nlc3Npb25JZEFsbG9jYXRlKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkUsIEFBVURJT19ESVJFQ1RJT05fSU5QVVQpOworfQorVEVTVCh0ZXN0X3Nlc3Npb25faWQsIGFhdWRpb19zZXNzaW9uX2lkX2FsbG9jX3BlcmZub25lX291dCkgeworICAgIGNoZWNrU2Vzc2lvbklkQWxsb2NhdGUoQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORSwgQUFVRElPX0RJUkVDVElPTl9PVVRQVVQpOworfQorCitURVNUKHRlc3Rfc2Vzc2lvbl9pZCwgYWF1ZGlvX3Nlc3Npb25faWRfYWxsb2NfbG93bGF0X2luKSB7CisgICAgY2hlY2tTZXNzaW9uSWRBbGxvY2F0ZShBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSwgQUFVRElPX0RJUkVDVElPTl9JTlBVVCk7Cit9CitURVNUKHRlc3Rfc2Vzc2lvbl9pZCwgYWF1ZGlvX3Nlc3Npb25faWRfYWxsb2NfbG93bGF0X291dCkgeworICAgIGNoZWNrU2Vzc2lvbklkQWxsb2NhdGUoQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1ksIEFBVURJT19ESVJFQ1RJT05fT1VUUFVUKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL25hdGl2ZW1lZGlhL2FhdWRpby9qbmkvdXRpbHMuY3BwIGIvdGVzdHMvdGVzdHMvbmF0aXZlbWVkaWEvYWF1ZGlvL2puaS91dGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg0MzYxNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL25hdGl2ZW1lZGlhL2FhdWRpby9qbmkvdXRpbHMuY3BwCkBAIC0wLDAgKzEsMjE3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkFBdWRpb1Rlc3QiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8YW5kcm9pZC9sb2cuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSAidGVzdF9hYXVkaW8uaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorCitpbnQ2NF90IGdldE5hbm9zZWNvbmRzKGNsb2NraWRfdCBjbG9ja0lkKSB7CisgICAgc3RydWN0IHRpbWVzcGVjIHRpbWU7CisgICAgaW50IHJlc3VsdCA9IGNsb2NrX2dldHRpbWUoY2xvY2tJZCwgJnRpbWUpOworICAgIGlmIChyZXN1bHQgPCAwKSB7CisgICAgICAgIHJldHVybiAtZXJybm87CisgICAgfQorICAgIHJldHVybiAodGltZS50dl9zZWMgKiBOQU5PU19QRVJfU0VDT05EKSArIHRpbWUudHZfbnNlYzsKK30KKworY29uc3QgY2hhciogcGVyZm9ybWFuY2VNb2RlVG9TdHJpbmcoYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBtb2RlKSB7CisgICAgc3dpdGNoIChtb2RlKSB7CisgICAgICAgIGNhc2UgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORTogcmV0dXJuICJERUZBVUxUIjsKKyAgICAgICAgY2FzZSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9QT1dFUl9TQVZJTkc6IHJldHVybiAiUE9XRVJfU0FWSU5HIjsKKyAgICAgICAgY2FzZSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWTogcmV0dXJuICJMT1dfTEFURU5DWSI7CisgICAgfQorICAgIHJldHVybiAiVU5LTk9XTiI7Cit9CisKK2NvbnN0IGNoYXIqIHNoYXJpbmdNb2RlVG9TdHJpbmcoYWF1ZGlvX3NoYXJpbmdfbW9kZV90IG1vZGUpIHsKKyAgICBzd2l0Y2ggKG1vZGUpIHsKKyAgICAgICAgY2FzZSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRDogcmV0dXJuICJTSEFSRUQiOworICAgICAgICBjYXNlIEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFOiByZXR1cm4gIkVYQ0xVU0lWRSI7CisgICAgfQorICAgIHJldHVybiAiVU5LTk9XTiI7Cit9CisKKy8vIFJ1bnMgInBtIGxpc3QgZmVhdHVyZXMiIGFuZCBhdHRlbXB0cyB0byBmaW5kIHRoZSBzcGVjaWZpZWQgZmVhdHVyZSBpbiBpdHMgb3V0cHV0LgorYm9vbCBkZXZpY2VTdXBwb3J0c0ZlYXR1cmUoY29uc3QgY2hhciogZmVhdHVyZSkgeworICAgIGJvb2wgaGFzRmVhdHVyZSA9IGZhbHNlOworICAgIEZJTEUgKnAgPSBwb3BlbigiL3N5c3RlbS9iaW4vcG0gbGlzdCBmZWF0dXJlcyIsICJyZSIpOworICAgIGlmIChwKSB7CisgICAgICBjaGFyKiBsaW5lID0gTlVMTDsKKyAgICAgIHNpemVfdCBsZW4gPSAwOworICAgICAgd2hpbGUgKGdldGxpbmUoJmxpbmUsICZsZW4sIHApID4gMCkgeworICAgICAgICAgIGlmIChzdHJzdHIobGluZSwgZmVhdHVyZSkpIHsKKyAgICAgICAgICAgICAgaGFzRmVhdHVyZSA9IHRydWU7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHBjbG9zZShwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX0ZBVEFMLCBMT0dfVEFHLCAicG9wZW4gZmFpbGVkOiAlZCIsIGVycm5vKTsKKyAgICAgICAgX2V4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICB9CisgICAgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19JTkZPLCBMT0dfVEFHLCAiRmVhdHVyZSAlczogJXNzdXBwb3J0ZWQiLAorICAgICAgICAgICAgZmVhdHVyZSwgaGFzRmVhdHVyZSA/ICIiIDogIm5vdCAiKTsKKyAgICByZXR1cm4gaGFzRmVhdHVyZTsKK30KKworLy8gVGhlc2UgcGVyaW9kcyBhcmUgcXVpdGUgZ2VuZXJvdXMuIFRoZXkgYXJlIG5vdCBkZXNpZ25lZCB0byBwdXQKKy8vIGFueSByZXN0cmljdGlvbnMgb24gdGhlIGltcGxlbWVudGF0aW9uLCBidXQgb25seSB0byBlbnN1cmUgc2FuaXR5LgorLy8gVXNlIGludDY0X3QgYmVjYXVzZSA5NjAwMCAqIDMwMDAwIGlzIGNsb3NlIHRvIGludDMyX3QgbGltaXRzLgorY29uc3Qgc3RkOjptYXA8YWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCwgaW50NjRfdD4gU3RyZWFtQnVpbGRlckhlbHBlcjo6c01heEZyYW1lc1BlckJ1cnN0TXMgPQoreyB7IEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkUsIDEyOCB9LAorICB7IEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX1BPV0VSX1NBVklORywgMzAgKiAxMDAwIH0sCisgIHsgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1ksIDQwIH0gfTsKKworU3RyZWFtQnVpbGRlckhlbHBlcjo6U3RyZWFtQnVpbGRlckhlbHBlcigKKyAgICAgICAgYWF1ZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgaW50MzJfdCBzYW1wbGVSYXRlLAorICAgICAgICBpbnQzMl90IGNoYW5uZWxDb3VudCwgYWF1ZGlvX2Zvcm1hdF90IGRhdGFGb3JtYXQsCisgICAgICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCBzaGFyaW5nTW9kZSwgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBwZXJmTW9kZSkKKyAgICAgICAgOiBtRGlyZWN0aW9ue2RpcmVjdGlvbn0sCisgICAgICAgICAgbVJlcXVlc3RlZHtzYW1wbGVSYXRlLCBjaGFubmVsQ291bnQsIGRhdGFGb3JtYXQsIHNoYXJpbmdNb2RlLCBwZXJmTW9kZX0sCisgICAgICAgICAgbUFjdHVhbHswLCAwLCBBQVVESU9fRk9STUFUX0lOVkFMSUQsIC0xLCAtMX0sIG1GcmFtZXNQZXJCdXJzdHstMX0sCisgICAgICAgICAgbUJ1aWxkZXJ7bnVsbHB0cn0sIG1TdHJlYW17bnVsbHB0cn0ge30KKworU3RyZWFtQnVpbGRlckhlbHBlcjo6flN0cmVhbUJ1aWxkZXJIZWxwZXIoKSB7CisgICAgY2xvc2UoKTsKK30KKwordm9pZCBTdHJlYW1CdWlsZGVySGVscGVyOjppbml0QnVpbGRlcigpIHsKKyAgICBBU1NFUlRfRVEoMVUsIHNNYXhGcmFtZXNQZXJCdXJzdE1zLmNvdW50KG1SZXF1ZXN0ZWQucGVyZk1vZGUpKTsKKworICAgIC8vIFVzZSBhbiBBQXVkaW9TdHJlYW1CdWlsZGVyIHRvIGRlZmluZSB0aGUgc3RyZWFtLgorICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9fY3JlYXRlU3RyZWFtQnVpbGRlcigmbUJ1aWxkZXIpOworICAgIEFTU0VSVF9FUShBQVVESU9fT0ssIHJlc3VsdCk7CisgICAgQVNTRVJUX1RSVUUobUJ1aWxkZXIgIT0gbnVsbHB0cik7CisKKyAgICAvLyBSZXF1ZXN0IHN0cmVhbSBwcm9wZXJ0aWVzLgorICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RGV2aWNlSWQobUJ1aWxkZXIsIEFBVURJT19VTlNQRUNJRklFRCk7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXREaXJlY3Rpb24obUJ1aWxkZXIsIG1EaXJlY3Rpb24pOworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0U2FtcGxlUmF0ZShtQnVpbGRlciwgbVJlcXVlc3RlZC5zYW1wbGVSYXRlKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldENoYW5uZWxDb3VudChtQnVpbGRlciwgbVJlcXVlc3RlZC5jaGFubmVsQ291bnQpOworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0Rm9ybWF0KG1CdWlsZGVyLCBtUmVxdWVzdGVkLmRhdGFGb3JtYXQpOworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0U2hhcmluZ01vZGUobUJ1aWxkZXIsIG1SZXF1ZXN0ZWQuc2hhcmluZ01vZGUpOworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0UGVyZm9ybWFuY2VNb2RlKG1CdWlsZGVyLCBtUmVxdWVzdGVkLnBlcmZNb2RlKTsKK30KKworLy8gTmVlZHMgdG8gYmUgYSAndm9pZCcgZnVuY3Rpb24gZHVlIHRvIEFTU0VSVCByZXF1aXJlbWVudHMuCit2b2lkIFN0cmVhbUJ1aWxkZXJIZWxwZXI6OmNyZWF0ZUFuZFZlcmlmeVN0cmVhbShib29sICpzdWNjZXNzKSB7CisgICAgKnN1Y2Nlc3MgPSBmYWxzZTsKKworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0obUJ1aWxkZXIsICZtU3RyZWFtKTsKKyAgICBpZiAobVJlcXVlc3RlZC5zaGFyaW5nTW9kZSA9PSBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSAmJiByZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgIF9fYW5kcm9pZF9sb2dfd3JpdGUoQU5EUk9JRF9MT0dfV0FSTiwgTE9HX1RBRywgIkNvdWxkIG5vdCBvcGVuIGEgc3RyZWFtIGluIEVYQ0xVU0lWRSBtb2RlIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX0VRKEFBVURJT19PSywgcmVzdWx0KTsKKyAgICBBU1NFUlRfVFJVRShtU3RyZWFtICE9IG51bGxwdHIpOworICAgIEFTU0VSVF9FUShBQVVESU9fU1RSRUFNX1NUQVRFX09QRU4sIEFBdWRpb1N0cmVhbV9nZXRTdGF0ZShtU3RyZWFtKSk7CisgICAgQVNTRVJUX0VRKG1EaXJlY3Rpb24sIEFBdWRpb1N0cmVhbV9nZXREaXJlY3Rpb24obVN0cmVhbSkpOworCisgICAgbUFjdHVhbC5zaGFyaW5nTW9kZSA9IEFBdWRpb1N0cmVhbV9nZXRTaGFyaW5nTW9kZShtU3RyZWFtKTsKKyAgICBpZiAobUFjdHVhbC5zaGFyaW5nTW9kZSAhPSBtUmVxdWVzdGVkLnNoYXJpbmdNb2RlKSB7CisgICAgICAgIC8vIFNpbmNlIHdlIGFyZSBjb3ZlcmluZyBhbGwgcG9zc2libGUgdmFsdWVzLCB0aGUgImFjdHVhbCIgbW9kZQorICAgICAgICAvLyB3aWxsIGFsc28gYmUgdGVzdGVkLCBzbyBubyBuZWVkIHRvIHJ1biB0aGUgc2FtZSB0ZXN0IHR3aWNlLgorICAgICAgICBfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX1dBUk4sIExPR19UQUcsICJTaGFyaW5nIG1vZGUgJXMgaXMgbm90IGF2YWlsYWJsZSIsCisgICAgICAgICAgICAgICAgc2hhcmluZ01vZGVUb1N0cmluZyhtUmVxdWVzdGVkLnNoYXJpbmdNb2RlKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBDaGVjayB0byBzZWUgd2hhdCBraW5kIG9mIHN0cmVhbSB3ZSBhY3R1YWxseSBnb3QuCisgICAgbUFjdHVhbC5zYW1wbGVSYXRlID0gQUF1ZGlvU3RyZWFtX2dldFNhbXBsZVJhdGUobVN0cmVhbSk7CisgICAgQVNTRVJUX0dFKG1BY3R1YWwuc2FtcGxlUmF0ZSwgNDQxMDApOworICAgIEFTU0VSVF9MRShtQWN0dWFsLnNhbXBsZVJhdGUsIDk2MDAwKTsgLy8gVE9ETyB3aGF0IGlzIG1pbi9tYXg/CisKKyAgICBtQWN0dWFsLmNoYW5uZWxDb3VudCA9IEFBdWRpb1N0cmVhbV9nZXRDaGFubmVsQ291bnQobVN0cmVhbSk7CisgICAgQVNTRVJUX0dFKG1BY3R1YWwuY2hhbm5lbENvdW50LCAxKTsKKyAgICBBU1NFUlRfTEUobUFjdHVhbC5jaGFubmVsQ291bnQsIDE2KTsgLy8gVE9ETyB3aGF0IGlzIG1pbi9tYXg/CisKKyAgICBtQWN0dWFsLmRhdGFGb3JtYXQgPSBBQXVkaW9TdHJlYW1fZ2V0Rm9ybWF0KG1TdHJlYW0pOworICAgIEFTU0VSVF9FUShBQVVESU9fRk9STUFUX1BDTV9JMTYsIG1BY3R1YWwuZGF0YUZvcm1hdCk7CisKKyAgICBtQWN0dWFsLnBlcmZNb2RlID0gQUF1ZGlvU3RyZWFtX2dldFBlcmZvcm1hbmNlTW9kZShtU3RyZWFtKTsKKyAgICBpZiAobVJlcXVlc3RlZC5wZXJmTW9kZSAhPSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FCisgICAgICAgICAgICAmJiBtUmVxdWVzdGVkLnBlcmZNb2RlICE9IG1BY3R1YWwucGVyZk1vZGUpIHsKKyAgICAgICAgLy8gU2luY2Ugd2UgYXJlIGNvdmVyaW5nIGFsbCBwb3NzaWJsZSB2YWx1ZXMsIHRoZSAiYWN0dWFsIiBtb2RlCisgICAgICAgIC8vIHdpbGwgYWxzbyBiZSB0ZXN0ZWQsIHNvIG5vIG5lZWQgdG8gcnVuIHRoZSBzYW1lIHRlc3QgdHdpY2UuCisgICAgICAgIF9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfV0FSTiwgTE9HX1RBRywgIlBlcmZvcm1hbmNlIG1vZGUgJXMgaXMgbm90IGF2YWlsYWJsZSIsCisgICAgICAgICAgICAgICAgcGVyZm9ybWFuY2VNb2RlVG9TdHJpbmcobVJlcXVlc3RlZC5zaGFyaW5nTW9kZSkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbUZyYW1lc1BlckJ1cnN0ID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1BlckJ1cnN0KG1TdHJlYW0pOworICAgIEFTU0VSVF9HRShtRnJhbWVzUGVyQnVyc3QsIDE2KTsKKyAgICBjb25zdCBpbnQzMl90IG1heEZyYW1lc1BlckJ1cnN0ID0KKyAgICAgICAgICAgIG1BY3R1YWwuc2FtcGxlUmF0ZSAqIHNNYXhGcmFtZXNQZXJCdXJzdE1zLmF0KG1BY3R1YWwucGVyZk1vZGUpIC8gTUlMTElTX1BFUl9TRUNPTkQ7CisgICAgQVNTRVJUX0xFKG1GcmFtZXNQZXJCdXJzdCwgbWF4RnJhbWVzUGVyQnVyc3QpOworCisgICAgaW50MzJfdCBhY3R1YWxCdWZmZXJTaXplID0gQUF1ZGlvU3RyZWFtX2dldEJ1ZmZlclNpemVJbkZyYW1lcyhtU3RyZWFtKTsKKyAgICBBU1NFUlRfR1QoYWN0dWFsQnVmZmVyU2l6ZSwgMCk7CisgICAgQVNTRVJUX0dUKEFBdWRpb1N0cmVhbV9zZXRCdWZmZXJTaXplSW5GcmFtZXMobVN0cmVhbSwgYWN0dWFsQnVmZmVyU2l6ZSksIDApOworCisgICAgKnN1Y2Nlc3MgPSB0cnVlOworfQorCit2b2lkIFN0cmVhbUJ1aWxkZXJIZWxwZXI6OmNsb3NlKCkgeworICAgIGlmIChtQnVpbGRlciAhPSBudWxscHRyKSB7CisgICAgICAgIEFTU0VSVF9FUShBQVVESU9fT0ssIEFBdWRpb1N0cmVhbUJ1aWxkZXJfZGVsZXRlKG1CdWlsZGVyKSk7CisgICAgfQorICAgIGlmIChtU3RyZWFtICE9IG51bGxwdHIpIHsKKyAgICAgICAgQVNTRVJUX0VRKEFBVURJT19PSywgQUF1ZGlvU3RyZWFtX2Nsb3NlKG1TdHJlYW0pKTsKKyAgICB9Cit9CisKK3ZvaWQgU3RyZWFtQnVpbGRlckhlbHBlcjo6c3RyZWFtQ29tbWFuZCgKKyAgICAgICAgU3RyZWFtQ29tbWFuZCBjbWQsIGFhdWRpb19zdHJlYW1fc3RhdGVfdCBmcm9tU3RhdGUsIGFhdWRpb19zdHJlYW1fc3RhdGVfdCB0b1N0YXRlKSB7CisgICAgQVNTRVJUX0VRKEFBVURJT19PSywgY21kKG1TdHJlYW0pKTsKKyAgICBhYXVkaW9fc3RyZWFtX3N0YXRlX3Qgc3RhdGUgPSBBQVVESU9fU1RSRUFNX1NUQVRFX1VOSU5JVElBTElaRUQ7CisgICAgQVNTRVJUX0VRKEFBVURJT19PSywKKyAgICAgICAgICAgIEFBdWRpb1N0cmVhbV93YWl0Rm9yU3RhdGVDaGFuZ2UobVN0cmVhbSwgZnJvbVN0YXRlLCAmc3RhdGUsIERFRkFVTFRfU1RBVEVfVElNRU9VVCkpOworICAgIEFTU0VSVF9FUSh0b1N0YXRlLCBzdGF0ZSk7Cit9CisKKworSW5wdXRTdHJlYW1CdWlsZGVySGVscGVyOjpJbnB1dFN0cmVhbUJ1aWxkZXJIZWxwZXIoCisgICAgICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCByZXF1ZXN0ZWRTaGFyaW5nTW9kZSwgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCByZXF1ZXN0ZWRQZXJmTW9kZSkKKyAgICAgICAgOiBTdHJlYW1CdWlsZGVySGVscGVye0FBVURJT19ESVJFQ1RJT05fSU5QVVQsCisgICAgICAgICAgICA0ODAwMCwgMSwgQUFVRElPX0ZPUk1BVF9QQ01fSTE2LCByZXF1ZXN0ZWRTaGFyaW5nTW9kZSwgcmVxdWVzdGVkUGVyZk1vZGV9IHt9CisKKworT3V0cHV0U3RyZWFtQnVpbGRlckhlbHBlcjo6T3V0cHV0U3RyZWFtQnVpbGRlckhlbHBlcigKKyAgICAgICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90IHJlcXVlc3RlZFNoYXJpbmdNb2RlLCBhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IHJlcXVlc3RlZFBlcmZNb2RlKQorICAgICAgICA6IFN0cmVhbUJ1aWxkZXJIZWxwZXJ7QUFVRElPX0RJUkVDVElPTl9PVVRQVVQsCisgICAgICAgICAgICA0ODAwMCwgMiwgQUFVRElPX0ZPUk1BVF9QQ01fSTE2LCByZXF1ZXN0ZWRTaGFyaW5nTW9kZSwgcmVxdWVzdGVkUGVyZk1vZGV9IHt9CisKK3ZvaWQgT3V0cHV0U3RyZWFtQnVpbGRlckhlbHBlcjo6aW5pdEJ1aWxkZXIoKSB7CisgICAgU3RyZWFtQnVpbGRlckhlbHBlcjo6aW5pdEJ1aWxkZXIoKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEJ1ZmZlckNhcGFjaXR5SW5GcmFtZXMobUJ1aWxkZXIsIGtCdWZmZXJDYXBhY2l0eUZyYW1lcyk7Cit9CisKK3ZvaWQgT3V0cHV0U3RyZWFtQnVpbGRlckhlbHBlcjo6Y3JlYXRlQW5kVmVyaWZ5U3RyZWFtKGJvb2wgKnN1Y2Nlc3MpIHsKKyAgICBTdHJlYW1CdWlsZGVySGVscGVyOjpjcmVhdGVBbmRWZXJpZnlTdHJlYW0oc3VjY2Vzcyk7CisgICAgaWYgKCpzdWNjZXNzKSB7CisgICAgICAgIEFTU0VSVF9HRShBQXVkaW9TdHJlYW1fZ2V0QnVmZmVyQ2FwYWNpdHlJbkZyYW1lcyhtU3RyZWFtKSwga0J1ZmZlckNhcGFjaXR5RnJhbWVzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9uYXRpdmVtZWRpYS9hYXVkaW8vam5pL3V0aWxzLmggYi90ZXN0cy90ZXN0cy9uYXRpdmVtZWRpYS9hYXVkaW8vam5pL3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIxMTQxMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL25hdGl2ZW1lZGlhL2FhdWRpby9qbmkvdXRpbHMuaApAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgQ1RTX01FRElBX1RFU1RfQUFVRElPX1VUSUxTX0gKKyNkZWZpbmUgQ1RTX01FRElBX1RFU1RfQUFVRElPX1VUSUxTX0gKKworI2luY2x1ZGUgPG1hcD4KKworI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KKworaW50NjRfdCBnZXROYW5vc2Vjb25kcyhjbG9ja2lkX3QgY2xvY2tJZCA9IENMT0NLX01PTk9UT05JQyk7Citjb25zdCBjaGFyKiBwZXJmb3JtYW5jZU1vZGVUb1N0cmluZyhhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IG1vZGUpOworY29uc3QgY2hhciogc2hhcmluZ01vZGVUb1N0cmluZyhhYXVkaW9fc2hhcmluZ19tb2RlX3QgbW9kZSk7CisKK3N0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciogRkVBVFVSRV9QTEFZQkFDSyA9ICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLm91dHB1dCI7CitzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIqIEZFQVRVUkVfUkVDT1JESU5HID0gImFuZHJvaWQuaGFyZHdhcmUubWljcm9waG9uZSI7CitzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIqIEZFQVRVUkVfTE9XX0xBVEVOQ1kgPSAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5sb3dfbGF0ZW5jeSI7Citib29sIGRldmljZVN1cHBvcnRzRmVhdHVyZShjb25zdCBjaGFyKiBmZWF0dXJlKTsKKworY2xhc3MgU3RyZWFtQnVpbGRlckhlbHBlciB7CisgIHB1YmxpYzoKKyAgICBzdHJ1Y3QgUGFyYW1ldGVycyB7CisgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKKyAgICAgICAgaW50MzJfdCBjaGFubmVsQ291bnQ7CisgICAgICAgIGFhdWRpb19mb3JtYXRfdCBkYXRhRm9ybWF0OworICAgICAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3Qgc2hhcmluZ01vZGU7CisgICAgICAgIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgcGVyZk1vZGU7CisgICAgfTsKKworICAgIHZvaWQgaW5pdEJ1aWxkZXIoKTsKKyAgICB2b2lkIGNyZWF0ZUFuZFZlcmlmeVN0cmVhbShib29sICpzdWNjZXNzKTsKKyAgICB2b2lkIGNsb3NlKCk7CisKKyAgICB2b2lkIHN0YXJ0U3RyZWFtKCkgeworICAgICAgICBzdHJlYW1Db21tYW5kKCZBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0LAorICAgICAgICAgICAgICAgIEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRJTkcsIEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRFRCk7CisgICAgfQorICAgIHZvaWQgcGF1c2VTdHJlYW0oKSB7CisgICAgICAgIHN0cmVhbUNvbW1hbmQoJkFBdWRpb1N0cmVhbV9yZXF1ZXN0UGF1c2UsCisgICAgICAgICAgICAgICAgQUFVRElPX1NUUkVBTV9TVEFURV9QQVVTSU5HLCBBQVVESU9fU1RSRUFNX1NUQVRFX1BBVVNFRCk7CisgICAgfQorICAgIHZvaWQgc3RvcFN0cmVhbSgpIHsKKyAgICAgICAgc3RyZWFtQ29tbWFuZCgmQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdG9wLAorICAgICAgICAgICAgICAgIEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBJTkcsIEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBFRCk7CisgICAgfQorICAgIHZvaWQgZmx1c2hTdHJlYW0oKSB7CisgICAgICAgIHN0cmVhbUNvbW1hbmQoJkFBdWRpb1N0cmVhbV9yZXF1ZXN0Rmx1c2gsCisgICAgICAgICAgICAgICAgQUFVRElPX1NUUkVBTV9TVEFURV9GTFVTSElORywgQUFVRElPX1NUUkVBTV9TVEFURV9GTFVTSEVEKTsKKyAgICB9CisKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyKCkgY29uc3QgeyByZXR1cm4gbUJ1aWxkZXI7IH0KKyAgICBBQXVkaW9TdHJlYW0qIHN0cmVhbSgpIGNvbnN0IHsgcmV0dXJuIG1TdHJlYW07IH0KKyAgICBjb25zdCBQYXJhbWV0ZXJzJiBhY3R1YWwoKSBjb25zdCB7IHJldHVybiBtQWN0dWFsOyB9CisgICAgaW50MzJfdCBmcmFtZXNQZXJCdXJzdCgpIGNvbnN0IHsgcmV0dXJuIG1GcmFtZXNQZXJCdXJzdDsgfQorCisgIHByb3RlY3RlZDoKKyAgICBTdHJlYW1CdWlsZGVySGVscGVyKGFhdWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGludDMyX3Qgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgIGludDMyX3QgY2hhbm5lbENvdW50LCBhYXVkaW9fZm9ybWF0X3QgZGF0YUZvcm1hdCwKKyAgICAgICAgICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCBzaGFyaW5nTW9kZSwgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBwZXJmTW9kZSk7CisgICAgflN0cmVhbUJ1aWxkZXJIZWxwZXIoKTsKKworICAgIHR5cGVkZWYgYWF1ZGlvX3Jlc3VsdF90IChTdHJlYW1Db21tYW5kKShBQXVkaW9TdHJlYW0qKTsKKyAgICB2b2lkIHN0cmVhbUNvbW1hbmQoCisgICAgICAgICAgICBTdHJlYW1Db21tYW5kIGNtZCwgYWF1ZGlvX3N0cmVhbV9zdGF0ZV90IGZyb21TdGF0ZSwgYWF1ZGlvX3N0cmVhbV9zdGF0ZV90IHRvU3RhdGUpOworCisgICAgc3RhdGljIGNvbnN0IHN0ZDo6bWFwPGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QsIGludDY0X3Q+IHNNYXhGcmFtZXNQZXJCdXJzdE1zOworICAgIGNvbnN0IGFhdWRpb19kaXJlY3Rpb25fdCBtRGlyZWN0aW9uOworICAgIGNvbnN0IFBhcmFtZXRlcnMgbVJlcXVlc3RlZDsKKyAgICBQYXJhbWV0ZXJzIG1BY3R1YWw7CisgICAgaW50MzJfdCBtRnJhbWVzUGVyQnVyc3Q7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlciAqbUJ1aWxkZXI7CisgICAgQUF1ZGlvU3RyZWFtICptU3RyZWFtOworfTsKKworY2xhc3MgSW5wdXRTdHJlYW1CdWlsZGVySGVscGVyIDogcHVibGljIFN0cmVhbUJ1aWxkZXJIZWxwZXIgeworICBwdWJsaWM6CisgICAgSW5wdXRTdHJlYW1CdWlsZGVySGVscGVyKAorICAgICAgICAgICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90IHJlcXVlc3RlZFNoYXJpbmdNb2RlLAorICAgICAgICAgICAgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCByZXF1ZXN0ZWRQZXJmTW9kZSk7Cit9OworCitjbGFzcyBPdXRwdXRTdHJlYW1CdWlsZGVySGVscGVyIDogcHVibGljIFN0cmVhbUJ1aWxkZXJIZWxwZXIgeworICBwdWJsaWM6CisgICAgT3V0cHV0U3RyZWFtQnVpbGRlckhlbHBlcigKKyAgICAgICAgICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCByZXF1ZXN0ZWRTaGFyaW5nTW9kZSwKKyAgICAgICAgICAgIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgcmVxdWVzdGVkUGVyZk1vZGUpOworICAgIHZvaWQgaW5pdEJ1aWxkZXIoKTsKKyAgICB2b2lkIGNyZWF0ZUFuZFZlcmlmeVN0cmVhbShib29sICpzdWNjZXNzKTsKKworICBwcml2YXRlOgorICAgIGNvbnN0IGludDMyX3Qga0J1ZmZlckNhcGFjaXR5RnJhbWVzID0gMjAwMDsKK307CisKKyNlbmRpZiAgLy8gQ1RTX01FRElBX1RFU1RfQUFVRElPX1VUSUxTX0gKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL25hdGl2ZW1lZGlhL2FhdWRpby9zcmMvYW5kcm9pZC9uYXRpdmVtZWRpYS9hYXVkaW8vQUF1ZGlvVGVzdHMuamF2YSBiL3Rlc3RzL3Rlc3RzL25hdGl2ZW1lZGlhL2FhdWRpby9zcmMvYW5kcm9pZC9uYXRpdmVtZWRpYS9hYXVkaW8vQUF1ZGlvVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmIyZGI0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvbmF0aXZlbWVkaWEvYWF1ZGlvL3NyYy9hbmRyb2lkL25hdGl2ZW1lZGlhL2FhdWRpby9BQXVkaW9UZXN0cy5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubmF0aXZlbWVkaWEuYWF1ZGlvOworCitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IGNvbS5hbmRyb2lkLmd0ZXN0cnVubmVyLkd0ZXN0UnVubmVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmd0ZXN0cnVubmVyLlRhcmdldExpYnJhcnk7CisKK0BSdW5XaXRoKEd0ZXN0UnVubmVyLmNsYXNzKQorQFRhcmdldExpYnJhcnkoIm5hdGl2ZWFhdWRpb3Rlc3QiKQorcHVibGljIGNsYXNzIEFBdWRpb1Rlc3RzIHt9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9uYXRpdmVtZWRpYS9hYXVkaW8vc3JjL3Rlc3RfYWF1ZGlvLmNwcCBiL3Rlc3RzL3Rlc3RzL25hdGl2ZW1lZGlhL2FhdWRpby9zcmMvdGVzdF9hYXVkaW8uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzVhNmQzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL3Rlc3RzL25hdGl2ZW1lZGlhL2FhdWRpby9zcmMvdGVzdF9hYXVkaW8uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzI1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIkFBdWRpb1Rlc3QiCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8dHVwbGU+Ci0KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2xvZy5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlICJ0ZXN0X2FhdWRpby5oIgotI2luY2x1ZGUgInV0aWxzLmgiCi0KLXVzaW5nIFN0cmVhbVRlc3RQYXJhbXMgPSBzdGQ6OnR1cGxlPGFhdWRpb19zaGFyaW5nX21vZGVfdCwgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdD47Ci1lbnVtIHsKLSAgICBQQVJBTV9TSEFSSU5HX01PREUgPSAwLAotICAgIFBBUkFNX1BFUkZfTU9ERQotfTsKLQotc3RhdGljIHN0ZDo6c3RyaW5nIGdldFRlc3ROYW1lKGNvbnN0IDo6dGVzdGluZzo6VGVzdFBhcmFtSW5mbzxTdHJlYW1UZXN0UGFyYW1zPiYgaW5mbykgewotICAgIHJldHVybiBzdGQ6OnN0cmluZygpICsgc2hhcmluZ01vZGVUb1N0cmluZyhzdGQ6OmdldDxQQVJBTV9TSEFSSU5HX01PREU+KGluZm8ucGFyYW0pKSArCi0gICAgICAgICAgICAiX18iICsgcGVyZm9ybWFuY2VNb2RlVG9TdHJpbmcoc3RkOjpnZXQ8UEFSQU1fUEVSRl9NT0RFPihpbmZvLnBhcmFtKSk7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1jbGFzcyBBQXVkaW9TdHJlYW1UZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxTdHJlYW1UZXN0UGFyYW1zPiB7Ci0gIHByb3RlY3RlZDoKLSAgICBBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyKCkgY29uc3QgeyByZXR1cm4gbUhlbHBlci0+YnVpbGRlcigpOyB9Ci0gICAgQUF1ZGlvU3RyZWFtKiBzdHJlYW0oKSBjb25zdCB7IHJldHVybiBtSGVscGVyLT5zdHJlYW0oKTsgfQotICAgIGNvbnN0IFN0cmVhbUJ1aWxkZXJIZWxwZXI6OlBhcmFtZXRlcnMmIGFjdHVhbCgpIGNvbnN0IHsgcmV0dXJuIG1IZWxwZXItPmFjdHVhbCgpOyB9Ci0gICAgaW50MzJfdCBmcmFtZXNQZXJCdXJzdCgpIGNvbnN0IHsgcmV0dXJuIG1IZWxwZXItPmZyYW1lc1BlckJ1cnN0KCk7IH0KLQotICAgIHN0ZDo6dW5pcXVlX3B0cjxUPiBtSGVscGVyOwotICAgIGJvb2wgbVNldHVwU3VjY2VzZnVsID0gZmFsc2U7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPGludDE2X3RbXT4gbURhdGE7Ci19OwotCi0KLWNsYXNzIEFBdWRpb0lucHV0U3RyZWFtVGVzdCA6IHB1YmxpYyBBQXVkaW9TdHJlYW1UZXN0PElucHV0U3RyZWFtQnVpbGRlckhlbHBlcj4gewotICBwcm90ZWN0ZWQ6Ci0gICAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlOwotCi0gICAgaW50MzJfdCBtRnJhbWVzUGVyUmVhZDsKLX07Ci0KLXZvaWQgQUF1ZGlvSW5wdXRTdHJlYW1UZXN0OjpTZXRVcCgpIHsKLSAgICBtSGVscGVyLnJlc2V0KG5ldyBJbnB1dFN0cmVhbUJ1aWxkZXJIZWxwZXIoCi0gICAgICAgICAgICAgICAgICAgIHN0ZDo6Z2V0PFBBUkFNX1NIQVJJTkdfTU9ERT4oR2V0UGFyYW0oKSksCi0gICAgICAgICAgICAgICAgICAgIHN0ZDo6Z2V0PFBBUkFNX1BFUkZfTU9ERT4oR2V0UGFyYW0oKSkpKTsKLSAgICBtSGVscGVyLT5pbml0QnVpbGRlcigpOwotICAgIG1TZXR1cFN1Y2Nlc2Z1bCA9IGZhbHNlOwotICAgIG1IZWxwZXItPmNyZWF0ZUFuZFZlcmlmeVN0cmVhbSgmbVNldHVwU3VjY2VzZnVsKTsKLSAgICBpZiAoIW1TZXR1cFN1Y2Nlc2Z1bCkgcmV0dXJuOwotCi0gICAgbUZyYW1lc1BlclJlYWQgPSBmcmFtZXNQZXJCdXJzdCgpOwotICAgIGNvbnN0IGludDMyX3QgZnJhbWVzUGVyTXNlYyA9IGFjdHVhbCgpLnNhbXBsZVJhdGUgLyBNSUxMSVNfUEVSX1NFQ09ORDsKLSAgICAvLyBTb21lIERNQSBtaWdodCB1c2UgdmVyeSBzaG9ydCBidXJzdHMgb2YgMTYgZnJhbWVzLiBXZSBkb24ndCBuZWVkIHRvIHJlYWQgc3VjaCBzbWFsbAotICAgIC8vIGJ1ZmZlcnMuIEJ1dCBpdCBoZWxwcyB0byB1c2UgYSBtdWx0aXBsZSBvZiB0aGUgYnVyc3Qgc2l6ZSBmb3IgcHJlZGljdGFibGUgc2NoZWR1bGluZy4KLSAgICB3aGlsZSAobUZyYW1lc1BlclJlYWQgPCBmcmFtZXNQZXJNc2VjKSB7Ci0gICAgICAgIG1GcmFtZXNQZXJSZWFkICo9IDI7Ci0gICAgfQotICAgIG1EYXRhLnJlc2V0KG5ldyBpbnQxNl90W21GcmFtZXNQZXJSZWFkICogYWN0dWFsKCkuY2hhbm5lbENvdW50XSk7Ci19Ci0KLVRFU1RfUChBQXVkaW9JbnB1dFN0cmVhbVRlc3QsIHRlc3RSZWFkaW5nKSB7Ci0gICAgaWYgKCFtU2V0dXBTdWNjZXNmdWwpIHJldHVybjsKLQotICAgIGNvbnN0IGludDMyX3QgZnJhbWVzVG9SZWNvcmQgPSBhY3R1YWwoKS5zYW1wbGVSYXRlOyAgLy8gMSBzZWNvbmQKLSAgICBFWFBFQ1RfRVEoMCwgQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1JlYWQoc3RyZWFtKCkpKTsKLSAgICBFWFBFQ1RfRVEoMCwgQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1dyaXR0ZW4oc3RyZWFtKCkpKTsKLSAgICBtSGVscGVyLT5zdGFydFN0cmVhbSgpOwotICAgIC8vIFNlZSBiLzYyMDkwMTEzLiBGb3IgbGVnYWN5IHBhdGgsIHRoZSBkZXZpY2UgaXMgb25seSBrbm93biBhZnRlcgotICAgIC8vIHRoZSBzdHJlYW0gaGFzIGJlZW4gc3RhcnRlZC4KLSAgICBBU1NFUlRfTkUoQUFVRElPX1VOU1BFQ0lGSUVELCBBQXVkaW9TdHJlYW1fZ2V0RGV2aWNlSWQoc3RyZWFtKCkpKTsKLSAgICBmb3IgKGludDMyX3QgZnJhbWVzTGVmdCA9IGZyYW1lc1RvUmVjb3JkOyBmcmFtZXNMZWZ0ID4gMDsgKSB7Ci0gICAgICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TdHJlYW1fcmVhZCgKLSAgICAgICAgICAgICAgICBzdHJlYW0oKSwgJm1EYXRhWzBdLCBzdGQ6Om1pbihmcmFtZXNUb1JlY29yZCwgbUZyYW1lc1BlclJlYWQpLAotICAgICAgICAgICAgICAgIERFRkFVTFRfUkVBRF9USU1FT1VUKTsKLSAgICAgICAgQVNTRVJUX0dUKHJlc3VsdCwgMCk7Ci0gICAgICAgIGZyYW1lc0xlZnQgLT0gcmVzdWx0OwotICAgIH0KLSAgICBtSGVscGVyLT5zdG9wU3RyZWFtKCk7Ci0gICAgRVhQRUNUX0dFKEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkKHN0cmVhbSgpKSwgZnJhbWVzVG9SZWNvcmQpOwotICAgIEVYUEVDVF9HRShBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzV3JpdHRlbihzdHJlYW0oKSksIGZyYW1lc1RvUmVjb3JkKTsKLSAgICBFWFBFQ1RfR0UoQUF1ZGlvU3RyZWFtX2dldFhSdW5Db3VudChzdHJlYW0oKSksIDApOwotfQotCi1URVNUX1AoQUF1ZGlvSW5wdXRTdHJlYW1UZXN0LCB0ZXN0U3RhcnRSZWFkU3RvcCkgewotICAgIGlmICghbVNldHVwU3VjY2VzZnVsKSByZXR1cm47Ci0KLSAgICAvLyBVc2UgMS84IHNlY29uZCBhcyBzdGFydC1zdG9wcyB0YWtlIGEgbG90IG1vcmUgdGltZSB0aGFuIGp1c3QgcmVjb3JkaW5nLgotICAgIGNvbnN0IGludDMyX3QgZnJhbWVzVG9SZWNvcmQgPSBhY3R1YWwoKS5zYW1wbGVSYXRlIC8gODsKLSAgICBFWFBFQ1RfRVEoMCwgQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1JlYWQoc3RyZWFtKCkpKTsKLSAgICBFWFBFQ1RfRVEoMCwgQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1dyaXR0ZW4oc3RyZWFtKCkpKTsKLSAgICBmb3IgKGludDMyX3QgZnJhbWVzTGVmdCA9IGZyYW1lc1RvUmVjb3JkOyBmcmFtZXNMZWZ0ID4gMDsgKSB7Ci0gICAgICAgIG1IZWxwZXItPnN0YXJ0U3RyZWFtKCk7Ci0gICAgICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TdHJlYW1fcmVhZCgKLSAgICAgICAgICAgICAgICBzdHJlYW0oKSwgJm1EYXRhWzBdLCBzdGQ6Om1pbihmcmFtZXNUb1JlY29yZCwgbUZyYW1lc1BlclJlYWQpLAotICAgICAgICAgICAgICAgIERFRkFVTFRfUkVBRF9USU1FT1VUKTsKLSAgICAgICAgQVNTRVJUX0dUKHJlc3VsdCwgMCk7Ci0gICAgICAgIGZyYW1lc0xlZnQgLT0gcmVzdWx0OwotICAgICAgICBtSGVscGVyLT5zdG9wU3RyZWFtKCk7Ci0gICAgfQotICAgIEVYUEVDVF9HRShBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUmVhZChzdHJlYW0oKSksIGZyYW1lc1RvUmVjb3JkKTsKLSAgICBFWFBFQ1RfR0UoQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1dyaXR0ZW4oc3RyZWFtKCkpLCBmcmFtZXNUb1JlY29yZCk7Ci19Ci0KLVRFU1RfUChBQXVkaW9JbnB1dFN0cmVhbVRlc3QsIHRlc3RSZWFkQ291bnRlckZyZWV6ZUFmdGVyU3RvcCkgewotICAgIGlmICghbVNldHVwU3VjY2VzZnVsKSByZXR1cm47Ci0KLSAgICBjb25zdCBpbnQzMl90IGZyYW1lc1RvUmVjb3JkID0gYWN0dWFsKCkuc2FtcGxlUmF0ZSAvIDEwOyAgLy8gMS8xMCBzZWNvbmQKLSAgICBFWFBFQ1RfRVEoMCwgQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1JlYWQoc3RyZWFtKCkpKTsKLSAgICBFWFBFQ1RfRVEoMCwgQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1dyaXR0ZW4oc3RyZWFtKCkpKTsKLSAgICBtSGVscGVyLT5zdGFydFN0cmVhbSgpOwotICAgIGZvciAoaW50MzJfdCBmcmFtZXNMZWZ0ID0gZnJhbWVzVG9SZWNvcmQ7IGZyYW1lc0xlZnQgPiAwOyApIHsKLSAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb1N0cmVhbV9yZWFkKAotICAgICAgICAgICAgICAgIHN0cmVhbSgpLCAmbURhdGFbMF0sIHN0ZDo6bWluKGZyYW1lc1RvUmVjb3JkLCBtRnJhbWVzUGVyUmVhZCksCi0gICAgICAgICAgICAgICAgREVGQVVMVF9SRUFEX1RJTUVPVVQpOwotICAgICAgICBBU1NFUlRfR1QocmVzdWx0LCAwKTsKLSAgICAgICAgZnJhbWVzTGVmdCAtPSByZXN1bHQ7Ci0gICAgfQotICAgIG1IZWxwZXItPnN0b3BTdHJlYW0oKTsKLSAgICBjb25zdCBpbnQzMl90IGZyYW1lc1JlYWRBdFN0b3AgPSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUmVhZChzdHJlYW0oKSk7Ci0gICAgY29uc3QgaW50MzJfdCBmcmFtZXNXcml0dGVuQXRTdG9wID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1dyaXR0ZW4oc3RyZWFtKCkpOwotICAgIEFTU0VSVF9FUSgwLCBURU1QX0ZBSUxVUkVfUkVUUlkodXNsZWVwKDEwMCAqIE1JQ1JPU19QRVJfTUlMTElTRUNPTkQpKSk7Ci0gICAgRVhQRUNUX0VRKGZyYW1lc1JlYWRBdFN0b3AsIEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkKHN0cmVhbSgpKSk7Ci0gICAgRVhQRUNUX0VRKGZyYW1lc1dyaXR0ZW5BdFN0b3AsIEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNXcml0dGVuKHN0cmVhbSgpKSk7Ci19Ci0KLVRFU1RfUChBQXVkaW9JbnB1dFN0cmVhbVRlc3QsIHRlc3RQYXVzZUFuZEZsdXNoTm90U3VwcG9ydGVkKSB7Ci0gICAgaWYgKCFtU2V0dXBTdWNjZXNmdWwpIHJldHVybjsKLSAgICBtSGVscGVyLT5zdGFydFN0cmVhbSgpOwotICAgIEVYUEVDVF9FUShBQVVESU9fRVJST1JfVU5JTVBMRU1FTlRFRCwgQUF1ZGlvU3RyZWFtX3JlcXVlc3RQYXVzZShzdHJlYW0oKSkpOwotICAgIEVYUEVDVF9FUShBQVVESU9fRVJST1JfVU5JTVBMRU1FTlRFRCwgQUF1ZGlvU3RyZWFtX3JlcXVlc3RGbHVzaChzdHJlYW0oKSkpOwotICAgIG1IZWxwZXItPnN0b3BTdHJlYW0oKTsKLX0KLQotSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoU1BNLCBBQXVkaW9JbnB1dFN0cmVhbVRlc3QsCi0gICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKAotICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRCwgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORSksCi0gICAgICAgICAgICAgICAgLy8gUmVjb3JkaW5nIGluIFBPV0VSX1NBVklORyBtb2RlIGlzbid0IHN1cHBvcnRlZCwgYi82MjI5MTc3NS4KLSAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQsIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZKSwKLSAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUsIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkUpLAotICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFLCBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9QT1dFUl9TQVZJTkcpLAotICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFLCBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSkpLAotICAgICAgICAmZ2V0VGVzdE5hbWUpOwotCi0KLWNsYXNzIEFBdWRpb091dHB1dFN0cmVhbVRlc3QgOiBwdWJsaWMgQUF1ZGlvU3RyZWFtVGVzdDxPdXRwdXRTdHJlYW1CdWlsZGVySGVscGVyPiB7Ci0gIHByb3RlY3RlZDoKLSAgICB2b2lkIFNldFVwKCkgb3ZlcnJpZGU7Ci19OwotCi12b2lkIEFBdWRpb091dHB1dFN0cmVhbVRlc3Q6OlNldFVwKCkgewotICAgIG1IZWxwZXIucmVzZXQobmV3IE91dHB1dFN0cmVhbUJ1aWxkZXJIZWxwZXIoCi0gICAgICAgICAgICAgICAgICAgIHN0ZDo6Z2V0PFBBUkFNX1NIQVJJTkdfTU9ERT4oR2V0UGFyYW0oKSksCi0gICAgICAgICAgICAgICAgICAgIHN0ZDo6Z2V0PFBBUkFNX1BFUkZfTU9ERT4oR2V0UGFyYW0oKSkpKTsKLSAgICBtSGVscGVyLT5pbml0QnVpbGRlcigpOwotCi0gICAgbVNldHVwU3VjY2VzZnVsID0gZmFsc2U7Ci0gICAgbUhlbHBlci0+Y3JlYXRlQW5kVmVyaWZ5U3RyZWFtKCZtU2V0dXBTdWNjZXNmdWwpOwotICAgIGlmICghbVNldHVwU3VjY2VzZnVsKSByZXR1cm47Ci0KLSAgICAvLyBBbGxvY2F0ZSBhIGJ1ZmZlciBmb3IgdGhlIGF1ZGlvIGRhdGEuCi0gICAgLy8gVE9ETyBoYW5kbGUgcG9zc2liaWxpdHkgb2Ygb3RoZXIgZGF0YSBmb3JtYXRzCi0gICAgc2l6ZV90IGRhdGFTaXplU2FtcGxlcyA9IGZyYW1lc1BlckJ1cnN0KCkgKiBhY3R1YWwoKS5jaGFubmVsQ291bnQ7Ci0gICAgbURhdGEucmVzZXQobmV3IGludDE2X3RbZGF0YVNpemVTYW1wbGVzXSk7Ci0gICAgbWVtc2V0KCZtRGF0YVswXSwgMCwgZGF0YVNpemVTYW1wbGVzKTsKLX0KLQotVEVTVF9QKEFBdWRpb091dHB1dFN0cmVhbVRlc3QsIHRlc3RXcml0aW5nKSB7Ci0gICAgaWYgKCFtU2V0dXBTdWNjZXNmdWwpIHJldHVybjsKLQotICAgIC8vIFByaW1lIHRoZSBidWZmZXIuCi0gICAgaW50MzJfdCBmcmFtZXNXcml0dGVuID0gMDsKLSAgICBpbnQ2NF90IGZyYW1lc1RvdGFsID0gMDsKLSAgICBpbnQ2NF90IHRpbWVvdXROYW5vcyA9IDA7Ci0gICAgZG8gewotICAgICAgICBmcmFtZXNXcml0dGVuID0gQUF1ZGlvU3RyZWFtX3dyaXRlKAotICAgICAgICAgICAgICAgIHN0cmVhbSgpLCAmbURhdGFbMF0sIGZyYW1lc1BlckJ1cnN0KCksIHRpbWVvdXROYW5vcyk7Ci0gICAgICAgIC8vIFRoZXJlIHNob3VsZCBiZSBzb21lIHJvb20gZm9yIHByaW1pbmcgdGhlIGJ1ZmZlci4KLSAgICAgICAgZnJhbWVzVG90YWwgKz0gZnJhbWVzV3JpdHRlbjsKLSAgICAgICAgQVNTRVJUX0dFKGZyYW1lc1dyaXR0ZW4sIDApOwotICAgICAgICBBU1NFUlRfTEUoZnJhbWVzV3JpdHRlbiwgZnJhbWVzUGVyQnVyc3QoKSk7Ci0gICAgfSB3aGlsZSAoZnJhbWVzV3JpdHRlbiA+IDApOwotICAgIEFTU0VSVF9UUlVFKGZyYW1lc1RvdGFsID4gMCk7Ci0KLSAgICBpbnQgd3JpdGVMb29wcyA9IDA7Ci0gICAgaW50NjRfdCBhYXVkaW9GcmFtZXNSZWFkID0gMDsKLSAgICBpbnQ2NF90IGFhdWRpb0ZyYW1lc1JlYWRQcmV2ID0gMDsKLSAgICBpbnQ2NF90IGFhdWRpb0ZyYW1lc1JlYWRGaW5hbCA9IDA7Ci0gICAgaW50NjRfdCBhYXVkaW9GcmFtZXNXcml0dGVuID0gMDsKLSAgICAvLyBTdGFydC93cml0ZS9wYXVzZSBtb3JlIHRoYW4gb25jZSB0byBzZWUgaWYgaXQgZmFpbHMgYWZ0ZXIgdGhlIGZpcnN0IHRpbWUuCi0gICAgLy8gV3JpdGUgc29tZSBkYXRhIGFuZCBtZWFzdXJlIHRoZSByYXRlIHRvIHNlZSBpZiB0aGUgdGltaW5nIGlzIE9LLgotICAgIGZvciAoaW50IG51bUxvb3BzID0gMDsgbnVtTG9vcHMgPCAyOyBudW1Mb29wcysrKSB7Ci0gICAgICAgIG1IZWxwZXItPnN0YXJ0U3RyZWFtKCk7Ci0gICAgICAgIC8vIFNlZSBiLzYyMDkwMTEzLiBGb3IgbGVnYWN5IHBhdGgsIHRoZSBkZXZpY2UgaXMgb25seSBrbm93biBhZnRlcgotICAgICAgICAvLyB0aGUgc3RyZWFtIGhhcyBiZWVuIHN0YXJ0ZWQuCi0gICAgICAgIEFTU0VSVF9ORShBQVVESU9fVU5TUEVDSUZJRUQsIEFBdWRpb1N0cmVhbV9nZXREZXZpY2VJZChzdHJlYW0oKSkpOwotCi0gICAgICAgIC8vIFdyaXRlIHNvbWUgZGF0YSB3aGlsZSB3ZSBhcmUgcnVubmluZy4gUmVhZCBjb3VudGVyIHNob3VsZCBiZSBhZHZhbmNpbmcuCi0gICAgICAgIHdyaXRlTG9vcHMgPSAxICogYWN0dWFsKCkuc2FtcGxlUmF0ZSAvIGZyYW1lc1BlckJ1cnN0KCk7IC8vIDEgc2Vjb25kCi0gICAgICAgIEFTU0VSVF9MVCgyLCB3cml0ZUxvb3BzKTsgLy8gZGV0ZWN0IGFic3VyZGx5IGhpZ2ggZnJhbWVzUGVyQnVyc3QKLSAgICAgICAgdGltZW91dE5hbm9zID0gMTAwICogKE5BTk9TX1BFUl9TRUNPTkQgKiBmcmFtZXNQZXJCdXJzdCgpIC8KLSAgICAgICAgICAgICAgICBhY3R1YWwoKS5zYW1wbGVSYXRlKTsgLy8gTiBidXJzdHMKLSAgICAgICAgZnJhbWVzV3JpdHRlbiA9IDE7Ci0gICAgICAgIGFhdWRpb0ZyYW1lc1JlYWQgPSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUmVhZChzdHJlYW0oKSk7Ci0gICAgICAgIGFhdWRpb0ZyYW1lc1JlYWRQcmV2ID0gYWF1ZGlvRnJhbWVzUmVhZDsKLSAgICAgICAgaW50NjRfdCBiZWdpblRpbWUgPSBnZXROYW5vc2Vjb25kcyhDTE9DS19NT05PVE9OSUMpOwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBmcmFtZXNXcml0dGVuID0gQUF1ZGlvU3RyZWFtX3dyaXRlKAotICAgICAgICAgICAgICAgICAgICBzdHJlYW0oKSwgJm1EYXRhWzBdLCBmcmFtZXNQZXJCdXJzdCgpLCB0aW1lb3V0TmFub3MpOwotICAgICAgICAgICAgRVhQRUNUX0VRKGZyYW1lc1BlckJ1cnN0KCksIGZyYW1lc1dyaXR0ZW4pOwotCi0gICAgICAgICAgICBmcmFtZXNUb3RhbCArPSBmcmFtZXNXcml0dGVuOwotICAgICAgICAgICAgYWF1ZGlvRnJhbWVzV3JpdHRlbiA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNXcml0dGVuKHN0cmVhbSgpKTsKLSAgICAgICAgICAgIEVYUEVDVF9FUShmcmFtZXNUb3RhbCwgYWF1ZGlvRnJhbWVzV3JpdHRlbik7Ci0KLSAgICAgICAgICAgIC8vIFRyeSB0byBnZXQgYSBtb3JlIGFjY3VyYXRlIG1lYXN1cmUgb2YgdGhlIHNhbXBsZSByYXRlLgotICAgICAgICAgICAgaWYgKGJlZ2luVGltZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgYWF1ZGlvRnJhbWVzUmVhZCA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkKHN0cmVhbSgpKTsKLSAgICAgICAgICAgICAgICBpZiAoYWF1ZGlvRnJhbWVzUmVhZCA+IGFhdWRpb0ZyYW1lc1JlYWRQcmV2KSB7IC8vIGlzIHJlYWQgcG9pbnRlciBhZHZhbmNpbmcKLSAgICAgICAgICAgICAgICAgICAgYmVnaW5UaW1lID0gZ2V0TmFub3NlY29uZHMoQ0xPQ0tfTU9OT1RPTklDKTsKLSAgICAgICAgICAgICAgICAgICAgYWF1ZGlvRnJhbWVzUmVhZFByZXYgPSBhYXVkaW9GcmFtZXNSZWFkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSB3aGlsZSAoZnJhbWVzV3JpdHRlbiA+IDAgJiYgd3JpdGVMb29wcy0tID4gMCk7Ci0KLSAgICAgICAgYWF1ZGlvRnJhbWVzUmVhZEZpbmFsID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1JlYWQoc3RyZWFtKCkpOwotICAgICAgICBBU1NFUlRfR1QoYWF1ZGlvRnJhbWVzUmVhZEZpbmFsLCAwKTsKLSAgICAgICAgRVhQRUNUX0dUKGFhdWRpb0ZyYW1lc1JlYWRGaW5hbCwgYWF1ZGlvRnJhbWVzUmVhZFByZXYpOwotCi0KLSAgICAgICAgLy8gVE9ETyB3aHkgaXMgQXVkaW9UcmFjayBwYXRoIHNvIGluYWNjdXJhdGU/Ci0gICAgICAgIC8qIFNlZSBiLzM4MjY4NTQ3LCB0aGVyZSBpcyBubyB3YXkgdG8gc3BlY2lmeSB0aGF0IE1NQVAgbW9kZSBuZWVkcyB0byBiZSB1c2VkLAotICAgICAgICAgICBldmVuIEVYQ0xVU0lWRSBtb2RlIG1heSBmYWxsIGJhY2sgdG8gbGVnYWN5Ci0gICAgICAgIGNvbnN0IGludDY0X3QgZW5kVGltZSA9IGdldE5hbm9zZWNvbmRzKENMT0NLX01PTk9UT05JQyk7Ci0gICAgICAgIGNvbnN0IGRvdWJsZSByYXRlVG9sZXJhbmNlID0gMjAwLjA7IC8vIGFyYml0cmFyeSB0b2xlcmFuY2UgZm9yIHNhbXBsZSByYXRlCi0gICAgICAgIGlmIChzdGQ6OmdldDxQQVJBTV9TSEFSSU5HX01PREU+KEdldFBhcmFtKCkpICE9IEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEKSB7Ci0gICAgICAgICAgICAvLyBDYWxjdWxhdGUgYXBwcm94aW1hdGUgc2FtcGxlIHJhdGUgYW5kIGNvbXBhcmUgd2l0aCBzdHJlYW0gcmF0ZS4KLSAgICAgICAgICAgIGRvdWJsZSBzZWNvbmRzID0gKGVuZFRpbWUgLSBiZWdpblRpbWUpIC8gKGRvdWJsZSkgTkFOT1NfUEVSX1NFQ09ORDsKLSAgICAgICAgICAgIGRvdWJsZSBtZWFzdXJlZFJhdGUgPSAoYWF1ZGlvRnJhbWVzUmVhZEZpbmFsIC0gYWF1ZGlvRnJhbWVzUmVhZFByZXYpIC8gc2Vjb25kczsKLSAgICAgICAgICAgIEFTU0VSVF9ORUFSKGFjdHVhbCgpLnNhbXBsZVJhdGUsIG1lYXN1cmVkUmF0ZSwgcmF0ZVRvbGVyYW5jZSk7Ci0gICAgICAgIH0KLSAgICAgICAgKi8KLQotICAgICAgICBtSGVscGVyLT5wYXVzZVN0cmVhbSgpOwotICAgIH0KLSAgICBFWFBFQ1RfR0UoQUF1ZGlvU3RyZWFtX2dldFhSdW5Db3VudChzdHJlYW0oKSksIDApOwotCi0gICAgLy8gTWFrZSBzdXJlIHRoZSByZWFkIGNvdW50ZXIgaXMgbm90IGFkdmFuY2luZyB3aGVuIHdlIGFyZSBwYXVzZWQuCi0gICAgYWF1ZGlvRnJhbWVzUmVhZCA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkKHN0cmVhbSgpKTsKLSAgICBBU1NFUlRfR0UoYWF1ZGlvRnJhbWVzUmVhZCwgYWF1ZGlvRnJhbWVzUmVhZEZpbmFsKTsgLy8gbW9ub3RvbmljIGluY3JlYXNlCi0gICAgLy8gQ3VycmVudGx5IG5vdCBwb3NzaWJsZSB0byBlbmZvcmNlIGZvciBBQXVkaW8gb3ZlciBBdWRpb1RyYWNrIChiLzMzMzU0NzE1KS4KLSAgICAvLyBBU1NFUlRfRVEoMCwgVEVNUF9GQUlMVVJFX1JFVFJZKHVzbGVlcCgxMDAgKiBNSUNST1NfUEVSX01JTExJU0VDT05EKSkpOwotICAgIC8vIEVYUEVDVF9FUShhYXVkaW9GcmFtZXNSZWFkLCBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUmVhZChzdHJlYW0oKSkpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLSBURVNUIEZMVVNIIC0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gUHJpbWUgdGhlIGJ1ZmZlci4KLSAgICB0aW1lb3V0TmFub3MgPSAwOwotICAgIHdyaXRlTG9vcHMgPSAxMDAwOwotICAgIGRvIHsKLSAgICAgICAgZnJhbWVzV3JpdHRlbiA9IEFBdWRpb1N0cmVhbV93cml0ZSgKLSAgICAgICAgICAgICAgICBzdHJlYW0oKSwgJm1EYXRhWzBdLCBmcmFtZXNQZXJCdXJzdCgpLCB0aW1lb3V0TmFub3MpOwotICAgICAgICBmcmFtZXNUb3RhbCArPSBmcmFtZXNXcml0dGVuOwotICAgIH0gd2hpbGUgKGZyYW1lc1dyaXR0ZW4gPiAwICYmIHdyaXRlTG9vcHMtLSA+IDApOwotICAgIEVYUEVDVF9FUSgwLCBmcmFtZXNXcml0dGVuKTsKLQotICAgIG1IZWxwZXItPmZsdXNoU3RyZWFtKCk7Ci0KLSAgICAvLyBBZnRlciBhIGZsdXNoLCB0aGUgcmVhZCBjb3VudGVyIHNob3VsZCBiZSBjYXVnaHQgdXAgd2l0aCB0aGUgd3JpdGUgY291bnRlci4KLSAgICBhYXVkaW9GcmFtZXNXcml0dGVuID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1dyaXR0ZW4oc3RyZWFtKCkpOwotICAgIEVYUEVDVF9FUShmcmFtZXNUb3RhbCwgYWF1ZGlvRnJhbWVzV3JpdHRlbik7Ci0gICAgYWF1ZGlvRnJhbWVzUmVhZCA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkKHN0cmVhbSgpKTsKLSAgICBFWFBFQ1RfRVEoYWF1ZGlvRnJhbWVzV3JpdHRlbiwgYWF1ZGlvRnJhbWVzUmVhZCk7Ci0KLSAgICBzbGVlcCgxKTsgLy8gRklYTUUgLSBUaGUgd3JpdGUgcmV0dXJucyAwIGlmIHdlIHJlbW92ZSB0aGlzIHNsZWVwISBXaHk/Ci0KLSAgICAvLyBUaGUgYnVmZmVyIHNob3VsZCBiZSBlbXB0eSBhZnRlciBhIGZsdXNoIHNvIHdlIHNob3VsZCBiZSBhYmxlIHRvIHdyaXRlLgotICAgIGZyYW1lc1dyaXR0ZW4gPSBBQXVkaW9TdHJlYW1fd3JpdGUoc3RyZWFtKCksICZtRGF0YVswXSwgZnJhbWVzUGVyQnVyc3QoKSwgdGltZW91dE5hbm9zKTsKLSAgICAvLyBUaGVyZSBzaG91bGQgYmUgc29tZSByb29tIGZvciBwcmltaW5nIHRoZSBidWZmZXIuCi0gICAgQVNTRVJUX0dUKGZyYW1lc1dyaXR0ZW4sIDApOwotICAgIEFTU0VSVF9MRShmcmFtZXNXcml0dGVuLCBmcmFtZXNQZXJCdXJzdCgpKTsKLX0KLQotLy8gTm90ZSB0aGF0IHRoZSB0ZXN0IGZvciBFWENMVVNJVkUgc2hhcmluZyBtb2RlIG1heSBmYWlsIGdyYWNlZnVsbHkgaWYKLS8vIHRoaXMgbW9kZSBpc24ndCBzdXBwb3J0ZWQgYnkgdGhlIHBsYXRmb3JtLgotSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoU1BNLCBBQXVkaW9PdXRwdXRTdHJlYW1UZXN0LAotICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygKLSAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQsIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkUpLAotICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRCwgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfUE9XRVJfU0FWSU5HKSwKLSAgICAgICAgICAgICAgICAvLyBObyB0ZXN0IGZvciBTSEFSRUQgLyBMT1dfTEFURU5DWSwgc2VlIGIvNjIxMDEwNDEKLSAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUsIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkUpLAotICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFLCBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9QT1dFUl9TQVZJTkcpLAotICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFLCBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSkpLAotICAgICAgICAmZ2V0VGVzdE5hbWUpOwotCi0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgewotICAgIHRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKLQotICAgIHJldHVybiBSVU5fQUxMX1RFU1RTKCk7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9uYXRpdmVtZWRpYS9hYXVkaW8vc3JjL3Rlc3RfYWF1ZGlvX2NhbGxiYWNrLmNwcCBiL3Rlc3RzL3Rlc3RzL25hdGl2ZW1lZGlhL2FhdWRpby9zcmMvdGVzdF9hYXVkaW9fY2FsbGJhY2suY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzBjMDc3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL3Rlc3RzL25hdGl2ZW1lZGlhL2FhdWRpby9zcmMvdGVzdF9hYXVkaW9fY2FsbGJhY2suY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzI5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIkFBdWRpb1Rlc3QiCi0KLSNpbmNsdWRlIDxhdG9taWM+Ci0jaW5jbHVkZSA8dHVwbGU+Ci0KLSNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9sb2cuaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAidGVzdF9hYXVkaW8uaCIKLSNpbmNsdWRlICJ1dGlscy5oIgotCi1zdGF0aWMgaW50MzJfdCBtZWFzdXJlTGF0ZW5jeShBQXVkaW9TdHJlYW0gKnN0cmVhbSkgewotICAgIGludDY0X3QgcHJlc2VudGF0aW9uVGltZSA9IDA7Ci0gICAgaW50NjRfdCBwcmVzZW50YXRpb25Qb3NpdGlvbiA9IDA7Ci0gICAgaW50NjRfdCBub3cgPSBnZXROYW5vc2Vjb25kcygpOwotICAgIGludDMyX3Qgc2FtcGxlUmF0ZSA9IEFBdWRpb1N0cmVhbV9nZXRTYW1wbGVSYXRlKHN0cmVhbSk7Ci0gICAgaW50NjRfdCBmcmFtZXNXcml0dGVuID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1dyaXR0ZW4oc3RyZWFtKTsKLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtX2dldFRpbWVzdGFtcChzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xPQ0tfTU9OT1RPTklDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmVzZW50YXRpb25Qb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJlc2VudGF0aW9uVGltZSk7Ci0gICAgaWYgKHJlc3VsdCA8IDApIHsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgLy8gQ2FsY3VsYXRlIHdoZW4gdGhlIGxhc3QgZnJhbWUgd3JpdHRlbiB3b3VsZCBiZSBwbGF5ZWQuCi0gICAgaW50NjRfdCBkZWx0YUZyYW1lcyA9IGZyYW1lc1dyaXR0ZW4gLSBwcmVzZW50YXRpb25Qb3NpdGlvbjsKLSAgICBpZiAoZGVsdGFGcmFtZXMgPCAwKSB7Ci0gICAgICAgIF9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfV0FSTiwgTE9HX1RBRywgIlVuZGVycnVuIGRldGVjdGVkOiAlbGxkIGZyYW1lcyIsCi0gICAgICAgICAgICAgICAgKGxvbmcgbG9uZykoLWRlbHRhRnJhbWVzKSk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpbnQ2NF90IGNhbGN1bGF0ZWREZWx0YU5hbm9zID0gZGVsdGFGcmFtZXMgKiBOQU5PU19QRVJfU0VDT05EIC8gc2FtcGxlUmF0ZTsKLSAgICBpbnQ2NF90IGNhbGN1bGF0ZWRUaW1lTmFub3MgPSBwcmVzZW50YXRpb25UaW1lICsgIGNhbGN1bGF0ZWREZWx0YU5hbm9zOwotICAgIGludDY0X3QgbGF0ZW5jeU5hbm9zID0gY2FsY3VsYXRlZFRpbWVOYW5vcyAtIG5vdzsKLSAgICBpbnQzMl90IGxhdGVuY3lNaWxsaXMgPSAoaW50MzJfdCkgKChsYXRlbmN5TmFub3MgKyBOQU5PU19QRVJfTUlMTElTRUNPTkQgLSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gTkFOT1NfUEVSX01JTExJU0VDT05EKTsKLSAgICByZXR1cm4gbGF0ZW5jeU1pbGxpczsKLX0KLQotdXNpbmcgQ2JUZXN0UGFyYW1zID0gc3RkOjp0dXBsZTxhYXVkaW9fc2hhcmluZ19tb2RlX3QsIGludDMyX3QsIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3Q+OwotZW51bSB7Ci0gICAgUEFSQU1fU0hBUklOR19NT0RFID0gMCwKLSAgICBQQVJBTV9GUkFNRVNfUEVSX0NCLAotICAgIFBBUkFNX1BFUkZfTU9ERQotfTsKLQotc3RhdGljIHN0ZDo6c3RyaW5nIGdldFRlc3ROYW1lKGNvbnN0IDo6dGVzdGluZzo6VGVzdFBhcmFtSW5mbzxDYlRlc3RQYXJhbXM+JiBpbmZvKSB7Ci0gICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCkgKyBzaGFyaW5nTW9kZVRvU3RyaW5nKHN0ZDo6Z2V0PFBBUkFNX1NIQVJJTkdfTU9ERT4oaW5mby5wYXJhbSkpICsKLSAgICAgICAgICAgICJfXyIgKyBzdGQ6OnRvX3N0cmluZyhzdGQ6OmdldDxQQVJBTV9GUkFNRVNfUEVSX0NCPihpbmZvLnBhcmFtKSkgKwotICAgICAgICAgICAgIl9fIiArIHBlcmZvcm1hbmNlTW9kZVRvU3RyaW5nKHN0ZDo6Z2V0PFBBUkFNX1BFUkZfTU9ERT4oaW5mby5wYXJhbSkpOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotY2xhc3MgQUF1ZGlvU3RyZWFtQ2FsbGJhY2tUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxDYlRlc3RQYXJhbXM+IHsKLSAgcHJvdGVjdGVkOgotICAgIHN0cnVjdCBBQXVkaW9DYWxsYmFja1Rlc3REYXRhIHsKLSAgICAgICAgaW50MzJfdCBleHBlY3RlZEZyYW1lc1BlckNhbGxiYWNrOwotICAgICAgICBpbnQzMl90IGFjdHVhbEZyYW1lc1BlckNhbGxiYWNrOwotICAgICAgICBpbnQzMl90IG1pbkxhdGVuY3k7Ci0gICAgICAgIGludDMyX3QgbWF4TGF0ZW5jeTsKLSAgICAgICAgc3RkOjphdG9taWM8YWF1ZGlvX3Jlc3VsdF90PiBjYWxsYmFja0Vycm9yOwotICAgICAgICBzdGQ6OmF0b21pYzxpbnQzMl90PiBjYWxsYmFja0NvdW50OwotCi0gICAgICAgIEFBdWRpb0NhbGxiYWNrVGVzdERhdGEoKSB7Ci0gICAgICAgICAgICByZXNldCgwKTsKLSAgICAgICAgfQotICAgICAgICB2b2lkIHJlc2V0KGludDMyX3QgZXhwZWN0ZWRGcmFtZXNQZXJDYikgewotICAgICAgICAgICAgZXhwZWN0ZWRGcmFtZXNQZXJDYWxsYmFjayA9IGV4cGVjdGVkRnJhbWVzUGVyQ2I7Ci0gICAgICAgICAgICBhY3R1YWxGcmFtZXNQZXJDYWxsYmFjayA9IDA7Ci0gICAgICAgICAgICBtaW5MYXRlbmN5ID0gSU5UMzJfTUFYOwotICAgICAgICAgICAgbWF4TGF0ZW5jeSA9IDA7Ci0gICAgICAgICAgICBjYWxsYmFja0Vycm9yID0gQUFVRElPX09LOwotICAgICAgICAgICAgY2FsbGJhY2tDb3VudCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgdm9pZCB1cGRhdGVGcmFtZUNvdW50KGludDMyX3QgbnVtRnJhbWVzKSB7Ci0gICAgICAgICAgICBpZiAobnVtRnJhbWVzICE9IGV4cGVjdGVkRnJhbWVzUGVyQ2FsbGJhY2spIHsKLSAgICAgICAgICAgICAgICAvLyByZWNvcmQgdW5leHBlY3RlZCBmcmFtZWNvdW50cwotICAgICAgICAgICAgICAgIGFjdHVhbEZyYW1lc1BlckNhbGxiYWNrID0gbnVtRnJhbWVzOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhY3R1YWxGcmFtZXNQZXJDYWxsYmFjayA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gcmVjb3JkIGF0IGxlYXN0IG9uZSBmcmFtZSBjb3VudAotICAgICAgICAgICAgICAgIGFjdHVhbEZyYW1lc1BlckNhbGxiYWNrID0gbnVtRnJhbWVzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHZvaWQgdXBkYXRlTGF0ZW5jeShpbnQzMl90IGxhdGVuY3kpIHsKLSAgICAgICAgICAgIGlmIChsYXRlbmN5IDw9IDApIHJldHVybjsKLSAgICAgICAgICAgIG1pbkxhdGVuY3kgPSBzdGQ6Om1pbihtaW5MYXRlbmN5LCBsYXRlbmN5KTsKLSAgICAgICAgICAgIG1heExhdGVuY3kgPSBzdGQ6Om1heChtYXhMYXRlbmN5LCBsYXRlbmN5KTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBzdGF0aWMgdm9pZCBNeUVycm9yQ2FsbGJhY2tQcm9jKEFBdWRpb1N0cmVhbSAqc3RyZWFtLCB2b2lkICp1c2VyRGF0YSwgYWF1ZGlvX3Jlc3VsdF90IGVycm9yKTsKLQotICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIoKSBjb25zdCB7IHJldHVybiBtSGVscGVyLT5idWlsZGVyKCk7IH0KLSAgICBBQXVkaW9TdHJlYW0qIHN0cmVhbSgpIGNvbnN0IHsgcmV0dXJuIG1IZWxwZXItPnN0cmVhbSgpOyB9Ci0gICAgY29uc3QgU3RyZWFtQnVpbGRlckhlbHBlcjo6UGFyYW1ldGVycyYgYWN0dWFsKCkgY29uc3QgeyByZXR1cm4gbUhlbHBlci0+YWN0dWFsKCk7IH0KLQotICAgIHN0ZDo6dW5pcXVlX3B0cjxUPiBtSGVscGVyOwotICAgIGJvb2wgbVNldHVwU3VjY2VzZnVsID0gZmFsc2U7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPEFBdWRpb0NhbGxiYWNrVGVzdERhdGE+IG1DYkRhdGE7Ci19OwotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotdm9pZCBBQXVkaW9TdHJlYW1DYWxsYmFja1Rlc3Q8VD46Ok15RXJyb3JDYWxsYmFja1Byb2MoCi0gICAgICAgIEFBdWRpb1N0cmVhbSogLypzdHJlYW0qLywgdm9pZCAqdXNlckRhdGEsIGFhdWRpb19yZXN1bHRfdCBlcnJvcikgewotICAgIEFBdWRpb0NhbGxiYWNrVGVzdERhdGEgKm15RGF0YSA9IHN0YXRpY19jYXN0PEFBdWRpb0NhbGxiYWNrVGVzdERhdGEqPih1c2VyRGF0YSk7Ci0gICAgbXlEYXRhLT5jYWxsYmFja0Vycm9yID0gZXJyb3I7Ci19Ci0KLQotY2xhc3MgQUF1ZGlvSW5wdXRTdHJlYW1DYWxsYmFja1Rlc3QgOiBwdWJsaWMgQUF1ZGlvU3RyZWFtQ2FsbGJhY2tUZXN0PElucHV0U3RyZWFtQnVpbGRlckhlbHBlcj4gewotICBwcm90ZWN0ZWQ6Ci0gICAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlOwotCi0gICAgc3RhdGljIGFhdWRpb19kYXRhX2NhbGxiYWNrX3Jlc3VsdF90IE15RGF0YUNhbGxiYWNrUHJvYygKLSAgICAgICAgICAgIEFBdWRpb1N0cmVhbSAqc3RyZWFtLCB2b2lkICp1c2VyRGF0YSwgdm9pZCAqYXVkaW9EYXRhLCBpbnQzMl90IG51bUZyYW1lcyk7Ci19OwotCi1hYXVkaW9fZGF0YV9jYWxsYmFja19yZXN1bHRfdCBBQXVkaW9JbnB1dFN0cmVhbUNhbGxiYWNrVGVzdDo6TXlEYXRhQ2FsbGJhY2tQcm9jKAotICAgICAgICBBQXVkaW9TdHJlYW0qIC8qc3RyZWFtKi8sIHZvaWQgKnVzZXJEYXRhLCB2b2lkKiAvKmF1ZGlvRGF0YSovLCBpbnQzMl90IG51bUZyYW1lcykgewotICAgIEFBdWRpb0NhbGxiYWNrVGVzdERhdGEgKm15RGF0YSA9IHN0YXRpY19jYXN0PEFBdWRpb0NhbGxiYWNrVGVzdERhdGEqPih1c2VyRGF0YSk7Ci0gICAgbXlEYXRhLT51cGRhdGVGcmFtZUNvdW50KG51bUZyYW1lcyk7Ci0gICAgLy8gTm8gbGF0ZW5jeSBtZWFzdXJlbWVudCBhcyB0aGVyZSBpcyBubyBBUEkgZm9yIHF1ZXJ5aW5nIGNhcHR1cmUgcG9zaXRpb24uCi0gICAgbXlEYXRhLT5jYWxsYmFja0NvdW50Kys7Ci0gICAgcmV0dXJuIEFBVURJT19DQUxMQkFDS19SRVNVTFRfQ09OVElOVUU7Ci19Ci0KLXZvaWQgQUF1ZGlvSW5wdXRTdHJlYW1DYWxsYmFja1Rlc3Q6OlNldFVwKCkgewotICAgIG1IZWxwZXIucmVzZXQobmV3IElucHV0U3RyZWFtQnVpbGRlckhlbHBlcigKLSAgICAgICAgICAgICAgICAgICAgc3RkOjpnZXQ8UEFSQU1fU0hBUklOR19NT0RFPihHZXRQYXJhbSgpKSwKLSAgICAgICAgICAgICAgICAgICAgc3RkOjpnZXQ8UEFSQU1fUEVSRl9NT0RFPihHZXRQYXJhbSgpKSkpOwotICAgIG1IZWxwZXItPmluaXRCdWlsZGVyKCk7Ci0KLSAgICBpbnQzMl90IGZyYW1lc1BlckRhdGFDYWxsYmFjayA9IHN0ZDo6Z2V0PFBBUkFNX0ZSQU1FU19QRVJfQ0I+KEdldFBhcmFtKCkpOwotICAgIG1DYkRhdGEucmVzZXQobmV3IEFBdWRpb0NhbGxiYWNrVGVzdERhdGEoKSk7Ci0gICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRFcnJvckNhbGxiYWNrKGJ1aWxkZXIoKSwgJk15RXJyb3JDYWxsYmFja1Byb2MsIG1DYkRhdGEuZ2V0KCkpOwotICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RGF0YUNhbGxiYWNrKGJ1aWxkZXIoKSwgJk15RGF0YUNhbGxiYWNrUHJvYywgbUNiRGF0YS5nZXQoKSk7Ci0gICAgaWYgKGZyYW1lc1BlckRhdGFDYWxsYmFjayAhPSBBQVVESU9fVU5TUEVDSUZJRUQpIHsKLSAgICAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRGcmFtZXNQZXJEYXRhQ2FsbGJhY2soYnVpbGRlcigpLCBmcmFtZXNQZXJEYXRhQ2FsbGJhY2spOwotICAgIH0KLQotICAgIG1TZXR1cFN1Y2Nlc2Z1bCA9IGZhbHNlOwotICAgIG1IZWxwZXItPmNyZWF0ZUFuZFZlcmlmeVN0cmVhbSgmbVNldHVwU3VjY2VzZnVsKTsKLX0KLQotLy8gVGVzdCBSZWFkaW5nIGZyb20gYW4gQUF1ZGlvU3RyZWFtIHVzaW5nIGEgQ2FsbGJhY2sKLVRFU1RfUChBQXVkaW9JbnB1dFN0cmVhbUNhbGxiYWNrVGVzdCwgdGVzdFJlY29yZGluZykgewotICAgIGlmICghbVNldHVwU3VjY2VzZnVsKSByZXR1cm47Ci0KLSAgICBjb25zdCBpbnQzMl90IGZyYW1lc1BlckRhdGFDYWxsYmFjayA9IHN0ZDo6Z2V0PFBBUkFNX0ZSQU1FU19QRVJfQ0I+KEdldFBhcmFtKCkpOwotICAgIGNvbnN0IGludDMyX3QgYWN0dWFsRnJhbWVzUGVyRGF0YUNhbGxiYWNrID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1BlckRhdGFDYWxsYmFjayhzdHJlYW0oKSk7Ci0gICAgaWYgKGZyYW1lc1BlckRhdGFDYWxsYmFjayAhPSBBQVVESU9fVU5TUEVDSUZJRUQpIHsKLSAgICAgICAgQVNTRVJUX0VRKGZyYW1lc1BlckRhdGFDYWxsYmFjaywgYWN0dWFsRnJhbWVzUGVyRGF0YUNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICBtQ2JEYXRhLT5yZXNldChhY3R1YWxGcmFtZXNQZXJEYXRhQ2FsbGJhY2spOwotCi0gICAgbUhlbHBlci0+c3RhcnRTdHJlYW0oKTsKLSAgICAvLyBTZWUgYi82MjA5MDExMy4gRm9yIGxlZ2FjeSBwYXRoLCB0aGUgZGV2aWNlIGlzIG9ubHkga25vd24gYWZ0ZXIKLSAgICAvLyB0aGUgc3RyZWFtIGhhcyBiZWVuIHN0YXJ0ZWQuCi0gICAgRVhQRUNUX05FKEFBVURJT19VTlNQRUNJRklFRCwgQUF1ZGlvU3RyZWFtX2dldERldmljZUlkKHN0cmVhbSgpKSk7Ci0gICAgc2xlZXAoMik7IC8vIGxldCB0aGUgc3RyZWFtIHJ1bgotCi0gICAgQVNTRVJUX0VRKEFBVURJT19PSywgbUNiRGF0YS0+Y2FsbGJhY2tFcnJvcik7Ci0gICAgQVNTRVJUX0dUKG1DYkRhdGEtPmNhbGxiYWNrQ291bnQsIDEwKTsKLQotICAgIG1IZWxwZXItPnN0b3BTdHJlYW0oKTsKLQotICAgIGludDMyX3Qgb2xkQ2FsbGJhY2tDb3VudCA9IG1DYkRhdGEtPmNhbGxiYWNrQ291bnQ7Ci0gICAgRVhQRUNUX0dUKG9sZENhbGxiYWNrQ291bnQsIDEwKTsKLSAgICBzbGVlcCgxKTsKLSAgICBFWFBFQ1RfRVEob2xkQ2FsbGJhY2tDb3VudCwgbUNiRGF0YS0+Y2FsbGJhY2tDb3VudCk7IC8vIGV4cGVjdCBub3QgYWR2YW5jaW5nCi0KLSAgICBpZiAoZnJhbWVzUGVyRGF0YUNhbGxiYWNrICE9IEFBVURJT19VTlNQRUNJRklFRCkgewotICAgICAgICBBU1NFUlRfRVEoZnJhbWVzUGVyRGF0YUNhbGxiYWNrLCBtQ2JEYXRhLT5hY3R1YWxGcmFtZXNQZXJDYWxsYmFjayk7Ci0gICAgfQotCi0gICAgQVNTRVJUX0VRKEFBVURJT19PSywgbUNiRGF0YS0+Y2FsbGJhY2tFcnJvcik7Ci19Ci0KLUlOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFNQTSwgQUF1ZGlvSW5wdXRTdHJlYW1DYWxsYmFja1Rlc3QsCi0gICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKAotICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVELAotICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX1VOU1BFQ0lGSUVELAotICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORSksCi0gICAgICAgICAgICAgICAgLy8gY2IgYnVmZmVyIHNpemU6IGFyYml0cmFyeSBwcmltZSBudW1iZXIgPCAxOTIKLSAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQsIDEwOSwgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORSksCi0gICAgICAgICAgICAgICAgLy8gY2IgYnVmZmVyIHNpemU6IGFyYml0cmFyeSBwcmltZSBudW1iZXIgPiAxOTIKLSAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQsIDIyMywgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORSksCi0gICAgICAgICAgICAgICAgLy8gUmVjb3JkaW5nIGluIFBPV0VSX1NBVklORyBtb2RlIGlzbid0IHN1cHBvcnRlZCwgYi82MjI5MTc3NS4KLSAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19VTlNQRUNJRklFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZKSksCi0gICAgICAgICZnZXRUZXN0TmFtZSk7Ci0KLQotY2xhc3MgQUF1ZGlvT3V0cHV0U3RyZWFtQ2FsbGJhY2tUZXN0IDogcHVibGljIEFBdWRpb1N0cmVhbUNhbGxiYWNrVGVzdDxPdXRwdXRTdHJlYW1CdWlsZGVySGVscGVyPiB7Ci0gIHByb3RlY3RlZDoKLSAgICB2b2lkIFNldFVwKCkgb3ZlcnJpZGU7Ci0KLSAgICBzdGF0aWMgYWF1ZGlvX2RhdGFfY2FsbGJhY2tfcmVzdWx0X3QgTXlEYXRhQ2FsbGJhY2tQcm9jKAotICAgICAgICAgICAgQUF1ZGlvU3RyZWFtICpzdHJlYW0sIHZvaWQgKnVzZXJEYXRhLCB2b2lkICphdWRpb0RhdGEsIGludDMyX3QgbnVtRnJhbWVzKTsKLX07Ci0KLS8vIENhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgZmlsbHMgdGhlIGF1ZGlvIG91dHB1dCBidWZmZXIuCi1hYXVkaW9fZGF0YV9jYWxsYmFja19yZXN1bHRfdCBBQXVkaW9PdXRwdXRTdHJlYW1DYWxsYmFja1Rlc3Q6Ok15RGF0YUNhbGxiYWNrUHJvYygKLSAgICAgICAgQUF1ZGlvU3RyZWFtICpzdHJlYW0sIHZvaWQgKnVzZXJEYXRhLCB2b2lkICphdWRpb0RhdGEsIGludDMyX3QgbnVtRnJhbWVzKSB7Ci0gICAgaW50MzJfdCBjaGFubmVsQ291bnQgPSBBQXVkaW9TdHJlYW1fZ2V0Q2hhbm5lbENvdW50KHN0cmVhbSk7Ci0gICAgaW50MzJfdCBudW1TYW1wbGVzID0gY2hhbm5lbENvdW50ICogbnVtRnJhbWVzOwotICAgIGlmIChBQXVkaW9TdHJlYW1fZ2V0Rm9ybWF0KHN0cmVhbSkgPT0gQUFVRElPX0ZPUk1BVF9QQ01fSTE2KSB7Ci0gICAgICAgIGludDE2X3QgKnNob3J0RGF0YSA9IChpbnQxNl90ICopIGF1ZGlvRGF0YTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspICpzaG9ydERhdGErKyA9IDA7Ci0gICAgfSBlbHNlIGlmIChBQXVkaW9TdHJlYW1fZ2V0Rm9ybWF0KHN0cmVhbSkgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKLSAgICAgICAgZmxvYXQgKmZsb2F0RGF0YSA9IChmbG9hdCAqKSBhdWRpb0RhdGE7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtU2FtcGxlczsgaSsrKSAqZmxvYXREYXRhKysgPSAwLjBmOwotICAgIH0KLQotICAgIEFBdWRpb0NhbGxiYWNrVGVzdERhdGEgKm15RGF0YSA9IHN0YXRpY19jYXN0PEFBdWRpb0NhbGxiYWNrVGVzdERhdGEqPih1c2VyRGF0YSk7Ci0gICAgbXlEYXRhLT51cGRhdGVGcmFtZUNvdW50KG51bUZyYW1lcyk7Ci0gICAgbXlEYXRhLT51cGRhdGVMYXRlbmN5KG1lYXN1cmVMYXRlbmN5KHN0cmVhbSkpOwotICAgIG15RGF0YS0+Y2FsbGJhY2tDb3VudCsrOwotICAgIHJldHVybiBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX0NPTlRJTlVFOwotfQotCi12b2lkIEFBdWRpb091dHB1dFN0cmVhbUNhbGxiYWNrVGVzdDo6U2V0VXAoKSB7Ci0gICAgbUhlbHBlci5yZXNldChuZXcgT3V0cHV0U3RyZWFtQnVpbGRlckhlbHBlcigKLSAgICAgICAgICAgICAgICAgICAgc3RkOjpnZXQ8UEFSQU1fU0hBUklOR19NT0RFPihHZXRQYXJhbSgpKSwKLSAgICAgICAgICAgICAgICAgICAgc3RkOjpnZXQ8UEFSQU1fUEVSRl9NT0RFPihHZXRQYXJhbSgpKSkpOwotICAgIG1IZWxwZXItPmluaXRCdWlsZGVyKCk7Ci0KLSAgICBpbnQzMl90IGZyYW1lc1BlckRhdGFDYWxsYmFjayA9IHN0ZDo6Z2V0PFBBUkFNX0ZSQU1FU19QRVJfQ0I+KEdldFBhcmFtKCkpOwotICAgIG1DYkRhdGEucmVzZXQobmV3IEFBdWRpb0NhbGxiYWNrVGVzdERhdGEoKSk7Ci0gICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRFcnJvckNhbGxiYWNrKGJ1aWxkZXIoKSwgJk15RXJyb3JDYWxsYmFja1Byb2MsIG1DYkRhdGEuZ2V0KCkpOwotICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RGF0YUNhbGxiYWNrKGJ1aWxkZXIoKSwgJk15RGF0YUNhbGxiYWNrUHJvYywgbUNiRGF0YS5nZXQoKSk7Ci0gICAgaWYgKGZyYW1lc1BlckRhdGFDYWxsYmFjayAhPSBBQVVESU9fVU5TUEVDSUZJRUQpIHsKLSAgICAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRGcmFtZXNQZXJEYXRhQ2FsbGJhY2soYnVpbGRlcigpLCBmcmFtZXNQZXJEYXRhQ2FsbGJhY2spOwotICAgIH0KLQotICAgIG1TZXR1cFN1Y2Nlc2Z1bCA9IGZhbHNlOwotICAgIG1IZWxwZXItPmNyZWF0ZUFuZFZlcmlmeVN0cmVhbSgmbVNldHVwU3VjY2VzZnVsKTsKLX0KLQotLy8gVGVzdCBXcml0aW5nIHRvIGFuIEFBdWRpb1N0cmVhbSB1c2luZyBhIENhbGxiYWNrCi1URVNUX1AoQUF1ZGlvT3V0cHV0U3RyZWFtQ2FsbGJhY2tUZXN0LCB0ZXN0UGxheWJhY2spIHsKLSAgICBpZiAoIW1TZXR1cFN1Y2Nlc2Z1bCkgcmV0dXJuOwotCi0gICAgY29uc3QgaW50MzJfdCBmcmFtZXNQZXJEYXRhQ2FsbGJhY2sgPSBzdGQ6OmdldDxQQVJBTV9GUkFNRVNfUEVSX0NCPihHZXRQYXJhbSgpKTsKLSAgICBjb25zdCBpbnQzMl90IGFjdHVhbEZyYW1lc1BlckRhdGFDYWxsYmFjayA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNQZXJEYXRhQ2FsbGJhY2soc3RyZWFtKCkpOwotICAgIGlmIChmcmFtZXNQZXJEYXRhQ2FsbGJhY2sgIT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7Ci0gICAgICAgIEFTU0VSVF9FUShmcmFtZXNQZXJEYXRhQ2FsbGJhY2ssIGFjdHVhbEZyYW1lc1BlckRhdGFDYWxsYmFjayk7Ci0gICAgfQotCi0gICAgLy8gU3RhcnQvc3RvcCBtb3JlIHRoYW4gb25jZSB0byBzZWUgaWYgaXQgZmFpbHMgYWZ0ZXIgdGhlIGZpcnN0IHRpbWUuCi0gICAgLy8gV3JpdGUgc29tZSBkYXRhIGFuZCBtZWFzdXJlIHRoZSByYXRlIHRvIHNlZSBpZiB0aGUgdGltaW5nIGlzIE9LLgotICAgIGZvciAoaW50IGxvb3BJbmRleCA9IDA7IGxvb3BJbmRleCA8IDI7IGxvb3BJbmRleCsrKSB7Ci0gICAgICAgIG1DYkRhdGEtPnJlc2V0KGFjdHVhbEZyYW1lc1BlckRhdGFDYWxsYmFjayk7Ci0KLSAgICAgICAgbUhlbHBlci0+c3RhcnRTdHJlYW0oKTsKLSAgICAgICAgLy8gU2VlIGIvNjIwOTAxMTMuIEZvciBsZWdhY3kgcGF0aCwgdGhlIGRldmljZSBpcyBvbmx5IGtub3duIGFmdGVyCi0gICAgICAgIC8vIHRoZSBzdHJlYW0gaGFzIGJlZW4gc3RhcnRlZC4KLSAgICAgICAgRVhQRUNUX05FKEFBVURJT19VTlNQRUNJRklFRCwgQUF1ZGlvU3RyZWFtX2dldERldmljZUlkKHN0cmVhbSgpKSk7Ci0gICAgICAgIHNsZWVwKDIpOyAvLyBsZXQgdGhlIHN0cmVhbSBydW4KLQotICAgICAgICBBU1NFUlRfRVEoQUFVRElPX09LLCBtQ2JEYXRhLT5jYWxsYmFja0Vycm9yKTsKLSAgICAgICAgQVNTRVJUX0dUKG1DYkRhdGEtPmNhbGxiYWNrQ291bnQsIDEwKTsKLQotICAgICAgICAvLyBGb3IgbW9yZSBjb3ZlcmFnZSwgYWx0ZXJuYXRlIHBhdXNpbmcgYW5kIHN0b3BwaW5nLgotICAgICAgICBpZiAoKGxvb3BJbmRleCAmIDEpID09IDApIHsKLSAgICAgICAgICAgIG1IZWxwZXItPnBhdXNlU3RyZWFtKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtSGVscGVyLT5zdG9wU3RyZWFtKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQzMl90IG9sZENhbGxiYWNrQ291bnQgPSBtQ2JEYXRhLT5jYWxsYmFja0NvdW50OwotICAgICAgICBFWFBFQ1RfR1Qob2xkQ2FsbGJhY2tDb3VudCwgMTApOwotICAgICAgICBzbGVlcCgxKTsKLSAgICAgICAgRVhQRUNUX0VRKG9sZENhbGxiYWNrQ291bnQsIG1DYkRhdGEtPmNhbGxiYWNrQ291bnQpOyAvLyBleHBlY3Qgbm90IGFkdmFuY2luZwotCi0gICAgICAgIGlmIChmcmFtZXNQZXJEYXRhQ2FsbGJhY2sgIT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7Ci0gICAgICAgICAgICBBU1NFUlRfRVEoZnJhbWVzUGVyRGF0YUNhbGxiYWNrLCBtQ2JEYXRhLT5hY3R1YWxGcmFtZXNQZXJDYWxsYmFjayk7Ci0gICAgICAgIH0KLQotICAgICAgICBFWFBFQ1RfR0UobUNiRGF0YS0+bWluTGF0ZW5jeSwgMSk7ICAgLy8gQWJzdXJkbHkgbG93Ci0gICAgICAgIEVYUEVDVF9MRShtQ2JEYXRhLT5tYXhMYXRlbmN5LCAzMDApOyAvLyBBYnN1cmRseSBoaWdoLCBzaG91bGQgYmUgPCAzMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgb24gc29tZSBkZXZpY2VzIGl0J3MgMjAwLXNvbWV0aGluZwotICAgICAgICAvL3ByaW50ZigibGF0ZW5jeTogJWQsICVkXG4iLCBtQ2JEYXRhLT5taW5MYXRlbmN5LCBtQ2JEYXRhLT5tYXhMYXRlbmN5KTsKLSAgICB9Ci0KLSAgICBBU1NFUlRfRVEoQUFVRElPX09LLCBtQ2JEYXRhLT5jYWxsYmFja0Vycm9yKTsKLX0KLQotSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoU1BNLCBBQXVkaW9PdXRwdXRTdHJlYW1DYWxsYmFja1Rlc3QsCi0gICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKAotICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVELAotICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX1VOU1BFQ0lGSUVELAotICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORSksCi0gICAgICAgICAgICAgICAgLy8gY2IgYnVmZmVyIHNpemU6IGFyYml0cmFyeSBwcmltZSBudW1iZXIgPCAxOTIKLSAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQsIDEwOSwgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORSksCi0gICAgICAgICAgICAgICAgLy8gY2IgYnVmZmVyIHNpemU6IGFyYml0cmFyeSBwcmltZSBudW1iZXIgPiAxOTIKLSAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQsIDIyMywgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORSksCi0gICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKAotICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fVU5TUEVDSUZJRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9QT1dFUl9TQVZJTkcpLAotICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVELAotICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX1VOU1BFQ0lGSUVELAotICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1kpKSwKLSAgICAgICAgJmdldFRlc3ROYW1lKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL25hdGl2ZW1lZGlhL2FhdWRpby9zcmMvdGVzdF9hYXVkaW9fbWlzYy5jcHAgYi90ZXN0cy90ZXN0cy9uYXRpdmVtZWRpYS9hYXVkaW8vc3JjL3Rlc3RfYWF1ZGlvX21pc2MuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmM5ZjQyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL3Rlc3RzL25hdGl2ZW1lZGlhL2FhdWRpby9zcmMvdGVzdF9hYXVkaW9fbWlzYy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIsIEVOVU1fQ0FOTk9UX0NIQU5HRSk7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIkFBdWRpb1Rlc3QiCi0KLSNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9sb2cuaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0vLyBNYWtlIHN1cmUgZW51bXMgZG8gbm90IGNoYW5nZSB2YWx1ZS4KLVRFU1QodGVzdF9hYXVkaW9fbWlzYywgYWF1ZGlvX2ZyZWV6ZV9lbnVtcykgewotCi0jZGVmaW5lIEVOVU1fQ0FOTk9UX0NIQU5HRSAiZW51bSBpbiBBUEkgY2Fubm90IGNoYW5nZSIKLQotICAgIHN0YXRpY19hc3NlcnQoMCA9PSBBQVVESU9fRElSRUNUSU9OX09VVFBVVCwgRU5VTV9DQU5OT1RfQ0hBTkdFKTsKLSAgICBzdGF0aWNfYXNzZXJ0KDEgPT0gQUFVRElPX0RJUkVDVElPTl9JTlBVVCwgRU5VTV9DQU5OT1RfQ0hBTkdFKTsKLQotICAgIHN0YXRpY19hc3NlcnQoLTEgPT0gQUFVRElPX0ZPUk1BVF9JTlZBTElELCBFTlVNX0NBTk5PVF9DSEFOR0UpOwotICAgIHN0YXRpY19hc3NlcnQoMCA9PSBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVELCBFTlVNX0NBTk5PVF9DSEFOR0UpOwotICAgIHN0YXRpY19hc3NlcnQoMSA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYsIEVOVU1fQ0FOTk9UX0NIQU5HRSk7Ci0gICAgc3RhdGljX2Fzc2VydCgyID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FULCBFTlVNX0NBTk5PVF9DSEFOR0UpOwotCi0gICAgc3RhdGljX2Fzc2VydCgwID09IEFBVURJT19PSywgRU5VTV9DQU5OT1RfQ0hBTkdFKTsKLSAgICBzdGF0aWNfYXNzZXJ0KC05MDAgPT0gQUFVRElPX0VSUk9SX0JBU0UsIEVOVU1fQ0FOTk9UX0NIQU5HRSk7Ci0gICAgc3RhdGljX2Fzc2VydCgtODk5ID09IEFBVURJT19FUlJPUl9ESVNDT05ORUNURUQsIEVOVU1fQ0FOTk9UX0NIQU5HRSk7Ci0gICAgc3RhdGljX2Fzc2VydCgtODk4ID09IEFBVURJT19FUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBFTlVNX0NBTk5PVF9DSEFOR0UpOwotICAgIC8vIHJlc2VydmVkCi0gICAgc3RhdGljX2Fzc2VydCgtODk2ID09IEFBVURJT19FUlJPUl9JTlRFUk5BTCwgRU5VTV9DQU5OT1RfQ0hBTkdFKTsKLSAgICBzdGF0aWNfYXNzZXJ0KC04OTUgPT0gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEUsIEVOVU1fQ0FOTk9UX0NIQU5HRSk7Ci0gICAgLy8gcmVzZXJ2ZWQKLSAgICAvLyByZXNlcnZlZAotICAgIHN0YXRpY19hc3NlcnQoLTg5MiA9PSBBQVVESU9fRVJST1JfSU5WQUxJRF9IQU5ETEUsIEVOVU1fQ0FOTk9UX0NIQU5HRSk7Ci0gICAgLy8gcmVzZXJ2ZWQKLSAgICBzdGF0aWNfYXNzZXJ0KC04OTAgPT0gQUFVRElPX0VSUk9SX1VOSU1QTEVNRU5URUQsIEVOVU1fQ0FOTk9UX0NIQU5HRSk7Ci0gICAgc3RhdGljX2Fzc2VydCgtODg5ID09IEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRSwgRU5VTV9DQU5OT1RfQ0hBTkdFKTsKLSAgICBzdGF0aWNfYXNzZXJ0KC04ODggPT0gQUFVRElPX0VSUk9SX05PX0ZSRUVfSEFORExFUywgRU5VTV9DQU5OT1RfQ0hBTkdFKTsKLSAgICBzdGF0aWNfYXNzZXJ0KC04ODcgPT0gQUFVRElPX0VSUk9SX05PX01FTU9SWSwgRU5VTV9DQU5OT1RfQ0hBTkdFKTsKLSAgICBzdGF0aWNfYXNzZXJ0KC04ODYgPT0gQUFVRElPX0VSUk9SX05VTEwsIEVOVU1fQ0FOTk9UX0NIQU5HRSk7Ci0gICAgc3RhdGljX2Fzc2VydCgtODg1ID09IEFBVURJT19FUlJPUl9USU1FT1VULCBFTlVNX0NBTk5PVF9DSEFOR0UpOwotICAgIHN0YXRpY19hc3NlcnQoLTg4NCA9PSBBQVVESU9fRVJST1JfV09VTERfQkxPQ0ssIEVOVU1fQ0FOTk9UX0NIQU5HRSk7Ci0gICAgc3RhdGljX2Fzc2VydCgtODgzID09IEFBVURJT19FUlJPUl9JTlZBTElEX0ZPUk1BVCwgRU5VTV9DQU5OT1RfQ0hBTkdFKTsKLSAgICBzdGF0aWNfYXNzZXJ0KC04ODIgPT0gQUFVRElPX0VSUk9SX09VVF9PRl9SQU5HRSwgRU5VTV9DQU5OT1RfQ0hBTkdFKTsKLSAgICBzdGF0aWNfYXNzZXJ0KC04ODEgPT0gQUFVRElPX0VSUk9SX05PX1NFUlZJQ0UsIEVOVU1fQ0FOTk9UX0NIQU5HRSk7Ci0KLSAgICBzdGF0aWNfYXNzZXJ0KDAgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9VTklOSVRJQUxJWkVELCBFTlVNX0NBTk5PVF9DSEFOR0UpOwotICAgIHN0YXRpY19hc3NlcnQoMSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX1VOS05PV04sIEVOVU1fQ0FOTk9UX0NIQU5HRSk7Ci0gICAgc3RhdGljX2Fzc2VydCgyID09IEFBVURJT19TVFJFQU1fU1RBVEVfT1BFTiwgRU5VTV9DQU5OT1RfQ0hBTkdFKTsKLSAgICBzdGF0aWNfYXNzZXJ0KDMgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVElORywgRU5VTV9DQU5OT1RfQ0hBTkdFKTsKLSAgICBzdGF0aWNfYXNzZXJ0KDQgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVEVELCBFTlVNX0NBTk5PVF9DSEFOR0UpOwotICAgIHN0YXRpY19hc3NlcnQoNSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX1BBVVNJTkcsIEVOVU1fQ0FOTk9UX0NIQU5HRSk7Ci0gICAgc3RhdGljX2Fzc2VydCg2ID09IEFBVURJT19TVFJFQU1fU1RBVEVfUEFVU0VELCBFTlVNX0NBTk5PVF9DSEFOR0UpOwotICAgIHN0YXRpY19hc3NlcnQoNyA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX0ZMVVNISU5HLCBFTlVNX0NBTk5PVF9DSEFOR0UpOwotICAgIHN0YXRpY19hc3NlcnQoOCA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX0ZMVVNIRUQsIEVOVU1fQ0FOTk9UX0NIQU5HRSk7Ci0gICAgc3RhdGljX2Fzc2VydCg5ID09IEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBJTkcsIEVOVU1fQ0FOTk9UX0NIQU5HRSk7Ci0gICAgc3RhdGljX2Fzc2VydCgxMCA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX1NUT1BQRUQsIEVOVU1fQ0FOTk9UX0NIQU5HRSk7Ci0gICAgc3RhdGljX2Fzc2VydCgxMSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NJTkcsIEVOVU1fQ0FOTk9UX0NIQU5HRSk7Ci0gICAgc3RhdGljX2Fzc2VydCgxMiA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NFRCwgRU5VTV9DQU5OT1RfQ0hBTkdFKTsKLQotICAgIHN0YXRpY19hc3NlcnQoMCA9PSBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSwgRU5VTV9DQU5OT1RfQ0hBTkdFKTsKLSAgICBzdGF0aWNfYXNzZXJ0KDEgPT0gQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQsIEVOVU1fQ0FOTk9UX0NIQU5HRSk7Ci0KLSAgICBzdGF0aWNfYXNzZXJ0KDAgPT0gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9DT05USU5VRSwgRU5VTV9DQU5OT1RfQ0hBTkdFKTsKLSAgICBzdGF0aWNfYXNzZXJ0KDEgPT0gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QLCBFTlVNX0NBTk5PVF9DSEFOR0UpOwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbmF0aXZlbWVkaWEvYWF1ZGlvL3NyYy90ZXN0X2FhdWRpb19zdHJlYW1fYnVpbGRlci5jcHAgYi90ZXN0cy90ZXN0cy9uYXRpdmVtZWRpYS9hYXVkaW8vc3JjL3Rlc3RfYWF1ZGlvX3N0cmVhbV9idWlsZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNhYTc1ZC4uMDAwMDAwMAotLS0gYS90ZXN0cy90ZXN0cy9uYXRpdmVtZWRpYS9hYXVkaW8vc3JjL3Rlc3RfYWF1ZGlvX3N0cmVhbV9idWlsZGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMwNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJBQXVkaW9UZXN0IgotCi0jaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgotI2luY2x1ZGUgPGFuZHJvaWQvbG9nLmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotLy8gQ3JlYXRlcyBhIGJ1aWxkZXIsIHRoZSBjYWxsZXIgdGFrZXMgb3duZXJzaGlwCi1zdGF0aWMgdm9pZCBjcmVhdGVfc3RyZWFtX2J1aWxkZXIoQUF1ZGlvU3RyZWFtQnVpbGRlcioqIGFhdWRpb0J1aWxkZXIpIHsKLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvX2NyZWF0ZVN0cmVhbUJ1aWxkZXIoYWF1ZGlvQnVpbGRlcik7Ci0gICAgQVNTRVJUX0VRKEFBVURJT19PSywgcmVzdWx0KTsKLSAgICBBU1NFUlRfTkUobnVsbHB0ciwgKmFhdWRpb0J1aWxkZXIpOwotfQotCi1lbnVtIGNsYXNzIEV4cGVjdCB7IEZBSUwsIFNVQ0NFRUQsIE5PVF9DUkFTSCB9OwotCi0vLyBUcmllcyB0byBvcGVuIGFuIGF1ZGlvIHN0cmVhbSB1c2luZyBhIHByaW1lZCBCdWlsZGVyLgotLy8gVGFrZXMgb3duZXJzaGlwIG9mIHRoZSBCdWlsZGVyLgotc3RhdGljIHZvaWQgdHJ5X29wZW5pbmdfYXVkaW9fc3RyZWFtKEFBdWRpb1N0cmVhbUJ1aWxkZXIgKmFhdWRpb0J1aWxkZXIsIEV4cGVjdCBleHBlY3QpIHsKLSAgICAvLyBDcmVhdGUgYW4gQUF1ZGlvU3RyZWFtIHVzaW5nIHRoZSBCdWlsZGVyLgotICAgIEFBdWRpb1N0cmVhbSAqYWF1ZGlvU3RyZWFtID0gbnVsbHB0cjsKLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKGFhdWRpb0J1aWxkZXIsICZhYXVkaW9TdHJlYW0pOwotICAgIGlmIChleHBlY3QgPT0gRXhwZWN0OjpGQUlMKSB7Ci0gICAgICAgIEFTU0VSVF9ORShBQVVESU9fT0ssIHJlc3VsdCk7Ci0gICAgICAgIEFTU0VSVF9FUShudWxscHRyLCBhYXVkaW9TdHJlYW0pOwotICAgIH0gZWxzZSBpZiAoZXhwZWN0ID09IEV4cGVjdDo6U1VDQ0VFRCkgewotICAgICAgICBBU1NFUlRfRVEoQUFVRElPX09LLCByZXN1bHQpOwotICAgICAgICBBU1NFUlRfTkUobnVsbHB0ciwgYWF1ZGlvU3RyZWFtKTsKLSAgICB9IGVsc2UgeyAvLyBOT1RfQ1JBU0gKLSAgICAgICAgQVNTRVJUX1RSVUUoKChyZXN1bHQgPCAwKSAmJiAoYWF1ZGlvU3RyZWFtID09IG51bGxwdHIpKQotICAgICAgICAgICAgICAgIHx8ICgocmVzdWx0ID09IEFBVURJT19PSykgJiYgKGFhdWRpb1N0cmVhbSAhPSBudWxscHRyKSkpOwotICAgIH0KLQotICAgIC8vIENsZWFudXAKLSAgICBBU1NFUlRfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1CdWlsZGVyX2RlbGV0ZShhYXVkaW9CdWlsZGVyKSk7Ci0gICAgaWYgKGFhdWRpb1N0cmVhbSAhPSBudWxscHRyKSB7Ci0gICAgICAgIEFTU0VSVF9FUShBQVVESU9fT0ssIEFBdWRpb1N0cmVhbV9jbG9zZShhYXVkaW9TdHJlYW0pKTsKLSAgICB9Ci19Ci0KLS8vIFRlc3QgY3JlYXRpbmcgYSBkZWZhdWx0IHN0cmVhbSB3aXRoIHNwZWNpZmljIGRldmljZXMKLXN0YXRpYyB2b2lkIHJ1bnRlc3RfYWF1ZGlvX2RldmljZXMoaW50MzJfdCBkZXZpY2VJZCwgRXhwZWN0IGV4cGVjdCkgewotICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXIgKmFhdWRpb0J1aWxkZXIgPSBudWxscHRyOwotICAgIGNyZWF0ZV9zdHJlYW1fYnVpbGRlcigmYWF1ZGlvQnVpbGRlcik7Ci0gICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXREZXZpY2VJZChhYXVkaW9CdWlsZGVyLCBkZXZpY2VJZCk7Ci0gICAgdHJ5X29wZW5pbmdfYXVkaW9fc3RyZWFtKGFhdWRpb0J1aWxkZXIsIGV4cGVjdCk7Ci19Ci0KLVRFU1QodGVzdF9hYXVkaW8sIGFhdWRpb19zdHJlYW1fZGV2aWNlX3Vuc3BlY2lmaWVkKSB7Ci0gICAgcnVudGVzdF9hYXVkaW9fZGV2aWNlcyhBQVVESU9fVU5TUEVDSUZJRUQsIEV4cGVjdDo6Tk9UX0NSQVNIKTsKLX0KLQotLyogRklYTUUgLSB3aHkgY2FuIHdlIG9wZW4gdGhpcyBkZXZpY2U/IFdoYXQgaXMgYW4gaWxsZWdhbCBkZXZpY2VJZD8KLVRFU1QodGVzdF9hYXVkaW8sIGFhdWRpb19zdHJlYW1fZGV2aWNlX2Fic3VyZCkgewotICAgIHJ1bnRlc3RfYWF1ZGlvX2RldmljZXMoMTk3MzY0NTksIHRydWUpOwotfQotKi8KLS8qIEZJWE1FIHJldmlldwotVEVTVCh0ZXN0X2FhdWRpbywgYWF1ZGlvX3N0cmVhbV9kZXZpY2VfcmVhc29uYWJsZSkgewotICAgIHJ1bnRlc3RfYWF1ZGlvX2RldmljZXMoMSwgZmFsc2UpOwotfQotKi8KLQotLyogRklYTUUgLSB3aHkgY2FuIHdlIG9wZW4gdGhpcyBkZXZpY2U/IFdoYXQgaXMgYW4gaWxsZWdhbCBkZXZpY2VJZD8KLVRFU1QodGVzdF9hYXVkaW8sIGFhdWRpb19zdHJlYW1fZGV2aWNlX25lZ2F0aXZlKSB7Ci0gICAgcnVudGVzdF9hYXVkaW9fZGV2aWNlcygtNzY1LCB0cnVlKTsKLX0KLSovCi0KLS8vIFRlc3QgY3JlYXRpbmcgYSBkZWZhdWx0IHN0cmVhbSB3aXRoIGV2ZXJ5dGhpbmcgdW5zcGVjaWZpZWQuCi1URVNUKHRlc3RfYWF1ZGlvLCBhYXVkaW9fc3RyZWFtX3Vuc3BlY2lmaWVkKSB7Ci0gICAgQUF1ZGlvU3RyZWFtQnVpbGRlciAqYWF1ZGlvQnVpbGRlciA9IG51bGxwdHI7Ci0gICAgY3JlYXRlX3N0cmVhbV9idWlsZGVyKCZhYXVkaW9CdWlsZGVyKTsKLQotICAgIC8vIENyZWF0ZSBhbiBBQXVkaW9TdHJlYW0gdXNpbmcgdGhlIEJ1aWxkZXIuCi0gICAgQUF1ZGlvU3RyZWFtICphYXVkaW9TdHJlYW0gPSBudWxscHRyOwotICAgIEFTU0VSVF9FUShBQVVESU9fT0ssIEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbShhYXVkaW9CdWlsZGVyLCAmYWF1ZGlvU3RyZWFtKSk7Ci0gICAgQVNTRVJUX05FKG51bGxwdHIsIGFhdWRpb1N0cmVhbSk7Ci0KLSAgICAvLyBDbGVhbnVwCi0gICAgRVhQRUNUX0VRKEFBVURJT19PSywgQUF1ZGlvU3RyZWFtQnVpbGRlcl9kZWxldGUoYWF1ZGlvQnVpbGRlcikpOwotICAgIEVYUEVDVF9FUShBQVVESU9fT0ssIEFBdWRpb1N0cmVhbV9jbG9zZShhYXVkaW9TdHJlYW0pKTsKLX0KLQotY2xhc3MgQUF1ZGlvU3RyZWFtQnVpbGRlclNhbXBsaW5nUmF0ZVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPGludDMyX3Q+IHsKLSAgcHVibGljOgotICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRUZXN0TmFtZShjb25zdCA6OnRlc3Rpbmc6OlRlc3RQYXJhbUluZm88aW50MzJfdD4mIGluZm8pIHsKLSAgICAgICAgcmV0dXJuIGluZm8ucGFyYW0gPj0gMCA/IHN0ZDo6dG9fc3RyaW5nKGluZm8ucGFyYW0pIDogIl8iICsgc3RkOjp0b19zdHJpbmcoLWluZm8ucGFyYW0pOwotICAgIH0KLSAgcHJvdGVjdGVkOgotICAgIHN0YXRpYyBib29sIGlzVmFsaWRTYW1wbGluZ1JhdGUoaW50MzJfdCBzcikgewotICAgICAgICByZXR1cm4gc3IgPT0gQUFVRElPX1VOU1BFQ0lGSUVEIHx8IChzciA+PSA4MDAwICYmIHNyIDw9IDEwMDAwMDApOwotICAgIH0KLX07Ci0KLVRFU1RfUChBQXVkaW9TdHJlYW1CdWlsZGVyU2FtcGxpbmdSYXRlVGVzdCwgb3BlblN0cmVhbSkgewotICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXIgKmFhdWRpb0J1aWxkZXIgPSBudWxscHRyOwotICAgIGNyZWF0ZV9zdHJlYW1fYnVpbGRlcigmYWF1ZGlvQnVpbGRlcik7Ci0gICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTYW1wbGVSYXRlKGFhdWRpb0J1aWxkZXIsIEdldFBhcmFtKCkpOwotICAgIHRyeV9vcGVuaW5nX2F1ZGlvX3N0cmVhbSgKLSAgICAgICAgICAgIGFhdWRpb0J1aWxkZXIsIGlzVmFsaWRTYW1wbGluZ1JhdGUoR2V0UGFyYW0oKSkgPyBFeHBlY3Q6OlNVQ0NFRUQgOiBFeHBlY3Q6OkZBSUwpOwotfQotCi1JTlNUQU5USUFURV9URVNUX0NBU0VfUChTUiwgQUF1ZGlvU3RyZWFtQnVpbGRlclNhbXBsaW5nUmF0ZVRlc3QsCi0gICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKAotICAgICAgICAgICAgICAgIC8vIENvbW1vbmx5IHVzZWQgdmFsdWVzCi0gICAgICAgICAgICAgICAgQUFVRElPX1VOU1BFQ0lGSUVELCA4MDAwLCAxMTAyNSwgMTYwMDAsIDIyMDUwLCA0NDEwMCwgNDgwMDAsIDg4MjAwLCA5NjAwMCwKLSAgICAgICAgICAgICAgICAxNzY0MDAsIDE5MjAwMCwgMzg0MDAwLAotICAgICAgICAgICAgICAgIC8vIE9kZCB2YWx1ZXMKLSAgICAgICAgICAgICAgICBBQVVESU9fVU5TUEVDSUZJRUQgLSAxLCBBQVVESU9fVU5TUEVDSUZJRUQgKyAxLCAxMjM0LCAxMDAwMDAwMCksCi0gICAgICAgICZBQXVkaW9TdHJlYW1CdWlsZGVyU2FtcGxpbmdSYXRlVGVzdDo6Z2V0VGVzdE5hbWUpOwotCi1jbGFzcyBBQXVkaW9TdHJlYW1CdWlsZGVyQ2hhbm5lbENvdW50VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08aW50MzJfdD4gewotICBwdWJsaWM6Ci0gICAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldFRlc3ROYW1lKGNvbnN0IDo6dGVzdGluZzo6VGVzdFBhcmFtSW5mbzxpbnQzMl90PiYgaW5mbykgewotICAgICAgICByZXR1cm4gaW5mby5wYXJhbSA+PSAwID8gc3RkOjp0b19zdHJpbmcoaW5mby5wYXJhbSkgOiAiXyIgKyBzdGQ6OnRvX3N0cmluZygtaW5mby5wYXJhbSk7Ci0gICAgfQotICBwcm90ZWN0ZWQ6Ci0gICAgc3RhdGljIGJvb2wgaXNWYWxpZENoYW5uZWxDb3VudChpbnQzMl90IGNjKSB7Ci0gICAgICAgIHJldHVybiBjYyA9PSBBQVVESU9fVU5TUEVDSUZJRUQgfHwgKGNjID49IDEgJiYgY2MgPD0gOCk7Ci0gICAgfQotfTsKLQotVEVTVF9QKEFBdWRpb1N0cmVhbUJ1aWxkZXJDaGFubmVsQ291bnRUZXN0LCBvcGVuU3RyZWFtKSB7Ci0gICAgQUF1ZGlvU3RyZWFtQnVpbGRlciAqYWF1ZGlvQnVpbGRlciA9IG51bGxwdHI7Ci0gICAgY3JlYXRlX3N0cmVhbV9idWlsZGVyKCZhYXVkaW9CdWlsZGVyKTsKLSAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldENoYW5uZWxDb3VudChhYXVkaW9CdWlsZGVyLCBHZXRQYXJhbSgpKTsKLSAgICB0cnlfb3BlbmluZ19hdWRpb19zdHJlYW0oCi0gICAgICAgICAgICBhYXVkaW9CdWlsZGVyLCBpc1ZhbGlkQ2hhbm5lbENvdW50KEdldFBhcmFtKCkpID8gRXhwZWN0OjpTVUNDRUVEIDogRXhwZWN0OjpGQUlMKTsKLX0KLQotSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQ0MsIEFBdWRpb1N0cmVhbUJ1aWxkZXJDaGFubmVsQ291bnRUZXN0LAotICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygKLSAgICAgICAgICAgICAgICAvLyBSZWFzb25hYmxlIHZhbHVlcwotICAgICAgICAgICAgICAgIEFBVURJT19VTlNQRUNJRklFRCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwKLSAgICAgICAgICAgICAgICAvLyBPZGQgdmFsdWVzCi0gICAgICAgICAgICAgICAgQUFVRElPX1VOU1BFQ0lGSUVEIC0gMSwgOSwgMTAwLCAxMDAwMDAwLCAxMDAwMDAwMCksCi0gICAgICAgICZBQXVkaW9TdHJlYW1CdWlsZGVyQ2hhbm5lbENvdW50VGVzdDo6Z2V0VGVzdE5hbWUpOwotCi1jbGFzcyBBQXVkaW9TdHJlYW1CdWlsZGVyRm9ybWF0VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08YWF1ZGlvX2Zvcm1hdF90PiB7Ci0gIHB1YmxpYzoKLSAgICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0VGVzdE5hbWUoY29uc3QgOjp0ZXN0aW5nOjpUZXN0UGFyYW1JbmZvPGFhdWRpb19mb3JtYXRfdD4mIGluZm8pIHsKLSAgICAgICAgcmV0dXJuIGluZm8ucGFyYW0gPj0gMCA/IHN0ZDo6dG9fc3RyaW5nKGluZm8ucGFyYW0pIDogIl8iICsgc3RkOjp0b19zdHJpbmcoLWluZm8ucGFyYW0pOwotICAgIH0KLSAgcHJvdGVjdGVkOgotICAgIHN0YXRpYyBib29sIGlzVmFsaWRGb3JtYXQoYWF1ZGlvX2Zvcm1hdF90IGYpIHsKLSAgICAgICAgc3dpdGNoIChmKSB7Ci0gICAgICAgICAgICBjYXNlIEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQ6Ci0gICAgICAgICAgICBjYXNlIEFBVURJT19GT1JNQVRfUENNX0kxNjoKLSAgICAgICAgICAgIGNhc2UgQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX07Ci0KLVRFU1RfUChBQXVkaW9TdHJlYW1CdWlsZGVyRm9ybWF0VGVzdCwgb3BlblN0cmVhbSkgewotICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXIgKmFhdWRpb0J1aWxkZXIgPSBudWxscHRyOwotICAgIGNyZWF0ZV9zdHJlYW1fYnVpbGRlcigmYWF1ZGlvQnVpbGRlcik7Ci0gICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRGb3JtYXQoYWF1ZGlvQnVpbGRlciwgR2V0UGFyYW0oKSk7Ci0gICAgdHJ5X29wZW5pbmdfYXVkaW9fc3RyZWFtKAotICAgICAgICAgICAgYWF1ZGlvQnVpbGRlciwgaXNWYWxpZEZvcm1hdChHZXRQYXJhbSgpKSA/IEV4cGVjdDo6U1VDQ0VFRCA6IEV4cGVjdDo6RkFJTCk7Ci19Ci0KLUlOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKEYsIEFBdWRpb1N0cmVhbUJ1aWxkZXJGb3JtYXRUZXN0LAotICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygKLSAgICAgICAgICAgICAgICAvLyBSZWFzb25hYmxlIHZhbHVlcwotICAgICAgICAgICAgICAgIEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQsIEFBVURJT19GT1JNQVRfUENNX0kxNiwgQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQsCi0gICAgICAgICAgICAgICAgLy8gT2RkIHZhbHVlcwotICAgICAgICAgICAgICAgIEFBVURJT19GT1JNQVRfSU5WQUxJRCwgQUFVRElPX0ZPUk1BVF9JTlZBTElEIC0gMSwgMTAwLCAxMDAwMDAwLCAxMDAwMDAwMCksCi0gICAgICAgICZBQXVkaW9TdHJlYW1CdWlsZGVyRm9ybWF0VGVzdDo6Z2V0VGVzdE5hbWUpOwotCi1jbGFzcyBBQXVkaW9TdHJlYW1CdWlsZGVyU2hhcmluZ01vZGVUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxhYXVkaW9fc2hhcmluZ19tb2RlX3Q+IHsKLSAgcHVibGljOgotICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRUZXN0TmFtZShjb25zdCA6OnRlc3Rpbmc6OlRlc3RQYXJhbUluZm88YWF1ZGlvX3NoYXJpbmdfbW9kZV90PiYgaW5mbykgewotICAgICAgICByZXR1cm4gaW5mby5wYXJhbSA+PSAwID8gc3RkOjp0b19zdHJpbmcoaW5mby5wYXJhbSkgOiAiXyIgKyBzdGQ6OnRvX3N0cmluZygtaW5mby5wYXJhbSk7Ci0gICAgfQotICBwcm90ZWN0ZWQ6Ci0gICAgc3RhdGljIGJvb2wgaXNWYWxpZFNoYXJpbmdNb2RlKGFhdWRpb19zaGFyaW5nX21vZGVfdCBmKSB7Ci0gICAgICAgIHJldHVybiBmID09IEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEIHx8IGYgPT0gQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkU7Ci0gICAgfQotfTsKLQotVEVTVF9QKEFBdWRpb1N0cmVhbUJ1aWxkZXJTaGFyaW5nTW9kZVRlc3QsIG9wZW5TdHJlYW0pIHsKLSAgICBBQXVkaW9TdHJlYW1CdWlsZGVyICphYXVkaW9CdWlsZGVyID0gbnVsbHB0cjsKLSAgICBjcmVhdGVfc3RyZWFtX2J1aWxkZXIoJmFhdWRpb0J1aWxkZXIpOwotICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0Rm9ybWF0KGFhdWRpb0J1aWxkZXIsIEdldFBhcmFtKCkpOwotICAgIHRyeV9vcGVuaW5nX2F1ZGlvX3N0cmVhbSgKLSAgICAgICAgICAgIGFhdWRpb0J1aWxkZXIsIGlzVmFsaWRTaGFyaW5nTW9kZShHZXRQYXJhbSgpKSA/IEV4cGVjdDo6U1VDQ0VFRCA6IEV4cGVjdDo6RkFJTCk7Ci19Ci0KLUlOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFNNLCBBQXVkaW9TdHJlYW1CdWlsZGVyU2hhcmluZ01vZGVUZXN0LAotICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygKLSAgICAgICAgICAgICAgICAvLyBSZWFzb25hYmxlIHZhbHVlcwotICAgICAgICAgICAgICAgIEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVELCBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSwKLSAgICAgICAgICAgICAgICAvLyBPZGQgdmFsdWVzCi0gICAgICAgICAgICAgICAgLTEsIDEwMCwgMTAwMDAwMCwgMTAwMDAwMDApLAotICAgICAgICAmQUF1ZGlvU3RyZWFtQnVpbGRlclNoYXJpbmdNb2RlVGVzdDo6Z2V0VGVzdE5hbWUpOwotCi1jbGFzcyBBQXVkaW9TdHJlYW1CdWlsZGVyRGlyZWN0aW9uVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08YWF1ZGlvX2RpcmVjdGlvbl90PiB7Ci0gIHB1YmxpYzoKLSAgICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0VGVzdE5hbWUoY29uc3QgOjp0ZXN0aW5nOjpUZXN0UGFyYW1JbmZvPGFhdWRpb19kaXJlY3Rpb25fdD4mIGluZm8pIHsKLSAgICAgICAgcmV0dXJuIGluZm8ucGFyYW0gPj0gMCA/IHN0ZDo6dG9fc3RyaW5nKGluZm8ucGFyYW0pIDogIl8iICsgc3RkOjp0b19zdHJpbmcoLWluZm8ucGFyYW0pOwotICAgIH0KLSAgcHJvdGVjdGVkOgotICAgIHN0YXRpYyBib29sIGlzVmFsaWRTaGFyaW5nTW9kZShhYXVkaW9fZGlyZWN0aW9uX3QgZikgewotICAgICAgICByZXR1cm4gZiA9PSBBQVVESU9fRElSRUNUSU9OX09VVFBVVCB8fCBmID09IEFBVURJT19ESVJFQ1RJT05fSU5QVVQ7Ci0gICAgfQotfTsKLQotVEVTVF9QKEFBdWRpb1N0cmVhbUJ1aWxkZXJEaXJlY3Rpb25UZXN0LCBvcGVuU3RyZWFtKSB7Ci0gICAgQUF1ZGlvU3RyZWFtQnVpbGRlciAqYWF1ZGlvQnVpbGRlciA9IG51bGxwdHI7Ci0gICAgY3JlYXRlX3N0cmVhbV9idWlsZGVyKCZhYXVkaW9CdWlsZGVyKTsKLSAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEZvcm1hdChhYXVkaW9CdWlsZGVyLCBHZXRQYXJhbSgpKTsKLSAgICB0cnlfb3BlbmluZ19hdWRpb19zdHJlYW0oCi0gICAgICAgICAgICBhYXVkaW9CdWlsZGVyLCBpc1ZhbGlkU2hhcmluZ01vZGUoR2V0UGFyYW0oKSkgPyBFeHBlY3Q6OlNVQ0NFRUQgOiBFeHBlY3Q6OkZBSUwpOwotfQotCi1JTlNUQU5USUFURV9URVNUX0NBU0VfUChTRCwgQUF1ZGlvU3RyZWFtQnVpbGRlckRpcmVjdGlvblRlc3QsCi0gICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKAotICAgICAgICAgICAgICAgIC8vIFJlYXNvbmFibGUgdmFsdWVzCi0gICAgICAgICAgICAgICAgQUFVRElPX0RJUkVDVElPTl9PVVRQVVQsIEFBVURJT19ESVJFQ1RJT05fSU5QVVQsCi0gICAgICAgICAgICAgICAgLy8gT2RkIHZhbHVlcwotICAgICAgICAgICAgICAgIC0xLCAxMDAsIDEwMDAwMDAsIDEwMDAwMDAwKSwKLSAgICAgICAgJkFBdWRpb1N0cmVhbUJ1aWxkZXJEaXJlY3Rpb25UZXN0OjpnZXRUZXN0TmFtZSk7Ci0KLWNsYXNzIEFBdWRpb1N0cmVhbUJ1aWxkZXJCdWZmZXJDYXBhY2l0eVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPGludDMyX3Q+IHsKLSAgcHVibGljOgotICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRUZXN0TmFtZShjb25zdCA6OnRlc3Rpbmc6OlRlc3RQYXJhbUluZm88aW50MzJfdD4mIGluZm8pIHsKLSAgICAgICAgcmV0dXJuIGluZm8ucGFyYW0gPj0gMCA/IHN0ZDo6dG9fc3RyaW5nKGluZm8ucGFyYW0pIDogIl8iICsgc3RkOjp0b19zdHJpbmcoLWluZm8ucGFyYW0pOwotICAgIH0KLSAgcHJvdGVjdGVkOgotICAgIC8vIFRoZXJlIGlzIG5vIGhhcmQgZGVmaW5lZCBsaW1pdCwgdGhlIGFjdHVhbCBtYXhpbXVtIGNhcGFjaXR5IGRlcGVuZHMKLSAgICAvLyBvbiB0aGUgaW1wbGVtZW50YXRpb24uCi0gICAgc3RhdGljIGJvb2wgaXNWYWxpZENhcGFjaXR5KGludDMyX3QgYmMpIHsKLSAgICAgICAgcmV0dXJuIGJjID09IEFBVURJT19VTlNQRUNJRklFRCB8fCBiYyA+PSAwOwotICAgIH0KLX07Ci0KLVRFU1RfUChBQXVkaW9TdHJlYW1CdWlsZGVyQnVmZmVyQ2FwYWNpdHlUZXN0LCBvcGVuU3RyZWFtKSB7Ci0gICAgQUF1ZGlvU3RyZWFtQnVpbGRlciAqYWF1ZGlvQnVpbGRlciA9IG51bGxwdHI7Ci0gICAgY3JlYXRlX3N0cmVhbV9idWlsZGVyKCZhYXVkaW9CdWlsZGVyKTsKLSAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEJ1ZmZlckNhcGFjaXR5SW5GcmFtZXMoYWF1ZGlvQnVpbGRlciwgR2V0UGFyYW0oKSk7Ci0gICAgdHJ5X29wZW5pbmdfYXVkaW9fc3RyZWFtKAotICAgICAgICAgICAgYWF1ZGlvQnVpbGRlciwgaXNWYWxpZENhcGFjaXR5KEdldFBhcmFtKCkpID8gRXhwZWN0OjpTVUNDRUVEIDogRXhwZWN0OjpGQUlMKTsKLX0KLQotSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQkMsIEFBdWRpb1N0cmVhbUJ1aWxkZXJCdWZmZXJDYXBhY2l0eVRlc3QsCi0gICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKAotICAgICAgICAgICAgICAgIC8vIFJlYXNvbmFibGUgdmFsdWVzIHRoYXQgc2hvdWxkIG5vdCBmYWlsCi0gICAgICAgICAgICAgICAgQUFVRElPX1VOU1BFQ0lGSUVELCA4ICogMTkyLCAyICogMTAyNCwKLSAgICAgICAgICAgICAgICAvLyBPZGQgdmFsdWVzCi0gICAgICAgICAgICAgICAgQUFVRElPX1VOU1BFQ0lGSUVEIC0gMSksCi0gICAgICAgICZBQXVkaW9TdHJlYW1CdWlsZGVyQnVmZmVyQ2FwYWNpdHlUZXN0OjpnZXRUZXN0TmFtZSk7Ci0KLWNsYXNzIEFBdWRpb1N0cmVhbUJ1aWxkZXJQZXJmTW9kZVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3Q+IHsKLSAgcHVibGljOgotICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRUZXN0TmFtZShjb25zdCA6OnRlc3Rpbmc6OlRlc3RQYXJhbUluZm88YWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdD4mIGluZm8pIHsKLSAgICAgICAgcmV0dXJuIGluZm8ucGFyYW0gPj0gMCA/IHN0ZDo6dG9fc3RyaW5nKGluZm8ucGFyYW0pIDogIl8iICsgc3RkOjp0b19zdHJpbmcoLWluZm8ucGFyYW0pOwotICAgIH0KLSAgcHJvdGVjdGVkOgotICAgIHN0YXRpYyBib29sIGlzVmFsaWRQZXJmTW9kZShhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IHBtKSB7Ci0gICAgICAgIHN3aXRjaCAocG0pIHsKLSAgICAgICAgICAgIGNhc2UgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORToKLSAgICAgICAgICAgIGNhc2UgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfUE9XRVJfU0FWSU5HOgotICAgICAgICAgICAgY2FzZSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWToKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfTsKLQotVEVTVF9QKEFBdWRpb1N0cmVhbUJ1aWxkZXJQZXJmTW9kZVRlc3QsIG9wZW5TdHJlYW0pIHsKLSAgICBBQXVkaW9TdHJlYW1CdWlsZGVyICphYXVkaW9CdWlsZGVyID0gbnVsbHB0cjsKLSAgICBjcmVhdGVfc3RyZWFtX2J1aWxkZXIoJmFhdWRpb0J1aWxkZXIpOwotICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0UGVyZm9ybWFuY2VNb2RlKGFhdWRpb0J1aWxkZXIsIEdldFBhcmFtKCkpOwotICAgIHRyeV9vcGVuaW5nX2F1ZGlvX3N0cmVhbSgKLSAgICAgICAgICAgIGFhdWRpb0J1aWxkZXIsIGlzVmFsaWRQZXJmTW9kZShHZXRQYXJhbSgpKSA/IEV4cGVjdDo6U1VDQ0VFRCA6IEV4cGVjdDo6RkFJTCk7Ci19Ci0KLUlOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFBNLCBBQXVkaW9TdHJlYW1CdWlsZGVyUGVyZk1vZGVUZXN0LAotICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygKLSAgICAgICAgICAgICAgICAvLyBSZWFzb25hYmxlIHZhbHVlcwotICAgICAgICAgICAgICAgIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkUsCi0gICAgICAgICAgICAgICAgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfUE9XRVJfU0FWSU5HLAotICAgICAgICAgICAgICAgIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZLAotICAgICAgICAgICAgICAgIC8vIE9kZCB2YWx1ZXMKLSAgICAgICAgICAgICAgICBBQVVESU9fVU5TUEVDSUZJRUQgLSAxLCBBQVVESU9fVU5TUEVDSUZJRUQsIDEwMCwgMTAwMDAwMCwgMTAwMDAwMDApLAotICAgICAgICAmQUF1ZGlvU3RyZWFtQnVpbGRlclBlcmZNb2RlVGVzdDo6Z2V0VGVzdE5hbWUpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbmF0aXZlbWVkaWEvYWF1ZGlvL3NyYy91dGlscy5jcHAgYi90ZXN0cy90ZXN0cy9uYXRpdmVtZWRpYS9hYXVkaW8vc3JjL3V0aWxzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAzOWY0ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy90ZXN0cy9uYXRpdmVtZWRpYS9hYXVkaW8vc3JjL3V0aWxzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkFBdWRpb1Rlc3QiCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgPGFuZHJvaWQvbG9nLmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgInRlc3RfYWF1ZGlvLmgiCi0jaW5jbHVkZSAidXRpbHMuaCIKLQotaW50NjRfdCBnZXROYW5vc2Vjb25kcyhjbG9ja2lkX3QgY2xvY2tJZCkgewotICAgIHN0cnVjdCB0aW1lc3BlYyB0aW1lOwotICAgIGludCByZXN1bHQgPSBjbG9ja19nZXR0aW1lKGNsb2NrSWQsICZ0aW1lKTsKLSAgICBpZiAocmVzdWx0IDwgMCkgewotICAgICAgICByZXR1cm4gLWVycm5vOwotICAgIH0KLSAgICByZXR1cm4gKHRpbWUudHZfc2VjICogTkFOT1NfUEVSX1NFQ09ORCkgKyB0aW1lLnR2X25zZWM7Ci19Ci0KLWNvbnN0IGNoYXIqIHBlcmZvcm1hbmNlTW9kZVRvU3RyaW5nKGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgbW9kZSkgewotICAgIHN3aXRjaCAobW9kZSkgewotICAgICAgICBjYXNlIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkU6IHJldHVybiAiREVGQVVMVCI7Ci0gICAgICAgIGNhc2UgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfUE9XRVJfU0FWSU5HOiByZXR1cm4gIlBPV0VSX1NBVklORyI7Ci0gICAgICAgIGNhc2UgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1k6IHJldHVybiAiTE9XX0xBVEVOQ1kiOwotICAgIH0KLSAgICByZXR1cm4gIlVOS05PV04iOwotfQotCi1jb25zdCBjaGFyKiBzaGFyaW5nTW9kZVRvU3RyaW5nKGFhdWRpb19zaGFyaW5nX21vZGVfdCBtb2RlKSB7Ci0gICAgc3dpdGNoIChtb2RlKSB7Ci0gICAgICAgIGNhc2UgQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQ6IHJldHVybiAiU0hBUkVEIjsKLSAgICAgICAgY2FzZSBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRTogcmV0dXJuICJFWENMVVNJVkUiOwotICAgIH0KLSAgICByZXR1cm4gIlVOS05PV04iOwotfQotCi0KLS8vIFRoZXNlIHBlcmlvZHMgYXJlIHF1aXRlIGdlbmVyb3VzLiBUaGV5IGFyZSBub3QgZGVzaWduZWQgdG8gcHV0Ci0vLyBhbnkgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBsZW1lbnRhdGlvbiwgYnV0IG9ubHkgdG8gZW5zdXJlIHNhbml0eS4KLS8vIFVzZSBpbnQ2NF90IGJlY2F1c2UgOTYwMDAgKiAzMDAwMCBpcyBjbG9zZSB0byBpbnQzMl90IGxpbWl0cy4KLWNvbnN0IHN0ZDo6bWFwPGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QsIGludDY0X3Q+IFN0cmVhbUJ1aWxkZXJIZWxwZXI6OnNNYXhGcmFtZXNQZXJCdXJzdE1zID0KLXsgeyBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FLCAxMjggfSwKLSAgeyBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9QT1dFUl9TQVZJTkcsIDMwICogMTAwMCB9LAotICB7IEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZLCA0MCB9IH07Ci0KLVN0cmVhbUJ1aWxkZXJIZWxwZXI6OlN0cmVhbUJ1aWxkZXJIZWxwZXIoCi0gICAgICAgIGFhdWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgaW50MzJfdCBjaGFubmVsQ291bnQsIGFhdWRpb19mb3JtYXRfdCBkYXRhRm9ybWF0LAotICAgICAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3Qgc2hhcmluZ01vZGUsIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgcGVyZk1vZGUpCi0gICAgICAgIDogbURpcmVjdGlvbntkaXJlY3Rpb259LAotICAgICAgICAgIG1SZXF1ZXN0ZWR7c2FtcGxlUmF0ZSwgY2hhbm5lbENvdW50LCBkYXRhRm9ybWF0LCBzaGFyaW5nTW9kZSwgcGVyZk1vZGV9LAotICAgICAgICAgIG1BY3R1YWx7MCwgMCwgQUFVRElPX0ZPUk1BVF9JTlZBTElELCAtMSwgLTF9LCBtRnJhbWVzUGVyQnVyc3R7LTF9LAotICAgICAgICAgIG1CdWlsZGVye251bGxwdHJ9LCBtU3RyZWFte251bGxwdHJ9IHt9Ci0KLVN0cmVhbUJ1aWxkZXJIZWxwZXI6On5TdHJlYW1CdWlsZGVySGVscGVyKCkgewotICAgIGNsb3NlKCk7Ci19Ci0KLXZvaWQgU3RyZWFtQnVpbGRlckhlbHBlcjo6aW5pdEJ1aWxkZXIoKSB7Ci0gICAgQVNTRVJUX0VRKDFVLCBzTWF4RnJhbWVzUGVyQnVyc3RNcy5jb3VudChtUmVxdWVzdGVkLnBlcmZNb2RlKSk7Ci0KLSAgICAvLyBVc2UgYW4gQUF1ZGlvU3RyZWFtQnVpbGRlciB0byBkZWZpbmUgdGhlIHN0cmVhbS4KLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvX2NyZWF0ZVN0cmVhbUJ1aWxkZXIoJm1CdWlsZGVyKTsKLSAgICBBU1NFUlRfRVEoQUFVRElPX09LLCByZXN1bHQpOwotICAgIEFTU0VSVF9UUlVFKG1CdWlsZGVyICE9IG51bGxwdHIpOwotCi0gICAgLy8gUmVxdWVzdCBzdHJlYW0gcHJvcGVydGllcy4KLSAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldERldmljZUlkKG1CdWlsZGVyLCBBQVVESU9fVU5TUEVDSUZJRUQpOwotICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RGlyZWN0aW9uKG1CdWlsZGVyLCBtRGlyZWN0aW9uKTsKLSAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNhbXBsZVJhdGUobUJ1aWxkZXIsIG1SZXF1ZXN0ZWQuc2FtcGxlUmF0ZSk7Ci0gICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRDaGFubmVsQ291bnQobUJ1aWxkZXIsIG1SZXF1ZXN0ZWQuY2hhbm5lbENvdW50KTsKLSAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEZvcm1hdChtQnVpbGRlciwgbVJlcXVlc3RlZC5kYXRhRm9ybWF0KTsKLSAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNoYXJpbmdNb2RlKG1CdWlsZGVyLCBtUmVxdWVzdGVkLnNoYXJpbmdNb2RlKTsKLSAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFBlcmZvcm1hbmNlTW9kZShtQnVpbGRlciwgbVJlcXVlc3RlZC5wZXJmTW9kZSk7Ci19Ci0KLS8vIE5lZWRzIHRvIGJlIGEgJ3ZvaWQnIGZ1bmN0aW9uIGR1ZSB0byBBU1NFUlQgcmVxdWlyZW1lbnRzLgotdm9pZCBTdHJlYW1CdWlsZGVySGVscGVyOjpjcmVhdGVBbmRWZXJpZnlTdHJlYW0oYm9vbCAqc3VjY2VzcykgewotICAgICpzdWNjZXNzID0gZmFsc2U7Ci0KLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKG1CdWlsZGVyLCAmbVN0cmVhbSk7Ci0gICAgaWYgKG1SZXF1ZXN0ZWQuc2hhcmluZ01vZGUgPT0gQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUgJiYgcmVzdWx0ICE9IEFBVURJT19PSykgewotICAgICAgICBfX2FuZHJvaWRfbG9nX3dyaXRlKEFORFJPSURfTE9HX1dBUk4sIExPR19UQUcsICJDb3VsZCBub3Qgb3BlbiBhIHN0cmVhbSBpbiBFWENMVVNJVkUgbW9kZSIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEFTU0VSVF9FUShBQVVESU9fT0ssIHJlc3VsdCk7Ci0gICAgQVNTRVJUX1RSVUUobVN0cmVhbSAhPSBudWxscHRyKTsKLSAgICBBU1NFUlRfRVEoQUFVRElPX1NUUkVBTV9TVEFURV9PUEVOLCBBQXVkaW9TdHJlYW1fZ2V0U3RhdGUobVN0cmVhbSkpOwotICAgIEFTU0VSVF9FUShtRGlyZWN0aW9uLCBBQXVkaW9TdHJlYW1fZ2V0RGlyZWN0aW9uKG1TdHJlYW0pKTsKLQotICAgIG1BY3R1YWwuc2hhcmluZ01vZGUgPSBBQXVkaW9TdHJlYW1fZ2V0U2hhcmluZ01vZGUobVN0cmVhbSk7Ci0gICAgaWYgKG1BY3R1YWwuc2hhcmluZ01vZGUgIT0gbVJlcXVlc3RlZC5zaGFyaW5nTW9kZSkgewotICAgICAgICAvLyBTaW5jZSB3ZSBhcmUgY292ZXJpbmcgYWxsIHBvc3NpYmxlIHZhbHVlcywgdGhlICJhY3R1YWwiIG1vZGUKLSAgICAgICAgLy8gd2lsbCBhbHNvIGJlIHRlc3RlZCwgc28gbm8gbmVlZCB0byBydW4gdGhlIHNhbWUgdGVzdCB0d2ljZS4KLSAgICAgICAgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19XQVJOLCBMT0dfVEFHLCAiU2hhcmluZyBtb2RlICVzIGlzIG5vdCBhdmFpbGFibGUiLAotICAgICAgICAgICAgICAgIHNoYXJpbmdNb2RlVG9TdHJpbmcobVJlcXVlc3RlZC5zaGFyaW5nTW9kZSkpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gQ2hlY2sgdG8gc2VlIHdoYXQga2luZCBvZiBzdHJlYW0gd2UgYWN0dWFsbHkgZ290LgotICAgIG1BY3R1YWwuc2FtcGxlUmF0ZSA9IEFBdWRpb1N0cmVhbV9nZXRTYW1wbGVSYXRlKG1TdHJlYW0pOwotICAgIEFTU0VSVF9HRShtQWN0dWFsLnNhbXBsZVJhdGUsIDQ0MTAwKTsKLSAgICBBU1NFUlRfTEUobUFjdHVhbC5zYW1wbGVSYXRlLCA5NjAwMCk7IC8vIFRPRE8gd2hhdCBpcyBtaW4vbWF4PwotCi0gICAgbUFjdHVhbC5jaGFubmVsQ291bnQgPSBBQXVkaW9TdHJlYW1fZ2V0Q2hhbm5lbENvdW50KG1TdHJlYW0pOwotICAgIEFTU0VSVF9HRShtQWN0dWFsLmNoYW5uZWxDb3VudCwgMSk7Ci0gICAgQVNTRVJUX0xFKG1BY3R1YWwuY2hhbm5lbENvdW50LCAxNik7IC8vIFRPRE8gd2hhdCBpcyBtaW4vbWF4PwotCi0gICAgbUFjdHVhbC5kYXRhRm9ybWF0ID0gQUF1ZGlvU3RyZWFtX2dldEZvcm1hdChtU3RyZWFtKTsKLSAgICBBU1NFUlRfRVEoQUFVRElPX0ZPUk1BVF9QQ01fSTE2LCBtQWN0dWFsLmRhdGFGb3JtYXQpOwotCi0gICAgbUFjdHVhbC5wZXJmTW9kZSA9IEFBdWRpb1N0cmVhbV9nZXRQZXJmb3JtYW5jZU1vZGUobVN0cmVhbSk7Ci0gICAgaWYgKG1SZXF1ZXN0ZWQucGVyZk1vZGUgIT0gQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORQotICAgICAgICAgICAgJiYgbVJlcXVlc3RlZC5wZXJmTW9kZSAhPSBtQWN0dWFsLnBlcmZNb2RlKSB7Ci0gICAgICAgIC8vIFNpbmNlIHdlIGFyZSBjb3ZlcmluZyBhbGwgcG9zc2libGUgdmFsdWVzLCB0aGUgImFjdHVhbCIgbW9kZQotICAgICAgICAvLyB3aWxsIGFsc28gYmUgdGVzdGVkLCBzbyBubyBuZWVkIHRvIHJ1biB0aGUgc2FtZSB0ZXN0IHR3aWNlLgotICAgICAgICBfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX1dBUk4sIExPR19UQUcsICJQZXJmb3JtYW5jZSBtb2RlICVzIGlzIG5vdCBhdmFpbGFibGUiLAotICAgICAgICAgICAgICAgIHBlcmZvcm1hbmNlTW9kZVRvU3RyaW5nKG1SZXF1ZXN0ZWQuc2hhcmluZ01vZGUpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1GcmFtZXNQZXJCdXJzdCA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNQZXJCdXJzdChtU3RyZWFtKTsKLSAgICBBU1NFUlRfR0UobUZyYW1lc1BlckJ1cnN0LCAxNik7Ci0gICAgY29uc3QgaW50MzJfdCBtYXhGcmFtZXNQZXJCdXJzdCA9Ci0gICAgICAgICAgICBtQWN0dWFsLnNhbXBsZVJhdGUgKiBzTWF4RnJhbWVzUGVyQnVyc3RNcy5hdChtQWN0dWFsLnBlcmZNb2RlKSAvIE1JTExJU19QRVJfU0VDT05EOwotICAgIEFTU0VSVF9MRShtRnJhbWVzUGVyQnVyc3QsIG1heEZyYW1lc1BlckJ1cnN0KTsKLQotICAgIGludDMyX3QgYWN0dWFsQnVmZmVyU2l6ZSA9IEFBdWRpb1N0cmVhbV9nZXRCdWZmZXJTaXplSW5GcmFtZXMobVN0cmVhbSk7Ci0gICAgQVNTRVJUX0dUKGFjdHVhbEJ1ZmZlclNpemUsIDApOwotICAgIEFTU0VSVF9HVChBQXVkaW9TdHJlYW1fc2V0QnVmZmVyU2l6ZUluRnJhbWVzKG1TdHJlYW0sIGFjdHVhbEJ1ZmZlclNpemUpLCAwKTsKLQotICAgICpzdWNjZXNzID0gdHJ1ZTsKLX0KLQotdm9pZCBTdHJlYW1CdWlsZGVySGVscGVyOjpjbG9zZSgpIHsKLSAgICBpZiAobUJ1aWxkZXIgIT0gbnVsbHB0cikgewotICAgICAgICBBU1NFUlRfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1CdWlsZGVyX2RlbGV0ZShtQnVpbGRlcikpOwotICAgIH0KLSAgICBpZiAobVN0cmVhbSAhPSBudWxscHRyKSB7Ci0gICAgICAgIEFTU0VSVF9FUShBQVVESU9fT0ssIEFBdWRpb1N0cmVhbV9jbG9zZShtU3RyZWFtKSk7Ci0gICAgfQotfQotCi12b2lkIFN0cmVhbUJ1aWxkZXJIZWxwZXI6OnN0cmVhbUNvbW1hbmQoCi0gICAgICAgIFN0cmVhbUNvbW1hbmQgY21kLCBhYXVkaW9fc3RyZWFtX3N0YXRlX3QgZnJvbVN0YXRlLCBhYXVkaW9fc3RyZWFtX3N0YXRlX3QgdG9TdGF0ZSkgewotICAgIEFTU0VSVF9FUShBQVVESU9fT0ssIGNtZChtU3RyZWFtKSk7Ci0gICAgYWF1ZGlvX3N0cmVhbV9zdGF0ZV90IHN0YXRlID0gQUFVRElPX1NUUkVBTV9TVEFURV9VTklOSVRJQUxJWkVEOwotICAgIEFTU0VSVF9FUShBQVVESU9fT0ssCi0gICAgICAgICAgICBBQXVkaW9TdHJlYW1fd2FpdEZvclN0YXRlQ2hhbmdlKG1TdHJlYW0sIGZyb21TdGF0ZSwgJnN0YXRlLCBERUZBVUxUX1NUQVRFX1RJTUVPVVQpKTsKLSAgICBBU1NFUlRfRVEodG9TdGF0ZSwgc3RhdGUpOwotfQotCi0KLUlucHV0U3RyZWFtQnVpbGRlckhlbHBlcjo6SW5wdXRTdHJlYW1CdWlsZGVySGVscGVyKAotICAgICAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3QgcmVxdWVzdGVkU2hhcmluZ01vZGUsIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgcmVxdWVzdGVkUGVyZk1vZGUpCi0gICAgICAgIDogU3RyZWFtQnVpbGRlckhlbHBlcntBQVVESU9fRElSRUNUSU9OX0lOUFVULAotICAgICAgICAgICAgNDgwMDAsIDEsIEFBVURJT19GT1JNQVRfUENNX0kxNiwgcmVxdWVzdGVkU2hhcmluZ01vZGUsIHJlcXVlc3RlZFBlcmZNb2RlfSB7fQotCi0vLyBOYXRpdmUgYXBwcyBkb24ndCBoYXZlIHBlcm1pc3Npb25zLCB0aHVzIHJlY29yZGluZyBjYW4KLS8vIG9ubHkgYmUgdGVzdGVkIHdoZW4gcnVubmluZyBhcyByb290Lgotc3RhdGljIGJvb2wgY2FuVGVzdFJlY29yZGluZygpIHsKLSAgICBzdGF0aWMgY29uc3QgYm9vbCBydW5uaW5nQXNSb290ID0gZ2V0dWlkKCkgPT0gMDsKLSAgICByZXR1cm4gcnVubmluZ0FzUm9vdDsKLX0KLQotdm9pZCBJbnB1dFN0cmVhbUJ1aWxkZXJIZWxwZXI6OmNyZWF0ZUFuZFZlcmlmeVN0cmVhbShib29sICpzdWNjZXNzKSB7Ci0gICAgaWYgKCFjYW5UZXN0UmVjb3JkaW5nKCkpIHsKLSAgICAgICAgX19hbmRyb2lkX2xvZ193cml0ZShBTkRST0lEX0xPR19XQVJOLCBMT0dfVEFHLCAiTm8gcGVybWlzc2lvbnMgdG8gcnVuIHJlY29yZGluZyB0ZXN0cyIpOwotICAgICAgICAqc3VjY2VzcyA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFN0cmVhbUJ1aWxkZXJIZWxwZXI6OmNyZWF0ZUFuZFZlcmlmeVN0cmVhbShzdWNjZXNzKTsKLSAgICB9Ci19Ci0KLQotT3V0cHV0U3RyZWFtQnVpbGRlckhlbHBlcjo6T3V0cHV0U3RyZWFtQnVpbGRlckhlbHBlcigKLSAgICAgICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90IHJlcXVlc3RlZFNoYXJpbmdNb2RlLCBhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IHJlcXVlc3RlZFBlcmZNb2RlKQotICAgICAgICA6IFN0cmVhbUJ1aWxkZXJIZWxwZXJ7QUFVRElPX0RJUkVDVElPTl9PVVRQVVQsCi0gICAgICAgICAgICA0ODAwMCwgMiwgQUFVRElPX0ZPUk1BVF9QQ01fSTE2LCByZXF1ZXN0ZWRTaGFyaW5nTW9kZSwgcmVxdWVzdGVkUGVyZk1vZGV9IHt9Ci0KLXZvaWQgT3V0cHV0U3RyZWFtQnVpbGRlckhlbHBlcjo6aW5pdEJ1aWxkZXIoKSB7Ci0gICAgU3RyZWFtQnVpbGRlckhlbHBlcjo6aW5pdEJ1aWxkZXIoKTsKLSAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEJ1ZmZlckNhcGFjaXR5SW5GcmFtZXMobUJ1aWxkZXIsIGtCdWZmZXJDYXBhY2l0eUZyYW1lcyk7Ci19Ci0KLXZvaWQgT3V0cHV0U3RyZWFtQnVpbGRlckhlbHBlcjo6Y3JlYXRlQW5kVmVyaWZ5U3RyZWFtKGJvb2wgKnN1Y2Nlc3MpIHsKLSAgICBTdHJlYW1CdWlsZGVySGVscGVyOjpjcmVhdGVBbmRWZXJpZnlTdHJlYW0oc3VjY2Vzcyk7Ci0gICAgaWYgKCpzdWNjZXNzKSB7Ci0gICAgICAgIEFTU0VSVF9HRShBQXVkaW9TdHJlYW1fZ2V0QnVmZmVyQ2FwYWNpdHlJbkZyYW1lcyhtU3RyZWFtKSwga0J1ZmZlckNhcGFjaXR5RnJhbWVzKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9uYXRpdmVtZWRpYS9hYXVkaW8vc3JjL3V0aWxzLmggYi90ZXN0cy90ZXN0cy9uYXRpdmVtZWRpYS9hYXVkaW8vc3JjL3V0aWxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YzNjNjkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvdGVzdHMvbmF0aXZlbWVkaWEvYWF1ZGlvL3NyYy91dGlscy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jaWZuZGVmIENUU19NRURJQV9URVNUX0FBVURJT19VVElMU19ICi0jZGVmaW5lIENUU19NRURJQV9URVNUX0FBVURJT19VVElMU19ICi0KLSNpbmNsdWRlIDxtYXA+Ci0KLSNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+Ci0KLWludDY0X3QgZ2V0TmFub3NlY29uZHMoY2xvY2tpZF90IGNsb2NrSWQgPSBDTE9DS19NT05PVE9OSUMpOwotY29uc3QgY2hhciogcGVyZm9ybWFuY2VNb2RlVG9TdHJpbmcoYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBtb2RlKTsKLWNvbnN0IGNoYXIqIHNoYXJpbmdNb2RlVG9TdHJpbmcoYWF1ZGlvX3NoYXJpbmdfbW9kZV90IG1vZGUpOwotCi1jbGFzcyBTdHJlYW1CdWlsZGVySGVscGVyIHsKLSAgcHVibGljOgotICAgIHN0cnVjdCBQYXJhbWV0ZXJzIHsKLSAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlOwotICAgICAgICBpbnQzMl90IGNoYW5uZWxDb3VudDsKLSAgICAgICAgYWF1ZGlvX2Zvcm1hdF90IGRhdGFGb3JtYXQ7Ci0gICAgICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCBzaGFyaW5nTW9kZTsKLSAgICAgICAgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBwZXJmTW9kZTsKLSAgICB9OwotCi0gICAgdm9pZCBpbml0QnVpbGRlcigpOwotICAgIHZvaWQgY3JlYXRlQW5kVmVyaWZ5U3RyZWFtKGJvb2wgKnN1Y2Nlc3MpOwotICAgIHZvaWQgY2xvc2UoKTsKLQotICAgIHZvaWQgc3RhcnRTdHJlYW0oKSB7Ci0gICAgICAgIHN0cmVhbUNvbW1hbmQoJkFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQsCi0gICAgICAgICAgICAgICAgQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVElORywgQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVEVEKTsKLSAgICB9Ci0gICAgdm9pZCBwYXVzZVN0cmVhbSgpIHsKLSAgICAgICAgc3RyZWFtQ29tbWFuZCgmQUF1ZGlvU3RyZWFtX3JlcXVlc3RQYXVzZSwKLSAgICAgICAgICAgICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX1BBVVNJTkcsIEFBVURJT19TVFJFQU1fU1RBVEVfUEFVU0VEKTsKLSAgICB9Ci0gICAgdm9pZCBzdG9wU3RyZWFtKCkgewotICAgICAgICBzdHJlYW1Db21tYW5kKCZBQXVkaW9TdHJlYW1fcmVxdWVzdFN0b3AsCi0gICAgICAgICAgICAgICAgQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUElORywgQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUEVEKTsKLSAgICB9Ci0gICAgdm9pZCBmbHVzaFN0cmVhbSgpIHsKLSAgICAgICAgc3RyZWFtQ29tbWFuZCgmQUF1ZGlvU3RyZWFtX3JlcXVlc3RGbHVzaCwKLSAgICAgICAgICAgICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX0ZMVVNISU5HLCBBQVVESU9fU1RSRUFNX1NUQVRFX0ZMVVNIRUQpOwotICAgIH0KLQotICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIoKSBjb25zdCB7IHJldHVybiBtQnVpbGRlcjsgfQotICAgIEFBdWRpb1N0cmVhbSogc3RyZWFtKCkgY29uc3QgeyByZXR1cm4gbVN0cmVhbTsgfQotICAgIGNvbnN0IFBhcmFtZXRlcnMmIGFjdHVhbCgpIGNvbnN0IHsgcmV0dXJuIG1BY3R1YWw7IH0KLSAgICBpbnQzMl90IGZyYW1lc1BlckJ1cnN0KCkgY29uc3QgeyByZXR1cm4gbUZyYW1lc1BlckJ1cnN0OyB9Ci0KLSAgcHJvdGVjdGVkOgotICAgIFN0cmVhbUJ1aWxkZXJIZWxwZXIoYWF1ZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgaW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgaW50MzJfdCBjaGFubmVsQ291bnQsIGFhdWRpb19mb3JtYXRfdCBkYXRhRm9ybWF0LAotICAgICAgICAgICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90IHNoYXJpbmdNb2RlLCBhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IHBlcmZNb2RlKTsKLSAgICB+U3RyZWFtQnVpbGRlckhlbHBlcigpOwotCi0gICAgdHlwZWRlZiBhYXVkaW9fcmVzdWx0X3QgKFN0cmVhbUNvbW1hbmQpKEFBdWRpb1N0cmVhbSopOwotICAgIHZvaWQgc3RyZWFtQ29tbWFuZCgKLSAgICAgICAgICAgIFN0cmVhbUNvbW1hbmQgY21kLCBhYXVkaW9fc3RyZWFtX3N0YXRlX3QgZnJvbVN0YXRlLCBhYXVkaW9fc3RyZWFtX3N0YXRlX3QgdG9TdGF0ZSk7Ci0KLSAgICBzdGF0aWMgY29uc3Qgc3RkOjptYXA8YWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCwgaW50NjRfdD4gc01heEZyYW1lc1BlckJ1cnN0TXM7Ci0gICAgY29uc3QgYWF1ZGlvX2RpcmVjdGlvbl90IG1EaXJlY3Rpb247Ci0gICAgY29uc3QgUGFyYW1ldGVycyBtUmVxdWVzdGVkOwotICAgIFBhcmFtZXRlcnMgbUFjdHVhbDsKLSAgICBpbnQzMl90IG1GcmFtZXNQZXJCdXJzdDsKLSAgICBBQXVkaW9TdHJlYW1CdWlsZGVyICptQnVpbGRlcjsKLSAgICBBQXVkaW9TdHJlYW0gKm1TdHJlYW07Ci19OwotCi1jbGFzcyBJbnB1dFN0cmVhbUJ1aWxkZXJIZWxwZXIgOiBwdWJsaWMgU3RyZWFtQnVpbGRlckhlbHBlciB7Ci0gIHB1YmxpYzoKLSAgICBJbnB1dFN0cmVhbUJ1aWxkZXJIZWxwZXIoCi0gICAgICAgICAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3QgcmVxdWVzdGVkU2hhcmluZ01vZGUsCi0gICAgICAgICAgICBhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IHJlcXVlc3RlZFBlcmZNb2RlKTsKLSAgICB2b2lkIGNyZWF0ZUFuZFZlcmlmeVN0cmVhbShib29sICpzdWNjZXNzKTsKLX07Ci0KLWNsYXNzIE91dHB1dFN0cmVhbUJ1aWxkZXJIZWxwZXIgOiBwdWJsaWMgU3RyZWFtQnVpbGRlckhlbHBlciB7Ci0gIHB1YmxpYzoKLSAgICBPdXRwdXRTdHJlYW1CdWlsZGVySGVscGVyKAotICAgICAgICAgICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90IHJlcXVlc3RlZFNoYXJpbmdNb2RlLAotICAgICAgICAgICAgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCByZXF1ZXN0ZWRQZXJmTW9kZSk7Ci0gICAgdm9pZCBpbml0QnVpbGRlcigpOwotICAgIHZvaWQgY3JlYXRlQW5kVmVyaWZ5U3RyZWFtKGJvb2wgKnN1Y2Nlc3MpOwotCi0gIHByaXZhdGU6Ci0gICAgY29uc3QgaW50MzJfdCBrQnVmZmVyQ2FwYWNpdHlGcmFtZXMgPSAyMDAwOwotfTsKLQotI2VuZGlmICAvLyBDVFNfTUVESUFfVEVTVF9BQVVESU9fVVRJTFNfSApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbmF0aXZlbWVkaWEvc2wvQW5kcm9pZFRlc3QueG1sIGIvdGVzdHMvdGVzdHMvbmF0aXZlbWVkaWEvc2wvQW5kcm9pZFRlc3QueG1sCmluZGV4IDA2NzdhNjIuLmNmYjBjYWUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL25hdGl2ZW1lZGlhL3NsL0FuZHJvaWRUZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9uYXRpdmVtZWRpYS9zbC9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBOYXRpdmUgTWVkaWEgT3BlbiBTTCBFUyB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0ibWVkaWEiIC8+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGFyZ2V0cHJlcC5GaWxlUHVzaGVyIj4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0idHJ1ZSIgLz4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL25hdGl2ZW1lZGlhL3hhL0FuZHJvaWQubWsgYi90ZXN0cy90ZXN0cy9uYXRpdmVtZWRpYS94YS9BbmRyb2lkLm1rCmluZGV4IGMxMWMxMGUuLjVmODgzMGQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL25hdGl2ZW1lZGlhL3hhL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvdGVzdHMvbmF0aXZlbWVkaWEveGEvQW5kcm9pZC5tawpAQCAtMzgsNiArMzgsOCBAQAogTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCiAgIGxpYmd0ZXN0IFwKIAorTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IKKwogTE9DQUxfQ1RTX1RFU1RfUEFDS0FHRSA6PSBhbmRyb2lkLm5hdGl2ZW1lZGlhLnhhCiAKICMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL25hdGl2ZW1lZGlhL3hhL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL25hdGl2ZW1lZGlhL3hhL0FuZHJvaWRUZXN0LnhtbAppbmRleCBjNjNjMWFiLi5hZTA3Njg2IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9uYXRpdmVtZWRpYS94YS9BbmRyb2lkVGVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvbmF0aXZlbWVkaWEveGEvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgTmF0aXZlIE1lZGlhIE9wZW5NYXggQUwgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9Im1lZGlhIiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRhcmdldHByZXAuRmlsZVB1c2hlciI+CiAgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cCIgdmFsdWU9InRydWUiIC8+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9uZGVmL0FuZHJvaWQubWsgYi90ZXN0cy90ZXN0cy9uZGVmL0FuZHJvaWQubWsKaW5kZXggMWJhMDYwMy4uMGU1YjFkZCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbmRlZi9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3Rlc3RzL25kZWYvQW5kcm9pZC5tawpAQCAtMjQsNyArMjQsNyBAQAogIyBXaGVuIGJ1aWx0LCBleHBsaWNpdGx5IHB1dCBpdCBpbiB0aGUgZGF0YSBwYXJ0aXRpb24uCiBMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQogCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY3RzdGVzdHJ1bm5lciBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY3RzdGVzdHJ1bm5lci1heHQgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9uZGVmL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy90ZXN0cy9uZGVmL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggZGNlYzI3ZC4uNTczMjBkYSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbmRlZi9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL25kZWYvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjMsNyArMjMsNyBAQAogICAgIDwvYXBwbGljYXRpb24+CiAKICAgICA8IS0tIFRoaXMgaXMgYSBzZWxmLWluc3RydW1lbnRpbmcgdGVzdCBwYWNrYWdlLiAtLT4KLSAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLm5kZWYuY3RzIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIG9mIE5ERUYgZGF0YSBjbGFzc2VzIj4KICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9Imxpc3RlbmVyIgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbmRlZi9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy90ZXN0cy9uZGVmL0FuZHJvaWRUZXN0LnhtbAppbmRleCBjYTk0OWJkLi5hZWYxMDVmIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9uZGVmL0FuZHJvaWRUZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9uZGVmL0FuZHJvaWRUZXN0LnhtbApAQCAtMTQsNiArMTQsNyBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIE5ERUYgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9InN5c3RlbXMiIC8+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CiAgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL25ldC9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvbmV0L0FuZHJvaWQubWsKaW5kZXggNGFlYWIzOC4uNDU5NDFhNyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbmV0L0FuZHJvaWQubWsKKysrIGIvdGVzdHMvdGVzdHMvbmV0L0FuZHJvaWQubWsKQEAgLTI0LDcgKzI0LDEyIEBACiAjIEluY2x1ZGUgYm90aCB0aGUgMzIgYW5kIDY0IGJpdCB2ZXJzaW9ucwogTE9DQUxfTVVMVElMSUIgOj0gYm90aAogCi1MT0NBTF9KQVZBX0xJQlJBUklFUyA6PSB2b2lwLWNvbW1vbiBjb25zY3J5cHQgb3JnLmFwYWNoZS5odHRwLmxlZ2FjeQorTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gXAorICAgIHZvaXAtY29tbW9uIFwKKyAgICBjb25zY3J5cHQgXAorICAgIG9yZy5hcGFjaGUuaHR0cC5sZWdhY3kgXAorICAgIGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzIFwKKwogCiBMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdHNfam5pIGxpYm5hdGl2ZWRuc19qbmkgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlibmF0aXZlbXVsdGluZXR3b3JrX2puaSBsaWJuYXRpdmVoZWxwZXJfY29tcGF0X2xpYmMrKwpAQCAtMzYsMTUgKzQxLDE2IEBACiAKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCiAgICAgY29yZS10ZXN0cy1zdXBwb3J0IFwKLSAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsIFwKLSAgICBjdHN0ZXN0cnVubmVyIFwKKyAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBcCisgICAgY3RzdGVzdHJ1bm5lci1heHQgXAogICAgIGN0c3Rlc3RzZXJ2ZXIgXAogICAgIG1vY2t3ZWJzZXJ2ZXIgXAogICAgIGp1bml0IFwKLSAgICBsZWdhY3ktYW5kcm9pZC10ZXN0CisgICAgdHJ1dGgtcHJlYnVpbHQKIAogIyB1bmNvbW1lbnQgd2hlbiBiLzEzMjQ5OTYxIGlzIGZpeGVkCiAjTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorTE9DQUxfUFJJVkFURV9QTEFURk9STV9BUElTIDo9IHRydWUKIAogIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAogTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL25ldC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdGVzdHMvbmV0L0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggZGQzMTBhMS4uYjI2MWIzOSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbmV0L0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvbmV0L0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTIxLDYgKzIxLDcgQEAKICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkFDQ0VTU19ORVRXT1JLX1NUQVRFIiAvPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX1dJRklfU1RBVEUiIC8+CiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5BQ0NFU1NfQ09BUlNFX0xPQ0FUSU9OIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX0ZJTkVfTE9DQVRJT04iIC8+CiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5DSEFOR0VfTkVUV09SS19TVEFURSIgLz4KICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkNIQU5HRV9XSUZJX1NUQVRFIiAvPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uRElTQUJMRV9LRVlHVUFSRCIgLz4KQEAgLTMwLDcgKzMxLDcgQEAKICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0VYVEVSTkFMX1NUT1JBR0UiIC8+CiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9TRUNVUkVfU0VUVElOR1MiIC8+CiAKLSAgICA8YXBwbGljYXRpb24+CisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6dXNlc0NsZWFydGV4dFRyYWZmaWM9InRydWUiPgogICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KICAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9Im9yZy5hcGFjaGUuaHR0cC5sZWdhY3kiIGFuZHJvaWQ6cmVxdWlyZWQ9ImZhbHNlIiAvPgogCkBAIC00MSw3ICs0Miw3IEBACiAgICAgICAgIDwvcmVjZWl2ZXI+CiAgICAgPC9hcHBsaWNhdGlvbj4KIAotICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQubmV0LmN0cyIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBvZiBhbmRyb2lkLm5ldCI+CiAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJsaXN0ZW5lciIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL25ldC9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy90ZXN0cy9uZXQvQW5kcm9pZFRlc3QueG1sCmluZGV4IDRhNTc4ZWEuLjEzMjY5NzAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL25ldC9BbmRyb2lkVGVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvbmV0L0FuZHJvaWRUZXN0LnhtbApAQCAtMTMsNiArMTMsNyBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIE5ldCB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0ibmV0d29ya2luZyIgLz4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgpAQCAtMjIsNSArMjMsNiBAQAogICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5BbmRyb2lkSlVuaXRUZXN0IiA+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icGFja2FnZSIgdmFsdWU9ImFuZHJvaWQubmV0LmN0cyIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJydW50aW1lLWhpbnQiIHZhbHVlPSI5bTRzIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImhpZGRlbi1hcGktY2hlY2tzIiB2YWx1ZT0iZmFsc2UiIC8+CiAgICAgPC90ZXN0PgogPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbmV0L09XTkVSUyBiL3Rlc3RzL3Rlc3RzL25ldC9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM4MmJiMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL25ldC9PV05FUlMKQEAgLTAsMCArMSwyIEBACitsb3JlbnpvQGdvb2dsZS5jb20KK3NhdGtAZ29vZ2xlLmNvbQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL25ldC9hc3NldHMvbmV0d29ya193YXRjaGxpc3RfY29uZmlnX2VtcHR5X2Zvcl90ZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL25ldC9hc3NldHMvbmV0d29ya193YXRjaGxpc3RfY29uZmlnX2VtcHR5X2Zvcl90ZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTYyOGQxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvbmV0L2Fzc2V0cy9uZXR3b3JrX3dhdGNobGlzdF9jb25maWdfZW1wdHlfZm9yX3Rlc3QueG1sCkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKiogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKzwhLS0gVGhpcyB0ZXN0IGNvbmZpZyBmaWxlIGlzIGZvciBOZXR3b3JrV2F0Y2hsaXN0VGVzdCB0ZXN0cyAtLT4KKzx3YXRjaGxpc3QtY29uZmlnPgorICAgIDxzaGEyNTYtZG9tYWluPgorICAgIDwvc2hhMjU2LWRvbWFpbj4KKyAgICA8c2hhMjU2LWlwPgorICAgIDwvc2hhMjU2LWlwPgorICAgIDxjcmMzMi1kb21haW4+CisgICAgPC9jcmMzMi1kb21haW4+CisgICAgPGNyYzMyLWlwPgorICAgIDwvY3JjMzItaXA+Cis8L3dhdGNobGlzdC1jb25maWc+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9uZXQvYXNzZXRzL25ldHdvcmtfd2F0Y2hsaXN0X2NvbmZpZ19mb3JfdGVzdC54bWwgYi90ZXN0cy90ZXN0cy9uZXQvYXNzZXRzL25ldHdvcmtfd2F0Y2hsaXN0X2NvbmZpZ19mb3JfdGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM1YWUwZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL25ldC9hc3NldHMvbmV0d29ya193YXRjaGxpc3RfY29uZmlnX2Zvcl90ZXN0LnhtbApAQCAtMCwwICsxLDM0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyoqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+Cis8IS0tIFRoaXMgdGVzdCBjb25maWcgZmlsZSBqdXN0IGNvbnRhaW5zIHNvbWUgcmFuZG9tIGhhc2hlcyBmb3IgdGVzdGluZworQ29ubmVjdGl2aXR5TWFuYWdlci5nZXRXYXRjaGxpc3RDb25maWdIYXNoKCkgLS0+Cis8d2F0Y2hsaXN0LWNvbmZpZz4KKyAgICA8c2hhMjU2LWRvbWFpbj4KKyAgICAgICAgPGhhc2g+RjA5MDVEQTc1NDk2MTQ5NTdCNDQ5MDM0QzI4MUVGN0JERUZEQkMyQjZFMDUwQUQxRTc4RDZERTE4RkJEMEQ1RjwvaGFzaD4KKyAgICA8L3NoYTI1Ni1kb21haW4+CisgICAgPHNoYTI1Ni1pcD4KKyAgICAgICAgPGhhc2g+MThERDQxQzlGMkU4RTQ4NzlBMTU3NUZCNzgwNTE0RUYzM0NGNkUxRjY2NTc4QzRBRTdDQ0EzMUY0OUI5RjJFQzwvaGFzaD4KKyAgICA8L3NoYTI1Ni1pcD4KKyAgICA8Y3JjMzItZG9tYWluPgorICAgICAgICA8aGFzaD5BQUFBQUFBQTwvaGFzaD4KKyAgICA8L2NyYzMyLWRvbWFpbj4KKyAgICA8Y3JjMzItaXA+CisgICAgICAgIDxoYXNoPkJCQkJCQkJCPC9oYXNoPgorICAgIDwvY3JjMzItaXA+Cis8L3dhdGNobGlzdC1jb25maWc+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9uZXQvam5pL0FuZHJvaWQubWsgYi90ZXN0cy90ZXN0cy9uZXQvam5pL0FuZHJvaWQubWsKaW5kZXggODg3ZTk1ZS4uNzI3YTQ0ZCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbmV0L2puaS9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3Rlc3RzL25ldC9qbmkvQW5kcm9pZC5tawpAQCAtMjgsNyArMjgsNyBAQAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJuYXRpdmVoZWxwZXJfY29tcGF0X2xpYmMrKyBsaWJsb2cKIExPQ0FMX0NYWF9TVEwgOj0gbGliYysrX3N0YXRpYwogCi1MT0NBTF9DRkxBR1MgOj0gLVduby11bnVzZWQtcGFyYW1ldGVyCitMT0NBTF9DRkxBR1MgOj0gLVdhbGwgLVdlcnJvciAtV25vLXVudXNlZC1wYXJhbWV0ZXIKIAogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQogCkBAIC0zNyw2ICszNyw3IEBACiAjIERvbid0IGluY2x1ZGUgdGhpcyBwYWNrYWdlIGluIGFueSBjb25maWd1cmF0aW9uIGJ5IGRlZmF1bHQuCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAogTE9DQUxfU1JDX0ZJTEVTIDo9IE5hdGl2ZU11bHRpbmV0d29ya0puaS5jCitMT0NBTF9DRkxBR1MgOj0gLVdhbGwgLVdlcnJvciAtV25vLWZvcm1hdAogTE9DQUxfQ19JTkNMVURFUyA6PSAkKEpOSV9IX0lOQ0xVREUpCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmFuZHJvaWQgbGlibmF0aXZlaGVscGVyX2NvbXBhdF9saWJjKysgbGlibG9nCiBMT0NBTF9DWFhfU1RMIDo9IGxpYmMrK19zdGF0aWMKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL25ldC9qbmkvTmF0aXZlTXVsdGluZXR3b3JrSm5pLmMgYi90ZXN0cy90ZXN0cy9uZXQvam5pL05hdGl2ZU11bHRpbmV0d29ya0puaS5jCmluZGV4IGMyZGZmOGQuLjY5MjM4Y2YgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL25ldC9qbmkvTmF0aXZlTXVsdGluZXR3b3JrSm5pLmMKKysrIGIvdGVzdHMvdGVzdHMvbmV0L2puaS9OYXRpdmVNdWx0aW5ldHdvcmtKbmkuYwpAQCAtNDcsNyArNDcsNyBAQAogICAgIGNvbnN0IGludCBzYXZlZF9lcnJubyA9IGVycm5vOwogICAgIGZyZWVhZGRyaW5mbyhyZXMpOwogCi0gICAgQUxPR0QoImFuZHJvaWRfZ2V0YWRkcmluZm9mb3JuZXR3b3JrKCVsbHUsICVzKSByZXR1cm5lZCBydmFsPSVkIGVycm5vPSVkIiwKKyAgICBBTE9HRCgiYW5kcm9pZF9nZXRhZGRyaW5mb2Zvcm5ldHdvcmsoJSIgUFJJdTY0ICIsICVzKSByZXR1cm5lZCBydmFsPSVkIGVycm5vPSVkIiwKICAgICAgICAgICBoYW5kbGUsIGtIb3N0bmFtZSwgcnZhbCwgc2F2ZWRfZXJybm8pOwogICAgIHJldHVybiBydmFsID09IDAgPyAwIDogLXNhdmVkX2Vycm5vOwogfQpAQCAtNjEsNyArNjEsNyBAQAogICAgIGVycm5vID0gMDsKICAgICBpbnQgcnZhbCA9IGFuZHJvaWRfc2V0cHJvY25ldHdvcmsoaGFuZGxlKTsKICAgICBjb25zdCBpbnQgc2F2ZWRfZXJybm8gPSBlcnJubzsKLSAgICBBTE9HRCgiYW5kcm9pZF9zZXRwcm9jbmV0d29yayglbGx1KSByZXR1cm5lZCBydmFsPSVkIGVycm5vPSVkIiwKKyAgICBBTE9HRCgiYW5kcm9pZF9zZXRwcm9jbmV0d29yayglIiBQUkl1NjQgIikgcmV0dXJuZWQgcnZhbD0lZCBlcnJubz0lZCIsCiAgICAgICAgICAgaGFuZGxlLCBydmFsLCBzYXZlZF9lcnJubyk7CiAgICAgcmV0dXJuIHJ2YWwgPT0gMCA/IDAgOiAtc2F2ZWRfZXJybm87CiB9CkBAIC04Miw3ICs4Miw3IEBACiAgICAgZXJybm8gPSAwOwogICAgIGludCBydmFsID0gYW5kcm9pZF9zZXRzb2NrbmV0d29yayhoYW5kbGUsIGZkKTsKICAgICBjb25zdCBpbnQgc2F2ZWRfZXJybm8gPSBlcnJubzsKLSAgICBBTE9HRCgiYW5kcm9pZF9zZXRwcm9jbmV0d29yayglbGx1LCAlZCkgcmV0dXJuZWQgcnZhbD0lZCBlcnJubz0lZCIsCisgICAgQUxPR0QoImFuZHJvaWRfc2V0cHJvY25ldHdvcmsoJSIgUFJJdTY0ICIsICVkKSByZXR1cm5lZCBydmFsPSVkIGVycm5vPSVkIiwKICAgICAgICAgICBoYW5kbGUsIGZkLCBydmFsLCBzYXZlZF9lcnJubyk7CiAgICAgY2xvc2UoZmQpOwogICAgIHJldHVybiBydmFsID09IDAgPyAwIDogLXNhdmVkX2Vycm5vOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbmV0L25hdGl2ZS9xdGFndWlkL0FuZHJvaWQubWsgYi90ZXN0cy90ZXN0cy9uZXQvbmF0aXZlL3F0YWd1aWQvQW5kcm9pZC5tawppbmRleCA2YzkyYjVjLi5iZjg5ZTVmIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9uZXQvbmF0aXZlL3F0YWd1aWQvQW5kcm9pZC5taworKysgYi90ZXN0cy90ZXN0cy9uZXQvbmF0aXZlL3F0YWd1aWQvQW5kcm9pZC5tawpAQCAtMjksMTAgKzI5LDEwIEBACiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICBsaWJ1dGlscyBcCiAgICAgbGlibG9nIFwKLSAgICBsaWJjdXRpbHMgXAogCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJndGVzdAorICAgIGxpYmd0ZXN0IFwKKyAgICBsaWJxdGFndWlkIFwKIAogTE9DQUxfQ1RTX1RFU1RfUEFDS0FHRSA6PSBhbmRyb2lkLm5ldC5uYXRpdmUKICMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL25ldC9uYXRpdmUvcXRhZ3VpZC9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy90ZXN0cy9uZXQvbmF0aXZlL3F0YWd1aWQvQW5kcm9pZFRlc3QueG1sCmluZGV4IDJlZWE4MmUuLjc1OTFjODcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL25ldC9uYXRpdmUvcXRhZ3VpZC9BbmRyb2lkVGVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvbmV0L25hdGl2ZS9xdGFndWlkL0FuZHJvaWRUZXN0LnhtbApAQCAtMTQsNiArMTQsNyBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIE5hdGl2ZSBOZXR3b3JrIHh0X3F0YWd1aWQgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9Im5ldHdvcmtpbmciIC8+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGFyZ2V0cHJlcC5GaWxlUHVzaGVyIj4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0idHJ1ZSIgLz4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL25ldC9uYXRpdmUvcXRhZ3VpZC9zcmMvTmF0aXZlUXRhZ3VpZFRlc3QuY3BwIGIvdGVzdHMvdGVzdHMvbmV0L25hdGl2ZS9xdGFndWlkL3NyYy9OYXRpdmVRdGFndWlkVGVzdC5jcHAKaW5kZXggOTAwOWMyNC4uMTg5MmE0NCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbmV0L25hdGl2ZS9xdGFndWlkL3NyYy9OYXRpdmVRdGFndWlkVGVzdC5jcHAKKysrIGIvdGVzdHMvdGVzdHMvbmV0L25hdGl2ZS9xdGFndWlkL3NyYy9OYXRpdmVRdGFndWlkVGVzdC5jcHAKQEAgLTE1LDEzICsxNSwzOCBAQAogICovCiAKICNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxlcnJvci5oPgogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KIAogI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL3F0YWd1aWQuaD4KKyNpbmNsdWRlIDxxdGFndWlkL3F0YWd1aWQuaD4KKworaW50IGhhc1F0YWd1aWRLZXJuZWxTdXBwb3J0KCkgeworICAgIHN0cnVjdCB1dHNuYW1lIGJ1ZjsKKyAgICBpbnQga2VybmVsX3ZlcnNpb25fbWFqb3I7CisgICAgaW50IGtlcm5lbF92ZXJzaW9uX21pbm9yOworCisgICAgaW50IHJldCA9IHVuYW1lKCZidWYpOworICAgIGlmIChyZXQpIHsKKyAgICAgICAgcmV0ID0gLWVycm5vOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBjaGFyIGR1bW15OworICAgIHJldCA9IHNzY2FuZihidWYucmVsZWFzZSwgIiVkLiVkJWMiLCAma2VybmVsX3ZlcnNpb25fbWFqb3IsICZrZXJuZWxfdmVyc2lvbl9taW5vciwgJmR1bW15KTsKKyAgICBpZiAocmV0IDwgMykKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICBpZiAoKGtlcm5lbF92ZXJzaW9uX21ham9yID09IDQgJiYga2VybmVsX3ZlcnNpb25fbWlub3IgPCA5KSB8fAorICAgICAgICAoa2VybmVsX3ZlcnNpb25fbWFqb3IgPCA0KSkgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gYWNjZXNzKCIvcHJvYy9uZXQveHRfcXRhZ3VpZC9jdHJsIiwgRl9PSykgIT0gLTE7CisgICAgfQorfQogCiBpbnQgZ2V0Q3RybFNrSW5mbyhpbnQgdGFnLCB1aWRfdCB1aWQsIHVpbnQ2NF90KiBza19hZGRyLCBpbnQqIHJlZl9jbnQpIHsKICAgICBGSUxFICpmcDsKQEAgLTYyLDcgKzg3LDcgQEAKICAgICB1aW50NjRfdCBza19hZGRyOwogICAgIHVpbnQ2NF90IGV4cGVjdF9hZGRyID0gMDsKIAotICAgIEVYUEVDVF9FUSgwLCBxdGFndWlkX3RhZ1NvY2tldChzb2NrZmQsIHRhZywgdWlkKSk7CisgICAgRVhQRUNUX0VRKDAsIGxlZ2FjeV90YWdTb2NrZXQoc29ja2ZkLCB0YWcsIHVpZCkpOwogICAgIEVYUEVDVF9FUSgwLCBnZXRDdHJsU2tJbmZvKHRhZywgdWlkLCAmc2tfYWRkciwgJnJlZl9jbnQpKTsKICAgICBFWFBFQ1RfRVEoZXhwZWN0X2FkZHIsIHNrX2FkZHIpOwogICAgIGNsb3NlKHNvY2tmZCk7CkBAIC03MCwxMiArOTUsMTggQEAKIH0KIAogVEVTVCAoTmF0aXZlUXRhZ3VpZFRlc3QsIGNsb3NlX3NvY2tldF93aXRob3V0X3VudGFnKSB7CisgICAgaW50IHJlcyA9IGhhc1F0YWd1aWRLZXJuZWxTdXBwb3J0KCk7CisgICAgQVNTRVJUX0xFKDAsIHJlcyk7CisgICAgaWYgKCFyZXMpIHsKKyAgICAgICAgICBHVEVTVF9MT0dfKElORk8pIDw8ICJUaGlzIHRlc3QgaXMgc2tpcHBlZCBzaW5jZSBrZXJuZWwgbWF5IG5vdCBoYXZlIHRoZSBtb2R1bGVcbiI7CisgICAgICAgICAgcmV0dXJuOworICAgIH0KICAgICBpbnQgc29ja2ZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKTsKICAgICB1aWRfdCB1aWQgPSBnZXR1aWQoKTsKICAgICBpbnQgdGFnID0gYXJjNHJhbmRvbSgpOwogICAgIGludCByZWZfY250OwogICAgIHVpbnQ2NF90IGR1bW15X3NrOwotICAgIEVYUEVDVF9FUSgwLCBxdGFndWlkX3RhZ1NvY2tldChzb2NrZmQsIHRhZywgdWlkKSk7CisgICAgRVhQRUNUX0VRKDAsIGxlZ2FjeV90YWdTb2NrZXQoc29ja2ZkLCB0YWcsIHVpZCkpOwogICAgIEVYUEVDVF9FUSgwLCBnZXRDdHJsU2tJbmZvKHRhZywgdWlkLCAmZHVtbXlfc2ssICZyZWZfY250KSk7CiAgICAgRVhQRUNUX0VRKDIsIHJlZl9jbnQpOwogICAgIGNsb3NlKHNvY2tmZCk7CkBAIC04MywxMiArMTE0LDE4IEBACiB9CiAKIFRFU1QgKE5hdGl2ZVF0YWd1aWRUZXN0LCBjbG9zZV9zb2NrZXRfd2l0aG91dF91bnRhZ19pcHY2KSB7CisgICAgaW50IHJlcyA9IGhhc1F0YWd1aWRLZXJuZWxTdXBwb3J0KCk7CisgICAgQVNTRVJUX0xFKDAsIHJlcyk7CisgICAgaWYgKCFyZXMpIHsKKyAgICAgICAgICBHVEVTVF9MT0dfKElORk8pIDw8ICJUaGlzIHRlc3QgaXMgc2tpcHBlZCBzaW5jZSBrZXJuZWwgbWF5IG5vdCBoYXZlIHRoZSBtb2R1bGVcbiI7CisgICAgICAgICAgcmV0dXJuOworICAgIH0KICAgICBpbnQgc29ja2ZkID0gc29ja2V0KEFGX0lORVQ2LCBTT0NLX1NUUkVBTSwgMCk7CiAgICAgdWlkX3QgdWlkID0gZ2V0dWlkKCk7CiAgICAgaW50IHRhZyA9IGFyYzRyYW5kb20oKTsKICAgICBpbnQgcmVmX2NudDsKICAgICB1aW50NjRfdCBkdW1teV9zazsKLSAgICBFWFBFQ1RfRVEoMCwgcXRhZ3VpZF90YWdTb2NrZXQoc29ja2ZkLCB0YWcsIHVpZCkpOworICAgIEVYUEVDVF9FUSgwLCBsZWdhY3lfdGFnU29ja2V0KHNvY2tmZCwgdGFnLCB1aWQpKTsKICAgICBFWFBFQ1RfRVEoMCwgZ2V0Q3RybFNrSW5mbyh0YWcsIHVpZCwgJmR1bW15X3NrLCAmcmVmX2NudCkpOwogICAgIEVYUEVDVF9FUSgyLCByZWZfY250KTsKICAgICBjbG9zZShzb2NrZmQpOwpAQCAtOTYsMTIgKzEzMywxNyBAQAogfQogCiBURVNUIChOYXRpdmVRdGFndWlkVGVzdCwgbm9fc29ja2V0X2FkZHJfbGVhaykgeworICAgIGludCByZXMgPSBoYXNRdGFndWlkS2VybmVsU3VwcG9ydCgpOworICAgIEFTU0VSVF9MRSgwLCByZXMpOworICAgIGlmICghcmVzKSB7CisgICAgICAgICAgR1RFU1RfTE9HXyhJTkZPKSA8PCAiVGhpcyB0ZXN0IGlzIHNraXBwZWQgc2luY2Uga2VybmVsIG1heSBub3QgaGF2ZSB0aGUgbW9kdWxlXG4iOworICAgICAgICAgIHJldHVybjsKKyAgICB9CiAgIGNoZWNrTm9Tb2NrZXRQb2ludGVyTGVha3MoQUZfSU5FVCk7CiAgIGNoZWNrTm9Tb2NrZXRQb2ludGVyTGVha3MoQUZfSU5FVDYpOwogfQogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKICAgICAgIHRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKLQogICAgICAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL25ldC9zcmMvYW5kcm9pZC9uZXQvY3RzL0Nvbm5lY3Rpdml0eU1hbmFnZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9uZXQvc3JjL2FuZHJvaWQvbmV0L2N0cy9Db25uZWN0aXZpdHlNYW5hZ2VyVGVzdC5qYXZhCmluZGV4IGM4ODU5NDIuLjgxMGI1ZGYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL25ldC9zcmMvYW5kcm9pZC9uZXQvY3RzL0Nvbm5lY3Rpdml0eU1hbmFnZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvbmV0L3NyYy9hbmRyb2lkL25ldC9jdHMvQ29ubmVjdGl2aXR5TWFuYWdlclRlc3QuamF2YQpAQCAtMTYsMTkgKzE2LDI5IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5uZXQuY3RzOwogCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5GRUFUVVJFX1RFTEVQSE9OWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfV0lGSTsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQuTmV0d29ya0NhcGFiaWxpdGllcy5ORVRfQ0FQQUJJTElUWV9JTVM7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0Lk5ldHdvcmtDYXBhYmlsaXRpZXMuTkVUX0NBUEFCSUxJVFlfSU5URVJORVQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0Lk5ldHdvcmtDYXBhYmlsaXRpZXMuTkVUX0NBUEFCSUxJVFlfTk9UX01FVEVSRUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0Lk5ldHdvcmtDYXBhYmlsaXRpZXMuVFJBTlNQT1JUX0NFTExVTEFSOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC5OZXR3b3JrQ2FwYWJpbGl0aWVzLlRSQU5TUE9SVF9XSUZJOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLkdsb2JhbC5ORVRXT1JLX01FVEVSRURfTVVMVElQQVRIX1BSRUZFUkVOQ0U7CiAKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5TeXN0ZW1VdGlsLnJ1blNoZWxsQ29tbWFuZDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuQ29ubmVjdGl2aXR5TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5Db25uZWN0aXZpdHlNYW5hZ2VyLk5ldHdvcmtDYWxsYmFjazsKK2ltcG9ydCBhbmRyb2lkLm5ldC5MaW5rUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrOwogaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtDYXBhYmlsaXRpZXM7CiBpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0NvbmZpZzsKQEAgLTM4LDI2ICs0OCw0NCBAQAogaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtSZXF1ZXN0OwogaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKIGltcG9ydCBhbmRyb2lkLnN5c3RlbS5PczsKIGltcG9ydCBhbmRyb2lkLnN5c3RlbS5Pc0NvbnN0YW50czsKIGltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZUNvbnN0YW50czsKIAoraW1wb3J0IGxpYmNvcmUuaW8uU3RyZWFtczsKKwogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlNvY2tldDsKK2ltcG9ydCBqYXZhLm5ldC5IdHRwVVJMQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0NkFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CiBpbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuU29ja2V0OworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLlNjYW5uZXI7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuTGlua2VkQmxvY2tpbmdRdWV1ZTsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKIAogcHVibGljIGNsYXNzIENvbm5lY3Rpdml0eU1hbmFnZXJUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKIApAQCAtNzIsNiArMTAwLDkgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9IT1NUID0gImNvbm5lY3Rpdml0eWNoZWNrLmdzdGF0aWMuY29tIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU09DS0VUX1RJTUVPVVRfTVMgPSAyMDAwOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRU5EX0JST0FEQ0FTVF9USU1FT1VUID0gMzAwMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5FVFdPUktfQ0hBTkdFX01FVEVSRURORVNTX1RJTUVPVVQgPSA1MDAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOVU1fVFJJRVNfTVVMVElQQVRIX1BSRUZfQ0hFQ0sgPSAyMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIElOVEVSVkFMX01VTFRJUEFUSF9QUkVGX0NIRUNLX01TID0gNTAwOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIVFRQX1BPUlQgPSA4MDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9SRVFVRVNUID0KICAgICAgICAgICAgICJHRVQgL2dlbmVyYXRlXzIwNCBIVFRQLzEuMFxyXG4iICsKQEAgLTEwMSwxOCArMTMyLDIyIEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1JTl9OVU1fTkVUV09SS19UWVBFUyA9IDE7CiAKICAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBJbnN0cnVtZW50YXRpb24gbUluc3RydW1lbnRhdGlvbjsKICAgICBwcml2YXRlIENvbm5lY3Rpdml0eU1hbmFnZXIgbUNtOwogICAgIHByaXZhdGUgV2lmaU1hbmFnZXIgbVdpZmlNYW5hZ2VyOwogICAgIHByaXZhdGUgUGFja2FnZU1hbmFnZXIgbVBhY2thZ2VNYW5hZ2VyOwogICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxJbnRlZ2VyLCBOZXR3b3JrQ29uZmlnPiBtTmV0d29ya3MgPQogICAgICAgICAgICAgbmV3IEhhc2hNYXA8SW50ZWdlciwgTmV0d29ya0NvbmZpZz4oKTsKICAgICBib29sZWFuIG1XaWZpQ29ubmVjdEF0dGVtcHRlZDsKKyAgICBwcml2YXRlIFRlc3ROZXR3b3JrQ2FsbGJhY2sgbUNlbGxOZXR3b3JrQ2FsbGJhY2s7CisKIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHN1cGVyLnNldFVwKCk7CiAgICAgICAgIExvb3Blci5wcmVwYXJlKCk7CiAgICAgICAgIG1Db250ZXh0ID0gZ2V0Q29udGV4dCgpOworICAgICAgICBtSW5zdHJ1bWVudGF0aW9uID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCk7CiAgICAgICAgIG1DbSA9IChDb25uZWN0aXZpdHlNYW5hZ2VyKSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQ09OTkVDVElWSVRZX1NFUlZJQ0UpOwogICAgICAgICBtV2lmaU1hbmFnZXIgPSAoV2lmaU1hbmFnZXIpIG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5XSUZJX1NFUlZJQ0UpOwogICAgICAgICBtUGFja2FnZU1hbmFnZXIgPSBtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOwpAQCAtMTQwLDYgKzE3NSwxMCBAQAogICAgICAgICBpZiAobVdpZmlDb25uZWN0QXR0ZW1wdGVkKSB7CiAgICAgICAgICAgICBkaXNjb25uZWN0RnJvbVdpZmkobnVsbCk7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKGNlbGxDb25uZWN0QXR0ZW1wdGVkKCkpIHsKKyAgICAgICAgICAgIGRpc2Nvbm5lY3RGcm9tQ2VsbCgpOworICAgICAgICB9CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNDYsNiArMjg1LDk1IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBUZXN0cyB0aGF0IGNvbm5lY3Rpb25zIGNhbiBiZSBvcGVuZWQgb24gV2lGaSBhbmQgY2VsbHBob25lIG5ldHdvcmtzLAorICAgICAqIGFuZCB0aGF0IHRoZXkgYXJlIG1hZGUgZnJvbSBkaWZmZXJlbnQgSVAgYWRkcmVzc2VzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RPcGVuQ29ubmVjdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBib29sZWFuIGNhblJ1blRlc3QgPSBtUGFja2FnZU1hbmFnZXIuaGFzU3lzdGVtRmVhdHVyZShGRUFUVVJFX1dJRkkpCisgICAgICAgICAgICAgICAgJiYgbVBhY2thZ2VNYW5hZ2VyLmhhc1N5c3RlbUZlYXR1cmUoRkVBVFVSRV9URUxFUEhPTlkpOworICAgICAgICBpZiAoIWNhblJ1blRlc3QpIHsKKyAgICAgICAgICAgIExvZy5pKFRBRywidGVzdE9wZW5Db25uZWN0aW9uIGNhbm5vdCBleGVjdXRlIHVubGVzcyBkZXZpY2Ugc3VwcG9ydHMgYm90aCBXaUZpICIKKyAgICAgICAgICAgICAgICAgICAgKyAiYW5kIGEgY2VsbHVsYXIgY29ubmVjdGlvbiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgTmV0d29yayB3aWZpTmV0d29yayA9IGNvbm5lY3RUb1dpZmkoKTsKKyAgICAgICAgTmV0d29yayBjZWxsTmV0d29yayA9IGNvbm5lY3RUb0NlbGwoKTsKKyAgICAgICAgLy8gVGhpcyBzZXJ2ZXIgcmV0dXJucyB0aGUgcmVxdWVzdG9yJ3MgSVAgYWRkcmVzcyBhcyB0aGUgcmVzcG9uc2UgYm9keS4KKyAgICAgICAgVVJMIHVybCA9IG5ldyBVUkwoImh0dHA6Ly9nb29nbGUtaXB2NnRlc3QuYXBwc3BvdC5jb20vaXAuanM/Zm10PXRleHQiKTsKKyAgICAgICAgU3RyaW5nIHdpZmlBZGRyZXNzU3RyaW5nID0gaHR0cEdldCh3aWZpTmV0d29yaywgdXJsKTsKKyAgICAgICAgU3RyaW5nIGNlbGxBZGRyZXNzU3RyaW5nID0gaHR0cEdldChjZWxsTmV0d29yaywgdXJsKTsKKworICAgICAgICBhc3NlcnRGYWxzZShTdHJpbmcuZm9ybWF0KCJTYW1lIGFkZHJlc3MgJyVzJyBvbiB0d28gZGlmZmVyZW50IG5ldHdvcmtzICglcywgJXMpIiwKKyAgICAgICAgICAgICAgICB3aWZpQWRkcmVzc1N0cmluZywgd2lmaU5ldHdvcmssIGNlbGxOZXR3b3JrKSwKKyAgICAgICAgICAgICAgICB3aWZpQWRkcmVzc1N0cmluZy5lcXVhbHMoY2VsbEFkZHJlc3NTdHJpbmcpKTsKKworICAgICAgICAvLyBTYW5pdHkgY2hlY2sgdGhhdCB0aGUgSVAgYWRkcmVzc2VzIHRoYXQgdGhlIHJlcXVlc3RzIGFwcGVhcmVkIHRvIGNvbWUgZnJvbQorICAgICAgICAvLyBhcmUgYWN0dWFsbHkgb24gdGhlIHJlc3BlY3RpdmUgbmV0d29ya3MuCisgICAgICAgIGFzc2VydE9uTmV0d29yayh3aWZpQWRkcmVzc1N0cmluZywgd2lmaU5ldHdvcmspOworICAgICAgICBhc3NlcnRPbk5ldHdvcmsoY2VsbEFkZHJlc3NTdHJpbmcsIGNlbGxOZXR3b3JrKTsKKworICAgICAgICBhc3NlcnRGYWxzZSgiVW5leHBlY3RlZGx5IGVxdWFsOiAiICsgd2lmaU5ldHdvcmssIHdpZmlOZXR3b3JrLmVxdWFscyhjZWxsTmV0d29yaykpOworICAgIH0KKworICAgIHByaXZhdGUgTmV0d29yayBjb25uZWN0VG9DZWxsKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGNlbGxDb25uZWN0QXR0ZW1wdGVkKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkFscmVhZHkgY29ubmVjdGVkIik7CisgICAgICAgIH0KKyAgICAgICAgTmV0d29ya1JlcXVlc3QgY2VsbFJlcXVlc3QgPSBuZXcgTmV0d29ya1JlcXVlc3QuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLmFkZFRyYW5zcG9ydFR5cGUoVFJBTlNQT1JUX0NFTExVTEFSKQorICAgICAgICAgICAgICAgIC5hZGRDYXBhYmlsaXR5KE5FVF9DQVBBQklMSVRZX0lOVEVSTkVUKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICBtQ2VsbE5ldHdvcmtDYWxsYmFjayA9IG5ldyBUZXN0TmV0d29ya0NhbGxiYWNrKCk7CisgICAgICAgIG1DbS5yZXF1ZXN0TmV0d29yayhjZWxsUmVxdWVzdCwgbUNlbGxOZXR3b3JrQ2FsbGJhY2spOworICAgICAgICBmaW5hbCBOZXR3b3JrIGNlbGxOZXR3b3JrID0gbUNlbGxOZXR3b3JrQ2FsbGJhY2sud2FpdEZvckF2YWlsYWJsZSgpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJDZWxsIG5ldHdvcmsgbm90IGF2YWlsYWJsZSB3aXRoaW4gdGltZW91dCIsIGNlbGxOZXR3b3JrKTsKKyAgICAgICAgcmV0dXJuIGNlbGxOZXR3b3JrOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBjZWxsQ29ubmVjdEF0dGVtcHRlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1DZWxsTmV0d29ya0NhbGxiYWNrICE9IG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRpc2Nvbm5lY3RGcm9tQ2VsbCgpIHsKKyAgICAgICAgaWYgKCFjZWxsQ29ubmVjdEF0dGVtcHRlZCgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDZWxsIGNvbm5lY3Rpb24gbm90IGF0dGVtcHRlZCIpOworICAgICAgICB9CisgICAgICAgIG1DbS51bnJlZ2lzdGVyTmV0d29ya0NhbGxiYWNrKG1DZWxsTmV0d29ya0NhbGxiYWNrKTsKKyAgICAgICAgbUNlbGxOZXR3b3JrQ2FsbGJhY2sgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm1zIGEgSFRUUCBHRVQgdG8gdGhlIHNwZWNpZmllZCBVUkwgb24gdGhlIHNwZWNpZmllZCBOZXR3b3JrLCBhbmQgcmV0dXJucworICAgICAqIHRoZSByZXNwb25zZSBib2R5IGRlY29kZWQgYXMgVVRGLTguCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGh0dHBHZXQoTmV0d29yayBuZXR3b3JrLCBVUkwgaHR0cFVybCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSHR0cFVSTENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IChIdHRwVVJMQ29ubmVjdGlvbikgbmV0d29yay5vcGVuQ29ubmVjdGlvbihodHRwVXJsKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gY29ubmVjdGlvbi5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICAgICAgcmV0dXJuIFN0cmVhbXMucmVhZEZ1bGx5KG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbnB1dFN0cmVhbSwgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgY29ubmVjdGlvbi5kaXNjb25uZWN0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0T25OZXR3b3JrKFN0cmluZyBhZHJlc3NTdHJpbmcsIE5ldHdvcmsgbmV0d29yaykgdGhyb3dzIFVua25vd25Ib3N0RXhjZXB0aW9uIHsKKyAgICAgICAgSW5ldEFkZHJlc3MgYWRkcmVzcyA9IEluZXRBZGRyZXNzLmdldEJ5TmFtZShhZHJlc3NTdHJpbmcpOworICAgICAgICBMaW5rUHJvcGVydGllcyBsaW5rUHJvcGVydGllcyA9IG1DbS5nZXRMaW5rUHJvcGVydGllcyhuZXR3b3JrKTsKKyAgICAgICAgLy8gVG8gbWFrZSBzdXJlIHRoYXQgdGhlIHJlcXVlc3Qgd2VudCBvdXQgb24gdGhlIHJpZ2h0IG5ldHdvcmssIGNoZWNrIHRoYXQKKyAgICAgICAgLy8gdGhlIElQIGFkZHJlc3Mgc2VlbiBieSB0aGUgc2VydmVyIGlzIGFzc2lnbmVkIHRvIHRoZSBleHBlY3RlZCBuZXR3b3JrLgorICAgICAgICAvLyBXZSBjYW4gb25seSBkbyB0aGlzIGZvciBJUHY2IGFkZHJlc3NlcywgYmVjYXVzZSBpbiBJUHY0IHdlIHdpbGwgbGlrZWx5CisgICAgICAgIC8vIGhhdmUgYSBwcml2YXRlIElQdjQgYWRkcmVzcywgYW5kIHRoYXQgd29uJ3QgbWF0Y2ggd2hhdCB0aGUgc2VydmVyIHNlZXMuCisgICAgICAgIGlmIChhZGRyZXNzIGluc3RhbmNlb2YgSW5ldDZBZGRyZXNzKSB7CisgICAgICAgICAgICBhc3NlcnRDb250YWlucyhsaW5rUHJvcGVydGllcy5nZXRBZGRyZXNzZXMoKSwgYWRkcmVzcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYzxUPiB2b2lkIGFzc2VydENvbnRhaW5zKENvbGxlY3Rpb248VD4gY29sbGVjdGlvbiwgVCBlbGVtZW50KSB7CisgICAgICAgIGFzc2VydFRydWUoZWxlbWVudCArICIgbm90IGZvdW5kIGluICIgKyBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uLmNvbnRhaW5zKGVsZW1lbnQpKTsKKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgYXNzZXJ0U3RhcnRVc2luZ05ldHdvcmtGZWF0dXJlVW5zdXBwb3J0ZWQoaW50IG5ldHdvcmtUeXBlLCBTdHJpbmcgZmVhdHVyZSkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgbUNtLnN0YXJ0VXNpbmdOZXR3b3JrRmVhdHVyZShuZXR3b3JrVHlwZSwgZmVhdHVyZSk7CkBAIC0zMjQsNyArNDUyLDcgQEAKICAgICAgKiB0aGF0IGl0IHdvdWxkIGluY3JlYXNlIHRlc3QgY292ZXJhZ2UgYnkgbXVjaCAoaG93IG1hbnkgZGV2aWNlcyBoYXZlIDNHIHJhZGlvIGJ1dCBub3QgV2lmaT8pLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHRlc3RSZWdpc3Rlck5ldHdvcmtDYWxsYmFjaygpIHsKLSAgICAgICAgaWYgKCFtUGFja2FnZU1hbmFnZXIuaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX1dJRkkpKSB7CisgICAgICAgIGlmICghbVBhY2thZ2VNYW5hZ2VyLmhhc1N5c3RlbUZlYXR1cmUoRkVBVFVSRV9XSUZJKSkgewogICAgICAgICAgICAgTG9nLmkoVEFHLCAidGVzdFJlZ2lzdGVyTmV0d29ya0NhbGxiYWNrIGNhbm5vdCBleGVjdXRlIHVubGVzcyBkZXZpY2Ugc3VwcG9ydHMgV2lGaSIpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CkBAIC0zNjQsNyArNDkyLDcgQEAKICAgICAgKiBvZiBhIHtAY29kZSBOZXR3b3JrQ2FsbGJhY2t9LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHRlc3RSZWdpc3Rlck5ldHdvcmtDYWxsYmFja193aXRoUGVuZGluZ0ludGVudCgpIHsKLSAgICAgICAgaWYgKCFtUGFja2FnZU1hbmFnZXIuaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX1dJRkkpKSB7CisgICAgICAgIGlmICghbVBhY2thZ2VNYW5hZ2VyLmhhc1N5c3RlbUZlYXR1cmUoRkVBVFVSRV9XSUZJKSkgewogICAgICAgICAgICAgTG9nLmkoVEFHLCAidGVzdFJlZ2lzdGVyTmV0d29ya0NhbGxiYWNrIGNhbm5vdCBleGVjdXRlIHVubGVzcyBkZXZpY2Ugc3VwcG9ydHMgV2lGaSIpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CkBAIC00NTgsNyArNTg2LDcgQEAKICAgICAgKiBUZXN0cyByZXBvcnRpbmcgb2YgY29ubmVjdGl2aXR5IGNoYW5nZWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdGVzdENvbm5lY3Rpdml0eUNoYW5nZWRfbWFuaWZlc3RSZXF1ZXN0T25seV9zaG91bGROb3RSZWNlaXZlSW50ZW50KCkgewotICAgICAgICBpZiAoIW1QYWNrYWdlTWFuYWdlci5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfV0lGSSkpIHsKKyAgICAgICAgaWYgKCFtUGFja2FnZU1hbmFnZXIuaGFzU3lzdGVtRmVhdHVyZShGRUFUVVJFX1dJRkkpKSB7CiAgICAgICAgICAgICBMb2cuaShUQUcsICJ0ZXN0Q29ubmVjdGl2aXR5Q2hhbmdlZF9tYW5pZmVzdFJlcXVlc3RPbmx5X3Nob3VsZE5vdFJlY2VpdmVJbnRlbnQgY2Fubm90IGV4ZWN1dGUgdW5sZXNzIGRldmljZSBzdXBwb3J0cyBXaUZpIik7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KQEAgLTQ3NSw3ICs2MDMsNyBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25uZWN0aXZpdHlDaGFuZ2VkX3doZW5SZWdpc3RlcmVkX3Nob3VsZFJlY2VpdmVJbnRlbnQoKSB7Ci0gICAgICAgIGlmICghbVBhY2thZ2VNYW5hZ2VyLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9XSUZJKSkgeworICAgICAgICBpZiAoIW1QYWNrYWdlTWFuYWdlci5oYXNTeXN0ZW1GZWF0dXJlKEZFQVRVUkVfV0lGSSkpIHsKICAgICAgICAgICAgIExvZy5pKFRBRywgInRlc3RDb25uZWN0aXZpdHlDaGFuZ2VkX3doZW5SZWdpc3RlcmVkX3Nob3VsZFJlY2VpdmVJbnRlbnQgY2Fubm90IGV4ZWN1dGUgdW5sZXNzIGRldmljZSBzdXBwb3J0cyBXaUZpIik7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KQEAgLTQ5NSwxNCArNjIzLDE0IEBACiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29ubmVjdGl2aXR5Q2hhbmdlZF9tYW5pZmVzdFJlcXVlc3RPbmx5UHJlTl9zaG91bGRSZWNlaXZlSW50ZW50KCkKICAgICAgICAgICAgIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghbVBhY2thZ2VNYW5hZ2VyLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9XSUZJKSkgeworICAgICAgICBpZiAoIW1QYWNrYWdlTWFuYWdlci5oYXNTeXN0ZW1GZWF0dXJlKEZFQVRVUkVfV0lGSSkpIHsKICAgICAgICAgICAgIExvZy5pKFRBRywgInRlc3RDb25uZWN0aXZpdHlDaGFuZ2VkX21hbmlmZXN0UmVxdWVzdE9ubHlQcmVOX3Nob3VsZFJlY2VpdmVJbnRlbnQgY2Fubm90IGV4ZWN1dGUgdW5sZXNzIGRldmljZSBzdXBwb3J0cyBXaUZpIik7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgSW50ZW50IHN0YXJ0SW50ZW50ID0gbmV3IEludGVudCgpOwotICAgICAgICBzdGFydEludGVudC5zZXRDb21wb25lbnQobmV3IENvbXBvbmVudE5hbWUoImFuZHJvaWQubmV0LmN0cy5hcHBGb3JBcGkyMyIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQubmV0LmN0cy5hcHBGb3JBcGkyMy5Db25uZWN0aXZpdHlMaXN0ZW5pbmdBY3Rpdml0eSIpKTsKLSAgICAgICAgbUNvbnRleHQuc3RhcnRBY3Rpdml0eShzdGFydEludGVudCk7CisgICAgICAgIG1Db250ZXh0LnN0YXJ0QWN0aXZpdHkobmV3IEludGVudCgpCisgICAgICAgICAgICAgICAgLnNldENvbXBvbmVudChuZXcgQ29tcG9uZW50TmFtZSgiYW5kcm9pZC5uZXQuY3RzLmFwcEZvckFwaTIzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLm5ldC5jdHMuYXBwRm9yQXBpMjMuQ29ubmVjdGl2aXR5TGlzdGVuaW5nQWN0aXZpdHkiKSkKKyAgICAgICAgICAgICAgICAuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spKTsKICAgICAgICAgVGhyZWFkLnNsZWVwKDIwMCk7CiAKICAgICAgICAgdG9nZ2xlV2lmaSgpOwpAQCAtODM1LDQgKzk2MywxNDYgQEAKICAgICAgICAgYXNzZXJ0VHJ1ZShsb3dlckJvdW5kU2VjIDw9IGludGVydmFsKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShpbnRlcnZhbCA8PSB1cHBlckJvdW5kU2VjKTsKICAgICB9CisKKyAgICAvLyBSZXR1cm5zICJ0cnVlIiwgImZhbHNlIiBvciAibm9uZSIKKyAgICBwcml2YXRlIFN0cmluZyBnZXRXaWZpTWV0ZXJlZFN0YXR1cyhTdHJpbmcgc3NpZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIEludGVyZXN0aW5nbHkgZ2l2aW5nIHRoZSBTU0lEIGFzIGFuIGFyZ3VtZW50IHRvIGxpc3Qgd2lmaS1uZXR3b3JrcworICAgICAgICAvLyBvbmx5IHdvcmtzIGlmZiB0aGUgbmV0d29yayBpbiBxdWVzdGlvbiBoYXMgdGhlICJmYWxzZSIgcG9saWN5LgorICAgICAgICAvLyBBbHNvIHVuZm9ydHVuYXRlbHkgcnVuU2hlbGxDb21tYW5kIGRvZXMgbm90IHBhc3MgdGhlIGNvbW1hbmQgdG8gdGhlIGludGVycHJldGVyCisgICAgICAgIC8vIHNvIGl0J3Mgbm90IHBvc3NpYmxlIHRvIHwgZ3JlcCB0aGUgc3NpZC4KKyAgICAgICAgZmluYWwgU3RyaW5nIGNvbW1hbmQgPSAiY21kIG5ldHBvbGljeSBsaXN0IHdpZmktbmV0d29ya3MiOworICAgICAgICBmaW5hbCBTdHJpbmcgcG9saWN5U3RyaW5nID0gcnVuU2hlbGxDb21tYW5kKG1JbnN0cnVtZW50YXRpb24sIGNvbW1hbmQpOworCisgICAgICAgIGZpbmFsIE1hdGNoZXIgbSA9IFBhdHRlcm4uY29tcGlsZSgiXiIgKyBzc2lkICsgIjsodHJ1ZXxmYWxzZXxub25lKSQiLAorICAgICAgICAgICAgICAgIFBhdHRlcm4uTVVMVElMSU5FIHwgUGF0dGVybi5VTklYX0xJTkVTKS5tYXRjaGVyKHBvbGljeVN0cmluZyk7CisgICAgICAgIGlmICghbS5maW5kKCkpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgZm9ybWF0IGZyb20gY21kIG5ldHBvbGljeSIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtLmdyb3VwKDEpOworICAgIH0KKworICAgIC8vIG1ldGVyZWQgc2hvdWxkIGJlICJ0cnVlIiwgImZhbHNlIiBvciAibm9uZSIKKyAgICBwcml2YXRlIHZvaWQgc2V0V2lmaU1ldGVyZWRTdGF0dXMoU3RyaW5nIHNzaWQsIFN0cmluZyBtZXRlcmVkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHNldENvbW1hbmQgPSAiY21kIG5ldHBvbGljeSBzZXQgbWV0ZXJlZC1uZXR3b3JrICIgKyBzc2lkICsgIiAiICsgbWV0ZXJlZDsKKyAgICAgICAgcnVuU2hlbGxDb21tYW5kKG1JbnN0cnVtZW50YXRpb24sIHNldENvbW1hbmQpOworICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0V2lmaU1ldGVyZWRTdGF0dXMoc3NpZCksIG1ldGVyZWQpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIHVucXVvdGVTU0lEKFN0cmluZyBzc2lkKSB7CisgICAgICAgIC8vIFNTSUQgaXMgcmV0dXJuZWQgc3Vycm91bmRlZCBieSBxdW90ZXMgaWYgaXQgY2FuIGJlIGRlY29kZWQgYXMgVVRGLTguCisgICAgICAgIC8vIE90aGVyd2lzZSBpdCdzIGd1YXJhbnRlZWQgbm90IHRvIHN0YXJ0IHdpdGggYSBxdW90ZS4KKyAgICAgICAgaWYgKHNzaWQuY2hhckF0KDApID09ICciJykgeworICAgICAgICAgICAgcmV0dXJuIHNzaWQuc3Vic3RyaW5nKDEsIHNzaWQubGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBzc2lkOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdhaXRGb3JBY3RpdmVOZXR3b3JrTWV0ZXJlZChib29sZWFuIHJlcXVlc3RlZE1ldGVyZWRuZXNzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgICAgIGZpbmFsIE5ldHdvcmtDYWxsYmFjayBuZXR3b3JrQ2FsbGJhY2sgPSBuZXcgTmV0d29ya0NhbGxiYWNrKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNhcGFiaWxpdGllc0NoYW5nZWQoTmV0d29yayBuZXR3b3JrLCBOZXR3b3JrQ2FwYWJpbGl0aWVzIG5jKSB7CisgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBtZXRlcmVkID0gIW5jLmhhc0NhcGFiaWxpdHkoTkVUX0NBUEFCSUxJVFlfTk9UX01FVEVSRUQpOworICAgICAgICAgICAgICAgIGlmIChtZXRlcmVkID09IHJlcXVlc3RlZE1ldGVyZWRuZXNzKSB7CisgICAgICAgICAgICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgLy8gUmVnaXN0ZXJpbmcgYSBjYWxsYmFjayBoZXJlIGd1YXJhbnRlZXMgb25DYXBhYmlsaXRpZXNDaGFuZ2VkIGlzIGNhbGxlZCBpbW1lZGlhdGVseQorICAgICAgICAvLyB3aXRoIHRoZSBjdXJyZW50IHNldHRpbmcuIFRoZXJlZm9yZSwgaWYgdGhlIHNldHRpbmcgaGFzIGFscmVhZHkgYmVlbiBjaGFuZ2VkLAorICAgICAgICAvLyB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiByaWdodCBhd2F5LCBhbmQgaWYgbm90IGl0IHdpbGwgd2FpdCBmb3IgdGhlIHNldHRpbmcgdG8gY2hhbmdlLgorICAgICAgICBtQ20ucmVnaXN0ZXJEZWZhdWx0TmV0d29ya0NhbGxiYWNrKG5ldHdvcmtDYWxsYmFjayk7CisgICAgICAgIGlmICghbGF0Y2guYXdhaXQoTkVUV09SS19DSEFOR0VfTUVURVJFRE5FU1NfVElNRU9VVCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKSkgeworICAgICAgICAgICAgZmFpbCgiVGltZWQgb3V0IHdhaXRpbmcgZm9yIGFjdGl2ZSBuZXR3b3JrIG1ldGVyZWQgc3RhdHVzIHRvIGNoYW5nZSB0byAiCisgICAgICAgICAgICAgICAgICsgcmVxdWVzdGVkTWV0ZXJlZG5lc3MgKyAiIDsgbmV0d29yayA9ICIgKyBtQ20uZ2V0QWN0aXZlTmV0d29yaygpKTsKKyAgICAgICAgfQorICAgICAgICBtQ20udW5yZWdpc3Rlck5ldHdvcmtDYWxsYmFjayhuZXR3b3JrQ2FsbGJhY2spOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRNdWx0aXBhdGhQcmVmZXJlbmNlSXNFdmVudHVhbGx5KE5ldHdvcmsgbmV0d29yaywgaW50IG9sZFZhbHVlLAorICAgICAgICAgICAgaW50IGV4cGVjdGVkVmFsdWUpIHsKKyAgICAgICAgLy8gU2FuaXR5IGNoZWNrIDogaWYgb2xkVmFsdWUgPT0gZXhwZWN0ZWRWYWx1ZSwgdGhlcmUgaXMgbm8gd2F5IHRvIGd1YXJhbnRlZSB0aGUgdGVzdAorICAgICAgICAvLyBpcyBub3QgZmxha3kuCisgICAgICAgIGFzc2VydE5vdFNhbWUob2xkVmFsdWUsIGV4cGVjdGVkVmFsdWUpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1RSSUVTX01VTFRJUEFUSF9QUkVGX0NIRUNLOyArK2kpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBhY3R1YWxWYWx1ZSA9IG1DbS5nZXRNdWx0aXBhdGhQcmVmZXJlbmNlKG5ldHdvcmspOworICAgICAgICAgICAgaWYgKGFjdHVhbFZhbHVlID09IGV4cGVjdGVkVmFsdWUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYWN0dWFsVmFsdWUgIT0gb2xkVmFsdWUpIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJNdWx0aXBhdGggcHJlZmVyZW5jZSBpcyBuZWl0aGVyIHByZXZpb3VzICgiICsgb2xkVmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIikgbm9yIGV4cGVjdGVkICgiICsgZXhwZWN0ZWRWYWx1ZSArICIpIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTeXN0ZW1DbG9jay5zbGVlcChJTlRFUlZBTF9NVUxUSVBBVEhfUFJFRl9DSEVDS19NUyk7CisgICAgICAgIH0KKyAgICAgICAgZmFpbCgiVGltZWQgb3V0IHdhaXRpbmcgZm9yIG11bHRpcGF0aCBwcmVmZXJlbmNlIHRvIGNoYW5nZS4gZXhwZWN0ZWQgPSAiCisgICAgICAgICAgICAgICAgKyBleHBlY3RlZFZhbHVlICsgIiA7IGFjdHVhbCA9ICIgKyBtQ20uZ2V0TXVsdGlwYXRoUHJlZmVyZW5jZShuZXR3b3JrKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgZ2V0Q3VycmVudE1ldGVyZWRNdWx0aXBhdGhQcmVmZXJlbmNlKENvbnRlbnRSZXNvbHZlciByZXNvbHZlcikgeworICAgICAgICBmaW5hbCBTdHJpbmcgcmF3TWV0ZXJlZFByZWYgPSBTZXR0aW5ncy5HbG9iYWwuZ2V0U3RyaW5nKHJlc29sdmVyLAorICAgICAgICAgICAgICAgIE5FVFdPUktfTUVURVJFRF9NVUxUSVBBVEhfUFJFRkVSRU5DRSk7CisgICAgICAgIHJldHVybiBUZXh0VXRpbHMuaXNFbXB0eShyYXdNZXRlcmVkUHJlZikKKyAgICAgICAgICAgID8gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0SW50ZWdlcihSLmludGVnZXIuY29uZmlnX25ldHdvcmtNZXRlcmVkTXVsdGlwYXRoUHJlZmVyZW5jZSkKKyAgICAgICAgICAgIDogSW50ZWdlci5wYXJzZUludChyYXdNZXRlcmVkUHJlZik7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgZmluZE5leHRQcmVmVmFsdWUoQ29udGVudFJlc29sdmVyIHJlc29sdmVyKSB7CisgICAgICAgIC8vIEEgYml0IG9mIGEgbnVjbGVhciBoYW1tZXIsIGJ1dCByYWNlIGNvbmRpdGlvbnMgaW4gQ1RTIGFyZSBiYWQuIFRvIGJlIGFibGUgdG8KKyAgICAgICAgLy8gZGV0ZWN0IGEgY29ycmVjdCBzZXR0aW5nIHZhbHVlIHdpdGhvdXQgcmFjZSBjb25kaXRpb25zLCB0aGUgbmV4dCBwcmVmIG11c3QKKyAgICAgICAgLy8gYmUgYSB2YWxpZCB2YWx1ZSAocmFuZ2UgMC4uMykgdGhhdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgb2xkIHNldHRpbmcgb2YgdGhlCisgICAgICAgIC8vIG1ldGVyZWQgcHJlZmVyZW5jZSBhbmQgZnJvbSB0aGUgdW5tZXRlcmVkIHByZWZlcmVuY2UuCisgICAgICAgIGZpbmFsIGludCBtZXRlcmVkUHJlZiA9IGdldEN1cnJlbnRNZXRlcmVkTXVsdGlwYXRoUHJlZmVyZW5jZShyZXNvbHZlcik7CisgICAgICAgIGZpbmFsIGludCB1bm1ldGVyZWRQcmVmID0gQ29ubmVjdGl2aXR5TWFuYWdlci5NVUxUSVBBVEhfUFJFRkVSRU5DRV9VTk1FVEVSRUQ7CisgICAgICAgIGlmICgwICE9IG1ldGVyZWRQcmVmICYmIDAgIT0gdW5tZXRlcmVkUHJlZikgcmV0dXJuIDA7CisgICAgICAgIGlmICgxICE9IG1ldGVyZWRQcmVmICYmIDEgIT0gdW5tZXRlcmVkUHJlZikgcmV0dXJuIDE7CisgICAgICAgIHJldHVybiAyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZlcmlmeSB0aGF0IGdldE11bHRpcGF0aFByZWZlcmVuY2UgZG9lcyByZXR1cm4gYXBwcm9wcmlhdGUgdmFsdWVzCisgICAgICogZm9yIG1ldGVyZWQgYW5kIHVubWV0ZXJlZCBuZXR3b3Jrcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TXVsdGlwYXRoUHJlZmVyZW5jZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBDb250ZW50UmVzb2x2ZXIgcmVzb2x2ZXIgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKKyAgICAgICAgZmluYWwgTmV0d29yayBuZXR3b3JrID0gZW5zdXJlV2lmaUNvbm5lY3RlZCgpOworICAgICAgICBmaW5hbCBTdHJpbmcgc3NpZCA9IHVucXVvdGVTU0lEKG1XaWZpTWFuYWdlci5nZXRDb25uZWN0aW9uSW5mbygpLmdldFNTSUQoKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBvbGRNZXRlcmVkU2V0dGluZyA9IGdldFdpZmlNZXRlcmVkU3RhdHVzKHNzaWQpOworICAgICAgICBmaW5hbCBTdHJpbmcgb2xkTWV0ZXJlZE11bHRpcGF0aFByZWZlcmVuY2UgPSBTZXR0aW5ncy5HbG9iYWwuZ2V0U3RyaW5nKAorICAgICAgICAgICAgICAgIHJlc29sdmVyLCBORVRXT1JLX01FVEVSRURfTVVMVElQQVRIX1BSRUZFUkVOQ0UpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgaW50IGluaXRpYWxNZXRlcmVkUHJlZmVyZW5jZSA9IGdldEN1cnJlbnRNZXRlcmVkTXVsdGlwYXRoUHJlZmVyZW5jZShyZXNvbHZlcik7CisgICAgICAgICAgICBpbnQgbmV3TWV0ZXJlZFByZWZlcmVuY2UgPSBmaW5kTmV4dFByZWZWYWx1ZShyZXNvbHZlcik7CisgICAgICAgICAgICBTZXR0aW5ncy5HbG9iYWwucHV0U3RyaW5nKHJlc29sdmVyLCBORVRXT1JLX01FVEVSRURfTVVMVElQQVRIX1BSRUZFUkVOQ0UsCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcobmV3TWV0ZXJlZFByZWZlcmVuY2UpKTsKKyAgICAgICAgICAgIHNldFdpZmlNZXRlcmVkU3RhdHVzKHNzaWQsICJ0cnVlIik7CisgICAgICAgICAgICB3YWl0Rm9yQWN0aXZlTmV0d29ya01ldGVyZWQodHJ1ZSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobUNtLmdldE5ldHdvcmtDYXBhYmlsaXRpZXMobmV0d29yaykuaGFzQ2FwYWJpbGl0eSgKKyAgICAgICAgICAgICAgICAgICAgTkVUX0NBUEFCSUxJVFlfTk9UX01FVEVSRUQpLCBmYWxzZSk7CisgICAgICAgICAgICBhc3NlcnRNdWx0aXBhdGhQcmVmZXJlbmNlSXNFdmVudHVhbGx5KG5ldHdvcmssIGluaXRpYWxNZXRlcmVkUHJlZmVyZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgbmV3TWV0ZXJlZFByZWZlcmVuY2UpOworCisgICAgICAgICAgICBmaW5hbCBpbnQgb2xkTWV0ZXJlZFByZWZlcmVuY2UgPSBuZXdNZXRlcmVkUHJlZmVyZW5jZTsKKyAgICAgICAgICAgIG5ld01ldGVyZWRQcmVmZXJlbmNlID0gZmluZE5leHRQcmVmVmFsdWUocmVzb2x2ZXIpOworICAgICAgICAgICAgU2V0dGluZ3MuR2xvYmFsLnB1dFN0cmluZyhyZXNvbHZlciwgTkVUV09SS19NRVRFUkVEX01VTFRJUEFUSF9QUkVGRVJFTkNFLAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG5ld01ldGVyZWRQcmVmZXJlbmNlKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobUNtLmdldE5ldHdvcmtDYXBhYmlsaXRpZXMobmV0d29yaykuaGFzQ2FwYWJpbGl0eSgKKyAgICAgICAgICAgICAgICAgICAgTkVUX0NBUEFCSUxJVFlfTk9UX01FVEVSRUQpLCBmYWxzZSk7CisgICAgICAgICAgICBhc3NlcnRNdWx0aXBhdGhQcmVmZXJlbmNlSXNFdmVudHVhbGx5KG5ldHdvcmssCisgICAgICAgICAgICAgICAgICAgIG9sZE1ldGVyZWRQcmVmZXJlbmNlLCBuZXdNZXRlcmVkUHJlZmVyZW5jZSk7CisKKyAgICAgICAgICAgIHNldFdpZmlNZXRlcmVkU3RhdHVzKHNzaWQsICJmYWxzZSIpOworICAgICAgICAgICAgd2FpdEZvckFjdGl2ZU5ldHdvcmtNZXRlcmVkKGZhbHNlKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhtQ20uZ2V0TmV0d29ya0NhcGFiaWxpdGllcyhuZXR3b3JrKS5oYXNDYXBhYmlsaXR5KAorICAgICAgICAgICAgICAgICAgICBORVRfQ0FQQUJJTElUWV9OT1RfTUVURVJFRCksIHRydWUpOworICAgICAgICAgICAgYXNzZXJ0TXVsdGlwYXRoUHJlZmVyZW5jZUlzRXZlbnR1YWxseShuZXR3b3JrLCBuZXdNZXRlcmVkUHJlZmVyZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGl2aXR5TWFuYWdlci5NVUxUSVBBVEhfUFJFRkVSRU5DRV9VTk1FVEVSRUQpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgU2V0dGluZ3MuR2xvYmFsLnB1dFN0cmluZyhyZXNvbHZlciwgTkVUV09SS19NRVRFUkVEX01VTFRJUEFUSF9QUkVGRVJFTkNFLAorICAgICAgICAgICAgICAgICAgICBvbGRNZXRlcmVkTXVsdGlwYXRoUHJlZmVyZW5jZSk7CisgICAgICAgICAgICBzZXRXaWZpTWV0ZXJlZFN0YXR1cyhzc2lkLCBvbGRNZXRlcmVkU2V0dGluZyk7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9uZXQvc3JjL2FuZHJvaWQvbmV0L2N0cy9EbnNUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9uZXQvc3JjL2FuZHJvaWQvbmV0L2N0cy9EbnNUZXN0LmphdmEKaW5kZXggODU3NWMzMy4uODQyMzFjMiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbmV0L3NyYy9hbmRyb2lkL25ldC9jdHMvRG5zVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL25ldC9zcmMvYW5kcm9pZC9uZXQvY3RzL0Ruc1Rlc3QuamF2YQpAQCAtMTksNiArMTksOSBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5Db25uZWN0aXZpdHlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubmV0LkNvbm5lY3Rpdml0eU1hbmFnZXIuTmV0d29ya0NhbGxiYWNrOworaW1wb3J0IGFuZHJvaWQubmV0LkxpbmtQcm9wZXJ0aWVzOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcms7CiBpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0luZm87CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKIGltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwpAQCAtMjksNiArMzIsOCBAQAogaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOwogaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiAKIHB1YmxpYyBjbGFzcyBEbnNUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKIApAQCAtNDAsNiArNDUsMTIgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkRuc1Rlc3QiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9YWV9ORVRXT1JLX1RZUEUgPSAiUFJPWFkiOwogCisgICAgcHJpdmF0ZSBDb25uZWN0aXZpdHlNYW5hZ2VyIG1DbTsKKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBtQ20gPSBnZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShDb25uZWN0aXZpdHlNYW5hZ2VyLmNsYXNzKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBAcmV0dXJuIHRydWUgb24gc3VjY2VzcwogICAgICAqLwpAQCAtNTcsNyArNjgsOSBAQAogICAgICAqIFBlcmYgLSBtZWFzdXJlIHNpemUgb2YgZmlyc3QgYW5kIHNlY29uZCB0aWVyIGNhY2hlcyBhbmQgdGhlaXIgZWZmZWN0CiAgICAgICogQXNzZXJ0IHJlcXVpcmVzIG5ldHdvcmsgcGVybWlzc2lvbgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3REbnNXb3JrcygpIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG5zV29ya3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZW5zdXJlSXB2NkNvbm5lY3Rpdml0eSgpOworCiAgICAgICAgIEluZXRBZGRyZXNzIGFkZHJzW10gPSB7fTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGFkZHJzID0gSW5ldEFkZHJlc3MuZ2V0QWxsQnlOYW1lKCJ3d3cuZ29vZ2xlLmNvbSIpOwpAQCAtODgsMTEgKzEwMSwxNCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgYWRkcnMgPSBJbmV0QWRkcmVzcy5nZXRBbGxCeU5hbWUoImlwdjYuZ29vZ2xlLmNvbSIpOwogICAgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7fQotICAgICAgICBhc3NlcnRUcnVlKCJbUkVSVU5dIEROUyBjb3VsZCBub3QgcmVzb2x2ZSBpcHY2Lmdvb2dsZS5jb20sIGNoZWNrIHRoZSBuZXR3b3JrIHN1cHBvcnRzIElQdjYiLAotICAgICAgICAgICAgICAgIGFkZHJzLmxlbmd0aCAhPSAwKTsKKyAgICAgICAgU3RyaW5nIG1zZyA9CisgICAgICAgICAgICAiW1JFUlVOXSBETlMgY291bGQgbm90IHJlc29sdmUgaXB2Ni5nb29nbGUuY29tLCBjaGVjayB0aGUgbmV0d29yayBzdXBwb3J0cyBJUHY2LiBscD0iICsKKyAgICAgICAgICAgIG1DbS5nZXRBY3RpdmVMaW5rUHJvcGVydGllcygpOworICAgICAgICBhc3NlcnRUcnVlKG1zZywgYWRkcnMubGVuZ3RoICE9IDApOwogICAgICAgICBmb3IgKEluZXRBZGRyZXNzIGFkZHIgOiBhZGRycykgewotICAgICAgICAgICAgYXNzZXJ0RmFsc2UgKCJbUkVSVU5dIGlwdjYuZ29vZ2xlLmNvbSByZXR1cm5lZCBJUHY0IGFkZHJlc3M6ICIgKyBhZGRyLmdldEhvc3RBZGRyZXNzKCkgKwotICAgICAgICAgICAgICAgICAgICAiLCBjaGVjayB5b3VyIG5ldHdvcmsncyBETlMgc2VydmVyIiwgYWRkciBpbnN0YW5jZW9mIEluZXQ0QWRkcmVzcyk7CisgICAgICAgICAgICBtc2cgPSAiW1JFUlVOXSBpcHY2Lmdvb2dsZS5jb20gcmV0dXJuZWQgSVB2NCBhZGRyZXNzOiAiICsgYWRkci5nZXRIb3N0QWRkcmVzcygpICsKKyAgICAgICAgICAgICAgICAgICAgIiwgY2hlY2sgeW91ciBuZXR3b3JrJ3MgRE5TIHNlcnZlci4gbHA9IiArIG1DbS5nZXRBY3RpdmVMaW5rUHJvcGVydGllcygpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UgKG1zZywgYWRkciBpbnN0YW5jZW9mIEluZXQ0QWRkcmVzcyk7CiAgICAgICAgICAgICBmb3VuZFY2IHw9IChhZGRyIGluc3RhbmNlb2YgSW5ldDZBZGRyZXNzKTsKICAgICAgICAgICAgIGlmIChEQkcpIExvZy5lKFRBRywgImlwdjYuZ29vZ2xlLmNvbSBnYXZlICIgKyBhZGRyLnRvU3RyaW5nKCkpOwogICAgICAgICB9CkBAIC0yNTYsMTMgKzI3MiwzNSBAQAogICAgIH0KIAogICAgIHByaXZhdGUgYm9vbGVhbiBhY3RpdmVOZXR3b3JrSW5mb0lzUHJveHkoKSB7Ci0gICAgICAgIENvbm5lY3Rpdml0eU1hbmFnZXIgY20gPSAoQ29ubmVjdGl2aXR5TWFuYWdlcikKLSAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkNPTk5FQ1RJVklUWV9TRVJWSUNFKTsKLSAgICAgICAgTmV0d29ya0luZm8gaW5mbyA9IGNtLmdldEFjdGl2ZU5ldHdvcmtJbmZvKCk7CisgICAgICAgIE5ldHdvcmtJbmZvIGluZm8gPSBtQ20uZ2V0QWN0aXZlTmV0d29ya0luZm8oKTsKICAgICAgICAgaWYgKFBST1hZX05FVFdPUktfVFlQRS5lcXVhbHMoaW5mby5nZXRUeXBlTmFtZSgpKSkgewogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGVuc3VyZUlwdjZDb25uZWN0aXZpdHkoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICAgICAgZmluYWwgaW50IFRJTUVPVVRfTVMgPSA1XzAwMDsKKworICAgICAgICBmaW5hbCBOZXR3b3JrQ2FsbGJhY2sgY2FsbGJhY2sgPSBuZXcgTmV0d29ya0NhbGxiYWNrKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkxpbmtQcm9wZXJ0aWVzQ2hhbmdlZChOZXR3b3JrIG5ldHdvcmssIExpbmtQcm9wZXJ0aWVzIGxwKSB7CisgICAgICAgICAgICAgICAgaWYgKGxwLmhhc0dsb2JhbElQdjZBZGRyZXNzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBtQ20ucmVnaXN0ZXJEZWZhdWx0TmV0d29ya0NhbGxiYWNrKGNhbGxiYWNrKTsKKworICAgICAgICBTdHJpbmcgbXNnID0gIkRlZmF1bHQgbmV0d29yayBkaWQgbm90IHByb3ZpZGUgSVB2NiBjb25uZWN0aXZpdHkgYWZ0ZXIgIiArIFRJTUVPVVRfTVMKKyAgICAgICAgICAgICAgICArICJtcy4gUGxlYXNlIGNvbm5lY3QgdG8gYW4gSVB2Ni1jYXBhYmxlIG5ldHdvcmsuIGxwPSIKKyAgICAgICAgICAgICAgICArIG1DbS5nZXRBY3RpdmVMaW5rUHJvcGVydGllcygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtc2csIGxhdGNoLmF3YWl0KFRJTUVPVVRfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgbUNtLnVucmVnaXN0ZXJOZXR3b3JrQ2FsbGJhY2soY2FsbGJhY2spOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbmV0L3NyYy9hbmRyb2lkL25ldC9jdHMvSXBTZWNCYXNlVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvbmV0L3NyYy9hbmRyb2lkL25ldC9jdHMvSXBTZWNCYXNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMzJlY2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9uZXQvc3JjL2FuZHJvaWQvbmV0L2N0cy9JcFNlY0Jhc2VUZXN0LmphdmEKQEAgLTAsMCArMSw1MTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubmV0LmN0czsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEFycmF5RXF1YWxzOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5uZXQuSXBTZWNBbGdvcml0aG07CitpbXBvcnQgYW5kcm9pZC5uZXQuSXBTZWNNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubmV0LklwU2VjVHJhbnNmb3JtOworaW1wb3J0IGFuZHJvaWQuc3lzdGVtLk9zOworaW1wb3J0IGFuZHJvaWQuc3lzdGVtLk9zQ29uc3RhbnRzOworaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEuaW8uRmlsZURlc2NyaXB0b3I7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5EYXRhZ3JhbVBhY2tldDsKK2ltcG9ydCBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldDsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0NEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuSW5ldDZBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlNlcnZlclNvY2tldDsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7CitpbXBvcnQgamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CisKK3B1YmxpYyBjbGFzcyBJcFNlY0Jhc2VUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBJcFNlY0Jhc2VUZXN0LmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElQVjRfTE9PUEJBQ0sgPSAiMTI3LjAuMC4xIjsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJUFY2X0xPT1BCQUNLID0gIjo6MSI7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBMT09QQkFDS19BRERSUyA9IG5ldyBTdHJpbmdbXSB7SVBWNF9MT09QQkFDSywgSVBWNl9MT09QQkFDS307CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBESVJFQ1RJT05TID0KKyAgICAgICAgICAgIG5ldyBpbnRbXSB7SXBTZWNNYW5hZ2VyLkRJUkVDVElPTl9JTiwgSXBTZWNNYW5hZ2VyLkRJUkVDVElPTl9PVVR9OworCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBieXRlW10gVEVTVF9EQVRBID0gIkJlc3QgdGVzdCBkYXRhIGV2ZXIhIi5nZXRCeXRlcygpOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IERBVEFfQlVGRkVSX0xFTiA9IDQwOTY7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgU09DS19USU1FT1VUID0gNTAwOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIEtFWV9EQVRBID0geworICAgICAgICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LAorICAgICAgICAweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBDLCAweDBELCAweDBFLCAweDBGLAorICAgICAgICAweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LAorICAgICAgICAweDE4LCAweDE5LCAweDFBLCAweDFCLCAweDFDLCAweDFELCAweDFFLCAweDFGLAorICAgICAgICAweDIwLCAweDIxLCAweDIyLCAweDIzCisgICAgfTsKKworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYnl0ZVtdIEFVVEhfS0VZID0gZ2V0S2V5KDI1Nik7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBieXRlW10gQ1JZUFRfS0VZID0gZ2V0S2V5KDI1Nik7CisKKyAgICBwcm90ZWN0ZWQgSXBTZWNNYW5hZ2VyIG1JU007CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICBtSVNNID0gKElwU2VjTWFuYWdlcikgZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5JUFNFQ19TRVJWSUNFKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGJ5dGVbXSBnZXRLZXkoaW50IGJpdExlbmd0aCkgeworICAgICAgICByZXR1cm4gQXJyYXlzLmNvcHlPZihLRVlfREFUQSwgYml0TGVuZ3RoIC8gOCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBpbnQgZ2V0RG9tYWluKEluZXRBZGRyZXNzIGFkZHJlc3MpIHsKKyAgICAgICAgaW50IGRvbWFpbjsKKyAgICAgICAgaWYgKGFkZHJlc3MgaW5zdGFuY2VvZiBJbmV0NkFkZHJlc3MpIHsKKyAgICAgICAgICAgIGRvbWFpbiA9IE9zQ29uc3RhbnRzLkFGX0lORVQ2OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZG9tYWluID0gT3NDb25zdGFudHMuQUZfSU5FVDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZG9tYWluOworICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgaW50IGdldFBvcnQoRmlsZURlc2NyaXB0b3Igc29jaykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiAoKEluZXRTb2NrZXRBZGRyZXNzKSBPcy5nZXRzb2NrbmFtZShzb2NrKSkuZ2V0UG9ydCgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEdlbmVyaWNTb2NrZXQgZXh0ZW5kcyBBdXRvQ2xvc2VhYmxlIHsKKyAgICAgICAgdm9pZCBzZW5kKGJ5dGVbXSBkYXRhKSB0aHJvd3MgRXhjZXB0aW9uOworCisgICAgICAgIGJ5dGVbXSByZWNlaXZlKCkgdGhyb3dzIEV4Y2VwdGlvbjsKKworICAgICAgICBpbnQgZ2V0UG9ydCgpIHRocm93cyBFeGNlcHRpb247CisKKyAgICAgICAgdm9pZCBjbG9zZSgpIHRocm93cyBFeGNlcHRpb247CisKKyAgICAgICAgdm9pZCBhcHBseVRyYW5zcG9ydE1vZGVUcmFuc2Zvcm0oCisgICAgICAgICAgICAgICAgSXBTZWNNYW5hZ2VyIGlzbSwgaW50IGRpcmVjdGlvbiwgSXBTZWNUcmFuc2Zvcm0gdHJhbnNmb3JtKSB0aHJvd3MgRXhjZXB0aW9uOworCisgICAgICAgIHZvaWQgcmVtb3ZlVHJhbnNwb3J0TW9kZVRyYW5zZm9ybXMoSXBTZWNNYW5hZ2VyIGlzbSkgdGhyb3dzIEV4Y2VwdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBHZW5lcmljVGNwU29ja2V0IGV4dGVuZHMgR2VuZXJpY1NvY2tldCB7fQorCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgR2VuZXJpY1VkcFNvY2tldCBleHRlbmRzIEdlbmVyaWNTb2NrZXQgeworICAgICAgICB2b2lkIHNlbmRUbyhieXRlW10gZGF0YSwgSW5ldEFkZHJlc3MgZHN0QWRkciwgaW50IHBvcnQpIHRocm93cyBFeGNlcHRpb247CisgICAgfQorCisgICAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBOYXRpdmVTb2NrZXQgaW1wbGVtZW50cyBHZW5lcmljU29ja2V0IHsKKyAgICAgICAgcHVibGljIEZpbGVEZXNjcmlwdG9yIG1GZDsKKworICAgICAgICBwdWJsaWMgTmF0aXZlU29ja2V0KEZpbGVEZXNjcmlwdG9yIGZkKSB7CisgICAgICAgICAgICBtRmQgPSBmZDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZW5kKGJ5dGVbXSBkYXRhKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIE9zLndyaXRlKG1GZCwgZGF0YSwgMCwgZGF0YS5sZW5ndGgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBieXRlW10gcmVjZWl2ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgYnl0ZVtdIGluID0gbmV3IGJ5dGVbREFUQV9CVUZGRVJfTEVOXTsKKyAgICAgICAgICAgIEF0b21pY0ludGVnZXIgYnl0ZXNSZWFkID0gbmV3IEF0b21pY0ludGVnZXIoLTEpOworCisgICAgICAgICAgICBUaHJlYWQgcmVhZFNvY2tUaHJlYWQgPSBuZXcgVGhyZWFkKCgpIC0+IHsKKyAgICAgICAgICAgICAgICBsb25nIHN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgICAgIHdoaWxlIChieXRlc1JlYWQuZ2V0KCkgPCAwICYmIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIDwgc3RhcnRUaW1lICsgU09DS19USU1FT1VUKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1JlYWQuc2V0KE9zLnJlY3Zmcm9tKG1GZCwgaW4sIDAsIERBVEFfQlVGRkVSX0xFTiwgMCwgbnVsbCkpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IgZW5jb3VudGVyZWQgcmVhZGluZyBmcm9tIHNvY2tldCIsIGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIHJlYWRTb2NrVGhyZWFkLnN0YXJ0KCk7CisgICAgICAgICAgICByZWFkU29ja1RocmVhZC5qb2luKFNPQ0tfVElNRU9VVCk7CisKKyAgICAgICAgICAgIGlmIChieXRlc1JlYWQuZ2V0KCkgPCAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJObyBkYXRhIHJlY2VpdmVkIGZyb20gc29ja2V0Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBBcnJheXMuY29weU9mUmFuZ2UoaW4sIDAsIGJ5dGVzUmVhZC5nZXQoKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBnZXRQb3J0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gSXBTZWNCYXNlVGVzdC5nZXRQb3J0KG1GZCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIE9zLmNsb3NlKG1GZCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgYXBwbHlUcmFuc3BvcnRNb2RlVHJhbnNmb3JtKAorICAgICAgICAgICAgICAgIElwU2VjTWFuYWdlciBpc20sIGludCBkaXJlY3Rpb24sIElwU2VjVHJhbnNmb3JtIHRyYW5zZm9ybSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpc20uYXBwbHlUcmFuc3BvcnRNb2RlVHJhbnNmb3JtKG1GZCwgZGlyZWN0aW9uLCB0cmFuc2Zvcm0pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZVRyYW5zcG9ydE1vZGVUcmFuc2Zvcm1zKElwU2VjTWFuYWdlciBpc20pIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgaXNtLnJlbW92ZVRyYW5zcG9ydE1vZGVUcmFuc2Zvcm1zKG1GZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE5hdGl2ZVRjcFNvY2tldCBleHRlbmRzIE5hdGl2ZVNvY2tldCBpbXBsZW1lbnRzIEdlbmVyaWNUY3BTb2NrZXQgeworICAgICAgICBwdWJsaWMgTmF0aXZlVGNwU29ja2V0KEZpbGVEZXNjcmlwdG9yIGZkKSB7CisgICAgICAgICAgICBzdXBlcihmZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE5hdGl2ZVVkcFNvY2tldCBleHRlbmRzIE5hdGl2ZVNvY2tldCBpbXBsZW1lbnRzIEdlbmVyaWNVZHBTb2NrZXQgeworICAgICAgICBwdWJsaWMgTmF0aXZlVWRwU29ja2V0KEZpbGVEZXNjcmlwdG9yIGZkKSB7CisgICAgICAgICAgICBzdXBlcihmZCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2VuZFRvKGJ5dGVbXSBkYXRhLCBJbmV0QWRkcmVzcyBkc3RBZGRyLCBpbnQgcG9ydCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBPcy5zZW5kdG8obUZkLCBkYXRhLCAwLCBkYXRhLmxlbmd0aCwgMCwgZHN0QWRkciwgcG9ydCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEphdmFVZHBTb2NrZXQgaW1wbGVtZW50cyBHZW5lcmljVWRwU29ja2V0IHsKKyAgICAgICAgcHVibGljIGZpbmFsIERhdGFncmFtU29ja2V0IG1Tb2NrZXQ7CisKKyAgICAgICAgcHVibGljIEphdmFVZHBTb2NrZXQoSW5ldEFkZHJlc3MgbG9jYWxBZGRyKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1Tb2NrZXQgPSBuZXcgRGF0YWdyYW1Tb2NrZXQoMCwgbG9jYWxBZGRyKTsKKyAgICAgICAgICAgICAgICBtU29ja2V0LnNldFNvVGltZW91dChTT0NLX1RJTUVPVVQpOworICAgICAgICAgICAgfSBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBGYWlsIGxvdWRseSBpZiB3ZSBjYW4ndCBzZXQgdXAgc29ja2V0cyBwcm9wZXJseS4gQW5kIHdpdGhvdXQgdGhlIHRpbWVvdXQsIHdlCisgICAgICAgICAgICAgICAgLy8gY291bGQgZWFzaWx5IGVuZCB1cCBpbiBhbiBlbmRsZXNzIHdhaXQuCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2VuZChieXRlW10gZGF0YSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBtU29ja2V0LnNlbmQobmV3IERhdGFncmFtUGFja2V0KGRhdGEsIGRhdGEubGVuZ3RoKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2VuZFRvKGJ5dGVbXSBkYXRhLCBJbmV0QWRkcmVzcyBkc3RBZGRyLCBpbnQgcG9ydCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBtU29ja2V0LnNlbmQobmV3IERhdGFncmFtUGFja2V0KGRhdGEsIGRhdGEubGVuZ3RoLCBkc3RBZGRyLCBwb3J0KSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBnZXRQb3J0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gbVNvY2tldC5nZXRMb2NhbFBvcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgbVNvY2tldC5jbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBieXRlW10gcmVjZWl2ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgRGF0YWdyYW1QYWNrZXQgZGF0YSA9IG5ldyBEYXRhZ3JhbVBhY2tldChuZXcgYnl0ZVtEQVRBX0JVRkZFUl9MRU5dLCBEQVRBX0JVRkZFUl9MRU4pOworICAgICAgICAgICAgbVNvY2tldC5yZWNlaXZlKGRhdGEpOworICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5jb3B5T2ZSYW5nZShkYXRhLmdldERhdGEoKSwgMCwgZGF0YS5nZXRMZW5ndGgoKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgYXBwbHlUcmFuc3BvcnRNb2RlVHJhbnNmb3JtKAorICAgICAgICAgICAgICAgIElwU2VjTWFuYWdlciBpc20sIGludCBkaXJlY3Rpb24sIElwU2VjVHJhbnNmb3JtIHRyYW5zZm9ybSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpc20uYXBwbHlUcmFuc3BvcnRNb2RlVHJhbnNmb3JtKG1Tb2NrZXQsIGRpcmVjdGlvbiwgdHJhbnNmb3JtKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmVUcmFuc3BvcnRNb2RlVHJhbnNmb3JtcyhJcFNlY01hbmFnZXIgaXNtKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlzbS5yZW1vdmVUcmFuc3BvcnRNb2RlVHJhbnNmb3JtcyhtU29ja2V0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSmF2YVRjcFNvY2tldCBpbXBsZW1lbnRzIEdlbmVyaWNUY3BTb2NrZXQgeworICAgICAgICBwdWJsaWMgZmluYWwgU29ja2V0IG1Tb2NrZXQ7CisKKyAgICAgICAgcHVibGljIEphdmFUY3BTb2NrZXQoU29ja2V0IHNvY2tldCkgeworICAgICAgICAgICAgbVNvY2tldCA9IHNvY2tldDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVNvY2tldC5zZXRTb1RpbWVvdXQoU09DS19USU1FT1VUKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gRmFpbCBsb3VkbHkgaWYgd2UgY2FuJ3Qgc2V0IHVwIHNvY2tldHMgcHJvcGVybHkuIEFuZCB3aXRob3V0IHRoZSB0aW1lb3V0LCB3ZQorICAgICAgICAgICAgICAgIC8vIGNvdWxkIGVhc2lseSBlbmQgdXAgaW4gYW4gZW5kbGVzcyB3YWl0LgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNlbmQoYnl0ZVtdIGRhdGEpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgbVNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKS53cml0ZShkYXRhKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYnl0ZVtdIHJlY2VpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGJ5dGVbXSBpbiA9IG5ldyBieXRlW0RBVEFfQlVGRkVSX0xFTl07CisgICAgICAgICAgICBpbnQgYnl0ZXNSZWFkID0gbVNvY2tldC5nZXRJbnB1dFN0cmVhbSgpLnJlYWQoaW4pOworICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5jb3B5T2ZSYW5nZShpbiwgMCwgYnl0ZXNSZWFkKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGdldFBvcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBtU29ja2V0LmdldExvY2FsUG9ydCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBtU29ja2V0LmNsb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgYXBwbHlUcmFuc3BvcnRNb2RlVHJhbnNmb3JtKAorICAgICAgICAgICAgICAgIElwU2VjTWFuYWdlciBpc20sIGludCBkaXJlY3Rpb24sIElwU2VjVHJhbnNmb3JtIHRyYW5zZm9ybSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpc20uYXBwbHlUcmFuc3BvcnRNb2RlVHJhbnNmb3JtKG1Tb2NrZXQsIGRpcmVjdGlvbiwgdHJhbnNmb3JtKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmVUcmFuc3BvcnRNb2RlVHJhbnNmb3JtcyhJcFNlY01hbmFnZXIgaXNtKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlzbS5yZW1vdmVUcmFuc3BvcnRNb2RlVHJhbnNmb3JtcyhtU29ja2V0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU29ja2V0UGFpcjxUPiB7CisgICAgICAgIHB1YmxpYyBmaW5hbCBUIG1MZWZ0U29jazsKKyAgICAgICAgcHVibGljIGZpbmFsIFQgbVJpZ2h0U29jazsKKworICAgICAgICBwdWJsaWMgU29ja2V0UGFpcihUIGxlZnRTb2NrLCBUIHJpZ2h0U29jaykgeworICAgICAgICAgICAgbUxlZnRTb2NrID0gbGVmdFNvY2s7CisgICAgICAgICAgICBtUmlnaHRTb2NrID0gcmlnaHRTb2NrOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGFwcGx5VHJhbnNmb3JtQmlkaXJlY3Rpb25hbGx5KAorICAgICAgICAgICAgSXBTZWNNYW5hZ2VyIGlzbSwgSXBTZWNUcmFuc2Zvcm0gdHJhbnNmb3JtLCBHZW5lcmljU29ja2V0IHNvY2tldCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoaW50IGRpcmVjdGlvbiA6IERJUkVDVElPTlMpIHsKKyAgICAgICAgICAgIHNvY2tldC5hcHBseVRyYW5zcG9ydE1vZGVUcmFuc2Zvcm0oaXNtLCBkaXJlY3Rpb24sIHRyYW5zZm9ybSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFNvY2tldFBhaXI8TmF0aXZlVWRwU29ja2V0PiBnZXROYXRpdmVVZHBTb2NrZXRQYWlyKAorICAgICAgICAgICAgSW5ldEFkZHJlc3MgbG9jYWxBZGRyLCBJcFNlY01hbmFnZXIgaXNtLCBJcFNlY1RyYW5zZm9ybSB0cmFuc2Zvcm0sIGJvb2xlYW4gY29ubmVjdGVkKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGludCBkb21haW4gPSBnZXREb21haW4obG9jYWxBZGRyKTsKKworICAgICAgICBOYXRpdmVVZHBTb2NrZXQgbGVmdFNvY2sgPSBuZXcgTmF0aXZlVWRwU29ja2V0KAorICAgICAgICAgICAgT3Muc29ja2V0KGRvbWFpbiwgT3NDb25zdGFudHMuU09DS19ER1JBTSwgT3NDb25zdGFudHMuSVBQUk9UT19VRFApKTsKKyAgICAgICAgTmF0aXZlVWRwU29ja2V0IHJpZ2h0U29jayA9IG5ldyBOYXRpdmVVZHBTb2NrZXQoCisgICAgICAgICAgICBPcy5zb2NrZXQoZG9tYWluLCBPc0NvbnN0YW50cy5TT0NLX0RHUkFNLCBPc0NvbnN0YW50cy5JUFBST1RPX1VEUCkpOworCisgICAgICAgIGZvciAoTmF0aXZlVWRwU29ja2V0IHNvY2sgOiBuZXcgTmF0aXZlVWRwU29ja2V0W10ge2xlZnRTb2NrLCByaWdodFNvY2t9KSB7CisgICAgICAgICAgICBhcHBseVRyYW5zZm9ybUJpZGlyZWN0aW9uYWxseShpc20sIHRyYW5zZm9ybSwgc29jayk7CisgICAgICAgICAgICBPcy5iaW5kKHNvY2subUZkLCBsb2NhbEFkZHIsIDApOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbm5lY3RlZCkgeworICAgICAgICAgICAgT3MuY29ubmVjdChsZWZ0U29jay5tRmQsIGxvY2FsQWRkciwgcmlnaHRTb2NrLmdldFBvcnQoKSk7CisgICAgICAgICAgICBPcy5jb25uZWN0KHJpZ2h0U29jay5tRmQsIGxvY2FsQWRkciwgbGVmdFNvY2suZ2V0UG9ydCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXcgU29ja2V0UGFpcjw+KGxlZnRTb2NrLCByaWdodFNvY2spOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU29ja2V0UGFpcjxOYXRpdmVUY3BTb2NrZXQ+IGdldE5hdGl2ZVRjcFNvY2tldFBhaXIoCisgICAgICAgICAgICBJbmV0QWRkcmVzcyBsb2NhbEFkZHIsIElwU2VjTWFuYWdlciBpc20sIElwU2VjVHJhbnNmb3JtIHRyYW5zZm9ybSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGludCBkb21haW4gPSBnZXREb21haW4obG9jYWxBZGRyKTsKKworICAgICAgICBOYXRpdmVUY3BTb2NrZXQgc2VydmVyID0gbmV3IE5hdGl2ZVRjcFNvY2tldCgKKyAgICAgICAgICAgICAgICBPcy5zb2NrZXQoZG9tYWluLCBPc0NvbnN0YW50cy5TT0NLX1NUUkVBTSwgT3NDb25zdGFudHMuSVBQUk9UT19UQ1ApKTsKKyAgICAgICAgTmF0aXZlVGNwU29ja2V0IGNsaWVudCA9IG5ldyBOYXRpdmVUY3BTb2NrZXQoCisgICAgICAgICAgICAgICAgT3Muc29ja2V0KGRvbWFpbiwgT3NDb25zdGFudHMuU09DS19TVFJFQU0sIE9zQ29uc3RhbnRzLklQUFJPVE9fVENQKSk7CisKKyAgICAgICAgT3MuYmluZChzZXJ2ZXIubUZkLCBsb2NhbEFkZHIsIDApOworCisgICAgICAgIGFwcGx5VHJhbnNmb3JtQmlkaXJlY3Rpb25hbGx5KGlzbSwgdHJhbnNmb3JtLCBzZXJ2ZXIpOworICAgICAgICBhcHBseVRyYW5zZm9ybUJpZGlyZWN0aW9uYWxseShpc20sIHRyYW5zZm9ybSwgY2xpZW50KTsKKworICAgICAgICBPcy5saXN0ZW4oc2VydmVyLm1GZCwgMTApOworICAgICAgICBPcy5jb25uZWN0KGNsaWVudC5tRmQsIGxvY2FsQWRkciwgc2VydmVyLmdldFBvcnQoKSk7CisgICAgICAgIE5hdGl2ZVRjcFNvY2tldCBhY2NlcHRlZCA9IG5ldyBOYXRpdmVUY3BTb2NrZXQoT3MuYWNjZXB0KHNlcnZlci5tRmQsIG51bGwpKTsKKworICAgICAgICBhcHBseVRyYW5zZm9ybUJpZGlyZWN0aW9uYWxseShpc20sIHRyYW5zZm9ybSwgYWNjZXB0ZWQpOworICAgICAgICBzZXJ2ZXIuY2xvc2UoKTsKKworICAgICAgICByZXR1cm4gbmV3IFNvY2tldFBhaXI8PihjbGllbnQsIGFjY2VwdGVkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFNvY2tldFBhaXI8SmF2YVVkcFNvY2tldD4gZ2V0SmF2YVVkcFNvY2tldFBhaXIoCisgICAgICAgICAgICBJbmV0QWRkcmVzcyBsb2NhbEFkZHIsIElwU2VjTWFuYWdlciBpc20sIElwU2VjVHJhbnNmb3JtIHRyYW5zZm9ybSwgYm9vbGVhbiBjb25uZWN0ZWQpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSmF2YVVkcFNvY2tldCBsZWZ0U29jayA9IG5ldyBKYXZhVWRwU29ja2V0KGxvY2FsQWRkcik7CisgICAgICAgIEphdmFVZHBTb2NrZXQgcmlnaHRTb2NrID0gbmV3IEphdmFVZHBTb2NrZXQobG9jYWxBZGRyKTsKKworICAgICAgICBhcHBseVRyYW5zZm9ybUJpZGlyZWN0aW9uYWxseShpc20sIHRyYW5zZm9ybSwgbGVmdFNvY2spOworICAgICAgICBhcHBseVRyYW5zZm9ybUJpZGlyZWN0aW9uYWxseShpc20sIHRyYW5zZm9ybSwgcmlnaHRTb2NrKTsKKworICAgICAgICBpZiAoY29ubmVjdGVkKSB7CisgICAgICAgICAgICBsZWZ0U29jay5tU29ja2V0LmNvbm5lY3QobG9jYWxBZGRyLCByaWdodFNvY2subVNvY2tldC5nZXRMb2NhbFBvcnQoKSk7CisgICAgICAgICAgICByaWdodFNvY2subVNvY2tldC5jb25uZWN0KGxvY2FsQWRkciwgbGVmdFNvY2subVNvY2tldC5nZXRMb2NhbFBvcnQoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3IFNvY2tldFBhaXI8PihsZWZ0U29jaywgcmlnaHRTb2NrKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFNvY2tldFBhaXI8SmF2YVRjcFNvY2tldD4gZ2V0SmF2YVRjcFNvY2tldFBhaXIoCisgICAgICAgICAgICBJbmV0QWRkcmVzcyBsb2NhbEFkZHIsIElwU2VjTWFuYWdlciBpc20sIElwU2VjVHJhbnNmb3JtIHRyYW5zZm9ybSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEphdmFUY3BTb2NrZXQgY2xpZW50U29jayA9IG5ldyBKYXZhVGNwU29ja2V0KG5ldyBTb2NrZXQoKSk7CisgICAgICAgIFNlcnZlclNvY2tldCBzZXJ2ZXJTb2NrZXQgPSBuZXcgU2VydmVyU29ja2V0KCk7CisgICAgICAgIHNlcnZlclNvY2tldC5iaW5kKG5ldyBJbmV0U29ja2V0QWRkcmVzcyhsb2NhbEFkZHIsIDApKTsKKworICAgICAgICAvLyBXaGlsZSB0ZWNobmljYWxseSB0aGUgY2xpZW50IHNvY2tldCBkb2VzIG5vdCBuZWVkIHRvIGJlIGJvdW5kLCB0aGUgT3BlbkpESyBpbXBsZW1lbnRhdGlvbgorICAgICAgICAvLyBvZiBTb2NrZXQgb25seSBhbGxvY2F0ZXMgYW4gRkQgd2hlbiBiaW5kKCkgb3IgY29ubmVjdCgpIG9yIG90aGVyIHNpbWlsYXIgbWV0aG9kcyBhcmUKKyAgICAgICAgLy8gY2FsbGVkLiBTbyB3ZSBjYWxsIGJpbmQgdG8gZm9yY2UgdGhlIEZEIGNyZWF0aW9uLCBzbyB0aGF0IHdlIGNhbiBhcHBseSBhIHRyYW5zZm9ybSB0byBpdAorICAgICAgICAvLyBwcmlvciB0byBzb2NrZXQgY29ubmVjdC4KKyAgICAgICAgY2xpZW50U29jay5tU29ja2V0LmJpbmQobmV3IEluZXRTb2NrZXRBZGRyZXNzKGxvY2FsQWRkciwgMCkpOworCisgICAgICAgIC8vIElwU2VjU2VydmljZSBkb2Vzbid0IHN1cHBvcnQgc2VydmVyU29ja2V0cyBhdCB0aGUgbW9tZW50OyB3b3JrYXJvdW5kIHVzaW5nIEZECisgICAgICAgIEZpbGVEZXNjcmlwdG9yIHNlcnZlckZkID0gc2VydmVyU29ja2V0LmdldEltcGwoKS5nZXRGRCQoKTsKKworICAgICAgICBhcHBseVRyYW5zZm9ybUJpZGlyZWN0aW9uYWxseShpc20sIHRyYW5zZm9ybSwgbmV3IE5hdGl2ZVRjcFNvY2tldChzZXJ2ZXJGZCkpOworICAgICAgICBhcHBseVRyYW5zZm9ybUJpZGlyZWN0aW9uYWxseShpc20sIHRyYW5zZm9ybSwgY2xpZW50U29jayk7CisKKyAgICAgICAgY2xpZW50U29jay5tU29ja2V0LmNvbm5lY3QobmV3IEluZXRTb2NrZXRBZGRyZXNzKGxvY2FsQWRkciwgc2VydmVyU29ja2V0LmdldExvY2FsUG9ydCgpKSk7CisgICAgICAgIEphdmFUY3BTb2NrZXQgYWNjZXB0ZWRTb2NrID0gbmV3IEphdmFUY3BTb2NrZXQoc2VydmVyU29ja2V0LmFjY2VwdCgpKTsKKworICAgICAgICBhcHBseVRyYW5zZm9ybUJpZGlyZWN0aW9uYWxseShpc20sIHRyYW5zZm9ybSwgYWNjZXB0ZWRTb2NrKTsKKyAgICAgICAgc2VydmVyU29ja2V0LmNsb3NlKCk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBTb2NrZXRQYWlyPD4oY2xpZW50U29jaywgYWNjZXB0ZWRTb2NrKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tTb2NrZXRQYWlyKEdlbmVyaWNTb2NrZXQgbGVmdCwgR2VuZXJpY1NvY2tldCByaWdodCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGxlZnQuc2VuZChURVNUX0RBVEEpOworICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhURVNUX0RBVEEsIHJpZ2h0LnJlY2VpdmUoKSk7CisKKyAgICAgICAgcmlnaHQuc2VuZChURVNUX0RBVEEpOworICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhURVNUX0RBVEEsIGxlZnQucmVjZWl2ZSgpKTsKKworICAgICAgICBsZWZ0LmNsb3NlKCk7CisgICAgICAgIHJpZ2h0LmNsb3NlKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrVW5jb25uZWN0ZWRVZHBTb2NrZXRQYWlyKAorICAgICAgICAgICAgR2VuZXJpY1VkcFNvY2tldCBsZWZ0LCBHZW5lcmljVWRwU29ja2V0IHJpZ2h0LCBJbmV0QWRkcmVzcyBsb2NhbEFkZHIpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBsZWZ0LnNlbmRUbyhURVNUX0RBVEEsIGxvY2FsQWRkciwgcmlnaHQuZ2V0UG9ydCgpKTsKKyAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMoVEVTVF9EQVRBLCByaWdodC5yZWNlaXZlKCkpOworCisgICAgICAgIHJpZ2h0LnNlbmRUbyhURVNUX0RBVEEsIGxvY2FsQWRkciwgbGVmdC5nZXRQb3J0KCkpOworICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhURVNUX0RBVEEsIGxlZnQucmVjZWl2ZSgpKTsKKworICAgICAgICBsZWZ0LmNsb3NlKCk7CisgICAgICAgIHJpZ2h0LmNsb3NlKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBJcFNlY1RyYW5zZm9ybSBidWlsZElwU2VjVHJhbnNmb3JtKAorICAgICAgICAgICAgQ29udGV4dCBtQ29udGV4dCwKKyAgICAgICAgICAgIElwU2VjTWFuYWdlci5TZWN1cml0eVBhcmFtZXRlckluZGV4IHNwaSwKKyAgICAgICAgICAgIElwU2VjTWFuYWdlci5VZHBFbmNhcHN1bGF0aW9uU29ja2V0IGVuY2FwU29ja2V0LAorICAgICAgICAgICAgSW5ldEFkZHJlc3MgcmVtb3RlQWRkcikKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgbG9jYWxBZGRyID0gKHJlbW90ZUFkZHIgaW5zdGFuY2VvZiBJbmV0NEFkZHJlc3MpID8gSVBWNF9MT09QQkFDSyA6IElQVjZfTE9PUEJBQ0s7CisgICAgICAgIElwU2VjVHJhbnNmb3JtLkJ1aWxkZXIgYnVpbGRlciA9CisgICAgICAgICAgICAgICAgbmV3IElwU2VjVHJhbnNmb3JtLkJ1aWxkZXIobUNvbnRleHQpCisgICAgICAgICAgICAgICAgLnNldEVuY3J5cHRpb24obmV3IElwU2VjQWxnb3JpdGhtKElwU2VjQWxnb3JpdGhtLkNSWVBUX0FFU19DQkMsIENSWVBUX0tFWSkpCisgICAgICAgICAgICAgICAgLnNldEF1dGhlbnRpY2F0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IElwU2VjQWxnb3JpdGhtKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJcFNlY0FsZ29yaXRobS5BVVRIX0hNQUNfU0hBMjU2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVVRIX0tFWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVUSF9LRVkubGVuZ3RoICogNCkpOworCisgICAgICAgIGlmIChlbmNhcFNvY2tldCAhPSBudWxsKSB7CisgICAgICAgICAgICBidWlsZGVyLnNldElwdjRFbmNhcHN1bGF0aW9uKGVuY2FwU29ja2V0LCBlbmNhcFNvY2tldC5nZXRQb3J0KCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGRUcmFuc3BvcnRNb2RlVHJhbnNmb3JtKEluZXRBZGRyZXNzLmdldEJ5TmFtZShsb2NhbEFkZHIpLCBzcGkpOworICAgIH0KKworICAgIHByaXZhdGUgSXBTZWNUcmFuc2Zvcm0gYnVpbGREZWZhdWx0VHJhbnNmb3JtKEluZXRBZGRyZXNzIGxvY2FsQWRkcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSAoSXBTZWNNYW5hZ2VyLlNlY3VyaXR5UGFyYW1ldGVySW5kZXggc3BpID0KKyAgICAgICAgICAgICAgICBtSVNNLmFsbG9jYXRlU2VjdXJpdHlQYXJhbWV0ZXJJbmRleChsb2NhbEFkZHIpKSB7CisgICAgICAgICAgICByZXR1cm4gYnVpbGRJcFNlY1RyYW5zZm9ybShtQ29udGV4dCwgc3BpLCBudWxsLCBsb2NhbEFkZHIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEphdmFUY3BTb2NrZXRQYWlyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoU3RyaW5nIGFkZHIgOiBMT09QQkFDS19BRERSUykgeworICAgICAgICAgICAgSW5ldEFkZHJlc3MgbG9jYWwgPSBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoYWRkcik7CisgICAgICAgICAgICB0cnkgKElwU2VjVHJhbnNmb3JtIHRyYW5zZm9ybSA9IGJ1aWxkRGVmYXVsdFRyYW5zZm9ybShsb2NhbCkpIHsKKyAgICAgICAgICAgICAgICBTb2NrZXRQYWlyPEphdmFUY3BTb2NrZXQ+IHNvY2tldHMgPSBnZXRKYXZhVGNwU29ja2V0UGFpcihsb2NhbCwgbUlTTSwgdHJhbnNmb3JtKTsKKyAgICAgICAgICAgICAgICBjaGVja1NvY2tldFBhaXIoc29ja2V0cy5tTGVmdFNvY2ssIHNvY2tldHMubVJpZ2h0U29jayk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SmF2YVVkcFNvY2tldFBhaXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChTdHJpbmcgYWRkciA6IExPT1BCQUNLX0FERFJTKSB7CisgICAgICAgICAgICBJbmV0QWRkcmVzcyBsb2NhbCA9IEluZXRBZGRyZXNzLmdldEJ5TmFtZShhZGRyKTsKKyAgICAgICAgICAgIHRyeSAoSXBTZWNUcmFuc2Zvcm0gdHJhbnNmb3JtID0gYnVpbGREZWZhdWx0VHJhbnNmb3JtKGxvY2FsKSkgeworICAgICAgICAgICAgICAgIFNvY2tldFBhaXI8SmF2YVVkcFNvY2tldD4gc29ja2V0cyA9CisgICAgICAgICAgICAgICAgICAgICAgICBnZXRKYXZhVWRwU29ja2V0UGFpcihsb2NhbCwgbUlTTSwgdHJhbnNmb3JtLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBjaGVja1NvY2tldFBhaXIoc29ja2V0cy5tTGVmdFNvY2ssIHNvY2tldHMubVJpZ2h0U29jayk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SmF2YVVkcFNvY2tldFBhaXJVbmNvbm5lY3RlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmb3IgKFN0cmluZyBhZGRyIDogTE9PUEJBQ0tfQUREUlMpIHsKKyAgICAgICAgICAgIEluZXRBZGRyZXNzIGxvY2FsID0gSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKGFkZHIpOworICAgICAgICAgICAgdHJ5IChJcFNlY1RyYW5zZm9ybSB0cmFuc2Zvcm0gPSBidWlsZERlZmF1bHRUcmFuc2Zvcm0obG9jYWwpKSB7CisgICAgICAgICAgICAgICAgU29ja2V0UGFpcjxKYXZhVWRwU29ja2V0PiBzb2NrZXRzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGdldEphdmFVZHBTb2NrZXRQYWlyKGxvY2FsLCBtSVNNLCB0cmFuc2Zvcm0sIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBjaGVja1VuY29ubmVjdGVkVWRwU29ja2V0UGFpcihzb2NrZXRzLm1MZWZ0U29jaywgc29ja2V0cy5tUmlnaHRTb2NrLCBsb2NhbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmF0aXZlVGNwU29ja2V0UGFpcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmb3IgKFN0cmluZyBhZGRyIDogTE9PUEJBQ0tfQUREUlMpIHsKKyAgICAgICAgICAgIEluZXRBZGRyZXNzIGxvY2FsID0gSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKGFkZHIpOworICAgICAgICAgICAgdHJ5IChJcFNlY1RyYW5zZm9ybSB0cmFuc2Zvcm0gPSBidWlsZERlZmF1bHRUcmFuc2Zvcm0obG9jYWwpKSB7CisgICAgICAgICAgICAgICAgU29ja2V0UGFpcjxOYXRpdmVUY3BTb2NrZXQ+IHNvY2tldHMgPQorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TmF0aXZlVGNwU29ja2V0UGFpcihsb2NhbCwgbUlTTSwgdHJhbnNmb3JtKTsKKyAgICAgICAgICAgICAgICBjaGVja1NvY2tldFBhaXIoc29ja2V0cy5tTGVmdFNvY2ssIHNvY2tldHMubVJpZ2h0U29jayk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmF0aXZlVWRwU29ja2V0UGFpcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmb3IgKFN0cmluZyBhZGRyIDogTE9PUEJBQ0tfQUREUlMpIHsKKyAgICAgICAgICAgIEluZXRBZGRyZXNzIGxvY2FsID0gSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKGFkZHIpOworICAgICAgICAgICAgdHJ5IChJcFNlY1RyYW5zZm9ybSB0cmFuc2Zvcm0gPSBidWlsZERlZmF1bHRUcmFuc2Zvcm0obG9jYWwpKSB7CisgICAgICAgICAgICAgICAgU29ja2V0UGFpcjxOYXRpdmVVZHBTb2NrZXQ+IHNvY2tldHMgPQorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TmF0aXZlVWRwU29ja2V0UGFpcihsb2NhbCwgbUlTTSwgdHJhbnNmb3JtLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBjaGVja1NvY2tldFBhaXIoc29ja2V0cy5tTGVmdFNvY2ssIHNvY2tldHMubVJpZ2h0U29jayk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmF0aXZlVWRwU29ja2V0UGFpclVuY29ubmVjdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoU3RyaW5nIGFkZHIgOiBMT09QQkFDS19BRERSUykgeworICAgICAgICAgICAgSW5ldEFkZHJlc3MgbG9jYWwgPSBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoYWRkcik7CisgICAgICAgICAgICB0cnkgKElwU2VjVHJhbnNmb3JtIHRyYW5zZm9ybSA9IGJ1aWxkRGVmYXVsdFRyYW5zZm9ybShsb2NhbCkpIHsKKyAgICAgICAgICAgICAgICBTb2NrZXRQYWlyPE5hdGl2ZVVkcFNvY2tldD4gc29ja2V0cyA9CisgICAgICAgICAgICAgICAgICAgICAgICBnZXROYXRpdmVVZHBTb2NrZXRQYWlyKGxvY2FsLCBtSVNNLCB0cmFuc2Zvcm0sIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBjaGVja1VuY29ubmVjdGVkVWRwU29ja2V0UGFpcihzb2NrZXRzLm1MZWZ0U29jaywgc29ja2V0cy5tUmlnaHRTb2NrLCBsb2NhbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9uZXQvc3JjL2FuZHJvaWQvbmV0L2N0cy9JcFNlY01hbmFnZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9uZXQvc3JjL2FuZHJvaWQvbmV0L2N0cy9JcFNlY01hbmFnZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE4YjJmMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL25ldC9zcmMvYW5kcm9pZC9uZXQvY3RzL0lwU2VjTWFuYWdlclRlc3QuamF2YQpAQCAtMCwwICsxLDExNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubmV0LmN0czsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnN5c3RlbS5Pc0NvbnN0YW50cy5JUFBST1RPX1RDUDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zeXN0ZW0uT3NDb25zdGFudHMuSVBQUk9UT19VRFA7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0QXJyYXlFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQubmV0LkNvbm5lY3Rpdml0eU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuSXBTZWNBbGdvcml0aG07CitpbXBvcnQgYW5kcm9pZC5uZXQuSXBTZWNNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubmV0LklwU2VjVHJhbnNmb3JtOworaW1wb3J0IGFuZHJvaWQubmV0LlRyYWZmaWNTdGF0czsKK2ltcG9ydCBhbmRyb2lkLnN5c3RlbS5FcnJub0V4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnN5c3RlbS5PczsKK2ltcG9ydCBhbmRyb2lkLnN5c3RlbS5Pc0NvbnN0YW50czsKKworaW1wb3J0IGphdmEuaW8uRmlsZURlc2NyaXB0b3I7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5EYXRhZ3JhbVBhY2tldDsKK2ltcG9ydCBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldDsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0NkFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworcHVibGljIGNsYXNzIElwU2VjTWFuYWdlclRlc3QgZXh0ZW5kcyBJcFNlY0Jhc2VUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBJcFNlY01hbmFnZXJUZXN0LmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKworICAgIHByaXZhdGUgQ29ubmVjdGl2aXR5TWFuYWdlciBtQ007CisKKyAgICBwcml2YXRlIHN0YXRpYyBJbmV0QWRkcmVzcyBJcEFkZHJlc3MoU3RyaW5nIGFkZHJTdHJpbmcpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoYWRkclN0cmluZyk7CisgICAgICAgIH0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgSVAgYWRkcmVzczogIiArIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW5ldEFkZHJlc3MgR09PR0xFX0ROU180ID0gSXBBZGRyZXNzKCI4LjguOC44Iik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW5ldEFkZHJlc3MgR09PR0xFX0ROU182ID0gSXBBZGRyZXNzKCIyMDAxOjQ4NjA6NDg2MDo6ODg4OCIpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW5ldEFkZHJlc3NbXSBHT09HTEVfRE5TX0xJU1QgPQorICAgICAgICAgICAgbmV3IEluZXRBZGRyZXNzW10ge0dPT0dMRV9ETlNfNCwgR09PR0xFX0ROU182fTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEUk9JRF9TUEkgPSAweEQxMjAxRDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1BPUlRfQklORF9BVFRFTVBUUyA9IDEwOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIEFFQURfS0VZID0gZ2V0S2V5KDI4OCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVENQX0hEUkxFTl9XSVRIX09QVElPTlMgPSAzMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVURQX0hEUkxFTiA9IDg7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElQNF9IRFJMRU4gPSAyMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSVA2X0hEUkxFTiA9IDQwOworCisgICAgLy8gRW5jcnlwdGlvbiBwYXJhbWV0ZXJzCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFFU19HQ01fSVZfTEVOID0gODsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUVTX0NCQ19JVl9MRU4gPSAxNjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUVTX0dDTV9CTEtfU0laRSA9IDQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFFU19DQkNfQkxLX1NJWkUgPSAxNjsKKworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgIG1DTSA9IChDb25uZWN0aXZpdHlNYW5hZ2VyKSBnZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkNPTk5FQ1RJVklUWV9TRVJWSUNFKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEFsbG9jYXRlIGEgcmFuZG9tIFNQSQorICAgICAqIEFsbG9jYXRlIGEgc3BlY2lmaWMgU1BJIHVzaW5nIHByZXZpb3VzIHJhbmRvbWx5IGNyZWF0ZWQgU1BJIHZhbHVlCisgICAgICogUmVhbGxvYyB0aGUgc2FtZSBTUEkgdGhhdCB3YXMgc3BlY2lmaWNhbGx5IGNyZWF0ZWQgKGV4cGVjdCBTcGlVbmF2YWlsYWJsZSkKKyAgICAgKiBDbG9zZSBTUElzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEFsbG9jU3BpKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoSW5ldEFkZHJlc3MgYWRkciA6IEdPT0dMRV9ETlNfTElTVCkgeworICAgICAgICAgICAgSXBTZWNNYW5hZ2VyLlNlY3VyaXR5UGFyYW1ldGVySW5kZXggcmFuZG9tU3BpID0gbnVsbCwgZHJvaWRTcGkgPSBudWxsOworICAgICAgICAgICAgcmFuZG9tU3BpID0gbUlTTS5hbGxvY2F0ZVNlY3VyaXR5UGFyYW1ldGVySW5kZXgoYWRkcik7CisgICAgICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHJlY2VpdmUgYSB2YWxpZCBTUEkiLAorICAgICAgICAgICAgICAgICAgICByYW5kb21TcGkuZ2V0U3BpKCkgIT0gSXBTZWNNYW5hZ2VyLklOVkFMSURfU0VDVVJJVFlfUEFSQU1FVEVSX0lOREVYKTsKKworICAgICAgICAgICAgZHJvaWRTcGkgPSBtSVNNLmFsbG9jYXRlU2VjdXJpdHlQYXJhbWV0ZXJJbmRleChhZGRyLCBEUk9JRF9TUEkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIGFsbG9jYXRlIHNwZWNpZmllZCBTUEksICIgKyBEUk9JRF9TUEksCisgICAgICAgICAgICAgICAgICAgIGRyb2lkU3BpLmdldFNwaSgpID09IERST0lEX1NQSSk7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbUlTTS5hbGxvY2F0ZVNlY3VyaXR5UGFyYW1ldGVySW5kZXgoYWRkciwgRFJPSURfU1BJKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJEdXBsaWNhdGUgU1BJIHdhcyBhbGxvd2VkIHRvIGJlIGNyZWF0ZWQiKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElwU2VjTWFuYWdlci5TcGlVbmF2YWlsYWJsZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBzdWNjZXNzIGNhc2UgYmVjYXVzZSB3ZSBleHBlY3QgYSBkdXBlIFNQSSB0byB0aHJvdworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByYW5kb21TcGkuY2xvc2UoKTsKKyAgICAgICAgICAgIGRyb2lkU3BpLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogVGhpcyBmdW5jdGlvbiBmaW5kcyBhbiBhdmFpbGFibGUgcG9ydCAqLworICAgIHByaXZhdGUgc3RhdGljIGludCBmaW5kVW51c2VkUG9ydCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBHZXQgYW4gYXZhaWxhYmxlIHBvcnQuCisgICAgICAgIERhdGFncmFtU29ja2V0IHMgPSBuZXcgRGF0YWdyYW1Tb2NrZXQoKTsKKyAgICAgICAgaW50IHBvcnQgPSBzLmdldExvY2FsUG9ydCgpOworICAgICAgICBzLmNsb3NlKCk7CisgICAgICAgIHJldHVybiBwb3J0OworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEZpbGVEZXNjcmlwdG9yIGdldEJvdW5kVWRwU29ja2V0KEluZXRBZGRyZXNzIGFkZHJlc3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBGaWxlRGVzY3JpcHRvciBzb2NrID0KKyAgICAgICAgICAgICAgICBPcy5zb2NrZXQoZ2V0RG9tYWluKGFkZHJlc3MpLCBPc0NvbnN0YW50cy5TT0NLX0RHUkFNLCBPc0NvbnN0YW50cy5JUFBST1RPX1VEUCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfUE9SVF9CSU5EX0FUVEVNUFRTOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaW50IHBvcnQgPSBmaW5kVW51c2VkUG9ydCgpOworICAgICAgICAgICAgICAgIE9zLmJpbmQoc29jaywgYWRkcmVzcywgcG9ydCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGNhdGNoIChFcnJub0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gU29tZW9uZSBjbGFpbWVkIHRoZSBwb3J0IHNpbmNlIHdlIGNhbGxlZCBmaW5kVW51c2VkUG9ydC4KKyAgICAgICAgICAgICAgICBpZiAoZS5lcnJubyA9PSBPc0NvbnN0YW50cy5FQUREUklOVVNFKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpID09IE1BWF9QT1JUX0JJTkRfQVRURU1QVFMgLSAxKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwoIkZhaWxlZCAiICsgTUFYX1BPUlRfQklORF9BVFRFTVBUUyArICIgYXR0ZW1wdHMgdG8gYmluZCB0byBhIHBvcnQiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhyb3cgZS5yZXRocm93QXNJT0V4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzb2NrOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja1VuY29ubmVjdGVkVWRwKElwU2VjVHJhbnNmb3JtIHRyYW5zZm9ybSwgSW5ldEFkZHJlc3MgbG9jYWwsIGludCBzZW5kQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB1c2VKYXZhU29ja2V0cykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEdlbmVyaWNVZHBTb2NrZXQgc29ja0xlZnQgPSBudWxsLCBzb2NrUmlnaHQgPSBudWxsOworICAgICAgICBpZiAodXNlSmF2YVNvY2tldHMpIHsKKyAgICAgICAgICAgIFNvY2tldFBhaXI8SmF2YVVkcFNvY2tldD4gc29ja2V0cyA9IGdldEphdmFVZHBTb2NrZXRQYWlyKGxvY2FsLCBtSVNNLCB0cmFuc2Zvcm0sIGZhbHNlKTsKKyAgICAgICAgICAgIHNvY2tMZWZ0ID0gc29ja2V0cy5tTGVmdFNvY2s7CisgICAgICAgICAgICBzb2NrUmlnaHQgPSBzb2NrZXRzLm1SaWdodFNvY2s7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTb2NrZXRQYWlyPE5hdGl2ZVVkcFNvY2tldD4gc29ja2V0cyA9CisgICAgICAgICAgICAgICAgICAgIGdldE5hdGl2ZVVkcFNvY2tldFBhaXIobG9jYWwsIG1JU00sIHRyYW5zZm9ybSwgZmFsc2UpOworICAgICAgICAgICAgc29ja0xlZnQgPSBzb2NrZXRzLm1MZWZ0U29jazsKKyAgICAgICAgICAgIHNvY2tSaWdodCA9IHNvY2tldHMubVJpZ2h0U29jazsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VuZENvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGJ5dGVbXSBpbjsKKworICAgICAgICAgICAgc29ja0xlZnQuc2VuZFRvKFRFU1RfREFUQSwgbG9jYWwsIHNvY2tSaWdodC5nZXRQb3J0KCkpOworICAgICAgICAgICAgaW4gPSBzb2NrUmlnaHQucmVjZWl2ZSgpOworICAgICAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMoIkxlZnQtdG8tcmlnaHQgZW5jcnlwdGVkIGRhdGEgZGlkIG5vdCBtYXRjaC4iLCBURVNUX0RBVEEsIGluKTsKKworICAgICAgICAgICAgc29ja1JpZ2h0LnNlbmRUbyhURVNUX0RBVEEsIGxvY2FsLCBzb2NrTGVmdC5nZXRQb3J0KCkpOworICAgICAgICAgICAgaW4gPSBzb2NrTGVmdC5yZWNlaXZlKCk7CisgICAgICAgICAgICBhc3NlcnRBcnJheUVxdWFscygiUmlnaHQtdG8tbGVmdCBlbmNyeXB0ZWQgZGF0YSBkaWQgbm90IG1hdGNoLiIsIFRFU1RfREFUQSwgaW4pOworICAgICAgICB9CisKKyAgICAgICAgc29ja0xlZnQuY2xvc2UoKTsKKyAgICAgICAgc29ja1JpZ2h0LmNsb3NlKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrVGNwKElwU2VjVHJhbnNmb3JtIHRyYW5zZm9ybSwgSW5ldEFkZHJlc3MgbG9jYWwsIGludCBzZW5kQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdXNlSmF2YVNvY2tldHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBHZW5lcmljVGNwU29ja2V0IGNsaWVudCA9IG51bGwsIGFjY2VwdGVkID0gbnVsbDsKKyAgICAgICAgaWYgKHVzZUphdmFTb2NrZXRzKSB7CisgICAgICAgICAgICBTb2NrZXRQYWlyPEphdmFUY3BTb2NrZXQ+IHNvY2tldHMgPSBnZXRKYXZhVGNwU29ja2V0UGFpcihsb2NhbCwgbUlTTSwgdHJhbnNmb3JtKTsKKyAgICAgICAgICAgIGNsaWVudCA9IHNvY2tldHMubUxlZnRTb2NrOworICAgICAgICAgICAgYWNjZXB0ZWQgPSBzb2NrZXRzLm1SaWdodFNvY2s7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTb2NrZXRQYWlyPE5hdGl2ZVRjcFNvY2tldD4gc29ja2V0cyA9IGdldE5hdGl2ZVRjcFNvY2tldFBhaXIobG9jYWwsIG1JU00sIHRyYW5zZm9ybSk7CisgICAgICAgICAgICBjbGllbnQgPSBzb2NrZXRzLm1MZWZ0U29jazsKKyAgICAgICAgICAgIGFjY2VwdGVkID0gc29ja2V0cy5tUmlnaHRTb2NrOworICAgICAgICB9CisKKyAgICAgICAgLy8gV2FpdCBmb3IgVENQIGhhbmRzaGFrZSBwYWNrZXRzIHRvIGJlIGNvdW50ZWQKKyAgICAgICAgU3RhdHNDaGVja2VyLndhaXRGb3JOdW1QYWNrZXRzKDMpOyAvLyAoU1lOLCBTWU4rQUNLLCBBQ0spCisKKyAgICAgICAgLy8gUmVzZXQgU3RhdHNDaGVja2VyLCB0byBpZ25vcmUgbmVnb3RpYXRpb24gb3ZlcmhlYWQuCisgICAgICAgIFN0YXRzQ2hlY2tlci5pbml0U3RhdHNDaGVja2VyKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VuZENvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGJ5dGVbXSBpbjsKKworICAgICAgICAgICAgY2xpZW50LnNlbmQoVEVTVF9EQVRBKTsKKyAgICAgICAgICAgIGluID0gYWNjZXB0ZWQucmVjZWl2ZSgpOworICAgICAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMoIkNsaWVudC10by1zZXJ2ZXIgZW5jcnlwdGVkIGRhdGEgZGlkIG5vdCBtYXRjaC4iLCBURVNUX0RBVEEsIGluKTsKKworICAgICAgICAgICAgLy8gQWxsb3cgZm9yIG5ld2VzdCBkYXRhICsgYWNrIHBhY2tldHMgdG8gYmUgcmV0dXJuZWQgYmVmb3JlIHNlbmRpbmcgbmV4dCBwYWNrZXQKKyAgICAgICAgICAgIC8vIEFsc28gYWRkIHRoZSBudW1iZXIgb2YgZXhwZWN0ZWQgcGFja2V0cyBpbiBlYWNoIG9mIHRoZSBwcmV2aW91cyBydW5zICg0IHBlciBydW4pCisgICAgICAgICAgICBTdGF0c0NoZWNrZXIud2FpdEZvck51bVBhY2tldHMoMiArICg0ICogaSkpOworCisgICAgICAgICAgICBhY2NlcHRlZC5zZW5kKFRFU1RfREFUQSk7CisgICAgICAgICAgICBpbiA9IGNsaWVudC5yZWNlaXZlKCk7CisgICAgICAgICAgICBhc3NlcnRBcnJheUVxdWFscygiU2VydmVyLXRvLWNsaWVudCBlbmNyeXB0ZWQgZGF0YSBkaWQgbm90IG1hdGNoLiIsIFRFU1RfREFUQSwgaW4pOworCisgICAgICAgICAgICAvLyBBbGxvdyBmb3IgYWxsIGRhdGEgKyBhY2sgcGFja2V0cyB0byBiZSByZXR1cm5lZCBiZWZvcmUgc2VuZGluZyBuZXh0IHBhY2tldAorICAgICAgICAgICAgLy8gQWxzbyBhZGQgdGhlIG51bWJlciBvZiBleHBlY3RlZCBwYWNrZXRzIGluIGVhY2ggb2YgdGhlIHByZXZpb3VzIHJ1bnMgKDQgcGVyIHJ1bikKKyAgICAgICAgICAgIFN0YXRzQ2hlY2tlci53YWl0Rm9yTnVtUGFja2V0cyg0ICogKGkgKyAxKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBUcmFuc2Zvcm1zIHNob3VsZCBub3QgYmUgcmVtb3ZlZCBmcm9tIHRoZSBzb2NrZXRzLCBvdGhlcndpc2UgRklOIHBhY2tldHMgd2lsbCBiZSBzZW50CisgICAgICAgIC8vICAgICB1bmVuY3J5cHRlZC4KKyAgICAgICAgLy8gVGhpcyB0ZXN0IGFsc28gdW5mb3J0dW5hdGVseSBoYXBwZW5zIHRvIHJlbHkgb24gYSBudWFuY2Ugb2YgdGhlIGNsZWFudXAgb3JkZXIuIEJ5CisgICAgICAgIC8vICAgICBrZWVwaW5nIHRoZSBwb2xpY3kgb24gdGhlIHNvY2tldCwgYnV0IHJlbW92aW5nIHRoZSBTQSBiZWZvcmUgbGluZ2VyaW5nIEZJTiBwYWNrZXRzCisgICAgICAgIC8vICAgICBhcmUgc2VudCAoYXQgYW4gdW5kZXRlcm1pbmVkIGxhdGVyIHRpbWUpLCB0aGUgRklOIHBhY2tldHMgYXJlIGRyb3BwZWQuIFdpdGhvdXQgdGhpcywKKyAgICAgICAgLy8gICAgIHdlIHJ1biBpbnRvIGFsbCBraW5kcyBvZiBoZWFkYWNoZXMgdHJ5aW5nIHRvIHRlc3QgZGF0YSBhY2NvdW50aW5nICh1bnNvbGljaXRlZAorICAgICAgICAvLyAgICAgcGFja2V0cyBteXN0ZXJpb3VzbHkgYXBwZWFyaW5nIGFuZCBtZXNzaW5nIHVwIG91ciBjb3VudGVycykKKyAgICAgICAgLy8gVGhlIHJpZ2h0IHdheSB0byBjbG9zZSBzb2NrZXRzIGlzIHRvIHNldCBTT19MSU5HRVIgdG8gZW5zdXJlIHN5bmNocm9ub3VzIGNsb3N1cmUsCisgICAgICAgIC8vICAgICBjbG9zaW5nIHRoZSBzb2NrZXRzLCBhbmQgdGhlbiBjbG9zaW5nIHRoZSB0cmFuc2Zvcm1zLiBTZWUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlCisgICAgICAgIC8vICAgICBTb2NrZXQgb3IgRmlsZURlc2NyaXB0b3IgZmxhdm9ycyBvZiBhcHBseVRyYW5zcG9ydE1vZGVUcmFuc2Zvcm0oKSBpbiBJcFNlY01hbmFnZXIKKyAgICAgICAgLy8gICAgIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICAgICAgY2xpZW50LmNsb3NlKCk7CisgICAgICAgIGFjY2VwdGVkLmNsb3NlKCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBBbGxvYyBvdXRib3VuZCBTUEkKKyAgICAgKiBBbGxvYyBpbmJvdW5kIFNQSQorICAgICAqIENyZWF0ZSB0cmFuc3BvcnQgbW9kZSB0cmFuc2Zvcm0KKyAgICAgKiBvcGVuIHNvY2tldAorICAgICAqIGFwcGx5IHRyYW5zZm9ybSB0byBzb2NrZXQKKyAgICAgKiBzZW5kIGRhdGEgb24gc29ja2V0CisgICAgICogcmVsZWFzZSB0cmFuc2Zvcm0KKyAgICAgKiBzZW5kIGRhdGEgKGV4cGVjdCBleGNlcHRpb24pCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVRyYW5zZm9ybSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJbmV0QWRkcmVzcyBsb2NhbEFkZHIgPSBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoSVBWNF9MT09QQkFDSyk7CisgICAgICAgIElwU2VjTWFuYWdlci5TZWN1cml0eVBhcmFtZXRlckluZGV4IHNwaSA9CisgICAgICAgICAgICAgICAgbUlTTS5hbGxvY2F0ZVNlY3VyaXR5UGFyYW1ldGVySW5kZXgobG9jYWxBZGRyKTsKKworICAgICAgICBJcFNlY1RyYW5zZm9ybSB0cmFuc2Zvcm0gPQorICAgICAgICAgICAgICAgIG5ldyBJcFNlY1RyYW5zZm9ybS5CdWlsZGVyKG1Db250ZXh0KQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEVuY3J5cHRpb24obmV3IElwU2VjQWxnb3JpdGhtKElwU2VjQWxnb3JpdGhtLkNSWVBUX0FFU19DQkMsIENSWVBUX0tFWSkpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0QXV0aGVudGljYXRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJcFNlY0FsZ29yaXRobSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJcFNlY0FsZ29yaXRobS5BVVRIX0hNQUNfU0hBMjU2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVVEhfS0VZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVVEhfS0VZLmxlbmd0aCAqIDgpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkVHJhbnNwb3J0TW9kZVRyYW5zZm9ybShsb2NhbEFkZHIsIHNwaSk7CisKKyAgICAgICAgZmluYWwgYm9vbGVhbiBbXVtdIGFwcGx5SW5BcHBseU91dCA9IHsKKyAgICAgICAgICAgICAgICB7ZmFsc2UsIGZhbHNlfSwge2ZhbHNlLCB0cnVlfSwge3RydWUsIGZhbHNlfSwge3RydWUsdHJ1ZX19OworICAgICAgICBmaW5hbCBieXRlW10gZGF0YSA9IG5ldyBTdHJpbmcoIkJlc3QgdGVzdCBkYXRhIGV2ZXIhIikuZ2V0Qnl0ZXMoIlVURi04Iik7CisgICAgICAgIGZpbmFsIERhdGFncmFtUGFja2V0IG91dFBhY2tldCA9IG5ldyBEYXRhZ3JhbVBhY2tldChkYXRhLCAwLCBkYXRhLmxlbmd0aCwgbG9jYWxBZGRyLCAwKTsKKworICAgICAgICBieXRlW10gaW4gPSBuZXcgYnl0ZVtkYXRhLmxlbmd0aF07CisgICAgICAgIERhdGFncmFtUGFja2V0IGluUGFja2V0ID0gbmV3IERhdGFncmFtUGFja2V0KGluLCBpbi5sZW5ndGgpOworICAgICAgICBEYXRhZ3JhbVNvY2tldCBsb2NhbFNvY2tldDsKKyAgICAgICAgaW50IGxvY2FsUG9ydDsKKworICAgICAgICBmb3IoYm9vbGVhbltdIGlvIDogYXBwbHlJbkFwcGx5T3V0KSB7CisgICAgICAgICAgICBib29sZWFuIGFwcGx5SW4gPSBpb1swXTsKKyAgICAgICAgICAgIGJvb2xlYW4gYXBwbHlPdXQgPSBpb1sxXTsKKyAgICAgICAgICAgIC8vIEJpbmQgbG9jYWxTb2NrZXQgdG8gYSByYW5kb20gYXZhaWxhYmxlIHBvcnQuCisgICAgICAgICAgICBsb2NhbFNvY2tldCA9IG5ldyBEYXRhZ3JhbVNvY2tldCgwKTsKKyAgICAgICAgICAgIGxvY2FsUG9ydCA9IGxvY2FsU29ja2V0LmdldExvY2FsUG9ydCgpOworICAgICAgICAgICAgbG9jYWxTb2NrZXQuc2V0U29UaW1lb3V0KDIwMCk7CisgICAgICAgICAgICBvdXRQYWNrZXQuc2V0UG9ydChsb2NhbFBvcnQpOworICAgICAgICAgICAgaWYgKGFwcGx5SW4pIHsKKyAgICAgICAgICAgICAgICBtSVNNLmFwcGx5VHJhbnNwb3J0TW9kZVRyYW5zZm9ybSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU29ja2V0LCBJcFNlY01hbmFnZXIuRElSRUNUSU9OX0lOLCB0cmFuc2Zvcm0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFwcGx5T3V0KSB7CisgICAgICAgICAgICAgICAgbUlTTS5hcHBseVRyYW5zcG9ydE1vZGVUcmFuc2Zvcm0oCisgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFNvY2tldCwgSXBTZWNNYW5hZ2VyLkRJUkVDVElPTl9PVVQsIHRyYW5zZm9ybSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYXBwbHlJbiA9PSBhcHBseU91dCkgeworICAgICAgICAgICAgICAgIGxvY2FsU29ja2V0LnNlbmQob3V0UGFja2V0KTsKKyAgICAgICAgICAgICAgICBsb2NhbFNvY2tldC5yZWNlaXZlKGluUGFja2V0KTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJFbmNhcHN1bGF0ZWQgZGF0YSBkaWQgbm90IG1hdGNoLiIsCisgICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuZXF1YWxzKG91dFBhY2tldC5nZXREYXRhKCksIGluUGFja2V0LmdldERhdGEoKSkpOworICAgICAgICAgICAgICAgIG1JU00ucmVtb3ZlVHJhbnNwb3J0TW9kZVRyYW5zZm9ybXMobG9jYWxTb2NrZXQpOworICAgICAgICAgICAgICAgIGxvY2FsU29ja2V0LmNsb3NlKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsU29ja2V0LnNlbmQob3V0UGFja2V0KTsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxTb2NrZXQucmVjZWl2ZShpblBhY2tldCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBtSVNNLnJlbW92ZVRyYW5zcG9ydE1vZGVUcmFuc2Zvcm1zKGxvY2FsU29ja2V0KTsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxTb2NrZXQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gRklYTUU6IFRoaXMgY2hlY2sgaXMgZGlzYWJsZWQgYmVjYXVzZSBzb2NrZXRzIGN1cnJlbnRseSByZWNlaXZlIGRhdGEKKyAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBhIHZhbGlkIFNBIGZvciBkZWNyeXB0aW9uLCBldmVuIHdoZW4gdGhlIGlucHV0IHBvbGljeSBpcworICAgICAgICAgICAgICAgIC8vIG5vdCBhcHBsaWVkIHRvIGEgc29ja2V0LgorICAgICAgICAgICAgICAgIC8vICBmYWlsKCJEYXRhIElPIHNob3VsZCBmYWlsIG9uIGFzeW1tZXRyaWNhbCB0cmFuc2Zvcm1zISArIElucHV0PSIKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgICArIGFwcGx5SW4gKyAiIE91dHB1dD0iICsgYXBwbHlPdXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRyYW5zZm9ybS5jbG9zZSgpOworICAgIH0KKworICAgIC8qKiBTbmFwc2hvdCBvZiBUcmFmZmljU3RhdHMgYXMgb2YgaW5pdFN0YXRzQ2hlY2tlciBjYWxsIGZvciBsYXRlciBjb21wYXJpc29ucyAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN0YXRzQ2hlY2tlciB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZSBFUlJPUl9NQVJHSU5fQllURVMgPSAxLjA1OworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUgRVJST1JfTUFSR0lOX1BLVFMgPSAxLjA1OworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1dBSVRfVElNRV9NSUxMSVMgPSAxMDAwOworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGxvbmcgdWlkVHhCeXRlczsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyB1aWRSeEJ5dGVzOworICAgICAgICBwcml2YXRlIHN0YXRpYyBsb25nIHVpZFR4UGFja2V0czsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyB1aWRSeFBhY2tldHM7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBpZmFjZVR4Qnl0ZXM7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGxvbmcgaWZhY2VSeEJ5dGVzOworICAgICAgICBwcml2YXRlIHN0YXRpYyBsb25nIGlmYWNlVHhQYWNrZXRzOworICAgICAgICBwcml2YXRlIHN0YXRpYyBsb25nIGlmYWNlUnhQYWNrZXRzOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIG1ldGhvZCBjb3VudHMgdGhlIG51bWJlciBvZiBpbmNvbWluZyBwYWNrZXRzLCBwb2xsaW5nIGludGVybWl0dGVudGx5IHVwIHRvCisgICAgICAgICAqIE1BWF9XQUlUX1RJTUVfTUlMTElTLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB3YWl0Rm9yTnVtUGFja2V0cyhpbnQgbnVtUGFja2V0cykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBsb25nIHVpZFR4RGVsdGEgPSAwOworICAgICAgICAgICAgbG9uZyB1aWRSeERlbHRhID0gMDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKyAgICAgICAgICAgICAgICB1aWRUeERlbHRhID0gVHJhZmZpY1N0YXRzLmdldFVpZFR4UGFja2V0cyhPcy5nZXR1aWQoKSkgLSB1aWRUeFBhY2tldHM7CisgICAgICAgICAgICAgICAgdWlkUnhEZWx0YSA9IFRyYWZmaWNTdGF0cy5nZXRVaWRSeFBhY2tldHMoT3MuZ2V0dWlkKCkpIC0gdWlkUnhQYWNrZXRzOworCisgICAgICAgICAgICAgICAgLy8gVE9ETzogQ2hlY2sgUnggcGFja2V0cyBhcyB3ZWxsIG9uY2Uga2VybmVsIHNlY3VyaXR5IHBvbGljeSBidWcgaXMgZml4ZWQuCisgICAgICAgICAgICAgICAgLy8gKGIvNzA2MzU0MTcpCisgICAgICAgICAgICAgICAgaWYgKHVpZFR4RGVsdGEgPj0gbnVtUGFja2V0cykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChNQVhfV0FJVF9USU1FX01JTExJUyAvIDEwMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmYWlsKAorICAgICAgICAgICAgICAgICAgICAiTm90IGVub3VnaCB0cmFmZmljIHdhcyByZWNvcmRlZCB0byBzYXRpc2Z5IHRoZSBwcm92aWRlZCBjb25kaXRpb25zOiB3YW50ZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbnVtUGFja2V0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgZ290ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHVpZFR4RGVsdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgdHggYW5kICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHVpZFJ4RGVsdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgcnggcGFja2V0cyIpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRVaWRTdGF0c0RlbHRhKAorICAgICAgICAgICAgICAgIGludCBleHBlY3RlZFR4Qnl0ZURlbHRhLAorICAgICAgICAgICAgICAgIGludCBleHBlY3RlZFR4UGFja2V0RGVsdGEsCisgICAgICAgICAgICAgICAgaW50IG1pblJ4Qnl0ZURlbHRhLAorICAgICAgICAgICAgICAgIGludCBtYXhSeEJ5dGVEZWx0YSwKKyAgICAgICAgICAgICAgICBpbnQgZXhwZWN0ZWRSeFBhY2tldERlbHRhKSB7CisgICAgICAgICAgICBsb25nIG5ld1VpZFR4Qnl0ZXMgPSBUcmFmZmljU3RhdHMuZ2V0VWlkVHhCeXRlcyhPcy5nZXR1aWQoKSk7CisgICAgICAgICAgICBsb25nIG5ld1VpZFJ4Qnl0ZXMgPSBUcmFmZmljU3RhdHMuZ2V0VWlkUnhCeXRlcyhPcy5nZXR1aWQoKSk7CisgICAgICAgICAgICBsb25nIG5ld1VpZFR4UGFja2V0cyA9IFRyYWZmaWNTdGF0cy5nZXRVaWRUeFBhY2tldHMoT3MuZ2V0dWlkKCkpOworICAgICAgICAgICAgbG9uZyBuZXdVaWRSeFBhY2tldHMgPSBUcmFmZmljU3RhdHMuZ2V0VWlkUnhQYWNrZXRzKE9zLmdldHVpZCgpKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVHhCeXRlRGVsdGEsIG5ld1VpZFR4Qnl0ZXMgLSB1aWRUeEJ5dGVzKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICAgICAgICAgIG5ld1VpZFJ4Qnl0ZXMgLSB1aWRSeEJ5dGVzID49IG1pblJ4Qnl0ZURlbHRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbmV3VWlkUnhCeXRlcyAtIHVpZFJ4Qnl0ZXMgPD0gbWF4UnhCeXRlRGVsdGEpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVHhQYWNrZXREZWx0YSwgbmV3VWlkVHhQYWNrZXRzIC0gdWlkVHhQYWNrZXRzKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFJ4UGFja2V0RGVsdGEsIG5ld1VpZFJ4UGFja2V0cyAtIHVpZFJ4UGFja2V0cyk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydElmYWNlU3RhdHNEZWx0YSgKKyAgICAgICAgICAgICAgICBpbnQgZXhwZWN0ZWRUeEJ5dGVEZWx0YSwKKyAgICAgICAgICAgICAgICBpbnQgZXhwZWN0ZWRUeFBhY2tldERlbHRhLAorICAgICAgICAgICAgICAgIGludCBleHBlY3RlZFJ4Qnl0ZURlbHRhLAorICAgICAgICAgICAgICAgIGludCBleHBlY3RlZFJ4UGFja2V0RGVsdGEpCisgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGxvbmcgbmV3SWZhY2VUeEJ5dGVzID0gVHJhZmZpY1N0YXRzLmdldExvb3BiYWNrVHhCeXRlcygpOworICAgICAgICAgICAgbG9uZyBuZXdJZmFjZVJ4Qnl0ZXMgPSBUcmFmZmljU3RhdHMuZ2V0TG9vcGJhY2tSeEJ5dGVzKCk7CisgICAgICAgICAgICBsb25nIG5ld0lmYWNlVHhQYWNrZXRzID0gVHJhZmZpY1N0YXRzLmdldExvb3BiYWNrVHhQYWNrZXRzKCk7CisgICAgICAgICAgICBsb25nIG5ld0lmYWNlUnhQYWNrZXRzID0gVHJhZmZpY1N0YXRzLmdldExvb3BiYWNrUnhQYWNrZXRzKCk7CisKKyAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgaWZhY2Ugc3RhdHMgYXJlIHdpdGhpbiBhbiBhY2NlcHRhYmxlIHJhbmdlOyBkYXRhIG1pZ2h0IGJlIHNlbnQKKyAgICAgICAgICAgIC8vIG9uIHRoZSBsb2NhbCBpbnRlcmZhY2UgYnkgb3RoZXIgYXBwcy4KKyAgICAgICAgICAgIGFzc2VydEFwcHJveEVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgaWZhY2VUeEJ5dGVzLCBuZXdJZmFjZVR4Qnl0ZXMsIGV4cGVjdGVkVHhCeXRlRGVsdGEsIEVSUk9SX01BUkdJTl9CWVRFUyk7CisgICAgICAgICAgICBhc3NlcnRBcHByb3hFcXVhbHMoCisgICAgICAgICAgICAgICAgICAgIGlmYWNlUnhCeXRlcywgbmV3SWZhY2VSeEJ5dGVzLCBleHBlY3RlZFJ4Qnl0ZURlbHRhLCBFUlJPUl9NQVJHSU5fQllURVMpOworICAgICAgICAgICAgYXNzZXJ0QXBwcm94RXF1YWxzKAorICAgICAgICAgICAgICAgICAgICBpZmFjZVR4UGFja2V0cywgbmV3SWZhY2VUeFBhY2tldHMsIGV4cGVjdGVkVHhQYWNrZXREZWx0YSwgRVJST1JfTUFSR0lOX1BLVFMpOworICAgICAgICAgICAgYXNzZXJ0QXBwcm94RXF1YWxzKAorICAgICAgICAgICAgICAgICAgICBpZmFjZVJ4UGFja2V0cywgbmV3SWZhY2VSeFBhY2tldHMsIGV4cGVjdGVkUnhQYWNrZXREZWx0YSwgRVJST1JfTUFSR0lOX1BLVFMpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRBcHByb3hFcXVhbHMoCisgICAgICAgICAgICAgICAgbG9uZyBvbGRTdGF0cywgbG9uZyBuZXdTdGF0cywgaW50IGV4cGVjdGVkRGVsdGEsIGRvdWJsZSBlcnJvck1hcmdpbikgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleHBlY3RlZERlbHRhIDw9IG5ld1N0YXRzIC0gb2xkU3RhdHMpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgoZXhwZWN0ZWREZWx0YSAqIGVycm9yTWFyZ2luKSA+IG5ld1N0YXRzIC0gb2xkU3RhdHMpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbml0U3RhdHNDaGVja2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICB1aWRUeEJ5dGVzID0gVHJhZmZpY1N0YXRzLmdldFVpZFR4Qnl0ZXMoT3MuZ2V0dWlkKCkpOworICAgICAgICAgICAgdWlkUnhCeXRlcyA9IFRyYWZmaWNTdGF0cy5nZXRVaWRSeEJ5dGVzKE9zLmdldHVpZCgpKTsKKyAgICAgICAgICAgIHVpZFR4UGFja2V0cyA9IFRyYWZmaWNTdGF0cy5nZXRVaWRUeFBhY2tldHMoT3MuZ2V0dWlkKCkpOworICAgICAgICAgICAgdWlkUnhQYWNrZXRzID0gVHJhZmZpY1N0YXRzLmdldFVpZFJ4UGFja2V0cyhPcy5nZXR1aWQoKSk7CisKKyAgICAgICAgICAgIGlmYWNlVHhCeXRlcyA9IFRyYWZmaWNTdGF0cy5nZXRMb29wYmFja1R4Qnl0ZXMoKTsKKyAgICAgICAgICAgIGlmYWNlUnhCeXRlcyA9IFRyYWZmaWNTdGF0cy5nZXRMb29wYmFja1J4Qnl0ZXMoKTsKKyAgICAgICAgICAgIGlmYWNlVHhQYWNrZXRzID0gVHJhZmZpY1N0YXRzLmdldExvb3BiYWNrVHhQYWNrZXRzKCk7CisgICAgICAgICAgICBpZmFjZVJ4UGFja2V0cyA9IFRyYWZmaWNTdGF0cy5nZXRMb29wYmFja1J4UGFja2V0cygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgZ2V0VHJ1bmNMZW5CaXRzKElwU2VjQWxnb3JpdGhtIGF1dGhPckFlYWQpIHsKKyAgICAgICAgcmV0dXJuIGF1dGhPckFlYWQgPT0gbnVsbCA/IDAgOiBhdXRoT3JBZWFkLmdldFRydW5jYXRpb25MZW5ndGhCaXRzKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgZ2V0SXZMZW4oSXBTZWNBbGdvcml0aG0gY3J5cHRPckFlYWQpIHsKKyAgICAgICAgaWYgKGNyeXB0T3JBZWFkID09IG51bGwpIHsgcmV0dXJuIDA7IH0KKworICAgICAgICBzd2l0Y2ggKGNyeXB0T3JBZWFkLmdldE5hbWUoKSkgeworICAgICAgICAgICAgY2FzZSBJcFNlY0FsZ29yaXRobS5DUllQVF9BRVNfQ0JDOgorICAgICAgICAgICAgICAgIHJldHVybiBBRVNfQ0JDX0lWX0xFTjsKKyAgICAgICAgICAgIGNhc2UgSXBTZWNBbGdvcml0aG0uQVVUSF9DUllQVF9BRVNfR0NNOgorICAgICAgICAgICAgICAgIHJldHVybiBBRVNfR0NNX0lWX0xFTjsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJJViBsZW5ndGggdW5rbm93biBmb3IgYWxnb3JpdGhtIiArIGNyeXB0T3JBZWFkLmdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGludCBnZXRCbGtTaXplKElwU2VjQWxnb3JpdGhtIGNyeXB0T3JBZWFkKSB7CisgICAgICAgIC8vIFJGQyA0MzAzLCBzZWN0aW9uIDIuNCBzdGF0ZXMgdGhhdCBjaXBoZXJ0ZXh0IHBsdXMgcGFkX2xlbiwgbmV4dF9oZWFkZXIgZmllbGRzIG11c3QKKyAgICAgICAgLy8gICAgIHRlcm1pbmF0ZSBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gVGh1cywgdGhlIG1pbmltdW0gY2lwaGVydGV4dCBibG9jayBzaXplIGlzIDQgYnl0ZXMuCisgICAgICAgIGlmIChjcnlwdE9yQWVhZCA9PSBudWxsKSB7IHJldHVybiA0OyB9CisKKyAgICAgICAgc3dpdGNoIChjcnlwdE9yQWVhZC5nZXROYW1lKCkpIHsKKyAgICAgICAgICAgIGNhc2UgSXBTZWNBbGdvcml0aG0uQ1JZUFRfQUVTX0NCQzoKKyAgICAgICAgICAgICAgICByZXR1cm4gQUVTX0NCQ19CTEtfU0laRTsKKyAgICAgICAgICAgIGNhc2UgSXBTZWNBbGdvcml0aG0uQVVUSF9DUllQVF9BRVNfR0NNOgorICAgICAgICAgICAgICAgIHJldHVybiBBRVNfR0NNX0JMS19TSVpFOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIkJsayBzaXplIHVua25vd24gZm9yIGFsZ29yaXRobSIgKyBjcnlwdE9yQWVhZC5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIEhlbHBlciBmdW5jdGlvbiB0byBjYWxjdWxhdGUgZXhwZWN0ZWQgRVNQIHBhY2tldCBzaXplLiAqLworICAgIHByaXZhdGUgaW50IGNhbGN1bGF0ZUVzcFBhY2tldFNpemUoCisgICAgICAgICAgICBpbnQgcGF5bG9hZExlbiwgaW50IGNyeXB0SXZMZW5ndGgsIGludCBjcnlwdEJsb2NrU2l6ZSwgaW50IGF1dGhUcnVuY0xlbikgeworICAgICAgICBmaW5hbCBpbnQgRVNQX0hEUkxFTiA9IDQgKyA0OyAvLyBTUEkgKyBTZXEjCisgICAgICAgIGZpbmFsIGludCBJQ1ZfTEVOID0gYXV0aFRydW5jTGVuIC8gODsgLy8gQXV0aCB0cmFpbGVyOyBiYXNlZCBvbiB0cnVuY2F0aW9uIGxlbmd0aAorICAgICAgICBwYXlsb2FkTGVuICs9IGNyeXB0SXZMZW5ndGg7IC8vIEluaXRpYWxpemF0aW9uIFZlY3RvcgorICAgICAgICBwYXlsb2FkTGVuICs9IDI7IC8vIEVTUCB0cmFpbGVyCisKKyAgICAgICAgLy8gQWxpZ24gdG8gYmxvY2sgc2l6ZSBvZiBlbmNyeXB0aW9uIGFsZ29yaXRobQorICAgICAgICBwYXlsb2FkTGVuICs9IChjcnlwdEJsb2NrU2l6ZSAtIChwYXlsb2FkTGVuICUgY3J5cHRCbG9ja1NpemUpKSAlIGNyeXB0QmxvY2tTaXplOworICAgICAgICByZXR1cm4gcGF5bG9hZExlbiArIEVTUF9IRFJMRU4gKyBJQ1ZfTEVOOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNoZWNrVHJhbnNmb3JtKAorICAgICAgICAgICAgaW50IHByb3RvY29sLAorICAgICAgICAgICAgU3RyaW5nIGxvY2FsQWRkcmVzcywKKyAgICAgICAgICAgIElwU2VjQWxnb3JpdGhtIGNyeXB0LAorICAgICAgICAgICAgSXBTZWNBbGdvcml0aG0gYXV0aCwKKyAgICAgICAgICAgIElwU2VjQWxnb3JpdGhtIGFlYWQsCisgICAgICAgICAgICBib29sZWFuIGRvVWRwRW5jYXAsCisgICAgICAgICAgICBpbnQgc2VuZENvdW50LAorICAgICAgICAgICAgYm9vbGVhbiB1c2VKYXZhU29ja2V0cykKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdGF0c0NoZWNrZXIuaW5pdFN0YXRzQ2hlY2tlcigpOworICAgICAgICBJbmV0QWRkcmVzcyBsb2NhbCA9IEluZXRBZGRyZXNzLmdldEJ5TmFtZShsb2NhbEFkZHJlc3MpOworCisgICAgICAgIHRyeSAoSXBTZWNNYW5hZ2VyLlVkcEVuY2Fwc3VsYXRpb25Tb2NrZXQgZW5jYXBTb2NrZXQgPSBtSVNNLm9wZW5VZHBFbmNhcHN1bGF0aW9uU29ja2V0KCk7CisgICAgICAgICAgICAgICAgSXBTZWNNYW5hZ2VyLlNlY3VyaXR5UGFyYW1ldGVySW5kZXggc3BpID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1JU00uYWxsb2NhdGVTZWN1cml0eVBhcmFtZXRlckluZGV4KGxvY2FsKSkgeworCisgICAgICAgICAgICBJcFNlY1RyYW5zZm9ybS5CdWlsZGVyIHRyYW5zZm9ybUJ1aWxkZXIgPSBuZXcgSXBTZWNUcmFuc2Zvcm0uQnVpbGRlcihtQ29udGV4dCk7CisgICAgICAgICAgICBpZiAoY3J5cHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyYW5zZm9ybUJ1aWxkZXIuc2V0RW5jcnlwdGlvbihjcnlwdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYXV0aCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJhbnNmb3JtQnVpbGRlci5zZXRBdXRoZW50aWNhdGlvbihhdXRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhZWFkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cmFuc2Zvcm1CdWlsZGVyLnNldEF1dGhlbnRpY2F0ZWRFbmNyeXB0aW9uKGFlYWQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZG9VZHBFbmNhcCkgeworICAgICAgICAgICAgICAgIHRyYW5zZm9ybUJ1aWxkZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtQnVpbGRlci5zZXRJcHY0RW5jYXBzdWxhdGlvbihlbmNhcFNvY2tldCwgZW5jYXBTb2NrZXQuZ2V0UG9ydCgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IGlwSGRyTGVuID0gbG9jYWwgaW5zdGFuY2VvZiBJbmV0NkFkZHJlc3MgPyBJUDZfSERSTEVOIDogSVA0X0hEUkxFTjsKKyAgICAgICAgICAgIGludCB0cmFuc3BvcnRIZHJMZW4gPSAwOworICAgICAgICAgICAgaW50IHVkcEVuY2FwTGVuID0gZG9VZHBFbmNhcCA/IFVEUF9IRFJMRU4gOiAwOworCisgICAgICAgICAgICB0cnkgKElwU2VjVHJhbnNmb3JtIHRyYW5zZm9ybSA9CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1CdWlsZGVyLmJ1aWxkVHJhbnNwb3J0TW9kZVRyYW5zZm9ybShsb2NhbCwgc3BpKSkgeworICAgICAgICAgICAgICAgIGlmIChwcm90b2NvbCA9PSBJUFBST1RPX1RDUCkgeworICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnRIZHJMZW4gPSBUQ1BfSERSTEVOX1dJVEhfT1BUSU9OUzsKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tUY3AodHJhbnNmb3JtLCBsb2NhbCwgc2VuZENvdW50LCB1c2VKYXZhU29ja2V0cyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm90b2NvbCA9PSBJUFBST1RPX1VEUCkgeworICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnRIZHJMZW4gPSBVRFBfSERSTEVOOworCisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IEFsc28gY2hlY2sgY29ubmVjdGVkIHVkcC4KKyAgICAgICAgICAgICAgICAgICAgY2hlY2tVbmNvbm5lY3RlZFVkcCh0cmFuc2Zvcm0sIGxvY2FsLCBzZW5kQ291bnQsIHVzZUphdmFTb2NrZXRzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHByb3RvY29sIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjaGVja1N0YXRzQ2hlY2tlcigKKyAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgIGlwSGRyTGVuLAorICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnRIZHJMZW4sCisgICAgICAgICAgICAgICAgICAgIHVkcEVuY2FwTGVuLAorICAgICAgICAgICAgICAgICAgICBzZW5kQ291bnQsCisgICAgICAgICAgICAgICAgICAgIGdldEl2TGVuKGNyeXB0ICE9IG51bGwgPyBjcnlwdCA6IGFlYWQpLAorICAgICAgICAgICAgICAgICAgICBnZXRCbGtTaXplKGNyeXB0ICE9IG51bGwgPyBjcnlwdCA6IGFlYWQpLAorICAgICAgICAgICAgICAgICAgICBnZXRUcnVuY0xlbkJpdHMoYXV0aCAhPSBudWxsID8gYXV0aCA6IGFlYWQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja1N0YXRzQ2hlY2tlcigKKyAgICAgICAgICAgIGludCBwcm90b2NvbCwKKyAgICAgICAgICAgIGludCBpcEhkckxlbiwKKyAgICAgICAgICAgIGludCB0cmFuc3BvcnRIZHJMZW4sCisgICAgICAgICAgICBpbnQgdWRwRW5jYXBMZW4sCisgICAgICAgICAgICBpbnQgc2VuZENvdW50LAorICAgICAgICAgICAgaW50IGl2TGVuLAorICAgICAgICAgICAgaW50IGJsa1NpemUsCisgICAgICAgICAgICBpbnQgdHJ1bmNMZW5CaXRzKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaW50IGlubmVyUGFja2V0U2l6ZSA9IFRFU1RfREFUQS5sZW5ndGggKyB0cmFuc3BvcnRIZHJMZW4gKyBpcEhkckxlbjsKKyAgICAgICAgaW50IG91dGVyUGFja2V0U2l6ZSA9CisgICAgICAgICAgICAgICAgY2FsY3VsYXRlRXNwUGFja2V0U2l6ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9EQVRBLmxlbmd0aCArIHRyYW5zcG9ydEhkckxlbiwgaXZMZW4sIGJsa1NpemUsIHRydW5jTGVuQml0cykKKyAgICAgICAgICAgICAgICAgICAgICAgICsgdWRwRW5jYXBMZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICsgaXBIZHJMZW47CisKKyAgICAgICAgaW50IGV4cGVjdGVkT3V0ZXJCeXRlcyA9IG91dGVyUGFja2V0U2l6ZSAqIHNlbmRDb3VudDsKKyAgICAgICAgaW50IGV4cGVjdGVkSW5uZXJCeXRlcyA9IGlubmVyUGFja2V0U2l6ZSAqIHNlbmRDb3VudDsKKyAgICAgICAgaW50IGV4cGVjdGVkUGFja2V0cyA9IHNlbmRDb3VudDsKKworICAgICAgICAvLyBFYWNoIHJ1biBzZW5kcyB0d28gcGFja2V0cywgb25lIGluIGVhY2ggZGlyZWN0aW9uLgorICAgICAgICBzZW5kQ291bnQgKj0gMjsKKyAgICAgICAgZXhwZWN0ZWRPdXRlckJ5dGVzICo9IDI7CisgICAgICAgIGV4cGVjdGVkSW5uZXJCeXRlcyAqPSAyOworICAgICAgICBleHBlY3RlZFBhY2tldHMgKj0gMjsKKworICAgICAgICAvLyBBZGQgVENQIEFDS3MgZm9yIGRhdGEgcGFja2V0cworICAgICAgICBpZiAocHJvdG9jb2wgPT0gSVBQUk9UT19UQ1ApIHsKKyAgICAgICAgICAgIGludCBlbmNyeXB0ZWRUY3BQa3RTaXplID0KKyAgICAgICAgICAgICAgICAgICAgY2FsY3VsYXRlRXNwUGFja2V0U2l6ZShUQ1BfSERSTEVOX1dJVEhfT1BUSU9OUywgaXZMZW4sIGJsa1NpemUsIHRydW5jTGVuQml0cyk7CisKKworICAgICAgICAgICAgICAgIC8vIEFkZCBkYXRhIHBhY2tldCBBQ0tzCisgICAgICAgICAgICAgICAgZXhwZWN0ZWRPdXRlckJ5dGVzICs9IChlbmNyeXB0ZWRUY3BQa3RTaXplICsgdWRwRW5jYXBMZW4gKyBpcEhkckxlbikgKiAoc2VuZENvdW50KTsKKyAgICAgICAgICAgICAgICBleHBlY3RlZElubmVyQnl0ZXMgKz0gKFRDUF9IRFJMRU5fV0lUSF9PUFRJT05TICsgaXBIZHJMZW4pICogKHNlbmRDb3VudCk7CisgICAgICAgICAgICAgICAgZXhwZWN0ZWRQYWNrZXRzICs9IHNlbmRDb3VudDsKKyAgICAgICAgfQorCisgICAgICAgIFN0YXRzQ2hlY2tlci53YWl0Rm9yTnVtUGFja2V0cyhleHBlY3RlZFBhY2tldHMpOworCisgICAgICAgIC8vIGVCUEYgb25seSBjb3VudHMgaW5uZXIgcGFja2V0cywgd2hlcmVhcyB4dF9xdGFndWlkIGNvdW50cyBvdXRlciBwYWNrZXRzLiBBbGxvdyBib3RoCisgICAgICAgIFN0YXRzQ2hlY2tlci5hc3NlcnRVaWRTdGF0c0RlbHRhKAorICAgICAgICAgICAgICAgIGV4cGVjdGVkT3V0ZXJCeXRlcywKKyAgICAgICAgICAgICAgICBleHBlY3RlZFBhY2tldHMsCisgICAgICAgICAgICAgICAgZXhwZWN0ZWRJbm5lckJ5dGVzLAorICAgICAgICAgICAgICAgIGV4cGVjdGVkT3V0ZXJCeXRlcywKKyAgICAgICAgICAgICAgICBleHBlY3RlZFBhY2tldHMpOworCisgICAgICAgIC8vIFVucmVsaWFibGUgYXQgbG93IG51bWJlcnMgZHVlIHRvIHBvdGVudGlhbCBpbnRlcmZlcmVuY2UgZnJvbSBvdGhlciBwcm9jZXNzZXMuCisgICAgICAgIGlmIChzZW5kQ291bnQgPj0gMTAwMCkgeworICAgICAgICAgICAgU3RhdHNDaGVja2VyLmFzc2VydElmYWNlU3RhdHNEZWx0YSgKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRPdXRlckJ5dGVzLCBleHBlY3RlZFBhY2tldHMsIGV4cGVjdGVkT3V0ZXJCeXRlcywgZXhwZWN0ZWRQYWNrZXRzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja0lrZVBhY2tldCgKKyAgICAgICAgICAgIE5hdGl2ZVVkcFNvY2tldCB3cmFwcGVkRW5jYXBTb2NrZXQsIEluZXRBZGRyZXNzIGxvY2FsQWRkcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0YXRzQ2hlY2tlci5pbml0U3RhdHNDaGVja2VyKCk7CisKKyAgICAgICAgdHJ5IChOYXRpdmVVZHBTb2NrZXQgcmVtb3RlU29ja2V0ID0gbmV3IE5hdGl2ZVVkcFNvY2tldChnZXRCb3VuZFVkcFNvY2tldChsb2NhbEFkZHIpKSkgeworCisgICAgICAgICAgICAvLyBBcHBlbmQgSUtFL0VTUCBoZWFkZXIgLSA0IGJ5dGVzIG9mIFNQSSwgNCBieXRlcyBvZiBzZXEgbnVtYmVyLCBhbGwgemVyb2VkIG91dAorICAgICAgICAgICAgLy8gSWYgdGhlIGZpcnN0IGZvdXIgYnl0ZXMgYXJlIHplcm8sIGFzc3VtZSBub24tRVNQIChJS0UgdHJhZmZpYykKKyAgICAgICAgICAgIGJ5dGVbXSBkYXRhV2l0aEVzcEhlYWRlciA9IG5ldyBieXRlW1RFU1RfREFUQS5sZW5ndGggKyA4XTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoVEVTVF9EQVRBLCAwLCBkYXRhV2l0aEVzcEhlYWRlciwgOCwgVEVTVF9EQVRBLmxlbmd0aCk7CisKKyAgICAgICAgICAgIC8vIFNlbmQgdGhlIElLRSBwYWNrZXQgZnJvbSByZW1vdGVTb2NrZXQgdG8gd3JhcHBlZEVuY2FwU29ja2V0LiBTaW5jZSBJS0UgcGFja2V0cworICAgICAgICAgICAgLy8gYXJlIG11bHRpcGxleGVkIG92ZXIgdGhlIHNvY2tldCwgd2UgZXhwZWN0IHRoZW0gdG8gYXBwZWFyIG9uIHRoZSBlbmNhcCBzb2NrZXQKKyAgICAgICAgICAgIC8vIChhcyBvcHBvc2VkIHRvIGJlaW5nIGRlY3J5cHRlZCBhbmQgcmVjZWl2ZWQgb24gdGhlIG5vbi1lbmNhcCBzb2NrZXQpCisgICAgICAgICAgICByZW1vdGVTb2NrZXQuc2VuZFRvKGRhdGFXaXRoRXNwSGVhZGVyLCBsb2NhbEFkZHIsIHdyYXBwZWRFbmNhcFNvY2tldC5nZXRQb3J0KCkpOworICAgICAgICAgICAgYnl0ZVtdIGluID0gd3JhcHBlZEVuY2FwU29ja2V0LnJlY2VpdmUoKTsKKyAgICAgICAgICAgIGFzc2VydEFycmF5RXF1YWxzKCJFbmNhcHN1bGF0ZWQgZGF0YSBkaWQgbm90IG1hdGNoLiIsIGRhdGFXaXRoRXNwSGVhZGVyLCBpbik7CisKKyAgICAgICAgICAgIC8vIEFsc28gdGVzdCB0aGF0IHRoZSBJS0Ugc29ja2V0IGNhbiBzZW5kIGRhdGEgb3V0LgorICAgICAgICAgICAgd3JhcHBlZEVuY2FwU29ja2V0LnNlbmRUbyhkYXRhV2l0aEVzcEhlYWRlciwgbG9jYWxBZGRyLCByZW1vdGVTb2NrZXQuZ2V0UG9ydCgpKTsKKyAgICAgICAgICAgIGluID0gcmVtb3RlU29ja2V0LnJlY2VpdmUoKTsKKyAgICAgICAgICAgIGFzc2VydEFycmF5RXF1YWxzKCJFbmNhcHN1bGF0ZWQgZGF0YSBkaWQgbm90IG1hdGNoLiIsIGRhdGFXaXRoRXNwSGVhZGVyLCBpbik7CisKKyAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBleHBlY3RlZCBwYWNrZXQgc2l6ZXMuIEFsd2F5cyB1c2UgSVB2NCBoZWFkZXIsIHNpbmNlIG91ciBrZXJuZWxzIG9ubHkKKyAgICAgICAgICAgIC8vIGd1YXJhbnRlZSBzdXBwb3J0IG9mIFVEUCBlbmNhcCBvbiBJUHY0LgorICAgICAgICAgICAgaW50IGV4cGVjdGVkTnVtUGt0cyA9IDI7CisgICAgICAgICAgICBpbnQgZXhwZWN0ZWRQYWNrZXRTaXplID0KKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWROdW1Qa3RzICogKGRhdGFXaXRoRXNwSGVhZGVyLmxlbmd0aCArIFVEUF9IRFJMRU4gKyBJUDRfSERSTEVOKTsKKworICAgICAgICAgICAgU3RhdHNDaGVja2VyLndhaXRGb3JOdW1QYWNrZXRzKGV4cGVjdGVkTnVtUGt0cyk7CisgICAgICAgICAgICBTdGF0c0NoZWNrZXIuYXNzZXJ0VWlkU3RhdHNEZWx0YSgKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRQYWNrZXRTaXplLAorICAgICAgICAgICAgICAgICAgICBleHBlY3RlZE51bVBrdHMsCisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkUGFja2V0U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRQYWNrZXRTaXplLAorICAgICAgICAgICAgICAgICAgICBleHBlY3RlZE51bVBrdHMpOworICAgICAgICAgICAgU3RhdHNDaGVja2VyLmFzc2VydElmYWNlU3RhdHNEZWx0YSgKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRQYWNrZXRTaXplLCBleHBlY3RlZE51bVBrdHMsIGV4cGVjdGVkUGFja2V0U2l6ZSwgZXhwZWN0ZWROdW1Qa3RzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJa2VPdmVyVWRwRW5jYXBTb2NrZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gSVB2NiBub3Qgc3VwcG9ydGVkIGZvciBVRFAtZW5jYXAtRVNQCisgICAgICAgIEluZXRBZGRyZXNzIGxvY2FsID0gSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKElQVjRfTE9PUEJBQ0spOworICAgICAgICB0cnkgKElwU2VjTWFuYWdlci5VZHBFbmNhcHN1bGF0aW9uU29ja2V0IGVuY2FwU29ja2V0ID0gbUlTTS5vcGVuVWRwRW5jYXBzdWxhdGlvblNvY2tldCgpKSB7CisgICAgICAgICAgICBOYXRpdmVVZHBTb2NrZXQgd3JhcHBlZEVuY2FwU29ja2V0ID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IE5hdGl2ZVVkcFNvY2tldChlbmNhcFNvY2tldC5nZXRGaWxlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgICAgIGNoZWNrSWtlUGFja2V0KHdyYXBwZWRFbmNhcFNvY2tldCwgbG9jYWwpOworCisgICAgICAgICAgICAvLyBOb3cgdHJ5IHdpdGggYSB0cmFuc2Zvcm0gYXBwbGllZCB0byBhIHNvY2tldCB1c2luZyB0aGlzIEVuY2FwIHNvY2tldAorICAgICAgICAgICAgSXBTZWNBbGdvcml0aG0gY3J5cHQgPSBuZXcgSXBTZWNBbGdvcml0aG0oSXBTZWNBbGdvcml0aG0uQ1JZUFRfQUVTX0NCQywgQ1JZUFRfS0VZKTsKKyAgICAgICAgICAgIElwU2VjQWxnb3JpdGhtIGF1dGggPSBuZXcgSXBTZWNBbGdvcml0aG0oSXBTZWNBbGdvcml0aG0uQVVUSF9ITUFDX01ENSwgZ2V0S2V5KDEyOCksIDk2KTsKKworICAgICAgICAgICAgdHJ5IChJcFNlY01hbmFnZXIuU2VjdXJpdHlQYXJhbWV0ZXJJbmRleCBzcGkgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JU00uYWxsb2NhdGVTZWN1cml0eVBhcmFtZXRlckluZGV4KGxvY2FsKTsKKyAgICAgICAgICAgICAgICAgICAgSXBTZWNUcmFuc2Zvcm0gdHJhbnNmb3JtID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSXBTZWNUcmFuc2Zvcm0uQnVpbGRlcihtQ29udGV4dCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRFbmNyeXB0aW9uKGNyeXB0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEF1dGhlbnRpY2F0aW9uKGF1dGgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0SXB2NEVuY2Fwc3VsYXRpb24oZW5jYXBTb2NrZXQsIGVuY2FwU29ja2V0LmdldFBvcnQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZFRyYW5zcG9ydE1vZGVUcmFuc2Zvcm0obG9jYWwsIHNwaSk7CisgICAgICAgICAgICAgICAgICAgIEphdmFVZHBTb2NrZXQgbG9jYWxTb2NrZXQgPSBuZXcgSmF2YVVkcFNvY2tldChsb2NhbCkpIHsKKyAgICAgICAgICAgICAgICBhcHBseVRyYW5zZm9ybUJpZGlyZWN0aW9uYWxseShtSVNNLCB0cmFuc2Zvcm0sIGxvY2FsU29ja2V0KTsKKworICAgICAgICAgICAgICAgIGNoZWNrSWtlUGFja2V0KHdyYXBwZWRFbmNhcFNvY2tldCwgbG9jYWwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gVE9ETzogQ2hlY2sgSUtFIG92ZXIgRVNQIHNvY2tldHMgKElQdjQsIElQdjYpIC0gZG9lcyB0aGlzIG5lZWQgU09DS19SQVc/CisKKyAgICAvKiBUT0RPOiBSZS1lbmFibGUgdGhlc2Ugd2hlbiBwb2xpY3kgbWF0Y2hlciB3b3JrcyBmb3IgcmVmbGVjdGVkIHBhY2tldHMKKyAgICAgKgorICAgICAqIFRoZSBpc3N1ZSBoZXJlIGlzIHRoYXQgQSBzZW5kcyB0byBCLCBhbmQgZXZlcnl0aGluZyBpcyBuZXc7IHRoZXJlZm9yZSBQUkVST1VUSU5HIGNvdW50cworICAgICAqIGNvcnJlY3RseS4gQnV0IGl0IGFwcGVhcnMgdGhhdCB0aGUgc2VjdXJpdHkgcGF0aCBpcyBub3QgY2xlYXJlZCBhZnRlcndhcmRzLCB0aHVzIHdoZW4gQQorICAgICAqIHNlbmRzIGFuIEFDSyBiYWNrIHRvIEIsIHRoZSBwb2xpY3kgbWF0Y2hlciBmbGFncyBpdCBhcyBhICJJUFNlYyIgcGFja2V0LiBTZWUgYi83MDYzNTQxNworICAgICAqLworCisgICAgLy8gcHVibGljIHZvaWQgdGVzdEludGVyZmFjZUNvdW50ZXJzVGNwNCgpIHRocm93cyBFeGNlcHRpb24geworICAgIC8vICAgICBJcFNlY0FsZ29yaXRobSBjcnlwdCA9IG5ldyBJcFNlY0FsZ29yaXRobShJcFNlY0FsZ29yaXRobS5DUllQVF9BRVNfQ0JDLCBDUllQVF9LRVkpOworICAgIC8vICAgICBJcFNlY0FsZ29yaXRobSBhdXRoID0gbmV3IElwU2VjQWxnb3JpdGhtKAorICAgIC8vICAgICAgICAgICAgIElwU2VjQWxnb3JpdGhtLkFVVEhfSE1BQ19NRDUsIGdldEtleSgxMjgpLCA5Nik7CisgICAgLy8gICAgIGNoZWNrVHJhbnNmb3JtKElQUFJPVE9fVENQLCBJUFY0X0xPT1BCQUNLLCBjcnlwdCwgYXV0aCwgZmFsc2UsIDEwMDApOworICAgIC8vIH0KKworICAgIC8vIHB1YmxpYyB2b2lkIHRlc3RJbnRlcmZhY2VDb3VudGVyc1RjcDYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvLyAgICAgSXBTZWNBbGdvcml0aG0gY3J5cHQgPSBuZXcgSXBTZWNBbGdvcml0aG0oSXBTZWNBbGdvcml0aG0uQ1JZUFRfQUVTX0NCQywgQ1JZUFRfS0VZKTsKKyAgICAvLyAgICAgSXBTZWNBbGdvcml0aG0gYXV0aCA9IG5ldyBJcFNlY0FsZ29yaXRobSgKKyAgICAvLyAgICAgICAgICAgICBJcFNlY0FsZ29yaXRobS5BVVRIX0hNQUNfTUQ1LCBnZXRLZXkoMTI4KSwgOTYpOworICAgIC8vICAgICBjaGVja1RyYW5zZm9ybShJUFBST1RPX1RDUCwgSVBWNl9MT09QQkFDSywgY3J5cHQsIGF1dGgsIGZhbHNlLCAxMDAwKTsKKyAgICAvLyB9CisKKyAgICAvLyBwdWJsaWMgdm9pZCB0ZXN0SW50ZXJmYWNlQ291bnRlcnNUY3A0VWRwRW5jYXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvLyAgICAgSXBTZWNBbGdvcml0aG0gY3J5cHQgPSBuZXcgSXBTZWNBbGdvcml0aG0oSXBTZWNBbGdvcml0aG0uQ1JZUFRfQUVTX0NCQywgQ1JZUFRfS0VZKTsKKyAgICAvLyAgICAgSXBTZWNBbGdvcml0aG0gYXV0aCA9CisgICAgLy8gICAgICAgICAgICAgbmV3IElwU2VjQWxnb3JpdGhtKElwU2VjQWxnb3JpdGhtLkFVVEhfSE1BQ19NRDUsIGdldEtleSgxMjgpLCA5Nik7CisgICAgLy8gICAgIGNoZWNrVHJhbnNmb3JtKElQUFJPVE9fVENQLCBJUFY0X0xPT1BCQUNLLCBjcnlwdCwgYXV0aCwgdHJ1ZSwgMTAwMCk7CisgICAgLy8gfQorCisgICAgcHVibGljIHZvaWQgdGVzdEludGVyZmFjZUNvdW50ZXJzVWRwNCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJcFNlY0FsZ29yaXRobSBjcnlwdCA9IG5ldyBJcFNlY0FsZ29yaXRobShJcFNlY0FsZ29yaXRobS5DUllQVF9BRVNfQ0JDLCBDUllQVF9LRVkpOworICAgICAgICBJcFNlY0FsZ29yaXRobSBhdXRoID0gbmV3IElwU2VjQWxnb3JpdGhtKElwU2VjQWxnb3JpdGhtLkFVVEhfSE1BQ19NRDUsIGdldEtleSgxMjgpLCA5Nik7CisgICAgICAgIGNoZWNrVHJhbnNmb3JtKElQUFJPVE9fVURQLCBJUFY0X0xPT1BCQUNLLCBjcnlwdCwgYXV0aCwgbnVsbCwgZmFsc2UsIDEwMDAsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW50ZXJmYWNlQ291bnRlcnNVZHA2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIElwU2VjQWxnb3JpdGhtIGNyeXB0ID0gbmV3IElwU2VjQWxnb3JpdGhtKElwU2VjQWxnb3JpdGhtLkNSWVBUX0FFU19DQkMsIENSWVBUX0tFWSk7CisgICAgICAgIElwU2VjQWxnb3JpdGhtIGF1dGggPSBuZXcgSXBTZWNBbGdvcml0aG0oSXBTZWNBbGdvcml0aG0uQVVUSF9ITUFDX01ENSwgZ2V0S2V5KDEyOCksIDk2KTsKKyAgICAgICAgY2hlY2tUcmFuc2Zvcm0oSVBQUk9UT19VRFAsIElQVjZfTE9PUEJBQ0ssIGNyeXB0LCBhdXRoLCBudWxsLCBmYWxzZSwgMTAwMCwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnRlcmZhY2VDb3VudGVyc1VkcDRVZHBFbmNhcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJcFNlY0FsZ29yaXRobSBjcnlwdCA9IG5ldyBJcFNlY0FsZ29yaXRobShJcFNlY0FsZ29yaXRobS5DUllQVF9BRVNfQ0JDLCBDUllQVF9LRVkpOworICAgICAgICBJcFNlY0FsZ29yaXRobSBhdXRoID0gbmV3IElwU2VjQWxnb3JpdGhtKElwU2VjQWxnb3JpdGhtLkFVVEhfSE1BQ19NRDUsIGdldEtleSgxMjgpLCA5Nik7CisgICAgICAgIGNoZWNrVHJhbnNmb3JtKElQUFJPVE9fVURQLCBJUFY0X0xPT1BCQUNLLCBjcnlwdCwgYXV0aCwgbnVsbCwgdHJ1ZSwgMTAwMCwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBZXNDYmNIbWFjTWQ1VGNwNCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJcFNlY0FsZ29yaXRobSBjcnlwdCA9IG5ldyBJcFNlY0FsZ29yaXRobShJcFNlY0FsZ29yaXRobS5DUllQVF9BRVNfQ0JDLCBDUllQVF9LRVkpOworICAgICAgICBJcFNlY0FsZ29yaXRobSBhdXRoID0gbmV3IElwU2VjQWxnb3JpdGhtKElwU2VjQWxnb3JpdGhtLkFVVEhfSE1BQ19NRDUsIGdldEtleSgxMjgpLCA5Nik7CisgICAgICAgIGNoZWNrVHJhbnNmb3JtKElQUFJPVE9fVENQLCBJUFY0X0xPT1BCQUNLLCBjcnlwdCwgYXV0aCwgbnVsbCwgZmFsc2UsIDEsIGZhbHNlKTsKKyAgICAgICAgY2hlY2tUcmFuc2Zvcm0oSVBQUk9UT19UQ1AsIElQVjRfTE9PUEJBQ0ssIGNyeXB0LCBhdXRoLCBudWxsLCBmYWxzZSwgMSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFlc0NiY0htYWNNZDVUY3A2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIElwU2VjQWxnb3JpdGhtIGNyeXB0ID0gbmV3IElwU2VjQWxnb3JpdGhtKElwU2VjQWxnb3JpdGhtLkNSWVBUX0FFU19DQkMsIENSWVBUX0tFWSk7CisgICAgICAgIElwU2VjQWxnb3JpdGhtIGF1dGggPSBuZXcgSXBTZWNBbGdvcml0aG0oSXBTZWNBbGdvcml0aG0uQVVUSF9ITUFDX01ENSwgZ2V0S2V5KDEyOCksIDk2KTsKKyAgICAgICAgY2hlY2tUcmFuc2Zvcm0oSVBQUk9UT19UQ1AsIElQVjZfTE9PUEJBQ0ssIGNyeXB0LCBhdXRoLCBudWxsLCBmYWxzZSwgMSwgZmFsc2UpOworICAgICAgICBjaGVja1RyYW5zZm9ybShJUFBST1RPX1RDUCwgSVBWNl9MT09QQkFDSywgY3J5cHQsIGF1dGgsIG51bGwsIGZhbHNlLCAxLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWVzQ2JjSG1hY01kNVVkcDQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSXBTZWNBbGdvcml0aG0gY3J5cHQgPSBuZXcgSXBTZWNBbGdvcml0aG0oSXBTZWNBbGdvcml0aG0uQ1JZUFRfQUVTX0NCQywgQ1JZUFRfS0VZKTsKKyAgICAgICAgSXBTZWNBbGdvcml0aG0gYXV0aCA9IG5ldyBJcFNlY0FsZ29yaXRobShJcFNlY0FsZ29yaXRobS5BVVRIX0hNQUNfTUQ1LCBnZXRLZXkoMTI4KSwgOTYpOworICAgICAgICBjaGVja1RyYW5zZm9ybShJUFBST1RPX1VEUCwgSVBWNF9MT09QQkFDSywgY3J5cHQsIGF1dGgsIG51bGwsIGZhbHNlLCAxLCBmYWxzZSk7CisgICAgICAgIGNoZWNrVHJhbnNmb3JtKElQUFJPVE9fVURQLCBJUFY0X0xPT1BCQUNLLCBjcnlwdCwgYXV0aCwgbnVsbCwgZmFsc2UsIDEsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBZXNDYmNIbWFjTWQ1VWRwNigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJcFNlY0FsZ29yaXRobSBjcnlwdCA9IG5ldyBJcFNlY0FsZ29yaXRobShJcFNlY0FsZ29yaXRobS5DUllQVF9BRVNfQ0JDLCBDUllQVF9LRVkpOworICAgICAgICBJcFNlY0FsZ29yaXRobSBhdXRoID0gbmV3IElwU2VjQWxnb3JpdGhtKElwU2VjQWxnb3JpdGhtLkFVVEhfSE1BQ19NRDUsIGdldEtleSgxMjgpLCA5Nik7CisgICAgICAgIGNoZWNrVHJhbnNmb3JtKElQUFJPVE9fVURQLCBJUFY2X0xPT1BCQUNLLCBjcnlwdCwgYXV0aCwgbnVsbCwgZmFsc2UsIDEsIGZhbHNlKTsKKyAgICAgICAgY2hlY2tUcmFuc2Zvcm0oSVBQUk9UT19VRFAsIElQVjZfTE9PUEJBQ0ssIGNyeXB0LCBhdXRoLCBudWxsLCBmYWxzZSwgMSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFlc0NiY0htYWNTaGExVGNwNCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJcFNlY0FsZ29yaXRobSBjcnlwdCA9IG5ldyBJcFNlY0FsZ29yaXRobShJcFNlY0FsZ29yaXRobS5DUllQVF9BRVNfQ0JDLCBDUllQVF9LRVkpOworICAgICAgICBJcFNlY0FsZ29yaXRobSBhdXRoID0gbmV3IElwU2VjQWxnb3JpdGhtKElwU2VjQWxnb3JpdGhtLkFVVEhfSE1BQ19TSEExLCBnZXRLZXkoMTYwKSwgOTYpOworICAgICAgICBjaGVja1RyYW5zZm9ybShJUFBST1RPX1RDUCwgSVBWNF9MT09QQkFDSywgY3J5cHQsIGF1dGgsIG51bGwsIGZhbHNlLCAxLCBmYWxzZSk7CisgICAgICAgIGNoZWNrVHJhbnNmb3JtKElQUFJPVE9fVENQLCBJUFY0X0xPT1BCQUNLLCBjcnlwdCwgYXV0aCwgbnVsbCwgZmFsc2UsIDEsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBZXNDYmNIbWFjU2hhMVRjcDYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSXBTZWNBbGdvcml0aG0gY3J5cHQgPSBuZXcgSXBTZWNBbGdvcml0aG0oSXBTZWNBbGdvcml0aG0uQ1JZUFRfQUVTX0NCQywgQ1JZUFRfS0VZKTsKKyAgICAgICAgSXBTZWNBbGdvcml0aG0gYXV0aCA9IG5ldyBJcFNlY0FsZ29yaXRobShJcFNlY0FsZ29yaXRobS5BVVRIX0hNQUNfU0hBMSwgZ2V0S2V5KDE2MCksIDk2KTsKKyAgICAgICAgY2hlY2tUcmFuc2Zvcm0oSVBQUk9UT19UQ1AsIElQVjZfTE9PUEJBQ0ssIGNyeXB0LCBhdXRoLCBudWxsLCBmYWxzZSwgMSwgZmFsc2UpOworICAgICAgICBjaGVja1RyYW5zZm9ybShJUFBST1RPX1RDUCwgSVBWNl9MT09QQkFDSywgY3J5cHQsIGF1dGgsIG51bGwsIGZhbHNlLCAxLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWVzQ2JjSG1hY1NoYTFVZHA0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIElwU2VjQWxnb3JpdGhtIGNyeXB0ID0gbmV3IElwU2VjQWxnb3JpdGhtKElwU2VjQWxnb3JpdGhtLkNSWVBUX0FFU19DQkMsIENSWVBUX0tFWSk7CisgICAgICAgIElwU2VjQWxnb3JpdGhtIGF1dGggPSBuZXcgSXBTZWNBbGdvcml0aG0oSXBTZWNBbGdvcml0aG0uQVVUSF9ITUFDX1NIQTEsIGdldEtleSgxNjApLCA5Nik7CisgICAgICAgIGNoZWNrVHJhbnNmb3JtKElQUFJPVE9fVURQLCBJUFY0X0xPT1BCQUNLLCBjcnlwdCwgYXV0aCwgbnVsbCwgZmFsc2UsIDEsIGZhbHNlKTsKKyAgICAgICAgY2hlY2tUcmFuc2Zvcm0oSVBQUk9UT19VRFAsIElQVjRfTE9PUEJBQ0ssIGNyeXB0LCBhdXRoLCBudWxsLCBmYWxzZSwgMSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFlc0NiY0htYWNTaGExVWRwNigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJcFNlY0FsZ29yaXRobSBjcnlwdCA9IG5ldyBJcFNlY0FsZ29yaXRobShJcFNlY0FsZ29yaXRobS5DUllQVF9BRVNfQ0JDLCBDUllQVF9LRVkpOworICAgICAgICBJcFNlY0FsZ29yaXRobSBhdXRoID0gbmV3IElwU2VjQWxnb3JpdGhtKElwU2VjQWxnb3JpdGhtLkFVVEhfSE1BQ19TSEExLCBnZXRLZXkoMTYwKSwgOTYpOworICAgICAgICBjaGVja1RyYW5zZm9ybShJUFBST1RPX1VEUCwgSVBWNl9MT09QQkFDSywgY3J5cHQsIGF1dGgsIG51bGwsIGZhbHNlLCAxLCBmYWxzZSk7CisgICAgICAgIGNoZWNrVHJhbnNmb3JtKElQUFJPVE9fVURQLCBJUFY2X0xPT1BCQUNLLCBjcnlwdCwgYXV0aCwgbnVsbCwgZmFsc2UsIDEsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBZXNDYmNIbWFjU2hhMjU2VGNwNCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJcFNlY0FsZ29yaXRobSBjcnlwdCA9IG5ldyBJcFNlY0FsZ29yaXRobShJcFNlY0FsZ29yaXRobS5DUllQVF9BRVNfQ0JDLCBDUllQVF9LRVkpOworICAgICAgICBJcFNlY0FsZ29yaXRobSBhdXRoID0gbmV3IElwU2VjQWxnb3JpdGhtKElwU2VjQWxnb3JpdGhtLkFVVEhfSE1BQ19TSEEyNTYsIGdldEtleSgyNTYpLCAxMjgpOworICAgICAgICBjaGVja1RyYW5zZm9ybShJUFBST1RPX1RDUCwgSVBWNF9MT09QQkFDSywgY3J5cHQsIGF1dGgsIG51bGwsIGZhbHNlLCAxLCBmYWxzZSk7CisgICAgICAgIGNoZWNrVHJhbnNmb3JtKElQUFJPVE9fVENQLCBJUFY0X0xPT1BCQUNLLCBjcnlwdCwgYXV0aCwgbnVsbCwgZmFsc2UsIDEsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBZXNDYmNIbWFjU2hhMjU2VGNwNigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJcFNlY0FsZ29yaXRobSBjcnlwdCA9IG5ldyBJcFNlY0FsZ29yaXRobShJcFNlY0FsZ29yaXRobS5DUllQVF9BRVNfQ0JDLCBDUllQVF9LRVkpOworICAgICAgICBJcFNlY0FsZ29yaXRobSBhdXRoID0gbmV3IElwU2VjQWxnb3JpdGhtKElwU2VjQWxnb3JpdGhtLkFVVEhfSE1BQ19TSEEyNTYsIGdldEtleSgyNTYpLCAxMjgpOworICAgICAgICBjaGVja1RyYW5zZm9ybShJUFBST1RPX1RDUCwgSVBWNl9MT09QQkFDSywgY3J5cHQsIGF1dGgsIG51bGwsIGZhbHNlLCAxLCBmYWxzZSk7CisgICAgICAgIGNoZWNrVHJhbnNmb3JtKElQUFJPVE9fVENQLCBJUFY2X0xPT1BCQUNLLCBjcnlwdCwgYXV0aCwgbnVsbCwgZmFsc2UsIDEsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBZXNDYmNIbWFjU2hhMjU2VWRwNCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJcFNlY0FsZ29yaXRobSBjcnlwdCA9IG5ldyBJcFNlY0FsZ29yaXRobShJcFNlY0FsZ29yaXRobS5DUllQVF9BRVNfQ0JDLCBDUllQVF9LRVkpOworICAgICAgICBJcFNlY0FsZ29yaXRobSBhdXRoID0gbmV3IElwU2VjQWxnb3JpdGhtKElwU2VjQWxnb3JpdGhtLkFVVEhfSE1BQ19TSEEyNTYsIGdldEtleSgyNTYpLCAxMjgpOworICAgICAgICBjaGVja1RyYW5zZm9ybShJUFBST1RPX1VEUCwgSVBWNF9MT09QQkFDSywgY3J5cHQsIGF1dGgsIG51bGwsIGZhbHNlLCAxLCBmYWxzZSk7CisgICAgICAgIGNoZWNrVHJhbnNmb3JtKElQUFJPVE9fVURQLCBJUFY0X0xPT1BCQUNLLCBjcnlwdCwgYXV0aCwgbnVsbCwgZmFsc2UsIDEsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBZXNDYmNIbWFjU2hhMjU2VWRwNigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJcFNlY0FsZ29yaXRobSBjcnlwdCA9IG5ldyBJcFNlY0FsZ29yaXRobShJcFNlY0FsZ29yaXRobS5DUllQVF9BRVNfQ0JDLCBDUllQVF9LRVkpOworICAgICAgICBJcFNlY0FsZ29yaXRobSBhdXRoID0gbmV3IElwU2VjQWxnb3JpdGhtKElwU2VjQWxnb3JpdGhtLkFVVEhfSE1BQ19TSEEyNTYsIGdldEtleSgyNTYpLCAxMjgpOworICAgICAgICBjaGVja1RyYW5zZm9ybShJUFBST1RPX1VEUCwgSVBWNl9MT09QQkFDSywgY3J5cHQsIGF1dGgsIG51bGwsIGZhbHNlLCAxLCBmYWxzZSk7CisgICAgICAgIGNoZWNrVHJhbnNmb3JtKElQUFJPVE9fVURQLCBJUFY2X0xPT1BCQUNLLCBjcnlwdCwgYXV0aCwgbnVsbCwgZmFsc2UsIDEsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBZXNDYmNIbWFjU2hhMzg0VGNwNCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJcFNlY0FsZ29yaXRobSBjcnlwdCA9IG5ldyBJcFNlY0FsZ29yaXRobShJcFNlY0FsZ29yaXRobS5DUllQVF9BRVNfQ0JDLCBDUllQVF9LRVkpOworICAgICAgICBJcFNlY0FsZ29yaXRobSBhdXRoID0gbmV3IElwU2VjQWxnb3JpdGhtKElwU2VjQWxnb3JpdGhtLkFVVEhfSE1BQ19TSEEzODQsIGdldEtleSgzODQpLCAxOTIpOworICAgICAgICBjaGVja1RyYW5zZm9ybShJUFBST1RPX1RDUCwgSVBWNF9MT09QQkFDSywgY3J5cHQsIGF1dGgsIG51bGwsIGZhbHNlLCAxLCBmYWxzZSk7CisgICAgICAgIGNoZWNrVHJhbnNmb3JtKElQUFJPVE9fVENQLCBJUFY0X0xPT1BCQUNLLCBjcnlwdCwgYXV0aCwgbnVsbCwgZmFsc2UsIDEsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBZXNDYmNIbWFjU2hhMzg0VGNwNigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJcFNlY0FsZ29yaXRobSBjcnlwdCA9IG5ldyBJcFNlY0FsZ29yaXRobShJcFNlY0FsZ29yaXRobS5DUllQVF9BRVNfQ0JDLCBDUllQVF9LRVkpOworICAgICAgICBJcFNlY0FsZ29yaXRobSBhdXRoID0gbmV3IElwU2VjQWxnb3JpdGhtKElwU2VjQWxnb3JpdGhtLkFVVEhfSE1BQ19TSEEzODQsIGdldEtleSgzODQpLCAxOTIpOworICAgICAgICBjaGVja1RyYW5zZm9ybShJUFBST1RPX1RDUCwgSVBWNl9MT09QQkFDSywgY3J5cHQsIGF1dGgsIG51bGwsIGZhbHNlLCAxLCBmYWxzZSk7CisgICAgICAgIGNoZWNrVHJhbnNmb3JtKElQUFJPVE9fVENQLCBJUFY2X0xPT1BCQUNLLCBjcnlwdCwgYXV0aCwgbnVsbCwgZmFsc2UsIDEsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBZXNDYmNIbWFjU2hhMzg0VWRwNCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJcFNlY0FsZ29yaXRobSBjcnlwdCA9IG5ldyBJcFNlY0FsZ29yaXRobShJcFNlY0FsZ29yaXRobS5DUllQVF9BRVNfQ0JDLCBDUllQVF9LRVkpOworICAgICAgICBJcFNlY0FsZ29yaXRobSBhdXRoID0gbmV3IElwU2VjQWxnb3JpdGhtKElwU2VjQWxnb3JpdGhtLkFVVEhfSE1BQ19TSEEzODQsIGdldEtleSgzODQpLCAxOTIpOworICAgICAgICBjaGVja1RyYW5zZm9ybShJUFBST1RPX1VEUCwgSVBWNF9MT09QQkFDSywgY3J5cHQsIGF1dGgsIG51bGwsIGZhbHNlLCAxLCBmYWxzZSk7CisgICAgICAgIGNoZWNrVHJhbnNmb3JtKElQUFJPVE9fVURQLCBJUFY0X0xPT1BCQUNLLCBjcnlwdCwgYXV0aCwgbnVsbCwgZmFsc2UsIDEsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBZXNDYmNIbWFjU2hhMzg0VWRwNigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJcFNlY0FsZ29yaXRobSBjcnlwdCA9IG5ldyBJcFNlY0FsZ29yaXRobShJcFNlY0FsZ29yaXRobS5DUllQVF9BRVNfQ0JDLCBDUllQVF9LRVkpOworICAgICAgICBJcFNlY0FsZ29yaXRobSBhdXRoID0gbmV3IElwU2VjQWxnb3JpdGhtKElwU2VjQWxnb3JpdGhtLkFVVEhfSE1BQ19TSEEzODQsIGdldEtleSgzODQpLCAxOTIpOworICAgICAgICBjaGVja1RyYW5zZm9ybShJUFBST1RPX1VEUCwgSVBWNl9MT09QQkFDSywgY3J5cHQsIGF1dGgsIG51bGwsIGZhbHNlLCAxLCBmYWxzZSk7CisgICAgICAgIGNoZWNrVHJhbnNmb3JtKElQUFJPVE9fVURQLCBJUFY2X0xPT1BCQUNLLCBjcnlwdCwgYXV0aCwgbnVsbCwgZmFsc2UsIDEsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBZXNDYmNIbWFjU2hhNTEyVGNwNCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJcFNlY0FsZ29yaXRobSBjcnlwdCA9IG5ldyBJcFNlY0FsZ29yaXRobShJcFNlY0FsZ29yaXRobS5DUllQVF9BRVNfQ0JDLCBDUllQVF9LRVkpOworICAgICAgICBJcFNlY0FsZ29yaXRobSBhdXRoID0gbmV3IElwU2VjQWxnb3JpdGhtKElwU2VjQWxnb3JpdGhtLkFVVEhfSE1BQ19TSEE1MTIsIGdldEtleSg1MTIpLCAyNTYpOworICAgICAgICBjaGVja1RyYW5zZm9ybShJUFBST1RPX1RDUCwgSVBWNF9MT09QQkFDSywgY3J5cHQsIGF1dGgsIG51bGwsIGZhbHNlLCAxLCBmYWxzZSk7CisgICAgICAgIGNoZWNrVHJhbnNmb3JtKElQUFJPVE9fVENQLCBJUFY0X0xPT1BCQUNLLCBjcnlwdCwgYXV0aCwgbnVsbCwgZmFsc2UsIDEsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBZXNDYmNIbWFjU2hhNTEyVGNwNigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJcFNlY0FsZ29yaXRobSBjcnlwdCA9IG5ldyBJcFNlY0FsZ29yaXRobShJcFNlY0FsZ29yaXRobS5DUllQVF9BRVNfQ0JDLCBDUllQVF9LRVkpOworICAgICAgICBJcFNlY0FsZ29yaXRobSBhdXRoID0gbmV3IElwU2VjQWxnb3JpdGhtKElwU2VjQWxnb3JpdGhtLkFVVEhfSE1BQ19TSEE1MTIsIGdldEtleSg1MTIpLCAyNTYpOworICAgICAgICBjaGVja1RyYW5zZm9ybShJUFBST1RPX1RDUCwgSVBWNl9MT09QQkFDSywgY3J5cHQsIGF1dGgsIG51bGwsIGZhbHNlLCAxLCBmYWxzZSk7CisgICAgICAgIGNoZWNrVHJhbnNmb3JtKElQUFJPVE9fVENQLCBJUFY2X0xPT1BCQUNLLCBjcnlwdCwgYXV0aCwgbnVsbCwgZmFsc2UsIDEsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBZXNDYmNIbWFjU2hhNTEyVWRwNCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJcFNlY0FsZ29yaXRobSBjcnlwdCA9IG5ldyBJcFNlY0FsZ29yaXRobShJcFNlY0FsZ29yaXRobS5DUllQVF9BRVNfQ0JDLCBDUllQVF9LRVkpOworICAgICAgICBJcFNlY0FsZ29yaXRobSBhdXRoID0gbmV3IElwU2VjQWxnb3JpdGhtKElwU2VjQWxnb3JpdGhtLkFVVEhfSE1BQ19TSEE1MTIsIGdldEtleSg1MTIpLCAyNTYpOworICAgICAgICBjaGVja1RyYW5zZm9ybShJUFBST1RPX1VEUCwgSVBWNF9MT09QQkFDSywgY3J5cHQsIGF1dGgsIG51bGwsIGZhbHNlLCAxLCBmYWxzZSk7CisgICAgICAgIGNoZWNrVHJhbnNmb3JtKElQUFJPVE9fVURQLCBJUFY0X0xPT1BCQUNLLCBjcnlwdCwgYXV0aCwgbnVsbCwgZmFsc2UsIDEsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBZXNDYmNIbWFjU2hhNTEyVWRwNigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJcFNlY0FsZ29yaXRobSBjcnlwdCA9IG5ldyBJcFNlY0FsZ29yaXRobShJcFNlY0FsZ29yaXRobS5DUllQVF9BRVNfQ0JDLCBDUllQVF9LRVkpOworICAgICAgICBJcFNlY0FsZ29yaXRobSBhdXRoID0gbmV3IElwU2VjQWxnb3JpdGhtKElwU2VjQWxnb3JpdGhtLkFVVEhfSE1BQ19TSEE1MTIsIGdldEtleSg1MTIpLCAyNTYpOworICAgICAgICBjaGVja1RyYW5zZm9ybShJUFBST1RPX1VEUCwgSVBWNl9MT09QQkFDSywgY3J5cHQsIGF1dGgsIG51bGwsIGZhbHNlLCAxLCBmYWxzZSk7CisgICAgICAgIGNoZWNrVHJhbnNmb3JtKElQUFJPVE9fVURQLCBJUFY2X0xPT1BCQUNLLCBjcnlwdCwgYXV0aCwgbnVsbCwgZmFsc2UsIDEsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBZXNHY202NFRjcDQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSXBTZWNBbGdvcml0aG0gYXV0aENyeXB0ID0KKyAgICAgICAgICAgICAgICBuZXcgSXBTZWNBbGdvcml0aG0oSXBTZWNBbGdvcml0aG0uQVVUSF9DUllQVF9BRVNfR0NNLCBBRUFEX0tFWSwgNjQpOworICAgICAgICBjaGVja1RyYW5zZm9ybShJUFBST1RPX1RDUCwgSVBWNF9MT09QQkFDSywgbnVsbCwgbnVsbCwgYXV0aENyeXB0LCBmYWxzZSwgMSwgZmFsc2UpOworICAgICAgICBjaGVja1RyYW5zZm9ybShJUFBST1RPX1RDUCwgSVBWNF9MT09QQkFDSywgbnVsbCwgbnVsbCwgYXV0aENyeXB0LCBmYWxzZSwgMSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFlc0djbTY0VGNwNigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJcFNlY0FsZ29yaXRobSBhdXRoQ3J5cHQgPQorICAgICAgICAgICAgICAgIG5ldyBJcFNlY0FsZ29yaXRobShJcFNlY0FsZ29yaXRobS5BVVRIX0NSWVBUX0FFU19HQ00sIEFFQURfS0VZLCA2NCk7CisgICAgICAgIGNoZWNrVHJhbnNmb3JtKElQUFJPVE9fVENQLCBJUFY2X0xPT1BCQUNLLCBudWxsLCBudWxsLCBhdXRoQ3J5cHQsIGZhbHNlLCAxLCBmYWxzZSk7CisgICAgICAgIGNoZWNrVHJhbnNmb3JtKElQUFJPVE9fVENQLCBJUFY2X0xPT1BCQUNLLCBudWxsLCBudWxsLCBhdXRoQ3J5cHQsIGZhbHNlLCAxLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWVzR2NtNjRVZHA0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIElwU2VjQWxnb3JpdGhtIGF1dGhDcnlwdCA9CisgICAgICAgICAgICAgICAgbmV3IElwU2VjQWxnb3JpdGhtKElwU2VjQWxnb3JpdGhtLkFVVEhfQ1JZUFRfQUVTX0dDTSwgQUVBRF9LRVksIDY0KTsKKyAgICAgICAgY2hlY2tUcmFuc2Zvcm0oSVBQUk9UT19VRFAsIElQVjRfTE9PUEJBQ0ssIG51bGwsIG51bGwsIGF1dGhDcnlwdCwgZmFsc2UsIDEsIGZhbHNlKTsKKyAgICAgICAgY2hlY2tUcmFuc2Zvcm0oSVBQUk9UT19VRFAsIElQVjRfTE9PUEJBQ0ssIG51bGwsIG51bGwsIGF1dGhDcnlwdCwgZmFsc2UsIDEsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBZXNHY202NFVkcDYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSXBTZWNBbGdvcml0aG0gYXV0aENyeXB0ID0KKyAgICAgICAgICAgICAgICBuZXcgSXBTZWNBbGdvcml0aG0oSXBTZWNBbGdvcml0aG0uQVVUSF9DUllQVF9BRVNfR0NNLCBBRUFEX0tFWSwgNjQpOworICAgICAgICBjaGVja1RyYW5zZm9ybShJUFBST1RPX1VEUCwgSVBWNl9MT09QQkFDSywgbnVsbCwgbnVsbCwgYXV0aENyeXB0LCBmYWxzZSwgMSwgZmFsc2UpOworICAgICAgICBjaGVja1RyYW5zZm9ybShJUFBST1RPX1VEUCwgSVBWNl9MT09QQkFDSywgbnVsbCwgbnVsbCwgYXV0aENyeXB0LCBmYWxzZSwgMSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFlc0djbTk2VGNwNCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJcFNlY0FsZ29yaXRobSBhdXRoQ3J5cHQgPQorICAgICAgICAgICAgICAgIG5ldyBJcFNlY0FsZ29yaXRobShJcFNlY0FsZ29yaXRobS5BVVRIX0NSWVBUX0FFU19HQ00sIEFFQURfS0VZLCA5Nik7CisgICAgICAgIGNoZWNrVHJhbnNmb3JtKElQUFJPVE9fVENQLCBJUFY0X0xPT1BCQUNLLCBudWxsLCBudWxsLCBhdXRoQ3J5cHQsIGZhbHNlLCAxLCBmYWxzZSk7CisgICAgICAgIGNoZWNrVHJhbnNmb3JtKElQUFJPVE9fVENQLCBJUFY0X0xPT1BCQUNLLCBudWxsLCBudWxsLCBhdXRoQ3J5cHQsIGZhbHNlLCAxLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWVzR2NtOTZUY3A2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIElwU2VjQWxnb3JpdGhtIGF1dGhDcnlwdCA9CisgICAgICAgICAgICAgICAgbmV3IElwU2VjQWxnb3JpdGhtKElwU2VjQWxnb3JpdGhtLkFVVEhfQ1JZUFRfQUVTX0dDTSwgQUVBRF9LRVksIDk2KTsKKyAgICAgICAgY2hlY2tUcmFuc2Zvcm0oSVBQUk9UT19UQ1AsIElQVjZfTE9PUEJBQ0ssIG51bGwsIG51bGwsIGF1dGhDcnlwdCwgZmFsc2UsIDEsIGZhbHNlKTsKKyAgICAgICAgY2hlY2tUcmFuc2Zvcm0oSVBQUk9UT19UQ1AsIElQVjZfTE9PUEJBQ0ssIG51bGwsIG51bGwsIGF1dGhDcnlwdCwgZmFsc2UsIDEsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBZXNHY205NlVkcDQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSXBTZWNBbGdvcml0aG0gYXV0aENyeXB0ID0KKyAgICAgICAgICAgICAgICBuZXcgSXBTZWNBbGdvcml0aG0oSXBTZWNBbGdvcml0aG0uQVVUSF9DUllQVF9BRVNfR0NNLCBBRUFEX0tFWSwgOTYpOworICAgICAgICBjaGVja1RyYW5zZm9ybShJUFBST1RPX1VEUCwgSVBWNF9MT09QQkFDSywgbnVsbCwgbnVsbCwgYXV0aENyeXB0LCBmYWxzZSwgMSwgZmFsc2UpOworICAgICAgICBjaGVja1RyYW5zZm9ybShJUFBST1RPX1VEUCwgSVBWNF9MT09QQkFDSywgbnVsbCwgbnVsbCwgYXV0aENyeXB0LCBmYWxzZSwgMSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFlc0djbTk2VWRwNigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJcFNlY0FsZ29yaXRobSBhdXRoQ3J5cHQgPQorICAgICAgICAgICAgICAgIG5ldyBJcFNlY0FsZ29yaXRobShJcFNlY0FsZ29yaXRobS5BVVRIX0NSWVBUX0FFU19HQ00sIEFFQURfS0VZLCA5Nik7CisgICAgICAgIGNoZWNrVHJhbnNmb3JtKElQUFJPVE9fVURQLCBJUFY2X0xPT1BCQUNLLCBudWxsLCBudWxsLCBhdXRoQ3J5cHQsIGZhbHNlLCAxLCBmYWxzZSk7CisgICAgICAgIGNoZWNrVHJhbnNmb3JtKElQUFJPVE9fVURQLCBJUFY2X0xPT1BCQUNLLCBudWxsLCBudWxsLCBhdXRoQ3J5cHQsIGZhbHNlLCAxLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWVzR2NtMTI4VGNwNCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJcFNlY0FsZ29yaXRobSBhdXRoQ3J5cHQgPQorICAgICAgICAgICAgICAgIG5ldyBJcFNlY0FsZ29yaXRobShJcFNlY0FsZ29yaXRobS5BVVRIX0NSWVBUX0FFU19HQ00sIEFFQURfS0VZLCAxMjgpOworICAgICAgICBjaGVja1RyYW5zZm9ybShJUFBST1RPX1RDUCwgSVBWNF9MT09QQkFDSywgbnVsbCwgbnVsbCwgYXV0aENyeXB0LCBmYWxzZSwgMSwgZmFsc2UpOworICAgICAgICBjaGVja1RyYW5zZm9ybShJUFBST1RPX1RDUCwgSVBWNF9MT09QQkFDSywgbnVsbCwgbnVsbCwgYXV0aENyeXB0LCBmYWxzZSwgMSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFlc0djbTEyOFRjcDYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSXBTZWNBbGdvcml0aG0gYXV0aENyeXB0ID0KKyAgICAgICAgICAgICAgICBuZXcgSXBTZWNBbGdvcml0aG0oSXBTZWNBbGdvcml0aG0uQVVUSF9DUllQVF9BRVNfR0NNLCBBRUFEX0tFWSwgMTI4KTsKKyAgICAgICAgY2hlY2tUcmFuc2Zvcm0oSVBQUk9UT19UQ1AsIElQVjZfTE9PUEJBQ0ssIG51bGwsIG51bGwsIGF1dGhDcnlwdCwgZmFsc2UsIDEsIGZhbHNlKTsKKyAgICAgICAgY2hlY2tUcmFuc2Zvcm0oSVBQUk9UT19UQ1AsIElQVjZfTE9PUEJBQ0ssIG51bGwsIG51bGwsIGF1dGhDcnlwdCwgZmFsc2UsIDEsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBZXNHY20xMjhVZHA0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIElwU2VjQWxnb3JpdGhtIGF1dGhDcnlwdCA9CisgICAgICAgICAgICAgICAgbmV3IElwU2VjQWxnb3JpdGhtKElwU2VjQWxnb3JpdGhtLkFVVEhfQ1JZUFRfQUVTX0dDTSwgQUVBRF9LRVksIDEyOCk7CisgICAgICAgIGNoZWNrVHJhbnNmb3JtKElQUFJPVE9fVURQLCBJUFY0X0xPT1BCQUNLLCBudWxsLCBudWxsLCBhdXRoQ3J5cHQsIGZhbHNlLCAxLCBmYWxzZSk7CisgICAgICAgIGNoZWNrVHJhbnNmb3JtKElQUFJPVE9fVURQLCBJUFY0X0xPT1BCQUNLLCBudWxsLCBudWxsLCBhdXRoQ3J5cHQsIGZhbHNlLCAxLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWVzR2NtMTI4VWRwNigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJcFNlY0FsZ29yaXRobSBhdXRoQ3J5cHQgPQorICAgICAgICAgICAgICAgIG5ldyBJcFNlY0FsZ29yaXRobShJcFNlY0FsZ29yaXRobS5BVVRIX0NSWVBUX0FFU19HQ00sIEFFQURfS0VZLCAxMjgpOworICAgICAgICBjaGVja1RyYW5zZm9ybShJUFBST1RPX1VEUCwgSVBWNl9MT09QQkFDSywgbnVsbCwgbnVsbCwgYXV0aENyeXB0LCBmYWxzZSwgMSwgZmFsc2UpOworICAgICAgICBjaGVja1RyYW5zZm9ybShJUFBST1RPX1VEUCwgSVBWNl9MT09QQkFDSywgbnVsbCwgbnVsbCwgYXV0aENyeXB0LCBmYWxzZSwgMSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFlc0NiY0htYWNNZDVUY3A0VWRwRW5jYXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSXBTZWNBbGdvcml0aG0gY3J5cHQgPSBuZXcgSXBTZWNBbGdvcml0aG0oSXBTZWNBbGdvcml0aG0uQ1JZUFRfQUVTX0NCQywgQ1JZUFRfS0VZKTsKKyAgICAgICAgSXBTZWNBbGdvcml0aG0gYXV0aCA9IG5ldyBJcFNlY0FsZ29yaXRobShJcFNlY0FsZ29yaXRobS5BVVRIX0hNQUNfTUQ1LCBnZXRLZXkoMTI4KSwgOTYpOworICAgICAgICBjaGVja1RyYW5zZm9ybShJUFBST1RPX1RDUCwgSVBWNF9MT09QQkFDSywgY3J5cHQsIGF1dGgsIG51bGwsIHRydWUsIDEsIGZhbHNlKTsKKyAgICAgICAgY2hlY2tUcmFuc2Zvcm0oSVBQUk9UT19UQ1AsIElQVjRfTE9PUEJBQ0ssIGNyeXB0LCBhdXRoLCBudWxsLCB0cnVlLCAxLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWVzQ2JjSG1hY01kNVVkcDRVZHBFbmNhcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJcFNlY0FsZ29yaXRobSBjcnlwdCA9IG5ldyBJcFNlY0FsZ29yaXRobShJcFNlY0FsZ29yaXRobS5DUllQVF9BRVNfQ0JDLCBDUllQVF9LRVkpOworICAgICAgICBJcFNlY0FsZ29yaXRobSBhdXRoID0gbmV3IElwU2VjQWxnb3JpdGhtKElwU2VjQWxnb3JpdGhtLkFVVEhfSE1BQ19NRDUsIGdldEtleSgxMjgpLCA5Nik7CisgICAgICAgIGNoZWNrVHJhbnNmb3JtKElQUFJPVE9fVURQLCBJUFY0X0xPT1BCQUNLLCBjcnlwdCwgYXV0aCwgbnVsbCwgdHJ1ZSwgMSwgZmFsc2UpOworICAgICAgICBjaGVja1RyYW5zZm9ybShJUFBST1RPX1VEUCwgSVBWNF9MT09QQkFDSywgY3J5cHQsIGF1dGgsIG51bGwsIHRydWUsIDEsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBZXNDYmNIbWFjU2hhMVRjcDRVZHBFbmNhcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJcFNlY0FsZ29yaXRobSBjcnlwdCA9IG5ldyBJcFNlY0FsZ29yaXRobShJcFNlY0FsZ29yaXRobS5DUllQVF9BRVNfQ0JDLCBDUllQVF9LRVkpOworICAgICAgICBJcFNlY0FsZ29yaXRobSBhdXRoID0gbmV3IElwU2VjQWxnb3JpdGhtKElwU2VjQWxnb3JpdGhtLkFVVEhfSE1BQ19TSEExLCBnZXRLZXkoMTYwKSwgOTYpOworICAgICAgICBjaGVja1RyYW5zZm9ybShJUFBST1RPX1RDUCwgSVBWNF9MT09QQkFDSywgY3J5cHQsIGF1dGgsIG51bGwsIHRydWUsIDEsIGZhbHNlKTsKKyAgICAgICAgY2hlY2tUcmFuc2Zvcm0oSVBQUk9UT19UQ1AsIElQVjRfTE9PUEJBQ0ssIGNyeXB0LCBhdXRoLCBudWxsLCB0cnVlLCAxLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWVzQ2JjSG1hY1NoYTFVZHA0VWRwRW5jYXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSXBTZWNBbGdvcml0aG0gY3J5cHQgPSBuZXcgSXBTZWNBbGdvcml0aG0oSXBTZWNBbGdvcml0aG0uQ1JZUFRfQUVTX0NCQywgQ1JZUFRfS0VZKTsKKyAgICAgICAgSXBTZWNBbGdvcml0aG0gYXV0aCA9IG5ldyBJcFNlY0FsZ29yaXRobShJcFNlY0FsZ29yaXRobS5BVVRIX0hNQUNfU0hBMSwgZ2V0S2V5KDE2MCksIDk2KTsKKyAgICAgICAgY2hlY2tUcmFuc2Zvcm0oSVBQUk9UT19VRFAsIElQVjRfTE9PUEJBQ0ssIGNyeXB0LCBhdXRoLCBudWxsLCB0cnVlLCAxLCBmYWxzZSk7CisgICAgICAgIGNoZWNrVHJhbnNmb3JtKElQUFJPVE9fVURQLCBJUFY0X0xPT1BCQUNLLCBjcnlwdCwgYXV0aCwgbnVsbCwgdHJ1ZSwgMSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFlc0NiY0htYWNTaGEyNTZUY3A0VWRwRW5jYXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSXBTZWNBbGdvcml0aG0gY3J5cHQgPSBuZXcgSXBTZWNBbGdvcml0aG0oSXBTZWNBbGdvcml0aG0uQ1JZUFRfQUVTX0NCQywgQ1JZUFRfS0VZKTsKKyAgICAgICAgSXBTZWNBbGdvcml0aG0gYXV0aCA9IG5ldyBJcFNlY0FsZ29yaXRobShJcFNlY0FsZ29yaXRobS5BVVRIX0hNQUNfU0hBMjU2LCBnZXRLZXkoMjU2KSwgMTI4KTsKKyAgICAgICAgY2hlY2tUcmFuc2Zvcm0oSVBQUk9UT19UQ1AsIElQVjRfTE9PUEJBQ0ssIGNyeXB0LCBhdXRoLCBudWxsLCB0cnVlLCAxLCBmYWxzZSk7CisgICAgICAgIGNoZWNrVHJhbnNmb3JtKElQUFJPVE9fVENQLCBJUFY0X0xPT1BCQUNLLCBjcnlwdCwgYXV0aCwgbnVsbCwgdHJ1ZSwgMSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFlc0NiY0htYWNTaGEyNTZVZHA0VWRwRW5jYXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSXBTZWNBbGdvcml0aG0gY3J5cHQgPSBuZXcgSXBTZWNBbGdvcml0aG0oSXBTZWNBbGdvcml0aG0uQ1JZUFRfQUVTX0NCQywgQ1JZUFRfS0VZKTsKKyAgICAgICAgSXBTZWNBbGdvcml0aG0gYXV0aCA9IG5ldyBJcFNlY0FsZ29yaXRobShJcFNlY0FsZ29yaXRobS5BVVRIX0hNQUNfU0hBMjU2LCBnZXRLZXkoMjU2KSwgMTI4KTsKKyAgICAgICAgY2hlY2tUcmFuc2Zvcm0oSVBQUk9UT19VRFAsIElQVjRfTE9PUEJBQ0ssIGNyeXB0LCBhdXRoLCBudWxsLCB0cnVlLCAxLCBmYWxzZSk7CisgICAgICAgIGNoZWNrVHJhbnNmb3JtKElQUFJPVE9fVURQLCBJUFY0X0xPT1BCQUNLLCBjcnlwdCwgYXV0aCwgbnVsbCwgdHJ1ZSwgMSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFlc0NiY0htYWNTaGEzODRUY3A0VWRwRW5jYXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSXBTZWNBbGdvcml0aG0gY3J5cHQgPSBuZXcgSXBTZWNBbGdvcml0aG0oSXBTZWNBbGdvcml0aG0uQ1JZUFRfQUVTX0NCQywgQ1JZUFRfS0VZKTsKKyAgICAgICAgSXBTZWNBbGdvcml0aG0gYXV0aCA9IG5ldyBJcFNlY0FsZ29yaXRobShJcFNlY0FsZ29yaXRobS5BVVRIX0hNQUNfU0hBMzg0LCBnZXRLZXkoMzg0KSwgMTkyKTsKKyAgICAgICAgY2hlY2tUcmFuc2Zvcm0oSVBQUk9UT19UQ1AsIElQVjRfTE9PUEJBQ0ssIGNyeXB0LCBhdXRoLCBudWxsLCB0cnVlLCAxLCBmYWxzZSk7CisgICAgICAgIGNoZWNrVHJhbnNmb3JtKElQUFJPVE9fVENQLCBJUFY0X0xPT1BCQUNLLCBjcnlwdCwgYXV0aCwgbnVsbCwgdHJ1ZSwgMSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFlc0NiY0htYWNTaGEzODRVZHA0VWRwRW5jYXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSXBTZWNBbGdvcml0aG0gY3J5cHQgPSBuZXcgSXBTZWNBbGdvcml0aG0oSXBTZWNBbGdvcml0aG0uQ1JZUFRfQUVTX0NCQywgQ1JZUFRfS0VZKTsKKyAgICAgICAgSXBTZWNBbGdvcml0aG0gYXV0aCA9IG5ldyBJcFNlY0FsZ29yaXRobShJcFNlY0FsZ29yaXRobS5BVVRIX0hNQUNfU0hBMzg0LCBnZXRLZXkoMzg0KSwgMTkyKTsKKyAgICAgICAgY2hlY2tUcmFuc2Zvcm0oSVBQUk9UT19VRFAsIElQVjRfTE9PUEJBQ0ssIGNyeXB0LCBhdXRoLCBudWxsLCB0cnVlLCAxLCBmYWxzZSk7CisgICAgICAgIGNoZWNrVHJhbnNmb3JtKElQUFJPVE9fVURQLCBJUFY0X0xPT1BCQUNLLCBjcnlwdCwgYXV0aCwgbnVsbCwgdHJ1ZSwgMSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFlc0NiY0htYWNTaGE1MTJUY3A0VWRwRW5jYXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSXBTZWNBbGdvcml0aG0gY3J5cHQgPSBuZXcgSXBTZWNBbGdvcml0aG0oSXBTZWNBbGdvcml0aG0uQ1JZUFRfQUVTX0NCQywgQ1JZUFRfS0VZKTsKKyAgICAgICAgSXBTZWNBbGdvcml0aG0gYXV0aCA9IG5ldyBJcFNlY0FsZ29yaXRobShJcFNlY0FsZ29yaXRobS5BVVRIX0hNQUNfU0hBNTEyLCBnZXRLZXkoNTEyKSwgMjU2KTsKKyAgICAgICAgY2hlY2tUcmFuc2Zvcm0oSVBQUk9UT19UQ1AsIElQVjRfTE9PUEJBQ0ssIGNyeXB0LCBhdXRoLCBudWxsLCB0cnVlLCAxLCBmYWxzZSk7CisgICAgICAgIGNoZWNrVHJhbnNmb3JtKElQUFJPVE9fVENQLCBJUFY0X0xPT1BCQUNLLCBjcnlwdCwgYXV0aCwgbnVsbCwgdHJ1ZSwgMSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFlc0NiY0htYWNTaGE1MTJVZHA0VWRwRW5jYXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSXBTZWNBbGdvcml0aG0gY3J5cHQgPSBuZXcgSXBTZWNBbGdvcml0aG0oSXBTZWNBbGdvcml0aG0uQ1JZUFRfQUVTX0NCQywgQ1JZUFRfS0VZKTsKKyAgICAgICAgSXBTZWNBbGdvcml0aG0gYXV0aCA9IG5ldyBJcFNlY0FsZ29yaXRobShJcFNlY0FsZ29yaXRobS5BVVRIX0hNQUNfU0hBNTEyLCBnZXRLZXkoNTEyKSwgMjU2KTsKKyAgICAgICAgY2hlY2tUcmFuc2Zvcm0oSVBQUk9UT19VRFAsIElQVjRfTE9PUEJBQ0ssIGNyeXB0LCBhdXRoLCBudWxsLCB0cnVlLCAxLCBmYWxzZSk7CisgICAgICAgIGNoZWNrVHJhbnNmb3JtKElQUFJPVE9fVURQLCBJUFY0X0xPT1BCQUNLLCBjcnlwdCwgYXV0aCwgbnVsbCwgdHJ1ZSwgMSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFlc0djbTY0VGNwNFVkcEVuY2FwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIElwU2VjQWxnb3JpdGhtIGF1dGhDcnlwdCA9CisgICAgICAgICAgICAgICAgbmV3IElwU2VjQWxnb3JpdGhtKElwU2VjQWxnb3JpdGhtLkFVVEhfQ1JZUFRfQUVTX0dDTSwgQUVBRF9LRVksIDY0KTsKKyAgICAgICAgY2hlY2tUcmFuc2Zvcm0oSVBQUk9UT19UQ1AsIElQVjRfTE9PUEJBQ0ssIG51bGwsIG51bGwsIGF1dGhDcnlwdCwgdHJ1ZSwgMSwgZmFsc2UpOworICAgICAgICBjaGVja1RyYW5zZm9ybShJUFBST1RPX1RDUCwgSVBWNF9MT09QQkFDSywgbnVsbCwgbnVsbCwgYXV0aENyeXB0LCB0cnVlLCAxLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWVzR2NtNjRVZHA0VWRwRW5jYXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSXBTZWNBbGdvcml0aG0gYXV0aENyeXB0ID0KKyAgICAgICAgICAgICAgICBuZXcgSXBTZWNBbGdvcml0aG0oSXBTZWNBbGdvcml0aG0uQVVUSF9DUllQVF9BRVNfR0NNLCBBRUFEX0tFWSwgNjQpOworICAgICAgICBjaGVja1RyYW5zZm9ybShJUFBST1RPX1VEUCwgSVBWNF9MT09QQkFDSywgbnVsbCwgbnVsbCwgYXV0aENyeXB0LCB0cnVlLCAxLCBmYWxzZSk7CisgICAgICAgIGNoZWNrVHJhbnNmb3JtKElQUFJPVE9fVURQLCBJUFY0X0xPT1BCQUNLLCBudWxsLCBudWxsLCBhdXRoQ3J5cHQsIHRydWUsIDEsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBZXNHY205NlRjcDRVZHBFbmNhcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJcFNlY0FsZ29yaXRobSBhdXRoQ3J5cHQgPQorICAgICAgICAgICAgICAgIG5ldyBJcFNlY0FsZ29yaXRobShJcFNlY0FsZ29yaXRobS5BVVRIX0NSWVBUX0FFU19HQ00sIEFFQURfS0VZLCA5Nik7CisgICAgICAgIGNoZWNrVHJhbnNmb3JtKElQUFJPVE9fVENQLCBJUFY0X0xPT1BCQUNLLCBudWxsLCBudWxsLCBhdXRoQ3J5cHQsIHRydWUsIDEsIGZhbHNlKTsKKyAgICAgICAgY2hlY2tUcmFuc2Zvcm0oSVBQUk9UT19UQ1AsIElQVjRfTE9PUEJBQ0ssIG51bGwsIG51bGwsIGF1dGhDcnlwdCwgdHJ1ZSwgMSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFlc0djbTk2VWRwNFVkcEVuY2FwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIElwU2VjQWxnb3JpdGhtIGF1dGhDcnlwdCA9CisgICAgICAgICAgICAgICAgbmV3IElwU2VjQWxnb3JpdGhtKElwU2VjQWxnb3JpdGhtLkFVVEhfQ1JZUFRfQUVTX0dDTSwgQUVBRF9LRVksIDk2KTsKKyAgICAgICAgY2hlY2tUcmFuc2Zvcm0oSVBQUk9UT19VRFAsIElQVjRfTE9PUEJBQ0ssIG51bGwsIG51bGwsIGF1dGhDcnlwdCwgdHJ1ZSwgMSwgZmFsc2UpOworICAgICAgICBjaGVja1RyYW5zZm9ybShJUFBST1RPX1VEUCwgSVBWNF9MT09QQkFDSywgbnVsbCwgbnVsbCwgYXV0aENyeXB0LCB0cnVlLCAxLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWVzR2NtMTI4VGNwNFVkcEVuY2FwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIElwU2VjQWxnb3JpdGhtIGF1dGhDcnlwdCA9CisgICAgICAgICAgICAgICAgbmV3IElwU2VjQWxnb3JpdGhtKElwU2VjQWxnb3JpdGhtLkFVVEhfQ1JZUFRfQUVTX0dDTSwgQUVBRF9LRVksIDEyOCk7CisgICAgICAgIGNoZWNrVHJhbnNmb3JtKElQUFJPVE9fVENQLCBJUFY0X0xPT1BCQUNLLCBudWxsLCBudWxsLCBhdXRoQ3J5cHQsIHRydWUsIDEsIGZhbHNlKTsKKyAgICAgICAgY2hlY2tUcmFuc2Zvcm0oSVBQUk9UT19UQ1AsIElQVjRfTE9PUEJBQ0ssIG51bGwsIG51bGwsIGF1dGhDcnlwdCwgdHJ1ZSwgMSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFlc0djbTEyOFVkcDRVZHBFbmNhcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJcFNlY0FsZ29yaXRobSBhdXRoQ3J5cHQgPQorICAgICAgICAgICAgICAgIG5ldyBJcFNlY0FsZ29yaXRobShJcFNlY0FsZ29yaXRobS5BVVRIX0NSWVBUX0FFU19HQ00sIEFFQURfS0VZLCAxMjgpOworICAgICAgICBjaGVja1RyYW5zZm9ybShJUFBST1RPX1VEUCwgSVBWNF9MT09QQkFDSywgbnVsbCwgbnVsbCwgYXV0aENyeXB0LCB0cnVlLCAxLCBmYWxzZSk7CisgICAgICAgIGNoZWNrVHJhbnNmb3JtKElQUFJPVE9fVURQLCBJUFY0X0xPT1BCQUNLLCBudWxsLCBudWxsLCBhdXRoQ3J5cHQsIHRydWUsIDEsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDcnlwdFVkcDQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSXBTZWNBbGdvcml0aG0gY3J5cHQgPSBuZXcgSXBTZWNBbGdvcml0aG0oSXBTZWNBbGdvcml0aG0uQ1JZUFRfQUVTX0NCQywgQ1JZUFRfS0VZKTsKKyAgICAgICAgY2hlY2tUcmFuc2Zvcm0oSVBQUk9UT19VRFAsIElQVjRfTE9PUEJBQ0ssIGNyeXB0LCBudWxsLCBudWxsLCBmYWxzZSwgMSwgZmFsc2UpOworICAgICAgICBjaGVja1RyYW5zZm9ybShJUFBST1RPX1VEUCwgSVBWNF9MT09QQkFDSywgY3J5cHQsIG51bGwsIG51bGwsIGZhbHNlLCAxLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0aFVkcDQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSXBTZWNBbGdvcml0aG0gYXV0aCA9IG5ldyBJcFNlY0FsZ29yaXRobShJcFNlY0FsZ29yaXRobS5BVVRIX0hNQUNfU0hBMjU2LCBnZXRLZXkoMjU2KSwgMTI4KTsKKyAgICAgICAgY2hlY2tUcmFuc2Zvcm0oSVBQUk9UT19VRFAsIElQVjRfTE9PUEJBQ0ssIG51bGwsIGF1dGgsIG51bGwsIGZhbHNlLCAxLCBmYWxzZSk7CisgICAgICAgIGNoZWNrVHJhbnNmb3JtKElQUFJPVE9fVURQLCBJUFY0X0xPT1BCQUNLLCBudWxsLCBhdXRoLCBudWxsLCBmYWxzZSwgMSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENyeXB0VWRwNigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJcFNlY0FsZ29yaXRobSBjcnlwdCA9IG5ldyBJcFNlY0FsZ29yaXRobShJcFNlY0FsZ29yaXRobS5DUllQVF9BRVNfQ0JDLCBDUllQVF9LRVkpOworICAgICAgICBjaGVja1RyYW5zZm9ybShJUFBST1RPX1VEUCwgSVBWNl9MT09QQkFDSywgY3J5cHQsIG51bGwsIG51bGwsIGZhbHNlLCAxLCBmYWxzZSk7CisgICAgICAgIGNoZWNrVHJhbnNmb3JtKElQUFJPVE9fVURQLCBJUFY2X0xPT1BCQUNLLCBjcnlwdCwgbnVsbCwgbnVsbCwgZmFsc2UsIDEsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRoVWRwNigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJcFNlY0FsZ29yaXRobSBhdXRoID0gbmV3IElwU2VjQWxnb3JpdGhtKElwU2VjQWxnb3JpdGhtLkFVVEhfSE1BQ19TSEEyNTYsIGdldEtleSgyNTYpLCAxMjgpOworICAgICAgICBjaGVja1RyYW5zZm9ybShJUFBST1RPX1VEUCwgSVBWNl9MT09QQkFDSywgbnVsbCwgYXV0aCwgbnVsbCwgZmFsc2UsIDEsIGZhbHNlKTsKKyAgICAgICAgY2hlY2tUcmFuc2Zvcm0oSVBQUk9UT19VRFAsIElQVjZfTE9PUEJBQ0ssIG51bGwsIGF1dGgsIG51bGwsIGZhbHNlLCAxLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3J5cHRUY3A0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIElwU2VjQWxnb3JpdGhtIGNyeXB0ID0gbmV3IElwU2VjQWxnb3JpdGhtKElwU2VjQWxnb3JpdGhtLkNSWVBUX0FFU19DQkMsIENSWVBUX0tFWSk7CisgICAgICAgIGNoZWNrVHJhbnNmb3JtKElQUFJPVE9fVENQLCBJUFY0X0xPT1BCQUNLLCBjcnlwdCwgbnVsbCwgbnVsbCwgZmFsc2UsIDEsIGZhbHNlKTsKKyAgICAgICAgY2hlY2tUcmFuc2Zvcm0oSVBQUk9UT19UQ1AsIElQVjRfTE9PUEJBQ0ssIGNyeXB0LCBudWxsLCBudWxsLCBmYWxzZSwgMSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEF1dGhUY3A0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIElwU2VjQWxnb3JpdGhtIGF1dGggPSBuZXcgSXBTZWNBbGdvcml0aG0oSXBTZWNBbGdvcml0aG0uQVVUSF9ITUFDX1NIQTI1NiwgZ2V0S2V5KDI1NiksIDEyOCk7CisgICAgICAgIGNoZWNrVHJhbnNmb3JtKElQUFJPVE9fVENQLCBJUFY0X0xPT1BCQUNLLCBudWxsLCBhdXRoLCBudWxsLCBmYWxzZSwgMSwgZmFsc2UpOworICAgICAgICBjaGVja1RyYW5zZm9ybShJUFBST1RPX1RDUCwgSVBWNF9MT09QQkFDSywgbnVsbCwgYXV0aCwgbnVsbCwgZmFsc2UsIDEsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDcnlwdFRjcDYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSXBTZWNBbGdvcml0aG0gY3J5cHQgPSBuZXcgSXBTZWNBbGdvcml0aG0oSXBTZWNBbGdvcml0aG0uQ1JZUFRfQUVTX0NCQywgQ1JZUFRfS0VZKTsKKyAgICAgICAgY2hlY2tUcmFuc2Zvcm0oSVBQUk9UT19UQ1AsIElQVjZfTE9PUEJBQ0ssIGNyeXB0LCBudWxsLCBudWxsLCBmYWxzZSwgMSwgZmFsc2UpOworICAgICAgICBjaGVja1RyYW5zZm9ybShJUFBST1RPX1RDUCwgSVBWNl9MT09QQkFDSywgY3J5cHQsIG51bGwsIG51bGwsIGZhbHNlLCAxLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0aFRjcDYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSXBTZWNBbGdvcml0aG0gYXV0aCA9IG5ldyBJcFNlY0FsZ29yaXRobShJcFNlY0FsZ29yaXRobS5BVVRIX0hNQUNfU0hBMjU2LCBnZXRLZXkoMjU2KSwgMTI4KTsKKyAgICAgICAgY2hlY2tUcmFuc2Zvcm0oSVBQUk9UT19UQ1AsIElQVjZfTE9PUEJBQ0ssIG51bGwsIGF1dGgsIG51bGwsIGZhbHNlLCAxLCBmYWxzZSk7CisgICAgICAgIGNoZWNrVHJhbnNmb3JtKElQUFJPVE9fVENQLCBJUFY2X0xPT1BCQUNLLCBudWxsLCBhdXRoLCBudWxsLCBmYWxzZSwgMSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENyeXB0VWRwNFVkcEVuY2FwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIElwU2VjQWxnb3JpdGhtIGNyeXB0ID0gbmV3IElwU2VjQWxnb3JpdGhtKElwU2VjQWxnb3JpdGhtLkNSWVBUX0FFU19DQkMsIENSWVBUX0tFWSk7CisgICAgICAgIGNoZWNrVHJhbnNmb3JtKElQUFJPVE9fVURQLCBJUFY0X0xPT1BCQUNLLCBjcnlwdCwgbnVsbCwgbnVsbCwgdHJ1ZSwgMSwgZmFsc2UpOworICAgICAgICBjaGVja1RyYW5zZm9ybShJUFBST1RPX1VEUCwgSVBWNF9MT09QQkFDSywgY3J5cHQsIG51bGwsIG51bGwsIHRydWUsIDEsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRoVWRwNFVkcEVuY2FwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIElwU2VjQWxnb3JpdGhtIGF1dGggPSBuZXcgSXBTZWNBbGdvcml0aG0oSXBTZWNBbGdvcml0aG0uQVVUSF9ITUFDX1NIQTI1NiwgZ2V0S2V5KDI1NiksIDEyOCk7CisgICAgICAgIGNoZWNrVHJhbnNmb3JtKElQUFJPVE9fVURQLCBJUFY0X0xPT1BCQUNLLCBudWxsLCBhdXRoLCBudWxsLCB0cnVlLCAxLCBmYWxzZSk7CisgICAgICAgIGNoZWNrVHJhbnNmb3JtKElQUFJPVE9fVURQLCBJUFY0X0xPT1BCQUNLLCBudWxsLCBhdXRoLCBudWxsLCB0cnVlLCAxLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3J5cHRUY3A0VWRwRW5jYXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSXBTZWNBbGdvcml0aG0gY3J5cHQgPSBuZXcgSXBTZWNBbGdvcml0aG0oSXBTZWNBbGdvcml0aG0uQ1JZUFRfQUVTX0NCQywgQ1JZUFRfS0VZKTsKKyAgICAgICAgY2hlY2tUcmFuc2Zvcm0oSVBQUk9UT19UQ1AsIElQVjRfTE9PUEJBQ0ssIGNyeXB0LCBudWxsLCBudWxsLCB0cnVlLCAxLCBmYWxzZSk7CisgICAgICAgIGNoZWNrVHJhbnNmb3JtKElQUFJPVE9fVENQLCBJUFY0X0xPT1BCQUNLLCBjcnlwdCwgbnVsbCwgbnVsbCwgdHJ1ZSwgMSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEF1dGhUY3A0VWRwRW5jYXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSXBTZWNBbGdvcml0aG0gYXV0aCA9IG5ldyBJcFNlY0FsZ29yaXRobShJcFNlY0FsZ29yaXRobS5BVVRIX0hNQUNfU0hBMjU2LCBnZXRLZXkoMjU2KSwgMTI4KTsKKyAgICAgICAgY2hlY2tUcmFuc2Zvcm0oSVBQUk9UT19UQ1AsIElQVjRfTE9PUEJBQ0ssIG51bGwsIGF1dGgsIG51bGwsIHRydWUsIDEsIGZhbHNlKTsKKyAgICAgICAgY2hlY2tUcmFuc2Zvcm0oSVBQUk9UT19UQ1AsIElQVjRfTE9PUEJBQ0ssIG51bGwsIGF1dGgsIG51bGwsIHRydWUsIDEsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RPcGVuVWRwRW5jYXBTb2NrZXRTcGVjaWZpY1BvcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSXBTZWNNYW5hZ2VyLlVkcEVuY2Fwc3VsYXRpb25Tb2NrZXQgZW5jYXBTb2NrZXQgPSBudWxsOworICAgICAgICBpbnQgcG9ydCA9IC0xOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9QT1JUX0JJTkRfQVRURU1QVFM7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBwb3J0ID0gZmluZFVudXNlZFBvcnQoKTsKKyAgICAgICAgICAgICAgICBlbmNhcFNvY2tldCA9IG1JU00ub3BlblVkcEVuY2Fwc3VsYXRpb25Tb2NrZXQocG9ydCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGNhdGNoIChFcnJub0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgaWYgKGUuZXJybm8gPT0gT3NDb25zdGFudHMuRUFERFJJTlVTRSkgeworICAgICAgICAgICAgICAgICAgICAvLyBTb21lb25lIGNsYWltZWQgdGhlIHBvcnQgc2luY2Ugd2UgY2FsbGVkIGZpbmRVbnVzZWRQb3J0LgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgaWYgKGVuY2FwU29ja2V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZW5jYXBTb2NrZXQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZW5jYXBTb2NrZXQgPT0gbnVsbCkgeworICAgICAgICAgICAgZmFpbCgiRmFpbGVkICIgKyBNQVhfUE9SVF9CSU5EX0FUVEVNUFRTICsgIiBhdHRlbXB0cyB0byBiaW5kIHRvIGEgcG9ydCIpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiUmV0dXJuZWQgaW52YWxpZCBwb3J0IiwgZW5jYXBTb2NrZXQuZ2V0UG9ydCgpID09IHBvcnQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RPcGVuVWRwRW5jYXBTb2NrZXRSYW5kb21Qb3J0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSAoSXBTZWNNYW5hZ2VyLlVkcEVuY2Fwc3VsYXRpb25Tb2NrZXQgZW5jYXBTb2NrZXQgPSBtSVNNLm9wZW5VZHBFbmNhcHN1bGF0aW9uU29ja2V0KCkpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlJldHVybmVkIGludmFsaWQgcG9ydCIsIGVuY2FwU29ja2V0LmdldFBvcnQoKSAhPSAwKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL25ldC9zcmMvYW5kcm9pZC9uZXQvY3RzL0lwU2VjU3lzY3RsVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvbmV0L3NyYy9hbmRyb2lkL25ldC9jdHMvSXBTZWNTeXNjdGxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM2MjI4MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL25ldC9zcmMvYW5kcm9pZC9uZXQvY3RzL0lwU2VjU3lzY3RsVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubmV0LmN0czsKKworaW1wb3J0IGFuZHJvaWQuc3lzdGVtLkVycm5vRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQuc3lzdGVtLk9zOworaW1wb3J0IGFuZHJvaWQuc3lzdGVtLk9zQ29uc3RhbnRzOworaW1wb3J0IGFuZHJvaWQuc3lzdGVtLlN0cnVjdFN0YXQ7CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogVGVzdHMgZm9yIG11bHRpbmV0d29yayBzeXNjdGwgZnVuY3Rpb25hbGl0eS4KKyAqLworcHVibGljIGNsYXNzIElwU2VjU3lzY3RsVGVzdCBleHRlbmRzIFN5c2N0bEJhc2VUZXN0IHsKKworICAgIC8vIFNQSSBleHBpcmF0aW9uIHN5c2N0bHMuIE11c3QgYmUgcHJlc2VudCBhbmQgc2V0IGdyZWF0ZXIgdGhhbiAxaC4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1BJX1RJTUVPVVRfU1lTQ1RMID0gIi9wcm9jL3N5cy9uZXQvY29yZS94ZnJtX2FjcV9leHBpcmVzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUlOX0FDUV9FWFBJUkVTID0gMzYwMDsKKworICAgIC8qKgorICAgICAqIENoZWNrcyB0aGF0IFNQSSBkZWZhdWx0IHRpbWVvdXRzIGFyZSBvdmVycmlkZGVuLCBhbmQgc2V0IHRvIGEgcmVhc29uYWJsZSBsZW5ndGggb2YgdGltZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9jRmlsZXMoKSB0aHJvd3MgRXJybm9FeGNlcHRpb24sIElPRXhjZXB0aW9uLCBOdW1iZXJGb3JtYXRFeGNlcHRpb24geworICAgICAgICBpbnQgdmFsdWUgPSBnZXRJbnRWYWx1ZShTUElfVElNRU9VVF9TWVNDVEwpOworICAgICAgICBhc3NlcnRBdExlYXN0KFNQSV9USU1FT1VUX1NZU0NUTCwgdmFsdWUsIE1JTl9BQ1FfRVhQSVJFUyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbmV0L3NyYy9hbmRyb2lkL25ldC9jdHMvTWFjQWRkcmVzc1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL25ldC9zcmMvYW5kcm9pZC9uZXQvY3RzL01hY0FkZHJlc3NUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYxZTc2MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL25ldC9zcmMvYW5kcm9pZC9uZXQvY3RzL01hY0FkZHJlc3NUZXN0LmphdmEKQEAgLTAsMCArMSwxNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubmV0LmN0czsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC5NYWNBZGRyZXNzLlRZUEVfQlJPQURDQVNUOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC5NYWNBZGRyZXNzLlRZUEVfTVVMVElDQVNUOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC5NYWNBZGRyZXNzLlRZUEVfVU5JQ0FTVDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKK2ltcG9ydCBhbmRyb2lkLm5ldC5NYWNBZGRyZXNzOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworQFNtYWxsVGVzdAorQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBNYWNBZGRyZXNzVGVzdCB7CisKKyAgICBzdGF0aWMgY2xhc3MgVGVzdENhc2UgeworICAgICAgICBmaW5hbCBTdHJpbmcgbWFjQWRkcmVzczsKKyAgICAgICAgZmluYWwgU3RyaW5nIG91aVN0cmluZzsKKyAgICAgICAgZmluYWwgaW50IGFkZHJlc3NUeXBlOworICAgICAgICBmaW5hbCBib29sZWFuIGlzTG9jYWxseUFzc2lnbmVkOworCisgICAgICAgIFRlc3RDYXNlKFN0cmluZyBtYWNBZGRyZXNzLCBTdHJpbmcgb3VpU3RyaW5nLCBpbnQgYWRkcmVzc1R5cGUsIGJvb2xlYW4gaXNMb2NhbGx5QXNzaWduZWQpIHsKKyAgICAgICAgICAgIHRoaXMubWFjQWRkcmVzcyA9IG1hY0FkZHJlc3M7CisgICAgICAgICAgICB0aGlzLm91aVN0cmluZyA9IG91aVN0cmluZzsKKyAgICAgICAgICAgIHRoaXMuYWRkcmVzc1R5cGUgPSBhZGRyZXNzVHlwZTsKKyAgICAgICAgICAgIHRoaXMuaXNMb2NhbGx5QXNzaWduZWQgPSBpc0xvY2FsbHlBc3NpZ25lZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIExPQ0FMTFlfQVNTSUdORUQgPSB0cnVlOworICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIEdMT0JBTExZX1VOSVFVRSA9IGZhbHNlOworCisgICAgc3RhdGljIFN0cmluZyB0eXBlVG9TdHJpbmcoaW50IGFkZHJlc3NUeXBlKSB7CisgICAgICAgIHN3aXRjaCAoYWRkcmVzc1R5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgVFlQRV9VTklDQVNUOgorICAgICAgICAgICAgICAgIHJldHVybiAiVFlQRV9VTklDQVNUIjsKKyAgICAgICAgICAgIGNhc2UgVFlQRV9CUk9BRENBU1Q6CisgICAgICAgICAgICAgICAgcmV0dXJuICJUWVBFX0JST0FEQ0FTVCI7CisgICAgICAgICAgICBjYXNlIFRZUEVfTVVMVElDQVNUOgorICAgICAgICAgICAgICAgIHJldHVybiAiVFlQRV9NVUxUSUNBU1QiOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIlVOS05PV04iOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIFN0cmluZyBsb2NhbEFzc2lnbmVkVG9TdHJpbmcoYm9vbGVhbiBpc0xvY2FsbHlBc3NpZ25lZCkgeworICAgICAgICByZXR1cm4gaXNMb2NhbGx5QXNzaWduZWQgPyAiTE9DQUxMWV9BU1NJR05FRCIgOiAiR0xPQkFMTFlfVU5JUVVFIjsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYWNBZGRyZXNzKCkgeworICAgICAgICBUZXN0Q2FzZVtdIHRlc3RzID0geworICAgICAgICAgICAgbmV3IFRlc3RDYXNlKCJmZjpmZjpmZjpmZjpmZjpmZiIsICJmZjpmZjpmZiIsIFRZUEVfQlJPQURDQVNULCBMT0NBTExZX0FTU0lHTkVEKSwKKyAgICAgICAgICAgIG5ldyBUZXN0Q2FzZSgiZDI6YzQ6MjI6NGQ6MzI6YTgiLCAiZDI6YzQ6MjIiLCBUWVBFX1VOSUNBU1QsIExPQ0FMTFlfQVNTSUdORUQpLAorICAgICAgICAgICAgbmV3IFRlc3RDYXNlKCIzMzozMzphYTpiYjpjYzpkZCIsICIzMzozMzphYSIsIFRZUEVfTVVMVElDQVNULCBMT0NBTExZX0FTU0lHTkVEKSwKKyAgICAgICAgICAgIG5ldyBUZXN0Q2FzZSgiMDY6MDA6MDA6MDA6MDA6MDAiLCAiMDY6MDA6MDAiLCBUWVBFX1VOSUNBU1QsIExPQ0FMTFlfQVNTSUdORUQpLAorICAgICAgICAgICAgbmV3IFRlc3RDYXNlKCIwNzowMDpkMzo1Njo4YTpjNCIsICIwNzowMDpkMyIsIFRZUEVfTVVMVElDQVNULCBMT0NBTExZX0FTU0lHTkVEKSwKKyAgICAgICAgICAgIG5ldyBUZXN0Q2FzZSgiMDA6MDE6NDQ6NTU6NjY6NzciLCAiMDA6MDE6NDQiLCBUWVBFX1VOSUNBU1QsIEdMT0JBTExZX1VOSVFVRSksCisgICAgICAgICAgICBuZXcgVGVzdENhc2UoIjA4OjAwOjIyOjMzOjQ0OjU1IiwgIjA4OjAwOjIyIiwgVFlQRV9VTklDQVNULCBHTE9CQUxMWV9VTklRVUUpLAorICAgICAgICB9OworCisgICAgICAgIGZvciAoVGVzdENhc2UgdGMgOiB0ZXN0cykgeworICAgICAgICAgICAgTWFjQWRkcmVzcyBtYWMgPSBNYWNBZGRyZXNzLmZyb21TdHJpbmcodGMubWFjQWRkcmVzcyk7CisKKyAgICAgICAgICAgIGlmICghdGMub3VpU3RyaW5nLmVxdWFscyhtYWMudG9PdWlTdHJpbmcoKSkpIHsKKyAgICAgICAgICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoImV4cGVjdGVkIE9VSSBzdHJpbmcgJXMsIGdvdCAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICB0Yy5vdWlTdHJpbmcsIG1hYy50b091aVN0cmluZygpKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0Yy5pc0xvY2FsbHlBc3NpZ25lZCAhPSBtYWMuaXNMb2NhbGx5QXNzaWduZWQoKSkgeworICAgICAgICAgICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiZXhwZWN0ZWQgJXMgdG8gYmUgJXMsIGdvdCAlcyIsIG1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsQXNzaWduZWRUb1N0cmluZyh0Yy5pc0xvY2FsbHlBc3NpZ25lZCksCisgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbEFzc2lnbmVkVG9TdHJpbmcobWFjLmlzTG9jYWxseUFzc2lnbmVkKCkpKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0Yy5hZGRyZXNzVHlwZSAhPSBtYWMuZ2V0QWRkcmVzc1R5cGUoKSkgeworICAgICAgICAgICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiZXhwZWN0ZWQgJXMgYWRkcmVzcyB0eXBlIHRvIGJlICVzLCBnb3QgJXMiLCBtYWMsCisgICAgICAgICAgICAgICAgICAgICAgICB0eXBlVG9TdHJpbmcodGMuYWRkcmVzc1R5cGUpLCB0eXBlVG9TdHJpbmcobWFjLmdldEFkZHJlc3NUeXBlKCkpKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghdGMubWFjQWRkcmVzcy5lcXVhbHMobWFjLnRvU3RyaW5nKCkpKSB7CisgICAgICAgICAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCJleHBlY3RlZCB0b1N0cmluZygpIHRvIHJldHVybiAlcywgZ290ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjLm1hY0FkZHJlc3MsIG1hYy50b1N0cmluZygpKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghbWFjLmVxdWFscyhNYWNBZGRyZXNzLmZyb21CeXRlcyhtYWMudG9CeXRlQXJyYXkoKSkpKSB7CisgICAgICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbWFjLnRvQnl0ZUFycmF5KCk7CisgICAgICAgICAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCJleHBlY3RlZCBtYWMgYWRkcmVzcyBmcm9tIGJ5dGVzICVzIHRvIGJlICVzLCBnb3QgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLnRvU3RyaW5nKGJ5dGVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1hY0FkZHJlc3MuZnJvbUJ5dGVzKGJ5dGVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hYykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JJbnB1dFZhbGlkYXRpb24oKSB7CisgICAgICAgIFN0cmluZ1tdIGludmFsaWRTdHJpbmdBZGRyZXNzZXMgPSB7CisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJhYmNkIiwKKyAgICAgICAgICAgICIxOjI6Mzo0OjUiLAorICAgICAgICAgICAgIjE6MjozOjQ6NTo2OjciLAorICAgICAgICAgICAgIjEwMDAwOjI6Mzo0OjU6NiIsCisgICAgICAgIH07CisKKyAgICAgICAgZm9yIChTdHJpbmcgcyA6IGludmFsaWRTdHJpbmdBZGRyZXNzZXMpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgTWFjQWRkcmVzcyBtYWMgPSBNYWNBZGRyZXNzLmZyb21TdHJpbmcocyk7CisgICAgICAgICAgICAgICAgZmFpbCgiTWFjQWRkcmVzcy5mcm9tU3RyaW5nKCIgKyBzICsgIikgc2hvdWxkIGhhdmUgZmFpbGVkLCBidXQgcmV0dXJuZWQgIiArIG1hYyk7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhjZXB0ZWQpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNYWNBZGRyZXNzIG1hYyA9IE1hY0FkZHJlc3MuZnJvbVN0cmluZyhudWxsKTsKKyAgICAgICAgICAgIGZhaWwoIk1hY0FkZHJlc3MuZnJvbVN0cmluZyhudWxsKSBzaG91bGQgaGF2ZSBmYWlsZWQsIGJ1dCByZXR1cm5lZCAiICsgbWFjKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXhjZXB0ZWQpIHsKKyAgICAgICAgfQorCisgICAgICAgIGJ5dGVbXVtdIGludmFsaWRCeXRlc0FkZHJlc3NlcyA9IHsKKyAgICAgICAgICAgIHt9LAorICAgICAgICAgICAgezEsMiwzLDQsNX0sCisgICAgICAgICAgICB7MSwyLDMsNCw1LDYsN30sCisgICAgICAgIH07CisKKyAgICAgICAgZm9yIChieXRlW10gYiA6IGludmFsaWRCeXRlc0FkZHJlc3NlcykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBNYWNBZGRyZXNzIG1hYyA9IE1hY0FkZHJlc3MuZnJvbUJ5dGVzKGIpOworICAgICAgICAgICAgICAgIGZhaWwoIk1hY0FkZHJlc3MuZnJvbUJ5dGVzKCIgKyBBcnJheXMudG9TdHJpbmcoYikKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIikgc2hvdWxkIGhhdmUgZmFpbGVkLCBidXQgcmV0dXJuZWQgIiArIG1hYyk7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhjZXB0ZWQpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNYWNBZGRyZXNzIG1hYyA9IE1hY0FkZHJlc3MuZnJvbUJ5dGVzKG51bGwpOworICAgICAgICAgICAgZmFpbCgiTWFjQWRkcmVzcy5mcm9tQnl0ZXMobnVsbCkgc2hvdWxkIGhhdmUgZmFpbGVkLCBidXQgcmV0dXJuZWQgIiArIG1hYyk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4Y2VwdGVkKSB7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9uZXQvc3JjL2FuZHJvaWQvbmV0L2N0cy9NdWx0aW5ldHdvcmtBcGlUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9uZXQvc3JjL2FuZHJvaWQvbmV0L2N0cy9NdWx0aW5ldHdvcmtBcGlUZXN0LmphdmEKaW5kZXggNTFlZTUwZS4uYjJjOWQ5YiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbmV0L3NyYy9hbmRyb2lkL25ldC9jdHMvTXVsdGluZXR3b3JrQXBpVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL25ldC9zcmMvYW5kcm9pZC9uZXQvY3RzL011bHRpbmV0d29ya0FwaVRlc3QuamF2YQpAQCAtMTUyLDQgKzE1MiwyNyBAQAogICAgICAgICAvLyB0byBxdWVyeSBvbiB0aGUgZGVmYXVsdCBuZXR3b3JrLgogICAgICAgICAvLyBhc3NlcnRFcXVhbHMoLU9zQ29uc3RhbnRzLkVOT05FVCwgcnVuR2V0YWRkcmluZm9DaGVjayhlTm9OZXRIYW5kbGUpKTsKICAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmV0d29ya0hhbmRsZSgpIHsKKyAgICAgICAgLy8gVGVzdCBOZXR3b3JrIC0+IE5ldHdvcmtIYW5kbGUgLT4gTmV0d29yayByZXN1bHRzIGluIHRoZSBzYW1lIE5ldHdvcmsuCisgICAgICAgIGZvciAoTmV0d29yayBuZXR3b3JrIDogZ2V0VGVzdGFibGVOZXR3b3JrcygpKSB7CisgICAgICAgICAgICBsb25nIG5ldHdvcmtIYW5kbGUgPSBuZXR3b3JrLmdldE5ldHdvcmtIYW5kbGUoKTsKKyAgICAgICAgICAgIE5ldHdvcmsgbmV3TmV0d29yayA9IE5ldHdvcmsuZnJvbU5ldHdvcmtIYW5kbGUobmV0d29ya0hhbmRsZSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobmV3TmV0d29yaywgbmV0d29yayk7CisgICAgICAgIH0KKworICAgICAgICAvLyBUZXN0IHRoYXQgb25seSBvYmZ1c2NhdGVkIGhhbmRsZXMgYXJlIGFsbG93ZWQuCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBOZXR3b3JrLmZyb21OZXR3b3JrSGFuZGxlKDEwMCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7fQorICAgICAgICB0cnkgeworICAgICAgICAgICAgTmV0d29yay5mcm9tTmV0d29ya0hhbmRsZSgtMSk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7fQorICAgICAgICB0cnkgeworICAgICAgICAgICAgTmV0d29yay5mcm9tTmV0d29ya0hhbmRsZSgwKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHt9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbmV0L3NyYy9hbmRyb2lkL25ldC9jdHMvTXVsdGluZXR3b3JrU3lzY3RsVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvbmV0L3NyYy9hbmRyb2lkL25ldC9jdHMvTXVsdGluZXR3b3JrU3lzY3RsVGVzdC5qYXZhCmluZGV4IGMwOTFhMTMuLjFkMGMxMTEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL25ldC9zcmMvYW5kcm9pZC9uZXQvY3RzL011bHRpbmV0d29ya1N5c2N0bFRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9uZXQvc3JjL2FuZHJvaWQvbmV0L2N0cy9NdWx0aW5ldHdvcmtTeXNjdGxUZXN0LmphdmEKQEAgLTI5LDcgKzI5LDcgQEAKIC8qKgogICogVGVzdHMgZm9yIG11bHRpbmV0d29yayBzeXNjdGwgZnVuY3Rpb25hbGl0eS4KICAqLwotcHVibGljIGNsYXNzIE11bHRpbmV0d29ya1N5c2N0bFRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworcHVibGljIGNsYXNzIE11bHRpbmV0d29ya1N5c2N0bFRlc3QgZXh0ZW5kcyBTeXNjdGxCYXNlVGVzdCB7CiAKICAgICAvLyBHbG9iYWwgc3lzY3Rscy4gTXVzdCBiZSBwcmVzZW50IGFuZCBzZXQgdG8gMS4KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBHTE9CQUxfU1lTQ1RMUyA9IHsKQEAgLTQyLDMwICs0Miw2IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElQVjZfU1lTQ1RMX0RJUiA9ICIvcHJvYy9zeXMvbmV0L2lwdjYvY29uZiI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVE9DT05GX1NZU0NUTCA9ICJhY2NlcHRfcmFfcnRfdGFibGUiOwogCi0gICAgLy8gRXhwZWN0ZWQgbW9kZSwgVUlELCBhbmQgR0lEIG9mIHN5c2N0bCBmaWxlcy4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1lTQ1RMX01PREUgPSAwMTAwNjQ0OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTWVNDVExfVUlEID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1lTQ1RMX0dJRCA9IDA7Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tTeXNjdGxQZXJtaXNzaW9ucyhTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBFcnJub0V4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cnVjdFN0YXQgc3RhdCA9IE9zLnN0YXQoZmlsZU5hbWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIm1vZGUgb2YgIiArIGZpbGVOYW1lICsgIjoiLCBTWVNDVExfTU9ERSwgc3RhdC5zdF9tb2RlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJVSUQgb2YgIiArIGZpbGVOYW1lICsgIjoiLCBTWVNDVExfVUlELCBzdGF0LnN0X3VpZCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiR0lEIG9mICIgKyBmaWxlTmFtZSArICI6IiwgU1lTQ1RMX0dJRCwgc3RhdC5zdF9naWQpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRMZXNzKFN0cmluZyB3aGF0LCBpbnQgYSwgaW50IGIpIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh3aGF0ICsgIiBleHBlY3RlZCA8ICIgKyBiICsgIiBidXQgd2FzOiAiICsgYSwgYSA8IGIpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIHJlYWRGaWxlKFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIEVycm5vRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVsxMDI0XTsKLSAgICAgICAgRmlsZURlc2NyaXB0b3IgZmQgPSBPcy5vcGVuKGZpbGVOYW1lLCAwLCBPc0NvbnN0YW50cy5PX1JET05MWSk7Ci0gICAgICAgIGludCBieXRlc1JlYWQgPSBPcy5yZWFkKGZkLCBidWYsIDAsIGJ1Zi5sZW5ndGgpOwotICAgICAgICBhc3NlcnRMZXNzKCJsZW5ndGggb2YgIiArIGZpbGVOYW1lICsgIjoiLCBieXRlc1JlYWQsIGJ1Zi5sZW5ndGgpOwotICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhidWYpOwotICAgIH0KLQogICAgIC8qKgogICAgICAqIENoZWNrcyB0aGF0IHRoZSBzeXNjdGxzIGZvciBtdWx0aW5ldHdvcmsga2VybmVsIGZlYXR1cmVzIGFyZSBwcmVzZW50IGFuZAogICAgICAqIGVuYWJsZWQuIFRoZSBuZWNlc3Nhcnkga2VybmVsIGNvbW1pdHMgYXJlOgpAQCAtODAsOSArNTYsOCBAQAogICAgICAqLwogICAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvY0ZpbGVzKCkgdGhyb3dzIEVycm5vRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHsKICAgICAgICAgIGZvciAoU3RyaW5nIHN5c2N0bCA6IEdMT0JBTF9TWVNDVExTKSB7Ci0gICAgICAgICAgICAgY2hlY2tTeXNjdGxQZXJtaXNzaW9ucyhzeXNjdGwpOwotICAgICAgICAgICAgIGludCB2YWx1ZSA9IEludGVnZXIucGFyc2VJbnQocmVhZEZpbGUoc3lzY3RsKS50cmltKCkpOwotICAgICAgICAgICAgIGFzc2VydEVxdWFscygidmFsdWUgb2YgIiArIHN5c2N0bCArICI6IiwgMSwgdmFsdWUpOworICAgICAgICAgICAgIGludCB2YWx1ZSA9IGdldEludFZhbHVlKHN5c2N0bCk7CisgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHN5c2N0bCwgMSwgdmFsdWUpOwogICAgICAgICAgfQogCiAgICAgICAgICBGaWxlW10gaW50ZXJmYWNlRGlycyA9IG5ldyBGaWxlKElQVjZfU1lTQ1RMX0RJUikubGlzdEZpbGVzKCk7CkBAIC05MSw5ICs2Niw4IEBACiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBTdHJpbmcgc3lzY3RsID0gbmV3IEZpbGUoaW50ZXJmYWNlRGlyLCBBVVRPQ09ORl9TWVNDVEwpLmdldEFic29sdXRlUGF0aCgpOwotICAgICAgICAgICAgIGNoZWNrU3lzY3RsUGVybWlzc2lvbnMoc3lzY3RsKTsKLSAgICAgICAgICAgICBpbnQgdmFsdWUgPSBJbnRlZ2VyLnBhcnNlSW50KHJlYWRGaWxlKHN5c2N0bCkudHJpbSgpKTsKLSAgICAgICAgICAgICBhc3NlcnRMZXNzKCJ2YWx1ZSBvZiAiICsgc3lzY3RsICsgIjoiLCB2YWx1ZSwgMCk7CisgICAgICAgICAgICAgaW50IHZhbHVlID0gZ2V0SW50VmFsdWUoc3lzY3RsKTsKKyAgICAgICAgICAgICBhc3NlcnRMZXNzKHN5c2N0bCwgdmFsdWUsIDApOwogICAgICAgICAgfQogICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9uZXQvc3JjL2FuZHJvaWQvbmV0L2N0cy9OZXR3b3JrUmVxdWVzdFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL25ldC9zcmMvYW5kcm9pZC9uZXQvY3RzL05ldHdvcmtSZXF1ZXN0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NjJjNzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9uZXQvc3JjL2FuZHJvaWQvbmV0L2N0cy9OZXR3b3JrUmVxdWVzdFRlc3QuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm5ldC5jdHM7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQuTmV0d29ya0NhcGFiaWxpdGllcy5ORVRfQ0FQQUJJTElUWV9NTVM7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0Lk5ldHdvcmtDYXBhYmlsaXRpZXMuVFJBTlNQT1JUX0JMVUVUT09USDsKKworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtSZXF1ZXN0OworaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBOZXR3b3JrUmVxdWVzdFRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworICAgIHB1YmxpYyB2b2lkIHRlc3RDYXBhYmlsaXRpZXMoKSB7CisgICAgICAgIGFzc2VydFRydWUobmV3IE5ldHdvcmtSZXF1ZXN0LkJ1aWxkZXIoKS5hZGRDYXBhYmlsaXR5KE5FVF9DQVBBQklMSVRZX01NUykuYnVpbGQoKQorICAgICAgICAgICAgICAgIC5oYXNDYXBhYmlsaXR5KE5FVF9DQVBBQklMSVRZX01NUykpOworICAgICAgICBhc3NlcnRGYWxzZShuZXcgTmV0d29ya1JlcXVlc3QuQnVpbGRlcigpLnJlbW92ZUNhcGFiaWxpdHkoTkVUX0NBUEFCSUxJVFlfTU1TKS5idWlsZCgpCisgICAgICAgICAgICAgICAgLmhhc0NhcGFiaWxpdHkoTkVUX0NBUEFCSUxJVFlfTU1TKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFRyYW5zcG9ydHMoKSB7CisgICAgICAgIGFzc2VydFRydWUobmV3IE5ldHdvcmtSZXF1ZXN0LkJ1aWxkZXIoKS5hZGRUcmFuc3BvcnRUeXBlKFRSQU5TUE9SVF9CTFVFVE9PVEgpLmJ1aWxkKCkKKyAgICAgICAgICAgICAgICAuaGFzVHJhbnNwb3J0KFRSQU5TUE9SVF9CTFVFVE9PVEgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobmV3IE5ldHdvcmtSZXF1ZXN0LkJ1aWxkZXIoKS5yZW1vdmVUcmFuc3BvcnRUeXBlKFRSQU5TUE9SVF9CTFVFVE9PVEgpLmJ1aWxkKCkKKyAgICAgICAgICAgICAgICAuaGFzVHJhbnNwb3J0KFRSQU5TUE9SVF9CTFVFVE9PVEgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9uZXQvc3JjL2FuZHJvaWQvbmV0L2N0cy9OZXR3b3JrV2F0Y2hsaXN0VGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvbmV0L3NyYy9hbmRyb2lkL25ldC9jdHMvTmV0d29ya1dhdGNobGlzdFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWQ3ODIwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvbmV0L3NyYy9hbmRyb2lkL25ldC9jdHMvTmV0d29ya1dhdGNobGlzdFRlc3QuamF2YQpAQCAtMCwwICsxLDE1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5uZXQuY3RzOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLnRydXRoLlRydXRoLmFzc2VydFRoYXQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3RFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3N1bWUuYXNzdW1lVHJ1ZTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQubmV0LkNvbm5lY3Rpdml0eU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5GaWxlVXRpbHM7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5BcGlMZXZlbFV0aWw7CitpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5TeXN0ZW1VdGlsOworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5Gb3JtYXR0ZXI7CisKK0BTbWFsbFRlc3QKK0BSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgTmV0d29ya1dhdGNobGlzdFRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfV0FUQ0hMSVNUX1hNTCA9ICJhc3NldHMvbmV0d29ya193YXRjaGxpc3RfY29uZmlnX2Zvcl90ZXN0LnhtbCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfRU1QVFlfV0FUQ0hMSVNUX1hNTCA9CisgICAgICAgICAgICAiYXNzZXRzL25ldHdvcmtfd2F0Y2hsaXN0X2NvbmZpZ19lbXB0eV9mb3JfdGVzdC54bWwiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUTVBfQ09ORklHX1BBVEggPQorICAgICAgICAgICAgIi9kYXRhL2xvY2FsL3RtcC9uZXR3b3JrX3dhdGNobGlzdF9jb25maWdfZm9yX3Rlc3QueG1sIjsKKyAgICAvLyBHZW5lcmF0ZWQgZnJvbSBzaGEyNTZzdW0gbmV0d29ya193YXRjaGxpc3RfY29uZmlnX2Zvcl90ZXN0LnhtbAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1dBVENITElTVF9DT05GSUdfSEFTSCA9CisgICAgICAgICAgICAiQjVGQzQ2MzY5OTQxODBENTRFMUU5MTJGNzgxNzhBQjFEOEJEMkJFNzFEOTBDQTlGNUJCQzMyODRFNEQwNEVENCI7CisKKyAgICBwcml2YXRlIENvbm5lY3Rpdml0eU1hbmFnZXIgbUNvbm5lY3Rpdml0eU1hbmFnZXI7CisgICAgcHJpdmF0ZSBib29sZWFuIG1IYXNGZWF0dXJlOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1IYXNGZWF0dXJlID0gaXNBdExlYXN0UCgpOworICAgICAgICBtQ29ubmVjdGl2aXR5TWFuYWdlciA9CisgICAgICAgICAgICAgICAgKENvbm5lY3Rpdml0eU1hbmFnZXIpIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKS5nZXRTeXN0ZW1TZXJ2aWNlKAorICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dC5DT05ORUNUSVZJVFlfU0VSVklDRSk7CisgICAgICAgIGFzc3VtZVRydWUobUhhc0ZlYXR1cmUpOworICAgICAgICAvLyBTZXQgZW1wdHkgd2F0Y2hsaXN0IHRlc3QgY29uZmlnIGJlZm9yZSB0ZXN0aW5nCisgICAgICAgIHNldFdhdGNobGlzdENvbmZpZyhURVNUX0VNUFRZX1dBVENITElTVF9YTUwpOworICAgICAgICAvLyBWZXJpZnkgdGVzdCB3YXRjaGxpc3QgY29uZmlnIGlzIG5vdCBzZXQgYmVmb3JlIHRlc3RpbmcKKyAgICAgICAgYnl0ZVtdIHJlc3VsdCA9IG1Db25uZWN0aXZpdHlNYW5hZ2VyLmdldE5ldHdvcmtXYXRjaGxpc3RDb25maWdIYXNoKCk7CisgICAgICAgIGFzc2VydE5vdEVxdWFscyhURVNUX1dBVENITElTVF9DT05GSUdfSEFTSCwgYnl0ZUFycmF5VG9IZXhTdHJpbmcocmVzdWx0KSk7CisgICAgfQorCisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG1IYXNGZWF0dXJlKSB7CisgICAgICAgICAgICAvLyBTZXQgZW1wdHkgd2F0Y2hsaXN0IHRlc3QgY29uZmlnIGFmdGVyIHRlc3RpbmcKKyAgICAgICAgICAgIHNldFdhdGNobGlzdENvbmZpZyhURVNUX0VNUFRZX1dBVENITElTVF9YTUwpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNsZWFudXAoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBydW5Db21tYW5kKCJybSAiICsgVE1QX0NPTkZJR19QQVRIKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNBdExlYXN0UCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBUT0RPOiByZXBsYWNlIHdpdGggQXBpTGV2ZWxVdGlsLmlzQXRMZWFzdChCdWlsZC5WRVJTSU9OX0NPREVTLlApIHdoZW4gdGhlIFAgQVBJIGxldmVsCisgICAgICAgIC8vIGNvbnN0YW50IGlzIGRlZmluZWQuCisgICAgICAgIHJldHVybiBBcGlMZXZlbFV0aWwuZ2V0Q29kZW5hbWUoKS5jb21wYXJlVG9JZ25vcmVDYXNlKCJQIikgPj0gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGlmIENvbm5lY3Rpdml0eU1hbmFnZXIuZ2V0TmV0d29ya1dhdGNobGlzdENvbmZpZ0hhc2goKSBjb3JyZWN0bHkKKyAgICAgKiByZXR1cm5zIHRoZSBoYXNoIG9mIGNvbmZpZyB3ZSBzZXQuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0V2F0Y2hsaXN0Q29uZmlnSGFzaCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBTZXQgd2F0Y2hsaXN0IGNvbmZpZyBmaWxlIGZvciB0ZXN0CisgICAgICAgIHNldFdhdGNobGlzdENvbmZpZyhURVNUX1dBVENITElTVF9YTUwpOworICAgICAgICAvLyBUZXN0IGlmIHdhdGNobGlzdCBjb25maWcgaGFzaCB2YWx1ZSBpcyBjb3JyZWN0CisgICAgICAgIGJ5dGVbXSByZXN1bHQgPSBtQ29ubmVjdGl2aXR5TWFuYWdlci5nZXROZXR3b3JrV2F0Y2hsaXN0Q29uZmlnSGFzaCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRFU1RfV0FUQ0hMSVNUX0NPTkZJR19IQVNILCBieXRlQXJyYXlUb0hleFN0cmluZyhyZXN1bHQpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYnl0ZUFycmF5VG9IZXhTdHJpbmcoYnl0ZVtdIGJ5dGVzKSB7CisgICAgICAgIEZvcm1hdHRlciBmb3JtYXR0ZXIgPSBuZXcgRm9ybWF0dGVyKCk7CisgICAgICAgIGZvciAoYnl0ZSBiIDogYnl0ZXMpIHsKKyAgICAgICAgICAgIGZvcm1hdHRlci5mb3JtYXQoIiUwMlgiLCBiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZm9ybWF0dGVyLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNhdmVSZXNvdXJjZVRvRmlsZShTdHJpbmcgcmVzLCBTdHJpbmcgZmlsZVBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIEFwcCBjYW4ndCBhY2Nlc3MgL2RhdGEvbG9jYWwvdG1wIGRpcmVjdGx5LCBzbyB3ZSBwaXBlIHJlc291cmNlIHRvIGZpbGUgdGhyb3VnaCBzdGRpbi4KKyAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3Igc3RkaW4gPSBwaXBlRnJvbVN0ZGluKGZpbGVQYXRoKTsKKyAgICAgICAgcGlwZVJlc291cmNlVG9GaWxlRGVzY3JpcHRvcihyZXMsIHN0ZGluKTsKKyAgICB9CisKKyAgICAvKiBQaXBlIHN0ZGluIHRvIGEgZmlsZSBpbiBmaWxlUGF0aC4gUmV0dXJucyBQRkQgZm9yIHN0ZGluLiAqLworICAgIHByaXZhdGUgUGFyY2VsRmlsZURlc2NyaXB0b3IgcGlwZUZyb21TdGRpbihTdHJpbmcgZmlsZVBhdGgpIHsKKyAgICAgICAgLy8gTm90IGFsbCBkZXZpY2VzIGhhdmUgc3ltbGluayBmb3IgL2Rldi9zdGRpbiwgc28gdXNlIC9wcm9jL3NlbGYvZmQvMCBkaXJlY3RseS4KKyAgICAgICAgLy8gL2Rldi9zdGRpbiBtYXBzIHRvIC9wcm9jL3NlbGYvZmQvMC4KKyAgICAgICAgcmV0dXJuIHJ1blJ3Q29tbWFuZCgiY3AgL3Byb2Mvc2VsZi9mZC8wICIgKyBmaWxlUGF0aClbMV07CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHBpcGVSZXNvdXJjZVRvRmlsZURlc2NyaXB0b3IoU3RyaW5nIHJlcywgUGFyY2VsRmlsZURlc2NyaXB0b3IgcGZkKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSW5wdXRTdHJlYW0gcmVzU3RyZWFtID0gZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpLmdldFJlc291cmNlQXNTdHJlYW0ocmVzKTsKKyAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmZFN0cmVhbSA9IG5ldyBQYXJjZWxGaWxlRGVzY3JpcHRvci5BdXRvQ2xvc2VPdXRwdXRTdHJlYW0ocGZkKTsKKworICAgICAgICBGaWxlVXRpbHMuY29weShyZXNTdHJlYW0sIGZkU3RyZWFtKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmRTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJ1bkNvbW1hbmQoU3RyaW5nIGNvbW1hbmQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBTeXN0ZW1VdGlsLnJ1blNoZWxsQ29tbWFuZChJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKSwgY29tbWFuZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgUGFyY2VsRmlsZURlc2NyaXB0b3JbXSBydW5Sd0NvbW1hbmQoU3RyaW5nIGNvbW1hbmQpIHsKKyAgICAgICAgcmV0dXJuIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpCisgICAgICAgICAgICAgICAgLmdldFVpQXV0b21hdGlvbigpLmV4ZWN1dGVTaGVsbENvbW1hbmRSdyhjb21tYW5kKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0V2F0Y2hsaXN0Q29uZmlnKFN0cmluZyB3YXRjaGxpc3RDb25maWdGaWxlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgY2xlYW51cCgpOworICAgICAgICBzYXZlUmVzb3VyY2VUb0ZpbGUod2F0Y2hsaXN0Q29uZmlnRmlsZSwgVE1QX0NPTkZJR19QQVRIKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGNtZFJlc3VsdCA9IHJ1bkNvbW1hbmQoCisgICAgICAgICAgICAgICAgImNtZCBuZXR3b3JrX3dhdGNobGlzdCBzZXQtdGVzdC1jb25maWcgIiArIFRNUF9DT05GSUdfUEFUSCkudHJpbSgpOworICAgICAgICBhc3NlcnRUaGF0KGNtZFJlc3VsdCkuY29udGFpbnMoIlN1Y2Nlc3MiKTsKKyAgICAgICAgY2xlYW51cCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL25ldC9zcmMvYW5kcm9pZC9uZXQvY3RzL1N5c2N0bEJhc2VUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9uZXQvc3JjL2FuZHJvaWQvbmV0L2N0cy9TeXNjdGxCYXNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1OTY2ZDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9uZXQvc3JjL2FuZHJvaWQvbmV0L2N0cy9TeXNjdGxCYXNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubmV0LmN0czsKKworaW1wb3J0IGFuZHJvaWQuc3lzdGVtLkVycm5vRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQuc3lzdGVtLk9zOworaW1wb3J0IGFuZHJvaWQuc3lzdGVtLk9zQ29uc3RhbnRzOworaW1wb3J0IGFuZHJvaWQuc3lzdGVtLlN0cnVjdFN0YXQ7CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogVGVzdHMgZm9yIG11bHRpbmV0d29yayBzeXNjdGwgZnVuY3Rpb25hbGl0eS4KKyAqLworcHVibGljIGNsYXNzIFN5c2N0bEJhc2VUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKworICAgIC8vIEV4cGVjdGVkIG1vZGUsIFVJRCwgYW5kIEdJRCBvZiBzeXNjdGwgZmlsZXMuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNZU0NUTF9NT0RFID0gMDEwMDY0NDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1lTQ1RMX1VJRCA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNZU0NUTF9HSUQgPSAwOworCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrU3lzY3RsUGVybWlzc2lvbnMoU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgRXJybm9FeGNlcHRpb24geworICAgICAgICBTdHJ1Y3RTdGF0IHN0YXQgPSBPcy5zdGF0KGZpbGVOYW1lKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJtb2RlIG9mICIgKyBmaWxlTmFtZSArICI6IiwgU1lTQ1RMX01PREUsIHN0YXQuc3RfbW9kZSk7CisgICAgICAgIGFzc2VydEVxdWFscygiVUlEIG9mICIgKyBmaWxlTmFtZSArICI6IiwgU1lTQ1RMX1VJRCwgc3RhdC5zdF91aWQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkdJRCBvZiAiICsgZmlsZU5hbWUgKyAiOiIsIFNZU0NUTF9HSUQsIHN0YXQuc3RfZ2lkKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRMZXNzKFN0cmluZyBzeXNjdGwsIGludCBhLCBpbnQgYikgeworICAgICAgICBhc3NlcnRUcnVlKCJ2YWx1ZSBvZiAiICsgc3lzY3RsICsgIjogZXhwZWN0ZWQgPCAiICsgYiArICIgYnV0IHdhczogIiArIGEsIGEgPCBiKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRBdExlYXN0KFN0cmluZyBzeXNjdGwsIGludCBhLCBpbnQgYikgeworICAgICAgICBhc3NlcnRUcnVlKCJ2YWx1ZSBvZiAiICsgc3lzY3RsICsgIjogZXhwZWN0ZWQgPj0gIiArIGIgKyAiIGJ1dCB3YXM6ICIgKyBhLCBhID49IGIpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIHJlYWRGaWxlKFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIEVycm5vRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVsxMDI0XTsKKyAgICAgICAgRmlsZURlc2NyaXB0b3IgZmQgPSBPcy5vcGVuKGZpbGVOYW1lLCAwLCBPc0NvbnN0YW50cy5PX1JET05MWSk7CisgICAgICAgIGludCBieXRlc1JlYWQgPSBPcy5yZWFkKGZkLCBidWYsIDAsIGJ1Zi5sZW5ndGgpOworICAgICAgICBhc3NlcnRMZXNzKCJsZW5ndGggb2YgIiArIGZpbGVOYW1lICsgIjoiLCBieXRlc1JlYWQsIGJ1Zi5sZW5ndGgpOworICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhidWYpOworICAgIH0KKworICAgIC8qCisgICAgICogQ2hlY2tzIHBlcm1pc3Npb25zIGFuZCByZXRyaWV2ZXMgdGhlIHN5c2N0bCdzIHZhbHVlLiBSZXRyaWV2YWwgb2YgdmFsdWUgc2hvdWxkIGFsd2F5cyB1c2UKKyAgICAgKiB0aGlzIG1ldGhvZAorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgZ2V0SW50VmFsdWUoU3RyaW5nIGZpbGVuYW1lKSB0aHJvd3MgRXJybm9FeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY2hlY2tTeXNjdGxQZXJtaXNzaW9ucyhmaWxlbmFtZSk7CisgICAgICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHJlYWRGaWxlKGZpbGVuYW1lKS50cmltKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL25ldC9zcmMvYW5kcm9pZC9uZXQvY3RzL1RyYWZmaWNTdGF0c1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL25ldC9zcmMvYW5kcm9pZC9uZXQvY3RzL1RyYWZmaWNTdGF0c1Rlc3QuamF2YQppbmRleCA5MzBjNzQyLi5hODc0M2ZhIDEwMDc1NQotLS0gYS90ZXN0cy90ZXN0cy9uZXQvc3JjL2FuZHJvaWQvbmV0L2N0cy9UcmFmZmljU3RhdHNUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvbmV0L3NyYy9hbmRyb2lkL25ldC9jdHMvVHJhZmZpY1N0YXRzVGVzdC5qYXZhCkBAIC04MSwyNiArODEsNiBAQAogICAgICAgICByZXR1cm4gcGFja2V0Q291bnQgKiAoMjAgKyAzMiArIGJ5dGVzKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgYWNjZXNzT3duVHJhZmZpY1N0YXRzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgaW50IG93bkFwcFVpZCA9IGdldENvbnRleHQoKS5nZXRBcHBsaWNhdGlvbkluZm8oKS51aWQ7Ci0gICAgICAgIExvZy5kKExPR19UQUcsICJhY2Nlc093blRyYWZmaWNTdGF0c1dpdGhUYWdzKCk6IGFib3V0IHRvIHJlYWQgcXRhZ3VpZCBzdGF0cyBmb3Igb3duIHVpZCAiICsgb3duQXBwVWlkKTsKLQotICAgICAgICBib29sZWFuIGZvdW5kT3duRGV0YWlsZWRTdGF0cyA9IGZhbHNlOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgcXRhZ3VpZFJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcigiL3Byb2MvbmV0L3h0X3F0YWd1aWQvc3RhdHMiKSk7Ci0gICAgICAgICAgICBTdHJpbmcgbGluZTsKLSAgICAgICAgICAgIHdoaWxlICgobGluZSA9IHF0YWd1aWRSZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyB0b2tlbnNbXSA9IGxpbmUuc3BsaXQoIiAiKTsKLSAgICAgICAgICAgICAgICBpZiAodG9rZW5zLmxlbmd0aCA+IDMgJiYgdG9rZW5zWzNdLmVxdWFscyhTdHJpbmcudmFsdWVPZihvd25BcHBVaWQpKSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiYWNjZXNzT3duVHJhZmZpY1N0YXRzV2l0aFRhZ3MoKTogZ290IG93biBzdGF0czogIiArIGxpbmUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHF0YWd1aWRSZWFkZXIuY2xvc2UoKTsKLSAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIldhcyBub3QgYWJsZSB0byBhY2Nlc3MgcXRhZ3VpZC9zdGF0czogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgcHVibGljIHZvaWQgdGVzdFRyYWZmaWNTdGF0c0ZvckxvY2FsaG9zdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIGxvbmcgbW9iaWxlVHhQYWNrZXRzQmVmb3JlID0gVHJhZmZpY1N0YXRzLmdldE1vYmlsZVR4UGFja2V0cygpOwogICAgICAgICBmaW5hbCBsb25nIG1vYmlsZVJ4UGFja2V0c0JlZm9yZSA9IFRyYWZmaWNTdGF0cy5nZXRNb2JpbGVSeFBhY2tldHMoKTsKQEAgLTEzMiw3ICsxMTIsNiBAQAogICAgICAgICAgICAgICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbYnl0ZUNvdW50XTsKICAgICAgICAgICAgICAgICAgICAgVHJhZmZpY1N0YXRzLnNldFRocmVhZFN0YXRzVGFnKDB4NDIpOwogICAgICAgICAgICAgICAgICAgICBUcmFmZmljU3RhdHMudGFnU29ja2V0KHNvY2tldCk7Ci0gICAgICAgICAgICAgICAgICAgIGFjY2Vzc093blRyYWZmaWNTdGF0cygpOwogICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhY2tldENvdW50OyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZShidWYpOwogICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmZsdXNoKCk7CkBAIC0xNDUsNyArMTI0LDYgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKICAgICAgICAgICAgICAgICAgICAgc29ja2V0LmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGFjY2Vzc093blRyYWZmaWNTdGF0cygpOwogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAgTG9nLmkoTE9HX1RBRywgIkJhZG5lc3MgZHVyaW5nIHdyaXRlcyB0byBzb2NrZXQ6ICIgKyBlKTsKICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9uZXQvc3JjL2FuZHJvaWQvbmV0L3dpZmkvYXdhcmUvT1dORVJTIGIvdGVzdHMvdGVzdHMvbmV0L3NyYy9hbmRyb2lkL25ldC93aWZpL2F3YXJlL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWZjNDdmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvbmV0L3NyYy9hbmRyb2lkL25ldC93aWZpL2F3YXJlL09XTkVSUwpAQCAtMCwwICsxLDIgQEAKK2V0YW5jb2hlbkBnb29nbGUuY29tCitzYXRrQGdvb2dsZS5jb20KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9uZXQvc3JjL2FuZHJvaWQvbmV0L3dpZmkvYXdhcmUvY3RzL1NpbmdsZURldmljZVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL25ldC9zcmMvYW5kcm9pZC9uZXQvd2lmaS9hd2FyZS9jdHMvU2luZ2xlRGV2aWNlVGVzdC5qYXZhCmluZGV4IDVkY2U1YWIuLjcyNzc1NTMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL25ldC9zcmMvYW5kcm9pZC9uZXQvd2lmaS9hd2FyZS9jdHMvU2luZ2xlRGV2aWNlVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL25ldC9zcmMvYW5kcm9pZC9uZXQvd2lmaS9hd2FyZS9jdHMvU2luZ2xlRGV2aWNlVGVzdC5qYXZhCkBAIC0yMCw3ICsyMCw5IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uTG9jYXRpb25NYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQubmV0LkNvbm5lY3Rpdml0eU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuTWFjQWRkcmVzczsKIGltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrQ2FwYWJpbGl0aWVzOwogaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtSZXF1ZXN0OwogaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXI7CkBAIC0zNywxNiArMzksMTEgQEAKIGltcG9ydCBhbmRyb2lkLm5ldC53aWZpLmF3YXJlLldpZmlBd2FyZVNlc3Npb247CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlclRocmVhZDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOwogaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ2RkVGVzdDsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheURlcXVlOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CkBAIC01Niw3ICs1Myw2IEBACiAgKiBXaS1GaSBBd2FyZSBDVFMgdGVzdCBzdWl0ZTogc2luZ2xlIGRldmljZSB0ZXN0aW5nLiBQZXJmb3JtcyB0ZXN0cyBvbiBhIHNpbmdsZQogICogZGV2aWNlIHRvIHZhbGlkYXRlIFdpLUZpIEF3YXJlLgogICovCi1AQ2RkVGVzdChyZXF1aXJlbWVudD0iNy40LjIuMy9DLTEtMSIpCiBwdWJsaWMgY2xhc3MgU2luZ2xlRGV2aWNlVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJXaWZpQXdhcmVDdHNUZXN0cyI7CiAKQEAgLTc5LDEzICs3NSw2IEBACiAgICAgLy8gdXNlZCB0byBzdG9yZSBhbnkgV2lmaUF3YXJlU2Vzc2lvbiBhbGxvY2F0ZWQgZHVyaW5nIHRlc3RzIC0gd2lsbCBjbGVhbi11cCBhZnRlciB0ZXN0cwogICAgIHByaXZhdGUgTGlzdDxXaWZpQXdhcmVTZXNzaW9uPiBtU2Vzc2lvbnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAotICAgIC8vIFJldHVybiB0cnVlIGlmIGxvY2F0aW9uIGlzIGVuYWJsZWQuCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzTG9jYXRpb25FbmFibGVkKCkgewotICAgICAgICByZXR1cm4gU2V0dGluZ3MuU2VjdXJlLmdldEludChnZXRDb250ZXh0KCkuZ2V0Q29udGVudFJlc29sdmVyKCksCi0gICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkxPQ0FUSU9OX01PREUsIFNldHRpbmdzLlNlY3VyZS5MT0NBVElPTl9NT0RFX09GRikgIT0KLSAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fTU9ERV9PRkY7Ci0gICAgfQotCiAgICAgcHJpdmF0ZSBjbGFzcyBXaWZpQXdhcmVCcm9hZGNhc3RSZWNlaXZlciBleHRlbmRzIEJyb2FkY2FzdFJlY2VpdmVyIHsKICAgICAgICAgcHJpdmF0ZSBDb3VudERvd25MYXRjaCBtQmxvY2tlciA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKIApAQCAtMzYxLDYgKzM1MCwxMCBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiV2ktRmkgQXdhcmUgcmVxdWlyZXMgTG9jYXRpb24gdG8gYmUgRW5hYmxlZCIsCisgICAgICAgICAgICAgICAgKChMb2NhdGlvbk1hbmFnZXIpIGdldENvbnRleHQoKS5nZXRTeXN0ZW1TZXJ2aWNlKAorICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dC5MT0NBVElPTl9TRVJWSUNFKSkuaXNMb2NhdGlvbkVuYWJsZWQoKSk7CisKICAgICAgICAgbVdpZmlBd2FyZU1hbmFnZXIgPSAoV2lmaUF3YXJlTWFuYWdlcikgZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoCiAgICAgICAgICAgICAgICAgQ29udGV4dC5XSUZJX0FXQVJFX1NFUlZJQ0UpOwogICAgICAgICBhc3NlcnROb3ROdWxsKCJXaS1GaSBBd2FyZSBNYW5hZ2VyIiwgbVdpZmlBd2FyZU1hbmFnZXIpOwpAQCAtNDM0LDE4ICs0MjcsNiBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGlzTG9jYXRpb25FbmFibGVkKCkpIHsKLSAgICAgICAgICAgIC8qIENhbid0IGV4ZWN1dGUgdGhpcyB0ZXN0IHdpdGggbG9jYXRpb24gb24gc2luY2UgaXQgbWVhbnMgdGhhdCBBd2FyZSB3aWxsIG5vdCBnZXQKLSAgICAgICAgICAgICAqIGRpc2FibGVkIGV2ZW4gaWYgd2UgZGlzYWJsZSBXaS1GaSAod2hpY2ggd2hlbiBsb2NhdGlvbiBpcyBlbmFibGVkIGRvZXMgbm90IGNvcnJlc3BvbmQKLSAgICAgICAgICAgICAqIHRvIGRpc2FibGluZyB0aGUgV2ktRmkgY2hpcCkuCi0gICAgICAgICAgICAgKgotICAgICAgICAgICAgICogQ29uc2lkZXJpbmcgb3RoZXIgdGVzdHMgbWF5IHJlcXVpcmUgbG9jYXRpb25pbmcgdG8gYmUgZW5hYmxlIHdlIGNhbid0IGFsc28gZmFpbCB0aGUKLSAgICAgICAgICAgICAqIHRlc3QgaW4gc3VjaCBhIGNhc2UuIEhlbmNlIGl0IGlzIHNraXBwZWQuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIExvZy5kKFRBRywgIlNraXBwaW5nIHRlc3Qgc2luY2UgbG9jYXRpb24gc2NhbnMgYXJlIGVuYWJsZWQiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCiAgICAgICAgIEludGVudEZpbHRlciBpbnRlbnRGaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7CiAgICAgICAgIGludGVudEZpbHRlci5hZGRBY3Rpb24oV2lmaUF3YXJlTWFuYWdlci5BQ1RJT05fV0lGSV9BV0FSRV9TVEFURV9DSEFOR0VEKTsKIApAQCAtNDg4LDcgKzQ2OSw2IEBACiAgICAgICogdGhlbiB0aGUgYXR0YWNoL2Rlc3Ryb3kgd2lsbCBub3QgY29ycmVzcG9uZCB0byBlbmFibGUvZGlzYWJsZSBhbmQgd2lsbCBub3QgcmVzdWx0IGluIGEgbmV3CiAgICAgICogTUFDIGFkZHJlc3MgYmVpbmcgZ2VuZXJhdGVkLgogICAgICAqLwotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjQuMi4zL0MtMS00IikKICAgICBwdWJsaWMgdm9pZCB0ZXN0QXR0YWNoRGlzY292ZXJ5QWRkcmVzc0NoYW5nZXMoKSB7CiAgICAgICAgIGlmICghVGVzdFV0aWxzLnNob3VsZFRlc3RXaWZpQXdhcmUoZ2V0Q29udGV4dCgpKSkgewogICAgICAgICAgICAgcmV0dXJuOwpAQCAtNzIxLDgyICs3MDEsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXF1ZXN0IGFuIEF3YXJlIGRhdGEtcGF0aCAob3Blbikgb24gYSBQdWJsaXNoIGRpc2NvdmVyeSBzZXNzaW9uICh3aGljaCBjYW4gYmUgZG9uZSB3aXRoIGEKLSAgICAgKiBudWxsIHBlZXIgLSB0byBhY2NlcHQgYWxsIHJlcXVlc3RzKS4gVmFsaWRhdGUgdGhhdCB0aW1lcy1vdXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdERhdGFQYXRoT3BlbkluQ29udGV4dE9mRGlzY292ZXJ5RmFpbCgpIHsKLSAgICAgICAgaWYgKCFUZXN0VXRpbHMuc2hvdWxkVGVzdFdpZmlBd2FyZShnZXRDb250ZXh0KCkpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBXaWZpQXdhcmVTZXNzaW9uIHNlc3Npb24gPSBhdHRhY2hBbmRHZXRTZXNzaW9uKCk7Ci0KLSAgICAgICAgUHVibGlzaENvbmZpZyBwdWJsaXNoQ29uZmlnID0gbmV3IFB1Ymxpc2hDb25maWcuQnVpbGRlcigpLnNldFNlcnZpY2VOYW1lKAotICAgICAgICAgICAgICAgICJWYWxpZE5hbWUiKS5idWlsZCgpOwotICAgICAgICBEaXNjb3ZlcnlTZXNzaW9uQ2FsbGJhY2tUZXN0IGRpc2NvdmVyeUNiID0gbmV3IERpc2NvdmVyeVNlc3Npb25DYWxsYmFja1Rlc3QoKTsKLSAgICAgICAgTmV0d29ya0NhbGxiYWNrVGVzdCBuZXR3b3JrQ2IgPSBuZXcgTmV0d29ya0NhbGxiYWNrVGVzdCgpOwotCi0gICAgICAgIC8vIDEuIHB1Ymxpc2gKLSAgICAgICAgc2Vzc2lvbi5wdWJsaXNoKHB1Ymxpc2hDb25maWcsIGRpc2NvdmVyeUNiLCBtSGFuZGxlcik7Ci0gICAgICAgIGFzc2VydFRydWUoIlB1Ymxpc2ggc3RhcnRlZCIsCi0gICAgICAgICAgICAgICAgZGlzY292ZXJ5Q2Iud2FpdEZvckNhbGxiYWNrKERpc2NvdmVyeVNlc3Npb25DYWxsYmFja1Rlc3QuT05fUFVCTElTSF9TVEFSVEVEKSk7Ci0gICAgICAgIFB1Ymxpc2hEaXNjb3ZlcnlTZXNzaW9uIGRpc2NvdmVyeVNlc3Npb24gPSBkaXNjb3ZlcnlDYi5nZXRQdWJsaXNoRGlzY292ZXJ5U2Vzc2lvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJQdWJsaXNoIHNlc3Npb24iLCBkaXNjb3ZlcnlTZXNzaW9uKTsKLQotICAgICAgICAvLyAyLiByZXF1ZXN0IGFuIEFXQVJFIG5ldHdvcmsKLSAgICAgICAgTmV0d29ya1JlcXVlc3QgbnIgPSBuZXcgTmV0d29ya1JlcXVlc3QuQnVpbGRlcigpLmFkZFRyYW5zcG9ydFR5cGUoCi0gICAgICAgICAgICAgICAgTmV0d29ya0NhcGFiaWxpdGllcy5UUkFOU1BPUlRfV0lGSV9BV0FSRSkuc2V0TmV0d29ya1NwZWNpZmllcigKLSAgICAgICAgICAgICAgICBkaXNjb3ZlcnlTZXNzaW9uLmNyZWF0ZU5ldHdvcmtTcGVjaWZpZXJPcGVuKG51bGwpKS5idWlsZCgpOwotICAgICAgICBtQ29ubmVjdGl2aXR5TWFuYWdlci5yZXF1ZXN0TmV0d29yayhuciwgbmV0d29ya0NiLCAyMDAwKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiT25VbmF2YWlsYWJsZSByZWNlaXZlZCIsIG5ldHdvcmtDYi53YWl0Rm9yT25VbmF2YWlsYWJsZSgpKTsKLQotICAgICAgICBkaXNjb3ZlcnlTZXNzaW9uLmNsb3NlKCk7Ci0gICAgICAgIHNlc3Npb24uY2xvc2UoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXF1ZXN0IGFuIEF3YXJlIGRhdGEtcGF0aCAoZW5jcnlwdGVkKSBvbiBhIFB1Ymxpc2ggZGlzY292ZXJ5IHNlc3Npb24gKHdoaWNoIGNhbiBiZSBkb25lCi0gICAgICogd2l0aCBhIG51bGwgcGVlciAtIHRvIGFjY2VwdCBhbGwgcmVxdWVzdHMpLiBWYWxpZGF0ZSB0aGF0IHRpbWVzLW91dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGF0YVBhdGhQYXNzcGhyYXNlSW5Db250ZXh0T2ZEaXNjb3ZlcnlGYWlsKCkgewotICAgICAgICBpZiAoIVRlc3RVdGlscy5zaG91bGRUZXN0V2lmaUF3YXJlKGdldENvbnRleHQoKSkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIFdpZmlBd2FyZVNlc3Npb24gc2Vzc2lvbiA9IGF0dGFjaEFuZEdldFNlc3Npb24oKTsKLQotICAgICAgICBQdWJsaXNoQ29uZmlnIHB1Ymxpc2hDb25maWcgPSBuZXcgUHVibGlzaENvbmZpZy5CdWlsZGVyKCkuc2V0U2VydmljZU5hbWUoCi0gICAgICAgICAgICAgICAgIlZhbGlkTmFtZSIpLmJ1aWxkKCk7Ci0gICAgICAgIERpc2NvdmVyeVNlc3Npb25DYWxsYmFja1Rlc3QgZGlzY292ZXJ5Q2IgPSBuZXcgRGlzY292ZXJ5U2Vzc2lvbkNhbGxiYWNrVGVzdCgpOwotICAgICAgICBOZXR3b3JrQ2FsbGJhY2tUZXN0IG5ldHdvcmtDYiA9IG5ldyBOZXR3b3JrQ2FsbGJhY2tUZXN0KCk7Ci0KLSAgICAgICAgLy8gMS4gcHVibGlzaAotICAgICAgICBzZXNzaW9uLnB1Ymxpc2gocHVibGlzaENvbmZpZywgZGlzY292ZXJ5Q2IsIG1IYW5kbGVyKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiUHVibGlzaCBzdGFydGVkIiwKLSAgICAgICAgICAgICAgICBkaXNjb3ZlcnlDYi53YWl0Rm9yQ2FsbGJhY2soRGlzY292ZXJ5U2Vzc2lvbkNhbGxiYWNrVGVzdC5PTl9QVUJMSVNIX1NUQVJURUQpKTsKLSAgICAgICAgUHVibGlzaERpc2NvdmVyeVNlc3Npb24gZGlzY292ZXJ5U2Vzc2lvbiA9IGRpc2NvdmVyeUNiLmdldFB1Ymxpc2hEaXNjb3ZlcnlTZXNzaW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIlB1Ymxpc2ggc2Vzc2lvbiIsIGRpc2NvdmVyeVNlc3Npb24pOwotCi0gICAgICAgIC8vIDIuIHJlcXVlc3QgYW4gQVdBUkUgbmV0d29yawotICAgICAgICBOZXR3b3JrUmVxdWVzdCBuciA9IG5ldyBOZXR3b3JrUmVxdWVzdC5CdWlsZGVyKCkuYWRkVHJhbnNwb3J0VHlwZSgKLSAgICAgICAgICAgICAgICBOZXR3b3JrQ2FwYWJpbGl0aWVzLlRSQU5TUE9SVF9XSUZJX0FXQVJFKS5zZXROZXR3b3JrU3BlY2lmaWVyKAotICAgICAgICAgICAgICAgIGRpc2NvdmVyeVNlc3Npb24uY3JlYXRlTmV0d29ya1NwZWNpZmllclBhc3NwaHJhc2UobnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICJTb21lIHZlcnkgbG9uZyBidXQgbm90IHZlcnkgZ29vZCBwYXNzcGhyYXNlIikpLmJ1aWxkKCk7Ci0gICAgICAgIG1Db25uZWN0aXZpdHlNYW5hZ2VyLnJlcXVlc3ROZXR3b3JrKG5yLCBuZXR3b3JrQ2IsIDIwMDApOwotICAgICAgICBhc3NlcnRUcnVlKCJPblVuYXZhaWxhYmxlIHJlY2VpdmVkIiwgbmV0d29ya0NiLndhaXRGb3JPblVuYXZhaWxhYmxlKCkpOwotCi0gICAgICAgIGRpc2NvdmVyeVNlc3Npb24uY2xvc2UoKTsKLSAgICAgICAgc2Vzc2lvbi5jbG9zZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlcXVlc3QgYW4gQXdhcmUgZGF0YS1wYXRoIChvcGVuKSBhcyBhIFJlc3BvbmRlciB3aXRoIG5vIHBlZXIgTUFDIGFkZHJlc3MgKGkuZS4gYWNjZXB0IGFueQotICAgICAqIHBlZXIgcmVxdWVzdCkuIFZhbGlkYXRlIHRoYXQgdGltZXMtb3V0LgorICAgICAqIFJlcXVlc3QgYW4gQXdhcmUgZGF0YS1wYXRoIChvcGVuKSBhcyBhIFJlc3BvbmRlciB3aXRoIGFuIGFyYml0cmFyeSBwZWVyIE1BQyBhZGRyZXNzLiBWYWxpZGF0ZQorICAgICAqIHRoYXQgdGltZXMtb3V0LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHRlc3REYXRhUGF0aE9wZW5PdXRPZkJhbmRGYWlsKCkgewogICAgICAgICBpZiAoIVRlc3RVdGlscy5zaG91bGRUZXN0V2lmaUF3YXJlKGdldENvbnRleHQoKSkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQorICAgICAgICBNYWNBZGRyZXNzIG1hYyA9IE1hY0FkZHJlc3MuZnJvbVN0cmluZygiMDA6MDE6MDI6MDM6MDQ6MDUiKTsKIAogICAgICAgICBXaWZpQXdhcmVTZXNzaW9uIHNlc3Npb24gPSBhdHRhY2hBbmRHZXRTZXNzaW9uKCk7CiAKQEAgLTgwOSw3ICs3MjEsOCBAQAogICAgICAgICBOZXR3b3JrUmVxdWVzdCBuciA9IG5ldyBOZXR3b3JrUmVxdWVzdC5CdWlsZGVyKCkuYWRkVHJhbnNwb3J0VHlwZSgKICAgICAgICAgICAgICAgICBOZXR3b3JrQ2FwYWJpbGl0aWVzLlRSQU5TUE9SVF9XSUZJX0FXQVJFKS5zZXROZXR3b3JrU3BlY2lmaWVyKAogICAgICAgICAgICAgICAgIHNlc3Npb24uY3JlYXRlTmV0d29ya1NwZWNpZmllck9wZW4oCi0gICAgICAgICAgICAgICAgICAgICAgICBXaWZpQXdhcmVNYW5hZ2VyLldJRklfQVdBUkVfREFUQV9QQVRIX1JPTEVfUkVTUE9OREVSLCBudWxsKSkuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlBd2FyZU1hbmFnZXIuV0lGSV9BV0FSRV9EQVRBX1BBVEhfUk9MRV9SRVNQT05ERVIsCisgICAgICAgICAgICAgICAgICAgICAgICBtYWMudG9CeXRlQXJyYXkoKSkpLmJ1aWxkKCk7CiAgICAgICAgIG1Db25uZWN0aXZpdHlNYW5hZ2VyLnJlcXVlc3ROZXR3b3JrKG5yLCBuZXR3b3JrQ2IsIDIwMDApOwogICAgICAgICBhc3NlcnRUcnVlKCJPblVuYXZhaWxhYmxlIHJlY2VpdmVkIiwgbmV0d29ya0NiLndhaXRGb3JPblVuYXZhaWxhYmxlKCkpOwogCkBAIC04MTcsMTMgKzczMCwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlcXVlc3QgYW4gQXdhcmUgZGF0YS1wYXRoIChlbmNyeXB0ZWQpIGFzIGEgUmVzcG9uZGVyIHdpdGggbm8gcGVlciBNQUMgYWRkcmVzcyAoaS5lLgotICAgICAqIGFjY2VwdCBhbnkgcGVlciByZXF1ZXN0KS4gVmFsaWRhdGUgdGhhdCB0aW1lcy1vdXQuCisgICAgICogUmVxdWVzdCBhbiBBd2FyZSBkYXRhLXBhdGggKGVuY3J5cHRlZCkgYXMgYSBSZXNwb25kZXIgd2l0aCBhbiBhcmJpdHJhcnkgcGVlciBNQUMgYWRkcmVzcy4KKyAgICAgKiBWYWxpZGF0ZSB0aGF0IHRpbWVzLW91dC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB0ZXN0RGF0YVBhdGhQYXNzcGhyYXNlT3V0T2ZCYW5kRmFpbCgpIHsKICAgICAgICAgaWYgKCFUZXN0VXRpbHMuc2hvdWxkVGVzdFdpZmlBd2FyZShnZXRDb250ZXh0KCkpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KKyAgICAgICAgTWFjQWRkcmVzcyBtYWMgPSBNYWNBZGRyZXNzLmZyb21TdHJpbmcoIjAwOjAxOjAyOjAzOjA0OjA1Iik7CiAKICAgICAgICAgV2lmaUF3YXJlU2Vzc2lvbiBzZXNzaW9uID0gYXR0YWNoQW5kR2V0U2Vzc2lvbigpOwogCkBAIC04MzYsNyArNzUwLDcgQEAKICAgICAgICAgTmV0d29ya1JlcXVlc3QgbnIgPSBuZXcgTmV0d29ya1JlcXVlc3QuQnVpbGRlcigpLmFkZFRyYW5zcG9ydFR5cGUoCiAgICAgICAgICAgICAgICAgTmV0d29ya0NhcGFiaWxpdGllcy5UUkFOU1BPUlRfV0lGSV9BV0FSRSkuc2V0TmV0d29ya1NwZWNpZmllcigKICAgICAgICAgICAgICAgICBzZXNzaW9uLmNyZWF0ZU5ldHdvcmtTcGVjaWZpZXJQYXNzcGhyYXNlKAotICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUF3YXJlTWFuYWdlci5XSUZJX0FXQVJFX0RBVEFfUEFUSF9ST0xFX1JFU1BPTkRFUiwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlBd2FyZU1hbmFnZXIuV0lGSV9BV0FSRV9EQVRBX1BBVEhfUk9MRV9SRVNQT05ERVIsIG1hYy50b0J5dGVBcnJheSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgImFiY2RlZmdoaWhrIikpLmJ1aWxkKCk7CiAgICAgICAgIG1Db25uZWN0aXZpdHlNYW5hZ2VyLnJlcXVlc3ROZXR3b3JrKG5yLCBuZXR3b3JrQ2IsIDIwMDApOwogICAgICAgICBhc3NlcnRUcnVlKCJPblVuYXZhaWxhYmxlIHJlY2VpdmVkIiwgbmV0d29ya0NiLndhaXRGb3JPblVuYXZhaWxhYmxlKCkpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbmV0L3NyYy9hbmRyb2lkL25ldC93aWZpL2N0cy9Db25jdXJyZW5jeVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL25ldC9zcmMvYW5kcm9pZC9uZXQvd2lmaS9jdHMvQ29uY3VycmVuY3lUZXN0LmphdmEKaW5kZXggNDE4Nzg4My4uYTA2NmJhOCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbmV0L3NyYy9hbmRyb2lkL25ldC93aWZpL2N0cy9Db25jdXJyZW5jeVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9uZXQvc3JjL2FuZHJvaWQvbmV0L3dpZmkvY3RzL0NvbmN1cnJlbmN5VGVzdC5qYXZhCkBAIC0zMSwxMiArMzEsOSBAQAogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLnAycC5XaWZpUDJwTWFuYWdlci5XSUZJX1AyUF9TVEFURV9FTkFCTEVEOwogaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNkZFRlc3Q7Ci0KIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKIAotQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuNC4yLjEvQy0xLTEsQy0xLTMiKQogcHVibGljIGNsYXNzIENvbmN1cnJlbmN5VGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CiAgICAgcHJpdmF0ZSBjbGFzcyBNeVN5bmMgewogICAgICAgICBpbnQgZXhwZWN0ZWRXaWZpU3RhdGU7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9uZXQvc3JjL2FuZHJvaWQvbmV0L3dpZmkvY3RzL1NjYW5SZXN1bHRUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9uZXQvc3JjL2FuZHJvaWQvbmV0L3dpZmkvY3RzL1NjYW5SZXN1bHRUZXN0LmphdmEKaW5kZXggYzliODJlZS4uOGEyMmJlZiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbmV0L3NyYy9hbmRyb2lkL25ldC93aWZpL2N0cy9TY2FuUmVzdWx0VGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL25ldC9zcmMvYW5kcm9pZC9uZXQvd2lmaS9jdHMvU2NhblJlc3VsdFRlc3QuamF2YQpAQCAtNDIsMTIgKzQyLDE0IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1dJRklfQ0hBTkdFRCA9IDI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1NUQVJUX1NDQU4gPSAzOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9TQ0FOX1JFU1VMVFNfQVZBSUxBQkxFID0gNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfU0NBTl9GQUlMVVJFID0gNTsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiV2lmaUluZm9UZXN0IjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVElNRU9VVF9NU0VDID0gNjAwMDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0FJVF9NU0VDID0gNjA7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVOQUJMRV9XQUlUX01TRUMgPSAxMDAwMDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0NBTl9XQUlUX01TRUMgPSAxMDAwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0NBTl9NQVhfUkVUUllfQ09VTlQgPSA2OwogICAgIHByaXZhdGUgSW50ZW50RmlsdGVyIG1JbnRlbnRGaWx0ZXI7CiAgICAgcHJpdmF0ZSBmaW5hbCBCcm9hZGNhc3RSZWNlaXZlciBtUmVjZWl2ZXIgPSBuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7CiAgICAgICAgIEBPdmVycmlkZQpAQCAtNjAsNyArNjIsMTEgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5lcXVhbHMoV2lmaU1hbmFnZXIuU0NBTl9SRVNVTFRTX0FWQUlMQUJMRV9BQ1RJT04pKSB7CiAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtTXlTeW5jKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1NeVN5bmMuZXhwZWN0ZWRTdGF0ZSA9IFNUQVRFX1NDQU5fUkVTVUxUU19BVkFJTEFCTEU7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbnRlbnQuZ2V0Qm9vbGVhbkV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX1JFU1VMVFNfVVBEQVRFRCwgZmFsc2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtTXlTeW5jLmV4cGVjdGVkU3RhdGUgPSBTVEFURV9TQ0FOX1JFU1VMVFNfQVZBSUxBQkxFOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbU15U3luYy5leHBlY3RlZFN0YXRlID0gU1RBVEVfU0NBTl9GQUlMVVJFOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIG1NeVN5bmMubm90aWZ5KCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMTIwLDExICsxMjYsMTIgQEAKICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHdhaXRGb3JCcm9hZGNhc3QobG9uZyB0aW1lb3V0LCBpbnQgZXhwZWN0ZWRTdGF0ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHJpdmF0ZSBib29sZWFuIHdhaXRGb3JCcm9hZGNhc3QobG9uZyB0aW1lb3V0LCBpbnQgZXhwZWN0ZWRTdGF0ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGxvbmcgd2FpdFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIHRpbWVvdXQ7CiAgICAgICAgIHdoaWxlIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSA8IHdhaXRUaW1lCiAgICAgICAgICAgICAgICAgJiYgbU15U3luYy5leHBlY3RlZFN0YXRlICE9IGV4cGVjdGVkU3RhdGUpCiAgICAgICAgICAgICBtTXlTeW5jLndhaXQoV0FJVF9NU0VDKTsKKyAgICAgICAgcmV0dXJuIG1NeVN5bmMuZXhwZWN0ZWRTdGF0ZSA9PSBleHBlY3RlZFN0YXRlOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RTY2FuUmVzdWx0UHJvcGVydGllcygpIHsKQEAgLTE0MCwxMSArMTQ3LDE2IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKiBNdWx0aXBsZSBzY2FucyB0byBlbnN1cmUgYnNzaWQgaXMgdXBkYXRlZCAqLwogICAgIHByaXZhdGUgdm9pZCBzY2FuQW5kV2FpdCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1NeVN5bmMpIHsKLSAgICAgICAgICAgIG1NeVN5bmMuZXhwZWN0ZWRTdGF0ZSA9IFNUQVRFX1NUQVJUX1NDQU47Ci0gICAgICAgICAgICBtV2lmaU1hbmFnZXIuc3RhcnRTY2FuKCk7Ci0gICAgICAgICAgICB3YWl0Rm9yQnJvYWRjYXN0KFNDQU5fV0FJVF9NU0VDLCBTVEFURV9TQ0FOX1JFU1VMVFNfQVZBSUxBQkxFKTsKKyAgICAgICAgICAgIGZvciAoaW50IHJldHJ5ICA9IDA7IHJldHJ5IDwgU0NBTl9NQVhfUkVUUllfQ09VTlQ7IHJldHJ5KyspIHsKKyAgICAgICAgICAgICAgICBtTXlTeW5jLmV4cGVjdGVkU3RhdGUgPSBTVEFURV9TVEFSVF9TQ0FOOworICAgICAgICAgICAgICAgIG1XaWZpTWFuYWdlci5zdGFydFNjYW4oKTsKKyAgICAgICAgICAgICAgICBpZiAod2FpdEZvckJyb2FkY2FzdChTQ0FOX1dBSVRfTVNFQywgU1RBVEVfU0NBTl9SRVNVTFRTX0FWQUlMQUJMRSkpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9CiAgICB9CiAKQEAgLTE1Nyw5ICsxNjksNiBAQAogICAgICAgICBsb25nIHRpbWVzdGFtcCA9IDA7CiAgICAgICAgIFN0cmluZyBCU1NJRCA9IG51bGw7CiAKLSAgICAgICAgLyogTXVsdGlwbGUgc2NhbnMgdG8gZW5zdXJlIGJzc2lkIGlzIHVwZGF0ZWQgKi8KLSAgICAgICAgc2NhbkFuZFdhaXQoKTsKLSAgICAgICAgc2NhbkFuZFdhaXQoKTsKICAgICAgICAgc2NhbkFuZFdhaXQoKTsKIAogICAgICAgICBMaXN0PFNjYW5SZXN1bHQ+IHNjYW5SZXN1bHRzID0gbVdpZmlNYW5hZ2VyLmdldFNjYW5SZXN1bHRzKCk7CkBAIC0xNzEsOCArMTgwLDYgQEAKICAgICAgICAgfQogCiAgICAgICAgIHNjYW5BbmRXYWl0KCk7Ci0gICAgICAgIHNjYW5BbmRXYWl0KCk7Ci0gICAgICAgIHNjYW5BbmRXYWl0KCk7CiAKICAgICAgICAgc2NhblJlc3VsdHMgPSBtV2lmaU1hbmFnZXIuZ2V0U2NhblJlc3VsdHMoKTsKICAgICAgICAgZm9yIChTY2FuUmVzdWx0IHJlc3VsdCA6IHNjYW5SZXN1bHRzKSB7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9uZXQvc3JjL2FuZHJvaWQvbmV0L3dpZmkvY3RzL1dpZmlDb25maWd1cmF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvbmV0L3NyYy9hbmRyb2lkL25ldC93aWZpL2N0cy9XaWZpQ29uZmlndXJhdGlvblRlc3QuamF2YQppbmRleCA4YjE3YTU3Li40NDgwYTI0IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9uZXQvc3JjL2FuZHJvaWQvbmV0L3dpZmkvY3RzL1dpZmlDb25maWd1cmF0aW9uVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL25ldC9zcmMvYW5kcm9pZC9uZXQvd2lmaS9jdHMvV2lmaUNvbmZpZ3VyYXRpb25UZXN0LmphdmEKQEAgLTIzLDkgKzIzLDYgQEAKIGltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNkZFRlc3Q7Ci0KLUBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjQuMi9DLTEtMSIpCiBwdWJsaWMgY2xhc3MgV2lmaUNvbmZpZ3VyYXRpb25UZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKICAgICBwcml2YXRlICBXaWZpTWFuYWdlciBtV2lmaU1hbmFnZXI7CiAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9uZXQvc3JjL2FuZHJvaWQvbmV0L3dpZmkvY3RzL1dpZmlJbmZvVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvbmV0L3NyYy9hbmRyb2lkL25ldC93aWZpL2N0cy9XaWZpSW5mb1Rlc3QuamF2YQppbmRleCBjOTdmMDEwLi41OTgzY2I3IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9uZXQvc3JjL2FuZHJvaWQvbmV0L3dpZmkvY3RzL1dpZmlJbmZvVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL25ldC9zcmMvYW5kcm9pZC9uZXQvd2lmaS9jdHMvV2lmaUluZm9UZXN0LmphdmEKQEAgLTI5LDExICsyOSw5IEBACiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuUG9sbGluZ0NoZWNrOwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ2RkVGVzdDsKIAogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOwogCi1AQ2RkVGVzdChyZXF1aXJlbWVudD0iNy40LjIvQy0xLTEiKQogcHVibGljIGNsYXNzIFdpZmlJbmZvVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTXlTeW5jIHsKICAgICAgICAgaW50IGV4cGVjdGVkU3RhdGUgPSBTVEFURV9OVUxMOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbmV0L3NyYy9hbmRyb2lkL25ldC93aWZpL2N0cy9XaWZpTWFuYWdlclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL25ldC9zcmMvYW5kcm9pZC9uZXQvd2lmaS9jdHMvV2lmaU1hbmFnZXJUZXN0LmphdmEKaW5kZXggOTA1NDBmNC4uMmVkMDEyNCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbmV0L3NyYy9hbmRyb2lkL25ldC93aWZpL2N0cy9XaWZpTWFuYWdlclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9uZXQvc3JjL2FuZHJvaWQvbmV0L3dpZmkvY3RzL1dpZmlNYW5hZ2VyVGVzdC5qYXZhCkBAIC0zNyw3ICszNyw2IEBACiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DZGRUZXN0OwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuV2lmaUNvbmZpZ0NyZWF0b3I7CiAKIGltcG9ydCBqYXZhLm5ldC5IdHRwVVJMQ29ubmVjdGlvbjsKQEAgLTUwLDcgKzQ5LDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKIAotQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuNC4yL0MtMS0xIikKIHB1YmxpYyBjbGFzcyBXaWZpTWFuYWdlclRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgewogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE15U3luYyB7CiAgICAgICAgIGludCBleHBlY3RlZFN0YXRlID0gU1RBVEVfTlVMTDsKQEAgLTcyLDcgKzcwLDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfV0lGSV9FTkFCTEVEID0gMjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfV0lGSV9ESVNBQkxFRCA9IDM7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1NDQU5OSU5HID0gNDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfU0NBTl9SRVNVTFRTX0FWQUlMQUJMRSA9IDU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1NDQU5fRE9ORSA9IDU7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIldpZmlNYW5hZ2VyVGVzdCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNTSUQxID0gIlwiV2lmaU1hbmFnZXJUZXN0XCIiOwpAQCAtOTgsMTMgKzk2LDE1IEBACiAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBhY3Rpb24gPSBpbnRlbnQuZ2V0QWN0aW9uKCk7CiAgICAgICAgICAgICBpZiAoYWN0aW9uLmVxdWFscyhXaWZpTWFuYWdlci5TQ0FOX1JFU1VMVFNfQVZBSUxBQkxFX0FDVElPTikpIHsKKwogICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobU15U3luYykgewotICAgICAgICAgICAgICAgICAgICBpZiAobVdpZmlNYW5hZ2VyLmdldFNjYW5SZXN1bHRzKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZW50LmdldEJvb2xlYW5FeHRyYShXaWZpTWFuYWdlci5FWFRSQV9SRVNVTFRTX1VQREFURUQsIGZhbHNlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgbVNjYW5SZXN1bHRzID0gbVdpZmlNYW5hZ2VyLmdldFNjYW5SZXN1bHRzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTXlTeW5jLmV4cGVjdGVkU3RhdGUgPSBTVEFURV9TQ0FOX1JFU1VMVFNfQVZBSUxBQkxFOwotICAgICAgICAgICAgICAgICAgICAgICAgbVNjYW5SZXN1bHRzID0gbVdpZmlNYW5hZ2VyLmdldFNjYW5SZXN1bHRzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTXlTeW5jLm5vdGlmeUFsbCgpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbVNjYW5SZXN1bHRzID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtTXlTeW5jLmV4cGVjdGVkU3RhdGUgPSBTVEFURV9TQ0FOX0RPTkU7CisgICAgICAgICAgICAgICAgICAgIG1NeVN5bmMubm90aWZ5QWxsKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKFdpZmlNYW5hZ2VyLldJRklfU1RBVEVfQ0hBTkdFRF9BQ1RJT04pKSB7CiAgICAgICAgICAgICAgICAgaW50IG5ld1N0YXRlID0gaW50ZW50LmdldEludEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX1dJRklfU1RBVEUsCkBAIC0yMDMsNiArMjAzLDI1IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvLyBHZXQgdGhlIGN1cnJlbnQgc2NhbiBzdGF0dXMgZnJvbSBzdGlja3kgYnJvYWRjYXN0LgorICAgIHByaXZhdGUgYm9vbGVhbiBpc1NjYW5DdXJyZW50bHlBdmFpbGFibGUoKSB7CisgICAgICAgIGJvb2xlYW4gaXNBdmFpbGFibGUgPSBmYWxzZTsKKyAgICAgICAgSW50ZW50RmlsdGVyIGludGVudEZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKKyAgICAgICAgaW50ZW50RmlsdGVyLmFkZEFjdGlvbihXaWZpTWFuYWdlci5XSUZJX1NDQU5fQVZBSUxBQkxFKTsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG1Db250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIobnVsbCwgaW50ZW50RmlsdGVyKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChpbnRlbnQpOworICAgICAgICBpZiAoaW50ZW50LmdldEFjdGlvbigpLmVxdWFscyhXaWZpTWFuYWdlci5XSUZJX1NDQU5fQVZBSUxBQkxFKSkgeworICAgICAgICAgICAgaW50IHN0YXRlID0gaW50ZW50LmdldEludEV4dHJhKAorICAgICAgICAgICAgICAgICAgICBXaWZpTWFuYWdlci5FWFRSQV9TQ0FOX0FWQUlMQUJMRSwgV2lmaU1hbmFnZXIuV0lGSV9TVEFURV9VTktOT1dOKTsKKyAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBXaWZpTWFuYWdlci5XSUZJX1NUQVRFX0VOQUJMRUQpIHsKKyAgICAgICAgICAgICAgICBpc0F2YWlsYWJsZSA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09IFdpZmlNYW5hZ2VyLldJRklfU1RBVEVfRElTQUJMRUQpIHsKKyAgICAgICAgICAgICAgICBpc0F2YWlsYWJsZSA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBpc0F2YWlsYWJsZTsKKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgc3RhcnRTY2FuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobU15U3luYykgewogICAgICAgICAgICAgbU15U3luYy5leHBlY3RlZFN0YXRlID0gU1RBVEVfU0NBTk5JTkc7CkBAIC0yNDcsOCArMjY2LDcgQEAKICAgICAgKiAxLnJlY29ubmVjdAogICAgICAqIDIucmVhc3NvY2lhdGUKICAgICAgKiAzLmRpc2Nvbm5lY3QKLSAgICAgKiA0LnBpbmdTdXBwbGljYW50Ci0gICAgICogNS5zYXRydFNjYW4KKyAgICAgKiA0LmNyZWF0ZVdpZmlMb2NrCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdGVzdFdpZmlNYW5hZ2VyQWN0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBpZiAoIVdpZmlGZWF0dXJlLmlzV2lmaVN1cHBvcnRlZChnZXRDb250ZXh0KCkpKSB7CkBAIC0yNTgsMTAgKzI3NiwzMSBAQAogICAgICAgICBhc3NlcnRUcnVlKG1XaWZpTWFuYWdlci5yZWNvbm5lY3QoKSk7CiAgICAgICAgIGFzc2VydFRydWUobVdpZmlNYW5hZ2VyLnJlYXNzb2NpYXRlKCkpOwogICAgICAgICBhc3NlcnRUcnVlKG1XaWZpTWFuYWdlci5kaXNjb25uZWN0KCkpOworICAgICAgICBmaW5hbCBTdHJpbmcgVEFHID0gIlRlc3QiOworICAgICAgICBhc3NlcnROb3ROdWxsKG1XaWZpTWFuYWdlci5jcmVhdGVXaWZpTG9jayhUQUcpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtV2lmaU1hbmFnZXIuY3JlYXRlV2lmaUxvY2soV2lmaU1hbmFnZXIuV0lGSV9NT0RFX0ZVTEwsIFRBRykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3Qgd2lmaSBzY2FubmluZyB3aGVuIGxvY2F0aW9uIHNjYW4gaXMgdHVybmVkIG9mZi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2lmaU1hbmFnZXJTY2FuV2hlbldpZmlPZmZMb2NhdGlvblR1cm5lZE9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghV2lmaUZlYXR1cmUuaXNXaWZpU3VwcG9ydGVkKGdldENvbnRleHQoKSkpIHsKKyAgICAgICAgICAgIC8vIHNraXAgdGhlIHRlc3QgaWYgV2lGaSBpcyBub3Qgc3VwcG9ydGVkCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFoYXNMb2NhdGlvbkZlYXR1cmUoKSkgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiU2tpcHBpbmcgdGVzdCBhcyBsb2NhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFpc0xvY2F0aW9uRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBmYWlsKCJQbGVhc2UgZW5hYmxlIGxvY2F0aW9uIGZvciB0aGlzIHRlc3QgLSBzaW5jZSBNYXJzaG1hbGxvdyBXaUZpIHNjYW4gcmVzdWx0cyBhcmUiCisgICAgICAgICAgICAgICAgICAgICsgIiBlbXB0eSB3aGVuIGxvY2F0aW9uIGlzIGRpc2FibGVkISIpOworICAgICAgICB9CiAgICAgICAgIHNldFdpZmlFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgc3RhcnRTY2FuKCk7CiAgICAgICAgIFRocmVhZC5zbGVlcChEVVJBVElPTik7Ci0gICAgICAgIGlmIChtV2lmaU1hbmFnZXIuaXNTY2FuQWx3YXlzQXZhaWxhYmxlKCkpIHsKKyAgICAgICAgc3RhcnRTY2FuKCk7CisgICAgICAgIGlmIChtV2lmaU1hbmFnZXIuaXNTY2FuQWx3YXlzQXZhaWxhYmxlKCkgJiYgaXNTY2FuQ3VycmVudGx5QXZhaWxhYmxlKCkpIHsKICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBhdCBsZWFzdCBvbmUgQVAgaXMgZm91bmQuCiAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJtU2NhblJlc3VsdCBzaG91bGQgbm90IGJlIG51bGwhIiwgbVNjYW5SZXN1bHRzKTsKICAgICAgICAgICAgIGFzc2VydEZhbHNlKCJlbXB0eSBzY2FuIHJlc3VsdHMhIiwgbVNjYW5SZXN1bHRzLmlzRW1wdHkoKSk7CkBAIC01ODgsNyArNjI3LDYgQEAKICAgICAgKgogICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCiAgICAgICovCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuNC4yLjQvQy0xLTEsQy0xLTIsQy0yLTEiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRQYXNzcG9pbnRDb25maWdXaXRoVXNlckNyZWRlbnRpYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFXaWZpRmVhdHVyZS5pc1dpZmlTdXBwb3J0ZWQoZ2V0Q29udGV4dCgpKSkgewogICAgICAgICAgICAgLy8gc2tpcCB0aGUgdGVzdCBpZiBXaUZpIGlzIG5vdCBzdXBwb3J0ZWQKQEAgLTYwMyw3ICs2NDEsNiBAQAogICAgICAqCiAgICAgICogQHRocm93cyBFeGNlcHRpb24KICAgICAgKi8KLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iNy40LjIuNC9DLTEtMSxDLTEtMixDLTItMSIpCiAgICAgcHVibGljIHZvaWQgdGVzdEFkZFBhc3Nwb2ludENvbmZpZ1dpdGhDZXJ0Q3JlZGVudGlhbCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBpZiAoIVdpZmlGZWF0dXJlLmlzV2lmaVN1cHBvcnRlZChnZXRDb250ZXh0KCkpKSB7CiAgICAgICAgICAgICAvLyBza2lwIHRoZSB0ZXN0IGlmIFdpRmkgaXMgbm90IHN1cHBvcnRlZApAQCAtNjE4LDcgKzY1NSw2IEBACiAgICAgICoKICAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgogICAgICAqLwotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjQuMi40L0MtMS0xLEMtMS0yLEMtMi0xIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkUGFzc3BvaW50Q29uZmlnV2l0aFNpbUNyZWRlbnRpYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFXaWZpRmVhdHVyZS5pc1dpZmlTdXBwb3J0ZWQoZ2V0Q29udGV4dCgpKSkgewogICAgICAgICAgICAgLy8gc2tpcCB0aGUgdGVzdCBpZiBXaUZpIGlzIG5vdCBzdXBwb3J0ZWQKQEAgLTgzOCw2ICs4NzQsMTUgQEAKIAogICAgICAgICBUZXN0TG9jYWxPbmx5SG90c3BvdENhbGxiYWNrIGNhbGxiYWNrID0gc3RhcnRMb2NhbE9ubHlIb3RzcG90KCk7CiAKKyAgICAgICAgLy8gYWRkIHNsZWVwIHRvIGF2b2lkIGNhbGxpbmcgc3RvcExvY2FsT25seUhvdHNwb3QgYmVmb3JlIFRldGhlckNvbnRyb2xsZXIgaW5pdGlhbGl6YXRpb24uCisgICAgICAgIC8vIFRPRE86IHJlbW92ZSB0aGlzIHNsZWVwIGFzIHNvb24gYXMgYi8xMjQzMzAwODkgaXMgZml4ZWQuCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJTbGVlcCBmb3IgMiBzZWNvbmRzIik7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMjAwMCk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIlRocmVhZCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiEiKTsKKyAgICAgICAgfQorCiAgICAgICAgIHN0b3BMb2NhbE9ubHlIb3RzcG90KGNhbGxiYWNrLCB3aWZpRW5hYmxlZCk7CiAKICAgICAgICAgLy8gd2lmaSBzaG91bGQgZWl0aGVyIHN0YXkgb24sIG9yIGNvbWUgYmFjayBvbgpAQCAtOTEzLDYgKzk1OCwxNSBAQAogICAgICAgICB9CiAgICAgICAgIGFzc2VydFRydWUoY2F1Z2h0RXhjZXB0aW9uKTsKIAorICAgICAgICAvLyBhZGQgc2xlZXAgdG8gYXZvaWQgY2FsbGluZyBzdG9wTG9jYWxPbmx5SG90c3BvdCBiZWZvcmUgVGV0aGVyQ29udHJvbGxlciBpbml0aWFsaXphdGlvbi4KKyAgICAgICAgLy8gVE9ETzogcmVtb3ZlIHRoaXMgc2xlZXAgYXMgc29vbiBhcyBiLzEyNDMzMDA4OSBpcyBmaXhlZC4KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIlNsZWVwIGZvciAyIHNlY29uZHMiKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcCgyMDAwKTsKKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiVGhyZWFkIEludGVycnVwdGVkRXhjZXB0aW9uISIpOworICAgICAgICB9CisKICAgICAgICAgc3RvcExvY2FsT25seUhvdHNwb3QoY2FsbGJhY2ssIHdpZmlFbmFibGVkKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9uZXQvc3JjL2FuZHJvaWQvbmV0L3dpZmkvY3RzL1dpZmlNYW5hZ2VyX1dpZmlMb2NrVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvbmV0L3NyYy9hbmRyb2lkL25ldC93aWZpL2N0cy9XaWZpTWFuYWdlcl9XaWZpTG9ja1Rlc3QuamF2YQppbmRleCBhZWIxMjM0Li4zY2RkNTZhIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9uZXQvc3JjL2FuZHJvaWQvbmV0L3dpZmkvY3RzL1dpZmlNYW5hZ2VyX1dpZmlMb2NrVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL25ldC9zcmMvYW5kcm9pZC9uZXQvd2lmaS9jdHMvV2lmaU1hbmFnZXJfV2lmaUxvY2tUZXN0LmphdmEKQEAgLTIxLDkgKzIxLDYgQEAKIGltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldpZmlMb2NrOwogaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNkZFRlc3Q7Ci0KLUBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjQuMi9DLTEtMSIpCiBwdWJsaWMgY2xhc3MgV2lmaU1hbmFnZXJfV2lmaUxvY2tUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXSUZJX1RBRyA9ICJXaWZpTWFuYWdlcl9XaWZpTG9ja1Rlc3QiOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbmV0L3NyYy9hbmRyb2lkL25ldC93aWZpL3J0dC9PV05FUlMgYi90ZXN0cy90ZXN0cy9uZXQvc3JjL2FuZHJvaWQvbmV0L3dpZmkvcnR0L09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWZjNDdmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvbmV0L3NyYy9hbmRyb2lkL25ldC93aWZpL3J0dC9PV05FUlMKQEAgLTAsMCArMSwyIEBACitldGFuY29oZW5AZ29vZ2xlLmNvbQorc2F0a0Bnb29nbGUuY29tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbmV0L3NyYy9hbmRyb2lkL25ldC93aWZpL3J0dC9jdHMvVGVzdEJhc2UuamF2YSBiL3Rlc3RzL3Rlc3RzL25ldC9zcmMvYW5kcm9pZC9uZXQvd2lmaS9ydHQvY3RzL1Rlc3RCYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdlYTJhNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL25ldC9zcmMvYW5kcm9pZC9uZXQvd2lmaS9ydHQvY3RzL1Rlc3RCYXNlLmphdmEKQEAgLTAsMCArMSwyMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubmV0LndpZmkucnR0LmN0czsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uTG9jYXRpb25NYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuU2NhblJlc3VsdDsKK2ltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubmV0LndpZmkucnR0LlJhbmdpbmdSZXN1bHQ7CitpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5ydHQuUmFuZ2luZ1Jlc3VsdENhbGxiYWNrOworaW1wb3J0IGFuZHJvaWQubmV0LndpZmkucnR0LldpZmlSdHRNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXJFeGVjdXRvcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXJUaHJlYWQ7CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIFdpLUZpIFJUVCBDVFMgdGVzdCBjYXNlcy4gUHJvdmlkZXMgYSB1bmlmb3JtIGNvbmZpZ3VyYXRpb24gYW5kIGV2ZW50IG1hbmFnZW1lbnQKKyAqIGZhY2lsaXR5LgorICovCitwdWJsaWMgY2xhc3MgVGVzdEJhc2UgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJXaWZpUnR0Q3RzVGVzdHMiOworCisgICAgLy8gd2FpdCBmb3IgV2ktRmkgUlRUIHRvIGJlY29tZSBhdmFpbGFibGUKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0FJVF9GT1JfUlRUX0NIQU5HRV9TRUNTID0gMTA7CisKKyAgICAvLyB3YWl0IGZvciBXaS1GaSBzY2FuIHJlc3VsdHMgdG8gYmVjb21lIGF2YWlsYWJsZQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXQUlUX0ZPUl9TQ0FOX1JFU1VMVFNfU0VDUyA9IDIwOworCisgICAgcHJvdGVjdGVkIFdpZmlSdHRNYW5hZ2VyIG1XaWZpUnR0TWFuYWdlcjsKKyAgICBwcm90ZWN0ZWQgV2lmaU1hbmFnZXIgbVdpZmlNYW5hZ2VyOworICAgIHByaXZhdGUgTG9jYXRpb25NYW5hZ2VyIG1Mb2NhdGlvbk1hbmFnZXI7CisgICAgcHJpdmF0ZSBXaWZpTWFuYWdlci5XaWZpTG9jayBtV2lmaUxvY2s7CisKKyAgICBwcml2YXRlIGZpbmFsIEhhbmRsZXJUaHJlYWQgbUhhbmRsZXJUaHJlYWQgPSBuZXcgSGFuZGxlclRocmVhZCgiU2luZ2xlRGV2aWNlVGVzdCIpOworICAgIHByb3RlY3RlZCBmaW5hbCBFeGVjdXRvciBtRXhlY3V0b3I7CisgICAgeworICAgICAgICBtSGFuZGxlclRocmVhZC5zdGFydCgpOworICAgICAgICBtRXhlY3V0b3IgPSBuZXcgSGFuZGxlckV4ZWN1dG9yKG5ldyBIYW5kbGVyKG1IYW5kbGVyVGhyZWFkLmdldExvb3BlcigpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCBXaS1GaSBSVFQgc2hvdWxkIGJlIHRlc3RlZC4gV2ktRmkgUlRUCisgICAgICogc2hvdWxkIGJlIHRlc3RlZCBpZiB0aGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgb24gdGhlIGN1cnJlbnQgZGV2aWNlLgorICAgICAqLworICAgIHN0YXRpYyBib29sZWFuIHNob3VsZFRlc3RXaWZpUnR0KENvbnRleHQgY29udGV4dCkgeworICAgICAgICBmaW5hbCBQYWNrYWdlTWFuYWdlciBwbSA9IGNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKTsKKyAgICAgICAgcmV0dXJuIHBtLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9XSUZJX1JUVCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKworICAgICAgICBpZiAoIXNob3VsZFRlc3RXaWZpUnR0KGdldENvbnRleHQoKSkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1Mb2NhdGlvbk1hbmFnZXIgPSAoTG9jYXRpb25NYW5hZ2VyKSBnZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZSgKKyAgICAgICAgICAgICAgICBDb250ZXh0LkxPQ0FUSU9OX1NFUlZJQ0UpOworICAgICAgICBhc3NlcnRUcnVlKCJSVFQgdGVzdGluZyByZXF1aXJlcyBMb2NhdGlvbiB0byBiZSBlbmFibGVkIiwKKyAgICAgICAgICAgICAgICBtTG9jYXRpb25NYW5hZ2VyLmlzTG9jYXRpb25FbmFibGVkKCkpOworCisgICAgICAgIG1XaWZpUnR0TWFuYWdlciA9IChXaWZpUnR0TWFuYWdlcikgZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoCisgICAgICAgICAgICAgICAgQ29udGV4dC5XSUZJX1JUVF9SQU5HSU5HX1NFUlZJQ0UpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJXaS1GaSBSVFQgTWFuYWdlciIsIG1XaWZpUnR0TWFuYWdlcik7CisKKyAgICAgICAgbVdpZmlNYW5hZ2VyID0gKFdpZmlNYW5hZ2VyKSBnZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LldJRklfU0VSVklDRSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoIldpLUZpIE1hbmFnZXIiLCBtV2lmaU1hbmFnZXIpOworICAgICAgICBtV2lmaUxvY2sgPSBtV2lmaU1hbmFnZXIuY3JlYXRlV2lmaUxvY2soVEFHKTsKKyAgICAgICAgbVdpZmlMb2NrLmFjcXVpcmUoKTsKKyAgICAgICAgaWYgKCFtV2lmaU1hbmFnZXIuaXNXaWZpRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBtV2lmaU1hbmFnZXIuc2V0V2lmaUVuYWJsZWQodHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBJbnRlbnRGaWx0ZXIgaW50ZW50RmlsdGVyID0gbmV3IEludGVudEZpbHRlcigpOworICAgICAgICBpbnRlbnRGaWx0ZXIuYWRkQWN0aW9uKFdpZmlSdHRNYW5hZ2VyLkFDVElPTl9XSUZJX1JUVF9TVEFURV9DSEFOR0VEKTsKKyAgICAgICAgV2lmaVJ0dEJyb2FkY2FzdFJlY2VpdmVyIHJlY2VpdmVyID0gbmV3IFdpZmlSdHRCcm9hZGNhc3RSZWNlaXZlcigpOworICAgICAgICBtQ29udGV4dC5yZWdpc3RlclJlY2VpdmVyKHJlY2VpdmVyLCBpbnRlbnRGaWx0ZXIpOworICAgICAgICBpZiAoIW1XaWZpUnR0TWFuYWdlci5pc0F2YWlsYWJsZSgpKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJUaW1lb3V0IHdhaXRpbmcgZm9yIFdpLUZpIFJUVCB0byBjaGFuZ2Ugc3RhdHVzIiwKKyAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZXIud2FpdEZvclN0YXRlQ2hhbmdlKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiV2ktRmkgUlRUIGlzIG5vdCBhdmFpbGFibGUgKHNob3VsZCBiZSkiLCBtV2lmaVJ0dE1hbmFnZXIuaXNBdmFpbGFibGUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIXNob3VsZFRlc3RXaWZpUnR0KGdldENvbnRleHQoKSkpIHsKKyAgICAgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworICAgIGNsYXNzIFdpZmlSdHRCcm9hZGNhc3RSZWNlaXZlciBleHRlbmRzIEJyb2FkY2FzdFJlY2VpdmVyIHsKKyAgICAgICAgcHJpdmF0ZSBDb3VudERvd25MYXRjaCBtQmxvY2tlciA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgaWYgKFdpZmlSdHRNYW5hZ2VyLkFDVElPTl9XSUZJX1JUVF9TVEFURV9DSEFOR0VELmVxdWFscyhpbnRlbnQuZ2V0QWN0aW9uKCkpKSB7CisgICAgICAgICAgICAgICAgbUJsb2NrZXIuY291bnREb3duKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIHdhaXRGb3JTdGF0ZUNoYW5nZSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gbUJsb2NrZXIuYXdhaXQoV0FJVF9GT1JfUlRUX0NIQU5HRV9TRUNTLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIFdpZmlTY2Fuc0Jyb2FkY2FzdFJlY2VpdmVyIGV4dGVuZHMgQnJvYWRjYXN0UmVjZWl2ZXIgeworICAgICAgICBwcml2YXRlIENvdW50RG93bkxhdGNoIG1CbG9ja2VyID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICBpZiAoV2lmaU1hbmFnZXIuU0NBTl9SRVNVTFRTX0FWQUlMQUJMRV9BQ1RJT04uZXF1YWxzKGludGVudC5nZXRBY3Rpb24oKSkpIHsKKyAgICAgICAgICAgICAgICBtQmxvY2tlci5jb3VudERvd24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gd2FpdEZvclN0YXRlQ2hhbmdlKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBtQmxvY2tlci5hd2FpdChXQUlUX0ZPUl9TQ0FOX1JFU1VMVFNfU0VDUywgVGltZVVuaXQuU0VDT05EUyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBSZXN1bHRDYWxsYmFjayBleHRlbmRzIFJhbmdpbmdSZXN1bHRDYWxsYmFjayB7CisgICAgICAgIHByaXZhdGUgQ291bnREb3duTGF0Y2ggbUJsb2NrZXIgPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgICAgIHByaXZhdGUgaW50IG1Db2RlOyAvLyAwOiBzdWNjZXNzLCBvdGhlcndpc2UgUmFuZ2luZ1Jlc3VsdENhbGxiYWNrIFNUQVRVU19DT0RFXyouCisgICAgICAgIHByaXZhdGUgTGlzdDxSYW5naW5nUmVzdWx0PiBtUmVzdWx0czsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25SYW5naW5nRmFpbHVyZShpbnQgY29kZSkgeworICAgICAgICAgICAgbUNvZGUgPSBjb2RlOworICAgICAgICAgICAgbVJlc3VsdHMgPSBudWxsOyAvLyBub3QgbmVjZXNzYXJ5IHNpbmNlIGludGlhbGl6ZWQgdG8gbnVsbCAtIGJ1dCBmb3IgY29tcGxldGVuZXNzCisgICAgICAgICAgICBtQmxvY2tlci5jb3VudERvd24oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJhbmdpbmdSZXN1bHRzKExpc3Q8UmFuZ2luZ1Jlc3VsdD4gcmVzdWx0cykgeworICAgICAgICAgICAgbUNvZGUgPSAwOyAvLyBub3QgbmVjZXNzYXJ5IHNpbmNlIGluaXRpYWxpemVkIHRvIDAgLSBidXQgZm9yIGNvbXBsZXRlbmVzcworICAgICAgICAgICAgbVJlc3VsdHMgPSByZXN1bHRzOworICAgICAgICAgICAgbUJsb2NrZXIuY291bnREb3duKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogV2FpdHMgZm9yIHRoZSBsaXN0ZW5lciBjYWxsYmFjayB0byBiZSBjYWxsZWQgLSBvciBhbiBlcnJvciAodGltZW91dCwgaW50ZXJydXB0aW9uKS4KKyAgICAgICAgICogUmV0dXJucyB0cnVlIG9uIGNhbGxiYWNrIGNhbGxlZCwgZmFsc2Ugb24gZXJyb3IgKHRpbWVvdXQsIGludGVycnVwdGlvbikuCisgICAgICAgICAqLworICAgICAgICBib29sZWFuIHdhaXRGb3JDYWxsYmFjaygpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gbUJsb2NrZXIuYXdhaXQoV0FJVF9GT1JfUlRUX0NIQU5HRV9TRUNTLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBjb2RlIG9mIHRoZSBjYWxsYmFjayBvcGVyYXRpb24uIFdpbGwgYmUgMCBmb3Igc3VjY2VzcyAob25SYW5naW5nUmVzdWx0cworICAgICAgICAgKiBjYWxsZWQpLCBlbHNlIChpZiBvblJhbmdpbmdGYWlsdXJlIGNhbGxlZCkgd2lsbCBiZSBvbmUgb2YgdGhlIFNUQVRVU19DT0RFXyogdmFsdWVzLgorICAgICAgICAgKi8KKyAgICAgICAgaW50IGdldENvZGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbUNvZGU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiByYW5naW5nIHJlc3VsdHMuIEluIGNhc2VzIG9mIGVycm9yIChnZXRDb2RlKCkgIT0gMCkgd2lsbCByZXR1cm4gbnVsbC4KKyAgICAgICAgICovCisgICAgICAgIExpc3Q8UmFuZ2luZ1Jlc3VsdD4gZ2V0UmVzdWx0cygpIHsKKyAgICAgICAgICAgIHJldHVybiBtUmVzdWx0czsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IGEgc2NhbiBhbmQgcmV0dXJuIGEgbGlzdCBvZiBvYnNlcnZlZCBTY2FuUmVzdWx0cyAoQVBzKS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTGlzdDxTY2FuUmVzdWx0PiBzY2FuQXBzKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgSW50ZW50RmlsdGVyIGludGVudEZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKKyAgICAgICAgaW50ZW50RmlsdGVyLmFkZEFjdGlvbihXaWZpTWFuYWdlci5TQ0FOX1JFU1VMVFNfQVZBSUxBQkxFX0FDVElPTik7CisgICAgICAgIFdpZmlTY2Fuc0Jyb2FkY2FzdFJlY2VpdmVyIHJlY2VpdmVyID0gbmV3IFdpZmlTY2Fuc0Jyb2FkY2FzdFJlY2VpdmVyKCk7CisgICAgICAgIG1Db250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIocmVjZWl2ZXIsIGludGVudEZpbHRlcik7CisKKyAgICAgICAgbVdpZmlNYW5hZ2VyLnN0YXJ0U2NhbigpOworICAgICAgICByZWNlaXZlci53YWl0Rm9yU3RhdGVDaGFuZ2UoKTsKKyAgICAgICAgbUNvbnRleHQudW5yZWdpc3RlclJlY2VpdmVyKHJlY2VpdmVyKTsKKyAgICAgICAgcmV0dXJuIG1XaWZpTWFuYWdlci5nZXRTY2FuUmVzdWx0cygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IGEgc2NhbiBhbmQgcmV0dXJuIGEgdGVzdCBBUCB3aGljaCBzdXBwb3J0cyBJRUVFIDgwMi4xMW1jIGFuZCB3aGljaCBoYXMgdGhlIGhpZ2hlc3QKKyAgICAgKiBSU1NJLiBXaWxsIHBlcmZvcm0gTiAocGFyYW1ldGVyaXplZCkgc2NhbnMgYW5kIGdldCB0aGUgYmVzdCBBUCBhY3Jvc3MgYm90aCBzY2Fucy4KKyAgICAgKgorICAgICAqIFJldHVybnMgbnVsbCBpZiB0ZXN0IEFQIGlzIG5vdCBmb3VuZCBpbiB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBzY2Fucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBudW1TY2FuUmV0cmllcyBNYXhpbXVtIG51bWJlciBvZiBzY2FucyByZXRyaWVzIChpbiBhZGRpdGlvbiB0byBmaXJzdCBzY2FuKS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU2NhblJlc3VsdCBzY2FuRm9yVGVzdEFwKGludCBudW1TY2FuUmV0cmllcykKKyAgICAgICAgICAgIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGludCBzY2FuQ291bnQgPSAwOworICAgICAgICBTY2FuUmVzdWx0IGJlc3RUZXN0QXAgPSBudWxsOworICAgICAgICB3aGlsZSAoc2NhbkNvdW50IDw9IG51bVNjYW5SZXRyaWVzKSB7CisgICAgICAgICAgICBmb3IgKFNjYW5SZXN1bHQgc2NhblJlc3VsdCA6IHNjYW5BcHMoKSkgeworICAgICAgICAgICAgICAgIGlmICghc2NhblJlc3VsdC5pczgwMjExbWNSZXNwb25kZXIoKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGJlc3RUZXN0QXAgPT0gbnVsbCB8fCBzY2FuUmVzdWx0LmxldmVsID4gYmVzdFRlc3RBcC5sZXZlbCkgeworICAgICAgICAgICAgICAgICAgICBiZXN0VGVzdEFwID0gc2NhblJlc3VsdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNjYW5Db3VudCsrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGJlc3RUZXN0QXA7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbmV0L3NyYy9hbmRyb2lkL25ldC93aWZpL3J0dC9jdHMvV2lmaVJ0dFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL25ldC9zcmMvYW5kcm9pZC9uZXQvd2lmaS9ydHQvY3RzL1dpZmlSdHRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRhMGMzZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL25ldC9zcmMvYW5kcm9pZC9uZXQvd2lmaS9ydHQvY3RzL1dpZmlSdHRUZXN0LmphdmEKQEAgLTAsMCArMSwyMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubmV0LndpZmkucnR0LmN0czsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5TY2FuUmVzdWx0OworaW1wb3J0IGFuZHJvaWQubmV0LndpZmkucnR0LlJhbmdpbmdSZXF1ZXN0OworaW1wb3J0IGFuZHJvaWQubmV0LndpZmkucnR0LlJhbmdpbmdSZXN1bHQ7CitpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5ydHQuV2lmaVJ0dE1hbmFnZXI7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkRldmljZVJlcG9ydExvZzsKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlJlc3VsdFR5cGU7CitpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5SZXN1bHRVbml0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFdpLUZpIFJUVCBDVFMgdGVzdDogcmFuZ2UgdG8gYWxsIGF2YWlsYWJsZSBBY2Nlc3MgUG9pbnRzIHdoaWNoIHN1cHBvcnQgSUVFRSA4MDIuMTFtYy4KKyAqLworcHVibGljIGNsYXNzIFdpZmlSdHRUZXN0IGV4dGVuZHMgVGVzdEJhc2UgeworICAgIC8vIE51bWJlciBvZiBzY2FucyB0byBkbyB3aGlsZSBzZWFyY2hpbmcgZm9yIEFQcyBzdXBwb3J0aW5nIElFRUUgODAyLjExbWMKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTlVNX1NDQU5TX1NFQVJDSElOR19GT1JfSUVFRTgwMjExTUNfQVAgPSAyOworCisgICAgLy8gTnVtYmVyIG9mIFJUVCBtZWFzdXJlbWVudHMgcGVyIEFQCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5VTV9PRl9SVFRfSVRFUkFUSU9OUyA9IDEwOworCisgICAgLy8gTWF4aW11bSBmYWlsdXJlIHJhdGUgb2YgUlRUIG1lYXN1cmVtZW50cyAocGVyY2VudGFnZSkKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0ZBSUxVUkVfUkFURV9QRVJDRU5UID0gMTA7CisKKyAgICAvLyBNYXhpbXVtIHZhcmlhdGlvbiBmcm9tIHRoZSBhdmVyYWdlIG1lYXN1cmVtZW50IChtZWFzdXJlcyBjb25zaXN0ZW5jeSkKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1ZBUklBVElPTl9GUk9NX0FWRVJBR0VfRElTVEFOQ0VfTU0gPSAxMDAwOworCisgICAgLy8gTWluaW11bSB2YWxpZCBSU1NJIHZhbHVlCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1JTl9WQUxJRF9SU1NJID0gLTEwMDsKKworICAgIC8qKgorICAgICAqIFRlc3QgV2ktRmkgUlRUIHJhbmdpbmcgb3BlcmF0aW9uOgorICAgICAqIC0gU2NhbiBmb3IgdmlzaWJsZSBBUHMgZm9yIHRoZSB0ZXN0IEFQICh3aGljaCBpcyB2YWxpZGF0ZWQgdG8gc3VwcG9ydCBJRUVFIDgwMi4xMW1jKQorICAgICAqIC0gUGVyZm9ybSBOIChjb25zdGFudCkgUlRUIG9wZXJhdGlvbnMKKyAgICAgKiAtIFZhbGlkYXRlOgorICAgICAqICAgLSBGYWlsdXJlIHJhdGlvIDwgdGhyZXNob2xkIChjb25zdGFudCkKKyAgICAgKiAgIC0gUmVzdWx0IG1hcmdpbiA8IHRocmVzaG9sZCAoY29uc3RhbnQpCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFJhbmdpbmdUb1Rlc3RBcCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghc2hvdWxkVGVzdFdpZmlSdHQoZ2V0Q29udGV4dCgpKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2NhbiBmb3IgSUVFRSA4MDIuMTFtYyBzdXBwb3J0aW5nIEFQcworICAgICAgICBTY2FuUmVzdWx0IHRlc3RBcCA9IHNjYW5Gb3JUZXN0QXAoTlVNX1NDQU5TX1NFQVJDSElOR19GT1JfSUVFRTgwMjExTUNfQVApOworICAgICAgICBhc3NlcnRUcnVlKCJDYW5ub3QgZmluZCB0ZXN0IEFQIiwgdGVzdEFwICE9IG51bGwpOworCisgICAgICAgIC8vIFBlcmZvcm0gUlRUIG9wZXJhdGlvbnMKKyAgICAgICAgUmFuZ2luZ1JlcXVlc3QgcmVxdWVzdCA9IG5ldyBSYW5naW5nUmVxdWVzdC5CdWlsZGVyKCkuYWRkQWNjZXNzUG9pbnQodGVzdEFwKS5idWlsZCgpOworICAgICAgICBMaXN0PFJhbmdpbmdSZXN1bHQ+IGFsbFJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgaW50IG51bUZhaWx1cmVzID0gMDsKKyAgICAgICAgaW50IGRpc3RhbmNlU3VtID0gMDsKKyAgICAgICAgaW50IGRpc3RhbmNlTWluID0gMDsKKyAgICAgICAgaW50IGRpc3RhbmNlTWF4ID0gMDsKKyAgICAgICAgaW50W10gc3RhdHVzZXMgPSBuZXcgaW50W05VTV9PRl9SVFRfSVRFUkFUSU9OU107CisgICAgICAgIGludFtdIGRpc3RhbmNlTW1zID0gbmV3IGludFtOVU1fT0ZfUlRUX0lURVJBVElPTlNdOworICAgICAgICBpbnRbXSBkaXN0YW5jZVN0ZERldk1tcyA9IG5ldyBpbnRbTlVNX09GX1JUVF9JVEVSQVRJT05TXTsKKyAgICAgICAgaW50W10gcnNzaXMgPSBuZXcgaW50W05VTV9PRl9SVFRfSVRFUkFUSU9OU107CisgICAgICAgIGludFtdIG51bUF0dGVtcHRlZCA9IG5ldyBpbnRbTlVNX09GX1JUVF9JVEVSQVRJT05TXTsKKyAgICAgICAgaW50W10gbnVtU3VjY2Vzc2Z1bCA9IG5ldyBpbnRbTlVNX09GX1JUVF9JVEVSQVRJT05TXTsKKyAgICAgICAgbG9uZ1tdIHRpbWVzdGFtcHNNcyA9IG5ldyBsb25nW05VTV9PRl9SVFRfSVRFUkFUSU9OU107CisgICAgICAgIGJ5dGVbXSBsYXN0TGNpID0gbnVsbDsKKyAgICAgICAgYnl0ZVtdIGxhc3RMY3IgPSBudWxsOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9PRl9SVFRfSVRFUkFUSU9OUzsgKytpKSB7CisgICAgICAgICAgICBSZXN1bHRDYWxsYmFjayBjYWxsYmFjayA9IG5ldyBSZXN1bHRDYWxsYmFjaygpOworICAgICAgICAgICAgbVdpZmlSdHRNYW5hZ2VyLnN0YXJ0UmFuZ2luZyhyZXF1ZXN0LCBtRXhlY3V0b3IsIGNhbGxiYWNrKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIldpLUZpIFJUVCByZXN1bHRzOiBubyBjYWxsYmFjayBvbiBpdGVyYXRpb24gIiArIGksCisgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLndhaXRGb3JDYWxsYmFjaygpKTsKKworICAgICAgICAgICAgTGlzdDxSYW5naW5nUmVzdWx0PiBjdXJyZW50UmVzdWx0cyA9IGNhbGxiYWNrLmdldFJlc3VsdHMoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIldpLUZpIFJUVCByZXN1bHRzOiBudWxsIHJlc3VsdHMgKG9uUmFuZ2luZ0ZhaWx1cmUpIG9uIGl0ZXJhdGlvbiAiICsgaSwKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudFJlc3VsdHMgIT0gbnVsbCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJXaS1GaSBSVFQgcmVzdWx0czogdW5leHBlY3RlZCAjIG9mIHJlc3VsdHMgKGV4cGVjdCAxKSBvbiBpdGVyYXRpb24gIiArIGksCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRSZXN1bHRzLnNpemUoKSA9PSAxKTsKKyAgICAgICAgICAgIFJhbmdpbmdSZXN1bHQgcmVzdWx0ID0gY3VycmVudFJlc3VsdHMuZ2V0KDApOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiV2ktRmkgUlRUIHJlc3VsdHM6IGludmFsaWQgcmVzdWx0ICh3cm9uZyBCU1NJRCkgZW50cnkgb24gaXRlcmF0aW9uICIgKyBpLAorICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0TWFjQWRkcmVzcygpLnRvU3RyaW5nKCkuZXF1YWxzKHRlc3RBcC5CU1NJRCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICAgICAiV2ktRmkgUlRUIHJlc3VsdHM6IGludmFsaWQgcmVzdWx0IChub24tbnVsbCBQZWVySGFuZGxlKSBlbnRyeSBvbiBpdGVyYXRpb24gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaSwgbnVsbCwgcmVzdWx0LmdldFBlZXJIYW5kbGUoKSk7CisKKyAgICAgICAgICAgIGFsbFJlc3VsdHMuYWRkKHJlc3VsdCk7CisgICAgICAgICAgICBpbnQgc3RhdHVzID0gcmVzdWx0LmdldFN0YXR1cygpOworICAgICAgICAgICAgc3RhdHVzZXNbaV0gPSBzdGF0dXM7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IFJhbmdpbmdSZXN1bHQuU1RBVFVTX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICBkaXN0YW5jZVN1bSArPSByZXN1bHQuZ2V0RGlzdGFuY2VNbSgpOworICAgICAgICAgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2VNaW4gPSByZXN1bHQuZ2V0RGlzdGFuY2VNbSgpOworICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZU1heCA9IHJlc3VsdC5nZXREaXN0YW5jZU1tKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2VNaW4gPSBNYXRoLm1pbihkaXN0YW5jZU1pbiwgcmVzdWx0LmdldERpc3RhbmNlTW0oKSk7CisgICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlTWF4ID0gTWF0aC5tYXgoZGlzdGFuY2VNYXgsIHJlc3VsdC5nZXREaXN0YW5jZU1tKCkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIldpLUZpIFJUVCByZXN1bHRzOiBpbnZhbGlkIFJTU0kgb24gaXRlcmF0aW9uICIgKyBpLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldFJzc2koKSA+PSBNSU5fVkFMSURfUlNTSSk7CisKKyAgICAgICAgICAgICAgICBkaXN0YW5jZU1tc1tpIC0gbnVtRmFpbHVyZXNdID0gcmVzdWx0LmdldERpc3RhbmNlTW0oKTsKKyAgICAgICAgICAgICAgICBkaXN0YW5jZVN0ZERldk1tc1tpIC0gbnVtRmFpbHVyZXNdID0gcmVzdWx0LmdldERpc3RhbmNlU3RkRGV2TW0oKTsKKyAgICAgICAgICAgICAgICByc3Npc1tpIC0gbnVtRmFpbHVyZXNdID0gcmVzdWx0LmdldFJzc2koKTsKKyAgICAgICAgICAgICAgICBudW1BdHRlbXB0ZWRbaSAtIG51bUZhaWx1cmVzXSA9IHJlc3VsdC5nZXROdW1BdHRlbXB0ZWRNZWFzdXJlbWVudHMoKTsKKyAgICAgICAgICAgICAgICBudW1TdWNjZXNzZnVsW2kgLSBudW1GYWlsdXJlc10gPSByZXN1bHQuZ2V0TnVtU3VjY2Vzc2Z1bE1lYXN1cmVtZW50cygpOworICAgICAgICAgICAgICAgIHRpbWVzdGFtcHNNc1tpIC0gbnVtRmFpbHVyZXNdID0gcmVzdWx0LmdldFJhbmdpbmdUaW1lc3RhbXBNaWxsaXMoKTsKKworICAgICAgICAgICAgICAgIGJ5dGVbXSBjdXJyZW50TGNpID0gcmVzdWx0LmdldExjaSgpOworICAgICAgICAgICAgICAgIGJ5dGVbXSBjdXJyZW50TGNyID0gcmVzdWx0LmdldExjcigpOworICAgICAgICAgICAgICAgIGlmIChpIC0gbnVtRmFpbHVyZXMgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIldpLUZpIFJUVCByZXN1bHRzOiBpbnZhbGlkIHJlc3VsdCAoTENJIG1pc21hdGNoKSBvbiBpdGVyYXRpb24gIiArIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmVxdWFscyhjdXJyZW50TGNpLCBsYXN0TGNpKSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIldpLUZpIFJUVCByZXN1bHRzOiBpbnZhbGlkIHJlc3VsdCAoTENSIG1pc21hdGNoKSBvbiBpdGVyYXRpb24gIiArIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmVxdWFscyhjdXJyZW50TGNyLCBsYXN0TGNyKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxhc3RMY2kgPSBjdXJyZW50TGNpOworICAgICAgICAgICAgICAgIGxhc3RMY3IgPSBjdXJyZW50TGNyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBudW1GYWlsdXJlcysrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gU2F2ZSByZXN1bHRzIHRvIGxvZworICAgICAgICBpbnQgbnVtR29vZFJlc3VsdHMgPSBOVU1fT0ZfUlRUX0lURVJBVElPTlMgLSBudW1GYWlsdXJlczsKKyAgICAgICAgRGV2aWNlUmVwb3J0TG9nIHJlcG9ydExvZyA9IG5ldyBEZXZpY2VSZXBvcnRMb2coVEFHLCAidGVzdFJhbmdpbmdUb1Rlc3RBcCIpOworICAgICAgICByZXBvcnRMb2cuYWRkVmFsdWVzKCJzdGF0dXNfY29kZXMiLCBzdGF0dXNlcywgUmVzdWx0VHlwZS5ORVVUUkFMLCBSZXN1bHRVbml0Lk5PTkUpOworICAgICAgICByZXBvcnRMb2cuYWRkVmFsdWVzKCJkaXN0YW5jZV9tbSIsIEFycmF5cy5jb3B5T2YoZGlzdGFuY2VNbXMsIG51bUdvb2RSZXN1bHRzKSwKKyAgICAgICAgICAgICAgICBSZXN1bHRUeXBlLk5FVVRSQUwsIFJlc3VsdFVuaXQuTk9ORSk7CisgICAgICAgIHJlcG9ydExvZy5hZGRWYWx1ZXMoImRpc3RhbmNlX3N0ZGRldl9tbSIsIEFycmF5cy5jb3B5T2YoZGlzdGFuY2VTdGREZXZNbXMsIG51bUdvb2RSZXN1bHRzKSwKKyAgICAgICAgICAgICAgICBSZXN1bHRUeXBlLk5FVVRSQUwsIFJlc3VsdFVuaXQuTk9ORSk7CisgICAgICAgIHJlcG9ydExvZy5hZGRWYWx1ZXMoInJzc2lfZGJtIiwgQXJyYXlzLmNvcHlPZihyc3NpcywgbnVtR29vZFJlc3VsdHMpLCBSZXN1bHRUeXBlLk5FVVRSQUwsCisgICAgICAgICAgICAgICAgUmVzdWx0VW5pdC5OT05FKTsKKyAgICAgICAgcmVwb3J0TG9nLmFkZFZhbHVlcygibnVtX2F0dGVtcHRlZCIsIEFycmF5cy5jb3B5T2YobnVtQXR0ZW1wdGVkLCBudW1Hb29kUmVzdWx0cyksCisgICAgICAgICAgICAgICAgUmVzdWx0VHlwZS5ORVVUUkFMLCBSZXN1bHRVbml0Lk5PTkUpOworICAgICAgICByZXBvcnRMb2cuYWRkVmFsdWVzKCJudW1fc3VjY2Vzc2Z1bCIsIEFycmF5cy5jb3B5T2YobnVtU3VjY2Vzc2Z1bCwgbnVtR29vZFJlc3VsdHMpLAorICAgICAgICAgICAgICAgIFJlc3VsdFR5cGUuTkVVVFJBTCwgUmVzdWx0VW5pdC5OT05FKTsKKyAgICAgICAgcmVwb3J0TG9nLmFkZFZhbHVlcygidGltZXN0YW1wcyIsIEFycmF5cy5jb3B5T2YodGltZXN0YW1wc01zLCBudW1Hb29kUmVzdWx0cyksCisgICAgICAgICAgICAgICAgUmVzdWx0VHlwZS5ORVVUUkFMLCBSZXN1bHRVbml0Lk5PTkUpOworICAgICAgICByZXBvcnRMb2cuc3VibWl0KCk7CisKKyAgICAgICAgLy8gQW5hbHl6ZSByZXN1bHRzCisgICAgICAgIGFzc2VydFRydWUoIldpLUZpIFJUVCBmYWlsdXJlIHJhdGUgZXhjZWVkcyB0aHJlc2hvbGQ6IEZBSUw9IiArIG51bUZhaWx1cmVzICsgIiwgSVRFUkFUSU9OUz0iCisgICAgICAgICAgICAgICAgICAgICAgICArIE5VTV9PRl9SVFRfSVRFUkFUSU9OUywKKyAgICAgICAgICAgICAgICBudW1GYWlsdXJlcyA8PSBOVU1fT0ZfUlRUX0lURVJBVElPTlMgKiBNQVhfRkFJTFVSRV9SQVRFX1BFUkNFTlQgLyAxMDApOworICAgICAgICBpZiAobnVtRmFpbHVyZXMgIT0gTlVNX09GX1JUVF9JVEVSQVRJT05TKSB7CisgICAgICAgICAgICBkb3VibGUgZGlzdGFuY2VBdmcgPSBkaXN0YW5jZVN1bSAvIChOVU1fT0ZfUlRUX0lURVJBVElPTlMgLSBudW1GYWlsdXJlcyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJXaS1GaSBSVFQ6IFZhcmlhdGlvbiAobWF4IGRpcmVjdGlvbikgZXhjZWVkcyB0aHJlc2hvbGQiLAorICAgICAgICAgICAgICAgICAgICAoZGlzdGFuY2VNYXggLSBkaXN0YW5jZUF2ZykgPD0gTUFYX1ZBUklBVElPTl9GUk9NX0FWRVJBR0VfRElTVEFOQ0VfTU0pOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiV2ktRmkgUlRUOiBWYXJpYXRpb24gKG1pbiBkaXJlY3Rpb24pIGV4Y2VlZHMgdGhyZXNob2xkIiwKKyAgICAgICAgICAgICAgICAgICAgKGRpc3RhbmNlQXZnIC0gZGlzdGFuY2VNaW4pIDw9IE1BWF9WQVJJQVRJT05fRlJPTV9BVkVSQUdFX0RJU1RBTkNFX01NKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtR29vZFJlc3VsdHM7ICsraSkgeworICAgICAgICAgICAgICAgIGFzc2VydE5vdFNhbWUoIk51bWJlciBvZiBhdHRlbXB0ZWQgbWVhc3VyZW1lbnRzIGlzIDAiLCAwLCBudW1BdHRlbXB0ZWRbaV0pOworICAgICAgICAgICAgICAgIGFzc2VydE5vdFNhbWUoIk51bWJlciBvZiBzdWNjZXNzZnVsIG1lYXN1cmVtZW50cyBpcyAwIiwgMCwgbnVtU3VjY2Vzc2Z1bFtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZSB0aGF0IHdoZW4gYSByZXF1ZXN0IGNvbnRhaW5zIG1vcmUgcmFuZ2Ugb3BlcmF0aW9ucyB0aGFuIGFsbG93ZWQgKGJ5IEFQSSkgdGhhdCB3ZQorICAgICAqIGdldCBhbiBleGNlcHRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFJlcXVlc3RUb29MYXJnZSgpIHsKKyAgICAgICAgaWYgKCFzaG91bGRUZXN0V2lmaVJ0dChnZXRDb250ZXh0KCkpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBTY2FuUmVzdWx0IGR1bW15ID0gbmV3IFNjYW5SZXN1bHQoKTsKKyAgICAgICAgZHVtbXkuQlNTSUQgPSAiMDA6MDE6MDI6MDM6MDQ6MDUiOworCisgICAgICAgIFJhbmdpbmdSZXF1ZXN0LkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBSYW5naW5nUmVxdWVzdC5CdWlsZGVyKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUmFuZ2luZ1JlcXVlc3QuZ2V0TWF4UGVlcnMoKSAtIDI7ICsraSkgeworICAgICAgICAgICAgYnVpbGRlci5hZGRBY2Nlc3NQb2ludChkdW1teSk7CisgICAgICAgIH0KKworICAgICAgICBMaXN0PFNjYW5SZXN1bHQ+IHNjYW5SZXN1bHRzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIHNjYW5SZXN1bHRzLmFkZChkdW1teSk7CisgICAgICAgIHNjYW5SZXN1bHRzLmFkZChkdW1teSk7CisgICAgICAgIHNjYW5SZXN1bHRzLmFkZChkdW1teSk7CisKKyAgICAgICAgYnVpbGRlci5hZGRBY2Nlc3NQb2ludHMoc2NhblJlc3VsdHMpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtV2lmaVJ0dE1hbmFnZXIuc3RhcnRSYW5naW5nKGJ1aWxkZXIuYnVpbGQoKSwgbUV4ZWN1dG9yLCBuZXcgUmVzdWx0Q2FsbGJhY2soKSk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgICJEaWQgbm90IHJlY2VpdmUgZXhwZWN0ZWQgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdoZW4gdHJpZWQgdG8gcmFuZ2UgdG8gdG9vICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIm1hbnkgcGVlcnMiLAorICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9uZXRzZWNwb2xpY3kvdXNlc2NsZWFydGV4dHRyYWZmaWMtZmFsc2UvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL25ldHNlY3BvbGljeS91c2VzY2xlYXJ0ZXh0dHJhZmZpYy1mYWxzZS9BbmRyb2lkLm1rCmluZGV4IDRjNjg0MjMuLjBjYjEyNjAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL25ldHNlY3BvbGljeS91c2VzY2xlYXJ0ZXh0dHJhZmZpYy1mYWxzZS9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3Rlc3RzL25ldHNlY3BvbGljeS91c2VzY2xlYXJ0ZXh0dHJhZmZpYy1mYWxzZS9BbmRyb2lkLm1rCkBAIC0yMSwxMCArMjEsMTAgQEAKIExPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCiAKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCi0gICAgY3RzdGVzdHJ1bm5lciBcCi0gICAgY3RzdGVzdHNlcnZlciBcCi0gICAgb3JnLmFwYWNoZS5odHRwLmxlZ2FjeSBcCi0gICAgbGVnYWN5LWFuZHJvaWQtdGVzdAorICAgIGN0c3Rlc3RydW5uZXItYXh0IFwKKyAgICBjdHN0ZXN0c2VydmVyCisKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IG9yZy5hcGFjaGUuaHR0cC5sZWdhY3kgYW5kcm9pZC50ZXN0LmJhc2Uuc3R1YnMKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjIGNvbW1vbikKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbmV0c2VjcG9saWN5L3VzZXNjbGVhcnRleHR0cmFmZmljLWZhbHNlL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy90ZXN0cy9uZXRzZWNwb2xpY3kvdXNlc2NsZWFydGV4dHRyYWZmaWMtZmFsc2UvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA0OTM4NWY4Li5hZWRmNzA4IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9uZXRzZWNwb2xpY3kvdXNlc2NsZWFydGV4dHRyYWZmaWMtZmFsc2UvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9uZXRzZWNwb2xpY3kvdXNlc2NsZWFydGV4dHRyYWZmaWMtZmFsc2UvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjIsOSArMjIsMTAgQEAKICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5ESVNBQkxFX0tFWUdVQVJEIiAvPgogICA8YXBwbGljYXRpb24+CiAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIvPgorICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9Im9yZy5hcGFjaGUuaHR0cC5sZWdhY3kiIC8+CiAgIDwvYXBwbGljYXRpb24+CiAKLSAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLm5ldHNlY3BvbGljeS51c2VzY2xlYXJ0ZXh0LmZhbHNlLmN0cyIKICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJUZXN0cyBmb3IgTmV0d29ya1NlY3VyaXR5UG9saWN5IGNsZWFydGV4dCB0cmFmZmljIHBvbGljeSB3aGVuIGl0IGlzIHNldCB0byBkZW5pZWQuIj4KICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9Imxpc3RlbmVyIgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbmV0c2VjcG9saWN5L3VzZXNjbGVhcnRleHR0cmFmZmljLXRydWUvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL25ldHNlY3BvbGljeS91c2VzY2xlYXJ0ZXh0dHJhZmZpYy10cnVlL0FuZHJvaWQubWsKaW5kZXggNTg0YWZkMi4uZWM0ZGFiMyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbmV0c2VjcG9saWN5L3VzZXNjbGVhcnRleHR0cmFmZmljLXRydWUvQW5kcm9pZC5taworKysgYi90ZXN0cy90ZXN0cy9uZXRzZWNwb2xpY3kvdXNlc2NsZWFydGV4dHRyYWZmaWMtdHJ1ZS9BbmRyb2lkLm1rCkBAIC0yMSwxMCArMjEsMTAgQEAKIExPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCiAKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCi0gICAgY3RzdGVzdHJ1bm5lciBcCi0gICAgY3RzdGVzdHNlcnZlciBcCi0gICAgb3JnLmFwYWNoZS5odHRwLmxlZ2FjeSBcCi0gICAgbGVnYWN5LWFuZHJvaWQtdGVzdAorICAgIGN0c3Rlc3RydW5uZXItYXh0IFwKKyAgICBjdHN0ZXN0c2VydmVyCisKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IG9yZy5hcGFjaGUuaHR0cC5sZWdhY3kgYW5kcm9pZC50ZXN0LmJhc2Uuc3R1YnMKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjIGNvbW1vbikKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbmV0c2VjcG9saWN5L3VzZXNjbGVhcnRleHR0cmFmZmljLXRydWUvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL25ldHNlY3BvbGljeS91c2VzY2xlYXJ0ZXh0dHJhZmZpYy10cnVlL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggYmU2OThmMi4uNzQ5NjRjYyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbmV0c2VjcG9saWN5L3VzZXNjbGVhcnRleHR0cmFmZmljLXRydWUvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9uZXRzZWNwb2xpY3kvdXNlc2NsZWFydGV4dHRyYWZmaWMtdHJ1ZS9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yMiw5ICsyMiwxMCBAQAogICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkRJU0FCTEVfS0VZR1VBUkQiIC8+CiAgIDxhcHBsaWNhdGlvbj4KICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIi8+CisgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0ib3JnLmFwYWNoZS5odHRwLmxlZ2FjeSIgLz4KICAgPC9hcHBsaWNhdGlvbj4KIAotICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQubmV0c2VjcG9saWN5LnVzZXNjbGVhcnRleHQudHJ1ZS5jdHMiCiAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iVGVzdHMgZm9yIE5ldHdvcmtTZWN1cml0eVBvbGljeSBjbGVhcnRleHQgdHJhZmZpYyBwb2xpY3kgd2hlbiBpdCBpcyBzZXQgdG8gcGVybWl0dGVkLiI+CiAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJsaXN0ZW5lciIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL25ldHNlY3BvbGljeS91c2VzY2xlYXJ0ZXh0dHJhZmZpYy11bnNwZWNpZmllZC9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvbmV0c2VjcG9saWN5L3VzZXNjbGVhcnRleHR0cmFmZmljLXVuc3BlY2lmaWVkL0FuZHJvaWQubWsKaW5kZXggOWE2MTNlNy4uZmJhMTA4NiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbmV0c2VjcG9saWN5L3VzZXNjbGVhcnRleHR0cmFmZmljLXVuc3BlY2lmaWVkL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvdGVzdHMvbmV0c2VjcG9saWN5L3VzZXNjbGVhcnRleHR0cmFmZmljLXVuc3BlY2lmaWVkL0FuZHJvaWQubWsKQEAgLTIxLDEwICsyMSwxMCBAQAogTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKIAogTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKLSAgICBjdHN0ZXN0cnVubmVyIFwKLSAgICBjdHN0ZXN0c2VydmVyIFwKLSAgICBvcmcuYXBhY2hlLmh0dHAubGVnYWN5IFwKLSAgICBsZWdhY3ktYW5kcm9pZC10ZXN0CisgICAgY3RzdGVzdHJ1bm5lci1heHQgXAorICAgIGN0c3Rlc3RzZXJ2ZXIKKworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gb3JnLmFwYWNoZS5odHRwLmxlZ2FjeSBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicwogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMgY29tbW9uKQogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9uZXRzZWNwb2xpY3kvdXNlc2NsZWFydGV4dHRyYWZmaWMtdW5zcGVjaWZpZWQvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL25ldHNlY3BvbGljeS91c2VzY2xlYXJ0ZXh0dHJhZmZpYy11bnNwZWNpZmllZC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDdiZDg3NDIuLjJhMTEwODUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL25ldHNlY3BvbGljeS91c2VzY2xlYXJ0ZXh0dHJhZmZpYy11bnNwZWNpZmllZC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL25ldHNlY3BvbGljeS91c2VzY2xlYXJ0ZXh0dHJhZmZpYy11bnNwZWNpZmllZC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yMiw5ICsyMiwxMCBAQAogICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkRJU0FCTEVfS0VZR1VBUkQiIC8+CiAgIDxhcHBsaWNhdGlvbj4KICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIi8+CisgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0ib3JnLmFwYWNoZS5odHRwLmxlZ2FjeSIgLz4KICAgPC9hcHBsaWNhdGlvbj4KIAotICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQubmV0c2VjcG9saWN5LnVzZXNjbGVhcnRleHQudW5zcGVjaWZpZWQuY3RzIgogICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IlRlc3RzIGZvciBOZXR3b3JrU2VjdXJpdHlQb2xpY3kgY2xlYXJ0ZXh0IHRyYWZmaWMgcG9saWN5IHdoZW4gaXQgaXMgbm90IHNwZWNpZmllZC4iPgogICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0ibGlzdGVuZXIiCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9uZXRzZWNwb2xpY3kvdXNlc2NsZWFydGV4dHRyYWZmaWMtdW5zcGVjaWZpZWQvc3JjL2FuZHJvaWQvc2VjdXJpdHkvTmV0d29ya1NlY3VyaXR5UG9saWN5Q2xlYXJ0ZXh0VW5zcGVjaWZpZWRUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9uZXRzZWNwb2xpY3kvdXNlc2NsZWFydGV4dHRyYWZmaWMtdW5zcGVjaWZpZWQvc3JjL2FuZHJvaWQvc2VjdXJpdHkvTmV0d29ya1NlY3VyaXR5UG9saWN5Q2xlYXJ0ZXh0VW5zcGVjaWZpZWRUZXN0LmphdmEKaW5kZXggNTY5MGYzMS4uODljZDZiYyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbmV0c2VjcG9saWN5L3VzZXNjbGVhcnRleHR0cmFmZmljLXVuc3BlY2lmaWVkL3NyYy9hbmRyb2lkL3NlY3VyaXR5L05ldHdvcmtTZWN1cml0eVBvbGljeUNsZWFydGV4dFVuc3BlY2lmaWVkVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL25ldHNlY3BvbGljeS91c2VzY2xlYXJ0ZXh0dHJhZmZpYy11bnNwZWNpZmllZC9zcmMvYW5kcm9pZC9zZWN1cml0eS9OZXR3b3JrU2VjdXJpdHlQb2xpY3lDbGVhcnRleHRVbnNwZWNpZmllZFRlc3QuamF2YQpAQCAtMyw3ICszLDcgQEAKIHB1YmxpYyBjbGFzcyBOZXR3b3JrU2VjdXJpdHlQb2xpY3lDbGVhcnRleHRVbnNwZWNpZmllZFRlc3QgZXh0ZW5kcyBOZXR3b3JrU2VjdXJpdHlQb2xpY3lUZXN0QmFzZSB7CiAKICAgICBwdWJsaWMgTmV0d29ya1NlY3VyaXR5UG9saWN5Q2xlYXJ0ZXh0VW5zcGVjaWZpZWRUZXN0KCkgewotICAgICAgICBzdXBlcih0cnVlIC8vIGV4cGVjdCBjbGVhcnRleHQgdHJhZmZpYyB0byBiZSBwZXJtaXR0ZWQKKyAgICAgICAgc3VwZXIoZmFsc2UgLy8gZXhwZWN0IGNsZWFydGV4dCB0cmFmZmljIHRvIGJlIHBlcm1pdHRlZAogICAgICAgICAgICAgICAgICk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL21hbmlmZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL25ldHdvcmtzZWN1cml0eWNvbmZpZy9tYW5pZmVzdC54bWwKaW5kZXggMGMxZTg1ZC4uMjk1MGJhZiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL21hbmlmZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9uZXR3b3Jrc2VjdXJpdHljb25maWcvbWFuaWZlc3QueG1sCkBAIC0yNSw3ICsyNSw3IEBACiAgIDwvYXBwbGljYXRpb24+CiAKICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5JTlRFUk5FVCIgLz4KLSAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLnNlY3VyaXR5Lm5ldC5jb25maWcuY3RzIgogICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IiI+CiAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJsaXN0ZW5lciIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL25ldHdvcmtzZWN1cml0eWNvbmZpZy9uZXR3b3Jrc2VjdXJpdHljb25maWctYXR0cmlidXRlcy9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1hdHRyaWJ1dGVzL0FuZHJvaWQubWsKaW5kZXggMTAwMThjZS4uODQ5YWZmNSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1hdHRyaWJ1dGVzL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1hdHRyaWJ1dGVzL0FuZHJvaWQubWsKQEAgLTIwLDcgKzIwLDkgQEAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCiBMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQogCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY3RzdGVzdHJ1bm5lciBvcmcuYXBhY2hlLmh0dHAubGVnYWN5IGFuZHJvaWQtc3VwcG9ydC10ZXN0CitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY3RzdGVzdHJ1bm5lci1heHQgYW5kcm9pZHgudGVzdC5ydWxlcworCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBvcmcuYXBhY2hlLmh0dHAubGVnYWN5CiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIExPQ0FMX1NSQ19GSUxFUyArPSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIC4uL3NyYykKQEAgLTMxLDQgKzMzLDQgQEAKIExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiAKIExPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKLWluY2x1ZGUgJChCVUlMRF9DVFNfUEFDS0FHRSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9uZXR3b3Jrc2VjdXJpdHljb25maWcvbmV0d29ya3NlY3VyaXR5Y29uZmlnLWF0dHJpYnV0ZXMvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL25ldHdvcmtzZWN1cml0eWNvbmZpZy9uZXR3b3Jrc2VjdXJpdHljb25maWctYXR0cmlidXRlcy9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDkzNTYwNzQuLjc5ZGUzMDkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL25ldHdvcmtzZWN1cml0eWNvbmZpZy9uZXR3b3Jrc2VjdXJpdHljb25maWctYXR0cmlidXRlcy9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL25ldHdvcmtzZWN1cml0eWNvbmZpZy9uZXR3b3Jrc2VjdXJpdHljb25maWctYXR0cmlidXRlcy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yMCwxMCArMjAsMTEgQEAKICAgICAgICAgcGFja2FnZT0iYW5kcm9pZC5zZWN1cml0eS5uZXQuY29uZmlnLmN0cy5DdHNOZXRTZWNDb25maWdBdHRyaWJ1dGVUZXN0Q2FzZXMiPgogICA8YXBwbGljYXRpb24gYW5kcm9pZDpuZXR3b3JrU2VjdXJpdHlDb25maWc9IkB4bWwvbmV0d29ya19zZWN1cml0eV9jb25maWciPgogICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiLz4KKyAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJvcmcuYXBhY2hlLmh0dHAubGVnYWN5IiAvPgogICA8L2FwcGxpY2F0aW9uPgogCiAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uSU5URVJORVQiIC8+Ci0gIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5zZWN1cml0eS5uZXQuY29uZmlnLmN0cy5DdHNOZXRTZWNDb25maWdBdHRyaWJ1dGVUZXN0Q2FzZXMiCiAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iIj4KICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9Imxpc3RlbmVyIgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1hdHRyaWJ1dGVzL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL25ldHdvcmtzZWN1cml0eWNvbmZpZy9uZXR3b3Jrc2VjdXJpdHljb25maWctYXR0cmlidXRlcy9BbmRyb2lkVGVzdC54bWwKaW5kZXggZTZlZTdjNi4uY2ZhZDNlNCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1hdHRyaWJ1dGVzL0FuZHJvaWRUZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9uZXR3b3Jrc2VjdXJpdHljb25maWcvbmV0d29ya3NlY3VyaXR5Y29uZmlnLWF0dHJpYnV0ZXMvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgQ3RzTmV0U2VjQ29uZmlnQXR0cmlidXRlVGVzdENhc2VzIHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJzZWN1cml0eSIgLz4KICAgICA8b3B0aW9uIG5hbWU9Im5vdC1zaGFyZGFibGUiIHZhbHVlPSJ0cnVlIiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1iYXNpYy1kb21haW4vQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL25ldHdvcmtzZWN1cml0eWNvbmZpZy9uZXR3b3Jrc2VjdXJpdHljb25maWctYmFzaWMtZG9tYWluL0FuZHJvaWQubWsKaW5kZXggMTYxZGJkMy4uNmFlY2EzMyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1iYXNpYy1kb21haW4vQW5kcm9pZC5taworKysgYi90ZXN0cy90ZXN0cy9uZXR3b3Jrc2VjdXJpdHljb25maWcvbmV0d29ya3NlY3VyaXR5Y29uZmlnLWJhc2ljLWRvbWFpbi9BbmRyb2lkLm1rCkBAIC0yMCw3ICsyMCw5IEBACiBMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwogTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKIAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGN0c3Rlc3RydW5uZXIgb3JnLmFwYWNoZS5odHRwLmxlZ2FjeSBhbmRyb2lkLXN1cHBvcnQtdGVzdAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGN0c3Rlc3RydW5uZXItYXh0IGFuZHJvaWR4LnRlc3QucnVsZXMKKworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gb3JnLmFwYWNoZS5odHRwLmxlZ2FjeQogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiBMT0NBTF9TUkNfRklMRVMgKz0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCAuLi9zcmMpCkBAIC0zMSw0ICszMyw0IEBACiBMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cwogCiBMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50Ci1pbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQoraW5jbHVkZSAkKEJVSUxEX0NUU19QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1iYXNpYy1kb21haW4vQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL25ldHdvcmtzZWN1cml0eWNvbmZpZy9uZXR3b3Jrc2VjdXJpdHljb25maWctYmFzaWMtZG9tYWluL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggNTY1ZjIzYS4uZmY2ODViYiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1iYXNpYy1kb21haW4vQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9uZXR3b3Jrc2VjdXJpdHljb25maWcvbmV0d29ya3NlY3VyaXR5Y29uZmlnLWJhc2ljLWRvbWFpbi9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yMCwxMCArMjAsMTEgQEAKICAgICAgICAgcGFja2FnZT0iYW5kcm9pZC5zZWN1cml0eS5uZXQuY29uZmlnLmN0cy5DdHNOZXRTZWNDb25maWdCYXNpY0RvbWFpbkNvbmZpZ1Rlc3RDYXNlcyI+CiAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOm5ldHdvcmtTZWN1cml0eUNvbmZpZz0iQHhtbC9uZXR3b3JrX3NlY3VyaXR5X2NvbmZpZyI+CiAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIvPgorICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9Im9yZy5hcGFjaGUuaHR0cC5sZWdhY3kiIC8+CiAgIDwvYXBwbGljYXRpb24+CiAKICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5JTlRFUk5FVCIgLz4KLSAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLnNlY3VyaXR5Lm5ldC5jb25maWcuY3RzLkN0c05ldFNlY0NvbmZpZ0Jhc2ljRG9tYWluQ29uZmlnVGVzdENhc2VzIgogICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IiI+CiAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJsaXN0ZW5lciIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL25ldHdvcmtzZWN1cml0eWNvbmZpZy9uZXR3b3Jrc2VjdXJpdHljb25maWctYmFzaWMtZG9tYWluL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL25ldHdvcmtzZWN1cml0eWNvbmZpZy9uZXR3b3Jrc2VjdXJpdHljb25maWctYmFzaWMtZG9tYWluL0FuZHJvaWRUZXN0LnhtbAppbmRleCAzNmViNzJhLi5iZDQzYmFjIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9uZXR3b3Jrc2VjdXJpdHljb25maWcvbmV0d29ya3NlY3VyaXR5Y29uZmlnLWJhc2ljLWRvbWFpbi9BbmRyb2lkVGVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1iYXNpYy1kb21haW4vQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgQ3RzTmV0U2VjQ29uZmlnQmFzaWNEb21haW5Db25maWdUZXN0Q2FzZXMgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9InNlY3VyaXR5IiAvPgogICAgIDxvcHRpb24gbmFtZT0ibm90LXNoYXJkYWJsZSIgdmFsdWU9InRydWUiIC8+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9uZXR3b3Jrc2VjdXJpdHljb25maWcvbmV0d29ya3NlY3VyaXR5Y29uZmlnLWNsZWFydGV4dC1wcmUtUC9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1jbGVhcnRleHQtcHJlLVAvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjYyNGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1jbGVhcnRleHQtcHJlLVAvQW5kcm9pZC5tawpAQCAtMCwwICsxLDM2IEBACisjIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNOZXRTZWNDb25maWdQcmVQQ2xlYXJ0ZXh0VHJhZmZpY1Rlc3RDYXNlcworCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKKworTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGN0c3Rlc3RydW5uZXItYXh0IGFuZHJvaWR4LnRlc3QucnVsZXMKKworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gb3JnLmFwYWNoZS5odHRwLmxlZ2FjeQorCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCitMT0NBTF9TUkNfRklMRVMgKz0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCAuLi9zcmMpCisKK0xPQ0FMX1JFU09VUkNFX0RJUiA6PSAkKExPQ0FMX1BBVEgpL3Jlcy8KKworIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKKworTE9DQUxfU0RLX1ZFUlNJT04gOj0gMjYKK2luY2x1ZGUgJChCVUlMRF9DVFNfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL25ldHdvcmtzZWN1cml0eWNvbmZpZy9uZXR3b3Jrc2VjdXJpdHljb25maWctY2xlYXJ0ZXh0LXByZS1QL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy90ZXN0cy9uZXR3b3Jrc2VjdXJpdHljb25maWcvbmV0d29ya3NlY3VyaXR5Y29uZmlnLWNsZWFydGV4dC1wcmUtUC9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MDdiNzdkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1jbGVhcnRleHQtcHJlLVAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDMzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorCis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgcGFja2FnZT0iYW5kcm9pZC5zZWN1cml0eS5uZXQuY29uZmlnLmN0cy5DdHNOZXRTZWNDb25maWdQcmVQQ2xlYXJ0ZXh0VHJhZmZpY1Rlc3RDYXNlcyI+CisgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOm5ldHdvcmtTZWN1cml0eUNvbmZpZz0iQHhtbC9uZXR3b3JrX3NlY3VyaXR5X2NvbmZpZyI+CisgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIvPgorICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9Im9yZy5hcGFjaGUuaHR0cC5sZWdhY3kiIC8+CisgIDwvYXBwbGljYXRpb24+CisKKyAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5JTlRFUk5FVCIgLz4KKyAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuc2VjdXJpdHkubmV0LmNvbmZpZy5jdHMuQ3RzTmV0U2VjQ29uZmlnUHJlUENsZWFydGV4dFRyYWZmaWNUZXN0Q2FzZXMiCisgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iIj4KKyAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9Imxpc3RlbmVyIgorICAgICAgICAgICAgYW5kcm9pZDp2YWx1ZT0iY29tLmFuZHJvaWQuY3RzLnJ1bm5lci5DdHNUZXN0UnVuTGlzdGVuZXIiIC8+CisgICAgPC9pbnN0cnVtZW50YXRpb24+Cis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1jbGVhcnRleHQtcHJlLVAvQW5kcm9pZFRlc3QueG1sIGIvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1jbGVhcnRleHQtcHJlLVAvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZTMzMTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9uZXR3b3Jrc2VjdXJpdHljb25maWcvbmV0d29ya3NlY3VyaXR5Y29uZmlnLWNsZWFydGV4dC1wcmUtUC9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBDdHNOZXRTZWNDb25maWdQcmVQQ2xlYXJ0ZXh0VHJhZmZpYyB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgorICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0ic2VjdXJpdHkiIC8+CisgICAgPG9wdGlvbiBuYW1lPSJub3Qtc2hhcmRhYmxlIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzTmV0U2VjQ29uZmlnUHJlUENsZWFydGV4dFRyYWZmaWNUZXN0Q2FzZXMuYXBrIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5BbmRyb2lkSlVuaXRUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0icGFja2FnZSIgdmFsdWU9ImFuZHJvaWQuc2VjdXJpdHkubmV0LmNvbmZpZy5jdHMuQ3RzTmV0U2VjQ29uZmlnUHJlUENsZWFydGV4dFRyYWZmaWNUZXN0Q2FzZXMiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVudGltZS1oaW50IiB2YWx1ZT0iOG0xMHMiIC8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1jbGVhcnRleHQtcHJlLVAvcmVzL3htbC9uZXR3b3JrX3NlY3VyaXR5X2NvbmZpZy54bWwgYi90ZXN0cy90ZXN0cy9uZXR3b3Jrc2VjdXJpdHljb25maWcvbmV0d29ya3NlY3VyaXR5Y29uZmlnLWNsZWFydGV4dC1wcmUtUC9yZXMveG1sL25ldHdvcmtfc2VjdXJpdHlfY29uZmlnLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODdiMTc4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1jbGVhcnRleHQtcHJlLVAvcmVzL3htbC9uZXR3b3JrX3NlY3VyaXR5X2NvbmZpZy54bWwKQEAgLTAsMCArMSw5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPG5ldHdvcmstc2VjdXJpdHktY29uZmlnPgorICA8ZG9tYWluLWNvbmZpZyBjbGVhcnRleHRUcmFmZmljUGVybWl0dGVkPSJmYWxzZSI+CisgICAgPGRvbWFpbiBpbmNsdWRlU3ViZG9tYWlucz0idHJ1ZSI+YW5kcm9pZC5jb208L2RvbWFpbj4KKyAgICA8ZG9tYWluLWNvbmZpZyBjbGVhcnRleHRUcmFmZmljUGVybWl0dGVkPSJ0cnVlIj4KKyAgICAgIDxkb21haW4+ZGV2ZWxvcGVyLmFuZHJvaWQuY29tPC9kb21haW4+CisgICAgPC9kb21haW4tY29uZmlnPgorICA8L2RvbWFpbi1jb25maWc+Cis8L25ldHdvcmstc2VjdXJpdHktY29uZmlnPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1jbGVhcnRleHQtcHJlLVAvc3JjL2FuZHJvaWQvc2VjdXJpdHkvbmV0L2NvbmZpZy9jdHMvQ2xlYXJ0ZXh0UGVybWl0dGVkVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1jbGVhcnRleHQtcHJlLVAvc3JjL2FuZHJvaWQvc2VjdXJpdHkvbmV0L2NvbmZpZy9jdHMvQ2xlYXJ0ZXh0UGVybWl0dGVkVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YjQwMGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9uZXR3b3Jrc2VjdXJpdHljb25maWcvbmV0d29ya3NlY3VyaXR5Y29uZmlnLWNsZWFydGV4dC1wcmUtUC9zcmMvYW5kcm9pZC9zZWN1cml0eS9uZXQvY29uZmlnL2N0cy9DbGVhcnRleHRQZXJtaXR0ZWRUZXN0LmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZWN1cml0eS5uZXQuY29uZmlnLmN0czsKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlOworaW1wb3J0IGphdmF4Lm5ldC5zc2wuWDUwOVRydXN0TWFuYWdlcjsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBDbGVhcnRleHRQZXJtaXR0ZWRUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0QWxsb3dlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBUZXN0VXRpbHMuYXNzZXJ0Q2xlYXJ0ZXh0Q29ubmVjdGlvblN1Y2NlZWRzKCJleGFtcGxlLmNvbSIsIDgwKTsKKyAgICAgICAgVGVzdFV0aWxzLmFzc2VydFRsc0Nvbm5lY3Rpb25TdWNjZWVkcygiZXhhbXBsZS5jb20iLCA0NDMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDbGVhcnRleHRCbG9ja2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFRlc3RVdGlscy5hc3NlcnRDbGVhcnRleHRDb25uZWN0aW9uRmFpbHMoImFuZHJvaWQuY29tIiwgODApOworICAgICAgICBUZXN0VXRpbHMuYXNzZXJ0VGxzQ29ubmVjdGlvblN1Y2NlZWRzKCJhbmRyb2lkLmNvbSIsIDQ0Myk7CisgICAgICAgIC8vIHN1YmRvbWFpbnMgb2YgYW5kcm9pZC5jb20gYXJlIGFsc28gZGlzYWxsb3dlZC4KKyAgICAgICAgVGVzdFV0aWxzLmFzc2VydENsZWFydGV4dENvbm5lY3Rpb25GYWlscygid3d3LmFuZHJvaWQuY29tIiwgODApOworICAgICAgICBUZXN0VXRpbHMuYXNzZXJ0VGxzQ29ubmVjdGlvblN1Y2NlZWRzKCJ3d3cuYW5kcm9pZC5jb20iLCA0NDMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRDbGVhcnRleHRQZXJtaXR0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gZGV2ZWxvcGVyLmFuZHJvaWQuY29tIGlzIGV4cGxpY2l0bHkgcGVybWl0dGVkLgorICAgICAgICBUZXN0VXRpbHMuYXNzZXJ0Q2xlYXJ0ZXh0Q29ubmVjdGlvblN1Y2NlZWRzKCJkZXZlbG9wZXIuYW5kcm9pZC5jb20iLCA4MCk7CisgICAgICAgIFRlc3RVdGlscy5hc3NlcnRUbHNDb25uZWN0aW9uU3VjY2VlZHMoImRldmVsb3Blci5hbmRyb2lkLmNvbSIsIDQ0Myk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1jbGVhcnRleHQvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL25ldHdvcmtzZWN1cml0eWNvbmZpZy9uZXR3b3Jrc2VjdXJpdHljb25maWctY2xlYXJ0ZXh0L0FuZHJvaWQubWsKaW5kZXggOTI3Mzc0Yy4uNTUwNmZiYSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1jbGVhcnRleHQvQW5kcm9pZC5taworKysgYi90ZXN0cy90ZXN0cy9uZXR3b3Jrc2VjdXJpdHljb25maWcvbmV0d29ya3NlY3VyaXR5Y29uZmlnLWNsZWFydGV4dC9BbmRyb2lkLm1rCkBAIC0yMCw3ICsyMCw5IEBACiBMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwogTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKIAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGN0c3Rlc3RydW5uZXIgb3JnLmFwYWNoZS5odHRwLmxlZ2FjeSBhbmRyb2lkLXN1cHBvcnQtdGVzdAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGN0c3Rlc3RydW5uZXItYXh0IGFuZHJvaWR4LnRlc3QucnVsZXMKKworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gb3JnLmFwYWNoZS5odHRwLmxlZ2FjeQogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiBMT0NBTF9TUkNfRklMRVMgKz0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCAuLi9zcmMpCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9uZXR3b3Jrc2VjdXJpdHljb25maWcvbmV0d29ya3NlY3VyaXR5Y29uZmlnLWNsZWFydGV4dC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1jbGVhcnRleHQvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBiMzg3ZmZhLi4yMmNiYzk5IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9uZXR3b3Jrc2VjdXJpdHljb25maWcvbmV0d29ya3NlY3VyaXR5Y29uZmlnLWNsZWFydGV4dC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL25ldHdvcmtzZWN1cml0eWNvbmZpZy9uZXR3b3Jrc2VjdXJpdHljb25maWctY2xlYXJ0ZXh0L0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTIwLDEwICsyMCwxMSBAQAogICAgICAgICBwYWNrYWdlPSJhbmRyb2lkLnNlY3VyaXR5Lm5ldC5jb25maWcuY3RzLkN0c05ldFNlY0NvbmZpZ0NsZWFydGV4dFRyYWZmaWNUZXN0Q2FzZXMiPgogICA8YXBwbGljYXRpb24gYW5kcm9pZDpuZXR3b3JrU2VjdXJpdHlDb25maWc9IkB4bWwvbmV0d29ya19zZWN1cml0eV9jb25maWciPgogICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiLz4KKyAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJvcmcuYXBhY2hlLmh0dHAubGVnYWN5IiAvPgogICA8L2FwcGxpY2F0aW9uPgogCiAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uSU5URVJORVQiIC8+Ci0gIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5zZWN1cml0eS5uZXQuY29uZmlnLmN0cy5DdHNOZXRTZWNDb25maWdDbGVhcnRleHRUcmFmZmljVGVzdENhc2VzIgogICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IiI+CiAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJsaXN0ZW5lciIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL25ldHdvcmtzZWN1cml0eWNvbmZpZy9uZXR3b3Jrc2VjdXJpdHljb25maWctY2xlYXJ0ZXh0L0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL25ldHdvcmtzZWN1cml0eWNvbmZpZy9uZXR3b3Jrc2VjdXJpdHljb25maWctY2xlYXJ0ZXh0L0FuZHJvaWRUZXN0LnhtbAppbmRleCBmMmUzZjM1Li5kNWMzM2JlIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9uZXR3b3Jrc2VjdXJpdHljb25maWcvbmV0d29ya3NlY3VyaXR5Y29uZmlnLWNsZWFydGV4dC9BbmRyb2lkVGVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1jbGVhcnRleHQvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgQ3RzTmV0U2VjQ29uZmlnQ2xlYXJ0ZXh0VHJhZmZpYyB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0ic2VjdXJpdHkiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJub3Qtc2hhcmRhYmxlIiB2YWx1ZT0idHJ1ZSIgLz4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL25ldHdvcmtzZWN1cml0eWNvbmZpZy9uZXR3b3Jrc2VjdXJpdHljb25maWctY2xlYXJ0ZXh0L3Jlcy94bWwvbmV0d29ya19zZWN1cml0eV9jb25maWcueG1sIGIvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1jbGVhcnRleHQvcmVzL3htbC9uZXR3b3JrX3NlY3VyaXR5X2NvbmZpZy54bWwKaW5kZXggOTg3YjE3OC4uNmQ0MWJiYSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1jbGVhcnRleHQvcmVzL3htbC9uZXR3b3JrX3NlY3VyaXR5X2NvbmZpZy54bWwKKysrIGIvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1jbGVhcnRleHQvcmVzL3htbC9uZXR3b3JrX3NlY3VyaXR5X2NvbmZpZy54bWwKQEAgLTEsOCArMSw4IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgogPG5ldHdvcmstc2VjdXJpdHktY29uZmlnPgotICA8ZG9tYWluLWNvbmZpZyBjbGVhcnRleHRUcmFmZmljUGVybWl0dGVkPSJmYWxzZSI+CisgIDxkb21haW4tY29uZmlnIGNsZWFydGV4dFRyYWZmaWNQZXJtaXR0ZWQ9InRydWUiPgogICAgIDxkb21haW4gaW5jbHVkZVN1YmRvbWFpbnM9InRydWUiPmFuZHJvaWQuY29tPC9kb21haW4+Ci0gICAgPGRvbWFpbi1jb25maWcgY2xlYXJ0ZXh0VHJhZmZpY1Blcm1pdHRlZD0idHJ1ZSI+CisgICAgPGRvbWFpbi1jb25maWcgY2xlYXJ0ZXh0VHJhZmZpY1Blcm1pdHRlZD0iZmFsc2UiPgogICAgICAgPGRvbWFpbj5kZXZlbG9wZXIuYW5kcm9pZC5jb208L2RvbWFpbj4KICAgICA8L2RvbWFpbi1jb25maWc+CiAgIDwvZG9tYWluLWNvbmZpZz4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL25ldHdvcmtzZWN1cml0eWNvbmZpZy9uZXR3b3Jrc2VjdXJpdHljb25maWctY2xlYXJ0ZXh0L3NyYy9hbmRyb2lkL3NlY3VyaXR5L25ldC9jb25maWcvY3RzL0NsZWFydGV4dFBlcm1pdHRlZFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL25ldHdvcmtzZWN1cml0eWNvbmZpZy9uZXR3b3Jrc2VjdXJpdHljb25maWctY2xlYXJ0ZXh0L3NyYy9hbmRyb2lkL3NlY3VyaXR5L25ldC9jb25maWcvY3RzL0NsZWFydGV4dFBlcm1pdHRlZFRlc3QuamF2YQppbmRleCBkYjhlNDBmLi45NTkyMTc4IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9uZXR3b3Jrc2VjdXJpdHljb25maWcvbmV0d29ya3NlY3VyaXR5Y29uZmlnLWNsZWFydGV4dC9zcmMvYW5kcm9pZC9zZWN1cml0eS9uZXQvY29uZmlnL2N0cy9DbGVhcnRleHRQZXJtaXR0ZWRUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1jbGVhcnRleHQvc3JjL2FuZHJvaWQvc2VjdXJpdHkvbmV0L2NvbmZpZy9jdHMvQ2xlYXJ0ZXh0UGVybWl0dGVkVGVzdC5qYXZhCkBAIC0yMiwyMiArMjIsMjIgQEAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKIHB1YmxpYyBjbGFzcyBDbGVhcnRleHRQZXJtaXR0ZWRUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0QWxsb3dlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBUZXN0VXRpbHMuYXNzZXJ0Q2xlYXJ0ZXh0Q29ubmVjdGlvblN1Y2NlZWRzKCJleGFtcGxlLmNvbSIsIDgwKTsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdERlbmllZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBUZXN0VXRpbHMuYXNzZXJ0Q2xlYXJ0ZXh0Q29ubmVjdGlvbkZhaWxzKCJleGFtcGxlLmNvbSIsIDgwKTsKICAgICAgICAgVGVzdFV0aWxzLmFzc2VydFRsc0Nvbm5lY3Rpb25TdWNjZWVkcygiZXhhbXBsZS5jb20iLCA0NDMpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHRlc3RDbGVhcnRleHRCbG9ja2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFRlc3RVdGlscy5hc3NlcnRDbGVhcnRleHRDb25uZWN0aW9uRmFpbHMoImFuZHJvaWQuY29tIiwgODApOworICAgIHB1YmxpYyB2b2lkIHRlc3RDbGVhcnRleHRBbGxvd2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFRlc3RVdGlscy5hc3NlcnRDbGVhcnRleHRDb25uZWN0aW9uU3VjY2VlZHMoImFuZHJvaWQuY29tIiwgODApOwogICAgICAgICBUZXN0VXRpbHMuYXNzZXJ0VGxzQ29ubmVjdGlvblN1Y2NlZWRzKCJhbmRyb2lkLmNvbSIsIDQ0Myk7CiAgICAgICAgIC8vIHN1YmRvbWFpbnMgb2YgYW5kcm9pZC5jb20gYXJlIGFsc28gZGlzYWxsb3dlZC4KLSAgICAgICAgVGVzdFV0aWxzLmFzc2VydENsZWFydGV4dENvbm5lY3Rpb25GYWlscygid3d3LmFuZHJvaWQuY29tIiwgODApOworICAgICAgICBUZXN0VXRpbHMuYXNzZXJ0Q2xlYXJ0ZXh0Q29ubmVjdGlvblN1Y2NlZWRzKCJ3d3cuYW5kcm9pZC5jb20iLCA4MCk7CiAgICAgICAgIFRlc3RVdGlscy5hc3NlcnRUbHNDb25uZWN0aW9uU3VjY2VlZHMoInd3dy5hbmRyb2lkLmNvbSIsIDQ0Myk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgdGVzdE5lc3RlZENsZWFydGV4dFBlcm1pdHRlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBkZXZlbG9wZXIuYW5kcm9pZC5jb20gaXMgZXhwbGljaXRseSBwZXJtaXR0ZWQuCi0gICAgICAgIFRlc3RVdGlscy5hc3NlcnRDbGVhcnRleHRDb25uZWN0aW9uU3VjY2VlZHMoImRldmVsb3Blci5hbmRyb2lkLmNvbSIsIDgwKTsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkQ2xlYXJ0ZXh0RGVuaWVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGRldmVsb3Blci5hbmRyb2lkLmNvbSBpcyBleHBsaWNpdGx5IGRlbmllZC4KKyAgICAgICAgVGVzdFV0aWxzLmFzc2VydENsZWFydGV4dENvbm5lY3Rpb25GYWlscygiZGV2ZWxvcGVyLmFuZHJvaWQuY29tIiwgODApOwogICAgICAgICBUZXN0VXRpbHMuYXNzZXJ0VGxzQ29ubmVjdGlvblN1Y2NlZWRzKCJkZXZlbG9wZXIuYW5kcm9pZC5jb20iLCA0NDMpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL25ldHdvcmtzZWN1cml0eWNvbmZpZy9uZXR3b3Jrc2VjdXJpdHljb25maWctZGVidWctYmFzaWMtZGlzYWJsZWQvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL25ldHdvcmtzZWN1cml0eWNvbmZpZy9uZXR3b3Jrc2VjdXJpdHljb25maWctZGVidWctYmFzaWMtZGlzYWJsZWQvQW5kcm9pZC5tawppbmRleCBhYTBlZWZkLi4zYTEyZTM0IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9uZXR3b3Jrc2VjdXJpdHljb25maWcvbmV0d29ya3NlY3VyaXR5Y29uZmlnLWRlYnVnLWJhc2ljLWRpc2FibGVkL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1kZWJ1Zy1iYXNpYy1kaXNhYmxlZC9BbmRyb2lkLm1rCkBAIC0yMCw3ICsyMCw5IEBACiBMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwogTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKIAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGN0c3Rlc3RydW5uZXIgb3JnLmFwYWNoZS5odHRwLmxlZ2FjeSBhbmRyb2lkLXN1cHBvcnQtdGVzdAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGN0c3Rlc3RydW5uZXItYXh0IGFuZHJvaWR4LnRlc3QucnVsZXMKKworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gb3JnLmFwYWNoZS5odHRwLmxlZ2FjeQogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiBMT0NBTF9TUkNfRklMRVMgKz0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCAuLi9zcmMpCkBAIC0zMSw0ICszMyw0IEBACiBMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cwogCiBMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50Ci1pbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQoraW5jbHVkZSAkKEJVSUxEX0NUU19QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1kZWJ1Zy1iYXNpYy1kaXNhYmxlZC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1kZWJ1Zy1iYXNpYy1kaXNhYmxlZC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDNmMTVmODEuLjc1ODdiYWIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL25ldHdvcmtzZWN1cml0eWNvbmZpZy9uZXR3b3Jrc2VjdXJpdHljb25maWctZGVidWctYmFzaWMtZGlzYWJsZWQvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9uZXR3b3Jrc2VjdXJpdHljb25maWcvbmV0d29ya3NlY3VyaXR5Y29uZmlnLWRlYnVnLWJhc2ljLWRpc2FibGVkL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTIxLDEwICsyMSwxMSBAQAogICA8YXBwbGljYXRpb24gYW5kcm9pZDpkZWJ1Z2dhYmxlPSJmYWxzZSIKICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmV0d29ya1NlY3VyaXR5Q29uZmlnPSJAeG1sL25ldHdvcmtfc2VjdXJpdHlfY29uZmlnIj4KICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIi8+CisgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0ib3JnLmFwYWNoZS5odHRwLmxlZ2FjeSIgLz4KICAgPC9hcHBsaWNhdGlvbj4KIAogICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLklOVEVSTkVUIiAvPgotICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuc2VjdXJpdHkubmV0LmNvbmZpZy5jdHMuQ3RzTmV0U2VjQ29uZmlnQmFzaWNEZWJ1Z0Rpc2FibGVkVGVzdENhc2VzIgogICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IiI+CiAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJsaXN0ZW5lciIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL25ldHdvcmtzZWN1cml0eWNvbmZpZy9uZXR3b3Jrc2VjdXJpdHljb25maWctZGVidWctYmFzaWMtZGlzYWJsZWQvQW5kcm9pZFRlc3QueG1sIGIvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1kZWJ1Zy1iYXNpYy1kaXNhYmxlZC9BbmRyb2lkVGVzdC54bWwKaW5kZXggMTRlNGViNC4uNjY2ZWQ2OCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1kZWJ1Zy1iYXNpYy1kaXNhYmxlZC9BbmRyb2lkVGVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1kZWJ1Zy1iYXNpYy1kaXNhYmxlZC9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBDdHNOZXRTZWNDb25maWdCYXNpY0RlYnVnRGlzYWJsZWRUZXN0Q2FzZXMgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9InNlY3VyaXR5IiAvPgogICAgIDxvcHRpb24gbmFtZT0ibm90LXNoYXJkYWJsZSIgdmFsdWU9InRydWUiIC8+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9uZXR3b3Jrc2VjdXJpdHljb25maWcvbmV0d29ya3NlY3VyaXR5Y29uZmlnLWRlYnVnLWJhc2ljLWVuYWJsZWQvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL25ldHdvcmtzZWN1cml0eWNvbmZpZy9uZXR3b3Jrc2VjdXJpdHljb25maWctZGVidWctYmFzaWMtZW5hYmxlZC9BbmRyb2lkLm1rCmluZGV4IGJlOTE3NGUuLmY3OGJlMjQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL25ldHdvcmtzZWN1cml0eWNvbmZpZy9uZXR3b3Jrc2VjdXJpdHljb25maWctZGVidWctYmFzaWMtZW5hYmxlZC9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3Rlc3RzL25ldHdvcmtzZWN1cml0eWNvbmZpZy9uZXR3b3Jrc2VjdXJpdHljb25maWctZGVidWctYmFzaWMtZW5hYmxlZC9BbmRyb2lkLm1rCkBAIC0yMCw3ICsyMCw5IEBACiBMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwogTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKIAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGN0c3Rlc3RydW5uZXIgb3JnLmFwYWNoZS5odHRwLmxlZ2FjeSBhbmRyb2lkLXN1cHBvcnQtdGVzdAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGN0c3Rlc3RydW5uZXItYXh0IGFuZHJvaWR4LnRlc3QucnVsZXMKKworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gb3JnLmFwYWNoZS5odHRwLmxlZ2FjeQogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiBMT0NBTF9TUkNfRklMRVMgKz0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCAuLi9zcmMpCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9uZXR3b3Jrc2VjdXJpdHljb25maWcvbmV0d29ya3NlY3VyaXR5Y29uZmlnLWRlYnVnLWJhc2ljLWVuYWJsZWQvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL25ldHdvcmtzZWN1cml0eWNvbmZpZy9uZXR3b3Jrc2VjdXJpdHljb25maWctZGVidWctYmFzaWMtZW5hYmxlZC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDZkOTg3MDIuLjBmNjhhNmYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL25ldHdvcmtzZWN1cml0eWNvbmZpZy9uZXR3b3Jrc2VjdXJpdHljb25maWctZGVidWctYmFzaWMtZW5hYmxlZC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL25ldHdvcmtzZWN1cml0eWNvbmZpZy9uZXR3b3Jrc2VjdXJpdHljb25maWctZGVidWctYmFzaWMtZW5hYmxlZC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yMSwxMCArMjEsMTEgQEAKICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6ZGVidWdnYWJsZT0idHJ1ZSIKICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmV0d29ya1NlY3VyaXR5Q29uZmlnPSJAeG1sL25ldHdvcmtfc2VjdXJpdHlfY29uZmlnIj4KICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIi8+CisgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0ib3JnLmFwYWNoZS5odHRwLmxlZ2FjeSIgLz4KICAgPC9hcHBsaWNhdGlvbj4KIAogICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLklOVEVSTkVUIiAvPgotICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuc2VjdXJpdHkubmV0LmNvbmZpZy5jdHMuQ3RzTmV0U2VjQ29uZmlnQmFzaWNEZWJ1Z0VuYWJsZWRUZXN0Q2FzZXMiCiAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iIj4KICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9Imxpc3RlbmVyIgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1kZWJ1Zy1iYXNpYy1lbmFibGVkL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL25ldHdvcmtzZWN1cml0eWNvbmZpZy9uZXR3b3Jrc2VjdXJpdHljb25maWctZGVidWctYmFzaWMtZW5hYmxlZC9BbmRyb2lkVGVzdC54bWwKaW5kZXggMTk4ZjMwZS4uYTkyNzI2ZSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1kZWJ1Zy1iYXNpYy1lbmFibGVkL0FuZHJvaWRUZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9uZXR3b3Jrc2VjdXJpdHljb25maWcvbmV0d29ya3NlY3VyaXR5Y29uZmlnLWRlYnVnLWJhc2ljLWVuYWJsZWQvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgQ3RzTmV0U2VjQ29uZmlnQmFzaWNEZWJ1Z0VuYWJsZWRUZXN0Q2FzZXMgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9InNlY3VyaXR5IiAvPgogICAgIDxvcHRpb24gbmFtZT0ibm90LXNoYXJkYWJsZSIgdmFsdWU9InRydWUiIC8+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9uZXR3b3Jrc2VjdXJpdHljb25maWcvbmV0d29ya3NlY3VyaXR5Y29uZmlnLWRvd25sb2FkbWFuYWdlci9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1kb3dubG9hZG1hbmFnZXIvQW5kcm9pZC5tawppbmRleCA4NGU3MmIwLi42MDdlOGExIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9uZXR3b3Jrc2VjdXJpdHljb25maWcvbmV0d29ya3NlY3VyaXR5Y29uZmlnLWRvd25sb2FkbWFuYWdlci9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3Rlc3RzL25ldHdvcmtzZWN1cml0eWNvbmZpZy9uZXR3b3Jrc2VjdXJpdHljb25maWctZG93bmxvYWRtYW5hZ2VyL0FuZHJvaWQubWsKQEAgLTIxLDEwICsyMSwxMCBAQAogTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKIAogTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKLSAgICBjdHN0ZXN0cnVubmVyIFwKLSAgICBvcmcuYXBhY2hlLmh0dHAubGVnYWN5IFwKLSAgICBhbmRyb2lkLXN1cHBvcnQtdGVzdCBcCi0gICAgbGVnYWN5LWFuZHJvaWQtdGVzdAorICAgIGN0c3Rlc3RydW5uZXItYXh0IFwKKyAgICBhbmRyb2lkeC50ZXN0LnJ1bGVzCisKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IG9yZy5hcGFjaGUuaHR0cC5sZWdhY3kgYW5kcm9pZC50ZXN0LmJhc2Uuc3R1YnMKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogTE9DQUxfU1JDX0ZJTEVTICs9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgLi4vc3JjKQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1kb3dubG9hZG1hbmFnZXIvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL25ldHdvcmtzZWN1cml0eWNvbmZpZy9uZXR3b3Jrc2VjdXJpdHljb25maWctZG93bmxvYWRtYW5hZ2VyL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggZTE4ZmY0ZC4uNzU2YzBlZCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1kb3dubG9hZG1hbmFnZXIvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9uZXR3b3Jrc2VjdXJpdHljb25maWcvbmV0d29ya3NlY3VyaXR5Y29uZmlnLWRvd25sb2FkbWFuYWdlci9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yMCwxMCArMjAsMTEgQEAKICAgICAgICAgcGFja2FnZT0iYW5kcm9pZC5zZWN1cml0eS5uZXQuY29uZmlnLmN0cy5DdHNOZXRTZWNDb25maWdEb3dubG9hZE1hbmFnZXJUZXN0Q2FzZXMiPgogICA8YXBwbGljYXRpb24gYW5kcm9pZDpuZXR3b3JrU2VjdXJpdHlDb25maWc9IkB4bWwvbmV0d29ya19zZWN1cml0eV9jb25maWciPgogICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiLz4KKyAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJvcmcuYXBhY2hlLmh0dHAubGVnYWN5IiAvPgogICA8L2FwcGxpY2F0aW9uPgogCiAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uSU5URVJORVQiIC8+Ci0gIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5zZWN1cml0eS5uZXQuY29uZmlnLmN0cy5DdHNOZXRTZWNDb25maWdEb3dubG9hZE1hbmFnZXJUZXN0Q2FzZXMiCiAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iIj4KICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9Imxpc3RlbmVyIgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1kb3dubG9hZG1hbmFnZXIvQW5kcm9pZFRlc3QueG1sIGIvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1kb3dubG9hZG1hbmFnZXIvQW5kcm9pZFRlc3QueG1sCmluZGV4IGZiMjYzOTEuLjBkMWIyYTIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL25ldHdvcmtzZWN1cml0eWNvbmZpZy9uZXR3b3Jrc2VjdXJpdHljb25maWctZG93bmxvYWRtYW5hZ2VyL0FuZHJvaWRUZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9uZXR3b3Jrc2VjdXJpdHljb25maWcvbmV0d29ya3NlY3VyaXR5Y29uZmlnLWRvd25sb2FkbWFuYWdlci9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBDdHNOZXRTZWNDb25maWdEb3dubG9hZE1hbmFnZXJUZXN0Q2FzZXMgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9InNlY3VyaXR5IiAvPgogICAgIDxvcHRpb24gbmFtZT0ibm90LXNoYXJkYWJsZSIgdmFsdWU9InRydWUiIC8+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9uZXR3b3Jrc2VjdXJpdHljb25maWcvbmV0d29ya3NlY3VyaXR5Y29uZmlnLWRvd25sb2FkbWFuYWdlci9yZXMvcmF3L3ZhbGlkX2NoYWluLnBlbSBiL3Rlc3RzL3Rlc3RzL25ldHdvcmtzZWN1cml0eWNvbmZpZy9uZXR3b3Jrc2VjdXJpdHljb25maWctZG93bmxvYWRtYW5hZ2VyL3Jlcy9yYXcvdmFsaWRfY2hhaW4ucGVtCmluZGV4IGU5NzQwNTUuLmE1NWM2NDMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL25ldHdvcmtzZWN1cml0eWNvbmZpZy9uZXR3b3Jrc2VjdXJpdHljb25maWctZG93bmxvYWRtYW5hZ2VyL3Jlcy9yYXcvdmFsaWRfY2hhaW4ucGVtCisrKyBiL3Rlc3RzL3Rlc3RzL25ldHdvcmtzZWN1cml0eWNvbmZpZy9uZXR3b3Jrc2VjdXJpdHljb25maWctZG93bmxvYWRtYW5hZ2VyL3Jlcy9yYXcvdmFsaWRfY2hhaW4ucGVtCkBAIC0xLDE5ICsxLDIwIEBACiAtLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KLU1JSUN2RENDQWFTZ0F3SUJBZ0lEQVFkdk1BMEdDU3FHU0liM0RRRUJDd1VBTUNFeEh6QWRCZ05WQkFNVEZrRnUKLVpISnZhV1FnUTFSVElIUnlkWE4wWldRZ1EwRXdLaGdUTWpBeE5UQXhNREV3TURBd01EQXJNREF3TUJnVE1qQXkKLU5UQXhNREV3TURBd01EQXJNREF3TURBVU1SSXdFQVlEVlFRREV3bHNiMk5oYkdodmMzUXdnZ0VpTUEwR0NTcUcKLVNJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUNoL2lIWjg2QTNobWhOVWxwK0MvSFlYM2VmUUNWV0Rsc2MKLS9QSjdTdWVZandzVHhuVFhhaStURjlEcC9TdElnWC9udk4vWmtUQ0hZMk5RYlJLT1M1L1RBT2tVeTBNTGVqajIKLWxoZngwRUI1SnF5emprb1RXWEhxM212cXlSejN6ZXpYblVvT2xIMjltM0ZaK3c2eWdjRklvQUNRMWxaOU5pQWUKLXNCenZiSlJmamJBSEtjbm5NYmIyUDZlN2RKWUxnSHRJOVNJbFgxL3NSblRSVk8xbzVoa1VNNU9TbXJ4WXR3Y0EKLTNOdWExeit5U2Yrak91azU4eU9lSWtTUGRmRDlBRzRSUHR5ditRVzN2S2p4YlhaUkRnb1QrcDZWRnRUWVpzL2YKLVNxSlpIRnY3Z2wxQVJ3TEp0dTBEM1Z0OEdGK29jR3VYa3ZGUmsxcm9SRG5YVDNRYnhoajNBZ01CQUFFd0RRWUoKLUtvWklodmNOQVFFTEJRQURnZ0VCQUxTWVZlU1BXNStTSGhNaU9vNnR2RjBCREtDVnFGd21nZ2RwZ3hNNjYwbXAKLU5YTG9TdGZGTlpTTmtjV3NMRHNHUFFDMVJYdUhEV3E3R21NcGFLR1J0UURuVnJBckd2UFRSbjRpSklSUVorL0YKLXVNQmxsaXRTUENvYWU0cWNGZndFWG90TytPdUxac2FhQmQvcjU4RjBOcURtWC9VT1k5RVA3TnVseXVVWm1lQksKLU9PYWVPS09sbjZCWFFvTVdwNWlyRWQ4dEdCemUxc09KTFdOZWpxdXlWaVd1Q1RIdkhsYWZCaTBmTTNqQUU1ZEwKLXBuWFN0WkZPQ3pVMkovRG5mYkxKbXdiU2NZdFljOUZpQjNqTUxNNnZaWkdHWFQ1R28zdWlmZmNPQUZTa0pneHgKLWwwQkNSb2J5ZVBXN1JkeFVMQThUSGtnOXRtMDQ0STI4RWVKRWtLbWFXclE9CitNSUlDMnpDQ0FjT2dBd0lCQWdJSkFLZWU1Q0ZvY2lBMk1BMEdDU3FHU0liM0RRRUJDd1VBTUNFeEh6QWRCZ05WCitCQU1URmtGdVpISnZhV1FnUTFSVElIUnlkWE4wWldRZ1EwRXdIaGNOTVRnd05URTNNVGt5T0RRMldoY05NelF4CitNREl3TVRreU9EUTJXakFVTVJJd0VBWURWUVFEREFsc2IyTmhiR2h2YzNRd2dnRWlNQTBHQ1NxR1NJYjNEUUVCCitBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ2gvaUhaODZBM2htaE5VbHArQy9IWVgzZWZRQ1ZXRGxzYy9QSjdTdWVZCitqd3NUeG5UWGFpK1RGOURwL1N0SWdYL252Ti9aa1RDSFkyTlFiUktPUzUvVEFPa1V5ME1MZWpqMmxoZngwRUI1CitKcXl6amtvVFdYSHEzbXZxeVJ6M3plelhuVW9PbEgyOW0zRlordzZ5Z2NGSW9BQ1ExbFo5TmlBZXNCenZiSlJmCitqYkFIS2Nubk1iYjJQNmU3ZEpZTGdIdEk5U0lsWDEvc1JuVFJWTzFvNWhrVU01T1NtcnhZdHdjQTNOdWExeit5CitTZitqT3VrNTh5T2VJa1NQZGZEOUFHNFJQdHl2K1FXM3ZLanhiWFpSRGdvVCtwNlZGdFRZWnMvZlNxSlpIRnY3CitnbDFBUndMSnR1MEQzVnQ4R0Yrb2NHdVhrdkZSazFyb1JEblhUM1FieGhqM0FnTUJBQUdqSXpBaE1Ba0dBMVVkCitFd1FDTUFBd0ZBWURWUjBSQkEwd0M0SUpiRzlqWVd4b2IzTjBNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUNECitsZ2hZMkU0d1J1dG41MlJ4STlyd2QvTGpwMTNSTExWSUtJZ3lxSFROYzRIeEM4cmxWMDJyU0FjVm8xTWFzRG9tCityeWUzeHIvN0NWZldGMXp1OEFGZ0xaVGQ4M1RPZjh6NjJ6azRGaGlPQ21TTUtUekNSaWFiMjIxWDRueUh2ZWdJCitFYnR1a1VZbVNhUE12U1ZPRlFRTE03KzB5Q085R09DM24zWXhPYVdVc2REUGI4b01uODZZMGxPSEYxTWh6RkFTCit1aDdvRjMxQUVrdGdESThKNDdIUWJJUThkSlZDUzRna0I0MnZ5WDVnWS94RC9kVGkyb1dCTVlkY3lpRGw0RnhpCittUkN1WHZqNnZrRHhMVUtvcm9hdjVvWVV5TUIzb1pWWmUvNzRZUSs0WWdnYiswdE9oUWhpejI2aHdjbkYwRE1JCittNU5Ld2VEdW1OekN0UGZYZk5nSgogLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQogLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCiBNSUlDM2pDQ0FjYWdBd0lCQWdJRERHcVNNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1DRXhIekFkQmdOVkJBTVRGa0Z1CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9uZXR3b3Jrc2VjdXJpdHljb25maWcvbmV0d29ya3NlY3VyaXR5Y29uZmlnLWRvd25sb2FkbWFuYWdlci9yZXMveG1sL25ldHdvcmtfc2VjdXJpdHlfY29uZmlnLnhtbCBiL3Rlc3RzL3Rlc3RzL25ldHdvcmtzZWN1cml0eWNvbmZpZy9uZXR3b3Jrc2VjdXJpdHljb25maWctZG93bmxvYWRtYW5hZ2VyL3Jlcy94bWwvbmV0d29ya19zZWN1cml0eV9jb25maWcueG1sCmluZGV4IDZjMDY0ZjkuLjVmYzA1NTYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL25ldHdvcmtzZWN1cml0eWNvbmZpZy9uZXR3b3Jrc2VjdXJpdHljb25maWctZG93bmxvYWRtYW5hZ2VyL3Jlcy94bWwvbmV0d29ya19zZWN1cml0eV9jb25maWcueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL25ldHdvcmtzZWN1cml0eWNvbmZpZy9uZXR3b3Jrc2VjdXJpdHljb25maWctZG93bmxvYWRtYW5hZ2VyL3Jlcy94bWwvbmV0d29ya19zZWN1cml0eV9jb25maWcueG1sCkBAIC0xLDYgKzEsNiBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KIDxuZXR3b3JrLXNlY3VyaXR5LWNvbmZpZz4KLSAgPGRvbWFpbi1jb25maWc+CisgIDxkb21haW4tY29uZmlnIGNsZWFydGV4dFRyYWZmaWNQZXJtaXR0ZWQ9InRydWUiPgogICAgIDxkb21haW4+bG9jYWxob3N0PC9kb21haW4+CiAgICAgPHRydXN0LWFuY2hvcnM+CiAgICAgICA8Y2VydGlmaWNhdGVzIHNyYz0iQHJhdy92YWxpZF9jYSIgLz4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL25ldHdvcmtzZWN1cml0eWNvbmZpZy9uZXR3b3Jrc2VjdXJpdHljb25maWctZG93bmxvYWRtYW5hZ2VyL3NyYy9hbmRyb2lkL3NlY3VyaXR5L25ldC9jb25maWcvY3RzL0Rvd25sb2FkTWFuYWdlclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL25ldHdvcmtzZWN1cml0eWNvbmZpZy9uZXR3b3Jrc2VjdXJpdHljb25maWctZG93bmxvYWRtYW5hZ2VyL3NyYy9hbmRyb2lkL3NlY3VyaXR5L25ldC9jb25maWcvY3RzL0Rvd25sb2FkTWFuYWdlclRlc3QuamF2YQppbmRleCAyOGM4ZWI4Li42ZGQ4MDUwIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9uZXR3b3Jrc2VjdXJpdHljb25maWcvbmV0d29ya3NlY3VyaXR5Y29uZmlnLWRvd25sb2FkbWFuYWdlci9zcmMvYW5kcm9pZC9zZWN1cml0eS9uZXQvY29uZmlnL2N0cy9Eb3dubG9hZE1hbmFnZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1kb3dubG9hZG1hbmFnZXIvc3JjL2FuZHJvaWQvc2VjdXJpdHkvbmV0L2NvbmZpZy9jdHMvRG93bmxvYWRNYW5hZ2VyVGVzdC5qYXZhCkBAIC0zMyw2ICszMyw3IEBACiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7CitpbXBvcnQgamF2YS5uZXQuU2VydmVyU29ja2V0OwogaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5RmFjdG9yeTsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LktleVN0b3JlOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmF0ZUtleTsKQEAgLTY1LDIyICs2NiwyOSBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVElNRU9VVCA9IDMgKiBEYXRlVXRpbHMuU0VDT05EX0lOX01JTExJUzsKIAogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25maWdUcnVzdGVkQ2FBY2NlcHRlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBydW5Eb3dubG9hZE1hbmFnZXJUZXN0KFIucmF3LnZhbGlkX2NoYWluLCBSLnJhdy50ZXN0X2tleSk7CisgICAgICAgIFNTTFNlcnZlclNvY2tldCBzZXJ2ZXJTb2NrZXQgPSBiaW5kVExTU2VydmVyKFIucmF3LnZhbGlkX2NoYWluLCBSLnJhdy50ZXN0X2tleSk7CisgICAgICAgIHJ1bkRvd25sb2FkTWFuYWdlclRlc3Qoc2VydmVyU29ja2V0LCB0cnVlKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0VW50cnVzdGVkQ2FSZWplY3RlZCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICB0cnkgewotICAgICAgICAgICAgcnVuRG93bmxvYWRNYW5hZ2VyVGVzdChSLnJhdy5pbnZhbGlkX2NoYWluLCBSLnJhdy50ZXN0X2tleSk7CisgICAgICAgICAgICBTU0xTZXJ2ZXJTb2NrZXQgc2VydmVyU29ja2V0ID0gYmluZFRMU1NlcnZlcihSLnJhdy5pbnZhbGlkX2NoYWluLCBSLnJhdy50ZXN0X2tleSk7CisgICAgICAgICAgICBydW5Eb3dubG9hZE1hbmFnZXJUZXN0KHNlcnZlclNvY2tldCwgdHJ1ZSk7CiAgICAgICAgICAgICBmYWlsKCJJbnZhbGlkIENBIHNob3VsZCBiZSByZWplY3RlZCIpOwogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXhwZWN0ZWQpIHsKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBydW5Eb3dubG9hZE1hbmFnZXJUZXN0KGludCBjaGFpblJlc0lkLCBpbnQga2V5UmVzSWQpIHRocm93cyBFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3RQZXJEb21haW5DbGVhcnRleHRBY2NlcHRlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTZXJ2ZXJTb2NrZXQgc2VydmVyU29ja2V0ID0gbmV3IFNlcnZlclNvY2tldCgpOworICAgICAgICBzZXJ2ZXJTb2NrZXQuYmluZChudWxsKTsKKyAgICAgICAgcnVuRG93bmxvYWRNYW5hZ2VyVGVzdChzZXJ2ZXJTb2NrZXQsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcnVuRG93bmxvYWRNYW5hZ2VyVGVzdChTZXJ2ZXJTb2NrZXQgc2VydmVyU29ja2V0LCBib29sZWFuIGh0dHBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgRG93bmxvYWRNYW5hZ2VyIGRtID0KICAgICAgICAgICAgICAgICAoRG93bmxvYWRNYW5hZ2VyKSBnZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkRPV05MT0FEX1NFUlZJQ0UpOwogICAgICAgICBEb3dubG9hZENvbXBsZXRlUmVjZWl2ZXIgcmVjZWl2ZXIgPSBuZXcgRG93bmxvYWRDb21wbGV0ZVJlY2VpdmVyKCk7Ci0gICAgICAgIGZpbmFsIFNTTFNlcnZlclNvY2tldCBzZXJ2ZXJTb2NrZXQgPSBiaW5kVExTU2VydmVyKGNoYWluUmVzSWQsIGtleVJlc0lkKTsKICAgICAgICAgRnV0dXJlVGFzazxWb2lkPiBzZXJ2ZXJGdXR1cmUgPSBuZXcgRnV0dXJlVGFzazxWb2lkPihuZXcgQ2FsbGFibGUoKSB7CiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyBWb2lkIGNhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTkyLDcgKzEwMCw4IEBACiAgICAgICAgICAgICBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEludGVudEZpbHRlcihEb3dubG9hZE1hbmFnZXIuQUNUSU9OX0RPV05MT0FEX0NPTVBMRVRFKTsKICAgICAgICAgICAgIGdldENvbnRleHQoKS5yZWdpc3RlclJlY2VpdmVyKHJlY2VpdmVyLCBmaWx0ZXIpOwogICAgICAgICAgICAgbmV3IFRocmVhZChzZXJ2ZXJGdXR1cmUpLnN0YXJ0KCk7Ci0gICAgICAgICAgICBVcmkgZGVzdGluYXRpb24gPSBVcmkucGFyc2UoImh0dHBzOi8vbG9jYWxob3N0OiIgKyBzZXJ2ZXJTb2NrZXQuZ2V0TG9jYWxQb3J0KCkpOworICAgICAgICAgICAgU3RyaW5nIGhvc3QgPSAoaHR0cHMgPyAiaHR0cHMiIDogImh0dHAiKSArICI6Ly9sb2NhbGhvc3QiOworICAgICAgICAgICAgVXJpIGRlc3RpbmF0aW9uID0gVXJpLnBhcnNlKGhvc3QgKyAiOiIgKyBzZXJ2ZXJTb2NrZXQuZ2V0TG9jYWxQb3J0KCkpOwogICAgICAgICAgICAgbG9uZyBpZCA9IGRtLmVucXVldWUobmV3IERvd25sb2FkTWFuYWdlci5SZXF1ZXN0KGRlc3RpbmF0aW9uKSk7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIHNlcnZlckZ1dHVyZS5nZXQoVElNRU9VVCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKQEAgLTExNCw3ICsxMjMsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHJ1blNlcnZlcihTU0xTZXJ2ZXJTb2NrZXQgc2VydmVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwcml2YXRlIHZvaWQgcnVuU2VydmVyKFNlcnZlclNvY2tldCBzZXJ2ZXIpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBTb2NrZXQgcyA9IHNlcnZlci5hY2NlcHQoKTsKICAgICAgICAgcy5nZXRPdXRwdXRTdHJlYW0oKS53cml0ZShIVFRQX1JFU1BPTlNFLmdldEJ5dGVzKCkpOwogICAgICAgICBzLmdldE91dHB1dFN0cmVhbSgpLmZsdXNoKCk7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9uZXR3b3Jrc2VjdXJpdHljb25maWcvbmV0d29ya3NlY3VyaXR5Y29uZmlnLWludmFsaWQtcGluL0FuZHJvaWQubWsgYi90ZXN0cy90ZXN0cy9uZXR3b3Jrc2VjdXJpdHljb25maWcvbmV0d29ya3NlY3VyaXR5Y29uZmlnLWludmFsaWQtcGluL0FuZHJvaWQubWsKaW5kZXggNDc2NGNhYi4uMDg5OGRkYiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1pbnZhbGlkLXBpbi9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3Rlc3RzL25ldHdvcmtzZWN1cml0eWNvbmZpZy9uZXR3b3Jrc2VjdXJpdHljb25maWctaW52YWxpZC1waW4vQW5kcm9pZC5tawpAQCAtMjAsNyArMjAsOSBAQAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKIExPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCiAKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjdHN0ZXN0cnVubmVyIG9yZy5hcGFjaGUuaHR0cC5sZWdhY3kgYW5kcm9pZC1zdXBwb3J0LXRlc3QKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjdHN0ZXN0cnVubmVyLWF4dCBhbmRyb2lkeC50ZXN0LnJ1bGVzCisKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IG9yZy5hcGFjaGUuaHR0cC5sZWdhY3kKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogTE9DQUxfU1JDX0ZJTEVTICs9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgLi4vc3JjKQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1pbnZhbGlkLXBpbi9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1pbnZhbGlkLXBpbi9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGIzYjMyYjUuLjRmNTE1ZTQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL25ldHdvcmtzZWN1cml0eWNvbmZpZy9uZXR3b3Jrc2VjdXJpdHljb25maWctaW52YWxpZC1waW4vQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9uZXR3b3Jrc2VjdXJpdHljb25maWcvbmV0d29ya3NlY3VyaXR5Y29uZmlnLWludmFsaWQtcGluL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTIwLDEwICsyMCwxMSBAQAogICAgICAgICBwYWNrYWdlPSJhbmRyb2lkLnNlY3VyaXR5Lm5ldC5jb25maWcuY3RzLkN0c05ldFNlY0NvbmZpZ0ludmFsaWRQaW5UZXN0Q2FzZXMiPgogICA8YXBwbGljYXRpb24gYW5kcm9pZDpuZXR3b3JrU2VjdXJpdHlDb25maWc9IkB4bWwvbmV0d29ya19zZWN1cml0eV9jb25maWciPgogICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiLz4KKyAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJvcmcuYXBhY2hlLmh0dHAubGVnYWN5IiAvPgogICA8L2FwcGxpY2F0aW9uPgogCiAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uSU5URVJORVQiIC8+Ci0gIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5zZWN1cml0eS5uZXQuY29uZmlnLmN0cy5DdHNOZXRTZWNDb25maWdJbnZhbGlkUGluVGVzdENhc2VzIgogICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IiI+CiAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJsaXN0ZW5lciIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL25ldHdvcmtzZWN1cml0eWNvbmZpZy9uZXR3b3Jrc2VjdXJpdHljb25maWctaW52YWxpZC1waW4vQW5kcm9pZFRlc3QueG1sIGIvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1pbnZhbGlkLXBpbi9BbmRyb2lkVGVzdC54bWwKaW5kZXggN2YzYzdmZC4uYzJjNTRmMyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1pbnZhbGlkLXBpbi9BbmRyb2lkVGVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1pbnZhbGlkLXBpbi9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBDdHNOZXRTZWNDb25maWdJbnZhbGlkUGluVGVzdENhc2VzIHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJzZWN1cml0eSIgLz4KICAgICA8b3B0aW9uIG5hbWU9Im5vdC1zaGFyZGFibGUiIHZhbHVlPSJ0cnVlIiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1uZXN0ZWQtZG9tYWlucy9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1uZXN0ZWQtZG9tYWlucy9BbmRyb2lkLm1rCmluZGV4IDU0NDhmMzQuLjUwYTU3OWUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL25ldHdvcmtzZWN1cml0eWNvbmZpZy9uZXR3b3Jrc2VjdXJpdHljb25maWctbmVzdGVkLWRvbWFpbnMvQW5kcm9pZC5taworKysgYi90ZXN0cy90ZXN0cy9uZXR3b3Jrc2VjdXJpdHljb25maWcvbmV0d29ya3NlY3VyaXR5Y29uZmlnLW5lc3RlZC1kb21haW5zL0FuZHJvaWQubWsKQEAgLTIwLDcgKzIwLDkgQEAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCiBMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQogCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY3RzdGVzdHJ1bm5lciBvcmcuYXBhY2hlLmh0dHAubGVnYWN5IGFuZHJvaWQtc3VwcG9ydC10ZXN0CitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY3RzdGVzdHJ1bm5lci1heHQgYW5kcm9pZHgudGVzdC5ydWxlcworCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBvcmcuYXBhY2hlLmh0dHAubGVnYWN5CiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIExPQ0FMX1NSQ19GSUxFUyArPSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIC4uL3NyYykKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL25ldHdvcmtzZWN1cml0eWNvbmZpZy9uZXR3b3Jrc2VjdXJpdHljb25maWctbmVzdGVkLWRvbWFpbnMvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL25ldHdvcmtzZWN1cml0eWNvbmZpZy9uZXR3b3Jrc2VjdXJpdHljb25maWctbmVzdGVkLWRvbWFpbnMvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCAxNzkwMTUwLi4yOWIwNzg0IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9uZXR3b3Jrc2VjdXJpdHljb25maWcvbmV0d29ya3NlY3VyaXR5Y29uZmlnLW5lc3RlZC1kb21haW5zL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1uZXN0ZWQtZG9tYWlucy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yMCwxMCArMjAsMTEgQEAKICAgICAgICAgcGFja2FnZT0iYW5kcm9pZC5zZWN1cml0eS5uZXQuY29uZmlnLmN0cy5DdHNOZXRTZWNDb25maWdOZXN0ZWREb21haW5Db25maWdUZXN0Q2FzZXMiPgogICA8YXBwbGljYXRpb24gYW5kcm9pZDpuZXR3b3JrU2VjdXJpdHlDb25maWc9IkB4bWwvbmV0d29ya19zZWN1cml0eV9jb25maWciPgogICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiLz4KKyAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJvcmcuYXBhY2hlLmh0dHAubGVnYWN5IiAvPgogICA8L2FwcGxpY2F0aW9uPgogCiAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uSU5URVJORVQiIC8+Ci0gIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5zZWN1cml0eS5uZXQuY29uZmlnLmN0cy5DdHNOZXRTZWNDb25maWdOZXN0ZWREb21haW5Db25maWdUZXN0Q2FzZXMiCiAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iIj4KICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9Imxpc3RlbmVyIgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1uZXN0ZWQtZG9tYWlucy9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy90ZXN0cy9uZXR3b3Jrc2VjdXJpdHljb25maWcvbmV0d29ya3NlY3VyaXR5Y29uZmlnLW5lc3RlZC1kb21haW5zL0FuZHJvaWRUZXN0LnhtbAppbmRleCAwMjA5MDI1Li5jYTM3MDkxIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9uZXR3b3Jrc2VjdXJpdHljb25maWcvbmV0d29ya3NlY3VyaXR5Y29uZmlnLW5lc3RlZC1kb21haW5zL0FuZHJvaWRUZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9uZXR3b3Jrc2VjdXJpdHljb25maWcvbmV0d29ya3NlY3VyaXR5Y29uZmlnLW5lc3RlZC1kb21haW5zL0FuZHJvaWRUZXN0LnhtbApAQCAtMTQsNiArMTQsNyBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIEN0c05ldFNlY0NvbmZpZ05lc3RlZERvbWFpbkNvbmZpZ1Rlc3RDYXNlcyB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0ic2VjdXJpdHkiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJub3Qtc2hhcmRhYmxlIiB2YWx1ZT0idHJ1ZSIgLz4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL25ldHdvcmtzZWN1cml0eWNvbmZpZy9uZXR3b3Jrc2VjdXJpdHljb25maWctcmVzb3VyY2VzcmMvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL25ldHdvcmtzZWN1cml0eWNvbmZpZy9uZXR3b3Jrc2VjdXJpdHljb25maWctcmVzb3VyY2VzcmMvQW5kcm9pZC5tawppbmRleCA5MjRmMzkzLi44ZmViMDY5IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9uZXR3b3Jrc2VjdXJpdHljb25maWcvbmV0d29ya3NlY3VyaXR5Y29uZmlnLXJlc291cmNlc3JjL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1yZXNvdXJjZXNyYy9BbmRyb2lkLm1rCkBAIC0yMSwxMCArMjEsMTQgQEAKIExPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCiAKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCi0gICAgY3RzdGVzdHJ1bm5lciBcCisgICAgY3RzdGVzdHJ1bm5lci1heHQgXAorICAgIGFuZHJvaWR4LnRlc3QucnVsZXMKKworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gXAogICAgIG9yZy5hcGFjaGUuaHR0cC5sZWdhY3kgXAotICAgIGFuZHJvaWQtc3VwcG9ydC10ZXN0IFwKLSAgICBsZWdhY3ktYW5kcm9pZC10ZXN0CisgICAgYW5kcm9pZC50ZXN0LnJ1bm5lci5zdHVicyBcCisgICAgYW5kcm9pZC50ZXN0LmJhc2Uuc3R1YnMgXAorCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIExPQ0FMX1NSQ19GSUxFUyArPSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIC4uL3NyYykKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL25ldHdvcmtzZWN1cml0eWNvbmZpZy9uZXR3b3Jrc2VjdXJpdHljb25maWctcmVzb3VyY2VzcmMvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL25ldHdvcmtzZWN1cml0eWNvbmZpZy9uZXR3b3Jrc2VjdXJpdHljb25maWctcmVzb3VyY2VzcmMvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA0Njc4NzE2MC4uMzg3ZDhmNyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1yZXNvdXJjZXNyYy9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL25ldHdvcmtzZWN1cml0eWNvbmZpZy9uZXR3b3Jrc2VjdXJpdHljb25maWctcmVzb3VyY2VzcmMvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjAsMTAgKzIwLDExIEBACiAgICAgICAgIHBhY2thZ2U9ImFuZHJvaWQuc2VjdXJpdHkubmV0LmNvbmZpZy5jdHMuQ3RzTmV0U2VjQ29uZmlnUmVzb3VyY2VzU3JjVGVzdENhc2VzIj4KICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bmV0d29ya1NlY3VyaXR5Q29uZmlnPSJAeG1sL25ldHdvcmtfc2VjdXJpdHlfY29uZmlnIj4KICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIi8+CisgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0ib3JnLmFwYWNoZS5odHRwLmxlZ2FjeSIgLz4KICAgPC9hcHBsaWNhdGlvbj4KIAogICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLklOVEVSTkVUIiAvPgotICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuc2VjdXJpdHkubmV0LmNvbmZpZy5jdHMuQ3RzTmV0U2VjQ29uZmlnUmVzb3VyY2VzU3JjVGVzdENhc2VzIgogICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IiI+CiAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJsaXN0ZW5lciIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL25ldHdvcmtzZWN1cml0eWNvbmZpZy9uZXR3b3Jrc2VjdXJpdHljb25maWctcmVzb3VyY2VzcmMvQW5kcm9pZFRlc3QueG1sIGIvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1yZXNvdXJjZXNyYy9BbmRyb2lkVGVzdC54bWwKaW5kZXggNjcxNjMzZS4uMWRkOGRiNyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1yZXNvdXJjZXNyYy9BbmRyb2lkVGVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvbmV0d29ya3NlY3VyaXR5Y29uZmlnL25ldHdvcmtzZWN1cml0eWNvbmZpZy1yZXNvdXJjZXNyYy9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBDdHNOZXRTZWNDb25maWdJbnZhbGlkUGluVGVzdENhc2VzIHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJzZWN1cml0eSIgLz4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbmV1cmFsbmV0d29ya3MvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL25ldXJhbG5ldHdvcmtzL0FuZHJvaWQubWsKaW5kZXggZjFhOWVkNC4uYjQ2N2I0NCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvbmV1cmFsbmV0d29ya3MvQW5kcm9pZC5taworKysgYi90ZXN0cy90ZXN0cy9uZXVyYWxuZXR3b3Jrcy9BbmRyb2lkLm1rCkBAIC0yNCwxMCArMjQsMTMgQEAKIExPQ0FMX01PRFVMRV9TVEVNXzY0IDo9ICQoTE9DQUxfTU9EVUxFKTY0CiAKIExPQ0FMX1NSQ19GSUxFUyA6PSBcCi0gICAgIHNyYy9UZXN0VmFsaWRhdGlvbi5jcHAgXAorICAgICBzcmMvVGVzdEdlbmVyYXRlZC5jcHAgXAogICAgICBzcmMvVGVzdE1lbW9yeS5jcHAgXAogICAgICBzcmMvVGVzdFRyaXZpYWxNb2RlbC5jcHAgXAotICAgICBzcmMvVGVzdEdlbmVyYXRlZC5jcHAKKyAgICAgc3JjL1Rlc3RVbmtub3duRGltZW5zaW9ucy5jcHAgXAorICAgICBzcmMvVGVzdFZhbGlkYXRlT3BlcmF0aW9ucy5jcHAgXAorICAgICBzcmMvVGVzdFZhbGlkYXRpb24uY3BwIFwKKyAgICAgc3JjL1Rlc3RXcmFwcGVyLmNwcAogCiBMT0NBTF9DX0lOQ0xVREVTIDo9IGZyYW1ld29ya3MvbWwvbm4vcnVudGltZS9pbmNsdWRlLwogTE9DQUxfQ19JTkNMVURFUyArPSBmcmFtZXdvcmtzL21sL25uL3J1bnRpbWUvdGVzdC8KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL25ldXJhbG5ldHdvcmtzL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL25ldXJhbG5ldHdvcmtzL0FuZHJvaWRUZXN0LnhtbAppbmRleCBjZDFhMGYwLi4xMzFkYjZhIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9uZXVyYWxuZXR3b3Jrcy9BbmRyb2lkVGVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvbmV1cmFsbmV0d29ya3MvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlndXJhdGlvbiBmb3IgTmF0aXZlIE5OQVBJIFRlc3RzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0ibmV1cmFsbmV0d29ya3MiIC8+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGFyZ2V0cHJlcC5GaWxlUHVzaGVyIj4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0idHJ1ZSIgLz4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL25ldXJhbG5ldHdvcmtzL3NyYy9UZXN0VW5rbm93bkRpbWVuc2lvbnMuY3BwIGIvdGVzdHMvdGVzdHMvbmV1cmFsbmV0d29ya3Mvc3JjL1Rlc3RVbmtub3duRGltZW5zaW9ucy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY0ZDliOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL25ldXJhbG5ldHdvcmtzL3NyYy9UZXN0VW5rbm93bkRpbWVuc2lvbnMuY3BwCkBAIC0wLDAgKzEsMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBJbmNsdWRlIGNvcnJlc3BvbmRpbmcgTk5BUEkgdW5pdCB0ZXN0cyBpbiBmcmFtZXdvcmtzL21sL25uL3J1bnRpbWUvdGVzdAorI2luY2x1ZGUgInRlc3QvVGVzdFVua25vd25EaW1lbnNpb25zLmNwcCIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL25ldXJhbG5ldHdvcmtzL3NyYy9UZXN0VmFsaWRhdGVPcGVyYXRpb25zLmNwcCBiL3Rlc3RzL3Rlc3RzL25ldXJhbG5ldHdvcmtzL3NyYy9UZXN0VmFsaWRhdGVPcGVyYXRpb25zLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGQ4MWE5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvbmV1cmFsbmV0d29ya3Mvc3JjL1Rlc3RWYWxpZGF0ZU9wZXJhdGlvbnMuY3BwCkBAIC0wLDAgKzEsMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBJbmNsdWRlIGNvcnJlc3BvbmRpbmcgTk5BUEkgdW5pdCB0ZXN0cyBpbiBmcmFtZXdvcmtzL21sL25uL3J1bnRpbWUvdGVzdAorI2luY2x1ZGUgInRlc3QvVGVzdFZhbGlkYXRlT3BlcmF0aW9ucy5jcHAiCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9uZXVyYWxuZXR3b3Jrcy9zcmMvVGVzdFdyYXBwZXIuY3BwIGIvdGVzdHMvdGVzdHMvbmV1cmFsbmV0d29ya3Mvc3JjL1Rlc3RXcmFwcGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzc5NjNiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvbmV1cmFsbmV0d29ya3Mvc3JjL1Rlc3RXcmFwcGVyLmNwcApAQCAtMCwwICsxLDE4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gSW5jbHVkZSBjb3JyZXNwb25kaW5nIE5OQVBJIHVuaXQgdGVzdHMgaW4gZnJhbWV3b3Jrcy9tbC9ubi9ydW50aW1lL3Rlc3QKKyNpbmNsdWRlICJ0ZXN0L1Rlc3RXcmFwcGVyLmNwcCIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL25vdGlmaWNhdGlvbmxlZ2FjeS9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvbm90aWZpY2F0aW9ubGVnYWN5L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRkNzBhYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL25vdGlmaWNhdGlvbmxlZ2FjeS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNDIgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0xlZ2FjeU5vdGlmaWNhdGlvblRlc3RDYXNlcworTE9DQUxfUFJJVkFURV9QTEFURk9STV9BUElTIDo9IHRydWUKKworTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWR4LnRlc3QucnVsZXMKKworIyBkb24ndCBpbmNsdWRlIHRoaXMgcGFja2FnZSBpbiBhbnkgdGFyZ2V0CitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCisjIGFuZCB3aGVuIGJ1aWx0IGV4cGxpY2l0bHkgcHV0IGl0IGluIHRoZSBkYXRhIHBhcnRpdGlvbgorTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKKworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lci5zdHVicyBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicworCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAorICAgIGN0c3Rlc3RydW5uZXItYXh0IFwKKyAgICBhbmRyb2lkeC50ZXN0LnJ1bGVzIFwKKyAgICBqdW5pdAorCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCisKKyMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCisKK2luY2x1ZGUgJChCVUlMRF9DVFNfUEFDS0FHRSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ub3RpZmljYXRpb25sZWdhY3kvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL25vdGlmaWNhdGlvbmxlZ2FjeS9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNDkxMGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9ub3RpZmljYXRpb25sZWdhY3kvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDQxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgICAgcGFja2FnZT0iYW5kcm9pZC5hcHAubm90aWZpY2F0aW9uLmxlZ2FjeS5jdHMiPgorCisgICAgPHVzZXMtc2RrIGFuZHJvaWQ6bWluU2RrVmVyc2lvbj0iMjQiIGFuZHJvaWQ6dGFyZ2V0U2RrVmVyc2lvbj0iMjQiIC8+CisgICAgPGFwcGxpY2F0aW9uPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKworICAgICAgICA8c2VydmljZSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYXBwLm5vdGlmaWNhdGlvbi5sZWdhY3kuY3RzLk1vY2tOb3RpZmljYXRpb25MaXN0ZW5lciIKKyAgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iTW9ja05vdGlmaWNhdGlvbkxpc3RlbmVyIgorICAgICAgICAgICAgICAgICBhbmRyb2lkOnBlcm1pc3Npb249ImFuZHJvaWQucGVybWlzc2lvbi5CSU5EX05PVElGSUNBVElPTl9MSVNURU5FUl9TRVJWSUNFIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnNlcnZpY2Uubm90aWZpY2F0aW9uLk5vdGlmaWNhdGlvbkxpc3RlbmVyU2VydmljZSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9zZXJ2aWNlPgorICAgIDwvYXBwbGljYXRpb24+CisKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmFwcC5ub3RpZmljYXRpb24ubGVnYWN5LmN0cyIKKyAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBmb3IgbGVnYWN5IG5vdGlmaWNhdGlvbiBiZWhhdmlvciI+CisgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJsaXN0ZW5lciIKKyAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZhbHVlPSJjb20uYW5kcm9pZC5jdHMucnVubmVyLkN0c1Rlc3RSdW5MaXN0ZW5lciIgLz4KKyAgICA8L2luc3RydW1lbnRhdGlvbj4KKzwvbWFuaWZlc3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvbm90aWZpY2F0aW9ubGVnYWN5L0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL25vdGlmaWNhdGlvbmxlZ2FjeS9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkwNzY2YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL25vdGlmaWNhdGlvbmxlZ2FjeS9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBOb3RpZmljYXRpb24gbGVnYWN5IHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CisgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJmcmFtZXdvcmsiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c0xlZ2FjeU5vdGlmaWNhdGlvblRlc3RDYXNlcy5hcGsiIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkFuZHJvaWRKVW5pdFRlc3QiID4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJydW5uZXIiIHZhbHVlPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icGFja2FnZSIgdmFsdWU9ImFuZHJvaWQuYXBwLm5vdGlmaWNhdGlvbi5sZWdhY3kuY3RzIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjFtMHMiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0iaGlkZGVuLWFwaS1jaGVja3MiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ub3RpZmljYXRpb25sZWdhY3kvcmVzL2RyYXdhYmxlL2ljb25fYmxhY2suanBnIGIvdGVzdHMvdGVzdHMvbm90aWZpY2F0aW9ubGVnYWN5L3Jlcy9kcmF3YWJsZS9pY29uX2JsYWNrLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzkwNjJhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvbm90aWZpY2F0aW9ubGVnYWN5L3Jlcy9kcmF3YWJsZS9pY29uX2JsYWNrLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9ub3RpZmljYXRpb25sZWdhY3kvc3JjL2FuZHJvaWQvYXBwL25vdGlmaWNhdGlvbi9sZWdhY3kvY3RzL0xlZ2FjeU5vdGlmaWNhdGlvbk1hbmFnZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9ub3RpZmljYXRpb25sZWdhY3kvc3JjL2FuZHJvaWQvYXBwL25vdGlmaWNhdGlvbi9sZWdhY3kvY3RzL0xlZ2FjeU5vdGlmaWNhdGlvbk1hbmFnZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI1MjI4ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL25vdGlmaWNhdGlvbmxlZ2FjeS9zcmMvYW5kcm9pZC9hcHAvbm90aWZpY2F0aW9uL2xlZ2FjeS9jdHMvTGVnYWN5Tm90aWZpY2F0aW9uTWFuYWdlclRlc3QuamF2YQpAQCAtMCwwICsxLDMwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hcHAubm90aWZpY2F0aW9uLmxlZ2FjeS5jdHM7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uTWFuYWdlci5Qb2xpY3kuU1VQUFJFU1NFRF9FRkZFQ1RfRlVMTF9TQ1JFRU5fSU5URU5UOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb25NYW5hZ2VyLlBvbGljeS5TVVBQUkVTU0VEX0VGRkVDVF9MSUdIVFM7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbk1hbmFnZXIuUG9saWN5LlNVUFBSRVNTRURfRUZGRUNUX05PVElGSUNBVElPTl9MSVNUOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb25NYW5hZ2VyLlBvbGljeS5TVVBQUkVTU0VEX0VGRkVDVF9QRUVLOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb25NYW5hZ2VyLlBvbGljeS5TVVBQUkVTU0VEX0VGRkVDVF9TQ1JFRU5fT0ZGOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb25NYW5hZ2VyLlBvbGljeS5TVVBQUkVTU0VEX0VGRkVDVF9TQ1JFRU5fT047CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbk1hbmFnZXIuUG9saWN5LlNVUFBSRVNTRURfRUZGRUNUX1NUQVRVU19CQVI7CisKK2ltcG9ydCBzdGF0aWMganVuaXQuZnJhbWV3b3JrLkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOworaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb25DaGFubmVsOworaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbk1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKK2ltcG9ydCBhbmRyb2lkLmFwcC5VaUF1dG9tYXRpb247CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuVGVsZXBob255LlRocmVhZHM7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKKy8qKgorICogSG9tZSBmb3IgdGVzdHMgdGhhdCBuZWVkIHRvIHZlcmlmeSBiZWhhdmlvciBmb3IgYXBwcyB0aGF0IHRhcmdldCBvbGQgc2RrIHZlcnNpb25zLgorICovCitAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIExlZ2FjeU5vdGlmaWNhdGlvbk1hbmFnZXJUZXN0IHsKKyAgICBmaW5hbCBTdHJpbmcgVEFHID0gIkxlZ2FjeU5vTWFuVGVzdCI7CisKKyAgICBmaW5hbCBTdHJpbmcgTk9USUZJQ0FUSU9OX0NIQU5ORUxfSUQgPSAiTGVnYWN5Tm90aWZpY2F0aW9uTWFuYWdlclRlc3QiOworICAgIHByaXZhdGUgTm90aWZpY2F0aW9uTWFuYWdlciBtTm90aWZpY2F0aW9uTWFuYWdlcjsKKyAgICBwcml2YXRlIEFjdGl2aXR5TWFuYWdlciBtQWN0aXZpdHlNYW5hZ2VyOworICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKKyAgICBwcml2YXRlIE1vY2tOb3RpZmljYXRpb25MaXN0ZW5lciBtTGlzdGVuZXI7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbUNvbnRleHQgPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCk7CisgICAgICAgIHRvZ2dsZUxpc3RlbmVyQWNjZXNzKE1vY2tOb3RpZmljYXRpb25MaXN0ZW5lci5nZXRJZCgpLAorICAgICAgICAgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLCBmYWxzZSk7CisgICAgICAgIG1Ob3RpZmljYXRpb25NYW5hZ2VyID0gKE5vdGlmaWNhdGlvbk1hbmFnZXIpIG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoCisgICAgICAgICAgICAgICAgQ29udGV4dC5OT1RJRklDQVRJT05fU0VSVklDRSk7CisgICAgICAgIG1Ob3RpZmljYXRpb25NYW5hZ2VyLmNyZWF0ZU5vdGlmaWNhdGlvbkNoYW5uZWwobmV3IE5vdGlmaWNhdGlvbkNoYW5uZWwoCisgICAgICAgICAgICAgICAgTk9USUZJQ0FUSU9OX0NIQU5ORUxfSUQsICJuYW1lIiwgTm90aWZpY2F0aW9uTWFuYWdlci5JTVBPUlRBTkNFX0RFRkFVTFQpKTsKKyAgICAgICAgbUFjdGl2aXR5TWFuYWdlciA9IChBY3Rpdml0eU1hbmFnZXIpIG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BQ1RJVklUWV9TRVJWSUNFKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcmVQQ2Fubm90VG9nZ2xlQWxhcm1zQW5kTWVkaWFUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChtQWN0aXZpdHlNYW5hZ2VyLmlzTG93UmFtRGV2aWNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0b2dnbGVOb3RpZmljYXRpb25Qb2xpY3lBY2Nlc3MobUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSwKKyAgICAgICAgICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKSwgdHJ1ZSk7CisKKyAgICAgICAgLy8gUHJlLVAgY2Fubm90IHRvZ2dsZSBhbGFybXMgYW5kIG1lZGlhCisgICAgICAgIE5vdGlmaWNhdGlvbk1hbmFnZXIuUG9saWN5IG9yaWdQb2xpY3kgPSBtTm90aWZpY2F0aW9uTWFuYWdlci5nZXROb3RpZmljYXRpb25Qb2xpY3koKTsKKyAgICAgICAgaW50IGFsYXJtQml0ID0gb3JpZ1BvbGljeS5wcmlvcml0eUNhdGVnb3JpZXMgJiBOb3RpZmljYXRpb25NYW5hZ2VyLlBvbGljeQorICAgICAgICAgICAgICAgIC5QUklPUklUWV9DQVRFR09SWV9BTEFSTVM7CisgICAgICAgIGludCBtZWRpYUJpdCA9IG9yaWdQb2xpY3kucHJpb3JpdHlDYXRlZ29yaWVzICYgTm90aWZpY2F0aW9uTWFuYWdlci5Qb2xpY3kKKyAgICAgICAgICAgICAgICAuUFJJT1JJVFlfQ0FURUdPUllfTUVESUE7CisgICAgICAgIGludCBzeXN0ZW1CaXQgPSBvcmlnUG9saWN5LnByaW9yaXR5Q2F0ZWdvcmllcyAmIE5vdGlmaWNhdGlvbk1hbmFnZXIuUG9saWN5CisgICAgICAgICAgICAgICAgLlBSSU9SSVRZX0NBVEVHT1JZX1NZU1RFTTsKKworICAgICAgICAvLyBhdHRlbXB0IHRvIHRvZ2dsZSBvZmYgYWxhcm1zLCBtZWRpYSwgc3lzdGVtOgorICAgICAgICBtTm90aWZpY2F0aW9uTWFuYWdlci5zZXROb3RpZmljYXRpb25Qb2xpY3kobmV3IE5vdGlmaWNhdGlvbk1hbmFnZXIuUG9saWN5KDAsIDAsIDApKTsKKyAgICAgICAgTm90aWZpY2F0aW9uTWFuYWdlci5Qb2xpY3kgcG9saWN5ID0gbU5vdGlmaWNhdGlvbk1hbmFnZXIuZ2V0Tm90aWZpY2F0aW9uUG9saWN5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhhbGFybUJpdCwgcG9saWN5LnByaW9yaXR5Q2F0ZWdvcmllcworICAgICAgICAgICAgICAgICYgTm90aWZpY2F0aW9uTWFuYWdlci5Qb2xpY3kuUFJJT1JJVFlfQ0FURUdPUllfQUxBUk1TKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1lZGlhQml0LCBwb2xpY3kucHJpb3JpdHlDYXRlZ29yaWVzCisgICAgICAgICAgICAgICAgJiBOb3RpZmljYXRpb25NYW5hZ2VyLlBvbGljeS5QUklPUklUWV9DQVRFR09SWV9NRURJQSk7CisgICAgICAgIGFzc2VydEVxdWFscyhzeXN0ZW1CaXQsIHBvbGljeS5wcmlvcml0eUNhdGVnb3JpZXMKKyAgICAgICAgICAgICAgICAmIE5vdGlmaWNhdGlvbk1hbmFnZXIuUG9saWN5LlBSSU9SSVRZX0NBVEVHT1JZX1NZU1RFTSk7CisKKyAgICAgICAgLy8gYXR0ZW1wdCB0byB0b2dnbGUgb24gYWxhcm1zLCBtZWRpYSwgc3lzdGVtOgorICAgICAgICBtTm90aWZpY2F0aW9uTWFuYWdlci5zZXROb3RpZmljYXRpb25Qb2xpY3kobmV3IE5vdGlmaWNhdGlvbk1hbmFnZXIuUG9saWN5KAorICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbk1hbmFnZXIuUG9saWN5LlBSSU9SSVRZX0NBVEVHT1JZX0FMQVJNUworICAgICAgICAgICAgICAgICAgICAgICAgfCBOb3RpZmljYXRpb25NYW5hZ2VyLlBvbGljeS5QUklPUklUWV9DQVRFR09SWV9NRURJQSwgMCwgMCkpOworICAgICAgICBwb2xpY3kgPSBtTm90aWZpY2F0aW9uTWFuYWdlci5nZXROb3RpZmljYXRpb25Qb2xpY3koKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGFsYXJtQml0LCBwb2xpY3kucHJpb3JpdHlDYXRlZ29yaWVzCisgICAgICAgICAgICAgICAgJiBOb3RpZmljYXRpb25NYW5hZ2VyLlBvbGljeS5QUklPUklUWV9DQVRFR09SWV9BTEFSTVMpOworICAgICAgICBhc3NlcnRFcXVhbHMobWVkaWFCaXQsIHBvbGljeS5wcmlvcml0eUNhdGVnb3JpZXMKKyAgICAgICAgICAgICAgICAmIE5vdGlmaWNhdGlvbk1hbmFnZXIuUG9saWN5LlBSSU9SSVRZX0NBVEVHT1JZX01FRElBKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHN5c3RlbUJpdCwgcG9saWN5LnByaW9yaXR5Q2F0ZWdvcmllcworICAgICAgICAgICAgICAgICYgTm90aWZpY2F0aW9uTWFuYWdlci5Qb2xpY3kuUFJJT1JJVFlfQ0FURUdPUllfU1lTVEVNKTsKKworICAgICAgICB0b2dnbGVOb3RpZmljYXRpb25Qb2xpY3lBY2Nlc3MobUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSwKKyAgICAgICAgICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKSwgZmFsc2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNldE5vdGlmaWNhdGlvblBvbGljeV9wcmVQX3NldE9sZEZpZWxkcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAobUFjdGl2aXR5TWFuYWdlci5pc0xvd1JhbURldmljZSgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdG9nZ2xlTm90aWZpY2F0aW9uUG9saWN5QWNjZXNzKG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCksCisgICAgICAgICAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCksIHRydWUpOworCisgICAgICAgIE5vdGlmaWNhdGlvbk1hbmFnZXIuUG9saWN5IHVzZXJQb2xpY3kgPSBtTm90aWZpY2F0aW9uTWFuYWdlci5nZXROb3RpZmljYXRpb25Qb2xpY3koKTsKKworICAgICAgICBOb3RpZmljYXRpb25NYW5hZ2VyLlBvbGljeSBhcHBQb2xpY3kgPSBuZXcgTm90aWZpY2F0aW9uTWFuYWdlci5Qb2xpY3koMCwgMCwgMCwKKyAgICAgICAgICAgICAgICBTVVBQUkVTU0VEX0VGRkVDVF9TQ1JFRU5fT04gfCBTVVBQUkVTU0VEX0VGRkVDVF9TQ1JFRU5fT0ZGKTsKKyAgICAgICAgbU5vdGlmaWNhdGlvbk1hbmFnZXIuc2V0Tm90aWZpY2F0aW9uUG9saWN5KGFwcFBvbGljeSk7CisKKyAgICAgICAgaW50IGV4cGVjdGVkID0gdXNlclBvbGljeS5zdXBwcmVzc2VkVmlzdWFsRWZmZWN0cworICAgICAgICAgICAgICAgIHwgU1VQUFJFU1NFRF9FRkZFQ1RfU0NSRUVOX09OIHwgU1VQUFJFU1NFRF9FRkZFQ1RfU0NSRUVOX09GRgorICAgICAgICAgICAgICAgIHwgU1VQUFJFU1NFRF9FRkZFQ1RfUEVFSyB8IFNVUFBSRVNTRURfRUZGRUNUX0xJR0hUUworICAgICAgICAgICAgICAgIHwgU1VQUFJFU1NFRF9FRkZFQ1RfRlVMTF9TQ1JFRU5fSU5URU5UOworCisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwKKyAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uTWFuYWdlci5nZXROb3RpZmljYXRpb25Qb2xpY3koKS5zdXBwcmVzc2VkVmlzdWFsRWZmZWN0cyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0Tm90aWZpY2F0aW9uUG9saWN5X3ByZVBfc2V0TmV3RmllbGRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChtQWN0aXZpdHlNYW5hZ2VyLmlzTG93UmFtRGV2aWNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0b2dnbGVOb3RpZmljYXRpb25Qb2xpY3lBY2Nlc3MobUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSwKKyAgICAgICAgICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKSwgdHJ1ZSk7CisKKyAgICAgICAgTm90aWZpY2F0aW9uTWFuYWdlci5Qb2xpY3kgdXNlclBvbGljeSA9IG1Ob3RpZmljYXRpb25NYW5hZ2VyLmdldE5vdGlmaWNhdGlvblBvbGljeSgpOworCisgICAgICAgIE5vdGlmaWNhdGlvbk1hbmFnZXIuUG9saWN5IGFwcFBvbGljeSA9IG5ldyBOb3RpZmljYXRpb25NYW5hZ2VyLlBvbGljeSgwLCAwLCAwLAorICAgICAgICAgICAgICAgIFNVUFBSRVNTRURfRUZGRUNUX05PVElGSUNBVElPTl9MSVNUKTsKKyAgICAgICAgbU5vdGlmaWNhdGlvbk1hbmFnZXIuc2V0Tm90aWZpY2F0aW9uUG9saWN5KGFwcFBvbGljeSk7CisKKyAgICAgICAgaW50IGV4cGVjdGVkID0gdXNlclBvbGljeS5zdXBwcmVzc2VkVmlzdWFsRWZmZWN0czsKKyAgICAgICAgZXhwZWN0ZWQgJj0gfiBTVVBQUkVTU0VEX0VGRkVDVF9TQ1JFRU5fT0ZGICYgfiBTVVBQUkVTU0VEX0VGRkVDVF9TQ1JFRU5fT047CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwKKyAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uTWFuYWdlci5nZXROb3RpZmljYXRpb25Qb2xpY3koKS5zdXBwcmVzc2VkVmlzdWFsRWZmZWN0cyk7CisKKyAgICAgICAgdG9nZ2xlTm90aWZpY2F0aW9uUG9saWN5QWNjZXNzKG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCksCisgICAgICAgICAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCksIGZhbHNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdXNwZW5kUGFja2FnZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAobUFjdGl2aXR5TWFuYWdlci5pc0xvd1JhbURldmljZSgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdG9nZ2xlTGlzdGVuZXJBY2Nlc3MoTW9ja05vdGlmaWNhdGlvbkxpc3RlbmVyLmdldElkKCksCisgICAgICAgICAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCksIHRydWUpOworICAgICAgICBUaHJlYWQuc2xlZXAoNTAwKTsgLy8gd2FpdCBmb3IgbGlzdGVuZXIgdG8gYmUgYWxsb3dlZAorCisgICAgICAgIG1MaXN0ZW5lciA9IE1vY2tOb3RpZmljYXRpb25MaXN0ZW5lci5nZXRJbnN0YW5jZSgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChtTGlzdGVuZXIpOworCisgICAgICAgIHNlbmROb3RpZmljYXRpb24oMSwgUi5kcmF3YWJsZS5pY29uX2JsYWNrKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKDUwMCk7IC8vIHdhaXQgZm9yIG5vdGlmaWNhdGlvbiBsaXN0ZW5lciB0byByZWNlaXZlIG5vdGlmaWNhdGlvbgorICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbUxpc3RlbmVyLm1Qb3N0ZWQuc2l6ZSgpKTsKKyAgICAgICAgbUxpc3RlbmVyLnJlc2V0RGF0YSgpOworCisgICAgICAgIC8vIHN1c3BlbmQgcGFja2FnZSwgbGlzdGVuZXIgcmVjZWl2ZXMgb25SZW1vdmVkCisgICAgICAgIHN1c3BlbmRQYWNrYWdlKG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCksIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLAorICAgICAgICAgICAgICAgIHRydWUpOworICAgICAgICBUaHJlYWQuc2xlZXAoNTAwKTsgLy8gd2FpdCBmb3Igbm90aWZpY2F0aW9uIGxpc3RlbmVyIHRvIGdldCByZXNwb25zZQorICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbUxpc3RlbmVyLm1SZW1vdmVkLnNpemUoKSk7CisKKyAgICAgICAgLy8gdW5zdXNwZW5kIHBhY2thZ2UsIGxpc3RlbmVyIHJlY2VpdmVzIG9uUG9zdGVkCisgICAgICAgIHN1c3BlbmRQYWNrYWdlKG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCksIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLAorICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKDUwMCk7IC8vIHdhaXQgZm9yIG5vdGlmaWNhdGlvbiBsaXN0ZW5lciB0byBnZXQgcmVzcG9uc2UKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1MaXN0ZW5lci5tUG9zdGVkLnNpemUoKSk7CisKKyAgICAgICAgdG9nZ2xlTGlzdGVuZXJBY2Nlc3MoTW9ja05vdGlmaWNhdGlvbkxpc3RlbmVyLmdldElkKCksCisgICAgICAgICAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCksIGZhbHNlKTsKKworICAgICAgICBtTGlzdGVuZXIucmVzZXREYXRhKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0Tm90aWZpY2F0aW9uUG9saWN5X3ByZVBfc2V0T2xkTmV3RmllbGRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChtQWN0aXZpdHlNYW5hZ2VyLmlzTG93UmFtRGV2aWNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0b2dnbGVOb3RpZmljYXRpb25Qb2xpY3lBY2Nlc3MobUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSwKKyAgICAgICAgICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKSwgdHJ1ZSk7CisKKyAgICAgICAgTm90aWZpY2F0aW9uTWFuYWdlci5Qb2xpY3kgdXNlclBvbGljeSA9IG1Ob3RpZmljYXRpb25NYW5hZ2VyLmdldE5vdGlmaWNhdGlvblBvbGljeSgpOworCisgICAgICAgIE5vdGlmaWNhdGlvbk1hbmFnZXIuUG9saWN5IGFwcFBvbGljeSA9IG5ldyBOb3RpZmljYXRpb25NYW5hZ2VyLlBvbGljeSgwLCAwLCAwLAorICAgICAgICAgICAgICAgIFNVUFBSRVNTRURfRUZGRUNUX1NDUkVFTl9PTiB8IFNVUFBSRVNTRURfRUZGRUNUX1NUQVRVU19CQVIpOworICAgICAgICBtTm90aWZpY2F0aW9uTWFuYWdlci5zZXROb3RpZmljYXRpb25Qb2xpY3koYXBwUG9saWN5KTsKKworICAgICAgICBpbnQgZXhwZWN0ZWQgPSB1c2VyUG9saWN5LnN1cHByZXNzZWRWaXN1YWxFZmZlY3RzCisgICAgICAgICAgICAgICAgfCBTVVBQUkVTU0VEX0VGRkVDVF9TQ1JFRU5fT04gfCBTVVBQUkVTU0VEX0VGRkVDVF9QRUVLOworICAgICAgICBleHBlY3RlZCAmPSB+IFNVUFBSRVNTRURfRUZGRUNUX1NDUkVFTl9PRkY7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwKKyAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uTWFuYWdlci5nZXROb3RpZmljYXRpb25Qb2xpY3koKS5zdXBwcmVzc2VkVmlzdWFsRWZmZWN0cyk7CisKKyAgICAgICAgdG9nZ2xlTm90aWZpY2F0aW9uUG9saWN5QWNjZXNzKG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCksCisgICAgICAgICAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCksIGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2VuZE5vdGlmaWNhdGlvbihmaW5hbCBpbnQgaWQsIGZpbmFsIGludCBpY29uKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc2VuZE5vdGlmaWNhdGlvbihpZCwgbnVsbCwgaWNvbik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNlbmROb3RpZmljYXRpb24oZmluYWwgaW50IGlkLCBTdHJpbmcgZ3JvdXBLZXksIGZpbmFsIGludCBpY29uKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9NQUlOLCBUaHJlYWRzLkNPTlRFTlRfVVJJKTsKKworICAgICAgICBpbnRlbnQuc2V0RmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0sgfCBJbnRlbnQuRkxBR19BQ1RJVklUWV9TSU5HTEVfVE9QCisgICAgICAgICAgICAgICAgfCBJbnRlbnQuRkxBR19BQ1RJVklUWV9DTEVBUl9UT1ApOworICAgICAgICBpbnRlbnQuc2V0QWN0aW9uKEludGVudC5BQ1RJT05fTUFJTik7CisKKyAgICAgICAgZmluYWwgUGVuZGluZ0ludGVudCBwZW5kaW5nSW50ZW50ID0gUGVuZGluZ0ludGVudC5nZXRBY3Rpdml0eShtQ29udGV4dCwgMCwgaW50ZW50LCAwKTsKKyAgICAgICAgZmluYWwgTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiA9CisgICAgICAgICAgICAgICAgbmV3IE5vdGlmaWNhdGlvbi5CdWlsZGVyKG1Db250ZXh0LCBOT1RJRklDQVRJT05fQ0hBTk5FTF9JRCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTbWFsbEljb24oaWNvbikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRXaGVuKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnRUaXRsZSgibm90aWZ5IyIgKyBpZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50VGV4dCgiVGhpcyBpcyAjIiArIGlkICsgIm5vdGlmaWNhdGlvbiAgIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50SW50ZW50KHBlbmRpbmdJbnRlbnQpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0R3JvdXAoZ3JvdXBLZXkpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgbU5vdGlmaWNhdGlvbk1hbmFnZXIubm90aWZ5KGlkLCBub3RpZmljYXRpb24pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0b2dnbGVOb3RpZmljYXRpb25Qb2xpY3lBY2Nlc3MoU3RyaW5nIHBhY2thZ2VOYW1lLAorICAgICAgICAgICAgSW5zdHJ1bWVudGF0aW9uIGluc3RydW1lbnRhdGlvbiwgYm9vbGVhbiBvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgY29tbWFuZCA9ICIgY21kIG5vdGlmaWNhdGlvbiAiICsgKG9uID8gImFsbG93X2RuZCAiIDogImRpc2FsbG93X2RuZCAiKSArIHBhY2thZ2VOYW1lOworCisgICAgICAgIHJ1bkNvbW1hbmQoY29tbWFuZCwgaW5zdHJ1bWVudGF0aW9uKTsKKworICAgICAgICBOb3RpZmljYXRpb25NYW5hZ2VyIG5tID0gbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShOb3RpZmljYXRpb25NYW5hZ2VyLmNsYXNzKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiTm90aWZpY2F0aW9uIFBvbGljeSBBY2Nlc3MgR3JhbnQgaXMgIiArCisgICAgICAgICAgICAgICAgICAgICAgICBubS5pc05vdGlmaWNhdGlvblBvbGljeUFjY2Vzc0dyYW50ZWQoKSArICIgbm90ICIgKyBvbiwgb24sCisgICAgICAgICAgICAgICAgbm0uaXNOb3RpZmljYXRpb25Qb2xpY3lBY2Nlc3NHcmFudGVkKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzdXNwZW5kUGFja2FnZShTdHJpbmcgcGFja2FnZU5hbWUsCisgICAgICAgICAgICBJbnN0cnVtZW50YXRpb24gaW5zdHJ1bWVudGF0aW9uLCBib29sZWFuIHN1c3BlbmQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBjb21tYW5kID0gIiBjbWQgbm90aWZpY2F0aW9uICIgKyAoc3VzcGVuZCA/ICJzdXNwZW5kX3BhY2thZ2UgIgorICAgICAgICAgICAgICAgIDogInVuc3VzcGVuZF9wYWNrYWdlICIpICsgcGFja2FnZU5hbWU7CisKKyAgICAgICAgcnVuQ29tbWFuZChjb21tYW5kLCBpbnN0cnVtZW50YXRpb24pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0b2dnbGVMaXN0ZW5lckFjY2VzcyhTdHJpbmcgY29tcG9uZW50TmFtZSwgSW5zdHJ1bWVudGF0aW9uIGluc3RydW1lbnRhdGlvbiwKKyAgICAgICAgICAgIGJvb2xlYW4gb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIGNvbW1hbmQgPSAiIGNtZCBub3RpZmljYXRpb24gIiArIChvbiA/ICJhbGxvd19saXN0ZW5lciAiIDogImRpc2FsbG93X2xpc3RlbmVyICIpCisgICAgICAgICAgICAgICAgKyBjb21wb25lbnROYW1lOworCisgICAgICAgIHJ1bkNvbW1hbmQoY29tbWFuZCwgaW5zdHJ1bWVudGF0aW9uKTsKKworICAgICAgICBmaW5hbCBOb3RpZmljYXRpb25NYW5hZ2VyIG5tID0gbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShOb3RpZmljYXRpb25NYW5hZ2VyLmNsYXNzKTsKKyAgICAgICAgZmluYWwgQ29tcG9uZW50TmFtZSBsaXN0ZW5lckNvbXBvbmVudCA9IE1vY2tOb3RpZmljYXRpb25MaXN0ZW5lci5nZXRDb21wb25lbnROYW1lKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGxpc3RlbmVyQ29tcG9uZW50ICsgIiBoYXMgbm90IGJlZW4gZ3JhbnRlZCBhY2Nlc3MiLAorICAgICAgICAgICAgICAgIG5tLmlzTm90aWZpY2F0aW9uTGlzdGVuZXJBY2Nlc3NHcmFudGVkKGxpc3RlbmVyQ29tcG9uZW50KSA9PSBvbik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJ1bkNvbW1hbmQoU3RyaW5nIGNvbW1hbmQsIEluc3RydW1lbnRhdGlvbiBpbnN0cnVtZW50YXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFVpQXV0b21hdGlvbiB1aUF1dG9tYXRpb24gPSBpbnN0cnVtZW50YXRpb24uZ2V0VWlBdXRvbWF0aW9uKCk7CisgICAgICAgIC8vIEV4ZWN1dGUgY29tbWFuZAorICAgICAgICB0cnkgKFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkID0gdWlBdXRvbWF0aW9uLmV4ZWN1dGVTaGVsbENvbW1hbmQoY29tbWFuZCkpIHsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKCJGYWlsZWQgdG8gZXhlY3V0ZSBzaGVsbCBjb21tYW5kOiAiICsgY29tbWFuZCwgZmQpOworICAgICAgICAgICAgLy8gV2FpdCBmb3IgdGhlIGNvbW1hbmQgdG8gZmluaXNoIGJ5IHJlYWRpbmcgdW50aWwgRU9GCisgICAgICAgICAgICB0cnkgKElucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmZC5nZXRGaWxlRGVzY3JpcHRvcigpKSkgeworICAgICAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVs0MDk2XTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoaW4ucmVhZChidWZmZXIpID4gMCkge30KKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkNvdWxkIG5vdCByZWFkIHN0ZG91dCBvZiBjb21tYW5kOsKgIiArIGNvbW1hbmQsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdWlBdXRvbWF0aW9uLmRlc3Ryb3koKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL25vdGlmaWNhdGlvbmxlZ2FjeS9zcmMvYW5kcm9pZC9hcHAvbm90aWZpY2F0aW9uL2xlZ2FjeS9jdHMvTW9ja05vdGlmaWNhdGlvbkxpc3RlbmVyLmphdmEgYi90ZXN0cy90ZXN0cy9ub3RpZmljYXRpb25sZWdhY3kvc3JjL2FuZHJvaWQvYXBwL25vdGlmaWNhdGlvbi9sZWdhY3kvY3RzL01vY2tOb3RpZmljYXRpb25MaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNDM1OWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9ub3RpZmljYXRpb25sZWdhY3kvc3JjL2FuZHJvaWQvYXBwL25vdGlmaWNhdGlvbi9sZWdhY3kvY3RzL01vY2tOb3RpZmljYXRpb25MaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLmFwcC5ub3RpZmljYXRpb24ubGVnYWN5LmN0czsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuc2VydmljZS5ub3RpZmljYXRpb24uTm90aWZpY2F0aW9uTGlzdGVuZXJTZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQuc2VydmljZS5ub3RpZmljYXRpb24uU3RhdHVzQmFyTm90aWZpY2F0aW9uOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitwdWJsaWMgY2xhc3MgTW9ja05vdGlmaWNhdGlvbkxpc3RlbmVyIGV4dGVuZHMgTm90aWZpY2F0aW9uTGlzdGVuZXJTZXJ2aWNlIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiVGVzdE5vdGlmaWNhdGlvbkxpc3RlbmVyIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQS0cgPSAiYW5kcm9pZC5hcHAubm90aWZpY2F0aW9uLmxlZ2FjeS5jdHMiOworCisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8U3RyaW5nPiBtVGVzdFBhY2thZ2VzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICBwdWJsaWMgQXJyYXlMaXN0PFN0YXR1c0Jhck5vdGlmaWNhdGlvbj4gbVBvc3RlZCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgIHB1YmxpYyBBcnJheUxpc3Q8U3RhdHVzQmFyTm90aWZpY2F0aW9uPiBtUmVtb3ZlZCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgIHB1YmxpYyBSYW5raW5nTWFwIG1SYW5raW5nTWFwOworCisgICAgcHJpdmF0ZSBzdGF0aWMgTW9ja05vdGlmaWNhdGlvbkxpc3RlbmVyIHNOb3RpZmljYXRpb25MaXN0ZW5lckluc3RhbmNlID0gbnVsbDsKKyAgICBib29sZWFuIGlzQ29ubmVjdGVkOworCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SWQoKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlcy8lcyIsIE1vY2tOb3RpZmljYXRpb25MaXN0ZW5lci5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgIE1vY2tOb3RpZmljYXRpb25MaXN0ZW5lci5jbGFzcy5nZXROYW1lKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQ29tcG9uZW50TmFtZSBnZXRDb21wb25lbnROYW1lKCkgeworICAgICAgICByZXR1cm4gbmV3IENvbXBvbmVudE5hbWUoTW9ja05vdGlmaWNhdGlvbkxpc3RlbmVyLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgTW9ja05vdGlmaWNhdGlvbkxpc3RlbmVyLmNsYXNzLmdldE5hbWUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKCk7CisgICAgICAgIG1UZXN0UGFja2FnZXMuYWRkKFBLRyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25MaXN0ZW5lckNvbm5lY3RlZCgpIHsKKyAgICAgICAgc3VwZXIub25MaXN0ZW5lckNvbm5lY3RlZCgpOworICAgICAgICBzTm90aWZpY2F0aW9uTGlzdGVuZXJJbnN0YW5jZSA9IHRoaXM7CisgICAgICAgIGlzQ29ubmVjdGVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkxpc3RlbmVyRGlzY29ubmVjdGVkKCkgeworICAgICAgICBpc0Nvbm5lY3RlZCA9IGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTW9ja05vdGlmaWNhdGlvbkxpc3RlbmVyIGdldEluc3RhbmNlKCkgeworICAgICAgICByZXR1cm4gc05vdGlmaWNhdGlvbkxpc3RlbmVySW5zdGFuY2U7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVzZXREYXRhKCkgeworICAgICAgICBtUG9zdGVkLmNsZWFyKCk7CisgICAgICAgIG1SZW1vdmVkLmNsZWFyKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25Ob3RpZmljYXRpb25Qb3N0ZWQoU3RhdHVzQmFyTm90aWZpY2F0aW9uIHNibiwgUmFua2luZ01hcCByYW5raW5nTWFwKSB7CisgICAgICAgIGlmICghbVRlc3RQYWNrYWdlcy5jb250YWlucyhzYm4uZ2V0UGFja2FnZU5hbWUoKSkpIHsgcmV0dXJuOyB9CisgICAgICAgIG1Qb3N0ZWQuYWRkKHNibik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25Ob3RpZmljYXRpb25SZW1vdmVkKFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBzYm4sIFJhbmtpbmdNYXAgcmFua2luZ01hcCkgeworICAgICAgICBpZiAoIW1UZXN0UGFja2FnZXMuY29udGFpbnMoc2JuLmdldFBhY2thZ2VOYW1lKCkpKSB7IHJldHVybjsgfQorICAgICAgICBtUmVtb3ZlZC5hZGQoc2JuKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbk5vdGlmaWNhdGlvblJhbmtpbmdVcGRhdGUoUmFua2luZ01hcCByYW5raW5nTWFwKSB7CisgICAgICAgIG1SYW5raW5nTWFwID0gcmFua2luZ01hcDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9vcGVuZ2wvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL29wZW5nbC9BbmRyb2lkLm1rCmluZGV4IDkzMzhkODEuLjBiNzU4NDcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL29wZW5nbC9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3Rlc3RzL29wZW5nbC9BbmRyb2lkLm1rCkBAIC0yOSw3ICsyOSw5IEBACiAKIExPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTIDo9IGxpYm9wZW5nbHRlc3Rfam5pCiAKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsIGN0c3Rlc3RydW5uZXIgbGVnYWN5LWFuZHJvaWQtdGVzdAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGN0c3Rlc3RydW5uZXItYXh0IGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0CisKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIuc3R1YnMgYW5kcm9pZC50ZXN0LmJhc2Uuc3R1YnMKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9vcGVuZ2wvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL29wZW5nbC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGMxNmYyNWEuLjdiNjQ1YWEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL29wZW5nbC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL29wZW5nbC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yMSw3ICsyMSw3IEBACiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5ESVNBQkxFX0tFWUdVQVJEIiAvPgogICAgIDx1c2VzLWZlYXR1cmUgYW5kcm9pZDpnbEVzVmVyc2lvbj0iMHgwMDAyMDAwMCIvPgogICAgIDxpbnN0cnVtZW50YXRpb24KLSAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLm9wZW5nbC5jdHMiID4KICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9Imxpc3RlbmVyIgogICAgICAgICAgICAgYW5kcm9pZDp2YWx1ZT0iY29tLmFuZHJvaWQuY3RzLnJ1bm5lci5DdHNUZXN0UnVuTGlzdGVuZXIiIC8+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9vcGVuZ2wvQW5kcm9pZFRlc3QueG1sIGIvdGVzdHMvdGVzdHMvb3BlbmdsL0FuZHJvaWRUZXN0LnhtbAppbmRleCBmYzI0MjIzLi40NDE0MTgyIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9vcGVuZ2wvQW5kcm9pZFRlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL29wZW5nbC9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBPcGVuR0wgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImdyYXBoaWNzIiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9vcGVuZ2wvbGlib3BlbmdsdGVzdC9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvb3BlbmdsL2xpYm9wZW5nbHRlc3QvQW5kcm9pZC5tawppbmRleCBmMDVmZDhjLi5hZWQwMTFhIDEwMDc1NQotLS0gYS90ZXN0cy90ZXN0cy9vcGVuZ2wvbGlib3BlbmdsdGVzdC9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3Rlc3RzL29wZW5nbC9saWJvcGVuZ2x0ZXN0L0FuZHJvaWQubWsKQEAgLTM2LDExICszNiwxMyBAQAogCiBMT0NBTF9DX0lOQ0xVREVTIDo9ICQoSk5JX0hfSU5DTFVERSkKIAotTE9DQUxfQ1hYX1NUTCA6PSBsaWJjKytfc3RhdGljCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CitMT0NBTF9OREtfU1RMX1ZBUklBTlQgOj0gbm9uZQogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYkdMRVN2MiBsaWJsb2cKIAotTE9DQUxfQ0ZMQUdTIDo9IC1Xbm8tdW51c2VkLXBhcmFtZXRlcgorTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IgLVduby11bnVzZWQtcGFyYW1ldGVyCitMT0NBTF9DRkxBR1MgKz0gLVduby1zaWduLWNvbXBhcmUgLVduby11bnVzZWQtZnVuY3Rpb24gLVduby11bnVzZWQtdmFyaWFibGUKIAogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9vcGVuZ2wvbGlib3BlbmdsdGVzdC9jb2xvcl9vbmUuY3BwIGIvdGVzdHMvdGVzdHMvb3BlbmdsL2xpYm9wZW5nbHRlc3QvY29sb3Jfb25lLmNwcAppbmRleCAyN2Q0MDBjLi5jNTZhOTM3IDEwMDc1NQotLS0gYS90ZXN0cy90ZXN0cy9vcGVuZ2wvbGlib3BlbmdsdGVzdC9jb2xvcl9vbmUuY3BwCisrKyBiL3Rlc3RzL3Rlc3RzL29wZW5nbC9saWJvcGVuZ2x0ZXN0L2NvbG9yX29uZS5jcHAKQEAgLTExMSw3ICsxMTEsNyBAQAogCiAKICAgICBnbFJlYWRQaXhlbHMod2lkdGgvMiwgaGVpZ2h0LzIsIDEsMSwgR0xfUkdCQSwgR0xfVU5TSUdORURfQllURSwgKEdMdm9pZCopJmRhdGEpOwotICAgIGZvcihpbnQgaSA9IDA7IGkgPCBzaXplb2YoZGF0YSk7IGkrKyl7CisgICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IHNpemVvZihkYXRhKTsgaSsrKXsKICAgICAgICAgZGF0YUZsb2F0W2ldID0gZGF0YVtpXTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL29wZW5nbC9zcmMvYW5kcm9pZC9vcGVuZ2wvY3RzL0J5dGVCdWZmZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9vcGVuZ2wvc3JjL2FuZHJvaWQvb3BlbmdsL2N0cy9CeXRlQnVmZmVyVGVzdC5qYXZhCmluZGV4IDhkNTk2YjQuLjgwYWFmMDAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL29wZW5nbC9zcmMvYW5kcm9pZC9vcGVuZ2wvY3RzL0J5dGVCdWZmZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvb3BlbmdsL3NyYy9hbmRyb2lkL29wZW5nbC9jdHMvQnl0ZUJ1ZmZlclRlc3QuamF2YQpAQCAtMTYsMTQgKzE2LDYgQEAKIAogcGFja2FnZSBhbmRyb2lkLm9wZW5nbC5jdHM7CiAKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLWltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuQmxvY2tKVW5pdDRDbGFzc1J1bm5lcjsKLQotaW1wb3J0IGphdmEubmlvLkJ1ZmZlcjsKLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotCiBpbXBvcnQgc3RhdGljIGFuZHJvaWQub3BlbmdsLkdMRVMzMC5HTF9CVUZGRVJfTUFQX1BPSU5URVI7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQub3BlbmdsLkdMRVMzMC5HTF9EWU5BTUlDX1JFQUQ7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQub3BlbmdsLkdMRVMzMC5HTF9NQVBfUkVBRF9CSVQ7CkBAIC0zNSw5ICsyNywxOSBAQAogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm9wZW5nbC5HTEVTMzAuZ2xHZXRCdWZmZXJQb2ludGVydjsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5vcGVuZ2wuR0xFUzMwLmdsTWFwQnVmZmVyUmFuZ2U7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQub3BlbmdsLkdMRVMzMC5nbFVubWFwQnVmZmVyOworCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5CbG9ja0pVbml0NENsYXNzUnVubmVyOworCitpbXBvcnQgamF2YS5uaW8uQnVmZmVyOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CisKIC8qKgogICogVGVzdHMgZm9yIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBhIEJ5dGVCdWZmZXIuCiAgKi8KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL29wZW5nbC9zcmMvYW5kcm9pZC9vcGVuZ2wvY3RzL0NvbXByZXNzZWRUZXh0dXJlVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvb3BlbmdsL3NyYy9hbmRyb2lkL29wZW5nbC9jdHMvQ29tcHJlc3NlZFRleHR1cmVUZXN0LmphdmEKaW5kZXggMTM3YzhkNC4uMjU1YzU1ZCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvb3BlbmdsL3NyYy9hbmRyb2lkL29wZW5nbC9jdHMvQ29tcHJlc3NlZFRleHR1cmVUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvb3BlbmdsL3NyYy9hbmRyb2lkL29wZW5nbC9jdHMvQ29tcHJlc3NlZFRleHR1cmVUZXN0LmphdmEKQEAgLTE5LDEwICsxOSwxMSBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiAKIGltcG9ydCBvcmcuanVuaXQuSWdub3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvb3BlbmdsL3NyYy9hbmRyb2lkL29wZW5nbC9jdHMvRWdsQ29uZmlnVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvb3BlbmdsL3NyYy9hbmRyb2lkL29wZW5nbC9jdHMvRWdsQ29uZmlnVGVzdC5qYXZhCmluZGV4IDk1ZWQ2MTguLjNlNTU2NWUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL29wZW5nbC9zcmMvYW5kcm9pZC9vcGVuZ2wvY3RzL0VnbENvbmZpZ1Rlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9vcGVuZ2wvc3JjL2FuZHJvaWQvb3BlbmdsL2N0cy9FZ2xDb25maWdUZXN0LmphdmEKQEAgLTIwLDEwICsyMCwxMSBAQAogCiBpbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5MYXJnZVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTGFyZ2VUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvb3BlbmdsL3NyYy9hbmRyb2lkL29wZW5nbC9jdHMvRWdsQ29udGV4dFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL29wZW5nbC9zcmMvYW5kcm9pZC9vcGVuZ2wvY3RzL0VnbENvbnRleHRUZXN0LmphdmEKaW5kZXggM2NmZDJkNS4uODFiYmNmMiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvb3BlbmdsL3NyYy9hbmRyb2lkL29wZW5nbC9jdHMvRWdsQ29udGV4dFRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9vcGVuZ2wvc3JjL2FuZHJvaWQvb3BlbmdsL2N0cy9FZ2xDb250ZXh0VGVzdC5qYXZhCkBAIC0xOSw4ICsxOSw5IEBACiBpbXBvcnQgYW5kcm9pZC5vcGVuZ2wuRUdMMTQ7CiBpbXBvcnQgYW5kcm9pZC5vcGVuZ2wuRUdMQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLm9wZW5nbC5FR0xEaXNwbGF5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvb3BlbmdsL3NyYy9hbmRyb2lkL29wZW5nbC9jdHMvRWdsU3VyZmFjZXNUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9vcGVuZ2wvc3JjL2FuZHJvaWQvb3BlbmdsL2N0cy9FZ2xTdXJmYWNlc1Rlc3QuamF2YQppbmRleCBjOTA5ZWViLi4zMDMwMDUyIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9vcGVuZ2wvc3JjL2FuZHJvaWQvb3BlbmdsL2N0cy9FZ2xTdXJmYWNlc1Rlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9vcGVuZ2wvc3JjL2FuZHJvaWQvb3BlbmdsL2N0cy9FZ2xTdXJmYWNlc1Rlc3QuamF2YQpAQCAtMTYsOSArMTYsMTMgQEAKIAogcGFja2FnZSBhbmRyb2lkLm9wZW5nbC5jdHM7CiAKK2ltcG9ydCBzdGF0aWMganVuaXQuZnJhbWV3b3JrLkFzc2VydC5mYWlsOworCiBpbXBvcnQgYW5kcm9pZC5vcGVuZ2wuRUdMMTQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKQEAgLTI3LDggKzMxLDYgQEAKIGltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMQ29udGV4dDsKIGltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMRGlzcGxheTsKIAotaW1wb3J0IHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0LmZhaWw7Ci0KIC8qKgogICogVGVzdHMgdXNpbmcgRUdMIHN1cmZhY2VzLgogICovCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9vcGVuZ2wvc3JjL2FuZHJvaWQvb3BlbmdsL2N0cy9HTFN1cmZhY2VWaWV3VGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvb3BlbmdsL3NyYy9hbmRyb2lkL29wZW5nbC9jdHMvR0xTdXJmYWNlVmlld1Rlc3QuamF2YQppbmRleCA1NDU0N2JkLi5lOWRjNDU2IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9vcGVuZ2wvc3JjL2FuZHJvaWQvb3BlbmdsL2N0cy9HTFN1cmZhY2VWaWV3VGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL29wZW5nbC9zcmMvYW5kcm9pZC9vcGVuZ2wvY3RzL0dMU3VyZmFjZVZpZXdUZXN0LmphdmEKQEAgLTE3LDEyICsxNywxMyBAQAogcGFja2FnZSBhbmRyb2lkLm9wZW5nbC5jdHM7CiAKIGltcG9ydCBhbmRyb2lkLm9wZW5nbC5HTFN1cmZhY2VWaWV3OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTGFyZ2VUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTGFyZ2VUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvb3BlbmdsL3NyYy9hbmRyb2lkL29wZW5nbC9jdHMvT3BlbkdsRXNWZXJzaW9uVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvb3BlbmdsL3NyYy9hbmRyb2lkL29wZW5nbC9jdHMvT3BlbkdsRXNWZXJzaW9uVGVzdC5qYXZhCmluZGV4IDY3NDE1ZDcwLi43YmE5NDM1IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9vcGVuZ2wvc3JjL2FuZHJvaWQvb3BlbmdsL2N0cy9PcGVuR2xFc1ZlcnNpb25UZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvb3BlbmdsL3NyYy9hbmRyb2lkL29wZW5nbC9jdHMvT3BlbkdsRXNWZXJzaW9uVGVzdC5qYXZhCkBAIC0yNiwxMSArMjYsMTMgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQ29uZmlndXJhdGlvbkluZm87CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkZlYXR1cmVJbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLkxhcmdlVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTGFyZ2VUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNkZFRlc3Q7CiAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwpAQCAtMTcxLDM1ICsxNzMsNTkgQEAKICAgICAgICAgaWYgKCFzdXBwb3J0c1ZySGlnaFBlcmZvcm1hbmNlKCkpCiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIHJlc3RhcnRBY3Rpdml0eVdpdGhDbGllbnRWZXJzaW9uKDMpOworICAgICAgICBmaW5hbCBib29sZWFuIGlzVnJIZWFkc2V0ID0gKG1BY3Rpdml0eS5nZXRSZXNvdXJjZXMoKS5nZXRDb25maWd1cmF0aW9uKCkudWlNb2RlCisgICAgICAgICAgICAmIENvbmZpZ3VyYXRpb24uVUlfTU9ERV9UWVBFX01BU0spID09IENvbmZpZ3VyYXRpb24uVUlfTU9ERV9UWVBFX1ZSX0hFQURTRVQ7CiAKICAgICAgICAgU3RyaW5nIGV4dGVuc2lvbnMgPSBtQWN0aXZpdHkuZ2V0RXh0ZW5zaW9uc1N0cmluZygpOwogICAgICAgICBmaW5hbCBTdHJpbmcgcmVxdWlyZWRMaXN0W10gPSB7Ci0gICAgICAgICAgICAiRVhUX3Byb3RlY3RlZF90ZXh0dXJlcyIsCi0gICAgICAgICAgICAiRVhUX211bHRpc2FtcGxlZF9yZW5kZXJfdG9fdGV4dHVyZSIsCi0gICAgICAgICAgICAiT1ZSX211bHRpdmlldyIsCi0gICAgICAgICAgICAiT1ZSX211bHRpdmlld19tdWx0aXNhbXBsZWRfcmVuZGVyX3RvX3RleHR1cmUiLAotICAgICAgICAgICAgIk9WUl9tdWx0aXZpZXcyIiwKKyAgICAgICAgICAgICJHTF9FWFRfbXVsdGlzYW1wbGVkX3JlbmRlcl90b190ZXh0dXJlIiwKKyAgICAgICAgICAgICJHTF9FWFRfcHJvdGVjdGVkX3RleHR1cmVzIiwKKyAgICAgICAgICAgICJHTF9PVlJfbXVsdGl2aWV3IiwKKyAgICAgICAgICAgICJHTF9PVlJfbXVsdGl2aWV3MiIsCisgICAgICAgICAgICAiR0xfT1ZSX211bHRpdmlld19tdWx0aXNhbXBsZWRfcmVuZGVyX3RvX3RleHR1cmUiLAorICAgICAgICB9OworICAgICAgICBmaW5hbCBTdHJpbmcgdnJIZWFkc2V0UmVxdWlyZWRMaXN0W10gPSB7CisgICAgICAgICAgICAiR0xfRVhUX0VHTF9pbWFnZV9hcnJheSIsCisgICAgICAgICAgICAiR0xfRVhUX2V4dGVybmFsX2J1ZmZlciIsCisgICAgICAgICAgICAiR0xfRVhUX211bHRpc2FtcGxlZF9yZW5kZXJfdG9fdGV4dHVyZTIiLAogICAgICAgICB9OwogCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVxdWlyZWRMaXN0Lmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJSZXF1aXJlZCBleHRlbnNpb24gZm9yIFZSIGhpZ2gtcGVyZm9ybWFuY2UgaXMgbWlzc2luZzogIiArIHJlcXVpcmVkTGlzdFtpXSwKLSAgICAgICAgICAgICAgICAgICAgaGFzRXh0ZW5zaW9uKGV4dGVuc2lvbnMsIHJlcXVpcmVkTGlzdFtpXSkpOworICAgICAgICBmb3IgKFN0cmluZyByZXF1aXJlZEV4dGVuc2lvbiA6IHJlcXVpcmVkTGlzdCkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiUmVxdWlyZWQgZXh0ZW5zaW9uIGZvciBWUiBoaWdoLXBlcmZvcm1hbmNlIGlzIG1pc3Npbmc6ICIgKyByZXF1aXJlZEV4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgaGFzRXh0ZW5zaW9uKGV4dGVuc2lvbnMsIHJlcXVpcmVkRXh0ZW5zaW9uKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzVnJIZWFkc2V0KSB7CisgICAgICAgICAgICBmb3IgKFN0cmluZyByZXF1aXJlZEV4dGVuc2lvbiA6IHZySGVhZHNldFJlcXVpcmVkTGlzdCkgeworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIlJlcXVpcmVkIGV4dGVuc2lvbiBmb3IgVlIgaGlnaC1wZXJmb3JtYW5jZSBpcyBtaXNzaW5nOiAiICsgcmVxdWlyZWRFeHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBoYXNFeHRlbnNpb24oZXh0ZW5zaW9ucywgcmVxdWlyZWRFeHRlbnNpb24pKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIEVHTDEwIGVnbCA9IChFR0wxMCkgRUdMQ29udGV4dC5nZXRFR0woKTsKICAgICAgICAgRUdMRGlzcGxheSBkaXNwbGF5ID0gZWdsLmVnbEdldERpc3BsYXkoRUdMMTAuRUdMX0RFRkFVTFRfRElTUExBWSk7CiAgICAgICAgIGV4dGVuc2lvbnMgPSBlZ2wuZWdsUXVlcnlTdHJpbmcoZGlzcGxheSwgRUdMMTAuRUdMX0VYVEVOU0lPTlMpOwogICAgICAgICBmaW5hbCBTdHJpbmcgcmVxdWlyZWRFZ2xMaXN0W10gPSB7Ci0gICAgICAgICAgICAiRUdMX0FORFJPSURfZ2V0X25hdGl2ZV9jbGllbnRfYnVmZmVyIiwKICAgICAgICAgICAgICJFR0xfQU5EUk9JRF9mcm9udF9idWZmZXJfYXV0b19yZWZyZXNoIiwKKyAgICAgICAgICAgICJFR0xfQU5EUk9JRF9nZXRfbmF0aXZlX2NsaWVudF9idWZmZXIiLAogICAgICAgICAgICAgIkVHTF9FWFRfcHJvdGVjdGVkX2NvbnRlbnQiLAorICAgICAgICAgICAgIkVHTF9JTUdfY29udGV4dF9wcmlvcml0eSIsCisgICAgICAgICAgICAiRUdMX0tIUl9mZW5jZV9zeW5jIiwKICAgICAgICAgICAgICJFR0xfS0hSX211dGFibGVfcmVuZGVyX2J1ZmZlciIsCiAgICAgICAgICAgICAiRUdMX0tIUl93YWl0X3N5bmMiLAogICAgICAgICB9OworICAgICAgICBmaW5hbCBTdHJpbmcgdnJIZWFkc2V0UmVxdWlyZWRFZ2xMaXN0W10gPSB7CisgICAgICAgICAgICAiRUdMX0VYVF9pbWFnZV9nbF9jb2xvcnNwYWNlIiwKKyAgICAgICAgfTsKIAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcXVpcmVkTGlzdC5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiUmVxdWlyZWQgRUdMIGV4dGVuc2lvbiBmb3IgVlIgaGlnaC1wZXJmb3JtYW5jZSBpcyBtaXNzaW5nOiAiICsKLSAgICAgICAgICAgICAgICByZXF1aXJlZEVnbExpc3RbaV0sIGhhc0V4dGVuc2lvbihleHRlbnNpb25zLCByZXF1aXJlZEVnbExpc3RbaV0pKTsKKyAgICAgICAgZm9yIChTdHJpbmcgcmVxdWlyZWRFeHRlbnNpb24gOiByZXF1aXJlZEVnbExpc3QpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlJlcXVpcmVkIEVHTCBleHRlbnNpb24gZm9yIFZSIGhpZ2gtcGVyZm9ybWFuY2UgaXMgbWlzc2luZzogIiArIHJlcXVpcmVkRXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICBoYXNFeHRlbnNpb24oZXh0ZW5zaW9ucywgcmVxdWlyZWRFeHRlbnNpb24pKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNWckhlYWRzZXQpIHsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIHJlcXVpcmVkRXh0ZW5zaW9uIDogdnJIZWFkc2V0UmVxdWlyZWRFZ2xMaXN0KSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiUmVxdWlyZWQgRUdMIGV4dGVuc2lvbiBmb3IgVlIgaGlnaC1wZXJmb3JtYW5jZSBpcyBtaXNzaW5nOiAiICsgcmVxdWlyZWRFeHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBoYXNFeHRlbnNpb24oZXh0ZW5zaW9ucywgcmVxdWlyZWRFeHRlbnNpb24pKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KICAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iNy4xLjQuMS9DLTYtMSIpCkBAIC0zNzAsOCArMzk2LDggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gd2hldGhlciB0aGUgc3lzdGVtIHN1cHBvcnRzIEZFQVRVUkVfVlJfTU9ERSBhbmQKLSAgICAgKiBGRUFUVVJFX1ZSX01PREVfSElHSF9QRVJGT1JNQU5DRS4gVGhpcyBpcyB1c2VkIHRvIHNraXAgc29tZSB0ZXN0cy4KKyAgICAgKiBSZXR1cm4gd2hldGhlciB0aGUgc3lzdGVtIHN1cHBvcnRzIEZFQVRVUkVfVlJfTU9ERV9ISUdIX1BFUkZPUk1BTkNFLgorICAgICAqIFRoaXMgaXMgdXNlZCB0byBza2lwIHNvbWUgdGVzdHMuCiAgICAgICovCiAgICAgcHJpdmF0ZSBib29sZWFuIHN1cHBvcnRzVnJIaWdoUGVyZm9ybWFuY2UoKSB7CiAgICAgICAgIFBhY2thZ2VNYW5hZ2VyIHBtID0gbUFjdGl2aXR5LmdldFBhY2thZ2VNYW5hZ2VyKCk7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9vcGVuZ2wvc3JjL2FuZHJvaWQvb3BlbmdsL2N0cy9QYXJhbXNUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9vcGVuZ2wvc3JjL2FuZHJvaWQvb3BlbmdsL2N0cy9QYXJhbXNUZXN0LmphdmEKaW5kZXggOTZmZDgxZS4uNTY2NDZiYyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvb3BlbmdsL3NyYy9hbmRyb2lkL29wZW5nbC9jdHMvUGFyYW1zVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL29wZW5nbC9zcmMvYW5kcm9pZC9vcGVuZ2wvY3RzL1BhcmFtc1Rlc3QuamF2YQpAQCAtMTYsMTcgKzE2LDE5IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5vcGVuZ2wuY3RzOwogCi1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQub3BlbmdsLkdMRVMyMC5nbERlbGV0ZUJ1ZmZlcnM7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQub3BlbmdsLkdMRVMzMC5nbEdlbkJ1ZmZlcnM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVycy5CbG9ja0pVbml0NENsYXNzUnVubmVyOwogCiBpbXBvcnQgamF2YS5uaW8uSW50QnVmZmVyOwogCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQub3BlbmdsLkdMRVMyMC5nbERlbGV0ZUJ1ZmZlcnM7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQub3BlbmdsLkdMRVMzMC5nbEdlbkJ1ZmZlcnM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLQogLyoqCiAgKiBUZXN0cyBmb3IgcGFyYW1ldGVycyB2YWxpZGF0aW9uLgogICovCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9vcGVuZ2xwZXJmL0FuZHJvaWQubWsgYi90ZXN0cy90ZXN0cy9vcGVuZ2xwZXJmL0FuZHJvaWQubWsKaW5kZXggNzY2OTIwNC4uMDNiYTAwOCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvb3BlbmdscGVyZi9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3Rlc3RzL29wZW5nbHBlcmYvQW5kcm9pZC5tawpAQCAtMjQsNyArMjQsOSBAQAogIyBJbmNsdWRlIGJvdGggdGhlIDMyIGFuZCA2NCBiaXQgdmVyc2lvbnMKIExPQ0FMX01VTFRJTElCIDo9IGJvdGgKIAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGN0c3Rlc3RydW5uZXIgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGN0c3Rlc3RydW5uZXItYXh0IGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0CisKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIuc3R1YnMgYW5kcm9pZC50ZXN0LmJhc2Uuc3R1YnMKIAogTE9DQUxfSk5JX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3Rzb3BlbmdscGVyZl9qbmkgbGlibmF0aXZlaGVscGVyX2NvbXBhdF9saWJjKysKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvb3BlbmdscGVyZi9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdGVzdHMvb3BlbmdscGVyZi9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDkzMzVhNjUuLjVjY2RjMWUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL29wZW5nbHBlcmYvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9vcGVuZ2xwZXJmL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTI3LDEzICsyNywxMyBAQAogICAgIDwhLS0gVHdvIGFjdGl2aXRpZXMgYXJlIHVzZWQgLS0+CiAgICAgPGluc3RydW1lbnRhdGlvbgogICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5yZXBsaWNhLnJlcGxpY2Fpc2xhbmQiCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIgPgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIgPgogICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0ibGlzdGVuZXIiCiAgICAgICAgICAgICBhbmRyb2lkOnZhbHVlPSJjb20uYW5kcm9pZC5jdHMucnVubmVyLkN0c1Rlc3RSdW5MaXN0ZW5lciIgLz4KICAgICA8L2luc3RydW1lbnRhdGlvbj4KICAgICA8aW5zdHJ1bWVudGF0aW9uCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5vcGVuZ2xwZXJmLmN0cyIKLSAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIj4KKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiPgogICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0ibGlzdGVuZXIiCiAgICAgICAgICAgICBhbmRyb2lkOnZhbHVlPSJjb20uYW5kcm9pZC5jdHMucnVubmVyLkN0c1Rlc3RSdW5MaXN0ZW5lciIgLz4KICAgICA8L2luc3RydW1lbnRhdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL29wZW5nbHBlcmYvQW5kcm9pZFRlc3QueG1sIGIvdGVzdHMvdGVzdHMvb3BlbmdscGVyZi9BbmRyb2lkVGVzdC54bWwKaW5kZXggZGM2YjJhOC4uNDhjY2VlYyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvb3BlbmdscGVyZi9BbmRyb2lkVGVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvb3BlbmdscGVyZi9BbmRyb2lkVGVzdC54bWwKQEAgLTEzLDYgKzEzLDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBPcGVuR0wgUGVyZm9ybWFuY2UgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImdyYXBoaWNzIiAvPgogICAgIDxvcHRpb24gbmFtZT0ibm90LXNoYXJkYWJsZSIgdmFsdWU9InRydWUiIC8+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9vcGVuZ2xwZXJmL2puaS9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvb3BlbmdscGVyZi9qbmkvQW5kcm9pZC5tawppbmRleCAzZmU0NDhhLi5mZWYzMGExIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9vcGVuZ2xwZXJmL2puaS9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3Rlc3RzL29wZW5nbHBlcmYvam5pL0FuZHJvaWQubWsKQEAgLTI4LDYgKzI4LDYgQEAKIAogTE9DQUxfU0RLX1ZFUlNJT04gOj0gMTQKIAotTE9DQUxfQ0ZMQUdTIDo9IC1Xbm8tdW51c2VkLXBhcmFtZXRlcgorTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IgLVduby11bnVzZWQtcGFyYW1ldGVyCiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL29zL0FuZHJvaWQubWsgYi90ZXN0cy90ZXN0cy9vcy9BbmRyb2lkLm1rCmluZGV4IDFhYTQ2Y2MuLmNjMTQ3OTAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL29zL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvdGVzdHMvb3MvQW5kcm9pZC5tawpAQCAtMjUsMTIgKzI1LDEyIEBACiBMT0NBTF9NVUxUSUxJQiA6PSBib3RoCiAKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCi0gICAgYW5kcm9pZC1zdXBwb3J0LXRlc3QgXAotICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwgXAotICAgIGN0c3Rlc3RydW5uZXIgXAorICAgIGFuZHJvaWR4LnRlc3QucnVsZXMgXAorICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0IFwKKyAgICBjdHN0ZXN0cnVubmVyLWF4dCBcCisgICAgdHJ1dGgtcHJlYnVpbHQgXAogICAgIGd1YXZhIFwKLSAgICBqdW5pdCBcCi0gICAgbGVnYWN5LWFuZHJvaWQtdGVzdAorICAgIGp1bml0CiAKIExPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmN0c19qbmkgbGliY3Rzb3Nfam5pIGxpYm5hdGl2ZWhlbHBlcl9jb21wYXRfbGliYysrCiAKQEAgLTQ5LDcgKzQ5LDkgQEAKIAogIyB1bmNvbW1lbnQgd2hlbiBiLzEzMjgyMjU0IGlzIGZpeGVkCiAjTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAotTE9DQUxfSkFWQV9MSUJSQVJJRVMgKz0gYW5kcm9pZC50ZXN0LnJ1bm5lcgorTE9DQUxfUFJJVkFURV9QTEFURk9STV9BUElTIDo9IHRydWUKK0xPQ0FMX0pBVkFfTElCUkFSSUVTICs9IGFuZHJvaWQudGVzdC5ydW5uZXIuc3R1YnMKK0xPQ0FMX0pBVkFfTElCUkFSSUVTICs9IGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCiAKICMgRG8gbm90IGNvbXByZXNzIG1pbmlqYWlsIHBvbGljeSBmaWxlcy4KIExPQ0FMX0FBUFRfRkxBR1MgOj0gLTAgLnBvbGljeQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvb3MvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL29zL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggYTIyN2NjMy4uZWY0ODkzZSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvb3MvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9vcy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC00NSw3ICs0NSw3IEBACiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5ERVZJQ0VfUE9XRVIiIC8+CiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQub3MuY3RzLnBlcm1pc3Npb24uVEVTVF9HUkFOVEVEIiAvPgogCi0gICAgPGFwcGxpY2F0aW9uPgorICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOnVzZXNDbGVhcnRleHRUcmFmZmljPSJ0cnVlIj4KICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5vcy5jdHMuTGF1bmNocGFkQWN0aXZpdHkiCiAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmNvbmZpZ0NoYW5nZXM9ImtleWJvYXJkSGlkZGVufG9yaWVudGF0aW9ufHNjcmVlblNpemUiCiAgICAgICAgICAgICAgICAgICBhbmRyb2lkOm11bHRpcHJvY2Vzcz0idHJ1ZSI+CkBAIC0xMzksNyArMTM5LDcgQEAKICAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CiAgICAgPC9hcHBsaWNhdGlvbj4KIAotICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQub3MuY3RzIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIG9mIGFuZHJvaWQub3MiPgogICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0ibGlzdGVuZXIiCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9vcy9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy90ZXN0cy9vcy9BbmRyb2lkVGVzdC54bWwKaW5kZXggMjdmMjM1YS4uOGY4ZDk5NyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvb3MvQW5kcm9pZFRlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL29zL0FuZHJvaWRUZXN0LnhtbApAQCAtMTQsNiArMTQsNyBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZ3VyYXRpb24gZm9yIE9TIFRlc3RzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iZnJhbWV3b3JrIiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CkBAIC0yMiw1ICsyMywxMSBAQAogICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5BbmRyb2lkSlVuaXRUZXN0IiA+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icGFja2FnZSIgdmFsdWU9ImFuZHJvaWQub3MuY3RzIiAvPgogICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjNtMTVzIiAvPgorICAgICAgICA8IS0tIERvIG5vdCBkaXNhYmxlIGhpZGRlbi1hcGktY2hlY2tzIGZvciB0aGlzIHRlc3QuIFRoaXMgdGVzdCBpbmNsdWRlcworICAgICAgICAgICAgIFN0cmljdE1vZGVUZXN0IHdoaWNoIHJlbGllcyBvbiBoaWRkZW4gQVBJIGNoZWNrcyBiZWluZyBlbmFibGVkIGluCisgICAgICAgICAgICAgb3JkZXIgdG8gZnVuY3Rpb24gcHJvcGVybHkuIEFueSBBUElzIHVzZWQgYnkgdGhpcyB0ZXN0IHNob3VsZCBiZQorICAgICAgICAgICAgIGFkZGVkIHRvIHRoZSBsaWdodCBncmV5IGxpc3QsIG9yIG1hZGUgQFRlc3RBcGkgaW5zdGVhZC4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJoaWRkZW4tYXBpLWNoZWNrcyIgdmFsdWU9ImZhbHNlIiAvPgorICAgICAgICAtLT4KICAgICA8L3Rlc3Q+CiA8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9vcy9hc3NldHMvcGxhdGZvcm1fdmVyc2lvbnMudHh0IGIvdGVzdHMvdGVzdHMvb3MvYXNzZXRzL3BsYXRmb3JtX3ZlcnNpb25zLnR4dAppbmRleCA4MTA0Y2FiLi5mMTFjODJhIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9vcy9hc3NldHMvcGxhdGZvcm1fdmVyc2lvbnMudHh0CisrKyBiL3Rlc3RzL3Rlc3RzL29zL2Fzc2V0cy9wbGF0Zm9ybV92ZXJzaW9ucy50eHQKQEAgLTEgKzEgQEAKLTguMS4wCis5ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvb3Mvam5pL0FuZHJvaWQubWsgYi90ZXN0cy90ZXN0cy9vcy9qbmkvQW5kcm9pZC5tawppbmRleCA2OGY4MzljLi41OGI5ZDAxIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9vcy9qbmkvQW5kcm9pZC5taworKysgYi90ZXN0cy90ZXN0cy9vcy9qbmkvQW5kcm9pZC5tawpAQCAtMjksNyArMjksOCBAQAogCQlhbmRyb2lkX29zX2N0c19PU0ZlYXR1cmVzLmNwcCBcCiAJCWFuZHJvaWRfb3NfY3RzX05vRXhlY3V0ZVBlcm1pc3Npb25UZXN0LmNwcCBcCiAJCWFuZHJvaWRfb3NfY3RzX1NlY2NvbXBUZXN0LmNwcCBcCi0JCWFuZHJvaWRfb3NfY3RzX1NoYXJlZE1lbW9yeS5jcHAKKwkJYW5kcm9pZF9vc19jdHNfU2hhcmVkTWVtb3J5LmNwcCBcCisJCWFuZHJvaWRfb3NfY3RzX1NQTUlUZXN0LmNwcAogCiBMT0NBTF9DX0lOQ0xVREVTIDo9ICQoSk5JX0hfSU5DTFVERSkKIApAQCAtNTYsNyArNTcsMTYgQEAKIAlMT0NBTF9DRkxBR1MgKz0gLURBUkNIX1NVUFBPUlRTX1NFQ0NPTVAKIGVuZGlmCiAKLUxPQ0FMX0NGTEFHUyA6PSAtV25vLXVudXNlZC1wYXJhbWV0ZXIKK0xPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yIC1Xbm8tdW51c2VkLXBhcmFtZXRlcgorTE9DQUxfQ0ZMQUdTICs9IC1Xbm8taW5saW5lLWFzbSAtV25vLXVudXNlZC1jb25zdC12YXJpYWJsZQorCisjIExldCdzIG92ZXJ3cml0ZSAtbWNwdSBpbiBjYXNlIGl0J3Mgc2V0IHRvIHNvbWUgQVJNdjggY29yZSBieQorIyBUQVJHRVRfMk5EX0NQVV9WQVJJQU5UIGFuZCBjYXVzZXMgY2xhbmcgdG8gaWdub3JlIHRoZSAtbWFyY2ggYmVsb3cuCiBMT0NBTF9DUFBGTEFHU19hcm0gOj0gLW1jcHU9Z2VuZXJpYwogCisjIFRoZSBBUk0gdmVyc2lvbiBvZiB0aGlzIGxpYnJhcnkgbXVzdCBiZSBidWlsdCB1c2luZyBBUk12NyBJU0EgKGV2ZW4gaWYgaXQKKyMgY2FuIGJlIHJ1biBvbiBhcm12OCBjb3Jlcykgc2luY2Ugb25lIG9mIHRoZSB0ZXN0ZWQgaW5zdHJ1Y3Rpb24sIHN3cCwgaXMKKyMgb25seSBzdXBwb3J0ZWQgaW4gQVJNdjcgKGFuZCBvbGRlcikgY29yZXMsIGFuZCBvYnNvbGV0ZSBpbiBBUk12OC4KK0xPQ0FMX0NQUEZMQUdTX2FybSArPSAtbWFyY2g9YXJtdjctYQorCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9vcy9qbmkvQ3RzT3NKbmlPbkxvYWQuY3BwIGIvdGVzdHMvdGVzdHMvb3Mvam5pL0N0c09zSm5pT25Mb2FkLmNwcAppbmRleCAxNjZhZWY3Li4xNTRmMDc1IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9vcy9qbmkvQ3RzT3NKbmlPbkxvYWQuY3BwCisrKyBiL3Rlc3RzL3Rlc3RzL29zL2puaS9DdHNPc0puaU9uTG9hZC5jcHAKQEAgLTMzLDYgKzMzLDggQEAKIAogZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX29zX2N0c19TaGFyZWRNZW1vcnlUZXN0KEpOSUVudiopOwogCitleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfb3NfY3RzX1NQTUlUZXN0KEpOSUVudiAqKTsKKwogamludCBKTklfT25Mb2FkKEphdmFWTSAqdm0sIHZvaWQgKnJlc2VydmVkKSB7CiAgICAgSk5JRW52ICplbnYgPSBOVUxMOwogCkBAIC02OCw1ICs3MCw5IEBACiAgICAgICAgIHJldHVybiBKTklfRVJSOwogICAgIH0KIAorICAgaWYgKHJlZ2lzdGVyX2FuZHJvaWRfb3NfY3RzX1NQTUlUZXN0KGVudikpIHsKKyAgICAgICByZXR1cm4gSk5JX0VSUjsKKyAgIH0KKwogICAgIHJldHVybiBKTklfVkVSU0lPTl8xXzQ7CiB9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9vcy9qbmkvYW5kcm9pZF9vc19jdHNfTm9FeGVjdXRlUGVybWlzc2lvblRlc3QuY3BwIGIvdGVzdHMvdGVzdHMvb3Mvam5pL2FuZHJvaWRfb3NfY3RzX05vRXhlY3V0ZVBlcm1pc3Npb25UZXN0LmNwcAppbmRleCA1NDI1ZmRlLi41YzEzNzZiIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9vcy9qbmkvYW5kcm9pZF9vc19jdHNfTm9FeGVjdXRlUGVybWlzc2lvblRlc3QuY3BwCisrKyBiL3Rlc3RzL3Rlc3RzL29zL2puaS9hbmRyb2lkX29zX2N0c19Ob0V4ZWN1dGVQZXJtaXNzaW9uVGVzdC5jcHAKQEAgLTQ1LDExICs0NSw2IEBACiAgICAgcmV0dXJuIHJldHZhbDsKIH0KIAotc3RhdGljIGpib29sZWFuIGFuZHJvaWRfb3NfY3RzX05vRXhlY3V0ZVBlcm1pc3Npb25UZXN0X2lzTXlDb2RlRXhlY3V0YWJsZShKTklFbnYqLCBqb2JqZWN0KQotewotICAgIHJldHVybiBpc0FkZHJlc3NFeGVjdXRhYmxlKCh1aW50cHRyX3QpIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7Ci19Ci0KIHN0YXRpYyBqYm9vbGVhbiBhbmRyb2lkX29zX2N0c19Ob0V4ZWN1dGVQZXJtaXNzaW9uVGVzdF9pc1N0YWNrRXhlY3V0YWJsZShKTklFbnYqLCBqb2JqZWN0KQogewogICAgIHVuc2lnbmVkIGludCBmb287CkBAIC03MCw4ICs2NSw2IEBACiB9CiAKIHN0YXRpYyBKTklOYXRpdmVNZXRob2QgZ01ldGhvZHNbXSA9IHsKLSAgICB7ICAiaXNNeUNvZGVFeGVjdXRhYmxlIiwgIigpWiIsCi0gICAgICAgICAgICAodm9pZCAqKSBhbmRyb2lkX29zX2N0c19Ob0V4ZWN1dGVQZXJtaXNzaW9uVGVzdF9pc015Q29kZUV4ZWN1dGFibGUgIH0sCiAgICAgeyAgImlzU3RhY2tFeGVjdXRhYmxlIiwgIigpWiIsCiAgICAgICAgICAgICAodm9pZCAqKSBhbmRyb2lkX29zX2N0c19Ob0V4ZWN1dGVQZXJtaXNzaW9uVGVzdF9pc1N0YWNrRXhlY3V0YWJsZSAgfSwKICAgICB7ICAiaXNIZWFwRXhlY3V0YWJsZSIsICIoKVoiLApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvb3Mvam5pL2FuZHJvaWRfb3NfY3RzX1NQTUlUZXN0LmNwcCBiL3Rlc3RzL3Rlc3RzL29zL2puaS9hbmRyb2lkX29zX2N0c19TUE1JVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRjNWQ2ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL29zL2puaS9hbmRyb2lkX29zX2N0c19TUE1JVGVzdC5jcHAKQEAgLTAsMCArMSw2MCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxqbmkuaD4KKyNpbmNsdWRlIDxsaW51eC9saW1pdHMuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK2pib29sZWFuIGFuZHJvaWRfb3NfY3RzX1NQTUlUZXN0X2xlYWtQb2ludGVyKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopIHsKKyAgamJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKKyAgc3RydWN0IGRpcmVudCAqKm5hbWVsaXN0ID0gTlVMTDsKKyAgY2hhciAqcGF0aCA9IChjaGFyKikiL3N5cy9rZXJuZWwvZGVidWciOworICBpbnQgbiA9IHNjYW5kaXIocGF0aCwgJm5hbWVsaXN0LCBOVUxMLCBOVUxMKTsKKyAgaWYgKG4gPD0gMCkgeworICAgIHByaW50Zigic2NhbmRpciAlcyBmYWlsZWQgJXNcbiIsIHBhdGgsIHN0cmVycm9yKGVycm5vKSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgaW50IGkgPSAwOworICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CisgICAgaWYgKHN0cnN0cihuYW1lbGlzdFtpXS0+ZF9uYW1lLCAiZmZmZmZmYyIpICE9IE5VTEwpIHsKKyAgICAgIHJlc3VsdCA9IGZhbHNlOworICAgIH0KKyAgfQorICB3aGlsZSAobi0tKSB7CisgICAgZnJlZShuYW1lbGlzdFtuXSk7CisgIH0KKyAgZnJlZShuYW1lbGlzdCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBKTklOYXRpdmVNZXRob2QgZ01ldGhvZHNbXSA9IHsKKyAgICB7ImxlYWtQb2ludGVyIiwgIigpWiIsICh2b2lkICopYW5kcm9pZF9vc19jdHNfU1BNSVRlc3RfbGVha1BvaW50ZXJ9LAorfTsKKworaW50IHJlZ2lzdGVyX2FuZHJvaWRfb3NfY3RzX1NQTUlUZXN0KEpOSUVudiAqZW52KSB7CisgIGpjbGFzcyBjbGF6eiA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL29zL2N0cy9TUE1JVGVzdCIpOworCisgIHJldHVybiBlbnYtPlJlZ2lzdGVyTmF0aXZlcyhjbGF6eiwgZ01ldGhvZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZ01ldGhvZHMpIC8gc2l6ZW9mKEpOSU5hdGl2ZU1ldGhvZCkpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvb3Mvam5pL2FuZHJvaWRfb3NfY3RzX1RhZ2dlZFBvaW50ZXIuY3BwIGIvdGVzdHMvdGVzdHMvb3Mvam5pL2FuZHJvaWRfb3NfY3RzX1RhZ2dlZFBvaW50ZXIuY3BwCmluZGV4IGY2NTZmNTAuLmRjYTZhZTIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL29zL2puaS9hbmRyb2lkX29zX2N0c19UYWdnZWRQb2ludGVyLmNwcAorKysgYi90ZXN0cy90ZXN0cy9vcy9qbmkvYW5kcm9pZF9vc19jdHNfVGFnZ2VkUG9pbnRlci5jcHAKQEAgLTE4LDcgKzE4LDYgQEAKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPHNldGptcC5oPgogI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvb3Mvc3JjL2FuZHJvaWQvb3MvY3RzL0FzeW5jVGFza1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL29zL3NyYy9hbmRyb2lkL29zL2N0cy9Bc3luY1Rhc2tUZXN0LmphdmEKaW5kZXggMWMyZjkxZS4uZWExZDUwNiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvb3Mvc3JjL2FuZHJvaWQvb3MvY3RzL0FzeW5jVGFza1Rlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9vcy9zcmMvYW5kcm9pZC9vcy9jdHMvQXN5bmNUYXNrVGVzdC5qYXZhCkBAIC0xNiw3ICsxNiw3IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5vcy5jdHM7CiAKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Ob25OdWxsOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTm9uTnVsbDsKIGltcG9ydCBhbmRyb2lkLm9zLkFzeW5jVGFzazsKIGltcG9ydCBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdENhc2U7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL29zL3NyYy9hbmRyb2lkL29zL2N0cy9CaW5kZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9vcy9zcmMvYW5kcm9pZC9vcy9jdHMvQmluZGVyVGVzdC5qYXZhCmluZGV4IDQzNWUyNDcuLjU5YjgxZTIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL29zL3NyYy9hbmRyb2lkL29zL2N0cy9CaW5kZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvb3Mvc3JjL2FuZHJvaWQvb3MvY3RzL0JpbmRlclRlc3QuamF2YQpAQCAtMTksNiArMTksOSBAQAogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZURlc2NyaXB0b3I7CiBpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKQEAgLTMzNSw4ICszMzgsNDEgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0Sm9pblRocmVhZFBvb2woKSB7Ci0gICAgICAgIC8vZnJvbSBqYXZhIGRvYyB0aGlzIGZ1bmN0aW9uIHdvbid0IGJlIHJldHVybiB1bnRpbCB0aGUgY3VycmVudCBwcm9jZXNzIGlzIGV4aXRpbmcuCi0gICAgICAgIC8vc28gbm90IHN1aXRhYmxlIHRvIHRlc3QgaXQgaW4gdW5pdCB0ZXN0CisgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIHdhaXRMYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggYWxlcnRMYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICAgICAgVGhyZWFkIGpvaW5UaHJlYWQgPSBuZXcgVGhyZWFkKCJKb2luVGhyZWFkUG9vbC1UaHJlYWQiKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICB3YWl0TGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICAgICAgQmluZGVyLmpvaW5UaHJlYWRQb29sKCk7CisgICAgICAgICAgICAgICAgLy8gU2hvdWxkIG5vdCByZWFjaCBoZXJlLiBMZXQgdGhlIG1haW4gdGhyZWFkIGtub3cuCisgICAgICAgICAgICAgICAgYWxlcnRMYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgam9pblRocmVhZC5zZXREYWVtb24odHJ1ZSk7CisgICAgICAgIGpvaW5UaHJlYWQuc3RhcnQoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydFRydWUod2FpdExhdGNoLmF3YWl0KDEwLCBUaW1lVW5pdC5TRUNPTkRTKSk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkludGVycnVwdGVkRXhjZXB0aW9uIik7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIFRoaXMgd2FpdHMgYSBzbWFsbCBhbW91bnQgb2YgdGltZSwgaG9waW5nIHRoYXQgaWYgam9pblRocmVhZFBvb2wKKyAgICAgICAgICAgIC8vIGZhaWxzLCBpdCBmYWlscyBmYXN0LgorICAgICAgICAgICAgYXNzZXJ0RmFsc2UoYWxlcnRMYXRjaC5hd2FpdCgzLCBUaW1lVW5pdC5TRUNPTkRTKSk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkludGVycnVwdGVkRXhjZXB0aW9uIik7CisgICAgICAgIH0KKyAgICAgICAgLy8gQ29uZmlybSB0aGF0IHRoZSB0aHJlYWQgaXMgYWN0dWFsbHkgaW4gam9pblRocmVhZFBvb2wuCisgICAgICAgIFN0YWNrVHJhY2VFbGVtZW50IHN0YWNrW10gPSBqb2luVGhyZWFkLmdldFN0YWNrVHJhY2UoKTsKKyAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworICAgICAgICBmb3IgKFN0YWNrVHJhY2VFbGVtZW50IGVsZW0gOiBzdGFjaykgeworICAgICAgICAgICAgaWYgKGVsZW0udG9TdHJpbmcoKS5jb250YWlucygiQmluZGVyLmpvaW5UaHJlYWRQb29sIikpIHsKKyAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMudG9TdHJpbmcoc3RhY2spLCBmb3VuZCk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdENsZWFyQ2FsbGluZ0lkZW50aXR5KCkgewpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvb3Mvc3JjL2FuZHJvaWQvb3MvY3RzL0J1aWxkVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvb3Mvc3JjL2FuZHJvaWQvb3MvY3RzL0J1aWxkVGVzdC5qYXZhCmluZGV4IGY2MmI0NzAuLmIzNzFhZDEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL29zL3NyYy9hbmRyb2lkL29zL2N0cy9CdWlsZFRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9vcy9zcmMvYW5kcm9pZC9vcy9jdHMvQnVpbGRUZXN0LmphdmEKQEAgLTE2LDEzICsxNiwxNiBAQAogCiBwYWNrYWdlIGFuZHJvaWQub3MuY3RzOwogCitpbXBvcnQgc3RhdGljIGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTi5DT0RFTkFNRTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OX0NPREVTLkNVUl9ERVZFTE9QTUVOVDsKIAogaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5SZXN0cmljdGVkQnVpbGRUZXN0OwogCiBpbXBvcnQgZGFsdmlrLnN5c3RlbS5WTVJ1bnRpbWU7CiAKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwpAQCAtMzEsMTEgKzM0LDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuU2Nhbm5lcjsKIGltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKIAotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT04uQ09ERU5BTUU7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTl9DT0RFUy5DVVJfREVWRUxPUE1FTlQ7Ci0KIHB1YmxpYyBjbGFzcyBCdWlsZFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9fUFJPRFVDVF9DUFVfQUJJTElTVCA9ICJyby5wcm9kdWN0LmNwdS5hYmlsaXN0IjsKQEAgLTQ1LDcgKzQzLDcgQEAKICAgICAvKiogVGVzdHMgdGhhdCBjaGVjayB0aGUgdmFsdWVzIG9mIHtAbGluayBCdWlsZCNDUFVfQUJJfSBhbmQge0BsaW5rIEJ1aWxkI0NQVV9BQkkyfS4gKi8KICAgICBwdWJsaWMgdm9pZCB0ZXN0Q3B1QWJpKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHJ1blRlc3RDcHVBYmlDb21tb24oKTsKLSAgICAgICAgaWYgKFZNUnVudGltZS5nZXRSdW50aW1lKCkuaXM2NEJpdCgpKSB7CisgICAgICAgIGlmIChhbmRyb2lkLm9zLlByb2Nlc3MuaXM2NEJpdCgpKSB7CiAgICAgICAgICAgICBydW5UZXN0Q3B1QWJpNjQoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHJ1blRlc3RDcHVBYmkzMigpOwpAQCAtMjU0LDYgKzI1MiwyNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLyoqCisgICAgICogVmVyaWZ5IHRoYXQgU0RLIHZlcnNpb25zIGFyZSBib3VuZGVkIGJ5IGJvdGggaGlnaCBhbmQgbG93IGV4cGVjdGVkCisgICAgICogdmFsdWVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTZGtJbnQoKSB7CisgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICAgICAgIkN1cnJlbnQgU0RLIHZlcnNpb24gIiArIEJ1aWxkLlZFUlNJT04uU0RLX0lOVAorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGlzIGludmFsaWQ7IG11c3QgYmUgYXQgbGVhc3QgVkVSU0lPTl9DT0RFUy5CQVNFIiwKKyAgICAgICAgICAgICAgICBCdWlsZC5WRVJTSU9OLlNES19JTlQgPj0gQnVpbGQuVkVSU0lPTl9DT0RFUy5CQVNFKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICAgICAiRmlyc3QgU0RLIHZlcnNpb24gIiArIEJ1aWxkLlZFUlNJT04uRklSU1RfU0RLX0lOVAorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGlzIGludmFsaWQ7IG11c3QgYmUgYXQgbGVhc3QgVkVSU0lPTl9DT0RFUy5CQVNFIiwKKyAgICAgICAgICAgICAgICBCdWlsZC5WRVJTSU9OLkZJUlNUX1NES19JTlQgPj0gQnVpbGQuVkVSU0lPTl9DT0RFUy5CQVNFKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICAgICAiQ3VycmVudCBTREsgdmVyc2lvbiAiICsgQnVpbGQuVkVSU0lPTi5TREtfSU5UCisgICAgICAgICAgICAgICAgICAgICAgICArICIgbXVzdCBiZSBhdCBsZWFzdCBmaXJzdCBTREsgdmVyc2lvbiAiICsgQnVpbGQuVkVSU0lPTi5GSVJTVF9TREtfSU5ULAorICAgICAgICAgICAgICAgIEJ1aWxkLlZFUlNJT04uU0RLX0lOVCA+PSBCdWlsZC5WRVJTSU9OLkZJUlNUX1NES19JTlQpOworICAgIH0KKwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9fREVCVUdHQUJMRSA9ICJyby5kZWJ1Z2dhYmxlIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9fU0VDVVJFID0gInJvLnNlY3VyZSI7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL29zL3NyYy9hbmRyb2lkL29zL2N0cy9CdWlsZFZlcnNpb25UZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9vcy9zcmMvYW5kcm9pZC9vcy9jdHMvQnVpbGRWZXJzaW9uVGVzdC5qYXZhCmluZGV4IGVlYzNmMTYuLjc4MzkxMDkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL29zL3NyYy9hbmRyb2lkL29zL2N0cy9CdWlsZFZlcnNpb25UZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvb3Mvc3JjL2FuZHJvaWQvb3MvY3RzL0J1aWxkVmVyc2lvblRlc3QuamF2YQpAQCAtMTksMjMgKzE5LDIyIEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldE1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKIGltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUmVzdHJpY3RlZEJ1aWxkVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAoraW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKIHB1YmxpYyBjbGFzcyBCdWlsZFZlcnNpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiQnVpbGRWZXJzaW9uVGVzdCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVYUEVDVEVEX1NESyA9IDI3OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFWFBFQ1RFRF9TREsgPSAyODsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQRUNURURfQlVJTERfVkFSSUFOVCA9ICJ1c2VyIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQRUNURURfVEFHID0gInJlbGVhc2Uta2V5cyI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMQVRGT1JNX1ZFUlNJT05TX0ZJTEUgPSAicGxhdGZvcm1fdmVyc2lvbnMudHh0IjsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL29zL3NyYy9hbmRyb2lkL29zL2N0cy9DdHNSZW1vdGVTZXJ2aWNlLmphdmEgYi90ZXN0cy90ZXN0cy9vcy9zcmMvYW5kcm9pZC9vcy9jdHMvQ3RzUmVtb3RlU2VydmljZS5qYXZhCmluZGV4IGRhYWU0OWUuLmEwZDU5NzQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL29zL3NyYy9hbmRyb2lkL29zL2N0cy9DdHNSZW1vdGVTZXJ2aWNlLmphdmEKKysrIGIvdGVzdHMvdGVzdHMvb3Mvc3JjL2FuZHJvaWQvb3MvY3RzL0N0c1JlbW90ZVNlcnZpY2UuamF2YQpAQCAtMjAsOCArMjAsMTAgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiAKLXB1YmxpYyBjbGFzcyBDdHNSZW1vdGVTZXJ2aWNlIGV4dGVuZHMgU2VydmljZXsKK3B1YmxpYyBjbGFzcyBDdHNSZW1vdGVTZXJ2aWNlIGV4dGVuZHMgU2VydmljZSB7CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZSgpIHsKQEAgLTQxLDYgKzQzLDE1IEBACiAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGltZVpvbmVJRCgpIHsKICAgICAgICAgICAgIHJldHVybiBqYXZhLnV0aWwuVGltZVpvbmUuZ2V0RGVmYXVsdCgpLmdldElEKCk7CiAgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRGlza1dyaXRlKCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBGaWxlIHRlbXBGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiZm9vIiwgImJhciIpOworICAgICAgICAgICAgICAgIHJldHVybiB0ZW1wRmlsZS5kZWxldGUoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH07CiAKICAgICBAT3ZlcnJpZGUKQEAgLTUwLDUgKzYxLDQgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9Ci0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL29zL3NyYy9hbmRyb2lkL29zL2N0cy9FbnZpcm9ubWVudFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL29zL3NyYy9hbmRyb2lkL29zL2N0cy9FbnZpcm9ubWVudFRlc3QuamF2YQppbmRleCA2ZjI1OWMzLi4wZjJhYzYyIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9vcy9zcmMvYW5kcm9pZC9vcy9jdHMvRW52aXJvbm1lbnRUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvb3Mvc3JjL2FuZHJvaWQvb3MvY3RzL0Vudmlyb25tZW50VGVzdC5qYXZhCkBAIC04MSwxNCArODEsMTcgQEAKICAgICAgICAgLy8gaW5vZGVzIGNhbiByZXN1bHQgaW4gd2FzdGVkIHNwYWNlLgogICAgICAgICBmaW5hbCBsb25nIG1heHNpemUgPSBzdGF0LmZfYmxvY2tzICogc3RhdC5mX2Zyc2l6ZTsKICAgICAgICAgZmluYWwgbG9uZyBtYXhJbm9kZXMgPSBtYXhzaXplIC8gNDA5NjsKLSAgICAgICAgZmluYWwgbG9uZyBtaW5zaXplID0gc3RhdC5mX2JhdmFpbCAqIHN0YXQuZl9mcnNpemU7Ci0gICAgICAgIGZpbmFsIGxvbmcgbWluSW5vZGVzID0gbWluc2l6ZSAvIDMyNzY4OworICAgICAgICAvLyBBc3N1bWluZyB0aGUgc21hbGxlc3Qgc3RvcmFnZSB3b3VsZCBiZSA0R0IsIG1pbiAjIG9mIGZyZWUgaW5vZGVzCisgICAgICAgIC8vIGluIEVYVDQvRjJGUyBtdXN0IGJlIGxhcmdlciB0aGFuIDEyOGsgZm9yIEFuZHJvaWQgdG8gd29yayBwcm9wZXJseS4KKyAgICAgICAgZmluYWwgbG9uZyBtaW5Jbm9kZXMgPSAxMjggKiAxMDI0OwogCi0gICAgICAgIGlmIChzdGF0LmZfZmZyZWUgPj0gbWluSW5vZGVzICYmIHN0YXQuZl9mZnJlZSA8PSBtYXhJbm9kZXMpIHsKKyAgICAgICAgaWYgKHN0YXQuZl9mZnJlZSA+PSBtaW5Jbm9kZXMgJiYgc3RhdC5mX2ZmcmVlIDw9IG1heElub2RlcworICAgICAgICAgICAgJiYgc3RhdC5mX2ZhdmFpbCA8PSBzdGF0LmZfZmZyZWUpIHsKICAgICAgICAgICAgIC8vIFN3ZWV0LCBzb3VuZHMgZ3JlYXQhCiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmYWlsKCJOdW1iZXIgb2YgaW5vZGVzICIgKyBzdGF0LmZfZmZyZWUgKyAiIG5vdCB3aXRoaW4gc2FuZSByYW5nZSBmb3IgcGFydGl0aW9uIG9mICIKLSAgICAgICAgICAgICAgICAgICAgKyBtaW5zaXplICsgIiwiICsgbWF4c2l6ZSArICIgYnl0ZXM7IGV4cGVjdGVkIFsiICsgbWluSW5vZGVzICsgIiwiICsgbWF4SW5vZGVzICsgIl0iKTsKKyAgICAgICAgICAgIGZhaWwoIk51bWJlciBvZiBpbm9kZXMgIiArIHN0YXQuZl9mZnJlZSArICIvIiArIHN0YXQuZl9mYXZhaWwKKyAgICAgICAgICAgICAgKyAiIG5vdCB3aXRoaW4gc2FuZSByYW5nZSBmb3IgcGFydGl0aW9uIG9mICIgKyBtYXhzaXplICsgIiBieXRlczsgZXhwZWN0ZWQgWyIKKyAgICAgICAgICAgICAgKyBtaW5Jbm9kZXMgKyAiLCIgKyBtYXhJbm9kZXMgKyAiXSIpOwogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvb3Mvc3JjL2FuZHJvaWQvb3MvY3RzL0ZpbGVBY2Nlc3NQZXJtaXNzaW9uVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvb3Mvc3JjL2FuZHJvaWQvb3MvY3RzL0ZpbGVBY2Nlc3NQZXJtaXNzaW9uVGVzdC5qYXZhCmluZGV4IDk4ZGYyOWIuLmNkODllM2QgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL29zL3NyYy9hbmRyb2lkL29zL2N0cy9GaWxlQWNjZXNzUGVybWlzc2lvblRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9vcy9zcmMvYW5kcm9pZC9vcy9jdHMvRmlsZUFjY2Vzc1Blcm1pc3Npb25UZXN0LmphdmEKQEAgLTE5LDggKzE5LDYgQEAKIGltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OwogaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNkZFRlc3Q7Ci0KIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlbmFtZUZpbHRlcjsKQEAgLTQ2LDcgKzQ0LDYgQEAKICAqCiAgKiBUT0RPOiBDb21iaW5lIHRoaXMgZmlsZSB3aXRoIHtAbGluayBhbmRyb2lkLnBlcm1pc3Npb24uY3RzLkZpbGVTeXN0ZW1QZXJtaXNzaW9uVGVzdH0KICAqLwotQENkZFRlc3QocmVxdWlyZW1lbnQ9IjkuMy9DLTAtMSIpCiBwdWJsaWMgY2xhc3MgRmlsZUFjY2Vzc1Blcm1pc3Npb25UZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvb3Mvc3JjL2FuZHJvaWQvb3MvY3RzL0ZpbGVPYnNlcnZlclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL29zL3NyYy9hbmRyb2lkL29zL2N0cy9GaWxlT2JzZXJ2ZXJUZXN0LmphdmEKaW5kZXggYjUxZjgwNC4uNzQ0OTYzZSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvb3Mvc3JjL2FuZHJvaWQvb3MvY3RzL0ZpbGVPYnNlcnZlclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9vcy9zcmMvYW5kcm9pZC9vcy9jdHMvRmlsZU9ic2VydmVyVGVzdC5qYXZhCkBAIC0yNiwxMSArMjYsNiBAQAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiBwdWJsaWMgY2xhc3MgRmlsZU9ic2VydmVyVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIEZpbGUgbVRlc3RGaWxlOwotICAgIHByaXZhdGUgRmlsZSBtVGVzdERpcjsKLSAgICBwcml2YXRlIEZpbGUgbU1vdmVEZXN0RmlsZTsKLSAgICBwcml2YXRlIEZpbGVPdXRwdXRTdHJlYW0gbU91dDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSCA9ICIvUEFUSCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfRklMRSA9ICJmaWxlX29ic2VydmVyX3Rlc3QudHh0IjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9ESVIgPSAiZmlsZW9ic2VydmVyX2RpciI7CkBAIC0zOCwzNCArMzMsNTAgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVU5ERUZJTkVEID0gMHg4MDAwOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgREVMQVlfTVNFQ09ORCA9IDIwMDA7CiAKKyAgICBwcml2YXRlIHZvaWQgaGVscFNldFVwKEZpbGUgZGlyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSB0ZXN0RmlsZSA9IG5ldyBGaWxlKGRpciwgVEVTVF9GSUxFKTsKKyAgICAgICAgdGVzdEZpbGUuY3JlYXRlTmV3RmlsZSgpOworICAgICAgICBGaWxlIHRlc3REaXIgPSBuZXcgRmlsZShkaXIsIFRFU1RfRElSKTsKKyAgICAgICAgdGVzdERpci5ta2RpcnMoKTsKKyAgICB9CisKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBzdXBlci5zZXRVcCgpOwogICAgICAgICBGaWxlIGRpciA9IGdldENvbnRleHQoKS5nZXRGaWxlc0RpcigpOwotICAgICAgICBtVGVzdEZpbGUgPSBuZXcgRmlsZShkaXIsIFRFU1RfRklMRSk7Ci0gICAgICAgIG1UZXN0RmlsZS5jcmVhdGVOZXdGaWxlKCk7Ci0gICAgICAgIG1UZXN0RGlyID0gbmV3IEZpbGUoZGlyLCBURVNUX0RJUik7Ci0gICAgICAgIG1UZXN0RGlyLm1rZGlycygpOworICAgICAgICBoZWxwU2V0VXAoZGlyKTsKKworICAgICAgICBkaXIgPSBnZXRDb250ZXh0KCkuZ2V0RXh0ZXJuYWxGaWxlc0RpcihudWxsKTsKKyAgICAgICAgaGVscFNldFVwKGRpcik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGhlbHBUZWFyRG93bihGaWxlIGRpcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEZpbGUgdGVzdEZpbGUgPSBuZXcgRmlsZShkaXIsIFRFU1RfRklMRSk7CisgICAgICAgIEZpbGUgdGVzdERpciA9IG5ldyBGaWxlKGRpciwgVEVTVF9ESVIpOworICAgICAgICBGaWxlIG1vdmVEZXN0RmlsZSA9IG5ldyBGaWxlKHRlc3REaXIsIFRFU1RfRklMRSk7CisKKyAgICAgICAgaWYgKHRlc3RGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICB0ZXN0RmlsZS5kZWxldGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtb3ZlRGVzdEZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIG1vdmVEZXN0RmlsZS5kZWxldGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0ZXN0RGlyLmV4aXN0cygpKSB7CisgICAgICAgICAgICB0ZXN0RGlyLmRlbGV0ZSgpOworICAgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICAgICAgaWYgKG1UZXN0RmlsZSAhPSBudWxsICYmIG1UZXN0RmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgbVRlc3RGaWxlLmRlbGV0ZSgpOwotICAgICAgICB9CiAKLSAgICAgICAgaWYgKG1Nb3ZlRGVzdEZpbGUgIT0gbnVsbCAmJiBtTW92ZURlc3RGaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBtTW92ZURlc3RGaWxlLmRlbGV0ZSgpOwotICAgICAgICB9CisgICAgICAgIEZpbGUgZGlyID0gZ2V0Q29udGV4dCgpLmdldEZpbGVzRGlyKCk7CisgICAgICAgIGhlbHBUZWFyRG93bihkaXIpOwogCi0gICAgICAgIGlmIChtVGVzdERpciAhPSBudWxsICYmIG1UZXN0RGlyLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBtVGVzdERpci5kZWxldGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtT3V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1PdXQuY2xvc2UoKTsKLSAgICAgICAgfQorICAgICAgICBkaXIgPSBnZXRDb250ZXh0KCkuZ2V0RXh0ZXJuYWxGaWxlc0RpcihudWxsKTsKKyAgICAgICAgaGVscFRlYXJEb3duKGRpcik7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yKCkgewpAQCAtODYsODQgKzk3LDEwNyBAQAogICAgICAqIGZpbGUgb2JzZXJ2ZXIgc2hvdWxkIGdldCBtb3ZlLXNlbGYgZXZlbnQsCiAgICAgICogbW92ZWQgZnJvbSBkaXIgb2JzZXJ2ZXIgc2hvdWxkIGdldCBtb3ZlZC1mcm9tIGV2ZW50LAogICAgICAqIG1vdmVkIHRvIGRpciBvYnNlcnZlciBzaG91bGQgZ2V0IG1vdmVkLXRvIGV2ZW50LgorICAgICAqCisgICAgICogT24gZW11bGF0ZWQgc3RvcmFnZSwgdGhlcmUgbWF5IGJlIGFkZGl0aW9uYWwgb3BlcmF0aW9ucyByZWxhdGVkIHRvIGNhc2UgaW5zZW5zaXRpdml0eSwgc28KKyAgICAgKiB3ZSBqdXN0IGNoZWNrIHRoYXQgdGhlIGV4cGVjdGVkIG9uZXMgYXJlIHByZXNlbnQuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEZpbGVPYnNlcnZlcigpIHRocm93cyBFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIGhlbHBUZXN0RmlsZU9ic2VydmVyKEZpbGUgZGlyLCBib29sZWFuIGlzRW11bGF0ZWQpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBNb2NrRmlsZU9ic2VydmVyIGZpbGVPYnNlcnZlciA9IG51bGw7CiAgICAgICAgIGludFtdIGV4cGVjdGVkID0gbnVsbDsKICAgICAgICAgRmlsZUV2ZW50W10gbW92ZUV2ZW50cyA9IG51bGw7CisgICAgICAgIEZpbGUgdGVzdEZpbGUgPSBuZXcgRmlsZShkaXIsIFRFU1RfRklMRSk7CisgICAgICAgIEZpbGUgdGVzdERpciA9IG5ldyBGaWxlKGRpciwgVEVTVF9ESVIpOworICAgICAgICBGaWxlIG1vdmVEZXN0RmlsZTsKKyAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXQgPSBudWxsOwogCi0gICAgICAgIGZpbGVPYnNlcnZlciA9IG5ldyBNb2NrRmlsZU9ic2VydmVyKG1UZXN0RmlsZS5nZXRQYXJlbnQoKSk7CisgICAgICAgIGZpbGVPYnNlcnZlciA9IG5ldyBNb2NrRmlsZU9ic2VydmVyKHRlc3RGaWxlLmdldFBhcmVudCgpKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGZpbGVPYnNlcnZlci5zdGFydFdhdGNoaW5nKCk7Ci0gICAgICAgICAgICBtT3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0obVRlc3RGaWxlKTsKKyAgICAgICAgICAgIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRlc3RGaWxlKTsKIAotICAgICAgICAgICAgbU91dC53cml0ZShGSUxFX0RBVEEpOyAvLyBtb2RpZnksIG9wZW4sIHdyaXRlLCBtb2RpZnkKLSAgICAgICAgICAgIG1PdXQuY2xvc2UoKTsgLy8gY2xvc2Vfd3JpdGUKKyAgICAgICAgICAgIG91dC53cml0ZShGSUxFX0RBVEEpOyAvLyBtb2RpZnksIG9wZW4sIHdyaXRlLCBtb2RpZnkKKyAgICAgICAgICAgIG91dC5jbG9zZSgpOyAvLyBjbG9zZV93cml0ZQogCiAgICAgICAgICAgICBleHBlY3RlZCA9IG5ldyBpbnRbXSB7RmlsZU9ic2VydmVyLk1PRElGWSwgRmlsZU9ic2VydmVyLk9QRU4sIEZpbGVPYnNlcnZlci5NT0RJRlksCiAgICAgICAgICAgICAgICAgICAgIEZpbGVPYnNlcnZlci5DTE9TRV9XUklURX07CiAgICAgICAgICAgICBtb3ZlRXZlbnRzID0gd2FpdEZvckV2ZW50KGZpbGVPYnNlcnZlcik7Ci0gICAgICAgICAgICBhc3NlcnRFdmVudHNFcXVhbHMoZXhwZWN0ZWQsIG1vdmVFdmVudHMpOworICAgICAgICAgICAgaWYgKGlzRW11bGF0ZWQpCisgICAgICAgICAgICAgICAgYXNzZXJ0RXZlbnRzQ29udGFpbnMoZXhwZWN0ZWQsIG1vdmVFdmVudHMpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGFzc2VydEV2ZW50c0VxdWFscyhleHBlY3RlZCwgbW92ZUV2ZW50cyk7CiAKICAgICAgICAgICAgIGZpbGVPYnNlcnZlci5zdG9wV2F0Y2hpbmcoKTsKIAogICAgICAgICAgICAgLy8gYWN0aW9uIGFmdGVyIG9ic2VydmVyIHN0b3Agd2F0Y2hpbmcKLSAgICAgICAgICAgIG1UZXN0RmlsZS5kZWxldGUoKTsgLy8gZGVsZXRlCisgICAgICAgICAgICB0ZXN0RmlsZS5kZWxldGUoKTsgLy8gZGVsZXRlCiAKICAgICAgICAgICAgIC8vIHNob3VsZCBub3QgZ2V0IGFueSBldmVudAogICAgICAgICAgICAgZXhwZWN0ZWQgPSBuZXcgaW50W10ge1VOREVGSU5FRH07CiAgICAgICAgICAgICBtb3ZlRXZlbnRzID0gd2FpdEZvckV2ZW50KGZpbGVPYnNlcnZlcik7Ci0gICAgICAgICAgICBhc3NlcnRFdmVudHNFcXVhbHMoZXhwZWN0ZWQsIG1vdmVFdmVudHMpOworICAgICAgICAgICAgaWYgKGlzRW11bGF0ZWQpCisgICAgICAgICAgICAgICAgYXNzZXJ0RXZlbnRzQ29udGFpbnMoZXhwZWN0ZWQsIG1vdmVFdmVudHMpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGFzc2VydEV2ZW50c0VxdWFscyhleHBlY3RlZCwgbW92ZUV2ZW50cyk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBmaWxlT2JzZXJ2ZXIuc3RvcFdhdGNoaW5nKCk7Ci0gICAgICAgICAgICBtT3V0LmNsb3NlKCk7Ci0gICAgICAgICAgICBtT3V0ID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChvdXQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKKyAgICAgICAgICAgIG91dCA9IG51bGw7CiAgICAgICAgIH0KLQotICAgICAgICBmaWxlT2JzZXJ2ZXIgPSBuZXcgTW9ja0ZpbGVPYnNlcnZlcihtVGVzdERpci5nZXRQYXRoKCkpOworICAgICAgICBmaWxlT2JzZXJ2ZXIgPSBuZXcgTW9ja0ZpbGVPYnNlcnZlcih0ZXN0RGlyLmdldFBhdGgoKSk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBmaWxlT2JzZXJ2ZXIuc3RhcnRXYXRjaGluZygpOwotICAgICAgICAgICAgbVRlc3RGaWxlID0gbmV3IEZpbGUobVRlc3REaXIsIFRFU1RfRklMRSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1UZXN0RmlsZS5jcmVhdGVOZXdGaWxlKCkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtVGVzdEZpbGUuZXhpc3RzKCkpOwotICAgICAgICAgICAgbVRlc3RGaWxlLmRlbGV0ZSgpOwotICAgICAgICAgICAgbVRlc3REaXIuZGVsZXRlKCk7Ci0KKyAgICAgICAgICAgIHRlc3RGaWxlID0gbmV3IEZpbGUodGVzdERpciwgVEVTVF9GSUxFKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUodGVzdEZpbGUuY3JlYXRlTmV3RmlsZSgpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUodGVzdEZpbGUuZXhpc3RzKCkpOworICAgICAgICAgICAgdGVzdEZpbGUuZGVsZXRlKCk7CisgICAgICAgICAgICB0ZXN0RGlyLmRlbGV0ZSgpOwogICAgICAgICAgICAgZXhwZWN0ZWQgPSBuZXcgaW50W10ge0ZpbGVPYnNlcnZlci5DUkVBVEUsCiAgICAgICAgICAgICAgICAgICAgIEZpbGVPYnNlcnZlci5PUEVOLCBGaWxlT2JzZXJ2ZXIuQ0xPU0VfV1JJVEUsCiAgICAgICAgICAgICAgICAgICAgIEZpbGVPYnNlcnZlci5ERUxFVEUsIEZpbGVPYnNlcnZlci5ERUxFVEVfU0VMRiwgVU5ERUZJTkVEfTsKICAgICAgICAgICAgIG1vdmVFdmVudHMgPSB3YWl0Rm9yRXZlbnQoZmlsZU9ic2VydmVyKTsKLSAgICAgICAgICAgIGFzc2VydEV2ZW50c0VxdWFscyhleHBlY3RlZCwgbW92ZUV2ZW50cyk7CisgICAgICAgICAgICBpZiAoaXNFbXVsYXRlZCkKKyAgICAgICAgICAgICAgICBhc3NlcnRFdmVudHNDb250YWlucyhleHBlY3RlZCwgbW92ZUV2ZW50cyk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYXNzZXJ0RXZlbnRzRXF1YWxzKGV4cGVjdGVkLCBtb3ZlRXZlbnRzKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIGZpbGVPYnNlcnZlci5zdG9wV2F0Y2hpbmcoKTsKICAgICAgICAgfQotCi0gICAgICAgIEZpbGUgZGlyID0gZ2V0Q29udGV4dCgpLmdldEZpbGVzRGlyKCk7Ci0gICAgICAgIG1UZXN0RmlsZSA9IG5ldyBGaWxlKGRpciwgVEVTVF9GSUxFKTsKLSAgICAgICAgbVRlc3RGaWxlLmNyZWF0ZU5ld0ZpbGUoKTsKLSAgICAgICAgbVRlc3REaXIgPSBuZXcgRmlsZShkaXIsIFRFU1RfRElSKTsKLSAgICAgICAgbVRlc3REaXIubWtkaXJzKCk7Ci0gICAgICAgIG1Nb3ZlRGVzdEZpbGUgPSBuZXcgRmlsZShtVGVzdERpciwgVEVTVF9GSUxFKTsKKyAgICAgICAgZGlyID0gZ2V0Q29udGV4dCgpLmdldEZpbGVzRGlyKCk7CisgICAgICAgIHRlc3RGaWxlID0gbmV3IEZpbGUoZGlyLCBURVNUX0ZJTEUpOworICAgICAgICB0ZXN0RmlsZS5jcmVhdGVOZXdGaWxlKCk7CisgICAgICAgIHRlc3REaXIgPSBuZXcgRmlsZShkaXIsIFRFU1RfRElSKTsKKyAgICAgICAgdGVzdERpci5ta2RpcnMoKTsKKyAgICAgICAgbW92ZURlc3RGaWxlID0gbmV3IEZpbGUodGVzdERpciwgVEVTVF9GSUxFKTsKICAgICAgICAgTW9ja0ZpbGVPYnNlcnZlciBtb3ZlZEZyb20gPSBuZXcgTW9ja0ZpbGVPYnNlcnZlcihkaXIuZ2V0UGF0aCgpKTsKLSAgICAgICAgTW9ja0ZpbGVPYnNlcnZlciBtb3ZlZFRvID0gbmV3IE1vY2tGaWxlT2JzZXJ2ZXIobVRlc3REaXIuZ2V0UGF0aCgpKTsKLSAgICAgICAgZmlsZU9ic2VydmVyID0gbmV3IE1vY2tGaWxlT2JzZXJ2ZXIobVRlc3RGaWxlLmdldFBhdGgoKSk7CisgICAgICAgIE1vY2tGaWxlT2JzZXJ2ZXIgbW92ZWRUbyA9IG5ldyBNb2NrRmlsZU9ic2VydmVyKHRlc3REaXIuZ2V0UGF0aCgpKTsKKyAgICAgICAgZmlsZU9ic2VydmVyID0gbmV3IE1vY2tGaWxlT2JzZXJ2ZXIodGVzdEZpbGUuZ2V0UGF0aCgpKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG1vdmVkRnJvbS5zdGFydFdhdGNoaW5nKCk7CiAgICAgICAgICAgICBtb3ZlZFRvLnN0YXJ0V2F0Y2hpbmcoKTsKICAgICAgICAgICAgIGZpbGVPYnNlcnZlci5zdGFydFdhdGNoaW5nKCk7Ci0gICAgICAgICAgICBtVGVzdEZpbGUucmVuYW1lVG8obU1vdmVEZXN0RmlsZSk7CisgICAgICAgICAgICB0ZXN0RmlsZS5yZW5hbWVUbyhtb3ZlRGVzdEZpbGUpOwogCiAgICAgICAgICAgICBleHBlY3RlZCA9IG5ldyBpbnRbXSB7RmlsZU9ic2VydmVyLk1PVkVfU0VMRn07CiAgICAgICAgICAgICBtb3ZlRXZlbnRzID0gd2FpdEZvckV2ZW50KGZpbGVPYnNlcnZlcik7Ci0gICAgICAgICAgICBhc3NlcnRFdmVudHNFcXVhbHMoZXhwZWN0ZWQsIG1vdmVFdmVudHMpOworICAgICAgICAgICAgaWYgKGlzRW11bGF0ZWQpCisgICAgICAgICAgICAgICAgYXNzZXJ0RXZlbnRzQ29udGFpbnMoZXhwZWN0ZWQsIG1vdmVFdmVudHMpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGFzc2VydEV2ZW50c0VxdWFscyhleHBlY3RlZCwgbW92ZUV2ZW50cyk7CiAKICAgICAgICAgICAgIGV4cGVjdGVkID0gbmV3IGludFtdIHtGaWxlT2JzZXJ2ZXIuTU9WRURfRlJPTX07CiAgICAgICAgICAgICBtb3ZlRXZlbnRzID0gd2FpdEZvckV2ZW50KG1vdmVkRnJvbSk7Ci0gICAgICAgICAgICBhc3NlcnRFdmVudHNFcXVhbHMoZXhwZWN0ZWQsIG1vdmVFdmVudHMpOworICAgICAgICAgICAgaWYgKGlzRW11bGF0ZWQpCisgICAgICAgICAgICAgICAgYXNzZXJ0RXZlbnRzQ29udGFpbnMoZXhwZWN0ZWQsIG1vdmVFdmVudHMpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGFzc2VydEV2ZW50c0VxdWFscyhleHBlY3RlZCwgbW92ZUV2ZW50cyk7CiAKICAgICAgICAgICAgIGV4cGVjdGVkID0gbmV3IGludFtdIHtGaWxlT2JzZXJ2ZXIuTU9WRURfVE99OwogICAgICAgICAgICAgbW92ZUV2ZW50cyA9IHdhaXRGb3JFdmVudChtb3ZlZFRvKTsKLSAgICAgICAgICAgIGFzc2VydEV2ZW50c0VxdWFscyhleHBlY3RlZCwgbW92ZUV2ZW50cyk7CisgICAgICAgICAgICBpZiAoaXNFbXVsYXRlZCkKKyAgICAgICAgICAgICAgICBhc3NlcnRFdmVudHNDb250YWlucyhleHBlY3RlZCwgbW92ZUV2ZW50cyk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYXNzZXJ0RXZlbnRzRXF1YWxzKGV4cGVjdGVkLCBtb3ZlRXZlbnRzKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIGZpbGVPYnNlcnZlci5zdG9wV2F0Y2hpbmcoKTsKICAgICAgICAgICAgIG1vdmVkVG8uc3RvcFdhdGNoaW5nKCk7CkBAIC0xNzQsNiArMjA4LDE4IEBACiAgICAgICAgIC8vIGhlcmUgQUNDRVNTIEFUVFJJQiB3ZSBmb3VuZCBubyB3YXkgdG8gdGVzdC4KICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZU9ic2VydmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGhlbHBUZXN0RmlsZU9ic2VydmVyKGdldENvbnRleHQoKS5nZXRGaWxlc0RpcigpLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBTYW1lIGFzIHRlc3RGaWxlT2JzZXJ2ZXIsIGV4Y2VwdCBvbiBlbXVsYXRlZCBzdG9yYWdlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEZpbGVPYnNlcnZlckVtdWxhdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGhlbHBUZXN0RmlsZU9ic2VydmVyKGdldENvbnRleHQoKS5nZXRFeHRlcm5hbEZpbGVzRGlyKG51bGwpLCB0cnVlKTsKKyAgICB9CisKKwogICAgIHByaXZhdGUgdm9pZCBhc3NlcnRFdmVudHNFcXVhbHMoZmluYWwgaW50W10gZXhwZWN0ZWQsIGZpbmFsIEZpbGVFdmVudFtdIG1vdmVFdmVudHMpIHsKICAgICAgICAgTGlzdDxJbnRlZ2VyPiBleHBlY3RlZEV2ZW50cyA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZC5sZW5ndGg7IGkrKykgewpAQCAtMTg3LDYgKzIzMywyNCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydEV2ZW50c0NvbnRhaW5zKGZpbmFsIGludFtdIGV4cGVjdGVkLCBmaW5hbCBGaWxlRXZlbnRbXSBtb3ZlRXZlbnRzKSB7CisgICAgICAgIExpc3Q8SW50ZWdlcj4gZXhwZWN0ZWRFdmVudHMgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGV4cGVjdGVkRXZlbnRzLmFkZChleHBlY3RlZFtpXSk7CisgICAgICAgIH0KKyAgICAgICAgTGlzdDxGaWxlRXZlbnQ+IGFjdHVhbEV2ZW50cyA9IEFycmF5cy5hc0xpc3QobW92ZUV2ZW50cyk7CisgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIkV4cGVjdGVkIHRvIGNvbnRhaW46ICIgKyBleHBlY3RlZEV2ZW50cyArICIgQWN0dWFsOiAiICsgYWN0dWFsRXZlbnRzOworICAgICAgICBpbnQgaiA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHdoaWxlIChleHBlY3RlZFtpXSAhPSBtb3ZlRXZlbnRzW2pdLmV2ZW50KSB7CisgICAgICAgICAgICAgICAgaisrOworICAgICAgICAgICAgICAgIGlmIChqID49IG1vdmVFdmVudHMubGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICBmYWlsKG1lc3NhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaisrOworICAgICAgICB9CisgICAgfQorCiAgICAgcHJpdmF0ZSBGaWxlRXZlbnRbXSB3YWl0Rm9yRXZlbnQoTW9ja0ZpbGVPYnNlcnZlciBmaWxlT2JzZXJ2ZXIpCiAgICAgICAgICAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewogICAgICAgICBUaHJlYWQuc2xlZXAoREVMQVlfTVNFQ09ORCk7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9vcy9zcmMvYW5kcm9pZC9vcy9jdHMvSVNlY29uZGFyeS5haWRsIGIvdGVzdHMvdGVzdHMvb3Mvc3JjL2FuZHJvaWQvb3MvY3RzL0lTZWNvbmRhcnkuYWlkbAppbmRleCAyYzYwMTQ5Li4xODNlMmQ1IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9vcy9zcmMvYW5kcm9pZC9vcy9jdHMvSVNlY29uZGFyeS5haWRsCisrKyBiL3Rlc3RzL3Rlc3RzL29zL3NyYy9hbmRyb2lkL29zL2N0cy9JU2Vjb25kYXJ5LmFpZGwKQEAgLTIzLDQgKzIzLDYgQEAKICAgICBsb25nIGdldEVsYXBzZWRDcHVUaW1lKCk7CiAKICAgICBTdHJpbmcgZ2V0VGltZVpvbmVJRCgpOworCisgICAgYm9vbGVhbiBwZXJmb3JtRGlza1dyaXRlKCk7CiB9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9vcy9zcmMvYW5kcm9pZC9vcy9jdHMvTm9FeGVjdXRlUGVybWlzc2lvblRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL29zL3NyYy9hbmRyb2lkL29zL2N0cy9Ob0V4ZWN1dGVQZXJtaXNzaW9uVGVzdC5qYXZhCmluZGV4IDgzNDU4ZTkuLmIyZDZlODkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL29zL3NyYy9hbmRyb2lkL29zL2N0cy9Ob0V4ZWN1dGVQZXJtaXNzaW9uVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL29zL3NyYy9hbmRyb2lkL29zL2N0cy9Ob0V4ZWN1dGVQZXJtaXNzaW9uVGVzdC5qYXZhCkBAIC00OCwxMCArNDgsNiBAQAogICAgICAgICBhc3NlcnRGYWxzZShpc0hlYXBFeGVjdXRhYmxlKCkpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHRlc3RFeGVjdXRlQ29kZSgpIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZShpc015Q29kZUV4ZWN1dGFibGUoKSk7Ci0gICAgfQotCiAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjcHVIYXNOeFN1cHBvcnQoKSB7CiAgICAgICAgIGlmIChDcHVGZWF0dXJlcy5pc0FybUNwdSgpICYmICFDcHVGZWF0dXJlcy5pc0FybTdDb21wYXRpYmxlKCkpIHsKICAgICAgICAgICAgIC8vIEFSTSBwcm9jZXNzb3JzIGJlZm9yZSB2NyBkbyBub3QgaGF2ZSBOWCBzdXBwb3J0LgpAQCAtNzAsNSArNjYsNCBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gaXNTdGFja0V4ZWN1dGFibGUoKTsKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBpc0hlYXBFeGVjdXRhYmxlKCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gaXNNeUNvZGVFeGVjdXRhYmxlKCk7CiB9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9vcy9zcmMvYW5kcm9pZC9vcy9jdHMvUGFyY2VsRmlsZURlc2NyaXB0b3JUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9vcy9zcmMvYW5kcm9pZC9vcy9jdHMvUGFyY2VsRmlsZURlc2NyaXB0b3JUZXN0LmphdmEKaW5kZXggNDY3OWE5OS4uOTdkYjVmNiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvb3Mvc3JjL2FuZHJvaWQvb3MvY3RzL1BhcmNlbEZpbGVEZXNjcmlwdG9yVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL29zL3NyYy9hbmRyb2lkL29zL2N0cy9QYXJjZWxGaWxlRGVzY3JpcHRvclRlc3QuamF2YQpAQCAtMTYsNiArMTYsMTMgQEAKIAogcGFja2FnZSBhbmRyb2lkLm9zLmN0czsKIAoraW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CkBAIC0yNCwxMyArMzEsMjEgQEAKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yLkF1dG9DbG9zZUlucHV0U3RyZWFtOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKIGltcG9ydCBhbmRyb2lkLm9zLmN0cy5QYXJjZWxGaWxlRGVzY3JpcHRvclBlZXIuRnV0dXJlQ2xvc2VMaXN0ZW5lcjsKLWltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworaW1wb3J0IGFuZHJvaWQuc3lzdGVtLkVycm5vRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQuc3lzdGVtLk9zOworaW1wb3J0IGFuZHJvaWQuc3lzdGVtLk9zQ29uc3RhbnRzOwogaW1wb3J0IGFuZHJvaWQudGVzdC5Nb3JlQXNzZXJ0czsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZTsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5Db21wYXJpc29uRmFpbHVyZTsKIAoraW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKKwogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOwogaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwpAQCAtNDMsOSArNTgsMTUgQEAKIGltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiAKLXB1YmxpYyBjbGFzcyBQYXJjZWxGaWxlRGVzY3JpcHRvclRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBQYXJjZWxGaWxlRGVzY3JpcHRvclRlc3QgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgRFVSQVRJT04gPSAxMDBsOwogCisgICAgcHJpdmF0ZSBDb250ZXh0IGdldENvbnRleHQoKSB7CisgICAgICAgIHJldHVybiBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCk7CisgICAgfQorCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JBbmRPcGVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHRlbXBGaWxlID0gbWFrZVBhcmNlbEZpbGVEZXNjcmlwdG9yKGdldENvbnRleHQoKSk7CiAKQEAgLTczLDYgKzk0LDcgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEZyb21Tb2NrZXQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgZmluYWwgaW50IFBPUlQgPSAxMjIyMjsKICAgICAgICAgZmluYWwgaW50IERBVEEgPSAxOwpAQCAtMTExLDYgKzEzMyw3IEBACiAgICAgICAgIGRvbmUuZ2V0KDUsIFRpbWVVbml0LlNFQ09ORFMpOwogICAgIH0KIAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEZyb21EYXRhKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0TnVsbChQYXJjZWxGaWxlRGVzY3JpcHRvci5mcm9tRGF0YShudWxsLCBudWxsKSk7CiAgICAgICAgIGJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbXSB7IDAgfTsKQEAgLTE0Myw2ICsxNjYsNyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RnJvbURhdGFTa2lwKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVtdIHsgNDAsIDQxLCA0MiwgNDMsIDQ0LCA0NSwgNDYgfTsKICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgcGZkID0gUGFyY2VsRmlsZURlc2NyaXB0b3IuZnJvbURhdGEoZGF0YSwgbnVsbCk7CkBAIC0xNjQsMTEgKzE4OCwxMyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7CiAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHBmZCA9IFBhcmNlbEZpbGVEZXNjcmlwdG9yLmZyb21Tb2NrZXQobmV3IFNvY2tldCgpKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChwZmQudG9TdHJpbmcoKSk7CiAgICAgfQogCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGVUb1BhcmNlbCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBwZiA9IG1ha2VQYXJjZWxGaWxlRGVzY3JpcHRvcihnZXRDb250ZXh0KCkpOwogCkBAIC0xODgsNiArMjE0LDcgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdENsb3NlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHBmID0gbWFrZVBhcmNlbEZpbGVEZXNjcmlwdG9yKGdldENvbnRleHQoKSk7CiAgICAgICAgIEF1dG9DbG9zZUlucHV0U3RyZWFtIGluMSA9IG5ldyBBdXRvQ2xvc2VJbnB1dFN0cmVhbShwZik7CkBAIC0yMTAsMTEgKzIzNywxMyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U3RhdFNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgcGYgPSBtYWtlUGFyY2VsRmlsZURlc2NyaXB0b3IoZ2V0Q29udGV4dCgpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShwZi5nZXRTdGF0U2l6ZSgpID49IDApOwogICAgIH0KIAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEdldEZpbGVEZXNjcmlwdG9yKCkgewogICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBwZmQgPSBQYXJjZWxGaWxlRGVzY3JpcHRvci5mcm9tU29ja2V0KG5ldyBTb2NrZXQoKSk7CiAgICAgICAgIGFzc2VydE5vdE51bGwocGZkLmdldEZpbGVEZXNjcmlwdG9yKCkpOwpAQCAtMjIzLDYgKzI1Miw3IEBACiAgICAgICAgIGFzc2VydFNhbWUocGZkLmdldEZpbGVEZXNjcmlwdG9yKCksIHAuZ2V0RmlsZURlc2NyaXB0b3IoKSk7CiAgICAgfQogCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGVzY3JpYmVDb250ZW50cygpIHsKICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgcGZkID0gUGFyY2VsRmlsZURlc2NyaXB0b3IuZnJvbVNvY2tldChuZXcgU29ja2V0KCkpOwogICAgICAgICBhc3NlcnRUcnVlKChQYXJjZWxhYmxlLkNPTlRFTlRTX0ZJTEVfREVTQ1JJUFRPUiAmIHBmZC5kZXNjcmliZUNvbnRlbnRzKCkpICE9IDApOwpAQCAtMjQ3LDYgKzI3Nyw3IEBACiAgICAgICAgIHJldHVybiBuZXcgRmlsZUlucHV0U3RyZWFtKHBmZC5nZXRGaWxlRGVzY3JpcHRvcigpKS5yZWFkKCk7CiAgICAgfQogCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UGlwZU5vcm1hbCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBmaW5hbCBQYXJjZWxGaWxlRGVzY3JpcHRvcltdIHBpcGUgPSBQYXJjZWxGaWxlRGVzY3JpcHRvci5jcmVhdGVSZWxpYWJsZVBpcGUoKTsKICAgICAgICAgZmluYWwgUGFyY2VsRmlsZURlc2NyaXB0b3IgcmVkID0gcGlwZVswXTsKQEAgLTI2Miw2ICsyOTMsNyBAQAogCiAgICAgLy8gUmVhZGluZyBzaG91bGQgYmUgZG9uZSB2aWEgQXV0b0Nsb3NlSW5wdXRTdHJlYW0gaWYgcG9zc2libGUsIHJhdGhlciB0aGFuCiAgICAgLy8gcmVjcmVhdGluZyBhIEZpbGVJbnB1dFN0cmVhbSBmcm9tIGEgcmF3IEZELCB3aGF0J3MgZG9uZSBpbiByZWFkKFBGRCkuCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UGlwZUVycm9yX0Rpc2NvdXJhZ2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIFBhcmNlbEZpbGVEZXNjcmlwdG9yW10gcGlwZSA9IFBhcmNlbEZpbGVEZXNjcmlwdG9yLmNyZWF0ZVJlbGlhYmxlUGlwZSgpOwogICAgICAgICBmaW5hbCBQYXJjZWxGaWxlRGVzY3JpcHRvciByZWQgPSBwaXBlWzBdOwpAQCAtMjgxLDYgKzMxMyw3IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RQaXBlRXJyb3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgUGFyY2VsRmlsZURlc2NyaXB0b3JbXSBwaXBlID0gUGFyY2VsRmlsZURlc2NyaXB0b3IuY3JlYXRlUmVsaWFibGVQaXBlKCk7CiAgICAgICAgIGZpbmFsIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHJlZCA9IHBpcGVbMF07CkBAIC0yOTgsNiArMzMxLDcgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEZpbGVOb3JtYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgSGFuZGxlciBoYW5kbGVyID0gbmV3IEhhbmRsZXIoTG9vcGVyLmdldE1haW5Mb29wZXIoKSk7CiAgICAgICAgIGZpbmFsIEZ1dHVyZUNsb3NlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgRnV0dXJlQ2xvc2VMaXN0ZW5lcigpOwpAQCAtMzEyLDYgKzM0Niw3IEBACiAgICAgICAgIGFzc2VydEVxdWFscyhudWxsLCBsaXN0ZW5lci5nZXQoKSk7CiAgICAgfQogCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZUVycm9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIEhhbmRsZXIgaGFuZGxlciA9IG5ldyBIYW5kbGVyKExvb3Blci5nZXRNYWluTG9vcGVyKCkpOwogICAgICAgICBmaW5hbCBGdXR1cmVDbG9zZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IEZ1dHVyZUNsb3NlTGlzdGVuZXIoKTsKQEAgLTMyNiw2ICszNjEsNyBAQAogICAgICAgICBhc3NlcnRDb250YWlucygiT01HIEJBTkFOQVMiLCBsaXN0ZW5lci5nZXQoKS5nZXRNZXNzYWdlKCkpOwogICAgIH0KIAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEZpbGVEZXRhY2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgSGFuZGxlciBoYW5kbGVyID0gbmV3IEhhbmRsZXIoTG9vcGVyLmdldE1haW5Mb29wZXIoKSk7CiAgICAgICAgIGZpbmFsIEZ1dHVyZUNsb3NlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgRnV0dXJlQ2xvc2VMaXN0ZW5lcigpOwpAQCAtMzM5LDYgKzM3NSw3IEBACiAgICAgICAgIGFzc2VydENvbnRhaW5zKCJERVRBQ0hFRCIsIGxpc3RlbmVyLmdldCgpLmdldE1lc3NhZ2UoKSk7CiAgICAgfQogCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U29ja2V0RXJyb3JBZnRlckNsb3NlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIFBhcmNlbEZpbGVEZXNjcmlwdG9yW10gcGFpciA9IFBhcmNlbEZpbGVEZXNjcmlwdG9yLmNyZWF0ZVJlbGlhYmxlU29ja2V0UGFpcigpOwogICAgICAgICBmaW5hbCBQYXJjZWxGaWxlRGVzY3JpcHRvciByZWQgPSBwYWlyWzBdOwpAQCAtMzYxLDYgKzM5OCw3IEBACiAgICAgICAgIGJsdWUuY2hlY2tFcnJvcigpOwogICAgIH0KIAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFNvY2tldE11bHRpcGxlQ2hlY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgUGFyY2VsRmlsZURlc2NyaXB0b3JbXSBwYWlyID0gUGFyY2VsRmlsZURlc2NyaXB0b3IuY3JlYXRlUmVsaWFibGVTb2NrZXRQYWlyKCk7CiAgICAgICAgIGZpbmFsIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHJlZCA9IHBhaXJbMF07CkBAIC0zODIsNiArNDIwLDcgQEAKICAgICB9CiAKICAgICAvLyBodHRwOi8vYi8yMTU3ODA1NgorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEZpbGVOYW1lc1dpdGhOb25CbXBDaGFycygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBmaW5hbCBGaWxlIGZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJ0cmVibGVfY2xlZl9cdWQ4MzRcdWRkMWUiLCAiLnRtcCIpOwogICAgICAgICBmaW5hbCBQYXJjZWxGaWxlRGVzY3JpcHRvciBwZmQgPSBQYXJjZWxGaWxlRGVzY3JpcHRvci5vcGVuKGZpbGUsCkBAIC0zOTAsNiArNDI5LDU3IEBACiAgICAgICAgIHBmZC5jbG9zZSgpOwogICAgIH0KIAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENoZWNrRmluYWxpemVyQmVoYXZpb3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUnVudGltZSBydW50aW1lID0gUnVudGltZS5nZXRSdW50aW1lKCk7CisgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHBmZCA9IG1ha2VQYXJjZWxGaWxlRGVzY3JpcHRvcihnZXRDb250ZXh0KCkpOworICAgICAgICBhc3NlcnRUcnVlKGNoZWNrSXNWYWxpZChwZmQuZ2V0RmlsZURlc2NyaXB0b3IoKSkpOworCisgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHdyYXBwZWRQZmQgPSBuZXcgUGFyY2VsRmlsZURlc2NyaXB0b3IocGZkKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjaGVja0lzVmFsaWQod3JhcHBlZFBmZC5nZXRGaWxlRGVzY3JpcHRvcigpKSk7CisKKyAgICAgICAgRmlsZURlc2NyaXB0b3IgZmQgPSBwZmQuZ2V0RmlsZURlc2NyaXB0b3IoKTsKKyAgICAgICAgaW50IHJhd0ZkID0gcGZkLmdldEZkKCk7CisgICAgICAgIHBmZCA9IG51bGw7CisgICAgICAgIGFzc2VydE51bGwocGZkKTsgLy8gVG8ga2VlcCB0b29scyBoYXBweSAtIHllcyB3ZSBhcmUgdXNpbmcgdGhlIHdyaXRlIHRvIG51bGwKKyAgICAgICAgcnVudGltZS5nYygpOyBydW50aW1lLnJ1bkZpbmFsaXphdGlvbigpOworICAgICAgICBhc3NlcnRUcnVlKCJXcmFwcGVkIFBGRCBmYWlsZWQgdG8gaG9sZCByZWZlcmVuY2UiLAorICAgICAgICAgICAgICAgIGNoZWNrSXNWYWxpZCh3cmFwcGVkUGZkLmdldEZpbGVEZXNjcmlwdG9yKCkpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRmlsZURlc2NyaXB0b3IgZmFpbGVkIHRvIGhvbGQgcmVmZXJlbmNlIiwgY2hlY2tJc1ZhbGlkKGZkKSk7CisKKyAgICAgICAgd3JhcHBlZFBmZCA9IG51bGw7CisgICAgICAgIGFzc2VydE51bGwod3JhcHBlZFBmZCk7IC8vIFRvIGtlZXAgdG9vbHMgaGFwcHkgLSB5ZXMgd2UgYXJlIHVzaW5nIHRoZSB3cml0ZSB0byBudWxsCisgICAgICAgIHJ1bnRpbWUuZ2MoKTsgcnVudGltZS5ydW5GaW5hbGl6YXRpb24oKTsKKyAgICAgICAgLy8gVE9ETzogRW5hYmxlIHRoaXMgb25jZSBiLzY1MDI3OTk4IGlzIGZpeGVkCisgICAgICAgIC8vYXNzZXJ0VHJ1ZSgiRmlsZURlc2NyaXB0b3IgZmFpbGVkIHRvIGhvbGQgcmVmZXJlbmNlIiwgY2hlY2tJc1ZhbGlkKGZkKSk7CisKKyAgICAgICAgZmQgPSBudWxsOworICAgICAgICBhc3NlcnROdWxsKGZkKTsgLy8gVG8ga2VlcCB0b29scyBoYXBweSAtIHllcyB3ZSBhcmUgdXNpbmcgdGhlIHdyaXRlIHRvIG51bGwKKyAgICAgICAgcnVudGltZS5nYygpOyBydW50aW1lLnJ1bkZpbmFsaXphdGlvbigpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvci5mcm9tRmQocmF3RmQpOworICAgICAgICAgICAgZmFpbCgiRkQgbGVha2VkIik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyBTdWNjZXNzCisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sZWFuIGNoZWNrSXNWYWxpZChGaWxlRGVzY3JpcHRvciBmZCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgT3MuZnN0YXQoZmQpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gY2F0Y2ggKEVycm5vRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGlmIChlLmVycm5vID09IE9zQ29uc3RhbnRzLkVCQURGKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICAvLyBub3QgcmVhY2hlZAorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIHN0YXRpYyBQYXJjZWxGaWxlRGVzY3JpcHRvciBtYWtlUGFyY2VsRmlsZURlc2NyaXB0b3IoQ29udGV4dCBjb24pIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBmaW5hbCBTdHJpbmcgZmlsZU5hbWUgPSAidGVzdFBhcmNlbEZpbGVEZXNjcmlwdG9yIjsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvb3Mvc3JjL2FuZHJvaWQvb3MvY3RzL1BhcmNlbFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL29zL3NyYy9hbmRyb2lkL29zL2N0cy9QYXJjZWxUZXN0LmphdmEKaW5kZXggOGEyMjFlNi4uOTg3YWIwMCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvb3Mvc3JjL2FuZHJvaWQvb3MvY3RzL1BhcmNlbFRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9vcy9zcmMvYW5kcm9pZC9vcy9jdHMvUGFyY2VsVGVzdC5qYXZhCkBAIC0yOTU1LDYgKzI5NTUsNzMgQEAKICAgICAgICAgcC5yZWN5Y2xlKCk7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgdGVzdEJpbmRlckRhdGFQcm90ZWN0aW9uKCkgeworICAgICAgICBQYXJjZWwgcDsKKyAgICAgICAgSUJpbmRlciBiID0gbmV3IEJpbmRlcigpOworCisgICAgICAgIHAgPSBQYXJjZWwub2J0YWluKCk7CisgICAgICAgIGZpbmFsIGludCBmaXJzdEludFBvcyA9IHAuZGF0YVBvc2l0aW9uKCk7CisgICAgICAgIHAud3JpdGVJbnQoMSk7CisgICAgICAgIHAud3JpdGVTdHJvbmdCaW5kZXIoYik7CisgICAgICAgIGZpbmFsIGludCBzZWNvbmRJbnRQb3MgPSBwLmRhdGFQb3NpdGlvbigpOworICAgICAgICBwLndyaXRlSW50KDIpOworICAgICAgICBwLndyaXRlU3Ryb25nQmluZGVyKGIpOworICAgICAgICBmaW5hbCBpbnQgdGhpcmRJbnRQb3MgPSBwLmRhdGFQb3NpdGlvbigpOworICAgICAgICBwLndyaXRlSW50KDMpOworCisgICAgICAgIGZvciAoaW50IHBvcyA9IDA7IHBvcyA8PSB0aGlyZEludFBvczsgcG9zKyspIHsKKyAgICAgICAgICAgIHAuc2V0RGF0YVBvc2l0aW9uKHBvcyk7CisgICAgICAgICAgICBpbnQgdmFsdWUgPSBwLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIGlmIChwb3MgPT0gZmlyc3RJbnRQb3MpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgdmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChwb3MgPT0gc2Vjb25kSW50UG9zKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHZhbHVlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocG9zID09IHRoaXJkSW50UG9zKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHZhbHVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gQWxsIG90aGVyIHJlYWQgYXR0ZW1wdHMgY3Jvc3MgaW50byBwcm90ZWN0ZWQgZGF0YSBhbmQgd2lsbCByZXR1cm4gMAorICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwLnJlY3ljbGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmluZGVyRGF0YVByb3RlY3Rpb25JbmNyZW1lbnRzKCkgeworICAgICAgICBQYXJjZWwgcDsKKyAgICAgICAgSUJpbmRlciBiID0gbmV3IEJpbmRlcigpOworCisgICAgICAgIHAgPSBQYXJjZWwub2J0YWluKCk7CisgICAgICAgIGZpbmFsIGludCBmaXJzdEludFBvcyA9IHAuZGF0YVBvc2l0aW9uKCk7CisgICAgICAgIHAud3JpdGVJbnQoMSk7CisgICAgICAgIHAud3JpdGVTdHJvbmdCaW5kZXIoYik7CisgICAgICAgIGZpbmFsIGludCBzZWNvbmRJbnRQb3MgPSBwLmRhdGFQb3NpdGlvbigpOworICAgICAgICBwLndyaXRlSW50KDIpOworICAgICAgICBwLndyaXRlU3Ryb25nQmluZGVyKGIpOworICAgICAgICBmaW5hbCBpbnQgdGhpcmRJbnRQb3MgPSBwLmRhdGFQb3NpdGlvbigpOworICAgICAgICBwLndyaXRlSW50KDMpOworICAgICAgICBmaW5hbCBpbnQgZW5kID0gcC5kYXRhUG9zaXRpb24oKTsKKworICAgICAgICBwLnNldERhdGFQb3NpdGlvbigwKTsKKyAgICAgICAgaW50IHBvczsKKyAgICAgICAgZG8geworICAgICAgICAgICAgcG9zID0gcC5kYXRhUG9zaXRpb24oKTsKKyAgICAgICAgICAgIGludCB2YWx1ZSA9IHAucmVhZEludCgpOworICAgICAgICAgICAgaWYgKHBvcyA9PSBmaXJzdEludFBvcykgeworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCB2YWx1ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHBvcyA9PSBzZWNvbmRJbnRQb3MpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgdmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChwb3MgPT0gdGhpcmRJbnRQb3MpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMywgdmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBBbGwgb3RoZXIgcmVhZCBhdHRlbXB0cyBjcm9zcyBpbnRvIHByb3RlY3RlZCBkYXRhIGFuZCB3aWxsIHJldHVybiAwCisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZShwb3MgPCBlbmQpOworCisgICAgICAgIHAucmVjeWNsZSgpOworICAgIH0KKwogICAgIHByaXZhdGUgY2xhc3MgTW9ja0NsYXNzTG9hZGVyIGV4dGVuZHMgQ2xhc3NMb2FkZXIgewogICAgICAgICBwdWJsaWMgTW9ja0NsYXNzTG9hZGVyKCkgewogICAgICAgICAgICAgc3VwZXIoKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL29zL3NyYy9hbmRyb2lkL29zL2N0cy9SZXF1aXJlZENvbXBvbmVudHNUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9vcy9zcmMvYW5kcm9pZC9vcy9jdHMvUmVxdWlyZWRDb21wb25lbnRzVGVzdC5qYXZhCmluZGV4IDM3OGFjMDkuLjY0ZTQzOTQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL29zL3NyYy9hbmRyb2lkL29zL2N0cy9SZXF1aXJlZENvbXBvbmVudHNUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvb3Mvc3JjL2FuZHJvaWQvb3MvY3RzL1JlcXVpcmVkQ29tcG9uZW50c1Rlc3QuamF2YQpAQCAtMTYsNiArMTYsMTAgQEAKIAogcGFja2FnZSBhbmRyb2lkLm9zLmN0czsKIAoraW1wb3J0IHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuTUFUQ0hfRElSRUNUX0JPT1RfQVdBUkU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5NQVRDSF9ESVJFQ1RfQk9PVF9VTkFXQVJFOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuTUFUQ0hfU1lTVEVNX09OTFk7CisKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKQEAgLTI1LDE4ICsyOSwxNiBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUmVzb2x2ZUluZm87CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5NQVRDSF9ESVJFQ1RfQk9PVF9BV0FSRTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLk1BVENIX0RJUkVDVF9CT09UX1VOQVdBUkU7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5NQVRDSF9TWVNURU1fT05MWTsKLQogLyoqCiAgKiBUZXN0cyB3aGV0aGVyIGFsbCBwbGF0Zm9ybSBjb21wb25lbnRzIHRoYXQgYXJlIGltcGxlbWVudGVkCiAgKiBhcyBBUEtzIGZvciB2YXJpb3VzIHJlYXNvbnMgYXJlIHByZXNlbnQuCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9vcy9zcmMvYW5kcm9pZC9vcy9jdHMvU1BNSVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL29zL3NyYy9hbmRyb2lkL29zL2N0cy9TUE1JVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1YjZkYTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9vcy9zcmMvYW5kcm9pZC9vcy9jdHMvU1BNSVRlc3QuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm9zLmN0czsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKKworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgU1BNSVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgIHN0YXRpYyB7IFN5c3RlbS5sb2FkTGlicmFyeSgiY3Rzb3Nfam5pIik7IH0KKworICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIGxlYWtQb2ludGVyKCk7CisgIHB1YmxpYyB2b2lkIHRlc3RBcm1DcHVpbmZvKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBhc3NlcnRUcnVlKCJTUE1JVGVzdDogVGhpcyBsaW51eCBrZXJuZWwgaXMgdnVsbmVyYWJsZSIsIGxlYWtQb2ludGVyKCkpOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9vcy9zcmMvYW5kcm9pZC9vcy9jdHMvU2VjY29tcFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL29zL3NyYy9hbmRyb2lkL29zL2N0cy9TZWNjb21wVGVzdC5qYXZhCmluZGV4IDM5YzZiOWMuLmFiODk1OGUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL29zL3NyYy9hbmRyb2lkL29zL2N0cy9TZWNjb21wVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL29zL3NyYy9hbmRyb2lkL29zL2N0cy9TZWNjb21wVGVzdC5qYXZhCkBAIC0zNCw3ICszNCw2IEBACiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DZGRUZXN0OwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ3B1RmVhdHVyZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlOwogCkBAIC00OCw3ICs0Nyw2IEBACiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZW91dEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKIAotQENkZFRlc3QocmVxdWlyZW1lbnQ9IjkuNy9DLTAtNiIpCiBwdWJsaWMgY2xhc3MgU2VjY29tcFRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgewogICAgIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFHID0gIlNlY2NvbXBUZXN0IjsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvb3Mvc3JjL2FuZHJvaWQvb3MvY3RzL1NoYXJlZE1lbW9yeVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL29zL3NyYy9hbmRyb2lkL29zL2N0cy9TaGFyZWRNZW1vcnlUZXN0LmphdmEKaW5kZXggZjIxYjA5NS4uZmI1NDdiMyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvb3Mvc3JjL2FuZHJvaWQvb3MvY3RzL1NoYXJlZE1lbW9yeVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9vcy9zcmMvYW5kcm9pZC9vcy9jdHMvU2hhcmVkTWVtb3J5VGVzdC5qYXZhCkBAIC0xNiwxNSArMTYsMTQgQEAKIAogcGFja2FnZSBhbmRyb2lkLm9zLmN0czsKIAotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0OwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnN5c3RlbS5Pc0NvbnN0YW50cy5QUk9UX1JFQUQ7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuc3lzdGVtLk9zQ29uc3RhbnRzLlBST1RfV1JJVEU7CiAKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0OworCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwogCiBpbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOwpAQCAtMzUsMTIgKzM0LDEzIEBACiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuU2hhcmVkTWVtb3J5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnN5c3RlbS5FcnJub0V4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLnN5c3RlbS5Pc0NvbnN0YW50czsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZTsKIAogaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL29zL3NyYy9hbmRyb2lkL29zL2N0cy9TdHJpY3RNb2RlVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvb3Mvc3JjL2FuZHJvaWQvb3MvY3RzL1N0cmljdE1vZGVUZXN0LmphdmEKaW5kZXggMjE3MzBjNi4uYmIwY2EwNSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvb3Mvc3JjL2FuZHJvaWQvb3MvY3RzL1N0cmljdE1vZGVUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvb3Mvc3JjL2FuZHJvaWQvb3MvY3RzL1N0cmljdE1vZGVUZXN0LmphdmEKQEAgLTE2LDM0MCArMTYsNTgzIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5vcy5jdHM7CiAKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24udHJ1dGguVHJ1dGguYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24udHJ1dGguVHJ1dGguYXNzZXJ0V2l0aE1lc3NhZ2U7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5TZXJ2aWNlQ29ubmVjdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVHJhZmZpY1N0YXRzOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5TdHJpY3RNb2RlOwotaW1wb3J0IGFuZHJvaWQub3MuU3RyaWN0TW9kZS5WaW9sYXRpb25MaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlN0cmljdE1vZGUuVGhyZWFkUG9saWN5LkJ1aWxkZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5TdHJpY3RNb2RlLlZpb2xhdGlvbkluZm87CitpbXBvcnQgYW5kcm9pZC5vcy5zdHJpY3Rtb2RlLkN1c3RvbVZpb2xhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLnN0cmljdG1vZGUuRmlsZVVyaUV4cG9zZWRWaW9sYXRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5zdHJpY3Rtb2RlLlVudGFnZ2VkU29ja2V0VmlvbGF0aW9uOworaW1wb3J0IGFuZHJvaWQub3Muc3RyaWN0bW9kZS5WaW9sYXRpb247CiBpbXBvcnQgYW5kcm9pZC5zeXN0ZW0uT3M7CiBpbXBvcnQgYW5kcm9pZC5zeXN0ZW0uT3NDb25zdGFudHM7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RDYXNlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5IdHRwVVJMQ29ubmVjdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7CiBpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQXJyYXlCbG9ja2luZ1F1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkJsb2NraW5nUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkxpbmtlZEJsb2NraW5nUXVldWU7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOwogCi0vKioKLSAqIFRlc3RzIGZvciB7QGxpbmsgU3RyaWN0TW9kZX0KLSAqLwotcHVibGljIGNsYXNzIFN0cmljdE1vZGVUZXN0IGV4dGVuZHMgSW5zdHJ1bWVudGF0aW9uVGVzdENhc2UgeworLyoqIFRlc3RzIGZvciB7QGxpbmsgU3RyaWN0TW9kZX0gKi8KK0BSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgU3RyaWN0TW9kZVRlc3QgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3RyaWN0TW9kZVRlc3QiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRU1PVEVfU0VSVklDRV9BQ1RJT04gPSAiYW5kcm9pZC5hcHAuUkVNT1RFU0VSVklDRSI7CiAKICAgICBwcml2YXRlIFN0cmljdE1vZGUuVGhyZWFkUG9saWN5IG1UaHJlYWRQb2xpY3k7CiAgICAgcHJpdmF0ZSBTdHJpY3RNb2RlLlZtUG9saWN5IG1WbVBvbGljeTsKIAogICAgIHByaXZhdGUgQ29udGV4dCBnZXRDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0Q29udGV4dCgpOworICAgICAgICByZXR1cm4gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpOwogICAgIH0KIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgeworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKICAgICAgICAgbVRocmVhZFBvbGljeSA9IFN0cmljdE1vZGUuZ2V0VGhyZWFkUG9saWN5KCk7CiAgICAgICAgIG1WbVBvbGljeSA9IFN0cmljdE1vZGUuZ2V0Vm1Qb2xpY3koKTsKICAgICB9CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKICAgICAgICAgU3RyaWN0TW9kZS5zZXRUaHJlYWRQb2xpY3kobVRocmVhZFBvbGljeSk7CiAgICAgICAgIFN0cmljdE1vZGUuc2V0Vm1Qb2xpY3kobVZtUG9saWN5KTsKICAgICB9CiAKICAgICBwdWJsaWMgaW50ZXJmYWNlIFRocm93aW5nUnVubmFibGUgewotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uOworICAgICAgICB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb247CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogSW5zZWN1cmUgY29ubmVjdGlvbiBzaG91bGQgYmUgZGV0ZWN0ZWQKLSAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUaHJlYWRCdWlsZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmljdE1vZGUuVGhyZWFkUG9saWN5IHBvbGljeSA9IG5ldyBTdHJpY3RNb2RlLlRocmVhZFBvbGljeS5CdWlsZGVyKCkuZGV0ZWN0RGlza1JlYWRzKCkucGVuYWx0eUxvZygpLmJ1aWxkKCk7CisgICAgICAgIFN0cmljdE1vZGUuc2V0VGhyZWFkUG9saWN5KG5ldyBTdHJpY3RNb2RlLlRocmVhZFBvbGljeS5CdWlsZGVyKHBvbGljeSkuYnVpbGQoKSk7CisKKyAgICAgICAgZmluYWwgRmlsZSB0ZXN0ID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiZm9vIiwgImJhciIpOworICAgICAgICBpbnNwZWN0VmlvbGF0aW9uKAorICAgICAgICAgICAgICAgIHRlc3Q6OmV4aXN0cywKKyAgICAgICAgICAgICAgICB2aW9sYXRpb24gLT4geworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUaGF0KHZpb2xhdGlvbi5nZXRWaW9sYXRpb25EZXRhaWxzKCkpLmlzTnVsbCgpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUaGF0KHZpb2xhdGlvbi5nZXRTdGFja1RyYWNlKCkpLmNvbnRhaW5zKCJEaXNrUmVhZFZpb2xhdGlvbiIpOworICAgICAgICAgICAgICAgIH0pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVuY2xvc2VkQ2xvc2VhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmljdE1vZGUuc2V0Vm1Qb2xpY3koCisgICAgICAgICAgICAgICAgbmV3IFN0cmljdE1vZGUuVm1Qb2xpY3kuQnVpbGRlcigpLmRldGVjdExlYWtlZENsb3NhYmxlT2JqZWN0cygpLmJ1aWxkKCkpOworCisgICAgICAgIGluc3BlY3RWaW9sYXRpb24oCisgICAgICAgICAgICAgICAgKCkgLT4gbGVha0Nsb3NlYWJsZSgibGVha2VkLnR4dCIpLAorICAgICAgICAgICAgICAgIGluZm8gLT4geworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUaGF0KGluZm8uZ2V0VmlvbGF0aW9uRGV0YWlscygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pc0VxdWFsVG8oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQSByZXNvdXJjZSB3YXMgYWNxdWlyZWQgYXQgYXR0YWNoZWQgc3RhY2sgdHJhY2UgYnV0IG5ldmVyIHJlbGVhc2VkLiBTZWUgamF2YS5pby5DbG9zZWFibGUgZm9yIGluZm9ybWF0aW9uIG9uIGF2b2lkaW5nIHJlc291cmNlIGxlYWtzLiIpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUaGF0KGluZm8uZ2V0U3RhY2tUcmFjZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb250YWlucygiRXhwbGljaXQgdGVybWluYXRpb24gbWV0aG9kICdjbG9zZScgbm90IGNhbGxlZCIpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUaGF0KGluZm8uZ2V0U3RhY2tUcmFjZSgpKS5jb250YWlucygibGVha0Nsb3NlYWJsZSIpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRQb2xpY3koaW5mbywgU3RyaWN0TW9kZS5ERVRFQ1RfVk1fQ0xPU0FCTEVfTEVBS1MpOworICAgICAgICAgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBsZWFrQ2xvc2VhYmxlKFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggZmluYWxpemVkU2lnbmFsID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IEZpbGVPdXRwdXRTdHJlYW0obmV3IEZpbGUoZ2V0Q29udGV4dCgpLmdldEZpbGVzRGlyKCksIGZpbGVOYW1lKSkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgc3VwZXIuZmluYWxpemUoKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWxpemVkU2lnbmFsLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgICAgICBSdW50aW1lLmdldFJ1bnRpbWUoKS5nYygpOworICAgICAgICBSdW50aW1lLmdldFJ1bnRpbWUoKS5ydW5GaW5hbGl6YXRpb24oKTsKKyAgICAgICAgLy8gU29tZXRpbWVzIGl0IG5lZWRzIGV4dHJhIHByb2RkaW5nLgorICAgICAgICBpZiAoIWZpbmFsaXplZFNpZ25hbC5hd2FpdCg1LCBUaW1lVW5pdC5TRUNPTkRTKSkgeworICAgICAgICAgICAgUnVudGltZS5nZXRSdW50aW1lKCkuZ2MoKTsKKyAgICAgICAgICAgIFJ1bnRpbWUuZ2V0UnVudGltZSgpLnJ1bkZpbmFsaXphdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NJbnN0YW5jZUxpbWl0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmljdE1vZGUuc2V0Vm1Qb2xpY3koCisgICAgICAgICAgICAgICAgbmV3IFN0cmljdE1vZGUuVm1Qb2xpY3kuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q2xhc3NJbnN0YW5jZUxpbWl0KExpbWl0ZWRDbGFzcy5jbGFzcywgMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgTGlzdDxMaW1pdGVkQ2xhc3M+IHJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgYXNzZXJ0Tm9WaW9sYXRpb24oKCkgLT4gcmVmZXJlbmNlcy5hZGQobmV3IExpbWl0ZWRDbGFzcygpKSk7CisgICAgICAgIHJlZmVyZW5jZXMuYWRkKG5ldyBMaW1pdGVkQ2xhc3MoKSk7CisgICAgICAgIGluc3BlY3RWaW9sYXRpb24oCisgICAgICAgICAgICAgICAgU3RyaWN0TW9kZTo6Y29uZGl0aW9uYWxseUNoZWNrSW5zdGFuY2VDb3VudHMsCisgICAgICAgICAgICAgICAgaW5mbyAtPiBhc3NlcnRQb2xpY3koaW5mbywgU3RyaWN0TW9kZS5ERVRFQ1RfVk1fSU5TVEFOQ0VfTEVBS1MpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBMaW1pdGVkQ2xhc3Mge30KKworICAgIC8qKiBJbnNlY3VyZSBjb25uZWN0aW9uIHNob3VsZCBiZSBkZXRlY3RlZCAqLworICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdENsZWFydGV4dE5ldHdvcmsoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFoYXNJbnRlcm5ldENvbm5lY3Rpb24oKSkgewogICAgICAgICAgICAgTG9nLmkoVEFHLCAidGVzdENsZWFydGV4dE5ldHdvcmsoKSBpZ25vcmVkIG9uIGRldmljZSB3aXRob3V0IEludGVybmV0Iik7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICBTdHJpY3RNb2RlLnNldFZtUG9saWN5KG5ldyBTdHJpY3RNb2RlLlZtUG9saWN5LkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgIC5kZXRlY3RDbGVhcnRleHROZXR3b3JrKCkKLSAgICAgICAgICAgICAgICAucGVuYWx0eUxvZygpCi0gICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICBTdHJpY3RNb2RlLnNldFZtUG9saWN5KAorICAgICAgICAgICAgICAgIG5ldyBTdHJpY3RNb2RlLlZtUG9saWN5LkJ1aWxkZXIoKS5kZXRlY3RDbGVhcnRleHROZXR3b3JrKCkucGVuYWx0eUxvZygpLmJ1aWxkKCkpOwogCi0gICAgICAgIGFzc2VydFZpb2xhdGlvbigiRGV0ZWN0ZWQgY2xlYXJ0ZXh0IG5ldHdvcmsgdHJhZmZpYyBmcm9tIFVJRCIsICgpIC0+IHsKLSAgICAgICAgICAgICgoSHR0cFVSTENvbm5lY3Rpb24pIG5ldyBVUkwoImh0dHA6Ly9leGFtcGxlLmNvbS8iKS5vcGVuQ29ubmVjdGlvbigpKQotICAgICAgICAgICAgICAgICAgICAuZ2V0UmVzcG9uc2VDb2RlKCk7Ci0gICAgICAgIH0pOworICAgICAgICBpbnNwZWN0VmlvbGF0aW9uKAorICAgICAgICAgICAgICAgICgpIC0+CisgICAgICAgICAgICAgICAgICAgICAgICAoKEh0dHBVUkxDb25uZWN0aW9uKSBuZXcgVVJMKCJodHRwOi8vZXhhbXBsZS5jb20vIikub3BlbkNvbm5lY3Rpb24oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFJlc3BvbnNlQ29kZSgpLAorICAgICAgICAgICAgICAgIGluZm8gLT4geworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUaGF0KGluZm8uZ2V0VmlvbGF0aW9uRGV0YWlscygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb250YWlucygiRGV0ZWN0ZWQgY2xlYXJ0ZXh0IG5ldHdvcmsgdHJhZmZpYyBmcm9tIFVJRCIpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUaGF0KGluZm8uZ2V0VmlvbGF0aW9uRGV0YWlscygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdGFydHNXaXRoKFN0cmljdE1vZGUuQ0xFQVJURVhUX0RFVEVDVEVEX01TRyk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFBvbGljeShpbmZvLCBTdHJpY3RNb2RlLkRFVEVDVF9WTV9DTEVBUlRFWFRfTkVUV09SSyk7CisgICAgICAgICAgICAgICAgfSk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogU2VjdXJlIGNvbm5lY3Rpb24gc2hvdWxkIGJlIGlnbm9yZWQKLSAgICAgKi8KKyAgICAvKiogU2VjdXJlIGNvbm5lY3Rpb24gc2hvdWxkIGJlIGlnbm9yZWQgKi8KKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RFbmNyeXB0ZWROZXR3b3JrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghaGFzSW50ZXJuZXRDb25uZWN0aW9uKCkpIHsKICAgICAgICAgICAgIExvZy5pKFRBRywgInRlc3RFbmNyeXB0ZWROZXR3b3JrKCkgaWdub3JlZCBvbiBkZXZpY2Ugd2l0aG91dCBJbnRlcm5ldCIpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgU3RyaWN0TW9kZS5zZXRWbVBvbGljeShuZXcgU3RyaWN0TW9kZS5WbVBvbGljeS5CdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAuZGV0ZWN0Q2xlYXJ0ZXh0TmV0d29yaygpCi0gICAgICAgICAgICAgICAgLnBlbmFsdHlMb2coKQotICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgU3RyaWN0TW9kZS5zZXRWbVBvbGljeSgKKyAgICAgICAgICAgICAgICBuZXcgU3RyaWN0TW9kZS5WbVBvbGljeS5CdWlsZGVyKCkuZGV0ZWN0Q2xlYXJ0ZXh0TmV0d29yaygpLnBlbmFsdHlMb2coKS5idWlsZCgpKTsKIAotICAgICAgICBhc3NlcnROb1Zpb2xhdGlvbigoKSAtPiB7Ci0gICAgICAgICAgICAoKEh0dHBVUkxDb25uZWN0aW9uKSBuZXcgVVJMKCJodHRwczovL2V4YW1wbGUuY29tLyIpLm9wZW5Db25uZWN0aW9uKCkpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRSZXNwb25zZUNvZGUoKTsKLSAgICAgICAgfSk7CisgICAgICAgIGFzc2VydE5vVmlvbGF0aW9uKAorICAgICAgICAgICAgICAgICgpIC0+CisgICAgICAgICAgICAgICAgICAgICAgICAoKEh0dHBVUkxDb25uZWN0aW9uKSBuZXcgVVJMKCJodHRwczovL2V4YW1wbGUuY29tLyIpLm9wZW5Db25uZWN0aW9uKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRSZXNwb25zZUNvZGUoKSk7CiAgICAgfQogCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZVVyaUV4cG9zdXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmljdE1vZGUuc2V0Vm1Qb2xpY3kobmV3IFN0cmljdE1vZGUuVm1Qb2xpY3kuQnVpbGRlcigpCi0gICAgICAgICAgICAgICAgLmRldGVjdEZpbGVVcmlFeHBvc3VyZSgpCi0gICAgICAgICAgICAgICAgLnBlbmFsdHlMb2coKQotICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgU3RyaWN0TW9kZS5zZXRWbVBvbGljeSgKKyAgICAgICAgICAgICAgICBuZXcgU3RyaWN0TW9kZS5WbVBvbGljeS5CdWlsZGVyKCkuZGV0ZWN0RmlsZVVyaUV4cG9zdXJlKCkucGVuYWx0eUxvZygpLmJ1aWxkKCkpOwogCiAgICAgICAgIGZpbmFsIFVyaSBiYWRVcmkgPSBVcmkuZnJvbUZpbGUobmV3IEZpbGUoIi9zZGNhcmQvbWVvdy5qcGciKSk7Ci0gICAgICAgIGFzc2VydFZpb2xhdGlvbihiYWRVcmkgKyAiIGV4cG9zZWQgYmV5b25kIGFwcCIsICgpIC0+IHsKLSAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEludGVudC5BQ1RJT05fVklFVyk7Ci0gICAgICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOwotICAgICAgICAgICAgaW50ZW50LnNldERhdGFBbmRUeXBlKGJhZFVyaSwgImltYWdlL2pwZWciKTsKLSAgICAgICAgICAgIGdldENvbnRleHQoKS5zdGFydEFjdGl2aXR5KGludGVudCk7Ci0gICAgICAgIH0pOworICAgICAgICBpbnNwZWN0VmlvbGF0aW9uKAorICAgICAgICAgICAgICAgICgpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9WSUVXKTsKKyAgICAgICAgICAgICAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLKTsKKyAgICAgICAgICAgICAgICAgICAgaW50ZW50LnNldERhdGFBbmRUeXBlKGJhZFVyaSwgImltYWdlL2pwZWciKTsKKyAgICAgICAgICAgICAgICAgICAgZ2V0Q29udGV4dCgpLnN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHZpb2xhdGlvbiAtPiB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRoYXQodmlvbGF0aW9uLmdldFN0YWNrVHJhY2UoKSkuY29udGFpbnMoYmFkVXJpICsgIiBleHBvc2VkIGJleW9uZCBhcHAiKTsKKyAgICAgICAgICAgICAgICB9KTsKIAogICAgICAgICBmaW5hbCBVcmkgZ29vZFVyaSA9IFVyaS5wYXJzZSgiY29udGVudDovL2NvbS5leGFtcGxlL2Zvb2JhciIpOwotICAgICAgICBhc3NlcnROb1Zpb2xhdGlvbigoKSAtPiB7Ci0gICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChJbnRlbnQuQUNUSU9OX1ZJRVcpOwotICAgICAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLKTsKLSAgICAgICAgICAgIGludGVudC5zZXREYXRhQW5kVHlwZShnb29kVXJpLCAiaW1hZ2UvanBlZyIpOwotICAgICAgICAgICAgZ2V0Q29udGV4dCgpLnN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKLSAgICAgICAgfSk7CisgICAgICAgIGFzc2VydE5vVmlvbGF0aW9uKAorICAgICAgICAgICAgICAgICgpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9WSUVXKTsKKyAgICAgICAgICAgICAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLKTsKKyAgICAgICAgICAgICAgICAgICAgaW50ZW50LnNldERhdGFBbmRUeXBlKGdvb2RVcmksICJpbWFnZS9qcGVnIik7CisgICAgICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5zdGFydEFjdGl2aXR5KGludGVudCk7CisgICAgICAgICAgICAgICAgfSk7CiAgICAgfQogCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGVudFVyaVdpdGhvdXRQZXJtaXNzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmljdE1vZGUuc2V0Vm1Qb2xpY3kobmV3IFN0cmljdE1vZGUuVm1Qb2xpY3kuQnVpbGRlcigpCi0gICAgICAgICAgICAgICAgLmRldGVjdENvbnRlbnRVcmlXaXRob3V0UGVybWlzc2lvbigpCi0gICAgICAgICAgICAgICAgLnBlbmFsdHlMb2coKQotICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgU3RyaWN0TW9kZS5zZXRWbVBvbGljeSgKKyAgICAgICAgICAgICAgICBuZXcgU3RyaWN0TW9kZS5WbVBvbGljeS5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5kZXRlY3RDb250ZW50VXJpV2l0aG91dFBlcm1pc3Npb24oKQorICAgICAgICAgICAgICAgICAgICAgICAgLnBlbmFsdHlMb2coKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOwogCiAgICAgICAgIGZpbmFsIFVyaSB1cmkgPSBVcmkucGFyc2UoImNvbnRlbnQ6Ly9jb20uZXhhbXBsZS9mb29iYXIiKTsKLSAgICAgICAgYXNzZXJ0VmlvbGF0aW9uKHVyaSArICIgZXhwb3NlZCBiZXlvbmQgYXBwIiwgKCkgLT4gewotICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9WSUVXKTsKLSAgICAgICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7Ci0gICAgICAgICAgICBpbnRlbnQuc2V0RGF0YUFuZFR5cGUodXJpLCAiaW1hZ2UvanBlZyIpOwotICAgICAgICAgICAgZ2V0Q29udGV4dCgpLnN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKLSAgICAgICAgfSk7CisgICAgICAgIGluc3BlY3RWaW9sYXRpb24oCisgICAgICAgICAgICAgICAgKCkgLT4geworICAgICAgICAgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChJbnRlbnQuQUNUSU9OX1ZJRVcpOworICAgICAgICAgICAgICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOworICAgICAgICAgICAgICAgICAgICBpbnRlbnQuc2V0RGF0YUFuZFR5cGUodXJpLCAiaW1hZ2UvanBlZyIpOworICAgICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuc3RhcnRBY3Rpdml0eShpbnRlbnQpOworICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgdmlvbGF0aW9uIC0+CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRUaGF0KHZpb2xhdGlvbi5nZXRTdGFja1RyYWNlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb250YWlucyh1cmkgKyAiIGV4cG9zZWQgYmV5b25kIGFwcCIpKTsKIAotICAgICAgICBhc3NlcnROb1Zpb2xhdGlvbigoKSAtPiB7Ci0gICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChJbnRlbnQuQUNUSU9OX1ZJRVcpOwotICAgICAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLKTsKLSAgICAgICAgICAgIGludGVudC5zZXREYXRhQW5kVHlwZSh1cmksICJpbWFnZS9qcGVnIik7Ci0gICAgICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfR1JBTlRfUkVBRF9VUklfUEVSTUlTU0lPTik7Ci0gICAgICAgICAgICBnZXRDb250ZXh0KCkuc3RhcnRBY3Rpdml0eShpbnRlbnQpOwotICAgICAgICB9KTsKKyAgICAgICAgYXNzZXJ0Tm9WaW9sYXRpb24oCisgICAgICAgICAgICAgICAgKCkgLT4geworICAgICAgICAgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChJbnRlbnQuQUNUSU9OX1ZJRVcpOworICAgICAgICAgICAgICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOworICAgICAgICAgICAgICAgICAgICBpbnRlbnQuc2V0RGF0YUFuZFR5cGUodXJpLCAiaW1hZ2UvanBlZyIpOworICAgICAgICAgICAgICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfR1JBTlRfUkVBRF9VUklfUEVSTUlTU0lPTik7CisgICAgICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5zdGFydEFjdGl2aXR5KGludGVudCk7CisgICAgICAgICAgICAgICAgfSk7CiAgICAgfQogCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0VW50YWdnZWRTb2NrZXRzSHR0cCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBpZiAoIWhhc0ludGVybmV0Q29ubmVjdGlvbigpKSB7CiAgICAgICAgICAgICBMb2cuaShUQUcsICJ0ZXN0VW50YWdnZWRTb2NrZXRzKCkgaWdub3JlZCBvbiBkZXZpY2Ugd2l0aG91dCBJbnRlcm5ldCIpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgU3RyaWN0TW9kZS5zZXRWbVBvbGljeShuZXcgU3RyaWN0TW9kZS5WbVBvbGljeS5CdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAuZGV0ZWN0VW50YWdnZWRTb2NrZXRzKCkKLSAgICAgICAgICAgICAgICAucGVuYWx0eUxvZygpCi0gICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICBTdHJpY3RNb2RlLnNldFZtUG9saWN5KAorICAgICAgICAgICAgICAgIG5ldyBTdHJpY3RNb2RlLlZtUG9saWN5LkJ1aWxkZXIoKS5kZXRlY3RVbnRhZ2dlZFNvY2tldHMoKS5wZW5hbHR5TG9nKCkuYnVpbGQoKSk7CiAKLSAgICAgICAgYXNzZXJ0VmlvbGF0aW9uKCJVbnRhZ2dlZCBzb2NrZXQgZGV0ZWN0ZWQiLCAoKSAtPiB7Ci0gICAgICAgICAgICAoKEh0dHBVUkxDb25uZWN0aW9uKSBuZXcgVVJMKCJodHRwOi8vZXhhbXBsZS5jb20vIikub3BlbkNvbm5lY3Rpb24oKSkKLSAgICAgICAgICAgICAgICAgICAgLmdldFJlc3BvbnNlQ29kZSgpOwotICAgICAgICB9KTsKKyAgICAgICAgaW5zcGVjdFZpb2xhdGlvbigKKyAgICAgICAgICAgICAgICAoKSAtPgorICAgICAgICAgICAgICAgICAgICAgICAgKChIdHRwVVJMQ29ubmVjdGlvbikgbmV3IFVSTCgiaHR0cDovL2V4YW1wbGUuY29tLyIpLm9wZW5Db25uZWN0aW9uKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRSZXNwb25zZUNvZGUoKSwKKyAgICAgICAgICAgICAgICB2aW9sYXRpb24gLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFRoYXQodmlvbGF0aW9uLmdldFN0YWNrVHJhY2UoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbnRhaW5zKFVudGFnZ2VkU29ja2V0VmlvbGF0aW9uLk1FU1NBR0UpKTsKIAotICAgICAgICBhc3NlcnROb1Zpb2xhdGlvbigoKSAtPiB7Ci0gICAgICAgICAgICBUcmFmZmljU3RhdHMuc2V0VGhyZWFkU3RhdHNUYWcoMHhERUNBRkJBRCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICgoSHR0cFVSTENvbm5lY3Rpb24pIG5ldyBVUkwoImh0dHA6Ly9leGFtcGxlLmNvbS8iKS5vcGVuQ29ubmVjdGlvbigpKQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFJlc3BvbnNlQ29kZSgpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBUcmFmZmljU3RhdHMuY2xlYXJUaHJlYWRTdGF0c1RhZygpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKKyAgICAgICAgYXNzZXJ0Tm9WaW9sYXRpb24oCisgICAgICAgICAgICAgICAgKCkgLT4geworICAgICAgICAgICAgICAgICAgICBUcmFmZmljU3RhdHMuc2V0VGhyZWFkU3RhdHNUYWcoMHhERUNBRkJBRCk7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAoKEh0dHBVUkxDb25uZWN0aW9uKSBuZXcgVVJMKCJodHRwOi8vZXhhbXBsZS5jb20vIikub3BlbkNvbm5lY3Rpb24oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFJlc3BvbnNlQ29kZSgpOworICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgVHJhZmZpY1N0YXRzLmNsZWFyVGhyZWFkU3RhdHNUYWcoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOwogICAgIH0KIAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFVudGFnZ2VkU29ja2V0c1JhdygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBpZiAoIWhhc0ludGVybmV0Q29ubmVjdGlvbigpKSB7CiAgICAgICAgICAgICBMb2cuaShUQUcsICJ0ZXN0VW50YWdnZWRTb2NrZXRzKCkgaWdub3JlZCBvbiBkZXZpY2Ugd2l0aG91dCBJbnRlcm5ldCIpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgU3RyaWN0TW9kZS5zZXRWbVBvbGljeShuZXcgU3RyaWN0TW9kZS5WbVBvbGljeS5CdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAuZGV0ZWN0VW50YWdnZWRTb2NrZXRzKCkKLSAgICAgICAgICAgICAgICAucGVuYWx0eUxvZygpCi0gICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICBTdHJpY3RNb2RlLnNldFZtUG9saWN5KAorICAgICAgICAgICAgICAgIG5ldyBTdHJpY3RNb2RlLlZtUG9saWN5LkJ1aWxkZXIoKS5kZXRlY3RVbnRhZ2dlZFNvY2tldHMoKS5wZW5hbHR5TG9nKCkuYnVpbGQoKSk7CiAKLSAgICAgICAgYXNzZXJ0Tm9WaW9sYXRpb24oKCkgLT4gewotICAgICAgICAgICAgVHJhZmZpY1N0YXRzLnNldFRocmVhZFN0YXRzVGFnKDB4REVDQUZCQUQpOwotICAgICAgICAgICAgdHJ5IChTb2NrZXQgc29ja2V0ID0gbmV3IFNvY2tldCgiZXhhbXBsZS5jb20iLCA4MCkpIHsKLSAgICAgICAgICAgICAgICBzb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCkuY2xvc2UoKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgVHJhZmZpY1N0YXRzLmNsZWFyVGhyZWFkU3RhdHNUYWcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7CisgICAgICAgIGFzc2VydE5vVmlvbGF0aW9uKAorICAgICAgICAgICAgICAgICgpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgVHJhZmZpY1N0YXRzLnNldFRocmVhZFN0YXRzVGFnKDB4REVDQUZCQUQpOworICAgICAgICAgICAgICAgICAgICB0cnkgKFNvY2tldCBzb2NrZXQgPSBuZXcgU29ja2V0KCJleGFtcGxlLmNvbSIsIDgwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0LmdldE91dHB1dFN0cmVhbSgpLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgICAgICBUcmFmZmljU3RhdHMuY2xlYXJUaHJlYWRTdGF0c1RhZygpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CiAKLSAgICAgICAgYXNzZXJ0VmlvbGF0aW9uKCJVbnRhZ2dlZCBzb2NrZXQgZGV0ZWN0ZWQiLCAoKSAtPiB7Ci0gICAgICAgICAgICB0cnkgKFNvY2tldCBzb2NrZXQgPSBuZXcgU29ja2V0KCJleGFtcGxlLmNvbSIsIDgwKSkgewotICAgICAgICAgICAgICAgIHNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKS5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKKyAgICAgICAgaW5zcGVjdFZpb2xhdGlvbigKKyAgICAgICAgICAgICAgICAoKSAtPiB7CisgICAgICAgICAgICAgICAgICAgIHRyeSAoU29ja2V0IHNvY2tldCA9IG5ldyBTb2NrZXQoImV4YW1wbGUuY29tIiwgODApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCkuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgdmlvbGF0aW9uIC0+CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRUaGF0KHZpb2xhdGlvbi5nZXRTdGFja1RyYWNlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb250YWlucyhVbnRhZ2dlZFNvY2tldFZpb2xhdGlvbi5NRVNTQUdFKSk7CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBFUk1JU1NJT05fVVNFUl9PTkxZID0gMDYwMDsKKworICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFJlYWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgRmlsZSB0ZXN0ID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiZm9vIiwgImJhciIpOwogICAgICAgICBmaW5hbCBGaWxlIGRpciA9IHRlc3QuZ2V0UGFyZW50RmlsZSgpOwogCiAgICAgICAgIGZpbmFsIEZpbGVJbnB1dFN0cmVhbSBpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0odGVzdCk7Ci0gICAgICAgIGZpbmFsIEZpbGVEZXNjcmlwdG9yIGZkID0gT3Mub3Blbih0ZXN0LmdldEFic29sdXRlUGF0aCgpLCBPc0NvbnN0YW50cy5PX1JET05MWSwgMDYwMCk7CisgICAgICAgIGZpbmFsIEZpbGVEZXNjcmlwdG9yIGZkID0KKyAgICAgICAgICAgICAgICBPcy5vcGVuKHRlc3QuZ2V0QWJzb2x1dGVQYXRoKCksIE9zQ29uc3RhbnRzLk9fUkRPTkxZLCBQRVJNSVNTSU9OX1VTRVJfT05MWSk7CiAKLSAgICAgICAgU3RyaWN0TW9kZS5zZXRUaHJlYWRQb2xpY3kobmV3IFN0cmljdE1vZGUuVGhyZWFkUG9saWN5LkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgIC5kZXRlY3REaXNrUmVhZHMoKQotICAgICAgICAgICAgICAgIC5wZW5hbHR5TG9nKCkKLSAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgICAgIFN0cmljdE1vZGUuc2V0VGhyZWFkUG9saWN5KAorICAgICAgICAgICAgICAgIG5ldyBTdHJpY3RNb2RlLlRocmVhZFBvbGljeS5CdWlsZGVyKCkuZGV0ZWN0RGlza1JlYWRzKCkucGVuYWx0eUxvZygpLmJ1aWxkKCkpOworICAgICAgICBpbnNwZWN0VmlvbGF0aW9uKAorICAgICAgICAgICAgICAgIHRlc3Q6OmV4aXN0cywKKyAgICAgICAgICAgICAgICB2aW9sYXRpb24gLT4geworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUaGF0KHZpb2xhdGlvbi5nZXRWaW9sYXRpb25EZXRhaWxzKCkpLmlzTnVsbCgpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUaGF0KHZpb2xhdGlvbi5nZXRTdGFja1RyYWNlKCkpLmNvbnRhaW5zKCJEaXNrUmVhZFZpb2xhdGlvbiIpOworICAgICAgICAgICAgICAgIH0pOwogCi0gICAgICAgIGFzc2VydFZpb2xhdGlvbigiU3RyaWN0TW9kZURpc2tSZWFkVmlvbGF0aW9uIiwgKCkgLT4gewotICAgICAgICAgICAgdGVzdC5leGlzdHMoKTsKLSAgICAgICAgfSk7Ci0gICAgICAgIGFzc2VydFZpb2xhdGlvbigiU3RyaWN0TW9kZURpc2tSZWFkVmlvbGF0aW9uIiwgKCkgLT4gewotICAgICAgICAgICAgdGVzdC5sZW5ndGgoKTsKLSAgICAgICAgfSk7Ci0gICAgICAgIGFzc2VydFZpb2xhdGlvbigiU3RyaWN0TW9kZURpc2tSZWFkVmlvbGF0aW9uIiwgKCkgLT4gewotICAgICAgICAgICAgZGlyLmxpc3QoKTsKLSAgICAgICAgfSk7Ci0gICAgICAgIGFzc2VydFZpb2xhdGlvbigiU3RyaWN0TW9kZURpc2tSZWFkVmlvbGF0aW9uIiwgKCkgLT4gewotICAgICAgICAgICAgbmV3IEZpbGVJbnB1dFN0cmVhbSh0ZXN0KTsKLSAgICAgICAgfSk7Ci0gICAgICAgIGFzc2VydFZpb2xhdGlvbigiU3RyaWN0TW9kZURpc2tSZWFkVmlvbGF0aW9uIiwgKCkgLT4gewotICAgICAgICAgICAgaXMucmVhZCgpOwotICAgICAgICB9KTsKLSAgICAgICAgYXNzZXJ0VmlvbGF0aW9uKCJTdHJpY3RNb2RlRGlza1JlYWRWaW9sYXRpb24iLCAoKSAtPiB7Ci0gICAgICAgICAgICBPcy5vcGVuKHRlc3QuZ2V0QWJzb2x1dGVQYXRoKCksIE9zQ29uc3RhbnRzLk9fUkRPTkxZLCAwNjAwKTsKLSAgICAgICAgfSk7Ci0gICAgICAgIGFzc2VydFZpb2xhdGlvbigiU3RyaWN0TW9kZURpc2tSZWFkVmlvbGF0aW9uIiwgKCkgLT4gewotICAgICAgICAgICAgT3MucmVhZChmZCwgbmV3IGJ5dGVbMTBdLCAwLCAxKTsKLSAgICAgICAgfSk7CisgICAgICAgIENvbnN1bWVyPFZpb2xhdGlvbkluZm8+IGFzc2VydERpc2tSZWFkUG9saWN5ID0KKyAgICAgICAgICAgICAgICB2aW9sYXRpb24gLT4gYXNzZXJ0UG9saWN5KHZpb2xhdGlvbiwgU3RyaWN0TW9kZS5ERVRFQ1RfRElTS19SRUFEKTsKKyAgICAgICAgaW5zcGVjdFZpb2xhdGlvbih0ZXN0OjpleGlzdHMsIGFzc2VydERpc2tSZWFkUG9saWN5KTsKKyAgICAgICAgaW5zcGVjdFZpb2xhdGlvbih0ZXN0OjpsZW5ndGgsIGFzc2VydERpc2tSZWFkUG9saWN5KTsKKyAgICAgICAgaW5zcGVjdFZpb2xhdGlvbihkaXI6Omxpc3QsIGFzc2VydERpc2tSZWFkUG9saWN5KTsKKyAgICAgICAgaW5zcGVjdFZpb2xhdGlvbihpczo6cmVhZCwgYXNzZXJ0RGlza1JlYWRQb2xpY3kpOworCisgICAgICAgIGluc3BlY3RWaW9sYXRpb24oKCkgLT4gbmV3IEZpbGVJbnB1dFN0cmVhbSh0ZXN0KSwgYXNzZXJ0RGlza1JlYWRQb2xpY3kpOworICAgICAgICBpbnNwZWN0VmlvbGF0aW9uKAorICAgICAgICAgICAgICAgICgpIC0+IE9zLm9wZW4odGVzdC5nZXRBYnNvbHV0ZVBhdGgoKSwgT3NDb25zdGFudHMuT19SRE9OTFksIFBFUk1JU1NJT05fVVNFUl9PTkxZKSwKKyAgICAgICAgICAgICAgICBhc3NlcnREaXNrUmVhZFBvbGljeSk7CisgICAgICAgIGluc3BlY3RWaW9sYXRpb24oKCkgLT4gT3MucmVhZChmZCwgbmV3IGJ5dGVbMTBdLCAwLCAxKSwgYXNzZXJ0RGlza1JlYWRQb2xpY3kpOwogICAgIH0KIAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFdyaXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEZpbGUgZmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoImZvbyIsICJiYXIiKTsKIAogICAgICAgICBmaW5hbCBGaWxlT3V0cHV0U3RyZWFtIG9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSk7Ci0gICAgICAgIGZpbmFsIEZpbGVEZXNjcmlwdG9yIGZkID0gT3Mub3BlbihmaWxlLmdldEFic29sdXRlUGF0aCgpLCBPc0NvbnN0YW50cy5PX1JEV1IsIDA2MDApOworICAgICAgICBmaW5hbCBGaWxlRGVzY3JpcHRvciBmZCA9CisgICAgICAgICAgICAgICAgT3Mub3BlbihmaWxlLmdldEFic29sdXRlUGF0aCgpLCBPc0NvbnN0YW50cy5PX1JEV1IsIFBFUk1JU1NJT05fVVNFUl9PTkxZKTsKIAotICAgICAgICBTdHJpY3RNb2RlLnNldFRocmVhZFBvbGljeShuZXcgU3RyaWN0TW9kZS5UaHJlYWRQb2xpY3kuQnVpbGRlcigpCi0gICAgICAgICAgICAgICAgLmRldGVjdERpc2tXcml0ZXMoKQotICAgICAgICAgICAgICAgIC5wZW5hbHR5TG9nKCkKLSAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgICAgIFN0cmljdE1vZGUuc2V0VGhyZWFkUG9saWN5KAorICAgICAgICAgICAgICAgIG5ldyBTdHJpY3RNb2RlLlRocmVhZFBvbGljeS5CdWlsZGVyKCkuZGV0ZWN0RGlza1dyaXRlcygpLnBlbmFsdHlMb2coKS5idWlsZCgpKTsKIAotICAgICAgICBhc3NlcnRWaW9sYXRpb24oIlN0cmljdE1vZGVEaXNrV3JpdGVWaW9sYXRpb24iLCAoKSAtPiB7Ci0gICAgICAgICAgICBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJmb28iLCAiYmFyIik7Ci0gICAgICAgIH0pOwotICAgICAgICBhc3NlcnRWaW9sYXRpb24oIlN0cmljdE1vZGVEaXNrV3JpdGVWaW9sYXRpb24iLCAoKSAtPiB7Ci0gICAgICAgICAgICBmaWxlLmRlbGV0ZSgpOwotICAgICAgICB9KTsKLSAgICAgICAgYXNzZXJ0VmlvbGF0aW9uKCJTdHJpY3RNb2RlRGlza1dyaXRlVmlvbGF0aW9uIiwgKCkgLT4gewotICAgICAgICAgICAgZmlsZS5jcmVhdGVOZXdGaWxlKCk7Ci0gICAgICAgIH0pOwotICAgICAgICBhc3NlcnRWaW9sYXRpb24oIlN0cmljdE1vZGVEaXNrV3JpdGVWaW9sYXRpb24iLCAoKSAtPiB7Ci0gICAgICAgICAgICBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKTsKLSAgICAgICAgfSk7Ci0gICAgICAgIGFzc2VydFZpb2xhdGlvbigiU3RyaWN0TW9kZURpc2tXcml0ZVZpb2xhdGlvbiIsICgpIC0+IHsKLSAgICAgICAgICAgIG9zLndyaXRlKDMyKTsKLSAgICAgICAgfSk7Ci0gICAgICAgIGFzc2VydFZpb2xhdGlvbigiU3RyaWN0TW9kZURpc2tXcml0ZVZpb2xhdGlvbiIsICgpIC0+IHsKLSAgICAgICAgICAgIE9zLm9wZW4oZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgT3NDb25zdGFudHMuT19SRFdSLCAwNjAwKTsKLSAgICAgICAgfSk7Ci0gICAgICAgIGFzc2VydFZpb2xhdGlvbigiU3RyaWN0TW9kZURpc2tXcml0ZVZpb2xhdGlvbiIsICgpIC0+IHsKLSAgICAgICAgICAgIE9zLndyaXRlKGZkLCBuZXcgYnl0ZVsxMF0sIDAsIDEpOwotICAgICAgICB9KTsKLSAgICAgICAgYXNzZXJ0VmlvbGF0aW9uKCJTdHJpY3RNb2RlRGlza1dyaXRlVmlvbGF0aW9uIiwgKCkgLT4gewotICAgICAgICAgICAgT3MuZnN5bmMoZmQpOwotICAgICAgICB9KTsKLSAgICAgICAgYXNzZXJ0VmlvbGF0aW9uKCJTdHJpY3RNb2RlRGlza1dyaXRlVmlvbGF0aW9uIiwgKCkgLT4gewotICAgICAgICAgICAgZmlsZS5yZW5hbWVUbyhuZXcgRmlsZShmaWxlLmdldFBhcmVudCgpLCAiZm9vYmFyIikpOwotICAgICAgICB9KTsKKyAgICAgICAgaW5zcGVjdFZpb2xhdGlvbigKKyAgICAgICAgICAgICAgICBmaWxlOjpjcmVhdGVOZXdGaWxlLAorICAgICAgICAgICAgICAgIHZpb2xhdGlvbiAtPiB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRoYXQodmlvbGF0aW9uLmdldFZpb2xhdGlvbkRldGFpbHMoKSkuaXNOdWxsKCk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRoYXQodmlvbGF0aW9uLmdldFN0YWNrVHJhY2UoKSkuY29udGFpbnMoIkRpc2tXcml0ZVZpb2xhdGlvbiIpOworICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgIENvbnN1bWVyPFZpb2xhdGlvbkluZm8+IGFzc2VydERpc2tXcml0ZVBvbGljeSA9CisgICAgICAgICAgICAgICAgdmlvbGF0aW9uIC0+IGFzc2VydFBvbGljeSh2aW9sYXRpb24sIFN0cmljdE1vZGUuREVURUNUX0RJU0tfV1JJVEUpOworCisgICAgICAgIGluc3BlY3RWaW9sYXRpb24oKCkgLT4gRmlsZS5jcmVhdGVUZW1wRmlsZSgiZm9vIiwgImJhciIpLCBhc3NlcnREaXNrV3JpdGVQb2xpY3kpOworICAgICAgICBpbnNwZWN0VmlvbGF0aW9uKCgpIC0+IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpLCBhc3NlcnREaXNrV3JpdGVQb2xpY3kpOworICAgICAgICBpbnNwZWN0VmlvbGF0aW9uKGZpbGU6OmRlbGV0ZSwgYXNzZXJ0RGlza1dyaXRlUG9saWN5KTsKKyAgICAgICAgaW5zcGVjdFZpb2xhdGlvbihmaWxlOjpjcmVhdGVOZXdGaWxlLCBhc3NlcnREaXNrV3JpdGVQb2xpY3kpOworICAgICAgICBpbnNwZWN0VmlvbGF0aW9uKCgpIC0+IG9zLndyaXRlKDMyKSwgYXNzZXJ0RGlza1dyaXRlUG9saWN5KTsKKworICAgICAgICBpbnNwZWN0VmlvbGF0aW9uKAorICAgICAgICAgICAgICAgICgpIC0+IE9zLm9wZW4oZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgT3NDb25zdGFudHMuT19SRFdSLCBQRVJNSVNTSU9OX1VTRVJfT05MWSksCisgICAgICAgICAgICAgICAgYXNzZXJ0RGlza1dyaXRlUG9saWN5KTsKKyAgICAgICAgaW5zcGVjdFZpb2xhdGlvbigoKSAtPiBPcy53cml0ZShmZCwgbmV3IGJ5dGVbMTBdLCAwLCAxKSwgYXNzZXJ0RGlza1dyaXRlUG9saWN5KTsKKyAgICAgICAgaW5zcGVjdFZpb2xhdGlvbigoKSAtPiBPcy5mc3luYyhmZCksIGFzc2VydERpc2tXcml0ZVBvbGljeSk7CisgICAgICAgIGluc3BlY3RWaW9sYXRpb24oCisgICAgICAgICAgICAgICAgKCkgLT4gZmlsZS5yZW5hbWVUbyhuZXcgRmlsZShmaWxlLmdldFBhcmVudCgpLCAiZm9vYmFyIikpLCBhc3NlcnREaXNrV3JpdGVQb2xpY3kpOwogICAgIH0KIAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE5ldHdvcmsoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFoYXNJbnRlcm5ldENvbm5lY3Rpb24oKSkgewogICAgICAgICAgICAgTG9nLmkoVEFHLCAidGVzdFVudGFnZ2VkU29ja2V0cygpIGlnbm9yZWQgb24gZGV2aWNlIHdpdGhvdXQgSW50ZXJuZXQiKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIFN0cmljdE1vZGUuc2V0VGhyZWFkUG9saWN5KG5ldyBTdHJpY3RNb2RlLlRocmVhZFBvbGljeS5CdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAuZGV0ZWN0TmV0d29yaygpCi0gICAgICAgICAgICAgICAgLnBlbmFsdHlMb2coKQotICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgU3RyaWN0TW9kZS5zZXRUaHJlYWRQb2xpY3koCisgICAgICAgICAgICAgICAgbmV3IFN0cmljdE1vZGUuVGhyZWFkUG9saWN5LkJ1aWxkZXIoKS5kZXRlY3ROZXR3b3JrKCkucGVuYWx0eUxvZygpLmJ1aWxkKCkpOwogCi0gICAgICAgIGFzc2VydFZpb2xhdGlvbigiU3RyaWN0TW9kZU5ldHdvcmtWaW9sYXRpb24iLCAoKSAtPiB7Ci0gICAgICAgICAgICB0cnkgKFNvY2tldCBzb2NrZXQgPSBuZXcgU29ja2V0KCJleGFtcGxlLmNvbSIsIDgwKSkgewotICAgICAgICAgICAgICAgIHNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKS5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBhc3NlcnRWaW9sYXRpb24oIlN0cmljdE1vZGVOZXR3b3JrVmlvbGF0aW9uIiwgKCkgLT4gewotICAgICAgICAgICAgKChIdHRwVVJMQ29ubmVjdGlvbikgbmV3IFVSTCgiaHR0cDovL2V4YW1wbGUuY29tLyIpLm9wZW5Db25uZWN0aW9uKCkpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRSZXNwb25zZUNvZGUoKTsKLSAgICAgICAgfSk7CisgICAgICAgIGluc3BlY3RWaW9sYXRpb24oCisgICAgICAgICAgICAgICAgKCkgLT4geworICAgICAgICAgICAgICAgICAgICB0cnkgKFNvY2tldCBzb2NrZXQgPSBuZXcgU29ja2V0KCJleGFtcGxlLmNvbSIsIDgwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0LmdldE91dHB1dFN0cmVhbSgpLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHZpb2xhdGlvbiAtPiBhc3NlcnRQb2xpY3kodmlvbGF0aW9uLCBTdHJpY3RNb2RlLkRFVEVDVF9ORVRXT1JLKSk7CisgICAgICAgIGluc3BlY3RWaW9sYXRpb24oCisgICAgICAgICAgICAgICAgKCkgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICgoSHR0cFVSTENvbm5lY3Rpb24pIG5ldyBVUkwoImh0dHA6Ly9leGFtcGxlLmNvbS8iKS5vcGVuQ29ubmVjdGlvbigpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UmVzcG9uc2VDb2RlKCksCisgICAgICAgICAgICAgICAgdmlvbGF0aW9uIC0+IGFzc2VydFBvbGljeSh2aW9sYXRpb24sIFN0cmljdE1vZGUuREVURUNUX05FVFdPUkspKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydFZpb2xhdGlvbihTdHJpbmcgZXhwZWN0ZWQsIFRocm93aW5nUnVubmFibGUgcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIExpbmtlZEJsb2NraW5nUXVldWU8U3RyaW5nPiB2aW9sYXRpb25zID0gbmV3IExpbmtlZEJsb2NraW5nUXVldWU8PigpOwotICAgICAgICBTdHJpY3RNb2RlLnNldFZpb2xhdGlvbkxpc3RlbmVyKG5ldyBWaW9sYXRpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25WaW9sYXRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgICAgICAgICB2aW9sYXRpb25zLmFkZChtZXNzYWdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmlvbGF0aW9uQWNyb3NzQmluZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJ1bldpdGhSZW1vdGVTZXJ2aWNlQm91bmQoCisgICAgICAgICAgICAgICAgZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgIHNlcnZpY2UgLT4geworICAgICAgICAgICAgICAgICAgICBTdHJpY3RNb2RlLnNldFRocmVhZFBvbGljeSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnVpbGRlcigpLmRldGVjdERpc2tXcml0ZXMoKS5wZW5hbHR5TG9nKCkuYnVpbGQoKSk7CiAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHIucnVuKCk7Ci0gICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2aW9sYXRpb24gPSB2aW9sYXRpb25zLnBvbGwoNSwgVGltZVVuaXQuU0VDT05EUyk7Ci0gICAgICAgICAgICAgICAgaWYgKHZpb2xhdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIHZpb2xhdGlvbiBub3QgZm91bmQ6ICIgKyBleHBlY3RlZCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2aW9sYXRpb24uY29udGFpbnMoZXhwZWN0ZWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluc3BlY3RWaW9sYXRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpIC0+IHNlcnZpY2UucGVyZm9ybURpc2tXcml0ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmlvbGF0aW9uKSAtPiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRQb2xpY3kodmlvbGF0aW9uLCBTdHJpY3RNb2RlLkRFVEVDVF9ESVNLX1dSSVRFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFRoYXQodmlvbGF0aW9uLmdldFZpb2xhdGlvbkRldGFpbHMoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmlzTnVsbCgpOyAvLyBEaXNrIHdyaXRlIGhhcyBubyBtZXNzYWdlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VGhhdCh2aW9sYXRpb24uZ2V0U3RhY2tUcmFjZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29udGFpbnMoIkRpc2tXcml0ZVZpb2xhdGlvbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VGhhdCh2aW9sYXRpb24uZ2V0U3RhY2tUcmFjZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29udGFpbnMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF0IGFuZHJvaWQub3MuU3RyaWN0TW9kZSRBbmRyb2lkQmxvY2tHdWFyZFBvbGljeS5vbldyaXRlVG9EaXNrIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRUaGF0KHZpb2xhdGlvbi5nZXRTdGFja1RyYWNlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb250YWlucygiIyB2aWEgQmluZGVyIGNhbGwgd2l0aCBzdGFjazoiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFRoYXQodmlvbGF0aW9uLmdldFN0YWNrVHJhY2UoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbnRhaW5zKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdCBhbmRyb2lkLm9zLmN0cy5JU2Vjb25kYXJ5JFN0dWIkUHJveHkucGVyZm9ybURpc2tXcml0ZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydE5vVmlvbGF0aW9uKCgpIC0+IHNlcnZpY2UuZ2V0UGlkKCkpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tOb25TZGtBcGlVc2FnZVZpb2xhdGlvbihib29sZWFuIGJsYWNrbGlzdCwgU3RyaW5nIGNsYXNzTmFtZSwKKyAgICAgICAgICAgIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/Pi4uLiBwYXJhbVR5cGVzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQ2xhc3M8Pz4gY2xhenogPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7CisgICAgICAgIGluc3BlY3RWaW9sYXRpb24oCisgICAgICAgICAgICAoKSAtPiB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIG0gPSBjbGF6ei5nZXREZWNsYXJlZE1ldGhvZChtZXRob2ROYW1lLCBwYXJhbVR5cGVzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJsYWNrbGlzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgICAgICAgICAgICBpZiAoIWJsYWNrbGlzdCkgeworICAgICAgICAgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHZpb2xhdGlvbiAtPiB7CisgICAgICAgICAgICAgICAgYXNzZXJ0VGhhdCh2aW9sYXRpb24pLmlzTm90TnVsbCgpOworICAgICAgICAgICAgICAgIGFzc2VydFBvbGljeSh2aW9sYXRpb24sIFN0cmljdE1vZGUuREVURUNUX1ZNX05PTl9TREtfQVBJX1VTQUdFKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUaGF0KHZpb2xhdGlvbi5nZXRWaW9sYXRpb25EZXRhaWxzKCkpLmNvbnRhaW5zKG1ldGhvZE5hbWUpOworICAgICAgICAgICAgICAgIGFzc2VydFRoYXQodmlvbGF0aW9uLmdldFN0YWNrVHJhY2UoKSkuY29udGFpbnMoImNoZWNrTm9uU2RrQXBpVXNhZ2VWaW9sYXRpb24iKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb25TZGtBcGlVc2FnZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpY3RNb2RlLlZtUG9saWN5IG9sZFZtUG9saWN5ID0gU3RyaWN0TW9kZS5nZXRWbVBvbGljeSgpOworICAgICAgICBTdHJpY3RNb2RlLlRocmVhZFBvbGljeSBvbGRUaHJlYWRQb2xpY3kgPSBTdHJpY3RNb2RlLmdldFRocmVhZFBvbGljeSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RyaWN0TW9kZS5zZXRWbVBvbGljeSgKKyAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmljdE1vZGUuVm1Qb2xpY3kuQnVpbGRlcigpLmRldGVjdE5vblNka0FwaVVzYWdlKCkuYnVpbGQoKSk7CisgICAgICAgICAgICBjaGVja05vblNka0FwaVVzYWdlVmlvbGF0aW9uKAorICAgICAgICAgICAgICAgIHRydWUsICJkYWx2aWsuc3lzdGVtLlZNUnVudGltZSIsICJzZXRIaWRkZW5BcGlFeGVtcHRpb25zIiwgU3RyaW5nW10uY2xhc3MpOworICAgICAgICAgICAgLy8gdmVyaWZ5IHRoYXQgbXV0bGlwbGUgdXNlcyBvZiBhIGxpZ2h0IGdyZXlsaXN0IEFQSSBhcmUgZGV0ZWN0ZWQuCisgICAgICAgICAgICBjaGVja05vblNka0FwaVVzYWdlVmlvbGF0aW9uKGZhbHNlLCAiZGFsdmlrLnN5c3RlbS5WTVJ1bnRpbWUiLCAiZ2V0UnVudGltZSIpOworICAgICAgICAgICAgY2hlY2tOb25TZGtBcGlVc2FnZVZpb2xhdGlvbihmYWxzZSwgImRhbHZpay5zeXN0ZW0uVk1SdW50aW1lIiwgImdldFJ1bnRpbWUiKTsKKworICAgICAgICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIFZNIHBvbGljeSBpcyB0dXJuZWQgb2ZmIGFmdGVyIGEgY2FsbCB0byBwZXJtaXROb25TZGtBcGlVc2FnZS4KKyAgICAgICAgICAgIFN0cmljdE1vZGUuc2V0Vm1Qb2xpY3koCisgICAgICAgICAgICAgICAgbmV3IFN0cmljdE1vZGUuVm1Qb2xpY3kuQnVpbGRlcigpLnBlcm1pdE5vblNka0FwaVVzYWdlKCkuYnVpbGQoKSk7CisgICAgICAgICAgICBhc3NlcnROb1Zpb2xhdGlvbigoKSAtPiB7CisgICAgICAgICAgICAgICAgICBDbGFzczw/PiBjbGF6eiA9IENsYXNzLmZvck5hbWUoImRhbHZpay5zeXN0ZW0uVk1SdW50aW1lIik7CisgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgIGNsYXp6LmdldERlY2xhcmVkTWV0aG9kKCJnZXRSdW50aW1lIik7CisgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gbWF5YmUpIHsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOwogICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgU3RyaWN0TW9kZS5zZXRWaW9sYXRpb25MaXN0ZW5lcihudWxsKTsKKyAgICAgICAgICAgIFN0cmljdE1vZGUuc2V0Vm1Qb2xpY3kob2xkVm1Qb2xpY3kpOworICAgICAgICAgICAgU3RyaWN0TW9kZS5zZXRUaHJlYWRQb2xpY3kob2xkVGhyZWFkUG9saWN5KTsKICAgICAgICAgfQogICAgIH0KIAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRocmVhZFBlbmFsdHlMaXN0ZW5lcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBCbG9ja2luZ1F1ZXVlPFZpb2xhdGlvbj4gdmlvbGF0aW9ucyA9IG5ldyBBcnJheUJsb2NraW5nUXVldWU8PigxKTsKKyAgICAgICAgU3RyaWN0TW9kZS5zZXRUaHJlYWRQb2xpY3koCisgICAgICAgICAgICAgICAgbmV3IFN0cmljdE1vZGUuVGhyZWFkUG9saWN5LkJ1aWxkZXIoKS5kZXRlY3RDdXN0b21TbG93Q2FsbHMoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnBlbmFsdHlMaXN0ZW5lcihnZXRDb250ZXh0KCkuZ2V0TWFpbkV4ZWN1dG9yKCksICh2KSAtPiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5hZGQodik7CisgICAgICAgICAgICAgICAgICAgICAgICB9KS5idWlsZCgpKTsKKworICAgICAgICBTdHJpY3RNb2RlLm5vdGVTbG93Q2FsbCgiZm9vIik7CisKKyAgICAgICAgZmluYWwgVmlvbGF0aW9uIHYgPSB2aW9sYXRpb25zLnBvbGwoNSwgVGltZVVuaXQuU0VDT05EUyk7CisgICAgICAgIGFzc2VydFRydWUodiBpbnN0YW5jZW9mIEN1c3RvbVZpb2xhdGlvbik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Vm1QZW5hbHR5TGlzdGVuZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQmxvY2tpbmdRdWV1ZTxWaW9sYXRpb24+IHZpb2xhdGlvbnMgPSBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPD4oMSk7CisgICAgICAgIFN0cmljdE1vZGUuc2V0Vm1Qb2xpY3koCisgICAgICAgICAgICAgICAgbmV3IFN0cmljdE1vZGUuVm1Qb2xpY3kuQnVpbGRlcigpLmRldGVjdEZpbGVVcmlFeHBvc3VyZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAucGVuYWx0eUxpc3RlbmVyKGdldENvbnRleHQoKS5nZXRNYWluRXhlY3V0b3IoKSwgKHYpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aW9sYXRpb25zLmFkZCh2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pLmJ1aWxkKCkpOworCisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEludGVudC5BQ1RJT05fVklFVyk7CisgICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7CisgICAgICAgIGludGVudC5zZXREYXRhQW5kVHlwZShVcmkuZnJvbUZpbGUobmV3IEZpbGUoIi9zZGNhcmQvbWVvdy5qcGciKSksICJpbWFnZS9qcGVnIik7CisgICAgICAgIGdldENvbnRleHQoKS5zdGFydEFjdGl2aXR5KGludGVudCk7CisKKyAgICAgICAgZmluYWwgVmlvbGF0aW9uIHYgPSB2aW9sYXRpb25zLnBvbGwoNSwgVGltZVVuaXQuU0VDT05EUyk7CisgICAgICAgIGFzc2VydFRydWUodiBpbnN0YW5jZW9mIEZpbGVVcmlFeHBvc2VkVmlvbGF0aW9uKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJ1bldpdGhSZW1vdGVTZXJ2aWNlQm91bmQoQ29udGV4dCBjb250ZXh0LCBDb25zdW1lcjxJU2Vjb25kYXJ5PiBjb25zdW1lcikKKyAgICAgICAgICAgIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLCBSZW1vdGVFeGNlcHRpb24geworICAgICAgICBCbG9ja2luZ1F1ZXVlPElCaW5kZXI+IGJpbmRlckhvbGRlciA9IG5ldyBBcnJheUJsb2NraW5nUXVldWU8PigxKTsKKyAgICAgICAgU2VydmljZUNvbm5lY3Rpb24gc2Vjb25kYXJ5Q29ubmVjdGlvbiA9CisgICAgICAgICAgICAgICAgbmV3IFNlcnZpY2VDb25uZWN0aW9uKCkgeworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VDb25uZWN0ZWQoQ29tcG9uZW50TmFtZSBjbGFzc05hbWUsIElCaW5kZXIgc2VydmljZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYmluZGVySG9sZGVyLmFkZChzZXJ2aWNlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZURpc2Nvbm5lY3RlZChDb21wb25lbnROYW1lIGNsYXNzTmFtZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYmluZGVySG9sZGVyLmRyYWluVG8obmV3IEFycmF5TGlzdDw+KCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoUkVNT1RFX1NFUlZJQ0VfQUNUSU9OKTsKKyAgICAgICAgaW50ZW50LnNldFBhY2thZ2UoY29udGV4dC5nZXRQYWNrYWdlTmFtZSgpKTsKKworICAgICAgICBJbnRlbnQgc2Vjb25kYXJ5SW50ZW50ID0gbmV3IEludGVudChJU2Vjb25kYXJ5LmNsYXNzLmdldE5hbWUoKSk7CisgICAgICAgIHNlY29uZGFyeUludGVudC5zZXRQYWNrYWdlKGNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoCisgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmJpbmRTZXJ2aWNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRhcnlJbnRlbnQsIHNlY29uZGFyeUNvbm5lY3Rpb24sIENvbnRleHQuQklORF9BVVRPX0NSRUFURSkpCisgICAgICAgICAgICAgICAgLmlzVHJ1ZSgpOworICAgICAgICBJQmluZGVyIGJpbmRlciA9IGJpbmRlckhvbGRlci50YWtlKCk7CisgICAgICAgIGFzc2VydFRoYXQoYmluZGVyLnF1ZXJ5TG9jYWxJbnRlcmZhY2UoYmluZGVyLmdldEludGVyZmFjZURlc2NyaXB0b3IoKSkpLmlzTnVsbCgpOworICAgICAgICBjb25zdW1lci5hY2NlcHQoSVNlY29uZGFyeS5TdHViLmFzSW50ZXJmYWNlKGJpbmRlcikpOworICAgICAgICBjb250ZXh0LnVuYmluZFNlcnZpY2Uoc2Vjb25kYXJ5Q29ubmVjdGlvbik7CisgICAgICAgIGNvbnRleHQuc3RvcFNlcnZpY2UoaW50ZW50KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydFZpb2xhdGlvbihTdHJpbmcgZXhwZWN0ZWQsIFRocm93aW5nUnVubmFibGUgcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGluc3BlY3RWaW9sYXRpb24ociwgdmlvbGF0aW9uIC0+IGFzc2VydFRoYXQodmlvbGF0aW9uLmdldFN0YWNrVHJhY2UoKSkuY29udGFpbnMoZXhwZWN0ZWQpKTsKKyAgICB9CisKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydE5vVmlvbGF0aW9uKFRocm93aW5nUnVubmFibGUgcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIExpbmtlZEJsb2NraW5nUXVldWU8U3RyaW5nPiB2aW9sYXRpb25zID0gbmV3IExpbmtlZEJsb2NraW5nUXVldWU8PigpOwotICAgICAgICBTdHJpY3RNb2RlLnNldFZpb2xhdGlvbkxpc3RlbmVyKG5ldyBWaW9sYXRpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25WaW9sYXRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgICAgICAgICB2aW9sYXRpb25zLmFkZChtZXNzYWdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7CisgICAgICAgIGluc3BlY3RWaW9sYXRpb24oCisgICAgICAgICAgICAgICAgciwgdmlvbGF0aW9uIC0+IGFzc2VydFdpdGhNZXNzYWdlKCJVbmV4cGVjdGVkIHZpb2xhdGlvbiIpLnRoYXQodmlvbGF0aW9uKS5pc051bGwoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFBvbGljeShWaW9sYXRpb25JbmZvIGluZm8sIGludCBwb2xpY3kpIHsKKyAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoIlBvbGljeSBiaXQgaW5jb3JyZWN0IikudGhhdChpbmZvLmdldFZpb2xhdGlvbkJpdCgpKS5pc0VxdWFsVG8ocG9saWN5KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGluc3BlY3RWaW9sYXRpb24oCisgICAgICAgICAgICBUaHJvd2luZ1J1bm5hYmxlIHZpb2xhdGluZywgQ29uc3VtZXI8VmlvbGF0aW9uSW5mbz4gY29uc3VtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIExpbmtlZEJsb2NraW5nUXVldWU8VmlvbGF0aW9uSW5mbz4gdmlvbGF0aW9ucyA9IG5ldyBMaW5rZWRCbG9ja2luZ1F1ZXVlPD4oKTsKKyAgICAgICAgU3RyaWN0TW9kZS5zZXRWaW9sYXRpb25Mb2dnZXIodmlvbGF0aW9uczo6YWRkKTsKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgci5ydW4oKTsKLSAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZpb2xhdGlvbiA9IHZpb2xhdGlvbnMucG9sbCg1LCBUaW1lVW5pdC5TRUNPTkRTKTsKLSAgICAgICAgICAgICAgICBpZiAodmlvbGF0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgdmlvbGF0aW9uIGZvdW5kOiAiICsgdmlvbGF0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICB2aW9sYXRpbmcucnVuKCk7CisgICAgICAgICAgICBjb25zdW1lLmFjY2VwdCh2aW9sYXRpb25zLnBvbGwoNSwgVGltZVVuaXQuU0VDT05EUykpOwogICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgU3RyaWN0TW9kZS5zZXRWaW9sYXRpb25MaXN0ZW5lcihudWxsKTsKKyAgICAgICAgICAgIFN0cmljdE1vZGUuc2V0VmlvbGF0aW9uTG9nZ2VyKG51bGwpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9vcy9zcmMvYW5kcm9pZC9vcy9jdHMvVG9rZW5XYXRjaGVyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvb3Mvc3JjL2FuZHJvaWQvb3MvY3RzL1Rva2VuV2F0Y2hlclRlc3QuamF2YQppbmRleCA3MGU4MzlhLi4zMTJlYTgxIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9vcy9zcmMvYW5kcm9pZC9vcy9jdHMvVG9rZW5XYXRjaGVyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL29zL3NyYy9hbmRyb2lkL29zL2N0cy9Ub2tlbldhdGNoZXJUZXN0LmphdmEKQEAgLTIzLDcgKzIzLDYgQEAKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLlRva2VuV2F0Y2hlcjsKIGltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwpAQCAtMTU5LDYgKzE1OCwzNiBAQAogICAgICAgICBhc3NlcnRUcnVlKHdhaXRVbnRpbFJlbGVhc2VkKCkpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBlYXRlZEFjcXVpcmUoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIElCaW5kZXIgdG9rZW4gPSBtRW1wdHlTZXJ2aWNlLmdldFRva2VuKCk7CisgICAgICAgIG1Nb2NrVG9rZW5XYXRjaGVyID0gbmV3IE1vY2tUb2tlbldhdGNoZXIobUhhbmRsZXIsIFRBRyk7CisgICAgICAgIGFzc2VydEZhbHNlKG1Nb2NrVG9rZW5XYXRjaGVyLmlzQWNxdWlyZWQoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1Nb2NrVG9rZW5XYXRjaGVyLmlzQWNxdWlyZWRDYWxsZWQpOworICAgICAgICBhc3NlcnRGYWxzZShtTW9ja1Rva2VuV2F0Y2hlci5pc1JlbGVhc2VkQ2FsbGVkKTsKKworICAgICAgICAvLyBGaXJzdCB0aW1lCisgICAgICAgIG1Nb2NrVG9rZW5XYXRjaGVyLmFjcXVpcmUodG9rZW4sIFRBRyk7CisgICAgICAgIGFzc2VydFRydWUobU1vY2tUb2tlbldhdGNoZXIuaXNBY3F1aXJlZCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh3YWl0VW50aWxBY3F1aXJlZCgpKTsKKworICAgICAgICAvLyBSZXNldAorICAgICAgICBtTW9ja1Rva2VuV2F0Y2hlci5pc0FjcXVpcmVkQ2FsbGVkID0gZmFsc2U7CisgICAgICAgIG1Nb2NrVG9rZW5XYXRjaGVyLmlzUmVsZWFzZWRDYWxsZWQgPSBmYWxzZTsKKworICAgICAgICAvLyBTZWNvbmQgdGltZSAtLSBzaG91bGQgYmUgYSBuby1vcAorICAgICAgICBtTW9ja1Rva2VuV2F0Y2hlci5hY3F1aXJlKHRva2VuLCBUQUcpOworICAgICAgICBhc3NlcnRUcnVlKG1Nb2NrVG9rZW5XYXRjaGVyLmlzQWNxdWlyZWQoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHdhaXRVbnRpbEFjcXVpcmVkKCkpOworICAgICAgICBhc3NlcnRGYWxzZSh3YWl0VW50aWxSZWxlYXNlZCgpKTsKKworICAgICAgICAvLyBSZWxlYXNlCisgICAgICAgIHN5bmNocm9uaXplZCAobU1vY2tUb2tlbldhdGNoZXIpIHsKKyAgICAgICAgICAgIG1Nb2NrVG9rZW5XYXRjaGVyLnJlbGVhc2UodG9rZW4pOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UobU1vY2tUb2tlbldhdGNoZXIuaXNBY3F1aXJlZCgpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKHdhaXRVbnRpbFJlbGVhc2VkKCkpOworICAgIH0KKwogICAgIHByaXZhdGUgYm9vbGVhbiB3YWl0VW50aWxBY3F1aXJlZCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CiAgICAgICAgIGxvbmcgdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgICAgICB3aGlsZSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lIDwgT1ZFUlRJTUUpIHsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL29zL3NyYy9hbmRyb2lkL29zL2N0cy9WaWJyYXRpb25FZmZlY3RUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9vcy9zcmMvYW5kcm9pZC9vcy9jdHMvVmlicmF0aW9uRWZmZWN0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYmQ3NDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9vcy9zcmMvYW5kcm9pZC9vcy9jdHMvVmlicmF0aW9uRWZmZWN0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMjkwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm9zLmN0czsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3RFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworaW1wb3J0IGFuZHJvaWQub3MuVmlicmF0aW9uRWZmZWN0OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworQFNtYWxsVGVzdAorQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBWaWJyYXRpb25FZmZlY3RUZXN0IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFRFU1RfVElNSU5HID0gMTAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBURVNUX0FNUExJVFVERSA9IDEwMDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBURVNUX1RJTUlOR1MgPSBuZXcgbG9uZ1tdIHsgMTAwLCAxMDAsIDIwMCB9OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIFRFU1RfQU1QTElUVURFUyA9CisgICAgICAgICAgICBuZXcgaW50W10geyAyNTUsIDAsIFZpYnJhdGlvbkVmZmVjdC5ERUZBVUxUX0FNUExJVFVERSB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVmlicmF0aW9uRWZmZWN0IFRFU1RfT05FX1NIT1QgPQorICAgICAgICAgICAgVmlicmF0aW9uRWZmZWN0LmNyZWF0ZU9uZVNob3QoVEVTVF9USU1JTkcsIFRFU1RfQU1QTElUVURFKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBWaWJyYXRpb25FZmZlY3QgVEVTVF9XQVZFRk9STSA9CisgICAgICAgICAgICBWaWJyYXRpb25FZmZlY3QuY3JlYXRlV2F2ZWZvcm0oVEVTVF9USU1JTkdTLCBURVNUX0FNUExJVFVERVMsIC0xKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBWaWJyYXRpb25FZmZlY3QgVEVTVF9XQVZFRk9STV9OT19BTVBMSVRVREVTID0KKyAgICAgICAgICAgIFZpYnJhdGlvbkVmZmVjdC5jcmVhdGVXYXZlZm9ybShURVNUX1RJTUlOR1MsIC0xKTsKKworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlT25lU2hvdCgpIHsKKyAgICAgICAgVmlicmF0aW9uRWZmZWN0LmNyZWF0ZU9uZVNob3QoMTAwLCBWaWJyYXRpb25FZmZlY3QuREVGQVVMVF9BTVBMSVRVREUpOworICAgICAgICBWaWJyYXRpb25FZmZlY3QuY3JlYXRlT25lU2hvdCgxLCAxKTsKKyAgICAgICAgVmlicmF0aW9uRWZmZWN0LmNyZWF0ZU9uZVNob3QoMTAwMCwgMjU1KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVPbmVTaG90RmFpbHNCYWRUaW1pbmcoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBWaWJyYXRpb25FZmZlY3QuY3JlYXRlT25lU2hvdCgwLCBURVNUX0FNUExJVFVERSk7CisgICAgICAgICAgICBmYWlsKCJJbnZhbGlkIHRpbWluZywgc2hvdWxkIHRocm93IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhwZWN0ZWQpIHsgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZU9uZVNob3RGYWlsc0JhZEFtcGxpdHVkZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFZpYnJhdGlvbkVmZmVjdC5jcmVhdGVPbmVTaG90KFRFU1RfVElNSU5HLCAtMik7CisgICAgICAgICAgICBmYWlsKCJJbnZhbGlkIGFtcGxpdHVkZSwgc2hvdWxkIHRocm93IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhwZWN0ZWQpIHsgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBWaWJyYXRpb25FZmZlY3QuY3JlYXRlT25lU2hvdChURVNUX1RJTUlORywgMjU2KTsKKyAgICAgICAgICAgIGZhaWwoIkludmFsaWQgYW1wbGl0dWRlLCBzaG91bGQgdGhyb3cgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleHBlY3RlZCkgeyB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25lU2hvdEVxdWFscygpIHsKKyAgICAgICAgVmlicmF0aW9uRWZmZWN0IG90aGVyRWZmZWN0ID0gVmlicmF0aW9uRWZmZWN0LmNyZWF0ZU9uZVNob3QoVEVTVF9USU1JTkcsIFRFU1RfQU1QTElUVURFKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFRFU1RfT05FX1NIT1QsIG90aGVyRWZmZWN0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFRFU1RfT05FX1NIT1QuaGFzaENvZGUoKSwgb3RoZXJFZmZlY3QuaGFzaENvZGUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25lU2hvdE5vdEVxdWFsc0FtcGxpdHVkZSgpIHsKKyAgICAgICAgVmlicmF0aW9uRWZmZWN0IG90aGVyRWZmZWN0ID0KKyAgICAgICAgICAgICAgICBWaWJyYXRpb25FZmZlY3QuY3JlYXRlT25lU2hvdChURVNUX1RJTUlORywgVEVTVF9BTVBMSVRVREUgLSAxKTsKKyAgICAgICAgYXNzZXJ0Tm90RXF1YWxzKFRFU1RfT05FX1NIT1QsIG90aGVyRWZmZWN0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPbmVTaG90Tm90RXF1YWxzVGltaW5nKCkgeworICAgICAgICBWaWJyYXRpb25FZmZlY3Qgb3RoZXJFZmZlY3QgPQorICAgICAgICAgICAgICAgIFZpYnJhdGlvbkVmZmVjdC5jcmVhdGVPbmVTaG90KFRFU1RfVElNSU5HIC0gMSwgVEVTVF9BTVBMSVRVREUpOworICAgICAgICBhc3NlcnROb3RFcXVhbHMoVEVTVF9PTkVfU0hPVCwgb3RoZXJFZmZlY3QpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9uZVNob3RFcXVhbHNXaXRoRGVmYXVsdEFtcGxpdHVkZSgpIHsKKyAgICAgICAgVmlicmF0aW9uRWZmZWN0IGVmZmVjdCA9CisgICAgICAgICAgICAgICAgVmlicmF0aW9uRWZmZWN0LmNyZWF0ZU9uZVNob3QoVEVTVF9USU1JTkcsIFZpYnJhdGlvbkVmZmVjdC5ERUZBVUxUX0FNUExJVFVERSk7CisgICAgICAgIFZpYnJhdGlvbkVmZmVjdCBvdGhlckVmZmVjdCA9CisgICAgICAgICAgICAgICAgVmlicmF0aW9uRWZmZWN0LmNyZWF0ZU9uZVNob3QoVEVTVF9USU1JTkcsIFZpYnJhdGlvbkVmZmVjdC5ERUZBVUxUX0FNUExJVFVERSk7CisgICAgICAgIGFzc2VydEVxdWFscyhlZmZlY3QsIG90aGVyRWZmZWN0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGVmZmVjdC5oYXNoQ29kZSgpLCBvdGhlckVmZmVjdC5oYXNoQ29kZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVXYXZlZm9ybSgpIHsKKyAgICAgICAgVmlicmF0aW9uRWZmZWN0LmNyZWF0ZVdhdmVmb3JtKFRFU1RfVElNSU5HUywgVEVTVF9BTVBMSVRVREVTLCAtMSk7CisgICAgICAgIFZpYnJhdGlvbkVmZmVjdC5jcmVhdGVXYXZlZm9ybShURVNUX1RJTUlOR1MsIFRFU1RfQU1QTElUVURFUywgMCk7CisgICAgICAgIFZpYnJhdGlvbkVmZmVjdC5jcmVhdGVXYXZlZm9ybShURVNUX1RJTUlOR1MsIFRFU1RfQU1QTElUVURFUywgVEVTVF9BTVBMSVRVREVTLmxlbmd0aCAtIDEpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVdhdmVmb3JtRmFpbHNEaWZmZXJlbnRBcnJheVNpemUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBWaWJyYXRpb25FZmZlY3QuY3JlYXRlV2F2ZWZvcm0oCisgICAgICAgICAgICAgICAgICAgIEFycmF5cy5jb3B5T2ZSYW5nZShURVNUX1RJTUlOR1MsIDAsIFRFU1RfVElNSU5HUy5sZW5ndGggLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgVEVTVF9BTVBMSVRVREVTLCAtMSk7CisgICAgICAgICAgICBmYWlsKCJUaW1pbmcgYW5kIGFtcGxpdHVkZXMgYXJyYXlzIGFyZSBkaWZmZXJlbnQgc2l6ZXMsICIgKworICAgICAgICAgICAgICAgICAgICAic2hvdWxkIHRocm93IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhwZWN0ZWQpIHsgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBWaWJyYXRpb25FZmZlY3QuY3JlYXRlV2F2ZWZvcm0oCisgICAgICAgICAgICAgICAgICAgIFRFU1RfVElNSU5HUywKKyAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmNvcHlPZlJhbmdlKFRFU1RfQU1QTElUVURFUywgMCwgVEVTVF9BTVBMSVRVREVTLmxlbmd0aCAtIDEpLCAtMSk7CisgICAgICAgICAgICBmYWlsKCJUaW1pbmcgYW5kIGFtcGxpdHVkZXMgYXJyYXlzIGFyZSBkaWZmZXJlbnQgc2l6ZXMsICIgKworICAgICAgICAgICAgICAgICAgICAic2hvdWxkIHRocm93IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhwZWN0ZWQpIHsgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVdhdmVmb3JtRmFpbHNSZXBlYXRJbmRleE91dE9mQm91bmRzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgVmlicmF0aW9uRWZmZWN0LmNyZWF0ZVdhdmVmb3JtKFRFU1RfVElNSU5HUywgVEVTVF9BTVBMSVRVREVTLCAtMik7CisgICAgICAgICAgICBmYWlsKCJSZXBlYXQgaW5kZXggaXMgPCAtMSwgc2hvdWxkIHRocm93IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhwZWN0ZWQpIHsgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBWaWJyYXRpb25FZmZlY3QuY3JlYXRlV2F2ZWZvcm0oVEVTVF9USU1JTkdTLCBURVNUX0FNUExJVFVERVMsIFRFU1RfQU1QTElUVURFUy5sZW5ndGgpOworICAgICAgICAgICAgZmFpbCgiUmVwZWF0IGluZGV4IGlzID49IGFycmF5IGxlbmd0aCwgc2hvdWxkIHRocm93IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhwZWN0ZWQpIHsgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVdhdmVmb3JtRmFpbHNCYWRUaW1pbmdWYWx1ZXMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBsb25nW10gYmFkVGltaW5ncyA9IEFycmF5cy5jb3B5T2YoVEVTVF9USU1JTkdTLCBURVNUX1RJTUlOR1MubGVuZ3RoKTsKKyAgICAgICAgICAgIGJhZFRpbWluZ3NbMV0gPSAtMTsKKyAgICAgICAgICAgIFZpYnJhdGlvbkVmZmVjdC5jcmVhdGVXYXZlZm9ybShiYWRUaW1pbmdzLFRFU1RfQU1QTElUVURFUywgLTEpOworICAgICAgICAgICAgZmFpbCgiSGFzIGEgdGltaW5nIDwgMCwgc2hvdWxkIHRocm93IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhwZWN0ZWQpIHsgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBsb25nW10gYmFkVGltaW5ncyA9IG5ldyBsb25nW1RFU1RfVElNSU5HUy5sZW5ndGhdOworICAgICAgICAgICAgVmlicmF0aW9uRWZmZWN0LmNyZWF0ZVdhdmVmb3JtKGJhZFRpbWluZ3MsIFRFU1RfQU1QTElUVURFUywgLTEpOworICAgICAgICAgICAgZmFpbCgiSGFzIG5vIG5vbi16ZXJvIHRpbWluZ3MsIHNob3VsZCB0aHJvdyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4cGVjdGVkKSB7IH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVXYXZlZm9ybUZhaWxzQmFkQW1wbGl0dWRlVmFsdWVzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgaW50W10gYmFkQW1wbGl0dWRlcyA9IG5ldyBpbnRbVEVTVF9USU1JTkdTLmxlbmd0aF07CisgICAgICAgICAgICBiYWRBbXBsaXR1ZGVzWzFdID0gLTI7CisgICAgICAgICAgICBWaWJyYXRpb25FZmZlY3QuY3JlYXRlV2F2ZWZvcm0oVEVTVF9USU1JTkdTLCBiYWRBbXBsaXR1ZGVzLCAtMSk7CisgICAgICAgICAgICBmYWlsKCJIYXMgYW4gYW1wbGl0dWRlIDwgVmlicmF0aW9uRWZmZWN0LkRFRkFVTFRfQU1QTElUVURFLCAiICsKKyAgICAgICAgICAgICAgICAgICAgInNob3VsZCB0aHJvdyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4cGVjdGVkKSB7IH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgaW50W10gYmFkQW1wbGl0dWRlcyA9IG5ldyBpbnRbVEVTVF9USU1JTkdTLmxlbmd0aF07CisgICAgICAgICAgICBiYWRBbXBsaXR1ZGVzWzFdID0gMjU2OworICAgICAgICAgICAgVmlicmF0aW9uRWZmZWN0LmNyZWF0ZVdhdmVmb3JtKFRFU1RfVElNSU5HUywgYmFkQW1wbGl0dWRlcywgLTEpOworICAgICAgICAgICAgZmFpbCgiSGFzIGFuIGFtcGxpdHVkZSA+IDI1NSwgc2hvdWxkIHRocm93IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhwZWN0ZWQpIHsgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVdhdmVmb3JtV2l0aE5vQW1wbGl0dWRlcygpIHsKKyAgICAgICAgVmlicmF0aW9uRWZmZWN0LmNyZWF0ZVdhdmVmb3JtKFRFU1RfVElNSU5HUywgLTEpOworICAgICAgICBWaWJyYXRpb25FZmZlY3QuY3JlYXRlV2F2ZWZvcm0oVEVTVF9USU1JTkdTLCAwKTsKKyAgICAgICAgVmlicmF0aW9uRWZmZWN0LmNyZWF0ZVdhdmVmb3JtKFRFU1RfVElNSU5HUywgVEVTVF9USU1JTkdTLmxlbmd0aCAtIDEpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVdhdmVmb3JtV2l0aE5vQW1wbGl0dWRlc0ZhaWxzUmVwZWF0SW5kZXhPdXRPZkJvdW5kcygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFZpYnJhdGlvbkVmZmVjdC5jcmVhdGVXYXZlZm9ybShURVNUX1RJTUlOR1MsIC0yKTsKKyAgICAgICAgICAgIGZhaWwoIlJlcGVhdCBpbmRleCBpcyA8IC0xLCBzaG91bGQgdGhyb3cgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleHBlY3RlZCkgeyB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFZpYnJhdGlvbkVmZmVjdC5jcmVhdGVXYXZlZm9ybShURVNUX1RJTUlOR1MsIFRFU1RfVElNSU5HUy5sZW5ndGgpOworICAgICAgICAgICAgZmFpbCgiUmVwZWF0IGluZGV4IGlzID49IHRpbWluZ3MgYXJyYXkgbGVuZ3RoLCBzaG91bGQgdGhyb3cgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleHBlY3RlZCkgeyB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2F2ZWZvcm1FcXVhbHMoKSB7CisgICAgICAgIFZpYnJhdGlvbkVmZmVjdCBlZmZlY3QgPSBWaWJyYXRpb25FZmZlY3QuY3JlYXRlV2F2ZWZvcm0oVEVTVF9USU1JTkdTLCBURVNUX0FNUExJVFVERVMsIC0xKTsKKyAgICAgICAgVmlicmF0aW9uRWZmZWN0IG90aGVyRWZmZWN0ID0KKyAgICAgICAgICAgICAgICBWaWJyYXRpb25FZmZlY3QuY3JlYXRlV2F2ZWZvcm0oVEVTVF9USU1JTkdTLCBURVNUX0FNUExJVFVERVMsIC0xKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGVmZmVjdCwgb3RoZXJFZmZlY3QpOworICAgICAgICBhc3NlcnRFcXVhbHMoZWZmZWN0Lmhhc2hDb2RlKCksIG90aGVyRWZmZWN0Lmhhc2hDb2RlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdhdmVmb3JtTm90RXF1YWxzRGlmZmVyZW50UmVwZWF0SW5kZXgoKSB7CisgICAgICAgIFZpYnJhdGlvbkVmZmVjdCBvdGhlckVmZmVjdCA9CisgICAgICAgICAgICAgICAgVmlicmF0aW9uRWZmZWN0LmNyZWF0ZVdhdmVmb3JtKFRFU1RfVElNSU5HUywgVEVTVF9BTVBMSVRVREVTLCAwKTsKKyAgICAgICAgYXNzZXJ0Tm90RXF1YWxzKFRFU1RfV0FWRUZPUk0sIG90aGVyRWZmZWN0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXYXZlZm9ybU5vdEVxdWFsc0RpZmZlcmVudFRpbWluZ0FycmF5VmFsdWUoKSB7CisgICAgICAgIGxvbmdbXSBuZXdUaW1pbmdzID0gQXJyYXlzLmNvcHlPZihURVNUX1RJTUlOR1MsIFRFU1RfVElNSU5HUy5sZW5ndGgpOworICAgICAgICBuZXdUaW1pbmdzWzBdID0gMjAwOworICAgICAgICBWaWJyYXRpb25FZmZlY3Qgb3RoZXJFZmZlY3QgPQorICAgICAgICAgICAgICAgIFZpYnJhdGlvbkVmZmVjdC5jcmVhdGVXYXZlZm9ybShuZXdUaW1pbmdzLCBURVNUX0FNUExJVFVERVMsIC0xKTsKKyAgICAgICAgYXNzZXJ0Tm90RXF1YWxzKFRFU1RfV0FWRUZPUk0sIG90aGVyRWZmZWN0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXYXZlZm9ybU5vdEVxdWFsc0RpZmZlcmVudEFtcGxpdHVkZUFycmF5VmFsdWUoKSB7CisgICAgICAgIGludFtdIG5ld0FtcGxpdHVkZXMgPSBBcnJheXMuY29weU9mKFRFU1RfQU1QTElUVURFUywgVEVTVF9BTVBMSVRVREVTLmxlbmd0aCk7CisgICAgICAgIG5ld0FtcGxpdHVkZXNbMF0gPSAxOworICAgICAgICBWaWJyYXRpb25FZmZlY3Qgb3RoZXJFZmZlY3QgPQorICAgICAgICAgICAgICAgIFZpYnJhdGlvbkVmZmVjdC5jcmVhdGVXYXZlZm9ybShURVNUX1RJTUlOR1MsIG5ld0FtcGxpdHVkZXMsIC0xKTsKKyAgICAgICAgYXNzZXJ0Tm90RXF1YWxzKFRFU1RfV0FWRUZPUk0sIG90aGVyRWZmZWN0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXYXZlZm9ybU5vdEVxdWFsc0RpZmZlcmVudEFycmF5TGVuZ3RoKCkgeworICAgICAgICBsb25nW10gbmV3VGltaW5ncyA9IEFycmF5cy5jb3B5T2ZSYW5nZShURVNUX1RJTUlOR1MsIDAsIFRFU1RfVElNSU5HUy5sZW5ndGggLSAxKTsKKyAgICAgICAgaW50W10gbmV3QW1wbGl0dWRlcyA9IEFycmF5cy5jb3B5T2ZSYW5nZShURVNUX0FNUExJVFVERVMsIDAsIFRFU1RfQU1QTElUVURFUy5sZW5ndGggLTEpOworICAgICAgICBWaWJyYXRpb25FZmZlY3Qgb3RoZXJFZmZlY3QgPQorICAgICAgICAgICAgICAgIFZpYnJhdGlvbkVmZmVjdC5jcmVhdGVXYXZlZm9ybShuZXdUaW1pbmdzLCBuZXdBbXBsaXR1ZGVzLCAtMSk7CisgICAgICAgIGFzc2VydE5vdEVxdWFscyhURVNUX1dBVkVGT1JNLCBvdGhlckVmZmVjdCk7CisgICAgICAgIGFzc2VydE5vdEVxdWFscyhvdGhlckVmZmVjdCwgVEVTVF9XQVZFRk9STSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2F2ZWZvcm1XaXRoTm9BbXBsaXR1ZGVzRXF1YWxzKCkgeworICAgICAgICBWaWJyYXRpb25FZmZlY3Qgb3RoZXJFZmZlY3QgPSBWaWJyYXRpb25FZmZlY3QuY3JlYXRlV2F2ZWZvcm0oVEVTVF9USU1JTkdTLCAtMSk7CisgICAgICAgIGFzc2VydEVxdWFscyhURVNUX1dBVkVGT1JNX05PX0FNUExJVFVERVMsIG90aGVyRWZmZWN0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFRFU1RfV0FWRUZPUk1fTk9fQU1QTElUVURFUy5oYXNoQ29kZSgpLCBvdGhlckVmZmVjdC5oYXNoQ29kZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXYXZlZm9ybVdpdGhOb0FtcGxpdHVkZXNOb3RFcXVhbHNEaWZmZXJlbnRSZXBlYXRJbmRleCgpIHsKKyAgICAgICAgVmlicmF0aW9uRWZmZWN0IG90aGVyRWZmZWN0ID0gVmlicmF0aW9uRWZmZWN0LmNyZWF0ZVdhdmVmb3JtKFRFU1RfVElNSU5HUywgMCk7CisgICAgICAgIGFzc2VydE5vdEVxdWFscyhURVNUX1dBVkVGT1JNX05PX0FNUExJVFVERVMsIG90aGVyRWZmZWN0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXYXZlZm9ybVdpdGhOb0FtcGxpdHVkZXNOb3RFcXVhbHNEaWZmZXJlbnRBcnJheUxlbmd0aCgpIHsKKyAgICAgICAgbG9uZ1tdIG5ld1RpbWluZ3MgPSBBcnJheXMuY29weU9mUmFuZ2UoVEVTVF9USU1JTkdTLCAwLCBURVNUX1RJTUlOR1MubGVuZ3RoIC0gMSk7CisgICAgICAgIFZpYnJhdGlvbkVmZmVjdCBvdGhlckVmZmVjdCA9IFZpYnJhdGlvbkVmZmVjdC5jcmVhdGVXYXZlZm9ybShuZXdUaW1pbmdzLCAtMSk7CisgICAgICAgIGFzc2VydE5vdEVxdWFscyhURVNUX1dBVkVGT1JNX05PX0FNUExJVFVERVMsIG90aGVyRWZmZWN0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXYXZlZm9ybVdpdGhOb0FtcGxpdHVkZXNOb3RFcXVhbHNEaWZmZXJlbnRUaW1pbmdWYWx1ZSgpIHsKKyAgICAgICAgbG9uZ1tdIG5ld1RpbWluZ3MgPSBBcnJheXMuY29weU9mKFRFU1RfVElNSU5HUywgVEVTVF9USU1JTkdTLmxlbmd0aCk7CisgICAgICAgIG5ld1RpbWluZ3NbMF0gPSAxOworICAgICAgICBWaWJyYXRpb25FZmZlY3Qgb3RoZXJFZmZlY3QgPSBWaWJyYXRpb25FZmZlY3QuY3JlYXRlV2F2ZWZvcm0obmV3VGltaW5ncywgLTEpOworICAgICAgICBhc3NlcnROb3RFcXVhbHMoVEVTVF9XQVZFRk9STV9OT19BTVBMSVRVREVTLCBvdGhlckVmZmVjdCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyY2VsaW5nKCkgeworICAgICAgICBQYXJjZWwgcCA9IFBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgVEVTVF9PTkVfU0hPVC53cml0ZVRvUGFyY2VsKHAsIDApOworICAgICAgICBwLnNldERhdGFQb3NpdGlvbigwKTsKKyAgICAgICAgVmlicmF0aW9uRWZmZWN0IHBhcmNlbGVkRWZmZWN0ID0gVmlicmF0aW9uRWZmZWN0LkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFRFU1RfT05FX1NIT1QsIHBhcmNlbGVkRWZmZWN0KTsKKworICAgICAgICBwLnNldERhdGFQb3NpdGlvbigwKTsKKyAgICAgICAgVEVTVF9XQVZFRk9STS53cml0ZVRvUGFyY2VsKHAsIDApOworICAgICAgICBwLnNldERhdGFQb3NpdGlvbigwKTsKKyAgICAgICAgcGFyY2VsZWRFZmZlY3QgPSBWaWJyYXRpb25FZmZlY3QuQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKHApOworICAgICAgICBhc3NlcnRFcXVhbHMoVEVTVF9XQVZFRk9STSwgcGFyY2VsZWRFZmZlY3QpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL29zL3NyYy9hbmRyb2lkL29zL2N0cy9WaWJyYXRvclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL29zL3NyYy9hbmRyb2lkL29zL2N0cy9WaWJyYXRvclRlc3QuamF2YQppbmRleCAxNTc3OTg1Li4xYzllZTFiIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9vcy9zcmMvYW5kcm9pZC9vcy9jdHMvVmlicmF0b3JUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvb3Mvc3JjL2FuZHJvaWQvb3MvY3RzL1ZpYnJhdG9yVGVzdC5qYXZhCkBAIC0xNiw1NSArMTYsNTggQEAKIAogcGFja2FnZSBhbmRyb2lkLm9zLmN0czsKIAotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQub3MuVmlicmF0b3I7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKLXB1YmxpYyBjbGFzcyBWaWJyYXRvclRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9BdHRyaWJ1dGVzOworaW1wb3J0IGFuZHJvaWQub3MuVmlicmF0aW9uRWZmZWN0OworaW1wb3J0IGFuZHJvaWQub3MuVmlicmF0b3I7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5MYXJnZVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworCitAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQorQExhcmdlVGVzdAorcHVibGljIGNsYXNzIFZpYnJhdG9yVGVzdCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXVkaW9BdHRyaWJ1dGVzIEFVRElPX0FUVFJJQlVURVMgPQorICAgICAgICAgICAgbmV3IEF1ZGlvQXR0cmlidXRlcy5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0VXNhZ2UoQXVkaW9BdHRyaWJ1dGVzLlVTQUdFX01FRElBKQorICAgICAgICAgICAgICAgIC5zZXRDb250ZW50VHlwZShBdWRpb0F0dHJpYnV0ZXMuQ09OVEVOVF9UWVBFX01VU0lDKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOwogCiAgICAgcHJpdmF0ZSBWaWJyYXRvciBtVmlicmF0b3I7CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBtVmlicmF0b3IgPSAoVmlicmF0b3IpIGdldENvbnRleHQoKS5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuVklCUkFUT1JfU0VSVklDRSk7CisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBtVmlicmF0b3IgPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShWaWJyYXRvci5jbGFzcyk7CiAgICAgfQogCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0VmlicmF0b3JDYW5jZWwoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtVmlicmF0b3IudmlicmF0ZSgxMDAwKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoInRlc3RWaWJyYXRvckNhbmNlbCBmYWlsZWQhIik7Ci0gICAgICAgIH0KLSAgICAgICAgc2xlZXAoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1WaWJyYXRvci5jYW5jZWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoInRlc3RWaWJyYXRvckNhbmNlbCBmYWlsZWQhIik7Ci0gICAgICAgIH0KKyAgICAgICAgbVZpYnJhdG9yLnZpYnJhdGUoMTAwMCk7CisgICAgICAgIHNsZWVwKDUwMCk7CisgICAgICAgIG1WaWJyYXRvci5jYW5jZWwoKTsKICAgICB9CiAKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RWaWJyYXRlUGF0dGVybigpIHsKICAgICAgICAgbG9uZ1tdIHBhdHRlcm4gPSB7MTAwLCAyMDAsIDQwMCwgODAwLCAxNjAwfTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1WaWJyYXRvci52aWJyYXRlKHBhdHRlcm4sIDMpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgidmlicmF0ZSBmYWlsZWQhIik7Ci0gICAgICAgIH0KKyAgICAgICAgbVZpYnJhdG9yLnZpYnJhdGUocGF0dGVybiwgMyk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBtVmlicmF0b3IudmlicmF0ZShwYXR0ZXJuLCAxMCk7CiAgICAgICAgICAgICBmYWlsKCJTaG91bGQgdGhyb3cgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIik7Ci0gICAgICAgIH0gY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgc2xlZXAoKTsKKyAgICAgICAgfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGV4cGVjdGVkKSB7IH0KKyAgICAgICAgbVZpYnJhdG9yLmNhbmNlbCgpOwogICAgIH0KIAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFZpYnJhdGVNdWx0aVRocmVhZCgpIHsKLSAgICAgICAgTG9nLmQoIioqKioqKipWaWJyYXRvclRlc3QiLCAiTXVsdGlUcmVhZFRlc3QiKTsKICAgICAgICAgbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoIioqKioqKipWaWJyYXRvclRlc3QiLCAiVGhyZWFkIDEiKTsKICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICBtVmlicmF0b3IudmlicmF0ZSgxMDApOwogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CkBAIC03NCw3ICs3Nyw2IEBACiAgICAgICAgIH0pLnN0YXJ0KCk7CiAgICAgICAgIG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgewogICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIExvZy5kKCIqKioqKioqVmlicmF0b3JUZXN0IiwgIlRocmVhZCAyIik7CiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyB0ZXN0IG9ubHkgZ2V0IHR3byB0aHJlYWRzIHRvIHJ1biB2aWJyYXRvciBhdCB0aGUgc2FtZSB0aW1lCiAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBhIGZ1bmN0aW9uYWwgdGVzdCwKQEAgLTg1LDEzICs4Nyw1MCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfSkuc3RhcnQoKTsKLSAgICAgICAgc2xlZXAoKTsKKyAgICAgICAgc2xlZXAoMTUwMCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHNsZWVwKCkgeworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFZpYnJhdGVPbmVTaG90KCkgeworICAgICAgICBWaWJyYXRpb25FZmZlY3Qgb25lU2hvdCA9CisgICAgICAgICAgICAgICAgVmlicmF0aW9uRWZmZWN0LmNyZWF0ZU9uZVNob3QoMTAwLCBWaWJyYXRpb25FZmZlY3QuREVGQVVMVF9BTVBMSVRVREUpOworICAgICAgICBtVmlicmF0b3IudmlicmF0ZShvbmVTaG90KTsKKyAgICAgICAgc2xlZXAoMTAwKTsKKworICAgICAgICBvbmVTaG90ID0gVmlicmF0aW9uRWZmZWN0LmNyZWF0ZU9uZVNob3QoNTAwLCAyNTUgLyogTWF4IGFtcGxpdHVkZSAqLyk7CisgICAgICAgIG1WaWJyYXRvci52aWJyYXRlKG9uZVNob3QpOworICAgICAgICBzbGVlcCgxMDApOworICAgICAgICBtVmlicmF0b3IuY2FuY2VsKCk7CisKKyAgICAgICAgb25lU2hvdCA9IFZpYnJhdGlvbkVmZmVjdC5jcmVhdGVPbmVTaG90KDEwMCwgMSAvKiBNaW4gYW1wbGl0dWRlICovKTsKKyAgICAgICAgbVZpYnJhdG9yLnZpYnJhdGUob25lU2hvdCwgQVVESU9fQVRUUklCVVRFUyk7CisgICAgICAgIHNsZWVwKDEwMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmlicmF0ZVdhdmVmb3JtKCkgeworICAgICAgICBmaW5hbCBsb25nW10gdGltaW5ncyA9IG5ldyBsb25nW10gezEwMCwgMjAwLCAzMDAsIDQwMCwgNTAwfTsKKyAgICAgICAgZmluYWwgaW50W10gYW1wbGl0dWRlcyA9IG5ldyBpbnRbXSB7NjQsIDEyOCwgMjU1LCAxMjgsIDY0fTsKKyAgICAgICAgVmlicmF0aW9uRWZmZWN0IHdhdmVmb3JtID0gVmlicmF0aW9uRWZmZWN0LmNyZWF0ZVdhdmVmb3JtKHRpbWluZ3MsIGFtcGxpdHVkZXMsIC0xKTsKKyAgICAgICAgbVZpYnJhdG9yLnZpYnJhdGUod2F2ZWZvcm0pOworICAgICAgICBzbGVlcCgxNTAwKTsKKworICAgICAgICB3YXZlZm9ybSA9IFZpYnJhdGlvbkVmZmVjdC5jcmVhdGVXYXZlZm9ybSh0aW1pbmdzLCBhbXBsaXR1ZGVzLCAwKTsKKyAgICAgICAgbVZpYnJhdG9yLnZpYnJhdGUod2F2ZWZvcm0sIEFVRElPX0FUVFJJQlVURVMpOworICAgICAgICBzbGVlcCgyMDAwKTsKKyAgICAgICAgbVZpYnJhdG9yLmNhbmNlbCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFZpYnJhdG9ySGFzQW1wbGl0dWRlQ29udHJvbCgpIHsKKyAgICAgICAgLy8gSnVzdCBtYWtlIHN1cmUgaXQgZG9lc24ndCBjcmFzaCB3aGVuIHRoaXMgaXMgY2FsbGVkOyB3ZSBkb24ndCByZWFsbHkgaGF2ZSBhIHdheSB0byB0ZXN0CisgICAgICAgIC8vIGlmIHRoZSBhbXBsaXR1ZGUgY29udHJvbCB3b3JrcyBvciBub3QuCisgICAgICAgIG1WaWJyYXRvci5oYXNBbXBsaXR1ZGVDb250cm9sKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzbGVlcChsb25nIG1pbGxpcykgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDAwKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQorICAgICAgICAgICAgVGhyZWFkLnNsZWVwKG1pbGxpcyk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGlnbm9yZWQpIHsgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL29zL3NyYy9hbmRyb2lkL29zL2N0cy9Xb3JrU291cmNlVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvb3Mvc3JjL2FuZHJvaWQvb3MvY3RzL1dvcmtTb3VyY2VUZXN0LmphdmEKaW5kZXggZmY5ZDY5My4uZTdkZjdiZSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvb3Mvc3JjL2FuZHJvaWQvb3MvY3RzL1dvcmtTb3VyY2VUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvb3Mvc3JjL2FuZHJvaWQvb3MvY3RzL1dvcmtTb3VyY2VUZXN0LmphdmEKQEAgLTM1LDggKzM1LDYgQEAKICAgICBwcml2YXRlIE9iamVjdFtdIG1BZGRSZXR1cm5pbmdOZXdic0FyZ3MgPSBuZXcgT2JqZWN0WzFdOwogICAgIHByaXZhdGUgTWV0aG9kIG1TZXRSZXR1cm5pbmdEaWZmczsKICAgICBwcml2YXRlIE9iamVjdFtdIG1TZXRSZXR1cm5pbmdEaWZmc0FyZ3MgPSBuZXcgT2JqZWN0WzFdOwotICAgIHByaXZhdGUgTWV0aG9kIG1TdHJpcE5hbWVzOwotICAgIHByaXZhdGUgT2JqZWN0W10gbVN0cmlwTmFtZXNBcmdzID0gbmV3IE9iamVjdFswXTsKIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC00Niw3ICs0NCw2IEBACiAgICAgICAgIG1BZGRVaWROYW1lID0gV29ya1NvdXJjZS5jbGFzcy5nZXRNZXRob2QoImFkZCIsIG5ldyBDbGFzc1tdIHsgaW50LmNsYXNzLCBTdHJpbmcuY2xhc3MgfSk7CiAgICAgICAgIG1BZGRSZXR1cm5pbmdOZXdicyA9IFdvcmtTb3VyY2UuY2xhc3MuZ2V0TWV0aG9kKCJhZGRSZXR1cm5pbmdOZXdicyIsIG5ldyBDbGFzc1tdIHsgV29ya1NvdXJjZS5jbGFzcyB9KTsKICAgICAgICAgbVNldFJldHVybmluZ0RpZmZzID0gV29ya1NvdXJjZS5jbGFzcy5nZXRNZXRob2QoInNldFJldHVybmluZ0RpZmZzIiwgbmV3IENsYXNzW10geyBXb3JrU291cmNlLmNsYXNzIH0pOwotICAgICAgICBtU3RyaXBOYW1lcyA9IFdvcmtTb3VyY2UuY2xhc3MuZ2V0TWV0aG9kKCJzdHJpcE5hbWVzIiwgbmV3IENsYXNzW10geyAgfSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBXb3JrU291cmNlIHdzTmV3KGludCB1aWQpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sCkBAIC0xMDAsMTEgKzk3LDYgQEAKICAgICAgICAgcmV0dXJuIChXb3JrU291cmNlW10pbVNldFJldHVybmluZ0RpZmZzLmludm9rZSh3cywgbVNldFJldHVybmluZ0RpZmZzQXJncyk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBXb3JrU291cmNlIHdzU3RyaXBOYW1lcyhXb3JrU291cmNlIHdzKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLAotICAgICAgICAgICAgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiAoV29ya1NvdXJjZSltU3RyaXBOYW1lcy5pbnZva2Uod3MpOwotICAgIH0KLQogICAgIHByaXZhdGUgdm9pZCBwcmludEFycmF5cyhTdHJpbmdCdWlsZGVyIHNiLCBpbnRbXSB1aWRzLCBTdHJpbmdbXSBuYW1lcykgewogICAgICAgICBzYi5hcHBlbmQoInsgIik7CiAgICAgICAgIGZvciAoaW50IGk9MDsgaTx1aWRzLmxlbmd0aDsgaSsrKSB7CkBAIC01MjksMzEgKzUyMSw0IEBACiAgICAgICAgICAgICAgICAgbmV3IGludFtdIHsgfSwKICAgICAgICAgICAgICAgICB0cnVlKTsKICAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZG9UZXN0U3RyaXBOYW1lcyhpbnRbXSB1aWRzLCBTdHJpbmdbXSBuYW1lcywgaW50W10gZXhwZWN0ZWQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBXb3JrU291cmNlIHdzMSA9IHdzTmV3KHVpZHMsIG5hbWVzKTsKLSAgICAgICAgV29ya1NvdXJjZSByZXMgPSB3c1N0cmlwTmFtZXMod3MxKTsKLSAgICAgICAgY2hlY2tXb3JrU291cmNlKCJTdHJpcE5hbWVzIiwgcmVzLCBleHBlY3RlZCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0cmlwTmFtZXNTaW1wbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZG9UZXN0U3RyaXBOYW1lcygKLSAgICAgICAgICAgICAgICBuZXcgaW50W10gICAgeyAxMCwgIDIwLCAgMzAsICA0MCB9LAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQSIsICJBIiB9LAotICAgICAgICAgICAgICAgIG5ldyBpbnRbXSAgICB7IDEwLCAyMCwgMzAsIDQwIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpcE5hbWVzRnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBkb1Rlc3RTdHJpcE5hbWVzKAotICAgICAgICAgICAgICAgIG5ldyBpbnRbXSAgICB7IDEwLCAgMTAsICAxMCwgIDEwIH0sCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJDIiwgIkQiIH0sCi0gICAgICAgICAgICAgICAgbmV3IGludFtdICAgIHsgMTAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0cmlwTmFtZXNDb21wbGV4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGRvVGVzdFN0cmlwTmFtZXMoCi0gICAgICAgICAgICAgICAgbmV3IGludFtdICAgIHsgMTAsICAyMCwgIDIwLCAgMzAsICA0MCwgIDQwIH0sCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJCIiwgIkEiLCAiQSIsICJCIiB9LAotICAgICAgICAgICAgICAgIG5ldyBpbnRbXSAgICB7IDEwLCAyMCwgMzAsIDQwIH0pOwotICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL29zL3NyYy9hbmRyb2lkL29zL3N0b3JhZ2UvY3RzL1N0b3JhZ2VNYW5hZ2VyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvb3Mvc3JjL2FuZHJvaWQvb3Mvc3RvcmFnZS9jdHMvU3RvcmFnZU1hbmFnZXJUZXN0LmphdmEKaW5kZXggYTgyMGFjMC4uY2RkMjU4OCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvb3Mvc3JjL2FuZHJvaWQvb3Mvc3RvcmFnZS9jdHMvU3RvcmFnZU1hbmFnZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvb3Mvc3JjL2FuZHJvaWQvb3Mvc3RvcmFnZS9jdHMvU3RvcmFnZU1hbmFnZXJUZXN0LmphdmEKQEAgLTI3LDYgKzI3LDcgQEAKIGltcG9ydCBhbmRyb2lkLm9zLlByb3h5RmlsZURlc2NyaXB0b3JDYWxsYmFjazsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGFuZHJvaWQub3MuVXNlck1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5zdG9yYWdlLk9uT2JiU3RhdGVDaGFuZ2VMaXN0ZW5lcjsKIGltcG9ydCBhbmRyb2lkLm9zLnN0b3JhZ2UuU3RvcmFnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5zdG9yYWdlLlN0b3JhZ2VWb2x1bWU7CkBAIC02OSwxNCArNzAsMjIgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVDFfTkVXX0NPTlRFTlRTID0gIjFcbiI7CiAKICAgICBwcml2YXRlIFN0b3JhZ2VNYW5hZ2VyIG1TdG9yYWdlTWFuYWdlcjsKKyAgICBwcml2YXRlIFVzZXJNYW5hZ2VyIG1Vc2VyTWFuYWdlcjsKKyAgICBwcml2YXRlIGZpbmFsIEhhbmRsZXIgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcihMb29wZXIuZ2V0TWFpbkxvb3BlcigpKTsKIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHN1cGVyLnNldFVwKCk7CiAgICAgICAgIG1TdG9yYWdlTWFuYWdlciA9IChTdG9yYWdlTWFuYWdlcikgbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlNUT1JBR0VfU0VSVklDRSk7CisgICAgICAgIG1Vc2VyTWFuYWdlciA9IChVc2VyTWFuYWdlcikgbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlVTRVJfU0VSVklDRSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdE1vdW50QW5kVW5tb3VudE9iYk5vcm1hbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIE1vdW50IG9iYiBvbmx5IHdvcmtzIGZvciBzeXN0ZW0gdXNlci4gU2tpcCBmb3Igc2Vjb25kYXJ5IHVzZXJzLgorICAgICAgICBpZiAoIW1Vc2VyTWFuYWdlci5pc1N5c3RlbVVzZXIoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKICAgICAgICAgZm9yIChGaWxlIHRhcmdldCA6IGdldFRhcmdldEZpbGVzKCkpIHsKICAgICAgICAgICAgIHRhcmdldCA9IG5ldyBGaWxlKHRhcmdldCwgInRlc3QxX25ldy5vYmIiKTsKICAgICAgICAgICAgIExvZy5kKFRBRywgIlRlc3RpbmcgcGF0aCAiICsgdGFyZ2V0KTsKQEAgLTEwMyw2ICsxMTIsMTEgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0QXR0ZW1wdE1vdW50Tm9uT2JiKCkgeworICAgICAgICAvLyBNb3VudCBvYmIgb25seSB3b3JrcyBmb3Igc3lzdGVtIHVzZXIuIFNraXAgZm9yIHNlY29uZGFyeSB1c2Vycy4KKyAgICAgICAgaWYgKCFtVXNlck1hbmFnZXIuaXNTeXN0ZW1Vc2VyKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCiAgICAgICAgIGZvciAoRmlsZSB0YXJnZXQgOiBnZXRUYXJnZXRGaWxlcygpKSB7CiAgICAgICAgICAgICB0YXJnZXQgPSBuZXcgRmlsZSh0YXJnZXQsICJ0ZXN0MV9ub3NpZy5vYmIiKTsKICAgICAgICAgICAgIExvZy5kKFRBRywgIlRlc3RpbmcgcGF0aCAiICsgdGFyZ2V0KTsKQEAgLTE0MCw2ICsxNTQsMTEgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0TW91bnRBbmRVbm1vdW50VHdvT2JicygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIE1vdW50IG9iYiBvbmx5IHdvcmtzIGZvciBzeXN0ZW0gdXNlci4gU2tpcCBmb3Igc2Vjb25kYXJ5IHVzZXJzLgorICAgICAgICBpZiAoIW1Vc2VyTWFuYWdlci5pc1N5c3RlbVVzZXIoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKICAgICAgICAgZm9yIChGaWxlIHRhcmdldCA6IGdldFRhcmdldEZpbGVzKCkpIHsKICAgICAgICAgICAgIExvZy5kKFRBRywgIlRlc3RpbmcgdGFyZ2V0ICIgKyB0YXJnZXQpOwogICAgICAgICAgICAgZmluYWwgRmlsZSB0ZXN0MSA9IG5ldyBGaWxlKHRhcmdldCwgInRlc3QxLm9iYiIpOwpAQCAtMzE3LDcgKzMzNiw3IEBACiAgICAgICAgICAgICBpZiAob25SZWFkRXJyb3IgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHRocm93IG9uUmVhZEVycm9yOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgaW50IGxlbiA9IChpbnQpKE1hdGgubWluKHNpemUsIGRhdGEubGVuZ3RoIC0gb2Zmc2V0KSk7CisgICAgICAgICAgICBmaW5hbCBpbnQgbGVuID0gKGludCkoTWF0aC5taW4oc2l6ZSwgYnl0ZXMubGVuZ3RoIC0gb2Zmc2V0KSk7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgZGF0YVtpXSA9IGJ5dGVzWyhpbnQpKGkgKyBvZmZzZXQpXTsKICAgICAgICAgICAgIH0KQEAgLTM1NCwxMSArMzczLDExIEBACiAgICAgICAgIGZpbmFsIFRlc3RQcm94eUZpbGVEZXNjcmlwdG9yQ2FsbGJhY2sgY2hlcnJ5Q2FsbGJhY2sgPQogICAgICAgICAgICAgICAgIG5ldyBUZXN0UHJveHlGaWxlRGVzY3JpcHRvckNhbGxiYWNrKDEwMjQgKiAxMDI0LCAiQ2hlcnJ5Iik7CiAgICAgICAgIHRyeSAoZmluYWwgUGFyY2VsRmlsZURlc2NyaXB0b3IgYXBwbGVGZCA9IG1TdG9yYWdlTWFuYWdlci5vcGVuUHJveHlGaWxlRGVzY3JpcHRvcigKLSAgICAgICAgICAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yLk1PREVfUkVBRF9PTkxZLCBhcHBsZUNhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yLk1PREVfUkVBRF9PTkxZLCBhcHBsZUNhbGxiYWNrLCBtSGFuZGxlcik7CiAgICAgICAgICAgICAgZmluYWwgUGFyY2VsRmlsZURlc2NyaXB0b3Igb3JhbmdlRmQgPSBtU3RvcmFnZU1hbmFnZXIub3BlblByb3h5RmlsZURlc2NyaXB0b3IoCi0gICAgICAgICAgICAgICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvci5NT0RFX1dSSVRFX09OTFksIG9yYW5nZUNhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yLk1PREVfV1JJVEVfT05MWSwgb3JhbmdlQ2FsbGJhY2ssIG1IYW5kbGVyKTsKICAgICAgICAgICAgICBmaW5hbCBQYXJjZWxGaWxlRGVzY3JpcHRvciBjaGVycnlGZCA9IG1TdG9yYWdlTWFuYWdlci5vcGVuUHJveHlGaWxlRGVzY3JpcHRvcigKLSAgICAgICAgICAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yLk1PREVfUkVBRF9XUklURSwgY2hlcnJ5Q2FsbGJhY2spKSB7CisgICAgICAgICAgICAgICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvci5NT0RFX1JFQURfV1JJVEUsIGNoZXJyeUNhbGxiYWNrLCBtSGFuZGxlcikpIHsKICAgICAgICAgICAgIC8vIFN0YXQKICAgICAgICAgICAgIGFzc2VydEVxdWFscyhhcHBsZUNhbGxiYWNrLm9uR2V0U2l6ZSgpLCBhcHBsZUZkLmdldFN0YXRTaXplKCkpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG9yYW5nZUNhbGxiYWNrLm9uR2V0U2l6ZSgpLCBvcmFuZ2VGZC5nZXRTdGF0U2l6ZSgpKTsKQEAgLTQ4NiwxMyArNTA1LDEzIEBACiAgICAgICAgIGNhbGxiYWNrLm9uR2V0U2l6ZUVycm9yID0gbmV3IEVycm5vRXhjZXB0aW9uKCJvbkdldFNpemUiLCBPc0NvbnN0YW50cy5FTk9FTlQpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgdHJ5IChmaW5hbCBQYXJjZWxGaWxlRGVzY3JpcHRvciBmZCA9IG1TdG9yYWdlTWFuYWdlci5vcGVuUHJveHlGaWxlRGVzY3JpcHRvcigKLSAgICAgICAgICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IuTU9ERV9SRUFEX1dSSVRFLCBjYWxsYmFjaykpIHt9CisgICAgICAgICAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yLk1PREVfUkVBRF9XUklURSwgY2FsbGJhY2ssIG1IYW5kbGVyKSkge30KICAgICAgICAgICAgIGZhaWwoKTsKICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhwKSB7fQogICAgICAgICBjYWxsYmFjay5vbkdldFNpemVFcnJvciA9IG51bGw7CiAKICAgICAgICAgdHJ5IChmaW5hbCBQYXJjZWxGaWxlRGVzY3JpcHRvciBmZCA9IG1TdG9yYWdlTWFuYWdlci5vcGVuUHJveHlGaWxlRGVzY3JpcHRvcigKLSAgICAgICAgICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvci5NT0RFX1JFQURfV1JJVEUsIGNhbGxiYWNrKSkgeworICAgICAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yLk1PREVfUkVBRF9XUklURSwgY2FsbGJhY2ssIG1IYW5kbGVyKSkgewogICAgICAgICAgICAgY2FsbGJhY2sub25SZWFkRXJyb3IgPSBuZXcgRXJybm9FeGNlcHRpb24oIm9uUmVhZCIsIE9zQ29uc3RhbnRzLkVJTyk7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIE9zLnJlYWQoZmQuZ2V0RmlsZURlc2NyaXB0b3IoKSwgYnl0ZXMsIDAsIGJ5dGVzLmxlbmd0aCk7CkBAIC01ODUsNyArNjA0LDcgQEAKIAogICAgICAgICB0cnkgKGZpbmFsIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGJsb2NrRmQgPQogICAgICAgICAgICAgICAgICAgICBtU3RvcmFnZU1hbmFnZXIub3BlblByb3h5RmlsZURlc2NyaXB0b3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IuTU9ERV9SRUFEX09OTFksIGJsb2NrQ2FsbGJhY2spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yLk1PREVfUkVBRF9PTkxZLCBibG9ja0NhbGxiYWNrLCBtSGFuZGxlcik7CiAgICAgICAgICAgICAgZmluYWwgUGFyY2VsRmlsZURlc2NyaXB0b3IgYXN5bmNGZCA9CiAgICAgICAgICAgICAgICAgICAgIG1TdG9yYWdlTWFuYWdlci5vcGVuUHJveHlGaWxlRGVzY3JpcHRvcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvci5NT0RFX1JFQURfT05MWSwgYXN5bmNDYWxsYmFjaywgaGFuZGxlcikpIHsKQEAgLTYxNyw2ICs2MzYsNzMgQEAKICAgICAgICAgbG9vcGVyVGhyZWFkLmpvaW4oKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3BlblByb3h5RmlsZURlc2NyaXB0b3JfbGFyZ2VGaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFByb3h5RmlsZURlc2NyaXB0b3JDYWxsYmFjayBjYWxsYmFjayA9IG5ldyBQcm94eUZpbGVEZXNjcmlwdG9yQ2FsbGJhY2soKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgb25SZWFkKGxvbmcgb2Zmc2V0LCBpbnQgc2l6ZSwgYnl0ZVtdIGRhdGEpIHRocm93cyBFcnJub0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZGF0YVtpXSA9ICdMJzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHNpemU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGxvbmcgb25HZXRTaXplKCkgdGhyb3dzIEVycm5vRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gOEwgKiAxMDI0TCAqIDEwMjRMICogMTAyNEw7ICAvLyA4R0IKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlbGVhc2UoKSB7fQorICAgICAgICB9OworICAgICAgICBmaW5hbCBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVsxMjhdOworICAgICAgICB0cnkgKGZpbmFsIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkID0gbVN0b3JhZ2VNYW5hZ2VyLm9wZW5Qcm94eUZpbGVEZXNjcmlwdG9yKAorICAgICAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yLk1PREVfUkVBRF9PTkxZLCBjYWxsYmFjaywgbUhhbmRsZXIpKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoOEwgKiAxMDI0TCAqIDEwMjRMICogMTAyNEwsIGZkLmdldFN0YXRTaXplKCkpOworCisgICAgICAgICAgICBmaW5hbCBpbnQgcmVhZEJ5dGVzID0gT3MucHJlYWQoCisgICAgICAgICAgICAgICAgICAgIGZkLmdldEZpbGVEZXNjcmlwdG9yKCksIGJ5dGVzLCAwLCBieXRlcy5sZW5ndGgsIGZkLmdldFN0YXRTaXplKCkgLSA2NEwpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDY0LCByZWFkQnl0ZXMpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCdMJywgYnl0ZXNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE9wZW5Qcm94eUZpbGVEZXNjcmlwdG9yX2xhcmdlUmVhZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBpbnQgU0laRSA9IDEwMjQgKiAxMDI0OworICAgICAgICBmaW5hbCBUZXN0UHJveHlGaWxlRGVzY3JpcHRvckNhbGxiYWNrIGNhbGxiYWNrID0KKyAgICAgICAgICAgICAgICBuZXcgVGVzdFByb3h5RmlsZURlc2NyaXB0b3JDYWxsYmFjayhTSVpFLCAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiKTsKKyAgICAgICAgZmluYWwgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbU0laRV07CisgICAgICAgIHRyeSAoZmluYWwgUGFyY2VsRmlsZURlc2NyaXB0b3IgZmQgPSBtU3RvcmFnZU1hbmFnZXIub3BlblByb3h5RmlsZURlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IuTU9ERV9SRUFEX09OTFksIGNhbGxiYWNrLCBtSGFuZGxlcikpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCByZWFkQnl0ZXMgPSBPcy5yZWFkKAorICAgICAgICAgICAgICAgICAgICBmZC5nZXRGaWxlRGVzY3JpcHRvcigpLCBieXRlcywgMCwgYnl0ZXMubGVuZ3RoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhieXRlcy5sZW5ndGgsIHJlYWRCeXRlcyk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNhbGxiYWNrLmJ5dGVzW2ldLCBieXRlc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3BlblByb3h5RmlsZURlc2NyaXB0b3JfbGFyZ2VXcml0ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBpbnQgU0laRSA9IDEwMjQgKiAxMDI0OworICAgICAgICBmaW5hbCBUZXN0UHJveHlGaWxlRGVzY3JpcHRvckNhbGxiYWNrIGNhbGxiYWNrID0KKyAgICAgICAgICAgICAgICBuZXcgVGVzdFByb3h5RmlsZURlc2NyaXB0b3JDYWxsYmFjayhTSVpFLCAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiKTsKKyAgICAgICAgZmluYWwgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbU0laRV07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgaSsrKSB7CisgICAgICAgICAgICBieXRlc1tpXSA9IChieXRlKShpICUgMTIzKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgKGZpbmFsIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkID0gbVN0b3JhZ2VNYW5hZ2VyLm9wZW5Qcm94eUZpbGVEZXNjcmlwdG9yKAorICAgICAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yLk1PREVfV1JJVEVfT05MWSwgY2FsbGJhY2ssIG1IYW5kbGVyKSkgeworICAgICAgICAgICAgZmluYWwgaW50IHdyaXR0ZW5CeXRlcyA9IE9zLndyaXRlKAorICAgICAgICAgICAgICAgICAgICBmZC5nZXRGaWxlRGVzY3JpcHRvcigpLCBieXRlcywgMCwgYnl0ZXMubGVuZ3RoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhieXRlcy5sZW5ndGgsIHdyaXR0ZW5CeXRlcyk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJ5dGVzW2ldLCBjYWxsYmFjay5ieXRlc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgYXNzZXJ0U3RvcmFnZVZvbHVtZXNFcXVhbHMoU3RvcmFnZVZvbHVtZSB2b2x1bWUsIFN0b3JhZ2VWb2x1bWUgY2xvbmUpCiAgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gQXNzZXJ0cyBlcXVhbHMoKSBtZXRob2QuCkBAIC02OTYsNyArNzgyLDYgQEAKIAogICAgIHByaXZhdGUgTGlzdDxGaWxlPiBnZXRUYXJnZXRGaWxlcygpIHsKICAgICAgICAgZmluYWwgTGlzdDxGaWxlPiB0YXJnZXRzID0gbmV3IEFycmF5TGlzdDxGaWxlPigpOwotICAgICAgICB0YXJnZXRzLmFkZChtQ29udGV4dC5nZXRGaWxlc0RpcigpKTsKICAgICAgICAgZm9yIChGaWxlIGRpciA6IG1Db250ZXh0LmdldE9iYkRpcnMoKSkgewogICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiVmFsaWQgbWVkaWEgbXVzdCBiZSBpbnNlcnRlZCBkdXJpbmcgQ1RTIiwgZGlyKTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscygiVmFsaWQgbWVkaWEgbXVzdCBiZSBpbnNlcnRlZCBkdXJpbmcgQ1RTIiwgRW52aXJvbm1lbnQuTUVESUFfTU9VTlRFRCwKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3BhY2thZ2VpbnN0YWxsZXIvYWRtaW5wYWNrYWdlaW5zdGFsbGVyL0FuZHJvaWQubWsgYi90ZXN0cy90ZXN0cy9wYWNrYWdlaW5zdGFsbGVyL2FkbWlucGFja2FnZWluc3RhbGxlci9BbmRyb2lkLm1rCmluZGV4IGFkZjBiMmIuLmZmYjVkZjAgMTAwNzU1Ci0tLSBhL3Rlc3RzL3Rlc3RzL3BhY2thZ2VpbnN0YWxsZXIvYWRtaW5wYWNrYWdlaW5zdGFsbGVyL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvdGVzdHMvcGFja2FnZWluc3RhbGxlci9hZG1pbnBhY2thZ2VpbnN0YWxsZXIvQW5kcm9pZC5tawpAQCAtMjgsMTAgKzI4LDExIEBACiAKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCiAJdWItdWlhdXRvbWF0b3IgXAotCWFuZHJvaWQtc3VwcG9ydC10ZXN0IFwKLQlhbmRyb2lkLXN1cHBvcnQtdjQgXAotCWxlZ2FjeS1hbmRyb2lkLXRlc3QgXAotCWNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwKKwlhbmRyb2lkeC50ZXN0LnJ1bGVzIFwKKwlhbmRyb2lkeC5sZWdhY3lfbGVnYWN5LXN1cHBvcnQtdjQgXAorCWNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0CisKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCiAKIExPQ0FMX1NES19WRVJTSU9OIDo9IHRlc3RfY3VycmVudAogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9wYWNrYWdlaW5zdGFsbGVyL2FkbWlucGFja2FnZWluc3RhbGxlci9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdGVzdHMvcGFja2FnZWluc3RhbGxlci9hZG1pbnBhY2thZ2VpbnN0YWxsZXIvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBlODE3MjMzLi42ZWFiZmIwIDEwMDc1NQotLS0gYS90ZXN0cy90ZXN0cy9wYWNrYWdlaW5zdGFsbGVyL2FkbWlucGFja2FnZWluc3RhbGxlci9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL3BhY2thZ2VpbnN0YWxsZXIvYWRtaW5wYWNrYWdlaW5zdGFsbGVyL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTQxLDcgKzQxLDcgQEAKICAgICAgICAgPC9hY3Rpdml0eT4KICAgICA8L2FwcGxpY2F0aW9uPgogCi0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZnVuY3Rpb25hbFRlc3Q9InRydWUiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQucGFja2FnZWluc3RhbGxlci5hZG1pbi5jdHMiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJFeHRlcm5hbCBBcHAgU291cmNlcyBUZXN0cyIvPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcGFja2FnZWluc3RhbGxlci9hZG1pbnBhY2thZ2VpbnN0YWxsZXIvQW5kcm9pZFRlc3QueG1sIGIvdGVzdHMvdGVzdHMvcGFja2FnZWluc3RhbGxlci9hZG1pbnBhY2thZ2VpbnN0YWxsZXIvQW5kcm9pZFRlc3QueG1sCmluZGV4IDNmMDliMjUuLmM4M2M2MTIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3BhY2thZ2VpbnN0YWxsZXIvYWRtaW5wYWNrYWdlaW5zdGFsbGVyL0FuZHJvaWRUZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9wYWNrYWdlaW5zdGFsbGVyL2FkbWlucGFja2FnZWluc3RhbGxlci9BbmRyb2lkVGVzdC54bWwKQEAgLTE1LDggKzE1LDEzIEBACiAtLT4KIAogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIEFkbWluIFBhY2thZ2UgSW5zdGFsbGVyIHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJmcmFtZXdvcmsiIC8+CiAKKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlN3aXRjaFVzZXJUYXJnZXRQcmVwYXJlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0idXNlci10eXBlIiB2YWx1ZT0ic3lzdGVtIi8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisKICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlJ1bkNvbW1hbmRUYXJnZXRQcmVwYXJlciI+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icnVuLWNvbW1hbmQiIHZhbHVlPSJta2RpciAtcCAvZGF0YS9sb2NhbC90bXAvY3RzL3BhY2thZ2VpbnN0YWxsZXIvIiAvPgogICAgICAgICA8b3B0aW9uIG5hbWU9InRlYXJkb3duLWNvbW1hbmQiIHZhbHVlPSJybSAtcmYgL2RhdGEvbG9jYWwvdG1wL2N0cyIvPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcGFja2FnZWluc3RhbGxlci9lbXB0eXRlc3RhcHAvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL3BhY2thZ2VpbnN0YWxsZXIvZW1wdHl0ZXN0YXBwL0FuZHJvaWQubWsKaW5kZXggZDA5ODMxOC4uNzU3NGQxZiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvcGFja2FnZWluc3RhbGxlci9lbXB0eXRlc3RhcHAvQW5kcm9pZC5taworKysgYi90ZXN0cy90ZXN0cy9wYWNrYWdlaW5zdGFsbGVyL2VtcHR5dGVzdGFwcC9BbmRyb2lkLm1rCkBAIC0yNSw2ICsyNSw2IEBACiBMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CiAKICMgdGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGFyY3RzIGN0cyB2dHMgZ2VuZXJhbC10ZXN0cwogCiBpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9wYWNrYWdlaW5zdGFsbGVyL2V4dGVybmFsc291cmNlcy9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvcGFja2FnZWluc3RhbGxlci9leHRlcm5hbHNvdXJjZXMvQW5kcm9pZC5tawppbmRleCBkNjQ3NzM4Li44YzZjMDA4IDEwMDc1NQotLS0gYS90ZXN0cy90ZXN0cy9wYWNrYWdlaW5zdGFsbGVyL2V4dGVybmFsc291cmNlcy9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3Rlc3RzL3BhY2thZ2VpbnN0YWxsZXIvZXh0ZXJuYWxzb3VyY2VzL0FuZHJvaWQubWsKQEAgLTI0LDEyICsyNCwxNCBAQAogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSB1Yi11aWF1dG9tYXRvciBhbmRyb2lkLXN1cHBvcnQtdGVzdCBhbmRyb2lkLXN1cHBvcnQtdjQKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSB1Yi11aWF1dG9tYXRvciBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZHgudGVzdC5ydWxlcyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZHgubGVnYWN5X2xlZ2FjeS1zdXBwb3J0LXY0IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dAogCiBMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CiAKICMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cyBjdHNfaW5zdGFudAogCiBpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCi0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3BhY2thZ2VpbnN0YWxsZXIvZXh0ZXJuYWxzb3VyY2VzL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy90ZXN0cy9wYWNrYWdlaW5zdGFsbGVyL2V4dGVybmFsc291cmNlcy9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDhiY2RkMDQuLjIzMDk5YWIgMTAwNzU1Ci0tLSBhL3Rlc3RzL3Rlc3RzL3BhY2thZ2VpbnN0YWxsZXIvZXh0ZXJuYWxzb3VyY2VzL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvcGFja2FnZWluc3RhbGxlci9leHRlcm5hbHNvdXJjZXMvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMTUsNyArMTUsOCBAQAogLS0+CiAKIDxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgICAgcGFja2FnZT0iYW5kcm9pZC5wYWNrYWdlaW5zdGFsbGVyLmV4dGVybmFsc291cmNlcy5jdHMiID4KKyAgICAgICAgICBwYWNrYWdlPSJhbmRyb2lkLnBhY2thZ2VpbnN0YWxsZXIuZXh0ZXJuYWxzb3VyY2VzLmN0cyIKKyAgICAgICAgICBhbmRyb2lkOnRhcmdldFNhbmRib3hWZXJzaW9uPSIyIj4KIAogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVRVUVTVF9JTlNUQUxMX1BBQ0tBR0VTIiAvPgogCkBAIC0yMyw3ICsyNCw3IEBACiAgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIi8+CiAgICAgPC9hcHBsaWNhdGlvbj4KIAotICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmZ1bmN0aW9uYWxUZXN0PSJ0cnVlIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLnBhY2thZ2VpbnN0YWxsZXIuZXh0ZXJuYWxzb3VyY2VzLmN0cyIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkV4dGVybmFsIEFwcCBTb3VyY2VzIFRlc3RzIi8+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9wYWNrYWdlaW5zdGFsbGVyL2V4dGVybmFsc291cmNlcy9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy90ZXN0cy9wYWNrYWdlaW5zdGFsbGVyL2V4dGVybmFsc291cmNlcy9BbmRyb2lkVGVzdC54bWwKaW5kZXggMmQ3ODJkOC4uYTM5YmFhYiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvcGFja2FnZWluc3RhbGxlci9leHRlcm5hbHNvdXJjZXMvQW5kcm9pZFRlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL3BhY2thZ2VpbnN0YWxsZXIvZXh0ZXJuYWxzb3VyY2VzL0FuZHJvaWRUZXN0LnhtbApAQCAtMTUsNiArMTUsNyBAQAogLS0+CiAKIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBFeHRlcm5hbCBTb3VyY2VzIHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJmcmFtZXdvcmsiIC8+CiAKICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3BhY2thZ2VpbnN0YWxsZXIvZXh0ZXJuYWxzb3VyY2VzL3NyYy9hbmRyb2lkL3BhY2thZ2VpbnN0YWxsZXIvZXh0ZXJuYWxzb3VyY2VzL2N0cy9FeHRlcm5hbFNvdXJjZXNJbnN0YW50QXBwc1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3BhY2thZ2VpbnN0YWxsZXIvZXh0ZXJuYWxzb3VyY2VzL3NyYy9hbmRyb2lkL3BhY2thZ2VpbnN0YWxsZXIvZXh0ZXJuYWxzb3VyY2VzL2N0cy9FeHRlcm5hbFNvdXJjZXNJbnN0YW50QXBwc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGYxOWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvcGFja2FnZWluc3RhbGxlci9leHRlcm5hbHNvdXJjZXMvc3JjL2FuZHJvaWQvcGFja2FnZWluc3RhbGxlci9leHRlcm5hbHNvdXJjZXMvY3RzL0V4dGVybmFsU291cmNlc0luc3RhbnRBcHBzVGVzdC5qYXZhCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLnBhY2thZ2VpbnN0YWxsZXIuZXh0ZXJuYWxzb3VyY2VzLmN0czsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQXBwT3BzTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVJbnN0YW50OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkFwcE9wc1V0aWxzOworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKK0BTbWFsbFRlc3QKK0BBcHBNb2RlSW5zdGFudAorcHVibGljIGNsYXNzIEV4dGVybmFsU291cmNlc0luc3RhbnRBcHBzVGVzdCB7CisKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBQYWNrYWdlTWFuYWdlciBtUG07CisgICAgcHJpdmF0ZSBTdHJpbmcgbVBhY2thZ2VOYW1lOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1Db250ZXh0ID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0VGFyZ2V0Q29udGV4dCgpOworICAgICAgICBtUG0gPSBtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICBtUGFja2FnZU5hbWUgPSBtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRBcHBPcHNNb2RlKGludCBtb2RlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBBcHBPcHNVdGlscy5zZXRPcE1vZGUobVBhY2thZ2VOYW1lLCAiUkVRVUVTVF9JTlNUQUxMX1BBQ0tBR0VTIiwgbW9kZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBibG9ja2VkU291cmNlVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzZXRBcHBPcHNNb2RlKEFwcE9wc01hbmFnZXIuTU9ERV9FUlJPUkVEKTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBpc1RydXN0ZWQgPSBtUG0uY2FuUmVxdWVzdFBhY2thZ2VJbnN0YWxscygpOworICAgICAgICBhc3NlcnRGYWxzZSgiSW5zdGFudCBhcHAgIiArIG1QYWNrYWdlTmFtZSArICIgYWxsb3dlZCB0byBpbnN0YWxsIHBhY2thZ2VzIiwgaXNUcnVzdGVkKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGFsbG93ZWRTb3VyY2VUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHNldEFwcE9wc01vZGUoQXBwT3BzTWFuYWdlci5NT0RFX0FMTE9XRUQpOworICAgICAgICBmaW5hbCBib29sZWFuIGlzVHJ1c3RlZCA9IG1QbS5jYW5SZXF1ZXN0UGFja2FnZUluc3RhbGxzKCk7CisgICAgICAgIGFzc2VydEZhbHNlKCJJbnN0YW50IGFwcCAiICsgbVBhY2thZ2VOYW1lICsgIiBhbGxvd2VkIHRvIGluc3RhbGwgcGFja2FnZXMiLCBpc1RydXN0ZWQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZGVmYXVsdFNvdXJjZVRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc2V0QXBwT3BzTW9kZShBcHBPcHNNYW5hZ2VyLk1PREVfREVGQVVMVCk7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNUcnVzdGVkID0gbVBtLmNhblJlcXVlc3RQYWNrYWdlSW5zdGFsbHMoKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIkluc3RhbnQgYXBwICIgKyBtUGFja2FnZU5hbWUgKyAiIGFsbG93ZWQgdG8gaW5zdGFsbCBwYWNrYWdlcyIsIGlzVHJ1c3RlZCk7CisgICAgfQorCisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc2V0QXBwT3BzTW9kZShBcHBPcHNNYW5hZ2VyLk1PREVfREVGQVVMVCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcGFja2FnZWluc3RhbGxlci9leHRlcm5hbHNvdXJjZXMvc3JjL2FuZHJvaWQvcGFja2FnZWluc3RhbGxlci9leHRlcm5hbHNvdXJjZXMvY3RzL0V4dGVybmFsU291cmNlc1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3BhY2thZ2VpbnN0YWxsZXIvZXh0ZXJuYWxzb3VyY2VzL3NyYy9hbmRyb2lkL3BhY2thZ2VpbnN0YWxsZXIvZXh0ZXJuYWxzb3VyY2VzL2N0cy9FeHRlcm5hbFNvdXJjZXNUZXN0LmphdmEKaW5kZXggOTIxZjVmMS4uOWFmNmZhMyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvcGFja2FnZWluc3RhbGxlci9leHRlcm5hbHNvdXJjZXMvc3JjL2FuZHJvaWQvcGFja2FnZWluc3RhbGxlci9leHRlcm5hbHNvdXJjZXMvY3RzL0V4dGVybmFsU291cmNlc1Rlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9wYWNrYWdlaW5zdGFsbGVyL2V4dGVybmFsc291cmNlcy9zcmMvYW5kcm9pZC9wYWNrYWdlaW5zdGFsbGVyL2V4dGVybmFsc291cmNlcy9jdHMvRXh0ZXJuYWxTb3VyY2VzVGVzdC5qYXZhCkBAIC0xOSwxMiArMTksMTQgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUmVzb2x2ZUluZm87CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QudWlhdXRvbWF0b3IuVWlEZXZpY2U7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKIGltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CkBAIC0zNSwxMyArMzcsMTMgQEAKIAogQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKIEBTbWFsbFRlc3QKK0BBcHBNb2RlRnVsbAogcHVibGljIGNsYXNzIEV4dGVybmFsU291cmNlc1Rlc3QgewogCiAgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OwogICAgIHByaXZhdGUgUGFja2FnZU1hbmFnZXIgbVBtOwogICAgIHByaXZhdGUgU3RyaW5nIG1QYWNrYWdlTmFtZTsKICAgICBwcml2YXRlIFVpRGV2aWNlIG1VaURldmljZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUhhc0ZlYXR1cmU7CiAKICAgICBAQmVmb3JlCiAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTQ5LDcgKzUxLDYgQEAKICAgICAgICAgbVBtID0gbUNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKTsKICAgICAgICAgbVBhY2thZ2VOYW1lID0gbUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKTsKICAgICAgICAgbVVpRGV2aWNlID0gVWlEZXZpY2UuZ2V0SW5zdGFuY2UoSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkpOwotICAgICAgICBtSGFzRmVhdHVyZSA9ICFtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9XQVRDSCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHNldEFwcE9wc01vZGUoU3RyaW5nIG1vZGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC04Niw5ICs4Nyw2IEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RNYW5hZ2VVbmtub3duU291cmNlc0V4aXN0cygpIHsKLSAgICAgICAgaWYgKCFtSGFzRmVhdHVyZSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9CiAgICAgICAgIEludGVudCBtYW5hZ2VVbmtub3duU291cmNlcyA9IG5ldyBJbnRlbnQoU2V0dGluZ3MuQUNUSU9OX01BTkFHRV9VTktOT1dOX0FQUF9TT1VSQ0VTKTsKICAgICAgICAgUmVzb2x2ZUluZm8gaW5mbyA9IG1QbS5yZXNvbHZlQWN0aXZpdHkobWFuYWdlVW5rbm93blNvdXJjZXMsIDApOwogICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiTm8gYWN0aXZpdHkgZm91bmQgZm9yICIgKyBtYW5hZ2VVbmtub3duU291cmNlcy5nZXRBY3Rpb24oKSwgaW5mbyk7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uL0FuZHJvaWQubWsgYi90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uL0FuZHJvaWQubWsKaW5kZXggZTg2YTU2ZC4uMWVkZDc3NiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvcGVybWlzc2lvbi9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3Rlc3RzL3Blcm1pc3Npb24vQW5kcm9pZC5tawpAQCAtMjIsNyArMjIsNyBAQAogTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKIAogIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzIGN0c19pbnN0YW50CiAKICMgSW5jbHVkZSBib3RoIHRoZSAzMiBhbmQgNjQgYml0IHZlcnNpb25zCiBMT0NBTF9NVUxUSUxJQiA6PSBib3RoCkBAIC0zMCwxMSArMzAsMTAgQEAKIExPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IHRlbGVwaG9ueS1jb21tb24KIAogTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKLSAgICBjdHN0ZXN0cnVubmVyIFwKKyAgICBjdHN0ZXN0cnVubmVyLWF4dCBcCiAgICAgZ3VhdmEgXAogICAgIGFuZHJvaWQtZXgtY2FtZXJhMiBcCi0gICAgbGVnYWN5LWFuZHJvaWQtdGVzdCBcCi0gICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbAorICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0CiAKIExPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmN0c3Blcm1pc3Npb25fam5pIGxpYm5hdGl2ZWhlbHBlcl9jb21wYXRfbGliYysrCiAKQEAgLTQ0LDcgKzQzLDkgQEAKIAogIyB1bmNvbW1lbnQgd2hlbiBiLzEzMjQ5Nzc3IGlzIGZpeGVkCiAjTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAotTE9DQUxfSkFWQV9MSUJSQVJJRVMgKz0gYW5kcm9pZC50ZXN0LnJ1bm5lcgorTE9DQUxfUFJJVkFURV9QTEFURk9STV9BUElTIDo9IHRydWUKK0xPQ0FMX0pBVkFfTElCUkFSSUVTICs9IGFuZHJvaWQudGVzdC5ydW5uZXIuc3R1YnMKK0xPQ0FMX0pBVkFfTElCUkFSSUVTICs9IGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCiAKIGluY2x1ZGUgJChCVUlMRF9DVFNfUEFDS0FHRSkKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcGVybWlzc2lvbi9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdGVzdHMvcGVybWlzc2lvbi9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDhiMDgwMDkuLmU2ZDdhMGUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3Blcm1pc3Npb24vQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTE2LDcgKzE2LDMxIEBACiAgLS0+CiAKIDxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgcGFja2FnZT0iYW5kcm9pZC5wZXJtaXNzaW9uLmN0cyI+CisgICAgcGFja2FnZT0iYW5kcm9pZC5wZXJtaXNzaW9uLmN0cyIgYW5kcm9pZDp0YXJnZXRTYW5kYm94VmVyc2lvbj0iMiI+CisKKyAgICA8IS0tIGZvciBhbmRyb2lkLnBlcm1pc3Npb24uY3RzLlBlcm1pc3Npb25Hcm91cENoYW5nZSAtLT4KKyAgICA8cGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5jdHMuQiIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0iZGFuZ2Vyb3VzIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvcGVybV9iIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGVybWlzc2lvbkdyb3VwPSJhbmRyb2lkLnBlcm1pc3Npb24uY3RzLmdyb3VwQiIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmRlc2NyaXB0aW9uPSJAc3RyaW5nL3Blcm1fYiIgLz4KKworICAgIDwhLS0gZm9yIGFuZHJvaWQucGVybWlzc2lvbi5jdHMuUGVybWlzc2lvbkdyb3VwQ2hhbmdlIC0tPgorICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLmN0cy5DIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJkYW5nZXJvdXMiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9wZXJtX2MiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpwZXJtaXNzaW9uR3JvdXA9ImFuZHJvaWQucGVybWlzc2lvbi5jdHMuZ3JvdXBDIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZGVzY3JpcHRpb249IkBzdHJpbmcvcGVybV9jIiAvPgorCisgICAgPCEtLSBmb3IgYW5kcm9pZC5wZXJtaXNzaW9uLmN0cy5QZXJtaXNzaW9uR3JvdXBDaGFuZ2UgLS0+CisgICAgPHBlcm1pc3Npb24tZ3JvdXAgYW5kcm9pZDpkZXNjcmlwdGlvbj0iQHN0cmluZy9wZXJtX2dyb3VwX2IiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9wZXJtX2dyb3VwX2IiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uY3RzLmdyb3VwQiIgLz4KKworICAgIDwhLS0gZm9yIGFuZHJvaWQucGVybWlzc2lvbi5jdHMuUGVybWlzc2lvbkdyb3VwQ2hhbmdlIC0tPgorICAgIDxwZXJtaXNzaW9uLWdyb3VwIGFuZHJvaWQ6ZGVzY3JpcHRpb249IkBzdHJpbmcvcGVybV9ncm91cF9jIgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvcGVybV9ncm91cF9jIgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLmN0cy5ncm91cEMiIC8+CiAKICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLklOSkVDVF9FVkVOVFMiIC8+CiAgICAgPGFwcGxpY2F0aW9uPgpAQCAtNDAsNyArNjQsNyBAQAogICAgICAgICBwYWNrYWdlLiBUaGF0IHJ1bm5lciBjYW5ub3QgYmUgYWRkZWQgdG8gdGhpcyBwYWNrYWdlIGVpdGhlciwgc2luY2UgaXQKICAgICAgICAgcmVsaWVzIG9uIGhpZGRlbiBBUElzLgogICAgIC0tPgotICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQucGVybWlzc2lvbi5jdHMiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgdGVzdHMgb2YgYW5kcm9pZC5wZXJtaXNzaW9uIj4KICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9Imxpc3RlbmVyIgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcGVybWlzc2lvbi9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uL0FuZHJvaWRUZXN0LnhtbAppbmRleCBiOTljYmMyLi5jNTE2YTYwIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uL0FuZHJvaWRUZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uL0FuZHJvaWRUZXN0LnhtbApAQCAtMTQsMTMgKzE0LDM1IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgUGVybWlzc2lvbiB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iZnJhbWV3b3JrIiAvPgorCisgICAgPCEtLSBJbnN0YWxsIG1haW4gdGVzdCBzdWl0ZSBhcGsgLS0+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CiAgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c1Blcm1pc3Npb25UZXN0Q2FzZXMuYXBrIiAvPgogICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorCisgICAgPCEtLSBDcmVhdGUgcGxhY2UgdG8gc3RvcmUgYXBrcyAtLT4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlJ1bkNvbW1hbmRUYXJnZXRQcmVwYXJlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVuLWNvbW1hbmQiIHZhbHVlPSJta2RpciAtcCAvZGF0YS9sb2NhbC90bXAvY3RzL3Blcm1pc3Npb25zIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlYXJkb3duLWNvbW1hbmQiIHZhbHVlPSJybSAtcmYgL2RhdGEvbG9jYWwvdG1wL2N0cyIvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorCisgICAgPCEtLSBMb2FkIGFkZGl0aW9uYWwgQVBLcyBvbnRvIGRldmljZSAtLT4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50YXJnZXRwcmVwLkZpbGVQdXNoZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJDdHNBcHBUaGF0UmVxdWVzdHNQZXJtaXNzaW9uQWFuZEIuYXBrLT4vZGF0YS9sb2NhbC90bXAvY3RzL3Blcm1pc3Npb25zL0N0c0FwcFRoYXRSZXF1ZXN0c1Blcm1pc3Npb25BYW5kQi5hcGsiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9IkN0c0FwcFRoYXRSZXF1ZXN0c1Blcm1pc3Npb25BYW5kQy5hcGstPi9kYXRhL2xvY2FsL3RtcC9jdHMvcGVybWlzc2lvbnMvQ3RzQXBwVGhhdFJlcXVlc3RzUGVybWlzc2lvbkFhbmRDLmFwayIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKworICAgIDwhLS0gUmVtb3ZlIGFkZGl0aW9uYWwgYXBwcyBpZiBpbnN0YWxsZWQgLS0+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5SdW5Db21tYW5kVGFyZ2V0UHJlcGFyZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlYXJkb3duLWNvbW1hbmQiIHZhbHVlPSJwbSB1bmluc3RhbGwgYW5kcm9pZC5wZXJtaXNzaW9uLmN0cy5hcHB0aGF0cmVxdWVzdHBlcm1pc3Npb24iIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisKICAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuQW5kcm9pZEpVbml0VGVzdCIgPgogICAgICAgICA8b3B0aW9uIG5hbWU9InBhY2thZ2UiIHZhbHVlPSJhbmRyb2lkLnBlcm1pc3Npb24uY3RzIiAvPgogICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjEzbSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJoaWRkZW4tYXBpLWNoZWNrcyIgdmFsdWU9ImZhbHNlIiAvPgogICAgIDwvdGVzdD4KIDwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3Blcm1pc3Npb24vQXBwVGhhdFJlcXVlc3RQZXJtaXNzaW9uQWFuZEIvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL3Blcm1pc3Npb24vQXBwVGhhdFJlcXVlc3RQZXJtaXNzaW9uQWFuZEIvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzRlZGFiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvcGVybWlzc2lvbi9BcHBUaGF0UmVxdWVzdFBlcm1pc3Npb25BYW5kQi9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzIgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CisKK0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCisKKyMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzIGN0c19pbnN0YW50CisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c0FwcFRoYXRSZXF1ZXN0c1Blcm1pc3Npb25BYW5kQgorCitpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uL0FwcFRoYXRSZXF1ZXN0UGVybWlzc2lvbkFhbmRCL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uL0FwcFRoYXRSZXF1ZXN0UGVybWlzc2lvbkFhbmRCL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM4NWEyNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3Blcm1pc3Npb24vQXBwVGhhdFJlcXVlc3RQZXJtaXNzaW9uQWFuZEIvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDM1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iYW5kcm9pZC5wZXJtaXNzaW9uLmN0cy5hcHB0aGF0cmVxdWVzdHBlcm1pc3Npb24iPgorCisgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uY3RzLmFwcHRoYXRyZXF1ZXN0cGVybWlzc2lvbi5BIgorICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0iZGFuZ2Vyb3VzIgorICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3Blcm1fYSIKKyAgICAgICAgYW5kcm9pZDpwZXJtaXNzaW9uR3JvdXA9ImFuZHJvaWQucGVybWlzc2lvbi5jdHMuZ3JvdXBCIgorICAgICAgICBhbmRyb2lkOmRlc2NyaXB0aW9uPSJAc3RyaW5nL3Blcm1fYSIgLz4KKworICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uY3RzLmFwcHRoYXRyZXF1ZXN0cGVybWlzc2lvbi5BIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uY3RzLkIiIC8+CisKKyAgICA8YXBwbGljYXRpb24+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5SZXF1ZXN0UGVybWlzc2lvbiIgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJsZVRvSW5zdGFudEFwcHM9InRydWUiIC8+CisgICAgPC9hcHBsaWNhdGlvbj4KKzwvbWFuaWZlc3Q+CisKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3Blcm1pc3Npb24vQXBwVGhhdFJlcXVlc3RQZXJtaXNzaW9uQWFuZEIvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL3Rlc3RzL3Rlc3RzL3Blcm1pc3Npb24vQXBwVGhhdFJlcXVlc3RQZXJtaXNzaW9uQWFuZEIvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjMwMDk3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvcGVybWlzc2lvbi9BcHBUaGF0UmVxdWVzdFBlcm1pc3Npb25BYW5kQi9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsMTkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0icGVybV9hIj5QZXJtaXNzaW9uIEE8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcGVybWlzc2lvbi9BcHBUaGF0UmVxdWVzdFBlcm1pc3Npb25BYW5kQi9zcmMvYW5kcm9pZC9wZXJtaXNzaW9uL2N0cy9hcHB0aGF0cmVxdWVzdHBlcm1pc3Npb24vUmVxdWVzdFBlcm1pc3Npb24uamF2YSBiL3Rlc3RzL3Rlc3RzL3Blcm1pc3Npb24vQXBwVGhhdFJlcXVlc3RQZXJtaXNzaW9uQWFuZEIvc3JjL2FuZHJvaWQvcGVybWlzc2lvbi9jdHMvYXBwdGhhdHJlcXVlc3RwZXJtaXNzaW9uL1JlcXVlc3RQZXJtaXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY2NzFiZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3Blcm1pc3Npb24vQXBwVGhhdFJlcXVlc3RQZXJtaXNzaW9uQWFuZEIvc3JjL2FuZHJvaWQvcGVybWlzc2lvbi9jdHMvYXBwdGhhdHJlcXVlc3RwZXJtaXNzaW9uL1JlcXVlc3RQZXJtaXNzaW9uLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5wZXJtaXNzaW9uLmN0cy5hcHB0aGF0cmVxdWVzdHBlcm1pc3Npb247CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKKworcHVibGljIGNsYXNzIFJlcXVlc3RQZXJtaXNzaW9uIGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICByZXF1ZXN0UGVybWlzc2lvbnMobmV3IFN0cmluZ1tdIHsiYW5kcm9pZC5wZXJtaXNzaW9uLmN0cy5hcHB0aGF0cmVxdWVzdHBlcm1pc3Npb24uQSIsCisgICAgICAgICAgICAgICAgImFuZHJvaWQucGVybWlzc2lvbi5jdHMuQiJ9LCAwKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uL0FwcFRoYXRSZXF1ZXN0UGVybWlzc2lvbkFhbmRDL0FuZHJvaWQubWsgYi90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uL0FwcFRoYXRSZXF1ZXN0UGVybWlzc2lvbkFhbmRDL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ1OTU1OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3Blcm1pc3Npb24vQXBwVGhhdFJlcXVlc3RQZXJtaXNzaW9uQWFuZEMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDMyIEBACisjCisjIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQorCisjIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0CitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cyBjdHNfaW5zdGFudAorCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNBcHBUaGF0UmVxdWVzdHNQZXJtaXNzaW9uQWFuZEMKKworaW5jbHVkZSAkKEJVSUxEX0NUU19QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcGVybWlzc2lvbi9BcHBUaGF0UmVxdWVzdFBlcm1pc3Npb25BYW5kQy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdGVzdHMvcGVybWlzc2lvbi9BcHBUaGF0UmVxdWVzdFBlcm1pc3Npb25BYW5kQy9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliOTk4MzEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uL0FwcFRoYXRSZXF1ZXN0UGVybWlzc2lvbkFhbmRDL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwzNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImFuZHJvaWQucGVybWlzc2lvbi5jdHMuYXBwdGhhdHJlcXVlc3RwZXJtaXNzaW9uIj4KKworICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLmN0cy5hcHB0aGF0cmVxdWVzdHBlcm1pc3Npb24uQSIKKyAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9ImRhbmdlcm91cyIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9wZXJtX2EiCisgICAgICAgIGFuZHJvaWQ6cGVybWlzc2lvbkdyb3VwPSJhbmRyb2lkLnBlcm1pc3Npb24uY3RzLmdyb3VwQyIKKyAgICAgICAgYW5kcm9pZDpkZXNjcmlwdGlvbj0iQHN0cmluZy9wZXJtX2EiIC8+CisKKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLmN0cy5hcHB0aGF0cmVxdWVzdHBlcm1pc3Npb24uQSIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLmN0cy5DIiAvPgorCisgICAgPGFwcGxpY2F0aW9uPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuUmVxdWVzdFBlcm1pc3Npb24iIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2libGVUb0luc3RhbnRBcHBzPSJ0cnVlIiAvPgorICAgIDwvYXBwbGljYXRpb24+Cis8L21hbmlmZXN0PgorCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uL0FwcFRoYXRSZXF1ZXN0UGVybWlzc2lvbkFhbmRDL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uL0FwcFRoYXRSZXF1ZXN0UGVybWlzc2lvbkFhbmRDL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYzMDA5NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3Blcm1pc3Npb24vQXBwVGhhdFJlcXVlc3RQZXJtaXNzaW9uQWFuZEMvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDE5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cmVzb3VyY2VzIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1fYSI+UGVybWlzc2lvbiBBPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3Blcm1pc3Npb24vQXBwVGhhdFJlcXVlc3RQZXJtaXNzaW9uQWFuZEMvc3JjL2FuZHJvaWQvcGVybWlzc2lvbi9jdHMvYXBwdGhhdHJlcXVlc3RwZXJtaXNzaW9uL1JlcXVlc3RQZXJtaXNzaW9uLmphdmEgYi90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uL0FwcFRoYXRSZXF1ZXN0UGVybWlzc2lvbkFhbmRDL3NyYy9hbmRyb2lkL3Blcm1pc3Npb24vY3RzL2FwcHRoYXRyZXF1ZXN0cGVybWlzc2lvbi9SZXF1ZXN0UGVybWlzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNzJjNGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uL0FwcFRoYXRSZXF1ZXN0UGVybWlzc2lvbkFhbmRDL3NyYy9hbmRyb2lkL3Blcm1pc3Npb24vY3RzL2FwcHRoYXRyZXF1ZXN0cGVybWlzc2lvbi9SZXF1ZXN0UGVybWlzc2lvbi5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQucGVybWlzc2lvbi5jdHMuYXBwdGhhdHJlcXVlc3RwZXJtaXNzaW9uOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CisKK3B1YmxpYyBjbGFzcyBSZXF1ZXN0UGVybWlzc2lvbiBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgcmVxdWVzdFBlcm1pc3Npb25zKG5ldyBTdHJpbmdbXSB7ImFuZHJvaWQucGVybWlzc2lvbi5jdHMuYXBwdGhhdHJlcXVlc3RwZXJtaXNzaW9uLkEiLAorICAgICAgICAgICAgICAgICJhbmRyb2lkLnBlcm1pc3Npb24uY3RzLkMifSwgMCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcGVybWlzc2lvbi9qbmkvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL3Blcm1pc3Npb24vam5pL0FuZHJvaWQubWsKaW5kZXggMmU2NGQ0Ny4uOTZiNzUwNiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvcGVybWlzc2lvbi9qbmkvQW5kcm9pZC5taworKysgYi90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uL2puaS9BbmRyb2lkLm1rCkBAIC0yOCw5ICsyOCw5IEBACiBMT0NBTF9DX0lOQ0xVREVTIDo9ICQoSk5JX0hfSU5DTFVERSkgCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGlibmF0aXZlaGVscGVyX2NvbXBhdF9saWJjKysgbGlibG9nCi1MT0NBTF9TREtfVkVSU0lPTiA6PSAyMwogTE9DQUxfQ1BQRkxBR1MgOj0gLXN0ZD1nbnUrKzExCitMT0NBTF9DWFhfU1RMIDo9IGxpYmMrK19zdGF0aWMKIAotTE9DQUxfQ0ZMQUdTIDo9IC1Xbm8tdW51c2VkLXBhcmFtZXRlcgorTE9DQUxfQ0ZMQUdTIDo9IC1Xbm8tdW51c2VkLXBhcmFtZXRlciAtV2FsbCAtV2Vycm9yCiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3Blcm1pc3Npb24vam5pL2FuZHJvaWRfcGVybWlzc2lvbl9jdHNfRmlsZVV0aWxzLmNwcCBiL3Rlc3RzL3Rlc3RzL3Blcm1pc3Npb24vam5pL2FuZHJvaWRfcGVybWlzc2lvbl9jdHNfRmlsZVV0aWxzLmNwcAppbmRleCAwNTQ3YmU0Li42OGMzYzc2IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uL2puaS9hbmRyb2lkX3Blcm1pc3Npb25fY3RzX0ZpbGVVdGlscy5jcHAKKysrIGIvdGVzdHMvdGVzdHMvcGVybWlzc2lvbi9qbmkvYW5kcm9pZF9wZXJtaXNzaW9uX2N0c19GaWxlVXRpbHMuY3BwCkBAIC0yNSw5ICsyNSw5IEBACiAjaW5jbHVkZSA8Z3JwLmg+CiAjaW5jbHVkZSA8cHdkLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8U2NvcGVkTG9jYWxSZWYuaD4KLSNpbmNsdWRlIDxTY29wZWRQcmltaXRpdmVBcnJheS5oPgotI2luY2x1ZGUgPFNjb3BlZFV0ZkNoYXJzLmg+CisjaW5jbHVkZSA8bmF0aXZlaGVscGVyL1Njb3BlZExvY2FsUmVmLmg+CisjaW5jbHVkZSA8bmF0aXZlaGVscGVyL1Njb3BlZFByaW1pdGl2ZUFycmF5Lmg+CisjaW5jbHVkZSA8bmF0aXZlaGVscGVyL1Njb3BlZFV0ZkNoYXJzLmg+CiAKIHN0YXRpYyBqZmllbGRJRCBnRmlsZVN0YXR1c0RldkZpZWxkSUQ7CiBzdGF0aWMgamZpZWxkSUQgZ0ZpbGVTdGF0dXNJbm9GaWVsZElEOwpAQCAtMTA2LDcgKzEwNiw3IEBACiAgICAgewogICAgICAgICAgIF9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfREVCVUcsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAiaXNQZXJtaXR0ZWRDYXBCaXRTZXQoKTogZ2V0eGF0dHIoXCIlc1wiKSBjYWxsIGZhaWxlZDogIgotICAgICAgICAgICAgICAgICAgInJldHVybiAlZCAoZXJyb3I6ICVzICglZCkpXG4iLAorICAgICAgICAgICAgICAgICAgInJldHVybiAlemQgKGVycm9yOiAlcyAoJWQpKVxuIiwKICAgICAgICAgICAgICAgICAgIGNQYXRoLmNfc3RyKCksIHJlc3VsdCwgc3RyZXJyb3IoZXJybm8pLCBlcnJubyk7CiAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTE3Myw3ICsxNzMsNyBAQAogICAgIHN0cnVjdCB2ZnNfY2FwX2RhdGEgZXhwZWN0ZWRDYXBEYXRhOwogICAgIG1lbXNldCgmZXhwZWN0ZWRDYXBEYXRhLCAwLCBzaXplb2YoZXhwZWN0ZWRDYXBEYXRhKSk7CiAKLSAgICBleHBlY3RlZENhcERhdGEubWFnaWNfZXRjID0gVkZTX0NBUF9SRVZJU0lPTiB8IFZGU19DQVBfRkxBR1NfRUZGRUNUSVZFOworICAgIGV4cGVjdGVkQ2FwRGF0YS5tYWdpY19ldGMgPSBWRlNfQ0FQX1JFVklTSU9OXzIgfCBWRlNfQ0FQX0ZMQUdTX0VGRkVDVElWRTsKICAgICBpZiAoIWZpbGxQZXJtaXR0ZWRDYXBzKCZleHBlY3RlZENhcERhdGEsIGVudiwgY2FwSWRzKSkKICAgICB7CiAgICAgICAgIC8vIGV4Y2VwdGlvbiB0aHJvd24KQEAgLTE5MCw3ICsxOTAsNyBAQAogICAgIHsKICAgICAgICAgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19ERUJVRywgTlVMTCwKICAgICAgICAgICAgICAgICAiZmlsZUhhc09ubHkoKTogZ2V0eGF0dHIoXCIlc1wiKSBjYWxsIGZhaWxlZDogIgotICAgICAgICAgICAgICAgICJyZXR1cm4gJWQgKGVycm9yOiAlcyAoJWQpKVxuIiwKKyAgICAgICAgICAgICAgICAicmV0dXJuICV6ZCAoZXJyb3I6ICVzICglZCkpXG4iLAogICAgICAgICAgICAgICAgIGNQYXRoLmNfc3RyKCksIHJlc3VsdCwgc3RyZXJyb3IoZXJybm8pLCBlcnJubyk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmViYjE3OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3Blcm1pc3Npb24vcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cmVzb3VyY2VzIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1fYiI+UGVybWlzc2lvbiBCPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtX2MiPlBlcm1pc3Npb24gQzwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybV9ncm91cF9iIj5QZXJtaXNzaW9uIGdyb3VwIEI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1fZ3JvdXBfYyI+UGVybWlzc2lvbiBncm91cCBCPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3Blcm1pc3Npb24vc3JjL2FuZHJvaWQvcGVybWlzc2lvbi9jdHMvQXBwSWRsZVN0YXRlUGVybWlzc2lvblRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3Blcm1pc3Npb24vc3JjL2FuZHJvaWQvcGVybWlzc2lvbi9jdHMvQXBwSWRsZVN0YXRlUGVybWlzc2lvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzYzMWJjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvcGVybWlzc2lvbi9zcmMvYW5kcm9pZC9wZXJtaXNzaW9uL2N0cy9BcHBJZGxlU3RhdGVQZXJtaXNzaW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLnBlcm1pc3Npb24uY3RzOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlSW5mbzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Vc2VySGFuZGxlOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBCdWlsZCwgaW5zdGFsbCBhbmQgcnVuIHRlc3RzIHdpdGggZm9sbG93aW5nIGNvbW1hbmQ6CisgKiBhdGVzdCBBcHBJZGxlU3RhdGVQZXJtaXNzaW9uVGVzdAorICovCitAU21hbGxUZXN0CitAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIEFwcElkbGVTdGF0ZVBlcm1pc3Npb25UZXN0IHsKKworICAgIC8qKgorICAgICAqIFZlcmlmeSB0aGF0IHRoZSB7QGxpbmsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI0NIQU5HRV9BUFBfSURMRV9TVEFURX0KKyAgICAgKiBwZXJtaXNzaW9uIGlzIG9ubHkgaGVsZCBieSBhdCBtb3N0IG9uZSBwYWNrYWdlLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENoYW5nZUFwcElkbGVTdGF0ZVBlcm1pc3Npb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUGFja2FnZU1hbmFnZXIgcG0gPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCkuZ2V0UGFja2FnZU1hbmFnZXIoKTsKKyAgICAgICAgZmluYWwgTGlzdDxQYWNrYWdlSW5mbz4gaG9sZGluZyA9IHBtLmdldFBhY2thZ2VzSG9sZGluZ1Blcm1pc3Npb25zKG5ldyBTdHJpbmdbXXsKKyAgICAgICAgICAgICAgICBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQ0hBTkdFX0FQUF9JRExFX1NUQVRFCisgICAgICAgIH0sIFBhY2thZ2VNYW5hZ2VyLk1BVENIX1NZU1RFTV9PTkxZKTsKKworICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICBTdHJpbmcgcGtnTmFtZXMgPSAiIjsKKyAgICAgICAgZm9yIChQYWNrYWdlSW5mbyBwa2cgOiBob2xkaW5nKSB7CisgICAgICAgICAgICBpbnQgdWlkID0gcG0uZ2V0QXBwbGljYXRpb25JbmZvKHBrZy5wYWNrYWdlTmFtZSwgMCkudWlkOworICAgICAgICAgICAgaWYgKFVzZXJIYW5kbGUuaXNBcHAodWlkKSkgeworICAgICAgICAgICAgICAgIHBrZ05hbWVzICs9IHBrZy5wYWNrYWdlTmFtZSArICJcbiI7CisgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoY291bnQgPiAxKSB7CisgICAgICAgICAgICBmYWlsKCJPbmx5IG9uZSBhcHAgbWF5IGhvbGQgdGhlIENIQU5HRV9BUFBfSURMRV9TVEFURSBwZXJtaXNzaW9uOyBmb3VuZCBwYWNrYWdlczogXG4iCisgICAgICAgICAgICAgICAgICAgICsgcGtnTmFtZXMpOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3Blcm1pc3Npb24vc3JjL2FuZHJvaWQvcGVybWlzc2lvbi9jdHMvQXBwT3BzVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvcGVybWlzc2lvbi9zcmMvYW5kcm9pZC9wZXJtaXNzaW9uL2N0cy9BcHBPcHNUZXN0LmphdmEKaW5kZXggYzI5ZDVmNS4uNzQ1ZDg1OSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvcGVybWlzc2lvbi9zcmMvYW5kcm9pZC9wZXJtaXNzaW9uL2N0cy9BcHBPcHNUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvcGVybWlzc2lvbi9zcmMvYW5kcm9pZC9wZXJtaXNzaW9uL2N0cy9BcHBPcHNUZXN0LmphdmEKQEAgLTE2LDU5ICsxNiwyOTAgQEAKIAogcGFja2FnZSBhbmRyb2lkLnBlcm1pc3Npb24uY3RzOwogCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLkFwcE9wc01hbmFnZXIuTU9ERV9BTExPV0VEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5BcHBPcHNNYW5hZ2VyLk1PREVfREVGQVVMVDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuQXBwT3BzTWFuYWdlci5NT0RFX0VSUk9SRUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLkFwcE9wc01hbmFnZXIuTU9ERV9JR05PUkVEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5BcHBPcHNNYW5hZ2VyLk9QU1RSX1JFQURfQ0FMRU5EQVI7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLkFwcE9wc01hbmFnZXIuT1BTVFJfUkVBRF9TTVM7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLkFwcE9wc01hbmFnZXIuT1BTVFJfUkVDT1JEX0FVRElPOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkFwcE9wc1V0aWxzLmFsbG93ZWRPcGVyYXRpb25Mb2dnZWQ7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQXBwT3BzVXRpbHMucmVqZWN0ZWRPcGVyYXRpb25Mb2dnZWQ7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQXBwT3BzVXRpbHMuc2V0T3BNb2RlOworCitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ubW9jazsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5yZXNldDsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by50aW1lb3V0OworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnZlcmlmeTsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by52ZXJpZnlaZXJvSW50ZXJhY3Rpb25zOworCitpbXBvcnQgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uOwogaW1wb3J0IGFuZHJvaWQuYXBwLkFwcE9wc01hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5hcHAuQXBwT3BzTWFuYWdlci5Pbk9wQ2hhbmdlZExpc3RlbmVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CitpbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOworaW1wb3J0IGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yOwogCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5BcHBPcHNVdGlsczsKIAotcHVibGljIGNsYXNzIEFwcE9wc1Rlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgewotICAgIHN0YXRpYyBmaW5hbCBDbGFzczw/PltdIHNTZXRNb2RlU2lnbmF0dXJlID0gbmV3IENsYXNzW10gewotICAgICAgICAgICAgQ29udGV4dC5jbGFzcywgQXR0cmlidXRlU2V0LmNsYXNzfTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK3B1YmxpYyBjbGFzcyBBcHBPcHNUZXN0IGV4dGVuZHMgSW5zdHJ1bWVudGF0aW9uVGVzdENhc2UgeworICAgIC8vIE5vdGlmeWluZyBPbk9wQ2hhbmdlZExpc3RlbmVyIGNhbGxiYWNrcyBpcyBhbiBhc3luYyBvcGVyYXRpb24sIHNvIHdlIGRlZmluZSBhIHRpbWVvdXQuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PREVfV0FUQ0hFUl9USU1FT1VUX01TID0gNTAwMDsKIAogICAgIHByaXZhdGUgQXBwT3BzTWFuYWdlciBtQXBwT3BzOworICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKKyAgICBwcml2YXRlIFN0cmluZyBtT3BQYWNrYWdlTmFtZTsKKyAgICBwcml2YXRlIGludCBtTXlVaWQ7CisKKyAgICAvLyBUaGVzZSBwZXJtaXNzaW9ucyBhbmQgb3BTdHJzIG11c3QgbWFwIHRvIHRoZSBzYW1lIG9wIGNvZGVzLgorICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gcGVybWlzc2lvblRvT3BTdHIgPSBuZXcgSGFzaE1hcDw+KCk7CisKKyAgICBzdGF0aWMgeworICAgICAgICBwZXJtaXNzaW9uVG9PcFN0ci5wdXQocGVybWlzc2lvbi5BQ0NFU1NfQ09BUlNFX0xPQ0FUSU9OLAorICAgICAgICAgICAgICAgIEFwcE9wc01hbmFnZXIuT1BTVFJfQ09BUlNFX0xPQ0FUSU9OKTsKKyAgICAgICAgcGVybWlzc2lvblRvT3BTdHIucHV0KHBlcm1pc3Npb24uQUNDRVNTX0ZJTkVfTE9DQVRJT04sIEFwcE9wc01hbmFnZXIuT1BTVFJfRklORV9MT0NBVElPTik7CisgICAgICAgIHBlcm1pc3Npb25Ub09wU3RyLnB1dChwZXJtaXNzaW9uLlJFQURfQ09OVEFDVFMsIEFwcE9wc01hbmFnZXIuT1BTVFJfUkVBRF9DT05UQUNUUyk7CisgICAgICAgIHBlcm1pc3Npb25Ub09wU3RyLnB1dChwZXJtaXNzaW9uLldSSVRFX0NPTlRBQ1RTLCBBcHBPcHNNYW5hZ2VyLk9QU1RSX1dSSVRFX0NPTlRBQ1RTKTsKKyAgICAgICAgcGVybWlzc2lvblRvT3BTdHIucHV0KHBlcm1pc3Npb24uUkVBRF9DQUxMX0xPRywgQXBwT3BzTWFuYWdlci5PUFNUUl9SRUFEX0NBTExfTE9HKTsKKyAgICAgICAgcGVybWlzc2lvblRvT3BTdHIucHV0KHBlcm1pc3Npb24uV1JJVEVfQ0FMTF9MT0csIEFwcE9wc01hbmFnZXIuT1BTVFJfV1JJVEVfQ0FMTF9MT0cpOworICAgICAgICBwZXJtaXNzaW9uVG9PcFN0ci5wdXQocGVybWlzc2lvbi5SRUFEX0NBTEVOREFSLCBBcHBPcHNNYW5hZ2VyLk9QU1RSX1JFQURfQ0FMRU5EQVIpOworICAgICAgICBwZXJtaXNzaW9uVG9PcFN0ci5wdXQocGVybWlzc2lvbi5XUklURV9DQUxFTkRBUiwgQXBwT3BzTWFuYWdlci5PUFNUUl9XUklURV9DQUxFTkRBUik7CisgICAgICAgIHBlcm1pc3Npb25Ub09wU3RyLnB1dChwZXJtaXNzaW9uLkNBTExfUEhPTkUsIEFwcE9wc01hbmFnZXIuT1BTVFJfQ0FMTF9QSE9ORSk7CisgICAgICAgIHBlcm1pc3Npb25Ub09wU3RyLnB1dChwZXJtaXNzaW9uLlJFQURfU01TLCBBcHBPcHNNYW5hZ2VyLk9QU1RSX1JFQURfU01TKTsKKyAgICAgICAgcGVybWlzc2lvblRvT3BTdHIucHV0KHBlcm1pc3Npb24uUkVDRUlWRV9TTVMsIEFwcE9wc01hbmFnZXIuT1BTVFJfUkVDRUlWRV9TTVMpOworICAgICAgICBwZXJtaXNzaW9uVG9PcFN0ci5wdXQocGVybWlzc2lvbi5SRUNFSVZFX01NUywgQXBwT3BzTWFuYWdlci5PUFNUUl9SRUNFSVZFX01NUyk7CisgICAgICAgIHBlcm1pc3Npb25Ub09wU3RyLnB1dChwZXJtaXNzaW9uLlJFQ0VJVkVfV0FQX1BVU0gsIEFwcE9wc01hbmFnZXIuT1BTVFJfUkVDRUlWRV9XQVBfUFVTSCk7CisgICAgICAgIHBlcm1pc3Npb25Ub09wU3RyLnB1dChwZXJtaXNzaW9uLlNFTkRfU01TLCBBcHBPcHNNYW5hZ2VyLk9QU1RSX1NFTkRfU01TKTsKKyAgICAgICAgcGVybWlzc2lvblRvT3BTdHIucHV0KHBlcm1pc3Npb24uUkVBRF9TTVMsIEFwcE9wc01hbmFnZXIuT1BTVFJfUkVBRF9TTVMpOworICAgICAgICBwZXJtaXNzaW9uVG9PcFN0ci5wdXQocGVybWlzc2lvbi5XUklURV9TRVRUSU5HUywgQXBwT3BzTWFuYWdlci5PUFNUUl9XUklURV9TRVRUSU5HUyk7CisgICAgICAgIHBlcm1pc3Npb25Ub09wU3RyLnB1dChwZXJtaXNzaW9uLlNZU1RFTV9BTEVSVF9XSU5ET1csCisgICAgICAgICAgICAgICAgQXBwT3BzTWFuYWdlci5PUFNUUl9TWVNURU1fQUxFUlRfV0lORE9XKTsKKyAgICAgICAgcGVybWlzc2lvblRvT3BTdHIucHV0KHBlcm1pc3Npb24uQUNDRVNTX05PVElGSUNBVElPTlMsCisgICAgICAgICAgICAgICAgQXBwT3BzTWFuYWdlci5PUFNUUl9BQ0NFU1NfTk9USUZJQ0FUSU9OUyk7CisgICAgICAgIHBlcm1pc3Npb25Ub09wU3RyLnB1dChwZXJtaXNzaW9uLkNBTUVSQSwgQXBwT3BzTWFuYWdlci5PUFNUUl9DQU1FUkEpOworICAgICAgICBwZXJtaXNzaW9uVG9PcFN0ci5wdXQocGVybWlzc2lvbi5SRUNPUkRfQVVESU8sIEFwcE9wc01hbmFnZXIuT1BTVFJfUkVDT1JEX0FVRElPKTsKKyAgICAgICAgcGVybWlzc2lvblRvT3BTdHIucHV0KHBlcm1pc3Npb24uUkVBRF9QSE9ORV9TVEFURSwgQXBwT3BzTWFuYWdlci5PUFNUUl9SRUFEX1BIT05FX1NUQVRFKTsKKyAgICAgICAgcGVybWlzc2lvblRvT3BTdHIucHV0KHBlcm1pc3Npb24uQUREX1ZPSUNFTUFJTCwgQXBwT3BzTWFuYWdlci5PUFNUUl9BRERfVk9JQ0VNQUlMKTsKKyAgICAgICAgcGVybWlzc2lvblRvT3BTdHIucHV0KHBlcm1pc3Npb24uVVNFX1NJUCwgQXBwT3BzTWFuYWdlci5PUFNUUl9VU0VfU0lQKTsKKyAgICAgICAgcGVybWlzc2lvblRvT3BTdHIucHV0KHBlcm1pc3Npb24uUFJPQ0VTU19PVVRHT0lOR19DQUxMUywKKyAgICAgICAgICAgICAgICBBcHBPcHNNYW5hZ2VyLk9QU1RSX1BST0NFU1NfT1VUR09JTkdfQ0FMTFMpOworICAgICAgICBwZXJtaXNzaW9uVG9PcFN0ci5wdXQocGVybWlzc2lvbi5CT0RZX1NFTlNPUlMsIEFwcE9wc01hbmFnZXIuT1BTVFJfQk9EWV9TRU5TT1JTKTsKKyAgICAgICAgcGVybWlzc2lvblRvT3BTdHIucHV0KHBlcm1pc3Npb24uUkVBRF9DRUxMX0JST0FEQ0FTVFMsCisgICAgICAgICAgICAgICAgQXBwT3BzTWFuYWdlci5PUFNUUl9SRUFEX0NFTExfQlJPQURDQVNUUyk7CisgICAgICAgIHBlcm1pc3Npb25Ub09wU3RyLnB1dChwZXJtaXNzaW9uLlJFQURfRVhURVJOQUxfU1RPUkFHRSwKKyAgICAgICAgICAgICAgICBBcHBPcHNNYW5hZ2VyLk9QU1RSX1JFQURfRVhURVJOQUxfU1RPUkFHRSk7CisgICAgICAgIHBlcm1pc3Npb25Ub09wU3RyLnB1dChwZXJtaXNzaW9uLldSSVRFX0VYVEVSTkFMX1NUT1JBR0UsCisgICAgICAgICAgICAgICAgQXBwT3BzTWFuYWdlci5PUFNUUl9XUklURV9FWFRFUk5BTF9TVE9SQUdFKTsKKyAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBtQXBwT3BzID0gKEFwcE9wc01hbmFnZXIpZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BUFBfT1BTX1NFUlZJQ0UpOworICAgICAgICBtQ29udGV4dCA9IGdldEluc3RydW1lbnRhdGlvbigpLmdldENvbnRleHQoKTsKKyAgICAgICAgbUFwcE9wcyA9IChBcHBPcHNNYW5hZ2VyKSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQVBQX09QU19TRVJWSUNFKTsKKyAgICAgICAgbU9wUGFja2FnZU5hbWUgPSBtQ29udGV4dC5nZXRPcFBhY2thZ2VOYW1lKCk7CisgICAgICAgIG1NeVVpZCA9IFByb2Nlc3MubXlVaWQoKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChtQXBwT3BzKTsKKworICAgICAgICAvLyBSZXNldCBhcHAgb3BzIHN0YXRlIGZvciB0aGlzIHRlc3QgcGFja2FnZSB0byB0aGUgc3lzdGVtIGRlZmF1bHQuCisgICAgICAgIEFwcE9wc1V0aWxzLnJlc2V0KG1PcFBhY2thZ2VOYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90ZU9wQW5kQ2hlY2tPcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzZXRPcE1vZGUobU9wUGFja2FnZU5hbWUsIE9QU1RSX1JFQURfU01TLCBNT0RFX0FMTE9XRUQpOworICAgICAgICBhc3NlcnRFcXVhbHMoTU9ERV9BTExPV0VELCBtQXBwT3BzLm5vdGVPcChPUFNUUl9SRUFEX1NNUywgbU15VWlkLCBtT3BQYWNrYWdlTmFtZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTU9ERV9BTExPV0VELCBtQXBwT3BzLm5vdGVPcE5vVGhyb3coT1BTVFJfUkVBRF9TTVMsIG1NeVVpZCwgbU9wUGFja2FnZU5hbWUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1PREVfQUxMT1dFRCwgbUFwcE9wcy5jaGVja09wKE9QU1RSX1JFQURfU01TLCBtTXlVaWQsIG1PcFBhY2thZ2VOYW1lKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNT0RFX0FMTE9XRUQsIG1BcHBPcHMuY2hlY2tPcE5vVGhyb3coT1BTVFJfUkVBRF9TTVMsIG1NeVVpZCwgbU9wUGFja2FnZU5hbWUpKTsKKworICAgICAgICBzZXRPcE1vZGUobU9wUGFja2FnZU5hbWUsIE9QU1RSX1JFQURfU01TLCBNT0RFX0lHTk9SRUQpOworICAgICAgICBhc3NlcnRFcXVhbHMoTU9ERV9JR05PUkVELCBtQXBwT3BzLm5vdGVPcChPUFNUUl9SRUFEX1NNUywgbU15VWlkLCBtT3BQYWNrYWdlTmFtZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTU9ERV9JR05PUkVELCBtQXBwT3BzLm5vdGVPcE5vVGhyb3coT1BTVFJfUkVBRF9TTVMsIG1NeVVpZCwgbU9wUGFja2FnZU5hbWUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1PREVfSUdOT1JFRCwgbUFwcE9wcy5jaGVja09wKE9QU1RSX1JFQURfU01TLCBtTXlVaWQsIG1PcFBhY2thZ2VOYW1lKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNT0RFX0lHTk9SRUQsIG1BcHBPcHMuY2hlY2tPcE5vVGhyb3coT1BTVFJfUkVBRF9TTVMsIG1NeVVpZCwgbU9wUGFja2FnZU5hbWUpKTsKKworICAgICAgICBzZXRPcE1vZGUobU9wUGFja2FnZU5hbWUsIE9QU1RSX1JFQURfU01TLCBNT0RFX0RFRkFVTFQpOworICAgICAgICBhc3NlcnRFcXVhbHMoTU9ERV9ERUZBVUxULCBtQXBwT3BzLm5vdGVPcChPUFNUUl9SRUFEX1NNUywgbU15VWlkLCBtT3BQYWNrYWdlTmFtZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTU9ERV9ERUZBVUxULCBtQXBwT3BzLm5vdGVPcE5vVGhyb3coT1BTVFJfUkVBRF9TTVMsIG1NeVVpZCwgbU9wUGFja2FnZU5hbWUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1PREVfREVGQVVMVCwgbUFwcE9wcy5jaGVja09wKE9QU1RSX1JFQURfU01TLCBtTXlVaWQsIG1PcFBhY2thZ2VOYW1lKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNT0RFX0RFRkFVTFQsIG1BcHBPcHMuY2hlY2tPcE5vVGhyb3coT1BTVFJfUkVBRF9TTVMsIG1NeVVpZCwgbU9wUGFja2FnZU5hbWUpKTsKKworICAgICAgICBzZXRPcE1vZGUobU9wUGFja2FnZU5hbWUsIE9QU1RSX1JFQURfU01TLCBNT0RFX0VSUk9SRUQpOworICAgICAgICBhc3NlcnRFcXVhbHMoTU9ERV9FUlJPUkVELCBtQXBwT3BzLm5vdGVPcE5vVGhyb3coT1BTVFJfUkVBRF9TTVMsIG1NeVVpZCwgbU9wUGFja2FnZU5hbWUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1PREVfRVJST1JFRCwgbUFwcE9wcy5jaGVja09wTm9UaHJvdyhPUFNUUl9SRUFEX1NNUywgbU15VWlkLCBtT3BQYWNrYWdlTmFtZSkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUFwcE9wcy5ub3RlT3AoT1BTVFJfUkVBRF9TTVMsIG1NeVVpZCwgbU9wUGFja2FnZU5hbWUpOworICAgICAgICAgICAgZmFpbCgiU2VjdXJpdHlFeGNlcHRpb24gZXhwZWN0ZWQiKTsKKyAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbUFwcE9wcy5jaGVja09wKE9QU1RSX1JFQURfU01TLCBtTXlVaWQsIG1PcFBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgIGZhaWwoIlNlY3VyaXR5RXhjZXB0aW9uIGV4cGVjdGVkIik7CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhcnRPcEFuZEZpbmlzaE9wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHNldE9wTW9kZShtT3BQYWNrYWdlTmFtZSwgT1BTVFJfUkVBRF9TTVMsIE1PREVfQUxMT1dFRCk7CisgICAgICAgIGFzc2VydEVxdWFscyhNT0RFX0FMTE9XRUQsIG1BcHBPcHMuc3RhcnRPcChPUFNUUl9SRUFEX1NNUywgbU15VWlkLCBtT3BQYWNrYWdlTmFtZSkpOworICAgICAgICBtQXBwT3BzLmZpbmlzaE9wKE9QU1RSX1JFQURfU01TLCBtTXlVaWQsIG1PcFBhY2thZ2VOYW1lKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1PREVfQUxMT1dFRCwgbUFwcE9wcy5zdGFydE9wTm9UaHJvdyhPUFNUUl9SRUFEX1NNUywgbU15VWlkLCBtT3BQYWNrYWdlTmFtZSkpOworICAgICAgICBtQXBwT3BzLmZpbmlzaE9wKE9QU1RSX1JFQURfU01TLCBtTXlVaWQsIG1PcFBhY2thZ2VOYW1lKTsKKworICAgICAgICBzZXRPcE1vZGUobU9wUGFja2FnZU5hbWUsIE9QU1RSX1JFQURfU01TLCBNT0RFX0lHTk9SRUQpOworICAgICAgICBhc3NlcnRFcXVhbHMoTU9ERV9JR05PUkVELCBtQXBwT3BzLnN0YXJ0T3AoT1BTVFJfUkVBRF9TTVMsIG1NeVVpZCwgbU9wUGFja2FnZU5hbWUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1PREVfSUdOT1JFRCwgbUFwcE9wcy5zdGFydE9wTm9UaHJvdyhPUFNUUl9SRUFEX1NNUywgbU15VWlkLCBtT3BQYWNrYWdlTmFtZSkpOworCisgICAgICAgIHNldE9wTW9kZShtT3BQYWNrYWdlTmFtZSwgT1BTVFJfUkVBRF9TTVMsIE1PREVfREVGQVVMVCk7CisgICAgICAgIGFzc2VydEVxdWFscyhNT0RFX0RFRkFVTFQsIG1BcHBPcHMuc3RhcnRPcChPUFNUUl9SRUFEX1NNUywgbU15VWlkLCBtT3BQYWNrYWdlTmFtZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTU9ERV9ERUZBVUxULCBtQXBwT3BzLnN0YXJ0T3BOb1Rocm93KE9QU1RSX1JFQURfU01TLCBtTXlVaWQsIG1PcFBhY2thZ2VOYW1lKSk7CisKKyAgICAgICAgc2V0T3BNb2RlKG1PcFBhY2thZ2VOYW1lLCBPUFNUUl9SRUFEX1NNUywgTU9ERV9FUlJPUkVEKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1PREVfRVJST1JFRCwgbUFwcE9wcy5zdGFydE9wTm9UaHJvdyhPUFNUUl9SRUFEX1NNUywgbU15VWlkLCBtT3BQYWNrYWdlTmFtZSkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUFwcE9wcy5zdGFydE9wKE9QU1RSX1JFQURfU01TLCBtTXlVaWQsIG1PcFBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgIGZhaWwoIlNlY3VyaXR5RXhjZXB0aW9uIGV4cGVjdGVkIik7CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tQYWNrYWdlUGFzc2VzQ2hlY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbUFwcE9wcy5jaGVja1BhY2thZ2UobU15VWlkLCBtT3BQYWNrYWdlTmFtZSk7CisgICAgICAgIG1BcHBPcHMuY2hlY2tQYWNrYWdlKFByb2Nlc3MuU1lTVEVNX1VJRCwgImFuZHJvaWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tQYWNrYWdlRG9lc250UGFzc0NoZWNrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBQYWNrYWdlIG5hbWUgZG9lc24ndCBtYXRjaCBVSUQuCisgICAgICAgICAgICBtQXBwT3BzLmNoZWNrUGFja2FnZShQcm9jZXNzLlNZU1RFTV9VSUQsIG1PcFBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgIGZhaWwoIlNlY3VyaXR5RXhjZXB0aW9uIGV4cGVjdGVkIik7CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gUGFja2FnZSBuYW1lIGRvZXNuJ3QgbWF0Y2ggVUlELgorICAgICAgICAgICAgbUFwcE9wcy5jaGVja1BhY2thZ2UobU15VWlkLCAiYW5kcm9pZCIpOworICAgICAgICAgICAgZmFpbCgiU2VjdXJpdHlFeGNlcHRpb24gZXhwZWN0ZWQiKTsKKyAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBQYWNrYWdlIG5hbWUgbWlzc2luZworICAgICAgICAgICAgbUFwcE9wcy5jaGVja1BhY2thZ2UobU15VWlkLCAiIik7CisgICAgICAgICAgICBmYWlsKCJTZWN1cml0eUV4Y2VwdGlvbiBleHBlY3RlZCIpOworICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFdhdGNoaW5nTW9kZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBPbk9wQ2hhbmdlZExpc3RlbmVyIHdhdGNoZXIgPSBtb2NrKE9uT3BDaGFuZ2VkTGlzdGVuZXIuY2xhc3MpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2V0T3BNb2RlKG1PcFBhY2thZ2VOYW1lLCBPUFNUUl9SRUFEX1NNUywgTU9ERV9BTExPV0VEKTsKKworICAgICAgICAgICAgbUFwcE9wcy5zdGFydFdhdGNoaW5nTW9kZShPUFNUUl9SRUFEX1NNUywgbU9wUGFja2FnZU5hbWUsIHdhdGNoZXIpOworCisgICAgICAgICAgICAvLyBNYWtlIGEgY2hhbmdlIHRvIHRoZSBhcHAgb3AncyBtb2RlLgorICAgICAgICAgICAgcmVzZXQod2F0Y2hlcik7CisgICAgICAgICAgICBzZXRPcE1vZGUobU9wUGFja2FnZU5hbWUsIE9QU1RSX1JFQURfU01TLCBNT0RFX0VSUk9SRUQpOworICAgICAgICAgICAgdmVyaWZ5KHdhdGNoZXIsIHRpbWVvdXQoTU9ERV9XQVRDSEVSX1RJTUVPVVRfTVMpKQorICAgICAgICAgICAgICAgICAgICAub25PcENoYW5nZWQoT1BTVFJfUkVBRF9TTVMsIG1PcFBhY2thZ2VOYW1lKTsKKworICAgICAgICAgICAgLy8gTWFrZSBhbm90aGVyIGNoYW5nZSB0byB0aGUgYXBwIG9wJ3MgbW9kZS4KKyAgICAgICAgICAgIHJlc2V0KHdhdGNoZXIpOworICAgICAgICAgICAgc2V0T3BNb2RlKG1PcFBhY2thZ2VOYW1lLCBPUFNUUl9SRUFEX1NNUywgTU9ERV9BTExPV0VEKTsKKyAgICAgICAgICAgIHZlcmlmeSh3YXRjaGVyLCB0aW1lb3V0KE1PREVfV0FUQ0hFUl9USU1FT1VUX01TKSkKKyAgICAgICAgICAgICAgICAgICAgLm9uT3BDaGFuZ2VkKE9QU1RSX1JFQURfU01TLCBtT3BQYWNrYWdlTmFtZSk7CisKKyAgICAgICAgICAgIC8vIFNldCBtb2RlIHRvIHRoZSBzYW1lIHZhbHVlIGFzIGJlZm9yZSAtIGV4cGVjdCBubyBjYWxsIHRvIHRoZSBsaXN0ZW5lci4KKyAgICAgICAgICAgIHJlc2V0KHdhdGNoZXIpOworICAgICAgICAgICAgc2V0T3BNb2RlKG1PcFBhY2thZ2VOYW1lLCBPUFNUUl9SRUFEX1NNUywgTU9ERV9BTExPV0VEKTsKKyAgICAgICAgICAgIHZlcmlmeVplcm9JbnRlcmFjdGlvbnMod2F0Y2hlcik7CisKKyAgICAgICAgICAgIG1BcHBPcHMuc3RvcFdhdGNoaW5nTW9kZSh3YXRjaGVyKTsKKworICAgICAgICAgICAgLy8gTWFrZSBhIGNoYW5nZSB0byB0aGUgYXBwIG9wJ3MgbW9kZS4gU2luY2Ugd2UgYWxyZWFkeSBzdG9wcGVkIHdhdGNoaW5nIHRoZSBtb2RlLCB0aGUKKyAgICAgICAgICAgIC8vIGxpc3RlbmVyIHNob3VsZG4ndCBiZSBjYWxsZWQuCisgICAgICAgICAgICByZXNldCh3YXRjaGVyKTsKKyAgICAgICAgICAgIHNldE9wTW9kZShtT3BQYWNrYWdlTmFtZSwgT1BTVFJfUkVBRF9TTVMsIE1PREVfRVJST1JFRCk7CisgICAgICAgICAgICB2ZXJpZnlaZXJvSW50ZXJhY3Rpb25zKHdhdGNoZXIpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgLy8gQ2xlYW4gdXAgcmVnaXN0ZXJlZCB3YXRjaGVyLgorICAgICAgICAgICAgbUFwcE9wcy5zdG9wV2F0Y2hpbmdNb2RlKHdhdGNoZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPcENvZGVzVW5pcXVlKCkgeworICAgICAgICBTdHJpbmdbXSBvcFN0cnMgPSBBcHBPcHNNYW5hZ2VyLmdldE9wU3RycygpOworICAgICAgICBTZXQ8SW50ZWdlcj4gb3BDb2RlcyA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgZm9yIChTdHJpbmcgb3BTdHIgOiBvcFN0cnMpIHsKKyAgICAgICAgICAgIG9wQ29kZXMuYWRkKEFwcE9wc01hbmFnZXIuc3RyT3BUb09wKG9wU3RyKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJOb3QgYWxsIGFwcCBvcCBjb2RlcyBhcmUgdW5pcXVlIiwgb3BTdHJzLmxlbmd0aCwgb3BDb2Rlcy5zaXplKCkpOworICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGVybWlzc2lvbk1hcHBpbmcoKSB7CisgICAgICAgIGZvciAoU3RyaW5nIHBlcm1pc3Npb24gOiBwZXJtaXNzaW9uVG9PcFN0ci5rZXlTZXQoKSkgeworICAgICAgICAgICAgdGVzdFBlcm1pc3Npb25NYXBwaW5nKHBlcm1pc3Npb24sIHBlcm1pc3Npb25Ub09wU3RyLmdldChwZXJtaXNzaW9uKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdFBlcm1pc3Npb25NYXBwaW5nKFN0cmluZyBwZXJtaXNzaW9uLCBTdHJpbmcgb3BTdHIpIHsKKyAgICAgICAgLy8gRG8gdGhlIHB1YmxpYyB2YWx1ZSA9PiBpbnRlcm5hbCBvcCBjb2RlIGxvb2t1cHMuCisgICAgICAgIFN0cmluZyBtYXBwZWRPcFN0ciA9IEFwcE9wc01hbmFnZXIucGVybWlzc2lvblRvT3AocGVybWlzc2lvbik7CisgICAgICAgIGFzc2VydEVxdWFscyhtYXBwZWRPcFN0ciwgb3BTdHIpOworICAgICAgICBpbnQgbWFwcGVkT3BDb2RlID0gQXBwT3BzTWFuYWdlci5wZXJtaXNzaW9uVG9PcENvZGUocGVybWlzc2lvbik7CisgICAgICAgIGludCBtYXBwZWRPcENvZGUyID0gQXBwT3BzTWFuYWdlci5zdHJPcFRvT3Aob3BTdHIpOworICAgICAgICBhc3NlcnRFcXVhbHMobWFwcGVkT3BDb2RlLCBtYXBwZWRPcENvZGUyKTsKKworICAgICAgICAvLyBEbyB0aGUgaW50ZXJuYWwgb3AgY29kZSA9PiBwdWJsaWMgdmFsdWUgbG9va3VwIChyZXZlcnNlIGxvb2t1cCkuCisgICAgICAgIFN0cmluZyBwZXJtaXNzaW9uTWFwcGVkQmFjayA9IEFwcE9wc01hbmFnZXIub3BUb1Blcm1pc3Npb24obWFwcGVkT3BDb2RlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHBlcm1pc3Npb24sIHBlcm1pc3Npb25NYXBwZWRCYWNrKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBUZXN0IHRoYXQgdGhlIGFwcCBjYW4gbm90IGNoYW5nZSB0aGUgYXBwIG9wIG1vZGUgZm9yIGl0c2VsZi4KICAgICAgKi8KICAgICBAU21hbGxUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNldE1vZGUoKSB7Ci0gICAgICAgIGJvb2xlYW4gZ290VG9UZXN0ID0gZmFsc2U7CisgICAgcHVibGljIHZvaWQgdGVzdENhbnRTZXRNb2RlRm9yU2VsZigpIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1ldGhvZCBzZXRNb2RlID0gbUFwcE9wcy5nZXRDbGFzcygpLmdldE1ldGhvZCgic2V0TW9kZSIsIGludC5jbGFzcywgaW50LmNsYXNzLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcuY2xhc3MsIGludC5jbGFzcyk7Ci0gICAgICAgICAgICBpbnQgd3JpdGVTbXNPcCA9IG1BcHBPcHMuZ2V0Q2xhc3MoKS5nZXRGaWVsZCgiT1BfV1JJVEVfU01TIikuZ2V0SW50KG1BcHBPcHMpOwotICAgICAgICAgICAgZ290VG9UZXN0ID0gdHJ1ZTsKLSAgICAgICAgICAgIHNldE1vZGUuaW52b2tlKG1BcHBPcHMsIHdyaXRlU21zT3AsIGFuZHJvaWQub3MuUHJvY2Vzcy5teVVpZCgpLAotICAgICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuZ2V0UGFja2FnZU5hbWUoKSwgQXBwT3BzTWFuYWdlci5NT0RFX0FMTE9XRUQpOworICAgICAgICAgICAgaW50IHdyaXRlU21zT3AgPSBBcHBPcHNNYW5hZ2VyLnBlcm1pc3Npb25Ub09wQ29kZSgiYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX1NNUyIpOworICAgICAgICAgICAgbUFwcE9wcy5zZXRNb2RlKHdyaXRlU21zT3AsIG1NeVVpZCwgbU9wUGFja2FnZU5hbWUsIEFwcE9wc01hbmFnZXIuTU9ERV9BTExPV0VEKTsKICAgICAgICAgICAgIGZhaWwoIldhcyBhYmxlIHRvIHNldCBtb2RlIGZvciBzZWxmIik7Ci0gICAgICAgIH0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiVW5hYmxlIHRvIGZpbmQgT1BfV1JJVEVfU01TIiwgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIlVuYWJsZSB0byBmaW5kIHNldE1vZGUgbWV0aG9kIiwgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKCFnb3RUb1Rlc3QpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIldob29wcyIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSWYgd2UgZ290IHRvIHRoZSB0ZXN0LCB3ZSB3YW50IGl0IHRvIGhhdmUgdGhyb3duIGEgc2VjdXJpdHkgZXhjZXB0aW9uLgotICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBsb29rIGluc2lkZSBvZiB0aGUgd3JhcHBlciBleGNlcHRpb24gdG8gc2VlLgotICAgICAgICAgICAgVGhyb3dhYmxlIHQgPSBlLmdldENhdXNlKCk7Ci0gICAgICAgICAgICBpZiAoISh0IGluc3RhbmNlb2YgU2VjdXJpdHlFeGNlcHRpb24pKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJEaWQgbm90IHRocm93IFNlY3VyaXR5RXhjZXB0aW9uIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJXaG9vcHMiLCBlKTsKKyAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZXhwZWN0ZWQpIHsKICAgICAgICAgfQogICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0T3BzRm9yUGFja2FnZV9vcHNBcmVMb2dnZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gVGhpcyB0ZXN0IGNoZWNrcyBpZiBvcGVyYXRpb25zIGdldCBsb2dnZWQgYnkgdGhlIHN5c3RlbS4gSXQgbmVlZHMgdG8gc3RhcnQgd2l0aCBhIGNsZWFuCisgICAgICAgIC8vIHNsYXRlLCBpLmUuIHRoZXNlIG9wcyBjYW4ndCBoYXZlIGJlZW4gbG9nZ2VkIHByZXZpb3VzbHkgZm9yIHRoaXMgdGVzdCBwYWNrYWdlLiBUaGUgcmVhc29uCisgICAgICAgIC8vIGlzIHRoYXQgdGhlcmUncyBubyBBUEkgZm9yIGNsZWFyaW5nIHRoZSBhcHAgb3AgbG9ncyBiZWZvcmUgYSB0ZXN0IHJ1bi4gSG93ZXZlciwgdGhlIG9wCisgICAgICAgIC8vIGxvZ3MgYXJlIGNsZWFyZWQgd2hlbiB0aGlzIHRlc3QgcGFja2FnZSBpcyByZWluc3RhbGxlZCBiZXR3ZWVuIHRlc3QgcnVucy4gVG8gbWFrZSBzdXJlCisgICAgICAgIC8vIHRoYXQgb3RoZXIgdGVzdCBtZXRob2RzIGluIHRoaXMgY2xhc3MgZG9uJ3QgYWZmZWN0IHRoaXMgdGVzdCBtZXRob2QsIGhlcmUgd2UgdXNlCisgICAgICAgIC8vIG9wZXJhdGlvbnMgdGhhdCBhcmUgbm90IHVzZWQgYnkgYW55IG90aGVyIHRlc3QgY2FzZXMuCisgICAgICAgIFN0cmluZyBtdXN0Tm90QmVMb2dnZWQgPSAiT3BlcmF0aW9uIG11c3RuJ3QgYmUgbG9nZ2VkIGJlZm9yZSB0aGUgdGVzdCBydW5zIjsKKyAgICAgICAgYXNzZXJ0RmFsc2UobXVzdE5vdEJlTG9nZ2VkLCBhbGxvd2VkT3BlcmF0aW9uTG9nZ2VkKG1PcFBhY2thZ2VOYW1lLCBPUFNUUl9SRUNPUkRfQVVESU8pKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobXVzdE5vdEJlTG9nZ2VkLCBhbGxvd2VkT3BlcmF0aW9uTG9nZ2VkKG1PcFBhY2thZ2VOYW1lLCBPUFNUUl9SRUFEX0NBTEVOREFSKSk7CisKKyAgICAgICAgc2V0T3BNb2RlKG1PcFBhY2thZ2VOYW1lLCBPUFNUUl9SRUNPUkRfQVVESU8sIE1PREVfQUxMT1dFRCk7CisgICAgICAgIHNldE9wTW9kZShtT3BQYWNrYWdlTmFtZSwgT1BTVFJfUkVBRF9DQUxFTkRBUiwgTU9ERV9FUlJPUkVEKTsKKworICAgICAgICAvLyBOb3RlIGFuIG9wIHRoYXQncyBhbGxvd2VkLgorICAgICAgICBtQXBwT3BzLm5vdGVPcChPUFNUUl9SRUNPUkRfQVVESU8sIG1NeVVpZCwgbU9wUGFja2FnZU5hbWUpOworICAgICAgICBTdHJpbmcgbXVzdEJlTG9nZ2VkID0gIk9wZXJhdGlvbiBtdXN0IGJlIGxvZ2dlZCI7CisgICAgICAgIGFzc2VydFRydWUobXVzdEJlTG9nZ2VkLCBhbGxvd2VkT3BlcmF0aW9uTG9nZ2VkKG1PcFBhY2thZ2VOYW1lLCBPUFNUUl9SRUNPUkRfQVVESU8pKTsKKworICAgICAgICAvLyBOb3RlIGFub3RoZXIgb3AgdGhhdCdzIG5vdCBhbGxvd2VkLgorICAgICAgICBtQXBwT3BzLm5vdGVPcE5vVGhyb3coT1BTVFJfUkVBRF9DQUxFTkRBUiwgbU15VWlkLCBtT3BQYWNrYWdlTmFtZSk7CisgICAgICAgIGFzc2VydFRydWUobXVzdEJlTG9nZ2VkLCBhbGxvd2VkT3BlcmF0aW9uTG9nZ2VkKG1PcFBhY2thZ2VOYW1lLCBPUFNUUl9SRUNPUkRfQVVESU8pKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtdXN0QmVMb2dnZWQsIHJlamVjdGVkT3BlcmF0aW9uTG9nZ2VkKG1PcFBhY2thZ2VOYW1lLCBPUFNUUl9SRUFEX0NBTEVOREFSKSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcGVybWlzc2lvbi9zcmMvYW5kcm9pZC9wZXJtaXNzaW9uL2N0cy9DYW1lcmEyUGVybWlzc2lvblRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3Blcm1pc3Npb24vc3JjL2FuZHJvaWQvcGVybWlzc2lvbi9jdHMvQ2FtZXJhMlBlcm1pc3Npb25UZXN0LmphdmEKaW5kZXggMTQwNTU3Zi4uZTQwZDdjYiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvcGVybWlzc2lvbi9zcmMvYW5kcm9pZC9wZXJtaXNzaW9uL2N0cy9DYW1lcmEyUGVybWlzc2lvblRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uL3NyYy9hbmRyb2lkL3Blcm1pc3Npb24vY3RzL0NhbWVyYTJQZXJtaXNzaW9uVGVzdC5qYXZhCkBAIC0yNyw4ICsyNyw2IEBACiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DZGRUZXN0OwotCiBpbXBvcnQgY29tLmFuZHJvaWQuZXguY2FtZXJhMi5ibG9ja2luZy5CbG9ja2luZ0NhbWVyYU1hbmFnZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuZXguY2FtZXJhMi5ibG9ja2luZy5CbG9ja2luZ1N0YXRlQ2FsbGJhY2s7CiAKQEAgLTM2LDcgKzM0LDYgQEAKICAqIFRlc3RzIGZvciBDYW1lcmEyIEFQSSByZWxhdGVkIFBlcm1pc3Npb25zLiBDdXJyZW50bHksIHRoaXMgbWVhbnMKICAqIGFuZHJvaWQucGVybWlzc2lvbi5DQU1FUkEuCiAgKi8KLUBDZGRUZXN0KHJlcXVpcmVtZW50PSIzLjIuMS9DLTAtMSw5LjEvQy0wLTEiKQogcHVibGljIGNsYXNzIENhbWVyYTJQZXJtaXNzaW9uVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJDYW1lcmFEZXZpY2VUZXN0IjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFZFUkJPU0UgPSBMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5WRVJCT1NFKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3Blcm1pc3Npb24vc3JjL2FuZHJvaWQvcGVybWlzc2lvbi9jdHMvRmlsZVN5c3RlbVBlcm1pc3Npb25UZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uL3NyYy9hbmRyb2lkL3Blcm1pc3Npb24vY3RzL0ZpbGVTeXN0ZW1QZXJtaXNzaW9uVGVzdC5qYXZhCmluZGV4IDI1YzY4NmIuLmU5NjQ3MTkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3Blcm1pc3Npb24vc3JjL2FuZHJvaWQvcGVybWlzc2lvbi9jdHMvRmlsZVN5c3RlbVBlcm1pc3Npb25UZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvcGVybWlzc2lvbi9zcmMvYW5kcm9pZC9wZXJtaXNzaW9uL2N0cy9GaWxlU3lzdGVtUGVybWlzc2lvblRlc3QuamF2YQpAQCAtMTYsMTkgKzE2LDMyIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5wZXJtaXNzaW9uLmN0czsKIAoraW1wb3J0IHN0YXRpYyBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm87CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQub3MuRW52aXJvbm1lbnQ7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOwogaW1wb3J0IGFuZHJvaWQuc3lzdGVtLkVycm5vRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQudXRpbC5QYWlyOwogaW1wb3J0IGFuZHJvaWQuc3lzdGVtLk9zOwogaW1wb3J0IGFuZHJvaWQuc3lzdGVtLk9zQ29uc3RhbnRzOwogaW1wb3J0IGFuZHJvaWQuc3lzdGVtLlN0cnVjdFN0YXRWZnM7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKLWltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTGFyZ2VUZXN0OworaW1wb3J0IGFuZHJvaWQudXRpbC5QYWlyOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DZGRUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5MYXJnZVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIAogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CiBpbXBvcnQgamF2YS5pby5GaWxlOwpAQCAtMzgsMzcgKzUxLDUxIEBACiBpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogaW1wb3J0IGphdmEubmlvLkJ5dGVPcmRlcjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZW91dEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TY2FubmVyOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVvdXRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CiAKIC8qKgogICogVmVyaWZ5IGNlcnRhaW4gcGVybWlzc2lvbnMgb24gdGhlIGZpbGVzeXN0ZW0KICAqCiAgKiBUT0RPOiBDb21iaW5lIHRoaXMgZmlsZSB3aXRoIHtAbGluayBhbmRyb2lkLm9zLmN0cy5GaWxlQWNjZXNzUGVybWlzc2lvblRlc3R9CiAgKi8KLUBDZGRUZXN0KHJlcXVpcmVtZW50PSI5LjMvQy0wLTEiKQotcHVibGljIGNsYXNzIEZpbGVTeXN0ZW1QZXJtaXNzaW9uVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CitAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIEZpbGVTeXN0ZW1QZXJtaXNzaW9uVGVzdCB7CisKKyAgICBwcml2YXRlIGludCBkdW1wYWJsZTsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkdW1wYWJsZSA9IE9zLnByY3RsKE9zQ29uc3RhbnRzLlBSX0dFVF9EVU1QQUJMRSwgMCwgMCwgMCwgMCk7CisgICAgICAgIE9zLnByY3RsKE9zQ29uc3RhbnRzLlBSX1NFVF9EVU1QQUJMRSwgMSwgMCwgMCwgMCk7CisgICAgfQorCisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgT3MucHJjdGwoT3NDb25zdGFudHMuUFJfU0VUX0RVTVBBQkxFLCBkdW1wYWJsZSwgMCwgMCwgMCk7CisgICAgfQogCiAgICAgQE1lZGl1bVRlc3QKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVGaWxlSGFzU2FuZVBlcm1pc3Npb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEZpbGUgbXlGaWxlID0gbmV3IEZpbGUoZ2V0Q29udGV4dCgpLmdldEZpbGVzRGlyKCksICJoZWxsbyIpOwogICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG15RmlsZSk7CkBAIC05MCw2ICsxMTcsNyBAQAogICAgIH0KIAogICAgIEBNZWRpdW1UZXN0CisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlRGlyZWN0b3J5SGFzU2FuZVBlcm1pc3Npb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEZpbGUgbXlEaXIgPSBuZXcgRmlsZShnZXRDb250ZXh0KCkuZ2V0RmlsZXNEaXIoKSwgImhlbGxvRGlyZWN0b3J5Iik7CiAgICAgICAgIGFzc2VydFRydWUobXlEaXIubWtkaXIoKSk7CkBAIC0xMTEsNiArMTM5LDcgQEAKICAgICB9CiAKICAgICBATWVkaXVtVGVzdAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE90aGVyQXBwbGljYXRpb25EaXJlY3Rvcmllc0FyZU5vdFdyaXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFNldDxGaWxlPiB3cml0YWJsZURpcnMgPSBuZXcgSGFzaFNldDxGaWxlPigpOwogICAgICAgICBMaXN0PEFwcGxpY2F0aW9uSW5mbz4gYXBwcyA9IGdldENvbnRleHQoKQpAQCAtMTI4LDYgKzE1Nyw3IEBACiAgICAgfQogCiAgICAgQE1lZGl1bVRlc3QKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBsaWNhdGlvblBhcmVudERpcmVjdG9yeU5vdFdyaXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZyBteURhdGFEaXIgPSBnZXRDb250ZXh0KCkuZ2V0QXBwbGljYXRpb25JbmZvKCkuZGF0YURpcjsKICAgICAgICAgRmlsZSBwYXJlbnREaXIgPSBuZXcgRmlsZShteURhdGFEaXIpLmdldFBhcmVudEZpbGUoKTsKQEAgLTEzNSwzNiArMTY1LDQzIEBACiAgICAgfQogCiAgICAgQE1lZGl1bVRlc3QKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3REYXRhRGlyZWN0b3J5Tm90V3JpdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0RmFsc2UoaXNEaXJlY3RvcnlXcml0YWJsZShFbnZpcm9ubWVudC5nZXREYXRhRGlyZWN0b3J5KCkpKTsKICAgICB9CiAKICAgICBATWVkaXVtVGVzdAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEFuZHJvaWRSb290RGlyZWN0b3J5Tm90V3JpdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0RmFsc2UoaXNEaXJlY3RvcnlXcml0YWJsZShFbnZpcm9ubWVudC5nZXRSb290RGlyZWN0b3J5KCkpKTsKICAgICB9CiAKICAgICBATWVkaXVtVGVzdAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdERvd25sb2FkQ2FjaGVEaXJlY3RvcnlOb3RXcml0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBhc3NlcnRGYWxzZShpc0RpcmVjdG9yeVdyaXRhYmxlKEVudmlyb25tZW50LmdldERvd25sb2FkQ2FjaGVEaXJlY3RvcnkoKSkpOwogICAgIH0KIAogICAgIEBNZWRpdW1UZXN0CisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Um9vdERpcmVjdG9yeU5vdFdyaXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGFzc2VydEZhbHNlKGlzRGlyZWN0b3J5V3JpdGFibGUobmV3IEZpbGUoIi8iKSkpOwogICAgIH0KIAogICAgIEBNZWRpdW1UZXN0CisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGV2RGlyZWN0b3J5Tm90V3JpdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0RmFsc2UoaXNEaXJlY3RvcnlXcml0YWJsZShuZXcgRmlsZSgiL2RldiIpKSk7CiAgICAgfQogCiAgICAgQE1lZGl1bVRlc3QKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9jRGlyZWN0b3J5Tm90V3JpdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0RmFsc2UoaXNEaXJlY3RvcnlXcml0YWJsZShuZXcgRmlsZSgiL3Byb2MiKSkpOwogICAgIH0KIAogICAgIEBNZWRpdW1UZXN0CisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGV2RGlhZ1NhbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoIi9kZXYvZGlhZyIpOwogICAgICAgICBhc3NlcnRGYWxzZShmLmNhblJlYWQoKSk7CkBAIC0xNzQsNiArMjExLDcgQEAKIAogICAgIC8qIGIvMjY4MTM5MzIgKi8KICAgICBATWVkaXVtVGVzdAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFByb2NJbnRlcnJ1cHRzTm90UmVhZGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoIi9wcm9jL2ludGVycnVwdHMiKTsKICAgICAgICAgYXNzZXJ0RmFsc2UoZi5jYW5SZWFkKCkpOwpAQCAtMTgzLDYgKzIyMSw3IEBACiAKICAgICAvKiBiLzI2ODEzOTMyICovCiAgICAgQE1lZGl1bVRlc3QKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9jU3RhdE5vdFJlYWRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKCIvcHJvYy9zdGF0Iik7CiAgICAgICAgIGFzc2VydEZhbHNlKGYuY2FuUmVhZCgpKTsKQEAgLTE5MSwyNCArMjMwLDI4IEBACiAgICAgfQogCiAgICAgQE1lZGl1bVRlc3QKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3REZXZNZW1TYW5lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKCIvZGV2L21lbSIpOwogICAgICAgICBhc3NlcnRGYWxzZShmLmV4aXN0cygpKTsKICAgICB9CiAKICAgICBATWVkaXVtVGVzdAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdERldmttZW1TYW5lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKCIvZGV2L2ttZW0iKTsKICAgICAgICAgYXNzZXJ0RmFsc2UoZi5leGlzdHMoKSk7CiAgICAgfQogCiAgICAgQE1lZGl1bVRlc3QKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3REZXZQb3J0U2FuZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZSgiL2Rldi9wb3J0Iik7CiAgICAgICAgIGFzc2VydEZhbHNlKGYuZXhpc3RzKCkpOwogICAgIH0KIAogICAgIEBNZWRpdW1UZXN0CisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UG41NDRTYW5lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKCIvZGV2L3BuNTQ0Iik7CiAgICAgICAgIGFzc2VydEZhbHNlKGYuY2FuUmVhZCgpKTsKQEAgLTIyMCw2ICsyNjMsNyBAQAogICAgIH0KIAogICAgIEBNZWRpdW1UZXN0CisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QmNtMjA3OXhTYW5lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKCIvZGV2L2JjbTIwNzl4Iik7CiAgICAgICAgIGFzc2VydEZhbHNlKGYuY2FuUmVhZCgpKTsKQEAgLTIzMSw2ICsyNzUsNyBAQAogICAgIH0KIAogICAgIEBNZWRpdW1UZXN0CisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QmNtMjA3OXhpMmNTYW5lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKCIvZGV2L2JjbTIwNzl4LWkyYyIpOwogICAgICAgICBhc3NlcnRGYWxzZShmLmNhblJlYWQoKSk7CkBAIC0yNDIsOSArMjg3LDEwIEBACiAgICAgfQogCiAgICAgQE1lZGl1bVRlc3QKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3REZXZRdGFndWlkU2FuZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZSgiL2Rldi94dF9xdGFndWlkIik7Ci0gICAgICAgIGFzc2VydFRydWUoZi5jYW5SZWFkKCkpOworICAgICAgICBhc3NlcnRGYWxzZShmLmNhblJlYWQoKSk7CiAgICAgICAgIGFzc2VydEZhbHNlKGYuY2FuV3JpdGUoKSk7CiAgICAgICAgIGFzc2VydEZhbHNlKGYuY2FuRXhlY3V0ZSgpKTsKIApAQCAtMjUzLDEwICsyOTksMTEgQEAKICAgICB9CiAKICAgICBATWVkaXVtVGVzdAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFByb2NRdGFndWlkQ3RybFNhbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoIi9wcm9jL25ldC94dF9xdGFndWlkL2N0cmwiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShmLmNhblJlYWQoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoZi5jYW5Xcml0ZSgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoZi5jYW5SZWFkKCkpOworICAgICAgICBhc3NlcnRGYWxzZShmLmNhbldyaXRlKCkpOwogICAgICAgICBhc3NlcnRGYWxzZShmLmNhbkV4ZWN1dGUoKSk7CiAKICAgICAgICAgYXNzZXJ0RmlsZU93bmVkQnkoZiwgInJvb3QiKTsKQEAgLTI2NCw5ICszMTEsMTAgQEAKICAgICB9CiAKICAgICBATWVkaXVtVGVzdAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFByb2NRdGFndWlkU3RhdHNTYW5lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKCIvcHJvYy9uZXQveHRfcXRhZ3VpZC9zdGF0cyIpOwotICAgICAgICBhc3NlcnRUcnVlKGYuY2FuUmVhZCgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoZi5jYW5SZWFkKCkpOwogICAgICAgICBhc3NlcnRGYWxzZShmLmNhbldyaXRlKCkpOwogICAgICAgICBhc3NlcnRGYWxzZShmLmNhbkV4ZWN1dGUoKSk7CiAKQEAgLTI3NCwxOCArMzIyLDYwIEBACiAgICAgICAgIGFzc2VydEZpbGVPd25lZEJ5R3JvdXAoZiwgIm5ldF9id19zdGF0cyIpOwogICAgIH0KIAotICAgIEBNZWRpdW1UZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFByb2NTZWxmT29tQWRqU2FuZSgpIHsKLSAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoIi9wcm9jL3NlbGYvb29tX2FkaiIpOwotICAgICAgICBhc3NlcnRGYWxzZShmLmNhbldyaXRlKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShmLmNhbkV4ZWN1dGUoKSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHJlYWRJbnQoRmlsZSBmKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IChTY2FubmVyIHMgPSBuZXcgU2Nhbm5lcihmKSkgeworICAgICAgICAgICAgcmV0dXJuIHMubmV4dEludCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB3cml0ZUludChGaWxlIGYsIGludCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IChGaWxlT3V0cHV0U3RyZWFtIG9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZikpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb3Mud3JpdGUoSW50ZWdlci50b1N0cmluZyh2YWx1ZSkuZ2V0Qnl0ZXMoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCiAgICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvY1NlbGZPb21TY29yZUFkalNhbmUoKSB7Ci0gICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKCIvcHJvYy9zZWxmL29vbV9zY29yZV9hZGoiKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoZi5jYW5Xcml0ZSgpKTsKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9jU2VsZk9vbUFkalNhbmUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBpbnQgT09NX0RJU0FCTEUgPSAtMTc7CisKKyAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoIi9wcm9jL3NlbGYvb29tX2FkaiIpOworICAgICAgICBhc3NlcnRUcnVlKGYuY2FuUmVhZCgpKTsKICAgICAgICAgYXNzZXJ0RmFsc2UoZi5jYW5FeGVjdXRlKCkpOworCisgICAgICAgIGludCBvb21fYWRqID0gcmVhZEludChmKTsKKyAgICAgICAgYXNzZXJ0Tm90RXF1YWxzKCJ1bnByaXZpbGVnZWQgcHJvY2Vzc2VzIHNob3VsZCBub3QgYmUgdW5raWxsYWJsZSIsIE9PTV9ESVNBQkxFLCBvb21fYWRqKTsKKyAgICAgICAgaWYgKGYuY2FuV3JpdGUoKSkKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKCJ1bnByaXZpbGVnZWQgcHJvY2Vzc2VzIHNob3VsZCBub3QgYmUgYWJsZSB0byByZWR1Y2UgdGhlaXIgb29tX2FkaiB2YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgIHdyaXRlSW50KGYsIG9vbV9hZGogLSAxKSk7CisgICAgfQorCisgICAgQE1lZGl1bVRlc3QKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9jU2VsZk9vbVNjb3JlQWRqU2FuZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIGludCBPT01fU0NPUkVfQURKX01JTiA9IC0xMDAwOworCisgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKCIvcHJvYy9zZWxmL29vbV9zY29yZV9hZGoiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShmLmNhblJlYWQoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGYuY2FuRXhlY3V0ZSgpKTsKKworICAgICAgICBpbnQgb29tX3Njb3JlX2FkaiA9IHJlYWRJbnQoZik7CisgICAgICAgIGFzc2VydE5vdEVxdWFscygidW5wcml2aWxlZ2VkIHByb2Nlc3NlcyBzaG91bGQgbm90IGJlIHVua2lsbGFibGUiLCBPT01fU0NPUkVfQURKX01JTiwgb29tX3Njb3JlX2Fkaik7CisgICAgICAgIGlmIChmLmNhbldyaXRlKCkpIHsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKAorICAgICAgICAgICAgICAgICAgICAidW5wcml2aWxlZ2VkIHByb2Nlc3NlcyBzaG91bGQgbm90IGJlIGFibGUgdG8gcmVkdWNlIHRoZWlyIG9vbV9zY29yZV9hZGogdmFsdWUiLAorICAgICAgICAgICAgICAgICAgICB3cml0ZUludChmLCBvb21fc2NvcmVfYWRqIC0gMSkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICAgICAgICAgInVucHJpdmlsZWdlZCBwcm9jZXNzZXMgc2hvdWxkIGJlIGFibGUgdG8gaW5jcmVhc2UgdGhlaXIgb29tX3Njb3JlX2FkaiB2YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgIHdyaXRlSW50KGYsIG9vbV9zY29yZV9hZGogKyAxKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJ1bnByaXZpbGVnZWQgcHJvY2Vzc2VzIHNob3VsZCBiZSBhYmxlIHRvIHJlc3RvcmUgdGhlaXIgb29tX3Njb3JlX2FkaiB2YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgIHdyaXRlSW50KGYsIG9vbV9zY29yZV9hZGopKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIExpc3Q8UGFpcjxMb25nLCBMb25nPj4gbWFwcGVkUGFnZVJhbmdlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC0zNDksMTEgKzQzOSw5IEBACiAgICAgfQogCiAgICAgQE1lZGl1bVRlc3QKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9jU2VsZlBhZ2VtYXBTYW5lKCkgdGhyb3dzIEVycm5vRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIEZpbGVEZXNjcmlwdG9yIHBhZ2VtYXAgPSBudWxsOwotICAgICAgICBpbnQgZHVtcGFibGUgPSBPcy5wcmN0bChPc0NvbnN0YW50cy5QUl9HRVRfRFVNUEFCTEUsIDAsIDAsIDAsIDApOwotICAgICAgICBPcy5wcmN0bChPc0NvbnN0YW50cy5QUl9TRVRfRFVNUEFCTEUsIDEsIDAsIDAsIDApOwotCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBwYWdlbWFwID0gT3Mub3BlbigiL3Byb2Mvc2VsZi9wYWdlbWFwIiwgT3NDb25zdGFudHMuT19SRE9OTFksIDApOwogCkBAIC0zNzAsMTEgKzQ1OCwxMiBAQAogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgaWYgKHBhZ2VtYXAgIT0gbnVsbCkKICAgICAgICAgICAgICAgICBPcy5jbG9zZShwYWdlbWFwKTsKLSAgICAgICAgICAgIE9zLnByY3RsKE9zQ29uc3RhbnRzLlBSX1NFVF9EVU1QQUJMRSwgZHVtcGFibGUsIDAsIDAsIDApOwogICAgICAgICB9CiAgICAgfQogCiAgICAgQE1lZGl1bVRlc3QKKyAgICBAQXBwTW9kZUZ1bGwocmVhc29uID0gIkluc3RhbnQgQXBwcyBjYW5ub3QgYWNjZXNzIHByb2NfbmV0IGxhYmVsZWQgZmlsZXMiKQorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFRjcERlZmF1bHRSd25kU2FuZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZSgiL3Byb2Mvc3lzL25ldC9pcHY0L3RjcF9kZWZhdWx0X2luaXRfcnduZCIpOwogICAgICAgICBhc3NlcnRUcnVlKGYuY2FuUmVhZCgpKTsKQEAgLTM4Niw2ICs0NzUsNyBAQAogICAgIH0KIAogICAgIEBNZWRpdW1UZXN0CisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0SWRsZXRpbWVyRGlyZWN0b3J5RXhpc3RzQW5kU2FuZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBGaWxlIGRpciA9IG5ldyBGaWxlKCIvc3lzL2NsYXNzL3h0X2lkbGV0aW1lciIpOwogICAgICAgICBhc3NlcnRUcnVlKGRpci5pc0RpcmVjdG9yeSgpKTsKQEAgLTM5OCw2ICs0ODgsNyBAQAogCiAKICAgICBATWVkaXVtVGVzdAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFByb2Nmc01tYXBSbmRCaXRzRXhpc3RzQW5kU2FuZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBTdHJpbmcgYXJjaCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MuYXJjaCIpOwogICAgICAgICBib29sZWFuIHN1cHBvcnRlZCA9IGZhbHNlOwpAQCAtNDY3LDYgKzU1OCw3IEBACiAgICAgfQogCiAgICAgQE1lZGl1bVRlc3QKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RUdHlPM1NhbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoIi9kZXYvdHR5TzMiKTsKICAgICAgICAgYXNzZXJ0RmFsc2UoZi5jYW5SZWFkKCkpOwpAQCAtNDc1LDYgKzU2Nyw3IEBACiAgICAgfQogCiAgICAgQE1lZGl1bVRlc3QKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3REYXRhTWVkaWFTYW5lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIEZpbGUgZiA9IG5ldyBGaWxlKCIvZGF0YS9tZWRpYSIpOwogICAgICAgICBhc3NlcnRGYWxzZShmLmNhblJlYWQoKSk7CkBAIC00ODMsNiArNTc2LDcgQEAKICAgICB9CiAKICAgICBATWVkaXVtVGVzdAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE1udFNoZWxsU2FuZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBmaW5hbCBGaWxlIGYgPSBuZXcgRmlsZSgiL21udC9zaGVsbCIpOwogICAgICAgICBhc3NlcnRGYWxzZShmLmNhblJlYWQoKSk7CkBAIC00OTEsNiArNTg1LDcgQEAKICAgICB9CiAKICAgICBATWVkaXVtVGVzdAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE1udFNlY3VyZVNhbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgRmlsZSBmID0gbmV3IEZpbGUoIi9tbnQvc2VjdXJlIik7CiAgICAgICAgIGFzc2VydEZhbHNlKGYuY2FuUmVhZCgpKTsKQEAgLTUyNyw2ICs2MjIsNyBAQAogICAgICAqIHdpbGwgTk9UIGJlIGRldGVjdGVkIGJ5IHRoaXMgY29kZS4KICAgICAgKi8KICAgICBATGFyZ2VUZXN0CisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWxsT3RoZXJEaXJlY3Rvcmllc05vdFdyaXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEZpbGUgc3RhcnQgPSBuZXcgRmlsZSgiLyIpOwogICAgICAgICBTZXQ8RmlsZT4gd3JpdGFibGVEaXJzID0gZ2V0V3JpdGFibGVEaXJlY3Rvcmllc0FuZFN1YmRpcmVjdG9yaWVzT2Yoc3RhcnQpOwpAQCAtNzE3LDYgKzgxMyw3IEBACiAgICAgICogYSBiZXR0ZXIgd2F5Li4uCiAgICAgICovCiAgICAgQExhcmdlVGVzdAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE90aGVyUmFuZG9tRGlyZWN0b3JpZXNOb3RXcml0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBTZXQ8RmlsZT4gd3JpdGFibGVEaXJzID0gbmV3IEhhc2hTZXQ8RmlsZT4oKTsKICAgICAgICAgZm9yIChTdHJpbmcgZGlyIDogT1RIRVJfUkFORE9NX0RJUkVDVE9SSUVTKSB7CkBAIC03MjksNiArODI2LDcgQEAKICAgICB9CiAKICAgICBATGFyZ2VUZXN0CisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZGluZ1N5c0ZpbGVzRG9lc250RmFpbCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3IgPSBFeGVjdXRvcnMubmV3Q2FjaGVkVGhyZWFkUG9vbCgpOwogICAgICAgICB0cnlUb1JlYWRGcm9tQWxsSW4obmV3IEZpbGUoIi9zeXMiKSwgZXhlY3V0b3IpOwpAQCAtODIwLDYgKzkxOCw3IEBACiAgICAgICAgICAgICApKTsKIAogICAgIEBMYXJnZVRlc3QKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RBbGxGaWxlc0luU3lzQXJlTm90V3JpdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgU2V0PEZpbGU+IHdyaXRhYmxlID0gZ2V0QWxsV3JpdGFibGVGaWxlc0luRGlyQW5kU3ViRGlyKG5ldyBGaWxlKCIvc3lzIikpOwogICAgICAgICB3cml0YWJsZS5yZW1vdmVBbGwoU1lTX0VYQ0VQVElPTlMpOwpAQCAtODY4LDI4ICs5NjcsNTEgQEAKICAgICAgICAgcmV0dXJuIHJldHZhbDsKICAgICB9CiAKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTeXN0ZW1Nb3VudGVkUk8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgU3RydWN0U3RhdFZmcyB2ZnMgPSBPcy5zdGF0dmZzKCIvc3lzdGVtIik7CiAgICAgICAgIGFzc2VydFRydWUoIi9zeXN0ZW0gaXMgbm90IG1vdW50ZWQgcmVhZC1vbmx5IiwgKHZmcy5mX2ZsYWcgJiBPc0NvbnN0YW50cy5TVF9SRE9OTFkpICE9IDApOwogICAgIH0KIAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFJvb3RNb3VudGVkUk8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgU3RydWN0U3RhdFZmcyB2ZnMgPSBPcy5zdGF0dmZzKCIvIik7CiAgICAgICAgIGFzc2VydFRydWUoInJvb3RmcyBpcyBub3QgbW91bnRlZCByZWFkLW9ubHkiLCAodmZzLmZfZmxhZyAmIE9zQ29uc3RhbnRzLlNUX1JET05MWSkgIT0gMCk7CiAgICAgfQogCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmVuZG9yTW91bnRlZFJPKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cnVjdFN0YXRWZnMgdmZzID0gT3Muc3RhdHZmcygiL3ZlbmRvciIpOworICAgICAgICBhc3NlcnRUcnVlKCIvdmVuZG9yIGlzIG5vdCBtb3VudGVkIHJlYWQtb25seSIsICh2ZnMuZl9mbGFnICYgT3NDb25zdGFudHMuU1RfUkRPTkxZKSAhPSAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPZG1Nb3VudGVkUk8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RydWN0U3RhdFZmcyB2ZnMgPSBPcy5zdGF0dmZzKCIvb2RtIik7CisgICAgICAgIGFzc2VydFRydWUoIi9vZG0gaXMgbm90IG1vdW50ZWQgcmVhZC1vbmx5IiwgKHZmcy5mX2ZsYWcgJiBPc0NvbnN0YW50cy5TVF9SRE9OTFkpICE9IDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9lbU1vdW50ZWRSTygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJ1Y3RTdGF0VmZzIHZmcyA9IE9zLnN0YXR2ZnMoIi9vZW0iKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiL29lbSBpcyBub3QgbW91bnRlZCByZWFkLW9ubHkiLCAodmZzLmZfZmxhZyAmIE9zQ29uc3RhbnRzLlNUX1JET05MWSkgIT0gMCk7CisgICAgfQorCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGF0YU1vdW50ZWROb1N1aWROb0RldigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBTdHJ1Y3RTdGF0VmZzIHZmcyA9IE9zLnN0YXR2ZnMoZ2V0Q29udGV4dCgpLmdldEZpbGVzRGlyKCkuZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgICBhc3NlcnRUcnVlKCIvZGF0YSBpcyBub3QgbW91bnRlZCBOT1NVSUQiLCAodmZzLmZfZmxhZyAmIE9zQ29uc3RhbnRzLlNUX05PU1VJRCkgIT0gMCk7CiAgICAgICAgIGFzc2VydFRydWUoIi9kYXRhIGlzIG5vdCBtb3VudGVkIE5PREVWIiwgKHZmcy5mX2ZsYWcgJiBPc0NvbnN0YW50cy5TVF9OT0RFVikgIT0gMCk7CiAgICAgfQogCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWxsQmxvY2tEZXZpY2VzQXJlU2VjdXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFNldDxGaWxlPiBpbnNlY3VyZSA9IGdldEFsbEluc2VjdXJlRGV2aWNlc0luRGlyQW5kU3ViZGlyKG5ldyBGaWxlKCIvZGV2IiksIEZpbGVVdGlscy5TX0lGQkxLKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiRm91bmQgaW5zZWN1cmUgYmxvY2sgZGV2aWNlczogIiArIGluc2VjdXJlLnRvU3RyaW5nKCksCiAgICAgICAgICAgICAgICAgaW5zZWN1cmUuaXNFbXB0eSgpKTsKICAgICB9CiAKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3REZXZSYW5kb21Xb3JsZFJlYWRhYmxlQW5kV3JpdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoIi9kZXYvcmFuZG9tIik7CiAKQEAgLTkwNCw2ICsxMDI2LDcgQEAKICAgICAgICAgICAgICAgICAoc3RhdHVzLm1vZGUgJiAwNjY2KSA9PSAwNjY2KTsKICAgICB9CiAKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3REZXZVcmFuZG9tV29ybGRSZWFkYWJsZUFuZFdyaXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKCIvZGV2L3VyYW5kb20iKTsKIApAQCAtOTE4LDYgKzEwNDEsNyBAQAogICAgICAgICAgICAgICAgIChzdGF0dXMubW9kZSAmIDA2NjYpID09IDA2NjYpOwogICAgIH0KIAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdERldkh3UmFuZG9tTG9ja2VkRG93bigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZSgiL2Rldi9od19yYW5kb20iKTsKICAgICAgICAgaWYgKCFmLmV4aXN0cygpKSB7CkBAIC05NDksNiArMTA3Myw3IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RGaWxlSGFzT25seUNhcHNUaHJvd3NPbkludmFsaWRDYXBzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAvLyBFbnN1cmUgbmVnYXRpdmUgY2FwIGlkIGZhaWxzLgpAQCAtOTc5LDYgKzExMDQsNyBAQAogICAgICAqIGJyZWFrcG9pbnRzIGZvciBuYXRpdmUgY29kZSB3aWxsIG5vdCB3b3JrIGFzIHJ1bi1hcyB3aWxsIG5vdAogICAgICAqIGJlIGFibGUgdG8gcGVyZm9ybSByZXF1aXJlZCBlbGV2YXRlZC1wcml2aWxlZ2UgZnVuY3Rpb25hbGl0eS4KICAgICAgKi8KKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RSdW5Bc0hhc0NvcnJlY3RDYXBhYmlsaXRpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gZW5zdXJlIGZpbGUgaXMgdXNlciBhbmQgZ3JvdXAgcmVhZC9leGVjdXRhYmxlCiAgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9ICIvc3lzdGVtL2Jpbi9ydW4tYXMiOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcGVybWlzc2lvbi9zcmMvYW5kcm9pZC9wZXJtaXNzaW9uL2N0cy9Ob0F1ZGlvUGVybWlzc2lvblRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3Blcm1pc3Npb24vc3JjL2FuZHJvaWQvcGVybWlzc2lvbi9jdHMvTm9BdWRpb1Blcm1pc3Npb25UZXN0LmphdmEKaW5kZXggYjY5NTg0MC4uZjNjNWFlOCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvcGVybWlzc2lvbi9zcmMvYW5kcm9pZC9wZXJtaXNzaW9uL2N0cy9Ob0F1ZGlvUGVybWlzc2lvblRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uL3NyYy9hbmRyb2lkL3Blcm1pc3Npb24vY3RzL05vQXVkaW9QZXJtaXNzaW9uVGVzdC5qYXZhCkBAIC0yMSwxMiArMjEsOSBAQAogaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlNtYWxsVGVzdDsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ2RkVGVzdDsKLQogLyoqCiAgKiBWZXJpZnkgdGhlIGF1ZGlvIHJlbGF0ZWQgb3BlcmF0aW9ucyByZXF1aXJlIHNwZWNpZmljIHBlcm1pc3Npb25zLgogICovCi1AQ2RkVGVzdChyZXF1aXJlbWVudD0iMy4yLjEvQy0wLTEsOS4xL0MtMC0xIikKIHB1YmxpYyBjbGFzcyBOb0F1ZGlvUGVybWlzc2lvblRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgewogICAgIHByaXZhdGUgQXVkaW9NYW5hZ2VyIG1BdWRpb01hbmFnZXI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PREVfQ09VTlQgPSAzOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcGVybWlzc2lvbi9zcmMvYW5kcm9pZC9wZXJtaXNzaW9uL2N0cy9Ob0Jyb2FkY2FzdFBhY2thZ2VSZW1vdmVkUGVybWlzc2lvblRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3Blcm1pc3Npb24vc3JjL2FuZHJvaWQvcGVybWlzc2lvbi9jdHMvTm9Ccm9hZGNhc3RQYWNrYWdlUmVtb3ZlZFBlcm1pc3Npb25UZXN0LmphdmEKaW5kZXggYjAyMjNhOC4uNTYzMGM1YiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvcGVybWlzc2lvbi9zcmMvYW5kcm9pZC9wZXJtaXNzaW9uL2N0cy9Ob0Jyb2FkY2FzdFBhY2thZ2VSZW1vdmVkUGVybWlzc2lvblRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uL3NyYy9hbmRyb2lkL3Blcm1pc3Npb24vY3RzL05vQnJvYWRjYXN0UGFja2FnZVJlbW92ZWRQZXJtaXNzaW9uVGVzdC5qYXZhCkBAIC0yMSwxMiArMjEsOSBAQAogaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlNtYWxsVGVzdDsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ2RkVGVzdDsKLQogLyoqCiAgKiBWZXJpZnkgQ29udGV4dCByZWxhdGVkIG1ldGhvZHMgd2l0aG91dCBzcGVjaWZpYyBCUk9BRENBU1Qgc2VyaWVzIHBlcm1pc3Npb25zLgogICovCi1AQ2RkVGVzdChyZXF1aXJlbWVudD0iMy4yLjEvQy0wLTEsOS4xL0MtMC0xIikKIHB1YmxpYyBjbGFzcyBOb0Jyb2FkY2FzdFBhY2thZ2VSZW1vdmVkUGVybWlzc2lvblRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1JFQ0VJVkVSX1BFUk1JU1NJT04gPSAicmVjZWl2ZXJQZXJtaXNzaW9uIjsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcGVybWlzc2lvbi9zcmMvYW5kcm9pZC9wZXJtaXNzaW9uL2N0cy9Ob0tleVBlcm1pc3Npb25UZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uL3NyYy9hbmRyb2lkL3Blcm1pc3Npb24vY3RzL05vS2V5UGVybWlzc2lvblRlc3QuamF2YQppbmRleCA4ZWQ5MTQzLi41YTBiMjU5IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uL3NyYy9hbmRyb2lkL3Blcm1pc3Npb24vY3RzL05vS2V5UGVybWlzc2lvblRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uL3NyYy9hbmRyb2lkL3Blcm1pc3Npb24vY3RzL05vS2V5UGVybWlzc2lvblRlc3QuamF2YQpAQCAtMzIsNyArMzIsOSBAQAogICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHN1cGVyLnNldFVwKCk7CiAgICAgICAgIG1LZXlNYW5hZ2VyID0gKEtleWd1YXJkTWFuYWdlcikgbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LktFWUdVQVJEX1NFUlZJQ0UpOwotICAgICAgICBtS2V5TG9jayA9IG1LZXlNYW5hZ2VyLm5ld0tleWd1YXJkTG9jaygidGVzdFRhZyIpOworICAgICAgICBpZiAobUtleU1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbUtleUxvY2sgPSBtS2V5TWFuYWdlci5uZXdLZXlndWFyZExvY2soInRlc3RUYWciKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtNDIsNiArNDQsMTAgQEAKICAgICAgKi8KICAgICBAU21hbGxUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdERpc2FibGVLZXlndWFyZCgpIHsKKyAgICAgICAgLy8gS2V5Z3VhcmRNYW5hZ2VyIHdhcyBub3QgYWNjZXNzaWJsZSwgcGFzcy4KKyAgICAgICAgaWYgKG1LZXlNYW5hZ2VyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogICAgICAgICB0cnkgewogICAgICAgICAgICAgbUtleUxvY2suZGlzYWJsZUtleWd1YXJkKCk7CiAgICAgICAgICAgICBmYWlsKCJLZXlndWFyZE1hbmFnZXIuS2V5Z3VhcmRMb2NrLmRpc2FibGVLZXlndWFyZCBkaWQgbm90IHRocm93IFNlY3VyaXR5RXhjZXB0aW9uIGFzIgpAQCAtNTgsNiArNjQsMTAgQEAKICAgICAgKi8KICAgICBAU21hbGxUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFJlZW5hYmxlS2V5Z3VhcmQoKSB7CisgICAgICAgIC8vIEtleWd1YXJkTWFuYWdlciB3YXMgbm90IGFjY2Vzc2libGUsIHBhc3MuCisgICAgICAgIGlmIChtS2V5TWFuYWdlciA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG1LZXlMb2NrLnJlZW5hYmxlS2V5Z3VhcmQoKTsKICAgICAgICAgICAgIGZhaWwoIktleWd1YXJkTWFuYWdlci5LZXlndWFyZExvY2sucmVlbmFibGVLZXlndWFyZCBkaWQgbm90IHRocm93IFNlY3VyaXR5RXhjZXB0aW9uIGFzIgpAQCAtNzQsNiArODQsMTAgQEAKICAgICAgKi8KICAgICBAU21hbGxUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEV4aXRLZXlndWFyZFNlY3VyZWx5KCkgeworICAgICAgICAvLyBLZXlndWFyZE1hbmFnZXIgd2FzIG5vdCBhY2Nlc3NpYmxlLCBwYXNzLgorICAgICAgICBpZiAobUtleU1hbmFnZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBtS2V5TWFuYWdlci5leGl0S2V5Z3VhcmRTZWN1cmVseShudWxsKTsKICAgICAgICAgICAgIGZhaWwoIktleWd1YXJkTWFuYWdlci5leGl0S2V5Z3VhcmRTZWN1cmVseSBkaWQgbm90IHRocm93IFNlY3VyaXR5RXhjZXB0aW9uIGFzIgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcGVybWlzc2lvbi9zcmMvYW5kcm9pZC9wZXJtaXNzaW9uL2N0cy9Ob0xvY2F0aW9uUGVybWlzc2lvblRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3Blcm1pc3Npb24vc3JjL2FuZHJvaWQvcGVybWlzc2lvbi9jdHMvTm9Mb2NhdGlvblBlcm1pc3Npb25UZXN0LmphdmEKaW5kZXggOWIyZWMxNS4uOGZkNGE1OSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvcGVybWlzc2lvbi9zcmMvYW5kcm9pZC9wZXJtaXNzaW9uL2N0cy9Ob0xvY2F0aW9uUGVybWlzc2lvblRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uL3NyYy9hbmRyb2lkL3Blcm1pc3Npb24vY3RzL05vTG9jYXRpb25QZXJtaXNzaW9uVGVzdC5qYXZhCkBAIC0zMSwxNCArMzEsMTEgQEAKIGltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OwogaW1wb3J0IGFuZHJvaWQudGVzdC5VaVRocmVhZFRlc3Q7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNkZFRlc3Q7Ci0KIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogLyoqCiAgKiBWZXJpZnkgdGhlIGxvY2F0aW9uIGFjY2VzcyB3aXRob3V0IHNwZWNpZmljIHBlcm1pc3Npb25zLgogICovCi1AQ2RkVGVzdChyZXF1aXJlbWVudD0iMy4yLjEvQy0wLTEsOS9DLTAtMSw5LjEvQy0wLTEiKQogcHVibGljIGNsYXNzIE5vTG9jYXRpb25QZXJtaXNzaW9uVGVzdCBleHRlbmRzIEluc3RydW1lbnRhdGlvblRlc3RDYXNlIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9QUk9WSURFUl9OQU1FID0gInRlc3RQcm92aWRlciI7CiAKQEAgLTEzMCw3ICsxMjcsNyBAQAogICAgIC8qKgogICAgICAqIEhlbHBlciBtZXRob2QgdG8gdmVyaWZ5IHRoYXQgY2FsbGluZyByZXF1ZXN0TG9jYXRpb25VcGRhdGVzIHdpdGggZ2l2ZW4KICAgICAgKiBwcm92aWRlciB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24uCi0gICAgICoKKyAgICAgKiAKICAgICAgKiBAcGFyYW0gcHJvdmlkZXIgdGhlIFN0cmluZyBwcm92aWRlciBuYW1lLgogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBjaGVja1JlcXVlc3RMb2NhdGlvblVwZGF0ZXMoU3RyaW5nIHByb3ZpZGVyKSB7CkBAIC0yMDEsNyArMTk4LDcgQEAKICAgICAvKioKICAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIHZlcmlmeSB0aGF0IGNhbGxpbmcgZ2V0TGFzdEtub3duTG9jYXRpb24gd2l0aCBnaXZlbgogICAgICAqIHByb3ZpZGVyIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbi4KLSAgICAgKgorICAgICAqIAogICAgICAqIEBwYXJhbSBwcm92aWRlciB0aGUgU3RyaW5nIHByb3ZpZGVyIG5hbWUuCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIGNoZWNrR2V0TGFzdEtub3duTG9jYXRpb24oU3RyaW5nIHByb3ZpZGVyKSB7CkBAIC0yNDQsNyArMjQxLDcgQEAKICAgICAvKioKICAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIHZlcmlmeSB0aGF0IGNhbGxpbmcgZ2V0UHJvdmlkZXIgd2l0aCBnaXZlbiBwcm92aWRlcgogICAgICAqIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbi4KLSAgICAgKgorICAgICAqIAogICAgICAqIEBwYXJhbSBwcm92aWRlciB0aGUgU3RyaW5nIHByb3ZpZGVyIG5hbWUuCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIGNoZWNrR2V0UHJvdmlkZXIoU3RyaW5nIHByb3ZpZGVyKSB7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uL3NyYy9hbmRyb2lkL3Blcm1pc3Npb24vY3RzL05vUmVhZExvZ3NQZXJtaXNzaW9uVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvcGVybWlzc2lvbi9zcmMvYW5kcm9pZC9wZXJtaXNzaW9uL2N0cy9Ob1JlYWRMb2dzUGVybWlzc2lvblRlc3QuamF2YQppbmRleCAwYWI2MWY1Li43YjM3OTlkIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uL3NyYy9hbmRyb2lkL3Blcm1pc3Npb24vY3RzL05vUmVhZExvZ3NQZXJtaXNzaW9uVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3Blcm1pc3Npb24vc3JjL2FuZHJvaWQvcGVybWlzc2lvbi9jdHMvTm9SZWFkTG9nc1Blcm1pc3Npb25UZXN0LmphdmEKQEAgLTI0LDggKzI0LDYgQEAKIGltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTWVkaXVtVGVzdDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DZGRUZXN0OwotCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTM0LDcgKzMyLDYgQEAKIC8qKgogICogVmVyaWZ5IHRoZSByZWFkIHN5c3RlbSBsb2cgcmVxdWlyZSBzcGVjaWZpYyBwZXJtaXNzaW9ucy4KICAqLwotQENkZFRlc3QocmVxdWlyZW1lbnQ9IjMuMi4xL0MtMC0xLDkvQy0wLTEsOS4xL0MtMC0xIikKIHB1YmxpYyBjbGFzcyBOb1JlYWRMb2dzUGVybWlzc2lvblRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgewogICAgIC8qKgogICAgICAqIFZlcmlmeSB0aGF0IHdlJ2xsIG9ubHkgZ2V0IG91ciBsb2dzIHdpdGhvdXQgdGhlIFJFQURfTE9HUyBwZXJtaXNzaW9uLgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcGVybWlzc2lvbi9zcmMvYW5kcm9pZC9wZXJtaXNzaW9uL2N0cy9Ob1N5c3RlbUZ1bmN0aW9uUGVybWlzc2lvblRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3Blcm1pc3Npb24vc3JjL2FuZHJvaWQvcGVybWlzc2lvbi9jdHMvTm9TeXN0ZW1GdW5jdGlvblBlcm1pc3Npb25UZXN0LmphdmEKaW5kZXggOTE4MGM3Ny4uMGNjZWJlZCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvcGVybWlzc2lvbi9zcmMvYW5kcm9pZC9wZXJtaXNzaW9uL2N0cy9Ob1N5c3RlbUZ1bmN0aW9uUGVybWlzc2lvblRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uL3NyYy9hbmRyb2lkL3Blcm1pc3Npb24vY3RzL05vU3lzdGVtRnVuY3Rpb25QZXJtaXNzaW9uVGVzdC5qYXZhCkBAIC0yNCw2ICsyNCw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwogaW1wb3J0IGFuZHJvaWQub3MuVmlicmF0b3I7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOwogaW1wb3J0IGFuZHJvaWQudGVsZXBob255LmdzbS5TbXNNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlNtYWxsVGVzdDsKQEAgLTgyLDYgKzgzLDcgQEAKICAgICAgKiAgIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jU0VUX1dBTExQQVBFUn0uCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAKICAgICAgKi8KKyAgICBAQXBwTW9kZUZ1bGwocmVhc29uID0gIkluc3RhbnQgYXBwcyBjYW5ub3QgYWNjZXNzIHRoZSBXYWxscGFwZXJNYW5hZ2VyIikKICAgICBAU21hbGxUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFNldFdhbGxwYXBlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghV2FsbHBhcGVyTWFuYWdlci5nZXRJbnN0YW5jZShtQ29udGV4dCkuaXNXYWxscGFwZXJTdXBwb3J0ZWQoKSkgewpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcGVybWlzc2lvbi9zcmMvYW5kcm9pZC9wZXJtaXNzaW9uL2N0cy9Ob1dha2VMb2NrUGVybWlzc2lvblRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3Blcm1pc3Npb24vc3JjL2FuZHJvaWQvcGVybWlzc2lvbi9jdHMvTm9XYWtlTG9ja1Blcm1pc3Npb25UZXN0LmphdmEKaW5kZXggZWMxMWEwYy4uZmQ3ZTk3NyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvcGVybWlzc2lvbi9zcmMvYW5kcm9pZC9wZXJtaXNzaW9uL2N0cy9Ob1dha2VMb2NrUGVybWlzc2lvblRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uL3NyYy9hbmRyb2lkL3Blcm1pc3Npb24vY3RzL05vV2FrZUxvY2tQZXJtaXNzaW9uVGVzdC5qYXZhCkBAIC0yMiw2ICsyMiw3IEBACiBpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldpZmlMb2NrOwogaW1wb3J0IGFuZHJvaWQub3MuUG93ZXJNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIGltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwogaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TbWFsbFRlc3Q7CiAKQEAgLTQ1LDYgKzQ2LDcgQEAKICAgICAgKiA8cD5SZXF1aXJlcyBQZXJtaXNzaW9uOgogICAgICAqICAge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNXQUtFX0xPQ0t9LgogICAgICAqLworICAgIEBBcHBNb2RlRnVsbChyZWFzb24gPSAiSW5zdGFudCBhcHBzIGNhbm5vdCBhY2Nlc3MgdGhlIFdpZmlNYW5hZ2VyIikKICAgICBAU21hbGxUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFdpZmlMb2NrQWNxdWlyZSgpIHsKICAgICAgICAgZmluYWwgV2lmaU1hbmFnZXIgd2lmaU1hbmFnZXIgPSAoV2lmaU1hbmFnZXIpIG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uL3NyYy9hbmRyb2lkL3Blcm1pc3Npb24vY3RzL05vV2FsbHBhcGVyUGVybWlzc2lvbnNUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uL3NyYy9hbmRyb2lkL3Blcm1pc3Npb24vY3RzL05vV2FsbHBhcGVyUGVybWlzc2lvbnNUZXN0LmphdmEKaW5kZXggYWQzMjkyMy4uZGYxYTQyYyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvcGVybWlzc2lvbi9zcmMvYW5kcm9pZC9wZXJtaXNzaW9uL2N0cy9Ob1dhbGxwYXBlclBlcm1pc3Npb25zVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3Blcm1pc3Npb24vc3JjL2FuZHJvaWQvcGVybWlzc2lvbi9jdHMvTm9XYWxscGFwZXJQZXJtaXNzaW9uc1Rlc3QuamF2YQpAQCAtMjQsNiArMjQsNyBAQAogaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XaWZpTG9jazsKIGltcG9ydCBhbmRyb2lkLm9zLlBvd2VyTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OwogCkBAIC0zNiw2ICszNyw3IEBACiAvKioKICAqIFZlcmlmeSB0aGF0IFdhbGxwYXBlci1yZWxhdGVkIG9wZXJhdGlvbnMgZW5mb3JjZSB0aGUgY29ycmVjdCBwZXJtaXNzaW9ucy4KICAqLworQEFwcE1vZGVGdWxsKHJlYXNvbiA9ICJpbnN0YW50IGFwcHMgY2Fubm90IGFjY2VzcyB0aGUgV2FsbHBhcGVyTWFuYWdlciIpCiBwdWJsaWMgY2xhc3MgTm9XYWxscGFwZXJQZXJtaXNzaW9uc1Rlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgewogICAgIHByaXZhdGUgV2FsbHBhcGVyTWFuYWdlciBtV007CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3Blcm1pc3Npb24vc3JjL2FuZHJvaWQvcGVybWlzc2lvbi9jdHMvTm9XaWZpU3RhdGVQZXJtaXNzaW9uVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvcGVybWlzc2lvbi9zcmMvYW5kcm9pZC9wZXJtaXNzaW9uL2N0cy9Ob1dpZmlTdGF0ZVBlcm1pc3Npb25UZXN0LmphdmEKaW5kZXggMTIyZWQwZi4uZDhhY2Q1MCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvcGVybWlzc2lvbi9zcmMvYW5kcm9pZC9wZXJtaXNzaW9uL2N0cy9Ob1dpZmlTdGF0ZVBlcm1pc3Npb25UZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvcGVybWlzc2lvbi9zcmMvYW5kcm9pZC9wZXJtaXNzaW9uL2N0cy9Ob1dpZmlTdGF0ZVBlcm1pc3Npb25UZXN0LmphdmEKQEAgLTE5LDE1ICsxOSwxNCBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaUNvbmZpZ3VyYXRpb247CiBpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DZGRUZXN0OwotCiAvKioKICAqIFZlcmlmeSBXaWZpTWFuYWdlciByZWxhdGVkIG1ldGhvZHMgd2l0aG91dCBzcGVjaWZpYyBXaWZpIHN0YXRlIHBlcm1pc3Npb25zLgogICovCi1AQ2RkVGVzdChyZXF1aXJlbWVudD0iMy4yLjEvQy0wLTEsOS9DLTAtMSw5LjEvQy0wLTEiKQorQEFwcE1vZGVGdWxsKHJlYXNvbiA9ICJJbnN0YW50IGFwcHMgY2Fubm90IGFjY2VzcyB0aGUgV2lmaU1hbmFnZXIiKQogQFNtYWxsVGVzdAogcHVibGljIGNsYXNzIE5vV2lmaVN0YXRlUGVybWlzc2lvblRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBURVNUX05FVF9JRCA9IDE7CkBAIC0yMjYsMjAgKzIyNSw2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVmVyaWZ5IHRoYXQgV2lmaU1hbmFnZXIjc2F2ZUNvbmZpZ3VyYXRpb24oKSByZXF1aXJlcyBwZXJtaXNzaW9ucy4KLSAgICAgKiA8cD5SZXF1aXJlcyBQZXJtaXNzaW9uOgotICAgICAqICAge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNDSEFOR0VfV0lGSV9TVEFURX0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFNhdmVDb25maWd1cmF0aW9uKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgbVdpZmlNYW5hZ2VyLnNhdmVDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgICAgICBmYWlsKCJXaWZpTWFuYWdlci5zYXZlQ29uZmlndXJhdGlvbiBkaWRuJ3QgdGhyb3cgU2VjdXJpdHlFeGNlcHRpb24gYXMgZXhwZWN0ZWQiKTsKLSAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gZXhwZWN0ZWQKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgogICAgICAqIFZlcmlmeSB0aGF0IFdpZmlNYW5hZ2VyI3BpbmdTdXBwbGljYW50KCkgcmVxdWlyZXMgcGVybWlzc2lvbnMuCiAgICAgICogPHA+UmVxdWlyZXMgUGVybWlzc2lvbjoKICAgICAgKiAgIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jQ0hBTkdFX1dJRklfU1RBVEV9LgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcGVybWlzc2lvbi9zcmMvYW5kcm9pZC9wZXJtaXNzaW9uL2N0cy9QYWNrYWdlTWFuYWdlclJlcXVpcmluZ1Blcm1pc3Npb25zVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvcGVybWlzc2lvbi9zcmMvYW5kcm9pZC9wZXJtaXNzaW9uL2N0cy9QYWNrYWdlTWFuYWdlclJlcXVpcmluZ1Blcm1pc3Npb25zVGVzdC5qYXZhCmluZGV4IDc2NDUxM2MuLmRmM2VjM2MgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3Blcm1pc3Npb24vc3JjL2FuZHJvaWQvcGVybWlzc2lvbi9jdHMvUGFja2FnZU1hbmFnZXJSZXF1aXJpbmdQZXJtaXNzaW9uc1Rlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uL3NyYy9hbmRyb2lkL3Blcm1pc3Npb24vY3RzL1BhY2thZ2VNYW5hZ2VyUmVxdWlyaW5nUGVybWlzc2lvbnNUZXN0LmphdmEKQEAgLTE5LDE1ICsxOSwxMyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOwogaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlNtYWxsVGVzdDsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ2RkVGVzdDsKLQogLyoqCiAgKiBWZXJpZnkgdGhlIFBhY2thZ2VNYW5hZ2VyIHJlbGF0ZWQgb3BlcmF0aW9ucyByZXF1aXJlIHNwZWNpZmljIHBlcm1pc3Npb25zLgogICovCi1AQ2RkVGVzdChyZXF1aXJlbWVudD0iMy4yLjEvQy0wLTEsOS9DLTAtMSw5LjEvQy0wLTEiKQogQFNtYWxsVGVzdAogcHVibGljIGNsYXNzIFBhY2thZ2VNYW5hZ2VyUmVxdWlyaW5nUGVybWlzc2lvbnNUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKICAgICAvLyBNdXN0IGJlIGEga25vd24tcHJlc2VudCBhcHBsaWNhdGlvbiBwYWNrYWdlIG90aGVyIHRoYW4gdGhlIG9uZSBob3N0aW5nIHRoaXMgY2xhc3MKQEAgLTgxLDYgKzc5LDggQEAKICAgICAgKiA8cD5SZXF1aXJlcyBQZXJtaXNzaW9uOgogICAgICAqICAge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNTRVRfUFJFRkVSUkVEX0FQUExJQ0FUSU9OU30uCiAgICAgICovCisgICAgQEFwcE1vZGVGdWxsKHJlYXNvbiA9ICJjbGVhclBhY2thZ2VQcmVmZXJyZWRBY3Rpdml0aWVzIGFsd2F5cyByZXR1cm5zIG51bGwgZm9yIGluc3RhbnQgYXBwcyAiCisgICAgICAgICAgICArICIoaXQgZG9lcyBub3QgZXZlbiBjaGVjayBmb3IgcGVybWlzc2lvbnMpIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJQYWNrYWdlUHJlZmVycmVkQWN0aXZpdGllcygpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG1QYWNrYWdlTWFuYWdlci5jbGVhclBhY2thZ2VQcmVmZXJyZWRBY3Rpdml0aWVzKG51bGwpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcGVybWlzc2lvbi9zcmMvYW5kcm9pZC9wZXJtaXNzaW9uL2N0cy9QZXJtaXNzaW9uR3JvdXBDaGFuZ2UuamF2YSBiL3Rlc3RzL3Rlc3RzL3Blcm1pc3Npb24vc3JjL2FuZHJvaWQvcGVybWlzc2lvbi9jdHMvUGVybWlzc2lvbkdyb3VwQ2hhbmdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA3ODhkNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3Blcm1pc3Npb24vc3JjL2FuZHJvaWQvcGVybWlzc2lvbi9jdHMvUGVybWlzc2lvbkdyb3VwQ2hhbmdlLmphdmEKQEAgLTAsMCArMSwxNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQucGVybWlzc2lvbi5jdHM7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LkludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZUluZm8uUkVRVUVTVEVEX1BFUk1JU1NJT05fR1JBTlRFRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLkdFVF9QRVJNSVNTSU9OUzsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZUluZm87CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5TZWN1cml0eVRlc3Q7CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QudWlhdXRvbWF0b3IuVWlEZXZpY2U7CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QudWlhdXRvbWF0b3IuVWlTY3JvbGxhYmxlOworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLlVpU2VsZWN0b3I7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU2Nyb2xsVmlldzsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlN5c3RlbVV0aWw7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK3B1YmxpYyBjbGFzcyBQZXJtaXNzaW9uR3JvdXBDaGFuZ2UgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBfUEtHX05BTUUgPSAiYW5kcm9pZC5wZXJtaXNzaW9uLmN0cy5hcHB0aGF0cmVxdWVzdHBlcm1pc3Npb24iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgRVhQRUNURURfQkVIQVZJT1JfVElNRU9VVF9TRUMgPSAxNTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFVORVhQRUNURURfQkVIQVZJT1JfVElNRU9VVF9TRUMgPSAyOworCisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgVWlEZXZpY2UgbVVpRGV2aWNlOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldENvbnRleHRBbmRVaURldmljZSgpIHsKKyAgICAgICAgbUNvbnRleHQgPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRUYXJnZXRDb250ZXh0KCk7CisgICAgICAgIG1VaURldmljZSA9IFVpRGV2aWNlLmdldEluc3RhbmNlKEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpKTsKKyAgICB9CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgd2FrZVVwU2NyZWVuKCkgeworICAgICAgICBTeXN0ZW1VdGlsLnJ1blNoZWxsQ29tbWFuZCgiaW5wdXQga2V5ZXZlbnQgS0VZQ09ERV9XQUtFVVAiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyeSBmb3IgYSB0aW1lIHVudGlsIHRoZSBydW5uYWJsZSBzdG9wcyB0aHJvd2luZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBydW5uYWJsZSBUaGUgY29uZGl0aW9uIHRvIGV4ZWN1dGUKKyAgICAgKiBAcGFyYW0gdGltZW91dFNlYyBUaGUgdGltZSB0byB0cnkKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZXZlbnR1YWxseShUaHJvd2luZ1J1bm5hYmxlIHJ1bm5hYmxlLCBsb25nIHRpbWVvdXRTZWMpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBsb25nIHN0YXJ0VGltZSA9IFN5c3RlbS5uYW5vVGltZSgpOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBydW5uYWJsZS5ydW4oKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIGlmIChTeXN0ZW0ubmFub1RpbWUoKSAtIHN0YXJ0VGltZSA8IFRpbWVVbml0LlNFQ09ORFMudG9OYW5vcyh0aW1lb3V0U2VjKSkgeworICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGhyb3cgdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHJpdmF0ZSB2b2lkIHNjcm9sbFRvQm90dG9tSWZXYXRjaCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAobUNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKS5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfV0FUQ0gpKSB7CisgICAgICAgICAgICBVaVNjcm9sbGFibGUgc2Nyb2xsYWJsZSA9IG5ldyBVaVNjcm9sbGFibGUoCisgICAgICAgICAgICAgICAgICAgIG5ldyBVaVNlbGVjdG9yKCkuY2xhc3NOYW1lKFNjcm9sbFZpZXcuY2xhc3MpKTsKKyAgICAgICAgICAgIGlmIChzY3JvbGxhYmxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgc2Nyb2xsYWJsZS5mbGluZ1RvRW5kKDEwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGNsaWNrQWxsb3dCdXR0b24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbVVpRGV2aWNlLmZpbmRPYmplY3QobmV3IFVpU2VsZWN0b3IoKS5yZXNvdXJjZUlkKAorICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5wYWNrYWdlaW5zdGFsbGVyOmlkL3Blcm1pc3Npb25fYWxsb3dfYnV0dG9uIikpLmNsaWNrKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGdyYW50UGVybWlzc2lvblZpYVVpKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGV2ZW50dWFsbHkoKCkgLT4geworICAgICAgICAgICAgc2Nyb2xsVG9Cb3R0b21JZldhdGNoKCk7CisgICAgICAgICAgICBjbGlja0FsbG93QnV0dG9uKCk7CisgICAgICAgIH0sIEVYUEVDVEVEX0JFSEFWSU9SX1RJTUVPVVRfU0VDKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgd2FpdFVudGlsUGVybWlzc2lvbkdyYW50ZWQoU3RyaW5nIHBlcm1OYW1lLCBsb25nIHRpbWVvdXRTZWMpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBldmVudHVhbGx5KCgpIC0+IHsKKyAgICAgICAgICAgIFBhY2thZ2VJbmZvIGFwcEluZm8gPSBtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpLmdldFBhY2thZ2VJbmZvKEFQUF9QS0dfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgR0VUX1BFUk1JU1NJT05TKTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcHBJbmZvLnJlcXVlc3RlZFBlcm1pc3Npb25zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGFwcEluZm8ucmVxdWVzdGVkUGVybWlzc2lvbnNbaV0uZXF1YWxzKHBlcm1OYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKChhcHBJbmZvLnJlcXVlc3RlZFBlcm1pc3Npb25zRmxhZ3NbaV0gJiBSRVFVRVNURURfUEVSTUlTU0lPTl9HUkFOVEVEKQorICAgICAgICAgICAgICAgICAgICAgICAgIT0gMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmFpbChwZXJtTmFtZSArICIgbm90IGdyYW50ZWQiKTsKKyAgICAgICAgfSwgdGltZW91dFNlYyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluc3RhbGxBcHAoU3RyaW5nIGFwaykgeworICAgICAgICBTdHJpbmcgaW5zdGFsbFJlc3VsdCA9IFN5c3RlbVV0aWwucnVuU2hlbGxDb21tYW5kKAorICAgICAgICAgICAgICAgICJwbSBpbnN0YWxsIC1yIGRhdGEvbG9jYWwvdG1wL2N0cy9wZXJtaXNzaW9ucy8iICsgYXBrICsgIi5hcGsiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJTdWNjZXNzIiwgaW5zdGFsbFJlc3VsdC50cmltKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IHRoZSBhcHAuIFRoZSBhcHAgd2lsbCByZXF1ZXN0IHRoZSBwZXJtaXNzaW9ucy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc3RhcnRBcHAoKSB7CisgICAgICAgIEludGVudCBzdGFydEFwcCA9IG5ldyBJbnRlbnQoKTsKKyAgICAgICAgc3RhcnRBcHAuc2V0Q29tcG9uZW50KG5ldyBDb21wb25lbnROYW1lKEFQUF9QS0dfTkFNRSwgQVBQX1BLR19OQU1FICsgIi5SZXF1ZXN0UGVybWlzc2lvbiIpKTsKKyAgICAgICAgc3RhcnRBcHAuc2V0RmxhZ3MoRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7CisKKyAgICAgICAgbUNvbnRleHQuc3RhcnRBY3Rpdml0eShzdGFydEFwcCk7CisgICAgfQorCisgICAgQFNlY3VyaXR5VGVzdAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcGVybWlzc2lvbkdyb3VwU2hvdWxkTm90QmVBdXRvR3JhbnRlZElmTmV3TWVtYmVyKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGluc3RhbGxBcHAoIkN0c0FwcFRoYXRSZXF1ZXN0c1Blcm1pc3Npb25BYW5kQiIpOworCisgICAgICAgIHN0YXJ0QXBwKCk7CisgICAgICAgIGdyYW50UGVybWlzc2lvblZpYVVpKCk7CisgICAgICAgIHdhaXRVbnRpbFBlcm1pc3Npb25HcmFudGVkKCJhbmRyb2lkLnBlcm1pc3Npb24uY3RzLmFwcHRoYXRyZXF1ZXN0cGVybWlzc2lvbi5BIiwKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9CRUhBVklPUl9USU1FT1VUX1NFQyk7CisKKyAgICAgICAgLy8gVXBkYXRlIGFwcCB3aGljaCBjaGFuZ2VzIHRoZSBwZXJtaXNzaW9uIGdyb3VwIG9mICJhbmRyb2lkLnBlcm1pc3Npb24uY3RzCisgICAgICAgIC8vIC5hcHB0aGF0cmVxdWVzdHBlcm1pc3Npb24uQSIgdG8gdGhlIHNhbWUgYXMgImFuZHJvaWQucGVybWlzc2lvbi5jdHMuQyIKKyAgICAgICAgaW5zdGFsbEFwcCgiQ3RzQXBwVGhhdFJlcXVlc3RzUGVybWlzc2lvbkFhbmRDIik7CisKKyAgICAgICAgc3RhcnRBcHAoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIFRoZSBwZXJtaXNzaW9uIHNob3VsZCBub3QgYmUgYXV0by1ncmFudGVkCisgICAgICAgICAgICB3YWl0VW50aWxQZXJtaXNzaW9uR3JhbnRlZCgiYW5kcm9pZC5wZXJtaXNzaW9uLmN0cy5DIiwgVU5FWFBFQ1RFRF9CRUhBVklPUl9USU1FT1VUX1NFQyk7CisgICAgICAgICAgICBmYWlsKCJhbmRyb2lkLnBlcm1pc3Npb24uY3RzLkMgd2FzIGF1dG8tZ3JhbnRlZCIpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZXhwZWN0ZWQpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiYW5kcm9pZC5wZXJtaXNzaW9uLmN0cy5DIG5vdCBncmFudGVkIiwgZXhwZWN0ZWQuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgaW50ZXJmYWNlIFRocm93aW5nUnVubmFibGUgeworICAgICAgICB2b2lkIHJ1bigpIHRocm93cyBUaHJvd2FibGU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcGVybWlzc2lvbi9zcmMvYW5kcm9pZC9wZXJtaXNzaW9uL2N0cy9Qcm92aWRlclBlcm1pc3Npb25UZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uL3NyYy9hbmRyb2lkL3Blcm1pc3Npb24vY3RzL1Byb3ZpZGVyUGVybWlzc2lvblRlc3QuamF2YQppbmRleCA5MDlhYzM1Li5lYzBkZTQ5IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uL3NyYy9hbmRyb2lkL3Blcm1pc3Npb24vY3RzL1Byb3ZpZGVyUGVybWlzc2lvblRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uL3NyYy9hbmRyb2lkL3Blcm1pc3Npb24vY3RzL1Byb3ZpZGVyUGVybWlzc2lvblRlc3QuamF2YQpAQCAtMjEsNiArMjEsOCBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlSW5mbzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlJlc29sdmVJbmZvOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5DYWxsTG9nOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHM7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKQEAgLTU1LDExICs1NywyOCBAQAogICAgICAgICAgICAgICAgIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5XUklURV9DT05UQUNUUyk7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgYXNzZXJ0V3JpdGluZ0NvbnRlbnRVcmlSZXF1aXJlc1Blcm1pc3Npb24oVXJpIHVyaSwgU3RyaW5nIHBlcm1pc3Npb24sCisgICAgICAgICAgICBib29sZWFuIGFsbG93SUFFKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBnZXRDb250ZXh0KCkuZ2V0Q29udGVudFJlc29sdmVyKCkuaW5zZXJ0KHVyaSwgbmV3IENvbnRlbnRWYWx1ZXMoKSk7CisgICAgICAgICAgICBmYWlsKCJleHBlY3RlZCBTZWN1cml0eUV4Y2VwdGlvbiByZXF1aXJpbmcgIiArIHBlcm1pc3Npb24pOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaWYgKCFhbGxvd0lBRSkgeworICAgICAgICAgICAgICAgIGZhaWwoImV4cGVjdGVkIFNlY3VyaXR5RXhjZXB0aW9uIHJlcXVpcmluZyAiICsgcGVybWlzc2lvbiArICIgZ290ICIgKyBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoInNlY3VyaXR5IGV4Y2VwdGlvbidzIGVycm9yIG1lc3NhZ2UuIiwgZXhwZWN0ZWQuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImVycm9yIG1lc3NhZ2Ugc2hvdWxkIGNvbnRhaW4gIiArIHBlcm1pc3Npb24gKyAiLiIsCisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLmdldE1lc3NhZ2UoKS5jb250YWlucyhwZXJtaXNzaW9uKSk7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKICAgICAgKiBWZXJpZnkgdGhhdCByZWFkaW5nIGNhbGwgbG9ncyByZXF1aXJlcyBwZXJtaXNzaW9ucy4KICAgICAgKiA8cD5UZXN0cyBQZXJtaXNzaW9uOgogICAgICAqICAge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNSRUFEX0NBTExfTE9HfQogICAgICAqLworICAgIEBBcHBNb2RlRnVsbAogICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkQ2FsbExvZygpIHsKICAgICAgICAgYXNzZXJ0UmVhZGluZ0NvbnRlbnRVcmlSZXF1aXJlc1Blcm1pc3Npb24oQ2FsbExvZy5DT05URU5UX1VSSSwKICAgICAgICAgICAgICAgICBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uUkVBRF9DQUxMX0xPRyk7CkBAIC03Miw3ICs5MSw4IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdGVzdFdyaXRlQ2FsbExvZygpIHsKICAgICAgICAgYXNzZXJ0V3JpdGluZ0NvbnRlbnRVcmlSZXF1aXJlc1Blcm1pc3Npb24oQ2FsbExvZy5DT05URU5UX1VSSSwKLSAgICAgICAgICAgICAgICBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uV1JJVEVfQ0FMTF9MT0cpOworICAgICAgICAgICAgICAgIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5XUklURV9DQUxMX0xPRywKKyAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuZ2V0UGFja2FnZU1hbmFnZXIoKS5pc0luc3RhbnRBcHAoKSk7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uL3NyYy9hbmRyb2lkL3Blcm1pc3Npb24vY3RzL1NlcnZpY2VzSW5zdGFudEFwcHNDYW5ub3RBY2Nlc3NUZXN0cy5qYXZhIGIvdGVzdHMvdGVzdHMvcGVybWlzc2lvbi9zcmMvYW5kcm9pZC9wZXJtaXNzaW9uL2N0cy9TZXJ2aWNlc0luc3RhbnRBcHBzQ2Fubm90QWNjZXNzVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjA5ZTMzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvcGVybWlzc2lvbi9zcmMvYW5kcm9pZC9wZXJtaXNzaW9uL2N0cy9TZXJ2aWNlc0luc3RhbnRBcHBzQ2Fubm90QWNjZXNzVGVzdHMuamF2YQpAQCAtMCwwICsxLDkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnBlcm1pc3Npb24uY3RzOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5Db250ZXh0LkRFVklDRV9QT0xJQ1lfU0VSVklDRTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LkNvbnRleHQuRklOR0VSUFJJTlRfU0VSVklDRTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LkNvbnRleHQuU0hPUlRDVVRfU0VSVklDRTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LkNvbnRleHQuVVNCX1NFUlZJQ0U7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5Db250ZXh0LldBTExQQVBFUl9TRVJWSUNFOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dC5XSUZJX0FXQVJFX1NFUlZJQ0U7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5Db250ZXh0LldJRklfUDJQX1NFUlZJQ0U7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5Db250ZXh0LldJRklfU0VSVklDRTsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUluc3RhbnQ7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKKy8qKgorICogU29tZSBzZXJ2aWNlcyBhcmUgbm90IGF2YWlsYWJsZSB0byBpbnN0YW50IGFwcHMsIHNlZSB7QGxpbmsgQ29udGV4dCNnZXRTeXN0ZW1TZXJ2aWNlfS4KKyAqLworQEFwcE1vZGVJbnN0YW50CitAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIFNlcnZpY2VzSW5zdGFudEFwcHNDYW5ub3RBY2Nlc3NUZXN0cyB7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBjYW5ub3RHZXREZXZpY2VQb2xpY3lNYW5hZ2VyKCkgeworICAgIGFzc2VydE51bGwoSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0VGFyZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoCisgICAgICAgICAgICBERVZJQ0VfUE9MSUNZX1NFUlZJQ0UpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGNhbm5vdEdldEZpbmdlcnByaW50TWFuYWdlcigpIHsKKyAgICAgICAgYXNzZXJ0TnVsbChJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRUYXJnZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZSgKKyAgICAgICAgICAgICAgICBGSU5HRVJQUklOVF9TRVJWSUNFKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBjYW5ub3RHZXRTaG9ydGN1dE1hbmFnZXIoKSB7CisgICAgICAgIGFzc2VydE51bGwoSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0VGFyZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoCisgICAgICAgICAgICAgICAgU0hPUlRDVVRfU0VSVklDRSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgY2Fubm90R2V0VXNiTWFuYWdlcigpIHsKKyAgICAgICAgYXNzZXJ0TnVsbChJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRUYXJnZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZSgKKyAgICAgICAgICAgICAgICBVU0JfU0VSVklDRSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgY2Fubm90R2V0V2FsbHBhcGVyTWFuYWdlcigpIHsKKyAgICAgICAgYXNzZXJ0TnVsbChJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRUYXJnZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZSgKKyAgICAgICAgICAgICAgICBXQUxMUEFQRVJfU0VSVklDRSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgY2Fubm90R2V0V2lmaVAycE1hbmFnZXIoKSB7CisgICAgICAgIGFzc2VydE51bGwoSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0VGFyZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoCisgICAgICAgICAgICAgICAgV0lGSV9QMlBfU0VSVklDRSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgY2Fubm90R2V0V2lmaU1hbmFnZXIoKSB7CisgICAgICAgIGFzc2VydE51bGwoSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0VGFyZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoCisgICAgICAgICAgICAgICAgV0lGSV9TRVJWSUNFKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBjYW5ub3RHZXRXaWZpQXdhcmVNYW5hZ2VyKCkgeworICAgICAgICBhc3NlcnROdWxsKEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldFRhcmdldENvbnRleHQoKS5nZXRTeXN0ZW1TZXJ2aWNlKAorICAgICAgICAgICAgICAgIFdJRklfQVdBUkVfU0VSVklDRSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3Blcm1pc3Npb24vc3JjL2FuZHJvaWQvcGVybWlzc2lvbi9jdHMvU3VzcGVuZEFwcHNQZXJtaXNzaW9uVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvcGVybWlzc2lvbi9zcmMvYW5kcm9pZC9wZXJtaXNzaW9uL2N0cy9TdXNwZW5kQXBwc1Blcm1pc3Npb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgzYTRjYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3Blcm1pc3Npb24vc3JjL2FuZHJvaWQvcGVybWlzc2lvbi9jdHMvU3VzcGVuZEFwcHNQZXJtaXNzaW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLnBlcm1pc3Npb24uY3RzOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5TRU5EX1NIT1dfU1VTUEVOREVEX0FQUF9ERVRBSUxTOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uU1VTUEVORF9BUFBTOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50LkFDVElPTl9TSE9XX1NVU1BFTkRFRF9BUFBfREVUQUlMUzsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VJbmZvOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUmVzb2x2ZUluZm87CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK0BTbWFsbFRlc3QKK0BSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgU3VzcGVuZEFwcHNQZXJtaXNzaW9uVGVzdCB7CisKKyAgICBwcml2YXRlIFBhY2thZ2VNYW5hZ2VyIG1QYWNrYWdlTWFuYWdlcjsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgbVBhY2thZ2VNYW5hZ2VyID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0VGFyZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TnVtYmVyT2ZBcHBzV2l0aFBlcm1pc3Npb24oKSB7CisgICAgICAgIGZpbmFsIExpc3Q8UGFja2FnZUluZm8+IHBhY2thZ2VzV2l0aFBlcm0gPSBtUGFja2FnZU1hbmFnZXIuZ2V0UGFja2FnZXNIb2xkaW5nUGVybWlzc2lvbnMoCisgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tde1NVU1BFTkRfQVBQU30sIDApOworICAgICAgICBhc3NlcnRUcnVlKCJBdCBtb3N0IG9uZSBhcHAgY2FuIGhvbGQgdGhlIHBlcm1pc3Npb24gIiArIFNVU1BFTkRfQVBQUyArICIsIGJ1dCBmb3VuZCBtb3JlOiAiCisgICAgICAgICAgICAgICAgKyBwYWNrYWdlc1dpdGhQZXJtLCBwYWNrYWdlc1dpdGhQZXJtLnNpemUoKSA8PSAxKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaG93U3VzcGVuZGVkQXBwRGV0YWlsc0RlY2xhcmVkKCkgeworICAgICAgICBmaW5hbCBMaXN0PFBhY2thZ2VJbmZvPiBwYWNrYWdlc1dpdGhQZXJtID0gbVBhY2thZ2VNYW5hZ2VyLmdldFBhY2thZ2VzSG9sZGluZ1Blcm1pc3Npb25zKAorICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXXtTVVNQRU5EX0FQUFN9LCAwKTsKKyAgICAgICAgZmluYWwgSW50ZW50IHNob3dEZXRhaWxzSW50ZW50ID0gbmV3IEludGVudChBQ1RJT05fU0hPV19TVVNQRU5ERURfQVBQX0RFVEFJTFMpOworICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSB0cnVlOworICAgICAgICBTdHJpbmdCdWlsZGVyIGVycm9yU3RyaW5nID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgZm9yIChQYWNrYWdlSW5mbyBwYWNrYWdlSW5mbyA6IHBhY2thZ2VzV2l0aFBlcm0pIHsKKyAgICAgICAgICAgIHNob3dEZXRhaWxzSW50ZW50LnNldFBhY2thZ2UocGFja2FnZUluZm8ucGFja2FnZU5hbWUpOworICAgICAgICAgICAgZmluYWwgUmVzb2x2ZUluZm8gcmVzb2x2ZUluZm8gPSBtUGFja2FnZU1hbmFnZXIucmVzb2x2ZUFjdGl2aXR5KHNob3dEZXRhaWxzSW50ZW50LCAwKTsKKyAgICAgICAgICAgIGlmIChyZXNvbHZlSW5mbyA9PSBudWxsIHx8IHJlc29sdmVJbmZvLmFjdGl2aXR5SW5mbyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZXJyb3JTdHJpbmcuYXBwZW5kKCJObyBhY3Rpdml0eSBmb3VuZCBmb3IgIiArIEFDVElPTl9TSE9XX1NVU1BFTkRFRF9BUFBfREVUQUlMUworICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGluc2lkZSBwYWNrYWdlICIgKyBwYWNrYWdlSW5mby5wYWNrYWdlTmFtZSk7CisgICAgICAgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIVNFTkRfU0hPV19TVVNQRU5ERURfQVBQX0RFVEFJTFMuZXF1YWxzKHJlc29sdmVJbmZvLmFjdGl2aXR5SW5mby5wZXJtaXNzaW9uKSkgeworICAgICAgICAgICAgICAgIGVycm9yU3RyaW5nLmFwcGVuZCgiQWN0aXZpdHkgaGFuZGxpbmcgIiArIEFDVElPTl9TSE9XX1NVU1BFTkRFRF9BUFBfREVUQUlMUworICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG5vdCBwcm90ZWN0ZWQgd2l0aCBwZXJtaXNzaW9uICIgKyBTRU5EX1NIT1dfU1VTUEVOREVEX0FQUF9ERVRBSUxTKTsKKyAgICAgICAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzdWNjZXNzKSB7CisgICAgICAgICAgICBmYWlsKGVycm9yU3RyaW5nLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcGVybWlzc2lvbi9zcmMvYW5kcm9pZC9wZXJtaXNzaW9uL2N0cy9UZWxlcGhvbnlNYW5hZ2VyUGVybWlzc2lvblRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3Blcm1pc3Npb24vc3JjL2FuZHJvaWQvcGVybWlzc2lvbi9jdHMvVGVsZXBob255TWFuYWdlclBlcm1pc3Npb25UZXN0LmphdmEKaW5kZXggZDExN2UxOS4uNGQ0NGY1NSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvcGVybWlzc2lvbi9zcmMvYW5kcm9pZC9wZXJtaXNzaW9uL2N0cy9UZWxlcGhvbnlNYW5hZ2VyUGVybWlzc2lvblRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uL3NyYy9hbmRyb2lkL3Blcm1pc3Npb24vY3RzL1RlbGVwaG9ueU1hbmFnZXJQZXJtaXNzaW9uVGVzdC5qYXZhCkBAIC0yNCwxMyArMjQsMTUgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5UZWxlcGhvbnlNYW5hZ2VyOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcGVybWlzc2lvbi9zcmMvYW5kcm9pZC9wZXJtaXNzaW9uL2N0cy9UdlBlcm1pc3Npb25UZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uL3NyYy9hbmRyb2lkL3Blcm1pc3Npb24vY3RzL1R2UGVybWlzc2lvblRlc3QuamF2YQppbmRleCA0Y2QwMjU3Li40MTM5MDU5IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uL3NyYy9hbmRyb2lkL3Blcm1pc3Npb24vY3RzL1R2UGVybWlzc2lvblRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uL3NyYy9hbmRyb2lkL3Blcm1pc3Npb24vY3RzL1R2UGVybWlzc2lvblRlc3QuamF2YQpAQCAtMjIsMTIgKzIyLDkgQEAKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ2RkVGVzdDsKLQogLyoqCiAgKiBUZXN0cyBmb3IgVFYgQVBJIHJlbGF0ZWQgcGVybWlzc2lvbnMuCiAgKi8KLUBDZGRUZXN0KHJlcXVpcmVtZW50PSIzLjIvMS9DLTAtMSw5L0MtMC0xLDkuMS9DLTAtMSIpCiBwdWJsaWMgY2xhc3MgVHZQZXJtaXNzaW9uVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERVTU1ZX0lOUFVUX0lEID0gImR1bW15IjsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcGVybWlzc2lvbjIvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL3Blcm1pc3Npb24yL0FuZHJvaWQubWsKaW5kZXggMDYyYWViNy4uNDM2YmEyNyAxMDA3NTUKLS0tIGEvdGVzdHMvdGVzdHMvcGVybWlzc2lvbjIvQW5kcm9pZC5taworKysgYi90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uMi9BbmRyb2lkLm1rCkBAIC0yMiwxNCArMjIsMTQgQEAKIExPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCiAKICMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cyBjdHNfaW5zdGFudAogCi1MT0NBTF9KQVZBX0xJQlJBUklFUyA6PSB0ZWxlcGhvbnktY29tbW9uCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicwogCiBMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAotCWNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwgXAotCWN0c3Rlc3RydW5uZXIgXAotCWxlZ2FjeS1hbmRyb2lkLXRlc3QKKwljb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBcCisJY3RzdGVzdHJ1bm5lci1heHQgXAorCWd1YXZhCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcGVybWlzc2lvbjIvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL3Blcm1pc3Npb24yL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggNjQyOWRhYi4uMDY1YzBiNCAxMDA3NTUKLS0tIGEvdGVzdHMvdGVzdHMvcGVybWlzc2lvbjIvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uMi9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0xNiw3ICsxNiw3IEBACiAgLS0+CiAKIDxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgcGFja2FnZT0iYW5kcm9pZC5wZXJtaXNzaW9uMi5jdHMiPgorICAgIHBhY2thZ2U9ImFuZHJvaWQucGVybWlzc2lvbjIuY3RzIiBhbmRyb2lkOnRhcmdldFNhbmRib3hWZXJzaW9uPSIyIj4KIAogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uRElTQUJMRV9LRVlHVUFSRCIgLz4KICAgICA8YXBwbGljYXRpb24+CkBAIC00MCw2ICs0MCw3IEBACiAgICAgPCEtLSAgbmVlZCBhcHAgdGhhdCBoYXMgQ0FMTF9QSE9ORSBidXQgbm90IFBST0NFU1NfT1VUR09JTkdfQ0FMTCAtLT4KICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkNBTExfUEhPTkUiLz4KIAorCiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9DT05UQUNUUyIvPgogCiAgICAgPCEtLSBuZWVkIGFwcCB0aGF0IGhhcyBSRUNPUkRfQVVESU8gYnV0IG5vdCBDQVBUVVJFX0FVRElPX09VVFBVVCAtLT4KQEAgLTU0LDE1ICs1NSwxNiBAQAogICAgIDwhLS0gbmVlZCBhIHBlcm1pc3Npb24gdGhhdCB3b3VsZCBvcmRpbmFyaWx5IGJlIGdyYW50ZWQsIGJ1dCBoYXMgYSBtYXhTZGtWZXJzaW9uIHRoYXQKICAgICAgICAgIGNhdXNlcyBpdCB0byBiZSB3aXRoaGVsZCB1bmRlciB0aGUgY3VycmVudCBBUEkgbGV2ZWwgLS0+CiAgICAgPHVzZXMtcGVybWlzc2lvbgotICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uVklCUkFURSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bWF4U2RrVmVyc2lvbj0iMTgiIC8+CisgICAgICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5JTlRFUk5FVCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bWF4U2RrVmVyc2lvbj0iMTgiLz4KKwogCiAgICAgPCEtLSBuZWVkIGEgcGVybWlzc2lvbiB0aGF0IHdpbGwgYmUgZ3JhbnRlZCAtLT4KICAgICA8dXNlcy1wZXJtaXNzaW9uCi0gICAgICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5GTEFTSExJR0hUIgotICAgICAgICAgICAgYW5kcm9pZDptYXhTZGtWZXJzaW9uPSI5MDAwIiAvPgorICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX05FVFdPUktfU1RBVEUiCisgICAgICAgICAgICBhbmRyb2lkOm1heFNka1ZlcnNpb249IjkwMDAiLz4KIAotICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQucGVybWlzc2lvbjIuY3RzIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iTW9yZSBDVFMgdGVzdHMgZm9yIHBlcm1pc3Npb25zIj4KICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9Imxpc3RlbmVyIgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcGVybWlzc2lvbjIvQW5kcm9pZFRlc3QueG1sIGIvdGVzdHMvdGVzdHMvcGVybWlzc2lvbjIvQW5kcm9pZFRlc3QueG1sCmluZGV4IDIwMjFiODguLmQ0ZmI4NWYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3Blcm1pc3Npb24yL0FuZHJvaWRUZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uMi9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBQZXJtaXNzaW9uIHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJmcmFtZXdvcmsiIC8+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CiAgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3Blcm1pc3Npb24yL3Jlcy9yYXcvYW5kcm9pZF9tYW5pZmVzdC54bWwgYi90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uMi9yZXMvcmF3L2FuZHJvaWRfbWFuaWZlc3QueG1sCmluZGV4IGIyM2M2YWIuLmIyMGJkNjcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3Blcm1pc3Npb24yL3Jlcy9yYXcvYW5kcm9pZF9tYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvcGVybWlzc2lvbjIvcmVzL3Jhdy9hbmRyb2lkX21hbmlmZXN0LnhtbApAQCAtNTMsOCArNTMsMTAgQEAKICAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdCBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5VSURfUkVNT1ZFRCIgLz4KICAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdCBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5RVUVSWV9QQUNLQUdFX1JFU1RBUlQiIC8+CiAgICAgPHByb3RlY3RlZC1icm9hZGNhc3QgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uQ09ORklHVVJBVElPTl9DSEFOR0VEIiAvPgorICAgIDxwcm90ZWN0ZWQtYnJvYWRjYXN0IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlNQTElUX0NPTkZJR1VSQVRJT05fQ0hBTkdFRCIgLz4KICAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdCBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5MT0NBTEVfQ0hBTkdFRCIgLz4KICAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdCBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5CQVRURVJZX0NIQU5HRUQiIC8+CisgICAgPHByb3RlY3RlZC1icm9hZGNhc3QgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uQkFUVEVSWV9MRVZFTF9DSEFOR0VEIiAvPgogICAgIDxwcm90ZWN0ZWQtYnJvYWRjYXN0IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLkJBVFRFUllfTE9XIiAvPgogICAgIDxwcm90ZWN0ZWQtYnJvYWRjYXN0IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLkJBVFRFUllfT0tBWSIgLz4KICAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdCBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5BQ1RJT05fUE9XRVJfQ09OTkVDVEVEIiAvPgpAQCAtODYsNiArODgsOSBAQAogICAgIDxwcm90ZWN0ZWQtYnJvYWRjYXN0IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk9WRVJMQVlfQ0hBTkdFRCIgLz4KICAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdCBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5PVkVSTEFZX1JFTU9WRUQiIC8+CiAgICAgPHByb3RlY3RlZC1icm9hZGNhc3QgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uT1ZFUkxBWV9QUklPUklUWV9DSEFOR0VEIiAvPgorICAgIDxwcm90ZWN0ZWQtYnJvYWRjYXN0IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlVTRVJfQUNUSVZJVFlfTk9USUZJQ0FUSU9OIiAvPgorICAgIDxwcm90ZWN0ZWQtYnJvYWRjYXN0IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1ZX1BBQ0tBR0VfU1VTUEVOREVEIiAvPgorICAgIDxwcm90ZWN0ZWQtYnJvYWRjYXN0IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1ZX1BBQ0tBR0VfVU5TVVNQRU5ERUQiIC8+CiAKICAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdCBhbmRyb2lkOm5hbWU9ImFuZHJvaWQub3MuYWN0aW9uLlBPV0VSX1NBVkVfTU9ERV9DSEFOR0VEIiAvPgogICAgIDxwcm90ZWN0ZWQtYnJvYWRjYXN0IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5vcy5hY3Rpb24uUE9XRVJfU0FWRV9NT0RFX0NIQU5HSU5HIiAvPgpAQCAtMTU5LDYgKzE2NCw4IEBACiAgICAgPHByb3RlY3RlZC1icm9hZGNhc3QKICAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmJsdWV0b290aC5oZWFkc2V0LmFjdGlvbi5IRl9JTkRJQ0FUT1JTX1ZBTFVFX0NIQU5HRUQiIC8+CiAgICAgPHByb3RlY3RlZC1icm9hZGNhc3QKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmJsdWV0b290aC5oZWFkc2V0LnByb2ZpbGUuYWN0aW9uLkFDVElWRV9ERVZJQ0VfQ0hBTkdFRCIgLz4KKyAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdAogICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYmx1ZXRvb3RoLmhlYWRzZXRjbGllbnQucHJvZmlsZS5hY3Rpb24uQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEIiAvPgogICAgIDxwcm90ZWN0ZWQtYnJvYWRjYXN0CiAgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5ibHVldG9vdGguaGVhZHNldGNsaWVudC5wcm9maWxlLmFjdGlvbi5BVURJT19TVEFURV9DSEFOR0VEIiAvPgpAQCAtMTcxLDggKzE3OCwxNiBAQAogICAgIDxwcm90ZWN0ZWQtYnJvYWRjYXN0CiAgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5ibHVldG9vdGguaGVhZHNldGNsaWVudC5wcm9maWxlLmFjdGlvbi5MQVNUX1ZUQUciIC8+CiAgICAgPHByb3RlY3RlZC1icm9hZGNhc3QKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmJsdWV0b290aC5oZWFyaW5nYWlkLnByb2ZpbGUuYWN0aW9uLkNPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCIgLz4KKyAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdAorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYmx1ZXRvb3RoLmhlYXJpbmdhaWQucHJvZmlsZS5hY3Rpb24uUExBWUlOR19TVEFURV9DSEFOR0VEIiAvPgorICAgIDxwcm90ZWN0ZWQtYnJvYWRjYXN0CisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5ibHVldG9vdGguaGVhcmluZ2FpZC5wcm9maWxlLmFjdGlvbi5BQ1RJVkVfREVWSUNFX0NIQU5HRUQiIC8+CisgICAgPHByb3RlY3RlZC1icm9hZGNhc3QKICAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmJsdWV0b290aC5hMmRwLnByb2ZpbGUuYWN0aW9uLkNPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCIgLz4KICAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdAorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYmx1ZXRvb3RoLmEyZHAucHJvZmlsZS5hY3Rpb24uQUNUSVZFX0RFVklDRV9DSEFOR0VEIiAvPgorICAgIDxwcm90ZWN0ZWQtYnJvYWRjYXN0CiAgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5ibHVldG9vdGguYTJkcC5wcm9maWxlLmFjdGlvbi5QTEFZSU5HX1NUQVRFX0NIQU5HRUQiIC8+CiAgICAgPHByb3RlY3RlZC1icm9hZGNhc3QKICAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmJsdWV0b290aC5hMmRwLnByb2ZpbGUuYWN0aW9uLkNPREVDX0NPTkZJR19DSEFOR0VEIiAvPgpAQCAtMTgzLDE1ICsxOTgsMjMgQEAKICAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdAogICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYmx1ZXRvb3RoLmEyZHAtc2luay5wcm9maWxlLmFjdGlvbi5BVURJT19DT05GSUdfQ0hBTkdFRCIgLz4KICAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdAorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYmx1ZXRvb3RoLmF2cmNwLWNvbnRyb2xsZXIucHJvZmlsZS5hY3Rpb24uQlJPV1NFX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCIgLz4KKyAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdAogICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYmx1ZXRvb3RoLmF2cmNwLWNvbnRyb2xsZXIucHJvZmlsZS5hY3Rpb24uQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEIiAvPgogICAgIDxwcm90ZWN0ZWQtYnJvYWRjYXN0CisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5ibHVldG9vdGguYXZyY3AtY29udHJvbGxlci5wcm9maWxlLmFjdGlvbi5GT0xERVJfTElTVCIgLz4KKyAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdAorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYmx1ZXRvb3RoLmF2cmNwLWNvbnRyb2xsZXIucHJvZmlsZS5hY3Rpb24uVFJBQ0tfRVZFTlQiIC8+CisgICAgPHByb3RlY3RlZC1icm9hZGNhc3QKICAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmJsdWV0b290aC5pbnB1dC5wcm9maWxlLmFjdGlvbi5DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQiIC8+CiAgICAgPHByb3RlY3RlZC1icm9hZGNhc3QKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmJsdWV0b290aC5pbnB1dC5wcm9maWxlLmFjdGlvbi5JRExFX1RJTUVfQ0hBTkdFRCIgLz4KKyAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdAogICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYmx1ZXRvb3RoLmlucHV0LnByb2ZpbGUuYWN0aW9uLlBST1RPQ09MX01PREVfQ0hBTkdFRCIgLz4KICAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdAogICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYmx1ZXRvb3RoLmlucHV0LnByb2ZpbGUuYWN0aW9uLlZJUlRVQUxfVU5QTFVHX1NUQVRVUyIgLz4KICAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdAotICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYmx1ZXRvb3RoLmlucHV0aG9zdC5wcm9maWxlLmFjdGlvbi5DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQiIC8+CisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5ibHVldG9vdGguaGlkZGV2aWNlLnByb2ZpbGUuYWN0aW9uLkNPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCIgLz4KICAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdAogICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYmx1ZXRvb3RoLm1hcC5wcm9maWxlLmFjdGlvbi5DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQiIC8+CiAgICAgPHByb3RlY3RlZC1icm9hZGNhc3QgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmJsdWV0b290aC5tYXBtY2UucHJvZmlsZS5hY3Rpb24uQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEIiAvPgpAQCAtMjA0LDggKzIyNyw4IEBACiAgICAgICAgIGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aE1hcENvbnRlbnRPYnNlcnZlci5hY3Rpb24uTUVTU0FHRV9ERUxJVkVSWSIgLz4KICAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdAogICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYmx1ZXRvb3RoLnBhbi5wcm9maWxlLmFjdGlvbi5DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQiIC8+Ci0gICAgPHByb3RlY3RlZC1icm9hZGNhc3QgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmJsdWV0b290aC5wYmFwLmludGVudC5hY3Rpb24uUEJBUF9TVEFURV9DSEFOR0VEIiAvPgogICAgIDxwcm90ZWN0ZWQtYnJvYWRjYXN0IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5ibHVldG9vdGgucGJhcC5wcm9maWxlLmFjdGlvbi5DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQiIC8+CisgICAgPHByb3RlY3RlZC1icm9hZGNhc3QgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmJsdWV0b290aC5wYmFwY2xpZW50LnByb2ZpbGUuYWN0aW9uLkNPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCIgLz4KICAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdCBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYmx1ZXRvb3RoLnNhcC5wcm9maWxlLmFjdGlvbi5DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQiIC8+CiAgICAgPHByb3RlY3RlZC1icm9hZGNhc3QgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmJ0b3BwLmludGVudC5hY3Rpb24uSU5DT01JTkdfRklMRV9OT1RJRklDQVRJT04iIC8+CiAgICAgPHByb3RlY3RlZC1icm9hZGNhc3QgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmJ0b3BwLmludGVudC5hY3Rpb24uVVNFUl9DT05GSVJNQVRJT05fVElNRU9VVCIgLz4KQEAgLTI5OSw2ICszMjIsOCBAQAogICAgIDxwcm90ZWN0ZWQtYnJvYWRjYXN0IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLkRSRUFNSU5HX1NUT1BQRUQiIC8+CiAgICAgPHByb3RlY3RlZC1icm9hZGNhc3QgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uQU5ZX0RBVEFfU1RBVEUiIC8+CiAKKyAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdCBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLnNlcnZlci5zdGF0cy5hY3Rpb24uVFJJR0dFUl9DT0xMRUNUSU9OIiAvPgorCiAgICAgPHByb3RlY3RlZC1icm9hZGNhc3QgYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5zZXJ2ZXIuV2lmaU1hbmFnZXIuYWN0aW9uLlNUQVJUX1NDQU4iIC8+CiAgICAgPHByb3RlY3RlZC1icm9hZGNhc3QgYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5zZXJ2ZXIuV2lmaU1hbmFnZXIuYWN0aW9uLlNUQVJUX1BOTyIgLz4KICAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdCBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLnNlcnZlci5XaWZpTWFuYWdlci5hY3Rpb24uREVMQVlFRF9EUklWRVJfU1RPUCIgLz4KQEAgLTMwOSwxMSArMzM0LDIxIEBACiAgICAgPHByb3RlY3RlZC1icm9hZGNhc3QgYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5zZXJ2ZXIudXNiLkFDVElPTl9PUEVOX0lOX0FQUFMiIC8+CiAgICAgPHByb3RlY3RlZC1icm9hZGNhc3QgYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5zZXJ2ZXIuYW0uREVMRVRFX0RVTVBIRUFQIiAvPgogICAgIDxwcm90ZWN0ZWQtYnJvYWRjYXN0IGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuc2VydmVyLm5ldC5hY3Rpb24uU05PT1pFX1dBUk5JTkciIC8+CisgICAgPHByb3RlY3RlZC1icm9hZGNhc3QgYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5zZXJ2ZXIubmV0LmFjdGlvbi5TTk9PWkVfUkFQSUQiIC8+CisgICAgPHByb3RlY3RlZC1icm9hZGNhc3QgYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5zZXJ2ZXIud2lmaS5Db25uZWN0VG9OZXR3b3JrTm90aWZpY2F0aW9uLlVTRVJfRElTTUlTU0VEX05PVElGSUNBVElPTiIgLz4KKyAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdCBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLnNlcnZlci53aWZpLkNvbm5lY3RUb05ldHdvcmtOb3RpZmljYXRpb24uQ09OTkVDVF9UT19ORVRXT1JLIiAvPgorICAgIDxwcm90ZWN0ZWQtYnJvYWRjYXN0IGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuc2VydmVyLndpZmkuQ29ubmVjdFRvTmV0d29ya05vdGlmaWNhdGlvbi5QSUNLX1dJRklfTkVUV09SSyIgLz4KKyAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdCBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLnNlcnZlci53aWZpLkNvbm5lY3RUb05ldHdvcmtOb3RpZmljYXRpb24uUElDS19ORVRXT1JLX0FGVEVSX0ZBSUxVUkUiIC8+CisgICAgPHByb3RlY3RlZC1icm9hZGNhc3QgYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5zZXJ2ZXIud2lmaS53YWtldXAuRElTTUlTU19OT1RJRklDQVRJT04iIC8+CisgICAgPHByb3RlY3RlZC1icm9hZGNhc3QgYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5zZXJ2ZXIud2lmaS53YWtldXAuT1BFTl9XSUZJX1BSRUZFUkVOQ0VTIiAvPgorICAgIDxwcm90ZWN0ZWQtYnJvYWRjYXN0IGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuc2VydmVyLndpZmkud2FrZXVwLk9QRU5fV0lGSV9TRVRUSU5HUyIgLz4KKyAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdCBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLnNlcnZlci53aWZpLndha2V1cC5UVVJOX09GRl9XSUZJX1dBS0UiIC8+CiAgICAgPHByb3RlY3RlZC1icm9hZGNhc3QgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLm5ldC53aWZpLldJRklfU1RBVEVfQ0hBTkdFRCIgLz4KICAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdCBhbmRyb2lkOm5hbWU9ImFuZHJvaWQubmV0LndpZmkuV0lGSV9BUF9TVEFURV9DSEFOR0VEIiAvPgogICAgIDxwcm90ZWN0ZWQtYnJvYWRjYXN0IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5uZXQud2lmaS5XSUZJX0NSRURFTlRJQUxfQ0hBTkdFRCIgLz4KICAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdCBhbmRyb2lkOm5hbWU9ImFuZHJvaWQubmV0LndpZmkuV0lGSV9TQ0FOX0FWQUlMQUJMRSIgLz4KICAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdCBhbmRyb2lkOm5hbWU9ImFuZHJvaWQubmV0LndpZmkuYXdhcmUuYWN0aW9uLldJRklfQVdBUkVfU1RBVEVfQ0hBTkdFRCIgLz4KKyAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdCBhbmRyb2lkOm5hbWU9ImFuZHJvaWQubmV0LndpZmkucnR0LmFjdGlvbi5XSUZJX1JUVF9TVEFURV9DSEFOR0VEIiAvPgogICAgIDxwcm90ZWN0ZWQtYnJvYWRjYXN0IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5uZXQud2lmaS5TQ0FOX1JFU1VMVFMiIC8+CiAgICAgPHByb3RlY3RlZC1icm9hZGNhc3QgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLm5ldC53aWZpLlJTU0lfQ0hBTkdFRCIgLz4KICAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdCBhbmRyb2lkOm5hbWU9ImFuZHJvaWQubmV0LndpZmkuU1RBVEVfQ0hBTkdFIiAvPgpAQCAtMzkyLDYgKzQyNyw3IEBACiAgICAgPHByb3RlY3RlZC1icm9hZGNhc3QgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVybmFsLnBvbGljeS5hY3Rpb24uQlVSTl9JTl9QUk9URUNUSU9OIiAvPgogICAgIDxwcm90ZWN0ZWQtYnJvYWRjYXN0IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hcHAuYWN0aW9uLlNZU1RFTV9VUERBVEVfUE9MSUNZX0NIQU5HRUQiIC8+CiAgICAgPHByb3RlY3RlZC1icm9hZGNhc3QgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFwcC5hY3Rpb24uREVWSUNFX09XTkVSX0NIQU5HRUQiIC8+CisgICAgPHByb3RlY3RlZC1icm9hZGNhc3QgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFwcC5hY3Rpb24uTUFOQUdFRF9VU0VSX0NSRUFURUQiIC8+CiAKICAgICA8IS0tIEFkZGVkIGluIE4gLS0+CiAgICAgPHByb3RlY3RlZC1icm9hZGNhc3QgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uQU5SIiAvPgpAQCAtNDcwLDcgKzUwNiw2IEBACiAgICAgPHByb3RlY3RlZC1icm9hZGNhc3QgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmNvbnRlbnQuam9ic2NoZWR1bGVyLkpPQl9ERUFETElORV9FWFBJUkVEIiAvPgogICAgIDxwcm90ZWN0ZWQtYnJvYWRjYXN0IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLkFDVElPTl9VTlNPTF9SRVNQT05TRV9PRU1fSE9PS19SQVciIC8+CiAgICAgPHByb3RlY3RlZC1icm9hZGNhc3QgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLm5ldC5jb25uLkNPTk5FQ1RJVklUWV9DSEFOR0VfU1VQTCIgLz4KLSAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdCBhbmRyb2lkOm5hbWU9ImFuZHJvaWQub3MuYWN0aW9uLkFDVElPTl9FRkZFQ1RTX1NVUFBSRVNTT1JfQ0hBTkdFRCIgLz4KICAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdCBhbmRyb2lkOm5hbWU9ImFuZHJvaWQub3MuYWN0aW9uLkxJR0hUX0RFVklDRV9JRExFX01PREVfQ0hBTkdFRCIgLz4KICAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdCBhbmRyb2lkOm5hbWU9ImFuZHJvaWQub3Muc3RvcmFnZS5hY3Rpb24uVk9MVU1FX1NUQVRFX0NIQU5HRUQiIC8+CiAgICAgPHByb3RlY3RlZC1icm9hZGNhc3QgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLm9zLnN0b3JhZ2UuYWN0aW9uLkRJU0tfU0NBTk5FRCIgLz4KQEAgLTQ4OSw2ICs1MjQsOSBAQAogICAgIDxwcm90ZWN0ZWQtYnJvYWRjYXN0IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hcHAuYWN0aW9uLk5PVElGSUNBVElPTl9QT0xJQ1lfQ0hBTkdFRCIgLz4KICAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdCBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYXBwLmFjdGlvbi5OT1RJRklDQVRJT05fUE9MSUNZX0FDQ0VTU19HUkFOVEVEX0NIQU5HRUQiIC8+CiAgICAgPHByb3RlY3RlZC1icm9hZGNhc3QgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLm9zLmFjdGlvbi5BQ1RJT05fRUZGRUNUU19TVVBQUkVTU09SX0NIQU5HRUQiIC8+CisgICAgPHByb3RlY3RlZC1icm9hZGNhc3QgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFwcC5hY3Rpb24uTk9USUZJQ0FUSU9OX0NIQU5ORUxfQkxPQ0tfU1RBVEVfQ0hBTkdFRCIgLz4KKyAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdCBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYXBwLmFjdGlvbi5OT1RJRklDQVRJT05fQ0hBTk5FTF9HUk9VUF9CTE9DS19TVEFURV9DSEFOR0VEIiAvPgorICAgIDxwcm90ZWN0ZWQtYnJvYWRjYXN0IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hcHAuYWN0aW9uLkFQUF9CTE9DS19TVEFURV9DSEFOR0VEIiAvPgogCiAgICAgPHByb3RlY3RlZC1icm9hZGNhc3QgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uR0VUX0FQUF9HUkFOVEVEX1VSSV9QRVJNSVNTSU9OUyIgLz4KICAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdCBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5DTEVBUl9BUFBfR1JBTlRFRF9VUklfUEVSTUlTU0lPTlMiIC8+CkBAIC01MzMsOCArNTcxLDYgQEAKICAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdCBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5ERVZJQ0VfTE9DS0VEX0NIQU5HRUQiIC8+CiAKICAgICA8IS0tIEFkZGVkIGluIE8gLS0+Ci0gICAgPCEtLSBUT0RPOiB0ZW1wb3JhcnkgYnJvYWRjYXN0IHVzZWQgYnkgQXV0b0ZpbGxNYW5hZ2VyU2VydmljZUltcGw7IHdpbGwgYmUgcmVtb3ZlZCAtLT4KLSAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdCBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLmludGVybmFsLmF1dG9maWxsLmFjdGlvbi5SRVFVRVNUX0FVVE9GSUxMIiAvPgogICAgIDxwcm90ZWN0ZWQtYnJvYWRjYXN0IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hcHAuYWN0aW9uLkFQUExJQ0FUSU9OX0RFTEVHQVRJT05fU0NPUEVTX0NIQU5HRUQiIC8+CiAgICAgPHByb3RlY3RlZC1icm9hZGNhc3QgYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5zZXJ2ZXIud20uQUNUSU9OX1JFVk9LRV9TWVNURU1fQUxFUlRfV0lORE9XX1BFUk1JU1NJT04iIC8+CiAgICAgPHByb3RlY3RlZC1icm9hZGNhc3QgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLm1lZGlhLnR2LmFjdGlvbi5QQVJFTlRBTF9DT05UUk9MU19FTkFCTEVEX0NIQU5HRUQiIC8+CkBAIC01NDcsNiArNTgzLDIxIEBACiAgICAgPHByb3RlY3RlZC1icm9hZGNhc3QgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLm1lZGlhLnR2LmFjdGlvbi5DSEFOTkVMX0JST1dTQUJMRV9SRVFVRVNURUQiIC8+CiAgICAgPHByb3RlY3RlZC1icm9hZGNhc3QgYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5zZXJ2ZXIuSW5wdXRNZXRob2RNYW5hZ2VyU2VydmljZS5TSE9XX0lOUFVUX01FVEhPRF9QSUNLRVIiIC8+CiAKKyAgICA8IS0tIFRpbWUgem9uZSBydWxlcyB1cGRhdGUgaW50ZW50cyBmaXJlZCBieSB0aGUgc3lzdGVtIHNlcnZlciAtLT4KKyAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdCBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLmludGVudC5hY3Rpb24udGltZXpvbmUuUlVMRVNfVVBEQVRFX09QRVJBVElPTiIgLz4KKyAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdCBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLmludGVudC5hY3Rpb24udGltZXpvbmUuVFJJR0dFUl9SVUxFU19VUERBVEVfQ0hFQ0siIC8+CisKKyAgICA8IS0tIE1hZGUgcHJvdGVjdGVkIGluIFAgKHdhcyBpbnRyb2R1Y2VkIGluIEpCLU1SMikgLS0+CisgICAgPHByb3RlY3RlZC1icm9hZGNhc3QgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uR0VUX1JFU1RSSUNUSU9OX0VOVFJJRVMiIC8+CisgICAgPHByb3RlY3RlZC1icm9hZGNhc3QgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlbGVwaG9ueS5ldWljYy5hY3Rpb24uT1RBX1NUQVRVU19DSEFOR0VEIiAvPgorCisgICAgPCEtLSBBZGRlZCBpbiBQIC0tPgorICAgIDxwcm90ZWN0ZWQtYnJvYWRjYXN0IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hcHAuYWN0aW9uLlBST0ZJTEVfT1dORVJfQ0hBTkdFRCIgLz4KKyAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdCBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYXBwLmFjdGlvbi5UUkFOU0ZFUl9PV05FUlNISVBfQ09NUExFVEUiIC8+CisgICAgPHByb3RlY3RlZC1icm9hZGNhc3QgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFwcC5hY3Rpb24uQUZGSUxJQVRFRF9QUk9GSUxFX1RSQU5TRkVSX09XTkVSU0hJUF9DT01QTEVURSIgLz4KKyAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdCBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYXBwLmFjdGlvbi5EQVRBX1NIQVJJTkdfUkVTVFJJQ1RJT05fQ0hBTkdFRCIgLz4KKyAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdCBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYXBwLmFjdGlvbi5TVEFUU0RfU1RBUlRFRCIgLz4KKwogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICBSVU5USU1FIFBFUk1JU1NJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CiAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgpAQCAtNTYzLDYgKzYxNCw3IEBACiAgICAgICAgIGFuZHJvaWQ6aWNvbj0iQGRyYXdhYmxlL3Blcm1fZ3JvdXBfY29udGFjdHMiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvcGVybWdyb3VwbGFiX2NvbnRhY3RzIgogICAgICAgICBhbmRyb2lkOmRlc2NyaXB0aW9uPSJAc3RyaW5nL3Blcm1ncm91cGRlc2NfY29udGFjdHMiCisgICAgICAgIGFuZHJvaWQ6cmVxdWVzdD0iQHN0cmluZy9wZXJtZ3JvdXByZXF1ZXN0X2NvbnRhY3RzIgogICAgICAgICBhbmRyb2lkOnByaW9yaXR5PSIxMDAiIC8+CiAKICAgICA8IS0tIEFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byByZWFkIHRoZSB1c2VyJ3MgY29udGFjdHMgZGF0YS4KQEAgLTU5Myw2ICs2NDUsNyBAQAogICAgICAgICBhbmRyb2lkOmljb249IkBkcmF3YWJsZS9wZXJtX2dyb3VwX2NhbGVuZGFyIgogICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3Blcm1ncm91cGxhYl9jYWxlbmRhciIKICAgICAgICAgYW5kcm9pZDpkZXNjcmlwdGlvbj0iQHN0cmluZy9wZXJtZ3JvdXBkZXNjX2NhbGVuZGFyIgorICAgICAgICBhbmRyb2lkOnJlcXVlc3Q9IkBzdHJpbmcvcGVybWdyb3VwcmVxdWVzdF9jYWxlbmRhciIKICAgICAgICAgYW5kcm9pZDpwcmlvcml0eT0iMjAwIiAvPgogCiAgICAgPCEtLSBBbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gcmVhZCB0aGUgdXNlcidzIGNhbGVuZGFyIGRhdGEuCkBAIC02MjMsNiArNjc2LDcgQEAKICAgICAgICAgYW5kcm9pZDppY29uPSJAZHJhd2FibGUvcGVybV9ncm91cF9zbXMiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvcGVybWdyb3VwbGFiX3NtcyIKICAgICAgICAgYW5kcm9pZDpkZXNjcmlwdGlvbj0iQHN0cmluZy9wZXJtZ3JvdXBkZXNjX3NtcyIKKyAgICAgICAgYW5kcm9pZDpyZXF1ZXN0PSJAc3RyaW5nL3Blcm1ncm91cHJlcXVlc3Rfc21zIgogICAgICAgICBhbmRyb2lkOnByaW9yaXR5PSIzMDAiIC8+CiAKICAgICA8IS0tIEFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byBzZW5kIFNNUyBtZXNzYWdlcy4KQEAgLTY5OSw2ICs3NTMsNyBAQAogICAgICAgICBhbmRyb2lkOmljb249IkBkcmF3YWJsZS9wZXJtX2dyb3VwX3N0b3JhZ2UiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvcGVybWdyb3VwbGFiX3N0b3JhZ2UiCiAgICAgICAgIGFuZHJvaWQ6ZGVzY3JpcHRpb249IkBzdHJpbmcvcGVybWdyb3VwZGVzY19zdG9yYWdlIgorICAgICAgICBhbmRyb2lkOnJlcXVlc3Q9IkBzdHJpbmcvcGVybWdyb3VwcmVxdWVzdF9zdG9yYWdlIgogICAgICAgICBhbmRyb2lkOnByaW9yaXR5PSI5MDAiIC8+CiAKICAgICA8IS0tIEFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byByZWFkIGZyb20gZXh0ZXJuYWwgc3RvcmFnZS4KQEAgLTc2MCw2ICs4MTUsNyBAQAogICAgICAgICBhbmRyb2lkOmljb249IkBkcmF3YWJsZS9wZXJtX2dyb3VwX2xvY2F0aW9uIgogICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3Blcm1ncm91cGxhYl9sb2NhdGlvbiIKICAgICAgICAgYW5kcm9pZDpkZXNjcmlwdGlvbj0iQHN0cmluZy9wZXJtZ3JvdXBkZXNjX2xvY2F0aW9uIgorICAgICAgICBhbmRyb2lkOnJlcXVlc3Q9IkBzdHJpbmcvcGVybWdyb3VwcmVxdWVzdF9sb2NhdGlvbiIKICAgICAgICAgYW5kcm9pZDpwcmlvcml0eT0iNDAwIiAvPgogCiAgICAgPCEtLSBBbGxvd3MgYW4gYXBwIHRvIGFjY2VzcyBwcmVjaXNlIGxvY2F0aW9uLgpAQCAtNzgzLDYgKzgzOSw4NiBAQAogICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0iZGFuZ2Vyb3VzfGluc3RhbnQiIC8+CiAKICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgPCEtLSBQZXJtaXNzaW9ucyBmb3IgYWNjZXNzaW5nIHRoZSBjYWxsIGxvZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICA8ZWF0LWNvbW1lbnQgLz4KKworICAgIDwhLS0gVXNlZCBmb3IgcGVybWlzc2lvbnMgdGhhdCBhcmUgYXNzb2NpYXRlZCB0ZWxlcGhvbnkgZmVhdHVyZXMuIC0tPgorICAgIDxwZXJtaXNzaW9uLWdyb3VwIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLWdyb3VwLkNBTExfTE9HIgorICAgICAgICBhbmRyb2lkOmljb249IkBkcmF3YWJsZS9wZXJtX2dyb3VwX3Bob25lX2NhbGxzIgorICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3Blcm1ncm91cGxhYl9jYWxsbG9nIgorICAgICAgICBhbmRyb2lkOmRlc2NyaXB0aW9uPSJAc3RyaW5nL3Blcm1ncm91cGRlc2NfY2FsbGxvZyIKKyAgICAgICAgYW5kcm9pZDpyZXF1ZXN0PSJAc3RyaW5nL3Blcm1ncm91cHJlcXVlc3RfY2FsbGxvZyIKKyAgICAgICAgYW5kcm9pZDpwcmlvcml0eT0iNDUwIiAvPgorCisKKyAgICA8IS0tIFVzZWQgZm9yIHBlcm1pc3Npb25zIHRoYXQgYXJlIGFzc29jaWF0ZWQgdGVsZXBob255IGZlYXR1cmVzLiAtLT4KKyAgICA8cGVybWlzc2lvbi1ncm91cCBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi1ncm91cC5DQUxMX0xPRyIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmljb249IkBkcmF3YWJsZS9wZXJtX2dyb3VwX3Bob25lX2NhbGxzIgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvcGVybWdyb3VwbGFiX2NhbGxsb2ciCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpkZXNjcmlwdGlvbj0iQHN0cmluZy9wZXJtZ3JvdXBkZXNjX2NhbGxsb2ciCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpyZXF1ZXN0PSJAc3RyaW5nL3Blcm1ncm91cHJlcXVlc3RfY2FsbGxvZyIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnByaW9yaXR5PSI0NTAiIC8+CisKKyAgICA8IS0tIEFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byBhY2Nlc3MgdGhlIElNUyBjYWxsIHNlcnZpY2U6IG1ha2luZyBhbmQKKyAgICAgICAgIG1vZGlmeWluZyBhIGNhbGwKKyAgICAgICAgPHA+UHJvdGVjdGlvbiBsZXZlbDogc2lnbmF0dXJlfHByaXZpbGVnZWQKKyAgICAgICAgQGhpZGUKKyAgICAtLT4KKyAgICA8cGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5BQ0NFU1NfSU1TX0NBTExfU0VSVklDRSIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9wZXJtbGFiX2FjY2Vzc0ltc0NhbGxTZXJ2aWNlIgorICAgICAgICBhbmRyb2lkOmRlc2NyaXB0aW9uPSJAc3RyaW5nL3Blcm1kZXNjX2FjY2Vzc0ltc0NhbGxTZXJ2aWNlIgorICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic2lnbmF0dXJlfHByaXZpbGVnZWQiIC8+CisKKyAgICA8IS0tIEFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byByZWFkIHRoZSB1c2VyJ3MgY2FsbCBsb2cuCisgICAgICAgICA8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBJZiB5b3VyIGFwcCB1c2VzIHRoZQorICAgICAgICAge0BsaW5rICNSRUFEX0NPTlRBQ1RTfSBwZXJtaXNzaW9uIGFuZCA8ZW0+Ym90aDwvZW0+IHlvdXIgPGEKKyAgICAgICAgIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvdXNlcy1zZGstZWxlbWVudC5odG1sI21pbiI+e0Bjb2RlCisgICAgICAgICBtaW5TZGtWZXJzaW9ufTwvYT4gYW5kIDxhCisgICAgICAgICBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L3VzZXMtc2RrLWVsZW1lbnQuaHRtbCN0YXJnZXQiPntAY29kZQorICAgICAgICAgdGFyZ2V0U2RrVmVyc2lvbn08L2E+IHZhbHVlcyBhcmUgc2V0IHRvIDE1IG9yIGxvd2VyLCB0aGUgc3lzdGVtIGltcGxpY2l0bHkKKyAgICAgICAgIGdyYW50cyB5b3VyIGFwcCB0aGlzIHBlcm1pc3Npb24uIElmIHlvdSBkb24ndCBuZWVkIHRoaXMgcGVybWlzc2lvbiwgYmUgc3VyZSB5b3VyIDxhCisgICAgICAgICBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L3VzZXMtc2RrLWVsZW1lbnQuaHRtbCN0YXJnZXQiPntAY29kZQorICAgICAgICAgdGFyZ2V0U2RrVmVyc2lvbn08L2E+IGlzIDE2IG9yIGhpZ2hlci48L3A+CisgICAgICAgICA8cD5Qcm90ZWN0aW9uIGxldmVsOiBkYW5nZXJvdXMKKyAgICAtLT4KKyAgICA8cGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX0NBTExfTE9HIgorICAgICAgICBhbmRyb2lkOnBlcm1pc3Npb25Hcm91cD0iYW5kcm9pZC5wZXJtaXNzaW9uLWdyb3VwLkNBTExfTE9HIgorICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3Blcm1sYWJfcmVhZENhbGxMb2ciCisgICAgICAgIGFuZHJvaWQ6ZGVzY3JpcHRpb249IkBzdHJpbmcvcGVybWRlc2NfcmVhZENhbGxMb2ciCisgICAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJkYW5nZXJvdXMiIC8+CisKKyAgICA8IS0tIEFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byB3cml0ZSAoYnV0IG5vdCByZWFkKSB0aGUgdXNlcidzCisgICAgICAgICBjYWxsIGxvZyBkYXRhLgorICAgICAgICAgPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gSWYgeW91ciBhcHAgdXNlcyB0aGUKKyAgICAgICAgIHtAbGluayAjV1JJVEVfQ09OVEFDVFN9IHBlcm1pc3Npb24gYW5kIDxlbT5ib3RoPC9lbT4geW91ciA8YQorICAgICAgICAgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC91c2VzLXNkay1lbGVtZW50Lmh0bWwjbWluIj57QGNvZGUKKyAgICAgICAgIG1pblNka1ZlcnNpb259PC9hPiBhbmQgPGEKKyAgICAgICAgIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvdXNlcy1zZGstZWxlbWVudC5odG1sI3RhcmdldCI+e0Bjb2RlCisgICAgICAgICB0YXJnZXRTZGtWZXJzaW9ufTwvYT4gdmFsdWVzIGFyZSBzZXQgdG8gMTUgb3IgbG93ZXIsIHRoZSBzeXN0ZW0gaW1wbGljaXRseQorICAgICAgICAgZ3JhbnRzIHlvdXIgYXBwIHRoaXMgcGVybWlzc2lvbi4gSWYgeW91IGRvbid0IG5lZWQgdGhpcyBwZXJtaXNzaW9uLCBiZSBzdXJlIHlvdXIgPGEKKyAgICAgICAgIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvdXNlcy1zZGstZWxlbWVudC5odG1sI3RhcmdldCI+e0Bjb2RlCisgICAgICAgICB0YXJnZXRTZGtWZXJzaW9ufTwvYT4gaXMgMTYgb3IgaGlnaGVyLjwvcD4KKyAgICAgICAgIDxwPlByb3RlY3Rpb24gbGV2ZWw6IGRhbmdlcm91cworICAgIC0tPgorICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0NBTExfTE9HIgorICAgICAgICBhbmRyb2lkOnBlcm1pc3Npb25Hcm91cD0iYW5kcm9pZC5wZXJtaXNzaW9uLWdyb3VwLkNBTExfTE9HIgorICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3Blcm1sYWJfd3JpdGVDYWxsTG9nIgorICAgICAgICBhbmRyb2lkOmRlc2NyaXB0aW9uPSJAc3RyaW5nL3Blcm1kZXNjX3dyaXRlQ2FsbExvZyIKKyAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9ImRhbmdlcm91cyIgLz4KKworICAgIDwhLS0gQWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIHNlZSB0aGUgbnVtYmVyIGJlaW5nIGRpYWxlZCBkdXJpbmcgYW4gb3V0Z29pbmcKKyAgICAgICAgIGNhbGwgd2l0aCB0aGUgb3B0aW9uIHRvIHJlZGlyZWN0IHRoZSBjYWxsIHRvIGEgZGlmZmVyZW50IG51bWJlciBvcgorICAgICAgICAgYWJvcnQgdGhlIGNhbGwgYWx0b2dldGhlci4KKyAgICAgICAgIDxwPlByb3RlY3Rpb24gbGV2ZWw6IGRhbmdlcm91cworICAgIC0tPgorICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlBST0NFU1NfT1VUR09JTkdfQ0FMTFMiCisgICAgICAgIGFuZHJvaWQ6cGVybWlzc2lvbkdyb3VwPSJhbmRyb2lkLnBlcm1pc3Npb24tZ3JvdXAuQ0FMTF9MT0ciCisgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvcGVybWxhYl9wcm9jZXNzT3V0Z29pbmdDYWxscyIKKyAgICAgICAgYW5kcm9pZDpkZXNjcmlwdGlvbj0iQHN0cmluZy9wZXJtZGVzY19wcm9jZXNzT3V0Z29pbmdDYWxscyIKKyAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9ImRhbmdlcm91cyIgLz4KKworICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICAgICA8IS0tIFBlcm1pc3Npb25zIGZvciBhY2Nlc3NpbmcgdGhlIGRldmljZSB0ZWxlcGhvbnkgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CiAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgogICAgIDxlYXQtY29tbWVudCAvPgpAQCAtNzkyLDYgKzkyOCw3IEBACiAgICAgICAgIGFuZHJvaWQ6aWNvbj0iQGRyYXdhYmxlL3Blcm1fZ3JvdXBfcGhvbmVfY2FsbHMiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvcGVybWdyb3VwbGFiX3Bob25lIgogICAgICAgICBhbmRyb2lkOmRlc2NyaXB0aW9uPSJAc3RyaW5nL3Blcm1ncm91cGRlc2NfcGhvbmUiCisgICAgICAgIGFuZHJvaWQ6cmVxdWVzdD0iQHN0cmluZy9wZXJtZ3JvdXByZXF1ZXN0X3Bob25lIgogICAgICAgICBhbmRyb2lkOnByaW9yaXR5PSI1MDAiIC8+CiAKICAgICA8IS0tIEFsbG93cyByZWFkIG9ubHkgYWNjZXNzIHRvIHBob25lIHN0YXRlLCBpbmNsdWRpbmcgdGhlIHBob25lIG51bWJlciBvZiB0aGUgZGV2aWNlLApAQCAtODMzLDU0ICs5NzAsNiBAQAogICAgICAgICBhbmRyb2lkOmRlc2NyaXB0aW9uPSJAc3RyaW5nL3Blcm1kZXNjX2NhbGxQaG9uZSIKICAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9ImRhbmdlcm91cyIgLz4KIAotICAgIDwhLS0gQWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIGFjY2VzcyB0aGUgSU1TIGNhbGwgc2VydmljZTogbWFraW5nIGFuZAotICAgICAgICAgbW9kaWZ5aW5nIGEgY2FsbAotICAgICAgICA8cD5Qcm90ZWN0aW9uIGxldmVsOiBzaWduYXR1cmV8cHJpdmlsZWdlZAotICAgICAgICBAaGlkZQotICAgIC0tPgotICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkFDQ0VTU19JTVNfQ0FMTF9TRVJWSUNFIgotICAgICAgICBhbmRyb2lkOnBlcm1pc3Npb25Hcm91cD0iYW5kcm9pZC5wZXJtaXNzaW9uLWdyb3VwLlBIT05FIgotICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3Blcm1sYWJfYWNjZXNzSW1zQ2FsbFNlcnZpY2UiCi0gICAgICAgIGFuZHJvaWQ6ZGVzY3JpcHRpb249IkBzdHJpbmcvcGVybWRlc2NfYWNjZXNzSW1zQ2FsbFNlcnZpY2UiCi0gICAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJzaWduYXR1cmV8cHJpdmlsZWdlZCIgLz4KLQotICAgIDwhLS0gQWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIHJlYWQgdGhlIHVzZXIncyBjYWxsIGxvZy4KLSAgICAgICAgIDxwIGNsYXNzPSJub3RlIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IElmIHlvdXIgYXBwIHVzZXMgdGhlCi0gICAgICAgICB7QGxpbmsgI1JFQURfQ09OVEFDVFN9IHBlcm1pc3Npb24gYW5kIDxlbT5ib3RoPC9lbT4geW91ciA8YQotICAgICAgICAgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC91c2VzLXNkay1lbGVtZW50Lmh0bWwjbWluIj57QGNvZGUKLSAgICAgICAgIG1pblNka1ZlcnNpb259PC9hPiBhbmQgPGEKLSAgICAgICAgIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvdXNlcy1zZGstZWxlbWVudC5odG1sI3RhcmdldCI+e0Bjb2RlCi0gICAgICAgICB0YXJnZXRTZGtWZXJzaW9ufTwvYT4gdmFsdWVzIGFyZSBzZXQgdG8gMTUgb3IgbG93ZXIsIHRoZSBzeXN0ZW0gaW1wbGljaXRseQotICAgICAgICAgZ3JhbnRzIHlvdXIgYXBwIHRoaXMgcGVybWlzc2lvbi4gSWYgeW91IGRvbid0IG5lZWQgdGhpcyBwZXJtaXNzaW9uLCBiZSBzdXJlIHlvdXIgPGEKLSAgICAgICAgIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvdXNlcy1zZGstZWxlbWVudC5odG1sI3RhcmdldCI+e0Bjb2RlCi0gICAgICAgICB0YXJnZXRTZGtWZXJzaW9ufTwvYT4gaXMgMTYgb3IgaGlnaGVyLjwvcD4KLSAgICAgICAgIDxwPlByb3RlY3Rpb24gbGV2ZWw6IGRhbmdlcm91cwotICAgIC0tPgotICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfQ0FMTF9MT0ciCi0gICAgICAgIGFuZHJvaWQ6cGVybWlzc2lvbkdyb3VwPSJhbmRyb2lkLnBlcm1pc3Npb24tZ3JvdXAuUEhPTkUiCi0gICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvcGVybWxhYl9yZWFkQ2FsbExvZyIKLSAgICAgICAgYW5kcm9pZDpkZXNjcmlwdGlvbj0iQHN0cmluZy9wZXJtZGVzY19yZWFkQ2FsbExvZyIKLSAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9ImRhbmdlcm91cyIgLz4KLQotICAgIDwhLS0gQWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIHdyaXRlIChidXQgbm90IHJlYWQpIHRoZSB1c2VyJ3MKLSAgICAgICAgIGNhbGwgbG9nIGRhdGEuCi0gICAgICAgICA8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBJZiB5b3VyIGFwcCB1c2VzIHRoZQotICAgICAgICAge0BsaW5rICNXUklURV9DT05UQUNUU30gcGVybWlzc2lvbiBhbmQgPGVtPmJvdGg8L2VtPiB5b3VyIDxhCi0gICAgICAgICBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L3VzZXMtc2RrLWVsZW1lbnQuaHRtbCNtaW4iPntAY29kZQotICAgICAgICAgbWluU2RrVmVyc2lvbn08L2E+IGFuZCA8YQotICAgICAgICAgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC91c2VzLXNkay1lbGVtZW50Lmh0bWwjdGFyZ2V0Ij57QGNvZGUKLSAgICAgICAgIHRhcmdldFNka1ZlcnNpb259PC9hPiB2YWx1ZXMgYXJlIHNldCB0byAxNSBvciBsb3dlciwgdGhlIHN5c3RlbSBpbXBsaWNpdGx5Ci0gICAgICAgICBncmFudHMgeW91ciBhcHAgdGhpcyBwZXJtaXNzaW9uLiBJZiB5b3UgZG9uJ3QgbmVlZCB0aGlzIHBlcm1pc3Npb24sIGJlIHN1cmUgeW91ciA8YQotICAgICAgICAgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC91c2VzLXNkay1lbGVtZW50Lmh0bWwjdGFyZ2V0Ij57QGNvZGUKLSAgICAgICAgIHRhcmdldFNka1ZlcnNpb259PC9hPiBpcyAxNiBvciBoaWdoZXIuPC9wPgotICAgICAgICAgPHA+UHJvdGVjdGlvbiBsZXZlbDogZGFuZ2Vyb3VzCi0gICAgLS0+Ci0gICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uV1JJVEVfQ0FMTF9MT0ciCi0gICAgICAgIGFuZHJvaWQ6cGVybWlzc2lvbkdyb3VwPSJhbmRyb2lkLnBlcm1pc3Npb24tZ3JvdXAuUEhPTkUiCi0gICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvcGVybWxhYl93cml0ZUNhbGxMb2ciCi0gICAgICAgIGFuZHJvaWQ6ZGVzY3JpcHRpb249IkBzdHJpbmcvcGVybWRlc2Nfd3JpdGVDYWxsTG9nIgotICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0iZGFuZ2Vyb3VzIiAvPgotCiAgICAgPCEtLSBBbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gYWRkIHZvaWNlbWFpbHMgaW50byB0aGUgc3lzdGVtLgogICAgICAgICAgPHA+UHJvdGVjdGlvbiBsZXZlbDogZGFuZ2Vyb3VzCiAgICAgLS0+CkBAIC04OTksMTggKzk4OCw2IEBACiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvcGVybWxhYl91c2Vfc2lwIgogICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0iZGFuZ2Vyb3VzIi8+CiAKLSAgICA8IS0tIEFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byBzZWUgdGhlIG51bWJlciBiZWluZyBkaWFsZWQgZHVyaW5nIGFuIG91dGdvaW5nCi0gICAgICAgICBjYWxsIHdpdGggdGhlIG9wdGlvbiB0byByZWRpcmVjdCB0aGUgY2FsbCB0byBhIGRpZmZlcmVudCBudW1iZXIgb3IKLSAgICAgICAgIGFib3J0IHRoZSBjYWxsIGFsdG9nZXRoZXIuCi0gICAgICAgICA8cD5Qcm90ZWN0aW9uIGxldmVsOiBkYW5nZXJvdXMKLSAgICAtLT4KLSAgICA8cGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5QUk9DRVNTX09VVEdPSU5HX0NBTExTIgotICAgICAgICBhbmRyb2lkOnBlcm1pc3Npb25Hcm91cD0iYW5kcm9pZC5wZXJtaXNzaW9uLWdyb3VwLlBIT05FIgotICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3Blcm1sYWJfcHJvY2Vzc091dGdvaW5nQ2FsbHMiCi0gICAgICAgIGFuZHJvaWQ6ZGVzY3JpcHRpb249IkBzdHJpbmcvcGVybWRlc2NfcHJvY2Vzc091dGdvaW5nQ2FsbHMiCi0gICAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJkYW5nZXJvdXMiIC8+Ci0KLQogICAgIDwhLS0gQWxsb3dzIHRoZSBhcHAgdG8gYW5zd2VyIGFuIGluY29taW5nIHBob25lIGNhbGwuCiAgICAgICAgICA8cD5Qcm90ZWN0aW9uIGxldmVsOiBkYW5nZXJvdXMKICAgICAtLT4KQEAgLTkzMSw2ICsxMDA4LDIzIEBACiAgICAgICAgICAgICAgICAgYW5kcm9pZDpkZXNjcmlwdGlvbj0iQHN0cmluZy9wZXJtZGVzY19tYW5hZ2VPd25DYWxscyIKICAgICAgICAgICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ibm9ybWFsIiAvPgogCisgICAgPCEtLSBBbGxvd3MgYSBjYWxsaW5nIGFwcCB0byBjb250aW51ZSBhIGNhbGwgd2hpY2ggd2FzIHN0YXJ0ZWQgaW4gYW5vdGhlciBhcHAuICBBbiBleGFtcGxlIGlzIGEKKyAgICAgICAgIHZpZGVvIGNhbGxpbmcgYXBwIHRoYXQgd2FudHMgdG8gY29udGludWUgYSB2b2ljZSBjYWxsIG9uIHRoZSB1c2VyJ3MgbW9iaWxlIG5ldHdvcmsuPHA+CisgICAgICAgICBXaGVuIHRoZSBoYW5kb3ZlciBvZiBhIGNhbGwgZnJvbSBvbmUgYXBwIHRvIGFub3RoZXIgdGFrZXMgcGxhY2UsIHRoZXJlIGFyZSB0d28gZGV2aWNlcworICAgICAgICAgd2hpY2ggYXJlIGludm9sdmVkIGluIHRoZSBoYW5kb3ZlcjsgdGhlIGluaXRpYXRpbmcgYW5kIHJlY2VpdmluZyBkZXZpY2VzLiAgVGhlIGluaXRpYXRpbmcKKyAgICAgICAgIGRldmljZSBpcyB3aGVyZSB0aGUgcmVxdWVzdCB0byBoYW5kb3ZlciB0aGUgY2FsbCB3YXMgc3RhcnRlZCwgYW5kIHRoZSByZWNlaXZpbmcgZGV2aWNlIGlzCisgICAgICAgICB3aGVyZSB0aGUgaGFuZG92ZXIgcmVxdWVzdCBpcyBjb25maXJtZWQgYnkgdGhlIG90aGVyIHBhcnR5LjxwPgorICAgICAgICAgVGhpcyBwZXJtaXNzaW9uIHByb3RlY3RzIGFjY2VzcyB0byB0aGUKKyAgICAgICAgIHtAbGluayBhbmRyb2lkLnRlbGVjb20uVGVsZWNvbU1hbmFnZXIjYWNjZXB0SGFuZG92ZXIoVXJpLCBpbnQsIFBob25lQWNjb3VudEhhbmRsZSl9IHdoaWNoCisgICAgICAgICB0aGUgcmVjZWl2aW5nIHNpZGUgb2YgdGhlIGhhbmRvdmVyIHVzZXMgdG8gYWNjZXB0IGEgaGFuZG92ZXIuCisgICAgICAgICA8cD5Qcm90ZWN0aW9uIGxldmVsOiBkYW5nZXJvdXMKKyAgICAtLT4KKyAgICA8cGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5BQ0NFUFRfSEFORE9WRVIiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpwZXJtaXNzaW9uR3JvdXA9ImFuZHJvaWQucGVybWlzc2lvbi1ncm91cC5QSE9ORSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkLmxhYmVsPSJAc3RyaW5nL3Blcm1sYWJfYWNjZXB0SGFuZG92ZXIiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpkZXNjcmlwdGlvbj0iQHN0cmluZy9wZXJtZGVzY19hY2NlcHRIYW5kb3ZlcnMiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9ImRhbmdlcm91cyIgLz4KKwogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICAgICA8IS0tIFBlcm1pc3Npb25zIGZvciBhY2Nlc3NpbmcgdGhlIGRldmljZSBtaWNyb3Bob25lICAgICAgICAgICAgICAgICAgICAgICAgLS0+CiAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgpAQCAtOTQzLDYgKzEwMzcsNyBAQAogICAgICAgICBhbmRyb2lkOmljb249IkBkcmF3YWJsZS9wZXJtX2dyb3VwX21pY3JvcGhvbmUiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvcGVybWdyb3VwbGFiX21pY3JvcGhvbmUiCiAgICAgICAgIGFuZHJvaWQ6ZGVzY3JpcHRpb249IkBzdHJpbmcvcGVybWdyb3VwZGVzY19taWNyb3Bob25lIgorICAgICAgICBhbmRyb2lkOnJlcXVlc3Q9IkBzdHJpbmcvcGVybWdyb3VwcmVxdWVzdF9taWNyb3Bob25lIgogICAgICAgICBhbmRyb2lkOnByaW9yaXR5PSI2MDAiIC8+CiAKICAgICA8IS0tIEFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byByZWNvcmQgYXVkaW8uCkBAIC05ODUsNiArMTA4MCw3IEBACiAgICAgICAgIGFuZHJvaWQ6aWNvbj0iQGRyYXdhYmxlL3Blcm1fZ3JvdXBfY2FtZXJhIgogICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3Blcm1ncm91cGxhYl9jYW1lcmEiCiAgICAgICAgIGFuZHJvaWQ6ZGVzY3JpcHRpb249IkBzdHJpbmcvcGVybWdyb3VwZGVzY19jYW1lcmEiCisgICAgICAgIGFuZHJvaWQ6cmVxdWVzdD0iQHN0cmluZy9wZXJtZ3JvdXByZXF1ZXN0X2NhbWVyYSIKICAgICAgICAgYW5kcm9pZDpwcmlvcml0eT0iNzAwIiAvPgogCiAgICAgPCEtLSBSZXF1aXJlZCB0byBiZSBhYmxlIHRvIGFjY2VzcyB0aGUgY2FtZXJhIGRldmljZS4KQEAgLTEwMDksMTEgKzExMDUsMTIgQEAKICAgICA8ZWF0LWNvbW1lbnQgLz4KIAogICAgIDwhLS0gVXNlZCBmb3IgcGVybWlzc2lvbnMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIGFjY2Vzc2luZwotICAgICAgICAgY2FtZXJhIG9yIGNhcHR1cmluZyBpbWFnZXMvdmlkZW8gZnJvbSB0aGUgZGV2aWNlLiAtLT4KKyAgICAgICAgIGJvZHkgb3IgZW52aXJvbm1lbnRhbCBzZW5zb3JzLiAtLT4KICAgICA8cGVybWlzc2lvbi1ncm91cCBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi1ncm91cC5TRU5TT1JTIgogICAgICAgICBhbmRyb2lkOmljb249IkBkcmF3YWJsZS9wZXJtX2dyb3VwX3NlbnNvcnMiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvcGVybWdyb3VwbGFiX3NlbnNvcnMiCiAgICAgICAgIGFuZHJvaWQ6ZGVzY3JpcHRpb249IkBzdHJpbmcvcGVybWdyb3VwZGVzY19zZW5zb3JzIgorICAgICAgICBhbmRyb2lkOnJlcXVlc3Q9IkBzdHJpbmcvcGVybWdyb3VwcmVxdWVzdF9zZW5zb3JzIgogICAgICAgICBhbmRyb2lkOnByaW9yaXR5PSI4MDAiIC8+CiAKICAgICA8IS0tIEFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byBhY2Nlc3MgZGF0YSBmcm9tIHNlbnNvcnMgdGhhdCB0aGUgdXNlciB1c2VzIHRvCkBAIC0xMDI3LDYgKzExMjQsOCBAQAogCiAgICAgPCEtLSBBbGxvd3MgYW4gYXBwIHRvIHVzZSBmaW5nZXJwcmludCBoYXJkd2FyZS4KICAgICAgICAgIDxwPlByb3RlY3Rpb24gbGV2ZWw6IG5vcm1hbAorICAgICAgICAgQGRlcHJlY2F0ZWQgQXBwbGljYXRpb25zIHNob3VsZCByZXF1ZXN0IHtAbGluaworICAgICAgICAgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI1VTRV9CSU9NRVRSSUN9IGluc3RlYWQKICAgICAtLT4KICAgICA8cGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5VU0VfRklOR0VSUFJJTlQiCiAgICAgICAgIGFuZHJvaWQ6cGVybWlzc2lvbkdyb3VwPSJhbmRyb2lkLnBlcm1pc3Npb24tZ3JvdXAuU0VOU09SUyIKQEAgLTEwMzQsNiArMTEzMywxNSBAQAogICAgICAgICBhbmRyb2lkOmRlc2NyaXB0aW9uPSJAc3RyaW5nL3Blcm1kZXNjX3VzZUZpbmdlcnByaW50IgogICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ibm9ybWFsIiAvPgogCisgICAgPCEtLSBBbGxvd3MgYW4gYXBwIHRvIHVzZSBkZXZpY2Ugc3VwcG9ydGVkIGJpb21ldHJpYyBtb2RhbGl0aWVzLgorICAgICAgICAgPHA+UHJvdGVjdGlvbiBsZXZlbDogbm9ybWFsCisgICAgLS0+CisgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uVVNFX0JJT01FVFJJQyIKKyAgICAgICAgYW5kcm9pZDpwZXJtaXNzaW9uR3JvdXA9ImFuZHJvaWQucGVybWlzc2lvbi1ncm91cC5TRU5TT1JTIgorICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3Blcm1sYWJfdXNlQmlvbWV0cmljIgorICAgICAgICBhbmRyb2lkOmRlc2NyaXB0aW9uPSJAc3RyaW5nL3Blcm1kZXNjX3VzZUJpb21ldHJpYyIKKyAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9Im5vcm1hbCIgLz4KKwogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICAgICA8IS0tIFJFTU9WRUQgUEVSTUlTU0lPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CiAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgpAQCAtMTI2OCw2ICsxMzc2LDEzIEBACiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvcGVybWxhYl9jaGFuZ2VXaWZpU3RhdGUiCiAgICAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJub3JtYWwiIC8+CiAKKyAgICA8IS0tIEBTeXN0ZW1BcGkgQGhpZGUgQWxsb3dzIGFwcHMgdG8gY3JlYXRlIGFuZCBtYW5hZ2UgSVBzZWMgdHVubmVscy4KKyAgICAgICAgIDxwPk9ubHkgZ3JhbnRlZCB0byBhcHBsaWNhdGlvbnMgdGhhdCBhcmUgY3VycmVudGx5IGJvdW5kIGJ5IHRoZQorICAgICAgICAgc3lzdGVtIGZvciBjcmVhdGluZyBhbmQgbWFuYWdpbmcgSVBzZWMtYmFzZWQgaW50ZXJmYWNlcy4KKyAgICAtLT4KKyAgICA8cGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5NQU5BR0VfSVBTRUNfVFVOTkVMUyIKKyAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9InNpZ25hdHVyZXxhcHBvcCIgLz4KKwogICAgIDwhLS0gQFN5c3RlbUFwaSBAaGlkZSBBbGxvd3MgYXBwbGljYXRpb25zIHRvIHJlYWQgV2ktRmkgY3JlZGVudGlhbC4KICAgICAgICAgIDxwPk5vdCBmb3IgdXNlIGJ5IHRoaXJkLXBhcnR5IGFwcGxpY2F0aW9ucy4gLS0+CiAgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVBRF9XSUZJX0NSRURFTlRJQUwiCkBAIC0xMzI4LDYgKzE0NDMsMTMgQEAKICAgICA8cGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5ORVRXT1JLX1NFVFRJTkdTIgogICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic2lnbmF0dXJlIiAvPgogCisgICAgPCEtLSBBbGxvd3MgU2V0dXBXaXphcmQgdG8gY2FsbCBtZXRob2RzIGluIE5ldHdvcmtpbmcgc2VydmljZXMKKyAgICAgICAgIDxwPk5vdCBmb3IgdXNlIGJ5IGFueSBvdGhlciB0aGlyZC1wYXJ0eSBvciBwcml2aWxlZ2VkIGFwcGxpY2F0aW9ucy4KKyAgICAgICAgIEBoaWRlIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBTZXR1cFdpemFyZC4KKyAgICAtLT4KKyAgICA8cGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5ORVRXT1JLX1NFVFVQX1dJWkFSRCIKKyAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9InNpZ25hdHVyZXxzZXR1cCIgLz4KKwogICAgIDwhLS0gI1N5c3RlbUFwaSBAaGlkZSBBbGxvd3MgYXBwbGljYXRpb25zIHRvIGFjY2VzcyBpbmZvcm1hdGlvbiBhYm91dCBMb1dQQU4gaW50ZXJmYWNlcy4KICAgICAgICAgIDxwPk5vdCBmb3IgdXNlIGJ5IHRoaXJkLXBhcnR5IGFwcGxpY2F0aW9ucy4gLS0+CiAgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX0xPV1BBTl9TVEFURSIKQEAgLTEzNDksNiArMTQ3MSwxNyBAQAogICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLk1BTkFHRV9MT1dQQU5fSU5URVJGQUNFUyIKICAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9InNpZ25hdHVyZXxwcml2aWxlZ2VkIiAvPgogCisgICAgPCEtLSBAaGlkZSBBbGxvd3MgaW50ZXJuYWwgbWFuYWdlbWVudCBvZiBXaS1GaSBjb25uZWN0aXZpdHkgc3RhdGUgd2hlbiBvbgorICAgICAgICAgcGVybWlzc2lvbiByZXZpZXcgbW9kZS4KKyAgICAgICAgIDxwPk5vdCBmb3IgdXNlIGJ5IHRoaXJkLXBhcnR5IGFwcGxpY2F0aW9ucy4gLS0+CisgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uTUFOQUdFX1dJRklfV0hFTl9QRVJNSVNTSU9OX1JFVklFV19SRVFVSVJFRCIKKyAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9InNpZ25hdHVyZSIgLz4KKworICAgIDwhLS0gQGhpZGUgQWxsb3dzIGFuIGFwcCB0byBieXBhc3MgUHJpdmF0ZSBETlMuCisgICAgICAgICA8cD5Ob3QgZm9yIHVzZSBieSB0aGlyZC1wYXJ0eSBhcHBsaWNhdGlvbnMuIC0tPgorICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLk5FVFdPUktfQllQQVNTX1BSSVZBVEVfRE5TIgorICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic2lnbmF0dXJlIiAvPgorCiAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICAgPCEtLSBQZXJtaXNzaW9ucyBmb3Igc2hvcnQgcmFuZ2UsIHBlcmlwaGVyYWwgbmV0d29ya3MgLS0+CiAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CkBAIC0xMzYyLDYgKzE0OTUsMjEgQEAKICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9wZXJtbGFiX2JsdWV0b290aCIKICAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9Im5vcm1hbCIgLz4KIAorICAgIDwhLS0gQFN5c3RlbUFwaSBBbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gc3VzcGVuZCBvdGhlciBhcHBzLCB3aGljaCB3aWxsIHByZXZlbnQgdGhlIHVzZXIKKyAgICAgICAgIGZyb20gdXNpbmcgdGhlbSB1bnRpbCB0aGV5IGFyZSB1bnN1c3BlbmRlZC4KKyAgICAgICAgIEBoaWRlCisgICAgLS0+CisgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uU1VTUEVORF9BUFBTIgorICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic2lnbmF0dXJlfHByaXZpbGVnZWQiIC8+CisKKyAgICA8IS0tIEBTeXN0ZW1BcGkgTXVzdCBiZSByZXF1aXJlZCBieSBhY3Rpdml0aWVzIHRoYXQgaGFuZGxlIHRoZSBpbnRlbnQgYWN0aW9uCisgICAgICAgICB7QGxpbmsgSW50ZW50I0FDVElPTl9TRU5EX1NIT1dfU1VTUEVOREVEX0FQUF9ERVRBSUxTfS4gVGhpcyBpcyBmb3IgdXNlIGJ5IGFwcHMgdGhhdAorICAgICAgICAgaG9sZCB7QGxpbmsgTWFuaWZlc3QucGVybWlzc2lvbiNTVVNQRU5EX0FQUFN9IHRvIGludGVyYWN0IHdpdGggdGhlIHN5c3RlbS4KKyAgICAgICAgIDxwPk5vdCBmb3IgdXNlIGJ5IHRoaXJkLXBhcnR5IGFwcGxpY2F0aW9ucy4KKyAgICAgICAgIEBoaWRlIC0tPgorICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlNFTkRfU0hPV19TVVNQRU5ERURfQVBQX0RFVEFJTFMiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9InNpZ25hdHVyZSIgLz4KKwogICAgIDwhLS0gQWxsb3dzIGFwcGxpY2F0aW9ucyB0byBkaXNjb3ZlciBhbmQgcGFpciBibHVldG9vdGggZGV2aWNlcy4KICAgICAgICAgIDxwPlByb3RlY3Rpb24gbGV2ZWw6IG5vcm1hbAogICAgIC0tPgpAQCAtMTM5Niw2ICsxNTQ0LDEyIEBACiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvcGVybWxhYl9uZmMiCiAgICAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJub3JtYWwiIC8+CiAKKyAgICA8IS0tIEFsbG93cyBhcHBsaWNhdGlvbnMgdG8gcmVjZWl2ZSBORkMgdHJhbnNhY3Rpb24gZXZlbnRzLgorICAgICAgICAgPHA+UHJvdGVjdGlvbiBsZXZlbDogbm9ybWFsCisgICAgLS0+CisgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uTkZDX1RSQU5TQUNUSU9OX0VWRU5UIgorICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ibm9ybWFsIiAvPgorCiAgICAgPCEtLSBAU3lzdGVtQXBpIEFsbG93cyBhbiBpbnRlcm5hbCB1c2VyIHRvIHVzZSBwcml2aWxlZ2VkIENvbm5lY3Rpdml0eU1hbmFnZXIgQVBJcy4KICAgICAgICAgIEBoaWRlIC0tPgogICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkNPTk5FQ1RJVklUWV9JTlRFUk5BTCIKQEAgLTE0MjYsNiArMTU4MCwxMSBAQAogICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLk5GQ19IQU5ET1ZFUl9TVEFUVVMiCiAgICAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJzaWduYXR1cmV8cHJpdmlsZWdlZCIgLz4KIAorICAgIDwhLS0gQGhpZGUgQWxsb3dzIGludGVybmFsIG1hbmFnZW1lbnQgb2YgQmx1ZXRvb3RoIHN0YXRlIHdoZW4gb24gcGVybWlzc2lvbiByZXZpZXcgbW9kZS4KKyAgICAgICAgIDxwPk5vdCBmb3IgdXNlIGJ5IHRoaXJkLXBhcnR5IGFwcGxpY2F0aW9ucy4gLS0+CisgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uTUFOQUdFX0JMVUVUT09USF9XSEVOX1BFUk1JU1NJT05fUkVWSUVXX1JFUVVJUkVEIgorICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic2lnbmF0dXJlIiAvPgorCiAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgogICAgIDwhLS0gUGVybWlzc2lvbnMgZm9yIGFjY2Vzc2luZyBhY2NvdW50cyAtLT4KICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CkBAIC0xNTkxLDYgKzE3NTAsMTEgQEAKICAgICA8cGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5BQ0NFU1NfUERCX1NUQVRFIgogICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic2lnbmF0dXJlIiAvPgogCisgICAgPCEtLSBBbGxvd3MgdGVzdGluZyBpZiBhIHBhc3N3b3JkcyBpcyBmb3JiaWRkZW4gYnkgdGhlIGFkbWlucy4KKyAgICAgICAgIEBoaWRlIDxwPk5vdCBmb3IgdXNlIGJ5IHRoaXJkLXBhcnR5IGFwcGxpY2F0aW9ucy4gLS0+CisgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uVEVTVF9CTEFDS0xJU1RFRF9QQVNTV09SRCIKKyAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9InNpZ25hdHVyZSIgLz4KKwogICAgIDwhLS0gQGhpZGUgQWxsb3dzIHN5c3RlbSB1cGRhdGUgc2VydmljZSB0byBub3RpZnkgZGV2aWNlIG93bmVyIGFib3V0IHBlbmRpbmcgdXBkYXRlcy4KICAgIDxwPk5vdCBmb3IgdXNlIGJ5IHRoaXJkLXBhcnR5IGFwcGxpY2F0aW9ucy4gLS0+CiAgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uTk9USUZZX1BFTkRJTkdfU1lTVEVNX1VQREFURSIKQEAgLTE3MDUsMjggKzE4NjksNTMgQEAKICAgICA8cGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5TRU5EX0VNQk1TX0lOVEVOVFMiCiAgICAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJzaWduYXR1cmV8cHJpdmlsZWdlZCIgLz4KIAorCisgICAgPCEtLSBBbGxvd3MgaW50ZXJuYWwgbWFuYWdlbWVudCBvZiB0aGUgc2Vuc29yIGZyYW1ld29yaworICAgICAgICAgQGhpZGUgLS0+CisgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uTUFOQUdFX1NFTlNPUlMiCisgICAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJzaWduYXR1cmUiIC8+CisKICAgICA8IS0tIE11c3QgYmUgcmVxdWlyZWQgYnkgYW4gSW1zU2VydmljZSB0byBlbnN1cmUgdGhhdCBvbmx5IHRoZQogICAgICAgICAgc3lzdGVtIGNhbiBiaW5kIHRvIGl0LgotICAgICAgICAgPHA+UHJvdGVjdGlvbiBsZXZlbDogc2lnbmF0dXJlfHByaXZpbGVnZWQKKyAgICAgICAgIDxwPlByb3RlY3Rpb24gbGV2ZWw6IHNpZ25hdHVyZXxwcml2aWxlZ2VkfHZlbmRvclByaXZpbGVnZWQKICAgICAgICAgIEBTeXN0ZW1BcGkKICAgICAgICAgIEBoaWRlCiAgICAgLS0+CiAgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQklORF9JTVNfU0VSVklDRSIKLSAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9InNpZ25hdHVyZXxwcml2aWxlZ2VkIiAvPgorICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic2lnbmF0dXJlfHByaXZpbGVnZWR8dmVuZG9yUHJpdmlsZWdlZCIgLz4KIAotICAgIDwhLS0gQWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIG1hbmFnZSBlbWJlZGRlZCBzdWJzY3JpcHRpb25zICh0aG9zZSBvbiBhIGVVSUNDKSB0aHJvdWdoCi0gICAgICAgICBFdWljY01hbmFnZXIgQVBJcy4KKyAgICA8IS0tIE11c3QgYmUgcmVxdWlyZWQgYnkgYSB0ZWxlcGhvbnkgZGF0YSBzZXJ2aWNlIHRvIGVuc3VyZSB0aGF0IG9ubHkgdGhlCisgICAgICAgICBzeXN0ZW0gY2FuIGJpbmQgdG8gaXQuCisgICAgICAgICA8cD5Qcm90ZWN0aW9uIGxldmVsOiBzaWduYXR1cmUKKyAgICAgICAgIEBTeXN0ZW1BcGkKKyAgICAgICAgIEBoaWRlCisgICAgLS0+CisgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQklORF9URUxFUEhPTllfREFUQV9TRVJWSUNFIgorICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic2lnbmF0dXJlIiAvPgorCisgICAgPCEtLSBNdXN0IGJlIHJlcXVpcmVkIGJ5IGEgTmV0d29ya1NlcnZpY2UgdG8gZW5zdXJlIHRoYXQgb25seSB0aGUKKyAgICAgICAgIHN5c3RlbSBjYW4gYmluZCB0byBpdC4KKyAgICAgICAgIDxwPlByb3RlY3Rpb24gbGV2ZWw6IHNpZ25hdHVyZQorICAgICAgICAgQFN5c3RlbUFwaQorICAgICAgICAgQGhpZGUKKyAgICAtLT4KKyAgICA8cGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5CSU5EX1RFTEVQSE9OWV9ORVRXT1JLX1NFUlZJQ0UiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9InNpZ25hdHVyZSIgLz4KKworICAgIDwhLS0gQFN5c3RlbUFwaSBBbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gbWFuYWdlIGVtYmVkZGVkIHN1YnNjcmlwdGlvbnMgKHRob3NlIG9uIGEgZVVJQ0MpCisgICAgICAgICB0aHJvdWdoIEV1aWNjTWFuYWdlciBBUElzLgogICAgICAgICAgPHA+UHJvdGVjdGlvbiBsZXZlbDogc2lnbmF0dXJlfHByaXZpbGVnZWR8ZGV2ZWxvcG1lbnQKLSAgICAgICAgIFRPRE8oYi8zNTg1MTgwOSk6IE1hcmsgdGhpcyBhcyBhIFN5c3RlbUFwaSBhbmQgcmVtb3ZlIGNvbS4gcHJlZml4LgotICAgICAgICAgQGhpZGUgLS0+Ci0gICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0VNQkVEREVEX1NVQlNDUklQVElPTlMiCisgICAgICAgICBAaGlkZQorICAgIC0tPgorICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0VNQkVEREVEX1NVQlNDUklQVElPTlMiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9InNpZ25hdHVyZXxwcml2aWxlZ2VkfGRldmVsb3BtZW50IiAvPgogCi0gICAgPCEtLSBNdXN0IGJlIHJlcXVpcmVkIGJ5IGFuIEV1aWNjU2VydmljZSB0byBlbnN1cmUgdGhhdCBvbmx5IHRoZSBzeXN0ZW0gY2FuIGJpbmQgdG8gaXQuCisgICAgPCEtLSBAU3lzdGVtQXBpIE11c3QgYmUgcmVxdWlyZWQgYnkgYW4gRXVpY2NTZXJ2aWNlIHRvIGVuc3VyZSB0aGF0IG9ubHkgdGhlIHN5c3RlbSBjYW4gYmluZCB0bworICAgICAgICAgaXQuCiAgICAgICAgICA8cD5Qcm90ZWN0aW9uIGxldmVsOiBzaWduYXR1cmUKLSAgICAgICAgIFRPRE8oYi8zNTg1MTgwOSk6IE1hcmsgdGhpcyBhcyBhIFN5c3RlbUFwaSBhbmQgcmVtb3ZlIGNvbS4gcHJlZml4LgotICAgICAgICAgQGhpZGUgLS0+Ci0gICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5wZXJtaXNzaW9uLkJJTkRfRVVJQ0NfU0VSVklDRSIKKyAgICAgICAgIEBoaWRlCisgICAgLS0+CisgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQklORF9FVUlDQ19TRVJWSUNFIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJzaWduYXR1cmUiIC8+CiAKICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CkBAIC0xNzYzLDYgKzE5NTIsMTUgQEAKICAgICA8cGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5BTExPQ0FURV9BR0dSRVNTSVZFIgogICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic2lnbmF0dXJlfHByaXZpbGVnZWQiIC8+CiAKKyAgICA8IS0tIEBTeXN0ZW1BcGkgQGhpZGUKKyAgICAgICAgIEFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byB1c2UgcmVzZXJ2ZWQgZGlzayBzcGFjZS4KKyAgICAgICAgIDxwPk5vdCBmb3IgdXNlIGJ5IHRoaXJkLXBhcnR5IGFwcGxpY2F0aW9ucy4gIFNob3VsZCBvbmx5IGJlIHJlcXVlc3RlZCBieQorICAgICAgICAgYXBwcyB0aGF0IHByb3ZpZGUgY29yZSBzeXN0ZW0gZnVuY3Rpb25hbGl0eSwgdG8gZW5zdXJlIHN5c3RlbSBzdGFiaWxpdHkKKyAgICAgICAgIHdoZW4gZGlzayBpcyBvdGhlcndpc2UgY29tcGxldGVseSBmdWxsLgorICAgIC0tPgorICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlVTRV9SRVNFUlZFRF9ESVNLIgorICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic2lnbmF0dXJlfHByaXZpbGVnZWQiIC8+CisKICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICAgPCEtLSBQZXJtaXNzaW9ucyBmb3Igc2NyZWVubG9jayAgICAgICAgIC0tPgogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KQEAgLTE4NTgsMTMgKzIwNTYsMTMgQEAKICAgICA8cGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRU1PVkVfVEFTS1MiCiAgICAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJzaWduYXR1cmUiIC8+CiAKLSAgICA8IS0tIEBTeXN0ZW1BcGkgQGhpZGUgQWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIGNyZWF0ZS9tYW5hZ2UvcmVtb3ZlIHN0YWNrcyAtLT4KKyAgICA8IS0tIEBTeXN0ZW1BcGkgQFRlc3RBcGkgQGhpZGUgQWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIGNyZWF0ZS9tYW5hZ2UvcmVtb3ZlIHN0YWNrcyAtLT4KICAgICA8cGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5NQU5BR0VfQUNUSVZJVFlfU1RBQ0tTIgotICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic2lnbmF0dXJlfHByaXZpbGVnZWQiIC8+CisgICAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJzaWduYXR1cmV8cHJpdmlsZWdlZHxkZXZlbG9wbWVudCIgLz4KIAotICAgIDwhLS0gQFN5c3RlbUFwaSBAaGlkZSBBbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gZW1iZWQgb3RoZXIgYWN0aXZpdGllcyAtLT4KKyAgICA8IS0tIEBTeXN0ZW1BcGkgQFRlc3RBcGkgQGhpZGUgQWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIGVtYmVkIG90aGVyIGFjdGl2aXRpZXMgLS0+CiAgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQUNUSVZJVFlfRU1CRURESU5HIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJzaWduYXR1cmV8cHJpdmlsZWdlZCIgLz4KKyAgICAgICAgICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic2lnbmF0dXJlfHByaXZpbGVnZWR8ZGV2ZWxvcG1lbnQiIC8+CiAKICAgICA8IS0tIEFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byBzdGFydCBhbnkgYWN0aXZpdHksIHJlZ2FyZGxlc3Mgb2YgcGVybWlzc2lvbgogICAgICAgICAgcHJvdGVjdGlvbiBvciBleHBvcnRlZCBzdGF0ZS4KQEAgLTIwMzAsNiArMjIyOCwxMSBAQAogICAgIDxlYXQtY29tbWVudCAvPgogCiAgICAgPCEtLSBBbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gaW5zdGFsbCBhIHNob3J0Y3V0IGluIExhdW5jaGVyLgorICAgICAgICAgPHA+SW4gQW5kcm9pZCBPIChBUEkgbGV2ZWwgMjYpIGFuZCBoaWdoZXIsIHRoZSA8Y29kZT5JTlNUQUxMX1NIT1JUQ1VUPC9jb2RlPiBicm9hZGNhc3Qgbm8KKyAgICAgICAgIGxvbmdlciBoYXMgYW55IGVmZmVjdCBvbiB5b3VyIGFwcCBiZWNhdXNlIGl0J3MgYSBwcml2YXRlLCBpbXBsaWNpdAorICAgICAgICAgYnJvYWRjYXN0LiBJbnN0ZWFkLCB5b3Ugc2hvdWxkIGNyZWF0ZSBhbiBhcHAgc2hvcnRjdXQgYnkgdXNpbmcgdGhlCisgICAgICAgICB7QGxpbmsgYW5kcm9pZC5jb250ZW50LnBtLlNob3J0Y3V0TWFuYWdlciNyZXF1ZXN0UGluU2hvcnRjdXQgcmVxdWVzdFBpblNob3J0Y3V0KCl9CisgICAgICAgICBtZXRob2QgZnJvbSB0aGUge0BsaW5rIGFuZHJvaWQuY29udGVudC5wbS5TaG9ydGN1dE1hbmFnZXJ9IGNsYXNzLgogICAgICAgICAgPHA+UHJvdGVjdGlvbiBsZXZlbDogbm9ybWFsCiAgICAgLS0+CiAgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5sYXVuY2hlci5wZXJtaXNzaW9uLklOU1RBTExfU0hPUlRDVVQiCkBAIC0yMjUxLDYgKzI0NTQsMTEgQEAKICAgICA8cGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRUNPVkVSWSIKICAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9InNpZ25hdHVyZXxwcml2aWxlZ2VkIiAvPgogCisgICAgPCEtLSBAU3lzdGVtQXBpIEFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byByZWFkIHN5c3RlbSB1cGRhdGUgaW5mby4KKyAgICAgICAgIEBoaWRlIC0tPgorICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfU1lTVEVNX1VQREFURV9JTkZPIgorICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic2lnbmF0dXJlIiAvPgorCiAgICAgPCEtLSBBbGxvd3MgdGhlIHN5c3RlbSB0byBiaW5kIHRvIGFuIGFwcGxpY2F0aW9uJ3MgdGFzayBzZXJ2aWNlcwogICAgICAgICAgQGhpZGUgLS0+CiAgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQklORF9KT0JfU0VSVklDRSIKQEAgLTIyNjUsMTIgKzI0NzMsMTggQEAKICAgICA8cGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5VUERBVEVfQ09ORklHIgogICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic2lnbmF0dXJlfHByaXZpbGVnZWQiIC8+CiAKKyAgICA8IS0tIEFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byBxdWVyeSB0aGUgY3VycmVudCB0aW1lIHpvbmUgcnVsZXMgc3RhdGUKKyAgICAgICAgIG9uIGRldmljZS4KKyAgICAgICAgIEBTeXN0ZW1BcGkgQGhpZGUgLS0+CisgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUVVFUllfVElNRV9aT05FX1JVTEVTIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJzaWduYXR1cmV8cHJpdmlsZWdlZCIgLz4KKwogICAgIDwhLS0gQWxsb3dzIGEgdGltZSB6b25lIHJ1bGUgdXBkYXRlciBhcHBsaWNhdGlvbiB0byByZXF1ZXN0CiAgICAgICAgICB0aGUgc3lzdGVtIGluc3RhbGxzIC8gdW5pbnN0YWxscyB0aW1lem9uZSBydWxlcy4KICAgICAgICAgIDxwPkFuIGFwcGxpY2F0aW9uIHJlcXVlc3RpbmcgdGhpcyBwZXJtaXNzaW9uIGlzIHJlc3BvbnNpYmxlIGZvcgogICAgICAgICAgdmVyaWZ5aW5nIHRoZSBzb3VyY2UgYW5kIGludGVncml0eSBvZiB0aGUgdXBkYXRlIGJlZm9yZSBwYXNzaW5nCiAgICAgICAgICBpdCBvZmYgdG8gdGhlIGluc3RhbGxlciBjb21wb25lbnRzLgotICAgICAgICAgQGhpZGUgLS0+CisgICAgICAgICBAU3lzdGVtQXBpIEBoaWRlIC0tPgogICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlVQREFURV9USU1FX1pPTkVfUlVMRVMiCiAgICAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJzaWduYXR1cmV8cHJpdmlsZWdlZCIgLz4KIApAQCAtMjM5MCw3ICsyNjA0LDggQEAKICAgICA8cGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5VUERBVEVfREVWSUNFX1NUQVRTIgogICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic2lnbmF0dXJlfHByaXZpbGVnZWQiIC8+CiAKLSAgICA8IS0tIEBTeXN0ZW1BcGkgQGhpZGUgQWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIGNvbGxlY3QgYmF0dGVyeSBzdGF0aXN0aWNzIC0tPgorICAgIDwhLS0gQFN5c3RlbUFwaSBAaGlkZSBBbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gY29sbGVjdCBhcHBsaWNhdGlvbiBvcGVyYXRpb24gc3RhdGlzdGljcy4KKyAgICAgICAgIE5vdCBmb3IgdXNlIGJ5IHRoaXJkIHBhcnR5IGFwcHMuIC0tPgogICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkdFVF9BUFBfT1BTX1NUQVRTIgogICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic2lnbmF0dXJlfHByaXZpbGVnZWR8ZGV2ZWxvcG1lbnQiIC8+CiAKQEAgLTI0MDYsNiArMjYyMSwxMiBAQAogICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLk1BTkFHRV9BUFBfT1BTX1JFU1RSSUNUSU9OUyIKICAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9InNpZ25hdHVyZXxpbnN0YWxsZXIiIC8+CiAKKyAgICA8IS0tIEFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byB1cGRhdGUgdGhlIHVzZXIgYXBwIG9wIG1vZGVzLgorICAgICAgICAgTm90IGZvciB1c2UgYnkgdGhpcmQgcGFydHkgYXBwcy4KKyAgICAgICAgIEBoaWRlIC0tPgorICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLk1BTkFHRV9BUFBfT1BTX01PREVTIgorICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic2lnbmF0dXJlfGluc3RhbGxlcnx2ZXJpZmllciIgLz4KKwogICAgIDwhLS0gQFN5c3RlbUFwaSBBbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gb3BlbiB3aW5kb3dzIHRoYXQgYXJlIGZvciB1c2UgYnkgcGFydHMKICAgICAgICAgIG9mIHRoZSBzeXN0ZW0gdXNlciBpbnRlcmZhY2UuCiAgICAgICAgICA8cD5Ob3QgZm9yIHVzZSBieSB0aGlyZC1wYXJ0eSBhcHBsaWNhdGlvbnMuCkBAIC0yNDE1LDEwICsyNjM2LDEwIEBACiAgICAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJzaWduYXR1cmUiIC8+CiAKICAgICA8IS0tIEBTeXN0ZW1BcGkgQWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIHVzZQotICAgICAgICB7QGxpbmsgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0c1BhcmFtcyNQUklWQVRFX0ZMQUdfSElERV9OT05fU1lTVEVNX09WRVJMQVlfV0lORE9XU30KLSAgICAgICAgdG8gaGlkZSBub24tc3lzdGVtLW92ZXJsYXkgd2luZG93cy4KLSAgICAgICAgPHA+Tm90IGZvciB1c2UgYnkgdGhpcmQtcGFydHkgYXBwbGljYXRpb25zLgotICAgICAgICBAaGlkZQorICAgICAgICAge0BsaW5rIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dHNQYXJhbXMjUFJJVkFURV9GTEFHX0hJREVfTk9OX1NZU1RFTV9PVkVSTEFZX1dJTkRPV1N9CisgICAgICAgICB0byBoaWRlIG5vbi1zeXN0ZW0tb3ZlcmxheSB3aW5kb3dzLgorICAgICAgICAgPHA+Tm90IGZvciB1c2UgYnkgdGhpcmQtcGFydHkgYXBwbGljYXRpb25zLgorICAgICAgICAgQGhpZGUKICAgICAtLT4KICAgICA8cGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5ISURFX05PTl9TWVNURU1fT1ZFUkxBWV9XSU5ET1dTIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJzaWduYXR1cmV8aW5zdGFsbGVyIiAvPgpAQCAtMjYyNSwxMCArMjg0NiwzMCBAQAogICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkJJTkRfQVVUT0ZJTExfU0VSVklDRSIKICAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9InNpZ25hdHVyZSIgLz4KIAotICAgIDwhLS0gQGhpZGUgVE9ETyhiLzM3NTYzOTcyKTogcmVtb3ZlIG9uY2UgY2xpZW50cyB1c2UgQklORF9BVVRPRklMTF9TRVJWSUNFIC0tPgorICAgPCEtLSBBbHRlcm5hdGl2ZSB2ZXJzaW9uIG9mIGFuZHJvaWQucGVybWlzc2lvbi5CSU5EX0FVVE9GSUxMX0ZJRUxEX0NMQVNTSUZJQ0FUSU9OX1NFUlZJQ0UuCisgICAgICAgIFRoaXMgcGVybWlzc2lvbiB3YXMgcmVuYW1lZCBkdXJpbmcgdGhlIE8gcHJldmlld3MgYnV0IGl0IHdhcyBzdXBwb3J0ZWQgb24gdGhlIGZpbmFsIE8KKyAgICAgICAgcmVsZWFzZSwgc28gd2UgbmVlZCB0byBjYXJyeSBpdCBvdmVyLgorICAgICAgICA8cD5Qcm90ZWN0aW9uIGxldmVsOiBzaWduYXR1cmUKKyAgICAgICAgQGhpZGUKKyAgICAtLT4KICAgICA8cGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5CSU5EX0FVVE9GSUxMIgogICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic2lnbmF0dXJlIiAvPgogCisgICAgPCEtLSBNdXN0IGJlIHJlcXVpcmVkIGJ5IGFuIHtAbGluayBhbmRyb2lkLnNlcnZpY2UuYXV0b2ZpbGwuQXV0b2ZpbGxGaWVsZENsYXNzaWZpY2F0aW9uU2VydmljZX0KKyAgICAgICAgIHRvIGVuc3VyZSB0aGF0IG9ubHkgdGhlIHN5c3RlbSBjYW4gYmluZCB0byBpdC4KKyAgICAgICAgIEBoaWRlIFRoaXMgaXMgbm90IGEgdGhpcmQtcGFydHkgQVBJIChpbnRlbmRlZCBmb3IgT0VNcyBhbmQgc3lzdGVtIGFwcHMpLgorICAgIC0tPgorICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkJJTkRfQVVUT0ZJTExfRklFTERfQ0xBU1NJRklDQVRJT05fU0VSVklDRSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic2lnbmF0dXJlIiAvPgorCisgICAgPCEtLSBNdXN0IGJlIHJlcXVpcmVkIGJ5IGEgYW5kcm9pZC5zZXJ2aWNlLnRleHRjbGFzc2lmaWVyLlRleHRDbGFzc2lmaWVyU2VydmljZSwKKyAgICAgICAgIHRvIGVuc3VyZSB0aGF0IG9ubHkgdGhlIHN5c3RlbSBjYW4gYmluZCB0byBpdC4KKyAgICAgICAgIEBTeXN0ZW1BcGkgQGhpZGUgVGhpcyBpcyBub3QgYSB0aGlyZC1wYXJ0eSBBUEkgKGludGVuZGVkIGZvciBPRU1zIGFuZCBzeXN0ZW0gYXBwcykuCisgICAgICAgICA8cD5Qcm90ZWN0aW9uIGxldmVsOiBzaWduYXR1cmUKKyAgICAtLT4KKyAgICA8cGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5CSU5EX1RFWFRDTEFTU0lGSUVSX1NFUlZJQ0UiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9InNpZ25hdHVyZSIgLz4KKwogICAgIDwhLS0gTXVzdCBiZSByZXF1aXJlZCBieSBob3R3b3JkIGVucm9sbG1lbnQgYXBwbGljYXRpb24sCiAgICAgICAgICB0byBlbnN1cmUgdGhhdCBvbmx5IHRoZSBzeXN0ZW0gY2FuIGludGVyYWN0IHdpdGggaXQuCiAgICAgICAgICBAaGlkZSA8cD5Ob3QgZm9yIHVzZSBieSB0aGlyZC1wYXJ0eSBhcHBsaWNhdGlvbnMuPC9wPiAtLT4KQEAgLTI3NTQsOCArMjk5NSw5IEBACiAgICAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJzaWduYXR1cmV8YXBwb3AiIC8+CiAKICAgICA8IS0tIEFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byByZXF1ZXN0IGRlbGV0aW5nIHBhY2thZ2VzLiBBcHBzCi0gICAgICAgICB0YXJnZXRpbmcgQVBJcyBncmVhdGVyIHRoYW4gMjUgbXVzdCBob2xkIHRoaXMgcGVybWlzc2lvbiBpbgotICAgICAgICAgb3JkZXIgdG8gdXNlIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuSW50ZW50I0FDVElPTl9VTklOU1RBTExfUEFDS0FHRX0uCisgICAgICAgICB0YXJnZXRpbmcgQVBJcyB7QGxpbmsgYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OX0NPREVTI1B9IG9yIGdyZWF0ZXIgbXVzdCBob2xkIHRoaXMKKyAgICAgICAgIHBlcm1pc3Npb24gaW4gb3JkZXIgdG8gdXNlIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuSW50ZW50I0FDVElPTl9VTklOU1RBTExfUEFDS0FHRX0gb3IKKyAgICAgICAgIHtAbGluayBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZUluc3RhbGxlciN1bmluc3RhbGx9LgogICAgICAgICAgPHA+UHJvdGVjdGlvbiBsZXZlbDogbm9ybWFsCiAgICAgLS0+CiAgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVRVUVTVF9ERUxFVEVfUEFDS0FHRVMiCkBAIC0yNzY2LDYgKzMwMDgsMjIgQEAKICAgICA8IS0tIEBTeXN0ZW1BcGkgQWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIGluc3RhbGwgcGFja2FnZXMuCiAgICAgPHA+Tm90IGZvciB1c2UgYnkgdGhpcmQtcGFydHkgYXBwbGljYXRpb25zLiAtLT4KICAgICA8cGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5JTlNUQUxMX1BBQ0tBR0VTIgorICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9InNpZ25hdHVyZXxwcml2aWxlZ2VkIiAvPgorCisgICAgPCEtLSBAU3lzdGVtQXBpIEFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byBpbnN0YWxsIHNlbGYgdXBkYXRlcy4gVGhpcyBpcyBhIGxpbWl0ZWQgdmVyc2lvbgorICAgICAgICAgb2Yge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNJTlNUQUxMX1BBQ0tBR0VTfS4KKyAgICAgICAgPHA+Tm90IGZvciB1c2UgYnkgdGhpcmQtcGFydHkgYXBwbGljYXRpb25zLgorICAgICAgICBAaGlkZQorICAgIC0tPgorICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLklOU1RBTExfU0VMRl9VUERBVEVTIgorICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic2lnbmF0dXJlfHByaXZpbGVnZWQiIC8+CisKKyAgICA8IS0tIEBTeXN0ZW1BcGkgQWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIGluc3RhbGwgdXBkYXRlcy4gVGhpcyBpcyBhIGxpbWl0ZWQgdmVyc2lvbgorICAgICAgICAgb2Yge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNJTlNUQUxMX1BBQ0tBR0VTfS4KKyAgICAgICAgPHA+Tm90IGZvciB1c2UgYnkgdGhpcmQtcGFydHkgYXBwbGljYXRpb25zLgorICAgICAgICBAaGlkZQorICAgIC0tPgorICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLklOU1RBTExfUEFDS0FHRV9VUERBVEVTIgogICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic2lnbmF0dXJlfHByaXZpbGVnZWQiIC8+CiAKICAgICA8IS0tIEBTeXN0ZW1BcGkgQWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIGNsZWFyIHVzZXIgZGF0YS4KQEAgLTI3OTAsMTEgKzMwNDgsMzcgQEAKICAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQ0xFQVJfQVBQX0dSQU5URURfVVJJX1BFUk1JU1NJT05TIgogICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic2lnbmF0dXJlIiAvPgogCi0gICAgPCEtLSBAU3lzdGVtQXBpIEFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byBkZWxldGUgY2FjaGUgZmlsZXMuCi0gICAgPHA+Tm90IGZvciB1c2UgYnkgdGhpcmQtcGFydHkgYXBwbGljYXRpb25zLiAtLT4KKyAgICA8IS0tIEBoaWRlCisgICAgICAgICBBbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gY2hhbmdlIHRoZSBzdGF0dXMgb2YgU2NvcGVkIEFjY2VzcyBEaXJlY3RvcnkgcmVxdWVzdHMgZ3JhbnRlZCBvcgorICAgICAgICAgcmVqZWN0ZWQgYnkgdGhlIHVzZXIuCisgICAgICAgICA8cD5UaGlzIHBlcm1pc3Npb24gc2hvdWxkIDxlbT5vbmx5PC9lbT4gYmUgcmVxdWVzdGVkIGJ5IHRoZSBwbGF0Zm9ybQorICAgICAgICAgc2V0dGluZ3MgYXBwLiAgVGhpcyBwZXJtaXNzaW9uIGNhbm5vdCBiZSBncmFudGVkIHRvIHRoaXJkLXBhcnR5IGFwcHMuCisgICAgICAgICA8cD5Qcm90ZWN0aW9uIGxldmVsOiBzaWduYXR1cmUKKyAgICAtLT4KKyAgICA8cGVybWlzc2lvbgorICAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uTUFOQUdFX1NDT1BFRF9BQ0NFU1NfRElSRUNUT1JZX1BFUk1JU1NJT05TIgorICAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9InNpZ25hdHVyZSIgLz4KKworICAgIDwhLS0gQGhpZGUKKyAgICAgICAgIEFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byBjaGFuZ2UgdGhlIHN0YXR1cyBvZiBhIHBlcnNpc3RhYmxlIFVSSSBwZXJtaXNzaW9uIGdyYW50ZWQKKyAgICAgICAgIHRvIGFub3RoZXIgYXBwbGljYXRpb24uCisgICAgICAgICA8cD5UaGlzIHBlcm1pc3Npb24gc2hvdWxkIDxlbT5vbmx5PC9lbT4gYmUgcmVxdWVzdGVkIGJ5IHRoZSBwbGF0Zm9ybQorICAgICAgICAgc2V0dGluZ3MgYXBwLiAgVGhpcyBwZXJtaXNzaW9uIGNhbm5vdCBiZSBncmFudGVkIHRvIHRoaXJkLXBhcnR5IGFwcHMuCisgICAgICAgICA8cD5Qcm90ZWN0aW9uIGxldmVsOiBzaWduYXR1cmUKKyAgICAtLT4KKyAgICA8cGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5GT1JDRV9QRVJTSVNUQUJMRV9VUklfUEVSTUlTU0lPTlMiCisgICAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJzaWduYXR1cmUiIC8+CisKKyAgICA8IS0tIEBTeXN0ZW1BcGkgT2xkIHBlcm1pc3Npb24gZm9yIGRlbGV0aW5nIGFuIGFwcCdzIGNhY2hlIGZpbGVzLCBubyBsb25nZXIgdXNlZCwKKyAgICAgICAgIGJ1dCBzaWduYWxzIGZvciB1cyB0byBxdWlldGx5IGlnbm9yZSBjYWxscyBpbnN0ZWFkIG9mIHRocm93aW5nIGFuIGV4Y2VwdGlvbi4gLS0+CiAgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uREVMRVRFX0NBQ0hFX0ZJTEVTIgogICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic2lnbmF0dXJlfHByaXZpbGVnZWQiIC8+CiAKKyAgICA8IS0tIEFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byBkZWxldGUgY2FjaGUgZmlsZXMuCisgICAgICAgICBAaGlkZSAtLT4KKyAgICA8cGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5JTlRFUk5BTF9ERUxFVEVfQ0FDSEVfRklMRVMiCisgICAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJzaWduYXR1cmUiIC8+CisKICAgICA8IS0tIEBTeXN0ZW1BcGkgQWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIGRlbGV0ZSBwYWNrYWdlcy4KICAgICAgICAgIDxwPk5vdCBmb3IgdXNlIGJ5IHRoaXJkLXBhcnR5IGFwcGxpY2F0aW9ucy4KICAgICAgICAgIDxwPlN0YXJ0aW5nIGluIHtAbGluayBhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT05fQ09ERVMjTn0sIHVzZXIgY29uZmlybWF0aW9uIGlzIHJlcXVlc3RlZApAQCAtMjg3Nyw2ICszMTYxLDM5IEBACiAgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQ09ORklHVVJFX0RJU1BMQVlfQ09MT1JfTU9ERSIKICAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9InNpZ25hdHVyZSIgLz4KIAorICAgIDwhLS0gQWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIGNvbnRyb2wgdGhlIGNvbG9yIHNhdHVyYXRpb24gb2YgdGhlIGRpc3BsYXkuCisgICAgICAgICBAaGlkZQorICAgICAgICAgQFN5c3RlbUFwaSAtLT4KKyAgICA8cGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5DT05UUk9MX0RJU1BMQVlfU0FUVVJBVElPTiIKKyAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9InNpZ25hdHVyZXxwcml2aWxlZ2VkIiAvPgorCisgICAgPCEtLSBBbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gY29sbGVjdCB1c2FnZSBpbmZvbWF0aW9uIGFib3V0IGJyaWdodG5lc3Mgc2xpZGVyIGNoYW5nZXMuCisgICAgICAgICA8cD5Ob3QgZm9yIHVzZSBieSB0aGlyZC1wYXJ0eSBhcHBsaWNhdGlvbnMuPC9wPgorICAgICAgICAgQGhpZGUKKyAgICAgICAgIEBTeXN0ZW1BcGkKKyAgICAgICAgIEBUZXN0QXBpIC0tPgorICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkJSSUdIVE5FU1NfU0xJREVSX1VTQUdFIgorICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic2lnbmF0dXJlfHByaXZpbGVnZWR8ZGV2ZWxvcG1lbnQiIC8+CisKKyAgICA8IS0tIEFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byBjb2xsZWN0IGFtYmllbnQgbGlnaHQgc3RhdHMuCisgICAgICAgICA8cD5Ob3QgZm9yIHVzZSBieSB0aGlyZCBwYXJ0eSBhcHBsaWNhdGlvbnMuPC9wPgorICAgICAgICAgQGhpZGUKKyAgICAgICAgIEBTeXN0ZW1BcGkgLS0+CisgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX0FNQklFTlRfTElHSFRfU1RBVFMiCisgICAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJzaWduYXR1cmV8cHJpdmlsZWdlZHxkZXZlbG9wbWVudCIgLz4KKworICAgIDwhLS0gQWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIG1vZGlmeSB0aGUgZGlzcGxheSBicmlnaHRuZXNzIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgIEBoaWRlCisgICAgICAgICBAU3lzdGVtQXBpCisgICAgICAgICBAVGVzdEFwaSAtLT4KKyAgICA8cGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5DT05GSUdVUkVfRElTUExBWV9CUklHSFRORVNTIgorICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic2lnbmF0dXJlfHByaXZpbGVnZWR8ZGV2ZWxvcG1lbnQiIC8+CisKKyAgICA8IS0tIEFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byBjb250cm9sIHRoZSBzeXN0ZW0ncyBkaXNwbGF5IGJyaWdodG5lc3MKKyAgICAgICAgIEBoaWRlIC0tPgorICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkNPTlRST0xfRElTUExBWV9CUklHSFRORVNTIgorICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic2lnbmF0dXJlIiAvPgorCiAgICAgPCEtLSBAU3lzdGVtQXBpIEFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byBjb250cm9sIFZQTi4KICAgICAgICAgIDxwPk5vdCBmb3IgdXNlIGJ5IHRoaXJkLXBhcnR5IGFwcGxpY2F0aW9ucy48L3A+CiAgICAgICAgICBAaGlkZSAtLT4KQEAgLTMwMzIsMTAgKzMzNDksMTUgQEAKICAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9InNpZ25hdHVyZXxwcml2aWxlZ2VkfGRldmVsb3BtZW50fGFwcG9wIiAvPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUEFDS0FHRV9VU0FHRV9TVEFUUyIgLz4KIAotICAgIDwhLS0gQGhpZGUgQWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIGNoYW5nZSB0aGUgYXBwIGlkbGUgc3RhdGUgb2YgYW4gYXBwLgorICAgIDwhLS0gQGhpZGUgQFN5c3RlbUFwaSBBbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gb2JzZXJ2ZSB1c2FnZSB0aW1lIG9mIGFwcHMuIFRoZSBhcHAgY2FuIHJlZ2lzdGVyCisgICAgICAgICBmb3IgY2FsbGJhY2tzIHdoZW4gYXBwcyByZWFjaCBhIGNlcnRhaW4gdXNhZ2UgdGltZSBsaW1pdCwgZXRjLiAtLT4KKyAgICA8cGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5PQlNFUlZFX0FQUF9VU0FHRSIKKyAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9InNpZ25hdHVyZXxwcml2aWxlZ2VkIiAvPgorCisgICAgPCEtLSBAaGlkZSBAU3lzdGVtQXBpIEFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byBjaGFuZ2UgdGhlIGFwcCBpZGxlIHN0YXRlIG9mIGFuIGFwcC4KICAgICAgICAgIDxwPk5vdCBmb3IgdXNlIGJ5IHRoaXJkLXBhcnR5IGFwcGxpY2F0aW9ucy4gLS0+CiAgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQ0hBTkdFX0FQUF9JRExFX1NUQVRFIgotICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic2lnbmF0dXJlIiAvPgorICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic2lnbmF0dXJlfHByaXZpbGVnZWQiIC8+CiAKICAgICA8IS0tIEBoaWRlIEBTeXN0ZW1BcGkgQWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIHRlbXBvcmFyaWx5IHdoaXRlbGlzdCBhbiBpbmFjdGl2ZSBhcHAgdG8KICAgICAgICAgIGFjY2VzcyB0aGUgbmV0d29yayBhbmQgYWNxdWlyZSB3YWtlbG9ja3MuCkBAIC0zMDU2LDEyICszMzc4LDI1IEBACiAgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQkFUVEVSWV9TVEFUUyIKICAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9InNpZ25hdHVyZXxwcml2aWxlZ2VkfGRldmVsb3BtZW50IiAvPgogCisgICAgPCEtLUFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byBtYW5hZ2Ugc3RhdHNjb21wYW5pb24uCisgICAgPHA+Tm90IGZvciB1c2UgYnkgdGhpcmQtcGFydHkgYXBwbGljYXRpb25zLgorICAgICAgICAgQGhpZGUgLS0+CisgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uU1RBVFNDT01QQU5JT04iCisgICAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJzaWduYXR1cmUiIC8+CisKICAgICA8IS0tIEBTeXN0ZW1BcGkgQWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIGNvbnRyb2wgdGhlIGJhY2t1cCBhbmQgcmVzdG9yZSBwcm9jZXNzLgogICAgIDxwPk5vdCBmb3IgdXNlIGJ5IHRoaXJkLXBhcnR5IGFwcGxpY2F0aW9ucy4KICAgICAgICAgIEBoaWRlIHBlbmRpbmcgQVBJIGNvdW5jaWwgLS0+CiAgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQkFDS1VQIgogICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic2lnbmF0dXJlfHByaXZpbGVnZWQiIC8+CiAKKyAgICA8IS0tIEBTeXN0ZW1BcGkgQWxsb3dzIGFwcGxpY2F0aW9uIHRvIG1hbmFnZQorICAgICAgICAge0BsaW5rIGFuZHJvaWQuc2VjdXJpdHkua2V5c3RvcmUucmVjb3ZlcnkuUmVjb3ZlcnlDb250cm9sbGVyfS4KKyAgICAgICAgIDxwPk5vdCBmb3IgdXNlIGJ5IHRoaXJkLXBhcnR5IGFwcGxpY2F0aW9ucy4KKyAgICAgICAgIEBoaWRlIC0tPgorICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlJFQ09WRVJfS0VZU1RPUkUiCisgICAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJzaWduYXR1cmV8cHJpdmlsZWdlZCIgLz4KKwogICAgIDwhLS0gQWxsb3dzIGEgcGFja2FnZSB0byBsYXVuY2ggdGhlIHNlY3VyZSBmdWxsLWJhY2t1cCBjb25maXJtYXRpb24gVUkuCiAgICAgICAgICBPTkxZIHRoZSBzeXN0ZW0gcHJvY2VzcyBtYXkgaG9sZCB0aGlzIHBlcm1pc3Npb24uCiAgICAgICAgICBAaGlkZSAtLT4KQEAgLTMwODIsNiArMzQxNywxMCBAQAogICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkJJTkRfQVBQV0lER0VUIgogICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic2lnbmF0dXJlfHByaXZpbGVnZWQiIC8+CiAKKyAgICA8IS0tIEBoaWRlIEFsbG93cyBzeXN1aSB0byBtYW5hZ2UgdXNlciBncmFudHMgb2Ygc2xpY2UgcGVybWlzc2lvbnMuIC0tPgorICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLk1BTkFHRV9TTElDRV9QRVJNSVNTSU9OUyIKKyAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9InNpZ25hdHVyZSIgLz4KKwogICAgIDwhLS0gQFN5c3RlbUFwaSBQcml2YXRlIHBlcm1pc3Npb24sIHRvIHJlc3RyaWN0IHdobyBjYW4gYnJpbmcgdXAgYSBkaWFsb2cgdG8gYWRkIGEgbmV3CiAgICAgICAgICBrZXlndWFyZCB3aWRnZXQKICAgICAgICAgIEBoaWRlIC0tPgpAQCAtMzEyNiw2ICszNDY1LDExIEBACiAgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVBRF9TRUFSQ0hfSU5ERVhBQkxFUyIKICAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9InNpZ25hdHVyZXxwcml2aWxlZ2VkIiAvPgogCisgICAgPCEtLSBAU3lzdGVtQXBpIEludGVybmFsIHBlcm1pc3Npb24gdG8gYWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIGJpbmQgdG8gc3VnZ2VzdGlvbiBzZXJ2aWNlLgorICAgICAgICBAaGlkZSAtLT4KKyAgICA8cGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5CSU5EX1NFVFRJTkdTX1NVR0dFU1RJT05TX1NFUlZJQ0UiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9InNpZ25hdHVyZSIgLz4KKwogICAgIDwhLS0gQFN5c3RlbUFwaSBBbGxvd3MgYXBwbGljYXRpb25zIHRvIHNldCBhIGxpdmUgd2FsbHBhcGVyLgogICAgICAgICAgQGhpZGUgWFhYIENoYW5nZSB0byBzaWduYXR1cmUgb25jZSB0aGUgcGlja2VyIGlzIG1vdmVkIHRvIGl0cwogICAgICAgICAgb3duIGFwayBhcyBHaG9kIEludGVuZGVkLiAtLT4KQEAgLTMxOTksNiArMzU0MywxMCBAQAogICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkJJTkRfUEFDS0FHRV9WRVJJRklFUiIKICAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9InNpZ25hdHVyZSIgLz4KIAorICAgIDwhLS0gQFN5c3RlbUFwaSBAaGlkZSBBbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gbWFyayBvdGhlciBhcHBsaWNhdGlvbnMgYXMgaGFybWZ1bCAtLT4KKyAgICA8cGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5TRVRfSEFSTUZVTF9BUFBfV0FSTklOR1MiCisgICAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJzaWduYXR1cmV8dmVyaWZpZXIiIC8+CisKICAgICA8IS0tIEBTeXN0ZW1BcGkgQGhpZGUgSW50ZW50IGZpbHRlciB2ZXJpZmllciBuZWVkcyB0byBoYXZlIHRoaXMgcGVybWlzc2lvbiBiZWZvcmUgdGhlCiAgICAgICAgICBQYWNrYWdlTWFuYWdlciB3aWxsIHRydXN0IGl0IHRvIHZlcmlmeSBpbnRlbnQgZmlsdGVycy4KICAgICAtLT4KQEAgLTMyODUsNiArMzYzMywxMiBAQAogICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlBST1ZJREVfVFJVU1RfQUdFTlQiCiAgICAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJzaWduYXR1cmV8cHJpdmlsZWdlZCIgLz4KIAorICAgIDwhLS0gQFN5c3RlbUFwaSBBbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gc2hvdyBhIG1lc3NhZ2UKKyAgICAgICAgIG9uIHRoZSBrZXlndWFyZCB3aGVuIGFza2luZyB0byBkaXNtaXNzIGl0LgorICAgICAgICAgQGhpZGUgRm9yIHNlY3VyaXR5IHJlYXNvbnMsIHRoaXMgaXMgYSBwbGF0Zm9ybS1vbmx5IHBlcm1pc3Npb24uIC0tPgorICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlNIT1dfS0VZR1VBUkRfTUVTU0FHRSIKKyAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9InNpZ25hdHVyZXxwcml2aWxlZ2VkIiAvPgorCiAgICAgPCEtLSBBbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gbGF1bmNoIHRoZSB0cnVzdCBhZ2VudCBzZXR0aW5ncyBhY3Rpdml0eS4KICAgICAgICAgQGhpZGUgLS0+CiAgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uTEFVTkNIX1RSVVNUX0FHRU5UX1NFVFRJTkdTIgpAQCAtMzQzMCw2ICszNzg0LDcgQEAKICAgICAgICAgQGhpZGUgLS0+CiAgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uTE9DQUxfTUFDX0FERFJFU1MiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9InNpZ25hdHVyZXxwcml2aWxlZ2VkIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uTE9DQUxfTUFDX0FERFJFU1MiLz4KIAogICAgIDwhLS0gQFN5c3RlbUFwaSBBbGxvd3MgYWNjZXNzIHRvIE1BQyBhZGRyZXNzZXMgb2YgV2lGaSBhbmQgQmx1ZXRvb3RoIHBlZXIgZGV2aWNlcy4KICAgICAgICAgQGhpZGUgLS0+CkBAIC0zNDU4LDExICszODEzLDE5IEBACiAgICAgQGhpZGUgLS0+CiAgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX0lOU1RBTlRfQVBQUyIKICAgICAgICAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJzaWduYXR1cmV8aW5zdGFsbGVyfHZlcmlmaWVyIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX0lOU1RBTlRfQVBQUyIvPgogCiAgICAgPCEtLSBBbGxvd3MgdGhlIGhvbGRlciB0byB2aWV3IHRoZSBpbnN0YW50IGFwcGxpY2F0aW9ucyBvbiB0aGUgZGV2aWNlLgogICAgIEBoaWRlIC0tPgogICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlZJRVdfSU5TVEFOVF9BUFBTIgotICAgICAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9InNpZ25hdHVyZXxwcmVpbnN0YWxsZWQiIC8+CisgICAgICAgICAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9InNpZ25hdHVyZXxwcmVpbnN0YWxsZWQiIC8+CisKKyAgICA8IS0tIEFsbG93cyB0aGUgaG9sZGVyIHRvIG1hbmFnZSB3aGV0aGVyIHRoZSBzeXN0ZW0gY2FuIGJpbmQgdG8gc2VydmljZXMKKyAgICAgICAgIHByb3ZpZGVkIGJ5IGluc3RhbnQgYXBwcy4gVGhpcyBwZXJtaXNzaW9uIGlzIGludGVuZGVkIHRvIHByb3RlY3QKKyAgICAgICAgIHRlc3QvZGV2ZWxvcG1lbnQgZnVjbnRpb25hbGl0eSBhbmQgc2hvdWxkIGJlIHVzZWQgb25seSBpbiBzdWNoIGNhc2VzLgorICAgIEBoaWRlIC0tPgorICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLk1BTkFHRV9CSU5EX0lOU1RBTlRfU0VSVklDRSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic2lnbmF0dXJlIiAvPgogCiAgICAgPCEtLSBBbGxvd3MgcmVjZWl2aW5nIHRoZSB1c2FnZSBvZiBtZWRpYSByZXNvdXJjZSBlLmcuIHZpZGVvL2F1ZGlvIGNvZGVjIGFuZAogICAgICAgICAgZ3JhcGhpYyBtZW1vcnkuCkBAIC0zNDcyLDEwICszODM1LDE3IEBACiAKICAgICA8IS0tIE11c3QgYmUgcmVxdWlyZWQgYnkgc3lzdGVtL3ByaXYgYXBwcyB3aGVuIGFjY2Vzc2luZyB0aGUgc291bmQgdHJpZ2dlcgogICAgICAgICAgQVBJcyBnaXZlbiBieSB7QGxpbmsgU291bmRUcmlnZ2VyTWFuYWdlcn0uCi0gICAgICAgICBAaGlkZSA8cD5Ob3QgZm9yIHVzZSBieSB0aGlyZC1wYXJ0eSBhcHBsaWNhdGlvbnMuPC9wPiAtLT4KKyAgICAgICAgIEBoaWRlCisgICAgICAgICBAU3lzdGVtQXBpIC0tPgogICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLk1BTkFHRV9TT1VORF9UUklHR0VSIgogICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic2lnbmF0dXJlfHByaXZpbGVnZWQiIC8+CiAKKyAgICA8IS0tIE11c3QgYmUgcmVxdWlyZWQgYnkgc3lzdGVtL3ByaXYgYXBwcyBpbXBsZW1lbnRpbmcgc291bmQgdHJpZ2dlciBkZXRlY3Rpb24gc2VydmljZXMKKyAgICAgICAgIEBoaWRlCisgICAgICAgICBAU3lzdGVtQXBpIC0tPgorICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkJJTkRfU09VTkRfVFJJR0dFUl9ERVRFQ1RJT05fU0VSVklDRSIKKyAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9InNpZ25hdHVyZSIgLz4KKwogICAgIDwhLS0gQFN5c3RlbUFwaSBBbGxvd3MgdHJ1c3RlZCBhcHBsaWNhdGlvbnMgdG8gZGlzcGF0Y2ggbWFuYWdlZCBwcm92aXNpb25pbmcgbWVzc2FnZSB0byBNYW5hZ2VkCiAgICAgICAgICBQcm92aXNpb25pbmcgYXBwLiBJZiByZXF1ZXN0aW5nIGFwcCBkb2VzIG5vdCBoYXZlIHBlcm1pc3Npb24sIGl0IHdpbGwgYmUgaWdub3JlZC4KICAgICAgICAgIEBoaWRlIC0tPgpAQCAtMzU0OCw2ICszOTE4LDY2IEBACiAgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uSU5TVEFOVF9BUFBfRk9SRUdST1VORF9TRVJWSUNFIgogICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic2lnbmF0dXJlfGRldmVsb3BtZW50fGluc3RhbnR8YXBwb3AiIC8+CiAKKyAgICA8IS0tIEFsbG93cyBhIHJlZ3VsYXIgYXBwbGljYXRpb24gdG8gdXNlIHtAbGluayBhbmRyb2lkLmFwcC5TZXJ2aWNlI3N0YXJ0Rm9yZWdyb3VuZAorICAgICAgICAgU2VydmljZS5zdGFydEZvcmVncm91bmR9LgorICAgICAgICAgPHA+UHJvdGVjdGlvbiBsZXZlbDogbm9ybWFsCisgICAgLS0+CisgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uRk9SRUdST1VORF9TRVJWSUNFIgorICAgICAgICBhbmRyb2lkOmRlc2NyaXB0aW9uPSJAc3RyaW5nL3Blcm1kZXNjX2ZvcmVncm91bmRTZXJ2aWNlIgorICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3Blcm1sYWJfZm9yZWdyb3VuZFNlcnZpY2UiCisgICAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJub3JtYWx8aW5zdGFudCIgLz4KKworICAgIDwhLS0gQFN5c3RlbUFwaSBBbGxvd3MgdG8gYWNjZXNzIGFsbCBhcHAgc2hvcnRjdXRzLgorICAgICAgICAgQGhpZGUgLS0+CisgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX1NIT1JUQ1VUUyIKKyAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9InNpZ25hdHVyZXx0ZXh0Q2xhc3NpZmllciIgLz4KKworICAgIDwhLS0gQFN5c3RlbUFwaSBBbGxvd3MgdW5saW1pdGVkIGNhbGxzIHRvIHNob3J0Y3V0IG11dGF0aW9uIEFQSXMuCisgICAgICAgICBAaGlkZSAtLT4KKyAgICA8cGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5VTkxJTUlURURfU0hPUlRDVVRTX0FQSV9DQUxMUyIKKyAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9InNpZ25hdHVyZXx0ZXh0Q2xhc3NpZmllciIgLz4KKworICAgIDwhLS0gQFN5c3RlbUFwaSBBbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gcmVhZCB0aGUgcnVudGltZSBwcm9maWxlcyBvZiBvdGhlciBhcHBzLgorICAgICAgICAgQGhpZGUgPHA+Tm90IGZvciB1c2UgYnkgdGhpcmQtcGFydHkgYXBwbGljYXRpb25zLiAtLT4KKyAgICA8cGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX1JVTlRJTUVfUFJPRklMRVMiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9InNpZ25hdHVyZXxwcml2aWxlZ2VkIiAvPgorCisgICAgPCEtLSBAaGlkZSBBbGxvd3MgYXVkaW8gcG9saWN5IG1hbmFnZW1lbnQuIC0tPgorICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLk1BTkFHRV9BVURJT19QT0xJQ1kiCisgICAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJzaWduYXR1cmUiIC8+CisKKyAgICA8IS0tIEBTeXN0ZW1BcGkgQWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIHR1cm4gb24gLyBvZmYgcXVpZXQgbW9kZS4KKyAgICAgICAgIEBoaWRlIDxwPk5vdCBmb3IgdXNlIGJ5IHRoaXJkLXBhcnR5IGFwcGxpY2F0aW9ucy4gLS0+CisgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX1FVSUVUX01PREUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9InNpZ25hdHVyZXxwcml2aWxlZ2VkIiAvPgorCisgICAgPCEtLSBBbGxvd3MgaW50ZXJuYWwgbWFuYWdlbWVudCBvZiB0aGUgY2FtZXJhIGZyYW1ld29yaworICAgICAgICAgQGhpZGUgLS0+CisgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uTUFOQUdFX0NBTUVSQSIKKyAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9InNpZ25hdHVyZSIgLz4KKworICAgIDwhLS0gQWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIGNvbnRyb2wgcmVtb3RlIGFuaW1hdGlvbnMuIFNlZQorICAgICAgICAge0BsaW5rIEFjdGl2aXR5T3B0aW9ucyNtYWtlUmVtb3RlQW5pbWF0aW9ufQorICAgICAgICAgQGhpZGUgPHA+Tm90IGZvciB1c2UgYnkgdGhpcmQtcGFydHkgYXBwbGljYXRpb25zLiAtLT4KKyAgICA8cGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5DT05UUk9MX1JFTU9URV9BUFBfVFJBTlNJVElPTl9BTklNQVRJT05TIgorICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic2lnbmF0dXJlfHByaXZpbGVnZWQiIC8+CisKKyAgICA8IS0tIEFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byB3YXRjaCBjaGFuZ2VzIGFuZC9vciBhY3RpdmUgc3RhdGUgb2YgYXBwIG9wcy4KKyAgICAgICAgIEBoaWRlIDxwPk5vdCBmb3IgdXNlIGJ5IHRoaXJkLXBhcnR5IGFwcGxpY2F0aW9ucy4gLS0+CisgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uV0FUQ0hfQVBQT1BTIgorICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic2lnbmF0dXJlIiAvPgorCisgICAgPCEtLSBBbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gZGlyZWN0bHkgb3BlbiB0aGUgIk9wZW4gYnkgZGVmYXVsdCIgcGFnZSBpbnNpZGUgYSBwYWNrYWdlJ3MKKyAgICAgICAgIERldGFpbHMgc2NyZWVuLgorICAgICAgICAgQGhpZGUgPHA+Tm90IGZvciB1c2UgYnkgdGhpcmQtcGFydHkgYXBwbGljYXRpb25zLiAtLT4KKyAgICA8cGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5PUEVOX0FQUExJQ0FUSU9OX0RFVEFJTFNfT1BFTl9CWV9ERUZBVUxUX1BBR0UiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9InNpZ25hdHVyZSIgLz4KKworICAgIDwhLS0gQWxsb3dzIGhpZGRlbiBBUEkgY2hlY2tzIHRvIGJlIGRpc2FibGVkIHdoZW4gc3RhcnRpbmcgYSBwcm9jZXNzLgorICAgICAgICAgQGhpZGUgPHA+Tm90IGZvciB1c2UgYnkgdGhpcmQtcGFydHkgYXBwbGljYXRpb25zLiAtLT4KKyAgICA8cGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5ESVNBQkxFX0hJRERFTl9BUElfQ0hFQ0tTIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJzaWduYXR1cmUiIC8+CisKICAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpwcm9jZXNzPSJzeXN0ZW0iCiAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGVyc2lzdGVudD0idHJ1ZSIKICAgICAgICAgICAgICAgICAgYW5kcm9pZDpoYXNDb2RlPSJmYWxzZSIKQEAgLTM1OTYsNiArNDAyNiw3IEBACiAgICAgICAgICAgICAgICAgYW5kcm9pZDpleGNsdWRlRnJvbVJlY2VudHM9InRydWUiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy91c2VyX293bmVyX2xhYmVsIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmxlVG9JbnN0YW50QXBwcz0idHJ1ZSIKICAgICAgICAgICAgICAgICA+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAgICAgICAgIDxhY3Rpdml0eS1hbGlhcyBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5Gb3J3YXJkSW50ZW50VG9QYXJlbnQiCkBAIC0zNjA1LDcgKzQwMzYsNyBAQAogICAgICAgICA8L2FjdGl2aXR5LWFsaWFzPgogICAgICAgICA8YWN0aXZpdHktYWxpYXMgYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuRm9yd2FyZEludGVudFRvTWFuYWdlZFByb2ZpbGUiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRBY3Rpdml0eT0iY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLkludGVudEZvcndhcmRlckFjdGl2aXR5IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWNvbj0iQGRyYXdhYmxlL2ljX2NvcnBfaWNvbiIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmljb249IkBkcmF3YWJsZS9pY19jb3JwX2JhZGdlIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9tYW5hZ2VkX3Byb2ZpbGVfbGFiZWwiPgogICAgICAgICA8L2FjdGl2aXR5LWFsaWFzPgpAQCAtMzc0MSw2ICs0MTcyLDE0IEBACiAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmV4Y2x1ZGVGcm9tUmVjZW50cz0idHJ1ZSI+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLkhhcm1mdWxBcHBXYXJuaW5nQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAc3R5bGUvVGhlbWUuRGV2aWNlRGVmYXVsdC5MaWdodC5EaWFsb2cuQWxlcnQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmV4Y2x1ZGVGcm9tUmVjZW50cz0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cHJvY2Vzcz0iOnVpIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9oYXJtZnVsX2FwcF93YXJuaW5nX3RpdGxlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0iZmFsc2UiPgorICAgICAgICA8L2FjdGl2aXR5PgorCiAgICAgICAgIDxyZWNlaXZlciBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLnNlcnZlci5Cb290UmVjZWl2ZXIiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpzeXN0ZW1Vc2VyT25seT0idHJ1ZSI+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlciBhbmRyb2lkOnByaW9yaXR5PSIxMDAwIj4KQEAgLTM3NzIsNiArNDIxMSwxNCBAQAogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICA8L3JlY2VpdmVyPgogCisgICAgICAgIDxyZWNlaXZlciBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLnNlcnZlci51cGRhdGVzLk5ldHdvcmtXYXRjaGxpc3RJbnN0YWxsUmVjZWl2ZXIiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnBlcm1pc3Npb249ImFuZHJvaWQucGVybWlzc2lvbi5VUERBVEVfQ09ORklHIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uVVBEQVRFX05FVFdPUktfV0FUQ0hMSVNUIiAvPgorICAgICAgICAgICAgICAgIDxkYXRhIGFuZHJvaWQ6c2NoZW1lPSJjb250ZW50IiBhbmRyb2lkOmhvc3Q9IioiIGFuZHJvaWQ6bWltZVR5cGU9IiovKiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9yZWNlaXZlcj4KKwogICAgICAgICA8cmVjZWl2ZXIgYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5zZXJ2ZXIudXBkYXRlcy5BcG5EYkluc3RhbGxSZWNlaXZlciIKICAgICAgICAgICAgICAgICBhbmRyb2lkOnBlcm1pc3Npb249ImFuZHJvaWQucGVybWlzc2lvbi5VUERBVEVfQ09ORklHIj4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgpAQCAtMzc4OCwxNCArNDIzNSw2IEBACiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgIDwvcmVjZWl2ZXI+CiAKLSAgICAgICAgPHJlY2VpdmVyIGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuc2VydmVyLnVwZGF0ZXMuVHpEYXRhSW5zdGFsbFJlY2VpdmVyIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGVybWlzc2lvbj0iYW5kcm9pZC5wZXJtaXNzaW9uLlVQREFURV9DT05GSUciPgotICAgICAgICAgICAgPGludGVudC1maWx0ZXI+Ci0gICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5VUERBVEVfVFpEQVRBIiAvPgotICAgICAgICAgICAgICAgIDxkYXRhIGFuZHJvaWQ6c2NoZW1lPSJjb250ZW50IiBhbmRyb2lkOmhvc3Q9IioiIGFuZHJvaWQ6bWltZVR5cGU9IiovKiIgLz4KLSAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KLSAgICAgICAgPC9yZWNlaXZlcj4KLQogICAgICAgICA8cmVjZWl2ZXIgYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5zZXJ2ZXIudXBkYXRlcy5DZXJ0aWZpY2F0ZVRyYW5zcGFyZW5jeUxvZ0luc3RhbGxSZWNlaXZlciIKICAgICAgICAgICAgICAgICBhbmRyb2lkOnBlcm1pc3Npb249ImFuZHJvaWQucGVybWlzc2lvbi5VUERBVEVfQ09ORklHIj4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgpAQCAtMzgyMCw2ICs0MjU5LDE0IEBACiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgIDwvcmVjZWl2ZXI+CiAKKyAgICAgICAgPHJlY2VpdmVyIGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuc2VydmVyLnVwZGF0ZXMuQ2FycmllcklkSW5zdGFsbFJlY2VpdmVyIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwZXJtaXNzaW9uPSJhbmRyb2lkLnBlcm1pc3Npb24uVVBEQVRFX0NPTkZJRyI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5vcy5hY3Rpb24uVVBEQVRFX0NBUlJJRVJfSURfREIiIC8+CisgICAgICAgICAgICAgICAgPGRhdGEgYW5kcm9pZDpzY2hlbWU9ImNvbnRlbnQiIGFuZHJvaWQ6aG9zdD0iKiIgYW5kcm9pZDptaW1lVHlwZT0iKi8qIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L3JlY2VpdmVyPgorCiAgICAgICAgIDxyZWNlaXZlciBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLnNlcnZlci5NYXN0ZXJDbGVhclJlY2VpdmVyIgogICAgICAgICAgICAgYW5kcm9pZDpwZXJtaXNzaW9uPSJhbmRyb2lkLnBlcm1pc3Npb24uTUFTVEVSX0NMRUFSIj4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyCkBAIC0zODM2LDYgKzQyODMsMjYgQEAKICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KICAgICAgICAgPC9yZWNlaXZlcj4KIAorICAgICAgICA8cmVjZWl2ZXIgYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5zZXJ2ZXIuc3RhdHMuU3RhdHNDb21wYW5pb25TZXJ2aWNlJEFub21hbHlBbGFybVJlY2VpdmVyIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwZXJtaXNzaW9uPSJhbmRyb2lkLnBlcm1pc3Npb24uU1RBVFNDT01QQU5JT04iCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJmYWxzZSI+CisgICAgICAgIDwvcmVjZWl2ZXI+CisKKyAgICAgICAgPHJlY2VpdmVyIGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuc2VydmVyLnN0YXRzLlN0YXRzQ29tcGFuaW9uU2VydmljZSRQdWxsaW5nQWxhcm1SZWNlaXZlciIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGVybWlzc2lvbj0iYW5kcm9pZC5wZXJtaXNzaW9uLlNUQVRTQ09NUEFOSU9OIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0iZmFsc2UiPgorICAgICAgICA8L3JlY2VpdmVyPgorCisgICAgICAgIDxyZWNlaXZlciBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLnNlcnZlci5hbS5CYXR0ZXJ5U3RhdHNTZXJ2aWNlJFVzYkNvbm5lY3Rpb25SZWNlaXZlciIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9ImZhbHNlIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uQk9PVF9DT01QTEVURUQiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5oYXJkd2FyZS51c2IuYWN0aW9uLlVTQl9TVEFURSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9yZWNlaXZlcj4KKwogICAgICAgICA8c2VydmljZSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaGFyZHdhcmUubG9jYXRpb24uR2VvZmVuY2VIYXJkd2FyZVNlcnZpY2UiCiAgICAgICAgICAgICBhbmRyb2lkOnBlcm1pc3Npb249ImFuZHJvaWQucGVybWlzc2lvbi5MT0NBVElPTl9IQVJEV0FSRSIKICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9ImZhbHNlIiAvPgpAQCAtMzg4Nyw2ICs0MzU0LDI3IEBACiAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGVybWlzc2lvbj0iYW5kcm9pZC5wZXJtaXNzaW9uLkJJTkRfSk9CX1NFUlZJQ0UiID4KICAgICAgICAgPC9zZXJ2aWNlPgogCi0gICAgPC9hcHBsaWNhdGlvbj4KKyAgICAgICAgPHNlcnZpY2UgYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5zZXJ2ZXIudGltZXpvbmUuVGltZVpvbmVVcGRhdGVJZGxlciIKKyAgICAgICAgICAgICAgICAgYW5kcm9pZDpwZXJtaXNzaW9uPSJhbmRyb2lkLnBlcm1pc3Npb24uQklORF9KT0JfU0VSVklDRSIgPgorICAgICAgICA8L3NlcnZpY2U+CisKKyAgICAgICAgPHNlcnZpY2UgYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5zZXJ2ZXIubmV0LndhdGNobGlzdC5SZXBvcnRXYXRjaGxpc3RKb2JTZXJ2aWNlIgorICAgICAgICAgICAgICAgICBhbmRyb2lkOnBlcm1pc3Npb249ImFuZHJvaWQucGVybWlzc2lvbi5CSU5EX0pPQl9TRVJWSUNFIiA+CisgICAgICAgIDwvc2VydmljZT4KKworICAgICAgICA8c2VydmljZSBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLnNlcnZlci5kaXNwbGF5LkJyaWdodG5lc3NJZGxlSm9iIgorICAgICAgICAgICAgICAgICBhbmRyb2lkOnBlcm1pc3Npb249ImFuZHJvaWQucGVybWlzc2lvbi5CSU5EX0pPQl9TRVJWSUNFIiA+CisgICAgICAgIDwvc2VydmljZT4KKworICAgICAgICA8c2VydmljZQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuc2VydmVyLmF1dG9maWxsLkF1dG9maWxsQ29tcGF0QWNjZXNzaWJpbGl0eVNlcnZpY2UiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpwZXJtaXNzaW9uPSJhbmRyb2lkLnBlcm1pc3Npb24uQklORF9BQ0NFU1NJQklMSVRZX1NFUlZJQ0UiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSI+CisgICAgICAgICAgICA8bWV0YS1kYXRhCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZSIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpyZXNvdXJjZT0iQHhtbC9hdXRvZmlsbF9jb21wYXRfYWNjZXNzaWJpbGl0eV9zZXJ2aWNlIiAvPgorICAgICAgICA8L3NlcnZpY2U+CisKKzwvYXBwbGljYXRpb24+CiAKIDwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uMi9yZXMvcmF3L2F1dG9tb3RpdmVfYW5kcm9pZF9tYW5pZmVzdC54bWwgYi90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uMi9yZXMvcmF3L2F1dG9tb3RpdmVfYW5kcm9pZF9tYW5pZmVzdC54bWwKaW5kZXggNGE2ODE4My4uOTc1Nzk2ZCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvcGVybWlzc2lvbjIvcmVzL3Jhdy9hdXRvbW90aXZlX2FuZHJvaWRfbWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL3Blcm1pc3Npb24yL3Jlcy9yYXcvYXV0b21vdGl2ZV9hbmRyb2lkX21hbmlmZXN0LnhtbApAQCAtMjMsMzUgKzIzLDc0IEBACiAgICAgPG9yaWdpbmFsLXBhY2thZ2UgYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5jYXIiIC8+CiAKICAgICA8cGVybWlzc2lvbi1ncm91cAotICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuY2FyLnBlcm1pc3Npb24tZ3JvdXAuQ0FSX0lORk9STUFUSU9OIgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuY2FyLnBlcm1pc3Npb24tZ3JvdXAuQ0FSX01PTklUT1JJTkciCiAgICAgICAgIGFuZHJvaWQ6aWNvbj0iQGRyYXdhYmxlL2Nhcl9pY19tb2RlIgogICAgICAgICBhbmRyb2lkOmRlc2NyaXB0aW9uPSJAc3RyaW5nL2Nhcl9wZXJtaXNzaW9uX2Rlc2MiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvY2FyX3Blcm1pc3Npb25fbGFiZWwiIC8+CiAgICAgPHBlcm1pc3Npb24KLSAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmNhci5wZXJtaXNzaW9uLkNBUl9DQUJJTiIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmNhci5wZXJtaXNzaW9uLkFESlVTVF9DQVJfQ0FCSU4iCiAgICAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJzeXN0ZW18c2lnbmF0dXJlIgogICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2Nhcl9wZXJtaXNzaW9uX2xhYmVsX2NhYmluIgogICAgICAgICBhbmRyb2lkOmRlc2NyaXB0aW9uPSJAc3RyaW5nL2Nhcl9wZXJtaXNzaW9uX2Rlc2NfY2FiaW4iIC8+CiAgICAgPHBlcm1pc3Npb24KLSAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmNhci5wZXJtaXNzaW9uLkNBUl9DQU1FUkEiCi0gICAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJzeXN0ZW18c2lnbmF0dXJlIgotICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2Nhcl9wZXJtaXNzaW9uX2xhYmVsX2NhbWVyYSIKLSAgICAgICAgYW5kcm9pZDpkZXNjcmlwdGlvbj0iQHN0cmluZy9jYXJfcGVybWlzc2lvbl9kZXNjX2NhbWVyYSIgLz4KLSAgICA8cGVybWlzc2lvbgotICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuY2FyLnBlcm1pc3Npb24uQ0FSX0ZVRUwiCi0gICAgICAgIGFuZHJvaWQ6cGVybWlzc2lvbkdyb3VwPSJhbmRyb2lkLmNhci5wZXJtaXNzaW9uLWdyb3VwLkNBUl9JTkZPUk1BVElPTiIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmNhci5wZXJtaXNzaW9uLkNBUl9FTkVSR1kiCisgICAgICAgIGFuZHJvaWQ6cGVybWlzc2lvbkdyb3VwPSJhbmRyb2lkLmNhci5wZXJtaXNzaW9uLWdyb3VwLkNBUl9NT05JVE9SSU5HIgogICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0iZGFuZ2Vyb3VzIgotICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2Nhcl9wZXJtaXNzaW9uX2xhYmVsX2Z1ZWwiCi0gICAgICAgIGFuZHJvaWQ6ZGVzY3JpcHRpb249IkBzdHJpbmcvY2FyX3Blcm1pc3Npb25fZGVzY19mdWVsIiAvPgorICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2Nhcl9wZXJtaXNzaW9uX2xhYmVsX2VuZXJneSIKKyAgICAgICAgYW5kcm9pZDpkZXNjcmlwdGlvbj0iQHN0cmluZy9jYXJfcGVybWlzc2lvbl9kZXNjX2VuZXJneSIgLz4KICAgICA8cGVybWlzc2lvbgotICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuY2FyLnBlcm1pc3Npb24uQ0FSX0hWQUMiCisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5jYXIucGVybWlzc2lvbi5DQVJfRVhURVJJT1JfRU5WSVJPTk1FTlQiCisgICAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJub3JtYWwiCisgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvY2FyX3Blcm1pc3Npb25fbGFiZWxfY2FyX2V4dGVyaW9yX2Vudmlyb25tZW50IgorICAgICAgICBhbmRyb2lkOmRlc2NyaXB0aW9uPSJAc3RyaW5nL2Nhcl9wZXJtaXNzaW9uX2Rlc2NfY2FyX2V4dGVyaW9yX2Vudmlyb25tZW50IiAvPgorICAgIDxwZXJtaXNzaW9uCisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5jYXIucGVybWlzc2lvbi5DQVJfRU5FUkdZX1BPUlRTIgorICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ibm9ybWFsIgorICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2Nhcl9wZXJtaXNzaW9uX2xhYmVsX2Nhcl9lbmVyZ3lfcG9ydHMiCisgICAgICAgIGFuZHJvaWQ6ZGVzY3JpcHRpb249IkBzdHJpbmcvY2FyX3Blcm1pc3Npb25fZGVzY19jYXJfZW5lcmd5X3BvcnRzIiAvPgorICAgIDxwZXJtaXNzaW9uCisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5jYXIucGVybWlzc2lvbi5DQVJfUE9XRVJUUkFJTiIKKyAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9Im5vcm1hbCIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9jYXJfcGVybWlzc2lvbl9sYWJlbF9jYXJfcG93ZXJ0cmFpbiIKKyAgICAgICAgYW5kcm9pZDpkZXNjcmlwdGlvbj0iQHN0cmluZy9jYXJfcGVybWlzc2lvbl9kZXNjX2Nhcl9wb3dlcnRyYWluIiAvPgorICAgIDxwZXJtaXNzaW9uCisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5jYXIucGVybWlzc2lvbi5DQVJfRVhURVJJT1JfTElHSFRTIgorICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic3lzdGVtfHNpZ25hdHVyZSIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9jYXJfcGVybWlzc2lvbl9sYWJlbF9jYXJfZXh0ZXJpb3JfbGlnaHRzIgorICAgICAgICBhbmRyb2lkOmRlc2NyaXB0aW9uPSJAc3RyaW5nL2Nhcl9wZXJtaXNzaW9uX2Rlc2NfY2FyX2V4dGVyaW9yX2xpZ2h0cyIgLz4KKyAgICA8cGVybWlzc2lvbgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuY2FyLnBlcm1pc3Npb24uQ09OVFJPTF9DQVJfRVhURVJJT1JfTElHSFRTIgorICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic3lzdGVtfHNpZ25hdHVyZSIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9jYXJfcGVybWlzc2lvbl9sYWJlbF9jb250cm9sX2Nhcl9leHRlcmlvcl9saWdodHMiCisgICAgICAgIGFuZHJvaWQ6ZGVzY3JpcHRpb249IkBzdHJpbmcvY2FyX3Blcm1pc3Npb25fZGVzY19jb250cm9sX2Nhcl9leHRlcmlvcl9saWdodHMiIC8+CisgICAgPHBlcm1pc3Npb24KKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmNhci5wZXJtaXNzaW9uLkNPTlRST0xfQ0FSX0NMSU1BVEUiCiAgICAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJzeXN0ZW18c2lnbmF0dXJlIgogICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2Nhcl9wZXJtaXNzaW9uX2xhYmVsX2h2YWMiCiAgICAgICAgIGFuZHJvaWQ6ZGVzY3JpcHRpb249IkBzdHJpbmcvY2FyX3Blcm1pc3Npb25fZGVzY19odmFjIiAvPgogICAgIDxwZXJtaXNzaW9uCisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5jYXIucGVybWlzc2lvbi5DT05UUk9MX0NBUl9ET09SUyIKKyAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9InN5c3RlbXxzaWduYXR1cmUiCisgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvY2FyX3Blcm1pc3Npb25fbGFiZWxfY29udHJvbF9jYXJfZG9vcnMiCisgICAgICAgIGFuZHJvaWQ6ZGVzY3JpcHRpb249IkBzdHJpbmcvY2FyX3Blcm1pc3Npb25fZGVzY19jb250cm9sX2Nhcl9kb29ycyIgLz4KKyAgICA8cGVybWlzc2lvbgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuY2FyLnBlcm1pc3Npb24uQ09OVFJPTF9DQVJfV0lORE9XUyIKKyAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9InN5c3RlbXxzaWduYXR1cmUiCisgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvY2FyX3Blcm1pc3Npb25fbGFiZWxfY29udHJvbF9jYXJfd2luZG93cyIKKyAgICAgICAgYW5kcm9pZDpkZXNjcmlwdGlvbj0iQHN0cmluZy9jYXJfcGVybWlzc2lvbl9kZXNjX2NvbnRyb2xfY2FyX3dpbmRvd3MiIC8+CisgICAgPHBlcm1pc3Npb24KKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmNhci5wZXJtaXNzaW9uLkNPTlRST0xfQ0FSX01JUlJPUlMiCisgICAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJzeXN0ZW18c2lnbmF0dXJlIgorICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2Nhcl9wZXJtaXNzaW9uX2xhYmVsX2NvbnRyb2xfY2FyX21pcnJvcnMiCisgICAgICAgIGFuZHJvaWQ6ZGVzY3JpcHRpb249IkBzdHJpbmcvY2FyX3Blcm1pc3Npb25fZGVzY19jb250cm9sX2Nhcl9taXJyb3JzIiAvPgorICAgIDxwZXJtaXNzaW9uCisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5jYXIucGVybWlzc2lvbi5DT05UUk9MX0NBUl9TRUFUUyIKKyAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9InN5c3RlbXxzaWduYXR1cmUiCisgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvY2FyX3Blcm1pc3Npb25fbGFiZWxfY29udHJvbF9jYXJfc2VhdHMiCisgICAgICAgIGFuZHJvaWQ6ZGVzY3JpcHRpb249IkBzdHJpbmcvY2FyX3Blcm1pc3Npb25fZGVzY19jb250cm9sX2Nhcl9zZWF0cyIgLz4KKyAgICA8cGVybWlzc2lvbgogICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuY2FyLnBlcm1pc3Npb24uQ0FSX01JTEVBR0UiCi0gICAgICAgIGFuZHJvaWQ6cGVybWlzc2lvbkdyb3VwPSJhbmRyb2lkLmNhci5wZXJtaXNzaW9uLWdyb3VwLkNBUl9JTkZPUk1BVElPTiIKLSAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9ImRhbmdlcm91cyIKKyAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9InN5c3RlbXxzaWduYXR1cmUiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvY2FyX3Blcm1pc3Npb25fbGFiZWxfbWlsZWFnZSIKICAgICAgICAgYW5kcm9pZDpkZXNjcmlwdGlvbj0iQHN0cmluZy9jYXJfcGVybWlzc2lvbl9kZXNjX21pbGVhZ2UiIC8+CiAgICAgPHBlcm1pc3Npb24KQEAgLTYxLDkgKzEwMCwyOCBAQAogICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2Nhcl9wZXJtaXNzaW9uX2xhYmVsX3NwZWVkIgogICAgICAgICBhbmRyb2lkOmRlc2NyaXB0aW9uPSJAc3RyaW5nL2Nhcl9wZXJtaXNzaW9uX2Rlc2Nfc3BlZWQiIC8+CiAgICAgPHBlcm1pc3Npb24KLSAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmNhci5wZXJtaXNzaW9uLlZFSElDTEVfRFlOQU1JQ1NfU1RBVEUiCi0gICAgICAgIGFuZHJvaWQ6cGVybWlzc2lvbkdyb3VwPSJhbmRyb2lkLmNhci5wZXJtaXNzaW9uLWdyb3VwLkNBUl9JTkZPUk1BVElPTiIKLSAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9ImRhbmdlcm91cyIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmNhci5wZXJtaXNzaW9uLkNBUl9FTkdJTkVfREVUQUlMRUQiCisgICAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJzeXN0ZW18c2lnbmF0dXJlIgorICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2Nhcl9wZXJtaXNzaW9uX2xhYmVsX2Nhcl9lbmdpbmVfZGV0YWlsZWQiCisgICAgICAgIGFuZHJvaWQ6ZGVzY3JpcHRpb249IkBzdHJpbmcvY2FyX3Blcm1pc3Npb25fZGVzY19jYXJfZW5naW5lX2RldGFpbGVkIiAvPgorICAgIDxwZXJtaXNzaW9uCisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5jYXIucGVybWlzc2lvbi5DQVJfVElSRVMiCisgICAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJzeXN0ZW18c2lnbmF0dXJlIgorICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2Nhcl9wZXJtaXNzaW9uX2xhYmVsX2Nhcl90aXJlcyIKKyAgICAgICAgYW5kcm9pZDpkZXNjcmlwdGlvbj0iQHN0cmluZy9jYXJfcGVybWlzc2lvbl9kZXNjX2Nhcl90aXJlcyIgLz4KKyAgICA8cGVybWlzc2lvbgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuY2FyLnBlcm1pc3Npb24uQ0FSX0lERU5USUZJQ0FUSU9OIgorICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic3lzdGVtfHNpZ25hdHVyZSIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9jYXJfcGVybWlzc2lvbl9sYWJlbF9jYXJfaWRlbnRpZmljYXRpb24iCisgICAgICAgIGFuZHJvaWQ6ZGVzY3JpcHRpb249IkBzdHJpbmcvY2FyX3Blcm1pc3Npb25fZGVzY19jYXJfaWRlbnRpZmljYXRpb24iIC8+CisgICAgPHBlcm1pc3Npb24KKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmNhci5wZXJtaXNzaW9uLkNBUl9JTkZPIgorICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ibm9ybWFsIgorICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2Nhcl9wZXJtaXNzaW9uX2xhYmVsX2Nhcl9pbmZvIgorICAgICAgICBhbmRyb2lkOmRlc2NyaXB0aW9uPSJAc3RyaW5nL2Nhcl9wZXJtaXNzaW9uX2Rlc2NfY2FyX2luZm8iIC8+CisgICAgPHBlcm1pc3Npb24KKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmNhci5wZXJtaXNzaW9uLkNBUl9EWU5BTUlDU19TVEFURSIKKyAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9InN5c3RlbXxzaWduYXR1cmUiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvY2FyX3Blcm1pc3Npb25fbGFiZWxfdmVoaWNsZV9keW5hbWljc19zdGF0ZSIKICAgICAgICAgYW5kcm9pZDpkZXNjcmlwdGlvbj0iQHN0cmluZy9jYXJfcGVybWlzc2lvbl9kZXNjX3ZlaGljbGVfZHluYW1pY3Nfc3RhdGUiIC8+CiAgICAgPHBlcm1pc3Npb24KQEAgLTcyLDExICsxMzAsNiBAQAogICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2Nhcl9wZXJtaXNzaW9uX2xhYmVsX3ZlbmRvcl9leHRlbnNpb24iCiAgICAgICAgIGFuZHJvaWQ6ZGVzY3JpcHRpb249IkBzdHJpbmcvY2FyX3Blcm1pc3Npb25fZGVzY192ZW5kb3JfZXh0ZW5zaW9uIiAvPgogICAgIDxwZXJtaXNzaW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5jYXIucGVybWlzc2lvbi5DQVJfUkFESU8iCi0gICAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJzeXN0ZW18c2lnbmF0dXJlIgotICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2Nhcl9wZXJtaXNzaW9uX2xhYmVsX3JhZGlvIgotICAgICAgICBhbmRyb2lkOmRlc2NyaXB0aW9uPSJAc3RyaW5nL2Nhcl9wZXJtaXNzaW9uX2Rlc2NfcmFkaW8iIC8+Ci0gICAgPHBlcm1pc3Npb24KICAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmNhci5wZXJtaXNzaW9uLkNBUl9QUk9KRUNUSU9OIgogICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic3lzdGVtfHNpZ25hdHVyZSIKICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9jYXJfcGVybWlzc2lvbl9sYWJlbF9wcm9qZWN0aW9uIgpAQCAtOTIsMTUgKzE0NSwxNSBAQAogICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2Nhcl9wZXJtaXNzaW9uX2Nhcl9uYXZpZ2F0aW9uX21hbmFnZXIiCiAgICAgICAgIGFuZHJvaWQ6ZGVzY3JpcHRpb249IkBzdHJpbmcvY2FyX3Blcm1pc3Npb25fZGVzY19jYXJfbmF2aWdhdGlvbl9tYW5hZ2VyIiAvPgogICAgIDxwZXJtaXNzaW9uCi0gICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuY2FyLnBlcm1pc3Npb24uRElBR05PU1RJQ19SRUFEX0FMTCIKLSAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJzeXN0ZW18c2lnbmF0dXJlIgotICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9jYXJfcGVybWlzc2lvbl9sYWJlbF9kaWFnX3JlYWQiCi0gICAgICBhbmRyb2lkOmRlc2NyaXB0aW9uPSJAc3RyaW5nL2Nhcl9wZXJtaXNzaW9uX2Rlc2NfZGlhZ19yZWFkIiAvPgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuY2FyLnBlcm1pc3Npb24uQ0FSX0RJQUdOT1NUSUNTIgorICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic3lzdGVtfHNpZ25hdHVyZSIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9jYXJfcGVybWlzc2lvbl9sYWJlbF9kaWFnX3JlYWQiCisgICAgICAgIGFuZHJvaWQ6ZGVzY3JpcHRpb249IkBzdHJpbmcvY2FyX3Blcm1pc3Npb25fZGVzY19kaWFnX3JlYWQiIC8+CiAgICAgPHBlcm1pc3Npb24KLSAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5jYXIucGVybWlzc2lvbi5ESUFHTk9TVElDX0NMRUFSIgotICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9InN5c3RlbXxzaWduYXR1cmUiCi0gICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2Nhcl9wZXJtaXNzaW9uX2xhYmVsX2RpYWdfY2xlYXIiCi0gICAgICBhbmRyb2lkOmRlc2NyaXB0aW9uPSJAc3RyaW5nL2Nhcl9wZXJtaXNzaW9uX2Rlc2NfZGlhZ19jbGVhciIgLz4KKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmNhci5wZXJtaXNzaW9uLkNMRUFSX0NBUl9ESUFHTk9TVElDUyIKKyAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9InN5c3RlbXxzaWduYXR1cmUiCisgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvY2FyX3Blcm1pc3Npb25fbGFiZWxfZGlhZ19jbGVhciIKKyAgICAgICAgYW5kcm9pZDpkZXNjcmlwdGlvbj0iQHN0cmluZy9jYXJfcGVybWlzc2lvbl9kZXNjX2RpYWdfY2xlYXIiIC8+CiAgICAgPHBlcm1pc3Npb24KICAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmNhci5wZXJtaXNzaW9uLlZNU19QVUJMSVNIRVIiCiAgICAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJzeXN0ZW18c2lnbmF0dXJlIgpAQCAtMTExLDcgKzE2NCwxMSBAQAogICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic3lzdGVtfHNpZ25hdHVyZSIKICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9jYXJfcGVybWlzc2lvbl9sYWJlbF92bXNfc3Vic2NyaWJlciIKICAgICAgICAgYW5kcm9pZDpkZXNjcmlwdGlvbj0iQHN0cmluZy9jYXJfcGVybWlzc2lvbl9kZXNjX3Ztc19zdWJzY3JpYmVyIiAvPgotCisgICAgPHBlcm1pc3Npb24KKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmNhci5wZXJtaXNzaW9uLkNBUl9EUklWSU5HX1NUQVRFIgorICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic3lzdGVtfHNpZ25hdHVyZSIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9jYXJfcGVybWlzc2lvbl9sYWJlbF9kcml2aW5nX3N0YXRlIgorICAgICAgICBhbmRyb2lkOmRlc2NyaXB0aW9uPSJAc3RyaW5nL2Nhcl9wZXJtaXNzaW9uX2Rlc2NfZHJpdmluZ19zdGF0ZSIgLz4KICAgICA8IS0tICBtYXkgcmVwbGFjZSB0aGlzIHdpdGggc3lzdGVtIHBlcm1pc3Npb24gaWYgcHJvcGVyIG9uZSBpcyBkZWZpbmVkLiAtLT4KICAgICA8cGVybWlzc2lvbgogICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuY2FyLnBlcm1pc3Npb24uQ09OVFJPTF9BUFBfQkxPQ0tJTkciCkBAIC0xNzcsMTUgKzIzNCwxNiBAQAogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uV1JJVEVfU0VDVVJFX1NFVFRJTkdTIiAvPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQkxVRVRPT1RIIiAvPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uTUFOQUdFX1VTRVJTIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uTE9DQVRJT05fSEFSRFdBUkUiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5BQ0NFU1NfRklORV9MT0NBVElPTiIgLz4KIAogICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJDYXIgc2VydmljZSIKICAgICAgICAgICAgICAgICAgYW5kcm9pZDpkaXJlY3RCb290QXdhcmU9InRydWUiCiAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6YWxsb3dCYWNrdXA9ImZhbHNlIgogICAgICAgICAgICAgICAgICBhbmRyb2lkOnBlcnNpc3RlbnQ9InRydWUiPgogCi0gICAgICAgCiAgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgotIDxzZXJ2aWNlIGFuZHJvaWQ6bmFtZT0iLkNhclNlcnZpY2UiCisgICAgICAgIDxzZXJ2aWNlIGFuZHJvaWQ6bmFtZT0iLkNhclNlcnZpY2UiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVVc2VyPSJ0cnVlIj4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmNhci5JQ2FyIiAvPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcGVybWlzc2lvbjIvc3JjL2FuZHJvaWQvcGVybWlzc2lvbjIvY3RzL0NvbnRhY3RzUHJvdmlkZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uMi9zcmMvYW5kcm9pZC9wZXJtaXNzaW9uMi9jdHMvQ29udGFjdHNQcm92aWRlclRlc3QuamF2YQppbmRleCA1YTA0MDc5Li5kYzI5MjM0IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uMi9zcmMvYW5kcm9pZC9wZXJtaXNzaW9uMi9jdHMvQ29udGFjdHNQcm92aWRlclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uMi9zcmMvYW5kcm9pZC9wZXJtaXNzaW9uMi9jdHMvQ29udGFjdHNQcm92aWRlclRlc3QuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogcGFja2FnZSBhbmRyb2lkLnBlcm1pc3Npb24yLmN0czsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3Q7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OwpAQCAtMjUsNiArMjYsNyBAQAogLyoqCiAgKiBWZXJpZnkgdGhhdCBkZXByZWNhdGVkIGNvbnRhY3RzIHBlcm1pc3Npb25zIGFyZSBub3QgZW5mb3JjZWQuCiAgKi8KK0BBcHBNb2RlRnVsbChyZWFzb24gPSAiSW5zdGFudCBhcHBzIGNhbm5vdCBnZXQgdGhlIFJFQURfQ09OVEFDVFMvV1JJVEVfQ09OVEFDVFMgcGVybWlzc2lvbnMiKQogcHVibGljIGNsYXNzIENvbnRhY3RzUHJvdmlkZXJUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcGVybWlzc2lvbjIvc3JjL2FuZHJvaWQvcGVybWlzc2lvbjIvY3RzL05vUHJvY2Vzc091dGdvaW5nQ2FsbFBlcm1pc3Npb25UZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uMi9zcmMvYW5kcm9pZC9wZXJtaXNzaW9uMi9jdHMvTm9Qcm9jZXNzT3V0Z29pbmdDYWxsUGVybWlzc2lvblRlc3QuamF2YQppbmRleCA5NTZmMWE2Li40MGQ3YzdlIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uMi9zcmMvYW5kcm9pZC9wZXJtaXNzaW9uMi9jdHMvTm9Qcm9jZXNzT3V0Z29pbmdDYWxsUGVybWlzc2lvblRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uMi9zcmMvYW5kcm9pZC9wZXJtaXNzaW9uMi9jdHMvTm9Qcm9jZXNzT3V0Z29pbmdDYWxsUGVybWlzc2lvblRlc3QuamF2YQpAQCAtMjMsNiArMjMsNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOwogaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLkxhcmdlVGVzdDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwpAQCAtNTEsNiArNTIsNyBAQAogICAgICAqICAge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNQUk9DRVNTX09VVEdPSU5HX0NBTEx9CiAgICAgICovCiAgICAgLy8gVE9ETzogYWRkIGJhY2sgdG8gTGFyZ2VUZXN0IHdoZW4gdGVzdCBjYW4gY2FuY2VsIGluaXRpYXRlZCBjYWxsCisgICAgQEFwcE1vZGVGdWxsKHJlYXNvbiA9ICJJbnN0YW50IGFwcHMgY2Fubm90IHN0YXJ0IHRoZSBBQ1RJT05fQ0FMTCBhY3Rpb24iKQogICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9jZXNzT3V0Z29pbmdDYWxsKCkgewogICAgICAgICBmaW5hbCBQYWNrYWdlTWFuYWdlciBwbSA9IGdldENvbnRleHQoKS5nZXRQYWNrYWdlTWFuYWdlcigpOwogICAgICAgICBpZiAoIXBtLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9URUxFUEhPTlkpIHx8CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uMi9zcmMvYW5kcm9pZC9wZXJtaXNzaW9uMi9jdHMvTm9SZWNlaXZlU21zUGVybWlzc2lvblRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3Blcm1pc3Npb24yL3NyYy9hbmRyb2lkL3Blcm1pc3Npb24yL2N0cy9Ob1JlY2VpdmVTbXNQZXJtaXNzaW9uVGVzdC5qYXZhCmluZGV4IDU2OTlkODguLjQxNzFjMWIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3Blcm1pc3Npb24yL3NyYy9hbmRyb2lkL3Blcm1pc3Npb24yL2N0cy9Ob1JlY2VpdmVTbXNQZXJtaXNzaW9uVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3Blcm1pc3Npb24yL3NyYy9hbmRyb2lkL3Blcm1pc3Npb24yL2N0cy9Ob1JlY2VpdmVTbXNQZXJtaXNzaW9uVGVzdC5qYXZhCkBAIC0yMyw2ICsyMyw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuU21zTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5UZWxlcGhvbnlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CkBAIC0zMyw2ICszNCw3IEBACiAgKiBWZXJpZnkgU21zIGFuZCBNbXMgY2Fubm90IGJlIHJlY2VpdmVkIHdpdGhvdXQgcmVxdWlyZWQgcGVybWlzc2lvbnMuCiAgKiBVc2VzIHtAbGluayBhbmRyb2lkLnRlbGVwaG9ueS5TbXNNYW5hZ2VyfS4KICAqLworQEFwcE1vZGVGdWxsKHJlYXNvbiA9ICJJbnN0YW50IGFwcHMgY2Fubm90IGdldCB0aGUgU0VORF9TTVMgcGVybWlzc2lvbiIpCiBwdWJsaWMgY2xhc3MgTm9SZWNlaXZlU21zUGVybWlzc2lvblRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgewogCiAgICAgLy8gdGltZSB0byB3YWl0IGZvciBzbXMgdG8gZ2V0IGRlbGl2ZXJlZCAtIGN1cnJlbnRseSAyIG1pbnV0ZXMKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3Blcm1pc3Npb24yL3NyYy9hbmRyb2lkL3Blcm1pc3Npb24yL2N0cy9QZXJtaXNzaW9uTWF4U2RrVmVyc2lvblRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3Blcm1pc3Npb24yL3NyYy9hbmRyb2lkL3Blcm1pc3Npb24yL2N0cy9QZXJtaXNzaW9uTWF4U2RrVmVyc2lvblRlc3QuamF2YQppbmRleCBlNjAyNmU0Li5iMDJiMzJmIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uMi9zcmMvYW5kcm9pZC9wZXJtaXNzaW9uMi9jdHMvUGVybWlzc2lvbk1heFNka1ZlcnNpb25UZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvcGVybWlzc2lvbjIvc3JjL2FuZHJvaWQvcGVybWlzc2lvbjIvY3RzL1Blcm1pc3Npb25NYXhTZGtWZXJzaW9uVGVzdC5qYXZhCkBAIC0yNyw4ICsyNyw4IEBACiBwdWJsaWMgY2xhc3MgUGVybWlzc2lvbk1heFNka1ZlcnNpb25UZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKICAgICAvLyBUaGVzZSB0d28gcGVybWlzc2lvbiBuYW1lcyBtdXN0IG1hdGNoIHRoZSBjb3JyZXNwb25kaW5nIDx1c2VzLXBlcm1pc3Npb24+CiAgICAgLy8gZGVjbGFyYXRpb25zIGluIHRoZSB0ZXN0IGFwcCBtYW5pZmVzdC4KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFVOR1JBTlRBQkxFX1BFUk1JU1NJT04gPSAiYW5kcm9pZC5wZXJtaXNzaW9uLlZJQlJBVEUiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JBTlRBQkxFX1BFUk1JU1NJT04gPSAiYW5kcm9pZC5wZXJtaXNzaW9uLkZMQVNITElHSFQiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5HUkFOVEFCTEVfUEVSTUlTU0lPTiA9ICJhbmRyb2lkLnBlcm1pc3Npb24uSU5URVJORVQiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JBTlRBQkxFX1BFUk1JU1NJT04gPSAiYW5kcm9pZC5wZXJtaXNzaW9uLkFDQ0VTU19ORVRXT1JLX1NUQVRFIjsKIAogICAgIC8qKgogICAgICAqIFZlcmlmeSB0aGF0IHdpdGggYW5kcm9pZDptYXhTZGtWZXJzaW9uIHNldCB0byBhIHByZXZpb3VzIEFQSSBsZXZlbCwKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3Blcm1pc3Npb24yL3NyYy9hbmRyb2lkL3Blcm1pc3Npb24yL2N0cy9QZXJtaXNzaW9uUG9saWN5VGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvcGVybWlzc2lvbjIvc3JjL2FuZHJvaWQvcGVybWlzc2lvbjIvY3RzL1Blcm1pc3Npb25Qb2xpY3lUZXN0LmphdmEKaW5kZXggMTg1MmU5OS4uMjg4OGE3MSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvcGVybWlzc2lvbjIvc3JjL2FuZHJvaWQvcGVybWlzc2lvbjIvY3RzL1Blcm1pc3Npb25Qb2xpY3lUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvcGVybWlzc2lvbjIvc3JjL2FuZHJvaWQvcGVybWlzc2lvbjIvY3RzL1Blcm1pc3Npb25Qb2xpY3lUZXN0LmphdmEKQEAgLTI0LDYgKzI0LDcgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuTmFtZU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QZXJtaXNzaW9uR3JvdXBJbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QZXJtaXNzaW9uSW5mbzsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BcnJheU1hcDsKQEAgLTMxLDggKzMyLDYgQEAKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5YbWw7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNkZFRlc3Q7Ci0KIGltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyOwogCiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKQEAgLTQ3LDYgKzQ2LDcgQEAKIC8qKgogICogVGVzdHMgZm9yIHBlcm1pc3Npb24gcG9saWN5IG9uIHRoZSBwbGF0Zm9ybS4KICAqLworQEFwcE1vZGVGdWxsKHJlYXNvbiA9ICJJbnN0YW50IGFwcHMgY2Fubm90IHJlYWQgdGhlIHN5c3RlbSBzZXJ2ZXJzIHBlcm1pc3Npb24iKQogcHVibGljIGNsYXNzIFBlcm1pc3Npb25Qb2xpY3lUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBEYXRlIEhJREVfTk9OX1NZU1RFTV9PVkVSTEFZX1dJTkRPV1NfUEFUQ0hfREFURSA9IHBhcnNlRGF0ZSgiMjAxNy0xMS0wMSIpOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBISURFX05PTl9TWVNURU1fT1ZFUkxBWV9XSU5ET1dTX1BFUk1JU1NJT04KQEAgLTY2LDcgKzY2LDYgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9QRVJNSVNTSU9OX0dST1VQID0gInBlcm1pc3Npb25Hcm91cCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfUFJPVEVDVElPTl9MRVZFTCA9ICJwcm90ZWN0aW9uTGV2ZWwiOwogCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjkuMS9DLTAtMSIpCiAgICAgcHVibGljIHZvaWQgdGVzdFBsYXRmb3JtUGVybWlzc2lvblBvbGljeVVuYWx0ZXJlZCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBNYXA8U3RyaW5nLCBQZXJtaXNzaW9uSW5mbz4gZGVjbGFyZWRQZXJtaXNzaW9uc01hcCA9CiAgICAgICAgICAgICAgICAgZ2V0UGVybWlzc2lvbnNGb3JQYWNrYWdlKGdldENvbnRleHQoKSwgUExBVEZPUk1fUEFDS0FHRV9OQU1FKTsKQEAgLTEyMCwxMCArMTE5LDggQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gT0VNcyBjYW5ub3QgY2hhbmdlIHBlcm1pc3Npb24gcHJvdGVjdGlvbiBmbGFncwotICAgICAgICAgICAgZmluYWwgaW50IGV4cGVjdGVkUHJvdGVjdGlvbkZsYWdzID0gZXhwZWN0ZWRQZXJtaXNzaW9uLnByb3RlY3Rpb25MZXZlbAotICAgICAgICAgICAgICAgICAgICAmIFBlcm1pc3Npb25JbmZvLlBST1RFQ1RJT05fTUFTS19GTEFHUzsKLSAgICAgICAgICAgIGZpbmFsIGludCBkZWNsYXJlZFByb3RlY3Rpb25GbGFncyA9IGRlY2xhcmVkUGVybWlzc2lvbi5wcm90ZWN0aW9uTGV2ZWwKLSAgICAgICAgICAgICAgICAgICAgJiBQZXJtaXNzaW9uSW5mby5QUk9URUNUSU9OX01BU0tfRkxBR1M7CisgICAgICAgICAgICBmaW5hbCBpbnQgZXhwZWN0ZWRQcm90ZWN0aW9uRmxhZ3MgPSBleHBlY3RlZFBlcm1pc3Npb24uZ2V0UHJvdGVjdGlvbkZsYWdzKCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgZGVjbGFyZWRQcm90ZWN0aW9uRmxhZ3MgPSBkZWNsYXJlZFBlcm1pc3Npb24uZ2V0UHJvdGVjdGlvbkZsYWdzKCk7CiAgICAgICAgICAgICBpZiAoZXhwZWN0ZWRQcm90ZWN0aW9uRmxhZ3MgIT0gZGVjbGFyZWRQcm90ZWN0aW9uRmxhZ3MpIHsKICAgICAgICAgICAgICAgICBvZmZlbmRpbmdMaXN0LmFkZCgKICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCkBAIC0xMzcsNyArMTM0LDkgQEAKICAgICAgICAgICAgIGlmICgoZGVjbGFyZWRQZXJtaXNzaW9uLnByb3RlY3Rpb25MZXZlbCAmIFBlcm1pc3Npb25JbmZvLlBST1RFQ1RJT05fREFOR0VST1VTKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFleHBlY3RlZFBlcm1pc3Npb24uZ3JvdXAuZXF1YWxzKGRlY2xhcmVkUGVybWlzc2lvbi5ncm91cCkpIHsKICAgICAgICAgICAgICAgICAgICAgb2ZmZW5kaW5nTGlzdC5hZGQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBlcm1pc3Npb24gIiArIGV4cGVjdGVkUGVybWlzc2lvbk5hbWUgKyAiIG5vdCBpbiBjb3JyZWN0IGdyb3VwIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBlcm1pc3Npb24gIiArIGV4cGVjdGVkUGVybWlzc2lvbk5hbWUgKyAiIG5vdCBpbiBjb3JyZWN0IGdyb3VwICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIoZXhwZWN0ZWQ9IiArIGV4cGVjdGVkUGVybWlzc2lvbi5ncm91cCArICIgYWN0dWFsPSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZGVjbGFyZWRQZXJtaXNzaW9uLmdyb3VwKTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpZiAoIWRlY2xhcmVkR3JvdXBzU2V0LmNvbnRhaW5zKGRlY2xhcmVkUGVybWlzc2lvbi5ncm91cCkpIHsKQEAgLTE1MCw3ICsxNDksMTEgQEAKICAgICAgICAgLy8gT0VNcyBjYW5ub3QgZGVmaW5lIHBlcm1pc3Npb25zIGluIHRoZSBwbGF0Zm9ybSBuYW1lc3BhY2UKICAgICAgICAgZm9yIChTdHJpbmcgcGVybWlzc2lvbiA6IGRlY2xhcmVkUGVybWlzc2lvbnNNYXAua2V5U2V0KCkpIHsKICAgICAgICAgICAgIGlmIChwZXJtaXNzaW9uLnN0YXJ0c1dpdGgoUExBVEZPUk1fUk9PVF9OQU1FU1BBQ0UpKSB7Ci0gICAgICAgICAgICAgICAgb2ZmZW5kaW5nTGlzdC5hZGQoIkNhbm5vdCBkZWZpbmUgcGVybWlzc2lvbiBpbiBhbmRyb2lkIG5hbWVzcGFjZToiICsgcGVybWlzc2lvbik7CisgICAgICAgICAgICAgICAgZmluYWwgUGVybWlzc2lvbkluZm8gcGVybUluZm8gPSBkZWNsYXJlZFBlcm1pc3Npb25zTWFwLmdldChwZXJtaXNzaW9uKTsKKyAgICAgICAgICAgICAgICBvZmZlbmRpbmdMaXN0LmFkZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgZGVmaW5lIHBlcm1pc3Npb24gIiArIHBlcm1pc3Npb24KKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgcGFja2FnZSAiICsgcGVybUluZm8ucGFja2FnZU5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpbiBhbmRyb2lkIG5hbWVzcGFjZSIpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTE2MSwxMSArMTY0LDkgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKGRlY2xhcmVkR3JvdXAucGFja2FnZU5hbWUuZXF1YWxzKFBMQVRGT1JNX1BBQ0tBR0VfTkFNRSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBkZWNsYXJlZEdyb3VwLm5hbWUuc3RhcnRzV2l0aChQTEFURk9STV9ST09UX05BTUVTUEFDRSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG9mZmVuZGluZ0xpc3QuYWRkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGRlZmluZSBncm91cCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBkZWNsYXJlZEdyb3VwLm5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHBhY2thZ2UgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZGVjbGFyZWRHcm91cC5wYWNrYWdlTmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpbiBhbmRyb2lkIG5hbWVzcGFjZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGRlZmluZSBncm91cCAiICsgZGVjbGFyZWRHcm91cC5uYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgcGFja2FnZSAiICsgZGVjbGFyZWRHcm91cC5wYWNrYWdlTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaW4gYW5kcm9pZCBuYW1lc3BhY2UiKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTI1Nyw5ICsyNTgsMTUgQEAKICAgICAgICAgICAgICAgICBjYXNlICJwcml2aWxlZ2VkIjogewogICAgICAgICAgICAgICAgICAgICBwcm90ZWN0aW9uTGV2ZWwgfD0gUGVybWlzc2lvbkluZm8uUFJPVEVDVElPTl9GTEFHX1BSSVZJTEVHRUQ7CiAgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICJ2ZW5kb3JQcml2aWxlZ2VkIjogeworICAgICAgICAgICAgICAgICAgICBwcm90ZWN0aW9uTGV2ZWwgfD0gUGVybWlzc2lvbkluZm8uUFJPVEVDVElPTl9GTEFHX1ZFTkRPUl9QUklWSUxFR0VEOworICAgICAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAic2V0dXAiOiB7CiAgICAgICAgICAgICAgICAgICAgIHByb3RlY3Rpb25MZXZlbCB8PSBQZXJtaXNzaW9uSW5mby5QUk9URUNUSU9OX0ZMQUdfU0VUVVA7CiAgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICJ0ZXh0Q2xhc3NpZmllciI6IHsKKyAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGlvbkxldmVsIHw9IFBlcm1pc3Npb25JbmZvLlBST1RFQ1RJT05fRkxBR19TWVNURU1fVEVYVF9DTEFTU0lGSUVSOworICAgICAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAiaW5zdGFudCI6IHsKICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGlvbkxldmVsIHw9IFBlcm1pc3Npb25JbmZvLlBST1RFQ1RJT05fRkxBR19JTlNUQU5UOwogICAgICAgICAgICAgICAgIH0gYnJlYWs7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uMi9zcmMvYW5kcm9pZC9wZXJtaXNzaW9uMi9jdHMvUHJpdmFwcFBlcm1pc3Npb25zVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvcGVybWlzc2lvbjIvc3JjL2FuZHJvaWQvcGVybWlzc2lvbjIvY3RzL1ByaXZhcHBQZXJtaXNzaW9uc1Rlc3QuamF2YQppbmRleCA0NDQzNmU5Li42MTc5NzY4IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9wZXJtaXNzaW9uMi9zcmMvYW5kcm9pZC9wZXJtaXNzaW9uMi9jdHMvUHJpdmFwcFBlcm1pc3Npb25zVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3Blcm1pc3Npb24yL3NyYy9hbmRyb2lkL3Blcm1pc3Npb24yL2N0cy9Qcml2YXBwUGVybWlzc2lvbnNUZXN0LmphdmEKQEAgLTE2LDI4ICsxNiw0MCBAQAogCiBwYWNrYWdlIGFuZHJvaWQucGVybWlzc2lvbjIuY3RzOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5TeXN0ZW1VdGlsOwotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ2RkVGVzdDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VJbmZvLlJFUVVFU1RFRF9QRVJNSVNTSU9OX0dSQU5URUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5HRVRfUEVSTUlTU0lPTlM7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5NQVRDSF9GQUNUT1JZX09OTFk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5NQVRDSF9VTklOU1RBTExFRF9QQUNLQUdFUzsKIAotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm87CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwcy5maWx0ZXJWYWx1ZXM7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0cy5kaWZmZXJlbmNlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHMuaW50ZXJzZWN0aW9uOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHMubmV3SGFzaFNldDsKKwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlSW5mbzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBlcm1pc3Npb25JbmZvOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwogaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXJyYXlNYXA7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlN5c3RlbVV0aWw7CisKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKIAotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuR0VUX1BFUk1JU1NJT05TOwotCiAvKioKICAqIFRlc3RzIGVuZm9yY2VtZW50IG9mIHNpZ25hdHVyZXxwcml2aWxlZ2VkIHBlcm1pc3Npb24gd2hpdGVsaXN0OgogICogPHVsPgpAQCAtNTIsNyArNjQsNiBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMQVRGT1JNX1BBQ0tBR0VfTkFNRSA9ICJhbmRyb2lkIjsKIAotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI5LjEvQy0wLTIiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RQcml2YXBwUGVybWlzc2lvbnNFbmZvcmNlbWVudCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBTZXQ8U3RyaW5nPiBwbGF0Zm9ybVByaXZQZXJtaXNzaW9ucyA9IG5ldyBIYXNoU2V0PD4oKTsKICAgICAgICAgUGFja2FnZU1hbmFnZXIgcG0gPSBnZXRDb250ZXh0KCkuZ2V0UGFja2FnZU1hbmFnZXIoKTsKQEAgLTY3LDYzICs3OCwxMjkgQEAKICAgICAgICAgfQogCiAgICAgICAgIExpc3Q8UGFja2FnZUluZm8+IGluc3RhbGxlZFBhY2thZ2VzID0gcG0KLSAgICAgICAgICAgICAgICAuZ2V0SW5zdGFsbGVkUGFja2FnZXMoUGFja2FnZU1hbmFnZXIuTUFUQ0hfVU5JTlNUQUxMRURfUEFDS0FHRVMgfCBHRVRfUEVSTUlTU0lPTlMpOworICAgICAgICAgICAgICAgIC5nZXRJbnN0YWxsZWRQYWNrYWdlcyhNQVRDSF9VTklOU1RBTExFRF9QQUNLQUdFUyB8IEdFVF9QRVJNSVNTSU9OUyk7CisgICAgICAgIGluc3RhbGxlZFBhY2thZ2VzLnNvcnQoQ29tcGFyYXRvci5jb21wYXJpbmcocCAtPiBwLnBhY2thZ2VOYW1lKSk7CiAKKyAgICAgICAgTWFwPFN0cmluZywgU2V0PFN0cmluZz4+IHBhY2thZ2VzR3JhbnRlZE5vdEluV2hpdGVsaXN0ID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBNYXA8U3RyaW5nLCBTZXQ8U3RyaW5nPj4gcGFja2FnZXNOb3RHcmFudGVkTm90UmVtb3ZlZE5vdEluRGVueWxpc3QgPSBuZXcgSGFzaE1hcDw+KCk7CiAgICAgICAgIGZvciAoUGFja2FnZUluZm8gcGtnIDogaW5zdGFsbGVkUGFja2FnZXMpIHsKLSAgICAgICAgICAgIFNldDxTdHJpbmc+IHJlcXVlc3RlZFByaXZQZXJtaXNzaW9ucyA9IG5ldyBUcmVlU2V0PD4oKTsKLSAgICAgICAgICAgIFNldDxTdHJpbmc+IGdyYW50ZWRQcml2UGVybWlzc2lvbnMgPSBuZXcgVHJlZVNldDw+KCk7Ci0gICAgICAgICAgICBTdHJpbmdbXSByZXF1ZXN0ZWRQZXJtaXNzaW9ucyA9IHBrZy5yZXF1ZXN0ZWRQZXJtaXNzaW9uczsKKyAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IHBrZy5wYWNrYWdlTmFtZTsKICAgICAgICAgICAgIGlmICghcGtnLmFwcGxpY2F0aW9uSW5mby5pc1ByaXZpbGVnZWRBcHAoKQotICAgICAgICAgICAgICAgICAgICB8fCBQTEFURk9STV9QQUNLQUdFX05BTUUuZXF1YWxzKHBrZy5wYWNrYWdlTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgfHwgUExBVEZPUk1fUEFDS0FHRV9OQU1FLmVxdWFscyhwYWNrYWdlTmFtZSkpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZXF1ZXN0ZWRQZXJtaXNzaW9ucyA9PSBudWxsIHx8IHJlcXVlc3RlZFBlcm1pc3Npb25zLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIFBhY2thZ2VJbmZvIGZhY3RvcnlQa2cgPSBwbQorICAgICAgICAgICAgICAgICAgICAuZ2V0UGFja2FnZUluZm8ocGFja2FnZU5hbWUsIE1BVENIX0ZBQ1RPUllfT05MWSB8IEdFVF9QRVJNSVNTSU9OUworICAgICAgICAgICAgICAgICAgICAgICAgfCBNQVRDSF9VTklOU1RBTExFRF9QQUNLQUdFUyk7CisKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIk5vIHN5c3RlbSBpbWFnZSB2ZXJzaW9uIGZvdW5kIGZvciAiICsgcGFja2FnZU5hbWUsIGZhY3RvcnlQa2cpOworCisgICAgICAgICAgICBTZXQ8U3RyaW5nPiBmYWN0b3J5UmVxdWVzdGVkUHJpdlBlcm1pc3Npb25zOworICAgICAgICAgICAgaWYgKGZhY3RvcnlQa2cucmVxdWVzdGVkUGVybWlzc2lvbnMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZhY3RvcnlSZXF1ZXN0ZWRQcml2UGVybWlzc2lvbnMgPSBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmYWN0b3J5UmVxdWVzdGVkUHJpdlBlcm1pc3Npb25zID0gaW50ZXJzZWN0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3SGFzaFNldChmYWN0b3J5UGtnLnJlcXVlc3RlZFBlcm1pc3Npb25zKSwgcGxhdGZvcm1Qcml2UGVybWlzc2lvbnMpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gQ29sbGVjdCAyIHNldHM6IHJlcXVlc3RlZFBlcm1pc3Npb25zIGFuZCBncmFudGVkUHJpdlBlcm1pc3Npb25zCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcXVlc3RlZFBlcm1pc3Npb25zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBlcm1pc3Npb24gPSByZXF1ZXN0ZWRQZXJtaXNzaW9uc1tpXTsKLSAgICAgICAgICAgICAgICBpZiAocGxhdGZvcm1Qcml2UGVybWlzc2lvbnMuY29udGFpbnMocGVybWlzc2lvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkUHJpdlBlcm1pc3Npb25zLmFkZChwZXJtaXNzaW9uKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChwa2cucmVxdWVzdGVkUGVybWlzc2lvbnNGbGFnc1tpXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgUGFja2FnZUluZm8uUkVRVUVTVEVEX1BFUk1JU1NJT05fR1JBTlRFRCkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbnRlZFByaXZQZXJtaXNzaW9ucy5hZGQocGVybWlzc2lvbik7CisKKyAgICAgICAgICAgIE1hcDxTdHJpbmcsIEJvb2xlYW4+IHJlcXVlc3RlZFByaXZQZXJtaXNzaW9ucyA9IG5ldyBBcnJheU1hcDw+KCk7CisgICAgICAgICAgICBpZiAocGtnLnJlcXVlc3RlZFBlcm1pc3Npb25zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBrZy5yZXF1ZXN0ZWRQZXJtaXNzaW9ucy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGVybWlzc2lvbiA9IHBrZy5yZXF1ZXN0ZWRQZXJtaXNzaW9uc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBsYXRmb3JtUHJpdlBlcm1pc3Npb25zLmNvbnRhaW5zKHBlcm1pc3Npb24pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRQcml2UGVybWlzc2lvbnMucHV0KHBlcm1pc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwa2cucmVxdWVzdGVkUGVybWlzc2lvbnNGbGFnc1tpXSAmIFJFUVVFU1RFRF9QRVJNSVNTSU9OX0dSQU5URUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gMCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisKICAgICAgICAgICAgIC8vIElmIGFuIGFwcCBpcyByZXF1ZXN0aW5nIGFueSBwcml2aWxlZ2VkIHBlcm1pc3Npb25zLCBsb2cgdGhlIGRldGFpbHMgYW5kIHZlcmlmeQogICAgICAgICAgICAgLy8gdGhhdCBncmFudGVkIHBlcm1pc3Npb25zIGFyZSB3aGl0ZWxpc3RlZAotICAgICAgICAgICAgaWYgKCFyZXF1ZXN0ZWRQcml2UGVybWlzc2lvbnMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgU2V0PFN0cmluZz4gbm90R3JhbnRlZCA9IG5ldyBUcmVlU2V0PD4ocmVxdWVzdGVkUHJpdlBlcm1pc3Npb25zKTsKLSAgICAgICAgICAgICAgICBub3RHcmFudGVkLnJlbW92ZUFsbChncmFudGVkUHJpdlBlcm1pc3Npb25zKTsKLSAgICAgICAgICAgICAgICBTZXQ8U3RyaW5nPiB3aGl0ZWxpc3QgPSBnZXRQcml2QXBwUGVybWlzc2lvbnMocGtnLnBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgICAgICBTZXQ8U3RyaW5nPiBkZW55bGlzdCA9IGdldFByaXZBcHBEZW55UGVybWlzc2lvbnMocGtnLnBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJBcHBsaWNhdGlvbiAiICsgcGtnLnBhY2thZ2VOYW1lICsgIi4iCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgUmVxdWVzdGVkIHBlcm1pc3Npb25zOiAiICsgcmVxdWVzdGVkUHJpdlBlcm1pc3Npb25zICsgIi4iCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgR3JhbnRlZCBwZXJtaXNzaW9uczogIiArIGdyYW50ZWRQcml2UGVybWlzc2lvbnMgKyAiLiIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiBOb3QgZ3JhbnRlZDogIiArIG5vdEdyYW50ZWQgKyAiLiIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiBXaGl0ZWxpc3RlZDogIiArIHdoaXRlbGlzdCArICIuIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIERlbnlsaXN0ZWQ6ICIgKyBkZW55bGlzdCk7Ci0gICAgICAgICAgICAgICAgaWYgKChwa2cuYXBwbGljYXRpb25JbmZvLmZsYWdzICYgQXBwbGljYXRpb25JbmZvLkZMQUdfVVBEQVRFRF9TWVNURU1fQVBQKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIlNraXBwaW5nIHdoaXRlbGlzdCBjaGVja3MgZm9yICIgKyBwa2cucGFja2FnZU5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgLSBhcHBsaWNhdGlvbiB3YXMgdXBkYXRlZCIpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmICghZmFjdG9yeVJlcXVlc3RlZFByaXZQZXJtaXNzaW9ucy5pc0VtcHR5KCkgJiYgIXJlcXVlc3RlZFByaXZQZXJtaXNzaW9ucy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBTZXQ8U3RyaW5nPiBncmFudGVkID0gZmlsdGVyVmFsdWVzKHJlcXVlc3RlZFByaXZQZXJtaXNzaW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzR3JhbnRlZCAtPiBpc0dyYW50ZWQpLmtleVNldCgpOworCisgICAgICAgICAgICAgICAgU2V0PFN0cmluZz4gZmFjdG9yeU5vdEdyYW50ZWQgPSBkaWZmZXJlbmNlKGZhY3RvcnlSZXF1ZXN0ZWRQcml2UGVybWlzc2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICBncmFudGVkKTsKKworICAgICAgICAgICAgICAgIC8vIHByaXYgcGVybWlzc2lvbnMgdGhhdCB0aGUgc3lzdGVtIHBhY2thZ2UgcmVxdWVzdGVkLCBidXQgdGhlIGN1cnJlbnQgcGFja2FnZSBub3QKKyAgICAgICAgICAgICAgICAvLyBhbnltb3JlCisgICAgICAgICAgICAgICAgU2V0PFN0cmluZz4gcmVtb3ZlZCA9IGRpZmZlcmVuY2UoZmFjdG9yeVJlcXVlc3RlZFByaXZQZXJtaXNzaW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZFByaXZQZXJtaXNzaW9ucy5rZXlTZXQoKSk7CisKKyAgICAgICAgICAgICAgICBTZXQ8U3RyaW5nPiB3aGl0ZWxpc3QgPSBnZXRQcml2QXBwUGVybWlzc2lvbnMocGFja2FnZU5hbWUpOworICAgICAgICAgICAgICAgIFNldDxTdHJpbmc+IGRlbnlsaXN0ID0gZ2V0UHJpdkFwcERlbnlQZXJtaXNzaW9ucyhwYWNrYWdlTmFtZSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJBcHBsaWNhdGlvbiAiICsgcGFja2FnZU5hbWUgKyAiXG4iCisgICAgICAgICAgICAgICAgICAgICAgICArICIgIEZhY3RvcnkgcmVxdWVzdGVkIHBlcm1pc3Npb25zOlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBnZXRQcmludGFibGVTZXQoIiAgICAiLCBmYWN0b3J5UmVxdWVzdGVkUHJpdlBlcm1pc3Npb25zKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiICBHcmFudGVkOlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBnZXRQcmludGFibGVTZXQoIiAgICAiLCBncmFudGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiICBSZW1vdmVkOlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBnZXRQcmludGFibGVTZXQoIiAgICAiLCByZW1vdmVkKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiICBXaGl0ZWxpc3RlZDpcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0UHJpbnRhYmxlU2V0KCIgICAgIiwgd2hpdGVsaXN0KQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiICBEZW55bGlzdGVkOlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBnZXRQcmludGFibGVTZXQoIiAgICAiLCBkZW55bGlzdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiAgRmFjdG9yeSBub3QgZ3JhbnRlZDpcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0UHJpbnRhYmxlU2V0KCIgICAgIiwgZmFjdG9yeU5vdEdyYW50ZWQpOworCisgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgbGluZSA6IG1zZy5zcGxpdCgiXG4iKSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsIGxpbmUpOworCisgICAgICAgICAgICAgICAgICAgIC8vIFByZXZlbnQgbG9nIGZyb20gdHJ1bmNhdGluZyBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwKTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBTZXQ8U3RyaW5nPiBncmFudGVkTm90SW5XaGl0ZWxpc3QgPSBuZXcgVHJlZVNldDw+KGdyYW50ZWRQcml2UGVybWlzc2lvbnMpOwotICAgICAgICAgICAgICAgIGdyYW50ZWROb3RJbldoaXRlbGlzdC5yZW1vdmVBbGwod2hpdGVsaXN0KTsKLSAgICAgICAgICAgICAgICBTZXQ8U3RyaW5nPiBub3RHcmFudGVkTm90SW5EZW55bGlzdCA9IG5ldyBUcmVlU2V0PD4obm90R3JhbnRlZCk7Ci0gICAgICAgICAgICAgICAgbm90R3JhbnRlZE5vdEluRGVueWxpc3QucmVtb3ZlQWxsKGRlbnlsaXN0KTsKKyAgICAgICAgICAgICAgICBTZXQ8U3RyaW5nPiBncmFudGVkTm90SW5XaGl0ZWxpc3QgPSBkaWZmZXJlbmNlKGdyYW50ZWQsIHdoaXRlbGlzdCk7CisgICAgICAgICAgICAgICAgU2V0PFN0cmluZz4gZmFjdG9yeU5vdEdyYW50ZWROb3RSZW1vdmVkTm90SW5EZW55bGlzdCA9IGRpZmZlcmVuY2UoZGlmZmVyZW5jZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvcnlOb3RHcmFudGVkLCByZW1vdmVkKSwgZGVueWxpc3QpOwogCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiTm90IHdoaXRlbGlzdGVkIHBlcm1pc3Npb25zIGFyZSBncmFudGVkIGZvciBwYWNrYWdlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwa2cucGFja2FnZU5hbWUgKyAiOiAiICsgZ3JhbnRlZE5vdEluV2hpdGVsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbnRlZE5vdEluV2hpdGVsaXN0LmlzRW1wdHkoKSk7CisgICAgICAgICAgICAgICAgaWYgKCFncmFudGVkTm90SW5XaGl0ZWxpc3QuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VzR3JhbnRlZE5vdEluV2hpdGVsaXN0LnB1dChwYWNrYWdlTmFtZSwgZ3JhbnRlZE5vdEluV2hpdGVsaXN0KTsKKyAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJSZXF1ZXN0ZWQgcGVybWlzc2lvbnMgbm90IGdyYW50ZWQgZm9yIHBhY2thZ2UgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBrZy5wYWNrYWdlTmFtZSArICI6ICIgKyBub3RHcmFudGVkTm90SW5EZW55bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vdEdyYW50ZWROb3RJbkRlbnlsaXN0LmlzRW1wdHkoKSk7CisgICAgICAgICAgICAgICAgaWYgKCFmYWN0b3J5Tm90R3JhbnRlZE5vdFJlbW92ZWROb3RJbkRlbnlsaXN0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBwYWNrYWdlc05vdEdyYW50ZWROb3RSZW1vdmVkTm90SW5EZW55bGlzdC5wdXQocGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeU5vdEdyYW50ZWROb3RSZW1vdmVkTm90SW5EZW55bGlzdCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIFN0cmluZ0J1aWxkZXIgbWVzc2FnZSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGlmICghcGFja2FnZXNHcmFudGVkTm90SW5XaGl0ZWxpc3QuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBtZXNzYWdlLmFwcGVuZCgiTm90IHdoaXRlbGlzdGVkIHBlcm1pc3Npb25zIGFyZSBncmFudGVkOiAiCisgICAgICAgICAgICAgICAgICAgICsgcGFja2FnZXNHcmFudGVkTm90SW5XaGl0ZWxpc3QudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFwYWNrYWdlc05vdEdyYW50ZWROb3RSZW1vdmVkTm90SW5EZW55bGlzdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlLmxlbmd0aCgpICE9IDApIHsKKyAgICAgICAgICAgICAgICBtZXNzYWdlLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKCJSZXF1ZXN0ZWQgcGVybWlzc2lvbnMgbm90IGdyYW50ZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBwYWNrYWdlc05vdEdyYW50ZWROb3RSZW1vdmVkTm90SW5EZW55bGlzdC50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXBhY2thZ2VzR3JhbnRlZE5vdEluV2hpdGVsaXN0LmlzRW1wdHkoKQorICAgICAgICAgICAgICAgIHx8ICFwYWNrYWdlc05vdEdyYW50ZWROb3RSZW1vdmVkTm90SW5EZW55bGlzdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGZhaWwobWVzc2FnZS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgPFQ+IFN0cmluZyBnZXRQcmludGFibGVTZXQoU3RyaW5nIGluZGVuZGF0aW9uLCBTZXQ8VD4gc2V0KSB7CisgICAgICAgIGlmIChzZXQuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKworICAgICAgICBmb3IgKFQgZSA6IG5ldyBUcmVlU2V0PD4oc2V0KSkgeworICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShlLnRvU3RyaW5nKCkudHJpbSgpKSkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChpbmRlbmRhdGlvbik7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGUpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwogICAgIH0KIAogICAgIHByaXZhdGUgU2V0PFN0cmluZz4gZ2V0UHJpdkFwcFBlcm1pc3Npb25zKFN0cmluZyBwYWNrYWdlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ByZWZlcmVuY2UvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL3ByZWZlcmVuY2UvQW5kcm9pZC5tawppbmRleCA5MjIzY2U4Li44NzkxY2ZmIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9wcmVmZXJlbmNlL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvdGVzdHMvcHJlZmVyZW5jZS9BbmRyb2lkLm1rCkBAIC0yMSw5ICsyMSwxMSBAQAogTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKIAogIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzIGN0c19pbnN0YW50CiAKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjdHN0ZXN0cnVubmVyIGxlZ2FjeS1hbmRyb2lkLXRlc3QKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjdHN0ZXN0cnVubmVyLWF4dAorCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzIGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcHJlZmVyZW5jZS9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdGVzdHMvcHJlZmVyZW5jZS9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGU1ZmQ3MTAuLmQzNWUzZWYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3ByZWZlcmVuY2UvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9wcmVmZXJlbmNlL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTE2LDcgKzE2LDggQEAKICAtLT4KIAogPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBwYWNrYWdlPSJhbmRyb2lkLnByZWZlcmVuY2UuY3RzIj4KKyAgICBwYWNrYWdlPSJhbmRyb2lkLnByZWZlcmVuY2UuY3RzIgorICAgIGFuZHJvaWQ6dGFyZ2V0U2FuZGJveFZlcnNpb249IjIiPgogCiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5ESVNBQkxFX0tFWUdVQVJEIiAvPgogICAgIDxhcHBsaWNhdGlvbj4KQEAgLTI3LDcgKzI4LDcgQEAKICAgICAgICAgPC9hY3Rpdml0eT4KICAgICA8L2FwcGxpY2F0aW9uPgogCi0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5wcmVmZXJlbmNlLmN0cyIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBvZiBhbmRyb2lkLnByZWZlcmVuY2UiPgogICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0ibGlzdGVuZXIiCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9wcmVmZXJlbmNlL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL3ByZWZlcmVuY2UvQW5kcm9pZFRlc3QueG1sCmluZGV4IGYyNmQyODIuLjU4NGJiYzggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3ByZWZlcmVuY2UvQW5kcm9pZFRlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL3ByZWZlcmVuY2UvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgUHJlZmVyZW5jZSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0idWl0b29sa2l0IiAvPgogICAgIDxvcHRpb24gbmFtZT0ibm90LXNoYXJkYWJsZSIgdmFsdWU9InRydWUiIC8+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9wcmVmZXJlbmNlL09XTkVSUyBiL3Rlc3RzL3Rlc3RzL3ByZWZlcmVuY2UvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMDUxMWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9wcmVmZXJlbmNlL09XTkVSUwpAQCAtMCwwICsxLDIgQEAKK3Bhdmxpc0Bnb29nbGUuY29tCitjbGFyYWJheWFycmlAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcHJlZmVyZW5jZTIvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL3ByZWZlcmVuY2UyL0FuZHJvaWQubWsKaW5kZXggNzUyOWY0My4uY2EwMThlYSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvcHJlZmVyZW5jZTIvQW5kcm9pZC5taworKysgYi90ZXN0cy90ZXN0cy9wcmVmZXJlbmNlMi9BbmRyb2lkLm1rCkBAIC0yMywxNCArMjMsMTUgQEAKIExPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCiAKICMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cyBjdHNfaW5zdGFudAogCiBMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAotICAgIGN0c3Rlc3RydW5uZXIgXAotICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwgXAorICAgIGN0c3Rlc3RydW5uZXItYXh0IFwKKyAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBcCiAgICAgbW9ja2l0by10YXJnZXQtbWludXMtanVuaXQ0IFwKLSAgICB1Yi11aWF1dG9tYXRvciBcCi0gICAgbGVnYWN5LWFuZHJvaWQtdGVzdAorICAgIHViLXVpYXV0b21hdG9yCisKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIuc3R1YnMgYW5kcm9pZC50ZXN0LmJhc2Uuc3R1YnMKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9wcmVmZXJlbmNlMi9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdGVzdHMvcHJlZmVyZW5jZTIvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA1MGUxZWE5Li4zMTJiODcwIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9wcmVmZXJlbmNlMi9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL3ByZWZlcmVuY2UyL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTE1LDcgKzE1LDggQEAKIC0tPgogCiA8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHBhY2thZ2U9ImFuZHJvaWQucHJlZmVyZW5jZTIuY3RzIj4KKyAgICBwYWNrYWdlPSJhbmRyb2lkLnByZWZlcmVuY2UyLmN0cyIKKyAgICBhbmRyb2lkOnRhcmdldFNhbmRib3hWZXJzaW9uPSIyIj4KIAogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uRElTQUJMRV9LRVlHVUFSRCIgLz4KICAgICA8YXBwbGljYXRpb24+CkBAIC00NSw3ICs0Niw3IEBACiAgICAgPC9hcHBsaWNhdGlvbj4KIAogICAgIDwhLS0gVGhpcyBpcyBhIHNlbGYtaW5zdHJ1bWVudGluZyB0ZXN0IHBhY2thZ2UuIC0tPgotICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQucHJlZmVyZW5jZTIuY3RzIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIFRlc3QgQ2FzZXMgZm9yIGFuZHJvaWQucHJlZmVyZW5jZTIiPgogICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0ibGlzdGVuZXIiCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9wcmVmZXJlbmNlMi9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy90ZXN0cy9wcmVmZXJlbmNlMi9BbmRyb2lkVGVzdC54bWwKaW5kZXggNjkxYzQ1YjMuLmIxM2ViYTUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3ByZWZlcmVuY2UyL0FuZHJvaWRUZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9wcmVmZXJlbmNlMi9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBQcmVmZXJlbmNlIHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJ1aXRvb2xraXQiIC8+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CiAgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ByZWZlcmVuY2UyL3NyYy9hbmRyb2lkL3ByZWZlcmVuY2UyL2N0cy9QcmVmZXJlbmNlQWN0aXZpdHlGbG93TGFuZHNjYXBlVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvcHJlZmVyZW5jZTIvc3JjL2FuZHJvaWQvcHJlZmVyZW5jZTIvY3RzL1ByZWZlcmVuY2VBY3Rpdml0eUZsb3dMYW5kc2NhcGVUZXN0LmphdmEKaW5kZXggMWRhODQ3ZS4uZGVjYWZiZSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvcHJlZmVyZW5jZTIvc3JjL2FuZHJvaWQvcHJlZmVyZW5jZTIvY3RzL1ByZWZlcmVuY2VBY3Rpdml0eUZsb3dMYW5kc2NhcGVUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvcHJlZmVyZW5jZTIvc3JjL2FuZHJvaWQvcHJlZmVyZW5jZTIvY3RzL1ByZWZlcmVuY2VBY3Rpdml0eUZsb3dMYW5kc2NhcGVUZXN0LmphdmEKQEAgLTE3LDEwICsxNywxMSBAQAogcGFja2FnZSBhbmRyb2lkLnByZWZlcmVuY2UyLmN0czsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5MYXJnZVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTGFyZ2VUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwpAQCAtMzYsNyArMzcsNyBAQAogCiAgICAgQFJ1bGUKICAgICBwdWJsaWMgQWN0aXZpdHlUZXN0UnVsZTxQcmVmZXJlbmNlV2l0aEhlYWRlcnNMYW5kc2NhcGU+IG1BY3Rpdml0eVJ1bGUgPQotICAgICAgICAgICAgbmV3IEFjdGl2aXR5VGVzdFJ1bGU8PihQcmVmZXJlbmNlV2l0aEhlYWRlcnNMYW5kc2NhcGUuY2xhc3MsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgICAgICBuZXcgQWN0aXZpdHlUZXN0UnVsZTw+KFByZWZlcmVuY2VXaXRoSGVhZGVyc0xhbmRzY2FwZS5jbGFzcywgdHJ1ZSwgZmFsc2UpOwogCiAgICAgQEJlZm9yZQogICAgIHB1YmxpYyB2b2lkIHNldHVwKCkgewpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcHJlZmVyZW5jZTIvc3JjL2FuZHJvaWQvcHJlZmVyZW5jZTIvY3RzL1ByZWZlcmVuY2VBY3Rpdml0eUZsb3dQb3J0cmFpdFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3ByZWZlcmVuY2UyL3NyYy9hbmRyb2lkL3ByZWZlcmVuY2UyL2N0cy9QcmVmZXJlbmNlQWN0aXZpdHlGbG93UG9ydHJhaXRUZXN0LmphdmEKaW5kZXggMWZkNmI0ZC4uMTYwMTQxYyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvcHJlZmVyZW5jZTIvc3JjL2FuZHJvaWQvcHJlZmVyZW5jZTIvY3RzL1ByZWZlcmVuY2VBY3Rpdml0eUZsb3dQb3J0cmFpdFRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9wcmVmZXJlbmNlMi9zcmMvYW5kcm9pZC9wcmVmZXJlbmNlMi9jdHMvUHJlZmVyZW5jZUFjdGl2aXR5Rmxvd1BvcnRyYWl0VGVzdC5qYXZhCkBAIC0xNiwxMSArMTYsMTcgQEAKIAogcGFja2FnZSBhbmRyb2lkLnByZWZlcmVuY2UyLmN0czsKIAoraW1wb3J0IHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9MRUFOQkFDSzsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzdW1lLmFzc3VtZUZhbHNlOworCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLkxhcmdlVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTGFyZ2VUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwpAQCAtMzYsMTAgKzQyLDEzIEBACiAKICAgICBAUnVsZQogICAgIHB1YmxpYyBBY3Rpdml0eVRlc3RSdWxlPFByZWZlcmVuY2VXaXRoSGVhZGVyc1BvcnRyYWl0PiBtQWN0aXZpdHlSdWxlID0KLSAgICAgICAgICAgIG5ldyBBY3Rpdml0eVRlc3RSdWxlPD4oUHJlZmVyZW5jZVdpdGhIZWFkZXJzUG9ydHJhaXQuY2xhc3MsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgICAgICBuZXcgQWN0aXZpdHlUZXN0UnVsZTw+KFByZWZlcmVuY2VXaXRoSGVhZGVyc1BvcnRyYWl0LmNsYXNzLCB0cnVlLCBmYWxzZSk7CiAKICAgICBAQmVmb3JlCiAgICAgcHVibGljIHZvaWQgc2V0dXAoKSB7CisgICAgICAgIFBhY2thZ2VNYW5hZ2VyIHBtID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0VGFyZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgIC8vIElnbm9yZSB0aGlzIHRlc3Qgb24gTGVhbmJhY2sgc2luY2UgTGVhbmJhY2sgZG9lc24ndCBzdXBwb3J0IHBvcnRyYWl0IG9yaWVudGF0aW9uCisgICAgICAgIGFzc3VtZUZhbHNlKHBtLmhhc1N5c3RlbUZlYXR1cmUoRkVBVFVSRV9MRUFOQkFDSykpOwogICAgICAgICBtVGVzdFV0aWxzID0gbmV3IFRlc3RVdGlscygpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcHJlZmVyZW5jZTIvc3JjL2FuZHJvaWQvcHJlZmVyZW5jZTIvY3RzL1ByZWZlcmVuY2VBY3Rpdml0eUxlZ2FjeUZsb3dUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9wcmVmZXJlbmNlMi9zcmMvYW5kcm9pZC9wcmVmZXJlbmNlMi9jdHMvUHJlZmVyZW5jZUFjdGl2aXR5TGVnYWN5Rmxvd1Rlc3QuamF2YQppbmRleCBmYTEyMzVkLi5jODBlYjE5IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9wcmVmZXJlbmNlMi9zcmMvYW5kcm9pZC9wcmVmZXJlbmNlMi9jdHMvUHJlZmVyZW5jZUFjdGl2aXR5TGVnYWN5Rmxvd1Rlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9wcmVmZXJlbmNlMi9zcmMvYW5kcm9pZC9wcmVmZXJlbmNlMi9jdHMvUHJlZmVyZW5jZUFjdGl2aXR5TGVnYWN5Rmxvd1Rlc3QuamF2YQpAQCAtMjAsOSArMjAsMTAgQEAKIAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5MYXJnZVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLkxhcmdlVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogCiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5CaXRtYXBVdGlsczsKIApAQCAtNDgsNyArNDksNyBAQAogCiAgICAgQFJ1bGUKICAgICBwdWJsaWMgQWN0aXZpdHlUZXN0UnVsZTxQcmVmZXJlbmNlc0Zyb21YbWw+IG1BY3Rpdml0eVJ1bGUgPQotICAgICAgICAgICAgbmV3IEFjdGl2aXR5VGVzdFJ1bGU8PihQcmVmZXJlbmNlc0Zyb21YbWwuY2xhc3MpOworICAgICAgICAgICAgbmV3IEFjdGl2aXR5VGVzdFJ1bGU8PihQcmVmZXJlbmNlc0Zyb21YbWwuY2xhc3MsIHRydWUpOwogCiAgICAgQEJlZm9yZQogICAgIHB1YmxpYyB2b2lkIHNldHVwKCkgewpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcHJlZmVyZW5jZTIvc3JjL2FuZHJvaWQvcHJlZmVyZW5jZTIvY3RzL1ByZWZlcmVuY2VEYXRhU3RvcmVUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9wcmVmZXJlbmNlMi9zcmMvYW5kcm9pZC9wcmVmZXJlbmNlMi9jdHMvUHJlZmVyZW5jZURhdGFTdG9yZVRlc3QuamF2YQppbmRleCBjYzkzYjQ0Li45NjEzNjJjIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9wcmVmZXJlbmNlMi9zcmMvYW5kcm9pZC9wcmVmZXJlbmNlMi9jdHMvUHJlZmVyZW5jZURhdGFTdG9yZVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9wcmVmZXJlbmNlMi9zcmMvYW5kcm9pZC9wcmVmZXJlbmNlMi9jdHMvUHJlZmVyZW5jZURhdGFTdG9yZVRlc3QuamF2YQpAQCAtNDUsOSArNDUsMTAgQEAKIGltcG9ydCBhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZURhdGFTdG9yZTsKIGltcG9ydCBhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VTY3JlZW47Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ByZWZlcmVuY2UyL3NyYy9hbmRyb2lkL3ByZWZlcmVuY2UyL2N0cy9QcmVmZXJlbmNlUGFyZW50R3JvdXBUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9wcmVmZXJlbmNlMi9zcmMvYW5kcm9pZC9wcmVmZXJlbmNlMi9jdHMvUHJlZmVyZW5jZVBhcmVudEdyb3VwVGVzdC5qYXZhCmluZGV4IGE2NDVkYzguLjg1OTAxYzMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3ByZWZlcmVuY2UyL3NyYy9hbmRyb2lkL3ByZWZlcmVuY2UyL2N0cy9QcmVmZXJlbmNlUGFyZW50R3JvdXBUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvcHJlZmVyZW5jZTIvc3JjL2FuZHJvaWQvcHJlZmVyZW5jZTIvY3RzL1ByZWZlcmVuY2VQYXJlbnRHcm91cFRlc3QuamF2YQpAQCAtMjMsMTEgKzIzLDEyIEBACiBpbXBvcnQgYW5kcm9pZC5wcmVmZXJlbmNlLkNoZWNrQm94UHJlZmVyZW5jZTsKIGltcG9ydCBhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUNhdGVnb3J5OwogaW1wb3J0IGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlU2NyZWVuOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnRlc3QuVWlUaHJlYWRUZXN0OwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ByZWZlcmVuY2UyL3NyYy9hbmRyb2lkL3ByZWZlcmVuY2UyL2N0cy9QcmVmZXJlbmNlUmVjeWNsZVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3ByZWZlcmVuY2UyL3NyYy9hbmRyb2lkL3ByZWZlcmVuY2UyL2N0cy9QcmVmZXJlbmNlUmVjeWNsZVRlc3QuamF2YQppbmRleCAyZmY2NTFjLi5lOWE5YzdlIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9wcmVmZXJlbmNlMi9zcmMvYW5kcm9pZC9wcmVmZXJlbmNlMi9jdHMvUHJlZmVyZW5jZVJlY3ljbGVUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvcHJlZmVyZW5jZTIvc3JjL2FuZHJvaWQvcHJlZmVyZW5jZTIvY3RzL1ByZWZlcmVuY2VSZWN5Y2xlVGVzdC5qYXZhCkBAIC0yMiwxMSArMjIsMTIgQEAKIAogaW1wb3J0IGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlOwogaW1wb3J0IGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlU2NyZWVuOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnRlc3QuVWlUaHJlYWRUZXN0OwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5Qb2xsaW5nQ2hlY2s7CiAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcHJlZmVyZW5jZTIvc3JjL2FuZHJvaWQvcHJlZmVyZW5jZTIvY3RzL1Rlc3RVdGlscy5qYXZhIGIvdGVzdHMvdGVzdHMvcHJlZmVyZW5jZTIvc3JjL2FuZHJvaWQvcHJlZmVyZW5jZTIvY3RzL1Rlc3RVdGlscy5qYXZhCmluZGV4IGI1YzAyZjEuLjM1OWVhMTEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3ByZWZlcmVuY2UyL3NyYy9hbmRyb2lkL3ByZWZlcmVuY2UyL2N0cy9UZXN0VXRpbHMuamF2YQorKysgYi90ZXN0cy90ZXN0cy9wcmVmZXJlbmNlMi9zcmMvYW5kcm9pZC9wcmVmZXJlbmNlMi9jdHMvVGVzdFV0aWxzLmphdmEKQEAgLTI0LDEzICsyNCwxNCBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwogaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLlVpRGV2aWNlOwogaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLlVpT2JqZWN0OwogaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLlVpT2JqZWN0Tm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QudWlhdXRvbWF0b3IuVWlTY3JvbGxhYmxlOwogaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLlVpU2VsZWN0b3I7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworCiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5TeXN0ZW1VdGlsOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTM4LDcgKzM5LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKIAogLyoqCi0gKiBDb2xsZWN0aW9uIG9mIGhlbHBlciB1dGlscyBmb3IgcHJlZmVyZW5jZXMgdGVzdGluZy4KKyAqIENvbGxlY3Rpb24gb2YgaGVscGVyIHV0aWxzIGZvciB0ZXN0aW5nIHByZWZlcmVuY2VzLgogICovCiBwdWJsaWMgY2xhc3MgVGVzdFV0aWxzIHsKIApAQCAtNDYsNiArNDcsNyBAQAogICAgIHByaXZhdGUgZmluYWwgSW5zdHJ1bWVudGF0aW9uIG1JbnN0cnVtZW50YXRpb247CiAgICAgcHJpdmF0ZSBmaW5hbCBVaUF1dG9tYXRpb24gbUF1dG9tYXRpb247CiAgICAgcHJpdmF0ZSBpbnQgbVN0YXR1c0JhckhlaWdodCA9IC0xOworICAgIHByaXZhdGUgaW50IG1OYXZpZ2F0aW9uQmFySGVpZ2h0ID0gLTE7CiAKICAgICBUZXN0VXRpbHMoKSB7CiAgICAgICAgIG1JbnN0cnVtZW50YXRpb24gPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKTsKQEAgLTU4LDE1ICs2MCwyNCBAQAogICAgICAgICBkZXZpY2Uud2FpdEZvcklkbGUoKTsKIAogICAgICAgICBCaXRtYXAgYnQgPSBtQXV0b21hdGlvbi50YWtlU2NyZWVuc2hvdCgpOwotICAgICAgICAvLyBDcm9wLW91dCB0aGUgdG9wIGJhciB3aGVyZSBjdXJyZW50IHRpbWUgaXMgZGlzcGxheWVkIHNpbmNlIGFueSB0aW1lIGNoYW5nZSB3b3VsZAotICAgICAgICAvLyBpbnRyb2R1Y2UgZmxha2luZXNzICh3ZSBhcmUgY3V0dGluZyA1JSBvZiB0aGUgc2NyZWVuIGhlaWdodCBvciBzdGF0dXNfYmFyX2hlaWdodCkuCi0gICAgICAgIGludCB5VG9DdXQgPSBNYXRoLm1heChidC5nZXRIZWlnaHQoKSAvIDIwLCBnZXRTdGF0dXNCYXJIZWlnaHQoKSk7Ci0gICAgICAgIC8vIENyb3AgdGhlIHJpZ2h0IHNpZGUgZm9yIHNjcm9sbGJhciB3aGljaCBtaWdodCBvciBtaWdodCBub3QgYmUgdmlzaWJsZS4gQnV0IG9uCi0gICAgICAgIC8vIHdhdGNoLCB0aGUgc2Nyb2xsIGJhciBpcyBhIGN1cnZlIGFuZCBvY2N1cGllcyAyMCUgb2YgdGhlIHNjcmVlbiBvbiB0aGUgcmlnaHQKLSAgICAgICAgLy8gaGFuZCBzaWRlLgorCisgICAgICAgIC8vIENyb3Atb3V0IHRoZSBzdGF0dXMgYmFyIHRvIGF2b2lkIGZsYWtpbmVzcyB3aXRoIGNoYW5naW5nIG5vdGlmaWNhdGlvbnMgLyB0aW1lLgorICAgICAgICBpbnQgc3RhdHVzQmFySGVpZ2h0ID0gZ2V0U3RhdHVzQmFySGVpZ2h0KCk7CisKKyAgICAgICAgLy8gQ3JvcC1vdXQgdGhlIG5hdmlnYXRpb24gYmFyIHRvIGF2b2lkIGZsYWtpbmVzcyB3aXRoIGJ1dHRvbiBhbmltYXRpb25zLgorICAgICAgICBpbnQgbmF2aWdhdGlvbkJhckhlaWdodCA9IGdldE5hdmlnYXRpb25CYXJIZWlnaHQoKTsKKworICAgICAgICAvLyBDcm9wIHRoZSByaWdodCBzaWRlIGZvciBzY3JvbGxiYXIgd2hpY2ggbWlnaHQgb3IgbWlnaHQgbm90IGJlIHZpc2libGUuIE9uIHdlYXJhYmxlCisgICAgICAgIC8vIGRldmljZXMgdGhlIHNjcm9sbCBiYXIgaXMgYSBjdXJ2ZSBhbmQgb2NjdXBpZXMgMjAlIG9mIHRoZSByaWdodCBzaWRlLgogICAgICAgICBpbnQgeFRvQ3V0ID0gaXNPbldhdGNoVWlNb2RlKCkgPyBidC5nZXRXaWR0aCgpIC8gNSA6IGJ0LmdldFdpZHRoKCkgLyAyMDsKKyAgICAgICAgaW50IHlUb0N1dCA9IHN0YXR1c0JhckhlaWdodDsKKworICAgICAgICAvLyBDcm9wLW91dCB0aGUgbmF2IGJhciBpbiBib3RoIHdpZHRoIGFuZCBoZWlnaHQgdG8gbWVldCBib3RoIHRoZSBwaG9uZSBhbmQgdGhlIHRhYmxldAorICAgICAgICB4VG9DdXQgKz0gbmF2aWdhdGlvbkJhckhlaWdodDsKKyAgICAgICAgeVRvQ3V0ICs9IG5hdmlnYXRpb25CYXJIZWlnaHQ7CisKICAgICAgICAgYnQgPSBCaXRtYXAuY3JlYXRlQml0bWFwKAotICAgICAgICAgICAgICAgIGJ0LCAwLCB5VG9DdXQsIGJ0LmdldFdpZHRoKCkgLSB4VG9DdXQsIGJ0LmdldEhlaWdodCgpIC0geVRvQ3V0KTsKKyAgICAgICAgICAgICAgICBidCwgMCwgc3RhdHVzQmFySGVpZ2h0LCBidC5nZXRXaWR0aCgpIC0geFRvQ3V0LCBidC5nZXRIZWlnaHQoKSAtIHlUb0N1dCk7CiAKICAgICAgICAgcmV0dXJuIGJ0OwogICAgIH0KQEAgLTc3LDIxICs4OCwyMSBAQAogICAgICAgICB9CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAvLyBJZiB0aGUgY3VycmVudCBVSSBoYXMgc2hvd24gdGV4dCwganVzdCBjbGljayBvbiBpdC4KLSAgICAgICAgICBVaU9iamVjdCB0ZXh0ID0gbmV3IFVpT2JqZWN0KG5ldyBVaVNlbGVjdG9yKCkudGV4dChzZWFyY2hUZXh0KSk7Ci0gICAgICAgICAgaWYgKHRleHQuZXhpc3RzKCkgfHwgdGV4dC53YWl0Rm9yRXhpc3RzKDEwMDApKSB7CisgICAgICAgICAgICAvLyBJZiB0aGUgY3VycmVudCBVSSBoYXMgc2hvd24gdGV4dCwganVzdCBjbGljayBvbiBpdC4KKyAgICAgICAgICAgIFVpT2JqZWN0IHRleHQgPSBuZXcgVWlPYmplY3QobmV3IFVpU2VsZWN0b3IoKS50ZXh0KHNlYXJjaFRleHQpKTsKKyAgICAgICAgICAgIGlmICh0ZXh0LmV4aXN0cygpIHx8IHRleHQud2FpdEZvckV4aXN0cygxMDAwKSkgeworICAgICAgICAgICAgICAgIHRleHQuY2xpY2soKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgaWYgaXQgaXMgc2Nyb2xsYWJsZSwgc2Nyb2xsIHRvIHdoZXJlIHRoZSB0ZXh0IGlzIGFuZCB0YXAuCisgICAgICAgICAgICBVaVNjcm9sbGFibGUgdGV4dFNjcm9sbCA9IG5ldyBVaVNjcm9sbGFibGUobmV3IFVpU2VsZWN0b3IoKS5zY3JvbGxhYmxlKHRydWUpKTsKKworICAgICAgICAgICAgdGV4dFNjcm9sbC5zY3JvbGxJbnRvVmlldyhuZXcgVWlTZWxlY3RvcigpLnRleHQoc2VhcmNoVGV4dCkpOworICAgICAgICAgICAgdGV4dCA9IG5ldyBVaU9iamVjdChuZXcgVWlTZWxlY3RvcigpLnRleHQoc2VhcmNoVGV4dCkpOwogICAgICAgICAgICAgdGV4dC5jbGljaygpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KLQotICAgICAgICAgIC8vIE90aGVyd2lzZSwgaWYgaXQgaXMgc2Nyb2xsYWJsZSwgc2Nyb2xsIHRvIHdoZXJlIHRoZSB0ZXh0IGlzIGFuZCB0YXAuCi0gICAgICAgICAgVWlTY3JvbGxhYmxlIHRleHRTY3JvbGwgPSAgbmV3IFVpU2Nyb2xsYWJsZShuZXcgVWlTZWxlY3RvcigpLnNjcm9sbGFibGUodHJ1ZSkpOwotCi0gICAgICAgICAgdGV4dFNjcm9sbC5zY3JvbGxJbnRvVmlldyhuZXcgVWlTZWxlY3RvcigpLnRleHQoc2VhcmNoVGV4dCkpOwotICAgICAgICAgIHRleHQgPSBuZXcgVWlPYmplY3QobmV3IFVpU2VsZWN0b3IoKS50ZXh0KHNlYXJjaFRleHQpKTsKLSAgICAgICAgICB0ZXh0LmNsaWNrKCk7CiAgICAgICAgIH0gY2F0Y2ggKFVpT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiVmlldyB3aXRoIHRleHQgJyIgKyBzZWFyY2hUZXh0ICsgIicgd2FzIG5vdCBmb3VuZCEiLCBlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiVmlldyB3aXRoIHRleHQgJyIgKyBzZWFyY2hUZXh0ICsgIicgd2FzIG5vdCBmb3VuZCEiLCBlKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTI1LDcgKzEzNiw3IEBACiAgICAgICAgIFVpT2JqZWN0IG9iaiA9IGRldmljZS5maW5kT2JqZWN0KG5ldyBVaVNlbGVjdG9yKCkudGV4dE1hdGNoZXModGV4dCkpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgcmV0dXJuIG9iai5pc0ZvY3VzZWQoKTsKLSAgICAgICAgfSBjYXRjaChVaU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfSBjYXRjaCAoVWlPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CkBAIC0xNTAsNyArMTYxLDcgQEAKIAogICAgIC8vIE11bHRpLXdpbmRvdyBoZWxwZXJzIHRha2VuIGZyb20gQWN0aXZpdHlNYW5hZ2VyRG9ja2VkU3RhY2tUZXN0cy5qYXZhCiAKLSAgICB2b2lkIGVudGVyTXVsdGlXaW5kb3coQWN0aXZpdHkgYWN0aXZpdHkpICB7CisgICAgdm9pZCBlbnRlck11bHRpV2luZG93KEFjdGl2aXR5IGFjdGl2aXR5KSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgaWQgPSBnZXRBY3Rpdml0eVRhc2tJZChhY3Rpdml0eSk7CiAgICAgICAgICAgICBydW5TaGVsbENvbW1hbmQoImFtIHN0YWNrIG1vdmUtdGFzayAiICsgaWQgKyAiIDMgdHJ1ZSIpOwpAQCAtMTYzLDcgKzE3NCw3IEBACiAgICAgdm9pZCBsZWF2ZU11bHRpV2luZG93KEFjdGl2aXR5IGFjdGl2aXR5KSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgaWQgPSBnZXRBY3Rpdml0eVRhc2tJZChhY3Rpdml0eSk7Ci0gICAgICAgICAgICBydW5TaGVsbENvbW1hbmQoImFtIHN0YWNrIG1vdmUtdGFzayAiKyBpZCArIiAxIHRydWUiKTsKKyAgICAgICAgICAgIHJ1blNoZWxsQ29tbWFuZCgiYW0gc3RhY2sgbW92ZS10YXNrICIgKyBpZCArICIgMSB0cnVlIik7CiAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJGYWlsZWQgdG8gZ2V0IGFjdGl2aXR5IHRhc2sgaWQhIiwgZSk7CiAgICAgICAgIH0KQEAgLTIwMSwxNSArMjEyLDMwIEBACiAgICAgICAgICAgICByZXR1cm4gbVN0YXR1c0JhckhlaWdodDsKICAgICAgICAgfQogCi0gICAgICAgIGludCByZXN1bHQgPSAwOworICAgICAgICBtU3RhdHVzQmFySGVpZ2h0ID0gMDsKICAgICAgICAgaW50IHJlc291cmNlSWQgPSBtSW5zdHJ1bWVudGF0aW9uLmdldFRhcmdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKQogICAgICAgICAgICAgICAgIC5nZXRJZGVudGlmaWVyKCJzdGF0dXNfYmFyX2hlaWdodCIsICJkaW1lbiIsICJhbmRyb2lkIik7CiAgICAgICAgIGlmIChyZXNvdXJjZUlkID4gMCkgewotICAgICAgICAgICAgcmVzdWx0ID0gbUluc3RydW1lbnRhdGlvbi5nZXRUYXJnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCkKKyAgICAgICAgICAgIG1TdGF0dXNCYXJIZWlnaHQgPSBtSW5zdHJ1bWVudGF0aW9uLmdldFRhcmdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKQogICAgICAgICAgICAgICAgICAgICAuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKHJlc291cmNlSWQpOwogICAgICAgICB9Ci0gICAgICAgIG1TdGF0dXNCYXJIZWlnaHQgPSByZXN1bHQ7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIHJldHVybiBtU3RhdHVzQmFySGVpZ2h0OworICAgIH0KKworICAgIHByaXZhdGUgaW50IGdldE5hdmlnYXRpb25CYXJIZWlnaHQoKSB7CisgICAgICAgIC8vIENhY2hlIHRoZSByZXN1bHQgdG8ga2VlcCBpdCBmYXN0LgorICAgICAgICBpZiAobU5hdmlnYXRpb25CYXJIZWlnaHQgPj0gMCkgeworICAgICAgICAgICAgcmV0dXJuIG1OYXZpZ2F0aW9uQmFySGVpZ2h0OworICAgICAgICB9CisKKyAgICAgICAgbU5hdmlnYXRpb25CYXJIZWlnaHQgPSAwOworICAgICAgICBpbnQgcmVzb3VyY2VJZCA9IG1JbnN0cnVtZW50YXRpb24uZ2V0VGFyZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpCisgICAgICAgICAgICAgICAgLmdldElkZW50aWZpZXIoIm5hdmlnYXRpb25fYmFyX2hlaWdodCIsICJkaW1lbiIsICJhbmRyb2lkIik7CisgICAgICAgIGlmIChyZXNvdXJjZUlkID4gMCkgeworICAgICAgICAgICAgbU5hdmlnYXRpb25CYXJIZWlnaHQgPSBtSW5zdHJ1bWVudGF0aW9uLmdldFRhcmdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKQorICAgICAgICAgICAgICAgICAgICAuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKHJlc291cmNlSWQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtTmF2aWdhdGlvbkJhckhlaWdodDsKICAgICB9CiAKICAgICBwcml2YXRlIFN0cmluZyBydW5TaGVsbENvbW1hbmQoU3RyaW5nIGNtZCkgewpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcHJpbnQvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL3ByaW50L0FuZHJvaWQubWsKaW5kZXggYzliMDM2YS4uYzQ0OTQzZCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvcHJpbnQvQW5kcm9pZC5taworKysgYi90ZXN0cy90ZXN0cy9wcmludC9BbmRyb2lkLm1rCkBAIC0xNiwxOSArMTYsMjAgQEAKIAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwogCiBMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQogCiAjIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0Ci1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMgY3RzX2luc3RhbnQKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzUHJpbnRUZXN0Q2FzZXMKIAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IG1vY2tpdG8tdGFyZ2V0LW1pbnVzLWp1bml0NCBjdHN0ZXN0cnVubmVyIHViLXVpYXV0b21hdG9yIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwgYW5kcm9pZC1zdXBwb3J0LXRlc3QKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBwcmludC10ZXN0LXV0aWwtbGliCiAKIExPQ0FMX1NES19WRVJTSU9OIDo9IHRlc3RfY3VycmVudAogCiBpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCitpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcHJpbnQvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL3ByaW50L0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggYjM5OGRiNy4uYjNjM2Y1OSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvcHJpbnQvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9wcmludC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0xNyw3ICsxNyw3IEBACiAtLT4KIAogPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgcGFja2FnZT0iYW5kcm9pZC5wcmludC5jdHMiPgorICAgICAgICBwYWNrYWdlPSJhbmRyb2lkLnByaW50LmN0cyIgYW5kcm9pZDp0YXJnZXRTYW5kYm94VmVyc2lvbj0iMiI+CiAKICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkRJU0FCTEVfS0VZR1VBUkQiIC8+CiAKQEAgLTI1LDExICsyNSwxMyBAQAogCiAgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIi8+CiAKLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wcmludC5jdHMuUHJpbnREb2N1bWVudEFjdGl2aXR5IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpjb25maWdDaGFuZ2VzPSJtbmN8bW5jfHRvdWNoc2NyZWVufG5hdmlnYXRpb258c2NyZWVuTGF5b3V0fHNjcmVlblNpemV8c21hbGxlc3RTY3JlZW5TaXplfG9yaWVudGF0aW9ufGxvY2FsZXxrZXlib2FyZHxrZXlib2FyZEhpZGRlbnxmb250U2NhbGV8dWlNb2RlfGxheW91dERpcmVjdGlvbnxkZW5zaXR5Ii8+CisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnByaW50LnRlc3QuUHJpbnREb2N1bWVudEFjdGl2aXR5IgorICAgICAgICAgICAgYW5kcm9pZDpjb25maWdDaGFuZ2VzPSJtbmN8bW5jfHRvdWNoc2NyZWVufG5hdmlnYXRpb258c2NyZWVuTGF5b3V0fHNjcmVlblNpemV8c21hbGxlc3RTY3JlZW5TaXplfG9yaWVudGF0aW9ufGxvY2FsZXxrZXlib2FyZHxrZXlib2FyZEhpZGRlbnxmb250U2NhbGV8dWlNb2RlfGxheW91dERpcmVjdGlvbnxkZW5zaXR5IgorICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQHN0eWxlL05vQW5pbWF0aW9uIiAvPgogCiAgICAgICAgIDxzZXJ2aWNlCi0gICAgICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucHJpbnQuY3RzLnNlcnZpY2VzLkZpcnN0UHJpbnRTZXJ2aWNlIgorICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnByaW50LnRlc3Quc2VydmljZXMuRmlyc3RQcmludFNlcnZpY2UiCiAgICAgICAgICAgICBhbmRyb2lkOnBlcm1pc3Npb249ImFuZHJvaWQucGVybWlzc2lvbi5CSU5EX1BSSU5UX1NFUlZJQ0UiPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucHJpbnRzZXJ2aWNlLlByaW50U2VydmljZSIgLz4KQEAgLTQxLDcgKzQzLDcgQEAKICAgICAgICAgPC9zZXJ2aWNlPgogCiAgICAgICAgIDxzZXJ2aWNlCi0gICAgICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucHJpbnQuY3RzLnNlcnZpY2VzLlNlY29uZFByaW50U2VydmljZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wcmludC50ZXN0LnNlcnZpY2VzLlNlY29uZFByaW50U2VydmljZSIKICAgICAgICAgICAgIGFuZHJvaWQ6cGVybWlzc2lvbj0iYW5kcm9pZC5wZXJtaXNzaW9uLkJJTkRfUFJJTlRfU0VSVklDRSI+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wcmludHNlcnZpY2UuUHJpbnRTZXJ2aWNlIiAvPgpAQCAtNTMsMzAgKzU1LDMzIEBACiAgICAgICAgIDwvc2VydmljZT4KIAogICAgICAgICA8YWN0aXZpdHkKLSAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wcmludC5jdHMuc2VydmljZXMuU2V0dGluZ3NBY3Rpdml0eSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wcmludC50ZXN0LnNlcnZpY2VzLlNldHRpbmdzQWN0aXZpdHkiCisgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAc3R5bGUvTm9BbmltYXRpb24iCiAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIj4KICAgICAgICAgPC9hY3Rpdml0eT4KIAogICAgICAgICA8YWN0aXZpdHkKLSAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wcmludC5jdHMuc2VydmljZXMuQWRkUHJpbnRlcnNBY3Rpdml0eSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wcmludC50ZXN0LnNlcnZpY2VzLkFkZFByaW50ZXJzQWN0aXZpdHkiCisgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAc3R5bGUvTm9BbmltYXRpb24iCiAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIj4KICAgICAgICAgPC9hY3Rpdml0eT4KIAogICAgICAgICA8YWN0aXZpdHkKLSAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucHJpbnQuY3RzLnNlcnZpY2VzLkluZm9BY3Rpdml0eSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIj4KKyAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wcmludC50ZXN0LnNlcnZpY2VzLkluZm9BY3Rpdml0eSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBzdHlsZS9Ob0FuaW1hdGlvbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiPgogICAgICAgICA8L2FjdGl2aXR5PgogCiAgICAgICAgIDxhY3Rpdml0eQotICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnByaW50LmN0cy5zZXJ2aWNlcy5DdXN0b21QcmludE9wdGlvbnNBY3Rpdml0eSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wcmludC50ZXN0LnNlcnZpY2VzLkN1c3RvbVByaW50T3B0aW9uc0FjdGl2aXR5IgogICAgICAgICAgICAgYW5kcm9pZDpwZXJtaXNzaW9uPSJhbmRyb2lkLnBlcm1pc3Npb24uU1RBUlRfUFJJTlRfU0VSVklDRV9DT05GSUdfQUNUSVZJVFkiCiAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQHN0eWxlL1RoZW1lLlRyYW5zbHVjZW50Ij4KKyAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBzdHlsZS9Ob0FuaW1hdGlvblRyYW5zbHVjZW50Ij4KICAgICAgICAgPC9hY3Rpdml0eT4KIAogICA8L2FwcGxpY2F0aW9uPgogCi0gIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5wcmludC5jdHMiCiAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iVGVzdHMgZm9yIHRoZSBwcmludCBBUElzLiIvPgogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9wcmludC9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy90ZXN0cy9wcmludC9BbmRyb2lkVGVzdC54bWwKaW5kZXggMWM3NzFkNi4uZmZjYWY2NSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvcHJpbnQvQW5kcm9pZFRlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL3ByaW50L0FuZHJvaWRUZXN0LnhtbApAQCAtMTQsOCArMTQsMTQgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBQcmludCB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0ibm90LXNoYXJkYWJsZSIgdmFsdWU9InRydWUiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJmcmFtZXdvcmsiIC8+CisgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJwcmludCIgLz4KKworICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuUnVuQ29tbWFuZFRhcmdldFByZXBhcmVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJydW4tY29tbWFuZCIgdmFsdWU9ImNtZCBwcmludCBzZXQtYmluZC1pbnN0YW50LXNlcnZpY2UtYWxsb3dlZCB0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlYXJkb3duLWNvbW1hbmQiIHZhbHVlPSJjbWQgcHJpbnQgc2V0LWJpbmQtaW5zdGFudC1zZXJ2aWNlLWFsbG93ZWQgZmFsc2UiIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CiAKICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcHJpbnQvcHJpbnRUZXN0VXRpbExpYi9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvcHJpbnQvcHJpbnRUZXN0VXRpbExpYi9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5YzQ3OTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9wcmludC9wcmludFRlc3RVdGlsTGliL0FuZHJvaWQubWsKQEAgLTAsMCArMSwyOSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCisKK0xPQ0FMX01PRFVMRSA6PSBwcmludC10ZXN0LXV0aWwtbGliCisKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBtb2NraXRvLXRhcmdldC1taW51cy1qdW5pdDQgY3RzdGVzdHJ1bm5lci1heHQgdWItdWlhdXRvbWF0b3IgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgYW5kcm9pZHgudGVzdC5ydWxlcworCitMT0NBTF9TREtfVkVSU0lPTiA6PSB0ZXN0X2N1cnJlbnQKKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19KQVZBX0xJQlJBUlkpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcHJpbnQvcHJpbnRUZXN0VXRpbExpYi9zcmMvYW5kcm9pZC9wcmludC90ZXN0L0Jhc2VQcmludFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3ByaW50L3ByaW50VGVzdFV0aWxMaWIvc3JjL2FuZHJvaWQvcHJpbnQvdGVzdC9CYXNlUHJpbnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODkxNTI1ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3ByaW50L3ByaW50VGVzdFV0aWxMaWIvc3JjL2FuZHJvaWQvcHJpbnQvdGVzdC9CYXNlUHJpbnRUZXN0LmphdmEKQEAgLTAsMCArMSwxMDQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnByaW50LnRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLkdFVF9NRVRBX0RBVEE7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5HRVRfU0VSVklDRVM7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQucHJpbnQudGVzdC5VdGlscy5nZXRQcmludE1hbmFnZXI7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3N1bWUuYXNzdW1lVHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTWF0Y2hlcnMuYW55OworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5NYXRjaGVycy5lcTsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5kb0Fuc3dlcjsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5kb0NhbGxSZWFsTWV0aG9kOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLm1vY2s7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ud2hlbjsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uaGFtY3Jlc3QuTW9ja2l0b0hhbWNyZXN0LmFyZ1RoYXQ7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb247CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlJlc29sdmVJbmZvOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MucGRmLlBkZkRvY3VtZW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuQ2FuY2VsbGF0aW9uU2lnbmFsOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3I7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnByaW50LlBhZ2VSYW5nZTsKK2ltcG9ydCBhbmRyb2lkLnByaW50LlByaW50QXR0cmlidXRlczsKK2ltcG9ydCBhbmRyb2lkLnByaW50LlByaW50RG9jdW1lbnRBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQucHJpbnQuUHJpbnREb2N1bWVudEFkYXB0ZXIuTGF5b3V0UmVzdWx0Q2FsbGJhY2s7CitpbXBvcnQgYW5kcm9pZC5wcmludC5QcmludERvY3VtZW50QWRhcHRlci5Xcml0ZVJlc3VsdENhbGxiYWNrOworaW1wb3J0IGFuZHJvaWQucHJpbnQuUHJpbnREb2N1bWVudEluZm87CitpbXBvcnQgYW5kcm9pZC5wcmludC5QcmludE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5wcmludC5QcmludGVySWQ7CitpbXBvcnQgYW5kcm9pZC5wcmludC5wZGYuUHJpbnRlZFBkZkRvY3VtZW50OworaW1wb3J0IGFuZHJvaWQucHJpbnQudGVzdC5zZXJ2aWNlcy5QcmludFNlcnZpY2VDYWxsYmFja3M7CitpbXBvcnQgYW5kcm9pZC5wcmludC50ZXN0LnNlcnZpY2VzLlByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uQ2FsbGJhY2tzOworaW1wb3J0IGFuZHJvaWQucHJpbnQudGVzdC5zZXJ2aWNlcy5TdHViYmFibGVQcmludFNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5wcmludC50ZXN0LnNlcnZpY2VzLlN0dWJiYWJsZVByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uOworaW1wb3J0IGFuZHJvaWQucHJpbnRzZXJ2aWNlLkN1c3RvbVByaW50ZXJJY29uQ2FsbGJhY2s7CitpbXBvcnQgYW5kcm9pZC5wcmludHNlcnZpY2UuUHJpbnRKb2I7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC51aWF1dG9tYXRvci5CeTsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC51aWF1dG9tYXRvci5CeVNlbGVjdG9yOworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLlVpRGV2aWNlOworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLlVpT2JqZWN0MjsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC51aWF1dG9tYXRvci5VaU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLlVudGlsOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OworCitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5Ob25OdWxsOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTnVsbGFibGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuU3lzdGVtVXRpbDsKKworaW1wb3J0IG9yZy5oYW1jcmVzdC5CYXNlTWF0Y2hlcjsKK2ltcG9ydCBvcmcuaGFtY3Jlc3QuRGVzY3JpcHRpb247CitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5BZnRlckNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5UZXN0UnVsZTsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5tb2RlbC5TdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLm1vY2tpdG8uSW5PcmRlcjsKK2ltcG9ydCBvcmcubW9ja2l0by5zdHViYmluZy5BbnN3ZXI7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVvdXRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CisKKy8qKgorICogVGhpcyBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgcHJpbnQgdGVzdHMuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlUHJpbnRUZXN0IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJCYXNlUHJpbnRUZXN0IjsKKworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgbG9uZyBPUEVSQVRJT05fVElNRU9VVF9NSUxMSVMgPSAyMDAwMDsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUklOVF9KT0JfTkFNRSA9ICJUZXN0IjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfSUQgPSAiQmFzZVByaW50VGVzdC5FWFRSQV9URVNUX0lEIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUklOVF9TUE9PTEVSX1BBQ0tBR0VfTkFNRSA9ICJjb20uYW5kcm9pZC5wcmludHNwb29sZXIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTV9DTEVBUl9TVUNDRVNTX09VVFBVVCA9ICJTdWNjZXNzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9MSVNUX0VOQUJMRURfSU1FX0NPTVBPTkVOVFMgPSAiaW1lIGxpc3QgLXMiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX1BSRUZJWF9FTkFCTEVfSU1FID0gImltZSBlbmFibGUgIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9QUkVGSVhfRElTQUJMRV9JTUUgPSAiaW1lIGRpc2FibGUgIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ1VSUkVOVF9VU0VSX0lEID0gLTI7IC8vIE1pcnJvcnMgVXNlckhhbmRsZS5VU0VSX0NVUlJFTlQKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJTlRTUE9PTEVSX1BBQ0tBR0UgPSAiY29tLmFuZHJvaWQucHJpbnRzcG9vbGVyIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEF0b21pY0ludGVnZXIgc0xhc3RUZXN0SUQgPSBuZXcgQXRvbWljSW50ZWdlcigpOworICAgIHByaXZhdGUgaW50IG1UZXN0SWQ7CisgICAgcHJpdmF0ZSBQcmludERvY3VtZW50QWN0aXZpdHkgbUFjdGl2aXR5OworCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHNEaXNhYmxlZFByaW50U2VydmljZXNCZWZvcmU7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTcGFyc2VBcnJheTxCYXNlUHJpbnRUZXN0PiBzSWRUb1Rlc3QgPSBuZXcgU3BhcnNlQXJyYXk8PigpOworCisgICAgcHVibGljIGZpbmFsIEBSdWxlIFNob3VsZFN0YXJ0QWN0aXZpdHkgbVNob3VsZFN0YXJ0QWN0aXZpdHlSdWxlID0gbmV3IFNob3VsZFN0YXJ0QWN0aXZpdHkoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgVUkgZGV2aWNlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBVSSBkZXZpY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFVpRGV2aWNlIGdldFVpRGV2aWNlKCkgeworICAgICAgICByZXR1cm4gVWlEZXZpY2UuZ2V0SW5zdGFuY2UoZ2V0SW5zdHJ1bWVudGF0aW9uKCkpOworICAgIH0KKworICAgIHByaXZhdGUgQ2FsbENvdW50ZXIgbUNhbmNlbE9wZXJhdGlvbkNvdW50ZXI7CisgICAgcHJpdmF0ZSBDYWxsQ291bnRlciBtTGF5b3V0Q2FsbENvdW50ZXI7CisgICAgcHJpdmF0ZSBDYWxsQ291bnRlciBtV3JpdGVDYWxsQ291bnRlcjsKKyAgICBwcml2YXRlIENhbGxDb3VudGVyIG1Xcml0ZUNhbmNlbENhbGxDb3VudGVyOworICAgIHByaXZhdGUgQ2FsbENvdW50ZXIgbVN0YXJ0Q2FsbENvdW50ZXI7CisgICAgcHJpdmF0ZSBDYWxsQ291bnRlciBtRmluaXNoQ2FsbENvdW50ZXI7CisgICAgcHJpdmF0ZSBDYWxsQ291bnRlciBtUHJpbnRKb2JRdWV1ZWRDYWxsQ291bnRlcjsKKyAgICBwcml2YXRlIENhbGxDb3VudGVyIG1DcmVhdGVTZXNzaW9uQ2FsbENvdW50ZXI7CisgICAgcHJpdmF0ZSBDYWxsQ291bnRlciBtRGVzdHJveVNlc3Npb25DYWxsQ291bnRlcjsKKyAgICBwcml2YXRlIENhbGxDb3VudGVyIG1EZXN0cm95QWN0aXZpdHlDYWxsQ291bnRlciA9IG5ldyBDYWxsQ291bnRlcigpOworICAgIHByaXZhdGUgQ2FsbENvdW50ZXIgbUNyZWF0ZUFjdGl2aXR5Q2FsbENvdW50ZXIgPSBuZXcgQ2FsbENvdW50ZXIoKTsKKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHNFbmFibGVkSW1lczsKKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGdldEVuYWJsZWRJbWVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGltZUxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBwZmQgPSBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRVaUF1dG9tYXRpb24oKQorICAgICAgICAgICAgICAgIC5leGVjdXRlU2hlbGxDb21tYW5kKENPTU1BTkRfTElTVF9FTkFCTEVEX0lNRV9DT01QT05FTlRTKTsKKyAgICAgICAgdHJ5IChCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoCisgICAgICAgICAgICAgICAgbmV3IElucHV0U3RyZWFtUmVhZGVyKG5ldyBGaWxlSW5wdXRTdHJlYW0ocGZkLmdldEZpbGVEZXNjcmlwdG9yKCkpKSkpIHsKKworICAgICAgICAgICAgU3RyaW5nIGxpbmU7CisgICAgICAgICAgICB3aGlsZSAoKGxpbmUgPSByZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGltZUxpc3QuYWRkKGxpbmUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nW10gaW1lQXJyYXkgPSBuZXcgU3RyaW5nW2ltZUxpc3Quc2l6ZSgpXTsKKyAgICAgICAgaW1lTGlzdC50b0FycmF5KGltZUFycmF5KTsKKworICAgICAgICByZXR1cm4gaW1lQXJyYXk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBkaXNhYmxlSW1lcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzRW5hYmxlZEltZXMgPSBnZXRFbmFibGVkSW1lcygpOworICAgICAgICBmb3IgKFN0cmluZyBpbWUgOiBzRW5hYmxlZEltZXMpIHsKKyAgICAgICAgICAgIFN0cmluZyBkaXNhYmxlSW1lQ29tbWFuZCA9IENPTU1BTkRfUFJFRklYX0RJU0FCTEVfSU1FICsgaW1lOworICAgICAgICAgICAgU3lzdGVtVXRpbC5ydW5TaGVsbENvbW1hbmQoZ2V0SW5zdHJ1bWVudGF0aW9uKCksIGRpc2FibGVJbWVDb21tYW5kKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZW5hYmxlSW1lcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmb3IgKFN0cmluZyBpbWUgOiBzRW5hYmxlZEltZXMpIHsKKyAgICAgICAgICAgIFN0cmluZyBlbmFibGVJbWVDb21tYW5kID0gQ09NTUFORF9QUkVGSVhfRU5BQkxFX0lNRSArIGltZTsKKyAgICAgICAgICAgIFN5c3RlbVV0aWwucnVuU2hlbGxDb21tYW5kKGdldEluc3RydW1lbnRhdGlvbigpLCBlbmFibGVJbWVDb21tYW5kKTsKKyAgICAgICAgfQorICAgICAgICBzRW5hYmxlZEltZXMgPSBudWxsOworICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgSW5zdHJ1bWVudGF0aW9uIGdldEluc3RydW1lbnRhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpOworICAgIH0KKworICAgIEBCZWZvcmVDbGFzcworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRVcENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIExvZy5kKExPR19UQUcsICJzZXRVcENsYXNzKCkiKTsKKworICAgICAgICBJbnN0cnVtZW50YXRpb24gaW5zdHJ1bWVudGF0aW9uID0gZ2V0SW5zdHJ1bWVudGF0aW9uKCk7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHdlIHN0YXJ0IHdpdGggYSBjbGVhbiBzbGF0ZS4KKyAgICAgICAgTG9nLmQoTE9HX1RBRywgImNsZWFyUHJpbnRTcG9vbGVyRGF0YSgpIik7CisgICAgICAgIGNsZWFyUHJpbnRTcG9vbGVyRGF0YSgpOworICAgICAgICBMb2cuZChMT0dfVEFHLCAiZGlzYWJsZUltZXMoKSIpOworICAgICAgICBkaXNhYmxlSW1lcygpOworICAgICAgICBMb2cuZChMT0dfVEFHLCAiZGlzYWJsZVByaW50U2VydmljZXMoKSIpOworICAgICAgICBkaXNhYmxlUHJpbnRTZXJ2aWNlcyhpbnN0cnVtZW50YXRpb24uZ2V0VGFyZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VOYW1lKCkpOworCisgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIGRleG1ha2VyIGJ1ZzogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9kZXhtYWtlci9pc3N1ZXMvZGV0YWlsP2lkPTIKKyAgICAgICAgLy8gRGV4bWFrZXIgaXMgdXNlZCBieSBtb2NraXRvLgorICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImRleG1ha2VyLmRleGNhY2hlIiwgaW5zdHJ1bWVudGF0aW9uCisgICAgICAgICAgICAgICAgLmdldFRhcmdldENvbnRleHQoKS5nZXRDYWNoZURpcigpLmdldFBhdGgoKSk7CisKKyAgICAgICAgTG9nLmQoTE9HX1RBRywgInNldFVwQ2xhc3MoKSBkb25lIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGlzYWJsZSBhbGwgcHJpbnQgc2VydmljZXMgYmVzaWRlIHRoZSBvbmVzIHdlIHdhbnQgdG8gbGVhdmUgZW5hYmxlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYWNrYWdlVG9MZWF2ZUVuYWJsZWQgVGhlIHBhY2thZ2Ugb2YgdGhlIHNlcnZpY2VzIHRvIGxlYXZlIGVuYWJsZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBkaXNhYmxlUHJpbnRTZXJ2aWNlcyhATm9uTnVsbCBTdHJpbmcgcGFja2FnZVRvTGVhdmVFbmFibGVkKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSW5zdHJ1bWVudGF0aW9uIGluc3RydW1lbnRhdGlvbiA9IGdldEluc3RydW1lbnRhdGlvbigpOworCisgICAgICAgIHNEaXNhYmxlZFByaW50U2VydmljZXNCZWZvcmUgPSBTeXN0ZW1VdGlsLnJ1blNoZWxsQ29tbWFuZChpbnN0cnVtZW50YXRpb24sCisgICAgICAgICAgICAgICAgInNldHRpbmdzIGdldCBzZWN1cmUgIiArIFNldHRpbmdzLlNlY3VyZS5ESVNBQkxFRF9QUklOVF9TRVJWSUNFUyk7CisKKyAgICAgICAgSW50ZW50IHByaW50U2VydmljZUludGVudCA9IG5ldyBJbnRlbnQoYW5kcm9pZC5wcmludHNlcnZpY2UuUHJpbnRTZXJ2aWNlLlNFUlZJQ0VfSU5URVJGQUNFKTsKKyAgICAgICAgTGlzdDxSZXNvbHZlSW5mbz4gaW5zdGFsbGVkU2VydmljZXMgPSBpbnN0cnVtZW50YXRpb24uZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VNYW5hZ2VyKCkKKyAgICAgICAgICAgICAgICAucXVlcnlJbnRlbnRTZXJ2aWNlcyhwcmludFNlcnZpY2VJbnRlbnQsIEdFVF9TRVJWSUNFUyB8IEdFVF9NRVRBX0RBVEEpOworCisgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGZvciAoUmVzb2x2ZUluZm8gc2VydmljZSA6IGluc3RhbGxlZFNlcnZpY2VzKSB7CisgICAgICAgICAgICBpZiAocGFja2FnZVRvTGVhdmVFbmFibGVkLmVxdWFscyhzZXJ2aWNlLnNlcnZpY2VJbmZvLnBhY2thZ2VOYW1lKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGJ1aWxkZXIubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIjoiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKG5ldyBDb21wb25lbnROYW1lKHNlcnZpY2Uuc2VydmljZUluZm8ucGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgIHNlcnZpY2Uuc2VydmljZUluZm8ubmFtZSkuZmxhdHRlblRvU3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgU3lzdGVtVXRpbC5ydW5TaGVsbENvbW1hbmQoaW5zdHJ1bWVudGF0aW9uLCAic2V0dGluZ3MgcHV0IHNlY3VyZSAiCisgICAgICAgICAgICAgICAgKyBTZXR0aW5ncy5TZWN1cmUuRElTQUJMRURfUFJJTlRfU0VSVklDRVMgKyAiICIgKyBidWlsZGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXZlcnQge0BsaW5rICNkaXNhYmxlUHJpbnRTZXJ2aWNlcyhTdHJpbmcpfQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljICB2b2lkIGVuYWJsZVByaW50U2VydmljZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTeXN0ZW1VdGlsLnJ1blNoZWxsQ29tbWFuZChnZXRJbnN0cnVtZW50YXRpb24oKSwKKyAgICAgICAgICAgICAgICAic2V0dGluZ3MgcHV0IHNlY3VyZSAiICsgU2V0dGluZ3MuU2VjdXJlLkRJU0FCTEVEX1BSSU5UX1NFUlZJQ0VTICsgIiAiCisgICAgICAgICAgICAgICAgICAgICAgICArIHNEaXNhYmxlZFByaW50U2VydmljZXNCZWZvcmUpOworICAgIH0KKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBMb2cuZChMT0dfVEFHLCAic2V0VXAoKSIpOworCisgICAgICAgIGFzc3VtZVRydWUoZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VNYW5hZ2VyKCkuaGFzU3lzdGVtRmVhdHVyZSgKKyAgICAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlci5GRUFUVVJFX1BSSU5USU5HKSk7CisKKyAgICAgICAgLy8gUHJldmVudCByb3RhdGlvbgorICAgICAgICBnZXRVaURldmljZSgpLmZyZWV6ZVJvdGF0aW9uKCk7CisgICAgICAgIHdoaWxlICghZ2V0VWlEZXZpY2UoKS5pc05hdHVyYWxPcmllbnRhdGlvbigpKSB7CisgICAgICAgICAgICBnZXRVaURldmljZSgpLnNldE9yaWVudGF0aW9uTmF0dXJhbCgpOworICAgICAgICAgICAgZ2V0VWlEZXZpY2UoKS53YWl0Rm9ySWRsZSgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgbGF0Y2hlcy4KKyAgICAgICAgTG9nLmQoTE9HX1RBRywgImluaXQgY291bnRlcnMiKTsKKyAgICAgICAgbUNhbmNlbE9wZXJhdGlvbkNvdW50ZXIgPSBuZXcgQ2FsbENvdW50ZXIoKTsKKyAgICAgICAgbUxheW91dENhbGxDb3VudGVyID0gbmV3IENhbGxDb3VudGVyKCk7CisgICAgICAgIG1TdGFydENhbGxDb3VudGVyID0gbmV3IENhbGxDb3VudGVyKCk7CisgICAgICAgIG1GaW5pc2hDYWxsQ291bnRlciA9IG5ldyBDYWxsQ291bnRlcigpOworICAgICAgICBtV3JpdGVDYWxsQ291bnRlciA9IG5ldyBDYWxsQ291bnRlcigpOworICAgICAgICBtV3JpdGVDYW5jZWxDYWxsQ291bnRlciA9IG5ldyBDYWxsQ291bnRlcigpOworICAgICAgICBtRmluaXNoQ2FsbENvdW50ZXIgPSBuZXcgQ2FsbENvdW50ZXIoKTsKKyAgICAgICAgbVByaW50Sm9iUXVldWVkQ2FsbENvdW50ZXIgPSBuZXcgQ2FsbENvdW50ZXIoKTsKKyAgICAgICAgbUNyZWF0ZVNlc3Npb25DYWxsQ291bnRlciA9IG5ldyBDYWxsQ291bnRlcigpOworICAgICAgICBtRGVzdHJveVNlc3Npb25DYWxsQ291bnRlciA9IG5ldyBDYWxsQ291bnRlcigpOworCisgICAgICAgIG1UZXN0SWQgPSBzTGFzdFRlc3RJRC5pbmNyZW1lbnRBbmRHZXQoKTsKKyAgICAgICAgc0lkVG9UZXN0LnB1dChtVGVzdElkLCB0aGlzKTsKKworICAgICAgICAvLyBDcmVhdGUgdGhlIGFjdGl2aXR5IGlmIG5lZWRlZAorICAgICAgICBpZiAoIW1TaG91bGRTdGFydEFjdGl2aXR5UnVsZS5tTm9BY3Rpdml0eSkgeworICAgICAgICAgICAgY3JlYXRlQWN0aXZpdHkoKTsKKyAgICAgICAgfQorCisgICAgICAgIExvZy5kKExPR19UQUcsICJzZXRVcCgpIGRvbmUiKTsKKyAgICB9CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBMb2cuZChMT0dfVEFHLCAidGVhckRvd24oKSIpOworCisgICAgICAgIGZpbmlzaEFjdGl2aXR5KCk7CisKKyAgICAgICAgc0lkVG9UZXN0LnJlbW92ZShtVGVzdElkKTsKKworICAgICAgICAvLyBBbGxvdyByb3RhdGlvbgorICAgICAgICBnZXRVaURldmljZSgpLnVuZnJlZXplUm90YXRpb24oKTsKKworICAgICAgICBMb2cuZChMT0dfVEFHLCAidGVhckRvd24oKSBkb25lIik7CisgICAgfQorCisgICAgQEFmdGVyQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVhckRvd25DbGFzcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBMb2cuZChMT0dfVEFHLCAidGVhckRvd25DbGFzcygpIik7CisKKyAgICAgICAgSW5zdHJ1bWVudGF0aW9uIGluc3RydW1lbnRhdGlvbiA9IGdldEluc3RydW1lbnRhdGlvbigpOworCisgICAgICAgIExvZy5kKExPR19UQUcsICJlbmFibGVQcmludFNlcnZpY2VzKCkiKTsKKyAgICAgICAgZW5hYmxlUHJpbnRTZXJ2aWNlcygpOworCisgICAgICAgIExvZy5kKExPR19UQUcsICJlbmFibGVJbWVzKCkiKTsKKyAgICAgICAgZW5hYmxlSW1lcygpOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgc3Bvb2xlciBpcyBjbGVhbmVkLCB0aGlzIGFsc28gdW4tYXBwcm92ZXMgYWxsIHNlcnZpY2VzCisgICAgICAgIExvZy5kKExPR19UQUcsICJjbGVhclByaW50U3Bvb2xlckRhdGEoKSIpOworICAgICAgICBjbGVhclByaW50U3Bvb2xlckRhdGEoKTsKKworICAgICAgICBTeXN0ZW1VdGlsLnJ1blNoZWxsQ29tbWFuZChpbnN0cnVtZW50YXRpb24sICJzZXR0aW5ncyBwdXQgc2VjdXJlICIKKyAgICAgICAgICAgICAgICAgICAgKyBTZXR0aW5ncy5TZWN1cmUuRElTQUJMRURfUFJJTlRfU0VSVklDRVMgKyAiIG51bGwiKTsKKworICAgICAgICBMb2cuZChMT0dfVEFHLCAidGVhckRvd25DbGFzcygpIGRvbmUiKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYW5kcm9pZC5wcmludC5QcmludEpvYiBwcmludChATm9uTnVsbCBmaW5hbCBQcmludERvY3VtZW50QWRhcHRlciBhZGFwdGVyLAorICAgICAgICAgICAgZmluYWwgUHJpbnRBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKKyAgICAgICAgYW5kcm9pZC5wcmludC5QcmludEpvYltdIHByaW50Sm9iID0gbmV3IGFuZHJvaWQucHJpbnQuUHJpbnRKb2JbMV07CisgICAgICAgIC8vIEluaXRpYXRlIHByaW50aW5nIGFzIGlmIGNvbWluZyBmcm9tIHRoZSBhcHAuCisgICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpLnJ1bk9uTWFpblN5bmMoKCkgLT4geworICAgICAgICAgICAgUHJpbnRNYW5hZ2VyIHByaW50TWFuYWdlciA9IChQcmludE1hbmFnZXIpIGdldEFjdGl2aXR5KCkKKyAgICAgICAgICAgICAgICAgICAgLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5QUklOVF9TRVJWSUNFKTsKKyAgICAgICAgICAgIHByaW50Sm9iWzBdID0gcHJpbnRNYW5hZ2VyLnByaW50KCJQcmludCBqb2IiLCBhZGFwdGVyLCBhdHRyaWJ1dGVzKTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgcmV0dXJuIHByaW50Sm9iWzBdOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHByaW50KFByaW50RG9jdW1lbnRBZGFwdGVyIGFkYXB0ZXIpIHsKKyAgICAgICAgcHJpbnQoYWRhcHRlciwgKFByaW50QXR0cmlidXRlcykgbnVsbCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgcHJpbnQoUHJpbnREb2N1bWVudEFkYXB0ZXIgYWRhcHRlciwgU3RyaW5nIHByaW50Sm9iTmFtZSkgeworICAgICAgICBwcmludChhZGFwdGVyLCBwcmludEpvYk5hbWUsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IHByaW50aW5nCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRhcHRlciAgICAgIEFkYXB0ZXIgc3VwcGx5aW5nIGRhdGEgdG8gcHJpbnQKKyAgICAgKiBAcGFyYW0gcHJpbnRKb2JOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcmludCBqb2IKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBwcmludChATm9uTnVsbCBQcmludERvY3VtZW50QWRhcHRlciBhZGFwdGVyLCBATm9uTnVsbCBTdHJpbmcgcHJpbnRKb2JOYW1lLAorICAgICAgICAgICAgQE51bGxhYmxlIFByaW50QXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7CisgICAgICAgIC8vIEluaXRpYXRlIHByaW50aW5nIGFzIGlmIGNvbWluZyBmcm9tIHRoZSBhcHAuCisgICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpCisgICAgICAgICAgICAgICAgLnJ1bk9uTWFpblN5bmMoKCkgLT4gZ2V0UHJpbnRNYW5hZ2VyKGdldEFjdGl2aXR5KCkpLnByaW50KHByaW50Sm9iTmFtZSwgYWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNhbmNlbE9wZXJhdGlvbkNhbGxlZCgpIHsKKyAgICAgICAgbUNhbmNlbE9wZXJhdGlvbkNvdW50ZXIuY2FsbCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRDYWxsZWQoKSB7CisgICAgICAgIG1TdGFydENhbGxDb3VudGVyLmNhbGwoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkxheW91dENhbGxlZCgpIHsKKyAgICAgICAgbUxheW91dENhbGxDb3VudGVyLmNhbGwoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgaW50IGdldFdyaXRlQ2FsbENvdW50KCkgeworICAgICAgICByZXR1cm4gbVdyaXRlQ2FsbENvdW50ZXIuZ2V0Q2FsbENvdW50KCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgb25Xcml0ZUNhbGxlZCgpIHsKKyAgICAgICAgbVdyaXRlQ2FsbENvdW50ZXIuY2FsbCgpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIG9uV3JpdGVDYW5jZWxDYWxsZWQoKSB7CisgICAgICAgIG1Xcml0ZUNhbmNlbENhbGxDb3VudGVyLmNhbGwoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkZpbmlzaENhbGxlZCgpIHsKKyAgICAgICAgbUZpbmlzaENhbGxDb3VudGVyLmNhbGwoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblByaW50Sm9iUXVldWVkQ2FsbGVkKCkgeworICAgICAgICBtUHJpbnRKb2JRdWV1ZWRDYWxsQ291bnRlci5jYWxsKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgb25QcmludGVyRGlzY292ZXJ5U2Vzc2lvbkNyZWF0ZUNhbGxlZCgpIHsKKyAgICAgICAgbUNyZWF0ZVNlc3Npb25DYWxsQ291bnRlci5jYWxsKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgb25QcmludGVyRGlzY292ZXJ5U2Vzc2lvbkRlc3Ryb3lDYWxsZWQoKSB7CisgICAgICAgIG1EZXN0cm95U2Vzc2lvbkNhbGxDb3VudGVyLmNhbGwoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB3YWl0Rm9yQ2FuY2VsT3BlcmF0aW9uQ2FsbGJhY2tDYWxsZWQoKSB7CisgICAgICAgIHdhaXRGb3JDYWxsYmFja0NhbGxDb3VudChtQ2FuY2VsT3BlcmF0aW9uQ291bnRlciwgMSwKKyAgICAgICAgICAgICAgICAiRGlkIG5vdCBnZXQgZXhwZWN0ZWQgY2FsbCB0byBvbkNhbmNlbCBmb3IgdGhlIGN1cnJlbnQgb3BlcmF0aW9uLiIpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHdhaXRGb3JQcmludGVyRGlzY292ZXJ5U2Vzc2lvbkNyZWF0ZUNhbGxiYWNrQ2FsbGVkKCkgeworICAgICAgICB3YWl0Rm9yQ2FsbGJhY2tDYWxsQ291bnQobUNyZWF0ZVNlc3Npb25DYWxsQ291bnRlciwgMSwKKyAgICAgICAgICAgICAgICAiRGlkIG5vdCBnZXQgZXhwZWN0ZWQgY2FsbCB0byBvbkNyZWF0ZVByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uLiIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdhaXRGb3JQcmludGVyRGlzY292ZXJ5U2Vzc2lvbkRlc3Ryb3lDYWxsYmFja0NhbGxlZChpbnQgY291bnQpIHsKKyAgICAgICAgd2FpdEZvckNhbGxiYWNrQ2FsbENvdW50KG1EZXN0cm95U2Vzc2lvbkNhbGxDb3VudGVyLCBjb3VudCwKKyAgICAgICAgICAgICAgICAiRGlkIG5vdCBnZXQgZXhwZWN0ZWQgY2FsbCB0byBvbkRlc3Ryb3lQcmludGVyRGlzY292ZXJ5U2Vzc2lvbi4iKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB3YWl0Rm9yU2VydmljZU9uUHJpbnRKb2JRdWV1ZWRDYWxsYmFja0NhbGxlZChpbnQgY291bnQpIHsKKyAgICAgICAgd2FpdEZvckNhbGxiYWNrQ2FsbENvdW50KG1QcmludEpvYlF1ZXVlZENhbGxDb3VudGVyLCBjb3VudCwKKyAgICAgICAgICAgICAgICAiRGlkIG5vdCBnZXQgZXhwZWN0ZWQgY2FsbCB0byBvblByaW50Sm9iUXVldWVkLiIpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHdhaXRGb3JBZGFwdGVyU3RhcnRDYWxsYmFja0NhbGxlZCgpIHsKKyAgICAgICAgd2FpdEZvckNhbGxiYWNrQ2FsbENvdW50KG1TdGFydENhbGxDb3VudGVyLCAxLAorICAgICAgICAgICAgICAgICJEaWQgbm90IGdldCBleHBlY3RlZCBjYWxsIHRvIHN0YXJ0LiIpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHdhaXRGb3JBZGFwdGVyRmluaXNoQ2FsbGJhY2tDYWxsZWQoKSB7CisgICAgICAgIHdhaXRGb3JDYWxsYmFja0NhbGxDb3VudChtRmluaXNoQ2FsbENvdW50ZXIsIDEsCisgICAgICAgICAgICAgICAgIkRpZCBub3QgZ2V0IGV4cGVjdGVkIGNhbGwgdG8gZmluaXNoLiIpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHdhaXRGb3JMYXlvdXRBZGFwdGVyQ2FsbGJhY2tDb3VudChpbnQgY291bnQpIHsKKyAgICAgICAgd2FpdEZvckNhbGxiYWNrQ2FsbENvdW50KG1MYXlvdXRDYWxsQ291bnRlciwgY291bnQsCisgICAgICAgICAgICAgICAgIkRpZCBub3QgZ2V0IGV4cGVjdGVkIGNhbGwgdG8gbGF5b3V0LiIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdhaXRGb3JXcml0ZUFkYXB0ZXJDYWxsYmFjayhpbnQgY291bnQpIHsKKyAgICAgICAgd2FpdEZvckNhbGxiYWNrQ2FsbENvdW50KG1Xcml0ZUNhbGxDb3VudGVyLCBjb3VudCwgIkRpZCBub3QgZ2V0IGV4cGVjdGVkIGNhbGwgdG8gd3JpdGUuIik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgd2FpdEZvcldyaXRlQ2FuY2VsQ2FsbGJhY2soaW50IGNvdW50KSB7CisgICAgICAgIHdhaXRGb3JDYWxsYmFja0NhbGxDb3VudChtV3JpdGVDYW5jZWxDYWxsQ291bnRlciwgY291bnQsCisgICAgICAgICAgICAgICAgIkRpZCBub3QgZ2V0IGV4cGVjdGVkIGNhbmNlbCBvZiB3cml0ZS4iKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHdhaXRGb3JDYWxsYmFja0NhbGxDb3VudChDYWxsQ291bnRlciBjb3VudGVyLCBpbnQgY291bnQsIFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb3VudGVyLndhaXRGb3JDb3VudChjb3VudCwgT1BFUkFUSU9OX1RJTUVPVVRfTUlMTElTKTsKKyAgICAgICAgfSBjYXRjaCAoVGltZW91dEV4Y2VwdGlvbiB0ZSkgeworICAgICAgICAgICAgZmFpbChtZXNzYWdlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlIHRoZSBwcmludCBhY3Rpdml0eSB3YXMgY3JlYXRlZC4KKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBvbkFjdGl2aXR5Q3JlYXRlQ2FsbGVkKGludCB0ZXN0SWQsIFByaW50RG9jdW1lbnRBY3Rpdml0eSBhY3Rpdml0eSkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHNJZFRvVGVzdCkgeworICAgICAgICAgICAgQmFzZVByaW50VGVzdCB0ZXN0ID0gc0lkVG9UZXN0LmdldCh0ZXN0SWQpOworICAgICAgICAgICAgaWYgKHRlc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRlc3QubUFjdGl2aXR5ID0gYWN0aXZpdHk7CisgICAgICAgICAgICAgICAgdGVzdC5tQ3JlYXRlQWN0aXZpdHlDYWxsQ291bnRlci5jYWxsKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZSB0aGUgcHJpbnQgYWN0aXZpdHkgd2FzIGRlc3Ryb3llZC4KKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBvbkFjdGl2aXR5RGVzdHJveUNhbGxlZChpbnQgdGVzdElkKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAoc0lkVG9UZXN0KSB7CisgICAgICAgICAgICBCYXNlUHJpbnRUZXN0IHRlc3QgPSBzSWRUb1Rlc3QuZ2V0KHRlc3RJZCk7CisgICAgICAgICAgICBpZiAodGVzdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGVzdC5tRGVzdHJveUFjdGl2aXR5Q2FsbENvdW50ZXIuY2FsbCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGZpbmlzaEFjdGl2aXR5KCkgeworICAgICAgICBBY3Rpdml0eSBhY3Rpdml0eSA9IG1BY3Rpdml0eTsKKworICAgICAgICBpZiAoYWN0aXZpdHkgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKCFhY3Rpdml0eS5pc0ZpbmlzaGluZygpKSB7CisgICAgICAgICAgICAgICAgYWN0aXZpdHkuZmluaXNoKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdoaWxlICghYWN0aXZpdHkuaXNEZXN0cm95ZWQoKSkgeworICAgICAgICAgICAgICAgIGludCBjcmVhdGVzID0gbUNyZWF0ZUFjdGl2aXR5Q2FsbENvdW50ZXIuZ2V0Q2FsbENvdW50KCk7CisgICAgICAgICAgICAgICAgd2FpdEZvckNhbGxiYWNrQ2FsbENvdW50KG1EZXN0cm95QWN0aXZpdHlDYWxsQ291bnRlciwgY3JlYXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICJBY3Rpdml0eSB3YXMgbm90IGRlc3Ryb3llZCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBudW1iZXIgb2YgdGllcyB0aGUgcHJpbnQgYWN0aXZpdHkgd2FzIGRlc3Ryb3llZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBvbkRlc3Ryb3kgY2FsbHMgb24gdGhlIHByaW50IGFjdGl2aXR5LgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgZ2V0QWN0aXZpdHlEZXN0cm95Q2FsbGJhY2tDYWxsQ291bnQoKSB7CisgICAgICAgIHJldHVybiBtRGVzdHJveUFjdGl2aXR5Q2FsbENvdW50ZXIuZ2V0Q2FsbENvdW50KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBudW1iZXIgb2YgdGllcyB0aGUgcHJpbnQgYWN0aXZpdHkgd2FzIGNyZWF0ZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2Ygb25DcmVhdGUgY2FsbHMgb24gdGhlIHByaW50IGFjdGl2aXR5LgorICAgICAqLworICAgIHByaXZhdGUgaW50IGdldEFjdGl2aXR5Q3JlYXRlQ2FsbGJhY2tDYWxsQ291bnQoKSB7CisgICAgICAgIHJldHVybiBtQ3JlYXRlQWN0aXZpdHlDYWxsQ291bnRlci5nZXRDYWxsQ291bnQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXYWl0IHVudGlsIGNyZWF0ZSB3YXMgY2FsbGVkIHtAY29kZSBjb3VudH0gdGltZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY291bnQgVGhlIG51bWJlciBvZiBjcmVhdGUgY2FsbHMgdG8gZXhwZWN0LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB3YWl0Rm9yQWN0aXZpdHlDcmVhdGVDYWxsYmFja0NhbGxlZChpbnQgY291bnQpIHsKKyAgICAgICAgd2FpdEZvckNhbGxiYWNrQ2FsbENvdW50KG1DcmVhdGVBY3Rpdml0eUNhbGxDb3VudGVyLCBjb3VudCwKKyAgICAgICAgICAgICAgICAiRGlkIG5vdCBnZXQgZXhwZWN0ZWQgY2FsbCB0byBjcmVhdGUuIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzZXQgYWxsIGNvdW50ZXJzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc2V0Q291bnRlcnMoKSB7CisgICAgICAgIG1DYW5jZWxPcGVyYXRpb25Db3VudGVyLnJlc2V0KCk7CisgICAgICAgIG1MYXlvdXRDYWxsQ291bnRlci5yZXNldCgpOworICAgICAgICBtV3JpdGVDYWxsQ291bnRlci5yZXNldCgpOworICAgICAgICBtV3JpdGVDYW5jZWxDYWxsQ291bnRlci5yZXNldCgpOworICAgICAgICBtU3RhcnRDYWxsQ291bnRlci5yZXNldCgpOworICAgICAgICBtRmluaXNoQ2FsbENvdW50ZXIucmVzZXQoKTsKKyAgICAgICAgbVByaW50Sm9iUXVldWVkQ2FsbENvdW50ZXIucmVzZXQoKTsKKyAgICAgICAgbUNyZWF0ZVNlc3Npb25DYWxsQ291bnRlci5yZXNldCgpOworICAgICAgICBtRGVzdHJveVNlc3Npb25DYWxsQ291bnRlci5yZXNldCgpOworICAgICAgICBtRGVzdHJveUFjdGl2aXR5Q2FsbENvdW50ZXIucmVzZXQoKTsKKyAgICAgICAgbUNyZWF0ZUFjdGl2aXR5Q2FsbENvdW50ZXIucmVzZXQoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgVWlPYmplY3QyIGZpbmRVaU9iamVjdChCeVNlbGVjdG9yIHNlbGVjdG9yKSB0aHJvd3MgVWlPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIElPRXhjZXB0aW9uIHsKKyAgICAgICAgVWlPYmplY3QyIHVpT2JqZWN0ID0gZ2V0VWlEZXZpY2UoKS53YWl0KFVudGlsLmZpbmRPYmplY3Qoc2VsZWN0b3IpLAorICAgICAgICAgICAgICAgIE9QRVJBVElPTl9USU1FT1VUX01JTExJUyk7CisgICAgICAgIGlmICh1aU9iamVjdCA9PSBudWxsKSB7CisgICAgICAgICAgICBkdW1wV2luZG93SGllcmFyY2h5KCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgVWlPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbigiQ2Fubm90IGZpbmQgVWlPYmplY3Qgd2l0aCBzZWxlY3RvcjogIiArIHNlbGVjdG9yKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdWlPYmplY3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2FpdCB1bnRpbCB0aGUgbWVzc2FnZSBpcyBzaG93biB0aGF0IGluZGljYXRlcyB0aGF0IGEgcHJpbnRlciBpcyB1bmF2YWlsYWJsZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIElmIGFueXRoaW5nIHdhcyB1bmV4cGVjdGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHdhaXRGb3JQcmludGVyVW5hdmFpbGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHByaW50ZXJVbmF2YWlsYWJsZU1lc3NhZ2UgPSAiVGhpcyBwcmludGVyIGlzblwndCBhdmFpbGFibGUgcmlnaHQgbm93LiI7CisKKyAgICAgICAgVWlPYmplY3QyIG1lc3NhZ2UgPSBmaW5kVWlPYmplY3QoQnkucmVzKCJjb20uYW5kcm9pZC5wcmludHNwb29sZXI6aWQvbWVzc2FnZSIpKTsKKyAgICAgICAgaWYgKCFtZXNzYWdlLmdldFRleHQoKS5lcXVhbHMocHJpbnRlclVuYXZhaWxhYmxlTWVzc2FnZSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIldyb25nIG1lc3NhZ2U6ICIgKyBtZXNzYWdlLmdldFRleHQoKSArICIgaW5zdGVhZCBvZiAiCisgICAgICAgICAgICAgICAgICAgICsgcHJpbnRlclVuYXZhaWxhYmxlTWVzc2FnZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZWxlY3RQcmludGVyKFN0cmluZyBwcmludGVyTmFtZSkgdGhyb3dzIFVpT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxvbmcgZGVsYXkgPSAxMDA7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIFVpT2JqZWN0MiBkZXN0aW5hdGlvblNwaW5uZXIgPSBmaW5kVWlPYmplY3QoQnkucmVzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5wcmludHNwb29sZXI6aWQvZGVzdGluYXRpb25fc3Bpbm5lciIpKTsKKyAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25TcGlubmVyLmNsaWNrKCk7CisgICAgICAgICAgICAgICAgICAgIGdldFVpRGV2aWNlKCkud2FpdEZvcklkbGUoKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBHaXZlIHNwaW5uZXIgc29tZSB0aW1lIHRvIGV4cGFuZAorICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKGRlbGF5KTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBUcnkgdG8gc2VsZWN0IHByaW50ZXIKKyAgICAgICAgICAgICAgICAgICAgVWlPYmplY3QyIHByaW50ZXJPcHRpb24gPSBmaW5kVWlPYmplY3QoQnkudGV4dChwcmludGVyTmFtZSkpOworICAgICAgICAgICAgICAgICAgICBwcmludGVyT3B0aW9uLmNsaWNrKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoVWlPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJDb3VsZCBub3Qgc2VsZWN0IHByaW50ZXIgIiArIHByaW50ZXJOYW1lLCBlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBnZXRVaURldmljZSgpLndhaXRGb3JJZGxlKCk7CisKKyAgICAgICAgICAgICAgICBpZiAoIXByaW50ZXJOYW1lLmVxdWFscygiQWxsIHByaW50ZXJz4oCmIikpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHByaW50ZXIgaXMgc2VsZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldFVpRGV2aWNlKCkuaGFzT2JqZWN0KEJ5LnRleHQocHJpbnRlck5hbWUpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsYXkgPD0gT1BFUkFUSU9OX1RJTUVPVVRfTUlMTElTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkNhbm5vdCBmaW5kIHByaW50ZXIgIiArIHByaW50ZXJOYW1lICsgIiwgcmV0cnlpbmcuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXkgKj0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVpT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGZpbmQgcHJpbnRlciAiICsgcHJpbnRlck5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGV2ZW4gdGhvdWdoIHdlIHJldHJpZWQuIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFVpT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZHVtcFdpbmRvd0hpZXJhcmNoeSgpOworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGFuc3dlclByaW50U2VydmljZXNXYXJuaW5nKGJvb2xlYW4gY29uZmlybSkgdGhyb3dzIFVpT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24sCisgICAgICAgICAgICBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFVpT2JqZWN0MiBidXR0b247CisgICAgICAgIGlmIChjb25maXJtKSB7CisgICAgICAgICAgICBidXR0b24gPSBmaW5kVWlPYmplY3QoQnkucmVzKCJhbmRyb2lkOmlkL2J1dHRvbjEiKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBidXR0b24gPSBmaW5kVWlPYmplY3QoQnkucmVzKCJhbmRyb2lkOmlkL2J1dHRvbjIiKSk7CisgICAgICAgIH0KKyAgICAgICAgYnV0dG9uLmNsaWNrKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgY2hhbmdlT3JpZW50YXRpb24oU3RyaW5nIG9yaWVudGF0aW9uKSB0aHJvd3MgVWlPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIElPRXhjZXB0aW9uIHsKKyAgICAgICAgVWlPYmplY3QyIG9yaWVudGF0aW9uU3Bpbm5lciA9IGZpbmRVaU9iamVjdChCeS5yZXMoCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLnByaW50c3Bvb2xlcjppZC9vcmllbnRhdGlvbl9zcGlubmVyIikpOworICAgICAgICBvcmllbnRhdGlvblNwaW5uZXIuY2xpY2soKTsKKyAgICAgICAgVWlPYmplY3QyIG9yaWVudGF0aW9uT3B0aW9uID0gZmluZFVpT2JqZWN0KEJ5LnRleHQob3JpZW50YXRpb24pKTsKKyAgICAgICAgb3JpZW50YXRpb25PcHRpb24uY2xpY2soKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE9yaWVudGF0aW9uKCkgdGhyb3dzIFVpT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgVWlPYmplY3QyIG9yaWVudGF0aW9uU3Bpbm5lciA9IGZpbmRVaU9iamVjdChCeS5yZXMoCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLnByaW50c3Bvb2xlcjppZC9vcmllbnRhdGlvbl9zcGlubmVyIikpOworICAgICAgICByZXR1cm4gb3JpZW50YXRpb25TcGlubmVyLmdldFRleHQoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VNZWRpYVNpemUoU3RyaW5nIG1lZGlhU2l6ZSkgdGhyb3dzIFVpT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgVWlPYmplY3QyIG1lZGlhU2l6ZVNwaW5uZXIgPSBmaW5kVWlPYmplY3QoQnkucmVzKAorICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5wcmludHNwb29sZXI6aWQvcGFwZXJfc2l6ZV9zcGlubmVyIikpOworICAgICAgICBtZWRpYVNpemVTcGlubmVyLmNsaWNrKCk7CisgICAgICAgIFVpT2JqZWN0MiBtZWRpYVNpemVPcHRpb24gPSBmaW5kVWlPYmplY3QoQnkudGV4dChtZWRpYVNpemUpKTsKKyAgICAgICAgbWVkaWFTaXplT3B0aW9uLmNsaWNrKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgY2hhbmdlQ29sb3IoU3RyaW5nIGNvbG9yKSB0aHJvd3MgVWlPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBVaU9iamVjdDIgY29sb3JTcGlubmVyID0gZmluZFVpT2JqZWN0KEJ5LnJlcygiY29tLmFuZHJvaWQucHJpbnRzcG9vbGVyOmlkL2NvbG9yX3NwaW5uZXIiKSk7CisgICAgICAgIGNvbG9yU3Bpbm5lci5jbGljaygpOworICAgICAgICAvLyBUaGUgY29sb3Igc3Bpbm5lciBhbmQgdGhlIGNvbG9yIG9wdGlvbiBib3RoIGNvbnRhaW4gdGhlIHNhbWUgdGV4dCwgc28gZ2l2ZSB0aGUKKyAgICAgICAgLy8gc3Bpbm5lciBzb21lIHRpbWUgdG8gZXhwYW5kCisgICAgICAgIGxvbmcgZGVsYXkgPSAxMDA7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoZGVsYXkpOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgfQorICAgICAgICBVaU9iamVjdDIgY29sb3JPcHRpb24gPSBmaW5kVWlPYmplY3QoQnkudGV4dChjb2xvcikpOworICAgICAgICBjb2xvck9wdGlvbi5jbGljaygpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sb3IoKSB0aHJvd3MgVWlPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBVaU9iamVjdDIgY29sb3JTcGlubmVyID0gZmluZFVpT2JqZWN0KEJ5LnJlcygiY29tLmFuZHJvaWQucHJpbnRzcG9vbGVyOmlkL2NvbG9yX3NwaW5uZXIiKSk7CisgICAgICAgIHJldHVybiBjb2xvclNwaW5uZXIuZ2V0VGV4dCgpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGNoYW5nZUR1cGxleChTdHJpbmcgZHVwbGV4KSB0aHJvd3MgVWlPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBVaU9iamVjdDIgZHVwbGV4U3Bpbm5lciA9IGZpbmRVaU9iamVjdChCeS5yZXMoCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLnByaW50c3Bvb2xlcjppZC9kdXBsZXhfc3Bpbm5lciIpKTsKKyAgICAgICAgZHVwbGV4U3Bpbm5lci5jbGljaygpOworICAgICAgICBVaU9iamVjdDIgZHVwbGV4T3B0aW9uID0gZmluZFVpT2JqZWN0KEJ5LnRleHQoZHVwbGV4KSk7CisgICAgICAgIGR1cGxleE9wdGlvbi5jbGljaygpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGNoYW5nZUNvcGllcyhpbnQgbmV3Q29waWVzKSB0aHJvd3MgVWlPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBVaU9iamVjdDIgY29waWVzID0gZmluZFVpT2JqZWN0KEJ5LnJlcygiY29tLmFuZHJvaWQucHJpbnRzcG9vbGVyOmlkL2NvcGllc19lZGl0dGV4dCIpKTsKKyAgICAgICAgY29waWVzLnNldFRleHQoSW50ZWdlci52YWx1ZU9mKG5ld0NvcGllcykudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDb3BpZXMoKSB0aHJvd3MgVWlPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBVaU9iamVjdDIgY29waWVzID0gZmluZFVpT2JqZWN0KEJ5LnJlcygiY29tLmFuZHJvaWQucHJpbnRzcG9vbGVyOmlkL2NvcGllc19lZGl0dGV4dCIpKTsKKyAgICAgICAgcmV0dXJuIGNvcGllcy5nZXRUZXh0KCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0Tm9QcmludEJ1dHRvbigpIHRocm93cyBVaU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEZhbHNlKGdldFVpRGV2aWNlKCkuaGFzT2JqZWN0KEJ5LnJlcygiY29tLmFuZHJvaWQucHJpbnRzcG9vbGVyOmlkL3ByaW50X2J1dHRvbiIpKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xpY2tQcmludEJ1dHRvbigpIHRocm93cyBVaU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFVpT2JqZWN0MiBwcmludEJ1dHRvbiA9IGZpbmRVaU9iamVjdChCeS5yZXMoImNvbS5hbmRyb2lkLnByaW50c3Bvb2xlcjppZC9wcmludF9idXR0b24iKSk7CisgICAgICAgIHByaW50QnV0dG9uLmNsaWNrKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgY2xpY2tSZXRyeUJ1dHRvbigpIHRocm93cyBVaU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFVpT2JqZWN0MiByZXRyeUJ1dHRvbiA9IGZpbmRVaU9iamVjdChCeS5yZXMoImNvbS5hbmRyb2lkLnByaW50c3Bvb2xlcjppZC9hY3Rpb25fYnV0dG9uIikpOworICAgICAgICByZXRyeUJ1dHRvbi5jbGljaygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGR1bXBXaW5kb3dIaWVyYXJjaHkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIGdldFVpRGV2aWNlKCkuZHVtcFdpbmRvd0hpZXJhcmNoeShvcyk7CisKKyAgICAgICAgTG9nLncoTE9HX1RBRywgIldpbmRvdyBoaWVyYXJjaHk6Iik7CisgICAgICAgIGZvciAoU3RyaW5nIGxpbmUgOiBvcy50b1N0cmluZygiVVRGLTgiKS5zcGxpdCgiXG4iKSkgeworICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgbGluZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgUHJpbnREb2N1bWVudEFjdGl2aXR5IGdldEFjdGl2aXR5KCkgeworICAgICAgICByZXR1cm4gbUFjdGl2aXR5OworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUFjdGl2aXR5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgTG9nLmQoTE9HX1RBRywgImNyZWF0ZUFjdGl2aXR5KCkiKTsKKworICAgICAgICBpbnQgY3JlYXRlQmVmb3JlID0gZ2V0QWN0aXZpdHlDcmVhdGVDYWxsYmFja0NhbGxDb3VudCgpOworCisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEludGVudC5BQ1RJT05fTUFJTik7CisgICAgICAgIGludGVudC5wdXRFeHRyYShURVNUX0lELCBtVGVzdElkKTsKKworICAgICAgICBJbnN0cnVtZW50YXRpb24gaW5zdHJ1bWVudGF0aW9uID0gZ2V0SW5zdHJ1bWVudGF0aW9uKCk7CisKKyAgICAgICAgLy8gVW5sb2NrIHNjcmVlbi4KKyAgICAgICAgU3lzdGVtVXRpbC5ydW5TaGVsbENvbW1hbmQoaW5zdHJ1bWVudGF0aW9uLCAiaW5wdXQga2V5ZXZlbnQgS0VZQ09ERV9XQUtFVVAiKTsKKworICAgICAgICBpbnRlbnQuc2V0Q2xhc3NOYW1lKGluc3RydW1lbnRhdGlvbi5nZXRUYXJnZXRDb250ZXh0KCkuZ2V0UGFja2FnZU5hbWUoKSwKKyAgICAgICAgICAgICAgICBQcmludERvY3VtZW50QWN0aXZpdHkuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLKTsKKyAgICAgICAgaW5zdHJ1bWVudGF0aW9uLnN0YXJ0QWN0aXZpdHlTeW5jKGludGVudCk7CisKKyAgICAgICAgd2FpdEZvckFjdGl2aXR5Q3JlYXRlQ2FsbGJhY2tDYWxsZWQoY3JlYXRlQmVmb3JlICsgMSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgb3BlblByaW50T3B0aW9ucygpIHRocm93cyBVaU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFVpT2JqZWN0MiBleHBhbmRIYW5kbGUgPSBmaW5kVWlPYmplY3QoQnkucmVzKAorICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5wcmludHNwb29sZXI6aWQvZXhwYW5kX2NvbGxhcHNlX2hhbmRsZSIpKTsKKyAgICAgICAgZXhwYW5kSGFuZGxlLmNsaWNrKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgb3BlbkN1c3RvbVByaW50T3B0aW9ucygpIHRocm93cyBVaU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFVpT2JqZWN0MiBleHBhbmRIYW5kbGUgPSBmaW5kVWlPYmplY3QoQnkucmVzKAorICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5wcmludHNwb29sZXI6aWQvbW9yZV9vcHRpb25zX2J1dHRvbiIpKTsKKyAgICAgICAgZXhwYW5kSGFuZGxlLmNsaWNrKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGNsZWFyUHJpbnRTcG9vbGVyRGF0YSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VNYW5hZ2VyKCkuaGFzU3lzdGVtRmVhdHVyZSgKKyAgICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfUFJJTlRJTkcpKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJmYWlsZWQgdG8gY2xlYXIgcHJpbnQgc3Bvb2xlciBkYXRhIiwKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtVXRpbC5ydW5TaGVsbENvbW1hbmQoZ2V0SW5zdHJ1bWVudGF0aW9uKCksIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBtIGNsZWFyIC0tdXNlciAlZCAlcyIsIENVUlJFTlRfVVNFUl9JRCwgUFJJTlRfU1BPT0xFUl9QQUNLQUdFX05BTUUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb250YWlucyhQTV9DTEVBUl9TVUNDRVNTX09VVFBVVCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgdmVyaWZ5TGF5b3V0Q2FsbChJbk9yZGVyIGluT3JkZXIsIFByaW50RG9jdW1lbnRBZGFwdGVyIG1vY2ssCisgICAgICAgICAgICBQcmludEF0dHJpYnV0ZXMgb2xkQXR0cmlidXRlcywgUHJpbnRBdHRyaWJ1dGVzIG5ld0F0dHJpYnV0ZXMsCisgICAgICAgICAgICBmaW5hbCBib29sZWFuIGZvclByZXZpZXcpIHsKKyAgICAgICAgaW5PcmRlci52ZXJpZnkobW9jaykub25MYXlvdXQoZXEob2xkQXR0cmlidXRlcyksIGVxKG5ld0F0dHJpYnV0ZXMpLAorICAgICAgICAgICAgICAgIGFueShDYW5jZWxsYXRpb25TaWduYWwuY2xhc3MpLCBhbnkoTGF5b3V0UmVzdWx0Q2FsbGJhY2suY2xhc3MpLCBhcmdUaGF0KAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJhc2VNYXRjaGVyPEJ1bmRsZT4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhPYmplY3QgaXRlbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gKEJ1bmRsZSkgaXRlbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZvclByZXZpZXcgPT0gYnVuZGxlLmdldEJvb2xlYW4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnREb2N1bWVudEFkYXB0ZXIuRVhUUkFfUFJJTlRfUFJFVklFVyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZGVzY3JpYmVUbyhEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkbyBub3RoaW5nICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSkpOworICAgIH0KKworICAgIHByb3RlY3RlZCBQcmludERvY3VtZW50QWRhcHRlciBjcmVhdGVNb2NrUHJpbnREb2N1bWVudEFkYXB0ZXIoQW5zd2VyPFZvaWQ+IGxheW91dEFuc3dlciwKKyAgICAgICAgICAgIEFuc3dlcjxWb2lkPiB3cml0ZUFuc3dlciwgQW5zd2VyPFZvaWQ+IGZpbmlzaEFuc3dlcikgeworICAgICAgICAvLyBDcmVhdGUgYSBtb2NrIHByaW50IGFkYXB0ZXIuCisgICAgICAgIFByaW50RG9jdW1lbnRBZGFwdGVyIGFkYXB0ZXIgPSBtb2NrKFByaW50RG9jdW1lbnRBZGFwdGVyLmNsYXNzKTsKKyAgICAgICAgaWYgKGxheW91dEFuc3dlciAhPSBudWxsKSB7CisgICAgICAgICAgICBkb0Fuc3dlcihsYXlvdXRBbnN3ZXIpLndoZW4oYWRhcHRlcikub25MYXlvdXQoYW55KFByaW50QXR0cmlidXRlcy5jbGFzcyksCisgICAgICAgICAgICAgICAgICAgIGFueShQcmludEF0dHJpYnV0ZXMuY2xhc3MpLCBhbnkoQ2FuY2VsbGF0aW9uU2lnbmFsLmNsYXNzKSwKKyAgICAgICAgICAgICAgICAgICAgYW55KExheW91dFJlc3VsdENhbGxiYWNrLmNsYXNzKSwgYW55KEJ1bmRsZS5jbGFzcykpOworICAgICAgICB9CisgICAgICAgIGlmICh3cml0ZUFuc3dlciAhPSBudWxsKSB7CisgICAgICAgICAgICBkb0Fuc3dlcih3cml0ZUFuc3dlcikud2hlbihhZGFwdGVyKS5vbldyaXRlKGFueShQYWdlUmFuZ2VbXS5jbGFzcyksCisgICAgICAgICAgICAgICAgICAgIGFueShQYXJjZWxGaWxlRGVzY3JpcHRvci5jbGFzcyksIGFueShDYW5jZWxsYXRpb25TaWduYWwuY2xhc3MpLAorICAgICAgICAgICAgICAgICAgICBhbnkoV3JpdGVSZXN1bHRDYWxsYmFjay5jbGFzcykpOworICAgICAgICB9CisgICAgICAgIGlmIChmaW5pc2hBbnN3ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgZG9BbnN3ZXIoZmluaXNoQW5zd2VyKS53aGVuKGFkYXB0ZXIpLm9uRmluaXNoKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFkYXB0ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbW9jayB7QGxpbmsgUHJpbnREb2N1bWVudEFkYXB0ZXJ9IHRoYXQgcHJvdmlkZXMgb25lIGVtcHR5IHBhZ2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBtb2NrIGFkYXB0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgQE5vbk51bGwgUHJpbnREb2N1bWVudEFkYXB0ZXIgY3JlYXRlRGVmYXVsdFByaW50RG9jdW1lbnRBZGFwdGVyKGludCBudW1QYWdlcykgeworICAgICAgICBmaW5hbCBQcmludEF0dHJpYnV0ZXNbXSBwcmludEF0dHJpYnV0ZXMgPSBuZXcgUHJpbnRBdHRyaWJ1dGVzWzFdOworCisgICAgICAgIHJldHVybiBjcmVhdGVNb2NrUHJpbnREb2N1bWVudEFkYXB0ZXIoCisgICAgICAgICAgICAgICAgaW52b2NhdGlvbiAtPiB7CisgICAgICAgICAgICAgICAgICAgIFByaW50QXR0cmlidXRlcyBvbGRBdHRyaWJ1dGVzID0gKFByaW50QXR0cmlidXRlcykgaW52b2NhdGlvbi5nZXRBcmd1bWVudHMoKVswXTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRBdHRyaWJ1dGVzWzBdID0gKFByaW50QXR0cmlidXRlcykgaW52b2NhdGlvbi5nZXRBcmd1bWVudHMoKVsxXTsKKyAgICAgICAgICAgICAgICAgICAgTGF5b3V0UmVzdWx0Q2FsbGJhY2sgY2FsbGJhY2sgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMYXlvdXRSZXN1bHRDYWxsYmFjaykgaW52b2NhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEFyZ3VtZW50cygpWzNdOworCisgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uTGF5b3V0RmluaXNoZWQobmV3IFByaW50RG9jdW1lbnRJbmZvLkJ1aWxkZXIoUFJJTlRfSk9CX05BTUUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFBhZ2VDb3VudChudW1QYWdlcykuYnVpbGQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAhb2xkQXR0cmlidXRlcy5lcXVhbHMocHJpbnRBdHRyaWJ1dGVzWzBdKSk7CisKKyAgICAgICAgICAgICAgICAgICAgb2xkQXR0cmlidXRlcyA9IHByaW50QXR0cmlidXRlc1swXTsKKworICAgICAgICAgICAgICAgICAgICBvbkxheW91dENhbGxlZCgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9LCBpbnZvY2F0aW9uIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gYXJncyA9IGludm9jYXRpb24uZ2V0QXJndW1lbnRzKCk7CisgICAgICAgICAgICAgICAgICAgIFBhZ2VSYW5nZVtdIHBhZ2VzID0gKFBhZ2VSYW5nZVtdKSBhcmdzWzBdOworICAgICAgICAgICAgICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBmZCA9IChQYXJjZWxGaWxlRGVzY3JpcHRvcikgYXJnc1sxXTsKKyAgICAgICAgICAgICAgICAgICAgV3JpdGVSZXN1bHRDYWxsYmFjayBjYWxsYmFjayA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdyaXRlUmVzdWx0Q2FsbGJhY2spIGFyZ3NbM107CisKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVCbGFua1BhZ2VzKHByaW50QXR0cmlidXRlc1swXSwgZmQsIHBhZ2VzWzBdLmdldFN0YXJ0KCksIHBhZ2VzWzBdLmdldEVuZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgZmQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25Xcml0ZUZpbmlzaGVkKHBhZ2VzKTsKKworICAgICAgICAgICAgICAgICAgICBvbldyaXRlQ2FsbGVkKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0sIGludm9jYXRpb24gLT4geworICAgICAgICAgICAgICAgICAgICBvbkZpbmlzaENhbGxlZCgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwcm90ZWN0ZWQgc3RhdGljIFByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uQ2FsbGJhY2tzIGNyZWF0ZU1vY2tQcmludGVyRGlzY292ZXJ5U2Vzc2lvbkNhbGxiYWNrcygKKyAgICAgICAgICAgIEFuc3dlcjxWb2lkPiBvblN0YXJ0UHJpbnRlckRpc2NvdmVyeSwgQW5zd2VyPFZvaWQ+IG9uU3RvcFByaW50ZXJEaXNjb3ZlcnksCisgICAgICAgICAgICBBbnN3ZXI8Vm9pZD4gb25WYWxpZGF0ZVByaW50ZXJzLCBBbnN3ZXI8Vm9pZD4gb25TdGFydFByaW50ZXJTdGF0ZVRyYWNraW5nLAorICAgICAgICAgICAgQW5zd2VyPFZvaWQ+IG9uUmVxdWVzdEN1c3RvbVByaW50ZXJJY29uLCBBbnN3ZXI8Vm9pZD4gb25TdG9wUHJpbnRlclN0YXRlVHJhY2tpbmcsCisgICAgICAgICAgICBBbnN3ZXI8Vm9pZD4gb25EZXN0cm95KSB7CisgICAgICAgIFByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uQ2FsbGJhY2tzIGNhbGxiYWNrcyA9IG1vY2soUHJpbnRlckRpc2NvdmVyeVNlc3Npb25DYWxsYmFja3MuY2xhc3MpOworCisgICAgICAgIGRvQ2FsbFJlYWxNZXRob2QoKS53aGVuKGNhbGxiYWNrcykuc2V0U2Vzc2lvbihhbnkoU3R1YmJhYmxlUHJpbnRlckRpc2NvdmVyeVNlc3Npb24uY2xhc3MpKTsKKyAgICAgICAgd2hlbihjYWxsYmFja3MuZ2V0U2Vzc2lvbigpKS50aGVuQ2FsbFJlYWxNZXRob2QoKTsKKworICAgICAgICBpZiAob25TdGFydFByaW50ZXJEaXNjb3ZlcnkgIT0gbnVsbCkgeworICAgICAgICAgICAgZG9BbnN3ZXIob25TdGFydFByaW50ZXJEaXNjb3ZlcnkpLndoZW4oY2FsbGJhY2tzKS5vblN0YXJ0UHJpbnRlckRpc2NvdmVyeSgKKyAgICAgICAgICAgICAgICAgICAgYW55KExpc3QuY2xhc3MpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAob25TdG9wUHJpbnRlckRpc2NvdmVyeSAhPSBudWxsKSB7CisgICAgICAgICAgICBkb0Fuc3dlcihvblN0b3BQcmludGVyRGlzY292ZXJ5KS53aGVuKGNhbGxiYWNrcykub25TdG9wUHJpbnRlckRpc2NvdmVyeSgpOworICAgICAgICB9CisgICAgICAgIGlmIChvblZhbGlkYXRlUHJpbnRlcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgZG9BbnN3ZXIob25WYWxpZGF0ZVByaW50ZXJzKS53aGVuKGNhbGxiYWNrcykub25WYWxpZGF0ZVByaW50ZXJzKAorICAgICAgICAgICAgICAgICAgICBhbnkoTGlzdC5jbGFzcykpOworICAgICAgICB9CisgICAgICAgIGlmIChvblN0YXJ0UHJpbnRlclN0YXRlVHJhY2tpbmcgIT0gbnVsbCkgeworICAgICAgICAgICAgZG9BbnN3ZXIob25TdGFydFByaW50ZXJTdGF0ZVRyYWNraW5nKS53aGVuKGNhbGxiYWNrcykub25TdGFydFByaW50ZXJTdGF0ZVRyYWNraW5nKAorICAgICAgICAgICAgICAgICAgICBhbnkoUHJpbnRlcklkLmNsYXNzKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9uUmVxdWVzdEN1c3RvbVByaW50ZXJJY29uICE9IG51bGwpIHsKKyAgICAgICAgICAgIGRvQW5zd2VyKG9uUmVxdWVzdEN1c3RvbVByaW50ZXJJY29uKS53aGVuKGNhbGxiYWNrcykub25SZXF1ZXN0Q3VzdG9tUHJpbnRlckljb24oCisgICAgICAgICAgICAgICAgICAgIGFueShQcmludGVySWQuY2xhc3MpLCBhbnkoQ2FuY2VsbGF0aW9uU2lnbmFsLmNsYXNzKSwKKyAgICAgICAgICAgICAgICAgICAgYW55KEN1c3RvbVByaW50ZXJJY29uQ2FsbGJhY2suY2xhc3MpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAob25TdG9wUHJpbnRlclN0YXRlVHJhY2tpbmcgIT0gbnVsbCkgeworICAgICAgICAgICAgZG9BbnN3ZXIob25TdG9wUHJpbnRlclN0YXRlVHJhY2tpbmcpLndoZW4oY2FsbGJhY2tzKS5vblN0b3BQcmludGVyU3RhdGVUcmFja2luZygKKyAgICAgICAgICAgICAgICAgICAgYW55KFByaW50ZXJJZC5jbGFzcykpOworICAgICAgICB9CisgICAgICAgIGlmIChvbkRlc3Ryb3kgIT0gbnVsbCkgeworICAgICAgICAgICAgZG9BbnN3ZXIob25EZXN0cm95KS53aGVuKGNhbGxiYWNrcykub25EZXN0cm95KCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY2FsbGJhY2tzOworICAgIH0KKworICAgIHByb3RlY3RlZCBQcmludFNlcnZpY2VDYWxsYmFja3MgY3JlYXRlTW9ja1ByaW50U2VydmljZUNhbGxiYWNrcygKKyAgICAgICAgICAgIEFuc3dlcjxQcmludGVyRGlzY292ZXJ5U2Vzc2lvbkNhbGxiYWNrcz4gb25DcmVhdGVQcmludGVyRGlzY292ZXJ5U2Vzc2lvbkNhbGxiYWNrcywKKyAgICAgICAgICAgIEFuc3dlcjxWb2lkPiBvblByaW50Sm9iUXVldWVkLCBBbnN3ZXI8Vm9pZD4gb25SZXF1ZXN0Q2FuY2VsUHJpbnRKb2IpIHsKKyAgICAgICAgZmluYWwgUHJpbnRTZXJ2aWNlQ2FsbGJhY2tzIHNlcnZpY2UgPSBtb2NrKFByaW50U2VydmljZUNhbGxiYWNrcy5jbGFzcyk7CisKKyAgICAgICAgZG9DYWxsUmVhbE1ldGhvZCgpLndoZW4oc2VydmljZSkuc2V0U2VydmljZShhbnkoU3R1YmJhYmxlUHJpbnRTZXJ2aWNlLmNsYXNzKSk7CisgICAgICAgIHdoZW4oc2VydmljZS5nZXRTZXJ2aWNlKCkpLnRoZW5DYWxsUmVhbE1ldGhvZCgpOworCisgICAgICAgIGlmIChvbkNyZWF0ZVByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uQ2FsbGJhY2tzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGRvQW5zd2VyKG9uQ3JlYXRlUHJpbnRlckRpc2NvdmVyeVNlc3Npb25DYWxsYmFja3MpLndoZW4oc2VydmljZSkKKyAgICAgICAgICAgICAgICAgICAgLm9uQ3JlYXRlUHJpbnRlckRpc2NvdmVyeVNlc3Npb25DYWxsYmFja3MoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAob25QcmludEpvYlF1ZXVlZCAhPSBudWxsKSB7CisgICAgICAgICAgICBkb0Fuc3dlcihvblByaW50Sm9iUXVldWVkKS53aGVuKHNlcnZpY2UpLm9uUHJpbnRKb2JRdWV1ZWQoYW55KFByaW50Sm9iLmNsYXNzKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9uUmVxdWVzdENhbmNlbFByaW50Sm9iICE9IG51bGwpIHsKKyAgICAgICAgICAgIGRvQW5zd2VyKG9uUmVxdWVzdENhbmNlbFByaW50Sm9iKS53aGVuKHNlcnZpY2UpLm9uUmVxdWVzdENhbmNlbFByaW50Sm9iKAorICAgICAgICAgICAgICAgICAgICBhbnkoUHJpbnRKb2IuY2xhc3MpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzZXJ2aWNlOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlQmxhbmtQYWdlcyhQcmludEF0dHJpYnV0ZXMgY29uc3RyYWludHMsIFBhcmNlbEZpbGVEZXNjcmlwdG9yIG91dHB1dCwKKyAgICAgICAgICAgIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBQcmludGVkUGRmRG9jdW1lbnQgZG9jdW1lbnQgPSBuZXcgUHJpbnRlZFBkZkRvY3VtZW50KGdldEFjdGl2aXR5KCksIGNvbnN0cmFpbnRzKTsKKyAgICAgICAgZmluYWwgaW50IHBhZ2VDb3VudCA9IHRvSW5kZXggLSBmcm9tSW5kZXggKyAxOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhZ2VDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBQZGZEb2N1bWVudC5QYWdlIHBhZ2UgPSBkb2N1bWVudC5zdGFydFBhZ2UoaSk7CisgICAgICAgICAgICBkb2N1bWVudC5maW5pc2hQYWdlKHBhZ2UpOworICAgICAgICB9CisgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0cHV0LmdldEZpbGVEZXNjcmlwdG9yKCkpOworICAgICAgICBkb2N1bWVudC53cml0ZVRvKGZvcyk7CisgICAgICAgIGZvcy5mbHVzaCgpOworICAgICAgICBkb2N1bWVudC5jbG9zZSgpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHNlbGVjdFBhZ2VzKFN0cmluZyBwYWdlcywgaW50IHRvdGFsUGFnZXMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBVaU9iamVjdDIgcGFnZXNTcGlubmVyID0gZmluZFVpT2JqZWN0KEJ5LnJlcygKKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQucHJpbnRzcG9vbGVyOmlkL3JhbmdlX29wdGlvbnNfc3Bpbm5lciIpKTsKKyAgICAgICAgcGFnZXNTcGlubmVyLmNsaWNrKCk7CisKKyAgICAgICAgVWlPYmplY3QyIHJhbmdlT3B0aW9uID0gZmluZFVpT2JqZWN0KEJ5LnRleHRDb250YWlucygiUmFuZ2Ugb2YgIiArIHRvdGFsUGFnZXMpKTsKKyAgICAgICAgcmFuZ2VPcHRpb24uY2xpY2soKTsKKworICAgICAgICBVaU9iamVjdDIgcGFnZXNFZGl0VGV4dCA9IGZpbmRVaU9iamVjdChCeS5yZXMoCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLnByaW50c3Bvb2xlcjppZC9wYWdlX3JhbmdlX2VkaXR0ZXh0IikpOworICAgICAgICBwYWdlc0VkaXRUZXh0LnNldFRleHQocGFnZXMpOworCisgICAgICAgIC8vIEhpZGUgdGhlIGtleWJvYXJkLgorICAgICAgICBnZXRVaURldmljZSgpLnByZXNzQmFjaygpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIENhbGxDb3VudGVyIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbUxvY2sgPSBuZXcgT2JqZWN0KCk7CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgbUNhbGxDb3VudDsKKworICAgICAgICBwdWJsaWMgdm9pZCBjYWxsKCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgICAgIG1DYWxsQ291bnQrKzsKKyAgICAgICAgICAgICAgICBtTG9jay5ub3RpZnlBbGwoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGludCBnZXRDYWxsQ291bnQoKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1DYWxsQ291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgICAgICBtQ2FsbENvdW50ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHdhaXRGb3JDb3VudChpbnQgY291bnQsIGxvbmcgdGltZW91dE1pbGxpcykgdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24geworICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgc3RhcnRUaW1lTWlsbGlzID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKG1DYWxsQ291bnQgPCBjb3VudCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBlbGFwc2VkVGltZU1pbGxpcyA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpIC0gc3RhcnRUaW1lTWlsbGlzOworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgbG9uZyByZW1haW5pbmdUaW1lTWlsbGlzID0gdGltZW91dE1pbGxpcyAtIGVsYXBzZWRUaW1lTWlsbGlzOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbWFpbmluZ1RpbWVNaWxsaXMgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUaW1lb3V0RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBtTG9jay53YWl0KHRpbWVvdXRNaWxsaXMpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogaWdub3JlICovCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIE1ha2Uge0Bjb2RlIHByaW50ZXJOYW1lfSB0aGUgZGVmYXVsdCBwcmludGVyIGJ5IGFkZGluZyBpdCB0byB0aGUgaGlzdG9yeSBvZiBwcmludGVycyBieQorICAgICAqIHByaW50aW5nIG9uY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRhcHRlciBUaGUge0BsaW5rIFByaW50RG9jdW1lbnRBZGFwdGVyfSB1c2VkCisgICAgICogQHRocm93cyBFeGNlcHRpb24gSWYgdGhlIHByaW50ZXIgY291bGQgbm90IGJlIG1hZGUgZGVmYXVsdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG1ha2VEZWZhdWx0UHJpbnRlcihQcmludERvY3VtZW50QWRhcHRlciBhZGFwdGVyLCBTdHJpbmcgcHJpbnRlck5hbWUpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gUGVyZm9ybSBhIGZ1bGwgcHJpbnQgb3BlcmF0aW9uIG9uIHRoZSBwcmludGVyCisgICAgICAgIExvZy5kKExPR19UQUcsICJwcmludCIpOworICAgICAgICBwcmludChhZGFwdGVyKTsKKyAgICAgICAgTG9nLmQoTE9HX1RBRywgIndhaXRGb3JXcml0ZUFkYXB0ZXJDYWxsYmFjayIpOworICAgICAgICB3YWl0Rm9yV3JpdGVBZGFwdGVyQ2FsbGJhY2soMSk7CisgICAgICAgIExvZy5kKExPR19UQUcsICJzZWxlY3RQcmludGVyIik7CisgICAgICAgIHNlbGVjdFByaW50ZXIocHJpbnRlck5hbWUpOworICAgICAgICBMb2cuZChMT0dfVEFHLCAiY2xpY2tQcmludEJ1dHRvbiIpOworICAgICAgICBjbGlja1ByaW50QnV0dG9uKCk7CisgICAgICAgIExvZy5kKExPR19UQUcsICJhbnN3ZXJQcmludFNlcnZpY2VzV2FybmluZyIpOworICAgICAgICBhbnN3ZXJQcmludFNlcnZpY2VzV2FybmluZyh0cnVlKTsKKyAgICAgICAgTG9nLmQoTE9HX1RBRywgIndhaXRGb3JQcmludGVyRGlzY292ZXJ5U2Vzc2lvbkRlc3Ryb3lDYWxsYmFja0NhbGxlZCIpOworICAgICAgICB3YWl0Rm9yUHJpbnRlckRpc2NvdmVyeVNlc3Npb25EZXN0cm95Q2FsbGJhY2tDYWxsZWQoMSk7CisKKyAgICAgICAgLy8gU3dpdGNoIHRvIG5ldyBhY3Rpdml0eSwgd2hpY2ggc2hvdWxkIG5vdyB1c2UgdGhlIGRlZmF1bHQgcHJpbnRlcgorICAgICAgICBMb2cuZChMT0dfVEFHLCAiZ2V0QWN0aXZpdHkoKS5maW5pc2goKSIpOworICAgICAgICBnZXRBY3Rpdml0eSgpLmZpbmlzaCgpOworCisgICAgICAgIGNyZWF0ZUFjdGl2aXR5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQW5ub3RhdGlvbiB1c2VkIHRvIHNpZ25hbCB0aGF0IGEgdGVzdCBkb2VzIG5vdCBuZWVkIGFuIGFjdGl2aXR5LgorICAgICAqLworICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCisgICAgQFRhcmdldChFbGVtZW50VHlwZS5NRVRIT0QpCisgICAgcHJvdGVjdGVkIEBpbnRlcmZhY2UgTm9BY3Rpdml0eSB7IH0KKworICAgIC8qKgorICAgICAqIFJ1bGUgdGhhdCBoYW5kbGVzIHRoZSB7QGxpbmsgTm9BY3Rpdml0eX0gYW5ub3RhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTaG91bGRTdGFydEFjdGl2aXR5IGltcGxlbWVudHMgVGVzdFJ1bGUgeworICAgICAgICBib29sZWFuIG1Ob0FjdGl2aXR5OworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RhdGVtZW50IGFwcGx5KFN0YXRlbWVudCBiYXNlLCBvcmcuanVuaXQucnVubmVyLkRlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7CisgICAgICAgICAgICBmb3IgKEFubm90YXRpb24gYW5ub3RhdGlvbiA6IGRlc2NyaXB0aW9uLmdldEFubm90YXRpb25zKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIE5vQWN0aXZpdHkpIHsKKyAgICAgICAgICAgICAgICAgICAgbU5vQWN0aXZpdHkgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBiYXNlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcHJpbnQvcHJpbnRUZXN0VXRpbExpYi9zcmMvYW5kcm9pZC9wcmludC90ZXN0L1ByaW50RG9jdW1lbnRBY3Rpdml0eS5qYXZhIGIvdGVzdHMvdGVzdHMvcHJpbnQvcHJpbnRUZXN0VXRpbExpYi9zcmMvYW5kcm9pZC9wcmludC90ZXN0L1ByaW50RG9jdW1lbnRBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMzY3MzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9wcmludC9wcmludFRlc3RVdGlsTGliL3NyYy9hbmRyb2lkL3ByaW50L3Rlc3QvUHJpbnREb2N1bWVudEFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5wcmludC50ZXN0OworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuS2V5Z3VhcmRNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOworCitwdWJsaWMgY2xhc3MgUHJpbnREb2N1bWVudEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIlByaW50RG9jdW1lbnRBY3Rpdml0eSI7CisgICAgaW50IG1UZXN0SWQ7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgbVRlc3RJZCA9IGdldEludGVudCgpLmdldEludEV4dHJhKEJhc2VQcmludFRlc3QuVEVTVF9JRCwgLTEpOworICAgICAgICBMb2cuZChMT0dfVEFHLCAib25DcmVhdGUoKSAiICsgdGhpcyArICIgZm9yICIgKyBtVGVzdElkKTsKKworICAgICAgICBnZXRXaW5kb3coKS5hZGRGbGFncyhXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0tFRVBfU0NSRUVOX09OCisgICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX1RVUk5fU0NSRUVOX09OKTsKKworICAgICAgICBLZXlndWFyZE1hbmFnZXIga20gPSBnZXRTeXN0ZW1TZXJ2aWNlKEtleWd1YXJkTWFuYWdlci5jbGFzcyk7CisgICAgICAgIGlmIChrbSAhPSBudWxsKSB7CisgICAgICAgICAgICBrbS5yZXF1ZXN0RGlzbWlzc0tleWd1YXJkKHRoaXMsIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgQmFzZVByaW50VGVzdC5vbkFjdGl2aXR5Q3JlYXRlQ2FsbGVkKG1UZXN0SWQsIHRoaXMpOworCisgICAgICAgIGlmIChzYXZlZEluc3RhbmNlU3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywKKyAgICAgICAgICAgICAgICAgICAgIldlIGNhbm5vdCBkZWFsIHdpdGggbGlmZWN5Y2xlLiBIZW5jZSBmaW5pc2hpbmcgIiArIHRoaXMgKyAiIGZvciAiICsgbVRlc3RJZCk7CisgICAgICAgICAgICBmaW5pc2goKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQoQ29uZmlndXJhdGlvbiBuZXdDb25maWcpIHsKKyAgICAgICAgc3VwZXIub25Db25maWd1cmF0aW9uQ2hhbmdlZChuZXdDb25maWcpOworCisgICAgICAgIExvZy5kKExPR19UQUcsICJvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKCIgKyBuZXdDb25maWcgKyAiKSIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uRGVzdHJveSgpIHsKKyAgICAgICAgTG9nLmQoTE9HX1RBRywgIm9uRGVzdHJveSgpICIgKyB0aGlzKTsKKyAgICAgICAgQmFzZVByaW50VGVzdC5vbkFjdGl2aXR5RGVzdHJveUNhbGxlZChtVGVzdElkKTsKKyAgICAgICAgc3VwZXIub25EZXN0cm95KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcHJpbnQvcHJpbnRUZXN0VXRpbExpYi9zcmMvYW5kcm9pZC9wcmludC90ZXN0L1V0aWxzLmphdmEgYi90ZXN0cy90ZXN0cy9wcmludC9wcmludFRlc3RVdGlsTGliL3NyYy9hbmRyb2lkL3ByaW50L3Rlc3QvVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTQwYmFkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvcHJpbnQvcHJpbnRUZXN0VXRpbExpYi9zcmMvYW5kcm9pZC9wcmludC90ZXN0L1V0aWxzLmphdmEKQEAgLTAsMCArMSwxNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQucHJpbnQudGVzdDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLnByaW50LlByaW50Sm9iOworaW1wb3J0IGFuZHJvaWQucHJpbnQuUHJpbnRNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTm9uTnVsbDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisvKioKKyAqIFV0aWxpdGllcyBmb3IgcHJpbnQgdGVzdHMKKyAqLworcHVibGljIGNsYXNzIFV0aWxzIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJVdGlscyI7CisKKyAgICAvKioKKyAgICAgKiBBIHtAbGluayBSdW5uYWJsZX0gdGhhdCBjYW4gdGhyb3cgYW4ge0BsaW5rIFRocm93YWJsZX0uCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBJbnZva2FibGUgeworICAgICAgICB2b2lkIHJ1bigpIHRocm93cyBUaHJvd2FibGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUnVuIGEge0BsaW5rIEludm9rYWJsZX0gYW5kIGV4cGVjdCBhbmQge0BsaW5rIFRocm93YWJsZX0gb2YgYSBjZXJ0YWluIHR5cGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gciAgICAgICAgICAgICBUaGUge0BsaW5rIEludm9rYWJsZX0gdG8gcnVuCisgICAgICogQHBhcmFtIGV4cGVjdGVkQ2xhc3MgVGhlIGV4cGVjdGVkIHtAbGluayBUaHJvd2FibGV9IHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0RXhjZXB0aW9uKEBOb25OdWxsIEludm9rYWJsZSByLAorICAgICAgICAgICAgQE5vbk51bGwgQ2xhc3M8PyBleHRlbmRzIFRocm93YWJsZT4gZXhwZWN0ZWRDbGFzcykgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByLnJ1bigpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgeworICAgICAgICAgICAgaWYgKGUuZ2V0Q2xhc3MoKS5pc0Fzc2lnbmFibGVGcm9tKGV4cGVjdGVkQ2xhc3MpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiRXhwZWN0ZWQ6ICIgKyBleHBlY3RlZENsYXNzLmdldE5hbWUoKSArICIsIGdvdDogIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJObyB0aHJvd2FibGUgdGhyb3duIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUnVuIGEge0BsaW5rIEludm9rYWJsZX0gb24gdGhlIG1haW4gdGhyZWFkIGFuZCBmb3J3YXJkIHRoZSB7QGxpbmsgVGhyb3dhYmxlfSBpZiBvbmUgd2FzCisgICAgICogdGhyb3duLgorICAgICAqCisgICAgICogQHBhcmFtIHIgVGhlIHtAbGluayBJbnZva2FibGV9IHRvIHJ1bgorICAgICAqCisgICAgICogQHRocm93cyBUaHJvd2FibGUgSWYgdGhlIHtAbGluayBSdW5uYWJsZX0gY2F1c2VkIGFuIGlzc3VlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHJ1bk9uTWFpblRocmVhZChATm9uTnVsbCBmaW5hbCBJbnZva2FibGUgcikgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGZpbmFsIE9iamVjdCBzeW5jaHJvbml6ZXIgPSBuZXcgT2JqZWN0KCk7CisgICAgICAgIGZpbmFsIFRocm93YWJsZVtdIHRocm93biA9IG5ldyBUaHJvd2FibGVbMV07CisKKyAgICAgICAgc3luY2hyb25pemVkIChzeW5jaHJvbml6ZXIpIHsKKyAgICAgICAgICAgIChuZXcgSGFuZGxlcihMb29wZXIuZ2V0TWFpbkxvb3BlcigpKSkucG9zdCgoKSAtPiB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChzeW5jaHJvbml6ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIucnVuKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd25bMF0gPSB0OworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVyLm5vdGlmeSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICBzeW5jaHJvbml6ZXIud2FpdCgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRocm93blswXSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyB0aHJvd25bMF07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYWtlIHN1cmUgdGhhdCBhIHtAbGluayBJbnZva2FibGV9IGV2ZW50dWFsbHkgZmluaXNoZXMgd2l0aG91dCB0aHJvd2luZyBhIHtAbGluayBUaHJvd2FibGV9LgorICAgICAqCisgICAgICogQHBhcmFtIHIgVGhlIHtAbGluayBJbnZva2FibGV9IHRvIHJ1bi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZXZlbnR1YWxseShATm9uTnVsbCBJbnZva2FibGUgcikgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByLnJ1bigpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgICAgICAgICBpZiAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydCA8IEJhc2VQcmludFRlc3QuT1BFUkFUSU9OX1RJTUVPVVRfTUlMTElTKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJJZ25vcmluZyBleGNlcHRpb24iLCBlKTsKKworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDUwMCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiSW50ZXJydXB0ZWQiLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiBwcmludCBqb2IKKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHByaW50IGpvYiBmb3IgdGhlIG5hbWUKKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIElmIHByaW50IGpvYiBjb3VsZCBub3QgYmUgZm91bmQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEBOb25OdWxsIFByaW50Sm9iIGdldFByaW50Sm9iKEBOb25OdWxsIFByaW50TWFuYWdlciBwbSwgQE5vbk51bGwgU3RyaW5nIG5hbWUpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChhbmRyb2lkLnByaW50LlByaW50Sm9iIGpvYiA6IHBtLmdldFByaW50Sm9icygpKSB7CisgICAgICAgICAgICBpZiAoam9iLmdldEluZm8oKS5nZXRMYWJlbCgpLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBqb2I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJQcmludCBqb2IgIiArIG5hbWUgKyAiIG5vdCBmb3VuZCBpbiAiICsgcG0uZ2V0UHJpbnRKb2JzKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gVGhlIHByaW50IG1hbmFnZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEBOb25OdWxsIFByaW50TWFuYWdlciBnZXRQcmludE1hbmFnZXIoQE5vbk51bGwgQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiAoUHJpbnRNYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5QUklOVF9TRVJWSUNFKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9wcmludC9wcmludFRlc3RVdGlsTGliL3NyYy9hbmRyb2lkL3ByaW50L3Rlc3Qvc2VydmljZXMvQWRkUHJpbnRlcnNBY3Rpdml0eS5qYXZhIGIvdGVzdHMvdGVzdHMvcHJpbnQvcHJpbnRUZXN0VXRpbExpYi9zcmMvYW5kcm9pZC9wcmludC90ZXN0L3NlcnZpY2VzL0FkZFByaW50ZXJzQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDlmNGNlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvcHJpbnQvcHJpbnRUZXN0VXRpbExpYi9zcmMvYW5kcm9pZC9wcmludC90ZXN0L3NlcnZpY2VzL0FkZFByaW50ZXJzQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnByaW50LnRlc3Quc2VydmljZXM7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk5vbk51bGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitwdWJsaWMgY2xhc3MgQWRkUHJpbnRlcnNBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBcnJheUxpc3Q8UnVubmFibGU+IHNPYnNlcnZlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRPYnNlcnZlcihATm9uTnVsbCBSdW5uYWJsZSBvYnNlcnZlcikgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHNPYnNlcnZlcnMpIHsKKyAgICAgICAgICAgIHNPYnNlcnZlcnMuYWRkKG9ic2VydmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHNPYnNlcnZlcnMpIHsKKyAgICAgICAgICAgIGZvciAoUnVubmFibGUgc09ic2VydmVyIDogc09ic2VydmVycykgeworICAgICAgICAgICAgICAgIHNPYnNlcnZlci5ydW4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZpbmlzaCgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhck9ic2VydmVycygpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChzT2JzZXJ2ZXJzKSB7CisgICAgICAgICAgICBzT2JzZXJ2ZXJzLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9wcmludC9wcmludFRlc3RVdGlsTGliL3NyYy9hbmRyb2lkL3ByaW50L3Rlc3Qvc2VydmljZXMvQ3VzdG9tUHJpbnRPcHRpb25zQWN0aXZpdHkuamF2YSBiL3Rlc3RzL3Rlc3RzL3ByaW50L3ByaW50VGVzdFV0aWxMaWIvc3JjL2FuZHJvaWQvcHJpbnQvdGVzdC9zZXJ2aWNlcy9DdXN0b21QcmludE9wdGlvbnNBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0OTkzYzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9wcmludC9wcmludFRlc3RVdGlsTGliL3NyYy9hbmRyb2lkL3ByaW50L3Rlc3Qvc2VydmljZXMvQ3VzdG9tUHJpbnRPcHRpb25zQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnByaW50LnRlc3Quc2VydmljZXM7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQucHJpbnQuUHJpbnRKb2JJbmZvOworaW1wb3J0IGFuZHJvaWQucHJpbnQuUHJpbnRlckluZm87CitpbXBvcnQgYW5kcm9pZC5wcmludHNlcnZpY2UuUHJpbnRTZXJ2aWNlOworCisvKioKKyAqIEN1c3RvbSBwcmludCBvcHRpb25zIGFjdGl2aXR5IGZvciBib3RoIHByaW50IHNlcnZpY2VzCisgKi8KK3B1YmxpYyBjbGFzcyBDdXN0b21QcmludE9wdGlvbnNBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICAvKiogTG9jayBmb3Ige0BsaW5rICNzQ2FsbGJhY2t9ICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IHNMb2NrID0gbmV3IE9iamVjdCgpOworCisgICAgLyoqIEN1cnJlbnRseSByZWdpc3RlcmVkIGNhbGxiYWNrIGZvciBfYm90aF8gZmlyc3QgYW5kIHNlY29uZCBwcmludCBzZXJ2aWNlLiAqLworICAgIHByaXZhdGUgc3RhdGljIEN1c3RvbVByaW50T3B0aW9uc0NhbGxiYWNrIHNDYWxsYmFjayA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBTZXQgYSBuZXcgY2FsbGJhY2sgY2FsbGVkIHdoZW4gdGhlIGN1c3RvbSBvcHRpb25zIGFjdGl2aXR5IGlzIGxhdW5jaGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBuZXcgY2FsbGJhY2sgb3IgbnVsbCwgaWYgdGhlIGNhbGxiYWNrIHNob3VsZCBiZSB1bnJlZ2lzdGVyZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldENhbGxCYWNrKEN1c3RvbVByaW50T3B0aW9uc0NhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAoc0xvY2spIHsKKyAgICAgICAgICAgIHNDYWxsYmFjayA9IGNhbGxiYWNrOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGJhY2sgZXhlY3V0ZWQgZm9yIHRoaXMgYWN0aXZpdHkuIFNldCB2aWEge0BsaW5rICNzZXRDYWxsQmFja30uCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBDdXN0b21QcmludE9wdGlvbnNDYWxsYmFjayB7CisgICAgICAgIFByaW50Sm9iSW5mbyBleGVjdXRlQ3VzdG9tUHJpbnRPcHRpb25zQWN0aXZpdHkoUHJpbnRKb2JJbmZvIHByaW50Sm9iLAorICAgICAgICAgICAgICAgIFByaW50ZXJJbmZvIHByaW50ZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBJbnRlbnQgcmVzdWx0ID0gbmV3IEludGVudCgpOworCisgICAgICAgIHN5bmNocm9uaXplZCAoc0xvY2spIHsKKyAgICAgICAgICAgIGlmIChzQ2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFByaW50Sm9iSW5mbyBwcmludEpvYkluZm8gPSBnZXRJbnRlbnQoKS5nZXRQYXJjZWxhYmxlRXh0cmEoCisgICAgICAgICAgICAgICAgICAgICAgICBQcmludFNlcnZpY2UuRVhUUkFfUFJJTlRfSk9CX0lORk8pOworICAgICAgICAgICAgICAgIFByaW50ZXJJbmZvIHByaW50ZXJJbmZvID0gZ2V0SW50ZW50KCkuZ2V0UGFyY2VsYWJsZUV4dHJhKAorICAgICAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQuaW50ZW50LmV4dHJhLnByaW50LkVYVFJBX1BSSU5URVJfSU5GTyIpOworCisgICAgICAgICAgICAgICAgcmVzdWx0LnB1dEV4dHJhKFByaW50U2VydmljZS5FWFRSQV9QUklOVF9KT0JfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgIHNDYWxsYmFjay5leGVjdXRlQ3VzdG9tUHJpbnRPcHRpb25zQWN0aXZpdHkocHJpbnRKb2JJbmZvLCBwcmludGVySW5mbykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc2V0UmVzdWx0KEFjdGl2aXR5LlJFU1VMVF9PSywgcmVzdWx0KTsKKyAgICAgICAgZmluaXNoKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcHJpbnQvcHJpbnRUZXN0VXRpbExpYi9zcmMvYW5kcm9pZC9wcmludC90ZXN0L3NlcnZpY2VzL0ZpcnN0UHJpbnRTZXJ2aWNlLmphdmEgYi90ZXN0cy90ZXN0cy9wcmludC9wcmludFRlc3RVdGlsTGliL3NyYy9hbmRyb2lkL3ByaW50L3Rlc3Qvc2VydmljZXMvRmlyc3RQcmludFNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzNhNGVlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvcHJpbnQvcHJpbnRUZXN0VXRpbExpYi9zcmMvYW5kcm9pZC9wcmludC90ZXN0L3NlcnZpY2VzL0ZpcnN0UHJpbnRTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5wcmludC50ZXN0LnNlcnZpY2VzOworCitwdWJsaWMgY2xhc3MgRmlyc3RQcmludFNlcnZpY2UgZXh0ZW5kcyBTdHViYmFibGVQcmludFNlcnZpY2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IHNMb2NrID0gbmV3IE9iamVjdCgpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgUHJpbnRTZXJ2aWNlQ2FsbGJhY2tzIHNDYWxsYmFja3M7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q2FsbGJhY2tzKFByaW50U2VydmljZUNhbGxiYWNrcyBjYWxsYmFja3MpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChzTG9jaykgeworICAgICAgICAgICAgc0NhbGxiYWNrcyA9IGNhbGxiYWNrczsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBQcmludFNlcnZpY2VDYWxsYmFja3MgZ2V0Q2FsbGJhY2tzKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHNMb2NrKSB7CisgICAgICAgICAgICBpZiAoc0NhbGxiYWNrcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc0NhbGxiYWNrcy5zZXRTZXJ2aWNlKHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHNDYWxsYmFja3M7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9wcmludC9wcmludFRlc3RVdGlsTGliL3NyYy9hbmRyb2lkL3ByaW50L3Rlc3Qvc2VydmljZXMvSW5mb0FjdGl2aXR5LmphdmEgYi90ZXN0cy90ZXN0cy9wcmludC9wcmludFRlc3RVdGlsTGliL3NyYy9hbmRyb2lkL3ByaW50L3Rlc3Qvc2VydmljZXMvSW5mb0FjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI3ZmVjOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3ByaW50L3ByaW50VGVzdFV0aWxMaWIvc3JjL2FuZHJvaWQvcHJpbnQvdGVzdC9zZXJ2aWNlcy9JbmZvQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnByaW50LnRlc3Quc2VydmljZXM7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK3B1YmxpYyBjbGFzcyBJbmZvQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgcHVibGljIGludGVyZmFjZSBPYnNlcnZlciB7CisgICAgICAgIHZvaWQgb25DcmVhdGUoQWN0aXZpdHkgY3JlYXRlZEFjdGl2aXR5KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBcnJheUxpc3Q8T2JzZXJ2ZXI+IHNPYnNlcnZlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRPYnNlcnZlcihPYnNlcnZlciBvYnNlcnZlcikgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHNPYnNlcnZlcnMpIHsKKyAgICAgICAgICAgIHNPYnNlcnZlcnMuYWRkKG9ic2VydmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhck9ic2VydmVycygpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChzT2JzZXJ2ZXJzKSB7CisgICAgICAgICAgICBzT2JzZXJ2ZXJzLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgc3luY2hyb25pemVkIChzT2JzZXJ2ZXJzKSB7CisgICAgICAgICAgICBBcnJheUxpc3Q8T2JzZXJ2ZXI+IG9ic2VydmVycyA9IChBcnJheUxpc3Q8T2JzZXJ2ZXI+KSBzT2JzZXJ2ZXJzLmNsb25lKCk7CisKKyAgICAgICAgICAgIGZvciAoT2JzZXJ2ZXIgb2JzZXJ2ZXIgOiBvYnNlcnZlcnMpIHsKKyAgICAgICAgICAgICAgICBvYnNlcnZlci5vbkNyZWF0ZSh0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ByaW50L3ByaW50VGVzdFV0aWxMaWIvc3JjL2FuZHJvaWQvcHJpbnQvdGVzdC9zZXJ2aWNlcy9QcmludFNlcnZpY2VDYWxsYmFja3MuamF2YSBiL3Rlc3RzL3Rlc3RzL3ByaW50L3ByaW50VGVzdFV0aWxMaWIvc3JjL2FuZHJvaWQvcHJpbnQvdGVzdC9zZXJ2aWNlcy9QcmludFNlcnZpY2VDYWxsYmFja3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmQ0MmYyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvcHJpbnQvcHJpbnRUZXN0VXRpbExpYi9zcmMvYW5kcm9pZC9wcmludC90ZXN0L3NlcnZpY2VzL1ByaW50U2VydmljZUNhbGxiYWNrcy5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQucHJpbnQudGVzdC5zZXJ2aWNlczsKKworaW1wb3J0IGFuZHJvaWQucHJpbnRzZXJ2aWNlLlByaW50Sm9iOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJpbnRTZXJ2aWNlQ2FsbGJhY2tzIHsKKworICAgIHByaXZhdGUgU3R1YmJhYmxlUHJpbnRTZXJ2aWNlIG1TZXJ2aWNlOworCisgICAgcHVibGljIFN0dWJiYWJsZVByaW50U2VydmljZSBnZXRTZXJ2aWNlKCkgeworICAgICAgICByZXR1cm4gbVNlcnZpY2U7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2VydmljZShTdHViYmFibGVQcmludFNlcnZpY2Ugc2VydmljZSkgeworICAgICAgICBtU2VydmljZSA9IHNlcnZpY2U7CisgICAgfQorCisgICAgcHVibGljIGFic3RyYWN0IFByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uQ2FsbGJhY2tzIG9uQ3JlYXRlUHJpbnRlckRpc2NvdmVyeVNlc3Npb25DYWxsYmFja3MoKTsKKworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uUmVxdWVzdENhbmNlbFByaW50Sm9iKFByaW50Sm9iIHByaW50Sm9iKTsKKworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uUHJpbnRKb2JRdWV1ZWQoUHJpbnRKb2IgcHJpbnRKb2IpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcHJpbnQvcHJpbnRUZXN0VXRpbExpYi9zcmMvYW5kcm9pZC9wcmludC90ZXN0L3NlcnZpY2VzL1ByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uQ2FsbGJhY2tzLmphdmEgYi90ZXN0cy90ZXN0cy9wcmludC9wcmludFRlc3RVdGlsTGliL3NyYy9hbmRyb2lkL3ByaW50L3Rlc3Qvc2VydmljZXMvUHJpbnRlckRpc2NvdmVyeVNlc3Npb25DYWxsYmFja3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjdhMWI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvcHJpbnQvcHJpbnRUZXN0VXRpbExpYi9zcmMvYW5kcm9pZC9wcmludC90ZXN0L3NlcnZpY2VzL1ByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uQ2FsbGJhY2tzLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5wcmludC50ZXN0LnNlcnZpY2VzOworCitpbXBvcnQgYW5kcm9pZC5vcy5DYW5jZWxsYXRpb25TaWduYWw7CitpbXBvcnQgYW5kcm9pZC5wcmludC5QcmludGVySWQ7CitpbXBvcnQgYW5kcm9pZC5wcmludHNlcnZpY2UuQ3VzdG9tUHJpbnRlckljb25DYWxsYmFjazsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJpbnRlckRpc2NvdmVyeVNlc3Npb25DYWxsYmFja3MgeworCisgICAgcHJpdmF0ZSBTdHViYmFibGVQcmludGVyRGlzY292ZXJ5U2Vzc2lvbiBtU2Vzc2lvbjsKKworICAgIHB1YmxpYyB2b2lkIHNldFNlc3Npb24oU3R1YmJhYmxlUHJpbnRlckRpc2NvdmVyeVNlc3Npb24gc2Vzc2lvbikgeworICAgICAgICBtU2Vzc2lvbiA9IHNlc3Npb247CisgICAgfQorCisgICAgcHVibGljIFN0dWJiYWJsZVByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uIGdldFNlc3Npb24oKSB7CisgICAgICAgIHJldHVybiBtU2Vzc2lvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBvblN0YXJ0UHJpbnRlckRpc2NvdmVyeShMaXN0PFByaW50ZXJJZD4gcHJpb3JpdHlMaXN0KTsKKworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uU3RvcFByaW50ZXJEaXNjb3ZlcnkoKTsKKworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uVmFsaWRhdGVQcmludGVycyhMaXN0PFByaW50ZXJJZD4gcHJpbnRlcklkcyk7CisKKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBvblN0YXJ0UHJpbnRlclN0YXRlVHJhY2tpbmcoUHJpbnRlcklkIHByaW50ZXJJZCk7CisKKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBvblJlcXVlc3RDdXN0b21QcmludGVySWNvbihQcmludGVySWQgcHJpbnRlcklkLAorICAgICAgICAgICAgQ2FuY2VsbGF0aW9uU2lnbmFsIGNhbmNlbGxhdGlvblNpZ25hbCwgQ3VzdG9tUHJpbnRlckljb25DYWxsYmFjayBjYWxsYmFjayk7CisKKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBvblN0b3BQcmludGVyU3RhdGVUcmFja2luZyhQcmludGVySWQgcHJpbnRlcklkKTsKKworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uRGVzdHJveSgpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcHJpbnQvcHJpbnRUZXN0VXRpbExpYi9zcmMvYW5kcm9pZC9wcmludC90ZXN0L3NlcnZpY2VzL1NlY29uZFByaW50U2VydmljZS5qYXZhIGIvdGVzdHMvdGVzdHMvcHJpbnQvcHJpbnRUZXN0VXRpbExpYi9zcmMvYW5kcm9pZC9wcmludC90ZXN0L3NlcnZpY2VzL1NlY29uZFByaW50U2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlOGE2YTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9wcmludC9wcmludFRlc3RVdGlsTGliL3NyYy9hbmRyb2lkL3ByaW50L3Rlc3Qvc2VydmljZXMvU2Vjb25kUHJpbnRTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5wcmludC50ZXN0LnNlcnZpY2VzOworCitwdWJsaWMgY2xhc3MgU2Vjb25kUHJpbnRTZXJ2aWNlIGV4dGVuZHMgU3R1YmJhYmxlUHJpbnRTZXJ2aWNlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBzTG9jayA9IG5ldyBPYmplY3QoKTsKKworICAgIHByaXZhdGUgc3RhdGljIFByaW50U2VydmljZUNhbGxiYWNrcyBzQ2FsbGJhY2tzOworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldENhbGxiYWNrcyhQcmludFNlcnZpY2VDYWxsYmFja3MgY2FsbGJhY2tzKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAoc0xvY2spIHsKKyAgICAgICAgICAgIHNDYWxsYmFja3MgPSBjYWxsYmFja3M7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUHJpbnRTZXJ2aWNlQ2FsbGJhY2tzIGdldENhbGxiYWNrcygpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChzTG9jaykgeworICAgICAgICAgICAgaWYgKHNDYWxsYmFja3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNDYWxsYmFja3Muc2V0U2VydmljZSh0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzQ2FsbGJhY2tzOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcHJpbnQvcHJpbnRUZXN0VXRpbExpYi9zcmMvYW5kcm9pZC9wcmludC90ZXN0L3NlcnZpY2VzL1NldHRpbmdzQWN0aXZpdHkuamF2YSBiL3Rlc3RzL3Rlc3RzL3ByaW50L3ByaW50VGVzdFV0aWxMaWIvc3JjL2FuZHJvaWQvcHJpbnQvdGVzdC9zZXJ2aWNlcy9TZXR0aW5nc0FjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZjNjNmYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3ByaW50L3ByaW50VGVzdFV0aWxMaWIvc3JjL2FuZHJvaWQvcHJpbnQvdGVzdC9zZXJ2aWNlcy9TZXR0aW5nc0FjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5wcmludC50ZXN0LnNlcnZpY2VzOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CisKK3B1YmxpYyBjbGFzcyBTZXR0aW5nc0FjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ByaW50L3ByaW50VGVzdFV0aWxMaWIvc3JjL2FuZHJvaWQvcHJpbnQvdGVzdC9zZXJ2aWNlcy9TdHViYmFibGVQcmludFNlcnZpY2UuamF2YSBiL3Rlc3RzL3Rlc3RzL3ByaW50L3ByaW50VGVzdFV0aWxMaWIvc3JjL2FuZHJvaWQvcHJpbnQvdGVzdC9zZXJ2aWNlcy9TdHViYmFibGVQcmludFNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWQxZjc4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvcHJpbnQvcHJpbnRUZXN0VXRpbExpYi9zcmMvYW5kcm9pZC9wcmludC90ZXN0L3NlcnZpY2VzL1N0dWJiYWJsZVByaW50U2VydmljZS5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQucHJpbnQudGVzdC5zZXJ2aWNlczsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQucHJpbnRzZXJ2aWNlLlByaW50Sm9iOworaW1wb3J0IGFuZHJvaWQucHJpbnRzZXJ2aWNlLlByaW50U2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLnByaW50c2VydmljZS5QcmludGVyRGlzY292ZXJ5U2Vzc2lvbjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3R1YmJhYmxlUHJpbnRTZXJ2aWNlIGV4dGVuZHMgUHJpbnRTZXJ2aWNlIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBQcmludGVyRGlzY292ZXJ5U2Vzc2lvbiBvbkNyZWF0ZVByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uKCkgeworICAgICAgICBQcmludFNlcnZpY2VDYWxsYmFja3MgY2FsbGJhY2tzID0gZ2V0Q2FsbGJhY2tzKCk7CisgICAgICAgIGlmIChjYWxsYmFja3MgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHViYmFibGVQcmludGVyRGlzY292ZXJ5U2Vzc2lvbih0aGlzLAorICAgICAgICAgICAgICAgICAgICBnZXRDYWxsYmFja3MoKS5vbkNyZWF0ZVByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uQ2FsbGJhY2tzKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uUmVxdWVzdENhbmNlbFByaW50Sm9iKFByaW50Sm9iIHByaW50Sm9iKSB7CisgICAgICAgIFByaW50U2VydmljZUNhbGxiYWNrcyBjYWxsYmFja3MgPSBnZXRDYWxsYmFja3MoKTsKKyAgICAgICAgaWYgKGNhbGxiYWNrcyAhPSBudWxsKSB7CisgICAgICAgICAgICBjYWxsYmFja3Mub25SZXF1ZXN0Q2FuY2VsUHJpbnRKb2IocHJpbnRKb2IpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25QcmludEpvYlF1ZXVlZChQcmludEpvYiBwcmludEpvYikgeworICAgICAgICBQcmludFNlcnZpY2VDYWxsYmFja3MgY2FsbGJhY2tzID0gZ2V0Q2FsbGJhY2tzKCk7CisgICAgICAgIGlmIChjYWxsYmFja3MgIT0gbnVsbCkgeworICAgICAgICAgICAgY2FsbGJhY2tzLm9uUHJpbnRKb2JRdWV1ZWQocHJpbnRKb2IpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IFByaW50U2VydmljZUNhbGxiYWNrcyBnZXRDYWxsYmFja3MoKTsKKworICAgIHB1YmxpYyB2b2lkIGNhbGxBdHRhY2hCYXNlQ29udGV4dChDb250ZXh0IGJhc2UpIHsKKyAgICAgICAgYXR0YWNoQmFzZUNvbnRleHQoYmFzZSk7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8UHJpbnRKb2I+IGNhbGxHZXRBY3RpdmVQcmludEpvYnMoKSB7CisgICAgICAgIHJldHVybiBnZXRBY3RpdmVQcmludEpvYnMoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ByaW50L3ByaW50VGVzdFV0aWxMaWIvc3JjL2FuZHJvaWQvcHJpbnQvdGVzdC9zZXJ2aWNlcy9TdHViYmFibGVQcmludGVyRGlzY292ZXJ5U2Vzc2lvbi5qYXZhIGIvdGVzdHMvdGVzdHMvcHJpbnQvcHJpbnRUZXN0VXRpbExpYi9zcmMvYW5kcm9pZC9wcmludC90ZXN0L3NlcnZpY2VzL1N0dWJiYWJsZVByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk3MmYzYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3ByaW50L3ByaW50VGVzdFV0aWxMaWIvc3JjL2FuZHJvaWQvcHJpbnQvdGVzdC9zZXJ2aWNlcy9TdHViYmFibGVQcmludGVyRGlzY292ZXJ5U2Vzc2lvbi5qYXZhCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQucHJpbnQudGVzdC5zZXJ2aWNlczsKKworaW1wb3J0IGFuZHJvaWQub3MuQ2FuY2VsbGF0aW9uU2lnbmFsOworaW1wb3J0IGFuZHJvaWQucHJpbnQuUHJpbnRlcklkOworaW1wb3J0IGFuZHJvaWQucHJpbnRzZXJ2aWNlLkN1c3RvbVByaW50ZXJJY29uQ2FsbGJhY2s7CitpbXBvcnQgYW5kcm9pZC5wcmludHNlcnZpY2UuUHJpbnRTZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQucHJpbnRzZXJ2aWNlLlByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTm9uTnVsbDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgU3R1YmJhYmxlUHJpbnRlckRpc2NvdmVyeVNlc3Npb24gZXh0ZW5kcyBQcmludGVyRGlzY292ZXJ5U2Vzc2lvbiB7CisgICAgcHJpdmF0ZSBmaW5hbCBQcmludFNlcnZpY2UgbVNlcnZpY2U7CisgICAgcHJpdmF0ZSBmaW5hbCBQcmludGVyRGlzY292ZXJ5U2Vzc2lvbkNhbGxiYWNrcyBtQ2FsbGJhY2tzOworCisgICAgcHVibGljIFN0dWJiYWJsZVByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uKFByaW50U2VydmljZSBzZXJ2aWNlLAorICAgICAgICAgICAgUHJpbnRlckRpc2NvdmVyeVNlc3Npb25DYWxsYmFja3MgY2FsbGJhY2tzKSB7CisgICAgICAgIG1TZXJ2aWNlID0gc2VydmljZTsKKyAgICAgICAgbUNhbGxiYWNrcyA9IGNhbGxiYWNrczsKKyAgICAgICAgaWYgKG1DYWxsYmFja3MgIT0gbnVsbCkgeworICAgICAgICAgICAgbUNhbGxiYWNrcy5zZXRTZXNzaW9uKHRoaXMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFByaW50U2VydmljZSBnZXRTZXJ2aWNlKCkgeworICAgICAgICByZXR1cm4gbVNlcnZpY2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25TdGFydFByaW50ZXJEaXNjb3ZlcnkoQE5vbk51bGwgTGlzdDxQcmludGVySWQ+IHByaW9yaXR5TGlzdCkgeworICAgICAgICBpZiAobUNhbGxiYWNrcyAhPSBudWxsKSB7CisgICAgICAgICAgICBtQ2FsbGJhY2tzLm9uU3RhcnRQcmludGVyRGlzY292ZXJ5KHByaW9yaXR5TGlzdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblN0b3BQcmludGVyRGlzY292ZXJ5KCkgeworICAgICAgICBpZiAobUNhbGxiYWNrcyAhPSBudWxsKSB7CisgICAgICAgICAgICBtQ2FsbGJhY2tzLm9uU3RvcFByaW50ZXJEaXNjb3ZlcnkoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uVmFsaWRhdGVQcmludGVycyhATm9uTnVsbCBMaXN0PFByaW50ZXJJZD4gcHJpbnRlcklkcykgeworICAgICAgICBpZiAobUNhbGxiYWNrcyAhPSBudWxsKSB7CisgICAgICAgICAgICBtQ2FsbGJhY2tzLm9uVmFsaWRhdGVQcmludGVycyhwcmludGVySWRzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRQcmludGVyU3RhdGVUcmFja2luZyhATm9uTnVsbCBQcmludGVySWQgcHJpbnRlcklkKSB7CisgICAgICAgIGlmIChtQ2FsbGJhY2tzICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1DYWxsYmFja3Mub25TdGFydFByaW50ZXJTdGF0ZVRyYWNraW5nKHByaW50ZXJJZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblJlcXVlc3RDdXN0b21QcmludGVySWNvbihATm9uTnVsbCBQcmludGVySWQgcHJpbnRlcklkLAorICAgICAgICAgICAgQE5vbk51bGwgQ2FuY2VsbGF0aW9uU2lnbmFsIGNhbmNlbGxhdGlvblNpZ25hbCwKKyAgICAgICAgICAgIEBOb25OdWxsIEN1c3RvbVByaW50ZXJJY29uQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgaWYgKG1DYWxsYmFja3MgIT0gbnVsbCkgeworICAgICAgICAgICAgbUNhbGxiYWNrcy5vblJlcXVlc3RDdXN0b21QcmludGVySWNvbihwcmludGVySWQsIGNhbmNlbGxhdGlvblNpZ25hbCwgY2FsbGJhY2spOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25TdG9wUHJpbnRlclN0YXRlVHJhY2tpbmcoQE5vbk51bGwgUHJpbnRlcklkIHByaW50ZXJJZCkgeworICAgICAgICBpZiAobUNhbGxiYWNrcyAhPSBudWxsKSB7CisgICAgICAgICAgICBtQ2FsbGJhY2tzLm9uU3RvcFByaW50ZXJTdGF0ZVRyYWNraW5nKHByaW50ZXJJZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3koKSB7CisgICAgICAgIGlmIChtQ2FsbGJhY2tzICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1DYWxsYmFja3Mub25EZXN0cm95KCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9wcmludC9yZXMvdmFsdWVzL3RoZW1lcy54bWwgYi90ZXN0cy90ZXN0cy9wcmludC9yZXMvdmFsdWVzL3RoZW1lcy54bWwKaW5kZXggZjVjOWI5NzcuLjA3ZTIyOGMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3ByaW50L3Jlcy92YWx1ZXMvdGhlbWVzLnhtbAorKysgYi90ZXN0cy90ZXN0cy9wcmludC9yZXMvdmFsdWVzL3RoZW1lcy54bWwKQEAgLTE3LDcgKzE3LDEyIEBACiAtLT4KIAogPHJlc291cmNlcz4KLSAgICA8c3R5bGUgbmFtZT0iVGhlbWUuVHJhbnNsdWNlbnQiIHBhcmVudD0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuRGV2aWNlRGVmYXVsdCI+CisgICAgPHN0eWxlIG5hbWU9Ik5vQW5pbWF0aW9uVHJhbnNsdWNlbnQiIHBhcmVudD0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuRGV2aWNlRGVmYXVsdCI+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93SXNUcmFuc2x1Y2VudCI+dHJ1ZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dBbmltYXRpb25TdHlsZSI+QG51bGw8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJOb0FuaW1hdGlvbiIgcGFyZW50PSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5EZXZpY2VEZWZhdWx0Ij4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dBbmltYXRpb25TdHlsZSI+QG51bGw8L2l0ZW0+CiAgICAgPC9zdHlsZT4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcHJpbnQvcmVzL3htbC9wcmludHNlcnZpY2UueG1sIGIvdGVzdHMvdGVzdHMvcHJpbnQvcmVzL3htbC9wcmludHNlcnZpY2UueG1sCmluZGV4IDc4Yzc1MDQuLjA3ZjdkNmMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3ByaW50L3Jlcy94bWwvcHJpbnRzZXJ2aWNlLnhtbAorKysgYi90ZXN0cy90ZXN0cy9wcmludC9yZXMveG1sL3ByaW50c2VydmljZS54bWwKQEAgLTE3LDYgKzE3LDYgQEAKIC0tPgogCiA8cHJpbnQtc2VydmljZSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgIGFuZHJvaWQ6c2V0dGluZ3NBY3Rpdml0eT0iYW5kcm9pZC5wcmludC5jdHMuc2VydmljZXMuU2V0dGluZ3NBY3Rpdml0eSIKLSAgICAgYW5kcm9pZDphZGRQcmludGVyc0FjdGl2aXR5PSJhbmRyb2lkLnByaW50LmN0cy5zZXJ2aWNlcy5BZGRQcmludGVyc0FjdGl2aXR5IgotICAgICBhbmRyb2lkOmFkdmFuY2VkUHJpbnRPcHRpb25zQWN0aXZpdHk9ImFuZHJvaWQucHJpbnQuY3RzLnNlcnZpY2VzLkN1c3RvbVByaW50T3B0aW9uc0FjdGl2aXR5Ii8+CisgICAgIGFuZHJvaWQ6c2V0dGluZ3NBY3Rpdml0eT0iYW5kcm9pZC5wcmludC50ZXN0LnNlcnZpY2VzLlNldHRpbmdzQWN0aXZpdHkiCisgICAgIGFuZHJvaWQ6YWRkUHJpbnRlcnNBY3Rpdml0eT0iYW5kcm9pZC5wcmludC50ZXN0LnNlcnZpY2VzLkFkZFByaW50ZXJzQWN0aXZpdHkiCisgICAgIGFuZHJvaWQ6YWR2YW5jZWRQcmludE9wdGlvbnNBY3Rpdml0eT0iYW5kcm9pZC5wcmludC50ZXN0LnNlcnZpY2VzLkN1c3RvbVByaW50T3B0aW9uc0FjdGl2aXR5Ii8+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9wcmludC9zcmMvYW5kcm9pZC9wcmludC9jdHMvQmFzZVByaW50VGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvcHJpbnQvc3JjL2FuZHJvaWQvcHJpbnQvY3RzL0Jhc2VQcmludFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTI5YjE3Zi4uMDAwMDAwMAotLS0gYS90ZXN0cy90ZXN0cy9wcmludC9zcmMvYW5kcm9pZC9wcmludC9jdHMvQmFzZVByaW50VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnByaW50LmN0czsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuR0VUX01FVEFfREFUQTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLkdFVF9TRVJWSUNFUzsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5wcmludC5jdHMuVXRpbHMuZ2V0UHJpbnRNYW5hZ2VyOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzdW1lLmFzc3VtZVRydWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1hdGNoZXJzLmFueTsKLWltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTWF0Y2hlcnMuZXE7Ci1pbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8uZG9BbnN3ZXI7Ci1pbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8uZG9DYWxsUmVhbE1ldGhvZDsKLWltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5tb2NrOwotaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLndoZW47Ci1pbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLmhhbWNyZXN0Lk1vY2tpdG9IYW1jcmVzdC5hcmdUaGF0OwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5SZXNvbHZlSW5mbzsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLnBkZi5QZGZEb2N1bWVudDsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLkNhbmNlbGxhdGlvblNpZ25hbDsKLWltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOwotaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC5wcmludC5QYWdlUmFuZ2U7Ci1pbXBvcnQgYW5kcm9pZC5wcmludC5QcmludEF0dHJpYnV0ZXM7Ci1pbXBvcnQgYW5kcm9pZC5wcmludC5QcmludERvY3VtZW50QWRhcHRlcjsKLWltcG9ydCBhbmRyb2lkLnByaW50LlByaW50RG9jdW1lbnRBZGFwdGVyLkxheW91dFJlc3VsdENhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQucHJpbnQuUHJpbnREb2N1bWVudEFkYXB0ZXIuV3JpdGVSZXN1bHRDYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLnByaW50LlByaW50RG9jdW1lbnRJbmZvOwotaW1wb3J0IGFuZHJvaWQucHJpbnQuUHJpbnRlcklkOwotaW1wb3J0IGFuZHJvaWQucHJpbnQuY3RzLnNlcnZpY2VzLlByaW50U2VydmljZUNhbGxiYWNrczsKLWltcG9ydCBhbmRyb2lkLnByaW50LmN0cy5zZXJ2aWNlcy5QcmludGVyRGlzY292ZXJ5U2Vzc2lvbkNhbGxiYWNrczsKLWltcG9ydCBhbmRyb2lkLnByaW50LmN0cy5zZXJ2aWNlcy5TdHViYmFibGVQcmludFNlcnZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5wcmludC5jdHMuc2VydmljZXMuU3R1YmJhYmxlUHJpbnRlckRpc2NvdmVyeVNlc3Npb247Ci1pbXBvcnQgYW5kcm9pZC5wcmludC5wZGYuUHJpbnRlZFBkZkRvY3VtZW50OwotaW1wb3J0IGFuZHJvaWQucHJpbnRzZXJ2aWNlLkN1c3RvbVByaW50ZXJJY29uQ2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5wcmludHNlcnZpY2UuUHJpbnRKb2I7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk51bGxhYmxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLkJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLlVpRGV2aWNlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLlVpT2JqZWN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLlVpT2JqZWN0Tm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QudWlhdXRvbWF0b3IuVWlTZWxlY3RvcjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuU3lzdGVtVXRpbDsKLQotaW1wb3J0IG9yZy5oYW1jcmVzdC5CYXNlTWF0Y2hlcjsKLWltcG9ydCBvcmcuaGFtY3Jlc3QuRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlckNsYXNzOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwotaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwotaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5UZXN0UnVsZTsKLWltcG9ydCBvcmcuanVuaXQucnVubmVycy5tb2RlbC5TdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLm1vY2tpdG8uSW5PcmRlcjsKLWltcG9ydCBvcmcubW9ja2l0by5zdHViYmluZy5BbnN3ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVvdXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgcHJpbnQgdGVzdHMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlUHJpbnRUZXN0IHsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTE9HX1RBRyA9ICJCYXNlUHJpbnRUZXN0IjsKLQotICAgIHN0YXRpYyBmaW5hbCBsb25nIE9QRVJBVElPTl9USU1FT1VUX01JTExJUyA9IDYwMDAwOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJTlRfSk9CX05BTUUgPSAiVGVzdCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0lEID0gIkJhc2VQcmludFRlc3QuRVhUUkFfVEVTVF9JRCI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJTlRfU1BPT0xFUl9QQUNLQUdFX05BTUUgPSAiY29tLmFuZHJvaWQucHJpbnRzcG9vbGVyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE1fQ0xFQVJfU1VDQ0VTU19PVVRQVVQgPSAiU3VjY2VzcyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfTElTVF9FTkFCTEVEX0lNRV9DT01QT05FTlRTID0gImltZSBsaXN0IC1zIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9QUkVGSVhfRU5BQkxFX0lNRSA9ICJpbWUgZW5hYmxlICI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfUFJFRklYX0RJU0FCTEVfSU1FID0gImltZSBkaXNhYmxlICI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENVUlJFTlRfVVNFUl9JRCA9IC0yOyAvLyBNaXJyb3JzIFVzZXJIYW5kbGUuVVNFUl9DVVJSRU5UCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU5UU1BPT0xFUl9QQUNLQUdFID0gImNvbS5hbmRyb2lkLnByaW50c3Bvb2xlciI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBdG9taWNJbnRlZ2VyIHNMYXN0VGVzdElEID0gbmV3IEF0b21pY0ludGVnZXIoKTsKLSAgICBwcml2YXRlIGludCBtVGVzdElkOwotICAgIHByaXZhdGUgUHJpbnREb2N1bWVudEFjdGl2aXR5IG1BY3Rpdml0eTsKLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBzRGlzYWJsZWRQcmludFNlcnZpY2VzQmVmb3JlOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3BhcnNlQXJyYXk8QmFzZVByaW50VGVzdD4gc0lkVG9UZXN0ID0gbmV3IFNwYXJzZUFycmF5PD4oKTsKLQotICAgIHB1YmxpYyBmaW5hbCBAUnVsZSBTaG91bGRTdGFydEFjdGl2aXR5IG1TaG91bGRTdGFydEFjdGl2aXR5UnVsZSA9IG5ldyBTaG91bGRTdGFydEFjdGl2aXR5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIFVJIGRldmljZQotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgVUkgZGV2aWNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBVaURldmljZSBnZXRVaURldmljZSgpIHsKLSAgICAgICAgcmV0dXJuIFVpRGV2aWNlLmdldEluc3RhbmNlKGdldEluc3RydW1lbnRhdGlvbigpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIENhbGxDb3VudGVyIG1DYW5jZWxPcGVyYXRpb25Db3VudGVyOwotICAgIHByaXZhdGUgQ2FsbENvdW50ZXIgbUxheW91dENhbGxDb3VudGVyOwotICAgIHByaXZhdGUgQ2FsbENvdW50ZXIgbVdyaXRlQ2FsbENvdW50ZXI7Ci0gICAgcHJpdmF0ZSBDYWxsQ291bnRlciBtV3JpdGVDYW5jZWxDYWxsQ291bnRlcjsKLSAgICBwcml2YXRlIENhbGxDb3VudGVyIG1GaW5pc2hDYWxsQ291bnRlcjsKLSAgICBwcml2YXRlIENhbGxDb3VudGVyIG1QcmludEpvYlF1ZXVlZENhbGxDb3VudGVyOwotICAgIHByaXZhdGUgQ2FsbENvdW50ZXIgbUNyZWF0ZVNlc3Npb25DYWxsQ291bnRlcjsKLSAgICBwcml2YXRlIENhbGxDb3VudGVyIG1EZXN0cm95U2Vzc2lvbkNhbGxDb3VudGVyOwotICAgIHByaXZhdGUgQ2FsbENvdW50ZXIgbURlc3Ryb3lBY3Rpdml0eUNhbGxDb3VudGVyID0gbmV3IENhbGxDb3VudGVyKCk7Ci0gICAgcHJpdmF0ZSBDYWxsQ291bnRlciBtQ3JlYXRlQWN0aXZpdHlDYWxsQ291bnRlciA9IG5ldyBDYWxsQ291bnRlcigpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gc0VuYWJsZWRJbWVzOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZ2V0RW5hYmxlZEltZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBMaXN0PFN0cmluZz4gaW1lTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOwotCi0gICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHBmZCA9IGdldEluc3RydW1lbnRhdGlvbigpLmdldFVpQXV0b21hdGlvbigpCi0gICAgICAgICAgICAgICAgLmV4ZWN1dGVTaGVsbENvbW1hbmQoQ09NTUFORF9MSVNUX0VOQUJMRURfSU1FX0NPTVBPTkVOVFMpOwotICAgICAgICB0cnkgKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcigKLSAgICAgICAgICAgICAgICBuZXcgSW5wdXRTdHJlYW1SZWFkZXIobmV3IEZpbGVJbnB1dFN0cmVhbShwZmQuZ2V0RmlsZURlc2NyaXB0b3IoKSkpKSkgewotCi0gICAgICAgICAgICBTdHJpbmcgbGluZTsKLSAgICAgICAgICAgIHdoaWxlICgobGluZSA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW1lTGlzdC5hZGQobGluZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdbXSBpbWVBcnJheSA9IG5ldyBTdHJpbmdbaW1lTGlzdC5zaXplKCldOwotICAgICAgICBpbWVMaXN0LnRvQXJyYXkoaW1lQXJyYXkpOwotCi0gICAgICAgIHJldHVybiBpbWVBcnJheTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGRpc2FibGVJbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNFbmFibGVkSW1lcyA9IGdldEVuYWJsZWRJbWVzKCk7Ci0gICAgICAgIGZvciAoU3RyaW5nIGltZSA6IHNFbmFibGVkSW1lcykgewotICAgICAgICAgICAgU3RyaW5nIGRpc2FibGVJbWVDb21tYW5kID0gQ09NTUFORF9QUkVGSVhfRElTQUJMRV9JTUUgKyBpbWU7Ci0gICAgICAgICAgICBTeXN0ZW1VdGlsLnJ1blNoZWxsQ29tbWFuZChnZXRJbnN0cnVtZW50YXRpb24oKSwgZGlzYWJsZUltZUNvbW1hbmQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBlbmFibGVJbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZvciAoU3RyaW5nIGltZSA6IHNFbmFibGVkSW1lcykgewotICAgICAgICAgICAgU3RyaW5nIGVuYWJsZUltZUNvbW1hbmQgPSBDT01NQU5EX1BSRUZJWF9FTkFCTEVfSU1FICsgaW1lOwotICAgICAgICAgICAgU3lzdGVtVXRpbC5ydW5TaGVsbENvbW1hbmQoZ2V0SW5zdHJ1bWVudGF0aW9uKCksIGVuYWJsZUltZUNvbW1hbmQpOwotICAgICAgICB9Ci0gICAgICAgIHNFbmFibGVkSW1lcyA9IG51bGw7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBJbnN0cnVtZW50YXRpb24gZ2V0SW5zdHJ1bWVudGF0aW9uKCkgewotICAgICAgICByZXR1cm4gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCk7Ci0gICAgfQotCi0gICAgQEJlZm9yZUNsYXNzCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFVwQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTG9nLmQoTE9HX1RBRywgInNldFVwQ2xhc3MoKSIpOwotCi0gICAgICAgIEluc3RydW1lbnRhdGlvbiBpbnN0cnVtZW50YXRpb24gPSBnZXRJbnN0cnVtZW50YXRpb24oKTsKLQotICAgICAgICAvLyBNYWtlIHN1cmUgd2Ugc3RhcnQgd2l0aCBhIGNsZWFuIHNsYXRlLgotICAgICAgICBMb2cuZChMT0dfVEFHLCAiY2xlYXJQcmludFNwb29sZXJEYXRhKCkiKTsKLSAgICAgICAgY2xlYXJQcmludFNwb29sZXJEYXRhKCk7Ci0gICAgICAgIExvZy5kKExPR19UQUcsICJkaXNhYmxlSW1lcygpIik7Ci0gICAgICAgIGRpc2FibGVJbWVzKCk7Ci0gICAgICAgIExvZy5kKExPR19UQUcsICJkaXNhYmxlUHJpbnRTZXJ2aWNlcygpIik7Ci0gICAgICAgIGRpc2FibGVQcmludFNlcnZpY2VzKGluc3RydW1lbnRhdGlvbi5nZXRUYXJnZXRDb250ZXh0KCkuZ2V0UGFja2FnZU5hbWUoKSk7Ci0KLSAgICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgZGV4bWFrZXIgYnVnOiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2RleG1ha2VyL2lzc3Vlcy9kZXRhaWw/aWQ9MgotICAgICAgICAvLyBEZXhtYWtlciBpcyB1c2VkIGJ5IG1vY2tpdG8uCi0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiZGV4bWFrZXIuZGV4Y2FjaGUiLCBpbnN0cnVtZW50YXRpb24KLSAgICAgICAgICAgICAgICAuZ2V0VGFyZ2V0Q29udGV4dCgpLmdldENhY2hlRGlyKCkuZ2V0UGF0aCgpKTsKLQotICAgICAgICBMb2cuZChMT0dfVEFHLCAic2V0VXBDbGFzcygpIGRvbmUiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEaXNhYmxlIGFsbCBwcmludCBzZXJ2aWNlcyBiZXNpZGUgdGhlIG9uZXMgd2Ugd2FudCB0byBsZWF2ZSBlbmFibGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhY2thZ2VUb0xlYXZlRW5hYmxlZCBUaGUgcGFja2FnZSBvZiB0aGUgc2VydmljZXMgdG8gbGVhdmUgZW5hYmxlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGRpc2FibGVQcmludFNlcnZpY2VzKEBOb25OdWxsIFN0cmluZyBwYWNrYWdlVG9MZWF2ZUVuYWJsZWQpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBJbnN0cnVtZW50YXRpb24gaW5zdHJ1bWVudGF0aW9uID0gZ2V0SW5zdHJ1bWVudGF0aW9uKCk7Ci0KLSAgICAgICAgc0Rpc2FibGVkUHJpbnRTZXJ2aWNlc0JlZm9yZSA9IFN5c3RlbVV0aWwucnVuU2hlbGxDb21tYW5kKGluc3RydW1lbnRhdGlvbiwKLSAgICAgICAgICAgICAgICAic2V0dGluZ3MgZ2V0IHNlY3VyZSAiICsgU2V0dGluZ3MuU2VjdXJlLkRJU0FCTEVEX1BSSU5UX1NFUlZJQ0VTKTsKLQotICAgICAgICBJbnRlbnQgcHJpbnRTZXJ2aWNlSW50ZW50ID0gbmV3IEludGVudChhbmRyb2lkLnByaW50c2VydmljZS5QcmludFNlcnZpY2UuU0VSVklDRV9JTlRFUkZBQ0UpOwotICAgICAgICBMaXN0PFJlc29sdmVJbmZvPiBpbnN0YWxsZWRTZXJ2aWNlcyA9IGluc3RydW1lbnRhdGlvbi5nZXRDb250ZXh0KCkuZ2V0UGFja2FnZU1hbmFnZXIoKQotICAgICAgICAgICAgICAgIC5xdWVyeUludGVudFNlcnZpY2VzKHByaW50U2VydmljZUludGVudCwgR0VUX1NFUlZJQ0VTIHwgR0VUX01FVEFfREFUQSk7Ci0KLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgZm9yIChSZXNvbHZlSW5mbyBzZXJ2aWNlIDogaW5zdGFsbGVkU2VydmljZXMpIHsKLSAgICAgICAgICAgIGlmIChwYWNrYWdlVG9MZWF2ZUVuYWJsZWQuZXF1YWxzKHNlcnZpY2Uuc2VydmljZUluZm8ucGFja2FnZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYnVpbGRlci5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiOiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobmV3IENvbXBvbmVudE5hbWUoc2VydmljZS5zZXJ2aWNlSW5mby5wYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZS5zZXJ2aWNlSW5mby5uYW1lKS5mbGF0dGVuVG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTeXN0ZW1VdGlsLnJ1blNoZWxsQ29tbWFuZChpbnN0cnVtZW50YXRpb24sICJzZXR0aW5ncyBwdXQgc2VjdXJlICIKLSAgICAgICAgICAgICAgICArIFNldHRpbmdzLlNlY3VyZS5ESVNBQkxFRF9QUklOVF9TRVJWSUNFUyArICIgIiArIGJ1aWxkZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldmVydCB7QGxpbmsgI2Rpc2FibGVQcmludFNlcnZpY2VzKFN0cmluZyl9Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgIHZvaWQgZW5hYmxlUHJpbnRTZXJ2aWNlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFN5c3RlbVV0aWwucnVuU2hlbGxDb21tYW5kKGdldEluc3RydW1lbnRhdGlvbigpLAotICAgICAgICAgICAgICAgICJzZXR0aW5ncyBwdXQgc2VjdXJlICIgKyBTZXR0aW5ncy5TZWN1cmUuRElTQUJMRURfUFJJTlRfU0VSVklDRVMgKyAiICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgc0Rpc2FibGVkUHJpbnRTZXJ2aWNlc0JlZm9yZSk7Ci0gICAgfQotCi0gICAgQEJlZm9yZQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIExvZy5kKExPR19UQUcsICJzZXRVcCgpIik7Ci0KLSAgICAgICAgYXNzdW1lVHJ1ZShnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRDb250ZXh0KCkuZ2V0UGFja2FnZU1hbmFnZXIoKS5oYXNTeXN0ZW1GZWF0dXJlKAotICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfUFJJTlRJTkcpKTsKLQotICAgICAgICAvLyBQcmV2ZW50IHJvdGF0aW9uCi0gICAgICAgIGdldFVpRGV2aWNlKCkuZnJlZXplUm90YXRpb24oKTsKLSAgICAgICAgd2hpbGUgKCFnZXRVaURldmljZSgpLmlzTmF0dXJhbE9yaWVudGF0aW9uKCkpIHsKLSAgICAgICAgICAgIGdldFVpRGV2aWNlKCkuc2V0T3JpZW50YXRpb25OYXR1cmFsKCk7Ci0gICAgICAgICAgICBnZXRVaURldmljZSgpLndhaXRGb3JJZGxlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBsYXRjaGVzLgotICAgICAgICBMb2cuZChMT0dfVEFHLCAiaW5pdCBjb3VudGVycyIpOwotICAgICAgICBtQ2FuY2VsT3BlcmF0aW9uQ291bnRlciA9IG5ldyBDYWxsQ291bnRlcigpOwotICAgICAgICBtTGF5b3V0Q2FsbENvdW50ZXIgPSBuZXcgQ2FsbENvdW50ZXIoKTsKLSAgICAgICAgbUZpbmlzaENhbGxDb3VudGVyID0gbmV3IENhbGxDb3VudGVyKCk7Ci0gICAgICAgIG1Xcml0ZUNhbGxDb3VudGVyID0gbmV3IENhbGxDb3VudGVyKCk7Ci0gICAgICAgIG1Xcml0ZUNhbmNlbENhbGxDb3VudGVyID0gbmV3IENhbGxDb3VudGVyKCk7Ci0gICAgICAgIG1GaW5pc2hDYWxsQ291bnRlciA9IG5ldyBDYWxsQ291bnRlcigpOwotICAgICAgICBtUHJpbnRKb2JRdWV1ZWRDYWxsQ291bnRlciA9IG5ldyBDYWxsQ291bnRlcigpOwotICAgICAgICBtQ3JlYXRlU2Vzc2lvbkNhbGxDb3VudGVyID0gbmV3IENhbGxDb3VudGVyKCk7Ci0gICAgICAgIG1EZXN0cm95U2Vzc2lvbkNhbGxDb3VudGVyID0gbmV3IENhbGxDb3VudGVyKCk7Ci0KLSAgICAgICAgbVRlc3RJZCA9IHNMYXN0VGVzdElELmluY3JlbWVudEFuZEdldCgpOwotICAgICAgICBzSWRUb1Rlc3QucHV0KG1UZXN0SWQsIHRoaXMpOwotCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgYWN0aXZpdHkgaWYgbmVlZGVkCi0gICAgICAgIGlmICghbVNob3VsZFN0YXJ0QWN0aXZpdHlSdWxlLm5vQWN0aXZpdHkpIHsKLSAgICAgICAgICAgIGNyZWF0ZUFjdGl2aXR5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBMb2cuZChMT0dfVEFHLCAic2V0VXAoKSBkb25lIik7Ci0gICAgfQotCi0gICAgQEFmdGVyCi0gICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTG9nLmQoTE9HX1RBRywgInRlYXJEb3duKCkiKTsKLQotICAgICAgICBmaW5pc2hBY3Rpdml0eSgpOwotCi0gICAgICAgIHNJZFRvVGVzdC5yZW1vdmUobVRlc3RJZCk7Ci0KLSAgICAgICAgLy8gQWxsb3cgcm90YXRpb24KLSAgICAgICAgZ2V0VWlEZXZpY2UoKS51bmZyZWV6ZVJvdGF0aW9uKCk7Ci0KLSAgICAgICAgTG9nLmQoTE9HX1RBRywgInRlYXJEb3duKCkgZG9uZSIpOwotICAgIH0KLQotICAgIEBBZnRlckNsYXNzCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRlYXJEb3duQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTG9nLmQoTE9HX1RBRywgInRlYXJEb3duQ2xhc3MoKSIpOwotCi0gICAgICAgIEluc3RydW1lbnRhdGlvbiBpbnN0cnVtZW50YXRpb24gPSBnZXRJbnN0cnVtZW50YXRpb24oKTsKLQotICAgICAgICBMb2cuZChMT0dfVEFHLCAiZW5hYmxlUHJpbnRTZXJ2aWNlcygpIik7Ci0gICAgICAgIGVuYWJsZVByaW50U2VydmljZXMoKTsKLQotICAgICAgICBMb2cuZChMT0dfVEFHLCAiZW5hYmxlSW1lcygpIik7Ci0gICAgICAgIGVuYWJsZUltZXMoKTsKLQotICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHNwb29sZXIgaXMgY2xlYW5lZCwgdGhpcyBhbHNvIHVuLWFwcHJvdmVzIGFsbCBzZXJ2aWNlcwotICAgICAgICBMb2cuZChMT0dfVEFHLCAiY2xlYXJQcmludFNwb29sZXJEYXRhKCkiKTsKLSAgICAgICAgY2xlYXJQcmludFNwb29sZXJEYXRhKCk7Ci0KLSAgICAgICAgU3lzdGVtVXRpbC5ydW5TaGVsbENvbW1hbmQoaW5zdHJ1bWVudGF0aW9uLCAic2V0dGluZ3MgcHV0IHNlY3VyZSAiCi0gICAgICAgICAgICAgICAgICAgICsgU2V0dGluZ3MuU2VjdXJlLkRJU0FCTEVEX1BSSU5UX1NFUlZJQ0VTICsgIiBudWxsIik7Ci0KLSAgICAgICAgTG9nLmQoTE9HX1RBRywgInRlYXJEb3duQ2xhc3MoKSBkb25lIik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJpbnQoZmluYWwgUHJpbnREb2N1bWVudEFkYXB0ZXIgYWRhcHRlciwgZmluYWwgUHJpbnRBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLSAgICAgICAgcHJpbnQoYWRhcHRlciwgIlByaW50IGpvYiIsIGF0dHJpYnV0ZXMpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHByaW50KFByaW50RG9jdW1lbnRBZGFwdGVyIGFkYXB0ZXIpIHsKLSAgICAgICAgcHJpbnQoYWRhcHRlciwgKFByaW50QXR0cmlidXRlcykgbnVsbCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJpbnQoUHJpbnREb2N1bWVudEFkYXB0ZXIgYWRhcHRlciwgU3RyaW5nIHByaW50Sm9iTmFtZSkgewotICAgICAgICBwcmludChhZGFwdGVyLCBwcmludEpvYk5hbWUsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0YXJ0IHByaW50aW5nCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYWRhcHRlciAgICAgIEFkYXB0ZXIgc3VwcGx5aW5nIGRhdGEgdG8gcHJpbnQKLSAgICAgKiBAcGFyYW0gcHJpbnRKb2JOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcmludCBqb2IKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcmludChATm9uTnVsbCBQcmludERvY3VtZW50QWRhcHRlciBhZGFwdGVyLCBATm9uTnVsbCBTdHJpbmcgcHJpbnRKb2JOYW1lLAotICAgICAgICAgICAgQE51bGxhYmxlIFByaW50QXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0gICAgICAgIC8vIEluaXRpYXRlIHByaW50aW5nIGFzIGlmIGNvbWluZyBmcm9tIHRoZSBhcHAuCi0gICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpCi0gICAgICAgICAgICAgICAgLnJ1bk9uTWFpblN5bmMoKCkgLT4gZ2V0UHJpbnRNYW5hZ2VyKGdldEFjdGl2aXR5KCkpLnByaW50KHByaW50Sm9iTmFtZSwgYWRhcHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMpKTsKLSAgICB9Ci0KLSAgICB2b2lkIG9uQ2FuY2VsT3BlcmF0aW9uQ2FsbGVkKCkgewotICAgICAgICBtQ2FuY2VsT3BlcmF0aW9uQ291bnRlci5jYWxsKCk7Ci0gICAgfQotCi0gICAgdm9pZCBvbkxheW91dENhbGxlZCgpIHsKLSAgICAgICAgbUxheW91dENhbGxDb3VudGVyLmNhbGwoKTsKLSAgICB9Ci0KLSAgICBpbnQgZ2V0V3JpdGVDYWxsQ291bnQoKSB7Ci0gICAgICAgIHJldHVybiBtV3JpdGVDYWxsQ291bnRlci5nZXRDYWxsQ291bnQoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBvbldyaXRlQ2FsbGVkKCkgewotICAgICAgICBtV3JpdGVDYWxsQ291bnRlci5jYWxsKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgb25Xcml0ZUNhbmNlbENhbGxlZCgpIHsKLSAgICAgICAgbVdyaXRlQ2FuY2VsQ2FsbENvdW50ZXIuY2FsbCgpOwotICAgIH0KLQotICAgIHZvaWQgb25GaW5pc2hDYWxsZWQoKSB7Ci0gICAgICAgIG1GaW5pc2hDYWxsQ291bnRlci5jYWxsKCk7Ci0gICAgfQotCi0gICAgdm9pZCBvblByaW50Sm9iUXVldWVkQ2FsbGVkKCkgewotICAgICAgICBtUHJpbnRKb2JRdWV1ZWRDYWxsQ291bnRlci5jYWxsKCk7Ci0gICAgfQotCi0gICAgdm9pZCBvblByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uQ3JlYXRlQ2FsbGVkKCkgewotICAgICAgICBtQ3JlYXRlU2Vzc2lvbkNhbGxDb3VudGVyLmNhbGwoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBvblByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uRGVzdHJveUNhbGxlZCgpIHsKLSAgICAgICAgbURlc3Ryb3lTZXNzaW9uQ2FsbENvdW50ZXIuY2FsbCgpOwotICAgIH0KLQotICAgIHZvaWQgd2FpdEZvckNhbmNlbE9wZXJhdGlvbkNhbGxiYWNrQ2FsbGVkKCkgewotICAgICAgICB3YWl0Rm9yQ2FsbGJhY2tDYWxsQ291bnQobUNhbmNlbE9wZXJhdGlvbkNvdW50ZXIsIDEsCi0gICAgICAgICAgICAgICAgIkRpZCBub3QgZ2V0IGV4cGVjdGVkIGNhbGwgdG8gb25DYW5jZWwgZm9yIHRoZSBjdXJyZW50IG9wZXJhdGlvbi4iKTsKLSAgICB9Ci0KLSAgICB2b2lkIHdhaXRGb3JQcmludGVyRGlzY292ZXJ5U2Vzc2lvbkNyZWF0ZUNhbGxiYWNrQ2FsbGVkKCkgewotICAgICAgICB3YWl0Rm9yQ2FsbGJhY2tDYWxsQ291bnQobUNyZWF0ZVNlc3Npb25DYWxsQ291bnRlciwgMSwKLSAgICAgICAgICAgICAgICAiRGlkIG5vdCBnZXQgZXhwZWN0ZWQgY2FsbCB0byBvbkNyZWF0ZVByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uLiIpOwotICAgIH0KLQotICAgIHZvaWQgd2FpdEZvclByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uRGVzdHJveUNhbGxiYWNrQ2FsbGVkKGludCBjb3VudCkgewotICAgICAgICB3YWl0Rm9yQ2FsbGJhY2tDYWxsQ291bnQobURlc3Ryb3lTZXNzaW9uQ2FsbENvdW50ZXIsIGNvdW50LAotICAgICAgICAgICAgICAgICJEaWQgbm90IGdldCBleHBlY3RlZCBjYWxsIHRvIG9uRGVzdHJveVByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uLiIpOwotICAgIH0KLQotICAgIHZvaWQgd2FpdEZvclNlcnZpY2VPblByaW50Sm9iUXVldWVkQ2FsbGJhY2tDYWxsZWQoaW50IGNvdW50KSB7Ci0gICAgICAgIHdhaXRGb3JDYWxsYmFja0NhbGxDb3VudChtUHJpbnRKb2JRdWV1ZWRDYWxsQ291bnRlciwgY291bnQsCi0gICAgICAgICAgICAgICAgIkRpZCBub3QgZ2V0IGV4cGVjdGVkIGNhbGwgdG8gb25QcmludEpvYlF1ZXVlZC4iKTsKLSAgICB9Ci0KLSAgICB2b2lkIHdhaXRGb3JBZGFwdGVyRmluaXNoQ2FsbGJhY2tDYWxsZWQoKSB7Ci0gICAgICAgIHdhaXRGb3JDYWxsYmFja0NhbGxDb3VudChtRmluaXNoQ2FsbENvdW50ZXIsIDEsCi0gICAgICAgICAgICAgICAgIkRpZCBub3QgZ2V0IGV4cGVjdGVkIGNhbGwgdG8gZmluaXNoLiIpOwotICAgIH0KLQotICAgIHZvaWQgd2FpdEZvckxheW91dEFkYXB0ZXJDYWxsYmFja0NvdW50KGludCBjb3VudCkgewotICAgICAgICB3YWl0Rm9yQ2FsbGJhY2tDYWxsQ291bnQobUxheW91dENhbGxDb3VudGVyLCBjb3VudCwKLSAgICAgICAgICAgICAgICAiRGlkIG5vdCBnZXQgZXhwZWN0ZWQgY2FsbCB0byBsYXlvdXQuIik7Ci0gICAgfQotCi0gICAgdm9pZCB3YWl0Rm9yV3JpdGVBZGFwdGVyQ2FsbGJhY2soaW50IGNvdW50KSB7Ci0gICAgICAgIHdhaXRGb3JDYWxsYmFja0NhbGxDb3VudChtV3JpdGVDYWxsQ291bnRlciwgY291bnQsICJEaWQgbm90IGdldCBleHBlY3RlZCBjYWxsIHRvIHdyaXRlLiIpOwotICAgIH0KLQotICAgIHZvaWQgd2FpdEZvcldyaXRlQ2FuY2VsQ2FsbGJhY2soaW50IGNvdW50KSB7Ci0gICAgICAgIHdhaXRGb3JDYWxsYmFja0NhbGxDb3VudChtV3JpdGVDYW5jZWxDYWxsQ291bnRlciwgY291bnQsCi0gICAgICAgICAgICAgICAgIkRpZCBub3QgZ2V0IGV4cGVjdGVkIGNhbmNlbCBvZiB3cml0ZS4iKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHdhaXRGb3JDYWxsYmFja0NhbGxDb3VudChDYWxsQ291bnRlciBjb3VudGVyLCBpbnQgY291bnQsIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb3VudGVyLndhaXRGb3JDb3VudChjb3VudCwgT1BFUkFUSU9OX1RJTUVPVVRfTUlMTElTKTsKLSAgICAgICAgfSBjYXRjaCAoVGltZW91dEV4Y2VwdGlvbiB0ZSkgewotICAgICAgICAgICAgZmFpbChtZXNzYWdlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluZGljYXRlIHRoZSBwcmludCBhY3Rpdml0eSB3YXMgY3JlYXRlZC4KLSAgICAgKi8KLSAgICBzdGF0aWMgdm9pZCBvbkFjdGl2aXR5Q3JlYXRlQ2FsbGVkKGludCB0ZXN0SWQsIFByaW50RG9jdW1lbnRBY3Rpdml0eSBhY3Rpdml0eSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKHNJZFRvVGVzdCkgewotICAgICAgICAgICAgQmFzZVByaW50VGVzdCB0ZXN0ID0gc0lkVG9UZXN0LmdldCh0ZXN0SWQpOwotICAgICAgICAgICAgaWYgKHRlc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRlc3QubUFjdGl2aXR5ID0gYWN0aXZpdHk7Ci0gICAgICAgICAgICAgICAgdGVzdC5tQ3JlYXRlQWN0aXZpdHlDYWxsQ291bnRlci5jYWxsKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZSB0aGUgcHJpbnQgYWN0aXZpdHkgd2FzIGRlc3Ryb3llZC4KLSAgICAgKi8KLSAgICBzdGF0aWMgdm9pZCBvbkFjdGl2aXR5RGVzdHJveUNhbGxlZChpbnQgdGVzdElkKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoc0lkVG9UZXN0KSB7Ci0gICAgICAgICAgICBCYXNlUHJpbnRUZXN0IHRlc3QgPSBzSWRUb1Rlc3QuZ2V0KHRlc3RJZCk7Ci0gICAgICAgICAgICBpZiAodGVzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGVzdC5tRGVzdHJveUFjdGl2aXR5Q2FsbENvdW50ZXIuY2FsbCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGZpbmlzaEFjdGl2aXR5KCkgewotICAgICAgICBBY3Rpdml0eSBhY3Rpdml0eSA9IG1BY3Rpdml0eTsKLQotICAgICAgICBpZiAoYWN0aXZpdHkgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKCFhY3Rpdml0eS5pc0ZpbmlzaGluZygpKSB7Ci0gICAgICAgICAgICAgICAgYWN0aXZpdHkuZmluaXNoKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHdoaWxlICghYWN0aXZpdHkuaXNEZXN0cm95ZWQoKSkgewotICAgICAgICAgICAgICAgIGludCBjcmVhdGVzID0gbUNyZWF0ZUFjdGl2aXR5Q2FsbENvdW50ZXIuZ2V0Q2FsbENvdW50KCk7Ci0gICAgICAgICAgICAgICAgd2FpdEZvckNhbGxiYWNrQ2FsbENvdW50KG1EZXN0cm95QWN0aXZpdHlDYWxsQ291bnRlciwgY3JlYXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICJBY3Rpdml0eSB3YXMgbm90IGRlc3Ryb3llZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBudW1iZXIgb2YgdGllcyB0aGUgcHJpbnQgYWN0aXZpdHkgd2FzIGRlc3Ryb3llZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBvbkRlc3Ryb3kgY2FsbHMgb24gdGhlIHByaW50IGFjdGl2aXR5LgotICAgICAqLwotICAgIGludCBnZXRBY3Rpdml0eURlc3Ryb3lDYWxsYmFja0NhbGxDb3VudCgpIHsKLSAgICAgICAgcmV0dXJuIG1EZXN0cm95QWN0aXZpdHlDYWxsQ291bnRlci5nZXRDYWxsQ291bnQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIG51bWJlciBvZiB0aWVzIHRoZSBwcmludCBhY3Rpdml0eSB3YXMgY3JlYXRlZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBvbkNyZWF0ZSBjYWxscyBvbiB0aGUgcHJpbnQgYWN0aXZpdHkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgZ2V0QWN0aXZpdHlDcmVhdGVDYWxsYmFja0NhbGxDb3VudCgpIHsKLSAgICAgICAgcmV0dXJuIG1DcmVhdGVBY3Rpdml0eUNhbGxDb3VudGVyLmdldENhbGxDb3VudCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdhaXQgdW50aWwgY3JlYXRlIHdhcyBjYWxsZWQge0Bjb2RlIGNvdW50fSB0aW1lcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb3VudCBUaGUgbnVtYmVyIG9mIGNyZWF0ZSBjYWxscyB0byBleHBlY3QuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHdhaXRGb3JBY3Rpdml0eUNyZWF0ZUNhbGxiYWNrQ2FsbGVkKGludCBjb3VudCkgewotICAgICAgICB3YWl0Rm9yQ2FsbGJhY2tDYWxsQ291bnQobUNyZWF0ZUFjdGl2aXR5Q2FsbENvdW50ZXIsIGNvdW50LAotICAgICAgICAgICAgICAgICJEaWQgbm90IGdldCBleHBlY3RlZCBjYWxsIHRvIGNyZWF0ZS4iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXNldCBhbGwgY291bnRlcnMuCi0gICAgICovCi0gICAgdm9pZCByZXNldENvdW50ZXJzKCkgewotICAgICAgICBtQ2FuY2VsT3BlcmF0aW9uQ291bnRlci5yZXNldCgpOwotICAgICAgICBtTGF5b3V0Q2FsbENvdW50ZXIucmVzZXQoKTsKLSAgICAgICAgbVdyaXRlQ2FsbENvdW50ZXIucmVzZXQoKTsKLSAgICAgICAgbVdyaXRlQ2FuY2VsQ2FsbENvdW50ZXIucmVzZXQoKTsKLSAgICAgICAgbUZpbmlzaENhbGxDb3VudGVyLnJlc2V0KCk7Ci0gICAgICAgIG1QcmludEpvYlF1ZXVlZENhbGxDb3VudGVyLnJlc2V0KCk7Ci0gICAgICAgIG1DcmVhdGVTZXNzaW9uQ2FsbENvdW50ZXIucmVzZXQoKTsKLSAgICAgICAgbURlc3Ryb3lTZXNzaW9uQ2FsbENvdW50ZXIucmVzZXQoKTsKLSAgICAgICAgbURlc3Ryb3lBY3Rpdml0eUNhbGxDb3VudGVyLnJlc2V0KCk7Ci0gICAgICAgIG1DcmVhdGVBY3Rpdml0eUNhbGxDb3VudGVyLnJlc2V0KCk7Ci0gICAgfQotCi0gICAgdm9pZCBzZWxlY3RQcmludGVyKFN0cmluZyBwcmludGVyTmFtZSkgdGhyb3dzIFVpT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGxvbmcgZGVsYXkgPSAxOwotICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBVaURldmljZSB1aURldmljZSA9IGdldFVpRGV2aWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIFVpT2JqZWN0IGRlc3RpbmF0aW9uU3Bpbm5lciA9IHVpRGV2aWNlLmZpbmRPYmplY3QobmV3IFVpU2VsZWN0b3IoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXNvdXJjZUlkKCJjb20uYW5kcm9pZC5wcmludHNwb29sZXI6aWQvZGVzdGluYXRpb25fc3Bpbm5lciIpKTsKLQotICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvblNwaW5uZXIuY2xpY2soKTsKLSAgICAgICAgICAgICAgICAgICAgZ2V0VWlEZXZpY2UoKS53YWl0Rm9ySWRsZSgpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIEdpdmUgc3Bpbm5lciBzb21lIHRpbWUgdG8gZXhwYW5kCi0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoZGVsYXkpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIHRyeSB0byBzZWxlY3QgcHJpbnRlcgotICAgICAgICAgICAgICAgICAgICBVaU9iamVjdCBwcmludGVyT3B0aW9uID0gdWlEZXZpY2UuZmluZE9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVWlTZWxlY3RvcigpLnRleHQocHJpbnRlck5hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRlck9wdGlvbi5jbGljaygpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVpT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiQ291bGQgbm90IHNlbGVjdCBwcmludGVyICIgKyBwcmludGVyTmFtZSwgZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZ2V0VWlEZXZpY2UoKS53YWl0Rm9ySWRsZSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKCFwcmludGVyTmFtZS5lcXVhbHMoIkFsbCBwcmludGVyc+KApiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBwcmludGVyIGlzIHNlbGVjdGVkCi0gICAgICAgICAgICAgICAgICAgIGlmIChnZXRVaURldmljZSgpLmhhc09iamVjdChCeS50ZXh0KHByaW50ZXJOYW1lKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlbGF5IDw9IE9QRVJBVElPTl9USU1FT1VUX01JTExJUykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJDYW5ub3QgZmluZCBwcmludGVyICIgKyBwcmludGVyTmFtZSArICIsIHJldHJ5aW5nLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5ICo9IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVaU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIGZpbmQgcHJpbnRlciAiICsgcHJpbnRlck5hbWUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGV2ZW4gdGhvdWdoIHdlIHJldHJpZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoVWlPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBkdW1wV2luZG93SGllcmFyY2h5KCk7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBhbnN3ZXJQcmludFNlcnZpY2VzV2FybmluZyhib29sZWFuIGNvbmZpcm0pIHRocm93cyBVaU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgVWlPYmplY3QgYnV0dG9uOwotICAgICAgICBpZiAoY29uZmlybSkgewotICAgICAgICAgICAgYnV0dG9uID0gZ2V0VWlEZXZpY2UoKS5maW5kT2JqZWN0KG5ldyBVaVNlbGVjdG9yKCkucmVzb3VyY2VJZCgiYW5kcm9pZDppZC9idXR0b24xIikpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnV0dG9uID0gZ2V0VWlEZXZpY2UoKS5maW5kT2JqZWN0KG5ldyBVaVNlbGVjdG9yKCkucmVzb3VyY2VJZCgiYW5kcm9pZDppZC9idXR0b24yIikpOwotICAgICAgICB9Ci0gICAgICAgIGJ1dHRvbi5jbGljaygpOwotICAgIH0KLQotICAgIHZvaWQgY2hhbmdlT3JpZW50YXRpb24oU3RyaW5nIG9yaWVudGF0aW9uKSB0aHJvd3MgVWlPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgVWlEZXZpY2UgdWlEZXZpY2UgPSBnZXRVaURldmljZSgpOwotICAgICAgICAgICAgVWlPYmplY3Qgb3JpZW50YXRpb25TcGlubmVyID0gdWlEZXZpY2UuZmluZE9iamVjdChuZXcgVWlTZWxlY3RvcigpLnJlc291cmNlSWQoCi0gICAgICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5wcmludHNwb29sZXI6aWQvb3JpZW50YXRpb25fc3Bpbm5lciIpKTsKLSAgICAgICAgICAgIG9yaWVudGF0aW9uU3Bpbm5lci5jbGljaygpOwotICAgICAgICAgICAgVWlPYmplY3Qgb3JpZW50YXRpb25PcHRpb24gPSB1aURldmljZS5maW5kT2JqZWN0KG5ldyBVaVNlbGVjdG9yKCkudGV4dChvcmllbnRhdGlvbikpOwotICAgICAgICAgICAgb3JpZW50YXRpb25PcHRpb24uY2xpY2soKTsKLSAgICAgICAgfSBjYXRjaCAoVWlPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBkdW1wV2luZG93SGllcmFyY2h5KCk7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRPcmllbnRhdGlvbigpIHRocm93cyBVaU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBVaU9iamVjdCBvcmllbnRhdGlvblNwaW5uZXIgPSBnZXRVaURldmljZSgpLmZpbmRPYmplY3QobmV3IFVpU2VsZWN0b3IoKS5yZXNvdXJjZUlkKAotICAgICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQucHJpbnRzcG9vbGVyOmlkL29yaWVudGF0aW9uX3NwaW5uZXIiKSk7Ci0gICAgICAgICAgICByZXR1cm4gb3JpZW50YXRpb25TcGlubmVyLmdldFRleHQoKTsKLSAgICAgICAgfSBjYXRjaCAoVWlPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBkdW1wV2luZG93SGllcmFyY2h5KCk7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBjaGFuZ2VNZWRpYVNpemUoU3RyaW5nIG1lZGlhU2l6ZSkgdGhyb3dzIFVpT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFVpRGV2aWNlIHVpRGV2aWNlID0gZ2V0VWlEZXZpY2UoKTsKLSAgICAgICAgICAgIFVpT2JqZWN0IG1lZGlhU2l6ZVNwaW5uZXIgPSB1aURldmljZS5maW5kT2JqZWN0KG5ldyBVaVNlbGVjdG9yKCkucmVzb3VyY2VJZCgKLSAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLnByaW50c3Bvb2xlcjppZC9wYXBlcl9zaXplX3NwaW5uZXIiKSk7Ci0gICAgICAgICAgICBtZWRpYVNpemVTcGlubmVyLmNsaWNrKCk7Ci0gICAgICAgICAgICBVaU9iamVjdCBtZWRpYVNpemVPcHRpb24gPSB1aURldmljZS5maW5kT2JqZWN0KG5ldyBVaVNlbGVjdG9yKCkudGV4dChtZWRpYVNpemUpKTsKLSAgICAgICAgICAgIG1lZGlhU2l6ZU9wdGlvbi5jbGljaygpOwotICAgICAgICB9IGNhdGNoIChVaU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGR1bXBXaW5kb3dIaWVyYXJjaHkoKTsKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGNoYW5nZUNvbG9yKFN0cmluZyBjb2xvcikgdGhyb3dzIFVpT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFVpRGV2aWNlIHVpRGV2aWNlID0gZ2V0VWlEZXZpY2UoKTsKLSAgICAgICAgICAgIFVpT2JqZWN0IGNvbG9yU3Bpbm5lciA9IHVpRGV2aWNlLmZpbmRPYmplY3QobmV3IFVpU2VsZWN0b3IoKS5yZXNvdXJjZUlkKAotICAgICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQucHJpbnRzcG9vbGVyOmlkL2NvbG9yX3NwaW5uZXIiKSk7Ci0gICAgICAgICAgICBjb2xvclNwaW5uZXIuY2xpY2soKTsKLSAgICAgICAgICAgIFVpT2JqZWN0IGNvbG9yT3B0aW9uID0gdWlEZXZpY2UuZmluZE9iamVjdChuZXcgVWlTZWxlY3RvcigpLnRleHQoY29sb3IpKTsKLSAgICAgICAgICAgIGNvbG9yT3B0aW9uLmNsaWNrKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFVpT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZHVtcFdpbmRvd0hpZXJhcmNoeSgpOwotICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q29sb3IoKSB0aHJvd3MgVWlPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgVWlPYmplY3QgY29sb3JTcGlubmVyID0gZ2V0VWlEZXZpY2UoKS5maW5kT2JqZWN0KG5ldyBVaVNlbGVjdG9yKCkucmVzb3VyY2VJZCgKLSAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLnByaW50c3Bvb2xlcjppZC9jb2xvcl9zcGlubmVyIikpOwotICAgICAgICAgICAgcmV0dXJuIGNvbG9yU3Bpbm5lci5nZXRUZXh0KCk7Ci0gICAgICAgIH0gY2F0Y2ggKFVpT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZHVtcFdpbmRvd0hpZXJhcmNoeSgpOwotICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgY2hhbmdlRHVwbGV4KFN0cmluZyBkdXBsZXgpIHRocm93cyBVaU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBVaURldmljZSB1aURldmljZSA9IGdldFVpRGV2aWNlKCk7Ci0gICAgICAgICAgICBVaU9iamVjdCBkdXBsZXhTcGlubmVyID0gdWlEZXZpY2UuZmluZE9iamVjdChuZXcgVWlTZWxlY3RvcigpLnJlc291cmNlSWQoCi0gICAgICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5wcmludHNwb29sZXI6aWQvZHVwbGV4X3NwaW5uZXIiKSk7Ci0gICAgICAgICAgICBkdXBsZXhTcGlubmVyLmNsaWNrKCk7Ci0gICAgICAgICAgICBVaU9iamVjdCBkdXBsZXhPcHRpb24gPSB1aURldmljZS5maW5kT2JqZWN0KG5ldyBVaVNlbGVjdG9yKCkudGV4dChkdXBsZXgpKTsKLSAgICAgICAgICAgIGR1cGxleE9wdGlvbi5jbGljaygpOwotICAgICAgICB9IGNhdGNoIChVaU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGR1bXBXaW5kb3dIaWVyYXJjaHkoKTsKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGNoYW5nZUNvcGllcyhpbnQgbmV3Q29waWVzKSB0aHJvd3MgVWlPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgVWlPYmplY3QgY29waWVzID0gZ2V0VWlEZXZpY2UoKS5maW5kT2JqZWN0KG5ldyBVaVNlbGVjdG9yKCkucmVzb3VyY2VJZCgKLSAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLnByaW50c3Bvb2xlcjppZC9jb3BpZXNfZWRpdHRleHQiKSk7Ci0gICAgICAgICAgICBjb3BpZXMuc2V0VGV4dChJbnRlZ2VyLnZhbHVlT2YobmV3Q29waWVzKS50b1N0cmluZygpKTsKLSAgICAgICAgfSBjYXRjaCAoVWlPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBkdW1wV2luZG93SGllcmFyY2h5KCk7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDb3BpZXMoKSB0aHJvd3MgVWlPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgVWlPYmplY3QgY29waWVzID0gZ2V0VWlEZXZpY2UoKS5maW5kT2JqZWN0KG5ldyBVaVNlbGVjdG9yKCkucmVzb3VyY2VJZCgKLSAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLnByaW50c3Bvb2xlcjppZC9jb3BpZXNfZWRpdHRleHQiKSk7Ci0gICAgICAgICAgICByZXR1cm4gY29waWVzLmdldFRleHQoKTsKLSAgICAgICAgfSBjYXRjaCAoVWlPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBkdW1wV2luZG93SGllcmFyY2h5KCk7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBhc3NlcnROb1ByaW50QnV0dG9uKCkgdGhyb3dzIFVpT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0RmFsc2UoZ2V0VWlEZXZpY2UoKS5oYXNPYmplY3QoQnkucmVzKCJjb20uYW5kcm9pZC5wcmludHNwb29sZXI6aWQvcHJpbnRfYnV0dG9uIikpKTsKLSAgICB9Ci0KLSAgICB2b2lkIGNsaWNrUHJpbnRCdXR0b24oKSB0aHJvd3MgVWlPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgVWlPYmplY3QgcHJpbnRCdXR0b24gPSBnZXRVaURldmljZSgpLmZpbmRPYmplY3QobmV3IFVpU2VsZWN0b3IoKS5yZXNvdXJjZUlkKAotICAgICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQucHJpbnRzcG9vbGVyOmlkL3ByaW50X2J1dHRvbiIpKTsKLSAgICAgICAgICAgIHByaW50QnV0dG9uLmNsaWNrKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFVpT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZHVtcFdpbmRvd0hpZXJhcmNoeSgpOwotICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgY2xpY2tSZXRyeUJ1dHRvbigpIHRocm93cyBVaU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBVaU9iamVjdCByZXRyeUJ1dHRvbiA9IGdldFVpRGV2aWNlKCkuZmluZE9iamVjdChuZXcgVWlTZWxlY3RvcigpLnJlc291cmNlSWQoCi0gICAgICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5wcmludHNwb29sZXI6aWQvYWN0aW9uX2J1dHRvbiIpKTsKLSAgICAgICAgICAgIHJldHJ5QnV0dG9uLmNsaWNrKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFVpT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZHVtcFdpbmRvd0hpZXJhcmNoeSgpOwotICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgZHVtcFdpbmRvd0hpZXJhcmNoeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgZ2V0VWlEZXZpY2UoKS5kdW1wV2luZG93SGllcmFyY2h5KG9zKTsKLQotICAgICAgICBMb2cudyhMT0dfVEFHLCAiV2luZG93IGhpZXJhcmNoeToiKTsKLSAgICAgICAgZm9yIChTdHJpbmcgbGluZSA6IG9zLnRvU3RyaW5nKCJVVEYtOCIpLnNwbGl0KCJcbiIpKSB7Ci0gICAgICAgICAgICBMb2cudyhMT0dfVEFHLCBsaW5lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBQcmludERvY3VtZW50QWN0aXZpdHkgZ2V0QWN0aXZpdHkoKSB7Ci0gICAgICAgIHJldHVybiBtQWN0aXZpdHk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQWN0aXZpdHkoKSB7Ci0gICAgICAgIExvZy5kKExPR19UQUcsICJjcmVhdGVBY3Rpdml0eSgpIik7Ci0KLSAgICAgICAgaW50IGNyZWF0ZUJlZm9yZSA9IGdldEFjdGl2aXR5Q3JlYXRlQ2FsbGJhY2tDYWxsQ291bnQoKTsKLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChJbnRlbnQuQUNUSU9OX01BSU4pOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoVEVTVF9JRCwgbVRlc3RJZCk7Ci0KLSAgICAgICAgSW5zdHJ1bWVudGF0aW9uIGluc3RydW1lbnRhdGlvbiA9IGdldEluc3RydW1lbnRhdGlvbigpOwotICAgICAgICBpbnRlbnQuc2V0Q2xhc3NOYW1lKGluc3RydW1lbnRhdGlvbi5nZXRUYXJnZXRDb250ZXh0KCkuZ2V0UGFja2FnZU5hbWUoKSwKLSAgICAgICAgICAgICAgICBQcmludERvY3VtZW50QWN0aXZpdHkuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLKTsKLSAgICAgICAgaW5zdHJ1bWVudGF0aW9uLnN0YXJ0QWN0aXZpdHlTeW5jKGludGVudCk7Ci0KLSAgICAgICAgd2FpdEZvckFjdGl2aXR5Q3JlYXRlQ2FsbGJhY2tDYWxsZWQoY3JlYXRlQmVmb3JlICsgMSk7Ci0gICAgfQotCi0gICAgdm9pZCBvcGVuUHJpbnRPcHRpb25zKCkgdGhyb3dzIFVpT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBVaU9iamVjdCBleHBhbmRIYW5kbGUgPSBnZXRVaURldmljZSgpLmZpbmRPYmplY3QobmV3IFVpU2VsZWN0b3IoKS5yZXNvdXJjZUlkKAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5wcmludHNwb29sZXI6aWQvZXhwYW5kX2NvbGxhcHNlX2hhbmRsZSIpKTsKLSAgICAgICAgZXhwYW5kSGFuZGxlLmNsaWNrKCk7Ci0gICAgfQotCi0gICAgdm9pZCBvcGVuQ3VzdG9tUHJpbnRPcHRpb25zKCkgdGhyb3dzIFVpT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBVaU9iamVjdCBleHBhbmRIYW5kbGUgPSBnZXRVaURldmljZSgpLmZpbmRPYmplY3QobmV3IFVpU2VsZWN0b3IoKS5yZXNvdXJjZUlkKAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5wcmludHNwb29sZXI6aWQvbW9yZV9vcHRpb25zX2J1dHRvbiIpKTsKLSAgICAgICAgZXhwYW5kSGFuZGxlLmNsaWNrKCk7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgY2xlYXJQcmludFNwb29sZXJEYXRhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRDb250ZXh0KCkuZ2V0UGFja2FnZU1hbmFnZXIoKS5oYXNTeXN0ZW1GZWF0dXJlKAotICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfUFJJTlRJTkcpKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJmYWlsZWQgdG8gY2xlYXIgcHJpbnQgc3Bvb2xlciBkYXRhIiwKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtVXRpbC5ydW5TaGVsbENvbW1hbmQoZ2V0SW5zdHJ1bWVudGF0aW9uKCksIFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInBtIGNsZWFyIC0tdXNlciAlZCAlcyIsIENVUlJFTlRfVVNFUl9JRCwgUFJJTlRfU1BPT0xFUl9QQUNLQUdFX05BTUUpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb250YWlucyhQTV9DTEVBUl9TVUNDRVNTX09VVFBVVCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCB2ZXJpZnlMYXlvdXRDYWxsKEluT3JkZXIgaW5PcmRlciwgUHJpbnREb2N1bWVudEFkYXB0ZXIgbW9jaywKLSAgICAgICAgICAgIFByaW50QXR0cmlidXRlcyBvbGRBdHRyaWJ1dGVzLCBQcmludEF0dHJpYnV0ZXMgbmV3QXR0cmlidXRlcywKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gZm9yUHJldmlldykgewotICAgICAgICBpbk9yZGVyLnZlcmlmeShtb2NrKS5vbkxheW91dChlcShvbGRBdHRyaWJ1dGVzKSwgZXEobmV3QXR0cmlidXRlcyksCi0gICAgICAgICAgICAgICAgYW55KENhbmNlbGxhdGlvblNpZ25hbC5jbGFzcyksIGFueShMYXlvdXRSZXN1bHRDYWxsYmFjay5jbGFzcyksIGFyZ1RoYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgQmFzZU1hdGNoZXI8QnVuZGxlPigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKE9iamVjdCBpdGVtKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSAoQnVuZGxlKSBpdGVtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm9yUHJldmlldyA9PSBidW5kbGUuZ2V0Qm9vbGVhbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludERvY3VtZW50QWRhcHRlci5FWFRSQV9QUklOVF9QUkVWSUVXKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBkZXNjcmliZVRvKERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvIG5vdGhpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9KSk7Ci0gICAgfQotCi0gICAgUHJpbnREb2N1bWVudEFkYXB0ZXIgY3JlYXRlTW9ja1ByaW50RG9jdW1lbnRBZGFwdGVyKEFuc3dlcjxWb2lkPiBsYXlvdXRBbnN3ZXIsCi0gICAgICAgICAgICBBbnN3ZXI8Vm9pZD4gd3JpdGVBbnN3ZXIsIEFuc3dlcjxWb2lkPiBmaW5pc2hBbnN3ZXIpIHsKLSAgICAgICAgLy8gQ3JlYXRlIGEgbW9jayBwcmludCBhZGFwdGVyLgotICAgICAgICBQcmludERvY3VtZW50QWRhcHRlciBhZGFwdGVyID0gbW9jayhQcmludERvY3VtZW50QWRhcHRlci5jbGFzcyk7Ci0gICAgICAgIGlmIChsYXlvdXRBbnN3ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgZG9BbnN3ZXIobGF5b3V0QW5zd2VyKS53aGVuKGFkYXB0ZXIpLm9uTGF5b3V0KGFueShQcmludEF0dHJpYnV0ZXMuY2xhc3MpLAotICAgICAgICAgICAgICAgICAgICBhbnkoUHJpbnRBdHRyaWJ1dGVzLmNsYXNzKSwgYW55KENhbmNlbGxhdGlvblNpZ25hbC5jbGFzcyksCi0gICAgICAgICAgICAgICAgICAgIGFueShMYXlvdXRSZXN1bHRDYWxsYmFjay5jbGFzcyksIGFueShCdW5kbGUuY2xhc3MpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAod3JpdGVBbnN3ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgZG9BbnN3ZXIod3JpdGVBbnN3ZXIpLndoZW4oYWRhcHRlcikub25Xcml0ZShhbnkoUGFnZVJhbmdlW10uY2xhc3MpLAotICAgICAgICAgICAgICAgICAgICBhbnkoUGFyY2VsRmlsZURlc2NyaXB0b3IuY2xhc3MpLCBhbnkoQ2FuY2VsbGF0aW9uU2lnbmFsLmNsYXNzKSwKLSAgICAgICAgICAgICAgICAgICAgYW55KFdyaXRlUmVzdWx0Q2FsbGJhY2suY2xhc3MpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZmluaXNoQW5zd2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGRvQW5zd2VyKGZpbmlzaEFuc3dlcikud2hlbihhZGFwdGVyKS5vbkZpbmlzaCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhZGFwdGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG1vY2sge0BsaW5rIFByaW50RG9jdW1lbnRBZGFwdGVyfSB0aGF0IHByb3ZpZGVzIG9uZSBlbXB0eSBwYWdlLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgbW9jayBhZGFwdGVyCi0gICAgICovCi0gICAgQE5vbk51bGwgUHJpbnREb2N1bWVudEFkYXB0ZXIgY3JlYXRlRGVmYXVsdFByaW50RG9jdW1lbnRBZGFwdGVyKGludCBudW1QYWdlcykgewotICAgICAgICBmaW5hbCBQcmludEF0dHJpYnV0ZXNbXSBwcmludEF0dHJpYnV0ZXMgPSBuZXcgUHJpbnRBdHRyaWJ1dGVzWzFdOwotCi0gICAgICAgIHJldHVybiBjcmVhdGVNb2NrUHJpbnREb2N1bWVudEFkYXB0ZXIoCi0gICAgICAgICAgICAgICAgaW52b2NhdGlvbiAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIFByaW50QXR0cmlidXRlcyBvbGRBdHRyaWJ1dGVzID0gKFByaW50QXR0cmlidXRlcykgaW52b2NhdGlvbi5nZXRBcmd1bWVudHMoKVswXTsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRBdHRyaWJ1dGVzWzBdID0gKFByaW50QXR0cmlidXRlcykgaW52b2NhdGlvbi5nZXRBcmd1bWVudHMoKVsxXTsKLSAgICAgICAgICAgICAgICAgICAgUHJpbnREb2N1bWVudEFkYXB0ZXIuTGF5b3V0UmVzdWx0Q2FsbGJhY2sgY2FsbGJhY2sgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQcmludERvY3VtZW50QWRhcHRlci5MYXlvdXRSZXN1bHRDYWxsYmFjaykgaW52b2NhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEFyZ3VtZW50cygpWzNdOwotCi0gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uTGF5b3V0RmluaXNoZWQobmV3IFByaW50RG9jdW1lbnRJbmZvLkJ1aWxkZXIoUFJJTlRfSk9CX05BTUUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFBhZ2VDb3VudChudW1QYWdlcykuYnVpbGQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhb2xkQXR0cmlidXRlcy5lcXVhbHMocHJpbnRBdHRyaWJ1dGVzWzBdKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgb2xkQXR0cmlidXRlcyA9IHByaW50QXR0cmlidXRlc1swXTsKLQotICAgICAgICAgICAgICAgICAgICBvbkxheW91dENhbGxlZCgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9LCBpbnZvY2F0aW9uIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gYXJncyA9IGludm9jYXRpb24uZ2V0QXJndW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgICAgIFBhZ2VSYW5nZVtdIHBhZ2VzID0gKFBhZ2VSYW5nZVtdKSBhcmdzWzBdOwotICAgICAgICAgICAgICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBmZCA9IChQYXJjZWxGaWxlRGVzY3JpcHRvcikgYXJnc1sxXTsKLSAgICAgICAgICAgICAgICAgICAgUHJpbnREb2N1bWVudEFkYXB0ZXIuV3JpdGVSZXN1bHRDYWxsYmFjayBjYWxsYmFjayA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFByaW50RG9jdW1lbnRBZGFwdGVyLldyaXRlUmVzdWx0Q2FsbGJhY2spIGFyZ3NbM107Ci0KLSAgICAgICAgICAgICAgICAgICAgd3JpdGVCbGFua1BhZ2VzKHByaW50QXR0cmlidXRlc1swXSwgZmQsIHBhZ2VzWzBdLmdldFN0YXJ0KCksIHBhZ2VzWzBdLmdldEVuZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgZmQuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25Xcml0ZUZpbmlzaGVkKHBhZ2VzKTsKLQotICAgICAgICAgICAgICAgICAgICBvbldyaXRlQ2FsbGVkKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIH0sIGludm9jYXRpb24gLT4gewotICAgICAgICAgICAgICAgICAgICBvbkZpbmlzaENhbGxlZCgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwcm90ZWN0ZWQgc3RhdGljIFByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uQ2FsbGJhY2tzIGNyZWF0ZU1vY2tQcmludGVyRGlzY292ZXJ5U2Vzc2lvbkNhbGxiYWNrcygKLSAgICAgICAgICAgIEFuc3dlcjxWb2lkPiBvblN0YXJ0UHJpbnRlckRpc2NvdmVyeSwgQW5zd2VyPFZvaWQ+IG9uU3RvcFByaW50ZXJEaXNjb3ZlcnksCi0gICAgICAgICAgICBBbnN3ZXI8Vm9pZD4gb25WYWxpZGF0ZVByaW50ZXJzLCBBbnN3ZXI8Vm9pZD4gb25TdGFydFByaW50ZXJTdGF0ZVRyYWNraW5nLAotICAgICAgICAgICAgQW5zd2VyPFZvaWQ+IG9uUmVxdWVzdEN1c3RvbVByaW50ZXJJY29uLCBBbnN3ZXI8Vm9pZD4gb25TdG9wUHJpbnRlclN0YXRlVHJhY2tpbmcsCi0gICAgICAgICAgICBBbnN3ZXI8Vm9pZD4gb25EZXN0cm95KSB7Ci0gICAgICAgIFByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uQ2FsbGJhY2tzIGNhbGxiYWNrcyA9IG1vY2soUHJpbnRlckRpc2NvdmVyeVNlc3Npb25DYWxsYmFja3MuY2xhc3MpOwotCi0gICAgICAgIGRvQ2FsbFJlYWxNZXRob2QoKS53aGVuKGNhbGxiYWNrcykuc2V0U2Vzc2lvbihhbnkoU3R1YmJhYmxlUHJpbnRlckRpc2NvdmVyeVNlc3Npb24uY2xhc3MpKTsKLSAgICAgICAgd2hlbihjYWxsYmFja3MuZ2V0U2Vzc2lvbigpKS50aGVuQ2FsbFJlYWxNZXRob2QoKTsKLQotICAgICAgICBpZiAob25TdGFydFByaW50ZXJEaXNjb3ZlcnkgIT0gbnVsbCkgewotICAgICAgICAgICAgZG9BbnN3ZXIob25TdGFydFByaW50ZXJEaXNjb3ZlcnkpLndoZW4oY2FsbGJhY2tzKS5vblN0YXJ0UHJpbnRlckRpc2NvdmVyeSgKLSAgICAgICAgICAgICAgICAgICAgYW55KExpc3QuY2xhc3MpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAob25TdG9wUHJpbnRlckRpc2NvdmVyeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBkb0Fuc3dlcihvblN0b3BQcmludGVyRGlzY292ZXJ5KS53aGVuKGNhbGxiYWNrcykub25TdG9wUHJpbnRlckRpc2NvdmVyeSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChvblZhbGlkYXRlUHJpbnRlcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgZG9BbnN3ZXIob25WYWxpZGF0ZVByaW50ZXJzKS53aGVuKGNhbGxiYWNrcykub25WYWxpZGF0ZVByaW50ZXJzKAotICAgICAgICAgICAgICAgICAgICBhbnkoTGlzdC5jbGFzcykpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChvblN0YXJ0UHJpbnRlclN0YXRlVHJhY2tpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgZG9BbnN3ZXIob25TdGFydFByaW50ZXJTdGF0ZVRyYWNraW5nKS53aGVuKGNhbGxiYWNrcykub25TdGFydFByaW50ZXJTdGF0ZVRyYWNraW5nKAotICAgICAgICAgICAgICAgICAgICBhbnkoUHJpbnRlcklkLmNsYXNzKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG9uUmVxdWVzdEN1c3RvbVByaW50ZXJJY29uICE9IG51bGwpIHsKLSAgICAgICAgICAgIGRvQW5zd2VyKG9uUmVxdWVzdEN1c3RvbVByaW50ZXJJY29uKS53aGVuKGNhbGxiYWNrcykub25SZXF1ZXN0Q3VzdG9tUHJpbnRlckljb24oCi0gICAgICAgICAgICAgICAgICAgIGFueShQcmludGVySWQuY2xhc3MpLCBhbnkoQ2FuY2VsbGF0aW9uU2lnbmFsLmNsYXNzKSwKLSAgICAgICAgICAgICAgICAgICAgYW55KEN1c3RvbVByaW50ZXJJY29uQ2FsbGJhY2suY2xhc3MpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAob25TdG9wUHJpbnRlclN0YXRlVHJhY2tpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgZG9BbnN3ZXIob25TdG9wUHJpbnRlclN0YXRlVHJhY2tpbmcpLndoZW4oY2FsbGJhY2tzKS5vblN0b3BQcmludGVyU3RhdGVUcmFja2luZygKLSAgICAgICAgICAgICAgICAgICAgYW55KFByaW50ZXJJZC5jbGFzcykpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChvbkRlc3Ryb3kgIT0gbnVsbCkgewotICAgICAgICAgICAgZG9BbnN3ZXIob25EZXN0cm95KS53aGVuKGNhbGxiYWNrcykub25EZXN0cm95KCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY2FsbGJhY2tzOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBQcmludFNlcnZpY2VDYWxsYmFja3MgY3JlYXRlTW9ja1ByaW50U2VydmljZUNhbGxiYWNrcygKLSAgICAgICAgICAgIEFuc3dlcjxQcmludGVyRGlzY292ZXJ5U2Vzc2lvbkNhbGxiYWNrcz4gb25DcmVhdGVQcmludGVyRGlzY292ZXJ5U2Vzc2lvbkNhbGxiYWNrcywKLSAgICAgICAgICAgIEFuc3dlcjxWb2lkPiBvblByaW50Sm9iUXVldWVkLCBBbnN3ZXI8Vm9pZD4gb25SZXF1ZXN0Q2FuY2VsUHJpbnRKb2IpIHsKLSAgICAgICAgZmluYWwgUHJpbnRTZXJ2aWNlQ2FsbGJhY2tzIHNlcnZpY2UgPSBtb2NrKFByaW50U2VydmljZUNhbGxiYWNrcy5jbGFzcyk7Ci0KLSAgICAgICAgZG9DYWxsUmVhbE1ldGhvZCgpLndoZW4oc2VydmljZSkuc2V0U2VydmljZShhbnkoU3R1YmJhYmxlUHJpbnRTZXJ2aWNlLmNsYXNzKSk7Ci0gICAgICAgIHdoZW4oc2VydmljZS5nZXRTZXJ2aWNlKCkpLnRoZW5DYWxsUmVhbE1ldGhvZCgpOwotCi0gICAgICAgIGlmIChvbkNyZWF0ZVByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uQ2FsbGJhY2tzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGRvQW5zd2VyKG9uQ3JlYXRlUHJpbnRlckRpc2NvdmVyeVNlc3Npb25DYWxsYmFja3MpLndoZW4oc2VydmljZSkKLSAgICAgICAgICAgICAgICAgICAgLm9uQ3JlYXRlUHJpbnRlckRpc2NvdmVyeVNlc3Npb25DYWxsYmFja3MoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAob25QcmludEpvYlF1ZXVlZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBkb0Fuc3dlcihvblByaW50Sm9iUXVldWVkKS53aGVuKHNlcnZpY2UpLm9uUHJpbnRKb2JRdWV1ZWQoYW55KFByaW50Sm9iLmNsYXNzKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG9uUmVxdWVzdENhbmNlbFByaW50Sm9iICE9IG51bGwpIHsKLSAgICAgICAgICAgIGRvQW5zd2VyKG9uUmVxdWVzdENhbmNlbFByaW50Sm9iKS53aGVuKHNlcnZpY2UpLm9uUmVxdWVzdENhbmNlbFByaW50Sm9iKAotICAgICAgICAgICAgICAgICAgICBhbnkoUHJpbnRKb2IuY2xhc3MpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzZXJ2aWNlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlQmxhbmtQYWdlcyhQcmludEF0dHJpYnV0ZXMgY29uc3RyYWludHMsIFBhcmNlbEZpbGVEZXNjcmlwdG9yIG91dHB1dCwKLSAgICAgICAgICAgIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBQcmludGVkUGRmRG9jdW1lbnQgZG9jdW1lbnQgPSBuZXcgUHJpbnRlZFBkZkRvY3VtZW50KGdldEFjdGl2aXR5KCksIGNvbnN0cmFpbnRzKTsKLSAgICAgICAgZmluYWwgaW50IHBhZ2VDb3VudCA9IHRvSW5kZXggLSBmcm9tSW5kZXggKyAxOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhZ2VDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBQZGZEb2N1bWVudC5QYWdlIHBhZ2UgPSBkb2N1bWVudC5zdGFydFBhZ2UoaSk7Ci0gICAgICAgICAgICBkb2N1bWVudC5maW5pc2hQYWdlKHBhZ2UpOwotICAgICAgICB9Ci0gICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0cHV0LmdldEZpbGVEZXNjcmlwdG9yKCkpOwotICAgICAgICBkb2N1bWVudC53cml0ZVRvKGZvcyk7Ci0gICAgICAgIGZvcy5mbHVzaCgpOwotICAgICAgICBkb2N1bWVudC5jbG9zZSgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNlbGVjdFBhZ2VzKFN0cmluZyBwYWdlcywgaW50IHRvdGFsUGFnZXMpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBVaU9iamVjdCBwYWdlc1NwaW5uZXIgPSBnZXRVaURldmljZSgpLmZpbmRPYmplY3QobmV3IFVpU2VsZWN0b3IoKS5yZXNvdXJjZUlkKAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5wcmludHNwb29sZXI6aWQvcmFuZ2Vfb3B0aW9uc19zcGlubmVyIikpOwotICAgICAgICBwYWdlc1NwaW5uZXIuY2xpY2soKTsKLQotICAgICAgICBVaU9iamVjdCByYW5nZU9wdGlvbiA9IGdldFVpRGV2aWNlKCkuZmluZE9iamVjdChuZXcgVWlTZWxlY3RvcigpLnRleHRDb250YWlucygKLSAgICAgICAgICAgICAgICBnZXRQcmludFNwb29sZXJTdHJpbmdPbmVQYXJhbSgidGVtcGxhdGVfcGFnZV9yYW5nZSIsIHRvdGFsUGFnZXMpKSk7Ci0gICAgICAgIHJhbmdlT3B0aW9uLmNsaWNrKCk7Ci0KLSAgICAgICAgVWlPYmplY3QgcGFnZXNFZGl0VGV4dCA9IGdldFVpRGV2aWNlKCkuZmluZE9iamVjdChuZXcgVWlTZWxlY3RvcigpLnJlc291cmNlSWQoCi0gICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLnByaW50c3Bvb2xlcjppZC9wYWdlX3JhbmdlX2VkaXR0ZXh0IikpOwotICAgICAgICBwYWdlc0VkaXRUZXh0LnNldFRleHQocGFnZXMpOwotCi0gICAgICAgIC8vIEhpZGUgdGhlIGtleWJvYXJkLgotICAgICAgICBnZXRVaURldmljZSgpLnByZXNzQmFjaygpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIENhbGxDb3VudGVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbUxvY2sgPSBuZXcgT2JqZWN0KCk7Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgbUNhbGxDb3VudDsKLQotICAgICAgICBwdWJsaWMgdm9pZCBjYWxsKCkgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgICAgIG1DYWxsQ291bnQrKzsKLSAgICAgICAgICAgICAgICBtTG9jay5ub3RpZnlBbGwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGludCBnZXRDYWxsQ291bnQoKSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1DYWxsQ291bnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgICAgICBtQ2FsbENvdW50ID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHdhaXRGb3JDb3VudChpbnQgY291bnQsIGxvbmcgdGltZW91dE1pbGxpcykgdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24gewotICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgc3RhcnRUaW1lTWlsbGlzID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKG1DYWxsQ291bnQgPCBjb3VudCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBlbGFwc2VkVGltZU1pbGxpcyA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpIC0gc3RhcnRUaW1lTWlsbGlzOwotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgbG9uZyByZW1haW5pbmdUaW1lTWlsbGlzID0gdGltZW91dE1pbGxpcyAtIGVsYXBzZWRUaW1lTWlsbGlzOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbWFpbmluZ1RpbWVNaWxsaXMgPD0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUaW1lb3V0RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTG9jay53YWl0KHRpbWVvdXRNaWxsaXMpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogaWdub3JlICovCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIE1ha2Uge0Bjb2RlIHByaW50ZXJOYW1lfSB0aGUgZGVmYXVsdCBwcmludGVyIGJ5IGFkZGluZyBpdCB0byB0aGUgaGlzdG9yeSBvZiBwcmludGVycyBieQotICAgICAqIHByaW50aW5nIG9uY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYWRhcHRlciBUaGUge0BsaW5rIFByaW50RG9jdW1lbnRBZGFwdGVyfSB1c2VkCi0gICAgICogQHRocm93cyBFeGNlcHRpb24gSWYgdGhlIHByaW50ZXIgY291bGQgbm90IGJlIG1hZGUgZGVmYXVsdAotICAgICAqLwotICAgIHZvaWQgbWFrZURlZmF1bHRQcmludGVyKFByaW50RG9jdW1lbnRBZGFwdGVyIGFkYXB0ZXIsIFN0cmluZyBwcmludGVyTmFtZSkKLSAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBQZXJmb3JtIGEgZnVsbCBwcmludCBvcGVyYXRpb24gb24gdGhlIHByaW50ZXIKLSAgICAgICAgTG9nLmQoTE9HX1RBRywgInByaW50Iik7Ci0gICAgICAgIHByaW50KGFkYXB0ZXIpOwotICAgICAgICBMb2cuZChMT0dfVEFHLCAid2FpdEZvcldyaXRlQWRhcHRlckNhbGxiYWNrIik7Ci0gICAgICAgIHdhaXRGb3JXcml0ZUFkYXB0ZXJDYWxsYmFjaygxKTsKLSAgICAgICAgTG9nLmQoTE9HX1RBRywgInNlbGVjdFByaW50ZXIiKTsKLSAgICAgICAgc2VsZWN0UHJpbnRlcihwcmludGVyTmFtZSk7Ci0gICAgICAgIExvZy5kKExPR19UQUcsICJjbGlja1ByaW50QnV0dG9uIik7Ci0gICAgICAgIGNsaWNrUHJpbnRCdXR0b24oKTsKLSAgICAgICAgTG9nLmQoTE9HX1RBRywgImFuc3dlclByaW50U2VydmljZXNXYXJuaW5nIik7Ci0gICAgICAgIGFuc3dlclByaW50U2VydmljZXNXYXJuaW5nKHRydWUpOwotICAgICAgICBMb2cuZChMT0dfVEFHLCAid2FpdEZvclByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uRGVzdHJveUNhbGxiYWNrQ2FsbGVkIik7Ci0gICAgICAgIHdhaXRGb3JQcmludGVyRGlzY292ZXJ5U2Vzc2lvbkRlc3Ryb3lDYWxsYmFja0NhbGxlZCgxKTsKLQotICAgICAgICAvLyBTd2l0Y2ggdG8gbmV3IGFjdGl2aXR5LCB3aGljaCBzaG91bGQgbm93IHVzZSB0aGUgZGVmYXVsdCBwcmludGVyCi0gICAgICAgIExvZy5kKExPR19UQUcsICJnZXRBY3Rpdml0eSgpLmZpbmlzaCgpIik7Ci0gICAgICAgIGdldEFjdGl2aXR5KCkuZmluaXNoKCk7Ci0KLSAgICAgICAgY3JlYXRlQWN0aXZpdHkoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBzdHJpbmcgYXJyYXkgZnJvbSB0aGUgcHJpbnQgc3Bvb2xlcidzIHJlc291cmNlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZXNvdXJjZU5hbWUgVGhlIG5hbWUgb2YgdGhlIGFycmF5IHJlc291cmNlCi0gICAgICogQHJldHVybiBUaGUgbG9jYWxpemVkIHN0cmluZyBhcnJheQotICAgICAqCi0gICAgICogQHRocm93cyBFeGNlcHRpb24gSWYgYW55dGhpbmcgaXMgdW5leHBlY3RlZAotICAgICAqLwotICAgIFN0cmluZ1tdIGdldFByaW50U3Bvb2xlclN0cmluZ0FycmF5KFN0cmluZyByZXNvdXJjZU5hbWUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBQYWNrYWdlTWFuYWdlciBwbSA9IGdldEFjdGl2aXR5KCkuZ2V0UGFja2FnZU1hbmFnZXIoKTsKLSAgICAgICAgUmVzb3VyY2VzIHByaW50U3Bvb2xlclJlcyA9IHBtLmdldFJlc291cmNlc0ZvckFwcGxpY2F0aW9uKFBSSU5UU1BPT0xFUl9QQUNLQUdFKTsKLSAgICAgICAgaW50IGlkID0gcHJpbnRTcG9vbGVyUmVzLmdldElkZW50aWZpZXIocmVzb3VyY2VOYW1lLCAiYXJyYXkiLCBQUklOVFNQT09MRVJfUEFDS0FHRSk7Ci0gICAgICAgIHJldHVybiBwcmludFNwb29sZXJSZXMuZ2V0U3RyaW5nQXJyYXkoaWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhIHN0cmluZyBmcm9tIHRoZSBwcmludCBzcG9vbGVyJ3MgcmVzb3VyY2VzLgotICAgICAqCi0gICAgICogQHBhcmFtIHJlc291cmNlTmFtZSBUaGUgbmFtZSBvZiB0aGUgc3RyaW5nIHJlc291cmNlCi0gICAgICogQHJldHVybiBUaGUgbG9jYWxpemVkIHN0cmluZwotICAgICAqCi0gICAgICogQHRocm93cyBFeGNlcHRpb24gSWYgYW55dGhpbmcgaXMgdW5leHBlY3RlZAotICAgICAqLwotICAgIFN0cmluZyBnZXRQcmludFNwb29sZXJTdHJpbmcoU3RyaW5nIHJlc291cmNlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFBhY2thZ2VNYW5hZ2VyIHBtID0gZ2V0QWN0aXZpdHkoKS5nZXRQYWNrYWdlTWFuYWdlcigpOwotICAgICAgICBSZXNvdXJjZXMgcHJpbnRTcG9vbGVyUmVzID0gcG0uZ2V0UmVzb3VyY2VzRm9yQXBwbGljYXRpb24oUFJJTlRTUE9PTEVSX1BBQ0tBR0UpOwotICAgICAgICBpbnQgaWQgPSBwcmludFNwb29sZXJSZXMuZ2V0SWRlbnRpZmllcihyZXNvdXJjZU5hbWUsICJzdHJpbmciLCBQUklOVFNQT09MRVJfUEFDS0FHRSk7Ci0gICAgICAgIHJldHVybiBwcmludFNwb29sZXJSZXMuZ2V0U3RyaW5nKGlkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBzdHJpbmcgd2l0aCBvbmUgcGFyYW1ldGVyIGZyb20gdGhlIHByaW50IHNwb29sZXIncyByZXNvdXJjZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVzb3VyY2VOYW1lIFRoZSBuYW1lIG9mIHRoZSBzdHJpbmcgcmVzb3VyY2UKLSAgICAgKiBAcmV0dXJuIFRoZSBsb2NhbGl6ZWQgc3RyaW5nCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBJZiBhbnl0aGluZyBpcyB1bmV4cGVjdGVkCi0gICAgICovCi0gICAgU3RyaW5nIGdldFByaW50U3Bvb2xlclN0cmluZ09uZVBhcmFtKFN0cmluZyByZXNvdXJjZU5hbWUsIE9iamVjdCBwKQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFBhY2thZ2VNYW5hZ2VyIHBtID0gZ2V0QWN0aXZpdHkoKS5nZXRQYWNrYWdlTWFuYWdlcigpOwotICAgICAgICBSZXNvdXJjZXMgcHJpbnRTcG9vbGVyUmVzID0gcG0uZ2V0UmVzb3VyY2VzRm9yQXBwbGljYXRpb24oUFJJTlRTUE9PTEVSX1BBQ0tBR0UpOwotICAgICAgICBpbnQgaWQgPSBwcmludFNwb29sZXJSZXMuZ2V0SWRlbnRpZmllcihyZXNvdXJjZU5hbWUsICJzdHJpbmciLCBQUklOVFNQT09MRVJfUEFDS0FHRSk7Ci0gICAgICAgIHJldHVybiBwcmludFNwb29sZXJSZXMuZ2V0U3RyaW5nKGlkLCBwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGRlZmF1bHQgbWVkaWEgc2l6ZSBmb3IgdGhlIGN1cnJlbnQgbG9jYWxlLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgZGVmYXVsdCBtZWRpYSBzaXplIGZvciB0aGUgY3VycmVudCBsb2NhbGUKLSAgICAgKgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIElmIGFueXRoaW5nIGlzIHVuZXhwZWN0ZWQKLSAgICAgKi8KLSAgICBQcmludEF0dHJpYnV0ZXMuTWVkaWFTaXplIGdldERlZmF1bHRNZWRpYVNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgUGFja2FnZU1hbmFnZXIgcG0gPSBnZXRBY3Rpdml0eSgpLmdldFBhY2thZ2VNYW5hZ2VyKCk7Ci0gICAgICAgIFJlc291cmNlcyBwcmludFNwb29sZXJSZXMgPSBwbS5nZXRSZXNvdXJjZXNGb3JBcHBsaWNhdGlvbihQUklOVFNQT09MRVJfUEFDS0FHRSk7Ci0gICAgICAgIGludCBkZWZhdWx0TWVkaWFTaXplUmVzSWQgPSBwcmludFNwb29sZXJSZXMuZ2V0SWRlbnRpZmllcigibWVkaWFzaXplX2RlZmF1bHQiLCAic3RyaW5nIiwKLSAgICAgICAgICAgICAgICBQUklOVFNQT09MRVJfUEFDS0FHRSk7Ci0gICAgICAgIFN0cmluZyBkZWZhdWx0TWVkaWFTaXplTmFtZSA9IHByaW50U3Bvb2xlclJlcy5nZXRTdHJpbmcoZGVmYXVsdE1lZGlhU2l6ZVJlc0lkKTsKLQotICAgICAgICBzd2l0Y2ggKGRlZmF1bHRNZWRpYVNpemVOYW1lKSB7Ci0gICAgICAgICAgICBjYXNlICJOQV9MRVRURVIiOgotICAgICAgICAgICAgICAgIHJldHVybiBQcmludEF0dHJpYnV0ZXMuTWVkaWFTaXplLk5BX0xFVFRFUjsKLSAgICAgICAgICAgIGNhc2UgIkpJU19CNSI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFByaW50QXR0cmlidXRlcy5NZWRpYVNpemUuSklTX0I1OwotICAgICAgICAgICAgY2FzZSAiSVNPX0E0IjoKLSAgICAgICAgICAgICAgICByZXR1cm4gUHJpbnRBdHRyaWJ1dGVzLk1lZGlhU2l6ZS5JU09fQTQ7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlVua25vd24gZGVmYXVsdCBtZWRpYSBzaXplICIgKyBkZWZhdWx0TWVkaWFTaXplTmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbm5vdGF0aW9uIHVzZWQgdG8gc2lnbmFsIHRoYXQgYSB0ZXN0IGRvZXMgbm90IG5lZWQgYW4gYWN0aXZpdHkuCi0gICAgICovCi0gICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKLSAgICBAVGFyZ2V0KEVsZW1lbnRUeXBlLk1FVEhPRCkKLSAgICBAaW50ZXJmYWNlIE5vQWN0aXZpdHkgeyB9Ci0KLSAgICAvKioKLSAgICAgKiBSdWxlIHRoYXQgaGFuZGxlcyB0aGUge0BsaW5rIE5vQWN0aXZpdHl9IGFubm90YXRpb24uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2hvdWxkU3RhcnRBY3Rpdml0eSBpbXBsZW1lbnRzIFRlc3RSdWxlIHsKLSAgICAgICAgYm9vbGVhbiBub0FjdGl2aXR5OwotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RhdGVtZW50IGFwcGx5KFN0YXRlbWVudCBiYXNlLCBvcmcuanVuaXQucnVubmVyLkRlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7Ci0gICAgICAgICAgICBmb3IgKEFubm90YXRpb24gYW5ub3RhdGlvbiA6IGRlc2NyaXB0aW9uLmdldEFubm90YXRpb25zKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIE5vQWN0aXZpdHkpIHsKLSAgICAgICAgICAgICAgICAgICAgbm9BY3Rpdml0eSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGJhc2U7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9wcmludC9zcmMvYW5kcm9pZC9wcmludC9jdHMvQ2xhc3NQYXJhbWV0ZXJzVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvcHJpbnQvc3JjL2FuZHJvaWQvcHJpbnQvY3RzL0NsYXNzUGFyYW1ldGVyc1Rlc3QuamF2YQppbmRleCBlMGM0MWVhLi40N2QzZjhkIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9wcmludC9zcmMvYW5kcm9pZC9wcmludC9jdHMvQ2xhc3NQYXJhbWV0ZXJzVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3ByaW50L3NyYy9hbmRyb2lkL3ByaW50L2N0cy9DbGFzc1BhcmFtZXRlcnNUZXN0LmphdmEKQEAgLTE2LDE3ICsxNiwyMiBAQAogCiBwYWNrYWdlIGFuZHJvaWQucHJpbnQuY3RzOwogCitpbXBvcnQgc3RhdGljIGFuZHJvaWQucHJpbnQudGVzdC5VdGlscy5hc3NlcnRFeGNlcHRpb247CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKwogaW1wb3J0IGFuZHJvaWQucHJpbnQuUHJpbnRBdHRyaWJ1dGVzOwogaW1wb3J0IGFuZHJvaWQucHJpbnQuUHJpbnRBdHRyaWJ1dGVzLk1lZGlhU2l6ZTsKIGltcG9ydCBhbmRyb2lkLnByaW50LlByaW50QXR0cmlidXRlcy5SZXNvbHV0aW9uOwogaW1wb3J0IGFuZHJvaWQucHJpbnQuUHJpbnREb2N1bWVudEluZm87Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQucHJpbnQuY3RzLlV0aWxzLio7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKLQogLyoqCiAgKiBUZXN0IHRoYXQgdGhlIHByaW50IGF0dHJpYnV0ZXMgY2FuIGJlIGNvbnN0cnVjdGVkIGNvcnJlY3RseS4gVGhpcyBkb2VzIG5vdCB0ZXN0IHRoYXQgdGhlCiAgKiBhdHRyaWJ1dGVzIGhhdmUgdGhlIGRlc2lyZWQgZWZmZWN0IHdoZW4gc2VuZCB0byB0aGUgcHJpbnQgZnJhbWV3b3JrLgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcHJpbnQvc3JjL2FuZHJvaWQvcHJpbnQvY3RzL0N1c3RvbVByaW50T3B0aW9uc1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3ByaW50L3NyYy9hbmRyb2lkL3ByaW50L2N0cy9DdXN0b21QcmludE9wdGlvbnNUZXN0LmphdmEKaW5kZXggZWI5ODA2ZS4uMjAwZTQxMCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvcHJpbnQvc3JjL2FuZHJvaWQvcHJpbnQvY3RzL0N1c3RvbVByaW50T3B0aW9uc1Rlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9wcmludC9zcmMvYW5kcm9pZC9wcmludC9jdHMvQ3VzdG9tUHJpbnRPcHRpb25zVGVzdC5qYXZhCkBAIC0xNiw3ICsxNiwxMCBAQAogCiBwYWNrYWdlIGFuZHJvaWQucHJpbnQuY3RzOwogCitpbXBvcnQgc3RhdGljIGFuZHJvaWQucHJpbnQudGVzdC5VdGlscy5ldmVudHVhbGx5OworCiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuQXBwTW9kZUZ1bGw7CiBpbXBvcnQgYW5kcm9pZC5wcmludC5QYWdlUmFuZ2U7CiBpbXBvcnQgYW5kcm9pZC5wcmludC5QcmludEF0dHJpYnV0ZXM7CiBpbXBvcnQgYW5kcm9pZC5wcmludC5QcmludEF0dHJpYnV0ZXMuTWFyZ2luczsKQEAgLTMwLDM1ICszMywzMiBAQAogaW1wb3J0IGFuZHJvaWQucHJpbnQuUHJpbnRlckNhcGFiaWxpdGllc0luZm87CiBpbXBvcnQgYW5kcm9pZC5wcmludC5QcmludGVySWQ7CiBpbXBvcnQgYW5kcm9pZC5wcmludC5QcmludGVySW5mbzsKLWltcG9ydCBhbmRyb2lkLnByaW50LmN0cy5zZXJ2aWNlcy5DdXN0b21QcmludE9wdGlvbnNBY3Rpdml0eTsKLWltcG9ydCBhbmRyb2lkLnByaW50LmN0cy5zZXJ2aWNlcy5GaXJzdFByaW50U2VydmljZTsKLWltcG9ydCBhbmRyb2lkLnByaW50LmN0cy5zZXJ2aWNlcy5QcmludFNlcnZpY2VDYWxsYmFja3M7Ci1pbXBvcnQgYW5kcm9pZC5wcmludC5jdHMuc2VydmljZXMuUHJpbnRlckRpc2NvdmVyeVNlc3Npb25DYWxsYmFja3M7Ci1pbXBvcnQgYW5kcm9pZC5wcmludC5jdHMuc2VydmljZXMuU2Vjb25kUHJpbnRTZXJ2aWNlOwotaW1wb3J0IGFuZHJvaWQucHJpbnQuY3RzLnNlcnZpY2VzLlN0dWJiYWJsZVByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworaW1wb3J0IGFuZHJvaWQucHJpbnQudGVzdC5CYXNlUHJpbnRUZXN0OworaW1wb3J0IGFuZHJvaWQucHJpbnQudGVzdC5zZXJ2aWNlcy5DdXN0b21QcmludE9wdGlvbnNBY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLnByaW50LnRlc3Quc2VydmljZXMuRmlyc3RQcmludFNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5wcmludC50ZXN0LnNlcnZpY2VzLlByaW50U2VydmljZUNhbGxiYWNrczsKK2ltcG9ydCBhbmRyb2lkLnByaW50LnRlc3Quc2VydmljZXMuUHJpbnRlckRpc2NvdmVyeVNlc3Npb25DYWxsYmFja3M7CitpbXBvcnQgYW5kcm9pZC5wcmludC50ZXN0LnNlcnZpY2VzLlNlY29uZFByaW50U2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLnByaW50LnRlc3Quc2VydmljZXMuU3R1YmJhYmxlUHJpbnRlckRpc2NvdmVyeVNlc3Npb247CiBpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QudWlhdXRvbWF0b3IuQnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QudWlhdXRvbWF0b3IuVWlPYmplY3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QudWlhdXRvbWF0b3IuVWlTZWxlY3RvcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC51aWF1dG9tYXRvci5VaU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLlVpT2JqZWN0MjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKLWltcG9ydCBvcmcubW9ja2l0by5pbnZvY2F0aW9uLkludm9jYXRpb25Pbk1vY2s7Ci1pbXBvcnQgb3JnLm1vY2tpdG8uc3R1YmJpbmcuQW5zd2VyOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVvdXRFeGNlcHRpb247CiAKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5wcmludC5jdHMuVXRpbHMuZXZlbnR1YWxseTsKLQogLyoqCiAgKiBUaGlzIHRlc3QgdmVyaWZpZXMgY2hhbmdlcyB0byB0aGUgcHJpbnRlciBjYXBhYmlsaXRpZXMgYXJlIGFwcGxpZWQgY29ycmVjdGx5LgogICovCitAQXBwTW9kZUZ1bGwocmVhc29uID0gIlByaW50IFVJIGNhbm5vdCByZXNvbHZlIGN1c3RvbSBwcmludCBvcHRpb25zIGFjdGl2aXR5IGluIGEgaW5zdGFudCBhcHAiKQogQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKIHB1YmxpYyBjbGFzcyBDdXN0b21QcmludE9wdGlvbnNUZXN0IGV4dGVuZHMgQmFzZVByaW50VGVzdCB7CiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIExPR19UQUcgPSAiQ3VzdG9tUHJpbnRPcHRpb25zVGVzdCI7CkBAIC05OSwyOCArOTksMjIgQEAKICAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBJZiBzb21ldGhpbmcgd2FzIHVuZXhwZWN0ZWQKICAgICAgKi8KICAgICBwcml2YXRlIFBhZ2VSYW5nZVtdIGdldFBhZ2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChnZXRVaURldmljZSgpLmhhc09iamVjdChCeS50ZXh0KGdldFByaW50U3Bvb2xlclN0cmluZ09uZVBhcmFtKCJ0ZW1wbGF0ZV9hbGxfcGFnZXMiLAotICAgICAgICAgICAgICAgIDMpKSkpIHsKKyAgICAgICAgaWYgKGdldFVpRGV2aWNlKCkuaGFzT2JqZWN0KEJ5LnRleHQoIkFsbCAzIikpKSB7CiAgICAgICAgICAgICByZXR1cm4gUEFHRVNTWzJdOwogICAgICAgICB9CiAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFVpT2JqZWN0IHBhZ2VzRWRpdFRleHQgPSBnZXRVaURldmljZSgpLmZpbmRPYmplY3QobmV3IFVpU2VsZWN0b3IoKS5yZXNvdXJjZUlkKAotICAgICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQucHJpbnRzcG9vbGVyOmlkL3BhZ2VfcmFuZ2VfZWRpdHRleHQiKSk7CisgICAgICAgIFVpT2JqZWN0MiBwYWdlc0VkaXRUZXh0ID0gZmluZFVpT2JqZWN0KEJ5LnJlcygKKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQucHJpbnRzcG9vbGVyOmlkL3BhZ2VfcmFuZ2VfZWRpdHRleHQiKSk7CiAKLSAgICAgICAgICAgIGlmIChwYWdlc0VkaXRUZXh0LmdldFRleHQoKS5lcXVhbHMoIjIiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBQQUdFU1NbMV07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwYWdlc0VkaXRUZXh0LmdldFRleHQoKS5lcXVhbHMoIjEiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBQQUdFU1NbMF07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGNhdGNoIChVaU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGR1bXBXaW5kb3dIaWVyYXJjaHkoKTsKLSAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIGlmIChwYWdlc0VkaXRUZXh0LmdldFRleHQoKS5lcXVhbHMoIjIiKSkgeworICAgICAgICAgICAgcmV0dXJuIFBBR0VTU1sxXTsKICAgICAgICAgfQorCisgICAgICAgIGlmIChwYWdlc0VkaXRUZXh0LmdldFRleHQoKS5lcXVhbHMoIjEiKSkgeworICAgICAgICAgICAgcmV0dXJuIFBBR0VTU1swXTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAogICAgIEBCZWZvcmUKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ByaW50L3NyYy9hbmRyb2lkL3ByaW50L2N0cy9JbnRlcmZhY2VGb3JBcHBzVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvcHJpbnQvc3JjL2FuZHJvaWQvcHJpbnQvY3RzL0ludGVyZmFjZUZvckFwcHNUZXN0LmphdmEKaW5kZXggMzdlYWI1Ny4uNjI1NDA0OCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvcHJpbnQvc3JjL2FuZHJvaWQvcHJpbnQvY3RzL0ludGVyZmFjZUZvckFwcHNUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvcHJpbnQvc3JjL2FuZHJvaWQvcHJpbnQvY3RzL0ludGVyZmFjZUZvckFwcHNUZXN0LmphdmEKQEAgLTE2LDYgKzE2LDE0IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5wcmludC5jdHM7CiAKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5wcmludC50ZXN0LlV0aWxzLmV2ZW50dWFsbHk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQucHJpbnQudGVzdC5VdGlscy5nZXRQcmludEpvYjsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5wcmludC50ZXN0LlV0aWxzLmdldFByaW50TWFuYWdlcjsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCiBpbXBvcnQgYW5kcm9pZC5wcmludC5QcmludEF0dHJpYnV0ZXM7CiBpbXBvcnQgYW5kcm9pZC5wcmludC5QcmludERvY3VtZW50QWRhcHRlcjsKIGltcG9ydCBhbmRyb2lkLnByaW50LlByaW50Sm9iOwpAQCAtMjMsMjMgKzMxLDIzIEBACiBpbXBvcnQgYW5kcm9pZC5wcmludC5QcmludGVyQ2FwYWJpbGl0aWVzSW5mbzsKIGltcG9ydCBhbmRyb2lkLnByaW50LlByaW50ZXJJZDsKIGltcG9ydCBhbmRyb2lkLnByaW50LlByaW50ZXJJbmZvOwotaW1wb3J0IGFuZHJvaWQucHJpbnQuY3RzLnNlcnZpY2VzLkZpcnN0UHJpbnRTZXJ2aWNlOwotaW1wb3J0IGFuZHJvaWQucHJpbnQuY3RzLnNlcnZpY2VzLlByaW50U2VydmljZUNhbGxiYWNrczsKLWltcG9ydCBhbmRyb2lkLnByaW50LmN0cy5zZXJ2aWNlcy5QcmludGVyRGlzY292ZXJ5U2Vzc2lvbkNhbGxiYWNrczsKLWltcG9ydCBhbmRyb2lkLnByaW50LmN0cy5zZXJ2aWNlcy5TZWNvbmRQcmludFNlcnZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5wcmludC5jdHMuc2VydmljZXMuU3R1YmJhYmxlUHJpbnRlckRpc2NvdmVyeVNlc3Npb247Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKK2ltcG9ydCBhbmRyb2lkLnByaW50LnRlc3QuQmFzZVByaW50VGVzdDsKK2ltcG9ydCBhbmRyb2lkLnByaW50LnRlc3Quc2VydmljZXMuRmlyc3RQcmludFNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5wcmludC50ZXN0LnNlcnZpY2VzLlByaW50U2VydmljZUNhbGxiYWNrczsKK2ltcG9ydCBhbmRyb2lkLnByaW50LnRlc3Quc2VydmljZXMuUHJpbnRlckRpc2NvdmVyeVNlc3Npb25DYWxsYmFja3M7CitpbXBvcnQgYW5kcm9pZC5wcmludC50ZXN0LnNlcnZpY2VzLlNlY29uZFByaW50U2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLnByaW50LnRlc3Quc2VydmljZXMuU3R1YmJhYmxlUHJpbnRlckRpc2NvdmVyeVNlc3Npb247CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTm9uTnVsbDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQucHJpbnQuY3RzLlV0aWxzLio7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKLQogLyoqCiAgKiBUZXN0IGludGVyZmFjZSBmcm9tIHRoZSBhcHBsaWNhdGlvbiB0byB0aGUgcHJpbnQgc2VydmljZS4KICAqLwpAQCAtMzU4LDExICszNjYsMTEgQEAKICAgICAgICAgLy8gU2V0IHNvbWUgbm9uIGRlZmF1bHQgb3B0aW9ucwogICAgICAgICBvcGVuUHJpbnRPcHRpb25zKCk7CiAgICAgICAgIGNoYW5nZUNvcGllcygyKTsKLSAgICAgICAgY2hhbmdlQ29sb3IoZ2V0UHJpbnRTcG9vbGVyU3RyaW5nQXJyYXkoImNvbG9yX21vZGVfbGFiZWxzIilbMV0pOworICAgICAgICBjaGFuZ2VDb2xvcigiQ29sb3IiKTsKICAgICAgICAgLy8gTGVhdmUgZHVwbGV4IGFzIGRlZmF1bHQgdG8gdGVzdCB0aGF0IGRlZmF1bHRzIGFyZSByZXRhaW5lZAogICAgICAgICBjaGFuZ2VNZWRpYVNpemUoCiAgICAgICAgICAgICAgICAgUHJpbnRBdHRyaWJ1dGVzLk1lZGlhU2l6ZS5JU09fQTMuZ2V0TGFiZWwoZ2V0QWN0aXZpdHkoKS5nZXRQYWNrYWdlTWFuYWdlcigpKSk7Ci0gICAgICAgIGNoYW5nZU9yaWVudGF0aW9uKGdldFByaW50U3Bvb2xlclN0cmluZ0FycmF5KCJvcmllbnRhdGlvbl9sYWJlbHMiKVsxXSk7CisgICAgICAgIGNoYW5nZU9yaWVudGF0aW9uKCJMYW5kc2NhcGUiKTsKIAogICAgICAgICAvLyBQcmludCBhbmQgd2FpdCB1bnRpbCBpdCBpcyBjb21wbGV0ZWQKICAgICAgICAgY2xpY2tQcmludEJ1dHRvbigpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcHJpbnQvc3JjL2FuZHJvaWQvcHJpbnQvY3RzL1BhZ2VSYW5nZUFkanVzdEFuZFZlcmlmeS5qYXZhIGIvdGVzdHMvdGVzdHMvcHJpbnQvc3JjL2FuZHJvaWQvcHJpbnQvY3RzL1BhZ2VSYW5nZUFkanVzdEFuZFZlcmlmeS5qYXZhCmluZGV4IGYxMjhiYWIuLjZhZDI4OTYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3ByaW50L3NyYy9hbmRyb2lkL3ByaW50L2N0cy9QYWdlUmFuZ2VBZGp1c3RBbmRWZXJpZnkuamF2YQorKysgYi90ZXN0cy90ZXN0cy9wcmludC9zcmMvYW5kcm9pZC9wcmludC9jdHMvUGFnZVJhbmdlQWRqdXN0QW5kVmVyaWZ5LmphdmEKQEAgLTM2LDE1ICszNiwxNiBAQAogaW1wb3J0IGFuZHJvaWQucHJpbnQuUHJpbnRlckNhcGFiaWxpdGllc0luZm87CiBpbXBvcnQgYW5kcm9pZC5wcmludC5QcmludGVySWQ7CiBpbXBvcnQgYW5kcm9pZC5wcmludC5QcmludGVySW5mbzsKLWltcG9ydCBhbmRyb2lkLnByaW50LmN0cy5zZXJ2aWNlcy5GaXJzdFByaW50U2VydmljZTsKLWltcG9ydCBhbmRyb2lkLnByaW50LmN0cy5zZXJ2aWNlcy5QcmludFNlcnZpY2VDYWxsYmFja3M7Ci1pbXBvcnQgYW5kcm9pZC5wcmludC5jdHMuc2VydmljZXMuUHJpbnRlckRpc2NvdmVyeVNlc3Npb25DYWxsYmFja3M7Ci1pbXBvcnQgYW5kcm9pZC5wcmludC5jdHMuc2VydmljZXMuU2Vjb25kUHJpbnRTZXJ2aWNlOwotaW1wb3J0IGFuZHJvaWQucHJpbnQuY3RzLnNlcnZpY2VzLlN0dWJiYWJsZVByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uOwogaW1wb3J0IGFuZHJvaWQucHJpbnQucGRmLlByaW50ZWRQZGZEb2N1bWVudDsKK2ltcG9ydCBhbmRyb2lkLnByaW50LnRlc3QuQmFzZVByaW50VGVzdDsKK2ltcG9ydCBhbmRyb2lkLnByaW50LnRlc3Quc2VydmljZXMuRmlyc3RQcmludFNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5wcmludC50ZXN0LnNlcnZpY2VzLlByaW50U2VydmljZUNhbGxiYWNrczsKK2ltcG9ydCBhbmRyb2lkLnByaW50LnRlc3Quc2VydmljZXMuUHJpbnRlckRpc2NvdmVyeVNlc3Npb25DYWxsYmFja3M7CitpbXBvcnQgYW5kcm9pZC5wcmludC50ZXN0LnNlcnZpY2VzLlNlY29uZFByaW50U2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLnByaW50LnRlc3Quc2VydmljZXMuU3R1YmJhYmxlUHJpbnRlckRpc2NvdmVyeVNlc3Npb247CiBpbXBvcnQgYW5kcm9pZC5wcmludHNlcnZpY2UuUHJpbnRKb2I7CiBpbXBvcnQgYW5kcm9pZC5wcmludHNlcnZpY2UuUHJpbnRTZXJ2aWNlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk5vbk51bGw7CitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5Ob25OdWxsOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcHJpbnQvc3JjL2FuZHJvaWQvcHJpbnQvY3RzL1BhZ2VSYW5nZUFkanVzdG1lbnRUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9wcmludC9zcmMvYW5kcm9pZC9wcmludC9jdHMvUGFnZVJhbmdlQWRqdXN0bWVudFRlc3QuamF2YQppbmRleCAwMzY0NjI0Li40YTllN2FmIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9wcmludC9zcmMvYW5kcm9pZC9wcmludC9jdHMvUGFnZVJhbmdlQWRqdXN0bWVudFRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9wcmludC9zcmMvYW5kcm9pZC9wcmludC9jdHMvUGFnZVJhbmdlQWRqdXN0bWVudFRlc3QuamF2YQpAQCAtMTYsNyArMTYsOCBAQAogCiBwYWNrYWdlIGFuZHJvaWQucHJpbnQuY3RzOwogCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRTYW1lOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1hdGNoZXJzLmFueTsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5pbk9yZGVyOwogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLm5ldmVyOwpAQCAtMzUsMTUgKzM2LDE3IEBACiBpbXBvcnQgYW5kcm9pZC5wcmludC5QcmludGVyQ2FwYWJpbGl0aWVzSW5mbzsKIGltcG9ydCBhbmRyb2lkLnByaW50LlByaW50ZXJJZDsKIGltcG9ydCBhbmRyb2lkLnByaW50LlByaW50ZXJJbmZvOwotaW1wb3J0IGFuZHJvaWQucHJpbnQuY3RzLnNlcnZpY2VzLkZpcnN0UHJpbnRTZXJ2aWNlOwotaW1wb3J0IGFuZHJvaWQucHJpbnQuY3RzLnNlcnZpY2VzLlByaW50U2VydmljZUNhbGxiYWNrczsKLWltcG9ydCBhbmRyb2lkLnByaW50LmN0cy5zZXJ2aWNlcy5QcmludGVyRGlzY292ZXJ5U2Vzc2lvbkNhbGxiYWNrczsKLWltcG9ydCBhbmRyb2lkLnByaW50LmN0cy5zZXJ2aWNlcy5TZWNvbmRQcmludFNlcnZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5wcmludC5jdHMuc2VydmljZXMuU3R1YmJhYmxlUHJpbnRlckRpc2NvdmVyeVNlc3Npb247CitpbXBvcnQgYW5kcm9pZC5wcmludC50ZXN0LkJhc2VQcmludFRlc3Q7CitpbXBvcnQgYW5kcm9pZC5wcmludC50ZXN0LnNlcnZpY2VzLkZpcnN0UHJpbnRTZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQucHJpbnQudGVzdC5zZXJ2aWNlcy5QcmludFNlcnZpY2VDYWxsYmFja3M7CitpbXBvcnQgYW5kcm9pZC5wcmludC50ZXN0LnNlcnZpY2VzLlByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uQ2FsbGJhY2tzOworaW1wb3J0IGFuZHJvaWQucHJpbnQudGVzdC5zZXJ2aWNlcy5TZWNvbmRQcmludFNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5wcmludC50ZXN0LnNlcnZpY2VzLlN0dWJiYWJsZVByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uOwogaW1wb3J0IGFuZHJvaWQucHJpbnRzZXJ2aWNlLlByaW50Sm9iOwogaW1wb3J0IGFuZHJvaWQucHJpbnRzZXJ2aWNlLlByaW50U2VydmljZTsKIAotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ByaW50L3NyYy9hbmRyb2lkL3ByaW50L2N0cy9QcmludEF0dHJpYnV0ZXNUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9wcmludC9zcmMvYW5kcm9pZC9wcmludC9jdHMvUHJpbnRBdHRyaWJ1dGVzVGVzdC5qYXZhCmluZGV4IGU2YmMxNjQuLmVhZjU5OTEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3ByaW50L3NyYy9hbmRyb2lkL3ByaW50L2N0cy9QcmludEF0dHJpYnV0ZXNUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvcHJpbnQvc3JjL2FuZHJvaWQvcHJpbnQvY3RzL1ByaW50QXR0cmlidXRlc1Rlc3QuamF2YQpAQCAtMTYsNiArMTYsOCBAQAogCiBwYWNrYWdlIGFuZHJvaWQucHJpbnQuY3RzOwogCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBhbmRyb2lkLnByaW50LlBhZ2VSYW5nZTsKIGltcG9ydCBhbmRyb2lkLnByaW50LlByaW50QXR0cmlidXRlczsKQEAgLTI5LDE1ICszMSwxNyBAQAogaW1wb3J0IGFuZHJvaWQucHJpbnQuUHJpbnRlckNhcGFiaWxpdGllc0luZm87CiBpbXBvcnQgYW5kcm9pZC5wcmludC5QcmludGVySWQ7CiBpbXBvcnQgYW5kcm9pZC5wcmludC5QcmludGVySW5mbzsKLWltcG9ydCBhbmRyb2lkLnByaW50LmN0cy5zZXJ2aWNlcy5GaXJzdFByaW50U2VydmljZTsKLWltcG9ydCBhbmRyb2lkLnByaW50LmN0cy5zZXJ2aWNlcy5QcmludFNlcnZpY2VDYWxsYmFja3M7Ci1pbXBvcnQgYW5kcm9pZC5wcmludC5jdHMuc2VydmljZXMuUHJpbnRlckRpc2NvdmVyeVNlc3Npb25DYWxsYmFja3M7Ci1pbXBvcnQgYW5kcm9pZC5wcmludC5jdHMuc2VydmljZXMuU2Vjb25kUHJpbnRTZXJ2aWNlOwotaW1wb3J0IGFuZHJvaWQucHJpbnQuY3RzLnNlcnZpY2VzLlN0dWJiYWJsZVByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uOworaW1wb3J0IGFuZHJvaWQucHJpbnQudGVzdC5CYXNlUHJpbnRUZXN0OworaW1wb3J0IGFuZHJvaWQucHJpbnQudGVzdC5zZXJ2aWNlcy5GaXJzdFByaW50U2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLnByaW50LnRlc3Quc2VydmljZXMuUHJpbnRTZXJ2aWNlQ2FsbGJhY2tzOworaW1wb3J0IGFuZHJvaWQucHJpbnQudGVzdC5zZXJ2aWNlcy5QcmludGVyRGlzY292ZXJ5U2Vzc2lvbkNhbGxiYWNrczsKK2ltcG9ydCBhbmRyb2lkLnByaW50LnRlc3Quc2VydmljZXMuU2Vjb25kUHJpbnRTZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQucHJpbnQudGVzdC5zZXJ2aWNlcy5TdHViYmFibGVQcmludGVyRGlzY292ZXJ5U2Vzc2lvbjsKIGltcG9ydCBhbmRyb2lkLnByaW50c2VydmljZS5QcmludEpvYjsKLQotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CkBAIC00Niw4ICs1MCw2IEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7Ci0KIC8qKgogICogVGVzdCB0aGF0IHRoZSBwcmludCBhdHRyaWJ1dGVzIGFyZSBjb3JyZWN0bHkgcHJvcGFnYXRlZCB0aHJvdWdoIHRoZSBwcmludCBmcmFtZXdvcmsKICAqLwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcHJpbnQvc3JjL2FuZHJvaWQvcHJpbnQvY3RzL1ByaW50RG9jdW1lbnRBY3Rpdml0eS5qYXZhIGIvdGVzdHMvdGVzdHMvcHJpbnQvc3JjL2FuZHJvaWQvcHJpbnQvY3RzL1ByaW50RG9jdW1lbnRBY3Rpdml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzBjYjhhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL3Rlc3RzL3ByaW50L3NyYy9hbmRyb2lkL3ByaW50L2N0cy9QcmludERvY3VtZW50QWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQucHJpbnQuY3RzOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuS2V5Z3VhcmRNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgUHJpbnREb2N1bWVudEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIlByaW50RG9jdW1lbnRBY3Rpdml0eSI7Ci0gICAgaW50IG1UZXN0SWQ7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7Ci0gICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7Ci0KLSAgICAgICAgbVRlc3RJZCA9IGdldEludGVudCgpLmdldEludEV4dHJhKEJhc2VQcmludFRlc3QuVEVTVF9JRCwgLTEpOwotICAgICAgICBMb2cuZChMT0dfVEFHLCAib25DcmVhdGUoKSAiICsgdGhpcyArICIgZm9yICIgKyBtVGVzdElkKTsKLQotICAgICAgICBnZXRXaW5kb3coKS5hZGRGbGFncyhXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0tFRVBfU0NSRUVOX09OCi0gICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX1RVUk5fU0NSRUVOX09OKTsKLQotICAgICAgICBLZXlndWFyZE1hbmFnZXIga20gPSBnZXRTeXN0ZW1TZXJ2aWNlKEtleWd1YXJkTWFuYWdlci5jbGFzcyk7Ci0gICAgICAgIGlmIChrbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBrbS5yZXF1ZXN0RGlzbWlzc0tleWd1YXJkKHRoaXMsIG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgQmFzZVByaW50VGVzdC5vbkFjdGl2aXR5Q3JlYXRlQ2FsbGVkKG1UZXN0SWQsIHRoaXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQoQ29uZmlndXJhdGlvbiBuZXdDb25maWcpIHsKLSAgICAgICAgc3VwZXIub25Db25maWd1cmF0aW9uQ2hhbmdlZChuZXdDb25maWcpOwotCi0gICAgICAgIExvZy5kKExPR19UQUcsICJvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKCIgKyBuZXdDb25maWcgKyAiKSIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uRGVzdHJveSgpIHsKLSAgICAgICAgTG9nLmQoTE9HX1RBRywgIm9uRGVzdHJveSgpICIgKyB0aGlzKTsKLSAgICAgICAgQmFzZVByaW50VGVzdC5vbkFjdGl2aXR5RGVzdHJveUNhbGxlZChtVGVzdElkKTsKLSAgICAgICAgc3VwZXIub25EZXN0cm95KCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcHJpbnQvc3JjL2FuZHJvaWQvcHJpbnQvY3RzL1ByaW50RG9jdW1lbnRBZGFwdGVyQ29udHJhY3RUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9wcmludC9zcmMvYW5kcm9pZC9wcmludC9jdHMvUHJpbnREb2N1bWVudEFkYXB0ZXJDb250cmFjdFRlc3QuamF2YQppbmRleCAzOGJhNGRkLi4yM2FlNjIwIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9wcmludC9zcmMvYW5kcm9pZC9wcmludC9jdHMvUHJpbnREb2N1bWVudEFkYXB0ZXJDb250cmFjdFRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9wcmludC9zcmMvYW5kcm9pZC9wcmludC9jdHMvUHJpbnREb2N1bWVudEFkYXB0ZXJDb250cmFjdFRlc3QuamF2YQpAQCAtMzYsMTYgKzM2LDE4IEBACiBpbXBvcnQgYW5kcm9pZC5wcmludC5QcmludGVyQ2FwYWJpbGl0aWVzSW5mbzsKIGltcG9ydCBhbmRyb2lkLnByaW50LlByaW50ZXJJZDsKIGltcG9ydCBhbmRyb2lkLnByaW50LlByaW50ZXJJbmZvOwotaW1wb3J0IGFuZHJvaWQucHJpbnQuY3RzLnNlcnZpY2VzLkZpcnN0UHJpbnRTZXJ2aWNlOwotaW1wb3J0IGFuZHJvaWQucHJpbnQuY3RzLnNlcnZpY2VzLlByaW50U2VydmljZUNhbGxiYWNrczsKLWltcG9ydCBhbmRyb2lkLnByaW50LmN0cy5zZXJ2aWNlcy5QcmludGVyRGlzY292ZXJ5U2Vzc2lvbkNhbGxiYWNrczsKLWltcG9ydCBhbmRyb2lkLnByaW50LmN0cy5zZXJ2aWNlcy5TZWNvbmRQcmludFNlcnZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5wcmludC5jdHMuc2VydmljZXMuU3R1YmJhYmxlUHJpbnRlckRpc2NvdmVyeVNlc3Npb247CitpbXBvcnQgYW5kcm9pZC5wcmludC50ZXN0LkJhc2VQcmludFRlc3Q7CitpbXBvcnQgYW5kcm9pZC5wcmludC50ZXN0LnNlcnZpY2VzLkZpcnN0UHJpbnRTZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQucHJpbnQudGVzdC5zZXJ2aWNlcy5QcmludFNlcnZpY2VDYWxsYmFja3M7CitpbXBvcnQgYW5kcm9pZC5wcmludC50ZXN0LnNlcnZpY2VzLlByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uQ2FsbGJhY2tzOworaW1wb3J0IGFuZHJvaWQucHJpbnQudGVzdC5zZXJ2aWNlcy5TZWNvbmRQcmludFNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5wcmludC50ZXN0LnNlcnZpY2VzLlN0dWJiYWJsZVByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uOwogaW1wb3J0IGFuZHJvaWQucHJpbnRzZXJ2aWNlLlByaW50Sm9iOwogaW1wb3J0IGFuZHJvaWQucHJpbnRzZXJ2aWNlLlByaW50U2VydmljZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpAQCAtMTQ0LDcgKzE0Niw3IEBACiAgICAgICAgIC8vIHRoZXJlIGFyZSBvdGhlciBwcmludGVycyBidXQgbm9uZSBvZiB0aGVtIHdhcyB1c2VkLgogICAgICAgICBQcmludEF0dHJpYnV0ZXMgZmlyc3RPbGRBdHRyaWJ1dGVzID0gbmV3IFByaW50QXR0cmlidXRlcy5CdWlsZGVyKCkuYnVpbGQoKTsKICAgICAgICAgUHJpbnRBdHRyaWJ1dGVzIGZpcnN0TmV3QXR0cmlidXRlcyA9IG5ldyBQcmludEF0dHJpYnV0ZXMuQnVpbGRlcigpCi0gICAgICAgICAgICAgICAgLnNldE1lZGlhU2l6ZShnZXREZWZhdWx0TWVkaWFTaXplKCkpCisgICAgICAgICAgICAgICAgLnNldE1lZGlhU2l6ZShNZWRpYVNpemUuTkFfTEVUVEVSKQogICAgICAgICAgICAgICAgIC5zZXRSZXNvbHV0aW9uKG5ldyBSZXNvbHV0aW9uKCJQREYgcmVzb2x1dGlvbiIsICJQREYgcmVzb2x1dGlvbiIsIDMwMCwgMzAwKSkKICAgICAgICAgICAgICAgICAuc2V0TWluTWFyZ2lucyhNYXJnaW5zLk5PX01BUkdJTlMpCiAgICAgICAgICAgICAgICAgLnNldENvbG9yTW9kZShQcmludEF0dHJpYnV0ZXMuQ09MT1JfTU9ERV9DT0xPUikKQEAgLTIxNiw3ICsyMTgsNyBAQAogICAgICAgICAvLyB0aGVyZSBhcmUgb3RoZXIgcHJpbnRlcnMgYnV0IG5vbmUgb2YgdGhlbSB3YXMgdXNlZC4KICAgICAgICAgUHJpbnRBdHRyaWJ1dGVzIGZpcnN0T2xkQXR0cmlidXRlcyA9IG5ldyBQcmludEF0dHJpYnV0ZXMuQnVpbGRlcigpLmJ1aWxkKCk7CiAgICAgICAgIFByaW50QXR0cmlidXRlcyBmaXJzdE5ld0F0dHJpYnV0ZXMgPSBuZXcgUHJpbnRBdHRyaWJ1dGVzLkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgIC5zZXRNZWRpYVNpemUoZ2V0RGVmYXVsdE1lZGlhU2l6ZSgpKQorICAgICAgICAgICAgICAgIC5zZXRNZWRpYVNpemUoTWVkaWFTaXplLk5BX0xFVFRFUikKICAgICAgICAgICAgICAgICAuc2V0UmVzb2x1dGlvbihuZXcgUmVzb2x1dGlvbigiUERGIHJlc29sdXRpb24iLCAiUERGIHJlc29sdXRpb24iLCAzMDAsIDMwMCkpCiAgICAgICAgICAgICAgICAgLnNldE1pbk1hcmdpbnMoTWFyZ2lucy5OT19NQVJHSU5TKQogICAgICAgICAgICAgICAgIC5zZXRDb2xvck1vZGUoUHJpbnRBdHRyaWJ1dGVzLkNPTE9SX01PREVfQ09MT1IpCkBAIC00MzAsNyArNDMyLDcgQEAKICAgICAgICAgd2FpdEZvckxheW91dEFkYXB0ZXJDYWxsYmFja0NvdW50KDIpOwogCiAgICAgICAgIC8vIENoYW5nZSB0aGUgb3JpZW50YXRpb24uCi0gICAgICAgIGNoYW5nZU9yaWVudGF0aW9uKGdldFByaW50U3Bvb2xlclN0cmluZ0FycmF5KCJvcmllbnRhdGlvbl9sYWJlbHMiKVsxXSk7CisgICAgICAgIGNoYW5nZU9yaWVudGF0aW9uKCJMYW5kc2NhcGUiKTsKIAogICAgICAgICAvLyBXYWl0IGZvciBsYXlvdXQuCiAgICAgICAgIHdhaXRGb3JMYXlvdXRBZGFwdGVyQ2FsbGJhY2tDb3VudCgzKTsKQEAgLTQ0MiwxMyArNDQ0LDEzIEBACiAgICAgICAgIHdhaXRGb3JMYXlvdXRBZGFwdGVyQ2FsbGJhY2tDb3VudCg0KTsKIAogICAgICAgICAvLyBDaGFuZ2UgdGhlIGNvbG9yLgotICAgICAgICBjaGFuZ2VDb2xvcihnZXRQcmludFNwb29sZXJTdHJpbmdBcnJheSgiY29sb3JfbW9kZV9sYWJlbHMiKVswXSk7CisgICAgICAgIGNoYW5nZUNvbG9yKCJCbGFjayAmIFdoaXRlIik7CiAKICAgICAgICAgLy8gV2FpdCBmb3IgbGF5b3V0LgogICAgICAgICB3YWl0Rm9yTGF5b3V0QWRhcHRlckNhbGxiYWNrQ291bnQoNSk7CiAKICAgICAgICAgLy8gQ2hhbmdlIHRoZSBkdXBsZXguCi0gICAgICAgIGNoYW5nZUR1cGxleChnZXRQcmludFNwb29sZXJTdHJpbmdBcnJheSgiZHVwbGV4X21vZGVfbGFiZWxzIilbMl0pOworICAgICAgICBjaGFuZ2VEdXBsZXgoIlNob3J0IGVkZ2UiKTsKIAogICAgICAgICAvLyBXYWl0IGZvciBsYXlvdXQuCiAgICAgICAgIHdhaXRGb3JMYXlvdXRBZGFwdGVyQ2FsbGJhY2tDb3VudCg2KTsKQEAgLTQ3NSw3ICs0NzcsNyBAQAogICAgICAgICAvLyB0aGVyZSBhcmUgb3RoZXIgcHJpbnRlcnMgYnV0IG5vbmUgb2YgdGhlbSB3YXMgdXNlZC4KICAgICAgICAgUHJpbnRBdHRyaWJ1dGVzIGZpcnN0T2xkQXR0cmlidXRlcyA9IG5ldyBQcmludEF0dHJpYnV0ZXMuQnVpbGRlcigpLmJ1aWxkKCk7CiAgICAgICAgIFByaW50QXR0cmlidXRlcyBmaXJzdE5ld0F0dHJpYnV0ZXMgPSBuZXcgUHJpbnRBdHRyaWJ1dGVzLkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgIC5zZXRNZWRpYVNpemUoZ2V0RGVmYXVsdE1lZGlhU2l6ZSgpKQorICAgICAgICAgICAgICAgIC5zZXRNZWRpYVNpemUoTWVkaWFTaXplLk5BX0xFVFRFUikKICAgICAgICAgICAgICAgICAuc2V0UmVzb2x1dGlvbihuZXcgUmVzb2x1dGlvbigiUERGIHJlc29sdXRpb24iLCAiUERGIHJlc29sdXRpb24iLCAzMDAsIDMwMCkpCiAgICAgICAgICAgICAgICAgLnNldE1pbk1hcmdpbnMoTWFyZ2lucy5OT19NQVJHSU5TKQogICAgICAgICAgICAgICAgIC5zZXRDb2xvck1vZGUoUHJpbnRBdHRyaWJ1dGVzLkNPTE9SX01PREVfQ09MT1IpCkBAIC03MDMsNyArNzA1LDcgQEAKICAgICAgICAgd2FpdEZvckxheW91dEFkYXB0ZXJDYWxsYmFja0NvdW50KDIpOwogCiAgICAgICAgIC8vIENoYW5nZSB0aGUgY29sb3IuCi0gICAgICAgIGNoYW5nZUNvbG9yKGdldFByaW50U3Bvb2xlclN0cmluZ0FycmF5KCJjb2xvcl9tb2RlX2xhYmVscyIpWzBdKTsKKyAgICAgICAgY2hhbmdlQ29sb3IoIkJsYWNrICYgV2hpdGUiKTsKIAogICAgICAgICAvLyBXYWl0IGZvciBsYXlvdXQuCiAgICAgICAgIHdhaXRGb3JMYXlvdXRBZGFwdGVyQ2FsbGJhY2tDb3VudCgzKTsKQEAgLTczNyw3ICs3MzksNyBAQAogICAgICAgICAvLyB0aGVyZSBhcmUgb3RoZXIgcHJpbnRlcnMgYnV0IG5vbmUgb2YgdGhlbSB3YXMgdXNlZC4KICAgICAgICAgUHJpbnRBdHRyaWJ1dGVzIGZpcnN0T2xkQXR0cmlidXRlcyA9IG5ldyBQcmludEF0dHJpYnV0ZXMuQnVpbGRlcigpLmJ1aWxkKCk7CiAgICAgICAgIFByaW50QXR0cmlidXRlcyBmaXJzdE5ld0F0dHJpYnV0ZXMgPSBuZXcgUHJpbnRBdHRyaWJ1dGVzLkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgIC5zZXRNZWRpYVNpemUoZ2V0RGVmYXVsdE1lZGlhU2l6ZSgpKQorICAgICAgICAgICAgICAgIC5zZXRNZWRpYVNpemUoTWVkaWFTaXplLk5BX0xFVFRFUikKICAgICAgICAgICAgICAgICAuc2V0UmVzb2x1dGlvbihuZXcgUmVzb2x1dGlvbigiUERGIHJlc29sdXRpb24iLCAiUERGIHJlc29sdXRpb24iLCAzMDAsIDMwMCkpCiAgICAgICAgICAgICAgICAgLnNldE1pbk1hcmdpbnMoTWFyZ2lucy5OT19NQVJHSU5TKQogICAgICAgICAgICAgICAgIC5zZXRDb2xvck1vZGUoUHJpbnRBdHRyaWJ1dGVzLkNPTE9SX01PREVfQ09MT1IpCkBAIC04NzQsNyArODc2LDcgQEAKICAgICAgICAgLy8gdGhlcmUgYXJlIG90aGVyIHByaW50ZXJzIGJ1dCBub25lIG9mIHRoZW0gd2FzIHVzZWQuCiAgICAgICAgIFByaW50QXR0cmlidXRlcyBmaXJzdE9sZEF0dHJpYnV0ZXMgPSBuZXcgUHJpbnRBdHRyaWJ1dGVzLkJ1aWxkZXIoKS5idWlsZCgpOwogICAgICAgICBQcmludEF0dHJpYnV0ZXMgZmlyc3ROZXdBdHRyaWJ1dGVzID0gbmV3IFByaW50QXR0cmlidXRlcy5CdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAuc2V0TWVkaWFTaXplKGdldERlZmF1bHRNZWRpYVNpemUoKSkKKyAgICAgICAgICAgICAgICAuc2V0TWVkaWFTaXplKE1lZGlhU2l6ZS5OQV9MRVRURVIpCiAgICAgICAgICAgICAgICAgLnNldFJlc29sdXRpb24obmV3IFJlc29sdXRpb24oIlBERiByZXNvbHV0aW9uIiwgIlBERiByZXNvbHV0aW9uIiwgMzAwLCAzMDApKQogICAgICAgICAgICAgICAgIC5zZXRNaW5NYXJnaW5zKE1hcmdpbnMuTk9fTUFSR0lOUykuc2V0Q29sb3JNb2RlKFByaW50QXR0cmlidXRlcy5DT0xPUl9NT0RFX0NPTE9SKQogICAgICAgICAgICAgICAgIC5zZXREdXBsZXhNb2RlKFByaW50QXR0cmlidXRlcy5EVVBMRVhfTU9ERV9OT05FKQpAQCAtOTg3LDcgKzk4OSw3IEBACiAgICAgICAgIC8vIHRoZXJlIGFyZSBvdGhlciBwcmludGVycyBidXQgbm9uZSBvZiB0aGVtIHdhcyB1c2VkLgogICAgICAgICBQcmludEF0dHJpYnV0ZXMgZmlyc3RPbGRBdHRyaWJ1dGVzID0gbmV3IFByaW50QXR0cmlidXRlcy5CdWlsZGVyKCkuYnVpbGQoKTsKICAgICAgICAgUHJpbnRBdHRyaWJ1dGVzIGZpcnN0TmV3QXR0cmlidXRlcyA9IG5ldyBQcmludEF0dHJpYnV0ZXMuQnVpbGRlcigpCi0gICAgICAgICAgICAgICAgLnNldE1lZGlhU2l6ZShnZXREZWZhdWx0TWVkaWFTaXplKCkpCisgICAgICAgICAgICAgICAgLnNldE1lZGlhU2l6ZShNZWRpYVNpemUuTkFfTEVUVEVSKQogICAgICAgICAgICAgICAgIC5zZXRSZXNvbHV0aW9uKG5ldyBSZXNvbHV0aW9uKCJQREYgcmVzb2x1dGlvbiIsICJQREYgcmVzb2x1dGlvbiIsIDMwMCwgMzAwKSkKICAgICAgICAgICAgICAgICAuc2V0TWluTWFyZ2lucyhNYXJnaW5zLk5PX01BUkdJTlMpLnNldENvbG9yTW9kZShQcmludEF0dHJpYnV0ZXMuQ09MT1JfTU9ERV9DT0xPUikKICAgICAgICAgICAgICAgICAuc2V0RHVwbGV4TW9kZShQcmludEF0dHJpYnV0ZXMuRFVQTEVYX01PREVfTk9ORSkKQEAgLTEwODUsNyArMTA4Nyw3IEBACiAgICAgICAgIC8vIHRoZXJlIGFyZSBvdGhlciBwcmludGVycyBidXQgbm9uZSBvZiB0aGVtIHdhcyB1c2VkLgogICAgICAgICBQcmludEF0dHJpYnV0ZXMgZmlyc3RPbGRBdHRyaWJ1dGVzID0gbmV3IFByaW50QXR0cmlidXRlcy5CdWlsZGVyKCkuYnVpbGQoKTsKICAgICAgICAgUHJpbnRBdHRyaWJ1dGVzIGZpcnN0TmV3QXR0cmlidXRlcyA9IG5ldyBQcmludEF0dHJpYnV0ZXMuQnVpbGRlcigpCi0gICAgICAgICAgICAgICAgLnNldE1lZGlhU2l6ZShnZXREZWZhdWx0TWVkaWFTaXplKCkpCisgICAgICAgICAgICAgICAgLnNldE1lZGlhU2l6ZShNZWRpYVNpemUuTkFfTEVUVEVSKQogICAgICAgICAgICAgICAgIC5zZXRSZXNvbHV0aW9uKG5ldyBSZXNvbHV0aW9uKCJQREYgcmVzb2x1dGlvbiIsICJQREYgcmVzb2x1dGlvbiIsIDMwMCwgMzAwKSkKICAgICAgICAgICAgICAgICAuc2V0TWluTWFyZ2lucyhNYXJnaW5zLk5PX01BUkdJTlMpLnNldENvbG9yTW9kZShQcmludEF0dHJpYnV0ZXMuQ09MT1JfTU9ERV9DT0xPUikKICAgICAgICAgICAgICAgICAuc2V0RHVwbGV4TW9kZShQcmludEF0dHJpYnV0ZXMuRFVQTEVYX01PREVfTk9ORSkKQEAgLTExNzgsNyArMTE4MCw3IEBACiAgICAgICAgIC8vIHRoZXJlIGFyZSBvdGhlciBwcmludGVycyBidXQgbm9uZSBvZiB0aGVtIHdhcyB1c2VkLgogICAgICAgICBQcmludEF0dHJpYnV0ZXMgZmlyc3RPbGRBdHRyaWJ1dGVzID0gbmV3IFByaW50QXR0cmlidXRlcy5CdWlsZGVyKCkuYnVpbGQoKTsKICAgICAgICAgUHJpbnRBdHRyaWJ1dGVzIGZpcnN0TmV3QXR0cmlidXRlcyA9IG5ldyBQcmludEF0dHJpYnV0ZXMuQnVpbGRlcigpCi0gICAgICAgICAgICAgICAgLnNldE1lZGlhU2l6ZShnZXREZWZhdWx0TWVkaWFTaXplKCkpCisgICAgICAgICAgICAgICAgLnNldE1lZGlhU2l6ZShNZWRpYVNpemUuTkFfTEVUVEVSKQogICAgICAgICAgICAgICAgIC5zZXRSZXNvbHV0aW9uKG5ldyBSZXNvbHV0aW9uKCJQREYgcmVzb2x1dGlvbiIsICJQREYgcmVzb2x1dGlvbiIsIDMwMCwgMzAwKSkKICAgICAgICAgICAgICAgICAuc2V0TWluTWFyZ2lucyhNYXJnaW5zLk5PX01BUkdJTlMpLnNldENvbG9yTW9kZShQcmludEF0dHJpYnV0ZXMuQ09MT1JfTU9ERV9DT0xPUikKICAgICAgICAgICAgICAgICAuc2V0RHVwbGV4TW9kZShQcmludEF0dHJpYnV0ZXMuRFVQTEVYX01PREVfTk9ORSkKQEAgLTEyNTUsNyArMTI1Nyw3IEBACiAgICAgICAgIC8vIHRoZXJlIGFyZSBvdGhlciBwcmludGVycyBidXQgbm9uZSBvZiB0aGVtIHdhcyB1c2VkLgogICAgICAgICBQcmludEF0dHJpYnV0ZXMgZmlyc3RPbGRBdHRyaWJ1dGVzID0gbmV3IFByaW50QXR0cmlidXRlcy5CdWlsZGVyKCkuYnVpbGQoKTsKICAgICAgICAgUHJpbnRBdHRyaWJ1dGVzIGZpcnN0TmV3QXR0cmlidXRlcyA9IG5ldyBQcmludEF0dHJpYnV0ZXMuQnVpbGRlcigpCi0gICAgICAgICAgICAgICAgLnNldE1lZGlhU2l6ZShnZXREZWZhdWx0TWVkaWFTaXplKCkpCisgICAgICAgICAgICAgICAgLnNldE1lZGlhU2l6ZShNZWRpYVNpemUuTkFfTEVUVEVSKQogICAgICAgICAgICAgICAgIC5zZXRSZXNvbHV0aW9uKG5ldyBSZXNvbHV0aW9uKCJQREYgcmVzb2x1dGlvbiIsICJQREYgcmVzb2x1dGlvbiIsIDMwMCwgMzAwKSkKICAgICAgICAgICAgICAgICAuc2V0TWluTWFyZ2lucyhNYXJnaW5zLk5PX01BUkdJTlMpLnNldENvbG9yTW9kZShQcmludEF0dHJpYnV0ZXMuQ09MT1JfTU9ERV9DT0xPUikKICAgICAgICAgICAgICAgICAuc2V0RHVwbGV4TW9kZShQcmludEF0dHJpYnV0ZXMuRFVQTEVYX01PREVfTk9ORSkKQEAgLTEzMTYsNyArMTMxOCw3IEBACiAgICAgICAgIC8vIHRoZXJlIGFyZSBvdGhlciBwcmludGVycyBidXQgbm9uZSBvZiB0aGVtIHdhcyB1c2VkLgogICAgICAgICBQcmludEF0dHJpYnV0ZXMgZmlyc3RPbGRBdHRyaWJ1dGVzID0gbmV3IFByaW50QXR0cmlidXRlcy5CdWlsZGVyKCkuYnVpbGQoKTsKICAgICAgICAgUHJpbnRBdHRyaWJ1dGVzIGZpcnN0TmV3QXR0cmlidXRlcyA9IG5ldyBQcmludEF0dHJpYnV0ZXMuQnVpbGRlcigpCi0gICAgICAgICAgICAgICAgLnNldE1lZGlhU2l6ZShnZXREZWZhdWx0TWVkaWFTaXplKCkpCisgICAgICAgICAgICAgICAgLnNldE1lZGlhU2l6ZShNZWRpYVNpemUuTkFfTEVUVEVSKQogICAgICAgICAgICAgICAgIC5zZXRSZXNvbHV0aW9uKG5ldyBSZXNvbHV0aW9uKCJQREYgcmVzb2x1dGlvbiIsICJQREYgcmVzb2x1dGlvbiIsIDMwMCwgMzAwKSkKICAgICAgICAgICAgICAgICAuc2V0TWluTWFyZ2lucyhNYXJnaW5zLk5PX01BUkdJTlMpLnNldENvbG9yTW9kZShQcmludEF0dHJpYnV0ZXMuQ09MT1JfTU9ERV9DT0xPUikKICAgICAgICAgICAgICAgICAuc2V0RHVwbGV4TW9kZShQcmludEF0dHJpYnV0ZXMuRFVQTEVYX01PREVfTk9ORSkKQEAgLTEzODQsNyArMTM4Niw3IEBACiAgICAgICAgIC8vIHRoZXJlIGFyZSBvdGhlciBwcmludGVycyBidXQgbm9uZSBvZiB0aGVtIHdhcyB1c2VkLgogICAgICAgICBQcmludEF0dHJpYnV0ZXMgZmlyc3RPbGRBdHRyaWJ1dGVzID0gbmV3IFByaW50QXR0cmlidXRlcy5CdWlsZGVyKCkuYnVpbGQoKTsKICAgICAgICAgUHJpbnRBdHRyaWJ1dGVzIGZpcnN0TmV3QXR0cmlidXRlcyA9IG5ldyBQcmludEF0dHJpYnV0ZXMuQnVpbGRlcigpCi0gICAgICAgICAgICAgICAgLnNldE1lZGlhU2l6ZShnZXREZWZhdWx0TWVkaWFTaXplKCkpCisgICAgICAgICAgICAgICAgLnNldE1lZGlhU2l6ZShNZWRpYVNpemUuTkFfTEVUVEVSKQogICAgICAgICAgICAgICAgIC5zZXRSZXNvbHV0aW9uKG5ldyBSZXNvbHV0aW9uKCJQREYgcmVzb2x1dGlvbiIsICJQREYgcmVzb2x1dGlvbiIsIDMwMCwgMzAwKSkKICAgICAgICAgICAgICAgICAuc2V0TWluTWFyZ2lucyhNYXJnaW5zLk5PX01BUkdJTlMpLnNldENvbG9yTW9kZShQcmludEF0dHJpYnV0ZXMuQ09MT1JfTU9ERV9DT0xPUikKICAgICAgICAgICAgICAgICAuc2V0RHVwbGV4TW9kZShQcmludEF0dHJpYnV0ZXMuRFVQTEVYX01PREVfTk9ORSkKQEAgLTE1OTMsNyArMTU5NSw3IEBACiAgICAgICAgIC8vIHRoZXJlIGFyZSBvdGhlciBwcmludGVycyBidXQgbm9uZSBvZiB0aGVtIHdhcyB1c2VkLgogICAgICAgICBQcmludEF0dHJpYnV0ZXMgZmlyc3RPbGRBdHRyaWJ1dGVzID0gbmV3IFByaW50QXR0cmlidXRlcy5CdWlsZGVyKCkuYnVpbGQoKTsKICAgICAgICAgUHJpbnRBdHRyaWJ1dGVzIGZpcnN0TmV3QXR0cmlidXRlcyA9IG5ldyBQcmludEF0dHJpYnV0ZXMuQnVpbGRlcigpCi0gICAgICAgICAgICAgICAgLnNldE1lZGlhU2l6ZShnZXREZWZhdWx0TWVkaWFTaXplKCkpCisgICAgICAgICAgICAgICAgLnNldE1lZGlhU2l6ZShNZWRpYVNpemUuTkFfTEVUVEVSKQogICAgICAgICAgICAgICAgIC5zZXRSZXNvbHV0aW9uKG5ldyBSZXNvbHV0aW9uKCJQREYgcmVzb2x1dGlvbiIsICJQREYgcmVzb2x1dGlvbiIsIDMwMCwgMzAwKSkKICAgICAgICAgICAgICAgICAuc2V0TWluTWFyZ2lucyhNYXJnaW5zLk5PX01BUkdJTlMpLnNldENvbG9yTW9kZShQcmludEF0dHJpYnV0ZXMuQ09MT1JfTU9ERV9DT0xPUikKICAgICAgICAgICAgICAgICAuc2V0RHVwbGV4TW9kZShQcmludEF0dHJpYnV0ZXMuRFVQTEVYX01PREVfTk9ORSkKQEAgLTE2NTMsNyArMTY1NSw3IEBACiAgICAgICAgIC8vIHRoZXJlIGFyZSBvdGhlciBwcmludGVycyBidXQgbm9uZSBvZiB0aGVtIHdhcyB1c2VkLgogICAgICAgICBQcmludEF0dHJpYnV0ZXMgZmlyc3RPbGRBdHRyaWJ1dGVzID0gbmV3IFByaW50QXR0cmlidXRlcy5CdWlsZGVyKCkuYnVpbGQoKTsKICAgICAgICAgUHJpbnRBdHRyaWJ1dGVzIGZpcnN0TmV3QXR0cmlidXRlcyA9IG5ldyBQcmludEF0dHJpYnV0ZXMuQnVpbGRlcigpCi0gICAgICAgICAgICAgICAgLnNldE1lZGlhU2l6ZShnZXREZWZhdWx0TWVkaWFTaXplKCkpCisgICAgICAgICAgICAgICAgLnNldE1lZGlhU2l6ZShNZWRpYVNpemUuTkFfTEVUVEVSKQogICAgICAgICAgICAgICAgIC5zZXRSZXNvbHV0aW9uKG5ldyBSZXNvbHV0aW9uKCJQREYgcmVzb2x1dGlvbiIsICJQREYgcmVzb2x1dGlvbiIsIDMwMCwgMzAwKSkKICAgICAgICAgICAgICAgICAuc2V0TWluTWFyZ2lucyhNYXJnaW5zLk5PX01BUkdJTlMpLnNldENvbG9yTW9kZShQcmludEF0dHJpYnV0ZXMuQ09MT1JfTU9ERV9DT0xPUikKICAgICAgICAgICAgICAgICAuc2V0RHVwbGV4TW9kZShQcmludEF0dHJpYnV0ZXMuRFVQTEVYX01PREVfTk9ORSkKQEAgLTE3MTgsNyArMTcyMCw3IEBACiAgICAgICAgIC8vIHRoZXJlIGFyZSBvdGhlciBwcmludGVycyBidXQgbm9uZSBvZiB0aGVtIHdhcyB1c2VkLgogICAgICAgICBQcmludEF0dHJpYnV0ZXMgZmlyc3RPbGRBdHRyaWJ1dGVzID0gbmV3IFByaW50QXR0cmlidXRlcy5CdWlsZGVyKCkuYnVpbGQoKTsKICAgICAgICAgUHJpbnRBdHRyaWJ1dGVzIGZpcnN0TmV3QXR0cmlidXRlcyA9IG5ldyBQcmludEF0dHJpYnV0ZXMuQnVpbGRlcigpCi0gICAgICAgICAgICAgICAgLnNldE1lZGlhU2l6ZShnZXREZWZhdWx0TWVkaWFTaXplKCkpCisgICAgICAgICAgICAgICAgLnNldE1lZGlhU2l6ZShNZWRpYVNpemUuTkFfTEVUVEVSKQogICAgICAgICAgICAgICAgIC5zZXRSZXNvbHV0aW9uKG5ldyBSZXNvbHV0aW9uKCJQREYgcmVzb2x1dGlvbiIsICJQREYgcmVzb2x1dGlvbiIsIDMwMCwgMzAwKSkKICAgICAgICAgICAgICAgICAuc2V0TWluTWFyZ2lucyhNYXJnaW5zLk5PX01BUkdJTlMpLnNldENvbG9yTW9kZShQcmludEF0dHJpYnV0ZXMuQ09MT1JfTU9ERV9DT0xPUikKICAgICAgICAgICAgICAgICAuc2V0RHVwbGV4TW9kZShQcmludEF0dHJpYnV0ZXMuRFVQTEVYX01PREVfTk9ORSkKQEAgLTE3ODgsNyArMTc5MCw3IEBACiAgICAgICAgIC8vIHRoZXJlIGFyZSBvdGhlciBwcmludGVycyBidXQgbm9uZSBvZiB0aGVtIHdhcyB1c2VkLgogICAgICAgICBQcmludEF0dHJpYnV0ZXMgZmlyc3RPbGRBdHRyaWJ1dGVzID0gbmV3IFByaW50QXR0cmlidXRlcy5CdWlsZGVyKCkuYnVpbGQoKTsKICAgICAgICAgUHJpbnRBdHRyaWJ1dGVzIGZpcnN0TmV3QXR0cmlidXRlcyA9IG5ldyBQcmludEF0dHJpYnV0ZXMuQnVpbGRlcigpCi0gICAgICAgICAgICAgICAgLnNldE1lZGlhU2l6ZShnZXREZWZhdWx0TWVkaWFTaXplKCkpCisgICAgICAgICAgICAgICAgLnNldE1lZGlhU2l6ZShNZWRpYVNpemUuTkFfTEVUVEVSKQogICAgICAgICAgICAgICAgIC5zZXRSZXNvbHV0aW9uKG5ldyBSZXNvbHV0aW9uKCJQREYgcmVzb2x1dGlvbiIsICJQREYgcmVzb2x1dGlvbiIsIDMwMCwgMzAwKSkKICAgICAgICAgICAgICAgICAuc2V0TWluTWFyZ2lucyhNYXJnaW5zLk5PX01BUkdJTlMpLnNldENvbG9yTW9kZShQcmludEF0dHJpYnV0ZXMuQ09MT1JfTU9ERV9DT0xPUikKICAgICAgICAgICAgICAgICAuc2V0RHVwbGV4TW9kZShQcmludEF0dHJpYnV0ZXMuRFVQTEVYX01PREVfTk9ORSkKQEAgLTE4NzUsNyArMTg3Nyw3IEBACiAgICAgICAgIC8vIHRoZXJlIGFyZSBvdGhlciBwcmludGVycyBidXQgbm9uZSBvZiB0aGVtIHdhcyB1c2VkLgogICAgICAgICBQcmludEF0dHJpYnV0ZXMgZmlyc3RPbGRBdHRyaWJ1dGVzID0gbmV3IFByaW50QXR0cmlidXRlcy5CdWlsZGVyKCkuYnVpbGQoKTsKICAgICAgICAgUHJpbnRBdHRyaWJ1dGVzIGZpcnN0TmV3QXR0cmlidXRlcyA9IG5ldyBQcmludEF0dHJpYnV0ZXMuQnVpbGRlcigpCi0gICAgICAgICAgICAgICAgLnNldE1lZGlhU2l6ZShnZXREZWZhdWx0TWVkaWFTaXplKCkpCisgICAgICAgICAgICAgICAgLnNldE1lZGlhU2l6ZShNZWRpYVNpemUuTkFfTEVUVEVSKQogICAgICAgICAgICAgICAgIC5zZXRSZXNvbHV0aW9uKG5ldyBSZXNvbHV0aW9uKCJQREYgcmVzb2x1dGlvbiIsICJQREYgcmVzb2x1dGlvbiIsIDMwMCwgMzAwKSkKICAgICAgICAgICAgICAgICAuc2V0TWluTWFyZ2lucyhNYXJnaW5zLk5PX01BUkdJTlMpLnNldENvbG9yTW9kZShQcmludEF0dHJpYnV0ZXMuQ09MT1JfTU9ERV9DT0xPUikKICAgICAgICAgICAgICAgICAuc2V0RHVwbGV4TW9kZShQcmludEF0dHJpYnV0ZXMuRFVQTEVYX01PREVfTk9ORSkKQEAgLTIwMDYsNyArMjAwOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBudWxsOwogICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgIHRoaXJkQ2FwYWJpbGl0aWVzID0gbmV3IFByaW50ZXJDYXBhYmlsaXRpZXNJbmZvLkJ1aWxkZXIodGhpcmRQcmludGVySWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZE1lZGlhU2l6ZShnZXREZWZhdWx0TWVkaWFTaXplKCksIHRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZE1lZGlhU2l6ZShNZWRpYVNpemUuTkFfTEVUVEVSLCB0cnVlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRSZXNvbHV0aW9uKG5ldyBSZXNvbHV0aW9uKCIzMDB4MzAwIiwgIjMwMHgzMDAiLCAzMDAsIDMwMCksIHRydWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbG9yTW9kZXMoUHJpbnRBdHRyaWJ1dGVzLkNPTE9SX01PREVfQ09MT1IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludEF0dHJpYnV0ZXMuQ09MT1JfTU9ERV9DT0xPUikKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ByaW50L3NyYy9hbmRyb2lkL3ByaW50L2N0cy9QcmludERvY3VtZW50SW5mb1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3ByaW50L3NyYy9hbmRyb2lkL3ByaW50L2N0cy9QcmludERvY3VtZW50SW5mb1Rlc3QuamF2YQppbmRleCBhOWQwM2M5Li4yOThkNDhmIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9wcmludC9zcmMvYW5kcm9pZC9wcmludC9jdHMvUHJpbnREb2N1bWVudEluZm9UZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvcHJpbnQvc3JjL2FuZHJvaWQvcHJpbnQvY3RzL1ByaW50RG9jdW1lbnRJbmZvVGVzdC5qYXZhCkBAIC0xNiw2ICsxNiwxMSBAQAogCiBwYWNrYWdlIGFuZHJvaWQucHJpbnQuY3RzOwogCitpbXBvcnQgc3RhdGljIGFuZHJvaWQucHJpbnQudGVzdC5VdGlscy5ldmVudHVhbGx5OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOwogaW1wb3J0IGFuZHJvaWQucHJpbnQuUGFnZVJhbmdlOwogaW1wb3J0IGFuZHJvaWQucHJpbnQuUHJpbnRBdHRyaWJ1dGVzOwpAQCAtMjksMTQgKzM0LDE3IEBACiBpbXBvcnQgYW5kcm9pZC5wcmludC5QcmludGVyQ2FwYWJpbGl0aWVzSW5mbzsKIGltcG9ydCBhbmRyb2lkLnByaW50LlByaW50ZXJJZDsKIGltcG9ydCBhbmRyb2lkLnByaW50LlByaW50ZXJJbmZvOwotaW1wb3J0IGFuZHJvaWQucHJpbnQuY3RzLnNlcnZpY2VzLkZpcnN0UHJpbnRTZXJ2aWNlOwotaW1wb3J0IGFuZHJvaWQucHJpbnQuY3RzLnNlcnZpY2VzLlByaW50U2VydmljZUNhbGxiYWNrczsKLWltcG9ydCBhbmRyb2lkLnByaW50LmN0cy5zZXJ2aWNlcy5QcmludGVyRGlzY292ZXJ5U2Vzc2lvbkNhbGxiYWNrczsKLWltcG9ydCBhbmRyb2lkLnByaW50LmN0cy5zZXJ2aWNlcy5TZWNvbmRQcmludFNlcnZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5wcmludC5jdHMuc2VydmljZXMuU3R1YmJhYmxlUHJpbnRlckRpc2NvdmVyeVNlc3Npb247CitpbXBvcnQgYW5kcm9pZC5wcmludC50ZXN0LkJhc2VQcmludFRlc3Q7CitpbXBvcnQgYW5kcm9pZC5wcmludC50ZXN0LnNlcnZpY2VzLkZpcnN0UHJpbnRTZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQucHJpbnQudGVzdC5zZXJ2aWNlcy5QcmludFNlcnZpY2VDYWxsYmFja3M7CitpbXBvcnQgYW5kcm9pZC5wcmludC50ZXN0LnNlcnZpY2VzLlByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uQ2FsbGJhY2tzOworaW1wb3J0IGFuZHJvaWQucHJpbnQudGVzdC5zZXJ2aWNlcy5TZWNvbmRQcmludFNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5wcmludC50ZXN0LnNlcnZpY2VzLlN0dWJiYWJsZVByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uOwogaW1wb3J0IGFuZHJvaWQucHJpbnRzZXJ2aWNlLlByaW50Sm9iOwogaW1wb3J0IGFuZHJvaWQucHJpbnRzZXJ2aWNlLlByaW50U2VydmljZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKQEAgLTQ1LDE2ICs1MywxMiBAQAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5wcmludC5jdHMuVXRpbHMuZXZlbnR1YWxseTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLQogLyoqCiAgKiBUaGlzIHRlc3QgdmVyaWZpZXMgdGhhdCB0aGUgc3lzdGVtIHJlc3BlY3RzIHRoZSB7QGxpbmsgUHJpbnREb2N1bWVudEFkYXB0ZXJ9CiAgKiBjb250cmFjdCBhbmQgaW52b2tlcyBhbGwgY2FsbGJhY2tzIGFzIGV4cGVjdGVkLgogICovCiBAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQotcHVibGljIGNsYXNzIFByaW50RG9jdW1lbnRJbmZvVGVzdCBleHRlbmRzIGFuZHJvaWQucHJpbnQuY3RzLkJhc2VQcmludFRlc3QgeworcHVibGljIGNsYXNzIFByaW50RG9jdW1lbnRJbmZvVGVzdCBleHRlbmRzIEJhc2VQcmludFRlc3QgewogICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gc0lzRGVmYXVsdFByaW50ZXJTZXQ7CiAKICAgICBAQmVmb3JlCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9wcmludC9zcmMvYW5kcm9pZC9wcmludC9jdHMvUHJpbnRKb2JTdGF0ZVRyYW5zaXRpb25zVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvcHJpbnQvc3JjL2FuZHJvaWQvcHJpbnQvY3RzL1ByaW50Sm9iU3RhdGVUcmFuc2l0aW9uc1Rlc3QuamF2YQppbmRleCBkNWVkY2I2Li43NWE3ODQ3IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9wcmludC9zcmMvYW5kcm9pZC9wcmludC9jdHMvUHJpbnRKb2JTdGF0ZVRyYW5zaXRpb25zVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3ByaW50L3NyYy9hbmRyb2lkL3ByaW50L2N0cy9QcmludEpvYlN0YXRlVHJhbnNpdGlvbnNUZXN0LmphdmEKQEAgLTE2LDcgKzE2LDcgQEAKIAogcGFja2FnZSBhbmRyb2lkLnByaW50LmN0czsKIAotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnByaW50LmN0cy5VdGlscy5ldmVudHVhbGx5OworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnByaW50LnRlc3QuVXRpbHMuZXZlbnR1YWxseTsKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwpAQCAtMzAsMTEgKzMwLDEyIEBACiBpbXBvcnQgYW5kcm9pZC5wcmludC5QcmludGVyQ2FwYWJpbGl0aWVzSW5mbzsKIGltcG9ydCBhbmRyb2lkLnByaW50LlByaW50ZXJJZDsKIGltcG9ydCBhbmRyb2lkLnByaW50LlByaW50ZXJJbmZvOwotaW1wb3J0IGFuZHJvaWQucHJpbnQuY3RzLnNlcnZpY2VzLkZpcnN0UHJpbnRTZXJ2aWNlOwotaW1wb3J0IGFuZHJvaWQucHJpbnQuY3RzLnNlcnZpY2VzLlByaW50U2VydmljZUNhbGxiYWNrczsKLWltcG9ydCBhbmRyb2lkLnByaW50LmN0cy5zZXJ2aWNlcy5QcmludGVyRGlzY292ZXJ5U2Vzc2lvbkNhbGxiYWNrczsKLWltcG9ydCBhbmRyb2lkLnByaW50LmN0cy5zZXJ2aWNlcy5TZWNvbmRQcmludFNlcnZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5wcmludC5jdHMuc2VydmljZXMuU3R1YmJhYmxlUHJpbnRlckRpc2NvdmVyeVNlc3Npb247CitpbXBvcnQgYW5kcm9pZC5wcmludC50ZXN0LkJhc2VQcmludFRlc3Q7CitpbXBvcnQgYW5kcm9pZC5wcmludC50ZXN0LnNlcnZpY2VzLkZpcnN0UHJpbnRTZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQucHJpbnQudGVzdC5zZXJ2aWNlcy5QcmludFNlcnZpY2VDYWxsYmFja3M7CitpbXBvcnQgYW5kcm9pZC5wcmludC50ZXN0LnNlcnZpY2VzLlByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uQ2FsbGJhY2tzOworaW1wb3J0IGFuZHJvaWQucHJpbnQudGVzdC5zZXJ2aWNlcy5TZWNvbmRQcmludFNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5wcmludC50ZXN0LnNlcnZpY2VzLlN0dWJiYWJsZVByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uOwogaW1wb3J0IGFuZHJvaWQucHJpbnRzZXJ2aWNlLlByaW50Sm9iOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ByaW50L3NyYy9hbmRyb2lkL3ByaW50L2N0cy9QcmludEpvYlRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3ByaW50L3NyYy9hbmRyb2lkL3ByaW50L2N0cy9QcmludEpvYlRlc3QuamF2YQppbmRleCBmMzA4MWZiLi4xNDViODM1IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9wcmludC9zcmMvYW5kcm9pZC9wcmludC9jdHMvUHJpbnRKb2JUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvcHJpbnQvc3JjL2FuZHJvaWQvcHJpbnQvY3RzL1ByaW50Sm9iVGVzdC5qYXZhCkBAIC0xNiw2ICsxNiwxNSBAQAogCiBwYWNrYWdlIGFuZHJvaWQucHJpbnQuY3RzOwogCitpbXBvcnQgc3RhdGljIGFuZHJvaWQucHJpbnQudGVzdC5VdGlscy5ldmVudHVhbGx5OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOwogaW1wb3J0IGFuZHJvaWQucHJpbnQuUHJpbnRBdHRyaWJ1dGVzOwogaW1wb3J0IGFuZHJvaWQucHJpbnQuUHJpbnRBdHRyaWJ1dGVzLk1hcmdpbnM7CiBpbXBvcnQgYW5kcm9pZC5wcmludC5QcmludEF0dHJpYnV0ZXMuTWVkaWFTaXplOwpAQCAtMjYsMjMgKzM1LDIzIEBACiBpbXBvcnQgYW5kcm9pZC5wcmludC5QcmludGVyQ2FwYWJpbGl0aWVzSW5mbzsKIGltcG9ydCBhbmRyb2lkLnByaW50LlByaW50ZXJJZDsKIGltcG9ydCBhbmRyb2lkLnByaW50LlByaW50ZXJJbmZvOwotaW1wb3J0IGFuZHJvaWQucHJpbnQuY3RzLnNlcnZpY2VzLkN1c3RvbVByaW50T3B0aW9uc0FjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQucHJpbnQuY3RzLnNlcnZpY2VzLkZpcnN0UHJpbnRTZXJ2aWNlOwotaW1wb3J0IGFuZHJvaWQucHJpbnQuY3RzLnNlcnZpY2VzLlByaW50U2VydmljZUNhbGxiYWNrczsKLWltcG9ydCBhbmRyb2lkLnByaW50LmN0cy5zZXJ2aWNlcy5QcmludGVyRGlzY292ZXJ5U2Vzc2lvbkNhbGxiYWNrczsKLWltcG9ydCBhbmRyb2lkLnByaW50LmN0cy5zZXJ2aWNlcy5TZWNvbmRQcmludFNlcnZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5wcmludC5jdHMuc2VydmljZXMuU3R1YmJhYmxlUHJpbnRlckRpc2NvdmVyeVNlc3Npb247CitpbXBvcnQgYW5kcm9pZC5wcmludC50ZXN0LkJhc2VQcmludFRlc3Q7CitpbXBvcnQgYW5kcm9pZC5wcmludC50ZXN0LnNlcnZpY2VzLkN1c3RvbVByaW50T3B0aW9uc0FjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQucHJpbnQudGVzdC5zZXJ2aWNlcy5GaXJzdFByaW50U2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLnByaW50LnRlc3Quc2VydmljZXMuUHJpbnRTZXJ2aWNlQ2FsbGJhY2tzOworaW1wb3J0IGFuZHJvaWQucHJpbnQudGVzdC5zZXJ2aWNlcy5QcmludGVyRGlzY292ZXJ5U2Vzc2lvbkNhbGxiYWNrczsKK2ltcG9ydCBhbmRyb2lkLnByaW50LnRlc3Quc2VydmljZXMuU2Vjb25kUHJpbnRTZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQucHJpbnQudGVzdC5zZXJ2aWNlcy5TdHViYmFibGVQcmludGVyRGlzY292ZXJ5U2Vzc2lvbjsKIGltcG9ydCBhbmRyb2lkLnByaW50c2VydmljZS5QcmludEpvYjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiAKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5wcmludC5jdHMuVXRpbHMuZXZlbnR1YWxseTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOwotCiAvKioKICAqIFRlc3RzIGFsbCBwb3NzaWJsZSBzdGF0ZXMgb2YgcHJpbnQgam9icy4KICAqLwpAQCAtMjkyLDYgKzMwMSw3IEBACiAgICAgICAgIH0pOwogICAgIH0KIAorICAgIEBBcHBNb2RlRnVsbChyZWFzb24gPSAiUHJpbnQgVUkgY2Fubm90IHJlc29sdmUgY3VzdG9tIHByaW50IG9wdGlvbnMgYWN0aXZpdHkgaW4gYSBpbnN0YW50IGFwcCIpCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCBhZHZhbmNlZE9wdGlvbigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICB0ZXN0U3VjY2Vzc1swXSA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcHJpbnQvc3JjL2FuZHJvaWQvcHJpbnQvY3RzL1ByaW50U2VydmljZXNUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9wcmludC9zcmMvYW5kcm9pZC9wcmludC9jdHMvUHJpbnRTZXJ2aWNlc1Rlc3QuamF2YQppbmRleCA3YmU1ZmMxLi5hNTg4OTdiIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9wcmludC9zcmMvYW5kcm9pZC9wcmludC9jdHMvUHJpbnRTZXJ2aWNlc1Rlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9wcmludC9zcmMvYW5kcm9pZC9wcmludC9jdHMvUHJpbnRTZXJ2aWNlc1Rlc3QuamF2YQpAQCAtMTYsNiArMTYsMTYgQEAKIAogcGFja2FnZSBhbmRyb2lkLnByaW50LmN0czsKIAoraW1wb3J0IHN0YXRpYyBhbmRyb2lkLnByaW50LnRlc3QuVXRpbHMuYXNzZXJ0RXhjZXB0aW9uOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnByaW50LnRlc3QuVXRpbHMuZXZlbnR1YWxseTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5wcmludC50ZXN0LlV0aWxzLmdldFByaW50Sm9iOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnByaW50LnRlc3QuVXRpbHMucnVuT25NYWluVGhyZWFkOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKwogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwogaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CkBAIC0zOCwyOSArNDgsMjggQEAKIGltcG9ydCBhbmRyb2lkLnByaW50LlByaW50ZXJDYXBhYmlsaXRpZXNJbmZvOwogaW1wb3J0IGFuZHJvaWQucHJpbnQuUHJpbnRlcklkOwogaW1wb3J0IGFuZHJvaWQucHJpbnQuUHJpbnRlckluZm87Ci1pbXBvcnQgYW5kcm9pZC5wcmludC5jdHMuc2VydmljZXMuRmlyc3RQcmludFNlcnZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5wcmludC5jdHMuc2VydmljZXMuSW5mb0FjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQucHJpbnQuY3RzLnNlcnZpY2VzLlByaW50U2VydmljZUNhbGxiYWNrczsKLWltcG9ydCBhbmRyb2lkLnByaW50LmN0cy5zZXJ2aWNlcy5QcmludGVyRGlzY292ZXJ5U2Vzc2lvbkNhbGxiYWNrczsKLWltcG9ydCBhbmRyb2lkLnByaW50LmN0cy5zZXJ2aWNlcy5TZWNvbmRQcmludFNlcnZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5wcmludC5jdHMuc2VydmljZXMuU3R1YmJhYmxlUHJpbnRTZXJ2aWNlOwotaW1wb3J0IGFuZHJvaWQucHJpbnQuY3RzLnNlcnZpY2VzLlN0dWJiYWJsZVByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uOworaW1wb3J0IGFuZHJvaWQucHJpbnQudGVzdC5CYXNlUHJpbnRUZXN0OworaW1wb3J0IGFuZHJvaWQucHJpbnQudGVzdC5zZXJ2aWNlcy5GaXJzdFByaW50U2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLnByaW50LnRlc3Quc2VydmljZXMuSW5mb0FjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQucHJpbnQudGVzdC5zZXJ2aWNlcy5QcmludFNlcnZpY2VDYWxsYmFja3M7CitpbXBvcnQgYW5kcm9pZC5wcmludC50ZXN0LnNlcnZpY2VzLlByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uQ2FsbGJhY2tzOworaW1wb3J0IGFuZHJvaWQucHJpbnQudGVzdC5zZXJ2aWNlcy5TZWNvbmRQcmludFNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5wcmludC50ZXN0LnNlcnZpY2VzLlN0dWJiYWJsZVByaW50U2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLnByaW50LnRlc3Quc2VydmljZXMuU3R1YmJhYmxlUHJpbnRlckRpc2NvdmVyeVNlc3Npb247CiBpbXBvcnQgYW5kcm9pZC5wcmludHNlcnZpY2UuQ3VzdG9tUHJpbnRlckljb25DYWxsYmFjazsKIGltcG9ydCBhbmRyb2lkLnByaW50c2VydmljZS5QcmludEpvYjsKIGltcG9ydCBhbmRyb2lkLnByaW50c2VydmljZS5QcmludFNlcnZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QudWlhdXRvbWF0b3IuVWlEZXZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QudWlhdXRvbWF0b3IuVWlPYmplY3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QudWlhdXRvbWF0b3IuVWlTZWxlY3RvcjsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC51aWF1dG9tYXRvci5CeTsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC51aWF1dG9tYXRvci5VaU9iamVjdDI7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnByaW50LmN0cy5VdGlscy4qOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7Ci0KIC8qKgogICogVGVzdCB0aGUgaW50ZXJmYWNlIGZyb20gYSBwcmludCBzZXJ2aWNlIHRvIHRoZSBwcmludCBtYW5hZ2VyCiAgKi8KQEAgLTM5Myw5ICs0MDIsOCBAQAogICAgICAgICBwcmludChhZGFwdGVyKTsKIAogICAgICAgICAvLyBPcGVuIHByaW50ZXIgc2VsZWN0aW9uIGRyb3Bkb3duIGxpc3QgdG8gZGlzcGxheSBpY29uIG9uIHNjcmVlbgotICAgICAgICBVaU9iamVjdCBkZXN0aW5hdGlvblNwaW5uZXIgPSBVaURldmljZS5nZXRJbnN0YW5jZShnZXRJbnN0cnVtZW50YXRpb24oKSkKLSAgICAgICAgICAgICAgICAuZmluZE9iamVjdChuZXcgVWlTZWxlY3RvcigpLnJlc291cmNlSWQoCi0gICAgICAgICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQucHJpbnRzcG9vbGVyOmlkL2Rlc3RpbmF0aW9uX3NwaW5uZXIiKSk7CisgICAgICAgIFVpT2JqZWN0MiBkZXN0aW5hdGlvblNwaW5uZXIgPSBmaW5kVWlPYmplY3QoQnkucmVzKAorICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5wcmludHNwb29sZXI6aWQvZGVzdGluYXRpb25fc3Bpbm5lciIpKTsKICAgICAgICAgZGVzdGluYXRpb25TcGlubmVyLmNsaWNrKCk7CiAKICAgICAgICAgLy8gR2V0IHRoZSBwcmludCBzZXJ2aWNlJ3MgaWNvbgpAQCAtNjE1LDggKzYyMyw3IEBACiAgICAgICAgIH0pOwogCiAgICAgICAgIC8vIE9wZW4gaW5mbyBhY3Rpdml0eSB3aGljaCBleGVjdXRlZCB0aGUgY29kZSBhYm92ZQotICAgICAgICBVaU9iamVjdCBtb3JlSW5mb0J1dHRvbiA9IGdldFVpRGV2aWNlKCkuZmluZE9iamVjdChuZXcgVWlTZWxlY3RvcigpLnJlc291cmNlSWQoCi0gICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLnByaW50c3Bvb2xlcjppZC9tb3JlX2luZm8iKSk7CisgICAgICAgIFVpT2JqZWN0MiBtb3JlSW5mb0J1dHRvbiA9IGZpbmRVaU9iamVjdChCeS5yZXMoImNvbS5hbmRyb2lkLnByaW50c3Bvb2xlcjppZC9tb3JlX2luZm8iKSk7CiAgICAgICAgIG1vcmVJbmZvQnV0dG9uLmNsaWNrKCk7CiAKICAgICAgICAgLy8gV2FpdCB1bnRpbCBwcmludGVyIGlzIHNlbGVjdGVkIGFuZCB0aGVyZWJ5IHRyYWNrZWQKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ByaW50L3NyYy9hbmRyb2lkL3ByaW50L2N0cy9QcmludGVyQ2FwYWJpbGl0aWVzQ2hhbmdlVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvcHJpbnQvc3JjL2FuZHJvaWQvcHJpbnQvY3RzL1ByaW50ZXJDYXBhYmlsaXRpZXNDaGFuZ2VUZXN0LmphdmEKaW5kZXggOWIyNzdlOS4uMjUxYjM3MSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvcHJpbnQvc3JjL2FuZHJvaWQvcHJpbnQvY3RzL1ByaW50ZXJDYXBhYmlsaXRpZXNDaGFuZ2VUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvcHJpbnQvc3JjL2FuZHJvaWQvcHJpbnQvY3RzL1ByaW50ZXJDYXBhYmlsaXRpZXNDaGFuZ2VUZXN0LmphdmEKQEAgLTE2LDYgKzE2LDggQEAKIAogcGFja2FnZSBhbmRyb2lkLnByaW50LmN0czsKIAoraW1wb3J0IHN0YXRpYyBhbmRyb2lkLnByaW50LnRlc3QuVXRpbHMucnVuT25NYWluVGhyZWFkOworCiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBhbmRyb2lkLnByaW50LlBhZ2VSYW5nZTsKIGltcG9ydCBhbmRyb2lkLnByaW50LlByaW50QXR0cmlidXRlczsKQEAgLTI5LDE0ICszMSwxNCBAQAogaW1wb3J0IGFuZHJvaWQucHJpbnQuUHJpbnRlckNhcGFiaWxpdGllc0luZm87CiBpbXBvcnQgYW5kcm9pZC5wcmludC5QcmludGVySWQ7CiBpbXBvcnQgYW5kcm9pZC5wcmludC5QcmludGVySW5mbzsKLWltcG9ydCBhbmRyb2lkLnByaW50LmN0cy5zZXJ2aWNlcy5GaXJzdFByaW50U2VydmljZTsKLWltcG9ydCBhbmRyb2lkLnByaW50LmN0cy5zZXJ2aWNlcy5QcmludFNlcnZpY2VDYWxsYmFja3M7Ci1pbXBvcnQgYW5kcm9pZC5wcmludC5jdHMuc2VydmljZXMuUHJpbnRlckRpc2NvdmVyeVNlc3Npb25DYWxsYmFja3M7Ci1pbXBvcnQgYW5kcm9pZC5wcmludC5jdHMuc2VydmljZXMuU2Vjb25kUHJpbnRTZXJ2aWNlOwotaW1wb3J0IGFuZHJvaWQucHJpbnQuY3RzLnNlcnZpY2VzLlN0dWJiYWJsZVByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLlVpT2JqZWN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLlVpU2VsZWN0b3I7CitpbXBvcnQgYW5kcm9pZC5wcmludC50ZXN0LkJhc2VQcmludFRlc3Q7CitpbXBvcnQgYW5kcm9pZC5wcmludC50ZXN0LnNlcnZpY2VzLkZpcnN0UHJpbnRTZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQucHJpbnQudGVzdC5zZXJ2aWNlcy5QcmludFNlcnZpY2VDYWxsYmFja3M7CitpbXBvcnQgYW5kcm9pZC5wcmludC50ZXN0LnNlcnZpY2VzLlByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uQ2FsbGJhY2tzOworaW1wb3J0IGFuZHJvaWQucHJpbnQudGVzdC5zZXJ2aWNlcy5TZWNvbmRQcmludFNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5wcmludC50ZXN0LnNlcnZpY2VzLlN0dWJiYWJsZVByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKQEAgLTQ3LDggKzQ5LDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lb3V0RXhjZXB0aW9uOwogCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQucHJpbnQuY3RzLlV0aWxzLnJ1bk9uTWFpblRocmVhZDsKLQogLyoqCiAgKiBUaGlzIHRlc3QgdmVyaWZpZXMgY2hhbmdlcyB0byB0aGUgcHJpbnRlciBjYXBhYmlsaXRpZXMgYXJlIGFwcGxpZWQgY29ycmVjdGx5LgogICovCkBAIC0xNTQsMjMgKzE1NCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBQcmludGVySW5mby5TVEFUVVNfVU5BVkFJTEFCTEUpKSk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogV2FpdCB1bnRpbCB0aGUgbWVzc2FnZSBpcyBzaG93biB0aGF0IGluZGljYXRlcyB0aGF0IGEgcHJpbnRlciBpcyB1bmF2aWxhYmxlLgotICAgICAqCi0gICAgICogQHRocm93cyBFeGNlcHRpb24gSWYgYW55dGhpbmcgd2FzIHVuZXhwZWN0ZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHdhaXRGb3JQcmludGVyVW5hdmFpbGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIFBSSU5URVJfVU5BVkFJTEFCTEVfTVNHID0KLSAgICAgICAgICAgICAgICBnZXRQcmludFNwb29sZXJTdHJpbmcoInByaW50X2Vycm9yX3ByaW50ZXJfdW5hdmFpbGFibGUiKTsKLQotICAgICAgICBVaU9iamVjdCBtZXNzYWdlID0gZ2V0VWlEZXZpY2UoKS5maW5kT2JqZWN0KG5ldyBVaVNlbGVjdG9yKCkucmVzb3VyY2VJZCgKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQucHJpbnRzcG9vbGVyOmlkL21lc3NhZ2UiKSk7Ci0gICAgICAgIGlmICghbWVzc2FnZS5nZXRUZXh0KCkuZXF1YWxzKFBSSU5URVJfVU5BVkFJTEFCTEVfTVNHKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiV3JvbmcgbWVzc2FnZTogIiArIG1lc3NhZ2UuZ2V0VGV4dCgpICsgIiBpbnN0ZWFkIG9mICIgKwotICAgICAgICAgICAgICAgICAgICBQUklOVEVSX1VOQVZBSUxBQkxFX01TRyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBAQmVmb3JlCiAgICAgcHVibGljIHZvaWQgc2V0VXBQcmludGluZygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBDcmVhdGUgdGhlIG1TZXNzaW9uWzBdIGNhbGxiYWNrcyB0aGF0IHdlIHdpbGwgYmUgY2hlY2tpbmcuCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9wcmludC9zcmMvYW5kcm9pZC9wcmludC9jdHMvUHJpbnRlckNhcGFiaWxpdGllc1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3ByaW50L3NyYy9hbmRyb2lkL3ByaW50L2N0cy9QcmludGVyQ2FwYWJpbGl0aWVzVGVzdC5qYXZhCmluZGV4IDNlYTAzYWYuLjQzM2IzMmQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3ByaW50L3NyYy9hbmRyb2lkL3ByaW50L2N0cy9QcmludGVyQ2FwYWJpbGl0aWVzVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3ByaW50L3NyYy9hbmRyb2lkL3ByaW50L2N0cy9QcmludGVyQ2FwYWJpbGl0aWVzVGVzdC5qYXZhCkBAIC0xNiw2ICsxNiwxMSBAQAogCiBwYWNrYWdlIGFuZHJvaWQucHJpbnQuY3RzOwogCitpbXBvcnQgc3RhdGljIGFuZHJvaWQucHJpbnQudGVzdC5VdGlscy5hc3NlcnRFeGNlcHRpb247CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3I7CiBpbXBvcnQgYW5kcm9pZC5wcmludC5QYWdlUmFuZ2U7CiBpbXBvcnQgYW5kcm9pZC5wcmludC5QcmludEF0dHJpYnV0ZXM7CkBAIC0yOSwxMiArMzQsMTUgQEAKIGltcG9ydCBhbmRyb2lkLnByaW50LlByaW50ZXJDYXBhYmlsaXRpZXNJbmZvOwogaW1wb3J0IGFuZHJvaWQucHJpbnQuUHJpbnRlcklkOwogaW1wb3J0IGFuZHJvaWQucHJpbnQuUHJpbnRlckluZm87Ci1pbXBvcnQgYW5kcm9pZC5wcmludC5jdHMuc2VydmljZXMuRmlyc3RQcmludFNlcnZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5wcmludC5jdHMuc2VydmljZXMuUHJpbnRTZXJ2aWNlQ2FsbGJhY2tzOwotaW1wb3J0IGFuZHJvaWQucHJpbnQuY3RzLnNlcnZpY2VzLlByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uQ2FsbGJhY2tzOwotaW1wb3J0IGFuZHJvaWQucHJpbnQuY3RzLnNlcnZpY2VzLlNlY29uZFByaW50U2VydmljZTsKLWltcG9ydCBhbmRyb2lkLnByaW50LmN0cy5zZXJ2aWNlcy5TdHViYmFibGVQcmludGVyRGlzY292ZXJ5U2Vzc2lvbjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKK2ltcG9ydCBhbmRyb2lkLnByaW50LnRlc3QuQmFzZVByaW50VGVzdDsKK2ltcG9ydCBhbmRyb2lkLnByaW50LnRlc3Quc2VydmljZXMuRmlyc3RQcmludFNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5wcmludC50ZXN0LnNlcnZpY2VzLlByaW50U2VydmljZUNhbGxiYWNrczsKK2ltcG9ydCBhbmRyb2lkLnByaW50LnRlc3Quc2VydmljZXMuUHJpbnRlckRpc2NvdmVyeVNlc3Npb25DYWxsYmFja3M7CitpbXBvcnQgYW5kcm9pZC5wcmludC50ZXN0LnNlcnZpY2VzLlNlY29uZFByaW50U2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLnByaW50LnRlc3Quc2VydmljZXMuU3R1YmJhYmxlUHJpbnRlckRpc2NvdmVyeVNlc3Npb247CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCkBAIC00Miw5ICs1MCw2IEBACiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOwogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKIAotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnByaW50LmN0cy5VdGlscy5hc3NlcnRFeGNlcHRpb247Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKLQogLyoqCiAgKiBUaGlzIHRlc3QgdmVyaWZpZXMgY2hhbmdlcyB0byB0aGUgcHJpbnRlciBjYXBhYmlsaXRpZXMgYXJlIGFwcGxpZWQgY29ycmVjdGx5LgogICovCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9wcmludC9zcmMvYW5kcm9pZC9wcmludC9jdHMvUHJpbnRlckRpc2NvdmVyeVNlc3Npb25MaWZlY3ljbGVUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9wcmludC9zcmMvYW5kcm9pZC9wcmludC9jdHMvUHJpbnRlckRpc2NvdmVyeVNlc3Npb25MaWZlY3ljbGVUZXN0LmphdmEKaW5kZXggNDk5ZDIxZS4uMjVlM2MwYiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvcHJpbnQvc3JjL2FuZHJvaWQvcHJpbnQvY3RzL1ByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uTGlmZWN5Y2xlVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3ByaW50L3NyYy9hbmRyb2lkL3ByaW50L2N0cy9QcmludGVyRGlzY292ZXJ5U2Vzc2lvbkxpZmVjeWNsZVRlc3QuamF2YQpAQCAtMTYsOCArMTYsMTMgQEAKIAogcGFja2FnZSBhbmRyb2lkLnByaW50LmN0czsKIAotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnByaW50LmN0cy5VdGlscy4qOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQucHJpbnQudGVzdC5VdGlscy5ldmVudHVhbGx5OworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnByaW50LnRlc3QuVXRpbHMucnVuT25NYWluVGhyZWFkOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5pbk9yZGVyOwogCiBpbXBvcnQgYW5kcm9pZC5wcmludC5QcmludEF0dHJpYnV0ZXM7CkBAIC0yOCwxNSArMzMsMjAgQEAKIGltcG9ydCBhbmRyb2lkLnByaW50LlByaW50ZXJDYXBhYmlsaXRpZXNJbmZvOwogaW1wb3J0IGFuZHJvaWQucHJpbnQuUHJpbnRlcklkOwogaW1wb3J0IGFuZHJvaWQucHJpbnQuUHJpbnRlckluZm87Ci1pbXBvcnQgYW5kcm9pZC5wcmludC5jdHMuc2VydmljZXMuRmlyc3RQcmludFNlcnZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5wcmludC5jdHMuc2VydmljZXMuUHJpbnRTZXJ2aWNlQ2FsbGJhY2tzOwotaW1wb3J0IGFuZHJvaWQucHJpbnQuY3RzLnNlcnZpY2VzLlByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uQ2FsbGJhY2tzOwotaW1wb3J0IGFuZHJvaWQucHJpbnQuY3RzLnNlcnZpY2VzLlNlY29uZFByaW50U2VydmljZTsKLWltcG9ydCBhbmRyb2lkLnByaW50LmN0cy5zZXJ2aWNlcy5TdHViYmFibGVQcmludGVyRGlzY292ZXJ5U2Vzc2lvbjsKK2ltcG9ydCBhbmRyb2lkLnByaW50LnRlc3QuQmFzZVByaW50VGVzdDsKK2ltcG9ydCBhbmRyb2lkLnByaW50LnRlc3Quc2VydmljZXMuRmlyc3RQcmludFNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5wcmludC50ZXN0LnNlcnZpY2VzLlByaW50U2VydmljZUNhbGxiYWNrczsKK2ltcG9ydCBhbmRyb2lkLnByaW50LnRlc3Quc2VydmljZXMuUHJpbnRlckRpc2NvdmVyeVNlc3Npb25DYWxsYmFja3M7CitpbXBvcnQgYW5kcm9pZC5wcmludC50ZXN0LnNlcnZpY2VzLlNlY29uZFByaW50U2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLnByaW50LnRlc3Quc2VydmljZXMuU3R1YmJhYmxlUHJpbnRlckRpc2NvdmVyeVNlc3Npb247CiBpbXBvcnQgYW5kcm9pZC5wcmludHNlcnZpY2UuUHJpbnRKb2I7CiBpbXBvcnQgYW5kcm9pZC5wcmludHNlcnZpY2UuUHJpbnRlckRpc2NvdmVyeVNlc3Npb247CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QudWlhdXRvbWF0b3IuQnk7CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QudWlhdXRvbWF0b3IuVWlPYmplY3QyOwogCi1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5Ob25OdWxsOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKQEAgLTUzLDEwICs2Myw3IEBACiAgKi8KIEBSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCiBwdWJsaWMgY2xhc3MgUHJpbnRlckRpc2NvdmVyeVNlc3Npb25MaWZlY3ljbGVUZXN0IGV4dGVuZHMgQmFzZVByaW50VGVzdCB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJUlNUX1BSSU5URVJfTkFNRSA9ICJGaXJzdCBwcmludGVyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VDT05EX1BSSU5URVJfTkFNRSA9ICJTZWNvbmQgcHJpbnRlciI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklSU1RfUFJJTlRFUl9MT0NBTF9JRD0gImZpcnN0X3ByaW50ZXIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSVJTVF9QUklOVEVSX0xPQ0FMX0lEID0gImZpcnN0X3ByaW50ZXIiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRUNPTkRfUFJJTlRFUl9MT0NBTF9JRCA9ICJzZWNvbmRfcHJpbnRlciI7CiAKICAgICBwcml2YXRlIHN0YXRpYyBTdHViYmFibGVQcmludGVyRGlzY292ZXJ5U2Vzc2lvbiBzU2Vzc2lvbjsKQEAgLTY2LDYgKzczLDE3MSBAQAogICAgICAgICBjbGVhclByaW50U3Bvb2xlckRhdGEoKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBBZGQgYSBwcmludGVyIHRvIHtAI3NTZXNzaW9ufS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsb2NhbElkIFRoZSBpZCBvZiB0aGUgcHJpbnRlciB0byBhZGQKKyAgICAgKiBAcGFyYW0gaGFzQ2FwYWJpbGl0aWVzIElmIHRoZSBwcmludGVyIGhhcyBjYXBhYmlsaXRpZXMKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYWRkUHJpbnRlcihATm9uTnVsbCBTdHJpbmcgbG9jYWxJZCwgYm9vbGVhbiBoYXNDYXBhYmlsaXRpZXMpIHsKKyAgICAgICAgLy8gQWRkIHRoZSBmaXJzdCBwcmludGVyLgorICAgICAgICBQcmludGVySWQgZmlyc3RQcmludGVySWQgPSBzU2Vzc2lvbi5nZXRTZXJ2aWNlKCkuZ2VuZXJhdGVQcmludGVySWQoCisgICAgICAgICAgICAgICAgbG9jYWxJZCk7CisKKyAgICAgICAgUHJpbnRlckluZm8uQnVpbGRlciBwcmludGVyID0gbmV3IFByaW50ZXJJbmZvLkJ1aWxkZXIoZmlyc3RQcmludGVySWQsCisgICAgICAgICAgICAgICAgbG9jYWxJZCwgUHJpbnRlckluZm8uU1RBVFVTX0lETEUpOworCisgICAgICAgIGlmIChoYXNDYXBhYmlsaXRpZXMpIHsKKyAgICAgICAgICAgIHByaW50ZXIuc2V0Q2FwYWJpbGl0aWVzKG5ldyBQcmludGVyQ2FwYWJpbGl0aWVzSW5mby5CdWlsZGVyKGZpcnN0UHJpbnRlcklkKQorICAgICAgICAgICAgICAgICAgICAuc2V0TWluTWFyZ2lucyhuZXcgTWFyZ2lucygyMDAsIDIwMCwgMjAwLCAyMDApKQorICAgICAgICAgICAgICAgICAgICAuYWRkTWVkaWFTaXplKE1lZGlhU2l6ZS5JU09fQTAsIHRydWUpCisgICAgICAgICAgICAgICAgICAgIC5hZGRSZXNvbHV0aW9uKG5ldyBSZXNvbHV0aW9uKCIzMDB4MzAwIiwgIjMwMHgzMDAiLCAzMDAsIDMwMCksIHRydWUpCisgICAgICAgICAgICAgICAgICAgIC5zZXRDb2xvck1vZGVzKFByaW50QXR0cmlidXRlcy5DT0xPUl9NT0RFX0NPTE9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50QXR0cmlidXRlcy5DT0xPUl9NT0RFX0NPTE9SKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgICAgIH0KKworICAgICAgICBzU2Vzc2lvbi5hZGRQcmludGVycyhDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHByaW50ZXIuYnVpbGQoKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ha2Uge0Bjb2RlIGxvY2FsUHJpbnRlcklkfSB0aGUgZGVmYXVsdCBwcmludGVyLiBUaGlzIHJlcXVpcmVzIGEgZnVsbCBwcmludCB3b3JrZmxvdy4KKyAgICAgKgorICAgICAqIEFzIGEgc2lkZS1lZmZlY3QgYWxzbyBhcHByb3ZlZCB0aGUgcHJpbnQgc2VydmljZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsb2NhbFByaW50ZXJJZCBUaGUgcHJpbnRlciB0byBtYWtlIGRlZmF1bHQKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgbWFrZURlZmF1bHRQcmludGVyKFN0cmluZyBsb2NhbFByaW50ZXJJZCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIFByaW50RG9jdW1lbnRBZGFwdGVyIGFkYXB0ZXIgPSBjcmVhdGVEZWZhdWx0UHJpbnREb2N1bWVudEFkYXB0ZXIoMSk7CisKKyAgICAgICAgcHJpbnQoYWRhcHRlcik7CisgICAgICAgIHdhaXRGb3JXcml0ZUFkYXB0ZXJDYWxsYmFjaygxKTsKKworICAgICAgICBydW5Pbk1haW5UaHJlYWQoKCkgLT4gYWRkUHJpbnRlcihsb2NhbFByaW50ZXJJZCwgdHJ1ZSkpOworICAgICAgICBzZWxlY3RQcmludGVyKGxvY2FsUHJpbnRlcklkKTsKKyAgICAgICAgd2FpdEZvcldyaXRlQWRhcHRlckNhbGxiYWNrKDIpOworCisgICAgICAgIGNsaWNrUHJpbnRCdXR0b24oKTsKKyAgICAgICAgYW5zd2VyUHJpbnRTZXJ2aWNlc1dhcm5pbmcodHJ1ZSk7CisKKyAgICAgICAgd2FpdEZvclByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uRGVzdHJveUNhbGxiYWNrQ2FsbGVkKDEpOworICAgICAgICByZXNldENvdW50ZXJzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VsZWN0IGEgcHJpbnRlciBpbiB0aGUgYWxsIHByaW50ZXJzIGFjdGl2aXR5CisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJpbnRlck5hbWUgVGhlIG5hbWUgb2YgdGhlIHByaW50ZXIgdG8gc2VsZWN0CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNlbGVjdEluQWxsUHJpbnRlcnNBY3Rpdml0eShATm9uTnVsbCBTdHJpbmcgcHJpbnRlck5hbWUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgVWlPYmplY3QyIHByaW50ZXJJdGVtID0gZmluZFVpT2JqZWN0KEJ5LnRleHQocHJpbnRlck5hbWUpKTsKKworICAgICAgICAgICAgaWYgKHByaW50ZXJJdGVtLmlzRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgcHJpbnRlckl0ZW0uY2xpY2soKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGRlZmF1bHRQcmludGVyQmVjb21lc0F2YWlsYWJsZVdoaWxlSW5CYWNrZ3JvdW5kKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIC8vIENyZWF0ZSB0aGUgc2Vzc2lvbiBjYWxsYmFja3MgdGhhdCB3ZSB3aWxsIGJlIGNoZWNraW5nLgorICAgICAgICBmaW5hbCBQcmludGVyRGlzY292ZXJ5U2Vzc2lvbkNhbGxiYWNrcyBmaXJzdFNlc3Npb25DYWxsYmFja3MgPQorICAgICAgICAgICAgICAgIGNyZWF0ZU1vY2tQcmludGVyRGlzY292ZXJ5U2Vzc2lvbkNhbGxiYWNrcyhpbnZvY2F0aW9uIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgc1Nlc3Npb24gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUHJpbnRlckRpc2NvdmVyeVNlc3Npb25DYWxsYmFja3MpIGludm9jYXRpb24uZ2V0TW9jaygpKS5nZXRTZXNzaW9uKCk7CisKKyAgICAgICAgICAgICAgICAgICAgb25QcmludGVyRGlzY292ZXJ5U2Vzc2lvbkNyZWF0ZUNhbGxlZCgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9LCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBpbnZvY2F0aW9uIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgb25QcmludGVyRGlzY292ZXJ5U2Vzc2lvbkRlc3Ryb3lDYWxsZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBzZXJ2aWNlIGNhbGxiYWNrcyBmb3IgdGhlIGZpcnN0IHByaW50IHNlcnZpY2UuCisgICAgICAgIFByaW50U2VydmljZUNhbGxiYWNrcyBmaXJzdFNlcnZpY2VDYWxsYmFja3MgPSBjcmVhdGVNb2NrUHJpbnRTZXJ2aWNlQ2FsbGJhY2tzKAorICAgICAgICAgICAgICAgIGludm9jYXRpb24gLT4gZmlyc3RTZXNzaW9uQ2FsbGJhY2tzLCBudWxsLCBudWxsKTsKKworICAgICAgICAvLyBDb25maWd1cmUgdGhlIHByaW50IHNlcnZpY2VzLgorICAgICAgICBGaXJzdFByaW50U2VydmljZS5zZXRDYWxsYmFja3MoZmlyc3RTZXJ2aWNlQ2FsbGJhY2tzKTsKKyAgICAgICAgU2Vjb25kUHJpbnRTZXJ2aWNlLnNldENhbGxiYWNrcyhjcmVhdGVTZWNvbmRNb2NrUHJpbnRTZXJ2aWNlQ2FsbGJhY2tzKCkpOworCisgICAgICAgIG1ha2VEZWZhdWx0UHJpbnRlcihGSVJTVF9QUklOVEVSX0xPQ0FMX0lEKTsKKworICAgICAgICBQcmludERvY3VtZW50QWRhcHRlciBhZGFwdGVyID0gY3JlYXRlRGVmYXVsdFByaW50RG9jdW1lbnRBZGFwdGVyKDEpOworICAgICAgICBwcmludChhZGFwdGVyKTsKKyAgICAgICAgd2FpdEZvclByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uQ3JlYXRlQ2FsbGJhY2tDYWxsZWQoKTsKKworICAgICAgICB3YWl0Rm9yUHJpbnRlclVuYXZhaWxhYmxlKCk7CisKKyAgICAgICAgc2VsZWN0UHJpbnRlcigiQWxsIHByaW50ZXJz4oCmIik7CisgICAgICAgIC8vIExldCBhbGwgcHJpbnRlcnMgYWN0aXZpdHkgc3RhcnQKKyAgICAgICAgVGhyZWFkLnNsZWVwKDUwMCk7CisKKyAgICAgICAgLy8gQWRkIHByaW50ZXIKKyAgICAgICAgcnVuT25NYWluVGhyZWFkKCgpIC0+IGFkZFByaW50ZXIoRklSU1RfUFJJTlRFUl9MT0NBTF9JRCwgdHJ1ZSkpOworCisgICAgICAgIC8vIFNlbGVjdCBwcmludGVyIG9uY2UgYXZhaWxhYmxlICh0aGlzIHJldHVybnMgdG8gbWFpbiBwcmludCBhY3Rpdml0eSkKKyAgICAgICAgc2VsZWN0SW5BbGxQcmludGVyc0FjdGl2aXR5KEZJUlNUX1BSSU5URVJfTE9DQUxfSUQpOworCisgICAgICAgIC8vIFdhaXQgZm9yIHByZXZpZXcgdG8gbG9hZCBhbmQgZmluaXNoIHByaW50CisgICAgICAgIHdhaXRGb3JXcml0ZUFkYXB0ZXJDYWxsYmFjaygxKTsKKyAgICAgICAgY2xpY2tQcmludEJ1dHRvbigpOworICAgICAgICB3YWl0Rm9yUHJpbnRlckRpc2NvdmVyeVNlc3Npb25EZXN0cm95Q2FsbGJhY2tDYWxsZWQoMSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBkZWZhdWx0UHJpbnRlckJlY29tZXNVc2FibGVXaGlsZUluQmFja2dyb3VuZCgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICAvLyBDcmVhdGUgdGhlIHNlc3Npb24gY2FsbGJhY2tzIHRoYXQgd2Ugd2lsbCBiZSBjaGVja2luZy4KKyAgICAgICAgZmluYWwgUHJpbnRlckRpc2NvdmVyeVNlc3Npb25DYWxsYmFja3MgZmlyc3RTZXNzaW9uQ2FsbGJhY2tzID0KKyAgICAgICAgICAgICAgICBjcmVhdGVNb2NrUHJpbnRlckRpc2NvdmVyeVNlc3Npb25DYWxsYmFja3MoaW52b2NhdGlvbiAtPiB7CisgICAgICAgICAgICAgICAgICAgIHNTZXNzaW9uID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uQ2FsbGJhY2tzKSBpbnZvY2F0aW9uLmdldE1vY2soKSkuZ2V0U2Vzc2lvbigpOworCisgICAgICAgICAgICAgICAgICAgIG9uUHJpbnRlckRpc2NvdmVyeVNlc3Npb25DcmVhdGVDYWxsZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfSwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgaW52b2NhdGlvbiAtPiB7CisgICAgICAgICAgICAgICAgICAgIG9uUHJpbnRlckRpc2NvdmVyeVNlc3Npb25EZXN0cm95Q2FsbGVkKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgIC8vIENyZWF0ZSB0aGUgc2VydmljZSBjYWxsYmFja3MgZm9yIHRoZSBmaXJzdCBwcmludCBzZXJ2aWNlLgorICAgICAgICBQcmludFNlcnZpY2VDYWxsYmFja3MgZmlyc3RTZXJ2aWNlQ2FsbGJhY2tzID0gY3JlYXRlTW9ja1ByaW50U2VydmljZUNhbGxiYWNrcygKKyAgICAgICAgICAgICAgICBpbnZvY2F0aW9uIC0+IGZpcnN0U2Vzc2lvbkNhbGxiYWNrcywgbnVsbCwgbnVsbCk7CisKKyAgICAgICAgLy8gQ29uZmlndXJlIHRoZSBwcmludCBzZXJ2aWNlcy4KKyAgICAgICAgRmlyc3RQcmludFNlcnZpY2Uuc2V0Q2FsbGJhY2tzKGZpcnN0U2VydmljZUNhbGxiYWNrcyk7CisgICAgICAgIFNlY29uZFByaW50U2VydmljZS5zZXRDYWxsYmFja3MoY3JlYXRlU2Vjb25kTW9ja1ByaW50U2VydmljZUNhbGxiYWNrcygpKTsKKworICAgICAgICBtYWtlRGVmYXVsdFByaW50ZXIoRklSU1RfUFJJTlRFUl9MT0NBTF9JRCk7CisKKyAgICAgICAgUHJpbnREb2N1bWVudEFkYXB0ZXIgYWRhcHRlciA9IGNyZWF0ZURlZmF1bHRQcmludERvY3VtZW50QWRhcHRlcigxKTsKKyAgICAgICAgcHJpbnQoYWRhcHRlcik7CisgICAgICAgIHdhaXRGb3JQcmludGVyRGlzY292ZXJ5U2Vzc2lvbkNyZWF0ZUNhbGxiYWNrQ2FsbGVkKCk7CisKKyAgICAgICAgLy8gQWRkIHByaW50ZXIgYnV0IGRvIG5vdCBlbmFibGUgaXQgKGNhcGFiaWxpdGllcyA9PSBudWxsKQorICAgICAgICBydW5Pbk1haW5UaHJlYWQoKCkgLT4gYWRkUHJpbnRlcihGSVJTVF9QUklOVEVSX0xPQ0FMX0lELCBmYWxzZSkpOworICAgICAgICB3YWl0Rm9yUHJpbnRlclVuYXZhaWxhYmxlKCk7CisKKyAgICAgICAgc2VsZWN0UHJpbnRlcigiQWxsIHByaW50ZXJz4oCmIik7CisgICAgICAgIC8vIExldCBhbGwgcHJpbnRlcnMgYWN0aXZpdHkgc3RhcnQKKyAgICAgICAgVGhyZWFkLnNsZWVwKDUwMCk7CisKKyAgICAgICAgLy8gRW5hYmxlIHByaW50ZXIKKyAgICAgICAgcnVuT25NYWluVGhyZWFkKCgpIC0+IGFkZFByaW50ZXIoRklSU1RfUFJJTlRFUl9MT0NBTF9JRCwgdHJ1ZSkpOworCisgICAgICAgIC8vIFNlbGVjdCBwcmludGVyIG9uY2UgYXZhaWxhYmxlICh0aGlzIHJldHVybnMgdG8gbWFpbiBwcmludCBhY3Rpdml0eSkKKyAgICAgICAgc2VsZWN0SW5BbGxQcmludGVyc0FjdGl2aXR5KEZJUlNUX1BSSU5URVJfTE9DQUxfSUQpOworCisgICAgICAgIC8vIFdhaXQgZm9yIHByZXZpZXcgdG8gbG9hZCBhbmQgZmluaXNoIHByaW50CisgICAgICAgIHdhaXRGb3JXcml0ZUFkYXB0ZXJDYWxsYmFjaygxKTsKKyAgICAgICAgY2xpY2tQcmludEJ1dHRvbigpOworICAgICAgICB3YWl0Rm9yUHJpbnRlckRpc2NvdmVyeVNlc3Npb25EZXN0cm95Q2FsbGJhY2tDYWxsZWQoMSk7CisgICAgfQorCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCBub3JtYWxMaWZlY3ljbGUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgLy8gQ3JlYXRlIHRoZSBzZXNzaW9uIGNhbGxiYWNrcyB0aGF0IHdlIHdpbGwgYmUgY2hlY2tpbmcuCkBAIC05OSw3ICsyNzEsNyBAQAogICAgICAgICBydW5Pbk1haW5UaHJlYWQoKCkgLT4gYXNzZXJ0RXF1YWxzKDAsIHNTZXNzaW9uLmdldFRyYWNrZWRQcmludGVycygpLnNpemUoKSkpOwogCiAgICAgICAgIC8vIFNlbGVjdCB0aGUgZmlyc3QgcHJpbnRlci4KLSAgICAgICAgc2VsZWN0UHJpbnRlcihGSVJTVF9QUklOVEVSX05BTUUpOworICAgICAgICBzZWxlY3RQcmludGVyKEZJUlNUX1BSSU5URVJfTE9DQUxfSUQpOwogCiAgICAgICAgIGV2ZW50dWFsbHkoKCkgLT4gcnVuT25NYWluVGhyZWFkKCgpIC0+IGFzc2VydEVxdWFscyhGSVJTVF9QUklOVEVSX0xPQ0FMX0lELAogICAgICAgICAgICAgICAgIHNTZXNzaW9uLmdldFRyYWNrZWRQcmludGVycygpLmdldCgwKS5nZXRMb2NhbElkKCkpKSk7CkBAIC0xMTEsNyArMjgzLDcgQEAKIAogICAgICAgICAvLyBTZWxlY3QgdGhlIHNlY29uZCBwcmludGVyIChzYW1lIGNhcGFiaWxpdGllcyBhcyB0aGUgb3RoZXIKICAgICAgICAgLy8gb25lIHNvIG5vIGxheW91dCBzaG91bGQgaGFwcGVuKS4KLSAgICAgICAgc2VsZWN0UHJpbnRlcihTRUNPTkRfUFJJTlRFUl9OQU1FKTsKKyAgICAgICAgc2VsZWN0UHJpbnRlcihTRUNPTkRfUFJJTlRFUl9MT0NBTF9JRCk7CiAKICAgICAgICAgZXZlbnR1YWxseSgoKSAtPiBydW5Pbk1haW5UaHJlYWQoKCkgLT4gYXNzZXJ0RXF1YWxzKFNFQ09ORF9QUklOVEVSX0xPQ0FMX0lELAogICAgICAgICAgICAgICAgIHNTZXNzaW9uLmdldFRyYWNrZWRQcmludGVycygpLmdldCgwKS5nZXRMb2NhbElkKCkpKSk7CkBAIC0yMDUsNyArMzc3LDcgQEAKICAgICAgICAgcnVuT25NYWluVGhyZWFkKCgpIC0+IGFzc2VydEVxdWFscygwLCBzU2Vzc2lvbi5nZXRUcmFja2VkUHJpbnRlcnMoKS5zaXplKCkpKTsKIAogICAgICAgICAvLyBTZWxlY3QgdGhlIGZpcnN0IHByaW50ZXIuCi0gICAgICAgIHNlbGVjdFByaW50ZXIoRklSU1RfUFJJTlRFUl9OQU1FKTsKKyAgICAgICAgc2VsZWN0UHJpbnRlcihGSVJTVF9QUklOVEVSX0xPQ0FMX0lEKTsKIAogICAgICAgICBldmVudHVhbGx5KCgpIC0+IHJ1bk9uTWFpblRocmVhZCgoKSAtPiBhc3NlcnRFcXVhbHMoRklSU1RfUFJJTlRFUl9MT0NBTF9JRCwKICAgICAgICAgICAgICAgICBzU2Vzc2lvbi5nZXRUcmFja2VkUHJpbnRlcnMoKS5nZXQoMCkuZ2V0TG9jYWxJZCgpKSkpOwpAQCAtMjk1LDcgKzQ2Nyw3IEBACiAgICAgICAgIHJ1bk9uTWFpblRocmVhZCgoKSAtPiBhc3NlcnRFcXVhbHMoMCwgc1Nlc3Npb24uZ2V0VHJhY2tlZFByaW50ZXJzKCkuc2l6ZSgpKSk7CiAKICAgICAgICAgLy8gU2VsZWN0IHRoZSBmaXJzdCBwcmludGVyLgotICAgICAgICBzZWxlY3RQcmludGVyKEZJUlNUX1BSSU5URVJfTkFNRSk7CisgICAgICAgIHNlbGVjdFByaW50ZXIoRklSU1RfUFJJTlRFUl9MT0NBTF9JRCk7CiAKICAgICAgICAgZXZlbnR1YWxseSgoKSAtPiBydW5Pbk1haW5UaHJlYWQoKCkgLT4gYXNzZXJ0RXF1YWxzKEZJUlNUX1BSSU5URVJfTE9DQUxfSUQsCiAgICAgICAgICAgICAgICAgc1Nlc3Npb24uZ2V0VHJhY2tlZFByaW50ZXJzKCkuZ2V0KDApLmdldExvY2FsSWQoKSkpKTsKQEAgLTQ5MSwyNyArNjYzLDkgQEAKIAogICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzU2Vzc2lvbi5pc1ByaW50ZXJEaXNjb3ZlcnlTdGFydGVkKCkpOwogCi0gICAgICAgICAgICBpZiAoc1Nlc3Npb24uZ2V0UHJpbnRlcnMoKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBMaXN0PFByaW50ZXJJbmZvPiBwcmludGVycyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICAgICAgYWRkUHJpbnRlcihGSVJTVF9QUklOVEVSX0xPQ0FMX0lELCBmYWxzZSk7CisgICAgICAgICAgICBhZGRQcmludGVyKFNFQ09ORF9QUklOVEVSX0xPQ0FMX0lELCBmYWxzZSk7CiAKLSAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIGZpcnN0IHByaW50ZXIuCi0gICAgICAgICAgICAgICAgUHJpbnRlcklkIGZpcnN0UHJpbnRlcklkID0gc1Nlc3Npb24uZ2V0U2VydmljZSgpLmdlbmVyYXRlUHJpbnRlcklkKAotICAgICAgICAgICAgICAgICAgICAgICAgRklSU1RfUFJJTlRFUl9MT0NBTF9JRCk7Ci0gICAgICAgICAgICAgICAgUHJpbnRlckluZm8gZmlyc3RQcmludGVyID0gbmV3IFByaW50ZXJJbmZvLkJ1aWxkZXIoZmlyc3RQcmludGVySWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBGSVJTVF9QUklOVEVSX05BTUUsIFByaW50ZXJJbmZvLlNUQVRVU19JRExFKQotICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLSAgICAgICAgICAgICAgICBwcmludGVycy5hZGQoZmlyc3RQcmludGVyKTsKLQotICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgZmlyc3QgcHJpbnRlci4KLSAgICAgICAgICAgICAgICBQcmludGVySWQgc2Vjb25kUHJpbnRlcklkID0gc1Nlc3Npb24uZ2V0U2VydmljZSgpLmdlbmVyYXRlUHJpbnRlcklkKAotICAgICAgICAgICAgICAgICAgICAgICAgU0VDT05EX1BSSU5URVJfTE9DQUxfSUQpOwotICAgICAgICAgICAgICAgIFByaW50ZXJJbmZvIHNlY29uZFByaW50ZXIgPSBuZXcgUHJpbnRlckluZm8uQnVpbGRlcihzZWNvbmRQcmludGVySWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBTRUNPTkRfUFJJTlRFUl9OQU1FLCBQcmludGVySW5mby5TVEFUVVNfSURMRSkKLSAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7Ci0gICAgICAgICAgICAgICAgcHJpbnRlcnMuYWRkKHNlY29uZFByaW50ZXIpOwotCi0gICAgICAgICAgICAgICAgc1Nlc3Npb24uYWRkUHJpbnRlcnMocHJpbnRlcnMpOwotICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0sIGludm9jYXRpb24gLT4gewogICAgICAgICAgICAgYXNzZXJ0RmFsc2Uoc1Nlc3Npb24uaXNQcmludGVyRGlzY292ZXJ5U3RhcnRlZCgpKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ByaW50L3NyYy9hbmRyb2lkL3ByaW50L2N0cy9QcmludGVySW5mb1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3ByaW50L3NyYy9hbmRyb2lkL3ByaW50L2N0cy9QcmludGVySW5mb1Rlc3QuamF2YQppbmRleCA5YzVjNmFiLi5kNDg3OTVmIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9wcmludC9zcmMvYW5kcm9pZC9wcmludC9jdHMvUHJpbnRlckluZm9UZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvcHJpbnQvc3JjL2FuZHJvaWQvcHJpbnQvY3RzL1ByaW50ZXJJbmZvVGVzdC5qYXZhCkBAIC0yNywxNiArMjcsMTggQEAKIGltcG9ydCBhbmRyb2lkLnByaW50LlByaW50ZXJDYXBhYmlsaXRpZXNJbmZvOwogaW1wb3J0IGFuZHJvaWQucHJpbnQuUHJpbnRlcklkOwogaW1wb3J0IGFuZHJvaWQucHJpbnQuUHJpbnRlckluZm87Ci1pbXBvcnQgYW5kcm9pZC5wcmludC5jdHMuc2VydmljZXMuRmlyc3RQcmludFNlcnZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5wcmludC5jdHMuc2VydmljZXMuUHJpbnRTZXJ2aWNlQ2FsbGJhY2tzOwotaW1wb3J0IGFuZHJvaWQucHJpbnQuY3RzLnNlcnZpY2VzLlByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uQ2FsbGJhY2tzOwotaW1wb3J0IGFuZHJvaWQucHJpbnQuY3RzLnNlcnZpY2VzLlNlY29uZFByaW50U2VydmljZTsKLWltcG9ydCBhbmRyb2lkLnByaW50LmN0cy5zZXJ2aWNlcy5TdHViYmFibGVQcmludGVyRGlzY292ZXJ5U2Vzc2lvbjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC51aWF1dG9tYXRvci5VaU9iamVjdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC51aWF1dG9tYXRvci5VaVNlbGVjdG9yOworaW1wb3J0IGFuZHJvaWQucHJpbnQudGVzdC5CYXNlUHJpbnRUZXN0OworaW1wb3J0IGFuZHJvaWQucHJpbnQudGVzdC5zZXJ2aWNlcy5GaXJzdFByaW50U2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLnByaW50LnRlc3Quc2VydmljZXMuUHJpbnRTZXJ2aWNlQ2FsbGJhY2tzOworaW1wb3J0IGFuZHJvaWQucHJpbnQudGVzdC5zZXJ2aWNlcy5QcmludGVyRGlzY292ZXJ5U2Vzc2lvbkNhbGxiYWNrczsKK2ltcG9ydCBhbmRyb2lkLnByaW50LnRlc3Quc2VydmljZXMuU2Vjb25kUHJpbnRTZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQucHJpbnQudGVzdC5zZXJ2aWNlcy5TdHViYmFibGVQcmludGVyRGlzY292ZXJ5U2Vzc2lvbjsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC51aWF1dG9tYXRvci5CeTsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC51aWF1dG9tYXRvci5VaU9iamVjdDI7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKQEAgLTM0MSw3ICszNDMsNyBAQAogICAgICAgICB3YWl0Rm9yV3JpdGVBZGFwdGVyQ2FsbGJhY2soMSk7CiAKICAgICAgICAgLy8gT3BlbiBkZXN0aW5hdGlvbiBzcGlubmVyCi0gICAgICAgIFVpT2JqZWN0IGRlc3RpbmF0aW9uU3Bpbm5lciA9IGdldFVpRGV2aWNlKCkuZmluZE9iamVjdChuZXcgVWlTZWxlY3RvcigpLnJlc291cmNlSWQoCisgICAgICAgIFVpT2JqZWN0MiBkZXN0aW5hdGlvblNwaW5uZXIgPSBmaW5kVWlPYmplY3QoQnkucmVzKAogICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5wcmludHNwb29sZXI6aWQvZGVzdGluYXRpb25fc3Bpbm5lciIpKTsKICAgICAgICAgZGVzdGluYXRpb25TcGlubmVyLmNsaWNrKCk7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ByaW50L3NyYy9hbmRyb2lkL3ByaW50L2N0cy9VdGlscy5qYXZhIGIvdGVzdHMvdGVzdHMvcHJpbnQvc3JjL2FuZHJvaWQvcHJpbnQvY3RzL1V0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzZjU2MzIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvdGVzdHMvcHJpbnQvc3JjL2FuZHJvaWQvcHJpbnQvY3RzL1V0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5wcmludC5jdHM7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7Ci1pbXBvcnQgYW5kcm9pZC5wcmludC5QcmludEpvYjsKLWltcG9ydCBhbmRyb2lkLnByaW50LlByaW50TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLS8qKgotICogVXRpbGl0aWVzIGZvciBwcmludCB0ZXN0cwotICovCi1wdWJsaWMgY2xhc3MgVXRpbHMgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIlV0aWxzIjsKLQotICAgIC8qKgotICAgICAqIEEge0BsaW5rIFJ1bm5hYmxlfSB0aGF0IGNhbiB0aHJvdyBhbiB7QGxpbmsgVGhyb3dhYmxlfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIEludm9rYWJsZSB7Ci0gICAgICAgIHZvaWQgcnVuKCkgdGhyb3dzIFRocm93YWJsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSdW4gYSB7QGxpbmsgSW52b2thYmxlfSBhbmQgZXhwZWN0IGFuZCB7QGxpbmsgVGhyb3dhYmxlfSBvZiBhIGNlcnRhaW4gdHlwZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSByICAgICAgICAgICAgIFRoZSB7QGxpbmsgSW52b2thYmxlfSB0byBydW4KLSAgICAgKiBAcGFyYW0gZXhwZWN0ZWRDbGFzcyBUaGUgZXhwZWN0ZWQge0BsaW5rIFRocm93YWJsZX0gdHlwZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRFeGNlcHRpb24oQE5vbk51bGwgSW52b2thYmxlIHIsCi0gICAgICAgICAgICBATm9uTnVsbCBDbGFzczw/IGV4dGVuZHMgVGhyb3dhYmxlPiBleHBlY3RlZENsYXNzKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHIucnVuKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0gICAgICAgICAgICBpZiAoZS5nZXRDbGFzcygpLmlzQXNzaWduYWJsZUZyb20oZXhwZWN0ZWRDbGFzcykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJFeHBlY3RlZDogIiArIGV4cGVjdGVkQ2xhc3MuZ2V0TmFtZSgpICsgIiwgZ290OiAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIk5vIHRocm93YWJsZSB0aHJvd24iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSdW4gYSB7QGxpbmsgSW52b2thYmxlfSBvbiB0aGUgbWFpbiB0aHJlYWQgYW5kIGZvcndhcmQgdGhlIHtAbGluayBUaHJvd2FibGV9IGlmIG9uZSB3YXMKLSAgICAgKiB0aHJvd24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gciBUaGUge0BsaW5rIEludm9rYWJsZX0gdG8gcnVuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIFRocm93YWJsZSBJZiB0aGUge0BsaW5rIFJ1bm5hYmxlfSBjYXVzZWQgYW4gaXNzdWUKLSAgICAgKi8KLSAgICBzdGF0aWMgdm9pZCBydW5Pbk1haW5UaHJlYWQoQE5vbk51bGwgZmluYWwgSW52b2thYmxlIHIpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBmaW5hbCBPYmplY3Qgc3luY2hyb25pemVyID0gbmV3IE9iamVjdCgpOwotICAgICAgICBmaW5hbCBUaHJvd2FibGVbXSB0aHJvd24gPSBuZXcgVGhyb3dhYmxlWzFdOwotCi0gICAgICAgIHN5bmNocm9uaXplZCAoc3luY2hyb25pemVyKSB7Ci0gICAgICAgICAgICAobmV3IEhhbmRsZXIoTG9vcGVyLmdldE1haW5Mb29wZXIoKSkpLnBvc3QoKCkgLT4gewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoc3luY2hyb25pemVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByLnJ1bigpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3duWzBdID0gdDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplci5ub3RpZnkoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLQotICAgICAgICAgICAgc3luY2hyb25pemVyLndhaXQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0aHJvd25bMF0gIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgdGhyb3duWzBdOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWFrZSBzdXJlIHRoYXQgYSB7QGxpbmsgSW52b2thYmxlfSBldmVudHVhbGx5IGZpbmlzaGVzIHdpdGhvdXQgdGhyb3dpbmcgYSB7QGxpbmsgVGhyb3dhYmxlfS4KLSAgICAgKgotICAgICAqIEBwYXJhbSByIFRoZSB7QGxpbmsgSW52b2thYmxlfSB0byBydW4uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGV2ZW50dWFsbHkoQE5vbk51bGwgSW52b2thYmxlIHIpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgci5ydW4oKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQgPCBCYXNlUHJpbnRUZXN0Lk9QRVJBVElPTl9USU1FT1VUX01JTExJUykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiSWdub3JpbmcgZXhjZXB0aW9uIiwgZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCg1MDApOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkludGVycnVwdGVkIiwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgcHJpbnQgam9iCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBwcmludCBqb2IgZm9yIHRoZSBuYW1lCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBJZiBwcmludCBqb2IgY291bGQgbm90IGJlIGZvdW5kCi0gICAgICovCi0gICAgc3RhdGljIEBOb25OdWxsIFByaW50Sm9iIGdldFByaW50Sm9iKEBOb25OdWxsIFByaW50TWFuYWdlciBwbSwgQE5vbk51bGwgU3RyaW5nIG5hbWUpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZm9yIChhbmRyb2lkLnByaW50LlByaW50Sm9iIGpvYiA6IHBtLmdldFByaW50Sm9icygpKSB7Ci0gICAgICAgICAgICBpZiAoam9iLmdldEluZm8oKS5nZXRMYWJlbCgpLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBqb2I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJQcmludCBqb2IgIiArIG5hbWUgKyAiIG5vdCBmb3VuZCBpbiAiICsgcG0uZ2V0UHJpbnRKb2JzKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIHByaW50IG1hbmFnZXIKLSAgICAgKi8KLSAgICBzdGF0aWMgQE5vbk51bGwgUHJpbnRNYW5hZ2VyIGdldFByaW50TWFuYWdlcihATm9uTnVsbCBDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIChQcmludE1hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlBSSU5UX1NFUlZJQ0UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ByaW50L3NyYy9hbmRyb2lkL3ByaW50L2N0cy9zZXJ2aWNlcy9BZGRQcmludGVyc0FjdGl2aXR5LmphdmEgYi90ZXN0cy90ZXN0cy9wcmludC9zcmMvYW5kcm9pZC9wcmludC9jdHMvc2VydmljZXMvQWRkUHJpbnRlcnNBY3Rpdml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzJkNmY5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL3Rlc3RzL3ByaW50L3NyYy9hbmRyb2lkL3ByaW50L2N0cy9zZXJ2aWNlcy9BZGRQcmludGVyc0FjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnByaW50LmN0cy5zZXJ2aWNlczsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgQWRkUHJpbnRlcnNBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9wcmludC9zcmMvYW5kcm9pZC9wcmludC9jdHMvc2VydmljZXMvQ3VzdG9tUHJpbnRPcHRpb25zQWN0aXZpdHkuamF2YSBiL3Rlc3RzL3Rlc3RzL3ByaW50L3NyYy9hbmRyb2lkL3ByaW50L2N0cy9zZXJ2aWNlcy9DdXN0b21QcmludE9wdGlvbnNBY3Rpdml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjUyZWNlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL3Rlc3RzL3ByaW50L3NyYy9hbmRyb2lkL3ByaW50L2N0cy9zZXJ2aWNlcy9DdXN0b21QcmludE9wdGlvbnNBY3Rpdml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5wcmludC5jdHMuc2VydmljZXM7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQucHJpbnQuUHJpbnRKb2JJbmZvOwotaW1wb3J0IGFuZHJvaWQucHJpbnQuUHJpbnRlckluZm87Ci1pbXBvcnQgYW5kcm9pZC5wcmludHNlcnZpY2UuUHJpbnRTZXJ2aWNlOwotCi0vKioKLSAqIEN1c3RvbSBwcmludCBvcHRpb25zIGFjdGl2aXR5IGZvciBib3RoIHByaW50IHNlcnZpY2VzCi0gKi8KLXB1YmxpYyBjbGFzcyBDdXN0b21QcmludE9wdGlvbnNBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKLSAgICAvKiogTG9jayBmb3Ige0BsaW5rICNzQ2FsbGJhY2t9ICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IHNMb2NrID0gbmV3IE9iamVjdCgpOwotCi0gICAgLyoqIEN1cnJlbnRseSByZWdpc3RlcmVkIGNhbGxiYWNrIGZvciBfYm90aF8gZmlyc3QgYW5kIHNlY29uZCBwcmludCBzZXJ2aWNlLiAqLwotICAgIHByaXZhdGUgc3RhdGljIEN1c3RvbVByaW50T3B0aW9uc0NhbGxiYWNrIHNDYWxsYmFjayA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgYSBuZXcgY2FsbGJhY2sgY2FsbGVkIHdoZW4gdGhlIGN1c3RvbSBvcHRpb25zIGFjdGl2aXR5IGlzIGxhdW5jaGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBuZXcgY2FsbGJhY2sgb3IgbnVsbCwgaWYgdGhlIGNhbGxiYWNrIHNob3VsZCBiZSB1bnJlZ2lzdGVyZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldENhbGxCYWNrKEN1c3RvbVByaW50T3B0aW9uc0NhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoc0xvY2spIHsKLSAgICAgICAgICAgIHNDYWxsYmFjayA9IGNhbGxiYWNrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGJhY2sgZXhlY3V0ZWQgZm9yIHRoaXMgYWN0aXZpdHkuIFNldCB2aWEge0BsaW5rICNzZXRDYWxsQmFja30uCi0gICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBDdXN0b21QcmludE9wdGlvbnNDYWxsYmFjayB7Ci0gICAgICAgIFByaW50Sm9iSW5mbyBleGVjdXRlQ3VzdG9tUHJpbnRPcHRpb25zQWN0aXZpdHkoUHJpbnRKb2JJbmZvIHByaW50Sm9iLAotICAgICAgICAgICAgICAgIFByaW50ZXJJbmZvIHByaW50ZXIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLQotICAgICAgICBJbnRlbnQgcmVzdWx0ID0gbmV3IEludGVudCgpOwotCi0gICAgICAgIHN5bmNocm9uaXplZCAoc0xvY2spIHsKLSAgICAgICAgICAgIGlmIChzQ2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFByaW50Sm9iSW5mbyBwcmludEpvYkluZm8gPSBnZXRJbnRlbnQoKS5nZXRQYXJjZWxhYmxlRXh0cmEoCi0gICAgICAgICAgICAgICAgICAgICAgICBQcmludFNlcnZpY2UuRVhUUkFfUFJJTlRfSk9CX0lORk8pOwotICAgICAgICAgICAgICAgIFByaW50ZXJJbmZvIHByaW50ZXJJbmZvID0gZ2V0SW50ZW50KCkuZ2V0UGFyY2VsYWJsZUV4dHJhKAotICAgICAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQuaW50ZW50LmV4dHJhLnByaW50LkVYVFJBX1BSSU5URVJfSU5GTyIpOwotCi0gICAgICAgICAgICAgICAgcmVzdWx0LnB1dEV4dHJhKFByaW50U2VydmljZS5FWFRSQV9QUklOVF9KT0JfSU5GTywKLSAgICAgICAgICAgICAgICAgICAgICAgIHNDYWxsYmFjay5leGVjdXRlQ3VzdG9tUHJpbnRPcHRpb25zQWN0aXZpdHkocHJpbnRKb2JJbmZvLCBwcmludGVySW5mbykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgc2V0UmVzdWx0KEFjdGl2aXR5LlJFU1VMVF9PSywgcmVzdWx0KTsKLSAgICAgICAgZmluaXNoKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcHJpbnQvc3JjL2FuZHJvaWQvcHJpbnQvY3RzL3NlcnZpY2VzL0ZpcnN0UHJpbnRTZXJ2aWNlLmphdmEgYi90ZXN0cy90ZXN0cy9wcmludC9zcmMvYW5kcm9pZC9wcmludC9jdHMvc2VydmljZXMvRmlyc3RQcmludFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIzNGRlNC4uMDAwMDAwMAotLS0gYS90ZXN0cy90ZXN0cy9wcmludC9zcmMvYW5kcm9pZC9wcmludC9jdHMvc2VydmljZXMvRmlyc3RQcmludFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQucHJpbnQuY3RzLnNlcnZpY2VzOwotCi1wdWJsaWMgY2xhc3MgRmlyc3RQcmludFNlcnZpY2UgZXh0ZW5kcyBTdHViYmFibGVQcmludFNlcnZpY2UgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IHNMb2NrID0gbmV3IE9iamVjdCgpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgUHJpbnRTZXJ2aWNlQ2FsbGJhY2tzIHNDYWxsYmFja3M7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q2FsbGJhY2tzKFByaW50U2VydmljZUNhbGxiYWNrcyBjYWxsYmFja3MpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChzTG9jaykgewotICAgICAgICAgICAgc0NhbGxiYWNrcyA9IGNhbGxiYWNrczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBQcmludFNlcnZpY2VDYWxsYmFja3MgZ2V0Q2FsbGJhY2tzKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKHNMb2NrKSB7Ci0gICAgICAgICAgICBpZiAoc0NhbGxiYWNrcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc0NhbGxiYWNrcy5zZXRTZXJ2aWNlKHRoaXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHNDYWxsYmFja3M7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9wcmludC9zcmMvYW5kcm9pZC9wcmludC9jdHMvc2VydmljZXMvSW5mb0FjdGl2aXR5LmphdmEgYi90ZXN0cy90ZXN0cy9wcmludC9zcmMvYW5kcm9pZC9wcmludC9jdHMvc2VydmljZXMvSW5mb0FjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyYzFiYjUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvdGVzdHMvcHJpbnQvc3JjL2FuZHJvaWQvcHJpbnQvY3RzL3NlcnZpY2VzL0luZm9BY3Rpdml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5wcmludC5jdHMuc2VydmljZXM7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk9ic2VydmFibGU7Ci0KLXB1YmxpYyBjbGFzcyBJbmZvQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7Ci0gICAgcHVibGljIGludGVyZmFjZSBPYnNlcnZlciB7Ci0gICAgICAgIHZvaWQgb25DcmVhdGUoQWN0aXZpdHkgY3JlYXRlZEFjdGl2aXR5KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBcnJheUxpc3Q8T2JzZXJ2ZXI+IHNPYnNlcnZlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRPYnNlcnZlcihPYnNlcnZlciBvYnNlcnZlcikgewotICAgICAgICBzeW5jaHJvbml6ZWQgKHNPYnNlcnZlcnMpIHsKLSAgICAgICAgICAgIHNPYnNlcnZlcnMuYWRkKG9ic2VydmVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhck9ic2VydmVycygpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChzT2JzZXJ2ZXJzKSB7Ci0gICAgICAgICAgICBzT2JzZXJ2ZXJzLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7Ci0gICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChzT2JzZXJ2ZXJzKSB7Ci0gICAgICAgICAgICBBcnJheUxpc3Q8T2JzZXJ2ZXI+IG9ic2VydmVycyA9IChBcnJheUxpc3Q8T2JzZXJ2ZXI+KSBzT2JzZXJ2ZXJzLmNsb25lKCk7Ci0KLSAgICAgICAgICAgIGZvciAoT2JzZXJ2ZXIgb2JzZXJ2ZXIgOiBvYnNlcnZlcnMpIHsKLSAgICAgICAgICAgICAgICBvYnNlcnZlci5vbkNyZWF0ZSh0aGlzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ByaW50L3NyYy9hbmRyb2lkL3ByaW50L2N0cy9zZXJ2aWNlcy9QcmludFNlcnZpY2VDYWxsYmFja3MuamF2YSBiL3Rlc3RzL3Rlc3RzL3ByaW50L3NyYy9hbmRyb2lkL3ByaW50L2N0cy9zZXJ2aWNlcy9QcmludFNlcnZpY2VDYWxsYmFja3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ5ZThhOS4uMDAwMDAwMAotLS0gYS90ZXN0cy90ZXN0cy9wcmludC9zcmMvYW5kcm9pZC9wcmludC9jdHMvc2VydmljZXMvUHJpbnRTZXJ2aWNlQ2FsbGJhY2tzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnByaW50LmN0cy5zZXJ2aWNlczsKLQotaW1wb3J0IGFuZHJvaWQucHJpbnRzZXJ2aWNlLlByaW50Sm9iOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJpbnRTZXJ2aWNlQ2FsbGJhY2tzIHsKLQotICAgIHByaXZhdGUgU3R1YmJhYmxlUHJpbnRTZXJ2aWNlIG1TZXJ2aWNlOwotCi0gICAgcHVibGljIFN0dWJiYWJsZVByaW50U2VydmljZSBnZXRTZXJ2aWNlKCkgewotICAgICAgICByZXR1cm4gbVNlcnZpY2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmljZShTdHViYmFibGVQcmludFNlcnZpY2Ugc2VydmljZSkgewotICAgICAgICBtU2VydmljZSA9IHNlcnZpY2U7Ci0gICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IFByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uQ2FsbGJhY2tzIG9uQ3JlYXRlUHJpbnRlckRpc2NvdmVyeVNlc3Npb25DYWxsYmFja3MoKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uUmVxdWVzdENhbmNlbFByaW50Sm9iKFByaW50Sm9iIHByaW50Sm9iKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uUHJpbnRKb2JRdWV1ZWQoUHJpbnRKb2IgcHJpbnRKb2IpOwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcHJpbnQvc3JjL2FuZHJvaWQvcHJpbnQvY3RzL3NlcnZpY2VzL1ByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uQ2FsbGJhY2tzLmphdmEgYi90ZXN0cy90ZXN0cy9wcmludC9zcmMvYW5kcm9pZC9wcmludC9jdHMvc2VydmljZXMvUHJpbnRlckRpc2NvdmVyeVNlc3Npb25DYWxsYmFja3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJkZGRhMS4uMDAwMDAwMAotLS0gYS90ZXN0cy90ZXN0cy9wcmludC9zcmMvYW5kcm9pZC9wcmludC9jdHMvc2VydmljZXMvUHJpbnRlckRpc2NvdmVyeVNlc3Npb25DYWxsYmFja3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQucHJpbnQuY3RzLnNlcnZpY2VzOwotCi1pbXBvcnQgYW5kcm9pZC5vcy5DYW5jZWxsYXRpb25TaWduYWw7Ci1pbXBvcnQgYW5kcm9pZC5wcmludC5QcmludGVySWQ7Ci1pbXBvcnQgYW5kcm9pZC5wcmludHNlcnZpY2UuQ3VzdG9tUHJpbnRlckljb25DYWxsYmFjazsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJpbnRlckRpc2NvdmVyeVNlc3Npb25DYWxsYmFja3MgewotCi0gICAgcHJpdmF0ZSBTdHViYmFibGVQcmludGVyRGlzY292ZXJ5U2Vzc2lvbiBtU2Vzc2lvbjsKLQotICAgIHB1YmxpYyB2b2lkIHNldFNlc3Npb24oU3R1YmJhYmxlUHJpbnRlckRpc2NvdmVyeVNlc3Npb24gc2Vzc2lvbikgewotICAgICAgICBtU2Vzc2lvbiA9IHNlc3Npb247Ci0gICAgfQotCi0gICAgcHVibGljIFN0dWJiYWJsZVByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uIGdldFNlc3Npb24oKSB7Ci0gICAgICAgIHJldHVybiBtU2Vzc2lvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBvblN0YXJ0UHJpbnRlckRpc2NvdmVyeShMaXN0PFByaW50ZXJJZD4gcHJpb3JpdHlMaXN0KTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uU3RvcFByaW50ZXJEaXNjb3ZlcnkoKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uVmFsaWRhdGVQcmludGVycyhMaXN0PFByaW50ZXJJZD4gcHJpbnRlcklkcyk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBvblN0YXJ0UHJpbnRlclN0YXRlVHJhY2tpbmcoUHJpbnRlcklkIHByaW50ZXJJZCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBvblJlcXVlc3RDdXN0b21QcmludGVySWNvbihQcmludGVySWQgcHJpbnRlcklkLAotICAgICAgICAgICAgQ2FuY2VsbGF0aW9uU2lnbmFsIGNhbmNlbGxhdGlvblNpZ25hbCwgQ3VzdG9tUHJpbnRlckljb25DYWxsYmFjayBjYWxsYmFjayk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBvblN0b3BQcmludGVyU3RhdGVUcmFja2luZyhQcmludGVySWQgcHJpbnRlcklkKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uRGVzdHJveSgpOwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcHJpbnQvc3JjL2FuZHJvaWQvcHJpbnQvY3RzL3NlcnZpY2VzL1NlY29uZFByaW50U2VydmljZS5qYXZhIGIvdGVzdHMvdGVzdHMvcHJpbnQvc3JjL2FuZHJvaWQvcHJpbnQvY3RzL3NlcnZpY2VzL1NlY29uZFByaW50U2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDI5YThlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL3Rlc3RzL3ByaW50L3NyYy9hbmRyb2lkL3ByaW50L2N0cy9zZXJ2aWNlcy9TZWNvbmRQcmludFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQucHJpbnQuY3RzLnNlcnZpY2VzOwotCi1wdWJsaWMgY2xhc3MgU2Vjb25kUHJpbnRTZXJ2aWNlIGV4dGVuZHMgU3R1YmJhYmxlUHJpbnRTZXJ2aWNlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBzTG9jayA9IG5ldyBPYmplY3QoKTsKLQotICAgIHByaXZhdGUgc3RhdGljIFByaW50U2VydmljZUNhbGxiYWNrcyBzQ2FsbGJhY2tzOwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldENhbGxiYWNrcyhQcmludFNlcnZpY2VDYWxsYmFja3MgY2FsbGJhY2tzKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoc0xvY2spIHsKLSAgICAgICAgICAgIHNDYWxsYmFja3MgPSBjYWxsYmFja3M7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgUHJpbnRTZXJ2aWNlQ2FsbGJhY2tzIGdldENhbGxiYWNrcygpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChzTG9jaykgewotICAgICAgICAgICAgaWYgKHNDYWxsYmFja3MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNDYWxsYmFja3Muc2V0U2VydmljZSh0aGlzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzQ2FsbGJhY2tzOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcHJpbnQvc3JjL2FuZHJvaWQvcHJpbnQvY3RzL3NlcnZpY2VzL1NldHRpbmdzQWN0aXZpdHkuamF2YSBiL3Rlc3RzL3Rlc3RzL3ByaW50L3NyYy9hbmRyb2lkL3ByaW50L2N0cy9zZXJ2aWNlcy9TZXR0aW5nc0FjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMjM1NzQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvdGVzdHMvcHJpbnQvc3JjL2FuZHJvaWQvcHJpbnQvY3RzL3NlcnZpY2VzL1NldHRpbmdzQWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQucHJpbnQuY3RzLnNlcnZpY2VzOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBTZXR0aW5nc0FjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ByaW50L3NyYy9hbmRyb2lkL3ByaW50L2N0cy9zZXJ2aWNlcy9TdHViYmFibGVQcmludFNlcnZpY2UuamF2YSBiL3Rlc3RzL3Rlc3RzL3ByaW50L3NyYy9hbmRyb2lkL3ByaW50L2N0cy9zZXJ2aWNlcy9TdHViYmFibGVQcmludFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMzYjg5Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy90ZXN0cy9wcmludC9zcmMvYW5kcm9pZC9wcmludC9jdHMvc2VydmljZXMvU3R1YmJhYmxlUHJpbnRTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnByaW50LmN0cy5zZXJ2aWNlczsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQucHJpbnRzZXJ2aWNlLlByaW50Sm9iOwotaW1wb3J0IGFuZHJvaWQucHJpbnRzZXJ2aWNlLlByaW50U2VydmljZTsKLWltcG9ydCBhbmRyb2lkLnByaW50c2VydmljZS5QcmludGVyRGlzY292ZXJ5U2Vzc2lvbjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3R1YmJhYmxlUHJpbnRTZXJ2aWNlIGV4dGVuZHMgUHJpbnRTZXJ2aWNlIHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBQcmludGVyRGlzY292ZXJ5U2Vzc2lvbiBvbkNyZWF0ZVByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uKCkgewotICAgICAgICBQcmludFNlcnZpY2VDYWxsYmFja3MgY2FsbGJhY2tzID0gZ2V0Q2FsbGJhY2tzKCk7Ci0gICAgICAgIGlmIChjYWxsYmFja3MgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHViYmFibGVQcmludGVyRGlzY292ZXJ5U2Vzc2lvbih0aGlzLAotICAgICAgICAgICAgICAgICAgICBnZXRDYWxsYmFja3MoKS5vbkNyZWF0ZVByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uQ2FsbGJhY2tzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uUmVxdWVzdENhbmNlbFByaW50Sm9iKFByaW50Sm9iIHByaW50Sm9iKSB7Ci0gICAgICAgIFByaW50U2VydmljZUNhbGxiYWNrcyBjYWxsYmFja3MgPSBnZXRDYWxsYmFja3MoKTsKLSAgICAgICAgaWYgKGNhbGxiYWNrcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjYWxsYmFja3Mub25SZXF1ZXN0Q2FuY2VsUHJpbnRKb2IocHJpbnRKb2IpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25QcmludEpvYlF1ZXVlZChQcmludEpvYiBwcmludEpvYikgewotICAgICAgICBQcmludFNlcnZpY2VDYWxsYmFja3MgY2FsbGJhY2tzID0gZ2V0Q2FsbGJhY2tzKCk7Ci0gICAgICAgIGlmIChjYWxsYmFja3MgIT0gbnVsbCkgewotICAgICAgICAgICAgY2FsbGJhY2tzLm9uUHJpbnRKb2JRdWV1ZWQocHJpbnRKb2IpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFByaW50U2VydmljZUNhbGxiYWNrcyBnZXRDYWxsYmFja3MoKTsKLQotICAgIHB1YmxpYyB2b2lkIGNhbGxBdHRhY2hCYXNlQ29udGV4dChDb250ZXh0IGJhc2UpIHsKLSAgICAgICAgYXR0YWNoQmFzZUNvbnRleHQoYmFzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8UHJpbnRKb2I+IGNhbGxHZXRBY3RpdmVQcmludEpvYnMoKSB7Ci0gICAgICAgIHJldHVybiBnZXRBY3RpdmVQcmludEpvYnMoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ByaW50L3NyYy9hbmRyb2lkL3ByaW50L2N0cy9zZXJ2aWNlcy9TdHViYmFibGVQcmludGVyRGlzY292ZXJ5U2Vzc2lvbi5qYXZhIGIvdGVzdHMvdGVzdHMvcHJpbnQvc3JjL2FuZHJvaWQvcHJpbnQvY3RzL3NlcnZpY2VzL1N0dWJiYWJsZVByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwZWMxYzEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvdGVzdHMvcHJpbnQvc3JjL2FuZHJvaWQvcHJpbnQvY3RzL3NlcnZpY2VzL1N0dWJiYWJsZVByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnByaW50LmN0cy5zZXJ2aWNlczsKLQotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC5vcy5DYW5jZWxsYXRpb25TaWduYWw7Ci1pbXBvcnQgYW5kcm9pZC5wcmludC5QcmludGVySWQ7Ci1pbXBvcnQgYW5kcm9pZC5wcmludHNlcnZpY2UuQ3VzdG9tUHJpbnRlckljb25DYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLnByaW50c2VydmljZS5QcmludFNlcnZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5wcmludHNlcnZpY2UuUHJpbnRlckRpc2NvdmVyeVNlc3Npb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIFN0dWJiYWJsZVByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uIGV4dGVuZHMgUHJpbnRlckRpc2NvdmVyeVNlc3Npb24gewotICAgIHByaXZhdGUgZmluYWwgUHJpbnRTZXJ2aWNlIG1TZXJ2aWNlOwotICAgIHByaXZhdGUgZmluYWwgUHJpbnRlckRpc2NvdmVyeVNlc3Npb25DYWxsYmFja3MgbUNhbGxiYWNrczsKLQotICAgIHB1YmxpYyBTdHViYmFibGVQcmludGVyRGlzY292ZXJ5U2Vzc2lvbihQcmludFNlcnZpY2Ugc2VydmljZSwKLSAgICAgICAgICAgIFByaW50ZXJEaXNjb3ZlcnlTZXNzaW9uQ2FsbGJhY2tzIGNhbGxiYWNrcykgewotICAgICAgICBtU2VydmljZSA9IHNlcnZpY2U7Ci0gICAgICAgIG1DYWxsYmFja3MgPSBjYWxsYmFja3M7Ci0gICAgICAgIGlmIChtQ2FsbGJhY2tzICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DYWxsYmFja3Muc2V0U2Vzc2lvbih0aGlzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBQcmludFNlcnZpY2UgZ2V0U2VydmljZSgpIHsKLSAgICAgICAgcmV0dXJuIG1TZXJ2aWNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRQcmludGVyRGlzY292ZXJ5KEBOb25OdWxsIExpc3Q8UHJpbnRlcklkPiBwcmlvcml0eUxpc3QpIHsKLSAgICAgICAgaWYgKG1DYWxsYmFja3MgIT0gbnVsbCkgewotICAgICAgICAgICAgbUNhbGxiYWNrcy5vblN0YXJ0UHJpbnRlckRpc2NvdmVyeShwcmlvcml0eUxpc3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TdG9wUHJpbnRlckRpc2NvdmVyeSgpIHsKLSAgICAgICAgaWYgKG1DYWxsYmFja3MgIT0gbnVsbCkgewotICAgICAgICAgICAgbUNhbGxiYWNrcy5vblN0b3BQcmludGVyRGlzY292ZXJ5KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblZhbGlkYXRlUHJpbnRlcnMoQE5vbk51bGwgTGlzdDxQcmludGVySWQ+IHByaW50ZXJJZHMpIHsKLSAgICAgICAgaWYgKG1DYWxsYmFja3MgIT0gbnVsbCkgewotICAgICAgICAgICAgbUNhbGxiYWNrcy5vblZhbGlkYXRlUHJpbnRlcnMocHJpbnRlcklkcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblN0YXJ0UHJpbnRlclN0YXRlVHJhY2tpbmcoQE5vbk51bGwgUHJpbnRlcklkIHByaW50ZXJJZCkgewotICAgICAgICBpZiAobUNhbGxiYWNrcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2tzLm9uU3RhcnRQcmludGVyU3RhdGVUcmFja2luZyhwcmludGVySWQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25SZXF1ZXN0Q3VzdG9tUHJpbnRlckljb24oQE5vbk51bGwgUHJpbnRlcklkIHByaW50ZXJJZCwKLSAgICAgICAgICAgIEBOb25OdWxsIENhbmNlbGxhdGlvblNpZ25hbCBjYW5jZWxsYXRpb25TaWduYWwsCi0gICAgICAgICAgICBATm9uTnVsbCBDdXN0b21QcmludGVySWNvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIGlmIChtQ2FsbGJhY2tzICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DYWxsYmFja3Mub25SZXF1ZXN0Q3VzdG9tUHJpbnRlckljb24ocHJpbnRlcklkLCBjYW5jZWxsYXRpb25TaWduYWwsIGNhbGxiYWNrKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU3RvcFByaW50ZXJTdGF0ZVRyYWNraW5nKEBOb25OdWxsIFByaW50ZXJJZCBwcmludGVySWQpIHsKLSAgICAgICAgaWYgKG1DYWxsYmFja3MgIT0gbnVsbCkgewotICAgICAgICAgICAgbUNhbGxiYWNrcy5vblN0b3BQcmludGVyU3RhdGVUcmFja2luZyhwcmludGVySWQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25EZXN0cm95KCkgewotICAgICAgICBpZiAobUNhbGxiYWNrcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2tzLm9uRGVzdHJveSgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcHJpbnQvc3JjL2FuZHJvaWQvcHJpbnQvcGRmL2N0cy9QcmludGVkUGRmRG9jdW1lbnRUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9wcmludC9zcmMvYW5kcm9pZC9wcmludC9wZGYvY3RzL1ByaW50ZWRQZGZEb2N1bWVudFRlc3QuamF2YQppbmRleCAzNDRiY2ZjLi5kNzU4NDM5IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9wcmludC9zcmMvYW5kcm9pZC9wcmludC9wZGYvY3RzL1ByaW50ZWRQZGZEb2N1bWVudFRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9wcmludC9zcmMvYW5kcm9pZC9wcmludC9wZGYvY3RzL1ByaW50ZWRQZGZEb2N1bWVudFRlc3QuamF2YQpAQCAtMTYsMjAgKzE2LDIzIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5wcmludC5wZGYuY3RzOwogCitpbXBvcnQgc3RhdGljIGFuZHJvaWQucHJpbnQudGVzdC5VdGlscy5hc3NlcnRFeGNlcHRpb247CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5wZGYuUGRmRG9jdW1lbnQ7CiBpbXBvcnQgYW5kcm9pZC5wcmludC5QcmludEF0dHJpYnV0ZXM7CiBpbXBvcnQgYW5kcm9pZC5wcmludC5wZGYuUHJpbnRlZFBkZkRvY3VtZW50OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIAotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnByaW50LmN0cy5VdGlscy5hc3NlcnRFeGNlcHRpb247Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotCiAvKioKICAqIFRlc3RzIHtAbGluayBQcmludGVkUGRmRG9jdW1lbnR9LiBUaGlzIGNsYXNzIGlzIGEgc3ViY2xhc3Mgb2Yge0BsaW5rIFBkZkRvY3VtZW50fSwgaGVuY2Ugb25seSB0aGUKICAqIG92ZXJyaWRkZW4gbWV0aG9kcyBhcmUgdGVzdGVkLgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcHJvdG8vQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL3Byb3RvL0FuZHJvaWQubWsKaW5kZXggZjRmY2VhMi4uZTkzN2UwYyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvcHJvdG8vQW5kcm9pZC5taworKysgYi90ZXN0cy90ZXN0cy9wcm90by9BbmRyb2lkLm1rCkBAIC0zMyw5ICszMywxMCBAQAogTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKIAogI0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKLUxPQ0FMX0pBVkFfTElCUkFSSUVTICs9IGFuZHJvaWQudGVzdC5ydW5uZXIKK0xPQ0FMX1BSSVZBVEVfUExBVEZPUk1fQVBJUyA6PSB0cnVlCitMT0NBTF9KQVZBX0xJQlJBUklFUyArPSBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzCiAKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCi0gICAgICAgIGN0c3Rlc3RydW5uZXIKKyAgICAgICAgY3RzdGVzdHJ1bm5lci1heHQKIAogaW5jbHVkZSAkKEJVSUxEX0NUU19QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcHJvdG8vQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL3Byb3RvL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggYjhhZjVkMC4uMjA4OTdjYyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvcHJvdG8vQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9wcm90by9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yNSw3ICsyNSw3IEBACiAKICAgICA8L2FwcGxpY2F0aW9uPgogCi0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC51dGlsLnByb3RvLmN0cyIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBvZiBhbmRyb2lkLnV0aWwucHJvdG8iPgogICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0ibGlzdGVuZXIiCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9wcm90by9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy90ZXN0cy9wcm90by9BbmRyb2lkVGVzdC54bWwKaW5kZXggMDI1ZmMyNi4uMDVkZjU0MyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvcHJvdG8vQW5kcm9pZFRlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL3Byb3RvL0FuZHJvaWRUZXN0LnhtbApAQCAtMTQsNiArMTQsNyBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZ3VyYXRpb24gZm9yIFByb3RvIFRlc3RzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0ibWV0cmljcyIgLz4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcHJvdG8vc3JjL2FuZHJvaWQvdXRpbC9wcm90by9jdHMvUHJvdG9PdXRwdXRTdHJlYW1PYmplY3RUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9wcm90by9zcmMvYW5kcm9pZC91dGlsL3Byb3RvL2N0cy9Qcm90b091dHB1dFN0cmVhbU9iamVjdFRlc3QuamF2YQppbmRleCBmYjIzNjA3Li44MTc4YjQ2IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9wcm90by9zcmMvYW5kcm9pZC91dGlsL3Byb3RvL2N0cy9Qcm90b091dHB1dFN0cmVhbU9iamVjdFRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9wcm90by9zcmMvYW5kcm9pZC91dGlsL3Byb3RvL2N0cy9Qcm90b091dHB1dFN0cmVhbU9iamVjdFRlc3QuamF2YQpAQCAtNzksNyArNzksNyBAQAogICAgICAgICBmaW5hbCBQcm90b091dHB1dFN0cmVhbSBwbyA9IG5ldyBQcm90b091dHB1dFN0cmVhbShjaHVua1NpemUpOwogCiAgICAgICAgIGxvbmcgdG9rZW4gPSBwby5zdGFydE9iamVjdChQcm90b091dHB1dFN0cmVhbS5tYWtlRmllbGRJZCgxLAotICAgICAgICAgICAgICAgICAgICBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9DT1VOVF9TSU5HTEUgfCBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9UWVBFX09CSkVDVCkpOworICAgICAgICAgICAgICAgICAgICBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9DT1VOVF9TSU5HTEUgfCBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9UWVBFX01FU1NBR0UpKTsKICAgICAgICAgcG8ud3JpdGVVSW50MzIoUHJvdG9PdXRwdXRTdHJlYW0ubWFrZUZpZWxkSWQoMiwKICAgICAgICAgICAgICAgICAgICAgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfQ09VTlRfU0lOR0xFIHwgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfVFlQRV9VSU5UMzIpLAogICAgICAgICAgICAgICAgICdiJyk7CkBAIC0xMDYsNyArMTA2LDcgQEAKICAgICAgICAgZmluYWwgUHJvdG9PdXRwdXRTdHJlYW0gcG8gPSBuZXcgUHJvdG9PdXRwdXRTdHJlYW0oY2h1bmtTaXplKTsKIAogICAgICAgICBsb25nIHRva2VuID0gcG8uc3RhcnRPYmplY3QoUHJvdG9PdXRwdXRTdHJlYW0ubWFrZUZpZWxkSWQoMSwKLSAgICAgICAgICAgICAgICAgICAgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfQ09VTlRfU0lOR0xFIHwgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfVFlQRV9PQkpFQ1QpKTsKKyAgICAgICAgICAgICAgICAgICAgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfQ09VTlRfU0lOR0xFIHwgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfVFlQRV9NRVNTQUdFKSk7CiAgICAgICAgIHBvLndyaXRlVUludDMyKFByb3RvT3V0cHV0U3RyZWFtLm1ha2VGaWVsZElkKDUwMDAsCiAgICAgICAgICAgICAgICAgICAgIFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX0NPVU5UX1NJTkdMRSB8IFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX1RZUEVfVUlOVDMyKSwKICAgICAgICAgICAgICAgICAnXHUzMTEwJyk7CkBAIC0xMzgsNyArMTM4LDcgQEAKICAgICAgICAgICAgICAgICAnYScpOwogCiAgICAgICAgIGxvbmcgdG9rZW4gPSBwby5zdGFydE9iamVjdChQcm90b091dHB1dFN0cmVhbS5tYWtlRmllbGRJZCgyLAotICAgICAgICAgICAgICAgICAgICBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9DT1VOVF9TSU5HTEUgfCBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9UWVBFX09CSkVDVCkpOworICAgICAgICAgICAgICAgICAgICBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9DT1VOVF9TSU5HTEUgfCBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9UWVBFX01FU1NBR0UpKTsKICAgICAgICAgcG8ud3JpdGVVSW50MzIoUHJvdG9PdXRwdXRTdHJlYW0ubWFrZUZpZWxkSWQoMywKICAgICAgICAgICAgICAgICAgICAgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfQ09VTlRfU0lOR0xFIHwgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfVFlQRV9VSU5UMzIpLAogICAgICAgICAgICAgICAgICdiJyk7CkBAIC0xNzcsNyArMTc3LDcgQEAKICAgICAgICAgZmluYWwgUHJvdG9PdXRwdXRTdHJlYW0gcG8gPSBuZXcgUHJvdG9PdXRwdXRTdHJlYW0oY2h1bmtTaXplKTsKIAogICAgICAgICBsb25nIHRva2VuID0gcG8uc3RhcnRPYmplY3QoUHJvdG9PdXRwdXRTdHJlYW0ubWFrZUZpZWxkSWQoMSwKLSAgICAgICAgICAgICAgICAgICAgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfQ09VTlRfU0lOR0xFIHwgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfVFlQRV9PQkpFQ1QpKTsKKyAgICAgICAgICAgICAgICAgICAgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfQ09VTlRfU0lOR0xFIHwgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfVFlQRV9NRVNTQUdFKSk7CiAgICAgICAgIHBvLmVuZE9iamVjdCh0b2tlbik7CiAKICAgICAgICAgQXNzZXJ0LmFzc2VydEFycmF5RXF1YWxzKG5ldyBieXRlWzBdLCBwby5nZXRCeXRlcygpKTsKQEAgLTE5OSwxMSArMTk5LDExIEBACiAgICAgICAgIGZpbmFsIFByb3RvT3V0cHV0U3RyZWFtIHBvID0gbmV3IFByb3RvT3V0cHV0U3RyZWFtKGNodW5rU2l6ZSk7CiAKICAgICAgICAgbG9uZyB0b2tlbjEgPSBwby5zdGFydE9iamVjdChQcm90b091dHB1dFN0cmVhbS5tYWtlRmllbGRJZCgxLAotICAgICAgICAgICAgICAgICAgICBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9DT1VOVF9TSU5HTEUgfCBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9UWVBFX09CSkVDVCkpOworICAgICAgICAgICAgICAgICAgICBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9DT1VOVF9TSU5HTEUgfCBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9UWVBFX01FU1NBR0UpKTsKICAgICAgICAgbG9uZyB0b2tlbjIgPSBwby5zdGFydE9iamVjdChQcm90b091dHB1dFN0cmVhbS5tYWtlRmllbGRJZCgyLAotICAgICAgICAgICAgICAgICAgICBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9DT1VOVF9TSU5HTEUgfCBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9UWVBFX09CSkVDVCkpOworICAgICAgICAgICAgICAgICAgICBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9DT1VOVF9TSU5HTEUgfCBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9UWVBFX01FU1NBR0UpKTsKICAgICAgICAgbG9uZyB0b2tlbjMgPSBwby5zdGFydE9iamVjdChQcm90b091dHB1dFN0cmVhbS5tYWtlRmllbGRJZCgzLAotICAgICAgICAgICAgICAgICAgICBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9DT1VOVF9TSU5HTEUgfCBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9UWVBFX09CSkVDVCkpOworICAgICAgICAgICAgICAgICAgICBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9DT1VOVF9TSU5HTEUgfCBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9UWVBFX01FU1NBR0UpKTsKICAgICAgICAgcG8uZW5kT2JqZWN0KHRva2VuMyk7CiAgICAgICAgIHBvLmVuZE9iamVjdCh0b2tlbjIpOwogICAgICAgICBwby5lbmRPYmplY3QodG9rZW4xKTsKQEAgLTIzMSw3ICsyMzEsNyBAQAogICAgICAgICAgICAgICAgICdhJyk7CiAKICAgICAgICAgbG9uZyB0b2tlbiA9IHBvLnN0YXJ0T2JqZWN0KFByb3RvT3V0cHV0U3RyZWFtLm1ha2VGaWVsZElkKDIsCi0gICAgICAgICAgICAgICAgICAgIFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX0NPVU5UX1NJTkdMRSB8IFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX1RZUEVfT0JKRUNUKSk7CisgICAgICAgICAgICAgICAgICAgIFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX0NPVU5UX1NJTkdMRSB8IFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX1RZUEVfTUVTU0FHRSkpOwogICAgICAgICBwby5lbmRPYmplY3QodG9rZW4pOwogCiAgICAgICAgIHBvLndyaXRlVUludDMyKFByb3RvT3V0cHV0U3RyZWFtLm1ha2VGaWVsZElkKDQsCkBAIC0yNjMsMTEgKzI2MywxMSBAQAogICAgICAgICBsb25nIHRva2VuOwogCiAgICAgICAgIHRva2VuID0gcG8uc3RhcnRSZXBlYXRlZE9iamVjdChQcm90b091dHB1dFN0cmVhbS5tYWtlRmllbGRJZCgxLAotICAgICAgICAgICAgICAgICAgICBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9DT1VOVF9SRVBFQVRFRCB8IFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX1RZUEVfT0JKRUNUKSk7CisgICAgICAgICAgICAgICAgICAgIFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX0NPVU5UX1JFUEVBVEVEIHwgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfVFlQRV9NRVNTQUdFKSk7CiAgICAgICAgIHBvLmVuZFJlcGVhdGVkT2JqZWN0KHRva2VuKTsKIAogICAgICAgICB0b2tlbiA9IHBvLnN0YXJ0UmVwZWF0ZWRPYmplY3QoUHJvdG9PdXRwdXRTdHJlYW0ubWFrZUZpZWxkSWQoMSwKLSAgICAgICAgICAgICAgICAgICAgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfQ09VTlRfUkVQRUFURUQgfCBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9UWVBFX09CSkVDVCkpOworICAgICAgICAgICAgICAgICAgICBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9DT1VOVF9SRVBFQVRFRCB8IFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX1RZUEVfTUVTU0FHRSkpOwogICAgICAgICBwby5lbmRSZXBlYXRlZE9iamVjdCh0b2tlbik7CiAKICAgICAgICAgQXNzZXJ0LmFzc2VydEFycmF5RXF1YWxzKG5ldyBieXRlW10gewpAQCAtMjk5LDcgKzI5OSw3IEBACiAgICAgICAgICAgICAgICAgJ3gnKTsKIAogICAgICAgICBsb25nIHRva2VuID0gcG8uc3RhcnRPYmplY3QoUHJvdG9PdXRwdXRTdHJlYW0ubWFrZUZpZWxkSWQoMiwKLSAgICAgICAgICAgICAgICAgICAgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfQ09VTlRfU0lOR0xFIHwgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfVFlQRV9PQkpFQ1QpKTsKKyAgICAgICAgICAgICAgICAgICAgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfQ09VTlRfU0lOR0xFIHwgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfVFlQRV9NRVNTQUdFKSk7CiAgICAgICAgIHBvLndyaXRlVUludDMyKFByb3RvT3V0cHV0U3RyZWFtLm1ha2VGaWVsZElkKDMsCiAgICAgICAgICAgICAgICAgICAgIFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX0NPVU5UX1NJTkdMRSB8IFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX1RZUEVfVUlOVDMyKSwKICAgICAgICAgICAgICAgICAneScpOwpAQCAtMzA4LDcgKzMwOCw3IEBACiAgICAgICAgICAgICAgICAgImFiY2RlZmdoaWprbCIpOwogCiAgICAgICAgIGxvbmcgdG9rZW5FbXB0eSA9IHBvLnN0YXJ0T2JqZWN0KFByb3RvT3V0cHV0U3RyZWFtLm1ha2VGaWVsZElkKDUwMCwKLSAgICAgICAgICAgICAgICAgICAgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfQ09VTlRfU0lOR0xFIHwgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfVFlQRV9PQkpFQ1QpKTsKKyAgICAgICAgICAgICAgICAgICAgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfQ09VTlRfU0lOR0xFIHwgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfVFlQRV9NRVNTQUdFKSk7CiAgICAgICAgIHBvLmVuZE9iamVjdCh0b2tlbkVtcHR5KTsKIAogICAgICAgICBwby5lbmRPYmplY3QodG9rZW4pOwpAQCAtMzQ5LDE5ICszNDksMTkgQEAKICAgICAgICAgZmluYWwgUHJvdG9PdXRwdXRTdHJlYW0gcG8gPSBuZXcgUHJvdG9PdXRwdXRTdHJlYW0oY2h1bmtTaXplKTsKIAogICAgICAgICBsb25nIHRva2VuMSA9IHBvLnN0YXJ0T2JqZWN0KFByb3RvT3V0cHV0U3RyZWFtLm1ha2VGaWVsZElkKDEsCi0gICAgICAgICAgICAgICAgICAgIFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX0NPVU5UX1NJTkdMRSB8IFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX1RZUEVfT0JKRUNUKSk7CisgICAgICAgICAgICAgICAgICAgIFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX0NPVU5UX1NJTkdMRSB8IFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX1RZUEVfTUVTU0FHRSkpOwogICAgICAgICBwby53cml0ZVVJbnQzMihQcm90b091dHB1dFN0cmVhbS5tYWtlRmllbGRJZCgyLAogICAgICAgICAgICAgICAgICAgICBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9DT1VOVF9TSU5HTEUgfCBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9UWVBFX1VJTlQzMiksCiAgICAgICAgICAgICAgICAgJ2EnKTsKIAogICAgICAgICBsb25nIHRva2VuMiA9IHBvLnN0YXJ0T2JqZWN0KFByb3RvT3V0cHV0U3RyZWFtLm1ha2VGaWVsZElkKDMsCi0gICAgICAgICAgICAgICAgICAgIFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX0NPVU5UX1NJTkdMRSB8IFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX1RZUEVfT0JKRUNUKSk7CisgICAgICAgICAgICAgICAgICAgIFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX0NPVU5UX1NJTkdMRSB8IFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX1RZUEVfTUVTU0FHRSkpOwogICAgICAgICBwby53cml0ZVVJbnQzMihQcm90b091dHB1dFN0cmVhbS5tYWtlRmllbGRJZCg0LAogICAgICAgICAgICAgICAgICAgICBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9DT1VOVF9TSU5HTEUgfCBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9UWVBFX1VJTlQzMiksCiAgICAgICAgICAgICAgICAgJ2InKTsKIAogICAgICAgICBsb25nIHRva2VuMyA9IHBvLnN0YXJ0T2JqZWN0KFByb3RvT3V0cHV0U3RyZWFtLm1ha2VGaWVsZElkKDUsCi0gICAgICAgICAgICAgICAgICAgIFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX0NPVU5UX1NJTkdMRSB8IFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX1RZUEVfT0JKRUNUKSk7CisgICAgICAgICAgICAgICAgICAgIFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX0NPVU5UX1NJTkdMRSB8IFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX1RZUEVfTUVTU0FHRSkpOwogICAgICAgICBwby53cml0ZVVJbnQzMihQcm90b091dHB1dFN0cmVhbS5tYWtlRmllbGRJZCg2LAogICAgICAgICAgICAgICAgICAgICBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9DT1VOVF9TSU5HTEUgfCBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9UWVBFX1VJTlQzMiksCiAgICAgICAgICAgICAgICAgJ2MnKTsKQEAgLTM5NCwxMyArMzk0LDEzIEBACiAgICAgICAgIGZpbmFsIFByb3RvT3V0cHV0U3RyZWFtIHBvID0gbmV3IFByb3RvT3V0cHV0U3RyZWFtKCk7CiAKICAgICAgICAgbG9uZyB0b2tlbjEgPSBwby5zdGFydE9iamVjdChQcm90b091dHB1dFN0cmVhbS5tYWtlRmllbGRJZCgxLAotICAgICAgICAgICAgICAgICAgICBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9DT1VOVF9TSU5HTEUgfCBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9UWVBFX09CSkVDVCkpOworICAgICAgICAgICAgICAgICAgICBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9DT1VOVF9TSU5HTEUgfCBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9UWVBFX01FU1NBR0UpKTsKICAgICAgICAgcG8ud3JpdGVVSW50MzIoUHJvdG9PdXRwdXRTdHJlYW0ubWFrZUZpZWxkSWQoMiwKICAgICAgICAgICAgICAgICAgICAgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfQ09VTlRfU0lOR0xFIHwgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfVFlQRV9VSU5UMzIpLAogICAgICAgICAgICAgICAgICdhJyk7CiAKICAgICAgICAgbG9uZyB0b2tlbjIgPSBwby5zdGFydE9iamVjdChQcm90b091dHB1dFN0cmVhbS5tYWtlRmllbGRJZCgzLAotICAgICAgICAgICAgICAgICAgICBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9DT1VOVF9TSU5HTEUgfCBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9UWVBFX09CSkVDVCkpOworICAgICAgICAgICAgICAgICAgICBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9DT1VOVF9TSU5HTEUgfCBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9UWVBFX01FU1NBR0UpKTsKICAgICAgICAgcG8ud3JpdGVVSW50MzIoUHJvdG9PdXRwdXRTdHJlYW0ubWFrZUZpZWxkSWQoNCwKICAgICAgICAgICAgICAgICAgICAgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfQ09VTlRfU0lOR0xFIHwgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfVFlQRV9VSU5UMzIpLAogICAgICAgICAgICAgICAgICdiJyk7CkBAIC00MjIsMTAgKzQyMiwxMCBAQAogICAgICAgICBmaW5hbCBQcm90b091dHB1dFN0cmVhbSBwbyA9IG5ldyBQcm90b091dHB1dFN0cmVhbSgpOwogCiAgICAgICAgIGxvbmcgdG9rZW4xID0gcG8uc3RhcnRPYmplY3QoUHJvdG9PdXRwdXRTdHJlYW0ubWFrZUZpZWxkSWQoMSwKLSAgICAgICAgICAgICAgICAgICAgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfQ09VTlRfU0lOR0xFIHwgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfVFlQRV9PQkpFQ1QpKTsKKyAgICAgICAgICAgICAgICAgICAgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfQ09VTlRfU0lOR0xFIHwgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfVFlQRV9NRVNTQUdFKSk7CiAKICAgICAgICAgbG9uZyB0b2tlbjIgPSBwby5zdGFydE9iamVjdChQcm90b091dHB1dFN0cmVhbS5tYWtlRmllbGRJZCgzLAotICAgICAgICAgICAgICAgICAgICBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9DT1VOVF9TSU5HTEUgfCBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9UWVBFX09CSkVDVCkpOworICAgICAgICAgICAgICAgICAgICBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9DT1VOVF9TSU5HTEUgfCBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9UWVBFX01FU1NBR0UpKTsKIAogICAgICAgICBwby5lbmRPYmplY3QodG9rZW4yKTsKICAgICAgICAgdHJ5IHsKQEAgLTQ0NCwxMyArNDQ0LDEzIEBACiAgICAgICAgIGZpbmFsIFByb3RvT3V0cHV0U3RyZWFtIHBvID0gbmV3IFByb3RvT3V0cHV0U3RyZWFtKCk7CiAKICAgICAgICAgbG9uZyB0b2tlbjEgPSBwby5zdGFydE9iamVjdChQcm90b091dHB1dFN0cmVhbS5tYWtlRmllbGRJZCgxLAotICAgICAgICAgICAgICAgICAgICBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9DT1VOVF9TSU5HTEUgfCBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9UWVBFX09CSkVDVCkpOworICAgICAgICAgICAgICAgICAgICBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9DT1VOVF9TSU5HTEUgfCBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9UWVBFX01FU1NBR0UpKTsKICAgICAgICAgcG8ud3JpdGVVSW50MzIoUHJvdG9PdXRwdXRTdHJlYW0ubWFrZUZpZWxkSWQoMiwKICAgICAgICAgICAgICAgICAgICAgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfQ09VTlRfU0lOR0xFIHwgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfVFlQRV9VSU5UMzIpLAogICAgICAgICAgICAgICAgICdhJyk7CiAKICAgICAgICAgbG9uZyB0b2tlbjIgPSBwby5zdGFydE9iamVjdChQcm90b091dHB1dFN0cmVhbS5tYWtlRmllbGRJZCgzLAotICAgICAgICAgICAgICAgICAgICBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9DT1VOVF9TSU5HTEUgfCBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9UWVBFX09CSkVDVCkpOworICAgICAgICAgICAgICAgICAgICBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9DT1VOVF9TSU5HTEUgfCBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9UWVBFX01FU1NBR0UpKTsKICAgICAgICAgcG8ud3JpdGVVSW50MzIoUHJvdG9PdXRwdXRTdHJlYW0ubWFrZUZpZWxkSWQoNCwKICAgICAgICAgICAgICAgICAgICAgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfQ09VTlRfU0lOR0xFIHwgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfVFlQRV9VSU5UMzIpLAogICAgICAgICAgICAgICAgICdiJyk7CkBAIC00NzIsMTAgKzQ3MiwxMCBAQAogICAgICAgICBmaW5hbCBQcm90b091dHB1dFN0cmVhbSBwbyA9IG5ldyBQcm90b091dHB1dFN0cmVhbSgpOwogCiAgICAgICAgIGxvbmcgdG9rZW4xID0gcG8uc3RhcnRPYmplY3QoUHJvdG9PdXRwdXRTdHJlYW0ubWFrZUZpZWxkSWQoMSwKLSAgICAgICAgICAgICAgICAgICAgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfQ09VTlRfU0lOR0xFIHwgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfVFlQRV9PQkpFQ1QpKTsKKyAgICAgICAgICAgICAgICAgICAgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfQ09VTlRfU0lOR0xFIHwgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfVFlQRV9NRVNTQUdFKSk7CiAKICAgICAgICAgbG9uZyB0b2tlbjIgPSBwby5zdGFydE9iamVjdChQcm90b091dHB1dFN0cmVhbS5tYWtlRmllbGRJZCgzLAotICAgICAgICAgICAgICAgICAgICBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9DT1VOVF9TSU5HTEUgfCBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9UWVBFX09CSkVDVCkpOworICAgICAgICAgICAgICAgICAgICBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9DT1VOVF9TSU5HTEUgfCBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9UWVBFX01FU1NBR0UpKTsKIAogICAgICAgICBwby5lbmRPYmplY3QodG9rZW4yKTsKICAgICAgICAgdHJ5IHsKQEAgLTQ5NCwxMyArNDk0LDEzIEBACiAgICAgICAgIGZpbmFsIFByb3RvT3V0cHV0U3RyZWFtIHBvID0gbmV3IFByb3RvT3V0cHV0U3RyZWFtKCk7CiAKICAgICAgICAgbG9uZyB0b2tlbjEgPSBwby5zdGFydE9iamVjdChQcm90b091dHB1dFN0cmVhbS5tYWtlRmllbGRJZCgxLAotICAgICAgICAgICAgICAgICAgICBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9DT1VOVF9TSU5HTEUgfCBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9UWVBFX09CSkVDVCkpOworICAgICAgICAgICAgICAgICAgICBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9DT1VOVF9TSU5HTEUgfCBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9UWVBFX01FU1NBR0UpKTsKICAgICAgICAgcG8ud3JpdGVVSW50MzIoUHJvdG9PdXRwdXRTdHJlYW0ubWFrZUZpZWxkSWQoMiwKICAgICAgICAgICAgICAgICAgICAgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfQ09VTlRfU0lOR0xFIHwgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfVFlQRV9VSU5UMzIpLAogICAgICAgICAgICAgICAgICdhJyk7CiAKICAgICAgICAgbG9uZyB0b2tlbjIgPSBwby5zdGFydE9iamVjdChQcm90b091dHB1dFN0cmVhbS5tYWtlRmllbGRJZCgzLAotICAgICAgICAgICAgICAgICAgICBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9DT1VOVF9TSU5HTEUgfCBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9UWVBFX09CSkVDVCkpOworICAgICAgICAgICAgICAgICAgICBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9DT1VOVF9TSU5HTEUgfCBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9UWVBFX01FU1NBR0UpKTsKICAgICAgICAgcG8ud3JpdGVVSW50MzIoUHJvdG9PdXRwdXRTdHJlYW0ubWFrZUZpZWxkSWQoNCwKICAgICAgICAgICAgICAgICAgICAgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfQ09VTlRfU0lOR0xFIHwgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfVFlQRV9VSU5UMzIpLAogICAgICAgICAgICAgICAgICdiJyk7CkBAIC01MjEsMTAgKzUyMSwxMCBAQAogICAgICAgICBmaW5hbCBQcm90b091dHB1dFN0cmVhbSBwbyA9IG5ldyBQcm90b091dHB1dFN0cmVhbSgpOwogCiAgICAgICAgIGxvbmcgdG9rZW4xID0gcG8uc3RhcnRPYmplY3QoUHJvdG9PdXRwdXRTdHJlYW0ubWFrZUZpZWxkSWQoMSwKLSAgICAgICAgICAgICAgICAgICAgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfQ09VTlRfU0lOR0xFIHwgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfVFlQRV9PQkpFQ1QpKTsKKyAgICAgICAgICAgICAgICAgICAgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfQ09VTlRfU0lOR0xFIHwgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfVFlQRV9NRVNTQUdFKSk7CiAKICAgICAgICAgbG9uZyB0b2tlbjIgPSBwby5zdGFydE9iamVjdChQcm90b091dHB1dFN0cmVhbS5tYWtlRmllbGRJZCgzLAotICAgICAgICAgICAgICAgICAgICBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9DT1VOVF9TSU5HTEUgfCBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9UWVBFX09CSkVDVCkpOworICAgICAgICAgICAgICAgICAgICBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9DT1VOVF9TSU5HTEUgfCBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9UWVBFX01FU1NBR0UpKTsKIAogICAgICAgICB0cnkgewogICAgICAgICAgICAgcG8uZW5kT2JqZWN0KHRva2VuMSk7CkBAIC01NDIsMjAgKzU0MiwyMCBAQAogICAgICAgICBmaW5hbCBQcm90b091dHB1dFN0cmVhbSBwbyA9IG5ldyBQcm90b091dHB1dFN0cmVhbSgpOwogCiAgICAgICAgIGxvbmcgdG9rZW4xID0gcG8uc3RhcnRPYmplY3QoUHJvdG9PdXRwdXRTdHJlYW0ubWFrZUZpZWxkSWQoMSwKLSAgICAgICAgICAgICAgICAgICAgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfQ09VTlRfU0lOR0xFIHwgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfVFlQRV9PQkpFQ1QpKTsKKyAgICAgICAgICAgICAgICAgICAgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfQ09VTlRfU0lOR0xFIHwgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfVFlQRV9NRVNTQUdFKSk7CiAgICAgICAgIHBvLndyaXRlVUludDMyKFByb3RvT3V0cHV0U3RyZWFtLm1ha2VGaWVsZElkKDIsCiAgICAgICAgICAgICAgICAgICAgIFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX0NPVU5UX1NJTkdMRSB8IFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX1RZUEVfVUlOVDMyKSwKICAgICAgICAgICAgICAgICAnYScpOwogCiAgICAgICAgIGxvbmcgdG9rZW4yID0gcG8uc3RhcnRPYmplY3QoUHJvdG9PdXRwdXRTdHJlYW0ubWFrZUZpZWxkSWQoMywKLSAgICAgICAgICAgICAgICAgICAgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfQ09VTlRfU0lOR0xFIHwgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfVFlQRV9PQkpFQ1QpKTsKKyAgICAgICAgICAgICAgICAgICAgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfQ09VTlRfU0lOR0xFIHwgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfVFlQRV9NRVNTQUdFKSk7CiAgICAgICAgIHBvLndyaXRlVUludDMyKFByb3RvT3V0cHV0U3RyZWFtLm1ha2VGaWVsZElkKDQsCiAgICAgICAgICAgICAgICAgICAgIFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX0NPVU5UX1NJTkdMRSB8IFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX1RZUEVfVUlOVDMyKSwKICAgICAgICAgICAgICAgICAnYicpOwogICAgICAgICBwby5lbmRPYmplY3QodG9rZW4yKTsKIAogICAgICAgICBsb25nIHRva2VuMyA9IHBvLnN0YXJ0T2JqZWN0KFByb3RvT3V0cHV0U3RyZWFtLm1ha2VGaWVsZElkKDUsCi0gICAgICAgICAgICAgICAgICAgIFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX0NPVU5UX1NJTkdMRSB8IFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX1RZUEVfT0JKRUNUKSk7CisgICAgICAgICAgICAgICAgICAgIFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX0NPVU5UX1NJTkdMRSB8IFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX1RZUEVfTUVTU0FHRSkpOwogICAgICAgICBwby53cml0ZVVJbnQzMihQcm90b091dHB1dFN0cmVhbS5tYWtlRmllbGRJZCg0LAogICAgICAgICAgICAgICAgICAgICBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9DT1VOVF9TSU5HTEUgfCBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9UWVBFX1VJTlQzMiksCiAgICAgICAgICAgICAgICAgJ2InKTsKQEAgLTU3NiwxNCArNTc2LDE0IEBACiAgICAgICAgIGZpbmFsIFByb3RvT3V0cHV0U3RyZWFtIHBvID0gbmV3IFByb3RvT3V0cHV0U3RyZWFtKCk7CiAKICAgICAgICAgbG9uZyB0b2tlbjEgPSBwby5zdGFydE9iamVjdChQcm90b091dHB1dFN0cmVhbS5tYWtlRmllbGRJZCgxLAotICAgICAgICAgICAgICAgICAgICBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9DT1VOVF9TSU5HTEUgfCBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9UWVBFX09CSkVDVCkpOworICAgICAgICAgICAgICAgICAgICBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9DT1VOVF9TSU5HTEUgfCBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9UWVBFX01FU1NBR0UpKTsKIAogICAgICAgICBsb25nIHRva2VuMiA9IHBvLnN0YXJ0T2JqZWN0KFByb3RvT3V0cHV0U3RyZWFtLm1ha2VGaWVsZElkKDMsCi0gICAgICAgICAgICAgICAgICAgIFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX0NPVU5UX1NJTkdMRSB8IFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX1RZUEVfT0JKRUNUKSk7CisgICAgICAgICAgICAgICAgICAgIFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX0NPVU5UX1NJTkdMRSB8IFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX1RZUEVfTUVTU0FHRSkpOwogICAgICAgICBwby5lbmRPYmplY3QodG9rZW4yKTsKIAogICAgICAgICBsb25nIHRva2VuMyA9IHBvLnN0YXJ0T2JqZWN0KFByb3RvT3V0cHV0U3RyZWFtLm1ha2VGaWVsZElkKDUsCi0gICAgICAgICAgICAgICAgICAgIFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX0NPVU5UX1NJTkdMRSB8IFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX1RZUEVfT0JKRUNUKSk7CisgICAgICAgICAgICAgICAgICAgIFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX0NPVU5UX1NJTkdMRSB8IFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX1RZUEVfTUVTU0FHRSkpOwogCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBwby5lbmRPYmplY3QodG9rZW4yKTsKQEAgLTYwMSwxNCArNjAxLDE0IEBACiAgICAgICAgIGZpbmFsIFByb3RvT3V0cHV0U3RyZWFtIHBvID0gbmV3IFByb3RvT3V0cHV0U3RyZWFtKCk7CiAKICAgICAgICAgbG9uZyB0b2tlbjEgPSBwby5zdGFydE9iamVjdChQcm90b091dHB1dFN0cmVhbS5tYWtlRmllbGRJZCgxLAotICAgICAgICAgICAgICAgICAgICBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9DT1VOVF9TSU5HTEUgfCBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9UWVBFX09CSkVDVCkpOworICAgICAgICAgICAgICAgICAgICBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9DT1VOVF9TSU5HTEUgfCBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9UWVBFX01FU1NBR0UpKTsKIAogICAgICAgICBsb25nIHRva2VuMiA9IHBvLnN0YXJ0T2JqZWN0KFByb3RvT3V0cHV0U3RyZWFtLm1ha2VGaWVsZElkKDMsCi0gICAgICAgICAgICAgICAgICAgIFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX0NPVU5UX1NJTkdMRSB8IFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX1RZUEVfT0JKRUNUKSk7CisgICAgICAgICAgICAgICAgICAgIFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX0NPVU5UX1NJTkdMRSB8IFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX1RZUEVfTUVTU0FHRSkpOwogICAgICAgICBwby5lbmRPYmplY3QodG9rZW4yKTsKIAogICAgICAgICBsb25nIHRva2VuMyA9IHBvLnN0YXJ0T2JqZWN0KFByb3RvT3V0cHV0U3RyZWFtLm1ha2VGaWVsZElkKDUsCi0gICAgICAgICAgICAgICAgICAgIFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX0NPVU5UX1NJTkdMRSB8IFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX1RZUEVfT0JKRUNUKSk7CisgICAgICAgICAgICAgICAgICAgIFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX0NPVU5UX1NJTkdMRSB8IFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX1RZUEVfTUVTU0FHRSkpOwogCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBwby5lbmRPYmplY3QodG9rZW4yKTsKQEAgLTYzOCwxNyArNjM4LDE3IEBACiAgICAgICAgIGFsbC5uZXN0ZWRGaWVsZC5uZXN0ZWQubmVzdGVkLmRhdGEgPSAzOwogCiAgICAgICAgIGZpbmFsIGxvbmcgdG9rZW4xID0gcG8uc3RhcnRPYmplY3QoUHJvdG9PdXRwdXRTdHJlYW0ubWFrZUZpZWxkSWQoMTcwLAotICAgICAgICAgICAgICAgICAgICBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9DT1VOVF9TSU5HTEUgfCBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9UWVBFX09CSkVDVCkpOworICAgICAgICAgICAgICAgICAgICBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9DT1VOVF9TSU5HTEUgfCBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9UWVBFX01FU1NBR0UpKTsKICAgICAgICAgcG8ud3JpdGVJbnQzMihQcm90b091dHB1dFN0cmVhbS5tYWtlRmllbGRJZCgxMDAwMSwKICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX0NPVU5UX1NJTkdMRSB8IFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX1RZUEVfSU5UMzIpLAogICAgICAgICAgICAgICAgIDEpOwogICAgICAgICBmaW5hbCBsb25nIHRva2VuMiA9IHBvLnN0YXJ0T2JqZWN0KFByb3RvT3V0cHV0U3RyZWFtLm1ha2VGaWVsZElkKDEwMDAyLAotICAgICAgICAgICAgICAgICAgICBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9DT1VOVF9TSU5HTEUgfCBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9UWVBFX09CSkVDVCkpOworICAgICAgICAgICAgICAgICAgICBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9DT1VOVF9TSU5HTEUgfCBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9UWVBFX01FU1NBR0UpKTsKICAgICAgICAgcG8ud3JpdGVJbnQzMihQcm90b091dHB1dFN0cmVhbS5tYWtlRmllbGRJZCgxMDAwMSwKICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX0NPVU5UX1NJTkdMRSB8IFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX1RZUEVfSU5UMzIpLAogICAgICAgICAgICAgICAgIDIpOwogICAgICAgICBmaW5hbCBsb25nIHRva2VuMyA9IHBvLnN0YXJ0T2JqZWN0KFByb3RvT3V0cHV0U3RyZWFtLm1ha2VGaWVsZElkKDEwMDAyLAotICAgICAgICAgICAgICAgICAgICBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9DT1VOVF9TSU5HTEUgfCBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9UWVBFX09CSkVDVCkpOworICAgICAgICAgICAgICAgICAgICBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9DT1VOVF9TSU5HTEUgfCBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9UWVBFX01FU1NBR0UpKTsKICAgICAgICAgcG8ud3JpdGVJbnQzMihQcm90b091dHB1dFN0cmVhbS5tYWtlRmllbGRJZCgxMDAwMSwKICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX0NPVU5UX1NJTkdMRSB8IFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX1RZUEVfSU5UMzIpLAogICAgICAgICAgICAgICAgIDMpOwpAQCAtNjgwLDE3ICs2ODAsMTcgQEAKICAgICAgICAgICAgIGFsbC5uZXN0ZWRGaWVsZFJlcGVhdGVkW2ldLm5lc3RlZC5uZXN0ZWQuZGF0YSA9IDM7CiAKICAgICAgICAgICAgIGZpbmFsIGxvbmcgdG9rZW4xID0gcG8uc3RhcnRPYmplY3QoUHJvdG9PdXRwdXRTdHJlYW0ubWFrZUZpZWxkSWQoMTcxLAotICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfQ09VTlRfU0lOR0xFIHwgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfVFlQRV9PQkpFQ1QpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX0NPVU5UX1NJTkdMRSB8IFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX1RZUEVfTUVTU0FHRSkpOwogICAgICAgICAgICAgcG8ud3JpdGVJbnQzMihQcm90b091dHB1dFN0cmVhbS5tYWtlRmllbGRJZCgxMDAwMSwKICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX0NPVU5UX1NJTkdMRSB8IFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX1RZUEVfSU5UMzIpLAogICAgICAgICAgICAgICAgICAgICAxKTsKICAgICAgICAgICAgIGZpbmFsIGxvbmcgdG9rZW4yID0gcG8uc3RhcnRPYmplY3QoUHJvdG9PdXRwdXRTdHJlYW0ubWFrZUZpZWxkSWQoMTAwMDIsCi0gICAgICAgICAgICAgICAgICAgICAgICBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9DT1VOVF9TSU5HTEUgfCBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9UWVBFX09CSkVDVCkpOworICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfQ09VTlRfU0lOR0xFIHwgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfVFlQRV9NRVNTQUdFKSk7CiAgICAgICAgICAgICBwby53cml0ZUludDMyKFByb3RvT3V0cHV0U3RyZWFtLm1ha2VGaWVsZElkKDEwMDAxLAogICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfQ09VTlRfU0lOR0xFIHwgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfVFlQRV9JTlQzMiksCiAgICAgICAgICAgICAgICAgICAgIDIpOwogICAgICAgICAgICAgZmluYWwgbG9uZyB0b2tlbjMgPSBwby5zdGFydE9iamVjdChQcm90b091dHB1dFN0cmVhbS5tYWtlRmllbGRJZCgxMDAwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX0NPVU5UX1NJTkdMRSB8IFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX1RZUEVfT0JKRUNUKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9DT1VOVF9TSU5HTEUgfCBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9UWVBFX01FU1NBR0UpKTsKICAgICAgICAgICAgIHBvLndyaXRlSW50MzIoUHJvdG9PdXRwdXRTdHJlYW0ubWFrZUZpZWxkSWQoMTAwMDEsCiAgICAgICAgICAgICAgICAgICAgICAgICBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9DT1VOVF9TSU5HTEUgfCBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9UWVBFX0lOVDMyKSwKICAgICAgICAgICAgICAgICAgICAgMyk7CkBAIC03MjQsNyArNzI0LDcgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGZpbmFsIFByb3RvT3V0cHV0U3RyZWFtIHBvID0gbmV3IFByb3RvT3V0cHV0U3RyZWFtKCk7CiAgICAgICAgICAgICBwby5zdGFydE9iamVjdChQcm90b091dHB1dFN0cmVhbS5tYWtlRmllbGRJZCgxLAotICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfQ09VTlRfUEFDS0VEIHwgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfVFlQRV9PQkpFQ1QpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX0NPVU5UX1BBQ0tFRCB8IFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX1RZUEVfTUVTU0FHRSkpOwogICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgIC8vIGdvb2QKICAgICAgICAgfQpAQCAtNzQ0LDcgKzc0NCw3IEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBmaW5hbCBQcm90b091dHB1dFN0cmVhbSBwbyA9IG5ldyBQcm90b091dHB1dFN0cmVhbSgpOwogICAgICAgICAgICAgcG8uc3RhcnRSZXBlYXRlZE9iamVjdChQcm90b091dHB1dFN0cmVhbS5tYWtlRmllbGRJZCgxLAotICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfQ09VTlRfUEFDS0VEIHwgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfVFlQRV9PQkpFQ1QpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX0NPVU5UX1BBQ0tFRCB8IFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX1RZUEVfTUVTU0FHRSkpOwogICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgIC8vIGdvb2QKICAgICAgICAgfQpAQCAtNzU2LDcgKzc1Niw3IEBACiAgICAgcHVibGljIHZvaWQgdGVzdE1pc21hdGNoZWRFbmRPYmplY3QoKSB7CiAgICAgICAgIGZpbmFsIFByb3RvT3V0cHV0U3RyZWFtIHBvID0gbmV3IFByb3RvT3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIGZpbmFsIGxvbmcgdG9rZW4gPSBwby5zdGFydE9iamVjdChQcm90b091dHB1dFN0cmVhbS5tYWtlRmllbGRJZCgxLAotICAgICAgICAgICAgICAgICAgICBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9DT1VOVF9TSU5HTEUgfCBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9UWVBFX09CSkVDVCkpOworICAgICAgICAgICAgICAgICAgICBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9DT1VOVF9TSU5HTEUgfCBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9UWVBFX01FU1NBR0UpKTsKIAogICAgICAgICB0cnkgewogICAgICAgICAgICAgcG8uZW5kUmVwZWF0ZWRPYmplY3QodG9rZW4pOwpAQCAtNzcxLDcgKzc3MSw3IEBACiAgICAgcHVibGljIHZvaWQgdGVzdE1pc21hdGNoZWRFbmRSZXBlYXRlZE9iamVjdCgpIHsKICAgICAgICAgZmluYWwgUHJvdG9PdXRwdXRTdHJlYW0gcG8gPSBuZXcgUHJvdG9PdXRwdXRTdHJlYW0oKTsKICAgICAgICAgZmluYWwgbG9uZyB0b2tlbiA9IHBvLnN0YXJ0UmVwZWF0ZWRPYmplY3QoUHJvdG9PdXRwdXRTdHJlYW0ubWFrZUZpZWxkSWQoMSwKLSAgICAgICAgICAgICAgICAgICAgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfQ09VTlRfUkVQRUFURUQgfCBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9UWVBFX09CSkVDVCkpOworICAgICAgICAgICAgICAgICAgICBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9DT1VOVF9SRVBFQVRFRCB8IFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX1RZUEVfTUVTU0FHRSkpOwogCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBwby5lbmRPYmplY3QodG9rZW4pOwpAQCAtODA2LDcgKzgwNiw3IEBACiAKICAgICAgICAgZmluYWwgUHJvdG9PdXRwdXRTdHJlYW0gcG8gPSBuZXcgUHJvdG9PdXRwdXRTdHJlYW0oKTsKICAgICAgICAgcG8ud3JpdGVPYmplY3QoUHJvdG9PdXRwdXRTdHJlYW0ubWFrZUZpZWxkSWQoMTAsCi0gICAgICAgICAgICAgICAgICAgIFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX0NPVU5UX1NJTkdMRSB8IFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX1RZUEVfT0JKRUNUKSwKKyAgICAgICAgICAgICAgICAgICAgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfQ09VTlRfU0lOR0xFIHwgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfVFlQRV9NRVNTQUdFKSwKICAgICAgICAgICAgICAgICBpbm5lclJhdyk7CiAKICAgICAgICAgZmluYWwgYnl0ZVtdIHJlc3VsdCA9IHBvLmdldEJ5dGVzKCk7CkBAIC04MjcsNyArODI3LDcgQEAKIAogICAgICAgICBmaW5hbCBQcm90b091dHB1dFN0cmVhbSBwbyA9IG5ldyBQcm90b091dHB1dFN0cmVhbSgpOwogICAgICAgICBwby53cml0ZU9iamVjdChQcm90b091dHB1dFN0cmVhbS5tYWtlRmllbGRJZCgxMCwKLSAgICAgICAgICAgICAgICAgICAgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfQ09VTlRfU0lOR0xFIHwgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfVFlQRV9PQkpFQ1QpLAorICAgICAgICAgICAgICAgICAgICBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9DT1VOVF9TSU5HTEUgfCBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9UWVBFX01FU1NBR0UpLAogICAgICAgICAgICAgICAgIGlubmVyUmF3KTsKIAogICAgICAgICBmaW5hbCBieXRlW10gcmVzdWx0ID0gcG8uZ2V0Qnl0ZXMoKTsKQEAgLTg2MSw3ICs4NjEsNyBAQAogCiAgICAgICAgIGZpbmFsIFByb3RvT3V0cHV0U3RyZWFtIHBvID0gbmV3IFByb3RvT3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHBvLndyaXRlUmVwZWF0ZWRPYmplY3QoUHJvdG9PdXRwdXRTdHJlYW0ubWFrZUZpZWxkSWQoMTAsCi0gICAgICAgICAgICAgICAgICAgIFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX0NPVU5UX1JFUEVBVEVEIHwgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfVFlQRV9PQkpFQ1QpLAorICAgICAgICAgICAgICAgICAgICBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9DT1VOVF9SRVBFQVRFRCB8IFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX1RZUEVfTUVTU0FHRSksCiAgICAgICAgICAgICAgICAgaW5uZXJSYXcpOwogCiAgICAgICAgIGZpbmFsIGJ5dGVbXSByZXN1bHQgPSBwby5nZXRCeXRlcygpOwpAQCAtODgyLDcgKzg4Miw3IEBACiAKICAgICAgICAgZmluYWwgUHJvdG9PdXRwdXRTdHJlYW0gcG8gPSBuZXcgUHJvdG9PdXRwdXRTdHJlYW0oKTsKICAgICAgICAgcG8ud3JpdGVSZXBlYXRlZE9iamVjdChQcm90b091dHB1dFN0cmVhbS5tYWtlRmllbGRJZCgxMCwKLSAgICAgICAgICAgICAgICAgICAgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfQ09VTlRfUkVQRUFURUQgfCBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9UWVBFX09CSkVDVCksCisgICAgICAgICAgICAgICAgICAgIFByb3RvT3V0cHV0U3RyZWFtLkZJRUxEX0NPVU5UX1JFUEVBVEVEIHwgUHJvdG9PdXRwdXRTdHJlYW0uRklFTERfVFlQRV9NRVNTQUdFKSwKICAgICAgICAgICAgICAgICBpbm5lclJhdyk7CiAKICAgICAgICAgQXNzZXJ0LmFzc2VydEFycmF5RXF1YWxzKG5ldyBieXRlW10gewpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcHJvdG8vc3JjL2FuZHJvaWQvdXRpbC9wcm90by9jdHMvUHJvdG9PdXRwdXRTdHJlYW1UYWdUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9wcm90by9zcmMvYW5kcm9pZC91dGlsL3Byb3RvL2N0cy9Qcm90b091dHB1dFN0cmVhbVRhZ1Rlc3QuamF2YQppbmRleCAzYjM4YWJhLi5jNDA4ZDkyIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9wcm90by9zcmMvYW5kcm9pZC91dGlsL3Byb3RvL2N0cy9Qcm90b091dHB1dFN0cmVhbVRhZ1Rlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9wcm90by9zcmMvYW5kcm9pZC91dGlsL3Byb3RvL2N0cy9Qcm90b091dHB1dFN0cmVhbVRhZ1Rlc3QuamF2YQpAQCAtOTIsNiArOTIsNyBAQAogICAgICAgICAvLyBUcnkgaXQgaW4gdGhlIHByb3ZpZGVkIG5hbWUKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIFByb3RvT3V0cHV0U3RyZWFtLmNoZWNrRmllbGRJZCg0MiB8IGdvb2RDb3VudCB8IGJhZFR5cGUsIGdvb2RDb3VudCB8IGZpZWxkVHlwZSk7CisgICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uLiIpOwogICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgIGFzc2VydEVxdWFscygid3JpdGVSZXBlYXRlZCIgKyBzdHJpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBjYWxsZWQgZm9yIGZpZWxkIDQyIHdoaWNoIHNob3VsZCBiZSB1c2VkIgpAQCAtMTAyLDYgKzEwMyw3IEBACiAgICAgICAgIC8vIFRyeSBpdCBpbiB0aGUgZXhwZWN0ZWQgbmFtZQogICAgICAgICB0cnkgewogICAgICAgICAgICAgUHJvdG9PdXRwdXRTdHJlYW0uY2hlY2tGaWVsZElkKDQzIHwgZ29vZENvdW50IHwgZmllbGRUeXBlLCBnb29kQ291bnQgfCBiYWRUeXBlKTsKKyAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24uIik7CiAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3cml0ZVJlcGVhdGVkIiArIGJhZFR5cGVTdHJpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBjYWxsZWQgZm9yIGZpZWxkIDQzIHdoaWNoIHNob3VsZCBiZSB1c2VkIgpAQCAtMTI2LDYgKzEyOCw3IEBACiAgICAgICAgIC8vIFRyeSBpdCBpbiB0aGUgcHJvdmlkZWQgbmFtZQogICAgICAgICB0cnkgewogICAgICAgICAgICAgUHJvdG9PdXRwdXRTdHJlYW0uY2hlY2tGaWVsZElkKDQ0IHwgYmFkQ291bnQgfCBnb29kVHlwZSwgZmllbGRDb3VudCB8IGdvb2RUeXBlKTsKKyAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24uIik7CiAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3cml0ZSIgKyBzdHJpbmcKICAgICAgICAgICAgICAgICAgICAgKyAiRml4ZWQzMiBjYWxsZWQgZm9yIGZpZWxkIDQ0IHdoaWNoIHNob3VsZCBiZSB1c2VkIgpAQCAtMTM2LDYgKzEzOSw3IEBACiAgICAgICAgIC8vIFRyeSBpdCBpbiB0aGUgZXhwZWN0ZWQgbmFtZQogICAgICAgICB0cnkgewogICAgICAgICAgICAgUHJvdG9PdXRwdXRTdHJlYW0uY2hlY2tGaWVsZElkKDQ1IHwgZmllbGRDb3VudCB8IGdvb2RUeXBlLCBiYWRDb3VudCB8IGdvb2RUeXBlKTsKKyAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24uIik7CiAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgU3RyaW5nIGV4dHJhU3RyaW5nID0gIiI7CiAgICAgICAgICAgICBpZiAoZmllbGRDb3VudCA9PSBQcm90b091dHB1dFN0cmVhbS5GSUVMRF9DT1VOVF9QQUNLRUQpIHsKQEAgLTE1MSw3ICsxNTUsNyBAQAogICAgIC8qKgogICAgICAqIFZhbGlkYXRlIG9uZSBjYWxsIHRvIGNoZWNrRmllbGRJZCB0aGF0IGlzIGV4cGVjdGVkIHRvIHRocm93LgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFzc2VydENoZWNrRmllbGRJZFRocm93cyhsb25nIGZpZWxkSWQsIGxvbmcgZXhwZWN0ZWRGbGFncykgCisgICAgcHVibGljIHZvaWQgYXNzZXJ0Q2hlY2tGaWVsZElkVGhyb3dzKGxvbmcgZmllbGRJZCwgbG9uZyBleHBlY3RlZEZsYWdzKQogICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBQcm90b091dHB1dFN0cmVhbS5jaGVja0ZpZWxkSWQoZmllbGRJZCwgZXhwZWN0ZWRGbGFncyk7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9wcm92aWRlci9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvcHJvdmlkZXIvQW5kcm9pZC5tawppbmRleCBkNGIzZTk5Li4wMDVmMDc2IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9wcm92aWRlci9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3Rlc3RzL3Byb3ZpZGVyL0FuZHJvaWQubWsKQEAgLTI4LDE5ICsyOCwyNCBAQAogIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAogTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKIAotTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0Lm1vY2sgbGVnYWN5LWFuZHJvaWQtdGVzdCB0ZWxlcGhvbnktY29tbW9uCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QubW9jayBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicyBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzIHRlbGVwaG9ueS1jb21tb24KKworTE9DQUxfVVNFX0FBUFQyIDo9IHRydWUKIAogTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKLSAgICBhbmRyb2lkLXN1cHBvcnQtdjQgXAotICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwgXAotICAgIGN0c3Rlc3RydW5uZXIgXAorICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0IFwKKyAgICBjdHN0ZXN0cnVubmVyLWF4dCBcCiAgICAgdWItdWlhdXRvbWF0b3IgXAogICAgIGp1bml0CiAKK0xPQ0FMX1NUQVRJQ19BTkRST0lEX0xJQlJBUklFUyA6PSBcCisgICAgYW5kcm9pZHgubGVnYWN5X2xlZ2FjeS1zdXBwb3J0LXY0IAorCiBMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdHNfam5pIGxpYm5hdGl2ZWhlbHBlcl9jb21wYXRfbGliYysrCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIAogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c1Byb3ZpZGVyVGVzdENhc2VzCitMT0NBTF9QUklWQVRFX1BMQVRGT1JNX0FQSVMgOj0gdHJ1ZQogCiBpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9wcm92aWRlci9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdGVzdHMvcHJvdmlkZXIvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCAzODBkZGQwLi5kYmZlMzU1ZCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvcHJvdmlkZXIvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9wcm92aWRlci9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC04NCw3ICs4NCw3IEBACiAgICAgICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5jb250ZW50LkNvbnRhY3REaXJlY3RvcnkiIGFuZHJvaWQ6dmFsdWU9InRydWUiIC8+CiAgICAgICAgIDwvcHJvdmlkZXI+CiAKLSAgICAgICAgPHByb3ZpZGVyIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnY0LmNvbnRlbnQuRmlsZVByb3ZpZGVyIgorICAgICAgICA8cHJvdmlkZXIgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC5jb3JlLmNvbnRlbnQuRmlsZVByb3ZpZGVyIgogICAgICAgICAgICAgYW5kcm9pZDphdXRob3JpdGllcz0iYW5kcm9pZC5wcm92aWRlci5jdHMuZmlsZXByb3ZpZGVyIgogICAgICAgICAgICAgYW5kcm9pZDpncmFudFVyaVBlcm1pc3Npb25zPSJ0cnVlIj4KICAgICAgICAgICAgIDxtZXRhLWRhdGEKQEAgLTExOSw3ICsxMTksNyBAQAogCiAgICAgPC9hcHBsaWNhdGlvbj4KIAotICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQucHJvdmlkZXIuY3RzIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIG9mIGFuZHJvaWQucHJvdmlkZXIiPgogICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0ibGlzdGVuZXIiCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9wcm92aWRlci9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy90ZXN0cy9wcm92aWRlci9BbmRyb2lkVGVzdC54bWwKaW5kZXggNTcxOThhOC4uNjRmZTg4YyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvcHJvdmlkZXIvQW5kcm9pZFRlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL3Byb3ZpZGVyL0FuZHJvaWRUZXN0LnhtbApAQCAtMTQsMTMgKzE0LDE2IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgUHJvdmlkZXIgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImZyYW1ld29yayIgLz4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgogICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzUHJvdmlkZXJUZXN0Q2FzZXMuYXBrIiAvPgogICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgogICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5BbmRyb2lkSlVuaXRUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVubmVyIiB2YWx1ZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIiAvPgogICAgICAgICA8b3B0aW9uIG5hbWU9InBhY2thZ2UiIHZhbHVlPSJhbmRyb2lkLnByb3ZpZGVyLmN0cyIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJydW50aW1lLWhpbnQiIHZhbHVlPSI3bTE5cyIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJoaWRkZW4tYXBpLWNoZWNrcyIgdmFsdWU9ImZhbHNlIiAvPgogICAgIDwvdGVzdD4KIDwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3Byb3ZpZGVyL3NyYy9hbmRyb2lkL3Byb3ZpZGVyL2N0cy9CbG9ja2VkTnVtYmVyQmFja3VwUmVzdG9yZVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3Byb3ZpZGVyL3NyYy9hbmRyb2lkL3Byb3ZpZGVyL2N0cy9CbG9ja2VkTnVtYmVyQmFja3VwUmVzdG9yZVRlc3QuamF2YQppbmRleCBhZGY1NThiLi5kOThhMjVhIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9wcm92aWRlci9zcmMvYW5kcm9pZC9wcm92aWRlci9jdHMvQmxvY2tlZE51bWJlckJhY2t1cFJlc3RvcmVUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvcHJvdmlkZXIvc3JjL2FuZHJvaWQvcHJvdmlkZXIvY3RzL0Jsb2NrZWROdW1iZXJCYWNrdXBSZXN0b3JlVGVzdC5qYXZhCkBAIC0yMSw2ICsyMSw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuVXNlck1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5CbG9ja2VkTnVtYmVyQ29udHJhY3Q7CiBpbXBvcnQgYW5kcm9pZC50ZWxlY29tLkxvZzsKIApAQCAtNDQsNiArNDUsNyBAQAogICAgIHByaXZhdGUgU3RyaW5nIG1PbGRUcmFuc3BvcnQ7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1PbGRCYWNrdXBFbmFibGVkOwogICAgIHByaXZhdGUgYm9vbGVhbiBtSGFzRmVhdHVyZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzU3lzdGVtVXNlcjsKIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC01NCw4ICs1Niw5IEBACiAgICAgICAgIG1VaUF1dG9tYXRpb24gPSBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRVaUF1dG9tYXRpb24oKTsKIAogICAgICAgICBtSGFzRmVhdHVyZSA9IGlzRmVhdHVyZVN1cHBvcnRlZCgpOworICAgICAgICBtSXNTeXN0ZW1Vc2VyID0gaXNTeXN0ZW1Vc2VyKG1Db250ZXh0KTsKIAotICAgICAgICBpZiAobUhhc0ZlYXR1cmUpIHsKKyAgICAgICAgaWYgKG1IYXNGZWF0dXJlICYmIG1Jc1N5c3RlbVVzZXIpIHsKICAgICAgICAgICAgIFByb3ZpZGVyVGVzdFV0aWxzLnNldERlZmF1bHRTbXNBcHAodHJ1ZSwgbUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSwgbVVpQXV0b21hdGlvbik7CiAKICAgICAgICAgICAgIG1PbGRUcmFuc3BvcnQgPSBQcm92aWRlclRlc3RVdGlscy5zZXRCYWNrdXBUcmFuc3BvcnQoCkBAIC02OCw3ICs3MSw3IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAobUhhc0ZlYXR1cmUpIHsKKyAgICAgICAgaWYgKG1IYXNGZWF0dXJlICAmJiBtSXNTeXN0ZW1Vc2VyKSB7CiAgICAgICAgICAgICB3aXBlQmFja3VwKCk7CiAgICAgICAgICAgICBjbGVhckJsb2NrZWROdW1iZXJzKCk7CiAgICAgICAgICAgICBQcm92aWRlclRlc3RVdGlscy5zZXRCYWNrdXBFbmFibGVkKG1PbGRCYWNrdXBFbmFibGVkLCBtVWlBdXRvbWF0aW9uKTsKQEAgLTgwLDcgKzgzLDcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0QmFja3VwQW5kUmVzdG9yZUZvclNpbmdsZU51bWJlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIW1IYXNGZWF0dXJlKSB7CisgICAgICAgIGlmICghbUhhc0ZlYXR1cmUgfHwgIW1Jc1N5c3RlbVVzZXIpIHsKICAgICAgICAgICAgIExvZy5pKFRBRywgInNraXBwaW5nIEJsb2NrZWROdW1iZXJCYWNrdXBSZXN0b3JlVGVzdCIpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CkBAIC0xMDEsNyArMTA0LDcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0QmFja3VwQW5kUmVzdG9yZVdpdGhEZWxldGlvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIW1IYXNGZWF0dXJlKSB7CisgICAgICAgIGlmICghbUhhc0ZlYXR1cmUgfHwgIW1Jc1N5c3RlbVVzZXIpIHsKICAgICAgICAgICAgIExvZy5pKFRBRywgInNraXBwaW5nIEJsb2NrZWROdW1iZXJCYWNrdXBSZXN0b3JlVGVzdCIpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CkBAIC0xNzUsNCArMTc4LDggQEAKICAgICAgICAgUHJvdmlkZXJUZXN0VXRpbHMud2lwZUJhY2t1cChMT0NBTF9CQUNLVVBfQ09NUE9ORU5ULCBCTE9DS0VEX05VTUJFUlNfUFJPVklERVJfUEFDS0FHRSwKICAgICAgICAgICAgICAgICBtVWlBdXRvbWF0aW9uKTsKICAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU3lzdGVtVXNlcihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShVc2VyTWFuYWdlci5jbGFzcykuaXNTeXN0ZW1Vc2VyKCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcHJvdmlkZXIvc3JjL2FuZHJvaWQvcHJvdmlkZXIvY3RzL0Jsb2NrZWROdW1iZXJDb250cmFjdFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3Byb3ZpZGVyL3NyYy9hbmRyb2lkL3Byb3ZpZGVyL2N0cy9CbG9ja2VkTnVtYmVyQ29udHJhY3RUZXN0LmphdmEKaW5kZXggNTZhOTA1MS4uODdlOGIzZSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvcHJvdmlkZXIvc3JjL2FuZHJvaWQvcHJvdmlkZXIvY3RzL0Jsb2NrZWROdW1iZXJDb250cmFjdFRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9wcm92aWRlci9zcmMvYW5kcm9pZC9wcm92aWRlci9jdHMvQmxvY2tlZE51bWJlckNvbnRyYWN0VGVzdC5qYXZhCkBAIC0yNCw4ICsyNCwxMSBAQAogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLlVzZXJNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQmxvY2tlZE51bWJlckNvbnRyYWN0OwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQmxvY2tlZE51bWJlckNvbnRyYWN0LkJsb2NrZWROdW1iZXJzOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlRlbGVwaG9ueU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ2RkVGVzdDsKIApAQCAtNDQsOSArNDcsMTEgQEAKIC8vIHJ1biBjdHMgLW0gQ3RzUHJvdmlkZXJUZXN0Q2FzZXMgLS10ZXN0IGFuZHJvaWQucHJvdmlkZXIuY3RzLkJsb2NrZWROdW1iZXJDb250cmFjdFRlc3QKIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjQuMS4xL0MtMS0xLEMtMS0yIikKIHB1YmxpYyBjbGFzcyBCbG9ja2VkTnVtYmVyQ29udHJhY3RUZXN0IGV4dGVuZHMgVGVzdENhc2VUaGF0UnVuc0lmVGVsZXBob255SXNFbmFibGVkIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkJsb2NrZWROdW1iZXJDb250cmFjdFRlc3QiOwogICAgIHByaXZhdGUgQ29udGVudFJlc29sdmVyIG1Db250ZW50UmVzb2x2ZXI7CiAgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OwogICAgIHByaXZhdGUgQXJyYXlMaXN0PFVyaT4gbUFkZGVkVXJpczsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzU3lzdGVtVXNlcjsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEJMT0NLRURfTlVNQkVSU19QUk9KRUNUSU9OID0gbmV3IFN0cmluZ1tdewogICAgICAgICAgICAgQmxvY2tlZE51bWJlcnMuQ09MVU1OX09SSUdJTkFMX05VTUJFUiwKQEAgLTU4LDYgKzYzLDcgQEAKICAgICAgICAgbUNvbnRleHQgPSBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRDb250ZXh0KCk7CiAgICAgICAgIG1Db250ZW50UmVzb2x2ZXIgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKICAgICAgICAgbUFkZGVkVXJpcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBtSXNTeXN0ZW1Vc2VyID0gaXNTeXN0ZW1Vc2VyKG1Db250ZXh0KTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTczLDYgKzc5LDE3IEBACiAKICAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iNy40LjEuMS9DLTEtMiIpCiAgICAgcHVibGljIHZvaWQgdGVzdFByb3ZpZGVySW50ZXJhY3Rpb25zQXNSZWd1bGFyQXBwX2ZhaWxzKCkgeworICAgICAgICBpZiAoIW1Jc1N5c3RlbVVzZXIpIHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgInNraXBwaW5nIEJsb2NrZWROdW1iZXJDb250cmFjdFRlc3QiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBUZWxlcGhvbnlNYW5hZ2VyIHRlbGVwaG9ueU1hbmFnZXIgPSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKFRlbGVwaG9ueU1hbmFnZXIuY2xhc3MpOworICAgICAgICAvLyBEb24ndCBydW4gdGhpcyB0ZXN0IGlmIHdlJ3JlIGNhcnJpZXIgcHJpdmlsZWdlZC4KKyAgICAgICAgaWYgKHRlbGVwaG9ueU1hbmFnZXIuY2hlY2tDYXJyaWVyUHJpdmlsZWdlc0ZvclBhY2thZ2UobUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSkKKyAgICAgICAgICAgICAgICA9PSBUZWxlcGhvbnlNYW5hZ2VyLkNBUlJJRVJfUFJJVklMRUdFX1NUQVRVU19IQVNfQUNDRVNTKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKwogICAgICAgICB0cnkgewogICAgICAgICAgICAgbUFkZGVkVXJpcy5hZGQobUNvbnRlbnRSZXNvbHZlci5pbnNlcnQoCiAgICAgICAgICAgICAgICAgICAgIEJsb2NrZWROdW1iZXJzLkNPTlRFTlRfVVJJLCBnZXRDb250ZW50VmFsdWVzKCIxMjM0NTY3ODkwIikpKTsKQEAgLTEyMCw2ICsxMzcsMTAgQEAKIAogICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjQuMS4xL0NDLTEtMiIpCiAgICAgcHVibGljIHZvaWQgdGVzdEluc2VydEFuZEJsb2NrQ2hlY2tfc3VjY2VlZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFtSXNTeXN0ZW1Vc2VyKSB7CisgICAgICAgICAgICBMb2cuaShUQUcsICJza2lwcGluZyBCbG9ja2VkTnVtYmVyQ29udHJhY3RUZXN0Iik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KICAgICAgICAgc2V0RGVmYXVsdFNtc0FwcCh0cnVlKTsKIAogICAgICAgICBhc3NlcnRUcnVlKEJsb2NrZWROdW1iZXJDb250cmFjdC5jYW5DdXJyZW50VXNlckJsb2NrTnVtYmVycyhtQ29udGV4dCkpOwpAQCAtMTQ4LDYgKzE2OSwxMCBAQAogCiAgICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuNC4xLjEvQy0xLTIiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RVbmJsb2NrX3N1Y2NlZWRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghbUlzU3lzdGVtVXNlcikgeworICAgICAgICAgICAgTG9nLmkoVEFHLCAic2tpcHBpbmcgQmxvY2tlZE51bWJlckNvbnRyYWN0VGVzdCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAgICAgICAgIHNldERlZmF1bHRTbXNBcHAodHJ1ZSk7CiAKICAgICAgICAgLy8gVW5ibG9ja2luZyBub24tZXhpc3RlbnQgYmxvY2tlZCBudW1iZXIgc2hvdWxkIHJldHVybiAwLgpAQCAtMTY0LDYgKzE4OSwxMCBAQAogCiAgICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuNC4xLjEvQy0xLTIiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RJbnNlcnRfZmFpbHNXaXRoSW52YWxpZElucHV0cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIW1Jc1N5c3RlbVVzZXIpIHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgInNraXBwaW5nIEJsb2NrZWROdW1iZXJDb250cmFjdFRlc3QiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogICAgICAgICBzZXREZWZhdWx0U21zQXBwKHRydWUpOwogCiAgICAgICAgIHRyeSB7CkBAIC0yMDYsNiArMjM1LDEwIEBACiAKICAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iNy40LjEuMS9DLTEtMiIpCiAgICAgcHVibGljIHZvaWQgdGVzdFVwZGF0ZV9pc1Vuc3VwcG9ydGVkKCkgdGhyb3dzICBFeGNlcHRpb24geworICAgICAgICBpZiAoIW1Jc1N5c3RlbVVzZXIpIHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgInNraXBwaW5nIEJsb2NrZWROdW1iZXJDb250cmFjdFRlc3QiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogICAgICAgICBzZXREZWZhdWx0U21zQXBwKHRydWUpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgbUNvbnRlbnRSZXNvbHZlci51cGRhdGUoCkBAIC0yMTYsNiArMjQ5LDEwIEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdElzQmxvY2tlZF9yZXR1cm5zRmFsc2VGb3JOdWxsQW5kRW1wdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFtSXNTeXN0ZW1Vc2VyKSB7CisgICAgICAgICAgICBMb2cuaShUQUcsICJza2lwcGluZyBCbG9ja2VkTnVtYmVyQ29udHJhY3RUZXN0Iik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KICAgICAgICAgc2V0RGVmYXVsdFNtc0FwcCh0cnVlKTsKICAgICAgICAgYXNzZXJ0RmFsc2UoQmxvY2tlZE51bWJlckNvbnRyYWN0LmlzQmxvY2tlZChtQ29udGV4dCwgbnVsbCkpOwogICAgICAgICBhc3NlcnRGYWxzZShCbG9ja2VkTnVtYmVyQ29udHJhY3QuaXNCbG9ja2VkKG1Db250ZXh0LCAiIikpOwpAQCAtMjIzLDYgKzI2MCwxMCBAQAogCiAgICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuNC4xLjEvQy0xLTIiKQogICAgIHB1YmxpYyB2b2lkIHRlc3REZWxldGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFtSXNTeXN0ZW1Vc2VyKSB7CisgICAgICAgICAgICBMb2cuaShUQUcsICJza2lwcGluZyBCbG9ja2VkTnVtYmVyQ29udHJhY3RUZXN0Iik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KICAgICAgICAgc2V0RGVmYXVsdFNtc0FwcCh0cnVlKTsKIAogICAgICAgICBhc3NlcnRJbnNlcnRCbG9ja2VkTnVtYmVyU3VjY2VlZHMoIjEyMzQ1IiwgIisxMTIzNDUiKTsKQEAgLTI2NSw2ICszMDYsMTAgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlX2ZhaWxzT25JbnZhbGlkSW5wdXRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghbUlzU3lzdGVtVXNlcikgeworICAgICAgICAgICAgTG9nLmkoVEFHLCAic2tpcHBpbmcgQmxvY2tlZE51bWJlckNvbnRyYWN0VGVzdCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAgICAgICAgIHNldERlZmF1bHRTbXNBcHAodHJ1ZSk7CiAKICAgICAgICAgdHJ5IHsKQEAgLTI4Nyw2ICszMzIsMTAgQEAKIAogICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjQuMS4xL0MtMS0yIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvdmlkZXJOb3RpZmllc0NoYW5nZXNVc2luZ0NvbnRlbnRPYnNlcnZlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIW1Jc1N5c3RlbVVzZXIpIHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgInNraXBwaW5nIEJsb2NrZWROdW1iZXJDb250cmFjdFRlc3QiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogICAgICAgICBzZXREZWZhdWx0U21zQXBwKHRydWUpOwogCiAgICAgICAgIEN1cnNvciBjdXJzb3IgPSBtQ29udGVudFJlc29sdmVyLnF1ZXJ5KEJsb2NrZWROdW1iZXJzLkNPTlRFTlRfVVJJLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKQEAgLTMxNCw2ICszNjMsMTAgQEAKIAogICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjQuMS4xL0MtMS0yIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzaW5nTm9uRXhpc3RlbnRNZXRob2RfZmFpbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFtSXNTeXN0ZW1Vc2VyKSB7CisgICAgICAgICAgICBMb2cuaShUQUcsICJza2lwcGluZyBCbG9ja2VkTnVtYmVyQ29udHJhY3RUZXN0Iik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KICAgICAgICAgc2V0RGVmYXVsdFNtc0FwcCh0cnVlKTsKIAogICAgICAgICB0cnkgewpAQCAtMzYxLDQgKzQxNCw4IEBACiAgICAgICAgIFByb3ZpZGVyVGVzdFV0aWxzLnNldERlZmF1bHRTbXNBcHAoCiAgICAgICAgICAgICAgICAgc2V0VG9TbXNBcHAsIG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCksIGdldEluc3RydW1lbnRhdGlvbigpLmdldFVpQXV0b21hdGlvbigpKTsKICAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU3lzdGVtVXNlcihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShVc2VyTWFuYWdlci5jbGFzcykuaXNTeXN0ZW1Vc2VyKCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcHJvdmlkZXIvc3JjL2FuZHJvaWQvcHJvdmlkZXIvY3RzL0ZvbnRSZXF1ZXN0VGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvcHJvdmlkZXIvc3JjL2FuZHJvaWQvcHJvdmlkZXIvY3RzL0ZvbnRSZXF1ZXN0VGVzdC5qYXZhCmluZGV4IGQ5YjhhN2YuLmIwM2FjYWIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3Byb3ZpZGVyL3NyYy9hbmRyb2lkL3Byb3ZpZGVyL2N0cy9Gb250UmVxdWVzdFRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9wcm92aWRlci9zcmMvYW5kcm9pZC9wcm92aWRlci9jdHMvRm9udFJlcXVlc3RUZXN0LmphdmEKQEAgLTE2LDE4ICsxNiwxNSBAQAogcGFja2FnZSBhbmRyb2lkLnByb3ZpZGVyLmN0czsKIAogaW1wb3J0IHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0LmFzc2VydE5vdE51bGw7Ci1pbXBvcnQgc3RhdGljIGp1bml0LmZyYW1ld29yay5Bc3NlcnQuYXNzZXJ0TnVsbDsKLWltcG9ydCBzdGF0aWMganVuaXQuZnJhbWV3b3JrLkFzc2VydC5hc3NlcnRUcnVlOwogCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkZvbnRSZXF1ZXN0OwotaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5CYXNlNjQ7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3Byb3ZpZGVyL3NyYy9hbmRyb2lkL3Byb3ZpZGVyL2N0cy9Gb250c0NvbnRyYWN0VGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvcHJvdmlkZXIvc3JjL2FuZHJvaWQvcHJvdmlkZXIvY3RzL0ZvbnRzQ29udHJhY3RUZXN0LmphdmEKaW5kZXggZWE4ODM2OS4uYmE4Nzc3ZSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvcHJvdmlkZXIvc3JjL2FuZHJvaWQvcHJvdmlkZXIvY3RzL0ZvbnRzQ29udHJhY3RUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvcHJvdmlkZXIvc3JjL2FuZHJvaWQvcHJvdmlkZXIvY3RzL0ZvbnRzQ29udHJhY3RUZXN0LmphdmEKQEAgLTM2LDkgKzM2LDEwIEBACiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Gb250c0NvbnRyYWN0LkNvbHVtbnM7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Gb250c0NvbnRyYWN0LkZvbnRGYW1pbHlSZXN1bHQ7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Gb250c0NvbnRyYWN0LkZvbnRJbmZvOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hbm5vdGF0aW9ucy5HdWFyZGVkQnk7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3Byb3ZpZGVyL3NyYy9hbmRyb2lkL3Byb3ZpZGVyL2N0cy9NZWRpYVN0b3JlSW50ZW50c1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3Byb3ZpZGVyL3NyYy9hbmRyb2lkL3Byb3ZpZGVyL2N0cy9NZWRpYVN0b3JlSW50ZW50c1Rlc3QuamF2YQppbmRleCA1MjliMTc2Li4yMWQ0NzI3IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9wcm92aWRlci9zcmMvYW5kcm9pZC9wcm92aWRlci9jdHMvTWVkaWFTdG9yZUludGVudHNUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvcHJvdmlkZXIvc3JjL2FuZHJvaWQvcHJvdmlkZXIvY3RzL01lZGlhU3RvcmVJbnRlbnRzVGVzdC5qYXZhCkBAIC0zMyw3ICszMyw3IEBACiAgICAgICAgIExpc3Q8UmVzb2x2ZUluZm8+IHJlc29sdmVJbmZvTGlzdCA9IGdldENvbnRleHQoKQogICAgICAgICAgICAgICAgIC5nZXRQYWNrYWdlTWFuYWdlcigpLnF1ZXJ5SW50ZW50QWN0aXZpdGllcyhpbnRlbnQsIDApOwogICAgICAgICBhc3NlcnROb3ROdWxsKCJNaXNzaW5nIFJlc29sdmVJbmZvIiwgcmVzb2x2ZUluZm9MaXN0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiTm8gUmVzb2x2ZUluZm8gZm91bmQgZm9yICIgKyBpbnRlbnQudG9JbnNlY3VyZVN0cmluZygpLAorICAgICAgICBhc3NlcnRUcnVlKCJObyBSZXNvbHZlSW5mbyBmb3VuZCBmb3IgIiArIGludGVudC50b1N0cmluZygpLAogICAgICAgICAgICAgICAgIHJlc29sdmVJbmZvTGlzdC5zaXplKCkgPiAwKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3Byb3ZpZGVyL3NyYy9hbmRyb2lkL3Byb3ZpZGVyL2N0cy9NZWRpYVN0b3JlVWlUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9wcm92aWRlci9zcmMvYW5kcm9pZC9wcm92aWRlci9jdHMvTWVkaWFTdG9yZVVpVGVzdC5qYXZhCmluZGV4IDQzZDAwYzkuLjllNjVkMGIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3Byb3ZpZGVyL3NyYy9hbmRyb2lkL3Byb3ZpZGVyL2N0cy9NZWRpYVN0b3JlVWlUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvcHJvdmlkZXIvc3JjL2FuZHJvaWQvcHJvdmlkZXIvY3RzL01lZGlhU3RvcmVVaVRlc3QuamF2YQpAQCAtMTYsMTEgKzE2LDE5IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5wcm92aWRlci5jdHM7CiAKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkFDQ0VTU19DT0FSU0VfTE9DQVRJT047CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5BQ0NFU1NfRklORV9MT0NBVElPTjsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkNBTUVSQTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLlJFQURfRVhURVJOQUxfU1RPUkFHRTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLlJFQ09SRF9BVURJTzsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLldSSVRFX0VYVEVSTkFMX1NUT1JBR0U7CisKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LlVyaVBlcm1pc3Npb247CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VJbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUmVzb2x2ZUluZm87CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5FeGlmSW50ZXJmYWNlOwpAQCAtMzksMTggKzQ3LDIzIEBACiBpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QudWlhdXRvbWF0b3IuVWlPYmplY3QyOwogaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLlVpU2VsZWN0b3I7CiBpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QudWlhdXRvbWF0b3IuVW50aWw7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LmNvbnRlbnQuRmlsZVByb3ZpZGVyOwogaW1wb3J0IGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLnRleHQuZm9ybWF0LkRhdGVVdGlsczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKIAoraW1wb3J0IGFuZHJvaWR4LmNvcmUuY29udGVudC5GaWxlUHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKKwogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogCkBAIC0xMzksNiArMTUyLDEzIEBACiAgICAgICAgIHRyeSB7IG1EZXZpY2UuZmluZE9iamVjdChzZWwpLmNsaWNrKCk7IH0gY2F0Y2ggKFRocm93YWJsZSBpZ25vcmVkKSB7IH0KICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgbWF5YmVHcmFudFJ1bnRpbWVQZXJtaXNzaW9uKFN0cmluZyBwa2csIFNldDxTdHJpbmc+IHJlcXVlc3RlZCwgU3RyaW5nIHBlcm1pc3Npb24pIHsKKyAgICAgICAgaWYgKHJlcXVlc3RlZC5jb250YWlucyhwZXJtaXNzaW9uKSkgeworICAgICAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VWlBdXRvbWF0aW9uKCkKKyAgICAgICAgICAgICAgICAgICAgLmdyYW50UnVudGltZVBlcm1pc3Npb24ocGtnLCBwZXJtaXNzaW9uKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qKgogICAgICAqIFZlcmlmeSB0aGF0IHdob2V2ZXIgaGFuZGxlcyB7QGxpbmsgTWVkaWFTdG9yZSNBQ1RJT05fSU1BR0VfQ0FQVFVSRX0gY2FuCiAgICAgICogY29ycmVjdGx5IHdyaXRlIHRoZSBjb250ZW50cyBpbnRvIGEgcGFzc2VkIHtAY29kZSBjb250ZW50Oi8vfSBVcmkuCkBAIC0xNjUsMTkgKzE4NSwxOCBAQAogICAgICAgICBmaW5hbCBTdHJpbmcgcGtnID0gcmkuYWN0aXZpdHlJbmZvLnBhY2thZ2VOYW1lOwogICAgICAgICBMb2cuZChUQUcsICJXZSdyZSBwcm9iYWJseSBsYXVuY2hpbmcgIiArIHJpKTsKIAorICAgICAgICBmaW5hbCBQYWNrYWdlSW5mbyBwaSA9IGNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKS5nZXRQYWNrYWdlSW5mbyhwa2csCisgICAgICAgICAgICAgICAgUGFja2FnZU1hbmFnZXIuR0VUX1BFUk1JU1NJT05TKTsKKyAgICAgICAgZmluYWwgU2V0PFN0cmluZz4gcmVxID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICByZXEuYWRkQWxsKEFycmF5cy5hc0xpc3QocGkucmVxdWVzdGVkUGVybWlzc2lvbnMpKTsKKwogICAgICAgICAvLyBHcmFudCB0aGVtIGFsbCB0aGUgcGVybWlzc2lvbnMgdGhleSBtaWdodCB3YW50Ci0gICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpLmdldFVpQXV0b21hdGlvbigpLmV4ZWN1dGVTaGVsbENvbW1hbmQoInBtIGdyYW50ICIKLSAgICAgICAgICAgICAgICArIHBrZyArICIgIiArIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5DQU1FUkEpOwotICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRVaUF1dG9tYXRpb24oKS5leGVjdXRlU2hlbGxDb21tYW5kKCJwbSBncmFudCAiCi0gICAgICAgICAgICAgICAgKyBwa2cgKyAiICIgKyBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQUNDRVNTX0NPQVJTRV9MT0NBVElPTik7Ci0gICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpLmdldFVpQXV0b21hdGlvbigpLmV4ZWN1dGVTaGVsbENvbW1hbmQoInBtIGdyYW50ICIKLSAgICAgICAgICAgICAgICArIHBrZyArICIgIiArIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5BQ0NFU1NfRklORV9MT0NBVElPTik7Ci0gICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpLmdldFVpQXV0b21hdGlvbigpLmV4ZWN1dGVTaGVsbENvbW1hbmQoInBtIGdyYW50ICIKLSAgICAgICAgICAgICAgICArIHBrZyArICIgIiArIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5SRUNPUkRfQVVESU8pOwotICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRVaUF1dG9tYXRpb24oKS5leGVjdXRlU2hlbGxDb21tYW5kKCJwbSBncmFudCAiCi0gICAgICAgICAgICAgICAgKyBwa2cgKyAiICIgKyBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uUkVBRF9FWFRFUk5BTF9TVE9SQUdFKTsKLSAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VWlBdXRvbWF0aW9uKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZCgicG0gZ3JhbnQgIgotICAgICAgICAgICAgICAgICsgcGtnICsgIiAiICsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLldSSVRFX0VYVEVSTkFMX1NUT1JBR0UpOworICAgICAgICBtYXliZUdyYW50UnVudGltZVBlcm1pc3Npb24ocGtnLCByZXEsIENBTUVSQSk7CisgICAgICAgIG1heWJlR3JhbnRSdW50aW1lUGVybWlzc2lvbihwa2csIHJlcSwgQUNDRVNTX0NPQVJTRV9MT0NBVElPTik7CisgICAgICAgIG1heWJlR3JhbnRSdW50aW1lUGVybWlzc2lvbihwa2csIHJlcSwgQUNDRVNTX0ZJTkVfTE9DQVRJT04pOworICAgICAgICBtYXliZUdyYW50UnVudGltZVBlcm1pc3Npb24ocGtnLCByZXEsIFJFQ09SRF9BVURJTyk7CisgICAgICAgIG1heWJlR3JhbnRSdW50aW1lUGVybWlzc2lvbihwa2csIHJlcSwgUkVBRF9FWFRFUk5BTF9TVE9SQUdFKTsKKyAgICAgICAgbWF5YmVHcmFudFJ1bnRpbWVQZXJtaXNzaW9uKHBrZywgcmVxLCBXUklURV9FWFRFUk5BTF9TVE9SQUdFKTsKICAgICAgICAgU3lzdGVtQ2xvY2suc2xlZXAoRGF0ZVV0aWxzLlNFQ09ORF9JTl9NSUxMSVMpOwogCiAgICAgICAgIG1BY3Rpdml0eS5zdGFydEFjdGl2aXR5Rm9yUmVzdWx0KGludGVudCwgUkVRVUVTVF9DT0RFKTsKQEAgLTI0OCw3ICsyNjcsOCBAQAogCiAgICAgcHJpdmF0ZSBib29sZWFuIHN1cHBvcnRzSGFyZHdhcmUoKSB7CiAgICAgICAgIGZpbmFsIFBhY2thZ2VNYW5hZ2VyIHBtID0gZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VNYW5hZ2VyKCk7Ci0gICAgICAgIHJldHVybiAhcG0uaGFzU3lzdGVtRmVhdHVyZSgiYW5kcm9pZC5oYXJkd2FyZS50eXBlLnRlbGV2aXNpb24iKQorICAgICAgICByZXR1cm4gIXBtLmhhc1N5c3RlbUZlYXR1cmUoImFuZHJvaWQuaGFyZHdhcmUudHlwZS5hdXRvbW90aXZlIikKKyAgICAgICAgICAgICAgICAmJiAhcG0uaGFzU3lzdGVtRmVhdHVyZSgiYW5kcm9pZC5oYXJkd2FyZS50eXBlLnRlbGV2aXNpb24iKQogICAgICAgICAgICAgICAgICYmICFwbS5oYXNTeXN0ZW1GZWF0dXJlKCJhbmRyb2lkLmhhcmR3YXJlLnR5cGUud2F0Y2giKTsKICAgICB9CiAKQEAgLTI2MCw3ICsyODAsNyBAQAogICAgICAgICBkb2N1bWVudHMubWtkaXJzKCk7CiAgICAgICAgIGFzc2VydFRydWUoZG9jdW1lbnRzLmlzRGlyZWN0b3J5KCkpOwogCi0gICAgICAgIG1GaWxlID0gbmV3IEZpbGUoZG9jdW1lbnRzLCAidGVzdC50eHQiKTsKKyAgICAgICAgbUZpbGUgPSBuZXcgRmlsZShkb2N1bWVudHMsICJ0ZXN0LmpwZyIpOwogICAgICAgICB0cnkgKE91dHB1dFN0cmVhbSBvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG1GaWxlKSkgewogICAgICAgICAgICAgb3Mud3JpdGUoQ09OVEVOVC5nZXRCeXRlcygpKTsKICAgICAgICAgfQpAQCAtMjY5LDcgKzI4OSw3IEBACiAgICAgICAgIE1lZGlhU2Nhbm5lckNvbm5lY3Rpb24uc2NhbkZpbGUoCiAgICAgICAgICAgICAgICAgbUFjdGl2aXR5LAogICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXXsgbUZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgfSwKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW117ICJwbGFpbi90ZXh0IiB9LAorICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXXsgImltYWdlL2pwZWciIH0sCiAgICAgICAgICAgICAgICAgKFN0cmluZyBwYXRoLCBVcmkgdXJpKSAtPiBvblNjYW5Db21wbGV0ZWQodXJpLCBsYXRjaCkKICAgICAgICAgKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3Byb3ZpZGVyL3NyYy9hbmRyb2lkL3Byb3ZpZGVyL2N0cy9NZWRpYVN0b3JlX0ltYWdlc19UaHVtYm5haWxzVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvcHJvdmlkZXIvc3JjL2FuZHJvaWQvcHJvdmlkZXIvY3RzL01lZGlhU3RvcmVfSW1hZ2VzX1RodW1ibmFpbHNUZXN0LmphdmEKaW5kZXggYjBmNTQyNi4uZjU3YWYzMiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvcHJvdmlkZXIvc3JjL2FuZHJvaWQvcHJvdmlkZXIvY3RzL01lZGlhU3RvcmVfSW1hZ2VzX1RodW1ibmFpbHNUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvcHJvdmlkZXIvc3JjL2FuZHJvaWQvcHJvdmlkZXIvY3RzL01lZGlhU3RvcmVfSW1hZ2VzX1RodW1ibmFpbHNUZXN0LmphdmEKQEAgLTI3NCw2ICsyNzQsODcgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1Db250ZW50UmVzb2x2ZXIuZGVsZXRlKHVyaSwgbnVsbCwgbnVsbCkpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHRlc3RUaHVtYm5haWxHZW5lcmF0aW9uQW5kQ2xlYW51cCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBpbnNlcnQgYW4gaW1hZ2UKKyAgICAgICAgQml0bWFwIHNyYyA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UobUNvbnRleHQuZ2V0UmVzb3VyY2VzKCksIFIucmF3LnNjZW5lcnkpOworICAgICAgICBVcmkgdXJpID0gVXJpLnBhcnNlKE1lZGlhLmluc2VydEltYWdlKG1Db250ZW50UmVzb2x2ZXIsIHNyYywgInRlc3QiLCAidGVzdCBkZXNjcmlwdGlvbiIpKTsKKworICAgICAgICAvLyBxdWVyeSBpdHMgdGh1bWJuYWlsCisgICAgICAgIEN1cnNvciBjID0gbUNvbnRlbnRSZXNvbHZlci5xdWVyeSgKKyAgICAgICAgICAgICAgICBUaHVtYm5haWxzLkVYVEVSTkFMX0NPTlRFTlRfVVJJLAorICAgICAgICAgICAgICAgIG5ldyBTdHJpbmcgW10ge1RodW1ibmFpbHMuREFUQX0sCisgICAgICAgICAgICAgICAgImltYWdlX2lkPT8iLAorICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7dXJpLmdldExhc3RQYXRoU2VnbWVudCgpfSwKKyAgICAgICAgICAgICAgICBudWxsIC8qIHNvcnQgKi8KKyAgICAgICAgICAgICAgICApOworICAgICAgICBhc3NlcnRUcnVlKCJjb3VsZG4ndCBmaW5kIHRodW1ibmFpbCIsIGMubW92ZVRvTmV4dCgpKTsKKyAgICAgICAgU3RyaW5nIHBhdGggPSBjLmdldFN0cmluZygwKTsKKyAgICAgICAgYy5jbG9zZSgpOworICAgICAgICBhc3NlcnRUcnVlKCJ0aHVtYm5haWwgZG9lcyBub3QgZXhpc3QiLCBuZXcgRmlsZShwYXRoKS5leGlzdHMoKSk7CisKKyAgICAgICAgLy8gZGVsZXRlIHRoZSBzb3VyY2UgaW1hZ2UgYW5kIGNoZWNrIHRoYXQgdGhlIHRodW1ibmFpbCBpcyBnb25lIHRvbworICAgICAgICBtQ29udGVudFJlc29sdmVyLmRlbGV0ZSh1cmksIG51bGwgLyogd2hlcmUgY2xhdXNlICovLCBudWxsIC8qIHdoZXJlIGFyZ3MgKi8pOworICAgICAgICBhc3NlcnRGYWxzZSgidGh1bWJuYWlsIHN0aWxsIGV4aXN0cyBhZnRlciBzb3VyY2UgZmlsZSBkZWxldGUiLCBuZXcgRmlsZShwYXRoKS5leGlzdHMoKSk7CisKKyAgICAgICAgLy8gaW5zZXJ0IGFnYWluCisgICAgICAgIHVyaSA9IFVyaS5wYXJzZShNZWRpYS5pbnNlcnRJbWFnZShtQ29udGVudFJlc29sdmVyLCBzcmMsICJ0ZXN0IiwgInRlc3QgZGVzY3JpcHRpb24iKSk7CisKKyAgICAgICAgLy8gcXVlcnkgaXRzIHRodW1ibmFpbCBhZ2FpbgorICAgICAgICBjID0gbUNvbnRlbnRSZXNvbHZlci5xdWVyeSgKKyAgICAgICAgICAgICAgICBUaHVtYm5haWxzLkVYVEVSTkFMX0NPTlRFTlRfVVJJLAorICAgICAgICAgICAgICAgIG5ldyBTdHJpbmcgW10ge1RodW1ibmFpbHMuREFUQX0sCisgICAgICAgICAgICAgICAgImltYWdlX2lkPT8iLAorICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7dXJpLmdldExhc3RQYXRoU2VnbWVudCgpfSwKKyAgICAgICAgICAgICAgICBudWxsIC8qIHNvcnRPcmRlciAqLworICAgICAgICAgICAgICAgICk7CisgICAgICAgIGFzc2VydFRydWUoImNvdWxkbid0IGZpbmQgdGh1bWJuYWlsIiwgYy5tb3ZlVG9OZXh0KCkpOworICAgICAgICBwYXRoID0gYy5nZXRTdHJpbmcoMCk7CisgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgidGh1bWJuYWlsIGRvZXMgbm90IGV4aXN0IiwgbmV3IEZpbGUocGF0aCkuZXhpc3RzKCkpOworCisgICAgICAgIC8vIHVwZGF0ZSB0aGUgbWVkaWEgdHlwZQorICAgICAgICBDb250ZW50VmFsdWVzIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7CisgICAgICAgIHZhbHVlcy5wdXQoIm1lZGlhX3R5cGUiLCAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIG51bWJlciBvZiB1cGRhdGVkIHJvd3MiLAorICAgICAgICAgICAgICAgIDEsIG1Db250ZW50UmVzb2x2ZXIudXBkYXRlKHVyaSwgdmFsdWVzLCBudWxsIC8qIHdoZXJlICovLCBudWxsIC8qIHdoZXJlIGFyZ3MgKi8pKTsKKworICAgICAgICAvLyBpbWFnZSB3YXMgbWFya2VkIGFzIHJlZ3VsYXIgZmlsZSBpbiB0aGUgZGF0YWJhc2UsIHdoaWNoIHNob3VsZCBoYXZlIGRlbGV0ZWQgaXRzIHRodW1ibmFpbAorCisgICAgICAgIC8vIHF1ZXJ5IGl0cyB0aHVtYm5haWwgYWdhaW4KKyAgICAgICAgYyA9IG1Db250ZW50UmVzb2x2ZXIucXVlcnkoCisgICAgICAgICAgICAgICAgVGh1bWJuYWlscy5FWFRFUk5BTF9DT05URU5UX1VSSSwKKyAgICAgICAgICAgICAgICBuZXcgU3RyaW5nIFtdIHtUaHVtYm5haWxzLkRBVEF9LAorICAgICAgICAgICAgICAgICJpbWFnZV9pZD0/IiwKKyAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10ge3VyaS5nZXRMYXN0UGF0aFNlZ21lbnQoKX0sCisgICAgICAgICAgICAgICAgbnVsbCAvKiBzb3J0ICovCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgaWYgKGMgIT0gbnVsbCkgeworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoInRodW1ibmFpbCBlbnRyeSBleGlzdHMgZm9yIG5vbi10aHVtYm5haWwgZmlsZSIsIGMubW92ZVRvTmV4dCgpKTsKKyAgICAgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRGYWxzZSgidGh1bWJuYWlsIHJlbWFpbnMgYWZ0ZXIgc291cmNlIGZpbGUgdHlwZSBjaGFuZ2UiLCBuZXcgRmlsZShwYXRoKS5leGlzdHMoKSk7CisKKyAgICAgICAgLy8gY2hlY2sgc291cmNlIG5vIGxvbmdlciBleGlzdHMgYXMgaW1hZ2UKKyAgICAgICAgYyA9IG1Db250ZW50UmVzb2x2ZXIucXVlcnkodXJpLAorICAgICAgICAgICAgICAgIG51bGwgLyogcHJvamVjdGlvbiAqLywgbnVsbCAvKiB3aGVyZSAqLywgbnVsbCAvKiB3aGVyZSBhcmdzICovLCBudWxsIC8qIHNvcnQgKi8pOworICAgICAgICBhc3NlcnRGYWxzZSgic291cmNlIGVudHJ5IHNob3VsZCBiZSBnb25lIiwgYy5tb3ZlVG9OZXh0KCkpOworICAgICAgICBjLmNsb3NlKCk7CisKKyAgICAgICAgLy8gY2hlY2sgc291cmNlIHN0aWxsIGV4aXN0cyBhcyBmaWxlCisgICAgICAgIFVyaSBmaWxlVXJpID0gQ29udGVudFVyaXMud2l0aEFwcGVuZGVkSWQoCisgICAgICAgICAgICAgICAgTWVkaWFTdG9yZS5GaWxlcy5nZXRDb250ZW50VXJpKCJleHRlcm5hbCIpLAorICAgICAgICAgICAgICAgIExvbmcudmFsdWVPZih1cmkuZ2V0TGFzdFBhdGhTZWdtZW50KCkpKTsKKyAgICAgICAgYyA9IG1Db250ZW50UmVzb2x2ZXIucXVlcnkoZmlsZVVyaSwKKyAgICAgICAgICAgICAgICBudWxsIC8qIHByb2plY3Rpb24gKi8sIG51bGwgLyogd2hlcmUgKi8sIG51bGwgLyogd2hlcmUgYXJncyAqLywgbnVsbCAvKiBzb3J0ICovKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgic291cmNlIGVudHJ5IGlzIGdvbmUiLCBjLm1vdmVUb05leHQoKSk7CisgICAgICAgIFN0cmluZyBzb3VyY2VQYXRoID0gYy5nZXRTdHJpbmcoYy5nZXRDb2x1bW5JbmRleCgiX2RhdGEiKSk7CisgICAgICAgIGMuY2xvc2UoKTsKKworICAgICAgICAvLyBjbGVhbiB1cAorICAgICAgICBtQ29udGVudFJlc29sdmVyLmRlbGV0ZSh1cmksIG51bGwgLyogd2hlcmUgKi8sIG51bGwgLyogd2hlcmUgYXJncyAqLyk7CisgICAgICAgIG5ldyBGaWxlKHNvdXJjZVBhdGgpLmRlbGV0ZSgpOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHRlc3RTdG9yZUltYWdlc01lZGlhSW50ZXJuYWwoKSB7CiAgICAgICAgIC8vIGNhbiBub3QgaW5zZXJ0IGFueSBkYXRhLCBzbyBvdGhlciBvcGVyYXRpb25zIGNhbiBub3QgYmUgdGVzdGVkCiAgICAgICAgIHRyeSB7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9wcm92aWRlci9zcmMvYW5kcm9pZC9wcm92aWRlci9jdHMvTWVkaWFTdG9yZV9WaWRlb19UaHVtYm5haWxzVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvcHJvdmlkZXIvc3JjL2FuZHJvaWQvcHJvdmlkZXIvY3RzL01lZGlhU3RvcmVfVmlkZW9fVGh1bWJuYWlsc1Rlc3QuamF2YQppbmRleCAyNmYzNTNmLi5jMjU2NzIyIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9wcm92aWRlci9zcmMvYW5kcm9pZC9wcm92aWRlci9jdHMvTWVkaWFTdG9yZV9WaWRlb19UaHVtYm5haWxzVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3Byb3ZpZGVyL3NyYy9hbmRyb2lkL3Byb3ZpZGVyL2N0cy9NZWRpYVN0b3JlX1ZpZGVvX1RodW1ibmFpbHNUZXN0LmphdmEKQEAgLTI2LDYgKzI2LDcgQEAKIGltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29kZWNMaXN0OwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKIGltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuTWVkaWFTdG9yZS5GaWxlczsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLk1lZGlhU3RvcmUuVmlkZW8uTWVkaWE7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NZWRpYVN0b3JlLlZpZGVvLlRodW1ibmFpbHM7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NZWRpYVN0b3JlLlZpZGVvLlZpZGVvQ29sdW1uczsKQEAgLTEyMyw2ICsxMjQsMTAxIEBACiAgICAgICAgIGFzc2VydEVxdWFscygxLCBtUmVzb2x2ZXIuZGVsZXRlKHZpZGVvVXJpLCBudWxsLCBudWxsKSk7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgdGVzdFRodW1ibmFpbEdlbmVyYXRpb25BbmRDbGVhbnVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKCFoYXNDb2RlYygpKSB7CisgICAgICAgICAgICAvLyB3ZSBkb24ndCBzdXBwb3J0IHZpZGVvLCBzbyBubyBuZWVkIHRvIHJ1biB0aGUgdGVzdAorICAgICAgICAgICAgTG9nLmkoVEFHLCAiU0tJUFBJTkcgdGVzdFRodW1ibmFpbEdlbmVyYXRpb25BbmRDbGVhbnVwKCk6IGNvZGVjIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGluc2VydCBhIHZpZGVvCisgICAgICAgIFVyaSB1cmkgPSBpbnNlcnRWaWRlbygpOworCisgICAgICAgIC8vIHJlcXVlc3QgdGh1bWJuYWlsIGNyZWF0aW9uCisgICAgICAgIFRodW1ibmFpbHMuZ2V0VGh1bWJuYWlsKG1SZXNvbHZlciwgTG9uZy52YWx1ZU9mKHVyaS5nZXRMYXN0UGF0aFNlZ21lbnQoKSksCisgICAgICAgICAgICAgICAgVGh1bWJuYWlscy5NSU5JX0tJTkQsIG51bGwgLyogb3B0aW9ucyAqLyk7CisKKyAgICAgICAgLy8gcXVlcnkgdGhlIHRodW1ibmFpbAorICAgICAgICBDdXJzb3IgYyA9IG1SZXNvbHZlci5xdWVyeSgKKyAgICAgICAgICAgICAgICBUaHVtYm5haWxzLkVYVEVSTkFMX0NPTlRFTlRfVVJJLAorICAgICAgICAgICAgICAgIG5ldyBTdHJpbmcgW10ge1RodW1ibmFpbHMuREFUQX0sCisgICAgICAgICAgICAgICAgInZpZGVvX2lkPT8iLAorICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7dXJpLmdldExhc3RQYXRoU2VnbWVudCgpfSwKKyAgICAgICAgICAgICAgICBudWxsIC8qIHNvcnQgKi8KKyAgICAgICAgICAgICAgICApOworICAgICAgICBhc3NlcnRUcnVlKCJjb3VsZG4ndCBmaW5kIHRodW1ibmFpbCIsIGMubW92ZVRvTmV4dCgpKTsKKyAgICAgICAgU3RyaW5nIHBhdGggPSBjLmdldFN0cmluZygwKTsKKyAgICAgICAgYy5jbG9zZSgpOworICAgICAgICBhc3NlcnRUcnVlKCJ0aHVtYm5haWwgZG9lcyBub3QgZXhpc3QiLCBuZXcgRmlsZShwYXRoKS5leGlzdHMoKSk7CisKKyAgICAgICAgLy8gZGVsZXRlIHRoZSBzb3VyY2UgdmlkZW8gYW5kIGNoZWNrIHRoYXQgdGhlIHRodW1ibmFpbCBpcyBnb25lIHRvbworICAgICAgICBtUmVzb2x2ZXIuZGVsZXRlKHVyaSwgbnVsbCAvKiB3aGVyZSBjbGF1c2UgKi8sIG51bGwgLyogd2hlcmUgYXJncyAqLyk7CisgICAgICAgIGFzc2VydEZhbHNlKCJ0aHVtYm5haWwgc3RpbGwgZXhpc3RzIGFmdGVyIHNvdXJjZSBmaWxlIGRlbGV0ZSIsIG5ldyBGaWxlKHBhdGgpLmV4aXN0cygpKTsKKworICAgICAgICAvLyBpbnNlcnQgYWdhaW4KKyAgICAgICAgdXJpID0gaW5zZXJ0VmlkZW8oKTsKKworICAgICAgICAvLyByZXF1ZXN0IHRodW1ibmFpbCBjcmVhdGlvbgorICAgICAgICBUaHVtYm5haWxzLmdldFRodW1ibmFpbChtUmVzb2x2ZXIsIExvbmcudmFsdWVPZih1cmkuZ2V0TGFzdFBhdGhTZWdtZW50KCkpLAorICAgICAgICAgICAgICAgIFRodW1ibmFpbHMuTUlOSV9LSU5ELCBudWxsKTsKKworICAgICAgICAvLyBxdWVyeSBpdHMgdGh1bWJuYWlsIGFnYWluCisgICAgICAgIGMgPSBtUmVzb2x2ZXIucXVlcnkoCisgICAgICAgICAgICAgICAgVGh1bWJuYWlscy5FWFRFUk5BTF9DT05URU5UX1VSSSwKKyAgICAgICAgICAgICAgICBuZXcgU3RyaW5nIFtdIHtUaHVtYm5haWxzLkRBVEF9LAorICAgICAgICAgICAgICAgICJ2aWRlb19pZD0/IiwKKyAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10ge3VyaS5nZXRMYXN0UGF0aFNlZ21lbnQoKX0sCisgICAgICAgICAgICAgICAgbnVsbCAvKiBzb3J0ICovCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiY291bGRuJ3QgZmluZCB0aHVtYm5haWwiLCBjLm1vdmVUb05leHQoKSk7CisgICAgICAgIHBhdGggPSBjLmdldFN0cmluZygwKTsKKyAgICAgICAgYy5jbG9zZSgpOworICAgICAgICBhc3NlcnRUcnVlKCJ0aHVtYm5haWwgZG9lcyBub3QgZXhpc3QiLCBuZXcgRmlsZShwYXRoKS5leGlzdHMoKSk7CisKKyAgICAgICAgLy8gdXBkYXRlIHRoZSBtZWRpYSB0eXBlCisgICAgICAgIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKKyAgICAgICAgdmFsdWVzLnB1dCgibWVkaWFfdHlwZSIsIDApOworICAgICAgICBhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgbnVtYmVyIG9mIHVwZGF0ZWQgcm93cyIsCisgICAgICAgICAgICAgICAgMSwgbVJlc29sdmVyLnVwZGF0ZSh1cmksIHZhbHVlcywgbnVsbCAvKiB3aGVyZSAqLywgbnVsbCAvKiB3aGVyZSBhcmdzICovKSk7CisKKyAgICAgICAgLy8gdmlkZW8gd2FzIG1hcmtlZCBhcyByZWd1bGFyIGZpbGUgaW4gdGhlIGRhdGFiYXNlLCB3aGljaCBzaG91bGQgaGF2ZSBkZWxldGVkIGl0cyB0aHVtYm5haWwKKworICAgICAgICAvLyBxdWVyeSBpdHMgdGh1bWJuYWlsIGFnYWluCisgICAgICAgIGMgPSBtUmVzb2x2ZXIucXVlcnkoCisgICAgICAgICAgICAgICAgVGh1bWJuYWlscy5FWFRFUk5BTF9DT05URU5UX1VSSSwKKyAgICAgICAgICAgICAgICBuZXcgU3RyaW5nIFtdIHtUaHVtYm5haWxzLkRBVEF9LAorICAgICAgICAgICAgICAgICJ2aWRlb19pZD0/IiwKKyAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10ge3VyaS5nZXRMYXN0UGF0aFNlZ21lbnQoKX0sCisgICAgICAgICAgICAgICAgbnVsbCAvKiBzb3J0ICovCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgaWYgKGMgIT0gbnVsbCkgeworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoInRodW1ibmFpbCBlbnRyeSBleGlzdHMgZm9yIG5vbi10aHVtYm5haWwgZmlsZSIsIGMubW92ZVRvTmV4dCgpKTsKKyAgICAgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRGYWxzZSgidGh1bWJuYWlsIHJlbWFpbnMgYWZ0ZXIgc291cmNlIGZpbGUgdHlwZSBjaGFuZ2UiLCBuZXcgRmlsZShwYXRoKS5leGlzdHMoKSk7CisKKyAgICAgICAgLy8gY2hlY2sgc291cmNlIG5vIGxvbmdlciBleGlzdHMgYXMgdmlkZW8KKyAgICAgICAgYyA9IG1SZXNvbHZlci5xdWVyeSh1cmksCisgICAgICAgICAgICAgICAgbnVsbCAvKiBwcm9qZWN0aW9uICovLCBudWxsIC8qIHdoZXJlICovLCBudWxsIC8qIHdoZXJlIGFyZ3MgKi8sIG51bGwgLyogc29ydCAqLyk7CisgICAgICAgIGFzc2VydEZhbHNlKCJzb3VyY2UgZW50cnkgc2hvdWxkIGJlIGdvbmUiLCBjLm1vdmVUb05leHQoKSk7CisgICAgICAgIGMuY2xvc2UoKTsKKworICAgICAgICAvLyBjaGVjayBzb3VyY2Ugc3RpbGwgZXhpc3RzIGFzIGZpbGUKKyAgICAgICAgVXJpIGZpbGVVcmkgPSBDb250ZW50VXJpcy53aXRoQXBwZW5kZWRJZCgKKyAgICAgICAgICAgICAgICBGaWxlcy5nZXRDb250ZW50VXJpKCJleHRlcm5hbCIpLAorICAgICAgICAgICAgICAgIExvbmcudmFsdWVPZih1cmkuZ2V0TGFzdFBhdGhTZWdtZW50KCkpKTsKKyAgICAgICAgYyA9IG1SZXNvbHZlci5xdWVyeShmaWxlVXJpLAorICAgICAgICAgICAgICAgIG51bGwgLyogcHJvamVjdGlvbiAqLywgbnVsbCAvKiB3aGVyZSAqLywgbnVsbCAvKiB3aGVyZSBhcmdzICovLCBudWxsIC8qIHNvcnQgKi8pOworICAgICAgICBhc3NlcnRUcnVlKCJzb3VyY2UgZW50cnkgc2hvdWxkIGJlIGdvbmUiLCBjLm1vdmVUb05leHQoKSk7CisgICAgICAgIFN0cmluZyBzb3VyY2VQYXRoID0gYy5nZXRTdHJpbmcoYy5nZXRDb2x1bW5JbmRleCgiX2RhdGEiKSk7CisgICAgICAgIGMuY2xvc2UoKTsKKworICAgICAgICAvLyBjbGVhbiB1cAorICAgICAgICBtUmVzb2x2ZXIuZGVsZXRlKHVyaSwgbnVsbCAvKiB3aGVyZSAqLywgbnVsbCAvKiB3aGVyZSBhcmdzICovKTsKKyAgICAgICAgbmV3IEZpbGUoc291cmNlUGF0aCkuZGVsZXRlKCk7CisgICAgfQorCiAgICAgcHJpdmF0ZSBVcmkgaW5zZXJ0VmlkZW8oKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShFbnZpcm9ubWVudC5nZXRFeHRlcm5hbFN0b3JhZ2VEaXJlY3RvcnkoKSwgInRlc3RWaWRlby4zZ3AiKTsKICAgICAgICAgLy8gY2xlYW4gdXAgYW55IHBvdGVudGlhbCBsZWZ0IG92ZXIgZW50cmllcyBmcm9tIGEgcHJldmlvdXMgYWJvcnRlZCBydW4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3Byb3ZpZGVyL3NyYy9hbmRyb2lkL3Byb3ZpZGVyL2N0cy9TZXR0aW5nc19TeXN0ZW1UZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9wcm92aWRlci9zcmMvYW5kcm9pZC9wcm92aWRlci9jdHMvU2V0dGluZ3NfU3lzdGVtVGVzdC5qYXZhCmluZGV4IGJhZGM4OGUuLmJiZGY3MTQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3Byb3ZpZGVyL3NyYy9hbmRyb2lkL3Byb3ZpZGVyL2N0cy9TZXR0aW5nc19TeXN0ZW1UZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvcHJvdmlkZXIvc3JjL2FuZHJvaWQvcHJvdmlkZXIvY3RzL1NldHRpbmdzX1N5c3RlbVRlc3QuamF2YQpAQCAtMTQ5LDYgKzE0OSwxMSBAQAogICAgICAgICAgICAgYy5jbG9zZSgpOwogCiAgICAgICAgICAgICAvLyByZXN0b3JlIHRoZSBmb250U2NhbGUKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gRGVsYXkgaGVscHMgQWN0aXZpdHlNYW5hZ2VyIGluIGNvbXBsZXRpbmcgaXRzIHByZXZpb3VzIGZvbnQtY2hhbmdlIHByb2Nlc3NpbmcuCisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpe30KKwogICAgICAgICAgICAgY2ZnLmZvbnRTY2FsZSA9IHN0b3JlOwogICAgICAgICAgICAgYXNzZXJ0VHJ1ZShTeXN0ZW0ucHV0Q29uZmlndXJhdGlvbihjciwgY2ZnKSk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3Byb3ZpZGVyL3NyYy9hbmRyb2lkL3Byb3ZpZGVyL2N0cy9jb250YWN0cy9Db250YWN0c0NvbnRyYWN0X0RhdGFUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9wcm92aWRlci9zcmMvYW5kcm9pZC9wcm92aWRlci9jdHMvY29udGFjdHMvQ29udGFjdHNDb250cmFjdF9EYXRhVGVzdC5qYXZhCmluZGV4IDMxYWZjZTkuLmRmOTRiZGEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3Byb3ZpZGVyL3NyYy9hbmRyb2lkL3Byb3ZpZGVyL2N0cy9jb250YWN0cy9Db250YWN0c0NvbnRyYWN0X0RhdGFUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvcHJvdmlkZXIvc3JjL2FuZHJvaWQvcHJvdmlkZXIvY3RzL2NvbnRhY3RzL0NvbnRhY3RzQ29udHJhY3RfRGF0YVRlc3QuamF2YQpAQCAtNzIsNiArNzIsOCBAQAogICAgICAgICAgICAgRGF0YS5EQVRBMTQsCiAgICAgICAgICAgICBEYXRhLkRBVEExNSwKICAgICAgICAgICAgIERhdGEuQ0FSUklFUl9QUkVTRU5DRSwKKyAgICAgICAgICAgIERhdGEuUFJFRkVSUkVEX1BIT05FX0FDQ09VTlRfQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICBEYXRhLlBSRUZFUlJFRF9QSE9ORV9BQ0NPVU5UX0lELAogICAgICAgICAgICAgRGF0YS5EQVRBX1ZFUlNJT04sCiAgICAgICAgICAgICBEYXRhLklTX1BSSU1BUlksCiAgICAgICAgICAgICBEYXRhLklTX1NVUEVSX1BSSU1BUlksCkBAIC0yODYsNiArMjg4LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEuREFUQTE0LAogICAgICAgICAgICAgICAgICAgICAgICAgRGF0YS5EQVRBMTUsCiAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhLkNBUlJJRVJfUFJFU0VOQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICBEYXRhLlBSRUZFUlJFRF9QSE9ORV9BQ0NPVU5UX0NPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgRGF0YS5QUkVGRVJSRURfUEhPTkVfQUNDT1VOVF9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEuREFUQV9WRVJTSU9OLAogICAgICAgICAgICAgICAgICAgICAgICAgRGF0YS5JU19QUklNQVJZLAogICAgICAgICAgICAgICAgICAgICAgICAgRGF0YS5JU19TVVBFUl9QUklNQVJZLApAQCAtMzc5LDYgKzM4Myw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhLkRBVEExNCwKICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEuREFUQTE1LAogICAgICAgICAgICAgICAgICAgICAgICAgRGF0YS5DQVJSSUVSX1BSRVNFTkNFLAorICAgICAgICAgICAgICAgICAgICAgICAgRGF0YS5QUkVGRVJSRURfUEhPTkVfQUNDT1VOVF9DT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERhdGEuUFJFRkVSUkVEX1BIT05FX0FDQ09VTlRfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhLkRBVEFfVkVSU0lPTiwKICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEuSVNfUFJJTUFSWSwKICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEuSVNfU1VQRVJfUFJJTUFSWSwKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3Byb3ZpZGVyL3NyYy9hbmRyb2lkL3Byb3ZpZGVyL2N0cy9jb250YWN0cy9SRUFETUUudHh0IGIvdGVzdHMvdGVzdHMvcHJvdmlkZXIvc3JjL2FuZHJvaWQvcHJvdmlkZXIvY3RzL2NvbnRhY3RzL1JFQURNRS50eHQKaW5kZXggZjk4OGU1Yi4uNTJiMjQxOSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvcHJvdmlkZXIvc3JjL2FuZHJvaWQvcHJvdmlkZXIvY3RzL2NvbnRhY3RzL1JFQURNRS50eHQKKysrIGIvdGVzdHMvdGVzdHMvcHJvdmlkZXIvc3JjL2FuZHJvaWQvcHJvdmlkZXIvY3RzL2NvbnRhY3RzL1JFQURNRS50eHQKQEAgLTMsNCArMyw0IEBACiBUaGV5IGNhbiBiZSBleGVjdXRlZCB3aXRoOgogCiAkIGFkYiBzaGVsbCBhbSBpbnN0cnVtZW50IC13IC1lIHBhY2thZ2UgYW5kcm9pZC5wcm92aWRlci5jdHMuY29udGFjdHMgXAotICAgIGFuZHJvaWQucHJvdmlkZXIuY3RzL2FuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIKKyAgICBhbmRyb2lkLnByb3ZpZGVyLmN0cy9hbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3Byb3ZpZGVyL3NyYy9hbmRyb2lkL3Byb3ZpZGVyL2N0cy9jb250YWN0cy9Wb2ljZW1haWxDb250cmFjdFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3Byb3ZpZGVyL3NyYy9hbmRyb2lkL3Byb3ZpZGVyL2N0cy9jb250YWN0cy9Wb2ljZW1haWxDb250cmFjdFRlc3QuamF2YQppbmRleCBiZGM5NzNiLi5iZjUwNGE5IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9wcm92aWRlci9zcmMvYW5kcm9pZC9wcm92aWRlci9jdHMvY29udGFjdHMvVm9pY2VtYWlsQ29udHJhY3RUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvcHJvdmlkZXIvc3JjL2FuZHJvaWQvcHJvdmlkZXIvY3RzL2NvbnRhY3RzL1ZvaWNlbWFpbENvbnRyYWN0VGVzdC5qYXZhCkBAIC04OCwzMiArODgsNDYgQEAKIAogICAgIHB1YmxpYyB2b2lkIHRlc3RWb2ljZW1haWxzVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgU3RyaW5nW10gVk9JQ0VNQUlMU19QUk9KRUNUSU9OID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgICAgICBWb2ljZW1haWxzLl9JRCwgVm9pY2VtYWlscy5OVU1CRVIsIFZvaWNlbWFpbHMuREFURSwgVm9pY2VtYWlscy5EVVJBVElPTiwKLSAgICAgICAgICAgICAgICBWb2ljZW1haWxzLklTX1JFQUQsIFZvaWNlbWFpbHMuU09VUkNFX1BBQ0tBR0UsIFZvaWNlbWFpbHMuU09VUkNFX0RBVEEsCi0gICAgICAgICAgICAgICAgVm9pY2VtYWlscy5IQVNfQ09OVEVOVCwgVm9pY2VtYWlscy5NSU1FX1RZUEUsIFZvaWNlbWFpbHMuVFJBTlNDUklQVElPTiwKKyAgICAgICAgICAgICAgICBWb2ljZW1haWxzLl9JRCwKKyAgICAgICAgICAgICAgICBWb2ljZW1haWxzLk5VTUJFUiwKKyAgICAgICAgICAgICAgICBWb2ljZW1haWxzLkRBVEUsCisgICAgICAgICAgICAgICAgVm9pY2VtYWlscy5EVVJBVElPTiwKKyAgICAgICAgICAgICAgICBWb2ljZW1haWxzLk5FVywKKyAgICAgICAgICAgICAgICBWb2ljZW1haWxzLklTX1JFQUQsCisgICAgICAgICAgICAgICAgVm9pY2VtYWlscy5TT1VSQ0VfUEFDS0FHRSwKKyAgICAgICAgICAgICAgICBWb2ljZW1haWxzLlNPVVJDRV9EQVRBLAorICAgICAgICAgICAgICAgIFZvaWNlbWFpbHMuSEFTX0NPTlRFTlQsCisgICAgICAgICAgICAgICAgVm9pY2VtYWlscy5NSU1FX1RZUEUsCisgICAgICAgICAgICAgICAgVm9pY2VtYWlscy5UUkFOU0NSSVBUSU9OLAogICAgICAgICAgICAgICAgIFZvaWNlbWFpbHMuUEhPTkVfQUNDT1VOVF9DT01QT05FTlRfTkFNRSwKLSAgICAgICAgICAgICAgICBWb2ljZW1haWxzLlBIT05FX0FDQ09VTlRfSUQsIFZvaWNlbWFpbHMuRElSVFksIFZvaWNlbWFpbHMuREVMRVRFRCwKLSAgICAgICAgICAgICAgICBWb2ljZW1haWxzLkxBU1RfTU9ESUZJRUQsIFZvaWNlbWFpbHMuQkFDS0VEX1VQLCBWb2ljZW1haWxzLlJFU1RPUkVELAotICAgICAgICAgICAgICAgIFZvaWNlbWFpbHMuQVJDSElWRUQsIFZvaWNlbWFpbHMuSVNfT01UUF9WT0lDRU1BSUx9OworICAgICAgICAgICAgICAgIFZvaWNlbWFpbHMuUEhPTkVfQUNDT1VOVF9JRCwKKyAgICAgICAgICAgICAgICBWb2ljZW1haWxzLkRJUlRZLAorICAgICAgICAgICAgICAgIFZvaWNlbWFpbHMuREVMRVRFRCwKKyAgICAgICAgICAgICAgICBWb2ljZW1haWxzLkxBU1RfTU9ESUZJRUQsCisgICAgICAgICAgICAgICAgVm9pY2VtYWlscy5CQUNLRURfVVAsCisgICAgICAgICAgICAgICAgVm9pY2VtYWlscy5SRVNUT1JFRCwKKyAgICAgICAgICAgICAgICBWb2ljZW1haWxzLkFSQ0hJVkVELAorICAgICAgICAgICAgICAgIFZvaWNlbWFpbHMuSVNfT01UUF9WT0lDRU1BSUx9OwogICAgICAgICBmaW5hbCBpbnQgSURfSU5ERVggPSAwOwogICAgICAgICBmaW5hbCBpbnQgTlVNQkVSX0lOREVYID0gMTsKICAgICAgICAgZmluYWwgaW50IERBVEVfSU5ERVggPSAyOwogICAgICAgICBmaW5hbCBpbnQgRFVSQVRJT05fSU5ERVggPSAzOwotICAgICAgICBmaW5hbCBpbnQgSVNfUkVBRF9JTkRFWCA9IDQ7Ci0gICAgICAgIGZpbmFsIGludCBTT1VSQ0VfUEFDS0FHRV9JTkRFWCA9IDU7Ci0gICAgICAgIGZpbmFsIGludCBTT1VSQ0VfREFUQV9JTkRFWCA9IDY7Ci0gICAgICAgIGZpbmFsIGludCBIQVNfQ09OVEVOVF9JTkRFWCA9IDc7Ci0gICAgICAgIGZpbmFsIGludCBNSU1FX1RZUEVfSU5ERVggPSA4OwotICAgICAgICBmaW5hbCBpbnQgVFJBTlNDUklQVElPTl9JTkRFWD0gOTsKLSAgICAgICAgZmluYWwgaW50IFBIT05FX0FDQ09VTlRfQ09NUE9ORU5UX05BTUVfSU5ERVggPSAxMDsKLSAgICAgICAgZmluYWwgaW50IFBIT05FX0FDQ09VTlRfSURfSU5ERVggPSAxMTsKLSAgICAgICAgZmluYWwgaW50IERJUlRZX0lOREVYID0gMTI7Ci0gICAgICAgIGZpbmFsIGludCBERUxFVEVEX0lOREVYID0gMTM7Ci0gICAgICAgIGZpbmFsIGludCBMQVNUX01PRElGSUVEX0lOREVYID0gMTQ7Ci0gICAgICAgIGZpbmFsIGludCBCQUNLRURfVVBfSU5ERVggPSAxNTsKLSAgICAgICAgZmluYWwgaW50IFJFU1RPUkVEX0lOREVYID0gMTY7Ci0gICAgICAgIGZpbmFsIGludCBBUkNISVZFRF9JTkRFWCA9IDE3OwotICAgICAgICBmaW5hbCBpbnQgSVNfT01UUF9WT0lDRU1BSUxfSU5ERVggPSAxODsKKyAgICAgICAgZmluYWwgaW50IE5FV19JTkRFWCA9IDQ7CisgICAgICAgIGZpbmFsIGludCBJU19SRUFEX0lOREVYID0gNTsKKyAgICAgICAgZmluYWwgaW50IFNPVVJDRV9QQUNLQUdFX0lOREVYID0gNjsKKyAgICAgICAgZmluYWwgaW50IFNPVVJDRV9EQVRBX0lOREVYID0gNzsKKyAgICAgICAgZmluYWwgaW50IEhBU19DT05URU5UX0lOREVYID0gODsKKyAgICAgICAgZmluYWwgaW50IE1JTUVfVFlQRV9JTkRFWCA9IDk7CisgICAgICAgIGZpbmFsIGludCBUUkFOU0NSSVBUSU9OX0lOREVYID0gMTA7CisgICAgICAgIGZpbmFsIGludCBQSE9ORV9BQ0NPVU5UX0NPTVBPTkVOVF9OQU1FX0lOREVYID0gMTE7CisgICAgICAgIGZpbmFsIGludCBQSE9ORV9BQ0NPVU5UX0lEX0lOREVYID0gMTI7CisgICAgICAgIGZpbmFsIGludCBESVJUWV9JTkRFWCA9IDEzOworICAgICAgICBmaW5hbCBpbnQgREVMRVRFRF9JTkRFWCA9IDE0OworICAgICAgICBmaW5hbCBpbnQgTEFTVF9NT0RJRklFRF9JTkRFWCA9IDE1OworICAgICAgICBmaW5hbCBpbnQgQkFDS0VEX1VQX0lOREVYID0gMTY7CisgICAgICAgIGZpbmFsIGludCBSRVNUT1JFRF9JTkRFWCA9IDE3OworICAgICAgICBmaW5hbCBpbnQgQVJDSElWRURfSU5ERVggPSAxODsKKyAgICAgICAgZmluYWwgaW50IElTX09NVFBfVk9JQ0VNQUlMX0lOREVYID0gMTk7CiAKICAgICAgICAgU3RyaW5nIGluc2VydENhbGxzTnVtYmVyID0gIjAxMjM0NTY3ODkiOwogICAgICAgICBsb25nIGluc2VydENhbGxzRHVyYXRpb24gPSAxMjA7CkBAIC0xMzEsNiArMTQ1LDcgQEAKICAgICAgICAgdmFsdWUucHV0KFZvaWNlbWFpbHMuTlVNQkVSLCBpbnNlcnRDYWxsc051bWJlcik7CiAgICAgICAgIHZhbHVlLnB1dChWb2ljZW1haWxzLkRBVEUsIGluc2VydERhdGUpOwogICAgICAgICB2YWx1ZS5wdXQoVm9pY2VtYWlscy5EVVJBVElPTiwgaW5zZXJ0Q2FsbHNEdXJhdGlvbik7CisgICAgICAgIHZhbHVlLnB1dChWb2ljZW1haWxzLk5FVywgMCk7CiAgICAgICAgIC8vIFNvdXJjZSBwYWNrYWdlIGlzIGV4cGVjdGVkIHRvIGJlIGluc2VydGVkIGJ5IHRoZSBwcm92aWRlciwgaWYgbm90IHNldC4KICAgICAgICAgdmFsdWUucHV0KFZvaWNlbWFpbHMuU09VUkNFX0RBVEEsIGluc2VydFNvdXJjZURhdGEpOwogICAgICAgICB2YWx1ZS5wdXQoVm9pY2VtYWlscy5NSU1FX1RZUEUsIGluc2VydE1pbWVUeXBlKTsKQEAgLTE1OCwxNyArMTczLDE4IEBACiAgICAgICAgIGFzc2VydEVxdWFscyhtU291cmNlUGFja2FnZU5hbWUsIGN1cnNvci5nZXRTdHJpbmcoU09VUkNFX1BBQ0tBR0VfSU5ERVgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKGluc2VydFNvdXJjZURhdGEsIGN1cnNvci5nZXRTdHJpbmcoU09VUkNFX0RBVEFfSU5ERVgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKGluc2VydE1pbWVUeXBlLCBjdXJzb3IuZ2V0U3RyaW5nKE1JTUVfVFlQRV9JTkRFWCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgY3Vyc29yLmdldEludChORVdfSU5ERVgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGN1cnNvci5nZXRJbnQoSVNfUkVBRF9JTkRFWCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY3Vyc29yLmdldEludChIQVNfQ09OVEVOVF9JTkRFWCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyIsY3Vyc29yLmdldFN0cmluZyhUUkFOU0NSSVBUSU9OX0lOREVYKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiY29tLmZvbyIsY3Vyc29yLmdldFN0cmluZyhQSE9ORV9BQ0NPVU5UX0NPTVBPTkVOVF9OQU1FX0lOREVYKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYmFyIixjdXJzb3IuZ2V0U3RyaW5nKFBIT05FX0FDQ09VTlRfSURfSU5ERVgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsY3Vyc29yLmdldEludChESVJUWV9JTkRFWCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCxjdXJzb3IuZ2V0SW50KERFTEVURURfSU5ERVgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsY3Vyc29yLmdldEludChCQUNLRURfVVBfSU5ERVgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsY3Vyc29yLmdldEludChSRVNUT1JFRF9JTkRFWCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCxjdXJzb3IuZ2V0SW50KEFSQ0hJVkVEX0lOREVYKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLGN1cnNvci5nZXRJbnQoSVNfT01UUF9WT0lDRU1BSUxfSU5ERVgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCBjdXJzb3IuZ2V0U3RyaW5nKFRSQU5TQ1JJUFRJT05fSU5ERVgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZm9vIiwgY3Vyc29yLmdldFN0cmluZyhQSE9ORV9BQ0NPVU5UX0NPTVBPTkVOVF9OQU1FX0lOREVYKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYmFyIiwgY3Vyc29yLmdldFN0cmluZyhQSE9ORV9BQ0NPVU5UX0lEX0lOREVYKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBjdXJzb3IuZ2V0SW50KERJUlRZX0lOREVYKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBjdXJzb3IuZ2V0SW50KERFTEVURURfSU5ERVgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGN1cnNvci5nZXRJbnQoQkFDS0VEX1VQX0lOREVYKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBjdXJzb3IuZ2V0SW50KFJFU1RPUkVEX0lOREVYKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBjdXJzb3IuZ2V0SW50KEFSQ0hJVkVEX0lOREVYKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBjdXJzb3IuZ2V0SW50KElTX09NVFBfVk9JQ0VNQUlMX0lOREVYKSk7CiAgICAgICAgIGludCBpZCA9IGN1cnNvci5nZXRJbnQoSURfSU5ERVgpOwogICAgICAgICBhc3NlcnRFcXVhbHMoaWQsIEludGVnZXIucGFyc2VJbnQodXJpLmdldExhc3RQYXRoU2VnbWVudCgpKSk7CiAgICAgICAgIGN1cnNvci5jbG9zZSgpOwpAQCAtMTc5LDYgKzE5NSw3IEBACiAgICAgICAgIHZhbHVlLnB1dChWb2ljZW1haWxzLkRBVEUsIHVwZGF0ZURhdGUpOwogICAgICAgICB2YWx1ZS5wdXQoVm9pY2VtYWlscy5EVVJBVElPTiwgdXBkYXRlQ2FsbHNEdXJhdGlvbik7CiAgICAgICAgIHZhbHVlLnB1dChWb2ljZW1haWxzLlNPVVJDRV9EQVRBLCB1cGRhdGVTb3VyY2VEYXRhKTsKKyAgICAgICAgdmFsdWUucHV0KFZvaWNlbWFpbHMuTkVXLCAxKTsKICAgICAgICAgdmFsdWUucHV0KFZvaWNlbWFpbHMuRElSVFksIDEpOwogICAgICAgICB2YWx1ZS5wdXQoVm9pY2VtYWlscy5ERUxFVEVELCAxKTsKICAgICAgICAgdmFsdWUucHV0KFZvaWNlbWFpbHMuQkFDS0VEX1VQLCAxKTsKQEAgLTE5NiwxMiArMjEzLDEzIEBACiAgICAgICAgIGFzc2VydEVxdWFscyh1cGRhdGVEYXRlLCBjdXJzb3IuZ2V0TG9uZyhEQVRFX0lOREVYKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyh1cGRhdGVDYWxsc0R1cmF0aW9uLCBjdXJzb3IuZ2V0TG9uZyhEVVJBVElPTl9JTkRFWCkpOwogICAgICAgICBhc3NlcnRFcXVhbHModXBkYXRlU291cmNlRGF0YSwgY3Vyc29yLmdldFN0cmluZyhTT1VSQ0VfREFUQV9JTkRFWCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSxjdXJzb3IuZ2V0SW50KERJUlRZX0lOREVYKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLGN1cnNvci5nZXRJbnQoREVMRVRFRF9JTkRFWCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSxjdXJzb3IuZ2V0SW50KEJBQ0tFRF9VUF9JTkRFWCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSxjdXJzb3IuZ2V0SW50KFJFU1RPUkVEX0lOREVYKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLGN1cnNvci5nZXRJbnQoQVJDSElWRURfSU5ERVgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsY3Vyc29yLmdldEludChJU19PTVRQX1ZPSUNFTUFJTF9JTkRFWCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY3Vyc29yLmdldEludChORVdfSU5ERVgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGN1cnNvci5nZXRJbnQoRElSVFlfSU5ERVgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGN1cnNvci5nZXRJbnQoREVMRVRFRF9JTkRFWCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY3Vyc29yLmdldEludChCQUNLRURfVVBfSU5ERVgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGN1cnNvci5nZXRJbnQoUkVTVE9SRURfSU5ERVgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGN1cnNvci5nZXRJbnQoQVJDSElWRURfSU5ERVgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGN1cnNvci5nZXRJbnQoSVNfT01UUF9WT0lDRU1BSUxfSU5ERVgpKTsKICAgICAgICAgY3Vyc29yLmNsb3NlKCk7CiAKICAgICAgICAgLy8gVGVzdDogZGVsZXRlCkBAIC0yMTMsNyArMjMxLDcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9yZWlnblVwZGF0ZV9kaXJ0eSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZighaGFzVGVsZXBob255KGdldEluc3RydW1lbnRhdGlvbigpLmdldENvbnRleHQoKSkpeworICAgICAgICBpZiAoIWhhc1RlbGVwaG9ueShnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRDb250ZXh0KCkpKSB7CiAgICAgICAgICAgICBMb2cuZChUQUcsICJza2lwcGluZyB0ZXN0IHRoYXQgcmVxdWlyZXMgdGVsZXBob255IGZlYXR1cmUiKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQpAQCAtMjI1LDcgKzI0Myw5IEBACiAKICAgICAgICAgVXJpIHVyaSA9IG1Wb2ljZW1haWxQcm92aWRlci5pbnNlcnQoVm9pY2VtYWlscy5idWlsZFNvdXJjZVVyaShGT1JFSUdOX1NPVVJDRSksIHZhbHVlcyk7CiAKLSAgICAgICAgbVZvaWNlbWFpbFByb3ZpZGVyLnVwZGF0ZSh1cmksIG5ldyBDb250ZW50VmFsdWVzKCksIG51bGwsIG51bGwpOworICAgICAgICBDb250ZW50VmFsdWVzIHVwZGF0ZVZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7CisgICAgICAgIHVwZGF0ZVZhbHVlcy5wdXQoVm9pY2VtYWlscy5JU19SRUFELCAiMSIpOworICAgICAgICBtVm9pY2VtYWlsUHJvdmlkZXIudXBkYXRlKHVyaSwgdXBkYXRlVmFsdWVzLCBudWxsLCBudWxsKTsKIAogICAgICAgICB0cnkgKEN1cnNvciBjdXJzb3IgPSBtVm9pY2VtYWlsUHJvdmlkZXIKICAgICAgICAgICAgICAgICAucXVlcnkodXJpLCBuZXcgU3RyaW5nW10ge1ZvaWNlbWFpbHMuRElSVFl9LCBudWxsLCBudWxsLCBudWxsKSkgewpAQCAtMjM0LDggKzI1NCwzNCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgdGVzdEZvcmVpZ25VcGRhdGVfcmV0YWluRGlydHlfbm90RGlydHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFoYXNUZWxlcGhvbnkoZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0Q29udGV4dCgpKSkgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAic2tpcHBpbmcgdGVzdCB0aGF0IHJlcXVpcmVzIHRlbGVwaG9ueSBmZWF0dXJlIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gb25seSB0aGUgZGVmYXVsdCBkaWFsZXIgaGFzIFdSSVRFX1ZPSUNFTUFJTCBwZXJtaXNzaW9uLCB3aGljaCBjYW4gbW9kaWZ5IHZvaWNlbWFpbHMgb2YKKyAgICAgICAgLy8gYSBmb3JlaWduIHNvdXJjZSBwYWNrYWdlLgorICAgICAgICBzZXRUZXN0QXNEZWZhdWx0RGlhbGVyKCk7CisgICAgICAgIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKKyAgICAgICAgdmFsdWVzLnB1dChWb2ljZW1haWxzLlNPVVJDRV9QQUNLQUdFLCBGT1JFSUdOX1NPVVJDRSk7CisKKyAgICAgICAgVXJpIHVyaSA9IG1Wb2ljZW1haWxQcm92aWRlci5pbnNlcnQoVm9pY2VtYWlscy5idWlsZFNvdXJjZVVyaShGT1JFSUdOX1NPVVJDRSksIHZhbHVlcyk7CisKKyAgICAgICAgQ29udGVudFZhbHVlcyBuZXdWYWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOworICAgICAgICBuZXdWYWx1ZXMucHV0KFZvaWNlbWFpbHMuVFJBTlNDUklQVElPTiwgImZvbyIpOworICAgICAgICBuZXdWYWx1ZXMucHV0KFZvaWNlbWFpbHMuRElSVFksIFZvaWNlbWFpbHMuRElSVFlfUkVUQUlOKTsKKworICAgICAgICBtVm9pY2VtYWlsUHJvdmlkZXIudXBkYXRlKHVyaSwgbmV3VmFsdWVzLCBudWxsLCBudWxsKTsKKworICAgICAgICB0cnkgKEN1cnNvciBjdXJzb3IgPSBtVm9pY2VtYWlsUHJvdmlkZXIKKyAgICAgICAgICAgICAgICAucXVlcnkodXJpLCBuZXcgU3RyaW5nW10ge1ZvaWNlbWFpbHMuRElSVFl9LCBudWxsLCBudWxsLCBudWxsKSkgeworICAgICAgICAgICAgY3Vyc29yLm1vdmVUb0ZpcnN0KCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgY3Vyc29yLmdldEludCgwKSk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9yZWlnblVwZGF0ZV9leHBsaWNpdE5vdERpcnR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmKCFoYXNUZWxlcGhvbnkoZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0Q29udGV4dCgpKSl7CisgICAgICAgIGlmICghaGFzVGVsZXBob255KGdldEluc3RydW1lbnRhdGlvbigpLmdldENvbnRleHQoKSkpIHsKICAgICAgICAgICAgIExvZy5kKFRBRywgInNraXBwaW5nIHRlc3QgdGhhdCByZXF1aXJlcyB0ZWxlcGhvbnkgZmVhdHVyZSIpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CkBAIC0yNDYsNyArMjkyLDcgQEAKICAgICAgICAgVXJpIHVyaSA9IG1Wb2ljZW1haWxQcm92aWRlci5pbnNlcnQoVm9pY2VtYWlscy5idWlsZFNvdXJjZVVyaShGT1JFSUdOX1NPVVJDRSksIHZhbHVlcyk7CiAKICAgICAgICAgQ29udGVudFZhbHVlcyB1cGRhdGVWYWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICB1cGRhdGVWYWx1ZXMucHV0KFZvaWNlbWFpbHMuRElSVFksMCk7CisgICAgICAgIHVwZGF0ZVZhbHVlcy5wdXQoVm9pY2VtYWlscy5ESVJUWSwgMCk7CiAgICAgICAgIG1Wb2ljZW1haWxQcm92aWRlci51cGRhdGUodXJpLCB1cGRhdGVWYWx1ZXMsIG51bGwsIG51bGwpOwogCiAgICAgICAgIHRyeSAoQ3Vyc29yIGN1cnNvciA9IG1Wb2ljZW1haWxQcm92aWRlcgpAQCAtMjU3LDcgKzMwMyw3IEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdEZvcmVpZ25VcGRhdGVfbnVsbF9kaXJ0eSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZighaGFzVGVsZXBob255KGdldEluc3RydW1lbnRhdGlvbigpLmdldENvbnRleHQoKSkpeworICAgICAgICBpZiAoIWhhc1RlbGVwaG9ueShnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRDb250ZXh0KCkpKSB7CiAgICAgICAgICAgICBMb2cuZChUQUcsICJza2lwcGluZyB0ZXN0IHRoYXQgcmVxdWlyZXMgdGVsZXBob255IGZlYXR1cmUiKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQpAQCAtMjc5LDcgKzMyNSw3IEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdEZvcmVpZ25VcGRhdGVfTm90Tm9ybWFsaXplZF9ub3JtYWxpemVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmKCFoYXNUZWxlcGhvbnkoZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0Q29udGV4dCgpKSl7CisgICAgICAgIGlmICghaGFzVGVsZXBob255KGdldEluc3RydW1lbnRhdGlvbigpLmdldENvbnRleHQoKSkpIHsKICAgICAgICAgICAgIExvZy5kKFRBRywgInNraXBwaW5nIHRlc3QgdGhhdCByZXF1aXJlcyB0ZWxlcGhvbnkgZmVhdHVyZSIpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CkBAIC0zMDMsMTEgKzM0OSwxMyBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RMb2NhbFVwZGF0ZV9ub3REaXJ0eSgpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgdmFsdWVzLnB1dChWb2ljZW1haWxzLkRJUlRZLDEpOworICAgICAgICB2YWx1ZXMucHV0KFZvaWNlbWFpbHMuRElSVFksIDEpOwogCiAgICAgICAgIFVyaSB1cmkgPSBtVm9pY2VtYWlsUHJvdmlkZXIuaW5zZXJ0KFZvaWNlbWFpbHMuYnVpbGRTb3VyY2VVcmkobVNvdXJjZVBhY2thZ2VOYW1lKSwgdmFsdWVzKTsKIAotICAgICAgICBtVm9pY2VtYWlsUHJvdmlkZXIudXBkYXRlKHVyaSwgbmV3IENvbnRlbnRWYWx1ZXMoKSwgbnVsbCwgbnVsbCk7CisgICAgICAgIENvbnRlbnRWYWx1ZXMgdXBkYXRlVmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKKyAgICAgICAgdXBkYXRlVmFsdWVzLnB1dChWb2ljZW1haWxzLklTX1JFQUQsICIxIik7CisgICAgICAgIG1Wb2ljZW1haWxQcm92aWRlci51cGRhdGUodXJpLCB1cGRhdGVWYWx1ZXMsIG51bGwsIG51bGwpOwogCiAgICAgICAgIHRyeSAoQ3Vyc29yIGN1cnNvciA9IG1Wb2ljZW1haWxQcm92aWRlcgogICAgICAgICAgICAgICAgIC5xdWVyeSh1cmksIG5ldyBTdHJpbmdbXSB7Vm9pY2VtYWlscy5ESVJUWX0sIG51bGwsIG51bGwsIG51bGwpKSB7CkBAIC0zMTYsNiArMzY0LDI1IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9jYWxVcGRhdGVfcmV0YWluRGlydHlfZGlydHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBDb250ZW50VmFsdWVzIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7CisgICAgICAgIHZhbHVlcy5wdXQoVm9pY2VtYWlscy5ESVJUWSwgMSk7CisKKyAgICAgICAgVXJpIHVyaSA9IG1Wb2ljZW1haWxQcm92aWRlci5pbnNlcnQoVm9pY2VtYWlscy5idWlsZFNvdXJjZVVyaShtU291cmNlUGFja2FnZU5hbWUpLCB2YWx1ZXMpOworCisgICAgICAgIENvbnRlbnRWYWx1ZXMgbmV3VmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKKyAgICAgICAgbmV3VmFsdWVzLnB1dChWb2ljZW1haWxzLlRSQU5TQ1JJUFRJT04sICJmb28iKTsKKyAgICAgICAgbmV3VmFsdWVzLnB1dChWb2ljZW1haWxzLkRJUlRZLCBWb2ljZW1haWxzLkRJUlRZX1JFVEFJTik7CisKKyAgICAgICAgbVZvaWNlbWFpbFByb3ZpZGVyLnVwZGF0ZSh1cmksIG5ld1ZhbHVlcywgbnVsbCwgbnVsbCk7CisKKyAgICAgICAgdHJ5IChDdXJzb3IgY3Vyc29yID0gbVZvaWNlbWFpbFByb3ZpZGVyCisgICAgICAgICAgICAgICAgLnF1ZXJ5KHVyaSwgbmV3IFN0cmluZ1tdIHtWb2ljZW1haWxzLkRJUlRZfSwgbnVsbCwgbnVsbCwgbnVsbCkpIHsKKyAgICAgICAgICAgIGN1cnNvci5tb3ZlVG9GaXJzdCgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGN1cnNvci5nZXRJbnQoMCksIDEpOworICAgICAgICB9CisgICAgfQogCiAgICAgLy8gRGF0YSBjb2x1bW4gc2hvdWxkIGJlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGR1cmluZyBpbnNlcnQuCiAgICAgcHVibGljIHZvaWQgdGVzdEluc2VydF9kb2VzTm90VXBkYXRlRGF0YUNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewpAQCAtMzUxLDcgKzQxOCw3IEBACiAgICAgcHJpdmF0ZSB2b2lkIGFzc2VydERhdGFOb3RFcXVhbHMoU3RyaW5nIG5ld0ZpbGVQYXRoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKICAgICAgICAgLy8gTWFrZSBzdXJlIGRhdGEgdmFsdWUgaXMgbm90IGFjdHVhbGx5IHVwZGF0ZWQuCiAgICAgICAgIGZpbmFsIEN1cnNvciBjdXJzb3IgPSBtVm9pY2VtYWlsUHJvdmlkZXIucXVlcnkobVZvaWNlbWFpbENvbnRlbnRVcmksCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tde1ZvaWNlbWFpbHMuX0RBVEF9LCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10ge1ZvaWNlbWFpbHMuX0RBVEF9LCBudWxsLCBudWxsLCBudWxsKTsKICAgICAgICAgY3Vyc29yLm1vdmVUb05leHQoKTsKICAgICAgICAgZmluYWwgU3RyaW5nIGRhdGEgPSBjdXJzb3IuZ2V0U3RyaW5nKDApOwogICAgICAgICBhc3NlcnRGYWxzZShkYXRhLmVxdWFscyhuZXdGaWxlUGF0aCkpOwpAQCAtNDk0LDEwICs1NjEsMTAgQEAKICAgICAgICAgICAgICAgICBwYWNrYWdlTWFuYWdlci5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfQ09OTkVDVElPTl9TRVJWSUNFKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgc2V0VGVzdEFzRGVmYXVsdERpYWxlcigpIHRocm93cyBFeGNlcHRpb257CisgICAgcHJpdmF0ZSB2b2lkIHNldFRlc3RBc0RlZmF1bHREaWFsZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0VHJ1ZShtUHJldmlvdXNEZWZhdWx0RGlhbGVyID09IG51bGwpOwogICAgICAgICBtUHJldmlvdXNEZWZhdWx0RGlhbGVyID0gZ2V0RGVmYXVsdERpYWxlcihnZXRJbnN0cnVtZW50YXRpb24oKSk7Ci0gICAgICAgIHNldERlZmF1bHREaWFsZXIoZ2V0SW5zdHJ1bWVudGF0aW9uKCksUEFDS0FHRSk7CisgICAgICAgIHNldERlZmF1bHREaWFsZXIoZ2V0SW5zdHJ1bWVudGF0aW9uKCksIFBBQ0tBR0UpOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBzZXREZWZhdWx0RGlhbGVyKEluc3RydW1lbnRhdGlvbiBpbnN0cnVtZW50YXRpb24sIFN0cmluZyBwYWNrYWdlTmFtZSkKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3JlbmRlcnNjcmlwdC9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvcmVuZGVyc2NyaXB0L0FuZHJvaWQubWsKaW5kZXggMTdhMTM3My4uNGZkZmNjNCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvcmVuZGVyc2NyaXB0L0FuZHJvaWQubWsKKysrIGIvdGVzdHMvdGVzdHMvcmVuZGVyc2NyaXB0L0FuZHJvaWQubWsKQEAgLTI5LDEwICsyOSw5IEBACiBMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQogCiBMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAotICAgIGN0c3Rlc3RydW5uZXIgXAotICAgIHhtcF90b29sa2l0IFwKLSAgICBsZWdhY3ktYW5kcm9pZC10ZXN0IFwKLSAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsCisgICAgY3RzdGVzdHJ1bm5lci1heHQgXAorICAgIHhtcF90b29sa2l0CitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicwogTE9DQUxfSk5JX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY29yZW1hdGh0ZXN0Y3BwX2puaQogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpICQoY2FsbCBhbGwtcmVuZGVyc2NyaXB0LWZpbGVzLXVuZGVyLCBzcmMpCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9yZW5kZXJzY3JpcHQvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL3JlbmRlcnNjcmlwdC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDc0OTk4OTkuLjViMDQyMDYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3JlbmRlcnNjcmlwdC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL3JlbmRlcnNjcmlwdC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yOSw3ICsyOSw3IEBACiAgICAgPC9hcHBsaWNhdGlvbj4KIAogICAgIDwhLS0gVGhpcyBpcyBhIHNlbGYtaW5zdHJ1bWVudGluZyB0ZXN0IHBhY2thZ2UuIC0tPgotICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQucmVuZGVyc2NyaXB0LmN0cyIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBvZiBSZW5kZXJzY3JpcHQgY29tcG9uZW50Ij4KICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9Imxpc3RlbmVyIgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcmVuZGVyc2NyaXB0L0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL3JlbmRlcnNjcmlwdC9BbmRyb2lkVGVzdC54bWwKaW5kZXggOTc5Yjc1Ni4uMjc4ODIzNiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvcmVuZGVyc2NyaXB0L0FuZHJvaWRUZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9yZW5kZXJzY3JpcHQvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlndXJhdGlvbiBmb3IgUmVuZGVyc2NyaXB0IFRlc3RzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0icmVuZGVyc2NyaXB0IiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9yZW5kZXJzY3JpcHQvbGliY29yZW1hdGh0ZXN0Y3BwL0FuZHJvaWQubWsgYi90ZXN0cy90ZXN0cy9yZW5kZXJzY3JpcHQvbGliY29yZW1hdGh0ZXN0Y3BwL0FuZHJvaWQubWsKaW5kZXggYWQ1Mjg1NzEuLmM2ZWJmZTMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3JlbmRlcnNjcmlwdC9saWJjb3JlbWF0aHRlc3RjcHAvQW5kcm9pZC5taworKysgYi90ZXN0cy90ZXN0cy9yZW5kZXJzY3JpcHQvbGliY29yZW1hdGh0ZXN0Y3BwL0FuZHJvaWQubWsKQEAgLTIyLDEwICsyMiwxMCBAQAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIExPQ0FMX1NSQ19GSUxFUyA6PSBDb3JlTWF0aFRlc3RKbmkuY3BwCiAKLUxPQ0FMX0NGTEFHUyA6PSAtc3RkPWMrKzExCitMT0NBTF9DRkxBR1MgOj0gLXN0ZD1jKysxMSAtV2FsbCAtV2Vycm9yCiAKIExPQ0FMX1NES19WRVJTSU9OIDo9IDIxCi1MT0NBTF9OREtfU1RMX1ZBUklBTlQgOj0gc3RscG9ydF9zdGF0aWMKK0xPQ0FMX05ES19TVExfVkFSSUFOVCA6PSBjKytfc3RhdGljCiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gJChKTklfSF9JTkNMVURFKQogTE9DQUxfQ19JTkNMVURFUyArPSBmcmFtZXdvcmtzL3JzL2NwcApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcmVuZGVyc2NyaXB0L3NyYy9hbmRyb2lkL3JlbmRlcnNjcmlwdC9jdHMvQ29yZU1hdGhWZXJpZmllci5qYXZhIGIvdGVzdHMvdGVzdHMvcmVuZGVyc2NyaXB0L3NyYy9hbmRyb2lkL3JlbmRlcnNjcmlwdC9jdHMvQ29yZU1hdGhWZXJpZmllci5qYXZhCmluZGV4IGJjMTMxNDQuLmNmNTM1ZTggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3JlbmRlcnNjcmlwdC9zcmMvYW5kcm9pZC9yZW5kZXJzY3JpcHQvY3RzL0NvcmVNYXRoVmVyaWZpZXIuamF2YQorKysgYi90ZXN0cy90ZXN0cy9yZW5kZXJzY3JpcHQvc3JjL2FuZHJvaWQvcmVuZGVyc2NyaXB0L2N0cy9Db3JlTWF0aFZlcmlmaWVyLmphdmEKQEAgLTMwNDUsOSArMzA0NSw5IEBACiAgICAgICAgIFJlbXF1b1Jlc3VsdCBleHBlY3RlZCA9IHJlbXF1byhhcmdzLmluTnVtZXJhdG9yLCBhcmdzLmluRGVub21pbmF0b3IpOwogICAgICAgICAvLyBJZiB0aGUgZXhwZWN0ZWQgcmVtYWluZGVyIGlzIE5hTiwgd2UgZG9uJ3QgdmFsaWRhdGUgdGhlIHF1b3RpZW50LiAgSXQncyBiZWNhdXNlIG9mCiAgICAgICAgIC8vIGEgZGl2aXNpb24gYnkgemVyby4KLSAgICAgICAgaWYgKGV4cGVjdGVkLnJlbWFpbmRlciAhPSBleHBlY3RlZC5yZW1haW5kZXIpIHsKKyAgICAgICAgaWYgKEZsb2F0LmlzTmFOKGV4cGVjdGVkLnJlbWFpbmRlcikpIHsKICAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgdGhlIHZhbHVlIHdlIGdvdCBpcyBOYU4gdG9vLgotICAgICAgICAgICAgaWYgKGFyZ3Mub3V0ID09IGFyZ3Mub3V0KSB7CisgICAgICAgICAgICBpZiAoIUZsb2F0LmlzTmFOKGFyZ3Mub3V0KSkgewogICAgICAgICAgICAgICAgIHJldHVybiAiRXhwZWN0ZWQgYSByZW1haW5kZXIgb2YgTmFOIGJ1dCBnb3QgIiArICBGbG9hdC50b1N0cmluZyhhcmdzLm91dCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9yZW5kZXJzY3JpcHQvc3JjL2FuZHJvaWQvcmVuZGVyc2NyaXB0L2N0cy9SZW5kZXJTY3JpcHRUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9yZW5kZXJzY3JpcHQvc3JjL2FuZHJvaWQvcmVuZGVyc2NyaXB0L2N0cy9SZW5kZXJTY3JpcHRUZXN0LmphdmEKaW5kZXggMGU5Mjk1NS4uNmQ4YzBhMyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvcmVuZGVyc2NyaXB0L3NyYy9hbmRyb2lkL3JlbmRlcnNjcmlwdC9jdHMvUmVuZGVyU2NyaXB0VGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3JlbmRlcnNjcmlwdC9zcmMvYW5kcm9pZC9yZW5kZXJzY3JpcHQvY3RzL1JlbmRlclNjcmlwdFRlc3QuamF2YQpAQCAtMTksOSArMTksNiBAQAogaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdDsKIGltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DZGRUZXN0OwotCi1AQ2RkVGVzdChyZXF1aXJlbWVudD0iNy4xLjQuMy9DLTAtMSIpCiBwdWJsaWMgY2xhc3MgUmVuZGVyU2NyaXB0VGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3JlbmRlcnNjcmlwdC9zcmMvYW5kcm9pZC9yZW5kZXJzY3JpcHQvY3RzL1RhcmdldC5qYXZhIGIvdGVzdHMvdGVzdHMvcmVuZGVyc2NyaXB0L3NyYy9hbmRyb2lkL3JlbmRlcnNjcmlwdC9jdHMvVGFyZ2V0LmphdmEKaW5kZXggNTVkMzcxMi4uM2FjNGZmOCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvcmVuZGVyc2NyaXB0L3NyYy9hbmRyb2lkL3JlbmRlcnNjcmlwdC9jdHMvVGFyZ2V0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvcmVuZGVyc2NyaXB0L3NyYy9hbmRyb2lkL3JlbmRlcnNjcmlwdC9jdHMvVGFyZ2V0LmphdmEKQEAgLTM0MSw3ICszNDEsNyBAQAogICAgICAgICAgICAgbUhhc1JhbmdlID0gZmFsc2U7CiAgICAgICAgICAgICBtVmFsdWUgPSB2YWx1ZXNbMF07CiAgICAgICAgICAgICBmb3IgKGRvdWJsZSBmOiB2YWx1ZXMpIHsKLSAgICAgICAgICAgICAgICBpZiAoZiAhPSBmKSB7CisgICAgICAgICAgICAgICAgaWYgKERvdWJsZS5pc05hTihmKSkgewogICAgICAgICAgICAgICAgICAgICBtQ2FuQmVOYW4gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9CkBAIC01NzMsNyArNTczLDcgQEAKICAgICAgICAgcHVibGljIGJvb2xlYW4gY291bGRCZShkb3VibGUgYSwgZG91YmxlIGV4dHJhQWxsb3dlZEVycm9yKSB7CiAgICAgICAgICAgICAvL0xvZy53KCJGbG9hdHkuY291bGRCZSIsICJDYW4gIiArIERvdWJsZS50b1N0cmluZyhhKSArICIgYmUgIiArIHRvU3RyaW5nKCkgKyAiPyAiKTsKICAgICAgICAgICAgIC8vIEhhbmRsZSB0aGUgaW5wdXQgYmVpbmcgYSBOYU4uCi0gICAgICAgICAgICBpZiAoYSAhPSBhKSB7CisgICAgICAgICAgICBpZiAoRG91YmxlLmlzTmFOKGEpKSB7CiAgICAgICAgICAgICAgICAgLy9Mb2cudygiY291bGRCZSIsICJ0cnVlIGJlY2F1c2UgaXMgTmFhbiIpOwogICAgICAgICAgICAgICAgIHJldHVybiBtQ2FuQmVOYW47CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9yZW5kZXJzY3JpcHQvc3JjL2FuZHJvaWQvcmVuZGVyc2NyaXB0L2N0cy9yZWZvY3VzL1JlZm9jdXNUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9yZW5kZXJzY3JpcHQvc3JjL2FuZHJvaWQvcmVuZGVyc2NyaXB0L2N0cy9yZWZvY3VzL1JlZm9jdXNUZXN0LmphdmEKaW5kZXggOWIzNTViMC4uYWIzMjZmZiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvcmVuZGVyc2NyaXB0L3NyYy9hbmRyb2lkL3JlbmRlcnNjcmlwdC9jdHMvcmVmb2N1cy9SZWZvY3VzVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3JlbmRlcnNjcmlwdC9zcmMvYW5kcm9pZC9yZW5kZXJzY3JpcHQvY3RzL3JlZm9jdXMvUmVmb2N1c1Rlc3QuamF2YQpAQCAtMzcsMTQgKzM3LDE0IEBACiAgICAgLyoqCiAgICAgICogVGVzdCB0aGUgb3JpZ25hbCByZWZvY3VzIGNvZGUKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3JpZ2luYWxSZWZvY3VzKCkgeworICAgIHB1YmxpYyB2b2lkIHRlc3RPcmlnaW5hbFJlZm9jdXMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICByZWZvY3VzKFJlbmRlclNjcmlwdFRhc2suc2NyaXB0LmYzMiwgOTUpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFRlc3QgdGhlIG5ldyByZWZvY3VzIGNvZGUKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmV3UmVmb2N1cygpIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmV3UmVmb2N1cygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRoZSBuZXcgaW1wbGVtZW50YXRpb24gbWF5IHJ1biBvbiBhIEdQVSB1c2luZyByZWxheGVkIGZsb2F0aW5nIHBvaW50CiAgICAgICAgIC8vIG1hdGhlbWF0aWNzLiBIZW5jZSBtb3JlIHJlbGF4ZWQgcHJlY2lzaW9uIHJlcXVpcmVtZW50LgogICAgICAgICByZWZvY3VzKFJlbmRlclNjcmlwdFRhc2suc2NyaXB0LmQxbmV3LCA0NSk7CkBAIC01NCw3ICs1NCw3IEBACiAgICAgICogVGVzdCBhIHJlZm9jdXMgb3BlcmF0b3IgYWdhaW5zdCB0aGUgcmVmb2N1c19yZWZlcmVuY2UgaW1hZ2UKICAgICAgKiBAcGFyYW0gaW1wbCB2ZXJzaW9uIG9mIHJlZm9jdXMgdG8gcnVuCiAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlZm9jdXMoUmVuZGVyU2NyaXB0VGFzay5zY3JpcHQgaW1wbCwgZG91YmxlIG1pbmltdW1QU05SKSB7CisgICAgcHJpdmF0ZSB2b2lkIHJlZm9jdXMoUmVuZGVyU2NyaXB0VGFzay5zY3JpcHQgaW1wbCwgZG91YmxlIG1pbmltdW1QU05SKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBDb250ZXh0IGN0eCA9IGdldENvbnRleHQoKTsKIAogICAgICAgICBSZW5kZXJTY3JpcHQgcnMgPSBSZW5kZXJTY3JpcHQuY3JlYXRlKGN0eCk7CkBAIC02MywyNyArNjMsMjYgQEAKICAgICAgICAgICAgIGN1cnJlbnRfcmdieiA9IG5ldyBSR0JaKGdldFJlc291cmNlUmVmKFIuZHJhd2FibGUudGVzdF9pbWFnZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRSZXNvdXJjZVJlZihSLmRyYXdhYmxlLnRlc3RfZGVwdGhtYXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmdldENvbnRlbnRSZXNvbHZlcigpLCBjdHgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgYXNzZXJ0TnVsbChlKTsKKyAgICAgICAgICAgIERlcHRoT2ZGaWVsZE9wdGlvbnMgY3VycmVudF9kZXB0aF9vcHRpb25zID0gbmV3IERlcHRoT2ZGaWVsZE9wdGlvbnMoY3VycmVudF9yZ2J6KTsKKyAgICAgICAgICAgIFJzVGFza1BhcmFtcyByc1Rhc2tQYXJhbSA9IG5ldyBSc1Rhc2tQYXJhbXMocnMsIGN1cnJlbnRfZGVwdGhfb3B0aW9ucyk7CisKKyAgICAgICAgICAgIFJlbmRlclNjcmlwdFRhc2sgcmVuZGVyU2NyaXB0VGFzayA9IG5ldyBSZW5kZXJTY3JpcHRUYXNrKHJzLCBpbXBsKTsKKyAgICAgICAgICAgIEJpdG1hcCBvdXRwdXRJbWFnZSA9IHJlbmRlclNjcmlwdFRhc2suYXBwbHlSZWZvY3VzRmlsdGVyKHJzVGFza1BhcmFtLm1PcHRpb25zKTsKKworICAgICAgICAgICAgQml0bWFwIGV4cGVjdGVkSW1hZ2UgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKGN0eC5nZXRSZXNvdXJjZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5leHBlY3RlZF9vdXRwdXQpOworCisgICAgICAgICAgICBkb3VibGUgcHNuciA9IEltYWdlQ29tcGFyZS5wc25yKG91dHB1dEltYWdlLCBleHBlY3RlZEltYWdlKTsKKyAgICAgICAgICAgIGFuZHJvaWQudXRpbC5Mb2cuaSgiUmVmb2N1c1Rlc3QiLCAicHNuciA9ICIgKyBTdHJpbmcuZm9ybWF0KCIlLjAyZiIsIHBzbnIpKTsKKyAgICAgICAgICAgIGlmIChwc25yIDwgbWluaW11bVBTTlIpIHsKKyAgICAgICAgICAgICAgICBNZWRpYVN0b3JlU2F2ZXIuc2F2ZVBORyhvdXRwdXRJbWFnZSwgInJlZm9jdXMiLCAicmVmb2N1c19vdXRwdXQiICwgY3R4KTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJSZXF1aXJlZCBtaW5pbXVtIHBzbnIgPSAiICsgU3RyaW5nLmZvcm1hdCgiJS4wMmY7ICIsIG1pbmltdW1QU05SKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWN0dWFsIHBzbnIgPSAiICsgU3RyaW5nLmZvcm1hdCgiJS4wMmYiLCBwc25yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHJzLmRlc3Ryb3koKTsKICAgICAgICAgfQotICAgICAgICBEZXB0aE9mRmllbGRPcHRpb25zIGN1cnJlbnRfZGVwdGhfb3B0aW9ucyA9IG5ldyBEZXB0aE9mRmllbGRPcHRpb25zKGN1cnJlbnRfcmdieik7Ci0gICAgICAgIFJzVGFza1BhcmFtcyByc1Rhc2tQYXJhbSA9IG5ldyBSc1Rhc2tQYXJhbXMocnMsIGN1cnJlbnRfZGVwdGhfb3B0aW9ucyk7Ci0KLSAgICAgICAgUmVuZGVyU2NyaXB0VGFzayByZW5kZXJTY3JpcHRUYXNrID0gbmV3IFJlbmRlclNjcmlwdFRhc2socnMsIGltcGwpOwotICAgICAgICBCaXRtYXAgb3V0cHV0SW1hZ2UgPSByZW5kZXJTY3JpcHRUYXNrLmFwcGx5UmVmb2N1c0ZpbHRlcihyc1Rhc2tQYXJhbS5tT3B0aW9ucyk7Ci0KLSAgICAgICAgQml0bWFwIGV4cGVjdGVkSW1hZ2UgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKGN0eC5nZXRSZXNvdXJjZXMoKSwgUi5kcmF3YWJsZS5leHBlY3RlZF9vdXRwdXQpOwotCi0gICAgICAgIGRvdWJsZSBwc25yID0gSW1hZ2VDb21wYXJlLnBzbnIob3V0cHV0SW1hZ2UsIGV4cGVjdGVkSW1hZ2UpOwotICAgICAgICBhbmRyb2lkLnV0aWwuTG9nLmkoIlJlZm9jdXNUZXN0IiwgInBzbnIgPSAiICsgU3RyaW5nLmZvcm1hdCgiJS4wMmYiLCBwc25yKSk7Ci0gICAgICAgIGlmIChwc25yIDwgbWluaW11bVBTTlIpIHsKLSAgICAgICAgICAgIE1lZGlhU3RvcmVTYXZlci5zYXZlUE5HKG91dHB1dEltYWdlLCAicmVmb2N1cyIsICJyZWZvY3VzX291dHB1dCIgLCBjdHgpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiUmVxdWlyZWQgbWluaW11bSBwc25yID0gIiArIFN0cmluZy5mb3JtYXQoIiUuMDJmOyAiLCBtaW5pbXVtUFNOUikgKwotICAgICAgICAgICAgICAgICAgICAgICAiQWN0dWFsIHBzbnIgPSAiICsgU3RyaW5nLmZvcm1hdCgiJS4wMmYiLCBwc25yKSwKLSAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotICAgICAgICB9Ci0gICAgICAgIHJzLmRlc3Ryb3koKTsKICAgICB9CiAKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcmVuZGVyc2NyaXB0bGVnYWN5L0FuZHJvaWQubWsgYi90ZXN0cy90ZXN0cy9yZW5kZXJzY3JpcHRsZWdhY3kvQW5kcm9pZC5tawppbmRleCA4MTE0NjQyLi5mMThhMDRkIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9yZW5kZXJzY3JpcHRsZWdhY3kvQW5kcm9pZC5taworKysgYi90ZXN0cy90ZXN0cy9yZW5kZXJzY3JpcHRsZWdhY3kvQW5kcm9pZC5tawpAQCAtMjQsNyArMjQsNyBAQAogIyBXaGVuIGJ1aWx0LCBleHBsaWNpdGx5IHB1dCBpdCBpbiB0aGUgZGF0YSBwYXJ0aXRpb24uCiBMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQogCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY3RzdGVzdHJ1bm5lcgorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGN0c3Rlc3RydW5uZXItYXh0CiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcmVuZGVyc2NyaXB0bGVnYWN5L0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy90ZXN0cy9yZW5kZXJzY3JpcHRsZWdhY3kvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBiZDExODRmLi5jZWRlMjVlIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9yZW5kZXJzY3JpcHRsZWdhY3kvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9yZW5kZXJzY3JpcHRsZWdhY3kvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjcsNyArMjcsNyBAQAogICAgIDwvYXBwbGljYXRpb24+CiAKICAgICA8IS0tIFRoaXMgaXMgYSBzZWxmLWluc3RydW1lbnRpbmcgdGVzdCBwYWNrYWdlLiAtLT4KLSAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLnJlbmRlcnNjcmlwdGxlZ2FjeS5jdHMiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgdGVzdHMgb2YgUmVuZGVyc2NyaXB0IGNvbXBvbmVudCI+CiAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJsaXN0ZW5lciIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3JlbmRlcnNjcmlwdGxlZ2FjeS9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy90ZXN0cy9yZW5kZXJzY3JpcHRsZWdhY3kvQW5kcm9pZFRlc3QueG1sCmluZGV4IDY1NTBkNWQuLjEyN2FjZTEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3JlbmRlcnNjcmlwdGxlZ2FjeS9BbmRyb2lkVGVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvcmVuZGVyc2NyaXB0bGVnYWN5L0FuZHJvaWRUZXN0LnhtbApAQCAtMTQsNiArMTQsNyBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZ3VyYXRpb24gZm9yIFJlbmRlcnNjcmlwdCBsZWdhY3kgVGVzdHMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJyZW5kZXJzY3JpcHQiIC8+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CiAgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3JzYmxhcy9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvcnNibGFzL0FuZHJvaWQubWsKaW5kZXggMDM4NTU3My4uZGYxNmY0NiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvcnNibGFzL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvdGVzdHMvcnNibGFzL0FuZHJvaWQubWsKQEAgLTI3LDcgKzI3LDggQEAKICMgV2hlbiBidWlsdCwgZXhwbGljaXRseSBwdXQgaXQgaW4gdGhlIGRhdGEgcGFydGl0aW9uLgogTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKIAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGN0c3Rlc3RydW5uZXIgbGVnYWN5LWFuZHJvaWQtdGVzdAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGN0c3Rlc3RydW5uZXItYXh0CitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicwogTE9DQUxfSk5JX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYm5ubWRhdGFfam5pCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykgJChjYWxsIGFsbC1yZW5kZXJzY3JpcHQtZmlsZXMtdW5kZXIsIHNyYykKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3JzYmxhcy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdGVzdHMvcnNibGFzL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggZjYwOTlmYi4uY2YyNzUwNSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvcnNibGFzL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvcnNibGFzL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTI1LDcgKzI1LDcgQEAKICAgICA8L2FwcGxpY2F0aW9uPgogCiAgICAgPCEtLSBUaGlzIGlzIGEgc2VsZi1pbnN0cnVtZW50aW5nIHRlc3QgcGFja2FnZS4gLS0+Ci0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmFuZHJvaWQuY3RzLnJzYmxhcyIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBvZiBSZW5kZXJTY3JpcHQgSW50cmluc2ljQkxBUyI+CiAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJsaXN0ZW5lciIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3JzYmxhcy9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy90ZXN0cy9yc2JsYXMvQW5kcm9pZFRlc3QueG1sCmluZGV4IDVmODE2NGIuLjdjYmZlMzIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3JzYmxhcy9BbmRyb2lkVGVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvcnNibGFzL0FuZHJvaWRUZXN0LnhtbApAQCAtMTQsNiArMTQsNyBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIFJTIEJMQVMgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9InJlbmRlcnNjcmlwdCIgLz4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcnNibGFzL2xpYmJubm1kYXRhL0FuZHJvaWQubWsgYi90ZXN0cy90ZXN0cy9yc2JsYXMvbGliYm5ubWRhdGEvQW5kcm9pZC5tawppbmRleCBiYmZkMjg5Li42YTVlNTQyIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9yc2JsYXMvbGliYm5ubWRhdGEvQW5kcm9pZC5taworKysgYi90ZXN0cy90ZXN0cy9yc2JsYXMvbGliYm5ubWRhdGEvQW5kcm9pZC5tawpAQCAtMTQsNyArMTQsNiBAQAogCiBMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX0NMQU5HIDo9IHRydWUKIAogTE9DQUxfTU9EVUxFIDo9IGxpYmJubm1kYXRhX2puaQogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKQEAgLTIyLDYgKzIxLDcgQEAKIExPQ0FMX1NES19WRVJTSU9OIDo9IDIzCiBMT0NBTF9OREtfU1RMX1ZBUklBTlQgOj0gYysrX3N0YXRpYwogCitMT0NBTF9DRkxBR1MgOj0gLVdhbGwgLVdlcnJvciAtV25vLXVudXNlZC1jb25zdC12YXJpYWJsZQogTE9DQUxfQ19JTkNMVURFUyA6PSAkKEpOSV9IX0lOQ0xVREUpCiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3JzY3BwL0FuZHJvaWQubWsgYi90ZXN0cy90ZXN0cy9yc2NwcC9BbmRyb2lkLm1rCmluZGV4IDExOTU3YmYuLmJiNmRkZGMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3JzY3BwL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvdGVzdHMvcnNjcHAvQW5kcm9pZC5tawpAQCAtMjgsNyArMjgsOCBAQAogIyBXaGVuIGJ1aWx0LCBleHBsaWNpdGx5IHB1dCBpdCBpbiB0aGUgZGF0YSBwYXJ0aXRpb24uCiBMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQogCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY3RzdGVzdHJ1bm5lciBsZWdhY3ktYW5kcm9pZC10ZXN0CitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY3RzdGVzdHJ1bm5lci1heHQKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCiBMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJyc2NwcHRlc3Rfam5pCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykgJChjYWxsIGFsbC1yZW5kZXJzY3JpcHQtZmlsZXMtdW5kZXIsIHNyYykKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3JzY3BwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy90ZXN0cy9yc2NwcC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDAzNWQyNDIuLmRhNjA4NGIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3JzY3BwL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvcnNjcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjMsNyArMjMsNyBAQAogICAgIDwvYXBwbGljYXRpb24+CiAKICAgICA8IS0tIFRoaXMgaXMgYSBzZWxmLWluc3RydW1lbnRpbmcgdGVzdCBwYWNrYWdlLiAtLT4KLSAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLnJzY3BwLmN0cyIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBvZiBSZW5kZXJTY3JpcHQgQysrIGNvbXBvbmVudCI+CiAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJsaXN0ZW5lciIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3JzY3BwL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL3JzY3BwL0FuZHJvaWRUZXN0LnhtbAppbmRleCA5YTljNmJhLi42MWQwNWE4IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9yc2NwcC9BbmRyb2lkVGVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvcnNjcHAvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlndXJhdGlvbiBmb3IgcmVuZGVyc2NyaXB0IGNwcCBUZXN0cyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9InJlbmRlcnNjcmlwdCIgLz4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvcnNjcHAvbGlicnNjcHB0ZXN0L0FuZHJvaWQubWsgYi90ZXN0cy90ZXN0cy9yc2NwcC9saWJyc2NwcHRlc3QvQW5kcm9pZC5tawppbmRleCA1NjIxYzAyLi42MzNlZTIzIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9yc2NwcC9saWJyc2NwcHRlc3QvQW5kcm9pZC5taworKysgYi90ZXN0cy90ZXN0cy9yc2NwcC9saWJyc2NwcHRlc3QvQW5kcm9pZC5tawpAQCAtMTgsNyArMTgsNiBAQAogTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiBMT0NBTF9BRERJVElPTkFMX0RFUEVOREVOQ0lFUyA6PSAkKExPQ0FMX1BBVEgpL0FuZHJvaWQubWsKLUxPQ0FMX0NMQU5HIDo9IHRydWUKIExPQ0FMX01PRFVMRSA6PSBsaWJyc2NwcHRlc3Rfam5pCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAogCkBAIC00NiwxNCArNDUsMTQgQEAKIExPQ0FMX0NfSU5DTFVERVMgKz0gZnJhbWV3b3Jrcy9ycwogCiBMT0NBTF9DUFBGTEFHUyA6PSAtc3RkPWMrKzExCi1MT0NBTF9DRkxBR1MgOj0gLVduby11bnVzZWQtcGFyYW1ldGVyCitMT0NBTF9DRkxBR1MgOj0gLVdhbGwgLVdlcnJvciAtV25vLXVudXNlZC1wYXJhbWV0ZXIKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJkbCBsaWJsb2cKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGliUlNjcHBfc3RhdGljCiAKIExPQ0FMX1NES19WRVJTSU9OIDo9IDIxCiAKLUxPQ0FMX05ES19TVExfVkFSSUFOVCA6PSBzdGxwb3J0X3N0YXRpYworTE9DQUxfTkRLX1NUTF9WQVJJQU5UIDo9IGMrK19zdGF0aWMKIAogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zYXgvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL3NheC9BbmRyb2lkLm1rCmluZGV4IDBjMmEyYjMuLmI3ZTRiODAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3NheC9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3Rlc3RzL3NheC9BbmRyb2lkLm1rCkBAIC0yMSw3ICsyMSw5IEBACiAjIGFuZCB3aGVuIGJ1aWx0IGV4cGxpY2l0bHkgcHV0IGl0IGluIHRoZSBkYXRhIHBhcnRpdGlvbgogTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKIAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGN0c3Rlc3RydW5uZXIgbGVnYWN5LWFuZHJvaWQtdGVzdAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGN0c3Rlc3RydW5uZXItYXh0CisKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2F4L0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy90ZXN0cy9zYXgvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBjMTViZDdhLi4wYTdhOTJiIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9zYXgvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9zYXgvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjIsNyArMjIsNyBAQAogICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KICAgICA8L2FwcGxpY2F0aW9uPgogCi0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5zYXguY3RzIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIG9mIGFuZHJvaWQuc2F4Ij4KICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9Imxpc3RlbmVyIgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2F4L0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL3NheC9BbmRyb2lkVGVzdC54bWwKaW5kZXggMjA2MDliYy4uZjgxYWE2NyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvc2F4L0FuZHJvaWRUZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9zYXgvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgU0FYIHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJmcmFtZXdvcmsiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJub3Qtc2hhcmRhYmxlIiB2YWx1ZT0idHJ1ZSIgLz4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NlY3VyZV9lbGVtZW50L0FuZHJvaWQubWsgYi90ZXN0cy90ZXN0cy9zZWN1cmVfZWxlbWVudC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNzE4N2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zZWN1cmVfZWxlbWVudC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTYgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2luY2x1ZGUgJChjYWxsIGFsbC1zdWJkaXItbWFrZWZpbGVzKQorCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zZWN1cmVfZWxlbWVudC9hY2Nlc3NfY29udHJvbC9BY2Nlc3NDb250cm9sQXBwMS9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvc2VjdXJlX2VsZW1lbnQvYWNjZXNzX2NvbnRyb2wvQWNjZXNzQ29udHJvbEFwcDEvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDFiNjViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvc2VjdXJlX2VsZW1lbnQvYWNjZXNzX2NvbnRyb2wvQWNjZXNzQ29udHJvbEFwcDEvQW5kcm9pZC5tawpAQCAtMCwwICsxLDU0IEBACisjIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFVuc2lnbmVkIFBhY2thZ2UKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNTZWN1cmVFbGVtZW50QWNjZXNzQ29udHJvbFRlc3RDYXNlczEKKyMgRG9uJ3QgaW5jbHVkZSB0aGlzIHBhY2thZ2UgaW4gYW55IHRhcmdldC4KK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisjIFdoZW4gYnVpbHQsIGV4cGxpY2l0bHkgcHV0IGl0IGluIHRoZSBkYXRhIHBhcnRpdGlvbi4KK0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAorCWN0c3Rlc3RydW5uZXItYXh0IFwKKwljb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dAorTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQorTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorTE9DQUxfSkFWQV9MSUJSQVJJRVMgKz0gYW5kcm9pZC50ZXN0LnJ1bm5lcgorTE9DQUxfSkFWQV9MSUJSQVJJRVMgKz0gYW5kcm9pZC50ZXN0LmJhc2UKKyMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCisKK2luY2x1ZGUgJChCVUlMRF9DVFNfUEFDS0FHRSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFNpZ25lZCBQYWNrYWdlCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEUgOj0gc2lnbmVkLUN0c1NlY3VyZUVsZW1lbnRBY2Nlc3NDb250cm9sVGVzdENhc2VzMQorTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBBUFBTCitMT0NBTF9CVUlMVF9NT0RVTEVfU1RFTSA6PSBwYWNrYWdlLmFwaworIyBNYWtlIHN1cmUgdGhlIGJ1aWxkIHN5c3RlbSBkb2Vzbid0IHRyeSB0byByZXNpZ24gdGhlIEFQSworTE9DQUxfQ0VSVElGSUNBVEUgOj0gUFJFU0lHTkVECitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworCitMT0NBTF9SRVBMQUNFX1BSRUJVSUxUX0FQS19JTlNUQUxMRUQgOj0gJChMT0NBTF9QQVRIKS9hcGsvc2lnbmVkLUN0c1NlY3VyZUVsZW1lbnRBY2Nlc3NDb250cm9sVGVzdENhc2VzMS5hcGsKKworaW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJlX2VsZW1lbnQvYWNjZXNzX2NvbnRyb2wvQWNjZXNzQ29udHJvbEFwcDEvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL3NlY3VyZV9lbGVtZW50L2FjY2Vzc19jb250cm9sL0FjY2Vzc0NvbnRyb2xBcHAxL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI4ZGRjYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3NlY3VyZV9lbGVtZW50L2FjY2Vzc19jb250cm9sL0FjY2Vzc0NvbnRyb2xBcHAxL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwzMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgICBwYWNrYWdlPSJhbmRyb2lkLm9tYXBpLmFjY2Vzc2NvbnRyb2wxLmN0cyI+CisKKyAgICA8YXBwbGljYXRpb24+CisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIi8+CisgICAgPC9hcHBsaWNhdGlvbj4KKworICAgIDwhLS0gVGhpcyBpcyBhIHNlbGYtaW5zdHJ1bWVudGluZyB0ZXN0IHBhY2thZ2UuIC0tPgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgdGVzdHMgZm9yIE9wZW4gTW9iaWxlIEFQSSIKKyAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5vbWFwaS5hY2Nlc3Njb250cm9sMS5jdHMiPgorICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0ibGlzdGVuZXIiCisgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp2YWx1ZT0iY29tLmFuZHJvaWQuY3RzLnJ1bm5lci5DdHNUZXN0UnVuTGlzdGVuZXIiLz4KKyAgICA8L2luc3RydW1lbnRhdGlvbj4KKworPC9tYW5pZmVzdD4KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJlX2VsZW1lbnQvYWNjZXNzX2NvbnRyb2wvQWNjZXNzQ29udHJvbEFwcDEvQW5kcm9pZFRlc3QueG1sIGIvdGVzdHMvdGVzdHMvc2VjdXJlX2VsZW1lbnQvYWNjZXNzX2NvbnRyb2wvQWNjZXNzQ29udHJvbEFwcDEvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNzk3OGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zZWN1cmVfZWxlbWVudC9hY2Nlc3NfY29udHJvbC9BY2Nlc3NDb250cm9sQXBwMS9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwyNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBPTUFQSSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIi8+CisgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJzeXN0ZW1zIi8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0ic2lnbmVkLUN0c1NlY3VyZUVsZW1lbnRBY2Nlc3NDb250cm9sVGVzdENhc2VzMS5hcGsiLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuQW5kcm9pZEpVbml0VGVzdCI+CisgICAgICAgIDxvcHRpb24gbmFtZT0icGFja2FnZSIgdmFsdWU9ImFuZHJvaWQub21hcGkuYWNjZXNzY29udHJvbDEuY3RzIi8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVudGltZS1oaW50IiB2YWx1ZT0iMTBtMTBzIi8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJlX2VsZW1lbnQvYWNjZXNzX2NvbnRyb2wvQWNjZXNzQ29udHJvbEFwcDEvYXBrL3NpZ25lZC1DdHNTZWN1cmVFbGVtZW50QWNjZXNzQ29udHJvbFRlc3RDYXNlczEuYXBrIGIvdGVzdHMvdGVzdHMvc2VjdXJlX2VsZW1lbnQvYWNjZXNzX2NvbnRyb2wvQWNjZXNzQ29udHJvbEFwcDEvYXBrL3NpZ25lZC1DdHNTZWN1cmVFbGVtZW50QWNjZXNzQ29udHJvbFRlc3RDYXNlczEuYXBrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmODdiNWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zZWN1cmVfZWxlbWVudC9hY2Nlc3NfY29udHJvbC9BY2Nlc3NDb250cm9sQXBwMS9hcGsvc2lnbmVkLUN0c1NlY3VyZUVsZW1lbnRBY2Nlc3NDb250cm9sVGVzdENhc2VzMS5hcGsKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJlX2VsZW1lbnQvYWNjZXNzX2NvbnRyb2wvQWNjZXNzQ29udHJvbEFwcDEvc3JjL2FuZHJvaWQvb21hcGkvYWNjZXNzY29udHJvbDEvY3RzL0FjY2Vzc0NvbnRyb2xUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9zZWN1cmVfZWxlbWVudC9hY2Nlc3NfY29udHJvbC9BY2Nlc3NDb250cm9sQXBwMS9zcmMvYW5kcm9pZC9vbWFwaS9hY2Nlc3Njb250cm9sMS9jdHMvQWNjZXNzQ29udHJvbFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40ZWI3Y2I5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvc2VjdXJlX2VsZW1lbnQvYWNjZXNzX2NvbnRyb2wvQWNjZXNzQ29udHJvbEFwcDEvc3JjL2FuZHJvaWQvb21hcGkvYWNjZXNzY29udHJvbDEvY3RzL0FjY2Vzc0NvbnRyb2xUZXN0LmphdmEKQEAgLTAsMCArMSw0MDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKiBDb250cmlidXRlZCBieSBPcmFuZ2UgKi8KKworcGFja2FnZSBhbmRyb2lkLm9tYXBpLmFjY2Vzc2NvbnRyb2wxLmN0czsKKworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3N1bWUuYXNzdW1lVHJ1ZTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOworaW1wb3J0IGFuZHJvaWQuc2Uub21hcGkuQ2hhbm5lbDsKK2ltcG9ydCBhbmRyb2lkLnNlLm9tYXBpLlJlYWRlcjsKK2ltcG9ydCBhbmRyb2lkLnNlLm9tYXBpLlNFU2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLnNlLm9tYXBpLlNFU2VydmljZS5PbkNvbm5lY3RlZExpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQuc2Uub21hcGkuU2Vzc2lvbjsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlByb3BlcnR5VXRpbDsKKworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS51dGlsLlRpbWVyOworaW1wb3J0IGphdmEudXRpbC5UaW1lclRhc2s7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZW91dEV4Y2VwdGlvbjsKKworcHVibGljIGNsYXNzIEFjY2Vzc0NvbnRyb2xUZXN0IHsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVUlDQ19SRUFERVJfUFJFRklYID0gIlNJTSI7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEVTRV9SRUFERVJfUFJFRklYID0gImVTRSI7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFNEX1JFQURFUl9QUkVGSVggPSAiU0QiOworCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZVtdIEFJRF80MCA9IG5ldyBieXRlW10geyAoYnl0ZSkgMHhBMCwgMHgwMCwgMHgwMCwKKyAgICAgICAgMHgwNCwgMHg3NiwgMHg0MSwgMHg2RSwgMHg2NCwgMHg3MiwgMHg2RiwgMHg2OSwgMHg2NCwgMHg0MywgMHg1NCwKKyAgICAgICAgMHg1MywgMHg0MCB9OworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGVbXSBBSURfNDEgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpIDB4QTAsIDB4MDAsIDB4MDAsCisgICAgICAgIDB4MDQsIDB4NzYsIDB4NDEsIDB4NkUsIDB4NjQsIDB4NzIsIDB4NkYsIDB4NjksIDB4NjQsIDB4NDMsIDB4NTQsCisgICAgICAgIDB4NTMsIDB4NDEgfTsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlW10gQUlEXzQyID0gbmV3IGJ5dGVbXSB7IChieXRlKSAweEEwLCAweDAwLCAweDAwLAorICAgICAgICAweDA0LCAweDc2LCAweDQxLCAweDZFLCAweDY0LCAweDcyLCAweDZGLCAweDY5LCAweDY0LCAweDQzLCAweDU0LAorICAgICAgICAweDUzLCAweDQyIH07CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZVtdIEFJRF80MyA9IG5ldyBieXRlW10geyAoYnl0ZSkgMHhBMCwgMHgwMCwgMHgwMCwKKyAgICAgICAgMHgwNCwgMHg3NiwgMHg0MSwgMHg2RSwgMHg2NCwgMHg3MiwgMHg2RiwgMHg2OSwgMHg2NCwgMHg0MywgMHg1NCwKKyAgICAgICAgMHg1MywgMHg0MyB9OworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGVbXSBBSURfNDQgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpIDB4QTAsIDB4MDAsIDB4MDAsCisgICAgICAgIDB4MDQsIDB4NzYsIDB4NDEsIDB4NkUsIDB4NjQsIDB4NzIsIDB4NkYsIDB4NjksIDB4NjQsIDB4NDMsIDB4NTQsCisgICAgICAgIDB4NTMsIDB4NDQgfTsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlW10gQUlEXzQ1ID0gbmV3IGJ5dGVbXSB7IChieXRlKSAweEEwLCAweDAwLCAweDAwLAorICAgICAgICAweDA0LCAweDc2LCAweDQxLCAweDZFLCAweDY0LCAweDcyLCAweDZGLCAweDY5LCAweDY0LCAweDQzLCAweDU0LAorICAgICAgICAweDUzLCAweDQ1IH07CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZVtdIEFJRF80NiA9IG5ldyBieXRlW10geyAoYnl0ZSkgMHhBMCwgMHgwMCwgMHgwMCwKKyAgICAgICAgMHgwNCwgMHg3NiwgMHg0MSwgMHg2RSwgMHg2NCwgMHg3MiwgMHg2RiwgMHg2OSwgMHg2NCwgMHg0MywgMHg1NCwKKyAgICAgICAgMHg1MywgMHg0NiB9OworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGVbXSBBSURfNDcgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpIDB4QTAsIDB4MDAsIDB4MDAsCisgICAgICAgIDB4MDQsIDB4NzYsIDB4NDEsIDB4NkUsIDB4NjQsIDB4NzIsIDB4NkYsIDB4NjksIDB4NjQsIDB4NDMsIDB4NTQsCisgICAgICAgIDB4NTMsIDB4NDcgfTsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlW10gQUlEXzQ4ID0gbmV3IGJ5dGVbXSB7IChieXRlKSAweEEwLCAweDAwLCAweDAwLAorICAgICAgICAweDA0LCAweDc2LCAweDQxLCAweDZFLCAweDY0LCAweDcyLCAweDZGLCAweDY5LCAweDY0LCAweDQzLCAweDU0LAorICAgICAgICAweDUzLCAweDQ4IH07CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZVtdIEFJRF80OSA9IG5ldyBieXRlW10geyAoYnl0ZSkgMHhBMCwgMHgwMCwgMHgwMCwKKyAgICAgICAgMHgwNCwgMHg3NiwgMHg0MSwgMHg2RSwgMHg2NCwgMHg3MiwgMHg2RiwgMHg2OSwgMHg2NCwgMHg0MywgMHg1NCwKKyAgICAgICAgMHg1MywgMHg0OSB9OworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGVbXSBBSURfNEEgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpIDB4QTAsIDB4MDAsIDB4MDAsCisgICAgICAgIDB4MDQsIDB4NzYsIDB4NDEsIDB4NkUsIDB4NjQsIDB4NzIsIDB4NkYsIDB4NjksIDB4NjQsIDB4NDMsIDB4NTQsCisgICAgICAgIDB4NTMsIChieXRlKSAweDRBIH07CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZVtdIEFJRF80QiA9IG5ldyBieXRlW10geyAoYnl0ZSkgMHhBMCwgMHgwMCwgMHgwMCwKKyAgICAgICAgMHgwNCwgMHg3NiwgMHg0MSwgMHg2RSwgMHg2NCwgMHg3MiwgMHg2RiwgMHg2OSwgMHg2NCwgMHg0MywgMHg1NCwKKyAgICAgICAgMHg1MywgKGJ5dGUpIDB4NEIgfTsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlW10gQUlEXzRDID0gbmV3IGJ5dGVbXSB7IChieXRlKSAweEEwLCAweDAwLCAweDAwLAorICAgICAgICAweDA0LCAweDc2LCAweDQxLCAweDZFLCAweDY0LCAweDcyLCAweDZGLCAweDY5LCAweDY0LCAweDQzLCAweDU0LAorICAgICAgICAweDUzLCAoYnl0ZSkgMHg0QyB9OworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGVbXSBBSURfNEQgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpIDB4QTAsIDB4MDAsIDB4MDAsCisgICAgICAgIDB4MDQsIDB4NzYsIDB4NDEsIDB4NkUsIDB4NjQsIDB4NzIsIDB4NkYsIDB4NjksIDB4NjQsIDB4NDMsIDB4NTQsCisgICAgICAgIDB4NTMsIChieXRlKSAweDREIH07CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZVtdIEFJRF80RSA9IG5ldyBieXRlW10geyAoYnl0ZSkgMHhBMCwgMHgwMCwgMHgwMCwKKyAgICAgICAgMHgwNCwgMHg3NiwgMHg0MSwgMHg2RSwgMHg2NCwgMHg3MiwgMHg2RiwgMHg2OSwgMHg2NCwgMHg0MywgMHg1NCwKKyAgICAgICAgMHg1MywgKGJ5dGUpIDB4NEUgfTsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlW10gQUlEXzRGID0gbmV3IGJ5dGVbXSB7IChieXRlKSAweEEwLCAweDAwLCAweDAwLAorICAgICAgICAweDA0LCAweDc2LCAweDQxLCAweDZFLCAweDY0LCAweDcyLCAweDZGLCAweDY5LCAweDY0LCAweDQzLCAweDU0LAorICAgICAgICAweDUzLCAoYnl0ZSkgMHg0RiB9OworCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZVtdW10gQVVUSE9SSVpFRF9BSUQgPSBuZXcgYnl0ZVtdW10geyBBSURfNDAsCisgICAgICAgIEFJRF80MSwgQUlEXzQyLCBBSURfNDQsIEFJRF80NSwgQUlEXzQ3LCBBSURfNDgsIEFJRF80OSwgQUlEXzRBLAorICAgICAgICBBSURfNEIsIEFJRF80QywgQUlEXzRELCBBSURfNEUsIEFJRF80RiB9OworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGVbXVtdIFVOQVVUSE9SSVpFRF9BSUQgPSBuZXcgYnl0ZVtdW10geyBBSURfNDMsCisgICAgICAgIEFJRF80NiB9OworCisgICAgLyogQXV0aG9yaXplZCBBUERVIGZvciBBSURfNDAgKi8KKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlW11bXSBBVVRIT1JJWkVEX0FQRFVfQUlEXzQwID0gbmV3IGJ5dGVbXVtdIHsKKyAgICAgICAgeyAweDAwLCAweDA2LCAweDAwLCAweDAwIH0sIHsgKGJ5dGUpIDB4QTAsIDB4MDYsIDB4MDAsIDB4MDAgfSx9OworICAgIC8qIFVuYXV0aG9yaXplZCBBUERVIGZvciBBSURfNDAgKi8KKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlW11bXSBVTkFVVEhPUklaRURfQVBEVV9BSURfNDAgPSBuZXcgYnl0ZVtdW10geworICAgICAgICB7IDB4MDAsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAgfSwKKyAgICAgICAgeyAoYnl0ZSkgMHg4MCwgMHgwNiwgMHgwMCwgMHgwMCB9LAorICAgICAgICB7IChieXRlKSAweEEwLCAweDA4LCAweDAwLCAweDAwLCAweDAwIH0sCisgICAgICAgIHsgKGJ5dGUpIDB4OTQsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAgfSwgfTsKKworICAgIC8qIEF1dGhvcml6ZWQgQVBEVSBmb3IgQUlEXzQxICovCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZVtdW10gQVVUSE9SSVpFRF9BUERVX0FJRF80MSA9IG5ldyBieXRlW11bXSB7CisgICAgICAgIHsgKGJ5dGUpIDB4OTQsIDB4MDYsIDB4MDAsIDB4MDAgfSwKKyAgICAgICAgeyAoYnl0ZSkgMHg5NCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCB9LAorICAgICAgICB7IChieXRlKSAweDk0LCAoYnl0ZSkgMHgwQywgMHgwMCwgMHgwMCwgMHgwMSwgKGJ5dGUpIDB4QUEsIDB4MDAgfSwKKyAgICAgICAgeyAoYnl0ZSkgMHg5NCwgMHgwQSwgMHgwMCwgMHgwMCwgMHgwMSwgKGJ5dGUpIDB4QUEgfSB9OworICAgIC8qIFVuYXV0aG9yaXplZCBBUERVIGZvciBBSURfNDEgKi8KKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlW11bXSBVTkFVVEhPUklaRURfQVBEVV9BSURfNDEgPSBuZXcgYnl0ZVtdW10geworICAgICAgICB7IDB4MDAsIDB4MDYsIDB4MDAsIDB4MDAgfSwgeyAoYnl0ZSkgMHg4MCwgMHgwNiwgMHgwMCwgMHgwMCB9LAorICAgICAgICB7IChieXRlKSAweEEwLCAweDA2LCAweDAwLCAweDAwIH0sCisgICAgICAgIHsgMHgwMCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCB9LAorICAgICAgICB7IChieXRlKSAweDAwLCAweDBBLCAweDAwLCAweDAwLCAweDAxLCAoYnl0ZSkgMHhBQSB9LAorICAgICAgICB7IChieXRlKSAweDgwLCAweDBBLCAweDAwLCAweDAwLCAweDAxLCAoYnl0ZSkgMHhBQSB9LAorICAgICAgICB7IChieXRlKSAweEEwLCAweDBBLCAweDAwLCAweDAwLCAweDAxLCAoYnl0ZSkgMHhBQSB9LAorICAgICAgICB7IChieXRlKSAweDgwLCAweDA4LCAweDAwLCAweDAwLCAweDAwIH0sCisgICAgICAgIHsgKGJ5dGUpIDB4QTAsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAgfSwKKyAgICAgICAgeyAweDAwLCAoYnl0ZSkgMHgwQywgMHgwMCwgMHgwMCwgMHgwMSwgKGJ5dGUpIDB4QUEsIDB4MDAgfSwKKyAgICAgICAgeyAoYnl0ZSkgMHg4MCwgKGJ5dGUpIDB4MEMsIDB4MDAsIDB4MDAsIDB4MDEsIChieXRlKSAweEFBLCAweDAwIH0sCisgICAgICAgIHsgKGJ5dGUpIDB4QTAsIChieXRlKSAweDBDLCAweDAwLCAweDAwLCAweDAxLCAoYnl0ZSkgMHhBQSwgMHgwMCB9LAorICAgIH07CisKKyAgICBwcml2YXRlIGZpbmFsIGxvbmcgU0VSVklDRV9DT05ORUNUSU9OX1RJTUVfT1VUID0gMzAwMDsKKyAgICBwcml2YXRlIFNFU2VydmljZSBzZVNlcnZpY2U7CisgICAgcHJpdmF0ZSBPYmplY3Qgc2VydmljZU11dGV4ID0gbmV3IE9iamVjdCgpOworICAgIHByaXZhdGUgVGltZXIgY29ubmVjdGlvblRpbWVyOworICAgIHByaXZhdGUgU2VydmljZUNvbm5lY3Rpb25UaW1lclRhc2sgbVRpbWVyVGFzayA9IG5ldyBTZXJ2aWNlQ29ubmVjdGlvblRpbWVyVGFzaygpOworICAgIHByaXZhdGUgYm9vbGVhbiBjb25uZWN0ZWQgPSBmYWxzZTsKKworICAgIHByaXZhdGUgZmluYWwgT25Db25uZWN0ZWRMaXN0ZW5lciBtTGlzdGVuZXIgPSBuZXcgT25Db25uZWN0ZWRMaXN0ZW5lcigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25Db25uZWN0ZWQoKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNlcnZpY2VNdXRleCkgeworICAgICAgICAgICAgICAgIGNvbm5lY3RlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgc2VydmljZU11dGV4Lm5vdGlmeSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIGNsYXNzIFN5bmNocm9ub3VzRXhlY3V0b3IgaW1wbGVtZW50cyBFeGVjdXRvciB7CisgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoUnVubmFibGUgcikgeworICAgICAgICAgICAgci5ydW4oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBzdXBwb3J0c0hhcmR3YXJlKCkgeworICAgICAgICBmaW5hbCBQYWNrYWdlTWFuYWdlciBwbSA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKS5nZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICBib29sZWFuIGxvd1JhbURldmljZSA9IFByb3BlcnR5VXRpbC5wcm9wZXJ0eUVxdWFscygicm8uY29uZmlnLmxvd19yYW0iLCAidHJ1ZSIpOworICAgICAgICByZXR1cm4gIWxvd1JhbURldmljZSB8fCAobG93UmFtRGV2aWNlICYmIHBtLmhhc1N5c3RlbUZlYXR1cmUoImFuZHJvaWQuaGFyZHdhcmUudHlwZS53YXRjaCIpKTsKKyAgICB9CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzdW1lVHJ1ZShQcm9wZXJ0eVV0aWwuZ2V0Rmlyc3RBcGlMZXZlbCgpID4gQnVpbGQuVkVSU0lPTl9DT0RFUy5PX01SMSk7CisgICAgICAgIGFzc3VtZVRydWUoc3VwcG9ydHNIYXJkd2FyZSgpKTsKKyAgICAgICAgc2VTZXJ2aWNlID0gbmV3IFNFU2VydmljZShJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCksIG5ldyBTeW5jaHJvbm91c0V4ZWN1dG9yKCksIG1MaXN0ZW5lcik7CisgICAgICAgIGNvbm5lY3Rpb25UaW1lciA9IG5ldyBUaW1lcigpOworICAgICAgICBjb25uZWN0aW9uVGltZXIuc2NoZWR1bGUobVRpbWVyVGFzaywgU0VSVklDRV9DT05ORUNUSU9OX1RJTUVfT1VUKTsKKyAgICB9CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoc2VTZXJ2aWNlICE9IG51bGwgJiYgc2VTZXJ2aWNlLmlzQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgICAgIHNlU2VydmljZS5zaHV0ZG93bigpOworICAgICAgICAgICAgY29ubmVjdGVkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgd2FpdEZvckNvbm5lY3Rpb24oKSB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiB7CisgICAgICAgIHN5bmNocm9uaXplZCAoc2VydmljZU11dGV4KSB7CisgICAgICAgICAgICBpZiAoIWNvbm5lY3RlZCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VNdXRleC53YWl0KCk7CisgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFjb25uZWN0ZWQpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVGltZW91dEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIlNlcnZpY2UgY291bGQgbm90IGJlIGNvbm5lY3RlZCBhZnRlciAiCisgICAgICAgICAgICAgICAgICAgICsgU0VSVklDRV9DT05ORUNUSU9OX1RJTUVfT1VUICsgIiBtcyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb25UaW1lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29ubmVjdGlvblRpbWVyLmNhbmNlbCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0aG9yaXplZEFJRCgpIHsKKyAgICAgICAgZm9yIChieXRlW10gYWlkIDogQVVUSE9SSVpFRF9BSUQpIHsKKyAgICAgICAgICAgIHRlc3RTZWxlY3RhYmxlQWlkKGFpZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVbmF1dGhvcml6ZWRBSUQoKSB7CisgICAgICAgIGZvciAoYnl0ZVtdIGFpZCA6IFVOQVVUSE9SSVpFRF9BSUQpIHsKKyAgICAgICAgICAgIHRlc3RVbmF1dGhvcmlzZWRBaWQoYWlkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEF1dGhvcml6ZWRBUERVQUlENDAoKSB7CisgICAgICAgIGZvciAoYnl0ZVtdIGFwZHUgOiBBVVRIT1JJWkVEX0FQRFVfQUlEXzQwKSB7CisgICAgICAgICAgICB0ZXN0VHJhbnNtaXRBUERVKEFJRF80MCwgYXBkdSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVbmF1dGhvcmlzZWRBUERVQUlENDAoKSB7CisgICAgICAgIGZvciAoYnl0ZVtdIGFwZHUgOiBVTkFVVEhPUklaRURfQVBEVV9BSURfNDApIHsKKyAgICAgICAgICAgIHRlc3RVbmF1dGhvcmlzZWRBUERVKEFJRF80MCwgYXBkdSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRob3JpemVkQVBEVUFJRDQxKCkgeworICAgICAgICBmb3IgKGJ5dGVbXSBhcGR1IDogQVVUSE9SSVpFRF9BUERVX0FJRF80MSkgeworICAgICAgICAgICAgdGVzdFRyYW5zbWl0QVBEVShBSURfNDEsIGFwZHUpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VW5hdXRob3Jpc2VkQVBEVUFJRDQxKCkgeworICAgICAgICBmb3IgKGJ5dGVbXSBhcGR1IDogVU5BVVRIT1JJWkVEX0FQRFVfQUlEXzQxKSB7CisgICAgICAgICAgICB0ZXN0VW5hdXRob3Jpc2VkQVBEVShBSURfNDEsIGFwZHUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RTZWxlY3RhYmxlQWlkKGJ5dGVbXSBhaWQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdhaXRGb3JDb25uZWN0aW9uKCk7CisgICAgICAgICAgICBSZWFkZXJbXSByZWFkZXJzID0gc2VTZXJ2aWNlLmdldFJlYWRlcnMoKTsKKyAgICAgICAgICAgIGZvciAoUmVhZGVyIHJlYWRlciA6IHJlYWRlcnMpIHsKKyAgICAgICAgICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBudWxsOworICAgICAgICAgICAgICAgIENoYW5uZWwgY2hhbm5lbCA9IG51bGw7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZWFkZXIuaXNTZWN1cmVFbGVtZW50UHJlc2VudCgpKTsKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbiA9IHJlYWRlci5vcGVuU2Vzc2lvbigpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJOdWxsIFNlc3Npb24iLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCA9IHNlc3Npb24ub3BlbkxvZ2ljYWxDaGFubmVsKGFpZCwgKGJ5dGUpIDB4MDApOworICAgICAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJOdWxsIENoYW5uZWwiLCBjaGFubmVsKTsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIHNlbGVjdFJlc3BvbnNlID0gY2hhbm5lbC5nZXRTZWxlY3RSZXNwb25zZSgpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJOdWxsIFNlbGVjdCBSZXNwb25zZSIsIHNlbGVjdFJlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VGhhdChzZWxlY3RSZXNwb25zZVtzZWxlY3RSZXNwb25zZS5sZW5ndGggLSAxXSAmIDB4RkYsIGlzKDB4MDApKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VGhhdChzZWxlY3RSZXNwb25zZVtzZWxlY3RSZXNwb25zZS5sZW5ndGggLSAyXSAmIDB4RkYsIGlzKDB4OTApKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiU2VsZWN0IFJlc3BvbnNlIGlzIG5vdCBjb21wbGV0ZSIsIHZlcmlmeUJlclRsdkRhdGEoc2VsZWN0UmVzcG9uc2UpKTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBpZiAoY2hhbm5lbCAhPSBudWxsKSBjaGFubmVsLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHNlc3Npb24uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEV4Y2VwdGlvbiAiICsgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdFVuYXV0aG9yaXNlZEFpZChieXRlW10gYWlkKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3YWl0Rm9yQ29ubmVjdGlvbigpOworICAgICAgICAgICAgUmVhZGVyW10gcmVhZGVycyA9IHNlU2VydmljZS5nZXRSZWFkZXJzKCk7CisgICAgICAgICAgICBmb3IgKFJlYWRlciByZWFkZXIgOiByZWFkZXJzKSB7CisgICAgICAgICAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gbnVsbDsKKyAgICAgICAgICAgICAgICBDaGFubmVsIGNoYW5uZWwgPSBudWxsOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUocmVhZGVyLmlzU2VjdXJlRWxlbWVudFByZXNlbnQoKSk7CisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24gPSByZWFkZXIub3BlblNlc3Npb24oKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiTnVsbCBTZXNzaW9uIiwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsID0gc2Vzc2lvbi5vcGVuTG9naWNhbENoYW5uZWwoYWlkLCAoYnl0ZSkgMHgwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsKCJTZWN1cml0eUV4Y2VwdGlvbiBFeHBlY3RlZCIpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBFeHBlY3RlZAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5uZWwgIT0gbnVsbCkgY2hhbm5lbC5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKSBzZXNzaW9uLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBFeGNlcHRpb24gIiArIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RUcmFuc21pdEFQRFUoYnl0ZVtdIGFpZCwgYnl0ZVtdIGFwZHUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdhaXRGb3JDb25uZWN0aW9uKCk7CisgICAgICAgICAgICBSZWFkZXJbXSByZWFkZXJzID0gc2VTZXJ2aWNlLmdldFJlYWRlcnMoKTsKKyAgICAgICAgICAgIGZvciAoUmVhZGVyIHJlYWRlciA6IHJlYWRlcnMpIHsKKyAgICAgICAgICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBudWxsOworICAgICAgICAgICAgICAgIENoYW5uZWwgY2hhbm5lbCA9IG51bGw7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZWFkZXIuaXNTZWN1cmVFbGVtZW50UHJlc2VudCgpKTsKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbiA9IHJlYWRlci5vcGVuU2Vzc2lvbigpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJOdWxsIFNlc3Npb24iLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCA9IHNlc3Npb24ub3BlbkxvZ2ljYWxDaGFubmVsKGFpZCwgKGJ5dGUpIDB4MDApOworICAgICAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJOdWxsIENoYW5uZWwiLCBjaGFubmVsKTsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIHNlbGVjdFJlc3BvbnNlID0gY2hhbm5lbC5nZXRTZWxlY3RSZXNwb25zZSgpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJOdWxsIFNlbGVjdCBSZXNwb25zZSIsIHNlbGVjdFJlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VGhhdChzZWxlY3RSZXNwb25zZVtzZWxlY3RSZXNwb25zZS5sZW5ndGggLSAxXSAmIDB4RkYsIGlzKDB4MDApKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VGhhdChzZWxlY3RSZXNwb25zZVtzZWxlY3RSZXNwb25zZS5sZW5ndGggLSAyXSAmIDB4RkYsIGlzKDB4OTApKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiU2VsZWN0IFJlc3BvbnNlIGlzIG5vdCBjb21wbGV0ZSIsIHZlcmlmeUJlclRsdkRhdGEoc2VsZWN0UmVzcG9uc2UpKTsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGFwZHVSZXNwb25zZSA9IGNoYW5uZWwudHJhbnNtaXQoYXBkdSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIk51bGwgQ2hhbm5lbCIsIGFwZHVSZXNwb25zZSk7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5uZWwgIT0gbnVsbCkgY2hhbm5lbC5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKSBzZXNzaW9uLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBFeGNlcHRpb24gIiArIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RVbmF1dGhvcmlzZWRBUERVKGJ5dGVbXSBhaWQsIGJ5dGVbXSBhcGR1KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3YWl0Rm9yQ29ubmVjdGlvbigpOworICAgICAgICAgICAgUmVhZGVyW10gcmVhZGVycyA9IHNlU2VydmljZS5nZXRSZWFkZXJzKCk7CisgICAgICAgICAgICBmb3IgKFJlYWRlciByZWFkZXIgOiByZWFkZXJzKSB7CisgICAgICAgICAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gbnVsbDsKKyAgICAgICAgICAgICAgICBDaGFubmVsIGNoYW5uZWwgPSBudWxsOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUocmVhZGVyLmlzU2VjdXJlRWxlbWVudFByZXNlbnQoKSk7CisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24gPSByZWFkZXIub3BlblNlc3Npb24oKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiTnVsbCBTZXNzaW9uIiwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgPSBzZXNzaW9uLm9wZW5Mb2dpY2FsQ2hhbm5lbChhaWQsIChieXRlKSAweDAwKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiTnVsbCBDaGFubmVsIiwgY2hhbm5lbCk7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBzZWxlY3RSZXNwb25zZSA9IGNoYW5uZWwuZ2V0U2VsZWN0UmVzcG9uc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiTnVsbCBTZWxlY3QgUmVzcG9uc2UiLCBzZWxlY3RSZXNwb25zZSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRoYXQoc2VsZWN0UmVzcG9uc2Vbc2VsZWN0UmVzcG9uc2UubGVuZ3RoIC0gMV0gJiAweEZGLCBpcygweDAwKSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRoYXQoc2VsZWN0UmVzcG9uc2Vbc2VsZWN0UmVzcG9uc2UubGVuZ3RoIC0gMl0gJiAweEZGLCBpcygweDkwKSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIlNlbGVjdCBSZXNwb25zZSBpcyBub3QgY29tcGxldGUiLCB2ZXJpZnlCZXJUbHZEYXRhKHNlbGVjdFJlc3BvbnNlKSk7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsLnRyYW5zbWl0KGFwZHUpOworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbCgiU2VjdXJpdHkgRXhjZXB0aW9uIGlzIGV4cGVjdGVkIik7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4cGVjdGVkCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBpZiAoY2hhbm5lbCAhPSBudWxsKSBjaGFubmVsLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHNlc3Npb24uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEV4Y2VwdGlvbiAiICsgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWZXJpZmllcyBUTFYgZGF0YQorICAgICAqCisgICAgICogQHBhcmFtIHRsdgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZGF0YSBpcyB0bHYgZm9ybWF0dGVkLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHZlcmlmeUJlclRsdkRhdGEoYnl0ZVtdIHRsdikgeworICAgICAgICBpZiAodGx2ID09IG51bGwgfHwgdGx2Lmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW52YWxpZCB0bHYsIG51bGwiKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgYnl0ZVtdIGtleSA9IG5ldyBieXRlWzJdOworICAgICAgICBrZXlbMF0gPSB0bHZbaV07CisgICAgICAgIGlmICgoa2V5WzBdICYgMHgxRikgPT0gMHgxRikgeworICAgICAgICAgICAgLy8gZXh0cmEgYnl0ZSBmb3IgVEFHIGZpZWxkCisgICAgICAgICAgICBrZXlbMV0gPSB0bHZbaSA9IGkgKyAxXTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBsZW4gPSB0bHZbaSA9IGkgKyAxXSAmIDB4RkY7CisgICAgICAgIGlmIChsZW4gPiAxMjcpIHsKKyAgICAgICAgICAgIC8vIG1vcmUgdGhhbiAxIGJ5dGUgZm9yIGxlbmd0aAorICAgICAgICAgICAgaW50IGJ5dGVzTGVuZ3RoID0gbGVuIC0gMTI4OworICAgICAgICAgICAgbGVuID0gMDsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSBieXRlc0xlbmd0aCAtIDE7IGogPj0gMDsgai0tKSB7CisgICAgICAgICAgICAgIGxlbiArPSAodGx2W2kgPSBpICsgMV0gJiAweEZGKSAqIE1hdGgucG93KDEwLCBqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGx2Lmxlbmd0aCA9PSAoaSArIGxlbiArIDMpOworICAgIH0KKworICAgIGNsYXNzIFNlcnZpY2VDb25uZWN0aW9uVGltZXJUYXNrIGV4dGVuZHMgVGltZXJUYXNrIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoc2VydmljZU11dGV4KSB7CisgICAgICAgICAgICAgICAgc2VydmljZU11dGV4Lm5vdGlmeUFsbCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJlX2VsZW1lbnQvYWNjZXNzX2NvbnRyb2wvQWNjZXNzQ29udHJvbEFwcDIvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL3NlY3VyZV9lbGVtZW50L2FjY2Vzc19jb250cm9sL0FjY2Vzc0NvbnRyb2xBcHAyL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY1M2VmMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3NlY3VyZV9lbGVtZW50L2FjY2Vzc19jb250cm9sL0FjY2Vzc0NvbnRyb2xBcHAyL0FuZHJvaWQubWsKQEAgLTAsMCArMSw1NCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBVbnNpZ25lZCBQYWNrYWdlCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzU2VjdXJlRWxlbWVudEFjY2Vzc0NvbnRyb2xUZXN0Q2FzZXMyCisjIERvbid0IGluY2x1ZGUgdGhpcyBwYWNrYWdlIGluIGFueSB0YXJnZXQuCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorIyBXaGVuIGJ1aWx0LCBleHBsaWNpdGx5IHB1dCBpdCBpbiB0aGUgZGF0YSBwYXJ0aXRpb24uCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKKyAgICAgICBjdHN0ZXN0cnVubmVyLWF4dCBcCisgICAgICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKK0xPQ0FMX0pBVkFfTElCUkFSSUVTICs9IGFuZHJvaWQudGVzdC5ydW5uZXIKK0xPQ0FMX0pBVkFfTElCUkFSSUVTICs9IGFuZHJvaWQudGVzdC5iYXNlCisjIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0CitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworCitpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBTaWduZWQgUGFja2FnZQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFIDo9IHNpZ25lZC1DdHNTZWN1cmVFbGVtZW50QWNjZXNzQ29udHJvbFRlc3RDYXNlczIKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gQVBQUworTE9DQUxfQlVJTFRfTU9EVUxFX1NURU0gOj0gcGFja2FnZS5hcGsKKyMgTWFrZSBzdXJlIHRoZSBidWlsZCBzeXN0ZW0gZG9lc24ndCB0cnkgdG8gcmVzaWduIHRoZSBBUEsKK0xPQ0FMX0NFUlRJRklDQVRFIDo9IFBSRVNJR05FRAorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKKworTE9DQUxfUkVQTEFDRV9QUkVCVUlMVF9BUEtfSU5TVEFMTEVEIDo9ICQoTE9DQUxfUEFUSCkvYXBrL3NpZ25lZC1DdHNTZWN1cmVFbGVtZW50QWNjZXNzQ29udHJvbFRlc3RDYXNlczIuYXBrCisKK2luY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NlY3VyZV9lbGVtZW50L2FjY2Vzc19jb250cm9sL0FjY2Vzc0NvbnRyb2xBcHAyL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy90ZXN0cy9zZWN1cmVfZWxlbWVudC9hY2Nlc3NfY29udHJvbC9BY2Nlc3NDb250cm9sQXBwMi9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YjkwNTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zZWN1cmVfZWxlbWVudC9hY2Nlc3NfY29udHJvbC9BY2Nlc3NDb250cm9sQXBwMi9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgICAgcGFja2FnZT0iYW5kcm9pZC5vbWFwaS5hY2Nlc3Njb250cm9sMi5jdHMiPgorCisgICAgPGFwcGxpY2F0aW9uPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIvPgorICAgIDwvYXBwbGljYXRpb24+CisKKyAgICA8IS0tIFRoaXMgaXMgYSBzZWxmLWluc3RydW1lbnRpbmcgdGVzdCBwYWNrYWdlLiAtLT4KKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIGZvciBPcGVuIE1vYmlsZSBBUEkiCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQub21hcGkuYWNjZXNzY29udHJvbDIuY3RzIj4KKyAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9Imxpc3RlbmVyIgorICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmFsdWU9ImNvbS5hbmRyb2lkLmN0cy5ydW5uZXIuQ3RzVGVzdFJ1bkxpc3RlbmVyIi8+CisgICAgPC9pbnN0cnVtZW50YXRpb24+CisKKzwvbWFuaWZlc3Q+CisKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NlY3VyZV9lbGVtZW50L2FjY2Vzc19jb250cm9sL0FjY2Vzc0NvbnRyb2xBcHAyL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL3NlY3VyZV9lbGVtZW50L2FjY2Vzc19jb250cm9sL0FjY2Vzc0NvbnRyb2xBcHAyL0FuZHJvaWRUZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTFjOTA1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvc2VjdXJlX2VsZW1lbnQvYWNjZXNzX2NvbnRyb2wvQWNjZXNzQ29udHJvbEFwcDIvQW5kcm9pZFRlc3QueG1sCkBAIC0wLDAgKzEsMjcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgT01BUEkgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIvPgorICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0ic3lzdGVtcyIvPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9InNpZ25lZC1DdHNTZWN1cmVFbGVtZW50QWNjZXNzQ29udHJvbFRlc3RDYXNlczIuYXBrIi8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkFuZHJvaWRKVW5pdFRlc3QiPgorICAgICAgICA8b3B0aW9uIG5hbWU9InBhY2thZ2UiIHZhbHVlPSJhbmRyb2lkLm9tYXBpLmFjY2Vzc2NvbnRyb2wyLmN0cyIvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjEwbTEwcyIvPgorICAgIDwvdGVzdD4KKzwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NlY3VyZV9lbGVtZW50L2FjY2Vzc19jb250cm9sL0FjY2Vzc0NvbnRyb2xBcHAyL2Fway9zaWduZWQtQ3RzU2VjdXJlRWxlbWVudEFjY2Vzc0NvbnRyb2xUZXN0Q2FzZXMyLmFwayBiL3Rlc3RzL3Rlc3RzL3NlY3VyZV9lbGVtZW50L2FjY2Vzc19jb250cm9sL0FjY2Vzc0NvbnRyb2xBcHAyL2Fway9zaWduZWQtQ3RzU2VjdXJlRWxlbWVudEFjY2Vzc0NvbnRyb2xUZXN0Q2FzZXMyLmFwawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTU3MDI1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvc2VjdXJlX2VsZW1lbnQvYWNjZXNzX2NvbnRyb2wvQWNjZXNzQ29udHJvbEFwcDIvYXBrL3NpZ25lZC1DdHNTZWN1cmVFbGVtZW50QWNjZXNzQ29udHJvbFRlc3RDYXNlczIuYXBrCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NlY3VyZV9lbGVtZW50L2FjY2Vzc19jb250cm9sL0FjY2Vzc0NvbnRyb2xBcHAyL3NyYy9hbmRyb2lkL29tYXBpL2FjY2Vzc2NvbnRyb2wyL2N0cy9BY2Nlc3NDb250cm9sVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvc2VjdXJlX2VsZW1lbnQvYWNjZXNzX2NvbnRyb2wvQWNjZXNzQ29udHJvbEFwcDIvc3JjL2FuZHJvaWQvb21hcGkvYWNjZXNzY29udHJvbDIvY3RzL0FjY2Vzc0NvbnRyb2xUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTNlYjU1NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3NlY3VyZV9lbGVtZW50L2FjY2Vzc19jb250cm9sL0FjY2Vzc0NvbnRyb2xBcHAyL3NyYy9hbmRyb2lkL29tYXBpL2FjY2Vzc2NvbnRyb2wyL2N0cy9BY2Nlc3NDb250cm9sVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyogQ29udHJpYnV0ZWQgYnkgT3JhbmdlICovCisKK3BhY2thZ2UgYW5kcm9pZC5vbWFwaS5hY2Nlc3Njb250cm9sMi5jdHM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzdW1lLmFzc3VtZVRydWU7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKK2ltcG9ydCBhbmRyb2lkLnNlLm9tYXBpLkNoYW5uZWw7CitpbXBvcnQgYW5kcm9pZC5zZS5vbWFwaS5SZWFkZXI7CitpbXBvcnQgYW5kcm9pZC5zZS5vbWFwaS5TRVNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5zZS5vbWFwaS5TRVNlcnZpY2UuT25Db25uZWN0ZWRMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLnNlLm9tYXBpLlNlc3Npb247CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworCitpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5Qcm9wZXJ0eVV0aWw7CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5UaW1lcjsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZXJUYXNrOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVvdXRFeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBBY2Nlc3NDb250cm9sVGVzdCB7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFVJQ0NfUkVBREVSX1BSRUZJWCA9ICJTSU0iOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBFU0VfUkVBREVSX1BSRUZJWCA9ICJlU0UiOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBTRF9SRUFERVJfUFJFRklYID0gIlNEIjsKKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGVbXSBBSURfNDAgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpIDB4QTAsIDB4MDAsIDB4MDAsCisgICAgICAgIDB4MDQsIDB4NzYsIDB4NDEsIDB4NkUsIDB4NjQsIDB4NzIsIDB4NkYsIDB4NjksIDB4NjQsIDB4NDMsIDB4NTQsCisgICAgICAgIDB4NTMsIDB4NDAgfTsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlW10gQUlEXzQxID0gbmV3IGJ5dGVbXSB7IChieXRlKSAweEEwLCAweDAwLCAweDAwLAorICAgICAgICAweDA0LCAweDc2LCAweDQxLCAweDZFLCAweDY0LCAweDcyLCAweDZGLCAweDY5LCAweDY0LCAweDQzLCAweDU0LAorICAgICAgICAweDUzLCAweDQxIH07CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZVtdIEFJRF80MiA9IG5ldyBieXRlW10geyAoYnl0ZSkgMHhBMCwgMHgwMCwgMHgwMCwKKyAgICAgICAgMHgwNCwgMHg3NiwgMHg0MSwgMHg2RSwgMHg2NCwgMHg3MiwgMHg2RiwgMHg2OSwgMHg2NCwgMHg0MywgMHg1NCwKKyAgICAgICAgMHg1MywgMHg0MiB9OworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGVbXSBBSURfNDMgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpIDB4QTAsIDB4MDAsIDB4MDAsCisgICAgICAgIDB4MDQsIDB4NzYsIDB4NDEsIDB4NkUsIDB4NjQsIDB4NzIsIDB4NkYsIDB4NjksIDB4NjQsIDB4NDMsIDB4NTQsCisgICAgICAgIDB4NTMsIDB4NDMgfTsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlW10gQUlEXzQ0ID0gbmV3IGJ5dGVbXSB7IChieXRlKSAweEEwLCAweDAwLCAweDAwLAorICAgICAgICAweDA0LCAweDc2LCAweDQxLCAweDZFLCAweDY0LCAweDcyLCAweDZGLCAweDY5LCAweDY0LCAweDQzLCAweDU0LAorICAgICAgICAweDUzLCAweDQ0IH07CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZVtdIEFJRF80NSA9IG5ldyBieXRlW10geyAoYnl0ZSkgMHhBMCwgMHgwMCwgMHgwMCwKKyAgICAgICAgMHgwNCwgMHg3NiwgMHg0MSwgMHg2RSwgMHg2NCwgMHg3MiwgMHg2RiwgMHg2OSwgMHg2NCwgMHg0MywgMHg1NCwKKyAgICAgICAgMHg1MywgMHg0NSB9OworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGVbXSBBSURfNDYgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpIDB4QTAsIDB4MDAsIDB4MDAsCisgICAgICAgIDB4MDQsIDB4NzYsIDB4NDEsIDB4NkUsIDB4NjQsIDB4NzIsIDB4NkYsIDB4NjksIDB4NjQsIDB4NDMsIDB4NTQsCisgICAgICAgIDB4NTMsIDB4NDYgfTsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlW10gQUlEXzQ3ID0gbmV3IGJ5dGVbXSB7IChieXRlKSAweEEwLCAweDAwLCAweDAwLAorICAgICAgICAweDA0LCAweDc2LCAweDQxLCAweDZFLCAweDY0LCAweDcyLCAweDZGLCAweDY5LCAweDY0LCAweDQzLCAweDU0LAorICAgICAgICAweDUzLCAweDQ3IH07CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZVtdIEFJRF80OCA9IG5ldyBieXRlW10geyAoYnl0ZSkgMHhBMCwgMHgwMCwgMHgwMCwKKyAgICAgICAgMHgwNCwgMHg3NiwgMHg0MSwgMHg2RSwgMHg2NCwgMHg3MiwgMHg2RiwgMHg2OSwgMHg2NCwgMHg0MywgMHg1NCwKKyAgICAgICAgMHg1MywgMHg0OCB9OworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGVbXSBBSURfNDkgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpIDB4QTAsIDB4MDAsIDB4MDAsCisgICAgICAgIDB4MDQsIDB4NzYsIDB4NDEsIDB4NkUsIDB4NjQsIDB4NzIsIDB4NkYsIDB4NjksIDB4NjQsIDB4NDMsIDB4NTQsCisgICAgICAgIDB4NTMsIDB4NDkgfTsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlW10gQUlEXzRBID0gbmV3IGJ5dGVbXSB7IChieXRlKSAweEEwLCAweDAwLCAweDAwLAorICAgICAgICAweDA0LCAweDc2LCAweDQxLCAweDZFLCAweDY0LCAweDcyLCAweDZGLCAweDY5LCAweDY0LCAweDQzLCAweDU0LAorICAgICAgICAweDUzLCAoYnl0ZSkgMHg0QSB9OworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGVbXSBBSURfNEIgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpIDB4QTAsIDB4MDAsIDB4MDAsCisgICAgICAgIDB4MDQsIDB4NzYsIDB4NDEsIDB4NkUsIDB4NjQsIDB4NzIsIDB4NkYsIDB4NjksIDB4NjQsIDB4NDMsIDB4NTQsCisgICAgICAgIDB4NTMsIChieXRlKSAweDRCIH07CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZVtdIEFJRF80QyA9IG5ldyBieXRlW10geyAoYnl0ZSkgMHhBMCwgMHgwMCwgMHgwMCwKKyAgICAgICAgMHgwNCwgMHg3NiwgMHg0MSwgMHg2RSwgMHg2NCwgMHg3MiwgMHg2RiwgMHg2OSwgMHg2NCwgMHg0MywgMHg1NCwKKyAgICAgICAgMHg1MywgKGJ5dGUpIDB4NEMgfTsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlW10gQUlEXzREID0gbmV3IGJ5dGVbXSB7IChieXRlKSAweEEwLCAweDAwLCAweDAwLAorICAgICAgICAweDA0LCAweDc2LCAweDQxLCAweDZFLCAweDY0LCAweDcyLCAweDZGLCAweDY5LCAweDY0LCAweDQzLCAweDU0LAorICAgICAgICAweDUzLCAoYnl0ZSkgMHg0RCB9OworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGVbXSBBSURfNEUgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpIDB4QTAsIDB4MDAsIDB4MDAsCisgICAgICAgIDB4MDQsIDB4NzYsIDB4NDEsIDB4NkUsIDB4NjQsIDB4NzIsIDB4NkYsIDB4NjksIDB4NjQsIDB4NDMsIDB4NTQsCisgICAgICAgIDB4NTMsIChieXRlKSAweDRFIH07CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZVtdIEFJRF80RiA9IG5ldyBieXRlW10geyAoYnl0ZSkgMHhBMCwgMHgwMCwgMHgwMCwKKyAgICAgICAgMHgwNCwgMHg3NiwgMHg0MSwgMHg2RSwgMHg2NCwgMHg3MiwgMHg2RiwgMHg2OSwgMHg2NCwgMHg0MywgMHg1NCwKKyAgICAgICAgMHg1MywgKGJ5dGUpIDB4NEYgfTsKKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGVbXVtdIEFVVEhPUklaRURfQUlEID0gbmV3IGJ5dGVbXVtdIHsgQUlEXzQwLAorICAgICAgICBBSURfNDEsIEFJRF80MywgQUlEXzQ1LCBBSURfNDYgfTsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlW11bXSBVTkFVVEhPUklaRURfQUlEID0gbmV3IGJ5dGVbXVtdIHsgQUlEXzQyLAorICAgICAgICBBSURfNDQsIEFJRF80NywgQUlEXzQ4LCBBSURfNDksIEFJRF80QSwgQUlEXzRCLCBBSURfNEMsIEFJRF80RCwgQUlEXzRFLCBBSURfNEZ9OworCisgICAgLyogQXV0aG9yaXplZCBBUERVIGZvciBBSURfNDAgKi8KKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlW11bXSBBVVRIT1JJWkVEX0FQRFVfQUlEXzQwID0gbmV3IGJ5dGVbXVtdIHsKKyAgICAgICAgeyAweDAwLCAweDA2LCAweDAwLCAweDAwIH0sIHsgKGJ5dGUpIDB4QTAsIDB4MDYsIDB4MDAsIDB4MDAgfSx9OworICAgIC8qIFVuYXV0aG9yaXplZCBBUERVIGZvciBBSURfNDAgKi8KKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlW11bXSBVTkFVVEhPUklaRURfQVBEVV9BSURfNDAgPSBuZXcgYnl0ZVtdW10geworICAgICAgICB7IDB4MDAsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAgfSwKKyAgICAgICAgeyAoYnl0ZSkgMHg4MCwgMHgwNiwgMHgwMCwgMHgwMCB9LAorICAgICAgICB7IChieXRlKSAweEEwLCAweDA4LCAweDAwLCAweDAwLCAweDAwIH0sCisgICAgICAgIHsgKGJ5dGUpIDB4OTQsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAgfSwgfTsKKworICAgIC8qIEF1dGhvcml6ZWQgQVBEVSBmb3IgQUlEXzQxICovCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZVtdW10gQVVUSE9SSVpFRF9BUERVX0FJRF80MSA9IG5ldyBieXRlW11bXSB7CisgICAgICAgIHsgKGJ5dGUpIDB4OTQsIDB4MDYsIDB4MDAsIDB4MDAgfSwKKyAgICAgICAgeyAoYnl0ZSkgMHg5NCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCB9LAorICAgICAgICB7IChieXRlKSAweDk0LCAoYnl0ZSkgMHgwQywgMHgwMCwgMHgwMCwgMHgwMSwgKGJ5dGUpIDB4QUEsIDB4MDAgfSwKKyAgICAgICAgeyAoYnl0ZSkgMHg5NCwgMHgwQSwgMHgwMCwgMHgwMCwgMHgwMSwgKGJ5dGUpIDB4QUEgfSB9OworICAgIC8qIFVuYXV0aG9yaXplZCBBUERVIGZvciBBSURfNDEgKi8KKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlW11bXSBVTkFVVEhPUklaRURfQVBEVV9BSURfNDEgPSBuZXcgYnl0ZVtdW10geworICAgICAgICB7IDB4MDAsIDB4MDYsIDB4MDAsIDB4MDAgfSwgeyAoYnl0ZSkgMHg4MCwgMHgwNiwgMHgwMCwgMHgwMCB9LAorICAgICAgICB7IChieXRlKSAweEEwLCAweDA2LCAweDAwLCAweDAwIH0sCisgICAgICAgIHsgMHgwMCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCB9LAorICAgICAgICB7IChieXRlKSAweDAwLCAweDBBLCAweDAwLCAweDAwLCAweDAxLCAoYnl0ZSkgMHhBQSB9LAorICAgICAgICB7IChieXRlKSAweDgwLCAweDBBLCAweDAwLCAweDAwLCAweDAxLCAoYnl0ZSkgMHhBQSB9LAorICAgICAgICB7IChieXRlKSAweEEwLCAweDBBLCAweDAwLCAweDAwLCAweDAxLCAoYnl0ZSkgMHhBQSB9LAorICAgICAgICB7IChieXRlKSAweDgwLCAweDA4LCAweDAwLCAweDAwLCAweDAwIH0sCisgICAgICAgIHsgKGJ5dGUpIDB4QTAsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAgfSwKKyAgICAgICAgeyAweDAwLCAoYnl0ZSkgMHgwQywgMHgwMCwgMHgwMCwgMHgwMSwgKGJ5dGUpIDB4QUEsIDB4MDAgfSwKKyAgICAgICAgeyAoYnl0ZSkgMHg4MCwgKGJ5dGUpIDB4MEMsIDB4MDAsIDB4MDAsIDB4MDEsIChieXRlKSAweEFBLCAweDAwIH0sCisgICAgICAgIHsgKGJ5dGUpIDB4QTAsIChieXRlKSAweDBDLCAweDAwLCAweDAwLCAweDAxLCAoYnl0ZSkgMHhBQSwgMHgwMCB9LAorICAgIH07CisKKyAgICBwcml2YXRlIGZpbmFsIGxvbmcgU0VSVklDRV9DT05ORUNUSU9OX1RJTUVfT1VUID0gMzAwMDsKKyAgICBwcml2YXRlIFNFU2VydmljZSBzZVNlcnZpY2U7CisgICAgcHJpdmF0ZSBPYmplY3Qgc2VydmljZU11dGV4ID0gbmV3IE9iamVjdCgpOworICAgIHByaXZhdGUgVGltZXIgY29ubmVjdGlvblRpbWVyOworICAgIHByaXZhdGUgU2VydmljZUNvbm5lY3Rpb25UaW1lclRhc2sgbVRpbWVyVGFzayA9IG5ldyBTZXJ2aWNlQ29ubmVjdGlvblRpbWVyVGFzaygpOworICAgIHByaXZhdGUgYm9vbGVhbiBjb25uZWN0ZWQgPSBmYWxzZTsKKworICAgIHByaXZhdGUgZmluYWwgT25Db25uZWN0ZWRMaXN0ZW5lciBtTGlzdGVuZXIgPSBuZXcgT25Db25uZWN0ZWRMaXN0ZW5lcigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25Db25uZWN0ZWQoKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNlcnZpY2VNdXRleCkgeworICAgICAgICAgICAgICAgIGNvbm5lY3RlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgc2VydmljZU11dGV4Lm5vdGlmeSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIGNsYXNzIFN5bmNocm9ub3VzRXhlY3V0b3IgaW1wbGVtZW50cyBFeGVjdXRvciB7CisgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoUnVubmFibGUgcikgeworICAgICAgICAgICAgci5ydW4oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBzdXBwb3J0c0hhcmR3YXJlKCkgeworICAgICAgICBmaW5hbCBQYWNrYWdlTWFuYWdlciBwbSA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKS5nZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICBib29sZWFuIGxvd1JhbURldmljZSA9IFByb3BlcnR5VXRpbC5wcm9wZXJ0eUVxdWFscygicm8uY29uZmlnLmxvd19yYW0iLCAidHJ1ZSIpOworICAgICAgICByZXR1cm4gIWxvd1JhbURldmljZSB8fCAobG93UmFtRGV2aWNlICYmIHBtLmhhc1N5c3RlbUZlYXR1cmUoImFuZHJvaWQuaGFyZHdhcmUudHlwZS53YXRjaCIpKTsKKyAgICB9CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzdW1lVHJ1ZShQcm9wZXJ0eVV0aWwuZ2V0Rmlyc3RBcGlMZXZlbCgpID4gQnVpbGQuVkVSU0lPTl9DT0RFUy5PX01SMSk7CisgICAgICAgIGFzc3VtZVRydWUoc3VwcG9ydHNIYXJkd2FyZSgpKTsKKyAgICAgICAgc2VTZXJ2aWNlID0gbmV3IFNFU2VydmljZShJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCksIG5ldyBTeW5jaHJvbm91c0V4ZWN1dG9yKCksIG1MaXN0ZW5lcik7CisgICAgICAgIGNvbm5lY3Rpb25UaW1lciA9IG5ldyBUaW1lcigpOworICAgICAgICBjb25uZWN0aW9uVGltZXIuc2NoZWR1bGUobVRpbWVyVGFzaywgU0VSVklDRV9DT05ORUNUSU9OX1RJTUVfT1VUKTsKKyAgICB9CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoc2VTZXJ2aWNlICE9IG51bGwgJiYgc2VTZXJ2aWNlLmlzQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgICAgIHNlU2VydmljZS5zaHV0ZG93bigpOworICAgICAgICAgICAgY29ubmVjdGVkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgd2FpdEZvckNvbm5lY3Rpb24oKSB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiB7CisgICAgICAgIHN5bmNocm9uaXplZCAoc2VydmljZU11dGV4KSB7CisgICAgICAgICAgICBpZiAoIWNvbm5lY3RlZCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VNdXRleC53YWl0KCk7CisgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFjb25uZWN0ZWQpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVGltZW91dEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIlNlcnZpY2UgY291bGQgbm90IGJlIGNvbm5lY3RlZCBhZnRlciAiCisgICAgICAgICAgICAgICAgICAgICsgU0VSVklDRV9DT05ORUNUSU9OX1RJTUVfT1VUICsgIiBtcyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb25UaW1lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29ubmVjdGlvblRpbWVyLmNhbmNlbCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0aG9yaXplZEFJRCgpIHsKKyAgICAgICAgZm9yIChieXRlW10gYWlkIDogQVVUSE9SSVpFRF9BSUQpIHsKKyAgICAgICAgICAgIHRlc3RTZWxlY3RhYmxlQWlkKGFpZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVbmF1dGhvcml6ZWRBSUQoKSB7CisgICAgICAgIGZvciAoYnl0ZVtdIGFpZCA6IFVOQVVUSE9SSVpFRF9BSUQpIHsKKyAgICAgICAgICAgIHRlc3RVbmF1dGhvcmlzZWRBaWQoYWlkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEF1dGhvcml6ZWRBUERVQUlENDAoKSB7CisgICAgICAgIGZvciAoYnl0ZVtdIGFwZHUgOiBBVVRIT1JJWkVEX0FQRFVfQUlEXzQwKSB7CisgICAgICAgICAgICB0ZXN0VHJhbnNtaXRBUERVKEFJRF80MCwgYXBkdSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVbmF1dGhvcmlzZWRBUERVQUlENDAoKSB7CisgICAgICAgIGZvciAoYnl0ZVtdIGFwZHUgOiBVTkFVVEhPUklaRURfQVBEVV9BSURfNDApIHsKKyAgICAgICAgICAgIHRlc3RVbmF1dGhvcmlzZWRBUERVKEFJRF80MCwgYXBkdSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRob3JpemVkQVBEVUFJRDQxKCkgeworICAgICAgICBmb3IgKGJ5dGVbXSBhcGR1IDogQVVUSE9SSVpFRF9BUERVX0FJRF80MSkgeworICAgICAgICAgICAgdGVzdFRyYW5zbWl0QVBEVShBSURfNDEsIGFwZHUpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VW5hdXRob3Jpc2VkQVBEVUFJRDQxKCkgeworICAgICAgICBmb3IgKGJ5dGVbXSBhcGR1IDogVU5BVVRIT1JJWkVEX0FQRFVfQUlEXzQxKSB7CisgICAgICAgICAgICB0ZXN0VW5hdXRob3Jpc2VkQVBEVShBSURfNDEsIGFwZHUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RTZWxlY3RhYmxlQWlkKGJ5dGVbXSBhaWQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdhaXRGb3JDb25uZWN0aW9uKCk7CisgICAgICAgICAgICBSZWFkZXJbXSByZWFkZXJzID0gc2VTZXJ2aWNlLmdldFJlYWRlcnMoKTsKKyAgICAgICAgICAgIGZvciAoUmVhZGVyIHJlYWRlciA6IHJlYWRlcnMpIHsKKyAgICAgICAgICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBudWxsOworICAgICAgICAgICAgICAgIENoYW5uZWwgY2hhbm5lbCA9IG51bGw7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZWFkZXIuaXNTZWN1cmVFbGVtZW50UHJlc2VudCgpKTsKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbiA9IHJlYWRlci5vcGVuU2Vzc2lvbigpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJOdWxsIFNlc3Npb24iLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCA9IHNlc3Npb24ub3BlbkxvZ2ljYWxDaGFubmVsKGFpZCwgKGJ5dGUpIDB4MDApOworICAgICAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJOdWxsIENoYW5uZWwiLCBjaGFubmVsKTsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIHNlbGVjdFJlc3BvbnNlID0gY2hhbm5lbC5nZXRTZWxlY3RSZXNwb25zZSgpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJOdWxsIFNlbGVjdCBSZXNwb25zZSIsIHNlbGVjdFJlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VGhhdChzZWxlY3RSZXNwb25zZVtzZWxlY3RSZXNwb25zZS5sZW5ndGggLSAxXSAmIDB4RkYsIGlzKDB4MDApKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VGhhdChzZWxlY3RSZXNwb25zZVtzZWxlY3RSZXNwb25zZS5sZW5ndGggLSAyXSAmIDB4RkYsIGlzKDB4OTApKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiU2VsZWN0IFJlc3BvbnNlIGlzIG5vdCBjb21wbGV0ZSIsIHZlcmlmeUJlclRsdkRhdGEoc2VsZWN0UmVzcG9uc2UpKTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBpZiAoY2hhbm5lbCAhPSBudWxsKSBjaGFubmVsLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHNlc3Npb24uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEV4Y2VwdGlvbiAiICsgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdFVuYXV0aG9yaXNlZEFpZChieXRlW10gYWlkKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3YWl0Rm9yQ29ubmVjdGlvbigpOworICAgICAgICAgICAgUmVhZGVyW10gcmVhZGVycyA9IHNlU2VydmljZS5nZXRSZWFkZXJzKCk7CisgICAgICAgICAgICBmb3IgKFJlYWRlciByZWFkZXIgOiByZWFkZXJzKSB7CisgICAgICAgICAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gbnVsbDsKKyAgICAgICAgICAgICAgICBDaGFubmVsIGNoYW5uZWwgPSBudWxsOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUocmVhZGVyLmlzU2VjdXJlRWxlbWVudFByZXNlbnQoKSk7CisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24gPSByZWFkZXIub3BlblNlc3Npb24oKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiTnVsbCBTZXNzaW9uIiwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsID0gc2Vzc2lvbi5vcGVuTG9naWNhbENoYW5uZWwoYWlkLCAoYnl0ZSkgMHgwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsKCJTZWN1cml0eUV4Y2VwdGlvbiBFeHBlY3RlZCIpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBFeHBlY3RlZAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5uZWwgIT0gbnVsbCkgY2hhbm5lbC5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKSBzZXNzaW9uLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBFeGNlcHRpb24gIiArIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RUcmFuc21pdEFQRFUoYnl0ZVtdIGFpZCwgYnl0ZVtdIGFwZHUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdhaXRGb3JDb25uZWN0aW9uKCk7CisgICAgICAgICAgICBSZWFkZXJbXSByZWFkZXJzID0gc2VTZXJ2aWNlLmdldFJlYWRlcnMoKTsKKyAgICAgICAgICAgIGZvciAoUmVhZGVyIHJlYWRlciA6IHJlYWRlcnMpIHsKKyAgICAgICAgICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBudWxsOworICAgICAgICAgICAgICAgIENoYW5uZWwgY2hhbm5lbCA9IG51bGw7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZWFkZXIuaXNTZWN1cmVFbGVtZW50UHJlc2VudCgpKTsKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbiA9IHJlYWRlci5vcGVuU2Vzc2lvbigpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJOdWxsIFNlc3Npb24iLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCA9IHNlc3Npb24ub3BlbkxvZ2ljYWxDaGFubmVsKGFpZCwgKGJ5dGUpIDB4MDApOworICAgICAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJOdWxsIENoYW5uZWwiLCBjaGFubmVsKTsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIHNlbGVjdFJlc3BvbnNlID0gY2hhbm5lbC5nZXRTZWxlY3RSZXNwb25zZSgpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJOdWxsIFNlbGVjdCBSZXNwb25zZSIsIHNlbGVjdFJlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VGhhdChzZWxlY3RSZXNwb25zZVtzZWxlY3RSZXNwb25zZS5sZW5ndGggLSAxXSAmIDB4RkYsIGlzKDB4MDApKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VGhhdChzZWxlY3RSZXNwb25zZVtzZWxlY3RSZXNwb25zZS5sZW5ndGggLSAyXSAmIDB4RkYsIGlzKDB4OTApKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiU2VsZWN0IFJlc3BvbnNlIGlzIG5vdCBjb21wbGV0ZSIsIHZlcmlmeUJlclRsdkRhdGEoc2VsZWN0UmVzcG9uc2UpKTsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGFwZHVSZXNwb25zZSA9IGNoYW5uZWwudHJhbnNtaXQoYXBkdSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIk51bGwgQ2hhbm5lbCIsIGFwZHVSZXNwb25zZSk7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5uZWwgIT0gbnVsbCkgY2hhbm5lbC5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKSBzZXNzaW9uLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBFeGNlcHRpb24gIiArIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RVbmF1dGhvcmlzZWRBUERVKGJ5dGVbXSBhaWQsIGJ5dGVbXSBhcGR1KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3YWl0Rm9yQ29ubmVjdGlvbigpOworICAgICAgICAgICAgUmVhZGVyW10gcmVhZGVycyA9IHNlU2VydmljZS5nZXRSZWFkZXJzKCk7CisgICAgICAgICAgICBmb3IgKFJlYWRlciByZWFkZXIgOiByZWFkZXJzKSB7CisgICAgICAgICAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gbnVsbDsKKyAgICAgICAgICAgICAgICBDaGFubmVsIGNoYW5uZWwgPSBudWxsOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUocmVhZGVyLmlzU2VjdXJlRWxlbWVudFByZXNlbnQoKSk7CisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24gPSByZWFkZXIub3BlblNlc3Npb24oKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiTnVsbCBTZXNzaW9uIiwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgPSBzZXNzaW9uLm9wZW5Mb2dpY2FsQ2hhbm5lbChhaWQsIChieXRlKSAweDAwKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiTnVsbCBDaGFubmVsIiwgY2hhbm5lbCk7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBzZWxlY3RSZXNwb25zZSA9IGNoYW5uZWwuZ2V0U2VsZWN0UmVzcG9uc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiTnVsbCBTZWxlY3QgUmVzcG9uc2UiLCBzZWxlY3RSZXNwb25zZSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRoYXQoc2VsZWN0UmVzcG9uc2Vbc2VsZWN0UmVzcG9uc2UubGVuZ3RoIC0gMV0gJiAweEZGLCBpcygweDAwKSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRoYXQoc2VsZWN0UmVzcG9uc2Vbc2VsZWN0UmVzcG9uc2UubGVuZ3RoIC0gMl0gJiAweEZGLCBpcygweDkwKSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIlNlbGVjdCBSZXNwb25zZSBpcyBub3QgY29tcGxldGUiLCB2ZXJpZnlCZXJUbHZEYXRhKHNlbGVjdFJlc3BvbnNlKSk7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsLnRyYW5zbWl0KGFwZHUpOworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbCgiU2VjdXJpdHkgRXhjZXB0aW9uIGlzIGV4cGVjdGVkIik7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4cGVjdGVkCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBpZiAoY2hhbm5lbCAhPSBudWxsKSBjaGFubmVsLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHNlc3Npb24uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEV4Y2VwdGlvbiAiICsgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWZXJpZmllcyBUTFYgZGF0YQorICAgICAqCisgICAgICogQHBhcmFtIHRsdgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZGF0YSBpcyB0bHYgZm9ybWF0dGVkLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHZlcmlmeUJlclRsdkRhdGEoYnl0ZVtdIHRsdikgeworICAgICAgICBpZiAodGx2ID09IG51bGwgfHwgdGx2Lmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW52YWxpZCB0bHYsIG51bGwiKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgYnl0ZVtdIGtleSA9IG5ldyBieXRlWzJdOworICAgICAgICBrZXlbMF0gPSB0bHZbaV07CisgICAgICAgIGlmICgoa2V5WzBdICYgMHgxRikgPT0gMHgxRikgeworICAgICAgICAgICAgLy8gZXh0cmEgYnl0ZSBmb3IgVEFHIGZpZWxkCisgICAgICAgICAgICBrZXlbMV0gPSB0bHZbaSA9IGkgKyAxXTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBsZW4gPSB0bHZbaSA9IGkgKyAxXSAmIDB4RkY7CisgICAgICAgIGlmIChsZW4gPiAxMjcpIHsKKyAgICAgICAgICAgIC8vIG1vcmUgdGhhbiAxIGJ5dGUgZm9yIGxlbmd0aAorICAgICAgICAgICAgaW50IGJ5dGVzTGVuZ3RoID0gbGVuIC0gMTI4OworICAgICAgICAgICAgbGVuID0gMDsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSBieXRlc0xlbmd0aCAtIDE7IGogPj0gMDsgai0tKSB7CisgICAgICAgICAgICAgIGxlbiArPSAodGx2W2kgPSBpICsgMV0gJiAweEZGKSAqIE1hdGgucG93KDEwLCBqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGx2Lmxlbmd0aCA9PSAoaSArIGxlbiArIDMpOworICAgIH0KKworICAgIGNsYXNzIFNlcnZpY2VDb25uZWN0aW9uVGltZXJUYXNrIGV4dGVuZHMgVGltZXJUYXNrIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoc2VydmljZU11dGV4KSB7CisgICAgICAgICAgICAgICAgc2VydmljZU11dGV4Lm5vdGlmeUFsbCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJlX2VsZW1lbnQvYWNjZXNzX2NvbnRyb2wvQWNjZXNzQ29udHJvbEFwcDMvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL3NlY3VyZV9lbGVtZW50L2FjY2Vzc19jb250cm9sL0FjY2Vzc0NvbnRyb2xBcHAzL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhmODk0MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3NlY3VyZV9lbGVtZW50L2FjY2Vzc19jb250cm9sL0FjY2Vzc0NvbnRyb2xBcHAzL0FuZHJvaWQubWsKQEAgLTAsMCArMSw1NCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBVbnNpZ25lZCBQYWNrYWdlCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzU2VjdXJlRWxlbWVudEFjY2Vzc0NvbnRyb2xUZXN0Q2FzZXMzCisjIERvbid0IGluY2x1ZGUgdGhpcyBwYWNrYWdlIGluIGFueSB0YXJnZXQuCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorIyBXaGVuIGJ1aWx0LCBleHBsaWNpdGx5IHB1dCBpdCBpbiB0aGUgZGF0YSBwYXJ0aXRpb24uCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKKwljdHN0ZXN0cnVubmVyLWF4dCBcCisJY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKK0xPQ0FMX0pBVkFfTElCUkFSSUVTICs9IGFuZHJvaWQudGVzdC5ydW5uZXIKK0xPQ0FMX0pBVkFfTElCUkFSSUVTICs9IGFuZHJvaWQudGVzdC5iYXNlCisjIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0CitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworCitpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBTaWduZWQgUGFja2FnZQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFIDo9IHNpZ25lZC1DdHNTZWN1cmVFbGVtZW50QWNjZXNzQ29udHJvbFRlc3RDYXNlczMKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gQVBQUworTE9DQUxfQlVJTFRfTU9EVUxFX1NURU0gOj0gcGFja2FnZS5hcGsKKyMgTWFrZSBzdXJlIHRoZSBidWlsZCBzeXN0ZW0gZG9lc24ndCB0cnkgdG8gcmVzaWduIHRoZSBBUEsKK0xPQ0FMX0NFUlRJRklDQVRFIDo9IFBSRVNJR05FRAorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKKworTE9DQUxfUkVQTEFDRV9QUkVCVUlMVF9BUEtfSU5TVEFMTEVEIDo9ICQoTE9DQUxfUEFUSCkvYXBrL3NpZ25lZC1DdHNTZWN1cmVFbGVtZW50QWNjZXNzQ29udHJvbFRlc3RDYXNlczMuYXBrCisKK2luY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NlY3VyZV9lbGVtZW50L2FjY2Vzc19jb250cm9sL0FjY2Vzc0NvbnRyb2xBcHAzL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy90ZXN0cy9zZWN1cmVfZWxlbWVudC9hY2Nlc3NfY29udHJvbC9BY2Nlc3NDb250cm9sQXBwMy9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MzRmNzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zZWN1cmVfZWxlbWVudC9hY2Nlc3NfY29udHJvbC9BY2Nlc3NDb250cm9sQXBwMy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgICAgcGFja2FnZT0iYW5kcm9pZC5vbWFwaS5hY2Nlc3Njb250cm9sMy5jdHMiPgorCisgICAgPGFwcGxpY2F0aW9uPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIvPgorICAgIDwvYXBwbGljYXRpb24+CisKKyAgICA8IS0tIFRoaXMgaXMgYSBzZWxmLWluc3RydW1lbnRpbmcgdGVzdCBwYWNrYWdlLiAtLT4KKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIGZvciBPcGVuIE1vYmlsZSBBUEkiCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQub21hcGkuYWNjZXNzY29udHJvbDMuY3RzIj4KKyAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9Imxpc3RlbmVyIgorICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmFsdWU9ImNvbS5hbmRyb2lkLmN0cy5ydW5uZXIuQ3RzVGVzdFJ1bkxpc3RlbmVyIi8+CisgICAgPC9pbnN0cnVtZW50YXRpb24+CisKKzwvbWFuaWZlc3Q+CisKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NlY3VyZV9lbGVtZW50L2FjY2Vzc19jb250cm9sL0FjY2Vzc0NvbnRyb2xBcHAzL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL3NlY3VyZV9lbGVtZW50L2FjY2Vzc19jb250cm9sL0FjY2Vzc0NvbnRyb2xBcHAzL0FuZHJvaWRUZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2E2NGRhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvc2VjdXJlX2VsZW1lbnQvYWNjZXNzX2NvbnRyb2wvQWNjZXNzQ29udHJvbEFwcDMvQW5kcm9pZFRlc3QueG1sCkBAIC0wLDAgKzEsMjcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgT01BUEkgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIvPgorICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0ic3lzdGVtcyIvPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9InNpZ25lZC1DdHNTZWN1cmVFbGVtZW50QWNjZXNzQ29udHJvbFRlc3RDYXNlczMuYXBrIi8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkFuZHJvaWRKVW5pdFRlc3QiPgorICAgICAgICA8b3B0aW9uIG5hbWU9InBhY2thZ2UiIHZhbHVlPSJhbmRyb2lkLm9tYXBpLmFjY2Vzc2NvbnRyb2wzLmN0cyIvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjEwbTEwcyIvPgorICAgIDwvdGVzdD4KKzwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NlY3VyZV9lbGVtZW50L2FjY2Vzc19jb250cm9sL0FjY2Vzc0NvbnRyb2xBcHAzL2Fway9zaWduZWQtQ3RzU2VjdXJlRWxlbWVudEFjY2Vzc0NvbnRyb2xUZXN0Q2FzZXMzLmFwayBiL3Rlc3RzL3Rlc3RzL3NlY3VyZV9lbGVtZW50L2FjY2Vzc19jb250cm9sL0FjY2Vzc0NvbnRyb2xBcHAzL2Fway9zaWduZWQtQ3RzU2VjdXJlRWxlbWVudEFjY2Vzc0NvbnRyb2xUZXN0Q2FzZXMzLmFwawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGU0YTRjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvc2VjdXJlX2VsZW1lbnQvYWNjZXNzX2NvbnRyb2wvQWNjZXNzQ29udHJvbEFwcDMvYXBrL3NpZ25lZC1DdHNTZWN1cmVFbGVtZW50QWNjZXNzQ29udHJvbFRlc3RDYXNlczMuYXBrCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NlY3VyZV9lbGVtZW50L2FjY2Vzc19jb250cm9sL0FjY2Vzc0NvbnRyb2xBcHAzL3NyYy9hbmRyb2lkL29tYXBpL2FjY2Vzc2NvbnRyb2wzL2N0cy9BY2Nlc3NDb250cm9sVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvc2VjdXJlX2VsZW1lbnQvYWNjZXNzX2NvbnRyb2wvQWNjZXNzQ29udHJvbEFwcDMvc3JjL2FuZHJvaWQvb21hcGkvYWNjZXNzY29udHJvbDMvY3RzL0FjY2Vzc0NvbnRyb2xUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzI2MGM0ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3NlY3VyZV9lbGVtZW50L2FjY2Vzc19jb250cm9sL0FjY2Vzc0NvbnRyb2xBcHAzL3NyYy9hbmRyb2lkL29tYXBpL2FjY2Vzc2NvbnRyb2wzL2N0cy9BY2Nlc3NDb250cm9sVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyogQ29udHJpYnV0ZWQgYnkgT3JhbmdlICovCisKK3BhY2thZ2UgYW5kcm9pZC5vbWFwaS5hY2Nlc3Njb250cm9sMy5jdHM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzdW1lLmFzc3VtZVRydWU7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKK2ltcG9ydCBhbmRyb2lkLnNlLm9tYXBpLkNoYW5uZWw7CitpbXBvcnQgYW5kcm9pZC5zZS5vbWFwaS5SZWFkZXI7CitpbXBvcnQgYW5kcm9pZC5zZS5vbWFwaS5TRVNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5zZS5vbWFwaS5TRVNlcnZpY2UuT25Db25uZWN0ZWRMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLnNlLm9tYXBpLlNlc3Npb247CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworCitpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5Qcm9wZXJ0eVV0aWw7CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5UaW1lcjsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZXJUYXNrOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVvdXRFeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBBY2Nlc3NDb250cm9sVGVzdCB7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFVJQ0NfUkVBREVSX1BSRUZJWCA9ICJTSU0iOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBFU0VfUkVBREVSX1BSRUZJWCA9ICJlU0UiOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBTRF9SRUFERVJfUFJFRklYID0gIlNEIjsKKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGVbXSBBSURfNDAgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpIDB4QTAsIDB4MDAsIDB4MDAsCisgICAgICAgIDB4MDQsIDB4NzYsIDB4NDEsIDB4NkUsIDB4NjQsIDB4NzIsIDB4NkYsIDB4NjksIDB4NjQsIDB4NDMsIDB4NTQsCisgICAgICAgIDB4NTMsIDB4NDAgfTsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlW10gQUlEXzQxID0gbmV3IGJ5dGVbXSB7IChieXRlKSAweEEwLCAweDAwLCAweDAwLAorICAgICAgICAweDA0LCAweDc2LCAweDQxLCAweDZFLCAweDY0LCAweDcyLCAweDZGLCAweDY5LCAweDY0LCAweDQzLCAweDU0LAorICAgICAgICAweDUzLCAweDQxIH07CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZVtdIEFJRF80MiA9IG5ldyBieXRlW10geyAoYnl0ZSkgMHhBMCwgMHgwMCwgMHgwMCwKKyAgICAgICAgMHgwNCwgMHg3NiwgMHg0MSwgMHg2RSwgMHg2NCwgMHg3MiwgMHg2RiwgMHg2OSwgMHg2NCwgMHg0MywgMHg1NCwKKyAgICAgICAgMHg1MywgMHg0MiB9OworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGVbXSBBSURfNDMgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpIDB4QTAsIDB4MDAsIDB4MDAsCisgICAgICAgIDB4MDQsIDB4NzYsIDB4NDEsIDB4NkUsIDB4NjQsIDB4NzIsIDB4NkYsIDB4NjksIDB4NjQsIDB4NDMsIDB4NTQsCisgICAgICAgIDB4NTMsIDB4NDMgfTsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlW10gQUlEXzQ0ID0gbmV3IGJ5dGVbXSB7IChieXRlKSAweEEwLCAweDAwLCAweDAwLAorICAgICAgICAweDA0LCAweDc2LCAweDQxLCAweDZFLCAweDY0LCAweDcyLCAweDZGLCAweDY5LCAweDY0LCAweDQzLCAweDU0LAorICAgICAgICAweDUzLCAweDQ0IH07CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZVtdIEFJRF80NSA9IG5ldyBieXRlW10geyAoYnl0ZSkgMHhBMCwgMHgwMCwgMHgwMCwKKyAgICAgICAgMHgwNCwgMHg3NiwgMHg0MSwgMHg2RSwgMHg2NCwgMHg3MiwgMHg2RiwgMHg2OSwgMHg2NCwgMHg0MywgMHg1NCwKKyAgICAgICAgMHg1MywgMHg0NSB9OworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGVbXSBBSURfNDYgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpIDB4QTAsIDB4MDAsIDB4MDAsCisgICAgICAgIDB4MDQsIDB4NzYsIDB4NDEsIDB4NkUsIDB4NjQsIDB4NzIsIDB4NkYsIDB4NjksIDB4NjQsIDB4NDMsIDB4NTQsCisgICAgICAgIDB4NTMsIDB4NDYgfTsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlW10gQUlEXzQ3ID0gbmV3IGJ5dGVbXSB7IChieXRlKSAweEEwLCAweDAwLCAweDAwLAorICAgICAgICAweDA0LCAweDc2LCAweDQxLCAweDZFLCAweDY0LCAweDcyLCAweDZGLCAweDY5LCAweDY0LCAweDQzLCAweDU0LAorICAgICAgICAweDUzLCAweDQ3IH07CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZVtdIEFJRF80OCA9IG5ldyBieXRlW10geyAoYnl0ZSkgMHhBMCwgMHgwMCwgMHgwMCwKKyAgICAgICAgMHgwNCwgMHg3NiwgMHg0MSwgMHg2RSwgMHg2NCwgMHg3MiwgMHg2RiwgMHg2OSwgMHg2NCwgMHg0MywgMHg1NCwKKyAgICAgICAgMHg1MywgMHg0OCB9OworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGVbXSBBSURfNDkgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpIDB4QTAsIDB4MDAsIDB4MDAsCisgICAgICAgIDB4MDQsIDB4NzYsIDB4NDEsIDB4NkUsIDB4NjQsIDB4NzIsIDB4NkYsIDB4NjksIDB4NjQsIDB4NDMsIDB4NTQsCisgICAgICAgIDB4NTMsIDB4NDkgfTsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlW10gQUlEXzRBID0gbmV3IGJ5dGVbXSB7IChieXRlKSAweEEwLCAweDAwLCAweDAwLAorICAgICAgICAweDA0LCAweDc2LCAweDQxLCAweDZFLCAweDY0LCAweDcyLCAweDZGLCAweDY5LCAweDY0LCAweDQzLCAweDU0LAorICAgICAgICAweDUzLCAoYnl0ZSkgMHg0QSB9OworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGVbXSBBSURfNEIgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpIDB4QTAsIDB4MDAsIDB4MDAsCisgICAgICAgIDB4MDQsIDB4NzYsIDB4NDEsIDB4NkUsIDB4NjQsIDB4NzIsIDB4NkYsIDB4NjksIDB4NjQsIDB4NDMsIDB4NTQsCisgICAgICAgIDB4NTMsIChieXRlKSAweDRCIH07CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZVtdIEFJRF80QyA9IG5ldyBieXRlW10geyAoYnl0ZSkgMHhBMCwgMHgwMCwgMHgwMCwKKyAgICAgICAgMHgwNCwgMHg3NiwgMHg0MSwgMHg2RSwgMHg2NCwgMHg3MiwgMHg2RiwgMHg2OSwgMHg2NCwgMHg0MywgMHg1NCwKKyAgICAgICAgMHg1MywgKGJ5dGUpIDB4NEMgfTsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlW10gQUlEXzREID0gbmV3IGJ5dGVbXSB7IChieXRlKSAweEEwLCAweDAwLCAweDAwLAorICAgICAgICAweDA0LCAweDc2LCAweDQxLCAweDZFLCAweDY0LCAweDcyLCAweDZGLCAweDY5LCAweDY0LCAweDQzLCAweDU0LAorICAgICAgICAweDUzLCAoYnl0ZSkgMHg0RCB9OworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGVbXSBBSURfNEUgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpIDB4QTAsIDB4MDAsIDB4MDAsCisgICAgICAgIDB4MDQsIDB4NzYsIDB4NDEsIDB4NkUsIDB4NjQsIDB4NzIsIDB4NkYsIDB4NjksIDB4NjQsIDB4NDMsIDB4NTQsCisgICAgICAgIDB4NTMsIChieXRlKSAweDRFIH07CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZVtdIEFJRF80RiA9IG5ldyBieXRlW10geyAoYnl0ZSkgMHhBMCwgMHgwMCwgMHgwMCwKKyAgICAgICAgMHgwNCwgMHg3NiwgMHg0MSwgMHg2RSwgMHg2NCwgMHg3MiwgMHg2RiwgMHg2OSwgMHg2NCwgMHg0MywgMHg1NCwKKyAgICAgICAgMHg1MywgKGJ5dGUpIDB4NEYgfTsKKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGVbXVtdIEFVVEhPUklaRURfQUlEID0gbmV3IGJ5dGVbXVtdIHsgQUlEXzQwLAorICAgICAgICBBSURfNDEsIEFJRF80NSwgQUlEXzQ2IH07CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZVtdW10gVU5BVVRIT1JJWkVEX0FJRCA9IG5ldyBieXRlW11bXSB7IEFJRF80MiwKKyAgICAgICAgQUlEXzQzLCBBSURfNDQsIEFJRF80NywgQUlEXzQ4LCBBSURfNDksIEFJRF80QSwgQUlEXzRCLCBBSURfNEMsIEFJRF80RCwgQUlEXzRFLAorICAgICAgICBBSURfNEYgfTsKKworICAgIC8qIEF1dGhvcml6ZWQgQVBEVSBmb3IgQUlEXzQwICovCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZVtdW10gQVVUSE9SSVpFRF9BUERVX0FJRF80MCA9IG5ldyBieXRlW11bXSB7CisgICAgICAgIHsgMHgwMCwgMHgwNiwgMHgwMCwgMHgwMCB9LCB7IChieXRlKSAweDgwLCAweDA2LCAweDAwLCAweDAwIH0sCisgICAgICAgIHsgKGJ5dGUpIDB4QTAsIDB4MDYsIDB4MDAsIDB4MDAgfSwKKyAgICAgICAgeyAoYnl0ZSkgMHg5NCwgMHgwNiwgMHgwMCwgMHgwMCB9LAorICAgICAgICB7IDB4MDAsIDB4MEEsIDB4MDAsIDB4MDAsIDB4MDEsIChieXRlKSAweEFBIH0sCisgICAgICAgIHsgKGJ5dGUpIDB4ODAsIDB4MEEsIDB4MDAsIDB4MDAsIDB4MDEsIChieXRlKSAweEFBIH0sCisgICAgICAgIHsgKGJ5dGUpIDB4QTAsIDB4MEEsIDB4MDAsIDB4MDAsIDB4MDEsIChieXRlKSAweEFBIH0sCisgICAgICAgIHsgKGJ5dGUpIDB4OTQsIDB4MEEsIDB4MDAsIDB4MDAsIDB4MDEsIChieXRlKSAweEFBIH0sCisgICAgICAgIHsgMHgwMCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCB9LAorICAgICAgICB7IChieXRlKSAweDgwLCAweDA4LCAweDAwLCAweDAwLCAweDAwIH0sCisgICAgICAgIHsgKGJ5dGUpIDB4QTAsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAgfSwKKyAgICAgICAgeyAoYnl0ZSkgMHg5NCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCB9LAorICAgICAgICB7IDB4MDAsIChieXRlKSAweDBDLCAweDAwLCAweDAwLCAweDAxLCAoYnl0ZSkgMHhBQSwgMHgwMCB9LAorICAgICAgICB7IChieXRlKSAweDgwLCAoYnl0ZSkgMHgwQywgMHgwMCwgMHgwMCwgMHgwMSwgKGJ5dGUpIDB4QUEsIDB4MDAgfSwKKyAgICAgICAgeyAoYnl0ZSkgMHhBMCwgKGJ5dGUpIDB4MEMsIDB4MDAsIDB4MDAsIDB4MDEsIChieXRlKSAweEFBLCAweDAwIH0sCisgICAgICAgIHsgKGJ5dGUpIDB4OTQsIChieXRlKSAweDBDLCAweDAwLCAweDAwLCAweDAxLCAoYnl0ZSkgMHhBQSwgMHgwMCB9fTsKKworICAgIC8qIEF1dGhvcml6ZWQgQVBEVSBmb3IgQUlEXzQxICovCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZVtdW10gQVVUSE9SSVpFRF9BUERVX0FJRF80MSA9IG5ldyBieXRlW11bXSB7CisgICAgICAgIHsgKGJ5dGUpIDB4OTQsIDB4MDYsIDB4MDAsIDB4MDAgfSwKKyAgICAgICAgeyAoYnl0ZSkgMHg5NCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCB9LAorICAgICAgICB7IChieXRlKSAweDk0LCAoYnl0ZSkgMHgwQywgMHgwMCwgMHgwMCwgMHgwMSwgKGJ5dGUpIDB4QUEsIDB4MDAgfSwKKyAgICAgICAgeyAoYnl0ZSkgMHg5NCwgMHgwQSwgMHgwMCwgMHgwMCwgMHgwMSwgKGJ5dGUpIDB4QUEgfSB9OworICAgIC8qIFVuYXV0aG9yaXplZCBBUERVIGZvciBBSURfNDEgKi8KKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlW11bXSBVTkFVVEhPUklaRURfQVBEVV9BSURfNDEgPSBuZXcgYnl0ZVtdW10geworICAgICAgICB7IDB4MDAsIDB4MDYsIDB4MDAsIDB4MDAgfSwgeyAoYnl0ZSkgMHg4MCwgMHgwNiwgMHgwMCwgMHgwMCB9LAorICAgICAgICB7IChieXRlKSAweEEwLCAweDA2LCAweDAwLCAweDAwIH0sCisgICAgICAgIHsgMHgwMCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCB9LAorICAgICAgICB7IChieXRlKSAweDAwLCAweDBBLCAweDAwLCAweDAwLCAweDAxLCAoYnl0ZSkgMHhBQSB9LAorICAgICAgICB7IChieXRlKSAweDgwLCAweDBBLCAweDAwLCAweDAwLCAweDAxLCAoYnl0ZSkgMHhBQSB9LAorICAgICAgICB7IChieXRlKSAweEEwLCAweDBBLCAweDAwLCAweDAwLCAweDAxLCAoYnl0ZSkgMHhBQSB9LAorICAgICAgICB7IChieXRlKSAweDgwLCAweDA4LCAweDAwLCAweDAwLCAweDAwIH0sCisgICAgICAgIHsgKGJ5dGUpIDB4QTAsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAgfSwKKyAgICAgICAgeyAweDAwLCAoYnl0ZSkgMHgwQywgMHgwMCwgMHgwMCwgMHgwMSwgKGJ5dGUpIDB4QUEsIDB4MDAgfSwKKyAgICAgICAgeyAoYnl0ZSkgMHg4MCwgKGJ5dGUpIDB4MEMsIDB4MDAsIDB4MDAsIDB4MDEsIChieXRlKSAweEFBLCAweDAwIH0sCisgICAgICAgIHsgKGJ5dGUpIDB4QTAsIChieXRlKSAweDBDLCAweDAwLCAweDAwLCAweDAxLCAoYnl0ZSkgMHhBQSwgMHgwMCB9LAorICAgIH07CisKKyAgICBwcml2YXRlIGZpbmFsIGxvbmcgU0VSVklDRV9DT05ORUNUSU9OX1RJTUVfT1VUID0gMzAwMDsKKyAgICBwcml2YXRlIFNFU2VydmljZSBzZVNlcnZpY2U7CisgICAgcHJpdmF0ZSBPYmplY3Qgc2VydmljZU11dGV4ID0gbmV3IE9iamVjdCgpOworICAgIHByaXZhdGUgVGltZXIgY29ubmVjdGlvblRpbWVyOworICAgIHByaXZhdGUgU2VydmljZUNvbm5lY3Rpb25UaW1lclRhc2sgbVRpbWVyVGFzayA9IG5ldyBTZXJ2aWNlQ29ubmVjdGlvblRpbWVyVGFzaygpOworICAgIHByaXZhdGUgYm9vbGVhbiBjb25uZWN0ZWQgPSBmYWxzZTsKKworICAgIHByaXZhdGUgZmluYWwgT25Db25uZWN0ZWRMaXN0ZW5lciBtTGlzdGVuZXIgPSBuZXcgT25Db25uZWN0ZWRMaXN0ZW5lcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ29ubmVjdGVkKCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChzZXJ2aWNlTXV0ZXgpIHsKKyAgICAgICAgICAgICAgICBjb25uZWN0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIHNlcnZpY2VNdXRleC5ub3RpZnkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBjbGFzcyBTeW5jaHJvbm91c0V4ZWN1dG9yIGltcGxlbWVudHMgRXhlY3V0b3IgeworICAgICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKFJ1bm5hYmxlIHIpIHsKKyAgICAgICAgICAgIHIucnVuKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gc3VwcG9ydHNIYXJkd2FyZSgpIHsKKyAgICAgICAgZmluYWwgUGFja2FnZU1hbmFnZXIgcG0gPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCkuZ2V0UGFja2FnZU1hbmFnZXIoKTsKKyAgICAgICAgYm9vbGVhbiBsb3dSYW1EZXZpY2UgPSBQcm9wZXJ0eVV0aWwucHJvcGVydHlFcXVhbHMoInJvLmNvbmZpZy5sb3dfcmFtIiwgInRydWUiKTsKKyAgICAgICAgcmV0dXJuICFsb3dSYW1EZXZpY2UgfHwgKGxvd1JhbURldmljZSAmJiBwbS5oYXNTeXN0ZW1GZWF0dXJlKCJhbmRyb2lkLmhhcmR3YXJlLnR5cGUud2F0Y2giKSk7CisgICAgfQorCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc3VtZVRydWUoUHJvcGVydHlVdGlsLmdldEZpcnN0QXBpTGV2ZWwoKSA+IEJ1aWxkLlZFUlNJT05fQ09ERVMuT19NUjEpOworICAgICAgICBhc3N1bWVUcnVlKHN1cHBvcnRzSGFyZHdhcmUoKSk7CisgICAgICAgIHNlU2VydmljZSA9IG5ldyBTRVNlcnZpY2UoSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpLCBuZXcgU3luY2hyb25vdXNFeGVjdXRvcigpLCBtTGlzdGVuZXIpOworICAgICAgICBjb25uZWN0aW9uVGltZXIgPSBuZXcgVGltZXIoKTsKKyAgICAgICAgY29ubmVjdGlvblRpbWVyLnNjaGVkdWxlKG1UaW1lclRhc2ssIFNFUlZJQ0VfQ09OTkVDVElPTl9USU1FX09VVCk7CisgICAgfQorCisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHNlU2VydmljZSAhPSBudWxsICYmIHNlU2VydmljZS5pc0Nvbm5lY3RlZCgpKSB7CisgICAgICAgICAgICBzZVNlcnZpY2Uuc2h1dGRvd24oKTsKKyAgICAgICAgICAgIGNvbm5lY3RlZCA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdhaXRGb3JDb25uZWN0aW9uKCkgdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24geworICAgICAgICBzeW5jaHJvbml6ZWQgKHNlcnZpY2VNdXRleCkgeworICAgICAgICAgICAgaWYgKCFjb25uZWN0ZWQpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlTXV0ZXgud2FpdCgpOworICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghY29ubmVjdGVkKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRpbWVvdXRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJTZXJ2aWNlIGNvdWxkIG5vdCBiZSBjb25uZWN0ZWQgYWZ0ZXIgIgorICAgICAgICAgICAgICAgICAgICArIFNFUlZJQ0VfQ09OTkVDVElPTl9USU1FX09VVCArICIgbXMiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjb25uZWN0aW9uVGltZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25UaW1lci5jYW5jZWwoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEF1dGhvcml6ZWRBSUQoKSB7CisgICAgICAgIGZvciAoYnl0ZVtdIGFpZCA6IEFVVEhPUklaRURfQUlEKSB7CisgICAgICAgICAgICB0ZXN0U2VsZWN0YWJsZUFpZChhaWQpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VW5hdXRob3JpemVkQUlEKCkgeworICAgICAgICBmb3IgKGJ5dGVbXSBhaWQgOiBVTkFVVEhPUklaRURfQUlEKSB7CisgICAgICAgICAgICB0ZXN0VW5hdXRob3Jpc2VkQWlkKGFpZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRob3JpemVkQVBEVUFJRDQwKCkgeworICAgICAgICBmb3IgKGJ5dGVbXSBhcGR1IDogQVVUSE9SSVpFRF9BUERVX0FJRF80MCkgeworICAgICAgICAgICAgdGVzdFRyYW5zbWl0QVBEVShBSURfNDAsIGFwZHUpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0aG9yaXplZEFQRFVBSUQ0MSgpIHsKKyAgICAgICAgZm9yIChieXRlW10gYXBkdSA6IEFVVEhPUklaRURfQVBEVV9BSURfNDEpIHsKKyAgICAgICAgICAgIHRlc3RUcmFuc21pdEFQRFUoQUlEXzQxLCBhcGR1KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVuYXV0aG9yaXNlZEFQRFVBSUQ0MSgpIHsKKyAgICAgICAgZm9yIChieXRlW10gYXBkdSA6IFVOQVVUSE9SSVpFRF9BUERVX0FJRF80MSkgeworICAgICAgICAgICAgdGVzdFVuYXV0aG9yaXNlZEFQRFUoQUlEXzQxLCBhcGR1KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0U2VsZWN0YWJsZUFpZChieXRlW10gYWlkKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3YWl0Rm9yQ29ubmVjdGlvbigpOworICAgICAgICAgICAgUmVhZGVyW10gcmVhZGVycyA9IHNlU2VydmljZS5nZXRSZWFkZXJzKCk7CisgICAgICAgICAgICBmb3IgKFJlYWRlciByZWFkZXIgOiByZWFkZXJzKSB7CisgICAgICAgICAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gbnVsbDsKKyAgICAgICAgICAgICAgICBDaGFubmVsIGNoYW5uZWwgPSBudWxsOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUocmVhZGVyLmlzU2VjdXJlRWxlbWVudFByZXNlbnQoKSk7CisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24gPSByZWFkZXIub3BlblNlc3Npb24oKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiTnVsbCBTZXNzaW9uIiwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgPSBzZXNzaW9uLm9wZW5Mb2dpY2FsQ2hhbm5lbChhaWQsIChieXRlKSAweDAwKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiTnVsbCBDaGFubmVsIiwgY2hhbm5lbCk7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBzZWxlY3RSZXNwb25zZSA9IGNoYW5uZWwuZ2V0U2VsZWN0UmVzcG9uc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiTnVsbCBTZWxlY3QgUmVzcG9uc2UiLCBzZWxlY3RSZXNwb25zZSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRoYXQoc2VsZWN0UmVzcG9uc2Vbc2VsZWN0UmVzcG9uc2UubGVuZ3RoIC0gMV0gJiAweEZGLCBpcygweDAwKSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRoYXQoc2VsZWN0UmVzcG9uc2Vbc2VsZWN0UmVzcG9uc2UubGVuZ3RoIC0gMl0gJiAweEZGLCBpcygweDkwKSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIlNlbGVjdCBSZXNwb25zZSBpcyBub3QgY29tcGxldGUiLCB2ZXJpZnlCZXJUbHZEYXRhKHNlbGVjdFJlc3BvbnNlKSk7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5uZWwgIT0gbnVsbCkgY2hhbm5lbC5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKSBzZXNzaW9uLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBFeGNlcHRpb24gIiArIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RVbmF1dGhvcmlzZWRBaWQoYnl0ZVtdIGFpZCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgd2FpdEZvckNvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgIFJlYWRlcltdIHJlYWRlcnMgPSBzZVNlcnZpY2UuZ2V0UmVhZGVycygpOworICAgICAgICAgICAgZm9yIChSZWFkZXIgcmVhZGVyIDogcmVhZGVycykgeworICAgICAgICAgICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IG51bGw7CisgICAgICAgICAgICAgICAgQ2hhbm5lbCBjaGFubmVsID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHJlYWRlci5pc1NlY3VyZUVsZW1lbnRQcmVzZW50KCkpOworICAgICAgICAgICAgICAgICAgICBzZXNzaW9uID0gcmVhZGVyLm9wZW5TZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIk51bGwgU2Vzc2lvbiIsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCA9IHNlc3Npb24ub3BlbkxvZ2ljYWxDaGFubmVsKGFpZCwgKGJ5dGUpIDB4MDApOworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbCgiU2VjdXJpdHlFeGNlcHRpb24gRXhwZWN0ZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXhwZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaGFubmVsICE9IG51bGwpIGNoYW5uZWwuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkgc2Vzc2lvbi5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgRXhjZXB0aW9uICIgKyBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0VHJhbnNtaXRBUERVKGJ5dGVbXSBhaWQsIGJ5dGVbXSBhcGR1KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3YWl0Rm9yQ29ubmVjdGlvbigpOworICAgICAgICAgICAgUmVhZGVyW10gcmVhZGVycyA9IHNlU2VydmljZS5nZXRSZWFkZXJzKCk7CisgICAgICAgICAgICBmb3IgKFJlYWRlciByZWFkZXIgOiByZWFkZXJzKSB7CisgICAgICAgICAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gbnVsbDsKKyAgICAgICAgICAgICAgICBDaGFubmVsIGNoYW5uZWwgPSBudWxsOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUocmVhZGVyLmlzU2VjdXJlRWxlbWVudFByZXNlbnQoKSk7CisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24gPSByZWFkZXIub3BlblNlc3Npb24oKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiTnVsbCBTZXNzaW9uIiwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgPSBzZXNzaW9uLm9wZW5Mb2dpY2FsQ2hhbm5lbChhaWQsIChieXRlKSAweDAwKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiTnVsbCBDaGFubmVsIiwgY2hhbm5lbCk7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBzZWxlY3RSZXNwb25zZSA9IGNoYW5uZWwuZ2V0U2VsZWN0UmVzcG9uc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiTnVsbCBTZWxlY3QgUmVzcG9uc2UiLCBzZWxlY3RSZXNwb25zZSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRoYXQoc2VsZWN0UmVzcG9uc2Vbc2VsZWN0UmVzcG9uc2UubGVuZ3RoIC0gMV0gJiAweEZGLCBpcygweDAwKSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRoYXQoc2VsZWN0UmVzcG9uc2Vbc2VsZWN0UmVzcG9uc2UubGVuZ3RoIC0gMl0gJiAweEZGLCBpcygweDkwKSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIlNlbGVjdCBSZXNwb25zZSBpcyBub3QgY29tcGxldGUiLCB2ZXJpZnlCZXJUbHZEYXRhKHNlbGVjdFJlc3BvbnNlKSk7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBhcGR1UmVzcG9uc2UgPSBjaGFubmVsLnRyYW5zbWl0KGFwZHUpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJOdWxsIENoYW5uZWwiLCBhcGR1UmVzcG9uc2UpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaGFubmVsICE9IG51bGwpIGNoYW5uZWwuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkgc2Vzc2lvbi5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgRXhjZXB0aW9uICIgKyBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0VW5hdXRob3Jpc2VkQVBEVShieXRlW10gYWlkLCBieXRlW10gYXBkdSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgd2FpdEZvckNvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgIFJlYWRlcltdIHJlYWRlcnMgPSBzZVNlcnZpY2UuZ2V0UmVhZGVycygpOworICAgICAgICAgICAgZm9yIChSZWFkZXIgcmVhZGVyIDogcmVhZGVycykgeworICAgICAgICAgICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IG51bGw7CisgICAgICAgICAgICAgICAgQ2hhbm5lbCBjaGFubmVsID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHJlYWRlci5pc1NlY3VyZUVsZW1lbnRQcmVzZW50KCkpOworICAgICAgICAgICAgICAgICAgICBzZXNzaW9uID0gcmVhZGVyLm9wZW5TZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIk51bGwgU2Vzc2lvbiIsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICBjaGFubmVsID0gc2Vzc2lvbi5vcGVuTG9naWNhbENoYW5uZWwoYWlkLCAoYnl0ZSkgMHgwMCk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIk51bGwgQ2hhbm5lbCIsIGNoYW5uZWwpOworICAgICAgICAgICAgICAgICAgICBieXRlW10gc2VsZWN0UmVzcG9uc2UgPSBjaGFubmVsLmdldFNlbGVjdFJlc3BvbnNlKCk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIk51bGwgU2VsZWN0IFJlc3BvbnNlIiwgc2VsZWN0UmVzcG9uc2UpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUaGF0KHNlbGVjdFJlc3BvbnNlW3NlbGVjdFJlc3BvbnNlLmxlbmd0aCAtIDFdICYgMHhGRiwgaXMoMHgwMCkpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUaGF0KHNlbGVjdFJlc3BvbnNlW3NlbGVjdFJlc3BvbnNlLmxlbmd0aCAtIDJdICYgMHhGRiwgaXMoMHg5MCkpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJTZWxlY3QgUmVzcG9uc2UgaXMgbm90IGNvbXBsZXRlIiwgdmVyaWZ5QmVyVGx2RGF0YShzZWxlY3RSZXNwb25zZSkpOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbC50cmFuc21pdChhcGR1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwoIlNlY3VyaXR5IEV4Y2VwdGlvbiBpcyBleHBlY3RlZCIpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBFeHBlY3RlZAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5uZWwgIT0gbnVsbCkgY2hhbm5lbC5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKSBzZXNzaW9uLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBFeGNlcHRpb24gIiArIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVmVyaWZpZXMgVExWIGRhdGEKKyAgICAgKgorICAgICAqIEBwYXJhbSB0bHYKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGRhdGEgaXMgdGx2IGZvcm1hdHRlZCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB2ZXJpZnlCZXJUbHZEYXRhKGJ5dGVbXSB0bHYpIHsKKyAgICAgICAgaWYgKHRsdiA9PSBudWxsIHx8IHRsdi5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkludmFsaWQgdGx2LCBudWxsIik7CisgICAgICAgIH0KKworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIGJ5dGVbXSBrZXkgPSBuZXcgYnl0ZVsyXTsKKyAgICAgICAga2V5WzBdID0gdGx2W2ldOworICAgICAgICBpZiAoKGtleVswXSAmIDB4MUYpID09IDB4MUYpIHsKKyAgICAgICAgICAgIC8vIGV4dHJhIGJ5dGUgZm9yIFRBRyBmaWVsZAorICAgICAgICAgICAga2V5WzFdID0gdGx2W2kgPSBpICsgMV07CisgICAgICAgIH0KKworICAgICAgICBpbnQgbGVuID0gdGx2W2kgPSBpICsgMV0gJiAweEZGOworICAgICAgICBpZiAobGVuID4gMTI3KSB7CisgICAgICAgICAgICAvLyBtb3JlIHRoYW4gMSBieXRlIGZvciBsZW5ndGgKKyAgICAgICAgICAgIGludCBieXRlc0xlbmd0aCA9IGxlbiAtIDEyODsKKyAgICAgICAgICAgIGxlbiA9IDA7CisgICAgICAgICAgICBmb3IgKGludCBqID0gYnl0ZXNMZW5ndGggLSAxOyBqID49IDA7IGotLSkgeworICAgICAgICAgICAgICBsZW4gKz0gKHRsdltpID0gaSArIDFdICYgMHhGRikgKiBNYXRoLnBvdygxMCwgaik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRsdi5sZW5ndGggPT0gKGkgKyBsZW4gKyAzKTsKKyAgICB9CisKKyAgICBjbGFzcyBTZXJ2aWNlQ29ubmVjdGlvblRpbWVyVGFzayBleHRlbmRzIFRpbWVyVGFzayB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNlcnZpY2VNdXRleCkgeworICAgICAgICAgICAgICAgIHNlcnZpY2VNdXRleC5ub3RpZnlBbGwoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NlY3VyZV9lbGVtZW50L2FjY2Vzc19jb250cm9sL0FuZHJvaWQubWsgYi90ZXN0cy90ZXN0cy9zZWN1cmVfZWxlbWVudC9hY2Nlc3NfY29udHJvbC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NzZlNDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zZWN1cmVfZWxlbWVudC9hY2Nlc3NfY29udHJvbC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjAgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2N0c19vdXRfZGlyIDo9ICQoSE9TVF9PVVQpL2N0cy9hbmRyb2lkLWN0cy90ZXN0Y2FzZXMKKyQoY2FsbCBkaXN0LWZvci1nb2FscyxjdHMsJChjdHNfb3V0X2RpcikvQ3RzU2VjdXJlRWxlbWVudEFjY2Vzc0NvbnRyb2xUZXN0Q2FzZXMxLmFwaykKKyQoY2FsbCBkaXN0LWZvci1nb2FscyxjdHMsJChjdHNfb3V0X2RpcikvQ3RzU2VjdXJlRWxlbWVudEFjY2Vzc0NvbnRyb2xUZXN0Q2FzZXMyLmFwaykKKyQoY2FsbCBkaXN0LWZvci1nb2FscyxjdHMsJChjdHNfb3V0X2RpcikvQ3RzU2VjdXJlRWxlbWVudEFjY2Vzc0NvbnRyb2xUZXN0Q2FzZXMzLmFwaykKK2luY2x1ZGUgJChjYWxsIGFsbC1zdWJkaXItbWFrZWZpbGVzKQorCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zZWN1cmVfZWxlbWVudC9vbWFwaS9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvc2VjdXJlX2VsZW1lbnQvb21hcGkvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWMzNzIwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvc2VjdXJlX2VsZW1lbnQvb21hcGkvQW5kcm9pZC5tawpAQCAtMCwwICsxLDQwIEBACisjIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNPbWFwaVRlc3RDYXNlcworCisjIERvbid0IGluY2x1ZGUgdGhpcyBwYWNrYWdlIGluIGFueSB0YXJnZXQuCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCisjIFdoZW4gYnVpbHQsIGV4cGxpY2l0bHkgcHV0IGl0IGluIHRoZSBkYXRhIHBhcnRpdGlvbi4KK0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCisKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCisJY3RzdGVzdHJ1bm5lci1heHQgXAorCWNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0CisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKKworTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorTE9DQUxfSkFWQV9MSUJSQVJJRVMgKz0gYW5kcm9pZC50ZXN0LnJ1bm5lcgorTE9DQUxfSkFWQV9MSUJSQVJJRVMgKz0gYW5kcm9pZC50ZXN0LmJhc2UKKworIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKKworaW5jbHVkZSAkKEJVSUxEX0NUU19QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJlX2VsZW1lbnQvb21hcGkvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL3NlY3VyZV9lbGVtZW50L29tYXBpL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE5ZmI4NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3NlY3VyZV9lbGVtZW50L29tYXBpL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwzMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgICBwYWNrYWdlPSJhbmRyb2lkLm9tYXBpLmN0cyI+CisKKyAgICA8YXBwbGljYXRpb24+CisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIi8+CisgICAgPC9hcHBsaWNhdGlvbj4KKworICAgIDwhLS0gVGhpcyBpcyBhIHNlbGYtaW5zdHJ1bWVudGluZyB0ZXN0IHBhY2thZ2UuIC0tPgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgdGVzdHMgZm9yIE9wZW4gTW9iaWxlIEFQSSIKKyAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5vbWFwaS5jdHMiPgorICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0ibGlzdGVuZXIiCisgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp2YWx1ZT0iY29tLmFuZHJvaWQuY3RzLnJ1bm5lci5DdHNUZXN0UnVuTGlzdGVuZXIiLz4KKyAgICA8L2luc3RydW1lbnRhdGlvbj4KKworPC9tYW5pZmVzdD4KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJlX2VsZW1lbnQvb21hcGkvQW5kcm9pZFRlc3QueG1sIGIvdGVzdHMvdGVzdHMvc2VjdXJlX2VsZW1lbnQvb21hcGkvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZWI5YzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zZWN1cmVfZWxlbWVudC9vbWFwaS9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwyNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBPTUFQSSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIi8+CisgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJzeXN0ZW1zIi8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzT21hcGlUZXN0Q2FzZXMuYXBrIi8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkFuZHJvaWRKVW5pdFRlc3QiPgorICAgICAgICA8b3B0aW9uIG5hbWU9InBhY2thZ2UiIHZhbHVlPSJhbmRyb2lkLm9tYXBpLmN0cyIvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjEwbTEwcyIvPgorICAgIDwvdGVzdD4KKzwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NlY3VyZV9lbGVtZW50L29tYXBpL3NyYy9hbmRyb2lkL29tYXBpL2N0cy9PbWFwaVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3NlY3VyZV9lbGVtZW50L29tYXBpL3NyYy9hbmRyb2lkL29tYXBpL2N0cy9PbWFwaVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lMzRkMzA3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvc2VjdXJlX2VsZW1lbnQvb21hcGkvc3JjL2FuZHJvaWQvb21hcGkvY3RzL09tYXBpVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyogQ29udHJpYnV0ZWQgYnkgT3JhbmdlICovCisKK3BhY2thZ2UgYW5kcm9pZC5vbWFwaS5jdHM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzdW1lLmFzc3VtZVRydWU7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKK2ltcG9ydCBhbmRyb2lkLnNlLm9tYXBpLkNoYW5uZWw7CitpbXBvcnQgYW5kcm9pZC5zZS5vbWFwaS5SZWFkZXI7CitpbXBvcnQgYW5kcm9pZC5zZS5vbWFwaS5TRVNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5zZS5vbWFwaS5TRVNlcnZpY2UuT25Db25uZWN0ZWRMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLnNlLm9tYXBpLlNlc3Npb247CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworCitpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5Qcm9wZXJ0eVV0aWw7CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlRpbWVyOworaW1wb3J0IGphdmEudXRpbC5UaW1lclRhc2s7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZW91dEV4Y2VwdGlvbjsKKworcHVibGljIGNsYXNzIE9tYXBpVGVzdCB7CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVUlDQ19SRUFERVJfUFJFRklYID0gIlNJTSI7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEVTRV9SRUFERVJfUFJFRklYID0gImVTRSI7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFNEX1JFQURFUl9QUkVGSVggPSAiU0QiOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGVbXSBTRUxFQ1RBQkxFX0FJRCA9CisgICAgICAgICAgICBuZXcgYnl0ZVtdeyhieXRlKSAweEEwLCAweDAwLCAweDAwLCAweDA0LCAweDc2LCAweDQxLCAweDZFLCAweDY0LAorICAgICAgICAgICAgICAgICAgICAweDcyLCAweDZGLCAweDY5LCAweDY0LCAweDQzLCAweDU0LCAweDUzLCAweDMxfTsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlW10gTE9OR19TRUxFQ1RfUkVTUE9OU0VfQUlEID0KKyAgICAgICAgICAgIG5ldyBieXRlW117KGJ5dGUpIDB4QTAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4NzYsIDB4NDEsIDB4NkUsIDB4NjQsCisgICAgICAgICAgICAgICAgICAgIDB4NzIsIDB4NkYsIDB4NjksIDB4NjQsIDB4NDMsIDB4NTQsIDB4NTMsIDB4MzJ9OworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGVbXSBOT05fU0VMRUNUQUJMRV9BSUQgPQorICAgICAgICAgICAgbmV3IGJ5dGVbXXsoYnl0ZSkgMHhBMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHg3NiwgMHg0MSwgMHg2RSwgMHg2NCwKKyAgICAgICAgICAgICAgICAgICAgMHg3MiwgMHg2RiwgMHg2OSwgMHg2NCwgMHg0MywgMHg1NCwgMHg1MywgKGJ5dGUpIDB4RkZ9OworCisgICAgLyogTUFOQUdFIG9wZW4vY2xvc2UgYW5kIFNFTEVDVCBBSUQgKi8KKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlW11bXSBJTExFR0FMX0NPTU1BTkRTX1RSQU5TTUlUID0gbmV3IGJ5dGVbXVtde3sweDAwLCAweDcwLCAweDAwLCAweDAwfSwKKyAgICAgICAgICAgIHsweDAwLCAweDcwLCAoYnl0ZSkgMHg4MCwgMHgwMH0sCisgICAgICAgICAgICB7MHgwMCwgKGJ5dGUpIDB4QTQsIDB4MDQsIDB4MDQsIDB4MTAsIDB4NEEsIDB4NTMsCisgICAgICAgICAgICAgICAgICAgIDB4NTIsIDB4MzEsIDB4MzcsIDB4MzcsIDB4NTQsIDB4NjUsIDB4NzMsCisgICAgICAgICAgICAgICAgICAgIDB4NzQsIDB4NjUsIDB4NzIsIDB4MjAsIDB4MzEsIDB4MkUsIDB4MzB9CisgICAgfTsKKworICAgIC8qIE9NQVBJIEFQRFUgVGVzdCBjYXNlIDEgYW5kIDMgKi8KKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlW11bXSBOT19EQVRBX0FQRFUgPSBuZXcgYnl0ZVtdW117ezB4MDAsIDB4MDYsIDB4MDAsIDB4MDB9LAorICAgICAgICAgICAgeyhieXRlKSAweDgwLCAweDA2LCAweDAwLCAweDAwfSwKKyAgICAgICAgICAgIHsoYnl0ZSkgMHhBMCwgMHgwNiwgMHgwMCwgMHgwMH0sCisgICAgICAgICAgICB7KGJ5dGUpIDB4OTQsIDB4MDYsIDB4MDAsIDB4MDB9LAorICAgICAgICAgICAgezB4MDAsIDB4MEEsIDB4MDAsIDB4MDAsIDB4MDEsIChieXRlKSAweEFBfSwKKyAgICAgICAgICAgIHsoYnl0ZSkgMHg4MCwgMHgwQSwgMHgwMCwgMHgwMCwgMHgwMSwgKGJ5dGUpIDB4QUF9LAorICAgICAgICAgICAgeyhieXRlKSAweEEwLCAweDBBLCAweDAwLCAweDAwLCAweDAxLCAoYnl0ZSkgMHhBQX0sCisgICAgICAgICAgICB7KGJ5dGUpIDB4OTQsIDB4MEEsIDB4MDAsIDB4MDAsIDB4MDEsIChieXRlKSAweEFBfQorICAgIH07CisgICAgLyogT01BUEkgQVBEVSBUZXN0IGNhc2UgMiBhbmQgNCAqLworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGVbXVtdIERBVEFfQVBEVSA9IG5ldyBieXRlW11bXXt7MHgwMCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMH0sCisgICAgICAgICAgICB7KGJ5dGUpIDB4ODAsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDB9LAorICAgICAgICAgICAgeyhieXRlKSAweEEwLCAweDA4LCAweDAwLCAweDAwLCAweDAwfSwKKyAgICAgICAgICAgIHsoYnl0ZSkgMHg5NCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMH0sCisgICAgICAgICAgICB7MHgwMCwgKGJ5dGUpIDB4MEMsIDB4MDAsIDB4MDAsIDB4MDEsIChieXRlKSAweEFBLCAweDAwfSwKKyAgICAgICAgICAgIHsoYnl0ZSkgMHg4MCwgKGJ5dGUpIDB4MEMsIDB4MDAsIDB4MDAsIDB4MDEsIChieXRlKSAweEFBLCAweDAwfSwKKyAgICAgICAgICAgIHsoYnl0ZSkgMHhBMCwgKGJ5dGUpIDB4MEMsIDB4MDAsIDB4MDAsIDB4MDEsIChieXRlKSAweEFBLCAweDAwfSwKKyAgICAgICAgICAgIHsoYnl0ZSkgMHg5NCwgKGJ5dGUpIDB4MEMsIDB4MDAsIDB4MDAsIDB4MDEsIChieXRlKSAweEFBLCAweDAwfQorICAgIH07CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlW10gQ0hFQ0tfU0VMRUNUX1AyX0FQRFUgPSBuZXcgYnl0ZVtdezB4MDAsIChieXRlKSAweEY0LCAweDAwLCAweDAwfTsKKworICAgIC8qIE9NQVBJIEFQRFUgVGVzdCBjYXNlIDEgYW5kIDMgKi8KKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlW11bXSBTV182Mnh4X05PX0RBVEFfQVBEVSA9CisgICAgICAgICAgICBuZXcgYnl0ZVtdW117ezB4MDAsIChieXRlKSAweEYzLCAweDAwLCAweDA2fSwKKyAgICAgICAgICAgICAgICAgICAgezB4MDAsIChieXRlKSAweEYzLCAweDAwLCAweDBBLCAweDAxLCAoYnl0ZSkgMHhBQX0KKyAgICAgICAgICAgIH07CisgICAgLyogT01BUEkgQVBEVSBUZXN0IGNhc2UgMiBhbmQgNCAqLworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGVbXSBTV182Mnh4X0RBVEFfQVBEVSA9IG5ldyBieXRlW117MHgwMCwgKGJ5dGUpIDB4RjMsIDB4MDAsIDB4MDgsIDB4MDB9OworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGVbXSBTV182Mnh4X1ZBTElEQVRFX0RBVEFfQVBEVSA9CisgICAgICAgICAgICBuZXcgYnl0ZVtdezB4MDAsIChieXRlKSAweEYzLCAweDAwLCAweDBDLCAweDAxLCAoYnl0ZSkgMHhBQSwgMHgwMH07CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZVtdW10gU1dfNjJ4eCA9CisgICAgICAgICAgICBuZXcgYnl0ZVtdW117ezB4NjIsIDB4MDB9LCB7MHg2MiwgKGJ5dGUpIDB4ODF9LCB7MHg2MiwgKGJ5dGUpIDB4ODJ9LAorICAgICAgICAgICAgICAgICAgICB7MHg2MiwgKGJ5dGUpIDB4ODN9LAorICAgICAgICAgICAgICAgICAgICB7MHg2MiwgKGJ5dGUpIDB4ODV9LCB7MHg2MiwgKGJ5dGUpIDB4RjF9LCB7MHg2MiwgKGJ5dGUpIDB4RjJ9LAorICAgICAgICAgICAgICAgICAgICB7MHg2MywgKGJ5dGUpIDB4RjF9LAorICAgICAgICAgICAgICAgICAgICB7MHg2MywgKGJ5dGUpIDB4RjJ9LCB7MHg2MywgKGJ5dGUpIDB4QzJ9LCB7MHg2MiwgMHgwMn0sIHsweDYyLCAoYnl0ZSkgMHg4MH0sCisgICAgICAgICAgICAgICAgICAgIHsweDYyLCAoYnl0ZSkgMHg4NH0sIHsweDYyLCAoYnl0ZSkgMHg4Nn0sIHsweDYzLCAweDAwfSwgezB4NjMsIChieXRlKSAweDgxfQorICAgICAgICAgICAgfTsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlW11bXSBTRUdNRU5URURfUkVTUF9BUERVID0gbmV3IGJ5dGVbXVtdeworICAgICAgICAgICAgLy9HZXQgcmVzcG9uc2UgQ2FzZTIgNjFGRis2MVhYIHdpdGggYW5zd2VyIGxlbmd0aCAoUDFQMikgb2YgMHgwODAwLCAyMDQ4IGJ5dGVzCisgICAgICAgICAgICB7MHgwMCwgKGJ5dGUpIDB4QzIsIDB4MDgsIDB4MDAsIDB4MDB9LAorICAgICAgICAgICAgLy9HZXQgcmVzcG9uc2UgQ2FzZTQgNjFGRis2MVhYIHdpdGggYW5zd2VyIGxlbmd0aCAoUDFQMikgb2YgMHgwODAwLCAyMDQ4IGJ5dGVzCisgICAgICAgICAgICB7MHgwMCwgKGJ5dGUpIDB4QzQsIDB4MDgsIDB4MDAsIDB4MDIsIDB4MTIsIDB4MzQsIDB4MDB9LAorICAgICAgICAgICAgLy9HZXQgcmVzcG9uc2UgQ2FzZTIgNjEwMCs2MVhYIHdpdGggYW5zd2VyIGxlbmd0aCAoUDFQMikgb2YgMHgwODAwLCAyMDQ4IGJ5dGVzCisgICAgICAgICAgICB7MHgwMCwgKGJ5dGUpIDB4QzYsIDB4MDgsIDB4MDAsIDB4MDB9LAorICAgICAgICAgICAgLy9HZXQgcmVzcG9uc2UgQ2FzZTQgNjEwMCs2MVhYIHdpdGggYW5zd2VyIGxlbmd0aCAoUDFQMikgb2YgMHgwODAwLCAyMDQ4IGJ5dGVzCisgICAgICAgICAgICB7MHgwMCwgKGJ5dGUpIDB4QzgsIDB4MDgsIDB4MDAsIDB4MDIsIDB4MTIsIDB4MzQsIDB4MDB9LAorICAgICAgICAgICAgLy9UZXN0IGRldmljZSBidWZmZXIgY2FwYWNpdHkgN0ZGRiBkYXRhCisgICAgICAgICAgICB7MHgwMCwgKGJ5dGUpIDB4QzIsIChieXRlKSAweDdGLCAoYnl0ZSkgMHhGRiwgMHgwMH0sCisgICAgICAgICAgICAvL0dldCByZXNwb25zZSA2Q0ZGKzYxWFggd2l0aCBhbnN3ZXIgbGVuZ3RoIChQMVAyKSBvZiAweDA4MDAsIDIwNDggYnl0ZXMKKyAgICAgICAgICAgIHsweDAwLCAoYnl0ZSkgMHhDRiwgMHgwOCwgMHgwMCwgMHgwMH0sCisgICAgICAgICAgICAvL0dldCByZXNwb25zZSB3aXRoIGFub3RoZXIgQ0xBICB3aXRoIGFuc3dlciBsZW5ndGggKFAxUDIpIG9mIDB4MDgwMCwgMjA0OCBieXRlcworICAgICAgICAgICAgeyhieXRlKSAweDk0LCAoYnl0ZSkgMHhDMiwgMHgwOCwgMHgwMCwgMHgwMH0KKyAgICB9OworICAgIHByaXZhdGUgZmluYWwgbG9uZyBTRVJWSUNFX0NPTk5FQ1RJT05fVElNRV9PVVQgPSAzMDAwOworICAgIHByaXZhdGUgU0VTZXJ2aWNlIHNlU2VydmljZTsKKyAgICBwcml2YXRlIE9iamVjdCBzZXJ2aWNlTXV0ZXggPSBuZXcgT2JqZWN0KCk7CisgICAgcHJpdmF0ZSBUaW1lciBjb25uZWN0aW9uVGltZXI7CisgICAgcHJpdmF0ZSBTZXJ2aWNlQ29ubmVjdGlvblRpbWVyVGFzayBtVGltZXJUYXNrID0gbmV3IFNlcnZpY2VDb25uZWN0aW9uVGltZXJUYXNrKCk7CisgICAgcHJpdmF0ZSBib29sZWFuIGNvbm5lY3RlZCA9IGZhbHNlOworICAgIHByaXZhdGUgZmluYWwgT25Db25uZWN0ZWRMaXN0ZW5lciBtTGlzdGVuZXIgPSBuZXcgT25Db25uZWN0ZWRMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbm5lY3RlZCgpIHsKKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChzZXJ2aWNlTXV0ZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlTXV0ZXgubm90aWZ5KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgY2xhc3MgU3luY2hyb25vdXNFeGVjdXRvciBpbXBsZW1lbnRzIEV4ZWN1dG9yIHsKKyAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZShSdW5uYWJsZSByKSB7CisgICAgICAgICAgICByLnJ1bigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHN1cHBvcnRzSGFyZHdhcmUoKSB7CisgICAgICAgIGZpbmFsIFBhY2thZ2VNYW5hZ2VyIHBtID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgIGJvb2xlYW4gbG93UmFtRGV2aWNlID0gUHJvcGVydHlVdGlsLnByb3BlcnR5RXF1YWxzKCJyby5jb25maWcubG93X3JhbSIsICJ0cnVlIik7CisgICAgICAgIHJldHVybiAhbG93UmFtRGV2aWNlIHx8IChsb3dSYW1EZXZpY2UgJiYgcG0uaGFzU3lzdGVtRmVhdHVyZSgiYW5kcm9pZC5oYXJkd2FyZS50eXBlLndhdGNoIikpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRHcmVhdGVyT3JFcXVhbChsb25nIGdyZWF0ZXIsIGxvbmcgbGVzc2VyKSB7CisgICAgICAgIGFzc2VydFRydWUoIiIgKyBncmVhdGVyICsgIiBleHBlY3RlZCB0byBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gIiArIGxlc3NlciwKKyAgICAgICAgICAgICAgICBncmVhdGVyID49IGxlc3Nlcik7CisgICAgfQorCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc3VtZVRydWUoUHJvcGVydHlVdGlsLmdldEZpcnN0QXBpTGV2ZWwoKSA+IEJ1aWxkLlZFUlNJT05fQ09ERVMuT19NUjEpOworICAgICAgICBhc3N1bWVUcnVlKHN1cHBvcnRzSGFyZHdhcmUoKSk7CisgICAgICAgIHNlU2VydmljZSA9IG5ldyBTRVNlcnZpY2UoSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpLCBuZXcgU3luY2hyb25vdXNFeGVjdXRvcigpLCBtTGlzdGVuZXIpOworICAgICAgICBjb25uZWN0aW9uVGltZXIgPSBuZXcgVGltZXIoKTsKKyAgICAgICAgY29ubmVjdGlvblRpbWVyLnNjaGVkdWxlKG1UaW1lclRhc2ssIFNFUlZJQ0VfQ09OTkVDVElPTl9USU1FX09VVCk7CisgICAgfQorCisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHNlU2VydmljZSAhPSBudWxsICYmIHNlU2VydmljZS5pc0Nvbm5lY3RlZCgpKSB7CisgICAgICAgICAgICBzZVNlcnZpY2Uuc2h1dGRvd24oKTsKKyAgICAgICAgICAgIGNvbm5lY3RlZCA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdhaXRGb3JDb25uZWN0aW9uKCkgdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24geworICAgICAgICBzeW5jaHJvbml6ZWQgKHNlcnZpY2VNdXRleCkgeworICAgICAgICAgICAgaWYgKCFjb25uZWN0ZWQpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlTXV0ZXgud2FpdCgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWNvbm5lY3RlZCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUaW1lb3V0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIlNlcnZpY2UgY291bGQgbm90IGJlIGNvbm5lY3RlZCBhZnRlciAiICsgU0VSVklDRV9DT05ORUNUSU9OX1RJTUVfT1VUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtcyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb25UaW1lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29ubmVjdGlvblRpbWVyLmNhbmNlbCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqIFRlc3RzIGdldFJlYWRlcnMgQVBJICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UmVhZGVycygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdhaXRGb3JDb25uZWN0aW9uKCk7CisgICAgICAgICAgICBSZWFkZXJbXSByZWFkZXJzID0gc2VTZXJ2aWNlLmdldFJlYWRlcnMoKTsKKworICAgICAgICAgICAgZm9yIChSZWFkZXIgcmVhZGVyIDogcmVhZGVycykgeworICAgICAgICAgICAgICAgIGFzc2VydFRydWUocmVhZGVyLmlzU2VjdXJlRWxlbWVudFByZXNlbnQoKSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSByZWFkZXIuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIGlmICghKG5hbWUuc3RhcnRzV2l0aChVSUNDX1JFQURFUl9QUkVGSVgpIHx8IG5hbWUuc3RhcnRzV2l0aChFU0VfUkVBREVSX1BSRUZJWCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IG5hbWUuc3RhcnRzV2l0aChTRF9SRUFERVJfUFJFRklYKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZmFpbCgiSW5jb3JyZWN0IFJlYWRlciBuYW1lIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoImdldHNlU2VydmljZSByZXR1cm5lZCBudWxsIiwgcmVhZGVyLmdldFNFU2VydmljZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgRXhjZXB0aW9uICIgKyBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBUZXN0cyBnZXRBVFIgQVBJICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QVRSKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgd2FpdEZvckNvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgIFJlYWRlcltdIHJlYWRlcnMgPSBzZVNlcnZpY2UuZ2V0UmVhZGVycygpOworICAgICAgICAgICAgQXJyYXlMaXN0PFJlYWRlcj4gdWljY1JlYWRlcnMgPSBuZXcgQXJyYXlMaXN0PFJlYWRlcj4oKTsKKyAgICAgICAgICAgIGlmIChyZWFkZXJzICE9IG51bGwgJiYgcmVhZGVycy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWFkZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXJzW2ldLmdldE5hbWUoKS5zdGFydHNXaXRoKFVJQ0NfUkVBREVSX1BSRUZJWCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpY2NSZWFkZXJzLmFkZChyZWFkZXJzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoUmVhZGVyIHJlYWRlciA6IHVpY2NSZWFkZXJzKSB7CisgICAgICAgICAgICAgICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uID0gcmVhZGVyLm9wZW5TZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiQ291bGQgbm90IG9wZW4gc2Vzc2lvbiIsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICBieXRlW10gYXRyID0gc2Vzc2lvbi5nZXRBVFIoKTsKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJBVFIgaXMgTnVsbCIsIGF0cik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBFeGNlcHRpb24gIiArIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIFRlc3RzIE9wZW5CYXNpY0NoYW5uZWwgQVBJIHdoZW4gYWlkIGlzIG51bGwgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPcGVuQmFzaWNDaGFubmVsTnVsbEFpZCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdhaXRGb3JDb25uZWN0aW9uKCk7CisgICAgICAgICAgICBSZWFkZXJbXSByZWFkZXJzID0gc2VTZXJ2aWNlLmdldFJlYWRlcnMoKTsKKworICAgICAgICAgICAgZm9yIChSZWFkZXIgcmVhZGVyIDogcmVhZGVycykgeworICAgICAgICAgICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IHJlYWRlci5vcGVuU2Vzc2lvbigpOworICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIkNvdWxkIG5vdCBvcGVuIHNlc3Npb24iLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBDaGFubmVsIGNoYW5uZWwgPSBzZXNzaW9uLm9wZW5CYXNpY0NoYW5uZWwobnVsbCwgKGJ5dGUpMHgwMCk7CisgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXROYW1lKCkuc3RhcnRzV2l0aChVSUNDX1JFQURFUl9QUkVGSVgpKSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydE51bGwoIkJhc2ljIGNoYW5uZWwgb24gVUlDQyBjYW4gYmUgb3BlbmVkIiwgY2hhbm5lbCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiQmFzaWMgQ2hhbm5lbCBjYW5ub3QgYmUgb3BlbmVkIiwgY2hhbm5lbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjaGFubmVsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbC5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZXNzaW9uLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEV4Y2VwdGlvbiAiICsgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogVGVzdHMgT3BlbkJhc2ljQ2hhbm5lbCBBUEkgd2hlbiBhaWQgaXMgcHJvdmlkZWQgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPcGVuQmFzaWNDaGFubmVsTm9uTnVsbEFpZCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdhaXRGb3JDb25uZWN0aW9uKCk7CisgICAgICAgICAgICBSZWFkZXJbXSByZWFkZXJzID0gc2VTZXJ2aWNlLmdldFJlYWRlcnMoKTsKKworICAgICAgICAgICAgZm9yIChSZWFkZXIgcmVhZGVyIDogcmVhZGVycykgeworICAgICAgICAgICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IHJlYWRlci5vcGVuU2Vzc2lvbigpOworICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIkNvdWxkIG5vdCBvcGVuIHNlc3Npb24iLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBDaGFubmVsIGNoYW5uZWwgPSBzZXNzaW9uLm9wZW5CYXNpY0NoYW5uZWwoU0VMRUNUQUJMRV9BSUQsIChieXRlKTB4MDApOworICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoVUlDQ19SRUFERVJfUFJFRklYKSkgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnROdWxsKCJCYXNpYyBjaGFubmVsIG9uIFVJQ0MgY2FuIGJlIG9wZW5lZCIsIGNoYW5uZWwpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIkJhc2ljIENoYW5uZWwgY2Fubm90IGJlIG9wZW5lZCIsIGNoYW5uZWwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY2hhbm5lbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2Vzc2lvbi5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBFeGNlcHRpb24gIiArIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIFRlc3RzIFNlbGVjdCBBUEkgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZWxlY3RhYmxlQWlkKCkgeworICAgICAgICB0ZXN0U2VsZWN0YWJsZUFpZChTRUxFQ1RBQkxFX0FJRCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9uZ1NlbGVjdFJlc3BvbnNlKCkgeworICAgICAgICBieXRlW10gc2VsZWN0UmVzcG9uc2UgPSB0ZXN0U2VsZWN0YWJsZUFpZChMT05HX1NFTEVDVF9SRVNQT05TRV9BSUQpOworICAgICAgICBpZiAoc2VsZWN0UmVzcG9uc2UgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoIlNlbGVjdCBSZXNwb25zZSBpcyBub3QgY29tcGxldGUiLCB2ZXJpZnlCZXJUbHZEYXRhKHNlbGVjdFJlc3BvbnNlKSk7CisgICAgfQorCisKKyAgICBwcml2YXRlIGJ5dGVbXSB0ZXN0U2VsZWN0YWJsZUFpZChieXRlW10gYWlkKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3YWl0Rm9yQ29ubmVjdGlvbigpOworICAgICAgICAgICAgUmVhZGVyW10gcmVhZGVycyA9IHNlU2VydmljZS5nZXRSZWFkZXJzKCk7CisKKyAgICAgICAgICAgIGZvciAoUmVhZGVyIHJlYWRlciA6IHJlYWRlcnMpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHJlYWRlci5pc1NlY3VyZUVsZW1lbnRQcmVzZW50KCkpOworICAgICAgICAgICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IHJlYWRlci5vcGVuU2Vzc2lvbigpOworICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIk51bGwgU2Vzc2lvbiIsIHNlc3Npb24pOworICAgICAgICAgICAgICAgIENoYW5uZWwgY2hhbm5lbCA9IHNlc3Npb24ub3BlbkxvZ2ljYWxDaGFubmVsKGFpZCwgKGJ5dGUpMHgwMCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiTnVsbCBDaGFubmVsIiwgY2hhbm5lbCk7CisgICAgICAgICAgICAgICAgYnl0ZVtdIHNlbGVjdFJlc3BvbnNlID0gY2hhbm5lbC5nZXRTZWxlY3RSZXNwb25zZSgpOworICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIk51bGwgU2VsZWN0IFJlc3BvbnNlIiwgc2VsZWN0UmVzcG9uc2UpOworICAgICAgICAgICAgICAgIGFzc2VydEdyZWF0ZXJPckVxdWFsKHNlbGVjdFJlc3BvbnNlLmxlbmd0aCwgMik7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNlbGVjdFJlc3BvbnNlW3NlbGVjdFJlc3BvbnNlLmxlbmd0aCAtIDFdICYgMHhGRiwgMHgwMCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNlbGVjdFJlc3BvbnNlW3NlbGVjdFJlc3BvbnNlLmxlbmd0aCAtIDJdICYgMHhGRiwgMHg5MCk7CisgICAgICAgICAgICAgICAgY2hhbm5lbC5jbG9zZSgpOworICAgICAgICAgICAgICAgIHNlc3Npb24uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0UmVzcG9uc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEV4Y2VwdGlvbiAiICsgZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqIFRlc3RzIGlmIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gaW4gU2VsZWN0ICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V3JvbmdBaWQoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3YWl0Rm9yQ29ubmVjdGlvbigpOworICAgICAgICAgICAgUmVhZGVyW10gcmVhZGVycyA9IHNlU2VydmljZS5nZXRSZWFkZXJzKCk7CisgICAgICAgICAgICBmb3IgKFJlYWRlciByZWFkZXIgOiByZWFkZXJzKSB7CisgICAgICAgICAgICAgICAgdGVzdE5vblNlbGVjdGFibGVBaWQocmVhZGVyLCBOT05fU0VMRUNUQUJMRV9BSUQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChUaW1lb3V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoInVuZXhwZWN0ZWQgZXhjZXB0aW9uICIgKyBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0Tm9uU2VsZWN0YWJsZUFpZChSZWFkZXIgcmVhZGVyLCBieXRlW10gYWlkKSB7CisgICAgICAgIGJvb2xlYW4gZXhjZXB0aW9uID0gZmFsc2U7CisgICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHJlYWRlci5pc1NlY3VyZUVsZW1lbnRQcmVzZW50KCkpOworICAgICAgICAgICAgc2Vzc2lvbiA9IHJlYWRlci5vcGVuU2Vzc2lvbigpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgibnVsbCBzZXNzaW9uIiwgc2Vzc2lvbik7CisgICAgICAgICAgICBDaGFubmVsIGNoYW5uZWwgPSBzZXNzaW9uLm9wZW5Mb2dpY2FsQ2hhbm5lbChhaWQsIChieXRlKTB4MDApOworICAgICAgICB9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGV4Y2VwdGlvbiA9IHRydWU7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgidW5leHBlY3RlZCBleGNlcHRpb24gIiArIGUpOworICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoZXhjZXB0aW9uKTsKKyAgICB9CisKKyAgICAvKiogVGVzdHMgaWYgU2VjdXJpdHkgRXhjZXB0aW9uIGluIFRyYW5zbWl0ICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VjdXJpdHlFeGNlcHRpb25JblRyYW5zbWl0KCkgeworICAgICAgICBib29sZWFuIGV4Y2VwdGlvbiA9IGZhbHNlOworICAgICAgICBTZXNzaW9uIHNlc3Npb247CisgICAgICAgIENoYW5uZWwgY2hhbm5lbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdhaXRGb3JDb25uZWN0aW9uKCk7CisgICAgICAgICAgICBSZWFkZXJbXSByZWFkZXJzID0gc2VTZXJ2aWNlLmdldFJlYWRlcnMoKTsKKworICAgICAgICAgICAgZm9yIChSZWFkZXIgcmVhZGVyIDogcmVhZGVycykgeworICAgICAgICAgICAgICAgIGFzc2VydFRydWUocmVhZGVyLmlzU2VjdXJlRWxlbWVudFByZXNlbnQoKSk7CisgICAgICAgICAgICAgICAgc2Vzc2lvbiA9IHJlYWRlci5vcGVuU2Vzc2lvbigpOworICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIm51bGwgc2Vzc2lvbiIsIHNlc3Npb24pOworICAgICAgICAgICAgICAgIGNoYW5uZWwgPSBzZXNzaW9uLm9wZW5Mb2dpY2FsQ2hhbm5lbChTRUxFQ1RBQkxFX0FJRCwgKGJ5dGUpMHgwMCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiTnVsbCBDaGFubmVsIiwgY2hhbm5lbCk7CisgICAgICAgICAgICAgICAgYnl0ZVtdIHNlbGVjdFJlc3BvbnNlID0gY2hhbm5lbC5nZXRTZWxlY3RSZXNwb25zZSgpOworICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIk51bGwgU2VsZWN0IFJlc3BvbnNlIiwgc2VsZWN0UmVzcG9uc2UpOworICAgICAgICAgICAgICAgIGFzc2VydEdyZWF0ZXJPckVxdWFsKHNlbGVjdFJlc3BvbnNlLmxlbmd0aCwgMik7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNlbGVjdFJlc3BvbnNlW3NlbGVjdFJlc3BvbnNlLmxlbmd0aCAtIDFdICYgMHhGRiwgMHgwMCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNlbGVjdFJlc3BvbnNlW3NlbGVjdFJlc3BvbnNlLmxlbmd0aCAtIDJdICYgMHhGRiwgMHg5MCk7CisgICAgICAgICAgICAgICAgZm9yIChieXRlW10gY21kIDogSUxMRUdBTF9DT01NQU5EU19UUkFOU01JVCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gcmVzcG9uc2UgPSBjaGFubmVsLnRyYW5zbWl0KGNtZCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGNlcHRpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjaGFubmVsLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgidW5leHBlY3RlZCBleGNlcHRpb24gIiArIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBieXRlW10gaW50ZXJuYWxUcmFuc21pdEFwZHUoUmVhZGVyIHJlYWRlciwgYnl0ZVtdIGFwZHUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydFRydWUocmVhZGVyLmlzU2VjdXJlRWxlbWVudFByZXNlbnQoKSk7CisgICAgICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSByZWFkZXIub3BlblNlc3Npb24oKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIm51bGwgc2Vzc2lvbiIsIHNlc3Npb24pOworICAgICAgICAgICAgQ2hhbm5lbCBjaGFubmVsID0gc2Vzc2lvbi5vcGVuTG9naWNhbENoYW5uZWwoU0VMRUNUQUJMRV9BSUQsIChieXRlKTB4MDApOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiTnVsbCBDaGFubmVsIiwgY2hhbm5lbCk7CisgICAgICAgICAgICBieXRlW10gc2VsZWN0UmVzcG9uc2UgPSBjaGFubmVsLmdldFNlbGVjdFJlc3BvbnNlKCk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJOdWxsIFNlbGVjdCBSZXNwb25zZSIsIHNlbGVjdFJlc3BvbnNlKTsKKyAgICAgICAgICAgIGFzc2VydEdyZWF0ZXJPckVxdWFsKHNlbGVjdFJlc3BvbnNlLmxlbmd0aCwgMik7CisgICAgICAgICAgICBieXRlW10gdHJhbnNtaXRSZXNwb25zZSA9IGNoYW5uZWwudHJhbnNtaXQoYXBkdSk7CisgICAgICAgICAgICBjaGFubmVsLmNsb3NlKCk7CisgICAgICAgICAgICBzZXNzaW9uLmNsb3NlKCk7CisgICAgICAgICAgICByZXR1cm4gdHJhbnNtaXRSZXNwb25zZTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoInVuZXhwZWN0ZWQgZXhjZXB0aW9uICIgKyBlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBUcmFuc21pdCBBUEkgZm9yIGFsbCByZWFkZXJzLgorICAgICAqCisgICAgICogQ2hlY2tzIHRoZSByZXR1cm4gc3RhdHVzIGFuZCB2ZXJpZmllcyB0aGUgc2l6ZSBvZiB0aGUKKyAgICAgKiByZXNwb25zZS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUcmFuc21pdEFwZHUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3YWl0Rm9yQ29ubmVjdGlvbigpOworICAgICAgICAgICAgUmVhZGVyW10gcmVhZGVycyA9IHNlU2VydmljZS5nZXRSZWFkZXJzKCk7CisKKyAgICAgICAgICAgIGZvciAoUmVhZGVyIHJlYWRlciA6IHJlYWRlcnMpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGJ5dGVbXSBhcGR1IDogTk9fREFUQV9BUERVKSB7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSByZXNwb25zZSA9IGludGVybmFsVHJhbnNtaXRBcGR1KHJlYWRlciwgYXBkdSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXNwb25zZS5sZW5ndGgsIDIpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzcG9uc2VbcmVzcG9uc2UubGVuZ3RoIC0gMV0gJiAweEZGLCAweDAwKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3BvbnNlW3Jlc3BvbnNlLmxlbmd0aCAtIDJdICYgMHhGRiwgMHg5MCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChieXRlW10gYXBkdSA6IERBVEFfQVBEVSkgeworICAgICAgICAgICAgICAgICAgICBieXRlW10gcmVzcG9uc2UgPSBpbnRlcm5hbFRyYW5zbWl0QXBkdShyZWFkZXIsIGFwZHUpOworICAgICAgICAgICAgICAgICAgICAvKiAyNTYgYnl0ZSBkYXRhIGFuZCAyIGJ5dGVzIG9mIHN0YXR1cyB3b3JkICovCisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXNwb25zZS5sZW5ndGgsIDI1OCk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXNwb25zZVtyZXNwb25zZS5sZW5ndGggLSAxXSAmIDB4RkYsIDB4MDApOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzcG9uc2VbcmVzcG9uc2UubGVuZ3RoIC0gMl0gJiAweEZGLCAweDkwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJ1bmV4cGVjdGVkIGV4Y2VwdGlvbiAiICsgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBpZiB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9ucyByZXR1cm5zIHRoZSBjb3JyZWN0IFN0YXR1cyBXb3JkCisgICAgICoKKyAgICAgKiBUTyB2ZXJpZnkgdGhhdCA6CisgICAgICogLSB0aGUgZGV2aWNlIGRvZXMgbm90IG1vZGlmeSB0aGUgQVBEVSBzZW50IHRvIHRoZSBTZWN1cmUgRWxlbWVudAorICAgICAqIC0gdGhlIHdhcm5pbmcgY29kZSBpcyBwcm9wZXJseSByZWNlaXZlZCBieSB0aGUgYXBwbGljYXRpb24gbGF5ZXIgYXMgU1cgYW5zd2VyCisgICAgICogLSB0aGUgdmVyaWZ5IHRoYXQgdGhlIGFwcGxpY2F0aW9uIGxheWVyIGNhbiBmZXRjaCB0aGUgYWRkaXRpb25uYWwgZGF0YSAod2hlbiBwcmVzZW50KQorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0YXR1c1dvcmRUcmFuc21pdCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdhaXRGb3JDb25uZWN0aW9uKCk7CisgICAgICAgICAgICBSZWFkZXJbXSByZWFkZXJzID0gc2VTZXJ2aWNlLmdldFJlYWRlcnMoKTsKKworICAgICAgICAgICAgZm9yIChSZWFkZXIgcmVhZGVyIDogcmVhZGVycykgeworICAgICAgICAgICAgICAgIGZvciAoYnl0ZVtdIGFwZHUgOiBTV182Mnh4X05PX0RBVEFfQVBEVSkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGJ5dGUgaSA9IDB4MDA7IGkgPCBTV182Mnh4Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGR1WzJdID0gKGJ5dGUpKGkrMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gcmVzcG9uc2UgPSBpbnRlcm5hbFRyYW5zbWl0QXBkdShyZWFkZXIsIGFwZHUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIFNXID0gU1dfNjJ4eFtpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXNwb25zZVtyZXNwb25zZS5sZW5ndGggLSAxXSwgU1dbMV0pOworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3BvbnNlW3Jlc3BvbnNlLmxlbmd0aCAtIDJdLCBTV1swXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGJ5dGUgaSA9IDB4MDA7IGkgPCBTV182Mnh4Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBhcGR1ID0gU1dfNjJ4eF9EQVRBX0FQRFU7CisgICAgICAgICAgICAgICAgICAgIGFwZHVbMl0gPSAoYnl0ZSkoaSsxKTsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIHJlc3BvbnNlID0gaW50ZXJuYWxUcmFuc21pdEFwZHUocmVhZGVyLCBhcGR1KTsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIFNXID0gU1dfNjJ4eFtpXTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0R3JlYXRlck9yRXF1YWwocmVzcG9uc2UubGVuZ3RoLCAzKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3BvbnNlW3Jlc3BvbnNlLmxlbmd0aCAtIDFdLCBTV1sxXSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXNwb25zZVtyZXNwb25zZS5sZW5ndGggLSAyXSwgU1dbMF0pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoYnl0ZSBpID0gMHgwMDsgaSA8IFNXXzYyeHgubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGFwZHUgPSBTV182Mnh4X1ZBTElEQVRFX0RBVEFfQVBEVTsKKyAgICAgICAgICAgICAgICAgICAgYXBkdVsyXSA9IChieXRlKShpKzEpOworICAgICAgICAgICAgICAgICAgICBieXRlW10gcmVzcG9uc2UgPSBpbnRlcm5hbFRyYW5zbWl0QXBkdShyZWFkZXIsIGFwZHUpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRHcmVhdGVyT3JFcXVhbChyZXNwb25zZS5sZW5ndGgsIGFwZHUubGVuZ3RoICsgMik7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSByZXNwb25zZVN1YnN0cmluZyA9IEFycmF5cy5jb3B5T2ZSYW5nZShyZXNwb25zZSwgMCwgYXBkdS5sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICBhcGR1WzBdID0gMHgwMTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHJlc3BvbnNlU3Vic3RyaW5nLCBhcGR1KSk7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBTVyA9IFNXXzYyeHhbaV07CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXNwb25zZVtyZXNwb25zZS5sZW5ndGggLSAxXSwgU1dbMV0pOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzcG9uc2VbcmVzcG9uc2UubGVuZ3RoIC0gMl0sIFNXWzBdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJ1bmV4cGVjdGVkIGV4Y2VwdGlvbiAiICsgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogVGVzdCBpZiB0aGUgcmVzcG9uc2VzIGFyZSBzZWdtZW50ZWQgYnkgdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZWdtZW50ZWRSZXNwb25zZVRyYW5zbWl0KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgd2FpdEZvckNvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgIFJlYWRlcltdIHJlYWRlcnMgPSBzZVNlcnZpY2UuZ2V0UmVhZGVycygpOworCisgICAgICAgICAgICBmb3IgKFJlYWRlciByZWFkZXIgOiByZWFkZXJzKSB7CisgICAgICAgICAgICAgICAgZm9yIChieXRlW10gYXBkdSA6IFNFR01FTlRFRF9SRVNQX0FQRFUpIHsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIHJlc3BvbnNlID0gaW50ZXJuYWxUcmFuc21pdEFwZHUocmVhZGVyLCBhcGR1KTsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGIgPSB7IDB4MDAsIDB4MDAsIGFwZHVbMl0sIGFwZHVbM10gfTsKKyAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciB3cmFwcGVkID0gQnl0ZUJ1ZmZlci53cmFwKGIpOworICAgICAgICAgICAgICAgICAgICBpbnQgZXhwZWN0ZWRMZW5ndGggPSB3cmFwcGVkLmdldEludCgpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzcG9uc2UubGVuZ3RoLCBleHBlY3RlZExlbmd0aCArIDIpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzcG9uc2VbcmVzcG9uc2UubGVuZ3RoIC0gMV0gJiAweEZGLCAweDAwKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3BvbnNlW3Jlc3BvbnNlLmxlbmd0aCAtIDJdICYgMHhGRiwgMHg5MCk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXNwb25zZVtyZXNwb25zZS5sZW5ndGggLSAzXSAmIDB4RkYsIDB4RkYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoInVuZXhwZWN0ZWQgZXhjZXB0aW9uICIgKyBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBUZXN0IHRoZSBQMiB2YWx1ZSBvZiB0aGUgc2VsZWN0IGNvbW1hbmQgc2VudCBieSB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFAyVmFsdWUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3YWl0Rm9yQ29ubmVjdGlvbigpOworICAgICAgICAgICAgUmVhZGVyW10gcmVhZGVycyA9IHNlU2VydmljZS5nZXRSZWFkZXJzKCk7CisKKyAgICAgICAgICAgIGZvciAoUmVhZGVyIHJlYWRlciA6IHJlYWRlcnMpIHsKKyAgICAgICAgICAgICAgICBieXRlW10gcmVzcG9uc2UgPSBpbnRlcm5hbFRyYW5zbWl0QXBkdShyZWFkZXIsIENIRUNLX1NFTEVDVF9QMl9BUERVKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRHcmVhdGVyT3JFcXVhbChyZXNwb25zZS5sZW5ndGgsIDMpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXNwb25zZVtyZXNwb25zZS5sZW5ndGggLSAxXSAmIDB4RkYsIDB4MDApOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXNwb25zZVtyZXNwb25zZS5sZW5ndGggLSAyXSAmIDB4RkYsIDB4OTApOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXNwb25zZVtyZXNwb25zZS5sZW5ndGggLSAzXSAmIDB4RkYsIDB4MDApOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgIGZhaWwoInVuZXhwZWN0ZWQgZXhjZXB0aW9uICIgKyBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFZlcmlmaWVzIFRMViBkYXRhCisgICAgICogQHBhcmFtIHRsdgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZGF0YSBpcyB0bHYgZm9ybWF0dGVkLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHZlcmlmeUJlclRsdkRhdGEoYnl0ZVtdIHRsdil7CisgICAgICAgIGlmICh0bHYgPT0gbnVsbCB8fCB0bHYubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnZhbGlkIHRsdiwgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgaWYgKCh0bHZbaSsrXSAmIDB4MUYpID09IDB4MUYpIHsKKyAgICAgICAgICAgIC8vIGV4dHJhIGJ5dGUgZm9yIFRBRyBmaWVsZAorICAgICAgICAgICAgaSsrOworICAgICAgICB9CisKKyAgICAgICAgaW50IGxlbiA9IHRsdltpKytdICYgMHhGRjsKKyAgICAgICAgaWYgKGxlbiA+IDEyNykgeworICAgICAgICAgICAgLy8gbW9yZSB0aGFuIDEgYnl0ZSBmb3IgbGVuZ3RoCisgICAgICAgICAgICBpbnQgYnl0ZXNMZW5ndGggPSBsZW4tMTI4OworICAgICAgICAgICAgbGVuID0gMDsKKyAgICAgICAgICAgIGZvcihpbnQgaiA9IGJ5dGVzTGVuZ3RoOyBqID4gMDsgai0tKSB7CisgICAgICAgICAgICAgICAgbGVuICs9IChsZW4gPDwgOCkgKyAodGx2W2krK10gJiAweEZGKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBBZGRpdGlvbmFsIDIgYnl0ZXMgZm9yIHRoZSBTVworICAgICAgICByZXR1cm4gKHRsdi5sZW5ndGggPT0gKGkrbGVuKzIpKTsKKyAgICB9CisKKyAgICBjbGFzcyBTZXJ2aWNlQ29ubmVjdGlvblRpbWVyVGFzayBleHRlbmRzIFRpbWVyVGFzayB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNlcnZpY2VNdXRleCkgeworICAgICAgICAgICAgICAgIHNlcnZpY2VNdXRleC5ub3RpZnlBbGwoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L0FuZHJvaWQubWsgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9BbmRyb2lkLm1rCmluZGV4IDUzN2E5ODcuLjNkNDQ5OGQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L0FuZHJvaWQubWsKKysrIGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvQW5kcm9pZC5tawpAQCAtMjIsMTcgKzIyLDIwIEBACiBMT0NBTF9NVUxUSUxJQiA6PSBib3RoCiAKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCi0gICAgYW5kcm9pZC1zdXBwb3J0LXRlc3QgXAorICAgIGFuZHJvaWR4LnRlc3QucnVsZXMgXAogICAgIGFuZHJvaWQtY29tbW9uIFwKICAgICBjdHN0ZXN0c2VydmVyIFwKLSAgICBjdHN0ZXN0cnVubmVyIFwKLSAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsIFwKKyAgICBjdHN0ZXN0cnVubmVyLWF4dCBcCisgICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgXAogICAgIGNvbXBhdGliaWxpdHktY29tbW9uLXV0aWwtZGV2aWNlc2lkZWxpYiBcCiAgICAgZ3VhdmEgXAotICAgIHBsYXRmb3JtLXRlc3QtYW5ub3RhdGlvbnMgXAotICAgIGxlZ2FjeS1hbmRyb2lkLXRlc3QKKyAgICBwbGF0Zm9ybS10ZXN0LWFubm90YXRpb25zCiAKLUxPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIgb3JnLmFwYWNoZS5odHRwLmxlZ2FjeQorTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gXAorICAgIGFuZHJvaWQudGVzdC5ydW5uZXIuc3R1YnMgXAorICAgIG9yZy5hcGFjaGUuaHR0cC5sZWdhY3kgXAorICAgIGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzIFwKKwogCiBMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdHNzZWN1cml0eV9qbmkgbGliY3RzX2puaSBsaWJuYXRpdmVoZWxwZXJfY29tcGF0X2xpYmMrKyBcCiAgICAgICAgICAgICAgICAgICAgICAgbGlibmF0aXZlaGVscGVyIFwKQEAgLTUwLDkgKzUzLDEwIEBACiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzU2VjdXJpdHlUZXN0Q2FzZXMKIAogI0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKK0xPQ0FMX1BSSVZBVEVfUExBVEZPUk1fQVBJUyA6PSB0cnVlCiAKICMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cyBzdHMKIAogaW5jbHVkZSAkKEJVSUxEX0NUU19QQUNLQUdFKQogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zZWN1cml0eS9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCAyMWU4Yjg1Li43MTAzOTY5IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9zZWN1cml0eS9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTI3LDcgKzI3LDcgQEAKICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlJFQ09SRF9BVURJTyIgLz4KICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0VYVEVSTkFMX1NUT1JBR0UiIC8+CiAKLSAgICA8YXBwbGljYXRpb24+CisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6dXNlc0NsZWFydGV4dFRyYWZmaWM9InRydWUiPgogICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KICAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9Im9yZy5hcGFjaGUuaHR0cC5sZWdhY3kiIGFuZHJvaWQ6cmVxdWlyZWQ9ImZhbHNlIiAvPgogCkBAIC01Miw3ICs1Miw3IEBACiAgICAgICAgIDwvYWN0aXZpdHk+CiAgICAgPC9hcHBsaWNhdGlvbj4KIAotICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuc2VjdXJpdHkuY3RzIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIG9mIGFuZHJvaWQuc2VjdXJpdHkuY3RzIj4KICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9Imxpc3RlbmVyIgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvQW5kcm9pZFRlc3QueG1sIGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvQW5kcm9pZFRlc3QueG1sCmluZGV4IDI0ZGY1NjQuLjNhODc5ZDEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L0FuZHJvaWRUZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBzZWN1cml0eSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0ic2VjdXJpdHkiIC8+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CiAgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KQEAgLTIyLDggKzIzLDkgQEAKICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50YXJnZXRwcmVwLkNyYXNoUmVwb3J0ZXIiIC8+CiAgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkFuZHJvaWRKVW5pdFRlc3QiID4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJwYWNrYWdlIiB2YWx1ZT0iYW5kcm9pZC5zZWN1cml0eS5jdHMiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0icnVudGltZS1oaW50IiB2YWx1ZT0iM20xNXMiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVudGltZS1oaW50IiB2YWx1ZT0iMWg4bTE1cyIgLz4KICAgICAgICAgPCEtLSB0ZXN0LXRpbWVvdXQgdW5pdCBpcyBtcywgdmFsdWUgPSAxNSBtaW4gLS0+CiAgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC10aW1lb3V0IiB2YWx1ZT0iOTAwMDAwIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImhpZGRlbi1hcGktY2hlY2tzIiB2YWx1ZT0iZmFsc2UiIC8+CiAgICAgPC90ZXN0PgogPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvYWlkbC9hbmRyb2lkL3NlY3VyaXR5L2N0cy9JSXNvbGF0ZWRTZXJ2aWNlLmFpZGwgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9haWRsL2FuZHJvaWQvc2VjdXJpdHkvY3RzL0lJc29sYXRlZFNlcnZpY2UuYWlkbAppbmRleCAxNmRiMGZlLi45YzFhMzM5IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9zZWN1cml0eS9haWRsL2FuZHJvaWQvc2VjdXJpdHkvY3RzL0lJc29sYXRlZFNlcnZpY2UuYWlkbAorKysgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9haWRsL2FuZHJvaWQvc2VjdXJpdHkvY3RzL0lJc29sYXRlZFNlcnZpY2UuYWlkbApAQCAtMTksNCArMTksNSBAQAogaW50ZXJmYWNlIElJc29sYXRlZFNlcnZpY2UgewogICAgIFN0cmluZ1tdIGdldENhY2hlZFN5c3RlbVNlcnZpY2VzKCk7CiAgICAgSUJpbmRlciBnZXRTeXN0ZW1TZXJ2aWNlKFN0cmluZyBzZXJ2aWNlTmFtZSk7CisgICAgYm9vbGVhbiBnZXRQcm9jZXNzSXNJc29sYXRlZCgpOwogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvam5pL0FuZHJvaWQubWsgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9qbmkvQW5kcm9pZC5tawppbmRleCBmYzZmNTE1Li4zNjNlZDQ3IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9zZWN1cml0eS9qbmkvQW5kcm9pZC5taworKysgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9qbmkvQW5kcm9pZC5tawpAQCAtMzksMTIgKzM5LDEyIEBACiAJCWxpYnNlbGludXggXAogCQlsaWJjKysgXAogCQlsaWJwY3JlMiBcCi0JCWxpYnBhY2thZ2VsaXN0cGFyc2VyIFwKLQorCQlsaWJwYWNrYWdlbGlzdHBhcnNlcgogCiBMT0NBTF9DX0lOQ0xVREVTICs9IG5kay9zb3VyY2VzL2NwdWZlYXR1cmVzCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IGNwdWZlYXR1cmVzCiAKLUxPQ0FMX0NGTEFHUyA6PSAtV25vLXVudXNlZC1wYXJhbWV0ZXIKK0xPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yIC1Xbm8tdW51c2VkLXBhcmFtZXRlcgorTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tc2lnbi1jb21wYXJlIC1Xbm8tdW51c2VkLWxhYmVsIC1Xbm8tdW51c2VkLXZhcmlhYmxlCiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L2puaS9hbmRyb2lkX3NlY3VyaXR5X2N0c19FbmNyeXB0aW9uVGVzdC5jcHAgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9qbmkvYW5kcm9pZF9zZWN1cml0eV9jdHNfRW5jcnlwdGlvblRlc3QuY3BwCmluZGV4IDEzNmI1MmIuLjQ3Zjc2MGEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L2puaS9hbmRyb2lkX3NlY3VyaXR5X2N0c19FbmNyeXB0aW9uVGVzdC5jcHAKKysrIGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvam5pL2FuZHJvaWRfc2VjdXJpdHlfY3RzX0VuY3J5cHRpb25UZXN0LmNwcApAQCAtMTgsNyArMTgsNyBAQAogI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGpuaS5oPgotI2luY2x1ZGUgPEpOSUhlbHAuaD4KKyNpbmNsdWRlIDxuYXRpdmVoZWxwZXIvSk5JSGVscC5oPgogI2luY2x1ZGUgPG9wZW5zc2wvYWVzLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9jcHUuaD4KICNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvam5pL2FuZHJvaWRfc2VjdXJpdHlfY3RzX1NFTGludXhUZXN0LmNwcCBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L2puaS9hbmRyb2lkX3NlY3VyaXR5X2N0c19TRUxpbnV4VGVzdC5jcHAKaW5kZXggMWNmZGUwYS4uYzc5NzVlYyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvam5pL2FuZHJvaWRfc2VjdXJpdHlfY3RzX1NFTGludXhUZXN0LmNwcAorKysgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9qbmkvYW5kcm9pZF9zZWN1cml0eV9jdHNfU0VMaW51eFRlc3QuY3BwCkBAIC0xNSwxMCArMTUsMTAgQEAKICAqLwogCiAjaW5jbHVkZSA8am5pLmg+CisjaW5jbHVkZSA8bmF0aXZlaGVscGVyL0pOSUhlbHAuaD4KKyNpbmNsdWRlIDxuYXRpdmVoZWxwZXIvU2NvcGVkTG9jYWxSZWYuaD4KKyNpbmNsdWRlIDxuYXRpdmVoZWxwZXIvU2NvcGVkVXRmQ2hhcnMuaD4KICNpbmNsdWRlIDxzZWxpbnV4L3NlbGludXguaD4KLSNpbmNsdWRlIDxKTklIZWxwLmg+Ci0jaW5jbHVkZSA8U2NvcGVkTG9jYWxSZWYuaD4KLSNpbmNsdWRlIDxTY29wZWRVdGZDaGFycy5oPgogCiAjaW5jbHVkZSA8bWVtb3J5PgogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2J1Z18yMzI3MDcyNF8xLm1wNCBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzIzMjcwNzI0XzEubXA0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2E5YjJlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzIzMjcwNzI0XzEubXA0CisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMjMyNzA3MjRfMi5tcDQgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2J1Z18yMzI3MDcyNF8yLm1wNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNkZmNkMi4uMDAwMDAwMAotLS0gYS90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2J1Z18yMzI3MDcyNF8yLm1wNAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzIzNDUyNzkyLndlYm0gYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2J1Z18yMzQ1Mjc5Mi53ZWJtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNzBmYzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2J1Z18yMzQ1Mjc5Mi53ZWJtCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzI0MTU3NTI0Lm1wNCBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzI0MTU3NTI0Lm1wNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmRhNzc0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMjQxNTc1MjQubXA0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzI4ODE2OTU2X2ZyYW1lbGVuLm1wNCBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzI4ODE2OTU2X2ZyYW1lbGVuLm1wNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2QwNWU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMjg4MTY5NTZfZnJhbWVsZW4ubXA0CkBAIC0wLDAgKzEsMTA0IEBACisyOAorNTAKKzExCis5NzMKKzI4Cis1MAorMTEKKzk3MworOTUKKzkyCis5MworNjIKKzUyCisyMgorMjkKKzE5CiszOQorMTkKKzIwCisyNAorMjEKKzE4CisxOQorMzEKKzE3CisxNworMjcKKzIwCisxOAorMTcKKzU3CiszMQorMzIKKzMwCisxMDcKKzU3Cis1NAorNTIKKzY0CisyNgorNzYKKzIxCis1OAorMzkKKzQyCiszMgorMjUKKzUwCiszNworNDMKKzM5Cis3NAorNTYKKzMwCiszMgorNTEKKzg4Cis5MQorNjAKKzUxCis3MgorNjQKKzI0CiszNgorNzYKKzQyCiszNworMjQKKzIzCis0MworMjMKKzIxCisyMAorMzMKKzIwCisyMAorMzYKKzE5CisyMworMjkKKzIyCis1NgorMjAKKzIzCisyNgorNTkKKzIzCisyMworMjcKKzI4CisyMQorMjIKKzIyCisyMQorMjEKKzE2CisyMAorMjAKKzE5CiszMAorMjgKKzE4CisxNgorMTgKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzI4ODE2OTU2X2hldmMubXA0IGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMjg4MTY5NTZfaGV2Yy5tcDQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM1NTZkMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzI4ODE2OTU2X2hldmMubXA0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzMwODIyNzU1Lm1wNCBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzMwODIyNzU1Lm1wNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjFmMzk3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMzA4MjI3NTUubXA0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzMxMDkyNDYyX2F2Yy5tcDQgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2J1Z18zMTA5MjQ2Ml9hdmMubXA0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMzM2Y2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2J1Z18zMTA5MjQ2Ml9hdmMubXA0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzMxMDkyNDYyX2ZyYW1lbGVuLm1wNCBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzMxMDkyNDYyX2ZyYW1lbGVuLm1wNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDE0NjcyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMzEwOTI0NjJfZnJhbWVsZW4ubXA0CkBAIC0wLDAgKzEsMTYgQEAKKzEwMjExCiszMzMyCisxNjM2MworMjI3NQorNjU4MAorNzUzNQorNDA1NQorODM3NgorNjE1MQorNDQ2NAorNDE4NQorMjc4OQorNTA5MAorNjQ5NQorMzk4MgorMTI4OApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMzMyOTgwODlfYXZjLm1wNCBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzMzMjk4MDg5X2F2Yy5tcDQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM2ZjNhZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzMzMjk4MDg5X2F2Yy5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMzMzODc4MjBfYXZjLm1wNCBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzMzMzg3ODIwX2F2Yy5tcDQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ1MTllYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzMzMzg3ODIwX2F2Yy5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMzM2NDE1ODhfYXZjLm1wNCBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzMzNjQxNTg4X2F2Yy5tcDQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkxM2U3OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzMzNjQxNTg4X2F2Yy5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMzM3NTExOTNfYXZjLm1wNCBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzMzNzUxMTkzX2F2Yy5tcDQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYyMWZhYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzMzNzUxMTkzX2F2Yy5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMzM4MTg1MDBfYXZjLm1wNCBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzMzODE4NTAwX2F2Yy5tcDQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZmZGMyZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzMzODE4NTAwX2F2Yy5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMzM4MTg1MDBfZnJhbWVsZW4ubXA0IGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMzM4MTg1MDBfZnJhbWVsZW4ubXA0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NTZkNTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2J1Z18zMzgxODUwMF9mcmFtZWxlbi5tcDQKQEAgLTAsMCArMSwxMCBAQAorMjM5MworNjgxCisyNzYKKzEyNAorMjcwCiswCis4MjEKKzEyNworODEwCisxNTQKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzMzODYyMDIxX2ZyYW1lX2xlbi5tcDQgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2J1Z18zMzg2MjAyMV9mcmFtZV9sZW4ubXA0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMTk2ZGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2J1Z18zMzg2MjAyMV9mcmFtZV9sZW4ubXA0CkBAIC0wLDAgKzEsMiBAQAorMzU3CisxNDU4NApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMzM4NjIwMjFfaGV2Yy5tcDQgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2J1Z18zMzg2MjAyMV9oZXZjLm1wNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWIzYTA5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMzM4NjIwMjFfaGV2Yy5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMzM5MzMxNDBfYXZjLm1wNCBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzMzOTMzMTQwX2F2Yy5tcDQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMwYWI5YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzMzOTMzMTQwX2F2Yy5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMzM5MzMxNDBfZnJhbWVsZW4ubXA0IGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMzM5MzMxNDBfZnJhbWVsZW4ubXA0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMjcyMTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2J1Z18zMzkzMzE0MF9mcmFtZWxlbi5tcDQKQEAgLTAsMCArMSwxNyBAQAorMjA3MjEKKzUzOTcKKzU3MzYKKzcyMzYKKzcxNDUKKzc3MzUKKzgyMjgKKzg1MzcKKzg4MjkKKzkyMDgKKzE5NDIzCis4NDg0Cis4NjA5Cis4Nzc5Cis5ODE3Cis5MzA2CiszNDc3MApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMzQwOTcyMTNfYXZjLm1wNCBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzM0MDk3MjEzX2F2Yy5tcDQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JhNzE0NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzM0MDk3MjEzX2F2Yy5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMzQwOTcyMzFfYXZjLm1wNCBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzM0MDk3MjMxX2F2Yy5tcDQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM1OWUwZDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2J1Z18zNDA5NzIzMV9hdmMubXA0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzM0MDk3ODY2X2F2Yy5tcDQgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2J1Z18zNDA5Nzg2Nl9hdmMubXA0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMGFhZDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2J1Z18zNDA5Nzg2Nl9hdmMubXA0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzM0MDk3ODY2X2ZyYW1lX2xlbi5tcDQgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2J1Z18zNDA5Nzg2Nl9mcmFtZV9sZW4ubXA0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMTA5NGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2J1Z18zNDA5Nzg2Nl9mcmFtZV9sZW4ubXA0CkBAIC0wLDAgKzEsMzQgQEAKKzQ3MzMKKzAKKzIxMworMAorMTEzCiswCis4NQorMjU1MworMjExCisxMzMKKzE1OQorMTQ5Cis5MAorNzUKKzE2NAorMTM5CisxNDM4CiswCis4NgorMzkKKzEwOQorMTA5CisxMzAKKzE0MAorMTE5Cis3NgorMzYzOQorMAorMjYKKzAKKzI1MTUKKzIwNgorMjQ5Cis4MjYKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzM0MDk3OTE1X2F2Yy5tcDQgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2J1Z18zNDA5NzkxNV9hdmMubXA0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZDJkMTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2J1Z18zNDA5NzkxNV9hdmMubXA0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzM0MjMxMTYzX21wZWcyLm1wNCBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzM0MjMxMTYzX21wZWcyLm1wNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWY4YzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMzQyMzExNjNfbXBlZzIubXA0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzM0MjMxMjMxX2ZyYW1lbGVuLm1wNCBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzM0MjMxMjMxX2ZyYW1lbGVuLm1wNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzA4NDgxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMzQyMzEyMzFfZnJhbWVsZW4ubXA0CkBAIC0wLDAgKzEsNSBAQAorMjIKKzU4NQorMzMwCis4OQorMTA3ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMzQyMzEyMzFfbXBlZzIubXA0IGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMzQyMzEyMzFfbXBlZzIubXA0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMmZkYmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2J1Z18zNDIzMTIzMV9tcGVnMi5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMzQ2MTg2MDcubXAzIGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMzQ2MTg2MDcubXAzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ZTViNDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2J1Z18zNDYxODYwNy5tcDMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMzQ4OTY0MzEubXA0IGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMzQ4OTY0MzEubXA0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NGQ2OGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2J1Z18zNDg5NjQzMS5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMzUwMzk5NDZfaGV2Yy5tcDQgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2J1Z18zNTAzOTk0Nl9oZXZjLm1wNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDMwODE0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMzUwMzk5NDZfaGV2Yy5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMzU0NzI5OTcubXA0IGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMzU0NzI5OTcubXA0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZDBjNjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2J1Z18zNTQ3Mjk5Ny5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMzU1ODQ0MjVfYXZjLm1wNCBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzM1NTg0NDI1X2F2Yy5tcDQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlhOGFiYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzM1NTg0NDI1X2F2Yy5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMzU1ODQ0MjVfZnJhbWVsZW4ubXA0IGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMzU1ODQ0MjVfZnJhbWVsZW4ubXA0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlOGE1YWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2J1Z18zNTU4NDQyNV9mcmFtZWxlbi5tcDQKQEAgLTAsMCArMSw5NiBAQAorMjMKKzYwNDUKKzQwODIKKzc3MgorODExCiswCisxNjM0CiswCisxNzc5Cis1MTUKKzg2MworMAorMTY4CiswCisyMTIKKzIzNgorMTA5CiswCiszNworMAorNTk0NAorMAorMTA4MgorMTUyNAorMjQzNgorNDI4CisyMTcKKzQ4NworMzQwCis0MDIKKzE5OQorMjM3CiswCis1NgorMAorNzYxCisyMzY5Cis3MDYKKzIyMQorNjAyCisxMjIKKzMzCisxMDgKKzMyCiswCisyNgorMTAxCisyNDAwCisxMDYzCisxNTEKKzQxMAorNTU0Cis0MDkKKzAKKzE0OAorMAorMTgxCisyMzUKKzE0NgorOTYwCiszNAorMjUyNQorMTM1MgorMzMyCisxNzQKKzMyCiszMAorMAorNjAKKzIzCiszMzg1CisxMzIKKzM0MQorNDU1CisxODUKKzQwOQorMjUyCiswCisxODIKKzE5NgorODUwCisxMTU5Cis2NTgKKzgwNQorMjE2CisxMjgKKzM5NworMAorNzc3Cis3NzUKKzQ0NAorMzg1CisyODQ4CiswCisxNTgzCis2MDAwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMzY0OTI3NDEubXA0IGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMzY0OTI3NDEubXA0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMDcyNGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2J1Z18zNjQ5Mjc0MS5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMzY3MTUyNjgubXA0IGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMzY3MTUyNjgubXA0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3YTM3YzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2J1Z18zNjcxNTI2OC5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMzY3MjU0MDcueG1mIGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMzY3MjU0MDcueG1mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZTkwYjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2J1Z18zNjcyNTQwNy54bWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMzY4MTkyNjJfbXBlZzIubXA0IGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMzY4MTkyNjJfbXBlZzIubXA0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMGQ1OGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2J1Z18zNjgxOTI2Ml9tcGVnMi5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMzY5OTMyOTFfYXZjLm1wNCBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzM2OTkzMjkxX2F2Yy5tcDQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI1ZGJjMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzM2OTkzMjkxX2F2Yy5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMzcwMDgwOTZfYXZjLm1wNCBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzM3MDA4MDk2X2F2Yy5tcDQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEyZThkYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzM3MDA4MDk2X2F2Yy5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMzcyMzczOTYubXA0IGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMzcyMzczOTYubXA0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4N2JmOTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2J1Z18zNzIzNzM5Ni5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMzc2MjcxOTQuYm1wIGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMzc2MjcxOTQuYm1wCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU1MjU3MTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2J1Z18zNzYyNzE5NC5ibXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMzc3MTIxODFfaGV2Yy5tcDQgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2J1Z18zNzcxMjE4MV9oZXZjLm1wNApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yOTc4MmI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMzc3MTIxODFfaGV2Yy5tcDQKQEAgLTAsMCArMSBAQAor3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMzgwMTQ5OTJfYXZjLm1wNCBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzM4MDE0OTkyX2F2Yy5tcDQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE0OWVmMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzM4MDE0OTkyX2F2Yy5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMzgwMTQ5OTJfZnJhbWVsZW4ubXA0IGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfMzgwMTQ5OTJfZnJhbWVsZW4ubXA0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NTJjZDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2J1Z18zODAxNDk5Ml9mcmFtZWxlbi5tcDQKQEAgLTAsMCArMSw2NiBAQAorMjMKKzI4NQorMTQwCiswCisxMzkKKzI3MAorMTIxCiswCisxNzI5Cis2ODIKKzQwMAorMAorMTMyCisyNDEKKzEwMworMTIwCiszNzEKKzUwNTUKKzE0NjMKKzAKKzg5ODAKKzIzNzIKKzU0ODkKKzQxMDkKKzExOTkKKzAKKzE2MjMKKzAKKzExOTQKKzQxMDQKKzIzODkKKzAKKzEwMTAKKzY0MgorMzA0OAorNjMwCisxMzI5CisyNDc2Cis0MjcKKzI0MgorMjUwCiswCisyMTQKKzQxMgorMAorMjg2Cis0MjMKKzEyOQorMjc4CisyNzEKKzAKKzIxOQorMTkwCiszODUKKzAKKzMxNgorMjk4Cis0OTU1CiswCisxNDY0CiswCis2NjcxCis2MDQ5CisyNDkwCis4NjUwCis0NjA4MDAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2J1Z18zODExNTA3Ni5tcDQgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2J1Z18zODExNTA3Ni5tcDQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYzYzM0YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzM4MTE1MDc2Lm1wNApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2J1Z18zODIzOTg2NC5tcDQgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2J1Z18zODIzOTg2NC5tcDQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2ZmYjE3MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzM4MjM5ODY0Lm1wNApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2J1Z18zODQ0ODM4MS5tcDQgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2J1Z18zODQ0ODM4MS5tcDQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODMxY2M3NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzM4NDQ4MzgxLm1wNApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2J1Z18zODQ4NzU2NC5tcDQgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2J1Z18zODQ4NzU2NC5tcDQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDE5ODQ0NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzM4NDg3NTY0Lm1wNApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2J1Z182MzA0NTkxOF9mcmFtZWxlbi5tcDQgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2J1Z182MzA0NTkxOF9mcmFtZWxlbi5tcDQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhjZGEwZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzYzMDQ1OTE4X2ZyYW1lbGVuLm1wNApAQCAtMCwwICsxLDcgQEAKKzE1MAorMTI4CisxMjk4NQorNDU0CiszMjAKKzQ0NworMzkxMwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfNjMwNDU5MThfaGV2Yy5tcDQgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2J1Z182MzA0NTkxOF9oZXZjLm1wNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDM3MjZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfNjMwNDU5MThfaGV2Yy5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfNjMxMjE2NDQubXA0IGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfNjMxMjE2NDQubXA0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJmOTMyYWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2J1Z182MzEyMTY0NC5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfNjQ3ODQ5NzNfZnJhbWVsZW4ubXA0IGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfNjQ3ODQ5NzNfZnJhbWVsZW4ubXA0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNmQ0OGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2J1Z182NDc4NDk3M19mcmFtZWxlbi5tcDQKQEAgLTAsMCArMSwxMyBAQAorMTEwCis1NTAyCisxMzg5MAorMjcwMTEKKzUzMzI1CisyNDYyNQorODIyOQorMjgKKzMyCisxMgorMjUKKzI0MQorMTQ2MQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzY0Nzg0OTczX2hldmMubXA0IGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfNjQ3ODQ5NzNfaGV2Yy5tcDQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFlMWRiNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzY0Nzg0OTczX2hldmMubXA0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzY1MTIzNDcxLm1wNCBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzY1MTIzNDcxLm1wNApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zNDRjMTk2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfNjUxMjM0NzEubXA0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzY1MTg2MjkxX2ZyYW1lbGVuLm1wNCBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzY1MTg2MjkxX2ZyYW1lbGVuLm1wNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWNjYjM4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfNjUxODYyOTFfZnJhbWVsZW4ubXA0CkBAIC0wLDAgKzEsMiBAQAorMTEzCisxMDkKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzY1MTg2MjkxX2hldmMubXA0IGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfNjUxODYyOTFfaGV2Yy5tcDQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFhODdiYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzY1MTg2MjkxX2hldmMubXA0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzY1Mzk4ODIxLm1wNCBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzY1Mzk4ODIxLm1wNApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iZmM3MDBkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfNjUzOTg4MjEubXA0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzY1NzM1NzE2X2F2Yy5tcDQgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2J1Z182NTczNTcxNl9hdmMubXA0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM5ZTJjMmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2J1Z182NTczNTcxNl9hdmMubXA0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzY3MzgxNDY5LndlYnAgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2J1Z182NzM4MTQ2OS53ZWJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZmY2ZTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2J1Z182NzM4MTQ2OS53ZWJwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzY5MjY5NzAyLm1wNCBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzY5MjY5NzAyLm1wNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTExNzk2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfNjkyNjk3MDIubXA0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzczMTcyMDQ2Lm1wNCBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzczMTcyMDQ2Lm1wNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGU0NGJhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfNzMxNzIwNDYubXA0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzczOTY1ODkwX2ZyYW1lbGVuLm1wNCBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvYnVnXzczOTY1ODkwX2ZyYW1lbGVuLm1wNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjI4MDcwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfNzM5NjU4OTBfZnJhbWVsZW4ubXA0CkBAIC0wLDAgKzEsMTYwIEBACisyOQorMTYKKzEwMQorMjcKKzIyCisxMTQKKzg4CisxNDMKKzEwOQorOAorMTQ0CisyMjAKKzIwNgorMzAKKzc1NAorNTUKKzIyCisxMQorMTU4Cis1NworMjcKKzIyNAorMzkKKzQKKzE0MworODQKKzk5Cis1NworMjcKKzE5OAorMzkKKzQKKzE0NAorMjcKKzI5NQorMzQ4CisxNDQKKzEwNAorMTc5Cis5MgorMAorNDMxCisyMgorMTEKKzI2CisyNDIKKzQKKzE2MTIKKzgxCisxODYKKzY3CisyNgorMjMKKzExCisyMworNDAKKzUzOAorMjIKKzcwCis5OQorODQKKzIxOAorNDcKKzQzCisxNDMKKzcxCisxMTIKKzg0CisxNjAKKzg3CiszNDgKKzE0NAorMjE5CisxNzkKKzg0CisyNDIKKzQKKzE0NzQKKzkwCisyODEKKzM4CisxNDkKKzI3CiszMAorMTQ4CisxNzIKKzI2CisyOAorOTAKKzc1Cis1MworMTI0CisxMjkKKzI2CisyMworMTEKKzIzCis0MAorMAorNjEKKzI3Cis1MTAKKzMwCisyNworNTkKKzk5CisyNworMzAKKzQ4NworNTAKKzczCisyNgorODQKKzEzOQorMTgKKzI3Cis1NAorODQKKzEyMgorMjcKKzUxMAorMzAKKzIyCisxMQorMTU4Cis4NAorNDMxCiswCisxMjMKKzEyCisxNAorMjcKKzMwCisxNDgKKzI1NTgKKzgxCisxNTQKKzY3CisyNgorMjMKKzExCisyMworNDAKKzAKKzM5OAorNAorMTY1Cis1MworMTI0CisxMjkKKzI2CisyMworMTEKKzIzCis0MAorNDMxCisyMgorMTEKKzE1OAorMjQ0MwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfNzM5NjU4OTBfaGV2Yy5tcDQgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2J1Z183Mzk2NTg5MF9oZXZjLm1wNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzZkYmZmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9idWdfNzM5NjU4OTBfaGV2Yy5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9jdmVfMjAxNl8wODE1Lm1wNCBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvY3ZlXzIwMTZfMDgxNS5tcDQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGZlYTAzZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvY3ZlXzIwMTZfMDgxNS5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9jdmVfMjAxNl8wODI0Lm1wNCBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvY3ZlXzIwMTZfMDgyNC5tcDQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U1NjdiNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvY3ZlXzIwMTZfMDgyNC5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9jdmVfMjAxNl8yNDI4LmNyYXNoIGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9jdmVfMjAxNl8yNDI4LmNyYXNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY1NTA3ODUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2N2ZV8yMDE2XzI0MjguY3Jhc2gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9jdmVfMjAxNl8yNDU0LndlYm0gYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2N2ZV8yMDE2XzI0NTQud2VibQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hODExYmEyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9jdmVfMjAxNl8yNDU0LndlYm0KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9jdmVfMjAxNl8yNTA2Lm1wNCBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvY3ZlXzIwMTZfMjUwNi5tcDQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjBlYjdkOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvY3ZlXzIwMTZfMjUwNi5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9jdmVfMjAxNl8yNTA4Lm1wNCBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvY3ZlXzIwMTZfMjUwOC5tcDQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGFjNDVjYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvY3ZlXzIwMTZfMjUwOC5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9jdmVfMjAxNl8zNzQxLm1wNCBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvY3ZlXzIwMTZfMzc0MS5tcDQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjE3MTE1MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvY3ZlXzIwMTZfMzc0MS5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9jdmVfMjAxNl8zNzQyX2JfMjgxNjU2NTkubXA0IGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9jdmVfMjAxNl8zNzQyX2JfMjgxNjU2NTkubXA0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNTAwM2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2N2ZV8yMDE2XzM3NDJfYl8yODE2NTY1OS5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9jdmVfMjAxNl8zODIwLm1wNCBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvY3ZlXzIwMTZfMzgyMC5tcDQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDg4ZTk4NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvY3ZlXzIwMTZfMzgyMC5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9jdmVfMjAxNl8zODIxLm1wNCBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvY3ZlXzIwMTZfMzgyMS5tcDQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ2YjgxNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvY3ZlXzIwMTZfMzgyMS5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9jdmVfMjAxNl8zODI5Lm1wNCBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvY3ZlXzIwMTZfMzgyOS5tcDQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTUyNzBiNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvY3ZlXzIwMTZfMzgyOS5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9jdmVfMjAxNl8zOTIwLm1wMyBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvY3ZlXzIwMTZfMzkyMC5tcDMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMyYWJmYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvY3ZlXzIwMTZfMzkyMC5tcDMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9jdmVfMjAxNl82Njk5Lm1wNCBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvY3ZlXzIwMTZfNjY5OS5tcDQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGI4YmJmZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvY3ZlXzIwMTZfNjY5OS5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9jdmVfMjAxNl82NzY0Lm1wNCBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvY3ZlXzIwMTZfNjc2NC5tcDQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZjMTIxNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvY3ZlXzIwMTZfNjc2NC5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9jdmVfMjAxNl82NzY1Lm1wNCBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvY3ZlXzIwMTZfNjc2NS5tcDQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk1ZWVmYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvY3ZlXzIwMTZfNjc2NS5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9jdmVfMjAxNl82NzY2Lm1wNCBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvY3ZlXzIwMTZfNjc2Ni5tcDQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM3MGRmYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvY3ZlXzIwMTZfNjc2Ni5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9jdmVfMjAxN18wNDc0LndlYm0gYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2N2ZV8yMDE3XzA0NzQud2VibQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzQyNTVlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9jdmVfMjAxN18wNDc0LndlYm0KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9jdmVfMjAxN18wNzYyLm1wNCBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvY3ZlXzIwMTdfMDc2Mi5tcDQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4Y2MyY2QuLjAwMDAwMDAKLS0tIGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvcmVzL3Jhdy9jdmVfMjAxN18wNzYyLm1wNAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvY3ZlXzIwMTdfMDc2My5tcDQgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2N2ZV8yMDE3XzA3NjMubXA0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MDI3YmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2N2ZV8yMDE3XzA3NjMubXA0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvY3ZlXzIwMTdfMDc2NS5tcDQgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2N2ZV8yMDE3XzA3NjUubXA0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhZWQxNzEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2N2ZV8yMDE3XzA3NjUubXA0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvY3ZlXzIwMTdfMDg1Ny5tcDQgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2N2ZV8yMDE3XzA4NTcubXA0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2MzMWY3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvY3ZlXzIwMTdfMDg1Ny5tcDQKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2N2ZV8yMDE3XzEzMjE0Lm1wNCBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvY3ZlXzIwMTdfMTMyMTQubXA0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ODJlM2EKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2N2ZV8yMDE3XzEzMjE0Lm1wNApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2N2ZV8yMDE3XzEzMjI5LnhtZiBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvY3ZlXzIwMTdfMTMyMjkueG1mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZDE0NDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2N2ZV8yMDE3XzEzMjI5LnhtZgpAQCAtMCwwICsxLDEwMDAwMyBAQAorWE1GXzEuMDCJUgorQUFBQUFBQUFBQTJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEyAQUKK0MBMgEFCitDATIBBQorQwEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2N2ZV8yMDE3XzEzMjc2Lm1wNCBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvY3ZlXzIwMTdfMTMyNzYubXA0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZDg2ZDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2N2ZV8yMDE3XzEzMjc2Lm1wNApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2N2ZV8yMDE3XzEzMzA5X2NsaWVudC5ia3MgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2N2ZV8yMDE3XzEzMzA5X2NsaWVudC5ia3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY0NTBkMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvY3ZlXzIwMTdfMTMzMDlfY2xpZW50LmJrcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2N2ZV8yMDE3XzEzMzA5X3NlcnZlci5ia3MgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2N2ZV8yMDE3XzEzMzA5X3NlcnZlci5ia3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg0YzRiZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvY3ZlXzIwMTdfMTMzMDlfc2VydmVyLmJrcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2N2ZV8yMDE3XzEzMzA5X3RydXN0ZWRjZXJ0LmJrcyBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Jlcy9yYXcvY3ZlXzIwMTdfMTMzMDlfdHJ1c3RlZGNlcnQuYmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzOWQzNmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9yZXMvcmF3L2N2ZV8yMDE3XzEzMzA5X3RydXN0ZWRjZXJ0LmJrcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zZWN1cml0eS9zcmMvYW5kcm9pZC9zZWN1cml0eS9jdHMvQW1iaWd1b3VzQnVuZGxlc1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3NyYy9hbmRyb2lkL3NlY3VyaXR5L2N0cy9BbWJpZ3VvdXNCdW5kbGVzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNzQ3MDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9zcmMvYW5kcm9pZC9zZWN1cml0eS9jdHMvQW1iaWd1b3VzQnVuZGxlc1Rlc3QuamF2YQpAQCAtMCwwICsxLDIwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9DaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VjdXJpdHkuY3RzOworCitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQub3MuQmFzZUJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uU3VwcHJlc3NMaW50OworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworCitpbXBvcnQgYW5kcm9pZC5zZWN1cml0eS5jdHMuUjsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuU2VjdXJpdHlUZXN0OworCitwdWJsaWMgY2xhc3MgQW1iaWd1b3VzQnVuZGxlc1Rlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworCisgICAgQFNlY3VyaXR5VGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RfYW5kcm9pZF9DVkVfMjAxN18xMzI4NygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBCdW5kbGUgYnVuZGxlOworICAgICAgICB7CisgICAgICAgICAgICBCdW5kbGUgdmVyaWZ5TWUgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgICAgICB2ZXJpZnlNZS5wdXRTdHJpbmcoImNtZCIsICJzb21ldGhpbmdfc2FmZSIpOworICAgICAgICAgICAgQnVuZGxlIHVzZU1lID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgdXNlTWUucHV0U3RyaW5nKCJjbWQiLCAicmVwbGFjZWRfdGhpbmciKTsKKyAgICAgICAgICAgIEFtYmlndWF0b3IgYSA9IG5ldyBBbWJpZ3VhdG9yKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBCdW5kbGUgbWFrZShCdW5kbGUgcHJlUmVTZXJpYWxpemUsIEJ1bmRsZSBwb3N0UmVTZXJpYWxpemUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICBSYW5kb20gcmFuZG9tID0gbmV3IFJhbmRvbSgxMjM0KTsKKyAgICAgICAgICAgICAgICAgICAgaW50IG1pbkhhc2ggPSAwOworICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBzIDogcHJlUmVTZXJpYWxpemUua2V5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbkhhc2ggPSBNYXRoLm1pbihtaW5IYXNoLCBzLmhhc2hDb2RlKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHMgOiBwb3N0UmVTZXJpYWxpemUua2V5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbkhhc2ggPSBNYXRoLm1pbihtaW5IYXNoLCBzLmhhc2hDb2RlKCkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGtleUhhc2g7CisKKyAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gcmFuZG9tU3RyaW5nKHJhbmRvbSk7CisgICAgICAgICAgICAgICAgICAgICAgICBrZXlIYXNoID0ga2V5Lmhhc2hDb2RlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKGtleUhhc2ggPj0gbWluSGFzaCk7CisKKyAgICAgICAgICAgICAgICAgICAgcGFkQnVuZGxlKHBvc3RSZVNlcmlhbGl6ZSwgcHJlUmVTZXJpYWxpemUuc2l6ZSgpICsgMSwgbWluSGFzaCwgcmFuZG9tKTsKKyAgICAgICAgICAgICAgICAgICAgcGFkQnVuZGxlKHByZVJlU2VyaWFsaXplLCBwb3N0UmVTZXJpYWxpemUuc2l6ZSgpIC0gMSwgbWluSGFzaCwgcmFuZG9tKTsKKworICAgICAgICAgICAgICAgICAgICBTdHJpbmcga2V5MjsKKyAgICAgICAgICAgICAgICAgICAgaW50IGtleTJIYXNoOworICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICBrZXkyID0gbWFrZVN0cmluZ1RvSW5qZWN0KHBvc3RSZVNlcmlhbGl6ZSwgcmFuZG9tKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGtleTJIYXNoID0ga2V5Mi5oYXNoQ29kZSgpOworICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChrZXkySGFzaCA+PSBtaW5IYXNoIHx8IGtleTJIYXNoIDw9IGtleUhhc2gpOworCisKKyAgICAgICAgICAgICAgICAgICAgUGFyY2VsIHBhcmNlbCA9IFBhcmNlbC5vYnRhaW4oKTsKKworICAgICAgICAgICAgICAgICAgICBwYXJjZWwud3JpdGVJbnQocHJlUmVTZXJpYWxpemUuc2l6ZSgpICsgMik7CisgICAgICAgICAgICAgICAgICAgIHBhcmNlbC53cml0ZVN0cmluZyhrZXkpOworCisgICAgICAgICAgICAgICAgICAgIHBhcmNlbC53cml0ZUludChWQUxfUEFSQ0VMQUJMRSk7CisgICAgICAgICAgICAgICAgICAgIHBhcmNlbC53cml0ZVN0cmluZygiY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LlZlcmlmeUNyZWRlbnRpYWxSZXNwb25zZSIpOworCisgICAgICAgICAgICAgICAgICAgIHBhcmNlbC53cml0ZUludCgwKTsKKyAgICAgICAgICAgICAgICAgICAgcGFyY2VsLndyaXRlSW50KDApOworCisgICAgICAgICAgICAgICAgICAgIHBhcmNlbC53cml0ZVN0cmluZyhrZXkyKTsKKyAgICAgICAgICAgICAgICAgICAgcGFyY2VsLndyaXRlSW50KFZBTF9OVUxMKTsKKworICAgICAgICAgICAgICAgICAgICB3cml0ZUJ1bmRsZVNraXBwaW5nSGVhZGVycyhwYXJjZWwsIHByZVJlU2VyaWFsaXplKTsKKworICAgICAgICAgICAgICAgICAgICBwYXJjZWwuc2V0RGF0YVBvc2l0aW9uKDApOworICAgICAgICAgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgICAgICAgICBwYXJjZWxsZWREYXRhRmllbGQuc2V0KGJ1bmRsZSwgcGFyY2VsKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1bmRsZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIG1ha2VTdHJpbmdUb0luamVjdChCdW5kbGUgc3R1ZmZUb0luamVjdCwgUmFuZG9tIHJhbmRvbSkgeworICAgICAgICAgICAgICAgICAgICBQYXJjZWwgcCA9IFBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgcC53cml0ZUludCgwKTsKKyAgICAgICAgICAgICAgICAgICAgcC53cml0ZUludCgwKTsKKworICAgICAgICAgICAgICAgICAgICBQYXJjZWwgcDIgPSBQYXJjZWwub2J0YWluKCk7CisgICAgICAgICAgICAgICAgICAgIHN0dWZmVG9JbmplY3Qud3JpdGVUb1BhcmNlbChwMiwgMCk7CisgICAgICAgICAgICAgICAgICAgIGludCBwMkxlbiA9IHAyLmRhdGFQb3NpdGlvbigpIC0gQlVORExFX1NLSVA7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwMkxlbiAvIDQgKyA0OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYWRkaW5nVmFsOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZ1ZhbCA9IGk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmdWYWwgPSByYW5kb20ubmV4dEludCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcC53cml0ZUludChwYWRkaW5nVmFsKTsKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcC5hcHBlbmRGcm9tKHAyLCBCVU5ETEVfU0tJUCwgcDJMZW4pOworICAgICAgICAgICAgICAgICAgICBwMi5yZWN5Y2xlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHAuZGF0YVBvc2l0aW9uKCkgJSA4ICE9IDApIHAud3JpdGVJbnQoMCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwLndyaXRlSW50KDApOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaW50IGxlbiA9IHAuZGF0YVBvc2l0aW9uKCkgLyAyIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgcC53cml0ZUludCgwKTsgcC53cml0ZUludCgwKTsKKyAgICAgICAgICAgICAgICAgICAgcC5zZXREYXRhUG9zaXRpb24oMCk7CisgICAgICAgICAgICAgICAgICAgIHAud3JpdGVJbnQobGVuKTsKKyAgICAgICAgICAgICAgICAgICAgcC53cml0ZUludChsZW4pOworICAgICAgICAgICAgICAgICAgICBwLnNldERhdGFQb3NpdGlvbigwKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHAucmVhZFN0cmluZygpOworICAgICAgICAgICAgICAgICAgICBwLnJlY3ljbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgYnVuZGxlID0gYS5tYWtlKHZlcmlmeU1lLCB1c2VNZSk7CisgICAgICAgIH0KKworICAgICAgICBidW5kbGUgPSByZXBhcmNlbChidW5kbGUpOworICAgICAgICBTdHJpbmcgdmFsdWUxID0gYnVuZGxlLmdldFN0cmluZygiY21kIik7CisgICAgICAgIGJ1bmRsZSA9IHJlcGFyY2VsKGJ1bmRsZSk7CisgICAgICAgIFN0cmluZyB2YWx1ZTIgPSBidW5kbGUuZ2V0U3RyaW5nKCJjbWQiKTsKKworICAgICAgICBpZiAoIXZhbHVlMS5lcXVhbHModmFsdWUyKSkgeworICAgICAgICAgICAgZmFpbCgiU3RyaW5nICIgKyB2YWx1ZTEgKyAiIT0iICsgdmFsdWUyICsgIiBhZnRlciByZXBhcmNlbGluZy4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBTdXBwcmVzc0xpbnQoIlBhcmNlbENsYXNzTG9hZGVyIikKKyAgICBwcml2YXRlIEJ1bmRsZSByZXBhcmNlbChCdW5kbGUgc291cmNlKSB7CisgICAgICAgIFBhcmNlbCBwID0gUGFyY2VsLm9idGFpbigpOworICAgICAgICBwLndyaXRlQnVuZGxlKHNvdXJjZSk7CisgICAgICAgIHAuc2V0RGF0YVBvc2l0aW9uKDApOworICAgICAgICBCdW5kbGUgY29weSA9IHAucmVhZEJ1bmRsZSgpOworICAgICAgICBwLnJlY3ljbGUoKTsKKyAgICAgICAgcmV0dXJuIGNvcHk7CisgICAgfQorCisgICAgc3RhdGljIGFic3RyYWN0IGNsYXNzIEFtYmlndWF0b3IgeworCisgICAgICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFZBTF9QQVJDRUxBQkxFID0gNDsKKyAgICAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVkFMX05VTEwgPSAtMTsKKyAgICAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQlVORExFX1NLSVAgPSAxMjsKKworICAgICAgICBwcm90ZWN0ZWQgZmluYWwgRmllbGQgcGFyY2VsbGVkRGF0YUZpZWxkOworCisgICAgICAgIHB1YmxpYyBBbWJpZ3VhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBwYXJjZWxsZWREYXRhRmllbGQgPSBCYXNlQnVuZGxlLmNsYXNzLmdldERlY2xhcmVkRmllbGQoIm1QYXJjZWxsZWREYXRhIik7CisgICAgICAgICAgICBwYXJjZWxsZWREYXRhRmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIGFic3RyYWN0IHB1YmxpYyBCdW5kbGUgbWFrZShCdW5kbGUgcHJlUmVTZXJpYWxpemUsIEJ1bmRsZSBwb3N0UmVTZXJpYWxpemUpIHRocm93cyBFeGNlcHRpb247CisKKyAgICAgICAgYWJzdHJhY3QgcHJvdGVjdGVkIFN0cmluZyBtYWtlU3RyaW5nVG9JbmplY3QoQnVuZGxlIHN0dWZmVG9JbmplY3QsIFJhbmRvbSByYW5kb20pOworCisgICAgICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCB3cml0ZUJ1bmRsZVNraXBwaW5nSGVhZGVycyhQYXJjZWwgcGFyY2VsLCBCdW5kbGUgYnVuZGxlKSB7CisgICAgICAgICAgICBQYXJjZWwgcDIgPSBQYXJjZWwub2J0YWluKCk7CisgICAgICAgICAgICBidW5kbGUud3JpdGVUb1BhcmNlbChwMiwgMCk7CisgICAgICAgICAgICBwYXJjZWwuYXBwZW5kRnJvbShwMiwgQlVORExFX1NLSVAsIHAyLmRhdGFQb3NpdGlvbigpIC0gQlVORExFX1NLSVApOworICAgICAgICAgICAgcDIucmVjeWNsZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgcmFuZG9tU3RyaW5nKFJhbmRvbSByYW5kb20pIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDY7IGkrKykgeworICAgICAgICAgICAgICAgIGIuYXBwZW5kKChjaGFyKSgnICcgKyByYW5kb20ubmV4dEludCgnficgLSAnICcgKyAxKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGIudG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBwYWRCdW5kbGUoQnVuZGxlIGJ1bmRsZSwgaW50IHNpemUsIGludCBtaW5IYXNoLCBSYW5kb20gcmFuZG9tKSB7CisgICAgICAgICAgICB3aGlsZSAoYnVuZGxlLnNpemUoKSA8IHNpemUpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcga2V5OworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAga2V5ID0gcmFuZG9tU3RyaW5nKHJhbmRvbSk7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAoa2V5Lmhhc2hDb2RlKCkgPCBtaW5IYXNoIHx8IGJ1bmRsZS5jb250YWluc0tleShrZXkpKTsKKyAgICAgICAgICAgICAgICBidW5kbGUucHV0U3RyaW5nKGtleSwgIlBBRERJTkciKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3NyYy9hbmRyb2lkL3NlY3VyaXR5L2N0cy9CaXRtYXBGYWN0b3J5U2VjdXJpdHlUZXN0cy5qYXZhIGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvc3JjL2FuZHJvaWQvc2VjdXJpdHkvY3RzL0JpdG1hcEZhY3RvcnlTZWN1cml0eVRlc3RzLmphdmEKaW5kZXggMjAzZGIxMi4uMjI3MmRjMCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvc3JjL2FuZHJvaWQvc2VjdXJpdHkvY3RzL0JpdG1hcEZhY3RvcnlTZWN1cml0eVRlc3RzLmphdmEKKysrIGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvc3JjL2FuZHJvaWQvc2VjdXJpdHkvY3RzL0JpdG1hcEZhY3RvcnlTZWN1cml0eVRlc3RzLmphdmEKQEAgLTY5LDQgKzY5LDE2IEBACiAgICAgICAgIC8vIFRoaXMgcHJldmlvdXNseSBjcmFzaGVkIGluIGZyZWFkLiBObyBuZWVkIHRvIGNoZWNrIHRoZSBvdXRwdXQuCiAgICAgICAgIEJpdG1hcEZhY3RvcnkuZGVjb2RlRmlsZURlc2NyaXB0b3IoZ2V0UmVzb3VyY2UoUi5yYXcuYjM4MTE2NzQ2X25ldykpOwogICAgIH0KKworICAgIC8qKgorICAgICAqIFZlcmlmaWVzIHRoYXQgZGVjb2RpbmcgYSBjb3JydXB0IEJNUCBkb2VzIGNyYXNoLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RfYW5kcm9pZF9idWdfMzc2MjcxOTQoKSB7CisgICAgICAgIEZpbGVEZXNjcmlwdG9yIGV4cGxvaXRJbWFnZSA9IGdldFJlc291cmNlKFIucmF3LmJ1Z18zNzYyNzE5NCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBCaXRtYXBGYWN0b3J5LmRlY29kZUZpbGVEZXNjcmlwdG9yKGV4cGxvaXRJbWFnZSk7CisgICAgICAgIH0gY2F0Y2ggKE91dE9mTWVtb3J5RXJyb3IgZSkgeworICAgICAgICAgICAgZmFpbCgiT09NIGF0dGVtcHRpbmcgdG8gZGVjb2RlIEJNUCIpOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvc3JjL2FuZHJvaWQvc2VjdXJpdHkvY3RzL0JpdG1hcFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3NyYy9hbmRyb2lkL3NlY3VyaXR5L2N0cy9CaXRtYXBUZXN0LmphdmEKaW5kZXggNjI1M2YwYS4uOTEwZTNlMSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvc3JjL2FuZHJvaWQvc2VjdXJpdHkvY3RzL0JpdG1hcFRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9zcmMvYW5kcm9pZC9zZWN1cml0eS9jdHMvQml0bWFwVGVzdC5qYXZhCkBAIC0xNiwxMiArMTYsMTMgQEAKIAogcGFja2FnZSBhbmRyb2lkLnNlY3VyaXR5LmN0czsKIAotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwogaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5TZWN1cml0eVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCiBAU2VjdXJpdHlUZXN0CiBAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvc3JjL2FuZHJvaWQvc2VjdXJpdHkvY3RzL0NlcnRpZmljYXRlRGF0YS5qYXZhIGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvc3JjL2FuZHJvaWQvc2VjdXJpdHkvY3RzL0NlcnRpZmljYXRlRGF0YS5qYXZhCmluZGV4IGI4ODBmNWYuLjc2Zjg2ZDUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3NyYy9hbmRyb2lkL3NlY3VyaXR5L2N0cy9DZXJ0aWZpY2F0ZURhdGEuamF2YQorKysgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9zcmMvYW5kcm9pZC9zZWN1cml0eS9jdHMvQ2VydGlmaWNhdGVEYXRhLmphdmEKQEAgLTM2LDcgKzM2LDYgQEAKICAgICAgICI3NTpFMDpBQjpCNjoxMzo4NToxMjoyNzoxQzowNDpGODo1RjpERDpERTozODpFNDpCNzoyNDoyRTpGRSIsCiAgICAgICAiREE6Qzk6MDI6NEY6NTQ6RDg6RjY6REY6OTQ6OTM6NUY6QjE6NzM6MjY6Mzg6Q0E6NkE6RDc6N0M6MTMiLAogICAgICAgIjc0OjIwOjc0OjQxOjcyOjlDOkREOjkyOkVDOjc5OjMxOkQ4OjIzOjEwOjhEOkMyOjgxOjkyOkUyOkJCIiwKLSAgICAgICI0MDo1NDpEQTo2RjoxQzozRjo0MDo3NDpBQzpFRDowRjpFQzpDRDpEQjo3OTpEMTo1MzpGQjo5MDoxRCIsCiAgICAgICAiRjQ6OEI6MTE6QkY6REU6QUI6QkU6OTQ6NTQ6MjA6NzE6RTY6NDE6REU6NkI6QkU6ODg6MkI6NDA6QjkiLAogICAgICAgIjU4OkU4OkFCOkIwOjM2OjE1OjMzOkZCOjgwOkY3OjlCOjFCOjZEOjI5OkQzOkZGOjhEOjVGOjAwOkYwIiwKICAgICAgICI1NTpBNjo3MjozRTpDQjpGMjpFQzpDRDpDMzoyMzo3NDo3MDoxOTo5RDoyQTpCRToxMTpFMzo4MTpEMSIsCkBAIC01MSw2ICs1MCw3IEBACiAgICAgICAiREE6RkE6Rjc6RkE6NjY6ODQ6RUM6MDY6OEY6MTQ6NTA6QkQ6Qzc6QzI6ODE6QTU6QkM6QTk6NjQ6NTciLAogICAgICAgIjc0OkY4OkEzOkMzOkVGOkU3OkIzOjkwOjA2OjRCOjgzOjkwOjNDOjIxOjY0OjYwOjIwOkU1OkRGOkNFIiwKICAgICAgICIzMTo0Mzo2NDo5QjpFQzpDRToyNzpFQzpFRDozQTozRjowQjo4RjowRDpFNDpFODo5MTpERDpFRTpDQSIsCisgICAgICAiQjc6QUI6MzM6MDg6RDE6RUE6NDQ6Nzc6QkE6MTQ6ODA6MTI6NUE6NkY6QkQ6QTk6MzY6NDk6MEM6QkIiLAogICAgICAgIjVGOjQzOkU1OkIxOkJGOkY4Ojc4OjhDOkFDOjFDOkM3OkNBOjRBOjlBOkM2OjIyOjJCOkNDOjM0OkM2IiwKICAgICAgICIyQjo4RjoxQjo1NzozMzowRDpCQjpBMjpEMDo3QTo2Qzo1MTpGNzowRTpFOTowRDpEQTpCOTpBRDo4RSIsCiAgICAgICAiNzk6NUY6ODg6NjA6QzU6QUI6N0M6M0Q6OTI6RTY6Q0I6RjQ6OEQ6RTE6NDU6Q0Q6MTE6RUY6NjA6MEIiLApAQCAtNjQsNyArNjQsNiBAQAogICAgICAgIjU5OkFGOjgyOjc5OjkxOjg2OkM3OkI0Ojc1OjA3OkNCOkNGOjAzOjU3OjQ2OkVCOjA0OkREOkI3OjE2IiwKICAgICAgICI1MDozMDowNjowOToxRDo5NzpENDpGNTpBRTozOTpGNzpDQjpFNzo5Mjo3RDo3RDo2NToyRDozNDozMSIsCiAgICAgICAiRkU6NDU6NjU6OUI6Nzk6MDM6NUI6OTg6QTE6NjE6QjU6NTE6MkU6QUM6REE6NTg6MDk6NDg6MjI6NEQiLAotICAgICAgIjFCOjRCOjM5OjYxOjI2OjI3OjZCOjY0OjkxOkEyOjY4OjZEOkQ3OjAyOjQzOjIxOjJEOjFGOjFEOjk2IiwKICAgICAgICI4QzpGNDoyNzpGRDo3OTowQzozQTpEMTo2NjowNjo4RDpFODoxRTo1NzpFRjpCQjo5MzoyMjo3MjpENCIsCiAgICAgICAiMkY6Nzg6M0Q6MjU6NTI6MTg6QTc6NEE6NjU6Mzk6NzE6QjU6MkM6QTI6OUM6NDU6MTU6NkY6RTk6MTkiLAogICAgICAgIkJBOjI5OjQxOjYwOjc3Ojk4OjNGOkY0OkYzOkVGOkYyOjMxOjA1OjNCOjJFOkVBOjZEOjREOjQ1OkZEIiwKQEAgLTczLDYgKzcyLDcgQEAKICAgICAgICIzNjo3OTpDQTozNTo2Njo4Nzo3MjozMDo0RDozMDpBNTpGQjo4NzozQjowRjpBNzo3QjpCNzowRDo1NCIsCiAgICAgICAiMUI6OEU6RUE6NTc6OTY6Mjk6MUE6Qzk6Mzk6RUE6Qjg6MEE6ODE6MUE6NzM6NzM6QzA6OTM6Nzk6NjciLAogICAgICAgIjZFOjI2OjY0OkYzOjU2OkJGOjM0OjU1OkJGOkQxOjkzOjNGOjdDOjAxOkRFOkQ4OjEzOkRBOjhBOkE2IiwKKyAgICAgICI3NDozQTpGMDo1Mjo5QjpEMDozMjpBMDpGNDo0QTo4MzpDRDpENDpCQTpBOTo3Qjo3QzoyRTpDNDo5QSIsCiAgICAgICAiRDg6RUI6NkI6NDE6NTE6OTI6NTk6RTA6RjM6RTc6ODU6MDA6QzA6M0Q6QjY6ODg6OTc6Qzk6RUU6RkMiLAogICAgICAgIjY2OjMxOkJGOjlFOkY3OjRGOjlFOkI2OkM5OkQ1OkE2OjBDOkJBOjZBOkJFOkQxOkY3OkJEOkVGOjdCIiwKICAgICAgICJERTozRjo0MDpCRDo1MDo5MzpEMzo5Qjo2Qzo2MDpGNjpEQTpCQzowNzo2MjowMTowMDo4OTo3NjpDOSIsCkBAIC04MywxNCArODMsMTQgQEAKICAgICAgICI0MzoxMzpCQjo5NjpGMTpENTo4Njo5QjpDMTo0RTo2QTo5MjpGNjpDRjpGNjozNDo2OTo4Nzo4MjozNyIsCiAgICAgICAiRjE6OEI6NTM6OEQ6MUI6RTk6MDM6QjY6QTY6RjA6NTY6NDM6NUI6MTc6MTU6ODk6Q0E6RjM6NkI6RjIiLAogICAgICAgIjA1OjYzOkI4OjYzOjBEOjYyOkQ3OjVBOkJCOkM4OkFCOjFFOjRCOkRGOkI1OkE4Ojk5OkIyOjREOjQzIiwKLSAgICAgICI2Mjo1MjpEQzo0MDpGNzoxMTo0MzpBMjoyRjpERTo5RTpGNzozNDo4RTowNjo0Mjo1MTpCMTo4MToxOCIsCiAgICAgICAiNzA6MTc6OUI6ODY6OEM6MDA6QTQ6RkE6NjA6OTE6NTI6MjI6M0Y6OUY6M0U6MzI6QkQ6RTA6MDU6NjIiLAogICAgICAgIkQxOkVCOjIzOkE0OjZEOjE3OkQ2OjhGOkQ5OjI1OjY0OkMyOkYxOkYxOjYwOjE3OjY0OkQ4OkUzOjQ5IiwKICAgICAgICJCODowMTo4NjpEMTpFQjo5Qzo4NjpBNTo0MTowNDpDRjozMDo1NDpGMzo0Qzo1MjpCNzpFNTo1ODpDNiIsCi0gICAgICAiMkU6MTQ6REE6RUM6Mjg6RjA6RkE6MUU6OEU6Mzg6OUE6NEU6QUI6RUI6MjY6QzA6MEE6RDM6ODM6QzMiLAorICAgICAgIjRDOkREOjUxOkEzOkQxOkY1OjIwOjMyOjE0OkIwOkM2OkM1OjMyOjIzOjAzOjkxOkM3OjQ2OjQyOjZEIiwKICAgICAgICJERToyODpGNDpBNDpGRjpFNTpCOToyRjpBMzpDNTowMzpEMTpBMzo0OTpBNzpGOTo5NjoyQTo4MjoxMiIsCiAgICAgICAiMEQ6NDQ6REQ6OEM6M0M6OEM6MUE6MUE6NTg6NzU6NjQ6ODE6RTk6MEY6MkU6MkE6RkY6QjM6RDI6NkUiLAogICAgICAgIkNBOjNBOkZCOkNGOjEyOjQwOjM2OjRCOjQ0OkIyOjE2OjIwOjg4OjgwOjQ4OjM5OjE5OjkzOjdDOkY3IiwKKyAgICAgICJGRjpCRDpDRDpFNzo4MjpDODo0Mzo1RTozQzo2RjoyNjo4Njo1QzpDQTpBODozQTo0NTo1QjpDMzowQSIsCiAgICAgICAiMTM6MkQ6MEQ6NDU6NTM6NEI6Njk6OTc6Q0Q6QjI6RDU6QzM6Mzk6RTI6NTU6NzY6NjA6OUI6NUM6QzYiLAogICAgICAgIjVGOkI3OkVFOjA2OjMzOkUyOjU5OkRCOkFEOjBDOjRDOjlBOkU2OkQzOjhGOjFBOjYxOkM3OkRDOjI1IiwKICAgICAgICI0OTowQTo3NTo3NDpERTo4NzowQTo0NzpGRTo1ODpFRTpGNjpDNzo2QjpFQjpDNjowQjoxMjo0MDo5OSIsCkBAIC05OCw2ICs5OCw3IEBACiAgICAgICAiMjk6MzY6MjE6MDI6OEI6MjA6RUQ6MDI6RjU6NjY6QzU6MzI6RDE6RDY6RUQ6OTA6OUY6NDU6MDA6MkYiLAogICAgICAgIjM3OjlBOjE5OjdCOjQxOjg1OjQ1OjM1OjBDOkE2OjAzOjY5OkYzOjNDOjJFOkFGOjQ3OjRGOjIwOjc5IiwKICAgICAgICJGQTpCNzpFRTozNjo5NzoyNjo2MjpGQjoyRDpCMDoyQTpGNjpCRjowMzpGRDpFODo3Qzo0QjoyRjo5QiIsCisgICAgICAiQzM6MTk6N0M6Mzk6MjQ6RTY6NTQ6QUY6MUI6QzQ6QUI6MjA6OTU6N0E6RTI6QzM6MEU6MTM6MDI6NkEiLAogICAgICAgIjlGOjc0OjRFOjlGOjJCOjREOkJBOkVDOjBGOjMxOjJDOjUwOkI2OjU2OjNCOjhFOjJEOjkzOkMzOjExIiwKICAgICAgICJBMTo0Qjo0ODpEOTo0MzpFRTowQTowRTo0MDo5MDo0RjozQzpFMDpBNDpDMDo5MTo5Mzo1MTo1RDozRiIsCiAgICAgICAiQzk6QTg6Qjk6RTc6NTU6ODA6NUU6NTg6RTM6NTM6Nzc6QTc6MjU6RUI6QUY6QzM6N0I6Mjc6Q0M6RDciLApAQCAtMTE5LDYgKzEyMCw3IEBACiAgICAgICAiQUE6REI6QkM6MjI6MjM6OEY6QzQ6MDE6QTE6Mjc6QkI6Mzg6REQ6RjQ6MUQ6REI6MDg6OUU6RjA6MTIiLAogICAgICAgIkUyOjUyOkZBOjk1OjNGOkVEOkRCOjI0OjYwOkJEOjZFOjI4OkYzOjlDOkNDOkNGOjVFOkIzOjNGOkRFIiwKICAgICAgICIzQjpDNDo5Rjo0ODpGODpGMzo3MzpBMDo5QzoxRTpCRDpGODo1QjpCMTpDMzo2NTpDNzpEODoxMTpCMyIsCisgICAgICAiMEY6MzY6Mzg6NUI6ODE6MUE6MjU6QzM6OUI6MzE6NEU6ODM6Q0E6RTk6MzQ6NjY6NzA6Q0M6NzQ6QjQiLAogICAgICAgIjI4OjkwOjNBOjYzOjVCOjUyOjgwOkZBOkU2Ojc3OjRDOjBCOjZEOkE3OkQ2OkJBOkE2OjRBOkYyOkU4IiwKICAgICAgICI5QzpCQjo0ODo1MzpGNjpBNDpGNjpEMzo1MjpBNDpFODozMjo1Mjo1NTo2MDoxMzpGNTpBRDpBRjo2NSIsCiAgICAgICAiQjE6QkM6OTY6OEI6RDQ6RjQ6OUQ6NjI6MkE6QTg6OUE6ODE6RjI6MTU6MDE6NTI6QTQ6MUQ6ODI6OUMiLApAQCAtMTI5LDYgKzEzMSw3IEBACiAgICAgICAiNDc6QkU6QUI6Qzk6MjI6RUE6RTg6MEU6Nzg6Nzg6MzQ6NjI6QTc6OUY6NDU6QzI6NTQ6RkQ6RTY6OEIiLAogICAgICAgIjNBOjQ0OjczOjVBOkU1OjgxOjkwOjFGOjI0Ojg2OjYxOjQ2OjFFOjNCOjlDOkM0OjVGOkY1OjNBOjFCIiwKICAgICAgICJCMzoxRTpCMTpCNzo0MDpFMzo2Qzo4NDowMjpEQTpEQzozNzpENDo0RDpGNTpENDo2Nzo0OTo1MjpGOSIsCisgICAgICAiNTg6RDE6REY6OTU6OTU6Njc6NkI6NjM6QzA6RjA6NUI6MUM6MTc6NEQ6OEI6ODQ6MEI6Qzg6Nzg6QkQiLAogICAgICAgIkY1OjE3OkEyOjRGOjlBOjQ4OkM2OkM5OkY4OkEyOjAwOjI2OjlGOkRDOjBGOjQ4OjJDOkFCOjMwOjg5IiwKICAgICAgICIzQjpDMDozODowQjozMzpDMzpGNjpBNjowQzo4NjoxNToyMjo5MzpEOTpERjpGNTo0Qjo4MTpDMDowNCIsCiAgICAgICAiMDM6OUU6RUQ6Qjg6MEI6RTc6QTA6M0M6Njk6NTM6ODk6M0I6MjA6RDI6RDk6MzI6M0E6NEM6MkE6RkQiLApAQCAtMTM5LDEyICsxNDIsMTIgQEAKICAgICAgICJCODoyMzo2QjowMDoyRjoxRDoxNjo4Njo1MzowMTo1NTo2QzoxMTpBNDozNzpDQTpFQjpGRjpDMzpCQiIsCiAgICAgICAiODc6ODI6QzY6QzM6MDQ6MzU6M0I6Q0Y6RDI6OTY6OTI6RDI6NTk6M0U6N0Q6NDQ6RDk6MzQ6RkY6MTEiLAogICAgICAgIjU5OjBEOjJEOjdEOjg4OjRGOjQwOjJFOjYxOjdFOkE1OjYyOjMyOjE3OjY1OkNGOjE3OkQ4Ojk0OkU5IiwKKyAgICAgICJCODpCRTo2RDpDQjo1NjpGMTo1NTpCOTo2MzpENDoxMjpDQTo0RTowNjozNDpDNzo5NDpCMjoxQzpDMCIsCiAgICAgICAiQUU6QzU6RkI6M0Y6Qzg6RTE6QkY6QzQ6RTU6NEY6MDM6MDc6NUE6OUE6RTg6MDA6Qjc6Rjc6QjY6RkEiLAogICAgICAgIkRGOjcxOjdFOkFBOjRBOkQ5OjRFOkM5OjU1Ojg0Ojk5OjYwOjJEOjQ4OkRFOjVGOkJDOkYwOjNBOjI1IiwKICAgICAgICJGNjoxMDo4NDowNzpENjpGODpCQjo2Nzo5ODowQzpDMjpFMjo0NDpDMjpFQjpBRToxQzpFRjo2MzpCRSIsCiAgICAgICAiQUY6RTU6RDI6NDQ6QTg6RDE6MTk6NDI6MzA6RkY6NDc6OUY6RTI6Rjg6OTc6QkI6Q0Q6N0E6OEM6QjQiLAogICAgICAgIjVGOjNCOjhDOkYyOkY4OjEwOkIzOjdEOjc4OkI0OkNFOkVDOjE5OjE5OkMzOjczOjM0OkI5OkM3Ojc0IiwKLSAgICAgICJGMTo3Rjo2RjpCNjozMTpEQzo5OTpFMzpBMzpDODo3RjpGRToxQzpGMTo4MToxMDo4ODpEOTo2MDozMyIsCiAgICAgICAiOUQ6NzA6QkI6MDE6QTU6QTQ6QTA6MTg6MTE6MkU6Rjc6MUM6MDE6Qjk6MzI6QzU6MzQ6RTc6ODg6QTgiLAogICAgICAgIjk2OkM5OjFCOjBCOjk1OkI0OjEwOjk4OjQyOkZBOkQwOkQ4OjIyOjc5OkZFOjYwOkZBOkI5OjE2OjgzIiwKICAgICAgICI0Rjo2NTo4RToxRjpFOTowNjpEODoyODowMjpFOTo1NDo0Nzo0MTpDOTo1NDoyNTo1RDo2OTpDQzoxQSIsCkBAIC0xNTUsNyArMTU4LDYgQEAKICAgICAgICJGOTpCNTpCNjozMjo0NTo1Rjo5QzpCRTpFQzo1Nzo1Rjo4MDpEQzpFOTo2RToyQzpDNzpCMjo3ODpCNyIsCiAgICAgICAiRTY6MjE6RjM6MzU6NDM6Nzk6MDU6OUE6NEI6Njg6MzA6OUQ6OEE6MkY6NzQ6MjI6MTU6ODc6RUM6NzkiLAogICAgICAgIjg5OkRGOjc0OkZFOjVDOkY0OjBGOjRBOjgwOkY5OkUzOjM3OjdEOjU0OkRBOjkxOkUxOjAxOjMxOjhFIiwKLSAgICAgICJFMDpCNDozMjoyRTpCMjpGNjpBNTo2ODpCNjo1NDo1Mzo4NDo0ODoxODo0QTo1MDozNjo4Nzo0Mzo4NCIsCiAgICAgICAiN0U6MDQ6REU6ODk6NkE6M0U6NjY6NkQ6MDA6RTY6ODc6RDM6M0Y6RkE6RDk6M0I6RTg6M0Q6MzQ6OUUiLAogICAgICAgIjZFOjNBOjU1OkE0OjE5OjBDOjE5OjVDOjkzOjg0OjNDOkMwOkRCOjcyOjJFOjMxOjMwOjYxOkYwOkIxIiwKICAgICAgICI0RTpCNjpENTo3ODo0OTo5QjoxQzpDRjo1Rjo1ODoxRTpBRDo1NjpCRTozRDo5Qjo2Nzo0NDpBNTpFNSIsCkBAIC0xNjMsNCArMTY1LDEwIEBACiAgICAgICAiOEQ6QTc6Rjk6NjU6RUM6NUU6RkM6Mzc6OTE6MEY6MUM6NkU6NTk6RkQ6QzE6Q0M6NkE6NkU6REU6MTYiLAogICAgICAgIkIxOjJFOjEzOjYzOjQ1Ojg2OkE0OjZGOjFBOkIyOjYwOjY4OjM3OjU4OjJEOkM0OkFDOkZEOjk0Ojk3IiwKICAgfTsKKworICBzdGF0aWMgZmluYWwgU3RyaW5nW10gV0ZBX0NFUlRJRklDQVRFX0RBVEEgPSB7CisgICAgICAiQkI6NDk6MjQ6ODM6MTg6NDc6OTU6MkI6REI6MUE6MTI6QjA6Mzg6RUM6NTE6NTQ6QUQ6Q0I6REU6NDMiLAorICAgICAgIjM4OkQ2OjYzOjlGOjUxOkQ3OjI0OjIxOkFEOjc1OjNDOkM2OjA3OjU0Ojk5OkI3OjFGOkVDOkY3OkZDIiwKKyAgICAgICI1MTo1MDoxRjpCRjpDRTo2OToxODo5RDo2MDo5QzpGQTpGMTo0MDpDNTo3Njo3NTo1RDpDQzoxRjpERiIsCisgIH07CiB9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zZWN1cml0eS9zcmMvYW5kcm9pZC9zZWN1cml0eS9jdHMvQ2VydGlmaWNhdGVUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9zcmMvYW5kcm9pZC9zZWN1cml0eS9jdHMvQ2VydGlmaWNhdGVUZXN0LmphdmEKaW5kZXggODgwNTA3Mi4uMjU4OGY0ZCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvc3JjL2FuZHJvaWQvc2VjdXJpdHkvY3RzL0NlcnRpZmljYXRlVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3NyYy9hbmRyb2lkL3NlY3VyaXR5L2N0cy9DZXJ0aWZpY2F0ZVRlc3QuamF2YQpAQCAtMTYsMTYgKzE2LDIwIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5zZWN1cml0eS5jdHM7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNkZFRlc3Q7Ci0KK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlNlY3VyaXR5VGVzdDsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5U3RvcmU7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlTdG9yZUV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVGYWN0b3J5OwogaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGU7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CkBAIC0zMywxMiArMzcsMTEgQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCiBAU2VjdXJpdHlUZXN0Ci1wdWJsaWMgY2xhc3MgQ2VydGlmaWNhdGVUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworcHVibGljIGNsYXNzIENlcnRpZmljYXRlVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CisgICAgLy8gVGhlIGRpcmVjdG9yeSBmb3IgQ0Egcm9vdCBjZXJ0aWZpY2F0ZXMgdHJ1c3RlZCBieSBXRkEgKFdpRmkgQWxsaWFuY2UpCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBESVJfT0ZfQ0FDRVJUU19GT1JfV0ZBID0gIi9ldGMvc2VjdXJpdHkvY2FjZXJ0c193ZmEiOwogCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjkuOC40L0MtMC0xIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9SZW1vdmVkQ2VydGlmaWNhdGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFNldDxTdHJpbmc+IGV4cGVjdGVkQ2VydGlmaWNhdGVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigKICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KENlcnRpZmljYXRlRGF0YS5DRVJUSUZJQ0FURV9EQVRBKSk7CkBAIC02NSw3ICs2OCw2IEBACiAgICAgICoKICAgICAgKiA8cD5Gb3IgcXVlc3Rpb25zLCBjb21tZW50cywgYW5kIGNvZGUgcmV2aWV3cyBwbGVhc2UgY29udGFjdCBzZWN1cml0eUBhbmRyb2lkLmNvbS4KICAgICAgKi8KLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iOS44LjQvQy0wLTEsQy0wLTIiKQogICAgIHB1YmxpYyB2b2lkIHRlc3ROb0FkZGVkQ2VydGlmaWNhdGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFNldDxTdHJpbmc+IGV4cGVjdGVkQ2VydGlmaWNhdGVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigKICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KENlcnRpZmljYXRlRGF0YS5DRVJUSUZJQ0FURV9EQVRBKSk7CkBAIC03NCw3ICs3Niw2IEBACiAgICAgICAgIGFzc2VydEVxdWFscygiVW5rbm93biBDQSBjZXJ0aWZpY2F0ZXMiLCBDb2xsZWN0aW9ucy5FTVBUWV9TRVQsIGRldmljZUNlcnRpZmljYXRlcyk7CiAgICAgfQogCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjkuOC40L0MtMC0xIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0QmxvY2tDZXJ0aWZpY2F0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgU2V0PFN0cmluZz4gYmxvY2tDZXJ0aWZpY2F0ZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CiAgICAgICAgIGJsb2NrQ2VydGlmaWNhdGVzLmFkZCgiQzA6NjA6RUQ6NDQ6Q0I6RDg6ODE6QkQ6MEU6Rjg6NkM6MEI6QTI6ODc6REQ6Q0Y6ODE6Njc6NDc6OEMiKTsKQEAgLTg0LDYgKzg1LDg5IEBACiAgICAgICAgIGFzc2VydEVxdWFscygiQmxvY2tlZCBDQSBjZXJ0aWZpY2F0ZXMiLCBDb2xsZWN0aW9ucy5FTVBUWV9TRVQsIGRldmljZUNlcnRpZmljYXRlcyk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogVGhpcyB0ZXN0IGV4aXN0cyBiZWNhdXNlIGFkZGluZyBuZXcgY2EgY2VydGlmaWNhdGUgb3IgcmVtb3ZpbmcgdGhlIGNhIGNlcnRpZmljYXRlcyB0cnVzdGVkIGJ5CisgICAgICogV0ZBIChXaUZpIEFsbGlhbmNlKSBpcyBub3QgYWxsb3dlZC4KKyAgICAgKgorICAgICAqIEZvciBxdWVzdGlvbnMsIGNvbW1lbnRzLCBhbmQgY29kZSByZXZpZXdzIHBsZWFzZSBjb250YWN0IHNlY3VyaXR5QGFuZHJvaWQuY29tLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3ROb1JlbW92ZWRXZmFDZXJ0aWZpY2F0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFzdXBwb3J0UGFzc3BvaW50KCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBTZXQ8U3RyaW5nPiBleHBlY3RlZENlcnRpZmljYXRlcyA9IG5ldyBIYXNoU2V0PD4oCisgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChDZXJ0aWZpY2F0ZURhdGEuV0ZBX0NFUlRJRklDQVRFX0RBVEEpKTsKKyAgICAgICAgU2V0PFN0cmluZz4gZGV2aWNlV2ZhQ2VydGlmaWNhdGVzID0gZ2V0RGV2aWNlV2ZhQ2VydGlmaWNhdGVzKCk7CisgICAgICAgIGV4cGVjdGVkQ2VydGlmaWNhdGVzLnJlbW92ZUFsbChkZXZpY2VXZmFDZXJ0aWZpY2F0ZXMpOworICAgICAgICBhc3NlcnRFcXVhbHMoIk1pc3NpbmcgV0ZBIENBIGNlcnRpZmljYXRlcyIsIENvbGxlY3Rpb25zLkVNUFRZX1NFVCwgZXhwZWN0ZWRDZXJ0aWZpY2F0ZXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROb0FkZGVkV2ZhQ2VydGlmaWNhdGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghc3VwcG9ydFBhc3Nwb2ludCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU2V0PFN0cmluZz4gZXhwZWN0ZWRDZXJ0aWZpY2F0ZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KAorICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoQ2VydGlmaWNhdGVEYXRhLldGQV9DRVJUSUZJQ0FURV9EQVRBKSk7CisgICAgICAgIFNldDxTdHJpbmc+IGRldmljZVdmYUNlcnRpZmljYXRlcyA9IGdldERldmljZVdmYUNlcnRpZmljYXRlcygpOworICAgICAgICBkZXZpY2VXZmFDZXJ0aWZpY2F0ZXMucmVtb3ZlQWxsKGV4cGVjdGVkQ2VydGlmaWNhdGVzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmtub3duIFdGQSBDQSBjZXJ0aWZpY2F0ZXMiLCBDb2xsZWN0aW9ucy5FTVBUWV9TRVQsIGRldmljZVdmYUNlcnRpZmljYXRlcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHN1cHBvcnRQYXNzcG9pbnQoKSB7CisgICAgICAgIHJldHVybiBtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9XSUZJX1BBU1NQT0lOVCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBLZXlTdG9yZSBjcmVhdGVXZmFLZXlTdG9yZShTdHJpbmcgZGlyUGF0aCkgdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwKKyAgICAgICAgICAgIEtleVN0b3JlRXhjZXB0aW9uLCBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24geworICAgICAgICBLZXlTdG9yZSBrZXlTdG9yZSA9IEtleVN0b3JlLmdldEluc3RhbmNlKEtleVN0b3JlLmdldERlZmF1bHRUeXBlKCkpOworICAgICAgICBrZXlTdG9yZS5sb2FkKG51bGwsIG51bGwpOworICAgICAgICBTdHJpbmcgd2ZhQ2VydHNEaXIgPSBTeXN0ZW0uZ2V0ZW52KCJBTkRST0lEX1JPT1QiKSArIGRpclBhdGg7CisgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgIGZvciAoWDUwOUNlcnRpZmljYXRlIGNlcnQgOiBsb2FkQ2VydHNGcm9tRGlzayh3ZmFDZXJ0c0RpcikpIHsKKyAgICAgICAgICAgIGtleVN0b3JlLnNldENlcnRpZmljYXRlRW50cnkoU3RyaW5nLmZvcm1hdCgiJWQiLCBpbmRleCsrKSwgY2VydCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGtleVN0b3JlOworICAgIH0KKworICAgIHByaXZhdGUgU2V0PFg1MDlDZXJ0aWZpY2F0ZT4gbG9hZENlcnRzRnJvbURpc2soU3RyaW5nIGRpcmVjdG9yeSkgdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uLAorICAgICAgICAgICAgSU9FeGNlcHRpb24geworICAgICAgICBTZXQ8WDUwOUNlcnRpZmljYXRlPiBjZXJ0cyA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgRmlsZSBjZXJ0RGlyID0gbmV3IEZpbGUoZGlyZWN0b3J5KTsKKyAgICAgICAgRmlsZVtdIGNlcnRGaWxlcyA9IGNlcnREaXIubGlzdEZpbGVzKCk7CisgICAgICAgIGlmIChjZXJ0RmlsZXMgPT0gbnVsbCB8fCBjZXJ0RmlsZXMubGVuZ3RoIDw9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBjZXJ0czsKKyAgICAgICAgfQorICAgICAgICBDZXJ0aWZpY2F0ZUZhY3RvcnkgY2VydEZhY3RvcnkgPSBDZXJ0aWZpY2F0ZUZhY3RvcnkuZ2V0SW5zdGFuY2UoIlguNTA5Iik7CisgICAgICAgIGZvciAoRmlsZSBjZXJ0RmlsZSA6IGNlcnRGaWxlcykgeworICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oY2VydEZpbGUpOworICAgICAgICAgICAgQ2VydGlmaWNhdGUgY2VydCA9IGNlcnRGYWN0b3J5LmdlbmVyYXRlQ2VydGlmaWNhdGUoZmlzKTsKKyAgICAgICAgICAgIGlmIChjZXJ0IGluc3RhbmNlb2YgWDUwOUNlcnRpZmljYXRlKSB7CisgICAgICAgICAgICAgICAgY2VydHMuYWRkKChYNTA5Q2VydGlmaWNhdGUpIGNlcnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmlzLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNlcnRzOworICAgIH0KKworICAgIHByaXZhdGUgU2V0PFN0cmluZz4gZ2V0RGV2aWNlV2ZhQ2VydGlmaWNhdGVzKCkgdGhyb3dzIEtleVN0b3JlRXhjZXB0aW9uLAorICAgICAgICAgICAgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLCBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBLZXlTdG9yZSB3ZmFLZXlTdG9yZSA9IGNyZWF0ZVdmYUtleVN0b3JlKERJUl9PRl9DQUNFUlRTX0ZPUl9XRkEpOworICAgICAgICBMaXN0PFN0cmluZz4gYWxpYXNlcyA9IENvbGxlY3Rpb25zLmxpc3Qod2ZhS2V5U3RvcmUuYWxpYXNlcygpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoYWxpYXNlcy5pc0VtcHR5KCkpOworCisgICAgICAgIFNldDxTdHJpbmc+IGNlcnRpZmljYXRlcyA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgZm9yIChTdHJpbmcgYWxpYXMgOiBhbGlhc2VzKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHdmYUtleVN0b3JlLmlzQ2VydGlmaWNhdGVFbnRyeShhbGlhcykpOworICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlIGNlcnRpZmljYXRlID0gKFg1MDlDZXJ0aWZpY2F0ZSkgd2ZhS2V5U3RvcmUuZ2V0Q2VydGlmaWNhdGUoYWxpYXMpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNlcnRpZmljYXRlLmdldFN1YmplY3RVbmlxdWVJRCgpLCBjZXJ0aWZpY2F0ZS5nZXRJc3N1ZXJVbmlxdWVJRCgpKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoY2VydGlmaWNhdGUuZ2V0U3ViamVjdEROKCkpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChjZXJ0aWZpY2F0ZS5nZXRJc3N1ZXJETigpKTsKKyAgICAgICAgICAgIFN0cmluZyBmaW5nZXJwcmludCA9IGdldEZpbmdlcnByaW50KGNlcnRpZmljYXRlKTsKKyAgICAgICAgICAgIGNlcnRpZmljYXRlcy5hZGQoZmluZ2VycHJpbnQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjZXJ0aWZpY2F0ZXM7CisgICAgfQorCiAgICAgcHJpdmF0ZSBTZXQ8U3RyaW5nPiBnZXREZXZpY2VDZXJ0aWZpY2F0ZXMoKSB0aHJvd3MgS2V5U3RvcmVFeGNlcHRpb24sCiAgICAgICAgICAgICBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIENlcnRpZmljYXRlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIEtleVN0b3JlIGtleVN0b3JlID0gS2V5U3RvcmUuZ2V0SW5zdGFuY2UoIkFuZHJvaWRDQVN0b3JlIik7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zZWN1cml0eS9zcmMvYW5kcm9pZC9zZWN1cml0eS9jdHMvQ3J5cHRvUHJvdmlkZXJXb3JrYXJvdW5kVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvc3JjL2FuZHJvaWQvc2VjdXJpdHkvY3RzL0NyeXB0b1Byb3ZpZGVyV29ya2Fyb3VuZFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYxYzQ0My4uMDAwMDAwMAotLS0gYS90ZXN0cy90ZXN0cy9zZWN1cml0eS9zcmMvYW5kcm9pZC9zZWN1cml0eS9jdHMvQ3J5cHRvUHJvdmlkZXJXb3JrYXJvdW5kVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnNlY3VyaXR5LmN0czsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKLQotaW1wb3J0IGRhbHZpay5zeXN0ZW0uVk1SdW50aW1lOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoUHJvdmlkZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb207Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5TZWN1cml0eTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLWltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuSlVuaXQ0OwotCi0vKioKLSAqIGh0dHA6Ly9iLzI4NTUwMDkyIDogUmVtb3ZhbCBvZiAiQ3J5cHRvIiBwcm92aWRlciBpbiBOIGNhdXNlZCBhcHBsaWNhdGlvbiBjb21wYXRpYmlsaXR5Ci0gKiBpc3N1ZXMgZm9yIGNhbGxlcnMgb2YgU2VjdXJlUmFuZG9tLiBUbyBpbXByb3ZlIGNvbXBhdGliaWxpdHkgdGhlIHByb3ZpZGVyIGlzIG5vdCByZWdpc3RlcmVkCi0gKiBhcyBhIEpDQSBQcm92aWRlciBvYnRhaW5hYmxlIHZpYSBTZWN1cml0eS5nZXRQcm92aWRlcigpIGJ1dCBpcyBtYWRlIGF2YWlsYWJsZSBmb3IKLSAqIFNlY3VyZVJhbmRvbS5nZXRJbnN0YW5jZSgpIGlmZiB0aGUgYXBwbGljYXRpb24gdGFyZ2V0cyBBUEkgPD0gMjMuCi0gKi8KLUBSdW5XaXRoKEpVbml0NC5jbGFzcykKLXB1YmxpYyBjbGFzcyBDcnlwdG9Qcm92aWRlcldvcmthcm91bmRUZXN0IHsKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIGNyeXB0b1Byb3ZpZGVyX3dpdGhXb3JrYXJvdW5kX1N1Y2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gQXNzZXJ0IHRoYXQgU2VjdXJlUmFuZG9tIGlzIHN0aWxsIHVzaW5nIHRoZSBkZWZhdWx0IHZhbHVlLiBTYW5pdHkgY2hlY2suCi0gICAgICAgIGFzc2VydEVxdWFscyhTZWN1cmVSYW5kb20uREVGQVVMVF9TREtfVEFSR0VUX0ZPUl9DUllQVE9fUFJPVklERVJfV09SS0FST1VORCwKLSAgICAgICAgICAgICAgICBTZWN1cmVSYW5kb20uZ2V0U2RrVGFyZ2V0Rm9yQ3J5cHRvUHJvdmlkZXJXb3JrYXJvdW5kKCkpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBNb2RpZnkgdGhlIG1heGltdW0gdGFyZ2V0IFNESyB0byBhcHBseSB0aGUgd29ya2Fyb3VuZCwgdGhlcmVieSBlbmFibGluZyB0aGUKLSAgICAgICAgICAgIC8vIHdvcmthcm91bmQgZm9yIHRoZSBjdXJyZW50IFNESyBhbmQgZW5hYmxpbmcgaXQgdG8gYmUgdGVzdGVkLgotICAgICAgICAgICAgU2VjdXJlUmFuZG9tLnNldFNka1RhcmdldEZvckNyeXB0b1Byb3ZpZGVyV29ya2Fyb3VuZCgKLSAgICAgICAgICAgICAgICAgICAgVk1SdW50aW1lLmdldFJ1bnRpbWUoKS5nZXRUYXJnZXRTZGtWZXJzaW9uKCkpOwotCi0gICAgICAgICAgICAvLyBBc3NlcnQgdGhhdCB0aGUgY3J5cHRvIHByb3ZpZGVyIGlzIG5vdCBpbnN0YWxsZWQuLi4KLSAgICAgICAgICAgIGFzc2VydE51bGwoU2VjdXJpdHkuZ2V0UHJvdmlkZXIoIkNyeXB0byIpKTsKLSAgICAgICAgICAgIFNlY3VyZVJhbmRvbSBzciA9IFNlY3VyZVJhbmRvbS5nZXRJbnN0YW5jZSgiU0hBMVBSTkciLCAiQ3J5cHRvIik7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHNyKTsKLSAgICAgICAgICAgIC8vIC4uLmJ1dCB3ZSBjYW4gZ2V0IGEgU2VjdXJlUmFuZG9tIGZyb20gaXQuLi4KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygib3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnByb3ZpZGVyLmNyeXB0by5DcnlwdG9Qcm92aWRlciIsCi0gICAgICAgICAgICAgICAgICAgIHNyLmdldFByb3ZpZGVyKCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgLy8gLi4ueWV0IGl0J3Mgbm90IGluc3RhbGxlZC4gU28gdGhlIHdvcmthcm91bmQgd29ya2VkLgotICAgICAgICAgICAgYXNzZXJ0TnVsbChTZWN1cml0eS5nZXRQcm92aWRlcigiQ3J5cHRvIikpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgLy8gUmVzZXQgdGhlIHRhcmdldCBTREsgZm9yIHRoZSB3b3JrYXJvdW5kIHRvIHRoZSBkZWZhdWx0IC8gcmVhbCB2YWx1ZS4KLSAgICAgICAgICAgIFNlY3VyZVJhbmRvbS5zZXRTZGtUYXJnZXRGb3JDcnlwdG9Qcm92aWRlcldvcmthcm91bmQoCi0gICAgICAgICAgICAgICAgICAgIFNlY3VyZVJhbmRvbS5ERUZBVUxUX1NES19UQVJHRVRfRk9SX0NSWVBUT19QUk9WSURFUl9XT1JLQVJPVU5EKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgY3J5cHRvUHJvdmlkZXJfd2l0aG91dFdvcmthcm91bmRfRmFpbHVyZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBBc3NlcnQgdGhhdCBTZWN1cmVSYW5kb20gaXMgc3RpbGwgdXNpbmcgdGhlIGRlZmF1bHQgdmFsdWUuIFNhbml0eSBjaGVjay4KLSAgICAgICAgYXNzZXJ0RXF1YWxzKFNlY3VyZVJhbmRvbS5ERUZBVUxUX1NES19UQVJHRVRfRk9SX0NSWVBUT19QUk9WSURFUl9XT1JLQVJPVU5ELAotICAgICAgICAgICAgICAgIFNlY3VyZVJhbmRvbS5nZXRTZGtUYXJnZXRGb3JDcnlwdG9Qcm92aWRlcldvcmthcm91bmQoKSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIFdlIHNldCB0aGUgbGltaXQgU0RLIGZvciB0aGUgd29ya2Fyb3VuZCBhdCB0aGUgcHJldmlvdXMgb25lLCBpbmRpY2F0aW5nIHRoYXQgdGhlCi0gICAgICAgICAgICAvLyB3b3JrYXJvdW5kIHNob3VsZG4ndCBiZSBpbiBwbGFjZS4KLSAgICAgICAgICAgIFNlY3VyZVJhbmRvbS5zZXRTZGtUYXJnZXRGb3JDcnlwdG9Qcm92aWRlcldvcmthcm91bmQoCi0gICAgICAgICAgICAgICAgICAgIFZNUnVudGltZS5nZXRSdW50aW1lKCkuZ2V0VGFyZ2V0U2RrVmVyc2lvbigpIC0gMSk7Ci0KLSAgICAgICAgICAgIFNlY3VyZVJhbmRvbSBzciA9IFNlY3VyZVJhbmRvbS5nZXRJbnN0YW5jZSgiU0hBMVBSTkciLCAiQ3J5cHRvIik7Ci0gICAgICAgICAgICBmYWlsKCJTaG91bGQgdGhyb3cgIiArIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIH0gY2F0Y2goTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24gZXhwZWN0ZWQpIHsKLSAgICAgICAgICAgIC8vIFRoZSB3b3JrYXJvdW5kIGRvZXNuJ3Qgd29yay4gQXMgZXhwZWN0ZWQuCi0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAvLyBSZXNldCB0aGUgdGFyZ2V0IFNESyBmb3IgdGhlIHdvcmthcm91bmQgdG8gdGhlIGRlZmF1bHQgLyByZWFsIHZhbHVlLgotICAgICAgICAgICAgU2VjdXJlUmFuZG9tLnNldFNka1RhcmdldEZvckNyeXB0b1Byb3ZpZGVyV29ya2Fyb3VuZCgKLSAgICAgICAgICAgICAgICAgICAgU2VjdXJlUmFuZG9tLkRFRkFVTFRfU0RLX1RBUkdFVF9GT1JfQ1JZUFRPX1BST1ZJREVSX1dPUktBUk9VTkQpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvc3JjL2FuZHJvaWQvc2VjdXJpdHkvY3RzL0RlY29kZVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3NyYy9hbmRyb2lkL3NlY3VyaXR5L2N0cy9EZWNvZGVUZXN0LmphdmEKaW5kZXggZTY0ZTM3YS4uMGU5MjMxMCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvc3JjL2FuZHJvaWQvc2VjdXJpdHkvY3RzL0RlY29kZVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9zcmMvYW5kcm9pZC9zZWN1cml0eS9jdHMvRGVjb2RlVGVzdC5qYXZhCkBAIC0zOCw0ICszOCwxNyBAQAogICAgICAgICBCaXRtYXAgYml0bWFwID0gQml0bWFwRmFjdG9yeS5kZWNvZGVTdHJlYW0oZXhwbG9pdEltYWdlKTsKICAgICAgICAgYXNzZXJ0TnVsbChiaXRtYXApOwogICAgIH0KKworICAgIC8qKgorICAgICAqIFZlcmlmaWVzIHRoYXQgdGhlIGRldmljZSBmYWlscyB0byBkZWNvZGUgYSB0cnVuY2F0ZWQgYW5pbWF0ZWQgd2VicC4KKyAgICAgKgorICAgICAqIFByaW9yIHRvIGZpeGluZyBidWcgNjczODE0NjksIGRlY29kaW5nIHRoaXMgZmlsZSB3b3VsZCBjcmFzaC4gSW5zdGVhZCwgaXQgc2hvdWxkIGZhaWwgdG8KKyAgICAgKiBkZWNvZGUuCisgICAgICovCisgICAgQFNlY3VyaXR5VGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RfYW5kcm9pZF9idWdfNjczODE0NjkoKSB7CisgICAgICAgIElucHV0U3RyZWFtIGV4cGxvaXRJbWFnZSA9IG1Db250ZXh0LmdldFJlc291cmNlcygpLm9wZW5SYXdSZXNvdXJjZShSLnJhdy5idWdfNjczODE0NjkpOworICAgICAgICBCaXRtYXAgYml0bWFwID0gQml0bWFwRmFjdG9yeS5kZWNvZGVTdHJlYW0oZXhwbG9pdEltYWdlKTsKKyAgICAgICAgYXNzZXJ0TnVsbChiaXRtYXApOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3NyYy9hbmRyb2lkL3NlY3VyaXR5L2N0cy9FbmNyeXB0aW9uVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvc3JjL2FuZHJvaWQvc2VjdXJpdHkvY3RzL0VuY3J5cHRpb25UZXN0LmphdmEKaW5kZXggNmFkYjk2ZC4uZWQ2Y2Y1YyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvc3JjL2FuZHJvaWQvc2VjdXJpdHkvY3RzL0VuY3J5cHRpb25UZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvc3JjL2FuZHJvaWQvc2VjdXJpdHkvY3RzL0VuY3J5cHRpb25UZXN0LmphdmEKQEAgLTE2LDE1ICsxNiwxNCBAQAogCiBwYWNrYWdlIGFuZHJvaWQuc2VjdXJpdHkuY3RzOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DZGRUZXN0OwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuUHJvcGVydHlVdGlsOwogCiBpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlNlY3VyaXR5VGVzdDsKIGltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CiBpbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwpAQCAtNDcsMTcgKzQ2LDE2IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gYWVzSXNGYXN0KCk7CiAKICAgICBwcml2YXRlIGJvb2xlYW4gaXNSZXF1aXJlZCgpIHsKLSAgICAgICAgUGFja2FnZU1hbmFnZXIgcG0gPSB0aGlzLmdldENvbnRleHQoKS5nZXRQYWNrYWdlTWFuYWdlcigpOwotICAgICAgICBpZiAocG0uaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX0FVVE9NT1RJVkUpKSB7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICJEZXZpY2UgZW5jcnlwdGlvbiBpcyBub3QgbmVlZGVkIGZvciBhdXRvbW90aXZlIGRldmljZSB0eXBlIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQogICAgICAgICAvLyBPcHRpb25hbCBiZWZvcmUgTUlOX0FQSV9MRVZFTAotICAgICAgICByZXR1cm4gUHJvcGVydHlVdGlsLmdldEZpcnN0QXBpTGV2ZWwoKSA+PSBNSU5fQVBJX0xFVkVMOworICAgICAgICByZXR1cm4gUHJvcGVydHlVdGlsLmdldEZpcnN0QXBpTGV2ZWwoKSA+PSBNSU5fQVBJX0xFVkVMICYmICFpc1RlbGV2aXNpb24oKTsKICAgICB9CiAKLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iOS45L0MtMi0xIikKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNUZWxldmlzaW9uKCkgeworICAgICAgICBQYWNrYWdlTWFuYWdlciBwbSA9IGdldENvbnRleHQoKS5nZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICByZXR1cm4gcG0uaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX1RFTEVWSVNJT04pCisgICAgICAgICAgICAgICAgfHwgcG0uaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX0xFQU5CQUNLKTsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCB0ZXN0RW5jcnlwdGlvbigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBpZiAoIWlzUmVxdWlyZWQoKSB8fCBkZXZpY2VJc0VuY3J5cHRlZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zZWN1cml0eS9zcmMvYW5kcm9pZC9zZWN1cml0eS9jdHMvSXNvbGF0ZWRQcm9jZXNzVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvc3JjL2FuZHJvaWQvc2VjdXJpdHkvY3RzL0lzb2xhdGVkUHJvY2Vzc1Rlc3QuamF2YQppbmRleCAxYTJmNjIwLi4xNzU5NTIxIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9zZWN1cml0eS9zcmMvYW5kcm9pZC9zZWN1cml0eS9jdHMvSXNvbGF0ZWRQcm9jZXNzVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3NyYy9hbmRyb2lkL3NlY3VyaXR5L2N0cy9Jc29sYXRlZFByb2Nlc3NUZXN0LmphdmEKQEAgLTIwLDYgKzIwLDcgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5TZXJ2aWNlQ29ubmVjdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5TZWN1cml0eVRlc3Q7CiBpbXBvcnQgYW5kcm9pZC5zZWN1cml0eS5jdHMuSUlzb2xhdGVkU2VydmljZTsKQEAgLTMyLDcgKzMzLDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwogCi1AU2VjdXJpdHlUZXN0CiBwdWJsaWMgY2xhc3MgSXNvbGF0ZWRQcm9jZXNzVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBJc29sYXRlZFByb2Nlc3NUZXN0LmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKIApAQCAtNzUsNiArNzUsOCBAQAogICAgICAgICAgICAgICAgIG1MYXRjaC5hd2FpdChCSU5EX1NFUlZJQ0VfVElNRU9VVCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CiAgICAgfQogCisKKyAgICBAU2VjdXJpdHlUZXN0CiAgICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjkuMi9DLTAtMSIpCiAgICAgcHVibGljIHZvaWQgdGVzdEdldENhY2hlZFNlcnZpY2VzRnJvbUlzb2xhdGVkU2VydmljZSgpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgICBTdHJpbmdbXSBjYWNoZWRTZXJ2aWNlcyA9IG1TZXJ2aWNlLmdldENhY2hlZFN5c3RlbVNlcnZpY2VzKCk7CkBAIC04NCw2ICs4Niw4IEBACiAgICAgICAgIH0KICAgICB9CiAKKworICAgIEBTZWN1cml0eVRlc3QKICAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iOS4yL0MtMC0xIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U2VydmljZUZyb21Jc29sYXRlZFNlcnZpY2UoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKICAgICAgICAgZm9yIChTdHJpbmcgc2VydmljZU5hbWUgOiBSRVNUUklDVEVEX1NFUlZJQ0VTX1RPX1RFU1QpIHsKQEAgLTkzLDYgKzk3LDExIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UHJvY2Vzc0lzSXNvbGF0ZWQoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKFByb2Nlc3MuaXNJc29sYXRlZCgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUobVNlcnZpY2UuZ2V0UHJvY2Vzc0lzSXNvbGF0ZWQoKSk7CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CiAgICAgICAgIG1Db250ZXh0LnVuYmluZFNlcnZpY2UobVNlcnZpY2VDb25uZWN0aW9uKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3NyYy9hbmRyb2lkL3NlY3VyaXR5L2N0cy9Jc29sYXRlZFNlcnZpY2UuamF2YSBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3NyYy9hbmRyb2lkL3NlY3VyaXR5L2N0cy9Jc29sYXRlZFNlcnZpY2UuamF2YQppbmRleCBhMDMzMTEzLi4wMjQ1MTA1IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9zZWN1cml0eS9zcmMvYW5kcm9pZC9zZWN1cml0eS9jdHMvSXNvbGF0ZWRTZXJ2aWNlLmphdmEKKysrIGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvc3JjL2FuZHJvaWQvc2VjdXJpdHkvY3RzL0lzb2xhdGVkU2VydmljZS5qYXZhCkBAIC0xOSw2ICsxOSw3IEBACiBpbXBvcnQgYW5kcm9pZC5hcHAuU2VydmljZTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7CiBpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlNlY3VyaXR5VGVzdDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwpAQCAtNzUsNiArNzYsMTEgQEAKICAgICAgICAgcHVibGljIElCaW5kZXIgZ2V0U3lzdGVtU2VydmljZShTdHJpbmcgc2VydmljZU5hbWUpIHsKICAgICAgICAgICAgIHJldHVybiBnZXRTZXJ2aWNlRnJvbVNlcnZpY2VNYW5hZ2VyKHNlcnZpY2VOYW1lKTsKICAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGdldFByb2Nlc3NJc0lzb2xhdGVkKCkgeworICAgICAgICAgICAgcmV0dXJuIFByb2Nlc3MuaXNJc29sYXRlZCgpOworICAgICAgICB9CisKICAgICB9OwogCiAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zZWN1cml0eS9zcmMvYW5kcm9pZC9zZWN1cml0eS9jdHMvTGlzdGVuaW5nUG9ydHNUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9zcmMvYW5kcm9pZC9zZWN1cml0eS9jdHMvTGlzdGVuaW5nUG9ydHNUZXN0LmphdmEKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCAzNzhmMGE2Li5kN2ZjOTE1Ci0tLSBhL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3NyYy9hbmRyb2lkL3NlY3VyaXR5L2N0cy9MaXN0ZW5pbmdQb3J0c1Rlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9zcmMvYW5kcm9pZC9zZWN1cml0eS9jdHMvTGlzdGVuaW5nUG9ydHNUZXN0LmphdmEKQEAgLTE3LDggKzE3LDExIEBACiBwYWNrYWdlIGFuZHJvaWQuc2VjdXJpdHkuY3RzOwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuUHJvY2VzczsKK2ltcG9ydCBhbmRyb2lkLm9zLlVzZXJIYW5kbGU7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuRmVhdHVyZVV0aWw7CiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwpAQCAtNDQsNiArNDcsOCBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTk5fVElNRU9VVF9JTl9NUyA9IDUwMDA7CiAKKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzVGVsZXZpc2lvbjsKKwogICAgIC8qKiBQb3J0cyB0aGF0IGFyZSBhbGxvd2VkIHRvIGJlIGxpc3RlbmluZy4gKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0PFN0cmluZz4gRVhDRVBUSU9OX1BBVFRFUk5TID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KDYpOwogCkBAIC02Myw4ICs2OCwyMCBAQAogICAgICAgICBFWENFUFRJT05fUEFUVEVSTlMuYWRkKCIxMjcuMC4wLjEgMTAwMDAiKTsgIC8vIHVzZWQgYnkgdGhlIGNhc3QgcmVjZWl2ZXIKICAgICAgICAgRVhDRVBUSU9OX1BBVFRFUk5TLmFkZCgiOjogMTAwMiIpOyAgICAgICAgICAvLyB1c2VkIGJ5IHJlbW90ZSBjb250cm9sCiAgICAgICAgIEVYQ0VQVElPTl9QQVRURVJOUy5hZGQoIjo6IDEwMjAiKTsgICAgICAgICAgLy8gdXNlZCBieSByZW1vdGUgY29udHJvbAorICAgICAgICBFWENFUFRJT05fUEFUVEVSTlMuYWRkKCIwLjAuMC4wOjcyNzUiKTsgICAgIC8vIHVzZWQgYnkgc3VwbCAKICAgICAgICAgLy9ubyBjdXJyZW50IHBhdHRlcm5zIGludm9sdmUgYWRkcmVzcywgcG9ydCBhbmQgVUlEIGNvbWJpbmF0aW9ucwogICAgICAgICAvL0V4YW1wbGUgZm9yIHdoZW4gbmVjZXNzYXJ5OiBFWENFUFRJT05fUEFUVEVSTlMuYWRkKCIwLjAuMC4wOjU1NTUgMTAwMDAiKQorCisgICAgICAgIC8vIElQdjYgZXhjZXB0aW9ucworICAgICAgICAvLyBUT0RPOiB0aGlzIGlzIG5vdCBzdGFuZGFyZCBub3RhdGlvbiBmb3IgSVB2Ni4gVXNlIFskYWRkcl06JHBvcnQgaW5zdGVhZCBhcyBwZXIgUkZDIDM5ODYuCisgICAgICAgIEVYQ0VQVElPTl9QQVRURVJOUy5hZGQoIjo6OjU1NTUiKTsgICAgICAgICAgLy8gZW11bGF0b3IgcG9ydCBmb3IgYWRiCisgICAgICAgIEVYQ0VQVElPTl9QQVRURVJOUy5hZGQoIjo6OjcyNzUiKTsgICAgICAgICAgLy8gdXNlZCBieSBzdXBsCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgbUlzVGVsZXZpc2lvbiA9IEZlYXR1cmVVdGlsLmlzVFYoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTk5LDkgKzExNiwxMSBAQAogICAgICAqIHVuYXV0aG9yaXplZCBhY2Nlc3MgdG8gY29tcHV0ZXJzIHN5c3RlbXMgd2l0aG91dCB1c2VyIGtub3dsZWRnZSBvcgogICAgICAqIGF3YXJlbmVzcy4KICAgICAgKi8KKyAgICAvKiBEaXNhYmxpbmcgdGhpcyB0ZXN0IGR1ZSB0byBpbXNfcnRwX2RhZW1vbiBsaXN0ZW5pbmcgb24gYSByYW5kb20gVURQNiBwb3J0IHBlciBiLzExMDI2NDA1OC4KICAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9SZW1vdGVseUFjY2Vzc2libGVMaXN0ZW5pbmdVZHA2UG9ydHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0Tm9SZW1vdGVseUFjY2Vzc2libGVMaXN0ZW5pbmdVZHBQb3J0cygiL3Byb2MvbmV0L3VkcDYiLCBmYWxzZSk7CiAgICAgfQorICAgICovCiAKICAgICAvKioKICAgICAgKiBMb2NhbGx5IGFjY2Vzc2libGUgcG9ydHMgYXJlIG9mdGVuIHRhcmdldGVkIGJ5IG1hbGljaW91cyBsb2NhbGx5CkBAIC0yMTMsNiArMjMyLDEyIEBACiAgICAgICAgICAgICAgICAgaWYgKGlzVGNwICYmICFpc1RjcENvbm5lY3RhYmxlKGVudHJ5LmxvY2FsQWRkcmVzcywgZW50cnkucG9ydCkpIHsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGFsbG93IG5vbi1zeXN0ZW0gcHJvY2Vzc2VzIHRvIGxpc3RlbgorICAgICAgICAgICAgICAgIGludCBhcHBJZCA9IFVzZXJIYW5kbGUuZ2V0QXBwSWQoZW50cnkudWlkKTsKKyAgICAgICAgICAgICAgICBpZiAoYXBwSWQgPj0gUHJvY2Vzcy5GSVJTVF9BUFBMSUNBVElPTl9VSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGFwcElkIDw9IFByb2Nlc3MuTEFTVF9BUFBMSUNBVElPTl9VSUQpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgZXJyb3JzICs9ICJcbkZvdW5kIHBvcnQgbGlzdGVuaW5nIG9uIGFkZHI9IgogICAgICAgICAgICAgICAgICAgICAgICAgKyBlbnRyeS5sb2NhbEFkZHJlc3MuZ2V0SG9zdEFkZHJlc3MoKSArICIsIHBvcnQ9IgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvc3JjL2FuZHJvaWQvc2VjdXJpdHkvY3RzL01vdGlvbkV2ZW50VGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvc3JjL2FuZHJvaWQvc2VjdXJpdHkvY3RzL01vdGlvbkV2ZW50VGVzdC5qYXZhCmluZGV4IDRhOGNjNzgwLi42OTgyZjc1IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9zZWN1cml0eS9zcmMvYW5kcm9pZC9zZWN1cml0eS9jdHMvTW90aW9uRXZlbnRUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvc3JjL2FuZHJvaWQvc2VjdXJpdHkvY3RzL01vdGlvbkV2ZW50VGVzdC5qYXZhCkBAIC0yNywxMCArMjcsNiBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LklucHV0RGV2aWNlOwogaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKQEAgLTM4LDcgKzM0LDEzIEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuUG9sbGluZ0NoZWNrOworaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuV2lkZ2V0VGVzdFV0aWxzOwogCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKQEAgLTgwLDEzICs4MiwxMiBAQAogICAgICAqIHNjcmVlbiB0byBkZXRlcm1pbmUgYXBwcm94aW1hdGUgbG9jYXRpb25zIG9mIHRvdWNoIGV2ZW50cyB3aXRob3V0IHRoZSB1c2VyIGtub3dpbmcuCiAgICAgICovCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWN0aW9uT3V0c2lkZURvZXNOb3RDb250YWluZWRPYnNjdXJlZEluZm9ybWF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdEFjdGlvbk91dHNpZGVEb2VzTm90Q29udGFpbmVkT2JzY3VyZWRJbmZvcm1hdGlvbigpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBlbmFibGVBcHBPcHMoKTsKICAgICAgICAgZmluYWwgT25Ub3VjaExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IE9uVG91Y2hMaXN0ZW5lcigpOwotICAgICAgICBmaW5hbCBQb2ludCBzaXplID0gbmV3IFBvaW50KCk7Ci0gICAgICAgIGZpbmFsIFZpZXdbXSB2aWV3SG9sZGVyID0gbmV3IFZpZXdbMV07Ci0gICAgICAgIG1BY3Rpdml0eS5ydW5PblVpVGhyZWFkKCgpIC0+IHsKKyAgICAgICAgRnV0dXJlVGFzazxWaWV3PiBhZGRWaWV3VGFzayA9IG5ldyBGdXR1cmVUYXNrPD4oKCkgLT4gewogICAgICAgICAgICAgZmluYWwgV2luZG93TWFuYWdlciB3bSA9IG1BY3Rpdml0eS5nZXRTeXN0ZW1TZXJ2aWNlKFdpbmRvd01hbmFnZXIuY2xhc3MpOworICAgICAgICAgICAgZmluYWwgUG9pbnQgc2l6ZSA9IG5ldyBQb2ludCgpOwogICAgICAgICAgICAgd20uZ2V0RGVmYXVsdERpc3BsYXkoKS5nZXRTaXplKHNpemUpOwogCiAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyB3bWxwID0gbmV3IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zKApAQCAtMTE1LDIwICsxMTYsMjYgQEAKICAgICAgICAgICAgIHYuc2V0QmFja2dyb3VuZENvbG9yKENvbG9yLkJMVUUpOwogICAgICAgICAgICAgdi5zZXRPblRvdWNoTGlzdGVuZXIobGlzdGVuZXIpOwogICAgICAgICAgICAgdi5zZXRMYXlvdXRQYXJhbXModmdscCk7Ci0gICAgICAgICAgICB2aWV3SG9sZGVyWzBdID0gdjsKIAogICAgICAgICAgICAgd20uYWRkVmlldyh2LCB3bWxwKTsKKyAgICAgICAgICAgIHJldHVybiB2OwogICAgICAgICB9KTsKLSAgICAgICAgbUluc3RydW1lbnRhdGlvbi53YWl0Rm9ySWRsZVN5bmMoKTsKKyAgICAgICAgbUFjdGl2aXR5LnJ1bk9uVWlUaHJlYWQoYWRkVmlld1Rhc2spOworICAgICAgICBWaWV3IHZpZXcgPSBhZGRWaWV3VGFzay5nZXQoNSwgVGltZVVuaXQuU0VDT05EUyk7CiAKLSAgICAgICAgRnV0dXJlVGFzazxQb2ludD4gdGFzayA9IG5ldyBGdXR1cmVUYXNrPD4oKCkgLT4geworICAgICAgICAvLyBXYWl0IGZvciBhIGxheW91dCBwYXNzIHRvIGJlIGNlcnRhaW4gdGhlIHZpZXcgaXMgb24gdGhlIHNjcmVlbgorICAgICAgICAvLyBiZWZvcmUgZ2V0dGluZyB0aGUgbG9jYXRpb24gYW5kIGluamVjdGluZyB0b3VjaGVzLgorICAgICAgICBXaWRnZXRUZXN0VXRpbHMucnVuT25NYWluQW5kTGF5b3V0U3luYyhtQWN0aXZpdHlSdWxlLCB2aWV3LCBudWxsIC8qcnVubmFibGUqLywKKyAgICAgICAgICAgICAgICB0cnVlIC8qZm9yY2VMYXlvdXQqLyk7CisKKyAgICAgICAgRnV0dXJlVGFzazxQb2ludD4gY2xpY2tMb2NhdGlvblRhc2sgPSBuZXcgRnV0dXJlVGFzazw+KCgpIC0+IHsKICAgICAgICAgICAgIGZpbmFsIGludFtdIHZpZXdMb2NhdGlvbiA9IG5ldyBpbnRbMl07Ci0gICAgICAgICAgICB2aWV3SG9sZGVyWzBdLmdldExvY2F0aW9uT25TY3JlZW4odmlld0xvY2F0aW9uKTsKKyAgICAgICAgICAgIHZpZXcuZ2V0TG9jYXRpb25PblNjcmVlbih2aWV3TG9jYXRpb24pOwogICAgICAgICAgICAgLy8gU2V0IHkgcG9zaXRpb24gdG8gdGhlIGNlbnRlciBvZiB0aGUgdmlldywgdG8gbWFrZSBzdXJlIGl0IGlzIGF3YXkgZnJvbSB0aGUgc3RhdHVzIGJhcgotICAgICAgICAgICAgcmV0dXJuIG5ldyBQb2ludCh2aWV3TG9jYXRpb25bMF0sIHZpZXdMb2NhdGlvblsxXSArIHZpZXdIb2xkZXJbMF0uZ2V0SGVpZ2h0KCkgLyAyKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUG9pbnQodmlld0xvY2F0aW9uWzBdLCB2aWV3TG9jYXRpb25bMV0gKyB2aWV3LmdldEhlaWdodCgpIC8gMik7CiAgICAgICAgIH0pOwotICAgICAgICBtQWN0aXZpdHkucnVuT25VaVRocmVhZCh0YXNrKTsKLSAgICAgICAgUG9pbnQgdmlld0xvY2F0aW9uID0gdGFzay5nZXQoNSwgVGltZVVuaXQuU0VDT05EUyk7CisgICAgICAgIG1BY3Rpdml0eS5ydW5PblVpVGhyZWFkKGNsaWNrTG9jYXRpb25UYXNrKTsKKyAgICAgICAgUG9pbnQgdmlld0xvY2F0aW9uID0gY2xpY2tMb2NhdGlvblRhc2suZ2V0KDUsIFRpbWVVbml0LlNFQ09ORFMpOwogICAgICAgICBpbmplY3RUYXAodmlld0xvY2F0aW9uLngsIHZpZXdMb2NhdGlvbi55KTsKIAogICAgICAgICBMaXN0PE1vdGlvbkV2ZW50PiBvdXRzaWRlRXZlbnRzID0gbGlzdGVuZXIuZ2V0T3V0c2lkZUV2ZW50cygpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvc3JjL2FuZHJvaWQvc2VjdXJpdHkvY3RzL09wZW5TU0xFYXJseUNDU1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3NyYy9hbmRyb2lkL3NlY3VyaXR5L2N0cy9PcGVuU1NMRWFybHlDQ1NUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YmFkODQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvc3JjL2FuZHJvaWQvc2VjdXJpdHkvY3RzL09wZW5TU0xFYXJseUNDU1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnNlY3VyaXR5LmN0czsKLQotaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5TZWN1cml0eVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zZWN1cml0eS5jdHMuT3BlblNTTEhlYXJ0YmxlZWRUZXN0LkFsZXJ0TWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLnNlY3VyaXR5LmN0cy5PcGVuU1NMSGVhcnRibGVlZFRlc3QuSGFuZHNoYWtlTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLnNlY3VyaXR5LmN0cy5PcGVuU1NMSGVhcnRibGVlZFRlc3QuSGFyZGNvZGVkQ2VydFg1MDlLZXlNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuc2VjdXJpdHkuY3RzLk9wZW5TU0xIZWFydGJsZWVkVGVzdC5UbHNQcm90b2NvbHM7Ci1pbXBvcnQgYW5kcm9pZC5zZWN1cml0eS5jdHMuT3BlblNTTEhlYXJ0YmxlZWRUZXN0LlRsc1JlY29yZDsKLWltcG9ydCBhbmRyb2lkLnNlY3VyaXR5LmN0cy5PcGVuU1NMSGVhcnRibGVlZFRlc3QuVGxzUmVjb3JkUmVhZGVyOwotaW1wb3J0IGFuZHJvaWQuc2VjdXJpdHkuY3RzLk9wZW5TU0xIZWFydGJsZWVkVGVzdC5UcnVzdEFsbFg1MDlUcnVzdE1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RDYXNlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQ7Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0OwotaW1wb3J0IGphdmEubmV0LlNvY2tldEFkZHJlc3M7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5LZXlGYWN0b3J5OwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmF0ZUtleTsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVGYWN0b3J5OwotaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGU7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLlBLQ1M4RW5jb2RlZEtleVNwZWM7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwotCi1pbXBvcnQgamF2YXgubmV0LlNlcnZlclNvY2tldEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgubmV0LlNvY2tldEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgubmV0LnNzbC5LZXlNYW5hZ2VyOwotaW1wb3J0IGphdmF4Lm5ldC5zc2wuU1NMQ29udGV4dDsKLWltcG9ydCBqYXZheC5uZXQuc3NsLlNTTFNlcnZlclNvY2tldDsKLWltcG9ydCBqYXZheC5uZXQuc3NsLlNTTFNvY2tldDsKLWltcG9ydCBqYXZheC5uZXQuc3NsLlRydXN0TWFuYWdlcjsKLQotLyoqCi0gKiBUZXN0cyBmb3IgdGhlIE9wZW5TU0wgZWFybHkgQ2hhbmdlQ2lwaGVyU3BlYyAoQ0NTKSB2dWxuZXJhYmlsaXR5IChDVkUtMjAxNC0wMjI0KS4KLSAqLwotQFNlY3VyaXR5VGVzdAotcHVibGljIGNsYXNzIE9wZW5TU0xFYXJseUNDU1Rlc3QgZXh0ZW5kcyBJbnN0cnVtZW50YXRpb25UZXN0Q2FzZSB7Ci0KLSAgICAvLyBJTVBMRU1FTlRBVElPTiBOT1RFOiBUaGlzIHRlc3Qgc3Bhd25zIGFuIFNTTFNvY2tldCBjbGllbnQsIFNTTFNlcnZlclNvY2tldCBzZXJ2ZXIsIGFuZCBhCi0gICAgLy8gTWFuLWluLVRoZS1NaWRkbGUgKE1pVE0pLiBUaGUgY2xpZW50IGNvbm5lY3RzIHRvIHRoZSBNaVRNIHdoaWNoIHRoZW4gY29ubmVjdHMgdG8gdGhlIHNlcnZlcgotICAgIC8vIGFuZCBzdGFydHMgZm9yd2FyZGluZyBhbGwgVExTIHJlY29yZHMgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCB0aGUgc2VydmVyLiBJbiB0ZXN0cyB0aGF0IGNoZWNrCi0gICAgLy8gZm9yIHRoZSBlYXJseSBDQ1MgdnVsbmVyYWJpbGl0eSwgdGhlIE1pVE0gYWxzbyBpbmplY3RzIGFuIGVhcmx5IENoYW5nZUNpcGhlclNwZWMgcmVjb3JkIGludG8KLSAgICAvLyB0aGUgdHJhZmZpYyB0byB3aGljaCBhIGNvcnJlY3RseSBpbXBsZW1lbnRlZCBwZWVyIGlzIHN1cHBvc2VkIHRvIHJlcGx5IGJ5IGltbWVkaWF0ZWx5Ci0gICAgLy8gYWJvcnRpbmcgdGhlIFRMUyBoYW5kc2hha2Ugd2l0aCBhbiB1bmV4cGVjdGVkX21lc3NhZ2UgZmF0YWwgYWxlcnQuCi0KLSAgICAvLyBJTVBMRU1FTlRBVElPTiBOT1RFOiBUaGlzIHRlc3Qgc3Bhd25zIHNldmVyYWwgYmFja2dyb3VuZCB0aHJlYWRzIHRoYXQgcGVyZm9ybSBuZXR3b3JrIEkvTwotICAgIC8vIG9uIGxvY2FsaG9zdC4gVG8gZW5zdXJlIHRoYXQgdGhlc2UgYmFja2dyb3VuZCB0aHJlYWRzIGFyZSBjbGVhbmVkIHVwIGF0IHRoZSBlbmQgb2YgdGhlIHRlc3QsCi0gICAgLy8gdGVhckRvd24oKSBraWxscyB0aGUgc29ja2V0cyB0aGV5IG1heSBiZSB1c2luZy4gVG8gYWlkIHRoaXMgYmVoYXZpb3IsIGFsbCBTb2NrZXQgYW5kCi0gICAgLy8gU2VydmVyU29ja2V0IGluc3RhbmNlcyBhcmUgYXZhaWxhYmxlIGFzIGZpZWxkcyBvZiB0aGlzIGNsYXNzLiBUaGVzZSBmaWVsZHMgc2hvdWxkIGJlIGFjY2Vzc2VkCi0gICAgLy8gdmlhIHNldHRlcnMgYW5kIGdldHRlcnMgdG8gYXZvaWQgbWVtb3J5IHZpc2liaWxpdHkgaXNzdWVzIGR1ZSB0byBjb25jdXJyZW5jeS4KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBPcGVuU1NMRWFybHlDQ1NUZXN0LmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKLQotICAgIHByaXZhdGUgU1NMU2VydmVyU29ja2V0IG1TZXJ2ZXJMaXN0ZW5pbmdTb2NrZXQ7Ci0gICAgcHJpdmF0ZSBTU0xTb2NrZXQgbVNlcnZlclNvY2tldDsKLSAgICBwcml2YXRlIFNTTFNvY2tldCBtQ2xpZW50U29ja2V0OwotICAgIHByaXZhdGUgU2VydmVyU29ja2V0IG1NaXRtTGlzdGVuaW5nU29ja2V0OwotICAgIHByaXZhdGUgU29ja2V0IG1NaXRtU2VydmVyU29ja2V0OwotICAgIHByaXZhdGUgU29ja2V0IG1NaXRtQ2xpZW50U29ja2V0OwotICAgIHByaXZhdGUgRXhlY3V0b3JTZXJ2aWNlIG1FeGVjdXRvclNlcnZpY2U7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbUNDU1dhc0luamVjdGVkOwotICAgIHByaXZhdGUgVGxzUmVjb3JkIG1GaXJzdFJlY29yZFJlY2VpdmVkQWZ0ZXJDQ1NXYXNJbmplY3RlZDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUZpcnN0UmVjb3JkUmVjZWl2ZWRBZnRlckNDU1dhc0luamVjdGVkTWF5QmVFbmNyeXB0ZWQ7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBMb2cuaShUQUcsICJUZWFyaW5nIGRvd24iKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChtRXhlY3V0b3JTZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtRXhlY3V0b3JTZXJ2aWNlLnNodXRkb3duTm93KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBPcGVuU1NMSGVhcnRibGVlZFRlc3QuY2xvc2VRdWlldGx5KGdldFNlcnZlckxpc3RlbmluZ1NvY2tldCgpKTsKLSAgICAgICAgICAgIE9wZW5TU0xIZWFydGJsZWVkVGVzdC5jbG9zZVF1aWV0bHkoZ2V0U2VydmVyU29ja2V0KCkpOwotICAgICAgICAgICAgT3BlblNTTEhlYXJ0YmxlZWRUZXN0LmNsb3NlUXVpZXRseShnZXRDbGllbnRTb2NrZXQoKSk7Ci0gICAgICAgICAgICBPcGVuU1NMSGVhcnRibGVlZFRlc3QuY2xvc2VRdWlldGx5KGdldE1pdG1MaXN0ZW5pbmdTb2NrZXQoKSk7Ci0gICAgICAgICAgICBPcGVuU1NMSGVhcnRibGVlZFRlc3QuY2xvc2VRdWlldGx5KGdldE1pdG1TZXJ2ZXJTb2NrZXQoKSk7Ci0gICAgICAgICAgICBPcGVuU1NMSGVhcnRibGVlZFRlc3QuY2xvc2VRdWlldGx5KGdldE1pdG1DbGllbnRTb2NrZXQoKSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBzdXBlci50ZWFyRG93bigpOwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiVGVhciBkb3duIGNvbXBsZXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhhdCBUTFMgaGFuZHNoYWtlIHN1Y2NlZWRzIHdoZW4gdGhlIE1pVE0gc2ltcGx5IGZvcndhcmRzIGFsbCBkYXRhIHdpdGhvdXQgdGFtcGVyaW5nCi0gICAgICogd2l0aCBpdC4gVGhpcyBpcyB0byBjYXRjaCBpc3N1ZXMgdW5yZWxhdGVkIHRvIGVhcmx5IENDUy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2l0aG91dEVhcmx5Q0NTKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGhhbmRzaGFrZShmYWxzZSwgZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHdoZXRoZXIgY2xpZW50IHNvY2tldHMgYXJlIHZ1bG5lcmFibGUgdG8gZWFybHkgQ0NTLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RFYXJseUNDU0luamVjdGVkSW50b0NsaWVudCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBjaGVja0Vhcmx5Q0NTKHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHdoZXRoZXIgc2VydmVyIHNvY2tldHMgYXJlIHZ1bG5lcmFibGUgdG8gZWFybHkgQ0NTLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RFYXJseUNDU0luamVjdGVkSW50b1NlcnZlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBjaGVja0Vhcmx5Q0NTKGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyBmb3IgdGhlIGVhcmx5IENDUyB2dWxuZXJhYmlsaXR5LgotICAgICAqCi0gICAgICogQHBhcmFtIGNsaWVudCB7QGNvZGUgdHJ1ZX0gdG8gdGVzdCB0aGUgY2xpZW50LCB7QGNvZGUgZmFsc2V9IHRvIHRlc3QgdGhlIHNlcnZlci4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tFYXJseUNDUyhib29sZWFuIGNsaWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIElNUExFTUVOVEFUSU9OIE5PVEU6IFRoZSBNaVRNIGlzIGZvcndhcmRpbmcgYWxsIFRMUyByZWNvcmRzIGJldHdlZW4gdGhlIGNsaWVudCBhbmQgdGhlCi0gICAgICAgIC8vIHNlcnZlciB1bm1vZGlmaWVkLiBBZGRpdGlvbmFsbHksIHRoZSBNaVRNIHRyYW5zbWl0cyBhbiBlYXJseSBDaGFuZ2VDaXBoZXJTcGVjIHRvIHNlcnZlcgotICAgICAgICAvLyAoaWYgImNsaWVudCIgYXJndW1lbnQgaXMgZmFsc2UpIHJpZ2h0IGJlZm9yZSBjbGllbnQncyBDbGllbnRLZXlFeGNoYW5nZSBvciB0byBjbGllbnQgKGlmCi0gICAgICAgIC8vICJjbGllbnQiIGFyZ3VtZW50IGlzIHRydWUpIHJpZ2h0IGJlZm9yZSBzZXJ2ZXIncyBDZXJ0aWZpY2F0ZS4gVGhlIHBlZXIgaXMgZXhwZWN0ZWQgdG8KLSAgICAgICAgLy8gdG8gYWJvcnQgdGhlIGhhbmRzaGFrZSBpbW1lZGlhdGVseSB3aXRoIHVuZXhwZWN0ZWRfbWVzc2FnZSBhbGVydC4KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGhhbmRzaGFrZSh0cnVlLCBjbGllbnQpOwotICAgICAgICAgICAgLy8gVExTIGhhbmRzaGFrZSBzdWNjZWVkZWQKLSAgICAgICAgICAgIGFzc2VydFRydWUoIkVhcmx5IENDUyBpbmplY3RlZCIsIHdhc0NDU0luamVjdGVkKCkpOwotICAgICAgICAgICAgZmFpbCgiSGFuZHNoYWtlIHN1Y2NlZWRlZCBkZXNwaXRlIGVhcmx5IENDUyBoYXZpbmcgYmVlbiBpbmplY3RlZCIpOwotICAgICAgICB9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gVExTIGhhbmRzaGFrZSBmYWlsZWQKLSAgICAgICAgICAgIGFzc2VydFRydWUoIkVhcmx5IENDUyBpbmplY3RlZCIsIHdhc0NDU0luamVjdGVkKCkpOwotICAgICAgICAgICAgVGxzUmVjb3JkIGZpcnN0UmVjb3JkUmVjZWl2ZWRBZnRlckNDU1dhc0luamVjdGVkID0KLSAgICAgICAgICAgICAgICAgICAgZ2V0Rmlyc3RSZWNvcmRSZWNlaXZlZEFmdGVyQ0NTV2FzSW5qZWN0ZWQoKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoCi0gICAgICAgICAgICAgICAgICAgICJOb3RoaW5nIHJlY2VpdmVkIGFmdGVyIGVhcmx5IENDUyB3YXMgaW5qZWN0ZWQiLAotICAgICAgICAgICAgICAgICAgICBmaXJzdFJlY29yZFJlY2VpdmVkQWZ0ZXJDQ1NXYXNJbmplY3RlZCk7Ci0gICAgICAgICAgICBpZiAoZmlyc3RSZWNvcmRSZWNlaXZlZEFmdGVyQ0NTV2FzSW5qZWN0ZWQucHJvdG9jb2wgPT0gVGxzUHJvdG9jb2xzLkFMRVJUKSB7Ci0gICAgICAgICAgICAgICAgQWxlcnRNZXNzYWdlIGFsZXJ0ID0gQWxlcnRNZXNzYWdlLnRyeVBhcnNlKGZpcnN0UmVjb3JkUmVjZWl2ZWRBZnRlckNDU1dhc0luamVjdGVkKTsKLSAgICAgICAgICAgICAgICBpZiAoKGFsZXJ0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAoYWxlcnQubGV2ZWwgPT0gQWxlcnRNZXNzYWdlLkxFVkVMX0ZBVEFMKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGFsZXJ0LmRlc2NyaXB0aW9uID09IEFsZXJ0TWVzc2FnZS5ERVNDUklQVElPTl9VTkVYUEVDVEVEX01FU1NBR0UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEV4cGVjdGVkL2NvcnJlY3QgcmVzcG9uc2UgdG8gYW4gZWFybHkgQ0NTCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmYWlsKCJTU0xTb2NrZXQgaXMgdnVsbmVyYWJsZSB0byBlYXJseSBDQ1MgaW4gIiArICgoY2xpZW50KSA/ICJjbGllbnQiIDogInNlcnZlciIpCi0gICAgICAgICAgICAgICAgICAgICsgIiBtb2RlOiB1bmV4cGVjdGVkIHJlY29yZCByZWNlaXZlZCBhZnRlciBDQ1Mgd2FzIGluamVjdGVkOiAiCi0gICAgICAgICAgICAgICAgICAgICsgZ2V0UmVjb3JkSW5mbygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGaXJzdFJlY29yZFJlY2VpdmVkQWZ0ZXJDQ1NXYXNJbmplY3RlZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEZpcnN0UmVjb3JkUmVjZWl2ZWRBZnRlckNDU1dhc0luamVjdGVkTWF5QmVFbmNyeXB0ZWQoKSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnRzIHRoZSBjbGllbnQsIHNlcnZlciwgYW5kIHRoZSBNaVRNLiBNYWtlcyB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIgcGVyZm9ybSBhIFRMUyBoYW5kc2hha2UKLSAgICAgKiBhbmQgZXhjaGFuZ2UgYXBwbGljYXRpb24tbGV2ZWwgZGF0YS4gVGhlIE1pVE0gaW5qZWN0cyBhIENoYW5nZUNpcGhlclNwZWMgcmVjb3JkIGlmIHJlcXVlc3RlZAotICAgICAqIGJ5IHtAY29kZSBlYXJseUNDU0luamVjdGVkfS4gVGhlIGRpcmVjdGlvbiBvZiB0aGUgaW5qZWN0ZWQgbWVzc2FnZSBpcyBzcGVjaWZpZWQgYnkKLSAgICAgKiB7QGNvZGUgaW5qZWN0ZWRJbnRvQ2xpZW50fS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaGFuZHNoYWtlKAotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBlYXJseUNDU0luamVjdGVkLAotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpbmplY3RlZEludG9DbGllbnQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtRXhlY3V0b3JTZXJ2aWNlID0gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbCg0KTsKLSAgICAgICAgc2V0U2VydmVyTGlzdGVuaW5nU29ja2V0KHNlcnZlckJpbmQoKSk7Ci0gICAgICAgIGZpbmFsIFNvY2tldEFkZHJlc3Mgc2VydmVyQWRkcmVzcyA9IGdldFNlcnZlckxpc3RlbmluZ1NvY2tldCgpLmdldExvY2FsU29ja2V0QWRkcmVzcygpOwotICAgICAgICBMb2cuaShUQUcsICJTZXJ2ZXIgYm91bmQgdG8gIiArIHNlcnZlckFkZHJlc3MpOwotCi0gICAgICAgIHNldE1pdG1MaXN0ZW5pbmdTb2NrZXQobWl0bUJpbmQoKSk7Ci0gICAgICAgIGZpbmFsIFNvY2tldEFkZHJlc3MgbWl0bUFkZHJlc3MgPSBnZXRNaXRtTGlzdGVuaW5nU29ja2V0KCkuZ2V0TG9jYWxTb2NrZXRBZGRyZXNzKCk7Ci0gICAgICAgIExvZy5pKFRBRywgIk1pVE0gYm91bmQgdG8gIiArIG1pdG1BZGRyZXNzKTsKLQotICAgICAgICAvLyBTdGFydCB0aGUgTWlUTSBkYWVtb24gaW4gdGhlIGJhY2tncm91bmQKLSAgICAgICAgbUV4ZWN1dG9yU2VydmljZS5zdWJtaXQobmV3IENhbGxhYmxlPFZvaWQ+KCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgVm9pZCBjYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgbWl0bUFjY2VwdEFuZEZvcndhcmQoc2VydmVyQWRkcmVzcywgZWFybHlDQ1NJbmplY3RlZCwgaW5qZWN0ZWRJbnRvQ2xpZW50KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIC8vIFN0YXJ0IHRoZSBzZXJ2ZXIgaW4gdGhlIGJhY2tncm91bmQKLSAgICAgICAgRnV0dXJlPFZvaWQ+IHNlcnZlckZ1dHVyZSA9IG1FeGVjdXRvclNlcnZpY2Uuc3VibWl0KG5ldyBDYWxsYWJsZTxWb2lkPigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIFZvaWQgY2FsbCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgICAgIHNlcnZlckFjY2VwdEFuZEhhbmRzaGFrZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgLy8gU3RhcnQgdGhlIGNsaWVudCBpbiB0aGUgYmFja2dyb3VuZAotICAgICAgICBGdXR1cmU8Vm9pZD4gY2xpZW50RnV0dXJlID0gbUV4ZWN1dG9yU2VydmljZS5zdWJtaXQobmV3IENhbGxhYmxlPFZvaWQ+KCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgVm9pZCBjYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgY2xpZW50Q29ubmVjdEFuZEhhbmRzaGFrZShtaXRtQWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8vIFdhaXQgZm9yIGJvdGggY2xpZW50IGFuZCBzZXJ2ZXIgdG8gdGVybWluYXRlLCB0byBlbnN1cmUgdGhhdCB3ZSBvYnNlcnZlIGFsbCB0aGUgdHJhZmZpYwotICAgICAgICAvLyBleGNoYW5nZWQgYmV0d2VlbiB0aGVtLiBUaHJvdyBhbiBleGNlcHRpb24gaWYgb25lIG9mIHRoZW0gZmFpbGVkLgotICAgICAgICBMb2cuaShUQUcsICJXYWl0aW5nIGZvciBjbGllbnQiKTsKLSAgICAgICAgLy8gV2FpdCBmb3IgdGhlIGNsaWVudCwgYnV0IGRvbid0IHlldCB0aHJvdyBhbiBleGNlcHRpb24gaWYgaXQgZmFpbGVkLgotICAgICAgICBFeGNlcHRpb24gY2xpZW50RXhjZXB0aW9uID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNsaWVudEZ1dHVyZS5nZXQoMTAsIFRpbWVVbml0LlNFQ09ORFMpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgY2xpZW50RXhjZXB0aW9uID0gZTsKLSAgICAgICAgfQotICAgICAgICBMb2cuaShUQUcsICJXYWl0aW5nIGZvciBzZXJ2ZXIiKTsKLSAgICAgICAgLy8gV2FpdCBmb3IgdGhlIHNlcnZlciBhbmQgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGl0IGZhaWxlZC4KLSAgICAgICAgc2VydmVyRnV0dXJlLmdldCg1LCBUaW1lVW5pdC5TRUNPTkRTKTsKLSAgICAgICAgLy8gVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBjbGllbnQgZmFpbGVkLgotICAgICAgICBpZiAoY2xpZW50RXhjZXB0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IGNsaWVudEV4Y2VwdGlvbjsKLSAgICAgICAgfQotICAgICAgICBMb2cuaShUQUcsICJIYW5kc2hha2UgY29tcGxldGVkIGFuZCBhcHBsaWNhdGlvbiBkYXRhIGV4Y2hhbmdlZCIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjbGllbnRDb25uZWN0QW5kSGFuZHNoYWtlKFNvY2tldEFkZHJlc3Mgc2VydmVyQWRkcmVzcykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNTTENvbnRleHQgc3NsQ29udGV4dCA9IFNTTENvbnRleHQuZ2V0SW5zdGFuY2UoIlRMUyIpOwotICAgICAgICBzc2xDb250ZXh0LmluaXQoCi0gICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICBuZXcgVHJ1c3RNYW5hZ2VyW10ge25ldyBUcnVzdEFsbFg1MDlUcnVzdE1hbmFnZXIoKX0sCi0gICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgIFNTTFNvY2tldCBzb2NrZXQgPSAoU1NMU29ja2V0KSBzc2xDb250ZXh0LmdldFNvY2tldEZhY3RvcnkoKS5jcmVhdGVTb2NrZXQoKTsKLSAgICAgICAgc2V0Q2xpZW50U29ja2V0KHNvY2tldCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICJDbGllbnQgY29ubmVjdGluZyB0byAiICsgc2VydmVyQWRkcmVzcyk7Ci0gICAgICAgICAgICBzb2NrZXQuY29ubmVjdChzZXJ2ZXJBZGRyZXNzKTsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIkNsaWVudCBjb25uZWN0ZWQgdG8gc2VydmVyIGZyb20gIiArIHNvY2tldC5nZXRMb2NhbFNvY2tldEFkZHJlc3MoKSk7Ci0gICAgICAgICAgICAvLyBFbnN1cmUgYSBUTFMgaGFuZHNoYWtlIGlzIHBlcmZvcm1lZCBhbmQgYW4gZXhjZXB0aW9uIGlzIHRocm93biBpZiBpdCBmYWlscy4KLSAgICAgICAgICAgIHNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKS53cml0ZSgiY2xpZW50Ii5nZXRCeXRlcygpKTsKLSAgICAgICAgICAgIHNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKS5mbHVzaCgpOwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiQ2xpZW50IHNlbnQgcmVxdWVzdC4gUmVhZGluZyByZXNwb25zZSIpOwotICAgICAgICAgICAgaW50IGIgPSBzb2NrZXQuZ2V0SW5wdXRTdHJlYW0oKS5yZWFkKCk7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICJDbGllbnQgcmVhZCByZXNwb25zZTogIiArIGIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSB0ZXN0IGxvZyBpbmNsdWRlcyBleGNlcHRpb25zIGZyb20gYWxsIHBhcnRpZXMgaW52b2x2ZWQuCi0gICAgICAgICAgICBMb2cudyhUQUcsICJDbGllbnQgZmFpbGVkIiwgZSk7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBzb2NrZXQuY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU1NMU2VydmVyU29ja2V0IHNlcnZlckJpbmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gTG9hZCB0aGUgc2VydmVyJ3MgcHJpdmF0ZSBrZXkgYW5kIGNlcnQgY2hhaW4KLSAgICAgICAgS2V5RmFjdG9yeSBrZXlGYWN0b3J5ID0gS2V5RmFjdG9yeS5nZXRJbnN0YW5jZSgiUlNBIik7Ci0gICAgICAgIFByaXZhdGVLZXkgcHJpdmF0ZUtleSA9IGtleUZhY3RvcnkuZ2VuZXJhdGVQcml2YXRlKG5ldyBQS0NTOEVuY29kZWRLZXlTcGVjKAotICAgICAgICAgICAgICAgIE9wZW5TU0xIZWFydGJsZWVkVGVzdC5yZWFkUmVzb3VyY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRDb250ZXh0KCksIFIucmF3Lm9wZW5zc2xfaGVhcnRibGVlZF90ZXN0X2tleSkpKTsKLSAgICAgICAgQ2VydGlmaWNhdGVGYWN0b3J5IGNlcnRGYWN0b3J5ID0gQ2VydGlmaWNhdGVGYWN0b3J5LmdldEluc3RhbmNlKCJYLjUwOSIpOwotICAgICAgICBYNTA5Q2VydGlmaWNhdGVbXSBjZXJ0Q2hhaW4gPSAgbmV3IFg1MDlDZXJ0aWZpY2F0ZVtdIHsKLSAgICAgICAgICAgICAgICAoWDUwOUNlcnRpZmljYXRlKSBjZXJ0RmFjdG9yeS5nZW5lcmF0ZUNlcnRpZmljYXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKE9wZW5TU0xIZWFydGJsZWVkVGVzdC5yZWFkUmVzb3VyY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpLmdldENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5yYXcub3BlbnNzbF9oZWFydGJsZWVkX3Rlc3RfY2VydCkpKQotICAgICAgICB9OwotCi0gICAgICAgIC8vIEluaXRpYWxpemUgVExTIGNvbnRleHQgdG8gdXNlIHRoZSBwcml2YXRlIGtleSBhbmQgY2VydCBjaGFpbiBmb3Igc2VydmVyIHNvY2tldHMKLSAgICAgICAgU1NMQ29udGV4dCBzc2xDb250ZXh0ID0gU1NMQ29udGV4dC5nZXRJbnN0YW5jZSgiVExTIik7Ci0gICAgICAgIHNzbENvbnRleHQuaW5pdCgKLSAgICAgICAgICAgICAgICBuZXcgS2V5TWFuYWdlcltdIHtuZXcgSGFyZGNvZGVkQ2VydFg1MDlLZXlNYW5hZ2VyKHByaXZhdGVLZXksIGNlcnRDaGFpbil9LAotICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgbnVsbCk7Ci0KLSAgICAgICAgTG9nLmkoVEFHLCAiU2VydmVyIGJpbmRpbmcgdG8gbG9jYWwgcG9ydCIpOwotICAgICAgICByZXR1cm4gKFNTTFNlcnZlclNvY2tldCkgc3NsQ29udGV4dC5nZXRTZXJ2ZXJTb2NrZXRGYWN0b3J5KCkuY3JlYXRlU2VydmVyU29ja2V0KDApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXJ2ZXJBY2NlcHRBbmRIYW5kc2hha2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU1NMU29ja2V0IHNvY2tldCA9IG51bGw7Ci0gICAgICAgIFNTTFNlcnZlclNvY2tldCBzZXJ2ZXJTb2NrZXQgPSBnZXRTZXJ2ZXJMaXN0ZW5pbmdTb2NrZXQoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIlNlcnZlciBsaXN0ZW5pbmcgZm9yIGluY29taW5nIGNvbm5lY3Rpb24iKTsKLSAgICAgICAgICAgIHNvY2tldCA9IChTU0xTb2NrZXQpIHNlcnZlclNvY2tldC5hY2NlcHQoKTsKLSAgICAgICAgICAgIHNldFNlcnZlclNvY2tldChzb2NrZXQpOwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiU2VydmVyIGFjY2VwdGVkIGNvbm5lY3Rpb24gZnJvbSAiICsgc29ja2V0LmdldFJlbW90ZVNvY2tldEFkZHJlc3MoKSk7Ci0gICAgICAgICAgICAvLyBFbnN1cmUgYSBUTFMgaGFuZHNoYWtlIGlzIHBlcmZvcm1lZCBhbmQgYW4gZXhjZXB0aW9uIGlzIHRocm93biBpZiBpdCBmYWlscy4KLSAgICAgICAgICAgIHNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKS53cml0ZSgic2VydmVyIi5nZXRCeXRlcygpKTsKLSAgICAgICAgICAgIHNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKS5mbHVzaCgpOwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiU2VydmVyIHNlbnQgcmVwbHkuIFJlYWRpbmcgcmVzcG9uc2UiKTsKLSAgICAgICAgICAgIGludCBiID0gc29ja2V0LmdldElucHV0U3RyZWFtKCkucmVhZCgpOwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiU2VydmVyIHJlYWQgcmVzcG9uc2U6ICIgKyBiKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgdGVzdCBsb2cgaW5jbHVkZXMgZXhjZXB0aW9ucyBmcm9tIGFsbCBwYXJ0aWVzIGludm9sdmVkLgotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2VydmVyIGZhaWxlZCIsIGUpOwotICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChzb2NrZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNvY2tldC5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTZXJ2ZXJTb2NrZXQgbWl0bUJpbmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTG9nLmkoVEFHLCAiTWlUTSBiaW5kaW5nIHRvIGxvY2FsIHBvcnQiKTsKLSAgICAgICAgcmV0dXJuIFNlcnZlclNvY2tldEZhY3RvcnkuZ2V0RGVmYXVsdCgpLmNyZWF0ZVNlcnZlclNvY2tldCgwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBY2NlcHRzIHRoZSBjb25uZWN0aW9uIG9uIHRoZSBNaVRNIGxpc3RlbmluZyBzb2NrZXQsIGZvcndhcmRzIHRoZSBUTFMgcmVjb3JkcyBiZXR3ZWVuIHRoZQotICAgICAqIGNsaWVudCBhbmQgdGhlIHNlcnZlciwgYW5kLCBpZiByZXF1ZXN0ZWQsIGluamVjdHMgYW4gZWFybHkge0Bjb2RlIENoYW5nZUNpcGhlclNwZWN9IHJlY29yZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmplY3RFYXJseUNDUyB3aGV0aGVyIHRvIGluamVjdCBhbiBlYXJseSB7QGNvZGUgQ2hhbmdlQ2lwaGVyU3BlY30gcmVjb3JkLgotICAgICAqIEBwYXJhbSBpbmplY3RJbnRvQ2xpZW50IHdoZW4ge0Bjb2RlIGluamVjdEVhcmx5Q0NTfSBpcyB7QGNvZGUgdHJ1ZX0sIHdoZXRoZXIgdG8gaW5qZWN0IHRoZQotICAgICAqICAgICAgICB7QGNvZGUgQ2hhbmdlQ2lwaGVyU3BlY30gcmVjb3JkIGludG8gY2xpZW50IG9yIGludG8gc2VydmVyLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBtaXRtQWNjZXB0QW5kRm9yd2FyZCgKLSAgICAgICAgICAgIFNvY2tldEFkZHJlc3Mgc2VydmVyQWRkcmVzcywKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaW5qZWN0RWFybHlDQ1MsCi0gICAgICAgICAgICBmaW5hbCBib29sZWFuIGluamVjdEludG9DbGllbnQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTb2NrZXQgY2xpZW50U29ja2V0ID0gbnVsbDsKLSAgICAgICAgU29ja2V0IHNlcnZlclNvY2tldCA9IG51bGw7Ci0gICAgICAgIFNlcnZlclNvY2tldCBsaXN0ZW5pbmdTb2NrZXQgPSBnZXRNaXRtTGlzdGVuaW5nU29ja2V0KCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICJNaVRNIHdhaXRpbmcgZm9yIGluY29taW5nIGNvbm5lY3Rpb24iKTsKLSAgICAgICAgICAgIGNsaWVudFNvY2tldCA9IGxpc3RlbmluZ1NvY2tldC5hY2NlcHQoKTsKLSAgICAgICAgICAgIHNldE1pdG1DbGllbnRTb2NrZXQoY2xpZW50U29ja2V0KTsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIk1pVE0gYWNjZXB0ZWQgY29ubmVjdGlvbiBmcm9tICIgKyBjbGllbnRTb2NrZXQuZ2V0UmVtb3RlU29ja2V0QWRkcmVzcygpKTsKLSAgICAgICAgICAgIHNlcnZlclNvY2tldCA9IFNvY2tldEZhY3RvcnkuZ2V0RGVmYXVsdCgpLmNyZWF0ZVNvY2tldCgpOwotICAgICAgICAgICAgc2V0TWl0bVNlcnZlclNvY2tldChzZXJ2ZXJTb2NrZXQpOwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiTWlUTSBjb25uZWN0aW5nIHRvIHNlcnZlciAiICsgc2VydmVyQWRkcmVzcyk7Ci0gICAgICAgICAgICBzZXJ2ZXJTb2NrZXQuY29ubmVjdChzZXJ2ZXJBZGRyZXNzLCAxMDAwMCk7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICJNaVRNIGNvbm5lY3RlZCB0byBzZXJ2ZXIgZnJvbSAiICsgc2VydmVyU29ja2V0LmdldExvY2FsU29ja2V0QWRkcmVzcygpKTsKLSAgICAgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIHNlcnZlcklucHV0U3RyZWFtID0gc2VydmVyU29ja2V0LmdldElucHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICBmaW5hbCBPdXRwdXRTdHJlYW0gY2xpZW50T3V0cHV0U3RyZWFtID0gY2xpZW50U29ja2V0LmdldE91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgRnV0dXJlPFZvaWQ+IHNlcnZlclRvQ2xpZW50VGFzayA9IG1FeGVjdXRvclNlcnZpY2Uuc3VibWl0KG5ldyBDYWxsYWJsZTxWb2lkPigpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgVm9pZCBjYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEluamVjdCBlYXJseSBDaGFuZ2VDaXBoZXJTcGVjIGJlZm9yZSBDZXJ0aWZpY2F0ZSwgaWYgcmVxdWVzdGVkCi0gICAgICAgICAgICAgICAgICAgIGZvcndhcmRUbHNSZWNvcmRzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaVRNIFMtPkMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlcklucHV0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudE91dHB1dFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5qZWN0RWFybHlDQ1MgJiYgaW5qZWN0SW50b0NsaWVudCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBIYW5kc2hha2VNZXNzYWdlLlRZUEVfQ0VSVElGSUNBVEUgOiAtMSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgLy8gSW5qZWN0IGVhcmx5IENoYW5nZUNpcGhlclNwZWMgYmVmb3JlIENsaWVudEtleUV4Y2hhbmdlLCBpZiByZXF1ZXN0ZWQKLSAgICAgICAgICAgIGZvcndhcmRUbHNSZWNvcmRzKAotICAgICAgICAgICAgICAgICAgICAiTWlUTSBDLT5TIiwKLSAgICAgICAgICAgICAgICAgICAgY2xpZW50U29ja2V0LmdldElucHV0U3RyZWFtKCksCi0gICAgICAgICAgICAgICAgICAgIHNlcnZlclNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKSwKLSAgICAgICAgICAgICAgICAgICAgKGluamVjdEVhcmx5Q0NTICYmICFpbmplY3RJbnRvQ2xpZW50KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gSGFuZHNoYWtlTWVzc2FnZS5UWVBFX0NMSUVOVF9LRVlfRVhDSEFOR0UgOiAtMSk7Ci0gICAgICAgICAgICBzZXJ2ZXJUb0NsaWVudFRhc2suZ2V0KDEwLCBUaW1lVW5pdC5TRUNPTkRTKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgdGVzdCBsb2cgaW5jbHVkZXMgZXhjZXB0aW9ucyBmcm9tIGFsbCBwYXJ0aWVzIGludm9sdmVkLgotICAgICAgICAgICAgTG9nLncoVEFHLCAiTWlUTSBmYWlsZWQiLCBlKTsKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBPcGVuU1NMSGVhcnRibGVlZFRlc3QuY2xvc2VRdWlldGx5KGNsaWVudFNvY2tldCk7Ci0gICAgICAgICAgICBPcGVuU1NMSGVhcnRibGVlZFRlc3QuY2xvc2VRdWlldGx5KHNlcnZlclNvY2tldCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGb3J3YXJkcyBUTFMgcmVjb3JkcyBmcm9tIHRoZSBwcm92aWRlZCB7QGNvZGUgSW5wdXRTdHJlYW19IHRvIHRoZSBwcm92aWRlZAotICAgICAqIHtAY29kZSBPdXRwdXRTdHJlYW19LiBJZiByZXF1ZXN0ZWQsIGluamVjdHMgYW4gZWFybHkge0Bjb2RlIENoYW5nZUNpcGhlclNwZWN9LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBmb3J3YXJkVGxzUmVjb3JkcygKLSAgICAgICAgICAgIFN0cmluZyBsb2dQcmVmaXgsCi0gICAgICAgICAgICBJbnB1dFN0cmVhbSBpbiwKLSAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXQsCi0gICAgICAgICAgICBpbnQgaGFuZHNoYWtlTWVzc2FnZVR5cGVCZWZvcmVXaGljaFRvSW5qZWN0RWFybHlDQ1MpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBMb2cuaShUQUcsIGxvZ1ByZWZpeCArICI6IHJlY29yZCBmb3J3YXJkaW5nIHN0YXJ0ZWQiKTsKLSAgICAgICAgYm9vbGVhbiBpbnRlcmVzdGluZ1JlY29yZHNMb2dnZWQgPQotICAgICAgICAgICAgICAgIGhhbmRzaGFrZU1lc3NhZ2VUeXBlQmVmb3JlV2hpY2hUb0luamVjdEVhcmx5Q0NTID09IC0xOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgVGxzUmVjb3JkUmVhZGVyIHJlYWRlciA9IG5ldyBUbHNSZWNvcmRSZWFkZXIoaW4pOwotICAgICAgICAgICAgYnl0ZVtdIHJlY29yZEJ5dGVzOwotICAgICAgICAgICAgLy8gRnJhZ21lbnRzIGNvbnRhaW5lZCBpbiByZWNvcmRzIG1heSBiZSBlbmNyeXB0ZWQgYWZ0ZXIgYSBjZXJ0YWluIHBvaW50IGluIHRoZQotICAgICAgICAgICAgLy8gaGFuZHNoYWtlLiBPbmNlIHRoZXkgYXJlIGVuY3J5cHRlZCwgdGhpcyBNaVRNIGNhbm5vdCBpbnNwZWN0IHRoZWlyIHBsYWludGV4dCB3aGljaC4KLSAgICAgICAgICAgIGJvb2xlYW4gZnJhZ21lbnRFbmNyeXB0aW9uTWF5QmVFbmFibGVkID0gZmFsc2U7Ci0gICAgICAgICAgICB3aGlsZSAoKHJlY29yZEJ5dGVzID0gcmVhZGVyLnJlYWRSZWNvcmQoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFRsc1JlY29yZCByZWNvcmQgPSBUbHNSZWNvcmQucGFyc2UocmVjb3JkQnl0ZXMpOwotICAgICAgICAgICAgICAgIGZvcndhcmRUbHNSZWNvcmQobG9nUHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkQnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICByZWNvcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICBmcmFnbWVudEVuY3J5cHRpb25NYXlCZUVuYWJsZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmVzdGluZ1JlY29yZHNMb2dnZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kc2hha2VNZXNzYWdlVHlwZUJlZm9yZVdoaWNoVG9JbmplY3RFYXJseUNDUyk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlY29yZC5wcm90b2NvbCA9PSBUbHNQcm90b2NvbHMuQ0hBTkdFX0NJUEhFUl9TUEVDKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZyYWdtZW50RW5jcnlwdGlvbk1heUJlRW5hYmxlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgTG9nLmQoVEFHLCBsb2dQcmVmaXggKyAiOiByZWNvcmQgZm9yd2FyZGluZyBmaW5pc2hlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGZvcndhcmRUbHNSZWNvcmQoCi0gICAgICAgICAgICBTdHJpbmcgbG9nUHJlZml4LAotICAgICAgICAgICAgYnl0ZVtdIHJlY29yZEJ5dGVzLAotICAgICAgICAgICAgVGxzUmVjb3JkIHJlY29yZCwKLSAgICAgICAgICAgIGJvb2xlYW4gZnJhZ21lbnRFbmNyeXB0aW9uTWF5QmVFbmFibGVkLAotICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dCwKLSAgICAgICAgICAgIGJvb2xlYW4gaW50ZXJlc3RpbmdSZWNvcmRzTG9nZ2VkLAotICAgICAgICAgICAgaW50IGhhbmRzaGFrZU1lc3NhZ2VUeXBlQmVmb3JlV2hpY2hUb0luamVjdENDUykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gU2F2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVjb3JkIGlmIGl0J3Mgb2YgaW50ZXJlc3QgdG8gdGhpcyB0ZXN0Ci0gICAgICAgIGlmIChpbnRlcmVzdGluZ1JlY29yZHNMb2dnZWQpIHsKLSAgICAgICAgICAgIGlmICh3YXNDQ1NJbmplY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgc2V0Rmlyc3RSZWNvcmRSZWNlaXZlZEFmdGVyQ0NTV2FzSW5qZWN0ZWQocmVjb3JkLCBmcmFnbWVudEVuY3J5cHRpb25NYXlCZUVuYWJsZWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKChyZWNvcmQucHJvdG9jb2wgPT0gVGxzUHJvdG9jb2xzLkNIQU5HRV9DSVBIRVJfU1BFQykKLSAgICAgICAgICAgICAgICAmJiAoaGFuZHNoYWtlTWVzc2FnZVR5cGVCZWZvcmVXaGljaFRvSW5qZWN0Q0NTICE9IC0xKSkgewotICAgICAgICAgICAgLy8gRG8gbm90IGZvcndhcmQgb3JpZ2luYWwgQ2hhbmdlQ2lwaGVyU3BlYyByZWNvcmQocykgaWYgd2UncmUgaW5qZWN0aW5nIHN1Y2ggYSByZWNvcmQKLSAgICAgICAgICAgIC8vIG91cnNlbHZlcy4gVGhpcyBpcyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgcGVlciBzZWVzIG9ubHkgb25lIENoYW5nZUNpcGhlclNwZWMuCi0gICAgICAgICAgICBMb2cuaShUQUcsIGxvZ1ByZWZpeCArICI6IERyb3BwaW5nIFRMUyByZWNvcmQuICIKLSAgICAgICAgICAgICAgICAgICAgKyBnZXRSZWNvcmRJbmZvKHJlY29yZCwgZnJhZ21lbnRFbmNyeXB0aW9uTWF5QmVFbmFibGVkKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJbmplY3QgYSBDaGFuZ2VDaXBoZXJTcGVjLCBpZiBuZWNlc3NhcnksIGJlZm9yZSB0aGUgc3BlY2lmaWVkIGhhbmRzaGFrZSBtZXNzYWdlIHR5cGUKLSAgICAgICAgaWYgKGhhbmRzaGFrZU1lc3NhZ2VUeXBlQmVmb3JlV2hpY2hUb0luamVjdENDUyAhPSAtMSkgewotICAgICAgICAgICAgaWYgKCghZnJhZ21lbnRFbmNyeXB0aW9uTWF5QmVFbmFibGVkKSAmJiAoT3BlblNTTEhlYXJ0YmxlZWRUZXN0LmlzSGFuZHNoYWtlTWVzc2FnZVR5cGUoCi0gICAgICAgICAgICAgICAgICAgIHJlY29yZCwgaGFuZHNoYWtlTWVzc2FnZVR5cGVCZWZvcmVXaGljaFRvSW5qZWN0Q0NTKSkpIHsKLSAgICAgICAgICAgICAgICBMb2cuaShUQUcsIGxvZ1ByZWZpeCArICI6IEluamVjdGluZyBDaGFuZ2VDaXBoZXJTcGVjIik7Ci0gICAgICAgICAgICAgICAgc2V0Q0NTV2FzSW5qZWN0ZWQoKTsKLSAgICAgICAgICAgICAgICBvdXQud3JpdGUoY3JlYXRlQ2hhbmdlQ2lwaGVyU3BlY1JlY29yZChyZWNvcmQudmVyc2lvbk1ham9yLCByZWNvcmQudmVyc2lvbk1pbm9yKSk7Ci0gICAgICAgICAgICAgICAgb3V0LmZsdXNoKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBMb2cuaShUQUcsIGxvZ1ByZWZpeCArICI6IEZvcndhcmRpbmcgVExTIHJlY29yZC4gIgotICAgICAgICAgICAgICAgICsgZ2V0UmVjb3JkSW5mbyhyZWNvcmQsIGZyYWdtZW50RW5jcnlwdGlvbk1heUJlRW5hYmxlZCkpOwotICAgICAgICBvdXQud3JpdGUocmVjb3JkQnl0ZXMpOwotICAgICAgICBvdXQuZmx1c2goKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0UmVjb3JkSW5mbyhUbHNSZWNvcmQgcmVjb3JkLCBib29sZWFuIG1heUJlRW5jcnlwdGVkKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChnZXRQcm90b2NvbE5hbWUocmVjb3JkLnByb3RvY29sKSkKLSAgICAgICAgICAgICAgICAuYXBwZW5kKCIsICIpCi0gICAgICAgICAgICAgICAgLmFwcGVuZChnZXRGcmFnbWVudEluZm8ocmVjb3JkLCBtYXlCZUVuY3J5cHRlZCkpOwotICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFByb3RvY29sTmFtZShpbnQgcHJvdG9jb2wpIHsKLSAgICAgICAgc3dpdGNoIChwcm90b2NvbCkgewotICAgICAgICAgICAgY2FzZSBUbHNQcm90b2NvbHMuQUxFUlQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJhbGVydCI7Ci0gICAgICAgICAgICBjYXNlIFRsc1Byb3RvY29scy5BUFBMSUNBVElPTl9EQVRBOgotICAgICAgICAgICAgICAgIHJldHVybiAiYXBwbGljYXRpb24gZGF0YSI7Ci0gICAgICAgICAgICBjYXNlIFRsc1Byb3RvY29scy5DSEFOR0VfQ0lQSEVSX1NQRUM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJjaGFuZ2UgY2lwaGVyIHNwZWMiOwotICAgICAgICAgICAgY2FzZSBUbHNQcm90b2NvbHMuSEFORFNIQUtFOgotICAgICAgICAgICAgICAgIHJldHVybiAiaGFuZHNoYWtlIjsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKHByb3RvY29sKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRGcmFnbWVudEluZm8oVGxzUmVjb3JkIHJlY29yZCwgYm9vbGVhbiBtYXlCZUVuY3J5cHRlZCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGlmIChtYXlCZUVuY3J5cHRlZCkgewotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiZW5jcnlwdGVkPyIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3dpdGNoIChyZWNvcmQucHJvdG9jb2wpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFRsc1Byb3RvY29scy5BTEVSVDoKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgibGV2ZWw6ICIgKyAoKHJlY29yZC5mcmFnbWVudC5sZW5ndGggPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gU3RyaW5nLnZhbHVlT2YocmVjb3JkLmZyYWdtZW50WzBdICYgMHhmZikgOiAibi9hIikKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBkZXNjcmlwdGlvbjogIgotICAgICAgICAgICAgICAgICAgICArICgocmVjb3JkLmZyYWdtZW50Lmxlbmd0aCA+IDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBTdHJpbmcudmFsdWVPZihyZWNvcmQuZnJhZ21lbnRbMV0gJiAweGZmKSA6ICJuL2EiKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgVGxzUHJvdG9jb2xzLkFQUExJQ0FUSU9OX0RBVEE6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgVGxzUHJvdG9jb2xzLkNIQU5HRV9DSVBIRVJfU1BFQzoKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgicGF5bG9hZDogIiArICgocmVjb3JkLmZyYWdtZW50Lmxlbmd0aCA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBTdHJpbmcudmFsdWVPZihyZWNvcmQuZnJhZ21lbnRbMF0gJiAweGZmKSA6ICJuL2EiKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgVGxzUHJvdG9jb2xzLkhBTkRTSEFLRToKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgidHlwZTogIiArICgocmVjb3JkLmZyYWdtZW50Lmxlbmd0aCA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBTdHJpbmcudmFsdWVPZihyZWNvcmQuZnJhZ21lbnRbMF0gJiAweGZmKSA6ICJuL2EiKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgIikuYXBwZW5kKCJmcmFnbWVudCBsZW5ndGg6ICIgKyByZWNvcmQuZnJhZ21lbnQubGVuZ3RoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgc2V0U2VydmVyTGlzdGVuaW5nU29ja2V0KFNTTFNlcnZlclNvY2tldCBzb2NrZXQpIHsKLSAgICAgICAgbVNlcnZlckxpc3RlbmluZ1NvY2tldCA9IHNvY2tldDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCBTU0xTZXJ2ZXJTb2NrZXQgZ2V0U2VydmVyTGlzdGVuaW5nU29ja2V0KCkgewotICAgICAgICByZXR1cm4gbVNlcnZlckxpc3RlbmluZ1NvY2tldDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHNldFNlcnZlclNvY2tldChTU0xTb2NrZXQgc29ja2V0KSB7Ci0gICAgICAgIG1TZXJ2ZXJTb2NrZXQgPSBzb2NrZXQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgU1NMU29ja2V0IGdldFNlcnZlclNvY2tldCgpIHsKLSAgICAgICAgcmV0dXJuIG1TZXJ2ZXJTb2NrZXQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBzZXRDbGllbnRTb2NrZXQoU1NMU29ja2V0IHNvY2tldCkgewotICAgICAgICBtQ2xpZW50U29ja2V0ID0gc29ja2V0OwotICAgIH0KLQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIFNTTFNvY2tldCBnZXRDbGllbnRTb2NrZXQoKSB7Ci0gICAgICAgIHJldHVybiBtQ2xpZW50U29ja2V0OwotICAgIH0KLQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgc2V0TWl0bUxpc3RlbmluZ1NvY2tldChTZXJ2ZXJTb2NrZXQgc29ja2V0KSB7Ci0gICAgICAgIG1NaXRtTGlzdGVuaW5nU29ja2V0ID0gc29ja2V0OwotICAgIH0KLQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIFNlcnZlclNvY2tldCBnZXRNaXRtTGlzdGVuaW5nU29ja2V0KCkgewotICAgICAgICByZXR1cm4gbU1pdG1MaXN0ZW5pbmdTb2NrZXQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBzZXRNaXRtU2VydmVyU29ja2V0KFNvY2tldCBzb2NrZXQpIHsKLSAgICAgICAgbU1pdG1TZXJ2ZXJTb2NrZXQgPSBzb2NrZXQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgU29ja2V0IGdldE1pdG1TZXJ2ZXJTb2NrZXQoKSB7Ci0gICAgICAgIHJldHVybiBtTWl0bVNlcnZlclNvY2tldDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHNldE1pdG1DbGllbnRTb2NrZXQoU29ja2V0IHNvY2tldCkgewotICAgICAgICBtTWl0bUNsaWVudFNvY2tldCA9IHNvY2tldDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCBTb2NrZXQgZ2V0TWl0bUNsaWVudFNvY2tldCgpIHsKLSAgICAgICAgcmV0dXJuIG1NaXRtQ2xpZW50U29ja2V0OwotICAgIH0KLQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgc2V0Q0NTV2FzSW5qZWN0ZWQoKSB7Ci0gICAgICAgIG1DQ1NXYXNJbmplY3RlZCA9IHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgYm9vbGVhbiB3YXNDQ1NJbmplY3RlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1DQ1NXYXNJbmplY3RlZDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHNldEZpcnN0UmVjb3JkUmVjZWl2ZWRBZnRlckNDU1dhc0luamVjdGVkKAotICAgICAgICAgICAgVGxzUmVjb3JkIHJlY29yZCwgYm9vbGVhbiBtYXlCZUVuY3J5cHRlZCkgewotICAgICAgICBpZiAobUZpcnN0UmVjb3JkUmVjZWl2ZWRBZnRlckNDU1dhc0luamVjdGVkID09IG51bGwpIHsKLSAgICAgICAgICAgIG1GaXJzdFJlY29yZFJlY2VpdmVkQWZ0ZXJDQ1NXYXNJbmplY3RlZCA9IHJlY29yZDsKLSAgICAgICAgICAgIG1GaXJzdFJlY29yZFJlY2VpdmVkQWZ0ZXJDQ1NXYXNJbmplY3RlZE1heUJlRW5jcnlwdGVkID0gbWF5QmVFbmNyeXB0ZWQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCBUbHNSZWNvcmQgZ2V0Rmlyc3RSZWNvcmRSZWNlaXZlZEFmdGVyQ0NTV2FzSW5qZWN0ZWQoKSB7Ci0gICAgICAgIHJldHVybiBtRmlyc3RSZWNvcmRSZWNlaXZlZEFmdGVyQ0NTV2FzSW5qZWN0ZWQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgYm9vbGVhbiBnZXRGaXJzdFJlY29yZFJlY2VpdmVkQWZ0ZXJDQ1NXYXNJbmplY3RlZE1heUJlRW5jcnlwdGVkKCkgewotICAgICAgICByZXR1cm4gbUZpcnN0UmVjb3JkUmVjZWl2ZWRBZnRlckNDU1dhc0luamVjdGVkTWF5QmVFbmNyeXB0ZWQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGNyZWF0ZUNoYW5nZUNpcGhlclNwZWNSZWNvcmQoaW50IHZlcnNpb25NYWpvciwgaW50IHZlcnNpb25NaW5vcikgewotICAgICAgICBUbHNSZWNvcmQgcmVjb3JkID0gbmV3IFRsc1JlY29yZCgpOwotICAgICAgICByZWNvcmQucHJvdG9jb2wgPSBUbHNQcm90b2NvbHMuQ0hBTkdFX0NJUEhFUl9TUEVDOwotICAgICAgICByZWNvcmQudmVyc2lvbk1ham9yID0gdmVyc2lvbk1ham9yOwotICAgICAgICByZWNvcmQudmVyc2lvbk1pbm9yID0gdmVyc2lvbk1pbm9yOwotICAgICAgICByZWNvcmQuZnJhZ21lbnQgPSBuZXcgYnl0ZVtdIHsxfTsKLSAgICAgICAgcmV0dXJuIFRsc1JlY29yZC51bnBhcnNlKHJlY29yZCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvc3JjL2FuZHJvaWQvc2VjdXJpdHkvY3RzL09wZW5TU0xIZWFydGJsZWVkVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvc3JjL2FuZHJvaWQvc2VjdXJpdHkvY3RzL09wZW5TU0xIZWFydGJsZWVkVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWE4MmE4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3NyYy9hbmRyb2lkL3NlY3VyaXR5L2N0cy9PcGVuU1NMSGVhcnRibGVlZFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnNlY3VyaXR5LmN0czsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5TZWN1cml0eVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RDYXNlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRU9GRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQ7Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0OwotaW1wb3J0IGphdmEubmV0LlNvY2tldEFkZHJlc3M7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5LZXlGYWN0b3J5OwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmF0ZUtleTsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRmFjdG9yeTsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5QS0NTOEVuY29kZWRLZXlTcGVjOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKLQotaW1wb3J0IGphdmF4Lm5ldC5TZXJ2ZXJTb2NrZXRGYWN0b3J5OwotaW1wb3J0IGphdmF4Lm5ldC5Tb2NrZXRGYWN0b3J5OwotaW1wb3J0IGphdmF4Lm5ldC5zc2wuS2V5TWFuYWdlcjsKLWltcG9ydCBqYXZheC5uZXQuc3NsLlNTTENvbnRleHQ7Ci1pbXBvcnQgamF2YXgubmV0LnNzbC5TU0xFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgubmV0LnNzbC5TU0xTZXJ2ZXJTb2NrZXQ7Ci1pbXBvcnQgamF2YXgubmV0LnNzbC5TU0xTb2NrZXQ7Ci1pbXBvcnQgamF2YXgubmV0LnNzbC5UcnVzdE1hbmFnZXI7Ci1pbXBvcnQgamF2YXgubmV0LnNzbC5YNTA5S2V5TWFuYWdlcjsKLWltcG9ydCBqYXZheC5uZXQuc3NsLlg1MDlUcnVzdE1hbmFnZXI7Ci0KLS8qKgotICogVGVzdHMgZm9yIHRoZSBPcGVuU1NMIEhlYXJ0YmxlZWQgdnVsbmVyYWJpbGl0eS4KLSAqLwotQFNlY3VyaXR5VGVzdAotcHVibGljIGNsYXNzIE9wZW5TU0xIZWFydGJsZWVkVGVzdCBleHRlbmRzIEluc3RydW1lbnRhdGlvblRlc3RDYXNlIHsKLQotICAgIC8vIElNUExFTUVOVEFUSU9OIE5PVEU6IFRoaXMgdGVzdCBzcGF3bnMgYW4gU1NMU29ja2V0IGNsaWVudCwgU1NMU2VydmVyU29ja2V0IHNlcnZlciwgYW5kIGEKLSAgICAvLyBNYW4taW4tVGhlLU1pZGRsZSAoTWlUTSkuIFRoZSBjbGllbnQgY29ubmVjdHMgdG8gdGhlIE1pVE0gd2hpY2ggdGhlbiBjb25uZWN0cyB0byB0aGUgc2VydmVyCi0gICAgLy8gYW5kIHN0YXJ0cyBmb3J3YXJkaW5nIGFsbCBUTFMgcmVjb3JkcyBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHRoZSBzZXJ2ZXIuIEluIHRlc3RzIHRoYXQgY2hlY2sKLSAgICAvLyBmb3IgdGhlIEhlYXJ0YmxlZWQgdnVsbmVyYWJpbGl0eSwgdGhlIE1pVE0gYWxzbyBpbmplY3RzIGEgSGVhcnRiZWF0UmVxdWVzdCBtZXNzYWdlIGludG8gdGhlCi0gICAgLy8gdHJhZmZpYy4KLQotICAgIC8vIElNUExFTUVOVEFUSU9OIE5PVEU6IFRoaXMgdGVzdCBzcGF3bnMgc2V2ZXJhbCBiYWNrZ3JvdW5kIHRocmVhZHMgdGhhdCBwZXJmb3JtIG5ldHdvcmsgSS9PCi0gICAgLy8gb24gbG9jYWxob3N0LiBUbyBlbnN1cmUgdGhhdCB0aGVzZSBiYWNrZ3JvdW5kIHRocmVhZHMgYXJlIGNsZWFuZWQgdXAgYXQgdGhlIGVuZCBvZiB0aGUgdGVzdAotICAgIC8vIHRlYXJEb3duKCkga2lsbHMgdGhlIHNvY2tldHMgdGhleSBtYXkgYmUgdXNpbmcuIFRvIGFpZCB0aGlzIGJlaGF2aW9yLCBhbGwgU29ja2V0IGFuZAotICAgIC8vIFNlcnZlclNvY2tldCBpbnN0YW5jZXMgYXJlIGF2YWlsYWJsZSBhcyBmaWVsZHMgb2YgdGhpcyBjbGFzcy4gVGhlc2UgZmllbGRzIHNob3VsZCBiZSBhY2Nlc3NlZAotICAgIC8vIHZpYSBzZXR0ZXJzIGFuZCBnZXR0ZXJzIHRvIGF2b2lkIG1lbW9yeSB2aXNpYmlsaXR5IGlzc3VlcyBkdWUgdG8gY29uY3VycmVuY3kuCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gT3BlblNTTEhlYXJ0YmxlZWRUZXN0LmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKLQotICAgIHByaXZhdGUgU1NMU2VydmVyU29ja2V0IG1TZXJ2ZXJMaXN0ZW5pbmdTb2NrZXQ7Ci0gICAgcHJpdmF0ZSBTU0xTb2NrZXQgbVNlcnZlclNvY2tldDsKLSAgICBwcml2YXRlIFNTTFNvY2tldCBtQ2xpZW50U29ja2V0OwotICAgIHByaXZhdGUgU2VydmVyU29ja2V0IG1NaXRtTGlzdGVuaW5nU29ja2V0OwotICAgIHByaXZhdGUgU29ja2V0IG1NaXRtU2VydmVyU29ja2V0OwotICAgIHByaXZhdGUgU29ja2V0IG1NaXRtQ2xpZW50U29ja2V0OwotICAgIHByaXZhdGUgRXhlY3V0b3JTZXJ2aWNlIG1FeGVjdXRvclNlcnZpY2U7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbUhlYXJ0YmVhdFJlcXVlc3RXYXNJbmplY3RlZDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUhlYXJ0YmVhdFJlc3BvbnNlV2FzRGV0ZXRlY3RlZDsKLSAgICBwcml2YXRlIGludCBtRmlyc3REZXRlY3RlZEZhdGFsQWxlcnREZXNjcmlwdGlvbiA9IC0xOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTG9nLmkoVEFHLCAiVGVhcmluZyBkb3duIik7Ci0gICAgICAgIGlmIChtRXhlY3V0b3JTZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1FeGVjdXRvclNlcnZpY2Uuc2h1dGRvd25Ob3coKTsKLSAgICAgICAgfQotICAgICAgICBjbG9zZVF1aWV0bHkoZ2V0U2VydmVyTGlzdGVuaW5nU29ja2V0KCkpOwotICAgICAgICBjbG9zZVF1aWV0bHkoZ2V0U2VydmVyU29ja2V0KCkpOwotICAgICAgICBjbG9zZVF1aWV0bHkoZ2V0Q2xpZW50U29ja2V0KCkpOwotICAgICAgICBjbG9zZVF1aWV0bHkoZ2V0TWl0bUxpc3RlbmluZ1NvY2tldCgpKTsKLSAgICAgICAgY2xvc2VRdWlldGx5KGdldE1pdG1TZXJ2ZXJTb2NrZXQoKSk7Ci0gICAgICAgIGNsb3NlUXVpZXRseShnZXRNaXRtQ2xpZW50U29ja2V0KCkpOwotICAgICAgICBzdXBlci50ZWFyRG93bigpOwotICAgICAgICBMb2cuaShUQUcsICJUZWFyIGRvd24gY29tcGxldGVkIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhhdCBUTFMgaGFuZHNoYWtlIHN1Y2NlZWRzIHdoZW4gdGhlIE1pVE0gc2ltcGx5IGZvcndhcmRzIGFsbCBkYXRhIHdpdGhvdXQgdGFtcGVyaW5nCi0gICAgICogd2l0aCBpdC4gVGhpcyBpcyB0byBjYXRjaCBpc3N1ZXMgdW5yZWxhdGVkIHRvIFRMUyBoZWFydGJlYXRzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RXaXRob3V0SGVhcnRiZWF0cygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBoYW5kc2hha2UoZmFsc2UsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB3aGV0aGVyIGNsaWVudCBzb2NrZXRzIGFyZSB2dWxuZXJhYmxlIHRvIEhlYXJ0YmxlZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdENsaWVudEhlYXJ0YmxlZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgY2hlY2tIZWFydGJsZWVkKHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHdoZXRoZXIgc2VydmVyIHNvY2tldHMgYXJlIHZ1bG5lcmFibGUgdG8gSGVhcnRibGVlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VydmVySGVhcnRibGVlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBjaGVja0hlYXJ0YmxlZWQoZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIGZvciBIZWFydGJsZWVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGNsaWVudCB7QGNvZGUgdHJ1ZX0gdG8gdGVzdCB0aGUgY2xpZW50LCB7QGNvZGUgZmFsc2V9IHRvIHRlc3QgdGhlIHNlcnZlci4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tIZWFydGJsZWVkKGJvb2xlYW4gY2xpZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gSU1QTEVNRU5UQVRJT04gTk9URTogVGhlIE1pVE0gaXMgZm9yd2FyZGluZyBhbGwgVExTIHJlY29yZHMgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCB0aGUKLSAgICAgICAgLy8gc2VydmVyIHVubW9kaWZpZWQuIEFkZGl0aW9uYWxseSwgdGhlIE1pVE0gdHJhbnNtaXRzIGEgbWFsZm9ybWVkIEhlYXJ0YmVhdFJlcXVlc3QgdG8KLSAgICAgICAgLy8gc2VydmVyIChpZiAiY2xpZW50IiBhcmd1bWVudCBpcyBmYWxzZSkgcmlnaHQgYWZ0ZXIgY2xpZW50J3MgQ2xpZW50S2V5RXhjaGFuZ2Ugb3IgdG8KLSAgICAgICAgLy8gY2xpZW50IChpZiAiY2xpZW50IiBhcmd1bWVudCBpcyB0cnVlKSByaWdodCBhZnRlciBzZXJ2ZXIncyBTZXJ2ZXJIZWxsby4gVGhlIHBlZXIgaXMKLSAgICAgICAgLy8gZXhwZWN0ZWQgdG8gZWl0aGVyIGlnbm9yZSB0aGUgSGVhcnRiZWF0UmVxdWVzdCAoaWYgaGVhcnRiZWF0cyBhcmUgc3VwcG9ydGVkKSBvciB0byBhYm9ydAotICAgICAgICAvLyB0aGUgaGFuZHNoYWtlIHdpdGggdW5leHBlY3RlZF9tZXNzYWdlIGFsZXJ0IChpZiBoZWFydGJlYXRzIGFyZSBub3Qgc3VwcG9ydGVkKS4KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGhhbmRzaGFrZSh0cnVlLCBjbGllbnQpOwotICAgICAgICB9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0RmFsc2UoCi0gICAgICAgICAgICAgICAgICAgICJTU0xTb2NrZXQgaXMgdnVsbmVyYWJsZSB0byBIZWFydGJsZWVkIGluICIgKyAoKGNsaWVudCkgPyAiY2xpZW50IiA6ICJzZXJ2ZXIiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtb2RlIiwKLSAgICAgICAgICAgICAgICAgICAgd2FzSGVhcnRiZWF0UmVzcG9uc2VEZXRlY3RlZCgpKTsKLSAgICAgICAgICAgIGlmIChlLmdldENhdXNlKCkgaW5zdGFuY2VvZiBTU0xFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICAvLyBUTFMgaGFuZHNoYWtlIG9yIGRhdGEgZXhjaGFuZ2UgZmFpbGVkLiBDaGVjayB3aGV0aGVyIHRoZSBlcnJvciB3YXMgY2F1c2VkIGJ5Ci0gICAgICAgICAgICAgICAgLy8gZmF0YWwgYWxlcnQgdW5leHBlY3RlZF9tZXNzYWdlCi0gICAgICAgICAgICAgICAgaW50IGFsZXJ0RGVzY3JpcHRpb24gPSBnZXRGaXJzdERldGVjdGVkRmF0YWxBbGVydERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGFsZXJ0RGVzY3JpcHRpb24gPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgZmFpbCgiSGFuZHNoYWtlIGZhaWxlZCB3aXRob3V0IGEgZmF0YWwgYWxlcnQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICAgICAgICAgIkZpcnN0IGZhdGFsIGFsZXJ0IGRlc2NyaXB0aW9uIHJlY2VpdmVkIGZyb20gc2VydmVyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFsZXJ0TWVzc2FnZS5ERVNDUklQVElPTl9VTkVYUEVDVEVEX01FU1NBR0UsCi0gICAgICAgICAgICAgICAgICAgICAgICBhbGVydERlc2NyaXB0aW9uKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUTFMgaGFuZHNoYWtlIHN1Y2NlZWRlZAotICAgICAgICBhc3NlcnRGYWxzZSgKLSAgICAgICAgICAgICAgICAiU1NMU29ja2V0IGlzIHZ1bG5lcmFibGUgdG8gSGVhcnRibGVlZCBpbiAiICsgKChjbGllbnQpID8gImNsaWVudCIgOiAic2VydmVyIikKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtb2RlIiwKLSAgICAgICAgICAgICAgICB3YXNIZWFydGJlYXRSZXNwb25zZURldGVjdGVkKCkpOwotICAgICAgICBhc3NlcnRUcnVlKCJIZWFydGJlYXRSZXF1ZXN0IG5vdCBpbmplY3RlZCIsIHdhc0hlYXJ0YmVhdFJlcXVlc3RJbmplY3RlZCgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydHMgdGhlIGNsaWVudCwgc2VydmVyLCBhbmQgdGhlIE1pVE0uIE1ha2VzIHRoZSBjbGllbnQgYW5kIHNlcnZlciBwZXJmb3JtIGEgVExTIGhhbmRzaGFrZQotICAgICAqIGFuZCBleGNoYW5nZSBhcHBsaWNhdGlvbi1sZXZlbCBkYXRhLiBUaGUgTWlUTSBpbmplY3RzIGEgSGVhcnRiZWF0UmVxdWVzdCBtZXNzYWdlIGlmIHJlcXVlc3RlZAotICAgICAqIGJ5IHtAY29kZSBoZWFydGJlYXRSZXF1ZXN0SW5qZWN0ZWR9LiBUaGUgZGlyZWN0aW9uIG9mIHRoZSBpbmplY3RlZCBtZXNzYWdlIGlzIHNwZWNpZmllZCBieQotICAgICAqIHtAY29kZSBpbmplY3RlZEludG9DbGllbnR9LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBoYW5kc2hha2UoCi0gICAgICAgICAgICBmaW5hbCBib29sZWFuIGhlYXJ0YmVhdFJlcXVlc3RJbmplY3RlZCwKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaW5qZWN0ZWRJbnRvQ2xpZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbUV4ZWN1dG9yU2VydmljZSA9IEV4ZWN1dG9ycy5uZXdGaXhlZFRocmVhZFBvb2woNCk7Ci0gICAgICAgIHNldFNlcnZlckxpc3RlbmluZ1NvY2tldChzZXJ2ZXJCaW5kKCkpOwotICAgICAgICBmaW5hbCBTb2NrZXRBZGRyZXNzIHNlcnZlckFkZHJlc3MgPSBnZXRTZXJ2ZXJMaXN0ZW5pbmdTb2NrZXQoKS5nZXRMb2NhbFNvY2tldEFkZHJlc3MoKTsKLSAgICAgICAgTG9nLmkoVEFHLCAiU2VydmVyIGJvdW5kIHRvICIgKyBzZXJ2ZXJBZGRyZXNzKTsKLQotICAgICAgICBzZXRNaXRtTGlzdGVuaW5nU29ja2V0KG1pdG1CaW5kKCkpOwotICAgICAgICBmaW5hbCBTb2NrZXRBZGRyZXNzIG1pdG1BZGRyZXNzID0gZ2V0TWl0bUxpc3RlbmluZ1NvY2tldCgpLmdldExvY2FsU29ja2V0QWRkcmVzcygpOwotICAgICAgICBMb2cuaShUQUcsICJNaVRNIGJvdW5kIHRvICIgKyBtaXRtQWRkcmVzcyk7Ci0KLSAgICAgICAgLy8gU3RhcnQgdGhlIE1pVE0gZGFlbW9uIGluIHRoZSBiYWNrZ3JvdW5kCi0gICAgICAgIG1FeGVjdXRvclNlcnZpY2Uuc3VibWl0KG5ldyBDYWxsYWJsZTxWb2lkPigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIFZvaWQgY2FsbCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgICAgIG1pdG1BY2NlcHRBbmRGb3J3YXJkKAotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGhlYXJ0YmVhdFJlcXVlc3RJbmplY3RlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdGVkSW50b0NsaWVudCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICAvLyBTdGFydCB0aGUgc2VydmVyIGluIHRoZSBiYWNrZ3JvdW5kCi0gICAgICAgIEZ1dHVyZTxWb2lkPiBzZXJ2ZXJGdXR1cmUgPSBtRXhlY3V0b3JTZXJ2aWNlLnN1Ym1pdChuZXcgQ2FsbGFibGU8Vm9pZD4oKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBWb2lkIGNhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBzZXJ2ZXJBY2NlcHRBbmRIYW5kc2hha2UoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIC8vIFN0YXJ0IHRoZSBjbGllbnQgaW4gdGhlIGJhY2tncm91bmQKLSAgICAgICAgRnV0dXJlPFZvaWQ+IGNsaWVudEZ1dHVyZSA9IG1FeGVjdXRvclNlcnZpY2Uuc3VibWl0KG5ldyBDYWxsYWJsZTxWb2lkPigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIFZvaWQgY2FsbCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGNsaWVudENvbm5lY3RBbmRIYW5kc2hha2UobWl0bUFkZHJlc3MpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICAvLyBXYWl0IGZvciBib3RoIGNsaWVudCBhbmQgc2VydmVyIHRvIHRlcm1pbmF0ZSwgdG8gZW5zdXJlIHRoYXQgd2Ugb2JzZXJ2ZSBhbGwgdGhlIHRyYWZmaWMKLSAgICAgICAgLy8gZXhjaGFuZ2VkIGJldHdlZW4gdGhlbS4gVGhyb3cgYW4gZXhjZXB0aW9uIGlmIG9uZSBvZiB0aGVtIGZhaWxlZC4KLSAgICAgICAgTG9nLmkoVEFHLCAiV2FpdGluZyBmb3IgY2xpZW50Iik7Ci0gICAgICAgIC8vIFdhaXQgZm9yIHRoZSBjbGllbnQsIGJ1dCBkb24ndCB5ZXQgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGl0IGZhaWxlZC4KLSAgICAgICAgRXhjZXB0aW9uIGNsaWVudEV4Y2VwdGlvbiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjbGllbnRGdXR1cmUuZ2V0KDEwLCBUaW1lVW5pdC5TRUNPTkRTKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGNsaWVudEV4Y2VwdGlvbiA9IGU7Ci0gICAgICAgIH0KLSAgICAgICAgTG9nLmkoVEFHLCAiV2FpdGluZyBmb3Igc2VydmVyIik7Ci0gICAgICAgIC8vIFdhaXQgZm9yIHRoZSBzZXJ2ZXIgYW5kIHRocm93IGFuIGV4Y2VwdGlvbiBpZiBpdCBmYWlsZWQuCi0gICAgICAgIHNlcnZlckZ1dHVyZS5nZXQoNSwgVGltZVVuaXQuU0VDT05EUyk7Ci0gICAgICAgIC8vIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgY2xpZW50IGZhaWxlZC4KLSAgICAgICAgaWYgKGNsaWVudEV4Y2VwdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBjbGllbnRFeGNlcHRpb247Ci0gICAgICAgIH0KLSAgICAgICAgTG9nLmkoVEFHLCAiSGFuZHNoYWtlIGNvbXBsZXRlZCBhbmQgYXBwbGljYXRpb24gZGF0YSBleGNoYW5nZWQiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2xpZW50Q29ubmVjdEFuZEhhbmRzaGFrZShTb2NrZXRBZGRyZXNzIHNlcnZlckFkZHJlc3MpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTU0xDb250ZXh0IHNzbENvbnRleHQgPSBTU0xDb250ZXh0LmdldEluc3RhbmNlKCJUTFMiKTsKLSAgICAgICAgc3NsQ29udGV4dC5pbml0KAotICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgbmV3IFRydXN0TWFuYWdlcltdIHtuZXcgVHJ1c3RBbGxYNTA5VHJ1c3RNYW5hZ2VyKCl9LAotICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICBTU0xTb2NrZXQgc29ja2V0ID0gKFNTTFNvY2tldCkgc3NsQ29udGV4dC5nZXRTb2NrZXRGYWN0b3J5KCkuY3JlYXRlU29ja2V0KCk7Ci0gICAgICAgIHNldENsaWVudFNvY2tldChzb2NrZXQpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgTG9nLmkoVEFHLCAiQ2xpZW50IGNvbm5lY3RpbmcgdG8gIiArIHNlcnZlckFkZHJlc3MpOwotICAgICAgICAgICAgc29ja2V0LmNvbm5lY3Qoc2VydmVyQWRkcmVzcyk7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICJDbGllbnQgY29ubmVjdGVkIHRvIHNlcnZlciBmcm9tICIgKyBzb2NrZXQuZ2V0TG9jYWxTb2NrZXRBZGRyZXNzKCkpOwotICAgICAgICAgICAgLy8gRW5zdXJlIGEgVExTIGhhbmRzaGFrZSBpcyBwZXJmb3JtZWQgYW5kIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgaXQgZmFpbHMuCi0gICAgICAgICAgICBzb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCkud3JpdGUoImNsaWVudCIuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgICAgICBzb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCkuZmx1c2goKTsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIkNsaWVudCBzZW50IHJlcXVlc3QuIFJlYWRpbmcgcmVzcG9uc2UiKTsKLSAgICAgICAgICAgIGludCBiID0gc29ja2V0LmdldElucHV0U3RyZWFtKCkucmVhZCgpOwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiQ2xpZW50IHJlYWQgcmVzcG9uc2U6ICIgKyBiKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkNsaWVudCBmYWlsZWQiLCBlKTsKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHNvY2tldC5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFNTTFNlcnZlclNvY2tldCBzZXJ2ZXJCaW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIExvYWQgdGhlIHNlcnZlcidzIHByaXZhdGUga2V5IGFuZCBjZXJ0IGNoYWluCi0gICAgICAgIEtleUZhY3Rvcnkga2V5RmFjdG9yeSA9IEtleUZhY3RvcnkuZ2V0SW5zdGFuY2UoIlJTQSIpOwotICAgICAgICBQcml2YXRlS2V5IHByaXZhdGVLZXkgPSBrZXlGYWN0b3J5LmdlbmVyYXRlUHJpdmF0ZShuZXcgUEtDUzhFbmNvZGVkS2V5U3BlYygKLSAgICAgICAgICAgICAgICByZWFkUmVzb3VyY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRDb250ZXh0KCksIFIucmF3Lm9wZW5zc2xfaGVhcnRibGVlZF90ZXN0X2tleSkpKTsKLSAgICAgICAgQ2VydGlmaWNhdGVGYWN0b3J5IGNlcnRGYWN0b3J5ID0gQ2VydGlmaWNhdGVGYWN0b3J5LmdldEluc3RhbmNlKCJYLjUwOSIpOwotICAgICAgICBYNTA5Q2VydGlmaWNhdGVbXSBjZXJ0Q2hhaW4gPSAgbmV3IFg1MDlDZXJ0aWZpY2F0ZVtdIHsKLSAgICAgICAgICAgICAgICAoWDUwOUNlcnRpZmljYXRlKSBjZXJ0RmFjdG9yeS5nZW5lcmF0ZUNlcnRpZmljYXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHJlYWRSZXNvdXJjZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0Q29udGV4dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLnJhdy5vcGVuc3NsX2hlYXJ0YmxlZWRfdGVzdF9jZXJ0KSkpCi0gICAgICAgIH07Ci0KLSAgICAgICAgLy8gSW5pdGlhbGl6ZSBUTFMgY29udGV4dCB0byB1c2UgdGhlIHByaXZhdGUga2V5IGFuZCBjZXJ0IGNoYWluIGZvciBzZXJ2ZXIgc29ja2V0cwotICAgICAgICBTU0xDb250ZXh0IHNzbENvbnRleHQgPSBTU0xDb250ZXh0LmdldEluc3RhbmNlKCJUTFMiKTsKLSAgICAgICAgc3NsQ29udGV4dC5pbml0KAotICAgICAgICAgICAgICAgIG5ldyBLZXlNYW5hZ2VyW10ge25ldyBIYXJkY29kZWRDZXJ0WDUwOUtleU1hbmFnZXIocHJpdmF0ZUtleSwgY2VydENoYWluKX0sCi0gICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICBudWxsKTsKLQotICAgICAgICBMb2cuaShUQUcsICJTZXJ2ZXIgYmluZGluZyB0byBsb2NhbCBwb3J0Iik7Ci0gICAgICAgIHJldHVybiAoU1NMU2VydmVyU29ja2V0KSBzc2xDb250ZXh0LmdldFNlcnZlclNvY2tldEZhY3RvcnkoKS5jcmVhdGVTZXJ2ZXJTb2NrZXQoMCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNlcnZlckFjY2VwdEFuZEhhbmRzaGFrZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTU0xTb2NrZXQgc29ja2V0ID0gbnVsbDsKLSAgICAgICAgU1NMU2VydmVyU29ja2V0IHNlcnZlclNvY2tldCA9IGdldFNlcnZlckxpc3RlbmluZ1NvY2tldCgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgTG9nLmkoVEFHLCAiU2VydmVyIGxpc3RlbmluZyBmb3IgaW5jb21pbmcgY29ubmVjdGlvbiIpOwotICAgICAgICAgICAgc29ja2V0ID0gKFNTTFNvY2tldCkgc2VydmVyU29ja2V0LmFjY2VwdCgpOwotICAgICAgICAgICAgc2V0U2VydmVyU29ja2V0KHNvY2tldCk7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICJTZXJ2ZXIgYWNjZXB0ZWQgY29ubmVjdGlvbiBmcm9tICIgKyBzb2NrZXQuZ2V0UmVtb3RlU29ja2V0QWRkcmVzcygpKTsKLSAgICAgICAgICAgIC8vIEVuc3VyZSBhIFRMUyBoYW5kc2hha2UgaXMgcGVyZm9ybWVkIGFuZCBhbiBleGNlcHRpb24gaXMgdGhyb3duIGlmIGl0IGZhaWxzLgotICAgICAgICAgICAgc29ja2V0LmdldE91dHB1dFN0cmVhbSgpLndyaXRlKCJzZXJ2ZXIiLmdldEJ5dGVzKCkpOwotICAgICAgICAgICAgc29ja2V0LmdldE91dHB1dFN0cmVhbSgpLmZsdXNoKCk7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICJTZXJ2ZXIgc2VudCByZXBseS4gUmVhZGluZyByZXNwb25zZSIpOwotICAgICAgICAgICAgaW50IGIgPSBzb2NrZXQuZ2V0SW5wdXRTdHJlYW0oKS5yZWFkKCk7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICJTZXJ2ZXIgcmVhZCByZXNwb25zZTogIiArIGIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgIExvZy53KFRBRywgIlNlcnZlciBmYWlsZWQiLCBlKTsKLSAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHNvY2tldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc29ja2V0LmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFNlcnZlclNvY2tldCBtaXRtQmluZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBMb2cuaShUQUcsICJNaVRNIGJpbmRpbmcgdG8gbG9jYWwgcG9ydCIpOwotICAgICAgICByZXR1cm4gU2VydmVyU29ja2V0RmFjdG9yeS5nZXREZWZhdWx0KCkuY3JlYXRlU2VydmVyU29ja2V0KDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFjY2VwdHMgdGhlIGNvbm5lY3Rpb24gb24gdGhlIE1pVE0gbGlzdGVuaW5nIHNvY2tldCwgZm9yd2FyZHMgdGhlIFRMUyByZWNvcmRzIGJldHdlZW4gdGhlCi0gICAgICogY2xpZW50IGFuZCB0aGUgc2VydmVyLCBhbmQsIGlmIHJlcXVlc3RlZCwgaW5qZWN0cyBhIHtAY29kZSBIZWFydGJlYXRSZXF1ZXN0fS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmplY3RIZWFydGJlYXQgd2hldGhlciB0byBpbmplY3QgYSB7QGNvZGUgSGVhcnRiZWF0UmVxdWVzdH0gbWVzc2FnZS4KLSAgICAgKiBAcGFyYW0gaW5qZWN0SW50b0NsaWVudCB3aGVuIHtAY29kZSBpbmplY3RIZWFydGJlYXR9IGlzIHtAY29kZSB0cnVlfSwgd2hldGhlciB0byBpbmplY3QgdGhlCi0gICAgICogICAgICAgIHtAY29kZSBIZWFydGJlYXRSZXF1ZXN0fSBtZXNzYWdlIGludG8gY2xpZW50IG9yIGludG8gc2VydmVyLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBtaXRtQWNjZXB0QW5kRm9yd2FyZCgKLSAgICAgICAgICAgIFNvY2tldEFkZHJlc3Mgc2VydmVyQWRkcmVzcywKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaW5qZWN0SGVhcnRiZWF0LAotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpbmplY3RJbnRvQ2xpZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU29ja2V0IGNsaWVudFNvY2tldCA9IG51bGw7Ci0gICAgICAgIFNvY2tldCBzZXJ2ZXJTb2NrZXQgPSBudWxsOwotICAgICAgICBTZXJ2ZXJTb2NrZXQgbGlzdGVuaW5nU29ja2V0ID0gZ2V0TWl0bUxpc3RlbmluZ1NvY2tldCgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgTG9nLmkoVEFHLCAiTWlUTSB3YWl0aW5nIGZvciBpbmNvbWluZyBjb25uZWN0aW9uIik7Ci0gICAgICAgICAgICBjbGllbnRTb2NrZXQgPSBsaXN0ZW5pbmdTb2NrZXQuYWNjZXB0KCk7Ci0gICAgICAgICAgICBzZXRNaXRtQ2xpZW50U29ja2V0KGNsaWVudFNvY2tldCk7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICJNaVRNIGFjY2VwdGVkIGNvbm5lY3Rpb24gZnJvbSAiICsgY2xpZW50U29ja2V0LmdldFJlbW90ZVNvY2tldEFkZHJlc3MoKSk7Ci0gICAgICAgICAgICBzZXJ2ZXJTb2NrZXQgPSBTb2NrZXRGYWN0b3J5LmdldERlZmF1bHQoKS5jcmVhdGVTb2NrZXQoKTsKLSAgICAgICAgICAgIHNldE1pdG1TZXJ2ZXJTb2NrZXQoc2VydmVyU29ja2V0KTsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIk1pVE0gY29ubmVjdGluZyB0byBzZXJ2ZXIgIiArIHNlcnZlckFkZHJlc3MpOwotICAgICAgICAgICAgc2VydmVyU29ja2V0LmNvbm5lY3Qoc2VydmVyQWRkcmVzcywgMTAwMDApOwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiTWlUTSBjb25uZWN0ZWQgdG8gc2VydmVyIGZyb20gIiArIHNlcnZlclNvY2tldC5nZXRMb2NhbFNvY2tldEFkZHJlc3MoKSk7Ci0gICAgICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSBzZXJ2ZXJJbnB1dFN0cmVhbSA9IHNlcnZlclNvY2tldC5nZXRJbnB1dFN0cmVhbSgpOwotICAgICAgICAgICAgZmluYWwgT3V0cHV0U3RyZWFtIGNsaWVudE91dHB1dFN0cmVhbSA9IGNsaWVudFNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIEZ1dHVyZTxWb2lkPiBzZXJ2ZXJUb0NsaWVudFRhc2sgPSBtRXhlY3V0b3JTZXJ2aWNlLnN1Ym1pdChuZXcgQ2FsbGFibGU8Vm9pZD4oKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIFZvaWQgY2FsbCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAvLyBJbmplY3QgSGVhdGJlYXRSZXF1ZXN0IGFmdGVyIFNlcnZlckhlbGxvLCBpZiByZXF1ZXN0ZWQKLSAgICAgICAgICAgICAgICAgICAgZm9yd2FyZFRsc1JlY29yZHMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1pVE0gUy0+QyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVySW5wdXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50T3V0cHV0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbmplY3RIZWFydGJlYXQgJiYgaW5qZWN0SW50b0NsaWVudCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gSGFuZHNoYWtlTWVzc2FnZS5UWVBFX1NFUlZFUl9IRUxMTyA6IC0xKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAvLyBJbmplY3QgSGVhdGJlYXRSZXF1ZXN0IGFmdGVyIENsaWVudEtleUV4Y2hhbmdlLCBpZiByZXF1ZXN0ZWQKLSAgICAgICAgICAgIGZvcndhcmRUbHNSZWNvcmRzKAotICAgICAgICAgICAgICAgICAgICAiTWlUTSBDLT5TIiwKLSAgICAgICAgICAgICAgICAgICAgY2xpZW50U29ja2V0LmdldElucHV0U3RyZWFtKCksCi0gICAgICAgICAgICAgICAgICAgIHNlcnZlclNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKSwKLSAgICAgICAgICAgICAgICAgICAgKGluamVjdEhlYXJ0YmVhdCAmJiAhaW5qZWN0SW50b0NsaWVudCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEhhbmRzaGFrZU1lc3NhZ2UuVFlQRV9DTElFTlRfS0VZX0VYQ0hBTkdFIDogLTEpOwotICAgICAgICAgICAgc2VydmVyVG9DbGllbnRUYXNrLmdldCgxMCwgVGltZVVuaXQuU0VDT05EUyk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJNaVRNIGZhaWxlZCIsIGUpOwotICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgY2xvc2VRdWlldGx5KGNsaWVudFNvY2tldCk7Ci0gICAgICAgICAgICBjbG9zZVF1aWV0bHkoc2VydmVyU29ja2V0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZvcndhcmRzIFRMUyByZWNvcmRzIGZyb20gdGhlIHByb3ZpZGVkIHtAY29kZSBJbnB1dFN0cmVhbX0gdG8gdGhlIHByb3ZpZGVkCi0gICAgICoge0Bjb2RlIE91dHB1dFN0cmVhbX0uIElmIHJlcXVlc3RlZCwgaW5qZWN0cyBhIHtAY29kZSBIZWFydGJlYXRNZXNzYWdlfS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZm9yd2FyZFRsc1JlY29yZHMoCi0gICAgICAgICAgICBTdHJpbmcgbG9nUHJlZml4LAotICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4sCi0gICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3V0LAotICAgICAgICAgICAgaW50IGhhbmRzaGFrZU1lc3NhZ2VUeXBlQWZ0ZXJXaGljaFRvSW5qZWN0SGVhcnRiZWF0UmVxdWVzdCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIExvZy5pKFRBRywgbG9nUHJlZml4ICsgIjogcmVjb3JkIGZvcndhcmRpbmcgc3RhcnRlZCIpOwotICAgICAgICBib29sZWFuIGludGVyZXN0aW5nUmVjb3Jkc0xvZ2dlZCA9Ci0gICAgICAgICAgICAgICAgaGFuZHNoYWtlTWVzc2FnZVR5cGVBZnRlcldoaWNoVG9JbmplY3RIZWFydGJlYXRSZXF1ZXN0ID09IC0xOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgVGxzUmVjb3JkUmVhZGVyIHJlYWRlciA9IG5ldyBUbHNSZWNvcmRSZWFkZXIoaW4pOwotICAgICAgICAgICAgYnl0ZVtdIHJlY29yZEJ5dGVzOwotICAgICAgICAgICAgLy8gRnJhZ21lbnRzIGNvbnRhaW5lZCBpbiByZWNvcmRzIG1heSBiZSBlbmNyeXB0ZWQgYWZ0ZXIgYSBjZXJ0YWluIHBvaW50IGluIHRoZQotICAgICAgICAgICAgLy8gaGFuZHNoYWtlLiBPbmNlIHRoZXkgYXJlIGVuY3J5cHRlZCwgdGhpcyBNaVRNIGNhbm5vdCBpbnNwZWN0IHRoZWlyIHBsYWludGV4dCB3aGljaC4KLSAgICAgICAgICAgIGJvb2xlYW4gZnJhZ21lbnRFbmNyeXB0aW9uTWF5QmVFbmFibGVkID0gZmFsc2U7Ci0gICAgICAgICAgICB3aGlsZSAoKHJlY29yZEJ5dGVzID0gcmVhZGVyLnJlYWRSZWNvcmQoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFRsc1JlY29yZCByZWNvcmQgPSBUbHNSZWNvcmQucGFyc2UocmVjb3JkQnl0ZXMpOwotICAgICAgICAgICAgICAgIGZvcndhcmRUbHNSZWNvcmQobG9nUHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkQnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICByZWNvcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICBmcmFnbWVudEVuY3J5cHRpb25NYXlCZUVuYWJsZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmVzdGluZ1JlY29yZHNMb2dnZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kc2hha2VNZXNzYWdlVHlwZUFmdGVyV2hpY2hUb0luamVjdEhlYXJ0YmVhdFJlcXVlc3QpOwotICAgICAgICAgICAgICAgIGlmIChyZWNvcmQucHJvdG9jb2wgPT0gVGxzUHJvdG9jb2xzLkNIQU5HRV9DSVBIRVJfU1BFQykgewotICAgICAgICAgICAgICAgICAgICBmcmFnbWVudEVuY3J5cHRpb25NYXlCZUVuYWJsZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgbG9nUHJlZml4ICsgIjogZmFpbGVkIiwgZSk7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgTG9nLmQoVEFHLCBsb2dQcmVmaXggKyAiOiByZWNvcmQgZm9yd2FyZGluZyBmaW5pc2hlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGZvcndhcmRUbHNSZWNvcmQoCi0gICAgICAgICAgICBTdHJpbmcgbG9nUHJlZml4LAotICAgICAgICAgICAgYnl0ZVtdIHJlY29yZEJ5dGVzLAotICAgICAgICAgICAgVGxzUmVjb3JkIHJlY29yZCwKLSAgICAgICAgICAgIGJvb2xlYW4gZnJhZ21lbnRFbmNyeXB0aW9uTWF5QmVFbmFibGVkLAotICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dCwKLSAgICAgICAgICAgIGJvb2xlYW4gaW50ZXJlc3RpbmdSZWNvcmRzTG9nZ2VkLAotICAgICAgICAgICAgaW50IGhhbmRzaGFrZU1lc3NhZ2VUeXBlQWZ0ZXJXaGljaFRvSW5qZWN0SGVhcnRiZWF0UmVxdWVzdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gU2F2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVjb3JkcyBpZiBpdHMgb2YgaW50ZXJlc3QgdG8gdGhpcyB0ZXN0Ci0gICAgICAgIGlmIChpbnRlcmVzdGluZ1JlY29yZHNMb2dnZWQpIHsKLSAgICAgICAgICAgIHN3aXRjaCAocmVjb3JkLnByb3RvY29sKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBUbHNQcm90b2NvbHMuQUxFUlQ6Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZnJhZ21lbnRFbmNyeXB0aW9uTWF5QmVFbmFibGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBbGVydE1lc3NhZ2UgYWxlcnQgPSBBbGVydE1lc3NhZ2UudHJ5UGFyc2UocmVjb3JkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYWxlcnQgIT0gbnVsbCkgJiYgKGFsZXJ0LmxldmVsID09IEFsZXJ0TWVzc2FnZS5MRVZFTF9GQVRBTCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRGYXRhbEFsZXJ0RGV0ZWN0ZWQoYWxlcnQuZGVzY3JpcHRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgVGxzUHJvdG9jb2xzLkhFQVJUQkVBVDoKLSAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiBUTFMgcmVjb3JkcyBhcmUgZW5jcnlwdGVkLCB3ZSBjYW5ub3QgZGV0ZXJtaW5lIHdoZXRoZXIgYQotICAgICAgICAgICAgICAgICAgICAvLyBoZWFydGJlYXQgaXMgYSBIZWFydGJlYXRSZXNwb25zZS4gSW4gb3VyIHNldHVwLCB0aGUgY2xpZW50IGFuZCB0aGUKLSAgICAgICAgICAgICAgICAgICAgLy8gc2VydmVyIGFyZSBub3QgZXhwZWN0ZWQgdG8gc2VudCBIZWFydGJlYXRSZXF1ZXN0cy4gVGh1cywgd2UgZXJyIG9uCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzaWRlIG9mIGNhdXRpb24gYW5kIGFzc3VtZSB0aGF0IGFueSBoZWFydGJlYXQgbWVzc2FnZSBzZW50IGJ5Ci0gICAgICAgICAgICAgICAgICAgIC8vIGNsaWVudCBvciBzZXJ2ZXIgaXMgYSBIZWFydGJlYXRSZXNwb25zZS4KLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCBsb2dQcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI6IGhlYXJ0YmVhdCByZXNwb25zZSBkZXRlY3RlZCAtLSB2dWxuZXJhYmxlIHRvIEhlYXJ0YmxlZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0SGVhcnRiZWF0UmVzcG9uc2VXYXNEZXRlY3RlZCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIExvZy5pKFRBRywgbG9nUHJlZml4ICsgIjogRm9yd2FyZGluZyBUTFMgcmVjb3JkLiAiCi0gICAgICAgICAgICAgICAgKyBnZXRSZWNvcmRJbmZvKHJlY29yZCwgZnJhZ21lbnRFbmNyeXB0aW9uTWF5QmVFbmFibGVkKSk7Ci0gICAgICAgIG91dC53cml0ZShyZWNvcmRCeXRlcyk7Ci0gICAgICAgIG91dC5mbHVzaCgpOwotCi0gICAgICAgIC8vIEluamVjdCBIZWFydGJlYXRSZXF1ZXN0LCBpZiBuZWNlc3NhcnksIGFmdGVyIHRoZSBzcGVjaWZpZWQgaGFuZHNoYWtlIG1lc3NhZ2UgdHlwZQotICAgICAgICBpZiAoaGFuZHNoYWtlTWVzc2FnZVR5cGVBZnRlcldoaWNoVG9JbmplY3RIZWFydGJlYXRSZXF1ZXN0ICE9IC0xKSB7Ci0gICAgICAgICAgICBpZiAoKCFmcmFnbWVudEVuY3J5cHRpb25NYXlCZUVuYWJsZWQpICYmIChpc0hhbmRzaGFrZU1lc3NhZ2VUeXBlKAotICAgICAgICAgICAgICAgICAgICByZWNvcmQsIGhhbmRzaGFrZU1lc3NhZ2VUeXBlQWZ0ZXJXaGljaFRvSW5qZWN0SGVhcnRiZWF0UmVxdWVzdCkpKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIEhlYXJ0YmVhdCBSZXF1ZXN0IG1lc3NhZ2UgYmVsb3cgaXMgbWFsZm9ybWVkIGJlY2F1c2UgaXRzIGRlY2xhcmVkCi0gICAgICAgICAgICAgICAgLy8gbGVuZ3RoIG9mIHBheWxvYWQgb25lIGJ5dGUgbGFyZ2VyIHRoYW4gdGhlIGFjdHVhbCBwYXlsb2FkLiBUaGUgcGVlciBpcwotICAgICAgICAgICAgICAgIC8vIHN1cHBvc2VkIHRvIHJlamVjdCBzdWNoIG1lc3NhZ2VzLgotICAgICAgICAgICAgICAgIGJ5dGVbXSBwYXlsb2FkID0gImFyYml0cmFyeSIuZ2V0Qnl0ZXMoIlVTLUFTQ0lJIik7Ci0gICAgICAgICAgICAgICAgYnl0ZVtdIGhlYXJ0YmVhdFJlcXVlc3RSZWNvcmRCeXRlcyA9IGNyZWF0ZUhlYXJ0YmVhdFJlcXVlc3RSZWNvcmQoCi0gICAgICAgICAgICAgICAgICAgICAgICByZWNvcmQudmVyc2lvbk1ham9yLAotICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkLnZlcnNpb25NaW5vciwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQubGVuZ3RoICsgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQpOwotICAgICAgICAgICAgICAgIExvZy5pKFRBRywgbG9nUHJlZml4ICsgIjogSW5qZWN0aW5nIG1hbGZvcm1lZCBIZWFydGJlYXRSZXF1ZXN0OiAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGdldFJlY29yZEluZm8oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRsc1JlY29yZC5wYXJzZShoZWFydGJlYXRSZXF1ZXN0UmVjb3JkQnl0ZXMpLCBmYWxzZSkpOwotICAgICAgICAgICAgICAgIHNldEhlYXJ0YmVhdFJlcXVlc3RXYXNJbmplY3RlZCgpOwotICAgICAgICAgICAgICAgIG91dC53cml0ZShoZWFydGJlYXRSZXF1ZXN0UmVjb3JkQnl0ZXMpOwotICAgICAgICAgICAgICAgIG91dC5mbHVzaCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFJlY29yZEluZm8oVGxzUmVjb3JkIHJlY29yZCwgYm9vbGVhbiBtYXlCZUVuY3J5cHRlZCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoZ2V0UHJvdG9jb2xOYW1lKHJlY29yZC5wcm90b2NvbCkpCi0gICAgICAgICAgICAgICAgLmFwcGVuZCgiLCAiKQotICAgICAgICAgICAgICAgIC5hcHBlbmQoZ2V0RnJhZ21lbnRJbmZvKHJlY29yZCwgbWF5QmVFbmNyeXB0ZWQpKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRQcm90b2NvbE5hbWUoaW50IHByb3RvY29sKSB7Ci0gICAgICAgIHN3aXRjaCAocHJvdG9jb2wpIHsKLSAgICAgICAgICAgIGNhc2UgVGxzUHJvdG9jb2xzLkFMRVJUOgotICAgICAgICAgICAgICAgIHJldHVybiAiYWxlcnQiOwotICAgICAgICAgICAgY2FzZSBUbHNQcm90b2NvbHMuQVBQTElDQVRJT05fREFUQToKLSAgICAgICAgICAgICAgICByZXR1cm4gImFwcGxpY2F0aW9uIGRhdGEiOwotICAgICAgICAgICAgY2FzZSBUbHNQcm90b2NvbHMuQ0hBTkdFX0NJUEhFUl9TUEVDOgotICAgICAgICAgICAgICAgIHJldHVybiAiY2hhbmdlIGNpcGhlciBzcGVjIjsKLSAgICAgICAgICAgIGNhc2UgVGxzUHJvdG9jb2xzLkhBTkRTSEFLRToKLSAgICAgICAgICAgICAgICByZXR1cm4gImhhbmRzaGFrZSI7Ci0gICAgICAgICAgICBjYXNlIFRsc1Byb3RvY29scy5IRUFSVEJFQVQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJoZWF0YmVhdCI7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZihwcm90b2NvbCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RnJhZ21lbnRJbmZvKFRsc1JlY29yZCByZWNvcmQsIGJvb2xlYW4gbWF5QmVFbmNyeXB0ZWQpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBpZiAobWF5QmVFbmNyeXB0ZWQpIHsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoImVuY3J5cHRlZD8iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN3aXRjaCAocmVjb3JkLnByb3RvY29sKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBUbHNQcm90b2NvbHMuQUxFUlQ6Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoImxldmVsOiAiICsgKChyZWNvcmQuZnJhZ21lbnQubGVuZ3RoID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFN0cmluZy52YWx1ZU9mKHJlY29yZC5mcmFnbWVudFswXSAmIDB4ZmYpIDogIm4vYSIpCi0gICAgICAgICAgICAgICAgICAgICsgIiwgZGVzY3JpcHRpb246ICIKLSAgICAgICAgICAgICAgICAgICAgKyAoKHJlY29yZC5mcmFnbWVudC5sZW5ndGggPiAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gU3RyaW5nLnZhbHVlT2YocmVjb3JkLmZyYWdtZW50WzFdICYgMHhmZikgOiAibi9hIikpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFRsc1Byb3RvY29scy5BUFBMSUNBVElPTl9EQVRBOgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFRsc1Byb3RvY29scy5DSEFOR0VfQ0lQSEVSX1NQRUM6Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoInBheWxvYWQ6ICIgKyAoKHJlY29yZC5mcmFnbWVudC5sZW5ndGggPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gU3RyaW5nLnZhbHVlT2YocmVjb3JkLmZyYWdtZW50WzBdICYgMHhmZikgOiAibi9hIikpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFRsc1Byb3RvY29scy5IQU5EU0hBS0U6Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoInR5cGU6ICIgKyAoKHJlY29yZC5mcmFnbWVudC5sZW5ndGggPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gU3RyaW5nLnZhbHVlT2YocmVjb3JkLmZyYWdtZW50WzBdICYgMHhmZikgOiAibi9hIikpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFRsc1Byb3RvY29scy5IRUFSVEJFQVQ6Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoInR5cGU6ICIgKyAoKHJlY29yZC5mcmFnbWVudC5sZW5ndGggPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gU3RyaW5nLnZhbHVlT2YocmVjb3JkLmZyYWdtZW50WzBdICYgMHhmZikgOiAibi9hIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHBheWxvYWQgbGVuZ3RoOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKHJlY29yZC5mcmFnbWVudC5sZW5ndGggPj0gMykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gU3RyaW5nLnZhbHVlT2YoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFVuc2lnbmVkU2hvcnRCaWdFbmRpYW4ocmVjb3JkLmZyYWdtZW50LCAxKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIm4vYSIpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCAiKS5hcHBlbmQoImZyYWdtZW50IGxlbmd0aDogIiArIHJlY29yZC5mcmFnbWVudC5sZW5ndGgpOwotICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBzZXRTZXJ2ZXJMaXN0ZW5pbmdTb2NrZXQoU1NMU2VydmVyU29ja2V0IHNvY2tldCkgewotICAgICAgICBtU2VydmVyTGlzdGVuaW5nU29ja2V0ID0gc29ja2V0OwotICAgIH0KLQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIFNTTFNlcnZlclNvY2tldCBnZXRTZXJ2ZXJMaXN0ZW5pbmdTb2NrZXQoKSB7Ci0gICAgICAgIHJldHVybiBtU2VydmVyTGlzdGVuaW5nU29ja2V0OwotICAgIH0KLQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgc2V0U2VydmVyU29ja2V0KFNTTFNvY2tldCBzb2NrZXQpIHsKLSAgICAgICAgbVNlcnZlclNvY2tldCA9IHNvY2tldDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCBTU0xTb2NrZXQgZ2V0U2VydmVyU29ja2V0KCkgewotICAgICAgICByZXR1cm4gbVNlcnZlclNvY2tldDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHNldENsaWVudFNvY2tldChTU0xTb2NrZXQgc29ja2V0KSB7Ci0gICAgICAgIG1DbGllbnRTb2NrZXQgPSBzb2NrZXQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgU1NMU29ja2V0IGdldENsaWVudFNvY2tldCgpIHsKLSAgICAgICAgcmV0dXJuIG1DbGllbnRTb2NrZXQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBzZXRNaXRtTGlzdGVuaW5nU29ja2V0KFNlcnZlclNvY2tldCBzb2NrZXQpIHsKLSAgICAgICAgbU1pdG1MaXN0ZW5pbmdTb2NrZXQgPSBzb2NrZXQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgU2VydmVyU29ja2V0IGdldE1pdG1MaXN0ZW5pbmdTb2NrZXQoKSB7Ci0gICAgICAgIHJldHVybiBtTWl0bUxpc3RlbmluZ1NvY2tldDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHNldE1pdG1TZXJ2ZXJTb2NrZXQoU29ja2V0IHNvY2tldCkgewotICAgICAgICBtTWl0bVNlcnZlclNvY2tldCA9IHNvY2tldDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCBTb2NrZXQgZ2V0TWl0bVNlcnZlclNvY2tldCgpIHsKLSAgICAgICAgcmV0dXJuIG1NaXRtU2VydmVyU29ja2V0OwotICAgIH0KLQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgc2V0TWl0bUNsaWVudFNvY2tldChTb2NrZXQgc29ja2V0KSB7Ci0gICAgICAgIG1NaXRtQ2xpZW50U29ja2V0ID0gc29ja2V0OwotICAgIH0KLQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIFNvY2tldCBnZXRNaXRtQ2xpZW50U29ja2V0KCkgewotICAgICAgICByZXR1cm4gbU1pdG1DbGllbnRTb2NrZXQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBzZXRIZWFydGJlYXRSZXF1ZXN0V2FzSW5qZWN0ZWQoKSB7Ci0gICAgICAgIG1IZWFydGJlYXRSZXF1ZXN0V2FzSW5qZWN0ZWQgPSB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIGJvb2xlYW4gd2FzSGVhcnRiZWF0UmVxdWVzdEluamVjdGVkKCkgewotICAgICAgICByZXR1cm4gbUhlYXJ0YmVhdFJlcXVlc3RXYXNJbmplY3RlZDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHNldEhlYXJ0YmVhdFJlc3BvbnNlV2FzRGV0ZWN0ZWQoKSB7Ci0gICAgICAgIG1IZWFydGJlYXRSZXNwb25zZVdhc0RldGV0ZWN0ZWQgPSB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIGJvb2xlYW4gd2FzSGVhcnRiZWF0UmVzcG9uc2VEZXRlY3RlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1IZWFydGJlYXRSZXNwb25zZVdhc0RldGV0ZWN0ZWQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBzZXRGYXRhbEFsZXJ0RGV0ZWN0ZWQoaW50IGRlc2NyaXB0aW9uKSB7Ci0gICAgICAgIGlmIChtRmlyc3REZXRlY3RlZEZhdGFsQWxlcnREZXNjcmlwdGlvbiA9PSAtMSkgewotICAgICAgICAgICAgbUZpcnN0RGV0ZWN0ZWRGYXRhbEFsZXJ0RGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIGludCBnZXRGaXJzdERldGVjdGVkRmF0YWxBbGVydERlc2NyaXB0aW9uKCkgewotICAgICAgICByZXR1cm4gbUZpcnN0RGV0ZWN0ZWRGYXRhbEFsZXJ0RGVzY3JpcHRpb247Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBUbHNQcm90b2NvbHMgewotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSEFOR0VfQ0lQSEVSX1NQRUMgPSAyMDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUxFUlQgPSAyMTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSEFORFNIQUtFID0gMjI7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFQUExJQ0FUSU9OX0RBVEEgPSAyMzsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSEVBUlRCRUFUID0gMjQ7Ci0gICAgICAgIHByaXZhdGUgVGxzUHJvdG9jb2xzKCkge30KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRsc1JlY29yZCB7Ci0gICAgICAgIHB1YmxpYyBpbnQgcHJvdG9jb2w7Ci0gICAgICAgIHB1YmxpYyBpbnQgdmVyc2lvbk1ham9yOwotICAgICAgICBwdWJsaWMgaW50IHZlcnNpb25NaW5vcjsKLSAgICAgICAgcHVibGljIGJ5dGVbXSBmcmFnbWVudDsKLQotICAgICAgICBwdWJsaWMgc3RhdGljIFRsc1JlY29yZCBwYXJzZShieXRlW10gcmVjb3JkKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgVGxzUmVjb3JkIHJlc3VsdCA9IG5ldyBUbHNSZWNvcmQoKTsKLSAgICAgICAgICAgIGlmIChyZWNvcmQubGVuZ3RoIDwgVGxzUmVjb3JkUmVhZGVyLlJFQ09SRF9IRUFERVJfTEVOR1RIKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJSZWNvcmQgdG9vIHNob3J0OiAiICsgcmVjb3JkLmxlbmd0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXN1bHQucHJvdG9jb2wgPSByZWNvcmRbMF0gJiAweGZmOwotICAgICAgICAgICAgcmVzdWx0LnZlcnNpb25NYWpvciA9IHJlY29yZFsxXSAmIDB4ZmY7Ci0gICAgICAgICAgICByZXN1bHQudmVyc2lvbk1pbm9yID0gcmVjb3JkWzJdICYgMHhmZjsKLSAgICAgICAgICAgIGludCBmcmFnbWVudExlbmd0aCA9IGdldFVuc2lnbmVkU2hvcnRCaWdFbmRpYW4ocmVjb3JkLCAzKTsKLSAgICAgICAgICAgIGludCBhY3R1YWxGcmFnbWVudExlbmd0aCA9IHJlY29yZC5sZW5ndGggLSBUbHNSZWNvcmRSZWFkZXIuUkVDT1JEX0hFQURFUl9MRU5HVEg7Ci0gICAgICAgICAgICBpZiAoZnJhZ21lbnRMZW5ndGggIT0gYWN0dWFsRnJhZ21lbnRMZW5ndGgpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkZyYWdtZW50IGxlbmd0aCBtaXNtYXRjaC4gRXhwZWN0ZWQ6ICIgKyBmcmFnbWVudExlbmd0aAotICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBhY3R1YWw6ICIgKyBhY3R1YWxGcmFnbWVudExlbmd0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXN1bHQuZnJhZ21lbnQgPSBuZXcgYnl0ZVtmcmFnbWVudExlbmd0aF07Ci0gICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KAotICAgICAgICAgICAgICAgICAgICByZWNvcmQsIFRsc1JlY29yZFJlYWRlci5SRUNPUkRfSEVBREVSX0xFTkdUSCwKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmZyYWdtZW50LCAwLAotICAgICAgICAgICAgICAgICAgICBmcmFnbWVudExlbmd0aCk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBieXRlW10gdW5wYXJzZShUbHNSZWNvcmQgcmVjb3JkKSB7Ci0gICAgICAgICAgICBieXRlW10gcmVzdWx0ID0gbmV3IGJ5dGVbVGxzUmVjb3JkUmVhZGVyLlJFQ09SRF9IRUFERVJfTEVOR1RIICsgcmVjb3JkLmZyYWdtZW50Lmxlbmd0aF07Ci0gICAgICAgICAgICByZXN1bHRbMF0gPSAoYnl0ZSkgcmVjb3JkLnByb3RvY29sOwotICAgICAgICAgICAgcmVzdWx0WzFdID0gKGJ5dGUpIHJlY29yZC52ZXJzaW9uTWFqb3I7Ci0gICAgICAgICAgICByZXN1bHRbMl0gPSAoYnl0ZSkgcmVjb3JkLnZlcnNpb25NaW5vcjsKLSAgICAgICAgICAgIHB1dFVuc2lnbmVkU2hvcnRCaWdFbmRpYW4ocmVzdWx0LCAzLCByZWNvcmQuZnJhZ21lbnQubGVuZ3RoKTsKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoCi0gICAgICAgICAgICAgICAgICAgIHJlY29yZC5mcmFnbWVudCwgMCwKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LCBUbHNSZWNvcmRSZWFkZXIuUkVDT1JEX0hFQURFUl9MRU5HVEgsCi0gICAgICAgICAgICAgICAgICAgIHJlY29yZC5mcmFnbWVudC5sZW5ndGgpOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc0hhbmRzaGFrZU1lc3NhZ2VUeXBlKFRsc1JlY29yZCByZWNvcmQsIGludCB0eXBlKSB7Ci0gICAgICAgIEhhbmRzaGFrZU1lc3NhZ2UgaGFuZHNoYWtlID0gSGFuZHNoYWtlTWVzc2FnZS50cnlQYXJzZShyZWNvcmQpOwotICAgICAgICBpZiAoaGFuZHNoYWtlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaGFuZHNoYWtlLnR5cGUgPT0gdHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEhhbmRzaGFrZU1lc3NhZ2UgewotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1NFUlZFUl9IRUxMTyA9IDI7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfQ0VSVElGSUNBVEUgPSAxMTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9DTElFTlRfS0VZX0VYQ0hBTkdFID0gMTY7Ci0KLSAgICAgICAgcHVibGljIGludCB0eXBlOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBQYXJzZXMgdGhlIHByb3ZpZGVkIFRMUyByZWNvcmQgYXMgYSBoYW5kc2hha2UgbWVzc2FnZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBhbGVydCBtZXNzYWdlIG9yIHtAY29kZSBudWxsfSBpZiB0aGUgcmVjb3JkIGRvZXMgbm90IGNvbnRhaW4gYSBoYW5kc2hha2UgbWVzc2FnZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgSGFuZHNoYWtlTWVzc2FnZSB0cnlQYXJzZShUbHNSZWNvcmQgcmVjb3JkKSB7Ci0gICAgICAgICAgICBpZiAocmVjb3JkLnByb3RvY29sICE9IFRsc1Byb3RvY29scy5IQU5EU0hBS0UpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZWNvcmQuZnJhZ21lbnQubGVuZ3RoIDwgMSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgSGFuZHNoYWtlTWVzc2FnZSByZXN1bHQgPSBuZXcgSGFuZHNoYWtlTWVzc2FnZSgpOwotICAgICAgICAgICAgcmVzdWx0LnR5cGUgPSByZWNvcmQuZnJhZ21lbnRbMF0gJiAweGZmOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQWxlcnRNZXNzYWdlIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVWRUxfRkFUQUwgPSAyOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVNDUklQVElPTl9VTkVYUEVDVEVEX01FU1NBR0UgPSAxMDsKLQotICAgICAgICBwdWJsaWMgaW50IGxldmVsOwotICAgICAgICBwdWJsaWMgaW50IGRlc2NyaXB0aW9uOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBQYXJzZXMgdGhlIHByb3ZpZGVkIFRMUyByZWNvcmQgYXMgYW4gYWxlcnQgbWVzc2FnZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBhbGVydCBtZXNzYWdlIG9yIHtAY29kZSBudWxsfSBpZiB0aGUgcmVjb3JkIGRvZXMgbm90IGNvbnRhaW4gYW4gYWxlcnQgbWVzc2FnZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgQWxlcnRNZXNzYWdlIHRyeVBhcnNlKFRsc1JlY29yZCByZWNvcmQpIHsKLSAgICAgICAgICAgIGlmIChyZWNvcmQucHJvdG9jb2wgIT0gVGxzUHJvdG9jb2xzLkFMRVJUKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocmVjb3JkLmZyYWdtZW50Lmxlbmd0aCA8IDIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFsZXJ0TWVzc2FnZSByZXN1bHQgPSBuZXcgQWxlcnRNZXNzYWdlKCk7Ci0gICAgICAgICAgICByZXN1bHQubGV2ZWwgPSByZWNvcmQuZnJhZ21lbnRbMF0gJiAweGZmOwotICAgICAgICAgICAgcmVzdWx0LmRlc2NyaXB0aW9uID0gcmVjb3JkLmZyYWdtZW50WzFdICYgMHhmZjsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBIZWFydGJlYXRQcm90b2NvbCB7Ci0gICAgICAgIHByaXZhdGUgSGVhcnRiZWF0UHJvdG9jb2woKSB7fQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1RZUEVfUkVRVUVTVCA9IDE7Ci0gICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9UWVBFX1JFU1BPTlNFID0gMjsKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9IRUFERVJfTEVOR1RIID0gMzsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfUEFERElOR19MRU5HVEggPSAxNjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gY3JlYXRlSGVhcnRiZWF0UmVxdWVzdFJlY29yZCgKLSAgICAgICAgICAgIGludCB2ZXJzaW9uTWFqb3IsIGludCB2ZXJzaW9uTWlub3IsCi0gICAgICAgICAgICBpbnQgZGVjbGFyZWRQYXlsb2FkTGVuZ3RoLCBieXRlW10gcGF5bG9hZCkgewotCi0gICAgICAgIGJ5dGVbXSBmcmFnbWVudCA9IG5ldyBieXRlW0hlYXJ0YmVhdFByb3RvY29sLk1FU1NBR0VfSEVBREVSX0xFTkdUSAotICAgICAgICAgICAgICAgICsgcGF5bG9hZC5sZW5ndGggKyBIZWFydGJlYXRQcm90b2NvbC5NRVNTQUdFX1BBRERJTkdfTEVOR1RIXTsKLSAgICAgICAgZnJhZ21lbnRbMF0gPSBIZWFydGJlYXRQcm90b2NvbC5NRVNTQUdFX1RZUEVfUkVRVUVTVDsKLSAgICAgICAgcHV0VW5zaWduZWRTaG9ydEJpZ0VuZGlhbihmcmFnbWVudCwgMSwgZGVjbGFyZWRQYXlsb2FkTGVuZ3RoKTsgLy8gcGF5bG9hZF9sZW5ndGgKLSAgICAgICAgVGxzUmVjb3JkIHJlY29yZCA9IG5ldyBUbHNSZWNvcmQoKTsKLSAgICAgICAgcmVjb3JkLnByb3RvY29sID0gVGxzUHJvdG9jb2xzLkhFQVJUQkVBVDsKLSAgICAgICAgcmVjb3JkLnZlcnNpb25NYWpvciA9IHZlcnNpb25NYWpvcjsKLSAgICAgICAgcmVjb3JkLnZlcnNpb25NaW5vciA9IHZlcnNpb25NaW5vcjsKLSAgICAgICAgcmVjb3JkLmZyYWdtZW50ID0gZnJhZ21lbnQ7Ci0gICAgICAgIHJldHVybiBUbHNSZWNvcmQudW5wYXJzZShyZWNvcmQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWRlciBvZiBUTFMgcmVjb3Jkcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRsc1JlY29yZFJlYWRlciB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfUkVDT1JEX0xFTkdUSCA9IDE2Mzg0OwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUNPUkRfSEVBREVSX0xFTkdUSCA9IDU7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBJbnB1dFN0cmVhbSBpbjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gYnVmZmVyOwotICAgICAgICBwcml2YXRlIGludCBmaXJzdEJ1ZmZlcmVkQnl0ZU9mZnNldDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgYnVmZmVyZWRCeXRlQ291bnQ7Ci0KLSAgICAgICAgcHVibGljIFRsc1JlY29yZFJlYWRlcihJbnB1dFN0cmVhbSBpbikgewotICAgICAgICAgICAgdGhpcy5pbiA9IGluOwotICAgICAgICAgICAgYnVmZmVyID0gbmV3IGJ5dGVbTUFYX1JFQ09SRF9MRU5HVEhdOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlYWRzIHRoZSBuZXh0IFRMUyByZWNvcmQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVExTIHJlY29yZCBvciB7QGNvZGUgbnVsbH0gaWYgRU9GIHdhcyBlbmNvdW50ZXJlZCBiZWZvcmUgYW55IGJ5dGVzIG9mIGEgcmVjb3JkCi0gICAgICAgICAqICAgICAgICAgY291bGQgYmUgcmVhZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBieXRlW10gcmVhZFJlY29yZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAvLyBFbnN1cmUgdGhhdCBhIFRMUyByZWNvcmQgaGVhZGVyIChvciBtb3JlKSBpcyBpbiB0aGUgYnVmZmVyLgotICAgICAgICAgICAgaWYgKGJ1ZmZlcmVkQnl0ZUNvdW50IDwgUkVDT1JEX0hFQURFUl9MRU5HVEgpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIGVvZlBlcm1pdHRlZEluc3RlYWQgPSAoYnVmZmVyZWRCeXRlQ291bnQgPT0gMCk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBlb2ZFbmNvdW50ZXJlZEluc3RlYWQgPQotICAgICAgICAgICAgICAgICAgICAgICAgIXJlYWRBdExlYXN0KFJFQ09SRF9IRUFERVJfTEVOR1RILCBlb2ZQZXJtaXR0ZWRJbnN0ZWFkKTsKLSAgICAgICAgICAgICAgICBpZiAoZW9mRW5jb3VudGVyZWRJbnN0ZWFkKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEVuZCBvZiBzdHJlYW0gcmVhY2hlZCBleGFjdGx5IGJlZm9yZSBhIFRMUyByZWNvcmQgc3RhcnQuCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVExTIHJlY29yZCBoZWFkZXIgKG9yIG1vcmUpIGlzIGluIHRoZSBidWZmZXIuCi0gICAgICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgcmVzdCBvZiB0aGUgcmVjb3JkIGlzIGluIHRoZSBidWZmZXIuCi0gICAgICAgICAgICBpbnQgZnJhZ21lbnRMZW5ndGggPSBnZXRVbnNpZ25lZFNob3J0QmlnRW5kaWFuKGJ1ZmZlciwgZmlyc3RCdWZmZXJlZEJ5dGVPZmZzZXQgKyAzKTsKLSAgICAgICAgICAgIGludCByZWNvcmRMZW5ndGggPSBSRUNPUkRfSEVBREVSX0xFTkdUSCArIGZyYWdtZW50TGVuZ3RoOwotICAgICAgICAgICAgaWYgKHJlY29yZExlbmd0aCA+IE1BWF9SRUNPUkRfTEVOR1RIKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJUTFMgcmVjb3JkIHRvbyBsb25nOiAiICsgcmVjb3JkTGVuZ3RoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChidWZmZXJlZEJ5dGVDb3VudCA8IHJlY29yZExlbmd0aCkgewotICAgICAgICAgICAgICAgIHJlYWRBdExlYXN0KHJlY29yZExlbmd0aCAtIGJ1ZmZlcmVkQnl0ZUNvdW50LCBmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFRMUyByZWNvcmQgKG9yIG1vcmUpIGlzIGluIHRoZSBidWZmZXIuCi0gICAgICAgICAgICBieXRlW10gcmVjb3JkID0gbmV3IGJ5dGVbcmVjb3JkTGVuZ3RoXTsKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCBmaXJzdEJ1ZmZlcmVkQnl0ZU9mZnNldCwgcmVjb3JkLCAwLCByZWNvcmRMZW5ndGgpOwotICAgICAgICAgICAgZmlyc3RCdWZmZXJlZEJ5dGVPZmZzZXQgKz0gcmVjb3JkTGVuZ3RoOwotICAgICAgICAgICAgYnVmZmVyZWRCeXRlQ291bnQgLT0gcmVjb3JkTGVuZ3RoOwotICAgICAgICAgICAgcmV0dXJuIHJlY29yZDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZWFkcyBhdCBsZWFzdCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyBmcm9tIHRoZSB1bmRlcmx5aW5nIHtAY29kZSBJbnB1dFN0cmVhbX0gaW50bwotICAgICAgICAgKiB0aGUge0Bjb2RlIGJ1ZmZlcn0uCi0gICAgICAgICAqCi0gICAgICAgICAqIDxwPkJ5dGVzIGJ1ZmZlcmVkIGJ1dCBub3QgeWV0IHJldHVybmVkIHRvIHRoZSBjbGllbnQgaW4gdGhlIHtAY29kZSBidWZmZXJ9IGFyZSByZWxvY2F0ZWQKLSAgICAgICAgICogdG8gdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIgdG8gbWFrZSBzcGFjZSBpZiBuZWNlc3NhcnkuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBlb2ZQZXJtaXR0ZWRJbnN0ZWFkIHtAY29kZSB0cnVlfSBpZiBpdCdzIHBlcm1pdHRlZCBmb3IgYW4gRU9GIHRvIGJlIGVuY291bnRlcmVkCi0gICAgICAgICAqICAgICAgICB3aXRob3V0IGFueSBieXRlcyBoYXZpbmcgYmVlbiByZWFkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgcmVxdWVzdGVkIG51bWJlciBvZiBieXRlcyAob3IgbW9yZSkgaGFzIGJlZW4gcmVhZCwKLSAgICAgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IGlmIHtAY29kZSBlb2ZQZXJtaXR0ZWRJbnN0ZWFkfSB3YXMge0Bjb2RlIHRydWV9IGFuZCBFT0Ygd2FzCi0gICAgICAgICAqICAgICAgICAgZW5jb3VudGVyZWQgd2hlbiBubyBieXRlcyBoYXZlIHlldCBiZWVuIHJlYWQuCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gcmVhZEF0TGVhc3QoaW50IHNpemUsIGJvb2xlYW4gZW9mUGVybWl0dGVkSW5zdGVhZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGVuc3VyZVJlbWFpbmluZ0J1ZmZlckNhcGFjaXR5QXRMZWFzdChzaXplKTsKLSAgICAgICAgICAgIGJvb2xlYW4gZmlyc3RBdHRlbXB0ID0gdHJ1ZTsKLSAgICAgICAgICAgIHdoaWxlIChzaXplID4gMCkgewotICAgICAgICAgICAgICAgIGludCBjaHVua1NpemUgPSBpbi5yZWFkKAotICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RCdWZmZXJlZEJ5dGVPZmZzZXQgKyBidWZmZXJlZEJ5dGVDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5sZW5ndGggLSAoZmlyc3RCdWZmZXJlZEJ5dGVPZmZzZXQgKyBidWZmZXJlZEJ5dGVDb3VudCkpOwotICAgICAgICAgICAgICAgIGlmIChjaHVua1NpemUgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChmaXJzdEF0dGVtcHQpICYmIChlb2ZQZXJtaXR0ZWRJbnN0ZWFkKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVPRkV4Y2VwdGlvbigiUHJlbWF0dXJlIEVPRiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpcnN0QXR0ZW1wdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGJ1ZmZlcmVkQnl0ZUNvdW50ICs9IGNodW5rU2l6ZTsKLSAgICAgICAgICAgICAgICBzaXplIC09IGNodW5rU2l6ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEVuc3VyZXMgdGhhdCB0aGVyZSBpcyBlbm91Z2ggY2FwYWNpdHkgaW4gdGhlIGJ1ZmZlciB0byBzdG9yZSB0aGUgc3BlY2lmaWVkIG51bWJlciBvZgotICAgICAgICAgKiBieXRlcyBhdCB0aGUge0Bjb2RlIGZpcnN0QnVmZmVyZWRCeXRlT2Zmc2V0ICsgYnVmZmVyZWRCeXRlQ291bnR9IG9mZnNldC4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgdm9pZCBlbnN1cmVSZW1haW5pbmdCdWZmZXJDYXBhY2l0eUF0TGVhc3QoaW50IHNpemUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpbnQgYnVmZmVyQ2FwYWNpdHlSZW1haW5pbmcgPQotICAgICAgICAgICAgICAgICAgICBidWZmZXIubGVuZ3RoIC0gKGZpcnN0QnVmZmVyZWRCeXRlT2Zmc2V0ICsgYnVmZmVyZWRCeXRlQ291bnQpOwotICAgICAgICAgICAgaWYgKGJ1ZmZlckNhcGFjaXR5UmVtYWluaW5nID49IHNpemUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnN1ZmZpY2llbnQgY2FwYWNpdHkgYXQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLgotICAgICAgICAgICAgaWYgKGZpcnN0QnVmZmVyZWRCeXRlT2Zmc2V0ID4gMCkgewotICAgICAgICAgICAgICAgIC8vIFNvbWUgb2YgdGhlIGJ5dGVzIGF0IHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyIGhhdmUgYWxyZWFkeSBiZWVuIHJldHVybmVkIHRvIHRoZQotICAgICAgICAgICAgICAgIC8vIGNsaWVudCBvZiB0aGlzIHJlYWRlci4gQ2hlY2sgaWYgbW92aW5nIHRoZSByZW1haW5pbmcgYnVmZmVyZWQgYnl0ZXMgdG8gdGhlIHN0YXJ0Ci0gICAgICAgICAgICAgICAgLy8gb2YgdGhlIGJ1ZmZlciB3aWxsIG1ha2UgZW5vdWdoIHNwYWNlIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4KLSAgICAgICAgICAgICAgICBidWZmZXJDYXBhY2l0eVJlbWFpbmluZyArPSBmaXJzdEJ1ZmZlcmVkQnl0ZU9mZnNldDsKLSAgICAgICAgICAgICAgICBpZiAoYnVmZmVyQ2FwYWNpdHlSZW1haW5pbmcgPj0gc2l6ZSkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgZmlyc3RCdWZmZXJlZEJ5dGVPZmZzZXQsIGJ1ZmZlciwgMCwgYnVmZmVyZWRCeXRlQ291bnQpOwotICAgICAgICAgICAgICAgICAgICBmaXJzdEJ1ZmZlcmVkQnl0ZU9mZnNldCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiSW5zdWZmdWNpZW50IHJlbWFpbmluZyBjYXBhY2l0eSBpbiB0aGUgYnVmZmVyLiBSZXF1ZXN0ZWQ6ICIKLSAgICAgICAgICAgICAgICAgICAgKyBzaXplICsgIiwgcmVtYWluaW5nOiAiICsgYnVmZmVyQ2FwYWNpdHlSZW1haW5pbmcpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldFVuc2lnbmVkU2hvcnRCaWdFbmRpYW4oYnl0ZVtdIGJ1ZiwgaW50IG9mZnNldCkgewotICAgICAgICByZXR1cm4gKChidWZbb2Zmc2V0XSAmIDB4ZmYpIDw8IDgpIHwgKGJ1ZltvZmZzZXQgKyAxXSAmIDB4ZmYpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHV0VW5zaWduZWRTaG9ydEJpZ0VuZGlhbihieXRlW10gYnVmLCBpbnQgb2Zmc2V0LCBpbnQgdmFsdWUpIHsKLSAgICAgICAgYnVmW29mZnNldF0gPSAoYnl0ZSkgKCh2YWx1ZSA+Pj4gOCkgJiAweGZmKTsKLSAgICAgICAgYnVmW29mZnNldCArIDFdID0gKGJ5dGUpICh2YWx1ZSAmIDB4ZmYpOwotICAgIH0KLQotICAgIC8vIElNUExFTUVOVEFUSU9OIE5PVEU6IFdlIGNhbid0IGltcGxlbWVudCBqdXN0IG9uZSBjbG9zZVF1ZWlldGx5KENsb3NlYWJsZSkgYmVjYXVzZSBvbiBzb21lCi0gICAgLy8gb2xkZXIgQW5kcm9pZCBwbGF0Zm9ybXMgU29ja2V0IGRpZCBub3QgaW1wbGVtZW50IHRoZXNlIGludGVyZmFjZXMuIFRvIG1ha2UgdGhpcyBwYXRjaCBlYXN5IHRvCi0gICAgLy8gYXBwbHkgdG8gdGhlc2Ugb2xkZXIgcGxhdGZvcm1zLCB3ZSBkZWNsYXJlIGFsbCB0aGUgdmFyaWFudHMgb2YgY2xvc2VRdWlldGx5IHRoYXQgYXJlIG5lZWRlZAotICAgIC8vIHdpdGhvdXQgcmVseWluZyBvbiB0aGUgQ2xvc2VhYmxlIGludGVyZmFjZS4KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2xvc2VRdWlldGx5KElucHV0U3RyZWFtIGluKSB7Ci0gICAgICAgIGlmIChpbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGluLmNsb3NlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpZ25vcmVkKSB7fQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNsb3NlUXVpZXRseShTZXJ2ZXJTb2NrZXQgc29ja2V0KSB7Ci0gICAgICAgIGlmIChzb2NrZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBzb2NrZXQuY2xvc2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlnbm9yZWQpIHt9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2VRdWlldGx5KFNvY2tldCBzb2NrZXQpIHsKLSAgICAgICAgaWYgKHNvY2tldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHNvY2tldC5jbG9zZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaWdub3JlZCkge30KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIHJlYWRSZXNvdXJjZShDb250ZXh0IGNvbnRleHQsIGludCByZXNJZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHJlc3VsdCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbMTYgKiAxMDI0XTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGluID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKS5vcGVuUmF3UmVzb3VyY2UocmVzSWQpOwotICAgICAgICAgICAgaW50IGNodW5rU2l6ZTsKLSAgICAgICAgICAgIHdoaWxlICgoY2h1bmtTaXplID0gaW4ucmVhZChidWYpKSAhPSAtMSkgewotICAgICAgICAgICAgICAgIHJlc3VsdC53cml0ZShidWYsIDAsIGNodW5rU2l6ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0LnRvQnl0ZUFycmF5KCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBjbG9zZVF1aWV0bHkoaW4pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0BsaW5rIFg1MDlUcnVzdE1hbmFnZXJ9IHdoaWNoIHRydXN0cyBhbGwgY2VydGlmaWNhdGUgY2hhaW5zLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVHJ1c3RBbGxYNTA5VHJ1c3RNYW5hZ2VyIGltcGxlbWVudHMgWDUwOVRydXN0TWFuYWdlciB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBjaGVja0NsaWVudFRydXN0ZWQoWDUwOUNlcnRpZmljYXRlW10gY2hhaW4sIFN0cmluZyBhdXRoVHlwZSkKLSAgICAgICAgICAgICAgICB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24gewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGNoZWNrU2VydmVyVHJ1c3RlZChYNTA5Q2VydGlmaWNhdGVbXSBjaGFpbiwgU3RyaW5nIGF1dGhUeXBlKQotICAgICAgICAgICAgICAgIHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFg1MDlDZXJ0aWZpY2F0ZVtdIGdldEFjY2VwdGVkSXNzdWVycygpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgWDUwOUNlcnRpZmljYXRlWzBdOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0BsaW5rIFg1MDlLZXlNYW5hZ2VyfSB3aGljaCB1c2VzIHRoZSBwcm92aWRlZCBwcml2YXRlIGtleSBhbmQgY2VydCBjaGFpbiBmb3IgYWxsIHNvY2tldHMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBIYXJkY29kZWRDZXJ0WDUwOUtleU1hbmFnZXIgaW1wbGVtZW50cyBYNTA5S2V5TWFuYWdlciB7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBQcml2YXRlS2V5IG1Qcml2YXRlS2V5OwotICAgICAgICBwcml2YXRlIGZpbmFsIFg1MDlDZXJ0aWZpY2F0ZVtdIG1DZXJ0Q2hhaW47Ci0KLSAgICAgICAgSGFyZGNvZGVkQ2VydFg1MDlLZXlNYW5hZ2VyKFByaXZhdGVLZXkgcHJpdmF0ZUtleSwgWDUwOUNlcnRpZmljYXRlW10gY2VydENoYWluKSB7Ci0gICAgICAgICAgICBtUHJpdmF0ZUtleSA9IHByaXZhdGVLZXk7Ci0gICAgICAgICAgICBtQ2VydENoYWluID0gY2VydENoYWluOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY2hvb3NlQ2xpZW50QWxpYXMoU3RyaW5nW10ga2V5VHlwZSwgUHJpbmNpcGFsW10gaXNzdWVycywgU29ja2V0IHNvY2tldCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyBjaG9vc2VTZXJ2ZXJBbGlhcyhTdHJpbmcga2V5VHlwZSwgUHJpbmNpcGFsW10gaXNzdWVycywgU29ja2V0IHNvY2tldCkgewotICAgICAgICAgICAgcmV0dXJuICJzaW5nbGV0b24iOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBYNTA5Q2VydGlmaWNhdGVbXSBnZXRDZXJ0aWZpY2F0ZUNoYWluKFN0cmluZyBhbGlhcykgewotICAgICAgICAgICAgcmV0dXJuIG1DZXJ0Q2hhaW47Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldENsaWVudEFsaWFzZXMoU3RyaW5nIGtleVR5cGUsIFByaW5jaXBhbFtdIGlzc3VlcnMpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBQcml2YXRlS2V5IGdldFByaXZhdGVLZXkoU3RyaW5nIGFsaWFzKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVByaXZhdGVLZXk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFNlcnZlckFsaWFzZXMoU3RyaW5nIGtleVR5cGUsIFByaW5jaXBhbFtdIGlzc3VlcnMpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10geyJzaW5nbGV0b24ifTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3NyYy9hbmRyb2lkL3NlY3VyaXR5L2N0cy9PdXRwdXRDb25maWd1cmF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvc3JjL2FuZHJvaWQvc2VjdXJpdHkvY3RzL091dHB1dENvbmZpZ3VyYXRpb25UZXN0LmphdmEKaW5kZXggZWI1YzVlZi4uZDFiMjYzZiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvc3JjL2FuZHJvaWQvc2VjdXJpdHkvY3RzL091dHB1dENvbmZpZ3VyYXRpb25UZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvc3JjL2FuZHJvaWQvc2VjdXJpdHkvY3RzL091dHB1dENvbmZpZ3VyYXRpb25UZXN0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zZWN1cml0eS9zcmMvYW5kcm9pZC9zZWN1cml0eS9jdHMvUGFja2FnZVNpZ25hdHVyZVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3NyYy9hbmRyb2lkL3NlY3VyaXR5L2N0cy9QYWNrYWdlU2lnbmF0dXJlVGVzdC5qYXZhCmluZGV4IGE1ZmFhNDIuLmRhNDVmMGEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3NyYy9hbmRyb2lkL3NlY3VyaXR5L2N0cy9QYWNrYWdlU2lnbmF0dXJlVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3NyYy9hbmRyb2lkL3NlY3VyaXR5L2N0cy9QYWNrYWdlU2lnbmF0dXJlVGVzdC5qYXZhCkBAIC05Niw4ICs5Niw5IEBACiAgICAgICAgICAgICAvLyBBUEsgZm9yIGFuIGFjdGl2aXR5IHRoYXQgY29sbGVjdHMgaW5mb3JtYXRpb24gcHJpbnRlZCBpbiB0aGUgQ1RTIHJlcG9ydCBoZWFkZXIKICAgICAgICAgICAgICJhbmRyb2lkLnRlc3RzLmRldmljZXNldHVwIiwKIAotICAgICAgICAgICAgLy8gV2lmaSB0ZXN0IHV0aWxpdHkgdXNlZCBieSBUcmFkZWZlZC4uLgorICAgICAgICAgICAgLy8gVGVzdCB1dGlsaXRpZXMgdXNlZCBieSBUcmFkZWZlZCBoYXJuZXNzCiAgICAgICAgICAgICAiY29tLmFuZHJvaWQudHJhZGVmZWQudXRpbHMud2lmaSIsCisgICAgICAgICAgICAiYW5kcm9pZC50cmFkZWZlZC5jb250ZW50cHJvdmlkZXIiLAogCiAgICAgICAgICAgICAvLyBHYW1lIHVzZWQgZm9yIENUUyB0ZXN0aW5nLi4uCiAgICAgICAgICAgICAiY29tLnJlcGxpY2EucmVwbGljYWlzbGFuZCIsCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zZWN1cml0eS9zcmMvYW5kcm9pZC9zZWN1cml0eS9jdHMvU1NMQ29uc2NyeXB0UGxhaW5UZXh0RXhwb3N1cmVUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS9zcmMvYW5kcm9pZC9zZWN1cml0eS9jdHMvU1NMQ29uc2NyeXB0UGxhaW5UZXh0RXhwb3N1cmVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAwMmE3MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3NyYy9hbmRyb2lkL3NlY3VyaXR5L2N0cy9TU0xDb25zY3J5cHRQbGFpblRleHRFeHBvc3VyZVRlc3QuamF2YQpAQCAtMCwwICsxLDg2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9DaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLnNlY3VyaXR5LmN0czsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlNlY3VyaXR5VGVzdDsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdENhc2U7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Rhc2s7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3Rpb25LZXk7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0b3I7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VydmVyU29ja2V0Q2hhbm5lbDsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5Tb2NrZXRDaGFubmVsOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLnNwaS5TZWxlY3RvclByb3ZpZGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5TWFuYWdlbWVudEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LktleVN0b3JlOworaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5U3RvcmVFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb207CitpbXBvcnQgamF2YS5zZWN1cml0eS5VbnJlY292ZXJhYmxlS2V5RXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuRm9ybWF0dGVyOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCitpbXBvcnQgamF2YXgubmV0LnNzbC5LZXlNYW5hZ2VyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC5uZXQuc3NsLlNTTENvbnRleHQ7CitpbXBvcnQgamF2YXgubmV0LnNzbC5TU0xFbmdpbmU7CitpbXBvcnQgamF2YXgubmV0LnNzbC5TU0xFbmdpbmVSZXN1bHQ7CitpbXBvcnQgamF2YXgubmV0LnNzbC5TU0xFeGNlcHRpb247CitpbXBvcnQgamF2YXgubmV0LnNzbC5TU0xTZXNzaW9uOworaW1wb3J0IGphdmF4Lm5ldC5zc2wuVHJ1c3RNYW5hZ2VyRmFjdG9yeTsKKworcHVibGljIGNsYXNzIFNTTENvbnNjcnlwdFBsYWluVGV4dEV4cG9zdXJlVGVzdCBleHRlbmRzIEluc3RydW1lbnRhdGlvblRlc3RDYXNlIHsKKworICBwcml2YXRlIFRlc3RTU0xTZXJ2ZXIgbVRlc3RTU0xTZXJ2ZXI7CisgIHByaXZhdGUgVGVzdFNTTENvbm5lY3Rpb24gbVRlc3RTU0xDbGllbnQ7CisgIHB1YmxpYyBzdGF0aWMgQ29udGV4dCBjb250ZXh0OworICBwdWJsaWMgc3RhdGljIFN0cmluZyBvdXRwdXQgPSAiIjsKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcGF0dGVybiA9ICIuKlBMQUlOIFRFWFQgRVhQT1NFRC4qIjsKKworICBwdWJsaWMgdm9pZCB0ZXN0X2FuZHJvaWRfQ1ZFXzIwMTdfMTMzMDkoKSB7CisKKyAgICBjb250ZXh0ID0gZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0Q29udGV4dCgpOworICAgIG1UZXN0U1NMU2VydmVyID0gbmV3IFRlc3RTU0xTZXJ2ZXIoKTsKKworICAgIHRyeSB7CisgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7CisgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICB9CisgICAgbVRlc3RTU0xDbGllbnQgPSBuZXcgVGVzdFNTTENvbm5lY3Rpb24oKTsKKyAgICBtVGVzdFNTTENsaWVudC5TdGFydENvbm5lY3QoKTsKKyAgICBhc3NlcnRGYWxzZSgiUGF0dGVybiBmb3VuZCIsCisgICAgICAgIFBhdHRlcm4uY29tcGlsZShwYXR0ZXJuLAorICAgICAgICAgIFBhdHRlcm4uRE9UQUxMKS5tYXRjaGVyKG91dHB1dCkubWF0Y2hlcygpKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgSW5wdXRTdHJlYW0gZ2V0UmVzb3VyY2UoZmluYWwgaW50IHJlc291cmNlKXsKKyAgICByZXR1cm4gU1NMQ29uc2NyeXB0UGxhaW5UZXh0RXhwb3N1cmVUZXN0LmNvbnRleHQuZ2V0UmVzb3VyY2VzKCkub3BlblJhd1Jlc291cmNlKHJlc291cmNlKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRPdXRwdXQoU3RyaW5nIGRhdGEpeworICAgIFNTTENvbnNjcnlwdFBsYWluVGV4dEV4cG9zdXJlVGVzdC5vdXRwdXQgPSBkYXRhOworICB9Cit9CisKKworY2xhc3MgVGVzdFNTTENvbm5lY3Rpb24geworCisgIHB1YmxpYyBTU0xDb250ZXh0IHNzbGM7CisKKyAgcHVibGljIFNvY2tldENoYW5uZWwgc29ja2V0Q2hhbm5lbDsKKyAgcHVibGljIFNTTEVuZ2luZSBjbGllbnRFbmdpbmU7CisgIHB1YmxpYyBTdHJpbmcgcmVtb3RlQWRkcmVzcyA9ICIxMjcuMC4wLjEiOworICBwdWJsaWMgaW50IHBvcnQgPSA3MDAwOworICBwdWJsaWMgQnl0ZUJ1ZmZlcltdIGRhdGFPdXRBcHBCdWZmZXJzID0gbmV3IEJ5dGVCdWZmZXJbM107CisgIHB1YmxpYyBCeXRlQnVmZmVyIGRhdGFPdXROZXRCdWZmZXI7CisgIHB1YmxpYyBCeXRlQnVmZmVyIGhzSW5BcHBCdWZmZXIsIGhzSW5OZXRCdWZmZXIsIGhzT3V0QXBwQnVmZmVyLCBoc091dE5ldEJ1ZmZlcjsKKyAgcHVibGljIGJvb2xlYW4gaXNIYW5kc2hha2VkID0gZmFsc2U7CisgIHB1YmxpYyBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3IgPSBFeGVjdXRvcnMubmV3U2luZ2xlVGhyZWFkRXhlY3V0b3IoKTsKKyAgcHVibGljIElucHV0U3RyZWFtIGNsaWVudEtleSA9IG51bGw7CisgIHB1YmxpYyBJbnB1dFN0cmVhbSB0cnVzdGVkQ2VydCA9IG51bGw7CisKKyAgcHVibGljIHZvaWQgU3RhcnRDb25uZWN0KCkgeworICAgIEtleVN0b3JlIGtzID0gbnVsbDsKKworICAgIGNsaWVudEtleSA9IFNTTENvbnNjcnlwdFBsYWluVGV4dEV4cG9zdXJlVGVzdC5nZXRSZXNvdXJjZShSLnJhdy5jdmVfMjAxN18xMzMwOV9jbGllbnQpOworICAgIHRydXN0ZWRDZXJ0ID0gU1NMQ29uc2NyeXB0UGxhaW5UZXh0RXhwb3N1cmVUZXN0LmdldFJlc291cmNlKFIucmF3LmN2ZV8yMDE3XzEzMzA5X3RydXN0ZWRjZXJ0KTsKKworICAgIHRyeSB7CisgICAgICBrcyA9IEtleVN0b3JlLmdldEluc3RhbmNlKEtleVN0b3JlLmdldERlZmF1bHRUeXBlKCkpOworICAgIH0gY2F0Y2ggKEtleVN0b3JlRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgfQorICAgIEtleVN0b3JlIHRzID0gbnVsbDsKKyAgICB0cnkgeworICAgICAgdHMgPSBLZXlTdG9yZS5nZXRJbnN0YW5jZShLZXlTdG9yZS5nZXREZWZhdWx0VHlwZSgpKTsKKyAgICB9IGNhdGNoIChLZXlTdG9yZUV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgIH0KKworICAgIHRyeSB7CisgICAgICBrcy5sb2FkKGNsaWVudEtleSwgInBvY2NsaWVudCIudG9DaGFyQXJyYXkoKSk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIHRzLmxvYWQodHJ1c3RlZENlcnQsICJ0cnVzdGVkIi50b0NoYXJBcnJheSgpKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICB9CisKKyAgICBLZXlNYW5hZ2VyRmFjdG9yeSBrbWYgPSBudWxsOworICAgIHRyeSB7CisgICAgICBrbWYgPSBLZXlNYW5hZ2VyRmFjdG9yeS5nZXRJbnN0YW5jZShLZXlNYW5hZ2VyRmFjdG9yeS5nZXREZWZhdWx0QWxnb3JpdGhtKCkpOworICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgIH0KKworICAgIHRyeSB7CisgICAgICBrbWYuaW5pdChrcywgImtleXBhc3MiLnRvQ2hhckFycmF5KCkpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgIH0KKworICAgIFRydXN0TWFuYWdlckZhY3RvcnkgdG1mID0gbnVsbDsKKyAgICB0cnkgeworICAgICAgdG1mID0gVHJ1c3RNYW5hZ2VyRmFjdG9yeS5nZXRJbnN0YW5jZShUcnVzdE1hbmFnZXJGYWN0b3J5LmdldERlZmF1bHRBbGdvcml0aG0oKSk7CisgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgfQorICAgIHRyeSB7CisgICAgICB0bWYuaW5pdCh0cyk7CisgICAgfSBjYXRjaCAoS2V5U3RvcmVFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICB9CisKKyAgICBTU0xDb250ZXh0IHNzbEN0eCA9IG51bGw7CisgICAgdHJ5IHsKKyAgICAgIHNzbEN0eCA9IFNTTENvbnRleHQuZ2V0SW5zdGFuY2UoIlRMU3YxLjIiKTsKKyAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgc3NsQ3R4LmluaXQoa21mLmdldEtleU1hbmFnZXJzKCksIHRtZi5nZXRUcnVzdE1hbmFnZXJzKCksIG51bGwpOworICAgIH0gY2F0Y2ggKEtleU1hbmFnZW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICB9CisKKyAgICBzc2xjID0gc3NsQ3R4OworCisgICAgY2xpZW50RW5naW5lID0gc3NsYy5jcmVhdGVTU0xFbmdpbmUocmVtb3RlQWRkcmVzcywgcG9ydCk7CisgICAgY2xpZW50RW5naW5lLnNldFVzZUNsaWVudE1vZGUodHJ1ZSk7CisgICAgU1NMU2Vzc2lvbiBzZXNzaW9uID0gY2xpZW50RW5naW5lLmdldFNlc3Npb24oKTsKKworICAgIGhzT3V0QXBwQnVmZmVyID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSg0MDk2KTsKKyAgICBoc091dE5ldEJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoc2Vzc2lvbi5nZXRQYWNrZXRCdWZmZXJTaXplKCkpOworICAgIGhzSW5BcHBCdWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKDQwOTYpOworICAgIGhzSW5OZXRCdWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKHNlc3Npb24uZ2V0UGFja2V0QnVmZmVyU2l6ZSgpKTsKKyAgICBkYXRhT3V0TmV0QnVmZmVyID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShzZXNzaW9uLmdldFBhY2tldEJ1ZmZlclNpemUoKSk7CisKKyAgICB0cnkgeworICAgICAgc29ja2V0Q2hhbm5lbCA9IFNvY2tldENoYW5uZWwub3BlbigpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgfQorICAgIHRyeSB7CisgICAgICBzb2NrZXRDaGFubmVsLmNvbmZpZ3VyZUJsb2NraW5nKGZhbHNlKTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgIH0KKyAgICB0cnkgeworICAgICAgc29ja2V0Q2hhbm5lbC5jb25uZWN0KG5ldyBJbmV0U29ja2V0QWRkcmVzcyhyZW1vdGVBZGRyZXNzLCBwb3J0KSk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgd2hpbGUoIXNvY2tldENoYW5uZWwuZmluaXNoQ29ubmVjdCgpKSB7CisgICAgICB9CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgY2xpZW50RW5naW5lLmJlZ2luSGFuZHNoYWtlKCk7CisgICAgfSBjYXRjaCAoU1NMRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIGlzSGFuZHNoYWtlZCA9IGRvSGFuZHNoYWtlKHNvY2tldENoYW5uZWwsIGNsaWVudEVuZ2luZSk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICB9CisKKyAgICBpZihpc0hhbmRzaGFrZWQpIHsKKyAgICAgIGRhdGFPdXRBcHBCdWZmZXJzWzBdID0gQnl0ZUJ1ZmZlci53cmFwKCJQTEFJTiBURVhUIEVYUE9TRUQiLmdldEJ5dGVzKCkpOworICAgICAgZGF0YU91dEFwcEJ1ZmZlcnNbMV0gPSBCeXRlQnVmZmVyLndyYXAoIlBMQUlOIFRFWFQgRVhQT1NFRCIuZ2V0Qnl0ZXMoKSk7CisgICAgICBkYXRhT3V0QXBwQnVmZmVyc1syXSA9IEJ5dGVCdWZmZXIud3JhcCgiUExBSU4gVEVYVCBFWFBPU0VEIi5nZXRCeXRlcygpKTsKKworICAgICAgd2hpbGUoZGF0YU91dEFwcEJ1ZmZlcnNbMF0uaGFzUmVtYWluaW5nKCkgfHwgZGF0YU91dEFwcEJ1ZmZlcnNbMV0uaGFzUmVtYWluaW5nKCkgfHwgZGF0YU91dEFwcEJ1ZmZlcnNbMl0uaGFzUmVtYWluaW5nKCkpIHsKKyAgICAgICAgZGF0YU91dE5ldEJ1ZmZlci5jbGVhcigpOworICAgICAgICBTU0xFbmdpbmVSZXN1bHQgcmVzdWx0ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICByZXN1bHQgPSBjbGllbnRFbmdpbmUud3JhcChkYXRhT3V0QXBwQnVmZmVycywgMCwgMywgZGF0YU91dE5ldEJ1ZmZlcik7CisgICAgICAgIH0gY2F0Y2ggKFNTTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2gocmVzdWx0LmdldFN0YXR1cygpKSB7CisgICAgICAgICAgY2FzZSBPSzoKKyAgICAgICAgICAgIGRhdGFPdXROZXRCdWZmZXIuZmxpcCgpOworICAgICAgICAgICAgU3RyaW5nIG91dGJ1ZmYgPSBuZXcgU3RyaW5nKCIiKTsKKyAgICAgICAgICAgIEZvcm1hdHRlciBmb3JtYXR0ZXIgPSBuZXcgRm9ybWF0dGVyKCk7CisgICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgZGF0YU91dE5ldEJ1ZmZlci5saW1pdCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgb3V0YnVmZiArPSBmb3JtYXR0ZXIuZm9ybWF0KCIlMDJ4ICIsIGRhdGFPdXROZXRCdWZmZXIuZ2V0KGkpKS50b1N0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nIG91dHB1dCA9IG5ldyBTdHJpbmcoZGF0YU91dE5ldEJ1ZmZlci5hcnJheSgpKTsKKyAgICAgICAgICAgIFNTTENvbnNjcnlwdFBsYWluVGV4dEV4cG9zdXJlVGVzdC5zZXRPdXRwdXQob3V0cHV0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgQlVGRkVSX09WRVJGTE9XOgorICAgICAgICAgICAgZGF0YU91dE5ldEJ1ZmZlciA9IGVubGFyZ2VQYWNrZXRCdWZmZXIoY2xpZW50RW5naW5lLCBkYXRhT3V0TmV0QnVmZmVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgQlVGRkVSX1VOREVSRkxPVzoKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgIHRocm93IG5ldyBTU0xFeGNlcHRpb24oIkJ1ZmZlciB1bmRlcmZsb3cgaW4gc2VuZGluZyBkYXRhIik7CisgICAgICAgICAgICB9IGNhdGNoIChTU0xFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgIGNhc2UgQ0xPU0VEOgorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgY2xvc2VDb25uZWN0aW9uKHNvY2tldENoYW5uZWwsIGNsaWVudEVuZ2luZSk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkludmFsaWQgU1NMIHN0YXR1czogIiArIHJlc3VsdC5nZXRTdGF0dXMoKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICB0cnkgeworICAgICAgY2xpZW50S2V5LmNsb3NlKCk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSl7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgIH0KKworICAgIHRyeXsKKyAgICAgIHRydXN0ZWRDZXJ0LmNsb3NlKCk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSl7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgIH0KKworICAgIHRyeSB7CisgICAgICBzaHV0ZG93bigpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgc2h1dGRvd24oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGNsb3NlQ29ubmVjdGlvbihzb2NrZXRDaGFubmVsLCBjbGllbnRFbmdpbmUpOworICAgIGV4ZWN1dG9yLnNodXRkb3duKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBjbG9zZUNvbm5lY3Rpb24oU29ja2V0Q2hhbm5lbCBzb2NrZXRDaGFubmVsLCBTU0xFbmdpbmUgZW5naW5lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGVuZ2luZS5jbG9zZU91dGJvdW5kKCk7CisgICAgZG9IYW5kc2hha2Uoc29ja2V0Q2hhbm5lbCwgZW5naW5lKTsKKyAgICBzb2NrZXRDaGFubmVsLmNsb3NlKCk7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBkb0hhbmRzaGFrZShTb2NrZXRDaGFubmVsIHNvY2tldENoYW5uZWwsIFNTTEVuZ2luZSBlbmdpbmUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgU1NMRW5naW5lUmVzdWx0IHJlc3VsdDsKKyAgICBTU0xFbmdpbmVSZXN1bHQuSGFuZHNoYWtlU3RhdHVzIGhhbmRzaGFrZVN0YXR1czsKKyAgICBpbnQgYXBwQnVmZmVyU2l6ZSA9IGVuZ2luZS5nZXRTZXNzaW9uKCkuZ2V0QXBwbGljYXRpb25CdWZmZXJTaXplKCk7CisKKyAgICBCeXRlQnVmZmVyIHNyY0FwcERhdGEgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKGFwcEJ1ZmZlclNpemUpOworICAgIEJ5dGVCdWZmZXIgZHN0QXBwRGF0YSA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoYXBwQnVmZmVyU2l6ZSk7CisKKyAgICBzcmNBcHBEYXRhLmNsZWFyKCk7CisgICAgZHN0QXBwRGF0YS5jbGVhcigpOworCisgICAgaGFuZHNoYWtlU3RhdHVzID0gZW5naW5lLmdldEhhbmRzaGFrZVN0YXR1cygpOworICAgIHdoaWxlIChoYW5kc2hha2VTdGF0dXMgIT0gU1NMRW5naW5lUmVzdWx0LkhhbmRzaGFrZVN0YXR1cy5GSU5JU0hFRAorICAgICAgICAmJiBoYW5kc2hha2VTdGF0dXMgIT0gU1NMRW5naW5lUmVzdWx0LkhhbmRzaGFrZVN0YXR1cy5OT1RfSEFORFNIQUtJTkcpIHsKKyAgICAgIHN3aXRjaChoYW5kc2hha2VTdGF0dXMpIHsKKyAgICAgICAgY2FzZSBORUVEX1VOV1JBUDoKKyAgICAgICAgICBpZihzb2NrZXRDaGFubmVsLnJlYWQoaHNJbk5ldEJ1ZmZlcikgPCAwKSB7CisgICAgICAgICAgICBpZihlbmdpbmUuaXNJbmJvdW5kRG9uZSgpICYmIGVuZ2luZS5pc091dGJvdW5kRG9uZSgpKSB7CisgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgIGVuZ2luZS5jbG9zZUluYm91bmQoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNTTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgIExvZy5lKCJwb2MtdGVzdCIsIkZvcmNlZCB0byBjbG9zZSBpbmJvdW5kLiBObyBwcm9wZXIgU1NML1RMUyBjbG9zZSBub3RpZmljYXRpb24gbWVzc2FnZSBmcm9tIHBlZXIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVuZ2luZS5jbG9zZU91dGJvdW5kKCk7CisgICAgICAgICAgICBoYW5kc2hha2VTdGF0dXMgPSBlbmdpbmUuZ2V0SGFuZHNoYWtlU3RhdHVzKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgaHNJbk5ldEJ1ZmZlci5mbGlwKCk7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGVuZ2luZS51bndyYXAoaHNJbk5ldEJ1ZmZlciwgaHNJbkFwcEJ1ZmZlcik7CisgICAgICAgICAgICBoc0luTmV0QnVmZmVyLmNvbXBhY3QoKTsKKyAgICAgICAgICAgIGhhbmRzaGFrZVN0YXR1cyA9IHJlc3VsdC5nZXRIYW5kc2hha2VTdGF0dXMoKTsKKyAgICAgICAgICB9IGNhdGNoIChTU0xFeGNlcHRpb24gc3NsRXhjZXB0aW9uKSB7CisgICAgICAgICAgICBlbmdpbmUuY2xvc2VPdXRib3VuZCgpOworICAgICAgICAgICAgaGFuZHNoYWtlU3RhdHVzID0gZW5naW5lLmdldEhhbmRzaGFrZVN0YXR1cygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIHN3aXRjaChyZXN1bHQuZ2V0U3RhdHVzKCkpIHsKKyAgICAgICAgICAgIGNhc2UgT0s6CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCVUZGRVJfT1ZFUkZMT1c6CisgICAgICAgICAgICAgIGhzSW5BcHBCdWZmZXIgPSBlbmxhcmdlQXBwbGljYXRpb25CdWZmZXIoZW5naW5lLCBoc0luQXBwQnVmZmVyKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJVRkZFUl9VTkRFUkZMT1c6CisgICAgICAgICAgICAgIGhzSW5OZXRCdWZmZXIgPSBoYW5kbGVCdWZmZXJVbmRlcmZsb3coZW5naW5lLCBoc0luTmV0QnVmZmVyKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENMT1NFRDoKKyAgICAgICAgICAgICAgaWYgKGVuZ2luZS5pc091dGJvdW5kRG9uZSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGVuZ2luZS5jbG9zZU91dGJvdW5kKCk7CisgICAgICAgICAgICAgICAgaGFuZHNoYWtlU3RhdHVzID0gZW5naW5lLmdldEhhbmRzaGFrZVN0YXR1cygpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJbnZhbGlkIFNTTCBzdGF0dXM6ICIgKyByZXN1bHQuZ2V0U3RhdHVzKCkpOworICAgICAgICAgIH0KKyAgICAgICAgY2FzZSBORUVEX1dSQVA6CisgICAgICAgICAgaHNPdXROZXRCdWZmZXIuY2xlYXIoKTsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVzdWx0ID0gZW5naW5lLndyYXAoaHNPdXRBcHBCdWZmZXIsIGhzT3V0TmV0QnVmZmVyKTsKKyAgICAgICAgICAgIGhhbmRzaGFrZVN0YXR1cyA9IHJlc3VsdC5nZXRIYW5kc2hha2VTdGF0dXMoKTsKKyAgICAgICAgICB9IGNhdGNoIChTU0xFeGNlcHRpb24gc3NsRXhjZXB0aW9uKSB7CisgICAgICAgICAgICBlbmdpbmUuY2xvc2VPdXRib3VuZCgpOworICAgICAgICAgICAgaGFuZHNoYWtlU3RhdHVzID0gZW5naW5lLmdldEhhbmRzaGFrZVN0YXR1cygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIHN3aXRjaChyZXN1bHQuZ2V0U3RhdHVzKCkpIHsKKyAgICAgICAgICAgIGNhc2UgT0s6CisgICAgICAgICAgICAgIGhzT3V0TmV0QnVmZmVyLmZsaXAoKTsKKyAgICAgICAgICAgICAgd2hpbGUoaHNPdXROZXRCdWZmZXIuaGFzUmVtYWluaW5nKCkpIHsKKyAgICAgICAgICAgICAgICBzb2NrZXRDaGFubmVsLndyaXRlKGhzT3V0TmV0QnVmZmVyKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQlVGRkVSX09WRVJGTE9XOgorICAgICAgICAgICAgICBoc091dE5ldEJ1ZmZlciA9IGVubGFyZ2VQYWNrZXRCdWZmZXIoZW5naW5lLCBoc091dE5ldEJ1ZmZlcik7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCVUZGRVJfVU5ERVJGTE9XOgorICAgICAgICAgICAgICB0aHJvdyBuZXcgU1NMRXhjZXB0aW9uKCJCdWZmZXIgdW5kZXJmbG93IGluIGhhbmRzaGFrZSBhbmQgd3JhcCIpOworICAgICAgICAgICAgY2FzZSBDTE9TRUQ6CisgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaHNPdXROZXRCdWZmZXIuZmxpcCgpOworICAgICAgICAgICAgICAgIHdoaWxlKGhzT3V0TmV0QnVmZmVyLmhhc1JlbWFpbmluZygpKSB7CisgICAgICAgICAgICAgICAgICBzb2NrZXRDaGFubmVsLndyaXRlKGhzT3V0TmV0QnVmZmVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaHNJbk5ldEJ1ZmZlci5jbGVhcigpOworICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGhhbmRzaGFrZVN0YXR1cyA9IGVuZ2luZS5nZXRIYW5kc2hha2VTdGF0dXMoKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkludmFsaWQgU1NMIHN0YXR1czogIiArIHJlc3VsdC5nZXRTdGF0dXMoKSk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5FRURfVEFTSzoKKyAgICAgICAgICBSdW5uYWJsZSB0YXNrOworICAgICAgICAgIHdoaWxlKCh0YXNrID0gZW5naW5lLmdldERlbGVnYXRlZFRhc2soKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZSh0YXNrKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaGFuZHNoYWtlU3RhdHVzID0gZW5naW5lLmdldEhhbmRzaGFrZVN0YXR1cygpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZJTklTSEVEOgorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5PVF9IQU5EU0hBS0lORzoKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJbnZhbGlkIFNTTCBzdGF0dXM6ICIgKyBoYW5kc2hha2VTdGF0dXMpOworICAgICAgfQorICAgICAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBwdWJsaWMgQnl0ZUJ1ZmZlciBlbmxhcmdlUGFja2V0QnVmZmVyKFNTTEVuZ2luZSBlbmdpbmUsIEJ5dGVCdWZmZXIgYnVmZmVyKSB7CisgICAgcmV0dXJuIGVubGFyZ2VCdWZmZXIoYnVmZmVyLCBlbmdpbmUuZ2V0U2Vzc2lvbigpLmdldFBhY2tldEJ1ZmZlclNpemUoKSk7CisgIH0KKworICBwdWJsaWMgQnl0ZUJ1ZmZlciBlbmxhcmdlQXBwbGljYXRpb25CdWZmZXIoU1NMRW5naW5lIGVuZ2luZSwgQnl0ZUJ1ZmZlciBidWZmZXIpIHsKKyAgICByZXR1cm4gZW5sYXJnZUJ1ZmZlcihidWZmZXIsIGVuZ2luZS5nZXRTZXNzaW9uKCkuZ2V0QXBwbGljYXRpb25CdWZmZXJTaXplKCkpOworICB9CisKKyAgcHVibGljIEJ5dGVCdWZmZXIgZW5sYXJnZUJ1ZmZlcihCeXRlQnVmZmVyIGJ1ZmZlciwgaW50IGJ1ZmZlclNpemUpIHsKKyAgICBpZihidWZmZXJTaXplID4gYnVmZmVyLmNhcGFjaXR5KCkpIHsKKyAgICAgIGJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoYnVmZmVyU2l6ZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgYnVmZmVyID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShidWZmZXIuY2FwYWNpdHkoKSAqIDIpOworICAgIH0KKyAgICByZXR1cm4gYnVmZmVyOworICB9CisgIHB1YmxpYyBCeXRlQnVmZmVyIGhhbmRsZUJ1ZmZlclVuZGVyZmxvdyhTU0xFbmdpbmUgZW5naW5lLCBCeXRlQnVmZmVyIGJ1ZmZlcikgeworICAgIGlmKGVuZ2luZS5nZXRTZXNzaW9uKCkuZ2V0UGFja2V0QnVmZmVyU2l6ZSgpIDwgYnVmZmVyLmxpbWl0KCkpIHsKKyAgICAgIHJldHVybiBidWZmZXI7CisgICAgfQorICAgIGVsc2UgeworICAgICAgQnl0ZUJ1ZmZlciByZXBsYWNlQnVmZmVyID0gZW5sYXJnZVBhY2tldEJ1ZmZlcihlbmdpbmUsIGJ1ZmZlcik7CisgICAgICBidWZmZXIuZmxpcCgpOworICAgICAgcmVwbGFjZUJ1ZmZlci5wdXQoYnVmZmVyKTsKKyAgICAgIHJldHVybiByZXBsYWNlQnVmZmVyOworICAgIH0KKyAgfQorfQorCitjbGFzcyBUZXN0U1NMU2VydmVyIHsKKworICBwdWJsaWMgU2VydmVyUnVubmFibGUgc2VydmVyUnVubmFibGU7CisgIFRocmVhZCBzZXJ2ZXI7CisKKyAgcHVibGljIFRlc3RTU0xTZXJ2ZXIoKSB7CisgICAgc2VydmVyUnVubmFibGUgPSBuZXcgU2VydmVyUnVubmFibGUoKTsKKyAgICBzZXJ2ZXIgPSBuZXcgVGhyZWFkKHNlcnZlclJ1bm5hYmxlKTsKKyAgICBzZXJ2ZXIuc3RhcnQoKTsKKworICAgIHRyeXsKKyAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKKyAgICB9Y2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gZSl7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgIH0KKyAgfQorCisgIHByb3RlY3RlZCB2b2lkIG9uQ2FuY2VsbGVkKFN0cmluZyByZXN1bHQpIHsKKyAgICBzZXJ2ZXJSdW5uYWJsZS5zdG9wKCk7CisgIH0KK30KKworY2xhc3MgU2VydmVyUnVubmFibGUgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisKKyAgU1NMU2VydmVyIHNlcnZlcjsKKyAgSW5wdXRTdHJlYW0gc2VydmVyS2V5ID0gbnVsbDsKKyAgSW5wdXRTdHJlYW0gdHJ1c3RlZENlcnQgPSBudWxsOworCisgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICB0cnkgeworICAgICAgc2VydmVyID0gbmV3IFNTTFNlcnZlcigpOworICAgICAgc2VydmVyLnJ1blNlcnZlcigpOworICAgIH0KKyAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgc3RvcCgpIHsKKyAgICBzZXJ2ZXIuc3RvcFNlcnZlcigpOworICB9Cit9CisKK2NsYXNzIFNTTFNlcnZlciB7CisgIHB1YmxpYyBTU0xDb250ZXh0IHNlcnZlckNvbnRleHQ7CisKKyAgcHVibGljIEJ5dGVCdWZmZXIgaHNJbkFwcEJ1ZmZlciwgaHNJbk5ldEJ1ZmZlciwgaHNPdXRBcHBCdWZmZXIsIGhzT3V0TmV0QnVmZmVyOworICBwdWJsaWMgQnl0ZUJ1ZmZlciBkYXRhSW5BcHBCdWZmZXIsIGRhdGFJbk5ldEJ1ZmZlcjsKKworICBmaW5hbCBTdHJpbmcgaG9zdEFkZHJlc3MgPSAiMTI3LjAuMC4xIjsKKyAgcHVibGljIGludCBwb3J0ID0gNzAwMDsKKyAgcHVibGljIGJvb2xlYW4gYkFjdGl2ZSA9IGZhbHNlOworCisgIHB1YmxpYyBTZWxlY3RvciBzZWxlY3RvcjsKKyAgSW5wdXRTdHJlYW0gc2VydmVyS2V5ID0gbnVsbDsKKyAgSW5wdXRTdHJlYW0gdHJ1c3RlZENlcnQgPSBudWxsOworICBwdWJsaWMgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yID0gRXhlY3V0b3JzLm5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yKCk7CisKKyAgcHVibGljIHZvaWQgc3RvcFNlcnZlcigpIHsKKyAgICBiQWN0aXZlID0gZmFsc2U7CisgICAgZXhlY3V0b3Iuc2h1dGRvd24oKTsKKyAgICBzZWxlY3Rvci53YWtldXAoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHJ1blNlcnZlcigpIHsKKyAgICBLZXlTdG9yZSBrcyA9IG51bGw7CisKKyAgICBzZXJ2ZXJLZXkgPSBTU0xDb25zY3J5cHRQbGFpblRleHRFeHBvc3VyZVRlc3QuZ2V0UmVzb3VyY2UoUi5yYXcuY3ZlXzIwMTdfMTMzMDlfc2VydmVyKTsKKyAgICB0cnVzdGVkQ2VydCA9IFNTTENvbnNjcnlwdFBsYWluVGV4dEV4cG9zdXJlVGVzdC5nZXRSZXNvdXJjZShSLnJhdy5jdmVfMjAxN18xMzMwOV90cnVzdGVkY2VydCk7CisKKyAgICB0cnkgeworICAgICAga3MgPSBLZXlTdG9yZS5nZXRJbnN0YW5jZShLZXlTdG9yZS5nZXREZWZhdWx0VHlwZSgpKTsKKyAgICB9IGNhdGNoIChLZXlTdG9yZUV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgIH0KKyAgICBLZXlTdG9yZSB0cyA9IG51bGw7CisgICAgdHJ5IHsKKyAgICAgIHRzID0gS2V5U3RvcmUuZ2V0SW5zdGFuY2UoS2V5U3RvcmUuZ2V0RGVmYXVsdFR5cGUoKSk7CisgICAgfSBjYXRjaCAoS2V5U3RvcmVFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICB9CisKKyAgICB0cnkgeworICAgICAga3MubG9hZChzZXJ2ZXJLZXksICJwb2NzZXJ2ZXIiLnRvQ2hhckFycmF5KCkpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgIH0KKyAgICB0cnkgeworICAgICAgdHMubG9hZCh0cnVzdGVkQ2VydCwgInRydXN0ZWQiLnRvQ2hhckFycmF5KCkpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgIH0KKworICAgIEtleU1hbmFnZXJGYWN0b3J5IGttZiA9IG51bGw7CisgICAgdHJ5IHsKKyAgICAgIGttZiA9IEtleU1hbmFnZXJGYWN0b3J5LmdldEluc3RhbmNlKEtleU1hbmFnZXJGYWN0b3J5LmdldERlZmF1bHRBbGdvcml0aG0oKSk7CisgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgfQorICAgIHRyeSB7CisgICAgICBrbWYuaW5pdChrcywgImtleXBhc3MiLnRvQ2hhckFycmF5KCkpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgIH0KKworICAgIFRydXN0TWFuYWdlckZhY3RvcnkgdG1mID0gbnVsbDsKKyAgICB0cnkgeworICAgICAgdG1mID0gVHJ1c3RNYW5hZ2VyRmFjdG9yeS5nZXRJbnN0YW5jZShUcnVzdE1hbmFnZXJGYWN0b3J5LmdldERlZmF1bHRBbGdvcml0aG0oKSk7CisgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgfQorICAgIHRyeSB7CisgICAgICB0bWYuaW5pdCh0cyk7CisgICAgfSBjYXRjaCAoS2V5U3RvcmVFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICB9CisKKyAgICBTU0xDb250ZXh0IHNzbEN0eCA9IG51bGw7CisgICAgdHJ5IHsKKyAgICAgIHNzbEN0eCA9IFNTTENvbnRleHQuZ2V0SW5zdGFuY2UoIlRMU3YxLjIiKTsKKyAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgc3NsQ3R4LmluaXQoa21mLmdldEtleU1hbmFnZXJzKCksIHRtZi5nZXRUcnVzdE1hbmFnZXJzKCksIG5ldyBTZWN1cmVSYW5kb20oKSk7CisgICAgfSBjYXRjaCAoS2V5TWFuYWdlbWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgIH0KKworICAgIHNlcnZlckNvbnRleHQgPSBzc2xDdHg7CisKKyAgICBTU0xTZXNzaW9uIGR1bW15U2Vzc2lvbiA9IHNlcnZlckNvbnRleHQuY3JlYXRlU1NMRW5naW5lKCkuZ2V0U2Vzc2lvbigpOworCisgICAgaHNJbkFwcEJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoNDA5Nik7CisgICAgaHNJbk5ldEJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoZHVtbXlTZXNzaW9uLmdldFBhY2tldEJ1ZmZlclNpemUoKSk7CisgICAgaHNPdXRBcHBCdWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKDQwOTYpOworICAgIGhzT3V0TmV0QnVmZmVyID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShkdW1teVNlc3Npb24uZ2V0UGFja2V0QnVmZmVyU2l6ZSgpKTsKKyAgICBkYXRhSW5BcHBCdWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKDQwOTYpOworICAgIGRhdGFJbk5ldEJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoZHVtbXlTZXNzaW9uLmdldFBhY2tldEJ1ZmZlclNpemUoKSk7CisgICAgZHVtbXlTZXNzaW9uLmludmFsaWRhdGUoKTsKKworICAgIHRyeSB7CisgICAgICBzZWxlY3RvciA9IFNlbGVjdG9yUHJvdmlkZXIucHJvdmlkZXIoKS5vcGVuU2VsZWN0b3IoKTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgIH0KKyAgICBTZXJ2ZXJTb2NrZXRDaGFubmVsIHNlcnZlclNvY2tldENoYW5uZWwgPSBudWxsOworICAgIHRyeSB7CisgICAgICBzZXJ2ZXJTb2NrZXRDaGFubmVsID0gU2VydmVyU29ja2V0Q2hhbm5lbC5vcGVuKCk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICB9CisgICAgdHJ5IHsKKyAgICAgIHNlcnZlclNvY2tldENoYW5uZWwuY29uZmlndXJlQmxvY2tpbmcoZmFsc2UpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgfQorICAgIHRyeSB7CisgICAgICBzZXJ2ZXJTb2NrZXRDaGFubmVsLnNvY2tldCgpLmJpbmQobmV3IEluZXRTb2NrZXRBZGRyZXNzKGhvc3RBZGRyZXNzLCBwb3J0KSk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICB9CisgICAgdHJ5IHsKKyAgICAgIHNlcnZlclNvY2tldENoYW5uZWwucmVnaXN0ZXIoc2VsZWN0b3IsIFNlbGVjdGlvbktleS5PUF9BQ0NFUFQpOworICAgIH0gY2F0Y2ggKENsb3NlZENoYW5uZWxFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICB9CisKKyAgICBiQWN0aXZlID0gdHJ1ZTsKKworICAgIHdoaWxlKGJBY3RpdmUpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIHNlbGVjdG9yLnNlbGVjdCgpOworICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgfQorICAgICAgSXRlcmF0b3I8U2VsZWN0aW9uS2V5PiBzZWxlY3RlZEtleXMgPSBzZWxlY3Rvci5zZWxlY3RlZEtleXMoKS5pdGVyYXRvcigpOworICAgICAgd2hpbGUgKHNlbGVjdGVkS2V5cy5oYXNOZXh0KCkpIHsKKyAgICAgICAgU2VsZWN0aW9uS2V5IGtleSA9IHNlbGVjdGVkS2V5cy5uZXh0KCk7CisgICAgICAgIHNlbGVjdGVkS2V5cy5yZW1vdmUoKTsKKyAgICAgICAgaWYgKCFrZXkuaXNWYWxpZCgpKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGtleS5pc0FjY2VwdGFibGUoKSkgeworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhY2NlcHQoa2V5KTsKKyAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoa2V5LmlzUmVhZGFibGUoKSkgeworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkKChTb2NrZXRDaGFubmVsKSBrZXkuY2hhbm5lbCgpLCAoU1NMRW5naW5lKSBrZXkuYXR0YWNobWVudCgpKTsKKyAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIGFjY2VwdChTZWxlY3Rpb25LZXkga2V5KSB0aHJvd3MgRXhjZXB0aW9ueworICAgIFNvY2tldENoYW5uZWwgc29ja2V0Q2hhbm5lbCA9ICgoU2VydmVyU29ja2V0Q2hhbm5lbClrZXkuY2hhbm5lbCgpKS5hY2NlcHQoKTsKKyAgICBzb2NrZXRDaGFubmVsLmNvbmZpZ3VyZUJsb2NraW5nKGZhbHNlKTsKKworICAgIFNTTEVuZ2luZSBlbmdpbmUgPSBzZXJ2ZXJDb250ZXh0LmNyZWF0ZVNTTEVuZ2luZSgpOworICAgIGVuZ2luZS5zZXRVc2VDbGllbnRNb2RlKGZhbHNlKTsKKyAgICBlbmdpbmUuYmVnaW5IYW5kc2hha2UoKTsKKworICAgIHNvY2tldENoYW5uZWwucmVnaXN0ZXIoc2VsZWN0b3IsIFNlbGVjdGlvbktleS5PUF9SRUFELCBlbmdpbmUpOworCisgICAgaWYoZG9IYW5kc2hha2Uoc29ja2V0Q2hhbm5lbCwgZW5naW5lKSkgeworICAgICAgc29ja2V0Q2hhbm5lbC5yZWdpc3RlcihzZWxlY3RvciwgU2VsZWN0aW9uS2V5Lk9QX1JFQUQsIGVuZ2luZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgc29ja2V0Q2hhbm5lbC5jbG9zZSgpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGRvSGFuZHNoYWtlKFNvY2tldENoYW5uZWwgc29ja2V0Q2hhbm5lbCwgU1NMRW5naW5lIGVuZ2luZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBTU0xFbmdpbmVSZXN1bHQgcmVzdWx0ID0gbnVsbDsKKyAgICBTU0xFbmdpbmVSZXN1bHQuSGFuZHNoYWtlU3RhdHVzIGhhbmRzaGFrZVN0YXR1czsKKyAgICBpbnQgYXBwQnVmZmVyU2l6ZSA9IGVuZ2luZS5nZXRTZXNzaW9uKCkuZ2V0QXBwbGljYXRpb25CdWZmZXJTaXplKCk7CisKKyAgICBCeXRlQnVmZmVyIHNyY0FwcERhdGEgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKGFwcEJ1ZmZlclNpemUpOworICAgIEJ5dGVCdWZmZXIgZHN0QXBwRGF0YSA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoYXBwQnVmZmVyU2l6ZSk7CisKKyAgICBzcmNBcHBEYXRhLmNsZWFyKCk7CisgICAgZHN0QXBwRGF0YS5jbGVhcigpOworCisgICAgaGFuZHNoYWtlU3RhdHVzID0gZW5naW5lLmdldEhhbmRzaGFrZVN0YXR1cygpOworICAgIHdoaWxlIChoYW5kc2hha2VTdGF0dXMgIT0gU1NMRW5naW5lUmVzdWx0LkhhbmRzaGFrZVN0YXR1cy5GSU5JU0hFRAorICAgICAgICAmJiBoYW5kc2hha2VTdGF0dXMgIT0gU1NMRW5naW5lUmVzdWx0LkhhbmRzaGFrZVN0YXR1cy5OT1RfSEFORFNIQUtJTkcpIHsKKworICAgICAgc3dpdGNoKGhhbmRzaGFrZVN0YXR1cykgeworICAgICAgICBjYXNlIE5FRURfVU5XUkFQOgorICAgICAgICAgIGlmKHNvY2tldENoYW5uZWwucmVhZChoc0luTmV0QnVmZmVyKSA8IDApIHsKKyAgICAgICAgICAgIGlmKGVuZ2luZS5pc0luYm91bmREb25lKCkgJiYgZW5naW5lLmlzT3V0Ym91bmREb25lKCkpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgZW5naW5lLmNsb3NlSW5ib3VuZCgpOworICAgICAgICAgICAgfSBjYXRjaCAoU1NMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgTG9nLmUoInNlcnZlci1wb2MtdGVzdCIsIkZvcmNlZCB0byBjbG9zZSBpbmJvdW5kLiBObyBwcm9wZXIgU1NML1RMUyBjbG9zZSBub3RpZmljYXRpb24gbWVzc2FnZSBmcm9tIHBlZXIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVuZ2luZS5jbG9zZU91dGJvdW5kKCk7CisgICAgICAgICAgICBoYW5kc2hha2VTdGF0dXMgPSBlbmdpbmUuZ2V0SGFuZHNoYWtlU3RhdHVzKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgaHNJbk5ldEJ1ZmZlci5mbGlwKCk7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGVuZ2luZS51bndyYXAoaHNJbk5ldEJ1ZmZlciwgaHNJbkFwcEJ1ZmZlcik7CisgICAgICAgICAgICBoc0luTmV0QnVmZmVyLmNvbXBhY3QoKTsKKyAgICAgICAgICAgIGhhbmRzaGFrZVN0YXR1cyA9IHJlc3VsdC5nZXRIYW5kc2hha2VTdGF0dXMoKTsKKyAgICAgICAgICB9IGNhdGNoIChTU0xFeGNlcHRpb24gc3NsRXhjZXB0aW9uKSB7CisgICAgICAgICAgICBlbmdpbmUuY2xvc2VPdXRib3VuZCgpOworICAgICAgICAgICAgaGFuZHNoYWtlU3RhdHVzID0gZW5naW5lLmdldEhhbmRzaGFrZVN0YXR1cygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIHN3aXRjaChyZXN1bHQuZ2V0U3RhdHVzKCkpIHsKKyAgICAgICAgICAgIGNhc2UgT0s6CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCVUZGRVJfT1ZFUkZMT1c6CisgICAgICAgICAgICAgIGhzSW5BcHBCdWZmZXIgPSBlbmxhcmdlQXBwbGljYXRpb25CdWZmZXIoZW5naW5lLCBoc0luQXBwQnVmZmVyKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJVRkZFUl9VTkRFUkZMT1c6CisgICAgICAgICAgICAgIGhzSW5OZXRCdWZmZXIgPSBoYW5kbGVCdWZmZXJVbmRlcmZsb3coZW5naW5lLCBoc0luTmV0QnVmZmVyKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENMT1NFRDoKKyAgICAgICAgICAgICAgaWYgKGVuZ2luZS5pc091dGJvdW5kRG9uZSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGVuZ2luZS5jbG9zZU91dGJvdW5kKCk7CisgICAgICAgICAgICAgICAgaGFuZHNoYWtlU3RhdHVzID0gZW5naW5lLmdldEhhbmRzaGFrZVN0YXR1cygpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJbnZhbGlkIFNTTCBzdGF0dXM6ICIgKyByZXN1bHQuZ2V0U3RhdHVzKCkpOworICAgICAgICAgIH0KKyAgICAgICAgY2FzZSBORUVEX1dSQVA6CisgICAgICAgICAgaHNPdXROZXRCdWZmZXIuY2xlYXIoKTsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVzdWx0ID0gZW5naW5lLndyYXAoaHNPdXRBcHBCdWZmZXIsIGhzT3V0TmV0QnVmZmVyKTsKKyAgICAgICAgICAgIGhhbmRzaGFrZVN0YXR1cyA9IHJlc3VsdC5nZXRIYW5kc2hha2VTdGF0dXMoKTsKKyAgICAgICAgICB9IGNhdGNoIChTU0xFeGNlcHRpb24gc3NsRXhjZXB0aW9uKSB7CisgICAgICAgICAgICBlbmdpbmUuY2xvc2VPdXRib3VuZCgpOworICAgICAgICAgICAgaGFuZHNoYWtlU3RhdHVzID0gZW5naW5lLmdldEhhbmRzaGFrZVN0YXR1cygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIHN3aXRjaChyZXN1bHQuZ2V0U3RhdHVzKCkpIHsKKyAgICAgICAgICAgIGNhc2UgT0s6CisgICAgICAgICAgICAgIGhzT3V0TmV0QnVmZmVyLmZsaXAoKTsKKyAgICAgICAgICAgICAgd2hpbGUoaHNPdXROZXRCdWZmZXIuaGFzUmVtYWluaW5nKCkpIHsKKyAgICAgICAgICAgICAgICBzb2NrZXRDaGFubmVsLndyaXRlKGhzT3V0TmV0QnVmZmVyKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQlVGRkVSX09WRVJGTE9XOgorICAgICAgICAgICAgICBoc091dE5ldEJ1ZmZlciA9IGVubGFyZ2VQYWNrZXRCdWZmZXIoZW5naW5lLCBoc091dE5ldEJ1ZmZlcik7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCVUZGRVJfVU5ERVJGTE9XOgorICAgICAgICAgICAgICB0aHJvdyBuZXcgU1NMRXhjZXB0aW9uKCJCdWZmZXIgdW5kZXJmbG93IGluIGhhbmRzaGFrZSBhbmQgd3JhcCIpOworICAgICAgICAgICAgY2FzZSBDTE9TRUQ6CisgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaHNPdXROZXRCdWZmZXIuZmxpcCgpOworICAgICAgICAgICAgICAgIHdoaWxlKGhzT3V0TmV0QnVmZmVyLmhhc1JlbWFpbmluZygpKSB7CisgICAgICAgICAgICAgICAgICBzb2NrZXRDaGFubmVsLndyaXRlKGhzT3V0TmV0QnVmZmVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaHNJbk5ldEJ1ZmZlci5jbGVhcigpOworICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGhhbmRzaGFrZVN0YXR1cyA9IGVuZ2luZS5nZXRIYW5kc2hha2VTdGF0dXMoKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkludmFsaWQgU1NMIHN0YXR1czogIiArIHJlc3VsdC5nZXRTdGF0dXMoKSk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5FRURfVEFTSzoKKyAgICAgICAgICBSdW5uYWJsZSB0YXNrOworICAgICAgICAgIHdoaWxlKCh0YXNrID0gZW5naW5lLmdldERlbGVnYXRlZFRhc2soKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZSh0YXNrKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaGFuZHNoYWtlU3RhdHVzID0gZW5naW5lLmdldEhhbmRzaGFrZVN0YXR1cygpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZJTklTSEVEOgorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5PVF9IQU5EU0hBS0lORzoKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJbnZhbGlkIFNTTCBzdGF0dXM6ICIgKyBoYW5kc2hha2VTdGF0dXMpOworICAgICAgfQorICAgICAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBwdWJsaWMgQnl0ZUJ1ZmZlciBlbmxhcmdlUGFja2V0QnVmZmVyKFNTTEVuZ2luZSBlbmdpbmUsIEJ5dGVCdWZmZXIgYnVmZmVyKSB7CisgICAgcmV0dXJuIGVubGFyZ2VCdWZmZXIoYnVmZmVyLCBlbmdpbmUuZ2V0U2Vzc2lvbigpLmdldFBhY2tldEJ1ZmZlclNpemUoKSk7CisgIH0KKworICBwdWJsaWMgQnl0ZUJ1ZmZlciBlbmxhcmdlQXBwbGljYXRpb25CdWZmZXIoU1NMRW5naW5lIGVuZ2luZSwgQnl0ZUJ1ZmZlciBidWZmZXIpIHsKKyAgICByZXR1cm4gZW5sYXJnZUJ1ZmZlcihidWZmZXIsIGVuZ2luZS5nZXRTZXNzaW9uKCkuZ2V0QXBwbGljYXRpb25CdWZmZXJTaXplKCkpOworICB9CisKKyAgcHVibGljIEJ5dGVCdWZmZXIgZW5sYXJnZUJ1ZmZlcihCeXRlQnVmZmVyIGJ1ZmZlciwgaW50IGJ1ZmZlclNpemUpIHsKKyAgICBpZihidWZmZXJTaXplID4gYnVmZmVyLmNhcGFjaXR5KCkpIHsKKyAgICAgIGJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoYnVmZmVyU2l6ZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgYnVmZmVyID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShidWZmZXIuY2FwYWNpdHkoKSAqIDIpOworICAgIH0KKyAgICByZXR1cm4gYnVmZmVyOworICB9CisgIHB1YmxpYyBCeXRlQnVmZmVyIGhhbmRsZUJ1ZmZlclVuZGVyZmxvdyhTU0xFbmdpbmUgZW5naW5lLCBCeXRlQnVmZmVyIGJ1ZmZlcikgeworICAgIGlmKGVuZ2luZS5nZXRTZXNzaW9uKCkuZ2V0UGFja2V0QnVmZmVyU2l6ZSgpIDwgYnVmZmVyLmxpbWl0KCkpIHsKKyAgICAgIHJldHVybiBidWZmZXI7CisgICAgfQorICAgIGVsc2UgeworICAgICAgQnl0ZUJ1ZmZlciByZXBsYWNlQnVmZmVyID0gZW5sYXJnZVBhY2tldEJ1ZmZlcihlbmdpbmUsIGJ1ZmZlcik7CisgICAgICBidWZmZXIuZmxpcCgpOworICAgICAgcmVwbGFjZUJ1ZmZlci5wdXQoYnVmZmVyKTsKKyAgICAgIHJldHVybiByZXBsYWNlQnVmZmVyOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHJlYWQoU29ja2V0Q2hhbm5lbCBzb2NrZXRDaGFubmVsLCBTU0xFbmdpbmUgZW5naW5lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGRhdGFJbk5ldEJ1ZmZlci5jbGVhcigpOworICAgIGludCBieXRlc1JlYWQgPSBzb2NrZXRDaGFubmVsLnJlYWQoZGF0YUluTmV0QnVmZmVyKTsKKyAgICBpZihieXRlc1JlYWQgPiAwKSB7CisgICAgICBkYXRhSW5OZXRCdWZmZXIuZmxpcCgpOworICAgICAgd2hpbGUoZGF0YUluTmV0QnVmZmVyLmhhc1JlbWFpbmluZygpKSB7CisgICAgICAgIGRhdGFJbkFwcEJ1ZmZlci5jbGVhcigpOworICAgICAgICBTU0xFbmdpbmVSZXN1bHQgcmVzdWx0ID0gZW5naW5lLnVud3JhcChkYXRhSW5OZXRCdWZmZXIsIGRhdGFJbkFwcEJ1ZmZlcik7CisgICAgICAgIHN3aXRjaChyZXN1bHQuZ2V0U3RhdHVzKCkpIHsKKyAgICAgICAgICBjYXNlIE9LOgorICAgICAgICAgICAgZGF0YUluQXBwQnVmZmVyLmZsaXAoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgQlVGRkVSX09WRVJGTE9XOgorICAgICAgICAgICAgZGF0YUluQXBwQnVmZmVyID0gZW5sYXJnZUFwcGxpY2F0aW9uQnVmZmVyKGVuZ2luZSwgZGF0YUluQXBwQnVmZmVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgQlVGRkVSX1VOREVSRkxPVzoKKyAgICAgICAgICAgIGRhdGFJbk5ldEJ1ZmZlciA9IGhhbmRsZUJ1ZmZlclVuZGVyZmxvdyhlbmdpbmUsIGRhdGFJbk5ldEJ1ZmZlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIENMT1NFRDoKKyAgICAgICAgICAgIGNsb3NlQ29ubmVjdGlvbihzb2NrZXRDaGFubmVsLCBlbmdpbmUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbnZhbGlkIFNTTCBzdGF0dXM6ICIgKyByZXN1bHQuZ2V0U3RhdHVzKCkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYoYnl0ZXNSZWFkIDwgMCkgeworICAgICAgaGFuZGxlRW5kT2ZTdHJlYW0oc29ja2V0Q2hhbm5lbCwgZW5naW5lKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCBoYW5kbGVFbmRPZlN0cmVhbShTb2NrZXRDaGFubmVsIHNvY2tldENoYW5uZWwsIFNTTEVuZ2luZSBlbmdpbmUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIGVuZ2luZS5jbG9zZUluYm91bmQoKTsKKyAgICB9CisgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBMb2cuZSgic2VydmVyLXBvYy10ZXN0IiwgIkNsb3NlIGluYm91bmQgZm9yY2VkIik7CisgICAgfQorICAgIGNsb3NlQ29ubmVjdGlvbihzb2NrZXRDaGFubmVsLCBlbmdpbmUpOworICB9CisKKyAgcHVibGljIHZvaWQgY2xvc2VDb25uZWN0aW9uKFNvY2tldENoYW5uZWwgc29ja2V0Q2hhbm5lbCwgU1NMRW5naW5lIGVuZ2luZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB0cnl7CisgICAgICBzZXJ2ZXJLZXkuY2xvc2UoKTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKXsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIHRydXN0ZWRDZXJ0LmNsb3NlKCk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSl7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgIH0KKworICAgIGVuZ2luZS5jbG9zZU91dGJvdW5kKCk7CisgICAgZG9IYW5kc2hha2Uoc29ja2V0Q2hhbm5lbCwgZW5naW5lKTsKKyAgICBzb2NrZXRDaGFubmVsLmNsb3NlKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3NyYy9hbmRyb2lkL3NlY3VyaXR5L2N0cy9TdGFnZWZyaWdodFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3NyYy9hbmRyb2lkL3NlY3VyaXR5L2N0cy9TdGFnZWZyaWdodFRlc3QuamF2YQppbmRleCA3MmJkYjNhLi44ZThiMGMyIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9zZWN1cml0eS9zcmMvYW5kcm9pZC9zZWN1cml0eS9jdHMvU3RhZ2VmcmlnaHRUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvc2VjdXJpdHkvc3JjL2FuZHJvaWQvc2VjdXJpdHkvY3RzL1N0YWdlZnJpZ2h0VGVzdC5qYXZhCkBAIC0yNyw2ICsyNyw4IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldEZpbGVEZXNjcmlwdG9yOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlN1cmZhY2VUZXh0dXJlOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb2RlYzsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29kZWNJbmZvOwpAQCAtNDcsMTEgKzQ5LDE0IEBACiAKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNyYXNoVXRpbHM7CiAKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwpAQCAtODYsNiArOTEsMTYgQEAKICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICAgICBAU2VjdXJpdHlUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0YWdlZnJpZ2h0X2J1Z18zNjcyNTQwNygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkb1N0YWdlZnJpZ2h0VGVzdChSLnJhdy5idWdfMzY3MjU0MDcpOworICAgIH0KKworICAgIEBTZWN1cml0eVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhZ2VmcmlnaHRfY3ZlXzIwMTZfMzgyOSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkb1N0YWdlZnJpZ2h0VGVzdChSLnJhdy5jdmVfMjAxNl8zODI5KTsKKyAgICB9CisKKyAgICBAU2VjdXJpdHlUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFN0YWdlZnJpZ2h0X2N2ZV8yMDE3XzA2NDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZG9TdGFnZWZyaWdodFRlc3QoUi5yYXcuY3ZlXzIwMTdfMDY0Myk7CiAgICAgfQpAQCAtMTE2LDEyICsxMzEsNiBAQAogICAgIH0KIAogICAgIEBTZWN1cml0eVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhZ2VmcmlnaHRfYnVnXzIzMjcwNzI0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGRvU3RhZ2VmcmlnaHRUZXN0KFIucmF3LmJ1Z18yMzI3MDcyNF8xKTsKLSAgICAgICAgZG9TdGFnZWZyaWdodFRlc3QoUi5yYXcuYnVnXzIzMjcwNzI0XzIpOwotICAgIH0KLQotICAgIEBTZWN1cml0eVRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhZ2VmcmlnaHRfYnVnXzIyNzcxMTMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGRvU3RhZ2VmcmlnaHRUZXN0KFIucmF3LmJ1Z18yMjc3MTEzMik7CiAgICAgfQpAQCAtMjI5LDYgKzIzOCwxMSBAQAogICAgIH0KIAogICAgIEBTZWN1cml0eVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhZ2VmcmlnaHRfY3ZlXzIwMTZfNjc2NigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkb1N0YWdlZnJpZ2h0VGVzdChSLnJhdy5jdmVfMjAxNl82NzY2KTsKKyAgICB9CisKKyAgICBAU2VjdXJpdHlUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFN0YWdlZnJpZ2h0X2J1Z18yNjM2NjI1NigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBkb1N0YWdlZnJpZ2h0VGVzdChSLnJhdy5idWdfMjYzNjYyNTYpOwogICAgIH0KQEAgLTI1MCw2ICsyNjQsMTEgQEAKICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICAgICBAU2VjdXJpdHlUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0YWdlZnJpZ2h0X2J1Z182NTEyMzQ3MSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkb1N0YWdlZnJpZ2h0VGVzdChSLnJhdy5idWdfNjUxMjM0NzEpOworICAgIH0KKworICAgIEBTZWN1cml0eVRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhZ2VmcmlnaHRfYnVnXzcyMTY1MDI3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGRvU3RhZ2VmcmlnaHRUZXN0KFIucmF3LmJ1Z183MjE2NTAyNyk7CiAgICAgfQpAQCAtMjY0LDM0ICsyODMsOTAgQEAKICAgICAgICAgZG9TdGFnZWZyaWdodFRlc3QoUi5yYXcuY3ZlXzIwMTdfMDg1Ml9iXzYyODE1NTA2KTsKICAgICB9CiAKKyAgICBAU2VjdXJpdHlUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0YWdlZnJpZ2h0X2N2ZV8yMDE3XzEzMjI5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGRvU3RhZ2VmcmlnaHRUZXN0KFIucmF3LmN2ZV8yMDE3XzEzMjI5KTsKKyAgICB9CisKKyAgICBAU2VjdXJpdHlUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0YWdlZnJpZ2h0X2N2ZV8yMDE3XzA3NjMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZG9TdGFnZWZyaWdodFRlc3QoUi5yYXcuY3ZlXzIwMTdfMDc2Myk7CisgICAgfQorCiAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgIHRvIHByZXZlbnQgbWVyZ2UgY29uZmxpY3RzLCBhZGQgTSB0ZXN0cyBiZWxvdyB0aGlzIGNvbW1lbnQsCiAgICAgIGJlZm9yZSBhbnkgZXhpc3RpbmcgdGVzdCBtZXRob2RzCiAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAgICAgQFNlY3VyaXR5VGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCdWdfNzM5NjU4OTAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW50W10gZnJhbWVTaXplcyA9IGdldEZyYW1lU2l6ZXMoUi5yYXcuYnVnXzczOTY1ODkwX2ZyYW1lbGVuKTsKKyAgICAgICAgZG9TdGFnZWZyaWdodFRlc3RSYXdCbG9iKFIucmF3LmJ1Z183Mzk2NTg5MF9oZXZjLCAidmlkZW8vaGV2YyIsIDMyMCwgMjQwLCBmcmFtZVNpemVzKTsKKyAgICB9CisKKyAgICBAU2VjdXJpdHlUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0YWdlZnJpZ2h0X2N2ZV8yMDE2XzM5MjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZG9TdGFnZWZyaWdodFRlc3QoUi5yYXcuY3ZlXzIwMTZfMzkyMCk7CisgICAgfQorCisgICAgQFNlY3VyaXR5VGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFnZWZyaWdodF9idWdfNjg5NTM4NTQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZG9TdGFnZWZyaWdodFRlc3QoUi5yYXcuYnVnXzY4OTUzODU0LCAxICogNjAgKiAxMDAwKTsKICAgICB9CiAKICAgICBAU2VjdXJpdHlUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0YWdlZnJpZ2h0X2J1Z18zODQ0ODM4MSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkb1N0YWdlZnJpZ2h0VGVzdChSLnJhdy5idWdfMzg0NDgzODEpOworICAgIH0KKworICAgIEBTZWN1cml0eVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhZ2VmcmlnaHRfY3ZlXzIwMTZfMzgyMSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkb1N0YWdlZnJpZ2h0VGVzdChSLnJhdy5jdmVfMjAxNl8zODIxKTsKKyAgICB9CisKKyAgICBAU2VjdXJpdHlUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFN0YWdlZnJpZ2h0X2J1Z183MDg5NzQ1NCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBkb1N0YWdlZnJpZ2h0VGVzdFJhd0Jsb2IoUi5yYXcuYjcwODk3NDU0X2F2YywgInZpZGVvL2F2YyIsIDMyMCwgNDIwKTsKICAgICB9CiAKICAgICBAU2VjdXJpdHlUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0YWdlZnJpZ2h0X2N2ZV8yMDE2XzM3NDJfYl8yODE2NTY1OSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkb1N0YWdlZnJpZ2h0VGVzdChSLnJhdy5jdmVfMjAxNl8zNzQyX2JfMjgxNjU2NTkpOworICAgIH0KKworICAgIEBTZWN1cml0eVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhZ2VmcmlnaHRfYnVnXzM1MDM5OTQ2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGRvU3RhZ2VmcmlnaHRUZXN0UmF3QmxvYihSLnJhdy5idWdfMzUwMzk5NDZfaGV2YywgInZpZGVvL2hldmMiLCAzMjAsIDQyMCk7CisgICAgfQorCisgICAgQFNlY3VyaXR5VGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFnZWZyaWdodF9idWdfMzgxMTUwNzYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZG9TdGFnZWZyaWdodFRlc3QoUi5yYXcuYnVnXzM4MTE1MDc2KTsKKyAgICB9CisKKyAgICBAU2VjdXJpdHlUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0YWdlZnJpZ2h0X2J1Z18zNDYxODYwNygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkb1N0YWdlZnJpZ2h0VGVzdChSLnJhdy5idWdfMzQ2MTg2MDcpOworICAgIH0KKworICAgIEBTZWN1cml0eVRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhZ2VmcmlnaHRfYnVnXzY5NDc4NDI1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGRvU3RhZ2VmcmlnaHRUZXN0KFIucmF3LmJ1Z182OTQ3ODQyNSk7CiAgICAgfQogCiAgICAgQFNlY3VyaXR5VGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFnZWZyaWdodF9idWdfNjU3MzU3MTYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZG9TdGFnZWZyaWdodFRlc3RSYXdCbG9iKFIucmF3LmJ1Z182NTczNTcxNl9hdmMsICJ2aWRlby9hdmMiLCAzMjAsIDI0MCk7CisgICAgfQorCisgICAgQFNlY3VyaXR5VGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFnZWZyaWdodF9idWdfNjU3MTc1MzMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZG9TdGFnZWZyaWdodFRlc3QoUi5yYXcuYnVnXzY1NzE3NTMzX2hlYWRlcl9jb3JydXB0KTsKICAgICB9CiAKICAgICBAU2VjdXJpdHlUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFN0YWdlZnJpZ2h0X2N2ZV8yMDE3XzA4NTcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZG9TdGFnZWZyaWdodFRlc3QoUi5yYXcuY3ZlXzIwMTdfMDg1Nyk7CisgICAgcHVibGljIHZvaWQgdGVzdFN0YWdlZnJpZ2h0X2J1Z18zODIzOTg2NCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkb1N0YWdlZnJpZ2h0VGVzdChSLnJhdy5idWdfMzgyMzk4NjQsICg0ICogNjAgKiAxMDAwKSk7CiAgICAgfQogCiAgICAgQFNlY3VyaXR5VGVzdApAQCAtMzAwLDI1ICszNzUsMTYzIEBACiAgICAgfQogCiAgICAgQFNlY3VyaXR5VGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCdWdfMzgwMTQ5OTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW50W10gZnJhbWVTaXplcyA9IGdldEZyYW1lU2l6ZXMoUi5yYXcuYnVnXzM4MDE0OTkyX2ZyYW1lbGVuKTsKKyAgICAgICAgZG9TdGFnZWZyaWdodFRlc3RSYXdCbG9iKFIucmF3LmJ1Z18zODAxNDk5Ml9hdmMsICJ2aWRlby9hdmMiLCA2NDAsIDQ4MCwgZnJhbWVTaXplcyk7CisgICAgfQorCisgICAgQFNlY3VyaXR5VGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCdWdfMzU1ODQ0MjUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW50W10gZnJhbWVTaXplcyA9IGdldEZyYW1lU2l6ZXMoUi5yYXcuYnVnXzM1NTg0NDI1X2ZyYW1lbGVuKTsKKyAgICAgICAgZG9TdGFnZWZyaWdodFRlc3RSYXdCbG9iKFIucmF3LmJ1Z18zNTU4NDQyNV9hdmMsICJ2aWRlby9hdmMiLCAzNTIsIDI4OCwgZnJhbWVTaXplcyk7CisgICAgfQorCisgICAgQFNlY3VyaXR5VGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCdWdfMzEwOTI0NjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW50W10gZnJhbWVTaXplcyA9IGdldEZyYW1lU2l6ZXMoUi5yYXcuYnVnXzMxMDkyNDYyX2ZyYW1lbGVuKTsKKyAgICAgICAgZG9TdGFnZWZyaWdodFRlc3RSYXdCbG9iKFIucmF3LmJ1Z18zMTA5MjQ2Ml9hdmMsICJ2aWRlby9hdmMiLCAxMjgwLCAxMDI0LCBmcmFtZVNpemVzKTsKKyAgICB9CisKKyAgICBAU2VjdXJpdHlUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJ1Z18zNDA5Nzg2NigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbnRbXSBmcmFtZVNpemVzID0gZ2V0RnJhbWVTaXplcyhSLnJhdy5idWdfMzQwOTc4NjZfZnJhbWVfbGVuKTsKKyAgICAgICAgZG9TdGFnZWZyaWdodFRlc3RSYXdCbG9iKFIucmF3LmJ1Z18zNDA5Nzg2Nl9hdmMsICJ2aWRlby9hdmMiLCAzNTIsIDI4OCwgZnJhbWVTaXplcyk7CisgICAgfQorCisgICAgQFNlY3VyaXR5VGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCdWdfMzM4NjIwMjEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW50W10gZnJhbWVTaXplcyA9IGdldEZyYW1lU2l6ZXMoUi5yYXcuYnVnXzMzODYyMDIxX2ZyYW1lX2xlbik7CisgICAgICAgIGRvU3RhZ2VmcmlnaHRUZXN0UmF3QmxvYihSLnJhdy5idWdfMzM4NjIwMjFfaGV2YywgInZpZGVvL2hldmMiLCAxNjAsIDk2LCBmcmFtZVNpemVzKTsKKyAgICB9CisKKyAgICBAU2VjdXJpdHlUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJ1Z18zMzM4NzgyMCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbnRbXSBmcmFtZVNpemVzID0gezQ1LCAzMjAyLCA0MzAsIDI1MjZ9OworICAgICAgICBkb1N0YWdlZnJpZ2h0VGVzdFJhd0Jsb2IoUi5yYXcuYnVnXzMzMzg3ODIwX2F2YywgInZpZGVvL2F2YyIsIDMyMCwgMjQwLCBmcmFtZVNpemVzKTsKKyAgICB9CisKKyAgICBAU2VjdXJpdHlUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJ1Z18zNzAwODA5NigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbnRbXSBmcmFtZVNpemVzID0gezI0NSwgMTIsIDMzLCAxNDAsIDE2NH07CisgICAgICAgIGRvU3RhZ2VmcmlnaHRUZXN0UmF3QmxvYihSLnJhdy5idWdfMzcwMDgwOTZfYXZjLCAidmlkZW8vYXZjIiwgMzIwLCAyNDAsIGZyYW1lU2l6ZXMpOworICAgIH0KKworICAgIEBTZWN1cml0eVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhZ2VmcmlnaHRfYnVnXzM0MjMxMTYzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGludFtdIGZyYW1lU2l6ZXMgPSB7MjIsIDM1NywgMjE3LCAyOTMsIDE3NX07CisgICAgICAgIGRvU3RhZ2VmcmlnaHRUZXN0UmF3QmxvYihSLnJhdy5idWdfMzQyMzExNjNfbXBlZzIsICJ2aWRlby9tcGVnMiIsIDMyMCwgMjQwLCBmcmFtZVNpemVzKTsKKyAgICB9CisKKyAgICBAU2VjdXJpdHlUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0YWdlZnJpZ2h0X2J1Z18zMzkzMzE0MCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbnRbXSBmcmFtZVNpemVzID0gZ2V0RnJhbWVTaXplcyhSLnJhdy5idWdfMzM5MzMxNDBfZnJhbWVsZW4pOworICAgICAgICBkb1N0YWdlZnJpZ2h0VGVzdFJhd0Jsb2IoUi5yYXcuYnVnXzMzOTMzMTQwX2F2YywgInZpZGVvL2F2YyIsIDMyMCwgMjQwLCBmcmFtZVNpemVzKTsKKyAgICB9CisKKyAgICBAU2VjdXJpdHlUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0YWdlZnJpZ2h0X2J1Z18zNDA5NzkxNSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbnRbXSBmcmFtZVNpemVzID0gezQxNDAsIDU5MywgMCwgMTU0OTV9OworICAgICAgICBkb1N0YWdlZnJpZ2h0VGVzdFJhd0Jsb2IoUi5yYXcuYnVnXzM0MDk3OTE1X2F2YywgInZpZGVvL2F2YyIsIDMyMCwgMjQwLCBmcmFtZVNpemVzKTsKKyAgICB9CisKKyAgICBAU2VjdXJpdHlUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0YWdlZnJpZ2h0X2J1Z18zNDA5NzIxMygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbnRbXSBmcmFtZVNpemVzID0gezI1NzEsIDIxMCwgMzM4NTh9OworICAgICAgICBkb1N0YWdlZnJpZ2h0VGVzdFJhd0Jsb2IoUi5yYXcuYnVnXzM0MDk3MjEzX2F2YywgInZpZGVvL2F2YyIsIDMyMCwgMjQwLCBmcmFtZVNpemVzKTsKKyAgICB9CisKKyAgICBAU2VjdXJpdHlUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJ1Z18yODgxNjk1NigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbnRbXSBmcmFtZVNpemVzID0gZ2V0RnJhbWVTaXplcyhSLnJhdy5idWdfMjg4MTY5NTZfZnJhbWVsZW4pOworICAgICAgICBkb1N0YWdlZnJpZ2h0VGVzdFJhd0Jsb2IoUi5yYXcuYnVnXzI4ODE2OTU2X2hldmMsICJ2aWRlby9oZXZjIiwgMzUyLCAyODgsIGZyYW1lU2l6ZXMpOworICAgIH0KKworICAgIEBTZWN1cml0eVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QnVnXzMzODE4NTAwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGludFtdIGZyYW1lU2l6ZXMgPSBnZXRGcmFtZVNpemVzKFIucmF3LmJ1Z18zMzgxODUwMF9mcmFtZWxlbik7CisgICAgICAgIGRvU3RhZ2VmcmlnaHRUZXN0UmF3QmxvYihSLnJhdy5idWdfMzM4MTg1MDBfYXZjLCAidmlkZW8vYXZjIiwgNjQsIDMyLCBmcmFtZVNpemVzKTsKKyAgICB9CisKKyAgICBAU2VjdXJpdHlUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJ1Z182NDc4NDk3MygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbnRbXSBmcmFtZVNpemVzID0gZ2V0RnJhbWVTaXplcyhSLnJhdy5idWdfNjQ3ODQ5NzNfZnJhbWVsZW4pOworICAgICAgICBkb1N0YWdlZnJpZ2h0VGVzdFJhd0Jsb2IoUi5yYXcuYnVnXzY0Nzg0OTczX2hldmMsICJ2aWRlby9oZXZjIiwgMTI4MCwgNzIwLCBmcmFtZVNpemVzKTsKKyAgICB9CisKKyAgICBAU2VjdXJpdHlUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJ1Z18zNDIzMTIzMSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbnRbXSBmcmFtZVNpemVzID0gZ2V0RnJhbWVTaXplcyhSLnJhdy5idWdfMzQyMzEyMzFfZnJhbWVsZW4pOworICAgICAgICBkb1N0YWdlZnJpZ2h0VGVzdFJhd0Jsb2IoUi5yYXcuYnVnXzM0MjMxMjMxX21wZWcyLCAidmlkZW8vbXBlZzIiLCAzNTIsIDI4OCwgZnJhbWVTaXplcyk7CisgICAgfQorCisgICAgQFNlY3VyaXR5VGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCdWdfNjMwNDU5MTgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW50W10gZnJhbWVTaXplcyA9IGdldEZyYW1lU2l6ZXMoUi5yYXcuYnVnXzYzMDQ1OTE4X2ZyYW1lbGVuKTsKKyAgICAgICAgZG9TdGFnZWZyaWdodFRlc3RSYXdCbG9iKFIucmF3LmJ1Z182MzA0NTkxOF9oZXZjLCAidmlkZW8vaGV2YyIsIDM1MiwgMjg4LCBmcmFtZVNpemVzKTsKKyAgICB9CisKKyAgICBAU2VjdXJpdHlUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJ1Z18zMzI5ODA4OSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbnRbXSBmcmFtZVNpemVzID0gezMyNDcsIDQzMCwgMjIxLCAyMzA1fTsKKyAgICAgICAgZG9TdGFnZWZyaWdodFRlc3RSYXdCbG9iKFIucmF3LmJ1Z18zMzI5ODA4OV9hdmMsICJ2aWRlby9hdmMiLCAzMiwgNjQsIGZyYW1lU2l6ZXMpOworICAgIH0KKworICAgIEBTZWN1cml0eVRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhZ2VmcmlnaHRfY3ZlXzIwMTdfMDU5OSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBkb1N0YWdlZnJpZ2h0VGVzdChSLnJhdy5jdmVfMjAxN18wNTk5KTsKICAgICB9CiAKICAgICBAU2VjdXJpdHlUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0YWdlZnJpZ2h0X2J1Z18zNjQ5Mjc0MSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkb1N0YWdlZnJpZ2h0VGVzdChSLnJhdy5idWdfMzY0OTI3NDEpOworICAgIH0KKworICAgIEBTZWN1cml0eVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhZ2VmcmlnaHRfYnVnXzM4NDg3NTY0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGRvU3RhZ2VmcmlnaHRUZXN0KFIucmF3LmJ1Z18zODQ4NzU2NCwgKDQgKiA2MCAqIDEwMDApKTsKKyAgICB9CisKKyAgICBAU2VjdXJpdHlUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0YWdlZnJpZ2h0X2J1Z18zNzIzNzM5NigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkb1N0YWdlZnJpZ2h0VGVzdChSLnJhdy5idWdfMzcyMzczOTYpOworICAgIH0KKworICAgIEBTZWN1cml0eVRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhZ2VmcmlnaHRfY3ZlXzIwMTZfMDg0MigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBkb1N0YWdlZnJpZ2h0VGVzdChSLnJhdy5jdmVfMjAxNl8wODQyKTsKICAgICB9CiAKICAgICBAU2VjdXJpdHlUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0YWdlZnJpZ2h0X2J1Z182MzEyMTY0NCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkb1N0YWdlZnJpZ2h0VGVzdChSLnJhdy5idWdfNjMxMjE2NDQpOworICAgIH0KKworICAgIEBTZWN1cml0eVRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhZ2VmcmlnaHRfY3ZlXzIwMTZfNjcxMigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBkb1N0YWdlZnJpZ2h0VGVzdChSLnJhdy5jdmVfMjAxNl82NzEyKTsKICAgICB9CiAKICAgICBAU2VjdXJpdHlUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0YWdlZnJpZ2h0X2J1Z18zNDA5NzIzMSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkb1N0YWdlZnJpZ2h0VGVzdFJhd0Jsb2IoUi5yYXcuYnVnXzM0MDk3MjMxX2F2YywgInZpZGVvL2F2YyIsIDMyMCwgMjQwKTsKKyAgICB9CisKKyAgICBAU2VjdXJpdHlUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFN0YWdlZnJpZ2h0X2J1Z18zNDA5NzY3MigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBkb1N0YWdlZnJpZ2h0VGVzdChSLnJhdy5idWdfMzQwOTc2NzIpOwogICAgIH0KIAorCisgICAgQFNlY3VyaXR5VGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFnZWZyaWdodF9idWdfMzM3NTExOTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZG9TdGFnZWZyaWdodFRlc3RSYXdCbG9iKFIucmF3LmJ1Z18zMzc1MTE5M19hdmMsICJ2aWRlby9hdmMiLCAzMjAsIDI0MCk7CisgICAgfQorCisgICAgQFNlY3VyaXR5VGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCdWdfMzY5OTMyOTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZG9TdGFnZWZyaWdodFRlc3RSYXdCbG9iKFIucmF3LmJ1Z18zNjk5MzI5MV9hdmMsICJ2aWRlby9hdmMiLCAzMjAsIDI0MCk7CisgICAgfQorCiAgICAgQFNlY3VyaXR5VGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFnZWZyaWdodF9idWdfMzM4MTg1MDgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZG9TdGFnZWZyaWdodFRlc3QoUi5yYXcuYnVnXzMzODE4NTA4KTsKQEAgLTM0MCwxNiArNTUzLDU2IEBACiAgICAgfQogCiAgICAgQFNlY3VyaXR5VGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFnZWZyaWdodF9idWdfNjkyNjk3MDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZG9TdGFnZWZyaWdodFRlc3QoUi5yYXcuYnVnXzY5MjY5NzAyKTsKKyAgICB9CisKKyAgICBAU2VjdXJpdHlUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFN0YWdlZnJpZ2h0X2N2ZV8yMDE1XzM4NjcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZG9TdGFnZWZyaWdodFRlc3QoUi5yYXcuY3ZlXzIwMTVfMzg2Nyk7CiAgICAgfQogCiAgICAgQFNlY3VyaXR5VGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFnZWZyaWdodF9idWdfNjUzOTg4MjEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZG9TdGFnZWZyaWdodFRlc3QoUi5yYXcuYnVnXzY1Mzk4ODIxLCAoIDQgKiA2MCAqIDEwMDAgKSApOworICAgIH0KKworICAgIEBTZWN1cml0eVRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhZ2VmcmlnaHRfY3ZlXzIwMTVfMzg2OSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBkb1N0YWdlZnJpZ2h0VGVzdChSLnJhdy5jdmVfMjAxNV8zODY5KTsKICAgICB9CiAKICAgICBAU2VjdXJpdHlUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0YWdlZnJpZ2h0X2J1Z18yMzQ1Mjc5MigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkb1N0YWdlZnJpZ2h0VGVzdChSLnJhdy5idWdfMjM0NTI3OTIpOworICAgIH0KKworICAgIEBTZWN1cml0eVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhZ2VmcmlnaHRfY3ZlXzIwMTZfMzgyMCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkb1N0YWdlZnJpZ2h0VGVzdChSLnJhdy5jdmVfMjAxNl8zODIwKTsKKyAgICB9CisKKyAgICBAU2VjdXJpdHlUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0YWdlZnJpZ2h0X2N2ZV8yMDE2XzM3NDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZG9TdGFnZWZyaWdodFRlc3QoUi5yYXcuY3ZlXzIwMTZfMzc0MSk7CisgICAgfQorCisgICAgQFNlY3VyaXR5VGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFnZWZyaWdodF9jdmVfMjAxNl8yNTA2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGRvU3RhZ2VmcmlnaHRUZXN0KFIucmF3LmN2ZV8yMDE2XzI1MDYpOworICAgIH0KKworICAgIEBTZWN1cml0eVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhZ2VmcmlnaHRfY3ZlXzIwMTZfMjQyOCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkb1N0YWdlZnJpZ2h0VGVzdChSLnJhdy5jdmVfMjAxNl8yNDI4KTsKKyAgICB9CisKKyAgICBAU2VjdXJpdHlUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0YWdlZnJpZ2h0X2J1Z18zMDgyMjc1NSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkb1N0YWdlZnJpZ2h0VGVzdChSLnJhdy5idWdfMzA4MjI3NTUpOworICAgIH0KKworICAgIEBTZWN1cml0eVRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhZ2VmcmlnaHRfYnVnXzMyMzIyMjU4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGRvU3RhZ2VmcmlnaHRUZXN0KFIucmF3LmJ1Z18zMjMyMjI1OCk7CiAgICAgfQpAQCAtMzYwLDExICs2MTMsMjYgQEAKICAgICB9CiAKICAgICBAU2VjdXJpdHlUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0YWdlZnJpZ2h0X2J1Z18zNTQ3Mjk5NygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkb1N0YWdlZnJpZ2h0VGVzdChSLnJhdy5idWdfMzU0NzI5OTcpOworICAgIH0KKworICAgIEBTZWN1cml0eVRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhZ2VmcmlnaHRfY3ZlXzIwMTVfMzg3M19iXzIwNzE4NTI0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGRvU3RhZ2VmcmlnaHRUZXN0KFIucmF3LmN2ZV8yMDE1XzM4NzNfYl8yMDcxODUyNCk7CiAgICAgfQogCiAgICAgQFNlY3VyaXR5VGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFnZWZyaWdodF9idWdfMzQ4OTY0MzEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZG9TdGFnZWZyaWdodFRlc3QoUi5yYXcuYnVnXzM0ODk2NDMxKTsKKyAgICB9CisKKyAgICBAU2VjdXJpdHlUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJ1Z18zMzY0MTU4OCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkb1N0YWdlZnJpZ2h0VGVzdFJhd0Jsb2IoUi5yYXcuYnVnXzMzNjQxNTg4X2F2YywgInZpZGVvL2F2YyIsIDMyMCwgMjQwKTsKKyAgICB9CisKKyAgICBAU2VjdXJpdHlUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFN0YWdlZnJpZ2h0X2N2ZV8yMDE1XzM4NjJfYl8yMjk1NDAwNigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBkb1N0YWdlZnJpZ2h0VGVzdChSLnJhdy5jdmVfMjAxNV8zODYyX2JfMjI5NTQwMDYpOwogICAgIH0KQEAgLTM5Niw2ICs2NjQsMTIgQEAKICAgICAgICAgZG9TdGFnZWZyaWdodFRlc3QoUi5yYXcuY3ZlXzIwMTVfNjYwNCk7CiAgICAgfQogCisgICAgQFNlY3VyaXR5VGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFnZWZyaWdodF9idWdfMjQxNTc1MjQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZG9TdGFnZWZyaWdodFRlc3QoUi5yYXcuYnVnXzI0MTU3NTI0KTsKKyAgICB9CisKKyAgICBAU2VjdXJpdHlUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFN0YWdlZnJpZ2h0X2N2ZV8yMDE1XzM4NzEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZG9TdGFnZWZyaWdodFRlc3QoUi5yYXcuY3ZlXzIwMTVfMzg3MSk7CiAgICAgfQpAQCAtNDI5LDExICs3MDMsMjEgQEAKICAgICB9CiAKICAgICBAU2VjdXJpdHlUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJ1Z18zNjgxOTI2MigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkb1N0YWdlZnJpZ2h0VGVzdFJhd0Jsb2IoUi5yYXcuYnVnXzM2ODE5MjYyX21wZWcyLCAidmlkZW8vbXBlZzIiLCA2NDAsIDQ4MCk7CisgICAgfQorCisgICAgQFNlY3VyaXR5VGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFnZWZyaWdodF9jdmVfMjAxNV82NjA4X2JfMjM2ODA3ODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZG9TdGFnZWZyaWdodFRlc3QoUi5yYXcuY3ZlXzIwMTVfNjYwOF9iXzIzNjgwNzgwKTsKICAgICB9CiAKICAgICBAU2VjdXJpdHlUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0YWdlZnJpZ2h0X2J1Z18zNjcxNTI2OCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkb1N0YWdlZnJpZ2h0VGVzdChSLnJhdy5idWdfMzY3MTUyNjgpOworICAgIH0KKworICAgIEBTZWN1cml0eVRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhZ2VmcmlnaHRfYnVnXzI3ODU1NDE5X0NWRV8yMDE2XzI0NjMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZG9TdGFnZWZyaWdodFRlc3QoUi5yYXcuYnVnXzI3ODU1NDE5KTsKICAgICB9CkBAIC00NDgsNiArNzMyLDMxIEBACiAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAgICAgQFNlY3VyaXR5VGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFnZWZyaWdodF9jdmVfMjAxN18wNDc0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGRvU3RhZ2VmcmlnaHRUZXN0KFIucmF3LmN2ZV8yMDE3XzA0NzQsIDEyMDAwMCk7CisgICAgfQorCisgICAgQFNlY3VyaXR5VGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFnZWZyaWdodF9jdmVfMjAxN18wNzY1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGRvU3RhZ2VmcmlnaHRUZXN0KFIucmF3LmN2ZV8yMDE3XzA3NjUpOworICAgIH0KKworICAgIEBTZWN1cml0eVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhZ2VmcmlnaHRfY3ZlXzIwMTdfMTMyNzYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZG9TdGFnZWZyaWdodFRlc3QoUi5yYXcuY3ZlXzIwMTdfMTMyNzYpOworICAgIH0KKworICAgIEBTZWN1cml0eVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhZ2VmcmlnaHRfY3ZlXzIwMTZfNjc2NCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkb1N0YWdlZnJpZ2h0VGVzdChSLnJhdy5jdmVfMjAxNl82NzY0KTsKKyAgICB9CisKKyAgICBAU2VjdXJpdHlUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0YWdlZnJpZ2h0X2N2ZV8yMDE3XzEzMjE0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGRvU3RhZ2VmcmlnaHRUZXN0KFIucmF3LmN2ZV8yMDE3XzEzMjE0KTsKKyAgICB9CisKKyAgICBAU2VjdXJpdHlUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFN0YWdlZnJpZ2h0X2J1Z18zNTQ2NzEwNygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBkb1N0YWdlZnJpZ2h0VGVzdChSLnJhdy5idWdfMzU0NjcxMDcpOwogICAgIH0KQEAgLTQ1OCw2ICs3NjcsMTIgQEAKICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICAgICBAU2VjdXJpdHlUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJ1Z182NTE4NjI5MSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbnRbXSBmcmFtZVNpemVzID0gZ2V0RnJhbWVTaXplcyhSLnJhdy5idWdfNjUxODYyOTFfZnJhbWVsZW4pOworICAgICAgICBkb1N0YWdlZnJpZ2h0VGVzdFJhd0Jsb2IoUi5yYXcuYnVnXzY1MTg2MjkxX2hldmMsICJ2aWRlby9oZXZjIiwgMTkyMCwgMTA4MCwgZnJhbWVTaXplcyk7CisgICAgfQorCisgICAgQFNlY3VyaXR5VGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RCdWdfNjc3MzcwMjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZG9TdGFnZWZyaWdodFRlc3QoUi5yYXcuYnVnXzY3NzM3MDIyKTsKICAgICB9CkBAIC00NjcsNiArNzgyLDQ4IEBACiAgICAgICAgIGRvU3RhZ2VmcmlnaHRUZXN0KFIucmF3LmJ1Z18zNzA5MzMxOCwgKDQgKiA2MCAqIDEwMDApKTsKICAgICB9CiAKKyAgICBAU2VjdXJpdHlUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0YWdlZnJpZ2h0X2J1Z183MzE3MjA0NigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkb1N0YWdlZnJpZ2h0VGVzdChSLnJhdy5idWdfNzMxNzIwNDYpOworCisgICAgICAgIEJpdG1hcCBiaXRtYXAgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKAorICAgICAgICAgICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpLmdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKSwgUi5yYXcuYnVnXzczMTcyMDQ2KTsKKyAgICAgICAgLy8gT0sgaWYgdGhlIGRlY29kaW5nIGZhaWxlZCwgYnV0IHNob3VsZG4ndCBjYXVzZSBjcmFzaGVzCisgICAgICAgIGlmIChiaXRtYXAgIT0gbnVsbCkgeworICAgICAgICAgICAgYml0bWFwLnJlY3ljbGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBTZWN1cml0eVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhZ2VmcmlnaHRfY3ZlXzIwMTZfMDgyNCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkb1N0YWdlZnJpZ2h0VGVzdChSLnJhdy5jdmVfMjAxNl8wODI0KTsKKyAgICB9CisKKyAgICBAU2VjdXJpdHlUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0YWdlZnJpZ2h0X2N2ZV8yMDE2XzA4MTUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZG9TdGFnZWZyaWdodFRlc3QoUi5yYXcuY3ZlXzIwMTZfMDgxNSk7CisgICAgfQorCisgICAgQFNlY3VyaXR5VGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFnZWZyaWdodF9jdmVfMjAxNl8yNDU0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGRvU3RhZ2VmcmlnaHRUZXN0KFIucmF3LmN2ZV8yMDE2XzI0NTQpOworICAgIH0KKworICAgIEBTZWN1cml0eVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhZ2VmcmlnaHRfY3ZlXzIwMTZfNjc2NSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkb1N0YWdlZnJpZ2h0VGVzdChSLnJhdy5jdmVfMjAxNl82NzY1KTsKKyAgICB9CisKKyAgICBAU2VjdXJpdHlUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0YWdlZnJpZ2h0X2N2ZV8yMDE2XzI1MDgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZG9TdGFnZWZyaWdodFRlc3QoUi5yYXcuY3ZlXzIwMTZfMjUwOCk7CisgICAgfQorCisgICAgQFNlY3VyaXR5VGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFnZWZyaWdodF9jdmVfMjAxNl82Njk5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGRvU3RhZ2VmcmlnaHRUZXN0KFIucmF3LmN2ZV8yMDE2XzY2OTkpOworICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCBkb1N0YWdlZnJpZ2h0VGVzdChmaW5hbCBpbnQgcmlkKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZG9TdGFnZWZyaWdodFRlc3RNZWRpYVBsYXllcihyaWQpOwogICAgICAgICBkb1N0YWdlZnJpZ2h0VGVzdE1lZGlhQ29kZWMocmlkKTsKQEAgLTQ3NywxMiArODM0LDM4IEBACiAgICAgICAgIEN0c1Rlc3RTZXJ2ZXIgc2VydmVyID0gbmV3IEN0c1Rlc3RTZXJ2ZXIoY29udGV4dCk7CiAgICAgICAgIFN0cmluZyBybmFtZSA9IHJlc291cmNlcy5nZXRSZXNvdXJjZUVudHJ5TmFtZShyaWQpOwogICAgICAgICBTdHJpbmcgdXJsID0gc2VydmVyLmdldEFzc2V0VXJsKCJyYXcvIiArIHJuYW1lKTsKKyAgICAgICAgdmVyaWZ5U2VydmVyKHJpZCwgdXJsKTsKICAgICAgICAgZG9TdGFnZWZyaWdodFRlc3RNZWRpYVBsYXllcih1cmwpOwogICAgICAgICBkb1N0YWdlZnJpZ2h0VGVzdE1lZGlhQ29kZWModXJsKTsKICAgICAgICAgZG9TdGFnZWZyaWdodFRlc3RNZWRpYU1ldGFkYXRhUmV0cmlldmVyKHVybCk7CiAgICAgICAgIHNlcnZlci5zaHV0ZG93bigpOwogICAgIH0KIAorICAgIC8vIHZlcmlmeSB0aGF0IEN0c1Rlc3RTZXJ2ZXIgaXMgZnVuY3Rpb25hbCBieSByZXRyaWV2aW5nIHRoZSBhc3NldAorICAgIC8vIGFuZCBjb21wYXJpbmcgaXQgdG8gdGhlIHJlc291cmNlCisgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeVNlcnZlcihmaW5hbCBpbnQgcmlkLCBmaW5hbCBTdHJpbmcgdXJpKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTG9nLmkoVEFHLCAiY2hlY2tpbmcgc2VydmVyIik7CisgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKHVyaSk7CisgICAgICAgIElucHV0U3RyZWFtIGluMSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHVybC5vcGVuU3RyZWFtKCkpOworCisgICAgICAgIEFzc2V0RmlsZURlc2NyaXB0b3IgZmQgPSBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuUmF3UmVzb3VyY2VGZChyaWQpOworICAgICAgICBJbnB1dFN0cmVhbSBpbjIgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShmZC5jcmVhdGVJbnB1dFN0cmVhbSgpKTsKKworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgaW50IGIxID0gaW4xLnJlYWQoKTsKKyAgICAgICAgICAgIGludCBiMiA9IGluMi5yZWFkKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkN0c1Rlc3RTZXJ2ZXIgZmFpbCIsIGIxLCBiMik7CisgICAgICAgICAgICBpZiAoYjEgPCAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbjEuY2xvc2UoKTsKKyAgICAgICAgaW4yLmNsb3NlKCk7CisgICAgICAgIExvZy5pKFRBRywgImNoZWNrZWQgc2VydmVyIik7CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIGRvU3RhZ2VmcmlnaHRUZXN0KGZpbmFsIGludCByaWQsIGludCB0aW1lb3V0KSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgcnVuV2l0aFRpbWVvdXQobmV3IFJ1bm5hYmxlKCkgewogICAgICAgICAgICAgQE92ZXJyaWRlCkBAIC05OTgsMTEgKzEzODEsNiBAQAogICAgIH0KIAogICAgIEBTZWN1cml0eVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3ZlXzIwMTdfMDc2MigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBkb1N0YWdlZnJpZ2h0VGVzdFJhd0Jsb2IoUi5yYXcuY3ZlXzIwMTdfMDc2MiwgInZpZGVvL2hldmMiLCAzMjAsIDI0MCk7Ci0gICAgfQotCi0gICAgQFNlY3VyaXR5VGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RDdmVfMjAxN18wNjg3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGRvU3RhZ2VmcmlnaHRUZXN0UmF3QmxvYihSLnJhdy5jdmVfMjAxN18wNjg3LCAidmlkZW8vYXZjIiwgMzIwLCAyNDApOwogICAgIH0KQEAgLTEwMTMsMTAgKzEzOTEsMzAgQEAKICAgICB9CiAKICAgICBAU2VjdXJpdHlUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJ1Z18zNzcxMjE4MSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkb1N0YWdlZnJpZ2h0VGVzdFJhd0Jsb2IoUi5yYXcuYnVnXzM3NzEyMTgxX2hldmMsICJ2aWRlby9oZXZjIiwgMzIwLCAyNDApOworICAgIH0KKworICAgIEBTZWN1cml0eVRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QnVnXzcwODk3Mzk0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGRvU3RhZ2VmcmlnaHRUZXN0UmF3QmxvYihSLnJhdy5idWdfNzA4OTczOTRfYXZjLCAidmlkZW8vYXZjIiwgMzIwLCAyNDApOwogICAgIH0KIAorICAgIHByaXZhdGUgaW50W10gZ2V0RnJhbWVTaXplcyhpbnQgcmlkKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBDb250ZXh0IGNvbnRleHQgPSBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRDb250ZXh0KCk7CisgICAgICAgIGZpbmFsIFJlc291cmNlcyByZXNvdXJjZXMgPSAgY29udGV4dC5nZXRSZXNvdXJjZXMoKTsKKyAgICAgICAgQXNzZXRGaWxlRGVzY3JpcHRvciBmZCA9IHJlc291cmNlcy5vcGVuUmF3UmVzb3VyY2VGZChyaWQpOworICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gZmQuY3JlYXRlSW5wdXRTdHJlYW0oKTsKKyAgICAgICAgYnl0ZVtdIGZyYW1lSW5mbyA9IG5ldyBieXRlWyhpbnQpIGZkLmdldExlbmd0aCgpXTsKKyAgICAgICAgZmlzLnJlYWQoZnJhbWVJbmZvKTsKKyAgICAgICAgZmlzLmNsb3NlKCk7CisgICAgICAgIFN0cmluZ1tdIHZhbHVlU3RyID0gbmV3IFN0cmluZyhmcmFtZUluZm8pLnRyaW0oKS5zcGxpdCgiXFxzKyIpOworICAgICAgICBpbnRbXSBmcmFtZVNpemVzID0gbmV3IGludFt2YWx1ZVN0ci5sZW5ndGhdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlU3RyLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgZnJhbWVTaXplc1tpXSA9IEludGVnZXIucGFyc2VJbnQodmFsdWVTdHJbaV0pOworICAgICAgICByZXR1cm4gZnJhbWVTaXplczsKKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgcnVuV2l0aFRpbWVvdXQoUnVubmFibGUgcnVubmVyLCBpbnQgdGltZW91dCkgewogICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQocnVubmVyKTsKICAgICAgICAgdC5zdGFydCgpOwpAQCAtMTE1Myw2ICsxNTUxLDE0MiBAQAogICAgICAgICB0aHIuam9pbigpOwogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBkb1N0YWdlZnJpZ2h0VGVzdFJhd0Jsb2IoaW50IHJpZCwgU3RyaW5nIG1pbWUsIGludCBpbml0V2lkdGgsIGludCBpbml0SGVpZ2h0LAorICAgICAgICBpbnQgZnJhbWVTaXplc1tdKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBmaW5hbCBNZWRpYVBsYXllckNyYXNoTGlzdGVuZXIgbXBjbCA9IG5ldyBNZWRpYVBsYXllckNyYXNoTGlzdGVuZXIoKTsKKyAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0ID0gZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0Q29udGV4dCgpOworICAgICAgICBmaW5hbCBSZXNvdXJjZXMgcmVzb3VyY2VzID0gIGNvbnRleHQuZ2V0UmVzb3VyY2VzKCk7CisKKyAgICAgICAgTG9vcGVyVGhyZWFkIHRociA9IG5ldyBMb29wZXJUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisKKyAgICAgICAgICAgICAgICBNZWRpYVBsYXllciBtcCA9IG5ldyBNZWRpYVBsYXllcigpOworICAgICAgICAgICAgICAgIG1wLnNldE9uRXJyb3JMaXN0ZW5lcihtcGNsKTsKKyAgICAgICAgICAgICAgICBBc3NldEZpbGVEZXNjcmlwdG9yIGZkID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBmZCA9IHJlc291cmNlcy5vcGVuUmF3UmVzb3VyY2VGZChSLnJhdy5nb29kKTsKKworICAgICAgICAgICAgICAgICAgICAvLyB0aGUgb25FcnJvckxpc3RlbmVyIHdvbid0IHJlY2VpdmUgTUVESUFfRVJST1JfU0VSVkVSX0RJRUQgdW50aWwKKyAgICAgICAgICAgICAgICAgICAgLy8gc2V0RGF0YVNvdXJjZSBoYXMgYmVlbiBjYWxsZWQKKyAgICAgICAgICAgICAgICAgICAgbXAuc2V0RGF0YVNvdXJjZShmZC5nZXRGaWxlRGVzY3JpcHRvcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkLmdldFN0YXJ0T2Zmc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmQuZ2V0TGVuZ3RoKCkpOworICAgICAgICAgICAgICAgICAgICBmZC5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBrbm93bi1nb29kIGZpbGUsIHNvIG5vIGZhaWx1cmUgc2hvdWxkIG9jY3VyCisgICAgICAgICAgICAgICAgICAgIGZhaWwoInNldERhdGFTb3VyY2Ugb2Yga25vd24tZ29vZCBmaWxlIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZChtcGNsKSB7CisgICAgICAgICAgICAgICAgICAgIG1wY2wubm90aWZ5KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIExvb3Blci5sb29wKCk7CisgICAgICAgICAgICAgICAgbXAucmVsZWFzZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgdGhyLnN0YXJ0KCk7CisgICAgICAgIC8vIHdhaXQgdW50aWwgdGhlIHRocmVhZCBoYXMgaW5pdGlhbGl6ZWQgdGhlIE1lZGlhUGxheWVyCisgICAgICAgIHN5bmNocm9uaXplZChtcGNsKSB7CisgICAgICAgICAgICBtcGNsLndhaXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEFzc2V0RmlsZURlc2NyaXB0b3IgZmQgPSByZXNvdXJjZXMub3BlblJhd1Jlc291cmNlRmQocmlkKTsKKyAgICAgICAgYnl0ZSBbXSBibG9iID0gbmV3IGJ5dGVbKGludClmZC5nZXRMZW5ndGgoKV07CisgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBmZC5jcmVhdGVJbnB1dFN0cmVhbSgpOworICAgICAgICBpbnQgbnVtUmVhZCA9IGZpcy5yZWFkKGJsb2IpOworICAgICAgICBmaXMuY2xvc2UoKTsKKworICAgICAgICAvLyBmaW5kIGFsbCB0aGUgYXZhaWxhYmxlIGRlY29kZXJzIGZvciB0aGlzIGZvcm1hdAorICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBtYXRjaGluZ0NvZGVjcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICBpbnQgbnVtQ29kZWNzID0gTWVkaWFDb2RlY0xpc3QuZ2V0Q29kZWNDb3VudCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUNvZGVjczsgaSsrKSB7CisgICAgICAgICAgICBNZWRpYUNvZGVjSW5mbyBpbmZvID0gTWVkaWFDb2RlY0xpc3QuZ2V0Q29kZWNJbmZvQXQoaSk7CisgICAgICAgICAgICBpZiAoaW5mby5pc0VuY29kZXIoKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBNZWRpYUNvZGVjSW5mby5Db2RlY0NhcGFiaWxpdGllcyBjYXBzID0gaW5mby5nZXRDYXBhYmlsaXRpZXNGb3JUeXBlKG1pbWUpOworICAgICAgICAgICAgICAgIGlmIChjYXBzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2hpbmdDb2RlY3MuYWRkKGluZm8uZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIHR5cGUgaXMgbm90IHN1cHBvcnRlZAorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG1hdGNoaW5nQ29kZWNzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJubyBjb2RlY3MgZm9yIG1pbWUgdHlwZSAiICsgbWltZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHJuYW1lID0gcmVzb3VyY2VzLmdldFJlc291cmNlRW50cnlOYW1lKHJpZCk7CisgICAgICAgIC8vIGRlY29kZSB0aGlzIGJsb2Igb25jZSB3aXRoIGVhY2ggbWF0Y2hpbmcgY29kZWMKKyAgICAgICAgZm9yIChTdHJpbmcgY29kZWNOYW1lOiBtYXRjaGluZ0NvZGVjcykgeworICAgICAgICAgICAgTG9nLmkoVEFHLCAiRGVjb2RpbmcgYmxvYiAiICsgcm5hbWUgKyAiIHVzaW5nIGNvZGVjICIgKyBjb2RlY05hbWUpOworICAgICAgICAgICAgTWVkaWFDb2RlYyBjb2RlYyA9IE1lZGlhQ29kZWMuY3JlYXRlQnlDb2RlY05hbWUoY29kZWNOYW1lKTsKKyAgICAgICAgICAgIE1lZGlhRm9ybWF0IGZvcm1hdCA9IE1lZGlhRm9ybWF0LmNyZWF0ZVZpZGVvRm9ybWF0KG1pbWUsIGluaXRXaWR0aCwgaW5pdEhlaWdodCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNvZGVjLmNvbmZpZ3VyZShmb3JtYXQsIG51bGwsIG51bGwsIDApOworICAgICAgICAgICAgICAgIGNvZGVjLnN0YXJ0KCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkV4Y2VwdGlvbiBmcm9tIGNvZGVjICIgKyBjb2RlY05hbWUpOworICAgICAgICAgICAgICAgIHJlbGVhc2VDb2RlYyhjb2RlYyk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgTWVkaWFDb2RlYy5CdWZmZXJJbmZvIGluZm8gPSBuZXcgTWVkaWFDb2RlYy5CdWZmZXJJbmZvKCk7CisgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBbXSBpbnB1dEJ1ZmZlcnMgPSBjb2RlYy5nZXRJbnB1dEJ1ZmZlcnMoKTsKKyAgICAgICAgICAgICAgICBpbnQgbnVtRnJhbWVzID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoZnJhbWVTaXplcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcyA9IGZyYW1lU2l6ZXMubGVuZ3RoOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgwID09IG51bUZyYW1lcykgeworICAgICAgICAgICAgICAgICAgICBmYWlsKCJJbXByb3BlciBwaWN0dXJlIGxlbmd0aCBmaWxlIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW50IG9mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgaW50IGJ5dGVzVG9GZWVkID0gMDsKKyAgICAgICAgICAgICAgICBpbnQgZmxhZ3MgPSAwOworICAgICAgICAgICAgICAgIGJ5dGUgW10gdGVtcEJsb2IgPSBuZXcgYnl0ZVsoaW50KWlucHV0QnVmZmVyc1swXS5jYXBhY2l0eSgpXTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG51bUZyYW1lczsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBidWZpZHggPSBjb2RlYy5kZXF1ZXVlSW5wdXRCdWZmZXIoNTAwMCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChidWZpZHggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRCdWZmZXJzW2J1ZmlkeF0ucmV3aW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1RvRmVlZCA9IE1hdGgubWluKChpbnQpKGZkLmdldExlbmd0aCgpIC0gb2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRCdWZmZXJzW2J1ZmlkeF0uY2FwYWNpdHkoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihqID09IChudW1GcmFtZXMgLSAxKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gTWVkaWFDb2RlYy5CVUZGRVJfRkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShibG9iLCBvZmZzZXQsIHRlbXBCbG9iLCAwLCBieXRlc1RvRmVlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlcnNbYnVmaWR4XS5wdXQodGVtcEJsb2IsIDAsIGlucHV0QnVmZmVyc1tidWZpZHhdLmNhcGFjaXR5KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgY29kZWMucXVldWVJbnB1dEJ1ZmZlcihidWZpZHgsIDAsIGJ5dGVzVG9GZWVkLCAwLCBmbGFncyk7CisgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBvZmZzZXQgKyBmcmFtZVNpemVzW2pdOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAibm8gaW5wdXQgYnVmZmVyIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnVmaWR4ID0gY29kZWMuZGVxdWV1ZU91dHB1dEJ1ZmZlcihpbmZvLCA1MDAwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZmlkeCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2RlYy5yZWxlYXNlT3V0cHV0QnVmZmVyKGJ1ZmlkeCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIm5vIG91dHB1dCBidWZmZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gaWdub3JlLCBub3QgYSBzZWN1cml0eSBpc3N1ZQorICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICByZWxlYXNlQ29kZWMoY29kZWMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGN2ZSA9IHJuYW1lLnJlcGxhY2UoIl8iLCAiLSIpLnRvVXBwZXJDYXNlKCk7CisgICAgICAgIGFzc2VydEZhbHNlKCJEZXZpY2UgKklTKiB2dWxuZXJhYmxlIHRvICIgKyBjdmUsCisgICAgICAgICAgICAgICAgICAgIG1wY2wud2FpdEZvckVycm9yKCkgPT0gTWVkaWFQbGF5ZXIuTUVESUFfRVJST1JfU0VSVkVSX0RJRUQpOworICAgICAgICB0aHIuc3RvcExvb3BlcigpOworICAgICAgICB0aHIuam9pbigpOworICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCBkb1N0YWdlZnJpZ2h0VGVzdE1lZGlhUGxheWVyQU5SKGZpbmFsIGludCByaWQsIGZpbmFsIFN0cmluZyB1cmkpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBTdHJpbmcgbmFtZSA9IHVyaSAhPSBudWxsID8gdXJpIDoKICAgICAgICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpLmdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZUVudHJ5TmFtZShyaWQpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvc3JjL2FuZHJvaWQvc2VjdXJpdHkvY3RzL1ZlcmlmaWVkQm9vdFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3NyYy9hbmRyb2lkL3NlY3VyaXR5L2N0cy9WZXJpZmllZEJvb3RUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQzODhjYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3NyYy9hbmRyb2lkL3NlY3VyaXR5L2N0cy9WZXJpZmllZEJvb3RUZXN0LmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZWN1cml0eS5jdHM7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuU2VjdXJpdHlUZXN0OworaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CitpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5Qcm9wZXJ0eVV0aWw7CitpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DZGRUZXN0OworCitAU2VjdXJpdHlUZXN0CitwdWJsaWMgY2xhc3MgVmVyaWZpZWRCb290VGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiVmVyaWZpZWRCb290VGVzdCI7CisKKyAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0xvd1JhbUV4ZW1wdChQYWNrYWdlTWFuYWdlciBwbSkgeworICAgIGlmIChwbS5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfUkFNX05PUk1BTCkpIHsKKyAgICAgIC8vIE5vIGV4ZW1wdGlvbiBmb3Igbm9ybWFsIFJBTQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gKFByb3BlcnR5VXRpbC5nZXRGaXJzdEFwaUxldmVsKCkgPCBCdWlsZC5WRVJTSU9OX0NPREVTLlApOworICB9CisKKyAgLyoqCisgICAqIEFzc2VydHMgdGhhdCBWZXJpZmllZCBCb290IGlzIHN1cHBvcnRlZC4KKyAgICoKKyAgICogQSBkZXZpY2UgaXMgZXhlbXB0IGlmIGl0IGxhdW5jaGVkIG9uIGEgcHJlLU9fTVIxIGxldmVsLgorICAgKgorICAgKiBBIGRldmljZSB3aXRob3V0IHRoZSBmZWF0dXJlIGZsYWcgYW5kcm9pZC5oYXJkd2FyZS5yYW0ubm9ybWFsIGlzIGV4ZW1wdCBpZgorICAgKiBpdCBsYXVuY2hlZCBvbiBhIHByZS1QIGxldmVsLgorICAgKi8KKyAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjkuMTAvQy0xLTEsQy0yLTEiKQorICBwdWJsaWMgdm9pZCB0ZXN0VmVyaWZpZWRCb290U3VwcG9ydCgpIHRocm93cyBFeGNlcHRpb24geworICAgIGlmIChQcm9wZXJ0eVV0aWwuZ2V0Rmlyc3RBcGlMZXZlbCgpIDwgQnVpbGQuVkVSU0lPTl9DT0RFUy5PX01SMSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBQYWNrYWdlTWFuYWdlciBwbSA9IGdldENvbnRleHQoKS5nZXRQYWNrYWdlTWFuYWdlcigpOworICAgIGFzc2VydE5vdE51bGwoIlBhY2thZ2VNYW5hZ2VyIG11c3Qgbm90IGJlIG51bGwiLCBwbSk7CisgICAgaWYgKGlzTG93UmFtRXhlbXB0KHBtKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBhc3NlcnRUcnVlKCJWZXJpZmllZCBib290IG11c3QgYmUgc3VwcG9ydGVkIG9uIHRoZSBkZXZpY2UiLAorICAgICAgICBwbS5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfVkVSSUZJRURfQk9PVCkpOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zZWN1cml0eS90ZXN0ZWZmZWN0L0FuZHJvaWQubWsgYi90ZXN0cy90ZXN0cy9zZWN1cml0eS90ZXN0ZWZmZWN0L0FuZHJvaWQubWsKaW5kZXggN2U0YWI5My4uMDc4NGI1ZCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvc2VjdXJpdHkvdGVzdGVmZmVjdC9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3Rlc3RzL3NlY3VyaXR5L3Rlc3RlZmZlY3QvQW5kcm9pZC5tawpAQCAtMjgsNiArMjgsNiBAQAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCiAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby1lZmZlY3RzKQogCi1MT0NBTF9DRkxBR1MgOj0gLVduby11bnVzZWQtcGFyYW1ldGVyCitMT0NBTF9DRkxBR1MgOj0gLVdhbGwgLVdlcnJvciAtV25vLXVudXNlZC1wYXJhbWV0ZXIgLVduby1nbnUtZGVzaWduYXRvcgogCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zZWxpbnV4L0FuZHJvaWQubWsgYi90ZXN0cy90ZXN0cy9zZWxpbnV4L0FuZHJvaWQubWsKaW5kZXggYjc5OGQ4Ny4uY2RkZjExZSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvc2VsaW51eC9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3Rlc3RzL3NlbGludXgvQW5kcm9pZC5tawpAQCAtMTIsNCArMTIsNiBAQAogIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCi1pbmNsdWRlICQoY2FsbCBhbGwtc3ViZGlyLW1ha2VmaWxlcykKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zZWxpbnV4L2NvbW1vbi9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvc2VsaW51eC9jb21tb24vQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTc3YjVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvc2VsaW51eC9jb21tb24vQW5kcm9pZC5tawpAQCAtMCwwICsxLDE4IEBACisjIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQorCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zZWxpbnV4L2NvbW1vbi9qbmkvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL3NlbGludXgvY29tbW9uL2puaS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmOTIzNGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zZWxpbnV4L2NvbW1vbi9qbmkvQW5kcm9pZC5tawpAQCAtMCwwICsxLDM3IEBACisjIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJjdHNzZWxpbnV4X2puaQorCisjIERvbid0IGluY2x1ZGUgdGhpcyBwYWNrYWdlIGluIGFueSBjb25maWd1cmF0aW9uIGJ5IGRlZmF1bHQuCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgIEN0c1NlY3VyaXR5Sm5pT25Mb2FkLmNwcCBcCisgICAgYW5kcm9pZF9zZWN1cml0eV9TRUxpbnV4VGFyZ2V0U2RrVGVzdC5jcHAKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisgICAgbGliYysrIFwKKyAgICBsaWJjcnlwdG8gXAorICAgIGxpYmxvZyBcCisgICAgbGlibmF0aXZlaGVscGVyIFwKKyAgICBsaWJwYWNrYWdlbGlzdHBhcnNlciBcCisgICAgbGlicGNyZTIgXAorICAgIGxpYnNlbGludXggXAorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zZWxpbnV4L2NvbW1vbi9qbmkvQ3RzU2VjdXJpdHlKbmlPbkxvYWQuY3BwIGIvdGVzdHMvdGVzdHMvc2VsaW51eC9jb21tb24vam5pL0N0c1NlY3VyaXR5Sm5pT25Mb2FkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmRmYzc2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvc2VsaW51eC9jb21tb24vam5pL0N0c1NlY3VyaXR5Sm5pT25Mb2FkLmNwcApAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGpuaS5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK2V4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9zZWN1cml0eV9TRUxpbnV4VGFyZ2V0U2RrVGVzdChKTklFbnYqKTsKKworamludCBKTklfT25Mb2FkKEphdmFWTSAqdm0sIHZvaWQgKnJlc2VydmVkIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKSB7CisgICAgSk5JRW52ICplbnYgPSBOVUxMOworCisgICAgaWYgKHZtLT5HZXRFbnYoKHZvaWQgKiopICZlbnYsIEpOSV9WRVJTSU9OXzFfNCkgIT0gSk5JX09LKSB7CisgICAgICAgIHJldHVybiBKTklfRVJSOworICAgIH0KKworICAgIGlmIChyZWdpc3Rlcl9hbmRyb2lkX3NlY3VyaXR5X1NFTGludXhUYXJnZXRTZGtUZXN0KGVudikpIHsKKyAgICAgICAgcmV0dXJuIEpOSV9FUlI7CisgICAgfQorCisgICAgcmV0dXJuIEpOSV9WRVJTSU9OXzFfNDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NlbGludXgvY29tbW9uL2puaS9hbmRyb2lkX3NlY3VyaXR5X1NFTGludXhUYXJnZXRTZGtUZXN0LmNwcCBiL3Rlc3RzL3Rlc3RzL3NlbGludXgvY29tbW9uL2puaS9hbmRyb2lkX3NlY3VyaXR5X1NFTGludXhUYXJnZXRTZGtUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmY1NmFhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvc2VsaW51eC9jb21tb24vam5pL2FuZHJvaWRfc2VjdXJpdHlfU0VMaW51eFRhcmdldFNka1Rlc3QuY3BwCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8am5pLmg+CisjaW5jbHVkZSA8bmF0aXZlaGVscGVyL0pOSUhlbHAuaD4KKyNpbmNsdWRlIDxuYXRpdmVoZWxwZXIvU2NvcGVkTG9jYWxSZWYuaD4KKyNpbmNsdWRlIDxuYXRpdmVoZWxwZXIvU2NvcGVkVXRmQ2hhcnMuaD4KKyNpbmNsdWRlIDxzZWxpbnV4L3NlbGludXguaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworc3RydWN0IFNlY3VyaXR5Q29udGV4dF9EZWxldGUgeworICAgIHZvaWQgb3BlcmF0b3IoKShzZWN1cml0eV9jb250ZXh0X3QgcCkgY29uc3QgeworICAgICAgICBmcmVlY29uKHApOworICAgIH0KK307Cit0eXBlZGVmIHN0ZDo6dW5pcXVlX3B0cjxjaGFyW10sIFNlY3VyaXR5Q29udGV4dF9EZWxldGU+IFVuaXF1ZV9TZWN1cml0eUNvbnRleHQ7CisKKy8qCisgKiBGdW5jdGlvbjogZ2V0RmlsZUNvbnRleHQKKyAqIFB1cnBvc2U6IHJldHJpZXZlcyB0aGUgY29udGV4dCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHBhdGggaW4gdGhlIGZpbGUgc3lzdGVtCisgKiBQYXJhbWV0ZXJzOgorICogICAgICAgIHBhdGg6IGdpdmVuIHBhdGggaW4gdGhlIGZpbGUgc3lzdGVtCisgKiBSZXR1cm5zOgorICogICAgICAgIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHNlY3VyaXR5IGNvbnRleHQgc3RyaW5nIG9mIHRoZSBmaWxlIG9iamVjdAorICogICAgICAgIHRoZSBzdHJpbmcgbWF5IGJlIE5VTEwgaWYgYW4gZXJyb3Igb2NjdXJlZAorICogRXhjZXB0aW9uczogTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIHBhdGggb2JqZWN0IGlzIG51bGwKKyAqLworc3RhdGljIGpzdHJpbmcgZ2V0RmlsZUNvbnRleHQoSk5JRW52ICplbnYsIGpvYmplY3QsIGpzdHJpbmcgcGF0aFN0cikgeworICAgIFNjb3BlZFV0ZkNoYXJzIHBhdGgoZW52LCBwYXRoU3RyKTsKKyAgICBpZiAocGF0aC5jX3N0cigpID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc2VjdXJpdHlfY29udGV4dF90IHRtcCA9IE5VTEw7CisgICAgaW50IHJldCA9IGdldGZpbGVjb24ocGF0aC5jX3N0cigpLCAmdG1wKTsKKyAgICBVbmlxdWVfU2VjdXJpdHlDb250ZXh0IGNvbnRleHQodG1wKTsKKworICAgIFNjb3BlZExvY2FsUmVmPGpzdHJpbmc+IHNlY3VyaXR5U3RyaW5nKGVudiwgTlVMTCk7CisgICAgaWYgKHJldCAhPSAtMSkgeworICAgICAgICBzZWN1cml0eVN0cmluZy5yZXNldChlbnYtPk5ld1N0cmluZ1VURihjb250ZXh0LmdldCgpKSk7CisgICAgfQorCisgICAgcmV0dXJuIHNlY3VyaXR5U3RyaW5nLnJlbGVhc2UoKTsKK30KKworc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBnTWV0aG9kc1tdID0geworICAgIHsgImdldEZpbGVDb250ZXh0IiwgIihMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmc7IiwKKyAgICAgICAgICAgICh2b2lkKikgZ2V0RmlsZUNvbnRleHQgfSwKK307CisKK2ludCByZWdpc3Rlcl9hbmRyb2lkX3NlY3VyaXR5X1NFTGludXhUYXJnZXRTZGtUZXN0KEpOSUVudiogZW52KQoreworICAgIGpjbGFzcyBjbGF6eiA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL3NlY3VyaXR5L1NFTGludXhUYXJnZXRTZGtUZXN0QmFzZSIpOworCisgICAgcmV0dXJuIGVudi0+UmVnaXN0ZXJOYXRpdmVzKGNsYXp6LCBnTWV0aG9kcywKKyAgICAgICAgICAgIHNpemVvZihnTWV0aG9kcykgLyBzaXplb2YoSk5JTmF0aXZlTWV0aG9kKSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zZWxpbnV4L2NvbW1vbi9zcmMvYW5kcm9pZC9zZWN1cml0eS9TRUxpbnV4VGFyZ2V0U2RrVGVzdEJhc2UuamF2YSBiL3Rlc3RzL3Rlc3RzL3NlbGludXgvY29tbW9uL3NyYy9hbmRyb2lkL3NlY3VyaXR5L1NFTGludXhUYXJnZXRTZGtUZXN0QmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZTg3YzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zZWxpbnV4L2NvbW1vbi9zcmMvYW5kcm9pZC9zZWN1cml0eS9TRUxpbnV4VGFyZ2V0U2RrVGVzdEJhc2UuamF2YQpAQCAtMCwwICsxLDg1IEBACitwYWNrYWdlIGFuZHJvaWQuc2VjdXJpdHk7CisKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlNjYW5uZXI7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CisKK2Fic3RyYWN0IGNsYXNzIFNFTGludXhUYXJnZXRTZGtUZXN0QmFzZSBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZQoreworICAgIHN0YXRpYyB7CisgICAgICAgIFN5c3RlbS5sb2FkTGlicmFyeSgiY3Rzc2VsaW51eF9qbmkiKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRGaWxlKFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgaW4gPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoZmlsZW5hbWUpKTsKKyAgICAgICAgICAgIHJldHVybiBpbi5yZWFkTGluZSgpLnRyaW0oKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChpbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFByb2Nlc3MgcHJvY2VzcyA9IG5ldyBQcm9jZXNzQnVpbGRlcigiZ2V0cHJvcCIsIHByb3BlcnR5KS5zdGFydCgpOworICAgICAgICBTY2FubmVyIHNjYW5uZXIgPSBudWxsOworICAgICAgICBTdHJpbmcgbGluZSA9ICIiOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2Nhbm5lciA9IG5ldyBTY2FubmVyKHByb2Nlc3MuZ2V0SW5wdXRTdHJlYW0oKSk7CisgICAgICAgICAgICBsaW5lID0gc2Nhbm5lci5uZXh0TGluZSgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHNjYW5uZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNjYW5uZXIuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGluZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWZXJpZnkgdGhhdCBuZXQuZG5zIHByb3BlcnRpZXMgbWF5IG5vdCBiZSByZWFkCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIG5vRG5zKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nW10gZG5zUHJvcHMgPSB7Im5ldC5kbnMxIiwgIm5ldC5kbnMyIiwgIm5ldC5kbnMzIiwgIm5ldC5kbnM0In07CisgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBkbnNQcm9wcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIGRucyA9IGdldFByb3BlcnR5KGRuc1Byb3BzW2ldKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiRE5TIHByb3BlcnRpZXMgbWF5IG5vdCBiZSByZWFkYWJsZSBieSBhcHBzIHBhc3QgIiArCisgICAgICAgICAgICAgICAgICAgICJ0YXJnZXRTZGtWZXJzaW9uIDI2IiwgZG5zLCAiIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWZXJpZnkgdGhhdCBzZWxpbnV4IGNvbnRleHQgaXMgdGhlIGV4cGVjdGVkIGRvbWFpbiBiYXNlZCBvbgorICAgICAqIHRhcmdldFNka1ZlcnNpb24sCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgYXBwRG9tYWluQ29udGV4dChTdHJpbmcgY29udGV4dFJlZ2V4LCBTdHJpbmcgZXJyb3JNc2cpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFBhdHRlcm4gcCA9IFBhdHRlcm4uY29tcGlsZShjb250ZXh0UmVnZXgpOworICAgICAgICBNYXRjaGVyIG0gPSBwLm1hdGNoZXIoZ2V0RmlsZSgiL3Byb2Mvc2VsZi9hdHRyL2N1cnJlbnQiKSk7CisgICAgICAgIFN0cmluZyBjb250ZXh0ID0gZ2V0RmlsZSgiL3Byb2Mvc2VsZi9hdHRyL2N1cnJlbnQiKTsKKyAgICAgICAgU3RyaW5nIG1zZyA9IGVycm9yTXNnICsgY29udGV4dDsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtc2csIG0ubWF0Y2hlcygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWZXJpZnkgdGhhdCBzZWxpbnV4IGNvbnRleHQgaXMgdGhlIGV4cGVjdGVkIHR5cGUgYmFzZWQgb24KKyAgICAgKiB0YXJnZXRTZGtWZXJzaW9uLAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGFwcERhdGFDb250ZXh0KFN0cmluZyBjb250ZXh0UmVnZXgsIFN0cmluZyBlcnJvck1zZykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFBhdHRlcm4gcCA9IFBhdHRlcm4uY29tcGlsZShjb250ZXh0UmVnZXgpOworICAgICAgICBGaWxlIGFwcERhdGFEaXIgPSBnZXRDb250ZXh0KCkuZ2V0RmlsZXNEaXIoKTsKKyAgICAgICAgTWF0Y2hlciBtID0gcC5tYXRjaGVyKGdldEZpbGVDb250ZXh0KGFwcERhdGFEaXIuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKKyAgICAgICAgU3RyaW5nIGNvbnRleHQgPSBnZXRGaWxlQ29udGV4dChhcHBEYXRhRGlyLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgU3RyaW5nIG1zZyA9IGVycm9yTXNnICsgY29udGV4dDsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtc2csIG0ubWF0Y2hlcygpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBuYXRpdmUgU3RyaW5nIGdldEZpbGVDb250ZXh0KFN0cmluZyBwYXRoKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NlbGludXgvc2VsaW51eFRhcmdldFNkay9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvc2VsaW51eC9zZWxpbnV4VGFyZ2V0U2RrL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEwOTIzZWUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvdGVzdHMvc2VsaW51eC9zZWxpbnV4VGFyZ2V0U2RrL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi1MT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCi0gICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbCBcCi0gICAgY3RzdGVzdHJ1bm5lcgotTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gbGVnYWN5LWFuZHJvaWQtdGVzdAotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQotTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c1NlbGludXhUYXJnZXRTZGtUZXN0Q2FzZXMKLUxPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKLWluY2x1ZGUgJChCVUlMRF9DVFNfUEFDS0FHRSkKLQotaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VsaW51eC9zZWxpbnV4VGFyZ2V0U2RrL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy90ZXN0cy9zZWxpbnV4L3NlbGludXhUYXJnZXRTZGsvQW5kcm9pZE1hbmlmZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDFiY2FjYS4uMDAwMDAwMAotLS0gYS90ZXN0cy90ZXN0cy9zZWxpbnV4L3NlbGludXhUYXJnZXRTZGsvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBwYWNrYWdlPSJhbmRyb2lkLnNlbGludXh0YXJnZXRzZGsuY3RzIj4KLQotICAgIDwhLS0gVGhpcyBhcHAgdGVzdHMgdGhhdCBhcHBzIHdpdGggdGFyZ2V0U2RrVmFsdWU8PTI1IGFyZSBwbGFjZWQgaW4gdGhlCi0gICAgICAgICB1bnRydXN0ZWRfYXBwXzI1IHNlbGludXggZG9tYWluIC0tPgotICAgIDx1c2VzLXNkayBhbmRyb2lkOm1pblNka1ZlcnNpb249IjIxIiBhbmRyb2lkOnRhcmdldFNka1ZlcnNpb249IjI1IiAvPgotCi0gICAgPGFwcGxpY2F0aW9uPgotICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KLSAgICA8L2FwcGxpY2F0aW9uPgotCi0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCi0gICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuc2VsaW51eHRhcmdldHNkay5jdHMiCi0gICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgdGVzdHMgZm9yIHBlcm1pc3Npb25zIGVuZm9yY2UgYnkgc2VsaW51eCBiYXNlZCBvbiB0YXJnZXRTZGtWZXJzaW9uIj4KLSAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9Imxpc3RlbmVyIgotICAgICAgICAgICAgYW5kcm9pZDp2YWx1ZT0iY29tLmFuZHJvaWQuY3RzLnJ1bm5lci5DdHNUZXN0UnVuTGlzdGVuZXIiIC8+Ci0gICAgPC9pbnN0cnVtZW50YXRpb24+Ci0KLTwvbWFuaWZlc3Q+Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NlbGludXgvc2VsaW51eFRhcmdldFNkay9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy90ZXN0cy9zZWxpbnV4L3NlbGludXhUYXJnZXRTZGsvQW5kcm9pZFRlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Zjg4YmIxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL3Rlc3RzL3NlbGludXgvc2VsaW51eFRhcmdldFNkay9BbmRyb2lkVGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIFBlcm1pc3Npb24gU2VsaW51eCB0ZXN0IGNhc2VzIj4KLSAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgotICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0ic2VjdXJpdHkiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJub3Qtc2hhcmRhYmxlIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzU2VsaW51eFRhcmdldFNka1Rlc3RDYXNlcy5hcGsiIC8+Ci0gICAgPC90YXJnZXRfcHJlcGFyZXI+Ci0gICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkFuZHJvaWRKVW5pdFRlc3QiID4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJwYWNrYWdlIiB2YWx1ZT0iYW5kcm9pZC5zZWxpbnV4dGFyZ2V0c2RrLmN0cyIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJydW50aW1lLWhpbnQiIHZhbHVlPSIybSIgLz4KLSAgICA8L3Rlc3Q+Ci08L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zZWxpbnV4L3NlbGludXhUYXJnZXRTZGsvc3JjL2FuZHJvaWQvc2VsaW51eHRhcmdldHNkay9jdHMvU0VMaW51eFRhcmdldFNka1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3NlbGludXgvc2VsaW51eFRhcmdldFNkay9zcmMvYW5kcm9pZC9zZWxpbnV4dGFyZ2V0c2RrL2N0cy9TRUxpbnV4VGFyZ2V0U2RrVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTJlMjRlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL3Rlc3RzL3NlbGludXgvc2VsaW51eFRhcmdldFNkay9zcmMvYW5kcm9pZC9zZWxpbnV4dGFyZ2V0c2RrL2N0cy9TRUxpbnV4VGFyZ2V0U2RrVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5zZWxpbnV4dGFyZ2V0c2RrLmN0czsKLQotaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlNtYWxsVGVzdDsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqIFZlcmlmeSB0aGUgc2VsaW51eCBkb21haW4gZm9yIGFwcHMgcnVubmluZyB3aXRoIHRhcmdldFNka1ZlcnNpb248PTI1Ci0gKi8KLXB1YmxpYyBjbGFzcyBTRUxpbnV4VGFyZ2V0U2RrVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZQotewotICAgIHN0YXRpYyBTdHJpbmcgZ2V0RmlsZShTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGluID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGluID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGZpbGVuYW1lKSk7Ci0gICAgICAgICAgICByZXR1cm4gaW4ucmVhZExpbmUoKS50cmltKCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoaW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGluLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWZXJpZnkgdGhhdCBzZWxpbnV4IGNvbnRleHQgaXMgdGhlIGV4cGVjdGVkIGRvbWFpbiBiYXNlZCBvbgotICAgICAqIHRhcmdldFNka1ZlcnNpb24sCi0gICAgICovCi0gICAgQFNtYWxsVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RUYXJnZXRTZGtWYWx1ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBjb250ZXh0ID0gZ2V0RmlsZSgiL3Byb2Mvc2VsZi9hdHRyL2N1cnJlbnQiKTsKLSAgICAgICAgU3RyaW5nIGV4cGVjdGVkID0gInU6cjp1bnRydXN0ZWRfYXBwXzI1OnMwIjsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbnRydXN0ZWQgYXBwcyB3aXRoIHRhcmdldFNka1ZlcnNpb248PTI1ICIgKwotICAgICAgICAgICAgICAgICJtdXN0IHJ1biBpbiB0aGUgdW50cnVzdGVkX2FwcF8yNSBzZWxpbnV4IGRvbWFpbi4iLAotICAgICAgICAgICAgICAgIGNvbnRleHQuc3Vic3RyaW5nKDAsIGV4cGVjdGVkLmxlbmd0aCgpKSwKLSAgICAgICAgICAgICAgICBleHBlY3RlZCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zZWxpbnV4L3NlbGludXhUYXJnZXRTZGsyL0FuZHJvaWQubWsgYi90ZXN0cy90ZXN0cy9zZWxpbnV4L3NlbGludXhUYXJnZXRTZGsyL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY0NzVmOWYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvdGVzdHMvc2VsaW51eC9zZWxpbnV4VGFyZ2V0U2RrMi9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAotICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwgXAotICAgIGN0c3Rlc3RydW5uZXIgXAotICAgIGxlZ2FjeS1hbmRyb2lkLXRlc3QKLUxPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKLUxPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNTZWxpbnV4VGFyZ2V0U2RrMlRlc3RDYXNlcwotTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAotaW5jbHVkZSAkKEJVSUxEX0NUU19QQUNLQUdFKQotCi1pbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zZWxpbnV4L3NlbGludXhUYXJnZXRTZGsyL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy90ZXN0cy9zZWxpbnV4L3NlbGludXhUYXJnZXRTZGsyL0FuZHJvaWRNYW5pZmVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNkZTEyNDkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvdGVzdHMvc2VsaW51eC9zZWxpbnV4VGFyZ2V0U2RrMi9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0KLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHBhY2thZ2U9ImFuZHJvaWQuc2VsaW51eHRhcmdldHNkazIuY3RzIj4KLQotICAgIDwhLS0gVGhpcyBhcHAgdGVzdHMgdGhhdCBhcHBzIHdpdGggY3VycmVudCB0YXJnZXRTZGtWYWx1ZSBhcmUgcGxhY2VkIGluIHRoZQotICAgICAgICAgdW50cnVzdGVkX2FwcCBzZWxpbnV4IGRvbWFpbiAtLT4KLSAgICA8dXNlcy1zZGsgYW5kcm9pZDptaW5TZGtWZXJzaW9uPSIyMSIgYW5kcm9pZDp0YXJnZXRTZGtWZXJzaW9uPSIxMDAwMCIgLz4KLQotICAgIDxhcHBsaWNhdGlvbj4KLSAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+Ci0gICAgPC9hcHBsaWNhdGlvbj4KLQotICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgotICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLnNlbGludXh0YXJnZXRzZGsyLmN0cyIKLSAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBmb3IgcGVybWlzc2lvbnMgZW5mb3JjZSBieSBzZWxpbnV4IGJhc2VkIG9uIHRhcmdldFNka1ZlcnNpb24iPgotICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0ibGlzdGVuZXIiCi0gICAgICAgICAgICBhbmRyb2lkOnZhbHVlPSJjb20uYW5kcm9pZC5jdHMucnVubmVyLkN0c1Rlc3RSdW5MaXN0ZW5lciIgLz4KLSAgICA8L2luc3RydW1lbnRhdGlvbj4KLQotPC9tYW5pZmVzdD4KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VsaW51eC9zZWxpbnV4VGFyZ2V0U2RrMi9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy90ZXN0cy9zZWxpbnV4L3NlbGludXhUYXJnZXRTZGsyL0FuZHJvaWRUZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIyNzhiMi4uMDAwMDAwMAotLS0gYS90ZXN0cy90ZXN0cy9zZWxpbnV4L3NlbGludXhUYXJnZXRTZGsyL0FuZHJvaWRUZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgUGVybWlzc2lvbiBTZWxpbnV4IHRlc3QgY2FzZXMiPgotICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJzZWN1cml0eSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9Im5vdC1zaGFyZGFibGUiIHZhbHVlPSJ0cnVlIiAvPgotICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgotICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJDdHNTZWxpbnV4VGFyZ2V0U2RrMlRlc3RDYXNlcy5hcGsiIC8+Ci0gICAgPC90YXJnZXRfcHJlcGFyZXI+Ci0gICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkFuZHJvaWRKVW5pdFRlc3QiID4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJwYWNrYWdlIiB2YWx1ZT0iYW5kcm9pZC5zZWxpbnV4dGFyZ2V0c2RrMi5jdHMiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0icnVudGltZS1oaW50IiB2YWx1ZT0iMm0iIC8+Ci0gICAgPC90ZXN0PgotPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VsaW51eC9zZWxpbnV4VGFyZ2V0U2RrMi9zcmMvYW5kcm9pZC9zZWxpbnV4dGFyZ2V0c2RrMi9jdHMvU0VMaW51eFRhcmdldFNkazJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9zZWxpbnV4L3NlbGludXhUYXJnZXRTZGsyL3NyYy9hbmRyb2lkL3NlbGludXh0YXJnZXRzZGsyL2N0cy9TRUxpbnV4VGFyZ2V0U2RrMlRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM0ODBlNS4uMDAwMDAwMAotLS0gYS90ZXN0cy90ZXN0cy9zZWxpbnV4L3NlbGludXhUYXJnZXRTZGsyL3NyYy9hbmRyb2lkL3NlbGludXh0YXJnZXRzZGsyL2N0cy9TRUxpbnV4VGFyZ2V0U2RrMlRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuc2VsaW51eHRhcmdldHNkazIuY3RzOwotCi1pbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKLWltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlNjYW5uZXI7Ci0KLS8qKgotICogVmVyaWZ5IHRoZSBzZWxpbnV4IGRvbWFpbiBmb3IgYXBwcyBydW5uaW5nIHdpdGggY3VycmVudCB0YXJnZXRTZGtWZXJzaW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBTRUxpbnV4VGFyZ2V0U2RrMlRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UKLXsKLSAgICBzdGF0aWMgU3RyaW5nIGdldEZpbGUoU3RyaW5nIGZpbGVuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBCdWZmZXJlZFJlYWRlciBpbiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbiA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihmaWxlbmFtZSkpOwotICAgICAgICAgICAgcmV0dXJuIGluLnJlYWRMaW5lKCkudHJpbSgpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGluICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFByb2Nlc3MgcHJvY2VzcyA9IG5ldyBQcm9jZXNzQnVpbGRlcigiZ2V0cHJvcCIsIHByb3BlcnR5KS5zdGFydCgpOwotICAgICAgICBTY2FubmVyIHNjYW5uZXIgPSBudWxsOwotICAgICAgICBTdHJpbmcgbGluZSA9ICIiOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2Nhbm5lciA9IG5ldyBTY2FubmVyKHByb2Nlc3MuZ2V0SW5wdXRTdHJlYW0oKSk7Ci0gICAgICAgICAgICBsaW5lID0gc2Nhbm5lci5uZXh0TGluZSgpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHNjYW5uZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNjYW5uZXIuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGluZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWZXJpZnkgdGhhdCBuZXQuZG5zIHByb3BlcnRpZXMgbWF5IG5vdCBiZSByZWFkCi0gICAgICovCi0gICAgQFNtYWxsVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3ROb0RucygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZ1tdIGRuc1Byb3BzID0geyJuZXQuZG5zMSIsICJuZXQuZG5zMiIsICJuZXQuZG5zMyIsICJuZXQuZG5zNCJ9OwotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgZG5zUHJvcHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBkbnMgPSBnZXRQcm9wZXJ0eShkbnNQcm9wc1tpXSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkROUyBwcm9wZXJ0aWVzIG1heSBub3QgYmUgcmVhZGFibGUgYnkgYXBwcyBwYXN0ICIgKwotICAgICAgICAgICAgICAgICAgICAidGFyZ2V0U2RrVmVyc2lvbiAyNiIsIGRucywgIiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmVyaWZ5IHRoYXQgc2VsaW51eCBjb250ZXh0IGlzIHRoZSBleHBlY3RlZCBkb21haW4gYmFzZWQgb24KLSAgICAgKiB0YXJnZXRTZGtWZXJzaW9uLAotICAgICAqLwotICAgIEBTbWFsbFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VGFyZ2V0U2RrVmFsdWUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgY29udGV4dCA9IGdldEZpbGUoIi9wcm9jL3NlbGYvYXR0ci9jdXJyZW50Iik7Ci0gICAgICAgIFN0cmluZyBleHBlY3RlZCA9ICJ1OnI6dW50cnVzdGVkX2FwcDpzMCI7Ci0gICAgICAgIGFzc2VydEVxdWFscygiVW50cnVzdGVkIGFwcHMgd2l0aCBjdXJyZW50IHRhcmdldFNka1ZlcnNpb24gIiArCi0gICAgICAgICAgICAgICAgIm11c3QgcnVuIGluIHRoZSB1bnRydXN0ZWRfYXBwIHNlbGludXggZG9tYWluLiIsCi0gICAgICAgICAgICAgICAgY29udGV4dC5zdWJzdHJpbmcoMCwgZXhwZWN0ZWQubGVuZ3RoKCkpLAotICAgICAgICAgICAgICAgIGV4cGVjdGVkKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zZWxpbnV4L3NlbGludXhUYXJnZXRTZGsyNS9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvc2VsaW51eC9zZWxpbnV4VGFyZ2V0U2RrMjUvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mMGZkMDY0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvc2VsaW51eC9zZWxpbnV4VGFyZ2V0U2RrMjUvQW5kcm9pZC5tawpAQCAtMCwwICsxLDQ1IEBACisjCisjIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworTE9DQUxfTVVMVElMSUIgOj0gYm90aAorCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAorICAgIGN0c3Rlc3RydW5uZXItYXh0IFwKKyAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBcCisKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzIGFuZHJvaWQudGVzdC5ydW5uZXIuc3R1YnMKKworTE9DQUxfSk5JX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICAgIGxpYmMrKyBcCisgICAgbGliY3J5cHRvIFwKKyAgICBsaWJjdHNfam5pIFwKKyAgICBsaWJjdHNzZWxpbnV4X2puaSBcCisgICAgbGlibmF0aXZlaGVscGVyIFwKKyAgICBsaWJuYXRpdmVoZWxwZXJfY29tcGF0X2xpYmMrKyBcCisgICAgbGlicGFja2FnZWxpc3RwYXJzZXIgXAorICAgIGxpYnBjcmUyIFwKKyAgICBsaWJzZWxpbnV4IFwKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjIGNvbW1vbikKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNTZWxpbnV4VGFyZ2V0U2RrMjVUZXN0Q2FzZXMKK0xPQ0FMX1BSSVZBVEVfUExBVEZPUk1fQVBJUyA6PSB0cnVlCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworaW5jbHVkZSAkKEJVSUxEX0NUU19QQUNLQUdFKQorCitpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zZWxpbnV4L3NlbGludXhUYXJnZXRTZGsyNS9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdGVzdHMvc2VsaW51eC9zZWxpbnV4VGFyZ2V0U2RrMjUvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kYTA4MDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvc2VsaW51eC9zZWxpbnV4VGFyZ2V0U2RrMjUvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDM3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iYW5kcm9pZC5zZWxpbnV4dGFyZ2V0c2RrMjUuY3RzIj4KKworICAgIDwhLS0gVGhpcyBhcHAgdGVzdHMgdGhhdCBhcHBzIHdpdGggdGFyZ2V0U2RrVmFsdWU8PTI1IGFyZSBwbGFjZWQgaW4gdGhlCisgICAgICAgICB1bnRydXN0ZWRfYXBwXzI1IHNlbGludXggZG9tYWluIC0tPgorICAgIDx1c2VzLXNkayBhbmRyb2lkOm1pblNka1ZlcnNpb249IjIxIiBhbmRyb2lkOnRhcmdldFNka1ZlcnNpb249IjI1IiAvPgorCisgICAgPGFwcGxpY2F0aW9uPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5zZWxpbnV4dGFyZ2V0c2RrMjUuY3RzIgorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIGZvciBwZXJtaXNzaW9ucyBlbmZvcmNlIGJ5IHNlbGludXggYmFzZWQgb24gdGFyZ2V0U2RrVmVyc2lvbiI+CisgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJsaXN0ZW5lciIKKyAgICAgICAgICAgIGFuZHJvaWQ6dmFsdWU9ImNvbS5hbmRyb2lkLmN0cy5ydW5uZXIuQ3RzVGVzdFJ1bkxpc3RlbmVyIiAvPgorICAgIDwvaW5zdHJ1bWVudGF0aW9uPgorCis8L21hbmlmZXN0PgorCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zZWxpbnV4L3NlbGludXhUYXJnZXRTZGsyNS9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy90ZXN0cy9zZWxpbnV4L3NlbGludXhUYXJnZXRTZGsyNS9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYzYjJjMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3NlbGludXgvc2VsaW51eFRhcmdldFNkazI1L0FuZHJvaWRUZXN0LnhtbApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIFBlcm1pc3Npb24gU2VsaW51eCB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgorICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0ic2VjdXJpdHkiIC8+CisgICAgPG9wdGlvbiBuYW1lPSJub3Qtc2hhcmRhYmxlIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzU2VsaW51eFRhcmdldFNkazI1VGVzdENhc2VzLmFwayIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuQW5kcm9pZEpVbml0VGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9InBhY2thZ2UiIHZhbHVlPSJhbmRyb2lkLnNlbGludXh0YXJnZXRzZGsyNS5jdHMiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVudGltZS1oaW50IiB2YWx1ZT0iMm0iIC8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VsaW51eC9zZWxpbnV4VGFyZ2V0U2RrMjUvY29tbW9uIGIvdGVzdHMvdGVzdHMvc2VsaW51eC9zZWxpbnV4VGFyZ2V0U2RrMjUvY29tbW9uCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjU4MWViMTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zZWxpbnV4L3NlbGludXhUYXJnZXRTZGsyNS9jb21tb24KQEAgLTAsMCArMSBAQAorLi4vY29tbW9uL3NyYwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NlbGludXgvc2VsaW51eFRhcmdldFNkazI1L3NyYy9hbmRyb2lkL3NlY3VyaXR5L1NFTGludXhUYXJnZXRTZGtUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9zZWxpbnV4L3NlbGludXhUYXJnZXRTZGsyNS9zcmMvYW5kcm9pZC9zZWN1cml0eS9TRUxpbnV4VGFyZ2V0U2RrVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NjZlNWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zZWxpbnV4L3NlbGludXhUYXJnZXRTZGsyNS9zcmMvYW5kcm9pZC9zZWN1cml0eS9TRUxpbnV4VGFyZ2V0U2RrVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VjdXJpdHk7CisKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogVmVyaWZ5IHRoZSBzZWxpbnV4IGRvbWFpbiBmb3IgYXBwcyBydW5uaW5nIHdpdGggdGFyZ2V0U2RrVmVyc2lvbjw9MjUKKyAqLworcHVibGljIGNsYXNzIFNFTGludXhUYXJnZXRTZGtUZXN0IGV4dGVuZHMgU0VMaW51eFRhcmdldFNka1Rlc3RCYXNlCit7CisgICAgLyoqCisgICAgICogVmVyaWZ5IHRoYXQgc2VsaW51eCBjb250ZXh0IGlzIHRoZSBleHBlY3RlZCBkb21haW4gYmFzZWQgb24KKyAgICAgKiB0YXJnZXRTZGtWZXJzaW9uID0gMjUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwRG9tYWluQ29udGV4dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBjb250ZXh0ID0gInU6cjp1bnRydXN0ZWRfYXBwXzI1OnMwOmNbMC05XSssY1swLTldKyI7CisgICAgICAgIFN0cmluZyBtc2cgPSAiVW50cnVzdGVkIGFwcHMgd2l0aCB0YXJnZXRTZGtWZXJzaW9uIG9mIDI1IGFuZCBiZWxvdyAiICsKKyAgICAgICAgICAgICJtdXN0IHJ1biBpbiB0aGUgdW50cnVzdGVkX2FwcF8yNSBzZWxpbnV4IGRvbWFpbiBhbmQgdXNlIHRoZSBsZXZlbEZyb209dXNlciAiICsKKyAgICAgICAgICAgICJzZWxlY3RvciBpbiBTRUxpbnV4IHNlYXBwX2NvbnRleHRzIHdoaWNoIGFkZHMgdHdvIGNhdGVnb3J5IHR5cGVzICIgKworICAgICAgICAgICAgInRvIHRoZSBhcHAncyBzZWxpbnV4IGNvbnRleHQuXG4iICsKKyAgICAgICAgICAgICJFeGFtcGxlIGV4cGVjdGVkIHZhbHVlOiB1OnI6dW50cnVzdGVkX2FwcF8yNTpzMDpjNTEyLGM3NjhcbiIgKworICAgICAgICAgICAgIkFjdHVhbCB2YWx1ZTogIjsKKyAgICAgICAgYXBwRG9tYWluQ29udGV4dChjb250ZXh0LCBtc2cpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZlcmlmeSB0aGF0IHNlbGludXggY29udGV4dCBpcyB0aGUgZXhwZWN0ZWQgdHlwZSBiYXNlZCBvbgorICAgICAqIHRhcmdldFNka1ZlcnNpb24gPSBjdXJyZW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEFwcERhdGFDb250ZXh0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBjb250ZXh0ID0gInU6b2JqZWN0X3I6YXBwX2RhdGFfZmlsZTpzMDpjWzAtOV0rLGNbMC05XSsiOworICAgICAgICBTdHJpbmcgbXNnID0gIlVudHJ1c3RlZCBhcHBzIHdpdGggdGFyZ2V0U2RrVmVyc2lvbiBvZiAyNSBhbmQgYmVsb3cgYW5kIGFib3ZlIiArCisgICAgICAgICAgICAibXVzdCB1c2UgdGhlIGFwcF9kYXRhX2ZpbGUgc2VsaW51eCBjb250ZXh0IGFuZCB1c2UgdGhlIGxldmVsRnJvbT1hbGwgIiArCisgICAgICAgICAgICAic2VsZWN0b3IgaW4gU0VMaW51eCBzZWFwcF9jb250ZXh0cyB3aGljaCBhZGRzIGZvdXIgY2F0ZWdvcnkgdHlwZXMgIiArCisgICAgICAgICAgICAidG8gdGhlIGFwcF9kYXRhX2ZpbGUgY29udGV4dC5cbiIgKworICAgICAgICAgICAgIkV4YW1wbGUgZXhwZWN0ZWQgdmFsdWU6IHU6b2JqZWN0X3I6YXBwX2RhdGFfZmlsZTpzMDpjNTEyLGM3NjhcbiIgKworICAgICAgICAgICAgIkFjdHVhbCB2YWx1ZTogIjsKKyAgICAgICAgYXBwRGF0YUNvbnRleHQoY29udGV4dCwgbXNnKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zZWxpbnV4L3NlbGludXhUYXJnZXRTZGsyNy9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvc2VsaW51eC9zZWxpbnV4VGFyZ2V0U2RrMjcvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kODM5ZDU0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvc2VsaW51eC9zZWxpbnV4VGFyZ2V0U2RrMjcvQW5kcm9pZC5tawpAQCAtMCwwICsxLDQ1IEBACisjCisjIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworTE9DQUxfTVVMVElMSUIgOj0gYm90aAorCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAorICAgIGN0c3Rlc3RydW5uZXItYXh0IFwKKyAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBcCisKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzIGFuZHJvaWQudGVzdC5ydW5uZXIuc3R1YnMKKworTE9DQUxfSk5JX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICAgIGxpYmMrKyBcCisgICAgbGliY3J5cHRvIFwKKyAgICBsaWJjdHNfam5pIFwKKyAgICBsaWJjdHNzZWxpbnV4X2puaSBcCisgICAgbGlibmF0aXZlaGVscGVyIFwKKyAgICBsaWJuYXRpdmVoZWxwZXJfY29tcGF0X2xpYmMrKyBcCisgICAgbGlicGFja2FnZWxpc3RwYXJzZXIgXAorICAgIGxpYnBjcmUyIFwKKyAgICBsaWJzZWxpbnV4IFwKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjIGNvbW1vbikKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNTZWxpbnV4VGFyZ2V0U2RrMjdUZXN0Q2FzZXMKK0xPQ0FMX1BSSVZBVEVfUExBVEZPUk1fQVBJUyA6PSB0cnVlCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworaW5jbHVkZSAkKEJVSUxEX0NUU19QQUNLQUdFKQorCitpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zZWxpbnV4L3NlbGludXhUYXJnZXRTZGsyNy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdGVzdHMvc2VsaW51eC9zZWxpbnV4VGFyZ2V0U2RrMjcvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kMmFkZGY4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvc2VsaW51eC9zZWxpbnV4VGFyZ2V0U2RrMjcvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDM3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iYW5kcm9pZC5zZWxpbnV4dGFyZ2V0c2RrMjcuY3RzIj4KKworICAgIDwhLS0gVGhpcyBhcHAgdGVzdHMgdGhhdCBhcHBzIHdpdGggMjU8dGFyZ2V0U2RrVmFsdWU8PTI3IGFyZSBwbGFjZWQgaW4gdGhlCisgICAgICAgICB1bnRydXN0ZWRfYXBwXzI3IHNlbGludXggZG9tYWluIC0tPgorICAgIDx1c2VzLXNkayBhbmRyb2lkOm1pblNka1ZlcnNpb249IjIxIiBhbmRyb2lkOnRhcmdldFNka1ZlcnNpb249IjI3IiAvPgorCisgICAgPGFwcGxpY2F0aW9uPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5zZWxpbnV4dGFyZ2V0c2RrMjcuY3RzIgorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIGZvciBwZXJtaXNzaW9ucyBlbmZvcmNlIGJ5IHNlbGludXggYmFzZWQgb24gdGFyZ2V0U2RrVmVyc2lvbiI+CisgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJsaXN0ZW5lciIKKyAgICAgICAgICAgIGFuZHJvaWQ6dmFsdWU9ImNvbS5hbmRyb2lkLmN0cy5ydW5uZXIuQ3RzVGVzdFJ1bkxpc3RlbmVyIiAvPgorICAgIDwvaW5zdHJ1bWVudGF0aW9uPgorCis8L21hbmlmZXN0PgorCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zZWxpbnV4L3NlbGludXhUYXJnZXRTZGsyNy9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy90ZXN0cy9zZWxpbnV4L3NlbGludXhUYXJnZXRTZGsyNy9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgxOGRjYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3NlbGludXgvc2VsaW51eFRhcmdldFNkazI3L0FuZHJvaWRUZXN0LnhtbApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIFBlcm1pc3Npb24gU2VsaW51eCB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgorICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0ic2VjdXJpdHkiIC8+CisgICAgPG9wdGlvbiBuYW1lPSJub3Qtc2hhcmRhYmxlIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzU2VsaW51eFRhcmdldFNkazI3VGVzdENhc2VzLmFwayIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuQW5kcm9pZEpVbml0VGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9InBhY2thZ2UiIHZhbHVlPSJhbmRyb2lkLnNlbGludXh0YXJnZXRzZGsyNy5jdHMiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVudGltZS1oaW50IiB2YWx1ZT0iMm0iIC8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VsaW51eC9zZWxpbnV4VGFyZ2V0U2RrMjcvY29tbW9uIGIvdGVzdHMvdGVzdHMvc2VsaW51eC9zZWxpbnV4VGFyZ2V0U2RrMjcvY29tbW9uCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjU4MWViMTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zZWxpbnV4L3NlbGludXhUYXJnZXRTZGsyNy9jb21tb24KQEAgLTAsMCArMSBAQAorLi4vY29tbW9uL3NyYwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NlbGludXgvc2VsaW51eFRhcmdldFNkazI3L3NyYy9hbmRyb2lkL3NlY3VyaXR5L1NFTGludXhUYXJnZXRTZGtUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9zZWxpbnV4L3NlbGludXhUYXJnZXRTZGsyNy9zcmMvYW5kcm9pZC9zZWN1cml0eS9TRUxpbnV4VGFyZ2V0U2RrVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMzk0ZTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zZWxpbnV4L3NlbGludXhUYXJnZXRTZGsyNy9zcmMvYW5kcm9pZC9zZWN1cml0eS9TRUxpbnV4VGFyZ2V0U2RrVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VjdXJpdHk7CisKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogVmVyaWZ5IHRoZSBzZWxpbnV4IGRvbWFpbiBmb3IgYXBwcyBydW5uaW5nIHdpdGggMjU8dGFyZ2V0U2RrVmVyc2lvbjw9MjcKKyAqLworcHVibGljIGNsYXNzIFNFTGludXhUYXJnZXRTZGtUZXN0IGV4dGVuZHMgU0VMaW51eFRhcmdldFNka1Rlc3RCYXNlCit7CisgICAgLyoqCisgICAgICogVmVyaWZ5IHRoYXQgbmV0LmRucyBwcm9wZXJ0aWVzIG1heSBub3QgYmUgcmVhZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3ROb0RucygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG5vRG5zKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmVyaWZ5IHRoYXQgc2VsaW51eCBjb250ZXh0IGlzIHRoZSBleHBlY3RlZCBkb21haW4gYmFzZWQgb24KKyAgICAgKiB0YXJnZXRTZGtWZXJzaW9uID0gMjcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwRG9tYWluQ29udGV4dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBjb250ZXh0ID0gInU6cjp1bnRydXN0ZWRfYXBwXzI3OnMwOmNbMC05XSssY1swLTldKyI7CisgICAgICAgIFN0cmluZyBtc2cgPSAiVW50cnVzdGVkIGFwcHMgd2l0aCB0YXJnZXRTZGtWZXJzaW9uIGluIHJhbmdlIDI2LTI3ICIgKworICAgICAgICAgICAgIm11c3QgcnVuIGluIHRoZSB1bnRydXN0ZWRfYXBwXzI3IHNlbGludXggZG9tYWluIGFuZCB1c2UgdGhlIGxldmVsRnJvbT11c2VyICIgKworICAgICAgICAgICAgInNlbGVjdG9yIGluIFNFTGludXggc2VhcHBfY29udGV4dHMgd2hpY2ggYWRkcyB0d28gY2F0ZWdvcnkgdHlwZXMgIiArCisgICAgICAgICAgICAidG8gdGhlIGFwcCdzIHNlbGludXggY29udGV4dC5cbiIgKworICAgICAgICAgICAgIkV4YW1wbGUgZXhwZWN0ZWQgdmFsdWU6IHU6cjp1bnRydXN0ZWRfYXBwXzI3OnMwOmM1MTIsYzc2OFxuIiArCisgICAgICAgICAgICAiQWN0dWFsIHZhbHVlOiAiOworICAgICAgICBhcHBEb21haW5Db250ZXh0KGNvbnRleHQsIG1zZyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmVyaWZ5IHRoYXQgc2VsaW51eCBjb250ZXh0IGlzIHRoZSBleHBlY3RlZCB0eXBlIGJhc2VkIG9uCisgICAgICogdGFyZ2V0U2RrVmVyc2lvbiA9IGN1cnJlbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwRGF0YUNvbnRleHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGNvbnRleHQgPSAidTpvYmplY3RfcjphcHBfZGF0YV9maWxlOnMwOmNbMC05XSssY1swLTldKyI7CisgICAgICAgIFN0cmluZyBtc2cgPSAiVW50cnVzdGVkIGFwcHMgd2l0aCB0YXJnZXRTZGtWZXJzaW9uIGluIHJhbmdlIDI2LTI3ICIgKworICAgICAgICAgICAgIm11c3QgdXNlIHRoZSBhcHBfZGF0YV9maWxlIHNlbGludXggY29udGV4dCBhbmQgdXNlIHRoZSBsZXZlbEZyb209YWxsICIgKworICAgICAgICAgICAgInNlbGVjdG9yIGluIFNFTGludXggc2VhcHBfY29udGV4dHMgd2hpY2ggYWRkcyBmb3VyIGNhdGVnb3J5IHR5cGVzICIgKworICAgICAgICAgICAgInRvIHRoZSBhcHBfZGF0YV9maWxlIGNvbnRleHQuXG4iICsKKyAgICAgICAgICAgICJFeGFtcGxlIGV4cGVjdGVkIHZhbHVlOiB1Om9iamVjdF9yOmFwcF9kYXRhX2ZpbGU6czA6YzUxMixjNzY4XG4iICsKKyAgICAgICAgICAgICJBY3R1YWwgdmFsdWU6ICI7CisgICAgICAgIGFwcERhdGFDb250ZXh0KGNvbnRleHQsIG1zZyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VsaW51eC9zZWxpbnV4VGFyZ2V0U2RrQ3VycmVudC9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvc2VsaW51eC9zZWxpbnV4VGFyZ2V0U2RrQ3VycmVudC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYxNzRlYzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zZWxpbnV4L3NlbGludXhUYXJnZXRTZGtDdXJyZW50L0FuZHJvaWQubWsKQEAgLTAsMCArMSw0NSBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKK0xPQ0FMX01VTFRJTElCIDo9IGJvdGgKKworTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKKyAgICBjdHN0ZXN0cnVubmVyLWF4dCBcCisgICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgXAorCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicyBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzCisKK0xPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJjKysgXAorICAgIGxpYmNyeXB0byBcCisgICAgbGliY3RzX2puaSBcCisgICAgbGliY3Rzc2VsaW51eF9qbmkgXAorICAgIGxpYm5hdGl2ZWhlbHBlciBcCisgICAgbGlibmF0aXZlaGVscGVyX2NvbXBhdF9saWJjKysgXAorICAgIGxpYnBhY2thZ2VsaXN0cGFyc2VyIFwKKyAgICBsaWJwY3JlMiBcCisgICAgbGlic2VsaW51eCBcCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYyBjb21tb24pCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzU2VsaW51eFRhcmdldFNka0N1cnJlbnRUZXN0Q2FzZXMKK0xPQ0FMX1BSSVZBVEVfUExBVEZPUk1fQVBJUyA6PSB0cnVlCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworaW5jbHVkZSAkKEJVSUxEX0NUU19QQUNLQUdFKQorCitpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zZWxpbnV4L3NlbGludXhUYXJnZXRTZGtDdXJyZW50L0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy90ZXN0cy9zZWxpbnV4L3NlbGludXhUYXJnZXRTZGtDdXJyZW50L0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmZjZjQwZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3NlbGludXgvc2VsaW51eFRhcmdldFNka0N1cnJlbnQvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDM3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iYW5kcm9pZC5zZWxpbnV4dGFyZ2V0c2RrY3VycmVudC5jdHMiPgorCisgICAgPCEtLSBUaGlzIGFwcCB0ZXN0cyB0aGF0IGFwcHMgd2l0aCBjdXJyZW50IHRhcmdldFNka1ZhbHVlIGFyZSBwbGFjZWQgaW4gdGhlCisgICAgICAgICB1bnRydXN0ZWRfYXBwIHNlbGludXggZG9tYWluIC0tPgorICAgIDx1c2VzLXNkayBhbmRyb2lkOm1pblNka1ZlcnNpb249IjIxIiBhbmRyb2lkOnRhcmdldFNka1ZlcnNpb249IjEwMDAwIiAvPgorCisgICAgPGFwcGxpY2F0aW9uPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5zZWxpbnV4dGFyZ2V0c2RrY3VycmVudC5jdHMiCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgdGVzdHMgZm9yIHBlcm1pc3Npb25zIGVuZm9yY2UgYnkgc2VsaW51eCBiYXNlZCBvbiB0YXJnZXRTZGtWZXJzaW9uIj4KKyAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9Imxpc3RlbmVyIgorICAgICAgICAgICAgYW5kcm9pZDp2YWx1ZT0iY29tLmFuZHJvaWQuY3RzLnJ1bm5lci5DdHNUZXN0UnVuTGlzdGVuZXIiIC8+CisgICAgPC9pbnN0cnVtZW50YXRpb24+CisKKzwvbWFuaWZlc3Q+CisKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NlbGludXgvc2VsaW51eFRhcmdldFNka0N1cnJlbnQvQW5kcm9pZFRlc3QueG1sIGIvdGVzdHMvdGVzdHMvc2VsaW51eC9zZWxpbnV4VGFyZ2V0U2RrQ3VycmVudC9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE0ZjQ0MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3NlbGludXgvc2VsaW51eFRhcmdldFNka0N1cnJlbnQvQW5kcm9pZFRlc3QueG1sCkBAIC0wLDAgKzEsMjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgUGVybWlzc2lvbiBTZWxpbnV4IHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CisgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJzZWN1cml0eSIgLz4KKyAgICA8b3B0aW9uIG5hbWU9Im5vdC1zaGFyZGFibGUiIHZhbHVlPSJ0cnVlIiAvPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJDdHNTZWxpbnV4VGFyZ2V0U2RrQ3VycmVudFRlc3RDYXNlcy5hcGsiIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkFuZHJvaWRKVW5pdFRlc3QiID4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwYWNrYWdlIiB2YWx1ZT0iYW5kcm9pZC5zZWxpbnV4dGFyZ2V0c2RrY3VycmVudC5jdHMiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVudGltZS1oaW50IiB2YWx1ZT0iMm0iIC8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2VsaW51eC9zZWxpbnV4VGFyZ2V0U2RrQ3VycmVudC9jb21tb24gYi90ZXN0cy90ZXN0cy9zZWxpbnV4L3NlbGludXhUYXJnZXRTZGtDdXJyZW50L2NvbW1vbgpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi41ODFlYjE3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvc2VsaW51eC9zZWxpbnV4VGFyZ2V0U2RrQ3VycmVudC9jb21tb24KQEAgLTAsMCArMSBAQAorLi4vY29tbW9uL3NyYwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NlbGludXgvc2VsaW51eFRhcmdldFNka0N1cnJlbnQvc3JjL2FuZHJvaWQvc2VjdXJpdHkvU0VMaW51eFRhcmdldFNka1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3NlbGludXgvc2VsaW51eFRhcmdldFNka0N1cnJlbnQvc3JjL2FuZHJvaWQvc2VjdXJpdHkvU0VMaW51eFRhcmdldFNka1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjkxM2ZjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvc2VsaW51eC9zZWxpbnV4VGFyZ2V0U2RrQ3VycmVudC9zcmMvYW5kcm9pZC9zZWN1cml0eS9TRUxpbnV4VGFyZ2V0U2RrVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VjdXJpdHk7CisKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogVmVyaWZ5IHRoZSBzZWxpbnV4IGRvbWFpbiBmb3IgYXBwcyBydW5uaW5nIHdpdGggY3VycmVudCB0YXJnZXRTZGtWZXJzaW9uCisgKi8KK3B1YmxpYyBjbGFzcyBTRUxpbnV4VGFyZ2V0U2RrVGVzdCBleHRlbmRzIFNFTGludXhUYXJnZXRTZGtUZXN0QmFzZQoreworICAgIC8qKgorICAgICAqIFZlcmlmeSB0aGF0IG5ldC5kbnMgcHJvcGVydGllcyBtYXkgbm90IGJlIHJlYWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9EbnMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBub0RucygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZlcmlmeSB0aGF0IHNlbGludXggY29udGV4dCBpcyB0aGUgZXhwZWN0ZWQgZG9tYWluIGJhc2VkIG9uCisgICAgICogdGFyZ2V0U2RrVmVyc2lvbiA9IGN1cnJlbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwRG9tYWluQ29udGV4dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBjb250ZXh0ID0gInU6cjp1bnRydXN0ZWRfYXBwOnMwOmNbMC05XSssY1swLTldKyxjWzAtOV0rLGNbMC05XSsiOworICAgICAgICBTdHJpbmcgbXNnID0gIlVudHJ1c3RlZCBhcHBzIHdpdGggdGFyZ2V0U2RrVmVyc2lvbiAyOCBhbmQgYWJvdmUgIiArCisgICAgICAgICAgICAibXVzdCBydW4gaW4gdGhlIHVudHJ1c3RlZF9hcHAgc2VsaW51eCBkb21haW4gYW5kIHVzZSB0aGUgbGV2ZWxGcm9tPWFsbCAiICsKKyAgICAgICAgICAgICJzZWxlY3RvciBpbiBTRUxpbnV4IHNlYXBwX2NvbnRleHRzIHdoaWNoIGFkZHMgZm91ciBjYXRlZ29yeSB0eXBlcyAiICsKKyAgICAgICAgICAgICJ0byB0aGUgYXBwJ3Mgc2VsaW51eCBjb250ZXh0LlxuIiArCisgICAgICAgICAgICAiRXhhbXBsZSBleHBlY3RlZCB2YWx1ZTogdTpyOnVudHJ1c3RlZF9hcHA6czA6Yzg5LGMyNTYsYzUxMixjNzY4XG4iICsKKyAgICAgICAgICAgICJBY3R1YWwgdmFsdWU6ICI7CisgICAgICAgIGFwcERvbWFpbkNvbnRleHQoY29udGV4dCwgbXNnKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWZXJpZnkgdGhhdCBzZWxpbnV4IGNvbnRleHQgaXMgdGhlIGV4cGVjdGVkIHR5cGUgYmFzZWQgb24KKyAgICAgKiB0YXJnZXRTZGtWZXJzaW9uID0gY3VycmVudAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBEYXRhQ29udGV4dCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgY29udGV4dCA9ICJ1Om9iamVjdF9yOmFwcF9kYXRhX2ZpbGU6czA6Y1swLTldKyxjWzAtOV0rLGNbMC05XSssY1swLTldKyI7CisgICAgICAgIFN0cmluZyBtc2cgPSAiVW50cnVzdGVkIGFwcHMgd2l0aCB0YXJnZXRTZGtWZXJzaW9uIDI4IGFuZCBhYm92ZSAiICsKKyAgICAgICAgICAgICJtdXN0IHVzZSB0aGUgYXBwX2RhdGFfZmlsZSBzZWxpbnV4IGNvbnRleHQgYW5kIHVzZSB0aGUgbGV2ZWxGcm9tPWFsbCAiICsKKyAgICAgICAgICAgICJzZWxlY3RvciBpbiBTRUxpbnV4IHNlYXBwX2NvbnRleHRzIHdoaWNoIGFkZHMgZm91ciBjYXRlZ29yeSB0eXBlcyAiICsKKyAgICAgICAgICAgICJ0byB0aGUgYXBwX2RhdGFfZmlsZSBjb250ZXh0LlxuIiArCisgICAgICAgICAgICAiRXhhbXBsZSBleHBlY3RlZCB2YWx1ZTogdTpvYmplY3RfcjphcHBfZGF0YV9maWxlOnMwOmM4OSxjMjU2LGM1MTIsYzc2OFxuIiArCisgICAgICAgICAgICAiQWN0dWFsIHZhbHVlOiAiOworICAgICAgICBhcHBEYXRhQ29udGV4dChjb250ZXh0LCBtc2cpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3Nob3J0Y3V0bWFuYWdlci9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvc2hvcnRjdXRtYW5hZ2VyL0FuZHJvaWQubWsKaW5kZXggMjkzMzNhYS4uNTZhODFhOSAxMDA3NTUKLS0tIGEvdGVzdHMvdGVzdHMvc2hvcnRjdXRtYW5hZ2VyL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvdGVzdHMvc2hvcnRjdXRtYW5hZ2VyL0FuZHJvaWQubWsKQEAgLTIxLDE1ICsyMSwxNSBAQAogTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKIAogTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKLSAgICBhbmRyb2lkLXN1cHBvcnQtdGVzdCBcCi0gICAgYW5kcm9pZC1zdXBwb3J0LXY0IFwKKyAgICBhbmRyb2lkeC50ZXN0LnJ1bGVzIFwKKyAgICBhbmRyb2lkeC5sZWdhY3lfbGVnYWN5LXN1cHBvcnQtdjQgXAogICAgIG1vY2tpdG8tdGFyZ2V0LW1pbnVzLWp1bml0NCBcCi0gICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbCBcCi0gICAgY3RzdGVzdHJ1bm5lciBcCisgICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgXAorICAgIGN0c3Rlc3RydW5uZXItYXh0IFwKICAgICB1Yi11aWF1dG9tYXRvciBcCiAgICAgU2hvcnRjdXRNYW5hZ2VyVGVzdFV0aWxzCiAKLUxPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIuc3R1YnMgYW5kcm9pZC50ZXN0LmJhc2Uuc3R1YnMKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKSBcCiAgICAgJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBjb21tb24vc3JjKQpAQCAtNDEsNiArNDEsNSBAQAogTE9DQUxfU0RLX1ZFUlNJT04gOj0gdGVzdF9jdXJyZW50CiAKIGluY2x1ZGUgJChCVUlMRF9DVFNfUEFDS0FHRSkKLSNpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKIAogaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2hvcnRjdXRtYW5hZ2VyL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy90ZXN0cy9zaG9ydGN1dG1hbmFnZXIvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBkNjljZTViLi4yOWIyZTgzIDEwMDc1NQotLS0gYS90ZXN0cy90ZXN0cy9zaG9ydGN1dG1hbmFnZXIvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9zaG9ydGN1dG1hbmFnZXIvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtNTUsNyArNTUsNyBAQAogICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0iZmFsc2UiLz4KICAgICA8L2FwcGxpY2F0aW9uPgogCi0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmNvbnRlbnQucG0uY3RzLnNob3J0Y3V0bWFuYWdlciIKICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIGZvciBTaG9ydGN1dE1hbmFnZXIiPgogICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0ibGlzdGVuZXIiCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zaG9ydGN1dG1hbmFnZXIvcGFja2FnZXMvbGF1bmNoZXJtYW5pZmVzdC9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvc2hvcnRjdXRtYW5hZ2VyL3BhY2thZ2VzL2xhdW5jaGVybWFuaWZlc3QvQW5kcm9pZC5tawppbmRleCA1Nzc0NDY2Li40MjZiYjg5IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9zaG9ydGN1dG1hbmFnZXIvcGFja2FnZXMvbGF1bmNoZXJtYW5pZmVzdC9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3Rlc3RzL3Nob3J0Y3V0bWFuYWdlci9wYWNrYWdlcy9sYXVuY2hlcm1hbmlmZXN0L0FuZHJvaWQubWsKQEAgLTI3LDExICsyNywxMSBAQAogICAgICAgICAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIC4uLy4uL2NvbW1vbi9zcmMpCiAKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCi0gICAgYW5kcm9pZC1zdXBwb3J0LXRlc3QgXAotICAgIGFuZHJvaWQtc3VwcG9ydC12NCBcCisgICAgYW5kcm9pZHgudGVzdC5ydWxlcyBcCisgICAgYW5kcm9pZHgubGVnYWN5X2xlZ2FjeS1zdXBwb3J0LXY0IFwKICAgICBtb2NraXRvLXRhcmdldC1taW51cy1qdW5pdDQgXAotICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwgXAotICAgIGN0c3Rlc3RydW5uZXIgXAorICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0IFwKKyAgICBjdHN0ZXN0cnVubmVyLWF4dCBcCiAgICAgdWItdWlhdXRvbWF0b3IgXAogICAgIFNob3J0Y3V0TWFuYWdlclRlc3RVdGlscwogCkBAIC01NywxMSArNTcsMTEgQEAKICAgICAgICAgJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCAuLi8uLi9jb21tb24vc3JjKQogCiBMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAotICAgIGFuZHJvaWQtc3VwcG9ydC10ZXN0IFwKLSAgICBhbmRyb2lkLXN1cHBvcnQtdjQgXAorICAgIGFuZHJvaWR4LnRlc3QucnVsZXMgXAorICAgIGFuZHJvaWR4LmxlZ2FjeV9sZWdhY3ktc3VwcG9ydC12NCBcCiAgICAgbW9ja2l0by10YXJnZXQtbWludXMtanVuaXQ0IFwKLSAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsIFwKLSAgICBjdHN0ZXN0cnVubmVyIFwKKyAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBcCisgICAgY3RzdGVzdHJ1bm5lci1heHQgXAogICAgIHViLXVpYXV0b21hdG9yIFwKICAgICBTaG9ydGN1dE1hbmFnZXJUZXN0VXRpbHMKIApAQCAtODcsMTEgKzg3LDExIEBACiAgICAgICAgICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgLi4vLi4vY29tbW9uL3NyYykKIAogTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKLSAgICBhbmRyb2lkLXN1cHBvcnQtdGVzdCBcCi0gICAgYW5kcm9pZC1zdXBwb3J0LXY0IFwKKyAgICBhbmRyb2lkeC50ZXN0LnJ1bGVzIFwKKyAgICBhbmRyb2lkeC5sZWdhY3lfbGVnYWN5LXN1cHBvcnQtdjQgXAogICAgIG1vY2tpdG8tdGFyZ2V0LW1pbnVzLWp1bml0NCBcCi0gICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbCBcCi0gICAgY3RzdGVzdHJ1bm5lciBcCisgICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgXAorICAgIGN0c3Rlc3RydW5uZXItYXh0IFwKICAgICB1Yi11aWF1dG9tYXRvciBcCiAgICAgU2hvcnRjdXRNYW5hZ2VyVGVzdFV0aWxzCiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3Nob3J0Y3V0bWFuYWdlci9wYWNrYWdlcy9sYXVuY2hlcm1hbmlmZXN0L0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy90ZXN0cy9zaG9ydGN1dG1hbmFnZXIvcGFja2FnZXMvbGF1bmNoZXJtYW5pZmVzdC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDE4NzJhN2QuLmVjNjg4ZmUgMTAwNzU1Ci0tLSBhL3Rlc3RzL3Rlc3RzL3Nob3J0Y3V0bWFuYWdlci9wYWNrYWdlcy9sYXVuY2hlcm1hbmlmZXN0L0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvc2hvcnRjdXRtYW5hZ2VyL3BhY2thZ2VzL2xhdW5jaGVybWFuaWZlc3QvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjAsNiArMjAsOCBAQAogICAgIGFuZHJvaWQ6c2hhcmVkVXNlcklkPSJhbmRyb2lkLmNvbnRlbnQucG0uY3RzLnNob3J0Y3V0bWFuYWdlci5wYWNrYWdlcyI+CiAKICAgICA8YXBwbGljYXRpb24+CisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgorCiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IkxhdW5jaGVyIj4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3Nob3J0Y3V0bWFuYWdlci9wYWNrYWdlcy9sYXVuY2hlcm1hbmlmZXN0X25vbnNoYXJlZC9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvc2hvcnRjdXRtYW5hZ2VyL3BhY2thZ2VzL2xhdW5jaGVybWFuaWZlc3Rfbm9uc2hhcmVkL0FuZHJvaWQubWsKaW5kZXggMGQ5NTRlMi4uYjg5NGYxMyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvc2hvcnRjdXRtYW5hZ2VyL3BhY2thZ2VzL2xhdW5jaGVybWFuaWZlc3Rfbm9uc2hhcmVkL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvdGVzdHMvc2hvcnRjdXRtYW5hZ2VyL3BhY2thZ2VzL2xhdW5jaGVybWFuaWZlc3Rfbm9uc2hhcmVkL0FuZHJvaWQubWsKQEAgLTI2LDExICsyNiwxMSBAQAogICAgICAgICAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIC4uLy4uL2NvbW1vbi9zcmMpCiAKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCi0gICAgYW5kcm9pZC1zdXBwb3J0LXRlc3QgXAotICAgIGFuZHJvaWQtc3VwcG9ydC12NCBcCisgICAgYW5kcm9pZHgudGVzdC5ydWxlcyBcCisgICAgYW5kcm9pZHgubGVnYWN5X2xlZ2FjeS1zdXBwb3J0LXY0IFwKICAgICBtb2NraXRvLXRhcmdldC1taW51cy1qdW5pdDQgXAotICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwgXAotICAgIGN0c3Rlc3RydW5uZXIgXAorICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0IFwKKyAgICBjdHN0ZXN0cnVubmVyLWF4dCBcCiAgICAgdWItdWlhdXRvbWF0b3IgXAogICAgIFNob3J0Y3V0TWFuYWdlclRlc3RVdGlscwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zaG9ydGN1dG1hbmFnZXIvcGFja2FnZXMvbGF1bmNoZXJtYW5pZmVzdF9ub25zaGFyZWQvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL3Nob3J0Y3V0bWFuYWdlci9wYWNrYWdlcy9sYXVuY2hlcm1hbmlmZXN0X25vbnNoYXJlZC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGM0M2Q1NzQuLjkwZDBkZjUgMTAwNzU1Ci0tLSBhL3Rlc3RzL3Rlc3RzL3Nob3J0Y3V0bWFuYWdlci9wYWNrYWdlcy9sYXVuY2hlcm1hbmlmZXN0X25vbnNoYXJlZC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL3Nob3J0Y3V0bWFuYWdlci9wYWNrYWdlcy9sYXVuY2hlcm1hbmlmZXN0X25vbnNoYXJlZC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0xOSw2ICsxOSw4IEBACiAgICAgcGFja2FnZT0iYW5kcm9pZC5jb250ZW50LnBtLmN0cy5zaG9ydGN1dG1hbmFnZXIucGFja2FnZXMiPgogCiAgICAgPGFwcGxpY2F0aW9uPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKwogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJMYXVuY2hlciI+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zaG9ydGN1dG1hbmFnZXIvcGFja2FnZXMvcGFja2FnZW1hbmlmZXN0L0FuZHJvaWQubWsgYi90ZXN0cy90ZXN0cy9zaG9ydGN1dG1hbmFnZXIvcGFja2FnZXMvcGFja2FnZW1hbmlmZXN0L0FuZHJvaWQubWsKaW5kZXggYjg3NDFmMi4uZTY0NTE3NyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvc2hvcnRjdXRtYW5hZ2VyL3BhY2thZ2VzL3BhY2thZ2VtYW5pZmVzdC9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3Rlc3RzL3Nob3J0Y3V0bWFuYWdlci9wYWNrYWdlcy9wYWNrYWdlbWFuaWZlc3QvQW5kcm9pZC5tawpAQCAtMjYsMTEgKzI2LDExIEBACiAgICAgICAgICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgLi4vLi4vY29tbW9uL3NyYykKIAogTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKLSAgICBhbmRyb2lkLXN1cHBvcnQtdGVzdCBcCi0gICAgYW5kcm9pZC1zdXBwb3J0LXY0IFwKKyAgICBhbmRyb2lkeC50ZXN0LnJ1bGVzIFwKKyAgICBhbmRyb2lkeC5sZWdhY3lfbGVnYWN5LXN1cHBvcnQtdjQgXAogICAgIG1vY2tpdG8tdGFyZ2V0LW1pbnVzLWp1bml0NCBcCi0gICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbCBcCi0gICAgY3RzdGVzdHJ1bm5lciBcCisgICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgXAorICAgIGN0c3Rlc3RydW5uZXItYXh0IFwKICAgICB1Yi11aWF1dG9tYXRvciBcCiAgICAgU2hvcnRjdXRNYW5hZ2VyVGVzdFV0aWxzCiAKQEAgLTU2LDExICs1NiwxMSBAQAogICAgICAgICAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIC4uLy4uL2NvbW1vbi9zcmMpCiAKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCi0gICAgYW5kcm9pZC1zdXBwb3J0LXRlc3QgXAotICAgIGFuZHJvaWQtc3VwcG9ydC12NCBcCisgICAgYW5kcm9pZHgudGVzdC5ydWxlcyBcCisgICAgYW5kcm9pZHgubGVnYWN5X2xlZ2FjeS1zdXBwb3J0LXY0IFwKICAgICBtb2NraXRvLXRhcmdldC1taW51cy1qdW5pdDQgXAotICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwgXAotICAgIGN0c3Rlc3RydW5uZXIgXAorICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0IFwKKyAgICBjdHN0ZXN0cnVubmVyLWF4dCBcCiAgICAgdWItdWlhdXRvbWF0b3IgXAogICAgIFNob3J0Y3V0TWFuYWdlclRlc3RVdGlscwogCkBAIC04NiwxMSArODYsMTEgQEAKICAgICAgICAgJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCAuLi8uLi9jb21tb24vc3JjKQogCiBMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAotICAgIGFuZHJvaWQtc3VwcG9ydC10ZXN0IFwKLSAgICBhbmRyb2lkLXN1cHBvcnQtdjQgXAorICAgIGFuZHJvaWR4LnRlc3QucnVsZXMgXAorICAgIGFuZHJvaWR4LmxlZ2FjeV9sZWdhY3ktc3VwcG9ydC12NCBcCiAgICAgbW9ja2l0by10YXJnZXQtbWludXMtanVuaXQ0IFwKLSAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsIFwKLSAgICBjdHN0ZXN0cnVubmVyIFwKKyAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBcCisgICAgY3RzdGVzdHJ1bm5lci1heHQgXAogICAgIHViLXVpYXV0b21hdG9yIFwKICAgICBTaG9ydGN1dE1hbmFnZXJUZXN0VXRpbHMKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2hvcnRjdXRtYW5hZ2VyL3BhY2thZ2VzL3BhY2thZ2VtYW5pZmVzdC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdGVzdHMvc2hvcnRjdXRtYW5hZ2VyL3BhY2thZ2VzL3BhY2thZ2VtYW5pZmVzdC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDE4YTExOGUuLmE1YTAwNjAgMTAwNzU1Ci0tLSBhL3Rlc3RzL3Rlc3RzL3Nob3J0Y3V0bWFuYWdlci9wYWNrYWdlcy9wYWNrYWdlbWFuaWZlc3QvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9zaG9ydGN1dG1hbmFnZXIvcGFja2FnZXMvcGFja2FnZW1hbmlmZXN0L0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTIwLDYgKzIwLDggQEAKICAgICBhbmRyb2lkOnNoYXJlZFVzZXJJZD0iYW5kcm9pZC5jb250ZW50LnBtLmN0cy5zaG9ydGN1dG1hbmFnZXIucGFja2FnZXMiPgogCiAgICAgPGFwcGxpY2F0aW9uPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKwogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJMYXVuY2hlciIKICAgICAgICAgICAgIGFuZHJvaWQ6ZW5hYmxlZD0idHJ1ZSI+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3Nob3J0Y3V0bWFuYWdlci9wYWNrYWdlcy9wYWNrYWdlbWFuaWZlc3Rfbm9uc2hhcmVkL0FuZHJvaWQubWsgYi90ZXN0cy90ZXN0cy9zaG9ydGN1dG1hbmFnZXIvcGFja2FnZXMvcGFja2FnZW1hbmlmZXN0X25vbnNoYXJlZC9BbmRyb2lkLm1rCmluZGV4IGFjMDkzNTUuLmFhMDExMmEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3Nob3J0Y3V0bWFuYWdlci9wYWNrYWdlcy9wYWNrYWdlbWFuaWZlc3Rfbm9uc2hhcmVkL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvdGVzdHMvc2hvcnRjdXRtYW5hZ2VyL3BhY2thZ2VzL3BhY2thZ2VtYW5pZmVzdF9ub25zaGFyZWQvQW5kcm9pZC5tawpAQCAtMjYsMTEgKzI2LDExIEBACiAgICAgICAgICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgLi4vLi4vY29tbW9uL3NyYykKIAogTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKLSAgICBhbmRyb2lkLXN1cHBvcnQtdGVzdCBcCi0gICAgYW5kcm9pZC1zdXBwb3J0LXY0IFwKKyAgICBhbmRyb2lkeC50ZXN0LnJ1bGVzIFwKKyAgICBhbmRyb2lkeC5sZWdhY3lfbGVnYWN5LXN1cHBvcnQtdjQgXAogICAgIG1vY2tpdG8tdGFyZ2V0LW1pbnVzLWp1bml0NCBcCi0gICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbCBcCi0gICAgY3RzdGVzdHJ1bm5lciBcCisgICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgXAorICAgIGN0c3Rlc3RydW5uZXItYXh0IFwKICAgICB1Yi11aWF1dG9tYXRvciBcCiAgICAgU2hvcnRjdXRNYW5hZ2VyVGVzdFV0aWxzCiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3Nob3J0Y3V0bWFuYWdlci9wYWNrYWdlcy9wYWNrYWdlbWFuaWZlc3Rfbm9uc2hhcmVkL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy90ZXN0cy9zaG9ydGN1dG1hbmFnZXIvcGFja2FnZXMvcGFja2FnZW1hbmlmZXN0X25vbnNoYXJlZC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGJmMzU2MmIuLmNkMzA2MDIgMTAwNzU1Ci0tLSBhL3Rlc3RzL3Rlc3RzL3Nob3J0Y3V0bWFuYWdlci9wYWNrYWdlcy9wYWNrYWdlbWFuaWZlc3Rfbm9uc2hhcmVkL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvc2hvcnRjdXRtYW5hZ2VyL3BhY2thZ2VzL3BhY2thZ2VtYW5pZmVzdF9ub25zaGFyZWQvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMTksNiArMTksOCBAQAogICAgIHBhY2thZ2U9ImFuZHJvaWQuY29udGVudC5wbS5jdHMuc2hvcnRjdXRtYW5hZ2VyLnBhY2thZ2VzIj4KIAogICAgIDxhcHBsaWNhdGlvbj4KKyAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CisKICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iTGF1bmNoZXIiIGFuZHJvaWQ6ZW5hYmxlZD0idHJ1ZSIgYW5kcm9pZDpleHBvcnRlZD0iZmFsc2UiPgogICAgICAgICA8L2FjdGl2aXR5PgogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zaG9ydGN1dG1hbmFnZXIvcGFja2FnZXMvc3JjL2FuZHJvaWQvY29udGVudC9wbS9jdHMvc2hvcnRjdXRtYW5hZ2VyL3BhY2thZ2VzL1Nob3J0Y3V0Q29uZmlybVBpbi5qYXZhIGIvdGVzdHMvdGVzdHMvc2hvcnRjdXRtYW5hZ2VyL3BhY2thZ2VzL3NyYy9hbmRyb2lkL2NvbnRlbnQvcG0vY3RzL3Nob3J0Y3V0bWFuYWdlci9wYWNrYWdlcy9TaG9ydGN1dENvbmZpcm1QaW4uamF2YQppbmRleCA5YTI2NTliLi43Mjc4MjhlIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9zaG9ydGN1dG1hbmFnZXIvcGFja2FnZXMvc3JjL2FuZHJvaWQvY29udGVudC9wbS9jdHMvc2hvcnRjdXRtYW5hZ2VyL3BhY2thZ2VzL1Nob3J0Y3V0Q29uZmlybVBpbi5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3Nob3J0Y3V0bWFuYWdlci9wYWNrYWdlcy9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9zaG9ydGN1dG1hbmFnZXIvcGFja2FnZXMvU2hvcnRjdXRDb25maXJtUGluLmphdmEKQEAgLTEwOCw2ICsxMDgsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIFJlcGx5VXRpbC5zZW5kU3VjY2Vzc1JlcGx5KHRoaXMsIHJlcGx5QWN0aW9uKTsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIlNlbnQgcmVwbHkiKTsKICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIExvZy5lKFRBRywgIkNhdWdodCBleGNlcHRpb24iLCBlKTsKICAgICAgICAgICAgIGlmIChyZXBseUFjdGlvbiAhPSBudWxsKSB7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zaG9ydGN1dG1hbmFnZXIvc3JjL2FuZHJvaWQvY29udGVudC9wbS9jdHMvc2hvcnRjdXRtYW5hZ2VyL1Nob3J0Y3V0TWFuYWdlckNsaWVudEFwaVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3Nob3J0Y3V0bWFuYWdlci9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9zaG9ydGN1dG1hbmFnZXIvU2hvcnRjdXRNYW5hZ2VyQ2xpZW50QXBpVGVzdC5qYXZhCmluZGV4IDk5YzdkYzEuLmYyYjlmYzQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3Nob3J0Y3V0bWFuYWdlci9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9zaG9ydGN1dG1hbmFnZXIvU2hvcnRjdXRNYW5hZ2VyQ2xpZW50QXBpVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3Nob3J0Y3V0bWFuYWdlci9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9zaG9ydGN1dG1hbmFnZXIvU2hvcnRjdXRNYW5hZ2VyQ2xpZW50QXBpVGVzdC5qYXZhCkBAIC0yMzksMTQgKzIzOSwxNCBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXREeW5hbWljU2hvcnRjdXRzKCkgewotICAgICAgICBydW5XaXRoQ2FsbGVyKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IHsKKyAgICAgICAgcnVuV2l0aENhbGxlcldpdGhTdHJpY3RNb2RlKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IHsKICAgICAgICAgICAgIGFzc2VydFRydWUoZ2V0TWFuYWdlcigpLnNldER5bmFtaWNTaG9ydGN1dHMobGlzdCgKICAgICAgICAgICAgICAgICAgICAgbWFrZVNob3J0Y3V0KCJzMSIsICJ0aXRsZTEiKSwKICAgICAgICAgICAgICAgICAgICAgbWFrZVNob3J0Y3V0KCJzMiIsICJ0aXRsZTIiKSwKICAgICAgICAgICAgICAgICAgICAgbWFrZVNob3J0Y3V0KCJzMyIsICJ0aXRsZTMiKSkpKTsKICAgICAgICAgfSk7CiAKLSAgICAgICAgcnVuV2l0aENhbGxlcihtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CisgICAgICAgIHJ1bldpdGhDYWxsZXJXaXRoU3RyaWN0TW9kZShtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CiAgICAgICAgICAgICBhc3NlcnRXaXRoKGdldE1hbmFnZXIoKS5nZXREeW5hbWljU2hvcnRjdXRzKCkpCiAgICAgICAgICAgICAgICAgICAgIC5hcmVBbGxFbmFibGVkKCkKICAgICAgICAgICAgICAgICAgICAgLmFyZUFsbER5bmFtaWMoKQpAQCAtMjY3LDEyICsyNjcsMTIgQEAKICAgICAgICAgfSk7CiAKICAgICAgICAgLy8gUHVibGlzaCBmcm9tIGRpZmZlcmVudCBwYWNrYWdlLgotICAgICAgICBydW5XaXRoQ2FsbGVyKG1QYWNrYWdlQ29udGV4dDIsICgpIC0+IHsKKyAgICAgICAgcnVuV2l0aENhbGxlcldpdGhTdHJpY3RNb2RlKG1QYWNrYWdlQ29udGV4dDIsICgpIC0+IHsKICAgICAgICAgICAgIGFzc2VydFRydWUoZ2V0TWFuYWdlcigpLnNldER5bmFtaWNTaG9ydGN1dHMobGlzdCgKICAgICAgICAgICAgICAgICAgICAgbWFrZVNob3J0Y3V0KCJzMXgiLCAidGl0bGUxeCIpKSkpOwogICAgICAgICB9KTsKIAotICAgICAgICBydW5XaXRoQ2FsbGVyKG1QYWNrYWdlQ29udGV4dDIsICgpIC0+IHsKKyAgICAgICAgcnVuV2l0aENhbGxlcldpdGhTdHJpY3RNb2RlKG1QYWNrYWdlQ29udGV4dDIsICgpIC0+IHsKICAgICAgICAgICAgIGFzc2VydFdpdGgoZ2V0TWFuYWdlcigpLmdldER5bmFtaWNTaG9ydGN1dHMoKSkKICAgICAgICAgICAgICAgICAgICAgLmFyZUFsbEVuYWJsZWQoKQogICAgICAgICAgICAgICAgICAgICAuYXJlQWxsRHluYW1pYygpCkBAIC0yODcsNyArMjg3LDcgQEAKICAgICAgICAgfSk7CiAKICAgICAgICAgLy8gUGFja2FnZSAxIHN0aWxsIGhhcyB0aGUgc2FtZSBzaG9ydGN1dHMuCi0gICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgYXNzZXJ0V2l0aChnZXRNYW5hZ2VyKCkuZ2V0RHluYW1pY1Nob3J0Y3V0cygpKQogICAgICAgICAgICAgICAgICAgICAuYXJlQWxsRW5hYmxlZCgpCiAgICAgICAgICAgICAgICAgICAgIC5hcmVBbGxEeW5hbWljKCkKQEAgLTMwNywxMiArMzA3LDEyIEBACiAgICAgICAgICAgICAgICAgICAgIC5pc0VtcHR5KCk7CiAgICAgICAgIH0pOwogCi0gICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgYXNzZXJ0VHJ1ZShnZXRNYW5hZ2VyKCkuc2V0RHluYW1pY1Nob3J0Y3V0cyhsaXN0KAogICAgICAgICAgICAgICAgICAgICBtYWtlU2hvcnRjdXQoInMyIiwgInRpdGxlMi11cGRhdGVkIikpKSk7CiAgICAgICAgIH0pOwogCi0gICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgYXNzZXJ0V2l0aChnZXRNYW5hZ2VyKCkuZ2V0RHluYW1pY1Nob3J0Y3V0cygpKQogICAgICAgICAgICAgICAgICAgICAuYXJlQWxsRW5hYmxlZCgpCiAgICAgICAgICAgICAgICAgICAgIC5hcmVBbGxEeW5hbWljKCkKQEAgLTMyNiwxMSArMzI2LDExIEBACiAgICAgICAgICAgICAgICAgICAgIC5pc0VtcHR5KCk7CiAgICAgICAgIH0pOwogCi0gICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgYXNzZXJ0VHJ1ZShnZXRNYW5hZ2VyKCkuc2V0RHluYW1pY1Nob3J0Y3V0cyhsaXN0KCkpKTsKICAgICAgICAgfSk7CiAKLSAgICAgICAgcnVuV2l0aENhbGxlcihtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CisgICAgICAgIHJ1bldpdGhDYWxsZXJXaXRoU3RyaWN0TW9kZShtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CiAgICAgICAgICAgICBhc3NlcnRXaXRoKGdldE1hbmFnZXIoKS5nZXREeW5hbWljU2hvcnRjdXRzKCkpCiAgICAgICAgICAgICAgICAgICAgIC5pc0VtcHR5KCk7CiAgICAgICAgICAgICBhc3NlcnRXaXRoKGdldE1hbmFnZXIoKS5nZXRQaW5uZWRTaG9ydGN1dHMoKSkKQEAgLTM0MCw3ICszNDAsNyBAQAogICAgICAgICB9KTsKIAogICAgICAgICAvLyBQYWNrYWdlMiBzdGlsbCBoYXMgdGhlIHNhbWUgc2hvcnRjdXRzLgotICAgICAgICBydW5XaXRoQ2FsbGVyKG1QYWNrYWdlQ29udGV4dDIsICgpIC0+IHsKKyAgICAgICAgcnVuV2l0aENhbGxlcldpdGhTdHJpY3RNb2RlKG1QYWNrYWdlQ29udGV4dDIsICgpIC0+IHsKICAgICAgICAgICAgIGFzc2VydFdpdGgoZ2V0TWFuYWdlcigpLmdldER5bmFtaWNTaG9ydGN1dHMoKSkKICAgICAgICAgICAgICAgICAgICAgLmFyZUFsbEVuYWJsZWQoKQogICAgICAgICAgICAgICAgICAgICAuYXJlQWxsRHluYW1pYygpCkBAIC0zNjYsNyArMzY2LDcgQEAKICAgICAgICAgICAgICAgICBnZXRUZXN0Q29udGV4dCgpLmdldFJlc291cmNlcygpLCBSLmRyYXdhYmxlLmJsYWNrXzE2eDY0KSk7CiAgICAgICAgIGZpbmFsIEljb24gaWNvbjYgPSBJY29uLmNyZWF0ZVdpdGhBZGFwdGl2ZUJpdG1hcChCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKAogICAgICAgICAgICAgICAgIGdldFRlc3RDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCksIFIuZHJhd2FibGUuYmxhY2tfMzJ4MzIpKTsKLSAgICAgICAgcnVuV2l0aENhbGxlcihtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CisgICAgICAgIHJ1bldpdGhDYWxsZXJXaXRoU3RyaWN0TW9kZShtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CiAgICAgICAgICAgICBmaW5hbCBTaG9ydGN1dEluZm8gc291cmNlID0gbWFrZVNob3J0Y3V0QnVpbGRlcigiczEiKQogICAgICAgICAgICAgICAgICAgICAuc2V0U2hvcnRMYWJlbCgic2hvcnRsYWJlbCIpCiAgICAgICAgICAgICAgICAgICAgIC5zZXRMb25nTGFiZWwoImxvbmdsYWJlbCIpCkBAIC0zOTcsNyArMzk3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWNvbjEpOwogICAgICAgICB9KTsKIAotICAgICAgICBydW5XaXRoQ2FsbGVyKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IHsKKyAgICAgICAgcnVuV2l0aENhbGxlcldpdGhTdHJpY3RNb2RlKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IHsKICAgICAgICAgICAgIC8vIE5vIGZpZWxkcyB1cGRhdGVkLgogICAgICAgICAgICAgZmluYWwgU2hvcnRjdXRJbmZvIHVwZGF0ZWQgPSBtYWtlU2hvcnRjdXRCdWlsZGVyKCJzMSIpCiAgICAgICAgICAgICAgICAgICAgIC5zZXRTaG9ydExhYmVsKCJ4eHgiKQpAQCAtNDIzLDcgKzQyMyw3IEBACiAgICAgICAgICAgICAgICAgICAgIGdldEljb25Bc0xhdW5jaGVyKG1MYXVuY2hlckNvbnRleHQxLCBtUGFja2FnZUNvbnRleHQxLmdldFBhY2thZ2VOYW1lKCksICJzMSIpKTsKICAgICAgICAgfSk7CiAKLSAgICAgICAgcnVuV2l0aENhbGxlcihtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CisgICAgICAgIHJ1bldpdGhDYWxsZXJXaXRoU3RyaWN0TW9kZShtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CiAgICAgICAgICAgICBmaW5hbCBTaG9ydGN1dEluZm8gc291cmNlID0gbWFrZVNob3J0Y3V0QnVpbGRlcigiczEiKQogICAgICAgICAgICAgICAgICAgICAuc2V0U2hvcnRMYWJlbCgic2hvcnRsYWJlbCIpCiAgICAgICAgICAgICAgICAgICAgIC5zZXRMb25nTGFiZWwoImxvbmdsYWJlbCIpCkBAIC00NTUsNyArNDU1LDcgQEAKICAgICAgICAgfSk7CiAKICAgICAgICAgLy8gcGFyYW5vaWQgaWNvbiBjaGVjawotICAgICAgICBydW5XaXRoQ2FsbGVyKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IHsKKyAgICAgICAgcnVuV2l0aENhbGxlcldpdGhTdHJpY3RNb2RlKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IHsKICAgICAgICAgICAgIC8vIE5vIGZpZWxkcyB1cGRhdGVkLgogICAgICAgICAgICAgZmluYWwgU2hvcnRjdXRJbmZvIHVwZGF0ZWQgPSBtYWtlU2hvcnRjdXRCdWlsZGVyKCJzMSIpCiAgICAgICAgICAgICAgICAgICAgIC5zZXRTaG9ydExhYmVsKCJ4eHgiKQpAQCAtNDc0LDcgKzQ3NCw3IEBACiAgICAgICAgICAgICAgICAgICAgIGljb24yKTsKICAgICAgICAgfSk7CiAKLSAgICAgICAgcnVuV2l0aENhbGxlcihtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CisgICAgICAgIHJ1bldpdGhDYWxsZXJXaXRoU3RyaWN0TW9kZShtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CiAgICAgICAgICAgICAvLyBObyBmaWVsZHMgdXBkYXRlZC4KICAgICAgICAgICAgIGZpbmFsIFNob3J0Y3V0SW5mbyB1cGRhdGVkID0gbWFrZVNob3J0Y3V0QnVpbGRlcigiczEiKQogICAgICAgICAgICAgICAgICAgICAuc2V0U2hvcnRMYWJlbCgieHh4IikKQEAgLTQ5NCw3ICs0OTQsNyBAQAogICAgICAgICB9KTsKIAogCi0gICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgLy8gTm8gZmllbGRzIHVwZGF0ZWQuCiAgICAgICAgICAgICBmaW5hbCBTaG9ydGN1dEluZm8gdXBkYXRlZCA9IG1ha2VTaG9ydGN1dEJ1aWxkZXIoInMxIikKICAgICAgICAgICAgICAgICAgICAgLnNldFNob3J0TGFiZWwoInh4eCIpCkBAIC01MTIsNyArNTEyLDcgQEAKICAgICAgICAgICAgIGFzc2VydEljb25EaW1lbnNpb25zKG1MYXVuY2hlckNvbnRleHQxLCBtUGFja2FnZUNvbnRleHQxLmdldFBhY2thZ2VOYW1lKCksICJzMSIsCiAgICAgICAgICAgICAgICAgICAgIGljb240KTsKICAgICAgICAgfSk7Ci0gICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgLy8gTm8gZmllbGRzIHVwZGF0ZWQuCiAgICAgICAgICAgICBmaW5hbCBTaG9ydGN1dEluZm8gdXBkYXRlZCA9IG1ha2VTaG9ydGN1dEJ1aWxkZXIoInMxIikKICAgICAgICAgICAgICAgICAgICAgLnNldFNob3J0TGFiZWwoInh4eCIpCkBAIC01MzAsNyArNTMwLDcgQEAKICAgICAgICAgICAgIGFzc2VydEljb25EaW1lbnNpb25zKG1MYXVuY2hlckNvbnRleHQxLCBtUGFja2FnZUNvbnRleHQxLmdldFBhY2thZ2VOYW1lKCksICJzMSIsCiAgICAgICAgICAgICAgICAgICAgIGljb241KTsKICAgICAgICAgfSk7Ci0gICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgLy8gTm8gZmllbGRzIHVwZGF0ZWQuCiAgICAgICAgICAgICBmaW5hbCBTaG9ydGN1dEluZm8gdXBkYXRlZCA9IG1ha2VTaG9ydGN1dEJ1aWxkZXIoInMxIikKICAgICAgICAgICAgICAgICAgICAgLnNldFNob3J0TGFiZWwoInh4eCIpCkBAIC01NTIsMTggKzU1MiwxOCBAQAogCiAgICAgcHVibGljIHZvaWQgdGVzdFNldER5bmFtaWNTaG9ydGN1dHNfd2FzUGlubmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIENyZWF0ZSBzMSBhcyBhIGZsb2F0aW5nIHBpbm5lZCBzaG9ydGN1dC4KLSAgICAgICAgcnVuV2l0aENhbGxlcihtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CisgICAgICAgIHJ1bldpdGhDYWxsZXJXaXRoU3RyaWN0TW9kZShtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CiAgICAgICAgICAgICBhc3NlcnRUcnVlKGdldE1hbmFnZXIoKS5zZXREeW5hbWljU2hvcnRjdXRzKGxpc3QoCiAgICAgICAgICAgICAgICAgICAgIG1ha2VTaG9ydGN1dCgiczEiKSkpKTsKICAgICAgICAgfSk7CiAKICAgICAgICAgc2V0RGVmYXVsdExhdW5jaGVyKGdldEluc3RydW1lbnRhdGlvbigpLCBtTGF1bmNoZXJDb250ZXh0MSk7CiAKLSAgICAgICAgcnVuV2l0aENhbGxlcihtTGF1bmNoZXJDb250ZXh0MSwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobUxhdW5jaGVyQ29udGV4dDEsICgpIC0+IHsKICAgICAgICAgICAgIGdldExhdW5jaGVyQXBwcygpLnBpblNob3J0Y3V0cyhtUGFja2FnZUNvbnRleHQxLmdldFBhY2thZ2VOYW1lKCksCiAgICAgICAgICAgICAgICAgICAgIGxpc3QoInMxIiksIGdldFVzZXJIYW5kbGUoKSk7CiAgICAgICAgIH0pOwotICAgICAgICBydW5XaXRoQ2FsbGVyKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IHsKKyAgICAgICAgcnVuV2l0aENhbGxlcldpdGhTdHJpY3RNb2RlKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IHsKICAgICAgICAgICAgIGdldE1hbmFnZXIoKS5yZW1vdmVEeW5hbWljU2hvcnRjdXRzKGxpc3QoInMxIikpOwogCiAgICAgICAgICAgICBhc3NlcnRXaXRoKGdldE1hbmFnZXIoKS5nZXREeW5hbWljU2hvcnRjdXRzKCkpCkBAIC01NzcsMTQgKzU3NywxNCBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RBZGREeW5hbWljU2hvcnRjdXRzKCkgewotICAgICAgICBydW5XaXRoQ2FsbGVyKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IHsKKyAgICAgICAgcnVuV2l0aENhbGxlcldpdGhTdHJpY3RNb2RlKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IHsKICAgICAgICAgICAgIGFzc2VydFRydWUoZ2V0TWFuYWdlcigpLmFkZER5bmFtaWNTaG9ydGN1dHMobGlzdCgKICAgICAgICAgICAgICAgICAgICAgbWFrZVNob3J0Y3V0KCJzMSIsICJ0aXRsZTEiKSwKICAgICAgICAgICAgICAgICAgICAgbWFrZVNob3J0Y3V0KCJzMiIsICJ0aXRsZTIiKSwKICAgICAgICAgICAgICAgICAgICAgbWFrZVNob3J0Y3V0KCJzMyIsICJ0aXRsZTMiKSkpKTsKICAgICAgICAgfSk7CiAKLSAgICAgICAgcnVuV2l0aENhbGxlcihtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CisgICAgICAgIHJ1bldpdGhDYWxsZXJXaXRoU3RyaWN0TW9kZShtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CiAgICAgICAgICAgICBhc3NlcnRXaXRoKGdldE1hbmFnZXIoKS5nZXREeW5hbWljU2hvcnRjdXRzKCkpCiAgICAgICAgICAgICAgICAgICAgIC5hcmVBbGxFbmFibGVkKCkKICAgICAgICAgICAgICAgICAgICAgLmFyZUFsbER5bmFtaWMoKQpAQCAtNjA1LDEyICs2MDUsMTIgQEAKICAgICAgICAgfSk7CiAKICAgICAgICAgLy8gUHVibGlzaCBmcm9tIGRpZmZlcmVudCBwYWNrYWdlLgotICAgICAgICBydW5XaXRoQ2FsbGVyKG1QYWNrYWdlQ29udGV4dDIsICgpIC0+IHsKKyAgICAgICAgcnVuV2l0aENhbGxlcldpdGhTdHJpY3RNb2RlKG1QYWNrYWdlQ29udGV4dDIsICgpIC0+IHsKICAgICAgICAgICAgIGFzc2VydFRydWUoZ2V0TWFuYWdlcigpLmFkZER5bmFtaWNTaG9ydGN1dHMobGlzdCgKICAgICAgICAgICAgICAgICAgICAgbWFrZVNob3J0Y3V0KCJzMXgiLCAidGl0bGUxeCIpKSkpOwogICAgICAgICB9KTsKIAotICAgICAgICBydW5XaXRoQ2FsbGVyKG1QYWNrYWdlQ29udGV4dDIsICgpIC0+IHsKKyAgICAgICAgcnVuV2l0aENhbGxlcldpdGhTdHJpY3RNb2RlKG1QYWNrYWdlQ29udGV4dDIsICgpIC0+IHsKICAgICAgICAgICAgIGFzc2VydFdpdGgoZ2V0TWFuYWdlcigpLmdldER5bmFtaWNTaG9ydGN1dHMoKSkKICAgICAgICAgICAgICAgICAgICAgLmFyZUFsbEVuYWJsZWQoKQogICAgICAgICAgICAgICAgICAgICAuYXJlQWxsRHluYW1pYygpCkBAIC02MjUsNyArNjI1LDcgQEAKICAgICAgICAgfSk7CiAKICAgICAgICAgLy8gUGFja2FnZSAxIHN0aWxsIGhhcyB0aGUgc2FtZSBzaG9ydGN1dHMuCi0gICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgYXNzZXJ0V2l0aChnZXRNYW5hZ2VyKCkuZ2V0RHluYW1pY1Nob3J0Y3V0cygpKQogICAgICAgICAgICAgICAgICAgICAuYXJlQWxsRW5hYmxlZCgpCiAgICAgICAgICAgICAgICAgICAgIC5hcmVBbGxEeW5hbWljKCkKQEAgLTY0NSwxMiArNjQ1LDEyIEBACiAgICAgICAgICAgICAgICAgICAgIC5pc0VtcHR5KCk7CiAgICAgICAgIH0pOwogCi0gICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgYXNzZXJ0VHJ1ZShnZXRNYW5hZ2VyKCkuYWRkRHluYW1pY1Nob3J0Y3V0cyhsaXN0KAogICAgICAgICAgICAgICAgICAgICBtYWtlU2hvcnRjdXQoInMyIiwgInRpdGxlMi11cGRhdGVkIikpKSk7CiAgICAgICAgIH0pOwogCi0gICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgYXNzZXJ0V2l0aChnZXRNYW5hZ2VyKCkuZ2V0RHluYW1pY1Nob3J0Y3V0cygpKQogICAgICAgICAgICAgICAgICAgICAuYXJlQWxsRW5hYmxlZCgpCiAgICAgICAgICAgICAgICAgICAgIC5hcmVBbGxEeW5hbWljKCkKQEAgLTY3MCwxMSArNjcwLDExIEBACiAgICAgICAgICAgICAgICAgICAgIC5pc0VtcHR5KCk7CiAgICAgICAgIH0pOwogCi0gICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgYXNzZXJ0VHJ1ZShnZXRNYW5hZ2VyKCkuYWRkRHluYW1pY1Nob3J0Y3V0cyhsaXN0KCkpKTsKICAgICAgICAgfSk7CiAKLSAgICAgICAgcnVuV2l0aENhbGxlcihtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CisgICAgICAgIHJ1bldpdGhDYWxsZXJXaXRoU3RyaWN0TW9kZShtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CiAgICAgICAgICAgICBhc3NlcnRXaXRoKGdldE1hbmFnZXIoKS5nZXREeW5hbWljU2hvcnRjdXRzKCkpCiAgICAgICAgICAgICAgICAgICAgIC5hcmVBbGxFbmFibGVkKCkKICAgICAgICAgICAgICAgICAgICAgLmFyZUFsbER5bmFtaWMoKQpAQCAtNjk1LDcgKzY5NSw3IEBACiAgICAgICAgIH0pOwogCiAgICAgICAgIC8vIFBhY2thZ2UyIHN0aWxsIGhhcyB0aGUgc2FtZSBzaG9ydGN1dHMuCi0gICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MiwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobVBhY2thZ2VDb250ZXh0MiwgKCkgLT4gewogICAgICAgICAgICAgYXNzZXJ0V2l0aChnZXRNYW5hZ2VyKCkuZ2V0RHluYW1pY1Nob3J0Y3V0cygpKQogICAgICAgICAgICAgICAgICAgICAuYXJlQWxsRW5hYmxlZCgpCiAgICAgICAgICAgICAgICAgICAgIC5hcmVBbGxEeW5hbWljKCkKQEAgLTcxOCw3ICs3MTgsNyBAQAogICAgICAgICBmaW5hbCBJY29uIGljb24zID0gbG9hZFBhY2thZ2VEcmF3YWJsZUljb24obVBhY2thZ2VDb250ZXh0MSwgImJsYWNrXzY0eDE2Iik7CiAgICAgICAgIGZpbmFsIEljb24gaWNvbjQgPSBsb2FkUGFja2FnZURyYXdhYmxlSWNvbihtUGFja2FnZUNvbnRleHQxLCAiYmxhY2tfNjR4NjQiKTsKIAotICAgICAgICBydW5XaXRoQ2FsbGVyKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IHsKKyAgICAgICAgcnVuV2l0aENhbGxlcldpdGhTdHJpY3RNb2RlKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IHsKICAgICAgICAgICAgIGZpbmFsIFNob3J0Y3V0SW5mbyBzb3VyY2UgPSBtYWtlU2hvcnRjdXRCdWlsZGVyKCJzMSIpCiAgICAgICAgICAgICAgICAgICAgIC5zZXRTaG9ydExhYmVsKCJzaG9ydGxhYmVsIikKICAgICAgICAgICAgICAgICAgICAgLnNldExvbmdMYWJlbCgibG9uZ2xhYmVsIikKQEAgLTc0OSw3ICs3NDksNyBAQAogICAgICAgICAgICAgICAgICAgICBpY29uMSk7CiAgICAgICAgIH0pOwogCi0gICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgLy8gTm8gZmllbGRzIHVwZGF0ZWQuCiAgICAgICAgICAgICBmaW5hbCBTaG9ydGN1dEluZm8gdXBkYXRlZCA9IG1ha2VTaG9ydGN1dEJ1aWxkZXIoInMxIikKICAgICAgICAgICAgICAgICAgICAgLnNldFNob3J0TGFiZWwoInh4eCIpCkBAIC03NzUsNyArNzc1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgZ2V0SWNvbkFzTGF1bmNoZXIobUxhdW5jaGVyQ29udGV4dDEsIG1QYWNrYWdlQ29udGV4dDEuZ2V0UGFja2FnZU5hbWUoKSwgInMxIikpOwogICAgICAgICB9KTsKIAotICAgICAgICBydW5XaXRoQ2FsbGVyKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IHsKKyAgICAgICAgcnVuV2l0aENhbGxlcldpdGhTdHJpY3RNb2RlKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IHsKICAgICAgICAgICAgIGZpbmFsIFNob3J0Y3V0SW5mbyBzb3VyY2UgPSBtYWtlU2hvcnRjdXRCdWlsZGVyKCJzMSIpCiAgICAgICAgICAgICAgICAgICAgIC5zZXRTaG9ydExhYmVsKCJzaG9ydGxhYmVsIikKICAgICAgICAgICAgICAgICAgICAgLnNldExvbmdMYWJlbCgibG9uZ2xhYmVsIikKQEAgLTgwNyw3ICs4MDcsNyBAQAogICAgICAgICB9KTsKIAogICAgICAgICAvLyBwYXJhbm9pZCBpY29uIGNoZWNrCi0gICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgLy8gTm8gZmllbGRzIHVwZGF0ZWQuCiAgICAgICAgICAgICBmaW5hbCBTaG9ydGN1dEluZm8gdXBkYXRlZCA9IG1ha2VTaG9ydGN1dEJ1aWxkZXIoInMxIikKICAgICAgICAgICAgICAgICAgICAgLnNldFNob3J0TGFiZWwoInh4eCIpCkBAIC04MjYsNyArODI2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWNvbjIpOwogICAgICAgICB9KTsKIAotICAgICAgICBydW5XaXRoQ2FsbGVyKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IHsKKyAgICAgICAgcnVuV2l0aENhbGxlcldpdGhTdHJpY3RNb2RlKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IHsKICAgICAgICAgICAgIC8vIE5vIGZpZWxkcyB1cGRhdGVkLgogICAgICAgICAgICAgZmluYWwgU2hvcnRjdXRJbmZvIHVwZGF0ZWQgPSBtYWtlU2hvcnRjdXRCdWlsZGVyKCJzMSIpCiAgICAgICAgICAgICAgICAgICAgIC5zZXRTaG9ydExhYmVsKCJ4eHgiKQpAQCAtODQ2LDcgKzg0Niw3IEBACiAgICAgICAgIH0pOwogCiAKLSAgICAgICAgcnVuV2l0aENhbGxlcihtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CisgICAgICAgIHJ1bldpdGhDYWxsZXJXaXRoU3RyaWN0TW9kZShtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CiAgICAgICAgICAgICAvLyBObyBmaWVsZHMgdXBkYXRlZC4KICAgICAgICAgICAgIGZpbmFsIFNob3J0Y3V0SW5mbyB1cGRhdGVkID0gbWFrZVNob3J0Y3V0QnVpbGRlcigiczEiKQogICAgICAgICAgICAgICAgICAgICAuc2V0U2hvcnRMYWJlbCgieHh4IikKQEAgLTg2OCwxOCArODY4LDE4IEBACiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkRHluYW1pY1Nob3J0Y3V0c193YXNQaW5uZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gQ3JlYXRlIHMxIGFzIGEgZmxvYXRpbmcgcGlubmVkIHNob3J0Y3V0LgotICAgICAgICBydW5XaXRoQ2FsbGVyKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IHsKKyAgICAgICAgcnVuV2l0aENhbGxlcldpdGhTdHJpY3RNb2RlKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IHsKICAgICAgICAgICAgIGFzc2VydFRydWUoZ2V0TWFuYWdlcigpLnNldER5bmFtaWNTaG9ydGN1dHMobGlzdCgKICAgICAgICAgICAgICAgICAgICAgbWFrZVNob3J0Y3V0KCJzMSIpKSkpOwogICAgICAgICB9KTsKIAogICAgICAgICBzZXREZWZhdWx0TGF1bmNoZXIoZ2V0SW5zdHJ1bWVudGF0aW9uKCksIG1MYXVuY2hlckNvbnRleHQxKTsKIAotICAgICAgICBydW5XaXRoQ2FsbGVyKG1MYXVuY2hlckNvbnRleHQxLCAoKSAtPiB7CisgICAgICAgIHJ1bldpdGhDYWxsZXJXaXRoU3RyaWN0TW9kZShtTGF1bmNoZXJDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgZ2V0TGF1bmNoZXJBcHBzKCkucGluU2hvcnRjdXRzKG1QYWNrYWdlQ29udGV4dDEuZ2V0UGFja2FnZU5hbWUoKSwKICAgICAgICAgICAgICAgICAgICAgbGlzdCgiczEiKSwgZ2V0VXNlckhhbmRsZSgpKTsKICAgICAgICAgfSk7Ci0gICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgZ2V0TWFuYWdlcigpLnJlbW92ZUR5bmFtaWNTaG9ydGN1dHMobGlzdCgiczEiKSk7CiAKICAgICAgICAgICAgIGFzc2VydFdpdGgoZ2V0TWFuYWdlcigpLmdldER5bmFtaWNTaG9ydGN1dHMoKSkKQEAgLTg5MywxMyArODkzLDEzIEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNob3J0Y3V0KCkgewotICAgICAgICBydW5XaXRoQ2FsbGVyKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IHsKKyAgICAgICAgcnVuV2l0aENhbGxlcldpdGhTdHJpY3RNb2RlKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IHsKICAgICAgICAgICAgIGFzc2VydFRydWUoZ2V0TWFuYWdlcigpLnNldER5bmFtaWNTaG9ydGN1dHMobGlzdCgKICAgICAgICAgICAgICAgICAgICAgbWFrZVNob3J0Y3V0KCJzMSIsICIxYSIpLAogICAgICAgICAgICAgICAgICAgICBtYWtlU2hvcnRjdXQoInMyIiwgIjJhIiksCiAgICAgICAgICAgICAgICAgICAgIG1ha2VTaG9ydGN1dCgiczMiLCAiM2EiKSkpKTsKICAgICAgICAgfSk7Ci0gICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MiwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobVBhY2thZ2VDb250ZXh0MiwgKCkgLT4gewogICAgICAgICAgICAgYXNzZXJ0VHJ1ZShnZXRNYW5hZ2VyKCkuc2V0RHluYW1pY1Nob3J0Y3V0cyhsaXN0KAogICAgICAgICAgICAgICAgICAgICBtYWtlU2hvcnRjdXQoInMxIiwgIjFiIiksCiAgICAgICAgICAgICAgICAgICAgIG1ha2VTaG9ydGN1dCgiczIiLCAiMmIiKSwKQEAgLTkwOCwyMSArOTA4LDIxIEBACiAKICAgICAgICAgc2V0RGVmYXVsdExhdW5jaGVyKGdldEluc3RydW1lbnRhdGlvbigpLCBtTGF1bmNoZXJDb250ZXh0MSk7CiAKLSAgICAgICAgcnVuV2l0aENhbGxlcihtTGF1bmNoZXJDb250ZXh0MSwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobUxhdW5jaGVyQ29udGV4dDEsICgpIC0+IHsKICAgICAgICAgICAgIGdldExhdW5jaGVyQXBwcygpLnBpblNob3J0Y3V0cyhtUGFja2FnZUNvbnRleHQxLmdldFBhY2thZ2VOYW1lKCksCiAgICAgICAgICAgICAgICAgICAgIGxpc3QoInMyIiwgInMzIiksIGdldFVzZXJIYW5kbGUoKSk7CiAgICAgICAgICAgICBnZXRMYXVuY2hlckFwcHMoKS5waW5TaG9ydGN1dHMobVBhY2thZ2VDb250ZXh0Mi5nZXRQYWNrYWdlTmFtZSgpLAogICAgICAgICAgICAgICAgICAgICBsaXN0KCJzMSIsICJzMiIpLCBnZXRVc2VySGFuZGxlKCkpOwogICAgICAgICB9KTsKLSAgICAgICAgcnVuV2l0aENhbGxlcihtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CisgICAgICAgIHJ1bldpdGhDYWxsZXJXaXRoU3RyaWN0TW9kZShtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CiAgICAgICAgICAgICBnZXRNYW5hZ2VyKCkucmVtb3ZlRHluYW1pY1Nob3J0Y3V0cyhsaXN0KCJzMyIpKTsKICAgICAgICAgfSk7Ci0gICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MiwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobVBhY2thZ2VDb250ZXh0MiwgKCkgLT4gewogICAgICAgICAgICAgZ2V0TWFuYWdlcigpLnJlbW92ZUR5bmFtaWNTaG9ydGN1dHMobGlzdCgiczEiKSk7CiAgICAgICAgIH0pOwogCiAgICAgICAgIC8vIENoZWNrIHRoZSBjdXJyZW50IHN0YXR1cy4KLSAgICAgICAgcnVuV2l0aENhbGxlcihtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CisgICAgICAgIHJ1bldpdGhDYWxsZXJXaXRoU3RyaWN0TW9kZShtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CiAgICAgICAgICAgICBhc3NlcnRXaXRoKGdldE1hbmFnZXIoKS5nZXREeW5hbWljU2hvcnRjdXRzKCkpCiAgICAgICAgICAgICAgICAgICAgIC5hcmVBbGxFbmFibGVkKCkKICAgICAgICAgICAgICAgICAgICAgLmFyZUFsbER5bmFtaWMoKQpAQCAtOTQ4LDcgKzk0OCw3IEBACiAgICAgICAgICAgICBhc3NlcnRXaXRoKGdldE1hbmFnZXIoKS5nZXRNYW5pZmVzdFNob3J0Y3V0cygpKQogICAgICAgICAgICAgICAgICAgICAuaXNFbXB0eSgpOwogICAgICAgICB9KTsKLSAgICAgICAgcnVuV2l0aENhbGxlcihtUGFja2FnZUNvbnRleHQyLCAoKSAtPiB7CisgICAgICAgIHJ1bldpdGhDYWxsZXJXaXRoU3RyaWN0TW9kZShtUGFja2FnZUNvbnRleHQyLCAoKSAtPiB7CiAgICAgICAgICAgICBhc3NlcnRXaXRoKGdldE1hbmFnZXIoKS5nZXREeW5hbWljU2hvcnRjdXRzKCkpCiAgICAgICAgICAgICAgICAgICAgIC5hcmVBbGxFbmFibGVkKCkKICAgICAgICAgICAgICAgICAgICAgLmFyZUFsbER5bmFtaWMoKQpAQCAtOTc2LDIxICs5NzYsMjEgQEAKICAgICAgICAgfSk7CiAKICAgICAgICAgLy8gZmluYWxseSwgY2FsbCB1cGRhdGUuCi0gICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgYXNzZXJ0VHJ1ZShnZXRNYW5hZ2VyKCkudXBkYXRlU2hvcnRjdXRzKGxpc3QoCiAgICAgICAgICAgICAgICAgICAgIG1ha2VTaG9ydGN1dCgiczEiLCAidXBkMWEiKSwKICAgICAgICAgICAgICAgICAgICAgbWFrZVNob3J0Y3V0KCJzMiIsICJ1cGQyYSIpLAogICAgICAgICAgICAgICAgICAgICBtYWtlU2hvcnRjdXQoInh4eCIpIC8vIGRvZW4ndCBleGlzdCAtPiBpZ25vcmVkLgogICAgICAgICAgICAgICAgICAgICApKSk7CiAgICAgICAgIH0pOwotICAgICAgICBydW5XaXRoQ2FsbGVyKG1QYWNrYWdlQ29udGV4dDIsICgpIC0+IHsKKyAgICAgICAgcnVuV2l0aENhbGxlcldpdGhTdHJpY3RNb2RlKG1QYWNrYWdlQ29udGV4dDIsICgpIC0+IHsKICAgICAgICAgICAgIGFzc2VydFRydWUoZ2V0TWFuYWdlcigpLnVwZGF0ZVNob3J0Y3V0cyhsaXN0KAogICAgICAgICAgICAgICAgICAgICBtYWtlU2hvcnRjdXQoInMxIiwgInVwZDFiIiksCiAgICAgICAgICAgICAgICAgICAgIG1ha2VTaG9ydGN1dCgiczIiLCAidXBkMmIiKSkpKTsKICAgICAgICAgfSk7CiAKICAgICAgICAgLy8gY2hlY2suCi0gICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgYXNzZXJ0V2l0aChnZXRNYW5hZ2VyKCkuZ2V0RHluYW1pY1Nob3J0Y3V0cygpKQogICAgICAgICAgICAgICAgICAgICAuYXJlQWxsRW5hYmxlZCgpCiAgICAgICAgICAgICAgICAgICAgIC5hcmVBbGxEeW5hbWljKCkKQEAgLTEwMTYsNyArMTAxNiw3IEBACiAgICAgICAgICAgICBhc3NlcnRXaXRoKGdldE1hbmFnZXIoKS5nZXRNYW5pZmVzdFNob3J0Y3V0cygpKQogICAgICAgICAgICAgICAgICAgICAuaXNFbXB0eSgpOwogICAgICAgICB9KTsKLSAgICAgICAgcnVuV2l0aENhbGxlcihtUGFja2FnZUNvbnRleHQyLCAoKSAtPiB7CisgICAgICAgIHJ1bldpdGhDYWxsZXJXaXRoU3RyaWN0TW9kZShtUGFja2FnZUNvbnRleHQyLCAoKSAtPiB7CiAgICAgICAgICAgICBhc3NlcnRXaXRoKGdldE1hbmFnZXIoKS5nZXREeW5hbWljU2hvcnRjdXRzKCkpCiAgICAgICAgICAgICAgICAgICAgIC5hcmVBbGxFbmFibGVkKCkKICAgICAgICAgICAgICAgICAgICAgLmFyZUFsbER5bmFtaWMoKQpAQCAtMTA1Miw3ICsxMDUyLDcgQEAKICAgICAgICAgZmluYWwgSWNvbiBpY29uMyA9IGxvYWRQYWNrYWdlRHJhd2FibGVJY29uKG1QYWNrYWdlQ29udGV4dDEsICJibGFja182NHgxNiIpOwogICAgICAgICBmaW5hbCBJY29uIGljb240ID0gbG9hZFBhY2thZ2VEcmF3YWJsZUljb24obVBhY2thZ2VDb250ZXh0MSwgImJsYWNrXzY0eDY0Iik7CiAKLSAgICAgICAgcnVuV2l0aENhbGxlcihtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CisgICAgICAgIHJ1bldpdGhDYWxsZXJXaXRoU3RyaWN0TW9kZShtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CiAgICAgICAgICAgICBmaW5hbCBTaG9ydGN1dEluZm8gc291cmNlID0gbWFrZVNob3J0Y3V0QnVpbGRlcigiczEiKQogICAgICAgICAgICAgICAgICAgICAuc2V0U2hvcnRMYWJlbCgic2hvcnRsYWJlbCIpCiAgICAgICAgICAgICAgICAgICAgIC5zZXRMb25nTGFiZWwoImxvbmdsYWJlbCIpCkBAIC0xMDgzLDcgKzEwODMsNyBAQAogICAgICAgICAgICAgICAgICAgICBpY29uMSk7CiAgICAgICAgIH0pOwogCi0gICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgLy8gTm8gZmllbGRzIHVwZGF0ZWQuCiAgICAgICAgICAgICBmaW5hbCBTaG9ydGN1dEluZm8gdXBkYXRlZCA9IG1ha2VTaG9ydGN1dEJ1aWxkZXIoInMxIikKICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CkBAIC0xMTA3LDcgKzExMDcsNyBAQAogICAgICAgICAgICAgICAgICAgICBpY29uMSk7CiAgICAgICAgIH0pOwogCi0gICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgZmluYWwgU2hvcnRjdXRJbmZvIHVwZGF0ZWQgPSBtYWtlU2hvcnRjdXRCdWlsZGVyKCJzMSIpCiAgICAgICAgICAgICAgICAgICAgIC5zZXRTaG9ydExhYmVsKCJ4IikKICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CkBAIC0xMTMxLDcgKzExMzEsNyBAQAogICAgICAgICAgICAgICAgICAgICBpY29uMSk7CiAgICAgICAgIH0pOwogCi0gICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgZmluYWwgU2hvcnRjdXRJbmZvIHVwZGF0ZWQgPSBtYWtlU2hvcnRjdXRCdWlsZGVyKCJzMSIpCiAgICAgICAgICAgICAgICAgICAgIC5zZXRMb25nTGFiZWwoInkiKQogICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKQEAgLTExNTUsNyArMTE1NSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGljb24xKTsKICAgICAgICAgfSk7CiAKLSAgICAgICAgcnVuV2l0aENhbGxlcihtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CisgICAgICAgIHJ1bldpdGhDYWxsZXJXaXRoU3RyaWN0TW9kZShtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CiAgICAgICAgICAgICBmaW5hbCBTaG9ydGN1dEluZm8gdXBkYXRlZCA9IG1ha2VTaG9ydGN1dEJ1aWxkZXIoInMxIikKICAgICAgICAgICAgICAgICAgICAgLnNldEFjdGl2aXR5KGdldEFjdGl2aXR5KCJMYXVuY2hlcjIiKSkKICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CkBAIC0xMTc5LDcgKzExNzksNyBAQAogICAgICAgICAgICAgICAgICAgICBpY29uMSk7CiAgICAgICAgIH0pOwogCi0gICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgZmluYWwgU2hvcnRjdXRJbmZvIHVwZGF0ZWQgPSBtYWtlU2hvcnRjdXRCdWlsZGVyKCJzMSIpCiAgICAgICAgICAgICAgICAgICAgIC5zZXREaXNhYmxlZE1lc3NhZ2UoInoiKQogICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKQEAgLTEyMDMsNyArMTIwMyw3IEBACiAgICAgICAgICAgICAgICAgICAgIGljb24xKTsKICAgICAgICAgfSk7CiAKLSAgICAgICAgcnVuV2l0aENhbGxlcihtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CisgICAgICAgIHJ1bldpdGhDYWxsZXJXaXRoU3RyaWN0TW9kZShtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CiAgICAgICAgICAgICBmaW5hbCBTaG9ydGN1dEluZm8gdXBkYXRlZCA9IG1ha2VTaG9ydGN1dEJ1aWxkZXIoInMxIikKICAgICAgICAgICAgICAgICAgICAgLnNldEludGVudHMobmV3IEludGVudFtde25ldyBJbnRlbnQoIm1haW4iKX0pCiAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwpAQCAtMTIyNyw3ICsxMjI3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWNvbjEpOwogICAgICAgICB9KTsKIAotICAgICAgICBydW5XaXRoQ2FsbGVyKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IHsKKyAgICAgICAgcnVuV2l0aENhbGxlcldpdGhTdHJpY3RNb2RlKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IHsKICAgICAgICAgICAgIGZpbmFsIFNob3J0Y3V0SW5mbyB1cGRhdGVkID0gbWFrZVNob3J0Y3V0QnVpbGRlcigiczEiKQogICAgICAgICAgICAgICAgICAgICAuc2V0RXh0cmFzKG1ha2VQZXJzaXN0YWJsZUJ1bmRsZSgiZWsxIiwgIlgiKSkKICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CkBAIC0xMjUxLDcgKzEyNTEsNyBAQAogICAgICAgICAgICAgICAgICAgICBpY29uMSk7CiAgICAgICAgIH0pOwogCi0gICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgZmluYWwgU2hvcnRjdXRJbmZvIHVwZGF0ZWQgPSBtYWtlU2hvcnRjdXRCdWlsZGVyKCJzMSIpCiAgICAgICAgICAgICAgICAgICAgIC5zZXRDYXRlZ29yaWVzKHNldCgiZG9nIikpCiAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwpAQCAtMTI3NSw3ICsxMjc1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWNvbjEpOwogICAgICAgICB9KTsKIAotICAgICAgICBydW5XaXRoQ2FsbGVyKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IHsKKyAgICAgICAgcnVuV2l0aENhbGxlcldpdGhTdHJpY3RNb2RlKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IHsKICAgICAgICAgICAgIGZpbmFsIFNob3J0Y3V0SW5mbyB1cGRhdGVkID0gbWFrZVNob3J0Y3V0QnVpbGRlcigiczEiKQogICAgICAgICAgICAgICAgICAgICAuc2V0SWNvbihpY29uMikKICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CkBAIC0xMzAwLDcgKzEzMDAsNyBAQAogICAgICAgICB9KTsKIAogICAgICAgICAvLyBNb3JlIHBhcmFub2lkIHRlc3RzIHdpdGggaWNvbnMuCi0gICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgZmluYWwgU2hvcnRjdXRJbmZvIHVwZGF0ZWQgPSBtYWtlU2hvcnRjdXRCdWlsZGVyKCJzMSIpCiAgICAgICAgICAgICAgICAgICAgIC5zZXRJY29uKGljb24xKQogICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKQEAgLTEzMTIsNyArMTMxMiw3IEBACiAgICAgICAgIH0pOwogCiAgICAgICAgIC8vIE1vcmUgcGFyYW5vaWQgdGVzdHMgd2l0aCBpY29ucy4KLSAgICAgICAgcnVuV2l0aENhbGxlcihtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CisgICAgICAgIHJ1bldpdGhDYWxsZXJXaXRoU3RyaWN0TW9kZShtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CiAgICAgICAgICAgICBmaW5hbCBTaG9ydGN1dEluZm8gdXBkYXRlZCA9IG1ha2VTaG9ydGN1dEJ1aWxkZXIoInMxIikKICAgICAgICAgICAgICAgICAgICAgLnNldEljb24oaWNvbjMpCiAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwpAQCAtMTMyMyw3ICsxMzIzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWNvbjMpOwogICAgICAgICB9KTsKIAotICAgICAgICBydW5XaXRoQ2FsbGVyKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IHsKKyAgICAgICAgcnVuV2l0aENhbGxlcldpdGhTdHJpY3RNb2RlKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IHsKICAgICAgICAgICAgIGZpbmFsIFNob3J0Y3V0SW5mbyB1cGRhdGVkID0gbWFrZVNob3J0Y3V0QnVpbGRlcigiczEiKQogICAgICAgICAgICAgICAgICAgICAuc2V0SWNvbihpY29uNCkKICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CkBAIC0xMzM0LDcgKzEzMzQsNyBAQAogICAgICAgICAgICAgICAgICAgICBpY29uNCk7CiAgICAgICAgIH0pOwogCi0gICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgZmluYWwgU2hvcnRjdXRJbmZvIHVwZGF0ZWQgPSBtYWtlU2hvcnRjdXRCdWlsZGVyKCJzMSIpCiAgICAgICAgICAgICAgICAgICAgIC5zZXRJY29uKGljb24xKQogICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKQEAgLTEzNTcsMTMgKzEzNTcsMTMgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzYWJsZUFuZEVuYWJsZVNob3J0Y3V0KCkgewotICAgICAgICBydW5XaXRoQ2FsbGVyKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IHsKKyAgICAgICAgcnVuV2l0aENhbGxlcldpdGhTdHJpY3RNb2RlKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IHsKICAgICAgICAgICAgIGFzc2VydFRydWUoZ2V0TWFuYWdlcigpLnNldER5bmFtaWNTaG9ydGN1dHMobGlzdCgKICAgICAgICAgICAgICAgICAgICAgbWFrZVNob3J0Y3V0KCJzMSIsICIxYSIpLAogICAgICAgICAgICAgICAgICAgICBtYWtlU2hvcnRjdXQoInMyIiwgIjJhIiksCiAgICAgICAgICAgICAgICAgICAgIG1ha2VTaG9ydGN1dCgiczMiLCAiM2EiKSkpKTsKICAgICAgICAgfSk7Ci0gICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MiwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobVBhY2thZ2VDb250ZXh0MiwgKCkgLT4gewogICAgICAgICAgICAgYXNzZXJ0VHJ1ZShnZXRNYW5hZ2VyKCkuc2V0RHluYW1pY1Nob3J0Y3V0cyhsaXN0KAogICAgICAgICAgICAgICAgICAgICBtYWtlU2hvcnRjdXQoInMxIiwgIjFiIiksCiAgICAgICAgICAgICAgICAgICAgIG1ha2VTaG9ydGN1dCgiczIiLCAiMmIiKSwKQEAgLTEzNzIsMjEgKzEzNzIsMjEgQEAKIAogICAgICAgICBzZXREZWZhdWx0TGF1bmNoZXIoZ2V0SW5zdHJ1bWVudGF0aW9uKCksIG1MYXVuY2hlckNvbnRleHQxKTsKIAotICAgICAgICBydW5XaXRoQ2FsbGVyKG1MYXVuY2hlckNvbnRleHQxLCAoKSAtPiB7CisgICAgICAgIHJ1bldpdGhDYWxsZXJXaXRoU3RyaWN0TW9kZShtTGF1bmNoZXJDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgZ2V0TGF1bmNoZXJBcHBzKCkucGluU2hvcnRjdXRzKG1QYWNrYWdlQ29udGV4dDEuZ2V0UGFja2FnZU5hbWUoKSwKICAgICAgICAgICAgICAgICAgICAgbGlzdCgiczIiLCAiczMiKSwgZ2V0VXNlckhhbmRsZSgpKTsKICAgICAgICAgICAgIGdldExhdW5jaGVyQXBwcygpLnBpblNob3J0Y3V0cyhtUGFja2FnZUNvbnRleHQyLmdldFBhY2thZ2VOYW1lKCksCiAgICAgICAgICAgICAgICAgICAgIGxpc3QoInMxIiwgInMyIiksIGdldFVzZXJIYW5kbGUoKSk7CiAgICAgICAgIH0pOwotICAgICAgICBydW5XaXRoQ2FsbGVyKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IHsKKyAgICAgICAgcnVuV2l0aENhbGxlcldpdGhTdHJpY3RNb2RlKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IHsKICAgICAgICAgICAgIGdldE1hbmFnZXIoKS5yZW1vdmVEeW5hbWljU2hvcnRjdXRzKGxpc3QoInMzIikpOwogICAgICAgICB9KTsKLSAgICAgICAgcnVuV2l0aENhbGxlcihtUGFja2FnZUNvbnRleHQyLCAoKSAtPiB7CisgICAgICAgIHJ1bldpdGhDYWxsZXJXaXRoU3RyaWN0TW9kZShtUGFja2FnZUNvbnRleHQyLCAoKSAtPiB7CiAgICAgICAgICAgICBnZXRNYW5hZ2VyKCkucmVtb3ZlRHluYW1pY1Nob3J0Y3V0cyhsaXN0KCJzMSIpKTsKICAgICAgICAgfSk7CiAKICAgICAgICAgLy8gQ2hlY2sgdGhlIGN1cnJlbnQgc3RhdHVzLgotICAgICAgICBydW5XaXRoQ2FsbGVyKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IHsKKyAgICAgICAgcnVuV2l0aENhbGxlcldpdGhTdHJpY3RNb2RlKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IHsKICAgICAgICAgICAgIGFzc2VydFdpdGgoZ2V0TWFuYWdlcigpLmdldER5bmFtaWNTaG9ydGN1dHMoKSkKICAgICAgICAgICAgICAgICAgICAgLmFyZUFsbEVuYWJsZWQoKQogICAgICAgICAgICAgICAgICAgICAuYXJlQWxsRHluYW1pYygpCkBAIC0xNDEyLDcgKzE0MTIsNyBAQAogICAgICAgICAgICAgYXNzZXJ0V2l0aChnZXRNYW5hZ2VyKCkuZ2V0TWFuaWZlc3RTaG9ydGN1dHMoKSkKICAgICAgICAgICAgICAgICAgICAgLmlzRW1wdHkoKTsKICAgICAgICAgfSk7Ci0gICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MiwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobVBhY2thZ2VDb250ZXh0MiwgKCkgLT4gewogICAgICAgICAgICAgYXNzZXJ0V2l0aChnZXRNYW5hZ2VyKCkuZ2V0RHluYW1pY1Nob3J0Y3V0cygpKQogICAgICAgICAgICAgICAgICAgICAuYXJlQWxsRW5hYmxlZCgpCiAgICAgICAgICAgICAgICAgICAgIC5hcmVBbGxEeW5hbWljKCkKQEAgLTE0NDAsMTUgKzE0NDAsMTUgQEAKICAgICAgICAgfSk7CiAKICAgICAgICAgLy8gZmluYWxseSwgY2FsbCBkaXNhYmxlLgotICAgICAgICBydW5XaXRoQ2FsbGVyKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IHsKKyAgICAgICAgcnVuV2l0aENhbGxlcldpdGhTdHJpY3RNb2RlKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IHsKICAgICAgICAgICAgIGdldE1hbmFnZXIoKS5kaXNhYmxlU2hvcnRjdXRzKGxpc3QoInMxIiwgInMzIikpOwogICAgICAgICB9KTsKLSAgICAgICAgcnVuV2l0aENhbGxlcihtUGFja2FnZUNvbnRleHQyLCAoKSAtPiB7CisgICAgICAgIHJ1bldpdGhDYWxsZXJXaXRoU3RyaWN0TW9kZShtUGFja2FnZUNvbnRleHQyLCAoKSAtPiB7CiAgICAgICAgICAgICBnZXRNYW5hZ2VyKCkuZGlzYWJsZVNob3J0Y3V0cyhsaXN0KCJzMSIsICJzMiIpLCAiY3VzdG9tIG1lc3NhZ2UiKTsKICAgICAgICAgfSk7CiAKICAgICAgICAgLy8gY2hlY2sKLSAgICAgICAgcnVuV2l0aENhbGxlcihtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CisgICAgICAgIHJ1bldpdGhDYWxsZXJXaXRoU3RyaWN0TW9kZShtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CiAgICAgICAgICAgICBhc3NlcnRXaXRoKGdldE1hbmFnZXIoKS5nZXREeW5hbWljU2hvcnRjdXRzKCkpCiAgICAgICAgICAgICAgICAgICAgIC5hcmVBbGxFbmFibGVkKCkKICAgICAgICAgICAgICAgICAgICAgLmFyZUFsbER5bmFtaWMoKQpAQCAtMTQ3NCw3ICsxNDc0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgLmlzRW1wdHkoKTsKICAgICAgICAgfSk7CiAKLSAgICAgICAgcnVuV2l0aENhbGxlcihtUGFja2FnZUNvbnRleHQyLCAoKSAtPiB7CisgICAgICAgIHJ1bldpdGhDYWxsZXJXaXRoU3RyaWN0TW9kZShtUGFja2FnZUNvbnRleHQyLCAoKSAtPiB7CiAgICAgICAgICAgICBhc3NlcnRXaXRoKGdldE1hbmFnZXIoKS5nZXREeW5hbWljU2hvcnRjdXRzKCkpCiAgICAgICAgICAgICAgICAgICAgIC5hcmVBbGxFbmFibGVkKCkKICAgICAgICAgICAgICAgICAgICAgLmFyZUFsbER5bmFtaWMoKQpAQCAtMTUwMSwxMCArMTUwMSwxMCBAQAogICAgICAgICB9KTsKIAogICAgICAgICAvLyB0cnkgcmUtZW5hYmxlCi0gICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgZ2V0TWFuYWdlcigpLmVuYWJsZVNob3J0Y3V0cyhsaXN0KCJzMyIpKTsKICAgICAgICAgfSk7Ci0gICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgYXNzZXJ0V2l0aChnZXRNYW5hZ2VyKCkuZ2V0RHluYW1pY1Nob3J0Y3V0cygpKQogICAgICAgICAgICAgICAgICAgICAuYXJlQWxsRW5hYmxlZCgpCiAgICAgICAgICAgICAgICAgICAgIC5hcmVBbGxEeW5hbWljKCkKQEAgLTE1MjksMTEgKzE1MjksMTEgQEAKICAgICAgICAgfSk7CiAKICAgICAgICAgLy8gUmUtcHVibGlzaCB3aWxsIGltcGxpY2l0bHkgcmUtZW5hYmxlLgotICAgICAgICBydW5XaXRoQ2FsbGVyKG1QYWNrYWdlQ29udGV4dDIsICgpIC0+IHsKKyAgICAgICAgcnVuV2l0aENhbGxlcldpdGhTdHJpY3RNb2RlKG1QYWNrYWdlQ29udGV4dDIsICgpIC0+IHsKICAgICAgICAgICAgIGdldE1hbmFnZXIoKS5hZGREeW5hbWljU2hvcnRjdXRzKGxpc3QobWFrZVNob3J0Y3V0KCJzMiIsICJyZS1wdWJsaXNoZWQiKSkpOwogICAgICAgICB9KTsKIAotICAgICAgICBydW5XaXRoQ2FsbGVyKG1QYWNrYWdlQ29udGV4dDIsICgpIC0+IHsKKyAgICAgICAgcnVuV2l0aENhbGxlcldpdGhTdHJpY3RNb2RlKG1QYWNrYWdlQ29udGV4dDIsICgpIC0+IHsKICAgICAgICAgICAgIGFzc2VydFdpdGgoZ2V0TWFuYWdlcigpLmdldER5bmFtaWNTaG9ydGN1dHMoKSkKICAgICAgICAgICAgICAgICAgICAgLmFyZUFsbEVuYWJsZWQoKQogICAgICAgICAgICAgICAgICAgICAuYXJlQWxsRHluYW1pYygpCkBAIC0xNTU1LDcgKzE1NTUsNyBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RJbW11dGFibGVTaG9ydGN1dHMoKSB7Ci0gICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgZW5hYmxlTWFuaWZlc3RBY3Rpdml0eSgiTGF1bmNoZXJfbWFuaWZlc3RfMiIsIHRydWUpOwogCiAgICAgICAgICAgICByZXRyeVVudGlsKCgpIC0+IGdldE1hbmFnZXIoKS5nZXRNYW5pZmVzdFNob3J0Y3V0cygpLnNpemUoKSA9PSAyLApAQCAtMTU2MywxMSArMTU2MywxMSBAQAogICAgICAgICB9KTsKICAgICAgICAgc2V0RGVmYXVsdExhdW5jaGVyKGdldEluc3RydW1lbnRhdGlvbigpLCBtTGF1bmNoZXJDb250ZXh0MSk7CiAKLSAgICAgICAgcnVuV2l0aENhbGxlcihtTGF1bmNoZXJDb250ZXh0MSwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobUxhdW5jaGVyQ29udGV4dDEsICgpIC0+IHsKICAgICAgICAgICAgIGdldExhdW5jaGVyQXBwcygpLnBpblNob3J0Y3V0cyhtUGFja2FnZUNvbnRleHQxLmdldFBhY2thZ2VOYW1lKCksCiAgICAgICAgICAgICAgICAgICAgIGxpc3QoIm1zMjEiKSwgZ2V0VXNlckhhbmRsZSgpKTsKICAgICAgICAgfSk7Ci0gICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgZW5hYmxlTWFuaWZlc3RBY3Rpdml0eSgiTGF1bmNoZXJfbWFuaWZlc3RfMSIsIHRydWUpOwogICAgICAgICAgICAgZW5hYmxlTWFuaWZlc3RBY3Rpdml0eSgiTGF1bmNoZXJfbWFuaWZlc3RfMiIsIGZhbHNlKTsKIApAQCAtMTU3NSw3ICsxNTc1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgIk1hbmlmZXN0IHNob3J0Y3V0cyBkaWRuJ3Qgc2hvdyB1cCIpOwogICAgICAgICB9KTsKICAgICAgICAgc2V0RGVmYXVsdExhdW5jaGVyKGdldEluc3RydW1lbnRhdGlvbigpLCBtTGF1bmNoZXJDb250ZXh0MSk7Ci0gICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgYXNzZXJ0V2l0aChnZXRNYW5hZ2VyKCkuZ2V0RHluYW1pY1Nob3J0Y3V0cygpKQogICAgICAgICAgICAgICAgICAgICAuaXNFbXB0eSgpOwogICAgICAgICAgICAgYXNzZXJ0V2l0aChnZXRNYW5hZ2VyKCkuZ2V0UGlubmVkU2hvcnRjdXRzKCkpCkBAIC0xNjE1LDcgKzE2MTUsNyBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RNYW5pZmVzdERlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgSWNvbiBpY29uTXMyMSA9IGxvYWRQYWNrYWdlRHJhd2FibGVJY29uKG1QYWNrYWdlQ29udGV4dDEsICJibGFja18xNngxNiIpOwogCi0gICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgZW5hYmxlTWFuaWZlc3RBY3Rpdml0eSgiTGF1bmNoZXJfbWFuaWZlc3RfMiIsIHRydWUpOwogCiAgICAgICAgICAgICByZXRyeVVudGlsKCgpIC0+IGdldE1hbmFnZXIoKS5nZXRNYW5pZmVzdFNob3J0Y3V0cygpLnNpemUoKSA+IDAsCkBAIC0xNjkyLDcgKzE2OTIsNyBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3REeW5hbWljSW50ZW50cygpIHsKLSAgICAgICAgcnVuV2l0aENhbGxlcihtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CisgICAgICAgIHJ1bldpdGhDYWxsZXJXaXRoU3RyaWN0TW9kZShtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CiAKICAgICAgICAgICAgIGZpbmFsIFNob3J0Y3V0SW5mbyBzMSA9IG1ha2VTaG9ydGN1dEJ1aWxkZXIoInMxIikKICAgICAgICAgICAgICAgICAgICAgLnNldFNob3J0TGFiZWwoInNob3J0bGFiZWwiKQpAQCAtMTc1OSw3ICsxNzU5LDcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0TWFuaWZlc3RXaXRoRXJyb3JzKCkgewotICAgICAgICBydW5XaXRoQ2FsbGVyKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IHsKKyAgICAgICAgcnVuV2l0aENhbGxlcldpdGhTdHJpY3RNb2RlKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IHsKICAgICAgICAgICAgIGVuYWJsZU1hbmlmZXN0QWN0aXZpdHkoIkxhdW5jaGVyX21hbmlmZXN0X2Vycm9yXzEiLCB0cnVlKTsKICAgICAgICAgICAgIGVuYWJsZU1hbmlmZXN0QWN0aXZpdHkoIkxhdW5jaGVyX21hbmlmZXN0X2Vycm9yXzIiLCB0cnVlKTsKICAgICAgICAgICAgIGVuYWJsZU1hbmlmZXN0QWN0aXZpdHkoIkxhdW5jaGVyX21hbmlmZXN0X2Vycm9yXzMiLCB0cnVlKTsKQEAgLTE3NzcsNyArMTc3Nyw3IEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdE1hbmlmZXN0RGlzYWJsZWQoKSB7Ci0gICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgZW5hYmxlTWFuaWZlc3RBY3Rpdml0eSgiTGF1bmNoZXJfbWFuaWZlc3RfNGEiLCB0cnVlKTsKIAogICAgICAgICAgICAgcmV0cnlVbnRpbCgoKSAtPiBnZXRNYW5hZ2VyKCkuZ2V0TWFuaWZlc3RTaG9ydGN1dHMoKS5zaXplKCkgPiAwLApAQCAtMTc5MSwxMSArMTc5MSwxMSBAQAogICAgICAgICB9KTsKICAgICAgICAgc2V0RGVmYXVsdExhdW5jaGVyKGdldEluc3RydW1lbnRhdGlvbigpLCBtTGF1bmNoZXJDb250ZXh0MSk7CiAKLSAgICAgICAgcnVuV2l0aENhbGxlcihtTGF1bmNoZXJDb250ZXh0MSwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobUxhdW5jaGVyQ29udGV4dDEsICgpIC0+IHsKICAgICAgICAgICAgIGdldExhdW5jaGVyQXBwcygpLnBpblNob3J0Y3V0cyhtUGFja2FnZUNvbnRleHQxLmdldFBhY2thZ2VOYW1lKCksCiAgICAgICAgICAgICAgICAgICAgIGxpc3QoIm1zNDEiLCAibXM0MiIpLCBnZXRVc2VySGFuZGxlKCkpOwogICAgICAgICB9KTsKLSAgICAgICAgcnVuV2l0aENhbGxlcihtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CisgICAgICAgIHJ1bldpdGhDYWxsZXJXaXRoU3RyaWN0TW9kZShtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CiAgICAgICAgICAgICBlbmFibGVNYW5pZmVzdEFjdGl2aXR5KCJMYXVuY2hlcl9tYW5pZmVzdF80YiIsIHRydWUpOwogICAgICAgICAgICAgZW5hYmxlTWFuaWZlc3RBY3Rpdml0eSgiTGF1bmNoZXJfbWFuaWZlc3RfNGEiLCBmYWxzZSk7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3Nob3J0Y3V0bWFuYWdlci9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9zaG9ydGN1dG1hbmFnZXIvU2hvcnRjdXRNYW5hZ2VyQ29uZmlnQWN0aXZpdHlUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9zaG9ydGN1dG1hbmFnZXIvc3JjL2FuZHJvaWQvY29udGVudC9wbS9jdHMvc2hvcnRjdXRtYW5hZ2VyL1Nob3J0Y3V0TWFuYWdlckNvbmZpZ0FjdGl2aXR5VGVzdC5qYXZhCmluZGV4IDA2MTRkODQuLmNjOGRmNTEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3Nob3J0Y3V0bWFuYWdlci9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9zaG9ydGN1dG1hbmFnZXIvU2hvcnRjdXRNYW5hZ2VyQ29uZmlnQWN0aXZpdHlUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvc2hvcnRjdXRtYW5hZ2VyL3NyYy9hbmRyb2lkL2NvbnRlbnQvcG0vY3RzL3Nob3J0Y3V0bWFuYWdlci9TaG9ydGN1dE1hbmFnZXJDb25maWdBY3Rpdml0eVRlc3QuamF2YQpAQCAtNDIsNyArNDIsNyBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTaG9ydGN1dENvbmZpZ0FjdGl2aXR5TGlzdCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBzZXREZWZhdWx0TGF1bmNoZXIoZ2V0SW5zdHJ1bWVudGF0aW9uKCksIG1MYXVuY2hlckNvbnRleHQxKTsKIAotICAgICAgICBydW5XaXRoQ2FsbGVyKG1MYXVuY2hlckNvbnRleHQxLCAoKSAtPiB7CisgICAgICAgIHJ1bldpdGhDYWxsZXJXaXRoU3RyaWN0TW9kZShtTGF1bmNoZXJDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChnZXRDb25maWdBY3Rpdml0eSgpKTsKICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZ2V0TGF1bmNoZXJBcHBzKCkuZ2V0U2hvcnRjdXRDb25maWdBY3Rpdml0eUludGVudChnZXRDb25maWdBY3Rpdml0eSgpKSk7CiAgICAgICAgIH0pOwpAQCAtNTAsNyArNTAsNyBAQAogICAgICAgICAvLyBHZXQgY29uZmlnIGFjdGl2aXR5IHdvcmtzIGV2ZW4gZm9yIG5vbi1kZWZhdWx0IGFjdGl2aXR5LgogICAgICAgICBzZXREZWZhdWx0TGF1bmNoZXIoZ2V0SW5zdHJ1bWVudGF0aW9uKCksIG1MYXVuY2hlckNvbnRleHQ0KTsKIAotICAgICAgICBydW5XaXRoQ2FsbGVyKG1MYXVuY2hlckNvbnRleHQxLCAoKSAtPiB7CisgICAgICAgIHJ1bldpdGhDYWxsZXJXaXRoU3RyaWN0TW9kZShtTGF1bmNoZXJDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChnZXRDb25maWdBY3Rpdml0eSgpKTsKICAgICAgICAgICAgIC8vIHRocm93cyBleGNlcHRpb24gd2hlbiBkZWZhdWx0IGxhdW5jaGVyIGlzIGRpZmZlcmVudC4KICAgICAgICAgICAgIGFzc2VydEV4cGVjdEV4Y2VwdGlvbihTZWN1cml0eUV4Y2VwdGlvbi5jbGFzcywgbnVsbCwgKCkgLT4KQEAgLTYxLDcgKzYxLDcgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29ycmVjdEludGVudFNlbmRlckNyZWF0ZWQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgc2V0RGVmYXVsdExhdW5jaGVyKGdldEluc3RydW1lbnRhdGlvbigpLCBtTGF1bmNoZXJDb250ZXh0MSk7CiAgICAgICAgIGZpbmFsIEF0b21pY1JlZmVyZW5jZTxJbnRlbnRTZW5kZXI+IHNlbmRlciA9IG5ldyBBdG9taWNSZWZlcmVuY2U8PigpOwotICAgICAgICBydW5XaXRoQ2FsbGVyKG1MYXVuY2hlckNvbnRleHQxLCAoKSAtPgorICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobUxhdW5jaGVyQ29udGV4dDEsICgpIC0+CiAgICAgICAgICAgICBzZW5kZXIuc2V0KGdldExhdW5jaGVyQXBwcygpLmdldFNob3J0Y3V0Q29uZmlnQWN0aXZpdHlJbnRlbnQoZ2V0Q29uZmlnQWN0aXZpdHkoKSkpKTsKIAogICAgICAgICBJbnN0cnVtZW50YXRpb24uQWN0aXZpdHlNb25pdG9yIG1vbml0b3IgPQpAQCAtODcsNyArODcsNyBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVTaG9ydGN1dFJlc3VsdEludGVudF9kZWZhdWx0TGF1bmNoZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgc2V0RGVmYXVsdExhdW5jaGVyKGdldEluc3RydW1lbnRhdGlvbigpLCBtTGF1bmNoZXJDb250ZXh0MSk7CiAgICAgICAgIFBpbkl0ZW1SZXF1ZXN0IHJlcXVlc3QgPSBnZXRTaG9ydGN1dFJlcXVlc3RGb3JQYWNrYWdlMSgpOwotICAgICAgICBydW5XaXRoQ2FsbGVyKG1MYXVuY2hlckNvbnRleHQxLCAoKSAtPiB7CisgICAgICAgIHJ1bldpdGhDYWxsZXJXaXRoU3RyaWN0TW9kZShtTGF1bmNoZXJDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXF1ZXN0LmlzVmFsaWQoKSk7CiAgICAgICAgICAgICBhc3NlcnRUcnVlKHJlcXVlc3QuYWNjZXB0KCkpOwogICAgICAgICB9KTsKQEAgLTk5LDcgKzk5LDcgQEAKIAogICAgICAgICBzZXREZWZhdWx0TGF1bmNoZXIoZ2V0SW5zdHJ1bWVudGF0aW9uKCksIG1MYXVuY2hlckNvbnRleHQ0KTsKICAgICAgICAgLy8gTGF1bmNoZXIxIGNhbiBzdGlsbCBhY2Nlc3MgdGhlIHJlcXVlc3QKLSAgICAgICAgcnVuV2l0aENhbGxlcihtTGF1bmNoZXJDb250ZXh0MSwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobUxhdW5jaGVyQ29udGV4dDEsICgpIC0+IHsKICAgICAgICAgICAgIGFzc2VydFRydWUocmVxdWVzdC5pc1ZhbGlkKCkpOwogICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXF1ZXN0LmFjY2VwdCgpKTsKICAgICAgICAgfSk7CkBAIC0xMTAsNyArMTEwLDcgQEAKICAgICAgICAgUGluSXRlbVJlcXVlc3QgcmVxdWVzdCA9IGdldFNob3J0Y3V0UmVxdWVzdEZvclBhY2thZ2UxKCk7CiAKICAgICAgICAgLy8gTGF1bmNoZXIxIGNhbiBzdGlsbCBhY2Nlc3MgdGhlIHJlcXVlc3QKLSAgICAgICAgcnVuV2l0aENhbGxlcihtTGF1bmNoZXJDb250ZXh0MSwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobUxhdW5jaGVyQ29udGV4dDEsICgpIC0+IHsKICAgICAgICAgICAgIGFzc2VydEZhbHNlKHJlcXVlc3QuaXNWYWxpZCgpKTsKICAgICAgICAgICAgIGFzc2VydEV4cGVjdEV4Y2VwdGlvbihTZWN1cml0eUV4Y2VwdGlvbi5jbGFzcywgbnVsbCwgcmVxdWVzdDo6YWNjZXB0KTsKICAgICAgICAgfSk7CkBAIC0xMTgsNyArMTE4LDcgQEAKIAogICAgIHByaXZhdGUgUGluSXRlbVJlcXVlc3QgZ2V0U2hvcnRjdXRSZXF1ZXN0Rm9yUGFja2FnZTEoKSB7CiAgICAgICAgIGZpbmFsIEF0b21pY1JlZmVyZW5jZTxQaW5JdGVtUmVxdWVzdD4gcmVzdWx0ID0gbmV3IEF0b21pY1JlZmVyZW5jZTw+KCk7Ci0gICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgZmluYWwgU2hvcnRjdXRJbmZvIHNob3J0Y3V0ID0gbWFrZVNob3J0Y3V0QnVpbGRlcihTSE9SVENVVF9JRCkKICAgICAgICAgICAgICAgICAgICAgLnNldFNob3J0TGFiZWwoImxhYmVsMSIpCiAgICAgICAgICAgICAgICAgICAgIC5zZXRJbnRlbnQobmV3IEludGVudChJbnRlbnQuQUNUSU9OX01BSU4pKQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2hvcnRjdXRtYW5hZ2VyL3NyYy9hbmRyb2lkL2NvbnRlbnQvcG0vY3RzL3Nob3J0Y3V0bWFuYWdlci9TaG9ydGN1dE1hbmFnZXJDdHNUZXN0c0Jhc2UuamF2YSBiL3Rlc3RzL3Rlc3RzL3Nob3J0Y3V0bWFuYWdlci9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9zaG9ydGN1dG1hbmFnZXIvU2hvcnRjdXRNYW5hZ2VyQ3RzVGVzdHNCYXNlLmphdmEKaW5kZXggMWY0NWE3Zi4uYTU5NTczMCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvc2hvcnRjdXRtYW5hZ2VyL3NyYy9hbmRyb2lkL2NvbnRlbnQvcG0vY3RzL3Nob3J0Y3V0bWFuYWdlci9TaG9ydGN1dE1hbmFnZXJDdHNUZXN0c0Jhc2UuamF2YQorKysgYi90ZXN0cy90ZXN0cy9zaG9ydGN1dG1hbmFnZXIvc3JjL2FuZHJvaWQvY29udGVudC9wbS9jdHMvc2hvcnRjdXRtYW5hZ2VyL1Nob3J0Y3V0TWFuYWdlckN0c1Rlc3RzQmFzZS5qYXZhCkBAIC0zMywxMiArMzMsMTMgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkljb247CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5QZXJzaXN0YWJsZUJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlN0cmljdE1vZGU7CitpbXBvcnQgYW5kcm9pZC5vcy5TdHJpY3RNb2RlLlRocmVhZFBvbGljeTsKIGltcG9ydCBhbmRyb2lkLm9zLlVzZXJIYW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uTm9uTnVsbDsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk5vbk51bGw7CiBpbXBvcnQgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RDYXNlOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiAKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbTsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwpAQCAtNTAsNiArNTEsMTQgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gRFVNUFNZU19JTl9URUFSRE9XTiA9IGZhbHNlOyAvLyBETyBOT1QgU1VCTUlUIFdJVEggdHJ1ZQogCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBlbmFibGUgc3RyaWN0IG1vZGUgb3Igbm90LgorICAgICAqCisgICAgICogVE9ETyBFbmFibGUgaXQgYWZ0ZXIgZml4aW5nIGIvNjgwNTE3MjguIFNvbWVob3cgdmlvbGF0aW9ucyB3b3VsZCBoYXBwZW4gb24gdGhlIGRhc2hib2FyZAorICAgICAqIG9ubHkgYW5kIGNhbid0IHJlcHJvZHVjZSBpdCBsb2NhbGx5LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gRU5BQkxFX1NUUklDVF9NT0RFID0gZmFsc2U7CisKICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTcG9vZmluZ0NvbnRleHQgZXh0ZW5kcyBDb250ZXh0V3JhcHBlciB7CiAgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1QYWNrYWdlTmFtZTsKIApAQCAtMjc2LDYgKzI4NSwzMyBAQAogICAgICAgICByZXR1cm4gbUN1cnJlbnRMYXVuY2hlckFwcHM7CiAgICAgfQogCisgICAgcHJvdGVjdGVkIHZvaWQgcnVuV2l0aFN0cmljdE1vZGUoUnVubmFibGUgcikgeworICAgICAgICBmaW5hbCBUaHJlYWRQb2xpY3kgb2xkUG9saWN5ID0gU3RyaWN0TW9kZS5nZXRUaHJlYWRQb2xpY3koKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChFTkFCTEVfU1RSSUNUX01PREUpIHsKKyAgICAgICAgICAgICAgICBTdHJpY3RNb2RlLnNldFRocmVhZFBvbGljeShuZXcgU3RyaWN0TW9kZS5UaHJlYWRQb2xpY3kuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuZGV0ZWN0QWxsKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5wZW5hbHR5RGVhdGgoKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgci5ydW4oKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIFN0cmljdE1vZGUuc2V0VGhyZWFkUG9saWN5KG9sZFBvbGljeSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBydW5XaXRoTm9TdHJpY3RNb2RlKFJ1bm5hYmxlIHIpIHsKKyAgICAgICAgZmluYWwgVGhyZWFkUG9saWN5IG9sZFBvbGljeSA9IFN0cmljdE1vZGUuZ2V0VGhyZWFkUG9saWN5KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpY3RNb2RlLnNldFRocmVhZFBvbGljeShuZXcgU3RyaWN0TW9kZS5UaHJlYWRQb2xpY3kuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgIC5wZXJtaXRBbGwoKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgICAgICAgICByLnJ1bigpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgU3RyaWN0TW9kZS5zZXRUaHJlYWRQb2xpY3kob2xkUG9saWN5KTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHByb3RlY3RlZCB2b2lkIHJ1bldpdGhDYWxsZXIoQ29udGV4dCBjYWxsZXJDb250ZXh0LCBSdW5uYWJsZSByKSB7CiAgICAgICAgIGZpbmFsIENvbnRleHQgcHJldiA9IG1DdXJyZW50Q2FsbGVyUGFja2FnZTsKIApAQCAtMjg2LDYgKzMyMiwxNCBAQAogICAgICAgICBzZXRDdXJyZW50Q2FsbGVyKHByZXYpOwogICAgIH0KIAorICAgIHByb3RlY3RlZCB2b2lkIHJ1bldpdGhDYWxsZXJXaXRoU3RyaWN0TW9kZShDb250ZXh0IGNhbGxlckNvbnRleHQsIFJ1bm5hYmxlIHIpIHsKKyAgICAgICAgcnVuV2l0aENhbGxlcihjYWxsZXJDb250ZXh0LCAoKSAtPiBydW5XaXRoU3RyaWN0TW9kZShyKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgcnVuV2l0aENhbGxlcldpdGhOb1N0cmljdE1vZGUoQ29udGV4dCBjYWxsZXJDb250ZXh0LCBSdW5uYWJsZSByKSB7CisgICAgICAgIHJ1bldpdGhDYWxsZXIoY2FsbGVyQ29udGV4dCwgKCkgLT4gcnVuV2l0aE5vU3RyaWN0TW9kZShyKSk7CisgICAgfQorCiAgICAgcHVibGljIHN0YXRpYyBCdW5kbGUgbWFrZUJ1bmRsZShPYmplY3QuLi4ga2V5c0FuZFZhbHVlcykgewogICAgICAgICBhc3NlcnRUcnVlKChrZXlzQW5kVmFsdWVzLmxlbmd0aCAlIDIpID09IDApOwogCkBAIC00MzcsMTEgKzQ4MSwxMSBAQAogCiAgICAgcHJvdGVjdGVkIERyYXdhYmxlIGdldEljb25Bc0xhdW5jaGVyKENvbnRleHQgbGF1bmNoZXJDb250ZXh0LCBTdHJpbmcgcGFja2FnZU5hbWUsCiAgICAgICAgICAgICBTdHJpbmcgc2hvcnRjdXRJZCwgYm9vbGVhbiB3aXRoQmFkZ2UpIHsKLSAgICAgICAgc2V0RGVmYXVsdExhdW5jaGVyKGdldEluc3RydW1lbnRhdGlvbigpLCBsYXVuY2hlckNvbnRleHQpOworICAgICAgICBydW5XaXRoTm9TdHJpY3RNb2RlKCgpIC0+IHNldERlZmF1bHRMYXVuY2hlcihnZXRJbnN0cnVtZW50YXRpb24oKSwgbGF1bmNoZXJDb250ZXh0KSk7CiAKICAgICAgICAgZmluYWwgQXRvbWljUmVmZXJlbmNlPERyYXdhYmxlPiByZXQgPSBuZXcgQXRvbWljUmVmZXJlbmNlPD4oKTsKIAotICAgICAgICBydW5XaXRoQ2FsbGVyKGxhdW5jaGVyQ29udGV4dCwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aE5vU3RyaWN0TW9kZShsYXVuY2hlckNvbnRleHQsICgpIC0+IHsKICAgICAgICAgICAgIGZpbmFsIFNob3J0Y3V0UXVlcnkgcSA9IG5ldyBTaG9ydGN1dFF1ZXJ5KCkKICAgICAgICAgICAgICAgICAgICAgLnNldFF1ZXJ5RmxhZ3MoU2hvcnRjdXRRdWVyeS5GTEFHX01BVENIX0RZTkFNSUMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU2hvcnRjdXRRdWVyeS5GTEFHX01BVENIX01BTklGRVNUCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zaG9ydGN1dG1hbmFnZXIvc3JjL2FuZHJvaWQvY29udGVudC9wbS9jdHMvc2hvcnRjdXRtYW5hZ2VyL1Nob3J0Y3V0TWFuYWdlckZha2luZ1B1Ymxpc2hlclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3Nob3J0Y3V0bWFuYWdlci9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9zaG9ydGN1dG1hbmFnZXIvU2hvcnRjdXRNYW5hZ2VyRmFraW5nUHVibGlzaGVyVGVzdC5qYXZhCmluZGV4IGJhYTQ3YjAuLmVkNzM3YjAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3Nob3J0Y3V0bWFuYWdlci9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9zaG9ydGN1dG1hbmFnZXIvU2hvcnRjdXRNYW5hZ2VyRmFraW5nUHVibGlzaGVyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3Nob3J0Y3V0bWFuYWdlci9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9zaG9ydGN1dG1hbmFnZXIvU2hvcnRjdXRNYW5hZ2VyRmFraW5nUHVibGlzaGVyVGVzdC5qYXZhCkBAIC0yNSwxMCArMjUsOSBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlNob3J0Y3V0SW5mbzsKIGltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuU2VjdXJpdHlUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwogaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TbWFsbFRlc3Q7CiAKLWltcG9ydCBvcmcuanVuaXQuQXNzdW1lOworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CiAKIC8qKgogICogQ1RTIGZvciBiLzEwOTgyNDQ0My4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3Nob3J0Y3V0bWFuYWdlci9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9zaG9ydGN1dG1hbmFnZXIvU2hvcnRjdXRNYW5hZ2VyTGF1bmNoZXJBcGlUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9zaG9ydGN1dG1hbmFnZXIvc3JjL2FuZHJvaWQvY29udGVudC9wbS9jdHMvc2hvcnRjdXRtYW5hZ2VyL1Nob3J0Y3V0TWFuYWdlckxhdW5jaGVyQXBpVGVzdC5qYXZhCmluZGV4IDRmMjVmNDQuLjY3ZDk5ZmUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3Nob3J0Y3V0bWFuYWdlci9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9zaG9ydGN1dG1hbmFnZXIvU2hvcnRjdXRNYW5hZ2VyTGF1bmNoZXJBcGlUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvc2hvcnRjdXRtYW5hZ2VyL3NyYy9hbmRyb2lkL2NvbnRlbnQvcG0vY3RzL3Nob3J0Y3V0bWFuYWdlci9TaG9ydGN1dE1hbmFnZXJMYXVuY2hlckFwaVRlc3QuamF2YQpAQCAtNDIsNyArNDIsNyBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RQaW5TaG9ydGN1dHMoKSB7Ci0gICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgZW5hYmxlTWFuaWZlc3RBY3Rpdml0eSgiTGF1bmNoZXJfbWFuaWZlc3RfMSIsIHRydWUpOwogICAgICAgICAgICAgZW5hYmxlTWFuaWZlc3RBY3Rpdml0eSgiTGF1bmNoZXJfbWFuaWZlc3RfMiIsIHRydWUpOwogCkBAIC02MSw3ICs2MSw3IEBACiAgICAgICAgICAgICAgICAgICAgIC5hcmVBbGxEeW5hbWljKCkKICAgICAgICAgICAgICAgICAgICAgLmFyZUFsbEVuYWJsZWQoKTsKICAgICAgICAgfSk7Ci0gICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MiwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobVBhY2thZ2VDb250ZXh0MiwgKCkgLT4gewogICAgICAgICAgICAgZW5hYmxlTWFuaWZlc3RBY3Rpdml0eSgiTGF1bmNoZXJfbWFuaWZlc3RfMSIsIHRydWUpOwogICAgICAgICAgICAgZW5hYmxlTWFuaWZlc3RBY3Rpdml0eSgiTGF1bmNoZXJfbWFuaWZlc3RfMyIsIHRydWUpOwogCkBAIC04Myw3ICs4Myw3IEBACiAKICAgICAgICAgc2V0RGVmYXVsdExhdW5jaGVyKGdldEluc3RydW1lbnRhdGlvbigpLCBtTGF1bmNoZXJDb250ZXh0MSk7CiAKLSAgICAgICAgcnVuV2l0aENhbGxlcihtTGF1bmNoZXJDb250ZXh0MSwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobUxhdW5jaGVyQ29udGV4dDEsICgpIC0+IHsKICAgICAgICAgICAgIGdldExhdW5jaGVyQXBwcygpLnBpblNob3J0Y3V0cygKICAgICAgICAgICAgICAgICAgICAgbVBhY2thZ2VDb250ZXh0MS5nZXRQYWNrYWdlTmFtZSgpLAogICAgICAgICAgICAgICAgICAgICBsaXN0KCJzMSIsICJzMiIsICJzMyIsICJtczEiLCAibXMyMSIpLCBnZXRVc2VySGFuZGxlKCkpOwpAQCAtOTIsMTEgKzkyLDExIEBACiAgICAgICAgICAgICAgICAgICAgIGxpc3QoInMyIiwgInMzIiwgIm1zMSIsICJtczMxIiksIGdldFVzZXJIYW5kbGUoKSk7CiAgICAgICAgIH0pOwogCi0gICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgZ2V0TWFuYWdlcigpLnJlbW92ZUR5bmFtaWNTaG9ydGN1dHMobGlzdCgiczEiLCAiczIiKSk7CiAgICAgICAgIH0pOwogCi0gICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MiwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobVBhY2thZ2VDb250ZXh0MiwgKCkgLT4gewogICAgICAgICAgICAgZW5hYmxlTWFuaWZlc3RBY3Rpdml0eSgiTGF1bmNoZXJfbWFuaWZlc3RfMyIsIGZhbHNlKTsKIAogICAgICAgICAgICAgcmV0cnlVbnRpbCgoKSAtPiBnZXRNYW5hZ2VyKCkuZ2V0TWFuaWZlc3RTaG9ydGN1dHMoKS5zaXplKCkgPT0gMSwKQEAgLTEwNiw3ICsxMDYsNyBAQAogICAgICAgICB9KTsKIAogICAgICAgICAvLyBDaGVjayB0aGUgcmVzdWx0LgotICAgICAgICBydW5XaXRoQ2FsbGVyKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IHsKKyAgICAgICAgcnVuV2l0aENhbGxlcldpdGhTdHJpY3RNb2RlKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IHsKICAgICAgICAgICAgIGFzc2VydFdpdGgoZ2V0TWFuYWdlcigpLmdldER5bmFtaWNTaG9ydGN1dHMoKSkKICAgICAgICAgICAgICAgICAgICAgLmhhdmVJZHMoInMzIiwgInM0IiwgInM1IikKICAgICAgICAgICAgICAgICAgICAgLmFyZUFsbEVuYWJsZWQoKTsKQEAgLTExOCw3ICsxMTgsNyBAQAogICAgICAgICAgICAgICAgICAgICAuYXJlQWxsRW5hYmxlZCgpOwogICAgICAgICB9KTsKIAotICAgICAgICBydW5XaXRoQ2FsbGVyKG1QYWNrYWdlQ29udGV4dDIsICgpIC0+IHsKKyAgICAgICAgcnVuV2l0aENhbGxlcldpdGhTdHJpY3RNb2RlKG1QYWNrYWdlQ29udGV4dDIsICgpIC0+IHsKICAgICAgICAgICAgIGFzc2VydFdpdGgoZ2V0TWFuYWdlcigpLmdldER5bmFtaWNTaG9ydGN1dHMoKSkKICAgICAgICAgICAgICAgICAgICAgLmhhdmVJZHMoInMzIiwgInM0IiwgInM1IikKICAgICAgICAgICAgICAgICAgICAgLmFyZUFsbEVuYWJsZWQoKTsKQEAgLTE0NCw3ICsxNDQsNyBAQAogICAgICAgICBUaHJlYWQuc2xlZXAoMik7CiAgICAgICAgIGZpbmFsIGxvbmcgdGltZTEgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKIAotICAgICAgICBydW5XaXRoQ2FsbGVyKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IHsKKyAgICAgICAgcnVuV2l0aENhbGxlcldpdGhTdHJpY3RNb2RlKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IHsKICAgICAgICAgICAgIGFzc2VydFRydWUoZ2V0TWFuYWdlcigpLnVwZGF0ZVNob3J0Y3V0cyhsaXN0KAogICAgICAgICAgICAgICAgICAgICBtYWtlU2hvcnRjdXQoInMzIikpKSk7CiAKQEAgLTE1OCwxMiArMTU4LDEyIEBACiAgICAgICAgIFRocmVhZC5zbGVlcCgyKTsKICAgICAgICAgZmluYWwgbG9uZyB0aW1lMiA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogCi0gICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgYXNzZXJ0VHJ1ZShnZXRNYW5hZ2VyKCkudXBkYXRlU2hvcnRjdXRzKGxpc3QoCiAgICAgICAgICAgICAgICAgICAgIG1ha2VTaG9ydGN1dFdpdGhSYW5rKCJzNCIsIDk5OSkpKSk7CiAgICAgICAgIH0pOwogCi0gICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MiwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobVBhY2thZ2VDb250ZXh0MiwgKCkgLT4gewogICAgICAgICAgICAgc2V0VGFyZ2V0QWN0aXZpdHlPdmVycmlkZSgiTGF1bmNoZXJfbWFuaWZlc3RfMSIpOwogCiAgICAgICAgICAgICBhc3NlcnRUcnVlKGdldE1hbmFnZXIoKS51cGRhdGVTaG9ydGN1dHMobGlzdCgKQEAgLTE3Myw3ICsxNzMsNyBAQAogICAgICAgICBUaHJlYWQuc2xlZXAoMik7CiAgICAgICAgIGZpbmFsIGxvbmcgdGltZTMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKIAotICAgICAgICBydW5XaXRoQ2FsbGVyKG1MYXVuY2hlckNvbnRleHQxLCAoKSAtPiB7CisgICAgICAgIHJ1bldpdGhDYWxsZXJXaXRoU3RyaWN0TW9kZShtTGF1bmNoZXJDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgYXNzZXJ0V2l0aChnZXRTaG9ydGN1dHNBc0xhdW5jaGVyKAogICAgICAgICAgICAgICAgICAgICBGTEFHX01BVENIX0RZTkFNSUMsCiAgICAgICAgICAgICAgICAgICAgIG1QYWNrYWdlQ29udGV4dDEuZ2V0UGFja2FnZU5hbWUoKSwKQEAgLTMxMyw3ICszMTMsNyBAQAogCiAgICAgICAgIGZpbmFsIEljb24gaWNvbjUgPSBsb2FkUGFja2FnZURyYXdhYmxlSWNvbihtUGFja2FnZUNvbnRleHQxLCAiYmxhY2tfMTZ4MTYiKTsKIAotICAgICAgICBydW5XaXRoQ2FsbGVyKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IHsKKyAgICAgICAgcnVuV2l0aENhbGxlcldpdGhTdHJpY3RNb2RlKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IHsKICAgICAgICAgICAgIGVuYWJsZU1hbmlmZXN0QWN0aXZpdHkoIkxhdW5jaGVyX21hbmlmZXN0XzIiLCB0cnVlKTsKIAogICAgICAgICAgICAgcmV0cnlVbnRpbCgoKSAtPiBnZXRNYW5hZ2VyKCkuZ2V0TWFuaWZlc3RTaG9ydGN1dHMoKS5zaXplKCkgPT0gMiwKQEAgLTM1OSw3ICszNTksNyBAQAogICAgICAgICBmaW5hbCBJY29uIGljb24yID0gSWNvbi5jcmVhdGVXaXRoQWRhcHRpdmVCaXRtYXAoQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZSgKICAgICAgICAgICAgIGdldFRlc3RDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCksIFIuZHJhd2FibGUuYmxhY2tfMzJ4MzIpKTsKIAotICAgICAgICBydW5XaXRoQ2FsbGVyKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IHsKKyAgICAgICAgcnVuV2l0aENhbGxlcldpdGhTdHJpY3RNb2RlKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IHsKICAgICAgICAgICAgIGVuYWJsZU1hbmlmZXN0QWN0aXZpdHkoIkxhdW5jaGVyX21hbmlmZXN0XzIiLCB0cnVlKTsKIAogICAgICAgICAgICAgcmV0cnlVbnRpbCgoKSAtPiBnZXRNYW5hZ2VyKCkuZ2V0TWFuaWZlc3RTaG9ydGN1dHMoKS5zaXplKCkgPT0gMiwKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3Nob3J0Y3V0bWFuYWdlci9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9zaG9ydGN1dG1hbmFnZXIvU2hvcnRjdXRNYW5hZ2VyTGF1bmNoZXJDYWxsYmFja1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3Nob3J0Y3V0bWFuYWdlci9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9zaG9ydGN1dG1hbmFnZXIvU2hvcnRjdXRNYW5hZ2VyTGF1bmNoZXJDYWxsYmFja1Rlc3QuamF2YQppbmRleCA3NTk0ZDVhLi44NDY3ZjlhIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9zaG9ydGN1dG1hbmFnZXIvc3JjL2FuZHJvaWQvY29udGVudC9wbS9jdHMvc2hvcnRjdXRtYW5hZ2VyL1Nob3J0Y3V0TWFuYWdlckxhdW5jaGVyQ2FsbGJhY2tUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvc2hvcnRjdXRtYW5hZ2VyL3NyYy9hbmRyb2lkL2NvbnRlbnQvcG0vY3RzL3Nob3J0Y3V0bWFuYWdlci9TaG9ydGN1dE1hbmFnZXJMYXVuY2hlckNhbGxiYWNrVGVzdC5qYXZhCkBAIC05MCw3ICs5MCwxMSBAQAogICAgICAgICAgICAgICAgIHNiLmFwcGVuZChzaS5nZXRJZCgpKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgTG9nLmkoVEFHLCAicGFja2FnZT0iICsgcGFja2FnZU5hbWUgKyAiIHNob3J0Y3V0cz0iICsgc2IudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBMb2cuaShUQUcsICJvblNob3J0Y3V0c0NoYW5nZWQ6IHBhY2thZ2U9IgorICAgICAgICAgICAgICAgICAgICArIHBhY2thZ2VOYW1lICsgIiBzaG9ydGN1dHM9IiArIHNiLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgZm9yIChTaG9ydGN1dEluZm8gc2kgOiBzaG9ydGN1dHMpIHsKKyAgICAgICAgICAgICAgICBMb2cuaShUQUcsICIgICIgKyBzaSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBsYXN0UGFja2FnZSA9IHBhY2thZ2VOYW1lOwogICAgICAgICAgICAgbGFzdFNob3J0Y3V0cy5jbGVhcigpOwogICAgICAgICAgICAgbGFzdFNob3J0Y3V0cy5hZGRBbGwoc2hvcnRjdXRzKTsKQEAgLTE1Niw2ICsxNjAsNyBAQAogICAgICAgICByZXNldC5ydW4oKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIExvZy5pKFRBRywgInRlc3RDYWxsYmFja3M6IHNldER5bmFtaWNTaG9ydGN1dHMiKTsKICAgICAgICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZ2V0TWFuYWdlcigpLnNldER5bmFtaWNTaG9ydGN1dHMobGlzdCgKICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VTaG9ydGN1dCgiczEiKSwKQEAgLTE2OSw2ICsxNzQsNyBAQAogICAgICAgICAgICAgcmVzZXQucnVuKCk7CiAKICAgICAgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIExvZy5pKFRBRywgInRlc3RDYWxsYmFja3M6IGFkZER5bmFtaWNTaG9ydGN1dHMiKTsKICAgICAgICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZ2V0TWFuYWdlcigpLmFkZER5bmFtaWNTaG9ydGN1dHMobGlzdCgKICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VTaG9ydGN1dFdpdGhSYW5rKCJzeCIsIDEpCkBAIC0xODEsNiArMTg3LDcgQEAKICAgICAgICAgICAgIHJlc2V0LnJ1bigpOwogCiAgICAgICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICBMb2cuaShUQUcsICJ0ZXN0Q2FsbGJhY2tzOiB1cGRhdGVTaG9ydGN1dHMgMSIpOwogICAgICAgICAgICAgcnVuV2l0aENhbGxlcihtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CiAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShnZXRNYW5hZ2VyKCkudXBkYXRlU2hvcnRjdXRzKGxpc3QoCiAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlU2hvcnRjdXQoInMyIikKQEAgLTE5Myw2ICsyMDAsNyBAQAogICAgICAgICAgICAgcmVzZXQucnVuKCk7CiAKICAgICAgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIExvZy5pKFRBRywgInRlc3RDYWxsYmFja3M6IHVwZGF0ZVNob3J0Y3V0cyAyIik7CiAgICAgICAgICAgICBydW5XaXRoQ2FsbGVyKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IHsKICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGdldE1hbmFnZXIoKS51cGRhdGVTaG9ydGN1dHMobGlzdCgKICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VTaG9ydGN1dCgic3giKQpAQCAtMjA1LDYgKzIxMyw3IEBACiAgICAgICAgICAgICByZXNldC5ydW4oKTsKIAogICAgICAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgTG9nLmkoVEFHLCAidGVzdENhbGxiYWNrczogZW5hYmxlTWFuaWZlc3RBY3Rpdml0eSAxIik7CiAgICAgICAgICAgICBydW5XaXRoQ2FsbGVyKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IHsKICAgICAgICAgICAgICAgICBlbmFibGVNYW5pZmVzdEFjdGl2aXR5KCJMYXVuY2hlcl9tYW5pZmVzdF8xIiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgcmV0cnlVbnRpbCgoKSAtPiBnZXRNYW5hZ2VyKCkuZ2V0TWFuaWZlc3RTaG9ydGN1dHMoKS5zaXplKCkgPT0gMSwKQEAgLTIxNyw2ICsyMjYsNyBAQAogICAgICAgICAgICAgcmVzZXQucnVuKCk7CiAKICAgICAgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIExvZy5pKFRBRywgInRlc3RDYWxsYmFja3M6IGVuYWJsZU1hbmlmZXN0QWN0aXZpdHkgMiIpOwogICAgICAgICAgICAgcnVuV2l0aENhbGxlcihtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CiAgICAgICAgICAgICAgICAgZW5hYmxlTWFuaWZlc3RBY3Rpdml0eSgiTGF1bmNoZXJfbWFuaWZlc3RfMiIsIHRydWUpOwogICAgICAgICAgICAgICAgIHJldHJ5VW50aWwoKCkgLT4gZ2V0TWFuYWdlcigpLmdldE1hbmlmZXN0U2hvcnRjdXRzKCkuc2l6ZSgpID09IDMsCkBAIC0yMzAsNiArMjQwLDcgQEAKIAogICAgICAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAgLy8gUGluIHNvbWUgc2hvcnRjdXRzLgorICAgICAgICAgICAgTG9nLmkoVEFHLCAidGVzdENhbGxiYWNrczogcGluU2hvcnRjdXRzIik7CiAgICAgICAgICAgICBydW5XaXRoQ2FsbGVyKG1MYXVuY2hlckNvbnRleHQxLCAoKSAtPiB7CiAgICAgICAgICAgICAgICAgZ2V0TGF1bmNoZXJBcHBzKCkucGluU2hvcnRjdXRzKG1QYWNrYWdlQ29udGV4dDEuZ2V0UGFja2FnZU5hbWUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QoInMxIiwgIm1zMSIsICJtczIxIiksIGdldFVzZXJIYW5kbGUoKSk7CkBAIC0yNDUsNiArMjU2LDcgQEAKICAgICAgICAgICAgIHJlc2V0LnJ1bigpOwogCiAgICAgICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICBMb2cuaShUQUcsICJ0ZXN0Q2FsbGJhY2tzOiByZW1vdmVEeW5hbWljU2hvcnRjdXRzIik7CiAgICAgICAgICAgICBydW5XaXRoQ2FsbGVyKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IHsKICAgICAgICAgICAgICAgICBnZXRNYW5hZ2VyKCkucmVtb3ZlRHluYW1pY1Nob3J0Y3V0cyhsaXN0KCJzMSIsICJzMiIpKTsKICAgICAgICAgICAgIH0pOwpAQCAtMjU3LDYgKzI2OSw3IEBACiAgICAgICAgICAgICByZXNldC5ydW4oKTsKIAogICAgICAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgTG9nLmkoVEFHLCAidGVzdENhbGxiYWNrczogZW5hYmxlTWFuaWZlc3RBY3Rpdml0eSIpOwogICAgICAgICAgICAgcnVuV2l0aENhbGxlcihtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CiAgICAgICAgICAgICAgICAgZW5hYmxlTWFuaWZlc3RBY3Rpdml0eSgiTGF1bmNoZXJfbWFuaWZlc3RfMiIsIGZhbHNlKTsKIApAQCAtMjc2LDYgKzI4OSw3IEBACiAgICAgICAgICAgICByZXNldC5ydW4oKTsKIAogICAgICAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgTG9nLmkoVEFHLCAidGVzdENhbGxiYWNrczogZGlzYWJsZVNob3J0Y3V0cyIpOwogICAgICAgICAgICAgcnVuV2l0aENhbGxlcihtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CiAgICAgICAgICAgICAgICAgZ2V0TWFuYWdlcigpLmRpc2FibGVTaG9ydGN1dHMobGlzdCgiczEiKSk7CiAgICAgICAgICAgICB9KTsKQEAgLTI5NCwxMCArMzA4LDEzIEBACiAgICAgICAgICAgICByZXNldC5ydW4oKTsKIAogICAgICAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgTG9nLmkoVEFHLCAidGVzdENhbGxiYWNrczogZW5hYmxlU2hvcnRjdXRzIDEiKTsKICAgICAgICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgICAgIGdldE1hbmFnZXIoKS5lbmFibGVTaG9ydGN1dHMobGlzdCgiczEiKSk7CiAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIHJldHJ5VW50aWwoKCkgLT4gYy5pc0NhbGxlZCgpLCAiY2FsbGJhY2sgbm90IGNhbGxlZC4iKTsKKyAgICAgICAgICAgIHJldHJ5VW50aWwoKCkgLT4gKGMuaXNDYWxsZWQoKSAmJiBjLmlzU2hvcnRjdXRCeUlkKCJzMSIsIHNpIC0+IHNpLmlzRW5hYmxlZCgpKSksCisgICAgICAgICAgICAgICAgICAgICJzMSBub3QgZW5hYmxlZCIpOworCiAgICAgICAgICAgICBjLmFzc2VydENhbGxlZChtUGFja2FnZUNvbnRleHQxKQogICAgICAgICAgICAgICAgICAgICAuaGF2ZUlkcygiczEiLCAic3giLCAibXMxIiwgIm1zMjEiKQogCkBAIC0zMTAsNiArMzI3LDcgQEAKICAgICAgICAgICAgIHJlc2V0LnJ1bigpOwogCiAgICAgICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICBMb2cuaShUQUcsICJ0ZXN0Q2FsbGJhY2tzOiBlbmFibGVTaG9ydGN1dHMgMiIpOwogICAgICAgICAgICAgcnVuV2l0aENhbGxlcihtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CiAgICAgICAgICAgICAgICAgZ2V0TWFuYWdlcigpLmVuYWJsZVNob3J0Y3V0cyhsaXN0KCJzMiIpKTsKICAgICAgICAgICAgIH0pOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2hvcnRjdXRtYW5hZ2VyL3NyYy9hbmRyb2lkL2NvbnRlbnQvcG0vY3RzL3Nob3J0Y3V0bWFuYWdlci9TaG9ydGN1dE1hbmFnZXJNYXhDb3VudFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3Nob3J0Y3V0bWFuYWdlci9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9zaG9ydGN1dG1hbmFnZXIvU2hvcnRjdXRNYW5hZ2VyTWF4Q291bnRUZXN0LmphdmEKaW5kZXggNDkwY2M2Zi4uOGIxODkzMSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvc2hvcnRjdXRtYW5hZ2VyL3NyYy9hbmRyb2lkL2NvbnRlbnQvcG0vY3RzL3Nob3J0Y3V0bWFuYWdlci9TaG9ydGN1dE1hbmFnZXJNYXhDb3VudFRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy9zaG9ydGN1dG1hbmFnZXIvc3JjL2FuZHJvaWQvY29udGVudC9wbS9jdHMvc2hvcnRjdXRtYW5hZ2VyL1Nob3J0Y3V0TWFuYWdlck1heENvdW50VGVzdC5qYXZhCkBAIC0zMiw3ICszMiw3IEBACiAgICAgICogQmFzaWMgdGVzdHM6IHNpbmdsZSBhcHAsIHNpbmdsZSBhY3Rpdml0eSwgbm8gbWFuaWZlc3Qgc2hvcnRjdXRzLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHRlc3ROdW1EeW5hbWljU2hvcnRjdXRzKCkgewotICAgICAgICBydW5XaXRoQ2FsbGVyKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IHsKKyAgICAgICAgcnVuV2l0aENhbGxlcldpdGhTdHJpY3RNb2RlKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IHsKICAgICAgICAgICAgIGFzc2VydFRydWUoZ2V0TWFuYWdlcigpLnNldER5bmFtaWNTaG9ydGN1dHMobGlzdChtYWtlU2hvcnRjdXQoInMxIikpKSk7CiAgICAgICAgICAgICBhc3NlcnRUcnVlKGdldE1hbmFnZXIoKS5zZXREeW5hbWljU2hvcnRjdXRzKGxpc3QoCiAgICAgICAgICAgICAgICAgICAgIG1ha2VTaG9ydGN1dCgiczEiKSwKQEAgLTEwNCw3ICsxMDQsNyBAQAogICAgICAqIE1hbmlmZXN0IHNob3J0Y3V0cyBhcmUgaW5jbHVkZWQgaW4gdGhlIGNvdW50IHRvby4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB0ZXN0V2l0aE1hbmlmZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgZW5hYmxlTWFuaWZlc3RBY3Rpdml0eSgiTGF1bmNoZXJfbWFuaWZlc3RfMSIsIHRydWUpOwogICAgICAgICAgICAgZW5hYmxlTWFuaWZlc3RBY3Rpdml0eSgiTGF1bmNoZXJfbWFuaWZlc3RfMiIsIHRydWUpOwogCkBAIC0xMTMsNyArMTEzLDcgQEAKIAogICAgICAgICB9KTsKIAotICAgICAgICBydW5XaXRoQ2FsbGVyKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IHsKKyAgICAgICAgcnVuV2l0aENhbGxlcldpdGhTdHJpY3RNb2RlKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IHsKICAgICAgICAgICAgIGFzc2VydFdpdGgoZ2V0TWFuYWdlcigpLmdldE1hbmlmZXN0U2hvcnRjdXRzKCkpCiAgICAgICAgICAgICAgICAgICAgIC5oYXZlSWRzKCJtczEiLCAibXMyMSIsICJtczIyIikKICAgICAgICAgICAgICAgICAgICAgLmFyZUFsbE1hbmlmZXN0KCkKQEAgLTEzNyw3ICsxMzcsNyBAQAogICAgICAgICB0ZXN0TnVtRHluYW1pY1Nob3J0Y3V0cygpOwogCiAgICAgICAgIC8vIExhdW5jaGVyX21hbmlmZXN0XzEgaGFzIG9uZSBtYW5pZmVzdCwgc28gY2FuIG9ubHkgYWRkIDQgZHluYW1pYyBzaG9ydGN1dHMuCi0gICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgc2V0VGFyZ2V0QWN0aXZpdHlPdmVycmlkZSgiTGF1bmNoZXJfbWFuaWZlc3RfMSIpOwogCiAgICAgICAgICAgICBhc3NlcnRUcnVlKGdldE1hbmFnZXIoKS5zZXREeW5hbWljU2hvcnRjdXRzKGxpc3QoCkBAIC0xNjYsNyArMTY2LDcgQEAKICAgICAgICAgfSk7CiAKICAgICAgICAgLy8gTGF1bmNoZXJfbWFuaWZlc3RfMiBoYXMgdHdvIG1hbmlmZXN0cywgc28gY2FuIG9ubHkgYWRkIDMuCi0gICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgc2V0VGFyZ2V0QWN0aXZpdHlPdmVycmlkZSgiTGF1bmNoZXJfbWFuaWZlc3RfMiIpOwogCiAgICAgICAgICAgICBhc3NlcnRUcnVlKGdldE1hbmFnZXIoKS5hZGREeW5hbWljU2hvcnRjdXRzKGxpc3QoCkBAIC0xOTEsNyArMTkxLDcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlQWN0aXZpdHkoKSB7Ci0gICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgc2V0VGFyZ2V0QWN0aXZpdHlPdmVycmlkZSgiTGF1bmNoZXIiKTsKICAgICAgICAgICAgIGFzc2VydFRydWUoZ2V0TWFuYWdlcigpLnNldER5bmFtaWNTaG9ydGN1dHMobGlzdCgKICAgICAgICAgICAgICAgICAgICAgbWFrZVNob3J0Y3V0KCJzMSIpLApAQCAtMjY1LDcgKzI2NSw3IEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdFdpdGhQaW5uZWQoKSB7Ci0gICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgYXNzZXJ0VHJ1ZShnZXRNYW5hZ2VyKCkuc2V0RHluYW1pY1Nob3J0Y3V0cyhsaXN0KAogICAgICAgICAgICAgICAgICAgICBtYWtlU2hvcnRjdXQoInMxIiksCiAgICAgICAgICAgICAgICAgICAgIG1ha2VTaG9ydGN1dCgiczIiKSwKQEAgLTI3NywxMiArMjc3LDEyIEBACiAKICAgICAgICAgc2V0RGVmYXVsdExhdW5jaGVyKGdldEluc3RydW1lbnRhdGlvbigpLCBtTGF1bmNoZXJDb250ZXh0MSk7CiAKLSAgICAgICAgcnVuV2l0aENhbGxlcihtTGF1bmNoZXJDb250ZXh0MSwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobUxhdW5jaGVyQ29udGV4dDEsICgpIC0+IHsKICAgICAgICAgICAgIGdldExhdW5jaGVyQXBwcygpLnBpblNob3J0Y3V0cyhtUGFja2FnZUNvbnRleHQxLmdldFBhY2thZ2VOYW1lKCksCiAgICAgICAgICAgICAgICAgICAgIGxpc3QoInMxIiwgInMyIiwgInMzIiwgInM0IiwgInM1IiksIGdldFVzZXJIYW5kbGUoKSk7CiAgICAgICAgIH0pOwogCi0gICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgYXNzZXJ0VHJ1ZShnZXRNYW5hZ2VyKCkuc2V0RHluYW1pY1Nob3J0Y3V0cyhsaXN0KAogICAgICAgICAgICAgICAgICAgICBtYWtlU2hvcnRjdXQoInM2IiksCiAgICAgICAgICAgICAgICAgICAgIG1ha2VTaG9ydGN1dCgiczciKSwKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3Nob3J0Y3V0bWFuYWdlci9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9zaG9ydGN1dG1hbmFnZXIvU2hvcnRjdXRNYW5hZ2VyTXVsdGlMYXVuY2hlclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3Nob3J0Y3V0bWFuYWdlci9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9zaG9ydGN1dG1hbmFnZXIvU2hvcnRjdXRNYW5hZ2VyTXVsdGlMYXVuY2hlclRlc3QuamF2YQppbmRleCAzYTA4M2FkLi41ZjQ5ZTFmIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9zaG9ydGN1dG1hbmFnZXIvc3JjL2FuZHJvaWQvY29udGVudC9wbS9jdHMvc2hvcnRjdXRtYW5hZ2VyL1Nob3J0Y3V0TWFuYWdlck11bHRpTGF1bmNoZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvc2hvcnRjdXRtYW5hZ2VyL3NyYy9hbmRyb2lkL2NvbnRlbnQvcG0vY3RzL3Nob3J0Y3V0bWFuYWdlci9TaG9ydGN1dE1hbmFnZXJNdWx0aUxhdW5jaGVyVGVzdC5qYXZhCkBAIC0xNiw2ICsxNiw3IEBACiBwYWNrYWdlIGFuZHJvaWQuY29udGVudC5wbS5jdHMuc2hvcnRjdXRtYW5hZ2VyOwogCiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5wbS5MYXVuY2hlckFwcHMuU2hvcnRjdXRRdWVyeS5GTEFHX0dFVF9LRVlfRklFTERTX09OTFk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5wbS5MYXVuY2hlckFwcHMuU2hvcnRjdXRRdWVyeS5GTEFHX01BVENIX1BJTk5FRF9CWV9BTllfTEFVTkNIRVI7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5wbS5MYXVuY2hlckFwcHMuU2hvcnRjdXRRdWVyeS5GTEFHX01BVENIX0RZTkFNSUM7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5wbS5MYXVuY2hlckFwcHMuU2hvcnRjdXRRdWVyeS5GTEFHX01BVENIX01BTklGRVNUOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQucG0uTGF1bmNoZXJBcHBzLlNob3J0Y3V0UXVlcnkuRkxBR19NQVRDSF9QSU5ORUQ7CkBAIC0yNjksNiArMjcwLDE4IEBACiAgICAgICAgICAgICAgICAgICAgIC5yZXZlcnRUb09yaWdpbmFsTGlzdCgpCiAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3RCeUlkcygibXMzMiIpCiAgICAgICAgICAgICAgICAgICAgIC5hcmVBbGxEaXNhYmxlZCgpOworCisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgIkFMTF9QSU5ORUQiIGRvZXNuJ3Qgd29yayB3aXRob3V0IHRoZSBwZXJtaXNzaW9uLgorICAgICAgICAgICAgYXNzZXJ0V2l0aChnZXRTaG9ydGN1dHNBc0xhdW5jaGVyKAorICAgICAgICAgICAgICAgICAgICBGTEFHX01BVENIX1BJTk5FRCB8IEZMQUdfR0VUX0tFWV9GSUVMRFNfT05MWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRkxBR19NQVRDSF9QSU5ORURfQllfQU5ZX0xBVU5DSEVSLAorICAgICAgICAgICAgICAgICAgICBtUGFja2FnZUNvbnRleHQxLmdldFBhY2thZ2VOYW1lKCkpKQorICAgICAgICAgICAgICAgICAgICAuaGF2ZUlkcygiczMiLCAiczQiLCAibXMyMiIpOworICAgICAgICAgICAgYXNzZXJ0V2l0aChnZXRTaG9ydGN1dHNBc0xhdW5jaGVyKAorICAgICAgICAgICAgICAgICAgICBGTEFHX01BVENIX1BJTk5FRCB8IEZMQUdfR0VUX0tFWV9GSUVMRFNfT05MWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRkxBR19NQVRDSF9QSU5ORURfQllfQU5ZX0xBVU5DSEVSLAorICAgICAgICAgICAgICAgICAgICBtUGFja2FnZUNvbnRleHQyLmdldFBhY2thZ2VOYW1lKCkpKQorICAgICAgICAgICAgICAgICAgICAuaGF2ZUlkcygiczEiLCAiczIiLCAiczMiLCAibXMzMiIpOwogICAgICAgICB9KTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zaG9ydGN1dG1hbmFnZXIvc3JjL2FuZHJvaWQvY29udGVudC9wbS9jdHMvc2hvcnRjdXRtYW5hZ2VyL1Nob3J0Y3V0TWFuYWdlck5lZ2F0aXZlVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvc2hvcnRjdXRtYW5hZ2VyL3NyYy9hbmRyb2lkL2NvbnRlbnQvcG0vY3RzL3Nob3J0Y3V0bWFuYWdlci9TaG9ydGN1dE1hbmFnZXJOZWdhdGl2ZVRlc3QuamF2YQppbmRleCBjM2Q2YzFjLi5jNGU0OTJlIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9zaG9ydGN1dG1hbmFnZXIvc3JjL2FuZHJvaWQvY29udGVudC9wbS9jdHMvc2hvcnRjdXRtYW5hZ2VyL1Nob3J0Y3V0TWFuYWdlck5lZ2F0aXZlVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3Nob3J0Y3V0bWFuYWdlci9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9zaG9ydGN1dG1hbmFnZXIvU2hvcnRjdXRNYW5hZ2VyTmVnYXRpdmVUZXN0LmphdmEKQEAgLTYwLDcgKzYwLDcgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2FsbE1ldGhvZEV4cGVjdGluZ1NlY3VyaXR5RXhjZXB0aW9uKE9iamVjdCBpbnN0YW5jZSwgU3RyaW5nIG5hbWUsCiAgICAgICAgICAgICBTdHJpbmcgZXhwZWN0ZWRNZXNzYWdlLCBPYmplY3QuLi4gYXJncykKLSAgICAgICAgICAgIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24geworICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gewogCiAgICAgICAgIE1ldGhvZCBtID0gbnVsbDsKICAgICAgICAgZm9yIChNZXRob2QgbWV0aG9kIDogaW5zdGFuY2UuZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZE1ldGhvZHMoKSkgewpAQCAtOTMsNyArOTMsNyBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgY2FsbE1ldGhvZEV4cGVjdGluZ1NlY3VyaXR5RXhjZXB0aW9uKHJlYWRGaWVsZChtYW5hZ2VyLCAibVNlcnZpY2UiKSwgbWV0aG9kLAogICAgICAgICAgICAgICAgICAgICBleHBlY3RlZE1lc3NhZ2UsIGFyZ3MpOwotICAgICAgICB9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbnxOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgeworICAgICAgICB9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB8IExpbmthZ2VFcnJvciBlKSB7CiAgICAgICAgICAgICBpZiAoRElTQUxMT1dfUkVGTEVDVElPTl9FUlJPUikgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwogICAgICAgICAgICAgfSBlbHNlIHsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3Nob3J0Y3V0bWFuYWdlci9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9zaG9ydGN1dG1hbmFnZXIvU2hvcnRjdXRNYW5hZ2VyUmVxdWVzdFBpblRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3Nob3J0Y3V0bWFuYWdlci9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9zaG9ydGN1dG1hbmFnZXIvU2hvcnRjdXRNYW5hZ2VyUmVxdWVzdFBpblRlc3QuamF2YQppbmRleCA4ZjM4ZTE4Li5kN2I1MDZhIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9zaG9ydGN1dG1hbmFnZXIvc3JjL2FuZHJvaWQvY29udGVudC9wbS9jdHMvc2hvcnRjdXRtYW5hZ2VyL1Nob3J0Y3V0TWFuYWdlclJlcXVlc3RQaW5UZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvc2hvcnRjdXRtYW5hZ2VyL3NyYy9hbmRyb2lkL2NvbnRlbnQvcG0vY3RzL3Nob3J0Y3V0bWFuYWdlci9TaG9ydGN1dE1hbmFnZXJSZXF1ZXN0UGluVGVzdC5qYXZhCkBAIC00Miw2ICs0Miw4IEBACiBwdWJsaWMgY2xhc3MgU2hvcnRjdXRNYW5hZ2VyUmVxdWVzdFBpblRlc3QgZXh0ZW5kcyBTaG9ydGN1dE1hbmFnZXJDdHNUZXN0c0Jhc2UgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU2hvcnRjdXRNUlBUIjsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSE9SVENVVF9JRCA9ICJzMTIzNDUiOworCiAgICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IlszLjguMS9DLTItMV0sWzMuOC4xL0MtMy0xXSIpCiAgICAgcHVibGljIHZvaWQgdGVzdElzUmVxdWVzdFBpblNob3J0Y3V0U3VwcG9ydGVkKCkgewogCkBAIC02NCwxMSArNjYsMTEgQEAKICAgICAgKiBBIHRlc3QgZm9yIHtAbGluayBTaG9ydGN1dE1hbmFnZXIjcmVxdWVzdFBpblNob3J0Y3V0fSwgYSB2ZXJ5IHNpbXBsZSBjYXNlLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1ZXN0UGluU2hvcnRjdXQoKSB7CisgICAgICAgIExvZy5pKFRBRywgIlRlc3Rpbmcgd2l0aCBsYXVuY2hlcjEuIik7CisKICAgICAgICAgc2V0RGVmYXVsdExhdW5jaGVyKGdldEluc3RydW1lbnRhdGlvbigpLCBtTGF1bmNoZXJDb250ZXh0MSk7CiAKLSAgICAgICAgZmluYWwgU3RyaW5nIFNIT1JUQ1VUX0lEID0gInMxMjM0NSI7Ci0KLSAgICAgICAgcnVuV2l0aENhbGxlcihtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CisgICAgICAgIHJ1bldpdGhDYWxsZXJXaXRoU3RyaWN0TW9kZShtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CiAgICAgICAgICAgICBhc3NlcnRUcnVlKGdldE1hbmFnZXIoKS5pc1JlcXVlc3RQaW5TaG9ydGN1dFN1cHBvcnRlZCgpKTsKIAogICAgICAgICAgICAgUmVwbHlVdGlsLmludm9rZUFuZFdhaXRGb3JSZXBseShnZXRUZXN0Q29udGV4dCgpLCAocmVwbHlBY3Rpb24pIC0+IHsKQEAgLTgyLDEyICs4NCwxOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgLnNldEV4dHJhcyhleHRyYXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKIAorICAgICAgICAgICAgICAgIC8vIE5vdGU6IEJlY2F1c2UgcmVxdWVzdFBpblNob3J0Y3V0KCkgd29uJ3QgdXBkYXRlIHRoZSBzaG9ydGN1dCwgYnV0IHdlIG5lZWQgdG8KKyAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGV4dHJhcyB0aGF0IGNvbnRhaW5zIHRoZSBicm9hZGNhc3QgSUQsIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBzaG9ydGN1dAorICAgICAgICAgICAgICAgIC8vIG1hbnVhbGx5IGhlcmUgYmVmb3JlIHJlcXVlc3RQaW5TaG9ydGN1dCgpLgorCisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBvbmx5IG5lZWRlZCB3aGVuIGEgc2hvcnRjdXQgaXMgYWxyZWFkeSBwdWJsaXNoZWQgd2l0aCB0aGUgc2FtZSBJRC4KKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGdldE1hbmFnZXIoKS51cGRhdGVTaG9ydGN1dHMobGlzdChzaG9ydGN1dCkpKTsKKwogICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkNhbGxpbmcgcmVxdWVzdFBpblNob3J0Y3V0Li4uIik7CiAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShnZXRNYW5hZ2VyKCkucmVxdWVzdFBpblNob3J0Y3V0KHNob3J0Y3V0LCAvKiBpbnRlbnQgc2VuZGVyICovIG51bGwpKTsKICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJEb25lLiIpOwogICAgICAgICAgICAgfSk7CiAgICAgICAgIH0pOwotICAgICAgICBydW5XaXRoQ2FsbGVyKG1MYXVuY2hlckNvbnRleHQxLCAoKSAtPiB7CisgICAgICAgIHJ1bldpdGhDYWxsZXJXaXRoU3RyaWN0TW9kZShtTGF1bmNoZXJDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgZmluYWwgU2hvcnRjdXRRdWVyeSBxdWVyeSA9IG5ldyBTaG9ydGN1dFF1ZXJ5KCkKICAgICAgICAgICAgICAgICAgICAgLnNldFBhY2thZ2UobVBhY2thZ2VDb250ZXh0MS5nZXRQYWNrYWdlTmFtZSgpKQogICAgICAgICAgICAgICAgICAgICAuc2V0U2hvcnRjdXRJZHMobGlzdChTSE9SVENVVF9JRCkpCkBAIC0xMjAsNiArMTI5LDE4MyBAQAogICAgICAgICAgICAgICAgICAgICAuYXJlQWxsTXV0YWJsZSgpCiAgICAgICAgICAgICAgICAgICAgIDsKICAgICAgICAgfSk7CisKKyAgICAgICAgTG9nLmkoVEFHLCAiRG9uZSB0ZXN0aW5nIHdpdGggbGF1bmNoZXIxLiIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1ZXN0UGluU2hvcnRjdXRfbXVsdGlMYXVuY2hlcnMoKSB7CisgICAgICAgIHRlc3RSZXF1ZXN0UGluU2hvcnRjdXQoKTsKKworICAgICAgICBMb2cuaShUQUcsICJUZXN0aW5nIHdpdGggbGF1bmNoZXIyLiIpOworCisgICAgICAgIHNldERlZmF1bHRMYXVuY2hlcihnZXRJbnN0cnVtZW50YXRpb24oKSwgbUxhdW5jaGVyQ29udGV4dDIpOworCisgICAgICAgIHJ1bldpdGhDYWxsZXJXaXRoU3RyaWN0TW9kZShtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CisgICAgICAgICAgICBSZXBseVV0aWwuaW52b2tlQW5kV2FpdEZvclJlcGx5KGdldFRlc3RDb250ZXh0KCksIChyZXBseUFjdGlvbikgLT4geworICAgICAgICAgICAgICAgIGZpbmFsIFBlcnNpc3RhYmxlQnVuZGxlIGV4dHJhcyA9IG5ldyBQZXJzaXN0YWJsZUJ1bmRsZSgpOworICAgICAgICAgICAgICAgIGV4dHJhcy5wdXRTdHJpbmcoQ29uc3RhbnRzLkVYVFJBX1JFUExZX0FDVElPTiwgcmVwbHlBY3Rpb24pOworICAgICAgICAgICAgICAgIGV4dHJhcy5wdXRTdHJpbmcoQ29uc3RhbnRzLkxBQkVMLCAibGFiZWwxIik7CisKKyAgICAgICAgICAgICAgICBmaW5hbCBTaG9ydGN1dEluZm8gc2hvcnRjdXQgPSBtYWtlU2hvcnRjdXRCdWlsZGVyKFNIT1JUQ1VUX0lEKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEV4dHJhcyhleHRyYXMpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgICAgICAgICAgICAgIC8vIE5vdGU6IEJlY2F1c2UgcmVxdWVzdFBpblNob3J0Y3V0KCkgd29uJ3QgdXBkYXRlIHRoZSBzaG9ydGN1dCwgYnV0IHdlIG5lZWQgdG8KKyAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGV4dHJhcyB0aGF0IGNvbnRhaW5zIHRoZSBicm9hZGNhc3QgSUQsIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBzaG9ydGN1dAorICAgICAgICAgICAgICAgIC8vIG1hbnVhbGx5IGhlcmUgYmVmb3JlIHJlcXVlc3RQaW5TaG9ydGN1dCgpLgorICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZ2V0TWFuYWdlcigpLnVwZGF0ZVNob3J0Y3V0cyhsaXN0KHNob3J0Y3V0KSkpOworCisgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiQ2FsbGluZyByZXF1ZXN0UGluU2hvcnRjdXQuLi4iKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGdldE1hbmFnZXIoKS5yZXF1ZXN0UGluU2hvcnRjdXQoc2hvcnRjdXQsIC8qIGludGVudCBzZW5kZXIgKi8gbnVsbCkpOworICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkRvbmUuIik7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfSk7CisgICAgICAgIHJ1bldpdGhDYWxsZXJXaXRoU3RyaWN0TW9kZShtTGF1bmNoZXJDb250ZXh0MiwgKCkgLT4geworICAgICAgICAgICAgZmluYWwgU2hvcnRjdXRRdWVyeSBxdWVyeSA9IG5ldyBTaG9ydGN1dFF1ZXJ5KCkKKyAgICAgICAgICAgICAgICAgICAgLnNldFBhY2thZ2UobVBhY2thZ2VDb250ZXh0MS5nZXRQYWNrYWdlTmFtZSgpKQorICAgICAgICAgICAgICAgICAgICAuc2V0U2hvcnRjdXRJZHMobGlzdChTSE9SVENVVF9JRCkpCisgICAgICAgICAgICAgICAgICAgIC5zZXRRdWVyeUZsYWdzKFNob3J0Y3V0UXVlcnkuRkxBR19NQVRDSF9EWU5BTUlDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTaG9ydGN1dFF1ZXJ5LkZMQUdfTUFUQ0hfUElOTkVEIHwgU2hvcnRjdXRRdWVyeS5GTEFHX01BVENIX01BTklGRVNUKTsKKyAgICAgICAgICAgIExvZy5pKFRBRywgIldhaXRpbmcgZm9yIHNob3J0Y3V0IHRvIGJlIHZpc2libGUgdG8gbGF1bmNoZXIuLi4iKTsKKyAgICAgICAgICAgIHJldHJ5VW50aWwoKCkgLT4geworICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8U2hvcnRjdXRJbmZvPiBzaG9ydGN1dHMgPSBnZXRMYXVuY2hlckFwcHMoKS5nZXRTaG9ydGN1dHMocXVlcnksCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLm9zLlByb2Nlc3MubXlVc2VySGFuZGxlKCkpOworICAgICAgICAgICAgICAgIGlmIChzaG9ydGN1dHMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBMYXVuY2hlciBub3QgcmVzcG9uZGVkIHlldC4KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhc3NlcnRXaXRoKHNob3J0Y3V0cykKKyAgICAgICAgICAgICAgICAgICAgICAgIC5oYXZlSWRzKFNIT1JUQ1VUX0lEKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFyZUFsbFBpbm5lZCgpCisgICAgICAgICAgICAgICAgICAgICAgICAuYXJlQWxsTm90RHluYW1pYygpCisgICAgICAgICAgICAgICAgICAgICAgICAuYXJlQWxsTm90TWFuaWZlc3QoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0sICJTaG9ydGN1dCBzdGlsbCBub3QgcGlubmVkIik7CisgICAgICAgIH0pOworICAgICAgICBMb2cuaShUQUcsICJEb25lIHRlc3Rpbmcgd2l0aCBsYXVuY2hlcjIuIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlcXVlc3RQaW5TaG9ydGN1dF9tdWx0aUxhdW5jaGVyc193aXRoRHluYW1pYygpIHsKKyAgICAgICAgc2V0RGVmYXVsdExhdW5jaGVyKGdldEluc3RydW1lbnRhdGlvbigpLCBtTGF1bmNoZXJDb250ZXh0MSk7CisKKyAgICAgICAgLy8gUHVibGlzaCBhcyBhIGR5bmFtaWMgc2hvcnRjdXQgZmlyc3QsIHRoZW4gY2FsbCByZXF1ZXN0UGluLgorICAgICAgICBTaG9ydGN1dEluZm8gc2hvcnRjdXQgPSBtYWtlU2hvcnRjdXRCdWlsZGVyKFNIT1JUQ1VUX0lEKQorICAgICAgICAgICAgICAgIC5zZXRTaG9ydExhYmVsKCJsYWJlbDEiKQorICAgICAgICAgICAgICAgIC5zZXRJbnRlbnQobmV3IEludGVudChJbnRlbnQuQUNUSU9OX01BSU4pKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICBhc3NlcnRUcnVlKGdldE1hbmFnZXIoKS5zZXREeW5hbWljU2hvcnRjdXRzKGxpc3Qoc2hvcnRjdXQpKSk7CisKKyAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgTG9nLmkoVEFHLCAiVGVzdGluZyB3aXRoIGxhdW5jaGVyMS4iKTsKKworICAgICAgICBhc3NlcnRUcnVlKGdldE1hbmFnZXIoKS5pc1JlcXVlc3RQaW5TaG9ydGN1dFN1cHBvcnRlZCgpKTsKKworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4geworICAgICAgICAgICAgUmVwbHlVdGlsLmludm9rZUFuZFdhaXRGb3JSZXBseShnZXRUZXN0Q29udGV4dCgpLCAocmVwbHlBY3Rpb24pIC0+IHsKKyAgICAgICAgICAgICAgICBmaW5hbCBQZXJzaXN0YWJsZUJ1bmRsZSBleHRyYXMgPSBuZXcgUGVyc2lzdGFibGVCdW5kbGUoKTsKKyAgICAgICAgICAgICAgICBleHRyYXMucHV0U3RyaW5nKENvbnN0YW50cy5FWFRSQV9SRVBMWV9BQ1RJT04sIHJlcGx5QWN0aW9uKTsKKyAgICAgICAgICAgICAgICBleHRyYXMucHV0U3RyaW5nKENvbnN0YW50cy5MQUJFTCwgImxhYmVsMSIpOworCisgICAgICAgICAgICAgICAgZmluYWwgU2hvcnRjdXRJbmZvIHNob3J0Y3V0MiA9IG1ha2VTaG9ydGN1dEJ1aWxkZXIoU0hPUlRDVVRfSUQpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RXh0cmFzKGV4dHJhcykKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworCisgICAgICAgICAgICAgICAgLy8gTm90ZTogQmVjYXVzZSByZXF1ZXN0UGluU2hvcnRjdXQoKSB3b24ndCB1cGRhdGUgdGhlIHNob3J0Y3V0LCBidXQgd2UgbmVlZCB0bworICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgZXh0cmFzIHRoYXQgY29udGFpbnMgdGhlIGJyb2FkY2FzdCBJRCwgd2UgbmVlZCB0byB1cGRhdGUgdGhlIHNob3J0Y3V0CisgICAgICAgICAgICAgICAgLy8gbWFudWFsbHkgaGVyZSBiZWZvcmUgcmVxdWVzdFBpblNob3J0Y3V0KCkuCisKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIG9ubHkgbmVlZGVkIHdoZW4gYSBzaG9ydGN1dCBpcyBhbHJlYWR5IHB1Ymxpc2hlZCB3aXRoIHRoZSBzYW1lIElELgorICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZ2V0TWFuYWdlcigpLnVwZGF0ZVNob3J0Y3V0cyhsaXN0KHNob3J0Y3V0MikpKTsKKworICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkNhbGxpbmcgcmVxdWVzdFBpblNob3J0Y3V0Li4uIik7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShnZXRNYW5hZ2VyKCkucmVxdWVzdFBpblNob3J0Y3V0KHNob3J0Y3V0MiwgLyogaW50ZW50IHNlbmRlciAqLyBudWxsKSk7CisgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiRG9uZS4iKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9KTsKKyAgICAgICAgcnVuV2l0aENhbGxlcldpdGhTdHJpY3RNb2RlKG1MYXVuY2hlckNvbnRleHQxLCAoKSAtPiB7CisgICAgICAgICAgICBmaW5hbCBTaG9ydGN1dFF1ZXJ5IHF1ZXJ5ID0gbmV3IFNob3J0Y3V0UXVlcnkoKQorICAgICAgICAgICAgICAgICAgICAuc2V0UGFja2FnZShtUGFja2FnZUNvbnRleHQxLmdldFBhY2thZ2VOYW1lKCkpCisgICAgICAgICAgICAgICAgICAgIC5zZXRTaG9ydGN1dElkcyhsaXN0KFNIT1JUQ1VUX0lEKSkKKyAgICAgICAgICAgICAgICAgICAgLnNldFF1ZXJ5RmxhZ3MoU2hvcnRjdXRRdWVyeS5GTEFHX01BVENIX0RZTkFNSUMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFNob3J0Y3V0UXVlcnkuRkxBR19NQVRDSF9QSU5ORUQgfCBTaG9ydGN1dFF1ZXJ5LkZMQUdfTUFUQ0hfTUFOSUZFU1QpOworICAgICAgICAgICAgTG9nLmkoVEFHLCAiV2FpdGluZyBmb3Igc2hvcnRjdXQgdG8gYmUgdmlzaWJsZSB0byBsYXVuY2hlci4uLiIpOworICAgICAgICAgICAgcmV0cnlVbnRpbCgoKSAtPiB7CisgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxTaG9ydGN1dEluZm8+IHNob3J0Y3V0cyA9IGdldExhdW5jaGVyQXBwcygpLmdldFNob3J0Y3V0cyhxdWVyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQub3MuUHJvY2Vzcy5teVVzZXJIYW5kbGUoKSk7CisgICAgICAgICAgICAgICAgaWYgKHNob3J0Y3V0cyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIExhdW5jaGVyIG5vdCByZXNwb25kZWQgeWV0LgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFzc2VydFdpdGgoc2hvcnRjdXRzKQorICAgICAgICAgICAgICAgICAgICAgICAgLmhhdmVJZHMoU0hPUlRDVVRfSUQpCisgICAgICAgICAgICAgICAgICAgICAgICAuYXJlQWxsUGlubmVkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hcmVBbGxEeW5hbWljKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hcmVBbGxOb3RNYW5pZmVzdCgpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfSwgIlNob3J0Y3V0IHN0aWxsIG5vdCBwaW5uZWQiKTsKKyAgICAgICAgfSk7CisgICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgIExvZy5pKFRBRywgIlRlc3Rpbmcgd2l0aCBsYXVuY2hlcjIuIik7CisgICAgICAgIHNldERlZmF1bHRMYXVuY2hlcihnZXRJbnN0cnVtZW50YXRpb24oKSwgbUxhdW5jaGVyQ29udGV4dDIpOworCisgICAgICAgIGFzc2VydFRydWUoZ2V0TWFuYWdlcigpLmlzUmVxdWVzdFBpblNob3J0Y3V0U3VwcG9ydGVkKCkpOworCisgICAgICAgIHJ1bldpdGhDYWxsZXJXaXRoU3RyaWN0TW9kZShtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CisgICAgICAgICAgICBSZXBseVV0aWwuaW52b2tlQW5kV2FpdEZvclJlcGx5KGdldFRlc3RDb250ZXh0KCksIChyZXBseUFjdGlvbikgLT4geworICAgICAgICAgICAgICAgIGZpbmFsIFBlcnNpc3RhYmxlQnVuZGxlIGV4dHJhcyA9IG5ldyBQZXJzaXN0YWJsZUJ1bmRsZSgpOworICAgICAgICAgICAgICAgIGV4dHJhcy5wdXRTdHJpbmcoQ29uc3RhbnRzLkVYVFJBX1JFUExZX0FDVElPTiwgcmVwbHlBY3Rpb24pOworICAgICAgICAgICAgICAgIGV4dHJhcy5wdXRTdHJpbmcoQ29uc3RhbnRzLkxBQkVMLCAibGFiZWwxIik7CisKKyAgICAgICAgICAgICAgICBmaW5hbCBTaG9ydGN1dEluZm8gc2hvcnRjdXQyID0gbWFrZVNob3J0Y3V0QnVpbGRlcihTSE9SVENVVF9JRCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRFeHRyYXMoZXh0cmFzKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisKKyAgICAgICAgICAgICAgICAvLyBOb3RlOiBCZWNhdXNlIHJlcXVlc3RQaW5TaG9ydGN1dCgpIHdvbid0IHVwZGF0ZSB0aGUgc2hvcnRjdXQsIGJ1dCB3ZSBuZWVkIHRvCisgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBleHRyYXMgdGhhdCBjb250YWlucyB0aGUgYnJvYWRjYXN0IElELCB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgc2hvcnRjdXQKKyAgICAgICAgICAgICAgICAvLyBtYW51YWxseSBoZXJlIGJlZm9yZSByZXF1ZXN0UGluU2hvcnRjdXQoKS4KKworICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgb25seSBuZWVkZWQgd2hlbiBhIHNob3J0Y3V0IGlzIGFscmVhZHkgcHVibGlzaGVkIHdpdGggdGhlIHNhbWUgSUQuCisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShnZXRNYW5hZ2VyKCkudXBkYXRlU2hvcnRjdXRzKGxpc3Qoc2hvcnRjdXQyKSkpOworCisgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiQ2FsbGluZyByZXF1ZXN0UGluU2hvcnRjdXQuLi4iKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGdldE1hbmFnZXIoKS5yZXF1ZXN0UGluU2hvcnRjdXQoc2hvcnRjdXQyLCAvKiBpbnRlbnQgc2VuZGVyICovIG51bGwpKTsKKyAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJEb25lLiIpOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0pOworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobUxhdW5jaGVyQ29udGV4dDIsICgpIC0+IHsKKyAgICAgICAgICAgIGZpbmFsIFNob3J0Y3V0UXVlcnkgcXVlcnkgPSBuZXcgU2hvcnRjdXRRdWVyeSgpCisgICAgICAgICAgICAgICAgICAgIC5zZXRQYWNrYWdlKG1QYWNrYWdlQ29udGV4dDEuZ2V0UGFja2FnZU5hbWUoKSkKKyAgICAgICAgICAgICAgICAgICAgLnNldFNob3J0Y3V0SWRzKGxpc3QoU0hPUlRDVVRfSUQpKQorICAgICAgICAgICAgICAgICAgICAuc2V0UXVlcnlGbGFncyhTaG9ydGN1dFF1ZXJ5LkZMQUdfTUFUQ0hfRFlOQU1JQworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU2hvcnRjdXRRdWVyeS5GTEFHX01BVENIX1BJTk5FRCB8IFNob3J0Y3V0UXVlcnkuRkxBR19NQVRDSF9NQU5JRkVTVCk7CisgICAgICAgICAgICBMb2cuaShUQUcsICJXYWl0aW5nIGZvciBzaG9ydGN1dCB0byBiZSB2aXNpYmxlIHRvIGxhdW5jaGVyLi4uIik7CisgICAgICAgICAgICByZXRyeVVudGlsKCgpIC0+IHsKKyAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PFNob3J0Y3V0SW5mbz4gc2hvcnRjdXRzID0gZ2V0TGF1bmNoZXJBcHBzKCkuZ2V0U2hvcnRjdXRzKHF1ZXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5vcy5Qcm9jZXNzLm15VXNlckhhbmRsZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAoc2hvcnRjdXRzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTGF1bmNoZXIgbm90IHJlc3BvbmRlZCB5ZXQuCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXNzZXJ0V2l0aChzaG9ydGN1dHMpCisgICAgICAgICAgICAgICAgICAgICAgICAuaGF2ZUlkcyhTSE9SVENVVF9JRCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hcmVBbGxQaW5uZWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFyZUFsbER5bmFtaWMoKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFyZUFsbE5vdE1hbmlmZXN0KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9LCAiU2hvcnRjdXQgc3RpbGwgbm90IHBpbm5lZCIpOworICAgICAgICB9KTsKKworICAgICAgICBydW5XaXRoQ2FsbGVyKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IHsKKyAgICAgICAgICAgIGFzc2VydFdpdGgoZ2V0TWFuYWdlcigpLmdldFBpbm5lZFNob3J0Y3V0cygpKQorICAgICAgICAgICAgICAgICAgICAuZm9yU2hvcnRjdXRXaXRoSWQoU0hPUlRDVVRfSUQsIHNpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygibGFiZWwxIiwgc2kuZ2V0U2hvcnRMYWJlbCgpKTsKKyAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgLmFyZUFsbFBpbm5lZCgpCisgICAgICAgICAgICAgICAgICAgIC5hcmVBbGxEeW5hbWljKCkKKyAgICAgICAgICAgICAgICAgICAgLmFyZUFsbE5vdE1hbmlmZXN0KCkKKyAgICAgICAgICAgICAgICAgICAgLmFyZUFsbE11dGFibGUoKQorICAgICAgICAgICAgOworICAgICAgICB9KTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3Nob3J0Y3V0bWFuYWdlci9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9zaG9ydGN1dG1hbmFnZXIvU2hvcnRjdXRNYW5hZ2VyU3RhcnRTaG9ydGN1dFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3Nob3J0Y3V0bWFuYWdlci9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9zaG9ydGN1dG1hbmFnZXIvU2hvcnRjdXRNYW5hZ2VyU3RhcnRTaG9ydGN1dFRlc3QuamF2YQppbmRleCBmNWIwYTllLi5iZTlmMTBkIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9zaG9ydGN1dG1hbmFnZXIvc3JjL2FuZHJvaWQvY29udGVudC9wbS9jdHMvc2hvcnRjdXRtYW5hZ2VyL1Nob3J0Y3V0TWFuYWdlclN0YXJ0U2hvcnRjdXRUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvc2hvcnRjdXRtYW5hZ2VyL3NyYy9hbmRyb2lkL2NvbnRlbnQvcG0vY3RzL3Nob3J0Y3V0bWFuYWdlci9TaG9ydGN1dE1hbmFnZXJTdGFydFNob3J0Y3V0VGVzdC5qYXZhCkBAIC0yNCw2ICsyNCw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TbWFsbFRlc3Q7CkBAIC0zNiwxMiArMzcsMTUgQEAKIEBTbWFsbFRlc3QKIHB1YmxpYyBjbGFzcyBTaG9ydGN1dE1hbmFnZXJTdGFydFNob3J0Y3V0VGVzdCBleHRlbmRzIFNob3J0Y3V0TWFuYWdlckN0c1Rlc3RzQmFzZSB7CiAgICAgcHJpdmF0ZSBDb21wb25lbnROYW1lIG1MYXVuY2hlZEFjdGl2aXR5OworICAgIHByaXZhdGUgYm9vbGVhbiBtT25XYXRjaDsKIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHN1cGVyLnNldFVwKCk7CiAKICAgICAgICAgbUxhdW5jaGVkQWN0aXZpdHkgPSBuZXcgQ29tcG9uZW50TmFtZShnZXRUZXN0Q29udGV4dCgpLCBTaG9ydGN1dExhdW5jaGVkQWN0aXZpdHkuY2xhc3MpOworICAgICAgICBtT25XYXRjaCA9IGdldFRlc3RDb250ZXh0KCkuZ2V0UGFja2FnZU1hbmFnZXIoKS5oYXNTeXN0ZW1GZWF0dXJlKAorICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfV0FUQ0gpOwogICAgIH0KIAogICAgIHByaXZhdGUgTGlzdDxJbnRlbnQ+IGxhdW5jaFNob3J0Y3V0QW5kR2V0SW50ZW50cyhDb250ZXh0IGxhdW5jaGVyLCBDb250ZXh0IGNsaWVudCwKQEAgLTU2LDcgKzYwLDcgQEAKIAogICAgICAgICBTaG9ydGN1dExhdW5jaGVkQWN0aXZpdHkuc2V0RXhwZWN0ZWRPcmRlcihleHBlY3RlZEFjdGlvbnMpOwogCi0gICAgICAgIHJ1bldpdGhDYWxsZXIobGF1bmNoZXIsICgpIC0+IHsKKyAgICAgICAgcnVuV2l0aENhbGxlcldpdGhTdHJpY3RNb2RlKGxhdW5jaGVyLCAoKSAtPiB7CiAgICAgICAgICAgICBnZXRMYXVuY2hlckFwcHMoKS5zdGFydFNob3J0Y3V0KGNsaWVudC5nZXRQYWNrYWdlTmFtZSgpLCBpZCwgcmVjdCwgb3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAgZ2V0VXNlckhhbmRsZSgpKTsKICAgICAgICAgfSk7CkBAIC03Niw3ICs4MCw3IEBACiAKICAgICBwcml2YXRlIHZvaWQgYXNzZXJ0U2hvcnRjdXRDYW50U3RhcnQoQ29udGV4dCBsYXVuY2hlciwgQ29udGV4dCBjbGllbnQsIFN0cmluZyBpZCwKICAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBUaHJvd2FibGU+IGV4Y2VwdGlvbkNsYXNzKSB7Ci0gICAgICAgIHJ1bldpdGhDYWxsZXIobGF1bmNoZXIsICgpIC0+IHsKKyAgICAgICAgcnVuV2l0aENhbGxlcldpdGhTdHJpY3RNb2RlKGxhdW5jaGVyLCAoKSAtPiB7CiAgICAgICAgICAgICBhc3NlcnRFeHBlY3RFeGNlcHRpb24oZXhjZXB0aW9uQ2xhc3MsICIiLCAoKSAtPiB7CiAKICAgICAgICAgICAgICAgICBnZXRMYXVuY2hlckFwcHMoKS5zdGFydFNob3J0Y3V0KGNsaWVudC5nZXRQYWNrYWdlTmFtZSgpLCBpZCwgbnVsbCwgbnVsbCwKQEAgLTk5LDcgKzEwMyw3IEBACiAgICAgICAgICAgICAgICAgLnNldEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05PX0FOSU1BVElPTikKICAgICAgICAgICAgICAgICAucHV0RXh0cmEoImsxIiwgInYxIik7CiAKLSAgICAgICAgcnVuV2l0aENhbGxlcihtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CisgICAgICAgIHJ1bldpdGhDYWxsZXJXaXRoU3RyaWN0TW9kZShtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CiAgICAgICAgICAgICBhc3NlcnRUcnVlKGdldE1hbmFnZXIoKS5hZGREeW5hbWljU2hvcnRjdXRzKGxpc3QoCiAgICAgICAgICAgICAgICAgICAgIG1ha2VTaG9ydGN1dEJ1aWxkZXIoInMxIikuc2V0U2hvcnRMYWJlbCgiYWJjIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0SW50ZW50KGkpLmJ1aWxkKCkKQEAgLTExOCw2ICsxMjIsOSBAQAogICAgICAqIFN0YXJ0IG11bHRpcGxlIGFjdGl2aXRpZXMuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdGVzdFN0YXJ0TXVsdGlwbGUoKSB7CisgICAgICAgIGlmIChtT25XYXRjaCkgeworICAgICAgICAgICAgcmV0dXJuOyAvLyBiLzEwOTY3ODI2OAorICAgICAgICB9CiAgICAgICAgIHNldERlZmF1bHRMYXVuY2hlcihnZXRJbnN0cnVtZW50YXRpb24oKSwgbUxhdW5jaGVyQ29udGV4dDEpOwogCiAgICAgICAgIEludGVudCBpMSA9IG5ldyBJbnRlbnQoImExIikKQEAgLTEzMSw3ICsxMzgsNyBAQAogICAgICAgICAgICAgICAgIC5zZXRDb21wb25lbnQobUxhdW5jaGVkQWN0aXZpdHkpCiAgICAgICAgICAgICAgICAgLnB1dEV4dHJhKCJreCIsICJ2eCIpOwogCi0gICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgYXNzZXJ0VHJ1ZShnZXRNYW5hZ2VyKCkuYWRkRHluYW1pY1Nob3J0Y3V0cyhsaXN0KAogICAgICAgICAgICAgICAgICAgICBtYWtlU2hvcnRjdXRCdWlsZGVyKCJzMSIpLnNldFNob3J0TGFiZWwoImFiYyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEludGVudHMobmV3IEludGVudFtde2kxLCBpMiwgaTN9KS5idWlsZCgpCkBAIC0xODAsMTIgKzE4NywxNSBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RTaG9ydGN1dE5vTG9uZ2VyRXhpc3RzKCkgeworICAgICAgICBpZiAobU9uV2F0Y2gpIHsKKyAgICAgICAgICAgIHJldHVybjsgLy8gYi8xMDk2NzgyNjgKKyAgICAgICAgfQogCiAgICAgICAgIC8vIExldCBpdCBwdWJsaXNoIGEgc2hvcnRjdXQuCiAgICAgICAgIHRlc3RTdGFydE11bHRpcGxlKCk7CiAKICAgICAgICAgLy8gdGhlbiByZW1vdmUgaXQuCi0gICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgZ2V0TWFuYWdlcigpLnJlbW92ZUFsbER5bmFtaWNTaG9ydGN1dHMoKTsKICAgICAgICAgfSk7CiAKQEAgLTIwMSw3ICsyMTEsNyBAQAogICAgICAgICAgICAgICAgIC5zZXRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9OT19BTklNQVRJT04pCiAgICAgICAgICAgICAgICAgLnB1dEV4dHJhKCJrMSIsICJ2MSIpOwogCi0gICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgYXNzZXJ0VHJ1ZShnZXRNYW5hZ2VyKCkuYWRkRHluYW1pY1Nob3J0Y3V0cyhsaXN0KAogICAgICAgICAgICAgICAgICAgICBtYWtlU2hvcnRjdXRCdWlsZGVyKCJzMSIpLnNldFNob3J0TGFiZWwoImFiYyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEludGVudChpKS5idWlsZCgpCkBAIC0yMTUsNiArMjI1LDkgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0UGlubmVkU2hvcnRjdXRfc2FtZUxhdW5jaGVyKCkgeworICAgICAgICBpZiAobU9uV2F0Y2gpIHsKKyAgICAgICAgICAgIHJldHVybjsgLy8gYi8xMDk2NzgyNjgKKyAgICAgICAgfQogCiAgICAgICAgIC8vIExldCBpdCBwdWJsaXNoIGEgc2hvcnRjdXQuCiAgICAgICAgIHRlc3RTdGFydFNpbmdsZSgpOwpAQCAtMjIyLDEzICsyMzUsMTMgQEAKICAgICAgICAgc2V0RGVmYXVsdExhdW5jaGVyKGdldEluc3RydW1lbnRhdGlvbigpLCBtTGF1bmNoZXJDb250ZXh0MSk7CiAKICAgICAgICAgLy8gdGhlbiBwaW4gaXQuCi0gICAgICAgIHJ1bldpdGhDYWxsZXIobUxhdW5jaGVyQ29udGV4dDEsICgpIC0+IHsKKyAgICAgICAgcnVuV2l0aENhbGxlcldpdGhTdHJpY3RNb2RlKG1MYXVuY2hlckNvbnRleHQxLCAoKSAtPiB7CiAgICAgICAgICAgICBnZXRMYXVuY2hlckFwcHMoKS5waW5TaG9ydGN1dHMobVBhY2thZ2VDb250ZXh0MS5nZXRQYWNrYWdlTmFtZSgpLAogICAgICAgICAgICAgICAgICAgICBsaXN0KCJzMSIpLCBnZXRVc2VySGFuZGxlKCkpOwogICAgICAgICB9KTsKIAogICAgICAgICAvLyBUaGVuIHJlbW92ZSBpdC4KLSAgICAgICAgcnVuV2l0aENhbGxlcihtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CisgICAgICAgIHJ1bldpdGhDYWxsZXJXaXRoU3RyaWN0TW9kZShtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CiAgICAgICAgICAgICBnZXRNYW5hZ2VyKCkucmVtb3ZlQWxsRHluYW1pY1Nob3J0Y3V0cygpOwogICAgICAgICB9KTsKIApAQCAtMjM3LDYgKzI1MCw5IEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdFBpbm5lZFNob3J0Y3V0X2RpZmZlcmVudExhdW5jaGVyKCkgeworICAgICAgICBpZiAobU9uV2F0Y2gpIHsKKyAgICAgICAgICAgIHJldHVybjsgLy8gYi8xMDk2NzgyNjgKKyAgICAgICAgfQogCiAgICAgICAgIC8vIExldCBpdCBwdWJsaXNoIGEgc2hvcnRjdXQuCiAgICAgICAgIHRlc3RTdGFydFNpbmdsZSgpOwpAQCAtMjQ0LDcgKzI2MCw3IEBACiAgICAgICAgIHNldERlZmF1bHRMYXVuY2hlcihnZXRJbnN0cnVtZW50YXRpb24oKSwgbUxhdW5jaGVyQ29udGV4dDEpOwogCiAgICAgICAgIC8vIHRoZW4gcGluIGl0LgotICAgICAgICBydW5XaXRoQ2FsbGVyKG1MYXVuY2hlckNvbnRleHQxLCAoKSAtPiB7CisgICAgICAgIHJ1bldpdGhDYWxsZXJXaXRoU3RyaWN0TW9kZShtTGF1bmNoZXJDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgZ2V0TGF1bmNoZXJBcHBzKCkucGluU2hvcnRjdXRzKG1QYWNrYWdlQ29udGV4dDEuZ2V0UGFja2FnZU5hbWUoKSwKICAgICAgICAgICAgICAgICAgICAgbGlzdCgiczEiKSwgZ2V0VXNlckhhbmRsZSgpKTsKICAgICAgICAgfSk7CkBAIC0yNjAsNyArMjc2LDcgQEAKICAgICAgICAgYXNzZXJ0U2hvcnRjdXRTdGFydHMobUxhdW5jaGVyQ29udGV4dDIsIG1QYWNrYWdlQ29udGV4dDEsICJzMSIsIEVYUEVDVEVEX0FDVElPTlNfU0lOR0xFKTsKIAogICAgICAgICAvLyBUaGVuIHJlbW92ZSBpdC4KLSAgICAgICAgcnVuV2l0aENhbGxlcihtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CisgICAgICAgIHJ1bldpdGhDYWxsZXJXaXRoU3RyaWN0TW9kZShtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CiAgICAgICAgICAgICBnZXRNYW5hZ2VyKCkucmVtb3ZlQWxsRHluYW1pY1Nob3J0Y3V0cygpOwogICAgICAgICB9KTsKIApAQCAtMjg1LDYgKzMwMSw5IEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdFN0YXJ0TXVsdGlwbGVXaXRoT3B0aW9ucygpIHsKKyAgICAgICAgaWYgKG1PbldhdGNoKSB7CisgICAgICAgICAgICByZXR1cm47IC8vIGIvMTA5Njc4MjY4CisgICAgICAgIH0KICAgICAgICAgdGVzdFN0YXJ0TXVsdGlwbGUoKTsKIAogICAgICAgICBMaXN0PEludGVudD4gbGF1bmNoZWQgPSBsYXVuY2hTaG9ydGN1dEFuZEdldEludGVudHMobUxhdW5jaGVyQ29udGV4dDEsIG1QYWNrYWdlQ29udGV4dDEsCkBAIC0zMDIsMTIgKzMyMSwxNSBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3ROb25FeGlzdGVudCgpIHsKKyAgICAgICAgaWYgKG1PbldhdGNoKSB7CisgICAgICAgICAgICByZXR1cm47IC8vIGIvMTA5Njc4MjY4CisgICAgICAgIH0KICAgICAgICAgc2V0RGVmYXVsdExhdW5jaGVyKGdldEluc3RydW1lbnRhdGlvbigpLCBtTGF1bmNoZXJDb250ZXh0MSk7CiAKICAgICAgICAgSW50ZW50IGkgPSBuZXcgSW50ZW50KEludGVudC5BQ1RJT05fTUFJTikKICAgICAgICAgICAgICAgICAuc2V0Q29tcG9uZW50KG5ldyBDb21wb25lbnROYW1lKCJhYmMiLCAiZGVmIikpOwogCi0gICAgICAgIHJ1bldpdGhDYWxsZXIobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4geworICAgICAgICBydW5XaXRoQ2FsbGVyV2l0aFN0cmljdE1vZGUobVBhY2thZ2VDb250ZXh0MSwgKCkgLT4gewogICAgICAgICAgICAgYXNzZXJ0VHJ1ZShnZXRNYW5hZ2VyKCkuYWRkRHluYW1pY1Nob3J0Y3V0cyhsaXN0KAogICAgICAgICAgICAgICAgICAgICBtYWtlU2hvcnRjdXRCdWlsZGVyKCJzMSIpLnNldFNob3J0TGFiZWwoImFiYyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEludGVudChpKS5idWlsZCgpCkBAIC0zMzIsNyArMzU0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLmNvbnRlbnQucG0uY3RzLnNob3J0Y3V0bWFuYWdlci5wYWNrYWdlcy5wYWNrYWdlNCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5jb250ZW50LnBtLmN0cy5zaG9ydGN1dG1hbmFnZXIucGFja2FnZXMuTGF1bmNoZXIiKSk7CiAKLSAgICAgICAgcnVuV2l0aENhbGxlcihtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CisgICAgICAgIHJ1bldpdGhDYWxsZXJXaXRoU3RyaWN0TW9kZShtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CiAgICAgICAgICAgICBhc3NlcnRUcnVlKGdldE1hbmFnZXIoKS5hZGREeW5hbWljU2hvcnRjdXRzKGxpc3QoCiAgICAgICAgICAgICAgICAgICAgIG1ha2VTaG9ydGN1dEJ1aWxkZXIoInMxIikuc2V0U2hvcnRMYWJlbCgiYWJjIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0SW50ZW50KGkpLmJ1aWxkKCkKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3Nob3J0Y3V0bWFuYWdlci9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9zaG9ydGN1dG1hbmFnZXIvU2hvcnRjdXRNYW5hZ2VyVGhyb3R0bGluZ1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3Nob3J0Y3V0bWFuYWdlci9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9zaG9ydGN1dG1hbmFnZXIvU2hvcnRjdXRNYW5hZ2VyVGhyb3R0bGluZ1Rlc3QuamF2YQppbmRleCA3NjI4YzgyLi43OWI2YmQxIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9zaG9ydGN1dG1hbmFnZXIvc3JjL2FuZHJvaWQvY29udGVudC9wbS9jdHMvc2hvcnRjdXRtYW5hZ2VyL1Nob3J0Y3V0TWFuYWdlclRocm90dGxpbmdUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvc2hvcnRjdXRtYW5hZ2VyL3NyYy9hbmRyb2lkL2NvbnRlbnQvcG0vY3RzL3Nob3J0Y3V0bWFuYWdlci9TaG9ydGN1dE1hbmFnZXJUaHJvdHRsaW5nVGVzdC5qYXZhCkBAIC0xOCw3ICsxOCw3IEBACiAKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LnBtLmN0cy5zaG9ydGN1dG1hbmFnZXIuY29tbW9uLkNvbnN0YW50cy5JTkxJTkVfUkVQTFlfUkVNT1RFX0lOUFVUX0NBUFRJT047CiAKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc2VydmVyLnBtLnNob3J0Y3V0bWFuYWdlcnRlc3QuU2hvcnRjdXRNYW5hZ2VyVGVzdFV0aWxzLnJlc2V0VGhyb3R0bGluZzsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc2VydmVyLnBtLnNob3J0Y3V0bWFuYWdlcnRlc3QuU2hvcnRjdXRNYW5hZ2VyVGVzdFV0aWxzLnJlc2V0QWxsVGhyb3R0bGluZzsKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc2VydmVyLnBtLnNob3J0Y3V0bWFuYWdlcnRlc3QuU2hvcnRjdXRNYW5hZ2VyVGVzdFV0aWxzLnJ1bkNvbW1hbmRGb3JOb091dHB1dDsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwpAQCAtNjQsNyArNjQsNyBAQAogICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHN1cGVyLnNldFVwKCk7CiAKLSAgICAgICAgcmVzZXRUaHJvdHRsaW5nKGdldEluc3RydW1lbnRhdGlvbigpKTsKKyAgICAgICAgcmVzZXRBbGxUaHJvdHRsaW5nKGdldEluc3RydW1lbnRhdGlvbigpKTsKIAogICAgICAgICBVaURldmljZS5nZXRJbnN0YW5jZShnZXRJbnN0cnVtZW50YXRpb24oKSkucHJlc3NIb21lKCk7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3Nob3J0Y3V0bWFuYWdlci9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9zaG9ydGN1dG1hbmFnZXIvU2hvcnRjdXRNYW5hZ2VyVXNhZ2VUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9zaG9ydGN1dG1hbmFnZXIvc3JjL2FuZHJvaWQvY29udGVudC9wbS9jdHMvc2hvcnRjdXRtYW5hZ2VyL1Nob3J0Y3V0TWFuYWdlclVzYWdlVGVzdC5qYXZhCmluZGV4IDk0YjViOTYuLmE4YWZhYWYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3Nob3J0Y3V0bWFuYWdlci9zcmMvYW5kcm9pZC9jb250ZW50L3BtL2N0cy9zaG9ydGN1dG1hbmFnZXIvU2hvcnRjdXRNYW5hZ2VyVXNhZ2VUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvc2hvcnRjdXRtYW5hZ2VyL3NyYy9hbmRyb2lkL2NvbnRlbnQvcG0vY3RzL3Nob3J0Y3V0bWFuYWdlci9TaG9ydGN1dE1hbmFnZXJVc2FnZVRlc3QuamF2YQpAQCAtNzgsNyArNzgsNyBAQAogCiAgICAgcHVibGljIHZvaWQgdGVzdFJlcG9ydFNob3J0Y3V0VXNlZCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CiAKLSAgICAgICAgcnVuV2l0aENhbGxlcihtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CisgICAgICAgIHJ1bldpdGhDYWxsZXJXaXRoU3RyaWN0TW9kZShtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CiAgICAgICAgICAgICBlbmFibGVNYW5pZmVzdEFjdGl2aXR5KCJMYXVuY2hlcl9tYW5pZmVzdF8yIiwgdHJ1ZSk7CiAKICAgICAgICAgICAgIHJldHJ5VW50aWwoKCkgLT4gZ2V0TWFuYWdlcigpLmdldE1hbmlmZXN0U2hvcnRjdXRzKCkuc2l6ZSgpID4gMCwKQEAgLTkyLDEzICs5MiwxMyBAQAogICAgICAgICBmaW5hbCBTdHJpbmcgaWRNYW5pZmVzdCA9ICJtczIxIjsKICAgICAgICAgZmluYWwgU3RyaW5nIGlkTm9uZXhpc3RhbmNlID0gIm5vbmV4aXN0ZW5jZSI7CiAKLSAgICAgICAgcnVuV2l0aENhbGxlcihtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CisgICAgICAgIHJ1bldpdGhDYWxsZXJXaXRoU3RyaWN0TW9kZShtUGFja2FnZUNvbnRleHQxLCAoKSAtPiB7CiAgICAgICAgICAgICBhc3NlcnRUcnVlKGdldE1hbmFnZXIoKS5zZXREeW5hbWljU2hvcnRjdXRzKGxpc3QoCiAgICAgICAgICAgICAgICAgICAgIG1ha2VTaG9ydGN1dChpZDEpLAogICAgICAgICAgICAgICAgICAgICBtYWtlU2hvcnRjdXQoaWQyKQogICAgICAgICAgICAgKSkpOwogICAgICAgICB9KTsKLSAgICAgICAgcnVuV2l0aENhbGxlcihtUGFja2FnZUNvbnRleHQyLCAoKSAtPiB7CisgICAgICAgIHJ1bldpdGhDYWxsZXJXaXRoU3RyaWN0TW9kZShtUGFja2FnZUNvbnRleHQyLCAoKSAtPiB7CiAgICAgICAgICAgICBhc3NlcnRUcnVlKGdldE1hbmFnZXIoKS5zZXREeW5hbWljU2hvcnRjdXRzKGxpc3QoCiAgICAgICAgICAgICAgICAgICAgIG1ha2VTaG9ydGN1dChpZDEpLAogICAgICAgICAgICAgICAgICAgICBtYWtlU2hvcnRjdXQoaWQzKQpAQCAtMTA5LDcgKzEwOSw3IEBACiAKICAgICAgICAgLy8gUmVwb3J0IHVzYWdlLgogICAgICAgICBmaW5hbCBsb25nIHN0YXJ0MSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gVVNBR0VfU1RBVFNfUkFOR0VfQUxMT1dBTkNFOwotICAgICAgICBydW5XaXRoQ2FsbGVyKG1QYWNrYWdlQ29udGV4dDIsICgpIC0+IGdldE1hbmFnZXIoKS5yZXBvcnRTaG9ydGN1dFVzZWQoaWQzKSk7CisgICAgICAgIHJ1bldpdGhDYWxsZXJXaXRoU3RyaWN0TW9kZShtUGFja2FnZUNvbnRleHQyLCAoKSAtPiBnZXRNYW5hZ2VyKCkucmVwb3J0U2hvcnRjdXRVc2VkKGlkMykpOwogICAgICAgICBmaW5hbCBsb25nIGVuZDEgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIFVTQUdFX1NUQVRTX1JBTkdFX0FMTE9XQU5DRTsKIAogICAgICAgICAvLyBDaGVjayB0aGUgbG9nLgpAQCAtMTE4LDcgKzExOCw3IEBACiAKICAgICAgICAgLy8gUmVwb3J0IHVzYWdlLgogICAgICAgICBmaW5hbCBsb25nIHN0YXJ0MiA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gVVNBR0VfU1RBVFNfUkFOR0VfQUxMT1dBTkNFOwotICAgICAgICBydW5XaXRoQ2FsbGVyKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IGdldE1hbmFnZXIoKS5yZXBvcnRTaG9ydGN1dFVzZWQoaWQxKSk7CisgICAgICAgIHJ1bldpdGhDYWxsZXJXaXRoU3RyaWN0TW9kZShtUGFja2FnZUNvbnRleHQxLCAoKSAtPiBnZXRNYW5hZ2VyKCkucmVwb3J0U2hvcnRjdXRVc2VkKGlkMSkpOwogICAgICAgICBmaW5hbCBsb25nIGVuZDIgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIFVTQUdFX1NUQVRTX1JBTkdFX0FMTE9XQU5DRTsKIAogICAgICAgICAvLyBDaGVjayB0aGUgbG9nLgpAQCAtMTI3LDggKzEyNyw4IEBACiAKICAgICAgICAgLy8gUmVwb3J0IHVzYWdlLgogICAgICAgICBmaW5hbCBsb25nIHN0YXJ0MyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gVVNBR0VfU1RBVFNfUkFOR0VfQUxMT1dBTkNFOwotICAgICAgICBydW5XaXRoQ2FsbGVyKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IGdldE1hbmFnZXIoKS5yZXBvcnRTaG9ydGN1dFVzZWQoaWROb25leGlzdGFuY2UpKTsKLSAgICAgICAgcnVuV2l0aENhbGxlcihtUGFja2FnZUNvbnRleHQxLCAoKSAtPiBnZXRNYW5hZ2VyKCkucmVwb3J0U2hvcnRjdXRVc2VkKGlkTWFuaWZlc3QpKTsKKyAgICAgICAgcnVuV2l0aENhbGxlcldpdGhTdHJpY3RNb2RlKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IGdldE1hbmFnZXIoKS5yZXBvcnRTaG9ydGN1dFVzZWQoaWROb25leGlzdGFuY2UpKTsKKyAgICAgICAgcnVuV2l0aENhbGxlcldpdGhTdHJpY3RNb2RlKG1QYWNrYWdlQ29udGV4dDEsICgpIC0+IGdldE1hbmFnZXIoKS5yZXBvcnRTaG9ydGN1dFVzZWQoaWRNYW5pZmVzdCkpOwogICAgICAgICBmaW5hbCBsb25nIGVuZDMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIFVTQUdFX1NUQVRTX1JBTkdFX0FMTE9XQU5DRTsKIAogICAgICAgICAvLyBDaGVjayB0aGUgbG9nLgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2hvcnRjdXRtYW5hZ2VyL3Rocm90dGxpbmcvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL3Nob3J0Y3V0bWFuYWdlci90aHJvdHRsaW5nL0FuZHJvaWQubWsKaW5kZXggNjJmOTU5ZS4uNTdkMDExNiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvc2hvcnRjdXRtYW5hZ2VyL3Rocm90dGxpbmcvQW5kcm9pZC5taworKysgYi90ZXN0cy90ZXN0cy9zaG9ydGN1dG1hbmFnZXIvdGhyb3R0bGluZy9BbmRyb2lkLm1rCkBAIC0yOSwxMSArMjksMTEgQEAKICAgICAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIC4uL2NvbW1vbi9zcmMpCiAKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCi0gICAgYW5kcm9pZC1zdXBwb3J0LXRlc3QgXAotICAgIGFuZHJvaWQtc3VwcG9ydC12NCBcCisgICAgYW5kcm9pZHgudGVzdC5ydWxlcyBcCisgICAgYW5kcm9pZHgubGVnYWN5X2xlZ2FjeS1zdXBwb3J0LXY0IFwKICAgICBtb2NraXRvLXRhcmdldC1taW51cy1qdW5pdDQgXAotICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwgXAotICAgIGN0c3Rlc3RydW5uZXIgXAorICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0IFwKKyAgICBjdHN0ZXN0cnVubmVyLWF4dCBcCiAgICAgdWItdWlhdXRvbWF0b3IgXAogICAgIFNob3J0Y3V0TWFuYWdlclRlc3RVdGlscwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zaG9ydGN1dG1hbmFnZXIvdGhyb3R0bGluZy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdGVzdHMvc2hvcnRjdXRtYW5hZ2VyL3Rocm90dGxpbmcvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBmY2JjMTY3Li4wZDQ0NGQ0IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9zaG9ydGN1dG1hbmFnZXIvdGhyb3R0bGluZy9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL3Nob3J0Y3V0bWFuYWdlci90aHJvdHRsaW5nL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTIyLDYgKzIyLDggQEAKICAgICA8dXNlcy1zZGsgYW5kcm9pZDptaW5TZGtWZXJzaW9uPSIyNSIgYW5kcm9pZDp0YXJnZXRTZGtWZXJzaW9uPSIyNSIgLz4KIAogICAgIDxhcHBsaWNhdGlvbj4KKyAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CisKICAgICAgICAgPHJlY2VpdmVyCiAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IlNob3J0Y3V0TWFuYWdlclRocm90dGxpbmdUZXN0UmVjZWl2ZXIiCiAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIj4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NpbXBsZXBlcmYvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL3NpbXBsZXBlcmYvQW5kcm9pZC5tawppbmRleCBlYWVjOTIwLi5kNjExYmQzIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9zaW1wbGVwZXJmL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvdGVzdHMvc2ltcGxlcGVyZi9BbmRyb2lkLm1rCkBAIC0xNiw5ICsxNiw5IEBACiAgIGxpYnNpbXBsZXBlcmZfY3RzX3Rlc3QgXAogCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTICs9IFwKLSAgbGliYmFja3RyYWNlX29mZmxpbmUgXAogICBsaWJiYWNrdHJhY2UgXAotICBsaWJ1bndpbmQgXAorICBsaWJ1bndpbmRzdGFjayBcCisgIGxpYmRleGZpbGUgXAogICBsaWJ6aXBhcmNoaXZlIFwKICAgbGlieiBcCiAgIGxpYmd0ZXN0IFwKQEAgLTM2LDcgKzM2LDYgQEAKICAgbGliTExWTVN1cHBvcnQgXAogICBsaWJwcm90b2J1Zi1jcHAtbGl0ZSBcCiAgIGxpYmV2ZW50IFwKLSAgbGliYyBcCiAKIExPQ0FMX1BPU1RfTElOS19DTUQgPSAgXAogICBUTVBfRklMRT1gbWt0ZW1wICQoT1VUX0RJUikvc2ltcGxlcGVyZi1wb3N0LWxpbmstWFhYWFhYWFhYWGAgJiYgXApAQCAtNDcsNyArNDYsNiBAQAogTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKIAogTE9DQUxfQ1RTX1RFU1RfUEFDS0FHRSA6PSBhbmRyb2lkLnNpbXBsZXBlcmYKLUxPQ0FMX0ZPUkNFX1NUQVRJQ19FWEVDVVRBQkxFIDo9IHRydWUKIGluY2x1ZGUgJChMTFZNX0RFVklDRV9CVUlMRF9NSykKIGluY2x1ZGUgJChCVUlMRF9DVFNfRVhFQ1VUQUJMRSkKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2ltcGxlcGVyZi9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy90ZXN0cy9zaW1wbGVwZXJmL0FuZHJvaWRUZXN0LnhtbAppbmRleCA4OWZhYTBmLi5lZWI2Zjk5IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9zaW1wbGVwZXJmL0FuZHJvaWRUZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9zaW1wbGVwZXJmL0FuZHJvaWRUZXN0LnhtbApAQCAtMTQsNiArMTQsNyBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIFNpbXBsZXBlcmYgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImJpb25pYyIgLz4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50YXJnZXRwcmVwLkZpbGVQdXNoZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJ0cnVlIiAvPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2ltcGxlcGVyZi9DdHNTaW1wbGVwZXJmRGVidWdBcHAvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL3NpbXBsZXBlcmYvQ3RzU2ltcGxlcGVyZkRlYnVnQXBwL0FuZHJvaWQubWsKaW5kZXggMmExNzJiNS4uNGZlZjgyZCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvc2ltcGxlcGVyZi9DdHNTaW1wbGVwZXJmRGVidWdBcHAvQW5kcm9pZC5taworKysgYi90ZXN0cy90ZXN0cy9zaW1wbGVwZXJmL0N0c1NpbXBsZXBlcmZEZWJ1Z0FwcC9BbmRyb2lkLm1rCkBAIC0yMCw3ICsyMCw5IEBACiAKIExPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCiAKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjdHN0ZXN0cnVubmVyIGxlZ2FjeS1hbmRyb2lkLXRlc3QKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjdHN0ZXN0cnVubmVyLWF4dAorCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicwogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCAuKQogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zaW1wbGVwZXJmL0N0c1NpbXBsZXBlcmZEZWJ1Z0FwcC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdGVzdHMvc2ltcGxlcGVyZi9DdHNTaW1wbGVwZXJmRGVidWdBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBiMzUwOWM4Li45ZjRhOWUyIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9zaW1wbGVwZXJmL0N0c1NpbXBsZXBlcmZEZWJ1Z0FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL3NpbXBsZXBlcmYvQ3RzU2ltcGxlcGVyZkRlYnVnQXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTIyLDUgKzIyLDUgQEAKICAgICA8L2FwcGxpY2F0aW9uPgogICAgIDxpbnN0cnVtZW50YXRpb24KICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5zaW1wbGVwZXJmIgotICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiIC8+CisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIiAvPgogPC9tYW5pZmVzdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zbGljZS9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvc2xpY2UvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDQwZDE5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvc2xpY2UvQW5kcm9pZC5tawpAQCAtMCwwICsxLDUyIEBACisjIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKKyMgZG9uJ3QgaW5jbHVkZSB0aGlzIHBhY2thZ2UgaW4gYW55IHRhcmdldAorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKyMgYW5kIHdoZW4gYnVpbHQgZXhwbGljaXRseSBwdXQgaXQgaW4gdGhlIGRhdGEgcGFydGl0aW9uCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQorCisjIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0CitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzCisKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCisgICAgYW5kcm9pZHgudGVzdC5ydWxlcyBcCisgICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgXAorICAgIGN0c2RldmljZXV0aWxsZWdhY3ktYXh0IFwKKyAgICBjdHN0ZXN0cnVubmVyLWF4dCBcCisgICAgbWV0cmljcy1oZWxwZXItbGliIFwKKyAgICBtb2NraXRvLXRhcmdldC1pbmxpbmUtbWludXMtanVuaXQ0IFwKKyAgICBwbGF0Zm9ybS10ZXN0LWFubm90YXRpb25zIFwKKyAgICB1Yi11aWF1dG9tYXRvcgorCitMT0NBTF9NVUxUSUxJQiA6PSBib3RoCisKK0xPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJkZXhtYWtlcmp2bXRpYWdlbnQgXAorICAgIGxpYm11bHRpcGxlanZtdGlhZ2VudHNpbnRlcmZlcmVuY2VhZ2VudAorCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNTbGljZVRlc3RDYXNlcworTE9DQUxfUFJJVkFURV9QTEFURk9STV9BUElTIDo9IHRydWUKKworaW5jbHVkZSAkKEJVSUxEX0NUU19QQUNLQUdFKQorCitpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zbGljZS9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdGVzdHMvc2xpY2UvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWIyMWViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvc2xpY2UvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDYwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iYW5kcm9pZC5zbGljZS5jdHMiPgorCisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5CSU5EX1NMSUNFIiAvPgorCisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFiZWw9IkFuZHJvaWQgVGVzdENhc2UiCisgICAgICAgICAgICAgICAgYW5kcm9pZDppY29uPSJAZHJhd2FibGUvc2l6ZV80OHg0OCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm1heFJlY2VudHM9IjEiCisgICAgICAgICAgICAgICAgYW5kcm9pZDptdWx0aUFyY2g9InRydWUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpzdXBwb3J0c1J0bD0idHJ1ZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmRlYnVnZ2FibGU9InRydWUiPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKworICAgICAgICA8cHJvdmlkZXIgYW5kcm9pZDpuYW1lPSIuU2xpY2VQcm92aWRlciIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6YXV0aG9yaXRpZXM9ImFuZHJvaWQuc2xpY2UuY3RzIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwcm9jZXNzPSI6c2xpY2VfcHJvY2VzcyIgLz4KKworICAgICAgICA8cHJvdmlkZXIgYW5kcm9pZDpuYW1lPSIuTG9jYWxTbGljZVByb3ZpZGVyIgorICAgICAgICAgICAgYW5kcm9pZDphdXRob3JpdGllcz0iYW5kcm9pZC5zbGljZS5jdHMubG9jYWwiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc2xpY2UuY3RzLmFjdGlvbi5URVNUX0FDVElPTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5ERUZBVUxUIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYXBwLnNsaWNlLmNhdGVnb3J5LlNMSUNFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L3Byb3ZpZGVyPgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5MYXVuY2hlciI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuREVGQVVMVCIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5IT01FIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgIDwvYXBwbGljYXRpb24+CisKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLnNsaWNlLmN0cyIKKyAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBvZiBhbmRyb2lkLnNsaWNlIj4KKyAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9Imxpc3RlbmVyIgorICAgICAgICAgICAgYW5kcm9pZDp2YWx1ZT0iY29tLmFuZHJvaWQuY3RzLnJ1bm5lci5DdHNUZXN0UnVuTGlzdGVuZXIiIC8+CisgICAgPC9pbnN0cnVtZW50YXRpb24+CisKKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zbGljZS9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy90ZXN0cy9zbGljZS9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRmZGI2ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3NsaWNlL0FuZHJvaWRUZXN0LnhtbApAQCAtMCwwICsxLDM1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIFNsaWNlIHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CisgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJtaXNjIiAvPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJDdHNTbGljZVRlc3RDYXNlcy5hcGsiIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5SdW5Db21tYW5kVGFyZ2V0UHJlcGFyZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bi1jb21tYW5kIiB2YWx1ZT0icG0gZ3JhbnQgYW5kcm9pZC5zbGljZS5jdHMgYW5kcm9pZC5wZXJtaXNzaW9uLkJJTkRfU0xJQ0UiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVhcmRvd24tY29tbWFuZCIgdmFsdWU9InBtIHJldm9rZSBhbmRyb2lkLnNsaWNlLmN0cyBhbmRyb2lkLnBlcm1pc3Npb24uQklORF9TTElDRSIvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5BbmRyb2lkSlVuaXRUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0icGFja2FnZSIgdmFsdWU9ImFuZHJvaWQuc2xpY2UuY3RzIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjFtIiAvPgorICAgIDwvdGVzdD4KKworICAgIDwhLS0gQ29udHJvbGxlciB0aGF0IHdpbGwgc2tpcCB0aGUgbW9kdWxlIGlmIGEgbmF0aXZlIGJyaWRnZSBzaXR1YXRpb24gaXMgZGV0ZWN0ZWQgLS0+CisgICAgPCEtLSBGb3IgZXhhbXBsZTogbW9kdWxlIHdhbnRzIHRvIHJ1biBhcm0zMiBhbmQgZGV2aWNlIGlzIHg4NiAtLT4KKyAgICA8b2JqZWN0IHR5cGU9Im1vZHVsZV9jb250cm9sbGVyIiBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuc3VpdGUubW9kdWxlLk5hdGl2ZUJyaWRnZU1vZHVsZUNvbnRyb2xsZXIiIC8+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zbGljZS9yZXMvZHJhd2FibGUvc2l6ZV80OHg0OC5qcGcgYi90ZXN0cy90ZXN0cy9zbGljZS9yZXMvZHJhd2FibGUvc2l6ZV80OHg0OC5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMyMjkxZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3NsaWNlL3Jlcy9kcmF3YWJsZS9zaXplXzQ4eDQ4LmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zbGljZS9zcmMvYW5kcm9pZC9zbGljZS9jdHMvTGF1bmNoZXIuamF2YSBiL3Rlc3RzL3Rlc3RzL3NsaWNlL3NyYy9hbmRyb2lkL3NsaWNlL2N0cy9MYXVuY2hlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MWY5NjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zbGljZS9zcmMvYW5kcm9pZC9zbGljZS9jdHMvTGF1bmNoZXIuamF2YQpAQCAtMCwwICsxLDIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorICogZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZQorICogTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworICogcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zbGljZS5jdHM7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKKworcHVibGljIGNsYXNzIExhdW5jaGVyIGV4dGVuZHMgQWN0aXZpdHkgeworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2xpY2Uvc3JjL2FuZHJvaWQvc2xpY2UvY3RzL0xvY2FsU2xpY2VQcm92aWRlci5qYXZhIGIvdGVzdHMvdGVzdHMvc2xpY2Uvc3JjL2FuZHJvaWQvc2xpY2UvY3RzL0xvY2FsU2xpY2VQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzYjEzY2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zbGljZS9zcmMvYW5kcm9pZC9zbGljZS9jdHMvTG9jYWxTbGljZVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisgKiBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlCisgKiBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisgKiBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNsaWNlLmN0czsKKworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLm1vY2s7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ud2l0aFNldHRpbmdzOworCitpbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKK2ltcG9ydCBhbmRyb2lkLmFwcC5zbGljZS5TbGljZTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5zbGljZS5TbGljZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5hcHAuc2xpY2UuU2xpY2VTcGVjOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0V3JhcHBlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5Qcm92aWRlckluZm87CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworCitpbXBvcnQgb3JnLm1vY2tpdG8uQW5zd2VyczsKK2ltcG9ydCBvcmcubW9ja2l0by5zdHViYmluZy5BbnN3ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitwdWJsaWMgY2xhc3MgTG9jYWxTbGljZVByb3ZpZGVyIGV4dGVuZHMgU2xpY2VQcm92aWRlciB7CisgICAgcHVibGljIHN0YXRpYyBTbGljZVByb3ZpZGVyIHNQcm94eTsKKyAgICBwdWJsaWMgc3RhdGljIEFuc3dlciBzQW5zd2VyOworCisgICAgcHJpdmF0ZSBTbGljZU1hbmFnZXIgbVNsaWNlU2VydmljZTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlKCkgeworICAgICAgICByZXR1cm4gc1Byb3h5ID09IG51bGwgfHwgc1Byb3h5Lm9uQ3JlYXRlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYXR0YWNoSW5mbyhDb250ZXh0IGNvbnRleHQsIFByb3ZpZGVySW5mbyBpbmZvKSB7CisgICAgICAgIG1TbGljZVNlcnZpY2UgPSBtb2NrKFNsaWNlTWFuYWdlci5jbGFzcywgd2l0aFNldHRpbmdzKCkKKyAgICAgICAgICAgICAgICAuc3BpZWRJbnN0YW5jZShjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5TTElDRV9TRVJWSUNFKSkKKyAgICAgICAgICAgICAgICAuZGVmYXVsdEFuc3dlcihpbnZvY2F0aW9uIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgQW5zd2VyIHMgPSBzQW5zd2VyICE9IG51bGwgPyBzQW5zd2VyIDogQW5zd2Vycy5DQUxMU19SRUFMX01FVEhPRFM7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzLmFuc3dlcihpbnZvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICB9KSk7CisgICAgICAgIENvbnRleHQgd3JhcHBlZCA9IG5ldyBDb250ZXh0V3JhcHBlcihjb250ZXh0KSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0U3lzdGVtU2VydmljZShTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgICAgIGlmIChDb250ZXh0LlNMSUNFX1NFUlZJQ0UuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtU2xpY2VTZXJ2aWNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0U3lzdGVtU2VydmljZShuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgc3VwZXIuYXR0YWNoSW5mbyh3cmFwcGVkLCBpbmZvKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2xpY2Ugb25CaW5kU2xpY2UoVXJpIHNsaWNlVXJpLCBTZXQ8U2xpY2VTcGVjPiBzcGVjcykgeworICAgICAgICBpZiAoc1Byb3h5ICE9IG51bGwpIHJldHVybiBzUHJveHkub25CaW5kU2xpY2Uoc2xpY2VVcmksIHNwZWNzKTsKKyAgICAgICAgcmV0dXJuIHN1cGVyLm9uQmluZFNsaWNlKHNsaWNlVXJpLCBzcGVjcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFVyaSBvbk1hcEludGVudFRvVXJpKEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgaWYgKHNQcm94eSAhPSBudWxsKSByZXR1cm4gc1Byb3h5Lm9uTWFwSW50ZW50VG9VcmkoaW50ZW50KTsKKyAgICAgICAgcmV0dXJuIHN1cGVyLm9uTWFwSW50ZW50VG9VcmkoaW50ZW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxVcmk+IG9uR2V0U2xpY2VEZXNjZW5kYW50cyhVcmkgdXJpKSB7CisgICAgICAgIGlmIChzUHJveHkgIT0gbnVsbCkgcmV0dXJuIHNQcm94eS5vbkdldFNsaWNlRGVzY2VuZGFudHModXJpKTsKKyAgICAgICAgcmV0dXJuIHN1cGVyLm9uR2V0U2xpY2VEZXNjZW5kYW50cyh1cmkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU2xpY2VQaW5uZWQoVXJpIHNsaWNlVXJpKSB7CisgICAgICAgIGlmIChzUHJveHkgIT0gbnVsbCkgc1Byb3h5Lm9uU2xpY2VQaW5uZWQoc2xpY2VVcmkpOworICAgICAgICBzdXBlci5vblNsaWNlUGlubmVkKHNsaWNlVXJpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblNsaWNlVW5waW5uZWQoVXJpIHNsaWNlVXJpKSB7CisgICAgICAgIGlmIChzUHJveHkgIT0gbnVsbCkgc1Byb3h5Lm9uU2xpY2VVbnBpbm5lZChzbGljZVVyaSk7CisgICAgICAgIHN1cGVyLm9uU2xpY2VVbnBpbm5lZChzbGljZVVyaSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFBlbmRpbmdJbnRlbnQgb25DcmVhdGVQZXJtaXNzaW9uUmVxdWVzdChVcmkgc2xpY2VVcmkpIHsKKyAgICAgICAgaWYgKHNQcm94eSAhPSBudWxsKSByZXR1cm4gc1Byb3h5Lm9uQ3JlYXRlUGVybWlzc2lvblJlcXVlc3Qoc2xpY2VVcmkpOworICAgICAgICByZXR1cm4gc3VwZXIub25DcmVhdGVQZXJtaXNzaW9uUmVxdWVzdChzbGljZVVyaSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2xpY2Uvc3JjL2FuZHJvaWQvc2xpY2UvY3RzL1NsaWNlQmluZGluZ1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3NsaWNlL3NyYy9hbmRyb2lkL3NsaWNlL2N0cy9TbGljZUJpbmRpbmdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE2NTVjZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3NsaWNlL3NyYy9hbmRyb2lkL3NsaWNlL2N0cy9TbGljZUJpbmRpbmdUZXN0LmphdmEKQEAgLTAsMCArMSwyMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisgKiBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlCisgKiBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisgKiBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNsaWNlLmN0czsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3RFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQuQ2FuY2VsZWRFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5hcHAuc2xpY2UuU2xpY2U7CitpbXBvcnQgYW5kcm9pZC5hcHAuc2xpY2UuU2xpY2VJdGVtOworaW1wb3J0IGFuZHJvaWQuYXBwLnNsaWNlLlNsaWNlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5zbGljZS5TbGljZVNwZWM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkljb247CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQuc2xpY2UuY3RzLlNsaWNlUHJvdmlkZXIuVGVzdFBhcmNlbDsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBTbGljZUJpbmRpbmdUZXN0IHsKKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzRmxhZyA9IGZhbHNlOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVXJpIEJBU0VfVVJJID0gVXJpLnBhcnNlKCJjb250ZW50Oi8vYW5kcm9pZC5zbGljZS5jdHMvIik7CisgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0ID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpOworICAgIHByaXZhdGUgZmluYWwgU2xpY2VNYW5hZ2VyIG1TbGljZU1hbmFnZXIgPSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKFNsaWNlTWFuYWdlci5jbGFzcyk7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9jZXNzKCkgeworICAgICAgICBzRmxhZyA9IGZhbHNlOworICAgICAgICBtU2xpY2VNYW5hZ2VyLmJpbmRTbGljZShCQVNFX1VSSS5idWlsZFVwb24oKS5hcHBlbmRQYXRoKCJzZXRfZmxhZyIpLmJ1aWxkKCksCisgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuZW1wdHlTZXQoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHNGbGFnKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUeXBlKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoU2xpY2VQcm92aWRlci5TTElDRV9UWVBFLAorICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLmdldFR5cGUoQkFTRV9VUkkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTbGljZVVyaSgpIHsKKyAgICAgICAgU2xpY2UgcyA9IG1TbGljZU1hbmFnZXIuYmluZFNsaWNlKEJBU0VfVVJJLAorICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLmVtcHR5U2V0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoQkFTRV9VUkksIHMuZ2V0VXJpKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN1YlNsaWNlKCkgeworICAgICAgICBVcmkgdXJpID0gQkFTRV9VUkkuYnVpbGRVcG9uKCkuYXBwZW5kUGF0aCgic3Vic2xpY2UiKS5idWlsZCgpOworICAgICAgICBTbGljZSBzID0gbVNsaWNlTWFuYWdlci5iaW5kU2xpY2UodXJpLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHVyaSwgcy5nZXRVcmkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBzLmdldEl0ZW1zKCkuc2l6ZSgpKTsKKworICAgICAgICBTbGljZUl0ZW0gaXRlbSA9IHMuZ2V0SXRlbXMoKS5nZXQoMCk7CisgICAgICAgIGFzc2VydEVxdWFscyhTbGljZUl0ZW0uRk9STUFUX1NMSUNFLCBpdGVtLmdldEZvcm1hdCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzdWJzbGljZSIsIGl0ZW0uZ2V0U3ViVHlwZSgpKTsKKyAgICAgICAgLy8gVGhlIGl0ZW0gc2hvdWxkIHN0YXJ0IHdpdGggdGhlIHNhbWUgVXJpIGFzIHRoZSBwYXJlbnQsIGJ1dCBiZSBkaWZmZXJlbnQuCisgICAgICAgIGFzc2VydFRydWUoaXRlbS5nZXRTbGljZSgpLmdldFVyaSgpLnRvU3RyaW5nKCkuc3RhcnRzV2l0aCh1cmkudG9TdHJpbmcoKSkpOworICAgICAgICBhc3NlcnROb3RFcXVhbHModXJpLCBpdGVtLmdldFNsaWNlKCkuZ2V0VXJpKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRleHQoKSB7CisgICAgICAgIFVyaSB1cmkgPSBCQVNFX1VSSS5idWlsZFVwb24oKS5hcHBlbmRQYXRoKCJ0ZXh0IikuYnVpbGQoKTsKKyAgICAgICAgU2xpY2UgcyA9IG1TbGljZU1hbmFnZXIuYmluZFNsaWNlKHVyaSwKKyAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5lbXB0eVNldCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHVyaSwgcy5nZXRVcmkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBzLmdldEl0ZW1zKCkuc2l6ZSgpKTsKKworICAgICAgICBTbGljZUl0ZW0gaXRlbSA9IHMuZ2V0SXRlbXMoKS5nZXQoMCk7CisgICAgICAgIGFzc2VydEVxdWFscyhTbGljZUl0ZW0uRk9STUFUX1RFWFQsIGl0ZW0uZ2V0Rm9ybWF0KCkpOworICAgICAgICAvLyBUT0RPOiBUZXN0IHNwYW5uYWJsZXMgaGVyZS4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCB0ZXh0IiwgaXRlbS5nZXRUZXh0KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEljb24oKSB7CisgICAgICAgIFVyaSB1cmkgPSBCQVNFX1VSSS5idWlsZFVwb24oKS5hcHBlbmRQYXRoKCJpY29uIikuYnVpbGQoKTsKKyAgICAgICAgU2xpY2UgcyA9IG1TbGljZU1hbmFnZXIuYmluZFNsaWNlKHVyaSwKKyAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5lbXB0eVNldCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHVyaSwgcy5nZXRVcmkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBzLmdldEl0ZW1zKCkuc2l6ZSgpKTsKKworICAgICAgICBTbGljZUl0ZW0gaXRlbSA9IHMuZ2V0SXRlbXMoKS5nZXQoMCk7CisgICAgICAgIGFzc2VydEVxdWFscyhTbGljZUl0ZW0uRk9STUFUX0lNQUdFLCBpdGVtLmdldEZvcm1hdCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEljb24uY3JlYXRlV2l0aFJlc291cmNlKG1Db250ZXh0LCBSLmRyYXdhYmxlLnNpemVfNDh4NDgpLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgaXRlbS5nZXRJY29uKCkudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWN0aW9uKCkgeworICAgICAgICBzRmxhZyA9IGZhbHNlOworICAgICAgICBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICAgICAgQnJvYWRjYXN0UmVjZWl2ZXIgcmVjZWl2ZXIgPSBuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgICAgICAgICBzRmxhZyA9IHRydWU7CisgICAgICAgICAgICAgICAgbGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIG1Db250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIocmVjZWl2ZXIsCisgICAgICAgICAgICAgICAgbmV3IEludGVudEZpbHRlcihtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpICsgIi5hY3Rpb24iKSk7CisgICAgICAgIFVyaSB1cmkgPSBCQVNFX1VSSS5idWlsZFVwb24oKS5hcHBlbmRQYXRoKCJhY3Rpb24iKS5idWlsZCgpOworICAgICAgICBTbGljZSBzID0gbVNsaWNlTWFuYWdlci5iaW5kU2xpY2UodXJpLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHVyaSwgcy5nZXRVcmkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBzLmdldEl0ZW1zKCkuc2l6ZSgpKTsKKworICAgICAgICBTbGljZUl0ZW0gaXRlbSA9IHMuZ2V0SXRlbXMoKS5nZXQoMCk7CisgICAgICAgIGFzc2VydEVxdWFscyhTbGljZUl0ZW0uRk9STUFUX0FDVElPTiwgaXRlbS5nZXRGb3JtYXQoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpdGVtLmdldEFjdGlvbigpLnNlbmQoKTsKKyAgICAgICAgfSBjYXRjaCAoQ2FuY2VsZWRFeGNlcHRpb24gZSkgeworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxhdGNoLmF3YWl0KDEwMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKHNGbGFnKTsKKyAgICAgICAgbUNvbnRleHQudW5yZWdpc3RlclJlY2VpdmVyKHJlY2VpdmVyKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnQoKSB7CisgICAgICAgIFVyaSB1cmkgPSBCQVNFX1VSSS5idWlsZFVwb24oKS5hcHBlbmRQYXRoKCJpbnQiKS5idWlsZCgpOworICAgICAgICBTbGljZSBzID0gbVNsaWNlTWFuYWdlci5iaW5kU2xpY2UodXJpLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHVyaSwgcy5nZXRVcmkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBzLmdldEl0ZW1zKCkuc2l6ZSgpKTsKKworICAgICAgICBTbGljZUl0ZW0gaXRlbSA9IHMuZ2V0SXRlbXMoKS5nZXQoMCk7CisgICAgICAgIGFzc2VydEVxdWFscyhTbGljZUl0ZW0uRk9STUFUX0lOVCwgaXRlbS5nZXRGb3JtYXQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygweGZmMTIxMjEyLCBpdGVtLmdldEludCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUaW1lc3RhbXAoKSB7CisgICAgICAgIFVyaSB1cmkgPSBCQVNFX1VSSS5idWlsZFVwb24oKS5hcHBlbmRQYXRoKCJ0aW1lc3RhbXAiKS5idWlsZCgpOworICAgICAgICBTbGljZSBzID0gbVNsaWNlTWFuYWdlci5iaW5kU2xpY2UodXJpLAorICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLmVtcHR5U2V0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHModXJpLCBzLmdldFVyaSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHMuZ2V0SXRlbXMoKS5zaXplKCkpOworCisgICAgICAgIFNsaWNlSXRlbSBpdGVtID0gcy5nZXRJdGVtcygpLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNsaWNlSXRlbS5GT1JNQVRfTE9ORywgaXRlbS5nZXRGb3JtYXQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MywgaXRlbS5nZXRMb25nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEhpbnRzKCkgeworICAgICAgICAvLyBOb3RlIHRoaXMgdGVzdHMgdGhhdCBoaW50cyBhcmUgcHJvcGFnYXRlZCB0aHJvdWdoIHRvIHRoZSBjbGllbnQgYnV0IG5vdCB0aGF0IGFueSBzcGVjaWZpYworICAgICAgICAvLyBoaW50cyBoYXZlIGFueSBlZmZlY3RzLgorICAgICAgICBVcmkgdXJpID0gQkFTRV9VUkkuYnVpbGRVcG9uKCkuYXBwZW5kUGF0aCgiaGludHMiKS5idWlsZCgpOworICAgICAgICBTbGljZSBzID0gbVNsaWNlTWFuYWdlci5iaW5kU2xpY2UodXJpLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHVyaSwgcy5nZXRVcmkoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoU2xpY2UuSElOVF9MSVNUKSwgcy5nZXRIaW50cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoU2xpY2UuSElOVF9USVRMRSksIHMuZ2V0SXRlbXMoKS5nZXQoMCkuZ2V0SGludHMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KFNsaWNlLkhJTlRfTk9fVElOVCwgU2xpY2UuSElOVF9MQVJHRSksCisgICAgICAgICAgICAgICAgcy5nZXRJdGVtcygpLmdldCgxKS5nZXRIaW50cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNIaW50cygpIHsKKyAgICAgICAgVXJpIHVyaSA9IEJBU0VfVVJJLmJ1aWxkVXBvbigpLmFwcGVuZFBhdGgoImhpbnRzIikuYnVpbGQoKTsKKyAgICAgICAgU2xpY2UgcyA9IG1TbGljZU1hbmFnZXIuYmluZFNsaWNlKHVyaSwgQ29sbGVjdGlvbnMuZW1wdHlTZXQoKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShzLmdldEl0ZW1zKCkuZ2V0KDApLmhhc0hpbnQoU2xpY2UuSElOVF9USVRMRSkpOworICAgICAgICBhc3NlcnRGYWxzZShzLmdldEl0ZW1zKCkuZ2V0KDApLmhhc0hpbnQoU2xpY2UuSElOVF9MSVNUKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QnVuZGxlKCkgeworICAgICAgICBVcmkgdXJpID0gQkFTRV9VUkkuYnVpbGRVcG9uKCkuYXBwZW5kUGF0aCgiYnVuZGxlIikuYnVpbGQoKTsKKyAgICAgICAgU2xpY2UgcyA9IG1TbGljZU1hbmFnZXIuYmluZFNsaWNlKHVyaSwgQ29sbGVjdGlvbnMuZW1wdHlTZXQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh1cmksIHMuZ2V0VXJpKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcy5nZXRJdGVtcygpLnNpemUoKSk7CisKKyAgICAgICAgU2xpY2VJdGVtIGl0ZW0gPSBzLmdldEl0ZW1zKCkuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoU2xpY2VJdGVtLkZPUk1BVF9CVU5ETEUsIGl0ZW0uZ2V0Rm9ybWF0KCkpOworICAgICAgICBCdW5kbGUgYiA9IGl0ZW0uZ2V0QnVuZGxlKCk7CisgICAgICAgIGIuc2V0Q2xhc3NMb2FkZXIoZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBUZXN0UGFyY2VsKCksIGIuZ2V0UGFyY2VsYWJsZSgiYSIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXREZXNjZW5kYW50cygpIHsKKyAgICAgICAgQ29sbGVjdGlvbjxVcmk+IGFsbFVyaXMgPSBtU2xpY2VNYW5hZ2VyLmdldFNsaWNlRGVzY2VuZGFudHMoQkFTRV9VUkkpOworICAgICAgICBhc3NlcnRFcXVhbHMoU2xpY2VQcm92aWRlci5QQVRIUy5sZW5ndGgsIGFsbFVyaXMuc2l6ZSgpKTsKKyAgICAgICAgSXRlcmF0b3I8VXJpPiBpdCA9IGFsbFVyaXMuaXRlcmF0b3IoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTbGljZVByb3ZpZGVyLlBBVEhTLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoU2xpY2VQcm92aWRlci5QQVRIU1tpXSwgaXQubmV4dCgpLmdldFBhdGgoKSk7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVNsaWNlTWFuYWdlci5nZXRTbGljZURlc2NlbmRhbnRzKAorICAgICAgICAgICAgICAgIEJBU0VfVVJJLmJ1aWxkVXBvbigpLmFwcGVuZFBhdGgoIi9ub3RoaW5nIikuYnVpbGQoKSkuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTbGljZVNwZWMoKSB7CisgICAgICAgIFVyaSB1cmkgPSBCQVNFX1VSSS5idWlsZFVwb24oKS5hcHBlbmRQYXRoKCJzcGVjIikuYnVpbGQoKTsKKyAgICAgICAgU2xpY2UgcyA9IG1TbGljZU1hbmFnZXIuYmluZFNsaWNlKHVyaSwgQ29sbGVjdGlvbnMuZW1wdHlTZXQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgU2xpY2VTcGVjKFNsaWNlUHJvdmlkZXIuU1BFQ19UWVBFLCBTbGljZVByb3ZpZGVyLlNQRUNfUkVWKSwgcy5nZXRTcGVjKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NsaWNlL3NyYy9hbmRyb2lkL3NsaWNlL2N0cy9TbGljZUJ1aWxkZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9zbGljZS9zcmMvYW5kcm9pZC9zbGljZS9jdHMvU2xpY2VCdWlsZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZjNhYzEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zbGljZS9zcmMvYW5kcm9pZC9zbGljZS9jdHMvU2xpY2VCdWlsZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorICogZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZQorICogTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworICogcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zbGljZS5jdHM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5hcHAuUmVtb3RlSW5wdXQ7CitpbXBvcnQgYW5kcm9pZC5hcHAuc2xpY2UuU2xpY2U7CitpbXBvcnQgYW5kcm9pZC5hcHAuc2xpY2UuU2xpY2VJdGVtOworaW1wb3J0IGFuZHJvaWQuYXBwLnNsaWNlLlNsaWNlU3BlYzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuSWNvbjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBTbGljZUJ1aWxkZXJUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVyaSBCQVNFX1VSSSA9IFVyaS5wYXJzZSgiY29udGVudDovL2FuZHJvaWQuc2xpY2UuY3RzLyIpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNsaWNlU3BlYyBTUEVDID0gbmV3IFNsaWNlU3BlYygiIiwgMSk7CisgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0ID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpOworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW50KCkgeworICAgICAgICBTbGljZSBzID0gbmV3IFNsaWNlLkJ1aWxkZXIoQkFTRV9VUkksIFNQRUMpCisgICAgICAgICAgICAgICAgLmFkZEludCgweGZmMTIxMjEyLCAic3VidHlwZSIsIEFycmF5cy5hc0xpc3QoU2xpY2UuSElOVF9USVRMRSkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhCQVNFX1VSSSwgcy5nZXRVcmkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBzLmdldEl0ZW1zKCkuc2l6ZSgpKTsKKworICAgICAgICBTbGljZUl0ZW0gaXRlbSA9IHMuZ2V0SXRlbXMoKS5nZXQoMCk7CisgICAgICAgIGFzc2VydEVxdWFscyhTbGljZUl0ZW0uRk9STUFUX0lOVCwgaXRlbS5nZXRGb3JtYXQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygweGZmMTIxMjEyLCBpdGVtLmdldEludCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzdWJ0eXBlIiwgaXRlbS5nZXRTdWJUeXBlKCkpOworICAgICAgICBhc3NlcnRUcnVlKGl0ZW0uaGFzSGludChTbGljZS5ISU5UX1RJVExFKSk7CisKKyAgICAgICAgdmVyaWZ5U2xpY2Uocyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SWNvbigpIHsKKyAgICAgICAgSWNvbiBpID0gSWNvbi5jcmVhdGVXaXRoUmVzb3VyY2UobUNvbnRleHQsIFIuZHJhd2FibGUuc2l6ZV80OHg0OCk7CisgICAgICAgIFNsaWNlIHMgPSBuZXcgU2xpY2UuQnVpbGRlcihCQVNFX1VSSSwgU1BFQykKKyAgICAgICAgICAgICAgICAuYWRkSWNvbihpLCAic3VidHlwZSIsIEFycmF5cy5hc0xpc3QoU2xpY2UuSElOVF9USVRMRSkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhCQVNFX1VSSSwgcy5nZXRVcmkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBzLmdldEl0ZW1zKCkuc2l6ZSgpKTsKKworICAgICAgICBTbGljZUl0ZW0gaXRlbSA9IHMuZ2V0SXRlbXMoKS5nZXQoMCk7CisgICAgICAgIGFzc2VydEVxdWFscyhTbGljZUl0ZW0uRk9STUFUX0lNQUdFLCBpdGVtLmdldEZvcm1hdCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGksIGl0ZW0uZ2V0SWNvbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzdWJ0eXBlIiwgaXRlbS5nZXRTdWJUeXBlKCkpOworICAgICAgICBhc3NlcnRUcnVlKGl0ZW0uaGFzSGludChTbGljZS5ISU5UX1RJVExFKSk7CisKKyAgICAgICAgdmVyaWZ5U2xpY2Uocyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGV4dCgpIHsKKyAgICAgICAgQ2hhclNlcXVlbmNlIGkgPSAiU29tZSB0ZXh0IjsKKyAgICAgICAgU2xpY2UgcyA9IG5ldyBTbGljZS5CdWlsZGVyKEJBU0VfVVJJLCBTUEVDKQorICAgICAgICAgICAgICAgIC5hZGRUZXh0KGksICJzdWJ0eXBlIiwgQXJyYXlzLmFzTGlzdChTbGljZS5ISU5UX1RJVExFKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEJBU0VfVVJJLCBzLmdldFVyaSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHMuZ2V0SXRlbXMoKS5zaXplKCkpOworCisgICAgICAgIFNsaWNlSXRlbSBpdGVtID0gcy5nZXRJdGVtcygpLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNsaWNlSXRlbS5GT1JNQVRfVEVYVCwgaXRlbS5nZXRGb3JtYXQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhpLCBpdGVtLmdldFRleHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygic3VidHlwZSIsIGl0ZW0uZ2V0U3ViVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShpdGVtLmhhc0hpbnQoU2xpY2UuSElOVF9USVRMRSkpOworCisgICAgICAgIHZlcmlmeVNsaWNlKHMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvbmcoKSB7CisgICAgICAgIGxvbmcgaSA9IDQzTDsKKyAgICAgICAgU2xpY2UgcyA9IG5ldyBTbGljZS5CdWlsZGVyKEJBU0VfVVJJLCBTUEVDKQorICAgICAgICAgICAgICAgIC5hZGRMb25nKGksICJzdWJ0eXBlIiwgQXJyYXlzLmFzTGlzdChTbGljZS5ISU5UX1RJVExFKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEJBU0VfVVJJLCBzLmdldFVyaSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHMuZ2V0SXRlbXMoKS5zaXplKCkpOworCisgICAgICAgIFNsaWNlSXRlbSBpdGVtID0gcy5nZXRJdGVtcygpLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNsaWNlSXRlbS5GT1JNQVRfTE9ORywgaXRlbS5nZXRGb3JtYXQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhpLCBpdGVtLmdldExvbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygic3VidHlwZSIsIGl0ZW0uZ2V0U3ViVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShpdGVtLmhhc0hpbnQoU2xpY2UuSElOVF9USVRMRSkpOworCisgICAgICAgIHZlcmlmeVNsaWNlKHMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlbW90ZUlucHV0KCkgeworICAgICAgICBSZW1vdGVJbnB1dCBpID0gbmV3IFJlbW90ZUlucHV0LkJ1aWxkZXIoImtleSIpLmJ1aWxkKCk7CisgICAgICAgIFNsaWNlIHMgPSBuZXcgU2xpY2UuQnVpbGRlcihCQVNFX1VSSSwgU1BFQykKKyAgICAgICAgICAgICAgICAuYWRkUmVtb3RlSW5wdXQoaSwgInN1YnR5cGUiLCBBcnJheXMuYXNMaXN0KFNsaWNlLkhJTlRfVElUTEUpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoQkFTRV9VUkksIHMuZ2V0VXJpKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcy5nZXRJdGVtcygpLnNpemUoKSk7CisKKyAgICAgICAgU2xpY2VJdGVtIGl0ZW0gPSBzLmdldEl0ZW1zKCkuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoU2xpY2VJdGVtLkZPUk1BVF9SRU1PVEVfSU5QVVQsIGl0ZW0uZ2V0Rm9ybWF0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoaSwgaXRlbS5nZXRSZW1vdGVJbnB1dCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzdWJ0eXBlIiwgaXRlbS5nZXRTdWJUeXBlKCkpOworICAgICAgICBhc3NlcnRUcnVlKGl0ZW0uaGFzSGludChTbGljZS5ISU5UX1RJVExFKSk7CisKKyAgICAgICAgdmVyaWZ5U2xpY2Uocyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QnVuZGxlKCkgeworICAgICAgICBCdW5kbGUgaSA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgU2xpY2UgcyA9IG5ldyBTbGljZS5CdWlsZGVyKEJBU0VfVVJJLCBTUEVDKQorICAgICAgICAgICAgICAgIC5hZGRCdW5kbGUoaSwgInN1YnR5cGUiLCBBcnJheXMuYXNMaXN0KFNsaWNlLkhJTlRfVElUTEUpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoQkFTRV9VUkksIHMuZ2V0VXJpKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcy5nZXRJdGVtcygpLnNpemUoKSk7CisKKyAgICAgICAgU2xpY2VJdGVtIGl0ZW0gPSBzLmdldEl0ZW1zKCkuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoU2xpY2VJdGVtLkZPUk1BVF9CVU5ETEUsIGl0ZW0uZ2V0Rm9ybWF0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoaSwgaXRlbS5nZXRCdW5kbGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygic3VidHlwZSIsIGl0ZW0uZ2V0U3ViVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShpdGVtLmhhc0hpbnQoU2xpY2UuSElOVF9USVRMRSkpOworCisgICAgICAgIHZlcmlmeVNsaWNlKHMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFjdGlvblN1YnR5cGUoKSB7CisgICAgICAgIFBlbmRpbmdJbnRlbnQgaSA9IFBlbmRpbmdJbnRlbnQuZ2V0QWN0aXZpdHkobUNvbnRleHQsIDAsIG5ldyBJbnRlbnQoKSwgMCk7CisgICAgICAgIFNsaWNlIHN1YlNsaWNlID0gbmV3IFNsaWNlLkJ1aWxkZXIoQkFTRV9VUkkuYnVpbGRVcG9uKCkuYXBwZW5kUGF0aCgicyIpLmJ1aWxkKCksIFNQRUMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIFNsaWNlIHMgPSBuZXcgU2xpY2UuQnVpbGRlcihCQVNFX1VSSSwgU1BFQykKKyAgICAgICAgICAgICAgICAuYWRkQWN0aW9uKGksIHN1YlNsaWNlLCAic3VidHlwZSIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhCQVNFX1VSSSwgcy5nZXRVcmkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBzLmdldEl0ZW1zKCkuc2l6ZSgpKTsKKworICAgICAgICBTbGljZUl0ZW0gaXRlbSA9IHMuZ2V0SXRlbXMoKS5nZXQoMCk7CisgICAgICAgIGFzc2VydEVxdWFscyhTbGljZUl0ZW0uRk9STUFUX0FDVElPTiwgaXRlbS5nZXRGb3JtYXQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhpLCBpdGVtLmdldEFjdGlvbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzdWJ0eXBlIiwgaXRlbS5nZXRTdWJUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoc3ViU2xpY2UsIGl0ZW0uZ2V0U2xpY2UoKSk7CisKKyAgICAgICAgdmVyaWZ5U2xpY2Uocyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3Vic2xpY2VTdWJ0eXBlKCkgeworICAgICAgICBTbGljZSBzdWJTbGljZSA9IG5ldyBTbGljZS5CdWlsZGVyKEJBU0VfVVJJLmJ1aWxkVXBvbigpLmFwcGVuZFBhdGgoInMiKS5idWlsZCgpLCBTUEVDKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICBTbGljZSBzID0gbmV3IFNsaWNlLkJ1aWxkZXIoQkFTRV9VUkksIFNQRUMpCisgICAgICAgICAgICAgICAgLmFkZFN1YlNsaWNlKHN1YlNsaWNlLCAic3VidHlwZSIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhCQVNFX1VSSSwgcy5nZXRVcmkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBzLmdldEl0ZW1zKCkuc2l6ZSgpKTsKKworICAgICAgICBTbGljZUl0ZW0gaXRlbSA9IHMuZ2V0SXRlbXMoKS5nZXQoMCk7CisgICAgICAgIGFzc2VydEVxdWFscyhTbGljZUl0ZW0uRk9STUFUX1NMSUNFLCBpdGVtLmdldEZvcm1hdCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzdWJ0eXBlIiwgaXRlbS5nZXRTdWJUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoc3ViU2xpY2UsIGl0ZW0uZ2V0U2xpY2UoKSk7CisKKyAgICAgICAgdmVyaWZ5U2xpY2Uocyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3BlYygpIHsKKyAgICAgICAgU2xpY2UgcyA9IG5ldyBTbGljZS5CdWlsZGVyKEJBU0VfVVJJLCBuZXcgU2xpY2VTcGVjKCJzcGVjIiwgMykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhCQVNFX1VSSSwgcy5nZXRVcmkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzLmdldEl0ZW1zKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBTbGljZVNwZWMoInNwZWMiLCAzKSwgcy5nZXRTcGVjKCkpOworCisgICAgICAgIHZlcmlmeVNsaWNlKHMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENhbGxlck5lZWRlZCgpIHsKKyAgICAgICAgU2xpY2UgcyA9IG5ldyBTbGljZS5CdWlsZGVyKEJBU0VfVVJJLCBTUEVDKQorICAgICAgICAgICAgICAgIC5zZXRDYWxsZXJOZWVkZWQodHJ1ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEJBU0VfVVJJLCBzLmdldFVyaSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHMuZ2V0SXRlbXMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRUcnVlKHMuaXNDYWxsZXJOZWVkZWQoKSk7CisKKyAgICAgICAgcyA9IG5ldyBTbGljZS5CdWlsZGVyKEJBU0VfVVJJLCBTUEVDKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoQkFTRV9VUkksIHMuZ2V0VXJpKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcy5nZXRJdGVtcygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHMuaXNDYWxsZXJOZWVkZWQoKSk7CisKKyAgICAgICAgdmVyaWZ5U2xpY2Uocyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeVNsaWNlKFNsaWNlIHMpIHsKKyAgICAgICAgUGFyY2VsIHAgPSBQYXJjZWwub2J0YWluKCk7CisgICAgICAgIHMud3JpdGVUb1BhcmNlbChwLCAwKTsKKworICAgICAgICBwLnNldERhdGFQb3NpdGlvbigwKTsKKyAgICAgICAgU2xpY2Ugb3RoZXIgPSBTbGljZS5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwocCk7CisgICAgICAgIGFzc2VydEVxdWl2YWxlbnQocywgb3RoZXIpOworICAgICAgICBwLnJlY3ljbGUoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0RXF1aXZhbGVudChTbGljZSBzLCBTbGljZSBvdGhlcikgeworICAgICAgICBhc3NlcnRFcXVhbHMocy5nZXRVcmkoKSwgb3RoZXIuZ2V0VXJpKCkpOworICAgICAgICBhc3NlcnRFcXVpdmFsZW50SGludHMocy5nZXRIaW50cygpLCBvdGhlci5nZXRIaW50cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1aXZhbGVudChzLmdldEl0ZW1zKCksIG90aGVyLmdldEl0ZW1zKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMocy5nZXRTcGVjKCksIG90aGVyLmdldFNwZWMoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydEVxdWl2YWxlbnQoTGlzdDxTbGljZUl0ZW0+IGkxLCBMaXN0PFNsaWNlSXRlbT4gaTIpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGkxLnNpemUoKSwgaTIuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpMS5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0RXF1aXZhbGVudChpMS5nZXQoaSksIGkyLmdldChpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0RXF1aXZhbGVudChTbGljZUl0ZW0gczEsIFNsaWNlSXRlbSBzMikgeworICAgICAgICBhc3NlcnRFcXVhbHMoczEuZ2V0Rm9ybWF0KCksIHMyLmdldEZvcm1hdCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHMxLmdldFN1YlR5cGUoKSwgczIuZ2V0U3ViVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1aXZhbGVudEhpbnRzKHMxLmdldEhpbnRzKCksIHMyLmdldEhpbnRzKCkpOworICAgICAgICAvLyBUT0RPOiBDb25zaWRlciBjb21wYXJpbmcgY29udGVudC4KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0RXF1aXZhbGVudEhpbnRzKExpc3Q8U3RyaW5nPiBoMSwgTGlzdDxTdHJpbmc+IGgyKSB7CisgICAgICAgIGFzc2VydEVxdWFscyhoMS5zaXplKCksIGgyLnNpemUoKSk7CisgICAgICAgIENvbGxlY3Rpb25zLnNvcnQoaDEpOworICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGgyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGgxLCBoMik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc2xpY2Uvc3JjL2FuZHJvaWQvc2xpY2UvY3RzL1NsaWNlTWFuYWdlclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3NsaWNlL3NyYy9hbmRyb2lkL3NsaWNlL2N0cy9TbGljZU1hbmFnZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjlkOGQ4MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3NsaWNlL3NyYy9hbmRyb2lkL3NsaWNlL2N0cy9TbGljZU1hbmFnZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisgKiBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlCisgKiBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisgKiBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNsaWNlLmN0czsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Bcmd1bWVudE1hdGNoZXJzLmFueTsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uQXJndW1lbnRNYXRjaGVycy5lcTsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5tb2NrOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnRpbWVvdXQ7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8udmVyaWZ5OworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLndoZW47CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb247CitpbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKK2ltcG9ydCBhbmRyb2lkLmFwcC5zbGljZS5TbGljZTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5zbGljZS5TbGljZUl0ZW07CitpbXBvcnQgYW5kcm9pZC5hcHAuc2xpY2UuU2xpY2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3I7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLm1vY2tpdG8uc3R1YmJpbmcuQW5zd2VyOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIFNsaWNlTWFuYWdlclRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVXJpIEJBU0VfVVJJID0gVXJpLnBhcnNlKCJjb250ZW50Oi8vYW5kcm9pZC5zbGljZS5jdHMubG9jYWwvbWFpbiIpOworICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dCA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKTsKKyAgICBwcml2YXRlIGZpbmFsIFNsaWNlTWFuYWdlciBtU2xpY2VNYW5hZ2VyID0gbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShTbGljZU1hbmFnZXIuY2xhc3MpOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldHVwKCkgeworICAgICAgICBMb2NhbFNsaWNlUHJvdmlkZXIuc1Byb3h5ID0gbW9jayhTbGljZVByb3ZpZGVyLmNsYXNzKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1TbGljZU1hbmFnZXIudW5waW5TbGljZShCQVNFX1VSSSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCB0ZWFyZG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgbVNsaWNlTWFuYWdlci51bnBpblNsaWNlKEJBU0VfVVJJKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBpblNsaWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1TbGljZU1hbmFnZXIucGluU2xpY2UoQkFTRV9VUkksIENvbGxlY3Rpb25zLmVtcHR5U2V0KCkpOworCisgICAgICAgIHZlcmlmeShMb2NhbFNsaWNlUHJvdmlkZXIuc1Byb3h5LCB0aW1lb3V0KDIwMDApKS5vblNsaWNlUGlubmVkKGVxKEJBU0VfVVJJKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VW5waW5TbGljZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtU2xpY2VNYW5hZ2VyLnBpblNsaWNlKEJBU0VfVVJJLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpKTsKKworICAgICAgICB2ZXJpZnkoTG9jYWxTbGljZVByb3ZpZGVyLnNQcm94eSwgdGltZW91dCgyMDAwKSkub25TbGljZVBpbm5lZChlcShCQVNFX1VSSSkpOworCisgICAgICAgIG1TbGljZU1hbmFnZXIudW5waW5TbGljZShCQVNFX1VSSSk7CisKKyAgICAgICAgdmVyaWZ5KExvY2FsU2xpY2VQcm92aWRlci5zUHJveHksIHRpbWVvdXQoMjAwMCkpLm9uU2xpY2VVbnBpbm5lZChlcShCQVNFX1VSSSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBpbkxpc3QoKSB7CisgICAgICAgIFVyaSB1cmkgPSBCQVNFX1VSSTsKKyAgICAgICAgVXJpIGxvbmdlclVyaSA9IHVyaS5idWlsZFVwb24oKS5hcHBlbmRQYXRoKCJzb21ldGhpbmciKS5idWlsZCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbVNsaWNlTWFuYWdlci5waW5TbGljZSh1cmksIENvbGxlY3Rpb25zLmVtcHR5U2V0KCkpOworICAgICAgICAgICAgbVNsaWNlTWFuYWdlci5waW5TbGljZShsb25nZXJVcmksIENvbGxlY3Rpb25zLmVtcHR5U2V0KCkpOworICAgICAgICAgICAgdmVyaWZ5KExvY2FsU2xpY2VQcm92aWRlci5zUHJveHksIHRpbWVvdXQoMjAwMCkpLm9uU2xpY2VQaW5uZWQoZXEobG9uZ2VyVXJpKSk7CisKKyAgICAgICAgICAgIExpc3Q8VXJpPiB1cmlzID0gbVNsaWNlTWFuYWdlci5nZXRQaW5uZWRTbGljZXMoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCB1cmlzLnNpemUoKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHVyaXMuY29udGFpbnModXJpKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHVyaXMuY29udGFpbnMobG9uZ2VyVXJpKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBtU2xpY2VNYW5hZ2VyLnVucGluU2xpY2UodXJpKTsKKyAgICAgICAgICAgIG1TbGljZU1hbmFnZXIudW5waW5TbGljZShsb25nZXJVcmkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFwSW50ZW50VG9VcmkoKSB7CisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KCJhbmRyb2lkLnNsaWNlLmN0cy5hY3Rpb24uVEVTVF9BQ1RJT04iKTsKKyAgICAgICAgaW50ZW50LnNldFBhY2thZ2UoImFuZHJvaWQuc2xpY2UuY3RzIik7CisgICAgICAgIGludGVudC5wdXRFeHRyYSgicGF0aCIsICJpbnRlbnQiKTsKKworICAgICAgICB3aGVuKExvY2FsU2xpY2VQcm92aWRlci5zUHJveHkub25NYXBJbnRlbnRUb1VyaShhbnkoKSkpLnRoZW4oCisgICAgICAgICAgICAgICAgKEFuc3dlcjxVcmk+KSBpbnZvY2F0aW9uIC0+IEJBU0VfVVJJLmJ1aWxkVXBvbigpLnBhdGgoCisgICAgICAgICAgICAgICAgICAgICAgICAoKEludGVudCkgaW52b2NhdGlvbi5nZXRBcmd1bWVudHMoKVswXSkuZ2V0U3RyaW5nRXh0cmEoInBhdGgiKSkuYnVpbGQoKSk7CisKKyAgICAgICAgVXJpIHVyaSA9IG1TbGljZU1hbmFnZXIubWFwSW50ZW50VG9VcmkoaW50ZW50KTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoQkFTRV9VUkkuYnVpbGRVcG9uKCkucGF0aCgiaW50ZW50IikuYnVpbGQoKSwgdXJpKTsKKyAgICAgICAgdmVyaWZ5KExvY2FsU2xpY2VQcm92aWRlci5zUHJveHkpLm9uTWFwSW50ZW50VG9VcmkoZXEoaW50ZW50KSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25DcmVhdGVQZXJtaXNzaW9uU2xpY2UoKSB7CisgICAgICAgIExvY2FsU2xpY2VQcm92aWRlci5zQW5zd2VyID0gaW52b2NhdGlvbiAtPiB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oIk5vIHNsaWNlcyBhbGxvd2VkIik7CisgICAgICAgIH07CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBVcmkgdXJpID0gQkFTRV9VUkkuYnVpbGRVcG9uKCkucGF0aCgicGVybWlzc2lvbiIpLmJ1aWxkKCk7CisgICAgICAgICAgICBQZW5kaW5nSW50ZW50IGludGVudCA9IFBlbmRpbmdJbnRlbnQuZ2V0QnJvYWRjYXN0KG1Db250ZXh0LCAwLCBuZXcgSW50ZW50KCIiKSwgMCk7CisKKyAgICAgICAgICAgIHdoZW4oTG9jYWxTbGljZVByb3ZpZGVyLnNQcm94eS5vbkNyZWF0ZVBlcm1pc3Npb25SZXF1ZXN0KGFueSgpKSkudGhlblJldHVybihpbnRlbnQpOworCisgICAgICAgICAgICBTbGljZSBzID0gbVNsaWNlTWFuYWdlci5iaW5kU2xpY2UodXJpLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpKTsKKworICAgICAgICAgICAgLy8vIE1ha2Ugc3VyZSB3ZSBnZXQgYSBjYWxsYmFjayBmb3IgY3JlYXRpbmcgdGhlIGludGVudC4KKyAgICAgICAgICAgIHZlcmlmeShMb2NhbFNsaWNlUHJvdmlkZXIuc1Byb3h5KS5vbkNyZWF0ZVBlcm1pc3Npb25SZXF1ZXN0KGVxKHVyaSkpOworICAgICAgICAgICAgLy8gVmVyaWZ5IHRoZSBpbnRlbnQgd2UgZ2V0IGJhY2sgaXMgdGhlIG9uZSB3ZSByZXR1cm5lZC4KKyAgICAgICAgICAgIFBlbmRpbmdJbnRlbnQgaSA9IGZpbmRBY3Rpb24ocyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGludGVudCA9PSBpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIExvY2FsU2xpY2VQcm92aWRlci5zQW5zd2VyID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgUGVuZGluZ0ludGVudCBmaW5kQWN0aW9uKFNsaWNlIHMpIHsKKyAgICAgICAgZm9yIChTbGljZUl0ZW0gaXRlbSA6IHMuZ2V0SXRlbXMoKSkgeworICAgICAgICAgICAgaWYgKFNsaWNlSXRlbS5GT1JNQVRfU0xJQ0UuZXF1YWxzKGl0ZW0uZ2V0Rm9ybWF0KCkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZpbmRBY3Rpb24oaXRlbS5nZXRTbGljZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChTbGljZUl0ZW0uRk9STUFUX0FDVElPTi5lcXVhbHMoaXRlbS5nZXRGb3JtYXQoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5nZXRBY3Rpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0TGF1bmNoZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIFBSRUZJWCA9ICJMYXVuY2hlcjogQ29tcG9uZW50SW5mb3siOworICAgICAgICBmaW5hbCBTdHJpbmcgUE9TVEZJWCA9ICJ9IjsKKyAgICAgICAgZm9yIChTdHJpbmcgcyA6IHJ1blNoZWxsQ29tbWFuZCgiY21kIHNob3J0Y3V0IGdldC1kZWZhdWx0LWxhdW5jaGVyIikpIHsKKyAgICAgICAgICAgIGlmIChzLnN0YXJ0c1dpdGgoUFJFRklYKSAmJiBzLmVuZHNXaXRoKFBPU1RGSVgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHMuc3Vic3RyaW5nKFBSRUZJWC5sZW5ndGgoKSwgcy5sZW5ndGgoKSAtIFBPU1RGSVgubGVuZ3RoKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkRlZmF1bHQgbGF1bmNoZXIgbm90IGZvdW5kIik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBBcnJheUxpc3Q8U3RyaW5nPiBydW5TaGVsbENvbW1hbmQoU3RyaW5nIGNvbW1hbmQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBwZmQgPSBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRVaUF1dG9tYXRpb24oKQorICAgICAgICAgICAgICAgIC5leGVjdXRlU2hlbGxDb21tYW5kKGNvbW1hbmQpOworCisgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHJldCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICAvLyBSZWFkIHRoZSBpbnB1dCBzdHJlYW0gZnVsbHkuCisgICAgICAgIHRyeSAoQnVmZmVyZWRSZWFkZXIgciA9IG5ldyBCdWZmZXJlZFJlYWRlcigKKyAgICAgICAgICAgICAgICBuZXcgSW5wdXRTdHJlYW1SZWFkZXIobmV3IFBhcmNlbEZpbGVEZXNjcmlwdG9yLkF1dG9DbG9zZUlucHV0U3RyZWFtKHBmZCkpKSkgeworICAgICAgICAgICAgU3RyaW5nIGxpbmU7CisgICAgICAgICAgICB3aGlsZSAoKGxpbmUgPSByLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXQuYWRkKGxpbmUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBJbnN0cnVtZW50YXRpb24gZ2V0SW5zdHJ1bWVudGF0aW9uKCkgeworICAgICAgICByZXR1cm4gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zbGljZS9zcmMvYW5kcm9pZC9zbGljZS9jdHMvU2xpY2VNZXRyaWNzVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvc2xpY2Uvc3JjL2FuZHJvaWQvc2xpY2UvY3RzL1NsaWNlTWV0cmljc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjI4N2EwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvc2xpY2Uvc3JjL2FuZHJvaWQvc2xpY2UvY3RzL1NsaWNlTWV0cmljc1Rlc3QuamF2YQpAQCAtMCwwICsxLDgwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorICogZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZQorICogTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworICogcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zbGljZS5jdHM7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5zbGljZS5TbGljZU1ldHJpY3M7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5tZXRyaWNzLkxvZ01ha2VyOworaW1wb3J0IGFuZHJvaWQubWV0cmljcy5NZXRyaWNzUmVhZGVyOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5tZXRyaWNzaGVscGVyLk1ldHJpY3NBc3NlcnRzOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwubG9nZ2luZy5uYW5vLk1ldHJpY3NQcm90by5NZXRyaWNzRXZlbnQ7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKKworQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBTbGljZU1ldHJpY3NUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVyaSBCQVNFX1VSSSA9IFVyaS5wYXJzZSgiY29udGVudDovL2FuZHJvaWQuc2xpY2UuY3RzLmxvY2FsLyIpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVyaSBTVUJfU0xJQ0VfVVJJID0gVXJpLnBhcnNlKCJjb250ZW50Oi8vYW5kcm9pZC5zbGljZS5jdHMubG9jYWwvc3ViIik7CisgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0ID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpOworCisgICAgcHJpdmF0ZSBNZXRyaWNzUmVhZGVyIG1NZXRyaWNzUmVhZGVyOworICAgIHByaXZhdGUgU2xpY2VNZXRyaWNzIG1TbGljZU1ldHJpY3M7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0dXAoKSB7CisgICAgICAgIG1TbGljZU1ldHJpY3MgPSBuZXcgU2xpY2VNZXRyaWNzKG1Db250ZXh0LCBCQVNFX1VSSSk7CisgICAgICAgIG1NZXRyaWNzUmVhZGVyID0gbmV3IE1ldHJpY3NSZWFkZXIoKTsKKyAgICAgICAgbU1ldHJpY3NSZWFkZXIuY2hlY2twb2ludCgpOyAvLyBjbGVhciBvdXQgb2xkIGxvZ3MKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMb2dWaXNpYmxlKCkgeworICAgICAgICBtU2xpY2VNZXRyaWNzLmxvZ1Zpc2libGUoKTsKKyAgICAgICAgTWV0cmljc0Fzc2VydHMuYXNzZXJ0SGFzTG9nKCJNaXNzaW5nIHNsaWNlIHZpc2libGUgbG9nIiwgbU1ldHJpY3NSZWFkZXIsCisgICAgICAgICAgICBnZXRMb2dNYWtlcigpLnNldENhdGVnb3J5KE1ldHJpY3NFdmVudC5TTElDRSkuc2V0VHlwZShNZXRyaWNzRXZlbnQuVFlQRV9PUEVOKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9nSGlkZGVuKCkgeworICAgICAgICBtU2xpY2VNZXRyaWNzLmxvZ0hpZGRlbigpOworICAgICAgICBNZXRyaWNzQXNzZXJ0cy5hc3NlcnRIYXNMb2coIk1pc3Npbmcgc2xpY2UgaGlkZGVuIGxvZyIsIG1NZXRyaWNzUmVhZGVyLAorICAgICAgICAgICAgZ2V0TG9nTWFrZXIoKS5zZXRDYXRlZ29yeShNZXRyaWNzRXZlbnQuU0xJQ0UpLnNldFR5cGUoTWV0cmljc0V2ZW50LlRZUEVfQ0xPU0UpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMb2dPblRvdWNoKCkgeworICAgICAgICBtU2xpY2VNZXRyaWNzLmxvZ1RvdWNoKDAsIFNVQl9TTElDRV9VUkkpOworICAgICAgICBNZXRyaWNzQXNzZXJ0cy5hc3NlcnRIYXNMb2coIk1pc3Npbmcgc2xpY2UgdG91Y2ggbG9nIiwgbU1ldHJpY3NSZWFkZXIsCisgICAgICAgICAgICBnZXRMb2dNYWtlcigpLnNldENhdGVnb3J5KE1ldHJpY3NFdmVudC5TTElDRSkKKyAgICAgICAgICAgICAgICAuc2V0VHlwZShNZXRyaWNzRXZlbnQuVFlQRV9BQ1RJT04pCisgICAgICAgICAgICAgICAgLmFkZFRhZ2dlZERhdGEoTWV0cmljc0V2ZW50LkZJRUxEX1NVQlNMSUNFX0FVVEhPUklUWSwgU1VCX1NMSUNFX1VSSS5nZXRBdXRob3JpdHkoKSkKKyAgICAgICAgICAgICAgICAuYWRkVGFnZ2VkRGF0YShNZXRyaWNzRXZlbnQuRklFTERfU1VCU0xJQ0VfUEFUSCwgU1VCX1NMSUNFX1VSSS5nZXRQYXRoKCkpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIExvZ01ha2VyIGdldExvZ01ha2VyKCkgeworICAgICAgICBMb2dNYWtlciBsb2dNYWtlciA9IG5ldyBMb2dNYWtlcihNZXRyaWNzRXZlbnQuVklFV19VTktOT1dOKTsKKyAgICAgICAgbG9nTWFrZXIuYWRkVGFnZ2VkRGF0YShNZXRyaWNzRXZlbnQuRklFTERfU0xJQ0VfQVVUSE9SSVRZLCBCQVNFX1VSSS5nZXRBdXRob3JpdHkoKSk7CisgICAgICAgIGxvZ01ha2VyLmFkZFRhZ2dlZERhdGEoTWV0cmljc0V2ZW50LkZJRUxEX1NMSUNFX1BBVEgsIEJBU0VfVVJJLmdldFBhdGgoKSk7CisgICAgICAgIHJldHVybiBsb2dNYWtlcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zbGljZS9zcmMvYW5kcm9pZC9zbGljZS9jdHMvU2xpY2VQZXJtaXNzaW9uc1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3NsaWNlL3NyYy9hbmRyb2lkL3NsaWNlL2N0cy9TbGljZVBlcm1pc3Npb25zVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwODE5NDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zbGljZS9zcmMvYW5kcm9pZC9zbGljZS9jdHMvU2xpY2VQZXJtaXNzaW9uc1Rlc3QuamF2YQpAQCAtMCwwICsxLDE4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyAqIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUKKyAqIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyAqIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2xpY2UuY3RzOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5QRVJNSVNTSU9OX0RFTklFRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLlBFUk1JU1NJT05fR1JBTlRFRDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworaW1wb3J0IGFuZHJvaWQuYXBwLnNsaWNlLlNsaWNlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuTmFtZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKK0BSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgU2xpY2VQZXJtaXNzaW9uc1Rlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVXJpIEJBU0VfVVJJID0gVXJpLnBhcnNlKCJjb250ZW50Oi8vYW5kcm9pZC5zbGljZS5jdHMubG9jYWwvIik7CisgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0ID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpOworICAgIHByaXZhdGUgU3RyaW5nIG1UZXN0UGtnOworICAgIHByaXZhdGUgaW50IG1UZXN0VWlkOworICAgIHByaXZhdGUgaW50IG1UZXN0UGlkOworICAgIHByaXZhdGUgU2xpY2VNYW5hZ2VyIG1TbGljZU1hbmFnZXI7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0dXAoKSB0aHJvd3MgTmFtZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgbVNsaWNlTWFuYWdlciA9IG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoU2xpY2VNYW5hZ2VyLmNsYXNzKTsKKyAgICAgICAgbVRlc3RQa2cgPSBtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpOworICAgICAgICBtVGVzdFVpZCA9IG1Db250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCkuZ2V0UGFja2FnZVVpZChtVGVzdFBrZywgMCk7CisgICAgICAgIG1UZXN0UGlkID0gUHJvY2Vzcy5teVBpZCgpOworICAgIH0KKworICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeworICAgICAgICBtU2xpY2VNYW5hZ2VyLnJldm9rZVNsaWNlUGVybWlzc2lvbihtVGVzdFBrZywgQkFTRV9VUkkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdyYW50KCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoUEVSTUlTU0lPTl9ERU5JRUQsCisgICAgICAgICAgICAgICAgbVNsaWNlTWFuYWdlci5jaGVja1NsaWNlUGVybWlzc2lvbihCQVNFX1VSSSwgbVRlc3RQaWQsIG1UZXN0VWlkKSk7CisKKyAgICAgICAgbVNsaWNlTWFuYWdlci5ncmFudFNsaWNlUGVybWlzc2lvbihtVGVzdFBrZywgQkFTRV9VUkkpOworCisgICAgICAgIGFzc2VydEVxdWFscyhQRVJNSVNTSU9OX0dSQU5URUQsCisgICAgICAgICAgICAgICAgbVNsaWNlTWFuYWdlci5jaGVja1NsaWNlUGVybWlzc2lvbihCQVNFX1VSSSwgbVRlc3RQaWQsIG1UZXN0VWlkKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R3JhbnRQYXJlbnQoKSB7CisgICAgICAgIFVyaSB1cmkgPSBCQVNFX1VSSS5idWlsZFVwb24oKQorICAgICAgICAgICAgICAgIC5hcHBlbmRQYXRoKCJzb21ldGhpbmciKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworCisgICAgICAgIGFzc2VydEVxdWFscyhQRVJNSVNTSU9OX0RFTklFRCwKKyAgICAgICAgICAgICAgICBtU2xpY2VNYW5hZ2VyLmNoZWNrU2xpY2VQZXJtaXNzaW9uKHVyaSwgbVRlc3RQaWQsIG1UZXN0VWlkKSk7CisKKyAgICAgICAgbVNsaWNlTWFuYWdlci5ncmFudFNsaWNlUGVybWlzc2lvbihtVGVzdFBrZywgQkFTRV9VUkkpOworCisgICAgICAgIGFzc2VydEVxdWFscyhQRVJNSVNTSU9OX0dSQU5URUQsCisgICAgICAgICAgICAgICAgbVNsaWNlTWFuYWdlci5jaGVja1NsaWNlUGVybWlzc2lvbih1cmksIG1UZXN0UGlkLCBtVGVzdFVpZCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdyYW50UGFyZW50RXhwYW5kcygpIHsKKyAgICAgICAgVXJpIHVyaSA9IEJBU0VfVVJJLmJ1aWxkVXBvbigpCisgICAgICAgICAgICAgICAgLmFwcGVuZFBhdGgoInNvbWV0aGluZyIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFBFUk1JU1NJT05fREVOSUVELAorICAgICAgICAgICAgICAgIG1TbGljZU1hbmFnZXIuY2hlY2tTbGljZVBlcm1pc3Npb24odXJpLCBtVGVzdFBpZCwgbVRlc3RVaWQpKTsKKworICAgICAgICBtU2xpY2VNYW5hZ2VyLmdyYW50U2xpY2VQZXJtaXNzaW9uKG1UZXN0UGtnLCB1cmkpOworCisgICAgICAgIC8vIE9ubHkgc3ViLXBhdGggZ3JhbnRlZC4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKFBFUk1JU1NJT05fR1JBTlRFRCwKKyAgICAgICAgICAgICAgICBtU2xpY2VNYW5hZ2VyLmNoZWNrU2xpY2VQZXJtaXNzaW9uKHVyaSwgbVRlc3RQaWQsIG1UZXN0VWlkKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhQRVJNSVNTSU9OX0RFTklFRCwKKyAgICAgICAgICAgICAgICBtU2xpY2VNYW5hZ2VyLmNoZWNrU2xpY2VQZXJtaXNzaW9uKEJBU0VfVVJJLCBtVGVzdFBpZCwgbVRlc3RVaWQpKTsKKworICAgICAgICBtU2xpY2VNYW5hZ2VyLmdyYW50U2xpY2VQZXJtaXNzaW9uKG1UZXN0UGtnLCBCQVNFX1VSSSk7CisKKyAgICAgICAgLy8gTm93IGFsbCBncmFudGVkLgorICAgICAgICBhc3NlcnRFcXVhbHMoUEVSTUlTU0lPTl9HUkFOVEVELAorICAgICAgICAgICAgICAgIG1TbGljZU1hbmFnZXIuY2hlY2tTbGljZVBlcm1pc3Npb24odXJpLCBtVGVzdFBpZCwgbVRlc3RVaWQpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFBFUk1JU1NJT05fR1JBTlRFRCwKKyAgICAgICAgICAgICAgICBtU2xpY2VNYW5hZ2VyLmNoZWNrU2xpY2VQZXJtaXNzaW9uKEJBU0VfVVJJLCBtVGVzdFBpZCwgbVRlc3RVaWQpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHcmFudENoaWxkKCkgeworICAgICAgICBVcmkgdXJpID0gQkFTRV9VUkkuYnVpbGRVcG9uKCkKKyAgICAgICAgICAgICAgICAuYXBwZW5kUGF0aCgic29tZXRoaW5nIikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoUEVSTUlTU0lPTl9ERU5JRUQsCisgICAgICAgICAgICAgICAgbVNsaWNlTWFuYWdlci5jaGVja1NsaWNlUGVybWlzc2lvbihCQVNFX1VSSSwgbVRlc3RQaWQsIG1UZXN0VWlkKSk7CisKKyAgICAgICAgbVNsaWNlTWFuYWdlci5ncmFudFNsaWNlUGVybWlzc2lvbihtVGVzdFBrZywgdXJpKTsKKworICAgICAgICAvLyBTdGlsbCBubyBwZXJtaXNzaW9uIGJlY2F1c2Ugb25seSBhIGNoaWxkIHdhcyBncmFudGVkCisgICAgICAgIGFzc2VydEVxdWFscyhQRVJNSVNTSU9OX0RFTklFRCwKKyAgICAgICAgICAgICAgICBtU2xpY2VNYW5hZ2VyLmNoZWNrU2xpY2VQZXJtaXNzaW9uKEJBU0VfVVJJLCBtVGVzdFBpZCwgbVRlc3RVaWQpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXZva2UoKSB7CisgICAgICAgIGFzc2VydEVxdWFscyhQRVJNSVNTSU9OX0RFTklFRCwKKyAgICAgICAgICAgICAgICBtU2xpY2VNYW5hZ2VyLmNoZWNrU2xpY2VQZXJtaXNzaW9uKEJBU0VfVVJJLCBtVGVzdFBpZCwgbVRlc3RVaWQpKTsKKworICAgICAgICBtU2xpY2VNYW5hZ2VyLmdyYW50U2xpY2VQZXJtaXNzaW9uKG1UZXN0UGtnLCBCQVNFX1VSSSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFBFUk1JU1NJT05fR1JBTlRFRCwKKyAgICAgICAgICAgICAgICBtU2xpY2VNYW5hZ2VyLmNoZWNrU2xpY2VQZXJtaXNzaW9uKEJBU0VfVVJJLCBtVGVzdFBpZCwgbVRlc3RVaWQpKTsKKworICAgICAgICBtU2xpY2VNYW5hZ2VyLnJldm9rZVNsaWNlUGVybWlzc2lvbihtVGVzdFBrZywgQkFTRV9VUkkpOworCisgICAgICAgIGFzc2VydEVxdWFscyhQRVJNSVNTSU9OX0RFTklFRCwKKyAgICAgICAgICAgICAgICBtU2xpY2VNYW5hZ2VyLmNoZWNrU2xpY2VQZXJtaXNzaW9uKEJBU0VfVVJJLCBtVGVzdFBpZCwgbVRlc3RVaWQpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXZva2VQYXJlbnQoKSB7CisgICAgICAgIFVyaSB1cmkgPSBCQVNFX1VSSS5idWlsZFVwb24oKQorICAgICAgICAgICAgICAgIC5hcHBlbmRQYXRoKCJzb21ldGhpbmciKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoUEVSTUlTU0lPTl9ERU5JRUQsCisgICAgICAgICAgICAgICAgbVNsaWNlTWFuYWdlci5jaGVja1NsaWNlUGVybWlzc2lvbih1cmksIG1UZXN0UGlkLCBtVGVzdFVpZCkpOworCisgICAgICAgIG1TbGljZU1hbmFnZXIuZ3JhbnRTbGljZVBlcm1pc3Npb24obVRlc3RQa2csIHVyaSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFBFUk1JU1NJT05fR1JBTlRFRCwKKyAgICAgICAgICAgICAgICBtU2xpY2VNYW5hZ2VyLmNoZWNrU2xpY2VQZXJtaXNzaW9uKHVyaSwgbVRlc3RQaWQsIG1UZXN0VWlkKSk7CisKKyAgICAgICAgbVNsaWNlTWFuYWdlci5yZXZva2VTbGljZVBlcm1pc3Npb24obVRlc3RQa2csIEJBU0VfVVJJKTsKKworICAgICAgICAvLyBSZXZva2VkIGJlY2F1c2UgcGFyZW50IHdhcyByZXZva2VkCisgICAgICAgIGFzc2VydEVxdWFscyhQRVJNSVNTSU9OX0RFTklFRCwKKyAgICAgICAgICAgICAgICBtU2xpY2VNYW5hZ2VyLmNoZWNrU2xpY2VQZXJtaXNzaW9uKHVyaSwgbVRlc3RQaWQsIG1UZXN0VWlkKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmV2b2tlQ2hpbGQoKSB7CisgICAgICAgIFVyaSB1cmkgPSBCQVNFX1VSSS5idWlsZFVwb24oKQorICAgICAgICAgICAgICAgIC5hcHBlbmRQYXRoKCJzb21ldGhpbmciKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoUEVSTUlTU0lPTl9ERU5JRUQsCisgICAgICAgICAgICAgICAgbVNsaWNlTWFuYWdlci5jaGVja1NsaWNlUGVybWlzc2lvbihCQVNFX1VSSSwgbVRlc3RQaWQsIG1UZXN0VWlkKSk7CisKKyAgICAgICAgbVNsaWNlTWFuYWdlci5ncmFudFNsaWNlUGVybWlzc2lvbihtVGVzdFBrZywgQkFTRV9VUkkpOworCisgICAgICAgIGFzc2VydEVxdWFscyhQRVJNSVNTSU9OX0dSQU5URUQsCisgICAgICAgICAgICAgICAgbVNsaWNlTWFuYWdlci5jaGVja1NsaWNlUGVybWlzc2lvbihCQVNFX1VSSSwgbVRlc3RQaWQsIG1UZXN0VWlkKSk7CisKKyAgICAgICAgbVNsaWNlTWFuYWdlci5yZXZva2VTbGljZVBlcm1pc3Npb24obVRlc3RQa2csIHVyaSk7CisKKyAgICAgICAgLy8gTm90IHJldm9rZWQgYmVjYXVzZSBjaGlsZCB3YXMgcmV2b2tlZC4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKFBFUk1JU1NJT05fR1JBTlRFRCwKKyAgICAgICAgICAgICAgICBtU2xpY2VNYW5hZ2VyLmNoZWNrU2xpY2VQZXJtaXNzaW9uKEJBU0VfVVJJLCBtVGVzdFBpZCwgbVRlc3RVaWQpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NsaWNlL3NyYy9hbmRyb2lkL3NsaWNlL2N0cy9TbGljZVByb3ZpZGVyLmphdmEgYi90ZXN0cy90ZXN0cy9zbGljZS9zcmMvYW5kcm9pZC9zbGljZS9jdHMvU2xpY2VQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwZWMyZTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zbGljZS9zcmMvYW5kcm9pZC9zbGljZS9jdHMvU2xpY2VQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorICogZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZQorICogTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworICogcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zbGljZS5jdHM7CisKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnRvTGlzdDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5hcHAuc2xpY2UuU2xpY2U7CitpbXBvcnQgYW5kcm9pZC5hcHAuc2xpY2UuU2xpY2UuQnVpbGRlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5zbGljZS5TbGljZVNwZWM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuSWNvbjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworcHVibGljIGNsYXNzIFNsaWNlUHJvdmlkZXIgZXh0ZW5kcyBhbmRyb2lkLmFwcC5zbGljZS5TbGljZVByb3ZpZGVyIHsKKworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBQQVRIUyA9IG5ldyBTdHJpbmdbXXsKKyAgICAgICAgICAgICIvc2V0X2ZsYWciLAorICAgICAgICAgICAgIi9zdWJzbGljZSIsCisgICAgICAgICAgICAiL3RleHQiLAorICAgICAgICAgICAgIi9pY29uIiwKKyAgICAgICAgICAgICIvYWN0aW9uIiwKKyAgICAgICAgICAgICIvaW50IiwKKyAgICAgICAgICAgICIvdGltZXN0YW1wIiwKKyAgICAgICAgICAgICIvaGludHMiLAorICAgICAgICAgICAgIi9idW5kbGUiLAorICAgICAgICAgICAgIi9zcGVjIiwKKyAgICB9OworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1BFQ19UWVBFID0gImFuZHJvaWQuY3RzLlNsaWNlVHlwZSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1BFQ19SRVYgPSA0OworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTbGljZVNwZWMgU1BFQyA9IG5ldyBTbGljZVNwZWMoU1BFQ19UWVBFLCBTUEVDX1JFVik7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENvbGxlY3Rpb248VXJpPiBvbkdldFNsaWNlRGVzY2VuZGFudHMoVXJpIHVyaSkgeworICAgICAgICBpZiAodXJpLmdldFBhdGgoKS5lcXVhbHMoIi8iKSkgeworICAgICAgICAgICAgVXJpLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBVcmkuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgIC5zY2hlbWUoQ29udGVudFJlc29sdmVyLlNDSEVNRV9DT05URU5UKQorICAgICAgICAgICAgICAgICAgICAuYXV0aG9yaXR5KCJhbmRyb2lkLnNsaWNlLmN0cyIpOworICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QoUEFUSFMpLnN0cmVhbSgpLm1hcChzIC0+CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIucGF0aChzKS5idWlsZCgpKS5jb2xsZWN0KHRvTGlzdCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNsaWNlIG9uQmluZFNsaWNlKFVyaSBzbGljZVVyaSwgU2V0PFNsaWNlU3BlYz4gc3VwcG9ydGVkU3BlY3MpIHsKKyAgICAgICAgc3dpdGNoIChzbGljZVVyaS5nZXRQYXRoKCkpIHsKKyAgICAgICAgICAgIGNhc2UgIi9zZXRfZmxhZyI6CisgICAgICAgICAgICAgICAgU2xpY2VCaW5kaW5nVGVzdC5zRmxhZyA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICIvc3Vic2xpY2UiOgorICAgICAgICAgICAgICAgIEJ1aWxkZXIgYiA9IG5ldyBCdWlsZGVyKHNsaWNlVXJpLCBTUEVDKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYi5hZGRTdWJTbGljZShuZXcgU2xpY2UuQnVpbGRlcihiKS5idWlsZCgpLCAic3Vic2xpY2UiKS5idWlsZCgpOworICAgICAgICAgICAgY2FzZSAiL3RleHQiOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2xpY2UuQnVpbGRlcihzbGljZVVyaSwgU1BFQykuYWRkVGV4dCgiRXhwZWN0ZWQgdGV4dCIsICJ0ZXh0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpKS5idWlsZCgpOworICAgICAgICAgICAgY2FzZSAiL2ljb24iOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2xpY2UuQnVpbGRlcihzbGljZVVyaSwgU1BFQykuYWRkSWNvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIEljb24uY3JlYXRlV2l0aFJlc291cmNlKGdldENvbnRleHQoKSwgUi5kcmF3YWJsZS5zaXplXzQ4eDQ4KSwgImljb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpLmJ1aWxkKCk7CisgICAgICAgICAgICBjYXNlICIvYWN0aW9uIjoKKyAgICAgICAgICAgICAgICBCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgQnVpbGRlcihzbGljZVVyaSwgU1BFQyk7CisgICAgICAgICAgICAgICAgU2xpY2Ugc3ViU2xpY2UgPSBuZXcgU2xpY2UuQnVpbGRlcihidWlsZGVyKS5idWlsZCgpOworICAgICAgICAgICAgICAgIFBlbmRpbmdJbnRlbnQgYnJvYWRjYXN0ID0gUGVuZGluZ0ludGVudC5nZXRCcm9hZGNhc3QoZ2V0Q29udGV4dCgpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVudChnZXRDb250ZXh0KCkuZ2V0UGFja2FnZU5hbWUoKSArICIuYWN0aW9uIiksIDApOworICAgICAgICAgICAgICAgIHJldHVybiBidWlsZGVyLmFkZEFjdGlvbihicm9hZGNhc3QsIHN1YlNsaWNlLCAiYWN0aW9uIikuYnVpbGQoKTsKKyAgICAgICAgICAgIGNhc2UgIi9pbnQiOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2xpY2UuQnVpbGRlcihzbGljZVVyaSwgU1BFQykuYWRkSW50KDB4ZmYxMjEyMTIsICJpbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpLmJ1aWxkKCk7CisgICAgICAgICAgICBjYXNlICIvdGltZXN0YW1wIjoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNsaWNlLkJ1aWxkZXIoc2xpY2VVcmksIFNQRUMpLmFkZExvbmcoNDMsICJ0aW1lc3RhbXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpLmJ1aWxkKCk7CisgICAgICAgICAgICBjYXNlICIvaGludHMiOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2xpY2UuQnVpbGRlcihzbGljZVVyaSwgU1BFQykKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRIaW50cyhBcnJheXMuYXNMaXN0KFNsaWNlLkhJTlRfTElTVCkpCisgICAgICAgICAgICAgICAgICAgICAgICAuYWRkVGV4dCgiVGV4dCIsIG51bGwsIEFycmF5cy5hc0xpc3QoU2xpY2UuSElOVF9USVRMRSkpCisgICAgICAgICAgICAgICAgICAgICAgICAuYWRkSWNvbihJY29uLmNyZWF0ZVdpdGhSZXNvdXJjZShnZXRDb250ZXh0KCksIFIuZHJhd2FibGUuc2l6ZV80OHg0OCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIEFycmF5cy5hc0xpc3QoU2xpY2UuSElOVF9OT19USU5ULCBTbGljZS5ISU5UX0xBUkdFKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICAgICAgY2FzZSAiL2J1bmRsZSI6CisgICAgICAgICAgICAgICAgQnVuZGxlIGIxID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgICAgIGIxLnB1dFBhcmNlbGFibGUoImEiLCBuZXcgVGVzdFBhcmNlbCgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNsaWNlLkJ1aWxkZXIoc2xpY2VVcmksIFNQRUMpLmFkZEJ1bmRsZShiMSwgImJ1bmRsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSkuYnVpbGQoKTsKKyAgICAgICAgICAgIGNhc2UgIi9zcGVjIjoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNsaWNlLkJ1aWxkZXIoc2xpY2VVcmksIFNQRUMpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IFNsaWNlLkJ1aWxkZXIoc2xpY2VVcmksIFNQRUMpLmJ1aWxkKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0UGFyY2VsIGltcGxlbWVudHMgUGFyY2VsYWJsZSB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVZhbHVlOworCisgICAgICAgIHB1YmxpYyBUZXN0UGFyY2VsKCkgeworICAgICAgICAgICAgbVZhbHVlID0gNDI7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgVGVzdFBhcmNlbChQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgIG1WYWx1ZSA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQobVZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBUZXN0UGFyY2VsIHAgPSAoVGVzdFBhcmNlbCkgb2JqOworICAgICAgICAgICAgICAgIHJldHVybiBwLm1WYWx1ZSA9PSBtVmFsdWU7CisgICAgICAgICAgICB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ3JlYXRvcjxUZXN0UGFyY2VsPiBDUkVBVE9SID0gbmV3IENyZWF0b3I8VGVzdFBhcmNlbD4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBUZXN0UGFyY2VsIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXN0UGFyY2VsKGluKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgVGVzdFBhcmNlbFtdIG5ld0FycmF5KGludCBzaXplKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXN0UGFyY2VsW3NpemVdOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NsaWNlL3NyYy9hbmRyb2lkL3NsaWNlL2N0cy9TbGljZVNwZWNUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9zbGljZS9zcmMvYW5kcm9pZC9zbGljZS9jdHMvU2xpY2VTcGVjVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3OGRjN2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zbGljZS9zcmMvYW5kcm9pZC9zbGljZS9jdHMvU2xpY2VTcGVjVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisgKiBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlCisgKiBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisgKiBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNsaWNlLmN0czsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgYW5kcm9pZC5hcHAuc2xpY2UuU2xpY2VTcGVjOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKKworQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBTbGljZVNwZWNUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERpZmZlcmVudFR5cGVzKCkgeworICAgICAgICBTbGljZVNwZWMgZmlyc3QgPSBuZXcgU2xpY2VTcGVjKCJmaXJzdCIsIDEpOworICAgICAgICBTbGljZVNwZWMgc2Vjb25kID0gbmV3IFNsaWNlU3BlYygic2Vjb25kIiwgMSk7CisKKyAgICAgICAgYXNzZXJ0RmFsc2UoZmlyc3QuY2FuUmVuZGVyKHNlY29uZCkpOworICAgICAgICBhc3NlcnRGYWxzZShzZWNvbmQuY2FuUmVuZGVyKGZpcnN0KSk7CisKKyAgICAgICAgdmVyaWZ5KGZpcnN0KTsKKyAgICAgICAgdmVyaWZ5KHNlY29uZCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVuZGVyRGlmZmVyZW5jZSgpIHsKKyAgICAgICAgU2xpY2VTcGVjIGZpcnN0ID0gbmV3IFNsaWNlU3BlYygibmFtZXNwYWNlIiwgMik7CisgICAgICAgIFNsaWNlU3BlYyBzZWNvbmQgPSBuZXcgU2xpY2VTcGVjKCJuYW1lc3BhY2UiLCAxKTsKKworICAgICAgICBhc3NlcnRUcnVlKGZpcnN0LmNhblJlbmRlcihzZWNvbmQpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2Uoc2Vjb25kLmNhblJlbmRlcihmaXJzdCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB2ZXJpZnkoU2xpY2VTcGVjIHMpIHsKKyAgICAgICAgUGFyY2VsIHAgPSBQYXJjZWwub2J0YWluKCk7CisgICAgICAgIHMud3JpdGVUb1BhcmNlbChwLCAwKTsKKworICAgICAgICBwLnNldERhdGFQb3NpdGlvbigwKTsKKyAgICAgICAgU2xpY2VTcGVjIHMyID0gU2xpY2VTcGVjLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChwKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMocy5nZXRUeXBlKCksIHMyLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhzLmdldFJldmlzaW9uKCksIHMyLmdldFJldmlzaW9uKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMocywgczIpOworCisgICAgICAgIHAucmVjeWNsZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NwZWVjaC9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvc3BlZWNoL0FuZHJvaWQubWsKaW5kZXggMTQxMDcyNi4uMjQ1NzZkNiAxMDA3NTUKLS0tIGEvdGVzdHMvdGVzdHMvc3BlZWNoL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvdGVzdHMvc3BlZWNoL0FuZHJvaWQubWsKQEAgLTIyLDEwICsyMiwxMCBAQAogTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKIAogTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKLSAgICBjdHN0ZXN0cnVubmVyIFwKLSAgICBhbmRyb2lkLXN1cHBvcnQtdGVzdCBcCi0gICAgbGVnYWN5LWFuZHJvaWQtdGVzdCAgXAotICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwKKyAgICBjdHN0ZXN0cnVubmVyLWF4dCBcCisgICAgYW5kcm9pZHgudGVzdC5ydWxlcworCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicwogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKQEAgLTM2LDUgKzM2LDYgQEAKIAogIyBOZWVkZWQgZm9yIHRlc3RpbmcgTyBBUEkKICNMT0NBTF9TREtfVkVSU0lPTiA6PSB0ZXN0X2N1cnJlbnQKK0xPQ0FMX1BSSVZBVEVfUExBVEZPUk1fQVBJUyA6PSB0cnVlCiAKIGluY2x1ZGUgJChCVUlMRF9DVFNfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NwZWVjaC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdGVzdHMvc3BlZWNoL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggY2Q1ZDQ2Yy4uYWFhNTIxYSAxMDA3NTUKLS0tIGEvdGVzdHMvdGVzdHMvc3BlZWNoL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvc3BlZWNoL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTMzLDcgKzMzLDcgQEAKIAogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uV1JJVEVfRVhURVJOQUxfU1RPUkFHRSIvPgogCi0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5zcGVlY2gudHRzLmN0cyIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBvZiBhbmRyb2lkLnNwZWVjaCI+CiAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJsaXN0ZW5lciIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NwZWVjaC9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy90ZXN0cy9zcGVlY2gvQW5kcm9pZFRlc3QueG1sCmluZGV4IDljYzMxMzIuLmFkYzRmYWIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3NwZWVjaC9BbmRyb2lkVGVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvc3BlZWNoL0FuZHJvaWRUZXN0LnhtbApAQCAtMTQsNiArMTQsNyBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIFNwZWVjaCB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iZnJhbWV3b3JrIiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zcGVlY2gvc3JjL2FuZHJvaWQvc3BlZWNoL3R0cy9jdHMvU3R1YlRleHRUb1NwZWVjaFNlcnZpY2UuamF2YSBiL3Rlc3RzL3Rlc3RzL3NwZWVjaC9zcmMvYW5kcm9pZC9zcGVlY2gvdHRzL2N0cy9TdHViVGV4dFRvU3BlZWNoU2VydmljZS5qYXZhCmluZGV4IDg1N2ZmZDguLjQ2NjU2NDQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3NwZWVjaC9zcmMvYW5kcm9pZC9zcGVlY2gvdHRzL2N0cy9TdHViVGV4dFRvU3BlZWNoU2VydmljZS5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3NwZWVjaC9zcmMvYW5kcm9pZC9zcGVlY2gvdHRzL2N0cy9TdHViVGV4dFRvU3BlZWNoU2VydmljZS5qYXZhCkBAIC0xNSw2ICsxNSw3IEBACiAgKi8KIHBhY2thZ2UgYW5kcm9pZC5zcGVlY2gudHRzLmN0czsKIAoraW1wb3J0IGFuZHJvaWQub3MuQ29uZGl0aW9uVmFyaWFibGU7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0Zvcm1hdDsKIGltcG9ydCBhbmRyb2lkLm9zLkNvbmRpdGlvblZhcmlhYmxlOwogaW1wb3J0IGFuZHJvaWQuc3BlZWNoLnR0cy5TeW50aGVzaXNDYWxsYmFjazsKQEAgLTM3LDYgKzM4LDEwIEBACiAgICAgLy8gT2JqZWN0IHRoYXQgb25TeW50aGVzaXplVGV4dCB3aWxsICNibG9jayBvbiwgaWYgc2V0IHRvIG5vbi1udWxsCiAgICAgcHVibGljIHN0YXRpYyB2b2xhdGlsZSBDb25kaXRpb25WYXJpYWJsZSBzU3ludGhlc2l6ZVRleHRXYWl0OwogCisgICAgLy8gQ29uZGl0aW9uIHZhcmlhYmxlIHRoYXQgb25TeW50aGVzaXplVGV4dCB3aWxsICNvcGVuIHdoZW4gaXQgc3RhcnRlZAorICAgIC8vIHN5bmV0aGVzaXppbmcsIGlmIHNldCB0byBub24tbnVsbC4KKyAgICBwdWJsaWMgc3RhdGljIHZvbGF0aWxlIENvbmRpdGlvblZhcmlhYmxlIHNTeW50aGVzaXplVGV4dFN0YXJ0RXZlbnQ7CisKICAgICBwcml2YXRlIEFycmF5TGlzdDxMb2NhbGU+IHN1cHBvcnRlZExhbmd1YWdlcyA9IG5ldyBBcnJheUxpc3Q8TG9jYWxlPigpOwogICAgIHByaXZhdGUgQXJyYXlMaXN0PExvY2FsZT4gc3VwcG9ydGVkQ291bnRyaWVzID0gbmV3IEFycmF5TGlzdDxMb2NhbGU+KCk7CiAgICAgcHJpdmF0ZSBBcnJheUxpc3Q8TG9jYWxlPiBHQkZhbGxiYWNrcyA9IG5ldyBBcnJheUxpc3Q8TG9jYWxlPigpOwpAQCAtODAsNiArODUsMTEgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCisgICAgICAgIGZpbmFsIENvbmRpdGlvblZhcmlhYmxlIHN5bnRoZXNpemVUZXh0U3RhcnRFdmVudCA9IHNTeW50aGVzaXplVGV4dFN0YXJ0RXZlbnQ7CisgICAgICAgIGlmIChzeW50aGVzaXplVGV4dFN0YXJ0RXZlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgc1N5bnRoZXNpemVUZXh0U3RhcnRFdmVudC5vcGVuKCk7CisgICAgICAgIH0KKwogICAgICAgICBmaW5hbCBDb25kaXRpb25WYXJpYWJsZSBzeW50aGVzaXplVGV4dFdhaXQgPSBzU3ludGhlc2l6ZVRleHRXYWl0OwogICAgICAgICBpZiAoc3ludGhlc2l6ZVRleHRXYWl0ICE9IG51bGwpIHsKICAgICAgICAgICAgIHN5bnRoZXNpemVUZXh0V2FpdC5ibG9jaygxMDAwMCk7ICAvLyAxMHMgdGltZW91dApAQCAtMTAzLDcgKzExMyw3IEBACiAgICAgcHVibGljIFN0cmluZyBvbkdldERlZmF1bHRWb2ljZU5hbWVGb3IoU3RyaW5nIGxhbmcsIFN0cmluZyBjb3VudHJ5LCBTdHJpbmcgdmFyaWFudCkgewogICAgICAgICBMb2NhbGUgbG9jYWxlID0gbmV3IExvY2FsZShsYW5nLCBjb3VudHJ5KTsKICAgICAgICAgaWYgKHN1cHBvcnRlZENvdW50cmllcy5jb250YWlucyhsb2NhbGUpKSB7Ci0gICAgICAgICAgcmV0dXJuIFR0c0VuZ2luZXMubm9ybWFsaXplVFRTTG9jYWxlKGxvY2FsZSkudG9MYW5ndWFnZVRhZygpOworICAgICAgICAgICAgcmV0dXJuIGxvY2FsZS50b0xhbmd1YWdlVGFnKCk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGxhbmcuZXF1YWxzKCJlbmciKSkgewogICAgICAgICAgICAgaWYgKEdCRmFsbGJhY2tzLmNvbnRhaW5zKG5ldyBMb2NhbGUobGFuZywgY291bnRyeSkpKSB7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zcGVlY2gvc3JjL2FuZHJvaWQvc3BlZWNoL3R0cy9jdHMvVGV4dFRvU3BlZWNoU2VydmljZVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3NwZWVjaC9zcmMvYW5kcm9pZC9zcGVlY2gvdHRzL2N0cy9UZXh0VG9TcGVlY2hTZXJ2aWNlVGVzdC5qYXZhCmluZGV4IGZmYTc3ZjYuLjhlNTRkMzEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3NwZWVjaC9zcmMvYW5kcm9pZC9zcGVlY2gvdHRzL2N0cy9UZXh0VG9TcGVlY2hTZXJ2aWNlVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3NwZWVjaC9zcmMvYW5kcm9pZC9zcGVlY2gvdHRzL2N0cy9UZXh0VG9TcGVlY2hTZXJ2aWNlVGVzdC5qYXZhCkBAIC0yNiwxMiArMjYsOSBAQAogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNkZFRlc3Q7Ci0KIC8qKgogICogVGVzdHMgZm9yIHtAbGluayBhbmRyb2lkLnNwZWVjaC50dHMuVGV4dFRvU3BlZWNoU2VydmljZX0gdXNpbmcgU3R1YlRleHRUb1NwZWVjaFNlcnZpY2UuCiAgKi8KLUBDZGRUZXN0KHJlcXVpcmVtZW50PSIzLjExL0gtMC0xLEMtMS0xIikKIHB1YmxpYyBjbGFzcyBUZXh0VG9TcGVlY2hTZXJ2aWNlVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVUVEVSQU5DRSA9ICJ0ZXh0IHRvIHNwZWVjaCBjdHMgdGVzdCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNBTVBMRV9GSUxFX05BTUUgPSAibXl0dHMud2F2IjsKQEAgLTEyMCw2ICsxMTcsMjcgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHRlc3RTcGVha1N0b3BCZWhpbmRPdGhlckF1ZGlvUGxheWJhY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ29uZGl0aW9uVmFyaWFibGUgc3ludGhlc2l6ZVRleHRXYWl0ID0gbmV3IENvbmRpdGlvblZhcmlhYmxlKCk7CisgICAgICAgIGZpbmFsIENvbmRpdGlvblZhcmlhYmxlIHN5bnRoZXNpemVUZXh0U3RhcnRFdmVudCA9IG5ldyBDb25kaXRpb25WYXJpYWJsZSgpOworICAgICAgICBTdHViVGV4dFRvU3BlZWNoU2VydmljZS5zU3ludGhlc2l6ZVRleHRXYWl0ID0gc3ludGhlc2l6ZVRleHRXYWl0OworICAgICAgICBTdHViVGV4dFRvU3BlZWNoU2VydmljZS5zU3ludGhlc2l6ZVRleHRTdGFydEV2ZW50ID0gc3ludGhlc2l6ZVRleHRTdGFydEV2ZW50OworCisgICAgICAgIC8vIE1ha2UgdGhlIGF1ZGlvIHBsYXliYWNrIHF1ZXVlIGJ1c3kgYnkgcHV0dGluZyBhIDMwcyBvZiBzaWxlbmNlLgorICAgICAgICBnZXRUdHMoKS5zdG9wKCk7CisgICAgICAgIGdldFR0cygpLnBsYXlTaWxlbnRVdHRlcmFuY2UoMzAwMDAsIFRleHRUb1NwZWVjaC5RVUVVRV9BREQsICJzaWxlbmNlIik7CisKKyAgICAgICAgLy8gc3BlYWsoKSwgd2FpdCBpdCB0byBzdGFydGluZyBpbiB0aGUgc2VydmljZSwgYW5kIHN0b3AoKS4KKyAgICAgICAgaW50IHJlc3VsdCA9IGdldFR0cygpLnNwZWFrKFVUVEVSQU5DRSwgVGV4dFRvU3BlZWNoLlFVRVVFX0FERCwgbnVsbCwgInN0b3AiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzcGVhaygpIGZhaWxlZCIsIFRleHRUb1NwZWVjaC5TVUNDRVNTLCByZXN1bHQpOworICAgICAgICBhc3NlcnRUcnVlKCJzeW50aGVzaXMgbm90IHN0YXJ0ZWQiLCBzeW50aGVzaXplVGV4dFN0YXJ0RXZlbnQuYmxvY2soMTAwMDApKTsKKyAgICAgICAgZ2V0VHRzKCkuc3RvcCgpOworCisgICAgICAgIC8vIFdha2UgdXAgdGhlIFN0dWJzICNvblN5bnRoZXNpemVTcGVlY2ggKG9uZSB0aGF0IHdpbGwgYmUgc3RvcHBlZCBpbi1wcm9ncmVzcykKKyAgICAgICAgc3ludGhlc2l6ZVRleHRXYWl0Lm9wZW4oKTsKKworICAgICAgICBhc3NlcnRUcnVlKCJzcGVhaygpIHN0b3AgY2FsbGJhY2sgdGltZW91dCIsIG1UdHMud2FpdEZvclN0b3AoInN0b3AiKSk7CisgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdE1lZGlhUGxheWVyRmFpbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgRmlsZSBzYW1wbGVGaWxlID0gbmV3IEZpbGUoRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlRGlyZWN0b3J5KCksICJub3Rzb3VuZC53YXYiKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3NwZWVjaC9zcmMvYW5kcm9pZC9zcGVlY2gvdHRzL2N0cy9UZXh0VG9TcGVlY2hUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy9zcGVlY2gvc3JjL2FuZHJvaWQvc3BlZWNoL3R0cy9jdHMvVGV4dFRvU3BlZWNoVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGIyY2Q1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL3Rlc3RzL3NwZWVjaC9zcmMvYW5kcm9pZC9zcGVlY2gvdHRzL2N0cy9UZXh0VG9TcGVlY2hUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQuc3BlZWNoLnR0cy5jdHM7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5FbnZpcm9ubWVudDsKLWltcG9ydCBhbmRyb2lkLnNwZWVjaC50dHMuVGV4dFRvU3BlZWNoOwotaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNkZFRlc3Q7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotLyoqCi0gKiBUZXN0cyBmb3Ige0BsaW5rIGFuZHJvaWQuc3BlZWNoLnR0cy5UZXh0VG9TcGVlY2h9Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXh0VG9TcGVlY2hUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FNUExFX1RFWFQgPSAiVGhpcyBpcyBhIHNhbXBsZSB0ZXh0IHRvIHNwZWVjaCBzdHJpbmciOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQU1QTEVfRklMRV9OQU1FID0gIm15dHRzLndhdiI7Ci0KLSAgICBwcml2YXRlIFRleHRUb1NwZWVjaFdyYXBwZXIgbVR0czsKLSAgICAKLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iMy4xMS9DLTAtMSIpCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgbVR0cyA9IFRleHRUb1NwZWVjaFdyYXBwZXIuY3JlYXRlVGV4dFRvU3BlZWNoV3JhcHBlcihnZXRDb250ZXh0KCkpOwotICAgICAgICBpZiAobVR0cyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBQYWNrYWdlTWFuYWdlciBwbSA9IGdldENvbnRleHQoKS5nZXRQYWNrYWdlTWFuYWdlcigpOwotICAgICAgICAgICAgaWYgKCFwbS5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfQVVESU9fT1VUUFVUKSkgewotICAgICAgICAgICAgICAgIC8vIEl0IGlzIE9LIHRvIGhhdmUgbm8gVFRTLCB3aGVuIGF1ZGlvLW91dCBpcyBub3Qgc3VwcG9ydGVkLgotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiRkVBVFVSRV9BVURJT19PVVRQVVQgaXMgc2V0LCBidXQgdGhlcmUgaXMgbm8gVFRTIGVuZ2luZSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGFzc2VydE5vdE51bGwobVR0cyk7Ci0gICAgICAgIGFzc2VydFRydWUoY2hlY2tBbmRTZXRMYW5ndWFnZUF2YWlsYWJsZSgpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci50ZWFyRG93bigpOwotICAgICAgICBpZiAobVR0cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtVHRzLnNodXRkb3duKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFRleHRUb1NwZWVjaCBnZXRUdHMoKSB7Ci0gICAgICAgIHJldHVybiBtVHRzLmdldFR0cygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVuc3VyZXMgYXQgbGVhc3Qgb25lIGxhbmd1YWdlIGlzIGF2YWlsYWJsZSBmb3IgdHRzCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrQW5kU2V0TGFuZ3VhZ2VBdmFpbGFibGUoKSB7Ci0gICAgICAgIC8vIGNoZWNrcyBpZiBhdCBsZWFzdCBvbmUgbGFuZ3VhZ2UgaXMgYXZhaWxhYmxlIGluIFR0cwotICAgICAgICBmaW5hbCBMb2NhbGUgZGVmYXVsdExvY2FsZSA9IExvY2FsZS5nZXREZWZhdWx0KCk7Ci0gICAgICAgIC8vIElmIHRoZSBsYW5ndWFnZSBmb3IgdGhlIGRlZmF1bHQgbG9jYWxlIGlzIGF2YWlsYWJsZSwgdGhlbgotICAgICAgICAvLyB1c2UgdGhhdC4KLSAgICAgICAgaW50IGRlZmF1bHRBdmFpbGFiaWxpdHkgPSBnZXRUdHMoKS5pc0xhbmd1YWdlQXZhaWxhYmxlKGRlZmF1bHRMb2NhbGUpOwotCi0gICAgICAgIGlmIChkZWZhdWx0QXZhaWxhYmlsaXR5ID09IFRleHRUb1NwZWVjaC5MQU5HX0FWQUlMQUJMRSB8fAotICAgICAgICAgICAgZGVmYXVsdEF2YWlsYWJpbGl0eSA9PSBUZXh0VG9TcGVlY2guTEFOR19DT1VOVFJZX0FWQUlMQUJMRSB8fAotICAgICAgICAgICAgZGVmYXVsdEF2YWlsYWJpbGl0eSA9PSBUZXh0VG9TcGVlY2guTEFOR19DT1VOVFJZX1ZBUl9BVkFJTEFCTEUpIHsKLSAgICAgICAgICAgIGdldFR0cygpLnNldExhbmd1YWdlKGRlZmF1bHRMb2NhbGUpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKExvY2FsZSBsb2NhbGUgOiBMb2NhbGUuZ2V0QXZhaWxhYmxlTG9jYWxlcygpKSB7Ci0gICAgICAgICAgICBpbnQgYXZhaWxhYmlsaXR5ID0gZ2V0VHRzKCkuaXNMYW5ndWFnZUF2YWlsYWJsZShsb2NhbGUpOwotICAgICAgICAgICAgaWYgKGF2YWlsYWJpbGl0eSA9PSBUZXh0VG9TcGVlY2guTEFOR19BVkFJTEFCTEUgfHwKLSAgICAgICAgICAgICAgICBhdmFpbGFiaWxpdHkgPT0gVGV4dFRvU3BlZWNoLkxBTkdfQ09VTlRSWV9BVkFJTEFCTEUgfHwKLSAgICAgICAgICAgICAgICBhdmFpbGFiaWxpdHkgPT0gVGV4dFRvU3BlZWNoLkxBTkdfQ09VTlRSWV9WQVJfQVZBSUxBQkxFKSB7Ci0gICAgICAgICAgICAgICAgZ2V0VHRzKCkuc2V0TGFuZ3VhZ2UobG9jYWxlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjMuMTEvSC0wLTEiKQotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRDb250YWluc0VuZ2luZShTdHJpbmcgZW5naW5lLCBMaXN0PFRleHRUb1NwZWVjaC5FbmdpbmVJbmZvPiBlbmdpbmVzKSB7Ci0gICAgICAgIGZvciAoVGV4dFRvU3BlZWNoLkVuZ2luZUluZm8gZW5naW5lSW5mbyA6IGVuZ2luZXMpIHsKLSAgICAgICAgICAgIGlmIChlbmdpbmVJbmZvLm5hbWUuZXF1YWxzKGVuZ2luZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmFpbCgiRW5naW5lICIgKyBlbmdpbmUgKyAiIG5vdCBmb3VuZCIpOwotICAgIH0KLQotICAgIHByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gY3JlYXRlUGFyYW1zKFN0cmluZyB1dHRlcmFuY2VJZCkgewotICAgICAgICBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbXMgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgICAgIHBhcmFtcy5wdXQoVGV4dFRvU3BlZWNoLkVuZ2luZS5LRVlfUEFSQU1fVVRURVJBTkNFX0lELCB1dHRlcmFuY2VJZCk7Ci0gICAgICAgIHJldHVybiBwYXJhbXM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHdhaXRGb3JVdHRlcmFuY2UoU3RyaW5nIHV0dGVyYW5jZUlkKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbVR0cy53YWl0Rm9yQ29tcGxldGUodXR0ZXJhbmNlSWQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTeW50aGVzaXplVG9GaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChtVHRzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBGaWxlIHNhbXBsZUZpbGUgPSBuZXcgRmlsZShFbnZpcm9ubWVudC5nZXRFeHRlcm5hbFN0b3JhZ2VEaXJlY3RvcnkoKSwgU0FNUExFX0ZJTEVfTkFNRSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZShzYW1wbGVGaWxlLmV4aXN0cygpKTsKLQotICAgICAgICAgICAgaW50IHJlc3VsdCA9IGdldFR0cygpLnN5bnRoZXNpemVUb0ZpbGUoU0FNUExFX1RFWFQsIGNyZWF0ZVBhcmFtcygidG9maWxlIiksCi0gICAgICAgICAgICAgICAgICAgIHNhbXBsZUZpbGUuZ2V0UGF0aCgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygic3ludGhlc2l6ZVRvRmlsZSgpIGZhaWxlZCIsIFRleHRUb1NwZWVjaC5TVUNDRVNTLCByZXN1bHQpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKCJzeW50aGVzaXplVG9GaWxlKCkgY29tcGxldGlvbiB0aW1lb3V0Iiwgd2FpdEZvclV0dGVyYW5jZSgidG9maWxlIikpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgic3ludGhlc2l6ZVRvRmlsZSgpIGRpZG4ndCBwcm9kdWNlIGEgZmlsZSIsIHNhbXBsZUZpbGUuZXhpc3RzKCkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgic3ludGhlc2l6ZVRvRmlsZSgpIHByb2R1Y2VkIGEgbm9uLXNvdW5kIGZpbGUiLAotICAgICAgICAgICAgICAgICAgICBUZXh0VG9TcGVlY2hXcmFwcGVyLmlzU291bmRGaWxlKHNhbXBsZUZpbGUuZ2V0UGF0aCgpKSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBzYW1wbGVGaWxlLmRlbGV0ZSgpOwotICAgICAgICB9Ci0gICAgICAgIG1UdHMudmVyaWZ5KCJ0b2ZpbGUiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3BlYWsoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG1UdHMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGludCByZXN1bHQgPSBnZXRUdHMoKS5zcGVhayhTQU1QTEVfVEVYVCwgVGV4dFRvU3BlZWNoLlFVRVVFX0ZMVVNILCBjcmVhdGVQYXJhbXMoInNwZWFrIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInNwZWFrKCkgZmFpbGVkIiwgVGV4dFRvU3BlZWNoLlNVQ0NFU1MsIHJlc3VsdCk7Ci0gICAgICAgIGFzc2VydFRydWUoInNwZWFrKCkgY29tcGxldGlvbiB0aW1lb3V0Iiwgd2FpdEZvclV0dGVyYW5jZSgic3BlYWsiKSk7Ci0gICAgICAgIG1UdHMudmVyaWZ5KCJzcGVhayIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTcGVha1N0b3AoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG1UdHMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGdldFR0cygpLnN0b3AoKTsKLSAgICAgICAgZmluYWwgaW50IGl0ZXJhdGlvbnMgPSAyMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVyYXRpb25zOyBpKyspIHsKLSAgICAgICAgICAgIGludCByZXN1bHQgPSBnZXRUdHMoKS5zcGVhayhTQU1QTEVfVEVYVCwgVGV4dFRvU3BlZWNoLlFVRVVFX0FERCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgInN0b3BfIiArIEludGVnZXIudG9TdHJpbmcoaSkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJzcGVhaygpIGZhaWxlZCIsIFRleHRUb1NwZWVjaC5TVUNDRVNTLCByZXN1bHQpOwotICAgICAgICB9Ci0gICAgICAgIGdldFR0cygpLnN0b3AoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVyYXRpb25zOyBpKyspIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoInNwZWFrKCkgc3RvcCBjYWxsYmFjayB0aW1lb3V0IiwgbVR0cy53YWl0Rm9yU3RvcCgKLSAgICAgICAgICAgICAgICAgICAgInN0b3BfIiArIEludGVnZXIudG9TdHJpbmcoaSkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRFbmdpbmVzSW5jbHVkZXNEZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChtVHRzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBMaXN0PFRleHRUb1NwZWVjaC5FbmdpbmVJbmZvPiBlbmdpbmVzID0gZ2V0VHRzKCkuZ2V0RW5naW5lcygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJnZXRFbmdpbmVzKCkgcmV0dXJuZWQgbnVsbCIsIGVuZ2luZXMpOwotICAgICAgICBhc3NlcnRDb250YWluc0VuZ2luZShnZXRUdHMoKS5nZXREZWZhdWx0RW5naW5lKCksIGVuZ2luZXMpOwotICAgIH0KLSAgICAKLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iMy4xMS9ILTAtMS9XLTAtMSIpCi0gICAgcHVibGljIHZvaWQgdGVzdEdldEVuZ2luZXNJbmNsdWRlc01vY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG1UdHMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIExpc3Q8VGV4dFRvU3BlZWNoLkVuZ2luZUluZm8+IGVuZ2luZXMgPSBnZXRUdHMoKS5nZXRFbmdpbmVzKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoImdldEVuZ2luZXMoKSByZXR1cm5lZCBudWxsIiwgZW5naW5lcyk7Ci0gICAgICAgIGFzc2VydENvbnRhaW5zRW5naW5lKFRleHRUb1NwZWVjaFdyYXBwZXIuTU9DS19UVFNfRU5HSU5FLCBlbmdpbmVzKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zeW5jbWFuYWdlci9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvc3luY21hbmFnZXIvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hYjE2ZWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvc3luY21hbmFnZXIvQW5kcm9pZC5tawpAQCAtMCwwICsxLDQ0IEBACisjIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCisKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCisgICAgQ3RzU3luY01hbmFnZXJDb21tb24gXAorICAgIGFuZHJvaWR4LnRlc3QucnVsZXMgXAorICAgIGFuZHJvaWR4LmxlZ2FjeV9sZWdhY3ktc3VwcG9ydC12NCBcCisgICAgbW9ja2l0by10YXJnZXQtbWludXMtanVuaXQ0IFwKKyAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBcCisgICAgY3RzdGVzdHJ1bm5lci1heHQgXAorICAgIHViLXVpYXV0b21hdG9yCisKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIuc3R1YnMgYW5kcm9pZC50ZXN0LmJhc2Uuc3R1YnMKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQorCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzU3luY01hbmFnZXJUZXN0c0Nhc2VzCisKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCisKK0xPQ0FMX1NES19WRVJTSU9OIDo9IHRlc3RfY3VycmVudAorCitpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCisKK2luY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3N5bmNtYW5hZ2VyL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy90ZXN0cy9zeW5jbWFuYWdlci9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE5NGZhMDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zeW5jbWFuYWdlci9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImFuZHJvaWQuY29udGVudC5zeW5jbWFuYWdlci5jdHMiPgorCisgICAgPGFwcGxpY2F0aW9uPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5BQ0NFU1NfTkVUV09SS19TVEFURSIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfU1lOQ19TVEFUUyIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfU1lOQ19TRVRUSU5HUyIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX1NZTkNfU0VUVElOR1MiIC8+CisKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuY29udGVudC5zeW5jbWFuYWdlci5jdHMiCisgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBmb3Igc3luYyBtYW5hZ2VyIj4KKyAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9Imxpc3RlbmVyIgorICAgICAgICAgICAgYW5kcm9pZDp2YWx1ZT0iY29tLmFuZHJvaWQuY3RzLnJ1bm5lci5DdHNUZXN0UnVuTGlzdGVuZXIiIC8+CisgICAgPC9pbnN0cnVtZW50YXRpb24+CisKKzwvbWFuaWZlc3Q+CisKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3N5bmNtYW5hZ2VyL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL3N5bmNtYW5hZ2VyL0FuZHJvaWRUZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjY4ODk1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvc3luY21hbmFnZXIvQW5kcm9pZFRlc3QueG1sCkBAIC0wLDAgKzEsNDQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBTaG9ydGN1dE1hbmFnZXIgQ1RTIHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CisgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJmcmFtZXdvcmsiIC8+CisKKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlJ1bkNvbW1hbmRUYXJnZXRQcmVwYXJlciI+CisgICAgICAgIDwhLS0gRGlzYWJsZSBrZXlndWFyZCAtLT4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJydW4tY29tbWFuZCIgdmFsdWU9ImxvY2tzZXR0aW5ncyBzZXQtZGlzYWJsZWQgdHJ1ZSIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKworCisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4gPCEtLSBETyBOT1QgU1VCTUlUIFdJVEggRkFMU0UgLS0+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJDdHNTeW5jTWFuYWdlclRlc3RzQ2FzZXMuYXBrIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzU3luY01hbmFnZXJBcHAxLmFwayIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkN0c1N5bmNNYW5hZ2VyQXBwMi5hcGsiIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisKKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlJ1bkNvbW1hbmRUYXJnZXRQcmVwYXJlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVuLWNvbW1hbmQiIHZhbHVlPSJhbSB3YWl0LWZvci1icm9hZGNhc3QtaWRsZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJydW4tY29tbWFuZCIgdmFsdWU9ImFtIHNldC1zdGFuZGJ5LWJ1Y2tldCBhbmRyb2lkLmNvbnRlbnQuc3luY21hbmFnZXIuY3RzLmFwcDEgMTAiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVuLWNvbW1hbmQiIHZhbHVlPSJhbSBzZXQtc3RhbmRieS1idWNrZXQgYW5kcm9pZC5jb250ZW50LnN5bmNtYW5hZ2VyLmN0cy5hcHAyIDEwIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bi1jb21tYW5kIiB2YWx1ZT0ic2V0cHJvcCBsb2cudGFnLlN5bmNNYW5hZ2VyIFZFUkJPU0UiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVhcmRvd24tY29tbWFuZCIgdmFsdWU9InNldHByb3AgbG9nLnRhZy5TeW5jTWFuYWdlciBJTkZPIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5BbmRyb2lkSlVuaXRUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0icGFja2FnZSIgdmFsdWU9ImFuZHJvaWQuY29udGVudC5zeW5jbWFuYWdlci5jdHMiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVudGltZS1oaW50IiB2YWx1ZT0iMTBtMDBzIiAvPgorICAgIDwvdGVzdD4KKzwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3N5bmNtYW5hZ2VyL2FwcHMvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL3N5bmNtYW5hZ2VyL2FwcHMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWFhNmFjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvc3luY21hbmFnZXIvYXBwcy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTcgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zeW5jbWFuYWdlci9hcHBzL2FwcDEvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL3N5bmNtYW5hZ2VyL2FwcHMvYXBwMS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MTlmZTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zeW5jbWFuYWdlci9hcHBzL2FwcDEvQW5kcm9pZC5tawpAQCAtMCwwICsxLDQwIEBACisjIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNTeW5jTWFuYWdlckFwcDEKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQorCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAorICAgIEN0c1N5bmNNYW5hZ2VyQ29tbW9uIFwKKyAgICBhbmRyb2lkeC50ZXN0LnJ1bGVzIFwKKyAgICBhbmRyb2lkeC5sZWdhY3lfbGVnYWN5LXN1cHBvcnQtdjQgXAorICAgIG1vY2tpdG8tdGFyZ2V0LW1pbnVzLWp1bml0NCBcCisgICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgXAorICAgIHViLXVpYXV0b21hdG9yCisKK0xPQ0FMX1NES19WRVJTSU9OIDo9IHRlc3RfY3VycmVudAorCisjIHRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0CitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworCitpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zeW5jbWFuYWdlci9hcHBzL2FwcDEvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL3N5bmNtYW5hZ2VyL2FwcHMvYXBwMS9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJjNWM4YzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zeW5jbWFuYWdlci9hcHBzL2FwcDEvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDUzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJhbmRyb2lkLmNvbnRlbnQuc3luY21hbmFnZXIuY3RzLmFwcDEiPgorCisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX1NZTkNfU1RBVFMiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX1NZTkNfU0VUVElOR1MiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9TWU5DX1NFVFRJTkdTIiAvPgorCisgICAgPGFwcGxpY2F0aW9uPgorICAgICAgICA8cmVjZWl2ZXIgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmNvbnRlbnQuc3luY21hbmFnZXIuY3RzLmFwcC5Db21tUmVjZWl2ZXIiCisgICAgICAgICAgICBhbmRyb2lkOmVuYWJsZWQ9InRydWUiIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiPgorICAgICAgICA8L3JlY2VpdmVyPgorCisKKyAgICAgICAgPHNlcnZpY2UgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmNvbnRlbnQuc3luY21hbmFnZXIuY3RzLmFwcC5TeW5jTWFuYWdlckN0c0F1dGhlbnRpY2F0b3IiCisgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJmYWxzZSI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hY2NvdW50cy5BY2NvdW50QXV0aGVudGljYXRvciIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKworICAgICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYWNjb3VudHMuQWNjb3VudEF1dGhlbnRpY2F0b3IiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpyZXNvdXJjZT0iQHhtbC9hdXRoZW50aWNhdG9yIiAvPgorICAgICAgICA8L3NlcnZpY2U+CisKKyAgICAgICAgPHNlcnZpY2UgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmNvbnRlbnQuc3luY21hbmFnZXIuY3RzLmFwcC5TeW5jTWFuYWdlckN0c1N5bmNTZXJ2aWNlIgorICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0iZmFsc2UiID4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmNvbnRlbnQuU3luY0FkYXB0ZXIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5jb250ZW50LlN5bmNBZGFwdGVyIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cmVzb3VyY2U9IkB4bWwvc3luY2FkYXB0ZXIiIC8+CisgICAgICAgIDwvc2VydmljZT4KKworICAgICAgICA8cHJvdmlkZXIgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmNvbnRlbnQuc3luY21hbmFnZXIuY3RzLmFwcC5TeW5jTWFuYWdlckN0c1Byb3ZpZGVyIgorICAgICAgICAgICAgYW5kcm9pZDphdXRob3JpdGllcz0iYW5kcm9pZC5jb250ZW50LnN5bmNtYW5hZ2VyLmN0cy5hcHAucHJvdmlkZXIxIiAvPgorCisgICAgPC9hcHBsaWNhdGlvbj4KKzwvbWFuaWZlc3Q+CisKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3N5bmNtYW5hZ2VyL2FwcHMvYXBwMS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvdGVzdHMvdGVzdHMvc3luY21hbmFnZXIvYXBwcy9hcHAxL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQzZGM4NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3N5bmNtYW5hZ2VyL2FwcHMvYXBwMS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsMjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9ImFwcF9uYW1lIj5TeW5jTWFuYWdlciBDVFMgYXBwMTwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zeW5jbWFuYWdlci9hcHBzL2FwcDEvcmVzL3htbC9hdXRoZW50aWNhdG9yLnhtbCBiL3Rlc3RzL3Rlc3RzL3N5bmNtYW5hZ2VyL2FwcHMvYXBwMS9yZXMveG1sL2F1dGhlbnRpY2F0b3IueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkOTU2YmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zeW5jbWFuYWdlci9hcHBzL2FwcDEvcmVzL3htbC9hdXRoZW50aWNhdG9yLnhtbApAQCAtMCwwICsxLDE5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8YWNjb3VudC1hdXRoZW50aWNhdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmFjY291bnRUeXBlPSJhbmRyb2lkLmNvbnRlbnQuc3luY21hbmFnZXIuY3RzLmFwcDEiCisgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9hcHBfbmFtZSIgLz4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3N5bmNtYW5hZ2VyL2FwcHMvYXBwMS9yZXMveG1sL3N5bmNhZGFwdGVyLnhtbCBiL3Rlc3RzL3Rlc3RzL3N5bmNtYW5hZ2VyL2FwcHMvYXBwMS9yZXMveG1sL3N5bmNhZGFwdGVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDY4Y2E2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvc3luY21hbmFnZXIvYXBwcy9hcHAxL3Jlcy94bWwvc3luY2FkYXB0ZXIueG1sCkBAIC0wLDAgKzEsMjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzeW5jLWFkYXB0ZXIgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6Y29udGVudEF1dGhvcml0eT0iYW5kcm9pZC5jb250ZW50LnN5bmNtYW5hZ2VyLmN0cy5hcHAucHJvdmlkZXIxIgorICAgIGFuZHJvaWQ6YWNjb3VudFR5cGU9ImFuZHJvaWQuY29udGVudC5zeW5jbWFuYWdlci5jdHMuYXBwMSIKKy8+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zeW5jbWFuYWdlci9hcHBzL2FwcDEvc3JjL2FuZHJvaWQvY29udGVudC9zeW5jbWFuYWdlci9jdHMvYXBwL0NvbW1SZWNlaXZlci5qYXZhIGIvdGVzdHMvdGVzdHMvc3luY21hbmFnZXIvYXBwcy9hcHAxL3NyYy9hbmRyb2lkL2NvbnRlbnQvc3luY21hbmFnZXIvY3RzL2FwcC9Db21tUmVjZWl2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDQ2YTU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvc3luY21hbmFnZXIvYXBwcy9hcHAxL3NyYy9hbmRyb2lkL2NvbnRlbnQvc3luY21hbmFnZXIvY3RzL2FwcC9Db21tUmVjZWl2ZXIuamF2YQpAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5jb250ZW50LnN5bmNtYW5hZ2VyLmN0cy5hcHA7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuc3luY21hbmFnZXIuY3RzLlN5bmNNYW5hZ2VyQ3RzUHJvdG8uUGF5bG9hZDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuc3luY21hbmFnZXIuY3RzLlN5bmNNYW5hZ2VyQ3RzUHJvdG8uUGF5bG9hZC5SZXF1ZXN0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5zeW5jbWFuYWdlci5jdHMuU3luY01hbmFnZXJDdHNQcm90by5QYXlsb2FkLlJlc3BvbnNlLlN5bmNJbnZvY2F0aW9uczsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQnJvYWRjYXN0UnBjQmFzZTsKKworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uOworCitwdWJsaWMgY2xhc3MgQ29tbVJlY2VpdmVyIGV4dGVuZHMgQnJvYWRjYXN0UnBjQmFzZS5SZWNlaXZlckJhc2U8UGF5bG9hZCwgUGF5bG9hZD4geworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBQYXlsb2FkIGhhbmRsZVJlcXVlc3QoQ29udGV4dCBjb250ZXh0LCBQYXlsb2FkIHJlcXVlc3QpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDb250ZXh0SG9sZGVyLnNDb250ZXh0ID0gY29udGV4dDsKKworICAgICAgICBmaW5hbCBSZXF1ZXN0IHJlcSA9IHJlcXVlc3QuZ2V0UmVxdWVzdCgpOworICAgICAgICBmaW5hbCBQYXlsb2FkLlJlc3BvbnNlLkJ1aWxkZXIgcmVzID0gUGF5bG9hZC5SZXNwb25zZS5uZXdCdWlsZGVyKCk7CisKKyAgICAgICAgaWYgKHJlcS5oYXNBZGRBY2NvdW50KCkpIHsKKyAgICAgICAgICAgIFN5bmNNYW5hZ2VyQ3RzQXV0aGVudGljYXRvci5lbnN1cmVUZXN0QWNjb3VudChyZXEuZ2V0QWRkQWNjb3VudCgpLmdldE5hbWUoKSk7CisKKyAgICAgICAgfSBlbHNlIGlmIChyZXEuaGFzUmVtb3ZlQWxsQWNjb3VudHMoKSkgeworICAgICAgICAgICAgU3luY01hbmFnZXJDdHNBdXRoZW50aWNhdG9yLnJlbW92ZUFsbEFjY291bnRzKCk7CisKKyAgICAgICAgfSBlbHNlIGlmIChyZXEuaGFzQ2xlYXJTeW5jSW52b2NhdGlvbnMoKSkgeworICAgICAgICAgICAgU3luY01hbmFnZXJDdHNTeW5jQWRhcHRlci5jbGVhclN5bmNJbnZvY2F0aW9ucygpOworCisgICAgICAgIH0gZWxzZSBpZiAocmVxLmhhc0dldFN5bmNJbnZvY2F0aW9ucygpKSB7CisgICAgICAgICAgICByZXMuc2V0U3luY0ludm9jYXRpb25zKFN5bmNJbnZvY2F0aW9ucy5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgLmFkZEFsbFN5bmNJbnZvY2F0aW9ucyhTeW5jTWFuYWdlckN0c1N5bmNBZGFwdGVyLmdldFN5bmNJbnZvY2F0aW9ucygpKSk7CisKKyAgICAgICAgfSBlbHNlIGlmIChyZXEuaGFzU2V0UmVzdWx0KCkpIHsKKyAgICAgICAgICAgIFN5bmNNYW5hZ2VyQ3RzU3luY0FkYXB0ZXIuc2V0UmVzdWx0KHJlcS5nZXRTZXRSZXN1bHQoKSk7CisKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBQYXlsb2FkLm5ld0J1aWxkZXIoKS5zZXRSZXNwb25zZShyZXMpLmJ1aWxkKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGJ5dGVbXSByZXNwb25zZVRvQnl0ZXMoUGF5bG9hZCBwYXlsb2FkKSB7CisgICAgICAgIHJldHVybiBwYXlsb2FkLnRvQnl0ZUFycmF5KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFBheWxvYWQgYnl0ZXNUb1JlcXVlc3QoYnl0ZVtdIGJ5dGVzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gUGF5bG9hZC5wYXJzZUZyb20oYnl0ZXMpOworICAgICAgICB9IGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiIsIGUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc3luY21hbmFnZXIvYXBwcy9hcHAxL3NyYy9hbmRyb2lkL2NvbnRlbnQvc3luY21hbmFnZXIvY3RzL2FwcC9Db250ZXh0SG9sZGVyLmphdmEgYi90ZXN0cy90ZXN0cy9zeW5jbWFuYWdlci9hcHBzL2FwcDEvc3JjL2FuZHJvaWQvY29udGVudC9zeW5jbWFuYWdlci9jdHMvYXBwL0NvbnRleHRIb2xkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzk5ZThmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvc3luY21hbmFnZXIvYXBwcy9hcHAxL3NyYy9hbmRyb2lkL2NvbnRlbnQvc3luY21hbmFnZXIvY3RzL2FwcC9Db250ZXh0SG9sZGVyLmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQuY29udGVudC5zeW5jbWFuYWdlci5jdHMuYXBwOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CisKK3B1YmxpYyBjbGFzcyBDb250ZXh0SG9sZGVyIHsKKyAgICBzdGF0aWMgdm9sYXRpbGUgQ29udGV4dCBzQ29udGV4dDsKKworICAgIHB1YmxpYyBzdGF0aWMgQ29udGV4dCBnZXRDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gc0NvbnRleHQ7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3N5bmNtYW5hZ2VyL2FwcHMvYXBwMS9zcmMvYW5kcm9pZC9jb250ZW50L3N5bmNtYW5hZ2VyL2N0cy9hcHAvU3luY01hbmFnZXJDdHNBdXRoZW50aWNhdG9yLmphdmEgYi90ZXN0cy90ZXN0cy9zeW5jbWFuYWdlci9hcHBzL2FwcDEvc3JjL2FuZHJvaWQvY29udGVudC9zeW5jbWFuYWdlci9jdHMvYXBwL1N5bmNNYW5hZ2VyQ3RzQXV0aGVudGljYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMzY3YmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zeW5jbWFuYWdlci9hcHBzL2FwcDEvc3JjL2FuZHJvaWQvY29udGVudC9zeW5jbWFuYWdlci9jdHMvYXBwL1N5bmNNYW5hZ2VyQ3RzQXV0aGVudGljYXRvci5qYXZhCkBAIC0wLDAgKzEsMTQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5jb250ZW50LnN5bmNtYW5hZ2VyLmN0cy5hcHA7CisKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5UZXN0VXRpbHMud2FpdFVudGlsOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworaW1wb3J0IGFuZHJvaWQuYWNjb3VudHMuQWJzdHJhY3RBY2NvdW50QXV0aGVudGljYXRvcjsKK2ltcG9ydCBhbmRyb2lkLmFjY291bnRzLkFjY291bnQ7CitpbXBvcnQgYW5kcm9pZC5hY2NvdW50cy5BY2NvdW50QXV0aGVudGljYXRvclJlc3BvbnNlOworaW1wb3J0IGFuZHJvaWQuYWNjb3VudHMuQWNjb3VudE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5hY2NvdW50cy5OZXR3b3JrRXJyb3JFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5hcHAuU2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworLyoqCisgKiBBdXRoZW50aWNhdG9yIGZvciB0aGUgc3luYyB0ZXN0LgorICovCitwdWJsaWMgY2xhc3MgU3luY01hbmFnZXJDdHNBdXRoZW50aWNhdG9yIGV4dGVuZHMgU2VydmljZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTeW5jTWFuYWdlckN0c0F1dGhlbnRpY2F0b3IiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgQXV0aGVudGljYXRvciBzSW5zdGFuY2U7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSUJpbmRlciBvbkJpbmQoSW50ZW50IGludGVudCkgeworICAgICAgICBpZiAoc0luc3RhbmNlID09IG51bGwpIHsKKyAgICAgICAgICAgIHNJbnN0YW5jZSA9IG5ldyBBdXRoZW50aWNhdG9yKGdldEFwcGxpY2F0aW9uQ29udGV4dCgpKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiBzSW5zdGFuY2UuZ2V0SUJpbmRlcigpOworICAgIH0KKworICAgIHN0YXRpYyBBY2NvdW50TWFuYWdlciBnZXRBY2NvdW50TWFuYWdlcigpIHsKKyAgICAgICAgcmV0dXJuIENvbnRleHRIb2xkZXIuZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoQWNjb3VudE1hbmFnZXIuY2xhc3MpOworICAgIH0KKworICAgIHN0YXRpYyBTdHJpbmcgZ2V0QWNjb3VudFR5cGUoKSB7CisgICAgICAgIHJldHVybiBDb250ZXh0SG9sZGVyLmdldENvbnRleHQoKS5nZXRQYWNrYWdlTmFtZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSB0ZXN0IGFjY291bnQsIGlmIGl0IGRvZXNuJ3QgZXhpc3QgeWV0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBlbnN1cmVUZXN0QWNjb3VudChTdHJpbmcgbmFtZSkgeworCisgICAgICAgIGZpbmFsIEFjY291bnQgYWNjb3VudCA9IG5ldyBBY2NvdW50KG5hbWUsIGdldEFjY291bnRUeXBlKCkpOworCisgICAgICAgIEJ1bmRsZSByZXN1bHQgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgIHJlc3VsdC5wdXRTdHJpbmcoQWNjb3VudE1hbmFnZXIuS0VZX0FDQ09VTlRfVFlQRSwgYWNjb3VudC50eXBlKTsKKyAgICAgICAgcmVzdWx0LnB1dFN0cmluZyhBY2NvdW50TWFuYWdlci5LRVlfQUNDT1VOVF9OQU1FLCBhY2NvdW50Lm5hbWUpOworCisgICAgICAgIGlmICghQXJyYXlzLmFzTGlzdChnZXRBY2NvdW50TWFuYWdlcigpLmdldEFjY291bnRzQnlUeXBlKGFjY291bnQudHlwZSkpLmNvbnRhaW5zKGFjY291bnQpKSB7CisgICAgICAgICAgICBMb2cuaShUQUcsICJBZGRpbmcgYWNjb3VudDogIiArIGFjY291bnQpOworICAgICAgICAgICAgZ2V0QWNjb3VudE1hbmFnZXIoKS5hZGRBY2NvdW50RXhwbGljaXRseShhY2NvdW50LCAicGFzc3dvcmQiLCBuZXcgQnVuZGxlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSB0ZXN0IGFjY291bnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbEFjY291bnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEFjY291bnRNYW5hZ2VyIGFtID0gZ2V0QWNjb3VudE1hbmFnZXIoKTsKKworICAgICAgICBmb3IgKEFjY291bnQgYWNjb3VudCA6IGFtLmdldEFjY291bnRzQnlUeXBlKGdldEFjY291bnRUeXBlKCkpKSB7CisgICAgICAgICAgICBMb2cuaShUQUcsICJSZW1vdmluZyAiICsgYWNjb3VudCArICIuLi4iKTsKKyAgICAgICAgICAgIGFtLnJlbW92ZUFjY291bnRFeHBsaWNpdGx5KGFjY291bnQpOworICAgICAgICB9CisgICAgICAgIExvZy5pKFRBRywgIlJlbW92ZWQgYWxsIGFjY291bnRzIGZvciAiICsgZ2V0QWNjb3VudFR5cGUoKSk7CisKKyAgICAgICAgd2FpdFVudGlsKCJBY2NvdW50cyBzdGlsbCBleGlzdC4iLAorICAgICAgICAgICAgICAgICgpIC0+IGFtLmdldEFjY291bnRzQnlUeXBlKGdldEFjY291bnRUeXBlKCkpLmxlbmd0aCA9PSAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEF1dGhlbnRpY2F0b3IgZXh0ZW5kcyBBYnN0cmFjdEFjY291bnRBdXRoZW50aWNhdG9yIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CisKKyAgICAgICAgcHVibGljIEF1dGhlbnRpY2F0b3IoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQnVuZGxlIGFkZEFjY291bnQoQWNjb3VudEF1dGhlbnRpY2F0b3JSZXNwb25zZSByZXNwb25zZSwgU3RyaW5nIGFjY291bnRUeXBlLAorICAgICAgICAgICAgICAgIFN0cmluZyBhdXRoVG9rZW5UeXBlLCBTdHJpbmdbXSByZXF1aXJlZEZlYXR1cmVzLCBCdW5kbGUgb3B0aW9ucykKKyAgICAgICAgICAgICAgICB0aHJvd3MgTmV0d29ya0Vycm9yRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQnVuZGxlKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJ1bmRsZSBlZGl0UHJvcGVydGllcyhBY2NvdW50QXV0aGVudGljYXRvclJlc3BvbnNlIHJlc3BvbnNlLCBTdHJpbmcgYWNjb3VudFR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQnVuZGxlKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJ1bmRsZSB1cGRhdGVDcmVkZW50aWFscyhBY2NvdW50QXV0aGVudGljYXRvclJlc3BvbnNlIHJlc3BvbnNlLCBBY2NvdW50IGFjY291bnQsCisgICAgICAgICAgICAgICAgU3RyaW5nIGF1dGhUb2tlblR5cGUsIEJ1bmRsZSBvcHRpb25zKSB0aHJvd3MgTmV0d29ya0Vycm9yRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQnVuZGxlKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJ1bmRsZSBjb25maXJtQ3JlZGVudGlhbHMoQWNjb3VudEF1dGhlbnRpY2F0b3JSZXNwb25zZSByZXNwb25zZSwgQWNjb3VudCBhY2NvdW50LAorICAgICAgICAgICAgICAgIEJ1bmRsZSBvcHRpb25zKSB0aHJvd3MgTmV0d29ya0Vycm9yRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQnVuZGxlKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJ1bmRsZSBnZXRBdXRoVG9rZW4oQWNjb3VudEF1dGhlbnRpY2F0b3JSZXNwb25zZSByZXNwb25zZSwgQWNjb3VudCBhY2NvdW50LAorICAgICAgICAgICAgICAgIFN0cmluZyBhdXRoVG9rZW5UeXBlLCBCdW5kbGUgb3B0aW9ucykgdGhyb3dzIE5ldHdvcmtFcnJvckV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEJ1bmRsZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXV0aFRva2VuTGFiZWwoU3RyaW5nIGF1dGhUb2tlblR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAidG9rZW5fbGFiZWwiOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCdW5kbGUgaGFzRmVhdHVyZXMoQWNjb3VudEF1dGhlbnRpY2F0b3JSZXNwb25zZSByZXNwb25zZSwgQWNjb3VudCBhY2NvdW50LAorICAgICAgICAgICAgICAgIFN0cmluZ1tdIGZlYXR1cmVzKSB0aHJvd3MgTmV0d29ya0Vycm9yRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQnVuZGxlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zeW5jbWFuYWdlci9hcHBzL2FwcDEvc3JjL2FuZHJvaWQvY29udGVudC9zeW5jbWFuYWdlci9jdHMvYXBwL1N5bmNNYW5hZ2VyQ3RzUHJvdmlkZXIuamF2YSBiL3Rlc3RzL3Rlc3RzL3N5bmNtYW5hZ2VyL2FwcHMvYXBwMS9zcmMvYW5kcm9pZC9jb250ZW50L3N5bmNtYW5hZ2VyL2N0cy9hcHAvU3luY01hbmFnZXJDdHNQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmYzI4YTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zeW5jbWFuYWdlci9hcHBzL2FwcDEvc3JjL2FuZHJvaWQvY29udGVudC9zeW5jbWFuYWdlci9jdHMvYXBwL1N5bmNNYW5hZ2VyQ3RzUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5jb250ZW50LnN5bmNtYW5hZ2VyLmN0cy5hcHA7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKKworcHVibGljIGNsYXNzIFN5bmNNYW5hZ2VyQ3RzUHJvdmlkZXIgZXh0ZW5kcyBDb250ZW50UHJvdmlkZXIgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ3Vyc29yIHF1ZXJ5KFVyaSB1cmksIFN0cmluZ1tdIHByb2plY3Rpb24sIFN0cmluZyBzZWxlY3Rpb24sCisgICAgICAgICAgICBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzLCBTdHJpbmcgc29ydE9yZGVyKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZShVcmkgdXJpKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBVcmkgaW5zZXJ0KFVyaSB1cmksIENvbnRlbnRWYWx1ZXMgdmFsdWVzKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZGVsZXRlKFVyaSB1cmksIFN0cmluZyBzZWxlY3Rpb24sIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCB1cGRhdGUoVXJpIHVyaSwgQ29udGVudFZhbHVlcyB2YWx1ZXMsIFN0cmluZyBzZWxlY3Rpb24sIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc3luY21hbmFnZXIvYXBwcy9hcHAxL3NyYy9hbmRyb2lkL2NvbnRlbnQvc3luY21hbmFnZXIvY3RzL2FwcC9TeW5jTWFuYWdlckN0c1N5bmNBZGFwdGVyLmphdmEgYi90ZXN0cy90ZXN0cy9zeW5jbWFuYWdlci9hcHBzL2FwcDEvc3JjL2FuZHJvaWQvY29udGVudC9zeW5jbWFuYWdlci9jdHMvYXBwL1N5bmNNYW5hZ2VyQ3RzU3luY0FkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGI3NmMwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvc3luY21hbmFnZXIvYXBwcy9hcHAxL3NyYy9hbmRyb2lkL2NvbnRlbnQvc3luY21hbmFnZXIvY3RzL2FwcC9TeW5jTWFuYWdlckN0c1N5bmNBZGFwdGVyLmphdmEKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQuc3luY21hbmFnZXIuY3RzLmFwcDsKKworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLm1vY2s7CisKK2ltcG9ydCBhbmRyb2lkLmFjY291bnRzLkFjY291bnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkFic3RyYWN0VGhyZWFkZWRTeW5jQWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyQ2xpZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LlN5bmNSZXN1bHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnN5bmNtYW5hZ2VyLmN0cy5TeW5jTWFuYWdlckN0c1Byb3RvLlBheWxvYWQuUmVxdWVzdC5TZXRSZXN1bHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnN5bmNtYW5hZ2VyLmN0cy5TeW5jTWFuYWdlckN0c1Byb3RvLlBheWxvYWQuUmVxdWVzdC5TZXRSZXN1bHQuUmVzdWx0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5zeW5jbWFuYWdlci5jdHMuU3luY01hbmFnZXJDdHNQcm90by5QYXlsb2FkLlN5bmNJbnZvY2F0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuUGFyY2VsVXRpbHM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFN5bmMgYWRhcHRlciBmb3IgdGhlIHN5bmMgdGVzdC4KKyAqLworcHVibGljIGNsYXNzIFN5bmNNYW5hZ2VyQ3RzU3luY0FkYXB0ZXIgZXh0ZW5kcyBBYnN0cmFjdFRocmVhZGVkU3luY0FkYXB0ZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3luY01hbmFnZXJDdHNTeW5jQWRhcHRlciI7CisKKyAgICBwdWJsaWMgU3luY01hbmFnZXJDdHNTeW5jQWRhcHRlcihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgLyogYXV0b0luaXRpYWxpemU9ICovIGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3Qgc0xvY2sgPSBuZXcgT2JqZWN0KCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFN5bmNJbnZvY2F0aW9uPiBzU3luY0ludm9jYXRpb25zID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBTZXRSZXN1bHQgc1Jlc3VsdDsKKworICAgIHB1YmxpYyBpbnRlcmZhY2UgU3luY0ludGVyY2VwdG9yIHsKKyAgICAgICAgU3luY1Jlc3VsdCBvblBlcmZvcm1TeW5jKEFjY291bnQgYWNjb3VudCwgQnVuZGxlIGV4dHJhcywgU3RyaW5nIGF1dGhvcml0eSwKKyAgICAgICAgICAgICAgICBTeW5jUmVzdWx0IHN5bmNSZXN1bHQpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3luY0ludGVyY2VwdG9yIHNTeW5jSW50ZXJjZXB0b3IgPSBtb2NrKFN5bmNJbnRlcmNlcHRvci5jbGFzcyk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblBlcmZvcm1TeW5jKEFjY291bnQgYWNjb3VudCwgQnVuZGxlIGV4dHJhcywgU3RyaW5nIGF1dGhvcml0eSwKKyAgICAgICAgICAgIENvbnRlbnRQcm92aWRlckNsaWVudCBwcm92aWRlciwgU3luY1Jlc3VsdCBzeW5jUmVzdWx0KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBleHRyYXMuc2l6ZSgpOyAvLyBGb3JjZSB1bnBhcmNlbCBleHRyYXMuCisgICAgICAgICAgICBMb2cuaShUQUcsICJvblBlcmZvcm1TeW5jOiBhY2NvdW50PSIgKyBhY2NvdW50ICsgIiBhdXRob3JpdHk9IiArIGF1dGhvcml0eQorICAgICAgICAgICAgICAgICAgICArICIgZXh0cmFzPSIgKyBleHRyYXMpOworCisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNTeW5jSW52b2NhdGlvbnMpIHsKKyAgICAgICAgICAgICAgICBzU3luY0ludm9jYXRpb25zLmFkZChTeW5jSW52b2NhdGlvbi5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRUaW1lKFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEFjY291bnROYW1lKGFjY291bnQubmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRBY2NvdW50VHlwZShhY2NvdW50LnR5cGUpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0QXV0aG9yaXR5KGF1dGhvcml0eSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRFeHRyYXMoQnl0ZVN0cmluZy5jb3B5RnJvbShQYXJjZWxVdGlscy50b0J5dGVzKGV4dHJhcykpKS5idWlsZCgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGV4dHJhcy5nZXRCb29sZWFuKENvbnRlbnRSZXNvbHZlci5TWU5DX0VYVFJBU19JTklUSUFMSVpFKSkgeworICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5nZXRDb250ZW50UmVzb2x2ZXIoKS5zZXRJc1N5bmNhYmxlKGFjY291bnQsIGF1dGhvcml0eSwgMSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNTeW5jSW50ZXJjZXB0b3Iub25QZXJmb3JtU3luYyhhY2NvdW50LCBleHRyYXMsIGF1dGhvcml0eSwgc3luY1Jlc3VsdCk7CisKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoc0xvY2spIHsKKyAgICAgICAgICAgICAgICBpZiAoKHNSZXN1bHQgPT0gbnVsbCkgfHwgc1Jlc3VsdC5nZXRSZXN1bHQoKSA9PSBSZXN1bHQuT0spIHsKKyAgICAgICAgICAgICAgICAgICAgc3luY1Jlc3VsdC5zdGF0cy5udW1JbnNlcnRzKys7CisKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNSZXN1bHQuZ2V0UmVzdWx0KCkgPT0gUmVzdWx0LlNPRlRfRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgc3luY1Jlc3VsdC5zdGF0cy5udW1Jb0V4Y2VwdGlvbnMrKzsKKworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc1Jlc3VsdC5nZXRSZXN1bHQoKSA9PSBSZXN1bHQuSEFSRF9FUlJPUikgeworICAgICAgICAgICAgICAgICAgICBzeW5jUmVzdWx0LnN0YXRzLm51bUF1dGhFeGNlcHRpb25zKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0aCkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXhjZXB0aW9uIGluIG9uUGVyZm9ybVN5bmMiLCB0aCk7CisgICAgICAgIH0KKyAgICAgICAgTG9nLmkoVEFHLCAib25QZXJmb3JtU3luY0ZpbmlzaGluZzogYWNjb3VudD0iICsgYWNjb3VudCArICIgYXV0aG9yaXR5PSIgKyBhdXRob3JpdHkKKyAgICAgICAgICAgICAgICArICIgZXh0cmFzPSIgKyBleHRyYXMgKyAiIHJlc3VsdD0iICsgc3luY1Jlc3VsdCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMaXN0PFN5bmNJbnZvY2F0aW9uPiBnZXRTeW5jSW52b2NhdGlvbnMoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAoc0xvY2spIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PD4oc1N5bmNJbnZvY2F0aW9ucyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2xlYXJTeW5jSW52b2NhdGlvbnMoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAoc0xvY2spIHsKKyAgICAgICAgICAgIHNTeW5jSW52b2NhdGlvbnMuY2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRSZXN1bHQoU2V0UmVzdWx0IHJlc3VsdCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHNMb2NrKSB7CisgICAgICAgICAgICBzUmVzdWx0ID0gcmVzdWx0OworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc3luY21hbmFnZXIvYXBwcy9hcHAxL3NyYy9hbmRyb2lkL2NvbnRlbnQvc3luY21hbmFnZXIvY3RzL2FwcC9TeW5jTWFuYWdlckN0c1N5bmNTZXJ2aWNlLmphdmEgYi90ZXN0cy90ZXN0cy9zeW5jbWFuYWdlci9hcHBzL2FwcDEvc3JjL2FuZHJvaWQvY29udGVudC9zeW5jbWFuYWdlci9jdHMvYXBwL1N5bmNNYW5hZ2VyQ3RzU3luY1NlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDc0MWNiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvc3luY21hbmFnZXIvYXBwcy9hcHAxL3NyYy9hbmRyb2lkL2NvbnRlbnQvc3luY21hbmFnZXIvY3RzL2FwcC9TeW5jTWFuYWdlckN0c1N5bmNTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQuY29udGVudC5zeW5jbWFuYWdlci5jdHMuYXBwOworCitpbXBvcnQgYW5kcm9pZC5hcHAuU2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKKworLyoqCisgKiBTZXJ2aWNlIGZvciB0aGUgc3luYyB0ZXN0LgorICovCitwdWJsaWMgY2xhc3MgU3luY01hbmFnZXJDdHNTeW5jU2VydmljZSBleHRlbmRzIFNlcnZpY2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgU3luY01hbmFnZXJDdHNTeW5jQWRhcHRlciBzQWRhcHRlcjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgSUJpbmRlciBvbkJpbmQoSW50ZW50IGludGVudCkgeworICAgICAgICBpZiAoc0FkYXB0ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgc0FkYXB0ZXIgPSBuZXcgU3luY01hbmFnZXJDdHNTeW5jQWRhcHRlcihnZXRBcHBsaWNhdGlvbkNvbnRleHQoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNBZGFwdGVyLmdldFN5bmNBZGFwdGVyQmluZGVyKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc3luY21hbmFnZXIvYXBwcy9hcHAyL0FuZHJvaWQubWsgYi90ZXN0cy90ZXN0cy9zeW5jbWFuYWdlci9hcHBzL2FwcDIvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGJjMmYzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvc3luY21hbmFnZXIvYXBwcy9hcHAyL0FuZHJvaWQubWsKQEAgLTAsMCArMSw0MCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzU3luY01hbmFnZXJBcHAyCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIC4uL2FwcDEvc3JjKQorCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAorICAgIEN0c1N5bmNNYW5hZ2VyQ29tbW9uIFwKKyAgICBhbmRyb2lkeC50ZXN0LnJ1bGVzIFwKKyAgICBhbmRyb2lkeC5sZWdhY3lfbGVnYWN5LXN1cHBvcnQtdjQgXAorICAgIG1vY2tpdG8tdGFyZ2V0LW1pbnVzLWp1bml0NCBcCisgICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgXAorICAgIHViLXVpYXV0b21hdG9yCisKK0xPQ0FMX1NES19WRVJTSU9OIDo9IHRlc3RfY3VycmVudAorCisjIHRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0CitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworCitpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zeW5jbWFuYWdlci9hcHBzL2FwcDIvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL3N5bmNtYW5hZ2VyL2FwcHMvYXBwMi9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjgyZGE4YWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zeW5jbWFuYWdlci9hcHBzL2FwcDIvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDUyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJhbmRyb2lkLmNvbnRlbnQuc3luY21hbmFnZXIuY3RzLmFwcDIiPgorCisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX1NZTkNfU1RBVFMiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9TWU5DX1NFVFRJTkdTIiAvPgorCisgICAgPGFwcGxpY2F0aW9uPgorICAgICAgICA8cmVjZWl2ZXIgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmNvbnRlbnQuc3luY21hbmFnZXIuY3RzLmFwcC5Db21tUmVjZWl2ZXIiCisgICAgICAgICAgICBhbmRyb2lkOmVuYWJsZWQ9InRydWUiIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiPgorICAgICAgICA8L3JlY2VpdmVyPgorCisKKyAgICAgICAgPHNlcnZpY2UgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmNvbnRlbnQuc3luY21hbmFnZXIuY3RzLmFwcC5TeW5jTWFuYWdlckN0c0F1dGhlbnRpY2F0b3IiCisgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJmYWxzZSI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hY2NvdW50cy5BY2NvdW50QXV0aGVudGljYXRvciIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKworICAgICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYWNjb3VudHMuQWNjb3VudEF1dGhlbnRpY2F0b3IiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpyZXNvdXJjZT0iQHhtbC9hdXRoZW50aWNhdG9yIiAvPgorICAgICAgICA8L3NlcnZpY2U+CisKKyAgICAgICAgPHNlcnZpY2UgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmNvbnRlbnQuc3luY21hbmFnZXIuY3RzLmFwcC5TeW5jTWFuYWdlckN0c1N5bmNTZXJ2aWNlIgorICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0iZmFsc2UiID4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmNvbnRlbnQuU3luY0FkYXB0ZXIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5jb250ZW50LlN5bmNBZGFwdGVyIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cmVzb3VyY2U9IkB4bWwvc3luY2FkYXB0ZXIiIC8+CisgICAgICAgIDwvc2VydmljZT4KKworICAgICAgICA8cHJvdmlkZXIgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmNvbnRlbnQuc3luY21hbmFnZXIuY3RzLmFwcC5TeW5jTWFuYWdlckN0c1Byb3ZpZGVyIgorICAgICAgICAgICAgYW5kcm9pZDphdXRob3JpdGllcz0iYW5kcm9pZC5jb250ZW50LnN5bmNtYW5hZ2VyLmN0cy5hcHAucHJvdmlkZXIyIiAvPgorCisgICAgPC9hcHBsaWNhdGlvbj4KKzwvbWFuaWZlc3Q+CisKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3N5bmNtYW5hZ2VyL2FwcHMvYXBwMi9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvdGVzdHMvdGVzdHMvc3luY21hbmFnZXIvYXBwcy9hcHAyL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMzNDE1NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3N5bmNtYW5hZ2VyL2FwcHMvYXBwMi9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsMjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9ImFwcF9uYW1lIj5TeW5jTWFuYWdlciBDVFMgYXBwMjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zeW5jbWFuYWdlci9hcHBzL2FwcDIvcmVzL3htbC9hdXRoZW50aWNhdG9yLnhtbCBiL3Rlc3RzL3Rlc3RzL3N5bmNtYW5hZ2VyL2FwcHMvYXBwMi9yZXMveG1sL2F1dGhlbnRpY2F0b3IueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4YjIwMDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zeW5jbWFuYWdlci9hcHBzL2FwcDIvcmVzL3htbC9hdXRoZW50aWNhdG9yLnhtbApAQCAtMCwwICsxLDE5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8YWNjb3VudC1hdXRoZW50aWNhdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmFjY291bnRUeXBlPSJhbmRyb2lkLmNvbnRlbnQuc3luY21hbmFnZXIuY3RzLmFwcDIiCisgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9hcHBfbmFtZSIgLz4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3N5bmNtYW5hZ2VyL2FwcHMvYXBwMi9yZXMveG1sL3N5bmNhZGFwdGVyLnhtbCBiL3Rlc3RzL3Rlc3RzL3N5bmNtYW5hZ2VyL2FwcHMvYXBwMi9yZXMveG1sL3N5bmNhZGFwdGVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzAzNzlkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvc3luY21hbmFnZXIvYXBwcy9hcHAyL3Jlcy94bWwvc3luY2FkYXB0ZXIueG1sCkBAIC0wLDAgKzEsMjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzeW5jLWFkYXB0ZXIgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6Y29udGVudEF1dGhvcml0eT0iYW5kcm9pZC5jb250ZW50LnN5bmNtYW5hZ2VyLmN0cy5hcHAucHJvdmlkZXIyIgorICAgIGFuZHJvaWQ6YWNjb3VudFR5cGU9ImFuZHJvaWQuY29udGVudC5zeW5jbWFuYWdlci5jdHMuYXBwMiIKKy8+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zeW5jbWFuYWdlci9jb21tb24vQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL3N5bmNtYW5hZ2VyL2NvbW1vbi9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MDhiMTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zeW5jbWFuYWdlci9jb21tb24vQW5kcm9pZC5tawpAQCAtMCwwICsxLDM2IEBACisjIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpIFwKKyAgICAkKGNhbGwgYWxsLXByb3RvLWZpbGVzLXVuZGVyLCBwcm90bykKKworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gXAorICAgIGFuZHJvaWR4LnRlc3QucnVsZXMgXAorICAgIGFuZHJvaWR4LmxlZ2FjeV9sZWdhY3ktc3VwcG9ydC12NCBcCisgICAgbW9ja2l0by10YXJnZXQgXAorICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0IFwKKyAgICBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX01PRFVMRSA6PSBDdHNTeW5jTWFuYWdlckNvbW1vbgorCitMT0NBTF9TREtfVkVSU0lPTiA6PSB0ZXN0X2N1cnJlbnQKKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19KQVZBX0xJQlJBUlkpCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zeW5jbWFuYWdlci9jb21tb24vcHJvdG8vc3luY19tYW5hZ2VyX2N0cy5wcm90byBiL3Rlc3RzL3Rlc3RzL3N5bmNtYW5hZ2VyL2NvbW1vbi9wcm90by9zeW5jX21hbmFnZXJfY3RzLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1M2RjMjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zeW5jbWFuYWdlci9jb21tb24vcHJvdG8vc3luY19tYW5hZ2VyX2N0cy5wcm90bwpAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3N5bnRheCA9ICJwcm90bzIiOworCitvcHRpb24gamF2YV9vdXRlcl9jbGFzc25hbWUgPSAiU3luY01hbmFnZXJDdHNQcm90byI7CisKK3BhY2thZ2UgYW5kcm9pZC5jb250ZW50LnN5bmNtYW5hZ2VyLmN0czsKKworbWVzc2FnZSBQYXlsb2FkIHsKKyAgICBtZXNzYWdlIFN5bmNJbnZvY2F0aW9uIHsKKyAgICAgICAgb3B0aW9uYWwgaW50NjQgdGltZSA9IDE7CisgICAgICAgIG9wdGlvbmFsIHN0cmluZyBhY2NvdW50X25hbWUgPSAyOworICAgICAgICBvcHRpb25hbCBzdHJpbmcgYWNjb3VudF90eXBlID0gMzsKKyAgICAgICAgb3B0aW9uYWwgc3RyaW5nIGF1dGhvcml0eSA9IDQ7CisgICAgICAgIG9wdGlvbmFsIGJ5dGVzIGV4dHJhcyA9IDU7CisgICAgfQorCisgICAgbWVzc2FnZSBSZXF1ZXN0IHsKKyAgICAgICAgbWVzc2FnZSBBZGRBY2NvdW50IHsKKyAgICAgICAgICAgIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgICAgICAgfQorICAgICAgICBvcHRpb25hbCBBZGRBY2NvdW50IGFkZF9hY2NvdW50ID0gMTsKKworICAgICAgICBtZXNzYWdlIFJlbW92ZUFsbEFjY291bnRzIHsKKyAgICAgICAgfQorICAgICAgICBvcHRpb25hbCBSZW1vdmVBbGxBY2NvdW50cyByZW1vdmVfYWxsX2FjY291bnRzID0gMjsKKworICAgICAgICBtZXNzYWdlIENsZWFyU3luY0ludm9jYXRpb25zIHsKKyAgICAgICAgfQorICAgICAgICBvcHRpb25hbCBDbGVhclN5bmNJbnZvY2F0aW9ucyBjbGVhcl9zeW5jX2ludm9jYXRpb25zID0gMzsKKworICAgICAgICBtZXNzYWdlIEdldFN5bmNJbnZvY2F0aW9ucyB7CisgICAgICAgIH0KKyAgICAgICAgb3B0aW9uYWwgR2V0U3luY0ludm9jYXRpb25zIGdldF9zeW5jX2ludm9jYXRpb25zID0gNDsKKworICAgICAgICBtZXNzYWdlIFN5bmNSZXF1ZXN0IHsKKyAgICAgICAgICAgIG9wdGlvbmFsIFN5bmNJbnZvY2F0aW9uIHBhcmFtZXRlcnMgPSAxOworICAgICAgICB9CisgICAgICAgIG9wdGlvbmFsIFN5bmNSZXF1ZXN0IHN5bmNfcmVxdWVzdCA9IDU7CisKKyAgICAgICAgbWVzc2FnZSBTZXRSZXN1bHQgeworICAgICAgICAgICAgZW51bSBSZXN1bHQgeworICAgICAgICAgICAgICAgIE9LID0gMDsKKyAgICAgICAgICAgICAgICBTT0ZUX0VSUk9SID0gMTsKKyAgICAgICAgICAgICAgICBIQVJEX0VSUk9SID0gMjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3B0aW9uYWwgUmVzdWx0IHJlc3VsdCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgb3B0aW9uYWwgU2V0UmVzdWx0IHNldF9yZXN1bHQgPSA2OworICAgIH0KKworICAgIG9wdGlvbmFsIFJlcXVlc3QgcmVxdWVzdCA9IDE7CisKKyAgICBtZXNzYWdlIFJlc3BvbnNlIHsKKyAgICAgICAgbWVzc2FnZSBTeW5jSW52b2NhdGlvbnMgeworICAgICAgICAgICAgcmVwZWF0ZWQgU3luY0ludm9jYXRpb24gc3luY19pbnZvY2F0aW9ucyA9IDE7CisgICAgICAgIH0KKyAgICAgICAgb3B0aW9uYWwgU3luY0ludm9jYXRpb25zIHN5bmNfaW52b2NhdGlvbnMgPSAxOworICAgIH0KKyAgICBvcHRpb25hbCBSZXNwb25zZSByZXNwb25zZSA9IDI7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zeW5jbWFuYWdlci9jb21tb24vc3JjL2FuZHJvaWQvY29udGVudC9zeW5jbWFuYWdlci9jdHMvY29tbW9uL1Byb3RvVXRpbHMuamF2YSBiL3Rlc3RzL3Rlc3RzL3N5bmNtYW5hZ2VyL2NvbW1vbi9zcmMvYW5kcm9pZC9jb250ZW50L3N5bmNtYW5hZ2VyL2N0cy9jb21tb24vUHJvdG9VdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYmZhM2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zeW5jbWFuYWdlci9jb21tb24vc3JjL2FuZHJvaWQvY29udGVudC9zeW5jbWFuYWdlci9jdHMvY29tbW9uL1Byb3RvVXRpbHMuamF2YQpAQCAtMCwwICsxLDIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5jb250ZW50LnN5bmNtYW5hZ2VyLmN0cy5jb21tb247CisKK3B1YmxpYyBjbGFzcyBQcm90b1V0aWxzIHsKKyAgICBwcml2YXRlIFByb3RvVXRpbHMoKSB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc3luY21hbmFnZXIvY29tbW9uL3NyYy9hbmRyb2lkL2NvbnRlbnQvc3luY21hbmFnZXIvY3RzL2NvbW1vbi9WYWx1ZXMuamF2YSBiL3Rlc3RzL3Rlc3RzL3N5bmNtYW5hZ2VyL2NvbW1vbi9zcmMvYW5kcm9pZC9jb250ZW50L3N5bmNtYW5hZ2VyL2N0cy9jb21tb24vVmFsdWVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFlMzc0YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3N5bmNtYW5hZ2VyL2NvbW1vbi9zcmMvYW5kcm9pZC9jb250ZW50L3N5bmNtYW5hZ2VyL2N0cy9jb21tb24vVmFsdWVzLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQuY29udGVudC5zeW5jbWFuYWdlci5jdHMuY29tbW9uOworCitpbXBvcnQgYW5kcm9pZC5hY2NvdW50cy5BY2NvdW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworCitwdWJsaWMgY2xhc3MgVmFsdWVzIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFAxX1BBQ0tBR0UgPSAiYW5kcm9pZC5jb250ZW50LnN5bmNtYW5hZ2VyLmN0cy5hcHAxIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFAyX1BBQ0tBR0UgPSAiYW5kcm9pZC5jb250ZW50LnN5bmNtYW5hZ2VyLmN0cy5hcHAyIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQWNjb3VudCBBQ0NPVU5UXzFfQSA9IG5ldyBBY2NvdW50KCJhY2NvdW50QSIsIEFQUDFfUEFDS0FHRSk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFAxX0FVVEhPUklUWSA9ICJhbmRyb2lkLmNvbnRlbnQuc3luY21hbmFnZXIuY3RzLmFwcC5wcm92aWRlcjEiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUDJfQVVUSE9SSVRZID0gImFuZHJvaWQuY29udGVudC5zeW5jbWFuYWdlci5jdHMuYXBwLnByb3ZpZGVyMiI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NX1JFQ0VJVkVSID0gImFuZHJvaWQuY29udGVudC5zeW5jbWFuYWdlci5jdHMuYXBwLkNvbW1SZWNlaXZlciI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBvbmVudE5hbWUgQVBQMV9SRUNFSVZFUiA9IGdldENvbW1SZWNlaXZlcihBUFAxX1BBQ0tBR0UpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcG9uZW50TmFtZSBBUFAyX1JFQ0VJVkVSID0gZ2V0Q29tbVJlY2VpdmVyKEFQUDJfUEFDS0FHRSk7CisKKyAgICBwdWJsaWMgc3RhdGljIENvbXBvbmVudE5hbWUgZ2V0Q29tbVJlY2VpdmVyKFN0cmluZyBwYWNrYWdlTmFtZSkgeworICAgICAgICByZXR1cm4gbmV3IENvbXBvbmVudE5hbWUocGFja2FnZU5hbWUsIENPTU1fUkVDRUlWRVIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3N5bmNtYW5hZ2VyL3NyYy9hbmRyb2lkL2NvbnRlbnQvc3luY21hbmFnZXIvY3RzL0Jyb2FkY2FzdFJwYy5qYXZhIGIvdGVzdHMvdGVzdHMvc3luY21hbmFnZXIvc3JjL2FuZHJvaWQvY29udGVudC9zeW5jbWFuYWdlci9jdHMvQnJvYWRjYXN0UnBjLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYwNmY2YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3N5bmNtYW5hZ2VyL3NyYy9hbmRyb2lkL2NvbnRlbnQvc3luY21hbmFnZXIvY3RzL0Jyb2FkY2FzdFJwYy5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQuc3luY21hbmFnZXIuY3RzOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5zeW5jbWFuYWdlci5jdHMuY29tbW9uLlZhbHVlcy5nZXRDb21tUmVjZWl2ZXI7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuc3luY21hbmFnZXIuY3RzLlN5bmNNYW5hZ2VyQ3RzUHJvdG8uUGF5bG9hZDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuc3luY21hbmFnZXIuY3RzLlN5bmNNYW5hZ2VyQ3RzUHJvdG8uUGF5bG9hZC5SZXF1ZXN0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5zeW5jbWFuYWdlci5jdHMuU3luY01hbmFnZXJDdHNQcm90by5QYXlsb2FkLlJlcXVlc3QuQnVpbGRlcjsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQnJvYWRjYXN0UnBjQmFzZTsKKworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uOworCitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworCitwdWJsaWMgY2xhc3MgQnJvYWRjYXN0UnBjIGV4dGVuZHMgQnJvYWRjYXN0UnBjQmFzZTxQYXlsb2FkLCBQYXlsb2FkPiB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGJ5dGVbXSByZXF1ZXN0VG9CeXRlcyhQYXlsb2FkIHRlc3RTZXJ2aWNlUmVxdWVzdCkgeworICAgICAgICByZXR1cm4gdGVzdFNlcnZpY2VSZXF1ZXN0LnRvQnl0ZUFycmF5KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFBheWxvYWQgYnl0ZXNUb1Jlc3BvbnNlKGJ5dGVbXSBieXRlcykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIFBheWxvYWQucGFyc2VGcm9tKGJ5dGVzKTsKKyAgICAgICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24iLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBQYXlsb2FkLlJlc3BvbnNlIGludm9rZShTdHJpbmcgdGFyZ2V0UGFja2FnZSwgQ29uc3VtZXI8QnVpbGRlcj4gYykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEJ1aWxkZXIgcmIgPSAgUmVxdWVzdC5uZXdCdWlsZGVyKCk7CisgICAgICAgIGMuYWNjZXB0KHJiKTsKKyAgICAgICAgZmluYWwgUmVxdWVzdCByZXEgPSByYi5idWlsZCgpOworICAgICAgICByZXR1cm4gc3VwZXIuaW52b2tlKGdldENvbW1SZWNlaXZlcih0YXJnZXRQYWNrYWdlKSwKKyAgICAgICAgICAgICAgICBQYXlsb2FkLm5ld0J1aWxkZXIoKS5zZXRSZXF1ZXN0KHJlcSkuYnVpbGQoKSkuZ2V0UmVzcG9uc2UoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zeW5jbWFuYWdlci9zcmMvYW5kcm9pZC9jb250ZW50L3N5bmNtYW5hZ2VyL2N0cy9DdHNTeW5jTWFuYWdlclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3N5bmNtYW5hZ2VyL3NyYy9hbmRyb2lkL2NvbnRlbnQvc3luY21hbmFnZXIvY3RzL0N0c1N5bmNNYW5hZ2VyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZGI3ZmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy9zeW5jbWFuYWdlci9zcmMvYW5kcm9pZC9jb250ZW50L3N5bmNtYW5hZ2VyL2N0cy9DdHNTeW5jTWFuYWdlclRlc3QuamF2YQpAQCAtMCwwICsxLDI3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQuY29udGVudC5zeW5jbWFuYWdlci5jdHM7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LnN5bmNtYW5hZ2VyLmN0cy5jb21tb24uVmFsdWVzLkFDQ09VTlRfMV9BOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuc3luY21hbmFnZXIuY3RzLmNvbW1vbi5WYWx1ZXMuQVBQMV9BVVRIT1JJVFk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5zeW5jbWFuYWdlci5jdHMuY29tbW9uLlZhbHVlcy5BUFAxX1BBQ0tBR0U7CisKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5CdW5kbGVVdGlscy5tYWtlQnVuZGxlOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNvbm5lY3Rpdml0eVV0aWxzLmFzc2VydE5ldHdvcmtDb25uZWN0ZWQ7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuU2V0dGluZ3NVdGlscy5wdXRHbG9iYWxTZXR0aW5nOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlN5c3RlbVV0aWwucnVuQ29tbWFuZEFuZFByaW50T25Mb2djYXQ7CisKK2ltcG9ydCBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlLmFzc2VydEVxdWFsczsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBhbmRyb2lkLmFjY291bnRzLkFjY291bnQ7CitpbXBvcnQgYW5kcm9pZC5hcHAudXNhZ2UuVXNhZ2VTdGF0c01hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuc3luY21hbmFnZXIuY3RzLlN5bmNNYW5hZ2VyQ3RzUHJvdG8uUGF5bG9hZC5SZXF1ZXN0LkFkZEFjY291bnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnN5bmNtYW5hZ2VyLmN0cy5TeW5jTWFuYWdlckN0c1Byb3RvLlBheWxvYWQuUmVxdWVzdC5DbGVhclN5bmNJbnZvY2F0aW9uczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuc3luY21hbmFnZXIuY3RzLlN5bmNNYW5hZ2VyQ3RzUHJvdG8uUGF5bG9hZC5SZXF1ZXN0LkdldFN5bmNJbnZvY2F0aW9uczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuc3luY21hbmFnZXIuY3RzLlN5bmNNYW5hZ2VyQ3RzUHJvdG8uUGF5bG9hZC5SZXF1ZXN0LlJlbW92ZUFsbEFjY291bnRzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5zeW5jbWFuYWdlci5jdHMuU3luY01hbmFnZXJDdHNQcm90by5QYXlsb2FkLlJlcXVlc3QuU2V0UmVzdWx0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5zeW5jbWFuYWdlci5jdHMuU3luY01hbmFnZXJDdHNQcm90by5QYXlsb2FkLlJlcXVlc3QuU2V0UmVzdWx0LlJlc3VsdDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuc3luY21hbmFnZXIuY3RzLlN5bmNNYW5hZ2VyQ3RzUHJvdG8uUGF5bG9hZC5SZXNwb25zZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuc3luY21hbmFnZXIuY3RzLlN5bmNNYW5hZ2VyQ3RzUHJvdG8uUGF5bG9hZC5TeW5jSW52b2NhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTGFyZ2VUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkFtVXRpbHM7CitpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5CYXR0ZXJ5VXRpbHM7CitpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5PbkZhaWx1cmVSdWxlOworaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuUGFyY2VsVXRpbHM7CitpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5TeXN0ZW1VdGlsOworaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuVGVzdFV0aWxzOworaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuVGVzdFV0aWxzLkJvb2xlYW5TdXBwbGllcldpdGhUaHJvdzsKKworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuRGVzY3JpcHRpb247CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLm1vZGVsLlN0YXRlbWVudDsKKworLy8gVE9ETyBEb24ndCBydW4gaWYgbm8gbmV0d29yayBpcyBhdmFpbGFibGUuCitATGFyZ2VUZXN0CitAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIEN0c1N5bmNNYW5hZ2VyVGVzdCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJDdHNTeW5jTWFuYWdlclRlc3QiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9USU1FT1VUX1NFQ09ORFMgPSAzMDsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUSU1FT1VUX01TID0gMTAgKiA2MCAqIDEwMDA7CisKKyAgICBAUnVsZQorICAgIHB1YmxpYyBmaW5hbCBPbkZhaWx1cmVSdWxlIG1EdW1wT25GYWlsdXJlUnVsZSA9IG5ldyBPbkZhaWx1cmVSdWxlKFRBRykgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25UZXN0RmFpbHVyZShTdGF0ZW1lbnQgYmFzZSwgRGVzY3JpcHRpb24gZGVzY3JpcHRpb24sIFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBydW5Db21tYW5kQW5kUHJpbnRPbkxvZ2NhdChUQUcsICJkdW1wc3lzIGNvbnRlbnQiKTsKKyAgICAgICAgICAgIHJ1bkNvbW1hbmRBbmRQcmludE9uTG9nY2F0KFRBRywgImR1bXBzeXMgam9ic2NoZWR1bGVyIik7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJvdGVjdGVkIGZpbmFsIEJyb2FkY2FzdFJwYyBtUnBjID0gbmV3IEJyb2FkY2FzdFJwYygpOworCisgICAgQ29udGV4dCBtQ29udGV4dDsKKyAgICBDb250ZW50UmVzb2x2ZXIgbUNvbnRlbnRSZXNvbHZlcjsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnROZXR3b3JrQ29ubmVjdGVkKEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKSk7CisKKyAgICAgICAgQmF0dGVyeVV0aWxzLnJ1bkR1bXBzeXNCYXR0ZXJ5VW5wbHVnKCk7CisKKyAgICAgICAgQW1VdGlscy5zZXRTdGFuZGJ5QnVja2V0KEFQUDFfUEFDS0FHRSwgVXNhZ2VTdGF0c01hbmFnZXIuU1RBTkRCWV9CVUNLRVRfQUNUSVZFKTsKKworICAgICAgICBtQ29udGV4dCA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKTsKKyAgICAgICAgbUNvbnRlbnRSZXNvbHZlciA9IG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOworCisgICAgICAgIENvbnRlbnRSZXNvbHZlci5zZXRNYXN0ZXJTeW5jQXV0b21hdGljYWxseSh0cnVlKTsKKworICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7IC8vIERvbid0IG1ha2UgdGhlIHN5c3RlbSB0b28gYnVzeS4uLgorICAgIH0KKworICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJlc2V0U3luY0NvbmZpZygpOworICAgICAgICBCYXR0ZXJ5VXRpbHMucnVuRHVtcHN5c0JhdHRlcnlSZXNldCgpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVzZXRTeW5jQ29uZmlnKCkgeworICAgICAgICBwdXRHbG9iYWxTZXR0aW5nKCJzeW5jX21hbmFnZXJfY29uc3RhbnRzIiwgIm51bGwiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlU3luY0NvbmZpZygKKyAgICAgICAgICAgIGludCBpbml0aWFsU3luY1JldHJ5VGltZUluU2Vjb25kcywKKyAgICAgICAgICAgIGZsb2F0IHJldHJ5VGltZUluY3JlYXNlRmFjdG9yLAorICAgICAgICAgICAgaW50IG1heFN5bmNSZXRyeVRpbWVJblNlY29uZHMsCisgICAgICAgICAgICBpbnQgbWF4UmV0cmllc1dpdGhBcHBTdGFuZGJ5RXhlbXB0aW9uKSB7CisgICAgICAgIHB1dEdsb2JhbFNldHRpbmcoInN5bmNfbWFuYWdlcl9jb25zdGFudHMiLAorICAgICAgICAgICAgICAgICJpbml0aWFsX3N5bmNfcmV0cnlfdGltZV9pbl9zZWNvbmRzPSIgKyBpbml0aWFsU3luY1JldHJ5VGltZUluU2Vjb25kcyArICIsIiArCisgICAgICAgICAgICAgICAgInJldHJ5X3RpbWVfaW5jcmVhc2VfZmFjdG9yPSIgKyByZXRyeVRpbWVJbmNyZWFzZUZhY3RvciArICIsIiArCisgICAgICAgICAgICAgICAgIm1heF9zeW5jX3JldHJ5X3RpbWVfaW5fc2Vjb25kcz0iICsgbWF4U3luY1JldHJ5VGltZUluU2Vjb25kcyArICIsIiArCisgICAgICAgICAgICAgICAgIm1heF9yZXRyaWVzX3dpdGhfYXBwX3N0YW5kYnlfZXhlbXB0aW9uPSIgKyBtYXhSZXRyaWVzV2l0aEFwcFN0YW5kYnlFeGVtcHRpb24pOworICAgIH0KKworICAgIC8qKiBSZXR1cm4gdGhlIHBhcnQgb2YgImR1bXBzeXMgY29udGVudCIgdGhhdCdzIHJlbGV2YW50IHRvIHRoZSBjdXJyZW50IHN5bmMgc3RhdHVzLiAqLworICAgIHByaXZhdGUgU3RyaW5nIGdldFN5bmNEdW1wc3lzKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgb3V0ID0gU3lzdGVtVXRpbC5ydW5Db21tYW5kQW5kRXh0cmFjdFNlY3Rpb24oImR1bXBzeXMgY29udGVudCIsCisgICAgICAgICAgICAgICAgIl5BY3RpdmUgU3luY3M6LioiLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAiXlN5bmMgU3RhdGlzdGljcyIsIGZhbHNlKTsKKyAgICAgICAgcmV0dXJuIG91dDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgd2FpdFVudGlsKFN0cmluZyBtZXNzYWdlLCBCb29sZWFuU3VwcGxpZXJXaXRoVGhyb3cgcHJlZGljYXRlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgVGVzdFV0aWxzLndhaXRVbnRpbChtZXNzYWdlLCBUSU1FT1VUX01TLCBwcmVkaWNhdGUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZW1vdmVBbGxBY2NvdW50cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtUnBjLmludm9rZShBUFAxX1BBQ0tBR0UsCisgICAgICAgICAgICAgICAgcmIgLT4gcmIuc2V0UmVtb3ZlQWxsQWNjb3VudHMoUmVtb3ZlQWxsQWNjb3VudHMubmV3QnVpbGRlcigpKSk7CisKKyAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOworCisgICAgICAgIEFtVXRpbHMud2FpdEZvckJyb2FkY2FzdElkbGUoKTsKKworICAgICAgICB3YWl0VW50aWwoIkR1bXBzeXMgc3RpbGwgbWVudGlvbnMgIiArIEFDQ09VTlRfMV9BLAorICAgICAgICAgICAgICAgICgpIC0+ICFnZXRTeW5jRHVtcHN5cygpLmNvbnRhaW5zKEFDQ09VTlRfMV9BLm5hbWUpKTsKKworICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNsZWFyU3luY0ludm9jYXRpb25zKFN0cmluZyBwYWNrYWdlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1ScGMuaW52b2tlKHBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgIHJiIC0+IHJiLnNldENsZWFyU3luY0ludm9jYXRpb25zKENsZWFyU3luY0ludm9jYXRpb25zLm5ld0J1aWxkZXIoKSkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhZGRBY2NvdW50QW5kTGV0SW5pdGlhbFN5bmNSdW4oQWNjb3VudCBhY2NvdW50LCBTdHJpbmcgYXV0aG9yaXR5KQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIEFkZCB0aGUgZmlyc3QgYWNjb3VudCwgd2hpY2ggd2lsbCB0cmlnZ2VyIGFuIGluaXRpYWwgc3luYy4KKyAgICAgICAgbVJwYy5pbnZva2UoQVBQMV9QQUNLQUdFLAorICAgICAgICAgICAgICAgIHJiIC0+IHJiLnNldEFkZEFjY291bnQoQWRkQWNjb3VudC5uZXdCdWlsZGVyKCkuc2V0TmFtZShhY2NvdW50Lm5hbWUpKSk7CisKKyAgICAgICAgd2FpdFVudGlsKCJTeW5jYWJsZSBpc24ndCBpbml0aWFsaXplZCIsCisgICAgICAgICAgICAgICAgKCkgLT4gQ29udGVudFJlc29sdmVyLmdldElzU3luY2FibGUoYWNjb3VudCwgYXV0aG9yaXR5KSA9PSAxKTsKKworICAgICAgICB3YWl0VW50aWwoIlBlcmlvZGljIHN5bmMgc2hvdWxkIHNldCB1cCIsCisgICAgICAgICAgICAgICAgKCkgLT4gQ29udGVudFJlc29sdmVyLmdldFBlcmlvZGljU3luY3MoYWNjb3VudCwgYXV0aG9yaXR5KS5zaXplKCkgPT0gMSk7CisgICAgICAgIGFzc2VydEVxdWFscygiUGVyaW9kaWMgc2hvdWxkIGJlIDI0aCIsCisgICAgICAgICAgICAgICAgMjQgKiA2MCAqIDYwLCBDb250ZW50UmVzb2x2ZXIuZ2V0UGVyaW9kaWNTeW5jcyhhY2NvdW50LCBhdXRob3JpdHkpLmdldCgwKS5wZXJpb2QpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEluaXRpYWxTeW5jKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJlbW92ZUFsbEFjY291bnRzKCk7CisKKyAgICAgICAgbVJwYy5pbnZva2UoQVBQMV9QQUNLQUdFLCByYiAtPiByYi5zZXRDbGVhclN5bmNJbnZvY2F0aW9ucygKKyAgICAgICAgICAgICAgICBDbGVhclN5bmNJbnZvY2F0aW9ucy5uZXdCdWlsZGVyKCkpKTsKKworICAgICAgICAvLyBBZGQgdGhlIGZpcnN0IGFjY291bnQsIHdoaWNoIHdpbGwgdHJpZ2dlciBhbiBpbml0aWFsIHN5bmMuCisgICAgICAgIGFkZEFjY291bnRBbmRMZXRJbml0aWFsU3luY1J1bihBQ0NPVU5UXzFfQSwgQVBQMV9BVVRIT1JJVFkpOworCisgICAgICAgIC8vIENoZWNrIHRoZSBzeW5jIHJlcXVlc3QgcGFyYW1ldGVycy4KKworICAgICAgICBSZXNwb25zZSByZXMgPSBtUnBjLmludm9rZShBUFAxX1BBQ0tBR0UsCisgICAgICAgICAgICAgICAgcmIgLT4gcmIuc2V0R2V0U3luY0ludm9jYXRpb25zKEdldFN5bmNJbnZvY2F0aW9ucy5uZXdCdWlsZGVyKCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlcy5nZXRTeW5jSW52b2NhdGlvbnMoKS5nZXRTeW5jSW52b2NhdGlvbnNDb3VudCgpKTsKKworICAgICAgICBTeW5jSW52b2NhdGlvbiBzaSA9IHJlcy5nZXRTeW5jSW52b2NhdGlvbnMoKS5nZXRTeW5jSW52b2NhdGlvbnMoMCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFDQ09VTlRfMV9BLm5hbWUsIHNpLmdldEFjY291bnROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoQUNDT1VOVF8xX0EudHlwZSwgc2kuZ2V0QWNjb3VudFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhBUFAxX0FVVEhPUklUWSwgc2kuZ2V0QXV0aG9yaXR5KCkpOworCisgICAgICAgIEJ1bmRsZSBleHRyYXMgPSBQYXJjZWxVdGlscy5mcm9tQnl0ZXMoc2kuZ2V0RXh0cmFzKCkudG9CeXRlQXJyYXkoKSk7CisgICAgICAgIGFzc2VydFRydWUoZXh0cmFzLmdldEJvb2xlYW4oQ29udGVudFJlc29sdmVyLlNZTkNfRVhUUkFTX0lOSVRJQUxJWkUpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTb2Z0RXJyb3JSZXRyaWVzQWN0aXZlQXBwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJlbW92ZUFsbEFjY291bnRzKCk7CisKKyAgICAgICAgLy8gTGV0IHRoZSBpbml0aWFsIHN5bmMgaGFwcGVuLgorICAgICAgICBhZGRBY2NvdW50QW5kTGV0SW5pdGlhbFN5bmNSdW4oQUNDT1VOVF8xX0EsIEFQUDFfQVVUSE9SSVRZKTsKKworICAgICAgICB3cml0ZVN5bmNDb25maWcoMiwgMSwgMiwgMyk7CisKKyAgICAgICAgY2xlYXJTeW5jSW52b2NhdGlvbnMoQVBQMV9QQUNLQUdFKTsKKworICAgICAgICBBbVV0aWxzLnNldFN0YW5kYnlCdWNrZXQoQVBQMV9QQUNLQUdFLCBVc2FnZVN0YXRzTWFuYWdlci5TVEFOREJZX0JVQ0tFVF9BQ1RJVkUpOworCisgICAgICAgIC8vIFNldCBzb2Z0IGVycm9yLgorICAgICAgICBtUnBjLmludm9rZShBUFAxX1BBQ0tBR0UsIHJiIC0+CisgICAgICAgICAgICAgICAgcmIuc2V0U2V0UmVzdWx0KFNldFJlc3VsdC5uZXdCdWlsZGVyKCkuc2V0UmVzdWx0KFJlc3VsdC5TT0ZUX0VSUk9SKSkpOworCisgICAgICAgIEJ1bmRsZSBiID0gbWFrZUJ1bmRsZSgKKyAgICAgICAgICAgICAgICAidGVzdFNvZnRFcnJvclJldHJpZXNBY3RpdmVBcHAiLCB0cnVlLAorICAgICAgICAgICAgICAgIENvbnRlbnRSZXNvbHZlci5TWU5DX0VYVFJBU19JR05PUkVfU0VUVElOR1MsIHRydWUpOworCisgICAgICAgIENvbnRlbnRSZXNvbHZlci5yZXF1ZXN0U3luYyhBQ0NPVU5UXzFfQSwgQVBQMV9BVVRIT1JJVFksIGIpOworCisgICAgICAgIC8vIEZpcnN0IHN5bmMgKyAzIHJldHJpZXMgPT0gNCwgc28gc2hvdWxkIGJlIGNhbGxlZCBtb3JlIHRoYW4gNCB0aW1lcy4KKyAgICAgICAgLy8gQnV0IGl0J3MgYWN0aXZlLCBzbyBpdCBzaG91bGQgcmV0cnkgbW9yZSB0aGFuIHRoYXQuCisgICAgICAgIHdhaXRVbnRpbCgiU2hvdWxkIHJldHJ5IG1vcmUgdGhhbiAzIHRpbWVzLiIsICgpIC0+IHsKKyAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlcyA9IG1ScGMuaW52b2tlKEFQUDFfUEFDS0FHRSwKKyAgICAgICAgICAgICAgICAgICAgcmIgLT4gcmIuc2V0R2V0U3luY0ludm9jYXRpb25zKEdldFN5bmNJbnZvY2F0aW9ucy5uZXdCdWlsZGVyKCkpKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBjYWxscyA9ICByZXMuZ2V0U3luY0ludm9jYXRpb25zKCkuZ2V0U3luY0ludm9jYXRpb25zQ291bnQoKTsKKyAgICAgICAgICAgIExvZy5pKFRBRywgIk51bVN5bmNJbnZvY2F0aW9ucz0iICsgY2FsbHMpOworICAgICAgICAgICAgcmV0dXJuIGNhbGxzID4gNDsgLy8gQXJiaXRyYXJpbHkgYmlnZ2VyIHRoYW4gNC4KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgLy8gV0lQIFRoaXMgdGVzdCBkb2Vzbid0IHdvcmsgeWV0LgorLy8gICAgQFRlc3QKKy8vICAgIHB1YmxpYyB2b2lkIHRlc3RTb2Z0RXJyb3JSZXRyaWVzRnJlcXVlbnRBcHAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKy8vICAgICAgICBydW5UZXN0KCgpIC0+IHsKKy8vICAgICAgICAgICAgcmVtb3ZlQWxsQWNjb3VudHMoKTsKKy8vCisvLyAgICAgICAgICAgIC8vIExldCB0aGUgaW5pdGlhbCBzeW5jIGhhcHBlbi4KKy8vICAgICAgICAgICAgYWRkQWNjb3VudEFuZExldEluaXRpYWxTeW5jUnVuKEFDQ09VTlRfMV9BLCBBUFAxX0FVVEhPUklUWSk7CisvLworLy8gICAgICAgICAgICB3cml0ZVN5bmNDb25maWcoMiwgMSwgMiwgMyk7CisvLworLy8gICAgICAgICAgICBjbGVhclN5bmNJbnZvY2F0aW9ucyhBUFAxX1BBQ0tBR0UpOworLy8KKy8vICAgICAgICAgICAgQW1VdGlscy5zZXRTdGFuZGJ5QnVja2V0KEFQUDFfUEFDS0FHRSwgVXNhZ2VTdGF0c01hbmFnZXIuU1RBTkRCWV9CVUNLRVRfRlJFUVVFTlQpOworLy8KKy8vICAgICAgICAgICAgLy8gU2V0IHNvZnQgZXJyb3IuCisvLyAgICAgICAgICAgIG1ScGMuaW52b2tlKEFQUDFfUEFDS0FHRSwgcmIgLT4KKy8vICAgICAgICAgICAgICAgICAgICByYi5zZXRTZXRSZXN1bHQoU2V0UmVzdWx0Lm5ld0J1aWxkZXIoKS5zZXRSZXN1bHQoUmVzdWx0LlNPRlRfRVJST1IpKSk7CisvLworLy8gICAgICAgICAgICBCdW5kbGUgYiA9IG1ha2VCdW5kbGUoCisvLyAgICAgICAgICAgICAgICAgICAgInRlc3RTb2Z0RXJyb3JSZXRyaWVzRnJlcXVlbnRBcHAiLCB0cnVlLAorLy8gICAgICAgICAgICAgICAgICAgIENvbnRlbnRSZXNvbHZlci5TWU5DX0VYVFJBU19JR05PUkVfU0VUVElOR1MsIHRydWUpOworLy8KKy8vICAgICAgICAgICAgQ29udGVudFJlc29sdmVyLnJlcXVlc3RTeW5jKEFDQ09VTlRfMV9BLCBBUFAxX0FVVEhPUklUWSwgYik7CisvLworLy8gICAgICAgICAgICB3YWl0VW50aWwoIlNob3VsZCByZXRyeSBtb3JlIHRoYW4gMyB0aW1lcy4iLCAoKSAtPiB7CisvLyAgICAgICAgICAgICAgICBmaW5hbCBSZXNwb25zZSByZXMgPSBtUnBjLmludm9rZShBUFAxX1BBQ0tBR0UsCisvLyAgICAgICAgICAgICAgICAgICAgICAgIHJiIC0+IHJiLnNldEdldFN5bmNJbnZvY2F0aW9ucyhHZXRTeW5jSW52b2NhdGlvbnMubmV3QnVpbGRlcigpKSk7CisvLyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY2FsbHMgPSAgcmVzLmdldFN5bmNJbnZvY2F0aW9ucygpLmdldFN5bmNJbnZvY2F0aW9uc0NvdW50KCk7CisvLyAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJOdW1TeW5jSW52b2NhdGlvbnM9IiArIGNhbGxzKTsKKy8vICAgICAgICAgICAgICAgIHJldHVybiBjYWxscyA+PSA0OyAvLyBGaXJzdCBzeW5jICsgMyByZXRyaWVzID09IDQsIHNvIGF0IGxlYXN0IDQgdGltZXMuCisvLyAgICAgICAgICAgIH0pOworLy8KKy8vICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwXzAwMCk7CisvLworLy8gICAgICAgICAgICAvLyBPbmUgbW9yZSByZXRyeSBpcyBva2F5IGJlY2F1c2Ugb2YgaG93IHRoZSBqb2Igc2NoZWR1bGVyIHRocm90dGxlIGpvYnMsIGJ1dCBubyBmdXJ0aGVyLgorLy8gICAgICAgICAgICBmaW5hbCBSZXNwb25zZSByZXMgPSBtUnBjLmludm9rZShBUFAxX1BBQ0tBR0UsCisvLyAgICAgICAgICAgICAgICAgICAgcmIgLT4gcmIuc2V0R2V0U3luY0ludm9jYXRpb25zKEdldFN5bmNJbnZvY2F0aW9ucy5uZXdCdWlsZGVyKCkpKTsKKy8vICAgICAgICAgICAgZmluYWwgaW50IGNhbGxzID0gIHJlcy5nZXRTeW5jSW52b2NhdGlvbnMoKS5nZXRTeW5jSW52b2NhdGlvbnNDb3VudCgpOworLy8gICAgICAgICAgICBhc3NlcnRUcnVlKCIjIG9mIHN5bmNzIG11c3QgYmUgZXF1YWwgb3IgbGVzcyB0aGFuIDUsIGJ1dCB3YXMgIiArIGNhbGxzLCBjYWxscyA8PSA1KTsKKy8vICAgICAgICB9KTsKKy8vICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3N5c3RlbWludGVudHMvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL3N5c3RlbWludGVudHMvQW5kcm9pZC5tawppbmRleCBiYTI4NGY1Li4xNmI4OTk4IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9zeXN0ZW1pbnRlbnRzL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvdGVzdHMvc3lzdGVtaW50ZW50cy9BbmRyb2lkLm1rCkBAIC0yNyw3ICsyNyw3IEBACiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNTeXN0ZW1JbnRlbnRUZXN0Q2FzZXMKIAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGN0c3Rlc3RydW5uZXIgbGVnYWN5LWFuZHJvaWQtdGVzdCBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY3RzdGVzdHJ1bm5lci1heHQgYW5kcm9pZHgudGVzdC5ydWxlcyBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dAogCiBMT0NBTF9TREtfVkVSU0lPTiA6PSB0ZXN0X2N1cnJlbnQKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc3lzdGVtaW50ZW50cy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdGVzdHMvc3lzdGVtaW50ZW50cy9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGRhMGNiYWMuLjE1ZDllZjYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3N5c3RlbWludGVudHMvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy9zeXN0ZW1pbnRlbnRzL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTIzLDcgKzIzLDcgQEAKICAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CiAgICAgPC9hcHBsaWNhdGlvbj4KIAotICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuc3lzdGVtaW50ZW50cy5jdHMiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJTeXN0ZW0gaW50ZW50IHRlc3RzIi8+CiA8L21hbmlmZXN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3N5c3RlbWludGVudHMvQW5kcm9pZFRlc3QueG1sIGIvdGVzdHMvdGVzdHMvc3lzdGVtaW50ZW50cy9BbmRyb2lkVGVzdC54bWwKaW5kZXggMzdmOTg5NS4uNGYwY2MzNiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvc3lzdGVtaW50ZW50cy9BbmRyb2lkVGVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvc3lzdGVtaW50ZW50cy9BbmRyb2lkVGVzdC54bWwKQEAgLTE1LDYgKzE1LDcgQEAKICAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQogICAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBzeXN0ZW0gaW50ZW50IHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJmcmFtZXdvcmsiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJub3Qtc2hhcmRhYmxlIiB2YWx1ZT0idHJ1ZSIgLz4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3N5c3RlbWludGVudHMvc3JjL2FuZHJvaWQvc3lzdGVtaW50ZW50cy9jdHMvVGVzdFN5c3RlbUludGVudHMuamF2YSBiL3Rlc3RzL3Rlc3RzL3N5c3RlbWludGVudHMvc3JjL2FuZHJvaWQvc3lzdGVtaW50ZW50cy9jdHMvVGVzdFN5c3RlbUludGVudHMuamF2YQppbmRleCAzZjQzYmRmLi45NDFmZWY3IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9zeXN0ZW1pbnRlbnRzL3NyYy9hbmRyb2lkL3N5c3RlbWludGVudHMvY3RzL1Rlc3RTeXN0ZW1JbnRlbnRzLmphdmEKKysrIGIvdGVzdHMvdGVzdHMvc3lzdGVtaW50ZW50cy9zcmMvYW5kcm9pZC9zeXN0ZW1pbnRlbnRzL2N0cy9UZXN0U3lzdGVtSW50ZW50cy5qYXZhCkBAIC0xNiwyMyArMTYsMjggQEAKIAogcGFja2FnZSBhbmRyb2lkLnN5c3RlbWludGVudHMuY3RzOwogCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5SZXNvbHZlSW5mbzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ2RkVGVzdDsKIAotaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIAogQE1lZGl1bVRlc3QKLXB1YmxpYyBjbGFzcyBUZXN0U3lzdGVtSW50ZW50cyBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CitAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIFRlc3RTeXN0ZW1JbnRlbnRzIHsKKwogICAgIC8qCiAgICAgICogTGlzdCBvZiBhY3Rpdml0eSBpbnRlbnRzIGRlZmluZWQgYnkgdGhlIHN5c3RlbS4gIEFjdGl2aXRpZXMgdG8gaGFuZGxlIGVhY2ggb2YgdGhlc2UKICAgICAgKiBpbnRlbnRzIG11c3QgYWxsIGV4aXN0LgpAQCAtNDcsNiArNTIsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFWENMVURFX1RWID0gMSA8PCAwOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFWENMVURFX1dBVENIID0gMSA8PCAxOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFWENMVURFX05PTl9URUxFUEhPTlkgPSAxIDw8IDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVYQ0xVREVfTk9OX0lOU1RBTExBQkxFX0lNRSA9IDEgPDwgMzsKIAogICAgIGNsYXNzIEludGVudEVudHJ5IHsKICAgICAgICAgcHVibGljIGludCBmbGFnczsKQEAgLTU4LDcgKzY0LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIEBSdWxlCiAgICAgcHJpdmF0ZSBmaW5hbCBJbnRlbnRFbnRyeVtdIG1UZXN0SW50ZW50cyA9IHsKICAgICAgICAgICAgIC8qIFNldHRpbmdzLW5hbWVzcGFjZSBpbnRlbnQgYWN0aW9ucyAqLwogICAgICAgICAgICAgbmV3IEludGVudEVudHJ5KDAsIG5ldyBJbnRlbnQoU2V0dGluZ3MuQUNUSU9OX1NFVFRJTkdTKSksCkBAIC03MywxMyArNzgsMTUgQEAKICAgICAgICAgICAgIG5ldyBJbnRlbnRFbnRyeShFWENMVURFX05PTl9URUxFUEhPTlksCiAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlbnQoU2V0dGluZ3MuQUNUSU9OX0FQTl9TRVRUSU5HUykpLAogICAgICAgICAgICAgbmV3IEludGVudEVudHJ5KEVYQ0xVREVfVFZ8RVhDTFVERV9XQVRDSCwKLSAgICAgICAgICAgICAgICAgICAgbmV3IEludGVudChTZXR0aW5ncy5BQ1RJT05fTk9USUZJQ0FUSU9OX1BPTElDWV9BQ0NFU1NfU0VUVElOR1MpKQorICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZW50KFNldHRpbmdzLkFDVElPTl9OT1RJRklDQVRJT05fUE9MSUNZX0FDQ0VTU19TRVRUSU5HUykpLAorICAgICAgICAgICAgbmV3IEludGVudEVudHJ5KEVYQ0xVREVfTk9OX0lOU1RBTExBQkxFX0lNRSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IEludGVudChTZXR0aW5ncy5BQ1RJT05fSU5QVVRfTUVUSE9EX1NFVFRJTkdTKSkKICAgICB9OwogCiAgICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjMuOC4zLjMvQy0xLTEsMy4yLjMuNS9DLTEtMSw3LjQuNy9DLTEtMixDLTItMyw2LjIvQy0wLTEiKQogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFN5c3RlbUludGVudHMoKSB7Ci0gICAgICAgIGZpbmFsIFBhY2thZ2VNYW5hZ2VyIHBtID0gZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgIGZpbmFsIFBhY2thZ2VNYW5hZ2VyIHBtID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VNYW5hZ2VyKCk7CiAgICAgICAgIGludCBwcm9kdWN0RmxhZ3MgPSAwOwogCiAgICAgICAgIGlmIChwbS5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfTEVBTkJBQ0spKSB7CkBAIC05MCw3ICs5NywxMSBAQAogICAgICAgICAgICAgcHJvZHVjdEZsYWdzIHw9IEVYQ0xVREVfTk9OX1RFTEVQSE9OWTsKICAgICAgICAgfQogCi0gICAgICAgIGZpbmFsIENvbmZpZ3VyYXRpb24gY29uZmlnID0gZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLmdldENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgaWYgKCFwbS5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfSU5QVVRfTUVUSE9EUykpIHsKKyAgICAgICAgICAgIHByb2R1Y3RGbGFncyB8PSBFWENMVURFX05PTl9JTlNUQUxMQUJMRV9JTUU7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBDb25maWd1cmF0aW9uIGNvbmZpZyA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKS5nZXRDb25maWd1cmF0aW9uKCk7CiAgICAgICAgIGlmICgoY29uZmlnLnVpTW9kZSAmIENvbmZpZ3VyYXRpb24uVUlfTU9ERV9UWVBFX1dBVENIKSAhPSAwKSB7CiAgICAgICAgICAgICBwcm9kdWN0RmxhZ3MgfD0gRVhDTFVERV9XQVRDSDsKICAgICAgICAgfQpAQCAtMTAyLDQgKzExMyw0IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvc3lzdGVtdWkvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL3N5c3RlbXVpL0FuZHJvaWQubWsKaW5kZXggYjA5NmNlZC4uNWI1MTliMiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvc3lzdGVtdWkvQW5kcm9pZC5taworKysgYi90ZXN0cy90ZXN0cy9zeXN0ZW11aS9BbmRyb2lkLm1rCkBAIC0yMiwxOSArMjIsMTggQEAKIExPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCiAKICMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cyBjdHNfaW5zdGFudAogCi1MT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzCiAKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCi0gICAgY3RzdGVzdHJ1bm5lciBcCi0gICAgYW5kcm9pZC1zdXBwb3J0LXRlc3QgXAotICAgIGxlZ2FjeS1hbmRyb2lkLXRlc3QgXAotICAgIHViLXVpYXV0b21hdG9yIFwKLSAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsCisgICAgY3RzdGVzdHJ1bm5lci1heHQgXAorICAgIGFuZHJvaWR4LnRlc3QucnVsZXMgXAorICAgIHViLXVpYXV0b21hdG9yCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIAogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c1N5c3RlbVVpVGVzdENhc2VzCitMT0NBTF9QUklWQVRFX1BMQVRGT1JNX0FQSVMgOj0gdHJ1ZQogCiBpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zeXN0ZW11aS9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdGVzdHMvc3lzdGVtdWkvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA4YjJjMDZmLi42NTcwNjYxIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9zeXN0ZW11aS9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL3N5c3RlbXVpL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTE2LDcgKzE2LDggQEAKICAgLS0+CiAKIDxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgcGFja2FnZT0iYW5kcm9pZC5zeXN0ZW11aS5jdHMiPgorICAgIHBhY2thZ2U9ImFuZHJvaWQuc3lzdGVtdWkuY3RzIgorICAgIGFuZHJvaWQ6dGFyZ2V0U2FuZGJveFZlcnNpb249IjIiPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uSU5KRUNUX0VWRU5UUyIgLz4KICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkRJU0FCTEVfS0VZR1VBUkQiIC8+CiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9FWFRFUk5BTF9TVE9SQUdFIiAvPgpAQCAtMzAsNyArMzEsNyBAQAogICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KICAgICA8L2FwcGxpY2F0aW9uPgogCi0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5zeXN0ZW11aS5jdHMiPgogICAgIDwvaW5zdHJ1bWVudGF0aW9uPgogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zeXN0ZW11aS9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy90ZXN0cy9zeXN0ZW11aS9BbmRyb2lkVGVzdC54bWwKaW5kZXggMjA4Zjg0NC4uZTc4NTJjNSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvc3lzdGVtdWkvQW5kcm9pZFRlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL3N5c3RlbXVpL0FuZHJvaWRUZXN0LnhtbApAQCAtMjUsNCArMjUsMTEgQEAKICAgICAgICAgPG9wdGlvbiBuYW1lPSJwYWNrYWdlIiB2YWx1ZT0iYW5kcm9pZC5zeXN0ZW11aS5jdHMiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icnVudGltZS1oaW50IiB2YWx1ZT0iMTBtMTlzIiAvPgogICAgIDwvdGVzdD4KKworICAgIDwhLS0gQ29sbGVjdCB0aGUgZmlsZXMgaW4gdGhlIGR1bXAgZGlyZWN0b3J5IGZvciBkZWJ1Z2dpbmcgLS0+CisgICAgPG1ldHJpY3NfY29sbGVjdG9yIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC5kZXZpY2UubWV0cmljLkZpbGVQdWxsZXJMb2dDb2xsZWN0b3IiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImRpcmVjdG9yeS1rZXlzIiB2YWx1ZT0iL3NkY2FyZC9MaWdodEJhclRlc3RCYXNlLyIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjb2xsZWN0LW9uLXJ1bi1lbmRlZC1vbmx5IiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8L21ldHJpY3NfY29sbGVjdG9yPgorCiA8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zeXN0ZW11aS9zcmMvYW5kcm9pZC9zeXN0ZW11aS9jdHMvTGlnaHRCYXJUZXN0QmFzZS5qYXZhIGIvdGVzdHMvdGVzdHMvc3lzdGVtdWkvc3JjL2FuZHJvaWQvc3lzdGVtdWkvY3RzL0xpZ2h0QmFyVGVzdEJhc2UuamF2YQppbmRleCBmMWQ1MmExLi41MmRhMmI1IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy9zeXN0ZW11aS9zcmMvYW5kcm9pZC9zeXN0ZW11aS9jdHMvTGlnaHRCYXJUZXN0QmFzZS5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3N5c3RlbXVpL3NyYy9hbmRyb2lkL3N5c3RlbXVpL2N0cy9MaWdodEJhclRlc3RCYXNlLmphdmEKQEAgLTE2LDcgKzE2LDggQEAKIAogcGFja2FnZSBhbmRyb2lkLnN5c3RlbXVpLmN0czsKIAotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb247CitpbXBvcnQgc3RhdGljIGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uOworCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc3VtZS5hc3N1bWVGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc3VtZS5hc3N1bWVUcnVlOwpAQCAtMjYsMjAgKzI3LDMzIEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LkRpc3BsYXlDdXRvdXQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd0luc2V0czsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlU3lzdGVtczsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogCiBwdWJsaWMgY2xhc3MgTGlnaHRCYXJUZXN0QmFzZSB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkxpZ2h0QmFyVGVzdEJhc2UiOwogCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFVNUF9QQVRIID0gIi9zZGNhcmQvbGlnaHRzdGF0dXN0ZXN0LnBuZyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXRoIERVTVBfUEFUSCA9IEZpbGVTeXN0ZW1zLmdldERlZmF1bHQoKQorICAgICAgICAgICAgLmdldFBhdGgoIi9zZGNhcmQvTGlnaHRCYXJUZXN0QmFzZS8iKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT0xPUl9ESUZGX1RIRVNIT0xEUyA9IDI7CisKKyAgICBwcml2YXRlIEFycmF5TGlzdDxSZWN0PiBtQ3V0b3V0czsKIAogICAgIHByb3RlY3RlZCBCaXRtYXAgdGFrZVN0YXR1c0JhclNjcmVlbnNob3QoTGlnaHRCYXJCYXNlQWN0aXZpdHkgYWN0aXZpdHkpIHsKICAgICAgICAgQml0bWFwIGZ1bGxCaXRtYXAgPSBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRVaUF1dG9tYXRpb24oKS50YWtlU2NyZWVuc2hvdCgpOwpAQCAtNTIsMTEgKzY2LDE3IEBACiAgICAgICAgICAgICAgICAgZnVsbEJpdG1hcC5nZXRIZWlnaHQoKSAtIGFjdGl2aXR5LmdldEJvdHRvbSgpKTsKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgdm9pZCBkdW1wQml0bWFwKEJpdG1hcCBiaXRtYXApIHsKLSAgICAgICAgTG9nLmUoVEFHLCAiRHVtcGluZyBmYWlsZWQgYml0bWFwIHRvICIgKyBEVU1QX1BBVEgpOworICAgIHByb3RlY3RlZCB2b2lkIGR1bXBCaXRtYXAoQml0bWFwIGJpdG1hcCwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgRmlsZSBkdW1wRGlyID0gRFVNUF9QQVRILnRvRmlsZSgpOworICAgICAgICBpZiAoIWR1bXBEaXIuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIGR1bXBEaXIubWtkaXJzKCk7CisgICAgICAgIH0KKworICAgICAgICBQYXRoIGZpbGVQYXRoID0gRFVNUF9QQVRILnJlc29sdmUobmFtZSArICIucG5nIik7CisgICAgICAgIExvZy5lKFRBRywgIkR1bXBpbmcgZmFpbGVkIGJpdG1hcCB0byAiICsgZmlsZVBhdGgpOwogICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZpbGVTdHJlYW0gPSBudWxsOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgZmlsZVN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKERVTVBfUEFUSCk7CisgICAgICAgICAgICBmaWxlU3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZVBhdGgudG9GaWxlKCkpOwogICAgICAgICAgICAgYml0bWFwLmNvbXByZXNzKEJpdG1hcC5Db21wcmVzc0Zvcm1hdC5QTkcsIDg1LCBmaWxlU3RyZWFtKTsKICAgICAgICAgICAgIGZpbGVTdHJlYW0uZmx1c2goKTsKICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKQEAgLTExMiw2ICsxMzIsNyBAQAogICAgICAgICAvLyBObyBzdGF0dXMgYmFyIHdoZW4gcnVubmluZyBpbiBWcgogICAgICAgICBhc3N1bWVGYWxzZShpc1J1bm5pbmdJblZyKCkpOwogCisgICAgICAgIC8vIFN0YXR1cyBiYXIgZXhpc3RzIG9ubHkgd2hlbiB0b3Agc3RhYmxlIGluc2V0IGlzIHBvc2l0aXZlCiAgICAgICAgIGZpbmFsIFdpbmRvd0luc2V0c1tdIGluc2V0ID0gbmV3IFdpbmRvd0luc2V0c1sxXTsKICAgICAgICAgcnVsZS5ydW5PblVpVGhyZWFkKCgpLT4gewogICAgICAgICAgICAgaW5zZXRbMF0gPSBydWxlLmdldEFjdGl2aXR5KCkuZ2V0Um9vdFdpbmRvd0luc2V0cygpOwpAQCAtMTE5LDcgKzE0MCw3IEBACiAgICAgICAgIGFzc3VtZVRydWUoIlRvcCBzdGFibGUgaW5zZXQgaXMgbm9uLXBvc2l0aXZlLiIsIGluc2V0WzBdLmdldFN0YWJsZUluc2V0VG9wKCkgPiAwKTsKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3N1bWVIYXNDb2xvck5hdmlnYXRpb25CYXIgKAorICAgIHByb3RlY3RlZCB2b2lkIGFzc3VtZUhhc0NvbG9yZWROYXZpZ2F0aW9uQmFyKAogICAgICAgICAgICAgQWN0aXZpdHlUZXN0UnVsZTw/IGV4dGVuZHMgTGlnaHRCYXJCYXNlQWN0aXZpdHk+IHJ1bGUpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBhc3N1bWVCYXNpY3MoKTsKIApAQCAtMTI3LDE1ICsxNDgsOTYgQEAKICAgICAgICAgYXNzdW1lVHJ1ZShoYXNWaXJ0dWFsTmF2aWdhdGlvbkJhcihydWxlKSk7CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tOYXZpZ2F0aW9uQmFyRGl2aWRlcihMaWdodEJhckJhc2VBY3Rpdml0eSBhY3Rpdml0eSwgaW50IGRpdmlkZXJDb2xvcikgeworICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrTmF2aWdhdGlvbkJhckRpdmlkZXIoTGlnaHRCYXJCYXNlQWN0aXZpdHkgYWN0aXZpdHksIGludCBkaXZpZGVyQ29sb3IsCisgICAgICAgICAgICBpbnQgYmFja2dyb3VuZENvbG9yLCBTdHJpbmcgbWV0aG9kTmFtZSkgewogICAgICAgICBmaW5hbCBCaXRtYXAgYml0bWFwID0gdGFrZU5hdmlnYXRpb25CYXJTY3JlZW5zaG90KGFjdGl2aXR5KTsKICAgICAgICAgaW50W10gcGl4ZWxzID0gbmV3IGludFtiaXRtYXAuZ2V0SGVpZ2h0KCkgKiBiaXRtYXAuZ2V0V2lkdGgoKV07CiAgICAgICAgIGJpdG1hcC5nZXRQaXhlbHMocGl4ZWxzLCAwLCBiaXRtYXAuZ2V0V2lkdGgoKSwgMCwgMCwgYml0bWFwLmdldFdpZHRoKCksIGJpdG1hcC5nZXRIZWlnaHQoKSk7Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IGJpdG1hcC5nZXRXaWR0aCgpOyBjb2wrKykgewotICAgICAgICAgICAgaWYgKGRpdmlkZXJDb2xvciAhPSBwaXhlbHNbY29sXSkgewotICAgICAgICAgICAgICAgIGR1bXBCaXRtYXAoYml0bWFwKTsKLSAgICAgICAgICAgICAgICBmYWlsKCJJbnZhbGlkIGNvbG9yIGV4cHRlY3RlZD0iICsgZGl2aWRlckNvbG9yICsgIiBhY3R1YWw9IiArIHBpeGVsc1tjb2xdKTsKKworICAgICAgICBsb2FkQ3V0b3V0KGFjdGl2aXR5KTsKKyAgICAgICAgaW50IGJhY2tncm91bmRDb2xvclBpeGVsQ291bnQgPSAwOworICAgICAgICBpbnQgc2hpZnRZID0gYWN0aXZpdHkuZ2V0Qm90dG9tKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpbnQgeCA9IGkgJSBiaXRtYXAuZ2V0V2lkdGgoKTsKKyAgICAgICAgICAgIGludCB5ID0gaSAvIGJpdG1hcC5nZXRXaWR0aCgpOworCisgICAgICAgICAgICBpZiAocGl4ZWxzW2ldID09IGJhY2tncm91bmRDb2xvcgorICAgICAgICAgICAgICAgICAgICB8fCBpc0luc2lkZUN1dG91dCh4LCBzaGlmdFkgKyB5KSkgeworICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvclBpeGVsQ291bnQrKzsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICBhc3N1bWVOYXZpZ2F0aW9uQmFyQ2hhbmdlc0NvbG9yKGJhY2tncm91bmRDb2xvclBpeGVsQ291bnQsIHBpeGVscy5sZW5ndGgpOworCisgICAgICAgIGludCBkaWZmQ291bnQgPSAwOworICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBiaXRtYXAuZ2V0V2lkdGgoKTsgY29sKyspIHsKKyAgICAgICAgICAgIGlmIChpc0luc2lkZUN1dG91dChjb2wsIHNoaWZ0WSkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFpc0NvbG9yU2FtZShkaXZpZGVyQ29sb3IsIHBpeGVsc1tjb2xdKSkgeworICAgICAgICAgICAgICAgIGRpZmZDb3VudCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRMZXNzVGhhbihTdHJpbmcuZm9ybWF0KExvY2FsZS5FTkdMSVNILAorICAgICAgICAgICAgICAgICAgICAiVGhlcmUgYXJlIGludmFsaWQgY29sb3IgcGl4ZWxzLiBleHBlY3RlZD0gMHglMDh4IiwgZGl2aWRlckNvbG9yKSwKKyAgICAgICAgICAgICAgICAgICAgMC4zZiwgKGZsb2F0KSBkaWZmQ291bnQgLyAoZmxvYXQpYml0bWFwLmdldFdpZHRoKCksCisgICAgICAgICAgICAgICAgICAgICJJcyB0aGUgZGl2aWRlciBjb2xvcmVkIGFjY29yZGluZyB0byBhbmRyb2lkOm5hdmlnYXRpb25CYXJEaXZpZGVyQ29sb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpbiB0aGUgdGhlbWU/Iik7CisgICAgICAgICAgICBzdWNjZXNzID0gdHJ1ZTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmICghc3VjY2VzcykgeworICAgICAgICAgICAgICAgIGR1bXBCaXRtYXAoYml0bWFwLCBtZXRob2ROYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDb2xvclNhbWUoaW50IGMxLCBpbnQgYzIpIHsKKyAgICAgICAgcmV0dXJuIE1hdGguYWJzKENvbG9yLmFscGhhKGMxKSAtIENvbG9yLmFscGhhKGMyKSkgPCBDT0xPUl9ESUZGX1RIRVNIT0xEUworICAgICAgICAgICAgICAgICYmIE1hdGguYWJzKENvbG9yLnJlZChjMSkgLSBDb2xvci5yZWQoYzIpKSA8IENPTE9SX0RJRkZfVEhFU0hPTERTCisgICAgICAgICAgICAgICAgJiYgTWF0aC5hYnMoQ29sb3IuZ3JlZW4oYzEpIC0gQ29sb3IuZ3JlZW4oYzIpKSA8IENPTE9SX0RJRkZfVEhFU0hPTERTCisgICAgICAgICAgICAgICAgJiYgTWF0aC5hYnMoQ29sb3IuYmx1ZShjMSkgLSBDb2xvci5ibHVlKGMyKSkgPCBDT0xPUl9ESUZGX1RIRVNIT0xEUzsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhc3N1bWVOYXZpZ2F0aW9uQmFyQ2hhbmdlc0NvbG9yKGludCBiYWNrZ3JvdW5kQ29sb3JQaXhlbENvdW50LCBpbnQgdG90YWxQaXhlbCkgeworICAgICAgICBhc3N1bWVUcnVlKCJOb3QgZW5vdWdoIGJhY2tncm91bmQgcGl4ZWxzLiBUaGUgbmF2aWdhdGlvbiBiYXIgbWF5IG5vdCBiZSBhYmxlIHRvIGNoYW5nZSAiCisgICAgICAgICAgICAgICAgKyAiY29sb3IuIiwgYmFja2dyb3VuZENvbG9yUGl4ZWxDb3VudCA+IDAuM2YgKiB0b3RhbFBpeGVsKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQXJyYXlMaXN0IGxvYWRDdXRvdXQoTGlnaHRCYXJCYXNlQWN0aXZpdHkgYWN0aXZpdHkpIHsKKyAgICAgICAgbUN1dG91dHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkucnVuT25NYWluU3luYygoKS0+IHsKKyAgICAgICAgICAgIFdpbmRvd0luc2V0cyB3aW5kb3dJbnNldHMgPSBhY3Rpdml0eS5nZXRSb290V2luZG93SW5zZXRzKCk7CisgICAgICAgICAgICBEaXNwbGF5Q3V0b3V0IGRpc3BsYXlDdXRvdXQgPSB3aW5kb3dJbnNldHMuZ2V0RGlzcGxheUN1dG91dCgpOworICAgICAgICAgICAgaWYgKGRpc3BsYXlDdXRvdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1DdXRvdXRzLmFkZEFsbChkaXNwbGF5Q3V0b3V0LmdldEJvdW5kaW5nUmVjdHMoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICByZXR1cm4gbUN1dG91dHM7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNJbnNpZGVDdXRvdXQoaW50IHgsIGludCB5KSB7CisgICAgICAgIGZvciAoUmVjdCBjdXRvdXQgOiBtQ3V0b3V0cykgeworICAgICAgICAgICAgaWYgKGN1dG91dC5jb250YWlucyh4LCB5KSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRNb3JlVGhhbihTdHJpbmcgd2hhdCwgZmxvYXQgZXhwZWN0ZWQsIGZsb2F0IGFjdHVhbCwgU3RyaW5nIGhpbnQpIHsKKyAgICAgICAgaWYgKCEoYWN0dWFsID4gZXhwZWN0ZWQpKSB7CisgICAgICAgICAgICBmYWlsKHdoYXQgKyAiOiBleHBlY3RlZCBtb3JlIHRoYW4gIiArIGV4cGVjdGVkICogMTAwICsgIiUsIGJ1dCBvbmx5IGdvdCAiICsgYWN0dWFsICogMTAwCisgICAgICAgICAgICAgICAgICAgICsgIiU7ICIgKyBoaW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydExlc3NUaGFuKFN0cmluZyB3aGF0LCBmbG9hdCBleHBlY3RlZCwgZmxvYXQgYWN0dWFsLCBTdHJpbmcgaGludCkgeworICAgICAgICBpZiAoIShhY3R1YWwgPCBleHBlY3RlZCkpIHsKKyAgICAgICAgICAgIGZhaWwod2hhdCArICI6IGV4cGVjdGVkIGxlc3MgdGhhbiAiICsgZXhwZWN0ZWQgKiAxMDAgKyAiJSwgYnV0IGdvdCAiICsgYWN0dWFsICogMTAwCisgICAgICAgICAgICAgICAgICAgICsgIiU7ICIgKyBoaW50KTsKKyAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3N5c3RlbXVpL3NyYy9hbmRyb2lkL3N5c3RlbXVpL2N0cy9MaWdodEJhclRlc3RzLmphdmEgYi90ZXN0cy90ZXN0cy9zeXN0ZW11aS9zcmMvYW5kcm9pZC9zeXN0ZW11aS9jdHMvTGlnaHRCYXJUZXN0cy5qYXZhCmluZGV4IDRjYTA4NzMuLjgzMWM0ZGUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3N5c3RlbXVpL3NyYy9hbmRyb2lkL3N5c3RlbXVpL2N0cy9MaWdodEJhclRlc3RzLmphdmEKKysrIGIvdGVzdHMvdGVzdHMvc3lzdGVtdWkvc3JjL2FuZHJvaWQvc3lzdGVtdWkvY3RzL0xpZ2h0QmFyVGVzdHMuamF2YQpAQCAtMTYsMzEgKzE2LDMwIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5zeXN0ZW11aS5jdHM7CiAKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb247CiAKLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXI7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKwogaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb25DaGFubmVsOwogaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbk1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5hcHAuVWlBdXRvbWF0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5BcHBNb2RlRnVsbDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuSW5wdXREZXZpY2U7CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5UZXN0TmFtZTsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNkZFRlc3Q7Ci0KIC8qKgogICogVGVzdCBmb3IgbGlnaHQgc3RhdHVzIGJhci4KICAqCkBAIC01OCw2ICs1Nyw3IEBACiAgICAgICogbWFyZ2luIHRvIGFjY29tbW9kYXRlIGZvciB0aGF0IHdoZW4gY29tcGFyaW5nIGNvbG9ycy4KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1JfQ09NUE9ORU5UX0VSUk9SX01BUkdJTiA9IDIwOworCiAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgTk9USUZJQ0FUSU9OX1RBRyA9ICJURVNUX1RBRyI7CiAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgTk9USUZJQ0FUSU9OX0NIQU5ORUxfSUQgPSAidGVzdF9jaGFubmVsIjsKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBOT1RJRklDQVRJT05fR1JPVVBfS0VZID0gInRlc3RfZ3JvdXAiOwpAQCAtNjYsOSArNjYsMTEgQEAKICAgICBAUnVsZQogICAgIHB1YmxpYyBBY3Rpdml0eVRlc3RSdWxlPExpZ2h0QmFyQWN0aXZpdHk+IG1BY3Rpdml0eVJ1bGUgPSBuZXcgQWN0aXZpdHlUZXN0UnVsZTw+KAogICAgICAgICAgICAgTGlnaHRCYXJBY3Rpdml0eS5jbGFzcyk7CisgICAgQFJ1bGUKKyAgICBwdWJsaWMgVGVzdE5hbWUgbVRlc3ROYW1lID0gbmV3IFRlc3ROYW1lKCk7CiAKLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iMy44LjYvQy0yLTIiKQogICAgIEBUZXN0CisgICAgQEFwcE1vZGVGdWxsIC8vIEluc3RhbnQgYXBwcyBjYW5ub3QgY3JlYXRlIG5vdGlmaWNhdGlvbnMKICAgICBwdWJsaWMgdm9pZCB0ZXN0TGlnaHRTdGF0dXNCYXJJY29ucygpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBhc3N1bWVIYXNDb2xvcmVkU3RhdHVzQmFyKG1BY3Rpdml0eVJ1bGUpOwogCkBAIC04OCw2MCArOTAsMjEgQEAKICAgICAgICAgICAgICAgICAgICAgLnNldEdyb3VwKE5PVElGSUNBVElPTl9HUk9VUF9LRVkpOwogICAgICAgICAgICAgbU5tLm5vdGlmeShOT1RJRklDQVRJT05fVEFHLCBpLCBub3RpMS5idWlsZCgpKTsKICAgICAgICAgfQotICAgICAgICBUaHJlYWQuc2xlZXAoV0FJVF9USU1FKTsKLSAgICAgICAgQml0bWFwIGJlZm9yZUJpdG1hcCA9IHRha2VTdGF0dXNCYXJTY3JlZW5zaG90KG1BY3Rpdml0eVJ1bGUuZ2V0QWN0aXZpdHkoKSk7CiAKICAgICAgICAgcmVxdWVzdExpZ2h0QmFycyhDb2xvci5SRUQgLyogYmFja2dyb3VuZCAqLyk7CiAgICAgICAgIFRocmVhZC5zbGVlcChXQUlUX1RJTUUpOwogCiAgICAgICAgIEJpdG1hcCBiaXRtYXAgPSB0YWtlU3RhdHVzQmFyU2NyZWVuc2hvdChtQWN0aXZpdHlSdWxlLmdldEFjdGl2aXR5KCkpOwotICAgICAgICBCaXRtYXAgcmVzdWx0ID0gdHJlYXRDdXRvdXRBc0JhY2tncm91bmQoYmVmb3JlQml0bWFwLCBiaXRtYXApOwotICAgICAgICBpZiAoYmVmb3JlQml0bWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgIGJlZm9yZUJpdG1hcC5yZWN5Y2xlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJpdG1hcCAhPSBudWxsICYmIGJpdG1hcCAhPSByZXN1bHQpIHsKLSAgICAgICAgICAgIGJpdG1hcC5yZWN5Y2xlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdGF0cyBzID0gZXZhbHVhdGVMaWdodEJhckJpdG1hcChyZXN1bHQsIENvbG9yLlJFRCAvKiBiYWNrZ3JvdW5kICovKTsKLSAgICAgICAgYXNzZXJ0TGlnaHRTdGF0cyhyZXN1bHQsIHMpOworICAgICAgICBTdGF0cyBzID0gZXZhbHVhdGVMaWdodEJhckJpdG1hcChiaXRtYXAsIENvbG9yLlJFRCAvKiBiYWNrZ3JvdW5kICovLCAwKTsKKyAgICAgICAgYXNzZXJ0TGlnaHRTdGF0cyhiaXRtYXAsIHMpOwogCiAgICAgICAgIG1ObS5jYW5jZWxBbGwoKTsKICAgICAgICAgbU5tLmRlbGV0ZU5vdGlmaWNhdGlvbkNoYW5uZWwoTk9USUZJQ0FUSU9OX0NIQU5ORUxfSUQpOwogICAgIH0KIAotICAgIHByaXZhdGUgQml0bWFwIHRyZWF0Q3V0b3V0QXNCYWNrZ3JvdW5kKEJpdG1hcCBiZWZvcmUsIEJpdG1hcCBhZnRlcikgewotICAgICAgICBpZiAoYmVmb3JlID09IG51bGwgfHwgYWZ0ZXIgPT0gbnVsbCB8fCBiZWZvcmUuZ2V0V2lkdGgoKSAhPSBhZnRlci5nZXRXaWR0aCgpCi0gICAgICAgICAgICAgICAgfHwgYmVmb3JlLmdldEhlaWdodCgpICE9IGFmdGVyLmdldEhlaWdodCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gYWZ0ZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBCaXRtYXAgcmVzdWx0ID0gYWZ0ZXIuY29weShCaXRtYXAuQ29uZmlnLkFSR0JfODg4OCwgdHJ1ZSk7Ci0KLSAgICAgICAgZmluYWwgaW50IHdpZHRoID0gYmVmb3JlLmdldFdpZHRoKCk7Ci0gICAgICAgIGZpbmFsIGludCBoZWlnaHQgPSBhZnRlci5nZXRIZWlnaHQoKTsKLSAgICAgICAgaW50W10gYmVmb3JlUGl4ZWxzID0gbmV3IGludFtoZWlnaHQgKiB3aWR0aF07Ci0gICAgICAgIGJlZm9yZS5nZXRQaXhlbHMoYmVmb3JlUGl4ZWxzLCAwLCB3aWR0aCwgMCwgMCwgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgIGludFtdIGFmdGVyUGl4ZWxzID0gbmV3IGludFtoZWlnaHQgKiB3aWR0aF07Ci0gICAgICAgIGFmdGVyLmdldFBpeGVscyhhZnRlclBpeGVscywgMCwgd2lkdGgsIDAsIDAsIHdpZHRoLCBoZWlnaHQpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgd2lkdGg7IGorKykgewotICAgICAgICAgICAgICAgIGludCBjQmVmb3JlID0gYmVmb3JlUGl4ZWxzW2kgKiB3aWR0aCArIGpdOwotICAgICAgICAgICAgICAgIGludCBjQWZ0ZXIgPSBhZnRlclBpeGVsc1tpICogd2lkdGggKyBqXTsKLQotICAgICAgICAgICAgICAgIGlmIChjQmVmb3JlID09IGNBZnRlciAmJiBDb2xvci5sdW1pbmFuY2UoY0FmdGVyKSA8IDAuMDFmKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zZXRQaXhlbChqLCBpLCBDb2xvci5SRUQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0TGlnaHROYXZpZ2F0aW9uQmFyKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIGFzc3VtZUhhc0NvbG9yTmF2aWdhdGlvbkJhcihtQWN0aXZpdHlSdWxlKTsKKyAgICAgICAgYXNzdW1lSGFzQ29sb3JlZE5hdmlnYXRpb25CYXIobUFjdGl2aXR5UnVsZSk7CiAKICAgICAgICAgcmVxdWVzdExpZ2h0QmFycyhDb2xvci5SRUQgLyogYmFja2dyb3VuZCAqLyk7CiAgICAgICAgIFRocmVhZC5zbGVlcChXQUlUX1RJTUUpOwpAQCAtMTUyLDExICsxMTUsMjYgQEAKICAgICAgICAgaW5qZWN0Q2FuY2VsZWRUYXAoeCwgeSk7CiAgICAgICAgIFRocmVhZC5zbGVlcChXQUlUX1RJTUUpOwogCi0gICAgICAgIEJpdG1hcCBiaXRtYXAgPSB0YWtlTmF2aWdhdGlvbkJhclNjcmVlbnNob3QobUFjdGl2aXR5UnVsZS5nZXRBY3Rpdml0eSgpKTsKLSAgICAgICAgU3RhdHMgcyA9IGV2YWx1YXRlTGlnaHRCYXJCaXRtYXAoYml0bWFwLCBDb2xvci5SRUQgLyogYmFja2dyb3VuZCAqLyk7CisgICAgICAgIExpZ2h0QmFyQWN0aXZpdHkgYWN0aXZpdHkgPSBtQWN0aXZpdHlSdWxlLmdldEFjdGl2aXR5KCk7CisgICAgICAgIEJpdG1hcCBiaXRtYXAgPSB0YWtlTmF2aWdhdGlvbkJhclNjcmVlbnNob3QoYWN0aXZpdHkpOworICAgICAgICBTdGF0cyBzID0gZXZhbHVhdGVMaWdodEJhckJpdG1hcChiaXRtYXAsIENvbG9yLlJFRCAvKiBiYWNrZ3JvdW5kICovLCBhY3Rpdml0eS5nZXRCb3R0b20oKSk7CiAgICAgICAgIGFzc2VydExpZ2h0U3RhdHMoYml0bWFwLCBzKTsKICAgICB9CiAKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROYXZpZ2F0aW9uQmFyRGl2aWRlcigpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBhc3N1bWVIYXNDb2xvcmVkTmF2aWdhdGlvbkJhcihtQWN0aXZpdHlSdWxlKTsKKworICAgICAgICBtQWN0aXZpdHlSdWxlLnJ1bk9uVWlUaHJlYWQoKCkgLT4geworICAgICAgICAgICAgbUFjdGl2aXR5UnVsZS5nZXRBY3Rpdml0eSgpLmdldFdpbmRvdygpLnNldE5hdmlnYXRpb25CYXJDb2xvcihDb2xvci5SRUQpOworICAgICAgICAgICAgbUFjdGl2aXR5UnVsZS5nZXRBY3Rpdml0eSgpLmdldFdpbmRvdygpLnNldE5hdmlnYXRpb25CYXJEaXZpZGVyQ29sb3IoQ29sb3IuV0hJVEUpOworICAgICAgICB9KTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKFdBSVRfVElNRSk7CisKKyAgICAgICAgY2hlY2tOYXZpZ2F0aW9uQmFyRGl2aWRlcihtQWN0aXZpdHlSdWxlLmdldEFjdGl2aXR5KCksIENvbG9yLldISVRFLCBDb2xvci5SRUQsCisgICAgICAgICAgICAgICAgbVRlc3ROYW1lLmdldE1ldGhvZE5hbWUoKSk7CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIGluamVjdENhbmNlbGVkVGFwKGludCB4LCBpbnQgeSkgewogICAgICAgICBsb25nIGRvd25UaW1lID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CiAgICAgICAgIGluamVjdEV2ZW50KE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOLCB4LCB5LCBkb3duVGltZSk7CkBAIC0xNzUsNDUgKzE1MywyOSBAQAogICAgIHByaXZhdGUgdm9pZCBhc3NlcnRMaWdodFN0YXRzKEJpdG1hcCBiaXRtYXAsIFN0YXRzIHMpIHsKICAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnRNb3JlVGhhbigiTm90IGVub3VnaCBiYWNrZ3JvdW5kIHBpeGVscyIsIDAuM2YsCi0gICAgICAgICAgICAgICAgICAgIChmbG9hdCkgcy5iYWNrZ3JvdW5kUGl4ZWxzIC8gcy50b3RhbFBpeGVscygpLAotICAgICAgICAgICAgICAgICAgICAiSXMgdGhlIGJhciBiYWNrZ3JvdW5kIHNob3dpbmcgY29ycmVjdGx5IChzb2xpZCByZWQpPyIpOworICAgICAgICAgICAgYXNzdW1lTmF2aWdhdGlvbkJhckNoYW5nZXNDb2xvcihzLmJhY2tncm91bmRQaXhlbHMsIHMudG90YWxQaXhlbHMoKSk7CiAKICAgICAgICAgICAgIGFzc2VydE1vcmVUaGFuKCJOb3QgZW5vdWdoIHBpeGVscyBjb2xvcmVkIGFzIGluIHRoZSBzcGVjIiwgMC4zZiwKLSAgICAgICAgICAgICAgICAgICAgKGZsb2F0KSBzLmljb25QaXhlbHMgLyBzLmZvcmVncm91bmRQaXhlbHMoKSwKKyAgICAgICAgICAgICAgICAgICAgKGZsb2F0KSBzLmljb25QaXhlbHMgLyAoZmxvYXQpIHMuZm9yZWdyb3VuZFBpeGVscygpLAogICAgICAgICAgICAgICAgICAgICAiQXJlIHRoZSBiYXIgaWNvbnMgY29sb3JlZCBhY2NvcmRpbmcgdG8gdGhlIHNwZWMgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIig2MCUgYmxhY2sgYW5kIDI0JSBibGFjayk/Iik7CiAKICAgICAgICAgICAgIGFzc2VydExlc3NUaGFuKCJUb28gbWFueSBsaWdodGVyIHBpeGVscyBsaWdodGVyIHRoYW4gdGhlIGJhY2tncm91bmQiLCAwLjA1ZiwKLSAgICAgICAgICAgICAgICAgICAgKGZsb2F0KSBzLnNhbWVIdWVMaWdodFBpeGVscyAvIHMuZm9yZWdyb3VuZFBpeGVscygpLAorICAgICAgICAgICAgICAgICAgICAoZmxvYXQpIHMuc2FtZUh1ZUxpZ2h0UGl4ZWxzIC8gKGZsb2F0KSBzLmZvcmVncm91bmRQaXhlbHMoKSwKICAgICAgICAgICAgICAgICAgICAgIkFyZSB0aGUgYmFyIGljb25zIGRhcms/Iik7CiAKICAgICAgICAgICAgIGFzc2VydExlc3NUaGFuKCJUb28gbWFueSBwaXhlbHMgd2l0aCBhIGNoYW5nZWQgaHVlIiwgMC4wNWYsCi0gICAgICAgICAgICAgICAgICAgIChmbG9hdCkgcy51bmV4cGVjdGVkSHVlUGl4ZWxzIC8gcy5mb3JlZ3JvdW5kUGl4ZWxzKCksCisgICAgICAgICAgICAgICAgICAgIChmbG9hdCkgcy51bmV4cGVjdGVkSHVlUGl4ZWxzIC8gKGZsb2F0KSBzLmZvcmVncm91bmRQaXhlbHMoKSwKICAgICAgICAgICAgICAgICAgICAgIkFyZSB0aGUgYmFyIGljb25zIGNvbG9yLWZyZWU/Iik7CiAKICAgICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOwogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgaWYgKCFzdWNjZXNzKSB7Ci0gICAgICAgICAgICAgICAgZHVtcEJpdG1hcChiaXRtYXApOworICAgICAgICAgICAgICAgIGR1bXBCaXRtYXAoYml0bWFwLCBtVGVzdE5hbWUuZ2V0TWV0aG9kTmFtZSgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRNb3JlVGhhbihTdHJpbmcgd2hhdCwgZmxvYXQgZXhwZWN0ZWQsIGZsb2F0IGFjdHVhbCwgU3RyaW5nIGhpbnQpIHsKLSAgICAgICAgaWYgKCEoYWN0dWFsID4gZXhwZWN0ZWQpKSB7Ci0gICAgICAgICAgICBmYWlsKHdoYXQgKyAiOiBleHBlY3RlZCBtb3JlIHRoYW4gIiArIGV4cGVjdGVkICogMTAwICsgIiUsIGJ1dCBvbmx5IGdvdCAiICsgYWN0dWFsICogMTAwCi0gICAgICAgICAgICAgICAgICAgICsgIiU7ICIgKyBoaW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRMZXNzVGhhbihTdHJpbmcgd2hhdCwgZmxvYXQgZXhwZWN0ZWQsIGZsb2F0IGFjdHVhbCwgU3RyaW5nIGhpbnQpIHsKLSAgICAgICAgaWYgKCEoYWN0dWFsIDwgZXhwZWN0ZWQpKSB7Ci0gICAgICAgICAgICBmYWlsKHdoYXQgKyAiOiBleHBlY3RlZCBsZXNzIHRoYW4gIiArIGV4cGVjdGVkICogMTAwICsgIiUsIGJ1dCBnb3QgIiArIGFjdHVhbCAqIDEwMAotICAgICAgICAgICAgICAgICAgICArICIlOyAiICsgaGludCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBwcml2YXRlIHZvaWQgcmVxdWVzdExpZ2h0QmFycyhmaW5hbCBpbnQgYmFja2dyb3VuZCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIGZpbmFsIExpZ2h0QmFyQWN0aXZpdHkgYWN0aXZpdHkgPSBtQWN0aXZpdHlSdWxlLmdldEFjdGl2aXR5KCk7CiAgICAgICAgIGFjdGl2aXR5LnJ1bk9uVWlUaHJlYWQoKCkgLT4gewpAQCAtMjQ5LDcgKzIxMSw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIFN0YXRzIGV2YWx1YXRlTGlnaHRCYXJCaXRtYXAoQml0bWFwIGJpdG1hcCwgaW50IGJhY2tncm91bmQpIHsKKyAgICBwcml2YXRlIFN0YXRzIGV2YWx1YXRlTGlnaHRCYXJCaXRtYXAoQml0bWFwIGJpdG1hcCwgaW50IGJhY2tncm91bmQsIGludCBzaGlmdFkpIHsKICAgICAgICAgaW50IGljb25Db2xvciA9IDB4OTkwMDAwMDA7CiAgICAgICAgIGludCBpY29uUGFydGlhbENvbG9yID0gMHgzZDAwMDAwMDsKIApAQCAtMjcxLDggKzIzMywxNyBAQAogICAgICAgICBTdGF0cyBzID0gbmV3IFN0YXRzKCk7CiAgICAgICAgIGZsb2F0IGVwcyA9IDAuMDA1ZjsKIAorICAgICAgICBsb2FkQ3V0b3V0KG1BY3Rpdml0eVJ1bGUuZ2V0QWN0aXZpdHkoKSk7CiAgICAgICAgIGZsb2F0IFtdIGhzdlBpeGVsID0gbmV3IGZsb2F0WzNdOworICAgICAgICBpbnQgaSA9IDA7CiAgICAgICAgIGZvciAoaW50IGMgOiBwaXhlbHMpIHsKKyAgICAgICAgICAgIGludCB4ID0gaSAlIGJpdG1hcC5nZXRXaWR0aCgpOworICAgICAgICAgICAgaW50IHkgPSBpIC8gYml0bWFwLmdldFdpZHRoKCk7CisgICAgICAgICAgICBpKys7CisgICAgICAgICAgICBpZiAoaXNJbnNpZGVDdXRvdXQoeCwgc2hpZnRZICsgeSkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKGlzQ29sb3JTYW1lKGMsIGJhY2tncm91bmQpKSB7CiAgICAgICAgICAgICAgICAgcy5iYWNrZ3JvdW5kUGl4ZWxzKys7CiAgICAgICAgICAgICAgICAgY29udGludWU7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy9zeXN0ZW11aS9zcmMvYW5kcm9pZC9zeXN0ZW11aS9jdHMvTGlnaHRCYXJUaGVtZVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3N5c3RlbXVpL3NyYy9hbmRyb2lkL3N5c3RlbXVpL2N0cy9MaWdodEJhclRoZW1lVGVzdC5qYXZhCmluZGV4IGY4NjYxZDIuLmNmNjU5ZGUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3N5c3RlbXVpL3NyYy9hbmRyb2lkL3N5c3RlbXVpL2N0cy9MaWdodEJhclRoZW1lVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3N5c3RlbXVpL3NyYy9hbmRyb2lkL3N5c3RlbXVpL2N0cy9MaWdodEJhclRoZW1lVGVzdC5qYXZhCkBAIC0xNiwyMSArMTYsMjIgQEAKIAogcGFja2FnZSBhbmRyb2lkLnN5c3RlbXVpLmN0czsKIAotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb247CitpbXBvcnQgc3RhdGljIGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uOworCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIAotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC51aWF1dG9tYXRvci5VaURldmljZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVzdE5hbWU7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCiAvKioKQEAgLTQ3LDYgKzQ4LDkgQEAKICAgICBwdWJsaWMgQWN0aXZpdHlUZXN0UnVsZTxMaWdodEJhclRoZW1lQWN0aXZpdHk+IG1BY3Rpdml0eVJ1bGUgPSBuZXcgQWN0aXZpdHlUZXN0UnVsZTw+KAogICAgICAgICAgICAgTGlnaHRCYXJUaGVtZUFjdGl2aXR5LmNsYXNzKTsKIAorICAgIEBSdWxlCisgICAgcHVibGljIFRlc3ROYW1lIG1UZXN0TmFtZSA9IG5ldyBUZXN0TmFtZSgpOworCiAgICAgQEJlZm9yZQogICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgewogICAgICAgICBtRGV2aWNlID0gVWlEZXZpY2UuZ2V0SW5zdGFuY2UoZ2V0SW5zdHJ1bWVudGF0aW9uKCkpOwpAQCAtNjAsMTMgKzY0LDI0IEBACiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TmF2aWdhdGlvbkJhckRpdmlkZXJDb2xvcigpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBhc3N1bWVIYXNDb2xvcmVkTmF2aWdhdGlvbkJhcihtQWN0aXZpdHlSdWxlKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0Q29udGV4dCgpLmdldENvbG9yKFIuY29sb3IubmF2aWdhdGlvbkJhckRpdmlkZXJDb2xvciksCisgICAgICAgICAgICAgICAgbUFjdGl2aXR5UnVsZS5nZXRBY3Rpdml0eSgpLmdldFdpbmRvdygpLmdldE5hdmlnYXRpb25CYXJEaXZpZGVyQ29sb3IoKSk7CisgICAgfQorCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0TmF2aWdhdGlvbkJhckRpdmlkZXJDb2xvcigpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBhc3N1bWVIYXNDb2xvck5hdmlnYXRpb25CYXIobUFjdGl2aXR5UnVsZSk7CisgICAgICAgIGFzc3VtZUhhc0NvbG9yZWROYXZpZ2F0aW9uQmFyKG1BY3Rpdml0eVJ1bGUpOwogCiAgICAgICAgIC8vIFdhaXQgdW50aWwgdGhlIGFjdGl2aXR5IGlzIGZ1bGx5IHZpc2libGUKICAgICAgICAgbURldmljZS53YWl0Rm9ySWRsZSgpOwogCisgICAgICAgIGZpbmFsIENvbnRleHQgaW5zdHJ1bWVudGF0aW9uQ29udGV4dCA9IGdldEluc3RydW1lbnRhdGlvbigpLmdldENvbnRleHQoKTsKICAgICAgICAgY2hlY2tOYXZpZ2F0aW9uQmFyRGl2aWRlcihtQWN0aXZpdHlSdWxlLmdldEFjdGl2aXR5KCksCi0gICAgICAgICAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0Q29udGV4dCgpLmdldENvbG9yKFIuY29sb3IubmF2aWdhdGlvbkJhckRpdmlkZXJDb2xvcikpOworICAgICAgICAgICAgICAgIGluc3RydW1lbnRhdGlvbkNvbnRleHQuZ2V0Q29sb3IoUi5jb2xvci5uYXZpZ2F0aW9uQmFyRGl2aWRlckNvbG9yKSwKKyAgICAgICAgICAgICAgICBpbnN0cnVtZW50YXRpb25Db250ZXh0LmdldENvbG9yKFIuY29sb3IubmF2aWdhdGlvbkJhckNvbG9yKSwKKyAgICAgICAgICAgICAgICBtVGVzdE5hbWUuZ2V0TWV0aG9kTmFtZSgpKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZWxlY29tL0FuZHJvaWQubWsgYi90ZXN0cy90ZXN0cy90ZWxlY29tL0FuZHJvaWQubWsKaW5kZXggOGEyNDNlYi4uYTJjNzRmYyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdGVsZWNvbS9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3Rlc3RzL3RlbGVjb20vQW5kcm9pZC5tawpAQCAtMjUsMTAgKzI1LDExIEBACiBMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQogCiBMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAotCWNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwgXAotCWN0c3Rlc3RydW5uZXIgXAotCWFuZHJvaWQtc3VwcG9ydC10ZXN0IFwKLQlsZWdhY3ktYW5kcm9pZC10ZXN0CisJY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgXAorCWN0c3Rlc3RydW5uZXItYXh0IFwKKwlhbmRyb2lkeC50ZXN0LnJ1bGVzCisKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGVsZWNvbS9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdGVzdHMvdGVsZWNvbS9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGYwY2FkNjcuLmZhZmViNWEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RlbGVjb20vQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy90ZWxlY29tL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTIzLDcgKzIzLDEwIEBACiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5ESVNBQkxFX0tFWUdVQVJEIiAvPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uTUFOQUdFX09XTl9DQUxMUyIgLz4KICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfUEhPTkVfU1RBVEUiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX0NBTExfTE9HIiAvPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVHSVNURVJfQ0FMTF9QUk9WSURFUiIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkFDQ0VQVF9IQU5ET1ZFUiIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLklOVEVSQUNUX0FDUk9TU19VU0VSUyIgLz4KIAogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC52b2ljZW1haWwucGVybWlzc2lvbi5BRERfVk9JQ0VNQUlMIiAvPgogCkBAIC02OCw2ICs3MSwxNSBAQAogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICA8L3NlcnZpY2U+CiAKKyAgICAgICAgPHNlcnZpY2UgYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkJsb2NrZWROdW1iZXJTZXJ2aWNlIgorICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlVXNlcj0idHJ1ZSIgPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVsZWNvbS5jdHMuSW5zZXJ0QmxvY2tlZE51bWJlciIvPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlbGVjb20uY3RzLkRlbGV0ZUJsb2NrZWROdW1iZXIiLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9zZXJ2aWNlPgorCiAgICAgICAgIDxyZWNlaXZlciBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVsZWNvbS5jdHMuTW9ja01pc3NlZENhbGxOb3RpZmljYXRpb25SZWNlaXZlciI+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZWxlY29tLmFjdGlvbi5TSE9XX01JU1NFRF9DQUxMU19OT1RJRklDQVRJT04iIC8+CkBAIC0xMTQsNyArMTI2LDcgQEAKICAgICAgICAgPC9hY3Rpdml0eT4KICAgICA8L2FwcGxpY2F0aW9uPgogCi0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC50ZWxlY29tLmN0cyIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBmb3IgYW5kcm9pZC50ZWxlY29tIHBhY2thZ2UiPgogICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0ibGlzdGVuZXIiCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZWxlY29tL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL3RlbGVjb20vQW5kcm9pZFRlc3QueG1sCmluZGV4IGZiNjA1ODYuLjQ2ZGUwYjcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RlbGVjb20vQW5kcm9pZFRlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL3RlbGVjb20vQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlndXJhdGlvbiBmb3IgVGVsZWNvbSBUZXN0cyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9InRlbGVjb20iIC8+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGFyZ2V0cHJlcC5Ub2tlblJlcXVpcmVtZW50Ij4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJ0b2tlbiIgdmFsdWU9InNpbS1jYXJkIiAvPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGVsZWNvbS9zcmMvYW5kcm9pZC90ZWxlY29tL2N0cy9CYXNlVGVsZWNvbVRlc3RXaXRoTW9ja1NlcnZpY2VzLmphdmEgYi90ZXN0cy90ZXN0cy90ZWxlY29tL3NyYy9hbmRyb2lkL3RlbGVjb20vY3RzL0Jhc2VUZWxlY29tVGVzdFdpdGhNb2NrU2VydmljZXMuamF2YQppbmRleCA5M2U0YzY1Li5kOWMyMWUzIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy90ZWxlY29tL3NyYy9hbmRyb2lkL3RlbGVjb20vY3RzL0Jhc2VUZWxlY29tVGVzdFdpdGhNb2NrU2VydmljZXMuamF2YQorKysgYi90ZXN0cy90ZXN0cy90ZWxlY29tL3NyYy9hbmRyb2lkL3RlbGVjb20vY3RzL0Jhc2VUZWxlY29tVGVzdFdpdGhNb2NrU2VydmljZXMuamF2YQpAQCAtMTUsMTggKzE1LDIxIEBACiAgKi8KIAogcGFja2FnZSBhbmRyb2lkLnRlbGVjb20uY3RzOworCiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudGVsZWNvbS5jdHMuVGVzdFV0aWxzLlBBQ0tBR0U7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudGVsZWNvbS5jdHMuVGVzdFV0aWxzLlRBRzsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC50ZWxlY29tLmN0cy5UZXN0VXRpbHMuV0FJVF9GT1JfU1RBVEVfQ0hBTkdFX1RJTUVPVVRfTVM7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5ub3Q7CiBpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5ub3Q7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXJUaHJlYWQ7CiBpbXBvcnQgYW5kcm9pZC50ZWxlY29tLkNhbGw7CiBpbXBvcnQgYW5kcm9pZC50ZWxlY29tLkNhbGxBdWRpb1N0YXRlOwogaW1wb3J0IGFuZHJvaWQudGVsZWNvbS5Db25mZXJlbmNlOwpAQCAtMzcsMTMgKzQwLDE4IEBACiBpbXBvcnQgYW5kcm9pZC50ZWxlY29tLlRlbGVjb21NYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudGVsZWNvbS5WaWRlb1Byb2ZpbGU7CiBpbXBvcnQgYW5kcm9pZC50ZWxlY29tLmN0cy5Nb2NrSW5DYWxsU2VydmljZS5JbkNhbGxTZXJ2aWNlQ2FsbGJhY2tzOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlBob25lU3RhdGVMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5UZWxlcGhvbnlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlBhaXI7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNlbWFwaG9yZTsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKIAogLyoqCkBAIC01OSw2ICs2Nyw3IEBACiAKICAgICBDb250ZXh0IG1Db250ZXh0OwogICAgIFRlbGVjb21NYW5hZ2VyIG1UZWxlY29tTWFuYWdlcjsKKyAgICBUZWxlcGhvbnlNYW5hZ2VyIG1UZWxlcGhvbnlNYW5hZ2VyOwogCiAgICAgVGVzdFV0aWxzLkludm9rZUNvdW50ZXIgbU9uQnJpbmdUb0ZvcmVncm91bmRDb3VudGVyOwogICAgIFRlc3RVdGlscy5JbnZva2VDb3VudGVyIG1PbkNhbGxBdWRpb1N0YXRlQ2hhbmdlZENvdW50ZXI7CkBAIC03Miw2ICs4MSw4IEBACiAgICAgVGVzdFV0aWxzLkludm9rZUNvdW50ZXIgbU9uUnR0U3RhdHVzQ2hhbmdlZENvdW50ZXI7CiAgICAgVGVzdFV0aWxzLkludm9rZUNvdW50ZXIgbU9uUnR0SW5pdGlhdGlvbkZhaWxlZENvdW50ZXI7CiAgICAgVGVzdFV0aWxzLkludm9rZUNvdW50ZXIgbU9uUnR0UmVxdWVzdENvdW50ZXI7CisgICAgVGVzdFV0aWxzLkludm9rZUNvdW50ZXIgbU9uSGFuZG92ZXJDb21wbGV0ZUNvdW50ZXI7CisgICAgVGVzdFV0aWxzLkludm9rZUNvdW50ZXIgbU9uSGFuZG92ZXJGYWlsZWRDb3VudGVyOwogICAgIEJ1bmRsZSBtUHJldmlvdXNFeHRyYXM7CiAgICAgaW50IG1QcmV2aW91c1Byb3BlcnRpZXMgPSAtMTsKIApAQCAtNzksMzMgKzkwLDg3IEBACiAgICAgU3RyaW5nIG1QcmV2aW91c0RlZmF1bHREaWFsZXIgPSBudWxsOwogICAgIE1vY2tDb25uZWN0aW9uU2VydmljZSBjb25uZWN0aW9uU2VydmljZSA9IG51bGw7CiAKKyAgICBIYW5kbGVyVGhyZWFkIG1QaG9uZVN0YXRlTGlzdGVuZXJUaHJlYWQ7CisgICAgSGFuZGxlciBtUGhvbmVTdGF0ZUxpc3RlbmVySGFuZGxlcjsKKyAgICBUZXN0UGhvbmVTdGF0ZUxpc3RlbmVyIG1QaG9uZVN0YXRlTGlzdGVuZXI7CisKKyAgICBzdGF0aWMgY2xhc3MgVGVzdFBob25lU3RhdGVMaXN0ZW5lciBleHRlbmRzIFBob25lU3RhdGVMaXN0ZW5lciB7CisgICAgICAgIC8qKiBTZW1hcGhvcmUgcmVsZWFzZWQgZm9yIGV2ZXJ5IGNhbGxiYWNrIGludm9jYXRpb24uICovCisgICAgICAgIHB1YmxpYyBTZW1hcGhvcmUgbUNhbGxiYWNrU2VtYXBob3JlID0gbmV3IFNlbWFwaG9yZSgwKTsKKworICAgICAgICBMaXN0PFBhaXI8SW50ZWdlciwgU3RyaW5nPj4gbUNhbGxTdGF0ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DYWxsU3RhdGVDaGFuZ2VkKGludCBzdGF0ZSwgU3RyaW5nIG51bWJlcikgeworICAgICAgICAgICAgTG9nLmkoVEFHLCAib25DYWxsU3RhdGVDaGFuZ2VkOiBzdGF0ZT0iICsgc3RhdGUgKyAiLCBudW1iZXI9IiArIG51bWJlcik7CisgICAgICAgICAgICBtQ2FsbFN0YXRlcy5hZGQoUGFpci5jcmVhdGUoc3RhdGUsIG51bWJlcikpOworICAgICAgICAgICAgbUNhbGxiYWNrU2VtYXBob3JlLnJlbGVhc2UoKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIGJvb2xlYW4gbVNob3VsZFRlc3RUZWxlY29tID0gdHJ1ZTsKIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHN1cGVyLnNldFVwKCk7CiAgICAgICAgIG1Db250ZXh0ID0gZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0Q29udGV4dCgpOwotICAgICAgICBtVGVsZWNvbU1hbmFnZXIgPSAoVGVsZWNvbU1hbmFnZXIpIG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5URUxFQ09NX1NFUlZJQ0UpOwogCiAgICAgICAgIG1TaG91bGRUZXN0VGVsZWNvbSA9IFRlc3RVdGlscy5zaG91bGRUZXN0VGVsZWNvbShtQ29udGV4dCk7Ci0gICAgICAgIGlmIChtU2hvdWxkVGVzdFRlbGVjb20pIHsKLSAgICAgICAgICAgIG1QcmV2aW91c0RlZmF1bHREaWFsZXIgPSBUZXN0VXRpbHMuZ2V0RGVmYXVsdERpYWxlcihnZXRJbnN0cnVtZW50YXRpb24oKSk7Ci0gICAgICAgICAgICBUZXN0VXRpbHMuc2V0RGVmYXVsdERpYWxlcihnZXRJbnN0cnVtZW50YXRpb24oKSwgUEFDS0FHRSk7Ci0gICAgICAgICAgICBzZXR1cENhbGxiYWNrcygpOworICAgICAgICBpZiAoIW1TaG91bGRUZXN0VGVsZWNvbSkgeworICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CisKKyAgICAgICAgbVRlbGVjb21NYW5hZ2VyID0gKFRlbGVjb21NYW5hZ2VyKSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuVEVMRUNPTV9TRVJWSUNFKTsKKyAgICAgICAgbVRlbGVwaG9ueU1hbmFnZXIgPSAoVGVsZXBob255TWFuYWdlcikgbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlRFTEVQSE9OWV9TRVJWSUNFKTsKKworICAgICAgICBtUHJldmlvdXNEZWZhdWx0RGlhbGVyID0gVGVzdFV0aWxzLmdldERlZmF1bHREaWFsZXIoZ2V0SW5zdHJ1bWVudGF0aW9uKCkpOworICAgICAgICBUZXN0VXRpbHMuc2V0RGVmYXVsdERpYWxlcihnZXRJbnN0cnVtZW50YXRpb24oKSwgUEFDS0FHRSk7CisgICAgICAgIHNldHVwQ2FsbGJhY2tzKCk7CisKKyAgICAgICAgLy8gUGhvbmVTdGF0ZUxpc3RlbmVyJ3MgcHVibGljIEFQSSByZWdpc3RlcnMgdGhlIGxpc3RlbmVyIG9uIHRoZSBjYWxsaW5nIHRocmVhZCwgd2hpY2ggbXVzdAorICAgICAgICAvLyBiZSBhIGxvb3BlciB0aHJlYWQuIFNvIHdlIG5lZWQgdG8gY3JlYXRlIGFuZCByZWdpc3RlciB0aGUgbGlzdGVuZXIgaW4gYSBjdXN0b20gbG9vcGVyCisgICAgICAgIC8vIHRocmVhZC4KKyAgICAgICAgbVBob25lU3RhdGVMaXN0ZW5lclRocmVhZCA9IG5ldyBIYW5kbGVyVGhyZWFkKCJQaG9uZVN0YXRlTGlzdGVuZXJUaHJlYWQiKTsKKyAgICAgICAgbVBob25lU3RhdGVMaXN0ZW5lclRocmVhZC5zdGFydCgpOworICAgICAgICBtUGhvbmVTdGF0ZUxpc3RlbmVySGFuZGxlciA9IG5ldyBIYW5kbGVyKG1QaG9uZVN0YXRlTGlzdGVuZXJUaHJlYWQuZ2V0TG9vcGVyKCkpOworICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCByZWdpc3RlcmVkTGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgICAgIG1QaG9uZVN0YXRlTGlzdGVuZXJIYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgbVBob25lU3RhdGVMaXN0ZW5lciA9IG5ldyBUZXN0UGhvbmVTdGF0ZUxpc3RlbmVyKCk7CisgICAgICAgICAgICAgICAgbVRlbGVwaG9ueU1hbmFnZXIubGlzdGVuKG1QaG9uZVN0YXRlTGlzdGVuZXIsIFBob25lU3RhdGVMaXN0ZW5lci5MSVNURU5fQ0FMTF9TVEFURSk7CisgICAgICAgICAgICAgICAgcmVnaXN0ZXJlZExhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgcmVnaXN0ZXJlZExhdGNoLmF3YWl0KAorICAgICAgICAgICAgICAgIFRlc3RVdGlscy5XQUlUX0ZPUl9QSE9ORV9TVEFURV9MSVNURU5FUl9SRUdJU1RFUkVEX1RJTUVPVVRfUywgVGltZVVuaXQuU0VDT05EUyk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG1TaG91bGRUZXN0VGVsZWNvbSkgewotICAgICAgICAgICAgY2xlYW51cENhbGxzKCk7Ci0gICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KG1QcmV2aW91c0RlZmF1bHREaWFsZXIpKSB7Ci0gICAgICAgICAgICAgICAgVGVzdFV0aWxzLnNldERlZmF1bHREaWFsZXIoZ2V0SW5zdHJ1bWVudGF0aW9uKCksIG1QcmV2aW91c0RlZmF1bHREaWFsZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGVhckRvd25Db25uZWN0aW9uU2VydmljZShUZXN0VXRpbHMuVEVTVF9QSE9ORV9BQ0NPVU5UX0hBTkRMRSk7Ci0gICAgICAgICAgICBhc3NlcnRNb2NrSW5DYWxsU2VydmljZVVuYm91bmQoKTsKLSAgICAgICAgfQogICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgICAgICBpZiAoIW1TaG91bGRUZXN0VGVsZWNvbSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggdW5yZWdpc3RlcmVkTGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgICAgIG1QaG9uZVN0YXRlTGlzdGVuZXJIYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgbVRlbGVwaG9ueU1hbmFnZXIubGlzdGVuKG1QaG9uZVN0YXRlTGlzdGVuZXIsIFBob25lU3RhdGVMaXN0ZW5lci5MSVNURU5fTk9ORSk7CisgICAgICAgICAgICAgICAgdW5yZWdpc3RlcmVkTGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICB1bnJlZ2lzdGVyZWRMYXRjaC5hd2FpdCgKKyAgICAgICAgICAgICAgICBUZXN0VXRpbHMuV0FJVF9GT1JfUEhPTkVfU1RBVEVfTElTVEVORVJfUkVHSVNURVJFRF9USU1FT1VUX1MsIFRpbWVVbml0LlNFQ09ORFMpOworICAgICAgICBtUGhvbmVTdGF0ZUxpc3RlbmVyVGhyZWFkLnF1aXQoKTsKKworICAgICAgICBjbGVhbnVwQ2FsbHMoKTsKKyAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShtUHJldmlvdXNEZWZhdWx0RGlhbGVyKSkgeworICAgICAgICAgICAgVGVzdFV0aWxzLnNldERlZmF1bHREaWFsZXIoZ2V0SW5zdHJ1bWVudGF0aW9uKCksIG1QcmV2aW91c0RlZmF1bHREaWFsZXIpOworICAgICAgICB9CisgICAgICAgIHRlYXJEb3duQ29ubmVjdGlvblNlcnZpY2UoVGVzdFV0aWxzLlRFU1RfUEhPTkVfQUNDT1VOVF9IQU5ETEUpOworICAgICAgICBhc3NlcnRNb2NrSW5DYWxsU2VydmljZVVuYm91bmQoKTsKICAgICB9CiAKICAgICBwcm90ZWN0ZWQgUGhvbmVBY2NvdW50IHNldHVwQ29ubmVjdGlvblNlcnZpY2UoTW9ja0Nvbm5lY3Rpb25TZXJ2aWNlIGNvbm5lY3Rpb25TZXJ2aWNlLApAQCAtMTQ5LDcgKzIxNCw3IEBACiAgICAgICAgIG1Db250ZXh0LnN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgc2xlZXAobG9uZyBtcykgeworICAgIHZvaWQgc2xlZXAobG9uZyBtcykgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgVGhyZWFkLnNsZWVwKG1zKTsKICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewpAQCAtMjUzLDYgKzMxOCwxNSBAQAogICAgICAgICAgICAgICAgIG1PblJ0dEluaXRpYXRpb25GYWlsZWRDb3VudGVyLmludm9rZShjYWxsLCByZWFzb24pOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uSGFuZG92ZXJDb21wbGV0ZShDYWxsIGNhbGwpIHsKKyAgICAgICAgICAgICAgICBtT25IYW5kb3ZlckNvbXBsZXRlQ291bnRlci5pbnZva2UoY2FsbCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25IYW5kb3ZlckZhaWxlZChDYWxsIGNhbGwsIGludCByZWFzb24pIHsKKyAgICAgICAgICAgICAgICBtT25IYW5kb3ZlckZhaWxlZENvdW50ZXIuaW52b2tlKGNhbGwsIHJlYXNvbik7CisgICAgICAgICAgICB9CiAgICAgICAgIH07CiAKICAgICAgICAgTW9ja0luQ2FsbFNlcnZpY2Uuc2V0Q2FsbGJhY2tzKG1JbkNhbGxDYWxsYmFja3MpOwpAQCAtMjcyLDYgKzM0Niw4IEBACiAgICAgICAgIG1PblJ0dEluaXRpYXRpb25GYWlsZWRDb3VudGVyID0KICAgICAgICAgICAgICAgICBuZXcgVGVzdFV0aWxzLkludm9rZUNvdW50ZXIoIm1PblJ0dEluaXRpYXRpb25GYWlsZWRDb3VudGVyIik7CiAgICAgICAgIG1PblJ0dFJlcXVlc3RDb3VudGVyID0gbmV3IFRlc3RVdGlscy5JbnZva2VDb3VudGVyKCJtT25SdHRSZXF1ZXN0Q291bnRlciIpOworICAgICAgICBtT25IYW5kb3ZlckNvbXBsZXRlQ291bnRlciA9IG5ldyBUZXN0VXRpbHMuSW52b2tlQ291bnRlcigibU9uSGFuZG92ZXJDb21wbGV0ZUNvdW50ZXIiKTsKKyAgICAgICAgbU9uSGFuZG92ZXJGYWlsZWRDb3VudGVyID0gbmV3IFRlc3RVdGlscy5JbnZva2VDb3VudGVyKCJtT25IYW5kb3ZlckZhaWxlZENvdW50ZXIiKTsKICAgICB9CiAKICAgICAvKioKQEAgLTUwNiw2ICs1ODIsNDYgQEAKICAgICAgICAgYXNzZXJ0Q29uZmVyZW5jZVN0YXRlKGNvbmZlcmVuY2UsIENvbm5lY3Rpb24uU1RBVEVfQUNUSVZFKTsKICAgICB9CiAKKyAgICB2b2lkIHZlcmlmeVBob25lU3RhdGVMaXN0ZW5lckNhbGxiYWNrc0ZvckNhbGwoaW50IGV4cGVjdGVkQ2FsbFN0YXRlLCBTdHJpbmcgZXhwZWN0ZWROdW1iZXIpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtUGhvbmVTdGF0ZUxpc3RlbmVyLm1DYWxsYmFja1NlbWFwaG9yZS50cnlBY3F1aXJlKAorICAgICAgICAgICAgICAgIFRlc3RVdGlscy5XQUlUX0ZPUl9QSE9ORV9TVEFURV9MSVNURU5FUl9DQUxMQkFDS19USU1FT1VUX1MsIFRpbWVVbml0LlNFQ09ORFMpKTsKKyAgICAgICAgLy8gQXQgdGhpcyBwb2ludCB3ZSBjYW4gb25seSBiZSBzdXJlIHRoYXQgd2UgZ290IEFOIHVwZGF0ZSwgYnV0IG5vdCBuZWNlc3NhcmlseSB0aGUgb25lIHdlCisgICAgICAgIC8vIGFyZSBsb29raW5nIGZvcjsgd2FpdCB1bnRpbCB3ZSBzZWUgdGhlIHN0YXRlIHdlIHdhbnQgYmVmb3JlIHZlcmlmeWluZyBmdXJ0aGVyLgorICAgICAgICB3YWl0VW50aWxDb25kaXRpb25Jc1RydWVPclRpbWVvdXQobmV3IENvbmRpdGlvbigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGV4cGVjdGVkKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGFjdHVhbCgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1QaG9uZVN0YXRlTGlzdGVuZXIubUNhbGxTdGF0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKHAgLT4gcC5maXJzdC5lcXVhbHMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZENhbGxTdGF0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHAuc2Vjb25kLmVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkTnVtYmVyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY291bnQoKSA+IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICBXQUlUX0ZPUl9TVEFURV9DSEFOR0VfVElNRU9VVF9NUywKKyAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgY2FsbCBzdGF0ZSAiICsgZXhwZWN0ZWRDYWxsU3RhdGUgKyAiIGFuZCBudW1iZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBleHBlY3RlZE51bWJlcik7CisKKworICAgICAgICAvLyBHZXQgdGhlIG1vc3QgcmVjZW50IGNhbGxiYWNrOyBpdCBpcyBwb3NzaWJsZSB0aGF0IHRoZXJlIHdhcyBhbiBpbml0aWFsIHN0YXRlIHJlcG9ydGVkIGR1ZQorICAgICAgICAvLyB0byB0aGUgZmFjdCB0aGF0IFRlbGVwaG9ueU1hbmFnZXIgd2lsbCBzb21ldGltZXMgZ2l2ZSBhbiBpbml0aWFsIHN0YXRlIGJhY2sgdG8gdGhlIGNhbGxlcgorICAgICAgICAvLyB3aGVuIHRoZSBsaXN0ZW5lciBpcyByZWdpc3RlcmVkLgorICAgICAgICBQYWlyPEludGVnZXIsIFN0cmluZz4gY2FsbFN0YXRlID0gbVBob25lU3RhdGVMaXN0ZW5lci5tQ2FsbFN0YXRlcy5nZXQoCisgICAgICAgICAgICAgICAgbVBob25lU3RhdGVMaXN0ZW5lci5tQ2FsbFN0YXRlcy5zaXplKCkgLSAxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkQ2FsbFN0YXRlLCAoaW50KSBjYWxsU3RhdGUuZmlyc3QpOworICAgICAgICAvLyBOb3RlOiBXZSBkbyBOT1QgY2hlY2sgdGhlIHBob25lIG51bWJlciBoZXJlLiAgRHVlIHRvIGNoYW5nZXMgaW4gaG93IHRoZSBwaG9uZSBzdGF0ZQorICAgICAgICAvLyBicm9hZGNhc3QgaXMgc2VudCwgdGhlIGNhbGxlciBtYXkgcmVjZWl2ZSBtdWx0aXBsZSBicm9hZGNhc3RzLCBhbmQgdGhlIG51bWJlciB3aWxsIGJlCisgICAgICAgIC8vIHByZXNlbnQgaW4gb25lIG9yIHRoZSBvdGhlci4gIFdlIHdhaXRlZCBmb3IgYSBmdWxsIG1hdGNoaW5nIGJyb2FkY2FzdCBhYm92ZSBzbyB3ZSBjYW4KKyAgICAgICAgLy8gYmUgc3VyZSB0aGUgbnVtYmVyIHdhcyByZXBvcnRlZCBhcyBleHBlY3RlZC4KKyAgICB9CisKICAgICAvKioKICAgICAgKiBEaXNjb25uZWN0IHRoZSBjcmVhdGVkIHRlc3QgY2FsbCBhbmQgdmVyaWZ5IHRoYXQgVGVsZWNvbSBoYXMgY2xlYXJlZCBhbGwgY2FsbHMuCiAgICAgICovCkBAIC01MjUsNyArNjQxLDEwIEBACiAgICAgICAgIGlmIChleHRyYXMgPT0gbnVsbCkgewogICAgICAgICAgICAgZXh0cmFzID0gbmV3IEJ1bmRsZSgpOwogICAgICAgICB9Ci0gICAgICAgIGV4dHJhcy5wdXRQYXJjZWxhYmxlKFRlbGVjb21NYW5hZ2VyLkVYVFJBX1BIT05FX0FDQ09VTlRfSEFORExFLCBUZXN0VXRpbHMuVEVTVF9QSE9ORV9BQ0NPVU5UX0hBTkRMRSk7CisgICAgICAgIGlmICghZXh0cmFzLmNvbnRhaW5zS2V5KFRlbGVjb21NYW5hZ2VyLkVYVFJBX1BIT05FX0FDQ09VTlRfSEFORExFKSkgeworICAgICAgICAgICAgZXh0cmFzLnB1dFBhcmNlbGFibGUoVGVsZWNvbU1hbmFnZXIuRVhUUkFfUEhPTkVfQUNDT1VOVF9IQU5ETEUsCisgICAgICAgICAgICAgICAgICAgIFRlc3RVdGlscy5URVNUX1BIT05FX0FDQ09VTlRfSEFORExFKTsKKyAgICAgICAgfQogCiAgICAgICAgIGlmICghVmlkZW9Qcm9maWxlLmlzQXVkaW9Pbmx5KHZpZGVvU3RhdGUpKSB7CiAgICAgICAgICAgICBleHRyYXMucHV0SW50KFRlbGVjb21NYW5hZ2VyLkVYVFJBX1NUQVJUX0NBTExfV0lUSF9WSURFT19TVEFURSwgdmlkZW9TdGF0ZSk7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZWxlY29tL3NyYy9hbmRyb2lkL3RlbGVjb20vY3RzL0NhbGxEZXRhaWxzVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdGVsZWNvbS9zcmMvYW5kcm9pZC90ZWxlY29tL2N0cy9DYWxsRGV0YWlsc1Rlc3QuamF2YQppbmRleCA0YzYwNzY0Li43N2YxNmVjIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy90ZWxlY29tL3NyYy9hbmRyb2lkL3RlbGVjb20vY3RzL0NhbGxEZXRhaWxzVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3RlbGVjb20vc3JjL2FuZHJvaWQvdGVsZWNvbS9jdHMvQ2FsbERldGFpbHNUZXN0LmphdmEKQEAgLTY4LDcgKzY4LDcgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0VYVFJBX0tFWTMgPSAiY29tLnRlc3QuZXh0cmEuVEVTVDMiOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRFU1RfRVhUUkFfVkFMVUUgPSAxMDsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0VWRU5UID0gImNvbS50ZXN0LmV2ZW50LlRFU1QiOwotCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgVEVTVF9ERUZMRUNUX1VSSSA9IFVyaS5mcm9tUGFydHMoInRlbCIsICIrMTY1MDU1NTEyMTIiLCBudWxsKTsKICAgICBwcml2YXRlIFN0YXR1c0hpbnRzIG1TdGF0dXNIaW50czsKICAgICBwcml2YXRlIEJ1bmRsZSBtRXh0cmFzID0gbmV3IEJ1bmRsZSgpOwogCkBAIC00NDIsNyArNDQyLDYgQEAKICAgICAgICAgbU9uRXh0cmFzQ2hhbmdlZENvdW50ZXIud2FpdEZvckNvdW50KDIsIFdBSVRfRk9SX1NUQVRFX0NIQU5HRV9USU1FT1VUX01TKTsKIAogICAgICAgICBCdW5kbGUgZXh0cmFzID0gbUNhbGwuZ2V0RGV0YWlscygpLmdldEV4dHJhcygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgZXh0cmFzLnNpemUoKSk7CiAgICAgICAgIGFzc2VydFRydWUoZXh0cmFzLmNvbnRhaW5zS2V5KFRFU1RfRVhUUkFfS0VZKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhURVNUX1NVQkpFQ1QsIGV4dHJhcy5nZXRTdHJpbmcoVEVTVF9FWFRSQV9LRVkpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShleHRyYXMuY29udGFpbnNLZXkoVEVTVF9FWFRSQV9LRVkyKSk7CkBAIC00NjMsNyArNDYyLDYgQEAKIAogICAgICAgICBtQ29ubmVjdGlvbi5yZW1vdmVFeHRyYXMoQXJyYXlzLmFzTGlzdChURVNUX0VYVFJBX0tFWSkpOwogICAgICAgICB2ZXJpZnlSZW1vdmVDb25uZWN0aW9uRXh0cmFzKCk7Ci0KICAgICB9CiAKICAgICAvKioKQEAgLTQ4OCw3ICs0ODYsNiBAQAogICAgICAgICBtT25FeHRyYXNDaGFuZ2VkQ291bnRlci53YWl0Rm9yQ291bnQoMywgV0FJVF9GT1JfU1RBVEVfQ0hBTkdFX1RJTUVPVVRfTVMpOwogCiAgICAgICAgIEJ1bmRsZSBleHRyYXMgPSBtQ2FsbC5nZXREZXRhaWxzKCkuZ2V0RXh0cmFzKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBleHRyYXMuc2l6ZSgpKTsKICAgICAgICAgYXNzZXJ0RmFsc2UoZXh0cmFzLmNvbnRhaW5zS2V5KFRFU1RfRVhUUkFfS0VZKSk7CiAgICAgICAgIGFzc2VydFRydWUoZXh0cmFzLmNvbnRhaW5zS2V5KFRFU1RfRVhUUkFfS0VZMikpOwogICAgICAgICBhc3NlcnRFcXVhbHMoVEVTVF9FWFRSQV9WQUxVRSwgZXh0cmFzLmdldEludChURVNUX0VYVFJBX0tFWTIpKTsKQEAgLTU0Myw3ICs1NDAsOCBAQAogICAgICAgICBtQ2FsbC5yZW1vdmVFeHRyYXMoQXJyYXlzLmFzTGlzdChURVNUX0VYVFJBX0tFWTIsIFRFU1RfRVhUUkFfS0VZMykpOwogICAgICAgICBjb3VudGVyLndhaXRGb3JDb3VudCgzLCBXQUlUX0ZPUl9TVEFURV9DSEFOR0VfVElNRU9VVF9NUyk7CiAgICAgICAgIGV4dHJhcyA9IG1Db25uZWN0aW9uLmdldEV4dHJhcygpOwotICAgICAgICBhc3NlcnRUcnVlKGV4dHJhcy5pc0VtcHR5KCkpOworICAgICAgICBhc3NlcnRGYWxzZShleHRyYXMuY29udGFpbnNLZXkoVEVTVF9FWFRSQV9LRVkyKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGV4dHJhcy5jb250YWluc0tleShURVNUX0VYVFJBX0tFWTMpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTYxNyw2ICs2MTUsMjUgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBWZXJpZmllcyB0aGF0IGEgcmVxdWVzdCB0byBkZWZsZWN0IGEgcmluZ2luZyB7QGxpbmsgQ2FsbH0gaXMgcmVsYXllZCB0byBhIHtAbGluayBDb25uZWN0aW9ufS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmbGVjdCgpIHsKKyAgICAgICAgaWYgKCFtU2hvdWxkVGVzdFRlbGVjb20pIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBPbmx5IHJpbmdpbmcgY2FsbHMgc3VwcG9ydCBkZWZsZWN0aW9uCisgICAgICAgIG1Db25uZWN0aW9uLnNldFJpbmdpbmcoKTsKKyAgICAgICAgYXNzZXJ0Q2FsbFN0YXRlKG1DYWxsLCBDYWxsLlNUQVRFX1JJTkdJTkcpOworCisgICAgICAgIGZpbmFsIEludm9rZUNvdW50ZXIgY291bnRlciA9IG1Db25uZWN0aW9uLmdldEludm9rZUNvdW50ZXIoTW9ja0Nvbm5lY3Rpb24uT05fREVGTEVDVCk7CisgICAgICAgIG1DYWxsLmRlZmxlY3QoVEVTVF9ERUZMRUNUX1VSSSk7CisgICAgICAgIGNvdW50ZXIud2FpdEZvckNvdW50KDEsIFdBSVRfRk9SX1NUQVRFX0NIQU5HRV9USU1FT1VUX01TKTsKKyAgICAgICAgVXJpIGFkZHJlc3MgPSAoVXJpKSAoY291bnRlci5nZXRBcmdzKDApWzBdKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoVEVTVF9ERUZMRUNUX1VSSSwgYWRkcmVzcyk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogVGVzdHMgdGhhdCB7QGxpbmsgQ2FsbH0gZXZlbnRzIGFyZSBwcm9wYWdhdGVkIGZyb20ge0BsaW5rIENhbGwjc2VuZENhbGxFdmVudChTdHJpbmcsIEJ1bmRsZSl9CiAgICAgICogdG8ge0BsaW5rIENvbm5lY3Rpb24jb25DYWxsRXZlbnQoU3RyaW5nLCBCdW5kbGUpfS4KICAgICAgKi8KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RlbGVjb20vc3JjL2FuZHJvaWQvdGVsZWNvbS9jdHMvQ2FsbFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RlbGVjb20vc3JjL2FuZHJvaWQvdGVsZWNvbS9jdHMvQ2FsbFRlc3QuamF2YQppbmRleCBiODkyZWRlLi5mN2JhZDRlIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy90ZWxlY29tL3NyYy9hbmRyb2lkL3RlbGVjb20vY3RzL0NhbGxUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdGVsZWNvbS9zcmMvYW5kcm9pZC90ZWxlY29tL2N0cy9DYWxsVGVzdC5qYXZhCkBAIC0xOSw4ICsxOSwxMSBAQAogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnRlbGVjb20uQ2FsbC5EZXRhaWxzLio7CiAKIGltcG9ydCBhbmRyb2lkLnRlbGVjb20uQ2FsbDsKK2ltcG9ydCBhbmRyb2lkLnRlbGVjb20uQ2FsbEF1ZGlvU3RhdGU7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKIAoraW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKIHB1YmxpYyBjbGFzcyBDYWxsVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FwYWJpbGl0aWVzQ2FuKCkgewpAQCAtMTA5LDQgKzExMiwxNyBAQAogICAgICAgICAgICAgICAgICsgIl0iLAogICAgICAgICAgICAgICAgIENhbGwuRGV0YWlscy5wcm9wZXJ0aWVzVG9TdHJpbmcocHJvcGVydGllcykpOwogICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDYWxsQXVkaW9TdGF0ZSgpIHsKKyAgICAgICAgaWYgKCFUZXN0VXRpbHMuSEFTX0JMVUVUT09USCkgcmV0dXJuOworICAgICAgICBDYWxsQXVkaW9TdGF0ZSBjYXMgPSBuZXcgQ2FsbEF1ZGlvU3RhdGUoZmFsc2UsIENhbGxBdWRpb1N0YXRlLlJPVVRFX0JMVUVUT09USCwKKyAgICAgICAgICAgICAgICBDYWxsQXVkaW9TdGF0ZS5ST1VURV9CTFVFVE9PVEggKyBDYWxsQXVkaW9TdGF0ZS5ST1VURV9TUEVBS0VSCisgICAgICAgICAgICAgICAgICAgICAgICArIENhbGxBdWRpb1N0YXRlLlJPVVRFX0VBUlBJRUNFLAorICAgICAgICAgICAgICAgIFRlc3RVdGlscy5CTFVFVE9PVEhfREVWSUNFMSwKKyAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KFRlc3RVdGlscy5CTFVFVE9PVEhfREVWSUNFMSwgVGVzdFV0aWxzLkJMVUVUT09USF9ERVZJQ0UyKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhUZXN0VXRpbHMuQkxVRVRPT1RIX0RFVklDRTEsIGNhcy5nZXRBY3RpdmVCbHVldG9vdGhEZXZpY2UoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBjYXMuZ2V0U3VwcG9ydGVkQmx1ZXRvb3RoRGV2aWNlcygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydFRydWUoY2FzLmdldFN1cHBvcnRlZEJsdWV0b290aERldmljZXMoKS5jb250YWlucyhUZXN0VXRpbHMuQkxVRVRPT1RIX0RFVklDRTEpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjYXMuZ2V0U3VwcG9ydGVkQmx1ZXRvb3RoRGV2aWNlcygpLmNvbnRhaW5zKFRlc3RVdGlscy5CTFVFVE9PVEhfREVWSUNFMikpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RlbGVjb20vc3JjL2FuZHJvaWQvdGVsZWNvbS9jdHMvQ29uZmVyZW5jZVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RlbGVjb20vc3JjL2FuZHJvaWQvdGVsZWNvbS9jdHMvQ29uZmVyZW5jZVRlc3QuamF2YQppbmRleCA5NGE4NTRmLi5mZWRlNTY3IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy90ZWxlY29tL3NyYy9hbmRyb2lkL3RlbGVjb20vY3RzL0NvbmZlcmVuY2VUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdGVsZWNvbS9zcmMvYW5kcm9pZC90ZWxlY29tL2N0cy9Db25mZXJlbmNlVGVzdC5qYXZhCkBAIC0xNzgsMTEgKzE3OCwxNSBAQAogICAgICAgICBtQ29uZmVyZW5jZU9iamVjdC5zZXRDb25mZXJlbmNlYWJsZUNvbm5lY3Rpb25zKGNvbm5lY3Rpb25MaXN0KTsKICAgICAgICAgYXNzZXJ0Q2FsbENvbmZlcmVuY2VhYmxlTGlzdChjb25mLCBjYWxsTGlzdCk7CiAKKyAgICAgICAgLy8gQ29uc3VtZWQgaW50ZXJuYWxseSBpbiBUZWxlY29tOyBubyB2ZXJpZmlhYmxlIG1hbm5lciB0byBzZWUgdGhlIGVuZCBwb2ludCBvZiB0aGlzIGRhdGEKKyAgICAgICAgLy8gdGhyb3VnaCBwdWJsaWMgQVBJcy4KICAgICAgICAgbUNvbmZlcmVuY2VPYmplY3Quc2V0Q29ubmVjdGlvblRpbWUoMCk7CisgICAgICAgIG1Db25mZXJlbmNlT2JqZWN0LnNldENvbm5lY3Rpb25TdGFydEVsYXBzZWRSZWFsVGltZSgwKTsKIAogICAgICAgICBCdW5kbGUgZXh0cmFzID0gbmV3IEJ1bmRsZSgpOwogICAgICAgICBleHRyYXMucHV0U3RyaW5nKFRlbGVjb21NYW5hZ2VyLkVYVFJBX0NBTExfRElTQ09OTkVDVF9NRVNTQUdFLCAiVGVzdCIpOwotICAgICAgICBhc3NlcnROdWxsKGNvbmYuZ2V0RGV0YWlscygpLmdldEV4dHJhcygpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY29uZi5nZXREZXRhaWxzKCkuZ2V0RXh0cmFzKCkuY29udGFpbnNLZXkoCisgICAgICAgICAgICAgICAgVGVsZWNvbU1hbmFnZXIuRVhUUkFfQ0FMTF9ESVNDT05ORUNUX01FU1NBR0UpKTsKICAgICAgICAgbUNvbmZlcmVuY2VPYmplY3Quc2V0RXh0cmFzKGV4dHJhcyk7CiAgICAgICAgIGFzc2VydENhbGxFeHRyYXMoY29uZiwgVGVsZWNvbU1hbmFnZXIuRVhUUkFfQ0FMTF9ESVNDT05ORUNUX01FU1NBR0UsICJUZXN0Iik7CiAKQEAgLTI2MCwxMSArMjY0LDE0IEBACiAgICAgICAgIEJ1bmRsZSBleHRyYXMgPSBuZXcgQnVuZGxlKCk7CiAgICAgICAgIGV4dHJhcy5wdXRTdHJpbmcoVEVTVF9FWFRSQV9LRVlfMSwgVEVTVF9FWFRSQV9WQUxVRV8xKTsKICAgICAgICAgZXh0cmFzLnB1dEludChURVNUX0VYVFJBX0tFWV8yLCBURVNUX0VYVFJBX1ZBTFVFXzIpOworICAgICAgICBpbnQgc3RhcnRJbnZva2VDb3VudCA9IG1PbkV4dHJhc0NoYW5nZWRDb3VudGVyLmdldEludm9rZUNvdW50KCk7CiAgICAgICAgIG1Db25mZXJlbmNlT2JqZWN0LnB1dEV4dHJhcyhleHRyYXMpOworICAgICAgICBtT25FeHRyYXNDaGFuZ2VkQ291bnRlci53YWl0Rm9yQ291bnQoc3RhcnRJbnZva2VDb3VudCArIDEsCisgICAgICAgICAgICAgICAgV0FJVF9GT1JfU1RBVEVfQ0hBTkdFX1RJTUVPVVRfTVMpOwogCi0gICAgICAgIG1PbkV4dHJhc0NoYW5nZWRDb3VudGVyLndhaXRGb3JDb3VudCgxKTsKLQotICAgICAgICBhc3NlcnRUcnVlKGFyZUJ1bmRsZXNFcXVhbChleHRyYXMsIGNvbmYuZ2V0RGV0YWlscygpLmdldEV4dHJhcygpKSk7CisgICAgICAgIEJ1bmRsZSBjaGFuZ2VkRXh0cmFzID0gY29uZi5nZXREZXRhaWxzKCkuZ2V0RXh0cmFzKCk7CisgICAgICAgIGFzc2VydFRydWUoY2hhbmdlZEV4dHJhcy5jb250YWluc0tleShURVNUX0VYVFJBX0tFWV8xKSk7CisgICAgICAgIGFzc2VydFRydWUoY2hhbmdlZEV4dHJhcy5jb250YWluc0tleShURVNUX0VYVFJBX0tFWV8yKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yODAsOCArMjg3LDEwIEBACiAKICAgICAgICAgc2V0dXBFeHRyYXMoKTsKIAorICAgICAgICBpbnQgc3RhcnRJbnZva2VDb3VudCA9IG1PbkV4dHJhc0NoYW5nZWRDb3VudGVyLmdldEludm9rZUNvdW50KCk7CiAgICAgICAgIG1Db25mZXJlbmNlT2JqZWN0LnJlbW92ZUV4dHJhcyhBcnJheXMuYXNMaXN0KFRFU1RfRVhUUkFfS0VZXzEpKTsKLSAgICAgICAgbU9uRXh0cmFzQ2hhbmdlZENvdW50ZXIud2FpdEZvckNvdW50KDIpOworICAgICAgICBtT25FeHRyYXNDaGFuZ2VkQ291bnRlci53YWl0Rm9yQ291bnQoc3RhcnRJbnZva2VDb3VudCArIDEsCisgICAgICAgICAgICAgICAgV0FJVF9GT1JfU1RBVEVfQ0hBTkdFX1RJTUVPVVRfTVMpOwogICAgICAgICBCdW5kbGUgZXh0cmFzID0gbUNvbmZlcmVuY2VPYmplY3QuZ2V0RXh0cmFzKCk7CiAKICAgICAgICAgYXNzZXJ0RmFsc2UoZXh0cmFzLmNvbnRhaW5zS2V5KFRFU1RfRVhUUkFfS0VZXzEpKTsKQEAgLTMwMSwxOSArMzEwLDI0IEBACiAKICAgICAgICAgc2V0dXBFeHRyYXMoKTsKIAorICAgICAgICBpbnQgc3RhcnRJbnZva2VDb3VudCA9IG1PbkV4dHJhc0NoYW5nZWRDb3VudGVyLmdldEludm9rZUNvdW50KCk7CiAgICAgICAgIG1Db25mZXJlbmNlT2JqZWN0LnJlbW92ZUV4dHJhcyhURVNUX0VYVFJBX0tFWV8xLCBURVNUX0VYVFJBX0tFWV8yKTsKLSAgICAgICAgbU9uRXh0cmFzQ2hhbmdlZENvdW50ZXIud2FpdEZvckNvdW50KDIpOworICAgICAgICBtT25FeHRyYXNDaGFuZ2VkQ291bnRlci53YWl0Rm9yQ291bnQoc3RhcnRJbnZva2VDb3VudCArIDEsCisgICAgICAgICAgICAgICAgV0FJVF9GT1JfU1RBVEVfQ0hBTkdFX1RJTUVPVVRfTVMpOwogICAgICAgICBCdW5kbGUgZXh0cmFzID0gbUNvbmZlcmVuY2VPYmplY3QuZ2V0RXh0cmFzKCk7CiAKLSAgICAgICAgYXNzZXJ0VHJ1ZShleHRyYXMgPT0gbnVsbCB8fCBleHRyYXMuaXNFbXB0eSgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoZXh0cmFzLmNvbnRhaW5zS2V5KFRFU1RfRVhUUkFfS0VZXzEpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoZXh0cmFzLmNvbnRhaW5zS2V5KFRFU1RfRVhUUkFfS0VZXzIpKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgc2V0dXBFeHRyYXMoKSB7CiAgICAgICAgIEJ1bmRsZSBleHRyYXMgPSBuZXcgQnVuZGxlKCk7CiAgICAgICAgIGV4dHJhcy5wdXRTdHJpbmcoVEVTVF9FWFRSQV9LRVlfMSwgVEVTVF9FWFRSQV9WQUxVRV8xKTsKICAgICAgICAgZXh0cmFzLnB1dEludChURVNUX0VYVFJBX0tFWV8yLCBURVNUX0VYVFJBX1ZBTFVFXzIpOworICAgICAgICBpbnQgc3RhcnRJbnZva2VDb3VudCA9IG1PbkV4dHJhc0NoYW5nZWRDb3VudGVyLmdldEludm9rZUNvdW50KCk7CiAgICAgICAgIG1Db25mZXJlbmNlT2JqZWN0LnB1dEV4dHJhcyhleHRyYXMpOwotICAgICAgICBtT25FeHRyYXNDaGFuZ2VkQ291bnRlci53YWl0Rm9yQ291bnQoMSk7CisgICAgICAgIG1PbkV4dHJhc0NoYW5nZWRDb3VudGVyLndhaXRGb3JDb3VudChzdGFydEludm9rZUNvdW50ICsgMSwKKyAgICAgICAgICAgICAgICBXQUlUX0ZPUl9TVEFURV9DSEFOR0VfVElNRU9VVF9NUyk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0zMzMsNyArMzQ3LDkgQEAKICAgICAgICAgY29uZi5wdXRFeHRyYXMoZXh0cmFzKTsKICAgICAgICAgbUNvbmZlcmVuY2VWZXJmaWNhdGlvbk9iamVjdC5tT25FeHRyYXNDaGFuZ2VkLndhaXRGb3JDb3VudCgxKTsKIAotICAgICAgICBhc3NlcnRUcnVlKGFyZUJ1bmRsZXNFcXVhbChleHRyYXMsIG1Db25mZXJlbmNlT2JqZWN0LmdldEV4dHJhcygpKSk7CisgICAgICAgIEJ1bmRsZSBjaGFuZ2VkRXh0cmFzID0gbUNvbmZlcmVuY2VPYmplY3QuZ2V0RXh0cmFzKCk7CisgICAgICAgIGFzc2VydFRydWUoY2hhbmdlZEV4dHJhcy5jb250YWluc0tleShURVNUX0VYVFJBX0tFWV8xKSk7CisgICAgICAgIGFzc2VydFRydWUoY2hhbmdlZEV4dHJhcy5jb250YWluc0tleShURVNUX0VYVFJBX0tFWV8yKSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdENvbmZlcmVuY2VBZGRBbmRSZW1vdmVDb25uZWN0aW9uKCkgewpAQCAtMzkwLDcgKzQwNiw3IEBACiAgICAgICAgIGFzc2VydFRydWUobUNvbmZlcmVuY2VPYmplY3QuZ2V0Q29ubmVjdGlvbnMoKS5jb250YWlucyhjb25uZWN0aW9uMSkpOwogICAgICAgICBhc3NlcnRUcnVlKG1Db25mZXJlbmNlT2JqZWN0LmdldENvbm5lY3Rpb25zKCkuY29udGFpbnMoY29ubmVjdGlvbjIpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbm5lY3Rpb24xLmdldERpc2Nvbm5lY3RDYXVzZSgpLCBtQ29uZmVyZW5jZU9iamVjdC5nZXREaXNjb25uZWN0Q2F1c2UoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjb25uZWN0aW9uMS5nZXRFeHRyYXMoKSwgbUNvbmZlcmVuY2VPYmplY3QuZ2V0RXh0cmFzKCkpOworICAgICAgICBhc3NlcnRUcnVlKGFyZUJ1bmRsZXNFcXVhbChjb25uZWN0aW9uMS5nZXRFeHRyYXMoKSwgbUNvbmZlcmVuY2VPYmplY3QuZ2V0RXh0cmFzKCkpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbm5lY3Rpb24xLmdldFBob25lQWNjb3VudEhhbmRsZSgpLCBtQ29uZmVyZW5jZU9iamVjdC5nZXRQaG9uZUFjY291bnRIYW5kbGUoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhjb25uZWN0aW9uMS5nZXRTdGF0dXNIaW50cygpLCBtQ29uZmVyZW5jZU9iamVjdC5nZXRTdGF0dXNIaW50cygpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKFZpZGVvUHJvZmlsZS5TVEFURV9BVURJT19PTkxZLCBtQ29uZmVyZW5jZU9iamVjdC5nZXRWaWRlb1N0YXRlKCkpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGVsZWNvbS9zcmMvYW5kcm9pZC90ZWxlY29tL2N0cy9Db25uZWN0aW9uU2VydmljZVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RlbGVjb20vc3JjL2FuZHJvaWQvdGVsZWNvbS9jdHMvQ29ubmVjdGlvblNlcnZpY2VUZXN0LmphdmEKaW5kZXggMzhmMjY3My4uYmE4YmU1ZSAxMDA3NTUKLS0tIGEvdGVzdHMvdGVzdHMvdGVsZWNvbS9zcmMvYW5kcm9pZC90ZWxlY29tL2N0cy9Db25uZWN0aW9uU2VydmljZVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy90ZWxlY29tL3NyYy9hbmRyb2lkL3RlbGVjb20vY3RzL0Nvbm5lY3Rpb25TZXJ2aWNlVGVzdC5qYXZhCkBAIC0yMSw2ICsyMSw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwogaW1wb3J0IGFuZHJvaWQudGVsZWNvbS5DYWxsOwogaW1wb3J0IGFuZHJvaWQudGVsZWNvbS5Db25uZWN0aW9uOwogaW1wb3J0IGFuZHJvaWQudGVsZWNvbS5Db25uZWN0aW9uU2VydmljZTsKQEAgLTM0LDEyICszNSwxNiBAQAogICovCiBwdWJsaWMgY2xhc3MgQ29ubmVjdGlvblNlcnZpY2VUZXN0IGV4dGVuZHMgQmFzZVRlbGVjb21UZXN0V2l0aE1vY2tTZXJ2aWNlcyB7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVcmkgU0VMRl9NQU5BR0VEX1RFU1RfQUREUkVTUyA9CisgICAgICAgICAgICBVcmkuZnJvbVBhcnRzKCJzaXAiLCAiY2FsbDFAdGVzdC5jb20iLCBudWxsKTsKKwogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHN1cGVyLnNldFVwKCk7CiAgICAgICAgIG1Db250ZXh0ID0gZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0Q29udGV4dCgpOwogICAgICAgICBpZiAobVNob3VsZFRlc3RUZWxlY29tKSB7CiAgICAgICAgICAgICBzZXR1cENvbm5lY3Rpb25TZXJ2aWNlKG51bGwsIEZMQUdfUkVHSVNURVIgfCBGTEFHX0VOQUJMRSk7CisgICAgICAgICAgICBtVGVsZWNvbU1hbmFnZXIucmVnaXN0ZXJQaG9uZUFjY291bnQoVGVzdFV0aWxzLlRFU1RfU0VMRl9NQU5BR0VEX1BIT05FX0FDQ09VTlRfMSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE1MSw2ICsxNTYsODggQEAKICAgICAgICAgKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29ubmVjdGlvblNlcnZpY2VGb2N1c0dhaW5lZFdpdGhOb0Nvbm5lY3Rpb25TZXJ2aWNlKCkgeworICAgICAgICBpZiAoIW1TaG91bGRUZXN0VGVsZWNvbSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gV0hFTiBwbGFjZSBhIG1hbmFnZWQgY2FsbAorICAgICAgICBwbGFjZUFuZFZlcmlmeUNhbGwoKTsKKworICAgICAgICAvLyBUSEVOIG1hbmFnZWQgY29ubmVjdGlvbiBzZXJ2aWNlIGhhcyBnYWluZWQgdGhlIGZvY3VzCisgICAgICAgIGFzc2VydFRydWUoY29ubmVjdGlvblNlcnZpY2Uud2FpdEZvckV2ZW50KAorICAgICAgICAgICAgICAgIE1vY2tDb25uZWN0aW9uU2VydmljZS5FVkVOVF9DT05ORUNUSU9OX1NFUlZJQ0VfRk9DVVNfR0FJTkVEKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENvbm5lY3Rpb25TZXJ2aWNlRm9jdXNHYWluZWRXaXRoU2FtZUNvbm5lY3Rpb25TZXJ2aWNlKCkgeworICAgICAgICBpZiAoIW1TaG91bGRUZXN0VGVsZWNvbSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gR0lWRU4gYSBtYW5hZ2VkIGNhbGwKKyAgICAgICAgcGxhY2VBbmRWZXJpZnlDYWxsKCk7CisgICAgICAgIENvbm5lY3Rpb24gb3V0Z29pbmcgPSB2ZXJpZnlDb25uZWN0aW9uRm9yT3V0Z29pbmdDYWxsKCk7CisgICAgICAgIG91dGdvaW5nLnNldEFjdGl2ZSgpOworICAgICAgICBhc3NlcnRUcnVlKGNvbm5lY3Rpb25TZXJ2aWNlLndhaXRGb3JFdmVudCgKKyAgICAgICAgICAgICAgICBNb2NrQ29ubmVjdGlvblNlcnZpY2UuRVZFTlRfQ09OTkVDVElPTl9TRVJWSUNFX0ZPQ1VTX0dBSU5FRCkpOworICAgICAgICBhc3NlcnRDYWxsU3RhdGUobUluQ2FsbENhbGxiYWNrcy5nZXRTZXJ2aWNlKCkuZ2V0TGFzdENhbGwoKSwgQ2FsbC5TVEFURV9BQ1RJVkUpOworCisgICAgICAgIC8vIFdIRU4gcGxhY2UgYW5vdGhlciBjYWxsIGhhcyB0aGUgc2FtZSBDb25uZWN0aW9uU2VydmljZSBhcyB0aGUgZXhpc3RpbmcgY2FsbAorICAgICAgICBwbGFjZUFuZFZlcmlmeUNhbGwoKTsKKyAgICAgICAgdmVyaWZ5Q29ubmVjdGlvbkZvck91dGdvaW5nQ2FsbCgpOworCisgICAgICAgIC8vIFRIRU4gdGhlIENvbm5lY3Rpb25TZXJ2aWNlIGhhcyBub3QgZ2FpbmVkIHRoZSBmb2N1cyBhZ2FpbgorICAgICAgICBhc3NlcnRGYWxzZShjb25uZWN0aW9uU2VydmljZS53YWl0Rm9yRXZlbnQoCisgICAgICAgICAgICAgICAgTW9ja0Nvbm5lY3Rpb25TZXJ2aWNlLkVWRU5UX0NPTk5FQ1RJT05fU0VSVklDRV9GT0NVU19HQUlORUQpKTsKKyAgICAgICAgLy8gYW5kIHRoZSBDb25uZWN0aW9uU2VydmljZSBkaWRuJ3QgbG9zZSB0aGUgZm9jdXMKKyAgICAgICAgYXNzZXJ0RmFsc2UoY29ubmVjdGlvblNlcnZpY2Uud2FpdEZvckV2ZW50KAorICAgICAgICAgICAgICAgIE1vY2tDb25uZWN0aW9uU2VydmljZS5FVkVOVF9DT05ORUNUSU9OX1NFUlZJQ0VfRk9DVVNfTE9TVCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25uZWN0aW9uU2VydmljZUZvY3VzR2FpbmVkV2l0aERpZmZlcmVudENvbm5lY3Rpb25TZXJ2aWNlKCkgeworICAgICAgICBpZiAoIW1TaG91bGRUZXN0VGVsZWNvbSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gR0lWRU4gYW4gZXhpc3RpbmcgbWFuYWdlZCBjYWxsCisgICAgICAgIHBsYWNlQW5kVmVyaWZ5Q2FsbCgpOworICAgICAgICB2ZXJpZnlDb25uZWN0aW9uRm9yT3V0Z29pbmdDYWxsKCkuc2V0QWN0aXZlKCk7CisgICAgICAgIGFzc2VydFRydWUoY29ubmVjdGlvblNlcnZpY2Uud2FpdEZvckV2ZW50KAorICAgICAgICAgICAgICAgIE1vY2tDb25uZWN0aW9uU2VydmljZS5FVkVOVF9DT05ORUNUSU9OX1NFUlZJQ0VfRk9DVVNfR0FJTkVEKSk7CisKKyAgICAgICAgLy8gV0hFTiBhIHNlbGYtbWFuYWdlZCBjYWxsIGlzIGNvbWluZworICAgICAgICBTZWxmTWFuYWdlZENvbm5lY3Rpb24gc2VsZk1hbmFnZWRDb25uZWN0aW9uID0KKyAgICAgICAgICAgICAgICBhZGRJbmNvbWluZ1NlbGZNYW5hZ2VkQ2FsbChURVNUX1NFTEZfTUFOQUdFRF9IQU5ETEVfMSwgU0VMRl9NQU5BR0VEX1RFU1RfQUREUkVTUyk7CisKKyAgICAgICAgLy8gVEhFTiB0aGUgbWFuYWdlZCBDb25uZWN0aW9uU2VydmljZSBoYXMgbG9zdCB0aGUgZm9jdXMKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb25uZWN0aW9uU2VydmljZS53YWl0Rm9yRXZlbnQoCisgICAgICAgICAgICAgICAgTW9ja0Nvbm5lY3Rpb25TZXJ2aWNlLkVWRU5UX0NPTk5FQ1RJT05fU0VSVklDRV9GT0NVU19MT1NUKSk7CisgICAgICAgIC8vIGFuZCB0aGUgc2VsZi1tYW5hZ2VkIENvbm5lY3Rpb25TZXJ2aWNlIGhhcyBnYWluZWQgdGhlIGZvY3VzCisgICAgICAgIGFzc2VydFRydWUoQ3RzU2VsZk1hbmFnZWRDb25uZWN0aW9uU2VydmljZS5nZXRDb25uZWN0aW9uU2VydmljZSgpLndhaXRGb3JVcGRhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICBDdHNTZWxmTWFuYWdlZENvbm5lY3Rpb25TZXJ2aWNlLkZPQ1VTX0dBSU5FRF9MT0NLKSk7CisKKyAgICAgICAgLy8gRGlzY29ubmVjdGVkIHRoZSBzZWxmLW1hbmFnZWQgY2FsbAorICAgICAgICBzZWxmTWFuYWdlZENvbm5lY3Rpb24uZGlzY29ubmVjdEFuZERlc3Ryb3koKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFNlbGZNYW5hZ2VkQ29ubmVjdGlvbiBhZGRJbmNvbWluZ1NlbGZNYW5hZ2VkQ2FsbCgKKyAgICAgICAgICAgIFBob25lQWNjb3VudEhhbmRsZSBwYWgsIFVyaSBhZGRyZXNzKSB7CisKKyAgICAgICAgVGVzdFV0aWxzLmFkZEluY29taW5nQ2FsbChnZXRJbnN0cnVtZW50YXRpb24oKSwgbVRlbGVjb21NYW5hZ2VyLCBwYWgsIGFkZHJlc3MpOworCisgICAgICAgIC8vIEVuc3VyZSBUZWxlY29tIGJvdW5kIHRvIHRoZSBzZWxmIG1hbmFnZWQgQ1MKKyAgICAgICAgaWYgKCFDdHNTZWxmTWFuYWdlZENvbm5lY3Rpb25TZXJ2aWNlLndhaXRGb3JCaW5kaW5nKCkpIHsKKyAgICAgICAgICAgIGZhaWwoIkNvdWxkIG5vdCBiaW5kIHRvIFNlbGYtTWFuYWdlZCBDb25uZWN0aW9uU2VydmljZSIpOworICAgICAgICB9CisKKyAgICAgICAgU2VsZk1hbmFnZWRDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSBUZXN0VXRpbHMud2FpdEZvckFuZEdldENvbm5lY3Rpb24oYWRkcmVzcyk7CisKKyAgICAgICAgLy8gQWN0aXZlIHRoZSBjYWxsCisgICAgICAgIGNvbm5lY3Rpb24uc2V0QWN0aXZlKCk7CisKKyAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb247CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgdGVzdEdldEFsbENvbm5lY3Rpb25zKCkgewogICAgICAgICBpZiAoIW1TaG91bGRUZXN0VGVsZWNvbSkgewogICAgICAgICAgICAgcmV0dXJuOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGVsZWNvbS9zcmMvYW5kcm9pZC90ZWxlY29tL2N0cy9DdHNDb25uZWN0aW9uU2VydmljZS5qYXZhIGIvdGVzdHMvdGVzdHMvdGVsZWNvbS9zcmMvYW5kcm9pZC90ZWxlY29tL2N0cy9DdHNDb25uZWN0aW9uU2VydmljZS5qYXZhCmluZGV4IGIwY2FhZjIuLmM5ZTBjNTYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RlbGVjb20vc3JjL2FuZHJvaWQvdGVsZWNvbS9jdHMvQ3RzQ29ubmVjdGlvblNlcnZpY2UuamF2YQorKysgYi90ZXN0cy90ZXN0cy90ZWxlY29tL3NyYy9hbmRyb2lkL3RlbGVjb20vY3RzL0N0c0Nvbm5lY3Rpb25TZXJ2aWNlLmphdmEKQEAgLTE3Niw2ICsxNzYsMjQgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNvbm5lY3Rpb25TZXJ2aWNlRm9jdXNHYWluZWQoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAoc0xvY2spIHsKKyAgICAgICAgICAgIGlmIChzQ29ubmVjdGlvblNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNDb25uZWN0aW9uU2VydmljZS5vbkNvbm5lY3Rpb25TZXJ2aWNlRm9jdXNHYWluZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ29ubmVjdGlvblNlcnZpY2VGb2N1c0xvc3QoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAoc0xvY2spIHsKKyAgICAgICAgICAgIGlmIChzQ29ubmVjdGlvblNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNDb25uZWN0aW9uU2VydmljZS5vbkNvbm5lY3Rpb25TZXJ2aWNlRm9jdXNMb3N0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBvblVuYmluZChJbnRlbnQgaW50ZW50KSB7CiAgICAgICAgIExvZy5pKExPR19UQUcsICJTZXJ2aWNlIGhhcyBiZWVuIHVuYm91bmQiKTsKICAgICAgICAgc1NlcnZpY2VVbkJvdW5kTGF0Y2guY291bnREb3duKCk7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZWxlY29tL3NyYy9hbmRyb2lkL3RlbGVjb20vY3RzL0N0c1NlbGZNYW5hZ2VkQ29ubmVjdGlvblNlcnZpY2UuamF2YSBiL3Rlc3RzL3Rlc3RzL3RlbGVjb20vc3JjL2FuZHJvaWQvdGVsZWNvbS9jdHMvQ3RzU2VsZk1hbmFnZWRDb25uZWN0aW9uU2VydmljZS5qYXZhCmluZGV4IDEzMzQwNjEuLjcwZjY4YTAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RlbGVjb20vc3JjL2FuZHJvaWQvdGVsZWNvbS9jdHMvQ3RzU2VsZk1hbmFnZWRDb25uZWN0aW9uU2VydmljZS5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3RlbGVjb20vc3JjL2FuZHJvaWQvdGVsZWNvbS9jdHMvQ3RzU2VsZk1hbmFnZWRDb25uZWN0aW9uU2VydmljZS5qYXZhCkBAIC0yNCw2ICsyNCw3IEBACiBpbXBvcnQgYW5kcm9pZC50ZWxlY29tLkRpc2Nvbm5lY3RDYXVzZTsKIGltcG9ydCBhbmRyb2lkLnRlbGVjb20uUGhvbmVBY2NvdW50SGFuZGxlOwogaW1wb3J0IGFuZHJvaWQudGVsZWNvbS5UZWxlY29tTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwpAQCAtNDEsNyArNDIsMTEgQEAKICAgICBwdWJsaWMgc3RhdGljIGludCBDT05ORUNUSU9OX0NSRUFURURfTE9DSyA9IDA7CiAgICAgcHVibGljIHN0YXRpYyBpbnQgQ1JFQVRFX0lOQ09NSU5HX0NPTk5FQ1RJT05fRkFJTEVEX0xPQ0sgPSAxOwogICAgIHB1YmxpYyBzdGF0aWMgaW50IENSRUFURV9PVVRHT0lOR19DT05ORUNUSU9OX0ZBSUxFRF9MT0NLID0gMjsKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgTlVNX0xPQ0tTID0gQ1JFQVRFX09VVEdPSU5HX0NPTk5FQ1RJT05fRkFJTEVEX0xPQ0sgKyAxOworICAgIHB1YmxpYyBzdGF0aWMgaW50IEhBTkRPVkVSX0ZBSUxFRF9MT0NLID0gMzsKKyAgICBwdWJsaWMgc3RhdGljIGludCBGT0NVU19HQUlORURfTE9DSyA9IDQ7CisgICAgcHVibGljIHN0YXRpYyBpbnQgRk9DVVNfTE9TVF9MT0NLID0gNTsKKworICAgIHByaXZhdGUgc3RhdGljIGludCBOVU1fTE9DS1MgPSBGT0NVU19MT1NUX0xPQ0sgKyAxOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgQ3RzU2VsZk1hbmFnZWRDb25uZWN0aW9uU2VydmljZSBzQ29ubmVjdGlvblNlcnZpY2U7CiAKQEAgLTYwLDYgKzY1LDEwIEBACiAKICAgICBwcml2YXRlIE9iamVjdCBtTG9jayA9IG5ldyBPYmplY3QoKTsKICAgICBwcml2YXRlIExpc3Q8U2VsZk1hbmFnZWRDb25uZWN0aW9uPiBtQ29ubmVjdGlvbnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICBwcml2YXRlIFRlc3RVdGlscy5JbnZva2VDb3VudGVyIG1PbkNyZWF0ZUluY29taW5nSGFuZG92ZXJDb25uZWN0aW9uQ291bnRlciA9CisgICAgICAgICAgICBuZXcgVGVzdFV0aWxzLkludm9rZUNvdW50ZXIoImluY29taW5nSGFuZG92ZXJDb25uZWN0aW9uIik7CisgICAgcHJpdmF0ZSBUZXN0VXRpbHMuSW52b2tlQ291bnRlciBtT25DcmVhdGVPdXRnb2luZ0hhbmRvdmVyQ29ubmVjdGlvbkNvdW50ZXIgPQorICAgICAgICAgICAgbmV3IFRlc3RVdGlscy5JbnZva2VDb3VudGVyKCJvdXRnb2luZ0hhbmRvdmVyQ29ubmVjdGlvbiIpOwogCiAgICAgcHVibGljIHN0YXRpYyBDdHNTZWxmTWFuYWdlZENvbm5lY3Rpb25TZXJ2aWNlIGdldENvbm5lY3Rpb25TZXJ2aWNlKCkgewogICAgICAgICByZXR1cm4gc0Nvbm5lY3Rpb25TZXJ2aWNlOwpAQCAtMTA2LDYgKzExNSwzNyBAQAogICAgICAgICBtTG9ja3NbQ1JFQVRFX09VVEdPSU5HX0NPTk5FQ1RJT05fRkFJTEVEX0xPQ0tdLmNvdW50RG93bigpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDb25uZWN0aW9uIG9uQ3JlYXRlSW5jb21pbmdIYW5kb3ZlckNvbm5lY3Rpb24oUGhvbmVBY2NvdW50SGFuZGxlIGZyb21QaG9uZUFjY291bnRIYW5kbGUsCisgICAgICAgICAgICBDb25uZWN0aW9uUmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIG1PbkNyZWF0ZUluY29taW5nSGFuZG92ZXJDb25uZWN0aW9uQ291bnRlci5pbnZva2UoZnJvbVBob25lQWNjb3VudEhhbmRsZSwgcmVxdWVzdCk7CisgICAgICAgIHJldHVybiBjcmVhdGVTZWxmTWFuYWdlZENvbm5lY3Rpb24ocmVxdWVzdCwgdHJ1ZSAvKiBpbmNvbWluZyAqLyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENvbm5lY3Rpb24gb25DcmVhdGVPdXRnb2luZ0hhbmRvdmVyQ29ubmVjdGlvbihQaG9uZUFjY291bnRIYW5kbGUgZnJvbVBob25lQWNjb3VudEhhbmRsZSwKKyAgICAgICAgICAgIENvbm5lY3Rpb25SZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgbU9uQ3JlYXRlT3V0Z29pbmdIYW5kb3ZlckNvbm5lY3Rpb25Db3VudGVyLmludm9rZShmcm9tUGhvbmVBY2NvdW50SGFuZGxlLCByZXF1ZXN0KTsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZVNlbGZNYW5hZ2VkQ29ubmVjdGlvbihyZXF1ZXN0LCBmYWxzZSAvKiBpbmNvbWluZyAqLyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25IYW5kb3ZlckZhaWxlZChDb25uZWN0aW9uUmVxdWVzdCByZXF1ZXN0LCBpbnQgZXJyb3IpIHsKKyAgICAgICAgbUxvY2tzW0hBTkRPVkVSX0ZBSUxFRF9MT0NLXS5jb3VudERvd24oKTsKKyAgICB9CisKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ29ubmVjdGlvblNlcnZpY2VGb2N1c0dhaW5lZCgpIHsKKyAgICAgICAgbUxvY2tzW0ZPQ1VTX0dBSU5FRF9MT0NLXS5jb3VudERvd24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNvbm5lY3Rpb25TZXJ2aWNlRm9jdXNMb3N0KCkgeworICAgICAgICBtTG9ja3NbRk9DVVNfTE9TVF9MT0NLXS5jb3VudERvd24oKTsKKyAgICAgICAgY29ubmVjdGlvblNlcnZpY2VGb2N1c1JlbGVhc2VkKCk7CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CiAgICAgICAgIHN5bmNocm9uaXplZChtTG9jaykgewogICAgICAgICAgICAgaWYgKG1Db25uZWN0aW9ucyAhPSBudWxsICYmIG1Db25uZWN0aW9ucy5zaXplKCkgPiAwKSB7CkBAIC0xMjQsNiArMTY0LDggQEAKICAgICAgICAgU2VsZk1hbmFnZWRDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSBuZXcgU2VsZk1hbmFnZWRDb25uZWN0aW9uKGlzSW5jb21pbmcsCiAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25MaXN0ZW5lcik7CiAgICAgICAgIGNvbm5lY3Rpb24uc2V0Q29ubmVjdGlvblByb3BlcnRpZXMoQ29ubmVjdGlvbi5QUk9QRVJUWV9TRUxGX01BTkFHRUQpOworICAgICAgICBjb25uZWN0aW9uLnNldENvbm5lY3Rpb25DYXBhYmlsaXRpZXMoCisgICAgICAgICAgICAgICAgQ29ubmVjdGlvbi5DQVBBQklMSVRZX0hPTEQgfCBDb25uZWN0aW9uLkNBUEFCSUxJVFlfU1VQUE9SVF9IT0xEKTsKICAgICAgICAgY29ubmVjdGlvbi5zZXRBZGRyZXNzKHJlcXVlc3QuZ2V0QWRkcmVzcygpLCBUZWxlY29tTWFuYWdlci5QUkVTRU5UQVRJT05fQUxMT1dFRCk7CiAgICAgICAgIGNvbm5lY3Rpb24uc2V0RXh0cmFzKHJlcXVlc3QuZ2V0RXh0cmFzKCkpOwogCkBAIC0xMzMsNiArMTc1LDkgQEAKICAgICAgICAgY29ubmVjdGlvbi5wdXRFeHRyYXMobW9yZUV4dHJhcyk7CiAgICAgICAgIGNvbm5lY3Rpb24uc2V0VmlkZW9TdGF0ZShyZXF1ZXN0LmdldFZpZGVvU3RhdGUoKSk7CiAKKyAgICAgICAgaWYgKCFpc0luY29taW5nKSB7CisgICAgICAgICAgIGNvbm5lY3Rpb24uc2V0SW5pdGlhbGl6aW5nKCk7CisgICAgICAgIH0KICAgICAgICAgc3luY2hyb25pemVkKG1Mb2NrKSB7CiAgICAgICAgICAgICBtQ29ubmVjdGlvbnMuYWRkKGNvbm5lY3Rpb24pOwogICAgICAgICB9CkBAIC0xNjUsNCArMjEwLDEyIEBACiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHdhaXRGb3JCaW5kaW5nKCkgewogICAgICAgICByZXR1cm4gVGVzdFV0aWxzLndhaXRGb3JMYXRjaENvdW50RG93bihzQmluZGluZ0xvY2spOwogICAgIH0KKworICAgIHB1YmxpYyBUZXN0VXRpbHMuSW52b2tlQ291bnRlciBnZXRPbkNyZWF0ZUluY29taW5nSGFuZG92ZXJDb25uZWN0aW9uQ291bnRlcigpIHsKKyAgICAgICAgcmV0dXJuIG1PbkNyZWF0ZUluY29taW5nSGFuZG92ZXJDb25uZWN0aW9uQ291bnRlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgVGVzdFV0aWxzLkludm9rZUNvdW50ZXIgZ2V0T25DcmVhdGVPdXRnb2luZ0hhbmRvdmVyQ29ubmVjdGlvbkNvdW50ZXIoKSB7CisgICAgICAgIHJldHVybiBtT25DcmVhdGVPdXRnb2luZ0hhbmRvdmVyQ29ubmVjdGlvbkNvdW50ZXI7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGVsZWNvbS9zcmMvYW5kcm9pZC90ZWxlY29tL2N0cy9FeHRlbmRlZEluQ2FsbFNlcnZpY2VUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy90ZWxlY29tL3NyYy9hbmRyb2lkL3RlbGVjb20vY3RzL0V4dGVuZGVkSW5DYWxsU2VydmljZVRlc3QuamF2YQppbmRleCBhOGE4NmMyLi4yZDYwODcwIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy90ZWxlY29tL3NyYy9hbmRyb2lkL3RlbGVjb20vY3RzL0V4dGVuZGVkSW5DYWxsU2VydmljZVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy90ZWxlY29tL3NyYy9hbmRyb2lkL3RlbGVjb20vY3RzL0V4dGVuZGVkSW5DYWxsU2VydmljZVRlc3QuamF2YQpAQCAtMTcsMTMgKzE3LDE0IEBACiBwYWNrYWdlIGFuZHJvaWQudGVsZWNvbS5jdHM7CiAKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC50ZWxlY29tLmN0cy5UZXN0VXRpbHMuKjsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5CbG9ja2VkTnVtYmVyVXRpbC5kZWxldGVCbG9ja2VkTnVtYmVyOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkJsb2NrZWROdW1iZXJVdGlsLmluc2VydEJsb2NrZWROdW1iZXI7CiAKIGltcG9ydCBhbmRyb2lkLmFwcC5VaU1vZGVNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkJsb2NrZWROdW1iZXJDb250cmFjdDsKIGltcG9ydCBhbmRyb2lkLnRlbGVjb20uQ2FsbEF1ZGlvU3RhdGU7CiBpbXBvcnQgYW5kcm9pZC50ZWxlY29tLkNhbGw7CiBpbXBvcnQgYW5kcm9pZC50ZWxlY29tLkNvbm5lY3Rpb247CkBAIC0xMzcsNiArMTM4LDEyIEBACiAgICAgICAgICAgICAgICAgV0FJVF9GT1JfU1RBVEVfQ0hBTkdFX1RJTUVPVVRfTVMpOwogICAgICAgICBhc3NlcnRBdWRpb1JvdXRlKGNvbm5lY3Rpb24sIHNlY29uZFJvdXRlKTsKICAgICAgICAgYXNzZXJ0QXVkaW9Sb3V0ZShpbkNhbGxTZXJ2aWNlLCBzZWNvbmRSb3V0ZSk7CisKKyAgICAgICAgLy8gQ2FsbCByZXF1ZXN0Qmx1ZXRvb3RoQXVkaW8gb24gYSBkdW1teSBkZXZpY2UuIFRoaXMgd2lsbCBiZSBhIG5vb3Agc2luY2Ugbm8gZGV2aWNlcyBhcmUKKyAgICAgICAgLy8gY29ubmVjdGVkLgorICAgICAgICBpZihUZXN0VXRpbHMuSEFTX0JMVUVUT09USCkgeworICAgICAgICAgICAgKChJbkNhbGxTZXJ2aWNlKSBpbkNhbGxTZXJ2aWNlKS5yZXF1ZXN0Qmx1ZXRvb3RoQXVkaW8oVGVzdFV0aWxzLkJMVUVUT09USF9ERVZJQ0UxKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMjQ2LDYgKzI1Myw1NSBAQAogICAgICAgICBhc3NlcnRDb25uZWN0aW9uU3RhdGUoY29ubmVjdGlvbiwgQ29ubmVjdGlvbi5TVEFURV9BQ1RJVkUpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFZlcmlmaWVzIHRoYXQgdGhlIHtAbGluayBUZWxlY29tTWFuYWdlciNlbmRDYWxsKCl9IEFQSSBpcyBhYmxlIHRvIGVuZCBhIHJpbmdpbmcgY2FsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW5kUmluZ2luZ0NhbGwoKSB7CisgICAgICAgIGlmICghbVNob3VsZFRlc3RUZWxlY29tKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBhZGRBbmRWZXJpZnlOZXdJbmNvbWluZ0NhbGwoY3JlYXRlVGVzdE51bWJlcigpLCBudWxsKTsKKyAgICAgICAgTW9ja0Nvbm5lY3Rpb24gY29ubmVjdGlvbiA9IHZlcmlmeUNvbm5lY3Rpb25Gb3JJbmNvbWluZ0NhbGwoMCk7CisgICAgICAgIGZpbmFsIE1vY2tJbkNhbGxTZXJ2aWNlIGluQ2FsbFNlcnZpY2UgPSBtSW5DYWxsQ2FsbGJhY2tzLmdldFNlcnZpY2UoKTsKKyAgICAgICAgZmluYWwgQ2FsbCBjYWxsID0gaW5DYWxsU2VydmljZS5nZXRMYXN0Q2FsbCgpOworCisgICAgICAgIGFzc2VydENhbGxTdGF0ZShjYWxsLCBDYWxsLlNUQVRFX1JJTkdJTkcpOworICAgICAgICBhc3NlcnRDb25uZWN0aW9uU3RhdGUoY29ubmVjdGlvbiwgQ29ubmVjdGlvbi5TVEFURV9SSU5HSU5HKTsKKworICAgICAgICBtVGVsZWNvbU1hbmFnZXIuZW5kQ2FsbCgpOworCisgICAgICAgIGFzc2VydENhbGxTdGF0ZShjYWxsLCBDYWxsLlNUQVRFX0RJU0NPTk5FQ1RFRCk7CisgICAgICAgIGFzc2VydENvbm5lY3Rpb25TdGF0ZShjb25uZWN0aW9uLCBDb25uZWN0aW9uLlNUQVRFX0RJU0NPTk5FQ1RFRCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmVyaWZpZXMgdGhhdCB0aGUge0BsaW5rIFRlbGVjb21NYW5hZ2VyI2VuZENhbGwoKX0gQVBJIGlzIGFibGUgdG8gZW5kIGFuIGFjdGl2ZSBjYWxsLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RFbmRDYWxsKCkgeworICAgICAgICBpZiAoIW1TaG91bGRUZXN0VGVsZWNvbSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgYWRkQW5kVmVyaWZ5TmV3SW5jb21pbmdDYWxsKGNyZWF0ZVRlc3ROdW1iZXIoKSwgbnVsbCk7CisgICAgICAgIE1vY2tDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSB2ZXJpZnlDb25uZWN0aW9uRm9ySW5jb21pbmdDYWxsKDApOworICAgICAgICBmaW5hbCBNb2NrSW5DYWxsU2VydmljZSBpbkNhbGxTZXJ2aWNlID0gbUluQ2FsbENhbGxiYWNrcy5nZXRTZXJ2aWNlKCk7CisgICAgICAgIGZpbmFsIENhbGwgY2FsbCA9IGluQ2FsbFNlcnZpY2UuZ2V0TGFzdENhbGwoKTsKKworICAgICAgICBhc3NlcnRDYWxsU3RhdGUoY2FsbCwgQ2FsbC5TVEFURV9SSU5HSU5HKTsKKyAgICAgICAgYXNzZXJ0Q29ubmVjdGlvblN0YXRlKGNvbm5lY3Rpb24sIENvbm5lY3Rpb24uU1RBVEVfUklOR0lORyk7CisKKyAgICAgICAgbVRlbGVjb21NYW5hZ2VyLmFjY2VwdFJpbmdpbmdDYWxsKCk7CisKKyAgICAgICAgYXNzZXJ0Q2FsbFN0YXRlKGNhbGwsIENhbGwuU1RBVEVfQUNUSVZFKTsKKyAgICAgICAgYXNzZXJ0Q29ubmVjdGlvblN0YXRlKGNvbm5lY3Rpb24sIENvbm5lY3Rpb24uU1RBVEVfQUNUSVZFKTsKKworICAgICAgICBtVGVsZWNvbU1hbmFnZXIuZW5kQ2FsbCgpOworCisgICAgICAgIGFzc2VydENhbGxTdGF0ZShjYWxsLCBDYWxsLlNUQVRFX0RJU0NPTk5FQ1RFRCk7CisgICAgICAgIGFzc2VydENvbm5lY3Rpb25TdGF0ZShjb25uZWN0aW9uLCBDb25uZWN0aW9uLlNUQVRFX0RJU0NPTk5FQ1RFRCk7CisgICAgfQorCiAKICAgICAvKioKICAgICAgKiBUZXN0cyB0aGF0IGlmIHRoZXJlIGlzIHRoZSBkZXZpY2UgaXMgaW4gYSBjYWxsIGFuZCBhIHNlY29uZCBjYWxsIGNvbWVzIGluLApAQCAtMzQxLDE3ICszOTcsMTcgQEAKICAgICAgICAgICAgIGFzc2VydE51bGwobUluQ2FsbENhbGxiYWNrcy5nZXRTZXJ2aWNlKCkpOwogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgaWYgKGJsb2NrZWRVcmkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLmRlbGV0ZShibG9ja2VkVXJpLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgICAgICB1bmJsb2NrTnVtYmVyKGJsb2NrZWRVcmkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSBVcmkgYmxvY2tOdW1iZXIoVXJpIHBob25lTnVtYmVyVXJpKSB7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXMgY3YgPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICBjdi5wdXQoQmxvY2tlZE51bWJlckNvbnRyYWN0LkJsb2NrZWROdW1iZXJzLkNPTFVNTl9PUklHSU5BTF9OVU1CRVIsCi0gICAgICAgICAgICAgICAgcGhvbmVOdW1iZXJVcmkuZ2V0U2NoZW1lU3BlY2lmaWNQYXJ0KCkpOwotICAgICAgICByZXR1cm4gbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCkuaW5zZXJ0KAotICAgICAgICAgICAgICAgIEJsb2NrZWROdW1iZXJDb250cmFjdC5CbG9ja2VkTnVtYmVycy5DT05URU5UX1VSSSwgY3YpOworICAgICAgICByZXR1cm4gaW5zZXJ0QmxvY2tlZE51bWJlcihtQ29udGV4dCwgcGhvbmVOdW1iZXJVcmkuZ2V0U2NoZW1lU3BlY2lmaWNQYXJ0KCkpOworICAgIH0KKworICAgIHByaXZhdGUgaW50IHVuYmxvY2tOdW1iZXIoVXJpIHVyaSkgeworICAgICAgICByZXR1cm4gZGVsZXRlQmxvY2tlZE51bWJlcihtQ29udGV4dCwgdXJpKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0QW5zd2VySW5jb21pbmdDYWxsQXNWaWRlb19TZW5kc0NvcnJlY3RWaWRlb1N0YXRlKCkgewpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGVsZWNvbS9zcmMvYW5kcm9pZC90ZWxlY29tL2N0cy9IYW5kb3ZlclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RlbGVjb20vc3JjL2FuZHJvaWQvdGVsZWNvbS9jdHMvSGFuZG92ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM5MTMxYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3RlbGVjb20vc3JjL2FuZHJvaWQvdGVsZWNvbS9jdHMvSGFuZG92ZXJUZXN0LmphdmEKQEAgLTAsMCArMSwyNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC50ZWxlY29tLmN0czsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnRlbGVjb20uY3RzLlRlc3RVdGlscy5URVNUX0hBTkRPVkVSX0RFU1RfUEhPTkVfQUNDT1VOVF9IQU5ETEU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudGVsZWNvbS5jdHMuVGVzdFV0aWxzLlRFU1RfSEFORE9WRVJfU1JDX1BIT05FX0FDQ09VTlRfSEFORExFOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnRlbGVjb20uY3RzLlRlc3RVdGlscy5XQUlUX0ZPUl9TVEFURV9DSEFOR0VfVElNRU9VVF9NUzsKKworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnRlbGVjb20uQ2FsbDsKK2ltcG9ydCBhbmRyb2lkLnRlbGVjb20uQ29ubmVjdGlvblJlcXVlc3Q7CitpbXBvcnQgYW5kcm9pZC50ZWxlY29tLlBob25lQWNjb3VudEhhbmRsZTsKK2ltcG9ydCBhbmRyb2lkLnRlbGVjb20uVGVsZWNvbU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC50ZWxlY29tLlZpZGVvUHJvZmlsZTsKKworLyoqCisgKiBUZXN0cyB0aGUgVGVsZWNvbSBoYW5kb3ZlciBBUElzLgorICovCitwdWJsaWMgY2xhc3MgSGFuZG92ZXJUZXN0IGV4dGVuZHMgQmFzZVRlbGVjb21UZXN0V2l0aE1vY2tTZXJ2aWNlcyB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgbUNvbnRleHQgPSBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRDb250ZXh0KCk7CisgICAgICAgIGlmIChtU2hvdWxkVGVzdFRlbGVjb20pIHsKKyAgICAgICAgICAgIHNldHVwQ29ubmVjdGlvblNlcnZpY2UobnVsbCwgRkxBR19SRUdJU1RFUiB8IEZMQUdfRU5BQkxFKTsKKworICAgICAgICAgICAgLy8gVGVzdCBoYW5kb3ZlciBzb3VyY2UgaXMgYSBtYW5hZ2VkIENvbm5lY3Rpb25TZXJ2aWNlCisgICAgICAgICAgICBtVGVsZWNvbU1hbmFnZXIucmVnaXN0ZXJQaG9uZUFjY291bnQoVGVzdFV0aWxzLlRFU1RfUEhPTkVfQUNDT1VOVF9IQU5ET1ZFUl9TUkMpOworICAgICAgICAgICAgVGVzdFV0aWxzLmVuYWJsZVBob25lQWNjb3VudChnZXRJbnN0cnVtZW50YXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgVGVzdFV0aWxzLlRFU1RfSEFORE9WRVJfU1JDX1BIT05FX0FDQ09VTlRfSEFORExFKTsKKyAgICAgICAgICAgIGFzc2VydFBob25lQWNjb3VudEVuYWJsZWQoVGVzdFV0aWxzLlRFU1RfSEFORE9WRVJfU1JDX1BIT05FX0FDQ09VTlRfSEFORExFKTsKKworICAgICAgICAgICAgLy8gVGVzdCBoYW5kb3ZlciBkZXN0aW5hdGlvbiBpcyBhIHNlbGYtbWFuYWdlZCBDb25uZWN0aW9uU2VydmljZS4KKyAgICAgICAgICAgIG1UZWxlY29tTWFuYWdlci5yZWdpc3RlclBob25lQWNjb3VudChUZXN0VXRpbHMuVEVTVF9QSE9ORV9BQ0NPVU5UX0hBTkRPVkVSX0RFU1QpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDdHNTZWxmTWFuYWdlZENvbm5lY3Rpb25TZXJ2aWNlIGNvbm5lY3Rpb25TZXJ2aWNlID0KKyAgICAgICAgICAgICAgICBDdHNTZWxmTWFuYWdlZENvbm5lY3Rpb25TZXJ2aWNlLmdldENvbm5lY3Rpb25TZXJ2aWNlKCk7CisgICAgICAgIGlmIChjb25uZWN0aW9uU2VydmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICBjb25uZWN0aW9uU2VydmljZS50ZWFyRG93bigpOworICAgICAgICAgICAgbVRlbGVjb21NYW5hZ2VyLnVucmVnaXN0ZXJQaG9uZUFjY291bnQoCisgICAgICAgICAgICAgICAgICAgIFRlc3RVdGlscy5URVNUX0hBTkRPVkVSX1NSQ19QSE9ORV9BQ0NPVU5UX0hBTkRMRSk7CisgICAgICAgICAgICBtVGVsZWNvbU1hbmFnZXIudW5yZWdpc3RlclBob25lQWNjb3VudCgKKyAgICAgICAgICAgICAgICAgICAgVGVzdFV0aWxzLlRFU1RfSEFORE9WRVJfREVTVF9QSE9ORV9BQ0NPVU5UX0hBTkRMRSk7CisgICAgICAgIH0KKworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuc3VyZXMgYSBjYWxsIGhhbmRvdmVyIGNhbm5vdCBiZSBpbml0aWF0ZWQgZm9yIGEge0BsaW5rIGFuZHJvaWQudGVsZWNvbS5QaG9uZUFjY291bnR9IHdoaWNoCisgICAgICogZG9lcyBub3QgZGVjbGFyZSB7QGxpbmsgYW5kcm9pZC50ZWxlY29tLlBob25lQWNjb3VudCNFWFRSQV9TVVBQT1JUU19IQU5ET1ZFUl9GUk9NfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGFuZG92ZXJTb3VyY2VGYWlsZWQoKSB7CisgICAgICAgIGlmICghbVNob3VsZFRlc3RUZWxlY29tKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBwbGFjZUFuZFZlcmlmeUNhbGwoKTsKKyAgICAgICAgQ2FsbCBjYWxsID0gbUluQ2FsbENhbGxiYWNrcy5nZXRTZXJ2aWNlKCkuZ2V0TGFzdENhbGwoKTsKKworICAgICAgICBjYWxsLmhhbmRvdmVyVG8oVGVzdFV0aWxzLlRFU1RfU0VMRl9NQU5BR0VEX0hBTkRMRV8xLCBWaWRlb1Byb2ZpbGUuU1RBVEVfQklESVJFQ1RJT05BTCwKKyAgICAgICAgICAgICAgICBudWxsKTsKKworICAgICAgICAvLyBFeHBlY3QgdGhlIGhhbmRvdmVyIGZhaWxlZCBjYWxsYmFjayB0byBiZSBjYWxsZWQuCisgICAgICAgIG1PbkhhbmRvdmVyRmFpbGVkQ291bnRlci53YWl0Rm9yQ291bnQoV0FJVF9GT1JfU1RBVEVfQ0hBTkdFX1RJTUVPVVRfTVMpOworICAgICAgICBDYWxsIGNhbGxiYWNrQ2FsbCA9IChDYWxsKSBtT25IYW5kb3ZlckZhaWxlZENvdW50ZXIuZ2V0QXJncygwKVswXTsKKyAgICAgICAgaW50IGZhaWx1cmVSZWFzb24gPSAoaW50KSBtT25IYW5kb3ZlckZhaWxlZENvdW50ZXIuZ2V0QXJncygwKVsxXTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNhbGwsIGNhbGxiYWNrQ2FsbCk7CisgICAgICAgIGFzc2VydEVxdWFscyhDYWxsLkNhbGxiYWNrLkhBTkRPVkVSX0ZBSUxVUkVfTk9UX1NVUFBPUlRFRCwgZmFpbHVyZVJlYXNvbik7CisKKyAgICAgICAgY2FsbC5kaXNjb25uZWN0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5zdXJlcyBhIGNhbGwgaGFuZG92ZXIgY2Fubm90IGJlIGluaXRpYXRlZCB0byBhIHtAbGluayBhbmRyb2lkLnRlbGVjb20uUGhvbmVBY2NvdW50fSB3aGljaAorICAgICAqIGRvZXMgbm90IGRlY2xhcmUge0BsaW5rIGFuZHJvaWQudGVsZWNvbS5QaG9uZUFjY291bnQjRVhUUkFfU1VQUE9SVFNfSEFORE9WRVJfVE99LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RIYW5kb3ZlckRlc3RpbmF0aW9uRmFpbGVkKCkgeworICAgICAgICBpZiAoIW1TaG91bGRUZXN0VGVsZWNvbSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHN0YXJ0U291cmNlQ2FsbCgpOworICAgICAgICBDYWxsIGNhbGwgPSBtSW5DYWxsQ2FsbGJhY2tzLmdldFNlcnZpY2UoKS5nZXRMYXN0Q2FsbCgpOworCisgICAgICAgIC8vIE5vdyB0cnkgdG8gaGFuZG92ZXIgdG8gYW4gYWNjb3VudCB3aGljaCBkb2VzIG5vdCBzdXBwb3J0IGhhbmRvdmVyLgorICAgICAgICBjYWxsLmhhbmRvdmVyVG8oVGVzdFV0aWxzLlRFU1RfU0VMRl9NQU5BR0VEX0hBTkRMRV8xLCBWaWRlb1Byb2ZpbGUuU1RBVEVfQklESVJFQ1RJT05BTCwKKyAgICAgICAgICAgICAgICBudWxsKTsKKworICAgICAgICAvLyBFeHBlY3QgdGhlIGhhbmRvdmVyIGZhaWxlZCBjYWxsYmFjayB0byBiZSBjYWxsZWQuCisgICAgICAgIG1PbkhhbmRvdmVyRmFpbGVkQ291bnRlci53YWl0Rm9yQ291bnQoV0FJVF9GT1JfU1RBVEVfQ0hBTkdFX1RJTUVPVVRfTVMpOworICAgICAgICBDYWxsIGNhbGxiYWNrQ2FsbCA9IChDYWxsKSBtT25IYW5kb3ZlckZhaWxlZENvdW50ZXIuZ2V0QXJncygwKVswXTsKKyAgICAgICAgaW50IGZhaWx1cmVSZWFzb24gPSAoaW50KSBtT25IYW5kb3ZlckZhaWxlZENvdW50ZXIuZ2V0QXJncygwKVsxXTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNhbGwsIGNhbGxiYWNrQ2FsbCk7CisgICAgICAgIGFzc2VydEVxdWFscyhDYWxsLkNhbGxiYWNrLkhBTkRPVkVSX0ZBSUxVUkVfTk9UX1NVUFBPUlRFRCwgZmFpbHVyZVJlYXNvbik7CisKKyAgICAgICAgY2FsbC5kaXNjb25uZWN0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5zdXJlcyB0aGF0IHdoZW4gdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYm90aCBzdXBwb3J0IGhhbmRvdmVyIHRoYXQgYW4gb3V0Z29pbmcgaGFuZG92ZXIKKyAgICAgKiByZXF1ZXN0IHdpbGwgYmUgc3VjY2Vzc2Z1bGx5IHJlbGF5ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdE91dGdvaW5nSGFuZG92ZXJSZXF1ZXN0VmFsaWQoKSB7CisgICAgICAgIGlmICghbVNob3VsZFRlc3RUZWxlY29tKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBCZWdpbiBvdXIgc291cmNlIGNhbGwgb24gdGhlIENTIHdoaWNoIHN1cHBvcnRzIGhhbmRvdmVyIGZyb20gaXQuCisgICAgICAgIHN0YXJ0U291cmNlQ2FsbCgpOworICAgICAgICBmaW5hbCBDYWxsIGNhbGwgPSBtSW5DYWxsQ2FsbGJhY2tzLmdldFNlcnZpY2UoKS5nZXRMYXN0Q2FsbCgpOworCisgICAgICAgIC8vIE5vdyB0cnkgdG8gaGFuZG92ZXIgdG8gYW4gYWNjb3VudCB3aGljaCBkb2VzIHN1cHBvcnQgaGFuZG92ZXIgdG8gaXQuCisgICAgICAgIGNhbGwuaGFuZG92ZXJUbyhUZXN0VXRpbHMuVEVTVF9IQU5ET1ZFUl9ERVNUX1BIT05FX0FDQ09VTlRfSEFORExFLAorICAgICAgICAgICAgICAgIFZpZGVvUHJvZmlsZS5TVEFURV9CSURJUkVDVElPTkFMLCBudWxsKTsKKworICAgICAgICAvLyBFbnN1cmUgVGVsZWNvbSBib3VuZCB0byB0aGUgc2VsZiBtYW5hZ2VkIENTCisgICAgICAgIGlmICghQ3RzU2VsZk1hbmFnZWRDb25uZWN0aW9uU2VydmljZS53YWl0Rm9yQmluZGluZygpKSB7CisgICAgICAgICAgICBmYWlsKCJDb3VsZCBub3QgYmluZCB0byBTZWxmLU1hbmFnZWQgQ29ubmVjdGlvblNlcnZpY2UiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFdhaXQgZm9yIGJpbmRpbmcgdG8gc2VsZiBtYW5hZ2VkIENTIGFuZCBpbnZvY2F0aW9uIG9mIG91dGdvaW5nIGhhbmRvdmVyIG1ldGhvZC4KKyAgICAgICAgVGVzdFV0aWxzLkludm9rZUNvdW50ZXIgY291bnRlciA9CisgICAgICAgICAgICAgICAgQ3RzU2VsZk1hbmFnZWRDb25uZWN0aW9uU2VydmljZS5nZXRDb25uZWN0aW9uU2VydmljZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0T25DcmVhdGVPdXRnb2luZ0hhbmRvdmVyQ29ubmVjdGlvbkNvdW50ZXIoKTsKKyAgICAgICAgY291bnRlci53YWl0Rm9yQ291bnQoV0FJVF9GT1JfU1RBVEVfQ0hBTkdFX1RJTUVPVVRfTVMpOworCisgICAgICAgIFNlbGZNYW5hZ2VkQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gVGVzdFV0aWxzLndhaXRGb3JBbmRHZXRDb25uZWN0aW9uKAorICAgICAgICAgICAgICAgIGNhbGwuZ2V0RGV0YWlscygpLmdldEhhbmRsZSgpKTsKKworICAgICAgICAvLyBWZXJpZnkgdGhlIGZyb20gaGFuZGxlIGlzIGFzIGV4cGVjdGVkLgorICAgICAgICBQaG9uZUFjY291bnRIYW5kbGUgZnJvbUhhbmRsZSA9IChQaG9uZUFjY291bnRIYW5kbGUpIGNvdW50ZXIuZ2V0QXJncygwKVswXTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFRFU1RfSEFORE9WRVJfU1JDX1BIT05FX0FDQ09VTlRfSEFORExFLCBmcm9tSGFuZGxlKTsKKyAgICAgICAgLy8gVmVyaWZ5IHRoZSB0byBoYW5kbGUgaXMgYXMgZXhwZWN0ZWQuCisgICAgICAgIENvbm5lY3Rpb25SZXF1ZXN0IHJlcXVlc3QgPSAoQ29ubmVjdGlvblJlcXVlc3QpIGNvdW50ZXIuZ2V0QXJncygwKVsxXTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFRFU1RfSEFORE9WRVJfREVTVF9QSE9ORV9BQ0NPVU5UX0hBTkRMRSwgcmVxdWVzdC5nZXRBY2NvdW50SGFuZGxlKCkpOworCisgICAgICAgIGNvbXBsZXRlSGFuZG92ZXJBbmRWZXJpZnkoY2FsbCwgY29ubmVjdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdXNlIG9mIHRoZQorICAgICAqIHtAbGluayBhbmRyb2lkLnRlbGVjb20uVGVsZWNvbU1hbmFnZXIjYWNjZXB0SGFuZG92ZXIoVXJpLCBpbnQsIFBob25lQWNjb3VudEhhbmRsZSl9IEFQSSBvbgorICAgICAqIHRoZSByZWNlaXZpbmcgc2lkZSBvZiB0aGUgaGFuZG92ZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEluY29taW5nSGFuZG92ZXJSZXF1ZXN0VmFsaWQoKSB7CisgICAgICAgIGlmICghbVNob3VsZFRlc3RUZWxlY29tKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBCZWdpbiBvdXIgc291cmNlIGNhbGwgb24gdGhlIENTIHdoaWNoIHN1cHBvcnRzIGhhbmRvdmVyIGZyb20gaXQuCisgICAgICAgIHN0YXJ0U291cmNlQ2FsbCgpOworICAgICAgICBmaW5hbCBDYWxsIGNhbGwgPSBtSW5DYWxsQ2FsbGJhY2tzLmdldFNlcnZpY2UoKS5nZXRMYXN0Q2FsbCgpOworCisgICAgICAgIC8vIFJlcXVlc3QgdG8gYWNjZXB0IGhhbmRvdmVyIG9mIHRoYXQgY2FsbCB0byBhbm90aGVyIGFwcC4KKyAgICAgICAgbVRlbGVjb21NYW5hZ2VyLmFjY2VwdEhhbmRvdmVyKGNhbGwuZ2V0RGV0YWlscygpLmdldEhhbmRsZSgpLAorICAgICAgICAgICAgICAgIFZpZGVvUHJvZmlsZS5TVEFURV9CSURJUkVDVElPTkFMLCBURVNUX0hBTkRPVkVSX0RFU1RfUEhPTkVfQUNDT1VOVF9IQU5ETEUpOworCisgICAgICAgIC8vIEVuc3VyZSBUZWxlY29tIGJvdW5kIHRvIHRoZSBzZWxmIG1hbmFnZWQgQ1MKKyAgICAgICAgaWYgKCFDdHNTZWxmTWFuYWdlZENvbm5lY3Rpb25TZXJ2aWNlLndhaXRGb3JCaW5kaW5nKCkpIHsKKyAgICAgICAgICAgIGZhaWwoIkNvdWxkIG5vdCBiaW5kIHRvIFNlbGYtTWFuYWdlZCBDb25uZWN0aW9uU2VydmljZSIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gV2FpdCBmb3IgYmluZGluZyB0byBzZWxmIG1hbmFnZWQgQ1MgYW5kIGludm9jYXRpb24gb2YgaW5jb21pbmcgaGFuZG92ZXIgbWV0aG9kLgorICAgICAgICBUZXN0VXRpbHMuSW52b2tlQ291bnRlciBjb3VudGVyID0KKyAgICAgICAgICAgICAgICBDdHNTZWxmTWFuYWdlZENvbm5lY3Rpb25TZXJ2aWNlLmdldENvbm5lY3Rpb25TZXJ2aWNlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRPbkNyZWF0ZUluY29taW5nSGFuZG92ZXJDb25uZWN0aW9uQ291bnRlcigpOworICAgICAgICBjb3VudGVyLndhaXRGb3JDb3VudChXQUlUX0ZPUl9TVEFURV9DSEFOR0VfVElNRU9VVF9NUyk7CisKKyAgICAgICAgU2VsZk1hbmFnZWRDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSBUZXN0VXRpbHMud2FpdEZvckFuZEdldENvbm5lY3Rpb24oCisgICAgICAgICAgICAgICAgY2FsbC5nZXREZXRhaWxzKCkuZ2V0SGFuZGxlKCkpOworCisgICAgICAgIC8vIFZlcmlmeSB0aGUgZnJvbSBoYW5kbGUgaXMgYXMgZXhwZWN0ZWQuCisgICAgICAgIFBob25lQWNjb3VudEhhbmRsZSBmcm9tSGFuZGxlID0gKFBob25lQWNjb3VudEhhbmRsZSkgY291bnRlci5nZXRBcmdzKDApWzBdOworICAgICAgICBhc3NlcnRFcXVhbHMoVEVTVF9IQU5ET1ZFUl9TUkNfUEhPTkVfQUNDT1VOVF9IQU5ETEUsIGZyb21IYW5kbGUpOworICAgICAgICAvLyBWZXJpZnkgdGhlIHRvIGhhbmRsZSBpcyBhcyBleHBlY3RlZC4KKyAgICAgICAgQ29ubmVjdGlvblJlcXVlc3QgcmVxdWVzdCA9IChDb25uZWN0aW9uUmVxdWVzdCkgY291bnRlci5nZXRBcmdzKDApWzFdOworICAgICAgICBhc3NlcnRFcXVhbHMoVEVTVF9IQU5ET1ZFUl9ERVNUX1BIT05FX0FDQ09VTlRfSEFORExFLCByZXF1ZXN0LmdldEFjY291bnRIYW5kbGUoKSk7CisgICAgICAgIC8vIFRoZSBvcmlnaW5hbCBjYWxsJ3MgYWRkcmVzcyBzaG91bGQgbWF0Y2ggdGhlIGFkZHJlc3Mgb2YgdGhlIGhhbmRvdmVyIHJlcXVlc3QuCisgICAgICAgIGFzc2VydEVxdWFscyhjYWxsLmdldERldGFpbHMoKS5nZXRIYW5kbGUoKSwgcmVxdWVzdC5nZXRBZGRyZXNzKCkpOworCisgICAgICAgIGNvbXBsZXRlSGFuZG92ZXJBbmRWZXJpZnkoY2FsbCwgY29ubmVjdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQmVnaW5zIGEgY2FsbCB3aGljaCB3aWxsIGJlIHRoZSBzb3VyY2Ugb2YgYSBoYW5kb3Zlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc3RhcnRTb3VyY2VDYWxsKCkgeworICAgICAgICAvLyBFbnN1cmUgdGhlIG9uZ29pbmcgYWNjb3VudCBpcyBvbiBhIFBob25lQWNjb3VudCB3aGljaCBzdXBwb3J0cyBoYW5kb3ZlciBmcm9tLgorICAgICAgICBCdW5kbGUgZXh0cmFzID0gbmV3IEJ1bmRsZSgpOworICAgICAgICBleHRyYXMucHV0UGFyY2VsYWJsZShUZWxlY29tTWFuYWdlci5FWFRSQV9QSE9ORV9BQ0NPVU5UX0hBTkRMRSwKKyAgICAgICAgICAgICAgICBURVNUX0hBTkRPVkVSX1NSQ19QSE9ORV9BQ0NPVU5UX0hBTkRMRSk7CisgICAgICAgIHBsYWNlQW5kVmVyaWZ5Q2FsbChleHRyYXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXBsZXRlIHRoZSBhIGNhbGwgaGFuZG92ZXIgYW5kIHZlcmlmeSB0aGF0IGl0IHdhcyBzdWNjZXNzZnVsbHkgcmVwb3J0ZWQuCisgICAgICogQHBhcmFtIGNhbGwKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjb21wbGV0ZUhhbmRvdmVyQW5kVmVyaWZ5KGZpbmFsIENhbGwgY2FsbCwgU2VsZk1hbmFnZWRDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKKyAgICAgICAgLy8gTWFrZSB0aGUgY29ubmVjdGlvbiBhY3RpdmUsIGluZGljYXRpbmcgdGhhdCB0aGUgdXNlciBoYXMgYWNjZXB0ZWQgdGhlIGhhbmRvdmVyLgorICAgICAgICBjb25uZWN0aW9uLnNldEFjdGl2ZSgpOworCisgICAgICAgIC8vIEV4cGVjdCB0aGUgb3JpZ2luYWwgY2FsbCB0byBoYXZlIGJlZW4gaW5mb3JtZWQgb2YgaGFuZG92ZXIgY29tcGxldGlvbi4KKyAgICAgICAgbU9uSGFuZG92ZXJDb21wbGV0ZUNvdW50ZXIud2FpdEZvckNvdW50KDEsIFdBSVRfRk9SX1NUQVRFX0NIQU5HRV9USU1FT1VUX01TKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1PbkhhbmRvdmVyQ29tcGxldGVDb3VudGVyLmdldEludm9rZUNvdW50KCkpOworCisgICAgICAgIC8vIEFsc28gZXhwZWN0IHRoZSBjb25uZWN0aW9uIHRvIGJlIGluZm9ybWVkIG9mIGhhbmRvdmVyIGNvbXBsZXRpb24uCisgICAgICAgIGNvbm5lY3Rpb24uZ2V0SGFuZG92ZXJDb21wbGV0ZUNvdW50ZXIoKS53YWl0Rm9yQ291bnQoMSwgV0FJVF9GT1JfU1RBVEVfQ0hBTkdFX1RJTUVPVVRfTVMpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY29ubmVjdGlvbi5nZXRIYW5kb3ZlckNvbXBsZXRlQ291bnRlcigpLmdldEludm9rZUNvdW50KCkpOworCisgICAgICAgIC8vIE5vdywgd2UgZXhwZWN0IHRoYXQgdGhlIG9yaWdpbmFsIGNvbm5lY3Rpb24gd2lsbCBnZXQgZGlzY29ubmVjdGVkLgorICAgICAgICB3YWl0VW50aWxDb25kaXRpb25Jc1RydWVPclRpbWVvdXQobmV3IENvbmRpdGlvbigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGV4cGVjdGVkKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ2FsbC5TVEFURV9ESVNDT05ORUNURUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgYWN0dWFsKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbC5nZXRTdGF0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgV0FJVF9GT1JfU1RBVEVfQ0hBTkdFX1RJTUVPVVRfTVMsCisgICAgICAgICAgICAgICAgIkV4cGVjdGVkIG9yaWdpbmFsIGNhbGwgdG8gYmUgZGlzY29ubmVjdGVkLiIKKyAgICAgICAgKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZWxlY29tL3NyYy9hbmRyb2lkL3RlbGVjb20vY3RzL0luY29taW5nQ2FsbFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RlbGVjb20vc3JjL2FuZHJvaWQvdGVsZWNvbS9jdHMvSW5jb21pbmdDYWxsVGVzdC5qYXZhCmluZGV4IGYzZmZlYWEuLjgzMTdlM2QgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RlbGVjb20vc3JjL2FuZHJvaWQvdGVsZWNvbS9jdHMvSW5jb21pbmdDYWxsVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3RlbGVjb20vc3JjL2FuZHJvaWQvdGVsZWNvbS9jdHMvSW5jb21pbmdDYWxsVGVzdC5qYXZhCkBAIC0xNiwxNyArMTYsMTkgQEAKIAogcGFja2FnZSBhbmRyb2lkLnRlbGVjb20uY3RzOwogCitpbXBvcnQgc3RhdGljIGFuZHJvaWQudGVsZWNvbS5jdHMuVGVzdFV0aWxzLkNPTVBPTkVOVDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC50ZWxlY29tLmN0cy5UZXN0VXRpbHMuUEFDS0FHRTsKKwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLnRlbGVjb20uQ29ubmVjdGlvbjsKIGltcG9ydCBhbmRyb2lkLnRlbGVjb20uUGhvbmVBY2NvdW50SGFuZGxlOwogaW1wb3J0IGFuZHJvaWQudGVsZWNvbS5UZWxlY29tTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5UZWxlcGhvbnlNYW5hZ2VyOwogCiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiAKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC50ZWxlY29tLmN0cy5UZXN0VXRpbHMuQ09NUE9ORU5UOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnRlbGVjb20uY3RzLlRlc3RVdGlscy5QQUNLQUdFOwotCiAvKioKICAqIFRlc3RzIHZhbGlkL2ludmFsaWQgaW5jb21pbmcgY2FsbHMgdGhhdCBhcmUgcmVjZWl2ZWQgZnJvbSB0aGUgQ29ubmVjdGlvblNlcnZpY2UKICAqIGFuZCByZWdpc3RlcmVkIHRocm91Z2ggVGVsZWNvbU1hbmFnZXIKQEAgLTM2LDEyICszOCw2IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGhvbmVBY2NvdW50SGFuZGxlIFRFU1RfSU5WQUxJRF9IQU5ETEUgPSBuZXcgUGhvbmVBY2NvdW50SGFuZGxlKAogICAgICAgICAgICAgbmV3IENvbXBvbmVudE5hbWUoUEFDS0FHRSwgQ09NUE9ORU5UKSwgIldST05HX0lEIik7CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBtQ29udGV4dCA9IGdldEluc3RydW1lbnRhdGlvbigpLmdldENvbnRleHQoKTsKLSAgICB9Ci0KICAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkTmV3SW5jb21pbmdDYWxsX0NvcnJlY3RQaG9uZUFjY291bnRIYW5kbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFtU2hvdWxkVGVzdFRlbGVjb20pIHsKICAgICAgICAgICAgIHJldHVybjsKQEAgLTU0LDYgKzUwLDE4IEBACiAgICAgICAgIGFzc2VydFRydWUoY29ubmVjdGlvbnMuY29udGFpbnMoY29ubmVjdGlvbjMpKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmVTdGF0ZUxpc3RlbmVySW52b2tlZE9uSW5jb21pbmdDYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghbVNob3VsZFRlc3RUZWxlY29tKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc2V0dXBDb25uZWN0aW9uU2VydmljZShudWxsLCBGTEFHX1JFR0lTVEVSIHwgRkxBR19FTkFCTEUpOworICAgICAgICBVcmkgdGVzdE51bWJlciA9IGNyZWF0ZVRlc3ROdW1iZXIoKTsKKyAgICAgICAgYWRkQW5kVmVyaWZ5TmV3SW5jb21pbmdDYWxsKHRlc3ROdW1iZXIsIG51bGwpOworICAgICAgICB2ZXJpZnlDb25uZWN0aW9uRm9ySW5jb21pbmdDYWxsKCk7CisgICAgICAgIHZlcmlmeVBob25lU3RhdGVMaXN0ZW5lckNhbGxiYWNrc0ZvckNhbGwoVGVsZXBob255TWFuYWdlci5DQUxMX1NUQVRFX1JJTkdJTkcsCisgICAgICAgICAgICAgICAgdGVzdE51bWJlci5nZXRTY2hlbWVTcGVjaWZpY1BhcnQoKSk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogVGVzdHMgdG8gYmUgc3VyZSB0aGF0IG5ldyBpbmNvbWluZyBjYWxscyBjYW4gb25seSBiZSBhZGRlZCB1c2luZyBhIHZhbGlkIFBob25lQWNjb3VudEhhbmRsZQogICAgICAqIChiLzI2ODY0NTAyKS4gSWYgYSBQaG9uZUFjY291bnQgaGFzIG5vdCBiZWVuIHJlZ2lzdGVyZWQgZm9yIHRoZSBQaG9uZUFjY291bnRIYW5kbGUsIHRoZW4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RlbGVjb20vc3JjL2FuZHJvaWQvdGVsZWNvbS9jdHMvTW9ja0Nvbm5lY3Rpb24uamF2YSBiL3Rlc3RzL3Rlc3RzL3RlbGVjb20vc3JjL2FuZHJvaWQvdGVsZWNvbS9jdHMvTW9ja0Nvbm5lY3Rpb24uamF2YQppbmRleCBkYTRmY2Y1Li5hNzYxYzZhIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy90ZWxlY29tL3NyYy9hbmRyb2lkL3RlbGVjb20vY3RzL01vY2tDb25uZWN0aW9uLmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdGVsZWNvbS9zcmMvYW5kcm9pZC90ZWxlY29tL2N0cy9Nb2NrQ29ubmVjdGlvbi5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC50ZWxlY29tLkNhbGxBdWRpb1N0YXRlLio7CiAKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC50ZWxlY29tLkNhbGxBdWRpb1N0YXRlOwogaW1wb3J0IGFuZHJvaWQudGVsZWNvbS5Db25uZWN0aW9uOwpAQCAtNDAsNiArNDEsNyBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9OX1NUQVJUX1JUVCA9IDU7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT05fUlRUX1JFUVVFU1RfUkVTUE9OU0UgPSA2OwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9OX1NUT1BfUlRUID0gNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPTl9ERUZMRUNUID0gODsKIAogICAgIHByaXZhdGUgQ2FsbEF1ZGlvU3RhdGUgbUNhbGxBdWRpb1N0YXRlID0KICAgICAgICAgICAgIG5ldyBDYWxsQXVkaW9TdGF0ZShmYWxzZSwgQ2FsbEF1ZGlvU3RhdGUuUk9VVEVfRUFSUElFQ0UsIFJPVVRFX0VBUlBJRUNFIHwgUk9VVEVfU1BFQUtFUik7CkBAIC0yMjEsNiArMjIzLDEzIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkRlZmxlY3QoVXJpIGFkZHJlc3MpIHsKKyAgICAgICAgaWYgKG1JbnZva2VDb3VudGVyTWFwLmdldChPTl9ERUZMRUNUKSAhPSBudWxsKSB7CisgICAgICAgICAgICBtSW52b2tlQ291bnRlck1hcC5nZXQoT05fREVGTEVDVCkuaW52b2tlKGFkZHJlc3MpOworICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIGludCBnZXRDdXJyZW50U3RhdGUoKSAgewogICAgICAgICByZXR1cm4gbVN0YXRlOwogICAgIH0KQEAgLTMyMiw2ICszMzEsOCBAQAogICAgICAgICAgICAgICAgIHJldHVybiAib25SdHRSZXF1ZXN0UmVzcG9uc2UiOwogICAgICAgICAgICAgY2FzZSBPTl9TVE9QX1JUVDoKICAgICAgICAgICAgICAgICByZXR1cm4gIm9uU3RvcFJ0dCI7CisgICAgICAgICAgICBjYXNlIE9OX0RFRkxFQ1Q6CisgICAgICAgICAgICAgICAgcmV0dXJuICJvbkRlZmxlY3QiOwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICByZXR1cm4gIkNhbGxiYWNrIjsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGVsZWNvbS9zcmMvYW5kcm9pZC90ZWxlY29tL2N0cy9Nb2NrQ29ubmVjdGlvblNlcnZpY2UuamF2YSBiL3Rlc3RzL3Rlc3RzL3RlbGVjb20vc3JjL2FuZHJvaWQvdGVsZWNvbS9jdHMvTW9ja0Nvbm5lY3Rpb25TZXJ2aWNlLmphdmEKaW5kZXggNmUwMjJlNi4uODg3NzJiMCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdGVsZWNvbS9zcmMvYW5kcm9pZC90ZWxlY29tL2N0cy9Nb2NrQ29ubmVjdGlvblNlcnZpY2UuamF2YQorKysgYi90ZXN0cy90ZXN0cy90ZWxlY29tL3NyYy9hbmRyb2lkL3RlbGVjb20vY3RzL01vY2tDb25uZWN0aW9uU2VydmljZS5qYXZhCkBAIC0xNiw2ICsxNiw3IEBACiAKIHBhY2thZ2UgYW5kcm9pZC50ZWxlY29tLmN0czsKIAoraW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQudGVsZWNvbS5Db25uZWN0aW9uOwogaW1wb3J0IGFuZHJvaWQudGVsZWNvbS5Db25uZWN0aW9uUmVxdWVzdDsKIGltcG9ydCBhbmRyb2lkLnRlbGVjb20uQ29ubmVjdGlvblNlcnZpY2U7CkBAIC0yNyw2ICsyOCw3IEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TZW1hcGhvcmU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiAKIC8qKgogICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBhIHtAbGluayBDdHNDb25uZWN0aW9uU2VydmljZX0uIFRoaXMgaXMgdXNlZCBmb3IgdGhlIG1ham9yaXR5CkBAIC0zNCw4ICszNiwyMCBAQAogICogcmVjZWl2ZWQuCiAgKi8KIHB1YmxpYyBjbGFzcyBNb2NrQ29ubmVjdGlvblNlcnZpY2UgZXh0ZW5kcyBDb25uZWN0aW9uU2VydmljZSB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfVEVTVCA9ICJjb20uYW5kcm9pZC50ZWxlY29tLmV4dHJhLlRFU1QiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfVkFMVUUgPSAid2UndmUgZ290IGl0IjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ORUNUSU9OX1BSRVNFTlRBVElPTiA9ICBUZWxlY29tTWFuYWdlci5QUkVTRU5UQVRJT05fQUxMT1dFRDsKIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0NPTk5FQ1RJT05fU0VSVklDRV9GT0NVU19HQUlORUQgPSAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0NPTk5FQ1RJT05fU0VSVklDRV9GT0NVU19MT1NUID0gMTsKKworICAgIC8vIE5leHQgZXZlbnQgaWQgaXMgMgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT1RBTF9FVkVOVCA9IEVWRU5UX0NPTk5FQ1RJT05fU0VSVklDRV9GT0NVU19MT1NUICsgMTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0VWRU5UX1RJTUVPVVRfTVMgPSAyMDAwOworCisgICAgcHJpdmF0ZSBmaW5hbCBTZW1hcGhvcmVbXSBtRXZlbnRMb2NrID0gaW5pdGlhbGl6ZVNlbWFwaG9yZShUT1RBTF9FVkVOVCk7CisKICAgICAvKioKICAgICAgKiBVc2VkIHRvIGNvbnRyb2wgd2hldGhlciB0aGUge0BsaW5rIE1vY2tWaWRlb1Byb3ZpZGVyfSB3aWxsIGJlIGNyZWF0ZWQgd2hlbiBjb25uZWN0aW9ucyBhcmUKICAgICAgKiBjcmVhdGVkLiAgVXNlZCBieSB7QGxpbmsgVmlkZW9DYWxsVGVzdCN0ZXN0VmlkZW9DYWxsRGVsYXlQcm92aWRlcigpfSB0byB0ZXN0IHNjZW5hcmlvIHdoZXJlCkBAIC03MCw3ICs4NCwxMCBAQAogICAgICAgICAgICAgY29ubmVjdGlvbi5zZXRDb25uZWN0aW9uUHJvcGVydGllcyhjb25uZWN0aW9uLmdldENvbm5lY3Rpb25Qcm9wZXJ0aWVzKCkgfAogICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uLlBST1BFUlRZX0lTX1JUVCk7CiAgICAgICAgIH0KLQorICAgICAgICAvLyBFbWl0IGFuIGV4dHJhIGludG8gdGhlIGNvbm5lY3Rpb24uICBXZSdsbCBzZWUgaWYgaXQgbWFrZXMgaXQgdGhyb3VnaC4KKyAgICAgICAgQnVuZGxlIHRlc3RFeHRyYSA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgdGVzdEV4dHJhLnB1dFN0cmluZyhFWFRSQV9URVNULCBURVNUX1ZBTFVFKTsKKyAgICAgICAgY29ubmVjdGlvbi5wdXRFeHRyYXModGVzdEV4dHJhKTsKICAgICAgICAgb3V0Z29pbmdDb25uZWN0aW9ucy5hZGQoY29ubmVjdGlvbik7CiAgICAgICAgIGxvY2sucmVsZWFzZSgpOwogICAgICAgICByZXR1cm4gY29ubmVjdGlvbjsKQEAgLTkzLDYgKzExMCwxMCBAQAogICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uLlBST1BFUlRZX0lTX1JUVCk7CiAgICAgICAgIH0KICAgICAgICAgY29ubmVjdGlvbi5zZXRSaW5naW5nKCk7CisgICAgICAgIC8vIEVtaXQgYW4gZXh0cmEgaW50byB0aGUgY29ubmVjdGlvbi4gIFdlJ2xsIHNlZSBpZiBpdCBtYWtlcyBpdCB0aHJvdWdoLgorICAgICAgICBCdW5kbGUgdGVzdEV4dHJhID0gbmV3IEJ1bmRsZSgpOworICAgICAgICB0ZXN0RXh0cmEucHV0U3RyaW5nKEVYVFJBX1RFU1QsIFRFU1RfVkFMVUUpOworICAgICAgICBjb25uZWN0aW9uLnB1dEV4dHJhcyh0ZXN0RXh0cmEpOwogCiAgICAgICAgIGluY29taW5nQ29ubmVjdGlvbnMuYWRkKGNvbm5lY3Rpb24pOwogICAgICAgICBsb2NrLnJlbGVhc2UoKTsKQEAgLTEzMSw3ICsxNTIsNDAgQEAKICAgICAgICAgcmVtb3RlQ29uZmVyZW5jZXMuYWRkKGNvbmZlcmVuY2UpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ29ubmVjdGlvblNlcnZpY2VGb2N1c0dhaW5lZCgpIHsKKyAgICAgICAgbUV2ZW50TG9ja1tFVkVOVF9DT05ORUNUSU9OX1NFUlZJQ0VfRk9DVVNfR0FJTkVEXS5yZWxlYXNlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25Db25uZWN0aW9uU2VydmljZUZvY3VzTG9zdCgpIHsKKyAgICAgICAgbUV2ZW50TG9ja1tFVkVOVF9DT05ORUNUSU9OX1NFUlZJQ0VfRk9DVVNfTE9TVF0ucmVsZWFzZSgpOworICAgICAgICBjb25uZWN0aW9uU2VydmljZUZvY3VzUmVsZWFzZWQoKTsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCBzZXRDcmVhdGVWaWRlb1Byb3ZpZGVyKGJvb2xlYW4gY3JlYXRlVmlkZW9Qcm92aWRlcikgewogICAgICAgICBtQ3JlYXRlVmlkZW9Qcm92aWRlciA9IGNyZWF0ZVZpZGVvUHJvdmlkZXI7CiAgICAgfQorCisgICAgLyoqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4ge0Bjb2RlIGV2ZW50fSBpcyBoYXBwZW5lZCBiZWZvcmUgdGhlIGRlZmF1bHQgdGltZW91dC4gKi8KKyAgICBwdWJsaWMgYm9vbGVhbiB3YWl0Rm9yRXZlbnQoaW50IGV2ZW50KSB7CisgICAgICAgIGlmIChldmVudCA8IDAgfHwgZXZlbnQgPj0gbUV2ZW50TG9jay5sZW5ndGgpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbUV2ZW50TG9ja1tldmVudF0udHJ5QWNxdWlyZShERUZBVUxUX0VWRU5UX1RJTUVPVVRfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIE5vIGludGVyYWN0aW9uIGZvciB0aGUgZ2l2ZW4gZXZlbnQgd2l0aGluIHRoZSBnaXZlbiB0aW1lb3V0LgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2VtYXBob3JlW10gaW5pdGlhbGl6ZVNlbWFwaG9yZShpbnQgdG90YWwpIHsKKyAgICAgICAgU2VtYXBob3JlW10gbG9ja3MgPSBuZXcgU2VtYXBob3JlW3RvdGFsXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b3RhbDsgaSsrKSB7CisgICAgICAgICAgICBsb2Nrc1tpXSA9IG5ldyBTZW1hcGhvcmUoMCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxvY2tzOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RlbGVjb20vc3JjL2FuZHJvaWQvdGVsZWNvbS9jdHMvTW9ja0luQ2FsbFNlcnZpY2UuamF2YSBiL3Rlc3RzL3Rlc3RzL3RlbGVjb20vc3JjL2FuZHJvaWQvdGVsZWNvbS9jdHMvTW9ja0luQ2FsbFNlcnZpY2UuamF2YQppbmRleCBlMTMzMzVlLi4zMzhhMjI1IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy90ZWxlY29tL3NyYy9hbmRyb2lkL3RlbGVjb20vY3RzL01vY2tJbkNhbGxTZXJ2aWNlLmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdGVsZWNvbS9zcmMvYW5kcm9pZC90ZWxlY29tL2N0cy9Nb2NrSW5DYWxsU2VydmljZS5qYXZhCkBAIC02NSw2ICs2NSw4IEBACiAgICAgICAgIHB1YmxpYyB2b2lkIG9uUnR0U3RhdHVzQ2hhbmdlZChDYWxsIGNhbGwsIGJvb2xlYW4gZW5hYmxlZCwgQ2FsbC5SdHRDYWxsIHJ0dENhbGwpIHt9CiAgICAgICAgIHB1YmxpYyB2b2lkIG9uUnR0UmVxdWVzdChDYWxsIGNhbGwsIGludCBpZCkge30KICAgICAgICAgcHVibGljIHZvaWQgb25SdHRJbml0aWF0aW9uRmFpbHVyZShDYWxsIGNhbGwsIGludCByZWFzb24pIHt9CisgICAgICAgIHB1YmxpYyB2b2lkIG9uSGFuZG92ZXJDb21wbGV0ZShDYWxsIGNhbGwpIHt9CisgICAgICAgIHB1YmxpYyB2b2lkIG9uSGFuZG92ZXJGYWlsZWQoQ2FsbCBjYWxsLCBpbnQgZmFpbHVyZVJlYXNvbikge30KIAogICAgICAgICBmaW5hbCBwdWJsaWMgTW9ja0luQ2FsbFNlcnZpY2UgZ2V0U2VydmljZSgpIHsKICAgICAgICAgICAgIHJldHVybiBtU2VydmljZTsKQEAgLTE4OSw2ICsxOTEsMjIgQEAKICAgICAgICAgICAgICAgICBnZXRDYWxsYmFja3MoKS5vblJ0dEluaXRpYXRpb25GYWlsdXJlKGNhbGwsIHJlYXNvbik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25IYW5kb3ZlckNvbXBsZXRlKENhbGwgY2FsbCkgeworICAgICAgICAgICAgc3VwZXIub25IYW5kb3ZlckNvbXBsZXRlKGNhbGwpOworICAgICAgICAgICAgaWYgKGdldENhbGxiYWNrcygpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBnZXRDYWxsYmFja3MoKS5vbkhhbmRvdmVyQ29tcGxldGUoY2FsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25IYW5kb3ZlckZhaWxlZChDYWxsIGNhbGwsIGludCBmYWlsdXJlUmVhc29uKSB7CisgICAgICAgICAgICBzdXBlci5vbkhhbmRvdmVyRmFpbGVkKGNhbGwsIGZhaWx1cmVSZWFzb24pOworICAgICAgICAgICAgaWYgKGdldENhbGxiYWNrcygpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBnZXRDYWxsYmFja3MoKS5vbkhhbmRvdmVyRmFpbGVkKGNhbGwsIGZhaWx1cmVSZWFzb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfTsKIAogICAgIHByaXZhdGUgdm9pZCBzYXZlVmlkZW9DYWxsKENhbGwgY2FsbCwgVmlkZW9DYWxsIHZpZGVvQ2FsbCkgewpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGVsZWNvbS9zcmMvYW5kcm9pZC90ZWxlY29tL2N0cy9PdXRnb2luZ0NhbGxUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy90ZWxlY29tL3NyYy9hbmRyb2lkL3RlbGVjb20vY3RzL091dGdvaW5nQ2FsbFRlc3QuamF2YQppbmRleCAzOGE2NzA5Li4wNDkzNTVmIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy90ZWxlY29tL3NyYy9hbmRyb2lkL3RlbGVjb20vY3RzL091dGdvaW5nQ2FsbFRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy90ZWxlY29tL3NyYy9hbmRyb2lkL3RlbGVjb20vY3RzL091dGdvaW5nQ2FsbFRlc3QuamF2YQpAQCAtMTYsMTMgKzE2LDEyIEBACiAKIHBhY2thZ2UgYW5kcm9pZC50ZWxlY29tLmN0czsKIAotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnRlbGVjb20uY3RzLlRlc3RVdGlscy5zaG91bGRUZXN0VGVsZWNvbTsKLQogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQudGVsZWNvbS5DYWxsQXVkaW9TdGF0ZTsKIGltcG9ydCBhbmRyb2lkLnRlbGVjb20uVGVsZWNvbU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuVGVsZXBob255TWFuYWdlcjsKIAogLyoqCiAgKiBWZXJpZmllcyB0aGUgYmVoYXZpb3Igb2YgVGVsZWNvbSBkdXJpbmcgdmFyaW91cyBvdXRnb2luZyBjYWxsIGZsb3dzLgpAQCAtOTQsNCArOTMsMTcgQEAKICAgICAgICAgfQogICAgICAgICBhc3NlcnROb3RBdWRpb1JvdXRlKG1JbkNhbGxDYWxsYmFja3MuZ2V0U2VydmljZSgpLCBDYWxsQXVkaW9TdGF0ZS5ST1VURV9TUEVBS0VSKTsKICAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmVTdGF0ZUxpc3RlbmVySW52b2tlZE9uT3V0Z29pbmdDYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghbVNob3VsZFRlc3RUZWxlY29tKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBwbGFjZUFuZFZlcmlmeUNhbGwoKTsKKyAgICAgICAgdmVyaWZ5Q29ubmVjdGlvbkZvck91dGdvaW5nQ2FsbCgpOworICAgICAgICBTdHJpbmcgZXhwZWN0ZWROdW1iZXIgPSBjb25uZWN0aW9uU2VydmljZS5vdXRnb2luZ0Nvbm5lY3Rpb25zLmdldCgwKQorICAgICAgICAgICAgICAgIC5nZXRBZGRyZXNzKCkuZ2V0U2NoZW1lU3BlY2lmaWNQYXJ0KCk7CisgICAgICAgIHZlcmlmeVBob25lU3RhdGVMaXN0ZW5lckNhbGxiYWNrc0ZvckNhbGwoVGVsZXBob255TWFuYWdlci5DQUxMX1NUQVRFX09GRkhPT0ssCisgICAgICAgICAgICAgICAgZXhwZWN0ZWROdW1iZXIpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RlbGVjb20vc3JjL2FuZHJvaWQvdGVsZWNvbS9jdHMvUGhvbmVBY2NvdW50T3BlcmF0aW9uc1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RlbGVjb20vc3JjL2FuZHJvaWQvdGVsZWNvbS9jdHMvUGhvbmVBY2NvdW50T3BlcmF0aW9uc1Rlc3QuamF2YQppbmRleCBjOWI1MDAwLi42ZDA4MGIyIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy90ZWxlY29tL3NyYy9hbmRyb2lkL3RlbGVjb20vY3RzL1Bob25lQWNjb3VudE9wZXJhdGlvbnNUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdGVsZWNvbS9zcmMvYW5kcm9pZC90ZWxlY29tL2N0cy9QaG9uZUFjY291bnRPcGVyYXRpb25zVGVzdC5qYXZhCkBAIC0xNzEsOCArMTcxLDExIEBACiAgICAgICAgICAgICBzZXRJc0VuYWJsZWQgPSBQaG9uZUFjY291bnQuQnVpbGRlci5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZCgKICAgICAgICAgICAgICAgICAgICAgInNldElzRW5hYmxlZCIsIGJvb2xlYW4uY2xhc3MpOwogICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRmFpbGVkIHRvIGZpbmQgc2V0SXNFbmFibGVkIG1ldGhvZC4iKTsKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGlkZWFsIGNhc2U7IGlkZWFsbHkgd2Ugc2hvdWxkIE5PVCBiZSBhYmxlIHRvIGV2ZW4gcmVmbGVjdCB0aGlzIG1ldGhvZAorICAgICAgICAgICAgLy8gc2luY2UgaXRzIGhpZGRlbi4KKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQorICAgICAgICAvLyBIb3dldmVyLCBpZiByZWZsZWN0aW9uIHNvbWVob3cgZmluZHMgdGhlIEBoaWRlIG1ldGhvZCwgd2UnbGwgdHJ5IGV4ZWN1dGluZyBpdC4KICAgICAgICAgc2V0SXNFbmFibGVkLmludm9rZShwaG9uZUFjY291bnRCdWlsZGVyLCB0cnVlKTsKICAgICAgICAgZmluYWwgUGhvbmVBY2NvdW50IHBob25lQWNjb3VudCAgPSBwaG9uZUFjY291bnRCdWlsZGVyLmJ1aWxkKCk7CiAgICAgICAgIG1UZWxlY29tTWFuYWdlci5yZWdpc3RlclBob25lQWNjb3VudChwaG9uZUFjY291bnQpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGVsZWNvbS9zcmMvYW5kcm9pZC90ZWxlY29tL2N0cy9SZW1vdGVDb25uZWN0aW9uVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdGVsZWNvbS9zcmMvYW5kcm9pZC90ZWxlY29tL2N0cy9SZW1vdGVDb25uZWN0aW9uVGVzdC5qYXZhCmluZGV4IDZmOTkyYjMuLjEyOTYwZjMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RlbGVjb20vc3JjL2FuZHJvaWQvdGVsZWNvbS9jdHMvUmVtb3RlQ29ubmVjdGlvblRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy90ZWxlY29tL3NyYy9hbmRyb2lkL3RlbGVjb20vY3RzL1JlbW90ZUNvbm5lY3Rpb25UZXN0LmphdmEKQEAgLTU1Myw3ICs1NTMsOCBAQAogICAgICAgICBtUmVtb3RlQ29ubmVjdGlvbi5zZXRFeHRyYXMoZXh0cmFzKTsKICAgICAgICAgY2FsbGJhY2tJbnZva2VyLndhaXRGb3JDb3VudCgxLCBXQUlUX0ZPUl9TVEFURV9DSEFOR0VfVElNRU9VVF9NUyk7CiAgICAgICAgIGFzc2VydEVxdWFscyhtUmVtb3RlQ29ubmVjdGlvbk9iamVjdCwgY2FsbGJhY2tJbnZva2VyLmdldEFyZ3MoMClbMF0pOwotICAgICAgICBhc3NlcnRUcnVlKGFyZUJ1bmRsZXNFcXVhbChleHRyYXMsIChCdW5kbGUpIGNhbGxiYWNrSW52b2tlci5nZXRBcmdzKDApWzFdKSk7CisgICAgICAgIEJ1bmRsZSBjaGFuZ2VkRXh0cmFzID0gKEJ1bmRsZSkgY2FsbGJhY2tJbnZva2VyLmdldEFyZ3MoMClbMV07CisgICAgICAgIGFzc2VydFRydWUoY2hhbmdlZEV4dHJhcy5jb250YWluc0tleShUZWxlY29tTWFuYWdlci5FWFRSQV9DQUxMX0RJU0NPTk5FQ1RfTUVTU0FHRSkpOwogICAgICAgICBtUmVtb3RlQ29ubmVjdGlvbk9iamVjdC51bnJlZ2lzdGVyQ2FsbGJhY2soY2FsbGJhY2spOwogICAgIH0KIApAQCAtMTE4Nyw3ICsxMTg4LDcgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbm5lY3Rpb24uZ2V0Q29ubmVjdGlvblByb3BlcnRpZXMoKSwKICAgICAgICAgICAgICAgICByZW1vdGVDb25uZWN0aW9uLmdldENvbm5lY3Rpb25Qcm9wZXJ0aWVzKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoY29ubmVjdGlvbi5nZXREaXNjb25uZWN0Q2F1c2UoKSwgcmVtb3RlQ29ubmVjdGlvbi5nZXREaXNjb25uZWN0Q2F1c2UoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjb25uZWN0aW9uLmdldEV4dHJhcygpLCByZW1vdGVDb25uZWN0aW9uLmdldEV4dHJhcygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShhcmVCdW5kbGVzRXF1YWwoY29ubmVjdGlvbi5nZXRFeHRyYXMoKSwgcmVtb3RlQ29ubmVjdGlvbi5nZXRFeHRyYXMoKSkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoY29ubmVjdGlvbi5nZXRTdGF0dXNIaW50cygpLCByZW1vdGVDb25uZWN0aW9uLmdldFN0YXR1c0hpbnRzKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoVmlkZW9Qcm9maWxlLlNUQVRFX0FVRElPX09OTFksIHJlbW90ZUNvbm5lY3Rpb24uZ2V0VmlkZW9TdGF0ZSgpKTsKICAgICAgICAgYXNzZXJ0TnVsbChyZW1vdGVDb25uZWN0aW9uLmdldFZpZGVvUHJvdmlkZXIoKSk7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZWxlY29tL3NyYy9hbmRyb2lkL3RlbGVjb20vY3RzL1J0dE9wZXJhdGlvbnNUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy90ZWxlY29tL3NyYy9hbmRyb2lkL3RlbGVjb20vY3RzL1J0dE9wZXJhdGlvbnNUZXN0LmphdmEKaW5kZXggOTkyY2JjYS4uZTQzNGViYSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdGVsZWNvbS9zcmMvYW5kcm9pZC90ZWxlY29tL2N0cy9SdHRPcGVyYXRpb25zVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3RlbGVjb20vc3JjL2FuZHJvaWQvdGVsZWNvbS9jdHMvUnR0T3BlcmF0aW9uc1Rlc3QuamF2YQpAQCAtMzQsMTEgKzM0LDIzIEBACiAgICAgfTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUlRUX0ZBSUxVUkVfUkVBU09OID0gMjsKIAorICAgIHByaXZhdGUgYm9vbGVhbiBtSW5pdGlhbFJ0dE1vZGU7CisKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBzdXBlci5zZXRVcCgpOwogICAgICAgICBpZiAobVNob3VsZFRlc3RUZWxlY29tKSB7CiAgICAgICAgICAgICBzZXR1cENvbm5lY3Rpb25TZXJ2aWNlKG51bGwsIEZMQUdfUkVHSVNURVIgfCBGTEFHX0VOQUJMRSk7CisgICAgICAgICAgICBtSW5pdGlhbFJ0dE1vZGUgPSBnZXRSdHRNYXN0ZXJTd2l0Y2goKTsKKyAgICAgICAgICAgIHNldFJ0dE1hc3RlclN3aXRjaChmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgICAgICBpZiAobVNob3VsZFRlc3RUZWxlY29tKSB7CisgICAgICAgICAgICBzZXRSdHRNYXN0ZXJTd2l0Y2gobUluaXRpYWxSdHRNb2RlKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNjAsNiArNzIsNyBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKKyAgICAgICAgc2V0UnR0TWFzdGVyU3dpdGNoKHRydWUpOwogICAgICAgICBwbGFjZVJ0dENhbGwodHJ1ZSk7CiAgICAgICAgIGZpbmFsIE1vY2tDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSB2ZXJpZnlDb25uZWN0aW9uRm9ySW5jb21pbmdDYWxsKCk7CiAgICAgICAgIGZpbmFsIE1vY2tJbkNhbGxTZXJ2aWNlIGluQ2FsbFNlcnZpY2UgPSBtSW5DYWxsQ2FsbGJhY2tzLmdldFNlcnZpY2UoKTsKQEAgLTg2LDcgKzk5LDcgQEAKIAogICAgICAgICBjb25uZWN0aW9uLnNldFJ0dFRleHRTdHJlYW0oKENvbm5lY3Rpb24uUnR0VGV4dFN0cmVhbSkgc3RhcnRSdHRDb3VudGVyLmdldEFyZ3MoMClbMF0pOwogICAgICAgICBjb25uZWN0aW9uLnNldENvbm5lY3Rpb25Qcm9wZXJ0aWVzKAotICAgICAgICAgICAgY29ubmVjdGlvbi5nZXRDb25uZWN0aW9uUHJvcGVydGllcygpIHwgQ29ubmVjdGlvbi5QUk9QRVJUWV9JU19SVFQpOworICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uZ2V0Q29ubmVjdGlvblByb3BlcnRpZXMoKSB8IENvbm5lY3Rpb24uUFJPUEVSVFlfSVNfUlRUKTsKICAgICAgICAgY29ubmVjdGlvbi5zZW5kUnR0SW5pdGlhdGlvblN1Y2Nlc3MoKTsKICAgICAgICAgVGVzdFV0aWxzLndhaXRPbkFsbEhhbmRsZXJzKGdldEluc3RydW1lbnRhdGlvbigpKTsKICAgICAgICAgdmVyaWZ5UnR0RW5hYmxlZChjYWxsLCBjb25uZWN0aW9uKTsKQEAgLTE3OSw3ICsxOTIsNyBAQAogICAgICAgICBjYWxsLnN0b3BSdHQoKTsKICAgICAgICAgc3RvcFJ0dENvdW50ZXIud2FpdEZvckNvdW50KDEsIFRlc3RVdGlscy5XQUlUX0ZPUl9TVEFURV9DSEFOR0VfVElNRU9VVF9NUyk7CiAgICAgICAgIGNvbm5lY3Rpb24uc2V0Q29ubmVjdGlvblByb3BlcnRpZXMoCi0gICAgICAgICAgICBjb25uZWN0aW9uLmdldENvbm5lY3Rpb25Qcm9wZXJ0aWVzKCkgJiB+Q29ubmVjdGlvbi5QUk9QRVJUWV9JU19SVFQpOworICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uZ2V0Q29ubmVjdGlvblByb3BlcnRpZXMoKSAmIH5Db25uZWN0aW9uLlBST1BFUlRZX0lTX1JUVCk7CiAgICAgICAgIFRlc3RVdGlscy53YWl0T25BbGxIYW5kbGVycyhnZXRJbnN0cnVtZW50YXRpb24oKSk7CiAgICAgICAgIHZlcmlmeVJ0dERpc2FibGVkKGNhbGwpOwogICAgIH0KQEAgLTIwMSw3ICsyMTQsNyBAQAogICAgICAgICBjYWxsLnN0b3BSdHQoKTsKICAgICAgICAgc3RvcFJ0dENvdW50ZXIud2FpdEZvckNvdW50KDEsIFRlc3RVdGlscy5XQUlUX0ZPUl9TVEFURV9DSEFOR0VfVElNRU9VVF9NUyk7CiAgICAgICAgIGNvbm5lY3Rpb24uc2V0Q29ubmVjdGlvblByb3BlcnRpZXMoCi0gICAgICAgICAgICBjb25uZWN0aW9uLmdldENvbm5lY3Rpb25Qcm9wZXJ0aWVzKCkgJiB+Q29ubmVjdGlvbi5QUk9QRVJUWV9JU19SVFQpOworICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uZ2V0Q29ubmVjdGlvblByb3BlcnRpZXMoKSAmIH5Db25uZWN0aW9uLlBST1BFUlRZX0lTX1JUVCk7CiAgICAgICAgIFRlc3RVdGlscy53YWl0T25BbGxIYW5kbGVycyhnZXRJbnN0cnVtZW50YXRpb24oKSk7CiAgICAgICAgIHZlcmlmeVJ0dERpc2FibGVkKGNhbGwpOwogICAgIH0KQEAgLTIyMSw2ICsyMzQsMjUgQEAKICAgICAgICAgYXNzZXJ0Tm90TnVsbChpbkNhbGxTaWRlUnR0KTsKIAogICAgICAgICB2ZXJpZnlSdHRQaXBlSW50ZWdyaXR5KGluQ2FsbFNpZGVSdHQsIGNvbm5lY3Rpb25TaWRlUnR0KTsKKyAgICAgICAgdmVyaWZ5UnR0UGlwZVJlYWRCbG9ja2luZyhjb25uZWN0aW9uU2lkZVJ0dCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeVJ0dFBpcGVSZWFkQmxvY2tpbmcoQ29ubmVjdGlvbi5SdHRUZXh0U3RyZWFtIGNvbm5lY3Rpb25TaWRlKSB7CisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IG5vdGhpbmcgZ2V0cyByZWFkIGZyb20gdGhlIHBpcGUKKyAgICAgICAgYm9vbGVhbltdIGZsYWcgPSBuZXcgYm9vbGVhblsxXTsKKyAgICAgICAgZmxhZ1swXSA9IGZhbHNlOworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQoKCkgLT4geworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb25uZWN0aW9uU2lkZS5yZWFkKCk7CisgICAgICAgICAgICAgICAgZmxhZ1swXSA9IHRydWU7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgc2xlZXAoNTAwKTsKKyAgICAgICAgdC5pbnRlcnJ1cHQoKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoZmxhZ1swXSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeVJ0dFBpcGVJbnRlZ3JpdHkoQ2FsbC5SdHRDYWxsIGluQ2FsbFNpZGUsIENvbm5lY3Rpb24uUnR0VGV4dFN0cmVhbQpAQCAtMjc5LDYgKzMxMSw3IEBACiAKICAgICAgICAgfQogICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCBwbGFjZVJ0dENhbGwoYm9vbGVhbiBpbmNvbWluZykgewogICAgICAgICBCdW5kbGUgZXh0cmFzID0gbmV3IEJ1bmRsZSgpOwogICAgICAgICBleHRyYXMucHV0Qm9vbGVhbihUZWxlY29tTWFuYWdlci5FWFRSQV9TVEFSVF9DQUxMX1dJVEhfUlRULCB0cnVlKTsKQEAgLTI5MCw0ICszMjMsMTkgQEAKICAgICAgICAgICAgIHBsYWNlQW5kVmVyaWZ5Q2FsbChvdXRnb2luZ0NhbGxFeHRyYXMpOwogICAgICAgICB9CiAgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldFJ0dE1hc3RlclN3aXRjaChib29sZWFuIG9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgVGVzdFV0aWxzLmV4ZWN1dGVTaGVsbENvbW1hbmQoZ2V0SW5zdHJ1bWVudGF0aW9uKCksCisgICAgICAgICAgICAgICAgInNldHRpbmdzIHB1dCBzeXN0ZW0gc2VjdXJlIHJ0dF9jYWxsaW5nX21vZGUgIiArIChvbiA/IDEgOiAwKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGdldFJ0dE1hc3RlclN3aXRjaCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIEludGVnZXIudmFsdWVPZihUZXN0VXRpbHMuZXhlY3V0ZVNoZWxsQ29tbWFuZCgKKyAgICAgICAgICAgICAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCksICJzZXR0aW5ncyBnZXQgc2VjdXJlIHJ0dF9jYWxsaW5nX21vZGUiKSkgPT0gMTsKKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIElmIHRoZSBzZXR0aW5nIGhhc24ndCBiZWVuIHNldCB5ZXQsIGFzc3VtZSBpdCdzIG9mZgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGVsZWNvbS9zcmMvYW5kcm9pZC90ZWxlY29tL2N0cy9TZWxmTWFuYWdlZENvbm5lY3Rpb24uamF2YSBiL3Rlc3RzL3Rlc3RzL3RlbGVjb20vc3JjL2FuZHJvaWQvdGVsZWNvbS9jdHMvU2VsZk1hbmFnZWRDb25uZWN0aW9uLmphdmEKaW5kZXggZjlhM2Q5MS4uZTUzZDc4OSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdGVsZWNvbS9zcmMvYW5kcm9pZC90ZWxlY29tL2N0cy9TZWxmTWFuYWdlZENvbm5lY3Rpb24uamF2YQorKysgYi90ZXN0cy90ZXN0cy90ZWxlY29tL3NyYy9hbmRyb2lkL3RlbGVjb20vY3RzL1NlbGZNYW5hZ2VkQ29ubmVjdGlvbi5qYXZhCkBAIC0xNiw2ICsxNiw3IEBACiAKIHBhY2thZ2UgYW5kcm9pZC50ZWxlY29tLmN0czsKIAoraW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQudGVsZWNvbS5DYWxsQXVkaW9TdGF0ZTsKIGltcG9ydCBhbmRyb2lkLnRlbGVjb20uQ29ubmVjdGlvbjsKIGltcG9ydCBhbmRyb2lkLnRlbGVjb20uRGlzY29ubmVjdENhdXNlOwpAQCAtMzEsNiArMzIsOCBAQAogICAgIEludm9rZUNvdW50ZXIgbUNhbGxBdWRpb1JvdXRlSW52b2tlQ291bnRlciA9IG5ldyBJbnZva2VDb3VudGVyKCJvbkNhbGxBdWRpb1N0YXRlQ2hhbmdlZCIpOwogICAgIEludm9rZUNvdW50ZXIgbU9uU2hvd0luY29taW5nVWlJbnZva2VDb3VudGVyID0gbmV3IEludm9rZUNvdW50ZXIoCiAgICAgICAgICAgICAib25TaG93SW5jb21pbmdVaUludm9rZUNvdW50ZXIiKTsKKyAgICBJbnZva2VDb3VudGVyIG1DYWxsRXZlbnRDb3VudGVyID0gbmV3IEludm9rZUNvdW50ZXIoIm9uQ2FsbEV2ZW50Iik7CisgICAgSW52b2tlQ291bnRlciBtSGFuZG92ZXJDb21wbGV0ZUNvdW50ZXIgPSBuZXcgSW52b2tlQ291bnRlcigiaGFuZG92ZXJDb21wbGV0ZUNvdW50ZXIiKTsKICAgICBDb3VudERvd25MYXRjaCBtT25Ib2xkTGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CiAKICAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIExpc3RlbmVyIHsKQEAgLTcwLDYgKzczLDE2IEBACiAgICAgICAgIG1PbkhvbGRMYXRjaC5jb3VudERvd24oKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNhbGxFdmVudChTdHJpbmcgZXZlbnQsIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgbUNhbGxFdmVudENvdW50ZXIuaW52b2tlKGV2ZW50LCBleHRyYXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uSGFuZG92ZXJDb21wbGV0ZSgpIHsKKyAgICAgICAgbUhhbmRvdmVyQ29tcGxldGVDb3VudGVyLmludm9rZSgpOworICAgIH0KKwogICAgIHB1YmxpYyBJbnZva2VDb3VudGVyIGdldENhbGxBdWRpb1N0YXRlQ2hhbmdlZEludm9rZUNvdW50ZXIoKSB7CiAgICAgICAgIHJldHVybiBtQ2FsbEF1ZGlvUm91dGVJbnZva2VDb3VudGVyOwogICAgIH0KQEAgLTc4LDYgKzkxLDE0IEBACiAgICAgICAgIHJldHVybiBtT25TaG93SW5jb21pbmdVaUludm9rZUNvdW50ZXI7CiAgICAgfQogCisgICAgcHVibGljIEludm9rZUNvdW50ZXIgZ2V0Q2FsbEV2ZW50Q291bnRlcigpIHsKKyAgICAgICAgcmV0dXJuIG1DYWxsRXZlbnRDb3VudGVyOworICAgIH0KKworICAgIHB1YmxpYyBJbnZva2VDb3VudGVyIGdldEhhbmRvdmVyQ29tcGxldGVDb3VudGVyKCkgeworICAgICAgICByZXR1cm4gbUhhbmRvdmVyQ29tcGxldGVDb3VudGVyOworICAgIH0KKwogICAgIHB1YmxpYyBib29sZWFuIHdhaXRPbkhvbGQoKSB7CiAgICAgICAgIG1PbkhvbGRMYXRjaCA9IFRlc3RVdGlscy53YWl0Rm9yTG9jayhtT25Ib2xkTGF0Y2gpOwogICAgICAgICByZXR1cm4gbU9uSG9sZExhdGNoICE9IG51bGw7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZWxlY29tL3NyYy9hbmRyb2lkL3RlbGVjb20vY3RzL1NlbGZNYW5hZ2VkQ29ubmVjdGlvblNlcnZpY2VUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy90ZWxlY29tL3NyYy9hbmRyb2lkL3RlbGVjb20vY3RzL1NlbGZNYW5hZ2VkQ29ubmVjdGlvblNlcnZpY2VUZXN0LmphdmEKaW5kZXggNDFiZjk4Ni4uNTEyN2RmNCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdGVsZWNvbS9zcmMvYW5kcm9pZC90ZWxlY29tL2N0cy9TZWxmTWFuYWdlZENvbm5lY3Rpb25TZXJ2aWNlVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3RlbGVjb20vc3JjL2FuZHJvaWQvdGVsZWNvbS9jdHMvU2VsZk1hbmFnZWRDb25uZWN0aW9uU2VydmljZVRlc3QuamF2YQpAQCAtMTgsMTAgKzE4LDE0IEBACiAKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC50ZWxlY29tLkNhbGw7CiBpbXBvcnQgYW5kcm9pZC50ZWxlY29tLkNhbGxBdWRpb1N0YXRlOworaW1wb3J0IGFuZHJvaWQudGVsZWNvbS5Db25uZWN0aW9uOworaW1wb3J0IGFuZHJvaWQudGVsZWNvbS5Db25uZWN0aW9uU2VydmljZTsKIGltcG9ydCBhbmRyb2lkLnRlbGVjb20uUGhvbmVBY2NvdW50OwogaW1wb3J0IGFuZHJvaWQudGVsZWNvbS5QaG9uZUFjY291bnRIYW5kbGU7CiBpbXBvcnQgYW5kcm9pZC50ZWxlY29tLlRlbGVjb21NYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudGVsZWNvbS5WaWRlb1Byb2ZpbGU7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwpAQCAtMzgsNyArNDIsOSBAQAogCiBwdWJsaWMgY2xhc3MgU2VsZk1hbmFnZWRDb25uZWN0aW9uU2VydmljZVRlc3QgZXh0ZW5kcyBCYXNlVGVsZWNvbVRlc3RXaXRoTW9ja1NlcnZpY2VzIHsKICAgICBwcml2YXRlIFVyaSBURVNUX0FERFJFU1NfMSA9IFVyaS5mcm9tUGFydHMoInNpcCIsICJjYWxsMUB0ZXN0LmNvbSIsIG51bGwpOwotICAgIHByaXZhdGUgVXJpIFRFU1RfQUREUkVTU18yID0gVXJpLmZyb21QYXJ0cygic2lwIiwgImNhbGwyQHRlc3QuY29tIiwgbnVsbCk7CisgICAgcHJpdmF0ZSBVcmkgVEVTVF9BRERSRVNTXzIgPSBVcmkuZnJvbVBhcnRzKCJ0ZWwiLCAiNjUwNTU1MTIxMiIsIG51bGwpOworICAgIHByaXZhdGUgVXJpIFRFU1RfQUREUkVTU18zID0gVXJpLmZyb21QYXJ0cygidGVsIiwgIjY1MDU1NTEyMTMiLCBudWxsKTsKKyAgICBwcml2YXRlIFVyaSBURVNUX0FERFJFU1NfNCA9IFVyaS5mcm9tUGFydHMoVGVzdFV0aWxzLlRFU1RfVVJJX1NDSEVNRSwgImZpenpsZV9zY2htb3psZSIsIG51bGwpOwogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTUxLDggKzU3LDggQEAKIAogICAgICAgICAgICAgbVRlbGVjb21NYW5hZ2VyLnJlZ2lzdGVyUGhvbmVBY2NvdW50KFRlc3RVdGlscy5URVNUX1NFTEZfTUFOQUdFRF9QSE9ORV9BQ0NPVU5UXzEpOwogICAgICAgICAgICAgbVRlbGVjb21NYW5hZ2VyLnJlZ2lzdGVyUGhvbmVBY2NvdW50KFRlc3RVdGlscy5URVNUX1NFTEZfTUFOQUdFRF9QSE9ORV9BQ0NPVU5UXzIpOworICAgICAgICAgICAgbVRlbGVjb21NYW5hZ2VyLnJlZ2lzdGVyUGhvbmVBY2NvdW50KFRlc3RVdGlscy5URVNUX1NFTEZfTUFOQUdFRF9QSE9ORV9BQ0NPVU5UXzMpOwogICAgICAgICB9Ci0KICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTY1LDYgKzcxLDcgQEAKICAgICAgICAgICAgIGNvbm5lY3Rpb25TZXJ2aWNlLnRlYXJEb3duKCk7CiAgICAgICAgICAgICBtVGVsZWNvbU1hbmFnZXIudW5yZWdpc3RlclBob25lQWNjb3VudChUZXN0VXRpbHMuVEVTVF9TRUxGX01BTkFHRURfSEFORExFXzEpOwogICAgICAgICAgICAgbVRlbGVjb21NYW5hZ2VyLnVucmVnaXN0ZXJQaG9uZUFjY291bnQoVGVzdFV0aWxzLlRFU1RfU0VMRl9NQU5BR0VEX0hBTkRMRV8yKTsKKyAgICAgICAgICAgIG1UZWxlY29tTWFuYWdlci51bnJlZ2lzdGVyUGhvbmVBY2NvdW50KFRlc3RVdGlscy5URVNUX1NFTEZfTUFOQUdFRF9IQU5ETEVfMyk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTgyLDMyICs4OSw0MyBAQAogCiAgICAgICAgIGFzc2VydFRydWUocGhvbmVBY2NvdW50SGFuZGxlcy5jb250YWlucyhUZXN0VXRpbHMuVEVTVF9TRUxGX01BTkFHRURfSEFORExFXzEpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShwaG9uZUFjY291bnRIYW5kbGVzLmNvbnRhaW5zKFRlc3RVdGlscy5URVNUX1NFTEZfTUFOQUdFRF9IQU5ETEVfMikpOworICAgICAgICBhc3NlcnRUcnVlKHBob25lQWNjb3VudEhhbmRsZXMuY29udGFpbnMoVGVzdFV0aWxzLlRFU1RfU0VMRl9NQU5BR0VEX0hBTkRMRV8zKSk7CiAgICAgICAgIGFzc2VydEZhbHNlKHBob25lQWNjb3VudEhhbmRsZXMuY29udGFpbnMoVGVzdFV0aWxzLlRFU1RfUEhPTkVfQUNDT1VOVF9IQU5ETEUpKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBUZXN0cyB0aGUgYWJpbGl0eSB0byBzdWNjZXNzZnVsbHkgcmVnaXN0ZXIgYSBzZWxmLW1hbmFnZWQKICAgICAgKiB7QGxpbmsgYW5kcm9pZC50ZWxlY29tLlBob25lQWNjb3VudH0uCisgICAgICogPHA+CisgICAgICogSXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIHJlZ2lzdGVyIHNlbGYtbWFuYWdlZCBDb25uZWN0aW9uIFNlcnZpY2VzIHdoaWNoIHN1cHBvciB0aGUgVEVMLCBTSVAsCisgICAgICogb3Igb3RoZXIgVVJJIHNjaGVtZXMuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdGVzdFJlZ2lzdGVyU2VsZk1hbmFnZWRDb25uZWN0aW9uU2VydmljZSgpIHsKICAgICAgICAgaWYgKCFtU2hvdWxkVGVzdFRlbGVjb20pIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQorICAgICAgICB2ZXJpZnlBY2NvdW50UmVnaXN0cmF0aW9uKFRlc3RVdGlscy5URVNUX1NFTEZfTUFOQUdFRF9IQU5ETEVfMSwKKyAgICAgICAgICAgICAgICBUZXN0VXRpbHMuVEVTVF9TRUxGX01BTkFHRURfUEhPTkVfQUNDT1VOVF8xKTsKKyAgICAgICAgdmVyaWZ5QWNjb3VudFJlZ2lzdHJhdGlvbihUZXN0VXRpbHMuVEVTVF9TRUxGX01BTkFHRURfSEFORExFXzIsCisgICAgICAgICAgICAgICAgVGVzdFV0aWxzLlRFU1RfU0VMRl9NQU5BR0VEX1BIT05FX0FDQ09VTlRfMik7CisgICAgICAgIHZlcmlmeUFjY291bnRSZWdpc3RyYXRpb24oVGVzdFV0aWxzLlRFU1RfU0VMRl9NQU5BR0VEX0hBTkRMRV8zLAorICAgICAgICAgICAgICAgIFRlc3RVdGlscy5URVNUX1NFTEZfTUFOQUdFRF9QSE9ORV9BQ0NPVU5UXzMpOworICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlBY2NvdW50UmVnaXN0cmF0aW9uKFBob25lQWNjb3VudEhhbmRsZSBoYW5kbGUsIFBob25lQWNjb3VudCBwaG9uZUFjY291bnQpIHsKICAgICAgICAgLy8gVGhlIHBob25lIGFjY291bnQgaXMgcmVnaXN0ZXJlZCBpbiB0aGUgc2V0dXAgbWV0aG9kLgotICAgICAgICBhc3NlcnRQaG9uZUFjY291bnRSZWdpc3RlcmVkKFRlc3RVdGlscy5URVNUX1NFTEZfTUFOQUdFRF9IQU5ETEVfMSk7Ci0gICAgICAgIGFzc2VydFBob25lQWNjb3VudEVuYWJsZWQoVGVzdFV0aWxzLlRFU1RfU0VMRl9NQU5BR0VEX0hBTkRMRV8xKTsKLSAgICAgICAgUGhvbmVBY2NvdW50IHJlZ2lzdGVyZWRBY2NvdW50ID0gbVRlbGVjb21NYW5hZ2VyLmdldFBob25lQWNjb3VudCgKLSAgICAgICAgICAgICAgICBUZXN0VXRpbHMuVEVTVF9TRUxGX01BTkFHRURfSEFORExFXzEpOworICAgICAgICBhc3NlcnRQaG9uZUFjY291bnRSZWdpc3RlcmVkKGhhbmRsZSk7CisgICAgICAgIGFzc2VydFBob25lQWNjb3VudEVuYWJsZWQoaGFuZGxlKTsKKyAgICAgICAgUGhvbmVBY2NvdW50IHJlZ2lzdGVyZWRBY2NvdW50ID0gbVRlbGVjb21NYW5hZ2VyLmdldFBob25lQWNjb3VudChoYW5kbGUpOwogCiAgICAgICAgIC8vIEl0IHNob3VsZCBleGlzdCBhbmQgYmUgdGhlIHNhbWUgYXMgdGhlIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBvbmUuCiAgICAgICAgIGFzc2VydE5vdE51bGwocmVnaXN0ZXJlZEFjY291bnQpOwogCiAgICAgICAgIC8vIFdlIGNhbm5vdCBqdXN0IGNoZWNrIGZvciBlcXVhbGl0eSBvZiB0aGUgUGhvbmVBY2NvdW50IHNpbmNlIHRoZSBvbmUgd2UgcmVnaXN0ZXJlZCBpcyBub3QKICAgICAgICAgLy8gZW5hYmxlZCwgYW5kIHRoZSBvbmUgd2UgZ2V0IGJhY2sgYWZ0ZXIgcmVnaXN0cmF0aW9uIGlzLgotICAgICAgICBhc3NlcnRQaG9uZUFjY291bnRFcXVhbHMoVGVzdFV0aWxzLlRFU1RfU0VMRl9NQU5BR0VEX1BIT05FX0FDQ09VTlRfMSwgcmVnaXN0ZXJlZEFjY291bnQpOworICAgICAgICBhc3NlcnRQaG9uZUFjY291bnRFcXVhbHMocGhvbmVBY2NvdW50LCByZWdpc3RlcmVkQWNjb3VudCk7CiAKLSAgICAgICAgLy8gQW4gaW1wb3J0YW50IGFzdW1wdGlvbiBpcyB0aGF0IHNlbGYtbWFuYWdlZCBQaG9uZUFjY291bnRzIGFyZSBhdXRvbWF0aWNhbGx5CisgICAgICAgIC8vIEFuIGltcG9ydGFudCBhc3N1bXB0aW9uIGlzIHRoYXQgc2VsZi1tYW5hZ2VkIFBob25lQWNjb3VudHMgYXJlIGF1dG9tYXRpY2FsbHkKICAgICAgICAgLy8gZW5hYmxlZCBieSBkZWZhdWx0LgogICAgICAgICBhc3NlcnRUcnVlKCJTZWxmLW1hbmFnZWQgUGhvbmVBY2NvdW50cyBtdXN0IGJlIGVuYWJsZWQgYnkgZGVmYXVsdC4iLAogICAgICAgICAgICAgICAgIHJlZ2lzdGVyZWRBY2NvdW50LmlzRW5hYmxlZCgpKTsKQEAgLTE5OCwxNSArMjE2LDIxIEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICBUZXN0VXRpbHMuYWRkSW5jb21pbmdDYWxsKGdldEluc3RydW1lbnRhdGlvbigpLCBtVGVsZWNvbU1hbmFnZXIsCi0gICAgICAgICAgICAgICAgVGVzdFV0aWxzLlRFU1RfU0VMRl9NQU5BR0VEX0hBTkRMRV8xLCBURVNUX0FERFJFU1NfMSk7CisgICAgICAgIGFkZEFuZFZlcmlmeUluY29taW5nQ2FsbChUZXN0VXRpbHMuVEVTVF9TRUxGX01BTkFHRURfSEFORExFXzEsIFRFU1RfQUREUkVTU18xKTsKKyAgICAgICAgYWRkQW5kVmVyaWZ5SW5jb21pbmdDYWxsKFRlc3RVdGlscy5URVNUX1NFTEZfTUFOQUdFRF9IQU5ETEVfMiwgVEVTVF9BRERSRVNTXzMpOworICAgICAgICBhZGRBbmRWZXJpZnlJbmNvbWluZ0NhbGwoVGVzdFV0aWxzLlRFU1RfU0VMRl9NQU5BR0VEX0hBTkRMRV8zLCBURVNUX0FERFJFU1NfNCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFkZEFuZFZlcmlmeUluY29taW5nQ2FsbChQaG9uZUFjY291bnRIYW5kbGUgaGFuZGxlLCBVcmkgYWRkcmVzcykKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBUZXN0VXRpbHMuYWRkSW5jb21pbmdDYWxsKGdldEluc3RydW1lbnRhdGlvbigpLCBtVGVsZWNvbU1hbmFnZXIsIGhhbmRsZSwgYWRkcmVzcyk7CiAKICAgICAgICAgLy8gRW5zdXJlIFRlbGVjb20gYm91bmQgdG8gdGhlIHNlbGYgbWFuYWdlZCBDUwogICAgICAgICBpZiAoIUN0c1NlbGZNYW5hZ2VkQ29ubmVjdGlvblNlcnZpY2Uud2FpdEZvckJpbmRpbmcoKSkgewogICAgICAgICAgICAgZmFpbCgiQ291bGQgbm90IGJpbmQgdG8gU2VsZi1NYW5hZ2VkIENvbm5lY3Rpb25TZXJ2aWNlIik7CiAgICAgICAgIH0KIAotICAgICAgICBTZWxmTWFuYWdlZENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IFRlc3RVdGlscy53YWl0Rm9yQW5kR2V0Q29ubmVjdGlvbihURVNUX0FERFJFU1NfMSk7CisgICAgICAgIFNlbGZNYW5hZ2VkQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gVGVzdFV0aWxzLndhaXRGb3JBbmRHZXRDb25uZWN0aW9uKGFkZHJlc3MpOwogCiAgICAgICAgIC8vIEV4cGVjdCBjYWxsYmFjayBpbmRpY2F0aW5nIHRoYXQgVUkgc2hvdWxkIGJlIHNob3duLgogICAgICAgICBjb25uZWN0aW9uLmdldE9uU2hvd0luY29taW5nVWlJbnZva2VDb3VudGVyKCkud2FpdEZvckNvdW50KDEpOwpAQCAtMjE0LDM0ICsyMzgsODEgQEAKIAogICAgICAgICAvLyBFeHBlY3QgdGhlcmUgdG8gYmUgbm8gbWFuYWdlZCBjYWxscyBhdCB0aGUgbW9tZW50LgogICAgICAgICBhc3NlcnRGYWxzZShtVGVsZWNvbU1hbmFnZXIuaXNJbk1hbmFnZWRDYWxsKCkpOworICAgICAgICBhc3NlcnRUcnVlKG1UZWxlY29tTWFuYWdlci5pc0luQ2FsbCgpKTsKIAogICAgICAgICBzZXREaXNjb25uZWN0ZWRBbmRWZXJpZnkoY29ubmVjdGlvbik7CiAgICAgfQogCiAgICAgLyoqCisgICAgICogVGVzdHMgZW5zdXJlcyB0aGF0IFRlbGVjb20gZGlzYWxsb3cgdG8gcGxhY2Ugb3V0Z29pbmcgc2VsZi1tYW5hZ2VkIGNhbGwgd2hlbiB0aGUgb25nb2luZworICAgICAqIG1hbmFnZWQgY2FsbCBjYW4gbm90IGJlIGhlbGQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdERpc2FsbG93T3V0Z29pbmdDYWxsV2hpbGVPbmdvaW5nTWFuYWdlZENhbGxDYW5Ob3RCZUhlbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFtU2hvdWxkVGVzdFRlbGVjb20pIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEdJVkVOIGFuIG9uZ29pbmcgbWFuYWdlZCBjYWxsIHRoYXQgY2FuIG5vdCBiZSBoZWxkCisgICAgICAgIGFkZEFuZFZlcmlmeU5ld0luY29taW5nQ2FsbChjcmVhdGVUZXN0TnVtYmVyKCksIG51bGwpOworICAgICAgICBDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSB2ZXJpZnlDb25uZWN0aW9uRm9ySW5jb21pbmdDYWxsKCk7CisgICAgICAgIGludCBjYXBhYmlsaXRpZXMgPSBjb25uZWN0aW9uLmdldENvbm5lY3Rpb25DYXBhYmlsaXRpZXMoKTsKKyAgICAgICAgY2FwYWJpbGl0aWVzICY9IH5Db25uZWN0aW9uLkNBUEFCSUxJVFlfSE9MRDsKKyAgICAgICAgY29ubmVjdGlvbi5zZXRDb25uZWN0aW9uQ2FwYWJpbGl0aWVzKGNhcGFiaWxpdGllcyk7CisKKyAgICAgICAgLy8gYW5zd2VyIHRoZSBpbmNvbWluZyBjYWxsCisgICAgICAgIE1vY2tJbkNhbGxTZXJ2aWNlIGluQ2FsbFNlcnZpY2UgPSBtSW5DYWxsQ2FsbGJhY2tzLmdldFNlcnZpY2UoKTsKKyAgICAgICAgQ2FsbCBjYWxsID0gaW5DYWxsU2VydmljZS5nZXRMYXN0Q2FsbCgpOworICAgICAgICBjYWxsLmFuc3dlcihWaWRlb1Byb2ZpbGUuU1RBVEVfQVVESU9fT05MWSk7CisgICAgICAgIGFzc2VydENvbm5lY3Rpb25TdGF0ZShjb25uZWN0aW9uLCBDb25uZWN0aW9uLlNUQVRFX0FDVElWRSk7CisKKyAgICAgICAgLy8gV0hFTiBwbGFjZSBhIHNlbGYtbWFuYWdlZCBvdXRnb2luZyBjYWxsCisgICAgICAgIFRlc3RVdGlscy5wbGFjZU91dGdvaW5nQ2FsbChnZXRJbnN0cnVtZW50YXRpb24oKSwgbVRlbGVjb21NYW5hZ2VyLAorICAgICAgICAgICAgICAgIFRlc3RVdGlscy5URVNUX1NFTEZfTUFOQUdFRF9IQU5ETEVfMSwgVEVTVF9BRERSRVNTXzEpOworCisgICAgICAgIC8vIFRIRU4gdGhlIG5ldyBvdXRnb2luZyBjYWxsIGlzIGZhaWxlZC4KKyAgICAgICAgQ3RzU2VsZk1hbmFnZWRDb25uZWN0aW9uU2VydmljZS53YWl0Rm9yQmluZGluZygpOworICAgICAgICBhc3NlcnRUcnVlKEN0c1NlbGZNYW5hZ2VkQ29ubmVjdGlvblNlcnZpY2UuZ2V0Q29ubmVjdGlvblNlcnZpY2UoKS53YWl0Rm9yVXBkYXRlKAorICAgICAgICAgICAgICAgIEN0c1NlbGZNYW5hZ2VkQ29ubmVjdGlvblNlcnZpY2UuQ1JFQVRFX09VVEdPSU5HX0NPTk5FQ1RJT05fRkFJTEVEX0xPQ0spKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBUZXN0cyBhYmlsaXR5IHRvIGFkZCBhIG5ldyBzZWxmLW1hbmFnZWQgb3V0Z29pbmcgY29ubmVjdGlvbi4KKyAgICAgKiA8cD4KKyAgICAgKiBBIHNlbGYtbWFuYWdlZCB7QGxpbmsgQ29ubmVjdGlvblNlcnZpY2V9IHNoYWxsIGJlIGFibGUgdG8gcGxhY2UgYW4gb3V0Z29pbmcgY2FsbCB0byB0ZWwgb3IKKyAgICAgKiBzaXAge0BsaW5rIFVyaX1zIHdpdGhvdXQgYmVpbmcgaW50ZXJydXB0ZWQgYnkgc3lzdGVtIFVYIG9yIG90aGVyIFRlbGVwaG9ueS1yZWxhdGVkIGxvZ2ljLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRTZWxmTWFuYWdlZE91dGdvaW5nQ29ubmVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBpZiAoIW1TaG91bGRUZXN0VGVsZWNvbSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIFRlc3RVdGlscy5wbGFjZU91dGdvaW5nQ2FsbChnZXRJbnN0cnVtZW50YXRpb24oKSwgbVRlbGVjb21NYW5hZ2VyLAotICAgICAgICAgICAgICAgIFRlc3RVdGlscy5URVNUX1NFTEZfTUFOQUdFRF9IQU5ETEVfMSwgVEVTVF9BRERSRVNTXzEpOworICAgICAgICBwbGFjZUFuZFZlcmlmeU91dGdvaW5nQ2FsbChUZXN0VXRpbHMuVEVTVF9TRUxGX01BTkFHRURfSEFORExFXzEsIFRFU1RfQUREUkVTU18xKTsKKyAgICAgICAgcGxhY2VBbmRWZXJpZnlPdXRnb2luZ0NhbGwoVGVzdFV0aWxzLlRFU1RfU0VMRl9NQU5BR0VEX0hBTkRMRV8yLCBURVNUX0FERFJFU1NfMyk7CisgICAgICAgIHBsYWNlQW5kVmVyaWZ5T3V0Z29pbmdDYWxsKFRlc3RVdGlscy5URVNUX1NFTEZfTUFOQUdFRF9IQU5ETEVfMywgVEVTVF9BRERSRVNTXzQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwbGFjZUFuZFZlcmlmeU91dGdvaW5nQ2FsbChQaG9uZUFjY291bnRIYW5kbGUgaGFuZGxlLCBVcmkgYWRkcmVzcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgVGVzdFV0aWxzLnBsYWNlT3V0Z29pbmdDYWxsKGdldEluc3RydW1lbnRhdGlvbigpLCBtVGVsZWNvbU1hbmFnZXIsIGhhbmRsZSwgYWRkcmVzcyk7CiAKICAgICAgICAgLy8gRW5zdXJlIFRlbGVjb20gYm91bmQgdG8gdGhlIHNlbGYgbWFuYWdlZCBDUwogICAgICAgICBpZiAoIUN0c1NlbGZNYW5hZ2VkQ29ubmVjdGlvblNlcnZpY2Uud2FpdEZvckJpbmRpbmcoKSkgewogICAgICAgICAgICAgZmFpbCgiQ291bGQgbm90IGJpbmQgdG8gU2VsZi1NYW5hZ2VkIENvbm5lY3Rpb25TZXJ2aWNlIik7CiAgICAgICAgIH0KIAotICAgICAgICBTZWxmTWFuYWdlZENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IFRlc3RVdGlscy53YWl0Rm9yQW5kR2V0Q29ubmVjdGlvbihURVNUX0FERFJFU1NfMSk7Ci0gICAgICAgIGFzc2VydCghY29ubmVjdGlvbi5pc0luY29taW5nQ2FsbCgpKTsKKyAgICAgICAgU2VsZk1hbmFnZWRDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSBUZXN0VXRpbHMud2FpdEZvckFuZEdldENvbm5lY3Rpb24oYWRkcmVzcyk7CisgICAgICAgIGFzc2VydE5vdE51bGwoIlNlbGYtTWFuYWdlZCBDb25uZWN0aW9uIHNob3VsZCBOT1QgYmUgbnVsbC4iLCBjb25uZWN0aW9uKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiU2VsZi1NYW5hZ2VkIENvbm5lY3Rpb24gc2hvdWxkIGJlIG91dGdvaW5nLiIsICFjb25uZWN0aW9uLmlzSW5jb21pbmdDYWxsKCkpOwogCisgICAgICAgIC8vIFRoZSBzZWxmLW1hbmFnZWQgQ29ubmVjdGlvblNlcnZpY2UgbXVzdCBOT1QgaGF2ZSBiZWVuIHByb21wdGVkIHRvIHNob3cgaXRzIGluY29taW5nIGNhbGwKKyAgICAgICAgLy8gVUkgZm9yIGFuIG91dGdvaW5nIGNhbGwuCiAgICAgICAgIGFzc2VydEVxdWFscyhjb25uZWN0aW9uLmdldE9uU2hvd0luY29taW5nVWlJbnZva2VDb3VudGVyKCkuZ2V0SW52b2tlQ291bnQoKSwgMCk7CiAKICAgICAgICAgc2V0QWN0aXZlQW5kVmVyaWZ5KGNvbm5lY3Rpb24pOwogCiAgICAgICAgIC8vIEV4cGVjdCB0aGVyZSB0byBiZSBubyBtYW5hZ2VkIGNhbGxzIGF0IHRoZSBtb21lbnQuCiAgICAgICAgIGFzc2VydEZhbHNlKG1UZWxlY29tTWFuYWdlci5pc0luTWFuYWdlZENhbGwoKSk7CisgICAgICAgIC8vIEJ1dCB0aGVyZSBzaG91bGQgYmUgYSBjYWxsIChpbmNsdWRpbmcgc2VsZi1tYW5hZ2VkKS4KKyAgICAgICAgYXNzZXJ0VHJ1ZShtVGVsZWNvbU1hbmFnZXIuaXNJbkNhbGwoKSk7CiAKICAgICAgICAgc2V0RGlzY29ubmVjdGVkQW5kVmVyaWZ5KGNvbm5lY3Rpb24pOwogICAgIH0KQEAgLTI3Niw2ICszNDcsNyBAQAogICAgICAgICAgICAgICAgID8gQ2FsbEF1ZGlvU3RhdGUuUk9VVEVfV0lSRURfSEVBRFNFVAogICAgICAgICAgICAgICAgIDogQ2FsbEF1ZGlvU3RhdGUuUk9VVEVfRUFSUElFQ0U7CiAKKyAgICAgICAgY291bnRlci5jbGVhckFyZ3MoKTsKICAgICAgICAgY29ubmVjdGlvbi5zZXRBdWRpb1JvdXRlKENhbGxBdWRpb1N0YXRlLlJPVVRFX1NQRUFLRVIpOwogICAgICAgICBjb3VudGVyLndhaXRGb3JQcmVkaWNhdGUobmV3IFByZWRpY2F0ZTxDYWxsQXVkaW9TdGF0ZT4oKSB7CiAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCkBAIC0yODQsNiArMzU2LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9LCBXQUlUX0ZPUl9TVEFURV9DSEFOR0VfVElNRU9VVF9NUyk7CiAKKyAgICAgICAgY291bnRlci5jbGVhckFyZ3MoKTsKICAgICAgICAgY29ubmVjdGlvbi5zZXRBdWRpb1JvdXRlKHNlY29uZFJvdXRlKTsKICAgICAgICAgY291bnRlci53YWl0Rm9yUHJlZGljYXRlKG5ldyBQcmVkaWNhdGU8Q2FsbEF1ZGlvU3RhdGU+KCkgewogICAgICAgICAgICAgQE92ZXJyaWRlCkBAIC0yOTEsMTYgKzM2NCwxOSBAQAogICAgICAgICAgICAgICAgIHJldHVybiBjYXMuZ2V0Um91dGUoKSA9PSBzZWNvbmRSb3V0ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSwgV0FJVF9GT1JfU1RBVEVfQ0hBTkdFX1RJTUVPVVRfTVMpOwotCisgICAgICAgIGlmIChUZXN0VXRpbHMuSEFTX0JMVUVUT09USCkgeworICAgICAgICAgICAgLy8gQ2FsbCByZXF1ZXN0Qmx1ZXRvb3RoQXVkaW8gb24gYSBkdW1teSBkZXZpY2UuIFRoaXMgd2lsbCBiZSBhIG5vb3Agc2luY2Ugbm8gZGV2aWNlcyBhcmUKKyAgICAgICAgICAgIC8vIGNvbm5lY3RlZC4KKyAgICAgICAgICAgIGNvbm5lY3Rpb24ucmVxdWVzdEJsdWV0b290aEF1ZGlvKFRlc3RVdGlscy5CTFVFVE9PVEhfREVWSUNFMSk7CisgICAgICAgIH0KICAgICAgICAgc2V0RGlzY29ubmVjdGVkQW5kVmVyaWZ5KGNvbm5lY3Rpb24pOwogICAgIH0KLQogICAgIC8qKgotICAgICAqIFRlc3RzIHRoYXQgVGVsZWNvbSB3aWxsIGRpc2FsbG93IGFuIG91dGdvaW5nIGNhbGwgd2hlbiB0aGVyZSBpcyBhbHJlYWR5IGFuIG9uZ29pbmcgY2FsbCBpbgotICAgICAqIGFub3RoZXIgdGhpcmQtcGFydHkgYXBwLgorICAgICAqIFRlc3RzIHRoYXQgVGVsZWNvbSB3aWxsIGFsbG93IHRoZSBpbmNvbWluZyBjYWxsIHdoaWxlIHRoZSBudW1iZXIgb2Ygc2VsZi1tYW5hZ2VkIGNhbGwgaXMgbm90CisgICAgICogZXhjZWVkIHRoZSBsaW1pdC4KICAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3REaXNhbGxvd091dGdvaW5nQ2FsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3RJbmNvbWluZ1doaWxlT25nb2luZ1dpdGhpbkxpbWl0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghbVNob3VsZFRlc3RUZWxlY29tKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KQEAgLTMxMSwzMyArMzg3LDcgQEAKICAgICAgICAgU2VsZk1hbmFnZWRDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSBUZXN0VXRpbHMud2FpdEZvckFuZEdldENvbm5lY3Rpb24oVEVTVF9BRERSRVNTXzEpOwogICAgICAgICBzZXRBY3RpdmVBbmRWZXJpZnkoY29ubmVjdGlvbik7CiAKLSAgICAgICAgLy8gQXR0ZW1wdCB0byBjcmVhdGUgYSBuZXcgb3V0Z29pbmcgY2FsbCBmb3IgdGhlIG90aGVyIFBob25lQWNjb3VudDsgaXQgc2hvdWxkIGZhaWwuCi0gICAgICAgIFRlc3RVdGlscy5wbGFjZU91dGdvaW5nQ2FsbChnZXRJbnN0cnVtZW50YXRpb24oKSwgbVRlbGVjb21NYW5hZ2VyLAotICAgICAgICAgICAgICAgIFRlc3RVdGlscy5URVNUX1NFTEZfTUFOQUdFRF9IQU5ETEVfMiwgVEVTVF9BRERSRVNTXzIpOwotICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCBvbkNyZWF0ZU91dGdvaW5nQ29ubmVjdGlvbkZhaWxlZCBjYWxsYmFjayIsCi0gICAgICAgICAgICAgICAgQ3RzU2VsZk1hbmFnZWRDb25uZWN0aW9uU2VydmljZS5nZXRDb25uZWN0aW9uU2VydmljZSgpLndhaXRGb3JVcGRhdGUoCi0gICAgICAgICAgICAgICAgICAgIEN0c1NlbGZNYW5hZ2VkQ29ubmVjdGlvblNlcnZpY2UuQ1JFQVRFX09VVEdPSU5HX0NPTk5FQ1RJT05fRkFJTEVEX0xPQ0spKTsKLQotICAgICAgICBzZXREaXNjb25uZWN0ZWRBbmRWZXJpZnkoY29ubmVjdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhhdCBUZWxlY29tIHdpbGwgZGlzYWxsb3cgYW4gb3V0Z29pbmcgY2FsbCB3aGVuIHRoZXJlIGlzIGFscmVhZHkgYW4gb25nb2luZyBjYWxsIGluCi0gICAgICogYW5vdGhlciB0aGlyZC1wYXJ0eSBhcHAuCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5jb21pbmdXaGlsZU9uZ29pbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFtU2hvdWxkVGVzdFRlbGVjb20pIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENyZWF0ZSBhbiBvbmdvaW5nIGNhbGwgaW4gdGhlIGZpcnN0IHNlbGYtbWFuYWdlZCBQaG9uZUFjY291bnQuCi0gICAgICAgIFRlc3RVdGlscy5wbGFjZU91dGdvaW5nQ2FsbChnZXRJbnN0cnVtZW50YXRpb24oKSwgbVRlbGVjb21NYW5hZ2VyLAotICAgICAgICAgICAgICAgIFRlc3RVdGlscy5URVNUX1NFTEZfTUFOQUdFRF9IQU5ETEVfMSwgVEVTVF9BRERSRVNTXzEpOwotICAgICAgICBTZWxmTWFuYWdlZENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IFRlc3RVdGlscy53YWl0Rm9yQW5kR2V0Q29ubmVjdGlvbihURVNUX0FERFJFU1NfMSk7Ci0gICAgICAgIHNldEFjdGl2ZUFuZFZlcmlmeShjb25uZWN0aW9uKTsKLQotICAgICAgICAvLyBBdHRlbXB0IHRvIGNyZWF0ZSBhIG5ldyBvdXRnb2luZyBjYWxsIGZvciB0aGUgb3RoZXIgUGhvbmVBY2NvdW50OyBpdCBzaG91bGQgc3VjY2VlZC4KKyAgICAgICAgLy8gQXR0ZW1wdCB0byBjcmVhdGUgYSBuZXcgaW5jb21pbmcgY2FsbCBmb3IgdGhlIG90aGVyIFBob25lQWNjb3VudDsgaXQgc2hvdWxkIHN1Y2NlZWQuCiAgICAgICAgIFRlc3RVdGlscy5hZGRJbmNvbWluZ0NhbGwoZ2V0SW5zdHJ1bWVudGF0aW9uKCksIG1UZWxlY29tTWFuYWdlciwKICAgICAgICAgICAgICAgICBUZXN0VXRpbHMuVEVTVF9TRUxGX01BTkFHRURfSEFORExFXzIsIFRFU1RfQUREUkVTU18yKTsKICAgICAgICAgU2VsZk1hbmFnZWRDb25uZWN0aW9uIGNvbm5lY3Rpb24yID0gVGVzdFV0aWxzLndhaXRGb3JBbmRHZXRDb25uZWN0aW9uKFRFU1RfQUREUkVTU18yKTsKQEAgLTM0Nyw2ICszOTcsNzYgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBUZXN0cyB0aGUgc2VsZi1tYW5hZ2VkIENvbm5lY3Rpb25TZXJ2aWNlIGhhcyBnYWluZWQgdGhlIGZvY3VzIHdoZW4gaXQgYmVjb21lIGFjdGl2ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VsZk1hbmFnZWRDb25uZWN0aW9uU2VydmljZUdhaW5lZEZvY3VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghbVNob3VsZFRlc3RUZWxlY29tKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBBdHRlbXB0IHRvIGNyZWF0ZSBhIG5ldyBJbmNvbWluZyBzZWxmLW1hbmFnZWQgY2FsbAorICAgICAgICBUZXN0VXRpbHMuYWRkSW5jb21pbmdDYWxsKGdldEluc3RydW1lbnRhdGlvbigpLCBtVGVsZWNvbU1hbmFnZXIsCisgICAgICAgICAgICAgICAgVGVzdFV0aWxzLlRFU1RfU0VMRl9NQU5BR0VEX0hBTkRMRV8xLCBURVNUX0FERFJFU1NfMSk7CisgICAgICAgIFNlbGZNYW5hZ2VkQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gVGVzdFV0aWxzLndhaXRGb3JBbmRHZXRDb25uZWN0aW9uKFRFU1RfQUREUkVTU18xKTsKKyAgICAgICAgc2V0QWN0aXZlQW5kVmVyaWZ5KGNvbm5lY3Rpb24pOworCisgICAgICAgIC8vIFRoZSBDb25uZWN0aW9uU2VydmljZSBoYXMgZ2FpbmVkIHRoZSBmb2N1cworICAgICAgICBhc3NlcnRUcnVlKEN0c1NlbGZNYW5hZ2VkQ29ubmVjdGlvblNlcnZpY2UuZ2V0Q29ubmVjdGlvblNlcnZpY2UoKS53YWl0Rm9yVXBkYXRlKAorICAgICAgICAgICAgICAgIEN0c1NlbGZNYW5hZ2VkQ29ubmVjdGlvblNlcnZpY2UuRk9DVVNfR0FJTkVEX0xPQ0spKTsKKworICAgICAgICBzZXREaXNjb25uZWN0ZWRBbmRWZXJpZnkoY29ubmVjdGlvbik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNlbGZNYW5hZ2VkQ29ubmVjdGlvblNlcnZpY2VMb3N0Rm9jdXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFtU2hvdWxkVGVzdFRlbGVjb20pIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEdJVkVOIGFuIG9uZ29pbmcgc2VsZi1tYW5hZ2VkIGNhbGwKKyAgICAgICAgVGVzdFV0aWxzLmFkZEluY29taW5nQ2FsbChnZXRJbnN0cnVtZW50YXRpb24oKSwgbVRlbGVjb21NYW5hZ2VyLAorICAgICAgICAgICAgICAgIFRlc3RVdGlscy5URVNUX1NFTEZfTUFOQUdFRF9IQU5ETEVfMSwgVEVTVF9BRERSRVNTXzEpOworICAgICAgICBTZWxmTWFuYWdlZENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IFRlc3RVdGlscy53YWl0Rm9yQW5kR2V0Q29ubmVjdGlvbihURVNUX0FERFJFU1NfMSk7CisgICAgICAgIHNldEFjdGl2ZUFuZFZlcmlmeShjb25uZWN0aW9uKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShDdHNTZWxmTWFuYWdlZENvbm5lY3Rpb25TZXJ2aWNlLmdldENvbm5lY3Rpb25TZXJ2aWNlKCkud2FpdEZvclVwZGF0ZSgKKyAgICAgICAgICAgICAgICBDdHNTZWxmTWFuYWdlZENvbm5lY3Rpb25TZXJ2aWNlLkZPQ1VTX0dBSU5FRF9MT0NLKSk7CisKKyAgICAgICAgLy8gV0hFTiBwbGFjZSBhIG1hbmFnZWQgY2FsbAorICAgICAgICBwbGFjZUFuZFZlcmlmeUNhbGwoKTsKKyAgICAgICAgdmVyaWZ5Q29ubmVjdGlvbkZvck91dGdvaW5nQ2FsbCgpLnNldEFjdGl2ZSgpOworICAgICAgICBhc3NlcnRUcnVlKGNvbm5lY3Rpb25TZXJ2aWNlLndhaXRGb3JFdmVudCgKKyAgICAgICAgICAgICAgICBNb2NrQ29ubmVjdGlvblNlcnZpY2UuRVZFTlRfQ09OTkVDVElPTl9TRVJWSUNFX0ZPQ1VTX0dBSU5FRCkpOworCisgICAgICAgIC8vIFRIRU4gdGhlIHNlbGYtbWFuYWdlZCBDb25uZWN0aW9uU2VydmljZSBsb3N0IHRoZSBmb2N1cworCisgICAgICAgIGNvbm5lY3Rpb24uZGlzY29ubmVjdEFuZERlc3Ryb3koKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShDdHNTZWxmTWFuYWdlZENvbm5lY3Rpb25TZXJ2aWNlLmdldENvbm5lY3Rpb25TZXJ2aWNlKCkud2FpdEZvclVwZGF0ZSgKKyAgICAgICAgICAgICAgICBDdHNTZWxmTWFuYWdlZENvbm5lY3Rpb25TZXJ2aWNlLkZPQ1VTX0xPU1RfTE9DSykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoYXQgVGVsZWNvbSB3aWxsIGRpc2FsbG93IHRoZSBpbmNvbWluZyBjYWxsIHdoaWxlIHRoZSByaW5naW5nIGNhbGwgaXMgZXhpc3RlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmluZ0NhbGxMaW1pdEZvck9uZVBob25lQWNjb3VudCgpIHsKKyAgICAgICAgaWYgKCFtU2hvdWxkVGVzdFRlbGVjb20pIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEdJVkVOIGEgc2VsZi1tYW5hZ2VkIGNhbGwgd2hpY2ggc3RhdGUgaXMgcmluZ2luZworICAgICAgICBUZXN0VXRpbHMuYWRkSW5jb21pbmdDYWxsKGdldEluc3RydW1lbnRhdGlvbigpLCBtVGVsZWNvbU1hbmFnZXIsCisgICAgICAgICAgICAgICAgVGVzdFV0aWxzLlRFU1RfU0VMRl9NQU5BR0VEX0hBTkRMRV8xLCBURVNUX0FERFJFU1NfMSk7CisgICAgICAgIFNlbGZNYW5hZ2VkQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gVGVzdFV0aWxzLndhaXRGb3JBbmRHZXRDb25uZWN0aW9uKFRFU1RfQUREUkVTU18xKTsKKyAgICAgICAgY29ubmVjdGlvbi5zZXRSaW5naW5nKCk7CisKKyAgICAgICAgLy8gV0hFTiBjcmVhdGUgYSBuZXcgaW5jb21pbmcgY2FsbCBmb3IgdGhlIHRoZSBzYW1lIFBob25lQWNjb3VudAorICAgICAgICBUZXN0VXRpbHMuYWRkSW5jb21pbmdDYWxsKGdldEluc3RydW1lbnRhdGlvbigpLCBtVGVsZWNvbU1hbmFnZXIsCisgICAgICAgICAgICAgICAgVGVzdFV0aWxzLlRFU1RfU0VMRl9NQU5BR0VEX0hBTkRMRV8xLCBURVNUX0FERFJFU1NfMSk7CisKKyAgICAgICAgLy8gVEhFTiB0aGUgbmV3IGluY29taW5nIGNhbGwgaXMgZGVuaWVkCisgICAgICAgIGFzc2VydFRydWUoQ3RzU2VsZk1hbmFnZWRDb25uZWN0aW9uU2VydmljZS5nZXRDb25uZWN0aW9uU2VydmljZSgpLndhaXRGb3JVcGRhdGUoCisgICAgICAgICAgICAgICAgQ3RzU2VsZk1hbmFnZWRDb25uZWN0aW9uU2VydmljZS5DUkVBVEVfSU5DT01JTkdfQ09OTkVDVElPTl9GQUlMRURfTE9DSykpOworICAgIH0KKworICAgIC8qKgogICAgICAqIFRlc3RzIHRoYXQgVGVsZWNvbSBlbmZvcmNlcyBhIG1heGltdW0gbnVtYmVyIG9mIGNhbGxzIGZvciBhIHNlbGYtbWFuYWdlZCBDb25uZWN0aW9uU2VydmljZS4KICAgICAgKgogICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZWxlY29tL3NyYy9hbmRyb2lkL3RlbGVjb20vY3RzL1Rlc3RVdGlscy5qYXZhIGIvdGVzdHMvdGVzdHMvdGVsZWNvbS9zcmMvYW5kcm9pZC90ZWxlY29tL2N0cy9UZXN0VXRpbHMuamF2YQppbmRleCBmM2M1NGIzLi4wNjcxYWFhIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy90ZWxlY29tL3NyYy9hbmRyb2lkL3RlbGVjb20vY3RzL1Rlc3RVdGlscy5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3RlbGVjb20vc3JjL2FuZHJvaWQvdGVsZWNvbS9jdHMvVGVzdFV0aWxzLmphdmEKQEAgLTE1LDkgKzE1LDggQEAKICAqLwogcGFja2FnZSBhbmRyb2lkLnRlbGVjb20uY3RzOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5BcGlMZXZlbFV0aWw7Ci0KIGltcG9ydCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb247CitpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKQEAgLTI3LDEzICsyNiwxNyBAQAogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOwogaW1wb3J0IGFuZHJvaWQub3MuUHJvY2VzczsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQub3MuVXNlck1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC50ZWxlY29tLlBob25lQWNjb3VudDsKIGltcG9ydCBhbmRyb2lkLnRlbGVjb20uUGhvbmVBY2NvdW50SGFuZGxlOwogaW1wb3J0IGFuZHJvaWQudGVsZWNvbS5UZWxlY29tTWFuYWdlcjsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CisKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwpAQCAtNTMsNiArNTYsMTEgQEAKICAgICBzdGF0aWMgZmluYWwgbG9uZyBXQUlUX0ZPUl9TVEFURV9DSEFOR0VfVElNRU9VVF9NUyA9IDEwMDAwOwogICAgIHN0YXRpYyBmaW5hbCBsb25nIFdBSVRfRk9SX0NBTExfQURERURfVElNRU9VVF9TID0gMTU7CiAgICAgc3RhdGljIGZpbmFsIGxvbmcgV0FJVF9GT1JfU1RBVEVfQ0hBTkdFX1RJTUVPVVRfQ0FMTEJBQ0sgPSA1MDsKKyAgICBzdGF0aWMgZmluYWwgbG9uZyBXQUlUX0ZPUl9QSE9ORV9TVEFURV9MSVNURU5FUl9SRUdJU1RFUkVEX1RJTUVPVVRfUyA9IDE1OworICAgIHN0YXRpYyBmaW5hbCBsb25nIFdBSVRfRk9SX1BIT05FX1NUQVRFX0xJU1RFTkVSX0NBTExCQUNLX1RJTUVPVVRfUyA9IDE1OworICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIEhBU19CTFVFVE9PVEggPSBoYXNCbHVldG9vdGhGZWF0dXJlKCk7CisgICAgc3RhdGljIGZpbmFsIEJsdWV0b290aERldmljZSBCTFVFVE9PVEhfREVWSUNFMSA9IG1ha2VCbHVldG9vdGhEZXZpY2UoIjAwOjAwOjAwOjAwOjAwOjAxIik7CisgICAgc3RhdGljIGZpbmFsIEJsdWV0b290aERldmljZSBCTFVFVE9PVEhfREVWSUNFMiA9IG1ha2VCbHVldG9vdGhEZXZpY2UoIjAwOjAwOjAwOjAwOjAwOjAyIik7CiAKICAgICAvLyBOb24tZmluYWwgdG8gYWxsb3cgbW9kaWZpY2F0aW9uIGJ5IHRlc3RzIG5vdCBpbiB0aGlzIHBhY2thZ2UgKGUuZy4gcGVybWlzc2lvbi1yZWxhdGVkCiAgICAgLy8gdGVzdHMgaW4gdGhlIFRlbGVjb20yIHRlc3QgcGFja2FnZS4KQEAgLTY0LDYgKzcyLDExIEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDT1VOVF9JRCA9ICJ4dHN0ZXN0X0NBTExfUFJPVklERVJfSUQiOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGhvbmVBY2NvdW50SGFuZGxlIFRFU1RfUEhPTkVfQUNDT1VOVF9IQU5ETEUgPQogICAgICAgICAgICAgbmV3IFBob25lQWNjb3VudEhhbmRsZShuZXcgQ29tcG9uZW50TmFtZShQQUNLQUdFLCBDT01QT05FTlQpLCBBQ0NPVU5UX0lEKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBob25lQWNjb3VudEhhbmRsZSBURVNUX0hBTkRPVkVSX1NSQ19QSE9ORV9BQ0NPVU5UX0hBTkRMRSA9CisgICAgICAgICAgICBuZXcgUGhvbmVBY2NvdW50SGFuZGxlKG5ldyBDb21wb25lbnROYW1lKFBBQ0tBR0UsIENPTVBPTkVOVCksICJoYW5kb3ZlckZyb20iKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBob25lQWNjb3VudEhhbmRsZSBURVNUX0hBTkRPVkVSX0RFU1RfUEhPTkVfQUNDT1VOVF9IQU5ETEUgPQorICAgICAgICAgICAgbmV3IFBob25lQWNjb3VudEhhbmRsZShuZXcgQ29tcG9uZW50TmFtZShQQUNLQUdFLCBTRUxGX01BTkFHRURfQ09NUE9ORU5UKSwKKyAgICAgICAgICAgICAgICAgICAgImhhbmRvdmVyVG8iKTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRU1PVEVfQUNDT1VOVF9JRCA9ICJ4dHN0ZXN0X1JFTU9URV9DQUxMX1BST1ZJREVSX0lEIjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxGX01BTkFHRURfQUNDT1VOVF9JRF8xID0gImN0c3Rlc3RfU0VMRl9NQU5BR0VEX0lEXzEiOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGhvbmVBY2NvdW50SGFuZGxlIFRFU1RfU0VMRl9NQU5BR0VEX0hBTkRMRV8xID0KQEAgLTczLDYgKzg2LDEwIEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQaG9uZUFjY291bnRIYW5kbGUgVEVTVF9TRUxGX01BTkFHRURfSEFORExFXzIgPQogICAgICAgICAgICAgbmV3IFBob25lQWNjb3VudEhhbmRsZShuZXcgQ29tcG9uZW50TmFtZShQQUNLQUdFLCBTRUxGX01BTkFHRURfQ09NUE9ORU5UKSwKICAgICAgICAgICAgICAgICAgICAgU0VMRl9NQU5BR0VEX0FDQ09VTlRfSURfMik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRl9NQU5BR0VEX0FDQ09VTlRfSURfMyA9ICJjdHN0ZXN0X1NFTEZfTUFOQUdFRF9JRF8zIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBob25lQWNjb3VudEhhbmRsZSBURVNUX1NFTEZfTUFOQUdFRF9IQU5ETEVfMyA9CisgICAgICAgICAgICBuZXcgUGhvbmVBY2NvdW50SGFuZGxlKG5ldyBDb21wb25lbnROYW1lKFBBQ0tBR0UsIFNFTEZfTUFOQUdFRF9DT01QT05FTlQpLAorICAgICAgICAgICAgICAgICAgICBTRUxGX01BTkFHRURfQUNDT1VOVF9JRF8zKTsKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ09VTlRfTEFCRUwgPSAiQ1RTQ29ubmVjdGlvblNlcnZpY2UiOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGhvbmVBY2NvdW50IFRFU1RfUEhPTkVfQUNDT1VOVCA9IFBob25lQWNjb3VudC5idWlsZGVyKApAQCAtODgsOCArMTA1LDQ4IEBACiAgICAgICAgICAgICAuYWRkU3VwcG9ydGVkVXJpU2NoZW1lKFBob25lQWNjb3VudC5TQ0hFTUVfVEVMKQogICAgICAgICAgICAgLmFkZFN1cHBvcnRlZFVyaVNjaGVtZShQaG9uZUFjY291bnQuU0NIRU1FX1ZPSUNFTUFJTCkKICAgICAgICAgICAgIC5idWlsZCgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJ1bmRsZSBTVVBQT1JUU19IQU5ET1ZFUl9GUk9NX0VYVFJBUyA9IG5ldyBCdW5kbGUoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCdW5kbGUgU1VQUE9SVFNfSEFORE9WRVJfVE9fRVhUUkFTID0gbmV3IEJ1bmRsZSgpOworICAgIHN0YXRpYyB7CisgICAgICAgIFNVUFBPUlRTX0hBTkRPVkVSX0ZST01fRVhUUkFTLnB1dEJvb2xlYW4oUGhvbmVBY2NvdW50LkVYVFJBX1NVUFBPUlRTX0hBTkRPVkVSX0ZST00sIHRydWUpOworICAgICAgICBTVVBQT1JUU19IQU5ET1ZFUl9UT19FWFRSQVMucHV0Qm9vbGVhbihQaG9uZUFjY291bnQuRVhUUkFfU1VQUE9SVFNfSEFORE9WRVJfVE8sIHRydWUpOworICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBob25lQWNjb3VudCBURVNUX1BIT05FX0FDQ09VTlRfSEFORE9WRVJfU1JDID0gUGhvbmVBY2NvdW50LmJ1aWxkZXIoCisgICAgICAgICAgICBURVNUX0hBTkRPVkVSX1NSQ19QSE9ORV9BQ0NPVU5UX0hBTkRMRSwgQUNDT1VOVF9MQUJFTCkKKyAgICAgICAgICAgIC5zZXRBZGRyZXNzKFVyaS5wYXJzZSgidGVsOjU1NS1URVNUIikpCisgICAgICAgICAgICAuc2V0RXh0cmFzKFNVUFBPUlRTX0hBTkRPVkVSX0ZST01fRVhUUkFTKQorICAgICAgICAgICAgLnNldFN1YnNjcmlwdGlvbkFkZHJlc3MoVXJpLnBhcnNlKCJ0ZWw6NTU1LVRFU1QiKSkKKyAgICAgICAgICAgIC5zZXRDYXBhYmlsaXRpZXMoUGhvbmVBY2NvdW50LkNBUEFCSUxJVFlfQ0FMTF9QUk9WSURFUikKKyAgICAgICAgICAgIC5zZXRIaWdobGlnaHRDb2xvcihDb2xvci5CTFVFKQorICAgICAgICAgICAgLnNldFNob3J0RGVzY3JpcHRpb24oQUNDT1VOVF9MQUJFTCkKKyAgICAgICAgICAgIC5hZGRTdXBwb3J0ZWRVcmlTY2hlbWUoUGhvbmVBY2NvdW50LlNDSEVNRV9URUwpCisgICAgICAgICAgICAuYWRkU3VwcG9ydGVkVXJpU2NoZW1lKFBob25lQWNjb3VudC5TQ0hFTUVfVk9JQ0VNQUlMKQorICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQaG9uZUFjY291bnQgVEVTVF9QSE9ORV9BQ0NPVU5UX0hBTkRPVkVSX0RFU1QgPSBQaG9uZUFjY291bnQuYnVpbGRlcigKKyAgICAgICAgICAgIFRFU1RfSEFORE9WRVJfREVTVF9QSE9ORV9BQ0NPVU5UX0hBTkRMRSwgQUNDT1VOVF9MQUJFTCkKKyAgICAgICAgICAgIC5zZXRBZGRyZXNzKFVyaS5wYXJzZSgidGVsOjU1NS1URVNUIikpCisgICAgICAgICAgICAuc2V0RXh0cmFzKFNVUFBPUlRTX0hBTkRPVkVSX1RPX0VYVFJBUykKKyAgICAgICAgICAgIC5zZXRTdWJzY3JpcHRpb25BZGRyZXNzKFVyaS5wYXJzZSgidGVsOjU1NS1URVNUIikpCisgICAgICAgICAgICAuc2V0Q2FwYWJpbGl0aWVzKFBob25lQWNjb3VudC5DQVBBQklMSVRZX1NFTEZfTUFOQUdFRCkKKyAgICAgICAgICAgIC5zZXRIaWdobGlnaHRDb2xvcihDb2xvci5NQUdFTlRBKQorICAgICAgICAgICAgLnNldFNob3J0RGVzY3JpcHRpb24oQUNDT1VOVF9MQUJFTCkKKyAgICAgICAgICAgIC5hZGRTdXBwb3J0ZWRVcmlTY2hlbWUoUGhvbmVBY2NvdW50LlNDSEVNRV9URUwpCisgICAgICAgICAgICAuYWRkU3VwcG9ydGVkVXJpU2NoZW1lKFBob25lQWNjb3VudC5TQ0hFTUVfVk9JQ0VNQUlMKQorICAgICAgICAgICAgLmJ1aWxkKCk7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1RFX0FDQ09VTlRfTEFCRUwgPSAiQ1RTUmVtb3RlQ29ubmVjdGlvblNlcnZpY2UiOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEZfTUFOQUdFRF9BQ0NPVU5UX0xBQkVMID0gImFuZHJvaWQudGVsZWNvbS5jdHMiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfVVJJX1NDSEVNRSA9ICJmb29idXp6IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBob25lQWNjb3VudCBURVNUX1NFTEZfTUFOQUdFRF9QSE9ORV9BQ0NPVU5UXzMgPSBQaG9uZUFjY291bnQuYnVpbGRlcigKKyAgICAgICAgICAgIFRFU1RfU0VMRl9NQU5BR0VEX0hBTkRMRV8zLCBTRUxGX01BTkFHRURfQUNDT1VOVF9MQUJFTCkKKyAgICAgICAgICAgIC5zZXRBZGRyZXNzKFVyaS5mcm9tUGFydHMoVEVTVF9VUklfU0NIRU1FLCAidGVzdEB0ZXN0LmNvbSIsIG51bGwpKQorICAgICAgICAgICAgLnNldFN1YnNjcmlwdGlvbkFkZHJlc3MoVXJpLmZyb21QYXJ0cyhURVNUX1VSSV9TQ0hFTUUsICJ0ZXN0QHRlc3QuY29tIiwgbnVsbCkpCisgICAgICAgICAgICAuc2V0Q2FwYWJpbGl0aWVzKFBob25lQWNjb3VudC5DQVBBQklMSVRZX1NFTEZfTUFOQUdFRCB8CisgICAgICAgICAgICAgICAgICAgIFBob25lQWNjb3VudC5DQVBBQklMSVRZX1NVUFBPUlRTX1ZJREVPX0NBTExJTkcgfAorICAgICAgICAgICAgICAgICAgICBQaG9uZUFjY291bnQuQ0FQQUJJTElUWV9WSURFT19DQUxMSU5HKQorICAgICAgICAgICAgLnNldEhpZ2hsaWdodENvbG9yKENvbG9yLkJMVUUpCisgICAgICAgICAgICAuc2V0U2hvcnREZXNjcmlwdGlvbihTRUxGX01BTkFHRURfQUNDT1VOVF9MQUJFTCkKKyAgICAgICAgICAgIC5hZGRTdXBwb3J0ZWRVcmlTY2hlbWUoVEVTVF9VUklfU0NIRU1FKQorICAgICAgICAgICAgLmJ1aWxkKCk7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQaG9uZUFjY291bnQgVEVTVF9TRUxGX01BTkFHRURfUEhPTkVfQUNDT1VOVF8yID0gUGhvbmVBY2NvdW50LmJ1aWxkZXIoCiAgICAgICAgICAgICBURVNUX1NFTEZfTUFOQUdFRF9IQU5ETEVfMiwgU0VMRl9NQU5BR0VEX0FDQ09VTlRfTEFCRUwpCiAgICAgICAgICAgICAuc2V0QWRkcmVzcyhVcmkucGFyc2UoInNpcDp0ZXN0QHRlc3QuY29tIikpCkBAIC0xMjksNyArMTg2LDYgQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FUkdFX0NBTExFUl9OQU1FID0gImNhbGxzLW1lcmdlZCI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1dBUF9DQUxMRVJfTkFNRSA9ICJjYWxscy1zd2FwcGVkIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJTUFSWV9VU0VSX1NOID0gIjAiOwogCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHNob3VsZFRlc3RUZWxlY29tKENvbnRleHQgY29udGV4dCkgewogICAgICAgICBpZiAoIUhBU19URUxFQ09NKSB7CkBAIC0xNTYsMTcgKzIxMiwxOSBAQAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBlbmFibGVQaG9uZUFjY291bnQoSW5zdHJ1bWVudGF0aW9uIGluc3RydW1lbnRhdGlvbiwKICAgICAgICAgICAgIFBob25lQWNjb3VudEhhbmRsZSBoYW5kbGUpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBmaW5hbCBDb21wb25lbnROYW1lIGNvbXBvbmVudCA9IGhhbmRsZS5nZXRDb21wb25lbnROYW1lKCk7CisgICAgICAgIGZpbmFsIGxvbmcgY3VycmVudFVzZXJTZXJpYWwgPSBnZXRDdXJyZW50VXNlclNlcmlhbE51bWJlcihpbnN0cnVtZW50YXRpb24pOwogICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKGluc3RydW1lbnRhdGlvbiwgQ09NTUFORF9FTkFCTEUKICAgICAgICAgICAgICAgICArIGNvbXBvbmVudC5nZXRQYWNrYWdlTmFtZSgpICsgIi8iICsgY29tcG9uZW50LmdldENsYXNzTmFtZSgpICsgIiAiCi0gICAgICAgICAgICAgICAgKyBoYW5kbGUuZ2V0SWQoKSArICIgIiArIFBSSU1BUllfVVNFUl9TTik7CisgICAgICAgICAgICAgICAgKyBoYW5kbGUuZ2V0SWQoKSArICIgIiArIGN1cnJlbnRVc2VyU2VyaWFsKTsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXJTaW1QaG9uZUFjY291bnQoSW5zdHJ1bWVudGF0aW9uIGluc3RydW1lbnRhdGlvbiwKICAgICAgICAgICAgIFBob25lQWNjb3VudEhhbmRsZSBoYW5kbGUsIFN0cmluZyBsYWJlbCwgU3RyaW5nIGFkZHJlc3MpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBmaW5hbCBDb21wb25lbnROYW1lIGNvbXBvbmVudCA9IGhhbmRsZS5nZXRDb21wb25lbnROYW1lKCk7CisgICAgICAgIGZpbmFsIGxvbmcgY3VycmVudFVzZXJTZXJpYWwgPSBnZXRDdXJyZW50VXNlclNlcmlhbE51bWJlcihpbnN0cnVtZW50YXRpb24pOwogICAgICAgICBleGVjdXRlU2hlbGxDb21tYW5kKGluc3RydW1lbnRhdGlvbiwgQ09NTUFORF9SRUdJU1RFUl9TSU0KICAgICAgICAgICAgICAgICArIGNvbXBvbmVudC5nZXRQYWNrYWdlTmFtZSgpICsgIi8iICsgY29tcG9uZW50LmdldENsYXNzTmFtZSgpICsgIiAiCi0gICAgICAgICAgICAgICAgKyBoYW5kbGUuZ2V0SWQoKSArICIgIiArIFBSSU1BUllfVVNFUl9TTiArICIgIiArIGxhYmVsICsgIiAiICsgYWRkcmVzcyk7CisgICAgICAgICAgICAgICAgKyBoYW5kbGUuZ2V0SWQoKSArICIgIiArIGN1cnJlbnRVc2VyU2VyaWFsICsgIiAiICsgbGFiZWwgKyAiICIgKyBhZGRyZXNzKTsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgd2FpdE9uQWxsSGFuZGxlcnMoSW5zdHJ1bWVudGF0aW9uIGluc3RydW1lbnRhdGlvbikgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0yODUsNiArMzQzLDE5IEBACiAgICAgICAgICAgICBUZXN0Q2FzZS5mYWlsKCJGYWlsZWQgdG8gd2FpdCBvbiBoYW5kbGVycyIpOwogICAgICAgICB9CiAgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNCbHVldG9vdGhGZWF0dXJlKCkgeworICAgICAgICByZXR1cm4gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VNYW5hZ2VyKCkuCisgICAgICAgICAgICAgICAgaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX0JMVUVUT09USCk7CisgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgQmx1ZXRvb3RoRGV2aWNlIG1ha2VCbHVldG9vdGhEZXZpY2UoU3RyaW5nIGFkZHJlc3MpIHsKKyAgICAgICAgaWYgKCFIQVNfQkxVRVRPT1RIKSByZXR1cm4gbnVsbDsKKyAgICAgICAgUGFyY2VsIHAxID0gUGFyY2VsLm9idGFpbigpOworICAgICAgICBwMS53cml0ZVN0cmluZyhhZGRyZXNzKTsKKyAgICAgICAgcDEuc2V0RGF0YVBvc2l0aW9uKDApOworICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlID0gQmx1ZXRvb3RoRGV2aWNlLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChwMSk7CisgICAgICAgIHAxLnJlY3ljbGUoKTsKKyAgICAgICAgcmV0dXJuIGRldmljZTsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBQbGFjZXMgYSBuZXcgb3V0Z29pbmcgY2FsbC4KQEAgLTQxOCw3ICs0ODksNiBAQAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHZvaWQgd2FpdEZvclByZWRpY2F0ZShQcmVkaWNhdGUgcHJlZGljYXRlLCBsb25nIHRpbWVvdXRNaWxsaXMpIHsKICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgICAgICBtSW52b2tlQXJncy5jbGVhcigpOwogICAgICAgICAgICAgICAgIGxvbmcgc3RhcnRUaW1lTWlsbGlzID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CiAgICAgICAgICAgICAgICAgbG9uZyBlbGFwc2VkVGltZU1pbGxpcyA9IDA7CiAgICAgICAgICAgICAgICAgbG9uZyByZW1haW5pbmdUaW1lTWlsbGlzID0gdGltZW91dE1pbGxpczsKQEAgLTQ0Miw1ICs1MTIsMTcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjbGVhckFyZ3MoKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICAgICAgbUludm9rZUFyZ3MuY2xlYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGxvbmcgZ2V0Q3VycmVudFVzZXJTZXJpYWxOdW1iZXIoSW5zdHJ1bWVudGF0aW9uIGluc3RydW1lbnRhdGlvbikgeworICAgICAgICBVc2VyTWFuYWdlciB1c2VyTWFuYWdlciA9CisgICAgICAgICAgICAgICAgaW5zdHJ1bWVudGF0aW9uLmdldENvbnRleHQoKS5nZXRTeXN0ZW1TZXJ2aWNlKFVzZXJNYW5hZ2VyLmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIHVzZXJNYW5hZ2VyLmdldFNlcmlhbE51bWJlckZvclVzZXIoUHJvY2Vzcy5teVVzZXJIYW5kbGUoKSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGVsZWNvbTIvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL3RlbGVjb20yL0FuZHJvaWQubWsKaW5kZXggOGU5YzhhNWQuLmZlZGZkODkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RlbGVjb20yL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvdGVzdHMvdGVsZWNvbTIvQW5kcm9pZC5tawpAQCAtMjUsOSArMjUsMTAgQEAKIExPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCiAKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCi0JY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbCBcCi0JY3RzdGVzdHJ1bm5lciBcCi0JbGVnYWN5LWFuZHJvaWQtdGVzdAorCWNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0IFwKKwljdHN0ZXN0cnVubmVyLWF4dAorCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicwogCiBzcmNfZGlycyA6PSBzcmMgXAogICAgIC4uL3RlbGVjb20vc3JjL2FuZHJvaWQvdGVsZWNvbS9jdHMvU2VsZk1hbmFnZWRDb25uZWN0aW9uLmphdmEgXApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGVsZWNvbTIvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL3RlbGVjb20yL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggNTBjNjk0NS4uMDBlNThlYiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdGVsZWNvbTIvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy90ZWxlY29tMi9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC03Myw3ICs3Myw3IEBACiAgICAgICAgIDwvYWN0aXZpdHk+CiAgICAgPC9hcHBsaWNhdGlvbj4KIAotICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQudGVsZWNvbTIuY3RzIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIGZvciBhbmRyb2lkLnRlbGVjb20gcGFja2FnZSI+CiAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJsaXN0ZW5lciIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RlbGVjb20yL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL3RlbGVjb20yL0FuZHJvaWRUZXN0LnhtbAppbmRleCBmNGQ4ZTg2Li5kMzhmMjRiIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy90ZWxlY29tMi9BbmRyb2lkVGVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvdGVsZWNvbTIvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlndXJhdGlvbiBmb3IgVGVsZWNvbTIgVGVzdHMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJ0ZWxlY29tIiAvPgogICAgIDxvcHRpb24gbmFtZT0ibm90LXNoYXJkYWJsZSIgdmFsdWU9InRydWUiIC8+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZWxlY29tMi9zcmMvYW5kcm9pZC90ZWxlY29tL2N0cy9UZWxlY29tTWFuYWdlck5vUGVybWlzc2lvbnNUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy90ZWxlY29tMi9zcmMvYW5kcm9pZC90ZWxlY29tL2N0cy9UZWxlY29tTWFuYWdlck5vUGVybWlzc2lvbnNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIxYzdkYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3RlbGVjb20yL3NyYy9hbmRyb2lkL3RlbGVjb20vY3RzL1RlbGVjb21NYW5hZ2VyTm9QZXJtaXNzaW9uc1Rlc3QuamF2YQpAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQudGVsZWNvbS5jdHM7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLnRlbGVjb20uVGVsZWNvbU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RDYXNlOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CisKKy8qKgorICogVmVyaWZpZXMgY29ycmVjdCBvcGVyYXRpb24gb2YgVGVsZWNvbU1hbmFnZXIgQVBJcyB3aGVuIHRoZSBjb3JyZWN0IHBlcm1pc3Npb25zIGhhdmUgbm90IGJlZW4KKyAqIGdyYW50ZWQuCisgKi8KK3B1YmxpYyBjbGFzcyBUZWxlY29tTWFuYWdlck5vUGVybWlzc2lvbnNUZXN0IGV4dGVuZHMgSW5zdHJ1bWVudGF0aW9uVGVzdENhc2UgeworICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKKyAgICBwcml2YXRlIFRlbGVjb21NYW5hZ2VyIG1UZWxlY29tTWFuYWdlcjsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgIG1Db250ZXh0ID0gZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0Q29udGV4dCgpOworICAgICAgICBpZiAoIVRlc3RVdGlscy5zaG91bGRUZXN0VGVsZWNvbShtQ29udGV4dCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtVGVsZWNvbU1hbmFnZXIgPSAoVGVsZWNvbU1hbmFnZXIpIG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5URUxFQ09NX1NFUlZJQ0UpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENhbm5vdEVuZENhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFUZXN0VXRpbHMuc2hvdWxkVGVzdFRlbGVjb20obUNvbnRleHQpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1UZWxlY29tTWFuYWdlci5lbmRDYWxsKCk7CisgICAgICAgICAgICBmYWlsKCJTaG91bGRuJ3QgYmUgYWJsZSB0byBjYWxsIGVuZENhbGwgd2l0aG91dCBwZXJtaXNzaW9uIGdyYW50LiIpOworICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBzZSkgeworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGVsZWNvbTMvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL3RlbGVjb20zL0FuZHJvaWQubWsKaW5kZXggODZjYjg1OS4uN2FlMTJlNSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdGVsZWNvbTMvQW5kcm9pZC5taworKysgYi90ZXN0cy90ZXN0cy90ZWxlY29tMy9BbmRyb2lkLm1rCkBAIC0yNCw3ICsyNCw5IEBACiAjIFdoZW4gYnVpbHQsIGV4cGxpY2l0bHkgcHV0IGl0IGluIHRoZSBkYXRhIHBhcnRpdGlvbi4KIExPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCiAKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsIGN0c3Rlc3RydW5uZXIKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBjdHN0ZXN0cnVubmVyLWF4dAorCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicwogCiBzcmNfZGlycyA6PSBzcmMgXAogICAgIC4uL3RlbGVjb20vc3JjL2FuZHJvaWQvdGVsZWNvbS9jdHMvU2VsZk1hbmFnZWRDb25uZWN0aW9uLmphdmEgXApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGVsZWNvbTMvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL3RlbGVjb20zL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggODIwN2ZiNy4uYzYwNmRjYiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdGVsZWNvbTMvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy90ZWxlY29tMy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC03Nyw3ICs3Nyw3IEBACiAgICAgICAgIDwvYWN0aXZpdHk+CiAgICAgPC9hcHBsaWNhdGlvbj4KIAotICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQudGVsZWNvbTMuY3RzIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIGZvciBhbmRyb2lkLnRlbGVjb20gcGFja2FnZSI+CiAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJsaXN0ZW5lciIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RlbGVjb20zL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL3RlbGVjb20zL0FuZHJvaWRUZXN0LnhtbAppbmRleCAzNTQ1ODFhLi43NWIxZDBkIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy90ZWxlY29tMy9BbmRyb2lkVGVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvdGVsZWNvbTMvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlndXJhdGlvbiBmb3IgVGVsZWNvbTMgVGVzdHMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJ0ZWxlY29tIiAvPgogICAgIDxvcHRpb24gbmFtZT0ibm90LXNoYXJkYWJsZSIgdmFsdWU9InRydWUiIC8+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZWxlcGhvbnkvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9BbmRyb2lkLm1rCmluZGV4IDEzNjg1NzMuLjE1Y2MzYWIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9BbmRyb2lkLm1rCkBAIC0yNSwxMyArMjUsMTcgQEAKIExPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IHRlbGVwaG9ueS1jb21tb24KIAogTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKLSAgICBjdHN0ZXN0cnVubmVyIFwKLSAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsIFwKLSAgICBsZWdhY3ktYW5kcm9pZC10ZXN0CisgICAgY3RzdGVzdHJ1bm5lci1heHQgaGFtY3Jlc3QtbGlicmFyeSBcCisgICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgXAorICAgIHRydXRoLXByZWJ1aWx0CiAKIExPQ0FMX0hPU1RfU0hBUkVEX0xJQlJBUklFUyA6PSBjb21wYXRpYmlsaXR5LWRldmljZS10ZWxlcGhvbnktcHJlY29uZGl0aW9ucwogCi1MT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpIFwKKyAgICAgICAgICAgICAgICAgICAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIEVtYm1zTWlkZGxld2FyZVRlc3RBcHApIFwKKyAgICAgICAgICAgICAgICAgICAkKGNhbGwgYWxsLUlhaWRsLWZpbGVzLXVuZGVyLCBFbWJtc01pZGRsZXdhcmVUZXN0QXBwKQorCitMT0NBTF9BSURMX0lOQ0xVREVTIDo9IEVtYm1zTWlkZGxld2FyZVRlc3RBcHAvYWlkbC8KIAogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c1RlbGVwaG9ueVRlc3RDYXNlcwogCkBAIC00MCw3ICs0NCw5IEBACiAKICMgdW5jb21tZW50IHdoZW4gYi8xMzI1MDYxMSBpcyBmaXhlZAogI0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKLUxPQ0FMX0pBVkFfTElCUkFSSUVTICs9IGFuZHJvaWQudGVzdC5ydW5uZXIKK0xPQ0FMX1BSSVZBVEVfUExBVEZPUk1fQVBJUyA6PSB0cnVlCitMT0NBTF9KQVZBX0xJQlJBUklFUyArPSBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzCitMT0NBTF9KQVZBX0xJQlJBUklFUyArPSBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicwogCiBpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCiBpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZWxlcGhvbnkvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDM4ZDIwYzYuLjk3ZDEyZGQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0zMCw3ICszMCwxMSBAQAogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX1dJRklfU1RBVEUiIC8+CiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5DSEFOR0VfV0lGSV9TVEFURSIgLz4KICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkJMVUVUT09USCIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLklOVEVSQUNUX0FDUk9TU19VU0VSUyIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZWxlcGhvbnkuZW1ibXMuY3RzLnBlcm1pc3Npb24uVEVTVF9CUk9BRENBU1QiLz4KIAorICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZWxlcGhvbnkuZW1ibXMuY3RzLnBlcm1pc3Npb24uVEVTVF9CUk9BRENBU1QiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9InNpZ25hdHVyZSIvPgogICAgIDxhcHBsaWNhdGlvbj4KICAgICAgICAgPHByb3ZpZGVyIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZWxlcGhvbnkuY3RzLk1tc1BkdVByb3ZpZGVyIgogICAgICAgICAgICAgICAgICAgYW5kcm9pZDphdXRob3JpdGllcz0idGVsZXBob255Y3RzdGVzdCIKQEAgLTExNiw2ICsxMjAsMTUgQEAKIAogICAgICAgICA8L3NlcnZpY2U+CiAKKyAgICAgICAgPHNlcnZpY2UgYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkJsb2NrZWROdW1iZXJTZXJ2aWNlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVVc2VyPSJ0cnVlIiA+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZWxlY29tLmN0cy5JbnNlcnRCbG9ja2VkTnVtYmVyIi8+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVsZWNvbS5jdHMuRGVsZXRlQmxvY2tlZE51bWJlciIvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L3NlcnZpY2U+CisKICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZWxlcGhvbnkuY3RzLlN0dWJEaWFsZXJBY3R2aXR5Ij4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uRElBTCIvPgpAQCAtMTI2LDEwICsxMzksMzggQEAKICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KICAgICAgICAgPC9hY3Rpdml0eT4KIAorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlbGVwaG9ueS5ldWljYy5jdHMuRXVpY2NUZXN0UmVzb2x1dGlvbkFjdGl2aXR5Ii8+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZWxlcGhvbnkuZXVpY2MuY3RzLkV1aWNjUmVzb2x1dGlvbkFjdGl2aXR5Ii8+CisKICAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CisKKworICAgICAgICA8IS0tIFRoaXMgaXMgdGhlIHJlY2VpdmVyIGRlZmluZWQgYnkgdGhlIE1CTVMgYXBpLiAtLT4KKyAgICAgICAgPHJlY2VpdmVyCisgICAgICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVsZXBob255Lm1ibXMuTWJtc0Rvd25sb2FkUmVjZWl2ZXIiCisgICAgICAgICAgICBhbmRyb2lkOnBlcm1pc3Npb249ImFuZHJvaWQudGVsZXBob255LmN0cy5lbWJtc3Rlc3RhcHAuQ1RTX0RPV05MT0FEX1BFUk1JU1NJT04iCisgICAgICAgICAgICBhbmRyb2lkOmVuYWJsZWQ9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIj4KKyAgICAgICAgPC9yZWNlaXZlcj4KKworICAgICAgICA8cHJvdmlkZXIKKyAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZWxlcGhvbnkubWJtcy5NYm1zVGVtcEZpbGVQcm92aWRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6YXV0aG9yaXRpZXM9ImFuZHJvaWQudGVsZXBob255Lm1ibXMuY3RzIgorICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0iZmFsc2UiCisgICAgICAgICAgICBhbmRyb2lkOmdyYW50VXJpUGVybWlzc2lvbnM9InRydWUiPgorICAgICAgICA8L3Byb3ZpZGVyPgorCisgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJtYm1zLXN0cmVhbWluZy1zZXJ2aWNlLW92ZXJyaWRlIgorICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmFsdWU9ImFuZHJvaWQudGVsZXBob255LmN0cy5lbWJtc3Rlc3RhcHAvLkN0c1N0cmVhbWluZ1NlcnZpY2UiLz4KKyAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9Im1ibXMtZG93bmxvYWQtc2VydmljZS1vdmVycmlkZSIKKyAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZhbHVlPSJhbmRyb2lkLnRlbGVwaG9ueS5jdHMuZW1ibXN0ZXN0YXBwLy5DdHNEb3dubG9hZFNlcnZpY2UiLz4KKyAgICAgICAgPG1ldGEtZGF0YQorICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJtYm1zLWZpbGUtcHJvdmlkZXItYXV0aG9yaXR5IgorICAgICAgICAgICAgYW5kcm9pZDp2YWx1ZT0iYW5kcm9pZC50ZWxlcGhvbnkubWJtcy5jdHMiLz4KICAgICA8L2FwcGxpY2F0aW9uPgogCi0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC50ZWxlcGhvbnkuY3RzIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIG9mIGFuZHJvaWQudGVsZXBob255Ij4KICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9Imxpc3RlbmVyIgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGVsZXBob255L0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9BbmRyb2lkVGVzdC54bWwKaW5kZXggNDFjZjdjZS4uNDM0ODZiOCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdGVsZXBob255L0FuZHJvaWRUZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy90ZWxlcGhvbnkvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgVGVsZXBob255IHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iYW5kcm9pZC50ZWxlcGhvbnkuY3RzLnByZWNvbmRpdGlvbnMuVGVsZXBob255UHJlcGFyZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImFwayIgdmFsdWU9IkN0c1RlbGVwaG9ueVByZXBhcmVyQXBwLmFwayIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJwYWNrYWdlIiB2YWx1ZT0iYW5kcm9pZC50ZWxlcGhvbnkuY3RzLnByZWNvbmRpdGlvbnMuYXBwIiAvPgpAQCAtMjUsOSArMjYsMTEgQEAKICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgogICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iQ3RzVGVsZXBob255VGVzdENhc2VzLmFwayIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IkVtYm1zTWlkZGxld2FyZUN0c1Rlc3RBcHAuYXBrIi8+CiAgICAgPC90YXJnZXRfcHJlcGFyZXI+CiAgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkFuZHJvaWRKVW5pdFRlc3QiID4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJwYWNrYWdlIiB2YWx1ZT0iYW5kcm9pZC50ZWxlcGhvbnkuY3RzIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImhpZGRlbi1hcGktY2hlY2tzIiB2YWx1ZT0iZmFsc2UiLz4KICAgICA8L3Rlc3Q+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5SdW5Db21tYW5kVGFyZ2V0UHJlcGFyZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bi1jb21tYW5kIiB2YWx1ZT0icG0gZGlzYWJsZSBjb20uZ29vZ2xlLmFuZHJvaWQuZGlhbGVyL2NvbS5hbmRyb2lkLnZvaWNlbWFpbC5pbXBsLlN0YXR1c0NoZWNrSm9iU2VydmljZSIgLz4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9FbWJtc01pZGRsZXdhcmVUZXN0QXBwL0FuZHJvaWQubWsgYi90ZXN0cy90ZXN0cy90ZWxlcGhvbnkvRW1ibXNNaWRkbGV3YXJlVGVzdEFwcC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiOWM5MTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy90ZWxlcGhvbnkvRW1ibXNNaWRkbGV3YXJlVGVzdEFwcC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjEgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCisjIEJ1aWxkIHRoZSBTYW1wbGUgRW1ibXMgU2VydmljZXMKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitzcmNfZGlycyA6PSBzcmMKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgJChzcmNfZGlycykpIFwKKyAgICAgICAgICAgICAgICAgICAkKGNhbGwgYWxsLUlhaWRsLWZpbGVzLXVuZGVyLCBhaWRsKQorCitMT0NBTF9BSURMX0lOQ0xVREVTIDo9IGFpZGwvCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBFbWJtc01pZGRsZXdhcmVDdHNUZXN0QXBwCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9TREtfVkVSU0lPTiA6PSB0ZXN0X2N1cnJlbnQKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKKworTE9DQUxfUFJPR1VBUkRfRU5BQkxFRCA6PSBkaXNhYmxlZAoraW5jbHVkZSAkKEJVSUxEX0NUU19QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGVsZXBob255L0VtYm1zTWlkZGxld2FyZVRlc3RBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9FbWJtc01pZGRsZXdhcmVUZXN0QXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVhMWJlMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9FbWJtc01pZGRsZXdhcmVUZXN0QXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSw0MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIHBhY2thZ2U9ImFuZHJvaWQudGVsZXBob255LmN0cy5lbWJtc3Rlc3RhcHAiPgorICA8cGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVsZXBob255LmN0cy5lbWJtc3Rlc3RhcHAuQ1RTX0RPV05MT0FEX1BFUk1JU1NJT04iCisgICAgICAgICAgICAgIGFuZHJvaWQucHJvdGVjdGlvbkxldmVsPSJzaWduYXR1cmUiLz4KKworICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZWxlcGhvbnkuY3RzLmVtYm1zLnBlcm1pc3Npb24uU0VORF9FTUJNU19JTlRFTlRTIi8+CisgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlbGVwaG9ueS5jdHMuZW1ibXN0ZXN0YXBwLkNUU19ET1dOTE9BRF9QRVJNSVNTSU9OIi8+CisKKyAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFiZWw9IkVtYm1zQ3RzTWlkZGxld2FyZSI+CisgICAgPHNlcnZpY2UgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlbGVwaG9ueS5jdHMuZW1ibXN0ZXN0YXBwLkN0c1N0cmVhbWluZ1NlcnZpY2UiCisgICAgICAgICAgICBhbmRyb2lkOmxhdW5jaE1vZGU9InNpbmdsZUluc3RhbmNlIj4KKyAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZWxlcGhvbnkuYWN0aW9uLkVtYm1zU3RyZWFtaW5nIiAvPgorICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZWxlcGhvbnkuY3RzLmVtYm1zdGVzdGFwcC5BQ1RJT05fQ09OVFJPTF9NSURETEVXQVJFIiAvPgorICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgIDwvc2VydmljZT4KKyAgICA8c2VydmljZSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVsZXBob255LmN0cy5lbWJtc3Rlc3RhcHAuQ3RzRG93bmxvYWRTZXJ2aWNlIgorICAgICAgICAgICAgIGFuZHJvaWQ6bGF1bmNoTW9kZT0ic2luZ2xlSW5zdGFuY2UiPgorICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlbGVwaG9ueS5hY3Rpb24uRW1ibXNEb3dubG9hZCIgLz4KKyAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVsZXBob255LmN0cy5lbWJtc3Rlc3RhcHAuQUNUSU9OX0NPTlRST0xfTUlERExFV0FSRSIgLz4KKyAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICA8L3NlcnZpY2U+CisgIDwvYXBwbGljYXRpb24+Cis8L21hbmlmZXN0PgorCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZWxlcGhvbnkvRW1ibXNNaWRkbGV3YXJlVGVzdEFwcC9haWRsL2FuZHJvaWQvdGVsZXBob255L2N0cy9lbWJtc3Rlc3RhcHAvSUN0c0Rvd25sb2FkTWlkZGxld2FyZUNvbnRyb2wuYWlkbCBiL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9FbWJtc01pZGRsZXdhcmVUZXN0QXBwL2FpZGwvYW5kcm9pZC90ZWxlcGhvbnkvY3RzL2VtYm1zdGVzdGFwcC9JQ3RzRG93bmxvYWRNaWRkbGV3YXJlQ29udHJvbC5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzM2FjNzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy90ZWxlcGhvbnkvRW1ibXNNaWRkbGV3YXJlVGVzdEFwcC9haWRsL2FuZHJvaWQvdGVsZXBob255L2N0cy9lbWJtc3Rlc3RhcHAvSUN0c0Rvd25sb2FkTWlkZGxld2FyZUNvbnRyb2wuYWlkbApAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQudGVsZXBob255LmN0cy5lbWJtc3Rlc3RhcHA7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5tYm1zLkRvd25sb2FkUmVxdWVzdDsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5tYm1zLkZpbGVJbmZvOworCitpbnRlcmZhY2UgSUN0c0Rvd25sb2FkTWlkZGxld2FyZUNvbnRyb2wgeworICAgIC8vIFJlc2V0cyB0aGUgc3RhdGUgb2YgdGhlIENUUyBtaWRkbGV3YXJlCisgICAgdm9pZCByZXNldCgpOworICAgIC8vIEdldCBhIGxpc3Qgb2YgY2FsbHMgbWFkZSB0byB0aGUgbWlkZGxld2FyZSBiaW5kZXIuCisgICAgLy8gTG9va3MgbGlrZSBMaXN0PExpc3Q8T2JqZWN0Pj4sIHdoZXJlIHRoZSBmaXJzdCBPYmplY3QgaXMgYWx3YXlzIGEgU3RyaW5nIGNvcnJlc3BvbmRpbmcgdG8KKyAgICAvLyB0aGUgbWV0aG9kIG5hbWUuCisgICAgTGlzdDxCdW5kbGU+IGdldERvd25sb2FkU2Vzc2lvbkNhbGxzKCk7CisgICAgLy8gRm9yY2UgYWxsIG1ldGhvZHMgdGhhdCBjYW4gcmV0dXJuIGFuIGVycm9yIHRvIHJldHVybiB0aGlzIGVycm9yLgorICAgIHZvaWQgZm9yY2VFcnJvckNvZGUoaW50IGVycm9yKTsKKyAgICAvLyBGaXJlIHRoZSBlcnJvciBjYWxsYmFjayBvbiB0aGUgZG93bmxvYWQgc2Vzc2lvbgorICAgIHZvaWQgZmlyZUVycm9yT25TZXNzaW9uKGludCBlcnJvckNvZGUsIFN0cmluZyBtZXNzYWdlKTsKKyAgICAvLyBGaXJlIHRoZSBkb3dubG9hZCBzdGF0ZSBjYWxsYmFjayBtZXRob2RzCisgICAgdm9pZCBmaXJlT25Qcm9ncmVzc1VwZGF0ZWQoaW4gRG93bmxvYWRSZXF1ZXN0IHJlcXVlc3QsIGluIEZpbGVJbmZvIGZpbGVJbmZvLAorICAgICAgICAgICAgaW50IGN1cnJlbnREb3dubG9hZFNpemUsIGludCBmdWxsRG93bmxvYWRTaXplLAorICAgICAgICAgICAgaW50IGN1cnJlbnREZWNvZGVkU2l6ZSwgaW50IGZ1bGxEZWNvZGVkU2l6ZSk7CisgICAgdm9pZCBmaXJlT25TdGF0ZVVwZGF0ZWQoaW4gRG93bmxvYWRSZXF1ZXN0IHJlcXVlc3QsIGluIEZpbGVJbmZvIGZpbGVJbmZvLCBpbnQgc3RhdGUpOworCisgICAgLy8gY2FsbGluZyBkb3dubG9hZCgpIGRvZXMgbm90aGluZywgdGhpcyBpcyB0byBhY3R1YWxseSBzdGFydCB0aGUgZmlsZS1kb3dubG9hZCBmbG93LgorICAgIHZvaWQgYWN0dWFsbHlTdGFydERvd25sb2FkRmxvdygpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9FbWJtc01pZGRsZXdhcmVUZXN0QXBwL2FpZGwvYW5kcm9pZC90ZWxlcGhvbnkvY3RzL2VtYm1zdGVzdGFwcC9JQ3RzU3RyZWFtaW5nTWlkZGxld2FyZUNvbnRyb2wuYWlkbCBiL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9FbWJtc01pZGRsZXdhcmVUZXN0QXBwL2FpZGwvYW5kcm9pZC90ZWxlcGhvbnkvY3RzL2VtYm1zdGVzdGFwcC9JQ3RzU3RyZWFtaW5nTWlkZGxld2FyZUNvbnRyb2wuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODgyZTIzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvdGVsZXBob255L0VtYm1zTWlkZGxld2FyZVRlc3RBcHAvYWlkbC9hbmRyb2lkL3RlbGVwaG9ueS9jdHMvZW1ibXN0ZXN0YXBwL0lDdHNTdHJlYW1pbmdNaWRkbGV3YXJlQ29udHJvbC5haWRsCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC50ZWxlcGhvbnkuY3RzLmVtYm1zdGVzdGFwcDsKKworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworCitpbnRlcmZhY2UgSUN0c1N0cmVhbWluZ01pZGRsZXdhcmVDb250cm9sIHsKKyAgICAvLyBSZXNldHMgdGhlIHN0YXRlIG9mIHRoZSBDVFMgbWlkZGxld2FyZQorICAgIHZvaWQgcmVzZXQoKTsKKyAgICAvLyBHZXQgYSBsaXN0IG9mIGNhbGxzIG1hZGUgdG8gdGhlIG1pZGRsZXdhcmUgYmluZGVyLgorICAgIC8vIExvb2tzIGxpa2UgTGlzdDxMaXN0PE9iamVjdD4+LCB3aGVyZSB0aGUgZmlyc3QgT2JqZWN0IGlzIGFsd2F5cyBhIFN0cmluZyBjb3JyZXNwb25kaW5nIHRvCisgICAgLy8gdGhlIG1ldGhvZCBuYW1lLgorICAgIExpc3QgZ2V0U3RyZWFtaW5nU2Vzc2lvbkNhbGxzKCk7CisgICAgLy8gRm9yY2UgYWxsIG1ldGhvZHMgdGhhdCBjYW4gcmV0dXJuIGFuIGVycm9yIHRvIHJldHVybiB0aGlzIGVycm9yLgorICAgIHZvaWQgZm9yY2VFcnJvckNvZGUoaW50IGVycm9yKTsKKyAgICAvLyBGaXJlIHRoZSBlcnJvciBjYWxsYmFjayBvbiB0aGUgY3VycmVudCBhY3RpdmUgc3RyZWFtCisgICAgdm9pZCBmaXJlRXJyb3JPblN0cmVhbShpbnQgZXJyb3JDb2RlLCBTdHJpbmcgbWVzc2FnZSk7CisgICAgLy8gRmlyZSB0aGUgZXJyb3IgY2FsbGJhY2sgb24gdGhlIHN0cmVhbWluZyBzZXNzaW9uCisgICAgdm9pZCBmaXJlRXJyb3JPblNlc3Npb24oaW50IGVycm9yQ29kZSwgU3RyaW5nIG1lc3NhZ2UpOworICAgIC8vIFRoZSBmb2xsb3dpbmcgZmlyZSBjYWxsYmFja3Mgb24gdGhlIGFjdGl2ZSBzdHJlYW0sIHVzaW5nIHRoZSBwcm92aWRlZCBhcmd1bWVudHMKKyAgICB2b2lkIGZpcmVPbk1lZGlhRGVzY3JpcHRpb25VcGRhdGVkKCk7CisgICAgdm9pZCBmaXJlT25Ccm9hZGNhc3RTaWduYWxTdHJlbmd0aFVwZGF0ZWQoaW50IHNpZ25hbFN0cmVuZ3RoKTsKKyAgICB2b2lkIGZpcmVPblN0cmVhbU1ldGhvZFVwZGF0ZWQoaW50IG1ldGhvZFR5cGUpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9FbWJtc01pZGRsZXdhcmVUZXN0QXBwL3NyYy9hbmRyb2lkL3RlbGVwaG9ueS9jdHMvZW1ibXN0ZXN0YXBwL0N0c0Rvd25sb2FkU2VydmljZS5qYXZhIGIvdGVzdHMvdGVzdHMvdGVsZXBob255L0VtYm1zTWlkZGxld2FyZVRlc3RBcHAvc3JjL2FuZHJvaWQvdGVsZXBob255L2N0cy9lbWJtc3Rlc3RhcHAvQ3RzRG93bmxvYWRTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA0NDdiOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9FbWJtc01pZGRsZXdhcmVUZXN0QXBwL3NyYy9hbmRyb2lkL3RlbGVwaG9ueS9jdHMvZW1ibXN0ZXN0YXBwL0N0c0Rvd25sb2FkU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsNDg1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQudGVsZXBob255LmN0cy5lbWJtc3Rlc3RhcHA7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5TZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255Lk1ibXNEb3dubG9hZFNlc3Npb247CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkubWJtcy5Eb3dubG9hZFByb2dyZXNzTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkubWJtcy5Eb3dubG9hZFJlcXVlc3Q7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkubWJtcy5Eb3dubG9hZFN0YXR1c0xpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255Lm1ibXMuRmlsZUluZm87CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkubWJtcy5GaWxlU2VydmljZUluZm87CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkubWJtcy5NYm1zRG93bmxvYWRTZXNzaW9uQ2FsbGJhY2s7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkubWJtcy5NYm1zRXJyb3JzOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255Lm1ibXMuVXJpUGF0aFBhaXI7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkubWJtcy52ZW5kb3IuTWJtc0Rvd25sb2FkU2VydmljZUJhc2U7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkubWJtcy52ZW5kb3IuVmVuZG9yVXRpbHM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworcHVibGljIGNsYXNzIEN0c0Rvd25sb2FkU2VydmljZSBleHRlbmRzIFNlcnZpY2UgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IEFMTE9XRURfUEFDS0FHRVMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCkge3sKKyAgICAgICAgYWRkKCJhbmRyb2lkLnRlbGVwaG9ueS5jdHMiKTsKKyAgICB9fTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkVtYm1zVGVzdERvd25sb2FkIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9OQU1FID0gIm1ldGhvZF9uYW1lIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfSU5JVElBTElaRSA9ICJpbml0aWFsaXplIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfUkVRVUVTVF9VUERBVEVfRklMRV9TRVJWSUNFUyA9CisgICAgICAgICAgICAicmVxdWVzdFVwZGF0ZUZpbGVTZXJ2aWNlcyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX1NFVF9URU1QX0ZJTEVfUk9PVCA9ICJzZXRUZW1wRmlsZVJvb3REaXJlY3RvcnkiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9SRVNFVF9ET1dOTE9BRF9LTk9XTEVER0UgPSAicmVzZXREb3dubG9hZEtub3dsZWRnZSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX0dFVF9ET1dOTE9BRF9TVEFUVVMgPSAiZ2V0RG93bmxvYWRTdGF0dXMiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9DQU5DRUxfRE9XTkxPQUQgPSAiY2FuY2VsRG93bmxvYWQiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9DTE9TRSA9ICJjbG9zZSI7CisgICAgLy8gTm90IGEgbWV0aG9kIGNhbGwsIGJ1dCBpdCdzIGEgZm9ybSBvZiBjb21tdW5pY2F0aW9uIHRvIHRoZSBtaWRkbGV3YXJlIHNvIGl0J3MgaW5jbHVkZWQKKyAgICAvLyBoZXJlIGZvciBjb252ZW5pZW5jZS4KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfRE9XTkxPQURfUkVTVUxUX0FDSyA9ICJkb3dubG9hZFJlc3VsdEFjayI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdVTUVOVF9TVUJTQ1JJUFRJT05fSUQgPSAic3Vic2NyaXB0aW9uSWQiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR1VNRU5UX1NFUlZJQ0VfQ0xBU1NFUyA9ICJzZXJ2aWNlQ2xhc3NlcyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJHVU1FTlRfUk9PVF9ESVJFQ1RPUllfUEFUSCA9ICJyb290RGlyZWN0b3J5UGF0aCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJHVU1FTlRfRE9XTkxPQURfUkVRVUVTVCA9ICJkb3dubG9hZFJlcXVlc3QiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR1VNRU5UX0ZJTEVfSU5GTyA9ICJmaWxlSW5mbyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJHVU1FTlRfUkVTVUxUX0NPREUgPSAicmVzdWx0Q29kZSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05UUk9MX0lOVEVSRkFDRV9BQ1RJT04gPQorICAgICAgICAgICAgImFuZHJvaWQudGVsZXBob255LmN0cy5lbWJtc3Rlc3RhcHAuQUNUSU9OX0NPTlRST0xfTUlERExFV0FSRSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wb25lbnROYW1lIENPTlRST0xfSU5URVJGQUNFX0NPTVBPTkVOVCA9CisgICAgICAgICAgICBDb21wb25lbnROYW1lLnVuZmxhdHRlbkZyb21TdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLnRlbGVwaG9ueS5jdHMuZW1ibXN0ZXN0YXBwLy5DdHNEb3dubG9hZFNlcnZpY2UiKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBvbmVudE5hbWUgQ1RTX1RFU1RfUkVDRUlWRVJfQ09NUE9ORU5UID0KKyAgICAgICAgICAgIENvbXBvbmVudE5hbWUudW5mbGF0dGVuRnJvbVN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQudGVsZXBob255LmN0cy9hbmRyb2lkLnRlbGVwaG9ueS5tYm1zLk1ibXNEb3dubG9hZFJlY2VpdmVyIik7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBET1dOTE9BRF9TT1VSQ0VfVVJJX1JPT1QgPQorICAgICAgICAgICAgVXJpLnBhcnNlKCJodHRwOi8vd3d3LmV4YW1wbGUuY29tL2ZpbGVfZG93bmxvYWQiKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEZpbGVTZXJ2aWNlSW5mbyBGSUxFX1NFUlZJQ0VfSU5GTzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEZpbGVJbmZvIEZJTEVfSU5GT18xID0gbmV3IEZpbGVJbmZvKAorICAgICAgICAgICAgRE9XTkxPQURfU09VUkNFX1VSSV9ST09ULmJ1aWxkVXBvbigpLmFwcGVuZFBhdGgoImZpbGUxLnR4dCIpLmJ1aWxkKCksCisgICAgICAgICAgICAidGV4dC9wbGFpbiIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRmlsZUluZm8gRklMRV9JTkZPXzIgPSBuZXcgRmlsZUluZm8oCisgICAgICAgICAgICBET1dOTE9BRF9TT1VSQ0VfVVJJX1JPT1QuYnVpbGRVcG9uKCkuYXBwZW5kUGF0aCgic3ViX2RpcjEiKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kUGF0aCgic3ViX2RpcjIiKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kUGF0aCgiZmlsZTIudHh0IikKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCksCisgICAgICAgICAgICAidGV4dC9wbGFpbiIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIFNBTVBMRV9GSUxFX0RBVEEgPSAidGhpcyBpcyBzb21lIHNhbXBsZSBmaWxlIGRhdGEiLmdldEJ5dGVzKCk7CisKKyAgICAvLyBEZWZpbmUgYWxsb3dlZCBzb3VyY2UgVVJJcyBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gZG8gdGhlIHByZWZpeCBtYXRjaGluZyBjYWxjdWxhdGlvbgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIFNPVVJDRV9VUklfMSA9IERPV05MT0FEX1NPVVJDRV9VUklfUk9PVC5idWlsZFVwb24oKQorICAgICAgICAgICAgLmFwcGVuZFBhdGgoImZpbGUxLnR4dCIpLmJ1aWxkKCk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgU09VUkNFX1VSSV8yID0gRE9XTkxPQURfU09VUkNFX1VSSV9ST09ULmJ1aWxkVXBvbigpCisgICAgICAgICAgICAuYXBwZW5kUGF0aCgic3ViX2RpcjEiKS5hcHBlbmRQYXRoKCIqIikuYnVpbGQoKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBTT1VSQ0VfVVJJXzMgPSBET1dOTE9BRF9TT1VSQ0VfVVJJX1JPT1QuYnVpbGRVcG9uKCkKKyAgICAgICAgICAgIC5hcHBlbmRQYXRoKCIqIikuYnVpbGQoKTsKKworICAgIHN0YXRpYyB7CisgICAgICAgIFN0cmluZyBpZCA9ICJ1cm46M0dQUDpzZXJ2aWNlXzAtMCI7CisgICAgICAgIE1hcDxMb2NhbGUsIFN0cmluZz4gbG9jYWxlRGljdCA9IG5ldyBIYXNoTWFwPExvY2FsZSwgU3RyaW5nPigpIHt7CisgICAgICAgICAgICBwdXQoTG9jYWxlLlVTLCAiRW50ZXJ0YWlubWVudCBTb3VyY2UgMSIpOworICAgICAgICAgICAgcHV0KExvY2FsZS5DQU5BREEsICJFbnRlcnRhaW5tZW50IFNvdXJjZSAxLCBlaD8iKTsKKyAgICAgICAgfX07CisgICAgICAgIExpc3Q8TG9jYWxlPiBsb2NhbGVzID0gbmV3IEFycmF5TGlzdDxMb2NhbGU+KCkge3sKKyAgICAgICAgICAgIGFkZChMb2NhbGUuQ0FOQURBKTsKKyAgICAgICAgICAgIGFkZChMb2NhbGUuVVMpOworICAgICAgICB9fTsKKyAgICAgICAgTGlzdDxGaWxlSW5mbz4gZmlsZXMgPSBuZXcgQXJyYXlMaXN0PEZpbGVJbmZvPigpIHt7CisgICAgICAgICAgICBhZGQoRklMRV9JTkZPXzEpOworICAgICAgICAgICAgYWRkKEZJTEVfSU5GT18yKTsKKyAgICAgICAgfX07CisgICAgICAgIEZJTEVfU0VSVklDRV9JTkZPID0gbmV3IEZpbGVTZXJ2aWNlSW5mbyhsb2NhbGVEaWN0LCAiY2xhc3MxIiwgbG9jYWxlcywKKyAgICAgICAgICAgICAgICBpZCwgbmV3IERhdGUoMjAxNywgOCwgMjEsIDE4LCAyMCwgMjkpLAorICAgICAgICAgICAgICAgIG5ldyBEYXRlKDIwMTcsIDgsIDIxLCAxOCwgMjMsIDkpLCBmaWxlcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBNYm1zRG93bmxvYWRTZXNzaW9uQ2FsbGJhY2sgbUFwcENhbGxiYWNrOworICAgIHByaXZhdGUgRG93bmxvYWRTdGF0dXNMaXN0ZW5lciBtRG93bmxvYWRTdGF0dXNMaXN0ZW5lcjsKKyAgICBwcml2YXRlIERvd25sb2FkUHJvZ3Jlc3NMaXN0ZW5lciBtRG93bmxvYWRQcm9ncmVzc0xpc3RlbmVyOworCisgICAgcHJpdmF0ZSBIYW5kbGVyVGhyZWFkIG1IYW5kbGVyVGhyZWFkOworICAgIHByaXZhdGUgSGFuZGxlciBtSGFuZGxlcjsKKyAgICBwcml2YXRlIExpc3Q8QnVuZGxlPiBtUmVjZWl2ZWRDYWxscyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICBwcml2YXRlIGludCBtRXJyb3JDb2RlT3ZlcnJpZGUgPSBNYm1zRXJyb3JzLlNVQ0NFU1M7CisgICAgcHJpdmF0ZSBMaXN0PERvd25sb2FkUmVxdWVzdD4gbVJlY2VpdmVkUmVxdWVzdHMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgcHJpdmF0ZSBTdHJpbmcgbVRlbXBGaWxlUm9vdERpclBhdGggPSBudWxsOworCisgICAgcHJpdmF0ZSBmaW5hbCBNYm1zRG93bmxvYWRTZXJ2aWNlQmFzZSBtRG93bmxvYWRTZXJ2aWNlSW1wbCA9IG5ldyBNYm1zRG93bmxvYWRTZXJ2aWNlQmFzZSgpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgaW5pdGlhbGl6ZShpbnQgc3Vic2NyaXB0aW9uSWQsIE1ibXNEb3dubG9hZFNlc3Npb25DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICAgICAgQnVuZGxlIGIgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgICAgICBiLnB1dFN0cmluZyhNRVRIT0RfTkFNRSwgTUVUSE9EX0lOSVRJQUxJWkUpOworICAgICAgICAgICAgYi5wdXRJbnQoQVJHVU1FTlRfU1VCU0NSSVBUSU9OX0lELCBzdWJzY3JpcHRpb25JZCk7CisgICAgICAgICAgICBtUmVjZWl2ZWRDYWxscy5hZGQoYik7CisKKyAgICAgICAgICAgIGlmIChtRXJyb3JDb2RlT3ZlcnJpZGUgIT0gTWJtc0Vycm9ycy5TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1FcnJvckNvZGVPdmVycmlkZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IHBhY2thZ2VVaWQgPSBCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpOworICAgICAgICAgICAgU3RyaW5nW10gcGFja2FnZU5hbWVzID0gZ2V0UGFja2FnZU1hbmFnZXIoKS5nZXRQYWNrYWdlc0ZvclVpZChwYWNrYWdlVWlkKTsKKyAgICAgICAgICAgIGlmIChwYWNrYWdlTmFtZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBNYm1zRXJyb3JzLkluaXRpYWxpemF0aW9uRXJyb3JzLkVSUk9SX0FQUF9QRVJNSVNTSU9OU19OT1RfR1JBTlRFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJvb2xlYW4gaXNVaWRBbGxvd2VkID0gQXJyYXlzLnN0cmVhbShwYWNrYWdlTmFtZXMpLmFueU1hdGNoKEFMTE9XRURfUEFDS0FHRVM6OmNvbnRhaW5zKTsKKyAgICAgICAgICAgIGlmICghaXNVaWRBbGxvd2VkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE1ibXNFcnJvcnMuSW5pdGlhbGl6YXRpb25FcnJvcnMuRVJST1JfQVBQX1BFUk1JU1NJT05TX05PVF9HUkFOVEVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtSGFuZGxlci5wb3N0KCgpIC0+IHsKKyAgICAgICAgICAgICAgICBpZiAobUFwcENhbGxiYWNrID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUFwcENhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25FcnJvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYm1zRXJyb3JzLkluaXRpYWxpemF0aW9uRXJyb3JzLkVSUk9SX0RVUExJQ0FURV9JTklUSUFMSVpFLCAiIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FsbGJhY2sub25NaWRkbGV3YXJlUmVhZHkoKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcmV0dXJuIE1ibXNFcnJvcnMuU1VDQ0VTUzsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IHJlcXVlc3RVcGRhdGVGaWxlU2VydmljZXMoaW50IHN1YnNjcmlwdGlvbklkLCBMaXN0PFN0cmluZz4gc2VydmljZUNsYXNzZXMpIHsKKyAgICAgICAgICAgIEJ1bmRsZSBiID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgYi5wdXRTdHJpbmcoTUVUSE9EX05BTUUsIE1FVEhPRF9SRVFVRVNUX1VQREFURV9GSUxFX1NFUlZJQ0VTKTsKKyAgICAgICAgICAgIGIucHV0SW50KEFSR1VNRU5UX1NVQlNDUklQVElPTl9JRCwgc3Vic2NyaXB0aW9uSWQpOworICAgICAgICAgICAgYi5wdXRTdHJpbmdBcnJheUxpc3QoQVJHVU1FTlRfU0VSVklDRV9DTEFTU0VTLCBuZXcgQXJyYXlMaXN0PD4oc2VydmljZUNsYXNzZXMpKTsKKyAgICAgICAgICAgIG1SZWNlaXZlZENhbGxzLmFkZChiKTsKKworICAgICAgICAgICAgaWYgKG1FcnJvckNvZGVPdmVycmlkZSAhPSBNYm1zRXJyb3JzLlNVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbUVycm9yQ29kZU92ZXJyaWRlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMaXN0PEZpbGVTZXJ2aWNlSW5mbz4gc2VydmljZUluZm9zID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChGSUxFX1NFUlZJQ0VfSU5GTyk7CisKKyAgICAgICAgICAgIG1IYW5kbGVyLnBvc3QoKCkgLT4geworICAgICAgICAgICAgICAgIGlmIChtQXBwQ2FsbGJhY2shPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1BcHBDYWxsYmFjay5vbkZpbGVTZXJ2aWNlc1VwZGF0ZWQoc2VydmljZUluZm9zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgcmV0dXJuIE1ibXNFcnJvcnMuU1VDQ0VTUzsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGRvd25sb2FkKERvd25sb2FkUmVxdWVzdCBkb3dubG9hZFJlcXVlc3QpIHsKKyAgICAgICAgICAgIG1SZWNlaXZlZFJlcXVlc3RzLmFkZChkb3dubG9hZFJlcXVlc3QpOworICAgICAgICAgICAgcmV0dXJuIE1ibXNFcnJvcnMuU1VDQ0VTUzsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IHNldFRlbXBGaWxlUm9vdERpcmVjdG9yeShpbnQgc3Vic2NyaXB0aW9uSWQsIFN0cmluZyByb290RGlyZWN0b3J5UGF0aCkgeworICAgICAgICAgICAgaWYgKG1FcnJvckNvZGVPdmVycmlkZSAhPSBNYm1zRXJyb3JzLlNVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbUVycm9yQ29kZU92ZXJyaWRlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBCdW5kbGUgYiA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgICAgIGIucHV0U3RyaW5nKE1FVEhPRF9OQU1FLCBNRVRIT0RfU0VUX1RFTVBfRklMRV9ST09UKTsKKyAgICAgICAgICAgIGIucHV0SW50KEFSR1VNRU5UX1NVQlNDUklQVElPTl9JRCwgc3Vic2NyaXB0aW9uSWQpOworICAgICAgICAgICAgYi5wdXRTdHJpbmcoQVJHVU1FTlRfUk9PVF9ESVJFQ1RPUllfUEFUSCwgcm9vdERpcmVjdG9yeVBhdGgpOworICAgICAgICAgICAgbVJlY2VpdmVkQ2FsbHMuYWRkKGIpOworICAgICAgICAgICAgbVRlbXBGaWxlUm9vdERpclBhdGggPSByb290RGlyZWN0b3J5UGF0aDsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgYWRkUHJvZ3Jlc3NMaXN0ZW5lcihEb3dubG9hZFJlcXVlc3QgZG93bmxvYWRSZXF1ZXN0LAorICAgICAgICAgICAgICAgIERvd25sb2FkUHJvZ3Jlc3NMaXN0ZW5lciBsaXN0ZW5lcikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICBtRG93bmxvYWRQcm9ncmVzc0xpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgICAgICAgICByZXR1cm4gTWJtc0Vycm9ycy5TVUNDRVNTOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgYWRkU3RhdHVzTGlzdGVuZXIoRG93bmxvYWRSZXF1ZXN0IGRvd25sb2FkUmVxdWVzdCwKKyAgICAgICAgICAgICAgICBEb3dubG9hZFN0YXR1c0xpc3RlbmVyIGxpc3RlbmVyKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIG1Eb3dubG9hZFN0YXR1c0xpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgICAgICAgICByZXR1cm4gTWJtc0Vycm9ycy5TVUNDRVNTOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoaW50IHN1YnNjcmlwdGlvbklkKSB7CisgICAgICAgICAgICBCdW5kbGUgYiA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgICAgIGIucHV0U3RyaW5nKE1FVEhPRF9OQU1FLCBNRVRIT0RfQ0xPU0UpOworICAgICAgICAgICAgYi5wdXRJbnQoQVJHVU1FTlRfU1VCU0NSSVBUSU9OX0lELCBzdWJzY3JpcHRpb25JZCk7CisgICAgICAgICAgICBtUmVjZWl2ZWRDYWxscy5hZGQoYik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCByZXF1ZXN0RG93bmxvYWRTdGF0ZShEb3dubG9hZFJlcXVlc3QgZG93bmxvYWRSZXF1ZXN0LCBGaWxlSW5mbyBmaWxlSW5mbykgeworICAgICAgICAgICAgQnVuZGxlIGIgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgICAgICBiLnB1dFN0cmluZyhNRVRIT0RfTkFNRSwgTUVUSE9EX0dFVF9ET1dOTE9BRF9TVEFUVVMpOworICAgICAgICAgICAgYi5wdXRQYXJjZWxhYmxlKEFSR1VNRU5UX0RPV05MT0FEX1JFUVVFU1QsIGRvd25sb2FkUmVxdWVzdCk7CisgICAgICAgICAgICBiLnB1dFBhcmNlbGFibGUoQVJHVU1FTlRfRklMRV9JTkZPLCBmaWxlSW5mbyk7CisgICAgICAgICAgICBtUmVjZWl2ZWRDYWxscy5hZGQoYik7CisgICAgICAgICAgICByZXR1cm4gTWJtc0Rvd25sb2FkU2Vzc2lvbi5TVEFUVVNfQUNUSVZFTFlfRE9XTkxPQURJTkc7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBjYW5jZWxEb3dubG9hZChEb3dubG9hZFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICAgICAgQnVuZGxlIGIgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgICAgICBiLnB1dFN0cmluZyhNRVRIT0RfTkFNRSwgTUVUSE9EX0NBTkNFTF9ET1dOTE9BRCk7CisgICAgICAgICAgICBiLnB1dFBhcmNlbGFibGUoQVJHVU1FTlRfRE9XTkxPQURfUkVRVUVTVCwgcmVxdWVzdCk7CisgICAgICAgICAgICBtUmVjZWl2ZWRDYWxscy5hZGQoYik7CisgICAgICAgICAgICBtUmVjZWl2ZWRSZXF1ZXN0cy5yZW1vdmUocmVxdWVzdCk7CisgICAgICAgICAgICByZXR1cm4gTWJtc0Vycm9ycy5TVUNDRVNTOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBMaXN0PERvd25sb2FkUmVxdWVzdD4gbGlzdFBlbmRpbmdEb3dubG9hZHMoaW50IHN1YnNjcmlwdGlvbklkKSB7CisgICAgICAgICAgICByZXR1cm4gbVJlY2VpdmVkUmVxdWVzdHM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCByZW1vdmVTdGF0dXNMaXN0ZW5lcihEb3dubG9hZFJlcXVlc3QgZG93bmxvYWRSZXF1ZXN0LAorICAgICAgICAgICAgICAgIERvd25sb2FkU3RhdHVzTGlzdGVuZXIgY2FsbGJhY2spIHsKKyAgICAgICAgICAgIG1Eb3dubG9hZFN0YXR1c0xpc3RlbmVyID0gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiBNYm1zRXJyb3JzLlNVQ0NFU1M7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCByZXNldERvd25sb2FkS25vd2xlZGdlKERvd25sb2FkUmVxdWVzdCBkb3dubG9hZFJlcXVlc3QpIHsKKyAgICAgICAgICAgIEJ1bmRsZSBiID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgYi5wdXRTdHJpbmcoTUVUSE9EX05BTUUsIE1FVEhPRF9SRVNFVF9ET1dOTE9BRF9LTk9XTEVER0UpOworICAgICAgICAgICAgYi5wdXRQYXJjZWxhYmxlKEFSR1VNRU5UX0RPV05MT0FEX1JFUVVFU1QsIGRvd25sb2FkUmVxdWVzdCk7CisgICAgICAgICAgICBtUmVjZWl2ZWRDYWxscy5hZGQoYik7CisgICAgICAgICAgICByZXR1cm4gTWJtc0Vycm9ycy5TVUNDRVNTOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQXBwQ2FsbGJhY2tEaWVkKGludCB1aWQsIGludCBzdWJzY3JpcHRpb25JZCkgeworICAgICAgICAgICAgbUFwcENhbGxiYWNrID0gbnVsbDsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIGZpbmFsIElCaW5kZXIgbUNvbnRyb2xJbnRlcmZhY2UgPSBuZXcgSUN0c0Rvd25sb2FkTWlkZGxld2FyZUNvbnRyb2wuU3R1YigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgeworICAgICAgICAgICAgbVJlY2VpdmVkQ2FsbHMuY2xlYXIoKTsKKyAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZUNhbGxiYWNrc0FuZE1lc3NhZ2VzKG51bGwpOworICAgICAgICAgICAgbUFwcENhbGxiYWNrID0gbnVsbDsKKyAgICAgICAgICAgIG1FcnJvckNvZGVPdmVycmlkZSA9IE1ibXNFcnJvcnMuU1VDQ0VTUzsKKyAgICAgICAgICAgIG1SZWNlaXZlZFJlcXVlc3RzLmNsZWFyKCk7CisgICAgICAgICAgICBtRG93bmxvYWRTdGF0dXNMaXN0ZW5lciA9IG51bGw7CisgICAgICAgICAgICBtVGVtcEZpbGVSb290RGlyUGF0aCA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIExpc3Q8QnVuZGxlPiBnZXREb3dubG9hZFNlc3Npb25DYWxscygpIHsKKyAgICAgICAgICAgIHJldHVybiBtUmVjZWl2ZWRDYWxsczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmb3JjZUVycm9yQ29kZShpbnQgZXJyb3IpIHsKKyAgICAgICAgICAgIG1FcnJvckNvZGVPdmVycmlkZSA9IGVycm9yOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpcmVFcnJvck9uU2Vzc2lvbihpbnQgZXJyb3JDb2RlLCBTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICAgICAgbUhhbmRsZXIucG9zdCgoKSAtPiBtQXBwQ2FsbGJhY2sub25FcnJvcihlcnJvckNvZGUsIG1lc3NhZ2UpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaXJlT25Qcm9ncmVzc1VwZGF0ZWQoRG93bmxvYWRSZXF1ZXN0IHJlcXVlc3QsIEZpbGVJbmZvIGZpbGVJbmZvLAorICAgICAgICAgICAgICAgIGludCBjdXJyZW50RG93bmxvYWRTaXplLCBpbnQgZnVsbERvd25sb2FkU2l6ZSwKKyAgICAgICAgICAgICAgICBpbnQgY3VycmVudERlY29kZWRTaXplLCBpbnQgZnVsbERlY29kZWRTaXplKSB7CisgICAgICAgICAgICBpZiAobURvd25sb2FkU3RhdHVzTGlzdGVuZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1IYW5kbGVyLnBvc3QoKCkgLT4gbURvd25sb2FkUHJvZ3Jlc3NMaXN0ZW5lci5vblByb2dyZXNzVXBkYXRlZChyZXF1ZXN0LCBmaWxlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudERvd25sb2FkU2l6ZSwgZnVsbERvd25sb2FkU2l6ZSwgY3VycmVudERlY29kZWRTaXplLCBmdWxsRGVjb2RlZFNpemUpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaXJlT25TdGF0ZVVwZGF0ZWQoRG93bmxvYWRSZXF1ZXN0IHJlcXVlc3QsIEZpbGVJbmZvIGZpbGVJbmZvLCBpbnQgc3RhdGUpIHsKKyAgICAgICAgICAgIGlmIChtRG93bmxvYWRTdGF0dXNMaXN0ZW5lciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUhhbmRsZXIucG9zdCgoKSAtPiBtRG93bmxvYWRTdGF0dXNMaXN0ZW5lci5vblN0YXR1c1VwZGF0ZWQocmVxdWVzdCwgZmlsZUluZm8sIHN0YXRlKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgYWN0dWFsbHlTdGFydERvd25sb2FkRmxvdygpIHsKKyAgICAgICAgICAgIERvd25sb2FkUmVxdWVzdCByZXF1ZXN0ID0gbVJlY2VpdmVkUmVxdWVzdHMuZ2V0KDApOworICAgICAgICAgICAgTGlzdDxGaWxlSW5mbz4gcmVxdWVzdGVkRmlsZXMgPSBnZXRSZXF1ZXN0ZWRGaWxlcyhyZXF1ZXN0KTsKKyAgICAgICAgICAgIC8vIENvbXBvc2UgdGhlIEZJTEVfREVTQ1JJUFRPUl9SRVFVRVNUX0lOVEVOVCB0byBnZXQgc29tZSBGRHMgdG8gd3JpdGUgdG8KKyAgICAgICAgICAgIEludGVudCByZXF1ZXN0SW50ZW50ID0gbmV3IEludGVudChWZW5kb3JVdGlscy5BQ1RJT05fRklMRV9ERVNDUklQVE9SX1JFUVVFU1QpOworICAgICAgICAgICAgcmVxdWVzdEludGVudC5wdXRFeHRyYShWZW5kb3JVdGlscy5FWFRSQV9TRVJWSUNFX0lELCByZXF1ZXN0LmdldEZpbGVTZXJ2aWNlSWQoKSk7CisKKyAgICAgICAgICAgIHJlcXVlc3RJbnRlbnQucHV0RXh0cmEoVmVuZG9yVXRpbHMuRVhUUkFfRkRfQ09VTlQsIHJlcXVlc3RlZEZpbGVzLnNpemUoKSk7CisgICAgICAgICAgICByZXF1ZXN0SW50ZW50LnB1dEV4dHJhKFZlbmRvclV0aWxzLkVYVFJBX1RFTVBfRklMRV9ST09ULCBtVGVtcEZpbGVSb290RGlyUGF0aCk7CisgICAgICAgICAgICByZXF1ZXN0SW50ZW50LnNldENvbXBvbmVudChDVFNfVEVTVF9SRUNFSVZFUl9DT01QT05FTlQpOworCisgICAgICAgICAgICAvLyBTZW5kIGFzIGFuIG9yZGVyZWQgYnJvYWRjYXN0LCB1c2luZyBhIEJyb2FkY2FzdFJlY2VpdmVyIHRvIGNhcHR1cmUgdGhlIHJlc3VsdAorICAgICAgICAgICAgLy8gY29udGFpbmluZyBVcmlQYXRoUGFpcnMuCisgICAgICAgICAgICBsb2dkKCJTZW5kaW5nIGZkLXJlcXVlc3QgYnJvYWRjYXN0Iik7CisgICAgICAgICAgICBzZW5kT3JkZXJlZEJyb2FkY2FzdChyZXF1ZXN0SW50ZW50LAorICAgICAgICAgICAgICAgICAgICBudWxsLCAvLyByZWNlaXZlclBlcm1pc3Npb24KKyAgICAgICAgICAgICAgICAgICAgbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZCgiR290IGZpbGUtZGVzY3JpcHRvcnMiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdW5kbGUgZXh0cmFzID0gZ2V0UmVzdWx0RXh0cmFzKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PFVyaVBhdGhQYWlyPiB0ZW1wRmlsZXMgPSBleHRyYXMuZ2V0UGFyY2VsYWJsZUFycmF5TGlzdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlbmRvclV0aWxzLkVYVFJBX0ZSRUVfVVJJX0xJU1QpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZW1wRmlsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXJpUGF0aFBhaXIgdGVtcEZpbGUgPSB0ZW1wRmlsZXMuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlSW5mbyByZXF1ZXN0ZWRGaWxlID0gcmVxdWVzdGVkRmlsZXMuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVzdWx0ID0gd3JpdGVDb250ZW50c1RvVGVtcEZpbGUodGVtcEZpbGUpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVudCBkb3dubG9hZFJlc3VsdEludGVudCA9IGNvbXBvc2VEb3dubG9hZFJlc3VsdEludGVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wRmlsZSwgcmVxdWVzdCwgcmVzdWx0LCByZXF1ZXN0ZWRGaWxlKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dkKCJTZW5kaW5nIGJyb2FkY2FzdCB0byBhcHA6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGRvd25sb2FkUmVzdWx0SW50ZW50LnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kT3JkZXJlZEJyb2FkY2FzdChkb3dubG9hZFJlc3VsdEludGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCAvLyByZWNlaXZlclBlcm1pc3Npb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdW5kbGUgYiA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIucHV0U3RyaW5nKE1FVEhPRF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRVRIT0RfRE9XTkxPQURfUkVTVUxUX0FDSyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLnB1dEludChBUkdVTUVOVF9SRVNVTFRfQ09ERSwgZ2V0UmVzdWx0Q29kZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZWNlaXZlZENhbGxzLmFkZChiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgLy8gc2NoZWR1bGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHkuUkVTVUxUX09LLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIC8vIGluaXRpYWxEYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiBpbml0aWFsRXh0cmFzICovKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgbUhhbmRsZXIsIC8vIHNjaGVkdWxlcgorICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eS5SRVNVTFRfT0ssCisgICAgICAgICAgICAgICAgICAgIG51bGwsIC8vIGluaXRpYWxEYXRhCisgICAgICAgICAgICAgICAgICAgIG51bGwgLyogaW5pdGlhbEV4dHJhcyAqLyk7CisKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIExpc3Q8RmlsZUluZm8+IGdldFJlcXVlc3RlZEZpbGVzKERvd25sb2FkUmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIGlmIChTT1VSQ0VfVVJJXzEuZXF1YWxzKHJlcXVlc3QuZ2V0U291cmNlVXJpKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChGSUxFX0lORk9fMSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFNPVVJDRV9VUklfMi5lcXVhbHMocmVxdWVzdC5nZXRTb3VyY2VVcmkoKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KEZJTEVfSU5GT18yKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoU09VUkNFX1VSSV8zLmVxdWFscyhyZXF1ZXN0LmdldFNvdXJjZVVyaSgpKSkgeworICAgICAgICAgICAgcmV0dXJuIEZJTEVfU0VSVklDRV9JTkZPLmdldEZpbGVzKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworICAgIH0KKworICAgIHByaXZhdGUgSW50ZW50IGNvbXBvc2VEb3dubG9hZFJlc3VsdEludGVudChVcmlQYXRoUGFpciB0ZW1wRmlsZSwgRG93bmxvYWRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICBpbnQgcmVzdWx0LCBGaWxlSW5mbyBkb3dubG9hZGVkRmlsZSkgeworICAgICAgICBJbnRlbnQgZG93bmxvYWRSZXN1bHRJbnRlbnQgPQorICAgICAgICAgICAgICAgIG5ldyBJbnRlbnQoVmVuZG9yVXRpbHMuQUNUSU9OX0RPV05MT0FEX1JFU1VMVF9JTlRFUk5BTCk7CisgICAgICAgIGRvd25sb2FkUmVzdWx0SW50ZW50LnB1dEV4dHJhKAorICAgICAgICAgICAgICAgIE1ibXNEb3dubG9hZFNlc3Npb24uRVhUUkFfTUJNU19ET1dOTE9BRF9SRVFVRVNULCByZXF1ZXN0KTsKKyAgICAgICAgZG93bmxvYWRSZXN1bHRJbnRlbnQucHV0RXh0cmEoVmVuZG9yVXRpbHMuRVhUUkFfRklOQUxfVVJJLAorICAgICAgICAgICAgICAgIHRlbXBGaWxlLmdldEZpbGVQYXRoVXJpKCkpOworICAgICAgICBkb3dubG9hZFJlc3VsdEludGVudC5wdXRFeHRyYSgKKyAgICAgICAgICAgICAgICBNYm1zRG93bmxvYWRTZXNzaW9uLkVYVFJBX01CTVNfRklMRV9JTkZPLCBkb3dubG9hZGVkRmlsZSk7CisgICAgICAgIGRvd25sb2FkUmVzdWx0SW50ZW50LnB1dEV4dHJhKFZlbmRvclV0aWxzLkVYVFJBX1RFTVBfRklMRV9ST09ULAorICAgICAgICAgICAgICAgIG1UZW1wRmlsZVJvb3REaXJQYXRoKTsKKyAgICAgICAgZG93bmxvYWRSZXN1bHRJbnRlbnQucHV0RXh0cmEoCisgICAgICAgICAgICAgICAgTWJtc0Rvd25sb2FkU2Vzc2lvbi5FWFRSQV9NQk1TX0RPV05MT0FEX1JFU1VMVCwgcmVzdWx0KTsKKyAgICAgICAgZG93bmxvYWRSZXN1bHRJbnRlbnQuc2V0Q29tcG9uZW50KENUU19URVNUX1JFQ0VJVkVSX0NPTVBPTkVOVCk7CisgICAgICAgIHJldHVybiBkb3dubG9hZFJlc3VsdEludGVudDsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCB3cml0ZUNvbnRlbnRzVG9UZW1wRmlsZShVcmlQYXRoUGFpciB0ZW1wRmlsZSkgeworICAgICAgICBpbnQgcmVzdWx0ID0gTWJtc0Rvd25sb2FkU2Vzc2lvbi5SRVNVTFRfU1VDQ0VTU0ZVTDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHRlbXBGaWxlRmQgPQorICAgICAgICAgICAgICAgICAgICBnZXRDb250ZW50UmVzb2x2ZXIoKS5vcGVuRmlsZURlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcEZpbGUuZ2V0Q29udGVudFVyaSgpLCAicnciKTsKKyAgICAgICAgICAgIE91dHB1dFN0cmVhbSBkZXN0aW5hdGlvblN0cmVhbSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBQYXJjZWxGaWxlRGVzY3JpcHRvci5BdXRvQ2xvc2VPdXRwdXRTdHJlYW0odGVtcEZpbGVGZCk7CisKKyAgICAgICAgICAgIGRlc3RpbmF0aW9uU3RyZWFtLndyaXRlKFNBTVBMRV9GSUxFX0RBVEEpOworICAgICAgICAgICAgZGVzdGluYXRpb25TdHJlYW0uZmx1c2goKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmVzdWx0ID0gTWJtc0Rvd25sb2FkU2Vzc2lvbi5SRVNVTFRfQ0FOQ0VMTEVEOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25EZXN0cm95KCkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZSgpOworICAgICAgICBtSGFuZGxlclRocmVhZC5xdWl0U2FmZWx5KCk7CisgICAgICAgIGxvZ2QoIkN0c0Rvd25sb2FkU2VydmljZSBvbkRlc3Ryb3kiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSUJpbmRlciBvbkJpbmQoSW50ZW50IGludGVudCkgeworICAgICAgICBpZiAoQ09OVFJPTF9JTlRFUkZBQ0VfQUNUSU9OLmVxdWFscyhpbnRlbnQuZ2V0QWN0aW9uKCkpKSB7CisgICAgICAgICAgICBsb2dkKCJDdHNEb3dubG9hZFNlcnZpY2UgY29udHJvbCBpbnRlcmZhY2UgYmluZCIpOworICAgICAgICAgICAgcmV0dXJuIG1Db250cm9sSW50ZXJmYWNlOworICAgICAgICB9CisKKyAgICAgICAgbG9nZCgiQ3RzRG93bmxvYWRTZXJ2aWNlIG9uQmluZCIpOworICAgICAgICBpZiAobUhhbmRsZXJUaHJlYWQgIT0gbnVsbCAmJiBtSGFuZGxlclRocmVhZC5pc0FsaXZlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBtRG93bmxvYWRTZXJ2aWNlSW1wbDsKKyAgICAgICAgfQorCisgICAgICAgIG1IYW5kbGVyVGhyZWFkID0gbmV3IEhhbmRsZXJUaHJlYWQoIkN0c0Rvd25sb2FkU2VydmljZVdvcmtlciIpOworICAgICAgICBtSGFuZGxlclRocmVhZC5zdGFydCgpOworICAgICAgICBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKG1IYW5kbGVyVGhyZWFkLmdldExvb3BlcigpKTsKKyAgICAgICAgcmV0dXJuIG1Eb3dubG9hZFNlcnZpY2VJbXBsOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgbG9nZChTdHJpbmcgcykgeworICAgICAgICBMb2cuZChUQUcsIHMpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja0luaXRpYWxpemVkKCkgeworICAgICAgICBpZiAobUFwcENhbGxiYWNrID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5vdCB5ZXQgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9FbWJtc01pZGRsZXdhcmVUZXN0QXBwL3NyYy9hbmRyb2lkL3RlbGVwaG9ueS9jdHMvZW1ibXN0ZXN0YXBwL0N0c1N0cmVhbWluZ1NlcnZpY2UuamF2YSBiL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9FbWJtc01pZGRsZXdhcmVUZXN0QXBwL3NyYy9hbmRyb2lkL3RlbGVwaG9ueS9jdHMvZW1ibXN0ZXN0YXBwL0N0c1N0cmVhbWluZ1NlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTk1YTBkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvdGVsZXBob255L0VtYm1zTWlkZGxld2FyZVRlc3RBcHAvc3JjL2FuZHJvaWQvdGVsZXBob255L2N0cy9lbWJtc3Rlc3RhcHAvQ3RzU3RyZWFtaW5nU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsMjcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQudGVsZXBob255LmN0cy5lbWJtc3Rlc3RhcHA7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5TZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXJUaHJlYWQ7CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255Lm1ibXMuTWJtc0Vycm9yczsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5tYm1zLk1ibXNTdHJlYW1pbmdTZXNzaW9uQ2FsbGJhY2s7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkubWJtcy5TdHJlYW1pbmdTZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255Lm1ibXMuU3RyZWFtaW5nU2VydmljZUNhbGxiYWNrOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255Lm1ibXMuU3RyZWFtaW5nU2VydmljZUluZm87CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkubWJtcy52ZW5kb3IuTWJtc1N0cmVhbWluZ1NlcnZpY2VCYXNlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitwdWJsaWMgY2xhc3MgQ3RzU3RyZWFtaW5nU2VydmljZSBleHRlbmRzIFNlcnZpY2UgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IEFMTE9XRURfUEFDS0FHRVMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCkge3sKKyAgICAgICAgYWRkKCJhbmRyb2lkLnRlbGVwaG9ueS5jdHMiKTsKKyAgICB9fTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkVtYm1zVGVzdFN0cmVhbWluZyI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfSU5JVElBTElaRSA9ICJpbml0aWFsaXplIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfUkVRVUVTVF9VUERBVEVfU1RSRUFNSU5HX1NFUlZJQ0VTID0KKyAgICAgICAgICAgICJyZXF1ZXN0VXBkYXRlU3RyZWFtaW5nU2VydmljZXMiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9TVEFSVF9TVFJFQU1JTkcgPSAic3RhcnRTdHJlYW1pbmciOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9HRVRfUExBWUJBQ0tfVVJJID0gImdldFBsYXliYWNrVXJpIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfU1RPUF9TVFJFQU1JTkcgPSAic3RvcFN0cmVhbWluZyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX0NMT1NFID0gImNsb3NlIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRST0xfSU5URVJGQUNFX0FDVElPTiA9CisgICAgICAgICAgICAiYW5kcm9pZC50ZWxlcGhvbnkuY3RzLmVtYm1zdGVzdGFwcC5BQ1RJT05fQ09OVFJPTF9NSURETEVXQVJFIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBvbmVudE5hbWUgQ09OVFJPTF9JTlRFUkZBQ0VfQ09NUE9ORU5UID0KKyAgICAgICAgICAgIENvbXBvbmVudE5hbWUudW5mbGF0dGVuRnJvbVN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQudGVsZXBob255LmN0cy5lbWJtc3Rlc3RhcHAvLkN0c1N0cmVhbWluZ1NlcnZpY2UiKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBTVFJFQU1JTkdfVVJJID0gVXJpLnBhcnNlKCJodHRwOi8vd3d3LmV4YW1wbGUuY29tL3N0cmVhbTEiKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyZWFtaW5nU2VydmljZUluZm8gU1RSRUFNSU5HX1NFUlZJQ0VfSU5GTzsKKyAgICBzdGF0aWMgeworICAgICAgICBTdHJpbmcgaWQgPSAiU3RyZWFtaW5nU2VydmljZUlkIjsKKyAgICAgICAgTWFwPExvY2FsZSwgU3RyaW5nPiBsb2NhbGVEaWN0ID0gbmV3IEhhc2hNYXA8TG9jYWxlLCBTdHJpbmc+KCkge3sKKyAgICAgICAgICAgIHB1dChMb2NhbGUuVVMsICJFbnRlcnRhaW5tZW50IFNvdXJjZSAxIik7CisgICAgICAgICAgICBwdXQoTG9jYWxlLkNBTkFEQSwgIkVudGVydGFpbm1lbnQgU291cmNlIDEsIGVoPyIpOworICAgICAgICB9fTsKKyAgICAgICAgTGlzdDxMb2NhbGU+IGxvY2FsZXMgPSBuZXcgQXJyYXlMaXN0PExvY2FsZT4oKSB7eworICAgICAgICAgICAgYWRkKExvY2FsZS5DQU5BREEpOworICAgICAgICAgICAgYWRkKExvY2FsZS5VUyk7CisgICAgICAgIH19OworICAgICAgICBTVFJFQU1JTkdfU0VSVklDRV9JTkZPID0gbmV3IFN0cmVhbWluZ1NlcnZpY2VJbmZvKGxvY2FsZURpY3QsICJjbGFzczEiLCBsb2NhbGVzLAorICAgICAgICAgICAgICAgIGlkLCBuZXcgRGF0ZSgyMDE3LCA4LCAyMSwgMTgsIDIwLCAyOSksCisgICAgICAgICAgICAgICAgbmV3IERhdGUoMjAxNywgOCwgMjEsIDE4LCAyMywgOSkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRU5EX1NUUkVBTUlOR19TRVJWSUNFU19MSVNUID0gMTsKKworICAgIHByaXZhdGUgTWJtc1N0cmVhbWluZ1Nlc3Npb25DYWxsYmFjayBtQXBwQ2FsbGJhY2s7CisgICAgcHJpdmF0ZSBTdHJlYW1pbmdTZXJ2aWNlQ2FsbGJhY2sgbVN0cmVhbUNhbGxiYWNrOworCisgICAgcHJpdmF0ZSBIYW5kbGVyVGhyZWFkIG1IYW5kbGVyVGhyZWFkOworICAgIHByaXZhdGUgSGFuZGxlciBtSGFuZGxlcjsKKyAgICBwcml2YXRlIEhhbmRsZXIuQ2FsbGJhY2sgbVdvcmtlckNhbGxiYWNrID0gKG1zZykgLT4geworICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7CisgICAgICAgICAgICBjYXNlIFNFTkRfU1RSRUFNSU5HX1NFUlZJQ0VTX0xJU1Q6CisgICAgICAgICAgICAgICAgTGlzdDxTdHJlYW1pbmdTZXJ2aWNlSW5mbz4gc2VydmljZXMgPSAoTGlzdDxTdHJlYW1pbmdTZXJ2aWNlSW5mbz4pIG1zZy5vYmo7CisgICAgICAgICAgICAgICAgaWYgKG1BcHBDYWxsYmFjayE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUFwcENhbGxiYWNrLm9uU3RyZWFtaW5nU2VydmljZXNVcGRhdGVkKHNlcnZpY2VzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfTsKKyAgICBwcml2YXRlIExpc3Q8TGlzdD4gbVJlY2VpdmVkQ2FsbHMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgcHJpdmF0ZSBpbnQgbUVycm9yQ29kZU92ZXJyaWRlID0gTWJtc0Vycm9ycy5TVUNDRVNTOworCisgICAgcHJpdmF0ZSBmaW5hbCBNYm1zU3RyZWFtaW5nU2VydmljZUJhc2UgbVN0cmVhbWluZ1NlcnZpY2VJbXBsID0gbmV3IE1ibXNTdHJlYW1pbmdTZXJ2aWNlQmFzZSgpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgaW5pdGlhbGl6ZShNYm1zU3RyZWFtaW5nU2Vzc2lvbkNhbGxiYWNrIGNhbGxiYWNrLCBpbnQgc3ViSWQpIHsKKyAgICAgICAgICAgIG1SZWNlaXZlZENhbGxzLmFkZChBcnJheXMuYXNMaXN0KE1FVEhPRF9JTklUSUFMSVpFLCBzdWJJZCkpOworICAgICAgICAgICAgaWYgKG1FcnJvckNvZGVPdmVycmlkZSAhPSBNYm1zRXJyb3JzLlNVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbUVycm9yQ29kZU92ZXJyaWRlOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIGludCBwYWNrYWdlVWlkID0gQmluZGVyLmdldENhbGxpbmdVaWQoKTsKKyAgICAgICAgICAgIFN0cmluZ1tdIHBhY2thZ2VOYW1lcyA9IGdldFBhY2thZ2VNYW5hZ2VyKCkuZ2V0UGFja2FnZXNGb3JVaWQocGFja2FnZVVpZCk7CisgICAgICAgICAgICBpZiAocGFja2FnZU5hbWVzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTWJtc0Vycm9ycy5Jbml0aWFsaXphdGlvbkVycm9ycy5FUlJPUl9BUFBfUEVSTUlTU0lPTlNfTk9UX0dSQU5URUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBib29sZWFuIGlzVWlkQWxsb3dlZCA9IEFycmF5cy5zdHJlYW0ocGFja2FnZU5hbWVzKS5hbnlNYXRjaChBTExPV0VEX1BBQ0tBR0VTOjpjb250YWlucyk7CisgICAgICAgICAgICBpZiAoIWlzVWlkQWxsb3dlZCkgeworICAgICAgICAgICAgICAgIHJldHVybiBNYm1zRXJyb3JzLkluaXRpYWxpemF0aW9uRXJyb3JzLkVSUk9SX0FQUF9QRVJNSVNTSU9OU19OT1RfR1JBTlRFRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbUhhbmRsZXIucG9zdCgoKSAtPiB7CisgICAgICAgICAgICAgICAgaWYgKG1BcHBDYWxsYmFjayA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1BcHBDYWxsYmFjayA9IGNhbGxiYWNrOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWJtc0Vycm9ycy5Jbml0aWFsaXphdGlvbkVycm9ycy5FUlJPUl9EVVBMSUNBVEVfSU5JVElBTElaRSwgIiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uTWlkZGxld2FyZVJlYWR5KCk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybiBNYm1zRXJyb3JzLlNVQ0NFU1M7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCByZXF1ZXN0VXBkYXRlU3RyZWFtaW5nU2VydmljZXMoaW50IHN1YnNjcmlwdGlvbklkLCBMaXN0PFN0cmluZz4gc2VydmljZUNsYXNzZXMpIHsKKyAgICAgICAgICAgIG1SZWNlaXZlZENhbGxzLmFkZChBcnJheXMuYXNMaXN0KE1FVEhPRF9SRVFVRVNUX1VQREFURV9TVFJFQU1JTkdfU0VSVklDRVMsCisgICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbklkLCBzZXJ2aWNlQ2xhc3NlcykpOworICAgICAgICAgICAgaWYgKG1FcnJvckNvZGVPdmVycmlkZSAhPSBNYm1zRXJyb3JzLlNVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbUVycm9yQ29kZU92ZXJyaWRlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMaXN0PFN0cmVhbWluZ1NlcnZpY2VJbmZvPiBzZXJ2aWNlSW5mb3MgPQorICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KFNUUkVBTUlOR19TRVJWSUNFX0lORk8pOworCisgICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhTRU5EX1NUUkVBTUlOR19TRVJWSUNFU19MSVNUKTsKKyAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKFNFTkRfU1RSRUFNSU5HX1NFUlZJQ0VTX0xJU1QsIHNlcnZpY2VJbmZvcykpOworICAgICAgICAgICAgcmV0dXJuIE1ibXNFcnJvcnMuU1VDQ0VTUzsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IHN0YXJ0U3RyZWFtaW5nKGludCBzdWJzY3JpcHRpb25JZCwgU3RyaW5nIHNlcnZpY2VJZCwKKyAgICAgICAgICAgICAgICBTdHJlYW1pbmdTZXJ2aWNlQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgICAgIG1SZWNlaXZlZENhbGxzLmFkZChBcnJheXMuYXNMaXN0KE1FVEhPRF9TVEFSVF9TVFJFQU1JTkcsIHN1YnNjcmlwdGlvbklkLCBzZXJ2aWNlSWQpKTsKKyAgICAgICAgICAgIGlmIChtRXJyb3JDb2RlT3ZlcnJpZGUgIT0gTWJtc0Vycm9ycy5TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1FcnJvckNvZGVPdmVycmlkZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVN0cmVhbUNhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgICAgICAgICBtSGFuZGxlci5wb3N0KCgpIC0+IGNhbGxiYWNrLm9uU3RyZWFtU3RhdGVVcGRhdGVkKFN0cmVhbWluZ1NlcnZpY2UuU1RBVEVfU1RBUlRFRCwKKyAgICAgICAgICAgICAgICAgICAgU3RyZWFtaW5nU2VydmljZS5SRUFTT05fQllfVVNFUl9SRVFVRVNUKSk7CisgICAgICAgICAgICByZXR1cm4gTWJtc0Vycm9ycy5TVUNDRVNTOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBVcmkgZ2V0UGxheWJhY2tVcmkoaW50IHN1YnNjcmlwdGlvbklkLCBTdHJpbmcgc2VydmljZUlkKSB7CisgICAgICAgICAgICBtUmVjZWl2ZWRDYWxscy5hZGQoQXJyYXlzLmFzTGlzdChNRVRIT0RfR0VUX1BMQVlCQUNLX1VSSSwgc3Vic2NyaXB0aW9uSWQsIHNlcnZpY2VJZCkpOworICAgICAgICAgICAgcmV0dXJuIFNUUkVBTUlOR19VUkk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc3RvcFN0cmVhbWluZyhpbnQgc3Vic2NyaXB0aW9uSWQsIFN0cmluZyBzZXJ2aWNlSWQpIHsKKyAgICAgICAgICAgIG1SZWNlaXZlZENhbGxzLmFkZChBcnJheXMuYXNMaXN0KE1FVEhPRF9TVE9QX1NUUkVBTUlORywgc3Vic2NyaXB0aW9uSWQsIHNlcnZpY2VJZCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoaW50IHN1YnNjcmlwdGlvbklkKSB7CisgICAgICAgICAgICBtUmVjZWl2ZWRDYWxscy5hZGQoQXJyYXlzLmFzTGlzdChNRVRIT0RfQ0xPU0UsIHN1YnNjcmlwdGlvbklkKSk7CisgICAgICAgICAgICAvLyBUT0RPCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25BcHBDYWxsYmFja0RpZWQoaW50IHVpZCwgaW50IHN1YnNjcmlwdGlvbklkKSB7CisgICAgICAgICAgICBtQXBwQ2FsbGJhY2sgPSBudWxsOworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgZmluYWwgSUJpbmRlciBtQ29udHJvbEludGVyZmFjZSA9IG5ldyBJQ3RzU3RyZWFtaW5nTWlkZGxld2FyZUNvbnRyb2wuU3R1YigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgeworICAgICAgICAgICAgbVJlY2VpdmVkQ2FsbHMuY2xlYXIoKTsKKyAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZUNhbGxiYWNrc0FuZE1lc3NhZ2VzKG51bGwpOworICAgICAgICAgICAgbUFwcENhbGxiYWNrID0gbnVsbDsKKyAgICAgICAgICAgIG1FcnJvckNvZGVPdmVycmlkZSA9IE1ibXNFcnJvcnMuU1VDQ0VTUzsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTGlzdCBnZXRTdHJlYW1pbmdTZXNzaW9uQ2FsbHMoKSB7CisgICAgICAgICAgICByZXR1cm4gbVJlY2VpdmVkQ2FsbHM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZm9yY2VFcnJvckNvZGUoaW50IGVycm9yKSB7CisgICAgICAgICAgICBtRXJyb3JDb2RlT3ZlcnJpZGUgPSBlcnJvcjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaXJlRXJyb3JPblN0cmVhbShpbnQgZXJyb3JDb2RlLCBTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICAgICAgbUhhbmRsZXIucG9zdCgoKSAtPiBtU3RyZWFtQ2FsbGJhY2sub25FcnJvcihlcnJvckNvZGUsIG1lc3NhZ2UpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaXJlRXJyb3JPblNlc3Npb24oaW50IGVycm9yQ29kZSwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIG1IYW5kbGVyLnBvc3QoKCkgLT4gbUFwcENhbGxiYWNrLm9uRXJyb3IoZXJyb3JDb2RlLCBtZXNzYWdlKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlyZU9uTWVkaWFEZXNjcmlwdGlvblVwZGF0ZWQoKSB7CisgICAgICAgICAgICBtSGFuZGxlci5wb3N0KCgpIC0+IG1TdHJlYW1DYWxsYmFjay5vbk1lZGlhRGVzY3JpcHRpb25VcGRhdGVkKCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpcmVPbkJyb2FkY2FzdFNpZ25hbFN0cmVuZ3RoVXBkYXRlZChpbnQgc2lnbmFsU3RyZW5ndGgpIHsKKyAgICAgICAgICAgIG1IYW5kbGVyLnBvc3QoKCkgLT4gbVN0cmVhbUNhbGxiYWNrLm9uQnJvYWRjYXN0U2lnbmFsU3RyZW5ndGhVcGRhdGVkKHNpZ25hbFN0cmVuZ3RoKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlyZU9uU3RyZWFtTWV0aG9kVXBkYXRlZChpbnQgbWV0aG9kVHlwZSl7CisgICAgICAgICAgICBtSGFuZGxlci5wb3N0KCgpIC0+IG1TdHJlYW1DYWxsYmFjay5vblN0cmVhbU1ldGhvZFVwZGF0ZWQobWV0aG9kVHlwZSkpOworICAgICAgICB9CisgICAgfTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveSgpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoKTsKKyAgICAgICAgbUhhbmRsZXJUaHJlYWQucXVpdFNhZmVseSgpOworICAgICAgICBsb2dkKCJDdHNTdHJlYW1pbmdTZXJ2aWNlIG9uRGVzdHJveSIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJQmluZGVyIG9uQmluZChJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIGlmIChDT05UUk9MX0lOVEVSRkFDRV9BQ1RJT04uZXF1YWxzKGludGVudC5nZXRBY3Rpb24oKSkpIHsKKyAgICAgICAgICAgIGxvZ2QoIkN0c1N0cmVhbWluZ1NlcnZpY2UgY29udHJvbCBpbnRlcmZhY2UgYmluZCIpOworICAgICAgICAgICAgcmV0dXJuIG1Db250cm9sSW50ZXJmYWNlOworICAgICAgICB9CisKKyAgICAgICAgbG9nZCgiQ3RzU3RyZWFtaW5nU2VydmljZSBvbkJpbmQiKTsKKyAgICAgICAgaWYgKG1IYW5kbGVyVGhyZWFkICE9IG51bGwgJiYgbUhhbmRsZXJUaHJlYWQuaXNBbGl2ZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gbVN0cmVhbWluZ1NlcnZpY2VJbXBsOworICAgICAgICB9CisKKyAgICAgICAgbUhhbmRsZXJUaHJlYWQgPSBuZXcgSGFuZGxlclRocmVhZCgiQ3RzU3RyZWFtaW5nU2VydmljZVdvcmtlciIpOworICAgICAgICBtSGFuZGxlclRocmVhZC5zdGFydCgpOworICAgICAgICBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKG1IYW5kbGVyVGhyZWFkLmdldExvb3BlcigpLCBtV29ya2VyQ2FsbGJhY2spOworICAgICAgICByZXR1cm4gbVN0cmVhbWluZ1NlcnZpY2VJbXBsOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgbG9nZChTdHJpbmcgcykgeworICAgICAgICBMb2cuZChUQUcsIHMpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja0luaXRpYWxpemVkKCkgeworICAgICAgICBpZiAobUFwcENhbGxiYWNrID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5vdCB5ZXQgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9wcmVjb25kaXRpb25zL2FwcC9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvdGVsZXBob255L3ByZWNvbmRpdGlvbnMvYXBwL0FuZHJvaWQubWsKaW5kZXggYTVmYTM5Ni4uMmFkMWM2YyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdGVsZXBob255L3ByZWNvbmRpdGlvbnMvYXBwL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvdGVzdHMvdGVsZXBob255L3ByZWNvbmRpdGlvbnMvYXBwL0FuZHJvaWQubWsKQEAgLTI3LDEwICsyNywxMiBAQAogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLXN1cHBvcnQtdGVzdCBjdHN0ZXN0cnVubmVyIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbCBcCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZHgudGVzdC5ydWxlcyBjdHN0ZXN0cnVubmVyLWF4dCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtcHJlY29uZGl0aW9ucwogCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicworCiAjIHRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0CiBMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZWxlcGhvbnkvcHJlY29uZGl0aW9ucy9hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9wcmVjb25kaXRpb25zL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDg5NGI1MTAuLmY4NGQxZWMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9wcmVjb25kaXRpb25zL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9wcmVjb25kaXRpb25zL2FwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yMiw3ICsyMiw3IEBACiAgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgogICAgIDwvYXBwbGljYXRpb24+CiAKLSAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLnRlbGVwaG9ueS5jdHMucHJlY29uZGl0aW9ucy5hcHAiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJEZXZpY2Utc2lkZSBDVFMgdGVsZXBob255IHByZXBhcmF0aW9uIiAvPgogPC9tYW5pZmVzdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZWxlcGhvbnkvc3JjL2FuZHJvaWQvdGVsZXBob255L2N0cy9DYXJyaWVyQ29uZmlnTWFuYWdlclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvY3RzL0NhcnJpZXJDb25maWdNYW5hZ2VyVGVzdC5qYXZhCmluZGV4IDc5MDVhODMuLmUxODU0Y2MgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvY3RzL0NhcnJpZXJDb25maWdNYW5hZ2VyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvY3RzL0NhcnJpZXJDb25maWdNYW5hZ2VyVGVzdC5qYXZhCkBAIC0yNCw5ICsyNCw2IEBACiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuVGVsZXBob255TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DZGRUZXN0OwotCi1AQ2RkVGVzdChyZXF1aXJlbWVudD0iNy40LjEvQy0xLTIiKQogcHVibGljIGNsYXNzIENhcnJpZXJDb25maWdNYW5hZ2VyVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CiAgICAgcHJpdmF0ZSBDYXJyaWVyQ29uZmlnTWFuYWdlciBtQ29uZmlnTWFuYWdlcjsKICAgICBwcml2YXRlIFRlbGVwaG9ueU1hbmFnZXIgbVRlbGVwaG9ueU1hbmFnZXI7CkBAIC01NywxMyArNTQsMTcgQEAKICAgICAgICAgICAgICAgICBtVGVsZXBob255TWFuYWdlci5nZXRTaW1TdGF0ZSgpICE9IFRlbGVwaG9ueU1hbmFnZXIuU0lNX1NUQVRFX0FCU0VOVDsKICAgICB9CiAKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNTaW1DYXJkQWJzZW50KCkgeworICAgICAgICByZXR1cm4gbVRlbGVwaG9ueU1hbmFnZXIuZ2V0U2ltU3RhdGUoKSA9PSBUZWxlcGhvbnlNYW5hZ2VyLlNJTV9TVEFURV9BQlNFTlQ7CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIGNoZWNrQ29uZmlnKFBlcnNpc3RhYmxlQnVuZGxlIGNvbmZpZykgewogICAgICAgICBpZiAoY29uZmlnID09IG51bGwpIHsKICAgICAgICAgICAgIGFzc2VydEZhbHNlKCJDb25maWcgc2hvdWxkIG9ubHkgYmUgbnVsbCB3aGVuIHRlbGVwaG9ueSBpcyBub3QgcnVubmluZy4iLCBoYXNUZWxlcGhvbnkoKSk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiQ2FycmllckNvbmZpZ01hbmFnZXIgc2hvdWxkIG5vdCByZXR1cm4gbnVsbCBjb25maWciLCBjb25maWcpOwotICAgICAgICBpZiAoIWlzU2ltQ2FyZFByZXNlbnQoKSkgeworICAgICAgICBpZiAoaXNTaW1DYXJkQWJzZW50KCkpIHsKICAgICAgICAgICAgIC8vIFN0YXRpYyBkZWZhdWx0IGluIENhcnJpZXJDb25maWdNYW5hZ2VyIHdpbGwgYmUgcmV0dXJuZWQgd2hlbiBubyBzaW0gY2FyZCBwcmVzZW50LgogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJDb25maWcgZG9lc24ndCBtYXRjaCBzdGF0aWMgZGVmYXVsdC4iLAogICAgICAgICAgICAgICAgICAgICBjb25maWcuZ2V0Qm9vbGVhbihDYXJyaWVyQ29uZmlnTWFuYWdlci5LRVlfQURESVRJT05BTF9DQUxMX1NFVFRJTkdfQk9PTCksIHRydWUpOwpAQCAtODEsNiArODIsNyBAQAogICAgICAgICAgICAgICAgIGNvbmZpZy5nZXRCb29sZWFuKENhcnJpZXJDb25maWdNYW5hZ2VyLktFWV9WVk1fUFJFRkVUQ0hfQk9PTCksIHRydWUpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJLRVlfQ0FSUklFUl9WVk1fUEFDS0FHRV9OQU1FX1NUUklORyBkb2Vzbid0IG1hdGNoIHN0YXRpYyBkZWZhdWx0LiIsCiAgICAgICAgICAgICAgICAgY29uZmlnLmdldFN0cmluZyhDYXJyaWVyQ29uZmlnTWFuYWdlci5LRVlfQ0FSUklFUl9WVk1fUEFDS0FHRV9OQU1FX1NUUklORyksICIiKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKENhcnJpZXJDb25maWdNYW5hZ2VyLmlzQ29uZmlnRm9ySWRlbnRpZmllZENhcnJpZXIoY29uZmlnKSk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvY3RzL0NlbGxJbmZvVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdGVsZXBob255L3NyYy9hbmRyb2lkL3RlbGVwaG9ueS9jdHMvQ2VsbEluZm9UZXN0LmphdmEKaW5kZXggZjkzYjI5Ny4uZWY3ZjQ1MyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdGVsZXBob255L3NyYy9hbmRyb2lkL3RlbGVwaG9ueS9jdHMvQ2VsbEluZm9UZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdGVsZXBob255L3NyYy9hbmRyb2lkL3RlbGVwaG9ueS9jdHMvQ2VsbEluZm9UZXN0LmphdmEKQEAgLTE4LDE3ICsxOCwyNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5Db25uZWN0aXZpdHlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LkNlbGxJZGVudGl0eUNkbWE7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuQ2VsbElkZW50aXR5R3NtOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LkNlbGxJZGVudGl0eUx0ZTsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5DZWxsSWRlbnRpdHlXY2RtYTsKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5DZWxsSW5mbzsKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5DZWxsSW5mb0NkbWE7CiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuQ2VsbEluZm9Hc207CiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuQ2VsbEluZm9MdGU7CiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuQ2VsbEluZm9XY2RtYTsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5DZWxsU2lnbmFsU3RyZW5ndGhDZG1hOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LkNlbGxTaWduYWxTdHJlbmd0aEdzbTsKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5DZWxsU2lnbmFsU3RyZW5ndGhMdGU7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuQ2VsbFNpZ25hbFN0cmVuZ3RoV2NkbWE7CiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuVGVsZXBob255TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKKwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOwogCiAvKioKICAqIFRlc3QgVGVsZXBob255TWFuYWdlci5nZXRBbGxDZWxsSW5mbygpCkBAIC01Niw2ICs2Niw0OCBAQAogICAgIC8vIE1heGltdW0gYW5kIG1pbmltdW0gcG9zc2libGUgQ1FJIHZhbHVlcy4KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0NRSSA9IDMwOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNSU5fQ1FJID0gMDsKKworICAgIC8vIFRoZSBmb2xsb3dpbmdzIGFyZSBwYXJhbWV0ZXJzIGZvciB0ZXN0aW5nIENlbGxJZGVudGl0eUNkbWEKKyAgICAvLyBOZXR3b3JrIElkIHJhbmdlcyBmcm9tIDAgdG8gNjU1MzUuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5FVFdPUktfSUQgID0gNjU1MzU7CisgICAgLy8gQ0RNQSBTeXN0ZW0gSWQgcmFuZ2VzIGZyb20gMCB0byAzMjc2NworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTWVNURU1fSUQgPSAzMjc2NzsKKyAgICAvLyBCYXNlIFN0YXRpb24gSWQgcmFuZ2VzIGZyb20gMCB0byA2NTUzNQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCQVNFU1RBVElPTl9JRCA9IDY1NTM1OworICAgIC8vIExvbmdpdHVkZSByYW5nZXMgZnJvbSAtMjU5MjAwMCB0byAyNTkyMDAwLgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMT05HSVRVREUgPSAyNTkyMDAwOworICAgIC8vIExhdGl0dWRlIHJhbmdlcyBmcm9tIC0xMjk2MDAwIHRvIDEyOTYwMDAuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExBVElUVURFID0gMTI5NjAwMDsKKyAgICAvLyBDZWxsIGlkZW50aXR5IHJhbmdlcyBmcm9tIDAgdG8gMjY4NDM1NDU2LgorCisgICAgLy8gVGhlIGZvbGxvd2luZ3MgYXJlIHBhcmFtZXRlcnMgZm9yIHRlc3RpbmcgQ2VsbElkZW50aXR5THRlCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENJID0gMjY4NDM1NDU2OworICAgIC8vIFBoeXNpY2FsIGNlbGwgaWQgcmFuZ2VzIGZyb20gMCB0byA1MDMuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBDSSA9IDUwMzsKKyAgICAvLyBUcmFja2luZyBhcmVhIGNvZGUgcmFuZ2VzIGZyb20gMCB0byA2NTUzNS4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEFDID0gNjU1MzU7CisgICAgLy8gQWJzb2x1dGUgUkYgQ2hhbm5lbCBOdW1iZXIgcmFuZ2VzIGZyb20gMCB0byAyNjIxNDAuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVBUkZDTiA9IDQ3MDAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCQU5EV0lEVEhfTE9XID0gMTQwMDsgIC8vIGtIegorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCQU5EV0lEVEhfSElHSCA9IDIwMDAwOyAgLy8ga0h6CisKKyAgICAvLyBUaGUgZm9sbG93aW5ncyBhcmUgcGFyYW1ldGVycyBmb3IgdGVzdGluZyBDZWxsSWRlbnRpdHlXY2RtYQorICAgIC8vIExvY2F0aW9uIEFyZWEgQ29kZSByYW5nZXMgZnJvbSAwIHRvIDY1NTM1LgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMQUMgPSA2NTUzNTsKKyAgICAvLyBVTVRTIENlbGwgSWRlbnRpdHkgcmFuZ2VzIGZyb20gMCB0byAyNjg0MzU0NTUuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENJRF9VTVRTID0gMjY4NDM1NDU1OworICAgIC8vIFByaW1hcnkgU2NyYW1ibGluZyBDb2RlcmFuZ2VzIGZyb20gMCB0byA1MTEuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBTQyA9IDUxMTsKKworICAgIC8vIFRoZSBmb2xsb3dpbmdzIGFyZSBwYXJhbWV0ZXJzIGZvciB0ZXN0aW5nIENlbGxJZGVudGl0eUdzbQorICAgIC8vIEdTTSBDZWxsIElkZW50aXR5IHJhbmdlcyBmcm9tIDAgdG8gNjU1MzUuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENJRF9HU00gPSA2NTUzNTsKKyAgICAvLyBHU00gQWJzb2x1dGUgUkYgQ2hhbm5lbCBOdW1iZXIgcmFuZ2VzIGZyb20gMCB0byA2NTUzNS4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVJGQ04gPSAxMDI0OworCisgICAgLy8gM2dwcCAzNi4xMDEgU2VjIDUuNy4yCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENIQU5ORUxfUkFTVEVSX0VVVFJBTiA9IDEwMDsgLy9rSHoKKwogICAgIHByaXZhdGUgUGFja2FnZU1hbmFnZXIgbVBtOwogCiAgICAgQE92ZXJyaWRlCkBAIC0xMTAsOTYgKzE2Miw0NjUgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgdmVyaWZ5Q2RtYUluZm8oQ2VsbEluZm9DZG1hIGNkbWEpIHsKLSAgICAgICAgaW50IGxldmVsID0gY2RtYS5nZXRDZWxsU2lnbmFsU3RyZW5ndGgoKS5nZXRMZXZlbCgpOwotICAgICAgICBhc3NlcnRUcnVlKCJnZXRMZXZlbCgpIG91dCBvZiByYW5nZSBbMCw0XSwgbGV2ZWw9IiArIGxldmVsLCBsZXZlbCA+PTAgJiYgbGV2ZWwgPD0gNCk7CisgICAgICAgIHZlcmlmeUNlbGxDb25uZWN0aW9uU3RhdHVzKGNkbWEuZ2V0Q2VsbENvbm5lY3Rpb25TdGF0dXMoKSk7CisgICAgICAgIHZlcmlmeUNlbGxJbmZvQ2RtYVBhcmNlbGFuZEhhc2hjb2RlKGNkbWEpOworICAgICAgICB2ZXJpZnlDZWxsSWRlbnRpdHlDZG1hKGNkbWEuZ2V0Q2VsbElkZW50aXR5KCkpOworICAgICAgICB2ZXJpZnlDZWxsSWRlbnRpdHlDZG1hUGFyY2VsKGNkbWEuZ2V0Q2VsbElkZW50aXR5KCkpOworICAgICAgICB2ZXJpZnlDZWxsU2lnbmFsU3RyZW5ndGhDZG1hKGNkbWEuZ2V0Q2VsbFNpZ25hbFN0cmVuZ3RoKCkpOworICAgICAgICB2ZXJpZnlDZWxsU2lnbmFsU3RyZW5ndGhDZG1hUGFyY2VsKGNkbWEuZ2V0Q2VsbFNpZ25hbFN0cmVuZ3RoKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlDZWxsSW5mb0NkbWFQYXJjZWxhbmRIYXNoY29kZShDZWxsSW5mb0NkbWEgY2RtYSkgeworICAgICAgICBQYXJjZWwgcCA9IFBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgY2RtYS53cml0ZVRvUGFyY2VsKHAsIDApOworICAgICAgICBwLnNldERhdGFQb3NpdGlvbigwKTsKKworICAgICAgICBDZWxsSW5mb0NkbWEgbmV3Q2kgPSBDZWxsSW5mb0NkbWEuQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKHApOworICAgICAgICBhc3NlcnRUcnVlKGNkbWEuZXF1YWxzKG5ld0NpKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiaGFzaENvZGUoKSBkaWQgbm90IGdldCByaWdodCBoYXNkQ29kZSIsIGNkbWEuaGFzaENvZGUoKSwgbmV3Q2kuaGFzaENvZGUoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUNlbGxJZGVudGl0eUNkbWEoQ2VsbElkZW50aXR5Q2RtYSBjZG1hKSB7CisgICAgICAgIFN0cmluZyBhbHBoYUxvbmcgPSAoU3RyaW5nKSBjZG1hLmdldE9wZXJhdG9yQWxwaGFMb25nKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoImdldE9wZXJhdG9yQWxwaGFMb25nKCkgcmV0dXJucyBOVUxMISIsIGFscGhhTG9uZyk7CisKKyAgICAgICAgU3RyaW5nIGFscGhhU2hvcnQgPSAoU3RyaW5nKSBjZG1hLmdldE9wZXJhdG9yQWxwaGFTaG9ydCgpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJnZXRPcGVyYXRvckFscGhhU2hvcnQoKSByZXR1cm5zIE5VTEwhIiwgYWxwaGFTaG9ydCk7CisKKyAgICAgICAgaW50IG5ldHdvcmtJZCA9IGNkbWEuZ2V0TmV0d29ya0lkKCk7CisgICAgICAgIGFzc2VydFRydWUoImdldE5ldHdvcmtJZCgpIG91dCBvZiByYW5nZSBbMCw2NTUzNV0sIG5ldHdvcmtJZD0iICsgbmV0d29ya0lkLAorICAgICAgICAgICAgICAgIG5ldHdvcmtJZCA9PSBJbnRlZ2VyLk1BWF9WQUxVRSB8fCAobmV0d29ya0lkID49IDAgJiYgbmV0d29ya0lkIDw9IE5FVFdPUktfSUQpKTsKKworICAgICAgICBpbnQgc3lzdGVtSWQgPSBjZG1hLmdldFN5c3RlbUlkKCk7CisgICAgICAgIGFzc2VydFRydWUoImdldFN5c3RlbUlkKCkgb3V0IG9mIHJhbmdlIFswLDMyNzY3XSwgc3lzdGVtSWQ9IiArIHN5c3RlbUlkLAorICAgICAgICAgICAgICAgIHN5c3RlbUlkID09IEludGVnZXIuTUFYX1ZBTFVFIHx8IChzeXN0ZW1JZCA+PSAwICYmIHN5c3RlbUlkIDw9IFNZU1RFTV9JRCkpOworCisgICAgICAgIGludCBiYXNlc3RhdGlvbklkID0gY2RtYS5nZXRCYXNlc3RhdGlvbklkKCk7CisgICAgICAgIGFzc2VydFRydWUoImdldEJhc2VzdGF0aW9uSWQoKSBvdXQgb2YgcmFuZ2UgWzAsNjU1MzVdLCBiYXNlc3RhdGlvbklkPSIgKyBiYXNlc3RhdGlvbklkLAorICAgICAgICAgICAgICAgIGJhc2VzdGF0aW9uSWQgPT0gSW50ZWdlci5NQVhfVkFMVUUgfHwgKGJhc2VzdGF0aW9uSWQgPj0gMCAmJiBiYXNlc3RhdGlvbklkIDw9IEJBU0VTVEFUSU9OX0lEKSk7CisKKyAgICAgICAgaW50IGxvbmdpdHVkZSA9IGNkbWEuZ2V0TG9uZ2l0dWRlKCk7CisgICAgICAgIGFzc2VydFRydWUoImdldExvbmdpdHVkZSgpIG91dCBvZiByYW5nZSBbLTI1OTIwMDAsMjU5MjAwMF0sIGxvbmdpdHVkZT0iICsgbG9uZ2l0dWRlLAorICAgICAgICAgICAgICAgIGxvbmdpdHVkZSA9PSBJbnRlZ2VyLk1BWF9WQUxVRSB8fCAobG9uZ2l0dWRlID49IC1MT05HSVRVREUgJiYgbG9uZ2l0dWRlIDw9IExPTkdJVFVERSkpOworCisgICAgICAgIGludCBsYXRpdHVkZSA9IGNkbWEuZ2V0TGF0aXR1ZGUoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZ2V0TGF0aXR1ZGUoKSBvdXQgb2YgcmFuZ2UgWy0xMjk2MDAwLDEyOTYwMDBdLCBsYXRpdHVkZT0iICsgbGF0aXR1ZGUsCisgICAgICAgICAgICAgICAgbGF0aXR1ZGUgPT0gSW50ZWdlci5NQVhfVkFMVUUgfHwgKGxhdGl0dWRlID49IC1MQVRJVFVERSAmJiBsYXRpdHVkZSA8PSBMQVRJVFVERSkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlDZWxsSWRlbnRpdHlDZG1hUGFyY2VsKENlbGxJZGVudGl0eUNkbWEgY2RtYSkgeworICAgICAgICBQYXJjZWwgcCA9IFBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgY2RtYS53cml0ZVRvUGFyY2VsKHAsIDApOworICAgICAgICBwLnNldERhdGFQb3NpdGlvbigwKTsKKworICAgICAgICBDZWxsSWRlbnRpdHlDZG1hIG5ld0NpID0gQ2VsbElkZW50aXR5Q2RtYS5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwocCk7CisgICAgICAgIGFzc2VydFRydWUoY2RtYS5lcXVhbHMobmV3Q2kpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5Q2VsbFNpZ25hbFN0cmVuZ3RoQ2RtYShDZWxsU2lnbmFsU3RyZW5ndGhDZG1hIGNkbWEpIHsKKyAgICAgICAgaW50IGxldmVsID0gY2RtYS5nZXRMZXZlbCgpOworICAgICAgICBhc3NlcnRUcnVlKCJnZXRMZXZlbCgpIG91dCBvZiByYW5nZSBbMCw0XSwgbGV2ZWw9IiArIGxldmVsLAorICAgICAgICAgICAgICAgIGxldmVsID49IDAgJiYgbGV2ZWwgPD0gNCk7CisKKyAgICAgICAgaW50IGFzdUxldmVsID0gY2RtYS5nZXRBc3VMZXZlbCgpOworICAgICAgICBhc3NlcnRUcnVlKCJnZXRBc3VMZXZlbCgpIG91dCBvZiByYW5nZSBbMCw5N10gKG9yIDk5IGlzIHVua25vd24pLCBhc3VMZXZlbD0iICsgYXN1TGV2ZWwsCisgICAgICAgICAgICAgICAgYXN1TGV2ZWwgPT0gOTkgfHwgKGFzdUxldmVsID49IDAgJiYgYXN1TGV2ZWwgPD0gOTcpKTsKKworICAgICAgICBpbnQgY2RtYUxldmVsID0gY2RtYS5nZXRDZG1hTGV2ZWwoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZ2V0Q2RtYUxldmVsKCkgb3V0IG9mIHJhbmdlIFswLDRdLCBjZG1hTGV2ZWw9IiArIGNkbWFMZXZlbCwKKyAgICAgICAgICAgICAgICBjZG1hTGV2ZWwgPj0gMCAmJiBjZG1hTGV2ZWwgPD0gNCk7CisKKyAgICAgICAgaW50IGV2ZG9MZXZlbCA9IGNkbWEuZ2V0RXZkb0xldmVsKCk7CisgICAgICAgIGFzc2VydFRydWUoImdldEV2ZG9MZXZlbCgpIG91dCBvZiByYW5nZSBbMCw0XSwgZXZkb0xldmVsPSIgKyBldmRvTGV2ZWwsCisgICAgICAgICAgICAgICAgZXZkb0xldmVsID49IDAgJiYgZXZkb0xldmVsIDw9IDQpOworCisgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgZm91ciBmaWVsZHMgZG8gbm90IGhhdmUgc3BlY2lmaWMgbGltaXRzLiBTbyBqdXN0IGNhbGxpbmcgdG8gdmVyaWZ5IHRoYXQKKyAgICAgICAgLy8gdGhleSBkb24ndCBjcmFzaCB0aGUgcGhvbmUuCisgICAgICAgIGludCBjZG1hRGJtID0gY2RtYS5nZXRDZG1hRGJtKCk7CisgICAgICAgIGludCBldmRvRGJtID0gY2RtYS5nZXRFdmRvRGJtKCk7CisgICAgICAgIGNkbWEuZ2V0Q2RtYUVjaW8oKTsKKyAgICAgICAgY2RtYS5nZXRFdmRvRWNpbygpOworCisgICAgICAgIGludCBkYm0gPSAoY2RtYURibSA8IGV2ZG9EYm0pID8gY2RtYURibSA6IGV2ZG9EYm07CisgICAgICAgIGFzc2VydEVxdWFscygiZ2V0RGJtKCkgZGlkIG5vdCBnZXQgY29ycmVjdCB2YWx1ZSIsIGRibSwgY2RtYS5nZXREYm0oKSk7CisKKyAgICAgICAgaW50IGV2ZG9TbnIgPSBjZG1hLmdldEV2ZG9TbnIoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZ2V0RXZkb1NucigpIG91dCBvZiByYW5nZSBbMCw4XSwgZXZkb1Nucj0iICsgZXZkb1NuciwKKyAgICAgICAgICAgICAgICAoZXZkb1NuciA9PSBJbnRlZ2VyLk1BWF9WQUxVRSkgfHwgKGV2ZG9TbnIgPj0gMCAmJiBldmRvU25yIDw9IDgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5Q2VsbFNpZ25hbFN0cmVuZ3RoQ2RtYVBhcmNlbChDZWxsU2lnbmFsU3RyZW5ndGhDZG1hIGNkbWEpIHsKKyAgICAgICAgUGFyY2VsIHAgPSBQYXJjZWwub2J0YWluKCk7CisgICAgICAgIGNkbWEud3JpdGVUb1BhcmNlbChwLCAwKTsKKyAgICAgICAgcC5zZXREYXRhUG9zaXRpb24oMCk7CisKKyAgICAgICAgQ2VsbFNpZ25hbFN0cmVuZ3RoQ2RtYSBuZXdDc3MgPSBDZWxsU2lnbmFsU3RyZW5ndGhDZG1hLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNkbWEsIG5ld0Nzcyk7CiAgICAgfQogCiAgICAgLy8gVmVyaWZ5IGx0ZSBjZWxsIGluZm9ybWF0aW9uIGlzIHdpdGhpbiBjb3JyZWN0IHJhbmdlLgogICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlMdGVJbmZvKENlbGxJbmZvTHRlIGx0ZSkgewotICAgICAgICB2ZXJpZnlSc3NpRGJtKGx0ZS5nZXRDZWxsU2lnbmFsU3RyZW5ndGgoKS5nZXREYm0oKSk7CisgICAgICAgIHZlcmlmeUNlbGxDb25uZWN0aW9uU3RhdHVzKGx0ZS5nZXRDZWxsQ29ubmVjdGlvblN0YXR1cygpKTsKKyAgICAgICAgdmVyaWZ5Q2VsbEluZm9MdGVQYXJjZWxhbmRIYXNoY29kZShsdGUpOworICAgICAgICB2ZXJpZnlDZWxsSWRlbnRpdHlMdGUobHRlLmdldENlbGxJZGVudGl0eSgpKTsKKyAgICAgICAgdmVyaWZ5Q2VsbElkZW50aXR5THRlUGFyY2VsKGx0ZS5nZXRDZWxsSWRlbnRpdHkoKSk7CisgICAgICAgIHZlcmlmeUNlbGxTaWduYWxTdHJlbmd0aEx0ZShsdGUuZ2V0Q2VsbFNpZ25hbFN0cmVuZ3RoKCkpOworICAgICAgICB2ZXJpZnlDZWxsU2lnbmFsU3RyZW5ndGhMdGVQYXJjZWwobHRlLmdldENlbGxTaWduYWxTdHJlbmd0aCgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5Q2VsbEluZm9MdGVQYXJjZWxhbmRIYXNoY29kZShDZWxsSW5mb0x0ZSBsdGUpIHsKKyAgICAgICAgUGFyY2VsIHAgPSBQYXJjZWwub2J0YWluKCk7CisgICAgICAgIGx0ZS53cml0ZVRvUGFyY2VsKHAsIDApOworICAgICAgICBwLnNldERhdGFQb3NpdGlvbigwKTsKKworICAgICAgICBDZWxsSW5mb0x0ZSBuZXdDaSA9IENlbGxJbmZvTHRlLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChwKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShsdGUuZXF1YWxzKG5ld0NpKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiaGFzaENvZGUoKSBkaWQgbm90IGdldCByaWdodCBoYXNkQ29kZSIsIGx0ZS5oYXNoQ29kZSgpLCBuZXdDaS5oYXNoQ29kZSgpKTsKKyAgICB9CisKKworICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlDZWxsSWRlbnRpdHlMdGUoQ2VsbElkZW50aXR5THRlIGx0ZSkgeworICAgICAgICBpbnQgbWNjID0gbHRlLmdldE1jYygpOworICAgICAgICAvLyBnZXRNY2MoKSByZXR1cm5zIEludGVnZXIuTUFYX1ZBTFVFIGlmIG1jY1N0ciBpcyBudWxsLgorICAgICAgICBhc3NlcnRUcnVlKCJnZXRNY2MoKSBvdXQgb2YgcmFuZ2UgWzAsIDk5OV0sIG1jYz0iICsgbWNjLAorICAgICAgICAgICAgICAgIChtY2MgPj0gMCAmJiBtY2MgPD0gOTk5KSB8fCBtY2MgPT0gSW50ZWdlci5NQVhfVkFMVUUpOworCisgICAgICAgIGludCBtbmMgPSBsdGUuZ2V0TW5jKCk7CisgICAgICAgIC8vIGdldE1uYygpIHJldHVybnMgSW50ZWdlci5NQVhfVkFMVUUgaWYgbWNjU3RyIGlzIG51bGwuCisgICAgICAgIGFzc2VydFRydWUoImdldE1uYygpIG91dCBvZiByYW5nZSBbMCwgOTk5XSwgbW5jPSIgKyBtbmMsCisgICAgICAgICAgICAgICAgKG1uYyA+PSAwICYmIG1uYyA8PSA5OTkpIHx8IG1uYyA9PSBJbnRlZ2VyLk1BWF9WQUxVRSk7CisKKyAgICAgICAgLy8gQ2VsbCBpZGVudGl0eSByYW5nZXMgZnJvbSAwIHRvIDI2ODQzNTQ1Ni4KKyAgICAgICAgaW50IGNpID0gbHRlLmdldENpKCk7CisgICAgICAgIGFzc2VydFRydWUoImdldENpKCkgb3V0IG9mIHJhbmdlIFswLDI2ODQzNTQ1Nl0sIGNpPSIgKyBjaSwKKyAgICAgICAgICAgICAgICAoY2kgPT0gSW50ZWdlci5NQVhfVkFMVUUpIHx8IChjaSA+PSAwICYmIGNpIDw9IENJKSk7CisKICAgICAgICAgLy8gVmVyaWZ5IExURSBwaHlzaWNhbCBjZWxsIGlkIGluZm9ybWF0aW9uLgogICAgICAgICAvLyBPbmx5IHBoeXNpY2FsIGNlbGwgaWQgaXMgYXZhaWxhYmxlIGZvciBMVEUgbmVpZ2hib3IuCi0gICAgICAgIGludCBwY2kgPSBsdGUuZ2V0Q2VsbElkZW50aXR5KCkuZ2V0UGNpKCk7CisgICAgICAgIGludCBwY2kgPSBsdGUuZ2V0UGNpKCk7CiAgICAgICAgIC8vIFBoeXNpY2FsIGNlbGwgaWQgc2hvdWxkIGJlIHdpdGhpbiBbMCwgNTAzXS4KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiZ2V0UGNpKCkgb3V0IG9mIHJhbmdlIFswLCA1MDNdLCBwY2k9IiArIHBjaSwgcGNpID49IDAgJiYgcGNpIDw9IDUwMyk7CisgICAgICAgIGFzc2VydFRydWUoImdldFBjaSgpIG91dCBvZiByYW5nZSBbMCwgNTAzXSwgcGNpPSIgKyBwY2ksCisgICAgICAgICAgICAgICAgKHBjaT09IEludGVnZXIuTUFYX1ZBTFVFKSB8fCAocGNpID49IDAgJiYgcGNpIDw9IFBDSSkpOwogCi0gICAgICAgIGludCBlYXJmY24gPSBsdGUuZ2V0Q2VsbElkZW50aXR5KCkuZ2V0RWFyZmNuKCk7CisgICAgICAgIC8vIFRyYWNraW5nIGFyZWEgY29kZSByYW5nZXMgZnJvbSAwIHRvIDY1NTM1LgorICAgICAgICBpbnQgdGFjID0gbHRlLmdldFRhYygpOworICAgICAgICBhc3NlcnRUcnVlKCJnZXRUYWMoKSBvdXQgb2YgcmFuZ2UgWzAsNjU1MzVdLCB0YWM9IiArIHRhYywKKyAgICAgICAgICAgICAgICAodGFjID09IEludGVnZXIuTUFYX1ZBTFVFKSB8fCAodGFjID49IDAgJiYgdGFjIDw9IFRBQykpOworCisgICAgICAgIGludCBidyA9IGx0ZS5nZXRCYW5kd2lkdGgoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZ2V0QmFuZHdpZHRoIG91dCBvZiByYW5nZSBbMTQwMCwgMjAwMDBdIHwgSW50ZWdlci5NYXhfVmFsdWUsIGJ3PSIsCisgICAgICAgICAgICAgICAgYncgPT0gSW50ZWdlci5NQVhfVkFMVUUgfHwgYncgPj0gQkFORFdJRFRIX0xPVyAmJiBidyA8PSBCQU5EV0lEVEhfSElHSCk7CisKKyAgICAgICAgaW50IGVhcmZjbiA9IGx0ZS5nZXRFYXJmY24oKTsKICAgICAgICAgLy8gUmVmZXJlbmNlIDNHUFAgMzYuMTAxIFRhYmxlIDUuNy4zLTEKICAgICAgICAgLy8gQXMgcGVyIE5PVEUgMSBpbiB0aGUgdGFibGUsIGFsdGhvdWdoIDAtNiBhcmUgdmFsaWQgY2hhbm5lbCBudW1iZXJzIGZvcgogICAgICAgICAvLyBMVEUsIHRoZSByZXBvcnRlZCBFQVJGQ04gaXMgdGhlIGNlbnRlciBmcmVxdWVuY3ksIHJlbmRlcmluZyB0aGVzZSBjaGFubmVscwogICAgICAgICAvLyBvdXQgb2YgdGhlIHJhbmdlIG9mIHRoZSBuYXJyb3dlc3QgMS40TWh6IGRlcGxveW1lbnQuCi0gICAgICAgIC8vIFRPRE86IGNyb3NzLXJlZmVyZW5jZSB3aXRoIHRoZSBiYW5kd2lkdGggdG8gYWRqdXN0IHRoZSBtaW5pbXVtIGZvciA1LCAxMCwgYW5kIDIwCi0gICAgICAgIC8vIE1IeiBjaGFubmVscworICAgICAgICBpbnQgbWluRWFyZmNuID0gNzsKKyAgICAgICAgaWYgKGJ3ICE9IEludGVnZXIuTUFYX1ZBTFVFKSB7CisgICAgICAgICAgICAvLyBUaGUgbnVtYmVyIG9mIGNoYW5uZWxzIHVzZWQgYnkgYSBjZWxsIGlzIGVxdWFsIHRvIHRoZSBjZWxsIGJhbmR3aWR0aCBkaXZpZGVkCisgICAgICAgICAgICAvLyBieSB0aGUgY2hhbm5lbCByYXN0ZXIgKGJhbmR3aWR0aCBvZiBhIGNoYW5uZWwpLiBUaGUgY2VudGVyIGNoYW5uZWwgaXMgdGhlIGNoYW5uZWwKKyAgICAgICAgICAgIC8vIHRoZSBuLzItdGggY2hhbm5lbCB3aGVyZSBuIGlzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMsIGFuZCBzaW5jZSBpdCBpcyB0aGUgY2VudGVyCisgICAgICAgICAgICAvLyBjaGFubmVsIHRoYXQgaXMgcmVwb3J0ZWQgYXMgdGhlIGNoYW5uZWwgbnVtYmVyIGZvciBhIGNlbGwsIHdlIGNhbiBleGNsdWRlIGFueSBjaGFubmVsCisgICAgICAgICAgICAvLyBudW1iZXJzIHdpdGhpbiBhIGJhbmQgdGhhdCB3b3VsZCBwbGFjZSB0aGUgYm90dG9tIG9mIGEgY2VsbCdzIGJhbmR3aWR0aCBiZWxvdyB0aGUKKyAgICAgICAgICAgIC8vIGVkZ2Ugb2YgdGhlIGJhbmQuIEZvciBjaGFubmVsIG51bWJlcnMgaW4gQmFuZCAxLCB0aGUgRUFSRkNOIG51bWJlcmluZyBzdGFydHMgZnJvbQorICAgICAgICAgICAgLy8gY2hhbm5lbCAwLCB3aGljaCBtZWFucyB0aGF0IHdlIGNhbiBleGNsdWRlIGZyb20gdGhlIHZhbGlkIHJhbmdlIGNoYW5uZWxzIHN0YXJ0aW5nCisgICAgICAgICAgICAvLyBmcm9tIDAgYW5kIG51bWJlcmVkIGxlc3MgdGhhbiBoYWxmIHRoZSB0b3RhbCBudW1iZXIgb2YgY2hhbm5lbHMgb2NjdXBpZWQgYnkgYSBjZWxsLgorICAgICAgICAgICAgbWluRWFyZmNuID0gYncgLyBDSEFOTkVMX1JBU1RFUl9FVVRSQU4gLyAyOworICAgICAgICB9CiAgICAgICAgIGFzc2VydFRydWUoImdldEVhcmZjbigpIG91dCBvZiByYW5nZSBbNyw0NzAwMF0sIGVhcmZjbj0iICsgZWFyZmNuLAotICAgICAgICAgICAgZWFyZmNuID49IDcgJiYgZWFyZmNuIDw9IDQ3MDAwKTsKLSAgICAgICAgQ2VsbFNpZ25hbFN0cmVuZ3RoTHRlIGNlbGxTaWduYWxTdHJlbmd0aEx0ZSA9IGx0ZS5nZXRDZWxsU2lnbmFsU3RyZW5ndGgoKTsKKyAgICAgICAgICAgICAgICBlYXJmY24gPT0gSW50ZWdlci5NQVhfVkFMVUUgfHwgKGVhcmZjbiA+PSBtaW5FYXJmY24gJiYgZWFyZmNuIDw9IEVBUkZDTikpOworCisgICAgICAgIFN0cmluZyBtY2NTdHIgPSBsdGUuZ2V0TWNjU3RyaW5nKCk7CisgICAgICAgIC8vIG1jY1N0ciBpcyBzZXQgYXMgTlVMTCBpZiBlbXB0eSwgdW5rbm93biBvciBpbnZhbGlkLgorICAgICAgICBhc3NlcnRUcnVlKCJnZXRNY2NTdHJpbmcoKSBvdXQgb2YgcmFuZ2UgWzAsIDk5OV0sIG1jYz0iICsgbWNjU3RyLAorICAgICAgICAgICAgICAgIG1jY1N0ciA9PSBudWxsIHx8IG1jY1N0ci5tYXRjaGVzKCJeWzAtOV17M30kIikpOworCisgICAgICAgIFN0cmluZyBtbmNTdHIgPSBsdGUuZ2V0TW5jU3RyaW5nKCk7CisgICAgICAgIC8vIG1uY1N0ciBpcyBzZXQgYXMgTlVMTCBpZiBlbXB0eSwgdW5rbm93biBvciBpbnZhbGlkLgorICAgICAgICBhc3NlcnRUcnVlKCJnZXRNbmNTdHJpbmcoKSBvdXQgb2YgcmFuZ2UgWzAsIDk5OV0sIG1uYz0iICsgbW5jU3RyLAorICAgICAgICAgICAgICAgIG1uY1N0ciA9PSBudWxsIHx8IG1uY1N0ci5tYXRjaGVzKCJeWzAtOV17MiwzfSQiKSk7CisKKyAgICAgICAgU3RyaW5nIG1vYmlsZU5ldHdvcmtPcGVyYXRvciA9IGx0ZS5nZXRNb2JpbGVOZXR3b3JrT3BlcmF0b3IoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZ2V0TW9iaWxlTmV0d29ya09wZXJhdG9yKCkgb3V0IG9mIHJhbmdlIFswLCA5OTk5OTldLCBtb2JpbGVOZXR3b3JrT3BlcmF0b3I9IgorICAgICAgICAgICAgICAgICAgICAgICAgKyBtb2JpbGVOZXR3b3JrT3BlcmF0b3IsCisgICAgICAgICAgICAgICAgbW9iaWxlTmV0d29ya09wZXJhdG9yID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1vYmlsZU5ldHdvcmtPcGVyYXRvci5tYXRjaGVzKCJeWzAtOV17NSw2fSQiKSk7CisKKyAgICAgICAgU3RyaW5nIGFscGhhTG9uZyA9IChTdHJpbmcpIGx0ZS5nZXRPcGVyYXRvckFscGhhTG9uZygpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJnZXRPcGVyYXRvckFscGhhTG9uZygpIHJldHVybnMgTlVMTCEiLCBhbHBoYUxvbmcpOworCisgICAgICAgIFN0cmluZyBhbHBoYVNob3J0ID0gKFN0cmluZykgbHRlLmdldE9wZXJhdG9yQWxwaGFTaG9ydCgpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJnZXRPcGVyYXRvckFscGhhU2hvcnQoKSByZXR1cm5zIE5VTEwhIiwgYWxwaGFTaG9ydCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUNlbGxJZGVudGl0eUx0ZVBhcmNlbChDZWxsSWRlbnRpdHlMdGUgbHRlKSB7CisgICAgICAgIFBhcmNlbCBwID0gUGFyY2VsLm9idGFpbigpOworICAgICAgICBsdGUud3JpdGVUb1BhcmNlbChwLCAwKTsKKyAgICAgICAgcC5zZXREYXRhUG9zaXRpb24oMCk7CisKKyAgICAgICAgQ2VsbElkZW50aXR5THRlIG5ld2NpID0gQ2VsbElkZW50aXR5THRlLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGx0ZSwgbmV3Y2kpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlDZWxsU2lnbmFsU3RyZW5ndGhMdGUoQ2VsbFNpZ25hbFN0cmVuZ3RoTHRlIGNlbGxTaWduYWxTdHJlbmd0aEx0ZSkgeworICAgICAgICB2ZXJpZnlSc3NpRGJtKGNlbGxTaWduYWxTdHJlbmd0aEx0ZS5nZXREYm0oKSk7CisKICAgICAgICAgLy9JbnRlZ2VyLk1BWF9WQUxVRSBpbmRpY2F0ZXMgYW4gdW5hdmFpbGFibGUgZmllbGQKICAgICAgICAgaW50IHJzcnAgPSBjZWxsU2lnbmFsU3RyZW5ndGhMdGUuZ2V0UnNycCgpOwogICAgICAgICAvLyBSU1JQIGlzIGJlaW5nIHRyZWF0ZWQgYXMgUlNTSSBpbiBMVEUgKHRoZXkgYXJlIHNpbWlsYXIgYnV0IG5vdCBxdWl0ZSByaWdodCkKICAgICAgICAgLy8gc28gcmV1c2luZyB0aGUgY29uc3RhbnRzIGhlcmUuCiAgICAgICAgIGFzc2VydFRydWUoImdldFJzcnAoKSBvdXQgb2YgcmFuZ2UsIHJzcnA9IiArIHJzcnAsIHJzcnAgPj0gTUlOX1JTUlAgJiYgcnNycCA8PSBNQVhfUlNSUCk7CisKICAgICAgICAgaW50IHJzcnEgPSBjZWxsU2lnbmFsU3RyZW5ndGhMdGUuZ2V0UnNycSgpOwogICAgICAgICBhc3NlcnRUcnVlKCJnZXRSc3JxKCkgb3V0IG9mIHJhbmdlIHwgSW50ZWdlci5NQVhfVkFMVUUsIHJzcnE9IiArIHJzcnEsCiAgICAgICAgICAgICByc3JxID09IEludGVnZXIuTUFYX1ZBTFVFIHx8IChyc3JxID49IE1JTl9SU1JRICYmIHJzcnEgPD0gTUFYX1JTUlEpKTsKKwogICAgICAgICBpbnQgcnNzbnIgPSBjZWxsU2lnbmFsU3RyZW5ndGhMdGUuZ2V0UnNzbnIoKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiZ2V0UnNzbnIoKSBvdXQgb2YgcmFuZ2UgfCBJbnRlZ2VyLk1BWF9WQUxVRSwgcnNzbnI9IiArIHJzc25yLAogICAgICAgICAgICAgcnNzbnIgPT0gSW50ZWdlci5NQVhfVkFMVUUgfHwgKHJzc25yID49IE1JTl9SU1NOUiAmJiByc3NuciA8PSBNQVhfUlNTTlIpKTsKKwogICAgICAgICBpbnQgY3FpID0gY2VsbFNpZ25hbFN0cmVuZ3RoTHRlLmdldENxaSgpOwogICAgICAgICBhc3NlcnRUcnVlKCJnZXRDcWkoKSBvdXQgb2YgcmFuZ2UgfCBJbnRlZ2VyLk1BWF9WQUxVRSwgY3FpPSIgKyBjcWksCiAgICAgICAgICAgICBjcWkgPT0gSW50ZWdlci5NQVhfVkFMVUUgfHwgKGNxaSA+PSBNSU5fQ1FJICYmIGNxaSA8PSBNQVhfQ1FJKSk7CisKICAgICAgICAgaW50IHRhID0gY2VsbFNpZ25hbFN0cmVuZ3RoTHRlLmdldFRpbWluZ0FkdmFuY2UoKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiZ2V0VGltaW5nQWR2YW5jZSgpIGludmFsaWQgWzAtMTI4Ml0gfCBJbnRlZ2VyLk1BWF9WQUxVRSwgdGE9IiArIHRhLAogICAgICAgICAgICAgICAgIHRhID09IEludGVnZXIuTUFYX1ZBTFVFIHx8ICh0YSA+PSAwICYmIHRhIDw9MTI4MikpOworCiAgICAgICAgIGludCBsZXZlbCA9IGNlbGxTaWduYWxTdHJlbmd0aEx0ZS5nZXRMZXZlbCgpOwotICAgICAgICBhc3NlcnRUcnVlKCJnZXRMZXZlbCgpIG91dCBvZiByYW5nZSBbMCw0XSwgbGV2ZWw9IiArIGxldmVsLCBsZXZlbCA+PTAgJiYgbGV2ZWwgPD0gNCk7CisgICAgICAgIGFzc2VydFRydWUoImdldExldmVsKCkgb3V0IG9mIHJhbmdlIFswLDRdLCBsZXZlbD0iICsgbGV2ZWwsIGxldmVsID49IDAgJiYgbGV2ZWwgPD0gNCk7CisKKyAgICAgICAgaW50IGFzdUxldmVsID0gY2VsbFNpZ25hbFN0cmVuZ3RoTHRlLmdldEFzdUxldmVsKCk7CisgICAgICAgIGFzc2VydFRydWUoImdldEFzdUxldmVsKCkgb3V0IG9mIHJhbmdlIFswLDk3XSAob3IgOTkgaXMgdW5rbm93biksIGFzdUxldmVsPSIgKyBhc3VMZXZlbCwKKyAgICAgICAgICAgICAgICAoYXN1TGV2ZWwgPT0gOTkpIHx8IChhc3VMZXZlbCA+PSAwICYmIGFzdUxldmVsIDw9IDk3KSk7CisKKyAgICAgICAgaW50IHRpbWluZ0FkdmFuY2UgPSBjZWxsU2lnbmFsU3RyZW5ndGhMdGUuZ2V0VGltaW5nQWR2YW5jZSgpOworICAgICAgICBhc3NlcnRUcnVlKCJnZXRUaW1pbmdBZHZhbmNlKCkgb3V0IG9mIHJhbmdlIFswLDEyODJdLCB0aW1pbmdBZHZhbmNlPSIgKyB0aW1pbmdBZHZhbmNlLAorICAgICAgICAgICAgICAgIHRpbWluZ0FkdmFuY2UgPT0gSW50ZWdlci5NQVhfVkFMVUUgfHwgKHRpbWluZ0FkdmFuY2UgPj0gMCAmJiB0aW1pbmdBZHZhbmNlIDw9IDEyODIpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5Q2VsbFNpZ25hbFN0cmVuZ3RoTHRlUGFyY2VsKENlbGxTaWduYWxTdHJlbmd0aEx0ZSBjZWxsU2lnbmFsU3RyZW5ndGhMdGUpIHsKKyAgICAgICAgUGFyY2VsIHAgPSBQYXJjZWwub2J0YWluKCk7CisgICAgICAgIGNlbGxTaWduYWxTdHJlbmd0aEx0ZS53cml0ZVRvUGFyY2VsKHAsIDApOworICAgICAgICBwLnNldERhdGFQb3NpdGlvbigwKTsKKworICAgICAgICBDZWxsU2lnbmFsU3RyZW5ndGhMdGUgbmV3Q3NzID0gQ2VsbFNpZ25hbFN0cmVuZ3RoTHRlLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNlbGxTaWduYWxTdHJlbmd0aEx0ZSwgbmV3Q3NzKTsKICAgICB9CiAKICAgICAvLyBWZXJpZnkgd2NkbWEgY2VsbCBpbmZvcm1hdGlvbiBpcyB3aXRoaW4gY29ycmVjdCByYW5nZS4KICAgICBwcml2YXRlIHZvaWQgdmVyaWZ5V2NkbWFJbmZvKENlbGxJbmZvV2NkbWEgd2NkbWEpIHsKLSAgICAgICAgdmVyaWZ5UnNzaURibSh3Y2RtYS5nZXRDZWxsU2lnbmFsU3RyZW5ndGgoKS5nZXREYm0oKSk7CisgICAgICAgIHZlcmlmeUNlbGxDb25uZWN0aW9uU3RhdHVzKHdjZG1hLmdldENlbGxDb25uZWN0aW9uU3RhdHVzKCkpOworICAgICAgICB2ZXJpZnlDZWxsSW5mb1djZG1hUGFyY2VsYW5kSGFzaGNvZGUod2NkbWEpOworICAgICAgICB2ZXJpZnlDZWxsSWRlbnRpdHlXY2RtYSh3Y2RtYS5nZXRDZWxsSWRlbnRpdHkoKSk7CisgICAgICAgIHZlcmlmeUNlbGxJZGVudGl0eVdjZG1hUGFyY2VsKHdjZG1hLmdldENlbGxJZGVudGl0eSgpKTsKKyAgICAgICAgdmVyaWZ5Q2VsbFNpZ25hbFN0cmVuZ3RoV2NkbWEod2NkbWEuZ2V0Q2VsbFNpZ25hbFN0cmVuZ3RoKCkpOworICAgICAgICB2ZXJpZnlDZWxsU2lnbmFsU3RyZW5ndGhXY2RtYVBhcmNlbCh3Y2RtYS5nZXRDZWxsU2lnbmFsU3RyZW5ndGgoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUNlbGxJbmZvV2NkbWFQYXJjZWxhbmRIYXNoY29kZShDZWxsSW5mb1djZG1hIHdjZG1hKSB7CisgICAgICAgIFBhcmNlbCBwID0gUGFyY2VsLm9idGFpbigpOworICAgICAgICB3Y2RtYS53cml0ZVRvUGFyY2VsKHAsIDApOworICAgICAgICBwLnNldERhdGFQb3NpdGlvbigwKTsKKworICAgICAgICBDZWxsSW5mb1djZG1hIG5ld0NpID0gQ2VsbEluZm9XY2RtYS5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwocCk7CisgICAgICAgIGFzc2VydFRydWUod2NkbWEuZXF1YWxzKG5ld0NpKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiaGFzaENvZGUoKSBkaWQgbm90IGdldCByaWdodCBoYXNkQ29kZSIsIHdjZG1hLmhhc2hDb2RlKCksIG5ld0NpLmhhc2hDb2RlKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlDZWxsSWRlbnRpdHlXY2RtYShDZWxsSWRlbnRpdHlXY2RtYSB3Y2RtYSkgeworICAgICAgICBpbnQgbWNjID0gd2NkbWEuZ2V0TWNjKCk7CisgICAgICAgIC8vIGdldE1jYygpIHJldHVybnMgSW50ZWdlci5NQVhfVkFMVUUgaWYgbWNjU3RyIGlzIG51bGwuCisgICAgICAgIGFzc2VydFRydWUoImdldE1jYygpIG91dCBvZiByYW5nZSBbMCwgOTk5XSwgbWNjPSIgKyBtY2MsCisgICAgICAgICAgICAgICAgKG1jYyA+PSAwICYmIG1jYyA8PSA5OTkpIHx8IG1jYyA9PSBJbnRlZ2VyLk1BWF9WQUxVRSk7CisKKyAgICAgICAgaW50IG1uYyA9IHdjZG1hLmdldE1uYygpOworICAgICAgICAvLyBnZXRNbmMoKSByZXR1cm5zIEludGVnZXIuTUFYX1ZBTFVFIGlmIG1jY1N0ciBpcyBudWxsLgorICAgICAgICBhc3NlcnRUcnVlKCJnZXRNbmMoKSBvdXQgb2YgcmFuZ2UgWzAsIDk5OV0sIG1uYz0iICsgbW5jLAorICAgICAgICAgICAgICAgIChtbmMgPj0gMCAmJiBtbmMgPD0gOTk5KSB8fCBtbmMgPT0gSW50ZWdlci5NQVhfVkFMVUUpOworCisgICAgICAgIGludCBsYWMgPSB3Y2RtYS5nZXRMYWMoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZ2V0TGFjKCkgb3V0IG9mIHJhbmdlIFswLCA2NTUzNV0sIGxhYz0iICsgbGFjLAorICAgICAgICAgICAgICAgIChsYWMgPj0gMCAmJiBsYWMgPD0gTEFDKSB8fCBsYWMgPT0gSW50ZWdlci5NQVhfVkFMVUUpOworCisgICAgICAgIGludCBjaWQgPSB3Y2RtYS5nZXRDaWQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZ2V0Q2lkKCkgb3V0IG9mIHJhbmdlIFswLCAyNjg0MzU0NTVdLCBjaWQ9IiArIGNpZCwKKyAgICAgICAgICAgICAgICAoY2lkID49IDAgJiYgY2lkIDw9IENJRF9VTVRTKSB8fCBjaWQgPT0gSW50ZWdlci5NQVhfVkFMVUUpOworCiAgICAgICAgIC8vIFZlcmlmeSB3Y2RtYSBwcmltYXJ5IHNjcmFtYmxpbmcgY29kZSBpbmZvcm1hdGlvbi4KICAgICAgICAgLy8gUHJpbWFyeSBzY3JhbWJsaW5nIGNvZGUgc2hvdWxkIGJlIHdpdGhpbiBbMCwgNTExXS4KLSAgICAgICAgaW50IHBzYyA9IHdjZG1hLmdldENlbGxJZGVudGl0eSgpLmdldFBzYygpOwotICAgICAgICBhc3NlcnRUcnVlKCJnZXRQc2MoKSBvdXQgb2YgcmFuZ2UgWzAsIDUxMV0sIHBzYz0iICsgcHNjLCBwc2MgPj0gMCAmJiBwc2MgPD0gNTExKTsKKyAgICAgICAgaW50IHBzYyA9IHdjZG1hLmdldFBzYygpOworICAgICAgICBhc3NlcnRUcnVlKCJnZXRQc2MoKSBvdXQgb2YgcmFuZ2UgWzAsIDUxMV0sIHBzYz0iICsgcHNjLAorICAgICAgICAgICAgICAgIChwc2MgPj0gMCAmJiBwc2MgPD0gUFNDKSB8fCBwc2MgPT0gSW50ZWdlci5NQVhfVkFMVUUpOwogCi0gICAgICAgIGludCB1YXJmY24gPSB3Y2RtYS5nZXRDZWxsSWRlbnRpdHkoKS5nZXRVYXJmY24oKTsKKyAgICAgICAgU3RyaW5nIG1jY1N0ciA9IHdjZG1hLmdldE1jY1N0cmluZygpOworICAgICAgICAvLyBtY2NTdHIgaXMgc2V0IGFzIE5VTEwgaWYgZW1wdHksIHVua25vd24gb3IgaW52YWxpZC4KKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZ2V0TWNjU3RyaW5nKCkgb3V0IG9mIHJhbmdlIFswLCA5OTldLCBtY2M9IiArIG1jY1N0ciwKKyAgICAgICAgICAgICAgICBtY2NTdHIgPT0gbnVsbCB8fCBtY2NTdHIubWF0Y2hlcygiXlswLTldezN9JCIpKTsKKworICAgICAgICBTdHJpbmcgbW5jU3RyID0gd2NkbWEuZ2V0TW5jU3RyaW5nKCk7CisgICAgICAgIC8vIG1uY1N0ciBpcyBzZXQgYXMgTlVMTCBpZiBlbXB0eSwgdW5rbm93biBvciBpbnZhbGlkLgorICAgICAgICBhc3NlcnRUcnVlKCJnZXRNbmNTdHJpbmcoKSBvdXQgb2YgcmFuZ2UgWzAsIDk5OV0sIG1uYz0iICsgbW5jU3RyLAorICAgICAgICAgICAgICAgIG1uY1N0ciA9PSBudWxsIHx8IG1uY1N0ci5tYXRjaGVzKCJeWzAtOV17MiwzfSQiKSk7CisKKyAgICAgICAgU3RyaW5nIG1vYmlsZU5ldHdvcmtPcGVyYXRvciA9IHdjZG1hLmdldE1vYmlsZU5ldHdvcmtPcGVyYXRvcigpOworICAgICAgICBhc3NlcnRUcnVlKCJnZXRNb2JpbGVOZXR3b3JrT3BlcmF0b3IoKSBvdXQgb2YgcmFuZ2UgWzAsIDk5OTk5OV0sIG1vYmlsZU5ldHdvcmtPcGVyYXRvcj0iCisgICAgICAgICAgICAgICAgICAgICAgICArIG1vYmlsZU5ldHdvcmtPcGVyYXRvciwKKyAgICAgICAgICAgICAgICBtb2JpbGVOZXR3b3JrT3BlcmF0b3IgPT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgfHwgbW9iaWxlTmV0d29ya09wZXJhdG9yLm1hdGNoZXMoIl5bMC05XXs1LDZ9JCIpKTsKKworICAgICAgICBpbnQgdWFyZmNuID0gd2NkbWEuZ2V0VWFyZmNuKCk7CiAgICAgICAgIC8vIFJlZmVyZW5jZSAzR1BQIDI1LjEwMSBUYWJsZSA1LjIKICAgICAgICAgLy8gRnJvbSBBcHBlbmRpeCBFLjEsIGV2ZW4gdGhvdWdoIFVBUkZDTiBpcyBudW1iZXJlZCBmcm9tIDQwMCwgdGhlIG1pbnVtdW0KICAgICAgICAgLy8gdXNhYmxlIGNoYW5uZWwgaXMgNDEyIGR1ZSB0byB0aGUgZml4ZWQgYmFuZHdpZHRoIG9mIDVNaHoKICAgICAgICAgYXNzZXJ0VHJ1ZSgiZ2V0VWFyZmNuKCkgb3V0IG9mIHJhbmdlIFs0MTIsMTEwMDBdLCB1YXJmY249IiArIHVhcmZjbiwKLSAgICAgICAgICAgIHVhcmZjbiA+PSA0MTIgJiYgdWFyZmNuIDw9IDExMDAwKTsKKyAgICAgICAgICAgICAgICB1YXJmY24gPj0gNDEyICYmIHVhcmZjbiA8PSAxMTAwMCk7CiAKLSAgICAgICAgaW50IGxldmVsID0gd2NkbWEuZ2V0Q2VsbFNpZ25hbFN0cmVuZ3RoKCkuZ2V0TGV2ZWwoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiZ2V0TGV2ZWwoKSBvdXQgb2YgcmFuZ2UgWzAsNF0sIGxldmVsPSIgKyBsZXZlbCwgbGV2ZWwgPj0wICYmIGxldmVsIDw9IDQpOworICAgICAgICBTdHJpbmcgYWxwaGFMb25nID0gKFN0cmluZykgd2NkbWEuZ2V0T3BlcmF0b3JBbHBoYUxvbmcoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZ2V0T3BlcmF0b3JBbHBoYUxvbmcoKSByZXR1cm5zIE5VTEwhIiwgYWxwaGFMb25nKTsKKworICAgICAgICBTdHJpbmcgYWxwaGFTaG9ydCA9IChTdHJpbmcpIHdjZG1hLmdldE9wZXJhdG9yQWxwaGFTaG9ydCgpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJnZXRPcGVyYXRvckFscGhhU2hvcnQoKSByZXR1cm5zIE5VTEwhIiwgYWxwaGFTaG9ydCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUNlbGxJZGVudGl0eVdjZG1hUGFyY2VsKENlbGxJZGVudGl0eVdjZG1hIHdjZG1hKSB7CisgICAgICAgIFBhcmNlbCBwID0gUGFyY2VsLm9idGFpbigpOworICAgICAgICB3Y2RtYS53cml0ZVRvUGFyY2VsKHAsIDApOworICAgICAgICBwLnNldERhdGFQb3NpdGlvbigwKTsKKworICAgICAgICBDZWxsSWRlbnRpdHlXY2RtYSBuZXdjaSA9IENlbGxJZGVudGl0eVdjZG1hLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHdjZG1hLCBuZXdjaSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUNlbGxTaWduYWxTdHJlbmd0aFdjZG1hKENlbGxTaWduYWxTdHJlbmd0aFdjZG1hIHdjZG1hKSB7CisgICAgICAgIHZlcmlmeVJzc2lEYm0od2NkbWEuZ2V0RGJtKCkpOworCisgICAgICAgIC8vIERibSBoZXJlIGRvZXMgbm90IGhhdmUgc3BlY2lmaWMgbGltaXRzLiBTbyBqdXN0IGNhbGxpbmcgdG8gdmVyaWZ5IHRoYXQgaXQgZG9lcyBub3QgY3Jhc2gKKyAgICAgICAgLy8gdGhlIHBob25lCisgICAgICAgIHdjZG1hLmdldERibSgpOworCisgICAgICAgIGludCBhc3VMZXZlbCA9IHdjZG1hLmdldEFzdUxldmVsKCk7CisgICAgICAgIGFzc2VydFRydWUoImdldExldmVsKCkgb3V0IG9mIHJhbmdlIFswLDMxXSAob3IgOTkgaXMgdW5rbm93biksIGxldmVsPSIgKyBhc3VMZXZlbCwKKyAgICAgICAgICAgICAgICBhc3VMZXZlbCA9PSA5OSB8fCAoYXN1TGV2ZWwgPj0gMCAmJiBhc3VMZXZlbCA8PSAzMSkpOworCisgICAgICAgIGludCBsZXZlbCA9IHdjZG1hLmdldExldmVsKCk7CisgICAgICAgIGFzc2VydFRydWUoImdldExldmVsKCkgb3V0IG9mIHJhbmdlIFswLDRdLCBsZXZlbD0iICsgbGV2ZWwsIGxldmVsID49IDAgJiYgbGV2ZWwgPD0gNCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUNlbGxTaWduYWxTdHJlbmd0aFdjZG1hUGFyY2VsKENlbGxTaWduYWxTdHJlbmd0aFdjZG1hIHdjZG1hKSB7CisgICAgICAgIFBhcmNlbCBwID0gUGFyY2VsLm9idGFpbigpOworICAgICAgICB3Y2RtYS53cml0ZVRvUGFyY2VsKHAsIDApOworICAgICAgICBwLnNldERhdGFQb3NpdGlvbigwKTsKKworICAgICAgICBDZWxsU2lnbmFsU3RyZW5ndGhXY2RtYSBuZXdDc3MgPSBDZWxsU2lnbmFsU3RyZW5ndGhXY2RtYS5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwocCk7CisgICAgICAgIGFzc2VydEVxdWFscyh3Y2RtYSwgbmV3Q3NzKTsKICAgICB9CiAKICAgICAvLyBWZXJpZnkgZ3NtIGNlbGwgaW5mb3JtYXRpb24gaXMgd2l0aGluIGNvcnJlY3QgcmFuZ2UuCiAgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUdzbUluZm8oQ2VsbEluZm9Hc20gZ3NtKSB7Ci0gICAgICAgIHZlcmlmeVJzc2lEYm0oZ3NtLmdldENlbGxTaWduYWxTdHJlbmd0aCgpLmdldERibSgpKTsKLSAgICAgICAgLy8gVmVyaWZ5IGdzbSBsb2NhbCBhcmVhIGNvZGUgYW5kIGNlbGxpZC4KLSAgICAgICAgLy8gTG9jYWwgYXJlYSBjb2RlIGFuZCBjZWxsaWQgc2hvdWxkIGJlIHdpdGggWzAsIDY1NTM1XS4KLSAgICAgICAgaW50IGxhYyA9IGdzbS5nZXRDZWxsSWRlbnRpdHkoKS5nZXRMYWMoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiZ2V0TGFjKCkgb3V0IG9mIHJhbmdlIFswLCA2NTUzNV0sIGxhYz0iICsgbGFjLCAhZ3NtLmlzUmVnaXN0ZXJlZCgpIHx8Ci0gICAgICAgICAgICBsYWMgPj0gMCAmJiBsYWMgPD0gNjU1MzUpOwotICAgICAgICBpbnQgY2lkID0gZ3NtLmdldENlbGxJZGVudGl0eSgpLmdldENpZCgpOwotICAgICAgICBhc3NlcnRUcnVlKCJnZXRDaWQoKSBvdXQgcmFuZ2UgWzAsIDY1NTM1XSwgY2lkPSIgKyBjaWQsICFnc20uaXNSZWdpc3RlcmVkKCkgfHwKLSAgICAgICAgICAgIGNpZCA+PSAwICYmIGNpZCA8PSA2NTUzNSk7CisgICAgICAgIHZlcmlmeUNlbGxDb25uZWN0aW9uU3RhdHVzKGdzbS5nZXRDZWxsQ29ubmVjdGlvblN0YXR1cygpKTsKKyAgICAgICAgdmVyaWZ5Q2VsbEluZm9XY2RtYVBhcmNlbGFuZEhhc2hjb2RlKGdzbSk7CisgICAgICAgIHZlcmlmeUNlbGxJZGVudGl0eUdzbShnc20uZ2V0Q2VsbElkZW50aXR5KCkpOworICAgICAgICB2ZXJpZnlDZWxsSWRlbnRpdHlHc21QYXJjZWwoZ3NtLmdldENlbGxJZGVudGl0eSgpKTsKKyAgICAgICAgdmVyaWZ5Q2VsbFNpZ25hbFN0cmVuZ3RoR3NtKGdzbS5nZXRDZWxsU2lnbmFsU3RyZW5ndGgoKSk7CisgICAgICAgIHZlcmlmeUNlbGxTaWduYWxTdHJlbmd0aEdzbVBhcmNlbChnc20uZ2V0Q2VsbFNpZ25hbFN0cmVuZ3RoKCkpOworICAgIH0KIAotICAgICAgICBpbnQgYXJmY24gPSBnc20uZ2V0Q2VsbElkZW50aXR5KCkuZ2V0QXJmY24oKTsKKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5Q2VsbEluZm9XY2RtYVBhcmNlbGFuZEhhc2hjb2RlKENlbGxJbmZvR3NtIGdzbSkgeworICAgICAgICBQYXJjZWwgcCA9IFBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgZ3NtLndyaXRlVG9QYXJjZWwocCwgMCk7CisgICAgICAgIHAuc2V0RGF0YVBvc2l0aW9uKDApOworCisgICAgICAgIENlbGxJbmZvR3NtIG5ld0NpID0gQ2VsbEluZm9Hc20uQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKHApOworICAgICAgICBhc3NlcnRUcnVlKGdzbS5lcXVhbHMobmV3Q2kpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJoYXNoQ29kZSgpIGRpZCBub3QgZ2V0IHJpZ2h0IGhhc2RDb2RlIiwgZ3NtLmhhc2hDb2RlKCksIG5ld0NpLmhhc2hDb2RlKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlDZWxsSWRlbnRpdHlHc20oQ2VsbElkZW50aXR5R3NtIGdzbSkgeworICAgICAgICAvLyBMb2NhbCBhcmVhIGNvZGUgYW5kIGNlbGxpZCBzaG91bGQgYmUgd2l0aCBbMCwgNjU1MzVdLgorICAgICAgICBpbnQgbGFjID0gZ3NtLmdldExhYygpOworICAgICAgICBhc3NlcnRUcnVlKCJnZXRMYWMoKSBvdXQgb2YgcmFuZ2UgWzAsIDY1NTM1XSwgbGFjPSIgKyBsYWMsCisgICAgICAgICAgICAgICAgbGFjID09IEludGVnZXIuTUFYX1ZBTFVFIHx8IChsYWMgPj0gMCAmJiBsYWMgPD0gTEFDKSk7CisgICAgICAgIGludCBjaWQgPSBnc20uZ2V0Q2lkKCk7CisgICAgICAgIGFzc2VydFRydWUoImdldENpZCgpIG91dCByYW5nZSBbMCwgNjU1MzVdLCBjaWQ9IiArIGNpZCwKKyAgICAgICAgICAgICAgICBjaWQ9PSBJbnRlZ2VyLk1BWF9WQUxVRSB8fCAoY2lkID49IDAgJiYgY2lkIDw9IENJRF9HU00pKTsKKworICAgICAgICBpbnQgYXJmY24gPSBnc20uZ2V0QXJmY24oKTsKICAgICAgICAgLy8gUmVmZXJlbmNlIDNHUFAgNDUuMDA1IFRhYmxlIDItMgogICAgICAgICBhc3NlcnRUcnVlKCJnZXRBcmZjbigpIG91dCBvZiByYW5nZSBbMCwxMDI0XSwgYXJmY249IiArIGFyZmNuLAotICAgICAgICAgICAgYXJmY24gPj0gMCAmJiBhcmZjbiA8PSAxMDI0KTsKKyAgICAgICAgICAgICAgICBhcmZjbiA9PSBJbnRlZ2VyLk1BWF9WQUxVRSB8fCAoYXJmY24gPj0gMCAmJiBhcmZjbiA8PSBBUkZDTikpOwogCi0gICAgICAgIGludCBsZXZlbCA9IGdzbS5nZXRDZWxsU2lnbmFsU3RyZW5ndGgoKS5nZXRMZXZlbCgpOwotICAgICAgICBhc3NlcnRUcnVlKCJnZXRMZXZlbCgpIG91dCBvZiByYW5nZSBbMCw0XSwgbGV2ZWw9IiArIGxldmVsLCBsZXZlbCA+PTAgJiYgbGV2ZWwgPD0gNCk7CisgICAgICAgIFN0cmluZyBhbHBoYUxvbmcgPSAoU3RyaW5nKSBnc20uZ2V0T3BlcmF0b3JBbHBoYUxvbmcoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZ2V0T3BlcmF0b3JBbHBoYUxvbmcoKSByZXR1cm5zIE5VTEwhIiwgYWxwaGFMb25nKTsKIAotICAgICAgICBpbnQgYnNpYyA9IGdzbS5nZXRDZWxsSWRlbnRpdHkoKS5nZXRCc2ljKCk7CisgICAgICAgIFN0cmluZyBhbHBoYVNob3J0ID0gKFN0cmluZykgZ3NtLmdldE9wZXJhdG9yQWxwaGFTaG9ydCgpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJnZXRPcGVyYXRvckFscGhhU2hvcnQoKSByZXR1cm5zIE5VTEwhIiwgYWxwaGFTaG9ydCk7CisKKyAgICAgICAgU3RyaW5nIG1jY1N0ciA9IGdzbS5nZXRNY2NTdHJpbmcoKTsKKyAgICAgICAgLy8gbWNjU3RyIGlzIHNldCBhcyBOVUxMIGlmIGVtcHR5LCB1bmtub3duIG9yIGludmFsaWQuCisgICAgICAgIGFzc2VydFRydWUoImdldE1jY1N0cmluZygpIG91dCBvZiByYW5nZSBbMCwgOTk5XSwgbWNjPSIgKyBtY2NTdHIsCisgICAgICAgICAgICAgICAgbWNjU3RyID09IG51bGwgfHwgbWNjU3RyLm1hdGNoZXMoIl5bMC05XXszfSQiKSk7CisgICAgICAgIFN0cmluZyBtbmNTdHIgPSBnc20uZ2V0TW5jU3RyaW5nKCk7CisgICAgICAgIC8vIG1uY1N0ciBpcyBzZXQgYXMgTlVMTCBpZiBlbXB0eSwgdW5rbm93biBvciBpbnZhbGlkLgorICAgICAgICBhc3NlcnRUcnVlKCJnZXRNbmNTdHJpbmcoKSBvdXQgb2YgcmFuZ2UgWzAsIDk5OV0sIG1uYz0iICsgbW5jU3RyLAorICAgICAgICAgICAgICAgIG1uY1N0ciA9PSBudWxsIHx8IG1uY1N0ci5tYXRjaGVzKCJeWzAtOV17MiwzfSQiKSk7CisKKyAgICAgICAgU3RyaW5nIG1vYmlsZU5ldHdvcmtPcGVyYXRvciA9IGdzbS5nZXRNb2JpbGVOZXR3b3JrT3BlcmF0b3IoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZ2V0TW9iaWxlTmV0d29ya09wZXJhdG9yKCkgb3V0IG9mIHJhbmdlIFswLCA5OTk5OTldLCBtb2JpbGVOZXR3b3JrT3BlcmF0b3I9IgorICAgICAgICAgICAgICAgICAgICAgICAgKyBtb2JpbGVOZXR3b3JrT3BlcmF0b3IsCisgICAgICAgICAgICAgICAgbW9iaWxlTmV0d29ya09wZXJhdG9yID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1vYmlsZU5ldHdvcmtPcGVyYXRvci5tYXRjaGVzKCJeWzAtOV17NSw2fSQiKSk7CisKKyAgICAgICAgaW50IG1jYyA9IGdzbS5nZXRNY2MoKTsKKyAgICAgICAgLy8gZ2V0TWNjKCkgcmV0dXJucyBJbnRlZ2VyLk1BWF9WQUxVRSBpZiBtY2NTdHIgaXMgbnVsbC4KKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZ2V0TWNjKCkgb3V0IG9mIHJhbmdlIFswLCA5OTldLCBtY2M9IiArIG1jYywKKyAgICAgICAgICAgICAgICAobWNjID49IDAgJiYgbWNjIDw9IDk5OSkgfHwgbWNjID09IEludGVnZXIuTUFYX1ZBTFVFKTsKKyAgICAgICAgaW50IG1uYyA9IGdzbS5nZXRNbmMoKTsKKyAgICAgICAgLy8gZ2V0TW5jKCkgcmV0dXJucyBJbnRlZ2VyLk1BWF9WQUxVRSBpZiBtY2NTdHIgaXMgbnVsbC4KKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZ2V0TW5jKCkgb3V0IG9mIHJhbmdlIFswLCA5OTldLCBtbmM9IiArIG1uYywKKyAgICAgICAgICAgICAgICAobW5jID49IDAgJiYgbW5jIDw9IDk5OSkgfHwgbW5jID09IEludGVnZXIuTUFYX1ZBTFVFKTsKKworICAgICAgICBpbnQgYnNpYyA9IGdzbS5nZXRCc2ljKCk7CiAgICAgICAgIC8vIFRPRE8oYi8zMjc3NDQ3MSkgLSBCc2ljIHNob3VsZCBhbHdheXMgYmUgdmFsaWQKLSAgICAgICAgLy9hc3NlcnRUcnVlKCJnZXRCc2ljKCkgb3V0IG9mIHJhbmdlIFswLDYzXSIsIGJzaWMgPj0wICYmIGJzaWMgPD02Myk7CisgICAgICAgIC8vYXNzZXJ0VHJ1ZSgiZ2V0QnNpYygpIG91dCBvZiByYW5nZSBbMCw2M10iLCBic2ljID49IDAgJiYgYnNpYyA8PTYzKTsKKyAgICB9CiAKLSAgICAgICAgaW50IHRhID0gZ3NtLmdldENlbGxTaWduYWxTdHJlbmd0aCgpLmdldFRpbWluZ0FkdmFuY2UoKTsKKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5Q2VsbElkZW50aXR5R3NtUGFyY2VsKENlbGxJZGVudGl0eUdzbSBnc20pIHsKKyAgICAgICAgUGFyY2VsIHAgPSBQYXJjZWwub2J0YWluKCk7CisgICAgICAgIGdzbS53cml0ZVRvUGFyY2VsKHAsIDApOworICAgICAgICBwLnNldERhdGFQb3NpdGlvbigwKTsKKworICAgICAgICBDZWxsSWRlbnRpdHlHc20gbmV3Y2kgPSBDZWxsSWRlbnRpdHlHc20uQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKHApOworICAgICAgICBhc3NlcnRFcXVhbHMoZ3NtLCBuZXdjaSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUNlbGxTaWduYWxTdHJlbmd0aEdzbShDZWxsU2lnbmFsU3RyZW5ndGhHc20gZ3NtKSB7CisgICAgICAgIHZlcmlmeVJzc2lEYm0oZ3NtLmdldERibSgpKTsKKworICAgICAgICBpbnQgbGV2ZWwgPSBnc20uZ2V0TGV2ZWwoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZ2V0TGV2ZWwoKSBvdXQgb2YgcmFuZ2UgWzAsNF0sIGxldmVsPSIgKyBsZXZlbCwgbGV2ZWwgPj0gMCAmJiBsZXZlbCA8PSA0KTsKKworICAgICAgICBpbnQgdGEgPSBnc20uZ2V0VGltaW5nQWR2YW5jZSgpOwogICAgICAgICBhc3NlcnRUcnVlKCJnZXRUaW1pbmdBZHZhbmNlKCkgb3V0IG9mIHJhbmdlIFswLDIxOV0gfCBJbnRlZ2VyLk1BWF9WQUxVRSwgdGE9IiArIHRhLAogICAgICAgICAgICAgICAgIHRhID09IEludGVnZXIuTUFYX1ZBTFVFIHx8ICh0YSA+PSAwICYmIHRhIDw9IDIxOSkpOworCisgICAgICAgIC8vIERibSBoZXJlIGRvZXMgbm90IGhhdmUgc3BlY2lmaWMgbGltaXRzLiBTbyBqdXN0IGNhbGxpbmcgdG8gdmVyaWZ5IHRoYXQgaXQgZG9lcyBub3QKKyAgICAgICAgLy8gY3Jhc2ggdGhlIHBob25lCisgICAgICAgIGdzbS5nZXREYm0oKTsKKworICAgICAgICBpbnQgYXN1TGV2ZWwgPSBnc20uZ2V0QXN1TGV2ZWwoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZ2V0TGV2ZWwoKSBvdXQgb2YgcmFuZ2UgWzAsMzFdIChvciA5OSBpcyB1bmtub3duKSwgbGV2ZWw9IiArIGFzdUxldmVsLAorICAgICAgICAgICAgICAgIGFzdUxldmVsID09IDk5IHx8IChhc3VMZXZlbCA+PTAgJiYgYXN1TGV2ZWwgPD0gMzEpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5Q2VsbFNpZ25hbFN0cmVuZ3RoR3NtUGFyY2VsKENlbGxTaWduYWxTdHJlbmd0aEdzbSBnc20pIHsKKyAgICAgICAgUGFyY2VsIHAgPSBQYXJjZWwub2J0YWluKCk7CisgICAgICAgIGdzbS53cml0ZVRvUGFyY2VsKHAsIDApOworICAgICAgICBwLnNldERhdGFQb3NpdGlvbigwKTsKKworICAgICAgICBDZWxsU2lnbmFsU3RyZW5ndGhHc20gbmV3Q3NzID0gQ2VsbFNpZ25hbFN0cmVuZ3RoR3NtLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGdzbSwgbmV3Q3NzKTsKICAgICB9CiAKICAgICAvLyBSc3NpKGluIGRibSkgc2hvdWxkIGJlIHdpdGhpbiBbTUlOX1JTU0ksIE1BWF9SU1NJXS4KQEAgLTIwNyw0ICs2MjgsMTIgQEAKICAgICAgICAgYXNzZXJ0VHJ1ZSgiZ2V0Q2VsbFNpZ25hbFN0cmVuZ3RoKCkuZ2V0RGJtKCkgb3V0IG9mIHJhbmdlLCBkYm09IiArIGRibSwKICAgICAgICAgICAgICAgICBkYm0gPj0gTUlOX1JTU0kgJiYgZGJtIDw9IE1BWF9SU1NJKTsKICAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5Q2VsbENvbm5lY3Rpb25TdGF0dXMoaW50IHN0YXR1cykgeworICAgICAgICBhc3NlcnRUcnVlKCJnZXRDZWxsQ29ubmVjdGlvblN0YXR1cygpIGludmFsaWQgWzAsMl0gfCBJbnRlZ2VyLk1BWF9WQUxVRSwgc3RhdHVzPSIsCisgICAgICAgICAgICBzdGF0dXMgPT0gQ2VsbEluZm8uQ09OTkVDVElPTl9OT05FCisgICAgICAgICAgICAgICAgfHwgc3RhdHVzID09IENlbGxJbmZvLkNPTk5FQ1RJT05fUFJJTUFSWV9TRVJWSU5HCisgICAgICAgICAgICAgICAgfHwgc3RhdHVzID09IENlbGxJbmZvLkNPTk5FQ1RJT05fU0VDT05EQVJZX1NFUlZJTkcKKyAgICAgICAgICAgICAgICB8fCBzdGF0dXMgPT0gQ2VsbEluZm8uQ09OTkVDVElPTl9VTktOT1dOKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZWxlcGhvbnkvc3JjL2FuZHJvaWQvdGVsZXBob255L2N0cy9DZWxsTG9jYXRpb25UZXN0LmphdmEgYi90ZXN0cy90ZXN0cy90ZWxlcGhvbnkvc3JjL2FuZHJvaWQvdGVsZXBob255L2N0cy9DZWxsTG9jYXRpb25UZXN0LmphdmEKaW5kZXggYjJhNGMzMS4uNmMxODBiNCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdGVsZXBob255L3NyYy9hbmRyb2lkL3RlbGVwaG9ueS9jdHMvQ2VsbExvY2F0aW9uVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvY3RzL0NlbGxMb2NhdGlvblRlc3QuamF2YQpAQCAtMjksOSArMjksNyBAQAogCiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5SZWFkRWxmOwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuVGVzdFRocmVhZDsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNkZFRlc3Q7CiAKLUBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjQuMS9DLTEtMixDLTItMSIpCiBwdWJsaWMgY2xhc3MgQ2VsbExvY2F0aW9uVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZXsKICAgICBwcml2YXRlIGJvb2xlYW4gbU9uQ2VsbExvY2F0aW9uQ2hhbmdlZENhbGxlZDsKICAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtTG9jayA9IG5ldyBPYmplY3QoKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvY3RzL01tc1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvY3RzL01tc1Rlc3QuamF2YQppbmRleCA0OTljMDNiLi5iNWZhNDVhIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy90ZWxlcGhvbnkvc3JjL2FuZHJvaWQvdGVsZXBob255L2N0cy9NbXNUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdGVsZXBob255L3NyYy9hbmRyb2lkL3RlbGVwaG9ueS9jdHMvTW1zVGVzdC5qYXZhCkBAIC00NSw4ICs0NSw2IEBACiBpbXBvcnQgY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuU2VuZENvbmY7CiBpbXBvcnQgY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuU2VuZFJlcTsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ2RkVGVzdDsKLQogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTU1LDcgKzUzLDYgQEAKIC8qKgogICogVGVzdCBzZW5kaW5nIE1NUyB1c2luZyB7QGxpbmsgYW5kcm9pZC50ZWxlcGhvbnkuU21zTWFuYWdlcn0uCiAgKi8KLUBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjQuMS9DLTEtMixDLTItMSIpCiBwdWJsaWMgY2xhc3MgTW1zVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNbXNUZXN0IjsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGVsZXBob255L3NyYy9hbmRyb2lkL3RlbGVwaG9ueS9jdHMvUGhvbmVTdGF0ZUxpc3RlbmVyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdGVsZXBob255L3NyYy9hbmRyb2lkL3RlbGVwaG9ueS9jdHMvUGhvbmVTdGF0ZUxpc3RlbmVyVGVzdC5qYXZhCmluZGV4IGQxOGE5ZjUuLjc3NDU0OTcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvY3RzL1Bob25lU3RhdGVMaXN0ZW5lclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy90ZWxlcGhvbnkvc3JjL2FuZHJvaWQvdGVsZXBob255L2N0cy9QaG9uZVN0YXRlTGlzdGVuZXJUZXN0LmphdmEKQEAgLTE3LDE5ICsxNywyMCBAQAogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuQ2VsbEluZm87CiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuQ2VsbExvY2F0aW9uOwogaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlBob25lU3RhdGVMaXN0ZW5lcjsKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5TZXJ2aWNlU3RhdGU7CiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuU2lnbmFsU3RyZW5ndGg7CiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuVGVsZXBob255TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5Db25uZWN0aXZpdHlNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlJlYWRFbGY7CiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5UZXN0VGhyZWFkOwogCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKIHB1YmxpYyBjbGFzcyBQaG9uZVN0YXRlTGlzdGVuZXJUZXN0IGV4dGVuZHMgIEFuZHJvaWRUZXN0Q2FzZXsKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBXQUlUX1RJTUUgPSAxMDAwOwpAQCAtMzcsOSArMzgsMTIgQEAKICAgICBwcml2YXRlIGJvb2xlYW4gbU9uQ2FsbEZvcndhcmRpbmdJbmRpY2F0b3JDaGFuZ2VkQ2FsbGVkOwogICAgIHByaXZhdGUgYm9vbGVhbiBtT25DYWxsU3RhdGVDaGFuZ2VkQ2FsbGVkOwogICAgIHByaXZhdGUgYm9vbGVhbiBtT25DZWxsTG9jYXRpb25DaGFuZ2VkQ2FsbGVkOworICAgIHByaXZhdGUgYm9vbGVhbiBtT25Vc2VyTW9iaWxlRGF0YVN0YXRlQ2hhbmdlZDsKICAgICBwcml2YXRlIGJvb2xlYW4gbU9uRGF0YUFjdGl2aXR5Q2FsbGVkOwogICAgIHByaXZhdGUgYm9vbGVhbiBtT25EYXRhQ29ubmVjdGlvblN0YXRlQ2hhbmdlZENhbGxlZDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbU9uRGF0YUNvbm5lY3Rpb25TdGF0ZUNoYW5nZWRXaXRoTmV0d29ya1R5cGVDYWxsZWQ7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1Pbk1lc3NhZ2VXYWl0aW5nSW5kaWNhdG9yQ2hhbmdlZENhbGxlZDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbU9uQ2VsbEluZm9DaGFuZ2VkQ2FsbGVkOwogICAgIHByaXZhdGUgYm9vbGVhbiBtT25TZXJ2aWNlU3RhdGVDaGFuZ2VkQ2FsbGVkOwogICAgIHByaXZhdGUgYm9vbGVhbiBtT25TaWduYWxTdHJlbmd0aENoYW5nZWRDYWxsZWQ7CiAgICAgcHJpdmF0ZSBTaWduYWxTdHJlbmd0aCBtU2lnbmFsU3RyZW5ndGg7CkBAIC0zNzIsNiArMzc2LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2subm90aWZ5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRGF0YUNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQoaW50IHN0YXRlLCBpbnQgbmV0d29ya1R5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZChtTG9jaykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PbkRhdGFDb25uZWN0aW9uU3RhdGVDaGFuZ2VkV2l0aE5ldHdvcmtUeXBlQ2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTG9jay5ub3RpZnkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgbVRlbGVwaG9ueU1hbmFnZXIubGlzdGVuKAogICAgICAgICAgICAgICAgICAgICAgICAgbUxpc3RlbmVyLCBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX0RBVEFfQ09OTkVDVElPTl9TVEFURSk7CkBAIC0zODEsMTUgKzM5MiwxOCBAQAogICAgICAgICB9KTsKIAogICAgICAgICBhc3NlcnRGYWxzZShtT25EYXRhQ29ubmVjdGlvblN0YXRlQ2hhbmdlZENhbGxlZCk7CisgICAgICAgIGFzc2VydEZhbHNlKG1PbkRhdGFDb25uZWN0aW9uU3RhdGVDaGFuZ2VkV2l0aE5ldHdvcmtUeXBlQ2FsbGVkKTsKICAgICAgICAgdC5zdGFydCgpOwogCiAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIHdoaWxlKCFtT25EYXRhQ29ubmVjdGlvblN0YXRlQ2hhbmdlZENhbGxlZCl7CisgICAgICAgICAgICB3aGlsZSghbU9uRGF0YUNvbm5lY3Rpb25TdGF0ZUNoYW5nZWRDYWxsZWQgfHwKKyAgICAgICAgICAgICAgICAgICAgIW1PbkRhdGFDb25uZWN0aW9uU3RhdGVDaGFuZ2VkV2l0aE5ldHdvcmtUeXBlQ2FsbGVkKXsKICAgICAgICAgICAgICAgICBtTG9jay53YWl0KCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgdC5jaGVja0V4Y2VwdGlvbigpOwogICAgICAgICBhc3NlcnRUcnVlKG1PbkRhdGFDb25uZWN0aW9uU3RhdGVDaGFuZ2VkQ2FsbGVkKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtT25EYXRhQ29ubmVjdGlvblN0YXRlQ2hhbmdlZFdpdGhOZXR3b3JrVHlwZUNhbGxlZCk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdE9uRGF0YUFjdGl2aXR5KCkgdGhyb3dzIFRocm93YWJsZSB7CkBAIC00MjgsNCArNDQyLDc5IEBACiAgICAgICAgIHQuY2hlY2tFeGNlcHRpb24oKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShtT25EYXRhQWN0aXZpdHlDYWxsZWQpOwogICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RPbkNlbGxJbmZvQ2hhbmdlZCgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBpZiAobUNtLmdldE5ldHdvcmtJbmZvKENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9NT0JJTEUpID09IG51bGwpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIlNraXBwaW5nIHRlc3QgdGhhdCByZXF1aXJlcyBDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfTU9CSUxFIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBUZXN0VGhyZWFkIHQgPSBuZXcgVGVzdFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgTG9vcGVyLnByZXBhcmUoKTsKKworICAgICAgICAgICAgICAgIG1MaXN0ZW5lciA9IG5ldyBQaG9uZVN0YXRlTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNlbGxJbmZvQ2hhbmdlZChMaXN0PENlbGxJbmZvPiBjZWxsSW5mbykgeworICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkKG1Mb2NrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU9uQ2VsbEluZm9DaGFuZ2VkQ2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTG9jay5ub3RpZnkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgbVRlbGVwaG9ueU1hbmFnZXIubGlzdGVuKG1MaXN0ZW5lciwgUGhvbmVTdGF0ZUxpc3RlbmVyLkxJU1RFTl9DRUxMX0lORk8pOworCisgICAgICAgICAgICAgICAgTG9vcGVyLmxvb3AoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgYXNzZXJ0RmFsc2UobU9uRGF0YUFjdGl2aXR5Q2FsbGVkKTsKKyAgICAgICAgdC5zdGFydCgpOworCisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIHdoaWxlKCFtT25DZWxsSW5mb0NoYW5nZWRDYWxsZWQpeworICAgICAgICAgICAgICAgIG1Mb2NrLndhaXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0LmNoZWNrRXhjZXB0aW9uKCk7CisgICAgICAgIGFzc2VydFRydWUobU9uQ2VsbEluZm9DaGFuZ2VkQ2FsbGVkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25Vc2VyTW9iaWxlRGF0YVN0YXRlQ2hhbmdlZCgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBpZiAobUNtLmdldE5ldHdvcmtJbmZvKENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9NT0JJTEUpID09IG51bGwpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIlNraXBwaW5nIHRlc3QgdGhhdCByZXF1aXJlcyBDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfTU9CSUxFIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBUZXN0VGhyZWFkIHQgPSBuZXcgVGVzdFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgTG9vcGVyLnByZXBhcmUoKTsKKworICAgICAgICAgICAgICAgIG1MaXN0ZW5lciA9IG5ldyBQaG9uZVN0YXRlTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblVzZXJNb2JpbGVEYXRhU3RhdGVDaGFuZ2VkKGJvb2xlYW4gc3RhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZChtTG9jaykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PblVzZXJNb2JpbGVEYXRhU3RhdGVDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTG9jay5ub3RpZnkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgbVRlbGVwaG9ueU1hbmFnZXIubGlzdGVuKAorICAgICAgICAgICAgICAgICAgICAgICAgbUxpc3RlbmVyLCBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX1VTRVJfTU9CSUxFX0RBVEFfU1RBVEUpOworCisgICAgICAgICAgICAgICAgTG9vcGVyLmxvb3AoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgYXNzZXJ0RmFsc2UobU9uVXNlck1vYmlsZURhdGFTdGF0ZUNoYW5nZWQpOworICAgICAgICB0LnN0YXJ0KCk7CisKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgd2hpbGUoIW1PblVzZXJNb2JpbGVEYXRhU3RhdGVDaGFuZ2VkKXsKKyAgICAgICAgICAgICAgICBtTG9jay53YWl0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdC5jaGVja0V4Y2VwdGlvbigpOworICAgICAgICBhc3NlcnRUcnVlKG1PblVzZXJNb2JpbGVEYXRhU3RhdGVDaGFuZ2VkKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZWxlcGhvbnkvc3JjL2FuZHJvaWQvdGVsZXBob255L2N0cy9SYWRpb0FjY2Vzc1NwZWNpZmllclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvY3RzL1JhZGlvQWNjZXNzU3BlY2lmaWVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MzQ3MmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy90ZWxlcGhvbnkvc3JjL2FuZHJvaWQvdGVsZXBob255L2N0cy9SYWRpb0FjY2Vzc1NwZWNpZmllclRlc3QuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC50ZWxlcGhvbnkuY3RzOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLnRydXRoLlRydXRoLmFzc2VydFRoYXQ7CisKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5SYWRpb0FjY2Vzc1NwZWNpZmllcjsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgUmFkaW9BY2Nlc3NTcGVjaWZpZXJUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JBbmRHZXR0ZXJzKCkgeworICAgICAgICAvLyBDb25zdHJ1Y3RvciBhbmQgZ2V0dGVycy4KKyAgICAgICAgaW50IHJhbiA9IDE7CisgICAgICAgIGludFtdIGJhbmRzID0gezEsIDIsIDMsIDR9OworICAgICAgICBpbnRbXSBjaGFubmVscyA9IHs1LCA2LCA3fTsKKyAgICAgICAgUmFkaW9BY2Nlc3NTcGVjaWZpZXIgcmFkaW9BY2Nlc3NTcGVjaWZpZXIgPSBuZXcgUmFkaW9BY2Nlc3NTcGVjaWZpZXIocmFuLCBiYW5kcywgY2hhbm5lbHMpOworICAgICAgICBhc3NlcnRUaGF0KHJhZGlvQWNjZXNzU3BlY2lmaWVyLmRlc2NyaWJlQ29udGVudHMoKSkuaXNFcXVhbFRvKDApOworICAgICAgICBhc3NlcnRUaGF0KHJhZGlvQWNjZXNzU3BlY2lmaWVyLmdldFJhZGlvQWNjZXNzTmV0d29yaygpKS5pc0VxdWFsVG8ocmFuKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyYWRpb0FjY2Vzc1NwZWNpZmllci5nZXRCYW5kcygpKS5pc0VxdWFsVG8oYmFuZHMpOworICAgICAgICBhc3NlcnRUaGF0KHJhZGlvQWNjZXNzU3BlY2lmaWVyLmdldENoYW5uZWxzKCkpLmlzRXF1YWxUbyhjaGFubmVscyk7CisKKyAgICAgICAgLy8gQ29tcGFyaXNpb24gbWV0aG9kLgorICAgICAgICBSYWRpb0FjY2Vzc1NwZWNpZmllciB0b0NvbXBhcmUxID0gbmV3IFJhZGlvQWNjZXNzU3BlY2lmaWVyKHJhbiwgYmFuZHMsIGNoYW5uZWxzKTsKKyAgICAgICAgUmFkaW9BY2Nlc3NTcGVjaWZpZXIgdG9Db21wYXJlMiA9IG5ldyBSYWRpb0FjY2Vzc1NwZWNpZmllcihyYW4sIG5ldyBpbnRbXSB7MSwgMiwgMywgNH0sCisgICAgICAgICAgICAgICAgbmV3IGludFtdIHs1LCA2LCA3fSk7CisgICAgICAgIFJhZGlvQWNjZXNzU3BlY2lmaWVyIHRvQ29tcGFyZTMgPSBuZXcgUmFkaW9BY2Nlc3NTcGVjaWZpZXIocmFuKzEsIGJhbmRzLCBjaGFubmVscyk7CisgICAgICAgIGFzc2VydFRoYXQocmFkaW9BY2Nlc3NTcGVjaWZpZXIpLmlzRXF1YWxUbyh0b0NvbXBhcmUxKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyYWRpb0FjY2Vzc1NwZWNpZmllcikuaXNFcXVhbFRvKHRvQ29tcGFyZTIpOworICAgICAgICBhc3NlcnRUaGF0KHJhZGlvQWNjZXNzU3BlY2lmaWVyKS5pc05vdEVxdWFsVG8odG9Db21wYXJlMyk7CisKKyAgICAgICAgLy8gUGFyY2VsIHJlYWQgYW5kIHdyaXRlLgorICAgICAgICBQYXJjZWwgc3RhdGVQYXJjZWwgPSBQYXJjZWwub2J0YWluKCk7CisgICAgICAgIHJhZGlvQWNjZXNzU3BlY2lmaWVyLndyaXRlVG9QYXJjZWwoc3RhdGVQYXJjZWwsIDApOworICAgICAgICBzdGF0ZVBhcmNlbC5zZXREYXRhUG9zaXRpb24oMCk7CisgICAgICAgIHRvQ29tcGFyZTEgPSBSYWRpb0FjY2Vzc1NwZWNpZmllci5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoc3RhdGVQYXJjZWwpOworICAgICAgICBhc3NlcnRUaGF0KHJhZGlvQWNjZXNzU3BlY2lmaWVyKS5pc0VxdWFsVG8odG9Db21wYXJlMSk7CisKKyAgICAgICAgLy8gT3RoZXIgbWV0aG9kcy4KKyAgICAgICAgYXNzZXJ0VGhhdChyYWRpb0FjY2Vzc1NwZWNpZmllci5oYXNoQ29kZSgpKS5pc0dyZWF0ZXJUaGFuKDApOworICAgICAgICBhc3NlcnRUaGF0KHJhZGlvQWNjZXNzU3BlY2lmaWVyLnRvU3RyaW5nKCkpLmlzTm90TnVsbCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvY3RzL1NlcnZpY2VTdGF0ZVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvY3RzL1NlcnZpY2VTdGF0ZVRlc3QuamF2YQppbmRleCA1OWE0NGVkLi40N2YxNDI5IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy90ZWxlcGhvbnkvc3JjL2FuZHJvaWQvdGVsZXBob255L2N0cy9TZXJ2aWNlU3RhdGVUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdGVsZXBob255L3NyYy9hbmRyb2lkL3RlbGVwaG9ueS9jdHMvU2VydmljZVN0YXRlVGVzdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTUsNyArMTUsMTIgQEAKICAqLwogcGFja2FnZSBhbmRyb2lkLnRlbGVwaG9ueS5jdHM7CiAKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC50ZWxlcGhvbnkuU2VydmljZVN0YXRlLkRVUExFWF9NT0RFX0ZERDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC50ZWxlcGhvbnkuU2VydmljZVN0YXRlLkRVUExFWF9NT0RFX1RERDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC50ZWxlcGhvbnkuU2VydmljZVN0YXRlLkRVUExFWF9NT0RFX1VOS05PV047CisKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5BY2Nlc3NOZXR3b3JrQ29uc3RhbnRzOwogaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlNlcnZpY2VTdGF0ZTsKIGltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwogCkBAIC0yMyw2ICsyOCwxMSBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPUEVSQVRPUl9BTFBIQV9MT05HID0gIkN0c09wZXJhdG9yTG9uZyI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9QRVJBVE9SX0FMUEhBX1NIT1JUID0gIkN0c09wIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFUkFUT1JfTlVNRVJJQyA9ICIwMjg3MSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNZU1RFTV9JRCA9IDEyMzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTkVUV09SS19JRCA9IDQ1NjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0hBTk5FTF9OVU1CRVJfQkFORF82NiA9IDY2NDM2OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDSEFOTkVMX05VTUJFUl9CQU5EXzMzID0gMzYwMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gQ0VMTF9CQU5EV0lEVEggPSB7MSwgMiwgM307CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VydmljZVN0YXRlKCkgewogICAgICAgICBTZXJ2aWNlU3RhdGUgc2VydmljZVN0YXRlID0gbmV3IFNlcnZpY2VTdGF0ZSgpOwpAQCAtNTMsNiArNjMsMjUgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKE9QRVJBVE9SX0FMUEhBX1NIT1JULCBzZXJ2aWNlU3RhdGUuZ2V0T3BlcmF0b3JBbHBoYVNob3J0KCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoT1BFUkFUT1JfTlVNRVJJQywgc2VydmljZVN0YXRlLmdldE9wZXJhdG9yTnVtZXJpYygpKTsKIAorICAgICAgICBzZXJ2aWNlU3RhdGUuc2V0Q2RtYVN5c3RlbUFuZE5ldHdvcmtJZChTWVNURU1fSUQsIE5FVFdPUktfSUQpOworICAgICAgICBhc3NlcnRFcXVhbHMoU1lTVEVNX0lELCBzZXJ2aWNlU3RhdGUuZ2V0Q2RtYVN5c3RlbUlkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTkVUV09SS19JRCwgc2VydmljZVN0YXRlLmdldENkbWFOZXR3b3JrSWQoKSk7CisKKyAgICAgICAgc2VydmljZVN0YXRlLnNldENoYW5uZWxOdW1iZXIoQ0hBTk5FTF9OVU1CRVJfQkFORF82Nik7CisgICAgICAgIGFzc2VydEVxdWFscyhDSEFOTkVMX05VTUJFUl9CQU5EXzY2LCBzZXJ2aWNlU3RhdGUuZ2V0Q2hhbm5lbE51bWJlcigpKTsKKworICAgICAgICBzZXJ2aWNlU3RhdGUuc2V0Q2VsbEJhbmR3aWR0aHMoQ0VMTF9CQU5EV0lEVEgpOworICAgICAgICBhc3NlcnRFcXVhbHMoQ0VMTF9CQU5EV0lEVEgsIHNlcnZpY2VTdGF0ZS5nZXRDZWxsQmFuZHdpZHRocygpKTsKKworICAgICAgICBzZXJ2aWNlU3RhdGUuc2V0UmlsRGF0YVJhZGlvVGVjaG5vbG9neShTZXJ2aWNlU3RhdGUuUklMX1JBRElPX1RFQ0hOT0xPR1lfR1NNKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKERVUExFWF9NT0RFX1VOS05PV04sIHNlcnZpY2VTdGF0ZS5nZXREdXBsZXhNb2RlKCkpOworCisgICAgICAgIHNlcnZpY2VTdGF0ZS5zZXRSaWxEYXRhUmFkaW9UZWNobm9sb2d5KFNlcnZpY2VTdGF0ZS5SSUxfUkFESU9fVEVDSE5PTE9HWV9MVEUpOworICAgICAgICBhc3NlcnRFcXVhbHMoRFVQTEVYX01PREVfRkRELCBzZXJ2aWNlU3RhdGUuZ2V0RHVwbGV4TW9kZSgpKTsKKworICAgICAgICBzZXJ2aWNlU3RhdGUuc2V0Q2hhbm5lbE51bWJlcihDSEFOTkVMX05VTUJFUl9CQU5EXzMzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKERVUExFWF9NT0RFX1RERCwgc2VydmljZVN0YXRlLmdldER1cGxleE1vZGUoKSk7CisKICAgICAgICAgYXNzZXJ0VHJ1ZShzZXJ2aWNlU3RhdGUuaGFzaENvZGUoKSA+IDApOwogICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VTdGF0ZS50b1N0cmluZygpKTsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGVsZXBob255L3NyYy9hbmRyb2lkL3RlbGVwaG9ueS9jdHMvU2ltUmVzdHJpY3RlZEFwaXNUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy90ZWxlcGhvbnkvc3JjL2FuZHJvaWQvdGVsZXBob255L2N0cy9TaW1SZXN0cmljdGVkQXBpc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkyOGRhYi4uMDAwMDAwMAotLS0gYS90ZXN0cy90ZXN0cy90ZWxlcGhvbnkvc3JjL2FuZHJvaWQvdGVsZXBob255L2N0cy9TaW1SZXN0cmljdGVkQXBpc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnRlbGVwaG9ueS5jdHM7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5TbXNNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlRlbGVwaG9ueU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFNpbVJlc3RyaWN0ZWRBcGlzVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIFRFU1RfUERVID0geyAwLCAwIH07Ci0gICAgcHJpdmF0ZSBUZWxlcGhvbnlNYW5hZ2VyIG1UZWxlcGhvbnlNYW5hZ2VyOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgbVRlbGVwaG9ueU1hbmFnZXIgPQotICAgICAgICAgICAgICAgIChUZWxlcGhvbnlNYW5hZ2VyKSBnZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlRFTEVQSE9OWV9TRVJWSUNFKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNTaW1DYXJkUHJlc2VudCgpIHsKLSAgICAgICAgcmV0dXJuIG1UZWxlcGhvbnlNYW5hZ2VyLmdldFBob25lVHlwZSgpICE9IFRlbGVwaG9ueU1hbmFnZXIuUEhPTkVfVFlQRV9OT05FICYmCi0gICAgICAgICAgICAgICAgbVRlbGVwaG9ueU1hbmFnZXIuZ2V0U2ltU3RhdGUoKSAhPSBUZWxlcGhvbnlNYW5hZ2VyLlNJTV9TVEFURV9BQlNFTlQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhlIFNtc01hbmFnZXIuaW5qZWN0U21zUGR1KCkgQVBJLiBUaGlzIG1ha2VzIGEgY2FsbCB0byBpbmplY3RTbXNQZHUoKSBBUEkgYW5kIGV4cGVjdHMKLSAgICAgKiBhIFNlY3VyaXR5RXhjZXB0aW9uIHNpbmNlIHRoZSB0ZXN0IGFwayBpcyBub3Qgc2lnbmVkIGJ5IGEgY2VydGlmaWNhdGUgb24gdGhlIFNJTS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5qZWN0U21zUGR1KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGlzU2ltQ2FyZFByZXNlbnQoKSkgewotICAgICAgICAgICAgICAgIFNtc01hbmFnZXIuZ2V0RGVmYXVsdCgpLmluamVjdFNtc1BkdShURVNUX1BEVSwgIjNncHAiLCBudWxsKTsKLSAgICAgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBTZWN1cml0eUV4Y2VwdGlvbi4gQXBwIGRvZXNuJ3QgaGF2ZSBjYXJyaWVyIHByaXZpbGVnZXMuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGV4cGVjdGVkKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGUgVGVsZXBob255TWFuYWdlci5zZXRMaW5lMU51bWJlckZvckRpc3BsYXkoKSBBUEkuIFRoaXMgbWFrZXMgYSBjYWxsIHRvCi0gICAgICogc2V0TGluZTFOdW1iZXJGb3JEaXNwbGF5KCkgQVBJIGFuZCBleHBlY3RzIGEgU2VjdXJpdHlFeGNlcHRpb24gc2luY2UgdGhlIHRlc3QgYXBrIGlzIG5vdAotICAgICAqIHNpZ25lZCBieSBhIGNlcnRpZmljYXRlIG9uIHRoZSBTSU0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFNldExpbmUxTnVtYmVyRm9yRGlzcGxheSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChpc1NpbUNhcmRQcmVzZW50KCkpIHsKLSAgICAgICAgICAgICAgICBUZWxlcGhvbnlNYW5hZ2VyLmdldERlZmF1bHQoKS5zZXRMaW5lMU51bWJlckZvckRpc3BsYXkoIiIsICIiKTsKLSAgICAgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBTZWN1cml0eUV4Y2VwdGlvbi4gQXBwIGRvZXNuJ3QgaGF2ZSBjYXJyaWVyIHByaXZpbGVnZXMuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGV4cGVjdGVkKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGUgVGVsZXBob255TWFuYWdlci5zZXRMaW5lMU51bWJlckZvckRpc3BsYXkobG9uZywgc3RyaW5nLCBzdHJpbmcpIEFQSS4gVGhpcyBtYWtlcyBhCi0gICAgICogY2FsbCB0byBzZXRMaW5lMU51bWJlckZvckRpc3BsYXkoKSBBUEkgYW5kIGV4cGVjdHMgYSBTZWN1cml0eUV4Y2VwdGlvbiBzaW5jZSB0aGUgdGVzdCBhcGsgaXMKLSAgICAgKiBub3Qgc2lnbmVkIGJ5IHRoZSBjZXJ0aWZpY2F0ZSBvbiB0aGUgU0lNLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRMaW5lMU51bWJlckZvckRpc3BsYXkyKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGlzU2ltQ2FyZFByZXNlbnQoKSkgewotICAgICAgICAgICAgICAgIFRlbGVwaG9ueU1hbmFnZXIuZ2V0RGVmYXVsdCgpLnNldExpbmUxTnVtYmVyRm9yRGlzcGxheSgwLCAiIiwgIiIpOwotICAgICAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIFNlY3VyaXR5RXhjZXB0aW9uLiBBcHAgZG9lc24ndCBoYXZlIGNhcnJpZXIgcHJpdmlsZWdlcy4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZXhwZWN0ZWQpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoZSBUZWxlcGhvbnlNYW5hZ2VyLmljY09wZW5Mb2dpY2FsQ2hhbm5lbCgpIEFQSS4gVGhpcyBtYWtlcyBhIGNhbGwgdG8KLSAgICAgKiBpY2NPcGVuTG9naWNhbENoYW5uZWwoKSBBUEkgYW5kIGV4cGVjdHMgYSBTZWN1cml0eUV4Y2VwdGlvbiBzaW5jZSB0aGUgdGVzdCBhcGsgaXMgbm90IHNpZ25lZAotICAgICAqIGJ5IGNlcnRpZmljYXRlIG9uIHRoZSBTSU0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEljY09wZW5Mb2dpY2FsQ2hhbm5lbCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChpc1NpbUNhcmRQcmVzZW50KCkpIHsKLSAgICAgICAgICAgICAgICBUZWxlcGhvbnlNYW5hZ2VyLmdldERlZmF1bHQoKS5pY2NDbG9zZUxvZ2ljYWxDaGFubmVsKAotICAgICAgICAgICAgICAgICAgICAgICAgVGVsZXBob255TWFuYWdlci5nZXREZWZhdWx0KCkuaWNjT3BlbkxvZ2ljYWxDaGFubmVsKCIiKS5nZXRDaGFubmVsKCkpOwotICAgICAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIFNlY3VyaXR5RXhjZXB0aW9uLiBBcHAgZG9lc24ndCBoYXZlIGNhcnJpZXIgcHJpdmlsZWdlcy4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZXhwZWN0ZWQpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoZSBUZWxlcGhvbnlNYW5hZ2VyLmljY0Nsb3NlTG9naWNhbENoYW5uZWwoKSBBUEkuIFRoaXMgbWFrZXMgYSBjYWxsIHRvCi0gICAgICogaWNjQ2xvc2VMb2dpY2FsQ2hhbm5lbCgpIEFQSSBhbmQgZXhwZWN0cyBhIFNlY3VyaXR5RXhjZXB0aW9uIHNpbmNlIHRoZSB0ZXN0IGFwayBpcyBub3Qgc2lnbmVkCi0gICAgICogYnkgY2VydGlmaWNhdGUgb24gdGhlIFNJTS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SWNjQ2xvc2VMb2dpY2FsQ2hhbm5lbCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChpc1NpbUNhcmRQcmVzZW50KCkpIHsKLSAgICAgICAgICAgICAgICBUZWxlcGhvbnlNYW5hZ2VyLmdldERlZmF1bHQoKS5pY2NDbG9zZUxvZ2ljYWxDaGFubmVsKDApOwotICAgICAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIFNlY3VyaXR5RXhjZXB0aW9uLiBBcHAgZG9lc24ndCBoYXZlIGNhcnJpZXIgcHJpdmlsZWdlcy4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZXhwZWN0ZWQpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoZSBUZWxlcGhvbnlNYW5hZ2VyLmljY1RyYW5zbWl0QXBkdUxvZ2ljYWxDaGFubmVsKCkgQVBJLiBUaGlzIG1ha2VzIGEgY2FsbCB0bwotICAgICAqIGljY1RyYW5zbWl0QXBkdUxvZ2ljYWxDaGFubmVsKCkgQVBJIGFuZCBleHBlY3RzIGEgU2VjdXJpdHlFeGNlcHRpb24gc2luY2UgdGhlIHRlc3QgYXBrIGlzIG5vdAotICAgICAqIHNpZ25lZCBieSBhIGNlcnRpZmljYXRlIG9uIHRoZSBTSU0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEljY1RyYW5zbWl0QXBkdUxvZ2ljYWxDaGFubmVsKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGlzU2ltQ2FyZFByZXNlbnQoKSkgewotICAgICAgICAgICAgICAgIFRlbGVwaG9ueU1hbmFnZXIuZ2V0RGVmYXVsdCgpLmljY1RyYW5zbWl0QXBkdUxvZ2ljYWxDaGFubmVsKDAsIDAsIDAsIDAsIDAsIDAsICIiKTsKLSAgICAgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBTZWN1cml0eUV4Y2VwdGlvbi4gQXBwIGRvZXNuJ3QgaGF2ZSBjYXJyaWVyIHByaXZpbGVnZXMuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGV4cGVjdGVkKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGUgVGVsZXBob255TWFuYWdlci5pY2NUcmFuc21pdEFwZHVCYXNpY0NoYW5uZWwoKSBBUEkuIFRoaXMgbWFrZXMgYSBjYWxsIHRvCi0gICAgICogaWNjVHJhbnNtaXRBcGR1QmFzaWNDaGFubmVsKCkgQVBJIGFuZCBleHBlY3RzIGEgU2VjdXJpdHlFeGNlcHRpb24gc2luY2UgdGhlIHRlc3QgYXBrIGlzIG5vdAotICAgICAqIHNpZ25lZCBieSBhIGNlcnRpZmljYXRlIG9uIHRoZSBTSU0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEljY1RyYW5zbWl0QXBkdUJhc2ljQ2hhbm5lbCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChpc1NpbUNhcmRQcmVzZW50KCkpIHsKLSAgICAgICAgICAgICAgICBUZWxlcGhvbnlNYW5hZ2VyLmdldERlZmF1bHQoKS5pY2NUcmFuc21pdEFwZHVCYXNpY0NoYW5uZWwoMCwgMCwgMCwgMCwgMCwgIiIpOwotICAgICAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIFNlY3VyaXR5RXhjZXB0aW9uLiBBcHAgZG9lc24ndCBoYXZlIGNhcnJpZXIgcHJpdmlsZWdlcy4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZXhwZWN0ZWQpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoZSBUZWxlcGhvbnlNYW5hZ2VyLnNlbmRFbnZlbG9wZVdpdGhTdGF0dXMoKSBBUEkuIFRoaXMgbWFrZXMgYSBjYWxsIHRvCi0gICAgICogc2VuZEVudmVsb3BlV2l0aFN0YXR1cygpIEFQSSBhbmQgZXhwZWN0cyBhIFNlY3VyaXR5RXhjZXB0aW9uIHNpbmNlIHRoZSB0ZXN0IGFwayBpcyBub3Qgc2lnbmVkCi0gICAgICogYnkgY2VydGlmaWNhdGUgb24gdGhlIFNJTS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZEVudmVsb3BlV2l0aFN0YXR1cygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChpc1NpbUNhcmRQcmVzZW50KCkpIHsKLSAgICAgICAgICAgICAgICBUZWxlcGhvbnlNYW5hZ2VyLmdldERlZmF1bHQoKS5zZW5kRW52ZWxvcGVXaXRoU3RhdHVzKCIiKTsKLSAgICAgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBTZWN1cml0eUV4Y2VwdGlvbi4gQXBwIGRvZXNuJ3QgaGF2ZSBjYXJyaWVyIHByaXZpbGVnZXMuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGV4cGVjdGVkKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGUgVGVsZXBob255TWFuYWdlci5udlJlYWRJdGVtKCkgQVBJLiBUaGlzIG1ha2VzIGEgY2FsbCB0byBudlJlYWRJdGVtKCkgQVBJIGFuZAotICAgICAqIGV4cGVjdHMgYSBTZWN1cml0eUV4Y2VwdGlvbiBzaW5jZSB0aGUgdGVzdCBhcGsgaXMgbm90IHNpZ25lZCBieSBhIGNlcnRpZmljYXRlIG9uIHRoZSBTSU0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE52UmVhZEl0ZW0oKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoaXNTaW1DYXJkUHJlc2VudCgpKSB7Ci0gICAgICAgICAgICAgICAgVGVsZXBob255TWFuYWdlci5nZXREZWZhdWx0KCkubnZSZWFkSXRlbSgwKTsKLSAgICAgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBTZWN1cml0eUV4Y2VwdGlvbi4gQXBwIGRvZXNuJ3QgaGF2ZSBjYXJyaWVyIHByaXZpbGVnZXMuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGV4cGVjdGVkKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGUgVGVsZXBob255TWFuYWdlci5udldyaXRlSXRlbSgpIEFQSS4gVGhpcyBtYWtlcyBhIGNhbGwgdG8gbnZXcml0ZUl0ZW0oKSBBUEkgYW5kCi0gICAgICogZXhwZWN0cyBhIFNlY3VyaXR5RXhjZXB0aW9uIHNpbmNlIHRoZSB0ZXN0IGFwayBpcyBub3Qgc2lnbmVkIGJ5IGEgY2VydGlmaWNhdGUgb24gdGhlIFNJTS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TnZXcml0ZUl0ZW0oKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoaXNTaW1DYXJkUHJlc2VudCgpKSB7Ci0gICAgICAgICAgICAgICAgVGVsZXBob255TWFuYWdlci5nZXREZWZhdWx0KCkubnZXcml0ZUl0ZW0oMCwgIiIpOwotICAgICAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIFNlY3VyaXR5RXhjZXB0aW9uLiBBcHAgZG9lc24ndCBoYXZlIGNhcnJpZXIgcHJpdmlsZWdlcy4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZXhwZWN0ZWQpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoZSBUZWxlcGhvbnlNYW5hZ2VyLm52V3JpdGVDZG1hUHJsKCkgQVBJLiBUaGlzIG1ha2VzIGEgY2FsbCB0byBudldyaXRlQ2RtYVBybCgpIEFQSQotICAgICAqIGFuZCBleHBlY3RzIGEgU2VjdXJpdHlFeGNlcHRpb24gc2luY2UgdGhlIHRlc3QgYXBrIGlzIG5vdCBzaWduZWQgYnkgYSBjZXJ0aWZpY2F0ZSBvbiB0aGUgU0lNLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3ROdldyaXRlQ2RtYVBybCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChpc1NpbUNhcmRQcmVzZW50KCkpIHsKLSAgICAgICAgICAgICAgICBUZWxlcGhvbnlNYW5hZ2VyLmdldERlZmF1bHQoKS5udldyaXRlQ2RtYVBybChudWxsKTsKLSAgICAgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBTZWN1cml0eUV4Y2VwdGlvbi4gQXBwIGRvZXNuJ3QgaGF2ZSBjYXJyaWVyIHByaXZpbGVnZXMuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGV4cGVjdGVkKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGUgVGVsZXBob255TWFuYWdlci5udlJlc2V0Q29uZmlnKCkgQVBJLiBUaGlzIG1ha2VzIGEgY2FsbCB0byBudlJlc2V0Q29uZmlnKCkgQVBJIGFuZAotICAgICAqIGV4cGVjdHMgYSBTZWN1cml0eUV4Y2VwdGlvbiBzaW5jZSB0aGUgdGVzdCBhcGsgaXMgbm90IHNpZ25lZCBieSBhIGNlcnRpZmljYXRlIG9uIHRoZSBTSU0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE52UmVzZXRDb25maWcoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoaXNTaW1DYXJkUHJlc2VudCgpKSB7Ci0gICAgICAgICAgICAgICAgVGVsZXBob255TWFuYWdlci5nZXREZWZhdWx0KCkubnZSZXNldENvbmZpZygwKTsKLSAgICAgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBTZWN1cml0eUV4Y2VwdGlvbi4gQXBwIGRvZXNuJ3QgaGF2ZSBjYXJyaWVyIHByaXZpbGVnZXMuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGV4cGVjdGVkKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGUgVGVsZXBob255TWFuYWdlci5nZXRQcmVmZXJyZWROZXR3b3JrVHlwZSgpIEFQSS4gVGhpcyBtYWtlcyBhIGNhbGwgdG8KLSAgICAgKiBnZXRQcmVmZXJyZWROZXR3b3JrVHlwZSgpIEFQSSBhbmQgZXhwZWN0cyBhIFNlY3VyaXR5RXhjZXB0aW9uIHNpbmNlIHRoZSB0ZXN0IGFwayBpcyBub3QKLSAgICAgKiBzaWduZWQgYnkgY2VydGlmaWNhdGUgb24gdGhlIFNJTS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UHJlZmVycmVkTmV0d29ya1R5cGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoaXNTaW1DYXJkUHJlc2VudCgpKSB7Ci0gICAgICAgICAgICAgICAgVGVsZXBob255TWFuYWdlci5nZXREZWZhdWx0KCkuZ2V0UHJlZmVycmVkTmV0d29ya1R5cGUoMCk7Ci0gICAgICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgU2VjdXJpdHlFeGNlcHRpb24uIEFwcCBkb2Vzbid0IGhhdmUgY2FycmllciBwcml2aWxlZ2VzLiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBleHBlY3RlZCkgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhlIFRlbGVwaG9ueU1hbmFnZXIuc2V0UHJlZmVycmVkTmV0d29ya1R5cGVUb0dsb2JhbCgpIEFQSS4gVGhpcyBtYWtlcyBhIGNhbGwgdG8KLSAgICAgKiBzZXRQcmVmZXJyZWROZXR3b3JrVHlwZVRvR2xvYmFsKCkgQVBJIGFuZCBleHBlY3RzIGEgU2VjdXJpdHlFeGNlcHRpb24gc2luY2UgdGhlIHRlc3QgYXBrIGlzIG5vdAotICAgICAqIHNpZ25lZCBieSBjZXJ0aWZpY2F0ZSBvbiB0aGUgU0lNLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRQcmVmZXJyZWROZXR3b3JrVHlwZVRvR2xvYmFsKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGlzU2ltQ2FyZFByZXNlbnQoKSkgewotICAgICAgICAgICAgICAgIFRlbGVwaG9ueU1hbmFnZXIuZ2V0RGVmYXVsdCgpLnNldFByZWZlcnJlZE5ldHdvcmtUeXBlVG9HbG9iYWwoKTsKLSAgICAgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBTZWN1cml0eUV4Y2VwdGlvbi4gQXBwIGRvZXNuJ3QgaGF2ZSBjYXJyaWVyIHByaXZpbGVnZXMuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGV4cGVjdGVkKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGF0IHRoZSB0ZXN0IGFwayBkb2Vzbid0IGhhdmUgY2FycmllciBwcmV2aWxpZ2VzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNDYXJyaWVyUHJpdmlsZWdlcygpIHsKLSAgICAgICAgaWYgKG1UZWxlcGhvbnlNYW5hZ2VyLmhhc0NhcnJpZXJQcml2aWxlZ2VzKCkpIHsKLSAgICAgICAgICAgIGZhaWwoIkFwcCB1bmV4cGVjdGVkbHkgaGFzIGNhcnJpZXIgcHJpdmlsZWdlcyIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhlIFRlbGVwaG9ueU1hbmFnZXIuc2V0T3BlcmF0b3JCcmFuZE92ZXJyaWRlKCkgQVBJLiBUaGlzIG1ha2VzIGEgY2FsbCB0bwotICAgICAqIHNldE9wZXJhdG9yQnJhbmRPdmVycmlkZSgpIEFQSSBhbmQgZXhwZWN0cyBhIFNlY3VyaXR5RXhjZXB0aW9uIHNpbmNlIHRoZSB0ZXN0IGFwayBpcyBub3QKLSAgICAgKiBzaWduZWQgYnkgY2VydGlmaWNhdGUgb24gdGhlIFNJTS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0T3BlcmF0b3JCcmFuZE92ZXJyaWRlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGlzU2ltQ2FyZFByZXNlbnQoKSkgewotICAgICAgICAgICAgICAgIFRlbGVwaG9ueU1hbmFnZXIuZ2V0RGVmYXVsdCgpLnNldE9wZXJhdG9yQnJhbmRPdmVycmlkZSgiIik7Ci0gICAgICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgU2VjdXJpdHlFeGNlcHRpb24uIEFwcCBkb2Vzbid0IGhhdmUgY2FycmllciBwcml2aWxlZ2VzLiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBleHBlY3RlZCkgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhlIFRlbGVwaG9ueU1hbmFnZXIuZ2V0SWNjQXV0aGVudGljYXRpb24oKSBBUEkuIFRoaXMgbWFrZXMgYSBjYWxsIHRvCi0gICAgICogZ2V0SWNjQXV0aGVudGljYXRpb24oKSBBUEkgYW5kIGV4cGVjdHMgYSBTZWN1cml0eUV4Y2VwdGlvbiBzaW5jZSB0aGUgdGVzdCBhcGsgaXMgbm90Ci0gICAgICogc2lnbmVkIGJ5IGNlcnRpZmljYXRlIG9uIHRoZSBTSU0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEdldEljY0F1dGhlbnRpY2F0aW9uKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGlzU2ltQ2FyZFByZXNlbnQoKSkgewotICAgICAgICAgICAgICAgIFRlbGVwaG9ueU1hbmFnZXIuZ2V0RGVmYXVsdCgpLmdldEljY0F1dGhlbnRpY2F0aW9uKFRlbGVwaG9ueU1hbmFnZXIuQVBQVFlQRV9VU0lNLAotICAgICAgICAgICAgICAgICAgICAgICAgVGVsZXBob255TWFuYWdlci5BVVRIVFlQRV9FQVBfQUtBLCAiIik7Ci0gICAgICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgU2VjdXJpdHlFeGNlcHRpb24uIEFwcCBkb2Vzbid0IGhhdmUgY2FycmllciBwcml2aWxlZ2VzLiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBleHBlY3RlZCkgewotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGVsZXBob255L3NyYy9hbmRyb2lkL3RlbGVwaG9ueS9jdHMvU21zTWFuYWdlclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvY3RzL1Ntc01hbmFnZXJUZXN0LmphdmEKaW5kZXggMzA5Njg0MC4uODk4MTRhYSAxMDA3NTUKLS0tIGEvdGVzdHMvdGVzdHMvdGVsZXBob255L3NyYy9hbmRyb2lkL3RlbGVwaG9ueS9jdHMvU21zTWFuYWdlclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy90ZWxlcGhvbnkvc3JjL2FuZHJvaWQvdGVsZXBob255L2N0cy9TbXNNYW5hZ2VyVGVzdC5qYXZhCkBAIC0xNiwxMSArMTYsMTIgQEAKIAogcGFja2FnZSBhbmRyb2lkLnRlbGVwaG9ueS5jdHM7CiAKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5CbG9ja2VkTnVtYmVyVXRpbC5kZWxldGVCbG9ja2VkTnVtYmVyOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkJsb2NrZWROdW1iZXJVdGlsLmluc2VydEJsb2NrZWROdW1iZXI7CiAKIGltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuYXBwLlVpQXV0b21hdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwpAQCAtMjksNyArMzAsNiBAQAogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3I7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkJsb2NrZWROdW1iZXJDb250cmFjdDsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlRlbGVwaG9ueTsKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5TbXNNZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlRlbGVwaG9ueU1hbmFnZXI7CkBAIC0zOCw4ICszOCw2IEBACiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DZGRUZXN0OwotCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpAQCAtNTUsNyArNTMsNiBAQAogICoKICAqIFN0cnVjdHVyZWQgc28gdGVzdHMgY2FuIGJlIHJldXNlZCB0byB0ZXN0IHtAbGluayBhbmRyb2lkLnRlbGVwaG9ueS5nc20uU21zTWFuYWdlcn0KICAqLwotQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuNC4xL0MtMS0yLEMtMi0xIikKIHB1YmxpYyBjbGFzcyBTbXNNYW5hZ2VyVGVzdCBleHRlbmRzIEluc3RydW1lbnRhdGlvblRlc3RDYXNlIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU21zTWFuYWdlclRlc3QiOwpAQCAtMTIxLDcgKzExOCw3IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKG1CbG9ja2VkTnVtYmVyVXJpICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLmRlbGV0ZShtQmxvY2tlZE51bWJlclVyaSwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICB1bmJsb2NrTnVtYmVyKG1CbG9ja2VkTnVtYmVyVXJpKTsKICAgICAgICAgICAgIG1CbG9ja2VkTnVtYmVyVXJpID0gbnVsbDsKICAgICAgICAgfQogICAgICAgICBpZiAobVRlc3RBcHBTZXRBc0RlZmF1bHRTbXNBcHApIHsKQEAgLTI4Niw2ICsyODMsMjQgQEAKICAgICAgICAgfQogICAgIH0KIAorCisgICAgcHVibGljIHZvaWQgdGVzdFNtc05vdFBlcnNpc3RlZF9mYWlsc1dpdGhvdXRDYXJyaWVyUGVybWlzc2lvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFtUGFja2FnZU1hbmFnZXIuaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX1RFTEVQSE9OWSkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydEZhbHNlKCJbUkVSVU5dIFNJTSBjYXJkIGRvZXMgbm90IHByb3ZpZGUgcGhvbmUgbnVtYmVyLiBVc2UgYSBzdWl0YWJsZSBTSU0gQ2FyZC4iLAorICAgICAgICAgICAgICAgIFRleHRVdGlscy5pc0VtcHR5KG1EZXN0QWRkcikpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBnZXRTbXNNYW5hZ2VyKCkuc2VuZFRleHRNZXNzYWdlV2l0aG91dFBlcnNpc3RpbmcobURlc3RBZGRyLCBudWxsIC8qc2NBZGRyZXNzICovLAorICAgICAgICAgICAgICAgICAgICBtRGVzdEFkZHIsIG1TZW50SW50ZW50LCBtRGVsaXZlcmVkSW50ZW50KTsKKyAgICAgICAgICAgIGZhaWwoIldlIHNob3VsZCBnZXQgYSBTZWN1cml0eUV4Y2VwdGlvbiBkdWUgdG8gbm90IGhhdmluZyBjYXJyaWVyIHByaXZpbGVnZXMiKTsKKyAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gU3VjY2VzcworICAgICAgICB9CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIGluaXQoKSB7CiAgICAgICAgIG1TZW5kUmVjZWl2ZXIucmVzZXQoKTsKICAgICAgICAgbURlbGl2ZXJ5UmVjZWl2ZXIucmVzZXQoKTsKQEAgLTM4MywxNyArMzk4LDE4IEBACiAgICAgICAgIGdldFNtc01hbmFnZXIoKS5zZW5kVGV4dE1lc3NhZ2UoZGVzdEFkZHIsIG51bGwsIHRleHQsIHNlbnRJbnRlbnQsIGRlbGl2ZXJlZEludGVudCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGJsb2NrTnVtYmVyKFN0cmluZyBwaG9uZU51bWJlcikgewotICAgICAgICBDb250ZW50VmFsdWVzIGN2ID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgY3YucHV0KEJsb2NrZWROdW1iZXJDb250cmFjdC5CbG9ja2VkTnVtYmVycy5DT0xVTU5fT1JJR0lOQUxfTlVNQkVSLCBwaG9uZU51bWJlcik7Ci0gICAgICAgIG1CbG9ja2VkTnVtYmVyVXJpID0gbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCkuaW5zZXJ0KAotICAgICAgICAgICAgICAgIEJsb2NrZWROdW1iZXJDb250cmFjdC5CbG9ja2VkTnVtYmVycy5DT05URU5UX1VSSSwgY3YpOworICAgIHByaXZhdGUgdm9pZCBibG9ja051bWJlcihTdHJpbmcgbnVtYmVyKSB7CisgICAgICAgIG1CbG9ja2VkTnVtYmVyVXJpID0gaW5zZXJ0QmxvY2tlZE51bWJlcihtQ29udGV4dCwgbnVtYmVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdW5ibG9ja051bWJlcihVcmkgdXJpKSB7CisgICAgICAgIGRlbGV0ZUJsb2NrZWROdW1iZXIobUNvbnRleHQsIHVyaSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHNldERlZmF1bHRTbXNBcHAoYm9vbGVhbiBzZXRUb1Ntc0FwcCkKICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBTdHJpbmcgY29tbWFuZCA9IFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgImFwcG9wcyBzZXQgJXMgV1JJVEVfU01TICVzIiwKKyAgICAgICAgICAgICAgICAiYXBwb3BzIHNldCAtLXVzZXIgMCAlcyBXUklURV9TTVMgJXMiLAogICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCksCiAgICAgICAgICAgICAgICAgc2V0VG9TbXNBcHAgPyAiYWxsb3ciIDogImRlZmF1bHQiKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiU2V0dGluZyBkZWZhdWx0IFNNUyBhcHAgZmFpbGVkIDogIiArIHNldFRvU21zQXBwLApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGVsZXBob255L3NyYy9hbmRyb2lkL3RlbGVwaG9ueS9jdHMvU21zTWVzc2FnZVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvY3RzL1Ntc01lc3NhZ2VUZXN0LmphdmEKaW5kZXggMjkzYzYwNS4uZTI0Nzc3NSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdGVsZXBob255L3NyYy9hbmRyb2lkL3RlbGVwaG9ueS9jdHMvU21zTWVzc2FnZVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy90ZWxlcGhvbnkvc3JjL2FuZHJvaWQvdGVsZXBob255L2N0cy9TbXNNZXNzYWdlVGVzdC5qYXZhCkBAIC0yMyw5ICsyMyw2IEBACiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuVGVsZXBob255TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DZGRUZXN0OwotCi1AQ2RkVGVzdChyZXF1aXJlbWVudD0iNy40LjEvQy0xLTIsQy0yLTEiKQogcHVibGljIGNsYXNzIFNtc01lc3NhZ2VUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlewogCiAgICAgcHJpdmF0ZSBUZWxlcGhvbnlNYW5hZ2VyIG1UZWxlcGhvbnlNYW5hZ2VyOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGVsZXBob255L3NyYy9hbmRyb2lkL3RlbGVwaG9ueS9jdHMvU21zVXNhZ2VNb25pdG9yU2hvcnRDb2RlVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdGVsZXBob255L3NyYy9hbmRyb2lkL3RlbGVwaG9ueS9jdHMvU21zVXNhZ2VNb25pdG9yU2hvcnRDb2RlVGVzdC5qYXZhCmluZGV4IDZhMzY1MzYuLmZkZjgxZGUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvY3RzL1Ntc1VzYWdlTW9uaXRvclNob3J0Q29kZVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy90ZWxlcGhvbnkvc3JjL2FuZHJvaWQvdGVsZXBob255L2N0cy9TbXNVc2FnZU1vbml0b3JTaG9ydENvZGVUZXN0LmphdmEKQEAgLTUwMiw2ICs1MDIsMTMgQEAKIAogICAgICAgICBTbXNVc2FnZU1vbml0b3IgbW9uaXRvciA9IG5ldyBTbXNVc2FnZU1vbml0b3IobUNvbnRleHQpOwogICAgICAgICBmb3IgKFNob3J0Q29kZVRlc3QgdGVzdCA6IHNTaG9ydENvZGVUZXN0cykgeworICAgICAgICAgICAgLy8gSXQgaXMgaW50ZW5kZWQgdGhhdCBhIHNob3J0IGNvZGUgbnVtYmVyIGluIGNvdW50cnkgQSBtYXkgYmUgYW4gZW1lcmdlbmN5IG51bWJlcgorICAgICAgICAgICAgLy8gaW4gY291bnRyeSBCLiBJdCBpcyBpbnRlbmRlZCB0aGF0IHRoZSBkZXN0aW5hdGlvbiB3aWxsIGJlIGNoYW5nZWQgYmVjYXVzZSBvZiB0aGlzCisgICAgICAgICAgICAvLyByZWFzb24uIGNoZWNrRGVzdGluYXRpb24oKSByZXR1cm5zIENBVEVHT1JZX05PVF9TSE9SVF9DT0RFIGZvciBlbWVyZ2VuY3kgbnVtYmVycy4KKyAgICAgICAgICAgIGlmICh0ZXN0LmNhdGVnb3J5ICE9IENBVEVHT1JZX05PVF9TSE9SVF9DT0RFCisgICAgICAgICAgICAgICAgICAgICYmIFBob25lTnVtYmVyVXRpbHMuaXNFbWVyZ2VuY3lOdW1iZXIodGVzdC5hZGRyZXNzLCB0ZXN0LmNvdW50cnlJc28pKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImNvdW50cnk6ICIgKyB0ZXN0LmNvdW50cnlJc28gKyAiIG51bWJlcjogIiArIHRlc3QuYWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgdGVzdC5jYXRlZ29yeSwgbW9uaXRvci5jaGVja0Rlc3RpbmF0aW9uKHRlc3QuYWRkcmVzcywgdGVzdC5jb3VudHJ5SXNvKSk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvY3RzL1N1YnNjcmlwdGlvbk1hbmFnZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy90ZWxlcGhvbnkvc3JjL2FuZHJvaWQvdGVsZXBob255L2N0cy9TdWJzY3JpcHRpb25NYW5hZ2VyVGVzdC5qYXZhCmluZGV4IGY3ZWMzYjcuLjdiMTc5N2QgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvY3RzL1N1YnNjcmlwdGlvbk1hbmFnZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdGVsZXBob255L3NyYy9hbmRyb2lkL3RlbGVwaG9ueS9jdHMvU3Vic2NyaXB0aW9uTWFuYWdlclRlc3QuamF2YQpAQCAtMTYsNjMgKzE2LDM3NyBAQAogCiBwYWNrYWdlIGFuZHJvaWQudGVsZXBob255LmN0czsKIAotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC5OZXR3b3JrQ2FwYWJpbGl0aWVzLk5FVF9DQVBBQklMSVRZX0lOVEVSTkVUOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC5OZXR3b3JrQ2FwYWJpbGl0aWVzLk5FVF9DQVBBQklMSVRZX05PVF9DT05HRVNURUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0Lk5ldHdvcmtDYXBhYmlsaXRpZXMuTkVUX0NBUEFCSUxJVFlfTk9UX01FVEVSRUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0Lk5ldHdvcmtDYXBhYmlsaXRpZXMuTkVUX0NBUEFCSUxJVFlfTk9UX1JFU1RSSUNURUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0Lk5ldHdvcmtDYXBhYmlsaXRpZXMuVFJBTlNQT1JUX0NFTExVTEFSOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5Db25uZWN0aXZpdHlNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOworaW1wb3J0IGFuZHJvaWQubmV0LkNvbm5lY3Rpdml0eU1hbmFnZXIuTmV0d29ya0NhbGxiYWNrOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcms7CitpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0NhcGFiaWxpdGllczsKK2ltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrUmVxdWVzdDsKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5TdWJzY3JpcHRpb25JbmZvOwogaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlN1YnNjcmlwdGlvbk1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlN1YnNjcmlwdGlvblBsYW47CiAKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlRlc3RUaHJlYWQ7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogCitpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5TeXN0ZW1VdGlsOworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworCitpbXBvcnQgamF2YS50aW1lLlBlcmlvZDsKK2ltcG9ydCBqYXZhLnRpbWUuWm9uZWREYXRlVGltZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU7CiAKLXB1YmxpYyBjbGFzcyBTdWJzY3JpcHRpb25NYW5hZ2VyVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7Ci0gICAgcHJpdmF0ZSBTdWJzY3JpcHRpb25NYW5hZ2VyIG1TdWJzY3JpcHRpb25NYW5hZ2VyOwotICAgIHByaXZhdGUgc3RhdGljIENvbm5lY3Rpdml0eU1hbmFnZXIgbUNtOwotICAgIHByaXZhdGUgU3Vic2NyaXB0aW9uTWFuYWdlci5PblN1YnNjcmlwdGlvbnNDaGFuZ2VkTGlzdGVuZXIgbUxpc3RlbmVyOwotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOwotICAgIHByaXZhdGUgYm9vbGVhbiBtT25TdWJzY3JpcHRpb25zQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT0xFUkFOQ0UgPSAxMDAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiYW5kcm9pZC50ZWxlcGhvbnkuY3RzLlN1YnNjcmlwdGlvbk1hbmFnZXJUZXN0IjsKK0BSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgU3Vic2NyaXB0aW9uTWFuYWdlclRlc3QgeworICAgIHByaXZhdGUgU3Vic2NyaXB0aW9uTWFuYWdlciBtU207CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBtU3Vic2NyaXB0aW9uTWFuYWdlciA9IG5ldyBTdWJzY3JpcHRpb25NYW5hZ2VyKGdldENvbnRleHQoKSk7Ci0gICAgICAgIG1DbSA9IChDb25uZWN0aXZpdHlNYW5hZ2VyKWdldENvbnRleHQoKS5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQ09OTkVDVElWSVRZX1NFUlZJQ0UpOworICAgIHByaXZhdGUgaW50IG1TdWJJZDsKKyAgICBwcml2YXRlIFN0cmluZyBtUGFja2FnZU5hbWU7CisKKyAgICAvKioKKyAgICAgKiBDYWxsYmFjayB1c2VkIGluIHRlc3RSZWdpc3Rlck5ldHdvcmtDYWxsYmFjayB0aGF0IGFsbG93cyBjYWxsZXIgdG8gYmxvY2sgb24KKyAgICAgKiB7QGNvZGUgb25BdmFpbGFibGV9LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRlc3ROZXR3b3JrQ2FsbGJhY2sgZXh0ZW5kcyBDb25uZWN0aXZpdHlNYW5hZ2VyLk5ldHdvcmtDYWxsYmFjayB7CisgICAgICAgIHByaXZhdGUgZmluYWwgQ291bnREb3duTGF0Y2ggbUF2YWlsYWJsZUxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworCisgICAgICAgIHB1YmxpYyB2b2lkIHdhaXRGb3JBdmFpbGFibGUoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQ2VsbHVsYXIgbmV0d29yayBkaWQgbm90IGNvbWUgdXAgYWZ0ZXIgNSBzZWNvbmRzIiwKKyAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZUxhdGNoLmF3YWl0KDUsIFRpbWVVbml0LlNFQ09ORFMpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkF2YWlsYWJsZShOZXR3b3JrIG5ldHdvcmspIHsKKyAgICAgICAgICAgIG1BdmFpbGFibGVMYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgfQogICAgIH0KIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChtTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gdW5yZWdpc3RlciB0aGUgbGlzdGVuZXIKLSAgICAgICAgICAgIG1TdWJzY3JpcHRpb25NYW5hZ2VyLnJlbW92ZU9uU3Vic2NyaXB0aW9uc0NoYW5nZWRMaXN0ZW5lcihtTGlzdGVuZXIpOworICAgIEBCZWZvcmVDbGFzcworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRVcENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghaXNTdXBwb3J0ZWQoKSkgcmV0dXJuOworCisgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLmdldFVpQXV0b21hdGlvbigpCisgICAgICAgICAgICAgICAgLmV4ZWN1dGVTaGVsbENvbW1hbmQoInN2YyB3aWZpIGRpc2FibGUiKTsKKworICAgICAgICBmaW5hbCBUZXN0TmV0d29ya0NhbGxiYWNrIGNhbGxiYWNrID0gbmV3IFRlc3ROZXR3b3JrQ2FsbGJhY2soKTsKKyAgICAgICAgZmluYWwgQ29ubmVjdGl2aXR5TWFuYWdlciBjbSA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKQorICAgICAgICAgICAgICAgIC5nZXRTeXN0ZW1TZXJ2aWNlKENvbm5lY3Rpdml0eU1hbmFnZXIuY2xhc3MpOworICAgICAgICBjbS5yZWdpc3Rlck5ldHdvcmtDYWxsYmFjayhuZXcgTmV0d29ya1JlcXVlc3QuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLmFkZFRyYW5zcG9ydFR5cGUoVFJBTlNQT1JUX0NFTExVTEFSKQorICAgICAgICAgICAgICAgIC5hZGRDYXBhYmlsaXR5KE5FVF9DQVBBQklMSVRZX0lOVEVSTkVUKQorICAgICAgICAgICAgICAgIC5idWlsZCgpLCBjYWxsYmFjayk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBXYWl0IHRvIGdldCBjYWxsYmFjayBmb3IgYXZhaWxhYmlsaXR5IG9mIGludGVybmV0CisgICAgICAgICAgICBjYWxsYmFjay53YWl0Rm9yQXZhaWxhYmxlKCk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIk5ldHdvcmtDYWxsYmFjayB3YWl0IHdhcyBpbnRlcnJ1cHRlZC4iKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGNtLnVucmVnaXN0ZXJOZXR3b3JrQ2FsbGJhY2soY2FsbGJhY2spOwogICAgICAgICB9Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgdGVzdEdldEFjdGl2ZVN1YnNjcmlwdGlvbkluZm9Db3VudCgpIHsKLSAgICAgICAgaWYgKG1DbS5nZXROZXR3b3JrSW5mbyhDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfTU9CSUxFKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJTa2lwcGluZyB0ZXN0IHRoYXQgcmVxdWlyZXMgQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX01PQklMRSIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUobVN1YnNjcmlwdGlvbk1hbmFnZXIuZ2V0QWN0aXZlU3Vic2NyaXB0aW9uSW5mb0NvdW50KCkgPD0KLSAgICAgICAgICAgICAgICBtU3Vic2NyaXB0aW9uTWFuYWdlci5nZXRBY3RpdmVTdWJzY3JpcHRpb25JbmZvQ291bnRNYXgoKSk7CisgICAgQEFmdGVyQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVhckRvd25DbGFzcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIWlzU3VwcG9ydGVkKCkpIHJldHVybjsKKworICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKS5nZXRVaUF1dG9tYXRpb24oKQorICAgICAgICAgICAgICAgIC5leGVjdXRlU2hlbGxDb21tYW5kKCJzdmMgd2lmaSBlbmFibGUiKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWN0aXZlU3Vic2NyaXB0aW9ucygpIHsKLSAgICAgICAgaWYgKG1DbS5nZXROZXR3b3JrSW5mbyhDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfTU9CSUxFKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJTa2lwcGluZyB0ZXN0IHRoYXQgcmVxdWlyZXMgQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX01PQklMRSIpOwotICAgICAgICAgICAgcmV0dXJuOworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIWlzU3VwcG9ydGVkKCkpIHJldHVybjsKKworICAgICAgICBtU20gPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShTdWJzY3JpcHRpb25NYW5hZ2VyLmNsYXNzKTsKKyAgICAgICAgbVN1YklkID0gU3Vic2NyaXB0aW9uTWFuYWdlci5nZXREZWZhdWx0RGF0YVN1YnNjcmlwdGlvbklkKCk7CisgICAgICAgIG1QYWNrYWdlTmFtZSA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKS5nZXRQYWNrYWdlTmFtZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNhbml0eSBjaGVjayB0aGF0IHRoZSBkZXZpY2UgaGFzIGEgY2VsbHVsYXIgbmV0d29yayBhbmQgYSB2YWxpZCBkZWZhdWx0IGRhdGEgc3ViSWQKKyAgICAgKiB3aGVuIHtAbGluayBQYWNrYWdlTWFuYWdlciNGRUFUVVJFX1RFTEVQSE9OWX0gc3VwcG9ydC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTYW5pdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFpc1N1cHBvcnRlZCgpKSByZXR1cm47CisKKyAgICAgICAgZmluYWwgYm9vbGVhbiBoYXNDZWxsdWxhciA9IGZpbmRDZWxsdWxhck5ldHdvcmsoKSAhPSBudWxsOworICAgICAgICBpZiAoIWhhc0NlbGx1bGFyKSB7CisgICAgICAgICAgICBmYWlsKCJEZXZpY2UgY2xhaW1zIHRvIHN1cHBvcnQgIiArIFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfVEVMRVBIT05ZCisgICAgICAgICAgICAgICAgICAgICsgIiBidXQgaGFzIG5vIGFjdGl2ZSBjZWxsdWxhciBuZXR3b3JrLCB3aGljaCBpcyByZXF1aXJlZCBmb3IgdmFsaWRhdGlvbiIpOwogICAgICAgICB9Ci0gICAgICAgIExpc3Q8U3Vic2NyaXB0aW9uSW5mbz4gc3ViTGlzdCA9IG1TdWJzY3JpcHRpb25NYW5hZ2VyLmdldEFjdGl2ZVN1YnNjcmlwdGlvbkluZm9MaXN0KCk7CisKKyAgICAgICAgaWYgKG1TdWJJZCA9PSBTdWJzY3JpcHRpb25NYW5hZ2VyLklOVkFMSURfU1VCU0NSSVBUSU9OX0lEKSB7CisgICAgICAgICAgICBmYWlsKCJEZXZpY2UgbXVzdCBoYXZlIGEgdmFsaWQgZGVmYXVsdCBkYXRhIHN1YklkIGZvciB2YWxpZGF0aW9uIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBY3RpdmVTdWJzY3JpcHRpb25JbmZvQ291bnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFpc1N1cHBvcnRlZCgpKSByZXR1cm47CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShtU20uZ2V0QWN0aXZlU3Vic2NyaXB0aW9uSW5mb0NvdW50KCkgPD0KKyAgICAgICAgICAgICAgICBtU20uZ2V0QWN0aXZlU3Vic2NyaXB0aW9uSW5mb0NvdW50TWF4KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFjdGl2ZVN1YnNjcmlwdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFpc1N1cHBvcnRlZCgpKSByZXR1cm47CisKKyAgICAgICAgTGlzdDxTdWJzY3JpcHRpb25JbmZvPiBzdWJMaXN0ID0gbVNtLmdldEFjdGl2ZVN1YnNjcmlwdGlvbkluZm9MaXN0KCk7CiAgICAgICAgIC8vIEFzc2VydCB3aGVuIHRoZXJlIGlzIG5vIHNpbSBjYXJkIHByZXNlbnQgb3IgZGV0ZWN0ZWQKLSAgICAgICAgYXNzZXJ0VHJ1ZShzdWJMaXN0ICE9IG51bGwgJiYgc3ViTGlzdC5zaXplKCkgPiAwKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiQWN0aXZlIHN1YnNjcmliZXIgcmVxdWlyZWQiLCBzdWJMaXN0KTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIkFjdGl2ZSBzdWJzY3JpYmVyIHJlcXVpcmVkIiwgc3ViTGlzdC5pc0VtcHR5KCkpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1Ykxpc3Quc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIGFzc2VydFRydWUoc3ViTGlzdC5nZXQoaSkuZ2V0U3Vic2NyaXB0aW9uSWQoKSA+PSAwKTsKICAgICAgICAgICAgIGFzc2VydFRydWUoc3ViTGlzdC5nZXQoaSkuZ2V0U2ltU2xvdEluZGV4KCkgPj0gMCk7CiAgICAgICAgIH0KICAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJzY3JpcHRpb25QbGFucygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIWlzU3VwcG9ydGVkKCkpIHJldHVybjsKKworICAgICAgICAvLyBNYWtlIG91cnNlbHZlcyB0aGUgb3duZXIKKyAgICAgICAgc2V0U3ViUGxhbk93bmVyKG1TdWJJZCwgbVBhY2thZ2VOYW1lKTsKKworICAgICAgICAvLyBQdXNoIGVtcHR5IGxpc3QgYW5kIHdlIGdldCBlbXB0eSBiYWNrCisgICAgICAgIG1TbS5zZXRTdWJzY3JpcHRpb25QbGFucyhtU3ViSWQsIEFycmF5cy5hc0xpc3QoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KCksIG1TbS5nZXRTdWJzY3JpcHRpb25QbGFucyhtU3ViSWQpKTsKKworICAgICAgICAvLyBQdXNoIHNpbXBsZSBwbGFuIGFuZCBnZXQgaXQgYmFjaworICAgICAgICBmaW5hbCBTdWJzY3JpcHRpb25QbGFuIHBsYW4gPSBidWlsZFZhbGlkU3Vic2NyaXB0aW9uUGxhbigpOworICAgICAgICBtU20uc2V0U3Vic2NyaXB0aW9uUGxhbnMobVN1YklkLCBBcnJheXMuYXNMaXN0KHBsYW4pKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QocGxhbiksIG1TbS5nZXRTdWJzY3JpcHRpb25QbGFucyhtU3ViSWQpKTsKKworICAgICAgICAvLyBOb3cgcmV2b2tlIG91ciBhY2Nlc3MKKyAgICAgICAgc2V0U3ViUGxhbk93bmVyKG1TdWJJZCwgbnVsbCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtU20uc2V0U3Vic2NyaXB0aW9uUGxhbnMobVN1YklkLCBBcnJheXMuYXNMaXN0KCkpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtU20uZ2V0U3Vic2NyaXB0aW9uUGxhbnMobVN1YklkKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN1YnNjcmlwdGlvblBsYW5zT3ZlcnJpZGVDb25nZXN0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFpc1N1cHBvcnRlZCgpKSByZXR1cm47CisKKyAgICAgICAgZmluYWwgQ29ubmVjdGl2aXR5TWFuYWdlciBjbSA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKQorICAgICAgICAgICAgICAgIC5nZXRTeXN0ZW1TZXJ2aWNlKENvbm5lY3Rpdml0eU1hbmFnZXIuY2xhc3MpOworICAgICAgICBmaW5hbCBOZXR3b3JrIG5ldCA9IGZpbmRDZWxsdWxhck5ldHdvcmsoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiQWN0aXZlIGNlbGx1bGFyIG5ldHdvcmsgcmVxdWlyZWQiLCBuZXQpOworCisgICAgICAgIC8vIE1ha2Ugb3Vyc2VsdmVzIHRoZSBvd25lcgorICAgICAgICBzZXRTdWJQbGFuT3duZXIobVN1YklkLCBtUGFja2FnZU5hbWUpOworCisgICAgICAgIC8vIE1pc3NpbmcgcGxhbnMgbWVhbnMgbm8gb3ZlcnJpZGVzCisgICAgICAgIG1TbS5zZXRTdWJzY3JpcHRpb25QbGFucyhtU3ViSWQsIEFycmF5cy5hc0xpc3QoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtU20uc2V0U3Vic2NyaXB0aW9uT3ZlcnJpZGVDb25nZXN0ZWQobVN1YklkLCB0cnVlLCAwKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gfCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8vIERlZmluaW5nIHBsYW5zIG1lYW5zIHdlIGdldCB0byBvdmVycmlkZQorICAgICAgICBtU20uc2V0U3Vic2NyaXB0aW9uUGxhbnMobVN1YklkLCBBcnJheXMuYXNMaXN0KGJ1aWxkVmFsaWRTdWJzY3JpcHRpb25QbGFuKCkpKTsKKworICAgICAgICAvLyBDZWxsdWxhciBpcyB1bmNvbmdlc3RlZCBieSBkZWZhdWx0CisgICAgICAgIGFzc2VydFRydWUoY20uZ2V0TmV0d29ya0NhcGFiaWxpdGllcyhuZXQpLmhhc0NhcGFiaWxpdHkoTkVUX0NBUEFCSUxJVFlfTk9UX0NPTkdFU1RFRCkpOworCisgICAgICAgIC8vIE92ZXJyaWRlIHNob3VsZCBtYWtlIGl0IGdvIGNvbmdlc3RlZAorICAgICAgICB7CisgICAgICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IHdhaXRGb3JOZXR3b3JrQ2FwYWJpbGl0aWVzKG5ldCwgY2FwcyAtPiB7CisgICAgICAgICAgICAgICAgcmV0dXJuICFjYXBzLmhhc0NhcGFiaWxpdHkoTkVUX0NBUEFCSUxJVFlfTk9UX0NPTkdFU1RFRCk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIG1TbS5zZXRTdWJzY3JpcHRpb25PdmVycmlkZUNvbmdlc3RlZChtU3ViSWQsIHRydWUsIDApOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShsYXRjaC5hd2FpdCgxMCwgVGltZVVuaXQuU0VDT05EUykpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2xlYXJpbmcgb3ZlcnJpZGUgc2hvdWxkIG1ha2UgaXQgZ28gdW5jb25nZXN0ZWQKKyAgICAgICAgeworICAgICAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSB3YWl0Rm9yTmV0d29ya0NhcGFiaWxpdGllcyhuZXQsIGNhcHMgLT4geworICAgICAgICAgICAgICAgIHJldHVybiBjYXBzLmhhc0NhcGFiaWxpdHkoTkVUX0NBUEFCSUxJVFlfTk9UX0NPTkdFU1RFRCk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIG1TbS5zZXRTdWJzY3JpcHRpb25PdmVycmlkZUNvbmdlc3RlZChtU3ViSWQsIGZhbHNlLCAwKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobGF0Y2guYXdhaXQoMTAsIFRpbWVVbml0LlNFQ09ORFMpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vdyByZXZva2Ugb3VyIGFjY2VzcworICAgICAgICBzZXRTdWJQbGFuT3duZXIobVN1YklkLCBudWxsKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1TbS5zZXRTdWJzY3JpcHRpb25PdmVycmlkZUNvbmdlc3RlZChtU3ViSWQsIHRydWUsIDApOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiB8IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3Vic2NyaXB0aW9uUGxhbnNPdmVycmlkZVVubWV0ZXJlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIWlzU3VwcG9ydGVkKCkpIHJldHVybjsKKworICAgICAgICBmaW5hbCBDb25uZWN0aXZpdHlNYW5hZ2VyIGNtID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpCisgICAgICAgICAgICAgICAgLmdldFN5c3RlbVNlcnZpY2UoQ29ubmVjdGl2aXR5TWFuYWdlci5jbGFzcyk7CisgICAgICAgIGZpbmFsIE5ldHdvcmsgbmV0ID0gZmluZENlbGx1bGFyTmV0d29yaygpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJBY3RpdmUgY2VsbHVsYXIgbmV0d29yayByZXF1aXJlZCIsIG5ldCk7CisKKyAgICAgICAgLy8gTWFrZSBvdXJzZWx2ZXMgdGhlIG93bmVyIGFuZCBkZWZpbmUgc29tZSBwbGFucworICAgICAgICBzZXRTdWJQbGFuT3duZXIobVN1YklkLCBtUGFja2FnZU5hbWUpOworICAgICAgICBtU20uc2V0U3Vic2NyaXB0aW9uUGxhbnMobVN1YklkLCBBcnJheXMuYXNMaXN0KGJ1aWxkVmFsaWRTdWJzY3JpcHRpb25QbGFuKCkpKTsKKworICAgICAgICAvLyBDZWxsdWxhciBpcyBtZXRlcmVkIGJ5IGRlZmF1bHQKKyAgICAgICAgYXNzZXJ0RmFsc2UoY20uZ2V0TmV0d29ya0NhcGFiaWxpdGllcyhuZXQpLmhhc0NhcGFiaWxpdHkoTkVUX0NBUEFCSUxJVFlfTk9UX01FVEVSRUQpKTsKKworICAgICAgICAvLyBPdmVycmlkZSBzaG91bGQgbWFrZSBpdCBnbyB1bm1ldGVyZWQKKyAgICAgICAgeworICAgICAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSB3YWl0Rm9yTmV0d29ya0NhcGFiaWxpdGllcyhuZXQsIGNhcHMgLT4geworICAgICAgICAgICAgICAgIHJldHVybiBjYXBzLmhhc0NhcGFiaWxpdHkoTkVUX0NBUEFCSUxJVFlfTk9UX01FVEVSRUQpOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBtU20uc2V0U3Vic2NyaXB0aW9uT3ZlcnJpZGVVbm1ldGVyZWQobVN1YklkLCB0cnVlLCAwKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobGF0Y2guYXdhaXQoMTAsIFRpbWVVbml0LlNFQ09ORFMpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENsZWFyaW5nIG92ZXJyaWRlIHNob3VsZCBtYWtlIGl0IGdvIG1ldGVyZWQKKyAgICAgICAgeworICAgICAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSB3YWl0Rm9yTmV0d29ya0NhcGFiaWxpdGllcyhuZXQsIGNhcHMgLT4geworICAgICAgICAgICAgICAgIHJldHVybiAhY2Fwcy5oYXNDYXBhYmlsaXR5KE5FVF9DQVBBQklMSVRZX05PVF9NRVRFUkVEKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgbVNtLnNldFN1YnNjcmlwdGlvbk92ZXJyaWRlVW5tZXRlcmVkKG1TdWJJZCwgZmFsc2UsIDApOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShsYXRjaC5hd2FpdCgxMCwgVGltZVVuaXQuU0VDT05EUykpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3Vic2NyaXB0aW9uUGxhbnNJbnZhbGlkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghaXNTdXBwb3J0ZWQoKSkgcmV0dXJuOworCisgICAgICAgIC8vIE1ha2Ugb3Vyc2VsdmVzIHRoZSBvd25lcgorICAgICAgICBzZXRTdWJQbGFuT3duZXIobVN1YklkLCBtUGFja2FnZU5hbWUpOworCisgICAgICAgIC8vIEVtcHR5IHBsYW5zIGNhbid0IG92ZXJyaWRlCisgICAgICAgIGFzc2VydE92ZXJyaWRlRmFpbHMoKTsKKworICAgICAgICAvLyBOb25yZWN1cnJpbmcgcGxhbiBpbiB0aGUgcGFzdCBjYW4ndCBvdmVycmlkZQorICAgICAgICBhc3NlcnRPdmVycmlkZUZhaWxzKFN1YnNjcmlwdGlvblBsYW4uQnVpbGRlcgorICAgICAgICAgICAgICAgIC5jcmVhdGVOb25yZWN1cnJpbmcoWm9uZWREYXRlVGltZS5ub3coKS5taW51c0RheXMoMTQpLAorICAgICAgICAgICAgICAgICAgICAgICAgWm9uZWREYXRlVGltZS5ub3coKS5taW51c0RheXMoNykpCisgICAgICAgICAgICAgICAgLnNldFRpdGxlKCJDVFMiKQorICAgICAgICAgICAgICAgIC5zZXREYXRhTGltaXQoMV8wMDBfMDAwXzAwMCwgU3Vic2NyaXB0aW9uUGxhbi5MSU1JVF9CRUhBVklPUl9ESVNBQkxFRCkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gUGxhbiB3aXRoIHVuZGVmaW5lZCBsaW1pdCBjYW4ndCBvdmVycmlkZQorICAgICAgICBhc3NlcnRPdmVycmlkZUZhaWxzKFN1YnNjcmlwdGlvblBsYW4uQnVpbGRlcgorICAgICAgICAgICAgICAgIC5jcmVhdGVSZWN1cnJpbmcoWm9uZWREYXRlVGltZS5wYXJzZSgiMjAwNy0wMy0xNFQwMDowMDowMC4wMDBaIiksCisgICAgICAgICAgICAgICAgICAgICAgICBQZXJpb2Qub2ZNb250aHMoMSkpCisgICAgICAgICAgICAgICAgLnNldFRpdGxlKCJDVFMiKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAvLyBXZSBjYW4gb3ZlcnJpZGUgd2hlbiB0aGVyZSBpcyBhbiBhY3RpdmUgcGxhbiBzb21ld2hlcmUKKyAgICAgICAgZmluYWwgU3Vic2NyaXB0aW9uUGxhbiBvbGRlciA9IFN1YnNjcmlwdGlvblBsYW4uQnVpbGRlcgorICAgICAgICAgICAgICAgIC5jcmVhdGVOb25yZWN1cnJpbmcoWm9uZWREYXRlVGltZS5ub3coKS5taW51c0RheXMoMTQpLAorICAgICAgICAgICAgICAgICAgICAgICAgWm9uZWREYXRlVGltZS5ub3coKS5taW51c0RheXMoNykpCisgICAgICAgICAgICAgICAgLnNldFRpdGxlKCJDVFMiKQorICAgICAgICAgICAgICAgIC5zZXREYXRhTGltaXQoMV8wMDBfMDAwXzAwMCwgU3Vic2NyaXB0aW9uUGxhbi5MSU1JVF9CRUhBVklPUl9ESVNBQkxFRCkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgZmluYWwgU3Vic2NyaXB0aW9uUGxhbiBuZXdlciA9IFN1YnNjcmlwdGlvblBsYW4uQnVpbGRlcgorICAgICAgICAgICAgICAgIC5jcmVhdGVOb25yZWN1cnJpbmcoWm9uZWREYXRlVGltZS5ub3coKS5taW51c0RheXMoNyksCisgICAgICAgICAgICAgICAgICAgICAgICBab25lZERhdGVUaW1lLm5vdygpLnBsdXNEYXlzKDcpKQorICAgICAgICAgICAgICAgIC5zZXRUaXRsZSgiQ1RTIikKKyAgICAgICAgICAgICAgICAuc2V0RGF0YUxpbWl0KDFfMDAwXzAwMF8wMDAsIFN1YnNjcmlwdGlvblBsYW4uTElNSVRfQkVIQVZJT1JfRElTQUJMRUQpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIGFzc2VydE92ZXJyaWRlU3VjY2VzcyhvbGRlciwgbmV3ZXIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRPdmVycmlkZVN1Y2Nlc3MoU3Vic2NyaXB0aW9uUGxhbi4uLiBwbGFucykgeworICAgICAgICBtU20uc2V0U3Vic2NyaXB0aW9uUGxhbnMobVN1YklkLCBBcnJheXMuYXNMaXN0KHBsYW5zKSk7CisgICAgICAgIG1TbS5zZXRTdWJzY3JpcHRpb25PdmVycmlkZUNvbmdlc3RlZChtU3ViSWQsIGZhbHNlLCAwKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0T3ZlcnJpZGVGYWlscyhTdWJzY3JpcHRpb25QbGFuLi4uIHBsYW5zKSB7CisgICAgICAgIG1TbS5zZXRTdWJzY3JpcHRpb25QbGFucyhtU3ViSWQsIEFycmF5cy5hc0xpc3QocGxhbnMpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1TbS5zZXRTdWJzY3JpcHRpb25PdmVycmlkZUNvbmdlc3RlZChtU3ViSWQsIGZhbHNlLCAwKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gfCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQ291bnREb3duTGF0Y2ggd2FpdEZvck5ldHdvcmtDYXBhYmlsaXRpZXMoTmV0d29yayBuZXR3b3JrLAorICAgICAgICAgICAgUHJlZGljYXRlPE5ldHdvcmtDYXBhYmlsaXRpZXM+IHByZWRpY2F0ZSkgeworICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICAgICAgZmluYWwgQ29ubmVjdGl2aXR5TWFuYWdlciBjbSA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKQorICAgICAgICAgICAgICAgIC5nZXRTeXN0ZW1TZXJ2aWNlKENvbm5lY3Rpdml0eU1hbmFnZXIuY2xhc3MpOworICAgICAgICBjbS5yZWdpc3Rlck5ldHdvcmtDYWxsYmFjayhuZXcgTmV0d29ya1JlcXVlc3QuQnVpbGRlcigpLmJ1aWxkKCksCisgICAgICAgICAgICAgICAgbmV3IE5ldHdvcmtDYWxsYmFjaygpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2FwYWJpbGl0aWVzQ2hhbmdlZChOZXR3b3JrIG5ldCwgTmV0d29ya0NhcGFiaWxpdGllcyBjYXBzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV0LmVxdWFscyhuZXR3b3JrKSAmJiBwcmVkaWNhdGUudGVzdChjYXBzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtLnVucmVnaXN0ZXJOZXR3b3JrQ2FsbGJhY2sodGhpcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIGxhdGNoOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN1YnNjcmlwdGlvblBsYW4gYnVpbGRWYWxpZFN1YnNjcmlwdGlvblBsYW4oKSB7CisgICAgICAgIHJldHVybiBTdWJzY3JpcHRpb25QbGFuLkJ1aWxkZXIKKyAgICAgICAgICAgICAgICAuY3JlYXRlUmVjdXJyaW5nKFpvbmVkRGF0ZVRpbWUucGFyc2UoIjIwMDctMDMtMTRUMDA6MDA6MDAuMDAwWiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgUGVyaW9kLm9mTW9udGhzKDEpKQorICAgICAgICAgICAgICAgIC5zZXRUaXRsZSgiQ1RTIikKKyAgICAgICAgICAgICAgICAuc2V0RGF0YUxpbWl0KDFfMDAwXzAwMF8wMDAsIFN1YnNjcmlwdGlvblBsYW4uTElNSVRfQkVIQVZJT1JfRElTQUJMRUQpCisgICAgICAgICAgICAgICAgLnNldERhdGFVc2FnZSg1MDBfMDAwXzAwMCwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgQE51bGxhYmxlIE5ldHdvcmsgZmluZENlbGx1bGFyTmV0d29yaygpIHsKKyAgICAgICAgZmluYWwgQ29ubmVjdGl2aXR5TWFuYWdlciBjbSA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKQorICAgICAgICAgICAgICAgIC5nZXRTeXN0ZW1TZXJ2aWNlKENvbm5lY3Rpdml0eU1hbmFnZXIuY2xhc3MpOworICAgICAgICBmb3IgKE5ldHdvcmsgbmV0IDogY20uZ2V0QWxsTmV0d29ya3MoKSkgeworICAgICAgICAgICAgZmluYWwgTmV0d29ya0NhcGFiaWxpdGllcyBjYXBzID0gY20uZ2V0TmV0d29ya0NhcGFiaWxpdGllcyhuZXQpOworICAgICAgICAgICAgaWYgKGNhcHMgIT0gbnVsbCAmJiBjYXBzLmhhc1RyYW5zcG9ydChUUkFOU1BPUlRfQ0VMTFVMQVIpCisgICAgICAgICAgICAgICAgICAgICYmIGNhcHMuaGFzQ2FwYWJpbGl0eShORVRfQ0FQQUJJTElUWV9JTlRFUk5FVCkKKyAgICAgICAgICAgICAgICAgICAgJiYgY2Fwcy5oYXNDYXBhYmlsaXR5KE5FVF9DQVBBQklMSVRZX05PVF9SRVNUUklDVEVEKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1N1cHBvcnRlZCgpIHsKKyAgICAgICAgcmV0dXJuIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKS5nZXRQYWNrYWdlTWFuYWdlcigpCisgICAgICAgICAgICAgICAgLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9URUxFUEhPTlkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2V0U3ViUGxhbk93bmVyKGludCBzdWJJZCwgU3RyaW5nIHBhY2thZ2VOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3lzdGVtVXRpbC5ydW5TaGVsbENvbW1hbmQoSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCksCisgICAgICAgICAgICAgICAgImNtZCBuZXRwb2xpY3kgc2V0IHN1Yi1wbGFuLW93bmVyICIgKyBzdWJJZCArICIgIiArIHBhY2thZ2VOYW1lKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZWxlcGhvbnkvc3JjL2FuZHJvaWQvdGVsZXBob255L2N0cy9UZWxlcGhvbnlNYW5hZ2VyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdGVsZXBob255L3NyYy9hbmRyb2lkL3RlbGVwaG9ueS9jdHMvVGVsZXBob255TWFuYWdlclRlc3QuamF2YQppbmRleCA4NWU2MDk1Li4wZWFiYWQ3IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy90ZWxlcGhvbnkvc3JjL2FuZHJvaWQvdGVsZXBob255L2N0cy9UZWxlcGhvbnlNYW5hZ2VyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvY3RzL1RlbGVwaG9ueU1hbmFnZXJUZXN0LmphdmEKQEAgLTMyLDI5ICszMiwzNiBAQAogaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKIGltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnRlbGVjb20uUGhvbmVBY2NvdW50OwogaW1wb3J0IGFuZHJvaWQudGVsZWNvbS5QaG9uZUFjY291bnRIYW5kbGU7CiBpbXBvcnQgYW5kcm9pZC50ZWxlY29tLlRlbGVjb21NYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudGVsZXBob255LkNlbGxMb2NhdGlvbjsKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5QaG9uZVN0YXRlTGlzdGVuZXI7CiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuU2VydmljZVN0YXRlOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlN1YnNjcmlwdGlvbkluZm87CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuU3Vic2NyaXB0aW9uTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5UZWxlcGhvbnlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuVGVzdFRocmVhZDsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNkZFRlc3Q7CiAKIGltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKIAotQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuNC4xL0MtMS0yLEMtMi0xIikKKy8qKgorICogQnVpbGQsIGluc3RhbGwgYW5kIHJ1biB0aGUgdGVzdHMgYnkgcnVubmluZyB0aGUgY29tbWFuZHMgYmVsb3c6CisgKiAgbWFrZSBjdHMgLWo2NAorICogIGN0cy10cmFkZWZlZCBydW4gY3RzIC1tIEN0c1RlbGVwaG9ueVRlc3RDYXNlcyAtLXRlc3QgYW5kcm9pZC50ZWxlcGhvbnkuY3RzLlRlbGVwaG9ueU1hbmFnZXJUZXN0CisgKi8KIEBSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCiBwdWJsaWMgY2xhc3MgVGVsZXBob255TWFuYWdlclRlc3QgewogICAgIHByaXZhdGUgVGVsZXBob255TWFuYWdlciBtVGVsZXBob255TWFuYWdlcjsKQEAgLTk1LDExICsxMDIsOSBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gVGVzdCByZWdpc3RlcgogICAgICAgICBUZXN0VGhyZWFkIHQgPSBuZXcgVGVzdFRocmVhZChuZXcgUnVubmFibGUoKSB7CiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgICAgICAgICAgTG9vcGVyLnByZXBhcmUoKTsKLQogICAgICAgICAgICAgICAgIG1MaXN0ZW5lciA9IG5ldyBQaG9uZVN0YXRlTGlzdGVuZXIoKSB7CiAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNlbGxMb2NhdGlvbkNoYW5nZWQoQ2VsbExvY2F0aW9uIGxvY2F0aW9uKSB7CkBAIC0xMTEsMzYgKzExNiw1NCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICBtVGVsZXBob255TWFuYWdlci5saXN0ZW4obUxpc3RlbmVyLCBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX0NFTExfTE9DQVRJT04pOwotICAgICAgICAgICAgICAgIENlbGxMb2NhdGlvbi5yZXF1ZXN0TG9jYXRpb25VcGRhdGUoKTsKKworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2subm90aWZ5KCk7IC8vIG1MaXN0ZW5lciBpcyByZWFkeQorICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIExvb3Blci5sb29wKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0pOwotICAgICAgICB0LnN0YXJ0KCk7CisKICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbUxvY2sud2FpdChUT0xFUkFOQ0UpOworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICAgICAgbUxvY2sud2FpdChUT0xFUkFOQ0UpOyAvLyB3YWl0IGZvciBtTGlzdGVuZXIKICAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKG1PbkNlbGxMb2NhdGlvbkNoYW5nZWRDYWxsZWQpOworCisgICAgICAgIC8vIFRlc3QgcmVnaXN0ZXIKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgLy8gLmxpc3RlbiBnZW5lcmF0ZXMgYW4gb25DZWxsTG9jYXRpb25DaGFuZ2VkIGV2ZW50CisgICAgICAgICAgICBtVGVsZXBob255TWFuYWdlci5saXN0ZW4obUxpc3RlbmVyLCBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX0NFTExfTE9DQVRJT04pOworICAgICAgICAgICAgbUxvY2sud2FpdChUT0xFUkFOQ0UpOworCisgICAgICAgICAgICBhc3NlcnRUcnVlKCJUZXN0IHJlZ2lzdGVyLCBtT25DZWxsTG9jYXRpb25DaGFuZ2VkQ2FsbGVkIHNob3VsZCBiZSB0cnVlLiIsCisgICAgICAgICAgICAgICAgbU9uQ2VsbExvY2F0aW9uQ2hhbmdlZENhbGxlZCk7CisgICAgICAgIH0KKworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBtT25DZWxsTG9jYXRpb25DaGFuZ2VkQ2FsbGVkID0gZmFsc2U7CisgICAgICAgICAgICBDZWxsTG9jYXRpb24ucmVxdWVzdExvY2F0aW9uVXBkYXRlKCk7CisgICAgICAgICAgICBtTG9jay53YWl0KFRPTEVSQU5DRSk7CisKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlRlc3QgcmVnaXN0ZXIsIG1PbkNlbGxMb2NhdGlvbkNoYW5nZWRDYWxsZWQgc2hvdWxkIGJlIHRydWUuIiwKKyAgICAgICAgICAgICAgICBtT25DZWxsTG9jYXRpb25DaGFuZ2VkQ2FsbGVkKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHVucmVnaXN0ZXIgdGhlIGxpc3RlbmVyCisgICAgICAgIG1UZWxlcGhvbnlNYW5hZ2VyLmxpc3RlbihtTGlzdGVuZXIsIFBob25lU3RhdGVMaXN0ZW5lci5MSVNURU5fTk9ORSk7CisgICAgICAgIFRocmVhZC5zbGVlcChUT0xFUkFOQ0UpOwogCiAgICAgICAgIC8vIFRlc3QgdW5yZWdpc3RlcgotICAgICAgICB0ID0gbmV3IFRlc3RUaHJlYWQobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIExvb3Blci5wcmVwYXJlKCk7Ci0gICAgICAgICAgICAgICAgLy8gdW5yZWdpc3RlciB0aGUgbGlzdGVuZXIKLSAgICAgICAgICAgICAgICBtVGVsZXBob255TWFuYWdlci5saXN0ZW4obUxpc3RlbmVyLCBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX05PTkUpOwotICAgICAgICAgICAgICAgIG1PbkNlbGxMb2NhdGlvbkNoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAvLyB1bnJlZ2lzdGVyIGFnYWluLCB0byBtYWtlIHN1cmUgZG9pbmcgc28gZG9lcyBub3QgY2FsbCB0aGUgbGlzdGVuZXIKLSAgICAgICAgICAgICAgICBtVGVsZXBob255TWFuYWdlci5saXN0ZW4obUxpc3RlbmVyLCBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX05PTkUpOwotICAgICAgICAgICAgICAgIENlbGxMb2NhdGlvbi5yZXF1ZXN0TG9jYXRpb25VcGRhdGUoKTsKLSAgICAgICAgICAgICAgICBMb29wZXIubG9vcCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICB0LnN0YXJ0KCk7CiAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIG1PbkNlbGxMb2NhdGlvbkNoYW5nZWRDYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIC8vIHVucmVnaXN0ZXIgYWdhaW4sIHRvIG1ha2Ugc3VyZSBkb2luZyBzbyBkb2VzIG5vdCBjYWxsIHRoZSBsaXN0ZW5lcgorICAgICAgICAgICAgbVRlbGVwaG9ueU1hbmFnZXIubGlzdGVuKG1MaXN0ZW5lciwgUGhvbmVTdGF0ZUxpc3RlbmVyLkxJU1RFTl9OT05FKTsKKyAgICAgICAgICAgIENlbGxMb2NhdGlvbi5yZXF1ZXN0TG9jYXRpb25VcGRhdGUoKTsKICAgICAgICAgICAgIG1Mb2NrLndhaXQoVE9MRVJBTkNFKTsKKworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoIlRlc3QgdW5yZWdpc3RlciwgbU9uQ2VsbExvY2F0aW9uQ2hhbmdlZENhbGxlZCBzaG91bGQgYmUgZmFsc2UuIiwKKyAgICAgICAgICAgICAgICBtT25DZWxsTG9jYXRpb25DaGFuZ2VkQ2FsbGVkKTsKICAgICAgICAgfQotICAgICAgICBhc3NlcnRGYWxzZShtT25DZWxsTG9jYXRpb25DaGFuZ2VkQ2FsbGVkKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE3NCw4ICsxOTcsMTEgQEAKICAgICAgICAgbVRlbGVwaG9ueU1hbmFnZXIuZ2V0U2ltT3BlcmF0b3JOYW1lKCk7CiAgICAgICAgIG1UZWxlcGhvbnlNYW5hZ2VyLmdldE5ldHdvcmtDb3VudHJ5SXNvKCk7CiAgICAgICAgIG1UZWxlcGhvbnlNYW5hZ2VyLmdldENlbGxMb2NhdGlvbigpOworICAgICAgICBtVGVsZXBob255TWFuYWdlci5nZXRTaW1DYXJyaWVySWQoKTsKKyAgICAgICAgbVRlbGVwaG9ueU1hbmFnZXIuZ2V0U2ltQ2FycmllcklkTmFtZSgpOwogICAgICAgICBtVGVsZXBob255TWFuYWdlci5nZXRTaW1TZXJpYWxOdW1iZXIoKTsKICAgICAgICAgbVRlbGVwaG9ueU1hbmFnZXIuZ2V0U2ltT3BlcmF0b3IoKTsKKyAgICAgICAgbVRlbGVwaG9ueU1hbmFnZXIuZ2V0U2lnbmFsU3RyZW5ndGgoKTsKICAgICAgICAgbVRlbGVwaG9ueU1hbmFnZXIuZ2V0TmV0d29ya09wZXJhdG9yTmFtZSgpOwogICAgICAgICBtVGVsZXBob255TWFuYWdlci5nZXRTdWJzY3JpYmVySWQoKTsKICAgICAgICAgbVRlbGVwaG9ueU1hbmFnZXIuZ2V0TGluZTFOdW1iZXIoKTsKQEAgLTE5Miw2ICsyMTgsNyBAQAogICAgICAgICBtVGVsZXBob255TWFuYWdlci5nZXRQaG9uZUNvdW50KCk7CiAgICAgICAgIG1UZWxlcGhvbnlNYW5hZ2VyLmdldERhdGFFbmFibGVkKCk7CiAgICAgICAgIG1UZWxlcGhvbnlNYW5hZ2VyLmdldE5ldHdvcmtTcGVjaWZpZXIoKTsKKyAgICAgICAgbVRlbGVwaG9ueU1hbmFnZXIuZ2V0TmFpKCk7CiAgICAgICAgIFRlbGVjb21NYW5hZ2VyIHRlbGVjb21NYW5hZ2VyID0gKFRlbGVjb21NYW5hZ2VyKSBnZXRDb250ZXh0KCkKICAgICAgICAgICAgICAgICAuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlRFTEVDT01fU0VSVklDRSk7CiAgICAgICAgIFBob25lQWNjb3VudEhhbmRsZSBkZWZhdWx0QWNjb3VudCA9IHRlbGVjb21NYW5hZ2VyCkBAIC0yODQsMTAgKzMxMSwxNCBAQAogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0SW1laShTdHJpbmcgaWQpIHsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIkltZWkgc2hvdWxkIG5vdCBiZSBlbXB0eSBvciBudWxsIiwgVGV4dFV0aWxzLmlzRW1wdHkoaWQpKTsKICAgICAgICAgLy8gSU1FSSBtYXkgaW5jbHVkZSB0aGUgY2hlY2sgZGlnaXQKICAgICAgICAgU3RyaW5nIGltZWlQYXR0ZXJuID0gIlswLTldezE0LDE1fSI7CisgICAgICAgIFN0cmluZyBpbnZhbGlkUGF0dGVybiA9ICJbMF17MTQsMTV9IjsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiSU1FSSAiICsgaWQgKyAiIGRvZXMgbm90IG1hdGNoIHBhdHRlcm4gIiArIGltZWlQYXR0ZXJuLAogICAgICAgICAgICAgICAgIFBhdHRlcm4ubWF0Y2hlcyhpbWVpUGF0dGVybiwgaWQpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIklNRUkgIiArIGlkICsgIiBtdXN0IG5vdCBiZSBhIHplcm8gc2VxdWVuY2UiICsgaW52YWxpZFBhdHRlcm4sCisgICAgICAgICAgICAgICAgUGF0dGVybi5tYXRjaGVzKGludmFsaWRQYXR0ZXJuLCBpZCkpOwogICAgICAgICBpZiAoaWQubGVuZ3RoKCkgPT0gMTUpIHsKICAgICAgICAgICAgIC8vIGlmIHRoZSBJRCBpcyAxNSBkaWdpdHMsIHRoZSAxNXRoIG11c3QgYmUgYSBjaGVjayBkaWdpdC4KICAgICAgICAgICAgIGFzc2VydEltZWlDaGVja0RpZ2l0KGlkKTsKQEAgLTMzNSw2ICszNjYsNyBAQAogICAgICAgICAvLyBDRE1BIGRldmljZSBJRHMgbWF5IGVpdGhlciBiZSBhIDE0LWhleC1kaWdpdCBNRUlEIG9yIGFuCiAgICAgICAgIC8vIDgtaGV4LWRpZ2l0IEVTTi4gIElmIGl0J3MgYW4gRVNOLCBpdCBtYXkgbm90IGJlIGEKICAgICAgICAgLy8gcHNldWRvLUVTTi4KKyAgICAgICAgYXNzZXJ0RmFsc2UoIk1laWQgRVNOIHNob3VsZCBub3QgYmUgZW1wdHkgb3IgbnVsbCIsIFRleHRVdGlscy5pc0VtcHR5KGlkKSk7CiAgICAgICAgIGlmIChpZC5sZW5ndGgoKSA9PSAxNCkgewogICAgICAgICAgICAgYXNzZXJ0TWVpZEZvcm1hdChpZCk7CiAgICAgICAgIH0gZWxzZSBpZiAoaWQubGVuZ3RoKCkgPT0gOCkgewpAQCAtMzQ2LDI2ICszNzgsMzIgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0SGV4YWRlY2ltYWxFc25Gb3JtYXQoU3RyaW5nIGRldmljZUlkKSB7CiAgICAgICAgIFN0cmluZyBlc25QYXR0ZXJuID0gIlswLTlhLWZBLUZdezh9IjsKKyAgICAgICAgU3RyaW5nIGludmFsaWRQYXR0ZXJuID0gIlswXXs4fSI7CiAgICAgICAgIGFzc2VydFRydWUoIkVTTiBoZXggZGV2aWNlIGlkICIgKyBkZXZpY2VJZCArICIgZG9lcyBub3QgbWF0Y2ggcGF0dGVybiAiICsgZXNuUGF0dGVybiwKICAgICAgICAgICAgICAgICAgICBQYXR0ZXJuLm1hdGNoZXMoZXNuUGF0dGVybiwgZGV2aWNlSWQpKTsKICAgICAgICAgYXNzZXJ0RmFsc2UoIkVTTiBoZXggZGV2aWNlIGlkICIgKyBkZXZpY2VJZCArICIgbXVzdCBub3QgYmUgYSBwc2V1ZG8tRVNOIiwKICAgICAgICAgICAgICAgICAgICAgIjgwIi5lcXVhbHMoZGV2aWNlSWQuc3Vic3RyaW5nKDAsIDIpKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJFU04gaGV4IGRldmljZSBpZCAiICsgZGV2aWNlSWQgKyAibXVzdCBub3QgYmUgYSB6ZXJvIHNlcXVlbmNlIiwKKyAgICAgICAgICAgICAgICBQYXR0ZXJuLm1hdGNoZXMoaW52YWxpZFBhdHRlcm4sIGRldmljZUlkKSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRNZWlkRm9ybWF0KFN0cmluZyBkZXZpY2VJZCkgewogICAgICAgICAvLyBNRUlEIG11c3QgTk9UIGluY2x1ZGUgdGhlIGNoZWNrIGRpZ2l0LgogICAgICAgICBTdHJpbmcgbWVpZFBhdHRlcm4gPSAiWzAtOWEtZkEtRl17MTR9IjsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiTUVJRCBkZXZpY2UgaWQgIiArIGRldmljZUlkICsgIiBkb2VzIG5vdCBtYXRjaCBwYXR0ZXJuICIgKyBtZWlkUGF0dGVybiwKLSAgICAgICAgICAgICAgICAgICBQYXR0ZXJuLm1hdGNoZXMobWVpZFBhdHRlcm4sIGRldmljZUlkKSk7CisgICAgICAgIFN0cmluZyBpbnZhbGlkUGF0dGVybiA9ICJbMF17MTR9IjsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiTUVJRCBkZXZpY2UgaWQgIiArIGRldmljZUlkICsgIiBkb2VzIG5vdCBtYXRjaCBwYXR0ZXJuICIKKyAgICAgICAgICAgICAgICArIG1laWRQYXR0ZXJuLCBQYXR0ZXJuLm1hdGNoZXMobWVpZFBhdHRlcm4sIGRldmljZUlkKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJNRUlEIGRldmljZSBpZCAiICsgZGV2aWNlSWQgKyAibXVzdCBub3QgYmUgYSB6ZXJvIHNlcXVlbmNlIiwKKyAgICAgICAgICAgICAgICBQYXR0ZXJuLm1hdGNoZXMoaW52YWxpZFBhdHRlcm4sIGRldmljZUlkKSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFNlcmlhbE51bWJlcigpIHsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiTm9uLXRlbGVwaG9ueSBkZXZpY2VzIG11c3QgaGF2ZSBhIEJ1aWxkLlNFUklBTCBudW1iZXIuIiwKLSAgICAgICAgICAgICAgICBCdWlsZC5TRVJJQUwpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJOb24tdGVsZXBob255IGRldmljZXMgbXVzdCBoYXZlIGEgQnVpbGQuZ2V0U2VyaWFsKCkgbnVtYmVyLiIsCisgICAgICAgICAgICAgICAgQnVpbGQuZ2V0U2VyaWFsKCkpOwogICAgICAgICBhc3NlcnRUcnVlKCJIYXJkd2FyZSBpZCBtdXN0IGJlIG5vIGxvbmdlciB0aGFuIDIwIGNoYXJhY3RlcnMuIiwKLSAgICAgICAgICAgICAgICBCdWlsZC5TRVJJQUwubGVuZ3RoKCkgPD0gMjApOworICAgICAgICAgICAgICAgIEJ1aWxkLmdldFNlcmlhbCgpLmxlbmd0aCgpIDw9IDIwKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiSGFyZHdhcmUgaWQgbXVzdCBiZSBhbHBoYW51bWVyaWMuIiwKLSAgICAgICAgICAgICAgICBQYXR0ZXJuLm1hdGNoZXMoIlswLTlBLVphLXpdKyIsIEJ1aWxkLlNFUklBTCkpOworICAgICAgICAgICAgICAgIFBhdHRlcm4ubWF0Y2hlcygiWzAtOUEtWmEtel0rIiwgQnVpbGQuZ2V0U2VyaWFsKCkpKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgYXNzZXJ0TWFjQWRkcmVzcyhTdHJpbmcgbWFjQWRkcmVzcykgewpAQCAtNDU1LDggKzQ5Myw5IEBACiAgICAgICAgICAgICAgICAgTG9vcGVyLmxvb3AoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSk7Ci0gICAgICAgIHQuc3RhcnQoKTsKKwogICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICB0LnN0YXJ0KCk7CiAgICAgICAgICAgICBtTG9jay53YWl0KFRPTEVSQU5DRSk7CiAgICAgICAgIH0KIApAQCAtNDcxLDEyICs1MTAsOCBAQAogICAgICAgICBTdHJpbmcgaW1laSA9IG1UZWxlcGhvbnlNYW5hZ2VyLmdldEltZWkoKTsKIAogICAgICAgICBpZiAobVBhY2thZ2VNYW5hZ2VyLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9URUxFUEhPTlkpKSB7Ci0gICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGltZWkpKSB7CisgICAgICAgICAgICBpZiAobVRlbGVwaG9ueU1hbmFnZXIuZ2V0UGhvbmVUeXBlKCkgPT0gVGVsZXBob255TWFuYWdlci5QSE9ORV9UWVBFX0dTTSkgewogICAgICAgICAgICAgICAgIGFzc2VydEltZWkoaW1laSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIElmIElNRUkgaXMgZW1wdHksIHRoZW4gTUVJRCBtdXN0IG5vdCBiZSBlbXB0eS4gQSBwaG9uZSBzaG91bGQgaGF2ZSBlaXRoZXIgYQotICAgICAgICAgICAgICAgIC8vIElNRUkgb3IgTUVJRC4gVGhlIHZhbGlkYXRpb24gb2YgTUVJRCB3aWxsIGJlIGNoZWNrZWQgYnkgdGVzdEdldE1laWQoKS4KLSAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShUZXh0VXRpbHMuaXNFbXB0eShtVGVsZXBob255TWFuYWdlci5nZXRNZWlkKCkpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTUxMCwxMiArNTQ1LDggQEAKICAgICAgICAgU3RyaW5nIG1laWQgPSBtVGVsZXBob255TWFuYWdlci5nZXRNZWlkKCk7CiAKICAgICAgICAgaWYgKG1QYWNrYWdlTWFuYWdlci5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfVEVMRVBIT05ZKSkgewotICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShtZWlkKSkgeworICAgICAgICAgICAgaWYgKG1UZWxlcGhvbnlNYW5hZ2VyLmdldFBob25lVHlwZSgpID09IFRlbGVwaG9ueU1hbmFnZXIuUEhPTkVfVFlQRV9DRE1BKSB7CiAgICAgICAgICAgICAgICAgYXNzZXJ0TWVpZEVzbihtZWlkKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgTUVJRCBpcyBlbXB0eSwgdGhlbiBJTUVJIG11c3Qgbm90IGJlIGVtcHR5LiBBIHBob25lIHNob3VsZCBoYXZlIGVpdGhlciBhCi0gICAgICAgICAgICAgICAgLy8gSU1FSSBvciBNRUlELiBUaGUgdmFsaWRhdGlvbiBvZiBJTUVJIHdpbGwgYmUgY2hlY2tlZCBieSB0ZXN0R2V0SW1laSgpLgotICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKFRleHRVdGlscy5pc0VtcHR5KG1UZWxlcGhvbnlNYW5hZ2VyLmdldEltZWkoKSkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtNTI5LDEwICs1NjAsMjEgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVRlbGVwaG9ueU1hbmFnZXIuZ2V0UGhvbmVDb3VudCgpOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBtZWlkID0gbVRlbGVwaG9ueU1hbmFnZXIuZ2V0TWVpZChpKTsKLSAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkobWVpZCkpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRNZWlkRXNuKG1laWQpOworICAgICAgICBTdWJzY3JpcHRpb25NYW5hZ2VyIHNtID0gKFN1YnNjcmlwdGlvbk1hbmFnZXIpIGdldENvbnRleHQoKQorICAgICAgICAgICAgICAgIC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuVEVMRVBIT05ZX1NVQlNDUklQVElPTl9TRVJWSUNFKTsKKyAgICAgICAgTGlzdDxTdWJzY3JpcHRpb25JbmZvPiBzdWJJbmZvcyA9IHNtLmdldEFjdGl2ZVN1YnNjcmlwdGlvbkluZm9MaXN0KCk7CisKKyAgICAgICAgaWYgKHN1YkluZm9zICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoU3Vic2NyaXB0aW9uSW5mbyBzdWJJbmZvIDogc3ViSW5mb3MpIHsKKyAgICAgICAgICAgICAgICBpbnQgc2xvdEluZGV4ID0gc3ViSW5mby5nZXRTaW1TbG90SW5kZXgoKTsKKyAgICAgICAgICAgICAgICBpbnQgc3ViSWQgPSBzdWJJbmZvLmdldFN1YnNjcmlwdGlvbklkKCk7CisgICAgICAgICAgICAgICAgVGVsZXBob255TWFuYWdlciB0bSA9IG1UZWxlcGhvbnlNYW5hZ2VyLmNyZWF0ZUZvclN1YnNjcmlwdGlvbklkKHN1YklkKTsKKyAgICAgICAgICAgICAgICBpZiAodG0uZ2V0UGhvbmVUeXBlKCkgPT0gVGVsZXBob255TWFuYWdlci5QSE9ORV9UWVBFX0NETUEpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1laWQgPSBtVGVsZXBob255TWFuYWdlci5nZXRNZWlkKHNsb3RJbmRleCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkobWVpZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydE1laWRFc24obWVpZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtNjA0LDQgKzY0Niw0MCBAQAogICAgIHByaXZhdGUgc3RhdGljIENvbnRleHQgZ2V0Q29udGV4dCgpIHsKICAgICAgICAgcmV0dXJuIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldENvbnRleHQoKTsKICAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB0aGF0IHRoZSBkZXZpY2UgcHJvcGVybHkgc2V0cyB0aGUgbmV0d29yayBzZWxlY3Rpb24gbW9kZSB0byBhdXRvbWF0aWMuCisgICAgICogRXhwZWN0cyBhIHNlY3VyaXR5IGV4Y2VwdGlvbiBzaW5jZSB0aGUgY2FsbGVyIGRvZXMgbm90IGhhdmUgY2FycmllciBwcml2aWxlZ2VzLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNldE5ldHdvcmtTZWxlY3Rpb25Nb2RlQXV0b21hdGljKCkgeworICAgICAgICBpZiAoIW1QYWNrYWdlTWFuYWdlci5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfVEVMRVBIT05ZKSkgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiU2tpcHBpbmcgdGVzdCB0aGF0IHJlcXVpcmVzIEZFQVRVUkVfVEVMRVBIT05ZIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1UZWxlcGhvbnlNYW5hZ2VyLnNldE5ldHdvcmtTZWxlY3Rpb25Nb2RlQXV0b21hdGljKCk7CisgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBTZWN1cml0eUV4Y2VwdGlvbi4gQXBwIGRvZXMgbm90IGhhdmUgY2FycmllciBwcml2aWxlZ2VzLiIpOworICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhhdCB0aGUgZGV2aWNlIHByb3Blcmx5IGFza3MgdGhlIHJhZGlvIHRvIGNvbm5lY3QgdG8gdGhlIGlucHV0IG5ldHdvcmsgYW5kIGNoYW5nZQorICAgICAqIHNlbGVjdGlvbiBtb2RlIHRvIG1hbnVhbC4KKyAgICAgKiBFeHBlY3RzIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHNpbmNlIHRoZSBjYWxsZXIgZG9lcyBub3QgaGF2ZSBjYXJyaWVyIHByaXZpbGVnZXMuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0TmV0d29ya1NlbGVjdGlvbk1vZGVNYW51YWwoKSB7CisgICAgICAgIGlmICghbVBhY2thZ2VNYW5hZ2VyLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9URUxFUEhPTlkpKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJTa2lwcGluZyB0ZXN0IHRoYXQgcmVxdWlyZXMgRkVBVFVSRV9URUxFUEhPTlkiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbVRlbGVwaG9ueU1hbmFnZXIuc2V0TmV0d29ya1NlbGVjdGlvbk1vZGVNYW51YWwoCisgICAgICAgICAgICAgICAgICAgICIiIC8qIG9wZXJhdG9yTnVtZXJpYyAqLywgZmFsc2UgLyogcGVyc2lzdFNlbGVjdGlvbiAqLyk7CisgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBTZWN1cml0eUV4Y2VwdGlvbi4gQXBwIGRvZXMgbm90IGhhdmUgY2FycmllciBwcml2aWxlZ2VzLiIpOworICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGVsZXBob255L3NyYy9hbmRyb2lkL3RlbGVwaG9ueS9jdHMvVmlzdWFsVm9pY2VtYWlsU2VydmljZVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvY3RzL1Zpc3VhbFZvaWNlbWFpbFNlcnZpY2VUZXN0LmphdmEKaW5kZXggY2ZkMzFkMy4uZmM5NzA1OSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdGVsZXBob255L3NyYy9hbmRyb2lkL3RlbGVwaG9ueS9jdHMvVmlzdWFsVm9pY2VtYWlsU2VydmljZVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy90ZWxlcGhvbnkvc3JjL2FuZHJvaWQvdGVsZXBob255L2N0cy9WaXN1YWxWb2ljZW1haWxTZXJ2aWNlVGVzdC5qYXZhCkBAIC0zMiw3ICszMiw3IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlRlbGVwaG9ueS5TbXM7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5UZWxlcGhvbnkuU21zLkludGVudHM7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uTnVsbGFibGU7CitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5OdWxsYWJsZTsKIGltcG9ydCBhbmRyb2lkLnRlbGVjb20uUGhvbmVBY2NvdW50OwogaW1wb3J0IGFuZHJvaWQudGVsZWNvbS5QaG9uZUFjY291bnRIYW5kbGU7CiBpbXBvcnQgYW5kcm9pZC50ZWxlY29tLlRlbGVjb21NYW5hZ2VyOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGVsZXBob255L3NyYy9hbmRyb2lkL3RlbGVwaG9ueS9lbWJtcy9jdHMvRG93bmxvYWRSZXF1ZXN0VGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdGVsZXBob255L3NyYy9hbmRyb2lkL3RlbGVwaG9ueS9lbWJtcy9jdHMvRG93bmxvYWRSZXF1ZXN0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNmNjNDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy90ZWxlcGhvbnkvc3JjL2FuZHJvaWQvdGVsZXBob255L2VtYm1zL2N0cy9Eb3dubG9hZFJlcXVlc3RUZXN0LmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnRlbGVwaG9ueS5lbWJtcy5jdHM7CisKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuY3RzLmVtYm1zdGVzdGFwcC5DdHNEb3dubG9hZFNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkubWJtcy5Eb3dubG9hZFJlcXVlc3Q7CitpbXBvcnQgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RDYXNlOworCitpbXBvcnQgamF2YS5pby5GaWxlOworCitwdWJsaWMgY2xhc3MgRG93bmxvYWRSZXF1ZXN0VGVzdCBleHRlbmRzIEluc3RydW1lbnRhdGlvblRlc3RDYXNlIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TWF4QXBwSW50ZW50U2l6ZSgpIHsKKyAgICAgICAgLy8gVGVzdCB0aGF0IHRoZSBtYXggaW50ZW50IHNpemUgaXMgcG9zaXRpdmUKKyAgICAgICAgYXNzZXJ0VHJ1ZShEb3dubG9hZFJlcXVlc3QuZ2V0TWF4QXBwSW50ZW50U2l6ZSgpID4gMCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldE1heERlc3RpbmF0aW9uVXJpU2l6ZSgpIHsKKyAgICAgICAgLy8gVGVzdCB0aGF0IHRoZSBtYXggaW50ZW50IHNpemUgaXMgcG9zaXRpdmUKKyAgICAgICAgYXNzZXJ0VHJ1ZShEb3dubG9hZFJlcXVlc3QuZ2V0TWF4RGVzdGluYXRpb25VcmlTaXplKCkgPiAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QnVpbGRlckNvbnN0cnVjdGlvbigpIHsKKyAgICAgICAgRmlsZSBkZXN0aW5hdGlvbkRpcmVjdG9yeSA9IG5ldyBGaWxlKGdldEluc3RydW1lbnRhdGlvbigpLmdldENvbnRleHQoKS5nZXRGaWxlc0RpcigpLAorICAgICAgICAgICAgICAgICJkb3dubG9hZHMiKTsKKyAgICAgICAgVXJpIGRlc3RpbmF0aW9uRGlyZWN0b3J5VXJpID0gVXJpLmZyb21GaWxlKGRlc3RpbmF0aW9uRGlyZWN0b3J5KTsKKyAgICAgICAgRG93bmxvYWRSZXF1ZXN0LkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBEb3dubG9hZFJlcXVlc3QuQnVpbGRlcigKKyAgICAgICAgICAgICAgICBDdHNEb3dubG9hZFNlcnZpY2UuU09VUkNFX1VSSV8xLCBkZXN0aW5hdGlvbkRpcmVjdG9yeVVyaSkKKyAgICAgICAgICAgICAgICAuc2V0U3Vic2NyaXB0aW9uSWQoLTEpCisgICAgICAgICAgICAgICAgLnNldFNlcnZpY2VJbmZvKEN0c0Rvd25sb2FkU2VydmljZS5GSUxFX1NFUlZJQ0VfSU5GTyk7CisgICAgICAgIERvd25sb2FkUmVxdWVzdCByZXF1ZXN0ID0gYnVpbGRlci5idWlsZCgpOworICAgICAgICBhc3NlcnRFcXVhbHMocmVxdWVzdCwgRG93bmxvYWRSZXF1ZXN0LkJ1aWxkZXIuZnJvbURvd25sb2FkUmVxdWVzdChyZXF1ZXN0KS5idWlsZCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VydmljZUlkRXF1aXZhbGVuY3koKSB7CisgICAgICAgIEZpbGUgZGVzdGluYXRpb25EaXJlY3RvcnkgPSBuZXcgRmlsZShnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRDb250ZXh0KCkuZ2V0RmlsZXNEaXIoKSwKKyAgICAgICAgICAgICAgICAiZG93bmxvYWRzIik7CisgICAgICAgIFVyaSBkZXN0aW5hdGlvbkRpcmVjdG9yeVVyaSA9IFVyaS5mcm9tRmlsZShkZXN0aW5hdGlvbkRpcmVjdG9yeSk7CisgICAgICAgIERvd25sb2FkUmVxdWVzdCByZXF1ZXN0MSA9IG5ldyBEb3dubG9hZFJlcXVlc3QuQnVpbGRlcigKKyAgICAgICAgICAgICAgICBDdHNEb3dubG9hZFNlcnZpY2UuU09VUkNFX1VSSV8xLCBkZXN0aW5hdGlvbkRpcmVjdG9yeVVyaSkKKyAgICAgICAgICAgICAgICAuc2V0U3Vic2NyaXB0aW9uSWQoLTEpCisgICAgICAgICAgICAgICAgLnNldFNlcnZpY2VJbmZvKEN0c0Rvd25sb2FkU2VydmljZS5GSUxFX1NFUlZJQ0VfSU5GTykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgICAgICBEb3dubG9hZFJlcXVlc3QgcmVxdWVzdDIgPSBuZXcgRG93bmxvYWRSZXF1ZXN0LkJ1aWxkZXIoCisgICAgICAgICAgICAgICAgQ3RzRG93bmxvYWRTZXJ2aWNlLlNPVVJDRV9VUklfMSwgZGVzdGluYXRpb25EaXJlY3RvcnlVcmkpCisgICAgICAgICAgICAgICAgLnNldFN1YnNjcmlwdGlvbklkKC0xKQorICAgICAgICAgICAgICAgIC5zZXRTZXJ2aWNlSWQoQ3RzRG93bmxvYWRTZXJ2aWNlLkZJTEVfU0VSVklDRV9JTkZPLmdldFNlcnZpY2VJZCgpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworCisgICAgICAgIGFzc2VydEVxdWFscyhyZXF1ZXN0MSwgcmVxdWVzdDIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvZW1ibXMvY3RzL01ibXNEb3dubG9hZENhbGxiYWNrVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdGVsZXBob255L3NyYy9hbmRyb2lkL3RlbGVwaG9ueS9lbWJtcy9jdHMvTWJtc0Rvd25sb2FkQ2FsbGJhY2tUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMwZDE5MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvZW1ibXMvY3RzL01ibXNEb3dubG9hZENhbGxiYWNrVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQudGVsZXBob255LmVtYm1zLmN0czsKKworaW1wb3J0IGFuZHJvaWQudGVsZXBob255Lk1ibXNEb3dubG9hZFNlc3Npb247CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuY3RzLmVtYm1zdGVzdGFwcC5DdHNEb3dubG9hZFNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkubWJtcy5Eb3dubG9hZFByb2dyZXNzTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkubWJtcy5Eb3dubG9hZFJlcXVlc3Q7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkubWJtcy5Eb3dubG9hZFN0YXR1c0xpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255Lm1ibXMuRmlsZUluZm87CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5CbG9ja2luZ1F1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkxpbmtlZEJsb2NraW5nUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK3B1YmxpYyBjbGFzcyBNYm1zRG93bmxvYWRDYWxsYmFja1Rlc3QgZXh0ZW5kcyBNYm1zRG93bmxvYWRUZXN0QmFzZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBTSE9SVF9USU1FT1VUID0gNTAwOworCisgICAgcHJpdmF0ZSBjbGFzcyBUZXN0RFNDYWxsYmFjayBleHRlbmRzIERvd25sb2FkU3RhdHVzTGlzdGVuZXIgeworICAgICAgICBwcml2YXRlIGZpbmFsIEJsb2NraW5nUXVldWU8U29tZUFyZ3M+IG1DYWxscyA9IG5ldyBMaW5rZWRCbG9ja2luZ1F1ZXVlPD4oKTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TdGF0dXNVcGRhdGVkKERvd25sb2FkUmVxdWVzdCByZXF1ZXN0LCBGaWxlSW5mbyBmaWxlSW5mbywKKyAgICAgICAgICAgICAgICBATWJtc0Rvd25sb2FkU2Vzc2lvbi5Eb3dubG9hZFN0YXR1cyBpbnQgc3RhdGUpIHsKKyAgICAgICAgICAgIFNvbWVBcmdzIGFyZ3MgPSBTb21lQXJncy5vYnRhaW4oKTsKKyAgICAgICAgICAgIGFyZ3MuYXJnMSA9IHJlcXVlc3Q7CisgICAgICAgICAgICBhcmdzLmFyZzIgPSBmaWxlSW5mbzsKKyAgICAgICAgICAgIGFyZ3MuYXJnMyA9IHN0YXRlOworICAgICAgICAgICAgbUNhbGxzLmFkZChhcmdzKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTb21lQXJncyB3YWl0T25TdGF0dXNVcGRhdGVkKGxvbmcgdGltZW91dCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbUNhbGxzLnBvbGwodGltZW91dCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgVGVzdERQQ2FsbGJhY2sgZXh0ZW5kcyBEb3dubG9hZFByb2dyZXNzTGlzdGVuZXIgeworICAgICAgICBwcml2YXRlIGZpbmFsIEJsb2NraW5nUXVldWU8U29tZUFyZ3M+IG1Qcm9ncmVzc1VwZGF0ZWRDYWxscyA9IG5ldyBMaW5rZWRCbG9ja2luZ1F1ZXVlPD4oKTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25Qcm9ncmVzc1VwZGF0ZWQoRG93bmxvYWRSZXF1ZXN0IHJlcXVlc3QsIEZpbGVJbmZvIGZpbGVJbmZvLCBpbnQKKyAgICAgICAgICAgICAgICBjdXJyZW50RG93bmxvYWRTaXplLCBpbnQgZnVsbERvd25sb2FkU2l6ZSwgaW50IGN1cnJlbnREZWNvZGVkU2l6ZSwgaW50CisgICAgICAgICAgICAgICAgZnVsbERlY29kZWRTaXplKSB7CisgICAgICAgICAgICBTb21lQXJncyBhcmdzID0gU29tZUFyZ3Mub2J0YWluKCk7CisgICAgICAgICAgICBhcmdzLmFyZzEgPSByZXF1ZXN0OworICAgICAgICAgICAgYXJncy5hcmcyID0gZmlsZUluZm87CisgICAgICAgICAgICBhcmdzLmFyZzMgPSBjdXJyZW50RG93bmxvYWRTaXplOworICAgICAgICAgICAgYXJncy5hcmc0ID0gZnVsbERvd25sb2FkU2l6ZTsKKyAgICAgICAgICAgIGFyZ3MuYXJnNSA9IGN1cnJlbnREZWNvZGVkU2l6ZTsKKyAgICAgICAgICAgIGFyZ3MuYXJnNiA9IGZ1bGxEZWNvZGVkU2l6ZTsKKyAgICAgICAgICAgIG1Qcm9ncmVzc1VwZGF0ZWRDYWxscy5hZGQoYXJncyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU29tZUFyZ3Mgd2FpdE9uUHJvZ3Jlc3NVcGRhdGVkKGxvbmcgdGltZW91dCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVByb2dyZXNzVXBkYXRlZENhbGxzLnBvbGwodGltZW91dCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGdWxsQ2FsbGJhY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IHNhbXBsZUludCA9IDEwOworICAgICAgICBUZXN0RFNDYWxsYmFjayBzdGF0dXNDYWxsYmFjayA9IG5ldyBUZXN0RFNDYWxsYmFjaygpOworICAgICAgICBUZXN0RFBDYWxsYmFjayBwcm9ncmVzc0NhbGxiYWNrID0gbmV3IFRlc3REUENhbGxiYWNrKCk7CisgICAgICAgIERvd25sb2FkUmVxdWVzdCByZXF1ZXN0ID0gZG93bmxvYWRSZXF1ZXN0VGVtcGxhdGUuYnVpbGQoKTsKKyAgICAgICAgbURvd25sb2FkU2Vzc2lvbi5hZGRTdGF0dXNMaXN0ZW5lcihyZXF1ZXN0LCBtQ2FsbGJhY2tFeGVjdXRvciwgc3RhdHVzQ2FsbGJhY2spOworICAgICAgICBtRG93bmxvYWRTZXNzaW9uLmFkZFByb2dyZXNzTGlzdGVuZXIocmVxdWVzdCwgbUNhbGxiYWNrRXhlY3V0b3IsIHByb2dyZXNzQ2FsbGJhY2spOworICAgICAgICBtTWlkZGxld2FyZUNvbnRyb2wuZmlyZU9uUHJvZ3Jlc3NVcGRhdGVkKHJlcXVlc3QsIEN0c0Rvd25sb2FkU2VydmljZS5GSUxFX0lORk9fMSwKKyAgICAgICAgICAgICAgICBzYW1wbGVJbnQsIHNhbXBsZUludCwgc2FtcGxlSW50LCBzYW1wbGVJbnQpOworICAgICAgICBTb21lQXJncyBwcm9ncmVzc0FyZ3MgPSBwcm9ncmVzc0NhbGxiYWNrLndhaXRPblByb2dyZXNzVXBkYXRlZChBU1lOQ19USU1FT1VUKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlcXVlc3QsIHByb2dyZXNzQXJncy5hcmcxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEN0c0Rvd25sb2FkU2VydmljZS5GSUxFX0lORk9fMSwgcHJvZ3Jlc3NBcmdzLmFyZzIpOworICAgICAgICBhc3NlcnRFcXVhbHMoc2FtcGxlSW50LCBwcm9ncmVzc0FyZ3MuYXJnMyk7CisgICAgICAgIGFzc2VydEVxdWFscyhzYW1wbGVJbnQsIHByb2dyZXNzQXJncy5hcmc0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHNhbXBsZUludCwgcHJvZ3Jlc3NBcmdzLmFyZzUpOworICAgICAgICBhc3NlcnRFcXVhbHMoc2FtcGxlSW50LCBwcm9ncmVzc0FyZ3MuYXJnNik7CisKKyAgICAgICAgbU1pZGRsZXdhcmVDb250cm9sLmZpcmVPblN0YXRlVXBkYXRlZChyZXF1ZXN0LCBDdHNEb3dubG9hZFNlcnZpY2UuRklMRV9JTkZPXzEsIHNhbXBsZUludCk7CisgICAgICAgIFNvbWVBcmdzIHN0YXRlQXJncyA9IHN0YXR1c0NhbGxiYWNrLndhaXRPblN0YXR1c1VwZGF0ZWQoQVNZTkNfVElNRU9VVCk7CisgICAgICAgIGFzc2VydEVxdWFscyhyZXF1ZXN0LCBzdGF0ZUFyZ3MuYXJnMSk7CisgICAgICAgIGFzc2VydEVxdWFscyhDdHNEb3dubG9hZFNlcnZpY2UuRklMRV9JTkZPXzEsIHN0YXRlQXJncy5hcmcyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHNhbXBsZUludCwgc3RhdGVBcmdzLmFyZzMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3REZXJlZ2lzdHJhdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBUZXN0RFNDYWxsYmFjayBzdGF0dXNDYWxsYmFjayA9IG5ldyBUZXN0RFNDYWxsYmFjaygpOworICAgICAgICBUZXN0RFBDYWxsYmFjayBwcm9ncmVzc0NhbGxiYWNrID0gbmV3IFRlc3REUENhbGxiYWNrKCk7CisgICAgICAgIERvd25sb2FkUmVxdWVzdCByZXF1ZXN0ID0gZG93bmxvYWRSZXF1ZXN0VGVtcGxhdGUuYnVpbGQoKTsKKyAgICAgICAgbURvd25sb2FkU2Vzc2lvbi5hZGRQcm9ncmVzc0xpc3RlbmVyKHJlcXVlc3QsIG1DYWxsYmFja0V4ZWN1dG9yLCBwcm9ncmVzc0NhbGxiYWNrKTsKKyAgICAgICAgbURvd25sb2FkU2Vzc2lvbi5hZGRTdGF0dXNMaXN0ZW5lcihyZXF1ZXN0LCBtQ2FsbGJhY2tFeGVjdXRvciwgc3RhdHVzQ2FsbGJhY2spOworICAgICAgICBtRG93bmxvYWRTZXNzaW9uLnJlbW92ZVByb2dyZXNzTGlzdGVuZXIocmVxdWVzdCwgcHJvZ3Jlc3NDYWxsYmFjayk7CisgICAgICAgIG1Eb3dubG9hZFNlc3Npb24ucmVtb3ZlU3RhdHVzTGlzdGVuZXIocmVxdWVzdCwgc3RhdHVzQ2FsbGJhY2spOworCisgICAgICAgIG1NaWRkbGV3YXJlQ29udHJvbC5maXJlT25TdGF0ZVVwZGF0ZWQobnVsbCwgbnVsbCwgMCk7CisgICAgICAgIGFzc2VydE51bGwoc3RhdHVzQ2FsbGJhY2sud2FpdE9uU3RhdHVzVXBkYXRlZChTSE9SVF9USU1FT1VUKSk7CisgICAgICAgIG1NaWRkbGV3YXJlQ29udHJvbC5maXJlT25Qcm9ncmVzc1VwZGF0ZWQobnVsbCwgbnVsbCwgMCwgMCwgMCwgMCk7CisgICAgICAgIGFzc2VydE51bGwocHJvZ3Jlc3NDYWxsYmFjay53YWl0T25Qcm9ncmVzc1VwZGF0ZWQoU0hPUlRfVElNRU9VVCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvZW1ibXMvY3RzL01ibXNEb3dubG9hZEZsb3dUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy90ZWxlcGhvbnkvc3JjL2FuZHJvaWQvdGVsZXBob255L2VtYm1zL2N0cy9NYm1zRG93bmxvYWRGbG93VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyOGY1OWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy90ZWxlcGhvbnkvc3JjL2FuZHJvaWQvdGVsZXBob255L2VtYm1zL2N0cy9NYm1zRG93bmxvYWRGbG93VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTcwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQudGVsZXBob255LmVtYm1zLmN0czsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255Lk1ibXNEb3dubG9hZFNlc3Npb247CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuY3RzLmVtYm1zdGVzdGFwcC5DdHNEb3dubG9hZFNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkubWJtcy5Eb3dubG9hZFJlcXVlc3Q7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkubWJtcy5GaWxlSW5mbzsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5tYm1zLk1ibXNEb3dubG9hZFJlY2VpdmVyOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgTWJtc0Rvd25sb2FkRmxvd1Rlc3QgZXh0ZW5kcyBNYm1zRG93bmxvYWRUZXN0QmFzZSB7CisgICAgcHJpdmF0ZSBGaWxlIHRlbXBGaWxlUm9vdERpcjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgIHRlbXBGaWxlUm9vdERpciA9IG5ldyBGaWxlKG1Db250ZXh0LmdldEZpbGVzRGlyKCksICJDdHNUZXN0RGlyIik7CisgICAgICAgIHRlbXBGaWxlUm9vdERpci5ta2RpcigpOworICAgICAgICBtRG93bmxvYWRTZXNzaW9uLnNldFRlbXBGaWxlUm9vdERpcmVjdG9yeSh0ZW1wRmlsZVJvb3REaXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJlY3Vyc2l2ZURlbGV0ZSh0ZW1wRmlsZVJvb3REaXIpOworICAgICAgICB0ZW1wRmlsZVJvb3REaXIgPSBudWxsOworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGVGaWxlRG93bmxvYWRGbG93KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE1ibXNEb3dubG9hZFJlY2VpdmVyVGVzdC5BcHBJbnRlbnRDYXB0dXJlIGNhcHRvciA9CisgICAgICAgICAgICAgICAgbmV3IE1ibXNEb3dubG9hZFJlY2VpdmVyVGVzdC5BcHBJbnRlbnRDYXB0dXJlKG1Db250ZXh0LCBtSGFuZGxlcik7CisgICAgICAgIERvd25sb2FkUmVxdWVzdCByZXF1ZXN0ID0gZG93bmxvYWRSZXF1ZXN0VGVtcGxhdGUKKyAgICAgICAgICAgICAgICAuc2V0QXBwSW50ZW50KG5ldyBJbnRlbnQoTWJtc0Rvd25sb2FkUmVjZWl2ZXJUZXN0LkFQUF9JTlRFTlRfQUNUSU9OKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgbURvd25sb2FkU2Vzc2lvbi5kb3dubG9hZChyZXF1ZXN0KTsKKyAgICAgICAgbU1pZGRsZXdhcmVDb250cm9sLmFjdHVhbGx5U3RhcnREb3dubG9hZEZsb3coKTsKKworICAgICAgICBVcmkgZmlsZVVyaSA9IGNoZWNrUmVjZWl2ZWREb3dubG9hZENvbXBsZXRlSW50ZW50KGNhcHRvci5nZXRJbnRlbnQoKSwgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICBDdHNEb3dubG9hZFNlcnZpY2UuRklMRV9JTkZPXzEpOworICAgICAgICBjaGVja0ZpbGVDb250ZW50SW50ZWdyaXR5KEN0c0Rvd25sb2FkU2VydmljZS5GSUxFX0lORk9fMSwgZmlsZVVyaSk7CisgICAgICAgIGNoZWNrRG93bmxvYWRSZXN1bHRBY2soMSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZpbGVJblN1YmRpcmVjdG9yeURvd25sb2FkRmxvdygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBNYm1zRG93bmxvYWRSZWNlaXZlclRlc3QuQXBwSW50ZW50Q2FwdHVyZSBjYXB0b3IgPQorICAgICAgICAgICAgICAgIG5ldyBNYm1zRG93bmxvYWRSZWNlaXZlclRlc3QuQXBwSW50ZW50Q2FwdHVyZShtQ29udGV4dCwgbUhhbmRsZXIpOworICAgICAgICBEb3dubG9hZFJlcXVlc3QgcmVxdWVzdCA9IG5ldyBEb3dubG9hZFJlcXVlc3QuQnVpbGRlcigKKyAgICAgICAgICAgICAgICBDdHNEb3dubG9hZFNlcnZpY2UuU09VUkNFX1VSSV8yLCBkZXN0aW5hdGlvbkRpcmVjdG9yeVVyaSkKKyAgICAgICAgICAgICAgICAuc2V0U2VydmljZUluZm8oQ3RzRG93bmxvYWRTZXJ2aWNlLkZJTEVfU0VSVklDRV9JTkZPKQorICAgICAgICAgICAgICAgIC5zZXRBcHBJbnRlbnQobmV3IEludGVudChNYm1zRG93bmxvYWRSZWNlaXZlclRlc3QuQVBQX0lOVEVOVF9BQ1RJT04pKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworCisgICAgICAgIG1Eb3dubG9hZFNlc3Npb24uZG93bmxvYWQocmVxdWVzdCk7CisgICAgICAgIG1NaWRkbGV3YXJlQ29udHJvbC5hY3R1YWxseVN0YXJ0RG93bmxvYWRGbG93KCk7CisKKyAgICAgICAgVXJpIGZpbGVVcmkgPSBjaGVja1JlY2VpdmVkRG93bmxvYWRDb21wbGV0ZUludGVudChjYXB0b3IuZ2V0SW50ZW50KCksIHJlcXVlc3QsCisgICAgICAgICAgICAgICAgQ3RzRG93bmxvYWRTZXJ2aWNlLkZJTEVfSU5GT18yKTsKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIHJlY2VpdmVkIGZpbGUgaXMgcGxhY2VkIGluIHRoZSBwcm9wZXIgc3ViZGlyZWN0b3J5LgorICAgICAgICBTdHJpbmcgZmlsZTJSZWxhdGl2ZVBhdGggPSBDdHNEb3dubG9hZFNlcnZpY2UuRklMRV9JTkZPXzIuZ2V0VXJpKCkuZ2V0UGF0aCgpLnN1YnN0cmluZygKKyAgICAgICAgICAgICAgICBDdHNEb3dubG9hZFNlcnZpY2UuU09VUkNFX1VSSV8yLmdldFBhdGgoKS5sZW5ndGgoKSk7CisgICAgICAgIGFzc2VydFRydWUoImdvdCBwYXRoOiAiICsgZmlsZVVyaS5nZXRQYXRoKCkgKyAiLCBzaG91bGQgZW5kIHdpdGg6ICIgKyBmaWxlMlJlbGF0aXZlUGF0aCwKKyAgICAgICAgICAgICAgICBmaWxlVXJpLmdldFBhdGgoKS5lbmRzV2l0aChmaWxlMlJlbGF0aXZlUGF0aCkpOworICAgICAgICBjaGVja0ZpbGVDb250ZW50SW50ZWdyaXR5KEN0c0Rvd25sb2FkU2VydmljZS5GSUxFX0lORk9fMiwgZmlsZVVyaSk7CisgICAgICAgIGNoZWNrRG93bmxvYWRSZXN1bHRBY2soMSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpRmlsZURvd25sb2FkRmxvdygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBNYm1zRG93bmxvYWRSZWNlaXZlclRlc3QuQXBwSW50ZW50Q2FwdHVyZSBjYXB0b3IgPQorICAgICAgICAgICAgICAgIG5ldyBNYm1zRG93bmxvYWRSZWNlaXZlclRlc3QuQXBwSW50ZW50Q2FwdHVyZShtQ29udGV4dCwgbUhhbmRsZXIpOworICAgICAgICBEb3dubG9hZFJlcXVlc3QgcmVxdWVzdCA9IG5ldyBEb3dubG9hZFJlcXVlc3QuQnVpbGRlcigKKyAgICAgICAgICAgICAgICBDdHNEb3dubG9hZFNlcnZpY2UuU09VUkNFX1VSSV8zLCBkZXN0aW5hdGlvbkRpcmVjdG9yeVVyaSkKKyAgICAgICAgICAgICAgICAuc2V0U2VydmljZUluZm8oQ3RzRG93bmxvYWRTZXJ2aWNlLkZJTEVfU0VSVklDRV9JTkZPKQorICAgICAgICAgICAgICAgIC5zZXRBcHBJbnRlbnQobmV3IEludGVudChNYm1zRG93bmxvYWRSZWNlaXZlclRlc3QuQVBQX0lOVEVOVF9BQ1RJT04pKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworCisgICAgICAgIG1Eb3dubG9hZFNlc3Npb24uZG93bmxvYWQocmVxdWVzdCk7CisgICAgICAgIG1NaWRkbGV3YXJlQ29udHJvbC5hY3R1YWxseVN0YXJ0RG93bmxvYWRGbG93KCk7CisKKyAgICAgICAgZm9yIChJbnRlbnQgaSA6IGNhcHRvci5nZXRJbnRlbnRzKDIpKSB7CisgICAgICAgICAgICBGaWxlSW5mbyBmaWxlSW5mbyA9IGkuZ2V0UGFyY2VsYWJsZUV4dHJhKE1ibXNEb3dubG9hZFNlc3Npb24uRVhUUkFfTUJNU19GSUxFX0lORk8pOworICAgICAgICAgICAgVXJpIGZpbGVVcmkgPSBudWxsOworICAgICAgICAgICAgaWYgKEN0c0Rvd25sb2FkU2VydmljZS5GSUxFX0lORk9fMS5lcXVhbHMoZmlsZUluZm8pKSB7CisgICAgICAgICAgICAgICAgZmlsZVVyaSA9IGNoZWNrUmVjZWl2ZWREb3dubG9hZENvbXBsZXRlSW50ZW50KAorICAgICAgICAgICAgICAgICAgICAgICAgaSwgcmVxdWVzdCwgQ3RzRG93bmxvYWRTZXJ2aWNlLkZJTEVfSU5GT18xKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoQ3RzRG93bmxvYWRTZXJ2aWNlLkZJTEVfSU5GT18yLmVxdWFscyhmaWxlSW5mbykpIHsKKyAgICAgICAgICAgICAgICBmaWxlVXJpID0gY2hlY2tSZWNlaXZlZERvd25sb2FkQ29tcGxldGVJbnRlbnQoCisgICAgICAgICAgICAgICAgICAgICAgICBpLCByZXF1ZXN0LCBDdHNEb3dubG9hZFNlcnZpY2UuRklMRV9JTkZPXzIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJHb3QgdW5rbm93biBmaWxlIGluZm86ICIgKyBmaWxlSW5mbyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcgcmVsYXRpdmVQYXRoID0gZmlsZUluZm8uZ2V0VXJpKCkuZ2V0UGF0aCgpLnN1YnN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgQ3RzRG93bmxvYWRTZXJ2aWNlLlNPVVJDRV9VUklfMy5nZXRQYXRoKCkubGVuZ3RoKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiZ290IHBhdGg6ICIgKyBmaWxlVXJpLmdldFBhdGgoKSArICIsIHNob3VsZCBlbmQgd2l0aDogIiArIHJlbGF0aXZlUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgZmlsZVVyaS5nZXRQYXRoKCkuZW5kc1dpdGgocmVsYXRpdmVQYXRoKSk7CisgICAgICAgICAgICBjaGVja0ZpbGVDb250ZW50SW50ZWdyaXR5KGZpbGVJbmZvLCBmaWxlVXJpKTsKKyAgICAgICAgfQorICAgICAgICBjaGVja0Rvd25sb2FkUmVzdWx0QWNrKDIpOworICAgIH0KKworCisgICAgcHJpdmF0ZSBVcmkgY2hlY2tSZWNlaXZlZERvd25sb2FkQ29tcGxldGVJbnRlbnQoSW50ZW50IGRvd25sb2FkRG9uZUludGVudCwKKyAgICAgICAgICAgIERvd25sb2FkUmVxdWVzdCBkb3dubG9hZFJlcXVlc3QsIEZpbGVJbmZvIGV4cGVjdGVkRmlsZUluZm8pIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1ibXNEb3dubG9hZFJlY2VpdmVyVGVzdC5BUFBfSU5URU5UX0FDVElPTiwgZG93bmxvYWREb25lSW50ZW50LmdldEFjdGlvbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1ibXNEb3dubG9hZFNlc3Npb24uUkVTVUxUX1NVQ0NFU1NGVUwsCisgICAgICAgICAgICAgICAgZG93bmxvYWREb25lSW50ZW50LmdldEludEV4dHJhKE1ibXNEb3dubG9hZFNlc3Npb24uRVhUUkFfTUJNU19ET1dOTE9BRF9SRVNVTFQsIC0xKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhkb3dubG9hZFJlcXVlc3QsCisgICAgICAgICAgICAgICAgZG93bmxvYWREb25lSW50ZW50LmdldFBhcmNlbGFibGVFeHRyYSgKKyAgICAgICAgICAgICAgICAgICAgICAgIE1ibXNEb3dubG9hZFNlc3Npb24uRVhUUkFfTUJNU19ET1dOTE9BRF9SRVFVRVNUKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhkb3dubG9hZFJlcXVlc3QuZ2V0U3Vic2NyaXB0aW9uSWQoKSwKKyAgICAgICAgICAgICAgICAoKERvd25sb2FkUmVxdWVzdCkgZG93bmxvYWREb25lSW50ZW50LmdldFBhcmNlbGFibGVFeHRyYSgKKyAgICAgICAgICAgICAgICAgICAgICAgIE1ibXNEb3dubG9hZFNlc3Npb24uRVhUUkFfTUJNU19ET1dOTE9BRF9SRVFVRVNUKSkuZ2V0U3Vic2NyaXB0aW9uSWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhkb3dubG9hZFJlcXVlc3QuZ2V0RGVzdGluYXRpb25VcmkoKSwKKyAgICAgICAgICAgICAgICAoKERvd25sb2FkUmVxdWVzdCkgZG93bmxvYWREb25lSW50ZW50LmdldFBhcmNlbGFibGVFeHRyYSgKKyAgICAgICAgICAgICAgICAgICAgICAgIE1ibXNEb3dubG9hZFNlc3Npb24uRVhUUkFfTUJNU19ET1dOTE9BRF9SRVFVRVNUKSkuZ2V0RGVzdGluYXRpb25VcmkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZEZpbGVJbmZvLAorICAgICAgICAgICAgICAgIGRvd25sb2FkRG9uZUludGVudC5nZXRQYXJjZWxhYmxlRXh0cmEoTWJtc0Rvd25sb2FkU2Vzc2lvbi5FWFRSQV9NQk1TX0ZJTEVfSU5GTykpOworICAgICAgICByZXR1cm4gZG93bmxvYWREb25lSW50ZW50LmdldFBhcmNlbGFibGVFeHRyYSgKKyAgICAgICAgICAgICAgICBNYm1zRG93bmxvYWRTZXNzaW9uLkVYVFJBX01CTVNfQ09NUExFVEVEX0ZJTEVfVVJJKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tGaWxlQ29udGVudEludGVncml0eShGaWxlSW5mbyBmaWxlSW5mbywgVXJpIGNvbXBsZXRlZEZpbGVVcmkpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZpbGVJbmZvLmdldFVyaSgpLmdldExhc3RQYXRoU2VnbWVudCgpLAorICAgICAgICAgICAgICAgIGNvbXBsZXRlZEZpbGVVcmkuZ2V0TGFzdFBhdGhTZWdtZW50KCkpOworICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLm9wZW5JbnB1dFN0cmVhbShjb21wbGV0ZWRGaWxlVXJpKTsKKyAgICAgICAgYnl0ZVtdIGNvbnRlbnRzID0gbmV3IGJ5dGVbQ3RzRG93bmxvYWRTZXJ2aWNlLlNBTVBMRV9GSUxFX0RBVEEubGVuZ3RoXTsKKyAgICAgICAgaXMucmVhZChjb250ZW50cyk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udGVudHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhjb250ZW50c1tpXSwgQ3RzRG93bmxvYWRTZXJ2aWNlLlNBTVBMRV9GSUxFX0RBVEFbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrRG93bmxvYWRSZXN1bHRBY2soaW50IG51bUFja3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBQb2xsIHVudGlsIHdlIGdldCB0byB0aGUgcmlnaHQgbnVtYmVyLgorICAgICAgICBMaXN0PEJ1bmRsZT4gZG93bmxvYWRSZXN1bHRBY2sgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKyAgICAgICAgbG9uZyBjdXJyZW50VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICB3aGlsZSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgPCBjdXJyZW50VGltZSArIEFTWU5DX1RJTUVPVVQpIHsKKyAgICAgICAgICAgIGRvd25sb2FkUmVzdWx0QWNrID0gZ2V0TWlkZGxld2FyZUNhbGxzKEN0c0Rvd25sb2FkU2VydmljZS5NRVRIT0RfRE9XTkxPQURfUkVTVUxUX0FDSyk7CisgICAgICAgICAgICBpZiAobnVtQWNrcyA9PSBkb3dubG9hZFJlc3VsdEFjay5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRocmVhZC5zbGVlcCgyMDApOworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscyhudW1BY2tzLCBkb3dubG9hZFJlc3VsdEFjay5zaXplKCkpOworICAgICAgICBkb3dubG9hZFJlc3VsdEFjay5mb3JFYWNoKChhY2spIC0+IGFzc2VydEVxdWFscyhNYm1zRG93bmxvYWRSZWNlaXZlci5SRVNVTFRfT0ssCisgICAgICAgICAgICAgICAgYWNrLmdldEludChDdHNEb3dubG9hZFNlcnZpY2UuQVJHVU1FTlRfUkVTVUxUX0NPREUsIC0xKSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvZW1ibXMvY3RzL01ibXNEb3dubG9hZFJlY2VpdmVyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdGVsZXBob255L3NyYy9hbmRyb2lkL3RlbGVwaG9ueS9lbWJtcy9jdHMvTWJtc0Rvd25sb2FkUmVjZWl2ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlkOWExYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvZW1ibXMvY3RzL01ibXNEb3dubG9hZFJlY2VpdmVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjg4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQudGVsZXBob255LmVtYm1zLmN0czsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255Lk1ibXNEb3dubG9hZFNlc3Npb247CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuY3RzLmVtYm1zdGVzdGFwcC5DdHNEb3dubG9hZFNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkubWJtcy5Eb3dubG9hZFJlcXVlc3Q7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkubWJtcy5NYm1zRG93bmxvYWRSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5tYm1zLlVyaVBhdGhQYWlyOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255Lm1ibXMudmVuZG9yLlZlbmRvclV0aWxzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQmxvY2tpbmdRdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5MaW5rZWRCbG9ja2luZ1F1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworcHVibGljIGNsYXNzIE1ibXNEb3dubG9hZFJlY2VpdmVyVGVzdCBleHRlbmRzIE1ibXNEb3dubG9hZFRlc3RCYXNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1RTX0JST0FEQ0FTVF9QRVJNSVNTSU9OID0KKyAgICAgICAgICAgICJhbmRyb2lkLnRlbGVwaG9ueS5lbWJtcy5jdHMucGVybWlzc2lvbi5URVNUX0JST0FEQ0FTVCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfU0VSVklDRV9JRCA9ICJzZXJ2aWNlX2lkIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUF9JTlRFTlRfQUNUSU9OID0KKyAgICAgICAgICAgICJhbmRyb2lkLnRlbGVwaG9ueS5lbWJtcy5jdHMuQUNUSU9OX1RFU1RfRE9XTkxPQURfQ09NUExFVEUiOworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBcHBJbnRlbnRDYXB0dXJlIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCbG9ja2luZ1F1ZXVlPEludGVudD4gbVJlY2VpdmVkSW50ZW50ID0gbmV3IExpbmtlZEJsb2NraW5nUXVldWU8PigpOworICAgICAgICBwcml2YXRlIGZpbmFsIEJyb2FkY2FzdFJlY2VpdmVyIG1BcHBJbnRlbnRSZWNlaXZlciA9IG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgICAgIG1SZWNlaXZlZEludGVudC5hZGQoaW50ZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworCisgICAgICAgIHB1YmxpYyBBcHBJbnRlbnRDYXB0dXJlKENvbnRleHQgY29udGV4dCwgSGFuZGxlciBoYW5kbGVyKSB7CisgICAgICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgICAgICBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEludGVudEZpbHRlcihBUFBfSU5URU5UX0FDVElPTik7CisgICAgICAgICAgICBtQ29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG1BcHBJbnRlbnRSZWNlaXZlciwgZmlsdGVyLCBudWxsLCBoYW5kbGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJbnRlbnQgZ2V0SW50ZW50KCkgeworICAgICAgICAgICAgcmV0dXJuIGdldEludGVudCh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJbnRlbnQgZ2V0SW50ZW50KGJvb2xlYW4gdW5yZWdpc3RlcikgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBJbnRlbnQgcmVzdWx0ID0gbVJlY2VpdmVkSW50ZW50LnBvbGwoQVNZTkNfVElNRU9VVCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgICAgICBpZiAodW5yZWdpc3RlcikgeworICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC51bnJlZ2lzdGVyUmVjZWl2ZXIobUFwcEludGVudFJlY2VpdmVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJ0ZXN0IHdhcyBpbnRlcnJ1cHRlZCIpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIExpc3Q8SW50ZW50PiBnZXRJbnRlbnRzKGludCBudW1FeHBlY3RlZCkgeworICAgICAgICAgICAgQXJyYXlMaXN0PEludGVudD4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KG51bUV4cGVjdGVkKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRXhwZWN0ZWQ7IGkrKykgeworICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoZ2V0SW50ZW50KGZhbHNlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ29udGV4dC51bnJlZ2lzdGVyUmVjZWl2ZXIobUFwcEludGVudFJlY2VpdmVyKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIE1ibXNEb3dubG9hZFJlY2VpdmVyIG1SZWNlaXZlcjsKKyAgICBwcml2YXRlIEZpbGUgdGVtcEZpbGVSb290RGlyOworICAgIHByaXZhdGUgU3RyaW5nIHRlbXBGaWxlUm9vdERpclBhdGg7CisgICAgcHJpdmF0ZSBEb3dubG9hZFJlcXVlc3QgdGVzdERvd25sb2FkUmVxdWVzdDsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgIHRlc3REb3dubG9hZFJlcXVlc3QgPSBkb3dubG9hZFJlcXVlc3RUZW1wbGF0ZQorICAgICAgICAgICAgICAgIC5zZXRBcHBJbnRlbnQobmV3IEludGVudChBUFBfSU5URU5UX0FDVElPTikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIG1SZWNlaXZlciA9IG5ldyBNYm1zRG93bmxvYWRSZWNlaXZlcigpOworICAgICAgICBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEludGVudEZpbHRlcigpOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKFZlbmRvclV0aWxzLkFDVElPTl9ET1dOTE9BRF9SRVNVTFRfSU5URVJOQUwpOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKFZlbmRvclV0aWxzLkFDVElPTl9DTEVBTlVQKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihWZW5kb3JVdGlscy5BQ1RJT05fRklMRV9ERVNDUklQVE9SX1JFUVVFU1QpOworICAgICAgICBtQ29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG1SZWNlaXZlciwgZmlsdGVyKTsKKyAgICAgICAgdGVtcEZpbGVSb290RGlyID0gbmV3IEZpbGUobUNvbnRleHQuZ2V0RmlsZXNEaXIoKSwgIkN0c1Rlc3REaXIiKTsKKyAgICAgICAgdGVtcEZpbGVSb290RGlyLm1rZGlyKCk7CisgICAgICAgIHRlbXBGaWxlUm9vdERpclBhdGggPSB0ZW1wRmlsZVJvb3REaXIuZ2V0Q2Fub25pY2FsUGF0aCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbURvd25sb2FkU2Vzc2lvbi5zZXRUZW1wRmlsZVJvb3REaXJlY3RvcnkodGVtcEZpbGVSb290RGlyKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRlYXJEb3duKCk7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmVjdXJzaXZlRGVsZXRlKHRlbXBGaWxlUm9vdERpcik7CisgICAgICAgIHRlbXBGaWxlUm9vdERpciA9IG51bGw7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE1hbGZvcm1lZEludGVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSW50ZW50IGRvd25sb2FkQ29tcGxldGVJbnRlbnQgPSBuZXcgSW50ZW50KFZlbmRvclV0aWxzLkFDVElPTl9ET1dOTE9BRF9SRVNVTFRfSU5URVJOQUwpOworICAgICAgICBzZW5kQnJvYWRjYXN0QW5kVmFsaWRhdGUoZG93bmxvYWRDb21wbGV0ZUludGVudCwKKyAgICAgICAgICAgICAgICBNYm1zRG93bmxvYWRSZWNlaXZlci5SRVNVTFRfTUFMRk9STUVEX0lOVEVOVCk7CisKKyAgICAgICAgSW50ZW50IGZkUmVxdWVzdEludGVudCA9IG5ldyBJbnRlbnQoVmVuZG9yVXRpbHMuQUNUSU9OX0ZJTEVfREVTQ1JJUFRPUl9SRVFVRVNUKTsKKyAgICAgICAgc2VuZEJyb2FkY2FzdEFuZFZhbGlkYXRlKGZkUmVxdWVzdEludGVudCwKKyAgICAgICAgICAgICAgICBNYm1zRG93bmxvYWRSZWNlaXZlci5SRVNVTFRfTUFMRk9STUVEX0lOVEVOVCk7CisKKyAgICAgICAgSW50ZW50IGNsZWFudXBJbnRlbnQgPSBuZXcgSW50ZW50KFZlbmRvclV0aWxzLkFDVElPTl9DTEVBTlVQKTsKKyAgICAgICAgc2VuZEJyb2FkY2FzdEFuZFZhbGlkYXRlKGNsZWFudXBJbnRlbnQsCisgICAgICAgICAgICAgICAgTWJtc0Rvd25sb2FkUmVjZWl2ZXIuUkVTVUxUX01BTEZPUk1FRF9JTlRFTlQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RCYWRUZW1wRmlsZURpcmVjdG9yeSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJbnRlbnQgY2xlYW51cEludGVudCA9IG5ldyBJbnRlbnQoVmVuZG9yVXRpbHMuQUNUSU9OX0NMRUFOVVApOworICAgICAgICBwb3B1bGF0ZUludGVudFdpdGhDb21tb25GaWVsZHMoY2xlYW51cEludGVudCk7CisgICAgICAgIGNsZWFudXBJbnRlbnQucHV0UGFyY2VsYWJsZUFycmF5TGlzdEV4dHJhKFZlbmRvclV0aWxzLkVYVFJBX1RFTVBfRklMRVNfSU5fVVNFLAorICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8PigwKSk7CisgICAgICAgIGNsZWFudXBJbnRlbnQucHV0RXh0cmEoVmVuZG9yVXRpbHMuRVhUUkFfVEVNUF9GSUxFX1JPT1QsICJ0aGlzIGlzIG5vdCBhIGRpcmVjdG9yeSBwYXRoIik7CisgICAgICAgIHNlbmRCcm9hZGNhc3RBbmRWYWxpZGF0ZShjbGVhbnVwSW50ZW50LAorICAgICAgICAgICAgICAgIE1ibXNEb3dubG9hZFJlY2VpdmVyLlJFU1VMVF9CQURfVEVNUF9GSUxFX1JPT1QpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3REb3dubG9hZEZhaWx1cmVJbnRlbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSW50ZW50IGludGVudEZvclJlY2VpdmVyVGVzdCA9IG5ldyBJbnRlbnQoVmVuZG9yVXRpbHMuQUNUSU9OX0RPV05MT0FEX1JFU1VMVF9JTlRFUk5BTCk7CisgICAgICAgIHBvcHVsYXRlSW50ZW50V2l0aENvbW1vbkZpZWxkcyhpbnRlbnRGb3JSZWNlaXZlclRlc3QpOworICAgICAgICBpbnRlbnRGb3JSZWNlaXZlclRlc3QucHV0RXh0cmEoTWJtc0Rvd25sb2FkU2Vzc2lvbi5FWFRSQV9NQk1TX0RPV05MT0FEX1JFU1VMVCwKKyAgICAgICAgICAgICAgICBNYm1zRG93bmxvYWRTZXNzaW9uLlJFU1VMVF9DQU5DRUxMRUQpOworICAgICAgICBpbnRlbnRGb3JSZWNlaXZlclRlc3QucHV0RXh0cmEoTWJtc0Rvd25sb2FkU2Vzc2lvbi5FWFRSQV9NQk1TX0RPV05MT0FEX1JFUVVFU1QsCisgICAgICAgICAgICAgICAgdGVzdERvd25sb2FkUmVxdWVzdCk7CisKKyAgICAgICAgQXBwSW50ZW50Q2FwdHVyZSBpbnRlbnRDYXB0b3IgPSBuZXcgQXBwSW50ZW50Q2FwdHVyZShtQ29udGV4dCwgbUhhbmRsZXIpOworCisgICAgICAgIHNlbmRCcm9hZGNhc3RBbmRWYWxpZGF0ZShpbnRlbnRGb3JSZWNlaXZlclRlc3QsIE1ibXNEb3dubG9hZFJlY2VpdmVyLlJFU1VMVF9PSyk7CisgICAgICAgIEludGVudCByZWNlaXZlZEludGVudCA9IGludGVudENhcHRvci5nZXRJbnRlbnQoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoTWJtc0Rvd25sb2FkU2Vzc2lvbi5SRVNVTFRfQ0FOQ0VMTEVELAorICAgICAgICAgICAgICAgIHJlY2VpdmVkSW50ZW50LmdldEludEV4dHJhKE1ibXNEb3dubG9hZFNlc3Npb24uRVhUUkFfTUJNU19ET1dOTE9BRF9SRVNVTFQsIC0xKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3REb3dubG9hZFJlcXVlc3QsCisgICAgICAgICAgICAgICAgcmVjZWl2ZWRJbnRlbnQuZ2V0UGFyY2VsYWJsZUV4dHJhKE1ibXNEb3dubG9hZFNlc3Npb24uRVhUUkFfTUJNU19ET1dOTE9BRF9SRVFVRVNUKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEJhZERvd25sb2FkVG9rZW4oKSB7CisgICAgICAgIC8vIFNldCB1cCBhIHBlcmZlY3RseSB2YWxpZCBkb3dubG9hZCBjb21wbGV0aW9uIGludGVudCwgYW5kIGV4cGVjdCBpdCB0byBmYWlsIGJlY2F1c2UgdGhlCisgICAgICAgIC8vIGRvd25sb2FkIHRva2VuIGhhc24ndCBiZWVuIHdyaXR0ZW4uCisgICAgICAgIEludGVudCBpbnRlbnRGb3JSZWNlaXZlclRlc3QgPSBuZXcgSW50ZW50KFZlbmRvclV0aWxzLkFDVElPTl9ET1dOTE9BRF9SRVNVTFRfSU5URVJOQUwpOworICAgICAgICBwb3B1bGF0ZUludGVudFdpdGhDb21tb25GaWVsZHMoaW50ZW50Rm9yUmVjZWl2ZXJUZXN0KTsKKyAgICAgICAgaW50ZW50Rm9yUmVjZWl2ZXJUZXN0LnB1dEV4dHJhKE1ibXNEb3dubG9hZFNlc3Npb24uRVhUUkFfTUJNU19ET1dOTE9BRF9SRVNVTFQsCisgICAgICAgICAgICAgICAgTWJtc0Rvd25sb2FkU2Vzc2lvbi5SRVNVTFRfU1VDQ0VTU0ZVTCk7CisgICAgICAgIGludGVudEZvclJlY2VpdmVyVGVzdC5wdXRFeHRyYShNYm1zRG93bmxvYWRTZXNzaW9uLkVYVFJBX01CTVNfRE9XTkxPQURfUkVRVUVTVCwKKyAgICAgICAgICAgICAgICB0ZXN0RG93bmxvYWRSZXF1ZXN0KTsKKyAgICAgICAgaW50ZW50Rm9yUmVjZWl2ZXJUZXN0LnB1dEV4dHJhKE1ibXNEb3dubG9hZFNlc3Npb24uRVhUUkFfTUJNU19GSUxFX0lORk8sCisgICAgICAgICAgICAgICAgQ3RzRG93bmxvYWRTZXJ2aWNlLkZJTEVfSU5GT18xKTsKKyAgICAgICAgaW50ZW50Rm9yUmVjZWl2ZXJUZXN0LnB1dEV4dHJhKFZlbmRvclV0aWxzLkVYVFJBX0ZJTkFMX1VSSSwKKyAgICAgICAgICAgICAgICBVcmkuZnJvbUZpbGUobmV3IEZpbGUobmV3IEZpbGUodGVtcEZpbGVSb290RGlyLCBURVNUX1NFUlZJQ0VfSUQpLCAiZmlsZTEiKSkpOworCisgICAgICAgIHNlbmRCcm9hZGNhc3RBbmRWYWxpZGF0ZShpbnRlbnRGb3JSZWNlaXZlclRlc3QsCisgICAgICAgICAgICAgICAgTWJtc0Rvd25sb2FkUmVjZWl2ZXIuUkVTVUxUX01BTEZPUk1FRF9JTlRFTlQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1ZXN0Tm9GaWxlRGVzY3JpcHRvcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSW50ZW50IGZkUmVxdWVzdEludGVudCA9IG5ldyBJbnRlbnQoVmVuZG9yVXRpbHMuQUNUSU9OX0ZJTEVfREVTQ1JJUFRPUl9SRVFVRVNUKTsKKyAgICAgICAgcG9wdWxhdGVJbnRlbnRXaXRoQ29tbW9uRmllbGRzKGZkUmVxdWVzdEludGVudCk7CisKKyAgICAgICAgQnVuZGxlIGIgPSBzZW5kQnJvYWRjYXN0QW5kVmFsaWRhdGUoZmRSZXF1ZXN0SW50ZW50LCBNYm1zRG93bmxvYWRSZWNlaXZlci5SRVNVTFRfT0spOworICAgICAgICBhc3NlcnRUcnVlKGIgPT0gbnVsbCB8fCBiLmlzRW1wdHkoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlcXVlc3ROZXdGaWxlRGVzY3JpcHRvcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSW50ZW50IGZkUmVxdWVzdEludGVudCA9IG5ldyBJbnRlbnQoVmVuZG9yVXRpbHMuQUNUSU9OX0ZJTEVfREVTQ1JJUFRPUl9SRVFVRVNUKTsKKyAgICAgICAgcG9wdWxhdGVJbnRlbnRXaXRoQ29tbW9uRmllbGRzKGZkUmVxdWVzdEludGVudCk7CisgICAgICAgIGZkUmVxdWVzdEludGVudC5wdXRFeHRyYShWZW5kb3JVdGlscy5FWFRSQV9GRF9DT1VOVCwgNSk7CisKKyAgICAgICAgQnVuZGxlIHJlc3VsdCA9IHNlbmRCcm9hZGNhc3RBbmRWYWxpZGF0ZShmZFJlcXVlc3RJbnRlbnQsIE1ibXNEb3dubG9hZFJlY2VpdmVyLlJFU1VMVF9PSyk7CisgICAgICAgIExpc3Q8VXJpUGF0aFBhaXI+IGZyZWVVcmlzID0gcmVzdWx0LmdldFBhcmNlbGFibGVBcnJheUxpc3QoVmVuZG9yVXRpbHMuRVhUUkFfRlJFRV9VUklfTElTVCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoZnJlZVVyaXMpOworICAgICAgICBhc3NlcnRFcXVhbHMoNSwgZnJlZVVyaXMuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChVcmlQYXRoUGFpciBwYXRoUGFpciA6IGZyZWVVcmlzKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoQ29udGVudFJlc29sdmVyLlNDSEVNRV9DT05URU5ULCBwYXRoUGFpci5nZXRDb250ZW50VXJpKCkuZ2V0U2NoZW1lKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKENvbnRlbnRSZXNvbHZlci5TQ0hFTUVfRklMRSwgcGF0aFBhaXIuZ2V0RmlsZVBhdGhVcmkoKS5nZXRTY2hlbWUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWVzdFJlZnJlc2hlZEZpbGVEZXNjcmlwdG9ycygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBTZXQgdXAgYSBmZXcgdGVtcCBmaWxlcyB0aGF0IHdlIGNhbiByZXF1ZXN0IGFnYWluCisgICAgICAgIEludGVudCBmZFJlcXVlc3RJbnRlbnQgPSBuZXcgSW50ZW50KFZlbmRvclV0aWxzLkFDVElPTl9GSUxFX0RFU0NSSVBUT1JfUkVRVUVTVCk7CisgICAgICAgIHBvcHVsYXRlSW50ZW50V2l0aENvbW1vbkZpZWxkcyhmZFJlcXVlc3RJbnRlbnQpOworICAgICAgICBmZFJlcXVlc3RJbnRlbnQucHV0RXh0cmEoVmVuZG9yVXRpbHMuRVhUUkFfRkRfQ09VTlQsIDIpOworCisgICAgICAgIEJ1bmRsZSByZXN1bHQgPSBzZW5kQnJvYWRjYXN0QW5kVmFsaWRhdGUoZmRSZXF1ZXN0SW50ZW50LCBNYm1zRG93bmxvYWRSZWNlaXZlci5SRVNVTFRfT0spOworICAgICAgICBMaXN0PFVyaVBhdGhQYWlyPiBmcmVlVXJpcyA9IHJlc3VsdC5nZXRQYXJjZWxhYmxlQXJyYXlMaXN0KFZlbmRvclV0aWxzLkVYVFJBX0ZSRUVfVVJJX0xJU1QpOworCisgICAgICAgIEludGVudCBmZFJlZnJlc2hJbnRlbnQgPSBuZXcgSW50ZW50KFZlbmRvclV0aWxzLkFDVElPTl9GSUxFX0RFU0NSSVBUT1JfUkVRVUVTVCk7CisgICAgICAgIHBvcHVsYXRlSW50ZW50V2l0aENvbW1vbkZpZWxkcyhmZFJlZnJlc2hJbnRlbnQpOworICAgICAgICBmZFJlZnJlc2hJbnRlbnQucHV0UGFyY2VsYWJsZUFycmF5TGlzdEV4dHJhKFZlbmRvclV0aWxzLkVYVFJBX1BBVVNFRF9MSVNULAorICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8PihmcmVlVXJpcy5zdHJlYW0oKS5tYXAoVXJpUGF0aFBhaXI6OmdldEZpbGVQYXRoVXJpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkpKTsKKyAgICAgICAgQnVuZGxlIHJlc3VsdDIgPSBzZW5kQnJvYWRjYXN0QW5kVmFsaWRhdGUoZmRSZWZyZXNoSW50ZW50LCBNYm1zRG93bmxvYWRSZWNlaXZlci5SRVNVTFRfT0spOworICAgICAgICBMaXN0PFVyaVBhdGhQYWlyPiByZWZyZXNoVXJpcyA9CisgICAgICAgICAgICAgICAgcmVzdWx0Mi5nZXRQYXJjZWxhYmxlQXJyYXlMaXN0KFZlbmRvclV0aWxzLkVYVFJBX1BBVVNFRF9VUklfTElTVCk7CisgICAgICAgIGFzc2VydEVxdWFscyhmcmVlVXJpcy5zaXplKCksIHJlZnJlc2hVcmlzLnNpemUoKSk7CisgICAgICAgIGZvciAoVXJpUGF0aFBhaXIgcGF0aFBhaXIgOiByZWZyZXNoVXJpcykgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmcmVlVXJpcy5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAuYW55TWF0Y2goKG9yaWdpbmFsUGFpcikgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbFBhaXIuZ2V0RmlsZVBhdGhVcmkoKS5lcXVhbHMocGF0aFBhaXIuZ2V0RmlsZVBhdGhVcmkoKSkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgQnVuZGxlIHNlbmRCcm9hZGNhc3RBbmRWYWxpZGF0ZShJbnRlbnQgaW50ZW50LCBpbnQgZXhwZWN0ZWRDb2RlKSB7CisgICAgICAgIEJsb2NraW5nUXVldWU8QnVuZGxlPiByZWNlaXZlZEV4dHJhcyA9IG5ldyBMaW5rZWRCbG9ja2luZ1F1ZXVlPD4oKTsKKyAgICAgICAgQmxvY2tpbmdRdWV1ZTxJbnRlZ2VyPiByZWNlaXZlZENvZGUgPSBuZXcgTGlua2VkQmxvY2tpbmdRdWV1ZTw+KCk7CisgICAgICAgIG1Db250ZXh0LnNlbmRPcmRlcmVkQnJvYWRjYXN0KGludGVudCwgQ1RTX0JST0FEQ0FTVF9QRVJNSVNTSU9OLAorICAgICAgICAgICAgICAgIG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVkRXh0cmFzLmFkZChnZXRSZXN1bHRFeHRyYXModHJ1ZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZWRDb2RlLmFkZChnZXRSZXN1bHRDb2RlKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSwgbUhhbmRsZXIsIC0xLCBudWxsLCBudWxsKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgKGludCkgcmVjZWl2ZWRDb2RlLnBvbGwoQVNZTkNfVElNRU9VVCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisgICAgICAgICAgICByZXR1cm4gcmVjZWl2ZWRFeHRyYXMucG9sbChBU1lOQ19USU1FT1VULCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJUZXN0IGludGVycnVwdGVkIik7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBidW5kbGVFcXVhbHMoQnVuZGxlIGEsIEJ1bmRsZSBiKSB7CisgICAgICAgIGlmIChhID09IG51bGwgJiYgYiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZvciAoU3RyaW5nIGFLZXkgOiBhLmtleVNldCgpKSB7CisgICAgICAgICAgICBpZiAoIU9iamVjdHMuZXF1YWxzKGEuZ2V0KGFLZXkpLCBiLmdldChhS2V5KSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKFN0cmluZyBiS2V5IDogYi5rZXlTZXQoKSkgeworICAgICAgICAgICAgaWYgKCFPYmplY3RzLmVxdWFscyhiLmdldChiS2V5KSwgYS5nZXQoYktleSkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlSW50ZW50V2l0aENvbW1vbkZpZWxkcyhJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIGludGVudC5wdXRFeHRyYShWZW5kb3JVdGlscy5FWFRSQV9TRVJWSUNFX0lELCBURVNUX1NFUlZJQ0VfSUQpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoVmVuZG9yVXRpbHMuRVhUUkFfVEVNUF9GSUxFX1JPT1QsIHRlbXBGaWxlUm9vdERpclBhdGgpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGVsZXBob255L3NyYy9hbmRyb2lkL3RlbGVwaG9ueS9lbWJtcy9jdHMvTWJtc0Rvd25sb2FkU2Vzc2lvblRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvZW1ibXMvY3RzL01ibXNEb3dubG9hZFNlc3Npb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM2NTAzMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvZW1ibXMvY3RzL01ibXNEb3dubG9hZFNlc3Npb25UZXN0LmphdmEKQEAgLTAsMCArMSwyMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC50ZWxlcGhvbnkuZW1ibXMuY3RzOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5NYm1zRG93bmxvYWRTZXNzaW9uOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LmN0cy5lbWJtc3Rlc3RhcHAuQ3RzRG93bmxvYWRTZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255Lm1ibXMuRG93bmxvYWRSZXF1ZXN0OworaW1wb3J0IGFuZHJvaWQudGVsZXBob255Lm1ibXMuRmlsZVNlcnZpY2VJbmZvOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255Lm1ibXMuTWJtc0Vycm9yczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIE1ibXNEb3dubG9hZFNlc3Npb25UZXN0IGV4dGVuZHMgTWJtc0Rvd25sb2FkVGVzdEJhc2UgeworICAgIHB1YmxpYyB2b2lkIHRlc3REdXBsaWNhdGVTZXNzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNYm1zRG93bmxvYWRTZXNzaW9uIGZhaWx1cmUgPSBNYm1zRG93bmxvYWRTZXNzaW9uLmNyZWF0ZSgKKyAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQsIG1DYWxsYmFja0V4ZWN1dG9yLCBtQ2FsbGJhY2spOworICAgICAgICAgICAgZmFpbCgiRHVwbGljYXRlIGNyZWF0ZSBzaG91bGQndmUgdGhyb3duIGFuIGV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gU3VjY2VlZAorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlcXVlc3RVcGRhdGVEb3dubG9hZFNlcnZpY2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIExpc3Q8U3RyaW5nPiB0ZXN0Q2xhc3NlcyA9IEFycmF5cy5hc0xpc3QoImNsYXNzMSIsICJjbGFzczIiKTsKKyAgICAgICAgbURvd25sb2FkU2Vzc2lvbi5yZXF1ZXN0VXBkYXRlRmlsZVNlcnZpY2VzKHRlc3RDbGFzc2VzKTsKKworICAgICAgICAvLyBNYWtlIHN1cmUgd2UgZ290IHRoZSBzdHJlYW1pbmcgc2VydmljZXMKKyAgICAgICAgTGlzdDxGaWxlU2VydmljZUluZm8+IHNlcnZpY2VJbmZvcyA9CisgICAgICAgICAgICAgICAgKExpc3Q8RmlsZVNlcnZpY2VJbmZvPikgbUNhbGxiYWNrLndhaXRPbkZpbGVTZXJ2aWNlc1VwZGF0ZWQoKS5hcmcxOworICAgICAgICBhc3NlcnRFcXVhbHMoQ3RzRG93bmxvYWRTZXJ2aWNlLkZJTEVfU0VSVklDRV9JTkZPLCBzZXJ2aWNlSW5mb3MuZ2V0KDApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1DYWxsYmFjay5nZXROdW1FcnJvckNhbGxzKCkpOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgbWlkZGxld2FyZSBnb3QgdGhlIGNhbGwgd2l0aCB0aGUgcmlnaHQgYXJncworICAgICAgICBMaXN0PEJ1bmRsZT4gcmVxdWVzdERvd25sb2FkU2VydmljZXNDYWxscyA9CisgICAgICAgICAgICAgICAgZ2V0TWlkZGxld2FyZUNhbGxzKEN0c0Rvd25sb2FkU2VydmljZS5NRVRIT0RfUkVRVUVTVF9VUERBVEVfRklMRV9TRVJWSUNFUyk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCByZXF1ZXN0RG93bmxvYWRTZXJ2aWNlc0NhbGxzLnNpemUoKSk7CisgICAgICAgIExpc3Q8U3RyaW5nPiBtaWRkbGV3YXJlUmVjZWl2ZWRTZXJ2aWNlQ2xhc3NlcyA9CisgICAgICAgICAgICAgICAgIHJlcXVlc3REb3dubG9hZFNlcnZpY2VzQ2FsbHMuZ2V0KDApCisgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFN0cmluZ0FycmF5TGlzdChDdHNEb3dubG9hZFNlcnZpY2UuQVJHVU1FTlRfU0VSVklDRV9DTEFTU0VTKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3RDbGFzc2VzLnNpemUoKSwgbWlkZGxld2FyZVJlY2VpdmVkU2VydmljZUNsYXNzZXMuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0Q2xhc3Nlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3RDbGFzc2VzLmdldChpKSwgbWlkZGxld2FyZVJlY2VpdmVkU2VydmljZUNsYXNzZXMuZ2V0KGkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9zZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtRG93bmxvYWRTZXNzaW9uLmNsb3NlKCk7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGNhbid0IHVzZSBpdCBhbnltb3JlCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtRG93bmxvYWRTZXNzaW9uLnJlcXVlc3RVcGRhdGVGaWxlU2VydmljZXMoQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpOworICAgICAgICAgICAgZmFpbCgiRG93bmxvYWQgc2Vzc2lvbiBzaG91bGQgbm90IGJlIHVzYWJsZSBhZnRlciBjbG9zZSIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gU3VjY2VlZAorICAgICAgICB9CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIG1pZGRsZXdhcmUgZ290IHRoZSBjYWxsIHRvIGNsb3NlCisgICAgICAgIExpc3Q8QnVuZGxlPiBjbG9zZUNhbGxzID0gZ2V0TWlkZGxld2FyZUNhbGxzKEN0c0Rvd25sb2FkU2VydmljZS5NRVRIT0RfQ0xPU0UpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY2xvc2VDYWxscy5zaXplKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRUZW1wRmlsZURpcmVjdG9yeSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgdGVtcEZpbGVEaXJOYW1lID0gIkNUU1Rlc3REaXIiOworICAgICAgICBGaWxlIHRlbXBGaWxlUm9vdERpcmVjdG9yeSA9IG5ldyBGaWxlKG1Db250ZXh0LmdldEZpbGVzRGlyKCksIHRlbXBGaWxlRGlyTmFtZSk7CisgICAgICAgIHRlbXBGaWxlUm9vdERpcmVjdG9yeS5ta2RpcnMoKTsKKworICAgICAgICBtRG93bmxvYWRTZXNzaW9uLnNldFRlbXBGaWxlUm9vdERpcmVjdG9yeSh0ZW1wRmlsZVJvb3REaXJlY3RvcnkpOworICAgICAgICBMaXN0PEJ1bmRsZT4gc2V0VGVtcFJvb3RDYWxscyA9CisgICAgICAgICAgICAgICAgZ2V0TWlkZGxld2FyZUNhbGxzKEN0c0Rvd25sb2FkU2VydmljZS5NRVRIT0RfU0VUX1RFTVBfRklMRV9ST09UKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNldFRlbXBSb290Q2FsbHMuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRlbXBGaWxlUm9vdERpcmVjdG9yeS5nZXRDYW5vbmljYWxQYXRoKCksCisgICAgICAgICAgICAgICAgc2V0VGVtcFJvb3RDYWxscy5nZXQoMCkuZ2V0U3RyaW5nKEN0c0Rvd25sb2FkU2VydmljZS5BUkdVTUVOVF9ST09UX0RJUkVDVE9SWV9QQVRIKSk7CisgICAgICAgIHRlbXBGaWxlUm9vdERpcmVjdG9yeS5kZWxldGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0SW52YWxpZFRlbXBGaWxlUm9vdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBGaWxlIHRlbXBGaWxlUm9vdERpcmVjdG9yeSA9IG5ldyBGaWxlKG1Db250ZXh0LmdldEZpbGVzRGlyKCksICJOTk4tRG9lc05vdEV4aXN0Iik7CisgICAgICAgIHRlbXBGaWxlUm9vdERpcmVjdG9yeS5kZWxldGUoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbURvd25sb2FkU2Vzc2lvbi5zZXRUZW1wRmlsZVJvb3REaXJlY3RvcnkodGVtcEZpbGVSb290RGlyZWN0b3J5KTsKKyAgICAgICAgICAgIGZhaWwoIlNob3VsZCBub3QgYmUgYWJsZSB0byBzZXQgdGVtcCBmaWxlIHJvb3QgdG8gbm9uLWV4aXN0ZW50IGRpcmVjdG9yeSIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gc3VjY2VzcworICAgICAgICB9CisKKyAgICAgICAgdGVtcEZpbGVSb290RGlyZWN0b3J5ID0gbmV3IEZpbGUobUNvbnRleHQuZ2V0RmlsZXNEaXIoKSwgInRoaXMtaXMtYS1maWxlLmRhdCIpOworICAgICAgICB0ZW1wRmlsZVJvb3REaXJlY3RvcnkuY3JlYXRlTmV3RmlsZSgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtRG93bmxvYWRTZXNzaW9uLnNldFRlbXBGaWxlUm9vdERpcmVjdG9yeSh0ZW1wRmlsZVJvb3REaXJlY3RvcnkpOworICAgICAgICAgICAgZmFpbCgiU2hvdWxkIG5vdCBiZSBhYmxlIHRvIHNldCB0ZW1wIGZpbGUgcm9vdCB0byBhIGZpbGUiKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIHN1Y2Nlc3MKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtRG93bmxvYWRTZXNzaW9uLnNldFRlbXBGaWxlUm9vdERpcmVjdG9yeShtQ29udGV4dC5nZXRGaWxlc0RpcigpKTsKKyAgICAgICAgICAgIGZhaWwoIlNob3VsZCBub3QgYmUgYWJsZSB0byBzZXQgdGVtcCBmaWxlIHJvb3QgdG8gdGhlIGZpbGVzIGRpciIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gc3VjY2VzcworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1Eb3dubG9hZFNlc3Npb24uc2V0VGVtcEZpbGVSb290RGlyZWN0b3J5KG1Db250ZXh0LmdldENhY2hlRGlyKCkpOworICAgICAgICAgICAgZmFpbCgiU2hvdWxkIG5vdCBiZSBhYmxlIHRvIHNldCB0ZW1wIGZpbGUgcm9vdCB0byB0aGUgY2FjaGUgZGlyIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBzdWNjZXNzCisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbURvd25sb2FkU2Vzc2lvbi5zZXRUZW1wRmlsZVJvb3REaXJlY3RvcnkobUNvbnRleHQuZ2V0RGF0YURpcigpKTsKKyAgICAgICAgICAgIGZhaWwoIlNob3VsZCBub3QgYmUgYWJsZSB0byBzZXQgdGVtcCBmaWxlIHJvb3QgdG8gdGhlIGRhdGEgZGlyIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBzdWNjZXNzCisgICAgICAgIH0KKworICAgICAgICB0ZW1wRmlsZVJvb3REaXJlY3RvcnkuZGVsZXRlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlc2V0RG93bmxvYWRLbm93bGVkZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRG93bmxvYWRSZXF1ZXN0IHJlcXVlc3QgPSBkb3dubG9hZFJlcXVlc3RUZW1wbGF0ZS5idWlsZCgpOworICAgICAgICBtRG93bmxvYWRTZXNzaW9uLnJlc2V0RG93bmxvYWRLbm93bGVkZ2UocmVxdWVzdCk7CisKKyAgICAgICAgTGlzdDxCdW5kbGU+IHJlc2V0RG93bmxvYWRLbm93bGVkZ2VDYWxscyA9CisgICAgICAgICAgICAgICAgZ2V0TWlkZGxld2FyZUNhbGxzKEN0c0Rvd25sb2FkU2VydmljZS5NRVRIT0RfUkVTRVRfRE9XTkxPQURfS05PV0xFREdFKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlc2V0RG93bmxvYWRLbm93bGVkZ2VDYWxscy5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMocmVxdWVzdCwgcmVzZXREb3dubG9hZEtub3dsZWRnZUNhbGxzLmdldCgwKS5nZXRQYXJjZWxhYmxlKAorICAgICAgICAgICAgICAgIEN0c0Rvd25sb2FkU2VydmljZS5BUkdVTUVOVF9ET1dOTE9BRF9SRVFVRVNUKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldERvd25sb2FkU3RhdHVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIERvd25sb2FkUmVxdWVzdCByZXF1ZXN0ID0gZG93bmxvYWRSZXF1ZXN0VGVtcGxhdGUuYnVpbGQoKTsKKyAgICAgICAgbURvd25sb2FkU2Vzc2lvbi5yZXF1ZXN0RG93bmxvYWRTdGF0ZShyZXF1ZXN0LCBDdHNEb3dubG9hZFNlcnZpY2UuRklMRV9JTkZPXzEpOworCisgICAgICAgIExpc3Q8QnVuZGxlPiBnZXREb3dubG9hZFN0YXR1c0NhbGxzID0KKyAgICAgICAgICAgICAgICBnZXRNaWRkbGV3YXJlQ2FsbHMoQ3RzRG93bmxvYWRTZXJ2aWNlLk1FVEhPRF9HRVRfRE9XTkxPQURfU1RBVFVTKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGdldERvd25sb2FkU3RhdHVzQ2FsbHMuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlcXVlc3QsIGdldERvd25sb2FkU3RhdHVzQ2FsbHMuZ2V0KDApLmdldFBhcmNlbGFibGUoCisgICAgICAgICAgICAgICAgQ3RzRG93bmxvYWRTZXJ2aWNlLkFSR1VNRU5UX0RPV05MT0FEX1JFUVVFU1QpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEN0c0Rvd25sb2FkU2VydmljZS5GSUxFX0lORk9fMSwgZ2V0RG93bmxvYWRTdGF0dXNDYWxscy5nZXQoMCkuZ2V0UGFyY2VsYWJsZSgKKyAgICAgICAgICAgICAgICBDdHNEb3dubG9hZFNlcnZpY2UuQVJHVU1FTlRfRklMRV9JTkZPKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENhbmNlbERvd25sb2FkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIERvd25sb2FkUmVxdWVzdCByZXF1ZXN0ID0gZG93bmxvYWRSZXF1ZXN0VGVtcGxhdGUuYnVpbGQoKTsKKyAgICAgICAgbURvd25sb2FkU2Vzc2lvbi5jYW5jZWxEb3dubG9hZChyZXF1ZXN0KTsKKworICAgICAgICBMaXN0PEJ1bmRsZT4gY2FuY2VsRG93bmxvYWRDYWxscyA9CisgICAgICAgICAgICAgICAgZ2V0TWlkZGxld2FyZUNhbGxzKEN0c0Rvd25sb2FkU2VydmljZS5NRVRIT0RfQ0FOQ0VMX0RPV05MT0FEKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGNhbmNlbERvd25sb2FkQ2FsbHMuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlcXVlc3QsIGNhbmNlbERvd25sb2FkQ2FsbHMuZ2V0KDApLmdldFBhcmNlbGFibGUoCisgICAgICAgICAgICAgICAgQ3RzRG93bmxvYWRTZXJ2aWNlLkFSR1VNRU5UX0RPV05MT0FEX1JFUVVFU1QpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGlzdFBlbmRpbmdEb3dubG9hZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSB0ZW1wRmlsZVJvb3REaXIgPSBuZXcgRmlsZShtQ29udGV4dC5nZXRGaWxlc0RpcigpLCAiQ3RzVGVzdERpciIpOworICAgICAgICB0ZW1wRmlsZVJvb3REaXIubWtkaXIoKTsKKyAgICAgICAgbURvd25sb2FkU2Vzc2lvbi5zZXRUZW1wRmlsZVJvb3REaXJlY3RvcnkodGVtcEZpbGVSb290RGlyKTsKKworICAgICAgICBEb3dubG9hZFJlcXVlc3QgcmVxdWVzdCA9IGRvd25sb2FkUmVxdWVzdFRlbXBsYXRlLnNldEFwcEludGVudChuZXcgSW50ZW50KCkpLmJ1aWxkKCk7CisgICAgICAgIG1Eb3dubG9hZFNlc3Npb24uZG93bmxvYWQocmVxdWVzdCk7CisKKyAgICAgICAgTGlzdDxEb3dubG9hZFJlcXVlc3Q+IGRvd25sb2FkcyA9IG1Eb3dubG9hZFNlc3Npb24ubGlzdFBlbmRpbmdEb3dubG9hZHMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGRvd25sb2Fkcy5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMocmVxdWVzdCwgZG93bmxvYWRzLmdldCgwKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNldFRlbXBGaWxlRGlyRmFpbHVyZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgdGVtcEZpbGVEaXJOYW1lID0gIkNUU1Rlc3REaXIxMDEwMTAiOworICAgICAgICBGaWxlIHRlbXBGaWxlUm9vdERpcmVjdG9yeSA9IG5ldyBGaWxlKG1Db250ZXh0LmdldEZpbGVzRGlyKCksIHRlbXBGaWxlRGlyTmFtZSk7CisgICAgICAgIHRlbXBGaWxlUm9vdERpcmVjdG9yeS5ta2RpcnMoKTsKKworICAgICAgICBtTWlkZGxld2FyZUNvbnRyb2wuZm9yY2VFcnJvckNvZGUoCisgICAgICAgICAgICAgICAgTWJtc0Vycm9ycy5Eb3dubG9hZEVycm9ycy5FUlJPUl9DQU5OT1RfQ0hBTkdFX1RFTVBfRklMRV9ST09UKTsKKyAgICAgICAgbURvd25sb2FkU2Vzc2lvbi5zZXRUZW1wRmlsZVJvb3REaXJlY3RvcnkodGVtcEZpbGVSb290RGlyZWN0b3J5KTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtQ2FsbGJhY2sud2FpdE9uRXJyb3IoKSk7CisgICAgICAgIGFzc2VydE5vdFNhbWUobURvd25sb2FkU2Vzc2lvbi5nZXRUZW1wRmlsZVJvb3REaXJlY3RvcnkoKSwgdGVtcEZpbGVEaXJOYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG93bmxvYWRSZXF1ZXN0U2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgic2FtcGxlX2ludGVudF9hY3Rpb24iKTsKKyAgICAgICAgRG93bmxvYWRSZXF1ZXN0IHJlcXVlc3QgPSBkb3dubG9hZFJlcXVlc3RUZW1wbGF0ZS5zZXRBcHBJbnRlbnQoaW50ZW50KS5idWlsZCgpOworICAgICAgICBEb3dubG9hZFJlcXVlc3QgbmV3UmVxdWVzdCA9CisgICAgICAgICAgICAgICAgRG93bmxvYWRSZXF1ZXN0LkJ1aWxkZXIuZnJvbVNlcmlhbGl6ZWRSZXF1ZXN0KHJlcXVlc3QudG9CeXRlQXJyYXkoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICBhc3NlcnRFcXVhbHMocmVxdWVzdCwgbmV3UmVxdWVzdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEVycm9yRGVsaXZlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbU1pZGRsZXdhcmVDb250cm9sLmZvcmNlRXJyb3JDb2RlKAorICAgICAgICAgICAgICAgIE1ibXNFcnJvcnMuR2VuZXJhbEVycm9ycy5FUlJPUl9NSURETEVXQVJFX1RFTVBPUkFSSUxZX1VOQVZBSUxBQkxFKTsKKyAgICAgICAgbURvd25sb2FkU2Vzc2lvbi5yZXF1ZXN0VXBkYXRlRmlsZVNlcnZpY2VzKENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1ibXNFcnJvcnMuR2VuZXJhbEVycm9ycy5FUlJPUl9NSURETEVXQVJFX1RFTVBPUkFSSUxZX1VOQVZBSUxBQkxFLAorICAgICAgICAgICAgICAgIG1DYWxsYmFjay53YWl0T25FcnJvcigpLmFyZzEpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvZW1ibXMvY3RzL01ibXNEb3dubG9hZFRlc3RCYXNlLmphdmEgYi90ZXN0cy90ZXN0cy90ZWxlcGhvbnkvc3JjL2FuZHJvaWQvdGVsZXBob255L2VtYm1zL2N0cy9NYm1zRG93bmxvYWRUZXN0QmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMjdjYjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy90ZWxlcGhvbnkvc3JjL2FuZHJvaWQvdGVsZXBob255L2VtYm1zL2N0cy9NYm1zRG93bmxvYWRUZXN0QmFzZS5qYXZhCkBAIC0wLDAgKzEsMTk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQudGVsZXBob255LmVtYm1zLmN0czsKKworaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5TZXJ2aWNlQ29ubmVjdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlclRocmVhZDsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuTWJtc0Rvd25sb2FkU2Vzc2lvbjsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5jdHMuZW1ibXN0ZXN0YXBwLkN0c0Rvd25sb2FkU2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5jdHMuZW1ibXN0ZXN0YXBwLklDdHNEb3dubG9hZE1pZGRsZXdhcmVDb250cm9sOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255Lm1ibXMuRG93bmxvYWRSZXF1ZXN0OworaW1wb3J0IGFuZHJvaWQudGVsZXBob255Lm1ibXMuRmlsZVNlcnZpY2VJbmZvOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255Lm1ibXMuTWJtc0Rvd25sb2FkU2Vzc2lvbkNhbGxiYWNrOworaW1wb3J0IGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0Q2FzZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuU29tZUFyZ3M7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQmxvY2tpbmdRdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5MaW5rZWRCbG9ja2luZ1F1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworcHVibGljIGNsYXNzIE1ibXNEb3dubG9hZFRlc3RCYXNlIGV4dGVuZHMgSW5zdHJ1bWVudGF0aW9uVGVzdENhc2UgeworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEFTWU5DX1RJTUVPVVQgPSAxMDAwMDsKKworICAgIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgVGVzdENhbGxiYWNrIGV4dGVuZHMgTWJtc0Rvd25sb2FkU2Vzc2lvbkNhbGxiYWNrIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCbG9ja2luZ1F1ZXVlPFNvbWVBcmdzPiBtRXJyb3JDYWxscyA9IG5ldyBMaW5rZWRCbG9ja2luZ1F1ZXVlPD4oKTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCbG9ja2luZ1F1ZXVlPFNvbWVBcmdzPiBtRmlsZVNlcnZpY2VzVXBkYXRlZENhbGxzID0KKyAgICAgICAgICAgICAgICBuZXcgTGlua2VkQmxvY2tpbmdRdWV1ZTw+KCk7CisgICAgICAgIHByaXZhdGUgZmluYWwgQmxvY2tpbmdRdWV1ZTxTb21lQXJncz4gbU1pZGRsZXdhcmVSZWFkeUNhbGxzID0gbmV3IExpbmtlZEJsb2NraW5nUXVldWU8PigpOworICAgICAgICBwcml2YXRlIGludCBtTnVtRXJyb3JDYWxscyA9IDA7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoaW50IGVycm9yQ29kZSwgQE51bGxhYmxlIFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgICAgICBtTnVtRXJyb3JDYWxscyArPSAxOworICAgICAgICAgICAgU29tZUFyZ3MgYXJncyA9IFNvbWVBcmdzLm9idGFpbigpOworICAgICAgICAgICAgYXJncy5hcmcxID0gZXJyb3JDb2RlOworICAgICAgICAgICAgYXJncy5hcmcyID0gbWVzc2FnZTsKKyAgICAgICAgICAgIG1FcnJvckNhbGxzLmFkZChhcmdzKTsKKyAgICAgICAgICAgIExvZy5pKE1ibXNEb3dubG9hZFRlc3RCYXNlLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgIkdvdCBlcnJvcjogIiArIGVycm9yQ29kZSArICI6ICIgKyBtZXNzYWdlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkZpbGVTZXJ2aWNlc1VwZGF0ZWQoTGlzdDxGaWxlU2VydmljZUluZm8+IHNlcnZpY2VzKSB7CisgICAgICAgICAgICBTb21lQXJncyBhcmdzID0gU29tZUFyZ3Mub2J0YWluKCk7CisgICAgICAgICAgICBhcmdzLmFyZzEgPSBzZXJ2aWNlczsKKyAgICAgICAgICAgIG1GaWxlU2VydmljZXNVcGRhdGVkQ2FsbHMuYWRkKGFyZ3MpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uTWlkZGxld2FyZVJlYWR5KCkgeworICAgICAgICAgICAgbU1pZGRsZXdhcmVSZWFkeUNhbGxzLmFkZChTb21lQXJncy5vYnRhaW4oKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU29tZUFyZ3Mgd2FpdE9uRXJyb3IoKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBtRXJyb3JDYWxscy5wb2xsKEFTWU5DX1RJTUVPVVQsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiB3YWl0T25NaWRkbGV3YXJlUmVhZHkoKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBtTWlkZGxld2FyZVJlYWR5Q2FsbHMucG9sbChBU1lOQ19USU1FT1VULCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpICE9IG51bGw7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFNvbWVBcmdzIHdhaXRPbkZpbGVTZXJ2aWNlc1VwZGF0ZWQoKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBtRmlsZVNlcnZpY2VzVXBkYXRlZENhbGxzLnBvbGwoQVNZTkNfVElNRU9VVCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0TnVtRXJyb3JDYWxscygpIHsKKyAgICAgICAgICAgIHJldHVybiBtTnVtRXJyb3JDYWxsczsKKyAgICAgICAgfQorICAgIH0KKworICAgIERvd25sb2FkUmVxdWVzdC5CdWlsZGVyIGRvd25sb2FkUmVxdWVzdFRlbXBsYXRlOworICAgIFVyaSBkZXN0aW5hdGlvbkRpcmVjdG9yeVVyaTsKKworICAgIENvbnRleHQgbUNvbnRleHQ7CisgICAgSGFuZGxlclRocmVhZCBtSGFuZGxlclRocmVhZDsKKyAgICBIYW5kbGVyIG1IYW5kbGVyOworICAgIEV4ZWN1dG9yIG1DYWxsYmFja0V4ZWN1dG9yOworICAgIElDdHNEb3dubG9hZE1pZGRsZXdhcmVDb250cm9sIG1NaWRkbGV3YXJlQ29udHJvbDsKKyAgICBNYm1zRG93bmxvYWRTZXNzaW9uIG1Eb3dubG9hZFNlc3Npb247CisgICAgVGVzdENhbGxiYWNrIG1DYWxsYmFjayA9IG5ldyBUZXN0Q2FsbGJhY2soKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1Db250ZXh0ID0gZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0Q29udGV4dCgpOworICAgICAgICBtSGFuZGxlclRocmVhZCA9IG5ldyBIYW5kbGVyVGhyZWFkKCJFbWJtc0N0c1Rlc3RXb3JrZXIiKTsKKyAgICAgICAgbUhhbmRsZXJUaHJlYWQuc3RhcnQoKTsKKyAgICAgICAgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcihtSGFuZGxlclRocmVhZC5nZXRMb29wZXIoKSk7CisgICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yID0gbUhhbmRsZXI6OnBvc3Q7CisgICAgICAgIG1DYWxsYmFjayA9IG5ldyBUZXN0Q2FsbGJhY2soKTsKKworICAgICAgICBGaWxlIGRlc3RpbmF0aW9uRGlyZWN0b3J5ID0gbmV3IEZpbGUobUNvbnRleHQuZ2V0RmlsZXNEaXIoKSwgImRvd25sb2FkcyIpOworICAgICAgICBkZXN0aW5hdGlvbkRpcmVjdG9yeS5ta2RpcnMoKTsKKyAgICAgICAgZGVzdGluYXRpb25EaXJlY3RvcnlVcmkgPSBVcmkuZnJvbUZpbGUoZGVzdGluYXRpb25EaXJlY3RvcnkpOworICAgICAgICBkb3dubG9hZFJlcXVlc3RUZW1wbGF0ZSA9IG5ldyBEb3dubG9hZFJlcXVlc3QuQnVpbGRlcigKKyAgICAgICAgICAgICAgICBDdHNEb3dubG9hZFNlcnZpY2UuU09VUkNFX1VSSV8xLCBkZXN0aW5hdGlvbkRpcmVjdG9yeVVyaSkKKyAgICAgICAgICAgICAgICAuc2V0U2VydmljZUluZm8oQ3RzRG93bmxvYWRTZXJ2aWNlLkZJTEVfU0VSVklDRV9JTkZPKTsKKyAgICAgICAgZ2V0Q29udHJvbEJpbmRlcigpOworICAgICAgICBzZXR1cERvd25sb2FkU2Vzc2lvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1IYW5kbGVyVGhyZWFkLnF1aXQoKTsKKyAgICAgICAgbURvd25sb2FkU2Vzc2lvbi5jbG9zZSgpOworICAgICAgICBtTWlkZGxld2FyZUNvbnRyb2wucmVzZXQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0dXBEb3dubG9hZFNlc3Npb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbURvd25sb2FkU2Vzc2lvbiA9IE1ibXNEb3dubG9hZFNlc3Npb24uY3JlYXRlKAorICAgICAgICAgICAgICAgIG1Db250ZXh0LCBtQ2FsbGJhY2tFeGVjdXRvciwgbUNhbGxiYWNrKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtRG93bmxvYWRTZXNzaW9uKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtQ2FsbGJhY2sud2FpdE9uTWlkZGxld2FyZVJlYWR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbUNhbGxiYWNrLmdldE51bUVycm9yQ2FsbHMoKSk7CisgICAgICAgIEJ1bmRsZSBpbml0aWFsaXplQ2FsbCA9ICBtTWlkZGxld2FyZUNvbnRyb2wuZ2V0RG93bmxvYWRTZXNzaW9uQ2FsbHMoKS5nZXQoMCk7CisgICAgICAgIGFzc2VydEVxdWFscyhDdHNEb3dubG9hZFNlcnZpY2UuTUVUSE9EX0lOSVRJQUxJWkUsCisgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZUNhbGwuZ2V0U3RyaW5nKEN0c0Rvd25sb2FkU2VydmljZS5NRVRIT0RfTkFNRSkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBnZXRDb250cm9sQmluZGVyKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgSW50ZW50IGJpbmRJbnRlbnQgPSBuZXcgSW50ZW50KEN0c0Rvd25sb2FkU2VydmljZS5DT05UUk9MX0lOVEVSRkFDRV9BQ1RJT04pOworICAgICAgICBiaW5kSW50ZW50LnNldENvbXBvbmVudChDdHNEb3dubG9hZFNlcnZpY2UuQ09OVFJPTF9JTlRFUkZBQ0VfQ09NUE9ORU5UKTsKKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggYmluZExhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworCisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9IG1Db250ZXh0LmJpbmRTZXJ2aWNlKGJpbmRJbnRlbnQsIG5ldyBTZXJ2aWNlQ29ubmVjdGlvbigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKENvbXBvbmVudE5hbWUgbmFtZSwgSUJpbmRlciBzZXJ2aWNlKSB7CisgICAgICAgICAgICAgICAgbU1pZGRsZXdhcmVDb250cm9sID0gSUN0c0Rvd25sb2FkTWlkZGxld2FyZUNvbnRyb2wuU3R1Yi5hc0ludGVyZmFjZShzZXJ2aWNlKTsKKyAgICAgICAgICAgICAgICBiaW5kTGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlRGlzY29ubmVjdGVkKENvbXBvbmVudE5hbWUgbmFtZSkgeworICAgICAgICAgICAgICAgIG1NaWRkbGV3YXJlQ29udHJvbCA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0sIENvbnRleHQuQklORF9BVVRPX0NSRUFURSk7CisgICAgICAgIGlmICghc3VjY2VzcykgeworICAgICAgICAgICAgZmFpbCgiRmFpbGVkIHRvIGdldCBjb250cm9sIGludGVyZmFjZSAtLSBiaW5kIGVycm9yIik7CisgICAgICAgIH0KKyAgICAgICAgYmluZExhdGNoLmF3YWl0KEFTWU5DX1RJTUVPVVQsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIExpc3Q8QnVuZGxlPiBnZXRNaWRkbGV3YXJlQ2FsbHMoU3RyaW5nIG1ldGhvZE5hbWUpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICByZXR1cm4gKG1NaWRkbGV3YXJlQ29udHJvbC5nZXREb3dubG9hZFNlc3Npb25DYWxscygpKS5zdHJlYW0oKQorICAgICAgICAgICAgICAgIC5maWx0ZXIoKGVsZW0pIC0+IGVsZW0uZ2V0U3RyaW5nKEN0c0Rvd25sb2FkU2VydmljZS5NRVRIT0RfTkFNRSkuZXF1YWxzKG1ldGhvZE5hbWUpKQorICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCByZWN1cnNpdmVEZWxldGUoRmlsZSBmKSB7CisgICAgICAgIGlmIChmLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgIGZvciAoRmlsZSBmMSA6IGYubGlzdEZpbGVzKCkpIHsKKyAgICAgICAgICAgICAgICByZWN1cnNpdmVEZWxldGUoZjEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGYuZGVsZXRlKCk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvZW1ibXMvY3RzL01ibXNTdHJlYW1pbmdTZXJ2aWNlVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdGVsZXBob255L3NyYy9hbmRyb2lkL3RlbGVwaG9ueS9lbWJtcy9jdHMvTWJtc1N0cmVhbWluZ1NlcnZpY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM1YTZlNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvZW1ibXMvY3RzL01ibXNTdHJlYW1pbmdTZXJ2aWNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQudGVsZXBob255LmVtYm1zLmN0czsKKworaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5jdHMuZW1ibXN0ZXN0YXBwLkN0c1N0cmVhbWluZ1NlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkubWJtcy5NYm1zRXJyb3JzOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255Lm1ibXMuU3RyZWFtaW5nU2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5tYm1zLlN0cmVhbWluZ1NlcnZpY2VDYWxsYmFjazsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLm9zLlNvbWVBcmdzOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQmxvY2tpbmdRdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5MaW5rZWRCbG9ja2luZ1F1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCitwdWJsaWMgY2xhc3MgTWJtc1N0cmVhbWluZ1NlcnZpY2VUZXN0IGV4dGVuZHMgTWJtc1N0cmVhbWluZ1Rlc3RCYXNlIHsKKyAgICBwcml2YXRlIGNsYXNzIFRlc3RTdHJlYW1pbmdTZXJ2aWNlQ2FsbGJhY2sgZXh0ZW5kcyBTdHJlYW1pbmdTZXJ2aWNlQ2FsbGJhY2sgeworICAgICAgICBwcml2YXRlIGZpbmFsIEJsb2NraW5nUXVldWU8U29tZUFyZ3M+IG1FcnJvckNhbGxzID0gbmV3IExpbmtlZEJsb2NraW5nUXVldWU8PigpOworICAgICAgICBwcml2YXRlIGZpbmFsIEJsb2NraW5nUXVldWU8U29tZUFyZ3M+IG1TdHJlYW1TdGF0ZVVwZGF0ZWRDYWxscyA9CisgICAgICAgICAgICAgICAgbmV3IExpbmtlZEJsb2NraW5nUXVldWU8PigpOworICAgICAgICBwcml2YXRlIGZpbmFsIEJsb2NraW5nUXVldWU8U29tZUFyZ3M+IG1NZWRpYURlc2NyaXB0aW9uVXBkYXRlZENhbGxzID0KKyAgICAgICAgICAgICAgICBuZXcgTGlua2VkQmxvY2tpbmdRdWV1ZTw+KCk7CisgICAgICAgIHByaXZhdGUgZmluYWwgQmxvY2tpbmdRdWV1ZTxTb21lQXJncz4gbUJyb2FkY2FzdFNpZ25hbFN0cmVuZ3RoVXBkYXRlZENhbGxzID0KKyAgICAgICAgICAgICAgICBuZXcgTGlua2VkQmxvY2tpbmdRdWV1ZTw+KCk7CisgICAgICAgIHByaXZhdGUgZmluYWwgQmxvY2tpbmdRdWV1ZTxTb21lQXJncz4gbVN0cmVhbU1ldGhvZFVwZGF0ZWRDYWxscyA9CisgICAgICAgICAgICAgICAgbmV3IExpbmtlZEJsb2NraW5nUXVldWU8PigpOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKGludCBlcnJvckNvZGUsIEBOdWxsYWJsZSBTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICAgICAgU29tZUFyZ3MgYXJncyA9IFNvbWVBcmdzLm9idGFpbigpOworICAgICAgICAgICAgYXJncy5hcmcxID0gZXJyb3JDb2RlOworICAgICAgICAgICAgYXJncy5hcmcyID0gbWVzc2FnZTsKKyAgICAgICAgICAgIG1FcnJvckNhbGxzLmFkZChhcmdzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblN0cmVhbVN0YXRlVXBkYXRlZChAU3RyZWFtaW5nU2VydmljZS5TdHJlYW1pbmdTdGF0ZSBpbnQgc3RhdGUsCisgICAgICAgICAgICAgICAgQFN0cmVhbWluZ1NlcnZpY2UuU3RyZWFtaW5nU3RhdGVDaGFuZ2VSZWFzb24gaW50IHJlYXNvbikgeworICAgICAgICAgICAgU29tZUFyZ3MgYXJncyA9IFNvbWVBcmdzLm9idGFpbigpOworICAgICAgICAgICAgYXJncy5hcmcxID0gc3RhdGU7CisgICAgICAgICAgICBhcmdzLmFyZzIgPSByZWFzb247CisgICAgICAgICAgICBtU3RyZWFtU3RhdGVVcGRhdGVkQ2FsbHMuYWRkKGFyZ3MpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uTWVkaWFEZXNjcmlwdGlvblVwZGF0ZWQoKSB7CisgICAgICAgICAgICBTb21lQXJncyBhcmdzID0gU29tZUFyZ3Mub2J0YWluKCk7CisgICAgICAgICAgICBtTWVkaWFEZXNjcmlwdGlvblVwZGF0ZWRDYWxscy5hZGQoYXJncyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25Ccm9hZGNhc3RTaWduYWxTdHJlbmd0aFVwZGF0ZWQoaW50IHNpZ25hbFN0cmVuZ3RoKSB7CisgICAgICAgICAgICBTb21lQXJncyBhcmdzID0gU29tZUFyZ3Mub2J0YWluKCk7CisgICAgICAgICAgICBhcmdzLmFyZzEgPSBzaWduYWxTdHJlbmd0aDsKKyAgICAgICAgICAgIG1Ccm9hZGNhc3RTaWduYWxTdHJlbmd0aFVwZGF0ZWRDYWxscy5hZGQoYXJncyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TdHJlYW1NZXRob2RVcGRhdGVkKGludCBtZXRob2RUeXBlKSB7CisgICAgICAgICAgICBTb21lQXJncyBhcmdzID0gU29tZUFyZ3Mub2J0YWluKCk7CisgICAgICAgICAgICBhcmdzLmFyZzEgPSBtZXRob2RUeXBlOworICAgICAgICAgICAgbVN0cmVhbU1ldGhvZFVwZGF0ZWRDYWxscy5hZGQoYXJncyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU29tZUFyZ3Mgd2FpdE9uRXJyb3IoKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBtRXJyb3JDYWxscy5wb2xsKEFTWU5DX1RJTUVPVVQsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU29tZUFyZ3Mgd2FpdE9uU3RyZWFtU3RhdGVVcGRhdGVkKCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVN0cmVhbVN0YXRlVXBkYXRlZENhbGxzLnBvbGwoQVNZTkNfVElNRU9VVCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTb21lQXJncyB3YWl0T25NZWRpYURlc2NyaXB0aW9uVXBkYXRlZCgpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1NZWRpYURlc2NyaXB0aW9uVXBkYXRlZENhbGxzLnBvbGwoQVNZTkNfVElNRU9VVCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTb21lQXJncyB3YWl0T25Ccm9hZGNhc3RTaWduYWxTdHJlbmd0aFVwZGF0ZWQoKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBtQnJvYWRjYXN0U2lnbmFsU3RyZW5ndGhVcGRhdGVkQ2FsbHMucG9sbCgKKyAgICAgICAgICAgICAgICAgICAgICAgIEFTWU5DX1RJTUVPVVQsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU29tZUFyZ3Mgd2FpdE9uU3RyZWFtTWV0aG9kVXBkYXRlZCgpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TdHJlYW1NZXRob2RVcGRhdGVkQ2FsbHMucG9sbChBU1lOQ19USU1FT1VULCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKyAgICBwcml2YXRlIFRlc3RTdHJlYW1pbmdTZXJ2aWNlQ2FsbGJhY2sgbVN0cmVhbWluZ1NlcnZpY2VDYWxsYmFjayA9CisgICAgICAgICAgICBuZXcgVGVzdFN0cmVhbWluZ1NlcnZpY2VDYWxsYmFjaygpOworCisgICAgcHVibGljIHZvaWQgdGVzdFN0YXJ0U3RyZWFtaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmVhbWluZ1NlcnZpY2Ugc3RyZWFtaW5nU2VydmljZSA9IG1TdHJlYW1pbmdTZXNzaW9uLnN0YXJ0U3RyZWFtaW5nKAorICAgICAgICAgICAgICAgIEN0c1N0cmVhbWluZ1NlcnZpY2UgLlNUUkVBTUlOR19TRVJWSUNFX0lORk8sCisgICAgICAgICAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IsIG1TdHJlYW1pbmdTZXJ2aWNlQ2FsbGJhY2spOworICAgICAgICBhc3NlcnROb3ROdWxsKHN0cmVhbWluZ1NlcnZpY2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoQ3RzU3RyZWFtaW5nU2VydmljZS5TVFJFQU1JTkdfU0VSVklDRV9JTkZPLCBzdHJlYW1pbmdTZXJ2aWNlLmdldEluZm8oKSk7CisKKyAgICAgICAgU29tZUFyZ3MgYXJncyA9IG1TdHJlYW1pbmdTZXJ2aWNlQ2FsbGJhY2sud2FpdE9uU3RyZWFtU3RhdGVVcGRhdGVkKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhTdHJlYW1pbmdTZXJ2aWNlLlNUQVRFX1NUQVJURUQsIGFyZ3MuYXJnMSk7CisgICAgICAgIGFzc2VydEVxdWFscyhTdHJlYW1pbmdTZXJ2aWNlLlJFQVNPTl9CWV9VU0VSX1JFUVVFU1QsIGFyZ3MuYXJnMik7CisKKyAgICAgICAgTGlzdDxMaXN0PE9iamVjdD4+IHN0YXJ0U3RyZWFtaW5nQ2FsbHMgPQorICAgICAgICAgICAgICAgIGdldE1pZGRsZXdhcmVDYWxscyhDdHNTdHJlYW1pbmdTZXJ2aWNlLk1FVEhPRF9TVEFSVF9TVFJFQU1JTkcpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc3RhcnRTdHJlYW1pbmdDYWxscy5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoQ3RzU3RyZWFtaW5nU2VydmljZS5TVFJFQU1JTkdfU0VSVklDRV9JTkZPLmdldFNlcnZpY2VJZCgpLAorICAgICAgICAgICAgICAgIHN0YXJ0U3RyZWFtaW5nQ2FsbHMuZ2V0KDApLmdldCgyKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldFBsYXliYWNrVXJpKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmVhbWluZ1NlcnZpY2Ugc3RyZWFtaW5nU2VydmljZSA9IG1TdHJlYW1pbmdTZXNzaW9uLnN0YXJ0U3RyZWFtaW5nKAorICAgICAgICAgICAgICAgIEN0c1N0cmVhbWluZ1NlcnZpY2UgLlNUUkVBTUlOR19TRVJWSUNFX0lORk8sCisgICAgICAgICAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IsIG1TdHJlYW1pbmdTZXJ2aWNlQ2FsbGJhY2spOworICAgICAgICBhc3NlcnRFcXVhbHMoQ3RzU3RyZWFtaW5nU2VydmljZS5TVFJFQU1JTkdfVVJJLCBzdHJlYW1pbmdTZXJ2aWNlLmdldFBsYXliYWNrVXJpKCkpOworCisgICAgICAgIExpc3Q8TGlzdDxPYmplY3Q+PiBnZXRQbGF5YmFja1VyaUNhbGxzID0KKyAgICAgICAgICAgICAgICBnZXRNaWRkbGV3YXJlQ2FsbHMoQ3RzU3RyZWFtaW5nU2VydmljZS5NRVRIT0RfR0VUX1BMQVlCQUNLX1VSSSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBnZXRQbGF5YmFja1VyaUNhbGxzLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhDdHNTdHJlYW1pbmdTZXJ2aWNlLlNUUkVBTUlOR19TRVJWSUNFX0lORk8uZ2V0U2VydmljZUlkKCksCisgICAgICAgICAgICAgICAgZ2V0UGxheWJhY2tVcmlDYWxscy5nZXQoMCkuZ2V0KDIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RvcFN0cmVhbWluZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJlYW1pbmdTZXJ2aWNlIHN0cmVhbWluZ1NlcnZpY2UgPSBtU3RyZWFtaW5nU2Vzc2lvbi5zdGFydFN0cmVhbWluZygKKyAgICAgICAgICAgICAgICBDdHNTdHJlYW1pbmdTZXJ2aWNlIC5TVFJFQU1JTkdfU0VSVklDRV9JTkZPLAorICAgICAgICAgICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLCBtU3RyZWFtaW5nU2VydmljZUNhbGxiYWNrKTsKKyAgICAgICAgc3RyZWFtaW5nU2VydmljZS5jbG9zZSgpOworICAgICAgICBMaXN0PExpc3Q8T2JqZWN0Pj4gc3RvcFN0cmVhbWluZ0NhbGxzID0KKyAgICAgICAgICAgICAgICBnZXRNaWRkbGV3YXJlQ2FsbHMoQ3RzU3RyZWFtaW5nU2VydmljZS5NRVRIT0RfU1RPUF9TVFJFQU1JTkcpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc3RvcFN0cmVhbWluZ0NhbGxzLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhDdHNTdHJlYW1pbmdTZXJ2aWNlLlNUUkVBTUlOR19TRVJWSUNFX0lORk8uZ2V0U2VydmljZUlkKCksCisgICAgICAgICAgICAgICAgc3RvcFN0cmVhbWluZ0NhbGxzLmdldCgwKS5nZXQoMikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJlYW1pbmdDYWxsYmFja3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbVN0cmVhbWluZ1Nlc3Npb24uc3RhcnRTdHJlYW1pbmcoCisgICAgICAgICAgICAgICAgQ3RzU3RyZWFtaW5nU2VydmljZSAuU1RSRUFNSU5HX1NFUlZJQ0VfSU5GTywKKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvciwgbVN0cmVhbWluZ1NlcnZpY2VDYWxsYmFjayk7CisKKyAgICAgICAgbU1pZGRsZXdhcmVDb250cm9sLmZpcmVFcnJvck9uU3RyZWFtKAorICAgICAgICAgICAgICAgIE1ibXNFcnJvcnMuU3RyZWFtaW5nRXJyb3JzLkVSUk9SX1VOQUJMRV9UT19TVEFSVF9TRVJWSUNFLCAiIik7CisgICAgICAgIGFzc2VydEVxdWFscyhNYm1zRXJyb3JzLlN0cmVhbWluZ0Vycm9ycy5FUlJPUl9VTkFCTEVfVE9fU1RBUlRfU0VSVklDRSwKKyAgICAgICAgICAgICAgICBtU3RyZWFtaW5nU2VydmljZUNhbGxiYWNrLndhaXRPbkVycm9yKCkuYXJnMSk7CisKKyAgICAgICAgbU1pZGRsZXdhcmVDb250cm9sLmZpcmVPbk1lZGlhRGVzY3JpcHRpb25VcGRhdGVkKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwobVN0cmVhbWluZ1NlcnZpY2VDYWxsYmFjay53YWl0T25NZWRpYURlc2NyaXB0aW9uVXBkYXRlZCgpKTsKKworICAgICAgICBpbnQgYnJvYWRjYXN0U2lnbmFsU3RyZW5ndGggPSAzOworICAgICAgICBtTWlkZGxld2FyZUNvbnRyb2wuZmlyZU9uQnJvYWRjYXN0U2lnbmFsU3RyZW5ndGhVcGRhdGVkKGJyb2FkY2FzdFNpZ25hbFN0cmVuZ3RoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGJyb2FkY2FzdFNpZ25hbFN0cmVuZ3RoLAorICAgICAgICAgICAgICAgIG1TdHJlYW1pbmdTZXJ2aWNlQ2FsbGJhY2sud2FpdE9uQnJvYWRjYXN0U2lnbmFsU3RyZW5ndGhVcGRhdGVkKCkuYXJnMSk7CisKKyAgICAgICAgbU1pZGRsZXdhcmVDb250cm9sLmZpcmVPblN0cmVhbU1ldGhvZFVwZGF0ZWQoU3RyZWFtaW5nU2VydmljZS5CUk9BRENBU1RfTUVUSE9EKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmVhbWluZ1NlcnZpY2UuQlJPQURDQVNUX01FVEhPRCwKKyAgICAgICAgICAgICAgICBtU3RyZWFtaW5nU2VydmljZUNhbGxiYWNrLndhaXRPblN0cmVhbU1ldGhvZFVwZGF0ZWQoKS5hcmcxKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhcnRTdHJlYW1pbmdGYWlsdXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1NaWRkbGV3YXJlQ29udHJvbC5mb3JjZUVycm9yQ29kZSgKKyAgICAgICAgICAgICAgICBNYm1zRXJyb3JzLkdlbmVyYWxFcnJvcnMuRVJST1JfTUlERExFV0FSRV9URU1QT1JBUklMWV9VTkFWQUlMQUJMRSk7CisgICAgICAgIG1TdHJlYW1pbmdTZXNzaW9uLnN0YXJ0U3RyZWFtaW5nKEN0c1N0cmVhbWluZ1NlcnZpY2UuU1RSRUFNSU5HX1NFUlZJQ0VfSU5GTywKKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvciwgbVN0cmVhbWluZ1NlcnZpY2VDYWxsYmFjayk7CisgICAgICAgIGFzc2VydEVxdWFscyhNYm1zRXJyb3JzLkdlbmVyYWxFcnJvcnMuRVJST1JfTUlERExFV0FSRV9URU1QT1JBUklMWV9VTkFWQUlMQUJMRSwKKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2sud2FpdE9uRXJyb3IoKS5hcmcxKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZWxlcGhvbnkvc3JjL2FuZHJvaWQvdGVsZXBob255L2VtYm1zL2N0cy9NYm1zU3RyZWFtaW5nU2Vzc2lvblRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvZW1ibXMvY3RzL01ibXNTdHJlYW1pbmdTZXNzaW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZWI3MzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy90ZWxlcGhvbnkvc3JjL2FuZHJvaWQvdGVsZXBob255L2VtYm1zL2N0cy9NYm1zU3RyZWFtaW5nU2Vzc2lvblRlc3QuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQudGVsZXBob255LmVtYm1zLmN0czsKKworaW1wb3J0IGFuZHJvaWQudGVsZXBob255Lk1ibXNTdHJlYW1pbmdTZXNzaW9uOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LmN0cy5lbWJtc3Rlc3RhcHAuQ3RzU3RyZWFtaW5nU2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5tYm1zLk1ibXNFcnJvcnM7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkubWJtcy5TdHJlYW1pbmdTZXJ2aWNlSW5mbzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgTWJtc1N0cmVhbWluZ1Nlc3Npb25UZXN0IGV4dGVuZHMgTWJtc1N0cmVhbWluZ1Rlc3RCYXNlIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RHVwbGljYXRlU2Vzc2lvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgTWJtc1N0cmVhbWluZ1Nlc3Npb24gZmFpbHVyZSA9IE1ibXNTdHJlYW1pbmdTZXNzaW9uLmNyZWF0ZSgKKyAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQsIG1DYWxsYmFja0V4ZWN1dG9yLCBtQ2FsbGJhY2spOworICAgICAgICAgICAgZmFpbCgiRHVwbGljYXRlIGNyZWF0ZSBzaG91bGQndmUgdGhyb3duIGFuIGV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gU3VjY2VlZAorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlcXVlc3RVcGRhdGVTdHJlYW1pbmdTZXJ2aWNlcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBMaXN0PFN0cmluZz4gdGVzdENsYXNzZXMgPSBBcnJheXMuYXNMaXN0KCJjbGFzczEiLCAiY2xhc3MyIik7CisgICAgICAgIG1TdHJlYW1pbmdTZXNzaW9uLnJlcXVlc3RVcGRhdGVTdHJlYW1pbmdTZXJ2aWNlcyh0ZXN0Q2xhc3Nlcyk7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGdvdCB0aGUgc3RyZWFtaW5nIHNlcnZpY2VzCisgICAgICAgIExpc3Q8U3RyZWFtaW5nU2VydmljZUluZm8+IHNlcnZpY2VJbmZvcyA9CisgICAgICAgICAgICAgICAgKExpc3Q8U3RyZWFtaW5nU2VydmljZUluZm8+KSBtQ2FsbGJhY2sud2FpdE9uU3RyZWFtaW5nU2VydmljZXNVcGRhdGVkKCkuYXJnMTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEN0c1N0cmVhbWluZ1NlcnZpY2UuU1RSRUFNSU5HX1NFUlZJQ0VfSU5GTywgc2VydmljZUluZm9zLmdldCgwKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtQ2FsbGJhY2suZ2V0TnVtRXJyb3JDYWxscygpKTsKKworICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIG1pZGRsZXdhcmUgZ290IHRoZSBjYWxsIHdpdGggdGhlIHJpZ2h0IGFyZ3MKKyAgICAgICAgTGlzdDxMaXN0PE9iamVjdD4+IHJlcXVlc3RTdHJlYW1pbmdTZXJ2aWNlc0NhbGxzID0KKyAgICAgICAgICAgICAgICBnZXRNaWRkbGV3YXJlQ2FsbHMoQ3RzU3RyZWFtaW5nU2VydmljZS5NRVRIT0RfUkVRVUVTVF9VUERBVEVfU1RSRUFNSU5HX1NFUlZJQ0VTKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlcXVlc3RTdHJlYW1pbmdTZXJ2aWNlc0NhbGxzLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCByZXF1ZXN0U3RyZWFtaW5nU2VydmljZXNDYWxscy5nZXQoMCkuc2l6ZSgpKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IG1pZGRsZXdhcmVSZWNlaXZlZFNlcnZpY2VDbGFzc2VzID0KKyAgICAgICAgICAgICAgICAoTGlzdDxTdHJpbmc+KSByZXF1ZXN0U3RyZWFtaW5nU2VydmljZXNDYWxscy5nZXQoMCkuZ2V0KDIpOworICAgICAgICBhc3NlcnRFcXVhbHModGVzdENsYXNzZXMuc2l6ZSgpLCBtaWRkbGV3YXJlUmVjZWl2ZWRTZXJ2aWNlQ2xhc3Nlcy5zaXplKCkpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRlc3RDbGFzc2VzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModGVzdENsYXNzZXMuZ2V0KGkpLCBtaWRkbGV3YXJlUmVjZWl2ZWRTZXJ2aWNlQ2xhc3Nlcy5nZXQoaSkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENsb3NlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1TdHJlYW1pbmdTZXNzaW9uLmNsb3NlKCk7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGNhbid0IHVzZSBpdCBhbnltb3JlCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtU3RyZWFtaW5nU2Vzc2lvbi5yZXF1ZXN0VXBkYXRlU3RyZWFtaW5nU2VydmljZXMoQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpOworICAgICAgICAgICAgZmFpbCgiU3RyZWFtaW5nIHNlc3Npb24gc2hvdWxkIG5vdCBiZSB1c2FibGUgYWZ0ZXIgY2xvc2UiKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIFN1Y2NlZWQKKyAgICAgICAgfQorCisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBtaWRkbGV3YXJlIGdvdCB0aGUgY2FsbCB0byBjbG9zZQorICAgICAgICBMaXN0PExpc3Q8T2JqZWN0Pj4gY2xvc2VDYWxscyA9IGdldE1pZGRsZXdhcmVDYWxscyhDdHNTdHJlYW1pbmdTZXJ2aWNlLk1FVEhPRF9DTE9TRSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBjbG9zZUNhbGxzLnNpemUoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEVycm9yRGVsaXZlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbU1pZGRsZXdhcmVDb250cm9sLmZvcmNlRXJyb3JDb2RlKAorICAgICAgICAgICAgICAgIE1ibXNFcnJvcnMuR2VuZXJhbEVycm9ycy5FUlJPUl9NSURETEVXQVJFX1RFTVBPUkFSSUxZX1VOQVZBSUxBQkxFKTsKKyAgICAgICAgbVN0cmVhbWluZ1Nlc3Npb24ucmVxdWVzdFVwZGF0ZVN0cmVhbWluZ1NlcnZpY2VzKENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1ibXNFcnJvcnMuR2VuZXJhbEVycm9ycy5FUlJPUl9NSURETEVXQVJFX1RFTVBPUkFSSUxZX1VOQVZBSUxBQkxFLAorICAgICAgICAgICAgICAgIG1DYWxsYmFjay53YWl0T25FcnJvcigpLmFyZzEpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvZW1ibXMvY3RzL01ibXNTdHJlYW1pbmdUZXN0QmFzZS5qYXZhIGIvdGVzdHMvdGVzdHMvdGVsZXBob255L3NyYy9hbmRyb2lkL3RlbGVwaG9ueS9lbWJtcy9jdHMvTWJtc1N0cmVhbWluZ1Rlc3RCYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRiYjI3YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvZW1ibXMvY3RzL01ibXNTdHJlYW1pbmdUZXN0QmFzZS5qYXZhCkBAIC0wLDAgKzEsMTUyIEBACitwYWNrYWdlIGFuZHJvaWQudGVsZXBob255LmVtYm1zLmN0czsKKworaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5TZXJ2aWNlQ29ubmVjdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5NYm1zU3RyZWFtaW5nU2Vzc2lvbjsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5jdHMuZW1ibXN0ZXN0YXBwLkN0c1N0cmVhbWluZ1NlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuY3RzLmVtYm1zdGVzdGFwcC5JQ3RzU3RyZWFtaW5nTWlkZGxld2FyZUNvbnRyb2w7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkubWJtcy5NYm1zU3RyZWFtaW5nU2Vzc2lvbkNhbGxiYWNrOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255Lm1ibXMuU3RyZWFtaW5nU2VydmljZUluZm87CitpbXBvcnQgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RDYXNlOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuU29tZUFyZ3M7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5CbG9ja2luZ1F1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkxpbmtlZEJsb2NraW5nUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitwdWJsaWMgY2xhc3MgTWJtc1N0cmVhbWluZ1Rlc3RCYXNlIGV4dGVuZHMgSW5zdHJ1bWVudGF0aW9uVGVzdENhc2UgeworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEFTWU5DX1RJTUVPVVQgPSAxMDAwMDsKKworICAgIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgVGVzdENhbGxiYWNrIGV4dGVuZHMgTWJtc1N0cmVhbWluZ1Nlc3Npb25DYWxsYmFjayB7CisgICAgICAgIHByaXZhdGUgZmluYWwgQmxvY2tpbmdRdWV1ZTxTb21lQXJncz4gbUVycm9yQ2FsbHMgPSBuZXcgTGlua2VkQmxvY2tpbmdRdWV1ZTw+KCk7CisgICAgICAgIHByaXZhdGUgZmluYWwgQmxvY2tpbmdRdWV1ZTxTb21lQXJncz4gbVN0cmVhbWluZ1NlcnZpY2VzVXBkYXRlZENhbGxzID0KKyAgICAgICAgICAgICAgICBuZXcgTGlua2VkQmxvY2tpbmdRdWV1ZTw+KCk7CisgICAgICAgIHByaXZhdGUgZmluYWwgQmxvY2tpbmdRdWV1ZTxTb21lQXJncz4gbU1pZGRsZXdhcmVSZWFkeUNhbGxzID0gbmV3IExpbmtlZEJsb2NraW5nUXVldWU8PigpOworICAgICAgICBwcml2YXRlIGludCBtTnVtRXJyb3JDYWxscyA9IDA7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoaW50IGVycm9yQ29kZSwgQE51bGxhYmxlIFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgICAgICBtTnVtRXJyb3JDYWxscyArPSAxOworICAgICAgICAgICAgU29tZUFyZ3MgYXJncyA9IFNvbWVBcmdzLm9idGFpbigpOworICAgICAgICAgICAgYXJncy5hcmcxID0gZXJyb3JDb2RlOworICAgICAgICAgICAgYXJncy5hcmcyID0gbWVzc2FnZTsKKyAgICAgICAgICAgIG1FcnJvckNhbGxzLmFkZChhcmdzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblN0cmVhbWluZ1NlcnZpY2VzVXBkYXRlZChMaXN0PFN0cmVhbWluZ1NlcnZpY2VJbmZvPiBzZXJ2aWNlcykgeworICAgICAgICAgICAgU29tZUFyZ3MgYXJncyA9IFNvbWVBcmdzLm9idGFpbigpOworICAgICAgICAgICAgYXJncy5hcmcxID0gc2VydmljZXM7CisgICAgICAgICAgICBtU3RyZWFtaW5nU2VydmljZXNVcGRhdGVkQ2FsbHMuYWRkKGFyZ3MpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uTWlkZGxld2FyZVJlYWR5KCkgeworICAgICAgICAgICAgbU1pZGRsZXdhcmVSZWFkeUNhbGxzLmFkZChTb21lQXJncy5vYnRhaW4oKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU29tZUFyZ3Mgd2FpdE9uRXJyb3IoKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBtRXJyb3JDYWxscy5wb2xsKEFTWU5DX1RJTUVPVVQsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU29tZUFyZ3Mgd2FpdE9uU3RyZWFtaW5nU2VydmljZXNVcGRhdGVkKCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVN0cmVhbWluZ1NlcnZpY2VzVXBkYXRlZENhbGxzLnBvbGwoQVNZTkNfVElNRU9VVCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIHdhaXRPbk1pZGRsZXdhcmVSZWFkeSgpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1NaWRkbGV3YXJlUmVhZHlDYWxscy5wb2xsKEFTWU5DX1RJTUVPVVQsIFRpbWVVbml0Lk1JTExJU0VDT05EUykgIT0gbnVsbDsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldE51bUVycm9yQ2FsbHMoKSB7CisgICAgICAgICAgICByZXR1cm4gbU51bUVycm9yQ2FsbHM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBDb250ZXh0IG1Db250ZXh0OworICAgIEhhbmRsZXJUaHJlYWQgbUhhbmRsZXJUaHJlYWQ7CisgICAgRXhlY3V0b3IgbUNhbGxiYWNrRXhlY3V0b3I7CisgICAgSUN0c1N0cmVhbWluZ01pZGRsZXdhcmVDb250cm9sIG1NaWRkbGV3YXJlQ29udHJvbDsKKyAgICBNYm1zU3RyZWFtaW5nU2Vzc2lvbiBtU3RyZWFtaW5nU2Vzc2lvbjsKKyAgICBUZXN0Q2FsbGJhY2sgbUNhbGxiYWNrID0gbmV3IFRlc3RDYWxsYmFjaygpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbUNvbnRleHQgPSBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRDb250ZXh0KCk7CisgICAgICAgIG1IYW5kbGVyVGhyZWFkID0gbmV3IEhhbmRsZXJUaHJlYWQoIkVtYm1zQ3RzVGVzdFdvcmtlciIpOworICAgICAgICBtSGFuZGxlclRocmVhZC5zdGFydCgpOworICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvciA9IChuZXcgSGFuZGxlcihtSGFuZGxlclRocmVhZC5nZXRMb29wZXIoKSkpOjpwb3N0OworICAgICAgICBtQ2FsbGJhY2sgPSBuZXcgVGVzdENhbGxiYWNrKCk7CisgICAgICAgIGdldENvbnRyb2xCaW5kZXIoKTsKKyAgICAgICAgc2V0dXBTdHJlYW1pbmdTZXNzaW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbUhhbmRsZXJUaHJlYWQucXVpdCgpOworICAgICAgICBtU3RyZWFtaW5nU2Vzc2lvbi5jbG9zZSgpOworICAgICAgICBtTWlkZGxld2FyZUNvbnRyb2wucmVzZXQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0dXBTdHJlYW1pbmdTZXNzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1TdHJlYW1pbmdTZXNzaW9uID0gTWJtc1N0cmVhbWluZ1Nlc3Npb24uY3JlYXRlKAorICAgICAgICAgICAgICAgIG1Db250ZXh0LCBtQ2FsbGJhY2tFeGVjdXRvciwgbUNhbGxiYWNrKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtU3RyZWFtaW5nU2Vzc2lvbik7CisgICAgICAgIGFzc2VydFRydWUobUNhbGxiYWNrLndhaXRPbk1pZGRsZXdhcmVSZWFkeSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1DYWxsYmFjay5nZXROdW1FcnJvckNhbGxzKCkpOworICAgICAgICBMaXN0IGluaXRpYWxpemVDYWxsID0gKExpc3QpIG1NaWRkbGV3YXJlQ29udHJvbC5nZXRTdHJlYW1pbmdTZXNzaW9uQ2FsbHMoKS5nZXQoMCk7CisgICAgICAgIGFzc2VydEVxdWFscyhDdHNTdHJlYW1pbmdTZXJ2aWNlLk1FVEhPRF9JTklUSUFMSVpFLCBpbml0aWFsaXplQ2FsbC5nZXQoMCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBnZXRDb250cm9sQmluZGVyKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgSW50ZW50IGJpbmRJbnRlbnQgPSBuZXcgSW50ZW50KEN0c1N0cmVhbWluZ1NlcnZpY2UuQ09OVFJPTF9JTlRFUkZBQ0VfQUNUSU9OKTsKKyAgICAgICAgYmluZEludGVudC5zZXRDb21wb25lbnQoQ3RzU3RyZWFtaW5nU2VydmljZS5DT05UUk9MX0lOVEVSRkFDRV9DT01QT05FTlQpOworICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBiaW5kTGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisKKyAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gbUNvbnRleHQuYmluZFNlcnZpY2UoYmluZEludGVudCwgbmV3IFNlcnZpY2VDb25uZWN0aW9uKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VDb25uZWN0ZWQoQ29tcG9uZW50TmFtZSBuYW1lLCBJQmluZGVyIHNlcnZpY2UpIHsKKyAgICAgICAgICAgICAgICBtTWlkZGxld2FyZUNvbnRyb2wgPSBJQ3RzU3RyZWFtaW5nTWlkZGxld2FyZUNvbnRyb2wuU3R1Yi5hc0ludGVyZmFjZShzZXJ2aWNlKTsKKyAgICAgICAgICAgICAgICBiaW5kTGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlRGlzY29ubmVjdGVkKENvbXBvbmVudE5hbWUgbmFtZSkgeworICAgICAgICAgICAgICAgIG1NaWRkbGV3YXJlQ29udHJvbCA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0sIENvbnRleHQuQklORF9BVVRPX0NSRUFURSk7CisgICAgICAgIGlmICghc3VjY2VzcykgeworICAgICAgICAgICAgZmFpbCgiRmFpbGVkIHRvIGdldCBjb250cm9sIGludGVyZmFjZSAtLSBiaW5kIGVycm9yIik7CisgICAgICAgIH0KKyAgICAgICAgYmluZExhdGNoLmF3YWl0KEFTWU5DX1RJTUVPVVQsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIExpc3Q8TGlzdDxPYmplY3Q+PiBnZXRNaWRkbGV3YXJlQ2FsbHMoU3RyaW5nIG1ldGhvZE5hbWUpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICByZXR1cm4gKChMaXN0PExpc3Q8T2JqZWN0Pj4pIG1NaWRkbGV3YXJlQ29udHJvbC5nZXRTdHJlYW1pbmdTZXNzaW9uQ2FsbHMoKSkuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAuZmlsdGVyKChlbGVtKSAtPiBlbGVtLmdldCgwKS5lcXVhbHMobWV0aG9kTmFtZSkpCisgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvZW1ibXMvY3RzL1NlcnZpY2VJbmZvVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdGVsZXBob255L3NyYy9hbmRyb2lkL3RlbGVwaG9ueS9lbWJtcy9jdHMvU2VydmljZUluZm9UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM0ZDk2ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvZW1ibXMvY3RzL1NlcnZpY2VJbmZvVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC50ZWxlcGhvbnkuZW1ibXMuY3RzOworCitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkubWJtcy5TdHJlYW1pbmdTZXJ2aWNlSW5mbzsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworcHVibGljIGNsYXNzIFNlcnZpY2VJbmZvVGVzdCBleHRlbmRzIEluc3RydW1lbnRhdGlvblRlc3RDYXNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAiU3RyZWFtaW5nU2VydmljZUlkIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8TG9jYWxlLCBTdHJpbmc+IExPQ0FMRV9ESUNUID0gbmV3IEhhc2hNYXA8TG9jYWxlLCBTdHJpbmc+KCkge3sKKyAgICAgICAgcHV0KExvY2FsZS5VUywgIkVudGVydGFpbm1lbnQgU291cmNlIDEiKTsKKyAgICAgICAgcHV0KExvY2FsZS5DQU5BREEsICJFbnRlcnRhaW5tZW50IFNvdXJjZSAxLCBlaD8iKTsKKyAgICB9fTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0PExvY2FsZT4gTE9DQUxFUyA9IG5ldyBBcnJheUxpc3Q8TG9jYWxlPigpIHt7CisgICAgICAgIGFkZChMb2NhbGUuQ0FOQURBKTsKKyAgICAgICAgYWRkKExvY2FsZS5VUyk7CisgICAgfX07CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAiY2xhc3MxIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBEYXRlIEJFR0lOX0RBVEUgPSBuZXcgRGF0ZSgyMDE3LCA4LCAyMSwgMTgsIDIwLCAyOSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGF0ZSBFTkRfREFURSA9IG5ldyBEYXRlKDIwMTcsIDgsIDIxLCAxOCwgMjMsIDkpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmVhbWluZ1NlcnZpY2VJbmZvIFNUUkVBTUlOR19TRVJWSUNFX0lORk8gPQorICAgICAgICBuZXcgU3RyZWFtaW5nU2VydmljZUluZm8oTE9DQUxFX0RJQ1QsIE5BTUUsIExPQ0FMRVMsIElELCBCRUdJTl9EQVRFLCBFTkRfREFURSk7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGF0YUFjY2VzcygpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKExPQ0FMRVMuc2l6ZSgpLCBTVFJFQU1JTkdfU0VSVklDRV9JTkZPLmdldExvY2FsZXMoKS5zaXplKCkpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IExPQ0FMRVMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoU1RSRUFNSU5HX1NFUlZJQ0VfSU5GTy5nZXRMb2NhbGVzKCkuY29udGFpbnMoTE9DQUxFUy5nZXQoaSkpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoTE9DQUxFUy5jb250YWlucyhTVFJFQU1JTkdfU0VSVklDRV9JTkZPLmdldExvY2FsZXMoKS5nZXQoaSkpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoTE9DQUxFX0RJQ1Quc2l6ZSgpLCBTVFJFQU1JTkdfU0VSVklDRV9JTkZPLmdldE5hbWVkQ29udGVudExvY2FsZXMoKS5zaXplKCkpOworICAgICAgICBmb3IgKExvY2FsZSBsIDogU1RSRUFNSU5HX1NFUlZJQ0VfSU5GTy5nZXROYW1lZENvbnRlbnRMb2NhbGVzKCkpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoTE9DQUxFX0RJQ1QuY29udGFpbnNLZXkobCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKExPQ0FMRV9ESUNULmdldChsKSwgU1RSRUFNSU5HX1NFUlZJQ0VfSU5GTy5nZXROYW1lRm9yTG9jYWxlKGwpLnRvU3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEJFR0lOX0RBVEUsIFNUUkVBTUlOR19TRVJWSUNFX0lORk8uZ2V0U2Vzc2lvblN0YXJ0VGltZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEVORF9EQVRFLCBTVFJFQU1JTkdfU0VSVklDRV9JTkZPLmdldFNlc3Npb25FbmRUaW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTkFNRSwgU1RSRUFNSU5HX1NFUlZJQ0VfSU5GTy5nZXRTZXJ2aWNlQ2xhc3NOYW1lKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvZW1ibXMvY3RzL1NvbWVBcmdzLmphdmEgYi90ZXN0cy90ZXN0cy90ZWxlcGhvbnkvc3JjL2FuZHJvaWQvdGVsZXBob255L2VtYm1zL2N0cy9Tb21lQXJncy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNzY1YmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy90ZWxlcGhvbnkvc3JjL2FuZHJvaWQvdGVsZXBob255L2VtYm1zL2N0cy9Tb21lQXJncy5qYXZhCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQudGVsZXBob255LmVtYm1zLmN0czsKKworLyoqCisgKiBDb3BpZWQgZnJvbSBjb20uYW5kcm9pZC5pbnRlcm5hbC5vcyB0byBhdm9pZCBsaW5raW5nIGVycm9ycy4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFNvbWVBcmdzIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfUE9PTF9TSVpFID0gMTA7CisKKyAgICBwcml2YXRlIHN0YXRpYyBTb21lQXJncyBzUG9vbDsKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgc1Bvb2xTaXplOworICAgIHByaXZhdGUgc3RhdGljIE9iamVjdCBzUG9vbExvY2sgPSBuZXcgT2JqZWN0KCk7CisKKyAgICBwcml2YXRlIFNvbWVBcmdzIG1OZXh0OworCisgICAgcHJpdmF0ZSBib29sZWFuIG1JblBvb2w7CisKKyAgICBzdGF0aWMgZmluYWwgaW50IFdBSVRfTk9ORSA9IDA7CisgICAgc3RhdGljIGZpbmFsIGludCBXQUlUX1dBSVRJTkcgPSAxOworICAgIHN0YXRpYyBmaW5hbCBpbnQgV0FJVF9GSU5JU0hFRCA9IDI7CisgICAgaW50IG1XYWl0U3RhdGUgPSBXQUlUX05PTkU7CisKKyAgICBwdWJsaWMgT2JqZWN0IGFyZzE7CisgICAgcHVibGljIE9iamVjdCBhcmcyOworICAgIHB1YmxpYyBPYmplY3QgYXJnMzsKKyAgICBwdWJsaWMgT2JqZWN0IGFyZzQ7CisgICAgcHVibGljIE9iamVjdCBhcmc1OworICAgIHB1YmxpYyBPYmplY3QgYXJnNjsKKyAgICBwdWJsaWMgT2JqZWN0IGFyZzc7CisgICAgcHVibGljIE9iamVjdCBhcmc4OworICAgIHB1YmxpYyBPYmplY3QgYXJnOTsKKyAgICBwdWJsaWMgaW50IGFyZ2kxOworICAgIHB1YmxpYyBpbnQgYXJnaTI7CisgICAgcHVibGljIGludCBhcmdpMzsKKyAgICBwdWJsaWMgaW50IGFyZ2k0OworICAgIHB1YmxpYyBpbnQgYXJnaTU7CisgICAgcHVibGljIGludCBhcmdpNjsKKworICAgIHByaXZhdGUgU29tZUFyZ3MoKSB7CisgICAgICAgIC8qIGRvIG5vdGhpbmcgLSByZWR1Y2UgdmlzaWJpbGl0eSAqLworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU29tZUFyZ3Mgb2J0YWluKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHNQb29sTG9jaykgeworICAgICAgICAgICAgaWYgKHNQb29sU2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICBTb21lQXJncyBhcmdzID0gc1Bvb2w7CisgICAgICAgICAgICAgICAgc1Bvb2wgPSBzUG9vbC5tTmV4dDsKKyAgICAgICAgICAgICAgICBhcmdzLm1OZXh0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBhcmdzLm1JblBvb2wgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBzUG9vbFNpemUtLTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXJnczsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTb21lQXJncygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY29tcGxldGUoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaWYgKG1XYWl0U3RhdGUgIT0gV0FJVF9XQUlUSU5HKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTm90IHdhaXRpbmciKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1XYWl0U3RhdGUgPSBXQUlUX0ZJTklTSEVEOworICAgICAgICAgICAgbm90aWZ5QWxsKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWN5Y2xlKCkgeworICAgICAgICBpZiAobUluUG9vbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQWxyZWFkeSByZWN5Y2xlZC4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobVdhaXRTdGF0ZSAhPSBXQUlUX05PTkUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzeW5jaHJvbml6ZWQgKHNQb29sTG9jaykgeworICAgICAgICAgICAgY2xlYXIoKTsKKyAgICAgICAgICAgIGlmIChzUG9vbFNpemUgPCBNQVhfUE9PTF9TSVpFKSB7CisgICAgICAgICAgICAgICAgbU5leHQgPSBzUG9vbDsKKyAgICAgICAgICAgICAgICBtSW5Qb29sID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBzUG9vbCA9IHRoaXM7CisgICAgICAgICAgICAgICAgc1Bvb2xTaXplKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIGFyZzEgPSBudWxsOworICAgICAgICBhcmcyID0gbnVsbDsKKyAgICAgICAgYXJnMyA9IG51bGw7CisgICAgICAgIGFyZzQgPSBudWxsOworICAgICAgICBhcmc1ID0gbnVsbDsKKyAgICAgICAgYXJnNiA9IG51bGw7CisgICAgICAgIGFyZzcgPSBudWxsOworICAgICAgICBhcmdpMSA9IDA7CisgICAgICAgIGFyZ2kyID0gMDsKKyAgICAgICAgYXJnaTMgPSAwOworICAgICAgICBhcmdpNCA9IDA7CisgICAgICAgIGFyZ2k1ID0gMDsKKyAgICAgICAgYXJnaTYgPSAwOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvZXVpY2MvY3RzL0Rvd25sb2FkYWJsZVN1YnNjcmlwdGlvblRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvZXVpY2MvY3RzL0Rvd25sb2FkYWJsZVN1YnNjcmlwdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWZhMTA0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvdGVsZXBob255L3NyYy9hbmRyb2lkL3RlbGVwaG9ueS9ldWljYy9jdHMvRG93bmxvYWRhYmxlU3Vic2NyaXB0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudGVsZXBob255LmV1aWNjLmN0czsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5ldWljYy5Eb3dubG9hZGFibGVTdWJzY3JpcHRpb247CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKK0BSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgRG93bmxvYWRhYmxlU3Vic2NyaXB0aW9uVGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSVZBVElPTl9DT0RFID0KKyAgICAgICAgICAgICIxJFNNRFAuR1NNQS5DT00kMDQzODYtQUdZRlQtQTc0WTgtM0Y4MTUkMS4zLjYuMS40LjEuMzE3NDYiOworCisgICAgcHJpdmF0ZSBEb3dubG9hZGFibGVTdWJzY3JpcHRpb24gbURvd25sb2FkYWJsZVN1YnNjcmlwdGlvbjsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtRG93bmxvYWRhYmxlU3Vic2NyaXB0aW9uID0gRG93bmxvYWRhYmxlU3Vic2NyaXB0aW9uLmZvckFjdGl2YXRpb25Db2RlKEFDVElWQVRJT05fQ09ERSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RW5jb2RlZEFjdGl2YXRpb25Db2RlKCkgeworICAgICAgICBhc3NlcnROb3ROdWxsKG1Eb3dubG9hZGFibGVTdWJzY3JpcHRpb24pOworICAgICAgICBhc3NlcnRFcXVhbHMoQUNUSVZBVElPTl9DT0RFLCBtRG93bmxvYWRhYmxlU3Vic2NyaXB0aW9uLmdldEVuY29kZWRBY3RpdmF0aW9uQ29kZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REZXNjcmliZUNvbnRlbnRzKCkgeworICAgICAgICBhc3NlcnROb3ROdWxsKG1Eb3dubG9hZGFibGVTdWJzY3JpcHRpb24pOworICAgICAgICBpbnQgYml0bWFzayA9IG1Eb3dubG9hZGFibGVTdWJzY3JpcHRpb24uZGVzY3JpYmVDb250ZW50cygpOworICAgICAgICBhc3NlcnRUcnVlKGJpdG1hc2sgPT0gMCB8fCBiaXRtYXNrID09IFBhcmNlbGFibGUuQ09OVEVOVFNfRklMRV9ERVNDUklQVE9SKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDb25maXJtYXRpb25Db2RlKCkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gVGhlcmUgaXMgbm8gd2F5IHRvIHNldCBEb3dubG9hZGFibGVTdWJzY3JpcHRpb24jY29uZmlybWF0aW9uQ29kZSBmcm9tIGhlcmUgYmVjYXVzZQorICAgICAgICAvLyBBbmRyb2lkIFAgZG9lc24ndCBhbGxvdyBhY2Nlc3NpbmcgYSBwbGF0Zm9ybSBjbGFzcydzIEBoaWRlIG1ldGhvZHMgb3IgcHJpdmF0ZSBmaWVsZHMKKyAgICAgICAgLy8gdGhyb3VnaCByZWZsZWN0aW9uLi4gc28gbGV0J3MganVzdCB2ZXJpZnkgY29uZmlybWF0aW9uQ29kZSBpcyBudWxsLgorICAgICAgICBhc3NlcnROb3ROdWxsKG1Eb3dubG9hZGFibGVTdWJzY3JpcHRpb24pOworICAgICAgICBhc3NlcnROdWxsKG1Eb3dubG9hZGFibGVTdWJzY3JpcHRpb24uZ2V0Q29uZmlybWF0aW9uQ29kZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXcml0ZVRvUGFyY2VsKCkgeworICAgICAgICBhc3NlcnROb3ROdWxsKG1Eb3dubG9hZGFibGVTdWJzY3JpcHRpb24pOworCisgICAgICAgIC8vIHdyaXRlIG9iamVjdCB0byBwYXJjZWwKKyAgICAgICAgUGFyY2VsIHBhcmNlbCA9IFBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgbURvd25sb2FkYWJsZVN1YnNjcmlwdGlvbi53cml0ZVRvUGFyY2VsKHBhcmNlbCwKKyAgICAgICAgICAgICAgICBtRG93bmxvYWRhYmxlU3Vic2NyaXB0aW9uLmRlc2NyaWJlQ29udGVudHMoKSk7CisKKyAgICAgICAgLy8gZXh0cmFjdCBvYmplY3QgZnJvbSBwYXJjZWwKKyAgICAgICAgcGFyY2VsLnNldERhdGFQb3NpdGlvbigwIC8qIHBvcyAqLyk7CisgICAgICAgIERvd25sb2FkYWJsZVN1YnNjcmlwdGlvbiBkb3dubG9hZGFibGVTdWJzY3JpcHRpb25Gcm9tUGFyY2VsID0KKyAgICAgICAgICAgICAgICBEb3dubG9hZGFibGVTdWJzY3JpcHRpb24uQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKHBhcmNlbCk7CisgICAgICAgIGFzc2VydEVxdWFscyhBQ1RJVkFUSU9OX0NPREUsCisgICAgICAgICAgICAgICAgZG93bmxvYWRhYmxlU3Vic2NyaXB0aW9uRnJvbVBhcmNlbC5nZXRFbmNvZGVkQWN0aXZhdGlvbkNvZGUoKSk7CisKKyAgICAgICAgLy8gVGhlcmUgaXMgbm8gd2F5IHRvIHNldCBEb3dubG9hZGFibGVTdWJzY3JpcHRpb24jY29uZmlybWF0aW9uQ29kZSBmcm9tIGhlcmUgYmVjYXVzZQorICAgICAgICAvLyBBbmRyb2lkIFAgZG9lc24ndCBhbGxvdyBhY2Nlc3NpbmcgYSBwbGF0Zm9ybSBjbGFzcydzIEBoaWRlIG1ldGhvZHMgb3IgcHJpdmF0ZSBmaWVsZHMKKyAgICAgICAgLy8gdGhyb3VnaCByZWZsZWN0aW9uLi4gc28gbGV0J3MganVzdCB2ZXJpZnkgY29uZmlybWF0aW9uQ29kZSBpcyBudWxsLgorICAgICAgICBhc3NlcnROdWxsKGRvd25sb2FkYWJsZVN1YnNjcmlwdGlvbkZyb21QYXJjZWwuZ2V0Q29uZmlybWF0aW9uQ29kZSgpKTsKKworICAgICAgICAvLyBTaW1pbGFybHkgdGhlcmUgaXMgbm8gd2F5IHRvIGdldCBEb3dubG9hZGFibGVTdWJzY3JpcHRpb24jY2Fycmllck5hbWUgb3IKKyAgICAgICAgLy8gRG93bmxvYWRhYmxlU3Vic2NyaXB0aW9uI2FjY2Vzc1J1bGVzIG9uIEFuZHJvaWQgUCBzbyB3ZSBjYW4ndCB2ZXJpZnkgdGhlbSBoZXJlLgorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvZXVpY2MvY3RzL0V1aWNjSW5mb1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvZXVpY2MvY3RzL0V1aWNjSW5mb1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGRmYjRmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvdGVsZXBob255L3NyYy9hbmRyb2lkL3RlbGVwaG9ueS9ldWljYy9jdHMvRXVpY2NJbmZvVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudGVsZXBob255LmV1aWNjLmN0czsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuZXVpY2MuRXVpY2NJbmZvOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworCitAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIEV1aWNjSW5mb1Rlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9TX1ZFUlNJT04gPSAiMS4yMyI7CisKKyAgICBwcml2YXRlIEV1aWNjSW5mbyBtRXVpY2NJbmZvOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1FdWljY0luZm8gPSBuZXcgRXVpY2NJbmZvKE9TX1ZFUlNJT04pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldE9zVmVyc2lvbigpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtRXVpY2NJbmZvKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE9TX1ZFUlNJT04sIG1FdWljY0luZm8uZ2V0T3NWZXJzaW9uKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwobUV1aWNjSW5mbyk7CisgICAgICAgIGludCBiaXRtYXNrID0gbUV1aWNjSW5mby5kZXNjcmliZUNvbnRlbnRzKCk7CisgICAgICAgIGFzc2VydFRydWUoYml0bWFzayA9PSAwIHx8IGJpdG1hc2sgPT0gUGFyY2VsYWJsZS5DT05URU5UU19GSUxFX0RFU0NSSVBUT1IpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdyaXRlVG9QYXJjZWwoKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwobUV1aWNjSW5mbyk7CisKKyAgICAgICAgLy8gd3JpdGUgb2JqZWN0IHRvIHBhcmNlbAorICAgICAgICBQYXJjZWwgcGFyY2VsID0gUGFyY2VsLm9idGFpbigpOworICAgICAgICBtRXVpY2NJbmZvLndyaXRlVG9QYXJjZWwocGFyY2VsLCBtRXVpY2NJbmZvLmRlc2NyaWJlQ29udGVudHMoKSk7CisKKyAgICAgICAgLy8gZXh0cmFjdCBvYmplY3QgZnJvbSBwYXJjZWwKKyAgICAgICAgcGFyY2VsLnNldERhdGFQb3NpdGlvbigwIC8qIHBvcyAqLyk7CisgICAgICAgIEV1aWNjSW5mbyBldWljY0luZm9Gcm9tUGFyY2VsID0gRXVpY2NJbmZvLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChwYXJjZWwpOworICAgICAgICBhc3NlcnRFcXVhbHMoT1NfVkVSU0lPTiwgZXVpY2NJbmZvRnJvbVBhcmNlbC5nZXRPc1ZlcnNpb24oKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGVsZXBob255L3NyYy9hbmRyb2lkL3RlbGVwaG9ueS9ldWljYy9jdHMvRXVpY2NNYW5hZ2VyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdGVsZXBob255L3NyYy9hbmRyb2lkL3RlbGVwaG9ueS9ldWljYy9jdHMvRXVpY2NNYW5hZ2VyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwYjQ3ZjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy90ZWxlcGhvbnkvc3JjL2FuZHJvaWQvdGVsZXBob255L2V1aWNjL2N0cy9FdWljY01hbmFnZXJUZXN0LmphdmEKQEAgLTAsMCArMSwyNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudGVsZXBob255LmV1aWNjLmN0czsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuZXVpY2MuRG93bmxvYWRhYmxlU3Vic2NyaXB0aW9uOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LmV1aWNjLkV1aWNjSW5mbzsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5ldWljYy5FdWljY01hbmFnZXI7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBFdWljY01hbmFnZXJUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVFVRVNUX0NPREUgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDQUxMQkFDS19USU1FT1VUX01JTExJUyA9IDIwMDA7CisgICAgLy8gc3RhcnRpbmcgYWN0aXZpdGllcyBtaWdodCB0YWtlIGV4dHJhIHRpbWUKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUNUSVZJVFlfQ0FMTEJBQ0tfVElNRU9VVF9NSUxMSVMgPSA1MDAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fRE9XTkxPQURfU1VCU0NSSVBUSU9OID0gImN0c19kb3dubG9hZF9zdWJzY3JpcHRpb24iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fREVMRVRFX1NVQlNDUklQVElPTiA9ICJjdHNfZGVsZXRlX3N1YnNjcmlwdGlvbiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TV0lUQ0hfVE9fU1VCU0NSSVBUSU9OID0gImN0c19zd2l0Y2hfdG9fc3Vic2NyaXB0aW9uIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1NUQVJUX1RFU1RfUkVTT0xVVElPTl9BQ1RJVklUWSA9CisgICAgICAgICAgICAiY3RzX3N0YXJ0X3Rlc3RfcmVzb2x1dGlvbl9hY3Rpdml0eSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElWQVRJT05fQ09ERSA9ICIxJExPQ0FMSE9TVCQwNDM4Ni1BR1lGVC1BNzRZOC0zRjgxNSI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBzQ2FsbGJhY2tBY3Rpb25zID0KKyAgICAgICAgICAgIG5ldyBTdHJpbmdbXXsKKyAgICAgICAgICAgICAgICAgICAgQUNUSU9OX0RPV05MT0FEX1NVQlNDUklQVElPTiwKKyAgICAgICAgICAgICAgICAgICAgQUNUSU9OX0RFTEVURV9TVUJTQ1JJUFRJT04sCisgICAgICAgICAgICAgICAgICAgIEFDVElPTl9TV0lUQ0hfVE9fU1VCU0NSSVBUSU9OLAorICAgICAgICAgICAgICAgICAgICBBQ1RJT05fU1RBUlRfVEVTVF9SRVNPTFVUSU9OX0FDVElWSVRZLAorICAgICAgICAgICAgfTsKKworICAgIHByaXZhdGUgRXVpY2NNYW5hZ2VyIG1FdWljY01hbmFnZXI7CisgICAgcHJpdmF0ZSBDYWxsYmFja1JlY2VpdmVyIG1DYWxsYmFja1JlY2VpdmVyOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1FdWljY01hbmFnZXIgPSAoRXVpY2NNYW5hZ2VyKSBnZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkVVSUNDX1NFUlZJQ0UpOworICAgIH0KKworICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChtQ2FsbGJhY2tSZWNlaXZlciAhPSBudWxsKSB7CisgICAgICAgICAgICBnZXRDb250ZXh0KCkudW5yZWdpc3RlclJlY2VpdmVyKG1DYWxsYmFja1JlY2VpdmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEVpZCgpIHsKKyAgICAgICAgLy8gdGVzdCBkaXNhYmxlZCBzdGF0ZSBvbmx5IGZvciBub3cKKyAgICAgICAgaWYgKG1FdWljY01hbmFnZXIuaXNFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNhbGwgZ2V0RWlkKCkKKyAgICAgICAgU3RyaW5nIGVpZCA9IG1FdWljY01hbmFnZXIuZ2V0RWlkKCk7CisKKyAgICAgICAgLy8gdmVyaWZ5IHJlc3VsdCBpcyBudWxsCisgICAgICAgIGFzc2VydE51bGwoZWlkKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REb3dubG9hZFN1YnNjcmlwdGlvbigpIHsKKyAgICAgICAgLy8gdGVzdCBkaXNhYmxlZCBzdGF0ZSBvbmx5IGZvciBub3cKKyAgICAgICAgaWYgKG1FdWljY01hbmFnZXIuaXNFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHNldCB1cCBDb3VudERvd25MYXRjaCBhbmQgcmVjZWl2ZXIKKyAgICAgICAgQ291bnREb3duTGF0Y2ggY291bnREb3duTGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgICAgIG1DYWxsYmFja1JlY2VpdmVyID0gbmV3IENhbGxiYWNrUmVjZWl2ZXIoY291bnREb3duTGF0Y2gpOworICAgICAgICBnZXRDb250ZXh0KCkKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXJSZWNlaXZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja1JlY2VpdmVyLCBuZXcgSW50ZW50RmlsdGVyKEFDVElPTl9ET1dOTE9BRF9TVUJTQ1JJUFRJT04pKTsKKworICAgICAgICAvLyBjYWxsIGRvd25sb2FkU3Vic2NyaXB0aW9uKCkKKyAgICAgICAgRG93bmxvYWRhYmxlU3Vic2NyaXB0aW9uIHN1YnNjcmlwdGlvbiA9IGNyZWF0ZURvd25sb2FkYWJsZVN1YnNjcmlwdGlvbigpOworICAgICAgICBQZW5kaW5nSW50ZW50IGNhbGxiYWNrSW50ZW50ID0gY3JlYXRlQ2FsbGJhY2tJbnRlbnQoQUNUSU9OX0RPV05MT0FEX1NVQlNDUklQVElPTik7CisgICAgICAgIG1FdWljY01hbmFnZXIuZG93bmxvYWRTdWJzY3JpcHRpb24oCisgICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uLCBmYWxzZSAvKiBzd2l0Y2hBZnRlckRvd25sb2FkICovLCBjYWxsYmFja0ludGVudCk7CisKKyAgICAgICAgLy8gd2FpdCBmb3IgY2FsbGJhY2sKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvdW50RG93bkxhdGNoLmF3YWl0KENBTExCQUNLX1RJTUVPVVRfTUlMTElTLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKGUudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB2ZXJpZnkgY29ycmVjdCByZXN1bHQgY29kZSBpcyByZWNlaXZlZAorICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgRXVpY2NNYW5hZ2VyLkVNQkVEREVEX1NVQlNDUklQVElPTl9SRVNVTFRfRVJST1IsIG1DYWxsYmFja1JlY2VpdmVyLmdldFJlc3VsdENvZGUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RXVpY2NJbmZvKCkgeworICAgICAgICAvLyB0ZXN0IGRpc2FibGVkIHN0YXRlIG9ubHkgZm9yIG5vdworICAgICAgICBpZiAobUV1aWNjTWFuYWdlci5pc0VuYWJsZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gY2FsbCBnZXRFdWljY0luZm8oKQorICAgICAgICBFdWljY0luZm8gZXVpY2NJbmZvID0gbUV1aWNjTWFuYWdlci5nZXRFdWljY0luZm8oKTsKKworICAgICAgICAvLyB2ZXJpZnkgcmVzdWx0IGlzIG51bGwKKyAgICAgICAgYXNzZXJ0TnVsbChldWljY0luZm8pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERlbGV0ZVN1YnNjcmlwdGlvbigpIHsKKyAgICAgICAgLy8gdGVzdCBkaXNhYmxlZCBzdGF0ZSBvbmx5IGZvciBub3cKKyAgICAgICAgaWYgKG1FdWljY01hbmFnZXIuaXNFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHNldCB1cCBDb3VudERvd25MYXRjaCBhbmQgcmVjZWl2ZXIKKyAgICAgICAgQ291bnREb3duTGF0Y2ggY291bnREb3duTGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgICAgIG1DYWxsYmFja1JlY2VpdmVyID0gbmV3IENhbGxiYWNrUmVjZWl2ZXIoY291bnREb3duTGF0Y2gpOworICAgICAgICBnZXRDb250ZXh0KCkKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXJSZWNlaXZlcihtQ2FsbGJhY2tSZWNlaXZlciwgbmV3IEludGVudEZpbHRlcihBQ1RJT05fREVMRVRFX1NVQlNDUklQVElPTikpOworCisgICAgICAgIC8vIGNhbGwgZGVsZXRlU3Vic2NyaXB0aW9uKCkKKyAgICAgICAgUGVuZGluZ0ludGVudCBjYWxsYmFja0ludGVudCA9IGNyZWF0ZUNhbGxiYWNrSW50ZW50KEFDVElPTl9ERUxFVEVfU1VCU0NSSVBUSU9OKTsKKyAgICAgICAgbUV1aWNjTWFuYWdlci5kZWxldGVTdWJzY3JpcHRpb24oMywgY2FsbGJhY2tJbnRlbnQpOworCisgICAgICAgIC8vIHdhaXQgZm9yIGNhbGxiYWNrCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb3VudERvd25MYXRjaC5hd2FpdChDQUxMQkFDS19USU1FT1VUX01JTExJUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLnRvU3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdmVyaWZ5IGNvcnJlY3QgcmVzdWx0IGNvZGUgaXMgcmVjZWl2ZWQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgIEV1aWNjTWFuYWdlci5FTUJFRERFRF9TVUJTQ1JJUFRJT05fUkVTVUxUX0VSUk9SLCBtQ2FsbGJhY2tSZWNlaXZlci5nZXRSZXN1bHRDb2RlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN3aXRjaFRvU3Vic2NyaXB0aW9uKCkgeworICAgICAgICAvLyB0ZXN0IGRpc2FibGVkIHN0YXRlIG9ubHkgZm9yIG5vdworICAgICAgICBpZiAobUV1aWNjTWFuYWdlci5pc0VuYWJsZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gc2V0IHVwIENvdW50RG93bkxhdGNoIGFuZCByZWNlaXZlcgorICAgICAgICBDb3VudERvd25MYXRjaCBjb3VudERvd25MYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICAgICAgbUNhbGxiYWNrUmVjZWl2ZXIgPSBuZXcgQ2FsbGJhY2tSZWNlaXZlcihjb3VudERvd25MYXRjaCk7CisgICAgICAgIGdldENvbnRleHQoKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlclJlY2VpdmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrUmVjZWl2ZXIsIG5ldyBJbnRlbnRGaWx0ZXIoQUNUSU9OX1NXSVRDSF9UT19TVUJTQ1JJUFRJT04pKTsKKworICAgICAgICAvLyBjYWxsIGRlbGV0ZVN1YnNjcmlwdGlvbigpCisgICAgICAgIFBlbmRpbmdJbnRlbnQgY2FsbGJhY2tJbnRlbnQgPSBjcmVhdGVDYWxsYmFja0ludGVudChBQ1RJT05fU1dJVENIX1RPX1NVQlNDUklQVElPTik7CisgICAgICAgIG1FdWljY01hbmFnZXIuc3dpdGNoVG9TdWJzY3JpcHRpb24oNCwgY2FsbGJhY2tJbnRlbnQpOworCisgICAgICAgIC8vIHdhaXQgZm9yIGNhbGxiYWNrCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb3VudERvd25MYXRjaC5hd2FpdChDQUxMQkFDS19USU1FT1VUX01JTExJUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLnRvU3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdmVyaWZ5IGNvcnJlY3QgcmVzdWx0IGNvZGUgaXMgcmVjZWl2ZWQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgIEV1aWNjTWFuYWdlci5FTUJFRERFRF9TVUJTQ1JJUFRJT05fUkVTVUxUX0VSUk9SLCBtQ2FsbGJhY2tSZWNlaXZlci5nZXRSZXN1bHRDb2RlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0YXJ0UmVzb2x1dGlvbkFjdGl2aXR5KCkgeworICAgICAgICAvLyBzZXQgdXAgQ291bnREb3duTGF0Y2ggYW5kIHJlY2VpdmVyCisgICAgICAgIENvdW50RG93bkxhdGNoIGNvdW50RG93bkxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworICAgICAgICBtQ2FsbGJhY2tSZWNlaXZlciA9IG5ldyBDYWxsYmFja1JlY2VpdmVyKGNvdW50RG93bkxhdGNoKTsKKyAgICAgICAgZ2V0Q29udGV4dCgpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyUmVjZWl2ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tSZWNlaXZlciwgbmV3IEludGVudEZpbHRlcihBQ1RJT05fU1RBUlRfVEVTVF9SRVNPTFVUSU9OX0FDVElWSVRZKSk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogU3RhcnQgRXVpY2NUZXN0UmVzb2x1dGlvbkFjdGl2aXR5IHRvIHRlc3QgRXVpY2NNYW5hZ2VyI3N0YXJ0UmVzb2x1dGlvbkFjdGl2aXR5KCksIHNpbmNlCisgICAgICAgICAqIGl0IHJlcXVpcmVzIGEgZm9yZWdyb3VuZCBhY3Rpdml0eS4gRXVpY2NUZXN0UmVzb2x1dGlvbkFjdGl2aXR5IHdpbGwgcmVwb3J0IHRoZSB0ZXN0CisgICAgICAgICAqIHJlc3VsdCB0byB0aGUgY2FsbGJhY2sgcmVjZWl2ZXIuCisgICAgICAgICAqLworICAgICAgICBJbnRlbnQgdGVzdFJlc29sdXRpb25BY3Rpdml0eUludGVudCA9CisgICAgICAgICAgICAgICAgbmV3IEludGVudChnZXRDb250ZXh0KCksIEV1aWNjVGVzdFJlc29sdXRpb25BY3Rpdml0eS5jbGFzcyk7CisgICAgICAgIFBlbmRpbmdJbnRlbnQgY2FsbGJhY2tJbnRlbnQgPSBjcmVhdGVDYWxsYmFja0ludGVudChBQ1RJT05fU1RBUlRfVEVTVF9SRVNPTFVUSU9OX0FDVElWSVRZKTsKKyAgICAgICAgdGVzdFJlc29sdXRpb25BY3Rpdml0eUludGVudC5wdXRFeHRyYSgKKyAgICAgICAgICAgICAgICBFdWljY1Rlc3RSZXNvbHV0aW9uQWN0aXZpdHkuRVhUUkFfQUNUSVZJVFlfQ0FMTEJBQ0tfSU5URU5ULCBjYWxsYmFja0ludGVudCk7CisgICAgICAgIHRlc3RSZXNvbHV0aW9uQWN0aXZpdHlJbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOworICAgICAgICBnZXRDb250ZXh0KCkuc3RhcnRBY3Rpdml0eSh0ZXN0UmVzb2x1dGlvbkFjdGl2aXR5SW50ZW50KTsKKworICAgICAgICAvLyB3YWl0IGZvciBjYWxsYmFjaworICAgICAgICB0cnkgeworICAgICAgICAgICAgY291bnREb3duTGF0Y2guYXdhaXQoQUNUSVZJVFlfQ0FMTEJBQ0tfVElNRU9VVF9NSUxMSVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS50b1N0cmluZygpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHZlcmlmeSB0ZXN0IHJlc3VsdCByZXBvcnRlZCBieSBFdWljY1Rlc3RSZXNvbHV0aW9uQWN0aXZpdHkKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgIEV1aWNjVGVzdFJlc29sdXRpb25BY3Rpdml0eS5SRVNVTFRfQ09ERV9URVNUX1BBU1NFRCwKKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2tSZWNlaXZlci5nZXRSZXN1bHRDb2RlKCkpOworICAgIH0KKworICAgIHByaXZhdGUgQ29udGV4dCBnZXRDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0Q29udGV4dCgpOworICAgIH0KKworICAgIHByaXZhdGUgRG93bmxvYWRhYmxlU3Vic2NyaXB0aW9uIGNyZWF0ZURvd25sb2FkYWJsZVN1YnNjcmlwdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIERvd25sb2FkYWJsZVN1YnNjcmlwdGlvbi5mb3JBY3RpdmF0aW9uQ29kZShBQ1RJVkFUSU9OX0NPREUpOworICAgIH0KKworICAgIHByaXZhdGUgUGVuZGluZ0ludGVudCBjcmVhdGVDYWxsYmFja0ludGVudChTdHJpbmcgYWN0aW9uKSB7CisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KGFjdGlvbik7CisgICAgICAgIHJldHVybiBQZW5kaW5nSW50ZW50LmdldEJyb2FkY2FzdCgKKyAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCksIFJFUVVFU1RfQ09ERSwgaW50ZW50LCBQZW5kaW5nSW50ZW50LkZMQUdfVVBEQVRFX0NVUlJFTlQpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENhbGxiYWNrUmVjZWl2ZXIgZXh0ZW5kcyBCcm9hZGNhc3RSZWNlaXZlciB7CisKKyAgICAgICAgcHJpdmF0ZSBDb3VudERvd25MYXRjaCBtQ291bnREb3duTGF0Y2g7CisKKyAgICAgICAgcHVibGljIENhbGxiYWNrUmVjZWl2ZXIoQ291bnREb3duTGF0Y2ggbGF0Y2gpIHsKKyAgICAgICAgICAgIG1Db3VudERvd25MYXRjaCA9IGxhdGNoOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIGNhbGxiYWNrQWN0aW9uIDogc0NhbGxiYWNrQWN0aW9ucykgeworICAgICAgICAgICAgICAgIGlmIChjYWxsYmFja0FjdGlvbi5lcXVhbHMoaW50ZW50LmdldEFjdGlvbigpKSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgcmVzdWx0Q29kZSA9IGdldFJlc3VsdENvZGUoKTsKKyAgICAgICAgICAgICAgICAgICAgbUNvdW50RG93bkxhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZWxlcGhvbnkvc3JjL2FuZHJvaWQvdGVsZXBob255L2V1aWNjL2N0cy9FdWljY1Jlc29sdXRpb25BY3Rpdml0eS5qYXZhIGIvdGVzdHMvdGVzdHMvdGVsZXBob255L3NyYy9hbmRyb2lkL3RlbGVwaG9ueS9ldWljYy9jdHMvRXVpY2NSZXNvbHV0aW9uQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTRjYTJhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvdGVsZXBob255L3NyYy9hbmRyb2lkL3RlbGVwaG9ueS9ldWljYy9jdHMvRXVpY2NSZXNvbHV0aW9uQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnRlbGVwaG9ueS5ldWljYy5jdHM7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LmV1aWNjLkV1aWNjTWFuYWdlcjsKKworLyoqCisgKiBBIGR1bW15IGFjdGl2aXR5IHdoaWNoIHNpbXVsYXRlcyBhIHJlc29sdXRpb24gYWN0aXZpdHkuIFJldHVybnMge0BsaW5rIEFjdGl2aXR5I1JFU1VMVF9PS30gdG8KKyAqIGNhbGxlciBpZiAxKSB7QGxpbmsgQWN0aXZpdHkjb25SZXN1bWUoKX0gaXMgY2FsbGVkIChhcyBwcm9vZiB0aGF0IHRoZSBhY3Rpdml0eSBoYXMgYmVlbgorICogc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQpLCBhbmQgMikgdGhlIGNhbGxiYWNrIGludGVudCBpcyB2ZXJpZmllZC4KKyAqLworcHVibGljIGNsYXNzIEV1aWNjUmVzb2x1dGlvbkFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7CisgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CisKKyAgICAgICAgLy8gdmVyaWZ5IGNhbGxiYWNrIGludGVudAorICAgICAgICAvLyBUT0RPOiB2ZXJpZnkgY2FsbGJhY2sgaW50ZW50J3MgYWN0aW9uIG1hdGNoZXMKKyAgICAgICAgLy8gRXVpY2NUZXN0UmVzb2x1dGlvbkFjdGl2aXR5LkFDVElPTl9TVEFSVF9SRVNPTFVUSU9OX0FDVElWSVRZCisgICAgICAgIFBlbmRpbmdJbnRlbnQgY2FsbGJhY2tJbnRlbnQgPQorICAgICAgICAgICAgICAgIGdldEludGVudCgpCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UGFyY2VsYWJsZUV4dHJhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdWljY01hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRVhUUkFfRU1CRURERURfU1VCU0NSSVBUSU9OX1JFU09MVVRJT05fQ0FMTEJBQ0tfSU5URU5UKTsKKyAgICAgICAgaWYgKGNhbGxiYWNrSW50ZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNldFJlc3VsdChSRVNVTFRfT0spOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2V0UmVzdWx0KFJFU1VMVF9DQU5DRUxFRCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXNvbHV0aW9uIGFjdGl2aXR5IGhhcyBzdWNjZXNzZnVsbHkgc3RhcnRlZCwgcmV0dXJuIHJlc3VsdCAmIGZpbmlzaAorICAgICAgICBmaW5pc2goKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZWxlcGhvbnkvc3JjL2FuZHJvaWQvdGVsZXBob255L2V1aWNjL2N0cy9FdWljY1Rlc3RSZXNvbHV0aW9uQWN0aXZpdHkuamF2YSBiL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueS9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvZXVpY2MvY3RzL0V1aWNjVGVzdFJlc29sdXRpb25BY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNWFiMjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy90ZWxlcGhvbnkvc3JjL2FuZHJvaWQvdGVsZXBob255L2V1aWNjL2N0cy9FdWljY1Rlc3RSZXNvbHV0aW9uQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC50ZWxlcGhvbnkuZXVpY2MuY3RzOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRTZW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuZXVpY2MuRXVpY2NNYW5hZ2VyOworCisvKioKKyAqIEEgZHVtbXkgYWN0aXZpdHkgc3RhcnRlZCBieSB7QGxpbmsgRXVpY2NNYW5hZ2VyVGVzdCN0ZXN0U3RhcnRSZXNvbHV0aW9uQWN0aXZpdHkoKX0gZm9yIHRlc3RpbmcKKyAqIHtAbGluayBhbmRyb2lkLnRlbGVwaG9ueS5ldWljYy5FdWljY01hbmFnZXIjc3RhcnRSZXNvbHV0aW9uQWN0aXZpdHkoQWN0aXZpdHksIGludCwgSW50ZW50LAorICogUGVuZGluZ0ludGVudCl9LiBTZW5kcyB7QGxpbmsgRXVpY2NUZXN0UmVzb2x1dGlvbkFjdGl2aXR5I1JFU1VMVF9DT0RFX1RFU1RfUEFTU0VEfSBpZiB0aGUKKyAqIHJlc29sdXRpb24gYWN0aXZpdHkgaXMgc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQsIHtAbGluaworICogRXVpY2NUZXN0UmVzb2x1dGlvbkFjdGl2aXR5I1JFU1VMVF9DT0RFX1RFU1RfRkFJTEVEfSBvdGhlcndpc2UuCisgKi8KK3B1YmxpYyBjbGFzcyBFdWljY1Rlc3RSZXNvbHV0aW9uQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9BQ1RJVklUWV9DQUxMQkFDS19JTlRFTlQgPSAiZXh0cmFfYWN0aXZpdHlfY2FsbGJhY2tfaW50ZW50IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNVTFRfQ09ERV9URVNUX1BBU1NFRCA9IDEwMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNVTFRfQ09ERV9URVNUX0ZBSUxFRCA9IDEwMjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVFVRVNUX0NPREUgPSAxMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TVEFSVF9SRVNPTFVUSU9OX0FDVElWSVRZID0gImN0c19zdGFydF9yZXNvbHV0aW9uX2FjdGl2aXR5IjsKKworICAgIHByaXZhdGUgUGVuZGluZ0ludGVudCBtQ2FsbGJhY2tJbnRlbnQ7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIG1DYWxsYmFja0ludGVudCA9IGdldEludGVudCgpLmdldFBhcmNlbGFibGVFeHRyYShFWFRSQV9BQ1RJVklUWV9DQUxMQkFDS19JTlRFTlQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgeworICAgICAgICBzdXBlci5vblJlc3VtZSgpOworICAgICAgICB0ZXN0U3RhcnRSZXNvbHV0aW9uQWN0aXZpdHkoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkFjdGl2aXR5UmVzdWx0KGludCByZXF1ZXN0Q29kZSwgaW50IHJlc3VsdENvZGUsIEludGVudCBkYXRhKSB7CisgICAgICAgIHN1cGVyLm9uQWN0aXZpdHlSZXN1bHQocmVxdWVzdENvZGUsIHJlc3VsdENvZGUsIGRhdGEpOworICAgICAgICBpZiAocmVxdWVzdENvZGUgPT0gUkVRVUVTVF9DT0RFKSB7CisgICAgICAgICAgICBzZW5kQ2FsbGJhY2tBbmRGaW5pc2goCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdENvZGUgPT0gUkVTVUxUX09LID8gUkVTVUxUX0NPREVfVEVTVF9QQVNTRUQgOiBSRVNVTFRfQ09ERV9URVNUX0ZBSUxFRCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdFN0YXJ0UmVzb2x1dGlvbkFjdGl2aXR5KCkgeworICAgICAgICBFdWljY01hbmFnZXIgZXVpY2NNYW5hZ2VyID0gKEV1aWNjTWFuYWdlcikgZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkVVSUNDX1NFUlZJQ0UpOworCisgICAgICAgIC8vIHNwZWNpZnkgYWN0aXZpdHkgdG8gc3RhcnQKKyAgICAgICAgSW50ZW50IHJlc29sdXRpb25BY3Rpdml0eUludGVudCA9CisgICAgICAgICAgICAgICAgbmV3IEludGVudChnZXRBcHBsaWNhdGlvbkNvbnRleHQoKSwgRXVpY2NSZXNvbHV0aW9uQWN0aXZpdHkuY2xhc3MpOworICAgICAgICBQZW5kaW5nSW50ZW50IHJlc29sdXRpb25JbnRlbnQgPQorICAgICAgICAgICAgICAgIFBlbmRpbmdJbnRlbnQuZ2V0QWN0aXZpdHkoCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRBcHBsaWNhdGlvbkNvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogcmVxdWVzdENvZGUgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uQWN0aXZpdHlJbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBQZW5kaW5nSW50ZW50LkZMQUdfT05FX1NIT1QpOworCisgICAgICAgIC8vIGFkZCBwZW5kaW5nIGludGVudCB0byBleHRyYQorICAgICAgICBJbnRlbnQgcmVzdWx0SW50ZW50ID0gbmV3IEludGVudCgpOworICAgICAgICByZXN1bHRJbnRlbnQucHV0RXh0cmEoCisgICAgICAgICAgICAgICAgRXVpY2NNYW5hZ2VyLkVYVFJBX0VNQkVEREVEX1NVQlNDUklQVElPTl9SRVNPTFVUSU9OX0lOVEVOVCwgcmVzb2x1dGlvbkludGVudCk7CisKKyAgICAgICAgLy8gY2FsbCBzdGFydFJlc29sdXRpb25BY3Rpdml0eSgpCisgICAgICAgIFBlbmRpbmdJbnRlbnQgY2FsbGJhY2tJbnRlbnQgPSBjcmVhdGVDYWxsYmFja0ludGVudChBQ1RJT05fU1RBUlRfUkVTT0xVVElPTl9BQ1RJVklUWSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBldWljY01hbmFnZXIuc3RhcnRSZXNvbHV0aW9uQWN0aXZpdHkodGhpcywgUkVRVUVTVF9DT0RFLCByZXN1bHRJbnRlbnQsIGNhbGxiYWNrSW50ZW50KTsKKyAgICAgICAgfSBjYXRjaCAoSW50ZW50U2VuZGVyLlNlbmRJbnRlbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgc2VuZENhbGxiYWNrQW5kRmluaXNoKFJFU1VMVF9DT0RFX1RFU1RfRkFJTEVEKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgUGVuZGluZ0ludGVudCBjcmVhdGVDYWxsYmFja0ludGVudChTdHJpbmcgYWN0aW9uKSB7CisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KGFjdGlvbik7CisgICAgICAgIHJldHVybiBQZW5kaW5nSW50ZW50LmdldEJyb2FkY2FzdCgKKyAgICAgICAgICAgICAgICBnZXRBcHBsaWNhdGlvbkNvbnRleHQoKSwgUkVRVUVTVF9DT0RFLCBpbnRlbnQsIFBlbmRpbmdJbnRlbnQuRkxBR19VUERBVEVfQ1VSUkVOVCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNlbmRDYWxsYmFja0FuZEZpbmlzaChpbnQgcmVzdWx0Q29kZSkgeworICAgICAgICBpZiAobUNhbGxiYWNrSW50ZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrSW50ZW50LnNlbmQocmVzdWx0Q29kZSk7CisgICAgICAgICAgICB9IGNhdGNoIChQZW5kaW5nSW50ZW50LkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBDYWxsZXIgY2FuY2VsZWQgdGhlIGNhbGxiYWNrOyBkbyBub3RoaW5nLgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZpbmlzaCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueTIvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueTIvQW5kcm9pZC5tawppbmRleCBlYzcyOTE2Li45MGNmZTk3IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy90ZWxlcGhvbnkyL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvdGVzdHMvdGVsZXBob255Mi9BbmRyb2lkLm1rCkBAIC0yMywxNyArMjMsMTggQEAKIExPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCiAKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCi0gICAgY3RzdGVzdHJ1bm5lciBcCi0gICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbCBcCi0gICAgbGVnYWN5LWFuZHJvaWQtdGVzdAorICAgIGN0c3Rlc3RydW5uZXItYXh0IFwKKyAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dAogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNUZWxlcGhvbnkyVGVzdENhc2VzCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CiAKICMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKIExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiAKLUxPQ0FMX0pBVkFfTElCUkFSSUVTICs9IGFuZHJvaWQudGVzdC5ydW5uZXIKK0xPQ0FMX0pBVkFfTElCUkFSSUVTICs9IGFuZHJvaWQudGVzdC5ydW5uZXIuc3R1YnMKK0xPQ0FMX0pBVkFfTElCUkFSSUVTICs9IGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCiAKIGluY2x1ZGUgJChCVUlMRF9DVFNfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueTIvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueTIvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA2YjhlYzBjLi43NmE1ODg4IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy90ZWxlcGhvbnkyL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvdGVsZXBob255Mi9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yMyw3ICsyMyw3IEBACiAgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgogICAgIDwvYXBwbGljYXRpb24+CiAKLSAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLnRlbGVwaG9ueTIuY3RzIj4KICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9Imxpc3RlbmVyIgogICAgICAgICAgICAgYW5kcm9pZDp2YWx1ZT0iY29tLmFuZHJvaWQuY3RzLnJ1bm5lci5DdHNUZXN0UnVuTGlzdGVuZXIiIC8+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZWxlcGhvbnkyL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueTIvQW5kcm9pZFRlc3QueG1sCmluZGV4IDc4ZDhkNmYuLjI3YjkwNzAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueTIvQW5kcm9pZFRlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueTIvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgVGVsZXBob255IHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJ0ZWxlY29tIiAvPgogICAgIDxvcHRpb24gbmFtZT0ibm90LXNoYXJkYWJsZSIgdmFsdWU9InRydWUiIC8+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZWxlcGhvbnk0L0FuZHJvaWQubWsgYi90ZXN0cy90ZXN0cy90ZWxlcGhvbnk0L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYzNmI1MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueTQvQW5kcm9pZC5tawpAQCAtMCwwICsxLDQ4IEBACisjIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworIyBkb24ndCBpbmNsdWRlIHRoaXMgcGFja2FnZSBpbiBhbnkgdGFyZ2V0CitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorIyBhbmQgd2hlbiBidWlsdCBleHBsaWNpdGx5IHB1dCBpdCBpbiB0aGUgZGF0YSBwYXJ0aXRpb24KK0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCisKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IHRlbGVwaG9ueS1jb21tb24gXAorICAgIGFuZHJvaWQudGVzdC5ydW5uZXIuc3R1YnMgXAorICAgIGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCisKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCisgICAgY3RzdGVzdHJ1bm5lci1heHQgXAorICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0IFwKKyAgICB0cnV0aC1wcmVidWlsdAorCitMT0NBTF9IT1NUX1NIQVJFRF9MSUJSQVJJRVMgOj0gY29tcGF0aWJpbGl0eS1kZXZpY2UtdGVsZXBob255LXByZWNvbmRpdGlvbnMKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQorCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzU2ltUmVzdHJpY3RlZEFwaXNUZXN0Q2FzZXMKK0xPQ0FMX1BSSVZBVEVfUExBVEZPUk1fQVBJUyA6PSB0cnVlCisKKyMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCisKK0xPQ0FMX0NFUlRJRklDQVRFIDo9IGN0cy90ZXN0cy90ZXN0cy90ZWxlcGhvbnk0L2NlcnRzL2FuZHJvaWRfdGVsZXBob255X2N0c190ZXN0a2V5CisKKworaW5jbHVkZSAkKEJVSUxEX0NUU19QQUNLQUdFKQoraW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGVsZXBob255NC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdGVzdHMvdGVsZXBob255NC9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNDIyMWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy90ZWxlcGhvbnk0L0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwzMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJhbmRyb2lkLnRlbGVwaG9ueTQuY3RzIj4KKworICAgIDxhcHBsaWNhdGlvbj4KKyAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CisgICAgPC9hcHBsaWNhdGlvbj4KKworICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQudGVsZXBob255NC5jdHMiCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgdGVzdHMgb2YgYW5kcm9pZC50ZWxlcGhvbnk0Ij4KKyAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9Imxpc3RlbmVyIgorICAgICAgICAgICAgYW5kcm9pZDp2YWx1ZT0iY29tLmFuZHJvaWQuY3RzLnJ1bm5lci5DdHNUZXN0UnVuTGlzdGVuZXIiIC8+CisgICAgPC9pbnN0cnVtZW50YXRpb24+CisKKzwvbWFuaWZlc3Q+CisKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueTQvQW5kcm9pZFRlc3QueG1sIGIvdGVzdHMvdGVzdHMvdGVsZXBob255NC9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM2ZWNiYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueTQvQW5kcm9pZFRlc3QueG1sCkBAIC0wLDAgKzEsMjcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgVGVsZXBob255NCB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgorICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0idGVsZWNvbSIgLz4KKyAgICA8b3B0aW9uIG5hbWU9Im5vdC1zaGFyZGFibGUiIHZhbHVlPSJ0cnVlIiAvPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJDdHNTaW1SZXN0cmljdGVkQXBpc1Rlc3RDYXNlcy5hcGsiIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkFuZHJvaWRKVW5pdFRlc3QiID4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwYWNrYWdlIiB2YWx1ZT0iYW5kcm9pZC50ZWxlcGhvbnk0LmN0cyIgLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZWxlcGhvbnk0L2NlcnRzL2FuZHJvaWRfdGVsZXBob255X2N0c190ZXN0a2V5LnBrOCBiL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueTQvY2VydHMvYW5kcm9pZF90ZWxlcGhvbnlfY3RzX3Rlc3RrZXkucGs4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4M2Q1ZWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy90ZWxlcGhvbnk0L2NlcnRzL2FuZHJvaWRfdGVsZXBob255X2N0c190ZXN0a2V5LnBrOApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZWxlcGhvbnk0L2NlcnRzL2FuZHJvaWRfdGVsZXBob255X2N0c190ZXN0a2V5Lng1MDkucGVtIGIvdGVzdHMvdGVzdHMvdGVsZXBob255NC9jZXJ0cy9hbmRyb2lkX3RlbGVwaG9ueV9jdHNfdGVzdGtleS54NTA5LnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWZmZDZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvdGVsZXBob255NC9jZXJ0cy9hbmRyb2lkX3RlbGVwaG9ueV9jdHNfdGVzdGtleS54NTA5LnBlbQpAQCAtMCwwICsxLDMwIEBACistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUY5VENDQTkyZ0F3SUJBZ0lWQUlqYTJTUVlJTTF3Zklyd2dPYkVVZEJrL01ma01BMEdDU3FHU0liM0RRRUJDd1VBTUlHS01Rc3cKK0NRWURWUVFHRXdKVlV6RVRNQkVHQTFVRUNCTUtRMkZzYVdadmNtNXBZVEVXTUJRR0ExVUVCeE1OVFc5MWJuUmhhVzRnVm1sbGR6RVUKK01CSUdBMVVFQ2hNTFIyOXZaMnhsSUVsdVl5NHhFREFPQmdOVkJBc1RCMEZ1WkhKdmFXUXhKakFrQmdOVkJBTU1IV0Z1WkhKdmFXUmYKK2RHVnNaWEJvYjI1NVgyTjBjMTkwWlhOMGEyVjVNQjRYRFRFNU1ERXhNVEU1TXpNd00xb1hEVFE1TURFeE1URTVNek13TTFvd2dZb3gKK0N6QUpCZ05WQkFZVEFsVlRNUk13RVFZRFZRUUlFd3BEWVd4cFptOXlibWxoTVJZd0ZBWURWUVFIRXcxTmIzVnVkR0ZwYmlCV2FXVjMKK01SUXdFZ1lEVlFRS0V3dEhiMjluYkdVZ1NXNWpMakVRTUE0R0ExVUVDeE1IUVc1a2NtOXBaREVtTUNRR0ExVUVBd3dkWVc1a2NtOXAKK1pGOTBaV3hsY0dodmJubGZZM1J6WDNSbGMzUnJaWGt3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQzkKK0lYQ1RsN28zSjZneTVZbGVRUkZtNVhhaHRoNWh3cEM3Yi9jZlppU1cyNUFxTkxaUmNaSlpEd1lpSklwcU91NzczSHI1ZkVaTVY1YzEKK3RZaXZ3ZHdLbm9HbFdpcXJwdndhZklReHNBUHRLb2lTc0I2cjZaeDRoWkJEemY1TStQUmkzaWVVclByd2FpR2VWeTFuNG5QaGNwSHkKK2J6RTJHK1prZnp4UllSbW1PYmk4K1VDNGxrSTJkTDFZMTdoak5tV3BlSnJmaHZsNjdLMmdNbUF0d2pXMlV4aHlPY0FDZzhNeWExZUEKK1Z5cVFnaUVmTWI1MkZLMW9wc2hIbkdwSWNMalk3VVQxSWVzT1pwV3UzT1dxaU93L0tDVStuSmFFZW1ZRlljZUdSMTRSR2ZLazlyMU4KK2hjUmhaTFhQZlpIcjlUUHNKL08vb0tyRjNRK1R4b1VKSWhRM2xjWVJFZnRycU1aTkRVVUFORU5uZmQxQnZpdTJhdHNjaEc1T2hjaGsKK01pdUtEYWRNbCsrTE9rZkdqb1Rpa1FYVUhHeGI0R0lmZ0xKRG1rcDYrQW5kYzJpWjJwUlBtNnpRbUhYV21jd3R6M1J2eUd0SzBvWUoKK3h3cFZ5MEluRS9BbzFzSDhMcll2QlBXS0RWSGJHMnYreWRZWXJ4MzlTY0JMZ1hRNGd4bVROVTgrWVgzelhWYUdXTVB1VlAyR2Z5QmwKK08rZmwyN1JaTy9YWmxDMjhUUUVNQXZ5dFN5ZVRzNGJsdWJSbExnY2Y5d0F2Nzc0YTc5N2c3dVNSU1orOGFxdW1hdFBydFpuaEJvalUKKzJVNHp1UWlsRTVKR0lJdk01WkdXVU5NTWtZNWJCNGJudzM2b1NLN2t1cDhkeUxsVDdKZ2ZwYzVSdXpZUEt6VStPY0gvazBTZVp3SUQKK0FRQUJvMUF3VGpBTUJnTlZIUk1FQlRBREFRSC9NQjBHQTFVZERnUVdCQlI0KzgrWHFZVTZ4N2RxeS9md3F6NWVHMlRRSWpBZkJnTlYKK0hTTUVHREFXZ0JSNCs4K1hxWVU2eDdkcXkvZndxejVlRzJUUUlqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUFheFRpWTBqK1hnaWcKK1duc2ZxSlJDVjdRbjZMRmhDeVMyemM5NmcrbTBDa2lQTFc4M0JGa1ZORDlKYUFVVnczR0lVS0RFdFprVXkzdjVMNC8vUW1mZFlJYkgKK0lCWDVkL0dKQVZrSDRNUkZiNDdNcjJxdTZ0MzNlTmlEYVJ6SmU1V0lRKzNxSTFQMC8yaWhxS09BRUM4T1NXUVd6WThlV0I5TzR2S3AKK1UvMEpFTk9jU1RmdGhjZTdkRGhDQ3F3M1AwWG1vOXhXMXg5WXFjQVB6TmNRRTdMbTY4TWVPQjllc29UbElGUzdSOXRScDE3cEJVOFkKK0x3OVdTUkZ5NmpCWVgxV2Y4M005NitXUE5RZW5zTHltblhNRHV3SmhvTlY1TW5HTWtxc0FTZmt6WndMeGNMUktsdDRnSjRnbW1QbE0KK21JZUpDY012VUpJTU9sWWNORWlCRjRpNENrekEvVGh4UFJYU0NaZFFLanpNNVlHN1NqM3VFSlRZZ0RxKzUway9uS25ocUt5bVpoUU4KK3BYdGF4My8yaXZvbldmTmFXV0lZQkVZM2FSUVRiM0l3VFJqTTFpYjZBajRzSWpBVHpQMHZvd21Zb1FmL2l2NUhLWXluZHlSY3k0elIKK0xlT1ViVTVIazBSaGM4OTZlT0ZzaHd1QjhWUS82a2lJUFdONFZSTlhuL2hqVCtwNXkrd3c4SU0xY3JMVitmdGRSRGhES2JneE5mbzEKK1IxdWhaZ1JyeXpXQm1GRXo2d1NLRGN0ZFZlWjA4N2UzcGZ6ZStWMy9oclQyZ2V2b1l0Y01IVDcrcW1Oc3NuRGJVaW5YSmljUUFRQm4KK1dsMmx4K1B3eVJuUTFkQW96amNweXRxWE5tUkYvODgxRTJNdnRkQU41WTRGNWQwZmgzMllpNDU1eFE1VU5iMD0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGVsZXBob255NC9zcmMvYW5kcm9pZC90ZWxlcGhvbnk0L2N0cy9TaW1SZXN0cmljdGVkQXBpc1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueTQvc3JjL2FuZHJvaWQvdGVsZXBob255NC9jdHMvU2ltUmVzdHJpY3RlZEFwaXNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ1Njk1MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3RlbGVwaG9ueTQvc3JjL2FuZHJvaWQvdGVsZXBob255NC9jdHMvU2ltUmVzdHJpY3RlZEFwaXNUZXN0LmphdmEKQEAgLTAsMCArMSwyNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudGVsZXBob255NC5jdHM7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5TbXNNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlRlbGVwaG9ueU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIFNpbVJlc3RyaWN0ZWRBcGlzVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIFRFU1RfUERVID0geyAwLCAwIH07CisgICAgcHJpdmF0ZSBUZWxlcGhvbnlNYW5hZ2VyIG1UZWxlcGhvbnlNYW5hZ2VyOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgbVRlbGVwaG9ueU1hbmFnZXIgPQorICAgICAgICAgICAgICAgIChUZWxlcGhvbnlNYW5hZ2VyKSBnZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlRFTEVQSE9OWV9TRVJWSUNFKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNTaW1DYXJkUHJlc2VudCgpIHsKKyAgICAgICAgcmV0dXJuIG1UZWxlcGhvbnlNYW5hZ2VyLmdldFBob25lVHlwZSgpICE9IFRlbGVwaG9ueU1hbmFnZXIuUEhPTkVfVFlQRV9OT05FICYmCisgICAgICAgICAgICAgICAgbVRlbGVwaG9ueU1hbmFnZXIuZ2V0U2ltU3RhdGUoKSAhPSBUZWxlcGhvbnlNYW5hZ2VyLlNJTV9TVEFURV9BQlNFTlQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhlIFNtc01hbmFnZXIuaW5qZWN0U21zUGR1KCkgQVBJLiBUaGlzIG1ha2VzIGEgY2FsbCB0byBpbmplY3RTbXNQZHUoKSBBUEkgYW5kIGV4cGVjdHMKKyAgICAgKiBhIFNlY3VyaXR5RXhjZXB0aW9uIHNpbmNlIHRoZSB0ZXN0IGFwayBpcyBub3Qgc2lnbmVkIGJ5IGEgY2VydGlmaWNhdGUgb24gdGhlIFNJTS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5qZWN0U21zUGR1KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGlzU2ltQ2FyZFByZXNlbnQoKSkgeworICAgICAgICAgICAgICAgIFNtc01hbmFnZXIuZ2V0RGVmYXVsdCgpLmluamVjdFNtc1BkdShURVNUX1BEVSwgIjNncHAiLCBudWxsKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBTZWN1cml0eUV4Y2VwdGlvbi4gQXBwIGRvZXNuJ3QgaGF2ZSBjYXJyaWVyIHByaXZpbGVnZXMuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB0aGUgVGVsZXBob255TWFuYWdlci5zZXRMaW5lMU51bWJlckZvckRpc3BsYXkoKSBBUEkuIFRoaXMgbWFrZXMgYSBjYWxsIHRvCisgICAgICogc2V0TGluZTFOdW1iZXJGb3JEaXNwbGF5KCkgQVBJIGFuZCBleHBlY3RzIGEgU2VjdXJpdHlFeGNlcHRpb24gc2luY2UgdGhlIHRlc3QgYXBrIGlzIG5vdAorICAgICAqIHNpZ25lZCBieSBhIGNlcnRpZmljYXRlIG9uIHRoZSBTSU0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFNldExpbmUxTnVtYmVyRm9yRGlzcGxheSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChpc1NpbUNhcmRQcmVzZW50KCkpIHsKKyAgICAgICAgICAgICAgICBUZWxlcGhvbnlNYW5hZ2VyLmdldERlZmF1bHQoKS5zZXRMaW5lMU51bWJlckZvckRpc3BsYXkoIiIsICIiKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBTZWN1cml0eUV4Y2VwdGlvbi4gQXBwIGRvZXNuJ3QgaGF2ZSBjYXJyaWVyIHByaXZpbGVnZXMuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB0aGUgVGVsZXBob255TWFuYWdlci5pY2NPcGVuTG9naWNhbENoYW5uZWwoKSBBUEkuIFRoaXMgbWFrZXMgYSBjYWxsIHRvCisgICAgICogaWNjT3BlbkxvZ2ljYWxDaGFubmVsKCkgQVBJIGFuZCBleHBlY3RzIGEgU2VjdXJpdHlFeGNlcHRpb24gc2luY2UgdGhlIHRlc3QgYXBrIGlzIG5vdCBzaWduZWQKKyAgICAgKiBieSBjZXJ0aWZpY2F0ZSBvbiB0aGUgU0lNLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RJY2NPcGVuTG9naWNhbENoYW5uZWwoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoaXNTaW1DYXJkUHJlc2VudCgpKSB7CisgICAgICAgICAgICAgICAgVGVsZXBob255TWFuYWdlci5nZXREZWZhdWx0KCkuaWNjQ2xvc2VMb2dpY2FsQ2hhbm5lbCgKKyAgICAgICAgICAgICAgICAgICAgICAgIFRlbGVwaG9ueU1hbmFnZXIuZ2V0RGVmYXVsdCgpLmljY09wZW5Mb2dpY2FsQ2hhbm5lbCgiIikuZ2V0Q2hhbm5lbCgpKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBTZWN1cml0eUV4Y2VwdGlvbi4gQXBwIGRvZXNuJ3QgaGF2ZSBjYXJyaWVyIHByaXZpbGVnZXMuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB0aGUgVGVsZXBob255TWFuYWdlci5pY2NDbG9zZUxvZ2ljYWxDaGFubmVsKCkgQVBJLiBUaGlzIG1ha2VzIGEgY2FsbCB0bworICAgICAqIGljY0Nsb3NlTG9naWNhbENoYW5uZWwoKSBBUEkgYW5kIGV4cGVjdHMgYSBTZWN1cml0eUV4Y2VwdGlvbiBzaW5jZSB0aGUgdGVzdCBhcGsgaXMgbm90IHNpZ25lZAorICAgICAqIGJ5IGNlcnRpZmljYXRlIG9uIHRoZSBTSU0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEljY0Nsb3NlTG9naWNhbENoYW5uZWwoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoaXNTaW1DYXJkUHJlc2VudCgpKSB7CisgICAgICAgICAgICAgICAgVGVsZXBob255TWFuYWdlci5nZXREZWZhdWx0KCkuaWNjQ2xvc2VMb2dpY2FsQ2hhbm5lbCgwKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBTZWN1cml0eUV4Y2VwdGlvbi4gQXBwIGRvZXNuJ3QgaGF2ZSBjYXJyaWVyIHByaXZpbGVnZXMuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB0aGUgVGVsZXBob255TWFuYWdlci5pY2NUcmFuc21pdEFwZHVMb2dpY2FsQ2hhbm5lbCgpIEFQSS4gVGhpcyBtYWtlcyBhIGNhbGwgdG8KKyAgICAgKiBpY2NUcmFuc21pdEFwZHVMb2dpY2FsQ2hhbm5lbCgpIEFQSSBhbmQgZXhwZWN0cyBhIFNlY3VyaXR5RXhjZXB0aW9uIHNpbmNlIHRoZSB0ZXN0IGFwayBpcyBub3QKKyAgICAgKiBzaWduZWQgYnkgYSBjZXJ0aWZpY2F0ZSBvbiB0aGUgU0lNLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RJY2NUcmFuc21pdEFwZHVMb2dpY2FsQ2hhbm5lbCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChpc1NpbUNhcmRQcmVzZW50KCkpIHsKKyAgICAgICAgICAgICAgICBUZWxlcGhvbnlNYW5hZ2VyLmdldERlZmF1bHQoKS5pY2NUcmFuc21pdEFwZHVMb2dpY2FsQ2hhbm5lbCgwLCAwLCAwLCAwLCAwLCAwLCAiIik7CisgICAgICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgU2VjdXJpdHlFeGNlcHRpb24uIEFwcCBkb2Vzbid0IGhhdmUgY2FycmllciBwcml2aWxlZ2VzLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhlIFRlbGVwaG9ueU1hbmFnZXIuaWNjVHJhbnNtaXRBcGR1QmFzaWNDaGFubmVsKCkgQVBJLiBUaGlzIG1ha2VzIGEgY2FsbCB0bworICAgICAqIGljY1RyYW5zbWl0QXBkdUJhc2ljQ2hhbm5lbCgpIEFQSSBhbmQgZXhwZWN0cyBhIFNlY3VyaXR5RXhjZXB0aW9uIHNpbmNlIHRoZSB0ZXN0IGFwayBpcyBub3QKKyAgICAgKiBzaWduZWQgYnkgYSBjZXJ0aWZpY2F0ZSBvbiB0aGUgU0lNLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RJY2NUcmFuc21pdEFwZHVCYXNpY0NoYW5uZWwoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoaXNTaW1DYXJkUHJlc2VudCgpKSB7CisgICAgICAgICAgICAgICAgVGVsZXBob255TWFuYWdlci5nZXREZWZhdWx0KCkuaWNjVHJhbnNtaXRBcGR1QmFzaWNDaGFubmVsKDAsIDAsIDAsIDAsIDAsICIiKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBTZWN1cml0eUV4Y2VwdGlvbi4gQXBwIGRvZXNuJ3QgaGF2ZSBjYXJyaWVyIHByaXZpbGVnZXMuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB0aGUgVGVsZXBob255TWFuYWdlci5zZW5kRW52ZWxvcGVXaXRoU3RhdHVzKCkgQVBJLiBUaGlzIG1ha2VzIGEgY2FsbCB0bworICAgICAqIHNlbmRFbnZlbG9wZVdpdGhTdGF0dXMoKSBBUEkgYW5kIGV4cGVjdHMgYSBTZWN1cml0eUV4Y2VwdGlvbiBzaW5jZSB0aGUgdGVzdCBhcGsgaXMgbm90IHNpZ25lZAorICAgICAqIGJ5IGNlcnRpZmljYXRlIG9uIHRoZSBTSU0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFNlbmRFbnZlbG9wZVdpdGhTdGF0dXMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoaXNTaW1DYXJkUHJlc2VudCgpKSB7CisgICAgICAgICAgICAgICAgVGVsZXBob255TWFuYWdlci5nZXREZWZhdWx0KCkuc2VuZEVudmVsb3BlV2l0aFN0YXR1cygiIik7CisgICAgICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgU2VjdXJpdHlFeGNlcHRpb24uIEFwcCBkb2Vzbid0IGhhdmUgY2FycmllciBwcml2aWxlZ2VzLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhlIFRlbGVwaG9ueU1hbmFnZXIubnZSZWFkSXRlbSgpIEFQSS4gVGhpcyBtYWtlcyBhIGNhbGwgdG8gbnZSZWFkSXRlbSgpIEFQSSBhbmQKKyAgICAgKiBleHBlY3RzIGEgU2VjdXJpdHlFeGNlcHRpb24gc2luY2UgdGhlIHRlc3QgYXBrIGlzIG5vdCBzaWduZWQgYnkgYSBjZXJ0aWZpY2F0ZSBvbiB0aGUgU0lNLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3ROdlJlYWRJdGVtKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGlzU2ltQ2FyZFByZXNlbnQoKSkgeworICAgICAgICAgICAgICAgIFRlbGVwaG9ueU1hbmFnZXIuZ2V0RGVmYXVsdCgpLm52UmVhZEl0ZW0oMCk7CisgICAgICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgU2VjdXJpdHlFeGNlcHRpb24uIEFwcCBkb2Vzbid0IGhhdmUgY2FycmllciBwcml2aWxlZ2VzLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhlIFRlbGVwaG9ueU1hbmFnZXIubnZSZXNldENvbmZpZygpIEFQSS4gVGhpcyBtYWtlcyBhIGNhbGwgdG8gbnZSZXNldENvbmZpZygpIEFQSSBhbmQKKyAgICAgKiBleHBlY3RzIGEgU2VjdXJpdHlFeGNlcHRpb24gc2luY2UgdGhlIHRlc3QgYXBrIGlzIG5vdCBzaWduZWQgYnkgYSBjZXJ0aWZpY2F0ZSBvbiB0aGUgU0lNLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3ROdlJlc2V0Q29uZmlnKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGlzU2ltQ2FyZFByZXNlbnQoKSkgeworICAgICAgICAgICAgICAgIFRlbGVwaG9ueU1hbmFnZXIuZ2V0RGVmYXVsdCgpLm52UmVzZXRDb25maWcoMSk7CisgICAgICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgU2VjdXJpdHlFeGNlcHRpb24uIEFwcCBkb2Vzbid0IGhhdmUgY2FycmllciBwcml2aWxlZ2VzLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhlIFRlbGVwaG9ueU1hbmFnZXIuZ2V0UHJlZmVycmVkTmV0d29ya1R5cGUoKSBBUEkuIFRoaXMgbWFrZXMgYSBjYWxsIHRvCisgICAgICogZ2V0UHJlZmVycmVkTmV0d29ya1R5cGUoKSBBUEkgYW5kIGV4cGVjdHMgYSBTZWN1cml0eUV4Y2VwdGlvbiBzaW5jZSB0aGUgdGVzdCBhcGsgaXMgbm90CisgICAgICogc2lnbmVkIGJ5IGNlcnRpZmljYXRlIG9uIHRoZSBTSU0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldFByZWZlcnJlZE5ldHdvcmtUeXBlKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGlzU2ltQ2FyZFByZXNlbnQoKSkgeworICAgICAgICAgICAgICAgIFRlbGVwaG9ueU1hbmFnZXIuZ2V0RGVmYXVsdCgpLmdldFByZWZlcnJlZE5ldHdvcmtUeXBlKDApOworICAgICAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIFNlY3VyaXR5RXhjZXB0aW9uLiBBcHAgZG9lc24ndCBoYXZlIGNhcnJpZXIgcHJpdmlsZWdlcy4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoZSBUZWxlcGhvbnlNYW5hZ2VyLnNldFByZWZlcnJlZE5ldHdvcmtUeXBlVG9HbG9iYWwoKSBBUEkuIFRoaXMgbWFrZXMgYSBjYWxsIHRvCisgICAgICogc2V0UHJlZmVycmVkTmV0d29ya1R5cGVUb0dsb2JhbCgpIEFQSSBhbmQgZXhwZWN0cyBhIFNlY3VyaXR5RXhjZXB0aW9uIHNpbmNlIHRoZSB0ZXN0IGFwayBpcyBub3QKKyAgICAgKiBzaWduZWQgYnkgY2VydGlmaWNhdGUgb24gdGhlIFNJTS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0UHJlZmVycmVkTmV0d29ya1R5cGVUb0dsb2JhbCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChpc1NpbUNhcmRQcmVzZW50KCkpIHsKKyAgICAgICAgICAgICAgICBUZWxlcGhvbnlNYW5hZ2VyLmdldERlZmF1bHQoKS5zZXRQcmVmZXJyZWROZXR3b3JrVHlwZVRvR2xvYmFsKCk7CisgICAgICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgU2VjdXJpdHlFeGNlcHRpb24uIEFwcCBkb2Vzbid0IGhhdmUgY2FycmllciBwcml2aWxlZ2VzLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhhdCB0aGUgdGVzdCBhcGsgZG9lc24ndCBoYXZlIGNhcnJpZXIgcHJldmlsaWdlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzQ2FycmllclByaXZpbGVnZXMoKSB7CisgICAgICAgIGlmIChtVGVsZXBob255TWFuYWdlci5oYXNDYXJyaWVyUHJpdmlsZWdlcygpKSB7CisgICAgICAgICAgICBmYWlsKCJBcHAgdW5leHBlY3RlZGx5IGhhcyBjYXJyaWVyIHByaXZpbGVnZXMiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoZSBUZWxlcGhvbnlNYW5hZ2VyLnNldE9wZXJhdG9yQnJhbmRPdmVycmlkZSgpIEFQSS4gVGhpcyBtYWtlcyBhIGNhbGwgdG8KKyAgICAgKiBzZXRPcGVyYXRvckJyYW5kT3ZlcnJpZGUoKSBBUEkgYW5kIGV4cGVjdHMgYSBTZWN1cml0eUV4Y2VwdGlvbiBzaW5jZSB0aGUgdGVzdCBhcGsgaXMgbm90CisgICAgICogc2lnbmVkIGJ5IGNlcnRpZmljYXRlIG9uIHRoZSBTSU0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFNldE9wZXJhdG9yQnJhbmRPdmVycmlkZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChpc1NpbUNhcmRQcmVzZW50KCkpIHsKKyAgICAgICAgICAgICAgICBUZWxlcGhvbnlNYW5hZ2VyLmdldERlZmF1bHQoKS5zZXRPcGVyYXRvckJyYW5kT3ZlcnJpZGUoIiIpOworICAgICAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIFNlY3VyaXR5RXhjZXB0aW9uLiBBcHAgZG9lc24ndCBoYXZlIGNhcnJpZXIgcHJpdmlsZWdlcy4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoZSBUZWxlcGhvbnlNYW5hZ2VyLmdldEljY0F1dGhlbnRpY2F0aW9uKCkgQVBJLiBUaGlzIG1ha2VzIGEgY2FsbCB0bworICAgICAqIGdldEljY0F1dGhlbnRpY2F0aW9uKCkgQVBJIGFuZCBleHBlY3RzIGEgU2VjdXJpdHlFeGNlcHRpb24gc2luY2UgdGhlIHRlc3QgYXBrIGlzIG5vdAorICAgICAqIHNpZ25lZCBieSBjZXJ0aWZpY2F0ZSBvbiB0aGUgU0lNLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRJY2NBdXRoZW50aWNhdGlvbigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChpc1NpbUNhcmRQcmVzZW50KCkpIHsKKyAgICAgICAgICAgICAgICBUZWxlcGhvbnlNYW5hZ2VyLmdldERlZmF1bHQoKS5nZXRJY2NBdXRoZW50aWNhdGlvbihUZWxlcGhvbnlNYW5hZ2VyLkFQUFRZUEVfVVNJTSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRlbGVwaG9ueU1hbmFnZXIuQVVUSFRZUEVfRUFQX0FLQSwgIiIpOworICAgICAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIFNlY3VyaXR5RXhjZXB0aW9uLiBBcHAgZG9lc24ndCBoYXZlIGNhcnJpZXIgcHJpdmlsZWdlcy4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RleHQvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL3RleHQvQW5kcm9pZC5tawppbmRleCAxNWE3YmNjLi41ZjNiNWE2IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy90ZXh0L0FuZHJvaWQubWsKKysrIGIvdGVzdHMvdGVzdHMvdGV4dC9BbmRyb2lkLm1rCkBAIC0yMSwxMyArMjEsMTMgQEAKICMgYW5kIHdoZW4gYnVpbHQgZXhwbGljaXRseSBwdXQgaXQgaW4gdGhlIGRhdGEgcGFydGl0aW9uCiBMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQogCi1MT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzIGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCiAKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyArPSBcCi0gICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbCBcCi0gICAgY3RzZGV2aWNldXRpbGxlZ2FjeSBcCi0gICAgY3RzdGVzdHJ1bm5lciBcCi0gICAgYW5kcm9pZC1zdXBwb3J0LXRlc3QgXAorICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0IFwKKyAgICBjdHNkZXZpY2V1dGlsbGVnYWN5LWF4dCBcCisgICAgY3RzdGVzdHJ1bm5lci1heHQgXAorICAgIGFuZHJvaWR4LnRlc3QucnVsZXMgXAogICAgIG1vY2tpdG8tdGFyZ2V0LW1pbnVzLWp1bml0NCBcCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKQEAgLTM1LDcgKzM1LDcgQEAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNUZXh0VGVzdENhc2VzCiAKICMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cyBjdHNfaW5zdGFudAogCiAjIEVuZm9yY2UgcHVibGljIC8gdGVzdCBhcGkgb25seQogTE9DQUxfU0RLX1ZFUlNJT04gOj0gdGVzdF9jdXJyZW50CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZXh0L0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy90ZXN0cy90ZXh0L0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggNDBhMGI1MC4uODUzNGI0MiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdGV4dC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL3RleHQvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMTYsOSArMTYsMTEgQEAKICAtLT4KIAogPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBwYWNrYWdlPSJhbmRyb2lkLnRleHQuY3RzIj4KKyAgICBwYWNrYWdlPSJhbmRyb2lkLnRleHQuY3RzIgorICAgIGFuZHJvaWQ6dGFyZ2V0U2FuZGJveFZlcnNpb249IjIiPgogCiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5ESVNBQkxFX0tFWUdVQVJEIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uV1JJVEVfU0VUVElOR1MiIC8+CiAKICAgICA8YXBwbGljYXRpb24gYW5kcm9pZDptYXhSZWNlbnRzPSIxIj4KICAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CkBAIC03NCw3ICs3Niw3IEBACiAKICAgICA8L2FwcGxpY2F0aW9uPgogCi0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC50ZXh0LmN0cyIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBvZiBhbmRyb2lkLnRleHQiPgogICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0ibGlzdGVuZXIiCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZXh0L0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL3RleHQvQW5kcm9pZFRlc3QueG1sCmluZGV4IDJiOGM3MzMuLmI4ZGE5MWUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RleHQvQW5kcm9pZFRlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL3RleHQvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgVGV4dCB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0idWl0b29sa2l0IiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CkBAIC0yMiw1ICsyMyw2IEBACiAgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkFuZHJvaWRKVW5pdFRlc3QiID4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJwYWNrYWdlIiB2YWx1ZT0iYW5kcm9pZC50ZXh0LmN0cyIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJydW50aW1lLWhpbnQiIHZhbHVlPSIyMm0iIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0iaGlkZGVuLWFwaS1jaGVja3MiIHZhbHVlPSJmYWxzZSIgLz4KICAgICA8L3Rlc3Q+CiA8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZXh0L09XTkVSUyBiL3Rlc3RzL3Rlc3RzL3RleHQvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNzhjMzEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy90ZXh0L09XTkVSUwpAQCAtMCwwICsxLDggQEAKK3NldCBub3BhcmVudAorCitzaXlhbWVkQGdvb2dsZS5jb20KK25vbmFAZ29vZ2xlLmNvbQorY2xhcmFiYXlhcnJpQGdvb2dsZS5jb20KK25mdWxsZXJAZ29vZ2xlLmNvbQordG9iaWFzdEBnb29nbGUuY29tCit2aWNoYW5nQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RleHQvYXNzZXRzL2ZvbnRzL1N0YXRpY0xheW91dExpbmVCcmVha2luZ1Rlc3RGb250LnR0ZiBiL3Rlc3RzL3Rlc3RzL3RleHQvYXNzZXRzL2ZvbnRzL1N0YXRpY0xheW91dExpbmVCcmVha2luZ1Rlc3RGb250LnR0ZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDg3NDgzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvdGV4dC9hc3NldHMvZm9udHMvU3RhdGljTGF5b3V0TGluZUJyZWFraW5nVGVzdEZvbnQudHRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RleHQvYXNzZXRzL2ZvbnRzL1N0YXRpY0xheW91dExpbmVCcmVha2luZ1Rlc3RGb250LnR0eCBiL3Rlc3RzL3Rlc3RzL3RleHQvYXNzZXRzL2ZvbnRzL1N0YXRpY0xheW91dExpbmVCcmVha2luZ1Rlc3RGb250LnR0eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWQ2YjRjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvdGV4dC9hc3NldHMvZm9udHMvU3RhdGljTGF5b3V0TGluZUJyZWFraW5nVGVzdEZvbnQudHR4CkBAIC0wLDAgKzEsMjY0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8dHRGb250IHNmbnRWZXJzaW9uPSJceDAwXHgwMVx4MDBceDAwIiB0dExpYlZlcnNpb249IjMuMCI+CisKKyAgPEdseXBoT3JkZXI+CisgICAgPEdseXBoSUQgaWQ9IjAiIG5hbWU9Ii5ub3RkZWYiLz4KKyAgICA8R2x5cGhJRCBpZD0iMSIgbmFtZT0iMGVtIi8+CisgICAgPEdseXBoSUQgaWQ9IjIiIG5hbWU9IjFlbSIvPgorICAgIDxHbHlwaElEIGlkPSIzIiBuYW1lPSIzZW0iLz4KKyAgICA8R2x5cGhJRCBpZD0iNCIgbmFtZT0iNWVtIi8+CisgICAgPEdseXBoSUQgaWQ9IjUiIG5hbWU9IjdlbSIvPgorICAgIDxHbHlwaElEIGlkPSI2IiBuYW1lPSIxMGVtIi8+CisgICAgPEdseXBoSUQgaWQ9IjciIG5hbWU9IjUwZW0iLz4KKyAgICA8R2x5cGhJRCBpZD0iOCIgbmFtZT0iMTAwZW0iLz4KKyAgPC9HbHlwaE9yZGVyPgorCisgIDxoZWFkPgorICAgIDx0YWJsZVZlcnNpb24gdmFsdWU9IjEuMCIvPgorICAgIDxmb250UmV2aXNpb24gdmFsdWU9IjEuMCIvPgorICAgIDxjaGVja1N1bUFkanVzdG1lbnQgdmFsdWU9IjB4NjQwY2RiMmYiLz4KKyAgICA8bWFnaWNOdW1iZXIgdmFsdWU9IjB4NWYwZjNjZjUiLz4KKyAgICA8ZmxhZ3MgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDExIi8+CisgICAgPHVuaXRzUGVyRW0gdmFsdWU9IjEwMCIvPgorICAgIDxjcmVhdGVkIHZhbHVlPSJGcmkgTWFyIDE3IDA3OjI2OjAwIDIwMTciLz4KKyAgICA8bWFjU3R5bGUgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIi8+CisgICAgPGxvd2VzdFJlY1BQRU0gdmFsdWU9IjciLz4KKyAgICA8Zm9udERpcmVjdGlvbkhpbnQgdmFsdWU9IjIiLz4KKyAgICA8Z2x5cGhEYXRhRm9ybWF0IHZhbHVlPSIwIi8+CisgIDwvaGVhZD4KKworICA8aGhlYT4KKyAgICA8dGFibGVWZXJzaW9uIHZhbHVlPSIweDAwMDEwMDAwIi8+CisgICAgPGFzY2VudCB2YWx1ZT0iMTAwMCIvPgorICAgIDxkZXNjZW50IHZhbHVlPSItMjAwIi8+CisgICAgPGxpbmVHYXAgdmFsdWU9IjAiLz4KKyAgICA8Y2FyZXRTbG9wZVJpc2UgdmFsdWU9IjEiLz4KKyAgICA8Y2FyZXRTbG9wZVJ1biB2YWx1ZT0iMCIvPgorICAgIDxjYXJldE9mZnNldCB2YWx1ZT0iMCIvPgorICAgIDxyZXNlcnZlZDAgdmFsdWU9IjAiLz4KKyAgICA8cmVzZXJ2ZWQxIHZhbHVlPSIwIi8+CisgICAgPHJlc2VydmVkMiB2YWx1ZT0iMCIvPgorICAgIDxyZXNlcnZlZDMgdmFsdWU9IjAiLz4KKyAgICA8bWV0cmljRGF0YUZvcm1hdCB2YWx1ZT0iMCIvPgorICA8L2hoZWE+CisKKyAgPG1heHA+CisgICAgPHRhYmxlVmVyc2lvbiB2YWx1ZT0iMHgxMDAwMCIvPgorICAgIDxtYXhab25lcyB2YWx1ZT0iMCIvPgorICAgIDxtYXhUd2lsaWdodFBvaW50cyB2YWx1ZT0iMCIvPgorICAgIDxtYXhTdG9yYWdlIHZhbHVlPSIwIi8+CisgICAgPG1heEZ1bmN0aW9uRGVmcyB2YWx1ZT0iMCIvPgorICAgIDxtYXhJbnN0cnVjdGlvbkRlZnMgdmFsdWU9IjAiLz4KKyAgICA8bWF4U3RhY2tFbGVtZW50cyB2YWx1ZT0iMCIvPgorICAgIDxtYXhTaXplT2ZJbnN0cnVjdGlvbnMgdmFsdWU9IjAiLz4KKyAgICA8bWF4Q29tcG9uZW50RWxlbWVudHMgdmFsdWU9IjAiLz4KKyAgPC9tYXhwPgorCisgIDxPU18yPgorICAgIDwhLS0gVGhlIGZpZWxkcyAndXNGaXJzdENoYXJJbmRleCcgYW5kICd1c0xhc3RDaGFySW5kZXgnCisgICAgICAgICB3aWxsIGJlIHJlY2FsY3VsYXRlZCBieSB0aGUgY29tcGlsZXIgLS0+CisgICAgPHZlcnNpb24gdmFsdWU9IjMiLz4KKyAgICA8eEF2Z0NoYXJXaWR0aCB2YWx1ZT0iNTk0Ii8+CisgICAgPHVzV2VpZ2h0Q2xhc3MgdmFsdWU9IjQwMCIvPgorICAgIDx1c1dpZHRoQ2xhc3MgdmFsdWU9IjUiLz4KKyAgICA8ZnNUeXBlIHZhbHVlPSIwMDAwMDAwMCAwMDAwMTAwMCIvPgorICAgIDx5U3Vic2NyaXB0WFNpemUgdmFsdWU9IjY1MCIvPgorICAgIDx5U3Vic2NyaXB0WVNpemUgdmFsdWU9IjYwMCIvPgorICAgIDx5U3Vic2NyaXB0WE9mZnNldCB2YWx1ZT0iMCIvPgorICAgIDx5U3Vic2NyaXB0WU9mZnNldCB2YWx1ZT0iNzUiLz4KKyAgICA8eVN1cGVyc2NyaXB0WFNpemUgdmFsdWU9IjY1MCIvPgorICAgIDx5U3VwZXJzY3JpcHRZU2l6ZSB2YWx1ZT0iNjAwIi8+CisgICAgPHlTdXBlcnNjcmlwdFhPZmZzZXQgdmFsdWU9IjAiLz4KKyAgICA8eVN1cGVyc2NyaXB0WU9mZnNldCB2YWx1ZT0iMzUwIi8+CisgICAgPHlTdHJpa2VvdXRTaXplIHZhbHVlPSI1MCIvPgorICAgIDx5U3RyaWtlb3V0UG9zaXRpb24gdmFsdWU9IjMwMCIvPgorICAgIDxzRmFtaWx5Q2xhc3MgdmFsdWU9IjAiLz4KKyAgICA8cGFub3NlPgorICAgICAgPGJGYW1pbHlUeXBlIHZhbHVlPSIwIi8+CisgICAgICA8YlNlcmlmU3R5bGUgdmFsdWU9IjAiLz4KKyAgICAgIDxiV2VpZ2h0IHZhbHVlPSI1Ii8+CisgICAgICA8YlByb3BvcnRpb24gdmFsdWU9IjAiLz4KKyAgICAgIDxiQ29udHJhc3QgdmFsdWU9IjAiLz4KKyAgICAgIDxiU3Ryb2tlVmFyaWF0aW9uIHZhbHVlPSIwIi8+CisgICAgICA8YkFybVN0eWxlIHZhbHVlPSIwIi8+CisgICAgICA8YkxldHRlckZvcm0gdmFsdWU9IjAiLz4KKyAgICAgIDxiTWlkbGluZSB2YWx1ZT0iMCIvPgorICAgICAgPGJYSGVpZ2h0IHZhbHVlPSIwIi8+CisgICAgPC9wYW5vc2U+CisgICAgPHVsVW5pY29kZVJhbmdlMSB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDEiLz4KKyAgICA8dWxVbmljb2RlUmFuZ2UyIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCIvPgorICAgIDx1bFVuaWNvZGVSYW5nZTMgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIi8+CisgICAgPHVsVW5pY29kZVJhbmdlNCB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAiLz4KKyAgICA8YWNoVmVuZElEIHZhbHVlPSJVS1dOIi8+CisgICAgPGZzU2VsZWN0aW9uIHZhbHVlPSIwMDAwMDAwMCAwMTAwMDAwMCIvPgorICAgIDx1c0ZpcnN0Q2hhckluZGV4IHZhbHVlPSIzMiIvPgorICAgIDx1c0xhc3RDaGFySW5kZXggdmFsdWU9IjEyMiIvPgorICAgIDxzVHlwb0FzY2VuZGVyIHZhbHVlPSI4MDAiLz4KKyAgICA8c1R5cG9EZXNjZW5kZXIgdmFsdWU9Ii0yMDAiLz4KKyAgICA8c1R5cG9MaW5lR2FwIHZhbHVlPSIyMDAiLz4KKyAgICA8dXNXaW5Bc2NlbnQgdmFsdWU9IjEwMDAiLz4KKyAgICA8dXNXaW5EZXNjZW50IHZhbHVlPSIyMDAiLz4KKyAgICA8dWxDb2RlUGFnZVJhbmdlMSB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDEiLz4KKyAgICA8dWxDb2RlUGFnZVJhbmdlMiB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAiLz4KKyAgICA8c3hIZWlnaHQgdmFsdWU9IjUwMCIvPgorICAgIDxzQ2FwSGVpZ2h0IHZhbHVlPSI3MDAiLz4KKyAgICA8dXNEZWZhdWx0Q2hhciB2YWx1ZT0iMCIvPgorICAgIDx1c0JyZWFrQ2hhciB2YWx1ZT0iMzIiLz4KKyAgICA8dXNNYXhDb250ZXh0IHZhbHVlPSIwIi8+CisgIDwvT1NfMj4KKworICA8aG10eD4KKyAgICA8bXR4IG5hbWU9Ii5ub3RkZWYiIHdpZHRoPSI1MCIgbHNiPSIwIi8+CisgICAgPG10eCBuYW1lPSIwZW0iIHdpZHRoPSIwIiBsc2I9IjAiLz4KKyAgICA8bXR4IG5hbWU9IjFlbSIgd2lkdGg9IjEwMCIgbHNiPSIwIi8+CisgICAgPG10eCBuYW1lPSIzZW0iIHdpZHRoPSIzMDAiIGxzYj0iMCIvPgorICAgIDxtdHggbmFtZT0iNWVtIiB3aWR0aD0iNTAwIiBsc2I9IjAiLz4KKyAgICA8bXR4IG5hbWU9IjdlbSIgd2lkdGg9IjcwMCIgbHNiPSIwIi8+CisgICAgPG10eCBuYW1lPSIxMGVtIiB3aWR0aD0iMTAwMCIgbHNiPSIwIi8+CisgICAgPG10eCBuYW1lPSI1MGVtIiB3aWR0aD0iNTAwMCIgbHNiPSIwIi8+CisgICAgPG10eCBuYW1lPSIxMDBlbSIgd2lkdGg9IjEwMDAwIiBsc2I9IjAiLz4KKyAgPC9obXR4PgorCisgIDxjbWFwPgorICAgIDx0YWJsZVZlcnNpb24gdmVyc2lvbj0iMCIvPgorICAgIDxjbWFwX2Zvcm1hdF8xMiBmb3JtYXQ9IjEyIiByZXNlcnZlZD0iMCIgbGVuZ3RoPSI2IiBuR3JvdXBzPSIxIiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEwIiBsYW5ndWFnZT0iMCI+CisgICAgICA8bWFwIGNvZGU9IjB4MDAwYSIgbmFtZT0iMGVtIiAvPiAgPCEtLSBcbiAtLT4KKyAgICAgIDxtYXAgY29kZT0iMHgwMDIwIiBuYW1lPSIxMGVtIiAvPgorICAgICAgPG1hcCBjb2RlPSIweDAwMmUiIG5hbWU9IjEwZW0iIC8+ICA8IS0tIC4gLS0+CisgICAgICA8bWFwIGNvZGU9IjB4MDA0MyIgbmFtZT0iMTAwZW0iIC8+ICA8IS0tIEMgLS0+CisgICAgICA8bWFwIGNvZGU9IjB4MDA0OSIgbmFtZT0iMWVtIiAvPiAgPCEtLSBJIC0tPgorICAgICAgPG1hcCBjb2RlPSIweDAwNGMiIG5hbWU9IjUwZW0iIC8+ICA8IS0tIEwgLS0+CisgICAgICA8bWFwIGNvZGU9IjB4MDA1NiIgbmFtZT0iNWVtIiAvPiAgPCEtLSBWIC0tPgorICAgICAgPG1hcCBjb2RlPSIweDAwNTgiIG5hbWU9IjEwZW0iIC8+ICA8IS0tIFggLS0+CisgICAgICA8bWFwIGNvZGU9IjB4MDA1ZiIgbmFtZT0iMGVtIiAvPiA8IS0tIF8gLS0+CisgICAgICA8bWFwIGNvZGU9IjB4ZmZmZCIgbmFtZT0iN2VtIiAvPiA8IS0tIFJFUExBQ0VNRU5UIENIQVIgLS0+CisgICAgICA8bWFwIGNvZGU9IjB4MTAzMzEiIG5hbWU9IjEwZW0iIC8+CisgICAgPC9jbWFwX2Zvcm1hdF8xMj4KKyAgPC9jbWFwPgorCisgIDxsb2NhPgorICAgIDwhLS0gVGhlICdsb2NhJyB0YWJsZSB3aWxsIGJlIGNhbGN1bGF0ZWQgYnkgdGhlIGNvbXBpbGVyIC0tPgorICA8L2xvY2E+CisKKyAgPGdseWY+CisgICAgPFRUR2x5cGggbmFtZT0iLm5vdGRlZiIgeE1pbj0iMCIgeU1pbj0iMCIgeE1heD0iMCIgeU1heD0iMCIgLz4KKyAgICA8VFRHbHlwaCBuYW1lPSIwZW0iIHhNaW49IjAiIHlNaW49IjAiIHhNYXg9IjAiIHlNYXg9IjAiIC8+CisgICAgPFRUR2x5cGggbmFtZT0iMWVtIiB4TWluPSIwIiB5TWluPSIwIiB4TWF4PSIxMDAiIHlNYXg9IjEwMCI+CisgICAgICA8Y29udG91cj4KKyAgICAgICAgPHB0IHg9IjAiIHk9IjAiIG9uPSIxIiAvPgorICAgICAgICA8cHQgeD0iMCIgeT0iMTAwIiBvbj0iMSIgLz4KKyAgICAgICAgPHB0IHg9IjEwMCIgeT0iMTAwIiBvbj0iMSIgLz4KKyAgICAgICAgPHB0IHg9IjEwMCIgeT0iMCIgb249IjEiIC8+CisgICAgICA8L2NvbnRvdXI+CisgICAgICA8aW5zdHJ1Y3Rpb25zIC8+CisgICAgPC9UVEdseXBoPgorICAgIDxUVEdseXBoIG5hbWU9IjNlbSIgeE1pbj0iMCIgeU1pbj0iMCIgeE1heD0iMzAwIiB5TWF4PSIzMDAiPgorICAgICAgPGNvbnRvdXI+CisgICAgICAgIDxwdCB4PSIwIiB5PSIwIiBvbj0iMSIgLz4KKyAgICAgICAgPHB0IHg9IjAiIHk9IjMwMCIgb249IjEiIC8+CisgICAgICAgIDxwdCB4PSIzMDAiIHk9IjMwMCIgb249IjEiIC8+CisgICAgICAgIDxwdCB4PSIzMDAiIHk9IjAiIG9uPSIxIiAvPgorICAgICAgPC9jb250b3VyPgorICAgICAgPGluc3RydWN0aW9ucyAvPgorICAgIDwvVFRHbHlwaD4KKyAgICA8VFRHbHlwaCBuYW1lPSI1ZW0iIHhNaW49IjAiIHlNaW49IjAiIHhNYXg9IjUwMCIgeU1heD0iNTAwIj4KKyAgICAgIDxjb250b3VyPgorICAgICAgICA8cHQgeD0iMCIgeT0iMCIgb249IjEiIC8+CisgICAgICAgIDxwdCB4PSIwIiB5PSI1MDAiIG9uPSIxIiAvPgorICAgICAgICA8cHQgeD0iNTAwIiB5PSI1MDAiIG9uPSIxIiAvPgorICAgICAgICA8cHQgeD0iNTAwIiB5PSIwIiBvbj0iMSIgLz4KKyAgICAgIDwvY29udG91cj4KKyAgICAgIDxpbnN0cnVjdGlvbnMgLz4KKyAgICA8L1RUR2x5cGg+CisgICAgPFRUR2x5cGggbmFtZT0iN2VtIiB4TWluPSIwIiB5TWluPSIwIiB4TWF4PSI3MDAiIHlNYXg9IjcwMCI+CisgICAgICA8Y29udG91cj4KKyAgICAgICAgPHB0IHg9IjAiIHk9IjAiIG9uPSIxIiAvPgorICAgICAgICA8cHQgeD0iMCIgeT0iNzAwIiBvbj0iMSIgLz4KKyAgICAgICAgPHB0IHg9IjcwMCIgeT0iNzAwIiBvbj0iMSIgLz4KKyAgICAgICAgPHB0IHg9IjcwMCIgeT0iMCIgb249IjEiIC8+CisgICAgICA8L2NvbnRvdXI+CisgICAgICA8aW5zdHJ1Y3Rpb25zIC8+CisgICAgPC9UVEdseXBoPgorICAgIDxUVEdseXBoIG5hbWU9IjEwZW0iIHhNaW49IjAiIHlNaW49IjAiIHhNYXg9IjEwMDAiIHlNYXg9IjEwMDAiPgorICAgICAgPGNvbnRvdXI+CisgICAgICAgIDxwdCB4PSIwIiB5PSIwIiBvbj0iMSIgLz4KKyAgICAgICAgPHB0IHg9IjAiIHk9IjEwMDAiIG9uPSIxIiAvPgorICAgICAgICA8cHQgeD0iMTAwMCIgeT0iMTAwMCIgb249IjEiIC8+CisgICAgICAgIDxwdCB4PSIxMDAwIiB5PSIwIiBvbj0iMSIgLz4KKyAgICAgIDwvY29udG91cj4KKyAgICAgIDxpbnN0cnVjdGlvbnMgLz4KKyAgICA8L1RUR2x5cGg+CisgICAgPFRUR2x5cGggbmFtZT0iNTBlbSIgeE1pbj0iMCIgeU1pbj0iMCIgeE1heD0iNTAwMCIgeU1heD0iNTAwMCI+CisgICAgICA8Y29udG91cj4KKyAgICAgICAgPHB0IHg9IjAiIHk9IjAiIG9uPSIxIiAvPgorICAgICAgICA8cHQgeD0iMCIgeT0iNTAwMCIgb249IjEiIC8+CisgICAgICAgIDxwdCB4PSI1MDAwIiB5PSI1MDAwIiBvbj0iMSIgLz4KKyAgICAgICAgPHB0IHg9IjUwMDAiIHk9IjAiIG9uPSIxIiAvPgorICAgICAgPC9jb250b3VyPgorICAgICAgPGluc3RydWN0aW9ucyAvPgorICAgIDwvVFRHbHlwaD4KKyAgICA8VFRHbHlwaCBuYW1lPSIxMDBlbSIgeE1pbj0iMCIgeU1pbj0iMCIgeE1heD0iMTAwMDAiIHlNYXg9IjEwMDAwIj4KKyAgICAgIDxjb250b3VyPgorICAgICAgICA8cHQgeD0iMCIgeT0iMCIgb249IjEiIC8+CisgICAgICAgIDxwdCB4PSIwIiB5PSIxMDAwMCIgb249IjEiIC8+CisgICAgICAgIDxwdCB4PSIxMDAwMCIgeT0iMTAwMDAiIG9uPSIxIiAvPgorICAgICAgICA8cHQgeD0iMTAwMDAiIHk9IjAiIG9uPSIxIiAvPgorICAgICAgPC9jb250b3VyPgorICAgICAgPGluc3RydWN0aW9ucyAvPgorICAgIDwvVFRHbHlwaD4KKyAgPC9nbHlmPgorCisgIDxuYW1lPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iMSIgcGxhdGZvcm1JRD0iMSIgcGxhdEVuY0lEPSIwIiBsYW5nSUQ9IjB4MCIgdW5pY29kZT0iVHJ1ZSI+CisgICAgICBGb250IGZvciBTdGF0aWNMYXlvdXRMaW5lQnJlYWtpbmdUZXN0CisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iMiIgcGxhdGZvcm1JRD0iMSIgcGxhdEVuY0lEPSIwIiBsYW5nSUQ9IjB4MCIgdW5pY29kZT0iVHJ1ZSI+CisgICAgICBSZWd1bGFyCisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iNCIgcGxhdGZvcm1JRD0iMSIgcGxhdEVuY0lEPSIwIiBsYW5nSUQ9IjB4MCIgdW5pY29kZT0iVHJ1ZSI+CisgICAgICBGb250IGZvciBTdGF0aWNMYXlvdXRMaW5lQnJlYWtpbmdUZXN0CisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iNiIgcGxhdGZvcm1JRD0iMSIgcGxhdEVuY0lEPSIwIiBsYW5nSUQ9IjB4MCIgdW5pY29kZT0iVHJ1ZSI+CisgICAgICBTYW1wbGVGb250LVJlZ3VsYXIKKyAgICA8L25hbWVyZWNvcmQ+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSIxIiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgU2FtcGxlIEZvbnQKKyAgICA8L25hbWVyZWNvcmQ+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSIyIiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgUmVndWxhcgorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjQiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBTYW1wbGUgRm9udAorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjYiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBTYW1wbGVGb250LVJlZ3VsYXIKKyAgICA8L25hbWVyZWNvcmQ+CisgIDwvbmFtZT4KKworICA8cG9zdD4KKyAgICA8Zm9ybWF0VHlwZSB2YWx1ZT0iMy4wIi8+CisgICAgPGl0YWxpY0FuZ2xlIHZhbHVlPSIwLjAiLz4KKyAgICA8dW5kZXJsaW5lUG9zaXRpb24gdmFsdWU9Ii03NSIvPgorICAgIDx1bmRlcmxpbmVUaGlja25lc3MgdmFsdWU9IjUwIi8+CisgICAgPGlzRml4ZWRQaXRjaCB2YWx1ZT0iMCIvPgorICAgIDxtaW5NZW1UeXBlNDIgdmFsdWU9IjAiLz4KKyAgICA8bWF4TWVtVHlwZTQyIHZhbHVlPSIwIi8+CisgICAgPG1pbk1lbVR5cGUxIHZhbHVlPSIwIi8+CisgICAgPG1heE1lbVR5cGUxIHZhbHVlPSIwIi8+CisgIDwvcG9zdD4KKworPC90dEZvbnQ+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZXh0L2Fzc2V0cy9mb250cy9zYW1wbGVmb250LnR0ZiBiL3Rlc3RzL3Rlc3RzL3RleHQvYXNzZXRzL2ZvbnRzL3NhbXBsZWZvbnQudHRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxOGQ2NTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy90ZXh0L2Fzc2V0cy9mb250cy9zYW1wbGVmb250LnR0ZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZXh0L3Jlcy9sYXlvdXQva2V5bGlzdGVuZXJfbGF5b3V0LnhtbCBiL3Rlc3RzL3Rlc3RzL3RleHQvcmVzL2xheW91dC9rZXlsaXN0ZW5lcl9sYXlvdXQueG1sCmluZGV4IDg0YTdhMTQuLmUyNmU4MTUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RleHQvcmVzL2xheW91dC9rZXlsaXN0ZW5lcl9sYXlvdXQueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL3RleHQvcmVzL2xheW91dC9rZXlsaXN0ZW5lcl9sYXlvdXQueG1sCkBAIC0xOSw2ICsxOSw3IEBACiAgICAgYW5kcm9pZDppZD0iQCtpZC9rZXlsaXN0ZW5lcl90ZXh0dmlldyIKICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgIGFuZHJvaWQ6dGV4dFNpemU9IjEwZHAiCi0vPgorICAgIGFuZHJvaWQ6dGV4dFNpemU9IjEwZHAiPgorICAgIDxyZXF1ZXN0Rm9jdXMgLz4KKzwvYW5kcm9pZC50ZXh0Lm1ldGhvZC5jdHMuRWRpdFRleHROb0ltZT4KIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2N0cy9BbHRlcmVkQ2hhclNlcXVlbmNlVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2N0cy9BbHRlcmVkQ2hhclNlcXVlbmNlVGVzdC5qYXZhCmluZGV4IGU4MGQyMzMuLmI2NWRjMGMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9jdHMvQWx0ZXJlZENoYXJTZXF1ZW5jZVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvY3RzL0FsdGVyZWRDaGFyU2VxdWVuY2VUZXN0LmphdmEKQEAgLTIxLDExICsyMSwxMiBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIAotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5BbHRlcmVkQ2hhclNlcXVlbmNlOwogaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmVkOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvY3RzL0FuZHJvaWRDaGFyYWN0ZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvY3RzL0FuZHJvaWRDaGFyYWN0ZXJUZXN0LmphdmEKaW5kZXggMTZhODM0NC4uZmZhMjBkZSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2N0cy9BbmRyb2lkQ2hhcmFjdGVyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9jdHMvQW5kcm9pZENoYXJhY3RlclRlc3QuamF2YQpAQCAtMjEsMTAgKzIxLDExIEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwogCi1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LkFuZHJvaWRDaGFyYWN0ZXI7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9jdHMvQW5ub3RhdGlvblRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9jdHMvQW5ub3RhdGlvblRlc3QuamF2YQppbmRleCBhNzRiYzYyLi4yOGViY2E0IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvY3RzL0Fubm90YXRpb25UZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2N0cy9Bbm5vdGF0aW9uVGVzdC5qYXZhCkBAIC0yMCwxMCArMjAsMTEgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LkFubm90YXRpb247CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9jdHMvQXV0b1RleHRUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvY3RzL0F1dG9UZXh0VGVzdC5qYXZhCmluZGV4IGUzZDFiNTIuLjE1MzlkZWIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9jdHMvQXV0b1RleHRUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2N0cy9BdXRvVGV4dFRlc3QuamF2YQpAQCAtMjMsMTMgKzIzLDE0IEBACiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LkF1dG9UZXh0OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2N0cy9CaWRpRm9ybWF0dGVyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2N0cy9CaWRpRm9ybWF0dGVyVGVzdC5qYXZhCmluZGV4IGQ1Mjc3ZjUuLmM5MjY3MjMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9jdHMvQmlkaUZvcm1hdHRlclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvY3RzL0JpZGlGb3JtYXR0ZXJUZXN0LmphdmEKQEAgLTIyLDE0ICsyMiwxNSBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKIGltcG9ydCBhbmRyb2lkLmljdS51dGlsLlVMb2NhbGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LkJpZGlGb3JtYXR0ZXI7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZVN0cmluZzsKIGltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5lZDsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dERpcmVjdGlvbkhldXJpc3RpY3M7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlJlbGF0aXZlU2l6ZVNwYW47CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9jdHMvQm9yaW5nTGF5b3V0VGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2N0cy9Cb3JpbmdMYXlvdXRUZXN0LmphdmEKaW5kZXggZTc4ZmIzZS4uNWYxN2IzMiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2N0cy9Cb3JpbmdMYXlvdXRUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2N0cy9Cb3JpbmdMYXlvdXRUZXN0LmphdmEKQEAgLTIzLDYgKzIzLDcgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5NYXRjaGVycy5hbnk7CiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1hdGNoZXJzLmFueUZsb2F0OwogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5NYXRjaGVycy5hbnlJbnQ7CkBAIC0zNiwxNSArMzcsMjAgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcC5Db25maWc7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvY2FsZUxpc3Q7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LkJvcmluZ0xheW91dDsKIGltcG9ydCBhbmRyb2lkLnRleHQuQm9yaW5nTGF5b3V0Lk1ldHJpY3M7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LkxheW91dDsKIGltcG9ydCBhbmRyb2lkLnRleHQuTGF5b3V0LkFsaWdubWVudDsKK2ltcG9ydCBhbmRyb2lkLnRleHQuUHJlY29tcHV0ZWRUZXh0OworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0RGlyZWN0aW9uSGV1cmlzdGljOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0RGlyZWN0aW9uSGV1cmlzdGljczsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFBhaW50OwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKQEAgLTM0NSw2ICszNTEsMTk0IEBACiAgICAgICAgICAgICAgICAgYW55SW50KCksIGFueUludCgpLCBhbnlGbG9hdCgpLCBhbnlGbG9hdCgpLCBhbnkoUGFpbnQuY2xhc3MpKTsKICAgICB9CiAKKyAgICBwcml2YXRlIHN0YXRpYyBCaXRtYXAgZHJhd1RvQml0bWFwKExheW91dCBsKSB7CisgICAgICAgIGZpbmFsIEJpdG1hcCBibXAgPSBCaXRtYXAuY3JlYXRlQml0bWFwKGwuZ2V0V2lkdGgoKSwgbC5nZXRIZWlnaHQoKSwgQml0bWFwLkNvbmZpZy5SR0JfNTY1KTsKKyAgICAgICAgZmluYWwgQ2FudmFzIGMgPSBuZXcgQ2FudmFzKGJtcCk7CisKKyAgICAgICAgYy5zYXZlKCk7CisgICAgICAgIGMudHJhbnNsYXRlKDAsIDApOworICAgICAgICBsLmRyYXcoYyk7CisgICAgICAgIGMucmVzdG9yZSgpOworICAgICAgICByZXR1cm4gYm1wOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB0ZXh0UGFpbnRUb1N0cmluZyhUZXh0UGFpbnQgcCkgeworICAgICAgICByZXR1cm4gInsiCisgICAgICAgICAgICArICJtVGV4dFNpemU9IiArIHAuZ2V0VGV4dFNpemUoKSArICIsICIKKyAgICAgICAgICAgICsgIm1UZXh0U2tld1g9IiArIHAuZ2V0VGV4dFNrZXdYKCkgKyAiLCAiCisgICAgICAgICAgICArICJtVGV4dFNjYWxlWD0iICsgcC5nZXRUZXh0U2NhbGVYKCkgKyAiLCAiCisgICAgICAgICAgICArICJtTGV0dGVyU3BhY2luZz0iICsgcC5nZXRMZXR0ZXJTcGFjaW5nKCkgKyAiLCAiCisgICAgICAgICAgICArICJtRmxhZ3M9IiArIHAuZ2V0RmxhZ3MoKSArICIsICIKKyAgICAgICAgICAgICsgIm1UZXh0TG9jYWxlcz0iICsgcC5nZXRUZXh0TG9jYWxlcygpICsgIiwgIgorICAgICAgICAgICAgKyAibUZvbnRWYXJpYXRpb25TZXR0aW5ncz0iICsgcC5nZXRGb250VmFyaWF0aW9uU2V0dGluZ3MoKSArICIsICIKKyAgICAgICAgICAgICsgIm1UeXBlZmFjZT0iICsgcC5nZXRUeXBlZmFjZSgpICsgIiwgIgorICAgICAgICAgICAgKyAibUZvbnRGZWF0dXJlU2V0dGluZ3M9IiArIHAuZ2V0Rm9udEZlYXR1cmVTZXR0aW5ncygpCisgICAgICAgICAgICArICJ9IjsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGlyZWN0aW9uVG9TdHJpbmcoVGV4dERpcmVjdGlvbkhldXJpc3RpYyBkaXIpIHsKKyAgICAgICAgaWYgKGRpciA9PSBUZXh0RGlyZWN0aW9uSGV1cmlzdGljcy5MVFIpIHsKKyAgICAgICAgICAgIHJldHVybiAiTFRSIjsKKyAgICAgICAgfSBlbHNlIGlmIChkaXIgPT0gVGV4dERpcmVjdGlvbkhldXJpc3RpY3MuUlRMKSB7CisgICAgICAgICAgICByZXR1cm4gIlJUTCI7CisgICAgICAgIH0gZWxzZSBpZiAoZGlyID09IFRleHREaXJlY3Rpb25IZXVyaXN0aWNzLkZJUlNUU1RST05HX0xUUikgeworICAgICAgICAgICAgcmV0dXJuICJGSVJTVFNUUk9OR19MVFIiOworICAgICAgICB9IGVsc2UgaWYgKGRpciA9PSBUZXh0RGlyZWN0aW9uSGV1cmlzdGljcy5GSVJTVFNUUk9OR19SVEwpIHsKKyAgICAgICAgICAgIHJldHVybiAiRklSU1RTVFJPTkdfUlRMIjsKKyAgICAgICAgfSBlbHNlIGlmIChkaXIgPT0gVGV4dERpcmVjdGlvbkhldXJpc3RpY3MuQU5ZUlRMX0xUUikgeworICAgICAgICAgICAgcmV0dXJuICJBTllSVExfTFRSIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmtub3duIERpcmVjdGlvbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIExheW91dFBhcmFtIHsKKyAgICAgICAgZmluYWwgaW50IG1TdHJhdGVneTsKKyAgICAgICAgZmluYWwgaW50IG1GcmVxdWVuY3k7CisgICAgICAgIGZpbmFsIFRleHRQYWludCBtUGFpbnQ7CisgICAgICAgIGZpbmFsIFRleHREaXJlY3Rpb25IZXVyaXN0aWMgbURpcjsKKworICAgICAgICBMYXlvdXRQYXJhbShpbnQgc3RyYXRlZ3ksIGludCBmcmVxdWVuY3ksIFRleHRQYWludCBwYWludCwgVGV4dERpcmVjdGlvbkhldXJpc3RpYyBkaXIpIHsKKyAgICAgICAgICAgIG1TdHJhdGVneSA9IHN0cmF0ZWd5OworICAgICAgICAgICAgbUZyZXF1ZW5jeSA9IGZyZXF1ZW5jeTsKKyAgICAgICAgICAgIG1QYWludCA9IG5ldyBUZXh0UGFpbnQocGFpbnQpOworICAgICAgICAgICAgbURpciA9IGRpcjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJ7IgorICAgICAgICAgICAgICAgICsgIm1TdHJhdGVneT0iICsgbVN0cmF0ZWd5ICsgIiwgIgorICAgICAgICAgICAgICAgICsgIm1GcmVxdWVuY3k9IiArIG1GcmVxdWVuY3kgKyAiLCAiCisgICAgICAgICAgICAgICAgKyAibVBhaW50PSIgKyB0ZXh0UGFpbnRUb1N0cmluZyhtUGFpbnQpICsgIiwgIgorICAgICAgICAgICAgICAgICsgIm1EaXI9IiArIGRpcmVjdGlvblRvU3RyaW5nKG1EaXIpCisgICAgICAgICAgICAgICAgKyAifSI7CisKKyAgICAgICAgfQorCisgICAgICAgIFByZWNvbXB1dGVkVGV4dCBnZXRQcmVjb21wdXRlZFRleHQoQ2hhclNlcXVlbmNlIHRleHQpIHsKKyAgICAgICAgICAgIFByZWNvbXB1dGVkVGV4dC5QYXJhbXMgcGFyYW0gPSBuZXcgUHJlY29tcHV0ZWRUZXh0LlBhcmFtcy5CdWlsZGVyKG1QYWludCkKKyAgICAgICAgICAgICAgICAgICAgLnNldEJyZWFrU3RyYXRlZ3kobVN0cmF0ZWd5KQorICAgICAgICAgICAgICAgICAgICAuc2V0SHlwaGVuYXRpb25GcmVxdWVuY3kobUZyZXF1ZW5jeSkKKyAgICAgICAgICAgICAgICAgICAgLnNldFRleHREaXJlY3Rpb24obURpcikuYnVpbGQoKTsKKyAgICAgICAgICAgIHJldHVybiBQcmVjb21wdXRlZFRleHQuY3JlYXRlKHRleHQsIHBhcmFtKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICB2b2lkIGFzc2VydFNhbWVEcmF3T3V0cHV0KAorICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQsCisgICAgICAgICAgICBMYXlvdXRQYXJhbSBtZWFzdXJlZFRleHRQYXJhbSwKKyAgICAgICAgICAgIFRleHRQYWludCBsYXlvdXRQYWludCkgeworICAgICAgICBTdHJpbmcgbXNnID0gIkJvcmluZ0xheW91dCNkcmF3IGZvciBTdHJpbmcgYW5kIFByZWNvbXB1dGVkVGV4dCB3aXRoICIgKyBtZWFzdXJlZFRleHRQYXJhbQorICAgICAgICAgICAgICAgICsgIiBtdXN0IG91dHB1dCB0aGUgc2FtZSBCTVAuIjsKKworICAgICAgICBmaW5hbCBCb3JpbmdMYXlvdXQuTWV0cmljcyBtZXRyaWNzV2l0aFN0cmluZyA9IEJvcmluZ0xheW91dC5pc0JvcmluZyh0ZXh0LCBsYXlvdXRQYWludCk7CisgICAgICAgIGZpbmFsIExheW91dCBsYXlvdXRXaXRoU3RyaW5nID0gQm9yaW5nTGF5b3V0Lm1ha2UoCisgICAgICAgICAgICAgICAgdGV4dCwgbGF5b3V0UGFpbnQsIG1ldHJpY3NXaXRoU3RyaW5nLndpZHRoLCBBbGlnbm1lbnQuQUxJR05fTk9STUFMLAorICAgICAgICAgICAgICAgIFNQQUNJTkdfTVVMVF9OT19TQ0FMRSwgU1BBQ0lOR19BRERfTk9fU0NBTEUsIERFRkFVTFRfTUVUUklDUywKKyAgICAgICAgICAgICAgICB0cnVlIC8qIGluY2x1ZGUgcGFkZGluZyAqLyk7CisKKyAgICAgICAgZmluYWwgUHJlY29tcHV0ZWRUZXh0IHByZWNvbXB1dGVkID0gbWVhc3VyZWRUZXh0UGFyYW0uZ2V0UHJlY29tcHV0ZWRUZXh0KHRleHQpOworICAgICAgICBmaW5hbCBCb3JpbmdMYXlvdXQuTWV0cmljcyBtZXRyaWNzV2l0aFByZWNvbXB1dGVkID0gQm9yaW5nTGF5b3V0LmlzQm9yaW5nKAorICAgICAgICAgICAgICAgIHByZWNvbXB1dGVkLCBsYXlvdXRQYWludCk7CisgICAgICAgIGZpbmFsIExheW91dCBsYXlvdXRXaXRoUHJlY29tcHV0ZWQgPSBCb3JpbmdMYXlvdXQubWFrZSgKKyAgICAgICAgICAgICAgICBwcmVjb21wdXRlZCwgbGF5b3V0UGFpbnQsIG1ldHJpY3NXaXRoUHJlY29tcHV0ZWQud2lkdGgsIEFsaWdubWVudC5BTElHTl9OT1JNQUwsCisgICAgICAgICAgICAgICAgU1BBQ0lOR19NVUxUX05PX1NDQUxFLCBTUEFDSU5HX0FERF9OT19TQ0FMRSwgREVGQVVMVF9NRVRSSUNTLAorICAgICAgICAgICAgICAgIHRydWUgLyogaW5jbHVkZSBwYWRkaW5nICovKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMobXNnLCBsYXlvdXRXaXRoU3RyaW5nLmdldEhlaWdodCgpLCBsYXlvdXRXaXRoUHJlY29tcHV0ZWQuZ2V0SGVpZ2h0KCksIDAuMGYpOworCisgICAgICAgIGZpbmFsIEJpdG1hcCBleHBlY3RlZEJNUCA9IGRyYXdUb0JpdG1hcChsYXlvdXRXaXRoU3RyaW5nKTsKKyAgICAgICAgZmluYWwgQml0bWFwIHJlc3VsdEJNUCA9IGRyYXdUb0JpdG1hcChsYXlvdXRXaXRoUHJlY29tcHV0ZWQpOworCisgICAgICAgIGFzc2VydFRydWUobXNnLCByZXN1bHRCTVAuc2FtZUFzKGV4cGVjdGVkQk1QKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlY29tcHV0ZWRUZXh0KCkgeworICAgICAgICBpbnRbXSBicmVha3MgPSB7CisgICAgICAgICAgICBMYXlvdXQuQlJFQUtfU1RSQVRFR1lfU0lNUExFLAorICAgICAgICAgICAgTGF5b3V0LkJSRUFLX1NUUkFURUdZX0hJR0hfUVVBTElUWSwKKyAgICAgICAgICAgIExheW91dC5CUkVBS19TVFJBVEVHWV9CQUxBTkNFRCwKKyAgICAgICAgfTsKKworICAgICAgICBpbnRbXSBmcmVxdWVuY2llcyA9IHsKKyAgICAgICAgICAgIExheW91dC5IWVBIRU5BVElPTl9GUkVRVUVOQ1lfTk9STUFMLAorICAgICAgICAgICAgTGF5b3V0LkhZUEhFTkFUSU9OX0ZSRVFVRU5DWV9GVUxMLAorICAgICAgICAgICAgTGF5b3V0LkhZUEhFTkFUSU9OX0ZSRVFVRU5DWV9OT05FLAorICAgICAgICB9OworCisgICAgICAgIFRleHREaXJlY3Rpb25IZXVyaXN0aWNbXSBkaXJzID0geworICAgICAgICAgICAgVGV4dERpcmVjdGlvbkhldXJpc3RpY3MuTFRSLAorICAgICAgICAgICAgVGV4dERpcmVjdGlvbkhldXJpc3RpY3MuUlRMLAorICAgICAgICAgICAgVGV4dERpcmVjdGlvbkhldXJpc3RpY3MuRklSU1RTVFJPTkdfTFRSLAorICAgICAgICAgICAgVGV4dERpcmVjdGlvbkhldXJpc3RpY3MuRklSU1RTVFJPTkdfUlRMLAorICAgICAgICAgICAgVGV4dERpcmVjdGlvbkhldXJpc3RpY3MuQU5ZUlRMX0xUUiwKKyAgICAgICAgfTsKKworICAgICAgICBmbG9hdFtdIHRleHRTaXplcyA9IHsKKyAgICAgICAgICAgIDguMGYsIDE2LjBmLCAzMi4wZgorICAgICAgICB9OworCisgICAgICAgIExvY2FsZUxpc3RbXSBsb2NhbGVzID0geworICAgICAgICAgICAgTG9jYWxlTGlzdC5mb3JMYW5ndWFnZVRhZ3MoImVuLVVTIiksCisgICAgICAgICAgICBMb2NhbGVMaXN0LmZvckxhbmd1YWdlVGFncygiamEtSlAiKSwKKyAgICAgICAgICAgIExvY2FsZUxpc3QuZm9yTGFuZ3VhZ2VUYWdzKCJlbi1VUyxqYS1KUCIpLAorICAgICAgICB9OworCisgICAgICAgIFN0cmluZyBvbmVsaW5lVGV4dCA9ICJIZWxsbywgV29ybGQuIjsKKworICAgICAgICBUZXh0UGFpbnQgcGFpbnQgPSBuZXcgVGV4dFBhaW50KCk7CisKKyAgICAgICAgLy8gSWYgdGhlIFByZWNvbXB1dGVkVGV4dCBpcyBjcmVhdGVkIHdpdGggdGhlIHNhbWUgUGFpbnQsIHRoZSBkcmF3IHJlc3VsdCBtdXN0IGJlIHRoZSBzYW1lLgorICAgICAgICBmb3IgKGludCBiIDogYnJlYWtzKSB7CisgICAgICAgICAgICBmb3IgKGludCBmIDogZnJlcXVlbmNpZXMpIHsKKyAgICAgICAgICAgICAgICBmb3IgKFRleHREaXJlY3Rpb25IZXVyaXN0aWMgZGlyIDogZGlycykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGZsb2F0IHRleHRTaXplIDogdGV4dFNpemVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKExvY2FsZUxpc3QgbG9jYWxlIDogbG9jYWxlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50LnNldFRleHRTaXplKHRleHRTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWludC5zZXRUZXh0TG9jYWxlcyhsb2NhbGUpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0U2FtZURyYXdPdXRwdXQob25lbGluZVRleHQsIG5ldyBMYXlvdXRQYXJhbShiLCBmLCBwYWludCwgZGlyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEV2ZW4gaWYgdGhlIHBhcmFtZXRlcnMgYXJlIGRpZmZlcmVudCwgdGhlIG91dHB1dCBvZiB0aGUgc3RhdGljIGxheW91dCBtdXN0IGJlCisgICAgICAgIC8vIHNhbWUgYml0bWFwLgorICAgICAgICBmb3IgKGludCBiaSA9IDA7IGJpIDwgYnJlYWtzLmxlbmd0aDsgYmkrKykgeworICAgICAgICAgICAgZm9yIChpbnQgZmkgPSAwOyBmaSA8IGZyZXF1ZW5jaWVzLmxlbmd0aDsgZmkrKykgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGRpcmkgPSAwOyBkaXJpIDwgZGlycy5sZW5ndGg7IGRpcmkrKykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBzaXplaSA9IDA7IHNpemVpIDwgdGV4dFNpemVzLmxlbmd0aDsgc2l6ZWkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbG9jYWxlaSA9IDA7IGxvY2FsZWkgPCBsb2NhbGVzLmxlbmd0aDsgbG9jYWxlaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFBhaW50IHByZWNvbXB1dGVkUGFpbnQgPSBuZXcgVGV4dFBhaW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFBhaW50IGxheW91dFBhaW50ID0gbmV3IFRleHRQYWludCgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY29tcHV0ZWRQYWludC5zZXRUZXh0U2l6ZSh0ZXh0U2l6ZXNbc2l6ZWldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXRQYWludC5zZXRUZXh0U2l6ZSh0ZXh0U2l6ZXNbKHNpemVpICsgMSkgJSB0ZXh0U2l6ZXMubGVuZ3RoXSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjb21wdXRlZFBhaW50LnNldFRleHRMb2NhbGVzKGxvY2FsZXNbbG9jYWxlaV0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dFBhaW50LnNldFRleHRMb2NhbGVzKGxvY2FsZXNbKGxvY2FsZWkgKyAxKSAlIGxvY2FsZXMubGVuZ3RoXSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYiA9IGJyZWFrc1tiaV07CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZiA9IGZyZXF1ZW5jaWVzW2ZpXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHREaXJlY3Rpb25IZXVyaXN0aWMgZGlyID0gZGlyc1tkaXJpXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFNhbWVEcmF3T3V0cHV0KG9uZWxpbmVUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IExheW91dFBhcmFtKGIsIGYsIHByZWNvbXB1dGVkUGFpbnQsIGRpciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXRQYWludCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICBwcml2YXRlIHN0YXRpYyBNZXRyaWNzIGNyZWF0ZU1ldHJpY3MoCiAgICAgICAgICAgICBmaW5hbCBpbnQgdG9wLAogICAgICAgICAgICAgZmluYWwgaW50IGFzY2VudCwKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9jdHMvQm9yaW5nTGF5b3V0X01ldHJpY3NUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvY3RzL0JvcmluZ0xheW91dF9NZXRyaWNzVGVzdC5qYXZhCmluZGV4IDNkYzRiNzMuLmVkYjM5Y2YgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9jdHMvQm9yaW5nTGF5b3V0X01ldHJpY3NUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2N0cy9Cb3JpbmdMYXlvdXRfTWV0cmljc1Rlc3QuamF2YQpAQCAtMTgsMTAgKzE4LDExIEBACiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwogCi1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LkJvcmluZ0xheW91dDsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2N0cy9DbGlwYm9hcmRNYW5hZ2VyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2N0cy9DbGlwYm9hcmRNYW5hZ2VyVGVzdC5qYXZhCmluZGV4IDAwNzNjNDIuLjhkMWY0YjUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9jdHMvQ2xpcGJvYXJkTWFuYWdlclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvY3RzL0NsaXBib2FyZE1hbmFnZXJUZXN0LmphdmEKQEAgLTIxLDEyICsyMSwxMSBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnRleHQuQ2xpcGJvYXJkTWFuYWdlcjsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpAQCAtMzQsMTkgKzMzLDE2IEBACiAvKioKICAqIFRlc3Qge0BsaW5rIENsaXBib2FyZE1hbmFnZXJ9LgogICovCi1AU21hbGxUZXN0CiBAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQogcHVibGljIGNsYXNzIENsaXBib2FyZE1hbmFnZXJUZXN0IHsKICAgICBwcml2YXRlIENsaXBib2FyZE1hbmFnZXIgbUNsaXBib2FyZE1hbmFnZXI7CiAKLSAgICBAVWlUaHJlYWRUZXN0CiAgICAgQEJlZm9yZQogICAgIHB1YmxpYyB2b2lkIHNldHVwKCkgewogICAgICAgICBmaW5hbCBDb250ZXh0IGNvbnRleHQgPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRUYXJnZXRDb250ZXh0KCk7CiAgICAgICAgIG1DbGlwYm9hcmRNYW5hZ2VyID0gKENsaXBib2FyZE1hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkNMSVBCT0FSRF9TRVJWSUNFKTsKICAgICB9CiAKLSAgICBAVWlUaHJlYWRUZXN0CiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzVGV4dCgpIHsKICAgICAgICAgLy8gc2V0IHRoZSBleHBlY3RlZCB2YWx1ZQpAQCAtNTUsNyArNTEsNiBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIG1DbGlwYm9hcmRNYW5hZ2VyLmdldFRleHQoKSk7CiAgICAgfQogCi0gICAgQFVpVGhyZWFkVGVzdAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEhhc1RleHQoKSB7CiAgICAgICAgIG1DbGlwYm9hcmRNYW5hZ2VyLnNldFRleHQoIiIpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2N0cy9EeW5hbWljTGF5b3V0VGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2N0cy9EeW5hbWljTGF5b3V0VGVzdC5qYXZhCmluZGV4IDAyMTM5YzUuLjk1MzcyNDMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9jdHMvRHluYW1pY0xheW91dFRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvY3RzL0R5bmFtaWNMYXlvdXRUZXN0LmphdmEKQEAgLTE3LDIxICsxNywyNiBAQAogcGFja2FnZSBhbmRyb2lkLnRleHQuY3RzOwogCiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudGV4dC5MYXlvdXQuQWxpZ25tZW50LkFMSUdOX05PUk1BTDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC50ZXh0LlNwYW5uZWQuU1BBTl9FWENMVVNJVkVfRVhDTFVTSVZFOwogCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLm1vY2s7CiAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50LkZvbnRNZXRyaWNzSW50OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5EeW5hbWljTGF5b3V0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5MYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZVN0cmluZ0J1aWxkZXI7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlN0YXRpY0xheW91dDsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFBhaW50OwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CitpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlR5cGVmYWNlU3BhbjsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CkBAIC00NCw2ICs0OSw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgU1BBQ0lOR19NVUxUX05PX1NDQUxFID0gMS4wZjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBTUEFDSU5HX0FERF9OT19TQ0FMRSA9IDAuMGY7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfT1VURVJfV0lEVEggPSAxNTA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVMTElQU0laRV9XSURUSCA9IDg7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2hhclNlcXVlbmNlIFNJTkdMRUxJTkVfQ0hBUl9TRVFVRU5DRSA9ICIuLi4uLi4iOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFRFWFQgPSB7IkNoYXJTZXF1ZW5jZVxuIiwgIkNoYXJcdFNlcXVlbmNlXG4iLCAiQ2hhclNlcXVlbmNlIn07CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2hhclNlcXVlbmNlIE1VTFRMSU5FX0NIQVJfU0VRVUVOQ0UgPSBURVhUWzBdICsgVEVYVFsxXSArIFRFWFRbMl07CkBAIC0xOTQsNiArMjAwLDYyIEBACiAgICAgICAgIGFzc2VydEVxdWFscyhURVhUWzBdLmxlbmd0aCgpICsgVEVYVFsxXS5sZW5ndGgoKSwgbUR5bmFtaWNMYXlvdXQuZ2V0TGluZVN0YXJ0KExJTkUyKSk7CiAgICAgfQogCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGluZVNwYWNpbmcoKSB7CisgICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgdGV4dCA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKCJhXG5iXG5jIik7CisgICAgICAgIGZpbmFsIGZsb2F0IHNwYWNpbmdNdWx0aXBsaWVyID0gMmY7CisgICAgICAgIGZpbmFsIGZsb2F0IHNwYWNpbmdBZGQgPSA0OworICAgICAgICBmaW5hbCBpbnQgd2lkdGggPSAxMDAwOworICAgICAgICBmaW5hbCBUZXh0UGFpbnQgdGV4dFBhaW50ID0gbmV3IFRleHRQYWludCgpOworICAgICAgICAvLyBjcmVhdGUgdGhlIER5bmFtaWNMYXlvdXQKKyAgICAgICAgZmluYWwgRHluYW1pY0xheW91dCBkeW5hbWljTGF5b3V0ID0gbmV3IER5bmFtaWNMYXlvdXQodGV4dCwKKyAgICAgICAgICAgICAgICB0ZXh0UGFpbnQsCisgICAgICAgICAgICAgICAgd2lkdGgsCisgICAgICAgICAgICAgICAgQUxJR05fTk9STUFMLAorICAgICAgICAgICAgICAgIHNwYWNpbmdNdWx0aXBsaWVyLAorICAgICAgICAgICAgICAgIHNwYWNpbmdBZGQsCisgICAgICAgICAgICAgICAgZmFsc2UgLyppbmNsdWRlcGFkKi8pOworCisgICAgICAgIC8vIGNyZWF0ZSBhIFN0YXRpY0xheW91dCB3aXRoIHNhbWUgdGV4dCwgdGhpcyB3aWxsIGRlZmluZSB0aGUgZXhwZWN0YXRpb25zCisgICAgICAgIExheW91dCBleHBlY3RlZCA9IGNyZWF0ZVN0YXRpY0xheW91dCh0ZXh0LnRvU3RyaW5nKCksIHRleHRQYWludCwgd2lkdGgsIHNwYWNpbmdBZGQsCisgICAgICAgICAgICAgICAgc3BhY2luZ011bHRpcGxpZXIpOworICAgICAgICBhc3NlcnRMaW5lU3BlY3MoZXhwZWN0ZWQsIGR5bmFtaWNMYXlvdXQpOworCisgICAgICAgIC8vIGFkZCBhIG5ldyBsaW5lIHRvIHRoZSBlbmQsIER5bmFtaWNMYXlvdXQgd2lsbCByZS1jYWxjdWxhdGUKKyAgICAgICAgdGV4dCA9IHRleHQuYXBwZW5kKCJcbmQiKTsKKyAgICAgICAgZXhwZWN0ZWQgPSBjcmVhdGVTdGF0aWNMYXlvdXQodGV4dC50b1N0cmluZygpLCB0ZXh0UGFpbnQsIHdpZHRoLCBzcGFjaW5nQWRkLAorICAgICAgICAgICAgICAgIHNwYWNpbmdNdWx0aXBsaWVyKTsKKyAgICAgICAgYXNzZXJ0TGluZVNwZWNzKGV4cGVjdGVkLCBkeW5hbWljTGF5b3V0KTsKKworICAgICAgICAvLyBpbnNlcnQgYSBuZXh0IGxpbmUgYW5kIGEgY2hhciBhcyB0aGUgbmV3IHNlY29uZCBsaW5lCisgICAgICAgIHRleHQgPSB0ZXh0Lmluc2VydChUZXh0VXRpbHMuaW5kZXhPZih0ZXh0LCAnXG4nKSArIDEsICJhMVxuIik7CisgICAgICAgIGV4cGVjdGVkID0gY3JlYXRlU3RhdGljTGF5b3V0KHRleHQudG9TdHJpbmcoKSwgdGV4dFBhaW50LCB3aWR0aCwgc3BhY2luZ0FkZCwKKyAgICAgICAgICAgICAgICBzcGFjaW5nTXVsdGlwbGllcik7CisgICAgICAgIGFzc2VydExpbmVTcGVjcyhleHBlY3RlZCwgZHluYW1pY0xheW91dCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGluZVNwYWNpbmdfdGV4dEVuZGluZ1dpdGhOZXh0TGluZSgpIHsKKyAgICAgICAgZmluYWwgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciB0ZXh0ID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIoImFcbiIpOworICAgICAgICBmaW5hbCBmbG9hdCBzcGFjaW5nTXVsdGlwbGllciA9IDJmOworICAgICAgICBmaW5hbCBmbG9hdCBzcGFjaW5nQWRkID0gNGY7CisgICAgICAgIGZpbmFsIGludCB3aWR0aCA9IDEwMDA7CisgICAgICAgIGZpbmFsIFRleHRQYWludCB0ZXh0UGFpbnQgPSBuZXcgVGV4dFBhaW50KCk7CisgICAgICAgIC8vIGNyZWF0ZSB0aGUgRHluYW1pY0xheW91dAorICAgICAgICBmaW5hbCBEeW5hbWljTGF5b3V0IGR5bmFtaWNMYXlvdXQgPSBuZXcgRHluYW1pY0xheW91dCh0ZXh0LAorICAgICAgICAgICAgICAgIHRleHRQYWludCwKKyAgICAgICAgICAgICAgICB3aWR0aCwKKyAgICAgICAgICAgICAgICBBTElHTl9OT1JNQUwsCisgICAgICAgICAgICAgICAgc3BhY2luZ011bHRpcGxpZXIsCisgICAgICAgICAgICAgICAgc3BhY2luZ0FkZCwKKyAgICAgICAgICAgICAgICBmYWxzZSAvKmluY2x1ZGVwYWQqLyk7CisKKyAgICAgICAgLy8gY3JlYXRlIGEgU3RhdGljTGF5b3V0IHdpdGggc2FtZSB0ZXh0LCB0aGlzIHdpbGwgZGVmaW5lIHRoZSBleHBlY3RhdGlvbnMKKyAgICAgICAgZmluYWwgTGF5b3V0IGV4cGVjdGVkID0gY3JlYXRlU3RhdGljTGF5b3V0KHRleHQudG9TdHJpbmcoKSwgdGV4dFBhaW50LCB3aWR0aCwgc3BhY2luZ0FkZCwKKyAgICAgICAgICAgICAgICBzcGFjaW5nTXVsdGlwbGllcik7CisgICAgICAgIGFzc2VydExpbmVTcGVjcyhleHBlY3RlZCwgZHluYW1pY0xheW91dCk7CisgICAgfQorCiAgICAgcHJpdmF0ZSBMYXlvdXQgY3JlYXRlU3RhdGljTGF5b3V0KENoYXJTZXF1ZW5jZSB0ZXh0LCBUZXh0UGFpbnQgdGV4dFBhaW50LCBpbnQgd2lkdGgsCiAgICAgICAgICAgICBmbG9hdCBzcGFjaW5nQWRkLCBmbG9hdCBzcGFjaW5nTXVsdGlwbGllcikgewogICAgICAgICByZXR1cm4gU3RhdGljTGF5b3V0LkJ1aWxkZXIub2J0YWluKHRleHQsIDAsCkBAIC0yNTMsNCArMzE1LDExMCBAQAogICAgICAgICAgICAgICAgIHNwYWNpbmdNdWx0aXBsaWVyKTsKICAgICAgICAgYXNzZXJ0TGluZVNwZWNzKGV4cGVjdGVkLCBkeW5hbWljTGF5b3V0KTsKICAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCdWlsZGVyX29idGFpbigpIHsKKyAgICAgICAgZmluYWwgRHluYW1pY0xheW91dC5CdWlsZGVyIGJ1aWxkZXIgPSBEeW5hbWljTGF5b3V0LkJ1aWxkZXIub2J0YWluKE1VTFRMSU5FX0NIQVJfU0VRVUVOQ0UsCisgICAgICAgICAgICAgICAgbURlZmF1bHRQYWludCwgREVGQVVMVF9PVVRFUl9XSURUSCk7CisgICAgICAgIGZpbmFsIER5bmFtaWNMYXlvdXQgbGF5b3V0ID0gYnVpbGRlci5idWlsZCgpOworICAgICAgICAvLyBDaGVjayB2YWx1ZXMgcGFzc2VkIHRvIG9idGFpbigpLgorICAgICAgICBhc3NlcnRFcXVhbHMoTVVMVExJTkVfQ0hBUl9TRVFVRU5DRSwgbGF5b3V0LmdldFRleHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtRGVmYXVsdFBhaW50LCBsYXlvdXQuZ2V0UGFpbnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhERUZBVUxUX09VVEVSX1dJRFRILCBsYXlvdXQuZ2V0V2lkdGgoKSk7CisgICAgICAgIC8vIENoZWNrIGRlZmF1bHQgdmFsdWVzLgorICAgICAgICBhc3NlcnRFcXVhbHMoTGF5b3V0LkFsaWdubWVudC5BTElHTl9OT1JNQUwsIGxheW91dC5nZXRBbGlnbm1lbnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLjBmLCBsYXlvdXQuZ2V0U3BhY2luZ0FkZCgpLCAwLjBmKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEuMGYsIGxheW91dC5nZXRTcGFjaW5nTXVsdGlwbGllcigpLCAwLjBmKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKERFRkFVTFRfT1VURVJfV0lEVEgsIGxheW91dC5nZXRFbGxpcHNpemVkV2lkdGgoKSk7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBOdWxsUG9pbnRlckV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QnVpbGRlcl9vYnRhaW5XaXRoTnVsbFRleHQoKSB7CisgICAgICAgIGZpbmFsIER5bmFtaWNMYXlvdXQuQnVpbGRlciBidWlsZGVyID0gRHluYW1pY0xheW91dC5CdWlsZGVyLm9idGFpbihudWxsLCBtRGVmYXVsdFBhaW50LCAwKTsKKyAgICAgICAgZmluYWwgRHluYW1pY0xheW91dCBsYXlvdXQgPSBidWlsZGVyLmJ1aWxkKCk7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBOdWxsUG9pbnRlckV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QnVpbGRlcl9vYnRhaW5XaXRoTnVsbFBhaW50KCkgeworICAgICAgICBmaW5hbCBEeW5hbWljTGF5b3V0LkJ1aWxkZXIgYnVpbGRlciA9IER5bmFtaWNMYXlvdXQuQnVpbGRlci5vYnRhaW4oTVVMVExJTkVfQ0hBUl9TRVFVRU5DRSwKKyAgICAgICAgICAgICAgICBudWxsLCAwKTsKKyAgICAgICAgZmluYWwgRHluYW1pY0xheW91dCBsYXlvdXQgPSBidWlsZGVyLmJ1aWxkKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QnVpbGRlcl9zZXREaXNwbGF5VGVzdCgpIHsKKyAgICAgICAgZmluYWwgRHluYW1pY0xheW91dC5CdWlsZGVyIGJ1aWxkZXIgPSBEeW5hbWljTGF5b3V0LkJ1aWxkZXIub2J0YWluKE1VTFRMSU5FX0NIQVJfU0VRVUVOQ0UsCisgICAgICAgICAgICAgICAgbURlZmF1bHRQYWludCwgREVGQVVMVF9PVVRFUl9XSURUSCk7CisgICAgICAgIGJ1aWxkZXIuc2V0RGlzcGxheVRleHQoU0lOR0xFTElORV9DSEFSX1NFUVVFTkNFKTsKKyAgICAgICAgZmluYWwgRHluYW1pY0xheW91dCBsYXlvdXQgPSBidWlsZGVyLmJ1aWxkKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhTSU5HTEVMSU5FX0NIQVJfU0VRVUVOQ0UsIGxheW91dC5nZXRUZXh0KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJ1aWxkZXJfc2V0QWxpZ25tZW50KCkgeworICAgICAgICBmaW5hbCBEeW5hbWljTGF5b3V0LkJ1aWxkZXIgYnVpbGRlciA9IER5bmFtaWNMYXlvdXQuQnVpbGRlci5vYnRhaW4oTVVMVExJTkVfQ0hBUl9TRVFVRU5DRSwKKyAgICAgICAgICAgICAgICBtRGVmYXVsdFBhaW50LCBERUZBVUxUX09VVEVSX1dJRFRIKTsKKyAgICAgICAgYnVpbGRlci5zZXRBbGlnbm1lbnQoREVGQVVMVF9BTElHTik7CisgICAgICAgIGZpbmFsIER5bmFtaWNMYXlvdXQgbGF5b3V0ID0gYnVpbGRlci5idWlsZCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoREVGQVVMVF9BTElHTiwgbGF5b3V0LmdldEFsaWdubWVudCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCdWlsZGVyX3NldExpbmVTcGFjaW5nKCkgeworICAgICAgICBmaW5hbCBEeW5hbWljTGF5b3V0LkJ1aWxkZXIgYnVpbGRlciA9IER5bmFtaWNMYXlvdXQuQnVpbGRlci5vYnRhaW4oTVVMVExJTkVfQ0hBUl9TRVFVRU5DRSwKKyAgICAgICAgICAgICAgICBtRGVmYXVsdFBhaW50LCBERUZBVUxUX09VVEVSX1dJRFRIKTsKKyAgICAgICAgYnVpbGRlci5zZXRMaW5lU3BhY2luZygxLjBmLCAyLjBmKTsKKyAgICAgICAgZmluYWwgRHluYW1pY0xheW91dCBsYXlvdXQgPSBidWlsZGVyLmJ1aWxkKCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLjBmLCBsYXlvdXQuZ2V0U3BhY2luZ0FkZCgpLCAwLjBmKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIuMGYsIGxheW91dC5nZXRTcGFjaW5nTXVsdGlwbGllcigpLCAwLjBmKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCdWlsZGVyX2VsbGlwc2l6YXRpb24oKSB7CisgICAgICAgIGZpbmFsIER5bmFtaWNMYXlvdXQuQnVpbGRlciBidWlsZGVyID0gRHluYW1pY0xheW91dC5CdWlsZGVyLm9idGFpbihNVUxUTElORV9DSEFSX1NFUVVFTkNFLAorICAgICAgICAgICAgICAgIG1EZWZhdWx0UGFpbnQsIERFRkFVTFRfT1VURVJfV0lEVEgpOworICAgICAgICBidWlsZGVyLnNldEVsbGlwc2l6ZShUZXh0VXRpbHMuVHJ1bmNhdGVBdC5FTkQpCisgICAgICAgICAgICAgICAgLnNldEVsbGlwc2l6ZWRXaWR0aChFTExJUFNJWkVfV0lEVEgpOworICAgICAgICBmaW5hbCBEeW5hbWljTGF5b3V0IGxheW91dCA9IGJ1aWxkZXIuYnVpbGQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEVMTElQU0laRV9XSURUSCwgbGF5b3V0LmdldEVsbGlwc2l6ZWRXaWR0aCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKERFRkFVTFRfT1VURVJfV0lEVEgsIGxheW91dC5nZXRXaWR0aCgpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBURVhULmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaSA9PSBURVhULmxlbmd0aCAtIDEpIHsgLy8gbGFzdCBsaW5lCisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShsYXlvdXQuZ2V0RWxsaXBzaXNDb3VudChpKSA+IDApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbGF5b3V0LmdldEVsbGlwc2lzQ291bnQoaSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QnVpbGRlcl9vdGhlclNldHRlcnMoKSB7CisgICAgICAgIC8vIFNldHRlciBtZXRob2RzIHRoYXQgY2Fubm90IGJlIGRpcmVjdGx5IHRlc3RlZC4KKyAgICAgICAgLy8gc2V0QnJlYWtTdHJhdGVneSwgc2V0SHlwaGVuYXRpb25GcmVxdWVuY3ksIHNldEluY2x1ZGVQYWQsIGFuZCBzZXRKdXN0aWZpY2F0aW9uTW9kZS4KKyAgICAgICAgZmluYWwgRHluYW1pY0xheW91dC5CdWlsZGVyIGJ1aWxkZXIgPSBEeW5hbWljTGF5b3V0LkJ1aWxkZXIub2J0YWluKE1VTFRMSU5FX0NIQVJfU0VRVUVOQ0UsCisgICAgICAgICAgICAgICAgbURlZmF1bHRQYWludCwgREVGQVVMVF9PVVRFUl9XSURUSCk7CisgICAgICAgIGJ1aWxkZXIuc2V0QnJlYWtTdHJhdGVneShMYXlvdXQuQlJFQUtfU1RSQVRFR1lfSElHSF9RVUFMSVRZKQorICAgICAgICAgICAgICAgIC5zZXRIeXBoZW5hdGlvbkZyZXF1ZW5jeShMYXlvdXQuSFlQSEVOQVRJT05fRlJFUVVFTkNZX0ZVTEwpCisgICAgICAgICAgICAgICAgLnNldEluY2x1ZGVQYWQodHJ1ZSkKKyAgICAgICAgICAgICAgICAuc2V0SnVzdGlmaWNhdGlvbk1vZGUoTGF5b3V0LkpVU1RJRklDQVRJT05fTU9ERV9JTlRFUl9XT1JEKTsKKyAgICAgICAgZmluYWwgRHluYW1pY0xheW91dCBsYXlvdXQgPSBidWlsZGVyLmJ1aWxkKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwobGF5b3V0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWZsb3dfYWZ0ZXJTcGFuQ2hhbmdlZFNob3VsZE5vdFRocm93RXhjZXB0aW9uKCkgeworICAgICAgICBmaW5hbCBTcGFubmFibGVTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcigiY3Jhc2ggY3Jhc2ggY3Jhc2ghISIpOworCisgICAgICAgIGZpbmFsIFR5cGVmYWNlU3BhbiBzcGFuID0gbW9jayhUeXBlZmFjZVNwYW4uY2xhc3MpOworICAgICAgICBidWlsZGVyLnNldFNwYW4oc3BhbiwgMSwgNCwgU1BBTl9FWENMVVNJVkVfRVhDTFVTSVZFKTsKKworICAgICAgICBmaW5hbCBEeW5hbWljTGF5b3V0IGxheW91dCA9IER5bmFtaWNMYXlvdXQuQnVpbGRlci5vYnRhaW4oYnVpbGRlciwKKyAgICAgICAgICAgICAgICBuZXcgVGV4dFBhaW50KCksIEludGVnZXIuTUFYX1ZBTFVFKS5idWlsZCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYnVpbGRlci5pbnNlcnQoMSwgIkhlbGxvIHRoZXJlXG5cbiIpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkluc2VydGluZyB0ZXh0IGludG8gRHluYW1pY0xheW91dCBzaG91bGQgbm90IGNyYXNoIiwgZSk7CisgICAgICAgIH0KKyAgICB9CisKIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9jdHMvRWRpdGFibGVfRmFjdG9yeVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9jdHMvRWRpdGFibGVfRmFjdG9yeVRlc3QuamF2YQppbmRleCBhYTQyNTA1Li45ZjJkMmM5IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvY3RzL0VkaXRhYmxlX0ZhY3RvcnlUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2N0cy9FZGl0YWJsZV9GYWN0b3J5VGVzdC5qYXZhCkBAIC0xOSwxMiArMTksMTMgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5FZGl0YWJsZTsKIGltcG9ydCBhbmRyb2lkLnRleHQuRWRpdGFibGUuRmFjdG9yeTsKIGltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcjsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2N0cy9FbW9qaUNvbnN0YW50cy5qYXZhIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2N0cy9FbW9qaUNvbnN0YW50cy5qYXZhCmluZGV4IGRjYWU2MjIuLjU0M2YyN2IgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9jdHMvRW1vamlDb25zdGFudHMuamF2YQorKysgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvY3RzL0Vtb2ppQ29uc3RhbnRzLmphdmEKQEAgLTIxLDEzMiArMjEsMTkwIEBACiAgKi8KIGNsYXNzIEVtb2ppQ29uc3RhbnRzIHsKIAotICAgIC8qCi0gICAgICogRW1vamkgbGlzdCBmcm9tIFVuaWNvZGUub3JnOgorICAgIC8qKgorICAgICAqIEFsbCBlbW9qaSBjaGFyYWN0ZXJzIGluIFVuaWNvZGUgMTAuMC9FbW9qaSA1LjAuCiAgICAgICogaHR0cDovL3VuaWNvZGUub3JnL2NsZHIvdXRpbGl0eS9saXN0LXVuaWNvZGVzZXQuanNwP2E9JTVDcCU3QkVtb2ppJTdEJTBEJTBBJmc9CiAgICAgICovCi0gICAgc3RhdGljIGludFtdIGVtb2ppQ29kZVBvaW50cyA9IHsKLSAgICAgICAgMHgwMDBBOSwgLy8gQ09QWVJJR0hUIFNJR04KLSAgICAgICAgMHgwMDBBRSwgLy8gUkVHSVNURVJFRCBTSUdOCi0gICAgICAgIDB4MDIwMDIsIC8vIEVOIFNQQUNFCi0gICAgICAgIDB4MDIwMDMsIC8vIEVNIFNQQUNFCi0gICAgICAgIDB4MDIwMDUsIC8vIEZPVVItUEVSLUVNIFNQQUNFCi0gICAgICAgIDB4MDIwM0MsIC8vIERPVUJMRSBFWENMQU1BVElPTiBNQVJLCi0gICAgICAgIDB4MDIwNDksIC8vIEVYQ0xBTUFUSU9OIFFVRVNUSU9OIE1BUksKLSAgICAgICAgMHgwMjBFMywgLy8gQ09NQklOSU5HIEVOQ0xPU0lORyBLRVlDQVAKLSAgICAgICAgMHgwMjEyMiwgLy8gVFJBREUgTUFSSyBTSUdOCi0gICAgICAgIDB4MDIxMzksIC8vIElORk9STUFUSU9OIFNPVVJDRQotICAgICAgICAweDAyMTk0LCAvLyBMRUZUIFJJR0hUIEFSUk9XCi0gICAgICAgIDB4MDIxOTUsIC8vIFVQIERPV04gQVJST1cKLSAgICAgICAgMHgwMjE5NiwgLy8gTk9SVEggV0VTVCBBUlJPVwotICAgICAgICAweDAyMTk3LCAvLyBOT1JUSCBFQVNUIEFSUk9XCi0gICAgICAgIDB4MDIxOTgsIC8vIFNPVVRIIEVBU1QgQVJST1cKLSAgICAgICAgMHgwMjE5OSwgLy8gU09VVEggV0VTVCBBUlJPVwotICAgICAgICAweDAyMUE5LCAvLyBMRUZUV0FSRFMgQVJST1cgV0lUSCBIT09LCi0gICAgICAgIDB4MDIxQUEsIC8vIFJJR0hUV0FSRFMgQVJST1cgV0lUSCBIT09LCi0gICAgICAgIDB4MDIzMUEsIC8vIFdBVENICi0gICAgICAgIDB4MDIzMUIsIC8vIEhPVVJHTEFTUwotICAgICAgICAweDAyM0U5LCAvLyBCTEFDSyBSSUdIVC1QT0lOVElORyBET1VCTEUgVFJJQU5HTEUKLSAgICAgICAgMHgwMjNFQSwgLy8gQkxBQ0sgTEVGVC1QT0lOVElORyBET1VCTEUgVFJJQU5HTEUKLSAgICAgICAgMHgwMjNFQiwgLy8gQkxBQ0sgVVAtUE9JTlRJTkcgRE9VQkxFIFRSSUFOR0xFCi0gICAgICAgIDB4MDIzRUMsIC8vIEJMQUNLIERPV04tUE9JTlRJTkcgRE9VQkxFIFRSSUFOR0xFCi0gICAgICAgIDB4MDIzRjAsIC8vIEFMQVJNIENMT0NLCi0gICAgICAgIDB4MDIzRjMsIC8vIEhPVVJHTEFTUyBXSVRIIEZMT1dJTkcgU0FORAotICAgICAgICAweDAyNEMyLCAvLyBDSVJDTEVEIExBVElOIENBUElUQUwgTEVUVEVSIE0KLSAgICAgICAgMHgwMjVBQSwgLy8gQkxBQ0sgU01BTEwgU1FVQVJFCi0gICAgICAgIDB4MDI1QUIsIC8vIFdISVRFIFNNQUxMIFNRVUFSRQotICAgICAgICAweDAyNUI2LCAvLyBCTEFDSyBSSUdIVC1QT0lOVElORyBUUklBTkdMRQotICAgICAgICAweDAyNUMwLCAvLyBCTEFDSyBMRUZULVBPSU5USU5HIFRSSUFOR0xFCi0gICAgICAgIDB4MDI1RkIsIC8vIFdISVRFIE1FRElVTSBTUVVBUkUKLSAgICAgICAgMHgwMjVGQywgLy8gQkxBQ0sgTUVESVVNIFNRVUFSRQotICAgICAgICAweDAyNUZELCAvLyBXSElURSBNRURJVU0gU01BTEwgU1FVQVJFCi0gICAgICAgIDB4MDI1RkUsIC8vIEJMQUNLIE1FRElVTSBTTUFMTCBTUVVBUkUKLSAgICAgICAgMHgwMjYwMCwgLy8gQkxBQ0sgU1VOIFdJVEggUkFZUwotICAgICAgICAweDAyNjAxLCAvLyBDTE9VRAotICAgICAgICAweDAyNjBFLCAvLyBCTEFDSyBURUxFUEhPTkUKLSAgICAgICAgMHgwMjYxMSwgLy8gQkFMTE9UIEJPWCBXSVRIIENIRUNLCi0gICAgICAgIDB4MDI2MTUsIC8vIEhPVCBCRVZFUkFHRQotICAgICAgICAweDAyNjY4LCAvLyBIT1QgU1BSSU5HUwotICAgICAgICAweDAyNjdGLCAvLyBXSEVFTENIQUlSIFNZTUJPTAotICAgICAgICAweDAyNkEwLCAvLyBXQVJOSU5HIFNJR04KLSAgICAgICAgMHgwMjZBMSwgLy8gSElHSCBWT0xUQUdFIFNJR04KLSAgICAgICAgMHgwMjYxNCwgLy8gVU1CUkVMTEEgV0lUSCBSQUlOIERST1BTCi0gICAgICAgIDB4MDI2MUQsIC8vIFdISVRFIFVQIFBPSU5USU5HIElOREVYCi0gICAgICAgIDB4MDI2M0EsIC8vIFdISVRFIFNNSUxJTkcgRkFDRQotICAgICAgICAweDAyNjQ4LCAvLyBBUklFUwotICAgICAgICAweDAyNjQ5LCAvLyBUQVVSVVMKLSAgICAgICAgMHgwMjY0QSwgLy8gR0VNSU5JCi0gICAgICAgIDB4MDI2NEIsIC8vIENBTkNFUgotICAgICAgICAweDAyNjRDLCAvLyBMRU8KLSAgICAgICAgMHgwMjY0RCwgLy8gVklSR08KLSAgICAgICAgMHgwMjY0RSwgLy8gTElCUkEKLSAgICAgICAgMHgwMjY0RiwgLy8gU0NPUlBJVVMKLSAgICAgICAgMHgwMjY1MCwgLy8gU0FHSVRUQVJJVVMKLSAgICAgICAgMHgwMjY1MSwgLy8gQ0FQUklDT1JOCi0gICAgICAgIDB4MDI2NTIsIC8vIEFRVUFSSVVTCi0gICAgICAgIDB4MDI2NTMsIC8vIFBJU0NFUwotICAgICAgICAweDAyNkNFLCAvLyBPUEhJVUNIVVMKLSAgICAgICAgMHgwMjY2MCwgLy8gQkxBQ0sgU1BBREUgU1VJVAotICAgICAgICAweDAyNjYzLCAvLyBCTEFDSyBDTFVCIFNVSVQKLSAgICAgICAgMHgwMjY2NSwgLy8gQkxBQ0sgSEVBUlQgU1VJVAotICAgICAgICAweDAyNjY2LCAvLyBCTEFDSyBESUFNT05EIFNVSVQKLSAgICAgICAgMHgwMjY3QiwgLy8gQkxBQ0sgVU5JVkVSU0FMIFJFQ1lDTElORyBTWU1CT0wKLSAgICAgICAgMHgwMjY5MywgLy8gQU5DSE9SCi0gICAgICAgIDB4MDI2QUEsIC8vIE1FRElVTSBXSElURSBDSVJDTEUKLSAgICAgICAgMHgwMjZBQiwgLy8gTUVESVVNIEJMQUNLIENJUkNMRQotICAgICAgICAweDAyNkJELCAvLyBTT0NDRVIgQkFMTAotICAgICAgICAweDAyNkJFLCAvLyBCQVNFQkFMTAotICAgICAgICAweDAyNkM0LCAvLyBTTk9XTUFOIFdJVEhPVVQgU05PVwotICAgICAgICAweDAyNkM1LCAvLyBTVU4gQkVISU5EIENMT1VECi0gICAgICAgIDB4MDI2RDQsIC8vIE5PIEVOVFJZCi0gICAgICAgIDB4MDI2RUEsIC8vIENIVVJDSAotICAgICAgICAweDAyNkYyLCAvLyBGT1VOVEFJTgotICAgICAgICAweDAyNkYzLCAvLyBGTEFHIElOIEhPTEUKLSAgICAgICAgMHgwMjZGNSwgLy8gU0FJTEJPQVQKLSAgICAgICAgMHgwMjZGQSwgLy8gVEVOVAotICAgICAgICAweDAyNkZELCAvLyBGVUVMIFBVTVAKLSAgICAgICAgMHgwMjcwMiwgLy8gQkxBQ0sgU0NJU1NPUlMKLSAgICAgICAgMHgwMjcwNSwgLy8gV0hJVEUgSEVBVlkgQ0hFQ0sgTUFSSwotICAgICAgICAweDAyNzA4LCAvLyBBSVJQTEFORQotICAgICAgICAweDAyNzA5LCAvLyBFTlZFTE9QRQotICAgICAgICAweDAyNzBBLCAvLyBSQUlTRUQgRklTVAotICAgICAgICAweDAyNzBCLCAvLyBSQUlTRUQgSEFORAotICAgICAgICAweDAyNzBDLCAvLyBWSUNUT1JZIEhBTkQKLSAgICAgICAgMHgwMjcwRiwgLy8gUEVOQ0lMCi0gICAgICAgIDB4MDI3MTIsIC8vIEJMQUNLIE5JQgotICAgICAgICAweDAyNzE0LCAvLyBIRUFWWSBDSEVDSyBNQVJLCi0gICAgICAgIDB4MDI3MTYsIC8vIEhFQVZZIE1VTFRJUExJQ0FUSU9OIFgKLSAgICAgICAgMHgwMjc0QywgLy8gQ1JPU1MgTUFSSwotICAgICAgICAweDAyNzRFLCAvLyBORUdBVElWRSBTUVVBUkVEIENST1NTIE1BUksKLSAgICAgICAgMHgwMjc1MywgLy8gQkxBQ0sgUVVFU1RJT04gTUFSSyBPUk5BTUVOVAotICAgICAgICAweDAyNzU0LCAvLyBXSElURSBRVUVTVElPTiBNQVJLIE9STkFNRU5UCi0gICAgICAgIDB4MDI3NTUsIC8vIFdISVRFIEVYQ0xBTUFUSU9OIE1BUksgT1JOQU1FTlQKLSAgICAgICAgMHgwMjc1NywgLy8gSEVBVlkgRVhDTEFNQVRJT04gTUFSSyBTWU1CT0wKLSAgICAgICAgMHgwMjdCMCwgLy8gQ1VSTFkgTE9PUAotICAgICAgICAweDAyN0JGLCAvLyBET1VCTEUgQ1VSTFkgTE9PUAotICAgICAgICAweDAyNzI4LCAvLyBTUEFSS0xFUwotICAgICAgICAweDAyNzMzLCAvLyBFSUdIVCBTUE9LRUQgQVNURVJJU0sKLSAgICAgICAgMHgwMjczNCwgLy8gRUlHSFQgUE9JTlRFRCBCTEFDSyBTVEFSCi0gICAgICAgIDB4MDI3NDQsIC8vIFNOT1dGTEFLRQotICAgICAgICAweDAyNzQ3LCAvLyBTUEFSS0xFCi0gICAgICAgIDB4MDI3NjQsIC8vIEhFQVZZIEJMQUNLIEhFQVJUCi0gICAgICAgIDB4MDI3OTUsIC8vIEhFQVZZIFBMVVMgU0lHTgotICAgICAgICAweDAyNzk2LCAvLyBIRUFWWSBNSU5VUyBTSUdOCi0gICAgICAgIDB4MDI3OTcsIC8vIEhFQVZZIERJVklTSU9OIFNJR04KLSAgICAgICAgMHgwMjdBMSwgLy8gQkxBQ0sgUklHSFRXQVJEUyBBUlJPVwotICAgICAgICAweDAyOTM0LCAvLyBBUlJPVyBQT0lOVElORyBSSUdIVFdBUkRTIFRIRU4gQ1VSVklORyBVUFdBUkRTCi0gICAgICAgIDB4MDI5MzUsIC8vIEFSUk9XIFBPSU5USU5HIFJJR0hUV0FSRFMgVEhFTiBDVVJWSU5HIERPV05XQVJEUwotICAgICAgICAweDAyQjA1LCAvLyBMRUZUV0FSRFMgQkxBQ0sgQVJST1cKLSAgICAgICAgMHgwMkIwNiwgLy8gVVBXQVJEUyBCTEFDSyBBUlJPVwotICAgICAgICAweDAyQjA3LCAvLyBET1dOV0FSRFMgQkxBQ0sgQVJST1cKLSAgICAgICAgMHgwMkIxQiwgLy8gQkxBQ0sgTEFSR0UgU1FVQVJFCi0gICAgICAgIDB4MDJCMUMsIC8vIFdISVRFIExBUkdFIFNRVUFSRQotICAgICAgICAweDAyQjUwLCAvLyBXSElURSBNRURJVU0gU1RBUgotICAgICAgICAweDAyQjU1LCAvLyBIRUFWWSBMQVJHRSBDSVJDTEUKLSAgICAgICAgMHgwMzAzMCwgLy8gV0FWWSBEQVNICi0gICAgICAgIDB4MDMwM0QsIC8vIFBBUlQgQUxURVJOQVRJT04gTUFSSwotICAgICAgICAweDAzMjk3LCAvLyBDSVJDTEVEIElERU9HUkFQSCBDT05HUkFUVUxBVElPTgotICAgICAgICAweDAzMjk5LCAvLyBDSVJDTEVEIElERU9HUkFQSCBTRUNSRVQKKyAgICBzdGF0aWMgZmluYWwgaW50W10gQUxMX0VNT0pJID0geworICAgICAgICAweDAwMjMsIC8vIE5VTUJFUiBTSUdOCisgICAgICAgIDB4MDAyQSwgLy8gQVNURVJJU0sKKyAgICAgICAgMHgwMDMwLCAvLyBESUdJVCBaRVJPCisgICAgICAgIDB4MDAzMSwgLy8gRElHSVQgT05FCisgICAgICAgIDB4MDAzMiwgLy8gRElHSVQgVFdPCisgICAgICAgIDB4MDAzMywgLy8gRElHSVQgVEhSRUUKKyAgICAgICAgMHgwMDM0LCAvLyBESUdJVCBGT1VSCisgICAgICAgIDB4MDAzNSwgLy8gRElHSVQgRklWRQorICAgICAgICAweDAwMzYsIC8vIERJR0lUIFNJWAorICAgICAgICAweDAwMzcsIC8vIERJR0lUIFNFVkVOCisgICAgICAgIDB4MDAzOCwgLy8gRElHSVQgRUlHSFQKKyAgICAgICAgMHgwMDM5LCAvLyBESUdJVCBOSU5FCisgICAgICAgIDB4MDBBOSwgLy8gQ09QWVJJR0hUIFNJR04KKyAgICAgICAgMHgwMEFFLCAvLyBSRUdJU1RFUkVEIFNJR04KKyAgICAgICAgMHgyMDNDLCAvLyBET1VCTEUgRVhDTEFNQVRJT04gTUFSSworICAgICAgICAweDIwNDksIC8vIEVYQ0xBTUFUSU9OIFFVRVNUSU9OIE1BUksKKyAgICAgICAgMHgyMTIyLCAvLyBUUkFERSBNQVJLIFNJR04KKyAgICAgICAgMHgyMTM5LCAvLyBJTkZPUk1BVElPTiBTT1VSQ0UKKyAgICAgICAgMHgyMTk0LCAvLyBMRUZUIFJJR0hUIEFSUk9XCisgICAgICAgIDB4MjE5NSwgLy8gVVAgRE9XTiBBUlJPVworICAgICAgICAweDIxOTYsIC8vIE5PUlRIIFdFU1QgQVJST1cKKyAgICAgICAgMHgyMTk3LCAvLyBOT1JUSCBFQVNUIEFSUk9XCisgICAgICAgIDB4MjE5OCwgLy8gU09VVEggRUFTVCBBUlJPVworICAgICAgICAweDIxOTksIC8vIFNPVVRIIFdFU1QgQVJST1cKKyAgICAgICAgMHgyMUE5LCAvLyBMRUZUV0FSRFMgQVJST1cgV0lUSCBIT09LCisgICAgICAgIDB4MjFBQSwgLy8gUklHSFRXQVJEUyBBUlJPVyBXSVRIIEhPT0sKKyAgICAgICAgMHgyMzFBLCAvLyBXQVRDSAorICAgICAgICAweDIzMUIsIC8vIEhPVVJHTEFTUworICAgICAgICAweDIzMjgsIC8vIEtFWUJPQVJECisgICAgICAgIDB4MjNDRiwgLy8gRUpFQ1QgU1lNQk9MCisgICAgICAgIDB4MjNFOSwgLy8gQkxBQ0sgUklHSFQtUE9JTlRJTkcgRE9VQkxFIFRSSUFOR0xFCisgICAgICAgIDB4MjNFQSwgLy8gQkxBQ0sgTEVGVC1QT0lOVElORyBET1VCTEUgVFJJQU5HTEUKKyAgICAgICAgMHgyM0VCLCAvLyBCTEFDSyBVUC1QT0lOVElORyBET1VCTEUgVFJJQU5HTEUKKyAgICAgICAgMHgyM0VDLCAvLyBCTEFDSyBET1dOLVBPSU5USU5HIERPVUJMRSBUUklBTkdMRQorICAgICAgICAweDIzRUQsIC8vIEJMQUNLIFJJR0hULVBPSU5USU5HIERPVUJMRSBUUklBTkdMRSBXSVRIIFZFUlRJQ0FMIEJBUgorICAgICAgICAweDIzRUUsIC8vIEJMQUNLIExFRlQtUE9JTlRJTkcgRE9VQkxFIFRSSUFOR0xFIFdJVEggVkVSVElDQUwgQkFSCisgICAgICAgIDB4MjNFRiwgLy8gQkxBQ0sgUklHSFQtUE9JTlRJTkcgVFJJQU5HTEUgV0lUSCBET1VCTEUgVkVSVElDQUwgQkFSCisgICAgICAgIDB4MjNGMCwgLy8gQUxBUk0gQ0xPQ0sKKyAgICAgICAgMHgyM0YxLCAvLyBTVE9QV0FUQ0gKKyAgICAgICAgMHgyM0YyLCAvLyBUSU1FUiBDTE9DSworICAgICAgICAweDIzRjMsIC8vIEhPVVJHTEFTUyBXSVRIIEZMT1dJTkcgU0FORAorICAgICAgICAweDIzRjgsIC8vIERPVUJMRSBWRVJUSUNBTCBCQVIKKyAgICAgICAgMHgyM0Y5LCAvLyBCTEFDSyBTUVVBUkUgRk9SIFNUT1AKKyAgICAgICAgMHgyM0ZBLCAvLyBCTEFDSyBDSVJDTEUgRk9SIFJFQ09SRAorICAgICAgICAweDI0QzIsIC8vIENJUkNMRUQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgICAgICAweDI1QUEsIC8vIEJMQUNLIFNNQUxMIFNRVUFSRQorICAgICAgICAweDI1QUIsIC8vIFdISVRFIFNNQUxMIFNRVUFSRQorICAgICAgICAweDI1QjYsIC8vIEJMQUNLIFJJR0hULVBPSU5USU5HIFRSSUFOR0xFCisgICAgICAgIDB4MjVDMCwgLy8gQkxBQ0sgTEVGVC1QT0lOVElORyBUUklBTkdMRQorICAgICAgICAweDI1RkIsIC8vIFdISVRFIE1FRElVTSBTUVVBUkUKKyAgICAgICAgMHgyNUZDLCAvLyBCTEFDSyBNRURJVU0gU1FVQVJFCisgICAgICAgIDB4MjVGRCwgLy8gV0hJVEUgTUVESVVNIFNNQUxMIFNRVUFSRQorICAgICAgICAweDI1RkUsIC8vIEJMQUNLIE1FRElVTSBTTUFMTCBTUVVBUkUKKyAgICAgICAgMHgyNjAwLCAvLyBCTEFDSyBTVU4gV0lUSCBSQVlTCisgICAgICAgIDB4MjYwMSwgLy8gQ0xPVUQKKyAgICAgICAgMHgyNjAyLCAvLyBVTUJSRUxMQQorICAgICAgICAweDI2MDMsIC8vIFNOT1dNQU4KKyAgICAgICAgMHgyNjA0LCAvLyBDT01FVAorICAgICAgICAweDI2MEUsIC8vIEJMQUNLIFRFTEVQSE9ORQorICAgICAgICAweDI2MTEsIC8vIEJBTExPVCBCT1ggV0lUSCBDSEVDSworICAgICAgICAweDI2MTQsIC8vIFVNQlJFTExBIFdJVEggUkFJTiBEUk9QUworICAgICAgICAweDI2MTUsIC8vIEhPVCBCRVZFUkFHRQorICAgICAgICAweDI2MTgsIC8vIFNIQU1ST0NLCisgICAgICAgIDB4MjYxRCwgLy8gV0hJVEUgVVAgUE9JTlRJTkcgSU5ERVgKKyAgICAgICAgMHgyNjIwLCAvLyBTS1VMTCBBTkQgQ1JPU1NCT05FUworICAgICAgICAweDI2MjIsIC8vIFJBRElPQUNUSVZFIFNJR04KKyAgICAgICAgMHgyNjIzLCAvLyBCSU9IQVpBUkQgU0lHTgorICAgICAgICAweDI2MjYsIC8vIE9SVEhPRE9YIENST1NTCisgICAgICAgIDB4MjYyQSwgLy8gU1RBUiBBTkQgQ1JFU0NFTlQKKyAgICAgICAgMHgyNjJFLCAvLyBQRUFDRSBTWU1CT0wKKyAgICAgICAgMHgyNjJGLCAvLyBZSU4gWUFORworICAgICAgICAweDI2MzgsIC8vIFdIRUVMIE9GIERIQVJNQQorICAgICAgICAweDI2MzksIC8vIFdISVRFIEZST1dOSU5HIEZBQ0UKKyAgICAgICAgMHgyNjNBLCAvLyBXSElURSBTTUlMSU5HIEZBQ0UKKyAgICAgICAgMHgyNjQwLCAvLyBGRU1BTEUgU0lHTgorICAgICAgICAweDI2NDIsIC8vIE1BTEUgU0lHTgorICAgICAgICAweDI2NDgsIC8vIEFSSUVTCisgICAgICAgIDB4MjY0OSwgLy8gVEFVUlVTCisgICAgICAgIDB4MjY0QSwgLy8gR0VNSU5JCisgICAgICAgIDB4MjY0QiwgLy8gQ0FOQ0VSCisgICAgICAgIDB4MjY0QywgLy8gTEVPCisgICAgICAgIDB4MjY0RCwgLy8gVklSR08KKyAgICAgICAgMHgyNjRFLCAvLyBMSUJSQQorICAgICAgICAweDI2NEYsIC8vIFNDT1JQSVVTCisgICAgICAgIDB4MjY1MCwgLy8gU0FHSVRUQVJJVVMKKyAgICAgICAgMHgyNjUxLCAvLyBDQVBSSUNPUk4KKyAgICAgICAgMHgyNjUyLCAvLyBBUVVBUklVUworICAgICAgICAweDI2NTMsIC8vIFBJU0NFUworICAgICAgICAweDI2NjAsIC8vIEJMQUNLIFNQQURFIFNVSVQKKyAgICAgICAgMHgyNjYzLCAvLyBCTEFDSyBDTFVCIFNVSVQKKyAgICAgICAgMHgyNjY1LCAvLyBCTEFDSyBIRUFSVCBTVUlUCisgICAgICAgIDB4MjY2NiwgLy8gQkxBQ0sgRElBTU9ORCBTVUlUCisgICAgICAgIDB4MjY2OCwgLy8gSE9UIFNQUklOR1MKKyAgICAgICAgMHgyNjdCLCAvLyBCTEFDSyBVTklWRVJTQUwgUkVDWUNMSU5HIFNZTUJPTAorICAgICAgICAweDI2N0YsIC8vIFdIRUVMQ0hBSVIgU1lNQk9MCisgICAgICAgIDB4MjY5MiwgLy8gSEFNTUVSIEFORCBQSUNLCisgICAgICAgIDB4MjY5MywgLy8gQU5DSE9SCisgICAgICAgIDB4MjY5NCwgLy8gQ1JPU1NFRCBTV09SRFMKKyAgICAgICAgMHgyNjk1LCAvLyBTVEFGRiBPRiBBRVNDVUxBUElVUworICAgICAgICAweDI2OTYsIC8vIFNDQUxFUworICAgICAgICAweDI2OTcsIC8vIEFMRU1CSUMKKyAgICAgICAgMHgyNjk5LCAvLyBHRUFSCisgICAgICAgIDB4MjY5QiwgLy8gQVRPTSBTWU1CT0wKKyAgICAgICAgMHgyNjlDLCAvLyBGTEVVUi1ERS1MSVMKKyAgICAgICAgMHgyNkEwLCAvLyBXQVJOSU5HIFNJR04KKyAgICAgICAgMHgyNkExLCAvLyBISUdIIFZPTFRBR0UgU0lHTgorICAgICAgICAweDI2QUEsIC8vIE1FRElVTSBXSElURSBDSVJDTEUKKyAgICAgICAgMHgyNkFCLCAvLyBNRURJVU0gQkxBQ0sgQ0lSQ0xFCisgICAgICAgIDB4MjZCMCwgLy8gQ09GRklOCisgICAgICAgIDB4MjZCMSwgLy8gRlVORVJBTCBVUk4KKyAgICAgICAgMHgyNkJELCAvLyBTT0NDRVIgQkFMTAorICAgICAgICAweDI2QkUsIC8vIEJBU0VCQUxMCisgICAgICAgIDB4MjZDNCwgLy8gU05PV01BTiBXSVRIT1VUIFNOT1cKKyAgICAgICAgMHgyNkM1LCAvLyBTVU4gQkVISU5EIENMT1VECisgICAgICAgIDB4MjZDOCwgLy8gVEhVTkRFUiBDTE9VRCBBTkQgUkFJTgorICAgICAgICAweDI2Q0UsIC8vIE9QSElVQ0hVUworICAgICAgICAweDI2Q0YsIC8vIFBJQ0sKKyAgICAgICAgMHgyNkQxLCAvLyBIRUxNRVQgV0lUSCBXSElURSBDUk9TUworICAgICAgICAweDI2RDMsIC8vIENIQUlOUworICAgICAgICAweDI2RDQsIC8vIE5PIEVOVFJZCisgICAgICAgIDB4MjZFOSwgLy8gU0hJTlRPIFNIUklORQorICAgICAgICAweDI2RUEsIC8vIENIVVJDSAorICAgICAgICAweDI2RjAsIC8vIE1PVU5UQUlOCisgICAgICAgIDB4MjZGMSwgLy8gVU1CUkVMTEEgT04gR1JPVU5ECisgICAgICAgIDB4MjZGMiwgLy8gRk9VTlRBSU4KKyAgICAgICAgMHgyNkYzLCAvLyBGTEFHIElOIEhPTEUKKyAgICAgICAgMHgyNkY0LCAvLyBGRVJSWQorICAgICAgICAweDI2RjUsIC8vIFNBSUxCT0FUCisgICAgICAgIDB4MjZGNywgLy8gU0tJRVIKKyAgICAgICAgMHgyNkY4LCAvLyBJQ0UgU0tBVEUKKyAgICAgICAgMHgyNkY5LCAvLyBQRVJTT04gV0lUSCBCQUxMCisgICAgICAgIDB4MjZGQSwgLy8gVEVOVAorICAgICAgICAweDI2RkQsIC8vIEZVRUwgUFVNUAorICAgICAgICAweDI3MDIsIC8vIEJMQUNLIFNDSVNTT1JTCisgICAgICAgIDB4MjcwNSwgLy8gV0hJVEUgSEVBVlkgQ0hFQ0sgTUFSSworICAgICAgICAweDI3MDgsIC8vIEFJUlBMQU5FCisgICAgICAgIDB4MjcwOSwgLy8gRU5WRUxPUEUKKyAgICAgICAgMHgyNzBBLCAvLyBSQUlTRUQgRklTVAorICAgICAgICAweDI3MEIsIC8vIFJBSVNFRCBIQU5ECisgICAgICAgIDB4MjcwQywgLy8gVklDVE9SWSBIQU5ECisgICAgICAgIDB4MjcwRCwgLy8gV1JJVElORyBIQU5ECisgICAgICAgIDB4MjcwRiwgLy8gUEVOQ0lMCisgICAgICAgIDB4MjcxMiwgLy8gQkxBQ0sgTklCCisgICAgICAgIDB4MjcxNCwgLy8gSEVBVlkgQ0hFQ0sgTUFSSworICAgICAgICAweDI3MTYsIC8vIEhFQVZZIE1VTFRJUExJQ0FUSU9OIFgKKyAgICAgICAgMHgyNzFELCAvLyBMQVRJTiBDUk9TUworICAgICAgICAweDI3MjEsIC8vIFNUQVIgT0YgREFWSUQKKyAgICAgICAgMHgyNzI4LCAvLyBTUEFSS0xFUworICAgICAgICAweDI3MzMsIC8vIEVJR0hUIFNQT0tFRCBBU1RFUklTSworICAgICAgICAweDI3MzQsIC8vIEVJR0hUIFBPSU5URUQgQkxBQ0sgU1RBUgorICAgICAgICAweDI3NDQsIC8vIFNOT1dGTEFLRQorICAgICAgICAweDI3NDcsIC8vIFNQQVJLTEUKKyAgICAgICAgMHgyNzRDLCAvLyBDUk9TUyBNQVJLCisgICAgICAgIDB4Mjc0RSwgLy8gTkVHQVRJVkUgU1FVQVJFRCBDUk9TUyBNQVJLCisgICAgICAgIDB4Mjc1MywgLy8gQkxBQ0sgUVVFU1RJT04gTUFSSyBPUk5BTUVOVAorICAgICAgICAweDI3NTQsIC8vIFdISVRFIFFVRVNUSU9OIE1BUksgT1JOQU1FTlQKKyAgICAgICAgMHgyNzU1LCAvLyBXSElURSBFWENMQU1BVElPTiBNQVJLIE9STkFNRU5UCisgICAgICAgIDB4Mjc1NywgLy8gSEVBVlkgRVhDTEFNQVRJT04gTUFSSyBTWU1CT0wKKyAgICAgICAgMHgyNzYzLCAvLyBIRUFWWSBIRUFSVCBFWENMQU1BVElPTiBNQVJLIE9STkFNRU5UCisgICAgICAgIDB4Mjc2NCwgLy8gSEVBVlkgQkxBQ0sgSEVBUlQKKyAgICAgICAgMHgyNzk1LCAvLyBIRUFWWSBQTFVTIFNJR04KKyAgICAgICAgMHgyNzk2LCAvLyBIRUFWWSBNSU5VUyBTSUdOCisgICAgICAgIDB4Mjc5NywgLy8gSEVBVlkgRElWSVNJT04gU0lHTgorICAgICAgICAweDI3QTEsIC8vIEJMQUNLIFJJR0hUV0FSRFMgQVJST1cKKyAgICAgICAgMHgyN0IwLCAvLyBDVVJMWSBMT09QCisgICAgICAgIDB4MjdCRiwgLy8gRE9VQkxFIENVUkxZIExPT1AKKyAgICAgICAgMHgyOTM0LCAvLyBBUlJPVyBQT0lOVElORyBSSUdIVFdBUkRTIFRIRU4gQ1VSVklORyBVUFdBUkRTCisgICAgICAgIDB4MjkzNSwgLy8gQVJST1cgUE9JTlRJTkcgUklHSFRXQVJEUyBUSEVOIENVUlZJTkcgRE9XTldBUkRTCisgICAgICAgIDB4MkIwNSwgLy8gTEVGVFdBUkRTIEJMQUNLIEFSUk9XCisgICAgICAgIDB4MkIwNiwgLy8gVVBXQVJEUyBCTEFDSyBBUlJPVworICAgICAgICAweDJCMDcsIC8vIERPV05XQVJEUyBCTEFDSyBBUlJPVworICAgICAgICAweDJCMUIsIC8vIEJMQUNLIExBUkdFIFNRVUFSRQorICAgICAgICAweDJCMUMsIC8vIFdISVRFIExBUkdFIFNRVUFSRQorICAgICAgICAweDJCNTAsIC8vIFdISVRFIE1FRElVTSBTVEFSCisgICAgICAgIDB4MkI1NSwgLy8gSEVBVlkgTEFSR0UgQ0lSQ0xFCisgICAgICAgIDB4MzAzMCwgLy8gV0FWWSBEQVNICisgICAgICAgIDB4MzAzRCwgLy8gUEFSVCBBTFRFUk5BVElPTiBNQVJLCisgICAgICAgIDB4MzI5NywgLy8gQ0lSQ0xFRCBJREVPR1JBUEggQ09OR1JBVFVMQVRJT04KKyAgICAgICAgMHgzMjk5LCAvLyBDSVJDTEVEIElERU9HUkFQSCBTRUNSRVQKICAgICAgICAgMHgxRjAwNCwgLy8gTUFISk9ORyBUSUxFIFJFRCBEUkFHT04KICAgICAgICAgMHgxRjBDRiwgLy8gUExBWUlORyBDQVJEIEJMQUNLIEpPS0VSCiAgICAgICAgIDB4MUYxNzAsIC8vIE5FR0FUSVZFIFNRVUFSRUQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQpAQCAtMjE4LDE5ICsyNzYsNDYgQEAKICAgICAgICAgMHgxRjMwQSwgLy8gV0FURVIgV0FWRQogICAgICAgICAweDFGMzBCLCAvLyBWT0xDQU5PCiAgICAgICAgIDB4MUYzMEMsIC8vIE1JTEtZIFdBWQorICAgICAgICAweDFGMzBELCAvLyBFQVJUSCBHTE9CRSBFVVJPUEUtQUZSSUNBCisgICAgICAgIDB4MUYzMEUsIC8vIEVBUlRIIEdMT0JFIEFNRVJJQ0FTCiAgICAgICAgIDB4MUYzMEYsIC8vIEVBUlRIIEdMT0JFIEFTSUEtQVVTVFJBTElBCisgICAgICAgIDB4MUYzMTAsIC8vIEdMT0JFIFdJVEggTUVSSURJQU5TCiAgICAgICAgIDB4MUYzMTEsIC8vIE5FVyBNT09OIFNZTUJPTAorICAgICAgICAweDFGMzEyLCAvLyBXQVhJTkcgQ1JFU0NFTlQgTU9PTiBTWU1CT0wKICAgICAgICAgMHgxRjMxMywgLy8gRklSU1QgUVVBUlRFUiBNT09OIFNZTUJPTAogICAgICAgICAweDFGMzE0LCAvLyBXQVhJTkcgR0lCQk9VUyBNT09OIFNZTUJPTAogICAgICAgICAweDFGMzE1LCAvLyBGVUxMIE1PT04gU1lNQk9MCisgICAgICAgIDB4MUYzMTYsIC8vIFdBTklORyBHSUJCT1VTIE1PT04gU1lNQk9MCisgICAgICAgIDB4MUYzMTcsIC8vIExBU1QgUVVBUlRFUiBNT09OIFNZTUJPTAorICAgICAgICAweDFGMzE4LCAvLyBXQU5JTkcgQ1JFU0NFTlQgTU9PTiBTWU1CT0wKICAgICAgICAgMHgxRjMxOSwgLy8gQ1JFU0NFTlQgTU9PTgorICAgICAgICAweDFGMzFBLCAvLyBORVcgTU9PTiBXSVRIIEZBQ0UKICAgICAgICAgMHgxRjMxQiwgLy8gRklSU1QgUVVBUlRFUiBNT09OIFdJVEggRkFDRQorICAgICAgICAweDFGMzFDLCAvLyBMQVNUIFFVQVJURVIgTU9PTiBXSVRIIEZBQ0UKKyAgICAgICAgMHgxRjMxRCwgLy8gRlVMTCBNT09OIFdJVEggRkFDRQorICAgICAgICAweDFGMzFFLCAvLyBTVU4gV0lUSCBGQUNFCiAgICAgICAgIDB4MUYzMUYsIC8vIEdMT1dJTkcgU1RBUgogICAgICAgICAweDFGMzIwLCAvLyBTSE9PVElORyBTVEFSCisgICAgICAgIDB4MUYzMjEsIC8vIFRIRVJNT01FVEVSCisgICAgICAgIDB4MUYzMjQsIC8vIFdISVRFIFNVTiBXSVRIIFNNQUxMIENMT1VECisgICAgICAgIDB4MUYzMjUsIC8vIFdISVRFIFNVTiBCRUhJTkQgQ0xPVUQKKyAgICAgICAgMHgxRjMyNiwgLy8gV0hJVEUgU1VOIEJFSElORCBDTE9VRCBXSVRIIFJBSU4KKyAgICAgICAgMHgxRjMyNywgLy8gQ0xPVUQgV0lUSCBSQUlOCisgICAgICAgIDB4MUYzMjgsIC8vIENMT1VEIFdJVEggU05PVworICAgICAgICAweDFGMzI5LCAvLyBDTE9VRCBXSVRIIExJR0hUTklORworICAgICAgICAweDFGMzJBLCAvLyBDTE9VRCBXSVRIIFRPUk5BRE8KKyAgICAgICAgMHgxRjMyQiwgLy8gRk9HCisgICAgICAgIDB4MUYzMkMsIC8vIFdJTkQgQkxPV0lORyBGQUNFCisgICAgICAgIDB4MUYzMkQsIC8vIEhPVCBET0cKKyAgICAgICAgMHgxRjMyRSwgLy8gVEFDTworICAgICAgICAweDFGMzJGLCAvLyBCVVJSSVRPCiAgICAgICAgIDB4MUYzMzAsIC8vIENIRVNUTlVUCiAgICAgICAgIDB4MUYzMzEsIC8vIFNFRURMSU5HCisgICAgICAgIDB4MUYzMzIsIC8vIEVWRVJHUkVFTiBUUkVFCisgICAgICAgIDB4MUYzMzMsIC8vIERFQ0lEVU9VUyBUUkVFCiAgICAgICAgIDB4MUYzMzQsIC8vIFBBTE0gVFJFRQogICAgICAgICAweDFGMzM1LCAvLyBDQUNUVVMKKyAgICAgICAgMHgxRjMzNiwgLy8gSE9UIFBFUFBFUgogICAgICAgICAweDFGMzM3LCAvLyBUVUxJUAogICAgICAgICAweDFGMzM4LCAvLyBDSEVSUlkgQkxPU1NPTQogICAgICAgICAweDFGMzM5LCAvLyBST1NFCkBAIC0yNTEsMTAgKzMzNiwxMiBAQAogICAgICAgICAweDFGMzQ4LCAvLyBNRUxPTgogICAgICAgICAweDFGMzQ5LCAvLyBXQVRFUk1FTE9OCiAgICAgICAgIDB4MUYzNEEsIC8vIFRBTkdFUklORQorICAgICAgICAweDFGMzRCLCAvLyBMRU1PTgogICAgICAgICAweDFGMzRDLCAvLyBCQU5BTkEKICAgICAgICAgMHgxRjM0RCwgLy8gUElORUFQUExFCiAgICAgICAgIDB4MUYzNEUsIC8vIFJFRCBBUFBMRQogICAgICAgICAweDFGMzRGLCAvLyBHUkVFTiBBUFBMRQorICAgICAgICAweDFGMzUwLCAvLyBQRUFSCiAgICAgICAgIDB4MUYzNTEsIC8vIFBFQUNICiAgICAgICAgIDB4MUYzNTIsIC8vIENIRVJSSUVTCiAgICAgICAgIDB4MUYzNTMsIC8vIFNUUkFXQkVSUlkKQEAgLTI5OCw2ICszODUsMTAgQEAKICAgICAgICAgMHgxRjM3OSwgLy8gVFJPUElDQUwgRFJJTksKICAgICAgICAgMHgxRjM3QSwgLy8gQkVFUiBNVUcKICAgICAgICAgMHgxRjM3QiwgLy8gQ0xJTktJTkcgQkVFUiBNVUdTCisgICAgICAgIDB4MUYzN0MsIC8vIEJBQlkgQk9UVExFCisgICAgICAgIDB4MUYzN0QsIC8vIEZPUksgQU5EIEtOSUZFIFdJVEggUExBVEUKKyAgICAgICAgMHgxRjM3RSwgLy8gQk9UVExFIFdJVEggUE9QUElORyBDT1JLCisgICAgICAgIDB4MUYzN0YsIC8vIFBPUENPUk4KICAgICAgICAgMHgxRjM4MCwgLy8gUklCQk9OCiAgICAgICAgIDB4MUYzODEsIC8vIFdSQVBQRUQgUFJFU0VOVAogICAgICAgICAweDFGMzgyLCAvLyBCSVJUSERBWSBDQUtFCkBAIC0zMTgsNiArNDA5LDEzIEBACiAgICAgICAgIDB4MUYzOTEsIC8vIE1PT04gVklFV0lORyBDRVJFTU9OWQogICAgICAgICAweDFGMzkyLCAvLyBTQ0hPT0wgU0FUQ0hFTAogICAgICAgICAweDFGMzkzLCAvLyBHUkFEVUFUSU9OIENBUAorICAgICAgICAweDFGMzk2LCAvLyBNSUxJVEFSWSBNRURBTAorICAgICAgICAweDFGMzk3LCAvLyBSRU1JTkRFUiBSSUJCT04KKyAgICAgICAgMHgxRjM5OSwgLy8gU1RVRElPIE1JQ1JPUEhPTkUKKyAgICAgICAgMHgxRjM5QSwgLy8gTEVWRUwgU0xJREVSCisgICAgICAgIDB4MUYzOUIsIC8vIENPTlRST0wgS05PQlMKKyAgICAgICAgMHgxRjM5RSwgLy8gRklMTSBGUkFNRVMKKyAgICAgICAgMHgxRjM5RiwgLy8gQURNSVNTSU9OIFRJQ0tFVFMKICAgICAgICAgMHgxRjNBMCwgLy8gQ0FST1VTRUwgSE9SU0UKICAgICAgICAgMHgxRjNBMSwgLy8gRkVSUklTIFdIRUVMCiAgICAgICAgIDB4MUYzQTIsIC8vIFJPTExFUiBDT0FTVEVSCkBAIC0zNTUsMTMgKzQ1MywzOCBAQAogICAgICAgICAweDFGM0MyLCAvLyBTTk9XQk9BUkRFUgogICAgICAgICAweDFGM0MzLCAvLyBSVU5ORVIKICAgICAgICAgMHgxRjNDNCwgLy8gU1VSRkVSCisgICAgICAgIDB4MUYzQzUsIC8vIFNQT1JUUyBNRURBTAogICAgICAgICAweDFGM0M2LCAvLyBUUk9QSFkKKyAgICAgICAgMHgxRjNDNywgLy8gSE9SU0UgUkFDSU5HCiAgICAgICAgIDB4MUYzQzgsIC8vIEFNRVJJQ0FOIEZPT1RCQUxMCisgICAgICAgIDB4MUYzQzksIC8vIFJVR0JZIEZPT1RCQUxMCiAgICAgICAgIDB4MUYzQ0EsIC8vIFNXSU1NRVIKKyAgICAgICAgMHgxRjNDQiwgLy8gV0VJR0hUIExJRlRFUgorICAgICAgICAweDFGM0NDLCAvLyBHT0xGRVIKKyAgICAgICAgMHgxRjNDRCwgLy8gUkFDSU5HIE1PVE9SQ1lDTEUKKyAgICAgICAgMHgxRjNDRSwgLy8gUkFDSU5HIENBUgorICAgICAgICAweDFGM0NGLCAvLyBDUklDS0VUIEJBVCBBTkQgQkFMTAorICAgICAgICAweDFGM0QwLCAvLyBWT0xMRVlCQUxMCisgICAgICAgIDB4MUYzRDEsIC8vIEZJRUxEIEhPQ0tFWSBTVElDSyBBTkQgQkFMTAorICAgICAgICAweDFGM0QyLCAvLyBJQ0UgSE9DS0VZIFNUSUNLIEFORCBQVUNLCisgICAgICAgIDB4MUYzRDMsIC8vIFRBQkxFIFRFTk5JUyBQQURETEUgQU5EIEJBTEwKKyAgICAgICAgMHgxRjNENCwgLy8gU05PVyBDQVBQRUQgTU9VTlRBSU4KKyAgICAgICAgMHgxRjNENSwgLy8gQ0FNUElORworICAgICAgICAweDFGM0Q2LCAvLyBCRUFDSCBXSVRIIFVNQlJFTExBCisgICAgICAgIDB4MUYzRDcsIC8vIEJVSUxESU5HIENPTlNUUlVDVElPTgorICAgICAgICAweDFGM0Q4LCAvLyBIT1VTRSBCVUlMRElOR1MKKyAgICAgICAgMHgxRjNEOSwgLy8gQ0lUWVNDQVBFCisgICAgICAgIDB4MUYzREEsIC8vIERFUkVMSUNUIEhPVVNFIEJVSUxESU5HCisgICAgICAgIDB4MUYzREIsIC8vIENMQVNTSUNBTCBCVUlMRElORworICAgICAgICAweDFGM0RDLCAvLyBERVNFUlQKKyAgICAgICAgMHgxRjNERCwgLy8gREVTRVJUIElTTEFORAorICAgICAgICAweDFGM0RFLCAvLyBOQVRJT05BTCBQQVJLCisgICAgICAgIDB4MUYzREYsIC8vIFNUQURJVU0KICAgICAgICAgMHgxRjNFMCwgLy8gSE9VU0UgQlVJTERJTkcKICAgICAgICAgMHgxRjNFMSwgLy8gSE9VU0UgV0lUSCBHQVJERU4KICAgICAgICAgMHgxRjNFMiwgLy8gT0ZGSUNFIEJVSUxESU5HCiAgICAgICAgIDB4MUYzRTMsIC8vIEpBUEFORVNFIFBPU1QgT0ZGSUNFCisgICAgICAgIDB4MUYzRTQsIC8vIEVVUk9QRUFOIFBPU1QgT0ZGSUNFCiAgICAgICAgIDB4MUYzRTUsIC8vIEhPU1BJVEFMCiAgICAgICAgIDB4MUYzRTYsIC8vIEJBTksKICAgICAgICAgMHgxRjNFNywgLy8gQVVUT01BVEVEIFRFTExFUiBNQUNISU5FCkBAIC0zNzQsMTIgKzQ5Nyw0MSBAQAogICAgICAgICAweDFGM0VFLCAvLyBJWkFLQVlBIExBTlRFUk4KICAgICAgICAgMHgxRjNFRiwgLy8gSkFQQU5FU0UgQ0FTVExFCiAgICAgICAgIDB4MUYzRjAsIC8vIEVVUk9QRUFOIENBU1RMRQorICAgICAgICAweDFGM0YzLCAvLyBXQVZJTkcgV0hJVEUgRkxBRworICAgICAgICAweDFGM0Y0LCAvLyBXQVZJTkcgQkxBQ0sgRkxBRworICAgICAgICAweDFGM0Y1LCAvLyBST1NFVFRFCisgICAgICAgIDB4MUYzRjcsIC8vIExBQkVMCisgICAgICAgIDB4MUYzRjgsIC8vIEJBRE1JTlRPTiBSQUNRVUVUIEFORCBTSFVUVExFQ09DSworICAgICAgICAweDFGM0Y5LCAvLyBCT1cgQU5EIEFSUk9XCisgICAgICAgIDB4MUYzRkEsIC8vIEFNUEhPUkEKKyAgICAgICAgMHgxRjNGQiwgLy8gRU1PSkkgTU9ESUZJRVIgRklUWlBBVFJJQ0sgVFlQRS0xLTIKKyAgICAgICAgMHgxRjNGQywgLy8gRU1PSkkgTU9ESUZJRVIgRklUWlBBVFJJQ0sgVFlQRS0zCisgICAgICAgIDB4MUYzRkQsIC8vIEVNT0pJIE1PRElGSUVSIEZJVFpQQVRSSUNLIFRZUEUtNAorICAgICAgICAweDFGM0ZFLCAvLyBFTU9KSSBNT0RJRklFUiBGSVRaUEFUUklDSyBUWVBFLTUKKyAgICAgICAgMHgxRjNGRiwgLy8gRU1PSkkgTU9ESUZJRVIgRklUWlBBVFJJQ0sgVFlQRS02CisgICAgICAgIDB4MUY0MDAsIC8vIFJBVAorICAgICAgICAweDFGNDAxLCAvLyBNT1VTRQorICAgICAgICAweDFGNDAyLCAvLyBPWAorICAgICAgICAweDFGNDAzLCAvLyBXQVRFUiBCVUZGQUxPCisgICAgICAgIDB4MUY0MDQsIC8vIENPVworICAgICAgICAweDFGNDA1LCAvLyBUSUdFUgorICAgICAgICAweDFGNDA2LCAvLyBMRU9QQVJECisgICAgICAgIDB4MUY0MDcsIC8vIFJBQkJJVAorICAgICAgICAweDFGNDA4LCAvLyBDQVQKKyAgICAgICAgMHgxRjQwOSwgLy8gRFJBR09OCisgICAgICAgIDB4MUY0MEEsIC8vIENST0NPRElMRQorICAgICAgICAweDFGNDBCLCAvLyBXSEFMRQogICAgICAgICAweDFGNDBDLCAvLyBTTkFJTAogICAgICAgICAweDFGNDBELCAvLyBTTkFLRQogICAgICAgICAweDFGNDBFLCAvLyBIT1JTRQorICAgICAgICAweDFGNDBGLCAvLyBSQU0KKyAgICAgICAgMHgxRjQxMCwgLy8gR09BVAogICAgICAgICAweDFGNDExLCAvLyBTSEVFUAogICAgICAgICAweDFGNDEyLCAvLyBNT05LRVkKKyAgICAgICAgMHgxRjQxMywgLy8gUk9PU1RFUgogICAgICAgICAweDFGNDE0LCAvLyBDSElDS0VOCisgICAgICAgIDB4MUY0MTUsIC8vIERPRworICAgICAgICAweDFGNDE2LCAvLyBQSUcKICAgICAgICAgMHgxRjQxNywgLy8gQk9BUgogICAgICAgICAweDFGNDE4LCAvLyBFTEVQSEFOVAogICAgICAgICAweDFGNDE5LCAvLyBPQ1RPUFVTCkBAIC0zOTksNiArNTUxLDcgQEAKICAgICAgICAgMHgxRjQyNywgLy8gUEVOR1VJTgogICAgICAgICAweDFGNDI4LCAvLyBLT0FMQQogICAgICAgICAweDFGNDI5LCAvLyBQT09ETEUKKyAgICAgICAgMHgxRjQyQSwgLy8gRFJPTUVEQVJZIENBTUVMCiAgICAgICAgIDB4MUY0MkIsIC8vIEJBQ1RSSUFOIENBTUVMCiAgICAgICAgIDB4MUY0MkMsIC8vIERPTFBISU4KICAgICAgICAgMHgxRjQyRCwgLy8gTU9VU0UgRkFDRQpAQCAtNDE5LDcgKzU3Miw5IEBACiAgICAgICAgIDB4MUY0M0MsIC8vIFBBTkRBIEZBQ0UKICAgICAgICAgMHgxRjQzRCwgLy8gUElHIE5PU0UKICAgICAgICAgMHgxRjQzRSwgLy8gUEFXIFBSSU5UUworICAgICAgICAweDFGNDNGLCAvLyBDSElQTVVOSwogICAgICAgICAweDFGNDQwLCAvLyBFWUVTCisgICAgICAgIDB4MUY0NDEsIC8vIEVZRQogICAgICAgICAweDFGNDQyLCAvLyBFQVIKICAgICAgICAgMHgxRjQ0MywgLy8gTk9TRQogICAgICAgICAweDFGNDQ0LCAvLyBNT1VUSApAQCAtNDU1LDEyICs2MTAsMTUgQEAKICAgICAgICAgMHgxRjQ2MiwgLy8gV09NQU5TIEJPT1RTCiAgICAgICAgIDB4MUY0NjMsIC8vIEZPT1RQUklOVFMKICAgICAgICAgMHgxRjQ2NCwgLy8gQlVTVCBJTiBTSUxIT1VFVFRFCisgICAgICAgIDB4MUY0NjUsIC8vIEJVU1RTIElOIFNJTEhPVUVUVEUKICAgICAgICAgMHgxRjQ2NiwgLy8gQk9ZCiAgICAgICAgIDB4MUY0NjcsIC8vIEdJUkwKICAgICAgICAgMHgxRjQ2OCwgLy8gTUFOCiAgICAgICAgIDB4MUY0NjksIC8vIFdPTUFOCiAgICAgICAgIDB4MUY0NkEsIC8vIEZBTUlMWQogICAgICAgICAweDFGNDZCLCAvLyBNQU4gQU5EIFdPTUFOIEhPTERJTkcgSEFORFMKKyAgICAgICAgMHgxRjQ2QywgLy8gVFdPIE1FTiBIT0xESU5HIEhBTkRTCisgICAgICAgIDB4MUY0NkQsIC8vIFRXTyBXT01FTiBIT0xESU5HIEhBTkRTCiAgICAgICAgIDB4MUY0NkUsIC8vIFBPTElDRSBPRkZJQ0VSCiAgICAgICAgIDB4MUY0NkYsIC8vIFdPTUFOIFdJVEggQlVOTlkgRUFSUwogICAgICAgICAweDFGNDcwLCAvLyBCUklERSBXSVRIIFZFSUwKQEAgLTUyNCw2ICs2ODIsNyBAQAogICAgICAgICAweDFGNEFBLCAvLyBGTEVYRUQgQklDRVBTCiAgICAgICAgIDB4MUY0QUIsIC8vIERJWlpZIFNZTUJPTAogICAgICAgICAweDFGNEFDLCAvLyBTUEVFQ0ggQkFMTE9PTgorICAgICAgICAweDFGNEFELCAvLyBUSE9VR0hUIEJBTExPT04KICAgICAgICAgMHgxRjRBRSwgLy8gV0hJVEUgRkxPV0VSCiAgICAgICAgIDB4MUY0QUYsIC8vIEhVTkRSRUQgUE9JTlRTIFNZTUJPTAogICAgICAgICAweDFGNEIwLCAvLyBNT05FWSBCQUcKQEAgLTUzMiw2ICs2OTEsOCBAQAogICAgICAgICAweDFGNEIzLCAvLyBDUkVESVQgQ0FSRAogICAgICAgICAweDFGNEI0LCAvLyBCQU5LTk9URSBXSVRIIFlFTiBTSUdOCiAgICAgICAgIDB4MUY0QjUsIC8vIEJBTktOT1RFIFdJVEggRE9MTEFSIFNJR04KKyAgICAgICAgMHgxRjRCNiwgLy8gQkFOS05PVEUgV0lUSCBFVVJPIFNJR04KKyAgICAgICAgMHgxRjRCNywgLy8gQkFOS05PVEUgV0lUSCBQT1VORCBTSUdOCiAgICAgICAgIDB4MUY0QjgsIC8vIE1PTkVZIFdJVEggV0lOR1MKICAgICAgICAgMHgxRjRCOSwgLy8gQ0hBUlQgV0lUSCBVUFdBUkRTIFRSRU5EIEFORCBZRU4gU0lHTgogICAgICAgICAweDFGNEJBLCAvLyBTRUFUCkBAIC01ODQsMTkgKzc0NSwzNSBAQAogICAgICAgICAweDFGNEU5LCAvLyBFTlZFTE9QRSBXSVRIIERPV05XQVJEUyBBUlJPVyBBQk9WRQogICAgICAgICAweDFGNEVBLCAvLyBDTE9TRUQgTUFJTEJPWCBXSVRIIExPV0VSRUQgRkxBRwogICAgICAgICAweDFGNEVCLCAvLyBDTE9TRUQgTUFJTEJPWCBXSVRIIFJBSVNFRCBGTEFHCisgICAgICAgIDB4MUY0RUMsIC8vIE9QRU4gTUFJTEJPWCBXSVRIIFJBSVNFRCBGTEFHCisgICAgICAgIDB4MUY0RUQsIC8vIE9QRU4gTUFJTEJPWCBXSVRIIExPV0VSRUQgRkxBRwogICAgICAgICAweDFGNEVFLCAvLyBQT1NUQk9YCisgICAgICAgIDB4MUY0RUYsIC8vIFBPU1RBTCBIT1JOCiAgICAgICAgIDB4MUY0RjAsIC8vIE5FV1NQQVBFUgogICAgICAgICAweDFGNEYxLCAvLyBNT0JJTEUgUEhPTkUKICAgICAgICAgMHgxRjRGMiwgLy8gTU9CSUxFIFBIT05FIFdJVEggUklHSFRXQVJEUyBBUlJPVyBBVCBMRUZUCiAgICAgICAgIDB4MUY0RjMsIC8vIFZJQlJBVElPTiBNT0RFCiAgICAgICAgIDB4MUY0RjQsIC8vIE1PQklMRSBQSE9ORSBPRkYKKyAgICAgICAgMHgxRjRGNSwgLy8gTk8gTU9CSUxFIFBIT05FUwogICAgICAgICAweDFGNEY2LCAvLyBBTlRFTk5BIFdJVEggQkFSUwogICAgICAgICAweDFGNEY3LCAvLyBDQU1FUkEKKyAgICAgICAgMHgxRjRGOCwgLy8gQ0FNRVJBIFdJVEggRkxBU0gKICAgICAgICAgMHgxRjRGOSwgLy8gVklERU8gQ0FNRVJBCiAgICAgICAgIDB4MUY0RkEsIC8vIFRFTEVWSVNJT04KICAgICAgICAgMHgxRjRGQiwgLy8gUkFESU8KICAgICAgICAgMHgxRjRGQywgLy8gVklERU9DQVNTRVRURQorICAgICAgICAweDFGNEZELCAvLyBGSUxNIFBST0pFQ1RPUgorICAgICAgICAweDFGNEZGLCAvLyBQUkFZRVIgQkVBRFMKKyAgICAgICAgMHgxRjUwMCwgLy8gVFdJU1RFRCBSSUdIVFdBUkRTIEFSUk9XUworICAgICAgICAweDFGNTAxLCAvLyBDTE9DS1dJU0UgUklHSFRXQVJEUyBBTkQgTEVGVFdBUkRTIE9QRU4gQ0lSQ0xFIEFSUk9XUworICAgICAgICAweDFGNTAyLCAvLyBDTE9DS1dJU0UgUklHSFRXQVJEUyBBTkQgTEVGVFdBUkRTIE9QRU4gQ0lSQ0xFIEFSUk9XUyBXSVRIIENJUkNMRUQgT05FIE9WRVJMQVkKICAgICAgICAgMHgxRjUwMywgLy8gQ0xPQ0tXSVNFIERPV05XQVJEUyBBTkQgVVBXQVJEUyBPUEVOIENJUkNMRSBBUlJPV1MKKyAgICAgICAgMHgxRjUwNCwgLy8gQU5USUNMT0NLV0lTRSBET1dOV0FSRFMgQU5EIFVQV0FSRFMgT1BFTiBDSVJDTEUgQVJST1dTCisgICAgICAgIDB4MUY1MDUsIC8vIExPVyBCUklHSFRORVNTIFNZTUJPTAorICAgICAgICAweDFGNTA2LCAvLyBISUdIIEJSSUdIVE5FU1MgU1lNQk9MCisgICAgICAgIDB4MUY1MDcsIC8vIFNQRUFLRVIgV0lUSCBDQU5DRUxMQVRJT04gU1RST0tFCisgICAgICAgIDB4MUY1MDgsIC8vIFNQRUFLRVIKKyAgICAgICAgMHgxRjUwOSwgLy8gU1BFQUtFUiBXSVRIIE9ORSBTT1VORCBXQVZFCiAgICAgICAgIDB4MUY1MEEsIC8vIFNQRUFLRVIgV0lUSCBUSFJFRSBTT1VORCBXQVZFUwogICAgICAgICAweDFGNTBCLCAvLyBCQVRURVJZCiAgICAgICAgIDB4MUY1MEMsIC8vIEVMRUNUUklDIFBMVUcKQEAgLTYwOCwxMyArNzg1LDEwIEBACiAgICAgICAgIDB4MUY1MTIsIC8vIExPQ0sKICAgICAgICAgMHgxRjUxMywgLy8gT1BFTiBMT0NLCiAgICAgICAgIDB4MUY1MTQsIC8vIEJFTEwKKyAgICAgICAgMHgxRjUxNSwgLy8gQkVMTCBXSVRIIENBTkNFTExBVElPTiBTVFJPS0UKICAgICAgICAgMHgxRjUxNiwgLy8gQk9PS01BUksKICAgICAgICAgMHgxRjUxNywgLy8gTElOSyBTWU1CT0wKICAgICAgICAgMHgxRjUxOCwgLy8gUkFESU8gQlVUVE9OCi0gICAgICAgIDB4MUY1M0EsIC8vIFVQLVBPSU5USU5HIFJFRCBUUklBTkdMRQotICAgICAgICAweDFGNTNCLCAvLyBET1dOLVBPSU5USU5HIFJFRCBUUklBTkdMRQotICAgICAgICAweDFGNTNDLCAvLyBVUC1QT0lOVElORyBTTUFMTCBSRUQgVFJJQU5HTEUKLSAgICAgICAgMHgxRjUzRCwgLy8gRE9XTi1QT0lOVElORyBTTUFMTCBSRUQgVFJJQU5HTEUKICAgICAgICAgMHgxRjUxOSwgLy8gQkFDSyBXSVRIIExFRlRXQVJEUyBBUlJPVyBBQk9WRQogICAgICAgICAweDFGNTFBLCAvLyBFTkQgV0lUSCBMRUZUV0FSRFMgQVJST1cgQUJPVkUKICAgICAgICAgMHgxRjUxQiwgLy8gT04gV0lUSCBFWENMQU1BVElPTiBNQVJLIFdJVEggTEVGVCBSSUdIVCBBUlJPVyBBQk9WRQpAQCAtNjM0LDYgKzgwOCw4IEBACiAgICAgICAgIDB4MUY1MjksIC8vIE5VVCBBTkQgQk9MVAogICAgICAgICAweDFGNTJBLCAvLyBIT0NITwogICAgICAgICAweDFGNTJCLCAvLyBQSVNUT0wKKyAgICAgICAgMHgxRjUyQywgLy8gTUlDUk9TQ09QRQorICAgICAgICAweDFGNTJELCAvLyBURUxFU0NPUEUKICAgICAgICAgMHgxRjUyRSwgLy8gQ1JZU1RBTCBCQUxMCiAgICAgICAgIDB4MUY1MkYsIC8vIFNJWCBQT0lOVEVEIFNUQVIgV0lUSCBNSURETEUgRE9UCiAgICAgICAgIDB4MUY1MzAsIC8vIEpBUEFORVNFIFNZTUJPTCBGT1IgQkVHSU5ORVIKQEAgLTY0Niw2ICs4MjIsMTYgQEAKICAgICAgICAgMHgxRjUzNywgLy8gTEFSR0UgQkxVRSBESUFNT05ECiAgICAgICAgIDB4MUY1MzgsIC8vIFNNQUxMIE9SQU5HRSBESUFNT05ECiAgICAgICAgIDB4MUY1MzksIC8vIFNNQUxMIEJMVUUgRElBTU9ORAorICAgICAgICAweDFGNTNBLCAvLyBVUC1QT0lOVElORyBSRUQgVFJJQU5HTEUKKyAgICAgICAgMHgxRjUzQiwgLy8gRE9XTi1QT0lOVElORyBSRUQgVFJJQU5HTEUKKyAgICAgICAgMHgxRjUzQywgLy8gVVAtUE9JTlRJTkcgU01BTEwgUkVEIFRSSUFOR0xFCisgICAgICAgIDB4MUY1M0QsIC8vIERPV04tUE9JTlRJTkcgU01BTEwgUkVEIFRSSUFOR0xFCisgICAgICAgIDB4MUY1NDksIC8vIE9NIFNZTUJPTAorICAgICAgICAweDFGNTRBLCAvLyBET1ZFIE9GIFBFQUNFCisgICAgICAgIDB4MUY1NEIsIC8vIEtBQUJBCisgICAgICAgIDB4MUY1NEMsIC8vIE1PU1FVRQorICAgICAgICAweDFGNTRELCAvLyBTWU5BR09HVUUKKyAgICAgICAgMHgxRjU0RSwgLy8gTUVOT1JBSCBXSVRIIE5JTkUgQlJBTkNIRVMKICAgICAgICAgMHgxRjU1MCwgLy8gQ0xPQ0sgRkFDRSBPTkUgT0NMT0NLCiAgICAgICAgIDB4MUY1NTEsIC8vIENMT0NLIEZBQ0UgVFdPIE9DTE9DSwogICAgICAgICAweDFGNTUyLCAvLyBDTE9DSyBGQUNFIFRIUkVFIE9DTE9DSwpAQCAtNjU4LDQ4ICs4NDQsMTE3IEBACiAgICAgICAgIDB4MUY1NTksIC8vIENMT0NLIEZBQ0UgVEVOIE9DTE9DSwogICAgICAgICAweDFGNTVBLCAvLyBDTE9DSyBGQUNFIEVMRVZFTiBPQ0xPQ0sKICAgICAgICAgMHgxRjU1QiwgLy8gQ0xPQ0sgRkFDRSBUV0VMVkUgT0NMT0NLCisgICAgICAgIDB4MUY1NUMsIC8vIENMT0NLIEZBQ0UgT05FLVRISVJUWQorICAgICAgICAweDFGNTVELCAvLyBDTE9DSyBGQUNFIFRXTy1USElSVFkKKyAgICAgICAgMHgxRjU1RSwgLy8gQ0xPQ0sgRkFDRSBUSFJFRS1USElSVFkKKyAgICAgICAgMHgxRjU1RiwgLy8gQ0xPQ0sgRkFDRSBGT1VSLVRISVJUWQorICAgICAgICAweDFGNTYwLCAvLyBDTE9DSyBGQUNFIEZJVkUtVEhJUlRZCisgICAgICAgIDB4MUY1NjEsIC8vIENMT0NLIEZBQ0UgU0lYLVRISVJUWQorICAgICAgICAweDFGNTYyLCAvLyBDTE9DSyBGQUNFIFNFVkVOLVRISVJUWQorICAgICAgICAweDFGNTYzLCAvLyBDTE9DSyBGQUNFIEVJR0hULVRISVJUWQorICAgICAgICAweDFGNTY0LCAvLyBDTE9DSyBGQUNFIE5JTkUtVEhJUlRZCisgICAgICAgIDB4MUY1NjUsIC8vIENMT0NLIEZBQ0UgVEVOLVRISVJUWQorICAgICAgICAweDFGNTY2LCAvLyBDTE9DSyBGQUNFIEVMRVZFTi1USElSVFkKKyAgICAgICAgMHgxRjU2NywgLy8gQ0xPQ0sgRkFDRSBUV0VMVkUtVEhJUlRZCisgICAgICAgIDB4MUY1NkYsIC8vIENBTkRMRQorICAgICAgICAweDFGNTcwLCAvLyBNQU5URUxQSUVDRSBDTE9DSworICAgICAgICAweDFGNTczLCAvLyBIT0xFCisgICAgICAgIDB4MUY1NzQsIC8vIE1BTiBJTiBCVVNJTkVTUyBTVUlUIExFVklUQVRJTkcKKyAgICAgICAgMHgxRjU3NSwgLy8gU0xFVVRIIE9SIFNQWQorICAgICAgICAweDFGNTc2LCAvLyBEQVJLIFNVTkdMQVNTRVMKKyAgICAgICAgMHgxRjU3NywgLy8gU1BJREVSCisgICAgICAgIDB4MUY1NzgsIC8vIFNQSURFUiBXRUIKKyAgICAgICAgMHgxRjU3OSwgLy8gSk9ZU1RJQ0sKKyAgICAgICAgMHgxRjU3QSwgLy8gTUFOIERBTkNJTkcKKyAgICAgICAgMHgxRjU4NywgLy8gTElOS0VEIFBBUEVSQ0xJUFMKKyAgICAgICAgMHgxRjU4QSwgLy8gTE9XRVIgTEVGVCBCQUxMUE9JTlQgUEVOCisgICAgICAgIDB4MUY1OEIsIC8vIExPV0VSIExFRlQgRk9VTlRBSU4gUEVOCisgICAgICAgIDB4MUY1OEMsIC8vIExPV0VSIExFRlQgUEFJTlRCUlVTSAorICAgICAgICAweDFGNThELCAvLyBMT1dFUiBMRUZUIENSQVlPTgorICAgICAgICAweDFGNTkwLCAvLyBSQUlTRUQgSEFORCBXSVRIIEZJTkdFUlMgU1BMQVlFRAorICAgICAgICAweDFGNTk1LCAvLyBSRVZFUlNFRCBIQU5EIFdJVEggTUlERExFIEZJTkdFUiBFWFRFTkRFRAorICAgICAgICAweDFGNTk2LCAvLyBSQUlTRUQgSEFORCBXSVRIIFBBUlQgQkVUV0VFTiBNSURETEUgQU5EIFJJTkcgRklOR0VSUworICAgICAgICAweDFGNUE0LCAvLyBCTEFDSyBIRUFSVAorICAgICAgICAweDFGNUE1LCAvLyBERVNLVE9QIENPTVBVVEVSCisgICAgICAgIDB4MUY1QTgsIC8vIFBSSU5URVIKKyAgICAgICAgMHgxRjVCMSwgLy8gVEhSRUUgQlVUVE9OIE1PVVNFCisgICAgICAgIDB4MUY1QjIsIC8vIFRSQUNLQkFMTAorICAgICAgICAweDFGNUJDLCAvLyBGUkFNRSBXSVRIIFBJQ1RVUkUKKyAgICAgICAgMHgxRjVDMiwgLy8gQ0FSRCBJTkRFWCBESVZJREVSUworICAgICAgICAweDFGNUMzLCAvLyBDQVJEIEZJTEUgQk9YCisgICAgICAgIDB4MUY1QzQsIC8vIEZJTEUgQ0FCSU5FVAorICAgICAgICAweDFGNUQxLCAvLyBXQVNURUJBU0tFVAorICAgICAgICAweDFGNUQyLCAvLyBTUElSQUwgTk9URSBQQUQKKyAgICAgICAgMHgxRjVEMywgLy8gU1BJUkFMIENBTEVOREFSIFBBRAorICAgICAgICAweDFGNURDLCAvLyBDT01QUkVTU0lPTgorICAgICAgICAweDFGNURELCAvLyBPTEQgS0VZCisgICAgICAgIDB4MUY1REUsIC8vIFJPTExFRC1VUCBORVdTUEFQRVIKKyAgICAgICAgMHgxRjVFMSwgLy8gREFHR0VSIEtOSUZFCisgICAgICAgIDB4MUY1RTMsIC8vIFNQRUFLSU5HIEhFQUQgSU4gU0lMSE9VRVRURQorICAgICAgICAweDFGNUU4LCAvLyBMRUZUIFNQRUVDSCBCVUJCTEUKKyAgICAgICAgMHgxRjVFRiwgLy8gUklHSFQgQU5HRVIgQlVCQkxFCisgICAgICAgIDB4MUY1RjMsIC8vIEJBTExPVCBCT1ggV0lUSCBCQUxMT1QKKyAgICAgICAgMHgxRjVGQSwgLy8gV09STEQgTUFQCiAgICAgICAgIDB4MUY1RkIsIC8vIE1PVU5UIEZVSkkKICAgICAgICAgMHgxRjVGQywgLy8gVE9LWU8gVE9XRVIKICAgICAgICAgMHgxRjVGRCwgLy8gU1RBVFVFIE9GIExJQkVSVFkKICAgICAgICAgMHgxRjVGRSwgLy8gU0lMSE9VRVRURSBPRiBKQVBBTgogICAgICAgICAweDFGNUZGLCAvLyBNT1lBSQorICAgICAgICAweDFGNjAwLCAvLyBHUklOTklORyBGQUNFCiAgICAgICAgIDB4MUY2MDEsIC8vIEdSSU5OSU5HIEZBQ0UgV0lUSCBTTUlMSU5HIEVZRVMKICAgICAgICAgMHgxRjYwMiwgLy8gRkFDRSBXSVRIIFRFQVJTIE9GIEpPWQogICAgICAgICAweDFGNjAzLCAvLyBTTUlMSU5HIEZBQ0UgV0lUSCBPUEVOIE1PVVRICiAgICAgICAgIDB4MUY2MDQsIC8vIFNNSUxJTkcgRkFDRSBXSVRIIE9QRU4gTU9VVEggQU5EIFNNSUxJTkcgRVlFUwogICAgICAgICAweDFGNjA1LCAvLyBTTUlMSU5HIEZBQ0UgV0lUSCBPUEVOIE1PVVRIIEFORCBDT0xEIFNXRUFUCiAgICAgICAgIDB4MUY2MDYsIC8vIFNNSUxJTkcgRkFDRSBXSVRIIE9QRU4gTU9VVEggQU5EIFRJR0hUTFktQ0xPU0VEIEVZRVMKKyAgICAgICAgMHgxRjYwNywgLy8gU01JTElORyBGQUNFIFdJVEggSEFMTworICAgICAgICAweDFGNjA4LCAvLyBTTUlMSU5HIEZBQ0UgV0lUSCBIT1JOUwogICAgICAgICAweDFGNjA5LCAvLyBXSU5LSU5HIEZBQ0UKICAgICAgICAgMHgxRjYwQSwgLy8gU01JTElORyBGQUNFIFdJVEggU01JTElORyBFWUVTCiAgICAgICAgIDB4MUY2MEIsIC8vIEZBQ0UgU0FWT1VSSU5HIERFTElDSU9VUyBGT09ECiAgICAgICAgIDB4MUY2MEMsIC8vIFJFTElFVkVEIEZBQ0UKICAgICAgICAgMHgxRjYwRCwgLy8gU01JTElORyBGQUNFIFdJVEggSEVBUlQtU0hBUEVEIEVZRVMKKyAgICAgICAgMHgxRjYwRSwgLy8gU01JTElORyBGQUNFIFdJVEggU1VOR0xBU1NFUwogICAgICAgICAweDFGNjBGLCAvLyBTTUlSS0lORyBGQUNFCisgICAgICAgIDB4MUY2MTAsIC8vIE5FVVRSQUwgRkFDRQorICAgICAgICAweDFGNjExLCAvLyBFWFBSRVNTSU9OTEVTUyBGQUNFCiAgICAgICAgIDB4MUY2MTIsIC8vIFVOQU1VU0VEIEZBQ0UKICAgICAgICAgMHgxRjYxMywgLy8gRkFDRSBXSVRIIENPTEQgU1dFQVQKICAgICAgICAgMHgxRjYxNCwgLy8gUEVOU0lWRSBGQUNFCisgICAgICAgIDB4MUY2MTUsIC8vIENPTkZVU0VEIEZBQ0UKICAgICAgICAgMHgxRjYxNiwgLy8gQ09ORk9VTkRFRCBGQUNFCisgICAgICAgIDB4MUY2MTcsIC8vIEtJU1NJTkcgRkFDRQogICAgICAgICAweDFGNjE4LCAvLyBGQUNFIFRIUk9XSU5HIEEgS0lTUworICAgICAgICAweDFGNjE5LCAvLyBLSVNTSU5HIEZBQ0UgV0lUSCBTTUlMSU5HIEVZRVMKICAgICAgICAgMHgxRjYxQSwgLy8gS0lTU0lORyBGQUNFIFdJVEggQ0xPU0VEIEVZRVMKKyAgICAgICAgMHgxRjYxQiwgLy8gRkFDRSBXSVRIIFNUVUNLLU9VVCBUT05HVUUKICAgICAgICAgMHgxRjYxQywgLy8gRkFDRSBXSVRIIFNUVUNLLU9VVCBUT05HVUUgQU5EIFdJTktJTkcgRVlFCiAgICAgICAgIDB4MUY2MUQsIC8vIEZBQ0UgV0lUSCBTVFVDSy1PVVQgVE9OR1VFIEFORCBUSUdIVExZLUNMT1NFRCBFWUVTCiAgICAgICAgIDB4MUY2MUUsIC8vIERJU0FQUE9JTlRFRCBGQUNFCisgICAgICAgIDB4MUY2MUYsIC8vIFdPUlJJRUQgRkFDRQogICAgICAgICAweDFGNjIwLCAvLyBBTkdSWSBGQUNFCiAgICAgICAgIDB4MUY2MjEsIC8vIFBPVVRJTkcgRkFDRQogICAgICAgICAweDFGNjIyLCAvLyBDUllJTkcgRkFDRQogICAgICAgICAweDFGNjIzLCAvLyBQRVJTRVZFUklORyBGQUNFCiAgICAgICAgIDB4MUY2MjQsIC8vIEZBQ0UgV0lUSCBMT09LIE9GIFRSSVVNUEgKICAgICAgICAgMHgxRjYyNSwgLy8gRElTQVBQT0lOVEVEIEJVVCBSRUxJRVZFRCBGQUNFCisgICAgICAgIDB4MUY2MjYsIC8vIEZST1dOSU5HIEZBQ0UgV0lUSCBPUEVOIE1PVVRICisgICAgICAgIDB4MUY2MjcsIC8vIEFOR1VJU0hFRCBGQUNFCiAgICAgICAgIDB4MUY2MjgsIC8vIEZFQVJGVUwgRkFDRQogICAgICAgICAweDFGNjI5LCAvLyBXRUFSWSBGQUNFCiAgICAgICAgIDB4MUY2MkEsIC8vIFNMRUVQWSBGQUNFCiAgICAgICAgIDB4MUY2MkIsIC8vIFRJUkVEIEZBQ0UKKyAgICAgICAgMHgxRjYyQywgLy8gR1JJTUFDSU5HIEZBQ0UKICAgICAgICAgMHgxRjYyRCwgLy8gTE9VRExZIENSWUlORyBGQUNFCisgICAgICAgIDB4MUY2MkUsIC8vIEZBQ0UgV0lUSCBPUEVOIE1PVVRICisgICAgICAgIDB4MUY2MkYsIC8vIEhVU0hFRCBGQUNFCiAgICAgICAgIDB4MUY2MzAsIC8vIEZBQ0UgV0lUSCBPUEVOIE1PVVRIIEFORCBDT0xEIFNXRUFUCiAgICAgICAgIDB4MUY2MzEsIC8vIEZBQ0UgU0NSRUFNSU5HIElOIEZFQVIKICAgICAgICAgMHgxRjYzMiwgLy8gQVNUT05JU0hFRCBGQUNFCiAgICAgICAgIDB4MUY2MzMsIC8vIEZMVVNIRUQgRkFDRQorICAgICAgICAweDFGNjM0LCAvLyBTTEVFUElORyBGQUNFCiAgICAgICAgIDB4MUY2MzUsIC8vIERJWlpZIEZBQ0UKKyAgICAgICAgMHgxRjYzNiwgLy8gRkFDRSBXSVRIT1VUIE1PVVRICiAgICAgICAgIDB4MUY2MzcsIC8vIEZBQ0UgV0lUSCBNRURJQ0FMIE1BU0sKICAgICAgICAgMHgxRjYzOCwgLy8gR1JJTk5JTkcgQ0FUIEZBQ0UgV0lUSCBTTUlMSU5HIEVZRVMKICAgICAgICAgMHgxRjYzOSwgLy8gQ0FUIEZBQ0UgV0lUSCBURUFSUyBPRiBKT1kKQEAgLTcxMCw2ICs5NjUsMTAgQEAKICAgICAgICAgMHgxRjYzRSwgLy8gUE9VVElORyBDQVQgRkFDRQogICAgICAgICAweDFGNjNGLCAvLyBDUllJTkcgQ0FUIEZBQ0UKICAgICAgICAgMHgxRjY0MCwgLy8gV0VBUlkgQ0FUIEZBQ0UKKyAgICAgICAgMHgxRjY0MSwgLy8gU0xJR0hUTFkgRlJPV05JTkcgRkFDRQorICAgICAgICAweDFGNjQyLCAvLyBTTElHSFRMWSBTTUlMSU5HIEZBQ0UKKyAgICAgICAgMHgxRjY0MywgLy8gVVBTSURFLURPV04gRkFDRQorICAgICAgICAweDFGNjQ0LCAvLyBGQUNFIFdJVEggUk9MTElORyBFWUVTCiAgICAgICAgIDB4MUY2NDUsIC8vIEZBQ0UgV0lUSCBOTyBHT09EIEdFU1RVUkUKICAgICAgICAgMHgxRjY0NiwgLy8gRkFDRSBXSVRIIE9LIEdFU1RVUkUKICAgICAgICAgMHgxRjY0NywgLy8gUEVSU09OIEJPV0lORyBERUVQTFkKQEAgLTcyMiwyMyArOTgxLDQ0IEBACiAgICAgICAgIDB4MUY2NEUsIC8vIFBFUlNPTiBXSVRIIFBPVVRJTkcgRkFDRQogICAgICAgICAweDFGNjRGLCAvLyBQRVJTT04gV0lUSCBGT0xERUQgSEFORFMKICAgICAgICAgMHgxRjY4MCwgLy8gUk9DS0VUCisgICAgICAgIDB4MUY2ODEsIC8vIEhFTElDT1BURVIKKyAgICAgICAgMHgxRjY4MiwgLy8gU1RFQU0gTE9DT01PVElWRQogICAgICAgICAweDFGNjgzLCAvLyBSQUlMV0FZIENBUgogICAgICAgICAweDFGNjg0LCAvLyBISUdILVNQRUVEIFRSQUlOCiAgICAgICAgIDB4MUY2ODUsIC8vIEhJR0gtU1BFRUQgVFJBSU4gV0lUSCBCVUxMRVQgTk9TRQorICAgICAgICAweDFGNjg2LCAvLyBUUkFJTgogICAgICAgICAweDFGNjg3LCAvLyBNRVRSTworICAgICAgICAweDFGNjg4LCAvLyBMSUdIVCBSQUlMCiAgICAgICAgIDB4MUY2ODksIC8vIFNUQVRJT04KKyAgICAgICAgMHgxRjY4QSwgLy8gVFJBTQorICAgICAgICAweDFGNjhCLCAvLyBUUkFNIENBUgogICAgICAgICAweDFGNjhDLCAvLyBCVVMKKyAgICAgICAgMHgxRjY4RCwgLy8gT05DT01JTkcgQlVTCisgICAgICAgIDB4MUY2OEUsIC8vIFRST0xMRVlCVVMKICAgICAgICAgMHgxRjY4RiwgLy8gQlVTIFNUT1AKKyAgICAgICAgMHgxRjY5MCwgLy8gTUlOSUJVUwogICAgICAgICAweDFGNjkxLCAvLyBBTUJVTEFOQ0UKICAgICAgICAgMHgxRjY5MiwgLy8gRklSRSBFTkdJTkUKICAgICAgICAgMHgxRjY5MywgLy8gUE9MSUNFIENBUgorICAgICAgICAweDFGNjk0LCAvLyBPTkNPTUlORyBQT0xJQ0UgQ0FSCiAgICAgICAgIDB4MUY2OTUsIC8vIFRBWEkKKyAgICAgICAgMHgxRjY5NiwgLy8gT05DT01JTkcgVEFYSQogICAgICAgICAweDFGNjk3LCAvLyBBVVRPTU9CSUxFCisgICAgICAgIDB4MUY2OTgsIC8vIE9OQ09NSU5HIEFVVE9NT0JJTEUKICAgICAgICAgMHgxRjY5OSwgLy8gUkVDUkVBVElPTkFMIFZFSElDTEUKICAgICAgICAgMHgxRjY5QSwgLy8gREVMSVZFUlkgVFJVQ0sKKyAgICAgICAgMHgxRjY5QiwgLy8gQVJUSUNVTEFURUQgTE9SUlkKKyAgICAgICAgMHgxRjY5QywgLy8gVFJBQ1RPUgorICAgICAgICAweDFGNjlELCAvLyBNT05PUkFJTAorICAgICAgICAweDFGNjlFLCAvLyBNT1VOVEFJTiBSQUlMV0FZCisgICAgICAgIDB4MUY2OUYsIC8vIFNVU1BFTlNJT04gUkFJTFdBWQorICAgICAgICAweDFGNkEwLCAvLyBNT1VOVEFJTiBDQUJMRVdBWQorICAgICAgICAweDFGNkExLCAvLyBBRVJJQUwgVFJBTVdBWQogICAgICAgICAweDFGNkEyLCAvLyBTSElQCisgICAgICAgIDB4MUY2QTMsIC8vIFJPV0JPQVQKICAgICAgICAgMHgxRjZBNCwgLy8gU1BFRURCT0FUCiAgICAgICAgIDB4MUY2QTUsIC8vIEhPUklaT05UQUwgVFJBRkZJQyBMSUdIVAorICAgICAgICAweDFGNkE2LCAvLyBWRVJUSUNBTCBUUkFGRklDIExJR0hUCiAgICAgICAgIDB4MUY2QTcsIC8vIENPTlNUUlVDVElPTiBTSUdOCiAgICAgICAgIDB4MUY2QTgsIC8vIFBPTElDRSBDQVJTIFJFVk9MVklORyBMSUdIVAogICAgICAgICAweDFGNkE5LCAvLyBUUklBTkdVTEFSIEZMQUcgT04gUE9TVApAQCAtNzQ2LDE0ICsxMDI2LDI2MSBAQAogICAgICAgICAweDFGNkFCLCAvLyBOTyBFTlRSWSBTSUdOCiAgICAgICAgIDB4MUY2QUMsIC8vIFNNT0tJTkcgU1lNQk9MCiAgICAgICAgIDB4MUY2QUQsIC8vIE5PIFNNT0tJTkcgU1lNQk9MCisgICAgICAgIDB4MUY2QUUsIC8vIFBVVCBMSVRURVIgSU4gSVRTIFBMQUNFIFNZTUJPTAorICAgICAgICAweDFGNkFGLCAvLyBETyBOT1QgTElUVEVSIFNZTUJPTAorICAgICAgICAweDFGNkIwLCAvLyBQT1RBQkxFIFdBVEVSIFNZTUJPTAorICAgICAgICAweDFGNkIxLCAvLyBOT04tUE9UQUJMRSBXQVRFUiBTWU1CT0wKICAgICAgICAgMHgxRjZCMiwgLy8gQklDWUNMRQorICAgICAgICAweDFGNkIzLCAvLyBOTyBCSUNZQ0xFUworICAgICAgICAweDFGNkI0LCAvLyBCSUNZQ0xJU1QKKyAgICAgICAgMHgxRjZCNSwgLy8gTU9VTlRBSU4gQklDWUNMSVNUCiAgICAgICAgIDB4MUY2QjYsIC8vIFBFREVTVFJJQU4KKyAgICAgICAgMHgxRjZCNywgLy8gTk8gUEVERVNUUklBTlMKKyAgICAgICAgMHgxRjZCOCwgLy8gQ0hJTERSRU4gQ1JPU1NJTkcKICAgICAgICAgMHgxRjZCOSwgLy8gTUVOUyBTWU1CT0wKICAgICAgICAgMHgxRjZCQSwgLy8gV09NRU5TIFNZTUJPTAogICAgICAgICAweDFGNkJCLCAvLyBSRVNUUk9PTQogICAgICAgICAweDFGNkJDLCAvLyBCQUJZIFNZTUJPTAogICAgICAgICAweDFGNkJELCAvLyBUT0lMRVQKICAgICAgICAgMHgxRjZCRSwgLy8gV0FURVIgQ0xPU0VUCi0gICAgICAgIDB4MUY2QzAgIC8vIEJBVAorICAgICAgICAweDFGNkJGLCAvLyBTSE9XRVIKKyAgICAgICAgMHgxRjZDMCwgLy8gQkFUSAorICAgICAgICAweDFGNkMxLCAvLyBCQVRIVFVCCisgICAgICAgIDB4MUY2QzIsIC8vIFBBU1NQT1JUIENPTlRST0wKKyAgICAgICAgMHgxRjZDMywgLy8gQ1VTVE9NUworICAgICAgICAweDFGNkM0LCAvLyBCQUdHQUdFIENMQUlNCisgICAgICAgIDB4MUY2QzUsIC8vIExFRlQgTFVHR0FHRQorICAgICAgICAweDFGNkNCLCAvLyBDT1VDSCBBTkQgTEFNUAorICAgICAgICAweDFGNkNDLCAvLyBTTEVFUElORyBBQ0NPTU1PREFUSU9OCisgICAgICAgIDB4MUY2Q0QsIC8vIFNIT1BQSU5HIEJBR1MKKyAgICAgICAgMHgxRjZDRSwgLy8gQkVMTEhPUCBCRUxMCisgICAgICAgIDB4MUY2Q0YsIC8vIEJFRAorICAgICAgICAweDFGNkQwLCAvLyBQTEFDRSBPRiBXT1JTSElQCisgICAgICAgIDB4MUY2RDEsIC8vIE9DVEFHT05BTCBTSUdOCisgICAgICAgIDB4MUY2RDIsIC8vIFNIT1BQSU5HIFRST0xMRVkKKyAgICAgICAgMHgxRjZFMCwgLy8gSEFNTUVSIEFORCBXUkVOQ0gKKyAgICAgICAgMHgxRjZFMSwgLy8gU0hJRUxECisgICAgICAgIDB4MUY2RTIsIC8vIE9JTCBEUlVNCisgICAgICAgIDB4MUY2RTMsIC8vIE1PVE9SV0FZCisgICAgICAgIDB4MUY2RTQsIC8vIFJBSUxXQVkgVFJBQ0sKKyAgICAgICAgMHgxRjZFNSwgLy8gTU9UT1IgQk9BVAorICAgICAgICAweDFGNkU5LCAvLyBTTUFMTCBBSVJQTEFORQorICAgICAgICAweDFGNkVCLCAvLyBBSVJQTEFORSBERVBBUlRVUkUKKyAgICAgICAgMHgxRjZFQywgLy8gQUlSUExBTkUgQVJSSVZJTkcKKyAgICAgICAgMHgxRjZGMCwgLy8gU0FURUxMSVRFCisgICAgICAgIDB4MUY2RjMsIC8vIFBBU1NFTkdFUiBTSElQCisgICAgICAgIDB4MUY2RjQsIC8vIFNDT09URVIKKyAgICAgICAgMHgxRjZGNSwgLy8gTU9UT1IgU0NPT1RFUgorICAgICAgICAweDFGNkY2LCAvLyBDQU5PRQorICAgICAgICAweDFGNkY3LCAvLyBTTEVECisgICAgICAgIDB4MUY2RjgsIC8vIEZMWUlORyBTQVVDRVIKKyAgICAgICAgMHgxRjkxMCwgLy8gWklQUEVSLU1PVVRIIEZBQ0UKKyAgICAgICAgMHgxRjkxMSwgLy8gTU9ORVktTU9VVEggRkFDRQorICAgICAgICAweDFGOTEyLCAvLyBGQUNFIFdJVEggVEhFUk1PTUVURVIKKyAgICAgICAgMHgxRjkxMywgLy8gTkVSRCBGQUNFCisgICAgICAgIDB4MUY5MTQsIC8vIFRISU5LSU5HIEZBQ0UKKyAgICAgICAgMHgxRjkxNSwgLy8gRkFDRSBXSVRIIEhFQUQtQkFOREFHRQorICAgICAgICAweDFGOTE2LCAvLyBST0JPVCBGQUNFCisgICAgICAgIDB4MUY5MTcsIC8vIEhVR0dJTkcgRkFDRQorICAgICAgICAweDFGOTE4LCAvLyBTSUdOIE9GIFRIRSBIT1JOUworICAgICAgICAweDFGOTE5LCAvLyBDQUxMIE1FIEhBTkQKKyAgICAgICAgMHgxRjkxQSwgLy8gUkFJU0VEIEJBQ0sgT0YgSEFORAorICAgICAgICAweDFGOTFCLCAvLyBMRUZULUZBQ0lORyBGSVNUCisgICAgICAgIDB4MUY5MUMsIC8vIFJJR0hULUZBQ0lORyBGSVNUCisgICAgICAgIDB4MUY5MUQsIC8vIEhBTkRTSEFLRQorICAgICAgICAweDFGOTFFLCAvLyBIQU5EIFdJVEggSU5ERVggQU5EIE1JRERMRSBGSU5HRVJTIENST1NTRUQKKyAgICAgICAgMHgxRjkxRiwgLy8gTE9WRS1ZT1UgR0VTVFVSRQorICAgICAgICAweDFGOTIwLCAvLyBGQUNFIFdJVEggQ09XQk9ZIEhBVAorICAgICAgICAweDFGOTIxLCAvLyBDTE9XTiBGQUNFCisgICAgICAgIDB4MUY5MjIsIC8vIE5BVVNFQVRFRCBGQUNFCisgICAgICAgIDB4MUY5MjMsIC8vIFJPTExJTkcgT04gVEhFIEZMT09SIExBVUdISU5HCisgICAgICAgIDB4MUY5MjQsIC8vIERST09MSU5HIEZBQ0UKKyAgICAgICAgMHgxRjkyNSwgLy8gTFlJTkcgRkFDRQorICAgICAgICAweDFGOTI2LCAvLyBGQUNFIFBBTE0KKyAgICAgICAgMHgxRjkyNywgLy8gU05FRVpJTkcgRkFDRQorICAgICAgICAweDFGOTI4LCAvLyBGQUNFIFdJVEggUkFJU0VEIEVZRUJST1cKKyAgICAgICAgMHgxRjkyOSwgLy8gU1RBUi1TVFJVQ0sKKyAgICAgICAgMHgxRjkyQSwgLy8gQ1JBWlkgRkFDRQorICAgICAgICAweDFGOTJCLCAvLyBTSFVTSElORyBGQUNFCisgICAgICAgIDB4MUY5MkMsIC8vIEZBQ0UgV0lUSCBTWU1CT0xTIE9WRVIgTU9VVEgKKyAgICAgICAgMHgxRjkyRCwgLy8gRkFDRSBXSVRIIEhBTkQgT1ZFUiBNT1VUSAorICAgICAgICAweDFGOTJFLCAvLyBGQUNFIFZPTUlUSU5HCisgICAgICAgIDB4MUY5MkYsIC8vIEVYUExPRElORyBIRUFECisgICAgICAgIDB4MUY5MzAsIC8vIFBSRUdOQU5UIFdPTUFOCisgICAgICAgIDB4MUY5MzEsIC8vIEJSRUFTVC1GRUVESU5HCisgICAgICAgIDB4MUY5MzIsIC8vIFBBTE1TIFVQIFRPR0VUSEVSCisgICAgICAgIDB4MUY5MzMsIC8vIFNFTEZJRQorICAgICAgICAweDFGOTM0LCAvLyBQUklOQ0UKKyAgICAgICAgMHgxRjkzNSwgLy8gTUFOIElOIFRVWEVETworICAgICAgICAweDFGOTM2LCAvLyBNT1RIRVIgQ0hSSVNUTUFTCisgICAgICAgIDB4MUY5MzcsIC8vIFNIUlVHCisgICAgICAgIDB4MUY5MzgsIC8vIFBFUlNPTiBET0lORyBDQVJUV0hFRUwKKyAgICAgICAgMHgxRjkzOSwgLy8gSlVHR0xJTkcKKyAgICAgICAgMHgxRjkzQSwgLy8gRkVOQ0VSCisgICAgICAgIDB4MUY5M0MsIC8vIFdSRVNUTEVSUworICAgICAgICAweDFGOTNELCAvLyBXQVRFUiBQT0xPCisgICAgICAgIDB4MUY5M0UsIC8vIEhBTkRCQUxMCisgICAgICAgIDB4MUY5NDAsIC8vIFdJTFRFRCBGTE9XRVIKKyAgICAgICAgMHgxRjk0MSwgLy8gRFJVTSBXSVRIIERSVU1TVElDS1MKKyAgICAgICAgMHgxRjk0MiwgLy8gQ0xJTktJTkcgR0xBU1NFUworICAgICAgICAweDFGOTQzLCAvLyBUVU1CTEVSIEdMQVNTCisgICAgICAgIDB4MUY5NDQsIC8vIFNQT09OCisgICAgICAgIDB4MUY5NDUsIC8vIEdPQUwgTkVUCisgICAgICAgIDB4MUY5NDcsIC8vIEZJUlNUIFBMQUNFIE1FREFMCisgICAgICAgIDB4MUY5NDgsIC8vIFNFQ09ORCBQTEFDRSBNRURBTAorICAgICAgICAweDFGOTQ5LCAvLyBUSElSRCBQTEFDRSBNRURBTAorICAgICAgICAweDFGOTRBLCAvLyBCT1hJTkcgR0xPVkUKKyAgICAgICAgMHgxRjk0QiwgLy8gTUFSVElBTCBBUlRTIFVOSUZPUk0KKyAgICAgICAgMHgxRjk0QywgLy8gQ1VSTElORyBTVE9ORQorICAgICAgICAweDFGOTUwLCAvLyBDUk9JU1NBTlQKKyAgICAgICAgMHgxRjk1MSwgLy8gQVZPQ0FETworICAgICAgICAweDFGOTUyLCAvLyBDVUNVTUJFUgorICAgICAgICAweDFGOTUzLCAvLyBCQUNPTgorICAgICAgICAweDFGOTU0LCAvLyBQT1RBVE8KKyAgICAgICAgMHgxRjk1NSwgLy8gQ0FSUk9UCisgICAgICAgIDB4MUY5NTYsIC8vIEJBR1VFVFRFIEJSRUFECisgICAgICAgIDB4MUY5NTcsIC8vIEdSRUVOIFNBTEFECisgICAgICAgIDB4MUY5NTgsIC8vIFNIQUxMT1cgUEFOIE9GIEZPT0QKKyAgICAgICAgMHgxRjk1OSwgLy8gU1RVRkZFRCBGTEFUQlJFQUQKKyAgICAgICAgMHgxRjk1QSwgLy8gRUdHCisgICAgICAgIDB4MUY5NUIsIC8vIEdMQVNTIE9GIE1JTEsKKyAgICAgICAgMHgxRjk1QywgLy8gUEVBTlVUUworICAgICAgICAweDFGOTVELCAvLyBLSVdJRlJVSVQKKyAgICAgICAgMHgxRjk1RSwgLy8gUEFOQ0FLRVMKKyAgICAgICAgMHgxRjk1RiwgLy8gRFVNUExJTkcKKyAgICAgICAgMHgxRjk2MCwgLy8gRk9SVFVORSBDT09LSUUKKyAgICAgICAgMHgxRjk2MSwgLy8gVEFLRU9VVCBCT1gKKyAgICAgICAgMHgxRjk2MiwgLy8gQ0hPUFNUSUNLUworICAgICAgICAweDFGOTYzLCAvLyBCT1dMIFdJVEggU1BPT04KKyAgICAgICAgMHgxRjk2NCwgLy8gQ1VQIFdJVEggU1RSQVcKKyAgICAgICAgMHgxRjk2NSwgLy8gQ09DT05VVAorICAgICAgICAweDFGOTY2LCAvLyBCUk9DQ09MSQorICAgICAgICAweDFGOTY3LCAvLyBQSUUKKyAgICAgICAgMHgxRjk2OCwgLy8gUFJFVFpFTAorICAgICAgICAweDFGOTY5LCAvLyBDVVQgT0YgTUVBVAorICAgICAgICAweDFGOTZBLCAvLyBTQU5EV0lDSAorICAgICAgICAweDFGOTZCLCAvLyBDQU5ORUQgRk9PRAorICAgICAgICAweDFGOTgwLCAvLyBDUkFCCisgICAgICAgIDB4MUY5ODEsIC8vIExJT04gRkFDRQorICAgICAgICAweDFGOTgyLCAvLyBTQ09SUElPTgorICAgICAgICAweDFGOTgzLCAvLyBUVVJLRVkKKyAgICAgICAgMHgxRjk4NCwgLy8gVU5JQ09STiBGQUNFCisgICAgICAgIDB4MUY5ODUsIC8vIEVBR0xFCisgICAgICAgIDB4MUY5ODYsIC8vIERVQ0sKKyAgICAgICAgMHgxRjk4NywgLy8gQkFUCisgICAgICAgIDB4MUY5ODgsIC8vIFNIQVJLCisgICAgICAgIDB4MUY5ODksIC8vIE9XTAorICAgICAgICAweDFGOThBLCAvLyBGT1ggRkFDRQorICAgICAgICAweDFGOThCLCAvLyBCVVRURVJGTFkKKyAgICAgICAgMHgxRjk4QywgLy8gREVFUgorICAgICAgICAweDFGOThELCAvLyBHT1JJTExBCisgICAgICAgIDB4MUY5OEUsIC8vIExJWkFSRAorICAgICAgICAweDFGOThGLCAvLyBSSElOT0NFUk9TCisgICAgICAgIDB4MUY5OTAsIC8vIFNIUklNUAorICAgICAgICAweDFGOTkxLCAvLyBTUVVJRAorICAgICAgICAweDFGOTkyLCAvLyBHSVJBRkZFCisgICAgICAgIDB4MUY5OTMsIC8vIFpFQlJBCisgICAgICAgIDB4MUY5OTQsIC8vIEhFREdFSE9HCisgICAgICAgIDB4MUY5OTUsIC8vIFNBVVJPUE9ECisgICAgICAgIDB4MUY5OTYsIC8vIFQtUkVYCisgICAgICAgIDB4MUY5OTcsIC8vIENSSUNLRVQKKyAgICAgICAgMHgxRjlDMCwgLy8gQ0hFRVNFIFdFREdFCisgICAgICAgIDB4MUY5RDAsIC8vIEZBQ0UgV0lUSCBNT05PQ0xFCisgICAgICAgIDB4MUY5RDEsIC8vIEFEVUxUCisgICAgICAgIDB4MUY5RDIsIC8vIENISUxECisgICAgICAgIDB4MUY5RDMsIC8vIE9MREVSIEFEVUxUCisgICAgICAgIDB4MUY5RDQsIC8vIEJFQVJERUQgUEVSU09OCisgICAgICAgIDB4MUY5RDUsIC8vIFdPTUFOIFdJVEggSEVBRFNDQVJGCisgICAgICAgIDB4MUY5RDYsIC8vIFBFUlNPTiBJTiBTVEVBTVkgUk9PTQorICAgICAgICAweDFGOUQ3LCAvLyBQRVJTT04gQ0xJTUJJTkcKKyAgICAgICAgMHgxRjlEOCwgLy8gUEVSU09OIElOIExPVFVTIFBPU0lUSU9OCisgICAgICAgIDB4MUY5RDksIC8vIE1BR0UKKyAgICAgICAgMHgxRjlEQSwgLy8gRkFJUlkKKyAgICAgICAgMHgxRjlEQiwgLy8gVkFNUElSRQorICAgICAgICAweDFGOURDLCAvLyBNRVJQRVJTT04KKyAgICAgICAgMHgxRjlERCwgLy8gRUxGCisgICAgICAgIDB4MUY5REUsIC8vIEdFTklFCisgICAgICAgIDB4MUY5REYsIC8vIFpPTUJJRQorICAgICAgICAweDFGOUUwLCAvLyBCUkFJTgorICAgICAgICAweDFGOUUxLCAvLyBPUkFOR0UgSEVBUlQKKyAgICAgICAgMHgxRjlFMiwgLy8gQklMTEVEIENBUAorICAgICAgICAweDFGOUUzLCAvLyBTQ0FSRgorICAgICAgICAweDFGOUU0LCAvLyBHTE9WRVMKKyAgICAgICAgMHgxRjlFNSwgLy8gQ09BVAorICAgICAgICAweDFGOUU2LCAvLyBTT0NLUworICAgIH07CisKKyAgICAvLyBBbGwgbmV3IGVtb2ppIGNoYXJhY3RlcnMgYmV0d2VlbiBFbW9qaSA1LjAgYW5kIEVtb2ppIDExCisgICAgLy8gVXNlZCBieSBGb250Q292ZXJhZ2VUZXN0IG9uIHRvcCBvZiBBTExfRU1PSkkKKyAgICAvLyBBTExfRU1PSkkgaXMgdXNlZCBib3RoIGJ5IGN0cy5Gb250Q292ZXJhZ2VUZXN0IGFuZCBjdHMuRW1vamlUZXN0LiBjdHMuRW1vamlUZXN0IGRvZXMKKyAgICAvLyB2ZXJpZmljYXRpb24gdmlhIENoYXJhY3Rlci5pc0RlZmluZWQgYW5kIGlzIGJlaGluZCB0aGUgbGF0ZXN0IFVuaWNvZGUgRW1vamkgc2V0LgorICAgIHN0YXRpYyBmaW5hbCBpbnRbXSBORVdfRU1PSkkgPSB7CisgICAgICAgIDB4MjY1RiwKKyAgICAgICAgMHgyNjdFLAorICAgICAgICAweDFGNkY5LAorICAgICAgICAweDFGOTRELAorICAgICAgICAweDFGOTRGLAorICAgICAgICAweDFGOTZDLAorICAgICAgICAweDFGOTZELAorICAgICAgICAweDFGOTZFLAorICAgICAgICAweDFGOTZGLAorICAgICAgICAweDFGOTcwLAorICAgICAgICAweDFGOTczLAorICAgICAgICAweDFGOTc0LAorICAgICAgICAweDFGOTc1LAorICAgICAgICAweDFGOTc2LAorICAgICAgICAweDFGOTdBLAorICAgICAgICAweDFGOTdDLAorICAgICAgICAweDFGOTdELAorICAgICAgICAweDFGOTdFLAorICAgICAgICAweDFGOTdGLAorICAgICAgICAweDFGOTk4LAorICAgICAgICAweDFGOTk5LAorICAgICAgICAweDFGOTlBLAorICAgICAgICAweDFGOTlCLAorICAgICAgICAweDFGOTlDLAorICAgICAgICAweDFGOTlELAorICAgICAgICAweDFGOTlFLAorICAgICAgICAweDFGOTlGLAorICAgICAgICAweDFGOUEwLAorICAgICAgICAweDFGOUExLAorICAgICAgICAweDFGOUEyLAorICAgICAgICAweDFGOUIwLAorICAgICAgICAweDFGOUIxLAorICAgICAgICAweDFGOUIyLAorICAgICAgICAweDFGOUIzLAorICAgICAgICAweDFGOUI0LAorICAgICAgICAweDFGOUI1LAorICAgICAgICAweDFGOUI2LAorICAgICAgICAweDFGOUI3LAorICAgICAgICAweDFGOUI4LAorICAgICAgICAweDFGOUI5LAorICAgICAgICAweDFGOUMxLAorICAgICAgICAweDFGOUMyLAorICAgICAgICAweDFGOUU3LAorICAgICAgICAweDFGOUU4LAorICAgICAgICAweDFGOUU5LAorICAgICAgICAweDFGOUVBLAorICAgICAgICAweDFGOUVCLAorICAgICAgICAweDFGOUVDLAorICAgICAgICAweDFGOUVELAorICAgICAgICAweDFGOUVFLAorICAgICAgICAweDFGOUVGLAorICAgICAgICAweDFGOUYwLAorICAgICAgICAweDFGOUYxLAorICAgICAgICAweDFGOUYyLAorICAgICAgICAweDFGOUYzLAorICAgICAgICAweDFGOUY0LAorICAgICAgICAweDFGOUY1LAorICAgICAgICAweDFGOUY2LAorICAgICAgICAweDFGOUY3LAorICAgICAgICAweDFGOUY4LAorICAgICAgICAweDFGOUY5LAorICAgICAgICAweDFGOUZBLAorICAgICAgICAweDFGOUZCLAorICAgICAgICAweDFGOUZDLAorICAgICAgICAweDFGOUZELAorICAgICAgICAweDFGOUZFLAorICAgICAgICAweDFGOUZGCiAgICAgfTsKIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9jdHMvRW1vamlUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvY3RzL0Vtb2ppVGVzdC5qYXZhCmluZGV4IGU4NDFmYjUuLmVjMDBjOGQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9jdHMvRW1vamlUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2N0cy9FbW9qaVRlc3QuamF2YQpAQCAtMjUsMTIgKzI1LDYgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGljdHVyZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLkxhcmdlVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5UeXBlZFZhbHVlOwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKQEAgLTM4LDYgKzMyLDEzIEBACiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuRWRpdFRleHQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLkxhcmdlVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5OdWxsV2ViVmlld1V0aWxzOwogCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKQEAgLTY1LDggKzY2LDggQEAKICAgICAgKi8KICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RFbW9qaUNvZGVQb2ludHMoKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRW1vamlDb25zdGFudHMuZW1vamlDb2RlUG9pbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKENoYXJhY3Rlci5pc0RlZmluZWQoRW1vamlDb25zdGFudHMuZW1vamlDb2RlUG9pbnRzW2ldKSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRW1vamlDb25zdGFudHMuQUxMX0VNT0pJLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKENoYXJhY3Rlci5pc0RlZmluZWQoRW1vamlDb25zdGFudHMuQUxMX0VNT0pJW2ldKSk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9jdHMvRm9udENvdmVyYWdlVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2N0cy9Gb250Q292ZXJhZ2VUZXN0LmphdmEKaW5kZXggODM3YzIwOS4uMDAwNjAwMiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2N0cy9Gb250Q292ZXJhZ2VUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2N0cy9Gb250Q292ZXJhZ2VUZXN0LmphdmEKQEAgLTIzLDggKzIzLDkgQEAKIGltcG9ydCBhbmRyb2lkLmljdS5sYW5nLlVDaGFyYWN0ZXI7CiBpbXBvcnQgYW5kcm9pZC5pY3UubGFuZy5VQ2hhcmFjdGVyQ2F0ZWdvcnk7CiBpbXBvcnQgYW5kcm9pZC5pY3UudGV4dC5Vbmljb2RlU2V0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTGFyZ2VUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLkxhcmdlVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogCiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DZGRUZXN0OwogCkBAIC0xMjQ0LDExOTYgKzEyNDUsMTYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIEFsbCBlbW9qaSBjaGFyYWN0ZXJzIGluIFVuaWNvZGUgMTAuMC9FbW9qaSA1LjAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBBTExfRU1PSkkgPSB7Ci0gICAgICAgIDB4MDAyMywgLy8gTlVNQkVSIFNJR04KLSAgICAgICAgMHgwMDJBLCAvLyBBU1RFUklTSwotICAgICAgICAweDAwMzAsIC8vIERJR0lUIFpFUk8KLSAgICAgICAgMHgwMDMxLCAvLyBESUdJVCBPTkUKLSAgICAgICAgMHgwMDMyLCAvLyBESUdJVCBUV08KLSAgICAgICAgMHgwMDMzLCAvLyBESUdJVCBUSFJFRQotICAgICAgICAweDAwMzQsIC8vIERJR0lUIEZPVVIKLSAgICAgICAgMHgwMDM1LCAvLyBESUdJVCBGSVZFCi0gICAgICAgIDB4MDAzNiwgLy8gRElHSVQgU0lYCi0gICAgICAgIDB4MDAzNywgLy8gRElHSVQgU0VWRU4KLSAgICAgICAgMHgwMDM4LCAvLyBESUdJVCBFSUdIVAotICAgICAgICAweDAwMzksIC8vIERJR0lUIE5JTkUKLSAgICAgICAgMHgwMEE5LCAvLyBDT1BZUklHSFQgU0lHTgotICAgICAgICAweDAwQUUsIC8vIFJFR0lTVEVSRUQgU0lHTgotICAgICAgICAweDIwM0MsIC8vIERPVUJMRSBFWENMQU1BVElPTiBNQVJLCi0gICAgICAgIDB4MjA0OSwgLy8gRVhDTEFNQVRJT04gUVVFU1RJT04gTUFSSwotICAgICAgICAweDIxMjIsIC8vIFRSQURFIE1BUksgU0lHTgotICAgICAgICAweDIxMzksIC8vIElORk9STUFUSU9OIFNPVVJDRQotICAgICAgICAweDIxOTQsIC8vIExFRlQgUklHSFQgQVJST1cKLSAgICAgICAgMHgyMTk1LCAvLyBVUCBET1dOIEFSUk9XCi0gICAgICAgIDB4MjE5NiwgLy8gTk9SVEggV0VTVCBBUlJPVwotICAgICAgICAweDIxOTcsIC8vIE5PUlRIIEVBU1QgQVJST1cKLSAgICAgICAgMHgyMTk4LCAvLyBTT1VUSCBFQVNUIEFSUk9XCi0gICAgICAgIDB4MjE5OSwgLy8gU09VVEggV0VTVCBBUlJPVwotICAgICAgICAweDIxQTksIC8vIExFRlRXQVJEUyBBUlJPVyBXSVRIIEhPT0sKLSAgICAgICAgMHgyMUFBLCAvLyBSSUdIVFdBUkRTIEFSUk9XIFdJVEggSE9PSwotICAgICAgICAweDIzMUEsIC8vIFdBVENICi0gICAgICAgIDB4MjMxQiwgLy8gSE9VUkdMQVNTCi0gICAgICAgIDB4MjMyOCwgLy8gS0VZQk9BUkQKLSAgICAgICAgMHgyM0NGLCAvLyBFSkVDVCBTWU1CT0wKLSAgICAgICAgMHgyM0U5LCAvLyBCTEFDSyBSSUdIVC1QT0lOVElORyBET1VCTEUgVFJJQU5HTEUKLSAgICAgICAgMHgyM0VBLCAvLyBCTEFDSyBMRUZULVBPSU5USU5HIERPVUJMRSBUUklBTkdMRQotICAgICAgICAweDIzRUIsIC8vIEJMQUNLIFVQLVBPSU5USU5HIERPVUJMRSBUUklBTkdMRQotICAgICAgICAweDIzRUMsIC8vIEJMQUNLIERPV04tUE9JTlRJTkcgRE9VQkxFIFRSSUFOR0xFCi0gICAgICAgIDB4MjNFRCwgLy8gQkxBQ0sgUklHSFQtUE9JTlRJTkcgRE9VQkxFIFRSSUFOR0xFIFdJVEggVkVSVElDQUwgQkFSCi0gICAgICAgIDB4MjNFRSwgLy8gQkxBQ0sgTEVGVC1QT0lOVElORyBET1VCTEUgVFJJQU5HTEUgV0lUSCBWRVJUSUNBTCBCQVIKLSAgICAgICAgMHgyM0VGLCAvLyBCTEFDSyBSSUdIVC1QT0lOVElORyBUUklBTkdMRSBXSVRIIERPVUJMRSBWRVJUSUNBTCBCQVIKLSAgICAgICAgMHgyM0YwLCAvLyBBTEFSTSBDTE9DSwotICAgICAgICAweDIzRjEsIC8vIFNUT1BXQVRDSAotICAgICAgICAweDIzRjIsIC8vIFRJTUVSIENMT0NLCi0gICAgICAgIDB4MjNGMywgLy8gSE9VUkdMQVNTIFdJVEggRkxPV0lORyBTQU5ECi0gICAgICAgIDB4MjNGOCwgLy8gRE9VQkxFIFZFUlRJQ0FMIEJBUgotICAgICAgICAweDIzRjksIC8vIEJMQUNLIFNRVUFSRSBGT1IgU1RPUAotICAgICAgICAweDIzRkEsIC8vIEJMQUNLIENJUkNMRSBGT1IgUkVDT1JECi0gICAgICAgIDB4MjRDMiwgLy8gQ0lSQ0xFRCBMQVRJTiBDQVBJVEFMIExFVFRFUiBNCi0gICAgICAgIDB4MjVBQSwgLy8gQkxBQ0sgU01BTEwgU1FVQVJFCi0gICAgICAgIDB4MjVBQiwgLy8gV0hJVEUgU01BTEwgU1FVQVJFCi0gICAgICAgIDB4MjVCNiwgLy8gQkxBQ0sgUklHSFQtUE9JTlRJTkcgVFJJQU5HTEUKLSAgICAgICAgMHgyNUMwLCAvLyBCTEFDSyBMRUZULVBPSU5USU5HIFRSSUFOR0xFCi0gICAgICAgIDB4MjVGQiwgLy8gV0hJVEUgTUVESVVNIFNRVUFSRQotICAgICAgICAweDI1RkMsIC8vIEJMQUNLIE1FRElVTSBTUVVBUkUKLSAgICAgICAgMHgyNUZELCAvLyBXSElURSBNRURJVU0gU01BTEwgU1FVQVJFCi0gICAgICAgIDB4MjVGRSwgLy8gQkxBQ0sgTUVESVVNIFNNQUxMIFNRVUFSRQotICAgICAgICAweDI2MDAsIC8vIEJMQUNLIFNVTiBXSVRIIFJBWVMKLSAgICAgICAgMHgyNjAxLCAvLyBDTE9VRAotICAgICAgICAweDI2MDIsIC8vIFVNQlJFTExBCi0gICAgICAgIDB4MjYwMywgLy8gU05PV01BTgotICAgICAgICAweDI2MDQsIC8vIENPTUVUCi0gICAgICAgIDB4MjYwRSwgLy8gQkxBQ0sgVEVMRVBIT05FCi0gICAgICAgIDB4MjYxMSwgLy8gQkFMTE9UIEJPWCBXSVRIIENIRUNLCi0gICAgICAgIDB4MjYxNCwgLy8gVU1CUkVMTEEgV0lUSCBSQUlOIERST1BTCi0gICAgICAgIDB4MjYxNSwgLy8gSE9UIEJFVkVSQUdFCi0gICAgICAgIDB4MjYxOCwgLy8gU0hBTVJPQ0sKLSAgICAgICAgMHgyNjFELCAvLyBXSElURSBVUCBQT0lOVElORyBJTkRFWAotICAgICAgICAweDI2MjAsIC8vIFNLVUxMIEFORCBDUk9TU0JPTkVTCi0gICAgICAgIDB4MjYyMiwgLy8gUkFESU9BQ1RJVkUgU0lHTgotICAgICAgICAweDI2MjMsIC8vIEJJT0hBWkFSRCBTSUdOCi0gICAgICAgIDB4MjYyNiwgLy8gT1JUSE9ET1ggQ1JPU1MKLSAgICAgICAgMHgyNjJBLCAvLyBTVEFSIEFORCBDUkVTQ0VOVAotICAgICAgICAweDI2MkUsIC8vIFBFQUNFIFNZTUJPTAotICAgICAgICAweDI2MkYsIC8vIFlJTiBZQU5HCi0gICAgICAgIDB4MjYzOCwgLy8gV0hFRUwgT0YgREhBUk1BCi0gICAgICAgIDB4MjYzOSwgLy8gV0hJVEUgRlJPV05JTkcgRkFDRQotICAgICAgICAweDI2M0EsIC8vIFdISVRFIFNNSUxJTkcgRkFDRQotICAgICAgICAweDI2NDAsIC8vIEZFTUFMRSBTSUdOCi0gICAgICAgIDB4MjY0MiwgLy8gTUFMRSBTSUdOCi0gICAgICAgIDB4MjY0OCwgLy8gQVJJRVMKLSAgICAgICAgMHgyNjQ5LCAvLyBUQVVSVVMKLSAgICAgICAgMHgyNjRBLCAvLyBHRU1JTkkKLSAgICAgICAgMHgyNjRCLCAvLyBDQU5DRVIKLSAgICAgICAgMHgyNjRDLCAvLyBMRU8KLSAgICAgICAgMHgyNjRELCAvLyBWSVJHTwotICAgICAgICAweDI2NEUsIC8vIExJQlJBCi0gICAgICAgIDB4MjY0RiwgLy8gU0NPUlBJVVMKLSAgICAgICAgMHgyNjUwLCAvLyBTQUdJVFRBUklVUwotICAgICAgICAweDI2NTEsIC8vIENBUFJJQ09STgotICAgICAgICAweDI2NTIsIC8vIEFRVUFSSVVTCi0gICAgICAgIDB4MjY1MywgLy8gUElTQ0VTCi0gICAgICAgIDB4MjY2MCwgLy8gQkxBQ0sgU1BBREUgU1VJVAotICAgICAgICAweDI2NjMsIC8vIEJMQUNLIENMVUIgU1VJVAotICAgICAgICAweDI2NjUsIC8vIEJMQUNLIEhFQVJUIFNVSVQKLSAgICAgICAgMHgyNjY2LCAvLyBCTEFDSyBESUFNT05EIFNVSVQKLSAgICAgICAgMHgyNjY4LCAvLyBIT1QgU1BSSU5HUwotICAgICAgICAweDI2N0IsIC8vIEJMQUNLIFVOSVZFUlNBTCBSRUNZQ0xJTkcgU1lNQk9MCi0gICAgICAgIDB4MjY3RiwgLy8gV0hFRUxDSEFJUiBTWU1CT0wKLSAgICAgICAgMHgyNjkyLCAvLyBIQU1NRVIgQU5EIFBJQ0sKLSAgICAgICAgMHgyNjkzLCAvLyBBTkNIT1IKLSAgICAgICAgMHgyNjk0LCAvLyBDUk9TU0VEIFNXT1JEUwotICAgICAgICAweDI2OTUsIC8vIFNUQUZGIE9GIEFFU0NVTEFQSVVTCi0gICAgICAgIDB4MjY5NiwgLy8gU0NBTEVTCi0gICAgICAgIDB4MjY5NywgLy8gQUxFTUJJQwotICAgICAgICAweDI2OTksIC8vIEdFQVIKLSAgICAgICAgMHgyNjlCLCAvLyBBVE9NIFNZTUJPTAotICAgICAgICAweDI2OUMsIC8vIEZMRVVSLURFLUxJUwotICAgICAgICAweDI2QTAsIC8vIFdBUk5JTkcgU0lHTgotICAgICAgICAweDI2QTEsIC8vIEhJR0ggVk9MVEFHRSBTSUdOCi0gICAgICAgIDB4MjZBQSwgLy8gTUVESVVNIFdISVRFIENJUkNMRQotICAgICAgICAweDI2QUIsIC8vIE1FRElVTSBCTEFDSyBDSVJDTEUKLSAgICAgICAgMHgyNkIwLCAvLyBDT0ZGSU4KLSAgICAgICAgMHgyNkIxLCAvLyBGVU5FUkFMIFVSTgotICAgICAgICAweDI2QkQsIC8vIFNPQ0NFUiBCQUxMCi0gICAgICAgIDB4MjZCRSwgLy8gQkFTRUJBTEwKLSAgICAgICAgMHgyNkM0LCAvLyBTTk9XTUFOIFdJVEhPVVQgU05PVwotICAgICAgICAweDI2QzUsIC8vIFNVTiBCRUhJTkQgQ0xPVUQKLSAgICAgICAgMHgyNkM4LCAvLyBUSFVOREVSIENMT1VEIEFORCBSQUlOCi0gICAgICAgIDB4MjZDRSwgLy8gT1BISVVDSFVTCi0gICAgICAgIDB4MjZDRiwgLy8gUElDSwotICAgICAgICAweDI2RDEsIC8vIEhFTE1FVCBXSVRIIFdISVRFIENST1NTCi0gICAgICAgIDB4MjZEMywgLy8gQ0hBSU5TCi0gICAgICAgIDB4MjZENCwgLy8gTk8gRU5UUlkKLSAgICAgICAgMHgyNkU5LCAvLyBTSElOVE8gU0hSSU5FCi0gICAgICAgIDB4MjZFQSwgLy8gQ0hVUkNICi0gICAgICAgIDB4MjZGMCwgLy8gTU9VTlRBSU4KLSAgICAgICAgMHgyNkYxLCAvLyBVTUJSRUxMQSBPTiBHUk9VTkQKLSAgICAgICAgMHgyNkYyLCAvLyBGT1VOVEFJTgotICAgICAgICAweDI2RjMsIC8vIEZMQUcgSU4gSE9MRQotICAgICAgICAweDI2RjQsIC8vIEZFUlJZCi0gICAgICAgIDB4MjZGNSwgLy8gU0FJTEJPQVQKLSAgICAgICAgMHgyNkY3LCAvLyBTS0lFUgotICAgICAgICAweDI2RjgsIC8vIElDRSBTS0FURQotICAgICAgICAweDI2RjksIC8vIFBFUlNPTiBXSVRIIEJBTEwKLSAgICAgICAgMHgyNkZBLCAvLyBURU5UCi0gICAgICAgIDB4MjZGRCwgLy8gRlVFTCBQVU1QCi0gICAgICAgIDB4MjcwMiwgLy8gQkxBQ0sgU0NJU1NPUlMKLSAgICAgICAgMHgyNzA1LCAvLyBXSElURSBIRUFWWSBDSEVDSyBNQVJLCi0gICAgICAgIDB4MjcwOCwgLy8gQUlSUExBTkUKLSAgICAgICAgMHgyNzA5LCAvLyBFTlZFTE9QRQotICAgICAgICAweDI3MEEsIC8vIFJBSVNFRCBGSVNUCi0gICAgICAgIDB4MjcwQiwgLy8gUkFJU0VEIEhBTkQKLSAgICAgICAgMHgyNzBDLCAvLyBWSUNUT1JZIEhBTkQKLSAgICAgICAgMHgyNzBELCAvLyBXUklUSU5HIEhBTkQKLSAgICAgICAgMHgyNzBGLCAvLyBQRU5DSUwKLSAgICAgICAgMHgyNzEyLCAvLyBCTEFDSyBOSUIKLSAgICAgICAgMHgyNzE0LCAvLyBIRUFWWSBDSEVDSyBNQVJLCi0gICAgICAgIDB4MjcxNiwgLy8gSEVBVlkgTVVMVElQTElDQVRJT04gWAotICAgICAgICAweDI3MUQsIC8vIExBVElOIENST1NTCi0gICAgICAgIDB4MjcyMSwgLy8gU1RBUiBPRiBEQVZJRAotICAgICAgICAweDI3MjgsIC8vIFNQQVJLTEVTCi0gICAgICAgIDB4MjczMywgLy8gRUlHSFQgU1BPS0VEIEFTVEVSSVNLCi0gICAgICAgIDB4MjczNCwgLy8gRUlHSFQgUE9JTlRFRCBCTEFDSyBTVEFSCi0gICAgICAgIDB4Mjc0NCwgLy8gU05PV0ZMQUtFCi0gICAgICAgIDB4Mjc0NywgLy8gU1BBUktMRQotICAgICAgICAweDI3NEMsIC8vIENST1NTIE1BUksKLSAgICAgICAgMHgyNzRFLCAvLyBORUdBVElWRSBTUVVBUkVEIENST1NTIE1BUksKLSAgICAgICAgMHgyNzUzLCAvLyBCTEFDSyBRVUVTVElPTiBNQVJLIE9STkFNRU5UCi0gICAgICAgIDB4Mjc1NCwgLy8gV0hJVEUgUVVFU1RJT04gTUFSSyBPUk5BTUVOVAotICAgICAgICAweDI3NTUsIC8vIFdISVRFIEVYQ0xBTUFUSU9OIE1BUksgT1JOQU1FTlQKLSAgICAgICAgMHgyNzU3LCAvLyBIRUFWWSBFWENMQU1BVElPTiBNQVJLIFNZTUJPTAotICAgICAgICAweDI3NjMsIC8vIEhFQVZZIEhFQVJUIEVYQ0xBTUFUSU9OIE1BUksgT1JOQU1FTlQKLSAgICAgICAgMHgyNzY0LCAvLyBIRUFWWSBCTEFDSyBIRUFSVAotICAgICAgICAweDI3OTUsIC8vIEhFQVZZIFBMVVMgU0lHTgotICAgICAgICAweDI3OTYsIC8vIEhFQVZZIE1JTlVTIFNJR04KLSAgICAgICAgMHgyNzk3LCAvLyBIRUFWWSBESVZJU0lPTiBTSUdOCi0gICAgICAgIDB4MjdBMSwgLy8gQkxBQ0sgUklHSFRXQVJEUyBBUlJPVwotICAgICAgICAweDI3QjAsIC8vIENVUkxZIExPT1AKLSAgICAgICAgMHgyN0JGLCAvLyBET1VCTEUgQ1VSTFkgTE9PUAotICAgICAgICAweDI5MzQsIC8vIEFSUk9XIFBPSU5USU5HIFJJR0hUV0FSRFMgVEhFTiBDVVJWSU5HIFVQV0FSRFMKLSAgICAgICAgMHgyOTM1LCAvLyBBUlJPVyBQT0lOVElORyBSSUdIVFdBUkRTIFRIRU4gQ1VSVklORyBET1dOV0FSRFMKLSAgICAgICAgMHgyQjA1LCAvLyBMRUZUV0FSRFMgQkxBQ0sgQVJST1cKLSAgICAgICAgMHgyQjA2LCAvLyBVUFdBUkRTIEJMQUNLIEFSUk9XCi0gICAgICAgIDB4MkIwNywgLy8gRE9XTldBUkRTIEJMQUNLIEFSUk9XCi0gICAgICAgIDB4MkIxQiwgLy8gQkxBQ0sgTEFSR0UgU1FVQVJFCi0gICAgICAgIDB4MkIxQywgLy8gV0hJVEUgTEFSR0UgU1FVQVJFCi0gICAgICAgIDB4MkI1MCwgLy8gV0hJVEUgTUVESVVNIFNUQVIKLSAgICAgICAgMHgyQjU1LCAvLyBIRUFWWSBMQVJHRSBDSVJDTEUKLSAgICAgICAgMHgzMDMwLCAvLyBXQVZZIERBU0gKLSAgICAgICAgMHgzMDNELCAvLyBQQVJUIEFMVEVSTkFUSU9OIE1BUksKLSAgICAgICAgMHgzMjk3LCAvLyBDSVJDTEVEIElERU9HUkFQSCBDT05HUkFUVUxBVElPTgotICAgICAgICAweDMyOTksIC8vIENJUkNMRUQgSURFT0dSQVBIIFNFQ1JFVAotICAgICAgICAweDFGMDA0LCAvLyBNQUhKT05HIFRJTEUgUkVEIERSQUdPTgotICAgICAgICAweDFGMENGLCAvLyBQTEFZSU5HIENBUkQgQkxBQ0sgSk9LRVIKLSAgICAgICAgMHgxRjE3MCwgLy8gTkVHQVRJVkUgU1FVQVJFRCBMQVRJTiBDQVBJVEFMIExFVFRFUiBBCi0gICAgICAgIDB4MUYxNzEsIC8vIE5FR0FUSVZFIFNRVUFSRUQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgotICAgICAgICAweDFGMTdFLCAvLyBORUdBVElWRSBTUVVBUkVEIExBVElOIENBUElUQUwgTEVUVEVSIE8KLSAgICAgICAgMHgxRjE3RiwgLy8gTkVHQVRJVkUgU1FVQVJFRCBMQVRJTiBDQVBJVEFMIExFVFRFUiBQCi0gICAgICAgIDB4MUYxOEUsIC8vIE5FR0FUSVZFIFNRVUFSRUQgQUIKLSAgICAgICAgMHgxRjE5MSwgLy8gU1FVQVJFRCBDTAotICAgICAgICAweDFGMTkyLCAvLyBTUVVBUkVEIENPT0wKLSAgICAgICAgMHgxRjE5MywgLy8gU1FVQVJFRCBGUkVFCi0gICAgICAgIDB4MUYxOTQsIC8vIFNRVUFSRUQgSUQKLSAgICAgICAgMHgxRjE5NSwgLy8gU1FVQVJFRCBORVcKLSAgICAgICAgMHgxRjE5NiwgLy8gU1FVQVJFRCBORwotICAgICAgICAweDFGMTk3LCAvLyBTUVVBUkVEIE9LCi0gICAgICAgIDB4MUYxOTgsIC8vIFNRVUFSRUQgU09TCi0gICAgICAgIDB4MUYxOTksIC8vIFNRVUFSRUQgVVAgV0lUSCBFWENMQU1BVElPTiBNQVJLCi0gICAgICAgIDB4MUYxOUEsIC8vIFNRVUFSRUQgVlMKLSAgICAgICAgMHgxRjFFNiwgLy8gUkVHSU9OQUwgSU5ESUNBVE9SIFNZTUJPTCBMRVRURVIgQQotICAgICAgICAweDFGMUU3LCAvLyBSRUdJT05BTCBJTkRJQ0FUT1IgU1lNQk9MIExFVFRFUiBCCi0gICAgICAgIDB4MUYxRTgsIC8vIFJFR0lPTkFMIElORElDQVRPUiBTWU1CT0wgTEVUVEVSIEMKLSAgICAgICAgMHgxRjFFOSwgLy8gUkVHSU9OQUwgSU5ESUNBVE9SIFNZTUJPTCBMRVRURVIgRAotICAgICAgICAweDFGMUVBLCAvLyBSRUdJT05BTCBJTkRJQ0FUT1IgU1lNQk9MIExFVFRFUiBFCi0gICAgICAgIDB4MUYxRUIsIC8vIFJFR0lPTkFMIElORElDQVRPUiBTWU1CT0wgTEVUVEVSIEYKLSAgICAgICAgMHgxRjFFQywgLy8gUkVHSU9OQUwgSU5ESUNBVE9SIFNZTUJPTCBMRVRURVIgRwotICAgICAgICAweDFGMUVELCAvLyBSRUdJT05BTCBJTkRJQ0FUT1IgU1lNQk9MIExFVFRFUiBICi0gICAgICAgIDB4MUYxRUUsIC8vIFJFR0lPTkFMIElORElDQVRPUiBTWU1CT0wgTEVUVEVSIEkKLSAgICAgICAgMHgxRjFFRiwgLy8gUkVHSU9OQUwgSU5ESUNBVE9SIFNZTUJPTCBMRVRURVIgSgotICAgICAgICAweDFGMUYwLCAvLyBSRUdJT05BTCBJTkRJQ0FUT1IgU1lNQk9MIExFVFRFUiBLCi0gICAgICAgIDB4MUYxRjEsIC8vIFJFR0lPTkFMIElORElDQVRPUiBTWU1CT0wgTEVUVEVSIEwKLSAgICAgICAgMHgxRjFGMiwgLy8gUkVHSU9OQUwgSU5ESUNBVE9SIFNZTUJPTCBMRVRURVIgTQotICAgICAgICAweDFGMUYzLCAvLyBSRUdJT05BTCBJTkRJQ0FUT1IgU1lNQk9MIExFVFRFUiBOCi0gICAgICAgIDB4MUYxRjQsIC8vIFJFR0lPTkFMIElORElDQVRPUiBTWU1CT0wgTEVUVEVSIE8KLSAgICAgICAgMHgxRjFGNSwgLy8gUkVHSU9OQUwgSU5ESUNBVE9SIFNZTUJPTCBMRVRURVIgUAotICAgICAgICAweDFGMUY2LCAvLyBSRUdJT05BTCBJTkRJQ0FUT1IgU1lNQk9MIExFVFRFUiBRCi0gICAgICAgIDB4MUYxRjcsIC8vIFJFR0lPTkFMIElORElDQVRPUiBTWU1CT0wgTEVUVEVSIFIKLSAgICAgICAgMHgxRjFGOCwgLy8gUkVHSU9OQUwgSU5ESUNBVE9SIFNZTUJPTCBMRVRURVIgUwotICAgICAgICAweDFGMUY5LCAvLyBSRUdJT05BTCBJTkRJQ0FUT1IgU1lNQk9MIExFVFRFUiBUCi0gICAgICAgIDB4MUYxRkEsIC8vIFJFR0lPTkFMIElORElDQVRPUiBTWU1CT0wgTEVUVEVSIFUKLSAgICAgICAgMHgxRjFGQiwgLy8gUkVHSU9OQUwgSU5ESUNBVE9SIFNZTUJPTCBMRVRURVIgVgotICAgICAgICAweDFGMUZDLCAvLyBSRUdJT05BTCBJTkRJQ0FUT1IgU1lNQk9MIExFVFRFUiBXCi0gICAgICAgIDB4MUYxRkQsIC8vIFJFR0lPTkFMIElORElDQVRPUiBTWU1CT0wgTEVUVEVSIFgKLSAgICAgICAgMHgxRjFGRSwgLy8gUkVHSU9OQUwgSU5ESUNBVE9SIFNZTUJPTCBMRVRURVIgWQotICAgICAgICAweDFGMUZGLCAvLyBSRUdJT05BTCBJTkRJQ0FUT1IgU1lNQk9MIExFVFRFUiBaCi0gICAgICAgIDB4MUYyMDEsIC8vIFNRVUFSRUQgS0FUQUtBTkEgS09LTwotICAgICAgICAweDFGMjAyLCAvLyBTUVVBUkVEIEtBVEFLQU5BIFNBCi0gICAgICAgIDB4MUYyMUEsIC8vIFNRVUFSRUQgQ0pLIFVOSUZJRUQgSURFT0dSQVBILTcxMjEKLSAgICAgICAgMHgxRjIyRiwgLy8gU1FVQVJFRCBDSksgVU5JRklFRCBJREVPR1JBUEgtNjMwNwotICAgICAgICAweDFGMjMyLCAvLyBTUVVBUkVEIENKSyBVTklGSUVEIElERU9HUkFQSC03OTgxCi0gICAgICAgIDB4MUYyMzMsIC8vIFNRVUFSRUQgQ0pLIFVOSUZJRUQgSURFT0dSQVBILTdBN0EKLSAgICAgICAgMHgxRjIzNCwgLy8gU1FVQVJFRCBDSksgVU5JRklFRCBJREVPR1JBUEgtNTQwOAotICAgICAgICAweDFGMjM1LCAvLyBTUVVBUkVEIENKSyBVTklGSUVEIElERU9HUkFQSC02RTgwCi0gICAgICAgIDB4MUYyMzYsIC8vIFNRVUFSRUQgQ0pLIFVOSUZJRUQgSURFT0dSQVBILTY3MDkKLSAgICAgICAgMHgxRjIzNywgLy8gU1FVQVJFRCBDSksgVU5JRklFRCBJREVPR1JBUEgtNjcwOAotICAgICAgICAweDFGMjM4LCAvLyBTUVVBUkVEIENKSyBVTklGSUVEIElERU9HUkFQSC03NTMzCi0gICAgICAgIDB4MUYyMzksIC8vIFNRVUFSRUQgQ0pLIFVOSUZJRUQgSURFT0dSQVBILTUyNzIKLSAgICAgICAgMHgxRjIzQSwgLy8gU1FVQVJFRCBDSksgVU5JRklFRCBJREVPR1JBUEgtNTVCNgotICAgICAgICAweDFGMjUwLCAvLyBDSVJDTEVEIElERU9HUkFQSCBBRFZBTlRBR0UKLSAgICAgICAgMHgxRjI1MSwgLy8gQ0lSQ0xFRCBJREVPR1JBUEggQUNDRVBUCi0gICAgICAgIDB4MUYzMDAsIC8vIENZQ0xPTkUKLSAgICAgICAgMHgxRjMwMSwgLy8gRk9HR1kKLSAgICAgICAgMHgxRjMwMiwgLy8gQ0xPU0VEIFVNQlJFTExBCi0gICAgICAgIDB4MUYzMDMsIC8vIE5JR0hUIFdJVEggU1RBUlMKLSAgICAgICAgMHgxRjMwNCwgLy8gU1VOUklTRSBPVkVSIE1PVU5UQUlOUwotICAgICAgICAweDFGMzA1LCAvLyBTVU5SSVNFCi0gICAgICAgIDB4MUYzMDYsIC8vIENJVFlTQ0FQRSBBVCBEVVNLCi0gICAgICAgIDB4MUYzMDcsIC8vIFNVTlNFVCBPVkVSIEJVSUxESU5HUwotICAgICAgICAweDFGMzA4LCAvLyBSQUlOQk9XCi0gICAgICAgIDB4MUYzMDksIC8vIEJSSURHRSBBVCBOSUdIVAotICAgICAgICAweDFGMzBBLCAvLyBXQVRFUiBXQVZFCi0gICAgICAgIDB4MUYzMEIsIC8vIFZPTENBTk8KLSAgICAgICAgMHgxRjMwQywgLy8gTUlMS1kgV0FZCi0gICAgICAgIDB4MUYzMEQsIC8vIEVBUlRIIEdMT0JFIEVVUk9QRS1BRlJJQ0EKLSAgICAgICAgMHgxRjMwRSwgLy8gRUFSVEggR0xPQkUgQU1FUklDQVMKLSAgICAgICAgMHgxRjMwRiwgLy8gRUFSVEggR0xPQkUgQVNJQS1BVVNUUkFMSUEKLSAgICAgICAgMHgxRjMxMCwgLy8gR0xPQkUgV0lUSCBNRVJJRElBTlMKLSAgICAgICAgMHgxRjMxMSwgLy8gTkVXIE1PT04gU1lNQk9MCi0gICAgICAgIDB4MUYzMTIsIC8vIFdBWElORyBDUkVTQ0VOVCBNT09OIFNZTUJPTAotICAgICAgICAweDFGMzEzLCAvLyBGSVJTVCBRVUFSVEVSIE1PT04gU1lNQk9MCi0gICAgICAgIDB4MUYzMTQsIC8vIFdBWElORyBHSUJCT1VTIE1PT04gU1lNQk9MCi0gICAgICAgIDB4MUYzMTUsIC8vIEZVTEwgTU9PTiBTWU1CT0wKLSAgICAgICAgMHgxRjMxNiwgLy8gV0FOSU5HIEdJQkJPVVMgTU9PTiBTWU1CT0wKLSAgICAgICAgMHgxRjMxNywgLy8gTEFTVCBRVUFSVEVSIE1PT04gU1lNQk9MCi0gICAgICAgIDB4MUYzMTgsIC8vIFdBTklORyBDUkVTQ0VOVCBNT09OIFNZTUJPTAotICAgICAgICAweDFGMzE5LCAvLyBDUkVTQ0VOVCBNT09OCi0gICAgICAgIDB4MUYzMUEsIC8vIE5FVyBNT09OIFdJVEggRkFDRQotICAgICAgICAweDFGMzFCLCAvLyBGSVJTVCBRVUFSVEVSIE1PT04gV0lUSCBGQUNFCi0gICAgICAgIDB4MUYzMUMsIC8vIExBU1QgUVVBUlRFUiBNT09OIFdJVEggRkFDRQotICAgICAgICAweDFGMzFELCAvLyBGVUxMIE1PT04gV0lUSCBGQUNFCi0gICAgICAgIDB4MUYzMUUsIC8vIFNVTiBXSVRIIEZBQ0UKLSAgICAgICAgMHgxRjMxRiwgLy8gR0xPV0lORyBTVEFSCi0gICAgICAgIDB4MUYzMjAsIC8vIFNIT09USU5HIFNUQVIKLSAgICAgICAgMHgxRjMyMSwgLy8gVEhFUk1PTUVURVIKLSAgICAgICAgMHgxRjMyNCwgLy8gV0hJVEUgU1VOIFdJVEggU01BTEwgQ0xPVUQKLSAgICAgICAgMHgxRjMyNSwgLy8gV0hJVEUgU1VOIEJFSElORCBDTE9VRAotICAgICAgICAweDFGMzI2LCAvLyBXSElURSBTVU4gQkVISU5EIENMT1VEIFdJVEggUkFJTgotICAgICAgICAweDFGMzI3LCAvLyBDTE9VRCBXSVRIIFJBSU4KLSAgICAgICAgMHgxRjMyOCwgLy8gQ0xPVUQgV0lUSCBTTk9XCi0gICAgICAgIDB4MUYzMjksIC8vIENMT1VEIFdJVEggTElHSFROSU5HCi0gICAgICAgIDB4MUYzMkEsIC8vIENMT1VEIFdJVEggVE9STkFETwotICAgICAgICAweDFGMzJCLCAvLyBGT0cKLSAgICAgICAgMHgxRjMyQywgLy8gV0lORCBCTE9XSU5HIEZBQ0UKLSAgICAgICAgMHgxRjMyRCwgLy8gSE9UIERPRwotICAgICAgICAweDFGMzJFLCAvLyBUQUNPCi0gICAgICAgIDB4MUYzMkYsIC8vIEJVUlJJVE8KLSAgICAgICAgMHgxRjMzMCwgLy8gQ0hFU1ROVVQKLSAgICAgICAgMHgxRjMzMSwgLy8gU0VFRExJTkcKLSAgICAgICAgMHgxRjMzMiwgLy8gRVZFUkdSRUVOIFRSRUUKLSAgICAgICAgMHgxRjMzMywgLy8gREVDSURVT1VTIFRSRUUKLSAgICAgICAgMHgxRjMzNCwgLy8gUEFMTSBUUkVFCi0gICAgICAgIDB4MUYzMzUsIC8vIENBQ1RVUwotICAgICAgICAweDFGMzM2LCAvLyBIT1QgUEVQUEVSCi0gICAgICAgIDB4MUYzMzcsIC8vIFRVTElQCi0gICAgICAgIDB4MUYzMzgsIC8vIENIRVJSWSBCTE9TU09NCi0gICAgICAgIDB4MUYzMzksIC8vIFJPU0UKLSAgICAgICAgMHgxRjMzQSwgLy8gSElCSVNDVVMKLSAgICAgICAgMHgxRjMzQiwgLy8gU1VORkxPV0VSCi0gICAgICAgIDB4MUYzM0MsIC8vIEJMT1NTT00KLSAgICAgICAgMHgxRjMzRCwgLy8gRUFSIE9GIE1BSVpFCi0gICAgICAgIDB4MUYzM0UsIC8vIEVBUiBPRiBSSUNFCi0gICAgICAgIDB4MUYzM0YsIC8vIEhFUkIKLSAgICAgICAgMHgxRjM0MCwgLy8gRk9VUiBMRUFGIENMT1ZFUgotICAgICAgICAweDFGMzQxLCAvLyBNQVBMRSBMRUFGCi0gICAgICAgIDB4MUYzNDIsIC8vIEZBTExFTiBMRUFGCi0gICAgICAgIDB4MUYzNDMsIC8vIExFQUYgRkxVVFRFUklORyBJTiBXSU5ECi0gICAgICAgIDB4MUYzNDQsIC8vIE1VU0hST09NCi0gICAgICAgIDB4MUYzNDUsIC8vIFRPTUFUTwotICAgICAgICAweDFGMzQ2LCAvLyBBVUJFUkdJTkUKLSAgICAgICAgMHgxRjM0NywgLy8gR1JBUEVTCi0gICAgICAgIDB4MUYzNDgsIC8vIE1FTE9OCi0gICAgICAgIDB4MUYzNDksIC8vIFdBVEVSTUVMT04KLSAgICAgICAgMHgxRjM0QSwgLy8gVEFOR0VSSU5FCi0gICAgICAgIDB4MUYzNEIsIC8vIExFTU9OCi0gICAgICAgIDB4MUYzNEMsIC8vIEJBTkFOQQotICAgICAgICAweDFGMzRELCAvLyBQSU5FQVBQTEUKLSAgICAgICAgMHgxRjM0RSwgLy8gUkVEIEFQUExFCi0gICAgICAgIDB4MUYzNEYsIC8vIEdSRUVOIEFQUExFCi0gICAgICAgIDB4MUYzNTAsIC8vIFBFQVIKLSAgICAgICAgMHgxRjM1MSwgLy8gUEVBQ0gKLSAgICAgICAgMHgxRjM1MiwgLy8gQ0hFUlJJRVMKLSAgICAgICAgMHgxRjM1MywgLy8gU1RSQVdCRVJSWQotICAgICAgICAweDFGMzU0LCAvLyBIQU1CVVJHRVIKLSAgICAgICAgMHgxRjM1NSwgLy8gU0xJQ0UgT0YgUElaWkEKLSAgICAgICAgMHgxRjM1NiwgLy8gTUVBVCBPTiBCT05FCi0gICAgICAgIDB4MUYzNTcsIC8vIFBPVUxUUlkgTEVHCi0gICAgICAgIDB4MUYzNTgsIC8vIFJJQ0UgQ1JBQ0tFUgotICAgICAgICAweDFGMzU5LCAvLyBSSUNFIEJBTEwKLSAgICAgICAgMHgxRjM1QSwgLy8gQ09PS0VEIFJJQ0UKLSAgICAgICAgMHgxRjM1QiwgLy8gQ1VSUlkgQU5EIFJJQ0UKLSAgICAgICAgMHgxRjM1QywgLy8gU1RFQU1JTkcgQk9XTAotICAgICAgICAweDFGMzVELCAvLyBTUEFHSEVUVEkKLSAgICAgICAgMHgxRjM1RSwgLy8gQlJFQUQKLSAgICAgICAgMHgxRjM1RiwgLy8gRlJFTkNIIEZSSUVTCi0gICAgICAgIDB4MUYzNjAsIC8vIFJPQVNURUQgU1dFRVQgUE9UQVRPCi0gICAgICAgIDB4MUYzNjEsIC8vIERBTkdPCi0gICAgICAgIDB4MUYzNjIsIC8vIE9ERU4KLSAgICAgICAgMHgxRjM2MywgLy8gU1VTSEkKLSAgICAgICAgMHgxRjM2NCwgLy8gRlJJRUQgU0hSSU1QCi0gICAgICAgIDB4MUYzNjUsIC8vIEZJU0ggQ0FLRSBXSVRIIFNXSVJMIERFU0lHTgotICAgICAgICAweDFGMzY2LCAvLyBTT0ZUIElDRSBDUkVBTQotICAgICAgICAweDFGMzY3LCAvLyBTSEFWRUQgSUNFCi0gICAgICAgIDB4MUYzNjgsIC8vIElDRSBDUkVBTQotICAgICAgICAweDFGMzY5LCAvLyBET1VHSE5VVAotICAgICAgICAweDFGMzZBLCAvLyBDT09LSUUKLSAgICAgICAgMHgxRjM2QiwgLy8gQ0hPQ09MQVRFIEJBUgotICAgICAgICAweDFGMzZDLCAvLyBDQU5EWQotICAgICAgICAweDFGMzZELCAvLyBMT0xMSVBPUAotICAgICAgICAweDFGMzZFLCAvLyBDVVNUQVJECi0gICAgICAgIDB4MUYzNkYsIC8vIEhPTkVZIFBPVAotICAgICAgICAweDFGMzcwLCAvLyBTSE9SVENBS0UKLSAgICAgICAgMHgxRjM3MSwgLy8gQkVOVE8gQk9YCi0gICAgICAgIDB4MUYzNzIsIC8vIFBPVCBPRiBGT09ECi0gICAgICAgIDB4MUYzNzMsIC8vIENPT0tJTkcKLSAgICAgICAgMHgxRjM3NCwgLy8gRk9SSyBBTkQgS05JRkUKLSAgICAgICAgMHgxRjM3NSwgLy8gVEVBQ1VQIFdJVEhPVVQgSEFORExFCi0gICAgICAgIDB4MUYzNzYsIC8vIFNBS0UgQk9UVExFIEFORCBDVVAKLSAgICAgICAgMHgxRjM3NywgLy8gV0lORSBHTEFTUwotICAgICAgICAweDFGMzc4LCAvLyBDT0NLVEFJTCBHTEFTUwotICAgICAgICAweDFGMzc5LCAvLyBUUk9QSUNBTCBEUklOSwotICAgICAgICAweDFGMzdBLCAvLyBCRUVSIE1VRwotICAgICAgICAweDFGMzdCLCAvLyBDTElOS0lORyBCRUVSIE1VR1MKLSAgICAgICAgMHgxRjM3QywgLy8gQkFCWSBCT1RUTEUKLSAgICAgICAgMHgxRjM3RCwgLy8gRk9SSyBBTkQgS05JRkUgV0lUSCBQTEFURQotICAgICAgICAweDFGMzdFLCAvLyBCT1RUTEUgV0lUSCBQT1BQSU5HIENPUksKLSAgICAgICAgMHgxRjM3RiwgLy8gUE9QQ09STgotICAgICAgICAweDFGMzgwLCAvLyBSSUJCT04KLSAgICAgICAgMHgxRjM4MSwgLy8gV1JBUFBFRCBQUkVTRU5UCi0gICAgICAgIDB4MUYzODIsIC8vIEJJUlRIREFZIENBS0UKLSAgICAgICAgMHgxRjM4MywgLy8gSkFDSy1PLUxBTlRFUk4KLSAgICAgICAgMHgxRjM4NCwgLy8gQ0hSSVNUTUFTIFRSRUUKLSAgICAgICAgMHgxRjM4NSwgLy8gRkFUSEVSIENIUklTVE1BUwotICAgICAgICAweDFGMzg2LCAvLyBGSVJFV09SS1MKLSAgICAgICAgMHgxRjM4NywgLy8gRklSRVdPUksgU1BBUktMRVIKLSAgICAgICAgMHgxRjM4OCwgLy8gQkFMTE9PTgotICAgICAgICAweDFGMzg5LCAvLyBQQVJUWSBQT1BQRVIKLSAgICAgICAgMHgxRjM4QSwgLy8gQ09ORkVUVEkgQkFMTAotICAgICAgICAweDFGMzhCLCAvLyBUQU5BQkFUQSBUUkVFCi0gICAgICAgIDB4MUYzOEMsIC8vIENST1NTRUQgRkxBR1MKLSAgICAgICAgMHgxRjM4RCwgLy8gUElORSBERUNPUkFUSU9OCi0gICAgICAgIDB4MUYzOEUsIC8vIEpBUEFORVNFIERPTExTCi0gICAgICAgIDB4MUYzOEYsIC8vIENBUlAgU1RSRUFNRVIKLSAgICAgICAgMHgxRjM5MCwgLy8gV0lORCBDSElNRQotICAgICAgICAweDFGMzkxLCAvLyBNT09OIFZJRVdJTkcgQ0VSRU1PTlkKLSAgICAgICAgMHgxRjM5MiwgLy8gU0NIT09MIFNBVENIRUwKLSAgICAgICAgMHgxRjM5MywgLy8gR1JBRFVBVElPTiBDQVAKLSAgICAgICAgMHgxRjM5NiwgLy8gTUlMSVRBUlkgTUVEQUwKLSAgICAgICAgMHgxRjM5NywgLy8gUkVNSU5ERVIgUklCQk9OCi0gICAgICAgIDB4MUYzOTksIC8vIFNUVURJTyBNSUNST1BIT05FCi0gICAgICAgIDB4MUYzOUEsIC8vIExFVkVMIFNMSURFUgotICAgICAgICAweDFGMzlCLCAvLyBDT05UUk9MIEtOT0JTCi0gICAgICAgIDB4MUYzOUUsIC8vIEZJTE0gRlJBTUVTCi0gICAgICAgIDB4MUYzOUYsIC8vIEFETUlTU0lPTiBUSUNLRVRTCi0gICAgICAgIDB4MUYzQTAsIC8vIENBUk9VU0VMIEhPUlNFCi0gICAgICAgIDB4MUYzQTEsIC8vIEZFUlJJUyBXSEVFTAotICAgICAgICAweDFGM0EyLCAvLyBST0xMRVIgQ09BU1RFUgotICAgICAgICAweDFGM0EzLCAvLyBGSVNISU5HIFBPTEUgQU5EIEZJU0gKLSAgICAgICAgMHgxRjNBNCwgLy8gTUlDUk9QSE9ORQotICAgICAgICAweDFGM0E1LCAvLyBNT1ZJRSBDQU1FUkEKLSAgICAgICAgMHgxRjNBNiwgLy8gQ0lORU1BCi0gICAgICAgIDB4MUYzQTcsIC8vIEhFQURQSE9ORQotICAgICAgICAweDFGM0E4LCAvLyBBUlRJU1QgUEFMRVRURQotICAgICAgICAweDFGM0E5LCAvLyBUT1AgSEFUCi0gICAgICAgIDB4MUYzQUEsIC8vIENJUkNVUyBURU5UCi0gICAgICAgIDB4MUYzQUIsIC8vIFRJQ0tFVAotICAgICAgICAweDFGM0FDLCAvLyBDTEFQUEVSIEJPQVJECi0gICAgICAgIDB4MUYzQUQsIC8vIFBFUkZPUk1JTkcgQVJUUwotICAgICAgICAweDFGM0FFLCAvLyBWSURFTyBHQU1FCi0gICAgICAgIDB4MUYzQUYsIC8vIERJUkVDVCBISVQKLSAgICAgICAgMHgxRjNCMCwgLy8gU0xPVCBNQUNISU5FCi0gICAgICAgIDB4MUYzQjEsIC8vIEJJTExJQVJEUwotICAgICAgICAweDFGM0IyLCAvLyBHQU1FIERJRQotICAgICAgICAweDFGM0IzLCAvLyBCT1dMSU5HCi0gICAgICAgIDB4MUYzQjQsIC8vIEZMT1dFUiBQTEFZSU5HIENBUkRTCi0gICAgICAgIDB4MUYzQjUsIC8vIE1VU0lDQUwgTk9URQotICAgICAgICAweDFGM0I2LCAvLyBNVUxUSVBMRSBNVVNJQ0FMIE5PVEVTCi0gICAgICAgIDB4MUYzQjcsIC8vIFNBWE9QSE9ORQotICAgICAgICAweDFGM0I4LCAvLyBHVUlUQVIKLSAgICAgICAgMHgxRjNCOSwgLy8gTVVTSUNBTCBLRVlCT0FSRAotICAgICAgICAweDFGM0JBLCAvLyBUUlVNUEVUCi0gICAgICAgIDB4MUYzQkIsIC8vIFZJT0xJTgotICAgICAgICAweDFGM0JDLCAvLyBNVVNJQ0FMIFNDT1JFCi0gICAgICAgIDB4MUYzQkQsIC8vIFJVTk5JTkcgU0hJUlQgV0lUSCBTQVNICi0gICAgICAgIDB4MUYzQkUsIC8vIFRFTk5JUyBSQUNRVUVUIEFORCBCQUxMCi0gICAgICAgIDB4MUYzQkYsIC8vIFNLSSBBTkQgU0tJIEJPT1QKLSAgICAgICAgMHgxRjNDMCwgLy8gQkFTS0VUQkFMTCBBTkQgSE9PUAotICAgICAgICAweDFGM0MxLCAvLyBDSEVRVUVSRUQgRkxBRwotICAgICAgICAweDFGM0MyLCAvLyBTTk9XQk9BUkRFUgotICAgICAgICAweDFGM0MzLCAvLyBSVU5ORVIKLSAgICAgICAgMHgxRjNDNCwgLy8gU1VSRkVSCi0gICAgICAgIDB4MUYzQzUsIC8vIFNQT1JUUyBNRURBTAotICAgICAgICAweDFGM0M2LCAvLyBUUk9QSFkKLSAgICAgICAgMHgxRjNDNywgLy8gSE9SU0UgUkFDSU5HCi0gICAgICAgIDB4MUYzQzgsIC8vIEFNRVJJQ0FOIEZPT1RCQUxMCi0gICAgICAgIDB4MUYzQzksIC8vIFJVR0JZIEZPT1RCQUxMCi0gICAgICAgIDB4MUYzQ0EsIC8vIFNXSU1NRVIKLSAgICAgICAgMHgxRjNDQiwgLy8gV0VJR0hUIExJRlRFUgotICAgICAgICAweDFGM0NDLCAvLyBHT0xGRVIKLSAgICAgICAgMHgxRjNDRCwgLy8gUkFDSU5HIE1PVE9SQ1lDTEUKLSAgICAgICAgMHgxRjNDRSwgLy8gUkFDSU5HIENBUgotICAgICAgICAweDFGM0NGLCAvLyBDUklDS0VUIEJBVCBBTkQgQkFMTAotICAgICAgICAweDFGM0QwLCAvLyBWT0xMRVlCQUxMCi0gICAgICAgIDB4MUYzRDEsIC8vIEZJRUxEIEhPQ0tFWSBTVElDSyBBTkQgQkFMTAotICAgICAgICAweDFGM0QyLCAvLyBJQ0UgSE9DS0VZIFNUSUNLIEFORCBQVUNLCi0gICAgICAgIDB4MUYzRDMsIC8vIFRBQkxFIFRFTk5JUyBQQURETEUgQU5EIEJBTEwKLSAgICAgICAgMHgxRjNENCwgLy8gU05PVyBDQVBQRUQgTU9VTlRBSU4KLSAgICAgICAgMHgxRjNENSwgLy8gQ0FNUElORwotICAgICAgICAweDFGM0Q2LCAvLyBCRUFDSCBXSVRIIFVNQlJFTExBCi0gICAgICAgIDB4MUYzRDcsIC8vIEJVSUxESU5HIENPTlNUUlVDVElPTgotICAgICAgICAweDFGM0Q4LCAvLyBIT1VTRSBCVUlMRElOR1MKLSAgICAgICAgMHgxRjNEOSwgLy8gQ0lUWVNDQVBFCi0gICAgICAgIDB4MUYzREEsIC8vIERFUkVMSUNUIEhPVVNFIEJVSUxESU5HCi0gICAgICAgIDB4MUYzREIsIC8vIENMQVNTSUNBTCBCVUlMRElORwotICAgICAgICAweDFGM0RDLCAvLyBERVNFUlQKLSAgICAgICAgMHgxRjNERCwgLy8gREVTRVJUIElTTEFORAotICAgICAgICAweDFGM0RFLCAvLyBOQVRJT05BTCBQQVJLCi0gICAgICAgIDB4MUYzREYsIC8vIFNUQURJVU0KLSAgICAgICAgMHgxRjNFMCwgLy8gSE9VU0UgQlVJTERJTkcKLSAgICAgICAgMHgxRjNFMSwgLy8gSE9VU0UgV0lUSCBHQVJERU4KLSAgICAgICAgMHgxRjNFMiwgLy8gT0ZGSUNFIEJVSUxESU5HCi0gICAgICAgIDB4MUYzRTMsIC8vIEpBUEFORVNFIFBPU1QgT0ZGSUNFCi0gICAgICAgIDB4MUYzRTQsIC8vIEVVUk9QRUFOIFBPU1QgT0ZGSUNFCi0gICAgICAgIDB4MUYzRTUsIC8vIEhPU1BJVEFMCi0gICAgICAgIDB4MUYzRTYsIC8vIEJBTksKLSAgICAgICAgMHgxRjNFNywgLy8gQVVUT01BVEVEIFRFTExFUiBNQUNISU5FCi0gICAgICAgIDB4MUYzRTgsIC8vIEhPVEVMCi0gICAgICAgIDB4MUYzRTksIC8vIExPVkUgSE9URUwKLSAgICAgICAgMHgxRjNFQSwgLy8gQ09OVkVOSUVOQ0UgU1RPUkUKLSAgICAgICAgMHgxRjNFQiwgLy8gU0NIT09MCi0gICAgICAgIDB4MUYzRUMsIC8vIERFUEFSVE1FTlQgU1RPUkUKLSAgICAgICAgMHgxRjNFRCwgLy8gRkFDVE9SWQotICAgICAgICAweDFGM0VFLCAvLyBJWkFLQVlBIExBTlRFUk4KLSAgICAgICAgMHgxRjNFRiwgLy8gSkFQQU5FU0UgQ0FTVExFCi0gICAgICAgIDB4MUYzRjAsIC8vIEVVUk9QRUFOIENBU1RMRQotICAgICAgICAweDFGM0YzLCAvLyBXQVZJTkcgV0hJVEUgRkxBRwotICAgICAgICAweDFGM0Y0LCAvLyBXQVZJTkcgQkxBQ0sgRkxBRwotICAgICAgICAweDFGM0Y1LCAvLyBST1NFVFRFCi0gICAgICAgIDB4MUYzRjcsIC8vIExBQkVMCi0gICAgICAgIDB4MUYzRjgsIC8vIEJBRE1JTlRPTiBSQUNRVUVUIEFORCBTSFVUVExFQ09DSwotICAgICAgICAweDFGM0Y5LCAvLyBCT1cgQU5EIEFSUk9XCi0gICAgICAgIDB4MUYzRkEsIC8vIEFNUEhPUkEKLSAgICAgICAgMHgxRjNGQiwgLy8gRU1PSkkgTU9ESUZJRVIgRklUWlBBVFJJQ0sgVFlQRS0xLTIKLSAgICAgICAgMHgxRjNGQywgLy8gRU1PSkkgTU9ESUZJRVIgRklUWlBBVFJJQ0sgVFlQRS0zCi0gICAgICAgIDB4MUYzRkQsIC8vIEVNT0pJIE1PRElGSUVSIEZJVFpQQVRSSUNLIFRZUEUtNAotICAgICAgICAweDFGM0ZFLCAvLyBFTU9KSSBNT0RJRklFUiBGSVRaUEFUUklDSyBUWVBFLTUKLSAgICAgICAgMHgxRjNGRiwgLy8gRU1PSkkgTU9ESUZJRVIgRklUWlBBVFJJQ0sgVFlQRS02Ci0gICAgICAgIDB4MUY0MDAsIC8vIFJBVAotICAgICAgICAweDFGNDAxLCAvLyBNT1VTRQotICAgICAgICAweDFGNDAyLCAvLyBPWAotICAgICAgICAweDFGNDAzLCAvLyBXQVRFUiBCVUZGQUxPCi0gICAgICAgIDB4MUY0MDQsIC8vIENPVwotICAgICAgICAweDFGNDA1LCAvLyBUSUdFUgotICAgICAgICAweDFGNDA2LCAvLyBMRU9QQVJECi0gICAgICAgIDB4MUY0MDcsIC8vIFJBQkJJVAotICAgICAgICAweDFGNDA4LCAvLyBDQVQKLSAgICAgICAgMHgxRjQwOSwgLy8gRFJBR09OCi0gICAgICAgIDB4MUY0MEEsIC8vIENST0NPRElMRQotICAgICAgICAweDFGNDBCLCAvLyBXSEFMRQotICAgICAgICAweDFGNDBDLCAvLyBTTkFJTAotICAgICAgICAweDFGNDBELCAvLyBTTkFLRQotICAgICAgICAweDFGNDBFLCAvLyBIT1JTRQotICAgICAgICAweDFGNDBGLCAvLyBSQU0KLSAgICAgICAgMHgxRjQxMCwgLy8gR09BVAotICAgICAgICAweDFGNDExLCAvLyBTSEVFUAotICAgICAgICAweDFGNDEyLCAvLyBNT05LRVkKLSAgICAgICAgMHgxRjQxMywgLy8gUk9PU1RFUgotICAgICAgICAweDFGNDE0LCAvLyBDSElDS0VOCi0gICAgICAgIDB4MUY0MTUsIC8vIERPRwotICAgICAgICAweDFGNDE2LCAvLyBQSUcKLSAgICAgICAgMHgxRjQxNywgLy8gQk9BUgotICAgICAgICAweDFGNDE4LCAvLyBFTEVQSEFOVAotICAgICAgICAweDFGNDE5LCAvLyBPQ1RPUFVTCi0gICAgICAgIDB4MUY0MUEsIC8vIFNQSVJBTCBTSEVMTAotICAgICAgICAweDFGNDFCLCAvLyBCVUcKLSAgICAgICAgMHgxRjQxQywgLy8gQU5UCi0gICAgICAgIDB4MUY0MUQsIC8vIEhPTkVZQkVFCi0gICAgICAgIDB4MUY0MUUsIC8vIExBRFkgQkVFVExFCi0gICAgICAgIDB4MUY0MUYsIC8vIEZJU0gKLSAgICAgICAgMHgxRjQyMCwgLy8gVFJPUElDQUwgRklTSAotICAgICAgICAweDFGNDIxLCAvLyBCTE9XRklTSAotICAgICAgICAweDFGNDIyLCAvLyBUVVJUTEUKLSAgICAgICAgMHgxRjQyMywgLy8gSEFUQ0hJTkcgQ0hJQ0sKLSAgICAgICAgMHgxRjQyNCwgLy8gQkFCWSBDSElDSwotICAgICAgICAweDFGNDI1LCAvLyBGUk9OVC1GQUNJTkcgQkFCWSBDSElDSwotICAgICAgICAweDFGNDI2LCAvLyBCSVJECi0gICAgICAgIDB4MUY0MjcsIC8vIFBFTkdVSU4KLSAgICAgICAgMHgxRjQyOCwgLy8gS09BTEEKLSAgICAgICAgMHgxRjQyOSwgLy8gUE9PRExFCi0gICAgICAgIDB4MUY0MkEsIC8vIERST01FREFSWSBDQU1FTAotICAgICAgICAweDFGNDJCLCAvLyBCQUNUUklBTiBDQU1FTAotICAgICAgICAweDFGNDJDLCAvLyBET0xQSElOCi0gICAgICAgIDB4MUY0MkQsIC8vIE1PVVNFIEZBQ0UKLSAgICAgICAgMHgxRjQyRSwgLy8gQ09XIEZBQ0UKLSAgICAgICAgMHgxRjQyRiwgLy8gVElHRVIgRkFDRQotICAgICAgICAweDFGNDMwLCAvLyBSQUJCSVQgRkFDRQotICAgICAgICAweDFGNDMxLCAvLyBDQVQgRkFDRQotICAgICAgICAweDFGNDMyLCAvLyBEUkFHT04gRkFDRQotICAgICAgICAweDFGNDMzLCAvLyBTUE9VVElORyBXSEFMRQotICAgICAgICAweDFGNDM0LCAvLyBIT1JTRSBGQUNFCi0gICAgICAgIDB4MUY0MzUsIC8vIE1PTktFWSBGQUNFCi0gICAgICAgIDB4MUY0MzYsIC8vIERPRyBGQUNFCi0gICAgICAgIDB4MUY0MzcsIC8vIFBJRyBGQUNFCi0gICAgICAgIDB4MUY0MzgsIC8vIEZST0cgRkFDRQotICAgICAgICAweDFGNDM5LCAvLyBIQU1TVEVSIEZBQ0UKLSAgICAgICAgMHgxRjQzQSwgLy8gV09MRiBGQUNFCi0gICAgICAgIDB4MUY0M0IsIC8vIEJFQVIgRkFDRQotICAgICAgICAweDFGNDNDLCAvLyBQQU5EQSBGQUNFCi0gICAgICAgIDB4MUY0M0QsIC8vIFBJRyBOT1NFCi0gICAgICAgIDB4MUY0M0UsIC8vIFBBVyBQUklOVFMKLSAgICAgICAgMHgxRjQzRiwgLy8gQ0hJUE1VTksKLSAgICAgICAgMHgxRjQ0MCwgLy8gRVlFUwotICAgICAgICAweDFGNDQxLCAvLyBFWUUKLSAgICAgICAgMHgxRjQ0MiwgLy8gRUFSCi0gICAgICAgIDB4MUY0NDMsIC8vIE5PU0UKLSAgICAgICAgMHgxRjQ0NCwgLy8gTU9VVEgKLSAgICAgICAgMHgxRjQ0NSwgLy8gVE9OR1VFCi0gICAgICAgIDB4MUY0NDYsIC8vIFdISVRFIFVQIFBPSU5USU5HIEJBQ0tIQU5EIElOREVYCi0gICAgICAgIDB4MUY0NDcsIC8vIFdISVRFIERPV04gUE9JTlRJTkcgQkFDS0hBTkQgSU5ERVgKLSAgICAgICAgMHgxRjQ0OCwgLy8gV0hJVEUgTEVGVCBQT0lOVElORyBCQUNLSEFORCBJTkRFWAotICAgICAgICAweDFGNDQ5LCAvLyBXSElURSBSSUdIVCBQT0lOVElORyBCQUNLSEFORCBJTkRFWAotICAgICAgICAweDFGNDRBLCAvLyBGSVNURUQgSEFORCBTSUdOCi0gICAgICAgIDB4MUY0NEIsIC8vIFdBVklORyBIQU5EIFNJR04KLSAgICAgICAgMHgxRjQ0QywgLy8gT0sgSEFORCBTSUdOCi0gICAgICAgIDB4MUY0NEQsIC8vIFRIVU1CUyBVUCBTSUdOCi0gICAgICAgIDB4MUY0NEUsIC8vIFRIVU1CUyBET1dOIFNJR04KLSAgICAgICAgMHgxRjQ0RiwgLy8gQ0xBUFBJTkcgSEFORFMgU0lHTgotICAgICAgICAweDFGNDUwLCAvLyBPUEVOIEhBTkRTIFNJR04KLSAgICAgICAgMHgxRjQ1MSwgLy8gQ1JPV04KLSAgICAgICAgMHgxRjQ1MiwgLy8gV09NQU5TIEhBVAotICAgICAgICAweDFGNDUzLCAvLyBFWUVHTEFTU0VTCi0gICAgICAgIDB4MUY0NTQsIC8vIE5FQ0tUSUUKLSAgICAgICAgMHgxRjQ1NSwgLy8gVC1TSElSVAotICAgICAgICAweDFGNDU2LCAvLyBKRUFOUwotICAgICAgICAweDFGNDU3LCAvLyBEUkVTUwotICAgICAgICAweDFGNDU4LCAvLyBLSU1PTk8KLSAgICAgICAgMHgxRjQ1OSwgLy8gQklLSU5JCi0gICAgICAgIDB4MUY0NUEsIC8vIFdPTUFOUyBDTE9USEVTCi0gICAgICAgIDB4MUY0NUIsIC8vIFBVUlNFCi0gICAgICAgIDB4MUY0NUMsIC8vIEhBTkRCQUcKLSAgICAgICAgMHgxRjQ1RCwgLy8gUE9VQ0gKLSAgICAgICAgMHgxRjQ1RSwgLy8gTUFOUyBTSE9FCi0gICAgICAgIDB4MUY0NUYsIC8vIEFUSExFVElDIFNIT0UKLSAgICAgICAgMHgxRjQ2MCwgLy8gSElHSC1IRUVMRUQgU0hPRQotICAgICAgICAweDFGNDYxLCAvLyBXT01BTlMgU0FOREFMCi0gICAgICAgIDB4MUY0NjIsIC8vIFdPTUFOUyBCT09UUwotICAgICAgICAweDFGNDYzLCAvLyBGT09UUFJJTlRTCi0gICAgICAgIDB4MUY0NjQsIC8vIEJVU1QgSU4gU0lMSE9VRVRURQotICAgICAgICAweDFGNDY1LCAvLyBCVVNUUyBJTiBTSUxIT1VFVFRFCi0gICAgICAgIDB4MUY0NjYsIC8vIEJPWQotICAgICAgICAweDFGNDY3LCAvLyBHSVJMCi0gICAgICAgIDB4MUY0NjgsIC8vIE1BTgotICAgICAgICAweDFGNDY5LCAvLyBXT01BTgotICAgICAgICAweDFGNDZBLCAvLyBGQU1JTFkKLSAgICAgICAgMHgxRjQ2QiwgLy8gTUFOIEFORCBXT01BTiBIT0xESU5HIEhBTkRTCi0gICAgICAgIDB4MUY0NkMsIC8vIFRXTyBNRU4gSE9MRElORyBIQU5EUwotICAgICAgICAweDFGNDZELCAvLyBUV08gV09NRU4gSE9MRElORyBIQU5EUwotICAgICAgICAweDFGNDZFLCAvLyBQT0xJQ0UgT0ZGSUNFUgotICAgICAgICAweDFGNDZGLCAvLyBXT01BTiBXSVRIIEJVTk5ZIEVBUlMKLSAgICAgICAgMHgxRjQ3MCwgLy8gQlJJREUgV0lUSCBWRUlMCi0gICAgICAgIDB4MUY0NzEsIC8vIFBFUlNPTiBXSVRIIEJMT05EIEhBSVIKLSAgICAgICAgMHgxRjQ3MiwgLy8gTUFOIFdJVEggR1VBIFBJIE1BTwotICAgICAgICAweDFGNDczLCAvLyBNQU4gV0lUSCBUVVJCQU4KLSAgICAgICAgMHgxRjQ3NCwgLy8gT0xERVIgTUFOCi0gICAgICAgIDB4MUY0NzUsIC8vIE9MREVSIFdPTUFOCi0gICAgICAgIDB4MUY0NzYsIC8vIEJBQlkKLSAgICAgICAgMHgxRjQ3NywgLy8gQ09OU1RSVUNUSU9OIFdPUktFUgotICAgICAgICAweDFGNDc4LCAvLyBQUklOQ0VTUwotICAgICAgICAweDFGNDc5LCAvLyBKQVBBTkVTRSBPR1JFCi0gICAgICAgIDB4MUY0N0EsIC8vIEpBUEFORVNFIEdPQkxJTgotICAgICAgICAweDFGNDdCLCAvLyBHSE9TVAotICAgICAgICAweDFGNDdDLCAvLyBCQUJZIEFOR0VMCi0gICAgICAgIDB4MUY0N0QsIC8vIEVYVFJBVEVSUkVTVFJJQUwgQUxJRU4KLSAgICAgICAgMHgxRjQ3RSwgLy8gQUxJRU4gTU9OU1RFUgotICAgICAgICAweDFGNDdGLCAvLyBJTVAKLSAgICAgICAgMHgxRjQ4MCwgLy8gU0tVTEwKLSAgICAgICAgMHgxRjQ4MSwgLy8gSU5GT1JNQVRJT04gREVTSyBQRVJTT04KLSAgICAgICAgMHgxRjQ4MiwgLy8gR1VBUkRTTUFOCi0gICAgICAgIDB4MUY0ODMsIC8vIERBTkNFUgotICAgICAgICAweDFGNDg0LCAvLyBMSVBTVElDSwotICAgICAgICAweDFGNDg1LCAvLyBOQUlMIFBPTElTSAotICAgICAgICAweDFGNDg2LCAvLyBGQUNFIE1BU1NBR0UKLSAgICAgICAgMHgxRjQ4NywgLy8gSEFJUkNVVAotICAgICAgICAweDFGNDg4LCAvLyBCQVJCRVIgUE9MRQotICAgICAgICAweDFGNDg5LCAvLyBTWVJJTkdFCi0gICAgICAgIDB4MUY0OEEsIC8vIFBJTEwKLSAgICAgICAgMHgxRjQ4QiwgLy8gS0lTUyBNQVJLCi0gICAgICAgIDB4MUY0OEMsIC8vIExPVkUgTEVUVEVSCi0gICAgICAgIDB4MUY0OEQsIC8vIFJJTkcKLSAgICAgICAgMHgxRjQ4RSwgLy8gR0VNIFNUT05FCi0gICAgICAgIDB4MUY0OEYsIC8vIEtJU1MKLSAgICAgICAgMHgxRjQ5MCwgLy8gQk9VUVVFVAotICAgICAgICAweDFGNDkxLCAvLyBDT1VQTEUgV0lUSCBIRUFSVAotICAgICAgICAweDFGNDkyLCAvLyBXRURESU5HCi0gICAgICAgIDB4MUY0OTMsIC8vIEJFQVRJTkcgSEVBUlQKLSAgICAgICAgMHgxRjQ5NCwgLy8gQlJPS0VOIEhFQVJUCi0gICAgICAgIDB4MUY0OTUsIC8vIFRXTyBIRUFSVFMKLSAgICAgICAgMHgxRjQ5NiwgLy8gU1BBUktMSU5HIEhFQVJUCi0gICAgICAgIDB4MUY0OTcsIC8vIEdST1dJTkcgSEVBUlQKLSAgICAgICAgMHgxRjQ5OCwgLy8gSEVBUlQgV0lUSCBBUlJPVwotICAgICAgICAweDFGNDk5LCAvLyBCTFVFIEhFQVJUCi0gICAgICAgIDB4MUY0OUEsIC8vIEdSRUVOIEhFQVJUCi0gICAgICAgIDB4MUY0OUIsIC8vIFlFTExPVyBIRUFSVAotICAgICAgICAweDFGNDlDLCAvLyBQVVJQTEUgSEVBUlQKLSAgICAgICAgMHgxRjQ5RCwgLy8gSEVBUlQgV0lUSCBSSUJCT04KLSAgICAgICAgMHgxRjQ5RSwgLy8gUkVWT0xWSU5HIEhFQVJUUwotICAgICAgICAweDFGNDlGLCAvLyBIRUFSVCBERUNPUkFUSU9OCi0gICAgICAgIDB4MUY0QTAsIC8vIERJQU1PTkQgU0hBUEUgV0lUSCBBIERPVCBJTlNJREUKLSAgICAgICAgMHgxRjRBMSwgLy8gRUxFQ1RSSUMgTElHSFQgQlVMQgotICAgICAgICAweDFGNEEyLCAvLyBBTkdFUiBTWU1CT0wKLSAgICAgICAgMHgxRjRBMywgLy8gQk9NQgotICAgICAgICAweDFGNEE0LCAvLyBTTEVFUElORyBTWU1CT0wKLSAgICAgICAgMHgxRjRBNSwgLy8gQ09MTElTSU9OIFNZTUJPTAotICAgICAgICAweDFGNEE2LCAvLyBTUExBU0hJTkcgU1dFQVQgU1lNQk9MCi0gICAgICAgIDB4MUY0QTcsIC8vIERST1BMRVQKLSAgICAgICAgMHgxRjRBOCwgLy8gREFTSCBTWU1CT0wKLSAgICAgICAgMHgxRjRBOSwgLy8gUElMRSBPRiBQT08KLSAgICAgICAgMHgxRjRBQSwgLy8gRkxFWEVEIEJJQ0VQUwotICAgICAgICAweDFGNEFCLCAvLyBESVpaWSBTWU1CT0wKLSAgICAgICAgMHgxRjRBQywgLy8gU1BFRUNIIEJBTExPT04KLSAgICAgICAgMHgxRjRBRCwgLy8gVEhPVUdIVCBCQUxMT09OCi0gICAgICAgIDB4MUY0QUUsIC8vIFdISVRFIEZMT1dFUgotICAgICAgICAweDFGNEFGLCAvLyBIVU5EUkVEIFBPSU5UUyBTWU1CT0wKLSAgICAgICAgMHgxRjRCMCwgLy8gTU9ORVkgQkFHCi0gICAgICAgIDB4MUY0QjEsIC8vIENVUlJFTkNZIEVYQ0hBTkdFCi0gICAgICAgIDB4MUY0QjIsIC8vIEhFQVZZIERPTExBUiBTSUdOCi0gICAgICAgIDB4MUY0QjMsIC8vIENSRURJVCBDQVJECi0gICAgICAgIDB4MUY0QjQsIC8vIEJBTktOT1RFIFdJVEggWUVOIFNJR04KLSAgICAgICAgMHgxRjRCNSwgLy8gQkFOS05PVEUgV0lUSCBET0xMQVIgU0lHTgotICAgICAgICAweDFGNEI2LCAvLyBCQU5LTk9URSBXSVRIIEVVUk8gU0lHTgotICAgICAgICAweDFGNEI3LCAvLyBCQU5LTk9URSBXSVRIIFBPVU5EIFNJR04KLSAgICAgICAgMHgxRjRCOCwgLy8gTU9ORVkgV0lUSCBXSU5HUwotICAgICAgICAweDFGNEI5LCAvLyBDSEFSVCBXSVRIIFVQV0FSRFMgVFJFTkQgQU5EIFlFTiBTSUdOCi0gICAgICAgIDB4MUY0QkEsIC8vIFNFQVQKLSAgICAgICAgMHgxRjRCQiwgLy8gUEVSU09OQUwgQ09NUFVURVIKLSAgICAgICAgMHgxRjRCQywgLy8gQlJJRUZDQVNFCi0gICAgICAgIDB4MUY0QkQsIC8vIE1JTklESVNDCi0gICAgICAgIDB4MUY0QkUsIC8vIEZMT1BQWSBESVNLCi0gICAgICAgIDB4MUY0QkYsIC8vIE9QVElDQUwgRElTQwotICAgICAgICAweDFGNEMwLCAvLyBEVkQKLSAgICAgICAgMHgxRjRDMSwgLy8gRklMRSBGT0xERVIKLSAgICAgICAgMHgxRjRDMiwgLy8gT1BFTiBGSUxFIEZPTERFUgotICAgICAgICAweDFGNEMzLCAvLyBQQUdFIFdJVEggQ1VSTAotICAgICAgICAweDFGNEM0LCAvLyBQQUdFIEZBQ0lORyBVUAotICAgICAgICAweDFGNEM1LCAvLyBDQUxFTkRBUgotICAgICAgICAweDFGNEM2LCAvLyBURUFSLU9GRiBDQUxFTkRBUgotICAgICAgICAweDFGNEM3LCAvLyBDQVJEIElOREVYCi0gICAgICAgIDB4MUY0QzgsIC8vIENIQVJUIFdJVEggVVBXQVJEUyBUUkVORAotICAgICAgICAweDFGNEM5LCAvLyBDSEFSVCBXSVRIIERPV05XQVJEUyBUUkVORAotICAgICAgICAweDFGNENBLCAvLyBCQVIgQ0hBUlQKLSAgICAgICAgMHgxRjRDQiwgLy8gQ0xJUEJPQVJECi0gICAgICAgIDB4MUY0Q0MsIC8vIFBVU0hQSU4KLSAgICAgICAgMHgxRjRDRCwgLy8gUk9VTkQgUFVTSFBJTgotICAgICAgICAweDFGNENFLCAvLyBQQVBFUkNMSVAKLSAgICAgICAgMHgxRjRDRiwgLy8gU1RSQUlHSFQgUlVMRVIKLSAgICAgICAgMHgxRjREMCwgLy8gVFJJQU5HVUxBUiBSVUxFUgotICAgICAgICAweDFGNEQxLCAvLyBCT09LTUFSSyBUQUJTCi0gICAgICAgIDB4MUY0RDIsIC8vIExFREdFUgotICAgICAgICAweDFGNEQzLCAvLyBOT1RFQk9PSwotICAgICAgICAweDFGNEQ0LCAvLyBOT1RFQk9PSyBXSVRIIERFQ09SQVRJVkUgQ09WRVIKLSAgICAgICAgMHgxRjRENSwgLy8gQ0xPU0VEIEJPT0sKLSAgICAgICAgMHgxRjRENiwgLy8gT1BFTiBCT09LCi0gICAgICAgIDB4MUY0RDcsIC8vIEdSRUVOIEJPT0sKLSAgICAgICAgMHgxRjREOCwgLy8gQkxVRSBCT09LCi0gICAgICAgIDB4MUY0RDksIC8vIE9SQU5HRSBCT09LCi0gICAgICAgIDB4MUY0REEsIC8vIEJPT0tTCi0gICAgICAgIDB4MUY0REIsIC8vIE5BTUUgQkFER0UKLSAgICAgICAgMHgxRjREQywgLy8gU0NST0xMCi0gICAgICAgIDB4MUY0REQsIC8vIE1FTU8KLSAgICAgICAgMHgxRjRERSwgLy8gVEVMRVBIT05FIFJFQ0VJVkVSCi0gICAgICAgIDB4MUY0REYsIC8vIFBBR0VSCi0gICAgICAgIDB4MUY0RTAsIC8vIEZBWCBNQUNISU5FCi0gICAgICAgIDB4MUY0RTEsIC8vIFNBVEVMTElURSBBTlRFTk5BCi0gICAgICAgIDB4MUY0RTIsIC8vIFBVQkxJQyBBRERSRVNTIExPVURTUEVBS0VSCi0gICAgICAgIDB4MUY0RTMsIC8vIENIRUVSSU5HIE1FR0FQSE9ORQotICAgICAgICAweDFGNEU0LCAvLyBPVVRCT1ggVFJBWQotICAgICAgICAweDFGNEU1LCAvLyBJTkJPWCBUUkFZCi0gICAgICAgIDB4MUY0RTYsIC8vIFBBQ0tBR0UKLSAgICAgICAgMHgxRjRFNywgLy8gRS1NQUlMIFNZTUJPTAotICAgICAgICAweDFGNEU4LCAvLyBJTkNPTUlORyBFTlZFTE9QRQotICAgICAgICAweDFGNEU5LCAvLyBFTlZFTE9QRSBXSVRIIERPV05XQVJEUyBBUlJPVyBBQk9WRQotICAgICAgICAweDFGNEVBLCAvLyBDTE9TRUQgTUFJTEJPWCBXSVRIIExPV0VSRUQgRkxBRwotICAgICAgICAweDFGNEVCLCAvLyBDTE9TRUQgTUFJTEJPWCBXSVRIIFJBSVNFRCBGTEFHCi0gICAgICAgIDB4MUY0RUMsIC8vIE9QRU4gTUFJTEJPWCBXSVRIIFJBSVNFRCBGTEFHCi0gICAgICAgIDB4MUY0RUQsIC8vIE9QRU4gTUFJTEJPWCBXSVRIIExPV0VSRUQgRkxBRwotICAgICAgICAweDFGNEVFLCAvLyBQT1NUQk9YCi0gICAgICAgIDB4MUY0RUYsIC8vIFBPU1RBTCBIT1JOCi0gICAgICAgIDB4MUY0RjAsIC8vIE5FV1NQQVBFUgotICAgICAgICAweDFGNEYxLCAvLyBNT0JJTEUgUEhPTkUKLSAgICAgICAgMHgxRjRGMiwgLy8gTU9CSUxFIFBIT05FIFdJVEggUklHSFRXQVJEUyBBUlJPVyBBVCBMRUZUCi0gICAgICAgIDB4MUY0RjMsIC8vIFZJQlJBVElPTiBNT0RFCi0gICAgICAgIDB4MUY0RjQsIC8vIE1PQklMRSBQSE9ORSBPRkYKLSAgICAgICAgMHgxRjRGNSwgLy8gTk8gTU9CSUxFIFBIT05FUwotICAgICAgICAweDFGNEY2LCAvLyBBTlRFTk5BIFdJVEggQkFSUwotICAgICAgICAweDFGNEY3LCAvLyBDQU1FUkEKLSAgICAgICAgMHgxRjRGOCwgLy8gQ0FNRVJBIFdJVEggRkxBU0gKLSAgICAgICAgMHgxRjRGOSwgLy8gVklERU8gQ0FNRVJBCi0gICAgICAgIDB4MUY0RkEsIC8vIFRFTEVWSVNJT04KLSAgICAgICAgMHgxRjRGQiwgLy8gUkFESU8KLSAgICAgICAgMHgxRjRGQywgLy8gVklERU9DQVNTRVRURQotICAgICAgICAweDFGNEZELCAvLyBGSUxNIFBST0pFQ1RPUgotICAgICAgICAweDFGNEZGLCAvLyBQUkFZRVIgQkVBRFMKLSAgICAgICAgMHgxRjUwMCwgLy8gVFdJU1RFRCBSSUdIVFdBUkRTIEFSUk9XUwotICAgICAgICAweDFGNTAxLCAvLyBDTE9DS1dJU0UgUklHSFRXQVJEUyBBTkQgTEVGVFdBUkRTIE9QRU4gQ0lSQ0xFIEFSUk9XUwotICAgICAgICAweDFGNTAyLCAvLyBDTE9DS1dJU0UgUklHSFRXQVJEUyBBTkQgTEVGVFdBUkRTIE9QRU4gQ0lSQ0xFIEFSUk9XUyBXSVRIIENJUkNMRUQgT05FIE9WRVJMQVkKLSAgICAgICAgMHgxRjUwMywgLy8gQ0xPQ0tXSVNFIERPV05XQVJEUyBBTkQgVVBXQVJEUyBPUEVOIENJUkNMRSBBUlJPV1MKLSAgICAgICAgMHgxRjUwNCwgLy8gQU5USUNMT0NLV0lTRSBET1dOV0FSRFMgQU5EIFVQV0FSRFMgT1BFTiBDSVJDTEUgQVJST1dTCi0gICAgICAgIDB4MUY1MDUsIC8vIExPVyBCUklHSFRORVNTIFNZTUJPTAotICAgICAgICAweDFGNTA2LCAvLyBISUdIIEJSSUdIVE5FU1MgU1lNQk9MCi0gICAgICAgIDB4MUY1MDcsIC8vIFNQRUFLRVIgV0lUSCBDQU5DRUxMQVRJT04gU1RST0tFCi0gICAgICAgIDB4MUY1MDgsIC8vIFNQRUFLRVIKLSAgICAgICAgMHgxRjUwOSwgLy8gU1BFQUtFUiBXSVRIIE9ORSBTT1VORCBXQVZFCi0gICAgICAgIDB4MUY1MEEsIC8vIFNQRUFLRVIgV0lUSCBUSFJFRSBTT1VORCBXQVZFUwotICAgICAgICAweDFGNTBCLCAvLyBCQVRURVJZCi0gICAgICAgIDB4MUY1MEMsIC8vIEVMRUNUUklDIFBMVUcKLSAgICAgICAgMHgxRjUwRCwgLy8gTEVGVC1QT0lOVElORyBNQUdOSUZZSU5HIEdMQVNTCi0gICAgICAgIDB4MUY1MEUsIC8vIFJJR0hULVBPSU5USU5HIE1BR05JRllJTkcgR0xBU1MKLSAgICAgICAgMHgxRjUwRiwgLy8gTE9DSyBXSVRIIElOSyBQRU4KLSAgICAgICAgMHgxRjUxMCwgLy8gQ0xPU0VEIExPQ0sgV0lUSCBLRVkKLSAgICAgICAgMHgxRjUxMSwgLy8gS0VZCi0gICAgICAgIDB4MUY1MTIsIC8vIExPQ0sKLSAgICAgICAgMHgxRjUxMywgLy8gT1BFTiBMT0NLCi0gICAgICAgIDB4MUY1MTQsIC8vIEJFTEwKLSAgICAgICAgMHgxRjUxNSwgLy8gQkVMTCBXSVRIIENBTkNFTExBVElPTiBTVFJPS0UKLSAgICAgICAgMHgxRjUxNiwgLy8gQk9PS01BUksKLSAgICAgICAgMHgxRjUxNywgLy8gTElOSyBTWU1CT0wKLSAgICAgICAgMHgxRjUxOCwgLy8gUkFESU8gQlVUVE9OCi0gICAgICAgIDB4MUY1MTksIC8vIEJBQ0sgV0lUSCBMRUZUV0FSRFMgQVJST1cgQUJPVkUKLSAgICAgICAgMHgxRjUxQSwgLy8gRU5EIFdJVEggTEVGVFdBUkRTIEFSUk9XIEFCT1ZFCi0gICAgICAgIDB4MUY1MUIsIC8vIE9OIFdJVEggRVhDTEFNQVRJT04gTUFSSyBXSVRIIExFRlQgUklHSFQgQVJST1cgQUJPVkUKLSAgICAgICAgMHgxRjUxQywgLy8gU09PTiBXSVRIIFJJR0hUV0FSRFMgQVJST1cgQUJPVkUKLSAgICAgICAgMHgxRjUxRCwgLy8gVE9QIFdJVEggVVBXQVJEUyBBUlJPVyBBQk9WRQotICAgICAgICAweDFGNTFFLCAvLyBOTyBPTkUgVU5ERVIgRUlHSFRFRU4gU1lNQk9MCi0gICAgICAgIDB4MUY1MUYsIC8vIEtFWUNBUCBURU4KLSAgICAgICAgMHgxRjUyMCwgLy8gSU5QVVQgU1lNQk9MIEZPUiBMQVRJTiBDQVBJVEFMIExFVFRFUlMKLSAgICAgICAgMHgxRjUyMSwgLy8gSU5QVVQgU1lNQk9MIEZPUiBMQVRJTiBTTUFMTCBMRVRURVJTCi0gICAgICAgIDB4MUY1MjIsIC8vIElOUFVUIFNZTUJPTCBGT1IgTlVNQkVSUwotICAgICAgICAweDFGNTIzLCAvLyBJTlBVVCBTWU1CT0wgRk9SIFNZTUJPTFMKLSAgICAgICAgMHgxRjUyNCwgLy8gSU5QVVQgU1lNQk9MIEZPUiBMQVRJTiBMRVRURVJTCi0gICAgICAgIDB4MUY1MjUsIC8vIEZJUkUKLSAgICAgICAgMHgxRjUyNiwgLy8gRUxFQ1RSSUMgVE9SQ0gKLSAgICAgICAgMHgxRjUyNywgLy8gV1JFTkNICi0gICAgICAgIDB4MUY1MjgsIC8vIEhBTU1FUgotICAgICAgICAweDFGNTI5LCAvLyBOVVQgQU5EIEJPTFQKLSAgICAgICAgMHgxRjUyQSwgLy8gSE9DSE8KLSAgICAgICAgMHgxRjUyQiwgLy8gUElTVE9MCi0gICAgICAgIDB4MUY1MkMsIC8vIE1JQ1JPU0NPUEUKLSAgICAgICAgMHgxRjUyRCwgLy8gVEVMRVNDT1BFCi0gICAgICAgIDB4MUY1MkUsIC8vIENSWVNUQUwgQkFMTAotICAgICAgICAweDFGNTJGLCAvLyBTSVggUE9JTlRFRCBTVEFSIFdJVEggTUlERExFIERPVAotICAgICAgICAweDFGNTMwLCAvLyBKQVBBTkVTRSBTWU1CT0wgRk9SIEJFR0lOTkVSCi0gICAgICAgIDB4MUY1MzEsIC8vIFRSSURFTlQgRU1CTEVNCi0gICAgICAgIDB4MUY1MzIsIC8vIEJMQUNLIFNRVUFSRSBCVVRUT04KLSAgICAgICAgMHgxRjUzMywgLy8gV0hJVEUgU1FVQVJFIEJVVFRPTgotICAgICAgICAweDFGNTM0LCAvLyBMQVJHRSBSRUQgQ0lSQ0xFCi0gICAgICAgIDB4MUY1MzUsIC8vIExBUkdFIEJMVUUgQ0lSQ0xFCi0gICAgICAgIDB4MUY1MzYsIC8vIExBUkdFIE9SQU5HRSBESUFNT05ECi0gICAgICAgIDB4MUY1MzcsIC8vIExBUkdFIEJMVUUgRElBTU9ORAotICAgICAgICAweDFGNTM4LCAvLyBTTUFMTCBPUkFOR0UgRElBTU9ORAotICAgICAgICAweDFGNTM5LCAvLyBTTUFMTCBCTFVFIERJQU1PTkQKLSAgICAgICAgMHgxRjUzQSwgLy8gVVAtUE9JTlRJTkcgUkVEIFRSSUFOR0xFCi0gICAgICAgIDB4MUY1M0IsIC8vIERPV04tUE9JTlRJTkcgUkVEIFRSSUFOR0xFCi0gICAgICAgIDB4MUY1M0MsIC8vIFVQLVBPSU5USU5HIFNNQUxMIFJFRCBUUklBTkdMRQotICAgICAgICAweDFGNTNELCAvLyBET1dOLVBPSU5USU5HIFNNQUxMIFJFRCBUUklBTkdMRQotICAgICAgICAweDFGNTQ5LCAvLyBPTSBTWU1CT0wKLSAgICAgICAgMHgxRjU0QSwgLy8gRE9WRSBPRiBQRUFDRQotICAgICAgICAweDFGNTRCLCAvLyBLQUFCQQotICAgICAgICAweDFGNTRDLCAvLyBNT1NRVUUKLSAgICAgICAgMHgxRjU0RCwgLy8gU1lOQUdPR1VFCi0gICAgICAgIDB4MUY1NEUsIC8vIE1FTk9SQUggV0lUSCBOSU5FIEJSQU5DSEVTCi0gICAgICAgIDB4MUY1NTAsIC8vIENMT0NLIEZBQ0UgT05FIE9DTE9DSwotICAgICAgICAweDFGNTUxLCAvLyBDTE9DSyBGQUNFIFRXTyBPQ0xPQ0sKLSAgICAgICAgMHgxRjU1MiwgLy8gQ0xPQ0sgRkFDRSBUSFJFRSBPQ0xPQ0sKLSAgICAgICAgMHgxRjU1MywgLy8gQ0xPQ0sgRkFDRSBGT1VSIE9DTE9DSwotICAgICAgICAweDFGNTU0LCAvLyBDTE9DSyBGQUNFIEZJVkUgT0NMT0NLCi0gICAgICAgIDB4MUY1NTUsIC8vIENMT0NLIEZBQ0UgU0lYIE9DTE9DSwotICAgICAgICAweDFGNTU2LCAvLyBDTE9DSyBGQUNFIFNFVkVOIE9DTE9DSwotICAgICAgICAweDFGNTU3LCAvLyBDTE9DSyBGQUNFIEVJR0hUIE9DTE9DSwotICAgICAgICAweDFGNTU4LCAvLyBDTE9DSyBGQUNFIE5JTkUgT0NMT0NLCi0gICAgICAgIDB4MUY1NTksIC8vIENMT0NLIEZBQ0UgVEVOIE9DTE9DSwotICAgICAgICAweDFGNTVBLCAvLyBDTE9DSyBGQUNFIEVMRVZFTiBPQ0xPQ0sKLSAgICAgICAgMHgxRjU1QiwgLy8gQ0xPQ0sgRkFDRSBUV0VMVkUgT0NMT0NLCi0gICAgICAgIDB4MUY1NUMsIC8vIENMT0NLIEZBQ0UgT05FLVRISVJUWQotICAgICAgICAweDFGNTVELCAvLyBDTE9DSyBGQUNFIFRXTy1USElSVFkKLSAgICAgICAgMHgxRjU1RSwgLy8gQ0xPQ0sgRkFDRSBUSFJFRS1USElSVFkKLSAgICAgICAgMHgxRjU1RiwgLy8gQ0xPQ0sgRkFDRSBGT1VSLVRISVJUWQotICAgICAgICAweDFGNTYwLCAvLyBDTE9DSyBGQUNFIEZJVkUtVEhJUlRZCi0gICAgICAgIDB4MUY1NjEsIC8vIENMT0NLIEZBQ0UgU0lYLVRISVJUWQotICAgICAgICAweDFGNTYyLCAvLyBDTE9DSyBGQUNFIFNFVkVOLVRISVJUWQotICAgICAgICAweDFGNTYzLCAvLyBDTE9DSyBGQUNFIEVJR0hULVRISVJUWQotICAgICAgICAweDFGNTY0LCAvLyBDTE9DSyBGQUNFIE5JTkUtVEhJUlRZCi0gICAgICAgIDB4MUY1NjUsIC8vIENMT0NLIEZBQ0UgVEVOLVRISVJUWQotICAgICAgICAweDFGNTY2LCAvLyBDTE9DSyBGQUNFIEVMRVZFTi1USElSVFkKLSAgICAgICAgMHgxRjU2NywgLy8gQ0xPQ0sgRkFDRSBUV0VMVkUtVEhJUlRZCi0gICAgICAgIDB4MUY1NkYsIC8vIENBTkRMRQotICAgICAgICAweDFGNTcwLCAvLyBNQU5URUxQSUVDRSBDTE9DSwotICAgICAgICAweDFGNTczLCAvLyBIT0xFCi0gICAgICAgIDB4MUY1NzQsIC8vIE1BTiBJTiBCVVNJTkVTUyBTVUlUIExFVklUQVRJTkcKLSAgICAgICAgMHgxRjU3NSwgLy8gU0xFVVRIIE9SIFNQWQotICAgICAgICAweDFGNTc2LCAvLyBEQVJLIFNVTkdMQVNTRVMKLSAgICAgICAgMHgxRjU3NywgLy8gU1BJREVSCi0gICAgICAgIDB4MUY1NzgsIC8vIFNQSURFUiBXRUIKLSAgICAgICAgMHgxRjU3OSwgLy8gSk9ZU1RJQ0sKLSAgICAgICAgMHgxRjU3QSwgLy8gTUFOIERBTkNJTkcKLSAgICAgICAgMHgxRjU4NywgLy8gTElOS0VEIFBBUEVSQ0xJUFMKLSAgICAgICAgMHgxRjU4QSwgLy8gTE9XRVIgTEVGVCBCQUxMUE9JTlQgUEVOCi0gICAgICAgIDB4MUY1OEIsIC8vIExPV0VSIExFRlQgRk9VTlRBSU4gUEVOCi0gICAgICAgIDB4MUY1OEMsIC8vIExPV0VSIExFRlQgUEFJTlRCUlVTSAotICAgICAgICAweDFGNThELCAvLyBMT1dFUiBMRUZUIENSQVlPTgotICAgICAgICAweDFGNTkwLCAvLyBSQUlTRUQgSEFORCBXSVRIIEZJTkdFUlMgU1BMQVlFRAotICAgICAgICAweDFGNTk1LCAvLyBSRVZFUlNFRCBIQU5EIFdJVEggTUlERExFIEZJTkdFUiBFWFRFTkRFRAotICAgICAgICAweDFGNTk2LCAvLyBSQUlTRUQgSEFORCBXSVRIIFBBUlQgQkVUV0VFTiBNSURETEUgQU5EIFJJTkcgRklOR0VSUwotICAgICAgICAweDFGNUE0LCAvLyBCTEFDSyBIRUFSVAotICAgICAgICAweDFGNUE1LCAvLyBERVNLVE9QIENPTVBVVEVSCi0gICAgICAgIDB4MUY1QTgsIC8vIFBSSU5URVIKLSAgICAgICAgMHgxRjVCMSwgLy8gVEhSRUUgQlVUVE9OIE1PVVNFCi0gICAgICAgIDB4MUY1QjIsIC8vIFRSQUNLQkFMTAotICAgICAgICAweDFGNUJDLCAvLyBGUkFNRSBXSVRIIFBJQ1RVUkUKLSAgICAgICAgMHgxRjVDMiwgLy8gQ0FSRCBJTkRFWCBESVZJREVSUwotICAgICAgICAweDFGNUMzLCAvLyBDQVJEIEZJTEUgQk9YCi0gICAgICAgIDB4MUY1QzQsIC8vIEZJTEUgQ0FCSU5FVAotICAgICAgICAweDFGNUQxLCAvLyBXQVNURUJBU0tFVAotICAgICAgICAweDFGNUQyLCAvLyBTUElSQUwgTk9URSBQQUQKLSAgICAgICAgMHgxRjVEMywgLy8gU1BJUkFMIENBTEVOREFSIFBBRAotICAgICAgICAweDFGNURDLCAvLyBDT01QUkVTU0lPTgotICAgICAgICAweDFGNURELCAvLyBPTEQgS0VZCi0gICAgICAgIDB4MUY1REUsIC8vIFJPTExFRC1VUCBORVdTUEFQRVIKLSAgICAgICAgMHgxRjVFMSwgLy8gREFHR0VSIEtOSUZFCi0gICAgICAgIDB4MUY1RTMsIC8vIFNQRUFLSU5HIEhFQUQgSU4gU0lMSE9VRVRURQotICAgICAgICAweDFGNUU4LCAvLyBMRUZUIFNQRUVDSCBCVUJCTEUKLSAgICAgICAgMHgxRjVFRiwgLy8gUklHSFQgQU5HRVIgQlVCQkxFCi0gICAgICAgIDB4MUY1RjMsIC8vIEJBTExPVCBCT1ggV0lUSCBCQUxMT1QKLSAgICAgICAgMHgxRjVGQSwgLy8gV09STEQgTUFQCi0gICAgICAgIDB4MUY1RkIsIC8vIE1PVU5UIEZVSkkKLSAgICAgICAgMHgxRjVGQywgLy8gVE9LWU8gVE9XRVIKLSAgICAgICAgMHgxRjVGRCwgLy8gU1RBVFVFIE9GIExJQkVSVFkKLSAgICAgICAgMHgxRjVGRSwgLy8gU0lMSE9VRVRURSBPRiBKQVBBTgotICAgICAgICAweDFGNUZGLCAvLyBNT1lBSQotICAgICAgICAweDFGNjAwLCAvLyBHUklOTklORyBGQUNFCi0gICAgICAgIDB4MUY2MDEsIC8vIEdSSU5OSU5HIEZBQ0UgV0lUSCBTTUlMSU5HIEVZRVMKLSAgICAgICAgMHgxRjYwMiwgLy8gRkFDRSBXSVRIIFRFQVJTIE9GIEpPWQotICAgICAgICAweDFGNjAzLCAvLyBTTUlMSU5HIEZBQ0UgV0lUSCBPUEVOIE1PVVRICi0gICAgICAgIDB4MUY2MDQsIC8vIFNNSUxJTkcgRkFDRSBXSVRIIE9QRU4gTU9VVEggQU5EIFNNSUxJTkcgRVlFUwotICAgICAgICAweDFGNjA1LCAvLyBTTUlMSU5HIEZBQ0UgV0lUSCBPUEVOIE1PVVRIIEFORCBDT0xEIFNXRUFUCi0gICAgICAgIDB4MUY2MDYsIC8vIFNNSUxJTkcgRkFDRSBXSVRIIE9QRU4gTU9VVEggQU5EIFRJR0hUTFktQ0xPU0VEIEVZRVMKLSAgICAgICAgMHgxRjYwNywgLy8gU01JTElORyBGQUNFIFdJVEggSEFMTwotICAgICAgICAweDFGNjA4LCAvLyBTTUlMSU5HIEZBQ0UgV0lUSCBIT1JOUwotICAgICAgICAweDFGNjA5LCAvLyBXSU5LSU5HIEZBQ0UKLSAgICAgICAgMHgxRjYwQSwgLy8gU01JTElORyBGQUNFIFdJVEggU01JTElORyBFWUVTCi0gICAgICAgIDB4MUY2MEIsIC8vIEZBQ0UgU0FWT1VSSU5HIERFTElDSU9VUyBGT09ECi0gICAgICAgIDB4MUY2MEMsIC8vIFJFTElFVkVEIEZBQ0UKLSAgICAgICAgMHgxRjYwRCwgLy8gU01JTElORyBGQUNFIFdJVEggSEVBUlQtU0hBUEVEIEVZRVMKLSAgICAgICAgMHgxRjYwRSwgLy8gU01JTElORyBGQUNFIFdJVEggU1VOR0xBU1NFUwotICAgICAgICAweDFGNjBGLCAvLyBTTUlSS0lORyBGQUNFCi0gICAgICAgIDB4MUY2MTAsIC8vIE5FVVRSQUwgRkFDRQotICAgICAgICAweDFGNjExLCAvLyBFWFBSRVNTSU9OTEVTUyBGQUNFCi0gICAgICAgIDB4MUY2MTIsIC8vIFVOQU1VU0VEIEZBQ0UKLSAgICAgICAgMHgxRjYxMywgLy8gRkFDRSBXSVRIIENPTEQgU1dFQVQKLSAgICAgICAgMHgxRjYxNCwgLy8gUEVOU0lWRSBGQUNFCi0gICAgICAgIDB4MUY2MTUsIC8vIENPTkZVU0VEIEZBQ0UKLSAgICAgICAgMHgxRjYxNiwgLy8gQ09ORk9VTkRFRCBGQUNFCi0gICAgICAgIDB4MUY2MTcsIC8vIEtJU1NJTkcgRkFDRQotICAgICAgICAweDFGNjE4LCAvLyBGQUNFIFRIUk9XSU5HIEEgS0lTUwotICAgICAgICAweDFGNjE5LCAvLyBLSVNTSU5HIEZBQ0UgV0lUSCBTTUlMSU5HIEVZRVMKLSAgICAgICAgMHgxRjYxQSwgLy8gS0lTU0lORyBGQUNFIFdJVEggQ0xPU0VEIEVZRVMKLSAgICAgICAgMHgxRjYxQiwgLy8gRkFDRSBXSVRIIFNUVUNLLU9VVCBUT05HVUUKLSAgICAgICAgMHgxRjYxQywgLy8gRkFDRSBXSVRIIFNUVUNLLU9VVCBUT05HVUUgQU5EIFdJTktJTkcgRVlFCi0gICAgICAgIDB4MUY2MUQsIC8vIEZBQ0UgV0lUSCBTVFVDSy1PVVQgVE9OR1VFIEFORCBUSUdIVExZLUNMT1NFRCBFWUVTCi0gICAgICAgIDB4MUY2MUUsIC8vIERJU0FQUE9JTlRFRCBGQUNFCi0gICAgICAgIDB4MUY2MUYsIC8vIFdPUlJJRUQgRkFDRQotICAgICAgICAweDFGNjIwLCAvLyBBTkdSWSBGQUNFCi0gICAgICAgIDB4MUY2MjEsIC8vIFBPVVRJTkcgRkFDRQotICAgICAgICAweDFGNjIyLCAvLyBDUllJTkcgRkFDRQotICAgICAgICAweDFGNjIzLCAvLyBQRVJTRVZFUklORyBGQUNFCi0gICAgICAgIDB4MUY2MjQsIC8vIEZBQ0UgV0lUSCBMT09LIE9GIFRSSVVNUEgKLSAgICAgICAgMHgxRjYyNSwgLy8gRElTQVBQT0lOVEVEIEJVVCBSRUxJRVZFRCBGQUNFCi0gICAgICAgIDB4MUY2MjYsIC8vIEZST1dOSU5HIEZBQ0UgV0lUSCBPUEVOIE1PVVRICi0gICAgICAgIDB4MUY2MjcsIC8vIEFOR1VJU0hFRCBGQUNFCi0gICAgICAgIDB4MUY2MjgsIC8vIEZFQVJGVUwgRkFDRQotICAgICAgICAweDFGNjI5LCAvLyBXRUFSWSBGQUNFCi0gICAgICAgIDB4MUY2MkEsIC8vIFNMRUVQWSBGQUNFCi0gICAgICAgIDB4MUY2MkIsIC8vIFRJUkVEIEZBQ0UKLSAgICAgICAgMHgxRjYyQywgLy8gR1JJTUFDSU5HIEZBQ0UKLSAgICAgICAgMHgxRjYyRCwgLy8gTE9VRExZIENSWUlORyBGQUNFCi0gICAgICAgIDB4MUY2MkUsIC8vIEZBQ0UgV0lUSCBPUEVOIE1PVVRICi0gICAgICAgIDB4MUY2MkYsIC8vIEhVU0hFRCBGQUNFCi0gICAgICAgIDB4MUY2MzAsIC8vIEZBQ0UgV0lUSCBPUEVOIE1PVVRIIEFORCBDT0xEIFNXRUFUCi0gICAgICAgIDB4MUY2MzEsIC8vIEZBQ0UgU0NSRUFNSU5HIElOIEZFQVIKLSAgICAgICAgMHgxRjYzMiwgLy8gQVNUT05JU0hFRCBGQUNFCi0gICAgICAgIDB4MUY2MzMsIC8vIEZMVVNIRUQgRkFDRQotICAgICAgICAweDFGNjM0LCAvLyBTTEVFUElORyBGQUNFCi0gICAgICAgIDB4MUY2MzUsIC8vIERJWlpZIEZBQ0UKLSAgICAgICAgMHgxRjYzNiwgLy8gRkFDRSBXSVRIT1VUIE1PVVRICi0gICAgICAgIDB4MUY2MzcsIC8vIEZBQ0UgV0lUSCBNRURJQ0FMIE1BU0sKLSAgICAgICAgMHgxRjYzOCwgLy8gR1JJTk5JTkcgQ0FUIEZBQ0UgV0lUSCBTTUlMSU5HIEVZRVMKLSAgICAgICAgMHgxRjYzOSwgLy8gQ0FUIEZBQ0UgV0lUSCBURUFSUyBPRiBKT1kKLSAgICAgICAgMHgxRjYzQSwgLy8gU01JTElORyBDQVQgRkFDRSBXSVRIIE9QRU4gTU9VVEgKLSAgICAgICAgMHgxRjYzQiwgLy8gU01JTElORyBDQVQgRkFDRSBXSVRIIEhFQVJULVNIQVBFRCBFWUVTCi0gICAgICAgIDB4MUY2M0MsIC8vIENBVCBGQUNFIFdJVEggV1JZIFNNSUxFCi0gICAgICAgIDB4MUY2M0QsIC8vIEtJU1NJTkcgQ0FUIEZBQ0UgV0lUSCBDTE9TRUQgRVlFUwotICAgICAgICAweDFGNjNFLCAvLyBQT1VUSU5HIENBVCBGQUNFCi0gICAgICAgIDB4MUY2M0YsIC8vIENSWUlORyBDQVQgRkFDRQotICAgICAgICAweDFGNjQwLCAvLyBXRUFSWSBDQVQgRkFDRQotICAgICAgICAweDFGNjQxLCAvLyBTTElHSFRMWSBGUk9XTklORyBGQUNFCi0gICAgICAgIDB4MUY2NDIsIC8vIFNMSUdIVExZIFNNSUxJTkcgRkFDRQotICAgICAgICAweDFGNjQzLCAvLyBVUFNJREUtRE9XTiBGQUNFCi0gICAgICAgIDB4MUY2NDQsIC8vIEZBQ0UgV0lUSCBST0xMSU5HIEVZRVMKLSAgICAgICAgMHgxRjY0NSwgLy8gRkFDRSBXSVRIIE5PIEdPT0QgR0VTVFVSRQotICAgICAgICAweDFGNjQ2LCAvLyBGQUNFIFdJVEggT0sgR0VTVFVSRQotICAgICAgICAweDFGNjQ3LCAvLyBQRVJTT04gQk9XSU5HIERFRVBMWQotICAgICAgICAweDFGNjQ4LCAvLyBTRUUtTk8tRVZJTCBNT05LRVkKLSAgICAgICAgMHgxRjY0OSwgLy8gSEVBUi1OTy1FVklMIE1PTktFWQotICAgICAgICAweDFGNjRBLCAvLyBTUEVBSy1OTy1FVklMIE1PTktFWQotICAgICAgICAweDFGNjRCLCAvLyBIQVBQWSBQRVJTT04gUkFJU0lORyBPTkUgSEFORAotICAgICAgICAweDFGNjRDLCAvLyBQRVJTT04gUkFJU0lORyBCT1RIIEhBTkRTIElOIENFTEVCUkFUSU9OCi0gICAgICAgIDB4MUY2NEQsIC8vIFBFUlNPTiBGUk9XTklORwotICAgICAgICAweDFGNjRFLCAvLyBQRVJTT04gV0lUSCBQT1VUSU5HIEZBQ0UKLSAgICAgICAgMHgxRjY0RiwgLy8gUEVSU09OIFdJVEggRk9MREVEIEhBTkRTCi0gICAgICAgIDB4MUY2ODAsIC8vIFJPQ0tFVAotICAgICAgICAweDFGNjgxLCAvLyBIRUxJQ09QVEVSCi0gICAgICAgIDB4MUY2ODIsIC8vIFNURUFNIExPQ09NT1RJVkUKLSAgICAgICAgMHgxRjY4MywgLy8gUkFJTFdBWSBDQVIKLSAgICAgICAgMHgxRjY4NCwgLy8gSElHSC1TUEVFRCBUUkFJTgotICAgICAgICAweDFGNjg1LCAvLyBISUdILVNQRUVEIFRSQUlOIFdJVEggQlVMTEVUIE5PU0UKLSAgICAgICAgMHgxRjY4NiwgLy8gVFJBSU4KLSAgICAgICAgMHgxRjY4NywgLy8gTUVUUk8KLSAgICAgICAgMHgxRjY4OCwgLy8gTElHSFQgUkFJTAotICAgICAgICAweDFGNjg5LCAvLyBTVEFUSU9OCi0gICAgICAgIDB4MUY2OEEsIC8vIFRSQU0KLSAgICAgICAgMHgxRjY4QiwgLy8gVFJBTSBDQVIKLSAgICAgICAgMHgxRjY4QywgLy8gQlVTCi0gICAgICAgIDB4MUY2OEQsIC8vIE9OQ09NSU5HIEJVUwotICAgICAgICAweDFGNjhFLCAvLyBUUk9MTEVZQlVTCi0gICAgICAgIDB4MUY2OEYsIC8vIEJVUyBTVE9QCi0gICAgICAgIDB4MUY2OTAsIC8vIE1JTklCVVMKLSAgICAgICAgMHgxRjY5MSwgLy8gQU1CVUxBTkNFCi0gICAgICAgIDB4MUY2OTIsIC8vIEZJUkUgRU5HSU5FCi0gICAgICAgIDB4MUY2OTMsIC8vIFBPTElDRSBDQVIKLSAgICAgICAgMHgxRjY5NCwgLy8gT05DT01JTkcgUE9MSUNFIENBUgotICAgICAgICAweDFGNjk1LCAvLyBUQVhJCi0gICAgICAgIDB4MUY2OTYsIC8vIE9OQ09NSU5HIFRBWEkKLSAgICAgICAgMHgxRjY5NywgLy8gQVVUT01PQklMRQotICAgICAgICAweDFGNjk4LCAvLyBPTkNPTUlORyBBVVRPTU9CSUxFCi0gICAgICAgIDB4MUY2OTksIC8vIFJFQ1JFQVRJT05BTCBWRUhJQ0xFCi0gICAgICAgIDB4MUY2OUEsIC8vIERFTElWRVJZIFRSVUNLCi0gICAgICAgIDB4MUY2OUIsIC8vIEFSVElDVUxBVEVEIExPUlJZCi0gICAgICAgIDB4MUY2OUMsIC8vIFRSQUNUT1IKLSAgICAgICAgMHgxRjY5RCwgLy8gTU9OT1JBSUwKLSAgICAgICAgMHgxRjY5RSwgLy8gTU9VTlRBSU4gUkFJTFdBWQotICAgICAgICAweDFGNjlGLCAvLyBTVVNQRU5TSU9OIFJBSUxXQVkKLSAgICAgICAgMHgxRjZBMCwgLy8gTU9VTlRBSU4gQ0FCTEVXQVkKLSAgICAgICAgMHgxRjZBMSwgLy8gQUVSSUFMIFRSQU1XQVkKLSAgICAgICAgMHgxRjZBMiwgLy8gU0hJUAotICAgICAgICAweDFGNkEzLCAvLyBST1dCT0FUCi0gICAgICAgIDB4MUY2QTQsIC8vIFNQRUVEQk9BVAotICAgICAgICAweDFGNkE1LCAvLyBIT1JJWk9OVEFMIFRSQUZGSUMgTElHSFQKLSAgICAgICAgMHgxRjZBNiwgLy8gVkVSVElDQUwgVFJBRkZJQyBMSUdIVAotICAgICAgICAweDFGNkE3LCAvLyBDT05TVFJVQ1RJT04gU0lHTgotICAgICAgICAweDFGNkE4LCAvLyBQT0xJQ0UgQ0FSUyBSRVZPTFZJTkcgTElHSFQKLSAgICAgICAgMHgxRjZBOSwgLy8gVFJJQU5HVUxBUiBGTEFHIE9OIFBPU1QKLSAgICAgICAgMHgxRjZBQSwgLy8gRE9PUgotICAgICAgICAweDFGNkFCLCAvLyBOTyBFTlRSWSBTSUdOCi0gICAgICAgIDB4MUY2QUMsIC8vIFNNT0tJTkcgU1lNQk9MCi0gICAgICAgIDB4MUY2QUQsIC8vIE5PIFNNT0tJTkcgU1lNQk9MCi0gICAgICAgIDB4MUY2QUUsIC8vIFBVVCBMSVRURVIgSU4gSVRTIFBMQUNFIFNZTUJPTAotICAgICAgICAweDFGNkFGLCAvLyBETyBOT1QgTElUVEVSIFNZTUJPTAotICAgICAgICAweDFGNkIwLCAvLyBQT1RBQkxFIFdBVEVSIFNZTUJPTAotICAgICAgICAweDFGNkIxLCAvLyBOT04tUE9UQUJMRSBXQVRFUiBTWU1CT0wKLSAgICAgICAgMHgxRjZCMiwgLy8gQklDWUNMRQotICAgICAgICAweDFGNkIzLCAvLyBOTyBCSUNZQ0xFUwotICAgICAgICAweDFGNkI0LCAvLyBCSUNZQ0xJU1QKLSAgICAgICAgMHgxRjZCNSwgLy8gTU9VTlRBSU4gQklDWUNMSVNUCi0gICAgICAgIDB4MUY2QjYsIC8vIFBFREVTVFJJQU4KLSAgICAgICAgMHgxRjZCNywgLy8gTk8gUEVERVNUUklBTlMKLSAgICAgICAgMHgxRjZCOCwgLy8gQ0hJTERSRU4gQ1JPU1NJTkcKLSAgICAgICAgMHgxRjZCOSwgLy8gTUVOUyBTWU1CT0wKLSAgICAgICAgMHgxRjZCQSwgLy8gV09NRU5TIFNZTUJPTAotICAgICAgICAweDFGNkJCLCAvLyBSRVNUUk9PTQotICAgICAgICAweDFGNkJDLCAvLyBCQUJZIFNZTUJPTAotICAgICAgICAweDFGNkJELCAvLyBUT0lMRVQKLSAgICAgICAgMHgxRjZCRSwgLy8gV0FURVIgQ0xPU0VUCi0gICAgICAgIDB4MUY2QkYsIC8vIFNIT1dFUgotICAgICAgICAweDFGNkMwLCAvLyBCQVRICi0gICAgICAgIDB4MUY2QzEsIC8vIEJBVEhUVUIKLSAgICAgICAgMHgxRjZDMiwgLy8gUEFTU1BPUlQgQ09OVFJPTAotICAgICAgICAweDFGNkMzLCAvLyBDVVNUT01TCi0gICAgICAgIDB4MUY2QzQsIC8vIEJBR0dBR0UgQ0xBSU0KLSAgICAgICAgMHgxRjZDNSwgLy8gTEVGVCBMVUdHQUdFCi0gICAgICAgIDB4MUY2Q0IsIC8vIENPVUNIIEFORCBMQU1QCi0gICAgICAgIDB4MUY2Q0MsIC8vIFNMRUVQSU5HIEFDQ09NTU9EQVRJT04KLSAgICAgICAgMHgxRjZDRCwgLy8gU0hPUFBJTkcgQkFHUwotICAgICAgICAweDFGNkNFLCAvLyBCRUxMSE9QIEJFTEwKLSAgICAgICAgMHgxRjZDRiwgLy8gQkVECi0gICAgICAgIDB4MUY2RDAsIC8vIFBMQUNFIE9GIFdPUlNISVAKLSAgICAgICAgMHgxRjZEMSwgLy8gT0NUQUdPTkFMIFNJR04KLSAgICAgICAgMHgxRjZEMiwgLy8gU0hPUFBJTkcgVFJPTExFWQotICAgICAgICAweDFGNkUwLCAvLyBIQU1NRVIgQU5EIFdSRU5DSAotICAgICAgICAweDFGNkUxLCAvLyBTSElFTEQKLSAgICAgICAgMHgxRjZFMiwgLy8gT0lMIERSVU0KLSAgICAgICAgMHgxRjZFMywgLy8gTU9UT1JXQVkKLSAgICAgICAgMHgxRjZFNCwgLy8gUkFJTFdBWSBUUkFDSwotICAgICAgICAweDFGNkU1LCAvLyBNT1RPUiBCT0FUCi0gICAgICAgIDB4MUY2RTksIC8vIFNNQUxMIEFJUlBMQU5FCi0gICAgICAgIDB4MUY2RUIsIC8vIEFJUlBMQU5FIERFUEFSVFVSRQotICAgICAgICAweDFGNkVDLCAvLyBBSVJQTEFORSBBUlJJVklORwotICAgICAgICAweDFGNkYwLCAvLyBTQVRFTExJVEUKLSAgICAgICAgMHgxRjZGMywgLy8gUEFTU0VOR0VSIFNISVAKLSAgICAgICAgMHgxRjZGNCwgLy8gU0NPT1RFUgotICAgICAgICAweDFGNkY1LCAvLyBNT1RPUiBTQ09PVEVSCi0gICAgICAgIDB4MUY2RjYsIC8vIENBTk9FCi0gICAgICAgIDB4MUY2RjcsIC8vIFNMRUQKLSAgICAgICAgMHgxRjZGOCwgLy8gRkxZSU5HIFNBVUNFUgotICAgICAgICAweDFGOTEwLCAvLyBaSVBQRVItTU9VVEggRkFDRQotICAgICAgICAweDFGOTExLCAvLyBNT05FWS1NT1VUSCBGQUNFCi0gICAgICAgIDB4MUY5MTIsIC8vIEZBQ0UgV0lUSCBUSEVSTU9NRVRFUgotICAgICAgICAweDFGOTEzLCAvLyBORVJEIEZBQ0UKLSAgICAgICAgMHgxRjkxNCwgLy8gVEhJTktJTkcgRkFDRQotICAgICAgICAweDFGOTE1LCAvLyBGQUNFIFdJVEggSEVBRC1CQU5EQUdFCi0gICAgICAgIDB4MUY5MTYsIC8vIFJPQk9UIEZBQ0UKLSAgICAgICAgMHgxRjkxNywgLy8gSFVHR0lORyBGQUNFCi0gICAgICAgIDB4MUY5MTgsIC8vIFNJR04gT0YgVEhFIEhPUk5TCi0gICAgICAgIDB4MUY5MTksIC8vIENBTEwgTUUgSEFORAotICAgICAgICAweDFGOTFBLCAvLyBSQUlTRUQgQkFDSyBPRiBIQU5ECi0gICAgICAgIDB4MUY5MUIsIC8vIExFRlQtRkFDSU5HIEZJU1QKLSAgICAgICAgMHgxRjkxQywgLy8gUklHSFQtRkFDSU5HIEZJU1QKLSAgICAgICAgMHgxRjkxRCwgLy8gSEFORFNIQUtFCi0gICAgICAgIDB4MUY5MUUsIC8vIEhBTkQgV0lUSCBJTkRFWCBBTkQgTUlERExFIEZJTkdFUlMgQ1JPU1NFRAotICAgICAgICAweDFGOTFGLCAvLyBMT1ZFLVlPVSBHRVNUVVJFCi0gICAgICAgIDB4MUY5MjAsIC8vIEZBQ0UgV0lUSCBDT1dCT1kgSEFUCi0gICAgICAgIDB4MUY5MjEsIC8vIENMT1dOIEZBQ0UKLSAgICAgICAgMHgxRjkyMiwgLy8gTkFVU0VBVEVEIEZBQ0UKLSAgICAgICAgMHgxRjkyMywgLy8gUk9MTElORyBPTiBUSEUgRkxPT1IgTEFVR0hJTkcKLSAgICAgICAgMHgxRjkyNCwgLy8gRFJPT0xJTkcgRkFDRQotICAgICAgICAweDFGOTI1LCAvLyBMWUlORyBGQUNFCi0gICAgICAgIDB4MUY5MjYsIC8vIEZBQ0UgUEFMTQotICAgICAgICAweDFGOTI3LCAvLyBTTkVFWklORyBGQUNFCi0gICAgICAgIDB4MUY5MjgsIC8vIEZBQ0UgV0lUSCBSQUlTRUQgRVlFQlJPVwotICAgICAgICAweDFGOTI5LCAvLyBTVEFSLVNUUlVDSwotICAgICAgICAweDFGOTJBLCAvLyBDUkFaWSBGQUNFCi0gICAgICAgIDB4MUY5MkIsIC8vIFNIVVNISU5HIEZBQ0UKLSAgICAgICAgMHgxRjkyQywgLy8gRkFDRSBXSVRIIFNZTUJPTFMgT1ZFUiBNT1VUSAotICAgICAgICAweDFGOTJELCAvLyBGQUNFIFdJVEggSEFORCBPVkVSIE1PVVRICi0gICAgICAgIDB4MUY5MkUsIC8vIEZBQ0UgVk9NSVRJTkcKLSAgICAgICAgMHgxRjkyRiwgLy8gRVhQTE9ESU5HIEhFQUQKLSAgICAgICAgMHgxRjkzMCwgLy8gUFJFR05BTlQgV09NQU4KLSAgICAgICAgMHgxRjkzMSwgLy8gQlJFQVNULUZFRURJTkcKLSAgICAgICAgMHgxRjkzMiwgLy8gUEFMTVMgVVAgVE9HRVRIRVIKLSAgICAgICAgMHgxRjkzMywgLy8gU0VMRklFCi0gICAgICAgIDB4MUY5MzQsIC8vIFBSSU5DRQotICAgICAgICAweDFGOTM1LCAvLyBNQU4gSU4gVFVYRURPCi0gICAgICAgIDB4MUY5MzYsIC8vIE1PVEhFUiBDSFJJU1RNQVMKLSAgICAgICAgMHgxRjkzNywgLy8gU0hSVUcKLSAgICAgICAgMHgxRjkzOCwgLy8gUEVSU09OIERPSU5HIENBUlRXSEVFTAotICAgICAgICAweDFGOTM5LCAvLyBKVUdHTElORwotICAgICAgICAweDFGOTNBLCAvLyBGRU5DRVIKLSAgICAgICAgMHgxRjkzQywgLy8gV1JFU1RMRVJTCi0gICAgICAgIDB4MUY5M0QsIC8vIFdBVEVSIFBPTE8KLSAgICAgICAgMHgxRjkzRSwgLy8gSEFOREJBTEwKLSAgICAgICAgMHgxRjk0MCwgLy8gV0lMVEVEIEZMT1dFUgotICAgICAgICAweDFGOTQxLCAvLyBEUlVNIFdJVEggRFJVTVNUSUNLUwotICAgICAgICAweDFGOTQyLCAvLyBDTElOS0lORyBHTEFTU0VTCi0gICAgICAgIDB4MUY5NDMsIC8vIFRVTUJMRVIgR0xBU1MKLSAgICAgICAgMHgxRjk0NCwgLy8gU1BPT04KLSAgICAgICAgMHgxRjk0NSwgLy8gR09BTCBORVQKLSAgICAgICAgMHgxRjk0NywgLy8gRklSU1QgUExBQ0UgTUVEQUwKLSAgICAgICAgMHgxRjk0OCwgLy8gU0VDT05EIFBMQUNFIE1FREFMCi0gICAgICAgIDB4MUY5NDksIC8vIFRISVJEIFBMQUNFIE1FREFMCi0gICAgICAgIDB4MUY5NEEsIC8vIEJPWElORyBHTE9WRQotICAgICAgICAweDFGOTRCLCAvLyBNQVJUSUFMIEFSVFMgVU5JRk9STQotICAgICAgICAweDFGOTRDLCAvLyBDVVJMSU5HIFNUT05FCi0gICAgICAgIDB4MUY5NTAsIC8vIENST0lTU0FOVAotICAgICAgICAweDFGOTUxLCAvLyBBVk9DQURPCi0gICAgICAgIDB4MUY5NTIsIC8vIENVQ1VNQkVSCi0gICAgICAgIDB4MUY5NTMsIC8vIEJBQ09OCi0gICAgICAgIDB4MUY5NTQsIC8vIFBPVEFUTwotICAgICAgICAweDFGOTU1LCAvLyBDQVJST1QKLSAgICAgICAgMHgxRjk1NiwgLy8gQkFHVUVUVEUgQlJFQUQKLSAgICAgICAgMHgxRjk1NywgLy8gR1JFRU4gU0FMQUQKLSAgICAgICAgMHgxRjk1OCwgLy8gU0hBTExPVyBQQU4gT0YgRk9PRAotICAgICAgICAweDFGOTU5LCAvLyBTVFVGRkVEIEZMQVRCUkVBRAotICAgICAgICAweDFGOTVBLCAvLyBFR0cKLSAgICAgICAgMHgxRjk1QiwgLy8gR0xBU1MgT0YgTUlMSwotICAgICAgICAweDFGOTVDLCAvLyBQRUFOVVRTCi0gICAgICAgIDB4MUY5NUQsIC8vIEtJV0lGUlVJVAotICAgICAgICAweDFGOTVFLCAvLyBQQU5DQUtFUwotICAgICAgICAweDFGOTVGLCAvLyBEVU1QTElORwotICAgICAgICAweDFGOTYwLCAvLyBGT1JUVU5FIENPT0tJRQotICAgICAgICAweDFGOTYxLCAvLyBUQUtFT1VUIEJPWAotICAgICAgICAweDFGOTYyLCAvLyBDSE9QU1RJQ0tTCi0gICAgICAgIDB4MUY5NjMsIC8vIEJPV0wgV0lUSCBTUE9PTgotICAgICAgICAweDFGOTY0LCAvLyBDVVAgV0lUSCBTVFJBVwotICAgICAgICAweDFGOTY1LCAvLyBDT0NPTlVUCi0gICAgICAgIDB4MUY5NjYsIC8vIEJST0NDT0xJCi0gICAgICAgIDB4MUY5NjcsIC8vIFBJRQotICAgICAgICAweDFGOTY4LCAvLyBQUkVUWkVMCi0gICAgICAgIDB4MUY5NjksIC8vIENVVCBPRiBNRUFUCi0gICAgICAgIDB4MUY5NkEsIC8vIFNBTkRXSUNICi0gICAgICAgIDB4MUY5NkIsIC8vIENBTk5FRCBGT09ECi0gICAgICAgIDB4MUY5ODAsIC8vIENSQUIKLSAgICAgICAgMHgxRjk4MSwgLy8gTElPTiBGQUNFCi0gICAgICAgIDB4MUY5ODIsIC8vIFNDT1JQSU9OCi0gICAgICAgIDB4MUY5ODMsIC8vIFRVUktFWQotICAgICAgICAweDFGOTg0LCAvLyBVTklDT1JOIEZBQ0UKLSAgICAgICAgMHgxRjk4NSwgLy8gRUFHTEUKLSAgICAgICAgMHgxRjk4NiwgLy8gRFVDSwotICAgICAgICAweDFGOTg3LCAvLyBCQVQKLSAgICAgICAgMHgxRjk4OCwgLy8gU0hBUksKLSAgICAgICAgMHgxRjk4OSwgLy8gT1dMCi0gICAgICAgIDB4MUY5OEEsIC8vIEZPWCBGQUNFCi0gICAgICAgIDB4MUY5OEIsIC8vIEJVVFRFUkZMWQotICAgICAgICAweDFGOThDLCAvLyBERUVSCi0gICAgICAgIDB4MUY5OEQsIC8vIEdPUklMTEEKLSAgICAgICAgMHgxRjk4RSwgLy8gTElaQVJECi0gICAgICAgIDB4MUY5OEYsIC8vIFJISU5PQ0VST1MKLSAgICAgICAgMHgxRjk5MCwgLy8gU0hSSU1QCi0gICAgICAgIDB4MUY5OTEsIC8vIFNRVUlECi0gICAgICAgIDB4MUY5OTIsIC8vIEdJUkFGRkUKLSAgICAgICAgMHgxRjk5MywgLy8gWkVCUkEKLSAgICAgICAgMHgxRjk5NCwgLy8gSEVER0VIT0cKLSAgICAgICAgMHgxRjk5NSwgLy8gU0FVUk9QT0QKLSAgICAgICAgMHgxRjk5NiwgLy8gVC1SRVgKLSAgICAgICAgMHgxRjk5NywgLy8gQ1JJQ0tFVAotICAgICAgICAweDFGOUMwLCAvLyBDSEVFU0UgV0VER0UKLSAgICAgICAgMHgxRjlEMCwgLy8gRkFDRSBXSVRIIE1PTk9DTEUKLSAgICAgICAgMHgxRjlEMSwgLy8gQURVTFQKLSAgICAgICAgMHgxRjlEMiwgLy8gQ0hJTEQKLSAgICAgICAgMHgxRjlEMywgLy8gT0xERVIgQURVTFQKLSAgICAgICAgMHgxRjlENCwgLy8gQkVBUkRFRCBQRVJTT04KLSAgICAgICAgMHgxRjlENSwgLy8gV09NQU4gV0lUSCBIRUFEU0NBUkYKLSAgICAgICAgMHgxRjlENiwgLy8gUEVSU09OIElOIFNURUFNWSBST09NCi0gICAgICAgIDB4MUY5RDcsIC8vIFBFUlNPTiBDTElNQklORwotICAgICAgICAweDFGOUQ4LCAvLyBQRVJTT04gSU4gTE9UVVMgUE9TSVRJT04KLSAgICAgICAgMHgxRjlEOSwgLy8gTUFHRQotICAgICAgICAweDFGOURBLCAvLyBGQUlSWQotICAgICAgICAweDFGOURCLCAvLyBWQU1QSVJFCi0gICAgICAgIDB4MUY5REMsIC8vIE1FUlBFUlNPTgotICAgICAgICAweDFGOURELCAvLyBFTEYKLSAgICAgICAgMHgxRjlERSwgLy8gR0VOSUUKLSAgICAgICAgMHgxRjlERiwgLy8gWk9NQklFCi0gICAgICAgIDB4MUY5RTAsIC8vIEJSQUlOCi0gICAgICAgIDB4MUY5RTEsIC8vIE9SQU5HRSBIRUFSVAotICAgICAgICAweDFGOUUyLCAvLyBCSUxMRUQgQ0FQCi0gICAgICAgIDB4MUY5RTMsIC8vIFNDQVJGCi0gICAgICAgIDB4MUY5RTQsIC8vIEdMT1ZFUwotICAgICAgICAweDFGOUU1LCAvLyBDT0FUCi0gICAgICAgIDB4MUY5RTYsIC8vIFNPQ0tTCi0gICAgfTsKLQogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEVtb2ppQ292ZXJhZ2UoKSB7CiAgICAgICAgIGZpbmFsIFBhaW50IHBhaW50ID0gbmV3IFBhaW50KCk7Ci0gICAgICAgIGZvciAoaW50IGNwIDogQUxMX0VNT0pJKSB7CisKKyAgICAgICAgZm9yIChpbnQgY3AgOiBFbW9qaUNvbnN0YW50cy5BTExfRU1PSkkpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjaGFyYWN0ZXJBc1N0cmluZyA9IG5ldyBTdHJpbmcoQ2hhcmFjdGVyLnRvQ2hhcnMoY3ApKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiTm8gZ2x5cGggZm9yIFUrJTA0WCIsIGNwKSwgcGFpbnQuaGFzR2x5cGgoY2hhcmFjdGVyQXNTdHJpbmcpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGNwIDogRW1vamlDb25zdGFudHMuTkVXX0VNT0pJKSB7CiAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2hhcmFjdGVyQXNTdHJpbmcgPSBuZXcgU3RyaW5nKENoYXJhY3Rlci50b0NoYXJzKGNwKSk7CiAgICAgICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoIk5vIGdseXBoIGZvciBVKyUwNFgiLCBjcCksIHBhaW50Lmhhc0dseXBoKGNoYXJhY3RlckFzU3RyaW5nKSk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9jdHMvR2V0Q2hhcnNUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvY3RzL0dldENoYXJzVGVzdC5qYXZhCmluZGV4IDhmYWY2MzguLjQ0MGI0NmIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9jdHMvR2V0Q2hhcnNUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2N0cy9HZXRDaGFyc1Rlc3QuamF2YQpAQCAtMTksMTMgKzE5LDE0IEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnRleHQuR2V0Q2hhcnM7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZVN0cmluZzsKIGltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcjsKIGltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5lZFN0cmluZzsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2N0cy9IdG1sVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2N0cy9IdG1sVGVzdC5qYXZhCmluZGV4IDg4MGRhNmUuLjdmNzg1YTggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9jdHMvSHRtbFRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvY3RzL0h0bWxUZXN0LmphdmEKQEAgLTIyLDggKzIyLDYgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlR5cGVmYWNlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5IdG1sOwogaW1wb3J0IGFuZHJvaWQudGV4dC5MYXlvdXQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZTsKQEAgLTQyLDYgKzQwLDkgQEAKIGltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuVVJMU3BhbjsKIGltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuVW5kZXJsaW5lU3BhbjsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5oYW1jcmVzdC5CYXNlTWF0Y2hlcjsKIGltcG9ydCBvcmcuaGFtY3Jlc3QuRGVzY3JpcHRpb247CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvY3RzL0lucHV0RmlsdGVyX0FsbENhcHNUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvY3RzL0lucHV0RmlsdGVyX0FsbENhcHNUZXN0LmphdmEKaW5kZXggOGIzNTFiNS4uNDJlMGQ4OSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2N0cy9JbnB1dEZpbHRlcl9BbGxDYXBzVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9jdHMvSW5wdXRGaWx0ZXJfQWxsQ2Fwc1Rlc3QuamF2YQpAQCAtMjEsOCArMjEsNiBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFNhbWU7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5JbnB1dEZpbHRlcjsKIGltcG9ydCBhbmRyb2lkLnRleHQuSW5wdXRGaWx0ZXIuQWxsQ2FwczsKIGltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nOwpAQCAtMzAsNiArMjgsOSBAQAogaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmVkOwogaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmVkU3RyaW5nOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvY3RzL0lucHV0RmlsdGVyX0xlbmd0aEZpbHRlclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9jdHMvSW5wdXRGaWx0ZXJfTGVuZ3RoRmlsdGVyVGVzdC5qYXZhCmluZGV4IDcyMmFkMTkuLjQ1ZTc2NDMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9jdHMvSW5wdXRGaWx0ZXJfTGVuZ3RoRmlsdGVyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9jdHMvSW5wdXRGaWx0ZXJfTGVuZ3RoRmlsdGVyVGVzdC5qYXZhCkBAIC0xOCwxMiArMTgsMTMgQEAKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIAotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5JbnB1dEZpbHRlcjsKIGltcG9ydCBhbmRyb2lkLnRleHQuSW5wdXRGaWx0ZXIuTGVuZ3RoRmlsdGVyOwogaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmdCdWlsZGVyOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvY3RzL0xheW91dFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9jdHMvTGF5b3V0VGVzdC5qYXZhCmluZGV4IGQ2Y2Q4OWMuLjcxOWVlMDAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9jdHMvTGF5b3V0VGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9jdHMvTGF5b3V0VGVzdC5qYXZhCkBAIC0xOSwxMSArMTksMTIgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5MYXlvdXQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRQYWludDsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2N0cy9Mb2dpbkZpbHRlclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9jdHMvTG9naW5GaWx0ZXJUZXN0LmphdmEKaW5kZXggODU1ODIzYS4uMDU4YzM1MCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2N0cy9Mb2dpbkZpbHRlclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvY3RzL0xvZ2luRmlsdGVyVGVzdC5qYXZhCkBAIC0yNywxNCArMjcsMTUgQEAKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by50aW1lczsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by52ZXJpZnk7CiAKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnRleHQuTG9naW5GaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LkxvZ2luRmlsdGVyLlVzZXJuYW1lRmlsdGVyR2VuZXJpYzsKIGltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nOwogaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmVkOwogaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmVkU3RyaW5nOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvY3RzL0xvZ2luRmlsdGVyX1Bhc3N3b3JkRmlsdGVyR01haWxUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvY3RzL0xvZ2luRmlsdGVyX1Bhc3N3b3JkRmlsdGVyR01haWxUZXN0LmphdmEKaW5kZXggMWYwMjQ4MS4uZmE4ZDBkZSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2N0cy9Mb2dpbkZpbHRlcl9QYXNzd29yZEZpbHRlckdNYWlsVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9jdHMvTG9naW5GaWx0ZXJfUGFzc3dvcmRGaWx0ZXJHTWFpbFRlc3QuamF2YQpAQCAtMTksMTAgKzE5LDExIEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5Mb2dpbkZpbHRlci5QYXNzd29yZEZpbHRlckdNYWlsOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvY3RzL0xvZ2luRmlsdGVyX1VzZXJuYW1lRmlsdGVyR01haWxUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvY3RzL0xvZ2luRmlsdGVyX1VzZXJuYW1lRmlsdGVyR01haWxUZXN0LmphdmEKaW5kZXggZmQxOTZiOC4uZTZlZThjZiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2N0cy9Mb2dpbkZpbHRlcl9Vc2VybmFtZUZpbHRlckdNYWlsVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9jdHMvTG9naW5GaWx0ZXJfVXNlcm5hbWVGaWx0ZXJHTWFpbFRlc3QuamF2YQpAQCAtMTksMTAgKzE5LDExIEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5Mb2dpbkZpbHRlci5Vc2VybmFtZUZpbHRlckdNYWlsOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvY3RzL0xvZ2luRmlsdGVyX1VzZXJuYW1lRmlsdGVyR2VuZXJpY1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9jdHMvTG9naW5GaWx0ZXJfVXNlcm5hbWVGaWx0ZXJHZW5lcmljVGVzdC5qYXZhCmluZGV4IDY4Y2M4NDAuLjViY2NhOGQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9jdHMvTG9naW5GaWx0ZXJfVXNlcm5hbWVGaWx0ZXJHZW5lcmljVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9jdHMvTG9naW5GaWx0ZXJfVXNlcm5hbWVGaWx0ZXJHZW5lcmljVGVzdC5qYXZhCkBAIC0xOSwxMCArMTksMTEgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCi1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LkxvZ2luRmlsdGVyLlVzZXJuYW1lRmlsdGVyR2VuZXJpYzsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2N0cy9NeWFubWFyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2N0cy9NeWFubWFyVGVzdC5qYXZhCmluZGV4IDkxNmI0NTEuLjgxMDYwYWYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9jdHMvTXlhbm1hclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvY3RzL015YW5tYXJUZXN0LmphdmEKQEAgLTIxLDEzICsyMSwxNCBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvY3RzL1ByZWNvbXB1dGVkVGV4dFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9jdHMvUHJlY29tcHV0ZWRUZXh0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1N2IzOTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvY3RzL1ByZWNvbXB1dGVkVGV4dFRlc3QuamF2YQpAQCAtMCwwICsxLDYyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC50ZXh0LmN0czsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnRleHQuVGV4dERpcmVjdGlvbkhldXJpc3RpY3MuTFRSOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnRleHQuVGV4dERpcmVjdGlvbkhldXJpc3RpY3MuUlRMOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5UeXBlZmFjZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuTGF5b3V0OworaW1wb3J0IGFuZHJvaWQudGV4dC5QcmVjb21wdXRlZFRleHQ7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlByZWNvbXB1dGVkVGV4dC5QYXJhbXM7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5lZDsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dERpcmVjdGlvbkhldXJpc3RpY3M7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRQYWludDsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuQmFja2dyb3VuZENvbG9yU3BhbjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuTG9jYWxlU3BhbjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuVGV4dEFwcGVhcmFuY2VTcGFuOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworCitAU21hbGxUZXN0CitAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIFByZWNvbXB1dGVkVGV4dFRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2hhclNlcXVlbmNlIE5VTExfQ0hBUl9TRVFVRU5DRSA9IG51bGw7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUklORyA9ICJIZWxsbywgV29ybGQhIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVVMVElQQVJBX1NUUklORyA9ICJIZWxsbyxcbldvcmxkISI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1BBTl9TVEFSVCA9IDM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNQQU5fRU5EID0gNzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGVTcGFuIFNQQU4gPSBuZXcgTG9jYWxlU3BhbihMb2NhbGUuVVMpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNwYW5uZWQgU1BBTk5FRDsKKyAgICBzdGF0aWMgeworICAgICAgICBmaW5hbCBTcGFubmFibGVTdHJpbmdCdWlsZGVyIHNzYiA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKFNUUklORyk7CisgICAgICAgIHNzYi5zZXRTcGFuKFNQQU4sIFNQQU5fU1RBUlQsIFNQQU5fRU5ELCBTcGFubmVkLlNQQU5fSU5DTFVTSVZFX0VYQ0xVU0lWRSk7CisgICAgICAgIFNQQU5ORUQgPSBzc2I7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGV4dFBhaW50IFBBSU5UID0gbmV3IFRleHRQYWludCgpOworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyYW1zX2NyZWF0ZSgpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChuZXcgUGFyYW1zLkJ1aWxkZXIoUEFJTlQpLmJ1aWxkKCkpOworICAgICAgICBhc3NlcnROb3ROdWxsKG5ldyBQYXJhbXMuQnVpbGRlcihQQUlOVCkKKyAgICAgICAgICAgICAgICAuc2V0QnJlYWtTdHJhdGVneShMYXlvdXQuQlJFQUtfU1RSQVRFR1lfU0lNUExFKS5idWlsZCgpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChuZXcgUGFyYW1zLkJ1aWxkZXIoUEFJTlQpCisgICAgICAgICAgICAgICAgLnNldEJyZWFrU3RyYXRlZ3koTGF5b3V0LkJSRUFLX1NUUkFURUdZX1NJTVBMRSkKKyAgICAgICAgICAgICAgICAuc2V0SHlwaGVuYXRpb25GcmVxdWVuY3koTGF5b3V0LkhZUEhFTkFUSU9OX0ZSRVFVRU5DWV9OT1JNQUwpLmJ1aWxkKCkpOworICAgICAgICBhc3NlcnROb3ROdWxsKG5ldyBQYXJhbXMuQnVpbGRlcihQQUlOVCkKKyAgICAgICAgICAgICAgICAuc2V0QnJlYWtTdHJhdGVneShMYXlvdXQuQlJFQUtfU1RSQVRFR1lfU0lNUExFKQorICAgICAgICAgICAgICAgIC5zZXRIeXBoZW5hdGlvbkZyZXF1ZW5jeShMYXlvdXQuSFlQSEVOQVRJT05fRlJFUVVFTkNZX05PUk1BTCkKKyAgICAgICAgICAgICAgICAuc2V0VGV4dERpcmVjdGlvbihMVFIpLmJ1aWxkKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBhcmFtc19TZXRHZXQoKSB7CisgICAgICAgIGFzc2VydEVxdWFscyhMYXlvdXQuQlJFQUtfU1RSQVRFR1lfU0lNUExFLCBuZXcgUGFyYW1zLkJ1aWxkZXIoUEFJTlQpCisgICAgICAgICAgICAgICAgLnNldEJyZWFrU3RyYXRlZ3koTGF5b3V0LkJSRUFLX1NUUkFURUdZX1NJTVBMRSkuYnVpbGQoKS5nZXRCcmVha1N0cmF0ZWd5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTGF5b3V0LkhZUEhFTkFUSU9OX0ZSRVFVRU5DWV9OT05FLCBuZXcgUGFyYW1zLkJ1aWxkZXIoUEFJTlQpCisgICAgICAgICAgICAgICAgLnNldEh5cGhlbmF0aW9uRnJlcXVlbmN5KExheW91dC5IWVBIRU5BVElPTl9GUkVRVUVOQ1lfTk9ORSkuYnVpbGQoKQorICAgICAgICAgICAgICAgICAgICAgICAgLmdldEh5cGhlbmF0aW9uRnJlcXVlbmN5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUlRMLCBuZXcgUGFyYW1zLkJ1aWxkZXIoUEFJTlQpLnNldFRleHREaXJlY3Rpb24oUlRMKS5idWlsZCgpCisgICAgICAgICAgICAgICAgLmdldFRleHREaXJlY3Rpb24oKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyYW1zX0dldERlZmF1bHRWYWx1ZXMoKSB7CisgICAgICAgIGFzc2VydEVxdWFscyhMYXlvdXQuQlJFQUtfU1RSQVRFR1lfSElHSF9RVUFMSVRZLAorICAgICAgICAgICAgICAgICAgICAgbmV3IFBhcmFtcy5CdWlsZGVyKFBBSU5UKS5idWlsZCgpLmdldEJyZWFrU3RyYXRlZ3koKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhMYXlvdXQuSFlQSEVOQVRJT05fRlJFUVVFTkNZX05PUk1BTCwKKyAgICAgICAgICAgICAgICAgICAgIG5ldyBQYXJhbXMuQnVpbGRlcihQQUlOVCkuYnVpbGQoKS5nZXRIeXBoZW5hdGlvbkZyZXF1ZW5jeSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFRleHREaXJlY3Rpb25IZXVyaXN0aWNzLkZJUlNUU1RST05HX0xUUiwKKyAgICAgICAgICAgICAgICAgICAgIG5ldyBQYXJhbXMuQnVpbGRlcihQQUlOVCkuYnVpbGQoKS5nZXRUZXh0RGlyZWN0aW9uKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBhcmFtc19lcXVhbHMoKSB7CisgICAgICAgIGZpbmFsIFBhcmFtcyBiYXNlID0gbmV3IFBhcmFtcy5CdWlsZGVyKFBBSU5UKQorICAgICAgICAgICAgICAgIC5zZXRCcmVha1N0cmF0ZWd5KExheW91dC5CUkVBS19TVFJBVEVHWV9ISUdIX1FVQUxJVFkpCisgICAgICAgICAgICAgICAgLnNldEh5cGhlbmF0aW9uRnJlcXVlbmN5KExheW91dC5IWVBIRU5BVElPTl9GUkVRVUVOQ1lfTk9STUFMKQorICAgICAgICAgICAgICAgIC5zZXRUZXh0RGlyZWN0aW9uKExUUikuYnVpbGQoKTsKKworICAgICAgICBhc3NlcnRGYWxzZShiYXNlLmVxdWFscyhudWxsKSk7CisgICAgICAgIGFzc2VydFRydWUoYmFzZS5lcXVhbHMoYmFzZSkpOworICAgICAgICBhc3NlcnRGYWxzZShiYXNlLmVxdWFscyhuZXcgT2JqZWN0KCkpKTsKKworICAgICAgICBQYXJhbXMgb3RoZXIgPSBuZXcgUGFyYW1zLkJ1aWxkZXIoUEFJTlQpCisgICAgICAgICAgICAgICAgLnNldEJyZWFrU3RyYXRlZ3koTGF5b3V0LkJSRUFLX1NUUkFURUdZX0hJR0hfUVVBTElUWSkKKyAgICAgICAgICAgICAgICAuc2V0SHlwaGVuYXRpb25GcmVxdWVuY3koTGF5b3V0LkhZUEhFTkFUSU9OX0ZSRVFVRU5DWV9OT1JNQUwpCisgICAgICAgICAgICAgICAgLnNldFRleHREaXJlY3Rpb24oTFRSKS5idWlsZCgpOworICAgICAgICBhc3NlcnRUcnVlKGJhc2UuZXF1YWxzKG90aGVyKSk7CisgICAgICAgIGFzc2VydFRydWUob3RoZXIuZXF1YWxzKGJhc2UpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGJhc2UuaGFzaENvZGUoKSwgb3RoZXIuaGFzaENvZGUoKSk7CisKKyAgICAgICAgb3RoZXIgPSBuZXcgUGFyYW1zLkJ1aWxkZXIoUEFJTlQpCisgICAgICAgICAgICAgICAgLnNldEJyZWFrU3RyYXRlZ3koTGF5b3V0LkJSRUFLX1NUUkFURUdZX1NJTVBMRSkKKyAgICAgICAgICAgICAgICAuc2V0SHlwaGVuYXRpb25GcmVxdWVuY3koTGF5b3V0LkhZUEhFTkFUSU9OX0ZSRVFVRU5DWV9OT1JNQUwpCisgICAgICAgICAgICAgICAgLnNldFRleHREaXJlY3Rpb24oTFRSKS5idWlsZCgpOworICAgICAgICBhc3NlcnRGYWxzZShiYXNlLmVxdWFscyhvdGhlcikpOworICAgICAgICBhc3NlcnRGYWxzZShvdGhlci5lcXVhbHMoYmFzZSkpOworCisgICAgICAgIG90aGVyID0gbmV3IFBhcmFtcy5CdWlsZGVyKFBBSU5UKQorICAgICAgICAgICAgICAgIC5zZXRCcmVha1N0cmF0ZWd5KExheW91dC5CUkVBS19TVFJBVEVHWV9ISUdIX1FVQUxJVFkpCisgICAgICAgICAgICAgICAgLnNldEh5cGhlbmF0aW9uRnJlcXVlbmN5KExheW91dC5IWVBIRU5BVElPTl9GUkVRVUVOQ1lfTk9ORSkKKyAgICAgICAgICAgICAgICAuc2V0VGV4dERpcmVjdGlvbihMVFIpLmJ1aWxkKCk7CisgICAgICAgIGFzc2VydEZhbHNlKGJhc2UuZXF1YWxzKG90aGVyKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG90aGVyLmVxdWFscyhiYXNlKSk7CisKKworICAgICAgICBvdGhlciA9IG5ldyBQYXJhbXMuQnVpbGRlcihQQUlOVCkKKyAgICAgICAgICAgICAgICAuc2V0QnJlYWtTdHJhdGVneShMYXlvdXQuQlJFQUtfU1RSQVRFR1lfSElHSF9RVUFMSVRZKQorICAgICAgICAgICAgICAgIC5zZXRIeXBoZW5hdGlvbkZyZXF1ZW5jeShMYXlvdXQuSFlQSEVOQVRJT05fRlJFUVVFTkNZX05PUk1BTCkKKyAgICAgICAgICAgICAgICAuc2V0VGV4dERpcmVjdGlvbihSVEwpLmJ1aWxkKCk7CisgICAgICAgIGFzc2VydEZhbHNlKGJhc2UuZXF1YWxzKG90aGVyKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG90aGVyLmVxdWFscyhiYXNlKSk7CisKKworICAgICAgICBUZXh0UGFpbnQgYW5vdGhlclBhaW50ID0gbmV3IFRleHRQYWludChQQUlOVCk7CisgICAgICAgIGFub3RoZXJQYWludC5zZXRUZXh0U2l6ZShQQUlOVC5nZXRUZXh0U2l6ZSgpICogMi4wZik7CisgICAgICAgIG90aGVyID0gbmV3IFBhcmFtcy5CdWlsZGVyKGFub3RoZXJQYWludCkKKyAgICAgICAgICAgICAgICAuc2V0QnJlYWtTdHJhdGVneShMYXlvdXQuQlJFQUtfU1RSQVRFR1lfSElHSF9RVUFMSVRZKQorICAgICAgICAgICAgICAgIC5zZXRIeXBoZW5hdGlvbkZyZXF1ZW5jeShMYXlvdXQuSFlQSEVOQVRJT05fRlJFUVVFTkNZX05PUk1BTCkKKyAgICAgICAgICAgICAgICAuc2V0VGV4dERpcmVjdGlvbihMVFIpLmJ1aWxkKCk7CisgICAgICAgIGFzc2VydEZhbHNlKGJhc2UuZXF1YWxzKG90aGVyKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG90aGVyLmVxdWFscyhiYXNlKSk7CisKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVfd2l0aE51bGwoKSB7CisgICAgICAgIGZpbmFsIFBhcmFtcyBwYXJhbSA9IG5ldyBQYXJhbXMuQnVpbGRlcihQQUlOVCkuYnVpbGQoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFByZWNvbXB1dGVkVGV4dC5jcmVhdGUoTlVMTF9DSEFSX1NFUVVFTkNFLCBwYXJhbSk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIHBhc3MKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgUHJlY29tcHV0ZWRUZXh0LmNyZWF0ZShTVFJJTkcsIG51bGwpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBwYXNzCisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDaGFyU2VxdWVuY2VJbnRlZmFjZSgpIHsKKyAgICAgICAgZmluYWwgUGFyYW1zIHBhcmFtID0gbmV3IFBhcmFtcy5CdWlsZGVyKFBBSU5UKS5idWlsZCgpOworICAgICAgICBmaW5hbCBDaGFyU2VxdWVuY2UgcyA9IFByZWNvbXB1dGVkVGV4dC5jcmVhdGUoU1RSSU5HLCBwYXJhbSk7CisgICAgICAgIGFzc2VydEVxdWFscyhTVFJJTkcubGVuZ3RoKCksIHMubGVuZ3RoKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoJ0gnLCBzLmNoYXJBdCgwKSk7CisgICAgICAgIGFzc2VydEVxdWFscygnZScsIHMuY2hhckF0KDEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCdsJywgcy5jaGFyQXQoMikpOworICAgICAgICBhc3NlcnRFcXVhbHMoJ2wnLCBzLmNoYXJBdCgzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygnbycsIHMuY2hhckF0KDQpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCcsJywgcy5jaGFyQXQoNSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkhlbGxvLCBXb3JsZCEiLCBzLnRvU3RyaW5nKCkpOworCisgICAgICAgIGZpbmFsIENoYXJTZXF1ZW5jZSBzMyA9IHMuc3ViU2VxdWVuY2UoMCwgMyk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBzMy5sZW5ndGgoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygnSCcsIHMzLmNoYXJBdCgwKSk7CisgICAgICAgIGFzc2VydEVxdWFscygnZScsIHMzLmNoYXJBdCgxKSk7CisgICAgICAgIGFzc2VydEVxdWFscygnbCcsIHMzLmNoYXJBdCgyKSk7CisKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTcGFubmVkSW50ZXJmYWNlX1NwYW5uZWQoKSB7CisgICAgICAgIGZpbmFsIFBhcmFtcyBwYXJhbSA9IG5ldyBQYXJhbXMuQnVpbGRlcihQQUlOVCkuYnVpbGQoKTsKKyAgICAgICAgZmluYWwgU3Bhbm5lZCBzID0gUHJlY29tcHV0ZWRUZXh0LmNyZWF0ZShTUEFOTkVELCBwYXJhbSk7CisgICAgICAgIGZpbmFsIExvY2FsZVNwYW5bXSBzcGFucyA9IHMuZ2V0U3BhbnMoMCwgcy5sZW5ndGgoKSwgTG9jYWxlU3Bhbi5jbGFzcyk7CisgICAgICAgIGFzc2VydE5vdE51bGwoc3BhbnMpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc3BhbnMubGVuZ3RoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNQQU4sIHNwYW5zWzBdKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoU1BBTl9TVEFSVCwgcy5nZXRTcGFuU3RhcnQoU1BBTikpOworICAgICAgICBhc3NlcnRFcXVhbHMoU1BBTl9FTkQsIHMuZ2V0U3BhbkVuZChTUEFOKSk7CisgICAgICAgIGFzc2VydFRydWUoKHMuZ2V0U3BhbkZsYWdzKFNQQU4pICYgU3Bhbm5lZC5TUEFOX0lOQ0xVU0lWRV9FWENMVVNJVkUpICE9IDApOworCisgICAgICAgIGFzc2VydEVxdWFscyhTUEFOX1NUQVJULCBzLm5leHRTcGFuVHJhbnNpdGlvbigwLCBzLmxlbmd0aCgpLCBMb2NhbGVTcGFuLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhTUEFOX0VORCwgcy5uZXh0U3BhblRyYW5zaXRpb24oU1BBTl9TVEFSVCwgcy5sZW5ndGgoKSwgTG9jYWxlU3Bhbi5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNwYW5uZWRJbnRlcmZhY2VfU3Bhbm5hYmxlKCkgeworICAgICAgICBmaW5hbCBCYWNrZ3JvdW5kQ29sb3JTcGFuIHNwYW4gPSBuZXcgQmFja2dyb3VuZENvbG9yU3BhbihDb2xvci5SRUQpOworICAgICAgICBmaW5hbCBQYXJhbXMgcGFyYW0gPSBuZXcgUGFyYW1zLkJ1aWxkZXIoUEFJTlQpLmJ1aWxkKCk7CisgICAgICAgIGZpbmFsIFNwYW5uYWJsZSBzID0gUHJlY29tcHV0ZWRUZXh0LmNyZWF0ZShTVFJJTkcsIHBhcmFtKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHMuZ2V0U3BhbnMoMCwgcy5sZW5ndGgoKSwgQmFja2dyb3VuZENvbG9yU3Bhbi5jbGFzcykubGVuZ3RoKTsKKworICAgICAgICBzLnNldFNwYW4oc3BhbiwgU1BBTl9TVEFSVCwgU1BBTl9FTkQsIFNwYW5uZWQuU1BBTl9JTkNMVVNJVkVfRVhDTFVTSVZFKTsKKworICAgICAgICBmaW5hbCBCYWNrZ3JvdW5kQ29sb3JTcGFuW10gc3BhbnMgPSBzLmdldFNwYW5zKDAsIHMubGVuZ3RoKCksIEJhY2tncm91bmRDb2xvclNwYW4uY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoU1BBTl9TVEFSVCwgcy5nZXRTcGFuU3RhcnQoc3BhbikpOworICAgICAgICBhc3NlcnRFcXVhbHMoU1BBTl9FTkQsIHMuZ2V0U3BhbkVuZChzcGFuKSk7CisgICAgICAgIGFzc2VydFRydWUoKHMuZ2V0U3BhbkZsYWdzKHNwYW4pICYgU3Bhbm5lZC5TUEFOX0lOQ0xVU0lWRV9FWENMVVNJVkUpICE9IDApOworCisgICAgICAgIGFzc2VydEVxdWFscyhTUEFOX1NUQVJULCBzLm5leHRTcGFuVHJhbnNpdGlvbigwLCBzLmxlbmd0aCgpLCBCYWNrZ3JvdW5kQ29sb3JTcGFuLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhTUEFOX0VORCwKKyAgICAgICAgICAgICAgICBzLm5leHRTcGFuVHJhbnNpdGlvbihTUEFOX1NUQVJULCBzLmxlbmd0aCgpLCBCYWNrZ3JvdW5kQ29sb3JTcGFuLmNsYXNzKSk7CisKKyAgICAgICAgcy5yZW1vdmVTcGFuKHNwYW4pOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcy5nZXRTcGFucygwLCBzLmxlbmd0aCgpLCBCYWNrZ3JvdW5kQ29sb3JTcGFuLmNsYXNzKS5sZW5ndGgpOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RTcGFubmVkSW50ZXJmYWNlX1NwYW5uYWJsZV9zZXRTcGFuX01ldHJpY3NBZmZlY3RpbmdTcGFuKCkgeworICAgICAgICBmaW5hbCBQYXJhbXMgcGFyYW0gPSBuZXcgUGFyYW1zLkJ1aWxkZXIoUEFJTlQpLmJ1aWxkKCk7CisgICAgICAgIGZpbmFsIFNwYW5uYWJsZSBzID0gUHJlY29tcHV0ZWRUZXh0LmNyZWF0ZShTUEFOTkVELCBwYXJhbSk7CisgICAgICAgIHMuc2V0U3BhbihTUEFOLCBTUEFOX1NUQVJULCBTUEFOX0VORCwgU3Bhbm5lZC5TUEFOX0lOQ0xVU0lWRV9FWENMVVNJVkUpOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RTcGFubmVkSW50ZXJmYWNlX1NwYW5uYWJsZV9yZW1vdmVTcGFuX01ldHJpY3NBZmZlY3RpbmdTcGFuKCkgeworICAgICAgICBmaW5hbCBQYXJhbXMgcGFyYW0gPSBuZXcgUGFyYW1zLkJ1aWxkZXIoUEFJTlQpLmJ1aWxkKCk7CisgICAgICAgIGZpbmFsIFNwYW5uYWJsZSBzID0gUHJlY29tcHV0ZWRUZXh0LmNyZWF0ZShTUEFOTkVELCBwYXJhbSk7CisgICAgICAgIHMucmVtb3ZlU3BhbihTUEFOKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTcGFubmVkSW50ZXJmYWNlX1N0cmluZygpIHsKKyAgICAgICAgZmluYWwgUGFyYW1zIHBhcmFtID0gbmV3IFBhcmFtcy5CdWlsZGVyKFBBSU5UKS5idWlsZCgpOworICAgICAgICBmaW5hbCBTcGFubmVkIHMgPSBQcmVjb21wdXRlZFRleHQuY3JlYXRlKFNUUklORywgcGFyYW0pOworICAgICAgICBMb2NhbGVTcGFuW10gc3BhbnMgPSBzLmdldFNwYW5zKDAsIHMubGVuZ3RoKCksIExvY2FsZVNwYW4uY2xhc3MpOworICAgICAgICBhc3NlcnROb3ROdWxsKHNwYW5zKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHNwYW5zLmxlbmd0aCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBzLmdldFNwYW5TdGFydChTUEFOKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgcy5nZXRTcGFuRW5kKFNQQU4pKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHMuZ2V0U3BhbkZsYWdzKFNQQU4pKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMocy5sZW5ndGgoKSwgcy5uZXh0U3BhblRyYW5zaXRpb24oMCwgcy5sZW5ndGgoKSwgTG9jYWxlU3Bhbi5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFBhcmFncmFwaENvdW50KCkgeworICAgICAgICBmaW5hbCBQYXJhbXMgcGFyYW0gPSBuZXcgUGFyYW1zLkJ1aWxkZXIoUEFJTlQpLmJ1aWxkKCk7CisgICAgICAgIGZpbmFsIFByZWNvbXB1dGVkVGV4dCBwbSA9IFByZWNvbXB1dGVkVGV4dC5jcmVhdGUoU1RSSU5HLCBwYXJhbSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBwbS5nZXRQYXJhZ3JhcGhDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHBtLmdldFBhcmFncmFwaFN0YXJ0KDApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNUUklORy5sZW5ndGgoKSwgcG0uZ2V0UGFyYWdyYXBoRW5kKDApKTsKKworICAgICAgICBmaW5hbCBQcmVjb21wdXRlZFRleHQgcG0xID0gUHJlY29tcHV0ZWRUZXh0LmNyZWF0ZShNVUxUSVBBUkFfU1RSSU5HLCBwYXJhbSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBwbTEuZ2V0UGFyYWdyYXBoQ291bnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBwbTEuZ2V0UGFyYWdyYXBoU3RhcnQoMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNywgcG0xLmdldFBhcmFncmFwaEVuZCgwKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg3LCBwbTEuZ2V0UGFyYWdyYXBoU3RhcnQoMSkpOworICAgICAgICBhc3NlcnRFcXVhbHMocG0xLmxlbmd0aCgpLCBwbTEuZ2V0UGFyYWdyYXBoRW5kKDEpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRXaWR0aCgpIHsKKyAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0ID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VGFyZ2V0Q29udGV4dCgpOworCisgICAgICAgIC8vIFRoZSB0ZXN0IGZvbnQgaGFzIGZvbGxvd2luZyBjb3ZlcmFnZSBhbmQgd2lkdGguCisgICAgICAgIC8vIFUrMDAyMDogMTBlbQorICAgICAgICAvLyBVKzAwMkUgKC4pOiAxMGVtCisgICAgICAgIC8vIFUrMDA0MyAoQyk6IDEwMGVtCisgICAgICAgIC8vIFUrMDA0OSAoSSk6IDFlbQorICAgICAgICAvLyBVKzAwNEMgKEwpOiA1MGVtCisgICAgICAgIC8vIFUrMDA1NiAoVik6IDVlbQorICAgICAgICAvLyBVKzAwNTggKFgpOiAxMGVtCisgICAgICAgIC8vIFUrMDA1RiAoXyk6IDBlbQorICAgICAgICAvLyBVK0ZGRkQgKGludmFsaWQgc3Vycm9nYXRlIHdpbGwgYmUgcmVwbGFjZWQgdG8gdGhpcyk6IDdlbQorICAgICAgICAvLyBVKzEwMzMxIChcdUQ4MDBcdURGMzEpOiAxMGVtCisgICAgICAgIGZpbmFsIFR5cGVmYWNlIHRmID0gbmV3IFR5cGVmYWNlLkJ1aWxkZXIoY29udGV4dC5nZXRBc3NldHMoKSwKKyAgICAgICAgICAgICAgICAiZm9udHMvU3RhdGljTGF5b3V0TGluZUJyZWFraW5nVGVzdEZvbnQudHRmIikuYnVpbGQoKTsKKyAgICAgICAgZmluYWwgVGV4dFBhaW50IHBhaW50ID0gbmV3IFRleHRQYWludCgpOworICAgICAgICBwYWludC5zZXRUeXBlZmFjZSh0Zik7CisgICAgICAgIHBhaW50LnNldFRleHRTaXplKDEpOyAgLy8gTWFrZSAxZW0gPSAxcHgKKworICAgICAgICBmaW5hbCBQYXJhbXMgcGFyYW0gPSBuZXcgUGFyYW1zLkJ1aWxkZXIocGFpbnQpLmJ1aWxkKCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLjBmLCBQcmVjb21wdXRlZFRleHQuY3JlYXRlKCIiLCBwYXJhbSkuZ2V0V2lkdGgoMCwgMCksIDAuMGYpOworCisgICAgICAgIGFzc2VydEVxdWFscygwLjBmLCBQcmVjb21wdXRlZFRleHQuY3JlYXRlKCJJIiwgcGFyYW0pLmdldFdpZHRoKDAsIDApLCAwLjBmKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAuMGYsIFByZWNvbXB1dGVkVGV4dC5jcmVhdGUoIkkiLCBwYXJhbSkuZ2V0V2lkdGgoMSwgMSksIDAuMGYpOworICAgICAgICBhc3NlcnRFcXVhbHMoMS4wZiwgUHJlY29tcHV0ZWRUZXh0LmNyZWF0ZSgiSSIsIHBhcmFtKS5nZXRXaWR0aCgwLCAxKSwgMC4wZik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAuMGYsIFByZWNvbXB1dGVkVGV4dC5jcmVhdGUoIlYiLCBwYXJhbSkuZ2V0V2lkdGgoMCwgMCksIDAuMGYpOworICAgICAgICBhc3NlcnRFcXVhbHMoMC4wZiwgUHJlY29tcHV0ZWRUZXh0LmNyZWF0ZSgiViIsIHBhcmFtKS5nZXRXaWR0aCgxLCAxKSwgMC4wZik7CisgICAgICAgIGFzc2VydEVxdWFscyg1LjBmLCBQcmVjb21wdXRlZFRleHQuY3JlYXRlKCJWIiwgcGFyYW0pLmdldFdpZHRoKDAsIDEpLCAwLjBmKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMC4wZiwgUHJlY29tcHV0ZWRUZXh0LmNyZWF0ZSgiSVYiLCBwYXJhbSkuZ2V0V2lkdGgoMCwgMCksIDAuMGYpOworICAgICAgICBhc3NlcnRFcXVhbHMoMC4wZiwgUHJlY29tcHV0ZWRUZXh0LmNyZWF0ZSgiSVYiLCBwYXJhbSkuZ2V0V2lkdGgoMSwgMSksIDAuMGYpOworICAgICAgICBhc3NlcnRFcXVhbHMoMC4wZiwgUHJlY29tcHV0ZWRUZXh0LmNyZWF0ZSgiSVYiLCBwYXJhbSkuZ2V0V2lkdGgoMiwgMiksIDAuMGYpOworICAgICAgICBhc3NlcnRFcXVhbHMoMS4wZiwgUHJlY29tcHV0ZWRUZXh0LmNyZWF0ZSgiSVYiLCBwYXJhbSkuZ2V0V2lkdGgoMCwgMSksIDAuMGYpOworICAgICAgICBhc3NlcnRFcXVhbHMoNS4wZiwgUHJlY29tcHV0ZWRUZXh0LmNyZWF0ZSgiSVYiLCBwYXJhbSkuZ2V0V2lkdGgoMSwgMiksIDAuMGYpOworICAgICAgICBhc3NlcnRFcXVhbHMoNi4wZiwgUHJlY29tcHV0ZWRUZXh0LmNyZWF0ZSgiSVYiLCBwYXJhbSkuZ2V0V2lkdGgoMCwgMiksIDAuMGYpOworCisgICAgICAgIGFzc2VydEVxdWFscygwLjBmLCBQcmVjb21wdXRlZFRleHQuY3JlYXRlKCJJXG5WIiwgcGFyYW0pLmdldFdpZHRoKDAsIDApLCAwLjBmKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAuMGYsIFByZWNvbXB1dGVkVGV4dC5jcmVhdGUoIklcblYiLCBwYXJhbSkuZ2V0V2lkdGgoMSwgMSksIDAuMGYpOworICAgICAgICBhc3NlcnRFcXVhbHMoMC4wZiwgUHJlY29tcHV0ZWRUZXh0LmNyZWF0ZSgiSVxuViIsIHBhcmFtKS5nZXRXaWR0aCgyLCAyKSwgMC4wZik7CisgICAgICAgIGFzc2VydEVxdWFscygwLjBmLCBQcmVjb21wdXRlZFRleHQuY3JlYXRlKCJJXG5WIiwgcGFyYW0pLmdldFdpZHRoKDMsIDMpLCAwLjBmKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEuMGYsIFByZWNvbXB1dGVkVGV4dC5jcmVhdGUoIklcblYiLCBwYXJhbSkuZ2V0V2lkdGgoMCwgMSksIDAuMGYpOworICAgICAgICBhc3NlcnRFcXVhbHMoMS4wZiwgUHJlY29tcHV0ZWRUZXh0LmNyZWF0ZSgiSVxuViIsIHBhcmFtKS5nZXRXaWR0aCgwLCAyKSwgMC4wZik7CisgICAgICAgIGFzc2VydEVxdWFscyg1LjBmLCBQcmVjb21wdXRlZFRleHQuY3JlYXRlKCJJXG5WIiwgcGFyYW0pLmdldFdpZHRoKDIsIDMpLCAwLjBmKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRXaWR0aF9tdWx0aVN0eWxlKCkgeworICAgICAgICBmaW5hbCBDb250ZXh0IGNvbnRleHQgPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKS5nZXRUYXJnZXRDb250ZXh0KCk7CisgICAgICAgIGZpbmFsIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgc3NiID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIoIklJIik7CisgICAgICAgIHNzYi5zZXRTcGFuKG5ldyBUZXh0QXBwZWFyYW5jZVNwYW4obnVsbCAvKiBmYW1pbHkgKi8sIFR5cGVmYWNlLk5PUk1BTCwgMSAvKiB0ZXh0IHNpemUgKi8sCisgICAgICAgICAgICAgICAgbnVsbCAvKiBjb2xvciAqLywgbnVsbCAvKiBsaW5rIGNvbG9yICovKSwgMCwgMSwgU3Bhbm5lZC5TUEFOX0VYQ0xVU0lWRV9FWENMVVNJVkUpOworICAgICAgICBzc2Iuc2V0U3BhbihuZXcgVGV4dEFwcGVhcmFuY2VTcGFuKG51bGwgLyogZmFtaWx5ICovLCBUeXBlZmFjZS5OT1JNQUwsIDUgLyogdGV4dCBzaXplICovLAorICAgICAgICAgICAgICAgIG51bGwgLyogY29sb3IgKi8sIG51bGwgLyogbGluayBjb2xvciAqLyksIDEsIDIsIFNwYW5uZWQuU1BBTl9FWENMVVNJVkVfRVhDTFVTSVZFKTsKKworICAgICAgICBmaW5hbCBUeXBlZmFjZSB0ZiA9IG5ldyBUeXBlZmFjZS5CdWlsZGVyKGNvbnRleHQuZ2V0QXNzZXRzKCksCisgICAgICAgICAgICAgICAgImZvbnRzL1N0YXRpY0xheW91dExpbmVCcmVha2luZ1Rlc3RGb250LnR0ZiIpLmJ1aWxkKCk7CisgICAgICAgIGZpbmFsIFRleHRQYWludCBwYWludCA9IG5ldyBUZXh0UGFpbnQoKTsKKyAgICAgICAgcGFpbnQuc2V0VHlwZWZhY2UodGYpOworICAgICAgICBwYWludC5zZXRUZXh0U2l6ZSgxKTsgIC8vIE1ha2UgMWVtID0gMXB4CisKKyAgICAgICAgZmluYWwgUGFyYW1zIHBhcmFtID0gbmV3IFBhcmFtcy5CdWlsZGVyKHBhaW50KS5idWlsZCgpOworCisgICAgICAgIGFzc2VydEVxdWFscygwLjBmLCBQcmVjb21wdXRlZFRleHQuY3JlYXRlKHNzYiwgcGFyYW0pLmdldFdpZHRoKDAsIDApLCAwLjBmKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAuMGYsIFByZWNvbXB1dGVkVGV4dC5jcmVhdGUoc3NiLCBwYXJhbSkuZ2V0V2lkdGgoMSwgMSksIDAuMGYpOworICAgICAgICBhc3NlcnRFcXVhbHMoMC4wZiwgUHJlY29tcHV0ZWRUZXh0LmNyZWF0ZShzc2IsIHBhcmFtKS5nZXRXaWR0aCgyLCAyKSwgMC4wZik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEuMGYsIFByZWNvbXB1dGVkVGV4dC5jcmVhdGUoc3NiLCBwYXJhbSkuZ2V0V2lkdGgoMCwgMSksIDAuMGYpOworICAgICAgICBhc3NlcnRFcXVhbHMoNS4wZiwgUHJlY29tcHV0ZWRUZXh0LmNyZWF0ZShzc2IsIHBhcmFtKS5nZXRXaWR0aCgxLCAyKSwgMC4wZik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDYuMGYsIFByZWNvbXB1dGVkVGV4dC5jcmVhdGUoc3NiLCBwYXJhbSkuZ2V0V2lkdGgoMCwgMiksIDAuMGYpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFdpZHRoX211bHRpU3R5bGUyKCkgeworICAgICAgICBmaW5hbCBDb250ZXh0IGNvbnRleHQgPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKS5nZXRUYXJnZXRDb250ZXh0KCk7CisgICAgICAgIGZpbmFsIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgc3NiID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIoIklWSSIpOworICAgICAgICBzc2Iuc2V0U3BhbihuZXcgVGV4dEFwcGVhcmFuY2VTcGFuKG51bGwgLyogZmFtaWx5ICovLCBUeXBlZmFjZS5OT1JNQUwsIDEgLyogdGV4dCBzaXplICovLAorICAgICAgICAgICAgICAgIG51bGwgLyogY29sb3IgKi8sIG51bGwgLyogbGluayBjb2xvciAqLyksIDAsIDEsIFNwYW5uZWQuU1BBTl9FWENMVVNJVkVfRVhDTFVTSVZFKTsKKyAgICAgICAgc3NiLnNldFNwYW4obmV3IFRleHRBcHBlYXJhbmNlU3BhbihudWxsIC8qIGZhbWlseSAqLywgVHlwZWZhY2UuTk9STUFMLCA1IC8qIHRleHQgc2l6ZSAqLywKKyAgICAgICAgICAgICAgICBudWxsIC8qIGNvbG9yICovLCBudWxsIC8qIGxpbmsgY29sb3IgKi8pLCAxLCAyLCBTcGFubmVkLlNQQU5fRVhDTFVTSVZFX0VYQ0xVU0lWRSk7CisgICAgICAgIHNzYi5zZXRTcGFuKG5ldyBUZXh0QXBwZWFyYW5jZVNwYW4obnVsbCAvKiBmYW1pbHkgKi8sIFR5cGVmYWNlLk5PUk1BTCwgNSAvKiB0ZXh0IHNpemUgKi8sCisgICAgICAgICAgICAgICAgbnVsbCAvKiBjb2xvciAqLywgbnVsbCAvKiBsaW5rIGNvbG9yICovKSwgMiwgMywgU3Bhbm5lZC5TUEFOX0VYQ0xVU0lWRV9FWENMVVNJVkUpOworCisgICAgICAgIGZpbmFsIFR5cGVmYWNlIHRmID0gbmV3IFR5cGVmYWNlLkJ1aWxkZXIoY29udGV4dC5nZXRBc3NldHMoKSwKKyAgICAgICAgICAgICAgICAiZm9udHMvU3RhdGljTGF5b3V0TGluZUJyZWFraW5nVGVzdEZvbnQudHRmIikuYnVpbGQoKTsKKyAgICAgICAgZmluYWwgVGV4dFBhaW50IHBhaW50ID0gbmV3IFRleHRQYWludCgpOworICAgICAgICBwYWludC5zZXRUeXBlZmFjZSh0Zik7CisgICAgICAgIHBhaW50LnNldFRleHRTaXplKDEpOyAgLy8gTWFrZSAxZW0gPSAxcHgKKworICAgICAgICBmaW5hbCBQYXJhbXMgcGFyYW0gPSBuZXcgUGFyYW1zLkJ1aWxkZXIocGFpbnQpLmJ1aWxkKCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAuMGYsIFByZWNvbXB1dGVkVGV4dC5jcmVhdGUoc3NiLCBwYXJhbSkuZ2V0V2lkdGgoMCwgMCksIDAuMGYpOworICAgICAgICBhc3NlcnRFcXVhbHMoMC4wZiwgUHJlY29tcHV0ZWRUZXh0LmNyZWF0ZShzc2IsIHBhcmFtKS5nZXRXaWR0aCgxLCAxKSwgMC4wZik7CisgICAgICAgIGFzc2VydEVxdWFscygwLjBmLCBQcmVjb21wdXRlZFRleHQuY3JlYXRlKHNzYiwgcGFyYW0pLmdldFdpZHRoKDIsIDIpLCAwLjBmKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAuMGYsIFByZWNvbXB1dGVkVGV4dC5jcmVhdGUoc3NiLCBwYXJhbSkuZ2V0V2lkdGgoMywgMyksIDAuMGYpOworCisgICAgICAgIGFzc2VydEVxdWFscygxLjBmLCBQcmVjb21wdXRlZFRleHQuY3JlYXRlKHNzYiwgcGFyYW0pLmdldFdpZHRoKDAsIDEpLCAwLjBmKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDI1LjBmLCBQcmVjb21wdXRlZFRleHQuY3JlYXRlKHNzYiwgcGFyYW0pLmdldFdpZHRoKDEsIDIpLCAwLjBmKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUuMGYsIFByZWNvbXB1dGVkVGV4dC5jcmVhdGUoc3NiLCBwYXJhbSkuZ2V0V2lkdGgoMiwgMyksIDAuMGYpOworCisgICAgICAgIGFzc2VydEVxdWFscygyNi4wZiwgUHJlY29tcHV0ZWRUZXh0LmNyZWF0ZShzc2IsIHBhcmFtKS5nZXRXaWR0aCgwLCAyKSwgMC4wZik7CisgICAgICAgIGFzc2VydEVxdWFscygzMC4wZiwgUHJlY29tcHV0ZWRUZXh0LmNyZWF0ZShzc2IsIHBhcmFtKS5nZXRXaWR0aCgxLCAzKSwgMC4wZik7CisgICAgICAgIGFzc2VydEVxdWFscygzMS4wZiwgUHJlY29tcHV0ZWRUZXh0LmNyZWF0ZShzc2IsIHBhcmFtKS5nZXRXaWR0aCgwLCAzKSwgMC4wZik7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdEdldFdpZHRoX25lZ2F0aXZlX3N0YXJ0X29mZnNldCgpIHsKKyAgICAgICAgZmluYWwgUGFyYW1zIHBhcmFtID0gbmV3IFBhcmFtcy5CdWlsZGVyKFBBSU5UKS5idWlsZCgpOworICAgICAgICBQcmVjb21wdXRlZFRleHQuY3JlYXRlKCJhIiwgcGFyYW0pLmdldFdpZHRoKC0xLCAwKTsKKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0V2lkdGhfbmVnYXRpdmVfZW5kX29mZnNldCgpIHsKKyAgICAgICAgZmluYWwgUGFyYW1zIHBhcmFtID0gbmV3IFBhcmFtcy5CdWlsZGVyKFBBSU5UKS5idWlsZCgpOworICAgICAgICBQcmVjb21wdXRlZFRleHQuY3JlYXRlKCJhIiwgcGFyYW0pLmdldFdpZHRoKDAsIC0xKTsKKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0V2lkdGhfaW5kZXhfb3V0X29mX2JvdW5kc19zdGFydF9vZmZzZXQoKSB7CisgICAgICAgIGZpbmFsIFBhcmFtcyBwYXJhbSA9IG5ldyBQYXJhbXMuQnVpbGRlcihQQUlOVCkuYnVpbGQoKTsKKyAgICAgICAgUHJlY29tcHV0ZWRUZXh0LmNyZWF0ZSgiYSIsIHBhcmFtKS5nZXRXaWR0aCgyLCAyKTsKKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0V2lkdGhfaW5kZXhfb3V0X29mX2JvdW5kc19lbmRfb2Zmc2V0KCkgeworICAgICAgICBmaW5hbCBQYXJhbXMgcGFyYW0gPSBuZXcgUGFyYW1zLkJ1aWxkZXIoUEFJTlQpLmJ1aWxkKCk7CisgICAgICAgIFByZWNvbXB1dGVkVGV4dC5jcmVhdGUoImEiLCBwYXJhbSkuZ2V0V2lkdGgoMCwgMik7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdEdldFdpZHRoX3JldmVyc2Vfb2Zmc2V0KCkgeworICAgICAgICBmaW5hbCBQYXJhbXMgcGFyYW0gPSBuZXcgUGFyYW1zLkJ1aWxkZXIoUEFJTlQpLmJ1aWxkKCk7CisgICAgICAgIFByZWNvbXB1dGVkVGV4dC5jcmVhdGUoImEiLCBwYXJhbSkuZ2V0V2lkdGgoMSwgMCk7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdEdldFdpZHRoX2Fjcm9zc19wYXJhZ3JhcGhfYm91bmRhcnkoKSB7CisgICAgICAgIGZpbmFsIFBhcmFtcyBwYXJhbSA9IG5ldyBQYXJhbXMuQnVpbGRlcihQQUlOVCkuYnVpbGQoKTsKKyAgICAgICAgUHJlY29tcHV0ZWRUZXh0LmNyZWF0ZSgiYVxuYiIsIHBhcmFtKS5nZXRXaWR0aCgwLCAzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRCb3VuZHMoKSB7CisgICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLmdldFRhcmdldENvbnRleHQoKTsKKworICAgICAgICAvLyBUaGUgdGVzdCBmb250IGhhcyBmb2xsb3dpbmcgY292ZXJhZ2UgYW5kIHdpZHRoLgorICAgICAgICAvLyBVKzAwMjA6IDEwZW0KKyAgICAgICAgLy8gVSswMDJFICguKTogMTBlbQorICAgICAgICAvLyBVKzAwNDMgKEMpOiAxMDBlbQorICAgICAgICAvLyBVKzAwNDkgKEkpOiAxZW0KKyAgICAgICAgLy8gVSswMDRDIChMKTogNTBlbQorICAgICAgICAvLyBVKzAwNTYgKFYpOiA1ZW0KKyAgICAgICAgLy8gVSswMDU4IChYKTogMTBlbQorICAgICAgICAvLyBVKzAwNUYgKF8pOiAwZW0KKyAgICAgICAgLy8gVStGRkZEIChpbnZhbGlkIHN1cnJvZ2F0ZSB3aWxsIGJlIHJlcGxhY2VkIHRvIHRoaXMpOiA3ZW0KKyAgICAgICAgLy8gVSsxMDMzMSAoXHVEODAwXHVERjMxKTogMTBlbQorICAgICAgICBmaW5hbCBUeXBlZmFjZSB0ZiA9IG5ldyBUeXBlZmFjZS5CdWlsZGVyKGNvbnRleHQuZ2V0QXNzZXRzKCksCisgICAgICAgICAgICAgICAgImZvbnRzL1N0YXRpY0xheW91dExpbmVCcmVha2luZ1Rlc3RGb250LnR0ZiIpLmJ1aWxkKCk7CisgICAgICAgIGZpbmFsIFRleHRQYWludCBwYWludCA9IG5ldyBUZXh0UGFpbnQoKTsKKyAgICAgICAgcGFpbnQuc2V0VHlwZWZhY2UodGYpOworICAgICAgICBwYWludC5zZXRUZXh0U2l6ZSgxKTsgIC8vIE1ha2UgMWVtID0gMXB4CisKKyAgICAgICAgZmluYWwgUGFyYW1zIHBhcmFtID0gbmV3IFBhcmFtcy5CdWlsZGVyKHBhaW50KS5idWlsZCgpOworICAgICAgICBmaW5hbCBSZWN0IHJlY3QgPSBuZXcgUmVjdCgpOworCisgICAgICAgIHJlY3Quc2V0KDAsIDAsIDAsIDApOworICAgICAgICBQcmVjb21wdXRlZFRleHQuY3JlYXRlKCIiLCBwYXJhbSkuZ2V0Qm91bmRzKDAsIDAsIHJlY3QpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IFJlY3QoMCwgMCwgMCwgMCksIHJlY3QpOworCisgICAgICAgIHJlY3Quc2V0KDAsIDAsIDAsIDApOworICAgICAgICBQcmVjb21wdXRlZFRleHQuY3JlYXRlKCJJIiwgcGFyYW0pLmdldEJvdW5kcygwLCAxLCByZWN0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBSZWN0KDAsIC0xLCAxLCAwKSwgcmVjdCk7CisKKyAgICAgICAgcmVjdC5zZXQoMCwgMCwgMCwgMCk7CisgICAgICAgIFByZWNvbXB1dGVkVGV4dC5jcmVhdGUoIkkiLCBwYXJhbSkuZ2V0Qm91bmRzKDEsIDEsIHJlY3QpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IFJlY3QoMCwgMCwgMCwgMCksIHJlY3QpOworCisgICAgICAgIHJlY3Quc2V0KDAsIDAsIDAsIDApOworICAgICAgICBQcmVjb21wdXRlZFRleHQuY3JlYXRlKCJJViIsIHBhcmFtKS5nZXRCb3VuZHMoMCwgMCwgcmVjdCk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgUmVjdCgwLCAwLCAwLCAwKSwgcmVjdCk7CisKKyAgICAgICAgcmVjdC5zZXQoMCwgMCwgMCwgMCk7CisgICAgICAgIFByZWNvbXB1dGVkVGV4dC5jcmVhdGUoIklWIiwgcGFyYW0pLmdldEJvdW5kcygwLCAwLCByZWN0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBSZWN0KDAsIDAsIDAsIDApLCByZWN0KTsKKworICAgICAgICByZWN0LnNldCgwLCAwLCAwLCAwKTsKKyAgICAgICAgUHJlY29tcHV0ZWRUZXh0LmNyZWF0ZSgiSVYiLCBwYXJhbSkuZ2V0Qm91bmRzKDEsIDEsIHJlY3QpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IFJlY3QoMCwgMCwgMCwgMCksIHJlY3QpOworCisgICAgICAgIHJlY3Quc2V0KDAsIDAsIDAsIDApOworICAgICAgICBQcmVjb21wdXRlZFRleHQuY3JlYXRlKCJJViIsIHBhcmFtKS5nZXRCb3VuZHMoMiwgMiwgcmVjdCk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgUmVjdCgwLCAwLCAwLCAwKSwgcmVjdCk7CisKKyAgICAgICAgcmVjdC5zZXQoMCwgMCwgMCwgMCk7CisgICAgICAgIFByZWNvbXB1dGVkVGV4dC5jcmVhdGUoIklWIiwgcGFyYW0pLmdldEJvdW5kcygwLCAxLCByZWN0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBSZWN0KDAsIC0xLCAxLCAwKSwgcmVjdCk7CisKKyAgICAgICAgcmVjdC5zZXQoMCwgMCwgMCwgMCk7CisgICAgICAgIFByZWNvbXB1dGVkVGV4dC5jcmVhdGUoIklWIiwgcGFyYW0pLmdldEJvdW5kcygxLCAyLCByZWN0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBSZWN0KDAsIC01LCA1LCAwKSwgcmVjdCk7CisKKyAgICAgICAgcmVjdC5zZXQoMCwgMCwgMCwgMCk7CisgICAgICAgIFByZWNvbXB1dGVkVGV4dC5jcmVhdGUoIklWIiwgcGFyYW0pLmdldEJvdW5kcygwLCAyLCByZWN0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBSZWN0KDAsIC01LCA2LCAwKSwgcmVjdCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Qm91bmRzX211bHRpU3R5bGUoKSB7CisgICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLmdldFRhcmdldENvbnRleHQoKTsKKyAgICAgICAgZmluYWwgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBzc2IgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcigiSUkiKTsKKyAgICAgICAgc3NiLnNldFNwYW4obmV3IFRleHRBcHBlYXJhbmNlU3BhbihudWxsIC8qIGZhbWlseSAqLywgVHlwZWZhY2UuTk9STUFMLCAxIC8qIHRleHQgc2l6ZSAqLywKKyAgICAgICAgICAgICAgICBudWxsIC8qIGNvbG9yICovLCBudWxsIC8qIGxpbmsgY29sb3IgKi8pLCAwLCAxLCBTcGFubmVkLlNQQU5fRVhDTFVTSVZFX0VYQ0xVU0lWRSk7CisgICAgICAgIHNzYi5zZXRTcGFuKG5ldyBUZXh0QXBwZWFyYW5jZVNwYW4obnVsbCAvKiBmYW1pbHkgKi8sIFR5cGVmYWNlLk5PUk1BTCwgNSAvKiB0ZXh0IHNpemUgKi8sCisgICAgICAgICAgICAgICAgbnVsbCAvKiBjb2xvciAqLywgbnVsbCAvKiBsaW5rIGNvbG9yICovKSwgMSwgMiwgU3Bhbm5lZC5TUEFOX0VYQ0xVU0lWRV9FWENMVVNJVkUpOworCisgICAgICAgIGZpbmFsIFR5cGVmYWNlIHRmID0gbmV3IFR5cGVmYWNlLkJ1aWxkZXIoY29udGV4dC5nZXRBc3NldHMoKSwKKyAgICAgICAgICAgICAgICAiZm9udHMvU3RhdGljTGF5b3V0TGluZUJyZWFraW5nVGVzdEZvbnQudHRmIikuYnVpbGQoKTsKKyAgICAgICAgZmluYWwgVGV4dFBhaW50IHBhaW50ID0gbmV3IFRleHRQYWludCgpOworICAgICAgICBwYWludC5zZXRUeXBlZmFjZSh0Zik7CisgICAgICAgIHBhaW50LnNldFRleHRTaXplKDEpOyAgLy8gTWFrZSAxZW0gPSAxcHgKKworICAgICAgICBmaW5hbCBQYXJhbXMgcGFyYW0gPSBuZXcgUGFyYW1zLkJ1aWxkZXIocGFpbnQpLmJ1aWxkKCk7CisgICAgICAgIGZpbmFsIFJlY3QgcmVjdCA9IG5ldyBSZWN0KCk7CisKKyAgICAgICAgcmVjdC5zZXQoMCwgMCwgMCwgMCk7CisgICAgICAgIFByZWNvbXB1dGVkVGV4dC5jcmVhdGUoc3NiLCBwYXJhbSkuZ2V0Qm91bmRzKDAsIDAsIHJlY3QpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IFJlY3QoMCwgMCwgMCwgMCksIHJlY3QpOworCisgICAgICAgIHJlY3Quc2V0KDAsIDAsIDAsIDApOworICAgICAgICBQcmVjb21wdXRlZFRleHQuY3JlYXRlKHNzYiwgcGFyYW0pLmdldEJvdW5kcygwLCAxLCByZWN0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBSZWN0KDAsIC0xLCAxLCAwKSwgcmVjdCk7CisKKyAgICAgICAgcmVjdC5zZXQoMCwgMCwgMCwgMCk7CisgICAgICAgIFByZWNvbXB1dGVkVGV4dC5jcmVhdGUoc3NiLCBwYXJhbSkuZ2V0Qm91bmRzKDEsIDIsIHJlY3QpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IFJlY3QoMCwgLTUsIDUsIDApLCByZWN0KTsKKworICAgICAgICByZWN0LnNldCgwLCAwLCAwLCAwKTsKKyAgICAgICAgUHJlY29tcHV0ZWRUZXh0LmNyZWF0ZShzc2IsIHBhcmFtKS5nZXRCb3VuZHMoMCwgMiwgcmVjdCk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgUmVjdCgwLCAtNSwgNiwgMCksIHJlY3QpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEJvdW5kc19tdWx0aVN0eWxlMigpIHsKKyAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0ID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VGFyZ2V0Q29udGV4dCgpOworICAgICAgICBmaW5hbCBTcGFubmFibGVTdHJpbmdCdWlsZGVyIHNzYiA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKCJJVkkiKTsKKyAgICAgICAgc3NiLnNldFNwYW4obmV3IFRleHRBcHBlYXJhbmNlU3BhbihudWxsIC8qIGZhbWlseSAqLywgVHlwZWZhY2UuTk9STUFMLCAxIC8qIHRleHQgc2l6ZSAqLywKKyAgICAgICAgICAgICAgICBudWxsIC8qIGNvbG9yICovLCBudWxsIC8qIGxpbmsgY29sb3IgKi8pLCAwLCAxLCBTcGFubmVkLlNQQU5fRVhDTFVTSVZFX0VYQ0xVU0lWRSk7CisgICAgICAgIHNzYi5zZXRTcGFuKG5ldyBUZXh0QXBwZWFyYW5jZVNwYW4obnVsbCAvKiBmYW1pbHkgKi8sIFR5cGVmYWNlLk5PUk1BTCwgNSAvKiB0ZXh0IHNpemUgKi8sCisgICAgICAgICAgICAgICAgbnVsbCAvKiBjb2xvciAqLywgbnVsbCAvKiBsaW5rIGNvbG9yICovKSwgMSwgMiwgU3Bhbm5lZC5TUEFOX0VYQ0xVU0lWRV9FWENMVVNJVkUpOworICAgICAgICBzc2Iuc2V0U3BhbihuZXcgVGV4dEFwcGVhcmFuY2VTcGFuKG51bGwgLyogZmFtaWx5ICovLCBUeXBlZmFjZS5OT1JNQUwsIDUgLyogdGV4dCBzaXplICovLAorICAgICAgICAgICAgICAgIG51bGwgLyogY29sb3IgKi8sIG51bGwgLyogbGluayBjb2xvciAqLyksIDIsIDMsIFNwYW5uZWQuU1BBTl9FWENMVVNJVkVfRVhDTFVTSVZFKTsKKworICAgICAgICBmaW5hbCBUeXBlZmFjZSB0ZiA9IG5ldyBUeXBlZmFjZS5CdWlsZGVyKGNvbnRleHQuZ2V0QXNzZXRzKCksCisgICAgICAgICAgICAgICAgImZvbnRzL1N0YXRpY0xheW91dExpbmVCcmVha2luZ1Rlc3RGb250LnR0ZiIpLmJ1aWxkKCk7CisgICAgICAgIGZpbmFsIFRleHRQYWludCBwYWludCA9IG5ldyBUZXh0UGFpbnQoKTsKKyAgICAgICAgcGFpbnQuc2V0VHlwZWZhY2UodGYpOworICAgICAgICBwYWludC5zZXRUZXh0U2l6ZSgxKTsgIC8vIE1ha2UgMWVtID0gMXB4CisKKyAgICAgICAgZmluYWwgUGFyYW1zIHBhcmFtID0gbmV3IFBhcmFtcy5CdWlsZGVyKHBhaW50KS5idWlsZCgpOworICAgICAgICBmaW5hbCBSZWN0IHJlY3QgPSBuZXcgUmVjdCgpOworCisgICAgICAgIHJlY3Quc2V0KDAsIDAsIDAsIDApOworICAgICAgICBQcmVjb21wdXRlZFRleHQuY3JlYXRlKHNzYiwgcGFyYW0pLmdldEJvdW5kcygwLCAwLCByZWN0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBSZWN0KDAsIDAsIDAsIDApLCByZWN0KTsKKworICAgICAgICByZWN0LnNldCgwLCAwLCAwLCAwKTsKKyAgICAgICAgUHJlY29tcHV0ZWRUZXh0LmNyZWF0ZShzc2IsIHBhcmFtKS5nZXRCb3VuZHMoMCwgMSwgcmVjdCk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgUmVjdCgwLCAtMSwgMSwgMCksIHJlY3QpOworCisgICAgICAgIHJlY3Quc2V0KDAsIDAsIDAsIDApOworICAgICAgICBQcmVjb21wdXRlZFRleHQuY3JlYXRlKHNzYiwgcGFyYW0pLmdldEJvdW5kcygxLCAyLCByZWN0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBSZWN0KDAsIC0yNSwgMjUsIDApLCByZWN0KTsKKworICAgICAgICByZWN0LnNldCgwLCAwLCAwLCAwKTsKKyAgICAgICAgUHJlY29tcHV0ZWRUZXh0LmNyZWF0ZShzc2IsIHBhcmFtKS5nZXRCb3VuZHMoMiwgMywgcmVjdCk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgUmVjdCgwLCAtNSwgNSwgMCksIHJlY3QpOworCisgICAgICAgIHJlY3Quc2V0KDAsIDAsIDAsIDApOworICAgICAgICBQcmVjb21wdXRlZFRleHQuY3JlYXRlKHNzYiwgcGFyYW0pLmdldEJvdW5kcygwLCAyLCByZWN0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBSZWN0KDAsIC0yNSwgMjYsIDApLCByZWN0KTsKKworICAgICAgICByZWN0LnNldCgwLCAwLCAwLCAwKTsKKyAgICAgICAgUHJlY29tcHV0ZWRUZXh0LmNyZWF0ZShzc2IsIHBhcmFtKS5nZXRCb3VuZHMoMSwgMywgcmVjdCk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgUmVjdCgwLCAtMjUsIDMwLCAwKSwgcmVjdCk7CisKKyAgICAgICAgcmVjdC5zZXQoMCwgMCwgMCwgMCk7CisgICAgICAgIFByZWNvbXB1dGVkVGV4dC5jcmVhdGUoc3NiLCBwYXJhbSkuZ2V0Qm91bmRzKDAsIDMsIHJlY3QpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IFJlY3QoMCwgLTI1LCAzMSwgMCksIHJlY3QpOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRCb3VuZHNfbmVnYXRpdmVfc3RhcnRfb2Zmc2V0KCkgeworICAgICAgICBmaW5hbCBSZWN0IHJlY3QgPSBuZXcgUmVjdCgpOworICAgICAgICBmaW5hbCBQYXJhbXMgcGFyYW0gPSBuZXcgUGFyYW1zLkJ1aWxkZXIoUEFJTlQpLmJ1aWxkKCk7CisgICAgICAgIFByZWNvbXB1dGVkVGV4dC5jcmVhdGUoImEiLCBwYXJhbSkuZ2V0Qm91bmRzKC0xLCAwLCByZWN0KTsKKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Qm91bmRzX25lZ2F0aXZlX2VuZF9vZmZzZXQoKSB7CisgICAgICAgIGZpbmFsIFJlY3QgcmVjdCA9IG5ldyBSZWN0KCk7CisgICAgICAgIGZpbmFsIFBhcmFtcyBwYXJhbSA9IG5ldyBQYXJhbXMuQnVpbGRlcihQQUlOVCkuYnVpbGQoKTsKKyAgICAgICAgUHJlY29tcHV0ZWRUZXh0LmNyZWF0ZSgiYSIsIHBhcmFtKS5nZXRCb3VuZHMoMCwgLTEsIHJlY3QpOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRCb3VuZHNfaW5kZXhfb3V0X29mX2JvdW5kc19zdGFydF9vZmZzZXQoKSB7CisgICAgICAgIGZpbmFsIFJlY3QgcmVjdCA9IG5ldyBSZWN0KCk7CisgICAgICAgIGZpbmFsIFBhcmFtcyBwYXJhbSA9IG5ldyBQYXJhbXMuQnVpbGRlcihQQUlOVCkuYnVpbGQoKTsKKyAgICAgICAgUHJlY29tcHV0ZWRUZXh0LmNyZWF0ZSgiYSIsIHBhcmFtKS5nZXRCb3VuZHMoMiwgMiwgcmVjdCk7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdEdldEJvdW5kc19pbmRleF9vdXRfb2ZfYm91bmRzX2VuZF9vZmZzZXQoKSB7CisgICAgICAgIGZpbmFsIFJlY3QgcmVjdCA9IG5ldyBSZWN0KCk7CisgICAgICAgIGZpbmFsIFBhcmFtcyBwYXJhbSA9IG5ldyBQYXJhbXMuQnVpbGRlcihQQUlOVCkuYnVpbGQoKTsKKyAgICAgICAgUHJlY29tcHV0ZWRUZXh0LmNyZWF0ZSgiYSIsIHBhcmFtKS5nZXRCb3VuZHMoMCwgMiwgcmVjdCk7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdEdldEJvdW5kc19yZXZlcnNlX29mZnNldCgpIHsKKyAgICAgICAgZmluYWwgUmVjdCByZWN0ID0gbmV3IFJlY3QoKTsKKyAgICAgICAgZmluYWwgUGFyYW1zIHBhcmFtID0gbmV3IFBhcmFtcy5CdWlsZGVyKFBBSU5UKS5idWlsZCgpOworICAgICAgICBQcmVjb21wdXRlZFRleHQuY3JlYXRlKCJhIiwgcGFyYW0pLmdldEJvdW5kcygxLCAwLCByZWN0KTsKKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZCA9IE51bGxQb2ludGVyRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRCb3VuZHNfbnVsbF9yZWN0KCkgeworICAgICAgICBmaW5hbCBQYXJhbXMgcGFyYW0gPSBuZXcgUGFyYW1zLkJ1aWxkZXIoUEFJTlQpLmJ1aWxkKCk7CisgICAgICAgIFByZWNvbXB1dGVkVGV4dC5jcmVhdGUoImEiLCBwYXJhbSkuZ2V0Qm91bmRzKDAsIDEsIG51bGwpOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRCb3VuZHNfYWNyb3NzX3BhcmFncmFwaF9ib3VuZGFyeSgpIHsKKyAgICAgICAgZmluYWwgUmVjdCByZWN0ID0gbmV3IFJlY3QoKTsKKyAgICAgICAgZmluYWwgUGFyYW1zIHBhcmFtID0gbmV3IFBhcmFtcy5CdWlsZGVyKFBBSU5UKS5idWlsZCgpOworICAgICAgICBQcmVjb21wdXRlZFRleHQuY3JlYXRlKCJhXG5iIiwgcGFyYW0pLmdldEJvdW5kcygwLCAzLCByZWN0KTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9jdHMvU2VsZWN0aW9uVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2N0cy9TZWxlY3Rpb25UZXN0LmphdmEKaW5kZXggZjkyMGJkYS4uMDViOTMwOCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2N0cy9TZWxlY3Rpb25UZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2N0cy9TZWxlY3Rpb25UZXN0LmphdmEKQEAgLTIxLDE2ICsyMSwyMiBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIAotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworaW1wb3J0IGFuZHJvaWQudGV4dC5MYXlvdXQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNlbGVjdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuU3BhbldhdGNoZXI7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZTsKIGltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcjsKIGltcG9ydCBhbmRyb2lkLnRleHQuU3RhdGljTGF5b3V0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0UGFpbnQ7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKKwogQFNtYWxsVGVzdAogQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKIHB1YmxpYyBjbGFzcyBTZWxlY3Rpb25UZXN0IHsKQEAgLTI3NSw2ICsyODEsNTYgQEAKICAgICB9CiAKICAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNb3ZlVXBBZnRlclR5cGluZygpIHsKKyAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQgPSAiYWFhXG5tbSI7CisgICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKHRleHQpOworICAgICAgICBTdGF0aWNMYXlvdXQgbGF5b3V0ID0gbmV3IFN0YXRpY0xheW91dChidWlsZGVyLCBuZXcgVGV4dFBhaW50KCksIDIwMCwKKyAgICAgICAgICAgICAgICBMYXlvdXQuQWxpZ25tZW50LkFMSUdOX05PUk1BTCwgMCwgMCwgZmFsc2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25TdGFydChidWlsZGVyKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChidWlsZGVyKSk7CisKKyAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihidWlsZGVyLCAxLCAxKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTZWxlY3Rpb24ubW92ZURvd24oYnVpbGRlciwgbGF5b3V0KSk7CisgICAgICAgIGFzc2VydEVxdWFscyg1LCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uU3RhcnQoYnVpbGRlcikpOworICAgICAgICBhc3NlcnRFcXVhbHMoNSwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChidWlsZGVyKSk7CisKKyAgICAgICAgYnVpbGRlci5pbnNlcnQoNSwgIm1tIik7CisgICAgICAgIGxheW91dCA9IG5ldyBTdGF0aWNMYXlvdXQoYnVpbGRlciwgbmV3IFRleHRQYWludCgpLCAyMDAsIExheW91dC5BbGlnbm1lbnQuQUxJR05fTk9STUFMLAorICAgICAgICAgICAgICAgIDAsIDAsIGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDcsIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25TdGFydChidWlsZGVyKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg3LCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKGJ1aWxkZXIpKTsKKworICAgICAgICBhc3NlcnRUcnVlKFNlbGVjdGlvbi5tb3ZlVXAoYnVpbGRlciwgbGF5b3V0KSk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uU3RhcnQoYnVpbGRlcikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChidWlsZGVyKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TW92ZVVwS2VlcHNPcmlnaW5hbE1lbW9yeVBvc2l0aW9uKCkgeworICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCA9ICJhYVxubSI7CisgICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKHRleHQpOworICAgICAgICBTdGF0aWNMYXlvdXQgbGF5b3V0ID0gbmV3IFN0YXRpY0xheW91dChidWlsZGVyLCBuZXcgVGV4dFBhaW50KCksIDIwMCwKKyAgICAgICAgICAgICAgICBMYXlvdXQuQWxpZ25tZW50LkFMSUdOX05PUk1BTCwgMCwgMCwgZmFsc2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25TdGFydChidWlsZGVyKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChidWlsZGVyKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLAorICAgICAgICAgICAgICAgIGJ1aWxkZXIuZ2V0U3BhbnMoMCwgYnVpbGRlci5sZW5ndGgoKSwgU2VsZWN0aW9uLk1lbW9yeVRleHRXYXRjaGVyLmNsYXNzKS5sZW5ndGgpOworCisgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24oYnVpbGRlciwgMSwgMSk7CisgICAgICAgIGFzc2VydFRydWUoU2VsZWN0aW9uLm1vdmVEb3duKGJ1aWxkZXIsIGxheW91dCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNCwgU2VsZWN0aW9uLmdldFNlbGVjdGlvblN0YXJ0KGJ1aWxkZXIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQoYnVpbGRlcikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwKKyAgICAgICAgICAgICAgICBidWlsZGVyLmdldFNwYW5zKDAsIGJ1aWxkZXIubGVuZ3RoKCksIFNlbGVjdGlvbi5NZW1vcnlUZXh0V2F0Y2hlci5jbGFzcykubGVuZ3RoKTsKKworICAgICAgICBhc3NlcnRUcnVlKFNlbGVjdGlvbi5tb3ZlVXAoYnVpbGRlciwgbGF5b3V0KSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uU3RhcnQoYnVpbGRlcikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChidWlsZGVyKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLAorICAgICAgICAgICAgICAgIGJ1aWxkZXIuZ2V0U3BhbnMoMCwgYnVpbGRlci5sZW5ndGgoKSwgU2VsZWN0aW9uLk1lbW9yeVRleHRXYXRjaGVyLmNsYXNzKS5sZW5ndGgpOworICAgIH0KKworICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE1vdmVEb3duKCkgewogICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCA9ICJoZWxsbyx3b3JsZFxuR29vZ2xlIjsKICAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIodGV4dCk7CkBAIC0zMTMsNiArMzY5LDM0MCBAQAogICAgIH0KIAogICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1vdmVEb3duQWZ0ZXJUeXBpbmcoKSB7CisgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0ID0gIm1tXG5hYWEiOworICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcih0ZXh0KTsKKyAgICAgICAgU3RhdGljTGF5b3V0IGxheW91dCA9IG5ldyBTdGF0aWNMYXlvdXQoYnVpbGRlciwgbmV3IFRleHRQYWludCgpLCAyMDAsCisgICAgICAgICAgICAgICAgTGF5b3V0LkFsaWdubWVudC5BTElHTl9OT1JNQUwsIDAsIDAsIGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uU3RhcnQoYnVpbGRlcikpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQoYnVpbGRlcikpOworCisgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24oYnVpbGRlciwgNCwgNCk7CisgICAgICAgIGFzc2VydFRydWUoU2VsZWN0aW9uLm1vdmVVcChidWlsZGVyLCBsYXlvdXQpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25TdGFydChidWlsZGVyKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKGJ1aWxkZXIpKTsKKworICAgICAgICBidWlsZGVyLmluc2VydCgxLCAibW0iKTsKKyAgICAgICAgbGF5b3V0ID0gbmV3IFN0YXRpY0xheW91dChidWlsZGVyLCBuZXcgVGV4dFBhaW50KCksIDIwMCwgTGF5b3V0LkFsaWdubWVudC5BTElHTl9OT1JNQUwsCisgICAgICAgICAgICAgICAgMCwgMCwgZmFsc2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgU2VsZWN0aW9uLmdldFNlbGVjdGlvblN0YXJ0KGJ1aWxkZXIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQoYnVpbGRlcikpOworCisgICAgICAgIGFzc2VydFRydWUoU2VsZWN0aW9uLm1vdmVEb3duKGJ1aWxkZXIsIGxheW91dCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoOCwgU2VsZWN0aW9uLmdldFNlbGVjdGlvblN0YXJ0KGJ1aWxkZXIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDgsIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQoYnVpbGRlcikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1vdmVEb3duS2VlcHNPcmlnaW5hbE1lbW9yeVBvc2l0aW9uKCkgeworICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCA9ICJtXG5hYSI7CisgICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKHRleHQpOworICAgICAgICBTdGF0aWNMYXlvdXQgbGF5b3V0ID0gbmV3IFN0YXRpY0xheW91dChidWlsZGVyLCBuZXcgVGV4dFBhaW50KCksIDIwMCwKKyAgICAgICAgICAgICAgICBMYXlvdXQuQWxpZ25tZW50LkFMSUdOX05PUk1BTCwgMCwgMCwgZmFsc2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25TdGFydChidWlsZGVyKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChidWlsZGVyKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLAorICAgICAgICAgICAgICAgIGJ1aWxkZXIuZ2V0U3BhbnMoMCwgYnVpbGRlci5sZW5ndGgoKSwgU2VsZWN0aW9uLk1lbW9yeVRleHRXYXRjaGVyLmNsYXNzKS5sZW5ndGgpOworCisgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24oYnVpbGRlciwgMywgMyk7CisgICAgICAgIGFzc2VydFRydWUoU2VsZWN0aW9uLm1vdmVVcChidWlsZGVyLCBsYXlvdXQpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25TdGFydChidWlsZGVyKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKGJ1aWxkZXIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsCisgICAgICAgICAgICAgICAgYnVpbGRlci5nZXRTcGFucygwLCBidWlsZGVyLmxlbmd0aCgpLCBTZWxlY3Rpb24uTWVtb3J5VGV4dFdhdGNoZXIuY2xhc3MpLmxlbmd0aCk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShTZWxlY3Rpb24ubW92ZURvd24oYnVpbGRlciwgbGF5b3V0KSk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uU3RhcnQoYnVpbGRlcikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChidWlsZGVyKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLAorICAgICAgICAgICAgICAgIGJ1aWxkZXIuZ2V0U3BhbnMoMCwgYnVpbGRlci5sZW5ndGgoKSwgU2VsZWN0aW9uLk1lbW9yeVRleHRXYXRjaGVyLmNsYXNzKS5sZW5ndGgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1lbW9yeVBvc2l0aW9uUmVzZXRCeUhvcml6b250YWxNb3ZlbWVudCgpIHsKKyAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQgPSAibVxuYWEiOworICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcih0ZXh0KTsKKyAgICAgICAgU3RhdGljTGF5b3V0IGxheW91dCA9IG5ldyBTdGF0aWNMYXlvdXQoYnVpbGRlciwgbmV3IFRleHRQYWludCgpLCAyMDAsCisgICAgICAgICAgICAgICAgTGF5b3V0LkFsaWdubWVudC5BTElHTl9OT1JNQUwsIDAsIDAsIGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uU3RhcnQoYnVpbGRlcikpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQoYnVpbGRlcikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwKKyAgICAgICAgICAgICAgICBidWlsZGVyLmdldFNwYW5zKDAsIGJ1aWxkZXIubGVuZ3RoKCksIFNlbGVjdGlvbi5NZW1vcnlUZXh0V2F0Y2hlci5jbGFzcykubGVuZ3RoKTsKKworICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKGJ1aWxkZXIsIDMsIDMpOworICAgICAgICBhc3NlcnRUcnVlKFNlbGVjdGlvbi5tb3ZlVXAoYnVpbGRlciwgbGF5b3V0KSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uU3RhcnQoYnVpbGRlcikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChidWlsZGVyKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLAorICAgICAgICAgICAgICAgIGJ1aWxkZXIuZ2V0U3BhbnMoMCwgYnVpbGRlci5sZW5ndGgoKSwgU2VsZWN0aW9uLk1lbW9yeVRleHRXYXRjaGVyLmNsYXNzKS5sZW5ndGgpOworCisgICAgICAgIGFzc2VydFRydWUoU2VsZWN0aW9uLm1vdmVEb3duKGJ1aWxkZXIsIGxheW91dCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgU2VsZWN0aW9uLmdldFNlbGVjdGlvblN0YXJ0KGJ1aWxkZXIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQoYnVpbGRlcikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwKKyAgICAgICAgICAgICAgICBidWlsZGVyLmdldFNwYW5zKDAsIGJ1aWxkZXIubGVuZ3RoKCksIFNlbGVjdGlvbi5NZW1vcnlUZXh0V2F0Y2hlci5jbGFzcykubGVuZ3RoKTsKKworICAgICAgICBhc3NlcnRUcnVlKFNlbGVjdGlvbi5tb3ZlUmlnaHQoYnVpbGRlciwgbGF5b3V0KSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0LCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uU3RhcnQoYnVpbGRlcikpOworICAgICAgICBhc3NlcnRFcXVhbHMoNCwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChidWlsZGVyKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLAorICAgICAgICAgICAgICAgIGJ1aWxkZXIuZ2V0U3BhbnMoMCwgYnVpbGRlci5sZW5ndGgoKSwgU2VsZWN0aW9uLk1lbW9yeVRleHRXYXRjaGVyLmNsYXNzKS5sZW5ndGgpOworCisgICAgICAgIGFzc2VydFRydWUoU2VsZWN0aW9uLm1vdmVVcChidWlsZGVyLCBsYXlvdXQpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25TdGFydChidWlsZGVyKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKGJ1aWxkZXIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsCisgICAgICAgICAgICAgICAgYnVpbGRlci5nZXRTcGFucygwLCBidWlsZGVyLmxlbmd0aCgpLCBTZWxlY3Rpb24uTWVtb3J5VGV4dFdhdGNoZXIuY2xhc3MpLmxlbmd0aCk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShTZWxlY3Rpb24ubW92ZURvd24oYnVpbGRlciwgbGF5b3V0KSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0LCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uU3RhcnQoYnVpbGRlcikpOworICAgICAgICBhc3NlcnRFcXVhbHMoNCwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChidWlsZGVyKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLAorICAgICAgICAgICAgICAgIGJ1aWxkZXIuZ2V0U3BhbnMoMCwgYnVpbGRlci5sZW5ndGgoKSwgU2VsZWN0aW9uLk1lbW9yeVRleHRXYXRjaGVyLmNsYXNzKS5sZW5ndGgpOworCisgICAgICAgIGFzc2VydFRydWUoU2VsZWN0aW9uLm1vdmVMZWZ0KGJ1aWxkZXIsIGxheW91dCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgU2VsZWN0aW9uLmdldFNlbGVjdGlvblN0YXJ0KGJ1aWxkZXIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQoYnVpbGRlcikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwKKyAgICAgICAgICAgICAgICBidWlsZGVyLmdldFNwYW5zKDAsIGJ1aWxkZXIubGVuZ3RoKCksIFNlbGVjdGlvbi5NZW1vcnlUZXh0V2F0Y2hlci5jbGFzcykubGVuZ3RoKTsKKworICAgICAgICBhc3NlcnRUcnVlKFNlbGVjdGlvbi5tb3ZlVXAoYnVpbGRlciwgbGF5b3V0KSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uU3RhcnQoYnVpbGRlcikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChidWlsZGVyKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLAorICAgICAgICAgICAgICAgIGJ1aWxkZXIuZ2V0U3BhbnMoMCwgYnVpbGRlci5sZW5ndGgoKSwgU2VsZWN0aW9uLk1lbW9yeVRleHRXYXRjaGVyLmNsYXNzKS5sZW5ndGgpOworCisgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24oYnVpbGRlciwgMywgMyk7CisgICAgICAgIGFzc2VydEVxdWFscygwLAorICAgICAgICAgICAgICAgIGJ1aWxkZXIuZ2V0U3BhbnMoMCwgYnVpbGRlci5sZW5ndGgoKSwgU2VsZWN0aW9uLk1lbW9yeVRleHRXYXRjaGVyLmNsYXNzKS5sZW5ndGgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1lbW9yeVBvc2l0aW9uUmVzZXRCeVJlbW92ZVNlbGVjdGlvbigpIHsKKyAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQgPSAibVxuYWEiOworICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcih0ZXh0KTsKKyAgICAgICAgU3RhdGljTGF5b3V0IGxheW91dCA9IG5ldyBTdGF0aWNMYXlvdXQoYnVpbGRlciwgbmV3IFRleHRQYWludCgpLCAyMDAsCisgICAgICAgICAgICAgICAgTGF5b3V0LkFsaWdubWVudC5BTElHTl9OT1JNQUwsIDAsIDAsIGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uU3RhcnQoYnVpbGRlcikpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQoYnVpbGRlcikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwKKyAgICAgICAgICAgICAgICBidWlsZGVyLmdldFNwYW5zKDAsIGJ1aWxkZXIubGVuZ3RoKCksIFNlbGVjdGlvbi5NZW1vcnlUZXh0V2F0Y2hlci5jbGFzcykubGVuZ3RoKTsKKworICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKGJ1aWxkZXIsIDMsIDMpOworICAgICAgICBhc3NlcnRUcnVlKFNlbGVjdGlvbi5tb3ZlVXAoYnVpbGRlciwgbGF5b3V0KSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uU3RhcnQoYnVpbGRlcikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChidWlsZGVyKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLAorICAgICAgICAgICAgICAgIGJ1aWxkZXIuZ2V0U3BhbnMoMCwgYnVpbGRlci5sZW5ndGgoKSwgU2VsZWN0aW9uLk1lbW9yeVRleHRXYXRjaGVyLmNsYXNzKS5sZW5ndGgpOworCisgICAgICAgIFNlbGVjdGlvbi5yZW1vdmVTZWxlY3Rpb24oYnVpbGRlcik7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgU2VsZWN0aW9uLmdldFNlbGVjdGlvblN0YXJ0KGJ1aWxkZXIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKGJ1aWxkZXIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsCisgICAgICAgICAgICAgICAgYnVpbGRlci5nZXRTcGFucygwLCBidWlsZGVyLmxlbmd0aCgpLCBTZWxlY3Rpb24uTWVtb3J5VGV4dFdhdGNoZXIuY2xhc3MpLmxlbmd0aCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlsaW5lTGVuZ3RoTW92ZURvd24oKSB7CisgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0ID0gImFcblxuYSI7CisgICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKHRleHQpOworICAgICAgICBTdGF0aWNMYXlvdXQgbGF5b3V0ID0gbmV3IFN0YXRpY0xheW91dCh0ZXh0LCBuZXcgVGV4dFBhaW50KCksIDIwMCwgbnVsbCwgMCwgMCwgZmFsc2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25TdGFydChidWlsZGVyKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChidWlsZGVyKSk7CisKKyAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihidWlsZGVyLCAxKTsKKyAgICAgICAgLy8gTW92ZSBkb3duIHRvIGVtcHR5IGxpbmUKKyAgICAgICAgYXNzZXJ0VHJ1ZShTZWxlY3Rpb24ubW92ZURvd24oYnVpbGRlciwgbGF5b3V0KSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uU3RhcnQoYnVpbGRlcikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChidWlsZGVyKSk7CisKKyAgICAgICAgLy8gTW92ZSBkb3duIHRvIHRoaXJkIGxpbmUKKyAgICAgICAgYXNzZXJ0VHJ1ZShTZWxlY3Rpb24ubW92ZURvd24oYnVpbGRlciwgbGF5b3V0KSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0LCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uU3RhcnQoYnVpbGRlcikpOworICAgICAgICBhc3NlcnRFcXVhbHMoNCwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChidWlsZGVyKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlsaW5lTGVuZ3RoRXh0ZW5kRG93bigpIHsKKyAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQgPSAiR29vZ2xlXG5cbmhlbGxvLCB3b3JsZCI7CisgICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKHRleHQpOworICAgICAgICBTdGF0aWNMYXlvdXQgbGF5b3V0ID0gbmV3IFN0YXRpY0xheW91dCh0ZXh0LCBuZXcgVGV4dFBhaW50KCksIDIwMCwgbnVsbCwgMCwgMCwgZmFsc2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25TdGFydChidWlsZGVyKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChidWlsZGVyKSk7CisKKyAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihidWlsZGVyLCAxLCAzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTZWxlY3Rpb24uZXh0ZW5kRG93bihidWlsZGVyLCBsYXlvdXQpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25TdGFydChidWlsZGVyKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg3LCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKGJ1aWxkZXIpKTsKKworICAgICAgICBhc3NlcnRUcnVlKFNlbGVjdGlvbi5leHRlbmREb3duKGJ1aWxkZXIsIGxheW91dCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgU2VsZWN0aW9uLmdldFNlbGVjdGlvblN0YXJ0KGJ1aWxkZXIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDE1LCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKGJ1aWxkZXIpKTsKKworICAgICAgICBhc3NlcnRUcnVlKFNlbGVjdGlvbi5leHRlbmREb3duKGJ1aWxkZXIsIGxheW91dCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgU2VsZWN0aW9uLmdldFNlbGVjdGlvblN0YXJ0KGJ1aWxkZXIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRleHQubGVuZ3RoKCksIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQoYnVpbGRlcikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEV4dGVuZERvd25LZWVwc09yaWdpbmFsTWVtb3J5UG9zaXRpb24oKSB7CisgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0ID0gIm1cbmFhIjsKKyAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIodGV4dCk7CisgICAgICAgIFN0YXRpY0xheW91dCBsYXlvdXQgPSBuZXcgU3RhdGljTGF5b3V0KGJ1aWxkZXIsIG5ldyBUZXh0UGFpbnQoKSwgMjAwLAorICAgICAgICAgICAgICAgIExheW91dC5BbGlnbm1lbnQuQUxJR05fTk9STUFMLCAwLCAwLCBmYWxzZSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgU2VsZWN0aW9uLmdldFNlbGVjdGlvblN0YXJ0KGJ1aWxkZXIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKGJ1aWxkZXIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsCisgICAgICAgICAgICAgICAgYnVpbGRlci5nZXRTcGFucygwLCBidWlsZGVyLmxlbmd0aCgpLCBTZWxlY3Rpb24uTWVtb3J5VGV4dFdhdGNoZXIuY2xhc3MpLmxlbmd0aCk7CisKKyAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihidWlsZGVyLCAzLCAzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTZWxlY3Rpb24uZXh0ZW5kVXAoYnVpbGRlciwgbGF5b3V0KSk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uU3RhcnQoYnVpbGRlcikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChidWlsZGVyKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLAorICAgICAgICAgICAgICAgIGJ1aWxkZXIuZ2V0U3BhbnMoMCwgYnVpbGRlci5sZW5ndGgoKSwgU2VsZWN0aW9uLk1lbW9yeVRleHRXYXRjaGVyLmNsYXNzKS5sZW5ndGgpOworCisgICAgICAgIGFzc2VydFRydWUoU2VsZWN0aW9uLmV4dGVuZERvd24oYnVpbGRlciwgbGF5b3V0KSk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uU3RhcnQoYnVpbGRlcikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChidWlsZGVyKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLAorICAgICAgICAgICAgICAgIGJ1aWxkZXIuZ2V0U3BhbnMoMCwgYnVpbGRlci5sZW5ndGgoKSwgU2VsZWN0aW9uLk1lbW9yeVRleHRXYXRjaGVyLmNsYXNzKS5sZW5ndGgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpbGluZUxlbmd0aE1vdmVVcCgpIHsKKyAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQgPSAiYVxuXG5hIjsKKyAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIodGV4dCk7CisgICAgICAgIFN0YXRpY0xheW91dCBsYXlvdXQgPSBuZXcgU3RhdGljTGF5b3V0KHRleHQsIG5ldyBUZXh0UGFpbnQoKSwgMjAwLCBudWxsLCAwLCAwLCBmYWxzZSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgU2VsZWN0aW9uLmdldFNlbGVjdGlvblN0YXJ0KGJ1aWxkZXIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKGJ1aWxkZXIpKTsKKworICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKGJ1aWxkZXIsIDQpOworICAgICAgICAvLyBNb3ZlIHVwIHRvIGVtcHR5IGxpbmUKKyAgICAgICAgYXNzZXJ0VHJ1ZShTZWxlY3Rpb24ubW92ZVVwKGJ1aWxkZXIsIGxheW91dCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgU2VsZWN0aW9uLmdldFNlbGVjdGlvblN0YXJ0KGJ1aWxkZXIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQoYnVpbGRlcikpOworCisgICAgICAgIC8vIE1vdmUgdXAgdG8gZmlyc3QgbGluZQorICAgICAgICBhc3NlcnRUcnVlKFNlbGVjdGlvbi5tb3ZlVXAoYnVpbGRlciwgbGF5b3V0KSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uU3RhcnQoYnVpbGRlcikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChidWlsZGVyKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlsaW5lTGVuZ3RoRXh0ZW5kVXAoKSB7CisgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0ID0gIkdvb2dsZVxuXG5oZWxsbywgd29ybGQiOworICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcih0ZXh0KTsKKyAgICAgICAgU3RhdGljTGF5b3V0IGxheW91dCA9IG5ldyBTdGF0aWNMYXlvdXQodGV4dCwgbmV3IFRleHRQYWludCgpLCAyMDAsIG51bGwsIDAsIDAsIGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uU3RhcnQoYnVpbGRlcikpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQoYnVpbGRlcikpOworCisgICAgICAgIGFzc2VydFRydWUoU2VsZWN0aW9uLmV4dGVuZFVwKGJ1aWxkZXIsIGxheW91dCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25TdGFydChidWlsZGVyKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKGJ1aWxkZXIpKTsKKworICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKGJ1aWxkZXIsIDksIDE2KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTZWxlY3Rpb24uZXh0ZW5kVXAoYnVpbGRlciwgbGF5b3V0KSk7CisgICAgICAgIGFzc2VydEVxdWFscyg5LCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uU3RhcnQoYnVpbGRlcikpOworICAgICAgICBhc3NlcnRFcXVhbHMoNywgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChidWlsZGVyKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShTZWxlY3Rpb24uZXh0ZW5kVXAoYnVpbGRlciwgbGF5b3V0KSk7CisgICAgICAgIGFzc2VydEVxdWFscyg5LCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uU3RhcnQoYnVpbGRlcikpOworICAgICAgICBhc3NlcnRFcXVhbHMoNCwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChidWlsZGVyKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShTZWxlY3Rpb24uZXh0ZW5kVXAoYnVpbGRlciwgbGF5b3V0KSk7CisgICAgICAgIGFzc2VydEVxdWFscyg5LCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uU3RhcnQoYnVpbGRlcikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChidWlsZGVyKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXh0ZW5kVXBLZWVwc09yaWdpbmFsTWVtb3J5UG9zaXRpb24oKSB7CisgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0ID0gImFhXG5tIjsKKyAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIodGV4dCk7CisgICAgICAgIFN0YXRpY0xheW91dCBsYXlvdXQgPSBuZXcgU3RhdGljTGF5b3V0KGJ1aWxkZXIsIG5ldyBUZXh0UGFpbnQoKSwgMjAwLAorICAgICAgICAgICAgICAgIExheW91dC5BbGlnbm1lbnQuQUxJR05fTk9STUFMLCAwLCAwLCBmYWxzZSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgU2VsZWN0aW9uLmdldFNlbGVjdGlvblN0YXJ0KGJ1aWxkZXIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKGJ1aWxkZXIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsCisgICAgICAgICAgICAgICAgYnVpbGRlci5nZXRTcGFucygwLCBidWlsZGVyLmxlbmd0aCgpLCBTZWxlY3Rpb24uTWVtb3J5VGV4dFdhdGNoZXIuY2xhc3MpLmxlbmd0aCk7CisKKyAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihidWlsZGVyLCAxLCAxKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTZWxlY3Rpb24uZXh0ZW5kRG93bihidWlsZGVyLCBsYXlvdXQpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25TdGFydChidWlsZGVyKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0LCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKGJ1aWxkZXIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsCisgICAgICAgICAgICAgICAgYnVpbGRlci5nZXRTcGFucygwLCBidWlsZGVyLmxlbmd0aCgpLCBTZWxlY3Rpb24uTWVtb3J5VGV4dFdhdGNoZXIuY2xhc3MpLmxlbmd0aCk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShTZWxlY3Rpb24uZXh0ZW5kVXAoYnVpbGRlciwgbGF5b3V0KSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uU3RhcnQoYnVpbGRlcikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChidWlsZGVyKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLAorICAgICAgICAgICAgICAgIGJ1aWxkZXIuZ2V0U3BhbnMoMCwgYnVpbGRlci5sZW5ndGgoKSwgU2VsZWN0aW9uLk1lbW9yeVRleHRXYXRjaGVyLmNsYXNzKS5sZW5ndGgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpbGluZUxlbmd0aE1vdmVEb3duQWZ0ZXJTZWxlY3Rpb24oKSB7CisgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0ID0gImFhYWFhXG5cbmFhYWFhIjsKKyAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIodGV4dCk7CisgICAgICAgIFN0YXRpY0xheW91dCBsYXlvdXQgPSBuZXcgU3RhdGljTGF5b3V0KHRleHQsIG5ldyBUZXh0UGFpbnQoKSwgMjAwLCBudWxsLCAwLCAwLCBmYWxzZSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgU2VsZWN0aW9uLmdldFNlbGVjdGlvblN0YXJ0KGJ1aWxkZXIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKGJ1aWxkZXIpKTsKKworICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKGJ1aWxkZXIsIDMpOworICAgICAgICAvLyBNb3ZlIGRvd24gdG8gZW1wdHkgbGluZQorICAgICAgICBhc3NlcnRUcnVlKFNlbGVjdGlvbi5tb3ZlRG93bihidWlsZGVyLCBsYXlvdXQpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDYsIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25TdGFydChidWlsZGVyKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg2LCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKGJ1aWxkZXIpKTsKKworICAgICAgICAvLyBNb3ZlIGRvd24gdG8gdGhpcmQgbGluZQorICAgICAgICBhc3NlcnRUcnVlKFNlbGVjdGlvbi5tb3ZlVXAoYnVpbGRlciwgbGF5b3V0KSk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uU3RhcnQoYnVpbGRlcikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChidWlsZGVyKSk7CisKKyAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihidWlsZGVyLCA1KTsKKyAgICAgICAgLy8gTW92ZSBkb3duIHRvIGVtcHR5IGxpbmUKKyAgICAgICAgYXNzZXJ0VHJ1ZShTZWxlY3Rpb24ubW92ZURvd24oYnVpbGRlciwgbGF5b3V0KSk7CisgICAgICAgIGFzc2VydEVxdWFscyg2LCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uU3RhcnQoYnVpbGRlcikpOworICAgICAgICBhc3NlcnRFcXVhbHMoNiwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChidWlsZGVyKSk7CisKKyAgICAgICAgLy8gTW92ZSBkb3duIHRvIHRoaXJkIGxpbmUKKyAgICAgICAgYXNzZXJ0VHJ1ZShTZWxlY3Rpb24ubW92ZVVwKGJ1aWxkZXIsIGxheW91dCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNSwgU2VsZWN0aW9uLmdldFNlbGVjdGlvblN0YXJ0KGJ1aWxkZXIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUsIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQoYnVpbGRlcikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpbGluZUxlbmd0aE1vdmVVcEFmdGVyU2VsZWN0aW9uKCkgeworICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCA9ICJhYWFhYVxuXG5hYWFhYSI7CisgICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKHRleHQpOworICAgICAgICBTdGF0aWNMYXlvdXQgbGF5b3V0ID0gbmV3IFN0YXRpY0xheW91dCh0ZXh0LCBuZXcgVGV4dFBhaW50KCksIDIwMCwgbnVsbCwgMCwgMCwgZmFsc2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25TdGFydChidWlsZGVyKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChidWlsZGVyKSk7CisKKyAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihidWlsZGVyLCAxMCk7CisgICAgICAgIC8vIE1vdmUgdXAgdG8gZW1wdHkgbGluZQorICAgICAgICBhc3NlcnRUcnVlKFNlbGVjdGlvbi5tb3ZlVXAoYnVpbGRlciwgbGF5b3V0KSk7CisgICAgICAgIGFzc2VydEVxdWFscyg2LCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uU3RhcnQoYnVpbGRlcikpOworICAgICAgICBhc3NlcnRFcXVhbHMoNiwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChidWlsZGVyKSk7CisKKyAgICAgICAgLy8gTW92ZSBkb3duIHRvIHRoaXJkIGxpbmUKKyAgICAgICAgYXNzZXJ0VHJ1ZShTZWxlY3Rpb24ubW92ZURvd24oYnVpbGRlciwgbGF5b3V0KSk7CisgICAgICAgIGFzc2VydEVxdWFscygxMCwgU2VsZWN0aW9uLmdldFNlbGVjdGlvblN0YXJ0KGJ1aWxkZXIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEwLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKGJ1aWxkZXIpKTsKKworICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKGJ1aWxkZXIsIDEyKTsKKyAgICAgICAgLy8gTW92ZSB1cCB0byBlbXB0eSBsaW5lCisgICAgICAgIGFzc2VydFRydWUoU2VsZWN0aW9uLm1vdmVVcChidWlsZGVyLCBsYXlvdXQpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDYsIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25TdGFydChidWlsZGVyKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg2LCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKGJ1aWxkZXIpKTsKKworICAgICAgICAvLyBNb3ZlIGRvd24gdG8gdGhpcmQgbGluZQorICAgICAgICBhc3NlcnRUcnVlKFNlbGVjdGlvbi5tb3ZlRG93bihidWlsZGVyLCBsYXlvdXQpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEyLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uU3RhcnQoYnVpbGRlcikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTIsIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQoYnVpbGRlcikpOworICAgIH0KKworICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEV4dGVuZFNlbGVjdGlvbigpIHsKICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQgPSAiaGVsbG8sIHdvcmxkIjsKICAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIodGV4dCk7CkBAIC01ODMsNCArOTczLDI5IEBACiAgICAgICAgIGFzc2VydEVxdWFscyh0ZXh0Lmxlbmd0aCgpLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uU3RhcnQoYnVpbGRlcikpOwogICAgICAgICBhc3NlcnRFcXVhbHModGV4dC5sZW5ndGgoKSwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChidWlsZGVyKSk7CiAgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU2VsZWN0aW9uT25seVRyaWdnZXJzT25lU3BhblJlbW92ZWQoKSB7CisgICAgICAgIFNwYW5uYWJsZSBzcGFubmFibGUgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcigiYWJjZGVmIik7CisgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24oc3Bhbm5hYmxlLCAwLCAyKTsKKworICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICAgICAgU3BhbldhdGNoZXIgd2F0Y2hlciA9IG5ldyBTcGFuV2F0Y2hlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25TcGFuQWRkZWQoU3Bhbm5hYmxlIHRleHQsIE9iamVjdCB3aGF0LCBpbnQgc3RhcnQsIGludCBlbmQpIHt9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25TcGFuUmVtb3ZlZChTcGFubmFibGUgdGV4dCwgT2JqZWN0IHdoYXQsIGludCBzdGFydCwgaW50IGVuZCkgeworICAgICAgICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3BhbkNoYW5nZWQoU3Bhbm5hYmxlIHRleHQsIE9iamVjdCB3aGF0LCBpbnQgb3N0YXJ0LCBpbnQgb2VuZCwgaW50IG5zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgaW50IG5lbmQpIHt9CisgICAgICAgIH07CisgICAgICAgIHNwYW5uYWJsZS5zZXRTcGFuKHdhdGNoZXIsIDAsIDIsIDApOworCisgICAgICAgIFNlbGVjdGlvbi5yZW1vdmVTZWxlY3Rpb24oc3Bhbm5hYmxlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGxhdGNoLmdldENvdW50KCkpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9jdHMvU3Bhbm5hYmxlU3RyaW5nQnVpbGRlclNwYW5UZXN0LmphdmEgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvY3RzL1NwYW5uYWJsZVN0cmluZ0J1aWxkZXJTcGFuVGVzdC5qYXZhCmluZGV4IGRmYWJlNzEuLjVlZGE4MDEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9jdHMvU3Bhbm5hYmxlU3RyaW5nQnVpbGRlclNwYW5UZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2N0cy9TcGFubmFibGVTdHJpbmdCdWlsZGVyU3BhblRlc3QuamF2YQpAQCAtMjAsOCArMjAsNiBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIAotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5IdG1sOwogaW1wb3J0IGFuZHJvaWQudGV4dC5MYXlvdXQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5XYXRjaGVyOwpAQCAtMzUsNiArMzMsOSBAQAogaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5QYXJhZ3JhcGhTdHlsZTsKIGltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuUXVvdGVTcGFuOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvY3RzL1NwYW5uYWJsZVN0cmluZ0J1aWxkZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvY3RzL1NwYW5uYWJsZVN0cmluZ0J1aWxkZXJUZXN0LmphdmEKaW5kZXggYjhmM2Y0Mi4uYjMyNDFlNiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2N0cy9TcGFubmFibGVTdHJpbmdCdWlsZGVyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9jdHMvU3Bhbm5hYmxlU3RyaW5nQnVpbGRlclRlc3QuamF2YQpAQCAtMjMsOCArMjMsNiBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIAotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5FZGl0YWJsZTsKIGltcG9ydCBhbmRyb2lkLnRleHQuSW5wdXRGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNlbGVjdGlvbjsKQEAgLTM4LDYgKzM2LDkgQEAKIGltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuVGFiU3RvcFNwYW47CiBpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlVuZGVybGluZVNwYW47CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9jdHMvU3Bhbm5hYmxlU3RyaW5nVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2N0cy9TcGFubmFibGVTdHJpbmdUZXN0LmphdmEKaW5kZXggMzc3MTYxMy4uMGMxMzA5NyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2N0cy9TcGFubmFibGVTdHJpbmdUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2N0cy9TcGFubmFibGVTdHJpbmdUZXN0LmphdmEKQEAgLTIxLDggKzIxLDYgQEAKIGltcG9ydCBzdGF0aWMganVuaXQuZnJhbWV3b3JrLkFzc2VydC5hc3NlcnRTYW1lOwogaW1wb3J0IHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0LmZhaWw7CiAKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnRleHQuTGF5b3V0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmc7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZVN0cmluZ0J1aWxkZXI7CkBAIC0zNCw2ICszMiw5IEBACiBpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlF1b3RlU3BhbjsKIGltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuVW5kZXJsaW5lU3BhbjsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2N0cy9TcGFubmFibGVfRmFjdG9yeVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9jdHMvU3Bhbm5hYmxlX0ZhY3RvcnlUZXN0LmphdmEKaW5kZXggNDk2OWU2Ny4uOThmZTlmMCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2N0cy9TcGFubmFibGVfRmFjdG9yeVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvY3RzL1NwYW5uYWJsZV9GYWN0b3J5VGVzdC5qYXZhCkBAIC0yMSwxMiArMjEsMTMgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRTYW1lOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlOwogaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGUuRmFjdG9yeTsKIGltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvY3RzL1NwYW5uZWRTdHJpbmdUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvY3RzL1NwYW5uZWRTdHJpbmdUZXN0LmphdmEKaW5kZXggY2NkYjExOS4uZjA5ODI4YyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2N0cy9TcGFubmVkU3RyaW5nVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9jdHMvU3Bhbm5lZFN0cmluZ1Rlc3QuamF2YQpAQCAtMjEsMTAgKzIxLDExIEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwogCi1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uZWRTdHJpbmc7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9jdHMvU3Bhbm5lZFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9jdHMvU3Bhbm5lZFRlc3QuamF2YQppbmRleCAxMmViZmVkLi40ZDVhYzU5IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvY3RzL1NwYW5uZWRUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2N0cy9TcGFubmVkVGVzdC5qYXZhCkBAIC0xOSw4ICsxOSw2IEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlOwogaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmc7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZVN0cmluZ0J1aWxkZXI7CkBAIC0zMCw2ICsyOCw5IEBACiBpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlF1b3RlU3BhbjsKIGltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuVW5kZXJsaW5lU3BhbjsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2N0cy9TdGF0aWNMYXlvdXRMaW5lQnJlYWtpbmdUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvY3RzL1N0YXRpY0xheW91dExpbmVCcmVha2luZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmQ5YjNhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2N0cy9TdGF0aWNMYXlvdXRMaW5lQnJlYWtpbmdUZXN0LmphdmEKQEAgLTAsMCArMSw0NjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudGV4dC5jdHM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlR5cGVmYWNlOworaW1wb3J0IGFuZHJvaWQudGV4dC5MYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC50ZXh0LkxheW91dC5BbGlnbm1lbnQ7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZVN0cmluZ0J1aWxkZXI7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uZWQ7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlN0YXRpY0xheW91dDsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dERpcmVjdGlvbkhldXJpc3RpY3M7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRQYWludDsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuTWV0cmljQWZmZWN0aW5nU3BhbjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKK0BTbWFsbFRlc3QKK0BSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgU3RhdGljTGF5b3V0TGluZUJyZWFraW5nVGVzdCB7CisgICAgLy8gU3BhbiB0ZXN0IGFyZSBjdXJyZW50bHkgbm90IHN1cHBvcnRlZCBiZWNhdXNlIHRleHQgbWVhc3VyZW1lbnQgdXNlcyB0aGUgTWVhc3VyZWRUZXh0CisgICAgLy8gaW50ZXJuYWwgbVdvcmtQYWludCBpbnN0ZWFkIG9mIHRoZSBwcm92aWRlZCBNb2NrVGVzdFBhaW50LgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gU1BBTl9URVNUU19TVVBQT1JURUQgPSBmYWxzZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBTUEFDRV9NVUxUSSA9IDEuMGY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgU1BBQ0VfQUREID0gMC4wZjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0lEVEggPSAxMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQWxpZ25tZW50IEFMSUdOID0gQWxpZ25tZW50LkFMSUdOX05PUk1BTDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgU1VSUl9GSVJTVCA9ICdcdUQ4MDAnOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgU1VSUl9TRUNPTkQgPSAnXHVERjMxJzsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIE5PX0JSRUFLID0gbmV3IGludFtdIHt9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGV4dFBhaW50IHNUZXh0UGFpbnQgPSBuZXcgVGV4dFBhaW50KCk7CisKKyAgICBzdGF0aWMgeworICAgICAgICAvLyBUaGUgdGVzdCBmb250IGhhcyBmb2xsb3dpbmcgY292ZXJhZ2UgYW5kIHdpZHRoLgorICAgICAgICAvLyBVKzAwMjA6IDEwZW0KKyAgICAgICAgLy8gVSswMDJFICguKTogMTBlbQorICAgICAgICAvLyBVKzAwNDMgKEMpOiAxMDBlbQorICAgICAgICAvLyBVKzAwNDkgKEkpOiAxZW0KKyAgICAgICAgLy8gVSswMDRDIChMKTogNTBlbQorICAgICAgICAvLyBVKzAwNTYgKFYpOiA1ZW0KKyAgICAgICAgLy8gVSswMDU4IChYKTogMTBlbQorICAgICAgICAvLyBVKzAwNUYgKF8pOiAwZW0KKyAgICAgICAgLy8gVStGRkZEIChpbnZhbGlkIHN1cnJvZ2F0ZSB3aWxsIGJlIHJlcGxhY2VkIHRvIHRoaXMpOiA3ZW0KKyAgICAgICAgLy8gVSsxMDMzMSAoXHVEODAwXHVERjMxKTogMTBlbQorICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRUYXJnZXRDb250ZXh0KCk7CisgICAgICAgIHNUZXh0UGFpbnQuc2V0VHlwZWZhY2UoVHlwZWZhY2UuY3JlYXRlRnJvbUFzc2V0KGNvbnRleHQuZ2V0QXNzZXRzKCksCisgICAgICAgICAgICAgICAgICAiZm9udHMvU3RhdGljTGF5b3V0TGluZUJyZWFraW5nVGVzdEZvbnQudHRmIikpOworICAgICAgICBzVGV4dFBhaW50LnNldFRleHRTaXplKDEuMGYpOyAgLy8gTWFrZSAxZW0gPT0gMXB4LgorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0YXRpY0xheW91dCBnZXRTdGF0aWNMYXlvdXQoQ2hhclNlcXVlbmNlIHNvdXJjZSwgaW50IHdpZHRoLAorICAgICAgICAgICAgaW50IGJyZWFrU3RyYXRlZ3kpIHsKKyAgICAgICAgcmV0dXJuIFN0YXRpY0xheW91dC5CdWlsZGVyLm9idGFpbihzb3VyY2UsIDAsIHNvdXJjZS5sZW5ndGgoKSwgc1RleHRQYWludCwgd2lkdGgpCisgICAgICAgICAgICAgICAgLnNldEFsaWdubWVudChBTElHTikKKyAgICAgICAgICAgICAgICAuc2V0TGluZVNwYWNpbmcoU1BBQ0VfQURELCBTUEFDRV9NVUxUSSkKKyAgICAgICAgICAgICAgICAuc2V0SW5jbHVkZVBhZChmYWxzZSkKKyAgICAgICAgICAgICAgICAuc2V0QnJlYWtTdHJhdGVneShicmVha1N0cmF0ZWd5KQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGludFtdIGdldEJyZWFrcyhDaGFyU2VxdWVuY2Ugc291cmNlKSB7CisgICAgICAgIHJldHVybiBnZXRCcmVha3Moc291cmNlLCBXSURUSCwgTGF5b3V0LkJSRUFLX1NUUkFURUdZX1NJTVBMRSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50W10gZ2V0QnJlYWtzKENoYXJTZXF1ZW5jZSBzb3VyY2UsIGludCB3aWR0aCwgaW50IGJyZWFrU3RyYXRlZ3kpIHsKKyAgICAgICAgZmluYWwgU3RhdGljTGF5b3V0IHN0YXRpY0xheW91dCA9IGdldFN0YXRpY0xheW91dChzb3VyY2UsIHdpZHRoLCBicmVha1N0cmF0ZWd5KTsKKworICAgICAgICBmaW5hbCBpbnRbXSBicmVha3MgPSBuZXcgaW50W3N0YXRpY0xheW91dC5nZXRMaW5lQ291bnQoKSAtIDFdOworICAgICAgICBmb3IgKGludCBsaW5lID0gMDsgbGluZSA8IGJyZWFrcy5sZW5ndGg7IGxpbmUrKykgeworICAgICAgICAgICAgYnJlYWtzW2xpbmVdID0gc3RhdGljTGF5b3V0LmdldExpbmVFbmQobGluZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJyZWFrczsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGRlYnVnTGF5b3V0KENoYXJTZXF1ZW5jZSBzb3VyY2UsIFN0YXRpY0xheW91dCBzdGF0aWNMYXlvdXQpIHsKKyAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBpbnQgY291bnQgPSBzdGF0aWNMYXlvdXQuZ2V0TGluZUNvdW50KCk7CisgICAgICAgICAgICBMb2cuaSgiU0xMQlRlc3QiLCAiXCIiICsgc291cmNlLnRvU3RyaW5nKCkgKyAiXCI6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBjb3VudCArICIgbGluZXMiKTsKKyAgICAgICAgICAgIGZvciAoaW50IGxpbmUgPSAwOyBsaW5lIDwgY291bnQ7IGxpbmUrKykgeworICAgICAgICAgICAgICAgIGludCBsaW5lU3RhcnQgPSBzdGF0aWNMYXlvdXQuZ2V0TGluZVN0YXJ0KGxpbmUpOworICAgICAgICAgICAgICAgIGludCBsaW5lRW5kID0gc3RhdGljTGF5b3V0LmdldExpbmVFbmQobGluZSk7CisgICAgICAgICAgICAgICAgTG9nLmkoIlNMTEJUZXN0IiwgIkxpbmUgIiArIGxpbmUgKyAiIFsiICsgbGluZVN0YXJ0ICsgIi4uIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBsaW5lRW5kICsgIl1cdCIgKyBzb3VyY2Uuc3ViU2VxdWVuY2UobGluZVN0YXJ0LCBsaW5lRW5kKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGxheW91dChDaGFyU2VxdWVuY2Ugc291cmNlLCBpbnRbXSBicmVha3MpIHsKKyAgICAgICAgbGF5b3V0KHNvdXJjZSwgYnJlYWtzLCBXSURUSCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBsYXlvdXQoQ2hhclNlcXVlbmNlIHNvdXJjZSwgaW50W10gYnJlYWtzLCBpbnQgd2lkdGgpIHsKKyAgICAgICAgZmluYWwgaW50W10gYnJlYWtTdHJhdGVnaWVzID0ge0xheW91dC5CUkVBS19TVFJBVEVHWV9TSU1QTEUsCisgICAgICAgICAgICAgICAgTGF5b3V0LkJSRUFLX1NUUkFURUdZX0hJR0hfUVVBTElUWX07CisgICAgICAgIGZvciAoaW50IGJyZWFrU3RyYXRlZ3kgOiBicmVha1N0cmF0ZWdpZXMpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0YXRpY0xheW91dCBzdGF0aWNMYXlvdXQgPSBnZXRTdGF0aWNMYXlvdXQoc291cmNlLCB3aWR0aCwgYnJlYWtTdHJhdGVneSk7CisKKyAgICAgICAgICAgIGRlYnVnTGF5b3V0KHNvdXJjZSwgc3RhdGljTGF5b3V0KTsKKworICAgICAgICAgICAgZmluYWwgaW50IGxpbmVDb3VudCA9IGJyZWFrcy5sZW5ndGggKyAxOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJOdW1iZXIgb2YgbGluZXMiLCBsaW5lQ291bnQsIHN0YXRpY0xheW91dC5nZXRMaW5lQ291bnQoKSk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGxpbmUgPSAwOyBsaW5lIDwgbGluZUNvdW50OyBsaW5lKyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbGluZVN0YXJ0ID0gc3RhdGljTGF5b3V0LmdldExpbmVTdGFydChsaW5lKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbGluZUVuZCA9IHN0YXRpY0xheW91dC5nZXRMaW5lRW5kKGxpbmUpOworCisgICAgICAgICAgICAgICAgaWYgKGxpbmUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkxpbmUgc3RhcnQgZm9yIGZpcnN0IGxpbmUiLCAwLCBsaW5lU3RhcnQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiTGluZSBzdGFydCBmb3IgbGluZSAiICsgbGluZSwgYnJlYWtzW2xpbmUgLSAxXSwgbGluZVN0YXJ0KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGluZSA9PSBsaW5lQ291bnQgLSAxKSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiTGluZSBlbmQgZm9yIGxhc3QgbGluZSIsIHNvdXJjZS5sZW5ndGgoKSwgbGluZUVuZCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJMaW5lIGVuZCBmb3IgbGluZSAiICsgbGluZSwgYnJlYWtzW2xpbmVdLCBsaW5lRW5kKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGxheW91dE1heExpbmVzKENoYXJTZXF1ZW5jZSBzb3VyY2UsIGludFtdIGJyZWFrcywgaW50IG1heExpbmVzKSB7CisgICAgICAgIGZpbmFsIFN0YXRpY0xheW91dCBzdGF0aWNMYXlvdXQgPSBTdGF0aWNMYXlvdXQuQnVpbGRlcgorICAgICAgICAgICAgICAgIC5vYnRhaW4oc291cmNlLCAwLCBzb3VyY2UubGVuZ3RoKCksIHNUZXh0UGFpbnQsIFdJRFRIKQorICAgICAgICAgICAgICAgIC5zZXRBbGlnbm1lbnQoQUxJR04pCisgICAgICAgICAgICAgICAgLnNldFRleHREaXJlY3Rpb24oVGV4dERpcmVjdGlvbkhldXJpc3RpY3MuTFRSKQorICAgICAgICAgICAgICAgIC5zZXRMaW5lU3BhY2luZyhTUEFDRV9BREQsIFNQQUNFX01VTFRJKQorICAgICAgICAgICAgICAgIC5zZXRJbmNsdWRlUGFkKGZhbHNlKQorICAgICAgICAgICAgICAgIC5zZXRNYXhMaW5lcyhtYXhMaW5lcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgICAgICBkZWJ1Z0xheW91dChzb3VyY2UsIHN0YXRpY0xheW91dCk7CisKKyAgICAgICAgZmluYWwgaW50IGxpbmVDb3VudCA9IHN0YXRpY0xheW91dC5nZXRMaW5lQ291bnQoKTsKKworICAgICAgICBmb3IgKGludCBsaW5lID0gMDsgbGluZSA8IGxpbmVDb3VudDsgbGluZSsrKSB7CisgICAgICAgICAgICBpbnQgbGluZVN0YXJ0ID0gc3RhdGljTGF5b3V0LmdldExpbmVTdGFydChsaW5lKTsKKyAgICAgICAgICAgIGludCBsaW5lRW5kID0gc3RhdGljTGF5b3V0LmdldExpbmVFbmQobGluZSk7CisKKyAgICAgICAgICAgIGlmIChsaW5lID09IDApIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkxpbmUgc3RhcnQgZm9yIGZpcnN0IGxpbmUiLCAwLCBsaW5lU3RhcnQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkxpbmUgc3RhcnQgZm9yIGxpbmUgIiArIGxpbmUsIGJyZWFrc1tsaW5lIC0gMV0sIGxpbmVTdGFydCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChsaW5lID09IGxpbmVDb3VudCAtIDEgJiYgbGluZSAhPSBicmVha3MubGVuZ3RoIC0gMSkgeworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiTGluZSBlbmQgZm9yIGxhc3QgbGluZSIsIHNvdXJjZS5sZW5ndGgoKSwgbGluZUVuZCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiTGluZSBlbmQgZm9yIGxpbmUgIiArIGxpbmUsIGJyZWFrc1tsaW5lXSwgbGluZUVuZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1NQQU5fQ09VTlQgPSAxMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBzU3BhblN0YXJ0cyA9IG5ldyBpbnRbTUFYX1NQQU5fQ09VTlRdOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIHNTcGFuRW5kcyA9IG5ldyBpbnRbTUFYX1NQQU5fQ09VTlRdOworCisgICAgcHJpdmF0ZSBzdGF0aWMgTWV0cmljQWZmZWN0aW5nU3BhbiBnZXRNZXRyaWNBZmZlY3RpbmdTcGFuKCkgeworICAgICAgICByZXR1cm4gbmV3IE1ldHJpY0FmZmVjdGluZ1NwYW4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZURyYXdTdGF0ZShUZXh0UGFpbnQgdHApIHsgLyogZW1wdHkgKi8gfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZU1lYXN1cmVTdGF0ZShUZXh0UGFpbnQgcCkgeyAvKiBlbXB0eSAqLyB9CisgICAgICAgIH07CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwbGFjZXMgdGhlICI8Li4uPiIgYmxvY2tzIGJ5IHNwYW5zLCBhc3N1bWluZyBub24gb3ZlcmxhcHBpbmcsIGNvcnJlY3RseSBkZWZpbmVkIHNwYW5zCisgICAgICogQHBhcmFtIHRleHQKKyAgICAgKiBAcmV0dXJuIEEgQ2hhclNlcXVlbmNlIHdpdGggJzwnICc+JyByZXBsYWNlZCBieSBNZXRyaWNBZmZlY3RpbmdTcGFuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQ2hhclNlcXVlbmNlIHNwYW5pZnkoU3RyaW5nIHRleHQpIHsKKyAgICAgICAgaW50IHN0YXJ0SW5kZXggPSB0ZXh0LmluZGV4T2YoJzwnKTsKKyAgICAgICAgaWYgKHN0YXJ0SW5kZXggPCAwKSByZXR1cm4gdGV4dDsKKworICAgICAgICBpbnQgc3BhbkNvdW50ID0gMDsKKyAgICAgICAgZG8geworICAgICAgICAgICAgaW50IGVuZEluZGV4ID0gdGV4dC5pbmRleE9mKCc+Jyk7CisgICAgICAgICAgICBpZiAoZW5kSW5kZXggPCAwKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmJhbGFuY2VkIHNwYW4gbWFya2VycyIpOworCisgICAgICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMCwgc3RhcnRJbmRleCkgKyB0ZXh0LnN1YnN0cmluZyhzdGFydEluZGV4ICsgMSwgZW5kSW5kZXgpCisgICAgICAgICAgICAgICAgICAgICsgdGV4dC5zdWJzdHJpbmcoZW5kSW5kZXggKyAxKTsKKworICAgICAgICAgICAgc1NwYW5TdGFydHNbc3BhbkNvdW50XSA9IHN0YXJ0SW5kZXg7CisgICAgICAgICAgICBzU3BhbkVuZHNbc3BhbkNvdW50XSA9IGVuZEluZGV4IC0gMjsKKyAgICAgICAgICAgIHNwYW5Db3VudCsrOworCisgICAgICAgICAgICBzdGFydEluZGV4ID0gdGV4dC5pbmRleE9mKCc8Jyk7CisgICAgICAgIH0gd2hpbGUgKHN0YXJ0SW5kZXggPj0gMCk7CisKKyAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcih0ZXh0KTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcGFuQ291bnQ7IGkrKykgeworICAgICAgICAgICAgcmVzdWx0LnNldFNwYW4oZ2V0TWV0cmljQWZmZWN0aW5nU3BhbigpLCBzU3BhblN0YXJ0c1tpXSwgc1NwYW5FbmRzW2ldLAorICAgICAgICAgICAgICAgICAgICBTcGFubmVkLlNQQU5fSU5DTFVTSVZFX0lOQ0xVU0lWRSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb0xpbmVCcmVhaygpIHsKKyAgICAgICAgLy8gV2lkdGggbG93ZXIgdGhhbiBXSURUSAorICAgICAgICBsYXlvdXQoIiIsIE5PX0JSRUFLKTsKKyAgICAgICAgbGF5b3V0KCJJIiwgTk9fQlJFQUspOworICAgICAgICBsYXlvdXQoIlYiLCBOT19CUkVBSyk7CisgICAgICAgIGxheW91dCgiWCIsIE5PX0JSRUFLKTsKKyAgICAgICAgbGF5b3V0KCJMIiwgTk9fQlJFQUspOworICAgICAgICBsYXlvdXQoIkkgVklMSSIsIE5PX0JSRUFLKTsKKyAgICAgICAgbGF5b3V0KCJYWFhYIiwgTk9fQlJFQUspOworICAgICAgICBsYXlvdXQoIkxYWFhYIiwgTk9fQlJFQUspOworCisgICAgICAgIC8vIFdpZHRoIGVxdWFsIHRvIFdJRFRICisgICAgICAgIGxheW91dCgiQyIsIE5PX0JSRUFLKTsKKyAgICAgICAgbGF5b3V0KCJMTCIsIE5PX0JSRUFLKTsKKyAgICAgICAgbGF5b3V0KCJMIFhYWFgiLCBOT19CUkVBSyk7CisgICAgICAgIGxheW91dCgiWFhYWFhYWFhYWCIsIE5PX0JSRUFLKTsKKyAgICAgICAgbGF5b3V0KCJYWFggWFhYWFhYIiwgTk9fQlJFQUspOworICAgICAgICBsYXlvdXQoIlhYWCBYWFhYIFgiLCBOT19CUkVBSyk7CisgICAgICAgIGxheW91dCgiWFhYIFhYWFhYICIsIE5PX0JSRUFLKTsKKyAgICAgICAgbGF5b3V0KCIgWFhYWFhYWFggIiwgTk9fQlJFQUspOworICAgICAgICBsYXlvdXQoIiAgWFggIFhYWCAiLCBOT19CUkVBSyk7CisgICAgICAgIC8vICAgICAgMDEyMzQ1Njc4OQorCisgICAgICAgIC8vIFdpZHRoIGdyZWF0ZXIgdGhhbiBXSURUSCwgYnV0IG5vIGJyZWFrCisgICAgICAgIGxheW91dCgiICBYWCAgWFhYICAiLCBOT19CUkVBSyk7CisgICAgICAgIGxheW91dCgiWFggWFhYIFhYWCAiLCBOT19CUkVBSyk7CisgICAgICAgIGxheW91dCgiWFggWFhYIFhYWCAgICAgIiwgTk9fQlJFQUspOworICAgICAgICBsYXlvdXQoIlhYWFhYWFhYWFggICAgICIsIE5PX0JSRUFLKTsKKyAgICAgICAgLy8gICAgICAwMTIzNDU2Nzg5MAorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9uZUxpbmVCcmVhaygpIHsKKyAgICAgICAgLy8gICAgICAwMTIzNDU2Nzg5MAorICAgICAgICBsYXlvdXQoIlhYIFhYWCBYWFhYIiwgbmV3IGludFtdIHs3fSk7CisgICAgICAgIGxheW91dCgiWFggWFhYWCBYWFgiLCBuZXcgaW50W10gezh9KTsKKyAgICAgICAgbGF5b3V0KCJYWCBYWFhYWCBYWCIsIG5ldyBpbnRbXSB7OX0pOworICAgICAgICBsYXlvdXQoIlhYIFhYWFhYWCBYIiwgbmV3IGludFtdIHsxMH0pOworICAgICAgICAvLyAgICAgIDAxMjM0NTY3ODkwCisgICAgICAgIGxheW91dCgiWFhYWFhYWFhYWFgiLCBuZXcgaW50W10gezEwfSk7CisgICAgICAgIGxheW91dCgiWFhYWFhYWFhYIFgiLCBuZXcgaW50W10gezEwfSk7CisgICAgICAgIGxheW91dCgiWFhYWFhYWFggWFgiLCBuZXcgaW50W10gezl9KTsKKyAgICAgICAgbGF5b3V0KCJYWFhYWFhYIFhYWCIsIG5ldyBpbnRbXSB7OH0pOworICAgICAgICBsYXlvdXQoIlhYWFhYWCBYWFhYIiwgbmV3IGludFtdIHs3fSk7CisgICAgICAgIC8vICAgICAgMDEyMzQ1Njc4OTAKKyAgICAgICAgbGF5b3V0KCJMTCBMTCIsIG5ldyBpbnRbXSB7M30pOworICAgICAgICBsYXlvdXQoIkxMTEwiLCBuZXcgaW50W10gezJ9KTsKKyAgICAgICAgbGF5b3V0KCJDIEMiLCBuZXcgaW50W10gezJ9KTsKKyAgICAgICAgbGF5b3V0KCJDQyIsIG5ldyBpbnRbXSB7MX0pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNwYWNlQXRCcmVhaygpIHsKKyAgICAgICAgLy8gICAgICAwMTIzNDU2Nzg5MDEyCisgICAgICAgIGxheW91dCgiWFhYWCBYWFhYWCBYIiwgbmV3IGludFtdIHsxMX0pOworICAgICAgICBsYXlvdXQoIlhYWFhYWFhYWFggWCIsIG5ldyBpbnRbXSB7MTF9KTsKKyAgICAgICAgbGF5b3V0KCJYWFhYWFhYWFhWIFgiLCBuZXcgaW50W10gezExfSk7CisgICAgICAgIGxheW91dCgiQyBYIiwgbmV3IGludFtdIHsyfSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVTcGFjZXNBdEJyZWFrKCkgeworICAgICAgICAvLyAgICAgIDAxMjM0NTY3ODkwMTIKKyAgICAgICAgbGF5b3V0KCJMWFggWFhYWCIsIG5ldyBpbnRbXSB7NH0pOworICAgICAgICBsYXlvdXQoIkxYWCAgWFhYWCIsIG5ldyBpbnRbXSB7NX0pOworICAgICAgICBsYXlvdXQoIkxYWCAgIFhYWFgiLCBuZXcgaW50W10gezZ9KTsKKyAgICAgICAgbGF5b3V0KCJMWFggICAgWFhYWCIsIG5ldyBpbnRbXSB7N30pOworICAgICAgICBsYXlvdXQoIkxYWCAgICAgWFhYWCIsIG5ldyBpbnRbXSB7OH0pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFplcm9XaWR0aENoYXJhY3RlcnMoKSB7CisgICAgICAgIC8vICAgICAgMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNAorICAgICAgICBsYXlvdXQoIlhfWF9YX1hfWF9YX1hfWF9YX1giLCBOT19CUkVBSyk7CisgICAgICAgIGxheW91dCgiX19fWF9YX1hfWF9YX1hfWF9YX1hfWF9fXyIsIE5PX0JSRUFLKTsKKyAgICAgICAgbGF5b3V0KCJDX1giLCBuZXcgaW50W10gezJ9KTsKKyAgICAgICAgbGF5b3V0KCJDX19YIiwgbmV3IGludFtdIHszfSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTm90ZSB0aGF0IHdoZW4gdGhlIHRleHQgaGFzIHNwYW5zLCBTdGF0aWNMYXlvdXQgZG9lcyBub3QgdXNlIHRoZSBwcm92aWRlZCBUZXh0UGFpbnQgdG8KKyAgICAgKiBtZWFzdXJlIHRleHQgcnVucyBhbnltb3JlLiBUaGlzIGlzIHByb2JhYmx5IGEgYnVnLgorICAgICAqIFRvIGJlIGFibGUgdG8gdXNlIHRoZSBmYWtlIHNUZXh0UGFpbnQgYW5kIG1ha2UgdGhpcyB0ZXN0IHBhc3MsIHVzZSBtUGFpbnQgaW5zdGVhZCBvZgorICAgICAqIG1Xb3JrUGFpbnQgaW4gTWVhc3VyZWRUZXh0I2FkZFN0eWxlUnVuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2l0aFNwYW5zKCkgeworICAgICAgICBpZiAoIVNQQU5fVEVTVFNfU1VQUE9SVEVEKSByZXR1cm47CisKKyAgICAgICAgbGF5b3V0KHNwYW5pZnkoIjwwMTIgNDU2IDg5PiIpLCBOT19CUkVBSyk7CisgICAgICAgIGxheW91dChzcGFuaWZ5KCIwMTIgPDQ1Nj4gODkiKSwgTk9fQlJFQUspOworICAgICAgICBsYXlvdXQoc3BhbmlmeSgiPDAxMj4gPDQ1Nj48IDg5PiIpLCBOT19CUkVBSyk7CisgICAgICAgIGxheW91dChzcGFuaWZ5KCI8MDEyPiA8NDU2PiA8ODk+IiksIE5PX0JSRUFLKTsKKworICAgICAgICBsYXlvdXQoc3BhbmlmeSgiPDAxMj4gPDQ1Nj4gPDg5PjAxMiIpLCBuZXcgaW50W10gezh9KTsKKyAgICAgICAgbGF5b3V0KHNwYW5pZnkoIjwwMTI+IDw0NTY+IDg5PDAxMj4iKSwgbmV3IGludFtdIHs4fSk7CisgICAgICAgIGxheW91dChzcGFuaWZ5KCI8MDEyPiA8NDU2PiA8ODk+PDAxMj4iKSwgbmV3IGludFtdIHs4fSk7CisgICAgICAgIGxheW91dChzcGFuaWZ5KCI8MDEyPiA8NDU2PiA4OSA8MTIzPiIpLCBuZXcgaW50W10gezExfSk7CisgICAgICAgIGxheW91dChzcGFuaWZ5KCI8MDEyPiA8NDU2PiA4OTwgMTIzPiIpLCBuZXcgaW50W10gezExfSk7CisgICAgICAgIGxheW91dChzcGFuaWZ5KCI8MDEyPiA8NDU2PiA8ODk+IDwxMjM+IiksIG5ldyBpbnRbXSB7MTF9KTsKKyAgICAgICAgbGF5b3V0KHNwYW5pZnkoIjAxMiA0NTYgODkgPExYWD4gWFggWFgiKSwgbmV3IGludFtdIHsxMSwgMTh9KTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEFkZGluZyBhIHNwYW4gdG8gdGhlIHN0cmluZyBzaG91bGQgbm90IGNoYW5nZSB0aGUgbGF5b3V0LCBzaW5jZSB0aGUgbWV0cmljcyBhcmUgdW5jaGFuZ2VkLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdpdGhPbmVTcGFuKCkgeworICAgICAgICBpZiAoIVNQQU5fVEVTVFNfU1VQUE9SVEVEKSByZXR1cm47CisKKyAgICAgICAgU3RyaW5nW10gdGV4dHMgPSBuZXcgU3RyaW5nW10geyAiMDEyMyIsICIwMTIgNDU2IiwgIjAxMiA0NTYgODkgMTIzIiwgIjAxMiA0NTY3OCAwMTIiLAorICAgICAgICAgICAgICAgICIwMTIgNDU2IDg5MDEyIDQ1NiA4OTAxMiIsICIwMTIzNDU2Nzg5MDEyIiB9OworCisgICAgICAgIE1ldHJpY0FmZmVjdGluZ1NwYW4gbWV0cmljQWZmZWN0aW5nU3BhbiA9IGdldE1ldHJpY0FmZmVjdGluZ1NwYW4oKTsKKworICAgICAgICBmb3IgKFN0cmluZyB0ZXh0IDogdGV4dHMpIHsKKyAgICAgICAgICAgIC8vIEdldCB0aGUgbGluZSBicmVha3Mgd2l0aG91dCBhbnkgc3BhbgorICAgICAgICAgICAgaW50W10gYnJlYWtzID0gZ2V0QnJlYWtzKHRleHQpOworCisgICAgICAgICAgICAvLyBBZGQgc3BhbnMgb24gYWxsIHBvc3NpYmxlIG9mZnNldHMKKyAgICAgICAgICAgIGZvciAoaW50IHNwYW5TdGFydCA9IDA7IHNwYW5TdGFydCA8IHRleHQubGVuZ3RoKCk7IHNwYW5TdGFydCsrKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgc3BhbkVuZCA9IHNwYW5TdGFydDsgc3BhbkVuZCA8IHRleHQubGVuZ3RoKCk7IHNwYW5FbmQrKykgeworICAgICAgICAgICAgICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIHNzYiA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKHRleHQpOworICAgICAgICAgICAgICAgICAgICBzc2Iuc2V0U3BhbihtZXRyaWNBZmZlY3RpbmdTcGFuLCBzcGFuU3RhcnQsIHNwYW5FbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3Bhbm5lZC5TUEFOX0lOQ0xVU0lWRV9JTkNMVVNJVkUpOworICAgICAgICAgICAgICAgICAgICBsYXlvdXQoc3NiLCBicmVha3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdpdGhUd29TcGFucygpIHsKKyAgICAgICAgaWYgKCFTUEFOX1RFU1RTX1NVUFBPUlRFRCkgcmV0dXJuOworCisgICAgICAgIFN0cmluZ1tdIHRleHRzID0gbmV3IFN0cmluZ1tdIHsgIjAxMjMiLCAiMDEyIDQ1NiIsICIwMTIgNDU2IDg5IDEyMyIsICIwMTIgNDU2NzggMDEyIiwKKyAgICAgICAgICAgICAgICAiMDEyIDQ1NiA4OTAxMiA0NTYgODkwMTIiLCAiMDEyMzQ1Njc4OTAxMiIgfTsKKworICAgICAgICBNZXRyaWNBZmZlY3RpbmdTcGFuIG1ldHJpY0FmZmVjdGluZ1NwYW4xID0gZ2V0TWV0cmljQWZmZWN0aW5nU3BhbigpOworICAgICAgICBNZXRyaWNBZmZlY3RpbmdTcGFuIG1ldHJpY0FmZmVjdGluZ1NwYW4yID0gZ2V0TWV0cmljQWZmZWN0aW5nU3BhbigpOworCisgICAgICAgIGZvciAoU3RyaW5nIHRleHQgOiB0ZXh0cykgeworICAgICAgICAgICAgLy8gR2V0IHRoZSBsaW5lIGJyZWFrcyB3aXRob3V0IGFueSBzcGFuCisgICAgICAgICAgICBpbnRbXSBicmVha3MgPSBnZXRCcmVha3ModGV4dCk7CisKKyAgICAgICAgICAgIC8vIEFkZCBzcGFucyBvbiBhbGwgcG9zc2libGUgb2Zmc2V0cworICAgICAgICAgICAgZm9yIChpbnQgc3BhblN0YXJ0MSA9IDA7IHNwYW5TdGFydDEgPCB0ZXh0Lmxlbmd0aCgpOyBzcGFuU3RhcnQxKyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBzcGFuRW5kMSA9IHNwYW5TdGFydDE7IHNwYW5FbmQxIDwgdGV4dC5sZW5ndGgoKTsgc3BhbkVuZDErKykgeworICAgICAgICAgICAgICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIHNzYiA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKHRleHQpOworICAgICAgICAgICAgICAgICAgICBzc2Iuc2V0U3BhbihtZXRyaWNBZmZlY3RpbmdTcGFuMSwgc3BhblN0YXJ0MSwgc3BhbkVuZDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3Bhbm5lZC5TUEFOX0lOQ0xVU0lWRV9JTkNMVVNJVkUpOworCisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IHNwYW5TdGFydDIgPSAwOyBzcGFuU3RhcnQyIDwgdGV4dC5sZW5ndGgoKTsgc3BhblN0YXJ0MisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBzcGFuRW5kMiA9IHNwYW5TdGFydDI7IHNwYW5FbmQyIDwgdGV4dC5sZW5ndGgoKTsgc3BhbkVuZDIrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzYi5zZXRTcGFuKG1ldHJpY0FmZmVjdGluZ1NwYW4yLCBzcGFuU3RhcnQyLCBzcGFuRW5kMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwYW5uZWQuU1BBTl9JTkNMVVNJVkVfSU5DTFVTSVZFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXQoc3NiLCBicmVha3MpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwbGFjZShTdHJpbmcgc3RyaW5nLCBjaGFyIGMsIGNoYXIgcikgeworICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2VBbGwoU3RyaW5nLnZhbHVlT2YoYyksIFN0cmluZy52YWx1ZU9mKHIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXaXRoU3Vycm9nYXRlKCkgeworICAgICAgICBsYXlvdXQoIkxYIiArIFNVUlJfRklSU1QgKyBTVVJSX1NFQ09ORCwgTk9fQlJFQUspOworICAgICAgICBsYXlvdXQoIkxYWFhYIiArIFNVUlJfRklSU1QgKyBTVVJSX1NFQ09ORCwgTk9fQlJFQUspOworICAgICAgICAvLyBMWFhYWEkgKDkxKSArIFNVUlJfRklSU1QgKyBTVVJSX1NFQ09ORCAoMTApLiBEbyBub3QgYnJlYWsgaW4gdGhlIG1pZGRsZSBwb2ludCBvZgorICAgICAgICAvLyBzdXJyb2dhdGdlIHBhaXIuCisgICAgICAgIGxheW91dCgiTFhYWFhJIiArIFNVUlJfRklSU1QgKyBTVVJSX1NFQ09ORCwgbmV3IGludFtdIHs2fSk7CisKKyAgICAgICAgLy8gTFhYWFhJICg5MSkgKyBTVVJSX1NFQ09ORCAocmVwbGFjZWQgd2l0aCBSRVBMQUNFTUVOVCBDSEFSQUNURVIuIHdpZHRoIGlzIDdweCkgZml0cy4KKyAgICAgICAgLy8gQnJlYWsganVzdCBhZnRlciBpbnZhbGlkIHRyYWlsaW5nIHN1cnJvZ2F0ZS4KKyAgICAgICAgbGF5b3V0KCJMWFhYWEkiICsgU1VSUl9TRUNPTkQgKyBTVVJSX0ZJUlNULCBuZXcgaW50W10gezd9KTsKKworICAgICAgICBsYXlvdXQoIkMiICsgU1VSUl9GSVJTVCArIFNVUlJfU0VDT05ELCBuZXcgaW50W10gezF9KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROYXJyb3dXaWR0aCgpIHsKKyAgICAgICAgaW50W10gd2lkdGhzID0gbmV3IGludFtdIHsgMCwgNCwgMTAgfTsKKyAgICAgICAgU3RyaW5nW10gdGV4dHMgPSBuZXcgU3RyaW5nW10geyAiIiwgIlgiLCAiICIsICJYWCIsICIgWCIsICJYWFgiIH07CisKKyAgICAgICAgZm9yIChTdHJpbmcgdGV4dDogdGV4dHMpIHsKKyAgICAgICAgICAgIC8vIDE1IGlzIHN1Y2ggdGhhdCBvbmx5IG9uZSBjaGFyYWN0ZXIgd2lsbCBmaXQKKyAgICAgICAgICAgIGludFtdIGJyZWFrcyA9IGdldEJyZWFrcyh0ZXh0LCAxNSwgTGF5b3V0LkJSRUFLX1NUUkFURUdZX1NJTVBMRSk7CisKKyAgICAgICAgICAgIC8vIFdpZHRoIHVuZGVyIDE1IHNob3VsZCBhbGwgbGVhZCB0byB0aGUgc2FtZSBsaW5lIGJyZWFrCisgICAgICAgICAgICBmb3IgKGludCB3aWR0aDogd2lkdGhzKSB7CisgICAgICAgICAgICAgICAgbGF5b3V0KHRleHQsIGJyZWFrcywgd2lkdGgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmFycm93V2lkdGhaZXJvV2lkdGgoKSB7CisgICAgICAgIGludFtdIHdpZHRocyA9IG5ldyBpbnRbXSB7IDEsIDQgfTsKKyAgICAgICAgZm9yIChpbnQgd2lkdGg6IHdpZHRocykgeworICAgICAgICAgICAgbGF5b3V0KCJYLiIsIG5ldyBpbnRbXSB7MX0sIHdpZHRoKTsKKyAgICAgICAgICAgIGxheW91dCgiWF9fIiwgTk9fQlJFQUssIHdpZHRoKTsKKyAgICAgICAgICAgIGxheW91dCgiWF9fWCIsIG5ldyBpbnRbXSB7M30sIHdpZHRoKTsKKyAgICAgICAgICAgIGxheW91dCgiWF9fWF8iLCBuZXcgaW50W10gezN9LCB3aWR0aCk7CisKKyAgICAgICAgICAgIGxheW91dCgiXyIsIE5PX0JSRUFLLCB3aWR0aCk7CisgICAgICAgICAgICBsYXlvdXQoIl9fIiwgTk9fQlJFQUssIHdpZHRoKTsKKworICAgICAgICAgICAgLy8gVE9ETzogVGhlIGxpbmUgYnJlYWtpbmcgYWxnb3JpdGhtcyBicmVhayB0aGUgbGluZSB0b28gZnJlcXVlbnRseSBpbiB0aGUgcHJlc2VuY2Ugb2YKKyAgICAgICAgICAgIC8vIHplcm8td2lkdGggY2hhcmFjdGVycy4gVGhlIGZvbGxvd2luZyBjYXNlcyBkb2N1bWVudCBob3cgbGluZS1icmVha2luZyBzaG91bGQgYmVoYXZlCisgICAgICAgICAgICAvLyBpbiBzb21lIGNhc2VzLCB3aGVyZSB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBzZWVtIHJlYXNvbmFibGUuIChCcmVha2luZworICAgICAgICAgICAgLy8gYmV0d2VlbiBhIHplcm8td2lkdGggY2hhcmFjdGVyIHRoYXQgc3RhcnQgdGhlIGxpbmUgYW5kIGEgY2hhcmFjdGVyIHdpdGggcG9zaXRpdmUKKyAgICAgICAgICAgIC8vIHdpZHRoIGRvZXMgbm90IG1ha2Ugc2Vuc2UuKSBMaW5lLWJyZWFraW5nIHNob3VsZCBiZSBmaXhlZCBzbyB0aGF0IGFsbCB0aGUgZm9sbG93aW5nCisgICAgICAgICAgICAvLyB0ZXN0cyBlbmQgdXAgb24gb25lIGxpbmUsIHdpdGggbm8gYnJlYWtzLgorICAgICAgICAgICAgLy8gbGF5b3V0KCJfWCIsIE5PX0JSRUFLLCB3aWR0aCk7CisgICAgICAgICAgICAvLyBsYXlvdXQoIl9YXyIsIE5PX0JSRUFLLCB3aWR0aCk7CisgICAgICAgICAgICAvLyBsYXlvdXQoIl9fWF9fIiwgTk9fQlJFQUssIHdpZHRoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1heExpbmVzKCkgeworICAgICAgICBsYXlvdXRNYXhMaW5lcygiQyIsIE5PX0JSRUFLLCAxKTsKKyAgICAgICAgbGF5b3V0TWF4TGluZXMoIkMgQyIsIG5ldyBpbnRbXSB7Mn0sIDEpOworICAgICAgICBsYXlvdXRNYXhMaW5lcygiQyBDIiwgbmV3IGludFtdIHsyfSwgMik7CisgICAgICAgIGxheW91dE1heExpbmVzKCJDQyIsIG5ldyBpbnRbXSB7MX0sIDEpOworICAgICAgICBsYXlvdXRNYXhMaW5lcygiQ0MiLCBuZXcgaW50W10gezF9LCAyKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvY3RzL1N0YXRpY0xheW91dFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9jdHMvU3RhdGljTGF5b3V0VGVzdC5qYXZhCmluZGV4IDFjNWJjYmEuLjA1ZmM5ZTYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9jdHMvU3RhdGljTGF5b3V0VGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9jdHMvU3RhdGljTGF5b3V0VGVzdC5qYXZhCkBAIC0yMSwyNyArMjEsNDYgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTWF0Y2hlcnMuYW55SW50OworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLmFueTsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5tb2NrOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLndoZW47CiAKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQuRm9udE1ldHJpY3NJbnQ7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5UeXBlZmFjZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvY2FsZUxpc3Q7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LkVkaXRhYmxlOwogaW1wb3J0IGFuZHJvaWQudGV4dC5MYXlvdXQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LkxheW91dC5BbGlnbm1lbnQ7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlByZWNvbXB1dGVkVGV4dDsKIGltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nOwogaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmdCdWlsZGVyOwogaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmVkOwogaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmVkU3RyaW5nOwogaW1wb3J0IGFuZHJvaWQudGV4dC5TdGF0aWNMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHREaXJlY3Rpb25IZXVyaXN0aWM7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHREaXJlY3Rpb25IZXVyaXN0aWNzOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0UGFpbnQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzLlRydW5jYXRlQXQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0Lm1ldGhvZC5jdHMuRWRpdG9yU3RhdGU7CitpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlJlcGxhY2VtZW50U3BhbjsKIGltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuU3R5bGVTcGFuOworaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5UZXh0QXBwZWFyYW5jZVNwYW47CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlN1cHByZXNzOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcubW9ja2l0by5Bcmd1bWVudENhcHRvcjsKIAogaW1wb3J0IGphdmEudGV4dC5Ob3JtYWxpemVyOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CkBAIC01OSw2ICs3OCwxMyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMSU5FX0NPVU5UID0gNjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTEFSR0VSX1RIQU5fTElORV9DT1VOVCAgPSA1MDsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT1JFTV9JUFNVTSA9ICJMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIgYWRpcGlzY2luZyAiCisgICAgICAgICAgICArICJlbGl0LCBzZWQgZG8gZWl1c21vZCB0ZW1wb3IgaW5jaWRpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1YS4gVXQgZW5pbSBhZCAiCisgICAgICAgICAgICArICJtaW5pbSB2ZW5pYW0sIHF1aXMgbm9zdHJ1ZCBleGVyY2l0YXRpb24gdWxsYW1jbyBsYWJvcmlzIG5pc2kgdXQgYWxpcXVpcCBleCBlYSAiCisgICAgICAgICAgICArICJjb21tb2RvIGNvbnNlcXVhdC4gRHVpcyBhdXRlIGlydXJlIGRvbG9yIGluIHJlcHJlaGVuZGVyaXQgaW4gdm9sdXB0YXRlIHZlbGl0IGVzc2UgIgorICAgICAgICAgICAgKyAiY2lsbHVtIGRvbG9yZSBldSBmdWdpYXQgbnVsbGEgcGFyaWF0dXIuIEV4Y2VwdGV1ciBzaW50IG9jY2FlY2F0IGN1cGlkYXRhdCBub24gIgorICAgICAgICAgICAgKyAicHJvaWRlbnQsIHN1bnQgaW4gY3VscGEgcXVpIG9mZmljaWEgZGVzZXJ1bnQgbW9sbGl0IGFuaW0gaWQgZXN0IGxhYm9ydW0uIjsKKwogICAgIC8qIHRoZSBmaXJzdCBsaW5lIG11c3QgaGF2ZSBvbmUgdGFiLiB0aGUgb3RoZXJzIG5vdC4gdG90YWxseSA2IGxpbmVzCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2hhclNlcXVlbmNlIExBWU9VVF9URVhUID0gIkNoYXJTZVx0cVxuQ2hhciIKQEAgLTIwMyw4ICsyMjksOCBAQAogICAgICAgICAgICAgLy8gc2V0QnJlYWtTdHJhdGVneSwgc2V0SHlwaGVuYXRpb25GcmVxdWVuY3ksIHNldEluY2x1ZGVQYWQsIGFuZCBzZXRJbmRlbnRzLgogICAgICAgICAgICAgU3RhdGljTGF5b3V0LkJ1aWxkZXIgYnVpbGRlciA9IFN0YXRpY0xheW91dC5CdWlsZGVyLm9idGFpbihMQVlPVVRfVEVYVCwgMCwKICAgICAgICAgICAgICAgICAgICAgTEFZT1VUX1RFWFQubGVuZ3RoKCksIG1EZWZhdWx0UGFpbnQsIERFRkFVTFRfT1VURVJfV0lEVEgpOwotICAgICAgICAgICAgYnVpbGRlci5zZXRCcmVha1N0cmF0ZWd5KFN0YXRpY0xheW91dC5CUkVBS19TVFJBVEVHWV9ISUdIX1FVQUxJVFkpOwotICAgICAgICAgICAgYnVpbGRlci5zZXRIeXBoZW5hdGlvbkZyZXF1ZW5jeShTdGF0aWNMYXlvdXQuSFlQSEVOQVRJT05fRlJFUVVFTkNZX0ZVTEwpOworICAgICAgICAgICAgYnVpbGRlci5zZXRCcmVha1N0cmF0ZWd5KExheW91dC5CUkVBS19TVFJBVEVHWV9ISUdIX1FVQUxJVFkpOworICAgICAgICAgICAgYnVpbGRlci5zZXRIeXBoZW5hdGlvbkZyZXF1ZW5jeShMYXlvdXQuSFlQSEVOQVRJT05fRlJFUVVFTkNZX0ZVTEwpOwogICAgICAgICAgICAgYnVpbGRlci5zZXRJbmNsdWRlUGFkKHRydWUpOwogICAgICAgICAgICAgYnVpbGRlci5zZXRJbmRlbnRzKG51bGwsIG51bGwpOwogICAgICAgICAgICAgU3RhdGljTGF5b3V0IGxheW91dCA9IGJ1aWxkZXIuYnVpbGQoKTsKQEAgLTIxMyw2ICsyMzksMzggQEAKICAgICB9CiAKICAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRMaW5lU3BhY2luZ193aGVyZUxpbmVFbmRzV2l0aE5leHRMaW5lKCkgeworICAgICAgICBmaW5hbCBmbG9hdCBzcGFjaW5nQWRkID0gMTBmOworICAgICAgICBmaW5hbCBmbG9hdCBzcGFjaW5nTXVsdCA9IDNmOworCisgICAgICAgIC8vIHR3byBsaW5lcyBvZiB0ZXh0LCB3aXRoIGxpbmUgc3BhY2luZywgZmlyc3QgbGluZSB3aWxsIGhhdmUgdGhlIHNwYWNpbmcsIGJ1dCBsYXN0IGxpbmUKKyAgICAgICAgLy8gd29udCBoYXZlIHRoZSBzcGFjaW5nCisgICAgICAgIGZpbmFsIFN0cmluZyB0bXBUZXh0ID0gImFcbmIiOworICAgICAgICBTdGF0aWNMYXlvdXQuQnVpbGRlciBidWlsZGVyID0gU3RhdGljTGF5b3V0LkJ1aWxkZXIub2J0YWluKHRtcFRleHQsIDAsIHRtcFRleHQubGVuZ3RoKCksCisgICAgICAgICAgICAgICAgbURlZmF1bHRQYWludCwgREVGQVVMVF9PVVRFUl9XSURUSCk7CisgICAgICAgIGJ1aWxkZXIuc2V0TGluZVNwYWNpbmcoc3BhY2luZ0FkZCwgc3BhY2luZ011bHQpLnNldEluY2x1ZGVQYWQoZmFsc2UpOworICAgICAgICBmaW5hbCBTdGF0aWNMYXlvdXQgY29tcGFyaXNvbkxheW91dCA9IGJ1aWxkZXIuYnVpbGQoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgY29tcGFyaXNvbkxheW91dC5nZXRMaW5lQ291bnQoKSk7CisgICAgICAgIGZpbmFsIGludCBoZWlnaHRXaXRoTGluZVNwYWNpbmcgPSBjb21wYXJpc29uTGF5b3V0LmdldExpbmVCb3R0b20oMCkKKyAgICAgICAgICAgICAgICAtIGNvbXBhcmlzb25MYXlvdXQuZ2V0TGluZVRvcCgwKTsKKyAgICAgICAgZmluYWwgaW50IGhlaWdodFdpdGhvdXRMaW5lU3BhY2luZyA9IGNvbXBhcmlzb25MYXlvdXQuZ2V0TGluZUJvdHRvbSgxKQorICAgICAgICAgICAgICAgIC0gY29tcGFyaXNvbkxheW91dC5nZXRMaW5lVG9wKDEpOworICAgICAgICBhc3NlcnRUcnVlKGhlaWdodFdpdGhMaW5lU3BhY2luZyA+IGhlaWdodFdpdGhvdXRMaW5lU3BhY2luZyk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHRleHQgPSAiYVxuIjsKKyAgICAgICAgLy8gYnVpbGQgdGhlIGxheW91dCB0byBiZSB0ZXN0ZWQKKyAgICAgICAgYnVpbGRlciA9IFN0YXRpY0xheW91dC5CdWlsZGVyLm9idGFpbigiYVxuIiwgMCwgdGV4dC5sZW5ndGgoKSwgbURlZmF1bHRQYWludCwKKyAgICAgICAgICAgICAgICBERUZBVUxUX09VVEVSX1dJRFRIKTsKKyAgICAgICAgYnVpbGRlci5zZXRMaW5lU3BhY2luZyhzcGFjaW5nQWRkLCBzcGFjaW5nTXVsdCkuc2V0SW5jbHVkZVBhZChmYWxzZSk7CisgICAgICAgIGZpbmFsIFN0YXRpY0xheW91dCBsYXlvdXQgPSBidWlsZGVyLmJ1aWxkKCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbXBhcmlzb25MYXlvdXQuZ2V0TGluZUNvdW50KCksIGxheW91dC5nZXRMaW5lQ291bnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhoZWlnaHRXaXRoTGluZVNwYWNpbmcsIGxheW91dC5nZXRMaW5lQm90dG9tKDApIC0gbGF5b3V0LmdldExpbmVUb3AoMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoaGVpZ2h0V2l0aG91dExpbmVTcGFjaW5nLCBsYXlvdXQuZ2V0TGluZUJvdHRvbSgxKSAtIGxheW91dC5nZXRMaW5lVG9wKDEpKTsKKyAgICB9CisKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RCdWlsZGVyX3NldEp1c3RpZmljYXRpb25Nb2RlKCkgewogICAgICAgICBTdGF0aWNMYXlvdXQuQnVpbGRlciBidWlsZGVyID0gU3RhdGljTGF5b3V0LkJ1aWxkZXIub2J0YWluKExBWU9VVF9URVhULCAwLAogICAgICAgICAgICAgICAgIExBWU9VVF9URVhULmxlbmd0aCgpLCBtRGVmYXVsdFBhaW50LCBERUZBVUxUX09VVEVSX1dJRFRIKTsKQEAgLTIyMiw2ICsyODAsNyBAQAogICAgICAgICAvLyB3aXRob3V0IGNhdXNpbmcgYW55IGV4Y2VwdGlvbnMuCiAgICAgICAgIGFzc2VydE5vdE51bGwobGF5b3V0KTsKICAgICB9CisKICAgICAvKgogICAgICAqIEdldCB0aGUgbGluZSBudW1iZXIgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIHZlcnRpY2FsIHBvc2l0aW9uLgogICAgICAqICBJZiB5b3UgYXNrIGZvciBhIHBvc2l0aW9uIGFib3ZlIDAsIHlvdSBnZXQgMC4gYWJvdmUgMCBtZWFucyBwaXhlbCBhYm92ZSB0aGUgZmlyZSBsaW5lCkBAIC0xMTkwLDQgKzEyNDksMjkyIEBACiAgICAgICAgICAgICAgICAgLnNldEVsbGlwc2l6ZShUcnVuY2F0ZUF0LkVORCkuYnVpbGQoKTsKICAgICAgICAgbGF5b3V0LmdldFByaW1hcnlIb3Jpem9udGFsKGxheW91dC5nZXRUZXh0KCkubGVuZ3RoKCkpOwogICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5lZ2F0aXZlV2lkdGgoKSB7CisgICAgICAgIFN0YXRpY0xheW91dC5CdWlsZGVyLm9idGFpbigiYSIsIDAsIDEsIG5ldyBUZXh0UGFpbnQoKSwgNSkKKyAgICAgICAgICAgIC5zZXRJbmRlbnRzKG5ldyBpbnRbXSB7IDEwIH0sIG5ldyBpbnRbXSB7IDEwIH0pCisgICAgICAgICAgICAuc2V0QnJlYWtTdHJhdGVneShMYXlvdXQuQlJFQUtfU1RSQVRFR1lfSElHSF9RVUFMSVRZKS5idWlsZCgpOworICAgICAgICBTdGF0aWNMYXlvdXQuQnVpbGRlci5vYnRhaW4oImEiLCAwLCAxLCBuZXcgVGV4dFBhaW50KCksIDUpCisgICAgICAgICAgICAuc2V0SW5kZW50cyhuZXcgaW50W10geyAxMCB9LCBuZXcgaW50W10geyAxMCB9KQorICAgICAgICAgICAgLnNldEJyZWFrU3RyYXRlZ3koTGF5b3V0LkJSRUFLX1NUUkFURUdZX1NJTVBMRSkuYnVpbGQoKTsKKyAgICAgICAgU3RhdGljTGF5b3V0LkJ1aWxkZXIub2J0YWluKCJhIiwgMCwgMSwgbmV3IFRleHRQYWludCgpLCA1KQorICAgICAgICAgICAgLnNldEluZGVudHMobmV3IGludFtdIHsgMTAgfSwgbmV3IGludFtdIHsgMTAgfSkKKyAgICAgICAgICAgIC5zZXRCcmVha1N0cmF0ZWd5KExheW91dC5CUkVBS19TVFJBVEVHWV9CQUxBTkNFRCkuYnVpbGQoKTsKKyAgICB9CisKKyAgICAvLyBUT0RPOiBSZS1lbmFibGUgb25jZSBodHRwOi8vYi82NTIwNzcwMSBpcyBmaXhlZC4KKyAgICBAVGVzdAorICAgIEBTdXBwcmVzcworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRMaW5lV2lkdGgoKSB7CisgICAgICAgIGZpbmFsIGZsb2F0IHdob2xlV2lkdGggPSBtRGVmYXVsdFBhaW50Lm1lYXN1cmVUZXh0KExPUkVNX0lQU1VNKTsKKyAgICAgICAgZmluYWwgaW50IGxpbmVXaWR0aCA9IChpbnQpICh3aG9sZVdpZHRoIC8gMTAuMGYpOyAgLy8gTWFrZSAxMCBsaW5lcyBwZXIgcGFyYWdyYXBoLgorICAgICAgICBmaW5hbCBTdHJpbmcgbXVsdGlQYXJhVGVzdFN0cmluZyA9CisgICAgICAgICAgICAgICAgTE9SRU1fSVBTVU0gKyAiXG4iICsgTE9SRU1fSVBTVU0gKyAiXG4iICsgTE9SRU1fSVBTVU0gKyAiXG4iICsgTE9SRU1fSVBTVU07CisgICAgICAgIGZpbmFsIExheW91dCBsYXlvdXQgPSBTdGF0aWNMYXlvdXQuQnVpbGRlci5vYnRhaW4obXVsdGlQYXJhVGVzdFN0cmluZywgMCwKKyAgICAgICAgICAgICAgICBtdWx0aVBhcmFUZXN0U3RyaW5nLmxlbmd0aCgpLCBtRGVmYXVsdFBhaW50LCBsaW5lV2lkdGgpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGF5b3V0LmdldExpbmVDb3VudCgpOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUobGF5b3V0LmdldExpbmVXaWR0aChpKSA8PSBsaW5lV2lkdGgpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVE9ETzogUmUtZW5hYmxlIG9uY2UgaHR0cDovL2IvNjUyMDc3MDEgaXMgZml4ZWQuCisgICAgQFRlc3QKKyAgICBAU3VwcHJlc3MKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5kZW50KCkgeworICAgICAgICBmaW5hbCBmbG9hdCB3aG9sZVdpZHRoID0gbURlZmF1bHRQYWludC5tZWFzdXJlVGV4dChMT1JFTV9JUFNVTSk7CisgICAgICAgIGZpbmFsIGludCBsaW5lV2lkdGggPSAoaW50KSAod2hvbGVXaWR0aCAvIDEwLjBmKTsgIC8vIE1ha2UgMTAgbGluZXMgcGVyIHBhcmFncmFwaC4KKyAgICAgICAgZmluYWwgaW50IGluZGVudFdpZHRoID0gKGludCkgKGxpbmVXaWR0aCAqIDAuM2YpOyAgLy8gTWFrZSAzMCUgaW5kZW50LgorICAgICAgICBmaW5hbCBTdHJpbmcgbXVsdGlQYXJhVGVzdFN0cmluZyA9CisgICAgICAgICAgICAgICAgTE9SRU1fSVBTVU0gKyAiXG4iICsgTE9SRU1fSVBTVU0gKyAiXG4iICsgTE9SRU1fSVBTVU0gKyAiXG4iICsgTE9SRU1fSVBTVU07CisgICAgICAgIGZpbmFsIExheW91dCBsYXlvdXQgPSBTdGF0aWNMYXlvdXQuQnVpbGRlci5vYnRhaW4obXVsdGlQYXJhVGVzdFN0cmluZywgMCwKKyAgICAgICAgICAgICAgICBtdWx0aVBhcmFUZXN0U3RyaW5nLmxlbmd0aCgpLCBtRGVmYXVsdFBhaW50LCBsaW5lV2lkdGgpCisgICAgICAgICAgICAgICAgLnNldEluZGVudHMobmV3IGludFtdIHsgaW5kZW50V2lkdGggfSwgbnVsbCkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsYXlvdXQuZ2V0TGluZUNvdW50KCk7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShsYXlvdXQuZ2V0TGluZVdpZHRoKGkpIDw9IGxpbmVXaWR0aCAtIGluZGVudFdpZHRoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEJpdG1hcCBkcmF3VG9CaXRtYXAoTGF5b3V0IGwpIHsKKyAgICAgICAgZmluYWwgQml0bWFwIGJtcCA9IEJpdG1hcC5jcmVhdGVCaXRtYXAobC5nZXRXaWR0aCgpLCBsLmdldEhlaWdodCgpLCBCaXRtYXAuQ29uZmlnLlJHQl81NjUpOworICAgICAgICBmaW5hbCBDYW52YXMgYyA9IG5ldyBDYW52YXMoYm1wKTsKKworICAgICAgICBjLnNhdmUoKTsKKyAgICAgICAgYy50cmFuc2xhdGUoMCwgMCk7CisgICAgICAgIGwuZHJhdyhjKTsKKyAgICAgICAgYy5yZXN0b3JlKCk7CisgICAgICAgIHJldHVybiBibXA7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRleHRQYWludFRvU3RyaW5nKFRleHRQYWludCBwKSB7CisgICAgICAgIHJldHVybiAieyIKKyAgICAgICAgICAgICsgIm1UZXh0U2l6ZT0iICsgcC5nZXRUZXh0U2l6ZSgpICsgIiwgIgorICAgICAgICAgICAgKyAibVRleHRTa2V3WD0iICsgcC5nZXRUZXh0U2tld1goKSArICIsICIKKyAgICAgICAgICAgICsgIm1UZXh0U2NhbGVYPSIgKyBwLmdldFRleHRTY2FsZVgoKSArICIsICIKKyAgICAgICAgICAgICsgIm1MZXR0ZXJTcGFjaW5nPSIgKyBwLmdldExldHRlclNwYWNpbmcoKSArICIsICIKKyAgICAgICAgICAgICsgIm1GbGFncz0iICsgcC5nZXRGbGFncygpICsgIiwgIgorICAgICAgICAgICAgKyAibVRleHRMb2NhbGVzPSIgKyBwLmdldFRleHRMb2NhbGVzKCkgKyAiLCAiCisgICAgICAgICAgICArICJtRm9udFZhcmlhdGlvblNldHRpbmdzPSIgKyBwLmdldEZvbnRWYXJpYXRpb25TZXR0aW5ncygpICsgIiwgIgorICAgICAgICAgICAgKyAibVR5cGVmYWNlPSIgKyBwLmdldFR5cGVmYWNlKCkgKyAiLCAiCisgICAgICAgICAgICArICJtRm9udEZlYXR1cmVTZXR0aW5ncz0iICsgcC5nZXRGb250RmVhdHVyZVNldHRpbmdzKCkKKyAgICAgICAgICAgICsgIn0iOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBkaXJlY3Rpb25Ub1N0cmluZyhUZXh0RGlyZWN0aW9uSGV1cmlzdGljIGRpcikgeworICAgICAgICBpZiAoZGlyID09IFRleHREaXJlY3Rpb25IZXVyaXN0aWNzLkxUUikgeworICAgICAgICAgICAgcmV0dXJuICJMVFIiOworICAgICAgICB9IGVsc2UgaWYgKGRpciA9PSBUZXh0RGlyZWN0aW9uSGV1cmlzdGljcy5SVEwpIHsKKyAgICAgICAgICAgIHJldHVybiAiUlRMIjsKKyAgICAgICAgfSBlbHNlIGlmIChkaXIgPT0gVGV4dERpcmVjdGlvbkhldXJpc3RpY3MuRklSU1RTVFJPTkdfTFRSKSB7CisgICAgICAgICAgICByZXR1cm4gIkZJUlNUU1RST05HX0xUUiI7CisgICAgICAgIH0gZWxzZSBpZiAoZGlyID09IFRleHREaXJlY3Rpb25IZXVyaXN0aWNzLkZJUlNUU1RST05HX1JUTCkgeworICAgICAgICAgICAgcmV0dXJuICJGSVJTVFNUUk9OR19SVEwiOworICAgICAgICB9IGVsc2UgaWYgKGRpciA9PSBUZXh0RGlyZWN0aW9uSGV1cmlzdGljcy5BTllSVExfTFRSKSB7CisgICAgICAgICAgICByZXR1cm4gIkFOWVJUTF9MVFIiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVua25vd24gRGlyZWN0aW9uIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgTGF5b3V0UGFyYW0geworICAgICAgICBmaW5hbCBpbnQgbVN0cmF0ZWd5OworICAgICAgICBmaW5hbCBpbnQgbUZyZXF1ZW5jeTsKKyAgICAgICAgZmluYWwgVGV4dFBhaW50IG1QYWludDsKKyAgICAgICAgZmluYWwgVGV4dERpcmVjdGlvbkhldXJpc3RpYyBtRGlyOworCisgICAgICAgIExheW91dFBhcmFtKGludCBzdHJhdGVneSwgaW50IGZyZXF1ZW5jeSwgVGV4dFBhaW50IHBhaW50LCBUZXh0RGlyZWN0aW9uSGV1cmlzdGljIGRpcikgeworICAgICAgICAgICAgbVN0cmF0ZWd5ID0gc3RyYXRlZ3k7CisgICAgICAgICAgICBtRnJlcXVlbmN5ID0gZnJlcXVlbmN5OworICAgICAgICAgICAgbVBhaW50ID0gbmV3IFRleHRQYWludChwYWludCk7CisgICAgICAgICAgICBtRGlyID0gZGlyOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gInsiCisgICAgICAgICAgICAgICAgKyAibVN0cmF0ZWd5PSIgKyBtU3RyYXRlZ3kgKyAiLCAiCisgICAgICAgICAgICAgICAgKyAibUZyZXF1ZW5jeT0iICsgbUZyZXF1ZW5jeSArICIsICIKKyAgICAgICAgICAgICAgICArICJtUGFpbnQ9IiArIHRleHRQYWludFRvU3RyaW5nKG1QYWludCkgKyAiLCAiCisgICAgICAgICAgICAgICAgKyAibURpcj0iICsgZGlyZWN0aW9uVG9TdHJpbmcobURpcikKKyAgICAgICAgICAgICAgICArICJ9IjsKKworICAgICAgICB9CisKKyAgICAgICAgTGF5b3V0IGdldExheW91dChDaGFyU2VxdWVuY2UgdGV4dCwgaW50IHdpZHRoKSB7CisgICAgICAgICAgICByZXR1cm4gU3RhdGljTGF5b3V0LkJ1aWxkZXIub2J0YWluKHRleHQsIDAsIHRleHQubGVuZ3RoKCksIG1QYWludCwgd2lkdGgpCisgICAgICAgICAgICAgICAgLnNldEJyZWFrU3RyYXRlZ3kobVN0cmF0ZWd5KS5zZXRIeXBoZW5hdGlvbkZyZXF1ZW5jeShtRnJlcXVlbmN5KQorICAgICAgICAgICAgICAgIC5zZXRUZXh0RGlyZWN0aW9uKG1EaXIpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBQcmVjb21wdXRlZFRleHQgZ2V0UHJlY29tcHV0ZWRUZXh0KENoYXJTZXF1ZW5jZSB0ZXh0KSB7CisgICAgICAgICAgICBQcmVjb21wdXRlZFRleHQuUGFyYW1zIHBhcmFtID0gbmV3IFByZWNvbXB1dGVkVGV4dC5QYXJhbXMuQnVpbGRlcihtUGFpbnQpCisgICAgICAgICAgICAgICAgICAgIC5zZXRCcmVha1N0cmF0ZWd5KG1TdHJhdGVneSkKKyAgICAgICAgICAgICAgICAgICAgLnNldEh5cGhlbmF0aW9uRnJlcXVlbmN5KG1GcmVxdWVuY3kpCisgICAgICAgICAgICAgICAgICAgIC5zZXRUZXh0RGlyZWN0aW9uKG1EaXIpLmJ1aWxkKCk7CisgICAgICAgICAgICByZXR1cm4gUHJlY29tcHV0ZWRUZXh0LmNyZWF0ZSh0ZXh0LCBwYXJhbSk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgdm9pZCBhc3NlcnRTYW1lU3RhdGljTGF5b3V0KENoYXJTZXF1ZW5jZSB0ZXh0LCBMYXlvdXRQYXJhbSBtZWFzdXJlZFRleHRQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGF5b3V0UGFyYW0gc3RhdGljTGF5b3V0UGFyYW0pIHsKKyAgICAgICAgU3RyaW5nIG1zZyA9ICJTdGF0aWNMYXlvdXQgZm9yICIgKyBzdGF0aWNMYXlvdXRQYXJhbSArICIgd2l0aCBQcmVjb21wdXRlZFRleHQiCisgICAgICAgICAgICAgICAgKyAiIGNyZWF0ZWQgd2l0aCAiICsgbWVhc3VyZWRUZXh0UGFyYW0gKyAiIG11c3Qgb3V0cHV0IHRoZSBzYW1lIEJNUC4iOworCisgICAgICAgIGZpbmFsIGZsb2F0IHdob2xlV2lkdGggPSBtRGVmYXVsdFBhaW50Lm1lYXN1cmVUZXh0KHRleHQudG9TdHJpbmcoKSk7CisgICAgICAgIGZpbmFsIGludCBsaW5lV2lkdGggPSAoaW50KSAod2hvbGVXaWR0aCAvIDEwLjBmKTsgIC8vIE1ha2UgMTAgbGluZXMgcGVyIHBhcmFncmFwaC4KKworICAgICAgICAvLyBTdGF0aWMgbGF5b3V0IHBhcmFtZXRlciBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIGZpbmFsIG91dHB1dC4KKyAgICAgICAgZmluYWwgTGF5b3V0IGV4cGVjdGVkTGF5b3V0ID0gc3RhdGljTGF5b3V0UGFyYW0uZ2V0TGF5b3V0KHRleHQsIGxpbmVXaWR0aCk7CisKKyAgICAgICAgZmluYWwgUHJlY29tcHV0ZWRUZXh0IG10ID0gbWVhc3VyZWRUZXh0UGFyYW0uZ2V0UHJlY29tcHV0ZWRUZXh0KHRleHQpOworICAgICAgICBmaW5hbCBMYXlvdXQgcmVzdWx0TGF5b3V0ID0gU3RhdGljTGF5b3V0LkJ1aWxkZXIub2J0YWluKG10LCAwLCBtdC5sZW5ndGgoKSwKKyAgICAgICAgICAgICAgICBzdGF0aWNMYXlvdXRQYXJhbS5tUGFpbnQsIGxpbmVXaWR0aCkKKyAgICAgICAgICAgICAgICAuc2V0QnJlYWtTdHJhdGVneShzdGF0aWNMYXlvdXRQYXJhbS5tU3RyYXRlZ3kpCisgICAgICAgICAgICAgICAgLnNldEh5cGhlbmF0aW9uRnJlcXVlbmN5KHN0YXRpY0xheW91dFBhcmFtLm1GcmVxdWVuY3kpCisgICAgICAgICAgICAgICAgLnNldFRleHREaXJlY3Rpb24oc3RhdGljTGF5b3V0UGFyYW0ubURpcikuYnVpbGQoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMobXNnLCBleHBlY3RlZExheW91dC5nZXRIZWlnaHQoKSwgcmVzdWx0TGF5b3V0LmdldEhlaWdodCgpLCAwLjBmKTsKKworICAgICAgICBmaW5hbCBCaXRtYXAgZXhwZWN0ZWRCTVAgPSBkcmF3VG9CaXRtYXAoZXhwZWN0ZWRMYXlvdXQpOworICAgICAgICBmaW5hbCBCaXRtYXAgcmVzdWx0Qk1QID0gZHJhd1RvQml0bWFwKHJlc3VsdExheW91dCk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShtc2csIHJlc3VsdEJNUC5zYW1lQXMoZXhwZWN0ZWRCTVApKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcmVjb21wdXRlZFRleHQoKSB7CisgICAgICAgIGludFtdIGJyZWFrcyA9IHsKKyAgICAgICAgICAgIExheW91dC5CUkVBS19TVFJBVEVHWV9TSU1QTEUsCisgICAgICAgICAgICBMYXlvdXQuQlJFQUtfU1RSQVRFR1lfSElHSF9RVUFMSVRZLAorICAgICAgICAgICAgTGF5b3V0LkJSRUFLX1NUUkFURUdZX0JBTEFOQ0VELAorICAgICAgICB9OworCisgICAgICAgIGludFtdIGZyZXF1ZW5jaWVzID0geworICAgICAgICAgICAgTGF5b3V0LkhZUEhFTkFUSU9OX0ZSRVFVRU5DWV9OT1JNQUwsCisgICAgICAgICAgICBMYXlvdXQuSFlQSEVOQVRJT05fRlJFUVVFTkNZX0ZVTEwsCisgICAgICAgICAgICBMYXlvdXQuSFlQSEVOQVRJT05fRlJFUVVFTkNZX05PTkUsCisgICAgICAgIH07CisKKyAgICAgICAgVGV4dERpcmVjdGlvbkhldXJpc3RpY1tdIGRpcnMgPSB7CisgICAgICAgICAgICBUZXh0RGlyZWN0aW9uSGV1cmlzdGljcy5MVFIsCisgICAgICAgICAgICBUZXh0RGlyZWN0aW9uSGV1cmlzdGljcy5SVEwsCisgICAgICAgICAgICBUZXh0RGlyZWN0aW9uSGV1cmlzdGljcy5GSVJTVFNUUk9OR19MVFIsCisgICAgICAgICAgICBUZXh0RGlyZWN0aW9uSGV1cmlzdGljcy5GSVJTVFNUUk9OR19SVEwsCisgICAgICAgICAgICBUZXh0RGlyZWN0aW9uSGV1cmlzdGljcy5BTllSVExfTFRSLAorICAgICAgICB9OworCisgICAgICAgIGZsb2F0W10gdGV4dFNpemVzID0geworICAgICAgICAgICAgOC4wZiwgMTYuMGYsIDMyLjBmCisgICAgICAgIH07CisKKyAgICAgICAgTG9jYWxlTGlzdFtdIGxvY2FsZXMgPSB7CisgICAgICAgICAgICBMb2NhbGVMaXN0LmZvckxhbmd1YWdlVGFncygiZW4tVVMiKSwKKyAgICAgICAgICAgIExvY2FsZUxpc3QuZm9yTGFuZ3VhZ2VUYWdzKCJqYS1KUCIpLAorICAgICAgICAgICAgTG9jYWxlTGlzdC5mb3JMYW5ndWFnZVRhZ3MoImVuLVVTLGphLUpQIiksCisgICAgICAgIH07CisKKyAgICAgICAgVGV4dFBhaW50IHBhaW50ID0gbmV3IFRleHRQYWludCgpOworCisgICAgICAgIC8vIElmIHRoZSBQcmVjb21wdXRlZFRleHQgaXMgY3JlYXRlZCB3aXRoIHRoZSBzYW1lIGFyZ3VtZW50IG9mIHRoZSBTdGF0aWNMYXlvdXQsIGdlbmVyYXRlCisgICAgICAgIC8vIHRoZSBzYW1lIGJpdG1hcC4KKyAgICAgICAgZm9yIChpbnQgYiA6IGJyZWFrcykgeworICAgICAgICAgICAgZm9yIChpbnQgZiA6IGZyZXF1ZW5jaWVzKSB7CisgICAgICAgICAgICAgICAgZm9yIChUZXh0RGlyZWN0aW9uSGV1cmlzdGljIGRpciA6IGRpcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChmbG9hdCB0ZXh0U2l6ZSA6IHRleHRTaXplcykgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChMb2NhbGVMaXN0IGxvY2FsZSA6IGxvY2FsZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWludC5zZXRUZXh0U2l6ZSh0ZXh0U2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFpbnQuc2V0VGV4dExvY2FsZXMobG9jYWxlKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFNhbWVTdGF0aWNMYXlvdXQoTE9SRU1fSVBTVU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTGF5b3V0UGFyYW0oYiwgZiwgcGFpbnQsIGRpciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTGF5b3V0UGFyYW0oYiwgZiwgcGFpbnQsIGRpcikpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgdGhlIHBhcmFtZXRlcnMgYXJlIGRpZmZlcmVudCwgdGhlIG91dHB1dCBvZiB0aGUgc3RhdGljIGxheW91dCBtdXN0IGJlCisgICAgICAgIC8vIHNhbWUgYml0bWFwLgorICAgICAgICBmb3IgKGludCBiaSA9IDA7IGJpIDwgYnJlYWtzLmxlbmd0aDsgYmkrKykgeworICAgICAgICAgICAgZm9yIChpbnQgZmkgPSAwOyBmaSA8IGZyZXF1ZW5jaWVzLmxlbmd0aDsgZmkrKykgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGRpcmkgPSAwOyBkaXJpIDwgZGlycy5sZW5ndGg7IGRpcmkrKykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBzaXplaSA9IDA7IHNpemVpIDwgdGV4dFNpemVzLmxlbmd0aDsgc2l6ZWkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbG9jYWxlaSA9IDA7IGxvY2FsZWkgPCBsb2NhbGVzLmxlbmd0aDsgbG9jYWxlaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFBhaW50IHAxID0gbmV3IFRleHRQYWludCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCBwMiA9IG5ldyBUZXh0UGFpbnQoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAxLnNldFRleHRTaXplKHRleHRTaXplc1tzaXplaV0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAyLnNldFRleHRTaXplKHRleHRTaXplc1soc2l6ZWkgKyAxKSAlIHRleHRTaXplcy5sZW5ndGhdKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAxLnNldFRleHRMb2NhbGVzKGxvY2FsZXNbbG9jYWxlaV0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAyLnNldFRleHRMb2NhbGVzKGxvY2FsZXNbKGxvY2FsZWkgKyAxKSAlIGxvY2FsZXMubGVuZ3RoXSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYjEgPSBicmVha3NbYmldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiMiA9IGJyZWFrc1soYmkgKyAxKSAlIGJyZWFrcy5sZW5ndGhdOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGYxID0gZnJlcXVlbmNpZXNbZmldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmMiA9IGZyZXF1ZW5jaWVzWyhmaSArIDEpICUgZnJlcXVlbmNpZXMubGVuZ3RoXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHREaXJlY3Rpb25IZXVyaXN0aWMgZGlyMSA9IGRpcnNbZGlyaV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dERpcmVjdGlvbkhldXJpc3RpYyBkaXIyID0gZGlyc1soZGlyaSArIDEpICUgZGlycy5sZW5ndGhdOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0U2FtZVN0YXRpY0xheW91dChMT1JFTV9JUFNVTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBMYXlvdXRQYXJhbShiMSwgZjEsIHAxLCBkaXIxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBMYXlvdXRQYXJhbShiMiwgZjIsIHAyLCBkaXIyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcGxhY2VtZW50Rm9udE1ldHJpY3NUZXN0KCkgeworICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKS5nZXRUYXJnZXRDb250ZXh0KCk7CisKKyAgICAgICAgVHlwZWZhY2UgdGYgPSBuZXcgVHlwZWZhY2UuQnVpbGRlcihjb250ZXh0LmdldEFzc2V0cygpLCAiZm9udHMvc2FtcGxlZm9udC50dGYiKS5idWlsZCgpOworICAgICAgICBhc3NlcnROb3ROdWxsKHRmKTsKKyAgICAgICAgVGV4dFBhaW50IHBhaW50ID0gbmV3IFRleHRQYWludCgpOworICAgICAgICBwYWludC5zZXRUeXBlZmFjZSh0Zik7CisKKyAgICAgICAgUmVwbGFjZW1lbnRTcGFuIGZpcnN0UmVwbGFjZW1lbnQgPSBtb2NrKFJlcGxhY2VtZW50U3Bhbi5jbGFzcyk7CisgICAgICAgIEFyZ3VtZW50Q2FwdG9yPEZvbnRNZXRyaWNzSW50PiBmbTFDYXB0b3IgPSBBcmd1bWVudENhcHRvci5mb3JDbGFzcyhGb250TWV0cmljc0ludC5jbGFzcyk7CisgICAgICAgIHdoZW4oZmlyc3RSZXBsYWNlbWVudC5nZXRTaXplKAorICAgICAgICAgICAgYW55KFBhaW50LmNsYXNzKSwgYW55KENoYXJTZXF1ZW5jZS5jbGFzcyksIGFueUludCgpLCBhbnlJbnQoKSwKKyAgICAgICAgICAgIGZtMUNhcHRvci5jYXB0dXJlKCkpKS50aGVuUmV0dXJuKDApOworICAgICAgICBUZXh0QXBwZWFyYW5jZVNwYW4gZmlyc3RTdHlsZVNwYW4gPSBuZXcgVGV4dEFwcGVhcmFuY2VTcGFuKAorICAgICAgICAgICAgICAgIG51bGwgLyogZmFtaWx5ICovLCBUeXBlZmFjZS5OT1JNQUwgLyogc3R5bGUgKi8sIDEwMCAvKiB0ZXh0IHNpemUsIDFlbSA9IDEwMHB4ICovLAorICAgICAgICAgICAgICAgIG51bGwgLyogdGV4dCBjb2xvciAqLywgbnVsbCAvKiBsaW5rIGNvbG9yICovKTsKKworICAgICAgICBSZXBsYWNlbWVudFNwYW4gc2Vjb25kUmVwbGFjZW1lbnQgPSBtb2NrKFJlcGxhY2VtZW50U3Bhbi5jbGFzcyk7CisgICAgICAgIEFyZ3VtZW50Q2FwdG9yPEZvbnRNZXRyaWNzSW50PiBmbTJDYXB0b3IgPSBBcmd1bWVudENhcHRvci5mb3JDbGFzcyhGb250TWV0cmljc0ludC5jbGFzcyk7CisgICAgICAgIHdoZW4oc2Vjb25kUmVwbGFjZW1lbnQuZ2V0U2l6ZSgKKyAgICAgICAgICAgIGFueShQYWludC5jbGFzcyksIGFueShDaGFyU2VxdWVuY2UuY2xhc3MpLCBhbnkoSW50ZWdlci5jbGFzcyksIGFueShJbnRlZ2VyLmNsYXNzKSwKKyAgICAgICAgICAgIGZtMkNhcHRvci5jYXB0dXJlKCkpKS50aGVuUmV0dXJuKDApOworICAgICAgICBUZXh0QXBwZWFyYW5jZVNwYW4gc2Vjb25kU3R5bGVTcGFuID0gbmV3IFRleHRBcHBlYXJhbmNlU3BhbigKKyAgICAgICAgICAgICAgICBudWxsIC8qIGZhbWlseSAqLywgVHlwZWZhY2UuTk9STUFMIC8qIHN0eWxlICovLCAyMDAgLyogdGV4dCBzaXplLCAxZW0gPSAyMDBweCAqLywKKyAgICAgICAgICAgICAgICBudWxsIC8qIHRleHQgY29sb3IgKi8sIG51bGwgLyogbGluayBjb2xvciAqLyk7CisKKyAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBzc2IgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcigiSGVsbG8sIFdvcmxkXG5IZWxsbywgQW5kcm9pZCIpOworICAgICAgICBzc2Iuc2V0U3BhbihmaXJzdFN0eWxlU3BhbiwgMCwgMTMsIFNwYW5uZWQuU1BBTl9FWENMVVNJVkVfRVhDTFVTSVZFKTsKKyAgICAgICAgc3NiLnNldFNwYW4oZmlyc3RSZXBsYWNlbWVudCwgMCwgMTMsIFNwYW5uZWQuU1BBTl9FWENMVVNJVkVfRVhDTFVTSVZFKTsKKyAgICAgICAgc3NiLnNldFNwYW4oc2Vjb25kU3R5bGVTcGFuLCAxMywgMjcsIFNwYW5uZWQuU1BBTl9FWENMVVNJVkVfRVhDTFVTSVZFKTsKKyAgICAgICAgc3NiLnNldFNwYW4oc2Vjb25kUmVwbGFjZW1lbnQsIDEzLCAyNywgU3Bhbm5lZC5TUEFOX0VYQ0xVU0lWRV9FWENMVVNJVkUpOworCisgICAgICAgIFN0YXRpY0xheW91dC5CdWlsZGVyLm9idGFpbihzc2IsIDAsIHNzYi5sZW5ndGgoKSwgcGFpbnQsIEludGVnZXIuTUFYX1ZBTFVFKS5idWlsZCgpOworCisgICAgICAgIEZvbnRNZXRyaWNzSW50IGZpcnN0TWV0cmljcyA9IGZtMUNhcHRvci5nZXRWYWx1ZSgpOworICAgICAgICBGb250TWV0cmljc0ludCBzZWNvbmRNZXRyaWNzID0gZm0yQ2FwdG9yLmdldFZhbHVlKCk7CisKKyAgICAgICAgLy8gVGhlIHNhbXBsZWZvbnQudHRmIGhhcyAwLjhlbSBhc2NlbnQgYW5kIDAuMmVtIGRlc2NlbnQuCisgICAgICAgIGFzc2VydEVxdWFscygtMTAwLCBmaXJzdE1ldHJpY3MuYXNjZW50KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwLCBmaXJzdE1ldHJpY3MuZGVzY2VudCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0yMDAsIHNlY29uZE1ldHJpY3MuYXNjZW50KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwLCBzZWNvbmRNZXRyaWNzLmRlc2NlbnQpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9jdHMvVGV4dFV0aWxzVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2N0cy9UZXh0VXRpbHNUZXN0LmphdmEKaW5kZXggZDU0OWNmYS4uOTJlMjMyMSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2N0cy9UZXh0VXRpbHNUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2N0cy9UZXh0VXRpbHNUZXN0LmphdmEKQEAgLTM5LDkgKzM5LDYgQEAKIGltcG9ydCBhbmRyb2lkLm9zLkxvY2FsZUxpc3Q7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5HZXRDaGFyczsKIGltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nOwogaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmdCdWlsZGVyOwpAQCAtNTYsNiArNTMsMTAgQEAKIGltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuVVJMU3BhbjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU3RyaW5nQnVpbGRlclByaW50ZXI7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpAQCAtMTU2Myw3ICsxNTY0LDcgQEAKICAgICAgICAgYXNzZXJ0RmFsc2UoVGV4dFV0aWxzLmlzR3JhcGhpYygnXHUwMDg1JykpOwogCiAgICAgICAgIC8vIFVOQVNTSUdORUQKLSAgICAgICAgYXNzZXJ0RmFsc2UoVGV4dFV0aWxzLmlzR3JhcGhpYygnXHUwRDAwJykpOworICAgICAgICBhc3NlcnRGYWxzZShUZXh0VXRpbHMuaXNHcmFwaGljKCdcdUZGRkYnKSk7CiAKICAgICAgICAgLy8gU1VSUk9HQVRFCiAgICAgICAgIGFzc2VydEZhbHNlKFRleHRVdGlscy5pc0dyYXBoaWMoJ1x1RDgwMCcpKTsKQEAgLTE1ODEsOSArMTU4Miw5IEBACiAgICAgcHVibGljIHZvaWQgdGVzdElzR3JhcGhpY0NoYXJTZXF1ZW5jZSgpIHsKICAgICAgICAgYXNzZXJ0VHJ1ZShUZXh0VXRpbHMuaXNHcmFwaGljKCJwcmludGFibGUgY2hhcmFjdGVycyIpKTsKIAotICAgICAgICBhc3NlcnRGYWxzZShUZXh0VXRpbHMuaXNHcmFwaGljKCJcdTIwMjhcdTIwMjlcdTAwODVcdTBEMDBcdUQ4MDBcdTAwMjAiKSk7CisgICAgICAgIGFzc2VydEZhbHNlKFRleHRVdGlscy5pc0dyYXBoaWMoIlx1MjAyOFx1MjAyOVx1MDA4NVx1RkZGRlx1RDgwMFx1MDAyMCIpKTsKIAotICAgICAgICBhc3NlcnRUcnVlKFRleHRVdGlscy5pc0dyYXBoaWMoImFcdTIwMjhcdTIwMjlcdTAwODVcdTBEMDBcdUQ4MDBcdTAwMjAiKSk7CisgICAgICAgIGFzc2VydFRydWUoVGV4dFV0aWxzLmlzR3JhcGhpYygiYVx1MjAyOFx1MjAyOVx1MDA4NVx1RkZGRlx1RDgwMFx1MDAyMCIpKTsKIAogICAgICAgICBhc3NlcnRUcnVlKFRleHRVdGlscy5pc0dyYXBoaWMoIlx1RDgzRFx1REMwQyIpKTsgLy8gVSsxRjQwQyBTTkFJTAogICAgICAgICBhc3NlcnRGYWxzZShUZXh0VXRpbHMuaXNHcmFwaGljKCJcdURCNDBcdURDMDEiKSk7IC8vIFUrRTAwMDAgKHVuYXNzaWduZWQpCkBAIC0xNjE0LDYgKzE2MTUsOCBAQAogICAgICAgICBzcGFubmFibGVTdHJpbmdUb2tlbnMuYWRkKG5ldyBTcGFubmFibGVTdHJpbmcoInNwYW4gMiIpKTsKICAgICAgICAgc3Bhbm5hYmxlU3RyaW5nVG9rZW5zLmFkZChuZXcgU3Bhbm5hYmxlU3RyaW5nKCJzcGFuIDMiKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygic3BhbiAxO3NwYW4gMjtzcGFuIDMiLCBUZXh0VXRpbHMuam9pbigiOyIsIHNwYW5uYWJsZVN0cmluZ1Rva2VucykpOworCisgICAgICAgIGFzc2VydEVxdWFscygiIiwgVGV4dFV0aWxzLmpvaW4oInwiLCBuZXcgQXJyYXlMaXN0PENoYXJTZXF1ZW5jZT4oKSkpOwogICAgIH0KIAogICAgIEBUZXN0KGV4cGVjdGVkPU51bGxQb2ludGVyRXhjZXB0aW9uLmNsYXNzKQpAQCAtMTYzNiw2ICsxNjM5LDggQEAKICAgICAgICAgICAgICAgICBuZXcgU3Bhbm5hYmxlU3RyaW5nKCJzcGFuIDIiKSwKICAgICAgICAgICAgICAgICBuZXcgU3Bhbm5hYmxlU3RyaW5nKCJzcGFuIDMiKSB9OwogICAgICAgICBhc3NlcnRFcXVhbHMoInNwYW4gMTtzcGFuIDI7c3BhbiAzIiwgVGV4dFV0aWxzLmpvaW4oIjsiLCBzcGFubmFibGVTdHJpbmdUb2tlbnMpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIFRleHRVdGlscy5qb2luKCJ8IiwgbmV3IFN0cmluZ1swXSkpOwogICAgIH0KIAogICAgIEBUZXN0KGV4cGVjdGVkPU51bGxQb2ludGVyRXhjZXB0aW9uLmNsYXNzKQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2N0cy9UZXh0VXRpbHNfU2ltcGxlU3RyaW5nU3BsaXR0ZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvY3RzL1RleHRVdGlsc19TaW1wbGVTdHJpbmdTcGxpdHRlclRlc3QuamF2YQppbmRleCA3OTkzZjU4Li4zMzc1ZDg5IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvY3RzL1RleHRVdGlsc19TaW1wbGVTdHJpbmdTcGxpdHRlclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvY3RzL1RleHRVdGlsc19TaW1wbGVTdHJpbmdTcGxpdHRlclRlc3QuamF2YQpAQCAtMjIsMTAgKzIyLDExIEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwogCi1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlscy5TaW1wbGVTdHJpbmdTcGxpdHRlcjsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2Zvcm1hdC9jdHMvRGF0ZUZvcm1hdFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9mb3JtYXQvY3RzL0RhdGVGb3JtYXRUZXN0LmphdmEKaW5kZXggMTNjOWFhMi4uOThjMWU1MiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2Zvcm1hdC9jdHMvRGF0ZUZvcm1hdFRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvZm9ybWF0L2N0cy9EYXRlRm9ybWF0VGVzdC5qYXZhCkBAIC0xOCwyMCArMTgsMjQgQEAKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3RFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKIGltcG9ydCBhbmRyb2lkLmFwcC5VaUF1dG9tYXRpb247CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuTG9jYWxlTGlzdDsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLkxhcmdlVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnRleHQuZm9ybWF0LkRhdGVGb3JtYXQ7CiAKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk5vbk51bGw7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTGFyZ2VUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlN5c3RlbVV0aWw7CiAKIGltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CkBAIC0zMTIsNiArMzE2LDI3IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29udGV4dExvY2FsZUlzVXNlZCgpIHsKKyAgICAgICAgZmluYWwgTG9jYWxlIG9sZExvY2FsZSA9IExvY2FsZS5nZXREZWZhdWx0KCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIERhdGUgZGF0ZSA9IG5ldyBEYXRlKFlFQVJfRlJPTV8xOTAwLCBNT05USCwgREFZKTsKKyAgICAgICAgICAgIExvY2FsZS5zZXREZWZhdWx0KExvY2FsZS5GUkFOQ0UpOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGphdmFSZXN1bHQgPSBqYXZhLnRleHQuRGF0ZUZvcm1hdC5nZXREYXRlSW5zdGFuY2UoCisgICAgICAgICAgICAgICAgICAgIGphdmEudGV4dC5EYXRlRm9ybWF0LkxPTkcpLmZvcm1hdChkYXRlKTsKKworICAgICAgICAgICAgZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgQ29uZmlndXJhdGlvbigpOworICAgICAgICAgICAgY29uZmlnLnNldExvY2FsZXMobmV3IExvY2FsZUxpc3QoTG9jYWxlLkpBUEFOKSk7CisgICAgICAgICAgICBmaW5hbCBDb250ZXh0IGNvbnRleHQgPSBtQ29udGV4dC5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dChjb25maWcpOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGFuZHJvaWRSZXN1bHQgPSBEYXRlRm9ybWF0LmdldExvbmdEYXRlRm9ybWF0KGNvbnRleHQpLmZvcm1hdChkYXRlKTsKKworICAgICAgICAgICAgYXNzZXJ0Tm90RXF1YWxzKGphdmFSZXN1bHQsIGFuZHJvaWRSZXN1bHQpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgTG9jYWxlLnNldERlZmF1bHQob2xkTG9jYWxlKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIEBOb25OdWxsCiAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VGltZUZvcm1hdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBTeXN0ZW1VdGlsLnJ1blNoZWxsQ29tbWFuZChJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKSwKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9mb3JtYXQvY3RzL0RhdGVVdGlsc1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9mb3JtYXQvY3RzL0RhdGVVdGlsc1Rlc3QuamF2YQppbmRleCBhM2Q0ODA2Li5mYzRlZjVhIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvZm9ybWF0L2N0cy9EYXRlVXRpbHNUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2Zvcm1hdC9jdHMvRGF0ZVV0aWxzVGVzdC5qYXZhCkBAIC0yMywxMSArMjMsMTIgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LmZvcm1hdC5EYXRlVXRpbHM7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2Zvcm1hdC9jdHMvRm9ybWF0dGVyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2Zvcm1hdC9jdHMvRm9ybWF0dGVyVGVzdC5qYXZhCmluZGV4IDhjN2ZkYzkuLjAyMzEyY2IgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9mb3JtYXQvY3RzL0Zvcm1hdHRlclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvZm9ybWF0L2N0cy9Gb3JtYXR0ZXJUZXN0LmphdmEKQEAgLTIxLDExICsyMSwxMiBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLkxvY2FsZUxpc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LmZvcm1hdC5Gb3JtYXR0ZXI7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2Zvcm1hdC9jdHMvVGltZVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9mb3JtYXQvY3RzL1RpbWVUZXN0LmphdmEKaW5kZXggZGY5M2YzNC4uNjExMmI3MyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L2Zvcm1hdC9jdHMvVGltZVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvZm9ybWF0L2N0cy9UaW1lVGVzdC5qYXZhCkBAIC0yMywxMiArMjMsMTMgQEAKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnRleHQuZm9ybWF0LlRpbWU7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuVGltZUZvcm1hdEV4Y2VwdGlvbjsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpAQCAtMjc2MCwzMSArMjc2MSwyOSBAQAogICAgICAgICB2ZXJpZnlOb3JtYWxpemVSZXN1bHQoZmFsc2UsIHQsIGV4cGVjdGVkLCA1NzcyNDIwMDAwMEwpOwogICAgIH0KIAotICAgIC8vIFJlbW92YWwgb2YgdGVzdCBmb3IgQ1RTIHRoYXQgaXMgZGVwZW5kZW50IG9uIElBTkEgcnVsZXMgZGF0YSB2ZXJzaW9uLiBGYWlscyA+PSAyMDE4ZAotICAgIC8vIGh0dHA6Ly9iLzc2MzYyNjg3Ci0gICAgLy8gQFRlc3QKLSAgICAvLyBwdWJsaWMgdm9pZCB0ZXN0Tm9ybWFsaXplX3N0ZFRvU3RkU2tpcCgpIHsKLSAgICAvLyAgICAgLy8gSW4gS2lyaXRpbWF0aSwgMXN0IEphbiAxOTk1IDEwOjAwIC0gMTA6NDAgd2FzIGEgc2tpcCBmcm9tIFNURCAtPiBTVEQgKHBsdXMgdGhleSBkbyBub3QKLSAgICAvLyAgICAgLy8gb2JzZXJ2ZSBEU1QpLgotICAgIC8vICAgICBTdHJpbmcgdGltZXpvbmUgPSAiUGFjaWZpYy9LaXJpdGltYXRpIjsKLSAgICAvLyAgICAgVGltZSB0ID0gbmV3IFRpbWUodGltZXpvbmUpOwotICAgIC8vICAgICBUaW1lIGV4cGVjdGVkID0gbmV3IFRpbWUodGltZXpvbmUpOwotICAgIC8vCi0gICAgLy8gICAgIC8vIGlzRHN0ID0gMCwgbm9ybWFsaXplKGZhbHNlKQotICAgIC8vICAgICBGaWVsZHMuc2V0KHQsIDE5OTUsIDAsIDEsIDEwLCAyMCwgMCwgMCAvKiBpc0RzdCAqLywgOSwgOSwgOSk7Ci0gICAgLy8gICAgIEZpZWxkcy5zZXQoZXhwZWN0ZWQsIDE5OTUsIDAsIDEsIDEwLCAyMCwgMCwgMCAvKiBpc0RzdCAqLywgOSwgOSwgOSk7Ci0gICAgLy8gICAgIHZlcmlmeU5vcm1hbGl6ZVJlc3VsdChmYWxzZSwgdCwgZXhwZWN0ZWQsIC0xKTsKLSAgICAvLwotICAgIC8vICAgICAvLyBpc0RzdCA9IDEsIG5vcm1hbGl6ZShmYWxzZSkKLSAgICAvLyAgICAgRmllbGRzLnNldCh0LCAxOTk1LCAwLCAxLCAxMCwgMjAsIDAsIDEgLyogaXNEc3QgKi8sIDksIDksIDkpOwotICAgIC8vICAgICBGaWVsZHMuc2V0KGV4cGVjdGVkLCAxOTk1LCAwLCAxLCAxMCwgMjAsIDAsIDEgLyogaXNEc3QgKi8sIDksIDksIDkpOwotICAgIC8vICAgICB2ZXJpZnlOb3JtYWxpemVSZXN1bHQoZmFsc2UsIHQsIGV4cGVjdGVkLCAtMSk7Ci0gICAgLy8KLSAgICAvLyAgICAgLy8gaXNEc3QgPSAtMSwgbm9ybWFsaXplKGZhbHNlKQotICAgIC8vICAgICBGaWVsZHMuc2V0KHQsIDE5OTUsIDAsIDEsIDEwLCAyMCwgMCwgLTEgLyogaXNEc3QgKi8sIDksIDksIDkpOwotICAgIC8vICAgICBGaWVsZHMuc2V0KGV4cGVjdGVkLCAxOTk1LCAwLCAxLCAxMCwgMjAsIDAsIC0xIC8qIGlzRHN0ICovLCA5LCA5LCA5KTsKLSAgICAvLyAgICAgdmVyaWZ5Tm9ybWFsaXplUmVzdWx0KGZhbHNlLCB0LCBleHBlY3RlZCwgLTEpOwotICAgIC8vIH0KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb3JtYWxpemVfc3RkVG9TdGRTa2lwKCkgeworICAgICAgICAvLyBJbiBLaXJpdGltYXRpLCAzMXN0IERlYyAxOTk0IHdhcyBza2lwcGVkIGVudGlyZWx5IGJ5IGdvaW5nIGZyb20gVVRDLTEwIHRvIFVUQysxNCAod2FzIGEKKyAgICAgICAgLy8gc2tpcCBmcm9tIFNURCAtPiBTVEQsIHBsdXMgdGhleSBkbyBub3Qgb2JzZXJ2ZSBEU1QpLgorICAgICAgICBTdHJpbmcgdGltZXpvbmUgPSAiUGFjaWZpYy9LaXJpdGltYXRpIjsKKyAgICAgICAgVGltZSB0ID0gbmV3IFRpbWUodGltZXpvbmUpOworICAgICAgICBUaW1lIGV4cGVjdGVkID0gbmV3IFRpbWUodGltZXpvbmUpOworCisgICAgICAgIC8vIGlzRHN0ID0gMCwgbm9ybWFsaXplKGZhbHNlKQorICAgICAgICBGaWVsZHMuc2V0KHQsIDE5OTQsIDExLCAzMSwgMTAsIDIwLCAwLCAwIC8qIGlzRHN0ICovLCA5LCA5LCA5KTsKKyAgICAgICAgRmllbGRzLnNldChleHBlY3RlZCwgMTk5NCwgMTEsIDMxLCAxMCwgMjAsIDAsIDAgLyogaXNEc3QgKi8sIDksIDksIDkpOworICAgICAgICB2ZXJpZnlOb3JtYWxpemVSZXN1bHQoZmFsc2UsIHQsIGV4cGVjdGVkLCAtMSk7CisKKyAgICAgICAgLy8gaXNEc3QgPSAxLCBub3JtYWxpemUoZmFsc2UpCisgICAgICAgIEZpZWxkcy5zZXQodCwgMTk5NCwgMTEsIDMxLCAxMCwgMjAsIDAsIDEgLyogaXNEc3QgKi8sIDksIDksIDkpOworICAgICAgICBGaWVsZHMuc2V0KGV4cGVjdGVkLCAxOTk0LCAxMSwgMzEsIDEwLCAyMCwgMCwgMSAvKiBpc0RzdCAqLywgOSwgOSwgOSk7CisgICAgICAgIHZlcmlmeU5vcm1hbGl6ZVJlc3VsdChmYWxzZSwgdCwgZXhwZWN0ZWQsIC0xKTsKKworICAgICAgICAvLyBpc0RzdCA9IC0xLCBub3JtYWxpemUoZmFsc2UpCisgICAgICAgIEZpZWxkcy5zZXQodCwgMTk5NCwgMTEsIDMxLCAxMCwgMjAsIDAsIC0xIC8qIGlzRHN0ICovLCA5LCA5LCA5KTsKKyAgICAgICAgRmllbGRzLnNldChleHBlY3RlZCwgMTk5NCwgMTEsIDMxLCAxMCwgMjAsIDAsIC0xIC8qIGlzRHN0ICovLCA5LCA5LCA5KTsKKyAgICAgICAgdmVyaWZ5Tm9ybWFsaXplUmVzdWx0KGZhbHNlLCB0LCBleHBlY3RlZCwgLTEpOworICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE5vcm1hbGl6ZV91dGNXaXRoRHN0KCkgewpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L21ldGhvZC9jdHMvQXJyb3dLZXlNb3ZlbWVudE1ldGhvZFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9tZXRob2QvY3RzL0Fycm93S2V5TW92ZW1lbnRNZXRob2RUZXN0LmphdmEKaW5kZXggNzA1NzkxMy4uMTYxOGJiYSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L21ldGhvZC9jdHMvQXJyb3dLZXlNb3ZlbWVudE1ldGhvZFRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvbWV0aG9kL2N0cy9BcnJvd0tleU1vdmVtZW50TWV0aG9kVGVzdC5qYXZhCkBAIC0yNiwxMSArMjYsNiBAQAogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwogaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LkVkaXRhYmxlOwogaW1wb3J0IGFuZHJvaWQudGV4dC5TZWxlY3Rpb247CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZTsKQEAgLTQ2LDYgKzQxLDEyIEBACiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXcuQnVmZmVyVHlwZTsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5Qb2xsaW5nQ2hlY2s7CiAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L21ldGhvZC9jdHMvQmFja3NwYWNlVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L21ldGhvZC9jdHMvQmFja3NwYWNlVGVzdC5qYXZhCmluZGV4IDBkZTdjNmEuLjQ2Zjk1ODIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9tZXRob2QvY3RzL0JhY2tzcGFjZVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvbWV0aG9kL2N0cy9CYWNrc3BhY2VUZXN0LmphdmEKQEAgLTE4LDEzICsxOCwxNCBAQAogCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnRleHQuSW5wdXRUeXBlOwogaW1wb3J0IGFuZHJvaWQudGV4dC5tZXRob2QuQmFzZUtleUxpc3RlbmVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0Vmlldy5CdWZmZXJUeXBlOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L21ldGhvZC9jdHMvQmFzZUtleUxpc3RlbmVyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L21ldGhvZC9jdHMvQmFzZUtleUxpc3RlbmVyVGVzdC5qYXZhCmluZGV4IDkxNjE4YjkuLmRmOTJiZmQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9tZXRob2QvY3RzL0Jhc2VLZXlMaXN0ZW5lclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvbWV0aG9kL2N0cy9CYXNlS2V5TGlzdGVuZXJUZXN0LmphdmEKQEAgLTIxLDggKzIxLDYgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LkVkaXRhYmxlOwogaW1wb3J0IGFuZHJvaWQudGV4dC5JbnB1dFR5cGU7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNlbGVjdGlvbjsKQEAgLTMzLDYgKzMxLDkgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXcuQnVmZmVyVHlwZTsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkN0c0tleUV2ZW50VXRpbDsKIAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L21ldGhvZC9jdHMvQmFzZU1vdmVtZW50TWV0aG9kVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L21ldGhvZC9jdHMvQmFzZU1vdmVtZW50TWV0aG9kVGVzdC5qYXZhCmluZGV4IDA5OGQxMmUuLmY5OGZmY2MgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9tZXRob2QvY3RzL0Jhc2VNb3ZlbWVudE1ldGhvZFRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvbWV0aG9kL2N0cy9CYXNlTW92ZW1lbnRNZXRob2RUZXN0LmphdmEKQEAgLTI3LDExICsyNyw2IEBACiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CiBpbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGU7CiBpbXBvcnQgYW5kcm9pZC50ZXh0Lm1ldGhvZC5CYXNlTW92ZW1lbnRNZXRob2Q7CiBpbXBvcnQgYW5kcm9pZC52aWV3LklucHV0RGV2aWNlOwpAQCAtNDMsNiArMzgsMTIgQEAKIGltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKIAoraW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTm9uTnVsbDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLldpZGdldFRlc3RVdGlsczsKIAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvbWV0aG9kL2N0cy9DaGFyYWN0ZXJQaWNrZXJEaWFsb2dUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvbWV0aG9kL2N0cy9DaGFyYWN0ZXJQaWNrZXJEaWFsb2dUZXN0LmphdmEKaW5kZXggZmRhODQ2OS4uMzJkYjhjYyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L21ldGhvZC9jdHMvQ2hhcmFjdGVyUGlja2VyRGlhbG9nVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9tZXRob2QvY3RzL0NoYXJhY3RlclBpY2tlckRpYWxvZ1Rlc3QuamF2YQpAQCAtMjEsMTYgKzIxLDE3IEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LkVkaXRhYmxlOwogaW1wb3J0IGFuZHJvaWQudGV4dC5TZWxlY3Rpb247CiBpbXBvcnQgYW5kcm9pZC50ZXh0Lm1ldGhvZC5DaGFyYWN0ZXJQaWNrZXJEaWFsb2c7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuR2FsbGVyeTsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvbWV0aG9kL2N0cy9EYXRlS2V5TGlzdGVuZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvbWV0aG9kL2N0cy9EYXRlS2V5TGlzdGVuZXJUZXN0LmphdmEKaW5kZXggMTZmNjMyYy4uMDM2NzVmMiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L21ldGhvZC9jdHMvRGF0ZUtleUxpc3RlbmVyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9tZXRob2QvY3RzL0RhdGVLZXlMaXN0ZW5lclRlc3QuamF2YQpAQCAtMjIsMTIgKzIyLDEzIEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90U2FtZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRTYW1lOwogCi1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5JbnB1dFR5cGU7CiBpbXBvcnQgYW5kcm9pZC50ZXh0Lm1ldGhvZC5EYXRlS2V5TGlzdGVuZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ3RzS2V5RXZlbnRVdGlsOwogCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvbWV0aG9kL2N0cy9EYXRlVGltZUtleUxpc3RlbmVyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L21ldGhvZC9jdHMvRGF0ZVRpbWVLZXlMaXN0ZW5lclRlc3QuamF2YQppbmRleCBkZWNkNDUxLi5iMWEwNjQyIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvbWV0aG9kL2N0cy9EYXRlVGltZUtleUxpc3RlbmVyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9tZXRob2QvY3RzL0RhdGVUaW1lS2V5TGlzdGVuZXJUZXN0LmphdmEKQEAgLTIyLDEzICsyMiwxNCBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdFNhbWU7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKIAotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnRleHQuSW5wdXRUeXBlOwogaW1wb3J0IGFuZHJvaWQudGV4dC5tZXRob2QuRGF0ZVRpbWVLZXlMaXN0ZW5lcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5Q2hhcmFjdGVyTWFwOwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkN0c0tleUV2ZW50VXRpbDsKIAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L21ldGhvZC9jdHMvRGlhbGVyS2V5TGlzdGVuZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvbWV0aG9kL2N0cy9EaWFsZXJLZXlMaXN0ZW5lclRlc3QuamF2YQppbmRleCA3ODA4ODI0Li5iN2JiOTNlIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvbWV0aG9kL2N0cy9EaWFsZXJLZXlMaXN0ZW5lclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvbWV0aG9kL2N0cy9EaWFsZXJLZXlMaXN0ZW5lclRlc3QuamF2YQpAQCAtMjIsMTQgKzIyLDE1IEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCi1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5JbnB1dFR5cGU7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZTsKIGltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nOwogaW1wb3J0IGFuZHJvaWQudGV4dC5tZXRob2QuRGlhbGVyS2V5TGlzdGVuZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L21ldGhvZC9jdHMvRGlnaXRzS2V5TGlzdGVuZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvbWV0aG9kL2N0cy9EaWdpdHNLZXlMaXN0ZW5lclRlc3QuamF2YQppbmRleCA3ODU0MjY4Li43ZjU2Mzg4IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvbWV0aG9kL2N0cy9EaWdpdHNLZXlMaXN0ZW5lclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvbWV0aG9kL2N0cy9EaWdpdHNLZXlMaXN0ZW5lclRlc3QuamF2YQpAQCAtMjQsOCArMjQsNiBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKIAotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnRleHQuSW5wdXRUeXBlOwogaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGU7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZVN0cmluZzsKQEAgLTMzLDYgKzMxLDkgQEAKIGltcG9ydCBhbmRyb2lkLnRleHQubWV0aG9kLkRpZ2l0c0tleUxpc3RlbmVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkN0c0tleUV2ZW50VXRpbDsKIAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L21ldGhvZC9jdHMvRm9yd2FyZERlbGV0ZVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9tZXRob2QvY3RzL0ZvcndhcmREZWxldGVUZXN0LmphdmEKaW5kZXggYmY1NmNiOC4uODU5ODU4MiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L21ldGhvZC9jdHMvRm9yd2FyZERlbGV0ZVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvbWV0aG9kL2N0cy9Gb3J3YXJkRGVsZXRlVGVzdC5qYXZhCkBAIC0xOCwxMyArMTgsMTQgQEAKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LklucHV0VHlwZTsKIGltcG9ydCBhbmRyb2lkLnRleHQubWV0aG9kLkJhc2VLZXlMaXN0ZW5lcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXcuQnVmZmVyVHlwZTsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9tZXRob2QvY3RzL0hpZGVSZXR1cm5zVHJhbnNmb3JtYXRpb25NZXRob2RUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvbWV0aG9kL2N0cy9IaWRlUmV0dXJuc1RyYW5zZm9ybWF0aW9uTWV0aG9kVGVzdC5qYXZhCmluZGV4IGRmNDg0NTguLmYzZmZmNzEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9tZXRob2QvY3RzL0hpZGVSZXR1cm5zVHJhbnNmb3JtYXRpb25NZXRob2RUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L21ldGhvZC9jdHMvSGlkZVJldHVybnNUcmFuc2Zvcm1hdGlvbk1ldGhvZFRlc3QuamF2YQpAQCAtMjAsMTAgKzIwLDExIEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRTYW1lOwogCi1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0Lm1ldGhvZC5IaWRlUmV0dXJuc1RyYW5zZm9ybWF0aW9uTWV0aG9kOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvbWV0aG9kL2N0cy9LZXlMaXN0ZW5lckN0c0FjdGl2aXR5LmphdmEgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvbWV0aG9kL2N0cy9LZXlMaXN0ZW5lckN0c0FjdGl2aXR5LmphdmEKaW5kZXggOWM5NjUxOS4uNGYyNmFlYSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L21ldGhvZC9jdHMvS2V5TGlzdGVuZXJDdHNBY3Rpdml0eS5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9tZXRob2QvY3RzL0tleUxpc3RlbmVyQ3RzQWN0aXZpdHkuamF2YQpAQCAtMTgsNyArMTgsNiBAQAogCiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKIGltcG9ydCBhbmRyb2lkLnRleHQuY3RzLlI7CiBpbXBvcnQgYW5kcm9pZC50ZXh0Lm1ldGhvZC5CYXNlS2V5TGlzdGVuZXI7CiBpbXBvcnQgYW5kcm9pZC50ZXh0Lm1ldGhvZC5EYXRlS2V5TGlzdGVuZXI7CkBAIC0yOSw3ICsyOCw2IEBACiBpbXBvcnQgYW5kcm9pZC50ZXh0Lm1ldGhvZC5Rd2VydHlLZXlMaXN0ZW5lcjsKIGltcG9ydCBhbmRyb2lkLnRleHQubWV0aG9kLlRleHRLZXlMaXN0ZW5lcjsKIGltcG9ydCBhbmRyb2lkLnRleHQubWV0aG9kLlRpbWVLZXlMaXN0ZW5lcjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCiAvKioKICAqIFRoaXMgQWN0aXZpdHkgaXMgdXNlZCBmb3IgdGVzdGluZzoKQEAgLTU1LDQ3ICs1Myw5IEBACiAgKi8KIAogcHVibGljIGNsYXNzIEtleUxpc3RlbmVyQ3RzQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1IYXNXaW5kb3dGb2N1cyA9IGZhbHNlOwotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1IYXNXaW5kb3dGb2N1c0xvY2sgPSBuZXcgT2JqZWN0KCk7Ci0KICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CiAgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmtleWxpc3RlbmVyX2xheW91dCk7CiAgICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25XaW5kb3dGb2N1c0NoYW5nZWQoYm9vbGVhbiBoYXNGb2N1cykgewotICAgICAgICBzdXBlci5vbldpbmRvd0ZvY3VzQ2hhbmdlZChoYXNGb2N1cyk7Ci0gICAgICAgIGlmICghaGFzRm9jdXMpIHsKLSAgICAgICAgICAgIExvZy53KCJLZXlMaXN0ZW5lckN0c0FjdGl2aXR5IiwgIktleUxpc3RlbmVyQ3RzQWN0aXZpdHkgbG9zdCB3aW5kb3cgZm9jdXMiKTsKLSAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQobUhhc1dpbmRvd0ZvY3VzTG9jaykgewotICAgICAgICAgICAgbUhhc1dpbmRvd0ZvY3VzID0gaGFzRm9jdXM7Ci0gICAgICAgICAgICBtSGFzV2luZG93Rm9jdXNMb2NrLm5vdGlmeSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQmxvY2tzIHRoZSBjYWxsaW5nIHRocmVhZCB1bnRpbCB0aGUge0BsaW5rIEtleUxpc3RlbmVyQ3RzQWN0aXZpdHl9IGhhcyB3aW5kb3cgZm9jdXMgb3IgdGhlCi0gICAgICogc3BlY2lmaWVkIGR1cmF0aW9uIChpbiBtaWxsaXNlY29uZHMpIGhhcyBwYXNzZWQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gd2FpdEZvcldpbmRvd0ZvY3VzKGxvbmcgZHVyYXRpb25NaWxsaXMpIHsKLSAgICAgICAgbG9uZyBlbGFwc2VkTWlsbGlzID0gU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCk7Ci0gICAgICAgIHN5bmNocm9uaXplZChtSGFzV2luZG93Rm9jdXNMb2NrKSB7Ci0gICAgICAgICAgICBtSGFzV2luZG93Rm9jdXMgPSBoYXNXaW5kb3dGb2N1cygpOwotICAgICAgICAgICAgd2hpbGUgKCFtSGFzV2luZG93Rm9jdXMgJiYgZHVyYXRpb25NaWxsaXMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgbG9uZyBuZXdFbGFwc2VkTWlsbGlzID0gU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCk7Ci0gICAgICAgICAgICAgICAgZHVyYXRpb25NaWxsaXMgLT0gKG5ld0VsYXBzZWRNaWxsaXMgLSBlbGFwc2VkTWlsbGlzKTsKLSAgICAgICAgICAgICAgICBlbGFwc2VkTWlsbGlzID0gbmV3RWxhcHNlZE1pbGxpczsKLSAgICAgICAgICAgICAgICBpZiAoZHVyYXRpb25NaWxsaXMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSGFzV2luZG93Rm9jdXNMb2NrLndhaXQoZHVyYXRpb25NaWxsaXMpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbUhhc1dpbmRvd0ZvY3VzOwotICAgICAgICB9Ci0gICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L21ldGhvZC9jdHMvS2V5TGlzdGVuZXJUZXN0Q2FzZS5qYXZhIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L21ldGhvZC9jdHMvS2V5TGlzdGVuZXJUZXN0Q2FzZS5qYXZhCmluZGV4IDhkNDdjNTcuLjkzNDA5NTcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9tZXRob2QvY3RzL0tleUxpc3RlbmVyVGVzdENhc2UuamF2YQorKysgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvbWV0aG9kL2N0cy9LZXlMaXN0ZW5lclRlc3RDYXNlLmphdmEKQEAgLTE2LDQwICsxNiw4NyBAQAogCiBwYWNrYWdlIGFuZHJvaWQudGV4dC5tZXRob2QuY3RzOwogCitpbXBvcnQgc3RhdGljIGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU3lzdGVtLlRFWFRfQVVUT19DQVBTOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQXBwT3BzTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb247Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKIGltcG9ydCBhbmRyb2lkLnRleHQuY3RzLlI7CiBpbXBvcnQgYW5kcm9pZC50ZXh0Lm1ldGhvZC5LZXlMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5FZGl0VGV4dDsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CisKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlBvbGxpbmdDaGVjazsKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlN5c3RlbVV0aWw7CiAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKwogLyoqCiAgKiBCYXNlIGNsYXNzIGZvciB2YXJpb3VzIEtleUxpc3RlbmVyIHRlc3RzLgogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgS2V5TGlzdGVuZXJUZXN0Q2FzZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJLZXlMaXN0ZW5lclRlc3RDYXNlIjsKKwogICAgIHByb3RlY3RlZCBLZXlMaXN0ZW5lckN0c0FjdGl2aXR5IG1BY3Rpdml0eTsKICAgICBwcm90ZWN0ZWQgSW5zdHJ1bWVudGF0aW9uIG1JbnN0cnVtZW50YXRpb247CiAgICAgcHJvdGVjdGVkIEVkaXRUZXh0IG1UZXh0VmlldzsKKyAgICBwcml2YXRlIGludCBtQXV0b0NhcFNldHRpbmc7CiAKICAgICBAUnVsZQogICAgIHB1YmxpYyBBY3Rpdml0eVRlc3RSdWxlPEtleUxpc3RlbmVyQ3RzQWN0aXZpdHk+IG1BY3Rpdml0eVJ1bGUgPQogICAgICAgICAgICAgbmV3IEFjdGl2aXR5VGVzdFJ1bGU8PihLZXlMaXN0ZW5lckN0c0FjdGl2aXR5LmNsYXNzKTsKIAogICAgIEBCZWZvcmUKLSAgICBwdWJsaWMgdm9pZCBzZXR1cCgpIHsKKyAgICBwdWJsaWMgdm9pZCBzZXR1cCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIG1JbnN0cnVtZW50YXRpb24gPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKTsKICAgICAgICAgbUFjdGl2aXR5ID0gbUFjdGl2aXR5UnVsZS5nZXRBY3Rpdml0eSgpOwotICAgICAgICBtVGV4dFZpZXcgPSAoRWRpdFRleHQpIG1BY3Rpdml0eS5maW5kVmlld0J5SWQoUi5pZC5rZXlsaXN0ZW5lcl90ZXh0dmlldyk7CisgICAgICAgIG1UZXh0VmlldyA9IG1BY3Rpdml0eS5maW5kVmlld0J5SWQoUi5pZC5rZXlsaXN0ZW5lcl90ZXh0dmlldyk7CiAKICAgICAgICAgUG9sbGluZ0NoZWNrLndhaXRGb3IoNTAwMCwgbUFjdGl2aXR5OjpoYXNXaW5kb3dGb2N1cyk7CiAgICAgfQogCisgICAgcHJvdGVjdGVkIHZvaWQgZW5hYmxlQXV0b0NhcFNldHRpbmdzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZ3JhbnRXcml0ZVNldHRpbmdzUGVybWlzc2lvbigpOworICAgICAgICBmaW5hbCBJbnN0cnVtZW50YXRpb24gaW5zdHJ1bWVudGF0aW9uID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCk7CisgICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCA9IGluc3RydW1lbnRhdGlvbi5nZXRDb250ZXh0KCk7CisgICAgICAgIGluc3RydW1lbnRhdGlvbi5ydW5Pbk1haW5TeW5jKCgpIC0+IHsKKyAgICAgICAgICAgIGZpbmFsIENvbnRlbnRSZXNvbHZlciByZXNvbHZlciA9IGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCk7CisgICAgICAgICAgICBtQXV0b0NhcFNldHRpbmcgPSBTZXR0aW5ncy5TeXN0ZW0uZ2V0SW50KHJlc29sdmVyLCBURVhUX0FVVE9fQ0FQUywgMSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5wdXRJbnQocmVzb2x2ZXIsIFRFWFRfQVVUT19DQVBTLCAxKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJDYW5ub3Qgc2V0IFRFWFRfQVVUT19DQVBTIHRvIDEiLCBlKTsKKyAgICAgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIGluc3RydW1lbnRhdGlvbi53YWl0Rm9ySWRsZVN5bmMoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCByZXNldEF1dG9DYXBTZXR0aW5ncygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGdyYW50V3JpdGVTZXR0aW5nc1Blcm1pc3Npb24oKTsKKyAgICAgICAgZmluYWwgSW5zdHJ1bWVudGF0aW9uIGluc3RydW1lbnRhdGlvbiA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpOworICAgICAgICBmaW5hbCBDb250ZXh0IGNvbnRleHQgPSBpbnN0cnVtZW50YXRpb24uZ2V0Q29udGV4dCgpOworICAgICAgICBpbnN0cnVtZW50YXRpb24ucnVuT25NYWluU3luYygoKSAtPiB7CisgICAgICAgICAgICBmaW5hbCBDb250ZW50UmVzb2x2ZXIgcmVzb2x2ZXIgPSBjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0ucHV0SW50KHJlc29sdmVyLCBURVhUX0FVVE9fQ0FQUywgbUF1dG9DYXBTZXR0aW5nKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJDYW5ub3Qgc2V0IFRFWFRfQVVUT19DQVBTIHRvIHByZXZpb3VzIHZhbHVlIiwgZSk7CisgICAgICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBpbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogU3luY2hyb25vdXNseSBzZXRzIG1UZXh0VmlldydzIGtleSBsaXN0ZW5lciBvbiB0aGUgVUkgdGhyZWFkLgogICAgICAqLwpAQCAtNjMsNCArMTEwLDEwIEBACiAgICAgICAgIHJldHVybiBuZXcgS2V5RXZlbnQoY3VycmVudFRpbWUsIGN1cnJlbnRUaW1lLCBLZXlFdmVudC5BQ1RJT05fRE9XTiwga2V5Y29kZSwKICAgICAgICAgICAgICAgICAwIC8qIHJlcGVhdCAqLywgbWV0YVN0YXRlKTsKICAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZ3JhbnRXcml0ZVNldHRpbmdzUGVybWlzc2lvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN5c3RlbVV0aWwucnVuU2hlbGxDb21tYW5kKEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLAorICAgICAgICAgICAgICAgICJhcHBvcHMgc2V0ICIgKyBtQWN0aXZpdHkuZ2V0UGFja2FnZU5hbWUoKSArICIgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBBcHBPcHNNYW5hZ2VyLk9QU1RSX1dSSVRFX1NFVFRJTkdTICsgIiBhbGxvdyIpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9tZXRob2QvY3RzL0xpbmtNb3ZlbWVudE1ldGhvZFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9tZXRob2QvY3RzL0xpbmtNb3ZlbWVudE1ldGhvZFRlc3QuamF2YQppbmRleCAwNjliMjc0Li4wMmI3ZTk1IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvbWV0aG9kL2N0cy9MaW5rTW92ZW1lbnRNZXRob2RUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L21ldGhvZC9jdHMvTGlua01vdmVtZW50TWV0aG9kVGVzdC5qYXZhCkBAIC0zMCwxMSArMzAsNiBAQAogCiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5TZWxlY3Rpb247CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZTsKIGltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nOwpAQCAtNDksNiArNDQsMTIgQEAKIGltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0Vmlldy5CdWZmZXJUeXBlOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L21ldGhvZC9jdHMvTWV0YUtleUtleUxpc3RlbmVyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L21ldGhvZC9jdHMvTWV0YUtleUtleUxpc3RlbmVyVGVzdC5qYXZhCmluZGV4IGYxZGQ0ZDkuLjcyNGQ4OTUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9tZXRob2QvY3RzL01ldGFLZXlLZXlMaXN0ZW5lclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvbWV0aG9kL2N0cy9NZXRhS2V5S2V5TGlzdGVuZXJUZXN0LmphdmEKQEAgLTI1LDggKzI1LDYgQEAKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5zcHk7CiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8udmVyaWZ5OwogCi1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5FZGl0YWJsZTsKIGltcG9ydCBhbmRyb2lkLnRleHQuU2VsZWN0aW9uOwogaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGU7CkBAIC0zOCw2ICszNiw5IEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L21ldGhvZC9jdHMvTXVsdGlUYXBLZXlMaXN0ZW5lclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9tZXRob2QvY3RzL011bHRpVGFwS2V5TGlzdGVuZXJUZXN0LmphdmEKaW5kZXggYzczYjdmYS4uMDYwODBiYSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L21ldGhvZC9jdHMvTXVsdGlUYXBLZXlMaXN0ZW5lclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvbWV0aG9kL2N0cy9NdWx0aVRhcEtleUxpc3RlbmVyVGVzdC5qYXZhCkBAIC0yOCw4ICsyOCw2IEBACiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8uc3B5OwogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnZlcmlmeTsKIAotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTGFyZ2VUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5JbnB1dFR5cGU7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNlbGVjdGlvbjsKIGltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlOwpAQCAtMzksOSArMzcsMTYgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXcuQnVmZmVyVHlwZTsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5MYXJnZVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIAoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKIEBMYXJnZVRlc3QKIEBSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCiBwdWJsaWMgY2xhc3MgTXVsdGlUYXBLZXlMaXN0ZW5lclRlc3QgZXh0ZW5kcyBLZXlMaXN0ZW5lclRlc3RDYXNlIHsKQEAgLTUwLDYgKzU1LDE3IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBUSU1FX09VVCA9IDMwMDA7CiAKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0dXAoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXR1cCgpOworICAgICAgICBlbmFibGVBdXRvQ2FwU2V0dGluZ3MoKTsKKyAgICB9CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJlc2V0QXV0b0NhcFNldHRpbmdzKCk7CisgICAgfQorCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IoKSB7CiAgICAgICAgIG5ldyBNdWx0aVRhcEtleUxpc3RlbmVyKENhcGl0YWxpemUuTk9ORSwgdHJ1ZSk7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvbWV0aG9kL2N0cy9OdW1iZXJLZXlMaXN0ZW5lclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9tZXRob2QvY3RzL051bWJlcktleUxpc3RlbmVyVGVzdC5qYXZhCmluZGV4IGM0YTc5NDQuLjI0NTVlM2YgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9tZXRob2QvY3RzL051bWJlcktleUxpc3RlbmVyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9tZXRob2QvY3RzL051bWJlcktleUxpc3RlbmVyVGVzdC5qYXZhCkBAIC0yMiw4ICsyMiw2IEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwogCi1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5TZWxlY3Rpb247CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZTsKIGltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nOwpAQCAtMzIsNiArMzAsOSBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0Vmlldy5CdWZmZXJUeXBlOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ3RzS2V5RXZlbnRVdGlsOwogCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvbWV0aG9kL2N0cy9QYXNzd29yZFRyYW5zZm9ybWF0aW9uTWV0aG9kVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L21ldGhvZC9jdHMvUGFzc3dvcmRUcmFuc2Zvcm1hdGlvbk1ldGhvZFRlc3QuamF2YQppbmRleCBiYjRmZmI2Li4yMjMxNWRkIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvbWV0aG9kL2N0cy9QYXNzd29yZFRyYW5zZm9ybWF0aW9uTWV0aG9kVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9tZXRob2QvY3RzL1Bhc3N3b3JkVHJhbnNmb3JtYXRpb25NZXRob2RUZXN0LmphdmEKQEAgLTMzLDEwICszMyw2IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlNldHRpbmdOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlN5c3RlbTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5tZXRob2QuUGFzc3dvcmRUcmFuc2Zvcm1hdGlvbk1ldGhvZDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5Q2hhcmFjdGVyTWFwOwpAQCAtNDUsNiArNDEsMTEgQEAKIGltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0LkxheW91dFBhcmFtczsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ3RzS2V5RXZlbnRVdGlsOwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuUG9sbGluZ0NoZWNrOwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvbWV0aG9kL2N0cy9Rd2VydHlLZXlMaXN0ZW5lclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9tZXRob2QvY3RzL1F3ZXJ0eUtleUxpc3RlbmVyVGVzdC5qYXZhCmluZGV4IGMyZTY4NGEuLjlmZTE2ZWMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9tZXRob2QvY3RzL1F3ZXJ0eUtleUxpc3RlbmVyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9tZXRob2QvY3RzL1F3ZXJ0eUtleUxpc3RlbmVyVGVzdC5qYXZhCkBAIC0yMSw4ICsyMSw2IEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90U2FtZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRTYW1lOwogCi1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5JbnB1dFR5cGU7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNlbGVjdGlvbjsKIGltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlOwpAQCAtMzIsMTIgKzMwLDMxIEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3LkJ1ZmZlclR5cGU7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKwogQE1lZGl1bVRlc3QKIEBSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCiBwdWJsaWMgY2xhc3MgUXdlcnR5S2V5TGlzdGVuZXJUZXN0IGV4dGVuZHMgS2V5TGlzdGVuZXJUZXN0Q2FzZSB7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0dXAoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXR1cCgpOworICAgICAgICBlbmFibGVBdXRvQ2FwU2V0dGluZ3MoKTsKKyAgICB9CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJlc2V0QXV0b0NhcFNldHRpbmdzKCk7CisgICAgfQorCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IoKSB7CiAgICAgICAgIG5ldyBRd2VydHlLZXlMaXN0ZW5lcihDYXBpdGFsaXplLk5PTkUsIGZhbHNlKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9tZXRob2QvY3RzL1JlcGxhY2VtZW50VHJhbnNmb3JtYXRpb25NZXRob2RUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvbWV0aG9kL2N0cy9SZXBsYWNlbWVudFRyYW5zZm9ybWF0aW9uTWV0aG9kVGVzdC5qYXZhCmluZGV4IGU3NTI3MWUuLmQ4MmJiZjcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9tZXRob2QvY3RzL1JlcGxhY2VtZW50VHJhbnNmb3JtYXRpb25NZXRob2RUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L21ldGhvZC9jdHMvUmVwbGFjZW1lbnRUcmFuc2Zvcm1hdGlvbk1ldGhvZFRlc3QuamF2YQpAQCAtMTksMTQgKzE5LDE1IEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5tZXRob2QuUmVwbGFjZW1lbnRUcmFuc2Zvcm1hdGlvbk1ldGhvZDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZTsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5FZGl0VGV4dDsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvbWV0aG9kL2N0cy9TY3JvbGxpbmdNb3ZlbWVudE1ldGhvZFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9tZXRob2QvY3RzL1Njcm9sbGluZ01vdmVtZW50TWV0aG9kVGVzdC5qYXZhCmluZGV4IDMyYzZlNWUuLmUxOWRmZTggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9tZXRob2QvY3RzL1Njcm9sbGluZ01vdmVtZW50TWV0aG9kVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9tZXRob2QvY3RzL1Njcm9sbGluZ01vdmVtZW50TWV0aG9kVGVzdC5qYXZhCkBAIC0yNiwxMSArMjYsNiBAQAogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwogaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LkxheW91dDsKIGltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlOwogaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmc7CkBAIC00Niw2ICs0MSwxMiBAQAogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3LkJ1ZmZlclR5cGU7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuV2lkZ2V0VGVzdFV0aWxzOwogCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9tZXRob2QvY3RzL1NpbmdsZUxpbmVUcmFuc2Zvcm1hdGlvbk1ldGhvZFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9tZXRob2QvY3RzL1NpbmdsZUxpbmVUcmFuc2Zvcm1hdGlvbk1ldGhvZFRlc3QuamF2YQppbmRleCBhZDYyMmQwLi5hNDhkZjEyIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvbWV0aG9kL2N0cy9TaW5nbGVMaW5lVHJhbnNmb3JtYXRpb25NZXRob2RUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L21ldGhvZC9jdHMvU2luZ2xlTGluZVRyYW5zZm9ybWF0aW9uTWV0aG9kVGVzdC5qYXZhCkBAIC0yMSwxMCArMjEsNiBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKIAotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5MYXlvdXQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZVN0cmluZzsKIGltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5lZDsKQEAgLTMzLDYgKzI5LDExIEBACiBpbXBvcnQgYW5kcm9pZC51dGlsLlR5cGVkVmFsdWU7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuRWRpdFRleHQ7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvbWV0aG9kL2N0cy9UZXh0S2V5TGlzdGVuZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvbWV0aG9kL2N0cy9UZXh0S2V5TGlzdGVuZXJUZXN0LmphdmEKaW5kZXggNzg1MWRlZC4uOTg5YTFiYyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L21ldGhvZC9jdHMvVGV4dEtleUxpc3RlbmVyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9tZXRob2QvY3RzL1RleHRLZXlMaXN0ZW5lclRlc3QuamF2YQpAQCAtMzEsOCArMzEsNiBAQAogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnZlcmlmeTsKIAogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudGVzdC5VaVRocmVhZFRlc3Q7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LkVkaXRhYmxlOwogaW1wb3J0IGFuZHJvaWQudGV4dC5JbnB1dFR5cGU7CkBAIC00NSw2ICs0Myw5IEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3LkJ1ZmZlclR5cGU7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DdHNLZXlFdmVudFV0aWw7CiAKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9tZXRob2QvY3RzL1RpbWVLZXlMaXN0ZW5lclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9tZXRob2QvY3RzL1RpbWVLZXlMaXN0ZW5lclRlc3QuamF2YQppbmRleCBhODg3YTE5Li5mNWUwOTdmIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvbWV0aG9kL2N0cy9UaW1lS2V5TGlzdGVuZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L21ldGhvZC9jdHMvVGltZUtleUxpc3RlbmVyVGVzdC5qYXZhCkBAIC0yMiwxMyArMjIsMTQgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3RTYW1lOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFNhbWU7CiAKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LklucHV0VHlwZTsKIGltcG9ydCBhbmRyb2lkLnRleHQubWV0aG9kLlRpbWVLZXlMaXN0ZW5lcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5Q2hhcmFjdGVyTWFwOwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkN0c0tleUV2ZW50VXRpbDsKIAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L21ldGhvZC9jdHMvVG91Y2hUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvbWV0aG9kL2N0cy9Ub3VjaFRlc3QuamF2YQppbmRleCAxNDBkZmEwMi4uZmQwNzhmYiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L21ldGhvZC9jdHMvVG91Y2hUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L21ldGhvZC9jdHMvVG91Y2hUZXN0LmphdmEKQEAgLTIyLDExICsyMiw2IEBACiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CiBpbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnRleHQuTGF5b3V0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmc7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRQYWludDsKQEAgLTM3LDYgKzMyLDEyIEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9tZXRob2QvY3RzL1RyYW5zZm9ybWF0aW9uTWV0aG9kVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L21ldGhvZC9jdHMvVHJhbnNmb3JtYXRpb25NZXRob2RUZXN0LmphdmEKaW5kZXggZDY3ZmM1OS4uM2ZkMTQ0OCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L21ldGhvZC9jdHMvVHJhbnNmb3JtYXRpb25NZXRob2RUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L21ldGhvZC9jdHMvVHJhbnNmb3JtYXRpb25NZXRob2RUZXN0LmphdmEKQEAgLTI5LDE2ICsyOSwxNyBAQAogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLndoZW47CiAKIGltcG9ydCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb247Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnRleHQubWV0aG9kLlRyYW5zZm9ybWF0aW9uTWV0aG9kOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5FZGl0VGV4dDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0LkxheW91dFBhcmFtczsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuUG9sbGluZ0NoZWNrOwogCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9zdHlsZS9jdHMvQWJzb2x1dGVTaXplU3BhblRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9zdHlsZS9jdHMvQWJzb2x1dGVTaXplU3BhblRlc3QuamF2YQppbmRleCBhYzA0NjE5Li5hMjIxYWU5IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvc3R5bGUvY3RzL0Fic29sdXRlU2l6ZVNwYW5UZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L3N0eWxlL2N0cy9BYnNvbHV0ZVNpemVTcGFuVGVzdC5qYXZhCkBAIC0yMCwxMSArMjAsMTIgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRQYWludDsKIGltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuQWJzb2x1dGVTaXplU3BhbjsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L3N0eWxlL2N0cy9BbGlnbm1lbnRTcGFuX1N0YW5kYXJkVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L3N0eWxlL2N0cy9BbGlnbm1lbnRTcGFuX1N0YW5kYXJkVGVzdC5qYXZhCmluZGV4IDc4YmNkNmEuLjZjZGJjMjcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9zdHlsZS9jdHMvQWxpZ25tZW50U3Bhbl9TdGFuZGFyZFRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvc3R5bGUvY3RzL0FsaWdubWVudFNwYW5fU3RhbmRhcmRUZXN0LmphdmEKQEAgLTE5LDExICsxOSwxMiBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIAogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5MYXlvdXQuQWxpZ25tZW50OwogaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5BbGlnbm1lbnRTcGFuLlN0YW5kYXJkOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvc3R5bGUvY3RzL0JhY2tncm91bmRDb2xvclNwYW5UZXN0LmphdmEgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvc3R5bGUvY3RzL0JhY2tncm91bmRDb2xvclNwYW5UZXN0LmphdmEKaW5kZXggMjcyNGRmZS4uMzFhZDA0ZSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L3N0eWxlL2N0cy9CYWNrZ3JvdW5kQ29sb3JTcGFuVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9zdHlsZS9jdHMvQmFja2dyb3VuZENvbG9yU3BhblRlc3QuamF2YQpAQCAtMjAsMTEgKzIwLDEyIEBACiAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0UGFpbnQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLkJhY2tncm91bmRDb2xvclNwYW47CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9zdHlsZS9jdHMvQnVsbGV0U3BhblRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9zdHlsZS9jdHMvQnVsbGV0U3BhblRlc3QuamF2YQppbmRleCA0ZDE5ODViLi5iYmEzMTYxIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvc3R5bGUvY3RzL0J1bGxldFNwYW5UZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L3N0eWxlL2N0cy9CdWxsZXRTcGFuVGVzdC5qYXZhCkBAIC0xNiwzOCArMTYsNjQgQEAKIAogcGFja2FnZSBhbmRyb2lkLnRleHQuc3R5bGUuY3RzOwogCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0Lkh0bWw7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uZWQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLkJ1bGxldFNwYW47CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKIEBTbWFsbFRlc3QKIEBSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCiBwdWJsaWMgY2xhc3MgQnVsbGV0U3BhblRlc3QgewotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yKCkgewotICAgICAgICBuZXcgQnVsbGV0U3BhbigpOwotICAgICAgICBuZXcgQnVsbGV0U3BhbihCdWxsZXRTcGFuLlNUQU5EQVJEX0dBUF9XSURUSCk7Ci0gICAgICAgIEJ1bGxldFNwYW4gYiA9IG5ldyBCdWxsZXRTcGFuKEJ1bGxldFNwYW4uU1RBTkRBUkRfR0FQX1dJRFRILCBDb2xvci5SRUQpOwogCi0gICAgICAgIGZpbmFsIFBhcmNlbCBwID0gUGFyY2VsLm9idGFpbigpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYi53cml0ZVRvUGFyY2VsKHAsIDApOwotICAgICAgICAgICAgcC5zZXREYXRhUG9zaXRpb24oMCk7Ci0gICAgICAgICAgICBuZXcgQnVsbGV0U3BhbihwKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHAucmVjeWNsZSgpOwotICAgICAgICB9CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdENvbnN0cnVjdG9yKCkgeworICAgICAgICBCdWxsZXRTcGFuIGJ1bGxldFNwYW4gPSBuZXcgQnVsbGV0U3BhbigpOworICAgICAgICBhc3NlcnRFcXVhbHMoY2FsY3VsYXRlTGVhZGluZ01hcmdpbihidWxsZXRTcGFuLmdldEdhcFdpZHRoKCksIGJ1bGxldFNwYW4uZ2V0QnVsbGV0UmFkaXVzKCkpLAorICAgICAgICAgICAgICAgIGJ1bGxldFNwYW4uZ2V0TGVhZGluZ01hcmdpbih0cnVlKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBidWxsZXRTcGFuLmdldENvbG9yKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoQnVsbGV0U3Bhbi5TVEFOREFSRF9HQVBfV0lEVEgsIGJ1bGxldFNwYW4uZ2V0R2FwV2lkdGgoKSk7CisgICAgICAgIGFzc2VydFRydWUoYnVsbGV0U3Bhbi5nZXRCdWxsZXRSYWRpdXMoKSA+IDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yRnJvbUdhcFdpZHRoKCkgeworICAgICAgICBCdWxsZXRTcGFuIGJ1bGxldFNwYW4gPSBuZXcgQnVsbGV0U3BhbigyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNhbGN1bGF0ZUxlYWRpbmdNYXJnaW4oMiwgYnVsbGV0U3Bhbi5nZXRCdWxsZXRSYWRpdXMoKSksCisgICAgICAgICAgICAgICAgYnVsbGV0U3Bhbi5nZXRMZWFkaW5nTWFyZ2luKHRydWUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGJ1bGxldFNwYW4uZ2V0Q29sb3IoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBidWxsZXRTcGFuLmdldEdhcFdpZHRoKCkpOworICAgICAgICBhc3NlcnRUcnVlKGJ1bGxldFNwYW4uZ2V0QnVsbGV0UmFkaXVzKCkgPiAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvckZyb21HYXBXaWR0aENvbG9yKCkgeworICAgICAgICBCdWxsZXRTcGFuIGJ1bGxldFNwYW4gPSBuZXcgQnVsbGV0U3BhbigyLCBDb2xvci5SRUQpOworICAgICAgICBhc3NlcnRFcXVhbHMoYnVsbGV0U3Bhbi5nZXRCdWxsZXRSYWRpdXMoKSAqIDIgKyBidWxsZXRTcGFuLmdldEdhcFdpZHRoKCksCisgICAgICAgICAgICAgICAgYnVsbGV0U3Bhbi5nZXRMZWFkaW5nTWFyZ2luKHRydWUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKENvbG9yLlJFRCwgYnVsbGV0U3Bhbi5nZXRDb2xvcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGJ1bGxldFNwYW4uZ2V0R2FwV2lkdGgoKSk7CisgICAgICAgIGFzc2VydFRydWUoYnVsbGV0U3Bhbi5nZXRCdWxsZXRSYWRpdXMoKSA+IDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yRnJvbUdhcFdpZHRoQ29sb3JCdWxsZXRSYWRpdXMoKSB7CisgICAgICAgIEJ1bGxldFNwYW4gYnVsbGV0U3BhbiA9IG5ldyBCdWxsZXRTcGFuKDIsIENvbG9yLlJFRCwgMTApOworICAgICAgICBhc3NlcnRFcXVhbHMoY2FsY3VsYXRlTGVhZGluZ01hcmdpbigyLCAxMCksIGJ1bGxldFNwYW4uZ2V0TGVhZGluZ01hcmdpbih0cnVlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhDb2xvci5SRUQsIGJ1bGxldFNwYW4uZ2V0Q29sb3IoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBidWxsZXRTcGFuLmdldEdhcFdpZHRoKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTAsIGJ1bGxldFNwYW4uZ2V0QnVsbGV0UmFkaXVzKCkpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC03Miw3ICs5OCw3IEBACiAgICAgICAgIGJ1bGxldFNwYW4uZHJhd0xlYWRpbmdNYXJnaW4oY2FudmFzLCBwYWludCwgMTAsIDAsIDEwLCAwLCAyMCwgdGV4dCwgMCwgMCwgdHJ1ZSwgbnVsbCk7CiAgICAgfQogCi0gICAgQFRlc3QoZXhwZWN0ZWQ9Q2xhc3NDYXN0RXhjZXB0aW9uLmNsYXNzKQorICAgIEBUZXN0KGV4cGVjdGVkID0gQ2xhc3NDYXN0RXhjZXB0aW9uLmNsYXNzKQogICAgIHB1YmxpYyB2b2lkIHRlc3REcmF3TGVhZGluZ01hcmdpblN0cmluZygpIHsKICAgICAgICAgQnVsbGV0U3BhbiBidWxsZXRTcGFuID0gbmV3IEJ1bGxldFNwYW4oMTAsIDIwKTsKIApAQCAtODEsNyArMTA3LDcgQEAKICAgICAgICAgYnVsbGV0U3Bhbi5kcmF3TGVhZGluZ01hcmdpbihudWxsLCBudWxsLCAwLCAwLCAwLCAwLCAwLCB0ZXh0LCAwLCAwLCB0cnVlLCBudWxsKTsKICAgICB9CiAKLSAgICBAVGVzdChleHBlY3RlZD1OdWxsUG9pbnRlckV4Y2VwdGlvbi5jbGFzcykKKyAgICBAVGVzdChleHBlY3RlZCA9IE51bGxQb2ludGVyRXhjZXB0aW9uLmNsYXNzKQogICAgIHB1YmxpYyB2b2lkIHRlc3REcmF3TGVhZGluZ01hcmdpbk51bGwoKSB7CiAgICAgICAgIEJ1bGxldFNwYW4gYnVsbGV0U3BhbiA9IG5ldyBCdWxsZXRTcGFuKDEwLCAyMCk7CiAKQEAgLTEwOCwyNyArMTM0LDM1IEBACiAKICAgICAgICAgUGFyY2VsIHAgPSBQYXJjZWwub2J0YWluKCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBCdWxsZXRTcGFuIGJ1bGxldFNwYW4gPSBuZXcgQnVsbGV0U3BhbihCdWxsZXRTcGFuLlNUQU5EQVJEX0dBUF9XSURUSCwgQ29sb3IuUkVEKTsKKyAgICAgICAgICAgIEJ1bGxldFNwYW4gYnVsbGV0U3BhbiA9IG5ldyBCdWxsZXRTcGFuKDIsIENvbG9yLlJFRCwgNSk7CiAgICAgICAgICAgICBidWxsZXRTcGFuLndyaXRlVG9QYXJjZWwocCwgMCk7CiAgICAgICAgICAgICBwLnNldERhdGFQb3NpdGlvbigwKTsKICAgICAgICAgICAgIEJ1bGxldFNwYW4gYiA9IG5ldyBCdWxsZXRTcGFuKHApOwogICAgICAgICAgICAgbGVhZGluZ01hcmdpbjEgPSBiLmdldExlYWRpbmdNYXJnaW4odHJ1ZSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2FsY3VsYXRlTGVhZGluZ01hcmdpbigyLCA1KSwgbGVhZGluZ01hcmdpbjEpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKENvbG9yLlJFRCwgYi5nZXRDb2xvcigpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBiLmdldEdhcFdpZHRoKCkpOwogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgcC5yZWN5Y2xlKCk7CiAgICAgICAgIH0KIAogICAgICAgICBwID0gUGFyY2VsLm9idGFpbigpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgQnVsbGV0U3BhbiBidWxsZXRTcGFuID0gbmV3IEJ1bGxldFNwYW4oMTAsIENvbG9yLkJMQUNLKTsKKyAgICAgICAgICAgIEJ1bGxldFNwYW4gYnVsbGV0U3BhbiA9IG5ldyBCdWxsZXRTcGFuKCk7CiAgICAgICAgICAgICBidWxsZXRTcGFuLndyaXRlVG9QYXJjZWwocCwgMCk7CiAgICAgICAgICAgICBwLnNldERhdGFQb3NpdGlvbigwKTsKICAgICAgICAgICAgIEJ1bGxldFNwYW4gYiA9IG5ldyBCdWxsZXRTcGFuKHApOwogICAgICAgICAgICAgbGVhZGluZ01hcmdpbjIgPSBiLmdldExlYWRpbmdNYXJnaW4odHJ1ZSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2FsY3VsYXRlTGVhZGluZ01hcmdpbihiLmdldEdhcFdpZHRoKCksIGIuZ2V0QnVsbGV0UmFkaXVzKCkpLAorICAgICAgICAgICAgICAgICAgICBsZWFkaW5nTWFyZ2luMik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgYnVsbGV0U3Bhbi5nZXRDb2xvcigpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhCdWxsZXRTcGFuLlNUQU5EQVJEX0dBUF9XSURUSCwgYnVsbGV0U3Bhbi5nZXRHYXBXaWR0aCgpKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIHAucmVjeWNsZSgpOwogICAgICAgICB9CisgICAgfQogCi0gICAgICAgIGFzc2VydFRydWUobGVhZGluZ01hcmdpbjIgPiBsZWFkaW5nTWFyZ2luMSk7Ci0gICAgICAgIC8vIFRPRE86IFRlc3QgY29sb3IuIEhvdz8KKyAgICBwcml2YXRlIGludCBjYWxjdWxhdGVMZWFkaW5nTWFyZ2luKGludCBnYXBXaWR0aCwgaW50IGJ1bGxldFJhZGl1cykgeworICAgICAgICByZXR1cm4gMiAqIGJ1bGxldFJhZGl1cyArIGdhcFdpZHRoOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9zdHlsZS9jdHMvQ2hhcmFjdGVyU3R5bGVUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvc3R5bGUvY3RzL0NoYXJhY3RlclN0eWxlVGVzdC5qYXZhCmluZGV4IDc5MWYzNjIuLjk4Njc5ZWUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9zdHlsZS9jdHMvQ2hhcmFjdGVyU3R5bGVUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L3N0eWxlL2N0cy9DaGFyYWN0ZXJTdHlsZVRlc3QuamF2YQpAQCAtMjEsMTMgKzIxLDE0IEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCi1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRQYWludDsKIGltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuQ2hhcmFjdGVyU3R5bGU7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLk1ldHJpY0FmZmVjdGluZ1NwYW47CiBpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlN1cGVyc2NyaXB0U3BhbjsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L3N0eWxlL2N0cy9DbGlja2FibGVTcGFuVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L3N0eWxlL2N0cy9DbGlja2FibGVTcGFuVGVzdC5qYXZhCmluZGV4IGEwMGEyOGQuLjFiNjJhMzAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9zdHlsZS9jdHMvQ2xpY2thYmxlU3BhblRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvc3R5bGUvY3RzL0NsaWNrYWJsZVNwYW5UZXN0LmphdmEKQEAgLTIxLDEyICsyMSwxMyBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0UGFpbnQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLkNsaWNrYWJsZVNwYW47CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9zdHlsZS9jdHMvRHJhd2FibGVNYXJnaW5TcGFuVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L3N0eWxlL2N0cy9EcmF3YWJsZU1hcmdpblNwYW5UZXN0LmphdmEKaW5kZXggNGNjZjNiZC4uZTY5MDk5NiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L3N0eWxlL2N0cy9EcmF3YWJsZU1hcmdpblNwYW5UZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L3N0eWxlL2N0cy9EcmF3YWJsZU1hcmdpblNwYW5UZXN0LmphdmEKQEAgLTIzLDkgKzIzLDYgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50LkZvbnRNZXRyaWNzSW50OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0Lkh0bWw7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LkxheW91dDsKIGltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5lZDsKQEAgLTM0LDYgKzMxLDEwIEBACiBpbXBvcnQgYW5kcm9pZC50ZXh0LmN0cy5SOwogaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5EcmF3YWJsZU1hcmdpblNwYW47CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L3N0eWxlL2N0cy9EeW5hbWljRHJhd2FibGVTcGFuVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L3N0eWxlL2N0cy9EeW5hbWljRHJhd2FibGVTcGFuVGVzdC5qYXZhCmluZGV4IDVhZDUyOWIuLmVmMzJlNDQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9zdHlsZS9jdHMvRHluYW1pY0RyYXdhYmxlU3BhblRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvc3R5bGUvY3RzL0R5bmFtaWNEcmF3YWJsZVNwYW5UZXN0LmphdmEKQEAgLTIyLDEyICsyMiwxMyBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQuRm9udE1ldHJpY3NJbnQ7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LmN0cy5SOwogaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5EeW5hbWljRHJhd2FibGVTcGFuOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9zdHlsZS9jdHMvRWFzeUVkaXRTcGFuVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L3N0eWxlL2N0cy9FYXN5RWRpdFNwYW5UZXN0LmphdmEKaW5kZXggODMxY2UwOS4uNmQ1OWI2ZSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L3N0eWxlL2N0cy9FYXN5RWRpdFNwYW5UZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L3N0eWxlL2N0cy9FYXN5RWRpdFNwYW5UZXN0LmphdmEKQEAgLTE5LDExICsxOSwxMiBAQAogaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuRWFzeUVkaXRTcGFuOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9zdHlsZS9jdHMvRm9yZWdyb3VuZENvbG9yU3BhblRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9zdHlsZS9jdHMvRm9yZWdyb3VuZENvbG9yU3BhblRlc3QuamF2YQppbmRleCBhMjU5MDY1Li4zZTJjNzU3IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvc3R5bGUvY3RzL0ZvcmVncm91bmRDb2xvclNwYW5UZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L3N0eWxlL2N0cy9Gb3JlZ3JvdW5kQ29sb3JTcGFuVGVzdC5qYXZhCkBAIC0yMCwxMSArMjAsMTIgQEAKIAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3I7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRQYWludDsKIGltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuRm9yZWdyb3VuZENvbG9yU3BhbjsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L3N0eWxlL2N0cy9JY29uTWFyZ2luU3BhblRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9zdHlsZS9jdHMvSWNvbk1hcmdpblNwYW5UZXN0LmphdmEKaW5kZXggM2VlMjU2NC4uYmFiYWFlZiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L3N0eWxlL2N0cy9JY29uTWFyZ2luU3BhblRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvc3R5bGUvY3RzL0ljb25NYXJnaW5TcGFuVGVzdC5qYXZhCkBAIC0yMiw4ICsyMiw2IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludC5Gb250TWV0cmljc0ludDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnRleHQuSHRtbDsKIGltcG9ydCBhbmRyb2lkLnRleHQuTGF5b3V0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmVkOwpAQCAtMzEsNiArMjksOSBAQAogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0UGFpbnQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLkljb25NYXJnaW5TcGFuOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvc3R5bGUvY3RzL0ltYWdlU3BhblRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9zdHlsZS9jdHMvSW1hZ2VTcGFuVGVzdC5qYXZhCmluZGV4IDEzMDU5M2IuLjI5MDhiYTggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9zdHlsZS9jdHMvSW1hZ2VTcGFuVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9zdHlsZS9jdHMvSW1hZ2VTcGFuVGVzdC5qYXZhCkBAIC0yNSwxMyArMjUsMTQgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkJpdG1hcERyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5jdHMuUjsKIGltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuRHluYW1pY0RyYXdhYmxlU3BhbjsKIGltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuSW1hZ2VTcGFuOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLldpZGdldFRlc3RVdGlsczsKIAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvc3R5bGUvY3RzL0xlYWRpbmdNYXJnaW5TcGFuX1N0YW5kYXJkVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L3N0eWxlL2N0cy9MZWFkaW5nTWFyZ2luU3Bhbl9TdGFuZGFyZFRlc3QuamF2YQppbmRleCA2Njc5Y2FmLi43ZjRiMjU5IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvc3R5bGUvY3RzL0xlYWRpbmdNYXJnaW5TcGFuX1N0YW5kYXJkVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9zdHlsZS9jdHMvTGVhZGluZ01hcmdpblNwYW5fU3RhbmRhcmRUZXN0LmphdmEKQEAgLTE5LDExICsxOSwxMiBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIAogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5MZWFkaW5nTWFyZ2luU3BhbjsKIGltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuTGVhZGluZ01hcmdpblNwYW4uU3RhbmRhcmQ7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9zdHlsZS9jdHMvTG9jYWxlU3BhblRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9zdHlsZS9jdHMvTG9jYWxlU3BhblRlc3QuamF2YQppbmRleCA2NTliZTkzLi4yMTQ0MDk0IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvc3R5bGUvY3RzL0xvY2FsZVNwYW5UZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L3N0eWxlL2N0cy9Mb2NhbGVTcGFuVGVzdC5qYXZhCkBAIC0yMCwxMiArMjAsMTMgQEAKIAogaW1wb3J0IGFuZHJvaWQub3MuTG9jYWxlTGlzdDsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0UGFpbnQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLkxvY2FsZVNwYW47CiAKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk5vbk51bGw7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvc3R5bGUvY3RzL01hc2tGaWx0ZXJTcGFuVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L3N0eWxlL2N0cy9NYXNrRmlsdGVyU3BhblRlc3QuamF2YQppbmRleCA3YjlmM2Q5Li5kNzEzMzc1IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvc3R5bGUvY3RzL01hc2tGaWx0ZXJTcGFuVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9zdHlsZS9jdHMvTWFza0ZpbHRlclNwYW5UZXN0LmphdmEKQEAgLTIwLDExICsyMCwxMiBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFNhbWU7CiAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLk1hc2tGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRQYWludDsKIGltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuTWFza0ZpbHRlclNwYW47CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9zdHlsZS9jdHMvTWV0cmljQWZmZWN0aW5nU3BhblRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9zdHlsZS9jdHMvTWV0cmljQWZmZWN0aW5nU3BhblRlc3QuamF2YQppbmRleCBjYjg4NTBlLi44ZWE2YzFhIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvc3R5bGUvY3RzL01ldHJpY0FmZmVjdGluZ1NwYW5UZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L3N0eWxlL2N0cy9NZXRyaWNBZmZlY3RpbmdTcGFuVGVzdC5qYXZhCkBAIC0yMCwxMyArMjAsMTQgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRTYW1lOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFBhaW50OwogaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5DaGFyYWN0ZXJTdHlsZTsKIGltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuTWV0cmljQWZmZWN0aW5nU3BhbjsKIGltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuU3VwZXJzY3JpcHRTcGFuOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvc3R5bGUvY3RzL1F1b3RlU3BhblRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9zdHlsZS9jdHMvUXVvdGVTcGFuVGVzdC5qYXZhCmluZGV4IDM1OGJlMDcuLmRlMmZmNjggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9zdHlsZS9jdHMvUXVvdGVTcGFuVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9zdHlsZS9jdHMvUXVvdGVTcGFuVGVzdC5qYXZhCkBAIC0xNywxNSArMTcsMTcgQEAKIHBhY2thZ2UgYW5kcm9pZC50ZXh0LnN0eWxlLmN0czsKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5RdW90ZVNwYW47CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKQEAgLTMzLDE1ICszNSw0NyBAQAogQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKIHB1YmxpYyBjbGFzcyBRdW90ZVNwYW5UZXN0IHsKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcigpIHsKLSAgICAgICAgbmV3IFF1b3RlU3BhbigpOwotICAgICAgICBRdW90ZVNwYW4gcSA9IG5ldyBRdW90ZVNwYW4oQ29sb3IuUkVEKTsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdENvbnN0cnVjdG9yKCkgeworICAgICAgICBRdW90ZVNwYW4gc3BhbiA9IG5ldyBRdW90ZVNwYW4oKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNhbGN1bGF0ZUxlYWRpbmdNYXJnaW4oc3Bhbi5nZXRTdHJpcGVXaWR0aCgpLCBzcGFuLmdldEdhcFdpZHRoKCkpLAorICAgICAgICAgICAgICAgIHNwYW4uZ2V0TGVhZGluZ01hcmdpbih0cnVlKSk7CisgICAgICAgIGFzc2VydFRydWUoc3Bhbi5nZXRDb2xvcigpICE9IDApOworICAgICAgICBhc3NlcnRUcnVlKHNwYW4uZ2V0R2FwV2lkdGgoKSA+IDApOworICAgICAgICBhc3NlcnRUcnVlKHNwYW4uZ2V0U3RyaXBlV2lkdGgoKSA+IDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yRnJvbUNvbG9yKCkgeworICAgICAgICBRdW90ZVNwYW4gc3BhbiA9IG5ldyBRdW90ZVNwYW4oQ29sb3IuUkVEKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNhbGN1bGF0ZUxlYWRpbmdNYXJnaW4oc3Bhbi5nZXRTdHJpcGVXaWR0aCgpLCBzcGFuLmdldEdhcFdpZHRoKCkpLAorICAgICAgICAgICAgICAgIHNwYW4uZ2V0TGVhZGluZ01hcmdpbih0cnVlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhDb2xvci5SRUQsIHNwYW4uZ2V0Q29sb3IoKSk7CisgICAgICAgIGFzc2VydFRydWUoc3Bhbi5nZXRTdHJpcGVXaWR0aCgpID4gMCk7CisgICAgICAgIGFzc2VydFRydWUoc3Bhbi5nZXRHYXBXaWR0aCgpID4gMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JGcm9tQ29sb3JTdHJpcGVXaWR0aEdhcFdpZHRoKCkgeworICAgICAgICBRdW90ZVNwYW4gc3BhbiA9IG5ldyBRdW90ZVNwYW4oQ29sb3IuUkVELCAxMCwgNSk7CisgICAgICAgIGFzc2VydEVxdWFscyhjYWxjdWxhdGVMZWFkaW5nTWFyZ2luKDEwLCA1KSwgc3Bhbi5nZXRMZWFkaW5nTWFyZ2luKHRydWUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKENvbG9yLlJFRCwgc3Bhbi5nZXRDb2xvcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEwLCBzcGFuLmdldFN0cmlwZVdpZHRoKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNSwgc3Bhbi5nZXRHYXBXaWR0aCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvckZyb21QYXJjZWwoKSB7CisgICAgICAgIFF1b3RlU3BhbiBxdW90ZVNwYW4gPSBuZXcgUXVvdGVTcGFuKENvbG9yLlJFRCwgMTAsIDUpOwogCiAgICAgICAgIGZpbmFsIFBhcmNlbCBwID0gUGFyY2VsLm9idGFpbigpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgcS53cml0ZVRvUGFyY2VsKHAsIDApOworICAgICAgICAgICAgcXVvdGVTcGFuLndyaXRlVG9QYXJjZWwocCwgMCk7CiAgICAgICAgICAgICBwLnNldERhdGFQb3NpdGlvbigwKTsKLSAgICAgICAgICAgIG5ldyBRdW90ZVNwYW4ocCk7CisgICAgICAgICAgICBRdW90ZVNwYW4gc3BhbiA9IG5ldyBRdW90ZVNwYW4ocCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2FsY3VsYXRlTGVhZGluZ01hcmdpbigxMCwgNSksIHNwYW4uZ2V0TGVhZGluZ01hcmdpbih0cnVlKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoQ29sb3IuUkVELCBzcGFuLmdldENvbG9yKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEwLCBzcGFuLmdldFN0cmlwZVdpZHRoKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDUsIHNwYW4uZ2V0R2FwV2lkdGgoKSk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBwLnJlY3ljbGUoKTsKICAgICAgICAgfQpAQCAtMTAxLDYgKzEzNSw4IEBACiAgICAgICAgICAgICBwLnNldERhdGFQb3NpdGlvbigwKTsKICAgICAgICAgICAgIFF1b3RlU3BhbiBxID0gbmV3IFF1b3RlU3BhbihwKTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscyhDb2xvci5SRUQsIHEuZ2V0Q29sb3IoKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHEuZ2V0R2FwV2lkdGgoKSA+IDApOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShxLmdldFN0cmlwZVdpZHRoKCkgPiAwKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIHAucmVjeWNsZSgpOwogICAgICAgICB9CkBAIC0xMTEsOCArMTQ3LDE0IEBACiAgICAgICAgICAgICBwLnNldERhdGFQb3NpdGlvbigwKTsKICAgICAgICAgICAgIFF1b3RlU3BhbiBxID0gbmV3IFF1b3RlU3BhbihwKTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscyhDb2xvci5NQUdFTlRBLCBxLmdldENvbG9yKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShxLmdldEdhcFdpZHRoKCkgPiAwKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocS5nZXRTdHJpcGVXaWR0aCgpID4gMCk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBwLnJlY3ljbGUoKTsKICAgICAgICAgfQogICAgIH0KKworICAgIHByaXZhdGUgaW50IGNhbGN1bGF0ZUxlYWRpbmdNYXJnaW4oaW50IHN0cmlwZVdpZHRoLCBpbnQgZ2FwV2lkdGgpIHsKKyAgICAgICAgcmV0dXJuIHN0cmlwZVdpZHRoICsgZ2FwV2lkdGg7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L3N0eWxlL2N0cy9SZWxhdGl2ZVNpemVTcGFuVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L3N0eWxlL2N0cy9SZWxhdGl2ZVNpemVTcGFuVGVzdC5qYXZhCmluZGV4IDNjYWM2MmUuLmY5NTUzOWMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9zdHlsZS9jdHMvUmVsYXRpdmVTaXplU3BhblRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvc3R5bGUvY3RzL1JlbGF0aXZlU2l6ZVNwYW5UZXN0LmphdmEKQEAgLTE5LDExICsxOSwxMiBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIAogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0UGFpbnQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlJlbGF0aXZlU2l6ZVNwYW47CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9zdHlsZS9jdHMvUmVwbGFjZW1lbnRTcGFuVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L3N0eWxlL2N0cy9SZXBsYWNlbWVudFNwYW5UZXN0LmphdmEKaW5kZXggNTE0ZTIyYi4uN2RjYTMyNCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L3N0eWxlL2N0cy9SZXBsYWNlbWVudFNwYW5UZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L3N0eWxlL2N0cy9SZXBsYWNlbWVudFNwYW5UZXN0LmphdmEKQEAgLTE5LDEwICsxOSwxMSBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludC5Gb250TWV0cmljc0ludDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuUmVwbGFjZW1lbnRTcGFuOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvc3R5bGUvY3RzL1NjYWxlWFNwYW5UZXN0LmphdmEgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvc3R5bGUvY3RzL1NjYWxlWFNwYW5UZXN0LmphdmEKaW5kZXggZDI0M2VmNi4uOGEzNmE1MiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L3N0eWxlL2N0cy9TY2FsZVhTcGFuVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9zdHlsZS9jdHMvU2NhbGVYU3BhblRlc3QuamF2YQpAQCAtMTksMTEgKzE5LDEyIEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogCiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRQYWludDsKIGltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuU2NhbGVYU3BhbjsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L3N0eWxlL2N0cy9TdHJpa2V0aHJvdWdoU3BhblRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9zdHlsZS9jdHMvU3RyaWtldGhyb3VnaFNwYW5UZXN0LmphdmEKaW5kZXggMTI1Yjc3My4uMjNlNzg3ZCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L3N0eWxlL2N0cy9TdHJpa2V0aHJvdWdoU3BhblRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvc3R5bGUvY3RzL1N0cmlrZXRocm91Z2hTcGFuVGVzdC5qYXZhCkBAIC0yMSwxNCArMjEsMTUgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZVN0cmluZzsKIGltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5lZDsKIGltcG9ydCBhbmRyb2lkLnRleHQuU3RhdGljTGF5b3V0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0UGFpbnQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlN0cmlrZXRocm91Z2hTcGFuOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvc3R5bGUvY3RzL1N0eWxlU3BhblRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9zdHlsZS9jdHMvU3R5bGVTcGFuVGVzdC5qYXZhCmluZGV4IDRiNGZjN2UuLjcyM2ZhMjcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9zdHlsZS9jdHMvU3R5bGVTcGFuVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9zdHlsZS9jdHMvU3R5bGVTcGFuVGVzdC5qYXZhCkBAIC0yMSwxMSArMjEsMTIgQEAKIAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuVHlwZWZhY2U7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRQYWludDsKIGltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuU3R5bGVTcGFuOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvc3R5bGUvY3RzL1N1YnNjcmlwdFNwYW5UZXN0LmphdmEgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvc3R5bGUvY3RzL1N1YnNjcmlwdFNwYW5UZXN0LmphdmEKaW5kZXggMDAwYmU4ZC4uNzVjYWI4NyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L3N0eWxlL2N0cy9TdWJzY3JpcHRTcGFuVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9zdHlsZS9jdHMvU3Vic2NyaXB0U3BhblRlc3QuamF2YQpAQCAtMjAsMTEgKzIwLDEyIEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogCiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRQYWludDsKIGltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuU3Vic2NyaXB0U3BhbjsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L3N0eWxlL2N0cy9TdWdnZXN0aW9uU3BhblRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9zdHlsZS9jdHMvU3VnZ2VzdGlvblNwYW5UZXN0LmphdmEKaW5kZXggZmY2MjI3My4uZDM0Yjk0OCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L3N0eWxlL2N0cy9TdWdnZXN0aW9uU3BhblRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvc3R5bGUvY3RzL1N1Z2dlc3Rpb25TcGFuVGVzdC5qYXZhCkBAIC0yNSwxNyArMjUsMTggQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5Mb2NhbGVMaXN0OwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uTnVsbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZVN0cmluZzsKIGltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5lZDsKIGltcG9ydCBhbmRyb2lkLnRleHQuU3RhdGljTGF5b3V0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0UGFpbnQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlN1Z2dlc3Rpb25TcGFuOwogCitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5Ob25OdWxsOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTnVsbGFibGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9zdHlsZS9jdHMvU3VwZXJzY3JpcHRTcGFuVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L3N0eWxlL2N0cy9TdXBlcnNjcmlwdFNwYW5UZXN0LmphdmEKaW5kZXggNjhmYThjOC4uZmZjNzQxMyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L3N0eWxlL2N0cy9TdXBlcnNjcmlwdFNwYW5UZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L3N0eWxlL2N0cy9TdXBlcnNjcmlwdFNwYW5UZXN0LmphdmEKQEAgLTE5LDExICsxOSwxMiBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIAogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0UGFpbnQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlN1cGVyc2NyaXB0U3BhbjsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L3N0eWxlL2N0cy9UYWJTdG9wU3Bhbl9TdGFuZGFyZFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9zdHlsZS9jdHMvVGFiU3RvcFNwYW5fU3RhbmRhcmRUZXN0LmphdmEKaW5kZXggMzRjNDg3ZS4uYTMyYzM5MSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L3N0eWxlL2N0cy9UYWJTdG9wU3Bhbl9TdGFuZGFyZFRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvc3R5bGUvY3RzL1RhYlN0b3BTcGFuX1N0YW5kYXJkVGVzdC5qYXZhCkBAIC0xOCwxMSArMTgsMTIgQEAKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIAotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5UYWJTdG9wU3BhbjsKIGltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuVGFiU3RvcFNwYW4uU3RhbmRhcmQ7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9zdHlsZS9jdHMvVGV4dEFwcGVhcmFuY2VTcGFuVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L3N0eWxlL2N0cy9UZXh0QXBwZWFyYW5jZVNwYW5UZXN0LmphdmEKaW5kZXggNDg5ZWRiMi4uZmZkYzIyZSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L3N0eWxlL2N0cy9UZXh0QXBwZWFyYW5jZVNwYW5UZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L3N0eWxlL2N0cy9UZXh0QXBwZWFyYW5jZVNwYW5UZXN0LmphdmEKQEAgLTI2LDEyICsyNiwxMyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29sb3JTdGF0ZUxpc3Q7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFBhaW50OwogaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5UZXh0QXBwZWFyYW5jZVNwYW47CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L3N0eWxlL2N0cy9UdHNTcGFuVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L3N0eWxlL2N0cy9UdHNTcGFuVGVzdC5qYXZhCmluZGV4IGM4YTIzZmMuLjJiMmRjY2EgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9zdHlsZS9jdHMvVHRzU3BhblRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvc3R5bGUvY3RzL1R0c1NwYW5UZXN0LmphdmEKQEAgLTIwLDEwICsyMCwxMSBAQAogCiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CiBpbXBvcnQgYW5kcm9pZC5vcy5QZXJzaXN0YWJsZUJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuVHRzU3BhbjsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L3N0eWxlL2N0cy9UeXBlZmFjZVNwYW5UZXN0LmphdmEgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvc3R5bGUvY3RzL1R5cGVmYWNlU3BhblRlc3QuamF2YQppbmRleCBmZmMwMjRhLi5mYzBmYTE4IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvc3R5bGUvY3RzL1R5cGVmYWNlU3BhblRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvc3R5bGUvY3RzL1R5cGVmYWNlU3BhblRlc3QuamF2YQpAQCAtMjIsMTEgKzIyLDEyIEBACiAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlR5cGVmYWNlOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0UGFpbnQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlR5cGVmYWNlU3BhbjsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApAQCAtMzYsNiArMzcsMTQgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFNSUxZID0gIm1vbm9zcGFjZSI7CiAKICAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvckZyb21UeXBlZmFjZSgpIHsKKyAgICAgICAgVHlwZWZhY2UgdHlwZWZhY2UgPSBUeXBlZmFjZS5jcmVhdGUoRkFNSUxZLCBUeXBlZmFjZS5CT0xEKTsKKyAgICAgICAgVHlwZWZhY2VTcGFuIHQgPSBuZXcgVHlwZWZhY2VTcGFuKHR5cGVmYWNlKTsKKworICAgICAgICBhc3NlcnRFcXVhbHModHlwZWZhY2UsIHQuZ2V0VHlwZWZhY2UoKSk7CisgICAgfQorCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IoKSB7CiAgICAgICAgIFR5cGVmYWNlU3BhbiB0ID0gbmV3IFR5cGVmYWNlU3BhbihGQU1JTFkpOwogCkBAIC02OSw3ICs3OCw3IEBACiAgICAgICAgIGFzc2VydEVxdWFscyhUeXBlZmFjZS5OT1JNQUwsIHRwLmdldFR5cGVmYWNlKCkuZ2V0U3R5bGUoKSk7CiAgICAgfQogCi0gICAgQFRlc3QoZXhwZWN0ZWQ9TnVsbFBvaW50ZXJFeGNlcHRpb24uY2xhc3MpCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBOdWxsUG9pbnRlckV4Y2VwdGlvbi5jbGFzcykKICAgICBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTWVhc3VyZVN0YXRlTnVsbCgpIHsKICAgICAgICAgVHlwZWZhY2VTcGFuIHR5cGVmYWNlU3BhbiA9IG5ldyBUeXBlZmFjZVNwYW4oRkFNSUxZKTsKIApAQCAtOTAsNyArOTksNyBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoVHlwZWZhY2UuTk9STUFMLCB0cC5nZXRUeXBlZmFjZSgpLmdldFN0eWxlKCkpOwogICAgIH0KIAotICAgIEBUZXN0KGV4cGVjdGVkPU51bGxQb2ludGVyRXhjZXB0aW9uLmNsYXNzKQorICAgIEBUZXN0KGV4cGVjdGVkID0gTnVsbFBvaW50ZXJFeGNlcHRpb24uY2xhc3MpCiAgICAgcHVibGljIHZvaWQgdGVzdFVwZGF0ZURyYXdTdGF0ZU51bGwoKSB7CiAgICAgICAgIFR5cGVmYWNlU3BhbiB0eXBlZmFjZVNwYW4gPSBuZXcgVHlwZWZhY2VTcGFuKEZBTUlMWSk7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9zdHlsZS9jdHMvVVJMU3BhblRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9zdHlsZS9jdHMvVVJMU3BhblRlc3QuamF2YQppbmRleCAwNjdiNTZiLi5hMjczYzZiIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvc3R5bGUvY3RzL1VSTFNwYW5UZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L3N0eWxlL2N0cy9VUkxTcGFuVGVzdC5qYXZhCkBAIC0yMywxNSArMjMsMTYgQEAKIGltcG9ydCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb247CiBpbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uLkFjdGl2aXR5TW9uaXRvcjsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLkxhcmdlVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LmN0cy5SOwogaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5VUkxTcGFuOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTGFyZ2VUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvc3R5bGUvY3RzL1VuZGVybGluZVNwYW5UZXN0LmphdmEgYi90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvc3R5bGUvY3RzL1VuZGVybGluZVNwYW5UZXN0LmphdmEKaW5kZXggNTgxNDE3Zi4uYmRmMTMyNiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L3N0eWxlL2N0cy9VbmRlcmxpbmVTcGFuVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC9zdHlsZS9jdHMvVW5kZXJsaW5lU3BhblRlc3QuamF2YQpAQCAtMjEsMTQgKzIxLDE1IEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmc7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uZWQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlN0YXRpY0xheW91dDsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFBhaW50OwogaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5VbmRlcmxpbmVTcGFuOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvdXRpbC9jdHMvTGlua2lmeVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC91dGlsL2N0cy9MaW5raWZ5VGVzdC5qYXZhCmluZGV4IGUxYzQ3NDIuLjk5ZDNjNTQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC91dGlsL2N0cy9MaW5raWZ5VGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC91dGlsL2N0cy9MaW5raWZ5VGVzdC5qYXZhCkBAIC0yMSwxMCArMjEsNiBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuVGVsZXBob255TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlOwogaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmc7CkBAIC0zNCw5ICszMCwxNSBAQAogaW1wb3J0IGFuZHJvaWQudGV4dC51dGlsLkxpbmtpZnkuVHJhbnNmb3JtRmlsdGVyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcubW9ja2l0by5Bcmd1bWVudE1hdGNoZXI7CiAKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwpAQCAtMTAwMCw0ICsxMDAyLDE4IEBACiAgICAgICAgIGFzc2VydFRydWUobXNnLCBsaW5rc0FkZGVkKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKG1zZywgZXhwZWN0ZWQsIHNwYW5zWzBdLmdldFVSTCgpLnRvU3RyaW5nKCkpOwogICAgIH0KKworICAgIC8qKiBIZWxwZXIgdG8gbWF0Y2ggYSBDaGFyU2VxdWVuY2UgYmFzZWQgb24gU3RyaW5nIGVxdWl2YWxlbmNlLiAqLworICAgIGNsYXNzIEVxU3RyaW5nTWF0Y2hlciBpbXBsZW1lbnRzIEFyZ3VtZW50TWF0Y2hlcjxDaGFyU2VxdWVuY2U+IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVJlZmVyZW5jZTsKKworICAgICAgICBFcVN0cmluZ01hdGNoZXIoQ2hhclNlcXVlbmNlIHJlZmVyZW5jZSkgeworICAgICAgICAgICAgbVJlZmVyZW5jZSA9IHJlZmVyZW5jZS50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoQ2hhclNlcXVlbmNlIGFyZykgeworICAgICAgICAgICAgcmV0dXJuIG1SZWZlcmVuY2UuZXF1YWxzKGFyZy50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC91dGlsL2N0cy9SZmM4MjJUb2tlblRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC91dGlsL2N0cy9SZmM4MjJUb2tlblRlc3QuamF2YQppbmRleCA0N2M0NTQ0Li4yNzI1ZjcyIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvdXRpbC9jdHMvUmZjODIyVG9rZW5UZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L3V0aWwvY3RzL1JmYzgyMlRva2VuVGVzdC5qYXZhCkBAIC0xOSwxMCArMTksMTEgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKIAotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudGV4dC51dGlsLlJmYzgyMlRva2VuOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvdXRpbC9jdHMvUmZjODIyVG9rZW5pemVyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdGV4dC9zcmMvYW5kcm9pZC90ZXh0L3V0aWwvY3RzL1JmYzgyMlRva2VuaXplclRlc3QuamF2YQppbmRleCBjOGI4MWY0Li4yY2FlYTc0IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy90ZXh0L3NyYy9hbmRyb2lkL3RleHQvdXRpbC9jdHMvUmZjODIyVG9rZW5pemVyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3RleHQvc3JjL2FuZHJvaWQvdGV4dC91dGlsL2N0cy9SZmM4MjJUb2tlbml6ZXJUZXN0LmphdmEKQEAgLTE5LDExICsxOSwxMiBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwogCi1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LnV0aWwuUmZjODIyVG9rZW47CiBpbXBvcnQgYW5kcm9pZC50ZXh0LnV0aWwuUmZjODIyVG9rZW5pemVyOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90aGVtZS9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvdGhlbWUvQW5kcm9pZC5tawppbmRleCA3MWQ1NzZkLi43NzFhNmRlIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy90aGVtZS9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3Rlc3RzL3RoZW1lL0FuZHJvaWQubWsKQEAgLTI0LDcgKzI0LDkgQEAKICMgV2hlbiBidWlsdCwgZXhwbGljaXRseSBwdXQgaXQgaW4gdGhlIGRhdGEgcGFydGl0aW9uLgogTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKIAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGN0c3Rlc3RydW5uZXIgbGVnYWN5LWFuZHJvaWQtdGVzdAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGN0c3Rlc3RydW5uZXItYXh0CisKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIuc3R1YnMgYW5kcm9pZC50ZXN0LmJhc2Uuc3R1YnMKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90aGVtZS9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdGVzdHMvdGhlbWUvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBlM2JhMGM2Li4wMjY0Y2JmIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy90aGVtZS9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL3RoZW1lL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTIzLDcgKzIzLDcgQEAKICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50aGVtZS5jdHMuRGV2aWNlRGVmYXVsdEFjdGl2aXR5IiAvPgogICAgIDwvYXBwbGljYXRpb24+CiAKLSAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLnRoZW1lLmN0cyIKICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBmb3IgdGhlbWVzIj4KICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9Imxpc3RlbmVyIgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdGhlbWUvQW5kcm9pZFRlc3QueG1sIGIvdGVzdHMvdGVzdHMvdGhlbWUvQW5kcm9pZFRlc3QueG1sCmluZGV4IDM5ZGE3OTguLjk1YTdhODggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RoZW1lL0FuZHJvaWRUZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy90aGVtZS9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBUaGVtZSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0idWl0b29sa2l0IiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90b2FzdC9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvdG9hc3QvQW5kcm9pZC5tawppbmRleCBlNGU4ODlkLi40YzhjZDUxIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy90b2FzdC9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3Rlc3RzL3RvYXN0L0FuZHJvaWQubWsKQEAgLTIxLDEzICsyMSwxNCBAQAogCiBMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQogCi1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMgY3RzX2luc3RhbnQKIAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGN0c3Rlc3RydW5uZXIgYW5kcm9pZC1zdXBwb3J0LXRlc3QgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGN0c3Rlc3RydW5uZXItYXh0IGFuZHJvaWR4LnRlc3QucnVsZXMKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzVG9hc3RUZXN0Q2FzZXMKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKIAogaW5jbHVkZSAkKEJVSUxEX0NUU19QQUNLQUdFKQogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90b2FzdC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdGVzdHMvdG9hc3QvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCAxZmE3MWM0Li45YjA4MDRmIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy90b2FzdC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL3RvYXN0L0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTE1LDE0ICsxNSwxNSBAQAogLS0+CiAKIDxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICBwYWNrYWdlPSJhbmRyb2lkLndpZGdldC50b2FzdC5jdHMiPgorICAgICAgcGFja2FnZT0iYW5kcm9pZC53aWRnZXQudG9hc3QuY3RzIgorICAgICAgYW5kcm9pZDp0YXJnZXRTYW5kYm94VmVyc2lvbj0iMiI+CiAKICAgICA8dXNlcy1zZGsgYW5kcm9pZDptaW5TZGtWZXJzaW9uPSIyNSIgYW5kcm9pZDp0YXJnZXRTZGtWZXJzaW9uPSIyNiIgLz4KIAogICAgIDxhcHBsaWNhdGlvbj4KICAgICA8L2FwcGxpY2F0aW9uPgogCi0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLndpZGdldC50b2FzdC5jdHMiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBmb3IgdG9hc3Qgd2luZG93cyI+CiAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJsaXN0ZW5lciIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RvYXN0L0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL3RvYXN0L0FuZHJvaWRUZXN0LnhtbAppbmRleCA2NmNlYjVkLi4wZjAwOTEzIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy90b2FzdC9BbmRyb2lkVGVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvdG9hc3QvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBUb2FzdCB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iZnJhbWV3b3JrIiAvPgogICAgIDxvcHRpb24gbmFtZT0ibm90LXNoYXJkYWJsZSIgdmFsdWU9InRydWUiIC8+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90b2FzdC9zcmMvYW5kcm9pZC93aWRnZXQvdG9hc3QvY3RzL0Jhc2VUb2FzdFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RvYXN0L3NyYy9hbmRyb2lkL3dpZGdldC90b2FzdC9jdHMvQmFzZVRvYXN0VGVzdC5qYXZhCmluZGV4IGZkNzUzMDkuLmRmMWQ0N2EgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RvYXN0L3NyYy9hbmRyb2lkL3dpZGdldC90b2FzdC9jdHMvQmFzZVRvYXN0VGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3RvYXN0L3NyYy9hbmRyb2lkL3dpZGdldC90b2FzdC9jdHMvQmFzZVRvYXN0VGVzdC5qYXZhCkBAIC0yMSwxMCArMjEsMTIgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBpeGVsRm9ybWF0OwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVG9hc3Q7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIAogLyoqCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90b2FzdC9zcmMvYW5kcm9pZC93aWRnZXQvdG9hc3QvY3RzL0xlZ2FjeVRvYXN0VGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdG9hc3Qvc3JjL2FuZHJvaWQvd2lkZ2V0L3RvYXN0L2N0cy9MZWdhY3lUb2FzdFRlc3QuamF2YQppbmRleCBjNjg2NWI3Li42M2Q4MDdkIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy90b2FzdC9zcmMvYW5kcm9pZC93aWRnZXQvdG9hc3QvY3RzL0xlZ2FjeVRvYXN0VGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3RvYXN0L3NyYy9hbmRyb2lkL3dpZGdldC90b2FzdC9jdHMvTGVnYWN5VG9hc3RUZXN0LmphdmEKQEAgLTE2LDIyICsxNiwyMCBAQAogCiBwYWNrYWdlIGFuZHJvaWQud2lkZ2V0LnRvYXN0LmN0czsKIAotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKIGltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ2RkVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKLQogLyoqCiAgKiBUZXN0IHdoZXRoZXIgdG9hc3RzIGFyZSBwcm9wZXJseSBzaG93bi4gRm9yIGFwcHMgdGFyZ2V0aW5nIEFQSSAyNSsKICAqIGxpa2UgdGhpcyBhcHAgdGhlIG9ubHkgd2F5IHRvIGFkZCB0b2FzdCB3aW5kb3dzIGlzIHZpYSB0aGUgZGVkaWNhdGVkCiAgKiB0b2FzdCBBUElzLgogICovCi1AQ2RkVGVzdChyZXF1aXJlbWVudD0iMy44LjUvQy0xLTIiKQogQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKIHB1YmxpYyBjbGFzcyBMZWdhY3lUb2FzdFRlc3QgZXh0ZW5kcyBCYXNlVG9hc3RUZXN0IHsKICAgICBAVGVzdApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdG9hc3RsZWdhY3kvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL3RvYXN0bGVnYWN5L0FuZHJvaWQubWsKaW5kZXggMzM1YzUzOS4uMTVkYWQ3ZCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdG9hc3RsZWdhY3kvQW5kcm9pZC5taworKysgYi90ZXN0cy90ZXN0cy90b2FzdGxlZ2FjeS9BbmRyb2lkLm1rCkBAIC0yMywxMiArMjMsMTMgQEAKIAogTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKIAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGN0c3Rlc3RydW5uZXIgYW5kcm9pZC1zdXBwb3J0LXRlc3QKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjdHN0ZXN0cnVubmVyLWF4dCBhbmRyb2lkeC50ZXN0LnJ1bGVzCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykgXAogICAgIC4uL3RvYXN0L3NyYy9hbmRyb2lkL3dpZGdldC90b2FzdC9jdHMvQmFzZVRvYXN0VGVzdC5qYXZhCiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNUb2FzdExlZ2FjeVRlc3RDYXNlcworTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAogCiBpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RvYXN0bGVnYWN5L0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy90ZXN0cy90b2FzdGxlZ2FjeS9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDg1MjliNWMuLmRmMTE2MTMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RvYXN0bGVnYWN5L0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvdG9hc3RsZWdhY3kvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjQsNyArMjQsNyBAQAogICAgICAgICA8L2FjdGl2aXR5PgogICAgIDwvYXBwbGljYXRpb24+CiAKLSAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQud2lkZ2V0LnRvYXN0LmxlZ2FjeS5jdHMiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBmb3IgbGVnYWN5IHRvYXN0IHdpbmRvd3MiPgogICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0ibGlzdGVuZXIiCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90b2FzdGxlZ2FjeS9zcmMvYW5kcm9pZC93aWRnZXQvdG9hc3QvY3RzL2xlZ2FjeS9Ub2FzdFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RvYXN0bGVnYWN5L3NyYy9hbmRyb2lkL3dpZGdldC90b2FzdC9jdHMvbGVnYWN5L1RvYXN0VGVzdC5qYXZhCmluZGV4IGMyZWNiM2EuLjlmNzM0ZTAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RvYXN0bGVnYWN5L3NyYy9hbmRyb2lkL3dpZGdldC90b2FzdC9jdHMvbGVnYWN5L1RvYXN0VGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3RvYXN0bGVnYWN5L3NyYy9hbmRyb2lkL3dpZGdldC90b2FzdC9jdHMvbGVnYWN5L1RvYXN0VGVzdC5qYXZhCkBAIC0xNiwxMSArMTYsMTMgQEAKIAogcGFja2FnZSBhbmRyb2lkLndpZGdldC50b2FzdC5jdHMubGVnYWN5OwogCi1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC50b2FzdC5jdHMuQmFzZVRvYXN0VGVzdDsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdHJhbnNpdGlvbi9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvdHJhbnNpdGlvbi9BbmRyb2lkLm1rCmluZGV4IGNiYTBiNDUuLmI2ZWQ4ZjQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RyYW5zaXRpb24vQW5kcm9pZC5taworKysgYi90ZXN0cy90ZXN0cy90cmFuc2l0aW9uL0FuZHJvaWQubWsKQEAgLTI1LDIwICsyNSwyMiBAQAogTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKIAogTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTICs9IFwKLSAgICBhbmRyb2lkLXN1cHBvcnQtdGVzdCBcCisgICAgYW5kcm9pZHgudGVzdC5ydWxlcyBcCiAgICAgbW9ja2l0by10YXJnZXQtbWludXMtanVuaXQ0IFwKICAgICBoYW1jcmVzdC1saWJyYXJ5IFwKICAgICBhbmRyb2lkLWNvbW1vbiBcCi0gICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbCBcCi0gICAgY3RzdGVzdHJ1bm5lciBcCi0gICAgcGxhdGZvcm0tdGVzdC1hbm5vdGF0aW9ucyBcCi0gICAgbGVnYWN5LWFuZHJvaWQtdGVzdAorICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0IFwKKyAgICBjdHN0ZXN0cnVubmVyLWF4dCBcCisgICAgcGxhdGZvcm0tdGVzdC1hbm5vdGF0aW9ucwogCi1MT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIAogIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAogTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKIAorIyBFbmZvcmNlIHB1YmxpYyAvIHRlc3QgYXBpIG9ubHkKK0xPQ0FMX1NES19WRVJTSU9OIDo9IHRlc3RfY3VycmVudAorCiBpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90cmFuc2l0aW9uL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy90ZXN0cy90cmFuc2l0aW9uL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggNjcxOTU4Zi4uYzgyNTY1MyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdHJhbnNpdGlvbi9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL3RyYW5zaXRpb24vQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjYsNyArMjYsNyBAQAogICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KICAgICA8L2FwcGxpY2F0aW9uPgogCi0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC50cmFuc2l0aW9uLmN0cyIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBmb3IgYW5kcm9pZC50cmFuc2l0aW9uIHBhY2thZ2UiPgogICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0ibGlzdGVuZXIiCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90cmFuc2l0aW9uL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL3RyYW5zaXRpb24vQW5kcm9pZFRlc3QueG1sCmluZGV4IDQ2MzJjYmUuLmU3NWU4ZGUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RyYW5zaXRpb24vQW5kcm9pZFRlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL3RyYW5zaXRpb24vQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgVHJhbnNpdGlvbiB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0idWl0b29sa2l0IiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90cmFuc2l0aW9uL3NyYy9hbmRyb2lkL3RyYW5zaXRpb24vY3RzL0FjdGl2aXR5VHJhbnNpdGlvblRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RyYW5zaXRpb24vc3JjL2FuZHJvaWQvdHJhbnNpdGlvbi9jdHMvQWN0aXZpdHlUcmFuc2l0aW9uVGVzdC5qYXZhCmluZGV4IDZjNGRlMzMuLjRkMTc1NmMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RyYW5zaXRpb24vc3JjL2FuZHJvaWQvdHJhbnNpdGlvbi9jdHMvQWN0aXZpdHlUcmFuc2l0aW9uVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3RyYW5zaXRpb24vc3JjL2FuZHJvaWQvdHJhbnNpdGlvbi9jdHMvQWN0aXZpdHlUcmFuc2l0aW9uVGVzdC5qYXZhCkBAIC0zNCw4ICszNCw2IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5CaXRtYXBEcmF3YWJsZTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnRyYW5zaXRpb24uRmFkZTsKIGltcG9ydCBhbmRyb2lkLnRyYW5zaXRpb24uVHJhbnNpdGlvbjsKIGltcG9ydCBhbmRyb2lkLnRyYW5zaXRpb24uVHJhbnNpdGlvbi5UcmFuc2l0aW9uTGlzdGVuZXI7CkBAIC00Myw2ICs0MSw5IEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlBvbGxpbmdDaGVjazsKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLnRyYW5zaXRpb24uVGFyZ2V0VHJhY2tpbmc7CiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC50cmFuc2l0aW9uLlRyYWNraW5nVHJhbnNpdGlvbjsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RyYW5zaXRpb24vc3JjL2FuZHJvaWQvdHJhbnNpdGlvbi9jdHMvQXJjTW90aW9uVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdHJhbnNpdGlvbi9zcmMvYW5kcm9pZC90cmFuc2l0aW9uL2N0cy9BcmNNb3Rpb25UZXN0LmphdmEKaW5kZXggMzcwMTU1ZC4uYjcxMTMzYiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdHJhbnNpdGlvbi9zcmMvYW5kcm9pZC90cmFuc2l0aW9uL2N0cy9BcmNNb3Rpb25UZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdHJhbnNpdGlvbi9zcmMvYW5kcm9pZC90cmFuc2l0aW9uL2N0cy9BcmNNb3Rpb25UZXN0LmphdmEKQEAgLTE4LDEwICsxOCwxMSBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGF0aDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnRyYW5zaXRpb24uQXJjTW90aW9uOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCkBAIC0xOTYsNyArMTk3LDM4IEBACiAgICAgICAgIGV4cGVjdGVkID0gYXJjV2l0aFBvaW50KDEwMCwgNTAsIDAsIDAsIGV4LCBleSk7CiAgICAgICAgIHBhdGggPSBhcmNNb3Rpb24uZ2V0UGF0aCgxMDAsIDUwLCAwLCAwKTsKICAgICAgICAgYXNzZXJ0UGF0aE1hdGNoZXMoZXhwZWN0ZWQsIHBhdGgpOworICAgIH0KIAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgaG9yaXpvbnRhbEFuZFZlcnRpY2FsTW90aW9uKCkgeworICAgICAgICBBcmNNb3Rpb24gYXJjTW90aW9uID0gbmV3IEFyY01vdGlvbigpOworICAgICAgICBhcmNNb3Rpb24uc2V0TWluaW11bUhvcml6b250YWxBbmdsZSg4MCk7CisgICAgICAgIGFyY01vdGlvbi5zZXRNYXhpbXVtQW5nbGUoOTApOworCisgICAgICAgIGZsb2F0IGV4ID0gNTA7CisgICAgICAgIGZsb2F0IGV5ID0gKGZsb2F0KSAoNTAgKiBNYXRoLnRhbihNYXRoLnRvUmFkaWFucyg0MCkpKTsKKyAgICAgICAgUGF0aCBleHBlY3RlZCA9IGFyY1dpdGhQb2ludCgwLCAwLCAxMDAsIDAsIGV4LCBleSk7CisgICAgICAgIFBhdGggcGF0aCA9IGFyY01vdGlvbi5nZXRQYXRoKDAsIDAsIDEwMCwgMCk7CisgICAgICAgIGFzc2VydFBhdGhNYXRjaGVzKGV4cGVjdGVkLCBwYXRoKTsKKworICAgICAgICAvLyBOb3cgbW92ZSBpdCBpbiB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uCisgICAgICAgIGV4cGVjdGVkID0gYXJjV2l0aFBvaW50KDEwMCwgMCwgMCwgMCwgZXgsIGV5KTsKKyAgICAgICAgcGF0aCA9IGFyY01vdGlvbi5nZXRQYXRoKDEwMCwgMCwgMCwgMCk7CisgICAgICAgIGFzc2VydFBhdGhNYXRjaGVzKGV4cGVjdGVkLCBwYXRoKTsKKworICAgICAgICAvLyBOb3cgdHJ5IHZlcnRpY2FsIHBhdGgKKyAgICAgICAgYXJjTW90aW9uLnNldE1pbmltdW1WZXJ0aWNhbEFuZ2xlKDQ1KTsKKyAgICAgICAgZXggPSAoZmxvYXQpICg1MCAqIE1hdGgudGFuKE1hdGgudG9SYWRpYW5zKDIyLjUpKSk7CisgICAgICAgIGV5ID0gNTBmOworICAgICAgICBleHBlY3RlZCA9IGFyY1dpdGhQb2ludCgwLCAwLCAwLCAxMDBmLCBleCwgZXkpOworICAgICAgICBwYXRoID0gYXJjTW90aW9uLmdldFBhdGgoMCwgMCwgMCwgMTAwZik7CisgICAgICAgIGFzc2VydFBhdGhNYXRjaGVzKGV4cGVjdGVkLCBwYXRoKTsKKworICAgICAgICAvLyBOb3cgbW92ZSBpdCBpbiB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uCisgICAgICAgIGFyY01vdGlvbi5zZXRNaW5pbXVtVmVydGljYWxBbmdsZSg0NSk7CisgICAgICAgIGV4cGVjdGVkID0gYXJjV2l0aFBvaW50KDAsIDEwMCwgMCwgMGYsIGV4LCBleSk7CisgICAgICAgIHBhdGggPSBhcmNNb3Rpb24uZ2V0UGF0aCgwLCAxMDAsIDAsIDBmKTsKKyAgICAgICAgYXNzZXJ0UGF0aE1hdGNoZXMoZXhwZWN0ZWQsIHBhdGgpOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdHJhbnNpdGlvbi9zcmMvYW5kcm9pZC90cmFuc2l0aW9uL2N0cy9CYXNlVHJhbnNpdGlvblRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RyYW5zaXRpb24vc3JjL2FuZHJvaWQvdHJhbnNpdGlvbi9jdHMvQmFzZVRyYW5zaXRpb25UZXN0LmphdmEKaW5kZXggNTkxN2FjZS4uMWNjZDE0MiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdHJhbnNpdGlvbi9zcmMvYW5kcm9pZC90cmFuc2l0aW9uL2N0cy9CYXNlVHJhbnNpdGlvblRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy90cmFuc2l0aW9uL3NyYy9hbmRyb2lkL3RyYW5zaXRpb24vY3RzL0Jhc2VUcmFuc2l0aW9uVGVzdC5qYXZhCkBAIC0yNSw4ICsyNSw2IEBACiBpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3I7CiBpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uT2JqZWN0QW5pbWF0b3I7CiBpbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKIGltcG9ydCBhbmRyb2lkLnRyYW5zaXRpb24uU2NlbmU7CiBpbXBvcnQgYW5kcm9pZC50cmFuc2l0aW9uLlRyYW5zaXRpb247CiBpbXBvcnQgYW5kcm9pZC50cmFuc2l0aW9uLlRyYW5zaXRpb25NYW5hZ2VyOwpAQCAtMzYsNiArMzQsOSBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworCiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5XaWRnZXRUZXN0VXRpbHM7CiAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdHJhbnNpdGlvbi9zcmMvYW5kcm9pZC90cmFuc2l0aW9uL2N0cy9DYXB0dXJlVmFsdWVzVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdHJhbnNpdGlvbi9zcmMvYW5kcm9pZC90cmFuc2l0aW9uL2N0cy9DYXB0dXJlVmFsdWVzVGVzdC5qYXZhCmluZGV4IDUzOGY0NmMuLjJjNzVhOGIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RyYW5zaXRpb24vc3JjL2FuZHJvaWQvdHJhbnNpdGlvbi9jdHMvQ2FwdHVyZVZhbHVlc1Rlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy90cmFuc2l0aW9uL3NyYy9hbmRyb2lkL3RyYW5zaXRpb24vY3RzL0NhcHR1cmVWYWx1ZXNUZXN0LmphdmEKQEAgLTE5LDggKzE5LDYgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC50cmFuc2l0aW9uLkF1dG9UcmFuc2l0aW9uOwogaW1wb3J0IGFuZHJvaWQudHJhbnNpdGlvbi5DaGFuZ2VCb3VuZHM7CiBpbXBvcnQgYW5kcm9pZC50cmFuc2l0aW9uLkNoYW5nZUNsaXBCb3VuZHM7CkBAIC0zNiw2ICszNCw5IEBACiBpbXBvcnQgYW5kcm9pZC50cmFuc2l0aW9uLlRyYW5zaXRpb25WYWx1ZXM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkFycmF5TWFwOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdHJhbnNpdGlvbi9zcmMvYW5kcm9pZC90cmFuc2l0aW9uL2N0cy9DaGFuZ2VCb3VuZHNUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy90cmFuc2l0aW9uL3NyYy9hbmRyb2lkL3RyYW5zaXRpb24vY3RzL0NoYW5nZUJvdW5kc1Rlc3QuamF2YQppbmRleCAzOTdiMDEwLi4zNDlmNzY3IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy90cmFuc2l0aW9uL3NyYy9hbmRyb2lkL3RyYW5zaXRpb24vY3RzL0NoYW5nZUJvdW5kc1Rlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy90cmFuc2l0aW9uL3NyYy9hbmRyb2lkL3RyYW5zaXRpb24vY3RzL0NoYW5nZUJvdW5kc1Rlc3QuamF2YQpAQCAtMjUsOCArMjUsNiBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQ7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnRyYW5zaXRpb24uQ2hhbmdlQm91bmRzOwogaW1wb3J0IGFuZHJvaWQudHJhbnNpdGlvbi5UcmFuc2l0aW9uOwogaW1wb3J0IGFuZHJvaWQudHJhbnNpdGlvbi5UcmFuc2l0aW9uVmFsdWVzOwpAQCAtMzYsNiArMzQsMTEgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld1RyZWVPYnNlcnZlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkxpbmVhckludGVycG9sYXRvcjsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlBvbGxpbmdDaGVjazsKKwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpAQCAtMTI1LDggKzEyOCw3IEBACiAKICAgICAgICAgc3RhcnRUcmFuc2l0aW9uKFIubGF5b3V0LnNjZW5lNik7CiAKLSAgICAgICAgLy8gbm93IGRlbGF5IGZvciBhdCBsZWFzdCBhIGZldyBmcmFtZXMgYmVmb3JlIGludGVycnVwdGluZyB0aGUgdHJhbnNpdGlvbgotICAgICAgICBUaHJlYWQuc2xlZXAoMTUwKTsKKyAgICAgICAgd2FpdEZvck1pZGRsZU9mVHJhbnNpdGlvbigpOwogICAgICAgICByZXNldENoYW5nZUJvdW5kc1RyYW5zaXRpb24oKTsKICAgICAgICAgc3RhcnRUcmFuc2l0aW9uKFIubGF5b3V0LnNjZW5lNik7CiAKQEAgLTE0NCw4ICsxNDYsNyBAQAogCiAgICAgICAgIHN0YXJ0VHJhbnNpdGlvbihSLmxheW91dC5zY2VuZTYpOwogCi0gICAgICAgIC8vIG5vdyBkZWxheSBmb3IgYXQgbGVhc3QgYSBmZXcgZnJhbWVzIGJlZm9yZSBpbnRlcnJ1cHRpbmcgdGhlIHRyYW5zaXRpb24KLSAgICAgICAgVGhyZWFkLnNsZWVwKDE1MCk7CisgICAgICAgIHdhaXRGb3JNaWRkbGVPZlRyYW5zaXRpb24oKTsKIAogICAgICAgICByZXNldENoYW5nZUJvdW5kc1RyYW5zaXRpb24oKTsKICAgICAgICAgbUNoYW5nZUJvdW5kcy5zZXRSZXNpemVDbGlwKHRydWUpOwpAQCAtMTY1LDggKzE2Niw3IEBACiAKICAgICAgICAgc3RhcnRUcmFuc2l0aW9uKFIubGF5b3V0LnNjZW5lNik7CiAKLSAgICAgICAgLy8gbm93IGRlbGF5IGZvciBhdCBsZWFzdCBhIGZldyBmcmFtZXMgYmVmb3JlIHJldmVyc2luZwotICAgICAgICBUaHJlYWQuc2xlZXAoMTUwKTsKKyAgICAgICAgd2FpdEZvck1pZGRsZU9mVHJhbnNpdGlvbigpOwogICAgICAgICAvLyByZXZlcnNlIHRoZSB0cmFuc2l0aW9uIGJhY2sgdG8gc2NlbmUxCiAgICAgICAgIHJlc2V0Q2hhbmdlQm91bmRzVHJhbnNpdGlvbigpOwogICAgICAgICBzdGFydFRyYW5zaXRpb24oUi5sYXlvdXQuc2NlbmUxKTsKQEAgLTE4NCw5ICsxODQsNyBAQAogICAgICAgICB2YWxpZGF0ZUluU2NlbmUxKCk7CiAKICAgICAgICAgc3RhcnRUcmFuc2l0aW9uKFIubGF5b3V0LnNjZW5lNik7Ci0KLSAgICAgICAgLy8gbm93IGRlbGF5IGZvciBhdCBsZWFzdCBhIGZldyBmcmFtZXMgYmVmb3JlIHJldmVyc2luZwotICAgICAgICBUaHJlYWQuc2xlZXAoMTUwKTsKKyAgICAgICAgd2FpdEZvck1pZGRsZU9mVHJhbnNpdGlvbigpOwogCiAgICAgICAgIC8vIHJldmVyc2UgdGhlIHRyYW5zaXRpb24gYmFjayB0byBzY2VuZTEKICAgICAgICAgcmVzZXRDaGFuZ2VCb3VuZHNUcmFuc2l0aW9uKCk7CkBAIC0xOTksNiArMTk3LDIxIEBACiAgICAgICAgIHZhbGlkYXRlSW5TY2VuZTEoKTsKICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgd2FpdEZvck1pZGRsZU9mVHJhbnNpdGlvbigpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBSZXNvdXJjZXMgcmVzb3VyY2VzID0gbUFjdGl2aXR5LmdldFJlc291cmNlcygpOworICAgICAgICBmbG9hdCBjbG9zZXN0RGlzdGFuY2UgPSBUeXBlZFZhbHVlLmFwcGx5RGltZW5zaW9uKFR5cGVkVmFsdWUuQ09NUExFWF9VTklUX0RJUCwKKyAgICAgICAgICAgICAgICBTTUFMTF9TUVVBUkVfU0laRV9EUCAvIDIsIHJlc291cmNlcy5nZXREaXNwbGF5TWV0cmljcygpKTsKKworICAgICAgICBmaW5hbCBWaWV3IHJlZCA9IG1BY3Rpdml0eS5maW5kVmlld0J5SWQoUi5pZC5yZWRTcXVhcmUpOworICAgICAgICBmaW5hbCBWaWV3IGdyZWVuID0gbUFjdGl2aXR5LmZpbmRWaWV3QnlJZChSLmlkLmdyZWVuU3F1YXJlKTsKKworICAgICAgICBQb2xsaW5nQ2hlY2sud2FpdEZvcigKKyAgICAgICAgICAgICAgICAoKSAtPiByZWQuZ2V0VG9wKCkgPiBjbG9zZXN0RGlzdGFuY2UgJiYgZ3JlZW4uZ2V0VG9wKCkgPiBjbG9zZXN0RGlzdGFuY2UpOworCisgICAgICAgIGFzc2VydFRydWUocmVkLmdldFRvcCgpID4gY2xvc2VzdERpc3RhbmNlKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShncmVlbi5nZXRUb3AoKSA+IGNsb3Nlc3REaXN0YW5jZSk7CisgICAgfQorCiAgICAgcHJpdmF0ZSBib29sZWFuIGlzUmVzdGFydGluZ0FuaW1hdGlvbigpIHsKICAgICAgICAgVmlldyByZWQgPSBtQWN0aXZpdHkuZmluZFZpZXdCeUlkKFIuaWQucmVkU3F1YXJlKTsKICAgICAgICAgVmlldyBncmVlbiA9IG1BY3Rpdml0eS5maW5kVmlld0J5SWQoUi5pZC5ncmVlblNxdWFyZSk7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90cmFuc2l0aW9uL3NyYy9hbmRyb2lkL3RyYW5zaXRpb24vY3RzL0NoYW5nZUNsaXBCb3VuZHNUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy90cmFuc2l0aW9uL3NyYy9hbmRyb2lkL3RyYW5zaXRpb24vY3RzL0NoYW5nZUNsaXBCb3VuZHNUZXN0LmphdmEKaW5kZXggNDAwYmM2My4uZjcwM2ZiYyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdHJhbnNpdGlvbi9zcmMvYW5kcm9pZC90cmFuc2l0aW9uL2N0cy9DaGFuZ2VDbGlwQm91bmRzVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3RyYW5zaXRpb24vc3JjL2FuZHJvaWQvdHJhbnNpdGlvbi9jdHMvQ2hhbmdlQ2xpcEJvdW5kc1Rlc3QuamF2YQpAQCAtMTgsMTUgKzE4LDE3IEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnRyYW5zaXRpb24uQ2hhbmdlQ2xpcEJvdW5kczsKIGltcG9ydCBhbmRyb2lkLnRyYW5zaXRpb24uVHJhbnNpdGlvbk1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5Qb2xsaW5nQ2hlY2s7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKQEAgLTU5LDE3ICs2MSw4IEBACiAgICAgICAgICAgICByZWRTcXVhcmUuc2V0Q2xpcEJvdW5kcyhuZXdDbGlwKTsKICAgICAgICAgfSk7CiAgICAgICAgIHdhaXRGb3JTdGFydCgpOwotICAgICAgICBUaHJlYWQuc2xlZXAoMTUwKTsKLSAgICAgICAgbUFjdGl2aXR5UnVsZS5ydW5PblVpVGhyZWFkKCgpIC0+IHsKLSAgICAgICAgICAgIFJlY3QgbWlkQ2xpcCA9IHJlZFNxdWFyZS5nZXRDbGlwQm91bmRzKCk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1pZENsaXApOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtaWRDbGlwLmxlZnQgPiAwICYmIG1pZENsaXAubGVmdCA8IG5ld0NsaXAubGVmdCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1pZENsaXAudG9wID4gMCAmJiBtaWRDbGlwLnRvcCA8IG5ld0NsaXAudG9wKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobWlkQ2xpcC5yaWdodCA8IHJlZFNxdWFyZS5nZXRSaWdodCgpICYmIG1pZENsaXAucmlnaHQgPiBuZXdDbGlwLnJpZ2h0KTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobWlkQ2xpcC5ib3R0b20gPCByZWRTcXVhcmUuZ2V0Qm90dG9tKCkgJiYKLSAgICAgICAgICAgICAgICAgICAgbWlkQ2xpcC5ib3R0b20gPiBuZXdDbGlwLmJvdHRvbSk7Ci0gICAgICAgIH0pOwotICAgICAgICB3YWl0Rm9yRW5kKDQwMCk7CisgICAgICAgIFBvbGxpbmdDaGVjay53YWl0Rm9yKGlzTWlkZGxlT2ZDbGlwcGluZyhyZWRTcXVhcmUsIG5ld0NsaXApKTsKKyAgICAgICAgd2FpdEZvckVuZCg2MDApOwogCiAgICAgICAgIG1BY3Rpdml0eVJ1bGUucnVuT25VaVRocmVhZCgoKSAtPiB7CiAgICAgICAgICAgICBmaW5hbCBSZWN0IGVuZFJlY3QgPSByZWRTcXVhcmUuZ2V0Q2xpcEJvdW5kcygpOwpAQCAtODMsMTkgKzc2LDIxIEBACiAgICAgICAgICAgICByZWRTcXVhcmUuc2V0Q2xpcEJvdW5kcyhudWxsKTsKICAgICAgICAgfSk7CiAgICAgICAgIHdhaXRGb3JTdGFydCgpOwotICAgICAgICBUaHJlYWQuc2xlZXAoMTUwKTsKLSAgICAgICAgbUFjdGl2aXR5UnVsZS5ydW5PblVpVGhyZWFkKCgpIC0+IHsKLSAgICAgICAgICAgIFJlY3QgbWlkQ2xpcCA9IHJlZFNxdWFyZS5nZXRDbGlwQm91bmRzKCk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1pZENsaXApOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtaWRDbGlwLmxlZnQgPiAwICYmIG1pZENsaXAubGVmdCA8IG5ld0NsaXAubGVmdCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1pZENsaXAudG9wID4gMCAmJiBtaWRDbGlwLnRvcCA8IG5ld0NsaXAudG9wKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobWlkQ2xpcC5yaWdodCA8IHJlZFNxdWFyZS5nZXRSaWdodCgpICYmIG1pZENsaXAucmlnaHQgPiBuZXdDbGlwLnJpZ2h0KTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobWlkQ2xpcC5ib3R0b20gPCByZWRTcXVhcmUuZ2V0Qm90dG9tKCkgJiYKLSAgICAgICAgICAgICAgICAgICAgbWlkQ2xpcC5ib3R0b20gPiBuZXdDbGlwLmJvdHRvbSk7Ci0gICAgICAgIH0pOwotICAgICAgICB3YWl0Rm9yRW5kKDQwMCk7CisgICAgICAgIFBvbGxpbmdDaGVjay53YWl0Rm9yKGlzTWlkZGxlT2ZDbGlwcGluZyhyZWRTcXVhcmUsIG5ld0NsaXApKTsKKyAgICAgICAgd2FpdEZvckVuZCg2MDApOwogCiAgICAgICAgIG1BY3Rpdml0eVJ1bGUucnVuT25VaVRocmVhZCgoKSAtPiBhc3NlcnROdWxsKHJlZFNxdWFyZS5nZXRDbGlwQm91bmRzKCkpKTsKICAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBQb2xsaW5nQ2hlY2suUG9sbGluZ0NoZWNrQ29uZGl0aW9uIGlzTWlkZGxlT2ZDbGlwcGluZyhmaW5hbCBWaWV3IHJlZFNxdWFyZSwKKyAgICAgICAgICAgIGZpbmFsIFJlY3QgbmV3Q2xpcCkgeworICAgICAgICByZXR1cm4gKCkgLT4geworICAgICAgICAgICAgUmVjdCBtaWRDbGlwID0gcmVkU3F1YXJlLmdldENsaXBCb3VuZHMoKTsKKyAgICAgICAgICAgIHJldHVybiBtaWRDbGlwLmxlZnQgPiAwICYmIG1pZENsaXAubGVmdCA8IG5ld0NsaXAubGVmdAorICAgICAgICAgICAgICAgICAgICAmJiBtaWRDbGlwLnRvcCA+IDAgJiYgbWlkQ2xpcC50b3AgPCBuZXdDbGlwLnRvcAorICAgICAgICAgICAgICAgICAgICAmJiBtaWRDbGlwLnJpZ2h0IDwgcmVkU3F1YXJlLmdldFJpZ2h0KCkgJiYgbWlkQ2xpcC5yaWdodCA+IG5ld0NsaXAucmlnaHQKKyAgICAgICAgICAgICAgICAgICAgJiYgbWlkQ2xpcC5ib3R0b20gPCByZWRTcXVhcmUuZ2V0Qm90dG9tKCkgJiYgbWlkQ2xpcC5ib3R0b20gPiBuZXdDbGlwLmJvdHRvbTsKKyAgICAgICAgfTsKKyAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RyYW5zaXRpb24vc3JjL2FuZHJvaWQvdHJhbnNpdGlvbi9jdHMvQ2hhbmdlSW1hZ2VUcmFuc2Zvcm1UZXN0LmphdmEgYi90ZXN0cy90ZXN0cy90cmFuc2l0aW9uL3NyYy9hbmRyb2lkL3RyYW5zaXRpb24vY3RzL0NoYW5nZUltYWdlVHJhbnNmb3JtVGVzdC5qYXZhCmluZGV4IDZhZThhOWYuLmQ1YWEzZGUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RyYW5zaXRpb24vc3JjL2FuZHJvaWQvdHJhbnNpdGlvbi9jdHMvQ2hhbmdlSW1hZ2VUcmFuc2Zvcm1UZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdHJhbnNpdGlvbi9zcmMvYW5kcm9pZC90cmFuc2l0aW9uL2N0cy9DaGFuZ2VJbWFnZVRyYW5zZm9ybVRlc3QuamF2YQpAQCAtMjcsOCArMjcsNiBAQAogaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yTGlzdGVuZXJBZGFwdGVyOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudHJhbnNpdGlvbi5DaGFuZ2VJbWFnZVRyYW5zZm9ybTsKIGltcG9ydCBhbmRyb2lkLnRyYW5zaXRpb24uVHJhbnNpdGlvbk1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC50cmFuc2l0aW9uLlRyYW5zaXRpb25WYWx1ZXM7CkBAIC0zOSw2ICszNyw5IEBACiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldy5TY2FsZVR5cGU7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90cmFuc2l0aW9uL3NyYy9hbmRyb2lkL3RyYW5zaXRpb24vY3RzL0NoYW5nZVNjcm9sbFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RyYW5zaXRpb24vc3JjL2FuZHJvaWQvdHJhbnNpdGlvbi9jdHMvQ2hhbmdlU2Nyb2xsVGVzdC5qYXZhCmluZGV4IGIwZTFmOWUuLmI3NzJhMjkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RyYW5zaXRpb24vc3JjL2FuZHJvaWQvdHJhbnNpdGlvbi9jdHMvQ2hhbmdlU2Nyb2xsVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3RyYW5zaXRpb24vc3JjL2FuZHJvaWQvdHJhbnNpdGlvbi9jdHMvQ2hhbmdlU2Nyb2xsVGVzdC5qYXZhCkBAIC0xOCwxNiArMTgsMjAgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnRyYW5zaXRpb24uQ2hhbmdlU2Nyb2xsOwogaW1wb3J0IGFuZHJvaWQudHJhbnNpdGlvbi5UcmFuc2l0aW9uTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIAoraW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCiBATWVkaXVtVGVzdAogQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKIHB1YmxpYyBjbGFzcyBDaGFuZ2VTY3JvbGxUZXN0IGV4dGVuZHMgQmFzZVRyYW5zaXRpb25UZXN0IHsKQEAgLTQ1LDE1ICs0OSwyMiBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdENoYW5nZVNjcm9sbCgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBlbnRlclNjZW5lKFIubGF5b3V0LnNjZW5lNSk7CisgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIHNjcm9sbENoYW5nZWQgPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgICAgIGZpbmFsIFZpZXcuT25TY3JvbGxDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9ICh2LCBuZXdYLCBuZXdZLCBvbGRYLCBvbGRZKSAtPiB7CisgICAgICAgICAgICBpZiAobmV3WCAhPSAwICYmIG5ld1kgIT0gMCkgeworICAgICAgICAgICAgICAgIHNjcm9sbENoYW5nZWQuY291bnREb3duKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CiAgICAgICAgIG1BY3Rpdml0eVJ1bGUucnVuT25VaVRocmVhZCgoKSAtPiB7CiAgICAgICAgICAgICBmaW5hbCBWaWV3IHZpZXcgPSBtQWN0aXZpdHkuZmluZFZpZXdCeUlkKFIuaWQudGV4dCk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdmlldy5nZXRTY3JvbGxYKCkpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHZpZXcuZ2V0U2Nyb2xsWSgpKTsKICAgICAgICAgICAgIFRyYW5zaXRpb25NYW5hZ2VyLmJlZ2luRGVsYXllZFRyYW5zaXRpb24obVNjZW5lUm9vdCwgbUNoYW5nZVNjcm9sbCk7CiAgICAgICAgICAgICB2aWV3LnNjcm9sbFRvKDE1MCwgMzAwKTsKKyAgICAgICAgICAgIHZpZXcuc2V0T25TY3JvbGxDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7CiAgICAgICAgIH0pOwogICAgICAgICB3YWl0Rm9yU3RhcnQoKTsKLSAgICAgICAgVGhyZWFkLnNsZWVwKDE1MCk7CisgICAgICAgIGFzc2VydFRydWUoc2Nyb2xsQ2hhbmdlZC5hd2FpdCgxLCBUaW1lVW5pdC5TRUNPTkRTKSk7CiAgICAgICAgIG1BY3Rpdml0eVJ1bGUucnVuT25VaVRocmVhZCgoKSAtPiB7CiAgICAgICAgICAgICBmaW5hbCBWaWV3IHZpZXcgPSBtQWN0aXZpdHkuZmluZFZpZXdCeUlkKFIuaWQudGV4dCk7CiAgICAgICAgICAgICBmaW5hbCBpbnQgc2Nyb2xsWCA9IHZpZXcuZ2V0U2Nyb2xsWCgpOwpAQCAtNjMsNyArNzQsNyBAQAogICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzY3JvbGxZID4gMCk7CiAgICAgICAgICAgICBhc3NlcnRUcnVlKHNjcm9sbFkgPCAzMDApOwogICAgICAgICB9KTsKLSAgICAgICAgd2FpdEZvckVuZCg0MDApOworICAgICAgICB3YWl0Rm9yRW5kKDgwMCk7CiAgICAgICAgIG1BY3Rpdml0eVJ1bGUucnVuT25VaVRocmVhZCgoKSAtPiB7CiAgICAgICAgICAgICBmaW5hbCBWaWV3IHZpZXcgPSBtQWN0aXZpdHkuZmluZFZpZXdCeUlkKFIuaWQudGV4dCk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMTUwLCB2aWV3LmdldFNjcm9sbFgoKSk7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90cmFuc2l0aW9uL3NyYy9hbmRyb2lkL3RyYW5zaXRpb24vY3RzL0NoYW5nZVRyYW5zZm9ybVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RyYW5zaXRpb24vc3JjL2FuZHJvaWQvdHJhbnNpdGlvbi9jdHMvQ2hhbmdlVHJhbnNmb3JtVGVzdC5qYXZhCmluZGV4IDM4NDc0YTIuLjQ1ZjdjOTMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RyYW5zaXRpb24vc3JjL2FuZHJvaWQvdHJhbnNpdGlvbi9jdHMvQ2hhbmdlVHJhbnNmb3JtVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3RyYW5zaXRpb24vc3JjL2FuZHJvaWQvdHJhbnNpdGlvbi9jdHMvQ2hhbmdlVHJhbnNmb3JtVGVzdC5qYXZhCkBAIC0yMSwxMyArMjEsMTQgQEAKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5uZXZlcjsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by52ZXJpZnk7CiAKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC50cmFuc2l0aW9uLkNoYW5nZVRyYW5zZm9ybTsKIGltcG9ydCBhbmRyb2lkLnRyYW5zaXRpb24uVHJhbnNpdGlvbk1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RyYW5zaXRpb24vc3JjL2FuZHJvaWQvdHJhbnNpdGlvbi9jdHMvRXhwbG9kZVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RyYW5zaXRpb24vc3JjL2FuZHJvaWQvdHJhbnNpdGlvbi9jdHMvRXhwbG9kZVRlc3QuamF2YQppbmRleCA1MjM0MGUwLi5iN2FiYmIzIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy90cmFuc2l0aW9uL3NyYy9hbmRyb2lkL3RyYW5zaXRpb24vY3RzL0V4cGxvZGVUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdHJhbnNpdGlvbi9zcmMvYW5kcm9pZC90cmFuc2l0aW9uL2N0cy9FeHBsb2RlVGVzdC5qYXZhCkBAIC0yMSwxMiArMjEsMTMgQEAKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5uZXZlcjsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by52ZXJpZnk7CiAKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC50cmFuc2l0aW9uLkV4cGxvZGU7CiBpbXBvcnQgYW5kcm9pZC50cmFuc2l0aW9uLlRyYW5zaXRpb25NYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdHJhbnNpdGlvbi9zcmMvYW5kcm9pZC90cmFuc2l0aW9uL2N0cy9GYWRlVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdHJhbnNpdGlvbi9zcmMvYW5kcm9pZC90cmFuc2l0aW9uL2N0cy9GYWRlVGVzdC5qYXZhCmluZGV4IGZlOTNkMWIuLmEyZjU0NDEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RyYW5zaXRpb24vc3JjL2FuZHJvaWQvdHJhbnNpdGlvbi9jdHMvRmFkZVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy90cmFuc2l0aW9uL3NyYy9hbmRyb2lkL3RyYW5zaXRpb24vY3RzL0ZhZGVUZXN0LmphdmEKQEAgLTE2LDYgKzE2LDcgQEAKIHBhY2thZ2UgYW5kcm9pZC50cmFuc2l0aW9uLmN0czsKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdFNhbWU7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTWF0Y2hlcnMuYW55OwpAQCAtMjcsOSArMjgsOCBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3I7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5CaXRtYXBEcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC50cmFuc2l0aW9uLkZhZGU7CitpbXBvcnQgYW5kcm9pZC50cmFuc2l0aW9uLlNjZW5lOwogaW1wb3J0IGFuZHJvaWQudHJhbnNpdGlvbi5UcmFuc2l0aW9uOwogaW1wb3J0IGFuZHJvaWQudHJhbnNpdGlvbi5UcmFuc2l0aW9uTGlzdGVuZXJBZGFwdGVyOwogaW1wb3J0IGFuZHJvaWQudHJhbnNpdGlvbi5UcmFuc2l0aW9uTWFuYWdlcjsKQEAgLTM5LDYgKzM5LDkgQEAKIGltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CkBAIC04MSwxMiArODQsMTIgQEAKICAgICAgICAgZW50ZXJTY2VuZShSLmxheW91dC5zY2VuZTQpOwogICAgICAgICBzdGFydFRyYW5zaXRpb24oUi5sYXlvdXQuc2NlbmUxKTsKICAgICAgICAgdmVyaWZ5KG1MaXN0ZW5lciwgbmV2ZXIoKSkub25UcmFuc2l0aW9uRW5kKGFueSgpKTsKLSAgICAgICAgd2FpdEZvckVuZCg0MDApOworICAgICAgICB3YWl0Rm9yRW5kKDEwMDApOwogCiAgICAgICAgIHJlc2V0TGlzdGVuZXIoKTsKICAgICAgICAgc3RhcnRUcmFuc2l0aW9uKFIubGF5b3V0LnNjZW5lNCk7CiAgICAgICAgIHZlcmlmeShtTGlzdGVuZXIsIG5ldmVyKCkpLm9uVHJhbnNpdGlvbkVuZChhbnkoKSk7Ci0gICAgICAgIHdhaXRGb3JFbmQoNDAwKTsKKyAgICAgICAgd2FpdEZvckVuZCgxMDAwKTsKIAogICAgICAgICAvLyBOb3cgb25seSBhbmltYXRlIGluCiAgICAgICAgIG1GYWRlID0gbmV3IEZhZGUoRmFkZS5JTik7CkBAIC05NCw3ICs5Nyw3IEBACiAgICAgICAgIHJlc2V0TGlzdGVuZXIoKTsKICAgICAgICAgc3RhcnRUcmFuc2l0aW9uKFIubGF5b3V0LnNjZW5lMSk7CiAgICAgICAgIHZlcmlmeShtTGlzdGVuZXIsIG5ldmVyKCkpLm9uVHJhbnNpdGlvbkVuZChhbnkoKSk7Ci0gICAgICAgIHdhaXRGb3JFbmQoNDAwKTsKKyAgICAgICAgd2FpdEZvckVuZCgxMDAwKTsKIAogICAgICAgICAvLyBObyBhbmltYXRpb24gc2luY2UgaXQgc2hvdWxkIG9ubHkgYW5pbWF0ZSBpbgogICAgICAgICByZXNldExpc3RlbmVyKCk7CkBAIC0xMTIsNyArMTE1LDcgQEAKICAgICAgICAgcmVzZXRMaXN0ZW5lcigpOwogICAgICAgICBzdGFydFRyYW5zaXRpb24oUi5sYXlvdXQuc2NlbmU0KTsKICAgICAgICAgdmVyaWZ5KG1MaXN0ZW5lciwgbmV2ZXIoKSkub25UcmFuc2l0aW9uRW5kKGFueSgpKTsKLSAgICAgICAgd2FpdEZvckVuZCg0MDApOworICAgICAgICB3YWl0Rm9yRW5kKDEwMDApOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0xNzUsNiArMTc4LDMyIEBACiAgICAgICAgIGFzc2VydFRydWUob25EaXNhcHBlYXJDYWxsZWQuYXdhaXQoMCwgVGltZVVuaXQuU0VDT05EUykpOwogICAgIH0KIAorICAgIC8vIEFmdGVyIGEgdHJhbnNpdGlvbiwgYSB0cmFuc2l0aW9uZWQgdmlldyBhcyBwYXJ0IG9mIGEgc2NlbmUgc2hvdWxkIG5vdCBiZSByZW1vdmVkCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBlbmRWaXNpYmlsaXR5SXNDb3JyZWN0KCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGZpbmFsIFNjZW5lW10gc2NlbmUxMSA9IG5ldyBTY2VuZVsxXTsKKyAgICAgICAgbUFjdGl2aXR5UnVsZS5ydW5PblVpVGhyZWFkKCgpIC0+IHsKKyAgICAgICAgICAgIFZpZXcgdmlldyA9IG1BY3Rpdml0eS5nZXRMYXlvdXRJbmZsYXRlcigpLmluZmxhdGUoUi5sYXlvdXQuc2NlbmUxMSwgbVNjZW5lUm9vdCwgZmFsc2UpOworICAgICAgICAgICAgc2NlbmUxMVswXSA9IG5ldyBTY2VuZShtU2NlbmVSb290LCB2aWV3KTsKKyAgICAgICAgfSk7CisgICAgICAgIGZpbmFsIFNjZW5lIHNjZW5lMTQgPSBsb2FkU2NlbmUoUi5sYXlvdXQuc2NlbmUxNCk7CisgICAgICAgIGVudGVyU2NlbmUoc2NlbmUxMVswXSk7CisKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtQWN0aXZpdHkuZmluZFZpZXdCeUlkKFIuaWQucmVkU3F1YXJlKSk7CisKKyAgICAgICAgLy8gV2UgZG9uJ3QgcmVhbGx5IGNhcmUgaG93IHNob3J0IHRoZSBkdXJhdGlvbiBpcywgc28gbGV0J3MgbWFrZSBpdCByZWFsbHkgc2hvcnQKKyAgICAgICAgbUZhZGUuc2V0RHVyYXRpb24oMSk7CisKKyAgICAgICAgc3RhcnRUcmFuc2l0aW9uKHNjZW5lMTQpOworICAgICAgICB3YWl0Rm9yRW5kKDEwMDApOyAvLyBzaG91bGQgYmUgbXVjaCBzaG9ydGVyLCBidXQgd2h5IHdvcnJ5IGFib3V0IGl0PworCisgICAgICAgIGFzc2VydE5vdE51bGwobUFjdGl2aXR5LmZpbmRWaWV3QnlJZChSLmlkLnJlZFNxdWFyZSkpOworCisgICAgICAgIHJlc2V0TGlzdGVuZXIoKTsKKyAgICAgICAgc3RhcnRUcmFuc2l0aW9uKHNjZW5lMTFbMF0pOworICAgICAgICBhc3NlcnROb3ROdWxsKG1BY3Rpdml0eS5maW5kVmlld0J5SWQoUi5pZC5yZWRTcXVhcmUpKTsKKyAgICB9CisKICAgICBwcml2YXRlIEJpdG1hcCBjcmVhdGVWaWV3Qml0bWFwKFZpZXcgdmlldykgewogICAgICAgICBpbnQgYml0bWFwV2lkdGggPSB2aWV3LmdldFdpZHRoKCk7CiAgICAgICAgIGludCBiaXRtYXBIZWlnaHQgPSB2aWV3LmdldEhlaWdodCgpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdHJhbnNpdGlvbi9zcmMvYW5kcm9pZC90cmFuc2l0aW9uL2N0cy9QYXR0ZXJuUGF0aE1vdGlvblRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RyYW5zaXRpb24vc3JjL2FuZHJvaWQvdHJhbnNpdGlvbi9jdHMvUGF0dGVyblBhdGhNb3Rpb25UZXN0LmphdmEKaW5kZXggYTdhZThmMy4uODI4ZjJiZCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdHJhbnNpdGlvbi9zcmMvYW5kcm9pZC90cmFuc2l0aW9uL2N0cy9QYXR0ZXJuUGF0aE1vdGlvblRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy90cmFuc2l0aW9uL3NyYy9hbmRyb2lkL3RyYW5zaXRpb24vY3RzL1BhdHRlcm5QYXRoTW90aW9uVGVzdC5qYXZhCkBAIC0xOCwxMCArMTgsMTEgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRTYW1lOwogCiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYXRoOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudHJhbnNpdGlvbi5QYXR0ZXJuUGF0aE1vdGlvbjsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdHJhbnNpdGlvbi9zcmMvYW5kcm9pZC90cmFuc2l0aW9uL2N0cy9Qcm9wYWdhdGlvblRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RyYW5zaXRpb24vc3JjL2FuZHJvaWQvdHJhbnNpdGlvbi9jdHMvUHJvcGFnYXRpb25UZXN0LmphdmEKaW5kZXggZGZkN2IwMy4uNmE4M2Y5NSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdHJhbnNpdGlvbi9zcmMvYW5kcm9pZC90cmFuc2l0aW9uL2N0cy9Qcm9wYWdhdGlvblRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy90cmFuc2l0aW9uL3NyYy9hbmRyb2lkL3RyYW5zaXRpb24vY3RzL1Byb3BhZ2F0aW9uVGVzdC5qYXZhCkBAIC0xOSw4ICsxOSw2IEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC50cmFuc2l0aW9uLkNpcmN1bGFyUHJvcGFnYXRpb247CiBpbXBvcnQgYW5kcm9pZC50cmFuc2l0aW9uLlNpZGVQcm9wYWdhdGlvbjsKIGltcG9ydCBhbmRyb2lkLnRyYW5zaXRpb24uVHJhbnNpdGlvbjsKQEAgLTI4LDYgKzI2LDkgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RyYW5zaXRpb24vc3JjL2FuZHJvaWQvdHJhbnNpdGlvbi9jdHMvU2NlbmVUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy90cmFuc2l0aW9uL3NyYy9hbmRyb2lkL3RyYW5zaXRpb24vY3RzL1NjZW5lVGVzdC5qYXZhCmluZGV4IDhjMDZmNTEuLjgwMDI4ZTAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RyYW5zaXRpb24vc3JjL2FuZHJvaWQvdHJhbnNpdGlvbi9jdHMvU2NlbmVUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdHJhbnNpdGlvbi9zcmMvYW5kcm9pZC90cmFuc2l0aW9uL2N0cy9TY2VuZVRlc3QuamF2YQpAQCAtMjQsMTIgKzI0LDEzIEBACiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8udmVyaWZ5OwogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnZlcmlmeVplcm9JbnRlcmFjdGlvbnM7CiAKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC50cmFuc2l0aW9uLlNjZW5lOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogaW1wb3J0IG9yZy5tb2NraXRvLmludm9jYXRpb24uSW52b2NhdGlvbk9uTW9jazsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RyYW5zaXRpb24vc3JjL2FuZHJvaWQvdHJhbnNpdGlvbi9jdHMvU2xpZGVCYWRFZGdlVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdHJhbnNpdGlvbi9zcmMvYW5kcm9pZC90cmFuc2l0aW9uL2N0cy9TbGlkZUJhZEVkZ2VUZXN0LmphdmEKaW5kZXggZTBjZTBjYy4uOWI2YjgwMyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdHJhbnNpdGlvbi9zcmMvYW5kcm9pZC90cmFuc2l0aW9uL2N0cy9TbGlkZUJhZEVkZ2VUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdHJhbnNpdGlvbi9zcmMvYW5kcm9pZC90cmFuc2l0aW9uL2N0cy9TbGlkZUJhZEVkZ2VUZXN0LmphdmEKQEAgLTE3LDEyICsxNywxMyBAQAogCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIAotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnRyYW5zaXRpb24uU2xpZGU7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RyYW5zaXRpb24vc3JjL2FuZHJvaWQvdHJhbnNpdGlvbi9jdHMvU2xpZGVEZWZhdWx0RWRnZVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3RyYW5zaXRpb24vc3JjL2FuZHJvaWQvdHJhbnNpdGlvbi9jdHMvU2xpZGVEZWZhdWx0RWRnZVRlc3QuamF2YQppbmRleCAzZGU3ODBjLi5mMWI0Y2ZlIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy90cmFuc2l0aW9uL3NyYy9hbmRyb2lkL3RyYW5zaXRpb24vY3RzL1NsaWRlRGVmYXVsdEVkZ2VUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdHJhbnNpdGlvbi9zcmMvYW5kcm9pZC90cmFuc2l0aW9uL2N0cy9TbGlkZURlZmF1bHRFZGdlVGVzdC5qYXZhCkBAIC0xNywxMSArMTcsMTIgQEAKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIAotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudHJhbnNpdGlvbi5TbGlkZTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdHJhbnNpdGlvbi9zcmMvYW5kcm9pZC90cmFuc2l0aW9uL2N0cy9TbGlkZUVkZ2VUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy90cmFuc2l0aW9uL3NyYy9hbmRyb2lkL3RyYW5zaXRpb24vY3RzL1NsaWRlRWRnZVRlc3QuamF2YQppbmRleCBiNGJmODAwLi5iYWQ2ZDM4IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy90cmFuc2l0aW9uL3NyYy9hbmRyb2lkL3RyYW5zaXRpb24vY3RzL1NsaWRlRWRnZVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy90cmFuc2l0aW9uL3NyYy9hbmRyb2lkL3RyYW5zaXRpb24vY3RzL1NsaWRlRWRnZVRlc3QuamF2YQpAQCAtMjQsOCArMjQsNiBAQAogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLm5ldmVyOwogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnZlcmlmeTsKIAotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnRyYW5zaXRpb24uU2xpZGU7CiBpbXBvcnQgYW5kcm9pZC50cmFuc2l0aW9uLlRyYW5zaXRpb247CiBpbXBvcnQgYW5kcm9pZC50cmFuc2l0aW9uLlRyYW5zaXRpb25NYW5hZ2VyOwpAQCAtMzMsNiArMzEsMTEgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuUG9sbGluZ0NoZWNrOworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCkBAIC0yMjMsNiArMjI2LDEzIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5VHJhbmxhdGlvbkNoYW5nZWQoVmlldyB2aWV3KSB7CisgICAgICAgIGZpbmFsIGZsb2F0IHN0YXJ0WCA9IHZpZXcuZ2V0VHJhbnNsYXRpb25YKCk7CisgICAgICAgIGZpbmFsIGZsb2F0IHN0YXJ0WSA9IHZpZXcuZ2V0VHJhbnNsYXRpb25ZKCk7CisgICAgICAgIFBvbGxpbmdDaGVjay53YWl0Rm9yKAorICAgICAgICAgICAgICAgICgpIC0+IHZpZXcuZ2V0VHJhbnNsYXRpb25YKCkgIT0gc3RhcnRYIHx8IHZpZXcuZ2V0VHJhbnNsYXRpb25ZKCkgIT0gc3RhcnRZKTsKKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgdmVyaWZ5VHJhbnNsYXRpb24oaW50IHNsaWRlRWRnZSwgVmlldyB2aWV3KSB7CiAgICAgICAgIHN3aXRjaCAoc2xpZGVFZGdlKSB7CiAgICAgICAgICAgICBjYXNlIEdyYXZpdHkuTEVGVDoKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3RyYW5zaXRpb24vc3JjL2FuZHJvaWQvdHJhbnNpdGlvbi9jdHMvVHJhbnNpdGlvbkluZmxhdGVyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdHJhbnNpdGlvbi9zcmMvYW5kcm9pZC90cmFuc2l0aW9uL2N0cy9UcmFuc2l0aW9uSW5mbGF0ZXJUZXN0LmphdmEKaW5kZXggOWE3YWI5NC4uMzQ2MDA0ZSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdHJhbnNpdGlvbi9zcmMvYW5kcm9pZC90cmFuc2l0aW9uL2N0cy9UcmFuc2l0aW9uSW5mbGF0ZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdHJhbnNpdGlvbi9zcmMvYW5kcm9pZC90cmFuc2l0aW9uL2N0cy9UcmFuc2l0aW9uSW5mbGF0ZXJUZXN0LmphdmEKQEAgLTI0LDggKzI0LDYgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhdGg7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYXRoTWVhc3VyZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC50cmFuc2l0aW9uLkFyY01vdGlvbjsKIGltcG9ydCBhbmRyb2lkLnRyYW5zaXRpb24uQXV0b1RyYW5zaXRpb247CiBpbXBvcnQgYW5kcm9pZC50cmFuc2l0aW9uLkNoYW5nZUJvdW5kczsKQEAgLTUwLDYgKzQ4LDkgQEAKIGltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90cmFuc2l0aW9uL3NyYy9hbmRyb2lkL3RyYW5zaXRpb24vY3RzL1RyYW5zaXRpb25MaXN0ZW5lckFkYXB0ZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy90cmFuc2l0aW9uL3NyYy9hbmRyb2lkL3RyYW5zaXRpb24vY3RzL1RyYW5zaXRpb25MaXN0ZW5lckFkYXB0ZXJUZXN0LmphdmEKaW5kZXggMTQzODc4OC4uOWQ3ZmYyZCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdHJhbnNpdGlvbi9zcmMvYW5kcm9pZC90cmFuc2l0aW9uL2N0cy9UcmFuc2l0aW9uTGlzdGVuZXJBZGFwdGVyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3RyYW5zaXRpb24vc3JjL2FuZHJvaWQvdHJhbnNpdGlvbi9jdHMvVHJhbnNpdGlvbkxpc3RlbmVyQWRhcHRlclRlc3QuamF2YQpAQCAtMTYsOCArMTYsOSBAQAogcGFja2FnZSBhbmRyb2lkLnRyYW5zaXRpb24uY3RzOwogCiBpbXBvcnQgYW5kcm9pZC50cmFuc2l0aW9uLlRyYW5zaXRpb25MaXN0ZW5lckFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiAKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90cmFuc2l0aW9uL3NyYy9hbmRyb2lkL3RyYW5zaXRpb24vY3RzL1RyYW5zaXRpb25NYW5hZ2VyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdHJhbnNpdGlvbi9zcmMvYW5kcm9pZC90cmFuc2l0aW9uL2N0cy9UcmFuc2l0aW9uTWFuYWdlclRlc3QuamF2YQppbmRleCBmNDhmNzgwLi5hYzg2OGFkIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy90cmFuc2l0aW9uL3NyYy9hbmRyb2lkL3RyYW5zaXRpb24vY3RzL1RyYW5zaXRpb25NYW5hZ2VyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3RyYW5zaXRpb24vc3JjL2FuZHJvaWQvdHJhbnNpdGlvbi9jdHMvVHJhbnNpdGlvbk1hbmFnZXJUZXN0LmphdmEKQEAgLTE2LDYgKzE2LDcgQEAKIHBhY2thZ2UgYW5kcm9pZC50cmFuc2l0aW9uLmN0czsKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3RFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5NYXRjaGVycy5hbnk7CkBAIC0yNiwxNCArMjcsMTUgQEAKIAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnRyYW5zaXRpb24uU2NlbmU7CiBpbXBvcnQgYW5kcm9pZC50cmFuc2l0aW9uLlRyYW5zaXRpb247CiBpbXBvcnQgYW5kcm9pZC50cmFuc2l0aW9uLlRyYW5zaXRpb25NYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIGltcG9ydCBvcmcubW9ja2l0by5Bcmd1bWVudENhcHRvcjsKQEAgLTczLDE3ICs3NSwyMCBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0QmVnaW5EZWxheWVkVHJhbnNpdGlvbigpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBlbnRlclNjZW5lKFIubGF5b3V0LnNjZW5lMSk7CiAgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIHN0YXJ0TGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7Ci0gICAgICAgIG1TY2VuZVJvb3QuZ2V0Vmlld1RyZWVPYnNlcnZlcigpLmFkZE9uUHJlRHJhd0xpc3RlbmVyKAotICAgICAgICAgICAgICAgIG5ldyBWaWV3VHJlZU9ic2VydmVyLk9uUHJlRHJhd0xpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gb25QcmVEcmF3KCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVNjZW5lUm9vdC5nZXRWaWV3VHJlZU9ic2VydmVyKCkucmVtb3ZlT25QcmVEcmF3TGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGFydExhdGNoLmNvdW50RG93bigpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgbUFjdGl2aXR5UnVsZS5ydW5PblVpVGhyZWFkKCgpIC0+IFRyYW5zaXRpb25NYW5hZ2VyLmJlZ2luRGVsYXllZFRyYW5zaXRpb24obVNjZW5lUm9vdCkpOwotICAgICAgICBlbnRlclNjZW5lKFIubGF5b3V0LnNjZW5lNik7CisgICAgICAgIGZpbmFsIFNjZW5lIHNjZW5lNiA9IGxvYWRTY2VuZShSLmxheW91dC5zY2VuZTYpOworICAgICAgICBtQWN0aXZpdHlSdWxlLnJ1bk9uVWlUaHJlYWQoKCkgLT4geworICAgICAgICAgICAgbVNjZW5lUm9vdC5nZXRWaWV3VHJlZU9ic2VydmVyKCkuYWRkT25QcmVEcmF3TGlzdGVuZXIoCisgICAgICAgICAgICAgICAgICAgIG5ldyBWaWV3VHJlZU9ic2VydmVyLk9uUHJlRHJhd0xpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBvblByZURyYXcoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNjZW5lUm9vdC5nZXRWaWV3VHJlZU9ic2VydmVyKCkucmVtb3ZlT25QcmVEcmF3TGlzdGVuZXIodGhpcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRMYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBUcmFuc2l0aW9uTWFuYWdlci5iZWdpbkRlbGF5ZWRUcmFuc2l0aW9uKG1TY2VuZVJvb3QpOworICAgICAgICAgICAgc2NlbmU2LmVudGVyKCk7CisgICAgICAgIH0pOwogICAgICAgICBhc3NlcnRUcnVlKHN0YXJ0TGF0Y2guYXdhaXQoNTAwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKICAgICAgICAgZW5zdXJlUmVkU3F1YXJlSXNNb3ZpbmcoKTsKICAgICAgICAgZW5kVHJhbnNpdGlvbigpOwpAQCAtOTUsMTQgKzEwMCwyNyBAQAogICAgICAgICAvLyBXZSBzaG91bGQgc2VlIGEgQ2hhbmdlQm91bmRzIG9uIHJlZFNxdWFyZQogICAgICAgICBmaW5hbCBSZWN0IHBvc2l0aW9uID0gbmV3IFJlY3Qodmlldy5nZXRMZWZ0KCksIHZpZXcuZ2V0VG9wKCksIHZpZXcuZ2V0UmlnaHQoKSwKICAgICAgICAgICAgICAgICB2aWV3LmdldEJvdHRvbSgpKTsKKwogICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKLSAgICAgICAgdmlldy5wb3N0T25BbmltYXRpb25EZWxheWVkKCgpIC0+IHsKLSAgICAgICAgICAgIFJlY3QgbmV4dCA9IG5ldyBSZWN0KHZpZXcuZ2V0TGVmdCgpLCB2aWV3LmdldFRvcCgpLCB2aWV3LmdldFJpZ2h0KCksCi0gICAgICAgICAgICAgICAgICAgIHZpZXcuZ2V0Qm90dG9tKCkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSghbmV4dC5lcXVhbHMocG9zaXRpb24pKTsKLSAgICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOwotICAgICAgICB9LCAyMCk7CisgICAgICAgIGZpbmFsIFJlY3RbXSBuZXh0QXJyID0gbmV3IFJlY3RbMV07CisgICAgICAgIHZpZXcucG9zdE9uQW5pbWF0aW9uKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIC8vIFdhaXQgYXQgbW9zdCAxMCBmcmFtZXMgZm9yIHRoZSBwb3NpdGlvbiB0byBjaGFuZ2UKKyAgICAgICAgICAgIGludCBtRnJhbWVzVG9DaGFuZ2UgPSAxMDsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgbmV4dEFyclswXSA9IG5ldyBSZWN0KHZpZXcuZ2V0TGVmdCgpLCB2aWV3LmdldFRvcCgpLCB2aWV3LmdldFJpZ2h0KCksCisgICAgICAgICAgICAgICAgICAgICAgICB2aWV3LmdldEJvdHRvbSgpKTsKKyAgICAgICAgICAgICAgICBtRnJhbWVzVG9DaGFuZ2UtLTsKKyAgICAgICAgICAgICAgICBpZiAobmV4dEFyclswXS5lcXVhbHMocG9zaXRpb24pICYmIG1GcmFtZXNUb0NoYW5nZSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgdmlldy5wb3N0T25BbmltYXRpb24odGhpcyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKICAgICAgICAgYXNzZXJ0VHJ1ZShsYXRjaC5hd2FpdCg1MDAsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworICAgICAgICBhc3NlcnROb3RFcXVhbHMocG9zaXRpb24sIG5leHRBcnJbMF0pOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0xMjksMTcgKzE0NywxOSBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0R28oKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgZW50ZXJTY2VuZShSLmxheW91dC5zY2VuZTEpOwogICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBzdGFydExhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOwotICAgICAgICBtU2NlbmVSb290LmdldFZpZXdUcmVlT2JzZXJ2ZXIoKS5hZGRPblByZURyYXdMaXN0ZW5lcigKLSAgICAgICAgICAgICAgICBuZXcgVmlld1RyZWVPYnNlcnZlci5PblByZURyYXdMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIG9uUHJlRHJhdygpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TY2VuZVJvb3QuZ2V0Vmlld1RyZWVPYnNlcnZlcigpLnJlbW92ZU9uUHJlRHJhd0xpc3RlbmVyKHRoaXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRMYXRjaC5jb3VudERvd24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7CiAgICAgICAgIGZpbmFsIFNjZW5lIHNjZW5lNiA9IGxvYWRTY2VuZShSLmxheW91dC5zY2VuZTYpOwotICAgICAgICBtQWN0aXZpdHlSdWxlLnJ1bk9uVWlUaHJlYWQoKCkgLT4gVHJhbnNpdGlvbk1hbmFnZXIuZ28oc2NlbmU2KSk7CisgICAgICAgIG1BY3Rpdml0eVJ1bGUucnVuT25VaVRocmVhZCgoKSAtPiB7CisgICAgICAgICAgICBtU2NlbmVSb290LmdldFZpZXdUcmVlT2JzZXJ2ZXIoKS5hZGRPblByZURyYXdMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICAgICAgbmV3IFZpZXdUcmVlT2JzZXJ2ZXIuT25QcmVEcmF3TGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIG9uUHJlRHJhdygpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2NlbmVSb290LmdldFZpZXdUcmVlT2JzZXJ2ZXIoKS5yZW1vdmVPblByZURyYXdMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydExhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIFRyYW5zaXRpb25NYW5hZ2VyLmdvKHNjZW5lNik7CisgICAgICAgIH0pOwogICAgICAgICBhc3NlcnRUcnVlKHN0YXJ0TGF0Y2guYXdhaXQoNTAwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKICAgICAgICAgZW5zdXJlUmVkU3F1YXJlSXNNb3ZpbmcoKTsKICAgICAgICAgZW5kVHJhbnNpdGlvbigpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdHJhbnNpdGlvbi9zcmMvYW5kcm9pZC90cmFuc2l0aW9uL2N0cy9UcmFuc2l0aW9uU2V0VGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdHJhbnNpdGlvbi9zcmMvYW5kcm9pZC90cmFuc2l0aW9uL2N0cy9UcmFuc2l0aW9uU2V0VGVzdC5qYXZhCmluZGV4IDYwY2Q1YjAuLmE5YzFhN2QgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RyYW5zaXRpb24vc3JjL2FuZHJvaWQvdHJhbnNpdGlvbi9jdHMvVHJhbnNpdGlvblNldFRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy90cmFuc2l0aW9uL3NyYy9hbmRyb2lkL3RyYW5zaXRpb24vY3RzL1RyYW5zaXRpb25TZXRUZXN0LmphdmEKQEAgLTIxLDE3ICsyMSwxNyBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFNhbWU7CiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1hdGNoZXJzLmFueTsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5tb2NrOwotaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLm5ldmVyOwogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnRpbWVzOwogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnZlcmlmeTsKIAotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnRyYW5zaXRpb24uQ2hhbmdlQm91bmRzOwogaW1wb3J0IGFuZHJvaWQudHJhbnNpdGlvbi5GYWRlOwogaW1wb3J0IGFuZHJvaWQudHJhbnNpdGlvbi5UcmFuc2l0aW9uOwogaW1wb3J0IGFuZHJvaWQudHJhbnNpdGlvbi5UcmFuc2l0aW9uU2V0OwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApAQCAtNjcsNiArNjcsNyBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RUcmFuc2l0aW9uU2VxdWVudGlhbGx5KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIFRyYW5zaXRpb25TZXQgdHJhbnNpdGlvblNldCA9IG5ldyBUcmFuc2l0aW9uU2V0KCk7CiAgICAgICAgIEZhZGUgZmFkZSA9IG5ldyBGYWRlKCk7CisgICAgICAgIGZhZGUuc2V0RHVyYXRpb24oNTAwKTsKICAgICAgICAgZmluYWwgVHJhbnNpdGlvbi5UcmFuc2l0aW9uTGlzdGVuZXIgZmFkZUxpc3RlbmVyID0KICAgICAgICAgICAgICAgICBtb2NrKFRyYW5zaXRpb24uVHJhbnNpdGlvbkxpc3RlbmVyLmNsYXNzKTsKICAgICAgICAgZmFkZS5hZGRMaXN0ZW5lcihmYWRlTGlzdGVuZXIpOwpAQCAtODUsMTMgKzg2LDE5IEBACiAKICAgICAgICAgZW50ZXJTY2VuZShSLmxheW91dC5zY2VuZTEpOwogICAgICAgICBzdGFydFRyYW5zaXRpb24oUi5sYXlvdXQuc2NlbmUzKTsKLSAgICAgICAgbUFjdGl2aXR5UnVsZS5ydW5PblVpVGhyZWFkKCgpIC0+IHsKLSAgICAgICAgICAgIHZlcmlmeShmYWRlTGlzdGVuZXIsIHRpbWVzKDEpKS5vblRyYW5zaXRpb25TdGFydChhbnkoKSk7Ci0gICAgICAgICAgICB2ZXJpZnkoY2hhbmdlQm91bmRzTGlzdGVuZXIsIG5ldmVyKCkpLm9uVHJhbnNpdGlvblN0YXJ0KGFueSgpKTsKLSAgICAgICAgfSk7Ci0gICAgICAgIHZlcmlmeShmYWRlTGlzdGVuZXIsIHdpdGhpbig0MDApKS5vblRyYW5zaXRpb25FbmQoYW55KCkpOwotICAgICAgICBtQWN0aXZpdHlSdWxlLnJ1bk9uVWlUaHJlYWQoCi0gICAgICAgICAgICAgICAgKCkgLT4gdmVyaWZ5KGNoYW5nZUJvdW5kc0xpc3RlbmVyLCB0aW1lcygxKSkub25UcmFuc2l0aW9uU3RhcnQoYW55KCkpKTsKKyAgICAgICAgdmVyaWZ5KGZhZGVMaXN0ZW5lciwgd2l0aGluKDUwMCkpLm9uVHJhbnNpdGlvblN0YXJ0KGFueSgpKTsKKyAgICAgICAgdmVyaWZ5KGZhZGVMaXN0ZW5lciwgdGltZXMoMSkpLm9uVHJhbnNpdGlvblN0YXJ0KGFueSgpKTsKKworICAgICAgICAvLyBjaGFuZ2UgYm91bmRzIHNob3VsZG4ndCBzdGFydCB1bnRpbCBhZnRlciBmYWRlIGZpbmlzaGVzCisgICAgICAgIHZlcmlmeShmYWRlTGlzdGVuZXIsIHRpbWVzKDApKS5vblRyYW5zaXRpb25FbmQoYW55KCkpOworICAgICAgICB2ZXJpZnkoY2hhbmdlQm91bmRzTGlzdGVuZXIsIHRpbWVzKDApKS5vblRyYW5zaXRpb25TdGFydChhbnkoKSk7CisKKyAgICAgICAgLy8gbm93IHdhaXQgZm9yIHRoZSBmYWRlIHRyYW5zaXRpb24gdG8gZW5kCisgICAgICAgIHZlcmlmeShmYWRlTGlzdGVuZXIsIHdpdGhpbigxMDAwKSkub25UcmFuc2l0aW9uRW5kKGFueSgpKTsKKworICAgICAgICAvLyBUaGUgY2hhbmdlIGJvdW5kcyBzaG91bGQgc3RhcnQgc29vbiBhZnRlcgorICAgICAgICB2ZXJpZnkoY2hhbmdlQm91bmRzTGlzdGVuZXIsIHdpdGhpbig1MDApKS5vblRyYW5zaXRpb25TdGFydChhbnkoKSk7CisgICAgICAgIHZlcmlmeShjaGFuZ2VCb3VuZHNMaXN0ZW5lciwgdGltZXMoMSkpLm9uVHJhbnNpdGlvblN0YXJ0KGFueSgpKTsKICAgICB9CiAKICAgICBAVGVzdApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdHJhbnNpdGlvbi9zcmMvYW5kcm9pZC90cmFuc2l0aW9uL2N0cy9UcmFuc2l0aW9uVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdHJhbnNpdGlvbi9zcmMvYW5kcm9pZC90cmFuc2l0aW9uL2N0cy9UcmFuc2l0aW9uVGVzdC5qYXZhCmluZGV4IGFkODE5ZmQuLjNhNjBjZDQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RyYW5zaXRpb24vc3JjL2FuZHJvaWQvdHJhbnNpdGlvbi9jdHMvVHJhbnNpdGlvblRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy90cmFuc2l0aW9uL3NyYy9hbmRyb2lkL3RyYW5zaXRpb24vY3RzL1RyYW5zaXRpb25UZXN0LmphdmEKQEAgLTM4LDggKzM4LDYgQEAKIGltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC50cmFuc2l0aW9uLkFyY01vdGlvbjsKIGltcG9ydCBhbmRyb2lkLnRyYW5zaXRpb24uQXV0b1RyYW5zaXRpb247CiBpbXBvcnQgYW5kcm9pZC50cmFuc2l0aW9uLkNoYW5nZUJvdW5kczsKQEAgLTYwLDYgKzU4LDkgQEAKIGltcG9ydCBhbmRyb2lkLndpZGdldC5SZWxhdGl2ZUxheW91dDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKQEAgLTU3NCw3ICs1NzUsNyBAQAogICAgICAgICByZXNldExpc3RlbmVyKCk7CiAgICAgICAgIHN0YXJ0VHJhbnNpdGlvbihSLmxheW91dC5zY2VuZTEpOwogICAgICAgICB2ZXJpZnkobUxpc3RlbmVyLCBuZXZlcigpKS5vblRyYW5zaXRpb25FbmQoYW55KCkpOyAvLyBpdCBpcyBydW5uaW5nIGFzIGV4cGVjdGVkCi0gICAgICAgIHdhaXRGb3JFbmQoNDAwKTsKKyAgICAgICAgd2FpdEZvckVuZCgxMDAwKTsKICAgICB9CiAKICAgICBAVGVzdApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdHJhbnNpdGlvbi9zcmMvYW5kcm9pZC90cmFuc2l0aW9uL2N0cy9WaXNpYmlsaXR5VGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdHJhbnNpdGlvbi9zcmMvYW5kcm9pZC90cmFuc2l0aW9uL2N0cy9WaXNpYmlsaXR5VGVzdC5qYXZhCmluZGV4IDZiNjA4ZTQuLjgzMjUzMjggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3RyYW5zaXRpb24vc3JjL2FuZHJvaWQvdHJhbnNpdGlvbi9jdHMvVmlzaWJpbGl0eVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy90cmFuc2l0aW9uL3NyYy9hbmRyb2lkL3RyYW5zaXRpb24vY3RzL1Zpc2liaWxpdHlUZXN0LmphdmEKQEAgLTI2LDE0ICsyNiwxNSBAQAogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnZlcmlmeTsKIAogaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnRyYW5zaXRpb24uVHJhbnNpdGlvbk1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC50cmFuc2l0aW9uLlRyYW5zaXRpb25WYWx1ZXM7CiBpbXBvcnQgYW5kcm9pZC50cmFuc2l0aW9uLlZpc2liaWxpdHk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3R2L0FuZHJvaWQubWsgYi90ZXN0cy90ZXN0cy90di9BbmRyb2lkLm1rCmluZGV4IDMwNDI5ZDMuLjA3MmQ4MDAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3R2L0FuZHJvaWQubWsKKysrIGIvdGVzdHMvdGVzdHMvdHYvQW5kcm9pZC5tawpAQCAtMjcsOSArMjcsOSBAQAogCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzVHZUZXN0Q2FzZXMKIAotTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lcgorTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lci5zdHVicyBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicwogCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbCBjdHN0ZXN0cnVubmVyCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgY3RzdGVzdHJ1bm5lci1heHQKIAogTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy90di9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdGVzdHMvdHYvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCAzZGU0NjhmLi44Y2IyYjc5IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy90di9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL3R2L0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTExNyw3ICsxMTcsNyBAQAogICAgICAgICA8L2FjdGl2aXR5PgogICAgIDwvYXBwbGljYXRpb24+CiAKLSAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLnR2LmN0cyIKICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IlRlc3RzIGZvciB0aGUgVFYgQVBJcy4iPgogICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0ibGlzdGVuZXIiCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy91aWF1dG9tYXRpb24vQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL3VpYXV0b21hdGlvbi9BbmRyb2lkLm1rCmluZGV4IGViNmVkNjguLmUwYWIzNmMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3VpYXV0b21hdGlvbi9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3Rlc3RzL3VpYXV0b21hdGlvbi9BbmRyb2lkLm1rCkBAIC0yMSw5ICsyMSwxMSBAQAogTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKIAogIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzIGN0c19pbnN0YW50CiAKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjdHN0ZXN0cnVubmVyIHViLXVpYXV0b21hdG9yIGxlZ2FjeS1hbmRyb2lkLXRlc3QKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjdHN0ZXN0cnVubmVyLWF4dCB1Yi11aWF1dG9tYXRvcgorCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicwogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3VpYXV0b21hdGlvbi9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdGVzdHMvdWlhdXRvbWF0aW9uL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggNmRjMjhlZC4uMWEwZGJkZCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdWlhdXRvbWF0aW9uL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvdWlhdXRvbWF0aW9uL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTE3LDcgKzE3LDggQEAKICAtLT4KIAogPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgcGFja2FnZT0iYW5kcm9pZC5hcHAudWlhdXRvbWF0aW9uLmN0cyI+CisgICAgICAgIHBhY2thZ2U9ImFuZHJvaWQuYXBwLnVpYXV0b21hdGlvbi5jdHMiCisgICAgICAgIGFuZHJvaWQ6dGFyZ2V0U2FuZGJveFZlcnNpb249IjIiPgogCiAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uRElTQUJMRV9LRVlHVUFSRCIgLz4KICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9TRUNVUkVfU0VUVElOR1MiIC8+CkBAIC01Miw3ICs1Myw3IEBACiAKICAgPC9hcHBsaWNhdGlvbj4KIAotICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuYXBwLnVpYXV0b21hdGlvbi5jdHMiPgogICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0ibGlzdGVuZXIiCiAgICAgICAgICAgICBhbmRyb2lkOnZhbHVlPSJjb20uYW5kcm9pZC5jdHMucnVubmVyLkN0c1Rlc3RSdW5MaXN0ZW5lciIgLz4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3VpYXV0b21hdGlvbi9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy90ZXN0cy91aWF1dG9tYXRpb24vQW5kcm9pZFRlc3QueG1sCmluZGV4IDE4M2EwOGUuLmM0YmNkZDYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3VpYXV0b21hdGlvbi9BbmRyb2lkVGVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvdWlhdXRvbWF0aW9uL0FuZHJvaWRUZXN0LnhtbApAQCAtMTQsNiArMTQsNyBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIFVJIEF1dG9tYXRpb24gdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImZyYW1ld29yayIgLz4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdWlhdXRvbWF0aW9uL3NyYy9hbmRyb2lkL2FwcC91aWF1dG9tYXRpb24vY3RzL1VpQXV0b21hdGlvblRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3VpYXV0b21hdGlvbi9zcmMvYW5kcm9pZC9hcHAvdWlhdXRvbWF0aW9uL2N0cy9VaUF1dG9tYXRpb25UZXN0LmphdmEKaW5kZXggOWQzM2EwYS4uNGRmZGYzNyAxMDA3NTUKLS0tIGEvdGVzdHMvdGVzdHMvdWlhdXRvbWF0aW9uL3NyYy9hbmRyb2lkL2FwcC91aWF1dG9tYXRpb24vY3RzL1VpQXV0b21hdGlvblRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy91aWF1dG9tYXRpb24vc3JjL2FuZHJvaWQvYXBwL3VpYXV0b21hdGlvbi9jdHMvVWlBdXRvbWF0aW9uVGVzdC5qYXZhCkBAIC0xOSwxMiArMTksMTMgQEAKIGltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbzsKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKIGltcG9ydCBhbmRyb2lkLmFwcC5VaUF1dG9tYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5hcHAudWlhdXRvbWF0aW9uLmN0cy5SOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5QcmVzdWJtaXQ7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKIGltcG9ydCBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdENhc2U7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkZyYW1lU3RhdHM7CkBAIC02MSw2ICs2Miw3IEBACiAgICAgICAgIGdyYW50V3JpdGVTZWN1cmVTZXR0aW5nc1Blcm1pc3Npb24odWlBdXRvbWF0aW9uKTsKICAgICB9CiAKKyAgICBAUHJlc3VibWl0CiAgICAgcHVibGljIHZvaWQgdGVzdFdpbmRvd0NvbnRlbnRGcmFtZVN0YXRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEFjdGl2aXR5IGFjdGl2aXR5ID0gbnVsbDsKICAgICAgICAgdHJ5IHsKQEAgLTE2OSw2ICsxNzEsNyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQFByZXN1Ym1pdAogICAgIHB1YmxpYyB2b2lkIHRlc3RXaW5kb3dBbmltYXRpb25GcmFtZVN0YXRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEFjdGl2aXR5IGZpcnN0QWN0aXZpdHkgPSBudWxsOwogICAgICAgICBBY3Rpdml0eSBzZWNvbmRBY3Rpdml0eSA9IG51bGw7CkBAIC0yNjUsNiArMjY4LDcgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKHN0YXRzLmdldEVuZFRpbWVOYW5vKCksIEZyYW1lU3RhdHMuVU5ERUZJTkVEX1RJTUVfTkFOTyk7CiAgICAgfQogCisgICAgQFByZXN1Ym1pdAogICAgIHB1YmxpYyB2b2lkIHRlc3RVc2luZ1VpQXV0b21hdGlvbkFmdGVyRGVzdHJveV9zaG91bGRUaHJvd0V4Y2VwdGlvbigpIHsKICAgICAgICAgVWlBdXRvbWF0aW9uIHVpQXV0b21hdGlvbiA9IGdldEluc3RydW1lbnRhdGlvbigpLmdldFVpQXV0b21hdGlvbigpOwogICAgICAgICB1aUF1dG9tYXRpb24uZGVzdHJveSgpOwpAQCAtMjc1LDYgKzI3OSw3IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAQXBwTW9kZUZ1bGwKICAgICBwdWJsaWMgdm9pZCB0ZXN0RG9udFN1cHByZXNzQWNjZXNzaWJpbGl0eV9jYW5TdGFydEExMXlTZXJ2aWNlKCkgdGhyb3dzIElPRXhjZXB0aW9uLAogICAgICAgICAgICAgSW50ZXJydXB0ZWRFeGNlcHRpb24gewogICAgICAgICB0dXJuQWNjZXNzaWJpbGl0eU9mZigpOwpAQCAtMjg4LDYgKzI5Myw3IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAQXBwTW9kZUZ1bGwKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VydmljZVdpdGhOb0ZsYWdzX3NodXRzRG93bkExMXlTZXJ2aWNlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgdHVybkFjY2Vzc2liaWxpdHlPZmYoKTsKICAgICAgICAgdHJ5IHsKQEAgLTI5OCwxMiArMzA0LDEzIEBACiAgICAgICAgICAgICB1aUF1dG9tYXRpb24uZGVzdHJveSgpOwogICAgICAgICAgICAgYXNzZXJ0VHJ1ZShVaUF1dG9tYXRpb25UZXN0QTExeVNlcnZpY2Uuc0Nvbm5lY3RlZEluc3RhbmNlLmlzQ29ubmVjdGVkKCkpOwogICAgICAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VWlBdXRvbWF0aW9uKCk7IC8vIFNob3VsZCBzdXBwcmVzcwotICAgICAgICAgICAgYXNzZXJ0RmFsc2UoVWlBdXRvbWF0aW9uVGVzdEExMXlTZXJ2aWNlLnNDb25uZWN0ZWRJbnN0YW5jZS5pc0Nvbm5lY3RlZCgpKTsKKyAgICAgICAgICAgIHdhaXRGb3JBY2Nlc3NpYmlsaXR5U2VydmljZVRvVW5iaW5kKCk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICB0dXJuQWNjZXNzaWJpbGl0eU9mZigpOwogICAgICAgICB9CiAgICAgfQogCisgICAgQEFwcE1vZGVGdWxsCiAgICAgcHVibGljIHZvaWQgdGVzdFNlcnZpY2VTdXByZXNzaW5nQTExeVNlcnZpY2VzX2ExMXlTZXJ2aWNlU3RhcnRzV2hlbkRlc3Ryb3llZCgpCiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKICAgICAgICAgdHVybkFjY2Vzc2liaWxpdHlPZmYoKTsKQEAgLTMxNSw3ICszMjIsNyBAQAogICAgICAgICAgICAgVWlBdXRvbWF0aW9uIHN1cHByZXNzaW5nVWlBdXRvbWF0aW9uID0gZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VWlBdXRvbWF0aW9uKCk7CiAgICAgICAgICAgICAvLyBXZSB2ZXJpZnkgYWJvdmUgdGhhdCB0aGUgY29ubmVjdGlvbiBpcyBicm9rZW4gaGVyZS4gTWFrZSBzdXJlIHdlIHNlZSBhIG5ldyBvbmUKICAgICAgICAgICAgIC8vIGFmdGVyIHdlIGRlc3Ryb3kgaXQKLSAgICAgICAgICAgIFVpQXV0b21hdGlvblRlc3RBMTF5U2VydmljZS5zQ29ubmVjdGVkSW5zdGFuY2UgPSBudWxsOworICAgICAgICAgICAgd2FpdEZvckFjY2Vzc2liaWxpdHlTZXJ2aWNlVG9VbmJpbmQoKTsKICAgICAgICAgICAgIHN1cHByZXNzaW5nVWlBdXRvbWF0aW9uLmRlc3Ryb3koKTsKICAgICAgICAgICAgIHdhaXRGb3JBY2Nlc3NpYmlsaXR5U2VydmljZVRvU3RhcnQoKTsKICAgICAgICAgfSBmaW5hbGx5IHsKQEAgLTMyMyw2ICszMzAsNyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQEFwcE1vZGVGdWxsCiAgICAgcHVibGljIHZvaWQgdGVzdFNlcnZpY2VTdXByZXNzaW5nQTExeVNlcnZpY2VzX2ExMXlTZXJ2aWNlU3RhcnRzV2hlbkZsYWdzQ2hhbmdlKCkKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewogICAgICAgICB0dXJuQWNjZXNzaWJpbGl0eU9mZigpOwpAQCAtMzMzLDcgKzM0MSw3IEBACiAgICAgICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRVaUF1dG9tYXRpb24oKTsKICAgICAgICAgICAgIC8vIFdlIHZlcmlmeSBhYm92ZSB0aGF0IHRoZSBjb25uZWN0aW9uIGlzIGJyb2tlbiBoZXJlLiBNYWtlIHN1cmUgd2Ugc2VlIGEgbmV3IG9uZQogICAgICAgICAgICAgLy8gYWZ0ZXIgd2UgY2hhbmdlIHRoZSBmbGFncwotICAgICAgICAgICAgVWlBdXRvbWF0aW9uVGVzdEExMXlTZXJ2aWNlLnNDb25uZWN0ZWRJbnN0YW5jZSA9IG51bGw7CisgICAgICAgICAgICB3YWl0Rm9yQWNjZXNzaWJpbGl0eVNlcnZpY2VUb1VuYmluZCgpOwogICAgICAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkKICAgICAgICAgICAgICAgICAgICAgLmdldFVpQXV0b21hdGlvbihVaUF1dG9tYXRpb24uRkxBR19ET05UX1NVUFBSRVNTX0FDQ0VTU0lCSUxJVFlfU0VSVklDRVMpOwogICAgICAgICAgICAgd2FpdEZvckFjY2Vzc2liaWxpdHlTZXJ2aWNlVG9TdGFydCgpOwpAQCAtMzcwLDEwICszNzgsOCBAQAogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBncmFudFdyaXRlU2VjdXJlU2V0dGluZ3NQZXJtaXNzaW9uKFVpQXV0b21hdGlvbiB1aUF1dG9tYXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIENvbnRleHQgY29udGV4dCA9IGdldEluc3RydW1lbnRhdGlvbigpLmdldENvbnRleHQoKTsKLSAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgZmQgPSB1aUF1dG9tYXRpb24uZXhlY3V0ZVNoZWxsQ29tbWFuZCgicG0gZ3JhbnQgIgotICAgICAgICAgICAgICAgICsgY29udGV4dC5nZXRQYWNrYWdlTmFtZSgpICsgImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9TRUNVUkVfU0VUVElOR1MiKTsKLSAgICAgICAgZmQuY2xvc2UoKTsKKyAgICAgICAgdWlBdXRvbWF0aW9uLmdyYW50UnVudGltZVBlcm1pc3Npb24oZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VOYW1lKCksCisgICAgICAgICAgICAgICAgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLldSSVRFX1NFQ1VSRV9TRVRUSU5HUyk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGVuYWJsZUFjY2Vzc2liaWxpdHlTZXJ2aWNlKCkgewpAQCAtNDAyLDEyICs0MDgsMTIgQEAKICAgICBwcml2YXRlIHZvaWQgd2FpdEZvckFjY2Vzc2liaWxpdHlTZXJ2aWNlVG9TdGFydCgpIHsKICAgICAgICAgbG9uZyB0aW1lb3V0VGltZU1pbGxpcyA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpICsgVElNRU9VVF9GT1JfU0VSVklDRV9FTkFCTEU7CiAgICAgICAgIHdoaWxlIChTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSA8IHRpbWVvdXRUaW1lTWlsbGlzKSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQoVWlBdXRvbWF0aW9uVGVzdEExMXlTZXJ2aWNlLnNXYWl0T2JqZWN0Rm9yQ29ubmVjdGluZykgeworICAgICAgICAgICAgc3luY2hyb25pemVkKFVpQXV0b21hdGlvblRlc3RBMTF5U2VydmljZS5zV2FpdE9iamVjdEZvckNvbm5lY3RPclVuYmluZCkgewogICAgICAgICAgICAgICAgIGlmIChVaUF1dG9tYXRpb25UZXN0QTExeVNlcnZpY2Uuc0Nvbm5lY3RlZEluc3RhbmNlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBVaUF1dG9tYXRpb25UZXN0QTExeVNlcnZpY2Uuc1dhaXRPYmplY3RGb3JDb25uZWN0aW5nLndhaXQoCisgICAgICAgICAgICAgICAgICAgIFVpQXV0b21hdGlvblRlc3RBMTF5U2VydmljZS5zV2FpdE9iamVjdEZvckNvbm5lY3RPclVuYmluZC53YWl0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRUaW1lTWlsbGlzIC0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkpOwogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlZDsgbG9vcCBhZ2FpbgpAQCAtNDE3LDYgKzQyMywyNCBAQAogICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGVzdCBhY2Nlc3NpYmlsaXR5IHNlcnZpY2Ugbm90IHN0YXJ0aW5nIik7CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIHdhaXRGb3JBY2Nlc3NpYmlsaXR5U2VydmljZVRvVW5iaW5kKCkgeworICAgICAgICBsb25nIHRpbWVvdXRUaW1lTWlsbGlzID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkgKyBUSU1FT1VUX0ZPUl9TRVJWSUNFX0VOQUJMRTsKKyAgICAgICAgd2hpbGUgKFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpIDwgdGltZW91dFRpbWVNaWxsaXMpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZChVaUF1dG9tYXRpb25UZXN0QTExeVNlcnZpY2Uuc1dhaXRPYmplY3RGb3JDb25uZWN0T3JVbmJpbmQpIHsKKyAgICAgICAgICAgICAgICBpZiAoVWlBdXRvbWF0aW9uVGVzdEExMXlTZXJ2aWNlLnNDb25uZWN0ZWRJbnN0YW5jZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgVWlBdXRvbWF0aW9uVGVzdEExMXlTZXJ2aWNlLnNXYWl0T2JqZWN0Rm9yQ29ubmVjdE9yVW5iaW5kLndhaXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dFRpbWVNaWxsaXMgLSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmVkOyBsb29wIGFnYWluCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUZXN0IGFjY2Vzc2liaWxpdHkgc2VydmljZSBkb2Vzbid0IHVuYmluZCIpOworICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCB0dXJuQWNjZXNzaWJpbGl0eU9mZigpIHsKICAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VWlBdXRvbWF0aW9uKCkuZGVzdHJveSgpOwogICAgICAgICBmaW5hbCBPYmplY3Qgd2FpdExvY2tGb3JBMTF5T2ZmID0gbmV3IE9iamVjdCgpOwpAQCAtNDM1LDcgKzQ1OSw2IEBACiAgICAgICAgIENvbnRlbnRSZXNvbHZlciBjciA9IGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCk7CiAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRTdHJpbmcoCiAgICAgICAgICAgICAgICAgY3IsIFNldHRpbmdzLlNlY3VyZS5FTkFCTEVEX0FDQ0VTU0lCSUxJVFlfU0VSVklDRVMsIG51bGwpOwotICAgICAgICBVaUF1dG9tYXRpb25UZXN0QTExeVNlcnZpY2Uuc0Nvbm5lY3RlZEluc3RhbmNlID0gbnVsbDsKICAgICAgICAgbG9uZyB0aW1lb3V0VGltZU1pbGxpcyA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpICsgVElNRU9VVF9GT1JfU0VSVklDRV9FTkFCTEU7CiAgICAgICAgIHdoaWxlIChTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSA8IHRpbWVvdXRUaW1lTWlsbGlzKSB7CiAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHdhaXRMb2NrRm9yQTExeU9mZikgewpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdWlhdXRvbWF0aW9uL3NyYy9hbmRyb2lkL2FwcC91aWF1dG9tYXRpb24vY3RzL1VpQXV0b21hdGlvblRlc3RBMTF5U2VydmljZS5qYXZhIGIvdGVzdHMvdGVzdHMvdWlhdXRvbWF0aW9uL3NyYy9hbmRyb2lkL2FwcC91aWF1dG9tYXRpb24vY3RzL1VpQXV0b21hdGlvblRlc3RBMTF5U2VydmljZS5qYXZhCmluZGV4IGNmNDYxNTcuLmU3MDg3ODQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3VpYXV0b21hdGlvbi9zcmMvYW5kcm9pZC9hcHAvdWlhdXRvbWF0aW9uL2N0cy9VaUF1dG9tYXRpb25UZXN0QTExeVNlcnZpY2UuamF2YQorKysgYi90ZXN0cy90ZXN0cy91aWF1dG9tYXRpb24vc3JjL2FuZHJvaWQvYXBwL3VpYXV0b21hdGlvbi9jdHMvVWlBdXRvbWF0aW9uVGVzdEExMXlTZXJ2aWNlLmphdmEKQEAgLTE1LDYgKzE1LDggQEAKIHBhY2thZ2UgYW5kcm9pZC5hcHAudWlhdXRvbWF0aW9uLmN0czsKIAogaW1wb3J0IGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKIAogLyoqCkBAIC0yMiwxMiArMjQsMjQgQEAKICAqIHNlcnZpY2VzCiAgKi8KIHB1YmxpYyBjbGFzcyBVaUF1dG9tYXRpb25UZXN0QTExeVNlcnZpY2UgZXh0ZW5kcyBBY2Nlc3NpYmlsaXR5U2VydmljZSB7Ci0gICAgcHVibGljIHN0YXRpYyBPYmplY3Qgc1dhaXRPYmplY3RGb3JDb25uZWN0aW5nID0gbmV3IE9iamVjdCgpOworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBMT0dfVEFHID0gIlVpQXV0b21hdGlvblRlc3QiOworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHNXYWl0T2JqZWN0Rm9yQ29ubmVjdE9yVW5iaW5kID0gbmV3IE9iamVjdCgpOwogCiAgICAgcHVibGljIHN0YXRpYyBVaUF1dG9tYXRpb25UZXN0QTExeVNlcnZpY2Ugc0Nvbm5lY3RlZEluc3RhbmNlOwogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25VbmJpbmQoSW50ZW50IGludGVudCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHNXYWl0T2JqZWN0Rm9yQ29ubmVjdE9yVW5iaW5kKSB7CisgICAgICAgICAgICBzQ29ubmVjdGVkSW5zdGFuY2UgPSBudWxsOworICAgICAgICAgICAgc1dhaXRPYmplY3RGb3JDb25uZWN0T3JVbmJpbmQubm90aWZ5QWxsKCk7CisgICAgICAgIH0KKyAgICAgICAgTG9nLnYoTE9HX1RBRywgIm9uVW5iaW5kIFsiICsgdGhpcyArICJdIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3koKSB7CisgICAgICAgIExvZy52KExPR19UQUcsICJvbkRlc3Ryb3kgWyIgKyB0aGlzICsgIl0iKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTQxLDE1ICs1NSwxNiBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKHNXYWl0T2JqZWN0Rm9yQ29ubmVjdGluZykgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHNXYWl0T2JqZWN0Rm9yQ29ubmVjdE9yVW5iaW5kKSB7CiAgICAgICAgICAgICBzQ29ubmVjdGVkSW5zdGFuY2UgPSB0aGlzOwotICAgICAgICAgICAgc1dhaXRPYmplY3RGb3JDb25uZWN0aW5nLm5vdGlmeUFsbCgpOworICAgICAgICAgICAgc1dhaXRPYmplY3RGb3JDb25uZWN0T3JVbmJpbmQubm90aWZ5QWxsKCk7CiAgICAgICAgIH0KKyAgICAgICAgTG9nLnYoTE9HX1RBRywgIm9uU2VydmljZUNvbm5lY3RlZCBbIiArIHRoaXMgKyAiXSIpOwogICAgIH0KIAogICAgIHB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGVkKCkgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGdldFJvb3RJbkFjdGl2ZVdpbmRvdygpID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChnZXRTZXJ2aWNlSW5mbygpID09IG51bGwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3VpZGlzb2xhdGlvbi9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvdWlkaXNvbGF0aW9uL0FuZHJvaWQubWsKaW5kZXggZTllZTNlOS4uZGUzOWFjNiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdWlkaXNvbGF0aW9uL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvdGVzdHMvdWlkaXNvbGF0aW9uL0FuZHJvaWQubWsKQEAgLTIyLDExICsyMiwxNSBAQAogTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKIAogIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzIGN0c19pbnN0YW50CiAKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjdHN0ZXN0cnVubmVyIGN0c3Rlc3RzZXJ2ZXIgbGVnYWN5LWFuZHJvaWQtdGVzdAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGN0c3Rlc3RydW5uZXItYXh0IGN0c3Rlc3RzZXJ2ZXIKIAotTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gb3JnLmFwYWNoZS5odHRwLmxlZ2FjeQorTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gXAorICAgIG9yZy5hcGFjaGUuaHR0cC5sZWdhY3kgXAorICAgIGFuZHJvaWQudGVzdC5ydW5uZXIuc3R1YnMgXAorICAgIGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzIFwKKwogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3VpZGlzb2xhdGlvbi9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdGVzdHMvdWlkaXNvbGF0aW9uL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggMGQyN2UzNy4uMDg3MjUyMSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdWlkaXNvbGF0aW9uL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvdWlkaXNvbGF0aW9uL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTE2LDExICsxNiwxMCBAQAogIC0tPgogCiA8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHBhY2thZ2U9ImFuZHJvaWQudWlkaXNvbGF0aW9uLmN0cyI+CisgICAgcGFja2FnZT0iYW5kcm9pZC51aWRpc29sYXRpb24uY3RzIgorICAgIGFuZHJvaWQ6dGFyZ2V0U2FuZGJveFZlcnNpb249IjIiPgogCi0gICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9Im9yZy5hcGFjaGUuaHR0cC5sZWdhY3kiIGFuZHJvaWQ6cmVxdWlyZWQ9ImZhbHNlIiAvPgotCi0gICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFiZWw9IlVpZElzb2xhdGlvblRlc3QiPgorICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJVaWRJc29sYXRpb25UZXN0IiBhbmRyb2lkOnVzZXNDbGVhcnRleHRUcmFmZmljPSJ0cnVlIj4KICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudWlkaXNvbGF0aW9uLmN0cy5TZXJ2aWNlUnVubmVyQWN0aXZpdHkiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iVWlkSXNvbGF0aW9uVGVzdCIvPgogICAgICAgPHNlcnZpY2UgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnVpZGlzb2xhdGlvbi5jdHMuUGVybWlzc2lvblRlc3RTZXJ2aWNlIgpAQCAtMjksMTEgKzI4LDEyIEBACiAgICAgICAgICAgICAgICBhbmRyb2lkOnByb2Nlc3M9IjpyZW1vdGUiCiAgICAgICAgICAgICAgICBhbmRyb2lkOmlzb2xhdGVkUHJvY2Vzcz0idHJ1ZSIvPgogICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CisgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0ib3JnLmFwYWNoZS5odHRwLmxlZ2FjeSIgYW5kcm9pZDpyZXF1aXJlZD0iZmFsc2UiIC8+CiAgICAgPC9hcHBsaWNhdGlvbj4KIAogICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5JTlRFUk5FVCIvPgogCi0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC51aWRpc29sYXRpb24uY3RzIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIG9mIGFuZHJvaWQudWlkaXNvbGF0aW9uIj4KICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9Imxpc3RlbmVyIgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdWlkaXNvbGF0aW9uL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL3VpZGlzb2xhdGlvbi9BbmRyb2lkVGVzdC54bWwKaW5kZXggMDJkZjQ5NS4uMGE4M2YxMiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdWlkaXNvbGF0aW9uL0FuZHJvaWRUZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy91aWRpc29sYXRpb24vQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgVUlEIElzb2xhdGlvbiB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0ic2VjdXJpdHkiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJub3Qtc2hhcmRhYmxlIiB2YWx1ZT0idHJ1ZSIgLz4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3VpZGlzb2xhdGlvbi9zcmMvYW5kcm9pZC91aWRpc29sYXRpb24vY3RzL0lzb2xhdGVkU2VydmljZVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3VpZGlzb2xhdGlvbi9zcmMvYW5kcm9pZC91aWRpc29sYXRpb24vY3RzL0lzb2xhdGVkU2VydmljZVRlc3QuamF2YQppbmRleCA1YjVjYzE5Li44YmVhYjkyIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy91aWRpc29sYXRpb24vc3JjL2FuZHJvaWQvdWlkaXNvbGF0aW9uL2N0cy9Jc29sYXRlZFNlcnZpY2VUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdWlkaXNvbGF0aW9uL3NyYy9hbmRyb2lkL3VpZGlzb2xhdGlvbi9jdHMvSXNvbGF0ZWRTZXJ2aWNlVGVzdC5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKIGltcG9ydCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb247CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOwogaW1wb3J0IGFuZHJvaWQudGVzdC5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3VpZGlzb2xhdGlvbi9zcmMvYW5kcm9pZC91aWRpc29sYXRpb24vY3RzL1Blcm1pc3Npb25UZXN0U2VydmljZS5qYXZhIGIvdGVzdHMvdGVzdHMvdWlkaXNvbGF0aW9uL3NyYy9hbmRyb2lkL3VpZGlzb2xhdGlvbi9jdHMvUGVybWlzc2lvblRlc3RTZXJ2aWNlLmphdmEKaW5kZXggNWQ3ZDA3ZC4uZmIxOGMyZCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdWlkaXNvbGF0aW9uL3NyYy9hbmRyb2lkL3VpZGlzb2xhdGlvbi9jdHMvUGVybWlzc2lvblRlc3RTZXJ2aWNlLmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdWlkaXNvbGF0aW9uL3NyYy9hbmRyb2lkL3VpZGlzb2xhdGlvbi9jdHMvUGVybWlzc2lvblRlc3RTZXJ2aWNlLmphdmEKQEAgLTgxLDcgKzgxLDggQEAKIAogICAgIGNsYXNzIE5ldHdvcmtUZXN0QXN5bmNUYXNrIGV4dGVuZHMgQXN5bmNUYXNrPFZvaWQsIFZvaWQsIEJvb2xlYW4+IHsKICAgICAgICAgcHJvdGVjdGVkIEJvb2xlYW4gZG9JbkJhY2tncm91bmQoVm9pZC4uLiBub3RoaW5nKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGVzdE5ldHdvcmtBY2Nlc3MoKTsKKyAgICAgICAgICAgIC8vIEluc3RhbnQgYXBwcyBjYW5ub3Qgb3BlbiBUQ1Agc29ja2V0cworICAgICAgICAgICAgcmV0dXJuIGdldFBhY2thZ2VNYW5hZ2VyKCkuaXNJbnN0YW50QXBwKCkgfHwgdGVzdE5ldHdvcmtBY2Nlc3MoKTsKICAgICAgICAgfQogCiAgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uUG9zdEV4ZWN1dGUoQm9vbGVhbiBzdWNjZXNzKSB7CkBAIC0xMzMsNyArMTM0LDggQEAKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgdGVzdE5ldHdvcmtBY2Nlc3NEb25lKGJvb2xlYW4gc3VjY2VzcykgewotICAgICAgICBpZiAoc3VjY2VzcyAhPSBtRXhwZWN0UGVybWlzc2lvbnNBbGxvd2VkKSB7CisgICAgICAgIC8vIEluc3RhbnQgYXBwcyBjYW5ub3Qgb3BlbiBUQ1Agc29ja2V0cy4KKyAgICAgICAgaWYgKCFnZXRQYWNrYWdlTWFuYWdlcigpLmlzSW5zdGFudEFwcCgpICYmIHN1Y2Nlc3MgIT0gbUV4cGVjdFBlcm1pc3Npb25zQWxsb3dlZCkgewogICAgICAgICAgICAgbm90aWZ5Q2xpZW50T2ZGYWlsdXJlKE5FVFdPUktfQUNDRVNTX1RFU1QpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CkBAIC0yMTIsMTEgKzIxNCwxMyBAQAogICAgICAgICBDdHNUZXN0U2VydmVyIHdlYlNlcnZlciA9IG51bGw7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHdlYlNlcnZlciA9IG5ldyBDdHNUZXN0U2VydmVyKGdldEFwcGxpY2F0aW9uKCkpOworICAgICAgICAgICAgICAgIHdlYlNlcnZlciA9IG5ldyBDdHNUZXN0U2VydmVyKGdldEFwcGxpY2F0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICBDdHNUZXN0U2VydmVyLlNzbE1vZGUuVFJVU1RfQU5ZX0NMSUVOVCk7CiAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byBjcmVhdGUgQ3RzVGVzdFNlcnZlci4iKTsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CisKICAgICAgICAgICAgIFVSTCB1cmw7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIHVybCA9IG5ldyBVUkwod2ViU2VydmVyLmdldEFzc2V0VXJsKCJoZWxsby5odG1sIikpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL0FuZHJvaWQubWsKaW5kZXggOWNjMDdiOS4uZDdiZmIwYiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvQW5kcm9pZC5taworKysgYi90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9BbmRyb2lkLm1rCkBAIC0yNCwxNSArMjQsMTQgQEAKICMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKIExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiAKLUxPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIuc3R1YnMKIAogTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKLSAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsIFwKLSAgICBjdHNkZXZpY2V1dGlsbGVnYWN5IFwKLSAgICBjdHN0ZXN0cnVubmVyIFwKKyAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBcCisgICAgY3RzZGV2aWNldXRpbGxlZ2FjeS1heHQgXAorICAgIGN0c3Rlc3RydW5uZXItYXh0IFwKICAgICBtb2NraXRvLXRhcmdldC1taW51cy1qdW5pdDQgXAotICAgIGFuZHJvaWQtc3VwcG9ydC10ZXN0IFwKLSAgICBsZWdhY3ktYW5kcm9pZC10ZXN0CisgICAgYW5kcm9pZHgudGVzdC5ydWxlcwogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGIxMDAyNjYuLmMxMWMxZGQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMzEsMTMgKzMxLDEwIEBACiAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAc3R5bGUvV2hpdGVCYWNrZ3JvdW5kVGhlbWUiCiAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNjcmVlbk9yaWVudGF0aW9uPSJsb2NrZWQiCiAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnJlc2l6ZWFibGVBY3Rpdml0eT0iZmFsc2UiIC8+Ci0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudWlyZW5kZXJpbmcuY3RzLnRlc3RpbmZyYXN0cnVjdHVyZS5NYXRlcmlhbEFjdGl2aXR5IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuTWF0ZXJpYWwuTGlnaHQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnNjcmVlbk9yaWVudGF0aW9uPSJsb2NrZWQiIC8+CiAgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgogICAgIDwvYXBwbGljYXRpb24+CiAKLSAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC51aXJlbmRlcmluZy5jdHMucnVubmVyLlVpUmVuZGVyaW5nUnVubmVyIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cyI+CiAgICAgPC9pbnN0cnVtZW50YXRpb24+CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL0FuZHJvaWRUZXN0LnhtbAppbmRleCBiODg1NWIxLi4zNjllYjQxIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9BbmRyb2lkVGVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvQW5kcm9pZFRlc3QueG1sCkBAIC0yMyw1ICsyMywxMiBAQAogICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5BbmRyb2lkSlVuaXRUZXN0IiA+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icGFja2FnZSIgdmFsdWU9ImFuZHJvaWQudWlyZW5kZXJpbmcuY3RzIiAvPgogICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjExbTU1cyIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJydW5uZXIiIHZhbHVlPSJhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy5ydW5uZXIuVWlSZW5kZXJpbmdSdW5uZXIiIC8+CiAgICAgPC90ZXN0PgorCisgICAgPCEtLSBDb2xsZWN0IHRoZSBmaWxlcyBpbiB0aGUgZHVtcCBkaXJlY3RvcnkgZm9yIGRlYnVnZ2luZyAtLT4KKyAgICA8bWV0cmljc19jb2xsZWN0b3IgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5tZXRyaWMuRmlsZVB1bGxlckxvZ0NvbGxlY3RvciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iZGlyZWN0b3J5LWtleXMiIHZhbHVlPSIvc2RjYXJkL1VpUmVuZGVyaW5nQ2FwdHVyZXMiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY29sbGVjdC1vbi1ydW4tZW5kZWQtb25seSIgdmFsdWU9InRydWUiIC8+CisgICAgPC9tZXRyaWNzX2NvbGxlY3Rvcj4KIDwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3Jlcy9kcmF3YWJsZS1ub2RwaS92ZWN0b3JfZHJhd2FibGVfc2NhbGVfZ29sZGVuLnBuZyBiL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3Jlcy9kcmF3YWJsZS1ub2RwaS92ZWN0b3JfZHJhd2FibGVfc2NhbGVfZ29sZGVuLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmE3NTE2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvcmVzL2RyYXdhYmxlLW5vZHBpL3ZlY3Rvcl9kcmF3YWJsZV9zY2FsZV9nb2xkZW4ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3Jlcy9kcmF3YWJsZS9jaXJjbGUueG1sIGIvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvcmVzL2RyYXdhYmxlL2NpcmNsZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ0N2E4YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3Jlcy9kcmF3YWJsZS9jaXJjbGUueG1sCkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgIH4gQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAgfgorICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgfgorICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIH4KKyAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAgLS0+Cis8dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjkwcHgiCisgICAgICAgIGFuZHJvaWQ6d2lkdGg9IjkwcHgiCisgICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjEiCisgICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMSIgPgorCisgICAgPGdyb3VwPgorICAgICAgICA8cGF0aAorICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJib3gwIgorICAgICAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0ibTAsMC41YTAuNSwwLjUgMCAxLDAgMSwwYTAuNSwwLjUgMCAxLDAgLTEsMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkYwMDAwIiAvPgorICAgIDwvZ3JvdXA+Cis8L3ZlY3Rvcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9yZXMvZHJhd2FibGUvdmVjdG9yX2ljb25fY3JlYXRlLnhtbCBiL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3Jlcy9kcmF3YWJsZS92ZWN0b3JfaWNvbl9jcmVhdGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYjRhZDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9yZXMvZHJhd2FibGUvdmVjdG9yX2ljb25fY3JlYXRlLnhtbApAQCAtMCwwICsxLDI5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisgKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorICogdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisgKiB0aGUgTGljZW5zZS4KKyAqLworLS0+Cis8dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjY0ZHAiCisgICAgICAgIGFuZHJvaWQ6d2lkdGg9IjY0ZHAiCisgICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0IgorICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0IiA+CisKKyAgICA8cGF0aAorICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGMDAwMDAwIgorICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMy4wLDE3LjI1TDMuMCwyMS4wbDMuNzUsMC4wTDE3LjgxMzk5NSw5LjkzNjAwMWwtMy43NS0zLjc1TDMuMCwxNy4yNXpNMjAuNzA3LDcuMDQyOTk5M2MwLjM5MS0wLjM5MSAwLjM5MS0xLjAyMyAwLjAtMS40MTRsLTIuMzM2LTIuMzM2Yy0wLjM5MS0wLjM5MS0xLjAyMy0wLjM5MSAtMS40MTQsMC4wbC0xLjgzMiwxLjgzMmwzLjc1LDMuNzVMMjAuNzA3LDcuMDQyOTk5M3oiIC8+CisKKzwvdmVjdG9yPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3Jlcy9sYXlvdXQvY2lyY2xlX2NsaXBwZWRfd2Vidmlldy54bWwgYi90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9yZXMvbGF5b3V0L2NpcmNsZV9jbGlwcGVkX3dlYnZpZXcueG1sCmluZGV4IDQ0YjY1YmUuLjQ5YWRkODggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3Jlcy9sYXlvdXQvY2lyY2xlX2NsaXBwZWRfd2Vidmlldy54bWwKKysrIGIvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvcmVzL2xheW91dC9jaXJjbGVfY2xpcHBlZF93ZWJ2aWV3LnhtbApAQCAtMTQsNiArMTQsNyBAQAogICAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAtLT4KIDxhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy50ZXN0Y2xhc3Nlcy52aWV3LkNpcmNsZUNsaXBGcmFtZUxheW91dAorICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2lyY2xlX2NsaXBfZnJhbWVfbGF5b3V0IgogICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iQGRpbWVuL3Rlc3Rfd2lkdGgiCiAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vdGVzdF9oZWlnaHQiPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvcmVzL2xheW91dC9mcmFtZV9sYXlvdXRfd2Vidmlldy54bWwgYi90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9yZXMvbGF5b3V0L2ZyYW1lX2xheW91dF93ZWJ2aWV3LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2FmZDgxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvcmVzL2xheW91dC9mcmFtZV9sYXlvdXRfd2Vidmlldy54bWwKQEAgLTAsMCArMSwyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgIC0tPgorPEZyYW1lTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmlkPSJAK2lkL2ZyYW1lX2xheW91dCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iQGRpbWVuL3Rlc3Rfd2lkdGgiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vdGVzdF9oZWlnaHQiPgorICAgIDxpbmNsdWRlIGxheW91dD0iQGxheW91dC90ZXN0X2NvbnRlbnRfd2VidmlldyIvPgorPC9GcmFtZUxheW91dD4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3Jlcy9sYXlvdXQvc2ltcGxlX3NoYWRvd19sYXlvdXQueG1sIGIvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvcmVzL2xheW91dC9zaW1wbGVfc2hhZG93X2xheW91dC54bWwKaW5kZXggMmYyMWRmMC4uMDQyYzJhOSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvcmVzL2xheW91dC9zaW1wbGVfc2hhZG93X2xheW91dC54bWwKKysrIGIvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvcmVzL2xheW91dC9zaW1wbGVfc2hhZG93X2xheW91dC54bWwKQEAgLTE3LDcgKzE3LDggQEAKIDxGcmFtZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCiAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IkBkaW1lbi90ZXN0X3dpZHRoIgogICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL3Rlc3RfaGVpZ2h0Ij4KLSAgICA8VmlldyBhbmRyb2lkOmxheW91dF93aWR0aD0iNDBweCIKKyAgICA8VmlldyBhbmRyb2lkOmlkPSJAK2lkL3NoYWRvd192aWV3IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iNDBweCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI0MHB4IgogICAgICAgICBhbmRyb2lkOnRyYW5zbGF0aW9uWD0iMjVweCIKICAgICAgICAgYW5kcm9pZDp0cmFuc2xhdGlvblk9IjI1cHgiCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9yZXMvbGF5b3V0L3Rlc3RfY29udGVudF93ZWJ2aWV3LnhtbCBiL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3Jlcy9sYXlvdXQvdGVzdF9jb250ZW50X3dlYnZpZXcueG1sCmluZGV4IDhiMDNjYWIuLjMyNzYyZWMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3Jlcy9sYXlvdXQvdGVzdF9jb250ZW50X3dlYnZpZXcueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3Jlcy9sYXlvdXQvdGVzdF9jb250ZW50X3dlYnZpZXcueG1sCkBAIC0xNCw1ICsxNCw2IEBACiAgIC0tPgogPFdlYlZpZXcKICAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDppZD0iQCtpZC93ZWJ2aWV3IgogICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJAZGltZW4vdGVzdF93aWR0aCIKICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi90ZXN0X2hlaWdodCIvPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL2dyYXBoaWNzL3Jlcy9sYXlvdXQvdmVjdG9yX2RyYXdhYmxlX3NjYWxlX2xheW91dC54bWwgYi90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9yZXMvbGF5b3V0L3ZlY3Rvcl9kcmF3YWJsZV9zY2FsZV9sYXlvdXQueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy90ZXN0cy9ncmFwaGljcy9yZXMvbGF5b3V0L3ZlY3Rvcl9kcmF3YWJsZV9zY2FsZV9sYXlvdXQueG1sCnJlbmFtZSB0byB0ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9yZXMvbGF5b3V0L3ZlY3Rvcl9kcmF3YWJsZV9zY2FsZV9sYXlvdXQueG1sCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9yZXMvdmFsdWVzLXRlbGV2aXNpb24vZGltZW5zLnhtbCBiL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3Jlcy92YWx1ZXMtdGVsZXZpc2lvbi9kaW1lbnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNWI2ZDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9yZXMvdmFsdWVzLXRlbGV2aXNpb24vZGltZW5zLnhtbApAQCAtMCwwICsxLDE4IEBACis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICAtLT4KKzxyZXNvdXJjZXM+CisgICAgPGl0ZW0gdHlwZT0iZGltZW4iIGZvcm1hdD0iZmxvYXQiIG5hbWU9ImV4cGVjdGVkX2FtYmllbnRfc2hhZG93X2FscGhhIj4wLjE1PC9pdGVtPgorICAgIDxpdGVtIHR5cGU9ImRpbWVuIiBmb3JtYXQ9ImZsb2F0IiBuYW1lPSJleHBlY3RlZF9zcG90X3NoYWRvd19hbHBoYSI+MC4zPC9pdGVtPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9yZXMvdmFsdWVzL2RpbWVucy54bWwgYi90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9yZXMvdmFsdWVzL2RpbWVucy54bWwKaW5kZXggMWMzMDRkMy4uNDIyODYxMSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvcmVzL3ZhbHVlcy9kaW1lbnMueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3Jlcy92YWx1ZXMvZGltZW5zLnhtbApAQCAtMTUsNCArMTUsNyBAQAogPHJlc291cmNlcz4KICAgICA8ZGltZW4gbmFtZT0idGVzdF93aWR0aCI+OTBweDwvZGltZW4+CiAgICAgPGRpbWVuIG5hbWU9InRlc3RfaGVpZ2h0Ij45MHB4PC9kaW1lbj4KKworICAgIDxpdGVtIHR5cGU9ImRpbWVuIiBmb3JtYXQ9ImZsb2F0IiBuYW1lPSJleHBlY3RlZF9hbWJpZW50X3NoYWRvd19hbHBoYSI+MC4wMzk8L2l0ZW0+CisgICAgPGl0ZW0gdHlwZT0iZGltZW4iIGZvcm1hdD0iZmxvYXQiIG5hbWU9ImV4cGVjdGVkX3Nwb3Rfc2hhZG93X2FscGhhIj4wLjE5PC9pdGVtPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9yZXMvdmFsdWVzL3RoZW1lcy54bWwgYi90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9yZXMvdmFsdWVzL3RoZW1lcy54bWwKaW5kZXggZjA4ZjAyOS4uYzEyY2E5NSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvcmVzL3ZhbHVlcy90aGVtZXMueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3Jlcy92YWx1ZXMvdGhlbWVzLnhtbApAQCAtMTQsNyArMTQsNyBAQAogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxyZXNvdXJjZXM+Ci0gICAgPHN0eWxlIG5hbWU9IldoaXRlQmFja2dyb3VuZFRoZW1lIiBwYXJlbnQ9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLkhvbG8uTm9BY3Rpb25CYXIuRnVsbHNjcmVlbiI+CisgICAgPHN0eWxlIG5hbWU9IldoaXRlQmFja2dyb3VuZFRoZW1lIiBwYXJlbnQ9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLk1hdGVyaWFsLk5vQWN0aW9uQmFyLkZ1bGxzY3JlZW4iPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd05vVGl0bGUiPnRydWU8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93RnVsbHNjcmVlbiI+dHJ1ZTwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dPdmVyc2NhbiI+dHJ1ZTwvaXRlbT4KQEAgLTIyLDUgKzIyLDcgQEAKICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dCYWNrZ3JvdW5kIj5AYW5kcm9pZDpjb2xvci93aGl0ZTwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dDb250ZW50VHJhbnNpdGlvbnMiPmZhbHNlPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd0FuaW1hdGlvblN0eWxlIj5AbnVsbDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDphbWJpZW50U2hhZG93QWxwaGEiPjAuMDM5PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNwb3RTaGFkb3dBbHBoYSI+MC4xOTwvaXRlbT4KICAgICA8L3N0eWxlPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvYml0bWFwY29tcGFyZXJzL01TU0lNQ29tcGFyZXIuamF2YSBiL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy9iaXRtYXBjb21wYXJlcnMvTVNTSU1Db21wYXJlci5qYXZhCmluZGV4IGU2NWZmMmQuLmM4YTFlYmQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy9iaXRtYXBjb21wYXJlcnMvTVNTSU1Db21wYXJlci5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy9iaXRtYXBjb21wYXJlcnMvTVNTSU1Db21wYXJlci5qYXZhCkBAIC00MCw2ICs0MCwxNyBAQAogICAgICAgICBtVGhyZXNob2xkID0gdGhyZXNob2xkOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIENvbXB1dGUgdGhlIHNpemUgb2YgdGhlIHdpbmRvdy4gVGhlIHdpbmRvdyBkZWZhdWx0cyB0byBXSU5ET1dfU0laRSwgYnV0CisgICAgICogbXVzdCBiZSBjb250YWluZWQgd2l0aGluIGRpbWVuc2lvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBjb21wdXRlV2luZG93U2l6ZShpbnQgY29vcmRpbmF0ZVN0YXJ0LCBpbnQgZGltZW5zaW9uKSB7CisgICAgICAgIGlmIChjb29yZGluYXRlU3RhcnQgKyBXSU5ET1dfU0laRSA8PSBkaW1lbnNpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBXSU5ET1dfU0laRTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZGltZW5zaW9uIC0gY29vcmRpbmF0ZVN0YXJ0OworICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIHZlcmlmeVNhbWUoaW50W10gaWRlYWwsIGludFtdIGdpdmVuLCBpbnQgb2Zmc2V0LCBpbnQgc3RyaWRlLCBpbnQgd2lkdGgsCiAgICAgICAgICAgICBpbnQgaGVpZ2h0KSB7CkBAIC00NywxNiArNTgsMjAgQEAKICAgICAgICAgaW50IHdpbmRvd3MgPSAwOwogCiAgICAgICAgIGZvciAoaW50IGN1cnJlbnRXaW5kb3dZID0gMCA7IGN1cnJlbnRXaW5kb3dZIDwgaGVpZ2h0IDsgY3VycmVudFdpbmRvd1kgKz0gV0lORE9XX1NJWkUpIHsKKyAgICAgICAgICAgIGludCB3aW5kb3dIZWlnaHQgPSBjb21wdXRlV2luZG93U2l6ZShjdXJyZW50V2luZG93WSwgaGVpZ2h0KTsKICAgICAgICAgICAgIGZvciAoaW50IGN1cnJlbnRXaW5kb3dYID0gMCA7IGN1cnJlbnRXaW5kb3dYIDwgd2lkdGggOyBjdXJyZW50V2luZG93WCArPSBXSU5ET1dfU0laRSkgeworICAgICAgICAgICAgICAgIGludCB3aW5kb3dXaWR0aCA9IGNvbXB1dGVXaW5kb3dTaXplKGN1cnJlbnRXaW5kb3dYLCB3aWR0aCk7CiAgICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0gaW5kZXhGcm9tWEFuZFkoY3VycmVudFdpbmRvd1gsIGN1cnJlbnRXaW5kb3dZLCBzdHJpZGUsIG9mZnNldCk7Ci0gICAgICAgICAgICAgICAgaWYgKGlzV2luZG93V2hpdGUoaWRlYWwsIHN0YXJ0LCBzdHJpZGUpICYmIGlzV2luZG93V2hpdGUoZ2l2ZW4sIHN0YXJ0LCBzdHJpZGUpKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzV2luZG93V2hpdGUoaWRlYWwsIHN0YXJ0LCBzdHJpZGUsIHdpbmRvd1dpZHRoLCB3aW5kb3dIZWlnaHQpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBpc1dpbmRvd1doaXRlKGdpdmVuLCBzdGFydCwgc3RyaWRlLCB3aW5kb3dXaWR0aCwgd2luZG93SGVpZ2h0KSkgewogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgd2luZG93cysrOwotICAgICAgICAgICAgICAgIGRvdWJsZVtdIG1lYW5zID0gZ2V0TWVhbnMoaWRlYWwsIGdpdmVuLCBzdGFydCwgc3RyaWRlKTsKKyAgICAgICAgICAgICAgICBkb3VibGVbXSBtZWFucyA9IGdldE1lYW5zKGlkZWFsLCBnaXZlbiwgc3RhcnQsIHN0cmlkZSwgd2luZG93V2lkdGgsIHdpbmRvd0hlaWdodCk7CiAgICAgICAgICAgICAgICAgZG91YmxlIG1lYW5YID0gbWVhbnNbMF07CiAgICAgICAgICAgICAgICAgZG91YmxlIG1lYW5ZID0gbWVhbnNbMV07Ci0gICAgICAgICAgICAgICAgZG91YmxlW10gdmFyaWFuY2VzID0gZ2V0VmFyaWFuY2VzKGlkZWFsLCBnaXZlbiwgbWVhblgsIG1lYW5ZLCBzdGFydCwgc3RyaWRlKTsKKyAgICAgICAgICAgICAgICBkb3VibGVbXSB2YXJpYW5jZXMgPSBnZXRWYXJpYW5jZXMoaWRlYWwsIGdpdmVuLCBtZWFuWCwgbWVhblksIHN0YXJ0LCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dXaWR0aCwgd2luZG93SGVpZ2h0KTsKICAgICAgICAgICAgICAgICBkb3VibGUgdmFyWCA9IHZhcmlhbmNlc1swXTsKICAgICAgICAgICAgICAgICBkb3VibGUgdmFyWSA9IHZhcmlhbmNlc1sxXTsKICAgICAgICAgICAgICAgICBkb3VibGUgc3RkQm90aCA9IHZhcmlhbmNlc1syXTsKQEAgLTc2LDkgKzkxLDEwIEBACiAgICAgICAgIHJldHVybiAoU1NJTVRvdGFsID49IG1UaHJlc2hvbGQpOwogICAgIH0KIAotICAgIHByaXZhdGUgYm9vbGVhbiBpc1dpbmRvd1doaXRlKGludFtdIGNvbG9ycywgaW50IHN0YXJ0LCBpbnQgc3RyaWRlKSB7Ci0gICAgICAgIGZvciAoaW50IHkgPSAwIDsgeSA8IFdJTkRPV19TSVpFIDsgeSsrKSB7Ci0gICAgICAgICAgICBmb3IgKGludCB4ID0gMCA7IHggPCBXSU5ET1dfU0laRSA7IHgrKykgeworICAgIHByaXZhdGUgYm9vbGVhbiBpc1dpbmRvd1doaXRlKGludFtdIGNvbG9ycywgaW50IHN0YXJ0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgaW50IHdpbmRvd1dpZHRoLCBpbnQgd2luZG93SGVpZ2h0KSB7CisgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgd2luZG93SGVpZ2h0OyB5KyspIHsKKyAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgd2luZG93V2lkdGg7IHgrKykgewogICAgICAgICAgICAgICAgIGlmIChjb2xvcnNbaW5kZXhGcm9tWEFuZFkoeCwgeSwgc3RyaWRlLCBzdGFydCldICE9IENvbG9yLldISVRFKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9CkBAIC0xMDEsMTggKzExNywxOSBAQAogICAgICAqIHdoZXJlIHRoZSBmaXJzdCBkb3VibGUgaXMgdGhlIG1lYW4gb2YgdGhlIGZpcnN0IHNldCBhbmQgdGhlIHNlY29uZCBkb3VibGUgaXMgdGhlIG1lYW4gb2YgdGhlCiAgICAgICogc2Vjb25kIHNldC4KICAgICAgKi8KLSAgICBwcml2YXRlIGRvdWJsZVtdIGdldE1lYW5zKGludFtdIHBpeGVsczAsIGludFtdIHBpeGVsczEsIGludCBzdGFydCwgaW50IHN0cmlkZSkgeworICAgIHByaXZhdGUgZG91YmxlW10gZ2V0TWVhbnMoaW50W10gcGl4ZWxzMCwgaW50W10gcGl4ZWxzMSwgaW50IHN0YXJ0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgaW50IHdpbmRvd1dpZHRoLCBpbnQgd2luZG93SGVpZ2h0KSB7CiAgICAgICAgIGRvdWJsZSBhdmcwID0gMDsKICAgICAgICAgZG91YmxlIGF2ZzEgPSAwOwotICAgICAgICBmb3IgKGludCB5ID0gMCA7IHkgPCBXSU5ET1dfU0laRSA7IHkrKykgewotICAgICAgICAgICAgZm9yIChpbnQgeCA9IDAgOyB4IDwgV0lORE9XX1NJWkUgOyB4KyspIHsKKyAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCB3aW5kb3dIZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCB3aW5kb3dXaWR0aDsgeCsrKSB7CiAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gaW5kZXhGcm9tWEFuZFkoeCwgeSwgc3RyaWRlLCBzdGFydCk7CiAgICAgICAgICAgICAgICAgYXZnMCArPSBnZXRJbnRlbnNpdHkocGl4ZWxzMFtpbmRleF0pOwogICAgICAgICAgICAgICAgIGF2ZzEgKz0gZ2V0SW50ZW5zaXR5KHBpeGVsczFbaW5kZXhdKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBhdmcwIC89IFdJTkRPV19TSVpFICogV0lORE9XX1NJWkU7Ci0gICAgICAgIGF2ZzEgLz0gV0lORE9XX1NJWkUgKiBXSU5ET1dfU0laRTsKKyAgICAgICAgYXZnMCAvPSB3aW5kb3dXaWR0aCAqIHdpbmRvd0hlaWdodDsKKyAgICAgICAgYXZnMSAvPSB3aW5kb3dXaWR0aCAqIHdpbmRvd0hlaWdodDsKICAgICAgICAgcmV0dXJuIG5ldyBkb3VibGVbXSB7YXZnMCwgYXZnMX07CiAgICAgfQogCkBAIC0xMjIsMTIgKzEzOSwxMiBAQAogICAgICAqIHRoZSBzZWNvbmQgaXMgdGhlIHZhcmlhbmNlIG9mIHRoZSBzZWNvbmQgc2V0IG9mIHBpeGVscywgYW5kIHRoZSB0aGlyZCBpcyB0aGUgY292YXJpYW5jZS4KICAgICAgKi8KICAgICBwcml2YXRlIGRvdWJsZVtdIGdldFZhcmlhbmNlcyhpbnRbXSBwaXhlbHMwLCBpbnRbXSBwaXhlbHMxLCBkb3VibGUgbWVhbjAsIGRvdWJsZSBtZWFuMSwKLSAgICAgICAgICAgIGludCBzdGFydCwgaW50IHN0cmlkZSkgeworICAgICAgICAgICAgaW50IHN0YXJ0LCBpbnQgc3RyaWRlLCBpbnQgd2luZG93V2lkdGgsIGludCB3aW5kb3dIZWlnaHQpIHsKICAgICAgICAgZG91YmxlIHZhcjAgPSAwOwogICAgICAgICBkb3VibGUgdmFyMSA9IDA7CiAgICAgICAgIGRvdWJsZSB2YXJCb3RoID0gMDsKLSAgICAgICAgZm9yIChpbnQgeSA9IDAgOyB5IDwgV0lORE9XX1NJWkUgOyB5KyspIHsKLSAgICAgICAgICAgIGZvciAoaW50IHggPSAwIDsgeCA8IFdJTkRPV19TSVpFIDsgeCsrKSB7CisgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgd2luZG93SGVpZ2h0OyB5KyspIHsKKyAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgd2luZG93V2lkdGg7IHgrKykgewogICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGluZGV4RnJvbVhBbmRZKHgsIHksIHN0cmlkZSwgc3RhcnQpOwogICAgICAgICAgICAgICAgIGRvdWJsZSB2MCA9IGdldEludGVuc2l0eShwaXhlbHMwW2luZGV4XSkgLSBtZWFuMDsKICAgICAgICAgICAgICAgICBkb3VibGUgdjEgPSBnZXRJbnRlbnNpdHkocGl4ZWxzMVtpbmRleF0pIC0gbWVhbjE7CkBAIC0xMzYsOSArMTUzLDkgQEAKICAgICAgICAgICAgICAgICB2YXJCb3RoICs9IHYwICogdjE7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgdmFyMCAvPSAoV0lORE9XX1NJWkUgKiBXSU5ET1dfU0laRSkgLSAxOwotICAgICAgICB2YXIxIC89IChXSU5ET1dfU0laRSAqIFdJTkRPV19TSVpFKSAtIDE7Ci0gICAgICAgIHZhckJvdGggLz0gKFdJTkRPV19TSVpFICogV0lORE9XX1NJWkUpIC0gMTsKKyAgICAgICAgdmFyMCAvPSAod2luZG93V2lkdGggKiB3aW5kb3dIZWlnaHQpIC0gMTsKKyAgICAgICAgdmFyMSAvPSAod2luZG93V2lkdGggKiB3aW5kb3dIZWlnaHQpIC0gMTsKKyAgICAgICAgdmFyQm90aCAvPSAod2luZG93V2lkdGggKiB3aW5kb3dIZWlnaHQpIC0gMTsKICAgICAgICAgcmV0dXJuIG5ldyBkb3VibGVbXSB7dmFyMCwgdmFyMSwgdmFyQm90aH07CiAgICAgfQogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvYml0bWFwdmVyaWZpZXJzL0NvbG9yQ291bnRWZXJpZmllci5qYXZhIGIvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL2JpdG1hcHZlcmlmaWVycy9Db2xvckNvdW50VmVyaWZpZXIuamF2YQppbmRleCAxY2Y3MWM1Li4wM2Y2NDEyIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvYml0bWFwdmVyaWZpZXJzL0NvbG9yQ291bnRWZXJpZmllci5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy9iaXRtYXB2ZXJpZmllcnMvQ29sb3JDb3VudFZlcmlmaWVyLmphdmEKQEAgLTE1LDE1ICsxNSwyMiBAQAogICovCiBwYWNrYWdlIGFuZHJvaWQudWlyZW5kZXJpbmcuY3RzLmJpdG1hcHZlcmlmaWVyczsKIAoraW1wb3J0IGFuZHJvaWQudWlyZW5kZXJpbmcuY3RzLnV0aWwuQ29tcGFyZVV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIHB1YmxpYyBjbGFzcyBDb2xvckNvdW50VmVyaWZpZXIgZXh0ZW5kcyBCaXRtYXBWZXJpZmllciB7CiAgICAgcHJpdmF0ZSBpbnQgbUNvbG9yOwogICAgIHByaXZhdGUgaW50IG1Db3VudDsKKyAgICBwcml2YXRlIGludCBtVGhyZXNob2xkOwogCi0gICAgcHVibGljIENvbG9yQ291bnRWZXJpZmllcihpbnQgY29sb3IsIGludCBjb3VudCkgeworICAgIHB1YmxpYyBDb2xvckNvdW50VmVyaWZpZXIoaW50IGNvbG9yLCBpbnQgY291bnQsIGludCB0aHJlc2hvbGQpIHsKICAgICAgICAgbUNvbG9yID0gY29sb3I7CiAgICAgICAgIG1Db3VudCA9IGNvdW50OworICAgICAgICBtVGhyZXNob2xkID0gdGhyZXNob2xkOworICAgIH0KKworICAgIHB1YmxpYyBDb2xvckNvdW50VmVyaWZpZXIoaW50IGNvbG9yLCBpbnQgY291bnQpIHsKKyAgICAgICAgdGhpcyhjb2xvciwgY291bnQsIDApOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMzEsNyArMzgsOCBAQAogICAgICAgICBpbnQgY291bnQgPSAwOwogICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKICAgICAgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKLSAgICAgICAgICAgICAgICBpZiAoYml0bWFwW2luZGV4RnJvbVhBbmRZKHgsIHksIHN0cmlkZSwgb2Zmc2V0KV0gPT0gbUNvbG9yKSB7CisgICAgICAgICAgICAgICAgaWYgKENvbXBhcmVVdGlscy52ZXJpZnlQaXhlbFdpdGhUaHJlc2hvbGQoCisgICAgICAgICAgICAgICAgICAgICAgICBiaXRtYXBbaW5kZXhGcm9tWEFuZFkoeCwgeSwgc3RyaWRlLCBvZmZzZXQpXSwgbUNvbG9yLCBtVGhyZXNob2xkKSkgewogICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy9iaXRtYXB2ZXJpZmllcnMvQ29sb3JWZXJpZmllci5qYXZhIGIvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL2JpdG1hcHZlcmlmaWVycy9Db2xvclZlcmlmaWVyLmphdmEKaW5kZXggNmM0OTRkZS4uMjZiODg5MCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL2JpdG1hcHZlcmlmaWVycy9Db2xvclZlcmlmaWVyLmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL2JpdG1hcHZlcmlmaWVycy9Db2xvclZlcmlmaWVyLmphdmEKQEAgLTE1LDcgKzE1LDcgQEAKICAqLwogcGFja2FnZSBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy5iaXRtYXB2ZXJpZmllcnM7CiAKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Db2xvckludDsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLkNvbG9ySW50OwogCiAvKioKICAqIENoZWNrcyB0byBzZWUgaWYgYSBiaXRtYXAgaXMgZW50aXJlbHkgYSBzaW5nbGUgY29sb3IKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy9iaXRtYXB2ZXJpZmllcnMvR29sZGVuSW1hZ2VWZXJpZmllci5qYXZhIGIvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL2JpdG1hcHZlcmlmaWVycy9Hb2xkZW5JbWFnZVZlcmlmaWVyLmphdmEKaW5kZXggYjk4MTZkYi4uYWMxZmEwZSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL2JpdG1hcHZlcmlmaWVycy9Hb2xkZW5JbWFnZVZlcmlmaWVyLmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL2JpdG1hcHZlcmlmaWVycy9Hb2xkZW5JbWFnZVZlcmlmaWVyLmphdmEKQEAgLTIwLDE2ICsyMCwxOCBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKIGltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy5iaXRtYXBjb21wYXJlcnMuQml0bWFwQ29tcGFyZXI7CiBpbXBvcnQgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMuZGlmZmVyZW5jZXZpc3VhbGl6ZXJzLlBhc3NGYWlsVmlzdWFsaXplcjsKLWltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy50ZXN0aW5mcmFzdHJ1Y3R1cmUuQWN0aXZpdHlUZXN0QmFzZTsKIAogcHVibGljIGNsYXNzIEdvbGRlbkltYWdlVmVyaWZpZXIgZXh0ZW5kcyBCaXRtYXBWZXJpZmllciB7Ci0gICAgcHJpdmF0ZSBCaXRtYXBDb21wYXJlciBtQml0bWFwQ29tcGFyZXI7Ci0gICAgcHJpdmF0ZSBpbnRbXSBtR29sZGVuQml0bWFwQXJyYXk7CisgICAgcHJpdmF0ZSBmaW5hbCBCaXRtYXBDb21wYXJlciBtQml0bWFwQ29tcGFyZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnRbXSBtR29sZGVuQml0bWFwQXJyYXk7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVdpZHRoOworICAgIHByaXZhdGUgZmluYWwgaW50IG1IZWlnaHQ7CiAKICAgICBwdWJsaWMgR29sZGVuSW1hZ2VWZXJpZmllcihCaXRtYXAgZ29sZGVuQml0bWFwLCBCaXRtYXBDb21wYXJlciBiaXRtYXBDb21wYXJlcikgewotICAgICAgICBtR29sZGVuQml0bWFwQXJyYXkgPSBuZXcgaW50W0FjdGl2aXR5VGVzdEJhc2UuVEVTVF9XSURUSCAqIEFjdGl2aXR5VGVzdEJhc2UuVEVTVF9IRUlHSFRdOwotICAgICAgICBnb2xkZW5CaXRtYXAuZ2V0UGl4ZWxzKG1Hb2xkZW5CaXRtYXBBcnJheSwgMCwgQWN0aXZpdHlUZXN0QmFzZS5URVNUX1dJRFRILCAwLCAwLAotICAgICAgICAgICAgICAgIEFjdGl2aXR5VGVzdEJhc2UuVEVTVF9XSURUSCwgQWN0aXZpdHlUZXN0QmFzZS5URVNUX0hFSUdIVCk7CisgICAgICAgIG1XaWR0aCA9IGdvbGRlbkJpdG1hcC5nZXRXaWR0aCgpOworICAgICAgICBtSGVpZ2h0ID0gZ29sZGVuQml0bWFwLmdldEhlaWdodCgpOworICAgICAgICBtR29sZGVuQml0bWFwQXJyYXkgPSBuZXcgaW50W21XaWR0aCAqIG1IZWlnaHRdOworICAgICAgICBnb2xkZW5CaXRtYXAuZ2V0UGl4ZWxzKG1Hb2xkZW5CaXRtYXBBcnJheSwgMCwgbVdpZHRoLCAwLCAwLCBtV2lkdGgsIG1IZWlnaHQpOwogICAgICAgICBtQml0bWFwQ29tcGFyZXIgPSBiaXRtYXBDb21wYXJlcjsKICAgICB9CiAKQEAgLTM4LDYgKzQwLDE1IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gdmVyaWZ5KEJpdG1hcCBiaXRtYXApIHsKKyAgICAgICAgLy8gQ2xpcCB0byB0aGUgc2l6ZSBvZiB0aGUgZ29sZGVuIGltYWdlLgorICAgICAgICBpZiAoYml0bWFwLmdldFdpZHRoKCkgPiBtV2lkdGggfHwgYml0bWFwLmdldEhlaWdodCgpID4gbUhlaWdodCkgeworICAgICAgICAgICAgYml0bWFwID0gQml0bWFwLmNyZWF0ZUJpdG1hcChiaXRtYXAsIDAsIDAsIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLnZlcmlmeShiaXRtYXApOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIHZlcmlmeShpbnRbXSBiaXRtYXAsIGludCBvZmZzZXQsIGludCBzdHJpZGUsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewogICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSBtQml0bWFwQ29tcGFyZXIudmVyaWZ5U2FtZShtR29sZGVuQml0bWFwQXJyYXksIGJpdG1hcCwgb2Zmc2V0LCBzdHJpZGUsCiAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCk7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvYml0bWFwdmVyaWZpZXJzL1BlclBpeGVsQml0bWFwVmVyaWZpZXIuamF2YSBiL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy9iaXRtYXB2ZXJpZmllcnMvUGVyUGl4ZWxCaXRtYXBWZXJpZmllci5qYXZhCmluZGV4IDBkNDFlNWIuLmY3MWY3OGQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy9iaXRtYXB2ZXJpZmllcnMvUGVyUGl4ZWxCaXRtYXBWZXJpZmllci5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy9iaXRtYXB2ZXJpZmllcnMvUGVyUGl4ZWxCaXRtYXBWZXJpZmllci5qYXZhCkBAIC0xNyw4ICsxNyw3IEBACiAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLkNvbG9ySW50OwotaW1wb3J0IGFuZHJvaWQudWlyZW5kZXJpbmcuY3RzLnRlc3RpbmZyYXN0cnVjdHVyZS5BY3Rpdml0eVRlc3RCYXNlOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uQ29sb3JJbnQ7CiBpbXBvcnQgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMudXRpbC5Db21wYXJlVXRpbHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIApAQCAtNzcsMTAgKzc2LDggQEAKICAgICAgICAgTG9nLmQoVEFHLCBmYWlsdXJlcyArICIgZmFpbHVyZXMgb2JzZXJ2ZWQgb3V0IG9mICIKICAgICAgICAgICAgICAgICArIHRvbGVyYXRlZEZhaWx1cmVzICsgIiB0b2xlcmF0ZWQgZmFpbHVyZXMiKTsKICAgICAgICAgaWYgKCFzdWNjZXNzKSB7Ci0gICAgICAgICAgICBtRGlmZmVyZW5jZUJpdG1hcCA9IEJpdG1hcC5jcmVhdGVCaXRtYXAoQWN0aXZpdHlUZXN0QmFzZS5URVNUX1dJRFRILAotICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eVRlc3RCYXNlLlRFU1RfSEVJR0hULCBCaXRtYXAuQ29uZmlnLkFSR0JfODg4OCk7Ci0gICAgICAgICAgICBtRGlmZmVyZW5jZUJpdG1hcC5zZXRQaXhlbHMoZGlmZmVyZW5jZU1hcCwgb2Zmc2V0LCBzdHJpZGUsIDAsIDAsCi0gICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5VGVzdEJhc2UuVEVTVF9XSURUSCwgQWN0aXZpdHlUZXN0QmFzZS5URVNUX0hFSUdIVCk7CisgICAgICAgICAgICBtRGlmZmVyZW5jZUJpdG1hcCA9IEJpdG1hcC5jcmVhdGVCaXRtYXAod2lkdGgsIGhlaWdodCwgQml0bWFwLkNvbmZpZy5BUkdCXzg4ODgpOworICAgICAgICAgICAgbURpZmZlcmVuY2VCaXRtYXAuc2V0UGl4ZWxzKGRpZmZlcmVuY2VNYXAsIG9mZnNldCwgc3RyaWRlLCAwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gc3VjY2VzczsKICAgICB9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvYml0bWFwdmVyaWZpZXJzL1JlZ2lvblZlcmlmaWVyLmphdmEgYi90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvYml0bWFwdmVyaWZpZXJzL1JlZ2lvblZlcmlmaWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU0MjczNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy9iaXRtYXB2ZXJpZmllcnMvUmVnaW9uVmVyaWZpZXIuamF2YQpAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy5iaXRtYXB2ZXJpZmllcnM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKKworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbkl0ZXJhdG9yOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIFJlZ2lvblZlcmlmaWVyIGV4dGVuZHMgQml0bWFwVmVyaWZpZXIgeworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN1YlJlZ2lvblZlcmlmaWVycyB7CisgICAgICAgIHB1YmxpYyBSZWdpb24gcmVnaW9uOworICAgICAgICBwdWJsaWMgQml0bWFwVmVyaWZpZXIgdmVyaWZpZXI7CisKKyAgICAgICAgU3ViUmVnaW9uVmVyaWZpZXJzKFJlZ2lvbiByZWdpb24sIEJpdG1hcFZlcmlmaWVyIHZlcmlmaWVyKSB7CisgICAgICAgICAgICB0aGlzLnJlZ2lvbiA9IHJlZ2lvbjsKKyAgICAgICAgICAgIHRoaXMudmVyaWZpZXIgPSB2ZXJpZmllcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgTGlzdDxTdWJSZWdpb25WZXJpZmllcnM+IG1SZWdpb25WZXJpZmllcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHZlcmlmeShpbnRbXSBiaXRtYXAsIGludCBvZmZzZXQsIGludCBzdHJpZGUsIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgICAgICBhc3NlcnRGYWxzZShtUmVnaW9uVmVyaWZpZXJzLmlzRW1wdHkoKSk7CisgICAgICAgIGJvb2xlYW4gaXNWZXJpZmllZCA9IHRydWU7CisgICAgICAgIGZvciAoU3ViUmVnaW9uVmVyaWZpZXJzIHN1YlJlZ2lvblZlcmlmaWVyIDogbVJlZ2lvblZlcmlmaWVycykgeworICAgICAgICAgICAgaWYgKHN1YlJlZ2lvblZlcmlmaWVyLnJlZ2lvbi5pc1JlY3QoKSkgeworICAgICAgICAgICAgICAgIFJlY3QgYXJlYSA9IHN1YlJlZ2lvblZlcmlmaWVyLnJlZ2lvbi5nZXRCb3VuZHMoKTsKKyAgICAgICAgICAgICAgICBpc1ZlcmlmaWVkICY9IHZlcmlmeVN1YlJlY3QoYml0bWFwLCBvZmZzZXQsIHN0cmlkZSwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1YlJlZ2lvblZlcmlmaWVyLnZlcmlmaWVyLCBhcmVhKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgUmVnaW9uSXRlcmF0b3IgaXRlciA9IG5ldyBSZWdpb25JdGVyYXRvcihzdWJSZWdpb25WZXJpZmllci5yZWdpb24pOworICAgICAgICAgICAgICAgIFJlY3QgYXJlYSA9IG5ldyBSZWN0KCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKGl0ZXIubmV4dChhcmVhKSkgeworICAgICAgICAgICAgICAgICAgICBpc1ZlcmlmaWVkICY9IHZlcmlmeVN1YlJlY3QoYml0bWFwLCBvZmZzZXQsIHN0cmlkZSwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJSZWdpb25WZXJpZmllci52ZXJpZmllciwgYXJlYSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBpc1ZlcmlmaWVkOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiB2ZXJpZnlTdWJSZWN0KGludFtdIGJpdG1hcCwgaW50IG9mZnNldCwgaW50IHN0cmlkZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgQml0bWFwVmVyaWZpZXIgc3ViVmVyaWZpZXIsIFJlY3QgcmVjdCkgeworICAgICAgICBmaW5hbCBpbnQgbmV3T2Zmc2V0ID0gcmVjdC50b3AgKiBzdHJpZGUgKyByZWN0LmxlZnQgKyBvZmZzZXQ7CisgICAgICAgIHJldHVybiBzdWJWZXJpZmllci52ZXJpZnkoYml0bWFwLCBuZXdPZmZzZXQsIHN0cmlkZSwgcmVjdC53aWR0aCgpLCByZWN0LmhlaWdodCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVnaW9uVmVyaWZpZXIgYWRkVmVyaWZpZXIoUmVjdCBhcmVhLCBCaXRtYXBWZXJpZmllciB2ZXJpZmllcikgeworICAgICAgICByZXR1cm4gYWRkVmVyaWZpZXIobmV3IFJlZ2lvbihhcmVhKSwgdmVyaWZpZXIpOworICAgIH0KKworICAgIHB1YmxpYyBSZWdpb25WZXJpZmllciBhZGRWZXJpZmllcihSZWdpb24gYXJlYSwgQml0bWFwVmVyaWZpZXIgdmVyaWZpZXIpIHsKKyAgICAgICAgbVJlZ2lvblZlcmlmaWVycy5hZGQobmV3IFN1YlJlZ2lvblZlcmlmaWVycyhhcmVhLCB2ZXJpZmllcikpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvYml0bWFwdmVyaWZpZXJzL1NhbXBsZVBvaW50VmVyaWZpZXIuamF2YSBiL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy9iaXRtYXB2ZXJpZmllcnMvU2FtcGxlUG9pbnRWZXJpZmllci5qYXZhCmluZGV4IGM5N2UwMjAuLjMxY2QyODIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy9iaXRtYXB2ZXJpZmllcnMvU2FtcGxlUG9pbnRWZXJpZmllci5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy9iaXRtYXB2ZXJpZmllcnMvU2FtcGxlUG9pbnRWZXJpZmllci5qYXZhCkBAIC0yOCwxMCArMjgsMTAgQEAKICAqLwogcHVibGljIGNsYXNzIFNhbXBsZVBvaW50VmVyaWZpZXIgZXh0ZW5kcyBCaXRtYXBWZXJpZmllciB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTYW1wbGVQb2ludCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfVE9MRVJBTkNFID0gMjA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9UT0xFUkFOQ0UgPSAyMDsKICAgICBwcml2YXRlIGZpbmFsIFBvaW50W10gbVRlc3RQb2ludHM7CiAgICAgcHJpdmF0ZSBmaW5hbCBpbnRbXSBtRXhwZWN0ZWRDb2xvcnM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVRvbGVyYW5jZTsKKyAgICBwcm90ZWN0ZWQgZmluYWwgaW50IG1Ub2xlcmFuY2U7CiAKICAgICBwdWJsaWMgU2FtcGxlUG9pbnRWZXJpZmllcihQb2ludFtdIHRlc3RQb2ludHMsIGludFtdIGV4cGVjdGVkQ29sb3JzKSB7CiAgICAgICAgIHRoaXModGVzdFBvaW50cywgZXhwZWN0ZWRDb2xvcnMsIERFRkFVTFRfVE9MRVJBTkNFKTsKQEAgLTc0LDQgKzc0LDE4IEBACiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gdmVyaWZ5UGl4ZWwoaW50IGNvbG9yLCBpbnQgZXhwZWN0ZWRDb2xvcikgewogICAgICAgICByZXR1cm4gQ29tcGFyZVV0aWxzLnZlcmlmeVBpeGVsV2l0aFRocmVzaG9sZChjb2xvciwgZXhwZWN0ZWRDb2xvciwgbVRvbGVyYW5jZSk7CiAgICAgfQorCisgICAgcHVibGljIGludGVyZmFjZSBWZXJpZnlQaXhlbENvbG9yIHsKKyAgICAgICAgYm9vbGVhbiB2ZXJpZnlQaXhlbChpbnQgY29sb3IpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU2FtcGxlUG9pbnRWZXJpZmllciBjcmVhdGUoUG9pbnRbXSB0ZXN0UG9pbnRzLCBpbnRbXSBleHBlY3RlZENvbG9ycywKKyAgICAgICAgICAgIGludCB0b2xlcmFuY2UsIFZlcmlmeVBpeGVsQ29sb3IgdmVyaWZpZXIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTYW1wbGVQb2ludFZlcmlmaWVyKHRlc3RQb2ludHMsIGV4cGVjdGVkQ29sb3JzLCB0b2xlcmFuY2UpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gdmVyaWZ5UGl4ZWwoaW50IGNvbG9yLCBpbnQgZXhwZWN0ZWRDb2xvcikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci52ZXJpZnlQaXhlbChjb2xvciwgZXhwZWN0ZWRDb2xvcikgJiYgdmVyaWZpZXIudmVyaWZ5UGl4ZWwoY29sb3IpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy9ydW5uZXIvVWlSZW5kZXJpbmdSdW5uZXIuamF2YSBiL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy9ydW5uZXIvVWlSZW5kZXJpbmdSdW5uZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWEwZGJhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3J1bm5lci9VaVJlbmRlcmluZ1J1bm5lci5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudWlyZW5kZXJpbmcuY3RzLnJ1bm5lcjsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lcjsKKworLyoqCisgKiBUT0RPOiBEbyBzb21lIGNvb2wgc3R1ZmYgd2UgYWxzbyB3YW50IGxpa2Ugc2hhcmluZyBEcmF3QWN0aXZpdHkgY3Jvc3MtY2xhc3MuCisgKi8KK3B1YmxpYyBjbGFzcyBVaVJlbmRlcmluZ1J1bm5lciBleHRlbmRzIEFuZHJvaWRKVW5pdFJ1bm5lciB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB3YWl0Rm9yQWN0aXZpdGllc1RvQ29tcGxldGUoKSB7CisgICAgICAgIC8vIE5vLgorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveSgpIHsKKyAgICAgICAgLy8gT2sgbm93IHdhaXQgaWYgbmVjZXNzYXJ5CisgICAgICAgIHN1cGVyLndhaXRGb3JBY3Rpdml0aWVzVG9Db21wbGV0ZSgpOworCisgICAgICAgIHN1cGVyLm9uRGVzdHJveSgpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvQWxwaGFCbGVuZFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy90ZXN0Y2xhc3Nlcy9BbHBoYUJsZW5kVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ZWRhNzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvQWxwaGFCbGVuZFRlc3QuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy50ZXN0Y2xhc3NlczsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3I7CitpbXBvcnQgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMuUjsKK2ltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy5iaXRtYXB2ZXJpZmllcnMuQ29sb3JWZXJpZmllcjsKK2ltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy50ZXN0aW5mcmFzdHJ1Y3R1cmUuQWN0aXZpdHlUZXN0QmFzZTsKK2ltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy50ZXN0aW5mcmFzdHJ1Y3R1cmUuVmlld0luaXRpYWxpemVyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworCitATWVkaXVtVGVzdAorQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBBbHBoYUJsZW5kVGVzdCBleHRlbmRzIEFjdGl2aXR5VGVzdEJhc2UgeworCisgICAgY2xhc3MgVmlld1dpdGhBbHBoYSBleHRlbmRzIFZpZXcgeworICAgICAgICBwdWJsaWMgVmlld1dpdGhBbHBoYShDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBjYW52YXMuZHJhd0NvbG9yKENvbG9yLlJFRCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd0NvbG9yKENvbG9yLkJMVUUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc092ZXJsYXBwaW5nUmVuZGVyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBUaGUgZm9sbG93aW5nIHRlc3QgdmVyaWZpZXMgdGhhdCBhIFJFRCBhbmQgQkxVRSBwYWludHMgb24gYSBub24tb3ZlcmxhcHBpbmcgdmlldyB3aXRoIGEgMC41ZgorICAgICAqIGFscGhhIGJsZW5kcyBjb3JyZWN0bHkgd2l0aCBhIEJMQUNLIHBhcmVudCAod2l0aG91dCB1c2luZyBhbiBvZmZzY3JlZW4gc3VyZmFjZSkuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmxlbmRBbHBoYU5vbk92ZXJsYXBwaW5nVmlldygpIHsKKworICAgICAgICBWaWV3SW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIgPSBuZXcgVmlld0luaXRpYWxpemVyKCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemVWaWV3KFZpZXcgdmlldykgeworICAgICAgICAgICAgICAgIEZyYW1lTGF5b3V0IHJvb3QgPSAoRnJhbWVMYXlvdXQpIHZpZXcuZmluZFZpZXdCeUlkKFIuaWQuZnJhbWVfbGF5b3V0KTsKKyAgICAgICAgICAgICAgICByb290LnNldEJhY2tncm91bmRDb2xvcihDb2xvci5CTEFDSyk7CisKKyAgICAgICAgICAgICAgICBmaW5hbCBWaWV3V2l0aEFscGhhIGNoaWxkID0gbmV3IFZpZXdXaXRoQWxwaGEodmlldy5nZXRDb250ZXh0KCkpOworCisgICAgICAgICAgICAgICAgY2hpbGQuc2V0TGF5b3V0UGFyYW1zKG5ldyBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMoCisgICAgICAgICAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLkZJTExfUEFSRU5ULCAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5GSUxMX1BBUkVOVCkpOworICAgICAgICAgICAgICAgIGNoaWxkLnNldEFscGhhKDAuNWYpOworICAgICAgICAgICAgICAgIHJvb3QuYWRkVmlldyhjaGlsZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgY3JlYXRlVGVzdCgpCisgICAgICAgICAgICAuYWRkTGF5b3V0KFIubGF5b3V0LmZyYW1lX2xheW91dCwgaW5pdGlhbGl6ZXIsIHRydWUpCisgICAgICAgICAgICAucnVuV2l0aFZlcmlmaWVyKG5ldyBDb2xvclZlcmlmaWVyKDB4ZmY0MDAwN2YpKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy90ZXN0Y2xhc3Nlcy9BdXRvZmlsbEhpZ2hsaWdodFRlc3RzLmphdmEgYi90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvQXV0b2ZpbGxIaWdobGlnaHRUZXN0cy5qYXZhCmluZGV4IDgzN2NmYzMuLmUwMjUwNmYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy90ZXN0Y2xhc3Nlcy9BdXRvZmlsbEhpZ2hsaWdodFRlc3RzLmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3Rlc3RjbGFzc2VzL0F1dG9maWxsSGlnaGxpZ2h0VGVzdHMuamF2YQpAQCAtMjIsMTMgKzIyLDE0IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy5SOwogaW1wb3J0IGFuZHJvaWQudWlyZW5kZXJpbmcuY3RzLmJpdG1hcGNvbXBhcmVycy5NU1NJTUNvbXBhcmVyOwogaW1wb3J0IGFuZHJvaWQudWlyZW5kZXJpbmcuY3RzLmJpdG1hcHZlcmlmaWVycy5Hb2xkZW5JbWFnZVZlcmlmaWVyOwogaW1wb3J0IGFuZHJvaWQudWlyZW5kZXJpbmcuY3RzLnRlc3RpbmZyYXN0cnVjdHVyZS5BY3Rpdml0eVRlc3RCYXNlOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3Rlc3RjbGFzc2VzL0JpdG1hcERyYXdhYmxlVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3Rlc3RjbGFzc2VzL0JpdG1hcERyYXdhYmxlVGVzdC5qYXZhCmluZGV4IDdiMDFkMzQuLmY4NDVmOTQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy90ZXN0Y2xhc3Nlcy9CaXRtYXBEcmF3YWJsZVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvQml0bWFwRHJhd2FibGVUZXN0LmphdmEKQEAgLTE3LDQ0ICsxNywzMiBAQAogCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90U2FtZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFNhbWU7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwogCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMuVGhlbWU7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKLQotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlhtbFJlc291cmNlUGFyc2VyOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzLlRoZW1lOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3I7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQml0bWFwRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlLkNvbnN0YW50U3RhdGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudWlyZW5kZXJpbmcuY3RzLlI7CiBpbXBvcnQgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMuYml0bWFwdmVyaWZpZXJzLlJlY3RWZXJpZmllcjsKIGltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy50ZXN0aW5mcmFzdHJ1Y3R1cmUuQWN0aXZpdHlUZXN0QmFzZTsKIGltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy50ZXN0aW5mcmFzdHJ1Y3R1cmUuQ2FudmFzQ2xpZW50OwogaW1wb3J0IGFuZHJvaWQudXRpbC5MYXlvdXREaXJlY3Rpb247CiAKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiAKIEBNZWRpdW1UZXN0CiBAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3Rlc3RjbGFzc2VzL0JpdG1hcEZpbHRlclRlc3RzLmphdmEgYi90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvQml0bWFwRmlsdGVyVGVzdHMuamF2YQppbmRleCBkNzA1YzdlLi4xYTBhZmZiIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvQml0bWFwRmlsdGVyVGVzdHMuamF2YQorKysgYi90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvQml0bWFwRmlsdGVyVGVzdHMuamF2YQpAQCAtMTksMTQgKzE5LDE4IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnRGbGFnc0RyYXdGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbjsKIGltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy5iaXRtYXB2ZXJpZmllcnMuQml0bWFwVmVyaWZpZXI7CiBpbXBvcnQgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMuYml0bWFwdmVyaWZpZXJzLkNvbG9yVmVyaWZpZXI7CiBpbXBvcnQgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMuYml0bWFwdmVyaWZpZXJzLlBlclBpeGVsQml0bWFwVmVyaWZpZXI7CitpbXBvcnQgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMuYml0bWFwdmVyaWZpZXJzLlJlZ2lvblZlcmlmaWVyOwogaW1wb3J0IGFuZHJvaWQudWlyZW5kZXJpbmcuY3RzLnRlc3RpbmZyYXN0cnVjdHVyZS5BY3Rpdml0eVRlc3RCYXNlOwogaW1wb3J0IGFuZHJvaWQudWlyZW5kZXJpbmcuY3RzLnRlc3RpbmZyYXN0cnVjdHVyZS5DYW52YXNDbGllbnQ7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCkBAIC01MywxNCArNTcsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgfHwgd2VpZ2h0ID4gV0hJVEVfV0VJR0hUIC0gREVGQVVMVF9USFJFU0hPTEQ7IC8vIGlzIGFwcHJveCBDb2xvci5XSElURQogICAgICAgICB9CiAgICAgfTsKKwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJpdG1hcFZlcmlmaWVyIEdSRVlfT05MWV9WRVJJRklFUgogICAgICAgICAgICAgPSBuZXcgQ29sb3JWZXJpZmllcihDb2xvci5hcmdiKDI1NSwgMTI3LCAxMjcsIDEyNyksCiAgICAgICAgICAgICAxNTApOyAvLyBjb250ZW50IHdpbGwgYmUgZW50aXJlbHkgZ3JleSwgZm9yIGEgZmFpcmx5IHdpZGUgcmFuZ2Ugb2YgZ3JleQorCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQml0bWFwVmVyaWZpZXIgR1JFWV9QQVJUSUFMX1ZFUklGSUVSCiAgICAgICAgICAgICA9IG5ldyBDb2xvclZlcmlmaWVyKENvbG9yLmFyZ2IoMjU1LCAxMjcsIDEyNywgMTI3KSwKICAgICAgICAgICAgIDMwMCwgMC44Zik7IC8vIGNvbnRlbnQgd2lsbCBiZSBtb3N0bHkgZ3JleSwgZm9yIGEgd2lkZSByYW5nZSBvZiBncmV5CiAKLQogICAgIHByaXZhdGUgc3RhdGljIEJpdG1hcCBjcmVhdGVHcmlkQml0bWFwKGludCB3aWR0aCwgaW50IGhlaWdodCkgewogICAgICAgICBCaXRtYXAgYml0bWFwID0gQml0bWFwLmNyZWF0ZUJpdG1hcCh3aWR0aCwgaGVpZ2h0LCBCaXRtYXAuQ29uZmlnLkFSR0JfODg4OCk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IHdpZHRoIDsgaSsrKSB7CkBAIC0xNDAsNCArMTQ1LDU4IEBACiAgICAgICAgIC8vIHdpbGwgb25seSBiZSAqbW9zdGx5KiBncmV5LgogICAgICAgICByZXR1cm4gc2NhbGVVcCA/IEdSRVlfUEFSVElBTF9WRVJJRklFUiA6IEdSRVlfT05MWV9WRVJJRklFUjsKICAgICB9CisKKyAgICAvLyBDcmVhdGUgYSAzeDMgQkxBQ0sgcmVjdCBzdXJyb3VuZGVkIGJ5IFdISVRFLgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJpdG1hcCBzRmlsdGVyVGVzdEJpdG1hcCA9IEJpdG1hcC5jcmVhdGVCaXRtYXAobmV3IGludFtdIHsKKyAgICAgICAgICAgIENvbG9yLldISVRFLCBDb2xvci5XSElURSwgQ29sb3IuV0hJVEUsIENvbG9yLldISVRFLCBDb2xvci5XSElURSwKKyAgICAgICAgICAgIENvbG9yLldISVRFLCBDb2xvci5CTEFDSywgQ29sb3IuQkxBQ0ssIENvbG9yLkJMQUNLLCBDb2xvci5XSElURSwKKyAgICAgICAgICAgIENvbG9yLldISVRFLCBDb2xvci5CTEFDSywgQ29sb3IuQkxBQ0ssIENvbG9yLkJMQUNLLCBDb2xvci5XSElURSwKKyAgICAgICAgICAgIENvbG9yLldISVRFLCBDb2xvci5CTEFDSywgQ29sb3IuQkxBQ0ssIENvbG9yLkJMQUNLLCBDb2xvci5XSElURSwKKyAgICAgICAgICAgIENvbG9yLldISVRFLCBDb2xvci5XSElURSwgQ29sb3IuV0hJVEUsIENvbG9yLldISVRFLCBDb2xvci5XSElURX0sCisgICAgICAgICAgICA1LCA1LCBCaXRtYXAuQ29uZmlnLkFSR0JfODg4OCk7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REcmF3U25hcHBlZCgpIHsKKyAgICAgICAgZmluYWwgUmVjdCBibGFja0FyZWEgPSBuZXcgUmVjdCg1LCA1LCA4LCA4KTsKKyAgICAgICAgZmluYWwgUmVnaW9uIHdoaXRlQXJlYSA9IG5ldyBSZWdpb24oMCwgMCwgVEVTVF9XSURUSCwgVEVTVF9IRUlHSFQpOworICAgICAgICB3aGl0ZUFyZWEub3AoYmxhY2tBcmVhLCBSZWdpb24uT3AuRElGRkVSRU5DRSk7CisKKyAgICAgICAgY3JlYXRlVGVzdCgpCisgICAgICAgICAgICAgICAgLmFkZENhbnZhc0NsaWVudCgoKGNhbnZhcywgd2lkdGgsIGhlaWdodCkgLT4geworICAgICAgICAgICAgICAgICAgICBQYWludCBwYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgICAgICAgICBwYWludC5zZXRGaWx0ZXJCaXRtYXAodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIHBhaW50LnNldEFudGlBbGlhcyh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAoc0ZpbHRlclRlc3RCaXRtYXAsIDQsIDQsIHBhaW50KTsKKyAgICAgICAgICAgICAgICB9KSkKKyAgICAgICAgICAgICAgICAucnVuV2l0aFZlcmlmaWVyKG5ldyBSZWdpb25WZXJpZmllcigpCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHRlc3Qgc2hvdWxkIGJlIHVuZmlsdGVyZWQsIHNuYXBwZWQgdG8gcGl4ZWwuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTbyBiZSBzdHJpY3Qgb24gY29sb3IgYWNjdXJhY3kKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRWZXJpZmllcihibGFja0FyZWEsIG5ldyBDb2xvclZlcmlmaWVyKENvbG9yLkJMQUNLLCAwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRWZXJpZmllcih3aGl0ZUFyZWEsIG5ldyBDb2xvclZlcmlmaWVyKENvbG9yLldISVRFLCAwKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERyYXdIYWxmUGl4ZWxGaWx0ZXJlZCgpIHsKKyAgICAgICAgZmluYWwgUmVjdCBibGFja0FyZWEgPSBuZXcgUmVjdCg2LCA1LCA4LCA4KTsKKyAgICAgICAgZmluYWwgUmVjdCBncmV5QXJlYTEgPSBuZXcgUmVjdCg1LCA1LCA2LCA4KTsKKyAgICAgICAgZmluYWwgUmVjdCBncmV5QXJlYTIgPSBuZXcgUmVjdCg4LCA1LCA5LCA4KTsKKyAgICAgICAgZmluYWwgUmVnaW9uIHdoaXRlQXJlYSA9IG5ldyBSZWdpb24oMCwgMCwgVEVTVF9XSURUSCwgVEVTVF9IRUlHSFQpOworICAgICAgICB3aGl0ZUFyZWEub3AoYmxhY2tBcmVhLCBSZWdpb24uT3AuRElGRkVSRU5DRSk7CisgICAgICAgIHdoaXRlQXJlYS5vcChncmV5QXJlYTEsIFJlZ2lvbi5PcC5ESUZGRVJFTkNFKTsKKyAgICAgICAgd2hpdGVBcmVhLm9wKGdyZXlBcmVhMiwgUmVnaW9uLk9wLkRJRkZFUkVOQ0UpOworCisgICAgICAgIGNyZWF0ZVRlc3QoKQorICAgICAgICAgICAgICAgIC5hZGRDYW52YXNDbGllbnQoKChjYW52YXMsIHdpZHRoLCBoZWlnaHQpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgUGFpbnQgcGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgcGFpbnQuc2V0RmlsdGVyQml0bWFwKHRydWUpOworICAgICAgICAgICAgICAgICAgICBwYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKHNGaWx0ZXJUZXN0Qml0bWFwLCA0LjVmLCA0LjBmLCBwYWludCk7CisgICAgICAgICAgICAgICAgfSkpCisgICAgICAgICAgICAgICAgLnJ1bldpdGhWZXJpZmllcihuZXcgUmVnaW9uVmVyaWZpZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UncmUgZmlsdGVyaW5nLCBzby4uLiBCTEFDSy1pc2ggYW5kIFdISVRFLWlzaCBpdCBpcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRWZXJpZmllcihibGFja0FyZWEsIG5ldyBDb2xvclZlcmlmaWVyKENvbG9yLkJMQUNLLCAxNikpCisgICAgICAgICAgICAgICAgICAgICAgICAuYWRkVmVyaWZpZXIoZ3JleUFyZWExLCBHUkVZX09OTFlfVkVSSUZJRVIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYWRkVmVyaWZpZXIoZ3JleUFyZWEyLCBHUkVZX09OTFlfVkVSSUZJRVIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYWRkVmVyaWZpZXIod2hpdGVBcmVhLCBuZXcgQ29sb3JWZXJpZmllcihDb2xvci5XSElURSwgMTYpKSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3Rlc3RjbGFzc2VzL0JpdG1hcFRlc3RzLmphdmEgYi90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvQml0bWFwVGVzdHMuamF2YQppbmRleCBjZTdlNGI1Li45MDdjODhhIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvQml0bWFwVGVzdHMuamF2YQorKysgYi90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvQml0bWFwVGVzdHMuamF2YQpAQCAtMTYsMjEgKzE2LDIzIEBACiAKIHBhY2thZ2UgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMudGVzdGNsYXNzZXM7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKIGltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvcjsKIGltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5WYWx1ZUFuaW1hdG9yOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3I7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBpY3R1cmU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLkxhcmdlVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMuUjsKIGltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy5iaXRtYXBjb21wYXJlcnMuTVNTSU1Db21wYXJlcjsKIGltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy5iaXRtYXB2ZXJpZmllcnMuQml0bWFwVmVyaWZpZXI7CiBpbXBvcnQgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMuYml0bWFwdmVyaWZpZXJzLkNvbG9yQ291bnRWZXJpZmllcjsKK2ltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy5iaXRtYXB2ZXJpZmllcnMuUmVjdFZlcmlmaWVyOwogaW1wb3J0IGFuZHJvaWQudWlyZW5kZXJpbmcuY3RzLnRlc3RpbmZyYXN0cnVjdHVyZS5BY3Rpdml0eVRlc3RCYXNlOwogaW1wb3J0IGFuZHJvaWQudWlyZW5kZXJpbmcuY3RzLnRlc3RpbmZyYXN0cnVjdHVyZS5WaWV3SW5pdGlhbGl6ZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkZyYW1lTWV0cmljczsKQEAgLTM5LDYgKzQxLDkgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLkxhcmdlVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CkBAIC0yMTUsNCArMjIwLDI2IEBACiAgICAgICAgICAgICAgICAgLmFkZExheW91dChSLmxheW91dC5mcmFtZV9sYXlvdXQsIGluaXRpYWxpemVyLCB0cnVlKQogICAgICAgICAgICAgICAgIC5ydW5XaXRoQW5pbWF0aW9uVmVyaWZpZXIobmV3IEJsdWVPclJlZFZlcmlmaWVyKCkpOwogICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUZyb21QaWN0dXJlKCkgeworICAgICAgICBmaW5hbCBSZWN0IHJlY3QgPSBuZXcgUmVjdCgxMCwgMTAsIDgwLCA4MCk7CisgICAgICAgIFBpY3R1cmUgcGljdHVyZSA9IG5ldyBQaWN0dXJlKCk7CisgICAgICAgIHsKKyAgICAgICAgICAgIENhbnZhcyBjYW52YXMgPSBwaWN0dXJlLmJlZ2luUmVjb3JkaW5nKFRFU1RfV0lEVEgsIFRFU1RfSEVJR0hUKTsKKyAgICAgICAgICAgIFBhaW50IHAgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIHAuc2V0QW50aUFsaWFzKGZhbHNlKTsKKyAgICAgICAgICAgIHAuc2V0Q29sb3IoQ29sb3IuQkxVRSk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QocmVjdCwgcCk7CisgICAgICAgICAgICBwaWN0dXJlLmVuZFJlY29yZGluZygpOworICAgICAgICB9CisgICAgICAgIEJpdG1hcCBiaXRtYXAgPSBCaXRtYXAuY3JlYXRlQml0bWFwKHBpY3R1cmUsIHBpY3R1cmUuZ2V0V2lkdGgoKSwKKyAgICAgICAgICAgICAgICBwaWN0dXJlLmdldEhlaWdodCgpLCBCaXRtYXAuQ29uZmlnLkFSR0JfODg4OCk7CisgICAgICAgIGFzc2VydEVxdWFscyhURVNUX1dJRFRILCBiaXRtYXAuZ2V0V2lkdGgoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhURVNUX0hFSUdIVCwgYml0bWFwLmdldEhlaWdodCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEJpdG1hcC5Db25maWcuQVJHQl84ODg4LCBiaXRtYXAuZ2V0Q29uZmlnKCkpOworICAgICAgICBjcmVhdGVUZXN0KCkuYWRkQ2FudmFzQ2xpZW50KChjYW52YXMsIHdpZHRoLCBoZWlnaHQpIC0+IHsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKGJpdG1hcCwgMCwgMCwgbnVsbCk7CisgICAgICAgIH0sIHRydWUpLnJ1bldpdGhWZXJpZmllcihuZXcgUmVjdFZlcmlmaWVyKENvbG9yLldISVRFLCBDb2xvci5CTFVFLCByZWN0KSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3Rlc3RjbGFzc2VzL0NhbnZhc1N0YXRlVGVzdHMuamF2YSBiL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy90ZXN0Y2xhc3Nlcy9DYW52YXNTdGF0ZVRlc3RzLmphdmEKaW5kZXggMTZmOThmNi4uMDFmNTY5ZiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3Rlc3RjbGFzc2VzL0NhbnZhc1N0YXRlVGVzdHMuamF2YQorKysgYi90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvQ2FudmFzU3RhdGVUZXN0cy5qYXZhCkBAIC0yMywxNCArMjMsMTMgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGF0aDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3RGOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy5iaXRtYXB2ZXJpZmllcnMuQ29sb3JWZXJpZmllcjsKIGltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy50ZXN0aW5mcmFzdHJ1Y3R1cmUuQWN0aXZpdHlUZXN0QmFzZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvQ29sb3JGaWx0ZXJBbHBoYVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy90ZXN0Y2xhc3Nlcy9Db2xvckZpbHRlckFscGhhVGVzdC5qYXZhCmluZGV4IDFhY2Q3MGEuLmVkZWIyZTggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy90ZXN0Y2xhc3Nlcy9Db2xvckZpbHRlckFscGhhVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy90ZXN0Y2xhc3Nlcy9Db2xvckZpbHRlckFscGhhVGVzdC5qYXZhCkBAIC0xNSw2ICsxNSw3IEBACiAgKi8KIHBhY2thZ2UgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMudGVzdGNsYXNzZXM7CiAKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOwpAQCAtMjQsMTEgKzI1LDEzIEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmQ29sb3JGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmWGZlcm1vZGU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5Db2xvckRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTGFyZ2VUZXN0OwogaW1wb3J0IGFuZHJvaWQudWlyZW5kZXJpbmcuY3RzLmJpdG1hcHZlcmlmaWVycy5TYW1wbGVQb2ludFZlcmlmaWVyOwogaW1wb3J0IGFuZHJvaWQudWlyZW5kZXJpbmcuY3RzLnRlc3RpbmZyYXN0cnVjdHVyZS5BY3Rpdml0eVRlc3RCYXNlOwogaW1wb3J0IGFuZHJvaWQudWlyZW5kZXJpbmcuY3RzLnRlc3RpbmZyYXN0cnVjdHVyZS5DYW52YXNDbGllbnQ7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTGFyZ2VUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKQEAgLTEyMywxMiArMTI2LDExIEBACiAgICAgfQogCiAKLSAgICBAT3ZlcnJpZGUKKyAgICBAQmVmb3JlCiAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0KICAgICAgICAgLy8gdGVtcG9yYXJ5IC0gZW5zdXJlIHRlc3QgaXNuJ3QgY2FwdHVyaW5nIHdpbmRvdyBiZyBvbmx5Ci0gICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpLnJ1bk9uTWFpblN5bmMoKCkgLT4gZ2V0QWN0aXZpdHkoKS5nZXRXaW5kb3coKS5zZXRCYWNrZ3JvdW5kRHJhd2FibGUoCisgICAgICAgIGZpbmFsIEFjdGl2aXR5IGFjdGl2aXR5ID0gZ2V0QWN0aXZpdHkoKTsKKyAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkucnVuT25NYWluU3luYygoKSAtPiBhY3Rpdml0eS5nZXRXaW5kb3coKS5zZXRCYWNrZ3JvdW5kRHJhd2FibGUoCiAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ29sb3JEcmF3YWJsZShDb2xvci5HUkVFTikpKTsKIAogICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy90ZXN0Y2xhc3Nlcy9Db2xvckZpbHRlclRlc3RzLmphdmEgYi90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvQ29sb3JGaWx0ZXJUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YzFiZjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvQ29sb3JGaWx0ZXJUZXN0cy5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudWlyZW5kZXJpbmcuY3RzLnRlc3RjbGFzc2VzOworCitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yTWF0cml4Q29sb3JGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy5iaXRtYXB2ZXJpZmllcnMuQ29sb3JWZXJpZmllcjsKK2ltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy50ZXN0aW5mcmFzdHJ1Y3R1cmUuQWN0aXZpdHlUZXN0QmFzZTsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKK0BNZWRpdW1UZXN0CitAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIENvbG9yRmlsdGVyVGVzdHMgZXh0ZW5kcyBBY3Rpdml0eVRlc3RCYXNlIHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbG9yTWF0cml4KCkgeworICAgICAgICBjcmVhdGVUZXN0KCkKKyAgICAgICAgICAgICAgICAuYWRkQ2FudmFzQ2xpZW50KChjYW52YXMsIHdpZHRoLCBoZWlnaHQpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgQml0bWFwIHdoaXRlQml0bWFwID0gQml0bWFwLmNyZWF0ZUJpdG1hcCh3aWR0aCwgaGVpZ2h0LCBCaXRtYXAuQ29uZmlnLkFSR0JfODg4OCk7CisgICAgICAgICAgICAgICAgICAgIHdoaXRlQml0bWFwLmVyYXNlQ29sb3IoQ29sb3IuV0hJVEUpOworCisgICAgICAgICAgICAgICAgICAgIFBhaW50IHBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKHdoaXRlQml0bWFwLCAwLCAwLCBwYWludCk7CisKKyAgICAgICAgICAgICAgICAgICAgcGFpbnQuc2V0QW50aUFsaWFzKHRydWUpOworICAgICAgICAgICAgICAgICAgICBwYWludC5zZXRDb2xvckZpbHRlcihuZXcgQ29sb3JNYXRyaXhDb2xvckZpbHRlcihuZXcgZmxvYXRbXSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsIDAsIDAsIDAsIDI1NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAtMSwgMCwgMCwgMjU1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIC0xLCAwLCAyNTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMSwgMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKKyAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAod2hpdGVCaXRtYXAsIDAsIDAsIHBhaW50KTsKKworICAgICAgICAgICAgICAgIH0sIHRydWUpCisgICAgICAgICAgICAgICAgLnJ1bldpdGhWZXJpZmllcihuZXcgQ29sb3JWZXJpZmllcihDb2xvci5CTEFDSykpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3Rlc3RjbGFzc2VzL0NvbG9yU3BhY2VUZXN0cy5qYXZhIGIvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3Rlc3RjbGFzc2VzL0NvbG9yU3BhY2VUZXN0cy5qYXZhCmluZGV4IDEzYzhlOTEuLmVlNmQwZWQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy90ZXN0Y2xhc3Nlcy9Db2xvclNwYWNlVGVzdHMuamF2YQorKysgYi90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvQ29sb3JTcGFjZVRlc3RzLmphdmEKQEAgLTI4LDEzICsyOCwxNCBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb2ludDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlNoYWRlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk51bGxhYmxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy5iaXRtYXB2ZXJpZmllcnMuU2FtcGxlUG9pbnRWZXJpZmllcjsKIGltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy50ZXN0aW5mcmFzdHJ1Y3R1cmUuQWN0aXZpdHlUZXN0QmFzZTsKIAoraW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTm9uTnVsbDsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKQEAgLTY0LDcgKzY1LDcgQEAKICAgICAgICAgY3JlYXRlVGVzdCgpCiAgICAgICAgICAgICAgICAgLmFkZENhbnZhc0NsaWVudCgiRHJhd19EaXNwbGF5UDNfODg4OCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAoYywgdywgaCkgLT4gZHJhd0Fzc2V0KGMsIGJpdG1hcDg4ODgpLCB0cnVlKQotICAgICAgICAgICAgICAgIC5hZGRDYW52YXNDbGllbnRXaXRob3V0VXNpbmdQaWN0dXJlKAorICAgICAgICAgICAgICAgIC5hZGRDYW52YXNDbGllbnQoCiAgICAgICAgICAgICAgICAgICAgICAgICAoYywgdywgaCkgLT4gZHJhd0Fzc2V0KGMsIGJpdG1hcEhhcmR3YXJlKSwgdHJ1ZSkKICAgICAgICAgICAgICAgICAucnVuV2l0aFZlcmlmaWVyKG5ldyBTYW1wbGVQb2ludFZlcmlmaWVyKAogICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFBvaW50W10gewpAQCAtOTYsNyArOTcsNyBAQAogICAgICAgICBjcmVhdGVUZXN0KCkKICAgICAgICAgICAgICAgICAuYWRkQ2FudmFzQ2xpZW50KCJEcmF3X1Byb1Bob3RvUkdCXzg4ODgiLAogICAgICAgICAgICAgICAgICAgICAgICAgKGMsIHcsIGgpIC0+IGRyYXdBc3NldChjLCBiaXRtYXA4ODg4KSwgdHJ1ZSkKLSAgICAgICAgICAgICAgICAuYWRkQ2FudmFzQ2xpZW50V2l0aG91dFVzaW5nUGljdHVyZSgKKyAgICAgICAgICAgICAgICAuYWRkQ2FudmFzQ2xpZW50KAogICAgICAgICAgICAgICAgICAgICAgICAgKGMsIHcsIGgpIC0+IGRyYXdBc3NldChjLCBiaXRtYXBIYXJkd2FyZSksIHRydWUpCiAgICAgICAgICAgICAgICAgLnJ1bldpdGhWZXJpZmllcihuZXcgU2FtcGxlUG9pbnRWZXJpZmllcigKICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQb2ludFtdIHsKQEAgLTEyOSw3ICsxMzAsNyBAQAogICAgICAgICBjcmVhdGVUZXN0KCkKICAgICAgICAgICAgICAgICAuYWRkQ2FudmFzQ2xpZW50KCJEcmF3X0Fkb2JlUkdCX1RyYW5zbHVjZW50Xzg4ODgiLAogICAgICAgICAgICAgICAgICAgICAgICAgKGMsIHcsIGgpIC0+IGRyYXdUcmFuc2x1Y2VudEFzc2V0KGMsIGJpdG1hcDg4ODgpLCB0cnVlKQotICAgICAgICAgICAgICAgIC5hZGRDYW52YXNDbGllbnRXaXRob3V0VXNpbmdQaWN0dXJlKAorICAgICAgICAgICAgICAgIC5hZGRDYW52YXNDbGllbnQoCiAgICAgICAgICAgICAgICAgICAgICAgICAoYywgdywgaCkgLT4gZHJhd1RyYW5zbHVjZW50QXNzZXQoYywgYml0bWFwSGFyZHdhcmUpLCB0cnVlKQogICAgICAgICAgICAgICAgIC5ydW5XaXRoVmVyaWZpZXIobmV3IFNhbXBsZVBvaW50VmVyaWZpZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUG9pbnRbXSB7IHBvaW50KDAsIDApIH0sCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvRWRnZUVmZmVjdFRlc3RzLmphdmEgYi90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvRWRnZUVmZmVjdFRlc3RzLmphdmEKaW5kZXggMjVhYmNiZi4uNjI5MTI3YyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3Rlc3RjbGFzc2VzL0VkZ2VFZmZlY3RUZXN0cy5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy90ZXN0Y2xhc3Nlcy9FZGdlRWZmZWN0VGVzdHMuamF2YQpAQCAtMTUsMzggKzE1LDM4IEBACiAgKi8KIHBhY2thZ2UgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMudGVzdGNsYXNzZXM7CiAKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMudXRpbC5Nb2NrVnN5bmNIZWxwZXIubmV4dEZyYW1lOworCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTWF0Y2hlcnMuYW55RmxvYXQ7CiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ubW9jazsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by52ZXJpZnk7CiAKLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5MYXJnZVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU3VwcHJlc3M7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwotaW1wb3J0IGFuZHJvaWQudWlyZW5kZXJpbmcuY3RzLlI7CiBpbXBvcnQgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMuYml0bWFwdmVyaWZpZXJzLlBlclBpeGVsQml0bWFwVmVyaWZpZXI7Ci1pbXBvcnQgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMudGVzdGluZnJhc3RydWN0dXJlLk1hdGVyaWFsQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMudGVzdGluZnJhc3RydWN0dXJlLlRyYWNlcjsKIGltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy51dGlsLkJpdG1hcEFzc2VydGVyOworaW1wb3J0IGFuZHJvaWQudWlyZW5kZXJpbmcuY3RzLnV0aWwuTW9ja1ZzeW5jSGVscGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0VGhlbWVXcmFwcGVyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkVkZ2VFZmZlY3Q7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bGVzLlRlc3ROYW1lOwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIGltcG9ydCBvcmcubW9ja2l0by5Bcmd1bWVudENhcHRvcjsKIAotQE1lZGl1bVRlc3QKK0BTbWFsbFRlc3QKIEBSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCiBwdWJsaWMgY2xhc3MgRWRnZUVmZmVjdFRlc3RzIHsKIApAQCAtNTQsMjYgKzU0LDI2IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhFSUdIVCA9IDkwOwogCiAgICAgQFJ1bGUKLSAgICBwdWJsaWMgVGVzdE5hbWUgbmFtZSA9IG5ldyBUZXN0TmFtZSgpOwotCi0gICAgQFJ1bGUKLSAgICBwdWJsaWMgQWN0aXZpdHlUZXN0UnVsZTxNYXRlcmlhbEFjdGl2aXR5PiBtQWN0aXZpdHlSdWxlID0gbmV3IEFjdGl2aXR5VGVzdFJ1bGU8PigKLSAgICAgICAgICAgIE1hdGVyaWFsQWN0aXZpdHkuY2xhc3MpOworICAgIHB1YmxpYyBUcmFjZXIgbmFtZSA9IG5ldyBUcmFjZXIoKTsKIAogICAgIHByaXZhdGUgQml0bWFwQXNzZXJ0ZXIgbUJpdG1hcEFzc2VydGVyID0gbmV3IEJpdG1hcEFzc2VydGVyKHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCksCiAgICAgICAgICAgICBuYW1lLmdldE1ldGhvZE5hbWUoKSk7CiAKKyAgICBwcml2YXRlIENvbnRleHQgbVRoZW1lQ29udGV4dDsKKwogICAgIGludGVyZmFjZSBFZGdlRWZmZWN0SW5pdGlhbGl6ZXIgewogICAgICAgICB2b2lkIGluaXRpYWxpemUoRWRnZUVmZmVjdCBlZGdlRWZmZWN0KTsKICAgICB9CiAKLSAgICBwcml2YXRlIEFjdGl2aXR5IGdldEFjdGl2aXR5KCkgewotICAgICAgICByZXR1cm4gbUFjdGl2aXR5UnVsZS5nZXRBY3Rpdml0eSgpOworICAgIHByaXZhdGUgQ29udGV4dCBnZXRDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gbVRoZW1lQ29udGV4dDsKICAgICB9CiAKICAgICBAQmVmb3JlCiAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0gICAgICAgIG1CaXRtYXBBc3NlcnRlci5zZXRVcChnZXRBY3Rpdml0eSgpKTsKKyAgICAgICAgZmluYWwgQ29udGV4dCB0YXJnZXRDb250ZXh0ID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0VGFyZ2V0Q29udGV4dCgpOworICAgICAgICBtVGhlbWVDb250ZXh0ID0gbmV3IENvbnRleHRUaGVtZVdyYXBwZXIodGFyZ2V0Q29udGV4dCwKKyAgICAgICAgICAgICAgICBhbmRyb2lkLlIuc3R5bGUuVGhlbWVfTWF0ZXJpYWxfTGlnaHQpOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEVkZ2VFZmZlY3RWYWxpZGF0b3IgZXh0ZW5kcyBQZXJQaXhlbEJpdG1hcFZlcmlmaWVyIHsKQEAgLTEwMCw3ICsxMDAsNyBAQAogICAgICAgICBCaXRtYXAgYml0bWFwID0gQml0bWFwLmNyZWF0ZUJpdG1hcChXSURUSCwgSEVJR0hULCBCaXRtYXAuQ29uZmlnLkFSR0JfODg4OCk7CiAgICAgICAgIENhbnZhcyBjYW52YXMgPSBuZXcgQ2FudmFzKGJpdG1hcCk7CiAgICAgICAgIGNhbnZhcy5kcmF3Q29sb3IoQ29sb3IuQkxBQ0spOwotICAgICAgICBFZGdlRWZmZWN0IGVkZ2VFZmZlY3QgPSBuZXcgRWRnZUVmZmVjdChnZXRBY3Rpdml0eSgpKTsKKyAgICAgICAgRWRnZUVmZmVjdCBlZGdlRWZmZWN0ID0gbmV3IEVkZ2VFZmZlY3QoZ2V0Q29udGV4dCgpKTsKICAgICAgICAgZWRnZUVmZmVjdC5zZXRTaXplKFdJRFRILCBIRUlHSFQpOwogICAgICAgICBlZGdlRWZmZWN0LnNldENvbG9yKENvbG9yLlJFRCk7CiAgICAgICAgIGFzc2VydEVxdWFscyhDb2xvci5SRUQsIGVkZ2VFZmZlY3QuZ2V0Q29sb3IoKSk7CkBAIC0xNTAsNyArMTUwLDcgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdElzRmluaXNoZWQoKSB7Ci0gICAgICAgIEVkZ2VFZmZlY3QgZWZmZWN0ID0gbmV3IEVkZ2VFZmZlY3QoZ2V0QWN0aXZpdHkoKSk7CisgICAgICAgIEVkZ2VFZmZlY3QgZWZmZWN0ID0gbmV3IEVkZ2VFZmZlY3QoZ2V0Q29udGV4dCgpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShlZmZlY3QuaXNGaW5pc2hlZCgpKTsKICAgICAgICAgZWZmZWN0Lm9uUHVsbCgwLjVmKTsKICAgICAgICAgYXNzZXJ0RmFsc2UoZWZmZWN0LmlzRmluaXNoZWQoKSk7CkBAIC0xNTgsNyArMTU4LDcgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEZpbmlzaCgpIHsKLSAgICAgICAgRWRnZUVmZmVjdCBlZmZlY3QgPSBuZXcgRWRnZUVmZmVjdChnZXRBY3Rpdml0eSgpKTsKKyAgICAgICAgRWRnZUVmZmVjdCBlZmZlY3QgPSBuZXcgRWRnZUVmZmVjdChnZXRDb250ZXh0KCkpOwogICAgICAgICBlZmZlY3Qub25QdWxsKDEpOwogICAgICAgICBlZmZlY3QuZmluaXNoKCk7CiAgICAgICAgIGFzc2VydFRydWUoZWZmZWN0LmlzRmluaXNoZWQoKSk7CkBAIC0xNzAsMTQgKzE3MCwxNCBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q29sb3IoKSB7Ci0gICAgICAgIEVkZ2VFZmZlY3QgZWZmZWN0ID0gbmV3IEVkZ2VFZmZlY3QoZ2V0QWN0aXZpdHkoKSk7CisgICAgICAgIEVkZ2VFZmZlY3QgZWZmZWN0ID0gbmV3IEVkZ2VFZmZlY3QoZ2V0Q29udGV4dCgpKTsKICAgICAgICAgZWZmZWN0LnNldENvbG9yKENvbG9yLkdSRUVOKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKENvbG9yLkdSRUVOLCBlZmZlY3QuZ2V0Q29sb3IoKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TWF4SGVpZ2h0KCkgewotICAgICAgICBFZGdlRWZmZWN0IGVkZ2VFZmZlY3QgPSBuZXcgRWRnZUVmZmVjdChnZXRBY3Rpdml0eSgpKTsKKyAgICAgICAgRWRnZUVmZmVjdCBlZGdlRWZmZWN0ID0gbmV3IEVkZ2VFZmZlY3QoZ2V0Q29udGV4dCgpKTsKICAgICAgICAgZWRnZUVmZmVjdC5zZXRTaXplKDIwMCwgMjAwKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShlZGdlRWZmZWN0LmdldE1heEhlaWdodCgpIDw9IDIwMCAqIDIgKyAxKTsKICAgICAgICAgZWRnZUVmZmVjdC5zZXRTaXplKDIwMCwgMCk7CkBAIC0xOTEsMzAgKzE5MSwyNyBAQAogICAgIC8vIHZhbGlkYXRlcyBjaGFuZ2VzIHRvIHRoZSBhbHBoYSBvZiBkcmF3IGNvbW1hbmRzIHByb2R1Y2VkIGJ5IEVkZ2VFZmZlY3QKICAgICAvLyBvdmVyIHRoZSBjb3Vyc2Ugb2YgYW4gYW5pbWF0aW9uCiAgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUFscGhhKEVkZ2VFZmZlY3RJbml0aWFsaXplciBpbml0aWFsaXplciwgQWxwaGFWZXJpZmllciBhbHBoYVZlcmlmaWVyKSB7Ci0gICAgICAgIENhbnZhcyBjYW52YXMgPSBtb2NrKENhbnZhcy5jbGFzcyk7Ci0gICAgICAgIEFyZ3VtZW50Q2FwdG9yPFBhaW50PiBjYXB0b3IgPSBBcmd1bWVudENhcHRvci5mb3JDbGFzcyhQYWludC5jbGFzcyk7Ci0gICAgICAgIEVkZ2VFZmZlY3QgZWRnZUVmZmVjdCA9IG5ldyBFZGdlRWZmZWN0KGdldEFjdGl2aXR5KCkpOwotICAgICAgICBlZGdlRWZmZWN0LnNldFNpemUoMjAwLCAyMDApOwotICAgICAgICBpbml0aWFsaXplci5pbml0aWFsaXplKGVkZ2VFZmZlY3QpOwotICAgICAgICBlZGdlRWZmZWN0LmRyYXcoY2FudmFzKTsKLSAgICAgICAgdmVyaWZ5KGNhbnZhcykuZHJhd0NpcmNsZShhbnlGbG9hdCgpLCBhbnlGbG9hdCgpLCBhbnlGbG9hdCgpLCBjYXB0b3IuY2FwdHVyZSgpKTsKLSAgICAgICAgaW50IG9sZEFscGhhID0gY2FwdG9yLmdldFZhbHVlKCkuZ2V0QWxwaGEoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDIwKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYW52YXMgPSBtb2NrKENhbnZhcy5jbGFzcyk7CisgICAgICAgIE1vY2tWc3luY0hlbHBlci5ydW5PblZzeW5jVGhyZWFkKCgpIC0+IHsKKyAgICAgICAgICAgIENhbnZhcyBjYW52YXMgPSBtb2NrKENhbnZhcy5jbGFzcyk7CisgICAgICAgICAgICBBcmd1bWVudENhcHRvcjxQYWludD4gY2FwdG9yID0gQXJndW1lbnRDYXB0b3IuZm9yQ2xhc3MoUGFpbnQuY2xhc3MpOworICAgICAgICAgICAgRWRnZUVmZmVjdCBlZGdlRWZmZWN0ID0gbmV3IEVkZ2VFZmZlY3QoZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgICAgIGVkZ2VFZmZlY3Quc2V0U2l6ZSgyMDAsIDIwMCk7CisgICAgICAgICAgICBpbml0aWFsaXplci5pbml0aWFsaXplKGVkZ2VFZmZlY3QpOwogICAgICAgICAgICAgZWRnZUVmZmVjdC5kcmF3KGNhbnZhcyk7CiAgICAgICAgICAgICB2ZXJpZnkoY2FudmFzKS5kcmF3Q2lyY2xlKGFueUZsb2F0KCksIGFueUZsb2F0KCksIGFueUZsb2F0KCksIGNhcHRvci5jYXB0dXJlKCkpOwotICAgICAgICAgICAgaW50IG5ld0FscGhhID0gY2FwdG9yLmdldFZhbHVlKCkuZ2V0QWxwaGEoKTsKLSAgICAgICAgICAgIGFscGhhVmVyaWZpZXIudmVyaWZ5KG9sZEFscGhhLCBuZXdBbHBoYSk7Ci0gICAgICAgICAgICBvbGRBbHBoYSA9IG5ld0FscGhhOwotICAgICAgICB9CisgICAgICAgICAgICBpbnQgb2xkQWxwaGEgPSBjYXB0b3IuZ2V0VmFsdWUoKS5nZXRBbHBoYSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBuZXh0RnJhbWUoKTsKKyAgICAgICAgICAgICAgICBjYW52YXMgPSBtb2NrKENhbnZhcy5jbGFzcyk7CisgICAgICAgICAgICAgICAgZWRnZUVmZmVjdC5kcmF3KGNhbnZhcyk7CisgICAgICAgICAgICAgICAgdmVyaWZ5KGNhbnZhcykuZHJhd0NpcmNsZShhbnlGbG9hdCgpLCBhbnlGbG9hdCgpLCBhbnlGbG9hdCgpLCBjYXB0b3IuY2FwdHVyZSgpKTsKKyAgICAgICAgICAgICAgICBpbnQgbmV3QWxwaGEgPSBjYXB0b3IuZ2V0VmFsdWUoKS5nZXRBbHBoYSgpOworICAgICAgICAgICAgICAgIGFscGhhVmVyaWZpZXIudmVyaWZ5KG9sZEFscGhhLCBuZXdBbHBoYSk7CisgICAgICAgICAgICAgICAgb2xkQWxwaGEgPSBuZXdBbHBoYTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CiAgICAgfQogCi0gICAgQExhcmdlVGVzdAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE9uQWJzb3JiKCkgewogICAgICAgICB2ZXJpZnlBbHBoYShlZGdlRWZmZWN0IC0+IHsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy90ZXN0Y2xhc3Nlcy9FeGFjdENhbnZhc1Rlc3RzLmphdmEgYi90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvRXhhY3RDYW52YXNUZXN0cy5qYXZhCmluZGV4IDMwNDMwM2EuLmVhNzRlOGYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy90ZXN0Y2xhc3Nlcy9FeGFjdENhbnZhc1Rlc3RzLmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3Rlc3RjbGFzc2VzL0V4YWN0Q2FudmFzVGVzdHMuamF2YQpAQCAtMjQsOCArMjQsNiBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5OaW5lUGF0Y2hEcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMuUjsKIGltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy5iaXRtYXBjb21wYXJlcnMuQml0bWFwQ29tcGFyZXI7CiBpbXBvcnQgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMuYml0bWFwY29tcGFyZXJzLkV4YWN0Q29tcGFyZXI7CkBAIC0zNSw2ICszMyw5IEBACiBpbXBvcnQgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMuYml0bWFwdmVyaWZpZXJzLlJlY3RWZXJpZmllcjsKIGltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy50ZXN0aW5mcmFzdHJ1Y3R1cmUuQWN0aXZpdHlUZXN0QmFzZTsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKQEAgLTIwNSwxNiArMjA2LDEzIEBACiAgICAgICAgICAgICAgICAgbmV3IFJlY3QoMTAsIDEwLCA4MCwgODApKTsKIAogICAgICAgICBjcmVhdGVUZXN0KCkKLSAgICAgICAgICAgICAgICAvLyBUaGUgYm9yZGVyIG9mIHRoZSBzcXVhcmUgaXMgc29tZWhvdyBibHVycmVkIGluIEhXVUkgT3BlbkdMIGhhcmR3YXJlIG1vZGUgd2l0aAotICAgICAgICAgICAgICAgIC8vIHBpY3R1cmUgcmVjb3JkaW5nL3BsYXliYWNrLiBNYXliZSB0aGlzIGlzIHJlbGF0ZWQgdG8gYnVnOjMxNDU2OTY3Ci0gICAgICAgICAgICAgICAgLy8gSGVuY2UgZGlzYWJsZSBwaWN0dXJlIG1vZGUgZm9yIG5vdy4KLSAgICAgICAgICAgICAgICAuYWRkQ2FudmFzQ2xpZW50V2l0aG91dFVzaW5nUGljdHVyZSgoY2FudmFzLCB3aWR0aCwgaGVpZ2h0KSAtPiB7CisgICAgICAgICAgICAgICAgLmFkZENhbnZhc0NsaWVudCgoY2FudmFzLCB3aWR0aCwgaGVpZ2h0KSAtPiB7CiAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3Q29sb3IoQ29sb3IuV0hJVEUpOwogICAgICAgICAgICAgICAgICAgICBQYWludCBwID0gbmV3IFBhaW50KCk7CiAgICAgICAgICAgICAgICAgICAgIHAuc2V0Q29sb3IoQ29sb3IuQkxVRSk7CiAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgxMCwgMTAsIDgwLCA4MCwgcCk7CiAgICAgICAgICAgICAgICAgfSkKLSAgICAgICAgICAgICAgICAuYWRkQ2FudmFzQ2xpZW50V2l0aG91dFVzaW5nUGljdHVyZSgKKyAgICAgICAgICAgICAgICAuYWRkQ2FudmFzQ2xpZW50KAogICAgICAgICAgICAgICAgICAgICAgICAgKGNhbnZhcywgd2lkdGgsIGhlaWdodCkgLT4gbmluZVBhdGNoRHJhd2FibGUuZHJhdyhjYW52YXMpKQogICAgICAgICAgICAgICAgIC5hZGRMYXlvdXQoUi5sYXlvdXQuYmx1ZV9wYWRkZWRfc3F1YXJlLCBudWxsKQogICAgICAgICAgICAgICAgIC5ydW5XaXRoVmVyaWZpZXIodmVyaWZpZXIpOwpAQCAtMjQ5LDcgKzI0Nyw3IEBACiAgICAgcHVibGljIHZvaWQgdGVzdFVuY2xpcHBlZFNhdmVMYXllclJvdW5kaW5nKCkgewogICAgICAgICBjcmVhdGVUZXN0KCkKICAgICAgICAgICAgICAgICAuYWRkQ2FudmFzQ2xpZW50KChjYW52YXMsIHdpZHRoLCBoZWlnaHQpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgY2FudmFzLnNhdmVMYXllckFscGhhKDEwLjVmLCAxMC41ZiwgNzkuNWYsIDc5LjVmLCAyNTUsIDApOworICAgICAgICAgICAgICAgICAgICBjYW52YXMuc2F2ZUxheWVyQWxwaGEoMTAuNWYsIDEwLjVmLCA3OS41ZiwgNzkuNWYsIDI1NSk7CiAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgyMCwgMjAsIDcwLCA3MCwgbmV3IFBhaW50KCkpOwogICAgICAgICAgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOwogICAgICAgICAgICAgICAgIH0pCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvRm9udFJlbmRlcmluZ1Rlc3RzLmphdmEgYi90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvRm9udFJlbmRlcmluZ1Rlc3RzLmphdmEKaW5kZXggZWE3NDAzYi4uM2I0ODU0MiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3Rlc3RjbGFzc2VzL0ZvbnRSZW5kZXJpbmdUZXN0cy5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy90ZXN0Y2xhc3Nlcy9Gb250UmVuZGVyaW5nVGVzdHMuamF2YQpAQCAtMjEsMTQgKzIxLDE1IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuVHlwZWZhY2U7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudWlyZW5kZXJpbmcuY3RzLlI7CiBpbXBvcnQgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMuYml0bWFwY29tcGFyZXJzLkJpdG1hcENvbXBhcmVyOwogaW1wb3J0IGFuZHJvaWQudWlyZW5kZXJpbmcuY3RzLmJpdG1hcGNvbXBhcmVycy5NU1NJTUNvbXBhcmVyOwogaW1wb3J0IGFuZHJvaWQudWlyZW5kZXJpbmcuY3RzLmJpdG1hcHZlcmlmaWVycy5Hb2xkZW5JbWFnZVZlcmlmaWVyOwogaW1wb3J0IGFuZHJvaWQudWlyZW5kZXJpbmcuY3RzLnRlc3RpbmZyYXN0cnVjdHVyZS5BY3Rpdml0eVRlc3RCYXNlOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3Rlc3RjbGFzc2VzL0dyYWRpZW50VGVzdHMuamF2YSBiL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy90ZXN0Y2xhc3Nlcy9HcmFkaWVudFRlc3RzLmphdmEKaW5kZXggNGI4YjZiMi4uY2MwMTU5OCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3Rlc3RjbGFzc2VzL0dyYWRpZW50VGVzdHMuamF2YQorKysgYi90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvR3JhZGllbnRUZXN0cy5qYXZhCkBAIC0yMSwxMCArMjEsMTIgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQ7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5TaGFkZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudWlyZW5kZXJpbmcuY3RzLmJpdG1hcHZlcmlmaWVycy5TYW1wbGVQb2ludFZlcmlmaWVyOwogaW1wb3J0IGFuZHJvaWQudWlyZW5kZXJpbmcuY3RzLnRlc3RpbmZyYXN0cnVjdHVyZS5BY3Rpdml0eVRlc3RCYXNlOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3Rlc3RjbGFzc2VzL0hhcmR3YXJlQml0bWFwVGVzdHMuamF2YSBiL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy90ZXN0Y2xhc3Nlcy9IYXJkd2FyZUJpdG1hcFRlc3RzLmphdmEKaW5kZXggMDc2M2U0Yi4uMzFjZTM5NSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3Rlc3RjbGFzc2VzL0hhcmR3YXJlQml0bWFwVGVzdHMuamF2YQorKysgYi90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvSGFyZHdhcmVCaXRtYXBUZXN0cy5qYXZhCkBAIC0xNywzMCArMTcsMzQgQEAKIHBhY2thZ2UgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMudGVzdGNsYXNzZXM7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBSZWdpb25EZWNvZGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3I7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5NYXRyaXg7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBpY3R1cmU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5OaW5lUGF0Y2hEcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy5SOwotCi1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKIGltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy5iaXRtYXBjb21wYXJlcnMuRXhhY3RDb21wYXJlcjsKIGltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy5iaXRtYXBjb21wYXJlcnMuTVNTSU1Db21wYXJlcjsKIGltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy5iaXRtYXB2ZXJpZmllcnMuR29sZGVuSW1hZ2VWZXJpZmllcjsKK2ltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy5iaXRtYXB2ZXJpZmllcnMuUmVjdFZlcmlmaWVyOwogaW1wb3J0IGFuZHJvaWQudWlyZW5kZXJpbmcuY3RzLnRlc3RpbmZyYXN0cnVjdHVyZS5BY3Rpdml0eVRlc3RCYXNlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKQEAgLTcxLDcgKzc1LDcgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdERlY29kZVJlc291cmNlKCkgewotICAgICAgICBjcmVhdGVUZXN0KCkuYWRkQ2FudmFzQ2xpZW50V2l0aG91dFVzaW5nUGljdHVyZSgoY2FudmFzLCB3aWR0aCwgaGVpZ2h0KSAtPiB7CisgICAgICAgIGNyZWF0ZVRlc3QoKS5hZGRDYW52YXNDbGllbnQoKGNhbnZhcywgd2lkdGgsIGhlaWdodCkgLT4gewogICAgICAgICAgICAgQml0bWFwIGhhcmR3YXJlQml0bWFwID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShtUmVzLCBSLmRyYXdhYmxlLnJvYm90LAogICAgICAgICAgICAgICAgICAgICBIQVJEV0FSRV9PUFRJT05TKTsKICAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKGhhcmR3YXJlQml0bWFwLCAwLCAwLCBuZXcgUGFpbnQoKSk7CkBAIC04MCwxMCArODQsOTIgQEAKICAgICB9CiAKICAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVGcm9tUGljdHVyZSgpIHsKKyAgICAgICAgZmluYWwgUmVjdCByZWN0ID0gbmV3IFJlY3QoMTAsIDEwLCA4MCwgODApOworICAgICAgICBQaWN0dXJlIHBpY3R1cmUgPSBuZXcgUGljdHVyZSgpOworICAgICAgICB7CisgICAgICAgICAgICBDYW52YXMgY2FudmFzID0gcGljdHVyZS5iZWdpblJlY29yZGluZyhURVNUX1dJRFRILCBURVNUX0hFSUdIVCk7CisgICAgICAgICAgICBQYWludCBwID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBwLnNldEFudGlBbGlhcyhmYWxzZSk7CisgICAgICAgICAgICBwLnNldENvbG9yKENvbG9yLkJMVUUpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KHJlY3QsIHApOworICAgICAgICAgICAgcGljdHVyZS5lbmRSZWNvcmRpbmcoKTsKKyAgICAgICAgfQorICAgICAgICBCaXRtYXAgaGFyZHdhcmVCaXRtYXAgPSBCaXRtYXAuY3JlYXRlQml0bWFwKHBpY3R1cmUpOworICAgICAgICBhc3NlcnRFcXVhbHMoVEVTVF9XSURUSCwgaGFyZHdhcmVCaXRtYXAuZ2V0V2lkdGgoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhURVNUX0hFSUdIVCwgaGFyZHdhcmVCaXRtYXAuZ2V0SGVpZ2h0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoQml0bWFwLkNvbmZpZy5IQVJEV0FSRSwgaGFyZHdhcmVCaXRtYXAuZ2V0Q29uZmlnKCkpOworICAgICAgICBjcmVhdGVUZXN0KCkuYWRkQ2FudmFzQ2xpZW50KChjYW52YXMsIHdpZHRoLCBoZWlnaHQpIC0+IHsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKGhhcmR3YXJlQml0bWFwLCAwLCAwLCBudWxsKTsKKyAgICAgICAgfSwgdHJ1ZSkucnVuV2l0aFZlcmlmaWVyKG5ldyBSZWN0VmVyaWZpZXIoQ29sb3IuV0hJVEUsIENvbG9yLkJMVUUsIHJlY3QpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkYmFja1Rocm91Z2hQaWN0dXJlKCkgeworICAgICAgICBCaXRtYXAgaGFyZHdhcmVCaXRtYXAgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKG1SZXMsIFIuZHJhd2FibGUucm9ib3QsCisgICAgICAgICAgICAgICAgSEFSRFdBUkVfT1BUSU9OUyk7CisgICAgICAgIGFzc2VydEVxdWFscyhCaXRtYXAuQ29uZmlnLkhBUkRXQVJFLCBoYXJkd2FyZUJpdG1hcC5nZXRDb25maWcoKSk7CisgICAgICAgIFBpY3R1cmUgcGljdHVyZSA9IG5ldyBQaWN0dXJlKCk7CisgICAgICAgIHsKKyAgICAgICAgICAgIENhbnZhcyBjYW52YXMgPSBwaWN0dXJlLmJlZ2luUmVjb3JkaW5nKFRFU1RfV0lEVEgsIFRFU1RfSEVJR0hUKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Q29sb3IoQ29sb3IuV0hJVEUpOworICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAoaGFyZHdhcmVCaXRtYXAsIDAsIDAsIG51bGwpOworICAgICAgICAgICAgcGljdHVyZS5lbmRSZWNvcmRpbmcoKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKHBpY3R1cmUucmVxdWlyZXNIYXJkd2FyZUFjY2VsZXJhdGlvbigpKTsKKyAgICAgICAgQml0bWFwIHJlc3VsdCA9IEJpdG1hcC5jcmVhdGVCaXRtYXAocGljdHVyZSwgcGljdHVyZS5nZXRXaWR0aCgpLCBwaWN0dXJlLmdldEhlaWdodCgpLAorICAgICAgICAgICAgICAgIEJpdG1hcC5Db25maWcuQVJHQl84ODg4KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShuZXcgR29sZGVuSW1hZ2VWZXJpZmllcihnZXRBY3Rpdml0eSgpLAorICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuZ29sZGVuX3JvYm90LCBuZXcgTVNTSU1Db21wYXJlcigwLjk1KSkudmVyaWZ5KHJlc3VsdCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRiYWNrVGhyb3VnaFBpY3R1cmVOb0VuZFJlY29yZGluZygpIHsKKyAgICAgICAgLy8gRXhhY3Qgc2FtZSB0ZXN0IGFzICN0ZXN0UmVhZGJhY2tUaHJvdWdoUGljdHVyZSBidXQgd2l0aCBhbiBvbWl0dGVkIGVuZFJlY29yZGluZworICAgICAgICBCaXRtYXAgaGFyZHdhcmVCaXRtYXAgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKG1SZXMsIFIuZHJhd2FibGUucm9ib3QsCisgICAgICAgICAgICAgICAgSEFSRFdBUkVfT1BUSU9OUyk7CisgICAgICAgIGFzc2VydEVxdWFscyhCaXRtYXAuQ29uZmlnLkhBUkRXQVJFLCBoYXJkd2FyZUJpdG1hcC5nZXRDb25maWcoKSk7CisgICAgICAgIFBpY3R1cmUgcGljdHVyZSA9IG5ldyBQaWN0dXJlKCk7CisgICAgICAgIHsKKyAgICAgICAgICAgIENhbnZhcyBjYW52YXMgPSBwaWN0dXJlLmJlZ2luUmVjb3JkaW5nKFRFU1RfV0lEVEgsIFRFU1RfSEVJR0hUKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Q29sb3IoQ29sb3IuV0hJVEUpOworICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAoaGFyZHdhcmVCaXRtYXAsIDAsIDAsIG51bGwpOworICAgICAgICB9CisgICAgICAgIC8vIEl0IHdpbGwgYmUgdHJ1ZSwgYnV0IGFzIGVuZFJlY29yZGluZyBoYXNuJ3QgYmVlbiBjYWxsZWQgeWV0IGl0J3Mgc3RpbGwgaW4gdGhlCisgICAgICAgIC8vICJmYWxzZSIgc3RhdGUgZnJvbSBiZWdpblJlY29yZGluZygpCisgICAgICAgIGFzc2VydEZhbHNlKHBpY3R1cmUucmVxdWlyZXNIYXJkd2FyZUFjY2VsZXJhdGlvbigpKTsKKyAgICAgICAgQml0bWFwIHJlc3VsdCA9IEJpdG1hcC5jcmVhdGVCaXRtYXAocGljdHVyZSwgcGljdHVyZS5nZXRXaWR0aCgpLCBwaWN0dXJlLmdldEhlaWdodCgpLAorICAgICAgICAgICAgICAgIEJpdG1hcC5Db25maWcuQVJHQl84ODg4KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShuZXcgR29sZGVuSW1hZ2VWZXJpZmllcihnZXRBY3Rpdml0eSgpLAorICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuZ29sZGVuX3JvYm90LCBuZXcgTVNTSU1Db21wYXJlcigwLjk1KSkudmVyaWZ5KHJlc3VsdCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVNjYWxlZEJpdG1hcEZyb21QaWN0dXJlKCkgeworICAgICAgICBQaWN0dXJlIHBpY3R1cmUgPSBuZXcgUGljdHVyZSgpOworICAgICAgICB7CisgICAgICAgICAgICBCaXRtYXAgYml0bWFwID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShtUmVzLCBSLmRyYXdhYmxlLnJvYm90LCBIQVJEV0FSRV9PUFRJT05TKTsKKyAgICAgICAgICAgIENhbnZhcyBjYW52YXMgPSBwaWN0dXJlLmJlZ2luUmVjb3JkaW5nKGJpdG1hcC5nZXRXaWR0aCgpLCBiaXRtYXAuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgUGFpbnQgcGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIHBhaW50LnNldEZpbHRlckJpdG1hcCh0cnVlKTsKKyAgICAgICAgICAgIHBhaW50LnNldEFudGlBbGlhcyh0cnVlKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKGJpdG1hcCwgMCwgMCwgcGFpbnQpOworICAgICAgICAgICAgcGljdHVyZS5lbmRSZWNvcmRpbmcoKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKHBpY3R1cmUucmVxdWlyZXNIYXJkd2FyZUFjY2VsZXJhdGlvbigpKTsKKyAgICAgICAgQml0bWFwIHNjYWxlZCA9IEJpdG1hcC5jcmVhdGVCaXRtYXAocGljdHVyZSwgMjQsIDI0LCBCaXRtYXAuQ29uZmlnLkhBUkRXQVJFKTsKKyAgICAgICAgY3JlYXRlVGVzdCgpLmFkZENhbnZhc0NsaWVudCgoY2FudmFzLCB3aWR0aCwgaGVpZ2h0KSAtPiB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoQml0bWFwLkNvbmZpZy5IQVJEV0FSRSwgc2NhbGVkLmdldENvbmZpZygpKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKHNjYWxlZCwgMCwgMCwgbnVsbCk7CisgICAgICAgIH0sIHRydWUpLnJ1bldpdGhWZXJpZmllcihuZXcgR29sZGVuSW1hZ2VWZXJpZmllcihnZXRBY3Rpdml0eSgpLAorICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuZ29sZGVuX2hhcmR3YXJldGVzdF9jcmVhdGVfc2NhbGVkLCBuZXcgTVNTSU1Db21wYXJlcigwLjkpKSk7CisgICAgfQorCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Qml0bWFwUmVnaW9uRGVjb2RlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBtUmVzLm9wZW5SYXdSZXNvdXJjZShSLmRyYXdhYmxlLnJvYm90KTsKICAgICAgICAgQml0bWFwUmVnaW9uRGVjb2RlciBkZWNvZGVyID0gQml0bWFwUmVnaW9uRGVjb2Rlci5uZXdJbnN0YW5jZShpbnB1dFN0cmVhbSwgZmFsc2UpOwotICAgICAgICBjcmVhdGVUZXN0KCkuYWRkQ2FudmFzQ2xpZW50V2l0aG91dFVzaW5nUGljdHVyZSgoY2FudmFzLCB3aWR0aCwgaGVpZ2h0KSAtPiB7CisgICAgICAgIGNyZWF0ZVRlc3QoKS5hZGRDYW52YXNDbGllbnQoKGNhbnZhcywgd2lkdGgsIGhlaWdodCkgLT4gewogICAgICAgICAgICAgQml0bWFwIGhhcmR3YXJlQml0bWFwID0gZGVjb2Rlci5kZWNvZGVSZWdpb24obmV3IFJlY3QoMTAsIDE1LCAzNCwgMzkpLAogICAgICAgICAgICAgICAgICAgICBIQVJEV0FSRV9PUFRJT05TKTsKICAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKGhhcmR3YXJlQml0bWFwLCAwLCAwLCBuZXcgUGFpbnQoKSk7CkBAIC0xMjAsMTEgKzIwNiwxMSBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0RGVuc2l0eSgpIHsKLSAgICAgICAgY3JlYXRlVGVzdCgpLmFkZENhbnZhc0NsaWVudFdpdGhvdXRVc2luZ1BpY3R1cmUoKGNhbnZhcywgd2lkdGgsIGhlaWdodCkgLT4geworICAgICAgICBjcmVhdGVUZXN0KCkuYWRkQ2FudmFzQ2xpZW50KChjYW52YXMsIHdpZHRoLCBoZWlnaHQpIC0+IHsKICAgICAgICAgICAgIEJpdG1hcCBiaXRtYXAgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKG1SZXMsIFIuZHJhd2FibGUucm9ib3QpOwogICAgICAgICAgICAgYml0bWFwLnNldERlbnNpdHkoRGlzcGxheU1ldHJpY3MuREVOU0lUWV9MT1cpOwogICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAoYml0bWFwLCAwLCAwLCBudWxsKTsKLSAgICAgICAgfSwgdHJ1ZSkuYWRkQ2FudmFzQ2xpZW50V2l0aG91dFVzaW5nUGljdHVyZSgoY2FudmFzLCB3aWR0aCwgaGVpZ2h0KSAtPiB7CisgICAgICAgIH0sIHRydWUpLmFkZENhbnZhc0NsaWVudCgoY2FudmFzLCB3aWR0aCwgaGVpZ2h0KSAtPiB7CiAgICAgICAgICAgICBCaXRtYXAgaGFyZHdhcmVCaXRtYXAgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKG1SZXMsIFIuZHJhd2FibGUucm9ib3QsCiAgICAgICAgICAgICAgICAgICAgIEhBUkRXQVJFX09QVElPTlMpOwogICAgICAgICAgICAgaGFyZHdhcmVCaXRtYXAuc2V0RGVuc2l0eShEaXNwbGF5TWV0cmljcy5ERU5TSVRZX0xPVyk7CkBAIC0xMzQsNyArMjIwLDcgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE5pbmVQYXRjaCgpIHsKLSAgICAgICAgY3JlYXRlVGVzdCgpLmFkZENhbnZhc0NsaWVudFdpdGhvdXRVc2luZ1BpY3R1cmUoKGNhbnZhcywgd2lkdGgsIGhlaWdodCkgLT4geworICAgICAgICBjcmVhdGVUZXN0KCkuYWRkQ2FudmFzQ2xpZW50KChjYW52YXMsIHdpZHRoLCBoZWlnaHQpIC0+IHsKICAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gbVJlcy5vcGVuUmF3UmVzb3VyY2UoUi5kcmF3YWJsZS5ibHVlX3BhZGRlZF9zcXVhcmUpOwogICAgICAgICAgICAgTmluZVBhdGNoRHJhd2FibGUgbmluZVBhdGNoID0gKE5pbmVQYXRjaERyYXdhYmxlKSBEcmF3YWJsZS5jcmVhdGVGcm9tUmVzb3VyY2VTdHJlYW0oCiAgICAgICAgICAgICAgICAgICAgIG1SZXMsIG51bGwsIGlzLCBudWxsLCBIQVJEV0FSRV9PUFRJT05TKTsKQEAgLTE1NCw3ICsyNDAsNyBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlU2NhbGVkQml0bWFwKCkgewotICAgICAgICBjcmVhdGVUZXN0KCkuYWRkQ2FudmFzQ2xpZW50V2l0aG91dFVzaW5nUGljdHVyZSgoY2FudmFzLCB3aWR0aCwgaGVpZ2h0KSAtPiB7CisgICAgICAgIGNyZWF0ZVRlc3QoKS5hZGRDYW52YXNDbGllbnQoKGNhbnZhcywgd2lkdGgsIGhlaWdodCkgLT4gewogICAgICAgICAgICAgQml0bWFwIGhhcmR3YXJlQml0bWFwID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShtUmVzLCBSLmRyYXdhYmxlLnJvYm90LAogICAgICAgICAgICAgICAgICAgICBIQVJEV0FSRV9PUFRJT05TKTsKICAgICAgICAgICAgIEJpdG1hcCBzY2FsZWQgPSBCaXRtYXAuY3JlYXRlU2NhbGVkQml0bWFwKGhhcmR3YXJlQml0bWFwLCAyNCwgMjQsIGZhbHNlKTsKQEAgLTE2Niw3ICsyNTIsNyBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlU3Vic2V0Qml0bWFwKCkgewotICAgICAgICBjcmVhdGVUZXN0KCkuYWRkQ2FudmFzQ2xpZW50V2l0aG91dFVzaW5nUGljdHVyZSgoY2FudmFzLCB3aWR0aCwgaGVpZ2h0KSAtPiB7CisgICAgICAgIGNyZWF0ZVRlc3QoKS5hZGRDYW52YXNDbGllbnQoKGNhbnZhcywgd2lkdGgsIGhlaWdodCkgLT4gewogICAgICAgICAgICAgQml0bWFwIGhhcmR3YXJlQml0bWFwID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShtUmVzLCBSLmRyYXdhYmxlLnJvYm90LAogICAgICAgICAgICAgICAgICAgICBIQVJEV0FSRV9PUFRJT05TKTsKICAgICAgICAgICAgIE1hdHJpeCBtYXRyaXggPSBuZXcgTWF0cml4KCk7CkBAIC0xODAsNyArMjY2LDcgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVRyYW5zZm9ybWVkQml0bWFwKCkgewotICAgICAgICBjcmVhdGVUZXN0KCkuYWRkQ2FudmFzQ2xpZW50V2l0aG91dFVzaW5nUGljdHVyZSgoY2FudmFzLCB3aWR0aCwgaGVpZ2h0KSAtPiB7CisgICAgICAgIGNyZWF0ZVRlc3QoKS5hZGRDYW52YXNDbGllbnQoKGNhbnZhcywgd2lkdGgsIGhlaWdodCkgLT4gewogICAgICAgICAgICAgQml0bWFwIGhhcmR3YXJlQml0bWFwID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShtUmVzLCBSLmRyYXdhYmxlLnJvYm90LAogICAgICAgICAgICAgICAgICAgICBIQVJEV0FSRV9PUFRJT05TKTsKICAgICAgICAgICAgIE1hdHJpeCBtYXRyaXggPSBuZXcgTWF0cml4KCk7CkBAIC0xOTIsNyArMjc4LDYgQEAKICAgICAgICAgICAgICAgICBSLmRyYXdhYmxlLmdvbGRlbl9oYXJkd2FyZXRlc3RfY3JlYXRlX3RyYW5zZm9ybWVkLCBuZXcgTVNTSU1Db21wYXJlcigwLjkpKSk7CiAgICAgfQogCi0KICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wcmVzc0hhcmR3YXJlKCkgewogICAgICAgICBCaXRtYXAgaGFyZHdhcmVCaXRtYXAgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKG1SZXMsIFIuZHJhd2FibGUucm9ib3QsCkBAIC0yMDEsMTAgKzI4NiwxMCBAQAogICAgICAgICBhc3NlcnRUcnVlKGhhcmR3YXJlQml0bWFwLmNvbXByZXNzKEJpdG1hcC5Db21wcmVzc0Zvcm1hdC5QTkcsIDUwLCBzdHJlYW0pKTsKICAgICAgICAgQml0bWFwIGRlY29kZWQgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVN0cmVhbSgKICAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oc3RyZWFtLnRvQnl0ZUFycmF5KCkpKTsKLSAgICAgICAgY3JlYXRlVGVzdCgpLmFkZENhbnZhc0NsaWVudFdpdGhvdXRVc2luZ1BpY3R1cmUoKGNhbnZhcywgd2lkdGgsIGhlaWdodCkgLT4geworICAgICAgICBjcmVhdGVUZXN0KCkuYWRkQ2FudmFzQ2xpZW50KChjYW52YXMsIHdpZHRoLCBoZWlnaHQpIC0+IHsKICAgICAgICAgICAgIGNhbnZhcy5kcmF3Q29sb3IoQ29sb3IuQ1lBTik7CiAgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChoYXJkd2FyZUJpdG1hcCwgMCwgMCwgbnVsbCk7Ci0gICAgICAgIH0sIHRydWUpLmFkZENhbnZhc0NsaWVudFdpdGhvdXRVc2luZ1BpY3R1cmUoKGNhbnZhcywgd2lkdGgsIGhlaWdodCkgLT4geworICAgICAgICB9LCB0cnVlKS5hZGRDYW52YXNDbGllbnQoKGNhbnZhcywgd2lkdGgsIGhlaWdodCkgLT4gewogICAgICAgICAgICAgY2FudmFzLmRyYXdDb2xvcihDb2xvci5DWUFOKTsKICAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKGRlY29kZWQsIDAsIDAsIG51bGwpOwogICAgICAgICB9LCB0cnVlKS5ydW5XaXRoQ29tcGFyZXIobmV3IE1TU0lNQ29tcGFyZXIoMC45OSkpOwpAQCAtMjMxLDEwICszMTYsMTAgQEAKICAgICAgICAgQml0bWFwIGJpdG1hcCA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UoZ2V0QWN0aXZpdHkoKS5nZXRSZXNvdXJjZXMoKSwgaWQsIG9wdGlvbnMpOwogICAgICAgICBhc3NlcnRFcXVhbHMoZnJvbSwgYml0bWFwLmdldENvbmZpZygpKTsKIAotICAgICAgICBjcmVhdGVUZXN0KCkuYWRkQ2FudmFzQ2xpZW50V2l0aG91dFVzaW5nUGljdHVyZSgoY2FudmFzLCB3aWR0aCwgaGVpZ2h0KSAtPiB7CisgICAgICAgIGNyZWF0ZVRlc3QoKS5hZGRDYW52YXNDbGllbnQoKGNhbnZhcywgd2lkdGgsIGhlaWdodCkgLT4gewogICAgICAgICAgICAgY2FudmFzLmRyYXdDb2xvcihDb2xvci5DWUFOKTsKICAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKGJpdG1hcCwgMCwgMCwgbnVsbCk7Ci0gICAgICAgIH0sIHRydWUpLmFkZENhbnZhc0NsaWVudFdpdGhvdXRVc2luZ1BpY3R1cmUoKGNhbnZhcywgd2lkdGgsIGhlaWdodCkgLT4geworICAgICAgICB9LCB0cnVlKS5hZGRDYW52YXNDbGllbnQoKGNhbnZhcywgd2lkdGgsIGhlaWdodCkgLT4gewogICAgICAgICAgICAgY2FudmFzLmRyYXdDb2xvcihDb2xvci5DWUFOKTsKICAgICAgICAgICAgIEJpdG1hcCBjb3B5ID0gYml0bWFwLmNvcHkodG8sIGZhbHNlKTsKICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoY29weSk7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvSW5mcmFzdHJ1Y3R1cmVUZXN0cy5qYXZhIGIvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3Rlc3RjbGFzc2VzL0luZnJhc3RydWN0dXJlVGVzdHMuamF2YQppbmRleCBhYmFmOTZlLi4wMDNiOWQzIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvSW5mcmFzdHJ1Y3R1cmVUZXN0cy5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy90ZXN0Y2xhc3Nlcy9JbmZyYXN0cnVjdHVyZVRlc3RzLmphdmEKQEAgLTE4LDkgKzE4LDYgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQ7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTGFyZ2VUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy5SOwogaW1wb3J0IGFuZHJvaWQudWlyZW5kZXJpbmcuY3RzLmJpdG1hcGNvbXBhcmVycy5CaXRtYXBDb21wYXJlcjsKIGltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy5iaXRtYXBjb21wYXJlcnMuTVNTSU1Db21wYXJlcjsKQEAgLTI5LDYgKzI2LDEwIEBACiBpbXBvcnQgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMudGVzdGluZnJhc3RydWN0dXJlLkNhbnZhc0NsaWVudDsKIGltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy50ZXN0aW5mcmFzdHJ1Y3R1cmUuVmlld0luaXRpYWxpemVyOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLkxhcmdlVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvTGF5ZXJUZXN0cy5qYXZhIGIvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3Rlc3RjbGFzc2VzL0xheWVyVGVzdHMuamF2YQppbmRleCBlZDAxMTBhLi5kZWU3ZTQyIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvTGF5ZXJUZXN0cy5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy90ZXN0Y2xhc3Nlcy9MYXllclRlc3RzLmphdmEKQEAgLTE4LDkgKzE4LDggQEAKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIAotaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLk9iamVjdEFuaW1hdG9yOwogaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLlZhbHVlQW5pbWF0b3I7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3I7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvck1hdHJpeDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yTWF0cml4Q29sb3JGaWx0ZXI7CkBAIC0zMCwyMyArMjksMjcgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmY7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmWGZlcm1vZGU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uLk9wOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLkNvbG9ySW50OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTGFyZ2VUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy5SOworaW1wb3J0IGFuZHJvaWQudWlyZW5kZXJpbmcuY3RzLmJpdG1hcGNvbXBhcmVycy5NU1NJTUNvbXBhcmVyOwogaW1wb3J0IGFuZHJvaWQudWlyZW5kZXJpbmcuY3RzLmJpdG1hcHZlcmlmaWVycy5Db2xvckNvdW50VmVyaWZpZXI7CiBpbXBvcnQgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMuYml0bWFwdmVyaWZpZXJzLkNvbG9yVmVyaWZpZXI7CiBpbXBvcnQgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMuYml0bWFwdmVyaWZpZXJzLlJlY3RWZXJpZmllcjsKIGltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy5iaXRtYXB2ZXJpZmllcnMuU2FtcGxlUG9pbnRWZXJpZmllcjsKIGltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy50ZXN0aW5mcmFzdHJ1Y3R1cmUuQWN0aXZpdHlUZXN0QmFzZTsKIGltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy50ZXN0aW5mcmFzdHJ1Y3R1cmUuVmlld0luaXRpYWxpemVyOworaW1wb3J0IGFuZHJvaWQudWlyZW5kZXJpbmcuY3RzLnV0aWwuV2ViVmlld1JlYWR5SGVscGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyOworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CiAKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLkNvbG9ySW50OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5MYXJnZVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCkBAIC0xMDMsNiArMTA2LDUxIEBACiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGF5ZXJQYWludFhmZXJtb2RlV2l0aFNvZnR3YXJlKCkgeworICAgICAgICBjcmVhdGVUZXN0KCkKKyAgICAgICAgICAgICAgICAuYWRkTGF5b3V0KFIubGF5b3V0LnNpbXBsZV9yZWRfbGF5b3V0LCAoVmlld0luaXRpYWxpemVyKSB2aWV3IC0+IHsKKyAgICAgICAgICAgICAgICAgICAgUGFpbnQgcGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgcGFpbnQuc2V0WGZlcm1vZGUobmV3IFBvcnRlckR1ZmZYZmVybW9kZShQb3J0ZXJEdWZmLk1vZGUuQ0xFQVIpKTsKKyAgICAgICAgICAgICAgICAgICAgdmlldy5zZXRMYXllclR5cGUoVmlldy5MQVlFUl9UWVBFX1NPRlRXQVJFLCBwYWludCk7CisgICAgICAgICAgICAgICAgfSwgdHJ1ZSkKKyAgICAgICAgICAgICAgICAucnVuV2l0aFZlcmlmaWVyKG5ldyBDb2xvclZlcmlmaWVyKENvbG9yLlRSQU5TUEFSRU5UKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGF5ZXJQYWludEFscGhhQ2hhbmdlZCgpIHsKKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggZmVuY2UgPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgICAgIGNyZWF0ZVRlc3QoKQorICAgICAgICAgICAgLmFkZExheW91dChSLmxheW91dC5mcmFtZV9sYXlvdXQsIHZpZXcgLT4geworICAgICAgICAgICAgICAgIEZyYW1lTGF5b3V0IHJvb3QgPSAoRnJhbWVMYXlvdXQpIHZpZXcuZmluZFZpZXdCeUlkKFIuaWQuZnJhbWVfbGF5b3V0KTsKKyAgICAgICAgICAgICAgICBWaWV3IGNoaWxkID0gbmV3IFZpZXcodmlldy5nZXRDb250ZXh0KCkpOworICAgICAgICAgICAgICAgIGNoaWxkLnNldExheWVyVHlwZShWaWV3LkxBWUVSX1RZUEVfSEFSRFdBUkUsIG51bGwpOworICAgICAgICAgICAgICAgIGNoaWxkLnNldEFscGhhKDAuMGYpOworICAgICAgICAgICAgICAgIC8vIGFkZCByZW5kZXJpbmcgY29udGVudAorICAgICAgICAgICAgICAgIGNoaWxkLnNldEJhY2tncm91bmRDb2xvcihDb2xvci5SRUQpOworICAgICAgICAgICAgICAgIHJvb3QuYWRkVmlldyhjaGlsZCwgbmV3IEZyYW1lTGF5b3V0LkxheW91dFBhcmFtcyhURVNUX1dJRFRILCBURVNUX0hFSUdIVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdyYXZpdHkuVE9QIHwgR3Jhdml0eS5MRUZUKSk7CisKKyAgICAgICAgICAgICAgICAvLyBQb3N0IG5vbi16ZXJvIGFscGhhIGEgZmV3IGZyYW1lcyBpbiwgc28gdGhhdCB0aGUgaW5pdGlhbCBsYXllciBkcmF3IGNvbXBsZXRlcy4KKyAgICAgICAgICAgICAgICByb290LmdldFZpZXdUcmVlT2JzZXJ2ZXIoKS5hZGRPblByZURyYXdMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBWaWV3VHJlZU9ic2VydmVyLk9uUHJlRHJhd0xpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtRHJhd0NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBvblByZURyYXcoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRHJhd0NvdW50KysgPT0gNSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdC5nZXRDaGlsZEF0KDApLnNldEFscGhhKDEuMDBmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3QuZ2V0Vmlld1RyZWVPYnNlcnZlcigpLnJlbW92ZU9uUHJlRHJhd0xpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdC5wb3N0KGZlbmNlOjpjb3VudERvd24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdC5wb3N0SW52YWxpZGF0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfSwgdHJ1ZSwgZmVuY2UpCisgICAgICAgICAgICAucnVuV2l0aFZlcmlmaWVyKG5ldyBDb2xvclZlcmlmaWVyKENvbG9yLlJFRCkpOworICAgIH0KKworICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdExheWVyUGFpbnRDb2xvckZpbHRlcigpIHsKICAgICAgICAgLy8gUmVkLCBmdWxseSBkZXNhdHVyYXRlZC4gTm90ZSB0aGF0IGl0J3Mgbm90IDI1NS8zIGluIGVhY2ggY2hhbm5lbC4KICAgICAgICAgLy8gU2VlIENvbG9yTWF0cml4I3NldFNhdHVyYXRpb24oKQpAQCAtMTQ1LDI1ICsxOTMsMzAgQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RMYXllckNsZWFyKCkgewogICAgICAgICBWaWV3SW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIgPSBuZXcgVmlld0luaXRpYWxpemVyKCkgewotICAgICAgICAgICAgT2JqZWN0QW5pbWF0b3IgbUFuaW1hdG9yOworICAgICAgICAgICAgVmFsdWVBbmltYXRvciBtQW5pbWF0b3I7CiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemVWaWV3KFZpZXcgdmlldykgewogICAgICAgICAgICAgICAgIEZyYW1lTGF5b3V0IHJvb3QgPSAoRnJhbWVMYXlvdXQpIHZpZXcuZmluZFZpZXdCeUlkKFIuaWQuZnJhbWVfbGF5b3V0KTsKICAgICAgICAgICAgICAgICByb290LnNldEFscGhhKDAuNWYpOwogCi0gICAgICAgICAgICAgICAgVmlldyBjaGlsZCA9IG5ldyBWaWV3KHZpZXcuZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gbmV3IFZpZXcodmlldy5nZXRDb250ZXh0KCkpOwogICAgICAgICAgICAgICAgIGNoaWxkLnNldEJhY2tncm91bmRDb2xvcihDb2xvci5CTFVFKTsKICAgICAgICAgICAgICAgICBjaGlsZC5zZXRUcmFuc2xhdGlvblgoMTApOwotICAgICAgICAgICAgICAgIGNoaWxkLnNldFRyYW5zbGF0aW9uWSgxMCk7CiAgICAgICAgICAgICAgICAgY2hpbGQuc2V0TGF5b3V0UGFyYW1zKAogICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZyYW1lTGF5b3V0LkxheW91dFBhcmFtcyg1MCwgNTApKTsKICAgICAgICAgICAgICAgICBjaGlsZC5zZXRMYXllclR5cGUoVmlldy5MQVlFUl9UWVBFX0hBUkRXQVJFLCBudWxsKTsKICAgICAgICAgICAgICAgICByb290LmFkZFZpZXcoY2hpbGQpOwogCi0gICAgICAgICAgICAgICAgbUFuaW1hdG9yID0gT2JqZWN0QW5pbWF0b3Iub2ZJbnQoY2hpbGQsICJ0cmFuc2xhdGlvblkiLCAwLCAyMCk7CisgICAgICAgICAgICAgICAgbUFuaW1hdG9yID0gVmFsdWVBbmltYXRvci5vZkludCgwLCAyMCk7CiAgICAgICAgICAgICAgICAgbUFuaW1hdG9yLnNldFJlcGVhdE1vZGUoVmFsdWVBbmltYXRvci5SRVZFUlNFKTsKICAgICAgICAgICAgICAgICBtQW5pbWF0b3Iuc2V0UmVwZWF0Q291bnQoVmFsdWVBbmltYXRvci5JTkZJTklURSk7CiAgICAgICAgICAgICAgICAgbUFuaW1hdG9yLnNldER1cmF0aW9uKDIwMCk7CisgICAgICAgICAgICAgICAgbUFuaW1hdG9yLmFkZFVwZGF0ZUxpc3RlbmVyKG5ldyBWYWx1ZUFuaW1hdG9yLkFuaW1hdG9yVXBkYXRlTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblVwZGF0ZShWYWx1ZUFuaW1hdG9yIGFuaW1hdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc2V0VHJhbnNsYXRpb25ZKChJbnRlZ2VyKSBtQW5pbWF0b3IuZ2V0QW5pbWF0ZWRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgIG1BbmltYXRvci5zdGFydCgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgQE92ZXJyaWRlCkBAIC0xNzQsNyArMjI3LDggQEAKIAogICAgICAgICBjcmVhdGVUZXN0KCkKICAgICAgICAgICAgICAgICAuYWRkTGF5b3V0KFIubGF5b3V0LmZyYW1lX2xheW91dCwgaW5pdGlhbGl6ZXIsIHRydWUpCi0gICAgICAgICAgICAgICAgLnJ1bldpdGhBbmltYXRpb25WZXJpZmllcihuZXcgQ29sb3JDb3VudFZlcmlmaWVyKENvbG9yLldISVRFLCA5MCAqIDkwIC0gNTAgKiA1MCkpOworICAgICAgICAgICAgICAgIC5ydW5XaXRoQW5pbWF0aW9uVmVyaWZpZXIobmV3IENvbG9yQ291bnRWZXJpZmllcigKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yLldISVRFLCA5MCAqIDkwIC0gNTAgKiA1MCwgMTApKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMjY3LDcgKzMyMSw3IEBACiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2F2ZUxheWVyQ2xpcHBlZFdpdGhDb2xvckZpbHRlcigpIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2F2ZUxheWVyV2l0aENvbG9yRmlsdGVyKCkgewogICAgICAgICAvLyB2ZXJpZnkgdGhhdCByZW5kZXJlciBjYW4gZHJhdyBuZXN0ZWQgY2xpcHBlZCBsYXllcnMgd2l0aCBjaGFpbmVkIGNvbG9yIGZpbHRlcnMKICAgICAgICAgY3JlYXRlVGVzdCgpCiAgICAgICAgICAgICAuYWRkQ2FudmFzQ2xpZW50KChjYW52YXMsIHdpZHRoLCBoZWlnaHQpIC0+IHsKQEAgLTI4NSw4ICszMzksOCBAQAogICAgICAgICAgICAgICAgIHNlY29uZExheWVyUGFpbnQuc2V0Q29sb3JGaWx0ZXIocmVkVG9CbHVlRmlsdGVyKTsKICAgICAgICAgICAgICAgICAvLyBUaGUgY29sb3IgZmlsdGVycyBhcmUgYXBwbGllZCBzdGFydGluZyBmaXJzdCB3aXRoIHRoZSBpbm5lciBsYXllciBhbmQgdGhlbiB0aGUKICAgICAgICAgICAgICAgICAvLyBvdXRlciBsYXllci4KLSAgICAgICAgICAgICAgICBjYW52YXMuc2F2ZUxheWVyKDQwLCA1LCA4MCwgNzAsIGZpcnN0TGF5ZXJQYWludCwgQ2FudmFzLkNMSVBfVE9fTEFZRVJfU0FWRV9GTEFHKTsKLSAgICAgICAgICAgICAgICBjYW52YXMuc2F2ZUxheWVyKDUsIDQwLCA3MCwgODAsIHNlY29uZExheWVyUGFpbnQsIENhbnZhcy5DTElQX1RPX0xBWUVSX1NBVkVfRkxBRyk7CisgICAgICAgICAgICAgICAgY2FudmFzLnNhdmVMYXllcig0MCwgNSwgODAsIDcwLCBmaXJzdExheWVyUGFpbnQpOworICAgICAgICAgICAgICAgIGNhbnZhcy5zYXZlTGF5ZXIoNSwgNDAsIDcwLCA4MCwgc2Vjb25kTGF5ZXJQYWludCk7CiAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDEwLCAxMCwgNzAsIDcwLCByZWRQYWludCk7CiAgICAgICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKICAgICAgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOwpAQCAtMjk0LDk1ICszNDgsMTUgQEAKICAgICAgICAgICAgIC5ydW5XaXRoVmVyaWZpZXIobmV3IFJlY3RWZXJpZmllcihDb2xvci5XSElURSwgQ29sb3IuR1JFRU4sIG5ldyBSZWN0KDQwLCA0MCwgNzAsIDcwKSkpOwogICAgIH0KIAotICAgIC8vIE5vdGU6IFRoaXMgdGVzdCB3aWxsIGZhaWwgZm9yIFNraWEgcGlwZWxpbmUsIGJ1dCB0aGF0IGlzIE9LLgotICAgIC8vIFRPRE86IGRlbGV0ZSB0aGlzIHRlc3Qgd2hlbiBTa2lhIHBpcGVsaW5lIGlzIGRlZmF1bHQgYW5kIG1vZGlmeSBuZXh0IHRlc3QKLSAgICAvLyB0ZXN0U2F2ZUxheWVyVW5jbGlwcGVkV2l0aENvbG9yRmlsdGVyU1cgdG8gcnVuIGZvciBib3RoIEhXIGFuZCBTVwogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNhdmVMYXllclVuY2xpcHBlZFdpdGhDb2xvckZpbHRlckhXKCkgewotICAgICAgICAvLyB2ZXJpZnkgdGhhdCBIVyBjYW4gZHJhdyBuZXN0ZWQgdW5jbGlwcGVkIGxheWVycyB3aXRoIGNoYWluZWQgY29sb3IgZmlsdGVycwotICAgICAgICBjcmVhdGVUZXN0KCkKLSAgICAgICAgICAgIC5hZGRDYW52YXNDbGllbnQoKGNhbnZhcywgd2lkdGgsIGhlaWdodCkgLT4gewotICAgICAgICAgICAgICAgIFBhaW50IHJlZFBhaW50ID0gbmV3IFBhaW50KCk7Ci0gICAgICAgICAgICAgICAgcmVkUGFpbnQuc2V0Q29sb3IoMHhmZmZmMDAwMCk7Ci0gICAgICAgICAgICAgICAgUGFpbnQgZmlyc3RMYXllclBhaW50ID0gbmV3IFBhaW50KCk7Ci0gICAgICAgICAgICAgICAgZmxvYXRbXSBibHVlVG9HcmVlbk1hdHJpeCA9IG5ldyBmbG9hdFsyMF07Ci0gICAgICAgICAgICAgICAgYmx1ZVRvR3JlZW5NYXRyaXhbN10gPSBibHVlVG9HcmVlbk1hdHJpeFsxOF0gPSAxLjBmOwotICAgICAgICAgICAgICAgIENvbG9yTWF0cml4Q29sb3JGaWx0ZXIgYmx1ZVRvR3JlZW5GaWx0ZXIgPQotICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb2xvck1hdHJpeENvbG9yRmlsdGVyKGJsdWVUb0dyZWVuTWF0cml4KTsKLSAgICAgICAgICAgICAgICBmaXJzdExheWVyUGFpbnQuc2V0Q29sb3JGaWx0ZXIoYmx1ZVRvR3JlZW5GaWx0ZXIpOwotICAgICAgICAgICAgICAgIFBhaW50IHNlY29uZExheWVyUGFpbnQgPSBuZXcgUGFpbnQoKTsKLSAgICAgICAgICAgICAgICBmbG9hdFtdIHJlZFRvQmx1ZU1hdHJpeCA9IG5ldyBmbG9hdFsyMF07Ci0gICAgICAgICAgICAgICAgcmVkVG9CbHVlTWF0cml4WzEwXSA9IHJlZFRvQmx1ZU1hdHJpeFsxOF0gPSAxLjBmOwotICAgICAgICAgICAgICAgIENvbG9yTWF0cml4Q29sb3JGaWx0ZXIgcmVkVG9CbHVlRmlsdGVyID0KLSAgICAgICAgICAgICAgICAgICAgICBuZXcgQ29sb3JNYXRyaXhDb2xvckZpbHRlcihyZWRUb0JsdWVNYXRyaXgpOwotICAgICAgICAgICAgICAgIHNlY29uZExheWVyUGFpbnQuc2V0Q29sb3JGaWx0ZXIocmVkVG9CbHVlRmlsdGVyKTsKLSAgICAgICAgICAgICAgICBjYW52YXMuc2F2ZUxheWVyKDQwLCA1LCA4MCwgNzAsIGZpcnN0TGF5ZXJQYWludCwgMCk7Ci0gICAgICAgICAgICAgICAgY2FudmFzLnNhdmVMYXllcig1LCA0MCwgNzAsIDgwLCBzZWNvbmRMYXllclBhaW50LCAwKTsKLSAgICAgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMTAsIDEwLCA3MCwgNzAsIHJlZFBhaW50KTsKLSAgICAgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOwotICAgICAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7Ci0gICAgICAgICAgICB9LCB0cnVlKQotICAgICAgICAgICAgLy8gSFdVSSBwaXBlbGluZSBkb2VzIG5vdCBzdXBwb3J0IGEgY29sb3IgZmlsdGVyIGZvciB1bmNsaXBwZWQgc2F2ZSBsYXllciBhbmQgZHJhd3MKLSAgICAgICAgICAgIC8vIGFzIGlmIHRoZSBmaWx0ZXIgaXMgbm90IHNldC4KLSAgICAgICAgICAgIC5ydW5XaXRoVmVyaWZpZXIobmV3IFJlY3RWZXJpZmllcihDb2xvci5XSElURSwgQ29sb3IuUkVELCBuZXcgUmVjdCgxMCwgMTAsIDcwLCA3MCkpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTYXZlTGF5ZXJVbmNsaXBwZWRXaXRoQ29sb3JGaWx0ZXJTVygpIHsKLSAgICAgICAgLy8gdmVyaWZ5IHRoYXQgU1cgY2FuIGRyYXcgbmVzdGVkIHVuY2xpcHBlZCBsYXllcnMgd2l0aCBjaGFpbmVkIGNvbG9yIGZpbHRlcnMKLSAgICAgICAgY3JlYXRlVGVzdCgpCi0gICAgICAgICAgICAuYWRkQ2FudmFzQ2xpZW50KChjYW52YXMsIHdpZHRoLCBoZWlnaHQpIC0+IHsKLSAgICAgICAgICAgICAgICBQYWludCByZWRQYWludCA9IG5ldyBQYWludCgpOwotICAgICAgICAgICAgICAgIHJlZFBhaW50LnNldENvbG9yKDB4ZmZmZjAwMDApOwotICAgICAgICAgICAgICAgIFBhaW50IGZpcnN0TGF5ZXJQYWludCA9IG5ldyBQYWludCgpOwotICAgICAgICAgICAgICAgIGZsb2F0W10gYmx1ZVRvR3JlZW5NYXRyaXggPSBuZXcgZmxvYXRbMjBdOwotICAgICAgICAgICAgICAgIGJsdWVUb0dyZWVuTWF0cml4WzddID0gYmx1ZVRvR3JlZW5NYXRyaXhbMThdID0gMS4wZjsKLSAgICAgICAgICAgICAgICBDb2xvck1hdHJpeENvbG9yRmlsdGVyIGJsdWVUb0dyZWVuRmlsdGVyID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IENvbG9yTWF0cml4Q29sb3JGaWx0ZXIoYmx1ZVRvR3JlZW5NYXRyaXgpOwotICAgICAgICAgICAgICAgIGZpcnN0TGF5ZXJQYWludC5zZXRDb2xvckZpbHRlcihibHVlVG9HcmVlbkZpbHRlcik7Ci0gICAgICAgICAgICAgICAgUGFpbnQgc2Vjb25kTGF5ZXJQYWludCA9IG5ldyBQYWludCgpOwotICAgICAgICAgICAgICAgIGZsb2F0W10gcmVkVG9CbHVlTWF0cml4ID0gbmV3IGZsb2F0WzIwXTsKLSAgICAgICAgICAgICAgICByZWRUb0JsdWVNYXRyaXhbMTBdID0gcmVkVG9CbHVlTWF0cml4WzE4XSA9IDEuMGY7Ci0gICAgICAgICAgICAgICAgQ29sb3JNYXRyaXhDb2xvckZpbHRlciByZWRUb0JsdWVGaWx0ZXIgPQotICAgICAgICAgICAgICAgICAgICBuZXcgQ29sb3JNYXRyaXhDb2xvckZpbHRlcihyZWRUb0JsdWVNYXRyaXgpOwotICAgICAgICAgICAgICAgIHNlY29uZExheWVyUGFpbnQuc2V0Q29sb3JGaWx0ZXIocmVkVG9CbHVlRmlsdGVyKTsKLSAgICAgICAgICAgICAgICBjYW52YXMuc2F2ZUxheWVyKDQwLCA1LCA4MCwgNzAsIGZpcnN0TGF5ZXJQYWludCwgMCk7Ci0gICAgICAgICAgICAgICAgY2FudmFzLnNhdmVMYXllcig1LCA0MCwgNzAsIDgwLCBzZWNvbmRMYXllclBhaW50LCAwKTsKLSAgICAgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMTAsIDEwLCA3MCwgNzAsIHJlZFBhaW50KTsKLSAgICAgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOwotICAgICAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7Ci0gICAgICAgICAgICB9LCBmYWxzZSkKLSAgICAgICAgICAgIC5ydW5XaXRoVmVyaWZpZXIobmV3IFNhbXBsZVBvaW50VmVyaWZpZXIoCi0gICAgICAgICAgICAgICAgbmV3IFBvaW50W10gewotICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IG91dHNpZGUgb2YgcmVjdAotICAgICAgICAgICAgICAgICAgICBuZXcgUG9pbnQoOSwgOSksIG5ldyBQb2ludCg3MCwgMTApLCBuZXcgUG9pbnQoMTAsIDcwKSwgbmV3IFBvaW50KDcwLCA3MCksCi0gICAgICAgICAgICAgICAgICAgIC8vIHJlZCByZWN0Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBQb2ludCgxMCwgMTApLCBuZXcgUG9pbnQoMzksIDM5KSwKLSAgICAgICAgICAgICAgICAgICAgLy8gYmxhY2sgcmVjdAotICAgICAgICAgICAgICAgICAgICBuZXcgUG9pbnQoNDAsIDEwKSwgbmV3IFBvaW50KDY5LCAzOSksCi0gICAgICAgICAgICAgICAgICAgIC8vIGJsdWUgcmVjdAotICAgICAgICAgICAgICAgICAgICBuZXcgUG9pbnQoMTAsIDQwKSwgbmV3IFBvaW50KDM5LCA2OSksCi0gICAgICAgICAgICAgICAgICAgIC8vIGdyZWVuIHJlY3QKLSAgICAgICAgICAgICAgICAgICAgbmV3IFBvaW50KDQwLCA0MCksIG5ldyBQb2ludCg2OSwgNjkpLAotICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgbmV3IGludFtdIHsKLSAgICAgICAgICAgICAgICAgICAgQ29sb3IuV0hJVEUsIENvbG9yLldISVRFLCBDb2xvci5XSElURSwgQ29sb3IuV0hJVEUsCi0gICAgICAgICAgICAgICAgICAgIENvbG9yLlJFRCwgQ29sb3IuUkVELAotICAgICAgICAgICAgICAgICAgICBDb2xvci5CTEFDSywgQ29sb3IuQkxBQ0ssCi0gICAgICAgICAgICAgICAgICAgIENvbG9yLkJMVUUsIENvbG9yLkJMVUUsCi0gICAgICAgICAgICAgICAgICAgIENvbG9yLkdSRUVOLCBDb2xvci5HUkVFTiwKLSAgICAgICAgICAgICAgICB9KSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2F2ZUxheWVyQ2xpcHBlZFdpdGhBbHBoYSgpIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2F2ZUxheWVyV2l0aEFscGhhKCkgewogICAgICAgICAvLyB2ZXJpZnkgdGhhdCByZW5kZXJlciBjYW4gZHJhdyBuZXN0ZWQgY2xpcHBlZCBsYXllcnMgd2l0aCBkaWZmZXJlbnQgYWxwaGEKICAgICAgICAgY3JlYXRlVGVzdCgpIC8vIHBpY3R1cmUgbW9kZSBpcyBkaXNhYmxlIGR1ZSB0byBidWc6MzQ4NzEwODkKICAgICAgICAgICAgIC5hZGRDYW52YXNDbGllbnQoKGNhbnZhcywgd2lkdGgsIGhlaWdodCkgLT4gewogICAgICAgICAgICAgICAgIFBhaW50IHJlZFBhaW50ID0gbmV3IFBhaW50KCk7CiAgICAgICAgICAgICAgICAgcmVkUGFpbnQuc2V0Q29sb3IoMHhmZmZmMDAwMCk7Ci0gICAgICAgICAgICAgICAgY2FudmFzLnNhdmVMYXllckFscGhhKDQwLCA1LCA4MCwgNzAsIDB4N2YsIENhbnZhcy5DTElQX1RPX0xBWUVSX1NBVkVfRkxBRyk7Ci0gICAgICAgICAgICAgICAgY2FudmFzLnNhdmVMYXllckFscGhhKDUsIDQwLCA3MCwgODAsIDB4M2YsIENhbnZhcy5DTElQX1RPX0xBWUVSX1NBVkVfRkxBRyk7CisgICAgICAgICAgICAgICAgY2FudmFzLnNhdmVMYXllckFscGhhKDQwLCA1LCA4MCwgNzAsIDB4N2YpOworICAgICAgICAgICAgICAgIGNhbnZhcy5zYXZlTGF5ZXJBbHBoYSg1LCA0MCwgNzAsIDgwLCAweDNmKTsKICAgICAgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMTAsIDEwLCA3MCwgNzAsIHJlZFBhaW50KTsKICAgICAgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOwogICAgICAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CkBAIC0zOTEsNDIgKzM2NSw3IEBACiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2F2ZUxheWVyVW5jbGlwcGVkV2l0aEFscGhhKCkgewotICAgICAgICAvLyB2ZXJpZnkgdGhhdCByZW5kZXJlciBjYW4gZHJhdyBuZXN0ZWQgdW5jbGlwcGVkIGxheWVycyB3aXRoIGRpZmZlcmVudCBhbHBoYQotICAgICAgICBjcmVhdGVUZXN0KCkgLy8gcGljdHVyZSBtb2RlIGlzIGRpc2FibGUgZHVlIHRvIGJ1ZzozNDg3MTA4OQotICAgICAgICAgICAgLmFkZENhbnZhc0NsaWVudCgoY2FudmFzLCB3aWR0aCwgaGVpZ2h0KSAtPiB7Ci0gICAgICAgICAgICAgICAgUGFpbnQgcmVkUGFpbnQgPSBuZXcgUGFpbnQoKTsKLSAgICAgICAgICAgICAgICByZWRQYWludC5zZXRDb2xvcigweGZmZmYwMDAwKTsKLSAgICAgICAgICAgICAgICBjYW52YXMuc2F2ZUxheWVyQWxwaGEoNDAsIDUsIDgwLCA3MCwgMHg3ZiwgMCk7Ci0gICAgICAgICAgICAgICAgY2FudmFzLnNhdmVMYXllckFscGhhKDUsIDQwLCA3MCwgODAsIDB4M2YsIDApOwotICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgxMCwgMTAsIDcwLCA3MCwgcmVkUGFpbnQpOwotICAgICAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7Ci0gICAgICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKLSAgICAgICAgICAgIH0pCi0gICAgICAgICAgICAucnVuV2l0aFZlcmlmaWVyKG5ldyBTYW1wbGVQb2ludFZlcmlmaWVyKAotICAgICAgICAgICAgICAgIG5ldyBQb2ludFtdewotICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IG91dHNpZGUgb2YgcmVjdAotICAgICAgICAgICAgICAgICAgICBuZXcgUG9pbnQoOSwgOSksIG5ldyBQb2ludCg3MCwgMTApLCBuZXcgUG9pbnQoMTAsIDcwKSwgbmV3IFBvaW50KDcwLCA3MCksCi0gICAgICAgICAgICAgICAgICAgIC8vIHJlZCByZWN0IG91dHNpZGUgYm90aCBsYXllcnMKLSAgICAgICAgICAgICAgICAgICAgbmV3IFBvaW50KDEwLCAxMCksIG5ldyBQb2ludCgzOSwgMzkpLAotICAgICAgICAgICAgICAgICAgICAvLyBwaW5rIHJlY3Qgb3ZlcmxhcHBpbmcgb25lIG9mIHRoZSBsYXllcnMKLSAgICAgICAgICAgICAgICAgICAgbmV3IFBvaW50KDQwLCAxMCksIG5ldyBQb2ludCg2OSwgMzkpLAotICAgICAgICAgICAgICAgICAgICAvLyBwaW5rIHJlY3Qgb3ZlcmxhcHBpbmcgb25lIG9mIHRoZSBsYXllcnMKLSAgICAgICAgICAgICAgICAgICAgbmV3IFBvaW50KDEwLCA0MCksIG5ldyBQb2ludCgzOSwgNjkpLAotICAgICAgICAgICAgICAgICAgICAvLyBwaW5rIHJlY3Qgb3ZlcmxhcHBpbmcgYm90aCBsYXllcnMKLSAgICAgICAgICAgICAgICAgICAgbmV3IFBvaW50KDQwLCA0MCksIG5ldyBQb2ludCg2OSwgNjkpLAotICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgbmV3IGludFtdewotICAgICAgICAgICAgICAgICAgICBDb2xvci5XSElURSwgQ29sb3IuV0hJVEUsIENvbG9yLldISVRFLCBDb2xvci5XSElURSwKLSAgICAgICAgICAgICAgICAgICAgQ29sb3IuUkVELCBDb2xvci5SRUQsCi0gICAgICAgICAgICAgICAgICAgIDB4ZmZmZjgwODAsIDB4ZmZmZjgwODAsCi0gICAgICAgICAgICAgICAgICAgIDB4ZmZmZkMwQzAsIDB4ZmZmZkMwQzAsCi0gICAgICAgICAgICAgICAgICAgIDB4ZmZmZkUwRTAsIDB4ZmZmZkUwRTAsCi0gICAgICAgICAgICAgICAgfSkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNhdmVMYXllclVuY2xpcHBlZF9yZXN0b3JlQmVoYXZpb3IoKSB7CisgICAgcHVibGljIHZvaWQgdGVzdFNhdmVMYXllclJlc3RvcmVCZWhhdmlvcigpIHsKICAgICAgICAgY3JlYXRlVGVzdCgpCiAgICAgICAgICAgICAgICAgLmFkZENhbnZhc0NsaWVudCgoY2FudmFzLCB3aWR0aCwgaGVpZ2h0KSAtPiB7CiAgICAgICAgICAgICAgICAgICAgIC8vc2V0IGlkZW50aXR5IG1hdHJpeApAQCAtNDM0LDEwICszNzMsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgY2FudmFzLnNldE1hdHJpeChpZGVudGl0eSk7CiAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFBhaW50IHAgPSBuZXcgUGFpbnQoKTsKIAotICAgICAgICAgICAgICAgICAgICBjYW52YXMuc2F2ZUxheWVyKDAsIDAsIHdpZHRoLCBoZWlnaHQsIHAsIDApOworICAgICAgICAgICAgICAgICAgICBjYW52YXMuc2F2ZUxheWVyKDAsIDAsIHdpZHRoLCBoZWlnaHQsIHApOwogCiAgICAgICAgICAgICAgICAgICAgIC8vY2hhbmdlIG1hdHJpeCBhbmQgY2xpcCB0byBzb21ldGhpbmcgZGlmZmVyZW50Ci0gICAgICAgICAgICAgICAgICAgIGNhbnZhcy5jbGlwUmVjdCgwLCAwLCB3aWR0aCA+PiAxLCBoZWlnaHQgPj4gMSwgT3AuSU5URVJTRUNUKTsKKyAgICAgICAgICAgICAgICAgICAgY2FudmFzLmNsaXBSZWN0KDAsIDAsIHdpZHRoID4+IDEsIGhlaWdodCA+PiAxKTsKICAgICAgICAgICAgICAgICAgICAgTWF0cml4IHNjYWxlZE1hdHJpeCA9IG5ldyBNYXRyaXgoKTsKICAgICAgICAgICAgICAgICAgICAgc2NhbGVkTWF0cml4LnNldFNjYWxlKDQsIDUpOwogICAgICAgICAgICAgICAgICAgICBjYW52YXMuc2V0TWF0cml4KHNjYWxlZE1hdHJpeCk7CkBAIC00NTUsMzMgKzM5NCwyNDcgQEAKICAgICAgICAgICAgICAgICAucnVuV2l0aFZlcmlmaWVyKG5ldyBDb2xvclZlcmlmaWVyKENvbG9yLlJFRCkpOwogICAgIH0KIAorICAgIEBMYXJnZVRlc3QKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTYXZlTGF5ZXJDbGlwcGVkX3Jlc3RvcmVCZWhhdmlvcigpIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2ViVmlld1dpdGhMYXllcigpIHsKKyAgICAgICAgaWYgKCFnZXRBY3Rpdml0eSgpLmdldFBhY2thZ2VNYW5hZ2VyKCkuaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX1dFQlZJRVcpKSB7CisgICAgICAgICAgICByZXR1cm47IC8vIG5vIFdlYlZpZXcgdG8gcnVuIHRlc3Qgb24KKyAgICAgICAgfQorICAgICAgICBDb3VudERvd25MYXRjaCBod0ZlbmNlID0gbmV3IENvdW50RG93bkxhdGNoKDEpOwogICAgICAgICBjcmVhdGVUZXN0KCkKKyAgICAgICAgICAgICAgICAuYWRkTGF5b3V0KFIubGF5b3V0LnRlc3RfY29udGVudF93ZWJ2aWV3LCAoVmlld0luaXRpYWxpemVyKSB2aWV3IC0+IHsKKyAgICAgICAgICAgICAgICAgICAgV2ViVmlldyB3ZWJ2aWV3ID0gdmlldy5yZXF1aXJlVmlld0J5SWQoUi5pZC53ZWJ2aWV3KTsKKyAgICAgICAgICAgICAgICAgICAgV2ViVmlld1JlYWR5SGVscGVyIGhlbHBlciA9IG5ldyBXZWJWaWV3UmVhZHlIZWxwZXIod2VidmlldywgaHdGZW5jZSk7CisgICAgICAgICAgICAgICAgICAgIGhlbHBlci5sb2FkRGF0YSgiPGJvZHkgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOmJsdWVcIj4iKTsKKyAgICAgICAgICAgICAgICAgICAgd2Vidmlldy5zZXRMYXllclR5cGUoVmlldy5MQVlFUl9UWVBFX0hBUkRXQVJFLCBudWxsKTsKKyAgICAgICAgICAgICAgICB9LCB0cnVlLCBod0ZlbmNlKQorICAgICAgICAgICAgICAgIC5ydW5XaXRoVmVyaWZpZXIobmV3IENvbG9yVmVyaWZpZXIoQ29sb3IuQkxVRSkpOworICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJWaWV3V2l0aE9mZnNldExheWVyKCkgeworICAgICAgICBpZiAoIWdldEFjdGl2aXR5KCkuZ2V0UGFja2FnZU1hbmFnZXIoKS5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfV0VCVklFVykpIHsKKyAgICAgICAgICAgIHJldHVybjsgLy8gbm8gV2ViVmlldyB0byBydW4gdGVzdCBvbgorICAgICAgICB9CisgICAgICAgIENvdW50RG93bkxhdGNoIGh3RmVuY2UgPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgICAgIGNyZWF0ZVRlc3QoKQorICAgICAgICAgICAgICAgIC5hZGRMYXlvdXQoUi5sYXlvdXQuZnJhbWVfbGF5b3V0X3dlYnZpZXcsIChWaWV3SW5pdGlhbGl6ZXIpIHZpZXcgLT4geworICAgICAgICAgICAgICAgICAgICBGcmFtZUxheW91dCBsYXlvdXQgPSB2aWV3LnJlcXVpcmVWaWV3QnlJZChSLmlkLmZyYW1lX2xheW91dCk7CisgICAgICAgICAgICAgICAgICAgIGxheW91dC5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3IuUkVEKTsKKworICAgICAgICAgICAgICAgICAgICBXZWJWaWV3IHdlYnZpZXcgPSB2aWV3LnJlcXVpcmVWaWV3QnlJZChSLmlkLndlYnZpZXcpOworICAgICAgICAgICAgICAgICAgICBXZWJWaWV3UmVhZHlIZWxwZXIgaGVscGVyID0gbmV3IFdlYlZpZXdSZWFkeUhlbHBlcih3ZWJ2aWV3LCBod0ZlbmNlKTsKKyAgICAgICAgICAgICAgICAgICAgaGVscGVyLmxvYWREYXRhKCI8Ym9keSBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6Ymx1ZVwiPiIpOworCisgICAgICAgICAgICAgICAgICAgIHdlYnZpZXcuc2V0TGF5ZXJUeXBlKFZpZXcuTEFZRVJfVFlQRV9IQVJEV0FSRSwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIHdlYnZpZXcuc2V0VHJhbnNsYXRpb25YKDEwKTsKKyAgICAgICAgICAgICAgICAgICAgd2Vidmlldy5zZXRUcmFuc2xhdGlvblkoMTApOworICAgICAgICAgICAgICAgICAgICB3ZWJ2aWV3LmdldExheW91dFBhcmFtcygpLndpZHRoID0gVEVTVF9XSURUSCAtIDIwOworICAgICAgICAgICAgICAgICAgICB3ZWJ2aWV3LmdldExheW91dFBhcmFtcygpLmhlaWdodCA9IFRFU1RfSEVJR0hUIC0gMjA7CisgICAgICAgICAgICAgICAgfSwgdHJ1ZSwgaHdGZW5jZSkKKyAgICAgICAgICAgICAgICAucnVuV2l0aFZlcmlmaWVyKG5ldyBSZWN0VmVyaWZpZXIoQ29sb3IuUkVELCBDb2xvci5CTFVFLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJlY3QoMTAsIDEwLCBURVNUX1dJRFRIIC0gMTAsIFRFU1RfSEVJR0hUIC0gMTApKSk7CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdlYlZpZXdXaXRoUGFyZW50TGF5ZXIoKSB7CisgICAgICAgIGlmICghZ2V0QWN0aXZpdHkoKS5nZXRQYWNrYWdlTWFuYWdlcigpLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9XRUJWSUVXKSkgeworICAgICAgICAgICAgcmV0dXJuOyAvLyBubyBXZWJWaWV3IHRvIHJ1biB0ZXN0IG9uCisgICAgICAgIH0KKyAgICAgICAgQ291bnREb3duTGF0Y2ggaHdGZW5jZSA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICAgICAgY3JlYXRlVGVzdCgpCisgICAgICAgICAgICAgICAgLmFkZExheW91dChSLmxheW91dC5mcmFtZV9sYXlvdXRfd2VidmlldywgKFZpZXdJbml0aWFsaXplcikgdmlldyAtPiB7CisgICAgICAgICAgICAgICAgICAgIEZyYW1lTGF5b3V0IGxheW91dCA9IHZpZXcucmVxdWlyZVZpZXdCeUlkKFIuaWQuZnJhbWVfbGF5b3V0KTsKKyAgICAgICAgICAgICAgICAgICAgbGF5b3V0LnNldEJhY2tncm91bmRDb2xvcihDb2xvci5SRUQpOworICAgICAgICAgICAgICAgICAgICBsYXlvdXQuc2V0TGF5ZXJUeXBlKFZpZXcuTEFZRVJfVFlQRV9IQVJEV0FSRSwgbnVsbCk7CisKKyAgICAgICAgICAgICAgICAgICAgV2ViVmlldyB3ZWJ2aWV3ID0gdmlldy5yZXF1aXJlVmlld0J5SWQoUi5pZC53ZWJ2aWV3KTsKKyAgICAgICAgICAgICAgICAgICAgV2ViVmlld1JlYWR5SGVscGVyIGhlbHBlciA9IG5ldyBXZWJWaWV3UmVhZHlIZWxwZXIod2VidmlldywgaHdGZW5jZSk7CisgICAgICAgICAgICAgICAgICAgIGhlbHBlci5sb2FkRGF0YSgiPGJvZHkgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOmJsdWVcIj4iKTsKKworICAgICAgICAgICAgICAgICAgICB3ZWJ2aWV3LnNldFRyYW5zbGF0aW9uWCgxMCk7CisgICAgICAgICAgICAgICAgICAgIHdlYnZpZXcuc2V0VHJhbnNsYXRpb25ZKDEwKTsKKyAgICAgICAgICAgICAgICAgICAgd2Vidmlldy5nZXRMYXlvdXRQYXJhbXMoKS53aWR0aCA9IFRFU1RfV0lEVEggLSAyMDsKKyAgICAgICAgICAgICAgICAgICAgd2Vidmlldy5nZXRMYXlvdXRQYXJhbXMoKS5oZWlnaHQgPSBURVNUX0hFSUdIVCAtIDIwOworCisgICAgICAgICAgICAgICAgfSwgdHJ1ZSwgaHdGZW5jZSkKKyAgICAgICAgICAgICAgICAucnVuV2l0aFZlcmlmaWVyKG5ldyBSZWN0VmVyaWZpZXIoQ29sb3IuUkVELCBDb2xvci5CTFVFLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJlY3QoMTAsIDEwLCBURVNUX1dJRFRIIC0gMTAsIFRFU1RfSEVJR0hUIC0gMTApKSk7CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdlYlZpZXdTY2FsZWRXaXRoUGFyZW50TGF5ZXIoKSB7CisgICAgICAgIGlmICghZ2V0QWN0aXZpdHkoKS5nZXRQYWNrYWdlTWFuYWdlcigpLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9XRUJWSUVXKSkgeworICAgICAgICAgICAgcmV0dXJuOyAvLyBubyBXZWJWaWV3IHRvIHJ1biB0ZXN0IG9uCisgICAgICAgIH0KKyAgICAgICAgQ291bnREb3duTGF0Y2ggaHdGZW5jZSA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICAgICAgY3JlYXRlVGVzdCgpCisgICAgICAgICAgICAgICAgLmFkZExheW91dChSLmxheW91dC5mcmFtZV9sYXlvdXRfd2VidmlldywgKFZpZXdJbml0aWFsaXplcikgdmlldyAtPiB7CisgICAgICAgICAgICAgICAgICAgIEZyYW1lTGF5b3V0IGxheW91dCA9IHZpZXcucmVxdWlyZVZpZXdCeUlkKFIuaWQuZnJhbWVfbGF5b3V0KTsKKyAgICAgICAgICAgICAgICAgICAgbGF5b3V0LnNldEJhY2tncm91bmRDb2xvcihDb2xvci5SRUQpOworICAgICAgICAgICAgICAgICAgICBsYXlvdXQuc2V0TGF5ZXJUeXBlKFZpZXcuTEFZRVJfVFlQRV9IQVJEV0FSRSwgbnVsbCk7CisKKyAgICAgICAgICAgICAgICAgICAgV2ViVmlldyB3ZWJ2aWV3ID0gdmlldy5yZXF1aXJlVmlld0J5SWQoUi5pZC53ZWJ2aWV3KTsKKyAgICAgICAgICAgICAgICAgICAgV2ViVmlld1JlYWR5SGVscGVyIGhlbHBlciA9IG5ldyBXZWJWaWV3UmVhZHlIZWxwZXIod2VidmlldywgaHdGZW5jZSk7CisgICAgICAgICAgICAgICAgICAgIGhlbHBlci5sb2FkRGF0YSgiPGJvZHkgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOmJsdWVcIj4iKTsKKworICAgICAgICAgICAgICAgICAgICB3ZWJ2aWV3LnNldFRyYW5zbGF0aW9uWCgxMCk7CisgICAgICAgICAgICAgICAgICAgIHdlYnZpZXcuc2V0VHJhbnNsYXRpb25ZKDEwKTsKKyAgICAgICAgICAgICAgICAgICAgd2Vidmlldy5zZXRTY2FsZVgoMC41Zik7CisgICAgICAgICAgICAgICAgICAgIHdlYnZpZXcuZ2V0TGF5b3V0UGFyYW1zKCkud2lkdGggPSA0MDsKKyAgICAgICAgICAgICAgICAgICAgd2Vidmlldy5nZXRMYXlvdXRQYXJhbXMoKS5oZWlnaHQgPSA0MDsKKworICAgICAgICAgICAgICAgIH0sIHRydWUsIGh3RmVuY2UpCisgICAgICAgICAgICAgICAgLnJ1bldpdGhWZXJpZmllcihuZXcgUmVjdFZlcmlmaWVyKENvbG9yLlJFRCwgQ29sb3IuQkxVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSZWN0KDIwLCAxMCwgNDAsIDUwKSkpOworICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJWaWV3V2l0aEFscGhhKCkgeworICAgICAgICBpZiAoIWdldEFjdGl2aXR5KCkuZ2V0UGFja2FnZU1hbmFnZXIoKS5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfV0VCVklFVykpIHsKKyAgICAgICAgICAgIHJldHVybjsgLy8gbm8gV2ViVmlldyB0byBydW4gdGVzdCBvbgorICAgICAgICB9CisgICAgICAgIENvdW50RG93bkxhdGNoIGh3RmVuY2UgPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgICAgIGNyZWF0ZVRlc3QoKQorICAgICAgICAgICAgICAgIC5hZGRMYXlvdXQoUi5sYXlvdXQudGVzdF9jb250ZW50X3dlYnZpZXcsIChWaWV3SW5pdGlhbGl6ZXIpIHZpZXcgLT4geworICAgICAgICAgICAgICAgICAgICBXZWJWaWV3IHdlYnZpZXcgPSB2aWV3LnJlcXVpcmVWaWV3QnlJZChSLmlkLndlYnZpZXcpOworICAgICAgICAgICAgICAgICAgICBXZWJWaWV3UmVhZHlIZWxwZXIgaGVscGVyID0gbmV3IFdlYlZpZXdSZWFkeUhlbHBlcih3ZWJ2aWV3LCBod0ZlbmNlKTsKKyAgICAgICAgICAgICAgICAgICAgaGVscGVyLmxvYWREYXRhKCI8Ym9keSBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6Ymx1ZVwiPiIpOworCisgICAgICAgICAgICAgICAgICAgIC8vIHJlZHVjZSBhbHBoYSBieSA1MCUKKyAgICAgICAgICAgICAgICAgICAgd2Vidmlldy5zZXRBbHBoYSgwLjVmKTsKKworICAgICAgICAgICAgICAgIH0sIHRydWUsIGh3RmVuY2UpCisgICAgICAgICAgICAgICAgLnJ1bldpdGhWZXJpZmllcihuZXcgQ29sb3JWZXJpZmllcihDb2xvci5yZ2IoMTI4LCAxMjgsIDI1NSkpKTsKKyAgICB9CisKKyAgICBATGFyZ2VUZXN0CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2ViVmlld1dpdGhBbHBoYUxheWVyKCkgeworICAgICAgICBpZiAoIWdldEFjdGl2aXR5KCkuZ2V0UGFja2FnZU1hbmFnZXIoKS5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfV0VCVklFVykpIHsKKyAgICAgICAgICAgIHJldHVybjsgLy8gbm8gV2ViVmlldyB0byBydW4gdGVzdCBvbgorICAgICAgICB9CisgICAgICAgIENvdW50RG93bkxhdGNoIGh3RmVuY2UgPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgICAgIGNyZWF0ZVRlc3QoKQorICAgICAgICAgICAgICAgIC5hZGRMYXlvdXQoUi5sYXlvdXQudGVzdF9jb250ZW50X3dlYnZpZXcsIChWaWV3SW5pdGlhbGl6ZXIpIHZpZXcgLT4geworICAgICAgICAgICAgICAgICAgICBXZWJWaWV3IHdlYnZpZXcgPSB2aWV3LnJlcXVpcmVWaWV3QnlJZChSLmlkLndlYnZpZXcpOworICAgICAgICAgICAgICAgICAgICBXZWJWaWV3UmVhZHlIZWxwZXIgaGVscGVyID0gbmV3IFdlYlZpZXdSZWFkeUhlbHBlcih3ZWJ2aWV3LCBod0ZlbmNlKTsKKyAgICAgICAgICAgICAgICAgICAgaGVscGVyLmxvYWREYXRhKCI8Ym9keSBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6Ymx1ZVwiPiIpOworCisgICAgICAgICAgICAgICAgICAgIC8vIHJlZHVjZSBhbHBoYSBieSA1MCUKKyAgICAgICAgICAgICAgICAgICAgUGFpbnQgcGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgcGFpbnQuc2V0QWxwaGEoMTI4KTsKKyAgICAgICAgICAgICAgICAgICAgd2Vidmlldy5zZXRMYXllclR5cGUoVmlldy5MQVlFUl9UWVBFX0hBUkRXQVJFLCBwYWludCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVkdWNlIGFscGhhIGJ5IGFub3RoZXIgNTAlIChlbnN1cmluZyB0d28gYWxwaGFzIGNvbWJpbmUgY29ycmVjdGx5KQorICAgICAgICAgICAgICAgICAgICB3ZWJ2aWV3LnNldEFscGhhKDAuNWYpOworCisgICAgICAgICAgICAgICAgfSwgdHJ1ZSwgaHdGZW5jZSkKKyAgICAgICAgICAgICAgICAucnVuV2l0aFZlcmlmaWVyKG5ldyBDb2xvclZlcmlmaWVyKENvbG9yLnJnYigxOTEsIDE5MSwgMjU1KSkpOworICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBAVGVzdAorICAgIEBJZ25vcmUgLy8gYi8xMDk4Mzk3NTEKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2ViVmlld1dpdGhVbmNsaXBwZWRMYXllcigpIHsKKyAgICAgICAgaWYgKCFnZXRBY3Rpdml0eSgpLmdldFBhY2thZ2VNYW5hZ2VyKCkuaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX1dFQlZJRVcpKSB7CisgICAgICAgICAgICByZXR1cm47IC8vIG5vIFdlYlZpZXcgdG8gcnVuIHRlc3Qgb24KKyAgICAgICAgfQorICAgICAgICBDb3VudERvd25MYXRjaCBod0ZlbmNlID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworICAgICAgICBjcmVhdGVUZXN0KCkKKyAgICAgICAgICAgICAgICAuYWRkTGF5b3V0KFIubGF5b3V0LnRlc3RfY29udGVudF93ZWJ2aWV3LCAoVmlld0luaXRpYWxpemVyKSB2aWV3IC0+IHsKKyAgICAgICAgICAgICAgICAgICAgV2ViVmlldyB3ZWJ2aWV3ID0gdmlldy5yZXF1aXJlVmlld0J5SWQoUi5pZC53ZWJ2aWV3KTsKKyAgICAgICAgICAgICAgICAgICAgV2ViVmlld1JlYWR5SGVscGVyIGhlbHBlciA9IG5ldyBXZWJWaWV3UmVhZHlIZWxwZXIod2VidmlldywgaHdGZW5jZSk7CisgICAgICAgICAgICAgICAgICAgIGhlbHBlci5sb2FkRGF0YSgiPGJvZHkgc3R5bGU9XCJtaW4taGVpZ2h0OiAxMjB2aDsgYmFja2dyb3VuZC1jb2xvcjpibHVlXCI+Iik7CisgICAgICAgICAgICAgICAgICAgIHdlYnZpZXcuc2V0VmVydGljYWxGYWRpbmdFZGdlRW5hYmxlZCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgd2Vidmlldy5zZXRWZXJ0aWNhbFNjcm9sbEJhckVuYWJsZWQoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICB3ZWJ2aWV3LnNldExheWVyVHlwZShWaWV3LkxBWUVSX1RZUEVfSEFSRFdBUkUsIG51bGwpOworCisgICAgICAgICAgICAgICAgfSwgdHJ1ZSwgaHdGZW5jZSkKKyAgICAgICAgICAgICAgICAucnVuV2l0aFZlcmlmaWVyKG5ldyBTYW1wbGVQb2ludFZlcmlmaWVyKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFBvaW50W10geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzb2xpZCBhcmVhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQb2ludCgwLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFBvaW50KDAsIFRFU1RfSEVJR0hUIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhZGUgYXJlYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUG9pbnQoMCwgVEVTVF9IRUlHSFQgLSAxMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQb2ludCgwLCBURVNUX0hFSUdIVCAtIDUpCisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGludFtdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3IuQkxVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3IuV0hJVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZiM2IzZmYsIC8vIHdoaXRlIGJsZW5kZWQgd2l0aCBibHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkYmRiZmYgIC8vIHdoaXRlIGJsZW5kZWQgd2l0aCBibHVlCisgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIEBUZXN0CisgICAgQElnbm9yZSAvLyBiLzEwOTgzOTc1MQorICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJWaWV3V2l0aFVuY2xpcHBlZExheWVyQW5kQ29tcGxleENsaXAoKSB7CisgICAgICAgIGlmICghZ2V0QWN0aXZpdHkoKS5nZXRQYWNrYWdlTWFuYWdlcigpLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9XRUJWSUVXKSkgeworICAgICAgICAgICAgcmV0dXJuOyAvLyBubyBXZWJWaWV3IHRvIHJ1biB0ZXN0IG9uCisgICAgICAgIH0KKyAgICAgICAgQ291bnREb3duTGF0Y2ggaHdGZW5jZSA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICAgICAgY3JlYXRlVGVzdCgpCisgICAgICAgICAgICAgICAgLmFkZExheW91dChSLmxheW91dC5jaXJjbGVfY2xpcHBlZF93ZWJ2aWV3LCAoVmlld0luaXRpYWxpemVyKSB2aWV3IC0+IHsKKyAgICAgICAgICAgICAgICAgICAgV2ViVmlldyB3ZWJ2aWV3ID0gdmlldy5yZXF1aXJlVmlld0J5SWQoUi5pZC53ZWJ2aWV3KTsKKyAgICAgICAgICAgICAgICAgICAgV2ViVmlld1JlYWR5SGVscGVyIGhlbHBlciA9IG5ldyBXZWJWaWV3UmVhZHlIZWxwZXIod2VidmlldywgaHdGZW5jZSk7CisgICAgICAgICAgICAgICAgICAgIGhlbHBlci5sb2FkRGF0YSgiPGJvZHkgc3R5bGU9XCJtaW4taGVpZ2h0OiAxMjB2aDsgYmFja2dyb3VuZC1jb2xvcjpibHVlXCI+Iik7CisgICAgICAgICAgICAgICAgICAgIHdlYnZpZXcuc2V0VmVydGljYWxGYWRpbmdFZGdlRW5hYmxlZCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgd2Vidmlldy5zZXRWZXJ0aWNhbFNjcm9sbEJhckVuYWJsZWQoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICB3ZWJ2aWV3LnNldExheWVyVHlwZShWaWV3LkxBWUVSX1RZUEVfSEFSRFdBUkUsIG51bGwpOworCisgICAgICAgICAgICAgICAgfSwgdHJ1ZSwgaHdGZW5jZSkKKyAgICAgICAgICAgICAgICAucnVuV2l0aFZlcmlmaWVyKG5ldyBTYW1wbGVQb2ludFZlcmlmaWVyKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFBvaW50W10geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzb2xpZCB3aGl0ZSBhcmVhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQb2ludCgwLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFBvaW50KDAsIFRFU1RfSEVJR0hUIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvbGlkIGJsdWUgYXJlYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUG9pbnQoVEVTVF9XSURUSCAvIDIgLCA1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFkZSBhcmVhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQb2ludChURVNUX1dJRFRIIC8gMiwgVEVTVF9IRUlHSFQgLSAxMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQb2ludChURVNUX1dJRFRIIC8gMiwgVEVTVF9IRUlHSFQgLSA1KQorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBpbnRbXSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yLldISVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvci5XSElURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3IuQkxVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmIzYjNmZiwgLy8gd2hpdGUgYmxlbmRlZCB3aXRoIGJsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmRiZGJmZiAgLy8gd2hpdGUgYmxlbmRlZCB3aXRoIGJsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKKyAgICB9CisKKyAgICBATGFyZ2VUZXN0CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2ViVmlld1dpdGhMYXllckFuZENvbXBsZXhDbGlwKCkgeworICAgICAgICBpZiAoIWdldEFjdGl2aXR5KCkuZ2V0UGFja2FnZU1hbmFnZXIoKS5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfV0VCVklFVykpIHsKKyAgICAgICAgICAgIHJldHVybjsgLy8gbm8gV2ViVmlldyB0byBydW4gdGVzdCBvbgorICAgICAgICB9CisgICAgICAgIENvdW50RG93bkxhdGNoIGh3RmVuY2UgPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgICAgIGNyZWF0ZVRlc3QoKQorICAgICAgICAgICAgICAgIC8vIGdvbGRlbiBjbGllbnQgLSBkcmF3IGEgc2ltcGxlIG5vbi1BQSBjaXJjbGUKICAgICAgICAgICAgICAgICAuYWRkQ2FudmFzQ2xpZW50KChjYW52YXMsIHdpZHRoLCBoZWlnaHQpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgLy9zZXQgaWRlbnRpdHkgbWF0cml4Ci0gICAgICAgICAgICAgICAgICAgIE1hdHJpeCBpZGVudGl0eSA9IG5ldyBNYXRyaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgY2FudmFzLnNldE1hdHJpeChpZGVudGl0eSk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFBhaW50IHAgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgUGFpbnQgcGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgcGFpbnQuc2V0QW50aUFsaWFzKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgcGFpbnQuc2V0Q29sb3IoQ29sb3IuQkxVRSk7CisgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3T3ZhbCgwLCAwLCB3aWR0aCwgaGVpZ2h0LCBwYWludCk7CisgICAgICAgICAgICAgICAgfSwgZmFsc2UpCisgICAgICAgICAgICAgICAgLy8gdmVyaWZ5IGFnYWluc3Qgc29saWQgY29sb3Igd2VidmlldywgY2xpcHBlZCB0byBpdHMgcGFyZW50IG92YWwKKyAgICAgICAgICAgICAgICAuYWRkTGF5b3V0KFIubGF5b3V0LmNpcmNsZV9jbGlwcGVkX3dlYnZpZXcsIChWaWV3SW5pdGlhbGl6ZXIpIHZpZXcgLT4geworICAgICAgICAgICAgICAgICAgICBGcmFtZUxheW91dCBsYXlvdXQgPSB2aWV3LnJlcXVpcmVWaWV3QnlJZChSLmlkLmNpcmNsZV9jbGlwX2ZyYW1lX2xheW91dCk7CisgICAgICAgICAgICAgICAgICAgIGxheW91dC5zZXRMYXllclR5cGUoVmlldy5MQVlFUl9UWVBFX0hBUkRXQVJFLCBudWxsKTsKIAotICAgICAgICAgICAgICAgICAgICBjYW52YXMuc2F2ZUxheWVyKDAsIDAsIHdpZHRoLCBoZWlnaHQsIHAsIENhbnZhcy5DTElQX1RPX0xBWUVSX1NBVkVfRkxBRyk7CisgICAgICAgICAgICAgICAgICAgIFdlYlZpZXcgd2VidmlldyA9IHZpZXcucmVxdWlyZVZpZXdCeUlkKFIuaWQud2Vidmlldyk7CisgICAgICAgICAgICAgICAgICAgIFdlYlZpZXdSZWFkeUhlbHBlciBoZWxwZXIgPSBuZXcgV2ViVmlld1JlYWR5SGVscGVyKHdlYnZpZXcsIGh3RmVuY2UpOworICAgICAgICAgICAgICAgICAgICBoZWxwZXIubG9hZERhdGEoIjxib2R5IHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjpibHVlXCI+Iik7CiAKLSAgICAgICAgICAgICAgICAgICAgLy9jaGFuZ2UgbWF0cml4IGFuZCBjbGlwIHRvIHNvbWV0aGluZyBkaWZmZXJlbnQKLSAgICAgICAgICAgICAgICAgICAgY2FudmFzLmNsaXBSZWN0KDAsIDAsIHdpZHRoID4+IDEsIGhlaWdodCA+PiAxLCBPcC5JTlRFUlNFQ1QpOwotICAgICAgICAgICAgICAgICAgICBNYXRyaXggc2NhbGVkTWF0cml4ID0gbmV3IE1hdHJpeCgpOwotICAgICAgICAgICAgICAgICAgICBzY2FsZWRNYXRyaXguc2V0U2NhbGUoNCwgNSk7Ci0gICAgICAgICAgICAgICAgICAgIGNhbnZhcy5zZXRNYXRyaXgoc2NhbGVkTWF0cml4KTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNjYWxlZE1hdHJpeCwgY2FudmFzLmdldE1hdHJpeCgpKTsKLQotICAgICAgICAgICAgICAgICAgICBjYW52YXMuZHJhd0NvbG9yKENvbG9yLkJMVUUpOwotICAgICAgICAgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vY2hlY2sgaWYgaWRlbnRpdHkgbWF0cml4IGlzIHJlc3RvcmVkCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhpZGVudGl0eSwgY2FudmFzLmdldE1hdHJpeCgpKTsKLQotICAgICAgICAgICAgICAgICAgICAvL3Nob3VsZCBkcmF3IHRvIHRoZSBlbnRpcmUgY2FudmFzLCBiZWNhdXNlIGNsaXAgaGFzIGJlZW4gcmVtb3ZlZAotICAgICAgICAgICAgICAgICAgICBjYW52YXMuZHJhd0NvbG9yKENvbG9yLlJFRCk7Ci0gICAgICAgICAgICAgICAgfSkKLSAgICAgICAgICAgICAgICAucnVuV2l0aFZlcmlmaWVyKG5ldyBDb2xvclZlcmlmaWVyKENvbG9yLlJFRCkpOworICAgICAgICAgICAgICAgIH0sIHRydWUsIGh3RmVuY2UpCisgICAgICAgICAgICAgICAgLnJ1bldpdGhDb21wYXJlcihuZXcgTVNTSU1Db21wYXJlcigwLjk1KSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3Rlc3RjbGFzc2VzL0xheW91dFRlc3RzLmphdmEgYi90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvTGF5b3V0VGVzdHMuamF2YQppbmRleCAzZDFjMTBlLi4wMTg3OWYwIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvTGF5b3V0VGVzdHMuamF2YQorKysgYi90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvTGF5b3V0VGVzdHMuamF2YQpAQCAtMTcsMTMgKzE3LDE0IEBACiAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMuUjsKIGltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy5iaXRtYXB2ZXJpZmllcnMuQ29sb3JWZXJpZmllcjsKIGltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy5iaXRtYXB2ZXJpZmllcnMuUmVjdFZlcmlmaWVyOwogaW1wb3J0IGFuZHJvaWQudWlyZW5kZXJpbmcuY3RzLnRlc3RpbmZyYXN0cnVjdHVyZS5BY3Rpdml0eVRlc3RCYXNlOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3Rlc3RjbGFzc2VzL1BhdGhDbGlwcGluZ1Rlc3RzLmphdmEgYi90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvUGF0aENsaXBwaW5nVGVzdHMuamF2YQppbmRleCBkNzg5NzJmLi4zOTYyZjAyIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvUGF0aENsaXBwaW5nVGVzdHMuamF2YQorKysgYi90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvUGF0aENsaXBwaW5nVGVzdHMuamF2YQpAQCAtMjQsOSArMjQsNiBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGF0aDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvaW50OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuVHlwZWZhY2U7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5MYXJnZVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudWlyZW5kZXJpbmcuY3RzLlI7CiBpbXBvcnQgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMuYml0bWFwY29tcGFyZXJzLk1TU0lNQ29tcGFyZXI7CiBpbXBvcnQgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMuYml0bWFwdmVyaWZpZXJzLkdvbGRlbkltYWdlVmVyaWZpZXI7CkBAIC00MCw2ICszNywxMCBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CiBpbXBvcnQgYW5kcm9pZC53ZWJraXQuV2ViVmlldzsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5MYXJnZVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApAQCAtOTYsNyArOTcsNyBAQAogICAgICAgICAgICAgICAgIC5hZGRDYW52YXNDbGllbnQoIlRvcnVzQ2xpcCIsIHNUb3J1c0NsaXBDYW52YXNDbGllbnQpCiAgICAgICAgICAgICAgICAgLmFkZENhbnZhc0NsaWVudCgiVG9ydXNDbGlwT3V0Iiwgc1RvcnVzQ2xpcE91dENhbnZhc0NsaWVudCkKICAgICAgICAgICAgICAgICAucnVuV2l0aFZlcmlmaWVyKG5ldyBHb2xkZW5JbWFnZVZlcmlmaWVyKGdldEFjdGl2aXR5KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBSLmRyYXdhYmxlLnBhdGhjbGlwcGluZ3Rlc3RfdG9ydXMsIG5ldyBNU1NJTUNvbXBhcmVyKDAuOTUpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBSLmRyYXdhYmxlLnBhdGhjbGlwcGluZ3Rlc3RfdG9ydXMsIG5ldyBNU1NJTUNvbXBhcmVyKDAuNjUpKSk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTE2NCw3ICsxNjUsNyBAQAogICAgICAgICAgICAgICAgICAgICB2aWV3LnNldFNjYWxlWCgyKTsKICAgICAgICAgICAgICAgICAgICAgdmlldy5zZXRTY2FsZVkoMik7CiAgICAgICAgICAgICAgICAgfSkKLSAgICAgICAgICAgICAgICAucnVuV2l0aENvbXBhcmVyKG5ldyBNU1NJTUNvbXBhcmVyKDAuOTApKTsKKyAgICAgICAgICAgICAgICAucnVuV2l0aENvbXBhcmVyKG5ldyBNU1NJTUNvbXBhcmVyKDAuODcpKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMjE5LDYgKzIyMCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpbml0Qmx1ZVdlYlZpZXcoaHdGZW5jZSksIHRydWUsIGh3RmVuY2UpCiAgICAgICAgICAgICAgICAgLmFkZExheW91dChSLmxheW91dC5jaXJjbGVfY2xpcHBlZF93ZWJ2aWV3LAogICAgICAgICAgICAgICAgICAgICAgICAgaW5pdEJsdWVXZWJWaWV3KHN3RmVuY2UpLCBmYWxzZSwgc3dGZW5jZSkKLSAgICAgICAgICAgICAgICAucnVuV2l0aENvbXBhcmVyKG5ldyBNU1NJTUNvbXBhcmVyKDAuOTUpKTsKKyAgICAgICAgICAgICAgICAucnVuV2l0aENvbXBhcmVyKG5ldyBNU1NJTUNvbXBhcmVyKDAuOTQpKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvUGF0aFRlc3RzLmphdmEgYi90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvUGF0aFRlc3RzLmphdmEKaW5kZXggNjMyZmY4NS4uZTQ2NzkzZiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3Rlc3RjbGFzc2VzL1BhdGhUZXN0cy5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy90ZXN0Y2xhc3Nlcy9QYXRoVGVzdHMuamF2YQpAQCAtNCwxMyArNCwxNCBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYXRoOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuVHlwZWZhY2U7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudWlyZW5kZXJpbmcuY3RzLlI7CiBpbXBvcnQgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMuYml0bWFwY29tcGFyZXJzLk1TU0lNQ29tcGFyZXI7CiBpbXBvcnQgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMuYml0bWFwdmVyaWZpZXJzLkdvbGRlbkltYWdlVmVyaWZpZXI7CiBpbXBvcnQgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMudGVzdGluZnJhc3RydWN0dXJlLkFjdGl2aXR5VGVzdEJhc2U7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvUGljdHVyZVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy90ZXN0Y2xhc3Nlcy9QaWN0dXJlVGVzdC5qYXZhCmluZGV4IDQ1NGViMmMwLi5iYTkyYTYwIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvUGljdHVyZVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvUGljdHVyZVRlc3QuamF2YQpAQCAtMjEsMTIgKzIxLDEzIEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBpY3R1cmU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy5iaXRtYXB2ZXJpZmllcnMuQ29sb3JWZXJpZmllcjsKIGltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy5iaXRtYXB2ZXJpZmllcnMuUmVjdFZlcmlmaWVyOwogaW1wb3J0IGFuZHJvaWQudWlyZW5kZXJpbmcuY3RzLnRlc3RpbmZyYXN0cnVjdHVyZS5BY3Rpdml0eVRlc3RCYXNlOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3Rlc3RjbGFzc2VzL1JnYmExNmZUZXN0cy5qYXZhIGIvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3Rlc3RjbGFzc2VzL1JnYmExNmZUZXN0cy5qYXZhCmluZGV4IGQ5ZWMyYjUuLjEzZDUyYzggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy90ZXN0Y2xhc3Nlcy9SZ2JhMTZmVGVzdHMuamF2YQorKysgYi90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvUmdiYTE2ZlRlc3RzLmphdmEKQEAgLTI0LDEyICsyNCwxMyBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb2ludDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlNoYWRlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMuUjsKIGltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy5iaXRtYXB2ZXJpZmllcnMuU2FtcGxlUG9pbnRWZXJpZmllcjsKIGltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy50ZXN0aW5mcmFzdHJ1Y3R1cmUuQWN0aXZpdHlUZXN0QmFzZTsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy90ZXN0Y2xhc3Nlcy9TaGFkZXJUZXN0cy5qYXZhIGIvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3Rlc3RjbGFzc2VzL1NoYWRlclRlc3RzLmphdmEKaW5kZXggMjUyODc0ZC4uNjUxYjdmOSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3Rlc3RjbGFzc2VzL1NoYWRlclRlc3RzLmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3Rlc3RjbGFzc2VzL1NoYWRlclRlc3RzLmphdmEKQEAgLTI2LDEzICsyNiwxNCBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJhZGlhbEdyYWRpZW50OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy5iaXRtYXBjb21wYXJlcnMuTVNTSU1Db21wYXJlcjsKIGltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy5iaXRtYXB2ZXJpZmllcnMuQ29sb3JWZXJpZmllcjsKIGltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy50ZXN0aW5mcmFzdHJ1Y3R1cmUuQWN0aXZpdHlUZXN0QmFzZTsKIGltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy50ZXN0aW5mcmFzdHJ1Y3R1cmUuQ2FudmFzQ2xpZW50OwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3Rlc3RjbGFzc2VzL1NoYWRvd1Rlc3RzLmphdmEgYi90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvU2hhZG93VGVzdHMuamF2YQppbmRleCBlNGY5ODA5Li4wMzcyYmEyIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvU2hhZG93VGVzdHMuamF2YQorKysgYi90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvU2hhZG93VGVzdHMuamF2YQpAQCAtMTUsMTQgKzE1LDI0IEBACiAgKi8KIHBhY2thZ2UgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMudGVzdGNsYXNzZXM7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudWlyZW5kZXJpbmcuY3RzLlI7CiBpbXBvcnQgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMuYml0bWFwdmVyaWZpZXJzLlNhbXBsZVBvaW50VmVyaWZpZXI7CiBpbXBvcnQgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMudGVzdGluZnJhc3RydWN0dXJlLkFjdGl2aXR5VGVzdEJhc2U7CiBpbXBvcnQgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMudXRpbC5Db21wYXJlVXRpbHM7CitpbXBvcnQgYW5kcm9pZC51dGlsLlR5cGVkVmFsdWU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRUaGVtZVdyYXBwZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpAQCAtMzEsMjggKzQxLDkgQEAKIEBSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCiBwdWJsaWMgY2xhc3MgU2hhZG93VGVzdHMgZXh0ZW5kcyBBY3Rpdml0eVRlc3RCYXNlIHsKIAotICAgIHByaXZhdGUgY2xhc3MgR3JheVNjYWxlVmVyaWZpZXIgZXh0ZW5kcyBTYW1wbGVQb2ludFZlcmlmaWVyIHsKLSAgICAgICAgcHVibGljIEdyYXlTY2FsZVZlcmlmaWVyKFBvaW50W10gdGVzdFBvaW50cywgaW50W10gZXhwZWN0ZWRDb2xvcnMsIGludCB0b2xlcmFuY2UpIHsKLSAgICAgICAgICAgIHN1cGVyKHRlc3RQb2ludHMsIGV4cGVjdGVkQ29sb3JzLCB0b2xlcmFuY2UpIDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiB2ZXJpZnlQaXhlbChpbnQgY29sb3IsIGludCBleHBlY3RlZENvbG9yKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3VwZXIudmVyaWZ5UGl4ZWwoY29sb3IsIGV4cGVjdGVkQ29sb3IpCi0gICAgICAgICAgICAgICAgICAgICYmIENvbXBhcmVVdGlscy52ZXJpZnlQaXhlbEdyYXlTY2FsZShjb2xvciwgMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTaGFkb3dMYXlvdXQoKSB7Ci0gICAgICAgIGludCBzaGFkb3dDb2xvclZhbHVlID0gMHhEQjsKLSAgICAgICAgLy8gQW5kcm9pZCBUViB0aGVtZSBvdmVycmlkZXMgc2hhZG93IG9wYWNpdHkgdG8gYmUgZGFya2VyLgotICAgICAgICBpZiAoZ2V0QWN0aXZpdHkoKS5nZXRPblR2KCkpIHsKLSAgICAgICAgICAgIHNoYWRvd0NvbG9yVmFsdWUgPSAweEJCOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVXNlIGEgaGlnaGVyIHRocmVzaG9sZCB0aGFuIGRlZmF1bHQgdmFsdWUgKDIwKSwgc2luY2Ugd2UgYWxzbyBkb3VibGUgY2hlY2sgZ3JheSBzY2FsZTsKLSAgICAgICAgR3JheVNjYWxlVmVyaWZpZXIgdmVyaWZpZXIgPSBuZXcgR3JheVNjYWxlVmVyaWZpZXIoCisgICAgcHJpdmF0ZSBzdGF0aWMgU2FtcGxlUG9pbnRWZXJpZmllciBjcmVhdGVWZXJpZmllcihpbnQgZXhwZWN0ZWRDb2xvciwKKyAgICAgICAgICAgIFNhbXBsZVBvaW50VmVyaWZpZXIuVmVyaWZ5UGl4ZWxDb2xvciB2ZXJpZmllcikgeworICAgICAgICByZXR1cm4gU2FtcGxlUG9pbnRWZXJpZmllci5jcmVhdGUoCiAgICAgICAgICAgICAgICAgbmV3IFBvaW50W10gewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmlldyBhcmVhCiAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUG9pbnQoMjUsIDY0KSwKQEAgLTY0LDEzICs1NSw5NiBAQAogICAgICAgICAgICAgICAgIG5ldyBpbnRbXSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvci5XSElURSwKICAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yLldISVRFLAotICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3IucmdiKHNoYWRvd0NvbG9yVmFsdWUsIHNoYWRvd0NvbG9yVmFsdWUsIHNoYWRvd0NvbG9yVmFsdWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3IucmdiKHNoYWRvd0NvbG9yVmFsdWUsIHNoYWRvd0NvbG9yVmFsdWUsIHNoYWRvd0NvbG9yVmFsdWUpLAotICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgNjQpOworICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkQ29sb3IsCisgICAgICAgICAgICAgICAgfSwgU2FtcGxlUG9pbnRWZXJpZmllci5ERUZBVUxUX1RPTEVSQU5DRSwgdmVyaWZpZXIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNoYWRvd1Jlc291cmNlcygpIHsKKyAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0ID0gbmV3IENvbnRleHRUaGVtZVdyYXBwZXIoZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VGFyZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5zdHlsZS5UaGVtZV9NYXRlcmlhbF9MaWdodCk7CisgICAgICAgIGZpbmFsIFJlc291cmNlcyByZXNvdXJjZXMgPSBjb250ZXh0LmdldFJlc291cmNlcygpOworICAgICAgICBmaW5hbCBUeXBlZFZhbHVlIHZhbHVlID0gbmV3IFR5cGVkVmFsdWUoKTsKKworICAgICAgICByZXNvdXJjZXMuZ2V0VmFsdWUoUi5kaW1lbi5leHBlY3RlZF9zcG90X3NoYWRvd19hbHBoYSwgdmFsdWUsIGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFR5cGVkVmFsdWUuVFlQRV9GTE9BVCwgdmFsdWUudHlwZSk7CisgICAgICAgIGZsb2F0IGV4cGVjdGVkU3BvdCA9IHZhbHVlLmdldEZsb2F0KCk7CisKKyAgICAgICAgcmVzb3VyY2VzLmdldFZhbHVlKFIuZGltZW4uZXhwZWN0ZWRfYW1iaWVudF9zaGFkb3dfYWxwaGEsIHZhbHVlLCBmYWxzZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhUeXBlZFZhbHVlLlRZUEVfRkxPQVQsIHZhbHVlLnR5cGUpOworICAgICAgICBmbG9hdCBleHBlY3RlZEFtYmllbnQgPSB2YWx1ZS5nZXRGbG9hdCgpOworCisgICAgICAgIGFzc2VydFRydWUoZXhwZWN0ZWRTcG90ID4gMCk7CisgICAgICAgIGFzc2VydFRydWUoZXhwZWN0ZWRBbWJpZW50ID4gMCk7CisKKyAgICAgICAgVHlwZWRBcnJheSB0eXBlZEFycmF5ID0gY29udGV4dC5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKG5ldyBpbnRbXSB7CisgICAgICAgICAgICAgICAgYW5kcm9pZC5SLmF0dHIuc3BvdFNoYWRvd0FscGhhLAorICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5hdHRyLmFtYmllbnRTaGFkb3dBbHBoYSwKKyAgICAgICAgfSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3BvdCwgdHlwZWRBcnJheS5nZXRGbG9hdCgwLCAwLjBmKSwgMCk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZEFtYmllbnQsIHR5cGVkQXJyYXkuZ2V0RmxvYXQoMSwgMC4wZiksIDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNoYWRvd0xheW91dCgpIHsKKyAgICAgICAgLy8gVXNlIGEgaGlnaGVyIHRocmVzaG9sZCB0aGFuIGRlZmF1bHQgdmFsdWUgKDIwKSwgc2luY2Ugd2UgYWxzbyBkb3VibGUgY2hlY2sgZ3JheSBzY2FsZTsKKyAgICAgICAgU2FtcGxlUG9pbnRWZXJpZmllciB2ZXJpZmllciA9IGNyZWF0ZVZlcmlmaWVyKDB4ZmZlNmU2ZTYsCisgICAgICAgICAgICAgICAgY29sb3IgLT4gQ29tcGFyZVV0aWxzLnZlcmlmeVBpeGVsR3JheVNjYWxlKGNvbG9yLCAxKSk7CiAKICAgICAgICAgY3JlYXRlVGVzdCgpCiAgICAgICAgICAgICAgICAgLmFkZExheW91dChSLmxheW91dC5zaW1wbGVfc2hhZG93X2xheW91dCwgbnVsbCwgdHJ1ZS8qIEhXIG9ubHkgKi8pCiAgICAgICAgICAgICAgICAgLnJ1bldpdGhWZXJpZmllcih2ZXJpZmllcik7CiAgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVkU3BvdFNoYWRvdygpIHsKKyAgICAgICAgU2FtcGxlUG9pbnRWZXJpZmllciB2ZXJpZmllciA9IGNyZWF0ZVZlcmlmaWVyKDB4ZmZmOGU2ZTYsCisgICAgICAgICAgICAgICAgY29sb3IgLT4geworICAgICAgICAgICAgICAgICAgICBpZiAoY29sb3IgPT0gQ29sb3IuV0hJVEUpIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29sb3IucmVkKGNvbG9yKSA+IENvbG9yLmdyZWVuKGNvbG9yKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIENvbG9yLnJlZChjb2xvcikgPiBDb2xvci5ibHVlKGNvbG9yKTsKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICBjcmVhdGVUZXN0KCkKKyAgICAgICAgICAgICAgICAuYWRkTGF5b3V0KFIubGF5b3V0LnNpbXBsZV9zaGFkb3dfbGF5b3V0LCB2aWV3IC0+IHsKKyAgICAgICAgICAgICAgICAgICAgdmlldy5maW5kVmlld0J5SWQoUi5pZC5zaGFkb3dfdmlldykuc2V0T3V0bGluZVNwb3RTaGFkb3dDb2xvcihDb2xvci5SRUQpOworICAgICAgICAgICAgICAgIH0sIHRydWUvKiBIVyBvbmx5ICovKQorICAgICAgICAgICAgICAgIC5ydW5XaXRoVmVyaWZpZXIodmVyaWZpZXIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlZEFtYmllbnRTaGFkb3coKSB7CisgICAgICAgIFNhbXBsZVBvaW50VmVyaWZpZXIgdmVyaWZpZXIgPSBjcmVhdGVWZXJpZmllcigweGZmZWRlNmU2LAorICAgICAgICAgICAgICAgIGNvbG9yIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbG9yID09IENvbG9yLldISVRFKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbG9yLnJlZChjb2xvcikgPiBDb2xvci5ncmVlbihjb2xvcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBDb2xvci5yZWQoY29sb3IpID4gQ29sb3IuYmx1ZShjb2xvcik7CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgY3JlYXRlVGVzdCgpCisgICAgICAgICAgICAgICAgLmFkZExheW91dChSLmxheW91dC5zaW1wbGVfc2hhZG93X2xheW91dCwgdmlldyAtPiB7CisgICAgICAgICAgICAgICAgICAgIHZpZXcuZmluZFZpZXdCeUlkKFIuaWQuc2hhZG93X3ZpZXcpLnNldE91dGxpbmVBbWJpZW50U2hhZG93Q29sb3IoQ29sb3IuUkVEKTsKKyAgICAgICAgICAgICAgICB9LCB0cnVlLyogSFcgb25seSAqLykKKyAgICAgICAgICAgICAgICAucnVuV2l0aFZlcmlmaWVyKHZlcmlmaWVyKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWRBbWJpZW50Qmx1ZVNwb3RTaGFkb3coKSB7CisgICAgICAgIFNhbXBsZVBvaW50VmVyaWZpZXIgdmVyaWZpZXIgPSBjcmVhdGVWZXJpZmllcigweGZmZWRlNmY4LAorICAgICAgICAgICAgICAgIGNvbG9yIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbG9yID09IENvbG9yLldISVRFKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbG9yLnJlZChjb2xvcikgPiBDb2xvci5ncmVlbihjb2xvcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBDb2xvci5ibHVlKGNvbG9yKSA+IENvbG9yLnJlZChjb2xvcik7CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgY3JlYXRlVGVzdCgpCisgICAgICAgICAgICAgICAgLmFkZExheW91dChSLmxheW91dC5zaW1wbGVfc2hhZG93X2xheW91dCwgdmlldyAtPiB7CisgICAgICAgICAgICAgICAgICAgIFZpZXcgc2hhZG93ID0gdmlldy5maW5kVmlld0J5SWQoUi5pZC5zaGFkb3dfdmlldyk7CisgICAgICAgICAgICAgICAgICAgIHNoYWRvdy5zZXRPdXRsaW5lQW1iaWVudFNoYWRvd0NvbG9yKENvbG9yLlJFRCk7CisgICAgICAgICAgICAgICAgICAgIHNoYWRvdy5zZXRPdXRsaW5lU3BvdFNoYWRvd0NvbG9yKENvbG9yLkJMVUUpOworICAgICAgICAgICAgICAgIH0sIHRydWUvKiBIVyBvbmx5ICovKQorICAgICAgICAgICAgICAgIC5ydW5XaXRoVmVyaWZpZXIodmVyaWZpZXIpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy90ZXN0Y2xhc3Nlcy9TaGFwZVRlc3RzLmphdmEgYi90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvU2hhcGVUZXN0cy5qYXZhCmluZGV4IDBiNzA4ZDQuLjY0MjliYmQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy90ZXN0Y2xhc3Nlcy9TaGFwZVRlc3RzLmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3Rlc3RjbGFzc2VzL1NoYXBlVGVzdHMuamF2YQpAQCAtMTYsMTMgKzE2LDE0IEBACiAKIHBhY2thZ2UgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMudGVzdGNsYXNzZXM7CiAKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMuUjsKIGltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy5iaXRtYXBjb21wYXJlcnMuTVNTSU1Db21wYXJlcjsKIGltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy5iaXRtYXB2ZXJpZmllcnMuR29sZGVuSW1hZ2VWZXJpZmllcjsKIGltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy50ZXN0aW5mcmFzdHJ1Y3R1cmUuQWN0aXZpdHlUZXN0QmFzZTsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKQEAgLTM1LDYgKzM2LDYgQEAKICAgICAgICAgICAgICAgICAuYWRkTGF5b3V0KFIubGF5b3V0LmZyYW1lX2xheW91dCwKICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcgLT4gdmlldy5zZXRCYWNrZ3JvdW5kUmVzb3VyY2UoUi5kcmF3YWJsZS5kYXNoZWRfb3ZhbCkpCiAgICAgICAgICAgICAgICAgLnJ1bldpdGhWZXJpZmllcihuZXcgR29sZGVuSW1hZ2VWZXJpZmllcihnZXRBY3Rpdml0eSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5nb2xkZW5fZGFzaGVkX292YWwsIG5ldyBNU1NJTUNvbXBhcmVyKDAuOTkpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBSLmRyYXdhYmxlLmdvbGRlbl9kYXNoZWRfb3ZhbCwgbmV3IE1TU0lNQ29tcGFyZXIoMC45MCkpKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvU3VyZmFjZVZpZXdUZXN0cy5qYXZhIGIvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3Rlc3RjbGFzc2VzL1N1cmZhY2VWaWV3VGVzdHMuamF2YQppbmRleCAxNTNiZjViLi4xZTBjODlmIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvU3VyZmFjZVZpZXdUZXN0cy5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy90ZXN0Y2xhc3Nlcy9TdXJmYWNlVmlld1Rlc3RzLmphdmEKQEAgLTE1LDE4ICsxNSwxMiBAQAogICovCiBwYWNrYWdlIGFuZHJvaWQudWlyZW5kZXJpbmcuY3RzLnRlc3RjbGFzc2VzOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5TeW5jaHJvbm91c1BpeGVsQ29weTsKLQogaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLk9iamVjdEFuaW1hdG9yOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwLkNvbmZpZzsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQ7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTGFyZ2VUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy5SOwogaW1wb3J0IGFuZHJvaWQudWlyZW5kZXJpbmcuY3RzLmJpdG1hcHZlcmlmaWVycy5Db2xvclZlcmlmaWVyOwogaW1wb3J0IGFuZHJvaWQudWlyZW5kZXJpbmcuY3RzLnRlc3RpbmZyYXN0cnVjdHVyZS5BY3Rpdml0eVRlc3RCYXNlOwpAQCAtNDAsNiArMzQsMTEgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkxpbmVhckludGVycG9sYXRvcjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5MYXJnZVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuU3luY2hyb25vdXNQaXhlbENvcHk7CisKIGltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy90ZXN0Y2xhc3Nlcy9Td2VlcFRlc3RzLmphdmEgYi90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvU3dlZXBUZXN0cy5qYXZhCmluZGV4IGZmMGU5YTcuLjdjMjEyMWQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy90ZXN0Y2xhc3Nlcy9Td2VlcFRlc3RzLmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3Rlc3RjbGFzc2VzL1N3ZWVwVGVzdHMuamF2YQpAQCAtMjIsOSArMjIsNiBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTGFyZ2VUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy5iaXRtYXBjb21wYXJlcnMuQml0bWFwQ29tcGFyZXI7CiBpbXBvcnQgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMuYml0bWFwY29tcGFyZXJzLk1TU0lNQ29tcGFyZXI7CiBpbXBvcnQgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMudGVzdGluZnJhc3RydWN0dXJlLkFjdGl2aXR5VGVzdEJhc2U7CkBAIC0zMiw2ICsyOSw5IEBACiBpbXBvcnQgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMudGVzdGluZnJhc3RydWN0dXJlLkRpc3BsYXlNb2RpZmllcjsKIGltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy50ZXN0aW5mcmFzdHJ1Y3R1cmUuUmVzb3VyY2VNb2RpZmllcjsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5MYXJnZVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApAQCAtMTI1LDggKzEyNSw3IEBACiAgICAgICAgICAgICBUZXN0Q2FzZUJ1aWxkZXIgYnVpbGRlciA9IGNyZWF0ZVRlc3QoKTsKICAgICAgICAgICAgIFN0cmluZyBkZWJ1Z1N0cmluZyA9IG1vZGlmaWVyQWNjZXNzb3IuZ2V0RGVidWdTdHJpbmcoKTsKICAgICAgICAgICAgIGlmIChkZWJ1Z1N0cmluZy5jb250YWlucygiYml0bWFwTWVzaCIpKSB7Ci0gICAgICAgICAgICAgICAgLy8gcGljdHVyZSBtb2RlIGlzIGRpc2FibGVkIGR1ZSB0byBidWc6MzQ4NzEwODkKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFkZENhbnZhc0NsaWVudFdpdGhvdXRVc2luZ1BpY3R1cmUoZGVidWdTdHJpbmcsIGNhbnZhc0NsaWVudCk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hZGRDYW52YXNDbGllbnQoZGVidWdTdHJpbmcsIGNhbnZhc0NsaWVudCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkQ2FudmFzQ2xpZW50KGRlYnVnU3RyaW5nLCBjYW52YXNDbGllbnQpOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3Rlc3RjbGFzc2VzL1RleHR1cmVWaWV3VGVzdHMuamF2YSBiL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy90ZXN0Y2xhc3Nlcy9UZXh0dXJlVmlld1Rlc3RzLmphdmEKaW5kZXggMzkyMzU5OC4uZmE4ZjU0YyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3Rlc3RjbGFzc2VzL1RleHR1cmVWaWV3VGVzdHMuamF2YQorKysgYi90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvVGV4dHVyZVZpZXdUZXN0cy5qYXZhCkBAIC0yNSw5ICsyNSw2IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlN1cmZhY2VUZXh0dXJlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLkNvbG9ySW50OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy5SOwogaW1wb3J0IGFuZHJvaWQudWlyZW5kZXJpbmcuY3RzLmJpdG1hcHZlcmlmaWVycy5Db2xvclZlcmlmaWVyOwogaW1wb3J0IGFuZHJvaWQudWlyZW5kZXJpbmcuY3RzLnRlc3RpbmZyYXN0cnVjdHVyZS5BY3Rpdml0eVRlc3RCYXNlOwpAQCAtMzgsNyArMzUsOSBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5UZXh0dXJlVmlldy5TdXJmYWNlVGV4dHVyZUxpc3RlbmVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNkZFRlc3Q7CitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5Db2xvckludDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogCiBpbXBvcnQgb3JnLmp1bml0LkFmdGVyOwogaW1wb3J0IG9yZy5qdW5pdC5BZnRlckNsYXNzOwpAQCAtNDksNyArNDgsNiBAQAogCiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CiAKLUBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjEuNC40L0MtMC0zIikKIEBNZWRpdW1UZXN0CiBAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQogcHVibGljIGNsYXNzIFRleHR1cmVWaWV3VGVzdHMgZXh0ZW5kcyBBY3Rpdml0eVRlc3RCYXNlIHsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy90ZXN0Y2xhc3Nlcy9WZWN0b3JEcmF3YWJsZVNjYWxlVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3Rlc3RjbGFzc2VzL1ZlY3RvckRyYXdhYmxlU2NhbGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM2MmE3OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy90ZXN0Y2xhc3Nlcy9WZWN0b3JEcmF3YWJsZVNjYWxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudWlyZW5kZXJpbmcuY3RzLnRlc3RjbGFzc2VzOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMuUjsKK2ltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy5iaXRtYXBjb21wYXJlcnMuTVNTSU1Db21wYXJlcjsKK2ltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy5iaXRtYXB2ZXJpZmllcnMuR29sZGVuSW1hZ2VWZXJpZmllcjsKK2ltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy50ZXN0aW5mcmFzdHJ1Y3R1cmUuQWN0aXZpdHlUZXN0QmFzZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitATWVkaXVtVGVzdAorcHVibGljIGNsYXNzIFZlY3RvckRyYXdhYmxlU2NhbGVUZXN0IGV4dGVuZHMgQWN0aXZpdHlUZXN0QmFzZSB7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmVjdG9yRHJhd2FibGVJbkltYWdlVmlldygpIHsKKyAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0ID0gZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VGFyZ2V0Q29udGV4dCgpOworICAgICAgICBjcmVhdGVUZXN0KCkKKyAgICAgICAgICAgICAgICAuYWRkTGF5b3V0KFIubGF5b3V0LnZlY3Rvcl9kcmF3YWJsZV9zY2FsZV9sYXlvdXQsIHZpZXctPiB7CisgICAgICAgICAgICAgICAgICAgIHNldHVwSW1hZ2VWaWV3cyh2aWV3KTsKKyAgICAgICAgICAgICAgICB9LCBmYWxzZSAvKiBub3QgSFcgb25seSovKQorICAgICAgICAgICAgICAgIC5ydW5XaXRoVmVyaWZpZXIobmV3IEdvbGRlbkltYWdlVmVyaWZpZXIoY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICBSLmRyYXdhYmxlLnZlY3Rvcl9kcmF3YWJsZV9zY2FsZV9nb2xkZW4sCisgICAgICAgICAgICAgICAgICAgICAgbmV3IE1TU0lNQ29tcGFyZXIoLjg3ZikpKTsKKyAgICB9CisKKyAgICAvLyBTZXR1cCAyIGltYWdldmlld3MsIG9uZSBiaWcgYW5kIG9uZSBzbWFsbC4gVGhlIHB1cnBvc2Ugb2YgdGhpcyB0ZXN0IGlzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZQorICAgIC8vIGltYWdldmlldyB3aXRoIHNtYWxsZXIgc2NhbGUgd2lsbCBub3QgYWZmZWN0IHRoZSBhcHBlYXJhbmNlIGluIHRoZSBpbWFnZXZpZXcgd2l0aCBsYXJnZXIKKyAgICAvLyBzY2FsZS4KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHNldHVwSW1hZ2VWaWV3cyhWaWV3IHZpZXcpIHsKKyAgICAgICAgSW1hZ2VWaWV3IGltYWdlVmlldyA9IChJbWFnZVZpZXcpIHZpZXcuZmluZFZpZXdCeUlkKFIuaWQuaW1hZ2V2aWV3MSk7CisgICAgICAgIGltYWdlVmlldy5zZXRJbWFnZVJlc291cmNlKFIuZHJhd2FibGUudmVjdG9yX2ljb25fY3JlYXRlKTsKKyAgICAgICAgaW1hZ2VWaWV3ID0gKEltYWdlVmlldykgdmlldy5maW5kVmlld0J5SWQoUi5pZC5pbWFnZXZpZXcyKTsKKyAgICAgICAgaW1hZ2VWaWV3LnNldEltYWdlUmVzb3VyY2UoUi5kcmF3YWJsZS52ZWN0b3JfaWNvbl9jcmVhdGUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy90ZXN0Y2xhc3Nlcy9WZWN0b3JEcmF3YWJsZVRlc3RzLmphdmEgYi90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvVmVjdG9yRHJhd2FibGVUZXN0cy5qYXZhCmluZGV4IGZmYjI2M2QuLmU1NDAwNGQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy90ZXN0Y2xhc3Nlcy9WZWN0b3JEcmF3YWJsZVRlc3RzLmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3Rlc3RjbGFzc2VzL1ZlY3RvckRyYXdhYmxlVGVzdHMuamF2YQpAQCAtMTYsMTggKzE2LDMxIEBACiAKIHBhY2thZ2UgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMudGVzdGNsYXNzZXM7CiAKK2ltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvcjsKK2ltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvckxpc3RlbmVyQWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5WYWx1ZUFuaW1hdG9yOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3I7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb2ludDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5WZWN0b3JEcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMuUjsKIGltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy5iaXRtYXB2ZXJpZmllcnMuUmVjdFZlcmlmaWVyOworaW1wb3J0IGFuZHJvaWQudWlyZW5kZXJpbmcuY3RzLmJpdG1hcHZlcmlmaWVycy5TYW1wbGVQb2ludFZlcmlmaWVyOwogaW1wb3J0IGFuZHJvaWQudWlyZW5kZXJpbmcuY3RzLnRlc3RpbmZyYXN0cnVjdHVyZS5BY3Rpdml0eVRlc3RCYXNlOworaW1wb3J0IGFuZHJvaWQudWlyZW5kZXJpbmcuY3RzLnRlc3RpbmZyYXN0cnVjdHVyZS5WaWV3SW5pdGlhbGl6ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CisKIEBNZWRpdW1UZXN0CiBAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQogcHVibGljIGNsYXNzIFZlY3RvckRyYXdhYmxlVGVzdHMgZXh0ZW5kcyBBY3Rpdml0eVRlc3RCYXNlIHsKQEAgLTQ0LDUgKzU3LDk0IEBACiAgICAgICAgICAgICAgICAgLnJ1bldpdGhWZXJpZmllcigKICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSZWN0VmVyaWZpZXIoQ29sb3IuV0hJVEUsIENvbG9yLlJFRCwgbmV3IFJlY3QoMCwgMCwgMjUsIDI1KSkpOwogICAgIH0KKworICAgIGNsYXNzIFZlY3RvckRyYXdhYmxlVmlldyBleHRlbmRzIFZpZXcgeworICAgICAgICBwcml2YXRlIFZlY3RvckRyYXdhYmxlIG1WZDsKKyAgICAgICAgcHJpdmF0ZSBSZWN0IG1WZEJvdW5kczsKKworICAgICAgICBwdWJsaWMgVmVjdG9yRHJhd2FibGVWaWV3KENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgICAgICBtVmQgPSAoVmVjdG9yRHJhd2FibGUpIGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5jaXJjbGUsIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBtVmQuc2V0Qm91bmRzKG1WZEJvdW5kcyk7CisgICAgICAgICAgICBtVmQuZHJhdyhjYW52YXMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VkRTaXplKFJlY3QgdmRCb3VuZHMpIHsKKyAgICAgICAgICAgIG1WZEJvdW5kcyA9IHZkQm91bmRzOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBUaGUgZm9sbG93aW5nIHRlc3QgdmVyaWZpZXMgdGhhdCBWZWN0b3JEcmF3YWJsZS5zZXRCb3VuZHMgaW52YWxpZGF0ZXMgdGhlIGJpdG1hcCBjYWNoZS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkYXRlQ2FjaGUoKSB7CisgICAgICAgIENvdW50RG93bkxhdGNoIHRlc3RGaW5pc2hlZEZlbmNlID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworCisgICAgICAgIFZpZXdJbml0aWFsaXplciBpbml0aWFsaXplciA9IG5ldyBWaWV3SW5pdGlhbGl6ZXIoKSB7CisgICAgICAgICAgICBWYWx1ZUFuaW1hdG9yIG1BbmltYXRvcjsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplVmlldyhWaWV3IHZpZXcpIHsKKyAgICAgICAgICAgICAgICBGcmFtZUxheW91dCByb290ID0gKEZyYW1lTGF5b3V0KSB2aWV3LmZpbmRWaWV3QnlJZChSLmlkLmZyYW1lX2xheW91dCk7CisgICAgICAgICAgICAgICAgcm9vdC5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3IuQkxVRSk7CisKKyAgICAgICAgICAgICAgICBmaW5hbCBWZWN0b3JEcmF3YWJsZVZpZXcgY2hpbGQgPSBuZXcgVmVjdG9yRHJhd2FibGVWaWV3KHZpZXcuZ2V0Q29udGV4dCgpKTsKKworICAgICAgICAgICAgICAgIGNoaWxkLnNldExheW91dFBhcmFtcyhuZXcgRnJhbWVMYXlvdXQuTGF5b3V0UGFyYW1zKEFjdGl2aXR5VGVzdEJhc2UuVEVTVF9XSURUSCwKKyAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlUZXN0QmFzZS5URVNUX0hFSUdIVCkpOworICAgICAgICAgICAgICAgIC8vIFZlY3RvckRyYXdhYmxlIGlzIGEgcmVkIGNpcmNsZSBkcmF3biBvbiB0b3Agb2YgYSBibHVlIGJhY2tncm91bmQuCisgICAgICAgICAgICAgICAgLy8gVGhlIGZpcnN0IGZyYW1lIGhhcyBWZWN0b3JEcmF3YWJsZSBzaXplIHNldCB0byAxeDEgcGl4ZWxzLCB3aGljaCBkZWZvcm1zCisgICAgICAgICAgICAgICAgLy8gdGhlIHJlZCBjaXJjbGUgaW50byBhIDF4MSByZWQtaXNoIHNxdWFyZS4KKyAgICAgICAgICAgICAgICAvLyBBbiBhbmltYXRpb24gZ3Jvd3MgVmVjdG9yRHJhd2FibGUgYm91bmRzIGZyb20gMHgwIHRvIDkweDkwLiBJZiBWRCBjYWNoZSBpcworICAgICAgICAgICAgICAgIC8vIHJlZnJlc2hlZCwgdGhlbiB3ZSBzaG91bGQgc2VlIGEgcmVkIGNpcmNsZSBvbiB0b3Agb2YgYSBibHVlIGJhY2tncm91bmQuCisgICAgICAgICAgICAgICAgLy8gSWYgVkQgY2FjaGUgaXMgc3RhbGUsIHRoZW4gVkQgd2lsbCB1cHNjYWxlIHRoZSBvcmlnaW5hbCAxeDEgY2FjaGVkIGltYWdlIHRvCisgICAgICAgICAgICAgICAgLy8gOTB4OTAgcmVkLWlzaCBzcXVhcmUuCisgICAgICAgICAgICAgICAgLy8gQXQgdGhlIGVuZCBvZiB0aGUgYW5pbWF0aW9uLCB3ZSB2ZXJpZnkgdGhlIGNvbG9yIG9mIHRvcCBsZWZ0IHBpeGVsLCB3aGljaCBzaG91bGQKKyAgICAgICAgICAgICAgICAvLyBiZSBhIGJsdWUgYmFja2dyb3VuZCBwaXhlbC4KKyAgICAgICAgICAgICAgICBjaGlsZC5zZXRWRFNpemUobmV3IFJlY3QoMCwgMCwgMiwgMikpOyAvL2ZpcnN0IGRyYXcgd2l0aCBWRCBzaXplIHNldCB0byAxeDEgcGl4ZWxzLgorICAgICAgICAgICAgICAgIHJvb3QuYWRkVmlldyhjaGlsZCk7CisKKyAgICAgICAgICAgICAgICBtQW5pbWF0b3IgPSBWYWx1ZUFuaW1hdG9yLm9mRmxvYXQoMCwgMSk7CisgICAgICAgICAgICAgICAgbUFuaW1hdG9yLnNldFJlcGVhdENvdW50KDApOworICAgICAgICAgICAgICAgIG1BbmltYXRvci5zZXREdXJhdGlvbig0MDApOworICAgICAgICAgICAgICAgIG1BbmltYXRvci5hZGRVcGRhdGVMaXN0ZW5lcihuZXcgVmFsdWVBbmltYXRvci5BbmltYXRvclVwZGF0ZUxpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25VcGRhdGUoVmFsdWVBbmltYXRvciBhbmltYXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHByb2dyZXNzID0gKGZsb2F0KSBtQW5pbWF0b3IuZ2V0QW5pbWF0ZWRWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc2V0VkRTaXplKG5ldyBSZWN0KDAsIDAsIChpbnQpKHByb2dyZXNzKmNoaWxkLmdldFdpZHRoKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShwcm9ncmVzcypjaGlsZC5nZXRIZWlnaHQoKSkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIG1BbmltYXRvci5hZGRMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICAgICAgbmV3IEFuaW1hdG9yTGlzdGVuZXJBZGFwdGVyKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkVuZChBbmltYXRvciBhbmltYXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBlci5vbkFuaW1hdGlvbkVuZChhbmltYXRpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RGaW5pc2hlZEZlbmNlLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICAgIG1BbmltYXRvci5zdGFydCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRlYXJkb3duVmlldygpIHsKKyAgICAgICAgICAgICAgbUFuaW1hdG9yLmNhbmNlbCgpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIGNyZWF0ZVRlc3QoKQorICAgICAgICAgICAgLmFkZExheW91dChSLmxheW91dC5mcmFtZV9sYXlvdXQsIGluaXRpYWxpemVyLCB0cnVlLCB0ZXN0RmluaXNoZWRGZW5jZSkKKyAgICAgICAgICAgIC5ydW5XaXRoVmVyaWZpZXIobmV3IFNhbXBsZVBvaW50VmVyaWZpZXIoCisgICAgICAgICAgICAgICAgbmV3IFBvaW50W10geyBuZXcgUG9pbnQoMCwgMCkgfSwKKyAgICAgICAgICAgICAgICBuZXcgaW50W10geyAweGZmMDAwMGZmIH0KKyAgICAgICAgICAgICkpOworICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3Rlc3RjbGFzc2VzL1ZpZXdBbmltYXRpb25VdGlsc1Rlc3RzLmphdmEgYi90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvVmlld0FuaW1hdGlvblV0aWxzVGVzdHMuamF2YQppbmRleCA4OGFhMjY1Li5mZDY1Yzk3IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvVmlld0FuaW1hdGlvblV0aWxzVGVzdHMuamF2YQorKysgYi90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvVmlld0FuaW1hdGlvblV0aWxzVGVzdHMuamF2YQpAQCAtMTYsOCArMTYsNiBAQAogCiBwYWNrYWdlIGFuZHJvaWQudWlyZW5kZXJpbmcuY3RzLnRlc3RjbGFzc2VzOwogCi1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudWlyZW5kZXJpbmcuY3RzLlI7CiBpbXBvcnQgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMuYml0bWFwY29tcGFyZXJzLk1TU0lNQ29tcGFyZXI7CiBpbXBvcnQgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMuYml0bWFwdmVyaWZpZXJzLkdvbGRlbkltYWdlVmVyaWZpZXI7CkBAIC0yNSw2ICsyMyw5IEBACiBpbXBvcnQgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMudGVzdGluZnJhc3RydWN0dXJlLlZpZXdJbml0aWFsaXplcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0FuaW1hdGlvblV0aWxzOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApAQCAtNDAsNiArNDEsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdGFydCgpOwogICAgICAgICAgICAgICAgIH0sIHRydWUpCiAgICAgICAgICAgICAgICAgLnJ1bldpdGhWZXJpZmllcihuZXcgR29sZGVuSW1hZ2VWZXJpZmllcihnZXRBY3Rpdml0eSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5nb2xkZW5fYmx1ZV9jaXJjbGUsIG5ldyBNU1NJTUNvbXBhcmVyKDAuOTkpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBSLmRyYXdhYmxlLmdvbGRlbl9ibHVlX2NpcmNsZSwgbmV3IE1TU0lNQ29tcGFyZXIoMC44NSkpKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvVmlld0NsaXBwaW5nVGVzdHMuamF2YSBiL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy90ZXN0Y2xhc3Nlcy9WaWV3Q2xpcHBpbmdUZXN0cy5qYXZhCmluZGV4IGQxZjBlZTUuLjE0ZmJjMGYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy90ZXN0Y2xhc3Nlcy9WaWV3Q2xpcHBpbmdUZXN0cy5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy90ZXN0Y2xhc3Nlcy9WaWV3Q2xpcHBpbmdUZXN0cy5qYXZhCkBAIC02LDggKzYsNiBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuT3V0bGluZTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhdGg7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy5SOwogaW1wb3J0IGFuZHJvaWQudWlyZW5kZXJpbmcuY3RzLmJpdG1hcHZlcmlmaWVycy5CaXRtYXBWZXJpZmllcjsKIGltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy5iaXRtYXB2ZXJpZmllcnMuUmVjdFZlcmlmaWVyOwpAQCAtMTgsNiArMTYsOSBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdPdXRsaW5lUHJvdmlkZXI7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvV2lkZUNvbG9yR2FtdXRUZXN0cy5qYXZhIGIvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3Rlc3RjbGFzc2VzL1dpZGVDb2xvckdhbXV0VGVzdHMuamF2YQppbmRleCA5ZjQ2ZTM2Li45MzZmMGY2IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvV2lkZUNvbG9yR2FtdXRUZXN0cy5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy90ZXN0Y2xhc3Nlcy9XaWRlQ29sb3JHYW11dFRlc3RzLmphdmEKQEAgLTIxLDggKzIxLDYgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3JTcGFjZTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy5SOwogaW1wb3J0IGFuZHJvaWQudWlyZW5kZXJpbmcuY3RzLmJpdG1hcHZlcmlmaWVycy5CaXRtYXBWZXJpZmllcjsKIGltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy5iaXRtYXB2ZXJpZmllcnMuU2FtcGxlUG9pbnRWZXJpZmllcjsKQEAgLTMwLDYgKzI4LDEwIEBACiBpbXBvcnQgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMudGVzdGNsYXNzZXMudmlldy5CaXRtYXBWaWV3OwogaW1wb3J0IGFuZHJvaWQudWlyZW5kZXJpbmcuY3RzLnRlc3RpbmZyYXN0cnVjdHVyZS5BY3Rpdml0eVRlc3RCYXNlOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy90ZXN0Y2xhc3Nlcy9YZmVybW9kZVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy90ZXN0Y2xhc3Nlcy9YZmVybW9kZVRlc3QuamF2YQppbmRleCBlYjhlMDdjLi4xMTZlY2Q5IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGNsYXNzZXMvWGZlcm1vZGVUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3Rlc3RjbGFzc2VzL1hmZXJtb2RlVGVzdC5qYXZhCkBAIC0xNSw2ICsxNSw3IEBACiAgKi8KIHBhY2thZ2UgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMudGVzdGNsYXNzZXM7CiAKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOwpAQCAtMjQsMTEgKzI1LDEzIEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmWGZlcm1vZGU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0RjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkNvbG9yRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5MYXJnZVRlc3Q7CiBpbXBvcnQgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMuYml0bWFwdmVyaWZpZXJzLlNhbXBsZVBvaW50VmVyaWZpZXI7CiBpbXBvcnQgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMudGVzdGluZnJhc3RydWN0dXJlLkFjdGl2aXR5VGVzdEJhc2U7CiBpbXBvcnQgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMudGVzdGluZnJhc3RydWN0dXJlLkNhbnZhc0NsaWVudDsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5MYXJnZVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOwpAQCAtMTI2LDYgKzEyOSw5IEBACiAKICAgICAgICAgeyBQb3J0ZXJEdWZmLk1vZGUuU0NSRUVOLCBuZXcgaW50W10gewogICAgICAgICAgICAgICAgIEJHX0NPTE9SLCBEU1RfQ09MT1IsIFNDUkVFTl9DT0xPUiwgU1JDX0NPTE9SIH0gfSwKKworICAgICAgICB7IFBvcnRlckR1ZmYuTW9kZS5DTEVBUiwgbmV3IGludFtdIHsKKyAgICAgICAgICAgIEJHX0NPTE9SLCBCR19DT0xPUiwgQkdfQ09MT1IsIEJHX0NPTE9SIH0gfSwKICAgICB9OwogCiAgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycwpAQCAtMTQwLDEyICsxNDYsMTEgQEAKICAgICB9CiAKIAotICAgIEBPdmVycmlkZQorICAgIEBCZWZvcmUKICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLQogICAgICAgICAvLyB0ZW1wb3JhcnkgLSBlbnN1cmUgdGVzdCBpc24ndCBjYXB0dXJpbmcgd2luZG93IGJnIG9ubHkKLSAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkucnVuT25NYWluU3luYygoKSAtPiBnZXRBY3Rpdml0eSgpLmdldFdpbmRvdygpLnNldEJhY2tncm91bmREcmF3YWJsZSgKKyAgICAgICAgZmluYWwgQWN0aXZpdHkgYWN0aXZpdHkgPSBnZXRBY3Rpdml0eSgpOworICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS5ydW5Pbk1haW5TeW5jKCgpIC0+IGFjdGl2aXR5LmdldFdpbmRvdygpLnNldEJhY2tncm91bmREcmF3YWJsZSgKICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb2xvckRyYXdhYmxlKENvbG9yLkdSRUVOKSkpOwogCiAgICAgfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3Rlc3RpbmZyYXN0cnVjdHVyZS9BY3Rpdml0eVRlc3RCYXNlLmphdmEgYi90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGluZnJhc3RydWN0dXJlL0FjdGl2aXR5VGVzdEJhc2UuamF2YQppbmRleCA1N2U3ZDNiLi5lNjM1OWM2IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGluZnJhc3RydWN0dXJlL0FjdGl2aXR5VGVzdEJhc2UuamF2YQorKysgYi90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGluZnJhc3RydWN0dXJlL0FjdGl2aXR5VGVzdEJhc2UuamF2YQpAQCAtMTUsMjggKzE1LDI3IEBACiAgKi8KIHBhY2thZ2UgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMudGVzdGluZnJhc3RydWN0dXJlOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5TeW5jaHJvbm91c1BpeGVsQ29weTsKLQogaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwLkNvbmZpZzsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvaW50OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKIGltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy5iaXRtYXBjb21wYXJlcnMuQml0bWFwQ29tcGFyZXI7CiBpbXBvcnQgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMuYml0bWFwdmVyaWZpZXJzLkJpdG1hcFZlcmlmaWVyOwogaW1wb3J0IGFuZHJvaWQudWlyZW5kZXJpbmcuY3RzLnV0aWwuQml0bWFwQXNzZXJ0ZXI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuUGl4ZWxDb3B5OwogCitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5OdWxsYWJsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworCitpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5TeW5jaHJvbm91c1BpeGVsQ29weTsKKwogaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKIGltcG9ydCBvcmcuanVuaXQuQWZ0ZXJDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bGVzLlRlc3ROYW1lOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKQEAgLTYyLDcgKzYxLDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBEcmF3QWN0aXZpdHkgc0FjdGl2aXR5OwogCiAgICAgQFJ1bGUKLSAgICBwdWJsaWMgVGVzdE5hbWUgbmFtZSA9IG5ldyBUZXN0TmFtZSgpOworICAgIHB1YmxpYyBUcmFjZXIgbmFtZSA9IG5ldyBUcmFjZXIoKTsKIAogICAgIHByaXZhdGUgQml0bWFwQXNzZXJ0ZXIgbUJpdG1hcEFzc2VydGVyID0gbmV3IEJpdG1hcEFzc2VydGVyKHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCksCiAgICAgICAgICAgICBuYW1lLmdldE1ldGhvZE5hbWUoKSk7CkBAIC0xMDEsMTEgKzEwMCw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBAQmVmb3JlCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0gICAgICAgIG1CaXRtYXBBc3NlcnRlci5zZXRVcChnZXRBY3Rpdml0eSgpKTsKLSAgICB9Ci0KICAgICBAQWZ0ZXIKICAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKICAgICAgICAgaWYgKG1UZXN0Q2FzZUJ1aWxkZXIgIT0gbnVsbCkgewpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3Rlc3RpbmZyYXN0cnVjdHVyZS9EaXNwbGF5TW9kaWZpZXIuamF2YSBiL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy90ZXN0aW5mcmFzdHJ1Y3R1cmUvRGlzcGxheU1vZGlmaWVyLmphdmEKaW5kZXggM2ZjOGRhNy4uYWNmYzljYyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3Rlc3RpbmZyYXN0cnVjdHVyZS9EaXNwbGF5TW9kaWZpZXIuamF2YQorKysgYi90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGluZnJhc3RydWN0dXJlL0Rpc3BsYXlNb2RpZmllci5qYXZhCkBAIC00MTMsOSArNDEzLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0KCJiaXRtYXBNZXNoIiwgbmV3IERpc3BsYXlNb2RpZmllcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeURyYXdpbmcoUGFpbnQgcGFpbnQsIENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNraXAgc29tZSB2ZXJ0cyB0byBleGVyY2lzZSBmaXggaW4gUAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHByZXZpb3VzbHkgdGhpcyB3YXMgaWdub3JlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2ZXJ0c1RvU2tpcCA9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcE1lc2goUmVzb3VyY2VNb2RpZmllci5pbnN0YW5jZSgpLmJpdG1hcCwgMywgMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VNb2RpZmllci5pbnN0YW5jZSgpLmJpdG1hcFZlcnRpY2VzLCAwLCBudWxsLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VNb2RpZmllci5pbnN0YW5jZSgpLmJpdG1hcFZlcnRpY2VzLCB2ZXJ0c1RvU2tpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgMCwgbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXQoImFyYyIsIG5ldyBEaXNwbGF5TW9kaWZpZXIoKSB7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGluZnJhc3RydWN0dXJlL0RyYXdBY3Rpdml0eS5qYXZhIGIvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3Rlc3RpbmZyYXN0cnVjdHVyZS9EcmF3QWN0aXZpdHkuamF2YQppbmRleCAxZDRkM2Y0Li5kODc2YzZjIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGluZnJhc3RydWN0dXJlL0RyYXdBY3Rpdml0eS5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy90ZXN0aW5mcmFzdHJ1Y3R1cmUvRHJhd0FjdGl2aXR5LmphdmEKQEAgLTE1LDYgKzE1LDcgQEAKICAqLwogcGFja2FnZSBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy50ZXN0aW5mcmFzdHJ1Y3R1cmU7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKQEAgLTIzLDExICsyNCwxMSBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlclRocmVhZDsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uTnVsbGFibGU7CitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5OdWxsYWJsZTsKIGltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy5SOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlBhaXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkZyYW1lTWV0cmljczsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwpAQCAtMzUsNiArMzYsOCBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CiAKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKIApAQCAtNTIsNiArNTUsNyBAQAogICAgIHByaXZhdGUgVmlldyBtVmlldzsKICAgICBwcml2YXRlIFZpZXcgbVZpZXdXcmFwcGVyOwogICAgIHByaXZhdGUgYm9vbGVhbiBtT25UdjsKKyAgICBwcml2YXRlIERyYXdNb25pdG9yIG1EcmF3TW9uaXRvcjsKIAogICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBidW5kbGUpewogICAgICAgICBzdXBlci5vbkNyZWF0ZShidW5kbGUpOwpAQCAtNjMsMzMgKzY3LDcgQEAKICAgICAgICAgbUhhbmRsZXIgPSBuZXcgUmVuZGVyU3BlY0hhbmRsZXIoKTsKICAgICAgICAgaW50IHVpTW9kZSA9IGdldFJlc291cmNlcygpLmdldENvbmZpZ3VyYXRpb24oKS51aU1vZGU7CiAgICAgICAgIG1PblR2ID0gKHVpTW9kZSAmIENvbmZpZ3VyYXRpb24uVUlfTU9ERV9UWVBFX01BU0spID09IENvbmZpZ3VyYXRpb24uVUlfTU9ERV9UWVBFX1RFTEVWSVNJT047Ci0KLSAgICAgICAgLy8gbG9nIGZyYW1lIG1ldHJpY3MKLSAgICAgICAgSGFuZGxlclRocmVhZCBoYW5kbGVyVGhyZWFkID0gbmV3IEhhbmRsZXJUaHJlYWQoIkZyYW1lTWV0cmljcyIpOwotICAgICAgICBoYW5kbGVyVGhyZWFkLnN0YXJ0KCk7Ci0gICAgICAgIGdldFdpbmRvdygpLmFkZE9uRnJhbWVNZXRyaWNzQXZhaWxhYmxlTGlzdGVuZXIoCi0gICAgICAgICAgICAgICAgbmV3IFdpbmRvdy5PbkZyYW1lTWV0cmljc0F2YWlsYWJsZUxpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgICAgICBpbnQgbVJ0RnJhbWVDb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkZyYW1lTWV0cmljc0F2YWlsYWJsZShXaW5kb3cgd2luZG93LCBGcmFtZU1ldHJpY3MgZnJhbWVNZXRyaWNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkcm9wQ291bnRTaW5jZUxhc3RJbnZvY2F0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZCgiVWlSZW5kZXJpbmciLCAiV2luZG93IGZyYW1lIGNvdW50ICIgKyBtUnRGcmFtZUNvdW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgZnJhbWUgZHJvcHMgIiArIGRyb3BDb3VudFNpbmNlTGFzdEludm9jYXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgbVJ0RnJhbWVDb3VudCsrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSwgbmV3IEhhbmRsZXIoaGFuZGxlclRocmVhZC5nZXRMb29wZXIoKSkpOwotCi0gICAgICAgIC8vIGxvZyBkcmF3IG1ldHJpY3MKLSAgICAgICAgVmlldyB2aWV3ID0gbmV3IFZpZXcodGhpcyk7Ci0gICAgICAgIHNldENvbnRlbnRWaWV3KHZpZXcpOwotICAgICAgICB2aWV3LmdldFZpZXdUcmVlT2JzZXJ2ZXIoKS5hZGRPbkRyYXdMaXN0ZW5lcihuZXcgVmlld1RyZWVPYnNlcnZlci5PbkRyYXdMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIGludCBtRnJhbWVDb3VudDsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25EcmF3KCkgewotICAgICAgICAgICAgICAgIExvZy5kKCJVaVJlbmRlcmluZyIsICJWaWV3IHRyZWUgZnJhbWUgY291bnQgIiArIG1GcmFtZUNvdW50KTsKLSAgICAgICAgICAgICAgICBtRnJhbWVDb3VudCsrOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKKyAgICAgICAgbURyYXdNb25pdG9yID0gbmV3IERyYXdNb25pdG9yKGdldFdpbmRvdygpKTsKICAgICB9CiAKICAgICBwdWJsaWMgYm9vbGVhbiBnZXRPblR2KCkgewpAQCAtMTE1LDYgKzkzLDcgQEAKICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIGFzc2VydE5vdE51bGwoIlRpbWVvdXQgd2FpdGluZyBmb3IgZHJhdyIsIG1Qb3NpdGlvbkluZm8pOwogICAgICAgICByZXR1cm4gbVBvc2l0aW9uSW5mbzsKICAgICB9CiAKQEAgLTIxOSw5ICsxOTgsMTIgQEAKICAgICAgICAgICAgICAgICBtVmlldy5wb3N0SW52YWxpZGF0ZSgpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1WaWV3LnBvc3QoKCkgLT4gewotICAgICAgICAgICAgICAgIG1WaWV3LmdldFZpZXdUcmVlT2JzZXJ2ZXIoKS5yZW1vdmVPbkRyYXdMaXN0ZW5lcih0aGlzKTsKIAorICAgICAgICAgICAgbG9uZyB2c3luY01pbGxpcyA9IG1WaWV3LmdldERyYXdpbmdUaW1lKCk7CisKKyAgICAgICAgICAgIG1WaWV3LnBvc3QoKCkgLT4gbVZpZXcuZ2V0Vmlld1RyZWVPYnNlcnZlcigpLnJlbW92ZU9uRHJhd0xpc3RlbmVyKHRoaXMpKTsKKworICAgICAgICAgICAgbURyYXdNb25pdG9yLm5vdGlmeVdoZW5EcmF3bih2c3luY01pbGxpcywgKCkgLT4gewogICAgICAgICAgICAgICAgIGZpbmFsIGludFtdIGxvY2F0aW9uID0gbmV3IGludFsyXTsKICAgICAgICAgICAgICAgICBtVmlld1dyYXBwZXIuZ2V0TG9jYXRpb25JbldpbmRvdyhsb2NhdGlvbik7CiAgICAgICAgICAgICAgICAgUG9pbnQgc3VyZmFjZU9mZnNldCA9IG5ldyBQb2ludChsb2NhdGlvblswXSwgbG9jYXRpb25bMV0pOwpAQCAtMjM1LDQgKzIxNyw2MiBAQAogICAgICAgICAgICAgfSk7CiAgICAgICAgIH0KICAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEcmF3TW9uaXRvciB7CisKKyAgICAgICAgcHJpdmF0ZSBBcnJheUxpc3Q8UGFpcjxMb25nLCBSdW5uYWJsZT4+IG1MaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgICAgICBwcml2YXRlIERyYXdNb25pdG9yKFdpbmRvdyB3aW5kb3cpIHsKKyAgICAgICAgICAgIHdpbmRvdy5hZGRPbkZyYW1lTWV0cmljc0F2YWlsYWJsZUxpc3RlbmVyKHRoaXM6Om9uRnJhbWVNZXRyaWNzQXZhaWxhYmxlLAorICAgICAgICAgICAgICAgICAgICBuZXcgSGFuZGxlcigpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBvbkZyYW1lTWV0cmljc0F2YWlsYWJsZShXaW5kb3cgd2luZG93LCBGcmFtZU1ldHJpY3MgZnJhbWVNZXRyaWNzLAorICAgICAgICAgICAgICAgIC8qIFRoaXMgaXNuJ3QgYWN0dWFsbHkgdW51c2VkIGFzIGl0J3MgbmVjZXNzYXJ5IGZvciB0aGUgbWV0aG9kIGhhbmRsZSAqLworICAgICAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBpbnQgZHJvcENvdW50U2luY2VMYXN0SW52b2NhdGlvbikgeworICAgICAgICAgICAgQXJyYXlMaXN0PFJ1bm5hYmxlPiB0b0ludm9rZSA9IG51bGw7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1MaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgICAgICBpZiAobUxpc3RlbmVycy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbG9uZyB2c3luY0F0TWlsbGlzID0gVGltZVVuaXQuTkFOT1NFQ09ORFMuY29udmVydChmcmFtZU1ldHJpY3MKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRNZXRyaWMoRnJhbWVNZXRyaWNzLlZTWU5DX1RJTUVTVEFNUCksIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1VpVGhyZWFkRHJhdyA9IGZyYW1lTWV0cmljcy5nZXRNZXRyaWMoRnJhbWVNZXRyaWNzLkRSQVdfRFVSQVRJT04pID4gMDsKKworICAgICAgICAgICAgICAgIEl0ZXJhdG9yPFBhaXI8TG9uZywgUnVubmFibGU+PiBpdGVyID0gbUxpc3RlbmVycy5pdGVyYXRvcigpOworICAgICAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICBQYWlyPExvbmcsIFJ1bm5hYmxlPiBsaXN0ZW5lciA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoKGxpc3RlbmVyLmZpcnN0ID09IHZzeW5jQXRNaWxsaXMgJiYgaXNVaVRocmVhZERyYXcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGxpc3RlbmVyLmZpcnN0IDwgdnN5bmNBdE1pbGxpcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b0ludm9rZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9JbnZva2UgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKCJVaVJlbmRlcmluZyIsICJhZGRpbmcgbGlzdGVuZXIgZm9yIHZzeW5jICIgKyBsaXN0ZW5lci5maXJzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI7IGdvdCB2c3luYyB0aW1lc3RhbXA6ICIgKyB2c3luY0F0TWlsbGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB3aXRoIGlzVWlUaHJlYWREcmF3ICIgKyBpc1VpVGhyZWFkRHJhdyk7CisgICAgICAgICAgICAgICAgICAgICAgICB0b0ludm9rZS5hZGQobGlzdGVuZXIuc2Vjb25kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXIucmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGlzdGVuZXIuZmlyc3QgPT0gdnN5bmNBdE1pbGxpcyAmJiAhaXNVaVRocmVhZERyYXcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKCJVaVJlbmRlcmluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJZ25vcmluZyBkcmF3IHRoYXQncyBub3QgZnJvbSB0aGUgVUkgdGhyZWFkIGF0IHZzeW5jOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB2c3luY0F0TWlsbGlzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHRvSW52b2tlICE9IG51bGwgJiYgdG9JbnZva2Uuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIGZvciAoUnVubmFibGUgcnVuIDogdG9JbnZva2UpIHsKKyAgICAgICAgICAgICAgICAgICAgcnVuLnJ1bigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgbm90aWZ5V2hlbkRyYXduKGxvbmcgY29udGVudFZzeW5jTWlsbGlzLCBSdW5uYWJsZSBydW5XaGVuRHJhd24pIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxpc3RlbmVycykgeworICAgICAgICAgICAgICAgIG1MaXN0ZW5lcnMuYWRkKG5ldyBQYWlyPD4oY29udGVudFZzeW5jTWlsbGlzLCBydW5XaGVuRHJhd24pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy90ZXN0aW5mcmFzdHJ1Y3R1cmUvTWF0ZXJpYWxBY3Rpdml0eS5qYXZhIGIvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3Rlc3RpbmZyYXN0cnVjdHVyZS9NYXRlcmlhbEFjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzZGYxMmMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3Rlc3RpbmZyYXN0cnVjdHVyZS9NYXRlcmlhbEFjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy50ZXN0aW5mcmFzdHJ1Y3R1cmU7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKLQotcHVibGljIGNsYXNzIE1hdGVyaWFsQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy90ZXN0aW5mcmFzdHJ1Y3R1cmUvUmVzb3VyY2VNb2RpZmllci5qYXZhIGIvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3Rlc3RpbmZyYXN0cnVjdHVyZS9SZXNvdXJjZU1vZGlmaWVyLmphdmEKaW5kZXggOTUzODgwNS4uY2ZlNGQwZCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3Rlc3RpbmZyYXN0cnVjdHVyZS9SZXNvdXJjZU1vZGlmaWVyLmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3Rlc3RpbmZyYXN0cnVjdHVyZS9SZXNvdXJjZU1vZGlmaWVyLmphdmEKQEAgLTk5LDYgKzk5LDcgQEAKICAgICAgICAgZmluYWwgZmxvYXQgaGVpZ2h0ID0gYml0bWFwLmdldEhlaWdodCgpIC8gOC4wZjsKIAogICAgICAgICBiaXRtYXBWZXJ0aWNlcyA9IG5ldyBmbG9hdFtdeworICAgICAgICAgICAgICAgIC0xLjBmLCAtMi4wZiwgLTMuMGYsIC00LjBmLCAgLy8gdGhlc2UgdHdvIChwb2ludHMpIGFyZSBza2lwcGVkIGJ5IHRoZSB0ZXN0CiAgICAgICAgICAgICAgICAgMC4wZiwgMC4wZiwgd2lkdGgsIDAuMGYsIHdpZHRoICogMiwgMC4wZiwgd2lkdGggKiAzLCAwLjBmLAogICAgICAgICAgICAgICAgIDAuMGYsIGhlaWdodCwgd2lkdGgsIGhlaWdodCwgd2lkdGggKiAyLCBoZWlnaHQsIHdpZHRoICogNCwgaGVpZ2h0LAogICAgICAgICAgICAgICAgIDAuMGYsIGhlaWdodCAqIDIsIHdpZHRoLCBoZWlnaHQgKiAyLCB3aWR0aCAqIDIsIGhlaWdodCAqIDIsIHdpZHRoICogMywgaGVpZ2h0ICogMiwKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy90ZXN0aW5mcmFzdHJ1Y3R1cmUvVHJhY2VyLmphdmEgYi90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGluZnJhc3RydWN0dXJlL1RyYWNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlYTcyZmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdGVzdGluZnJhc3RydWN0dXJlL1RyYWNlci5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAgKgorICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgKgorICAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICoKKyAgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgICovCisKK3BhY2thZ2UgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMudGVzdGluZnJhc3RydWN0dXJlOworCitpbXBvcnQgYW5kcm9pZC5vcy5UcmFjZTsKKworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5UZXN0UnVsZTsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLkRlc2NyaXB0aW9uOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLm1vZGVsLlN0YXRlbWVudDsKKworcHVibGljIGNsYXNzIFRyYWNlciBpbXBsZW1lbnRzIFRlc3RSdWxlIHsKKyAgICBwcml2YXRlIFN0cmluZyBtTmFtZTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdGF0ZW1lbnQgYXBwbHkoU3RhdGVtZW50IGJhc2UsIERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7CisgICAgICAgIHJldHVybiBuZXcgU3RhdGVtZW50KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBldmFsdWF0ZSgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICAgICAgICAgIG1OYW1lID0gZGVzY3JpcHRpb24uZ2V0TWV0aG9kTmFtZSgpOworICAgICAgICAgICAgICAgIFRyYWNlLmJlZ2luU2VjdGlvbihtTmFtZSk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgYmFzZS5ldmFsdWF0ZSgpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIFRyYWNlLmVuZFNlY3Rpb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKCkgeworICAgICAgICByZXR1cm4gbU5hbWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3V0aWwvQml0bWFwQXNzZXJ0ZXIuamF2YSBiL3Rlc3RzL3Rlc3RzL3VpcmVuZGVyaW5nL3NyYy9hbmRyb2lkL3VpcmVuZGVyaW5nL2N0cy91dGlsL0JpdG1hcEFzc2VydGVyLmphdmEKaW5kZXggMTUyMzI4My4uNDdmNGM4OSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3V0aWwvQml0bWFwQXNzZXJ0ZXIuamF2YQorKysgYi90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdXRpbC9CaXRtYXBBc3NlcnRlci5qYXZhCkBAIC0yNyw3ICsyNyw2IEBACiAKIHB1YmxpYyBjbGFzcyBCaXRtYXBBc3NlcnRlciB7CiAgICAgcHJpdmF0ZSBEaWZmZXJlbmNlVmlzdWFsaXplciBtRGlmZmVyZW5jZVZpc3VhbGl6ZXI7Ci0gICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OwogICAgIHByaXZhdGUgU3RyaW5nIG1DbGFzc05hbWU7CiAKICAgICBwdWJsaWMgQml0bWFwQXNzZXJ0ZXIoU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIG5hbWUpIHsKQEAgLTQzLDExICs0Miw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBzZXRVcChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgbURpZmZlcmVuY2VWaXN1YWxpemVyID0gbmV3IFBhc3NGYWlsVmlzdWFsaXplcigpOwotICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgfQotCiAgICAgLyoqCiAgICAgICogQ29tcGFyZXMgdGhlIHR3byBiaXRtYXBzIHNhdmVkIHVzaW5nIHRoZSBnaXZlbiB0ZXN0LiBJZiB0aGV5IGZhaWwsIHRoZSBmaWxlcyBhcmUgc2F2ZWQgdXNpbmcKICAgICAgKiB0aGUgdGVzdCBuYW1lLgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3V0aWwvQml0bWFwRHVtcGVyLmphdmEgYi90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdXRpbC9CaXRtYXBEdW1wZXIuamF2YQppbmRleCBlOTZmZTBiLi41YzU5YzQ2IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdXRpbC9CaXRtYXBEdW1wZXIuamF2YQorKysgYi90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdXRpbC9CaXRtYXBEdW1wZXIuamF2YQpAQCAtMTcsNyArMTcsNiBAQAogCiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CiBpbXBvcnQgYW5kcm9pZC5vcy5FbnZpcm9ubWVudDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKIGltcG9ydCBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy5kaWZmZXJlbmNldmlzdWFsaXplcnMuRGlmZmVyZW5jZVZpc3VhbGl6ZXI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3V0aWwvTW9ja1ZzeW5jSGVscGVyLmphdmEgYi90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdXRpbC9Nb2NrVnN5bmNIZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTA5Y2MyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3V0aWwvTW9ja1ZzeW5jSGVscGVyLmphdmEKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC51aXJlbmRlcmluZy5jdHMudXRpbDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvblV0aWxzOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOworCitwdWJsaWMgY2xhc3MgTW9ja1ZzeW5jSGVscGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIEV4ZWN1dG9yU2VydmljZSBzRXhlY3V0b3IgPSBFeGVjdXRvcnMubmV3U2luZ2xlVGhyZWFkRXhlY3V0b3IoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBGdXR1cmU8VGhyZWFkPiBzRXhlY3V0b3JUaHJlYWQ7CisKKyAgICBzdGF0aWMgeworICAgICAgICAvLyBXZSBjYW4ndCB3YWl0IG9uIHRoZSBmdXR1cmUgaGVyZSBiZWNhdXNlIHRoZSBsYW1iZGEgY2Fubm90IGJlIGV4ZWN1dGVkIHVudGlsCisgICAgICAgIC8vIHRoZSBjbGFzcyBoYXMgZmluaXNoZWQgbG9hZGluZworICAgICAgICBzRXhlY3V0b3JUaHJlYWQgPSBzRXhlY3V0b3Iuc3VibWl0KCgpIC0+IHsKKyAgICAgICAgICAgIEFuaW1hdGlvblV0aWxzLmxvY2tBbmltYXRpb25DbG9jaygxNik7CisgICAgICAgICAgICByZXR1cm4gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc09uRXhlY3V0b3JUaHJlYWQoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5lcXVhbHMoc0V4ZWN1dG9yVGhyZWFkLmdldCgpKTsKKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gfCBFeGVjdXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbmV4dEZyYW1lKCkgeworICAgICAgICBhc3NlcnRUcnVlKCJuZXh0RnJhbWUoKSBtdXN0IGJlIGNhbGxlZCBpbnNpZGUgI3VuT25Wc3luY1RocmVhZCBibG9jayIsCisgICAgICAgICAgICAgICAgaXNPbkV4ZWN1dG9yVGhyZWFkKCkpOworICAgICAgICBBbmltYXRpb25VdGlscy5sb2NrQW5pbWF0aW9uQ2xvY2soQW5pbWF0aW9uVXRpbHMuY3VycmVudEFuaW1hdGlvblRpbWVNaWxsaXMoKSArIDE2KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcnVuT25Wc3luY1RocmVhZChDYWxsYWJsZVZvaWQgY2FsbGFibGUpIHsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIkNhbm5vdCBydW5PblZzeW5jVGhyZWFkIGluc2lkZSAjcnVuT25Wc3luY1RocmVhZCBibG9jayIsCisgICAgICAgICAgICAgICAgaXNPbkV4ZWN1dG9yVGhyZWFkKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc0V4ZWN1dG9yLnN1Ym1pdCgoKSAtPiB7CisgICAgICAgICAgICAgICAgY2FsbGFibGUuY2FsbCgpOworICAgICAgICAgICAgICAgIHJldHVybiAoVm9pZCkgbnVsbDsKKyAgICAgICAgICAgIH0pLmdldCgpOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOworICAgICAgICB9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU25lYWt5VGhyb3cuc25lYWt5VGhyb3coZS5nZXRDYXVzZSgpICE9IG51bGwgPyBlLmdldENhdXNlKCkgOiBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnRlcmZhY2UgQ2FsbGFibGVWb2lkIHsKKyAgICAgICAgdm9pZCBjYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdXRpbC9TbmVha3lUaHJvdy5qYXZhIGIvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3V0aWwvU25lYWt5VGhyb3cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGYwOWJkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3V0aWwvU25lYWt5VGhyb3cuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnVpcmVuZGVyaW5nLmN0cy51dGlsOworCisvKioKKyAqIFByb3ZpZGVzIGEgaGFja3kgbWV0aG9kIHRoYXQgYWx3YXlzIHRocm93cyB7QGNvZGUgdH0gZXZlbiBpZiB7QGNvZGUgdH0gaXMgYSBjaGVja2VkIGV4Y2VwdGlvbi4KKyAqIGFuZCBpcyBub3QgZGVjbGFyZWQgdG8gYmUgdGhyb3duLgorICoKKyAqIFNlZQorICogaHR0cDovL3d3dy5tYWlsLWFyY2hpdmUuY29tL2phdmFwb3NzZUBnb29nbGVncm91cHMuY29tL21zZzA1OTg0Lmh0bWwKKyAqLworcHVibGljIGNsYXNzIFNuZWFreVRocm93IHsKKyAgICAvKioKKyAgICAgKiBBIGhhY2t5IG1ldGhvZCB0aGF0IGFsd2F5cyB0aHJvd3Mge0Bjb2RlIHR9IGV2ZW4gaWYge0Bjb2RlIHR9IGlzIGEgY2hlY2tlZCBleGNlcHRpb24sCisgICAgICogYW5kIGlzIG5vdCBkZWNsYXJlZCB0byBiZSB0aHJvd24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNuZWFreVRocm93KFRocm93YWJsZSB0KSB7CisgICAgICAgIFNuZWFreVRocm93LjxSdW50aW1lRXhjZXB0aW9uPnNuZWFreVRocm93Xyh0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyA8VCBleHRlbmRzIFRocm93YWJsZT4gdm9pZCBzbmVha3lUaHJvd18oVGhyb3dhYmxlIHQpIHRocm93cyBUIHsKKyAgICAgICAgdGhyb3cgKFQpIHQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdWlyZW5kZXJpbmcvc3JjL2FuZHJvaWQvdWlyZW5kZXJpbmcvY3RzL3V0aWwvV2ViVmlld1JlYWR5SGVscGVyLmphdmEgYi90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdXRpbC9XZWJWaWV3UmVhZHlIZWxwZXIuamF2YQppbmRleCAyMmVlOWNhLi4zYjMzNmU4IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdXRpbC9XZWJWaWV3UmVhZHlIZWxwZXIuamF2YQorKysgYi90ZXN0cy90ZXN0cy91aXJlbmRlcmluZy9zcmMvYW5kcm9pZC91aXJlbmRlcmluZy9jdHMvdXRpbC9XZWJWaWV3UmVhZHlIZWxwZXIuamF2YQpAQCAtOCw2ICs4LDExIEBACiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CiAKIHB1YmxpYyBmaW5hbCBjbGFzcyBXZWJWaWV3UmVhZHlIZWxwZXIgeworICAgIC8vIEhhY2t5IHF1aWNrLWZpeCBzaW1pbGFyIHRvIERyYXdBY3Rpdml0eSdzIERyYXdDb3VudGVyTGlzdGVuZXIKKyAgICAvLyBUT0RPOiBEZS1kdXBlIHRoaXMgYWdhaW5zdCBEcmF3Q291bnRlckxpc3RlbmVyIGFuZCBmaXggdGhpcyBjcnVmdAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUJVR19SRVFVSVJFX0VYVFJBX0ZSQU1FUyA9IDE7CisgICAgcHJpdmF0ZSBpbnQgbURyYXdDb3VudCA9IDA7CisKICAgICBwcml2YXRlIGZpbmFsIENvdW50RG93bkxhdGNoIG1MYXRjaDsKICAgICBwcml2YXRlIGZpbmFsIFdlYlZpZXcgbVdlYlZpZXc7CiAKQEAgLTM4LDYgKzQzLDExIEBACiAgICAgcHJpdmF0ZSBPbkRyYXdMaXN0ZW5lciBtT25EcmF3TGlzdGVuZXIgPSBuZXcgT25EcmF3TGlzdGVuZXIoKSB7CiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBvbkRyYXcoKSB7CisgICAgICAgICAgICBpZiAoKyttRHJhd0NvdW50IDw9IERFQlVHX1JFUVVJUkVfRVhUUkFfRlJBTUVTKSB7CisgICAgICAgICAgICAgICAgbVdlYlZpZXcucG9zdEludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIG1XZWJWaWV3LnBvc3QoKCkgLT4gewogICAgICAgICAgICAgICAgIG1XZWJWaWV3LmdldFZpZXdUcmVlT2JzZXJ2ZXIoKS5yZW1vdmVPbkRyYXdMaXN0ZW5lcihtT25EcmF3TGlzdGVuZXIpOwogICAgICAgICAgICAgICAgIG1MYXRjaC5jb3VudERvd24oKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3V0aWwvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL3V0aWwvQW5kcm9pZC5tawppbmRleCBhYWIwN2Q3Li4zYWFkZmExIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy91dGlsL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvdGVzdHMvdXRpbC9BbmRyb2lkLm1rCkBAIC0yNCwxNSArMjQsMTYgQEAKICMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKIExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiAKK0xPQ0FMX0pBVkFfTElCUkFSSUVTICs9IGFuZHJvaWQudGVzdC5ydW5uZXIuc3R1YnMKKwogTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKLSAgICBhbmRyb2lkLXN1cHBvcnQtYW5ub3RhdGlvbnMgXAotICAgIGFuZHJvaWQtc3VwcG9ydC10ZXN0IFwKLSAgICBjdHN0ZXN0cnVubmVyIFwKLSAgICBsZWdhY3ktYW5kcm9pZC10ZXN0IFwKLSAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsCisgICAgYW5kcm9pZHguYW5ub3RhdGlvbl9hbm5vdGF0aW9uIFwKKyAgICBhbmRyb2lkeC50ZXN0LnJ1bGVzIFwKKyAgICBjdHN0ZXN0cnVubmVyLWF4dAogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNVdGlsVGVzdENhc2VzCitMT0NBTF9QUklWQVRFX1BMQVRGT1JNX0FQSVMgOj0gdHJ1ZQogCiBpbmNsdWRlICQoQlVJTERfQ1RTX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy91dGlsL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy90ZXN0cy91dGlsL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggOGM0ODczNS4uMGU3MTg5MCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdXRpbC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL3V0aWwvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjQsNyArMjQsNyBAQAogICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KICAgICA8L2FwcGxpY2F0aW9uPgogCi0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC51dGlsLmN0cyIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBvZiBhbmRyb2lkLnV0aWwiPgogICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0ibGlzdGVuZXIiCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy91dGlsL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL3V0aWwvQW5kcm9pZFRlc3QueG1sCmluZGV4IGIwMjIzNTYuLjkyYzFlMTQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3V0aWwvQW5kcm9pZFRlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL3V0aWwvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgVXRpbCB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iZnJhbWV3b3JrIiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CkBAIC0yMiw1ICsyMyw2IEBACiAgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkFuZHJvaWRKVW5pdFRlc3QiID4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJwYWNrYWdlIiB2YWx1ZT0iYW5kcm9pZC51dGlsLmN0cyIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJydW50aW1lLWhpbnQiIHZhbHVlPSI5bSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJoaWRkZW4tYXBpLWNoZWNrcyIgdmFsdWU9ImZhbHNlIiAvPgogICAgIDwvdGVzdD4KIDwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3V0aWwvc3JjL2FuZHJvaWQvdXRpbC9jdHMvQW5kcm9pZEV4Y2VwdGlvblRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3V0aWwvc3JjL2FuZHJvaWQvdXRpbC9jdHMvQW5kcm9pZEV4Y2VwdGlvblRlc3QuamF2YQppbmRleCA4NmNmMWIxLi4wNWE1YmY2IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy91dGlsL3NyYy9hbmRyb2lkL3V0aWwvY3RzL0FuZHJvaWRFeGNlcHRpb25UZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdXRpbC9zcmMvYW5kcm9pZC91dGlsL2N0cy9BbmRyb2lkRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0xOCwxMCArMTgsMTEgQEAKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIAotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5BbmRyb2lkRXhjZXB0aW9uOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy91dGlsL3NyYy9hbmRyb2lkL3V0aWwvY3RzL0FuZHJvaWRSdW50aW1lRXhjZXB0aW9uVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdXRpbC9zcmMvYW5kcm9pZC91dGlsL2N0cy9BbmRyb2lkUnVudGltZUV4Y2VwdGlvblRlc3QuamF2YQppbmRleCA4ODYyNjlmLi40YzUxZjNkIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy91dGlsL3NyYy9hbmRyb2lkL3V0aWwvY3RzL0FuZHJvaWRSdW50aW1lRXhjZXB0aW9uVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3V0aWwvc3JjL2FuZHJvaWQvdXRpbC9jdHMvQW5kcm9pZFJ1bnRpbWVFeGNlcHRpb25UZXN0LmphdmEKQEAgLTE4LDEwICsxOCwxMSBAQAogCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogCi1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkFuZHJvaWRSdW50aW1lRXhjZXB0aW9uOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy91dGlsL3NyYy9hbmRyb2lkL3V0aWwvY3RzL0FycmF5TWFwVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdXRpbC9zcmMvYW5kcm9pZC91dGlsL2N0cy9BcnJheU1hcFRlc3QuamF2YQppbmRleCBjODk5NzJkLi5jYzlmZWFjIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy91dGlsL3NyYy9hbmRyb2lkL3V0aWwvY3RzL0FycmF5TWFwVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3V0aWwvc3JjL2FuZHJvaWQvdXRpbC9jdHMvQXJyYXlNYXBUZXN0LmphdmEKQEAgLTE4LDcgKzE4LDYgQEAKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFNhbWU7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwpAQCAtMjYsMTEgKzI1LDEyIEBACiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5BcnJheU1hcDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy91dGlsL3NyYy9hbmRyb2lkL3V0aWwvY3RzL0FycmF5U2V0VGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdXRpbC9zcmMvYW5kcm9pZC91dGlsL2N0cy9BcnJheVNldFRlc3QuamF2YQppbmRleCBmOGZmMDM3Li5kODRhYmM3IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy91dGlsL3NyYy9hbmRyb2lkL3V0aWwvY3RzL0FycmF5U2V0VGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3V0aWwvc3JjL2FuZHJvaWQvdXRpbC9jdHMvQXJyYXlTZXRUZXN0LmphdmEKQEAgLTE5LDE2ICsxOSwxNiBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3RTYW1lOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXJyYXlTZXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApAQCAtMzgsNyArMzgsNiBAQAogaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwogCiAvLyBBcyBpcyB0aGUgY2FzZSB3aXRoIEFycmF5U2V0IGl0c2VsZiwgQXJyYXlTZXRUZXN0IGJvcnJvd3MgaGVhdmlseSBmcm9tIEFycmF5TWFwVGVzdC4KLQogQFNtYWxsVGVzdAogQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKIHB1YmxpYyBjbGFzcyBBcnJheVNldFRlc3QgewpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdXRpbC9zcmMvYW5kcm9pZC91dGlsL2N0cy9EZWJ1Z1V0aWxzVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdXRpbC9zcmMvYW5kcm9pZC91dGlsL2N0cy9EZWJ1Z1V0aWxzVGVzdC5qYXZhCmluZGV4IDhkNWY2MWIuLjhmZTNlOTQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3V0aWwvc3JjL2FuZHJvaWQvdXRpbC9jdHMvRGVidWdVdGlsc1Rlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy91dGlsL3NyYy9hbmRyb2lkL3V0aWwvY3RzL0RlYnVnVXRpbHNUZXN0LmphdmEKQEAgLTE3LDEwICsxNywxMSBAQAogCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CiAKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuRGVidWdVdGlsczsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdXRpbC9zcmMvYW5kcm9pZC91dGlsL2N0cy9EaXNwbGF5TWV0cmljc1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3V0aWwvc3JjL2FuZHJvaWQvdXRpbC9jdHMvRGlzcGxheU1ldHJpY3NUZXN0LmphdmEKaW5kZXggMjA2MTYxMC4uNjhhN2NiOSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdXRpbC9zcmMvYW5kcm9pZC91dGlsL2N0cy9EaXNwbGF5TWV0cmljc1Rlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy91dGlsL3NyYy9hbmRyb2lkL3V0aWwvY3RzL0Rpc3BsYXlNZXRyaWNzVGVzdC5qYXZhCkBAIC0yMCwxOSArMjAsMTcgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOwogaW1wb3J0IGFuZHJvaWQudmlldy5EaXNwbGF5OwogaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DZGRUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCi1AQ2RkVGVzdChyZXF1aXJlbWVudD0iNy4xLjIvQy0yLTEiKQogQFNtYWxsVGVzdAogQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKIHB1YmxpYyBjbGFzcyBEaXNwbGF5TWV0cmljc1Rlc3QgewpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdXRpbC9zcmMvYW5kcm9pZC91dGlsL2N0cy9FdmVudExvZ1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3V0aWwvc3JjL2FuZHJvaWQvdXRpbC9jdHMvRXZlbnRMb2dUZXN0LmphdmEKaW5kZXggYTBjZTZiNy4uM2U5MzQxMiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdXRpbC9zcmMvYW5kcm9pZC91dGlsL2N0cy9FdmVudExvZ1Rlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy91dGlsL3NyYy9hbmRyb2lkL3V0aWwvY3RzL0V2ZW50TG9nVGVzdC5qYXZhCkBAIC0xOSwxNCArMTksMTQgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKIGltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkV2ZW50TG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5FdmVudExvZy5FdmVudDsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdXRpbC9zcmMvYW5kcm9pZC91dGlsL2N0cy9IYWxmVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdXRpbC9zcmMvYW5kcm9pZC91dGlsL2N0cy9IYWxmVGVzdC5qYXZhCmluZGV4IDg5NTY3YTUuLmQ3OTY2OWIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3V0aWwvc3JjL2FuZHJvaWQvdXRpbC9jdHMvSGFsZlRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy91dGlsL3NyYy9hbmRyb2lkL3V0aWwvY3RzL0hhbGZUZXN0LmphdmEKQEAgLTE2LDIwICsxNiwyMCBAQAogCiBwYWNrYWdlIGFuZHJvaWQudXRpbC5jdHM7CiAKLWltcG9ydCBhbmRyb2lkLnV0aWwuSGFsZjsKLQotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwotCi1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwotCiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudXRpbC5IYWxmLio7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CisKK2ltcG9ydCBhbmRyb2lkLnV0aWwuSGFsZjsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIAogQFNtYWxsVGVzdAogQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3V0aWwvc3JjL2FuZHJvaWQvdXRpbC9jdHMvSnNvblJlYWRlclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3V0aWwvc3JjL2FuZHJvaWQvdXRpbC9jdHMvSnNvblJlYWRlclRlc3QuamF2YQppbmRleCA5YWMzZmMzLi41NTQ3MWM2IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy91dGlsL3NyYy9hbmRyb2lkL3V0aWwvY3RzL0pzb25SZWFkZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdXRpbC9zcmMvYW5kcm9pZC91dGlsL2N0cy9Kc29uUmVhZGVyVGVzdC5qYXZhCkBAIC0yMSwxMiArMjEsMTMgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuSnNvblJlYWRlcjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuSnNvblRva2VuOwogaW1wb3J0IGFuZHJvaWQudXRpbC5NYWxmb3JtZWRKc29uRXhjZXB0aW9uOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy91dGlsL3NyYy9hbmRyb2lkL3V0aWwvY3RzL0pzb25Xcml0ZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy91dGlsL3NyYy9hbmRyb2lkL3V0aWwvY3RzL0pzb25Xcml0ZXJUZXN0LmphdmEKaW5kZXggNzk4MTlhMi4uYjkzOWJmMCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdXRpbC9zcmMvYW5kcm9pZC91dGlsL2N0cy9Kc29uV3JpdGVyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3V0aWwvc3JjL2FuZHJvaWQvdXRpbC9jdHMvSnNvbldyaXRlclRlc3QuamF2YQpAQCAtMTksMTAgKzE5LDExIEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuSnNvbldyaXRlcjsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdXRpbC9zcmMvYW5kcm9pZC91dGlsL2N0cy9Mb2dQcmludGVyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdXRpbC9zcmMvYW5kcm9pZC91dGlsL2N0cy9Mb2dQcmludGVyVGVzdC5qYXZhCmluZGV4IGJkMTM5ZWYuLmExMGMxODYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3V0aWwvc3JjL2FuZHJvaWQvdXRpbC9jdHMvTG9nUHJpbnRlclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy91dGlsL3NyYy9hbmRyb2lkL3V0aWwvY3RzL0xvZ1ByaW50ZXJUZXN0LmphdmEKQEAgLTE2LDExICsxNiwxMiBAQAogCiBwYWNrYWdlIGFuZHJvaWQudXRpbC5jdHM7CiAKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2dQcmludGVyOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy91dGlsL3NyYy9hbmRyb2lkL3V0aWwvY3RzL0xvZ1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3V0aWwvc3JjL2FuZHJvaWQvdXRpbC9jdHMvTG9nVGVzdC5qYXZhCmluZGV4IGFkYTdhZjcuLjc3ZjdkMjAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3V0aWwvc3JjL2FuZHJvaWQvdXRpbC9jdHMvTG9nVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3V0aWwvc3JjL2FuZHJvaWQvdXRpbC9jdHMvTG9nVGVzdC5qYXZhCkBAIC0xOCwxMCArMTgsMTEgQEAKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy91dGlsL3NyYy9hbmRyb2lkL3V0aWwvY3RzL0xvbmdTcGFyc2VBcnJheVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3V0aWwvc3JjL2FuZHJvaWQvdXRpbC9jdHMvTG9uZ1NwYXJzZUFycmF5VGVzdC5qYXZhCmluZGV4IDJlYWJlODguLmRmMzMwMWEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3V0aWwvc3JjL2FuZHJvaWQvdXRpbC9jdHMvTG9uZ1NwYXJzZUFycmF5VGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3V0aWwvc3JjL2FuZHJvaWQvdXRpbC9jdHMvTG9uZ1NwYXJzZUFycmF5VGVzdC5qYXZhCkBAIC0yMSwxMCArMjEsMTEgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9uZ1NwYXJzZUFycmF5OwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy91dGlsL3NyYy9hbmRyb2lkL3V0aWwvY3RzL01hdGhVdGlsc1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3V0aWwvc3JjL2FuZHJvaWQvdXRpbC9jdHMvTWF0aFV0aWxzVGVzdC5qYXZhCmluZGV4IGQxOWE2NTIuLjQ0OWJkNTMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3V0aWwvc3JjL2FuZHJvaWQvdXRpbC9jdHMvTWF0aFV0aWxzVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3V0aWwvc3JjL2FuZHJvaWQvdXRpbC9jdHMvTWF0aFV0aWxzVGVzdC5qYXZhCkBAIC0xOCwxMCArMTgsMTEgQEAKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIAotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5NYXRoVXRpbHM7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3V0aWwvc3JjL2FuZHJvaWQvdXRpbC9jdHMvTW9udGhEaXNwbGF5SGVscGVyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdXRpbC9zcmMvYW5kcm9pZC91dGlsL2N0cy9Nb250aERpc3BsYXlIZWxwZXJUZXN0LmphdmEKaW5kZXggZGY5OTE2Yy4uYjNlMWNhOCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdXRpbC9zcmMvYW5kcm9pZC91dGlsL2N0cy9Nb250aERpc3BsYXlIZWxwZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdXRpbC9zcmMvYW5kcm9pZC91dGlsL2N0cy9Nb250aERpc3BsYXlIZWxwZXJUZXN0LmphdmEKQEAgLTIxLDEwICsyMSwxMSBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTW9udGhEaXNwbGF5SGVscGVyOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy91dGlsL3NyYy9hbmRyb2lkL3V0aWwvY3RzL011dGFibGVUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy91dGlsL3NyYy9hbmRyb2lkL3V0aWwvY3RzL011dGFibGVUZXN0LmphdmEKaW5kZXggZTRmNmZkOS4uZTI3MWRmMCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdXRpbC9zcmMvYW5kcm9pZC91dGlsL2N0cy9NdXRhYmxlVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3V0aWwvc3JjL2FuZHJvaWQvdXRpbC9jdHMvTXV0YWJsZVRlc3QuamF2YQpAQCAtMTYsMTQgKzE2LDE2IEBACiAKIHBhY2thZ2UgYW5kcm9pZC51dGlsLmN0czsKIAotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7CisKIGltcG9ydCBhbmRyb2lkLnV0aWwuKjsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIAotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7Ci0KIEBTbWFsbFRlc3QKIEBSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCiBwdWJsaWMgY2xhc3MgTXV0YWJsZVRlc3QgewpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdXRpbC9zcmMvYW5kcm9pZC91dGlsL2N0cy9QYXR0ZXJuc1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3V0aWwvc3JjL2FuZHJvaWQvdXRpbC9jdHMvUGF0dGVybnNUZXN0LmphdmEKaW5kZXggM2E4ZGYxMS4uYjI0OTc1MyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdXRpbC9zcmMvYW5kcm9pZC91dGlsL2N0cy9QYXR0ZXJuc1Rlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy91dGlsL3NyYy9hbmRyb2lkL3V0aWwvY3RzL1BhdHRlcm5zVGVzdC5qYXZhCkBAIC0xOCwxMCArMTgsMTEgQEAKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuUGF0dGVybnM7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3V0aWwvc3JjL2FuZHJvaWQvdXRpbC9jdHMvUHJpbnRTdHJlYW1QcmludGVyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdXRpbC9zcmMvYW5kcm9pZC91dGlsL2N0cy9QcmludFN0cmVhbVByaW50ZXJUZXN0LmphdmEKaW5kZXggNTlhNmVlMi4uZmYxY2Y3NyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdXRpbC9zcmMvYW5kcm9pZC91dGlsL2N0cy9QcmludFN0cmVhbVByaW50ZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdXRpbC9zcmMvYW5kcm9pZC91dGlsL2N0cy9QcmludFN0cmVhbVByaW50ZXJUZXN0LmphdmEKQEAgLTE4LDExICsxOCwxMiBAQAogCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogCi1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5QcmludFN0cmVhbVByaW50ZXI7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3V0aWwvc3JjL2FuZHJvaWQvdXRpbC9jdHMvUHJpbnRXcml0ZXJQcmludGVyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdXRpbC9zcmMvYW5kcm9pZC91dGlsL2N0cy9QcmludFdyaXRlclByaW50ZXJUZXN0LmphdmEKaW5kZXggZDdhZTg1OS4uOWQ1YmMzNiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdXRpbC9zcmMvYW5kcm9pZC91dGlsL2N0cy9QcmludFdyaXRlclByaW50ZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdXRpbC9zcmMvYW5kcm9pZC91dGlsL2N0cy9QcmludFdyaXRlclByaW50ZXJUZXN0LmphdmEKQEAgLTE5LDExICsxOSwxMiBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5QcmludFdyaXRlclByaW50ZXI7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdXRpbC9zcmMvYW5kcm9pZC91dGlsL2N0cy9Qcm9wZXJ0eVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3V0aWwvc3JjL2FuZHJvaWQvdXRpbC9jdHMvUHJvcGVydHlUZXN0LmphdmEKaW5kZXggM2Q3NmUzNi4uYzFiOTA2NiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdXRpbC9zcmMvYW5kcm9pZC91dGlsL2N0cy9Qcm9wZXJ0eVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy91dGlsL3NyYy9hbmRyb2lkL3V0aWwvY3RzL1Byb3BlcnR5VGVzdC5qYXZhCkBAIC0xNiwxNyArMTYsMTkgQEAKIAogcGFja2FnZSBhbmRyb2lkLnV0aWwuY3RzOwogCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKKwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkZsb2F0UHJvcGVydHk7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkludFByb3BlcnR5OwogaW1wb3J0IGFuZHJvaWQudXRpbC5Qcm9wZXJ0eTsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIAotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7Ci0KIEBTbWFsbFRlc3QKIEBSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCiBwdWJsaWMgY2xhc3MgUHJvcGVydHlUZXN0IHsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3V0aWwvc3JjL2FuZHJvaWQvdXRpbC9jdHMvUmFuZ2VUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy91dGlsL3NyYy9hbmRyb2lkL3V0aWwvY3RzL1JhbmdlVGVzdC5qYXZhCmluZGV4IDUxMjFjZTEuLjZhOWE5MWEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3V0aWwvc3JjL2FuZHJvaWQvdXRpbC9jdHMvUmFuZ2VUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdXRpbC9zcmMvYW5kcm9pZC91dGlsL2N0cy9SYW5nZVRlc3QuamF2YQpAQCAtMTgsMTEgKzE4LDEyIEBACiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiAKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuUmFuZ2U7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlJhdGlvbmFsOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy91dGlsL3NyYy9hbmRyb2lkL3V0aWwvY3RzL1JhdGlvbmFsVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdXRpbC9zcmMvYW5kcm9pZC91dGlsL2N0cy9SYXRpb25hbFRlc3QuamF2YQppbmRleCA4NGIyZWNlLi4wMmY1ZTc2IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy91dGlsL3NyYy9hbmRyb2lkL3V0aWwvY3RzL1JhdGlvbmFsVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3V0aWwvc3JjL2FuZHJvaWQvdXRpbC9jdHMvUmF0aW9uYWxUZXN0LmphdmEKQEAgLTI2LDEwICsyNiwxMSBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIAotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5SYXRpb25hbDsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdXRpbC9zcmMvYW5kcm9pZC91dGlsL2N0cy9TaXplVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdXRpbC9zcmMvYW5kcm9pZC91dGlsL2N0cy9TaXplVGVzdC5qYXZhCmluZGV4IGYyNzQ5NDUuLmM4NjVmNmEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3V0aWwvc3JjL2FuZHJvaWQvdXRpbC9jdHMvU2l6ZVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy91dGlsL3NyYy9hbmRyb2lkL3V0aWwvY3RzL1NpemVUZXN0LmphdmEKQEAgLTE4LDExICsxOCwxMiBAQAogCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogCi1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNpemU7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNpemVGOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy91dGlsL3NyYy9hbmRyb2lkL3V0aWwvY3RzL1NwYXJzZUFycmF5VGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdXRpbC9zcmMvYW5kcm9pZC91dGlsL2N0cy9TcGFyc2VBcnJheVRlc3QuamF2YQppbmRleCBiODBhM2NiLi4yOGRmMGNmIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy91dGlsL3NyYy9hbmRyb2lkL3V0aWwvY3RzL1NwYXJzZUFycmF5VGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3V0aWwvc3JjL2FuZHJvaWQvdXRpbC9jdHMvU3BhcnNlQXJyYXlUZXN0LmphdmEKQEAgLTIxLDEwICsyMSwxMSBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdXRpbC9zcmMvYW5kcm9pZC91dGlsL2N0cy9TcGFyc2VCb29sZWFuQXJyYXlUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy91dGlsL3NyYy9hbmRyb2lkL3V0aWwvY3RzL1NwYXJzZUJvb2xlYW5BcnJheVRlc3QuamF2YQppbmRleCA2YTUzM2Y1Li5iMTM1NTYxIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy91dGlsL3NyYy9hbmRyb2lkL3V0aWwvY3RzL1NwYXJzZUJvb2xlYW5BcnJheVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy91dGlsL3NyYy9hbmRyb2lkL3V0aWwvY3RzL1NwYXJzZUJvb2xlYW5BcnJheVRlc3QuamF2YQpAQCAtMTksMTAgKzE5LDExIEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwogCi1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUJvb2xlYW5BcnJheTsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdXRpbC9zcmMvYW5kcm9pZC91dGlsL2N0cy9TcGFyc2VJbnRBcnJheVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3V0aWwvc3JjL2FuZHJvaWQvdXRpbC9jdHMvU3BhcnNlSW50QXJyYXlUZXN0LmphdmEKaW5kZXggOWM1NTRmYS4uZTRiNDczYiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdXRpbC9zcmMvYW5kcm9pZC91dGlsL2N0cy9TcGFyc2VJbnRBcnJheVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy91dGlsL3NyYy9hbmRyb2lkL3V0aWwvY3RzL1NwYXJzZUludEFycmF5VGVzdC5qYXZhCkBAIC0xOSwxMCArMTksMTEgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CiAKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlSW50QXJyYXk7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3V0aWwvc3JjL2FuZHJvaWQvdXRpbC9jdHMvU3BhcnNlTG9uZ0FycmF5VGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdXRpbC9zcmMvYW5kcm9pZC91dGlsL2N0cy9TcGFyc2VMb25nQXJyYXlUZXN0LmphdmEKaW5kZXggNTAxYzc4OC4uN2I2ZjBjNiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdXRpbC9zcmMvYW5kcm9pZC91dGlsL2N0cy9TcGFyc2VMb25nQXJyYXlUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdXRpbC9zcmMvYW5kcm9pZC91dGlsL2N0cy9TcGFyc2VMb25nQXJyYXlUZXN0LmphdmEKQEAgLTE5LDEwICsxOSwxMSBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIAotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VMb25nQXJyYXk7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3V0aWwvc3JjL2FuZHJvaWQvdXRpbC9jdHMvU3RhdGVTZXRUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy91dGlsL3NyYy9hbmRyb2lkL3V0aWwvY3RzL1N0YXRlU2V0VGVzdC5qYXZhCmluZGV4IGMzNDIwZWIuLjE4MThlMDkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3V0aWwvc3JjL2FuZHJvaWQvdXRpbC9jdHMvU3RhdGVTZXRUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdXRpbC9zcmMvYW5kcm9pZC91dGlsL2N0cy9TdGF0ZVNldFRlc3QuamF2YQpAQCAtMjAsMTAgKzIwLDExIEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5TdGF0ZVNldDsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdXRpbC9zcmMvYW5kcm9pZC91dGlsL2N0cy9TdHJpY3RKYXJGaWxlVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdXRpbC9zcmMvYW5kcm9pZC91dGlsL2N0cy9TdHJpY3RKYXJGaWxlVGVzdC5qYXZhCmluZGV4IDNjMThkZjcuLjhhNGE2ZDQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3V0aWwvc3JjL2FuZHJvaWQvdXRpbC9jdHMvU3RyaWN0SmFyRmlsZVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy91dGlsL3NyYy9hbmRyb2lkL3V0aWwvY3RzL1N0cmljdEphckZpbGVUZXN0LmphdmEKQEAgLTIyLDEyICsyMiwxMyBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIAotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQuc3lzdGVtLk9zQ29uc3RhbnRzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5qYXIuU3RyaWN0SmFyRmlsZTsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgbGliY29yZS5pby5Jb0JyaWRnZTsKIGltcG9ydCBsaWJjb3JlLmlvLlN0cmVhbXM7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3V0aWwvc3JjL2FuZHJvaWQvdXRpbC9jdHMvU3RyaW5nQnVpbGRlclByaW50ZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy91dGlsL3NyYy9hbmRyb2lkL3V0aWwvY3RzL1N0cmluZ0J1aWxkZXJQcmludGVyVGVzdC5qYXZhCmluZGV4IDE3ZTQ2MDMuLjk2YmMxYWQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3V0aWwvc3JjL2FuZHJvaWQvdXRpbC9jdHMvU3RyaW5nQnVpbGRlclByaW50ZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdXRpbC9zcmMvYW5kcm9pZC91dGlsL2N0cy9TdHJpbmdCdWlsZGVyUHJpbnRlclRlc3QuamF2YQpAQCAtMTgsMTAgKzE4LDExIEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU3RyaW5nQnVpbGRlclByaW50ZXI7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3V0aWwvc3JjL2FuZHJvaWQvdXRpbC9jdHMvVGltZVV0aWxzVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdXRpbC9zcmMvYW5kcm9pZC91dGlsL2N0cy9UaW1lVXRpbHNUZXN0LmphdmEKaW5kZXggMzM2MmNhZi4uOGY5Yjc2ZCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdXRpbC9zcmMvYW5kcm9pZC91dGlsL2N0cy9UaW1lVXRpbHNUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdXRpbC9zcmMvYW5kcm9pZC91dGlsL2N0cy9UaW1lVXRpbHNUZXN0LmphdmEKQEAgLTE3LDEwICsxNywxMSBAQAogCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogCi1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlRpbWVVdGlsczsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdXRpbC9zcmMvYW5kcm9pZC91dGlsL2N0cy9UaW1pbmdMb2dnZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy91dGlsL3NyYy9hbmRyb2lkL3V0aWwvY3RzL1RpbWluZ0xvZ2dlclRlc3QuamF2YQppbmRleCA5OGY3MDllLi44MTc3ODNiIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy91dGlsL3NyYy9hbmRyb2lkL3V0aWwvY3RzL1RpbWluZ0xvZ2dlclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy91dGlsL3NyYy9hbmRyb2lkL3V0aWwvY3RzL1RpbWluZ0xvZ2dlclRlc3QuamF2YQpAQCAtMTYsMTAgKzE2LDExIEBACiBwYWNrYWdlIGFuZHJvaWQudXRpbC5jdHM7CiAKIAotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTGFyZ2VUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5UaW1pbmdMb2dnZXI7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTGFyZ2VUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3V0aWwvc3JjL2FuZHJvaWQvdXRpbC9jdHMvVHlwZWRWYWx1ZVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3V0aWwvc3JjL2FuZHJvaWQvdXRpbC9jdHMvVHlwZWRWYWx1ZVRlc3QuamF2YQppbmRleCA5YzQ1NGU0Li40YTUxYmU3IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy91dGlsL3NyYy9hbmRyb2lkL3V0aWwvY3RzL1R5cGVkVmFsdWVUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdXRpbC9zcmMvYW5kcm9pZC91dGlsL2N0cy9UeXBlZFZhbHVlVGVzdC5qYXZhCkBAIC0yMCwxMSArMjAsMTIgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CiAKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlR5cGVkVmFsdWU7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3V0aWwvc3JjL2FuZHJvaWQvdXRpbC9jdHMvWG1sRW5jb2RpbmdUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy91dGlsL3NyYy9hbmRyb2lkL3V0aWwvY3RzL1htbEVuY29kaW5nVGVzdC5qYXZhCmluZGV4IDhjZTZiNWYuLmE0MDU1NTAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3V0aWwvc3JjL2FuZHJvaWQvdXRpbC9jdHMvWG1sRW5jb2RpbmdUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdXRpbC9zcmMvYW5kcm9pZC91dGlsL2N0cy9YbWxFbmNvZGluZ1Rlc3QuamF2YQpAQCAtMTksMTAgKzE5LDExIEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7CkBAIC0zNCw3ICszNSw2IEBACiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwogCi0KIC8qKgogICogVGVzdENhc2VzIGZvciBhbmRyb2lkLnV0aWwuWG1sLkVuY29kaW5nLgogICovCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy91dGlsL3NyYy9hbmRyb2lkL3V0aWwvY3RzL1htbFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3V0aWwvc3JjL2FuZHJvaWQvdXRpbC9jdHMvWG1sVGVzdC5qYXZhCmluZGV4IDQwMGMxNDEuLmYzZTVlYjQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3V0aWwvc3JjL2FuZHJvaWQvdXRpbC9jdHMvWG1sVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3V0aWwvc3JjL2FuZHJvaWQvdXRpbC9jdHMvWG1sVGVzdC5qYXZhCkBAIC0yMSwxMiArMjEsMTMgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5YbWxSZXNvdXJjZVBhcnNlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5YbWw7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIGltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdmlldy9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvdmlldy9BbmRyb2lkLm1rCmluZGV4IDUzM2Q5OGIuLjczMjgwNDMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3ZpZXcvQW5kcm9pZC5taworKysgYi90ZXN0cy90ZXN0cy92aWV3L0FuZHJvaWQubWsKQEAgLTIyLDI3ICsyMiwyNyBAQAogTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKIAogIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzIGN0c19pbnN0YW50CiAKIExPQ0FMX01VTFRJTElCIDo9IGJvdGgKIAotTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lcgorTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lci5zdHVicyBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicwogCiBMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAotICAgIGFuZHJvaWQtc3VwcG9ydC10ZXN0IFwKLSAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsIFwKLSAgICBjdHNkZXZpY2V1dGlsbGVnYWN5IFwKLSAgICBjdHN0ZXN0cnVubmVyIFwKKyAgICBhbmRyb2lkeC50ZXN0LnJ1bGVzIFwKKyAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBcCisgICAgY3RzZGV2aWNldXRpbGxlZ2FjeS1heHQgXAorICAgIGN0c3Rlc3RydW5uZXItYXh0IFwKICAgICBtb2NraXRvLXRhcmdldC1taW51cy1qdW5pdDQgXAogICAgIHBsYXRmb3JtLXRlc3QtYW5ub3RhdGlvbnMgXAotICAgIHViLXVpYXV0b21hdG9yIFwKLSAgICBsZWdhY3ktYW5kcm9pZC10ZXN0CisgICAgdWItdWlhdXRvbWF0b3IKIAogTE9DQUxfSk5JX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3Rzdmlld19qbmkgbGlibmF0aXZlaGVscGVyX2NvbXBhdF9saWJjKysKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKSAkKGNhbGwgYWxsLXJlbmRlcnNjcmlwdC1maWxlcy11bmRlciwgc3JjKQogCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzVmlld1Rlc3RDYXNlcworTE9DQUxfUFJJVkFURV9QTEFURk9STV9BUElTIDo9IHRydWUKIAogaW5jbHVkZSAkKEJVSUxEX0NUU19QQUNLQUdFKQogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy92aWV3L0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy90ZXN0cy92aWV3L0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggODIzNzA0Yy4uMmE2ZDcyOSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdmlldy9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL3ZpZXcvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMTYsNyArMTYsOCBAQAogIC0tPgogCiA8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHBhY2thZ2U9ImFuZHJvaWQudmlldy5jdHMiPgorICAgIHBhY2thZ2U9ImFuZHJvaWQudmlldy5jdHMiCisgICAgYW5kcm9pZDp0YXJnZXRTYW5kYm94VmVyc2lvbj0iMiI+CiAKICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkNBTUVSQSIgLz4KICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkRJU0FCTEVfS0VZR1VBUkQiIC8+CkBAIC0xOTEsNiArMTkyLDEzIEBACiAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmNvbmZpZ0NoYW5nZXM9Im9yaWVudGF0aW9ufHNjcmVlblNpemUiCiAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmNvbG9yTW9kZT0id2lkZUNvbG9yR2FtdXQiIC8+CiAKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC52aWV3LmN0cy5QaXhlbENvcHlWaWV3UHJvZHVjZXJEaWFsb2dBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IlBpeGVsQ29weVZpZXdQcm9kdWNlckRpYWxvZ0FjdGl2aXR5IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzY3JlZW5PcmllbnRhdGlvbj0icG9ydHJhaXQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnJvdGF0aW9uQW5pbWF0aW9uPSJqdW1wY3V0IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuTWF0ZXJpYWwuRGlhbG9nLk5vQWN0aW9uQmFyIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpjb25maWdDaGFuZ2VzPSJvcmllbnRhdGlvbnxzY3JlZW5TaXplIiAvPgorCiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudmlldy5jdHMuRm9jdXNGaW5kZXJDdHNBY3Rpdml0eSIKICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2NyZWVuT3JpZW50YXRpb249ImxvY2tlZCIKICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkZvY3VzRmluZGVyQ3RzQWN0aXZpdHkiPgpAQCAtMjg4LDE3ICsyOTYsOCBAQAogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICA8L2FjdGl2aXR5PgogCi0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudmlldy5jdHMuUGFuaWNQcmVzc0JhY2tBY3Rpdml0eSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2NyZWVuT3JpZW50YXRpb249ImxvY2tlZCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IlBhbmljUHJlc3NCYWNrQWN0aXZpdHkiPgotICAgICAgICAgICAgPGludGVudC1maWx0ZXI+Ci0gICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgotICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkZSQU1FV09SS19JTlNUUlVNRU5UQVRJT05fVEVTVCIgLz4KLSAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KLSAgICAgICAgPC9hY3Rpdml0eT4KLQogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnZpZXcuY3RzLkRyYWdEcm9wQWN0aXZpdHkiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnNjcmVlbk9yaWVudGF0aW9uPSJwb3J0cmFpdCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2NyZWVuT3JpZW50YXRpb249ImxvY2tlZCIKICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkRyYWdEcm9wQWN0aXZpdHkiPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgpAQCAtMzQ3LDkgKzM0NiwyMSBAQAogICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudmlldy5jdHMuS2V5RXZlbnRJbnRlcmNlcHRUZXN0QWN0aXZpdHkiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudmlldy5jdHMuVG91Y2hEZWxlZ2F0ZVRlc3RBY3Rpdml0eSI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CiAgICAgPC9hcHBsaWNhdGlvbj4KIAotICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQudmlldy5jdHMiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgdGVzdHMgb2YgYW5kcm9pZC52aWV3Ij4KICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9Imxpc3RlbmVyIgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdmlldy9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy90ZXN0cy92aWV3L0FuZHJvaWRUZXN0LnhtbAppbmRleCA5ZWQ1MmJjLi5hYzFhNzMxIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy92aWV3L0FuZHJvaWRUZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy92aWV3L0FuZHJvaWRUZXN0LnhtbApAQCAtMTQsNiArMTQsNyBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIFZpZXcgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9InVpdG9vbGtpdCIgLz4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgpAQCAtMjIsNSArMjMsNiBAQAogICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5BbmRyb2lkSlVuaXRUZXN0IiA+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icGFja2FnZSIgdmFsdWU9ImFuZHJvaWQudmlldy5jdHMiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icnVudGltZS1oaW50IiB2YWx1ZT0iNm00N3MiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0iaGlkZGVuLWFwaS1jaGVja3MiIHZhbHVlPSJmYWxzZSIgLz4KICAgICA8L3Rlc3Q+CiA8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy92aWV3L2puaS9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvdmlldy9qbmkvQW5kcm9pZC5tawppbmRleCAyODhlMjUwLi5mMWFhZDY4IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy92aWV3L2puaS9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3Rlc3RzL3ZpZXcvam5pL0FuZHJvaWQubWsKQEAgLTMyLDYgKzMyLDQgQEAKIAogTE9DQUxfQ1hYX1NUTCA6PSBsaWJjKytfc3RhdGljCiAKLUxPQ0FMX0NMQU5HIDo9IHRydWUKLQogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdmlldy9yZXMvbGF5b3V0LWxhbmQvZHJhZ19kcm9wX2xheW91dC54bWwgYi90ZXN0cy90ZXN0cy92aWV3L3Jlcy9sYXlvdXQtbGFuZC9kcmFnX2Ryb3BfbGF5b3V0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWFhNWRmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvdmlldy9yZXMvbGF5b3V0LWxhbmQvZHJhZ19kcm9wX2xheW91dC54bWwKQEAgLTAsMCArMSw1MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZHJhZ19kcm9wX2FjdGl2aXR5X21haW4iCisgICAgICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiPgorICAgIDxGcmFtZUxheW91dAorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9jb250YWluZXIiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW49IjQyZHAiCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNCQkJCQkIiPgorICAgICAgICA8RnJhbWVMYXlvdXQKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3N1YmNvbnRhaW5lciIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbj0iNDJkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiM2NjY2NjYiPgorICAgICAgICAgICAgPFZpZXcKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9pbm5lciIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjQyZHAiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNDJkcCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luPSI0MmRwIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiMwMEZGMDAiIC8+CisgICAgICAgIDwvRnJhbWVMYXlvdXQ+CisgICAgPC9GcmFtZUxheW91dD4KKyAgICA8VmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9kcmFnZ2FibGUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iNDJkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNDJkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbj0iNDJkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iIzAwMDBGRiIgLz4KKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdmlldy9yZXMvbGF5b3V0L2ZvY3VzX2ZpbmRlcl9sYXlvdXQueG1sIGIvdGVzdHMvdGVzdHMvdmlldy9yZXMvbGF5b3V0L2ZvY3VzX2ZpbmRlcl9sYXlvdXQueG1sCmluZGV4IDhmNGRmZmIuLjFkZWE2ODQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3ZpZXcvcmVzL2xheW91dC9mb2N1c19maW5kZXJfbGF5b3V0LnhtbAorKysgYi90ZXN0cy90ZXN0cy92aWV3L3Jlcy9sYXlvdXQvZm9jdXNfZmluZGVyX2xheW91dC54bWwKQEAgLTIyLDggKzIyLDcgQEAKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50VG9wPSJ0cnVlIj4KICAgICAgICAgPFRhYmxlUm93PgogICAgICAgICAgICAgPGFuZHJvaWQudmlldy5jdHMuVGVzdEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3RvcF9sZWZ0X2J1dHRvbiIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjIwZHAiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI0MGRwIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iNjBkcCIKICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCiAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iVEwiIC8+CiAgICAgICAgICAgICA8YW5kcm9pZC52aWV3LmN0cy5UZXN0QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvdG9wX3JpZ2h0X2J1dHRvbiIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ZpZXcvcmVzL2xheW91dC9mb2N1c19oYW5kbGluZ19pbml0aWFsX2ZvY3VzLnhtbCBiL3Rlc3RzL3Rlc3RzL3ZpZXcvcmVzL2xheW91dC9mb2N1c19oYW5kbGluZ19pbml0aWFsX2ZvY3VzLnhtbAppbmRleCBhZDEyZDA3Li5kZGM2N2FiIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy92aWV3L3Jlcy9sYXlvdXQvZm9jdXNfaGFuZGxpbmdfaW5pdGlhbF9mb2N1cy54bWwKKysrIGIvdGVzdHMvdGVzdHMvdmlldy9yZXMvbGF5b3V0L2ZvY3VzX2hhbmRsaW5nX2luaXRpYWxfZm9jdXMueG1sCkBAIC0xOSwxNyArMTksMTcgQEAKICAgICA8cmVxdWVzdEZvY3VzIC8+CiAgICAgPFZpZXcKICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9mb2N1c2FibGUxIgotICAgICAgICBhbmRyb2lkOmZvY3VzYWJsZT0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpmb2N1c2FibGVJblRvdWNoTW9kZT0idHJ1ZSIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjEwZHAiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMTBkcCIgLz4KICAgICA8VmlldwogICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2ZvY3VzYWJsZTIiCi0gICAgICAgIGFuZHJvaWQ6Zm9jdXNhYmxlPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmZvY3VzYWJsZUluVG91Y2hNb2RlPSJ0cnVlIgogICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMTBkcCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxMGRwIiAvPgogICAgIDxWaWV3CiAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZm9jdXNhYmxlMyIKLSAgICAgICAgYW5kcm9pZDpmb2N1c2FibGU9InRydWUiCisgICAgICAgIGFuZHJvaWQ6Zm9jdXNhYmxlSW5Ub3VjaE1vZGU9InRydWUiCiAgICAgICAgIGFuZHJvaWQ6Zm9jdXNlZEJ5RGVmYXVsdD0idHJ1ZSIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjEwZHAiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMTBkcCIgLz4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ZpZXcvcmVzL2xheW91dC9mb2N1c19oYW5kbGluZ19sYXlvdXQueG1sIGIvdGVzdHMvdGVzdHMvdmlldy9yZXMvbGF5b3V0L2ZvY3VzX2hhbmRsaW5nX2xheW91dC54bWwKaW5kZXggNjk2NmU1My4uZDJmNzc3OCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdmlldy9yZXMvbGF5b3V0L2ZvY3VzX2hhbmRsaW5nX2xheW91dC54bWwKKysrIGIvdGVzdHMvdGVzdHMvdmlldy9yZXMvbGF5b3V0L2ZvY3VzX2hhbmRsaW5nX2xheW91dC54bWwKQEAgLTIyLDE0ICsyMiwxNCBAQAogCiAgICAgPFZpZXcKICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC92aWV3MSIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSI1MGRwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjMwZHAiCiAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9pZF9vayIvPgogCiAgICAgPFZpZXcKICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC92aWV3MiIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSI1MGRwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjMwZHAiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3RvUmlnaHRPZj0iQGlkL3ZpZXcxIgogICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblRvcD0iQGlkL3ZpZXcxIgogICAgICAgICBhbmRyb2lkOm5leHRGb2N1c0xlZnQ9IkBpZC92aWV3MSIKQEAgLTM3LDggKzM3LDggQEAKIAogICAgIDxWaWV3CiAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdmlldzMiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iNTBkcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIzMGRwIgogICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL3ZpZXcxIgogICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnbkxlZnQ9IkBpZC92aWV3MSIKICAgICAgICAgYW5kcm9pZDpuZXh0Rm9jdXNVcD0iQGlkL3ZpZXcxIgpAQCAtNDYsOCArNDYsOCBAQAogCiAgICAgPFZpZXcKICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC92aWV3NCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSI1MGRwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjMwZHAiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3RvUmlnaHRPZj0iQGlkL3ZpZXczIgogICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblRvcD0iQGlkL3ZpZXczIgogICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblJpZ2h0PSJAaWQvdmlldzIiCkBAIC01Nyw4ICs1Nyw4IEBACiAKICAgICA8TGluZWFyTGF5b3V0CiAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYXV0b190ZXN0X2FyZWEiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjIwMGRwIgogICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC92aWV3NCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRMZWZ0PSJ0cnVlIj4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ZpZXcvcmVzL2xheW91dC9rZXlfZmFsbGJhY2tfbGF5b3V0LnhtbCBiL3Rlc3RzL3Rlc3RzL3ZpZXcvcmVzL2xheW91dC9rZXlfZmFsbGJhY2tfbGF5b3V0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDdiMWEzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvdmlldy9yZXMvbGF5b3V0L2tleV9mYWxsYmFja19sYXlvdXQueG1sCkBAIC0wLDAgKzEsNjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8TGluZWFyTGF5b3V0CisgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiPgorICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgorICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaGlnaGVyX2luX25vcm1hbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dHJhbnNsYXRpb25aPSIzZHAiCisgICAgICAgICAgICBhbmRyb2lkOmZvY3VzYWJsZT0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSI1MGRwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiIC8+CisgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDpmb2N1c2FibGU9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iNTBkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPgorICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbGFzdF9pbl9ub3JtYWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iNTBkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPgorICAgIDwvTGluZWFyTGF5b3V0PgorICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9oaWdoZXJfZ3JvdXAiCisgICAgICAgIGFuZHJvaWQ6dHJhbnNsYXRpb25aPSIxZHAiCisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KKyAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmZvY3VzYWJsZT0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSI1MGRwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiIC8+CisgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9sb3dlcl9pbl9oaWdoZXIiCisgICAgICAgICAgICBhbmRyb2lkOmZvY3VzYWJsZT0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dHJhbnNsYXRpb25aPSItMmRwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjUwZHAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgLz4KKyAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2xhc3RfaW5faGlnaGVyIgorICAgICAgICAgICAgYW5kcm9pZDpmb2N1c2FibGU9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iNTBkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPgorICAgIDwvTGluZWFyTGF5b3V0PgorICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgorICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6Zm9jdXNhYmxlPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjUwZHAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgLz4KKyAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmZvY3VzYWJsZT0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSI1MGRwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiIC8+CisgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9sYXN0X2J1dHRvbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6Zm9jdXNhYmxlPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjUwZHAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKzwvTGluZWFyTGF5b3V0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ZpZXcvcmVzL2xheW91dC90b3VjaF9kZWxlZ2F0ZV90ZXN0X2FjdGl2aXR5X2xheW91dC54bWwgYi90ZXN0cy90ZXN0cy92aWV3L3Jlcy9sYXlvdXQvdG91Y2hfZGVsZWdhdGVfdGVzdF9hY3Rpdml0eV9sYXlvdXQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ODAwNDYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy92aWV3L3Jlcy9sYXlvdXQvdG91Y2hfZGVsZWdhdGVfdGVzdF9hY3Rpdml0eV9sYXlvdXQueG1sCkBAIC0wLDAgKzEsMjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+CisKKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8UmVsYXRpdmVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2xheW91dCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiPgorICAgIDxCdXR0b24KKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9idXR0b24iCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJJblBhcmVudD0idHJ1ZSIKKyAgICAvPgorPC9SZWxhdGl2ZUxheW91dD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy92aWV3L3Jlcy9sYXlvdXQvdmlld19sYXlvdXQueG1sIGIvdGVzdHMvdGVzdHMvdmlldy9yZXMvbGF5b3V0L3ZpZXdfbGF5b3V0LnhtbAppbmRleCBmYmRkZGMyLi42ZTU1NWQ3IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy92aWV3L3Jlcy9sYXlvdXQvdmlld19sYXlvdXQueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL3ZpZXcvcmVzL2xheW91dC92aWV3X2xheW91dC54bWwKQEAgLTMyLDcgKzMyLDcgQEAKICAgICA8YW5kcm9pZC52aWV3LmN0cy5Nb2NrVmlldwogICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3Njcm9sbF92aWV3IgogICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMTAwcHgiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMjAwcHgiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMjBweCIKICAgICAgICAgYW5kcm9pZDpzY3JvbGxiYXJzPSJob3Jpem9udGFsfHZlcnRpY2FsIgogICAgICAgICBhbmRyb2lkOmZhZGluZ0VkZ2U9Imhvcml6b250YWx8dmVydGljYWwiCiAgICAgICAgIGFuZHJvaWQ6c2Nyb2xsSW5kaWNhdG9ycz0idG9wfGJvdHRvbSIKQEAgLTQ1LDcgKzQ1LDcgQEAKICAgICA8YW5kcm9pZC52aWV3LmN0cy5Nb2NrVmlldwogICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3Njcm9sbF92aWV3XzIiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxMDBweCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIyMDBweCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIyMHB4IgogICAgICAgICBhbmRyb2lkOnNjcm9sbGJhcnM9Imhvcml6b250YWx8dmVydGljYWwiCiAgICAgICAgIGFuZHJvaWQ6cmVxdWlyZXNGYWRpbmdFZGdlPSJob3Jpem9udGFsfHZlcnRpY2FsIgogICAgICAgICBhbmRyb2lkOmZhZGluZ0VkZ2VMZW5ndGg9IjIwcHgiCkBAIC01Nyw3ICs1Nyw3IEBACiAgICAgPGFuZHJvaWQudmlldy5jdHMuTW9ja1ZpZXcKICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zY3JvbGxfdmlld18zIgogICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMTAwcHgiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMjAwcHgiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMjBweCIKICAgICAgICAgYW5kcm9pZDpzY3JvbGxiYXJzPSJob3Jpem9udGFsfHZlcnRpY2FsIgogICAgICAgICBhbmRyb2lkOnNjcm9sbGJhclRodW1iVmVydGljYWw9IkBkcmF3YWJsZS9zY3JvbGxiYXJfbm9fc2l6ZSIKICAgICAgICAgYW5kcm9pZDpzY3JvbGxiYXJUcmFja1ZlcnRpY2FsPSJAbnVsbCIKQEAgLTY3LDcgKzY3LDcgQEAKICAgICA8YW5kcm9pZC52aWV3LmN0cy5Nb2NrVmlldwogICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3Njcm9sbF92aWV3XzQiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxMDBweCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIyMDBweCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIyMHB4IgogICAgICAgICBhbmRyb2lkOnNjcm9sbGJhcnM9Imhvcml6b250YWx8dmVydGljYWwiCiAgICAgICAgIGFuZHJvaWQ6c2Nyb2xsYmFyVGh1bWJWZXJ0aWNhbD0iQGRyYXdhYmxlL3Njcm9sbGJhcl90aHVtYiIKICAgICAgICAgYW5kcm9pZDpzY3JvbGxiYXJUcmFja1ZlcnRpY2FsPSJAbnVsbCIKQEAgLTc3LDcgKzc3LDcgQEAKICAgICA8YW5kcm9pZC52aWV3LmN0cy5Nb2NrVmlldwogICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3Njcm9sbF92aWV3XzUiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxMDBweCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIyMDBweCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIyMHB4IgogICAgICAgICBhbmRyb2lkOnNjcm9sbGJhcnM9Imhvcml6b250YWx8dmVydGljYWwiCiAgICAgICAgIGFuZHJvaWQ6c2Nyb2xsYmFyVGh1bWJWZXJ0aWNhbD0iQGRyYXdhYmxlL3Njcm9sbGJhcl90aHVtYiIKICAgICAgICAgYW5kcm9pZDpzY3JvbGxiYXJUcmFja1ZlcnRpY2FsPSJAZHJhd2FibGUvc2Nyb2xsYmFyX3RyYWNrIgpAQCAtODcsNyArODcsNyBAQAogICAgIDxhbmRyb2lkLnZpZXcuY3RzLk1vY2tWaWV3CiAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc2Nyb2xsX3ZpZXdfNiIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjEwMHB4IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjIwMHB4IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjIwcHgiCiAgICAgICAgIGFuZHJvaWQ6c2Nyb2xsYmFycz0iaG9yaXpvbnRhbHx2ZXJ0aWNhbCIKICAgICAgICAgYW5kcm9pZDpzY3JvbGxiYXJUaHVtYlZlcnRpY2FsPSJAZHJhd2FibGUvc2Nyb2xsYmFyX3RodW1iIgogICAgICAgICBhbmRyb2lkOnNjcm9sbGJhclRyYWNrVmVydGljYWw9IkBkcmF3YWJsZS9zY3JvbGxiYXJfbm9fc2l6ZSIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ZpZXcvcmVzL2xheW91dC92aWV3X291dGxpbmVzaGFkb3djb2xvci54bWwgYi90ZXN0cy90ZXN0cy92aWV3L3Jlcy9sYXlvdXQvdmlld19vdXRsaW5lc2hhZG93Y29sb3IueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNjZiMDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy92aWV3L3Jlcy9sYXlvdXQvdmlld19vdXRsaW5lc2hhZG93Y29sb3IueG1sCkBAIC0wLDAgKzEsNDQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+CisKKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tYWluX3ZpZXciCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+CisKKyAgICA8VmlldyBhbmRyb2lkOmlkPSJAK2lkL2RlZmF1bHRfc2hhZG93IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNTBkcCIgLz4KKworICAgIDxWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvcmVkX3NoYWRvdyIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjUwZHAiCisgICAgICAgICAgICBhbmRyb2lkOm91dGxpbmVBbWJpZW50U2hhZG93Q29sb3I9IkBjb2xvci9yZWQiIC8+CisKKyAgICA8VmlldyBhbmRyb2lkOmlkPSJAK2lkL2JsdWVfc2hhZG93IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNTBkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6b3V0bGluZVNwb3RTaGFkb3dDb2xvcj0iIzAwMDBGRiIgLz4KKworICAgIDxWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvZ3JlZW5fc2hhZG93IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNTBkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6b3V0bGluZVNwb3RTaGFkb3dDb2xvcj0iI0ZGMDBGRjAwIgorICAgICAgICAgICAgYW5kcm9pZDpvdXRsaW5lQW1iaWVudFNoYWRvd0NvbG9yPSJAY29sb3IvZ3JlZW4iIC8+CisKKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdmlldy9yZXMvdmFsdWVzL2NvbG9ycy54bWwgYi90ZXN0cy90ZXN0cy92aWV3L3Jlcy92YWx1ZXMvY29sb3JzLnhtbAppbmRleCBmM2NjMzI1Li43OTBmZmU2IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy92aWV3L3Jlcy92YWx1ZXMvY29sb3JzLnhtbAorKysgYi90ZXN0cy90ZXN0cy92aWV3L3Jlcy92YWx1ZXMvY29sb3JzLnhtbApAQCAtMjMsNCArMjMsNiBAQAogICAgIDxjb2xvciBuYW1lPSJ0ZXN0Y29sb3IxIj4jZmYwMGZmMDA8L2NvbG9yPgogICAgIDxjb2xvciBuYW1lPSJ0ZXN0Y29sb3IyIj4jZmZmZjAwMDA8L2NvbG9yPgogICAgIDxjb2xvciBuYW1lPSJmYWlsQ29sb3IiPiNmZjAwMDBmZjwvY29sb3I+CisgICAgPGNvbG9yIG5hbWU9InJlZCI+I2ZmZmYwMDAwPC9jb2xvcj4KKyAgICA8Y29sb3IgbmFtZT0iZ3JlZW4iPiNmZjAwZmYwMDwvY29sb3I+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9hbmltYXRpb24vY3RzL0FjY2VsZXJhdGVEZWNlbGVyYXRlSW50ZXJwb2xhdG9yVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9jdHMvQWNjZWxlcmF0ZURlY2VsZXJhdGVJbnRlcnBvbGF0b3JUZXN0LmphdmEKaW5kZXggOTI2ZDcwNy4uNGJjNDg4MyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9jdHMvQWNjZWxlcmF0ZURlY2VsZXJhdGVJbnRlcnBvbGF0b3JUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9jdHMvQWNjZWxlcmF0ZURlY2VsZXJhdGVJbnRlcnBvbGF0b3JUZXN0LmphdmEKQEAgLTIzLDEwICsyMyw2IEBACiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CiBpbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuWG1sUmVzb3VyY2VQYXJzZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5YbWw7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CkBAIC0zOCw2ICszNCwxMSBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uVHJhbnNmb3JtYXRpb247CiBpbXBvcnQgYW5kcm9pZC52aWV3LmN0cy5SOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9hbmltYXRpb24vY3RzL0FjY2VsZXJhdGVJbnRlcnBvbGF0b3JUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL2N0cy9BY2NlbGVyYXRlSW50ZXJwb2xhdG9yVGVzdC5qYXZhCmluZGV4IDkyZmEwOGQuLjIzYWRmMTEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9hbmltYXRpb24vY3RzL0FjY2VsZXJhdGVJbnRlcnBvbGF0b3JUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9jdHMvQWNjZWxlcmF0ZUludGVycG9sYXRvclRlc3QuamF2YQpAQCAtMjMsMTAgKzIzLDYgQEAKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKIGltcG9ydCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb247CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5YbWxSZXNvdXJjZVBhcnNlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlhtbDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKQEAgLTM4LDYgKzM0LDExIEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5UcmFuc2Zvcm1hdGlvbjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuY3RzLlI7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9jdHMvQWxwaGFBbmltYXRpb25UZXN0LmphdmEgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL2N0cy9BbHBoYUFuaW1hdGlvblRlc3QuamF2YQppbmRleCA2MDVhMzM5Li4yNDBkMTU1IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL2N0cy9BbHBoYUFuaW1hdGlvblRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL2N0cy9BbHBoYUFuaW1hdGlvblRlc3QuamF2YQpAQCAtMjEsMTUgKzIxLDE2IEBACiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlhtbFJlc291cmNlUGFyc2VyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlhtbDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFscGhhQW5pbWF0aW9uOwogaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uVHJhbnNmb3JtYXRpb247CiBpbXBvcnQgYW5kcm9pZC52aWV3LmN0cy5SOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9hbmltYXRpb24vY3RzL0FuaW1hdGlvblNldFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9hbmltYXRpb24vY3RzL0FuaW1hdGlvblNldFRlc3QuamF2YQppbmRleCAzNjg0NmYzLi4xMTUxN2NmIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL2N0cy9BbmltYXRpb25TZXRUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9jdHMvQW5pbWF0aW9uU2V0VGVzdC5qYXZhCkBAIC0yNSwxMCArMjUsNiBAQAogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwogaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlhtbFJlc291cmNlUGFyc2VyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwpAQCAtNDEsNiArMzcsMTEgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLlRyYW5zbGF0ZUFuaW1hdGlvbjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuY3RzLlI7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9jdHMvQW5pbWF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9jdHMvQW5pbWF0aW9uVGVzdC5qYXZhCmluZGV4IGQzYmM4ZTAuLjg4NDM1YzkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9hbmltYXRpb24vY3RzL0FuaW1hdGlvblRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL2N0cy9BbmltYXRpb25UZXN0LmphdmEKQEAgLTM1LDExICszNSw2IEBACiBpbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuWG1sUmVzb3VyY2VQYXJzZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLkxhcmdlVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlhtbDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKQEAgLTUzLDYgKzQ4LDEyIEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5UcmFuc2Zvcm1hdGlvbjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuY3RzLlI7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5MYXJnZVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuUG9sbGluZ0NoZWNrOwogCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9hbmltYXRpb24vY3RzL0FuaW1hdGlvblRlc3RVdGlscy5qYXZhIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9jdHMvQW5pbWF0aW9uVGVzdFV0aWxzLmphdmEKaW5kZXggOWM4NDVjMS4uZDBiMGZmYyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9jdHMvQW5pbWF0aW9uVGVzdFV0aWxzLmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9jdHMvQW5pbWF0aW9uVGVzdFV0aWxzLmphdmEKQEAgLTE4LDEyICsxOCwxMyBAQAogCiBpbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb247CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5MYXlvdXRBbmltYXRpb25Db250cm9sbGVyOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CisKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlBvbGxpbmdDaGVjazsKIAogLyoqCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL2N0cy9BbmltYXRpb25VdGlsc1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9hbmltYXRpb24vY3RzL0FuaW1hdGlvblV0aWxzVGVzdC5qYXZhCmluZGV4IDNhOGQyNzAuLmJmYTkwNGUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9hbmltYXRpb24vY3RzL0FuaW1hdGlvblV0aWxzVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9hbmltYXRpb24vY3RzL0FuaW1hdGlvblV0aWxzVGVzdC5qYXZhCkBAIC0yMSw5ICsyMSw2IEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BY2NlbGVyYXRlSW50ZXJwb2xhdG9yOwogaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQWxwaGFBbmltYXRpb247CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb247CkBAIC0zMyw2ICszMCwxMCBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uTGF5b3V0QW5pbWF0aW9uQ29udHJvbGxlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuY3RzLlI7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9hbmltYXRpb24vY3RzL0FuaW1hdG9ySW5mbGF0ZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL2N0cy9BbmltYXRvckluZmxhdGVyVGVzdC5qYXZhCmluZGV4IGRkZDU1YWEuLmJmZTBiOTIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9hbmltYXRpb24vY3RzL0FuaW1hdG9ySW5mbGF0ZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9jdHMvQW5pbWF0b3JJbmZsYXRlclRlc3QuamF2YQpAQCAtMzAsMTAgKzMwLDYgQEAKIGltcG9ydCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb247CiBpbXBvcnQgYW5kcm9pZC5hcHAuVWlBdXRvbWF0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuRGlzcGxheTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZTsKQEAgLTQxLDggKzM3LDEzIEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmN0cy5SOwogCi1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL2N0cy9DeWNsZUludGVycG9sYXRvclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9hbmltYXRpb24vY3RzL0N5Y2xlSW50ZXJwb2xhdG9yVGVzdC5qYXZhCmluZGV4IDM3MmZkNTIuLmVkZTI2MGYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9hbmltYXRpb24vY3RzL0N5Y2xlSW50ZXJwb2xhdG9yVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9hbmltYXRpb24vY3RzL0N5Y2xlSW50ZXJwb2xhdG9yVGVzdC5qYXZhCkBAIC0yMywxMCArMjMsNiBAQAogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwogaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlhtbFJlc291cmNlUGFyc2VyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwpAQCAtMzgsNiArMzQsMTEgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLlRyYW5zZm9ybWF0aW9uOwogaW1wb3J0IGFuZHJvaWQudmlldy5jdHMuUjsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL2N0cy9EZWNlbGVyYXRlSW50ZXJwb2xhdG9yVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9jdHMvRGVjZWxlcmF0ZUludGVycG9sYXRvclRlc3QuamF2YQppbmRleCAxZWNiZTk2Li5mNWVkM2NjIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL2N0cy9EZWNlbGVyYXRlSW50ZXJwb2xhdG9yVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9hbmltYXRpb24vY3RzL0RlY2VsZXJhdGVJbnRlcnBvbGF0b3JUZXN0LmphdmEKQEAgLTIzLDEwICsyMyw2IEBACiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CiBpbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuWG1sUmVzb3VyY2VQYXJzZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5YbWw7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CkBAIC0zOCw2ICszNCwxMSBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uVHJhbnNmb3JtYXRpb247CiBpbXBvcnQgYW5kcm9pZC52aWV3LmN0cy5SOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9hbmltYXRpb24vY3RzL0dyaWRMYXlvdXRBbmltYXRpb25Db250cm9sbGVyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9jdHMvR3JpZExheW91dEFuaW1hdGlvbkNvbnRyb2xsZXJUZXN0LmphdmEKaW5kZXggMDBhODhjYS4uYTJhNTBkNiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9jdHMvR3JpZExheW91dEFuaW1hdGlvbkNvbnRyb2xsZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9jdHMvR3JpZExheW91dEFuaW1hdGlvbkNvbnRyb2xsZXJUZXN0LmphdmEKQEAgLTIxLDkgKzIxLDYgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5YbWxSZXNvdXJjZVBhcnNlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLkxhcmdlVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwpAQCAtMzcsNiArMzQsMTAgQEAKIGltcG9ydCBhbmRyb2lkLndpZGdldC5BYnNMaXN0VmlldzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5HcmlkVmlldzsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5MYXJnZVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL2N0cy9HcmlkTGF5b3V0QW5pbWF0aW9uQ29udHJvbGxlcl9BbmltYXRpb25QYXJhbWV0ZXJzVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9jdHMvR3JpZExheW91dEFuaW1hdGlvbkNvbnRyb2xsZXJfQW5pbWF0aW9uUGFyYW1ldGVyc1Rlc3QuamF2YQppbmRleCBjM2JlMzgyLi5hZWM2ODQ4IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL2N0cy9HcmlkTGF5b3V0QW5pbWF0aW9uQ29udHJvbGxlcl9BbmltYXRpb25QYXJhbWV0ZXJzVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9hbmltYXRpb24vY3RzL0dyaWRMYXlvdXRBbmltYXRpb25Db250cm9sbGVyX0FuaW1hdGlvblBhcmFtZXRlcnNUZXN0LmphdmEKQEAgLTE3LDEwICsxNywxMSBAQAogcGFja2FnZSBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLmN0czsKIAogCi1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5HcmlkTGF5b3V0QW5pbWF0aW9uQ29udHJvbGxlcjsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9jdHMvTGF5b3V0QW5pbWF0aW9uQ29udHJvbGxlclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9hbmltYXRpb24vY3RzL0xheW91dEFuaW1hdGlvbkNvbnRyb2xsZXJUZXN0LmphdmEKaW5kZXggOTBlNzk0Mi4uMmM5MThhMSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9jdHMvTGF5b3V0QW5pbWF0aW9uQ29udHJvbGxlclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL2N0cy9MYXlvdXRBbmltYXRpb25Db250cm9sbGVyVGVzdC5qYXZhCkBAIC0yMiw5ICsyMiw2IEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuWG1sUmVzb3VyY2VQYXJzZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5MYXJnZVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlhtbDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKQEAgLTQxLDYgKzM4LDEwIEBACiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTGFyZ2VUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9jdHMvTGF5b3V0QW5pbWF0aW9uQ29udHJvbGxlcl9BbmltYXRpb25QYXJhbWV0ZXJzVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9jdHMvTGF5b3V0QW5pbWF0aW9uQ29udHJvbGxlcl9BbmltYXRpb25QYXJhbWV0ZXJzVGVzdC5qYXZhCmluZGV4IDU3ZTA1MGMuLjdjYTBiYzQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9hbmltYXRpb24vY3RzL0xheW91dEFuaW1hdGlvbkNvbnRyb2xsZXJfQW5pbWF0aW9uUGFyYW1ldGVyc1Rlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL2N0cy9MYXlvdXRBbmltYXRpb25Db250cm9sbGVyX0FuaW1hdGlvblBhcmFtZXRlcnNUZXN0LmphdmEKQEAgLTE2LDEwICsxNiwxMSBAQAogCiBwYWNrYWdlIGFuZHJvaWQudmlldy5hbmltYXRpb24uY3RzOwogCi1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5MYXlvdXRBbmltYXRpb25Db250cm9sbGVyOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL2N0cy9MaW5lYXJJbnRlcnBvbGF0b3JUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL2N0cy9MaW5lYXJJbnRlcnBvbGF0b3JUZXN0LmphdmEKaW5kZXggZGRkMWJlNC4uMTU1OTBjNiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9jdHMvTGluZWFySW50ZXJwb2xhdG9yVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9hbmltYXRpb24vY3RzL0xpbmVhckludGVycG9sYXRvclRlc3QuamF2YQpAQCAtMjIsMTAgKzIyLDYgQEAKIAogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwogaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQWxwaGFBbmltYXRpb247CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb247CkBAIC0zNSw2ICszMSwxMSBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uVHJhbnNmb3JtYXRpb247CiBpbXBvcnQgYW5kcm9pZC52aWV3LmN0cy5SOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9hbmltYXRpb24vY3RzL1JvdGF0ZUFuaW1hdGlvblRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9hbmltYXRpb24vY3RzL1JvdGF0ZUFuaW1hdGlvblRlc3QuamF2YQppbmRleCBlNzk2MWQ1Li4wNWFjYTYzIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL2N0cy9Sb3RhdGVBbmltYXRpb25UZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9jdHMvUm90YXRlQW5pbWF0aW9uVGVzdC5qYXZhCkBAIC0yNSwxMCArMjUsNiBAQAogaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlhtbFJlc291cmNlUGFyc2VyOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwpAQCAtMzgsNiArMzQsMTEgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLlRyYW5zZm9ybWF0aW9uOwogaW1wb3J0IGFuZHJvaWQudmlldy5jdHMuUjsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL2N0cy9TY2FsZUFuaW1hdGlvblRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9hbmltYXRpb24vY3RzL1NjYWxlQW5pbWF0aW9uVGVzdC5qYXZhCmluZGV4IGMxNGQxNTEuLjhhZWQzMWUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9hbmltYXRpb24vY3RzL1NjYWxlQW5pbWF0aW9uVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9hbmltYXRpb24vY3RzL1NjYWxlQW5pbWF0aW9uVGVzdC5qYXZhCkBAIC0yNCwxMCArMjQsNiBAQAogaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlhtbFJlc291cmNlUGFyc2VyOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwpAQCAtMzYsNiArMzIsMTEgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLlRyYW5zZm9ybWF0aW9uOwogaW1wb3J0IGFuZHJvaWQudmlldy5jdHMuUjsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL2N0cy9UcmFuc2Zvcm1hdGlvblRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9hbmltYXRpb24vY3RzL1RyYW5zZm9ybWF0aW9uVGVzdC5qYXZhCmluZGV4IDBjOWU0NWYuLmYxOWQ5ZjkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9hbmltYXRpb24vY3RzL1RyYW5zZm9ybWF0aW9uVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9hbmltYXRpb24vY3RzL1RyYW5zZm9ybWF0aW9uVGVzdC5qYXZhCkBAIC0yMiwxMCArMjIsMTEgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3RTYW1lOwogCiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5NYXRyaXg7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5UcmFuc2Zvcm1hdGlvbjsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9jdHMvVHJhbnNsYXRlQW5pbWF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9jdHMvVHJhbnNsYXRlQW5pbWF0aW9uVGVzdC5qYXZhCmluZGV4IGVlOGIxODcuLmU3Y2QzZWIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9hbmltYXRpb24vY3RzL1RyYW5zbGF0ZUFuaW1hdGlvblRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL2N0cy9UcmFuc2xhdGVBbmltYXRpb25UZXN0LmphdmEKQEAgLTE2LDcgKzE2LDcgQEAKIAogcGFja2FnZSBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLmN0czsKIAotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb247CitpbXBvcnQgc3RhdGljIGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uOwogCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwpAQCAtMjYsOSArMjYsNiBAQAogaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlhtbFJlc291cmNlUGFyc2VyOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwpAQCAtMzgsNiArMzUsMTAgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLlRyYW5zbGF0ZUFuaW1hdGlvbjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuY3RzLlI7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9BYnNTYXZlZFN0YXRlVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9BYnNTYXZlZFN0YXRlVGVzdC5qYXZhCmluZGV4IDEyYmJhMTAuLmI5NjFhZjAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvQWJzU2F2ZWRTdGF0ZVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL0Fic1NhdmVkU3RhdGVUZXN0LmphdmEKQEAgLTI4LDEwICsyOCwxMSBAQAogCiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudmlldy5BYnNTYXZlZFN0YXRlOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL0FjdGlvbk1vZGVDYWxsYmFjazJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL0FjdGlvbk1vZGVDYWxsYmFjazJUZXN0LmphdmEKaW5kZXggOTViMTkyOS4uZDFlZDUxYiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9BY3Rpb25Nb2RlQ2FsbGJhY2syVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvQWN0aW9uTW9kZUNhbGxiYWNrMlRlc3QuamF2YQpAQCAtMjAsMTQgKzIwLDE1IEBACiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkFjdGlvbk1vZGU7CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvQWN0aW9uTW9kZVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvQWN0aW9uTW9kZVRlc3QuamF2YQppbmRleCBlMjgxNzNkLi5kZGI5OThkIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL0FjdGlvbk1vZGVUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9BY3Rpb25Nb2RlVGVzdC5qYXZhCkBAIC0zMiwxNSArMzIsMTYgQEAKIAogaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudmlldy5BY3Rpb25Nb2RlOwogaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OwogaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SW5mbGF0ZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL0Nob3Jlb2dyYXBoZXJOYXRpdmVUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL0Nob3Jlb2dyYXBoZXJOYXRpdmVUZXN0LmphdmEKaW5kZXggMTQ1NDM2Yi4uZDRhNjA5NyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9DaG9yZW9ncmFwaGVyTmF0aXZlVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvQ2hvcmVvZ3JhcGhlck5hdGl2ZVRlc3QuamF2YQpAQCAtMTgsMTEgKzE4LDExIEBACiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwogCi1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5GbGFreVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLkZsYWt5VGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9DaG9yZW9ncmFwaGVyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9DaG9yZW9ncmFwaGVyVGVzdC5qYXZhCmluZGV4IGEyMzJiNTEuLmIxNTZkNjAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvQ2hvcmVvZ3JhcGhlclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL0Nob3Jlb2dyYXBoZXJUZXN0LmphdmEKQEAgLTI2LDExICsyNiwxMiBAQAogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnZlcmlmeVplcm9JbnRlcmFjdGlvbnM7CiAKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuQ2hvcmVvZ3JhcGhlcjsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9Db250ZW50UGFuZUZvY3VzVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9Db250ZW50UGFuZUZvY3VzVGVzdC5qYXZhCmluZGV4IDcyYzg5ZGYuLmIwMmRlZTggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvQ29udGVudFBhbmVGb2N1c1Rlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL0NvbnRlbnRQYW5lRm9jdXNUZXN0LmphdmEKQEAgLTI1LDE1ICsyNSwxNiBAQAogaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3UGFyZW50OwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvQ29udGV4dFRoZW1lV3JhcHBlclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvQ29udGV4dFRoZW1lV3JhcHBlclRlc3QuamF2YQppbmRleCAyZTFiOTI5Li5kMDU1ODdiIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL0NvbnRleHRUaGVtZVdyYXBwZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9Db250ZXh0VGhlbWVXcmFwcGVyVGVzdC5qYXZhCkBAIC0yNiwxMSArMjYsMTIgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcy5UaGVtZTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRUaGVtZVdyYXBwZXI7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9EaXNwbGF5UmVmcmVzaFJhdGVUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL0Rpc3BsYXlSZWZyZXNoUmF0ZVRlc3QuamF2YQppbmRleCAxOWFlYzc4Li42MThjYTIxIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL0Rpc3BsYXlSZWZyZXNoUmF0ZVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL0Rpc3BsYXlSZWZyZXNoUmF0ZVRlc3QuamF2YQpAQCAtMjAsMTMgKzIwLDE0IEBACiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTGFyZ2VUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudmlldy5EaXNwbGF5OwogaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLkxhcmdlVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvRHJhZ0Ryb3BUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL0RyYWdEcm9wVGVzdC5qYXZhCmluZGV4IDIwYzQ3NDIuLmMyYzU3MzEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvRHJhZ0Ryb3BUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9EcmFnRHJvcFRlc3QuamF2YQpAQCAtMjUsMTkgKzI1LDE4IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNsaXBEYXRhOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5DbGlwRGVzY3JpcHRpb247CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuRHJhZ0V2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5JbnB1dERldmljZTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuQXJyYXlVdGlsczsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ2RkVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiAKIGltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKQEAgLTQ2LDExICs0NSwxMSBAQAogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkludFN0cmVhbTsKIAotQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuMi41L0MtMS01IikKIEBSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCiBwdWJsaWMgY2xhc3MgRHJhZ0Ryb3BUZXN0IHsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJEcmFnRHJvcFRlc3QiOwpAQCAtNjcsNjAgKzY2LDgzIEBACiAgICAgcHJpdmF0ZSBDb3VudERvd25MYXRjaCBtU3RhcnRSZWNlaXZlZDsKICAgICBwcml2YXRlIENvdW50RG93bkxhdGNoIG1FbmRSZWNlaXZlZDsKIAotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZXF1YWwoQ2xpcERlc2NyaXB0aW9uIGQxLCBDbGlwRGVzY3JpcHRpb24gZDIpIHsKLSAgICAgICAgaWYgKChkMSA9PSBudWxsKSAhPSAoZDIgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZDEgPT0gbnVsbCkgeworICAgIHByaXZhdGUgQXNzZXJ0aW9uRXJyb3IgbU1haW5UaHJlYWRBc3NlcnRpb25FcnJvcjsKKworICAgIC8qKgorICAgICAqIENoZWNrIHdoZXRoZXIgdHdvIG9iamVjdHMgaGF2ZSB0aGUgc2FtZSBiaW5hcnkgZGF0YSB3aGVuIGR1bXBlZCBpbnRvIFBhcmNlbHMKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIG9iamVjdHMgYXJlIGVxdWFsCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb21wYXJlUGFyY2VsYWJsZXMoUGFyY2VsYWJsZSBvYmoxLCBQYXJjZWxhYmxlIG9iajIpIHsKKyAgICAgICAgaWYgKG9iajEgPT0gbnVsbCAmJiBvYmoyID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkMS5nZXRMYWJlbCgpLmVxdWFscyhkMi5nZXRMYWJlbCgpKSAmJgotICAgICAgICAgICAgICAgIGQxLmdldE1pbWVUeXBlQ291bnQoKSA9PSAxICYmIGQyLmdldE1pbWVUeXBlQ291bnQoKSA9PSAxICYmCi0gICAgICAgICAgICAgICAgZDEuZ2V0TWltZVR5cGUoMCkuZXF1YWxzKGQyLmdldE1pbWVUeXBlKDApKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGVxdWFsKENsaXBEYXRhLkl0ZW0gaTEsIENsaXBEYXRhLkl0ZW0gaTIpIHsKLSAgICAgICAgcmV0dXJuIE9iamVjdHMuZXF1YWxzKGkxLmdldEludGVudCgpLCBpMi5nZXRJbnRlbnQoKSkgJiYKLSAgICAgICAgICAgICAgICBPYmplY3RzLmVxdWFscyhpMS5nZXRIdG1sVGV4dCgpLCBpMi5nZXRIdG1sVGV4dCgpKSAmJgotICAgICAgICAgICAgICAgIE9iamVjdHMuZXF1YWxzKGkxLmdldFRleHQoKSwgaTIuZ2V0VGV4dCgpKSAmJgotICAgICAgICAgICAgICAgIE9iamVjdHMuZXF1YWxzKGkxLmdldFVyaSgpLCBpMi5nZXRVcmkoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlcXVhbChDbGlwRGF0YSBkMSwgQ2xpcERhdGEgZDIpIHsKLSAgICAgICAgaWYgKChkMSA9PSBudWxsKSAhPSAoZDIgPT0gbnVsbCkpIHsKKyAgICAgICAgaWYgKG9iajEgPT0gbnVsbCB8fCBvYmoyID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQotICAgICAgICBpZiAoZDEgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVxdWFsKGQxLmdldERlc2NyaXB0aW9uKCksIGQyLmdldERlc2NyaXB0aW9uKCkpICYmCi0gICAgICAgICAgICAgICAgT2JqZWN0cy5lcXVhbHMoZDEuZ2V0SWNvbigpLCBkMi5nZXRJY29uKCkpICYmCi0gICAgICAgICAgICAgICAgZDEuZ2V0SXRlbUNvdW50KCkgPT0gMSAmJiBkMi5nZXRJdGVtQ291bnQoKSA9PSAxICYmCi0gICAgICAgICAgICAgICAgZXF1YWwoZDEuZ2V0SXRlbUF0KDApLCBkMi5nZXRJdGVtQXQoMCkpOworICAgICAgICBQYXJjZWwgcDEgPSBQYXJjZWwub2J0YWluKCk7CisgICAgICAgIG9iajEud3JpdGVUb1BhcmNlbChwMSwgMCk7CisgICAgICAgIFBhcmNlbCBwMiA9IFBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgb2JqMi53cml0ZVRvUGFyY2VsKHAyLCAwKTsKKyAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBBcnJheXMuZXF1YWxzKHAxLm1hcnNoYWxsKCksIHAyLm1hcnNoYWxsKCkpOworICAgICAgICBwMS5yZWN5Y2xlKCk7CisgICAgICAgIHAyLnJlY3ljbGUoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGVxdWFsKERyYWdFdmVudCBldjEsIERyYWdFdmVudCBldjIpIHsKLSAgICAgICAgcmV0dXJuIGV2MS5nZXRBY3Rpb24oKSA9PSBldjIuZ2V0QWN0aW9uKCkgJiYKLSAgICAgICAgICAgICAgICBldjEuZ2V0WCgpID09IGV2Mi5nZXRYKCkgJiYKLSAgICAgICAgICAgICAgICBldjEuZ2V0WSgpID09IGV2Mi5nZXRZKCkgJiYKLSAgICAgICAgICAgICAgICBlcXVhbChldjEuZ2V0Q2xpcERhdGEoKSwgZXYyLmdldENsaXBEYXRhKCkpICYmCi0gICAgICAgICAgICAgICAgZXF1YWwoZXYxLmdldENsaXBEZXNjcmlwdGlvbigpLCBldjIuZ2V0Q2xpcERlc2NyaXB0aW9uKCkpICYmCi0gICAgICAgICAgICAgICAgT2JqZWN0cy5lcXVhbHMoZXYxLmdldERyYWdBbmREcm9wUGVybWlzc2lvbnMoKSwgZXYyLmdldERyYWdBbmREcm9wUGVybWlzc2lvbnMoKSkgJiYKLSAgICAgICAgICAgICAgICBPYmplY3RzLmVxdWFscyhldjEuZ2V0TG9jYWxTdGF0ZSgpLCBldjIuZ2V0TG9jYWxTdGF0ZSgpKSAmJgotICAgICAgICAgICAgICAgIGV2MS5nZXRSZXN1bHQoKSA9PSBldjIuZ2V0UmVzdWx0KCk7Ci0gICAgfQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENsaXBEZXNjcmlwdGlvbiBzQ2xpcERlc2NyaXB0aW9uID0KKyAgICAgICAgICAgIG5ldyBDbGlwRGVzY3JpcHRpb24oIlRlc3RMYWJlbCIsIG5ldyBTdHJpbmdbXXsidGV4dC9wbGFpbiJ9KTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGlwRGF0YSBzQ2xpcERhdGEgPQorICAgICAgICAgICAgbmV3IENsaXBEYXRhKHNDbGlwRGVzY3JpcHRpb24sIG5ldyBDbGlwRGF0YS5JdGVtKCJUZXN0VGV4dCIpKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3Qgc0xvY2FsU3RhdGUgPSBuZXcgT2JqZWN0KCk7IC8vIGp1c3QgY2hlY2sgaWYgbnVsbCBvciBub3QKIAogICAgIGNsYXNzIExvZ0VudHJ5IHsKLSAgICAgICAgcHVibGljIFZpZXcgdjsKLSAgICAgICAgcHVibGljIERyYWdFdmVudCBldjsKKyAgICAgICAgcHVibGljIFZpZXcgdmlldzsKIAotICAgICAgICBwdWJsaWMgTG9nRW50cnkoVmlldyB2LCBEcmFnRXZlbnQgZXYpIHsKLSAgICAgICAgICAgIHRoaXMudiA9IHY7Ci0gICAgICAgICAgICB0aGlzLmV2ID0gRHJhZ0V2ZW50Lm9idGFpbihldik7CisgICAgICAgIC8vIFB1YmxpYyBEcmFnRXZlbnQgZmllbGRzCisgICAgICAgIHB1YmxpYyBpbnQgYWN0aW9uOyAvLyBEcmFnRXZlbnQuZ2V0QWN0aW9uKCkKKyAgICAgICAgcHVibGljIGZsb2F0IHg7IC8vIERyYWdFdmVudC5nZXRYKCkKKyAgICAgICAgcHVibGljIGZsb2F0IHk7IC8vIERyYWdFdmVudC5nZXRZKCkKKyAgICAgICAgcHVibGljIENsaXBEYXRhIGNsaXBEYXRhOyAvLyBEcmFnRXZlbnQuZ2V0Q2xpcERhdGEoKQorICAgICAgICBwdWJsaWMgQ2xpcERlc2NyaXB0aW9uIGNsaXBEZXNjcmlwdGlvbjsgLy8gRHJhZ0V2ZW50LmdldENsaXBEZXNjcmlwdGlvbigpCisgICAgICAgIHB1YmxpYyBPYmplY3QgbG9jYWxTdGF0ZTsgLy8gRHJhZ0V2ZW50LmdldExvY2FsU3RhdGUoKQorICAgICAgICBwdWJsaWMgYm9vbGVhbiByZXN1bHQ7IC8vIERyYWdFdmVudC5nZXRSZXN1bHQoKQorCisgICAgICAgIExvZ0VudHJ5KFZpZXcgdiwgaW50IGFjdGlvbiwgZmxvYXQgeCwgZmxvYXQgeSwgQ2xpcERhdGEgY2xpcERhdGEsCisgICAgICAgICAgICAgICAgQ2xpcERlc2NyaXB0aW9uIGNsaXBEZXNjcmlwdGlvbiwgT2JqZWN0IGxvY2FsU3RhdGUsIGJvb2xlYW4gcmVzdWx0KSB7CisgICAgICAgICAgICB0aGlzLnZpZXcgPSB2OworICAgICAgICAgICAgdGhpcy5hY3Rpb24gPSBhY3Rpb247CisgICAgICAgICAgICB0aGlzLnggPSB4OworICAgICAgICAgICAgdGhpcy55ID0geTsKKyAgICAgICAgICAgIHRoaXMuY2xpcERhdGEgPSBjbGlwRGF0YTsKKyAgICAgICAgICAgIHRoaXMuY2xpcERlc2NyaXB0aW9uID0gY2xpcERlc2NyaXB0aW9uOworICAgICAgICAgICAgdGhpcy5sb2NhbFN0YXRlID0gbG9jYWxTdGF0ZTsKKyAgICAgICAgICAgIHRoaXMucmVzdWx0ID0gcmVzdWx0OwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXEoTG9nRW50cnkgb3RoZXIpIHsKLSAgICAgICAgICAgIHJldHVybiB2ID09IG90aGVyLnYgJiYgZXF1YWwoZXYsIG90aGVyLmV2KTsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgICAgICBpZiAodGhpcyA9PSBvYmopIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIExvZ0VudHJ5KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIExvZ0VudHJ5IG90aGVyID0gKExvZ0VudHJ5KSBvYmo7CisgICAgICAgICAgICByZXR1cm4gdmlldyA9PSBvdGhlci52aWV3ICYmIGFjdGlvbiA9PSBvdGhlci5hY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgJiYgeCA9PSBvdGhlci54ICYmIHkgPT0gb3RoZXIueQorICAgICAgICAgICAgICAgICAgICAmJiBjb21wYXJlUGFyY2VsYWJsZXMoY2xpcERhdGEsIG90aGVyLmNsaXBEYXRhKQorICAgICAgICAgICAgICAgICAgICAmJiBjb21wYXJlUGFyY2VsYWJsZXMoY2xpcERlc2NyaXB0aW9uLCBvdGhlci5jbGlwRGVzY3JpcHRpb24pCisgICAgICAgICAgICAgICAgICAgICYmIGxvY2FsU3RhdGUgPT0gb3RoZXIubG9jYWxTdGF0ZQorICAgICAgICAgICAgICAgICAgICAmJiByZXN1bHQgPT0gb3RoZXIucmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiRHJhZ0V2ZW50IHthY3Rpb249IikuYXBwZW5kKGFjdGlvbikuYXBwZW5kKCIgeD0iKS5hcHBlbmQoeCkuYXBwZW5kKCIgeT0iKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKHkpLmFwcGVuZCgiIHJlc3VsdD0iKS5hcHBlbmQocmVzdWx0KS5hcHBlbmQoIn0iKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIgQCAiKS5hcHBlbmQodmlldyk7CisgICAgICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTI5LDE5ICsxNTEsMTggQEAKICAgICBmaW5hbCBwcml2YXRlIEFycmF5TGlzdDxMb2dFbnRyeT4gbUFjdHVhbCA9IG5ldyBBcnJheUxpc3Q8TG9nRW50cnk+ICgpOwogICAgIGZpbmFsIHByaXZhdGUgQXJyYXlMaXN0PExvZ0VudHJ5PiBtRXhwZWN0ZWQgPSBuZXcgQXJyYXlMaXN0PExvZ0VudHJ5PiAoKTsKIAotICAgIHByaXZhdGUgc3RhdGljIENsaXBEZXNjcmlwdGlvbiBjcmVhdGVDbGlwRGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ2xpcERlc2NyaXB0aW9uKCJUZXN0TGFiZWwiLCBuZXcgU3RyaW5nW117InRleHQvcGxhaW4ifSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgQ2xpcERhdGEgb2J0YWluQ2xpcERhdGEoaW50IGFjdGlvbikgeworICAgICAgICBpZiAoYWN0aW9uID09IERyYWdFdmVudC5BQ1RJT05fRFJPUCkgeworICAgICAgICAgICAgcmV0dXJuIHNDbGlwRGF0YTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBDbGlwRGF0YSBjcmVhdGVDbGlwRGF0YSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDbGlwRGF0YShjcmVhdGVDbGlwRGVzY3JpcHRpb24oKSwgbmV3IENsaXBEYXRhLkl0ZW0oIlRlc3RUZXh0IikpOwotICAgIH0KLQotICAgIHN0YXRpYyBwcml2YXRlIERyYWdFdmVudCBvYnRhaW5EcmFnRXZlbnQoaW50IGFjdGlvbiwgaW50IHgsIGludCB5LCBib29sZWFuIHJlc3VsdCkgewotICAgICAgICBmaW5hbCBDbGlwRGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPQotICAgICAgICAgICAgICAgIGFjdGlvbiAhPSBEcmFnRXZlbnQuQUNUSU9OX0RSQUdfRU5ERUQgPyBjcmVhdGVDbGlwRGVzY3JpcHRpb24oKSA6IG51bGw7Ci0gICAgICAgIGZpbmFsIENsaXBEYXRhIGRhdGEgPSBhY3Rpb24gPT0gRHJhZ0V2ZW50LkFDVElPTl9EUk9QID8gY3JlYXRlQ2xpcERhdGEoKSA6IG51bGw7Ci0gICAgICAgIHJldHVybiBEcmFnRXZlbnQub2J0YWluKGFjdGlvbiwgeCwgeSwgbnVsbCwgZGVzY3JpcHRpb24sIGRhdGEsIG51bGwsIHJlc3VsdCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgQ2xpcERlc2NyaXB0aW9uIG9idGFpbkNsaXBEZXNjcmlwdGlvbihpbnQgYWN0aW9uKSB7CisgICAgICAgIGlmIChhY3Rpb24gPT0gRHJhZ0V2ZW50LkFDVElPTl9EUkFHX0VOREVEKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc0NsaXBEZXNjcmlwdGlvbjsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgbG9nRXZlbnQoVmlldyB2LCBEcmFnRXZlbnQgZXYpIHsKQEAgLTE1MSwxOSArMTcyLDIzIEBACiAgICAgICAgIGlmIChldi5nZXRBY3Rpb24oKSA9PSBEcmFnRXZlbnQuQUNUSU9OX0RSQUdfRU5ERUQpIHsKICAgICAgICAgICAgIG1FbmRSZWNlaXZlZC5jb3VudERvd24oKTsKICAgICAgICAgfQotICAgICAgICBtQWN0dWFsLmFkZChuZXcgTG9nRW50cnkodiwgZXYpKTsKKyAgICAgICAgbUFjdHVhbC5hZGQobmV3IExvZ0VudHJ5KHYsIGV2LmdldEFjdGlvbigpLCBldi5nZXRYKCksIGV2LmdldFkoKSwgZXYuZ2V0Q2xpcERhdGEoKSwKKyAgICAgICAgICAgICAgICBldi5nZXRDbGlwRGVzY3JpcHRpb24oKSwgZXYuZ2V0TG9jYWxTdGF0ZSgpLCBldi5nZXRSZXN1bHQoKSkpOwogICAgIH0KIAogICAgIC8vIEFkZCBleHBlY3RlZCBldmVudCBmb3IgYSB2aWV3LCB3aXRoIHplcm8gY29vcmRpbmF0ZXMuCiAgICAgcHJpdmF0ZSB2b2lkIGV4cGVjdEV2ZW50NShpbnQgYWN0aW9uLCBpbnQgdmlld0lkKSB7CiAgICAgICAgIFZpZXcgdiA9IG1BY3Rpdml0eS5maW5kVmlld0J5SWQodmlld0lkKTsKLSAgICAgICAgbUV4cGVjdGVkLmFkZChuZXcgTG9nRW50cnkodiwgb2J0YWluRHJhZ0V2ZW50KGFjdGlvbiwgMCwgMCwgZmFsc2UpKSk7CisgICAgICAgIG1FeHBlY3RlZC5hZGQobmV3IExvZ0VudHJ5KHYsIGFjdGlvbiwgMCwgMCwgb2J0YWluQ2xpcERhdGEoYWN0aW9uKSwKKyAgICAgICAgICAgICAgICBvYnRhaW5DbGlwRGVzY3JpcHRpb24oYWN0aW9uKSwgc0xvY2FsU3RhdGUsIGZhbHNlKSk7CiAgICAgfQogCiAgICAgLy8gQWRkIGV4cGVjdGVkIGV2ZW50IGZvciBhIHZpZXcuCi0gICAgcHJpdmF0ZSB2b2lkIGV4cGVjdEVuZEV2ZW50KGludCB2aWV3SWQsIGludCB4LCBpbnQgeSwgYm9vbGVhbiByZXN1bHQpIHsKKyAgICBwcml2YXRlIHZvaWQgZXhwZWN0RW5kRXZlbnQoaW50IHZpZXdJZCwgZmxvYXQgeCwgZmxvYXQgeSwgYm9vbGVhbiByZXN1bHQpIHsKICAgICAgICAgVmlldyB2ID0gbUFjdGl2aXR5LmZpbmRWaWV3QnlJZCh2aWV3SWQpOwotICAgICAgICBtRXhwZWN0ZWQuYWRkKG5ldyBMb2dFbnRyeSh2LCBvYnRhaW5EcmFnRXZlbnQoRHJhZ0V2ZW50LkFDVElPTl9EUkFHX0VOREVELCB4LCB5LCByZXN1bHQpKSk7CisgICAgICAgIGludCBhY3Rpb24gPSBEcmFnRXZlbnQuQUNUSU9OX0RSQUdfRU5ERUQ7CisgICAgICAgIG1FeHBlY3RlZC5hZGQobmV3IExvZ0VudHJ5KHYsIGFjdGlvbiwgeCwgeSwgb2J0YWluQ2xpcERhdGEoYWN0aW9uKSwKKyAgICAgICAgICAgICAgICBvYnRhaW5DbGlwRGVzY3JpcHRpb24oYWN0aW9uKSwgc0xvY2FsU3RhdGUsIHJlc3VsdCkpOwogICAgIH0KIAogICAgIC8vIEFkZCBleHBlY3RlZCBzdWNjZXNzZnVsLWVuZCBldmVudCBmb3IgYSB2aWV3LgpAQCAtMTc2LDkgKzIwMSwxMiBAQAogICAgIHByaXZhdGUgdm9pZCBleHBlY3RFbmRFdmVudEZhaWx1cmU2KGludCB2aWV3SWQsIGludCByZWxlYXNlVmlld0lkKSB7CiAgICAgICAgIFZpZXcgdiA9IG1BY3Rpdml0eS5maW5kVmlld0J5SWQodmlld0lkKTsKICAgICAgICAgVmlldyByZWxlYXNlID0gbUFjdGl2aXR5LmZpbmRWaWV3QnlJZChyZWxlYXNlVmlld0lkKTsKLSAgICAgICAgaW50IFtdIHJlbGVhc2VMb2MgPSByZWxlYXNlLmdldExvY2F0aW9uT25TY3JlZW4oKTsKLSAgICAgICAgbUV4cGVjdGVkLmFkZChuZXcgTG9nRW50cnkodiwgb2J0YWluRHJhZ0V2ZW50KERyYWdFdmVudC5BQ1RJT05fRFJBR19FTkRFRCwKLSAgICAgICAgICAgICAgICByZWxlYXNlTG9jWzBdICsgNiwgcmVsZWFzZUxvY1sxXSArIDYsIGZhbHNlKSkpOworICAgICAgICBpbnQgW10gcmVsZWFzZUxvYyA9IG5ldyBpbnRbMl07CisgICAgICAgIHJlbGVhc2UuZ2V0TG9jYXRpb25PblNjcmVlbihyZWxlYXNlTG9jKTsKKyAgICAgICAgaW50IGFjdGlvbiA9IERyYWdFdmVudC5BQ1RJT05fRFJBR19FTkRFRDsKKyAgICAgICAgbUV4cGVjdGVkLmFkZChuZXcgTG9nRW50cnkodiwgYWN0aW9uLAorICAgICAgICAgICAgICAgIHJlbGVhc2VMb2NbMF0gKyA2LCByZWxlYXNlTG9jWzFdICsgNiwgb2J0YWluQ2xpcERhdGEoYWN0aW9uKSwKKyAgICAgICAgICAgICAgICBvYnRhaW5DbGlwRGVzY3JpcHRpb24oYWN0aW9uKSwgc0xvY2FsU3RhdGUsIGZhbHNlKSk7CiAgICAgfQogCiAgICAgLy8gQWRkIGV4cGVjdGVkIGV2ZW50IGZvciBhIHZpZXcsIHdpdGggY29vcmRpbmF0ZXMgb3ZlciB2aWV3IGxvY2F0aW9uVmlld0lkLCB3aXRoIHRoZSBzcGVjaWZpZWQKQEAgLTE4NiwxMSArMjE0LDE0IEBACiAgICAgcHJpdmF0ZSB2b2lkIGV4cGVjdEV2ZW50V2l0aE9mZnNldChpbnQgYWN0aW9uLCBpbnQgdmlld0lkLCBpbnQgbG9jYXRpb25WaWV3SWQsIGludCBvZmZzZXQpIHsKICAgICAgICAgVmlldyB2ID0gbUFjdGl2aXR5LmZpbmRWaWV3QnlJZCh2aWV3SWQpOwogICAgICAgICBWaWV3IGxvY2F0aW9uVmlldyA9IG1BY3Rpdml0eS5maW5kVmlld0J5SWQobG9jYXRpb25WaWV3SWQpOwotICAgICAgICBpbnQgW10gdmlld0xvY2F0aW9uID0gdi5nZXRMb2NhdGlvbk9uU2NyZWVuKCk7Ci0gICAgICAgIGludCBbXSBsb2NhdGlvblZpZXdMb2NhdGlvbiA9IGxvY2F0aW9uVmlldy5nZXRMb2NhdGlvbk9uU2NyZWVuKCk7Ci0gICAgICAgIG1FeHBlY3RlZC5hZGQobmV3IExvZ0VudHJ5KHYsIG9idGFpbkRyYWdFdmVudChhY3Rpb24sCisgICAgICAgIGludCBbXSB2aWV3TG9jYXRpb24gPSBuZXcgaW50WzJdOworICAgICAgICB2LmdldExvY2F0aW9uT25TY3JlZW4odmlld0xvY2F0aW9uKTsKKyAgICAgICAgaW50IFtdIGxvY2F0aW9uVmlld0xvY2F0aW9uID0gbmV3IGludFsyXTsKKyAgICAgICAgbG9jYXRpb25WaWV3LmdldExvY2F0aW9uT25TY3JlZW4obG9jYXRpb25WaWV3TG9jYXRpb24pOworICAgICAgICBtRXhwZWN0ZWQuYWRkKG5ldyBMb2dFbnRyeSh2LCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgbG9jYXRpb25WaWV3TG9jYXRpb25bMF0gLSB2aWV3TG9jYXRpb25bMF0gKyBvZmZzZXQsCi0gICAgICAgICAgICAgICAgbG9jYXRpb25WaWV3TG9jYXRpb25bMV0gLSB2aWV3TG9jYXRpb25bMV0gKyBvZmZzZXQsIGZhbHNlKSkpOworICAgICAgICAgICAgICAgIGxvY2F0aW9uVmlld0xvY2F0aW9uWzFdIC0gdmlld0xvY2F0aW9uWzFdICsgb2Zmc2V0LCBvYnRhaW5DbGlwRGF0YShhY3Rpb24pLAorICAgICAgICAgICAgICAgIG9idGFpbkNsaXBEZXNjcmlwdGlvbihhY3Rpb24pLCBzTG9jYWxTdGF0ZSwgZmFsc2UpKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgZXhwZWN0RXZlbnQ1KGludCBhY3Rpb24sIGludCB2aWV3SWQsIGludCBsb2NhdGlvblZpZXdJZCkgewpAQCAtMjA2LDcgKzIzNyw4IEBACiAgICAgcHJpdmF0ZSB2b2lkIGluamVjdE1vdXNlV2l0aE9mZnNldChpbnQgdmlld0lkLCBpbnQgYWN0aW9uLCBpbnQgb2Zmc2V0KSB7CiAgICAgICAgIHJ1bk9uTWFpbigoKSAtPiB7CiAgICAgICAgICAgICBWaWV3IHYgPSBtQWN0aXZpdHkuZmluZFZpZXdCeUlkKHZpZXdJZCk7Ci0gICAgICAgICAgICBpbnQgW10gZGVzdExvYyA9IHYuZ2V0TG9jYXRpb25PblNjcmVlbigpOworICAgICAgICAgICAgaW50IFtdIGRlc3RMb2MgPSBuZXcgaW50IFsyXTsKKyAgICAgICAgICAgIHYuZ2V0TG9jYXRpb25PblNjcmVlbihkZXN0TG9jKTsKICAgICAgICAgICAgIGxvbmcgZG93blRpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKICAgICAgICAgICAgIE1vdGlvbkV2ZW50IGV2ZW50ID0gTW90aW9uRXZlbnQub2J0YWluKGRvd25UaW1lLCBkb3duVGltZSwgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICBkZXN0TG9jWzBdICsgb2Zmc2V0LCBkZXN0TG9jWzFdICsgb2Zmc2V0LCAxKTsKQEAgLTI0MCw4ICsyNzIsNyBAQAogICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsb2cuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgICAgIExvZ0VudHJ5IGUgPSBsb2cuZ2V0KGkpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCIjIikuYXBwZW5kKGkgKyAxKS5hcHBlbmQoIjogIikuYXBwZW5kKGUuZXYpLmFwcGVuZCgiIEAgIikuCi0gICAgICAgICAgICAgICAgICAgIGFwcGVuZChlLnYudG9TdHJpbmcoKSkuYXBwZW5kKCdcbicpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIjIikuYXBwZW5kKGkgKyAxKS5hcHBlbmQoIjogIikuYXBwZW5kKGUpLmFwcGVuZCgnXG4nKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICAgICB9CkBAIC0yNjYsNyArMjk3LDcgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtQWN0dWFsLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFtQWN0dWFsLmdldChpKS5lcShtRXhwZWN0ZWQuZ2V0KGkpKSkgeworICAgICAgICAgICAgICAgIGlmICghbUFjdHVhbC5nZXQoaSkuZXF1YWxzKG1FeHBlY3RlZC5nZXQoaSkpKSB7CiAgICAgICAgICAgICAgICAgICAgIGZhaWxXaXRoTG9ncygiQWN0dWFsIGV2ZW50ICMiICsgKGkgKyAxKSArICIgaXMgZGlmZmVyZW50IGZyb20gZXhwZWN0ZWQiKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0zMTIsOCArMzQzLDE4IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgcnVuT25NYWluKFJ1bm5hYmxlIHJ1bm5lcikgewotICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLnJ1bk9uTWFpblN5bmMocnVubmVyKTsKKyAgICBwcml2YXRlIHZvaWQgcnVuT25NYWluKFJ1bm5hYmxlIHJ1bm5lcikgdGhyb3dzIEFzc2VydGlvbkVycm9yIHsKKyAgICAgICAgbU1haW5UaHJlYWRBc3NlcnRpb25FcnJvciA9IG51bGw7CisgICAgICAgIG1JbnN0cnVtZW50YXRpb24ucnVuT25NYWluU3luYygoKSAtPiB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJ1bm5lci5ydW4oKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEFzc2VydGlvbkVycm9yIGVycm9yKSB7CisgICAgICAgICAgICAgICAgbU1haW5UaHJlYWRBc3NlcnRpb25FcnJvciA9IGVycm9yOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgaWYgKG1NYWluVGhyZWFkQXNzZXJ0aW9uRXJyb3IgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbU1haW5UaHJlYWRBc3NlcnRpb25FcnJvcjsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBzdGFydERyYWcoKSB7CkBAIC0zMjQsNyArMzY1LDcgQEAKICAgICAgICAgICAgIC8vIFN0YXJ0IGRyYWcuCiAgICAgICAgICAgICBWaWV3IHYgPSBtQWN0aXZpdHkuZmluZFZpZXdCeUlkKFIuaWQuZHJhZ2dhYmxlKTsKICAgICAgICAgICAgIGFzc2VydFRydWUoIkNvdWxkbid0IHN0YXJ0IGRyYWciLAotICAgICAgICAgICAgICAgICAgICB2LnN0YXJ0RHJhZ0FuZERyb3AoY3JlYXRlQ2xpcERhdGEoKSwgbmV3IFZpZXcuRHJhZ1NoYWRvd0J1aWxkZXIodiksIG51bGwsIDApKTsKKyAgICAgICAgICAgICAgICAgICAgdi5zdGFydERyYWdBbmREcm9wKHNDbGlwRGF0YSwgbmV3IFZpZXcuRHJhZ1NoYWRvd0J1aWxkZXIodiksIHNMb2NhbFN0YXRlLCAwKSk7CiAgICAgICAgIH0pOwogCiAgICAgICAgIHRyeSB7CkBAIC01ODgsNiArNjI5LDExIEBACiAgICAgICAgIHZlcmlmeUV2ZW50TG9nKCk7CiAgICAgfQogCisgICAgcHJpdmF0ZSBib29sZWFuIGRyYXdhYmxlU3RhdGVDb250YWlucyhpbnQgcmVzb3VyY2VJZCwgaW50IGF0dHIpIHsKKyAgICAgICAgcmV0dXJuIEludFN0cmVhbS5vZihtQWN0aXZpdHkuZmluZFZpZXdCeUlkKHJlc291cmNlSWQpLmdldERyYXdhYmxlU3RhdGUoKSkKKyAgICAgICAgICAgICAgICAuYW55TWF0Y2goeCAtPiB4ID09IGF0dHIpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIFRlc3RzIHRoYXQgc3RhdGVfZHJhZ19ob3ZlcmVkIGFuZCBzdGF0ZV9kcmFnX2Nhbl9hY2NlcHQgYXJlIHNldCBjb3JyZWN0bHkuCiAgICAgICovCkBAIC02MDMsNTIgKzY0OSwzOCBAQAogICAgICAgICAgICAgICAgIGxvZ0V2ZW50KHYsIGV2KTsKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgYXNzZXJ0RmFsc2UoQXJyYXlVdGlscy5jb250YWlucygKLSAgICAgICAgICAgICAgICAgICAgbUFjdGl2aXR5LmZpbmRWaWV3QnlJZChSLmlkLmlubmVyKS5nZXREcmF3YWJsZVN0YXRlKCksCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5hdHRyLnN0YXRlX2RyYWdfY2FuX2FjY2VwdCkpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoZHJhd2FibGVTdGF0ZUNvbnRhaW5zKFIuaWQuaW5uZXIsIGFuZHJvaWQuUi5hdHRyLnN0YXRlX2RyYWdfY2FuX2FjY2VwdCkpOwogICAgICAgICB9KTsKIAogICAgICAgICBzdGFydERyYWcoKTsKIAogICAgICAgICBydW5Pbk1haW4oKCkgLT4gewotICAgICAgICAgICAgYXNzZXJ0RmFsc2UoQXJyYXlVdGlscy5jb250YWlucygKLSAgICAgICAgICAgICAgICAgICAgbUFjdGl2aXR5LmZpbmRWaWV3QnlJZChSLmlkLmlubmVyKS5nZXREcmF3YWJsZVN0YXRlKCksCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5hdHRyLnN0YXRlX2RyYWdfaG92ZXJlZCkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheVV0aWxzLmNvbnRhaW5zKAotICAgICAgICAgICAgICAgICAgICBtQWN0aXZpdHkuZmluZFZpZXdCeUlkKFIuaWQuaW5uZXIpLmdldERyYXdhYmxlU3RhdGUoKSwKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5SLmF0dHIuc3RhdGVfZHJhZ19jYW5fYWNjZXB0KSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShkcmF3YWJsZVN0YXRlQ29udGFpbnMoUi5pZC5pbm5lciwgYW5kcm9pZC5SLmF0dHIuc3RhdGVfZHJhZ19ob3ZlcmVkKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGRyYXdhYmxlU3RhdGVDb250YWlucyhSLmlkLmlubmVyLCBhbmRyb2lkLlIuYXR0ci5zdGF0ZV9kcmFnX2Nhbl9hY2NlcHQpKTsKICAgICAgICAgfSk7CiAKICAgICAgICAgLy8gTW92ZSBtb3VzZSBpbnRvIHRoZSB2aWV3LgogICAgICAgICBpbmplY3RNb3VzZTUoUi5pZC5pbm5lciwgTW90aW9uRXZlbnQuQUNUSU9OX01PVkUpOwogICAgICAgICBydW5Pbk1haW4oKCkgLT4gewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheVV0aWxzLmNvbnRhaW5zKAotICAgICAgICAgICAgICAgICAgICBtQWN0aXZpdHkuZmluZFZpZXdCeUlkKFIuaWQuaW5uZXIpLmdldERyYXdhYmxlU3RhdGUoKSwKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5SLmF0dHIuc3RhdGVfZHJhZ19ob3ZlcmVkKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGRyYXdhYmxlU3RhdGVDb250YWlucyhSLmlkLmlubmVyLCBhbmRyb2lkLlIuYXR0ci5zdGF0ZV9kcmFnX2hvdmVyZWQpKTsKICAgICAgICAgfSk7CiAKICAgICAgICAgLy8gTW92ZSBvdXQuCiAgICAgICAgIGluamVjdE1vdXNlNShSLmlkLnN1YmNvbnRhaW5lciwgTW90aW9uRXZlbnQuQUNUSU9OX01PVkUpOwogICAgICAgICBydW5Pbk1haW4oKCkgLT4gewotICAgICAgICAgICAgYXNzZXJ0RmFsc2UoQXJyYXlVdGlscy5jb250YWlucygKLSAgICAgICAgICAgICAgICAgICAgbUFjdGl2aXR5LmZpbmRWaWV3QnlJZChSLmlkLmlubmVyKS5nZXREcmF3YWJsZVN0YXRlKCksCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5hdHRyLnN0YXRlX2RyYWdfaG92ZXJlZCkpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoZHJhd2FibGVTdGF0ZUNvbnRhaW5zKFIuaWQuaW5uZXIsIGFuZHJvaWQuUi5hdHRyLnN0YXRlX2RyYWdfaG92ZXJlZCkpOwogICAgICAgICB9KTsKIAogICAgICAgICAvLyBNb3ZlIGluLgogICAgICAgICBpbmplY3RNb3VzZTUoUi5pZC5pbm5lciwgTW90aW9uRXZlbnQuQUNUSU9OX01PVkUpOwogICAgICAgICBydW5Pbk1haW4oKCkgLT4gewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheVV0aWxzLmNvbnRhaW5zKAotICAgICAgICAgICAgICAgICAgICBtQWN0aXZpdHkuZmluZFZpZXdCeUlkKFIuaWQuaW5uZXIpLmdldERyYXdhYmxlU3RhdGUoKSwKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5SLmF0dHIuc3RhdGVfZHJhZ19ob3ZlcmVkKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGRyYXdhYmxlU3RhdGVDb250YWlucyhSLmlkLmlubmVyLCBhbmRyb2lkLlIuYXR0ci5zdGF0ZV9kcmFnX2hvdmVyZWQpKTsKICAgICAgICAgfSk7CiAKICAgICAgICAgLy8gUmVsZWFzZSB0aGVyZS4KICAgICAgICAgaW5qZWN0TW91c2U1KFIuaWQuaW5uZXIsIE1vdGlvbkV2ZW50LkFDVElPTl9VUCk7CiAgICAgICAgIHJ1bk9uTWFpbigoKSAtPiB7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZShBcnJheVV0aWxzLmNvbnRhaW5zKAotICAgICAgICAgICAgICAgICAgICBtQWN0aXZpdHkuZmluZFZpZXdCeUlkKFIuaWQuaW5uZXIpLmdldERyYXdhYmxlU3RhdGUoKSwKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5SLmF0dHIuc3RhdGVfZHJhZ19ob3ZlcmVkKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShkcmF3YWJsZVN0YXRlQ29udGFpbnMoUi5pZC5pbm5lciwgYW5kcm9pZC5SLmF0dHIuc3RhdGVfZHJhZ19ob3ZlcmVkKSk7CiAgICAgICAgIH0pOwogICAgIH0KIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL0ZvY3VzRmluZGVyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9Gb2N1c0ZpbmRlclRlc3QuamF2YQppbmRleCAwZjIxMTllLi4xMWU5MjFhIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL0ZvY3VzRmluZGVyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvRm9jdXNGaW5kZXJUZXN0LmphdmEKQEAgLTIyLDEwICsyMiw2IEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudmlldy5Gb2N1c0ZpbmRlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CkBAIC0zMyw2ICsyOSwxMSBAQAogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CkBAIC0xMjEsMTMgKzEyMiwxNCBAQAogICAgICAgICAgKiB8ICAgfCAgIHwKICAgICAgICAgICogKy0tLSstLS0rCiAgICAgICAgICAqLwotICAgICAgICBSZWN0IHJlY3QgPSBuZXcgUmVjdCgpOwotICAgICAgICBtVG9wTGVmdC5nZXREcmF3aW5nUmVjdChyZWN0KTsKLSAgICAgICAgcmVjdC5vZmZzZXQobVRvcExlZnQuZ2V0V2lkdGgoKSAvIDIsIDApOwotICAgICAgICByZWN0Lmluc2V0KG1Ub3BMZWZ0LmdldFdpZHRoKCkgLyA0LCBtVG9wTGVmdC5nZXRIZWlnaHQoKSAvIDQpOworICAgICAgICBpbnQgYnV0dG9uSGFsZldpZHRoID0gbVRvcExlZnQuZ2V0V2lkdGgoKSAvIDI7CisgICAgICAgIFJlY3QgdG9wUmVjdCA9IG5ldyBSZWN0KG1Ub3BMZWZ0LmdldExlZnQoKSArIGJ1dHRvbkhhbGZXaWR0aCwKKyAgICAgICAgICAgICAgICBtVG9wTGVmdC5nZXRUb3AoKSwKKyAgICAgICAgICAgICAgICBtVG9wTGVmdC5nZXRSaWdodCgpICsgYnV0dG9uSGFsZldpZHRoLAorICAgICAgICAgICAgICAgIG1Ub3BMZWZ0LmdldEJvdHRvbSgpKTsKIAotICAgICAgICB2ZXJpZnl0TmV4dEZvY3VzRnJvbVJlY3QocmVjdCwgVmlldy5GT0NVU19MRUZULCBtVG9wTGVmdCk7Ci0gICAgICAgIHZlcmlmeXROZXh0Rm9jdXNGcm9tUmVjdChyZWN0LCBWaWV3LkZPQ1VTX1JJR0hULCBtVG9wUmlnaHQpOworICAgICAgICB2ZXJpZnl0TmV4dEZvY3VzRnJvbVJlY3QodG9wUmVjdCwgVmlldy5GT0NVU19MRUZULCBtVG9wTGVmdCk7CisgICAgICAgIHZlcmlmeXROZXh0Rm9jdXNGcm9tUmVjdCh0b3BSZWN0LCBWaWV3LkZPQ1VTX1JJR0hULCBtVG9wUmlnaHQpOwogCiAgICAgICAgIC8qCiAgICAgICAgICAqIENyZWF0ZSBhIHNtYWxsIHJlY3RhbmdsZSBvbiB0aGUgYm9yZGVyIGJldHdlZW4gdGhlIHRvcCBsZWZ0IGFuZCBib3R0b20gbGVmdCBidXR0b25zLgpAQCAtMTM4LDEyICsxNDAsMTQgQEAKICAgICAgICAgICogfCAgIHwgICB8CiAgICAgICAgICAqICstLS0rLS0tKwogICAgICAgICAgKi8KLSAgICAgICAgbVRvcExlZnQuZ2V0RHJhd2luZ1JlY3QocmVjdCk7Ci0gICAgICAgIHJlY3Qub2Zmc2V0KDAsIG1Ub3BSaWdodC5nZXRIZWlnaHQoKSAvIDIpOwotICAgICAgICByZWN0Lmluc2V0KG1Ub3BMZWZ0LmdldFdpZHRoKCkgLyA0LCBtVG9wTGVmdC5nZXRIZWlnaHQoKSAvIDQpOworICAgICAgICBpbnQgYnV0dG9uSGFsZkhlaWdodCA9IG1Ub3BMZWZ0LmdldEhlaWdodCgpIC8gMjsKKyAgICAgICAgUmVjdCBsZWZ0UmVjdCA9IG5ldyBSZWN0KG1Ub3BMZWZ0LmdldExlZnQoKSwKKyAgICAgICAgICAgICAgICAgbVRvcExlZnQuZ2V0VG9wKCkgKyBidXR0b25IYWxmSGVpZ2h0LAorICAgICAgICAgICAgICAgICBtVG9wTGVmdC5nZXRSaWdodCgpLAorICAgICAgICAgICAgICAgICBtVG9wTGVmdC5nZXRCb3R0b20oKSArIGJ1dHRvbkhhbGZIZWlnaHQpOwogCi0gICAgICAgIHZlcmlmeXROZXh0Rm9jdXNGcm9tUmVjdChyZWN0LCBWaWV3LkZPQ1VTX1VQLCBtVG9wTGVmdCk7Ci0gICAgICAgIHZlcmlmeXROZXh0Rm9jdXNGcm9tUmVjdChyZWN0LCBWaWV3LkZPQ1VTX0RPV04sIG1Cb3R0b21MZWZ0KTsKKyAgICAgICAgdmVyaWZ5dE5leHRGb2N1c0Zyb21SZWN0KGxlZnRSZWN0LCBWaWV3LkZPQ1VTX1VQLCBtVG9wTGVmdCk7CisgICAgICAgIHZlcmlmeXROZXh0Rm9jdXNGcm9tUmVjdChsZWZ0UmVjdCwgVmlldy5GT0NVU19ET1dOLCBtQm90dG9tTGVmdCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeXROZXh0Rm9jdXNGcm9tUmVjdChSZWN0IHJlY3QsIGludCBkaXJlY3Rpb24sIFZpZXcgZXhwZWN0ZWROZXh0Rm9jdXMpIHsKQEAgLTQyNiw3ICs0MzAsNiBAQAogCiAgICAgICAgIC8vIFdoaWxlIHdlIGRvbid0IHdhbnQgdG8gdGVzdCBkZXRhaWxzLCB3ZSBzaG91bGQgYXQgbGVhc3QgdmVyaWZ5IGJhc2ljIGNvcnJlY3RuZXNzCiAgICAgICAgIC8vIGxpa2UgImxlZnQtdG8tcmlnaHQiIG9yZGVyaW5nIGluIHdlbGwtYmVoYXZlZCBsYXlvdXRzCi0gICAgICAgIGFzc2VydEVxdWFscyhtTGF5b3V0LmZpbmRGb2N1cygpLCBtVG9wTGVmdCk7CiAgICAgICAgIHZlcmlmeU5leHRGb2N1cyhtVG9wTGVmdCwgVmlldy5GT0NVU19GT1JXQVJELCBtVG9wUmlnaHQpOwogICAgICAgICB2ZXJpZnlOZXh0Rm9jdXMobVRvcFJpZ2h0LCBWaWV3LkZPQ1VTX0ZPUldBUkQsIG1Cb3R0b21MZWZ0KTsKICAgICAgICAgdmVyaWZ5TmV4dEZvY3VzKG1Cb3R0b21MZWZ0LCBWaWV3LkZPQ1VTX0ZPUldBUkQsIG1Cb3R0b21SaWdodCk7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL0ZyYW1lTWV0cmljc0xpc3RlbmVyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9GcmFtZU1ldHJpY3NMaXN0ZW5lclRlc3QuamF2YQppbmRleCBmYmFjNjBmLi4xZDc0MWFhIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL0ZyYW1lTWV0cmljc0xpc3RlbmVyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvRnJhbWVNZXRyaWNzTGlzdGVuZXJUZXN0LmphdmEKQEAgLTI1LDE0ICsyNSwxNSBAQAogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlclRocmVhZDsKIGltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkZyYW1lTWV0cmljczsKIGltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNjcm9sbFZpZXc7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlBvbGxpbmdDaGVjazsKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLldpZGdldFRlc3RVdGlsczsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9HZXN0dXJlRGV0ZWN0b3JUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL0dlc3R1cmVEZXRlY3RvclRlc3QuamF2YQppbmRleCBhOWViN2I0Li45YTFlNTZiIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL0dlc3R1cmVEZXRlY3RvclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL0dlc3R1cmVEZXRlY3RvclRlc3QuamF2YQpAQCAtMjYsMTQgKzI2LDE1IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuR2VzdHVyZURldGVjdG9yOwogaW1wb3J0IGFuZHJvaWQudmlldy5HZXN0dXJlRGV0ZWN0b3IuU2ltcGxlT25HZXN0dXJlTGlzdGVuZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvR3Jhdml0eVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvR3Jhdml0eVRlc3QuamF2YQppbmRleCBjY2QzOTIxLi44NzVkM2E3IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL0dyYXZpdHlUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9HcmF2aXR5VGVzdC5qYXZhCkBAIC0yMSwxMSArMjEsMTIgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL0hvdmVyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9Ib3ZlclRlc3QuamF2YQppbmRleCBkMzczNGM4Li4wMzZiNTI1IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL0hvdmVyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvSG92ZXJUZXN0LmphdmEKQEAgLTMwLDE0ICszMCwxNSBAQAogCiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CiBpbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DdHNNb3VzZVV0aWwuQWN0aW9uTWF0Y2hlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkN0c01vdXNlVXRpbC5Qb3NpdGlvbk1hdGNoZXI7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvSW5mbGF0ZUV4Y2VwdGlvblRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvSW5mbGF0ZUV4Y2VwdGlvblRlc3QuamF2YQppbmRleCAyMjUxMjEwLi4yNjZlM2I0IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL0luZmxhdGVFeGNlcHRpb25UZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9JbmZsYXRlRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0xOCwxMCArMTgsMTEgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRTYW1lOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuSW5mbGF0ZUV4Y2VwdGlvbjsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9JbnB1dERldmljZUVuYWJsZWRUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL0lucHV0RGV2aWNlRW5hYmxlZFRlc3QuamF2YQppbmRleCA5YTk2MGUyLi5jN2Y2NTkxIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL0lucHV0RGV2aWNlRW5hYmxlZFRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL0lucHV0RGV2aWNlRW5hYmxlZFRlc3QuamF2YQpAQCAtMjEsMTEgKzIxLDEyIEBACiAKIGltcG9ydCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb247CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5pbnB1dC5JbnB1dE1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LklucHV0RGV2aWNlOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvS2V5Q2hhcmFjdGVyTWFwVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9LZXlDaGFyYWN0ZXJNYXBUZXN0LmphdmEKaW5kZXggMmJhNzk3Mi4uZWZkZmQ2NyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9LZXlDaGFyYWN0ZXJNYXBUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9LZXlDaGFyYWN0ZXJNYXBUZXN0LmphdmEKQEAgLTIyLDIwICsyMiwxOCBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIAotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUNoYXJhY3Rlck1hcDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5Q2hhcmFjdGVyTWFwLktleURhdGE7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DZGRUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCi1AQ2RkVGVzdChyZXF1aXJlbWVudD0iNy4yLjMvSC0wLTEsVC0wLTEsQS0wLTEsNy4yLjEvQy0xLTMiKQogQFNtYWxsVGVzdAogQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKIHB1YmxpYyBjbGFzcyBLZXlDaGFyYWN0ZXJNYXBUZXN0IHsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvS2V5RXZlbnRJbnRlcmNlcHRUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL0tleUV2ZW50SW50ZXJjZXB0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ODk5NWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL0tleUV2ZW50SW50ZXJjZXB0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnZpZXcuY3RzOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5VaUF1dG9tYXRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlBvbGxpbmdDaGVjazsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKKy8qKgorICogQ2VydGFpbiBLZXlFdmVudHMgc2hvdWxkIG5ldmVyIGJlIGRlbGl2ZXJlZCB0byBhcHBzLiBUaGVzZSBrZXlzIGFyZToKKyAqICAgICAgS0VZQ09ERV9BU1NJU1QKKyAqICAgICAgS0VZQ09ERV9WT0lDRV9BU1NJU1QKKyAqICAgICAgS0VZQ09ERV9IT01FCisgKiBUaGlzIHRlc3QgbGF1bmNoZXMgYW4gQWN0aXZpdHkgYW5kIGluamVjdCBLZXlFdmVudHMgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBrZXkgY29kZXMuCisgKiBUaGUgdGVzdCB3aWxsIGZhaWwgaWYgYW55IG9mIHRoZXNlIGtleXMgYXJlIHJlY2VpdmVkIGJ5IHRoZSBhY3Rpdml0eS4KKyAqIE5vdGU6IFRoZSBBU1NJU1QgdGVzdHMgd2VyZSByZW1vdmVkIGJlY2F1c2UgdGhleSBjYXVzZWQgYSBzaWRlLWVmZmVjdCBvZiBsYXVuY2hpbmcgdGhlCisgKiBhc3Npc3RhbnQgYXN5bmNocm9ub3VzbHkgKGFzIGludGVuZGVkKSwgd2hpY2ggY2F1c2VzIHByb2JsZW1zIHdpdGggdGVzdHMgd2hpY2ggaGFwcGVuIHRvCisgKiBiZSBydW5uaW5nIGxhdGVyIGFuZCBsb3NlIGZvY3VzL3Zpc2liaWxpdHkgYmVjYXVzZSBvZiB0aGF0IGV4dHJhIHdpbmRvdy4KKyAqLworQE1lZGl1bVRlc3QKK0BSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgS2V5RXZlbnRJbnRlcmNlcHRUZXN0IHsKKyAgICBwcml2YXRlIEtleUV2ZW50SW50ZXJjZXB0VGVzdEFjdGl2aXR5IG1BY3Rpdml0eTsKKyAgICBwcml2YXRlIEluc3RydW1lbnRhdGlvbiBtSW5zdHJ1bWVudGF0aW9uOworCisgICAgQFJ1bGUKKyAgICBwdWJsaWMgQWN0aXZpdHlUZXN0UnVsZTxLZXlFdmVudEludGVyY2VwdFRlc3RBY3Rpdml0eT4gbUFjdGl2aXR5UnVsZSA9CisgICAgICAgICAgICBuZXcgQWN0aXZpdHlUZXN0UnVsZTw+KEtleUV2ZW50SW50ZXJjZXB0VGVzdEFjdGl2aXR5LmNsYXNzKTsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXR1cCgpIHsKKyAgICAgICAgbUluc3RydW1lbnRhdGlvbiA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpOworICAgICAgICBtQWN0aXZpdHkgPSBtQWN0aXZpdHlSdWxlLmdldEFjdGl2aXR5KCk7CisgICAgICAgIFBvbGxpbmdDaGVjay53YWl0Rm9yKG1BY3Rpdml0eTo6aGFzV2luZG93Rm9jdXMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEtleUNvZGVIb21lKCkgeworICAgICAgICB0ZXN0S2V5KEtleUV2ZW50LktFWUNPREVfSE9NRSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RLZXkoaW50IGtleUNvZGUpIHsKKyAgICAgICAgc2VuZEtleShrZXlDb2RlKTsKKyAgICAgICAgYXNzZXJ0S2V5Tm90UmVjZWl2ZWQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2VuZEtleShpbnQga2V5Q29kZVRvU2VuZCkgeworICAgICAgICBsb25nIGRvd25UaW1lID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CisgICAgICAgIGluamVjdEV2ZW50KG5ldyBLZXlFdmVudChkb3duVGltZSwgZG93blRpbWUsIEtleUV2ZW50LkFDVElPTl9ET1dOLAorICAgICAgICAgICAgICAgIGtleUNvZGVUb1NlbmQsIDAsIDApKTsKKyAgICAgICAgaW5qZWN0RXZlbnQobmV3IEtleUV2ZW50KGRvd25UaW1lLCBkb3duVGltZSArIDEsIEtleUV2ZW50LkFDVElPTl9VUCwKKyAgICAgICAgICAgICAgICBrZXlDb2RlVG9TZW5kLCAwLCAwKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluamVjdEV2ZW50KEtleUV2ZW50IGV2ZW50KSB7CisgICAgICAgIGZpbmFsIFVpQXV0b21hdGlvbiBhdXRvbWF0aW9uID0gbUluc3RydW1lbnRhdGlvbi5nZXRVaUF1dG9tYXRpb24oKTsKKyAgICAgICAgYXV0b21hdGlvbi5pbmplY3RJbnB1dEV2ZW50KGV2ZW50LCB0cnVlKTsKKyAgICAgICAgZXZlbnQucmVjeWNsZSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRLZXlOb3RSZWNlaXZlZCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEtleUV2ZW50IGtleUV2ZW50ID0gbUFjdGl2aXR5Lm1LZXlFdmVudHMucG9sbCgxLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICAgICAgICAgIGlmIChrZXlFdmVudCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmFpbCgiU2hvdWxkIG5vdCBoYXZlIHJlY2VpdmVkICIgKyBLZXlFdmVudC5rZXlDb2RlVG9TdHJpbmcoa2V5RXZlbnQuZ2V0S2V5Q29kZSgpKSk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBmYWlsKCJCbG9ja2luZ1F1ZXVlLnBvbGwoLi4pIHdhcyB1bmV4cGVjdGVkbHkgaW50ZXJydXB0ZWQiKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvS2V5RXZlbnRJbnRlcmNlcHRUZXN0QWN0aXZpdHkuamF2YSBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvS2V5RXZlbnRJbnRlcmNlcHRUZXN0QWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGUwNzEzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9LZXlFdmVudEludGVyY2VwdFRlc3RBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudmlldy5jdHM7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5CbG9ja2luZ1F1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkxpbmtlZEJsb2NraW5nRGVxdWU7CisKK3B1YmxpYyBjbGFzcyBLZXlFdmVudEludGVyY2VwdFRlc3RBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBmaW5hbCBCbG9ja2luZ1F1ZXVlPEtleUV2ZW50PiBtS2V5RXZlbnRzID0gbmV3IExpbmtlZEJsb2NraW5nRGVxdWU8PigpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25LZXlEb3duKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgeworICAgICAgICBtS2V5RXZlbnRzLmFkZChldmVudCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uS2V5VXAoaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KSB7CisgICAgICAgIC8vIENoZWNrIHRoaXMgaW4gY2FzZSBzb21lIHNwdXJpb3VzIGV2ZW50IHdpdGggQUNUSU9OX1VQIGlzIHJlY2VpdmVkCisgICAgICAgIG1LZXlFdmVudHMuYWRkKGV2ZW50KTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9LZXlFdmVudFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvS2V5RXZlbnRUZXN0LmphdmEKaW5kZXggNjY2ZTU4NS4uNDc0MzAxZiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9LZXlFdmVudFRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL0tleUV2ZW50VGVzdC5qYXZhCkBAIC0zMywxNSArMzMsMTQgQEAKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnRleHQubWV0aG9kLk1ldGFLZXlLZXlMaXN0ZW5lcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuSW5wdXREZXZpY2U7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUNoYXJhY3Rlck1hcDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5Q2hhcmFjdGVyTWFwLktleURhdGE7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DZGRUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7CiAKQEAgLTUxNiw3ICs1MTUsNiBAQAogICAgICAgICBhc3NlcnRUcnVlKG1LZXlFdmVudC5nZXREaXNwbGF5TGFiZWwoKSA+IDApOwogICAgIH0KIAotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjIuMy9ILTAtMSxULTAtMSxBLTAtMSIpCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0SXNTeXN0ZW0oKSB7CiAgICAgICAgIG1LZXlFdmVudCA9IG5ldyBLZXlFdmVudChLZXlFdmVudC5BQ1RJT05fRE9XTiwgS2V5RXZlbnQuS0VZQ09ERV9NRU5VKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvS2V5Ym9hcmRTaG9ydGN1dEdyb3VwVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9LZXlib2FyZFNob3J0Y3V0R3JvdXBUZXN0LmphdmEKaW5kZXggZThlNzY0YS4uNGViZmNlNiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9LZXlib2FyZFNob3J0Y3V0R3JvdXBUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9LZXlib2FyZFNob3J0Y3V0R3JvdXBUZXN0LmphdmEKQEAgLTIxLDEyICsyMSwxMyBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleWJvYXJkU2hvcnRjdXRHcm91cDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5Ym9hcmRTaG9ydGN1dEluZm87CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvS2V5Ym9hcmRTaG9ydGN1dEluZm9UZXN0LmphdmEgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL0tleWJvYXJkU2hvcnRjdXRJbmZvVGVzdC5qYXZhCmluZGV4IGIyZTgwOWQuLjM4MTFiNzMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvS2V5Ym9hcmRTaG9ydGN1dEluZm9UZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9LZXlib2FyZFNob3J0Y3V0SW5mb1Rlc3QuamF2YQpAQCAtMTksMTEgKzE5LDEyIEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKIAogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5Ym9hcmRTaG9ydGN1dEluZm87CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvTGF5b3V0SW5mbGF0ZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL0xheW91dEluZmxhdGVyVGVzdC5qYXZhCmluZGV4IDM0NjA1MjUuLjQ4Yjc5YTYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvTGF5b3V0SW5mbGF0ZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9MYXlvdXRJbmZsYXRlclRlc3QuamF2YQpAQCAtMzEsOSArMzEsNiBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzLlRoZW1lOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuWG1sUmVzb3VyY2VQYXJzZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOwpAQCAtNDgsNiArNDUsMTAgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuY3RzLnV0aWwuWG1sVXRpbHM7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvTG9uZ1ByZXNzQmFja1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvTG9uZ1ByZXNzQmFja1Rlc3QuamF2YQppbmRleCA4ZjFiMTk5Li43YjYzZTQxIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL0xvbmdQcmVzc0JhY2tUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9Mb25nUHJlc3NCYWNrVGVzdC5qYXZhCkBAIC0yMiwxNCArMjIsMTMgQEAKIGltcG9ydCBhbmRyb2lkLmFwcC5VaUF1dG9tYXRpb247CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5MYXJnZVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0NvbmZpZ3VyYXRpb247CiAKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkNkZFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTGFyZ2VUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwpAQCAtNTQsNyArNTMsNiBAQAogICAgICAqIFRlc3RzIHRvIGVuc3VyZSB0aGF0IHRoZSBmb3JlZ3JvdW5kZWQgYXBwIGNhbiBoYW5kbGUgYSBsb25nLXByZXNzIG9uIHRoZSBiYWNrIGJ1dHRvbiBvbgogICAgICAqIG5vbi13YXRjaCBkZXZpY2VzCiAgICAgICovCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuMi4zL0gtMC0yLFQtMC0yIikKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBJc05vdERpc21pc3NlZCgpIHsKICAgICAgICAgLy8gT25seSBydW4gZm9yIG5vbi13YXRjaCBkZXZpY2VzCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL01lbnVJbmZsYXRlclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvTWVudUluZmxhdGVyVGVzdC5qYXZhCmluZGV4IDQwZDk1ZjcuLmZkM2ExMDUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvTWVudUluZmxhdGVyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvTWVudUluZmxhdGVyVGVzdC5qYXZhCkBAIC0yNSwxMiArMjUsOCBAQAogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkltYWdlRGVjb2RlcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkJpdG1hcERyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OwogaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SW5mbGF0ZXI7CkBAIC0zOCw4ICszNCwxNSBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5TdWJNZW51OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlBvcHVwTWVudTsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuV2lkZ2V0VGVzdFV0aWxzOwogCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKKwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CkBAIC0zMjQsNyArMzI3LDE0IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeURyYXdhYmxlQ29udGVudChCaXRtYXBEcmF3YWJsZSBiLCBpbnQgcmVzSWQpIHsKLSAgICAgICAgQml0bWFwIGV4cGVjdGVkID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShtQWN0aXZpdHkuZ2V0UmVzb3VyY2VzKCksIHJlc0lkKTsKLSAgICAgICAgV2lkZ2V0VGVzdFV0aWxzLmFzc2VydEVxdWFscyhleHBlY3RlZCwgYi5nZXRCaXRtYXAoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJbWFnZURlY29kZXIuU291cmNlIHNyYyA9IEltYWdlRGVjb2Rlci5jcmVhdGVTb3VyY2UobUFjdGl2aXR5LmdldFJlc291cmNlcygpLCByZXNJZCk7CisgICAgICAgICAgICBCaXRtYXAgZXhwZWN0ZWQgPSBJbWFnZURlY29kZXIuZGVjb2RlQml0bWFwKHNyYywgKGRlY29kZXIsIGluZm8sIHMpIC0+IHsKKyAgICAgICAgICAgICAgICBkZWNvZGVyLnNldEFsbG9jYXRvcihJbWFnZURlY29kZXIuQUxMT0NBVE9SX1NPRlRXQVJFKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgV2lkZ2V0VGVzdFV0aWxzLmFzc2VydEVxdWFscyhleHBlY3RlZCwgYi5nZXRCaXRtYXAoKSk7CisgICAgICAgIH0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgQXNzZXJ0LmZhaWwoInRoZSByZXNvdXJjZSBjb3VsZCBub3QgYmUgZGVjb2RlZCIpOworICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9NZW51SXRlbVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvTWVudUl0ZW1UZXN0LmphdmEKaW5kZXggYzlkMzYyYy4uMWI4ZWMwZCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9NZW51SXRlbVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL01lbnVJdGVtVGVzdC5qYXZhCkBAIC0yNCwxNCArMjQsMTUgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbG9yU3RhdGVMaXN0OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3I7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9NZW51VGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9NZW51VGVzdC5qYXZhCmluZGV4IDI0YWY3YmQuLjgyZWUyZmUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvTWVudVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL01lbnVUZXN0LmphdmEKQEAgLTIxLDE2ICsyMSwxNyBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OwogaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SW5mbGF0ZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlBvcHVwTWVudTsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL01vdGlvbkV2ZW50VGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9Nb3Rpb25FdmVudFRlc3QuamF2YQppbmRleCBmOWIyZTRmLi43MDcwN2QyIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL01vdGlvbkV2ZW50VGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvTW90aW9uRXZlbnRUZXN0LmphdmEKQEAgLTI5LDggKzI5LDYgQEAKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudmlldy5JbnB1dERldmljZTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CkBAIC00MCw2ICszOCw5IEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LmN0cy5Nb3Rpb25FdmVudFV0aWxzLlBvaW50ZXJDb29yZHNCdWlsZGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5jdHMuTW90aW9uRXZlbnRVdGlscy5Qb2ludGVyUHJvcGVydGllc0J1aWxkZXI7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvTW90aW9uRXZlbnRfUG9pbnRlckNvb3Jkc1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvTW90aW9uRXZlbnRfUG9pbnRlckNvb3Jkc1Rlc3QuamF2YQppbmRleCAxZjNhY2JiLi5lMzlmMWNiIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL01vdGlvbkV2ZW50X1BvaW50ZXJDb29yZHNUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9Nb3Rpb25FdmVudF9Qb2ludGVyQ29vcmRzVGVzdC5qYXZhCkBAIC0xOCwxMSArMTgsMTIgQEAKIAogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuY3RzLk1vdGlvbkV2ZW50VXRpbHMud2l0aENvb3JkczsKIAotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuY3RzLk1vdGlvbkV2ZW50VXRpbHMuUG9pbnRlckNvb3Jkc0J1aWxkZXI7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvTW90aW9uRXZlbnRfUG9pbnRlclByb3BlcnRpZXNUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL01vdGlvbkV2ZW50X1BvaW50ZXJQcm9wZXJ0aWVzVGVzdC5qYXZhCmluZGV4IGFjMDVjMWMuLmU2YjhiNTYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvTW90aW9uRXZlbnRfUG9pbnRlclByb3BlcnRpZXNUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9Nb3Rpb25FdmVudF9Qb2ludGVyUHJvcGVydGllc1Rlc3QuamF2YQpAQCAtMTgsMTAgKzE4LDExIEBACiAKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LmN0cy5Nb3Rpb25FdmVudFV0aWxzLndpdGhQcm9wZXJ0aWVzOwogCi1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL09yaWVudGF0aW9uRXZlbnRMaXN0ZW5lclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvT3JpZW50YXRpb25FdmVudExpc3RlbmVyVGVzdC5qYXZhCmluZGV4IGMxNjM0NDAuLmYxMzk2MzIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvT3JpZW50YXRpb25FdmVudExpc3RlbmVyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvT3JpZW50YXRpb25FdmVudExpc3RlbmVyVGVzdC5qYXZhCkBAIC0yMSwxMSArMjEsMTIgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvcjsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvck1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk9yaWVudGF0aW9uRXZlbnRMaXN0ZW5lcjsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL09yaWVudGF0aW9uTGlzdGVuZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL09yaWVudGF0aW9uTGlzdGVuZXJUZXN0LmphdmEKaW5kZXggNjk2ZjAzNC4uYjZjNThkMSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9PcmllbnRhdGlvbkxpc3RlbmVyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvT3JpZW50YXRpb25MaXN0ZW5lclRlc3QuamF2YQpAQCAtMTgsMTEgKzE4LDEyIEBACiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvck1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk9yaWVudGF0aW9uTGlzdGVuZXI7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9QYW5pY1ByZXNzQmFja0FjdGl2aXR5LmphdmEgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1BhbmljUHJlc3NCYWNrQWN0aXZpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI1MjQ5MS4uMDAwMDAwMAotLS0gYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1BhbmljUHJlc3NCYWNrQWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQudmlldy5jdHM7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKLQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOwotCi1wdWJsaWMgY2xhc3MgUGFuaWNQcmVzc0JhY2tBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBtV2FzUGF1c2VkOwotCi0gICAgcHVibGljIGZpbmFsIENvdW50RG93bkxhdGNoIG1XYWl0Rm9yUGFuaWNCYWNrTGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkJhY2tQcmVzc2VkKCkgewotICAgICAgICAvLyBQcmV2ZW50IGJhY2sgcHJlc3MgZnJvbSBleGl0aW5nIGFwcAotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uUGF1c2UoKSB7Ci0gICAgICAgIG1XYWl0Rm9yUGFuaWNCYWNrTGF0Y2guY291bnREb3duKCk7Ci0gICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9QYW5pY1ByZXNzQmFja1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvUGFuaWNQcmVzc0JhY2tUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMGJmMzEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9QYW5pY1ByZXNzQmFja1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnZpZXcuY3RzOwotCi1pbXBvcnQgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZS5hc3NlcnRGYWxzZTsKLWltcG9ydCBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlLmFzc2VydFRydWU7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5VaUF1dG9tYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdDb25maWd1cmF0aW9uOwotCi1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuUnVsZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLWltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7Ci0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKLQotQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKLXB1YmxpYyBjbGFzcyBQYW5pY1ByZXNzQmFja1Rlc3QgewotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlBhbmljUHJlc3NCYWNrVGVzdCI7Ci0KLSAgICBAUnVsZQotICAgIHB1YmxpYyBBY3Rpdml0eVRlc3RSdWxlPFBhbmljUHJlc3NCYWNrQWN0aXZpdHk+IG1BY3Rpdml0eVJ1bGUgPQotICAgICAgICAgICAgbmV3IEFjdGl2aXR5VGVzdFJ1bGU8PihQYW5pY1ByZXNzQmFja0FjdGl2aXR5LmNsYXNzKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQQU5JQ19QUkVTU19DT1VOVCA9IDQ7Ci0gICAgcHJpdmF0ZSBQYW5pY1ByZXNzQmFja0FjdGl2aXR5IG1BY3Rpdml0eTsKLQotICAgIEBCZWZvcmUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLSAgICAgICAgbUFjdGl2aXR5ID0gbUFjdGl2aXR5UnVsZS5nZXRBY3Rpdml0eSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRvIGVuc3VyZSB0aGF0IHRoZSBmb3JlZ3JvdW5kZWQgYXBwIGRvZXMgbm90IGhhbmRsZSBiYWNrIGJ1dHRvbiBwYW5pYyBwcmVzcyBvbgotICAgICAqIG5vbi13YXRjaCBkZXZpY2VzCi0gICAgICovCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uV2F0Y2hCYWNrUGFuaWNEb2VzTm90aGluZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBPbmx5IHJ1biBmb3Igbm9uLXdhdGNoIGRldmljZXMKLSAgICAgICAgaWYgKG1BY3Rpdml0eS5nZXRQYWNrYWdlTWFuYWdlcigpLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9XQVRDSCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIFVpQXV0b21hdGlvbiBhdXRvbWF0aW9uID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkKLSAgICAgICAgICAgICAgICAuZ2V0VWlBdXRvbWF0aW9uKCk7Ci0KLSAgICAgICAgLy8gUHJlc3MgYmFjayBidXR0b24gUEFOSUNfUFJFU1NfQ09VTlQgdGltZXMKLSAgICAgICAgbG9uZyBzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBQQU5JQ19QUkVTU19DT1VOVDsgKytpKSB7Ci0gICAgICAgICAgICBsb25nIGN1cnJlbnRUaW1lID0gc3RhcnRUaW1lICsgaTsKLSAgICAgICAgICAgIGF1dG9tYXRpb24uaW5qZWN0SW5wdXRFdmVudChuZXcgS2V5RXZlbnQoY3VycmVudFRpbWUsIGN1cnJlbnRUaW1lLCBLZXlFdmVudC5BQ1RJT05fRE9XTiwKLSAgICAgICAgICAgICAgICAgICAgS2V5RXZlbnQuS0VZQ09ERV9CQUNLLCAwKSwgdHJ1ZSk7Ci0gICAgICAgICAgICBhdXRvbWF0aW9uLmluamVjdElucHV0RXZlbnQobmV3IEtleUV2ZW50KGN1cnJlbnRUaW1lLCBjdXJyZW50VGltZSwgS2V5RXZlbnQuQUNUSU9OX1VQLAotICAgICAgICAgICAgICAgICAgICBLZXlFdmVudC5LRVlDT0RFX0JBQ0ssIDApLCB0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFdhaXQgbXVsdGkgcHJlc3MgdGltZSBvdXQgcGx1cyBzb21lIHRpbWUgdG8gZ2l2ZSB0aGUgc3lzdGVtIHRpbWUgdG8gcmVzcG9uZAotICAgICAgICBsb25nIHRpbWVvdXRNcyA9IFZpZXdDb25maWd1cmF0aW9uLmdldE11bHRpUHJlc3NUaW1lb3V0KCkgKyBUaW1lVW5pdC5TRUNPTkRTLnRvTWlsbGlzKDEpOwotCi0gICAgICAgIC8vIEFzc2VydCBhY3Rpdml0eSB3YXMgbm90IHN0b3BwZWQsIGluZGljYXRpbmcgcGFuaWMgcHJlc3Mgd2FzIG5vdCBhYmxlIHRvIGV4aXQgdGhlIGFwcAotICAgICAgICBhc3NlcnRGYWxzZShtQWN0aXZpdHkubVdhaXRGb3JQYW5pY0JhY2tMYXRjaC5hd2FpdCh0aW1lb3V0TXMsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRvIGVuc3VyZSB0aGF0IHRoZSBmb3JlZ3JvdW5kZWQgYXBwIGRvZXMgaGFuZGxlIGJhY2sgYnV0dG9uIHBhbmljIHByZXNzIG9uIHdhdGNoCi0gICAgICogZGV2aWNlcwotICAgICAqLwotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFdhdGNoQmFja1BhbmljUmVjZWl2ZXNIb21lUmVxdWVzdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBPbmx5IHJ1biBmb3Igd2F0Y2ggZGV2aWNlcwotICAgICAgICBpZiAoIW1BY3Rpdml0eS5nZXRQYWNrYWdlTWFuYWdlcigpLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9XQVRDSCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIFVpQXV0b21hdGlvbiBhdXRvbWF0aW9uID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkKLSAgICAgICAgICAgICAgICAuZ2V0VWlBdXRvbWF0aW9uKCk7Ci0KLSAgICAgICAgLy8gUHJlc3MgYmFjayBidXR0b24gUEFOSUNfUFJFU1NfQ09VTlQgdGltZXMKLSAgICAgICAgbG9uZyBzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBQQU5JQ19QUkVTU19DT1VOVDsgKytpKSB7Ci0gICAgICAgICAgICAvLyBBc3NlcnQgYWN0aXZpdHkgaGFzbid0IHN0b3BwZWQgeWV0Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZShtQWN0aXZpdHkubVdhaXRGb3JQYW5pY0JhY2tMYXRjaC5hd2FpdCgwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKLSAgICAgICAgICAgIGxvbmcgY3VycmVudFRpbWUgPSBzdGFydFRpbWUgKyBpOwotICAgICAgICAgICAgYXV0b21hdGlvbi5pbmplY3RJbnB1dEV2ZW50KG5ldyBLZXlFdmVudChjdXJyZW50VGltZSwgY3VycmVudFRpbWUsIEtleUV2ZW50LkFDVElPTl9ET1dOLAotICAgICAgICAgICAgICAgICAgICBLZXlFdmVudC5LRVlDT0RFX0JBQ0ssIDApLCB0cnVlKTsKLSAgICAgICAgICAgIGF1dG9tYXRpb24uaW5qZWN0SW5wdXRFdmVudChuZXcgS2V5RXZlbnQoY3VycmVudFRpbWUsIGN1cnJlbnRUaW1lLCBLZXlFdmVudC5BQ1RJT05fVVAsCi0gICAgICAgICAgICAgICAgICAgIEtleUV2ZW50LktFWUNPREVfQkFDSywgMCksIHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gV2FpdCBtdWx0aSBwcmVzcyB0aW1lIG91dCBwbHVzIHNvbWUgdGltZSB0byBnaXZlIHRoZSBzeXN0ZW0gdGltZSB0byByZXNwb25kCi0gICAgICAgIGxvbmcgdGltZW91dE1zID0gVmlld0NvbmZpZ3VyYXRpb24uZ2V0TXVsdGlQcmVzc1RpbWVvdXQoKSArIFRpbWVVbml0LlNFQ09ORFMudG9NaWxsaXMoMSk7Ci0KLSAgICAgICAgLy8gQXNzZXJ0IGFjdGl2aXR5IHdhcyBzdG9wcGVkLCBpbmRpY2F0aW5nIHRoYXQgcGFuaWMgcHJlc3Mgd2FzIGFibGUgdG8gZXhpdCB0aGUgYXBwCi0gICAgICAgIGFzc2VydFRydWUobUFjdGl2aXR5Lm1XYWl0Rm9yUGFuaWNCYWNrTGF0Y2guYXdhaXQodGltZW91dE1zLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9QaXhlbENvcHlUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1BpeGVsQ29weVRlc3QuamF2YQppbmRleCAwY2JkMGNhLi42ZjE0YWE5IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1BpeGVsQ29weVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1BpeGVsQ29weVRlc3QuamF2YQpAQCAtMzMsMTEgKzMzLDYgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlN1cmZhY2VUZXh0dXJlOwogaW1wb3J0IGFuZHJvaWQub3MuRGVidWc7CiBpbXBvcnQgYW5kcm9pZC5vcy5EZWJ1Zy5NZW1vcnlJbmZvOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTGFyZ2VUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkhhbGY7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuUGl4ZWxDb3B5OwpAQCAtNDUsNiArNDAsMTIgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTGFyZ2VUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlN5bmNocm9ub3VzUGl4ZWxDb3B5OwogCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKQEAgLTgzLDYgKzg0LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIFBpeGVsQ29weVdpZGVHYW11dFZpZXdQcm9kdWNlckFjdGl2aXR5LmNsYXNzLCBmYWxzZSwgZmFsc2UpOwogCiAgICAgQFJ1bGUKKyAgICBwdWJsaWMgQWN0aXZpdHlUZXN0UnVsZTxQaXhlbENvcHlWaWV3UHJvZHVjZXJEaWFsb2dBY3Rpdml0eT4gbURpYWxvZ1NvdXJjZUFjdGl2aXR5UnVsZSA9CisgICAgICAgICAgICBuZXcgQWN0aXZpdHlUZXN0UnVsZTw+KFBpeGVsQ29weVZpZXdQcm9kdWNlckRpYWxvZ0FjdGl2aXR5LmNsYXNzLCBmYWxzZSwgZmFsc2UpOworCisgICAgQFJ1bGUKICAgICBwdWJsaWMgU3VyZmFjZVRleHR1cmVSdWxlIG1TdXJmYWNlUnVsZSA9IG5ldyBTdXJmYWNlVGV4dHVyZVJ1bGUoKTsKIAogICAgIHByaXZhdGUgSW5zdHJ1bWVudGF0aW9uIG1JbnN0cnVtZW50YXRpb247CkBAIC00NTgsNiArNDYzLDExNiBAQAogICAgICAgICB9IHdoaWxlIChhY3Rpdml0eS5yb3RhdGUoKSk7CiAgICAgfQogCisgICAgcHJpdmF0ZSBXaW5kb3cgd2FpdEZvckRpYWxvZ1Byb2R1Y2VyQWN0aXZpdHkoKSB7CisgICAgICAgIFBpeGVsQ29weVZpZXdQcm9kdWNlckFjdGl2aXR5IGFjdGl2aXR5ID0KKyAgICAgICAgICAgICAgICBtRGlhbG9nU291cmNlQWN0aXZpdHlSdWxlLmxhdW5jaEFjdGl2aXR5KG51bGwpOworICAgICAgICBhY3Rpdml0eS53YWl0Rm9yRmlyc3REcmF3Q29tcGxldGVkKDMsIFRpbWVVbml0LlNFQ09ORFMpOworICAgICAgICByZXR1cm4gYWN0aXZpdHkuZ2V0V2luZG93KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBSZWN0IG1ha2VEaWFsb2dSZWN0KGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgcmlnaHQsIGludCBib3R0b20pIHsKKyAgICAgICAgUmVjdCByID0gbmV3IFJlY3QobGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKKyAgICAgICAgbURpYWxvZ1NvdXJjZUFjdGl2aXR5UnVsZS5nZXRBY3Rpdml0eSgpLm5vcm1hbGl6ZWRUb1N1cmZhY2Uocik7CisgICAgICAgIHJldHVybiByOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERpYWxvZ1Byb2R1Y2VyKCkgeworICAgICAgICBCaXRtYXAgYml0bWFwOworICAgICAgICBXaW5kb3cgd2luZG93ID0gd2FpdEZvckRpYWxvZ1Byb2R1Y2VyQWN0aXZpdHkoKTsKKyAgICAgICAgUGl4ZWxDb3B5Vmlld1Byb2R1Y2VyQWN0aXZpdHkgYWN0aXZpdHkgPSBtRGlhbG9nU291cmNlQWN0aXZpdHlSdWxlLmdldEFjdGl2aXR5KCk7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIFJlY3Qgc3JjID0gbWFrZURpYWxvZ1JlY3QoMCwgMCwgMTAwLCAxMDApOworICAgICAgICAgICAgYml0bWFwID0gQml0bWFwLmNyZWF0ZUJpdG1hcChzcmMud2lkdGgoKSwgc3JjLmhlaWdodCgpLCBDb25maWcuQVJHQl84ODg4KTsKKyAgICAgICAgICAgIGludCByZXN1bHQgPSBtQ29weUhlbHBlci5yZXF1ZXN0KHdpbmRvdywgc3JjLCBiaXRtYXApOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJGdWxsc2l6ZSBjb3B5IHJlcXVlc3QgZmFpbGVkIiwgUGl4ZWxDb3B5LlNVQ0NFU1MsIHJlc3VsdCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoQ29uZmlnLkFSR0JfODg4OCwgYml0bWFwLmdldENvbmZpZygpKTsKKyAgICAgICAgICAgIGFzc2VydEJpdG1hcFF1YWRDb2xvcihiaXRtYXAsCisgICAgICAgICAgICAgICAgICAgIENvbG9yLlJFRCwgQ29sb3IuR1JFRU4sIENvbG9yLkJMVUUsIENvbG9yLkJMQUNLKTsKKyAgICAgICAgICAgIGFzc2VydEJpdG1hcEVkZ2VDb2xvcihiaXRtYXAsIENvbG9yLllFTExPVyk7CisgICAgICAgIH0gd2hpbGUgKGFjdGl2aXR5LnJvdGF0ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REaWFsb2dQcm9kdWNlckNyb3BUb3BMZWZ0KCkgeworICAgICAgICBXaW5kb3cgd2luZG93ID0gd2FpdEZvckRpYWxvZ1Byb2R1Y2VyQWN0aXZpdHkoKTsKKyAgICAgICAgQml0bWFwIGJpdG1hcCA9IEJpdG1hcC5jcmVhdGVCaXRtYXAoMTAwLCAxMDAsIENvbmZpZy5BUkdCXzg4ODgpOworICAgICAgICBQaXhlbENvcHlWaWV3UHJvZHVjZXJBY3Rpdml0eSBhY3Rpdml0eSA9IG1EaWFsb2dTb3VyY2VBY3Rpdml0eVJ1bGUuZ2V0QWN0aXZpdHkoKTsKKyAgICAgICAgZG8geworICAgICAgICAgICAgaW50IHJlc3VsdCA9IG1Db3B5SGVscGVyLnJlcXVlc3Qod2luZG93LCBtYWtlRGlhbG9nUmVjdCgwLCAwLCA1MCwgNTApLCBiaXRtYXApOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJTY2FsZWQgY29weSByZXF1ZXN0IGZhaWxlZCIsIFBpeGVsQ29weS5TVUNDRVNTLCByZXN1bHQpOworICAgICAgICAgICAgYXNzZXJ0Qml0bWFwUXVhZENvbG9yKGJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgQ29sb3IuUkVELCBDb2xvci5SRUQsIENvbG9yLlJFRCwgQ29sb3IuUkVEKTsKKyAgICAgICAgfSB3aGlsZSAoYWN0aXZpdHkucm90YXRlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERpYWxvZ1Byb2R1Y2VyQ3JvcENlbnRlcigpIHsKKyAgICAgICAgV2luZG93IHdpbmRvdyA9IHdhaXRGb3JEaWFsb2dQcm9kdWNlckFjdGl2aXR5KCk7CisgICAgICAgIEJpdG1hcCBiaXRtYXAgPSBCaXRtYXAuY3JlYXRlQml0bWFwKDEwMCwgMTAwLCBDb25maWcuQVJHQl84ODg4KTsKKyAgICAgICAgUGl4ZWxDb3B5Vmlld1Byb2R1Y2VyQWN0aXZpdHkgYWN0aXZpdHkgPSBtRGlhbG9nU291cmNlQWN0aXZpdHlSdWxlLmdldEFjdGl2aXR5KCk7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGludCByZXN1bHQgPSBtQ29weUhlbHBlci5yZXF1ZXN0KHdpbmRvdywgbWFrZURpYWxvZ1JlY3QoMjUsIDI1LCA3NSwgNzUpLCBiaXRtYXApOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJTY2FsZWQgY29weSByZXF1ZXN0IGZhaWxlZCIsIFBpeGVsQ29weS5TVUNDRVNTLCByZXN1bHQpOworICAgICAgICAgICAgYXNzZXJ0Qml0bWFwUXVhZENvbG9yKGJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgQ29sb3IuUkVELCBDb2xvci5HUkVFTiwgQ29sb3IuQkxVRSwgQ29sb3IuQkxBQ0spOworICAgICAgICB9IHdoaWxlIChhY3Rpdml0eS5yb3RhdGUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlhbG9nUHJvZHVjZXJDcm9wQm90dG9tSGFsZigpIHsKKyAgICAgICAgV2luZG93IHdpbmRvdyA9IHdhaXRGb3JEaWFsb2dQcm9kdWNlckFjdGl2aXR5KCk7CisgICAgICAgIEJpdG1hcCBiaXRtYXAgPSBCaXRtYXAuY3JlYXRlQml0bWFwKDEwMCwgMTAwLCBDb25maWcuQVJHQl84ODg4KTsKKyAgICAgICAgUGl4ZWxDb3B5Vmlld1Byb2R1Y2VyQWN0aXZpdHkgYWN0aXZpdHkgPSBtRGlhbG9nU291cmNlQWN0aXZpdHlSdWxlLmdldEFjdGl2aXR5KCk7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGludCByZXN1bHQgPSBtQ29weUhlbHBlci5yZXF1ZXN0KHdpbmRvdywgbWFrZURpYWxvZ1JlY3QoMCwgNTAsIDEwMCwgMTAwKSwgYml0bWFwKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiU2NhbGVkIGNvcHkgcmVxdWVzdCBmYWlsZWQiLCBQaXhlbENvcHkuU1VDQ0VTUywgcmVzdWx0KTsKKyAgICAgICAgICAgIGFzc2VydEJpdG1hcFF1YWRDb2xvcihiaXRtYXAsCisgICAgICAgICAgICAgICAgICAgIENvbG9yLkJMVUUsIENvbG9yLkJMQUNLLCBDb2xvci5CTFVFLCBDb2xvci5CTEFDSyk7CisgICAgICAgIH0gd2hpbGUgKGFjdGl2aXR5LnJvdGF0ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REaWFsb2dQcm9kdWNlclNjYWxpbmcoKSB7CisgICAgICAgIC8vIFNpbmNlIHdlIG9ubHkgc2FtcGxlIG1pZC1waXhlbCBvZiBlYWNoIHF1ZHJhbnQsIGZpbHRlcmluZworICAgICAgICAvLyBxdWFsaXR5IGlzbid0IHRlc3RlZAorICAgICAgICBXaW5kb3cgd2luZG93ID0gd2FpdEZvckRpYWxvZ1Byb2R1Y2VyQWN0aXZpdHkoKTsKKyAgICAgICAgQml0bWFwIGJpdG1hcCA9IEJpdG1hcC5jcmVhdGVCaXRtYXAoMjAsIDIwLCBDb25maWcuQVJHQl84ODg4KTsKKyAgICAgICAgUGl4ZWxDb3B5Vmlld1Byb2R1Y2VyQWN0aXZpdHkgYWN0aXZpdHkgPSBtRGlhbG9nU291cmNlQWN0aXZpdHlSdWxlLmdldEFjdGl2aXR5KCk7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGludCByZXN1bHQgPSBtQ29weUhlbHBlci5yZXF1ZXN0KHdpbmRvdywgYml0bWFwKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiU2NhbGVkIGNvcHkgcmVxdWVzdCBmYWlsZWQiLCBQaXhlbENvcHkuU1VDQ0VTUywgcmVzdWx0KTsKKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBub3RoaW5nIG1lc3NlZCB3aXRoIHRoZSBiaXRtYXAKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyMCwgYml0bWFwLmdldFdpZHRoKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIwLCBiaXRtYXAuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKENvbmZpZy5BUkdCXzg4ODgsIGJpdG1hcC5nZXRDb25maWcoKSk7CisgICAgICAgICAgICBhc3NlcnRCaXRtYXBRdWFkQ29sb3IoYml0bWFwLAorICAgICAgICAgICAgICAgICAgICBDb2xvci5SRUQsIENvbG9yLkdSRUVOLCBDb2xvci5CTFVFLCBDb2xvci5CTEFDSyk7CisgICAgICAgIH0gd2hpbGUgKGFjdGl2aXR5LnJvdGF0ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REaWFsb2dQcm9kdWNlckNvcHlUb1JHQkExNkYoKSB7CisgICAgICAgIFdpbmRvdyB3aW5kb3cgPSB3YWl0Rm9yRGlhbG9nUHJvZHVjZXJBY3Rpdml0eSgpOworICAgICAgICBQaXhlbENvcHlWaWV3UHJvZHVjZXJBY3Rpdml0eSBhY3Rpdml0eSA9IG1EaWFsb2dTb3VyY2VBY3Rpdml0eVJ1bGUuZ2V0QWN0aXZpdHkoKTsKKworICAgICAgICBCaXRtYXAgYml0bWFwOworICAgICAgICBkbyB7CisgICAgICAgICAgICBSZWN0IHNyYyA9IG1ha2VEaWFsb2dSZWN0KDAsIDAsIDEwMCwgMTAwKTsKKyAgICAgICAgICAgIGJpdG1hcCA9IEJpdG1hcC5jcmVhdGVCaXRtYXAoc3JjLndpZHRoKCksIHNyYy5oZWlnaHQoKSwgQ29uZmlnLlJHQkFfRjE2KTsKKyAgICAgICAgICAgIGludCByZXN1bHQgPSBtQ29weUhlbHBlci5yZXF1ZXN0KHdpbmRvdywgc3JjLCBiaXRtYXApOworICAgICAgICAgICAgLy8gT24gT3BlbkdMIEVTIDIuMCBkZXZpY2VzIGEgY29weSB0byBSR0JBX0YxNiBjYW4gZmFpbCBiZWNhdXNlIHRoZXJlJ3MKKyAgICAgICAgICAgIC8vIG5vdCBzdXBwb3J0IGZvciBmbG9hdCB0ZXh0dXJlcworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBQaXhlbENvcHkuRVJST1JfREVTVElOQVRJT05fSU5WQUxJRCkgeworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiRnVsbHNpemUgY29weSByZXF1ZXN0IGZhaWxlZCIsIFBpeGVsQ29weS5TVUNDRVNTLCByZXN1bHQpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhDb25maWcuUkdCQV9GMTYsIGJpdG1hcC5nZXRDb25maWcoKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0Qml0bWFwUXVhZENvbG9yKGJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yLlJFRCwgQ29sb3IuR1JFRU4sIENvbG9yLkJMVUUsIENvbG9yLkJMQUNLKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRCaXRtYXBFZGdlQ29sb3IoYml0bWFwLCBDb2xvci5ZRUxMT1cpOworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlIChhY3Rpdml0eS5yb3RhdGUoKSk7CisgICAgfQorCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRFcXVhbHNSZ2JhMTZmKFN0cmluZyBtZXNzYWdlLCBCaXRtYXAgYml0bWFwLCBpbnQgeCwgaW50IHksCiAgICAgICAgICAgICBCeXRlQnVmZmVyIGRzdCwgZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkgewogICAgICAgICBpbnQgaW5kZXggPSB5ICogYml0bWFwLmdldFJvd0J5dGVzKCkgKyAoeCA8PCAzKTsKQEAgLTYxNSw3ICs3MzAsNyBAQAogICAgICAgICByZXR1cm4gYml0bWFwLmdldFBpeGVsKChpbnQpIChiaXRtYXAuZ2V0V2lkdGgoKSAqIHhwb3MpLCAoaW50KSAoYml0bWFwLmdldEhlaWdodCgpICogeXBvcykpOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRCaXRtYXBRdWFkQ29sb3IoQml0bWFwIGJpdG1hcCwgaW50IHRvcExlZnQsIGludCB0b3BSaWdodCwKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0Qml0bWFwUXVhZENvbG9yKEJpdG1hcCBiaXRtYXAsIGludCB0b3BMZWZ0LCBpbnQgdG9wUmlnaHQsCiAgICAgICAgICAgICAgICAgaW50IGJvdHRvbUxlZnQsIGludCBib3R0b21SaWdodCkgewogICAgICAgICAvLyBKdXN0IHF1aWNrbHkgc2FtcGxlIDQgcGl4ZWxzIGluIHRoZSB2YXJpb3VzIHJlZ2lvbnMuCiAgICAgICAgIGFzc2VydEVxdWFscygiVG9wIGxlZnQgIiArIEludGVnZXIudG9IZXhTdHJpbmcodG9wTGVmdCkgKyAiLCBhY3R1YWw9ICIKQEAgLTY0MiwyMSArNzU3LDIxIEBACiAgICAgcHJpdmF0ZSB2b2lkIGFzc2VydEJpdG1hcEVkZ2VDb2xvcihCaXRtYXAgYml0bWFwLCBpbnQgZWRnZUNvbG9yKSB7CiAgICAgICAgIC8vIEp1c3QgcXVpY2tseSBzYW1wbGUgYSBmZXcgcGl4ZWxzIG9uIHRoZSBlZGdlIGFuZCBhc3NlcnQKICAgICAgICAgLy8gdGhleSBhcmUgZWRnZSBjb2xvciwgdGhlbiBhc3NlcnQgdGhhdCBqdXN0IGluc2lkZSB0aGUgZWRnZSBpcyBhIGRpZmZlcmVudCBjb2xvcgotICAgICAgICBhc3NlcnRCaXRtYXBDb2xvcigiVG9wIGVkZ2UiLCBiaXRtYXAsIGVkZ2VDb2xvciwgYml0bWFwLmdldFdpZHRoKCkgLyAyLCAwKTsKLSAgICAgICAgYXNzZXJ0Qml0bWFwTm90Q29sb3IoIlRvcCBlZGdlIiwgYml0bWFwLCBlZGdlQ29sb3IsIGJpdG1hcC5nZXRXaWR0aCgpIC8gMiwgMSk7CisgICAgICAgIGFzc2VydEJpdG1hcENvbG9yKCJUb3AgZWRnZSIsIGJpdG1hcCwgZWRnZUNvbG9yLCBiaXRtYXAuZ2V0V2lkdGgoKSAvIDIsIDEpOworICAgICAgICBhc3NlcnRCaXRtYXBOb3RDb2xvcigiVG9wIGVkZ2UiLCBiaXRtYXAsIGVkZ2VDb2xvciwgYml0bWFwLmdldFdpZHRoKCkgLyAyLCAyKTsKIAotICAgICAgICBhc3NlcnRCaXRtYXBDb2xvcigiTGVmdCBlZGdlIiwgYml0bWFwLCBlZGdlQ29sb3IsIDAsIGJpdG1hcC5nZXRIZWlnaHQoKSAvIDIpOwotICAgICAgICBhc3NlcnRCaXRtYXBOb3RDb2xvcigiTGVmdCBlZGdlIiwgYml0bWFwLCBlZGdlQ29sb3IsIDEsIGJpdG1hcC5nZXRIZWlnaHQoKSAvIDIpOworICAgICAgICBhc3NlcnRCaXRtYXBDb2xvcigiTGVmdCBlZGdlIiwgYml0bWFwLCBlZGdlQ29sb3IsIDEsIGJpdG1hcC5nZXRIZWlnaHQoKSAvIDIpOworICAgICAgICBhc3NlcnRCaXRtYXBOb3RDb2xvcigiTGVmdCBlZGdlIiwgYml0bWFwLCBlZGdlQ29sb3IsIDIsIGJpdG1hcC5nZXRIZWlnaHQoKSAvIDIpOwogCiAgICAgICAgIGFzc2VydEJpdG1hcENvbG9yKCJCb3R0b20gZWRnZSIsIGJpdG1hcCwgZWRnZUNvbG9yLAotICAgICAgICAgICAgICAgIGJpdG1hcC5nZXRXaWR0aCgpIC8gMiwgYml0bWFwLmdldEhlaWdodCgpIC0gMSk7Ci0gICAgICAgIGFzc2VydEJpdG1hcE5vdENvbG9yKCJCb3R0b20gZWRnZSIsIGJpdG1hcCwgZWRnZUNvbG9yLAogICAgICAgICAgICAgICAgIGJpdG1hcC5nZXRXaWR0aCgpIC8gMiwgYml0bWFwLmdldEhlaWdodCgpIC0gMik7CisgICAgICAgIGFzc2VydEJpdG1hcE5vdENvbG9yKCJCb3R0b20gZWRnZSIsIGJpdG1hcCwgZWRnZUNvbG9yLAorICAgICAgICAgICAgICAgIGJpdG1hcC5nZXRXaWR0aCgpIC8gMiwgYml0bWFwLmdldEhlaWdodCgpIC0gMyk7CiAKICAgICAgICAgYXNzZXJ0Qml0bWFwQ29sb3IoIlJpZ2h0IGVkZ2UiLCBiaXRtYXAsIGVkZ2VDb2xvciwKLSAgICAgICAgICAgICAgICBiaXRtYXAuZ2V0V2lkdGgoKSAtIDEsIGJpdG1hcC5nZXRIZWlnaHQoKSAvIDIpOwotICAgICAgICBhc3NlcnRCaXRtYXBOb3RDb2xvcigiUmlnaHQgZWRnZSIsIGJpdG1hcCwgZWRnZUNvbG9yLAogICAgICAgICAgICAgICAgIGJpdG1hcC5nZXRXaWR0aCgpIC0gMiwgYml0bWFwLmdldEhlaWdodCgpIC8gMik7CisgICAgICAgIGFzc2VydEJpdG1hcE5vdENvbG9yKCJSaWdodCBlZGdlIiwgYml0bWFwLCBlZGdlQ29sb3IsCisgICAgICAgICAgICAgICAgYml0bWFwLmdldFdpZHRoKCkgLSAzLCBiaXRtYXAuZ2V0SGVpZ2h0KCkgLyAyKTsKICAgICB9CiAKICAgICBwcml2YXRlIGJvb2xlYW4gcGl4ZWxzQXJlU2FtZShpbnQgaWRlYWwsIGludCBnaXZlbiwgaW50IHRocmVzaG9sZCkgewpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9QaXhlbENvcHlWaWV3UHJvZHVjZXJBY3Rpdml0eS5qYXZhIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9QaXhlbENvcHlWaWV3UHJvZHVjZXJBY3Rpdml0eS5qYXZhCmluZGV4IDA1NGRlNDUuLjA3YWE0ZmQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvUGl4ZWxDb3B5Vmlld1Byb2R1Y2VyQWN0aXZpdHkuamF2YQorKysgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1BpeGVsQ29weVZpZXdQcm9kdWNlckFjdGl2aXR5LmphdmEKQEAgLTE1NywyMiArMTU3LDIzIEBACiAgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CiAgICAgICAgICAgICBpbnQgY3ggPSBnZXRXaWR0aCgpIC8gMjsKICAgICAgICAgICAgIGludCBjeSA9IGdldEhlaWdodCgpIC8gMjsKKyAgICAgICAgICAgIGZpbmFsIGludCBCT1JERVJfV0lEVEggPSAyOwogCiAgICAgICAgICAgICBjYW52YXMuZHJhd0NvbG9yKENvbG9yLllFTExPVyk7CiAKLSAgICAgICAgICAgIG1SZWN0LnNldCgxLCAxLCBjeCwgY3kpOworICAgICAgICAgICAgbVJlY3Quc2V0KEJPUkRFUl9XSURUSCwgQk9SREVSX1dJRFRILCBjeCwgY3kpOwogICAgICAgICAgICAgbVBhaW50LnNldENvbG9yKENvbG9yLlJFRCk7CiAgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QobVJlY3QsIG1QYWludCk7CiAKLSAgICAgICAgICAgIG1SZWN0LnNldChjeCwgMSwgZ2V0V2lkdGgoKSAtIDEsIGN5KTsKKyAgICAgICAgICAgIG1SZWN0LnNldChjeCwgQk9SREVSX1dJRFRILCBnZXRXaWR0aCgpIC0gQk9SREVSX1dJRFRILCBjeSk7CiAgICAgICAgICAgICBtUGFpbnQuc2V0Q29sb3IoQ29sb3IuR1JFRU4pOwogICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KG1SZWN0LCBtUGFpbnQpOwogCi0gICAgICAgICAgICBtUmVjdC5zZXQoMSwgY3ksIGN4LCBnZXRIZWlnaHQoKSAtIDEpOworICAgICAgICAgICAgbVJlY3Quc2V0KEJPUkRFUl9XSURUSCwgY3ksIGN4LCBnZXRIZWlnaHQoKSAtIEJPUkRFUl9XSURUSCk7CiAgICAgICAgICAgICBtUGFpbnQuc2V0Q29sb3IoQ29sb3IuQkxVRSk7CiAgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QobVJlY3QsIG1QYWludCk7CiAKLSAgICAgICAgICAgIG1SZWN0LnNldChjeCwgY3ksIGdldFdpZHRoKCkgLSAxLCBnZXRIZWlnaHQoKSAtIDEpOworICAgICAgICAgICAgbVJlY3Quc2V0KGN4LCBjeSwgZ2V0V2lkdGgoKSAtIEJPUkRFUl9XSURUSCwgZ2V0SGVpZ2h0KCkgLSBCT1JERVJfV0lEVEgpOwogICAgICAgICAgICAgbVBhaW50LnNldENvbG9yKENvbG9yLkJMQUNLKTsKICAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdChtUmVjdCwgbVBhaW50KTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9QaXhlbENvcHlWaWV3UHJvZHVjZXJEaWFsb2dBY3Rpdml0eS5qYXZhIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9QaXhlbENvcHlWaWV3UHJvZHVjZXJEaWFsb2dBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMTM3NTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1BpeGVsQ29weVZpZXdQcm9kdWNlckRpYWxvZ0FjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC52aWV3LmN0czsKKworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworCitwdWJsaWMgY2xhc3MgUGl4ZWxDb3B5Vmlld1Byb2R1Y2VyRGlhbG9nQWN0aXZpdHkgZXh0ZW5kcyBQaXhlbENvcHlWaWV3UHJvZHVjZXJBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHJvdGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvUG9pbnRlckNhcHR1cmVHcm91cC5qYXZhIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9Qb2ludGVyQ2FwdHVyZUdyb3VwLmphdmEKaW5kZXggMTAwYmE5ZC4uOWJlNjg2NiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9Qb2ludGVyQ2FwdHVyZUdyb3VwLmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9Qb2ludGVyQ2FwdHVyZUdyb3VwLmphdmEKQEAgLTE3LDcgKzE3LDcgQEAKIHBhY2thZ2UgYW5kcm9pZC52aWV3LmN0czsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTnVsbGFibGU7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9Qb2ludGVyQ2FwdHVyZVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvUG9pbnRlckNhcHR1cmVUZXN0LmphdmEKaW5kZXggMTM5MjMyZi4uOTZlOTcxNyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9Qb2ludGVyQ2FwdHVyZVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1BvaW50ZXJDYXB0dXJlVGVzdC5qYXZhCkBAIC0zNSwxNSArMzUsMTYgQEAKIAogaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuSW5wdXREZXZpY2U7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DdHNNb3VzZVV0aWwuQWN0aW9uTWF0Y2hlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkN0c1RvdWNoVXRpbHM7CiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5Qb2xsaW5nQ2hlY2s7CkBAIC0yMzQsNyArMjM1LDggQEAKICAgICAgICAgLy8gY29uZGl0aW9uLgogICAgICAgICBDdHNUb3VjaFV0aWxzLmVtdWxhdGVMb25nUHJlc3NPblZpZXcobUluc3RydW1lbnRhdGlvbiwgbVRhcmdldCwgMCwgMCk7CiAgICAgICAgIFBvbGxpbmdDaGVjay53YWl0Rm9yKFRJTUVPVVRfREVMVEEsICgpIC0+ICFtT3V0ZXIuaGFzV2luZG93Rm9jdXMoKSk7Ci0gICAgICAgIGFzc2VydFBvaW50ZXJDYXB0dXJlKGZhbHNlKTsKKyAgICAgICAgUG9sbGluZ0NoZWNrLndhaXRGb3IoVElNRU9VVF9ERUxUQSwKKyAgICAgICAgICAgICAgICAoKSAtPiAhbVRhcmdldC5oYXNQb2ludGVyQ2FwdHVyZSgpICYmICFtQWN0aXZpdHkuaGFzUG9pbnRlckNhcHR1cmUoKSk7CiAKICAgICAgICAgbUluc3RydW1lbnRhdGlvbi5zZW5kQ2hhcmFjdGVyU3luYyhLZXlFdmVudC5LRVlDT0RFX0JBQ0spOwogICAgICAgICBQb2xsaW5nQ2hlY2sud2FpdEZvcihUSU1FT1VUX0RFTFRBLCAoKSAtPiBtT3V0ZXIuaGFzV2luZG93Rm9jdXMoKSk7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1BvaW50ZXJDYXB0dXJlVmlldy5qYXZhIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9Qb2ludGVyQ2FwdHVyZVZpZXcuamF2YQppbmRleCBkMjczOTc3Li4xMGFkODMzIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1BvaW50ZXJDYXB0dXJlVmlldy5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvUG9pbnRlckNhcHR1cmVWaWV3LmphdmEKQEAgLTE3LDcgKzE3LDcgQEAKIHBhY2thZ2UgYW5kcm9pZC52aWV3LmN0czsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTnVsbGFibGU7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1NjYWxlR2VzdHVyZURldGVjdG9yVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9TY2FsZUdlc3R1cmVEZXRlY3RvclRlc3QuamF2YQppbmRleCA1M2RkMDYyLi41MTI2M2JkIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1NjYWxlR2VzdHVyZURldGVjdG9yVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvU2NhbGVHZXN0dXJlRGV0ZWN0b3JUZXN0LmphdmEKQEAgLTIxLDEzICsyMSwxNCBAQAogCiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlNjYWxlR2VzdHVyZURldGVjdG9yOwogaW1wb3J0IGFuZHJvaWQudmlldy5TY2FsZUdlc3R1cmVEZXRlY3Rvci5TaW1wbGVPblNjYWxlR2VzdHVyZUxpc3RlbmVyOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvU2VhcmNoRXZlbnRUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1NlYXJjaEV2ZW50VGVzdC5qYXZhCmluZGV4IDlhZTllNjEuLjhmZjg5MjMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvU2VhcmNoRXZlbnRUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9TZWFyY2hFdmVudFRlc3QuamF2YQpAQCAtMjEsMTUgKzIxLDE3IEBACiAKIGltcG9ydCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb247CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuaW5wdXQuSW5wdXRNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LklucHV0RGV2aWNlOwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuU2VhcmNoRXZlbnQ7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlBvbGxpbmdDaGVjazsKIAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CkBAIC03Myw2ICs3NSwxMCBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QmFzaWNzKCkgeworICAgICAgICAvLyBPbmx5IHJ1biBmb3Igbm9uLXdhdGNoIGRldmljZXMKKyAgICAgICAgaWYgKG1BY3Rpdml0eS5nZXRQYWNrYWdlTWFuYWdlcigpLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9XQVRDSCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLnNlbmRLZXlEb3duVXBTeW5jKEtleUV2ZW50LktFWUNPREVfU0VBUkNIKTsKICAgICAgICAgU2VhcmNoRXZlbnQgc2UgPSBtQWN0aXZpdHkuZ2V0VGVzdFNlYXJjaEV2ZW50KCk7CiAgICAgICAgIGFzc2VydE5vdE51bGwoc2UpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9Tb3VuZEVmZmVjdENvbnN0YW50c1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvU291bmRFZmZlY3RDb25zdGFudHNUZXN0LmphdmEKaW5kZXggMTg2ZTA2ZC4uZDhjMmU4ZSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9Tb3VuZEVmZmVjdENvbnN0YW50c1Rlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1NvdW5kRWZmZWN0Q29uc3RhbnRzVGVzdC5qYXZhCkBAIC0xOCwxMSArMTgsMTIgQEAKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIAotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudmlldy5Tb3VuZEVmZmVjdENvbnN0YW50czsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9TdXJmYWNlSG9sZGVyX0JhZFN1cmZhY2VUeXBlRXhjZXB0aW9uVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9TdXJmYWNlSG9sZGVyX0JhZFN1cmZhY2VUeXBlRXhjZXB0aW9uVGVzdC5qYXZhCmluZGV4IDc5OTkwZTkuLmVhODkyNWYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvU3VyZmFjZUhvbGRlcl9CYWRTdXJmYWNlVHlwZUV4Y2VwdGlvblRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1N1cmZhY2VIb2xkZXJfQmFkU3VyZmFjZVR5cGVFeGNlcHRpb25UZXN0LmphdmEKQEAgLTE4LDEwICsxOCwxMSBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFNhbWU7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIAotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyLkJhZFN1cmZhY2VUeXBlRXhjZXB0aW9uOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1N1cmZhY2VWaWV3U3luY1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvU3VyZmFjZVZpZXdTeW5jVGVzdC5qYXZhCmluZGV4IDJhMTRhOGQuLjU0MDZlZTQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvU3VyZmFjZVZpZXdTeW5jVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvU3VyZmFjZVZpZXdTeW5jVGVzdC5qYXZhCkBAIC0yNyw5ICsyNyw2IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyOwogaW1wb3J0IGFuZHJvaWQub3MuRW52aXJvbm1lbnQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5MYXJnZVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnVpYXV0b21hdG9yLlVpT2JqZWN0Tm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CkBAIC00NSw2ICs0MiwxMCBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5jdHMuc3VyZmFjZXZhbGlkYXRvci5WaWV3RmFjdG9yeTsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5MYXJnZVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9TdXJmYWNlVmlld1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvU3VyZmFjZVZpZXdUZXN0LmphdmEKaW5kZXggM2NjY2E0OC4uOTY2ZTQ0ZCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9TdXJmYWNlVmlld1Rlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1N1cmZhY2VWaWV3VGVzdC5qYXZhCkBAIC0yNCwxNyArMjQsMTggQEAKIGltcG9ydCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb247CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QaXhlbEZvcm1hdDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZVZpZXc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuY3RzLlN1cmZhY2VWaWV3Q3RzQWN0aXZpdHkuTW9ja1N1cmZhY2VWaWV3OwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkN0c0tleUV2ZW50VXRpbDsKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlBvbGxpbmdDaGVjazsKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLldpZGdldFRlc3RVdGlsczsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvU3VyZmFjZV9PdXRPZlJlc291cmNlc0V4Y2VwdGlvblRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvU3VyZmFjZV9PdXRPZlJlc291cmNlc0V4Y2VwdGlvblRlc3QuamF2YQppbmRleCA0MzhmZjFiLi40OTJkNmZlIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1N1cmZhY2VfT3V0T2ZSZXNvdXJjZXNFeGNlcHRpb25UZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9TdXJmYWNlX091dE9mUmVzb3VyY2VzRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0xNiwxMCArMTYsMTEgQEAKIAogcGFja2FnZSBhbmRyb2lkLnZpZXcuY3RzOwogCi1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2U7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvVGV4dHVyZVZpZXdDYW1lcmFUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1RleHR1cmVWaWV3Q2FtZXJhVGVzdC5qYXZhCmluZGV4IDYzZDRkNWUuLmIyMmMyZDAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvVGV4dHVyZVZpZXdDYW1lcmFUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9UZXh0dXJlVmlld0NhbWVyYVRlc3QuamF2YQpAQCAtMTksOSArMTksMTAgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5DYW1lcmE7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5MYXJnZVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLkxhcmdlVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvVGV4dHVyZVZpZXdDdHNBY3Rpdml0eS5qYXZhIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9UZXh0dXJlVmlld0N0c0FjdGl2aXR5LmphdmEKaW5kZXggZTcxZTI3NS4uOGIwZDRjNyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9UZXh0dXJlVmlld0N0c0FjdGl2aXR5LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9UZXh0dXJlVmlld0N0c0FjdGl2aXR5LmphdmEKQEAgLTIxLDcgKzIxLDExIEBACiBpbXBvcnQgc3RhdGljIGFuZHJvaWQub3BlbmdsLkdMRVMyMC5nbENsZWFyQ29sb3I7CiAKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQWN0aXZpdHlJbmZvOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3I7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvclNwYWNlOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuU3VyZmFjZVRleHR1cmU7CiBpbXBvcnQgYW5kcm9pZC5vcGVuZ2wuR0xVdGlsczsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKQEAgLTU0LDEwICs1OCwxOSBAQAogICAgIHByaXZhdGUgQ291bnREb3duTGF0Y2ggbUVudGVyQW5pbWF0aW9uRmVuY2UgPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CiAKICAgICBwcml2YXRlIFN1cmZhY2VUZXh0dXJlIG1TdXJmYWNlOworICAgIHByaXZhdGUgaW50IG1TdXJmYWNlV2lkdGg7CisgICAgcHJpdmF0ZSBpbnQgbVN1cmZhY2VIZWlnaHQ7CiAgICAgcHJpdmF0ZSBpbnQgbVN1cmZhY2VVcGRhdGVkQ291bnQ7CiAKKyAgICBwcml2YXRlIGludCBtRWdsQ29sb3JTcGFjZSA9IDA7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Jc0VHTFdpZGVHYW11dCA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBtRUdMRXh0ZW5zaW9uVW5zdXBwb3J0ZWQgPSBmYWxzZTsKKwogICAgIHN0YXRpYyBmaW5hbCBpbnQgRUdMX0NPTlRFWFRfQ0xJRU5UX1ZFUlNJT04gPSAweDMwOTg7CiAgICAgc3RhdGljIGZpbmFsIGludCBFR0xfT1BFTkdMX0VTMl9CSVQgPSA0OworICAgIHN0YXRpYyBmaW5hbCBpbnQgRUdMX0dMX0NPTE9SU1BBQ0VfS0hSID0gMHgzMDlEOworICAgIHN0YXRpYyBmaW5hbCBpbnQgRUdMX0NPTE9SX0NPTVBPTkVOVF9UWVBFX0VYVCA9IDB4MzMzOTsKKyAgICBzdGF0aWMgZmluYWwgaW50IEVHTF9DT0xPUl9DT01QT05FTlRfVFlQRV9GTE9BVF9FWFQgPSAweDMzM0I7CiAKICAgICBwcml2YXRlIEVHTDEwIG1FZ2w7CiAgICAgcHJpdmF0ZSBFR0xEaXNwbGF5IG1FZ2xEaXNwbGF5OwpAQCAtOTEsNiArMTA0LDE2IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25EZXN0cm95KCkgeworICAgICAgICBzdXBlci5vbkRlc3Ryb3koKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJ1bk9uR0xUaHJlYWQodGhpczo6ZG9GaW5pc2hHTCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbih0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG9uRW50ZXJBbmltYXRpb25Db21wbGV0ZSgpIHsKICAgICAgICAgc3VwZXIub25FbnRlckFuaW1hdGlvbkNvbXBsZXRlKCk7CiAgICAgICAgIG1FbnRlckFuaW1hdGlvbkZlbmNlLmNvdW50RG93bigpOwpAQCAtMTAyLDYgKzEyNSwzOCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIGJvb2xlYW4gc2V0V2lkZUNvbG9yR2FtdXQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgQ291bnREb3duTGF0Y2ggZmVuY2UgPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgICAgIFJ1blNpZ25hbEFuZENhdGNoIHdyYXBwZXIgPSBuZXcgUnVuU2lnbmFsQW5kQ2F0Y2goKCkgLT4geworICAgICAgICAgICAgdGhpcy5nZXRXaW5kb3coKS5zZXRDb2xvck1vZGUoQWN0aXZpdHlJbmZvLkNPTE9SX01PREVfV0lERV9DT0xPUl9HQU1VVCk7CisgICAgICAgIH0sIGZlbmNlKTsKKyAgICAgICAgcnVuT25VaVRocmVhZCh3cmFwcGVyKTsKKyAgICAgICAgaWYgKCFmZW5jZS5hd2FpdChUSU1FX09VVF9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRpbWVvdXRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBpZiAod3JhcHBlci5lcnJvciAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyB3cmFwcGVyLmVycm9yOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLmdldFdpbmRvdygpLmdldENvbG9yTW9kZSgpID09IEFjdGl2aXR5SW5mby5DT0xPUl9NT0RFX1dJREVfQ09MT1JfR0FNVVQ7CisgICAgfQorCisgICAgcHVibGljIEJpdG1hcCBnZXRDb250ZW50cyhCaXRtYXAuQ29uZmlnIGNvbmZpZywgQ29sb3JTcGFjZSBjb2xvclNwYWNlKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgQ291bnREb3duTGF0Y2ggZmVuY2UgPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgICAgIGZpbmFsIEJpdG1hcCBiaXRtYXAgPSBCaXRtYXAuY3JlYXRlQml0bWFwKHRoaXMuZ2V0V2luZG93KCkuZ2V0RGVjb3JWaWV3KCkuZ2V0V2lkdGgoKSwKKyAgICAgICAgICAgICAgICB0aGlzLmdldFdpbmRvdygpLmdldERlY29yVmlldygpLmdldEhlaWdodCgpLCBjb25maWcsIHRydWUsIGNvbG9yU3BhY2UpOworICAgICAgICBSdW5TaWduYWxBbmRDYXRjaCB3cmFwcGVyID0gbmV3IFJ1blNpZ25hbEFuZENhdGNoKCgpIC0+IHsKKyAgICAgICAgICAgIHRoaXMuZ2V0VGV4dHVyZVZpZXcoKS5nZXRCaXRtYXAoYml0bWFwKTsKKyAgICAgICAgfSwgZmVuY2UpOworICAgICAgICBydW5PblVpVGhyZWFkKHdyYXBwZXIpOworICAgICAgICBpZiAoIWZlbmNlLmF3YWl0KFRJTUVfT1VUX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVGltZW91dEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGlmICh3cmFwcGVyLmVycm9yICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IHdyYXBwZXIuZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJpdG1hcDsKKyAgICB9CisKICAgICBwcml2YXRlIGNsYXNzIFJ1blNpZ25hbEFuZENhdGNoIGltcGxlbWVudHMgUnVubmFibGUgewogICAgICAgICBwdWJsaWMgVGhyb3dhYmxlIGVycm9yOwogICAgICAgICBwcml2YXRlIFJ1bm5hYmxlIG1SdW5uYWJsZTsKQEAgLTEzNiw2ICsxOTEsMTAgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHB1YmxpYyBUZXh0dXJlVmlldyBnZXRUZXh0dXJlVmlldygpIHsKKyAgICAgICAgcmV0dXJuIG1UZXh0dXJlVmlldzsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCB3YWl0Rm9yU3VyZmFjZSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKICAgICAgICAgICAgIHdoaWxlIChtU3VyZmFjZSA9PSBudWxsKSB7CkBAIC0xNDQsMTcgKzIwMywzNyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIGJvb2xlYW4gaW5pdEdMRXh0ZW5zaW9uVW5zdXBwb3J0ZWQoKSB7CisgICAgICAgIHJldHVybiBtRUdMRXh0ZW5zaW9uVW5zdXBwb3J0ZWQ7CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgaW5pdEdsKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIGlmIChtRWdsU3VyZmFjZSAhPSBudWxsKSByZXR1cm47CisgICAgICAgIGluaXRHbCgwLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5pdEdsKGludCBlZ2xDb2xvclNwYWNlLCBib29sZWFuIHVzZUhhbGZGbG9hdCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGlmIChtRWdsU3VyZmFjZSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoZWdsQ29sb3JTcGFjZSAhPSBtRWdsQ29sb3JTcGFjZSB8fCB1c2VIYWxmRmxvYXQgIT0gbUlzRUdMV2lkZUdhbXV0KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNhbm5vdCBjaGFuZ2UgY29uZmlnIGFmdGVyIGluaXRpYWxpemF0aW9uIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbUVnbENvbG9yU3BhY2UgPSBlZ2xDb2xvclNwYWNlOworICAgICAgICBtSXNFR0xXaWRlR2FtdXQgPSB1c2VIYWxmRmxvYXQ7CisgICAgICAgIG1FR0xFeHRlbnNpb25VbnN1cHBvcnRlZCA9IGZhbHNlOwogICAgICAgICBydW5PbkdMVGhyZWFkKG1Eb0luaXRHTCk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgZHJhd0NvbG9yKGludCBjb2xvcikgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGRyYXdDb2xvcihDb2xvci5yZWQoY29sb3IpIC8gMjU1LjBmLAorICAgICAgICAgICAgICAgIENvbG9yLmdyZWVuKGNvbG9yKSAvIDI1NS4wZiwKKyAgICAgICAgICAgICAgICBDb2xvci5ibHVlKGNvbG9yKSAvIDI1NS4wZiwKKyAgICAgICAgICAgICAgICBDb2xvci5hbHBoYShjb2xvcikgLyAyNTUuMGYpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRyYXdDb2xvcihmbG9hdCByZWQsIGZsb2F0IGdyZWVuLCBmbG9hdCBibHVlLCBmbG9hdCBhbHBoYSkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIHJ1bk9uR0xUaHJlYWQoKCkgLT4gewotICAgICAgICAgICAgZ2xDbGVhckNvbG9yKENvbG9yLnJlZChjb2xvcikgLyAyNTUuMGYsCi0gICAgICAgICAgICAgICAgICAgIENvbG9yLmdyZWVuKGNvbG9yKSAvIDI1NS4wZiwKLSAgICAgICAgICAgICAgICAgICAgQ29sb3IuYmx1ZShjb2xvcikgLyAyNTUuMGYsCi0gICAgICAgICAgICAgICAgICAgIENvbG9yLmFscGhhKGNvbG9yKSAvIDI1NS4wZik7CisgICAgICAgICAgICBnbENsZWFyQ29sb3IocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOwogICAgICAgICAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKICAgICAgICAgICAgIGlmICghbUVnbC5lZ2xTd2FwQnVmZmVycyhtRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UpKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNhbm5vdCBzd2FwIGJ1ZmZlcnMiKTsKQEAgLTE2Miw5ICsyNDEsMzQgQEAKICAgICAgICAgfSk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgZmluaXNoR0woKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgaWYgKG1FZ2xTdXJmYWNlID09IG51bGwpIHJldHVybjsKLSAgICAgICAgcnVuT25HTFRocmVhZCgoKSAtPiBkb0ZpbmlzaEdMKCkpOworICAgIGludGVyZmFjZSBEcmF3RnJhbWUgeworICAgICAgICB2b2lkIGRyYXdGcmFtZShpbnQgd2lkdGgsIGludCBoZWlnaHQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRyYXdGcmFtZShNYXRyaXggdHJhbnNmb3JtLCBEcmF3RnJhbWUgY2FsbGJhY2spIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBDb3VudERvd25MYXRjaCBmZW5jZSA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICAgICAgcnVuT25VaVRocmVhZCgoKSAtPiB7CisgICAgICAgICAgICBtVGV4dHVyZVZpZXcuc2V0VHJhbnNmb3JtKHRyYW5zZm9ybSk7CisgICAgICAgICAgICBmZW5jZS5jb3VudERvd24oKTsKKyAgICAgICAgfSk7CisgICAgICAgIHdhaXRGb3JFbnRlckFuaW1hdGlvbkNvbXBsZXRlKCk7CisgICAgICAgIHdhaXRGb3JTdXJmYWNlKCk7CisgICAgICAgIGluaXRHbCgpOworICAgICAgICBmZW5jZS5hd2FpdCgpOworICAgICAgICBpbnQgc3VyZmFjZVVwZGF0ZUNvdW50ID0gbVN1cmZhY2VVcGRhdGVkQ291bnQ7CisgICAgICAgIHJ1bk9uR0xUaHJlYWQoKCkgLT4geworICAgICAgICAgICAgY2FsbGJhY2suZHJhd0ZyYW1lKG1TdXJmYWNlV2lkdGgsIG1TdXJmYWNlSGVpZ2h0KTsKKyAgICAgICAgICAgIGlmICghbUVnbC5lZ2xTd2FwQnVmZmVycyhtRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNhbm5vdCBzd2FwIGJ1ZmZlcnMiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIHdhaXRGb3JTdXJmYWNlVXBkYXRlQ291bnQoc3VyZmFjZVVwZGF0ZUNvdW50ICsgMSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWF0cml4IElERU5USVRZID0gbmV3IE1hdHJpeCgpOworCisgICAgcHVibGljIHZvaWQgZHJhd0ZyYW1lKERyYXdGcmFtZSBjYWxsYmFjaykgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGRyYXdGcmFtZShJREVOVElUWSwgY2FsbGJhY2spOwogICAgIH0KIAogICAgIHB1YmxpYyBpbnQgd2FpdEZvclN1cmZhY2VVcGRhdGVDb3VudChpbnQgdXBkYXRlQ291bnQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CkBAIC0xODEsMTcgKzI4NSwyNSBAQAogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBkb0ZpbmlzaEdMKCkgewotICAgICAgICBtRWdsLmVnbERlc3Ryb3lDb250ZXh0KG1FZ2xEaXNwbGF5LCBtRWdsQ29udGV4dCk7Ci0gICAgICAgIG1FZ2xDb250ZXh0ID0gbnVsbDsKLSAgICAgICAgbUVnbC5lZ2xEZXN0cm95U3VyZmFjZShtRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UpOwotICAgICAgICBtRWdsU3VyZmFjZSA9IG51bGw7Ci0gICAgICAgIG1FZ2wuZWdsVGVybWluYXRlKG1FZ2xEaXNwbGF5KTsKKyAgICAgICAgaWYgKG1FZ2xTdXJmYWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1FZ2wuZWdsRGVzdHJveVN1cmZhY2UobUVnbERpc3BsYXksIG1FZ2xTdXJmYWNlKTsKKyAgICAgICAgICAgIG1FZ2xTdXJmYWNlID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAobUVnbENvbnRleHQgIT0gbnVsbCkgeworICAgICAgICAgICAgbUVnbC5lZ2xEZXN0cm95Q29udGV4dChtRWdsRGlzcGxheSwgbUVnbENvbnRleHQpOworICAgICAgICAgICAgbUVnbENvbnRleHQgPSBudWxsOworICAgICAgICB9CisgICAgICAgIGlmIChtRWdsRGlzcGxheSAhPSBudWxsKSB7CisgICAgICAgICAgICBtRWdsLmVnbFRlcm1pbmF0ZShtRWdsRGlzcGxheSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VUZXh0dXJlQXZhaWxhYmxlKFN1cmZhY2VUZXh0dXJlIHN1cmZhY2UsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CiAgICAgICAgICAgICBtU3VyZmFjZSA9IHN1cmZhY2U7CisgICAgICAgICAgICBtU3VyZmFjZVdpZHRoID0gd2lkdGg7CisgICAgICAgICAgICBtU3VyZmFjZUhlaWdodCA9IGhlaWdodDsKICAgICAgICAgICAgIG1Mb2NrLm5vdGlmeUFsbCgpOwogICAgICAgICB9CiAgICAgfQpAQCAtMjM0LDYgKzM0NiwzOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgR0xVdGlscy5nZXRFR0xFcnJvclN0cmluZyhtRWdsLmVnbEdldEVycm9yKCkpKTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgLy8gY2hlY2sgZXh0ZW5zaW9ucyBidXQgc3RpbGwgYXR0ZW1wdCB0byBydW4gdGhlIHRlc3QsIGlmIHRoZSB0ZXN0IGZhaWxzIHRoZW4gd2UgY2hlY2sKKyAgICAgICAgICAgIC8vIG1FR0xFeHRlbnNpb25VbnN1cHBvcnRlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGZhaWx1cmUgd2FzIGV4cGVjdGVkLgorICAgICAgICAgICAgU3RyaW5nIGV4dGVuc2lvbnMgPSBtRWdsLmVnbFF1ZXJ5U3RyaW5nKG1FZ2xEaXNwbGF5LCBFR0wxMC5FR0xfRVhURU5TSU9OUyk7CisgICAgICAgICAgICBpZiAobUVnbENvbG9yU3BhY2UgIT0gMCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBlZ2xDb2xvclNwYWNlU3RyaW5nID0gbnVsbDsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG1FZ2xDb2xvclNwYWNlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVGV4dHVyZVZpZXdUZXN0LkVHTF9HTF9DT0xPUlNQQUNFX0RJU1BMQVlfUDNfRVhUOgorICAgICAgICAgICAgICAgICAgICAgICAgZWdsQ29sb3JTcGFjZVN0cmluZyA9ICJFR0xfRVhUX2dsX2NvbG9yc3BhY2VfZGlzcGxheV9wMyI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUZXh0dXJlVmlld1Rlc3QuRUdMX0dMX0NPTE9SU1BBQ0VfU1JHQl9LSFI6CisgICAgICAgICAgICAgICAgICAgICAgICBlZ2xDb2xvclNwYWNlU3RyaW5nID0gIkVHTF9LSFJfZ2xfY29sb3JzcGFjZSI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUZXh0dXJlVmlld1Rlc3QuRUdMX0dMX0NPTE9SU1BBQ0VfU0NSR0JfTElORUFSX0VYVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGVnbENvbG9yU3BhY2VTdHJpbmcgPSAiRUdMX0VYVF9nbF9jb2xvcnNwYWNlX3NjcmdiX2xpbmVhciI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmtub3duIGVnbENvbG9yU3BhY2U6ICIgKyBtRWdsQ29sb3JTcGFjZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghZXh0ZW5zaW9ucy5jb250YWlucyhlZ2xDb2xvclNwYWNlU3RyaW5nKSkgeworICAgICAgICAgICAgICAgICAgICBtRUdMRXh0ZW5zaW9uVW5zdXBwb3J0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtSXNFR0xXaWRlR2FtdXQgJiYgIWV4dGVuc2lvbnMuY29udGFpbnMoIkVYVF9waXhlbF9mb3JtYXRfZmxvYXQiKSkgeworICAgICAgICAgICAgICAgIG1FR0xFeHRlbnNpb25VbnN1cHBvcnRlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJZiB0aGUgZXh0ZW5zaW9uIGlzIHByZXNlbnQgYnV0IHRoZSBkZXZpY2UgZG9lc24ndCBjbGFpbSB0byBoYXZlIGEgd2lkZSBjb2xvciBnYW11dAorICAgICAgICAgICAgLy8gZGlzcGxheSB0aGVuIGl0IG1pZ2h0IG5vdCByZXR1cm4gYW55IGFjdHVhbCBmbG9hdCBmb3JtYXRzLgorICAgICAgICAgICAgaWYgKG1Jc0VHTFdpZGVHYW11dCAmJiAhbUVHTEV4dGVuc2lvblVuc3VwcG9ydGVkCisgICAgICAgICAgICAgICAgICAgICYmICFnZXRXaW5kb3dNYW5hZ2VyKCkuZ2V0RGVmYXVsdERpc3BsYXkoKS5pc1dpZGVDb2xvckdhbXV0KCkpIHsKKyAgICAgICAgICAgICAgICBtRUdMRXh0ZW5zaW9uVW5zdXBwb3J0ZWQgPSB0cnVlOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBtRWdsQ29uZmlnID0gY2hvb3NlRWdsQ29uZmlnKCk7CiAgICAgICAgICAgICBpZiAobUVnbENvbmZpZyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImVnbENvbmZpZyBub3QgaW5pdGlhbGl6ZWQiKTsKQEAgLTI0Miw3ICszODYsOCBAQAogICAgICAgICAgICAgbUVnbENvbnRleHQgPSBjcmVhdGVDb250ZXh0KG1FZ2wsIG1FZ2xEaXNwbGF5LCBtRWdsQ29uZmlnKTsKIAogICAgICAgICAgICAgbUVnbFN1cmZhY2UgPSBtRWdsLmVnbENyZWF0ZVdpbmRvd1N1cmZhY2UobUVnbERpc3BsYXksIG1FZ2xDb25maWcsCi0gICAgICAgICAgICAgICAgICAgIG1TdXJmYWNlLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgbVN1cmZhY2UsIChtRWdsQ29sb3JTcGFjZSA9PSAwKSA/IG51bGwgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBpbnRbXSB7IEVHTF9HTF9DT0xPUlNQQUNFX0tIUiwgbUVnbENvbG9yU3BhY2UsIEVHTDEwLkVHTF9OT05FIH0pOwogCiAgICAgICAgICAgICBpZiAobUVnbFN1cmZhY2UgPT0gbnVsbCB8fCBtRWdsU3VyZmFjZSA9PSBFR0wxMC5FR0xfTk9fU1VSRkFDRSkgewogICAgICAgICAgICAgICAgIGludCBlcnJvciA9IG1FZ2wuZWdsR2V0RXJyb3IoKTsKQEAgLTI3NiwxNSArNDIxLDI5IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBpbnRbXSBnZXRDb25maWcoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgaW50W10gewotICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9SRU5ERVJBQkxFX1RZUEUsIEVHTF9PUEVOR0xfRVMyX0JJVCwKLSAgICAgICAgICAgICAgICBFR0wxMC5FR0xfUkVEX1NJWkUsIDgsCi0gICAgICAgICAgICAgICAgRUdMMTAuRUdMX0dSRUVOX1NJWkUsIDgsCi0gICAgICAgICAgICAgICAgRUdMMTAuRUdMX0JMVUVfU0laRSwgOCwKLSAgICAgICAgICAgICAgICBFR0wxMC5FR0xfQUxQSEFfU0laRSwgOCwKLSAgICAgICAgICAgICAgICBFR0wxMC5FR0xfREVQVEhfU0laRSwgMCwKLSAgICAgICAgICAgICAgICBFR0wxMC5FR0xfU1RFTkNJTF9TSVpFLCAwLAotICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9OT05FCi0gICAgICAgIH07CisgICAgICAgIGlmIChtSXNFR0xXaWRlR2FtdXQpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgaW50W117CisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9SRU5ERVJBQkxFX1RZUEUsIEVHTF9PUEVOR0xfRVMyX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgRUdMX0NPTE9SX0NPTVBPTkVOVF9UWVBFX0VYVCwgRUdMX0NPTE9SX0NPTVBPTkVOVF9UWVBFX0ZMT0FUX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1JFRF9TSVpFLCAxNiwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0dSRUVOX1NJWkUsIDE2LAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfQkxVRV9TSVpFLCAxNiwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0FMUEhBX1NJWkUsIDE2LAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfREVQVEhfU0laRSwgMCwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1NURU5DSUxfU0laRSwgMCwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX05PTkUKKyAgICAgICAgICAgIH07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IGludFtdeworICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfUkVOREVSQUJMRV9UWVBFLCBFR0xfT1BFTkdMX0VTMl9CSVQsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9SRURfU0laRSwgOCwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0dSRUVOX1NJWkUsIDgsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9CTFVFX1NJWkUsIDgsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9BTFBIQV9TSVpFLCA4LAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfREVQVEhfU0laRSwgMCwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1NURU5DSUxfU0laRSwgMCwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX05PTkUKKyAgICAgICAgICAgIH07CisgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1RleHR1cmVWaWV3VGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9UZXh0dXJlVmlld1Rlc3QuamF2YQppbmRleCBmNjZlMTM3Li42ODI0ODNkIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1RleHR1cmVWaWV3VGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvVGV4dHVyZVZpZXdUZXN0LmphdmEKQEAgLTE2LDk5ICsxNiwzNzcgQEAKIAogcGFja2FnZSBhbmRyb2lkLnZpZXcuY3RzOwogCitpbXBvcnQgc3RhdGljIGFuZHJvaWQub3BlbmdsLkdMRVMyMC5HTF9DT0xPUl9CVUZGRVJfQklUOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm9wZW5nbC5HTEVTMjAuR0xfU0NJU1NPUl9URVNUOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm9wZW5nbC5HTEVTMjAuZ2xDbGVhcjsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5vcGVuZ2wuR0xFUzIwLmdsQ2xlYXJDb2xvcjsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5vcGVuZ2wuR0xFUzIwLmdsRW5hYmxlOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm9wZW5nbC5HTEVTMjAuZ2xTY2lzc29yOworCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwogCiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yU3BhY2U7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5NYXRyaXg7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuSGFsZjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuUGl4ZWxDb3B5OworaW1wb3J0IGFuZHJvaWQudmlldy5UZXh0dXJlVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuU3luY2hyb25vdXNQaXhlbENvcHk7CiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5XaWRnZXRUZXN0VXRpbHM7CiAKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlT3JkZXI7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZW91dEV4Y2VwdGlvbjsKIAogQE1lZGl1bVRlc3QKIEBSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCiBwdWJsaWMgY2xhc3MgVGV4dHVyZVZpZXdUZXN0IHsKLSAgICBwcml2YXRlIFRleHR1cmVWaWV3Q3RzQWN0aXZpdHkgbUFjdGl2aXR5OwotICAgIHByaXZhdGUgU3luY2hyb25vdXNQaXhlbENvcHkgbVBpeGVsQ29weTsKLSAgICBwcml2YXRlIFdpbmRvdyBtV2luZG93OworCisgICAgc3RhdGljIGZpbmFsIGludCBFR0xfR0xfQ09MT1JTUEFDRV9TUkdCX0tIUiA9IDB4MzA4OTsKKyAgICBzdGF0aWMgZmluYWwgaW50IEVHTF9HTF9DT0xPUlNQQUNFX0RJU1BMQVlfUDNfRVhUID0gMHgzMzYzOworICAgIHN0YXRpYyBmaW5hbCBpbnQgRUdMX0dMX0NPTE9SU1BBQ0VfU0NSR0JfTElORUFSX0VYVCA9IDB4MzM1MDsKIAogICAgIEBSdWxlCiAgICAgcHVibGljIEFjdGl2aXR5VGVzdFJ1bGU8VGV4dHVyZVZpZXdDdHNBY3Rpdml0eT4gbUFjdGl2aXR5UnVsZSA9Ci0gICAgICAgICAgICBuZXcgQWN0aXZpdHlUZXN0UnVsZTw+KFRleHR1cmVWaWV3Q3RzQWN0aXZpdHkuY2xhc3MpOwotCi0gICAgQEJlZm9yZQotICAgIHB1YmxpYyB2b2lkIHNldHVwKCkgewotICAgICAgICBtQWN0aXZpdHkgPSBtQWN0aXZpdHlSdWxlLmdldEFjdGl2aXR5KCk7Ci0gICAgICAgIG1QaXhlbENvcHkgPSBuZXcgU3luY2hyb25vdXNQaXhlbENvcHkoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtQWN0aXZpdHkpOwotICAgIH0KKyAgICAgICAgICAgIG5ldyBBY3Rpdml0eVRlc3RSdWxlPD4oVGV4dHVyZVZpZXdDdHNBY3Rpdml0eS5jbGFzcywgZmFsc2UsIGZhbHNlKTsKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEZpcnN0RnJhbWVzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIG1BY3Rpdml0eS53YWl0Rm9yRW50ZXJBbmltYXRpb25Db21wbGV0ZSgpOworICAgICAgICBmaW5hbCBUZXh0dXJlVmlld0N0c0FjdGl2aXR5IGFjdGl2aXR5ID0gbUFjdGl2aXR5UnVsZS5sYXVuY2hBY3Rpdml0eShudWxsKTsKKyAgICAgICAgYWN0aXZpdHkud2FpdEZvckVudGVyQW5pbWF0aW9uQ29tcGxldGUoKTsKIAogICAgICAgICBmaW5hbCBQb2ludCBjZW50ZXIgPSBuZXcgUG9pbnQoKTsKKyAgICAgICAgZmluYWwgV2luZG93W10gd2luZG93UmV0ID0gbmV3IFdpbmRvd1sxXTsKICAgICAgICAgbUFjdGl2aXR5UnVsZS5ydW5PblVpVGhyZWFkKCgpIC0+IHsKLSAgICAgICAgICAgIFZpZXcgY29udGVudCA9IG1BY3Rpdml0eS5maW5kVmlld0J5SWQoYW5kcm9pZC5SLmlkLmNvbnRlbnQpOworICAgICAgICAgICAgVmlldyBjb250ZW50ID0gYWN0aXZpdHkuZmluZFZpZXdCeUlkKGFuZHJvaWQuUi5pZC5jb250ZW50KTsKICAgICAgICAgICAgIGludFtdIG91dExvY2F0aW9uID0gbmV3IGludFsyXTsKICAgICAgICAgICAgIGNvbnRlbnQuZ2V0TG9jYXRpb25PblNjcmVlbihvdXRMb2NhdGlvbik7CiAgICAgICAgICAgICBjZW50ZXIueCA9IG91dExvY2F0aW9uWzBdICsgKGNvbnRlbnQuZ2V0V2lkdGgoKSAvIDIpOwogICAgICAgICAgICAgY2VudGVyLnkgPSBvdXRMb2NhdGlvblsxXSArIChjb250ZW50LmdldEhlaWdodCgpIC8gMik7Ci0gICAgICAgICAgICBtV2luZG93ID0gbUFjdGl2aXR5LmdldFdpbmRvdygpOworICAgICAgICAgICAgd2luZG93UmV0WzBdID0gYWN0aXZpdHkuZ2V0V2luZG93KCk7CiAgICAgICAgIH0pOworICAgICAgICBmaW5hbCBXaW5kb3cgd2luZG93ID0gd2luZG93UmV0WzBdOwogICAgICAgICBhc3NlcnRUcnVlKGNlbnRlci54ID4gMCk7CiAgICAgICAgIGFzc2VydFRydWUoY2VudGVyLnkgPiAwKTsKLSAgICAgICAgd2FpdEZvckNvbG9yKGNlbnRlciwgQ29sb3IuV0hJVEUpOwotICAgICAgICBtQWN0aXZpdHkud2FpdEZvclN1cmZhY2UoKTsKLSAgICAgICAgbUFjdGl2aXR5LmluaXRHbCgpOworICAgICAgICB3YWl0Rm9yQ29sb3Iod2luZG93LCBjZW50ZXIsIENvbG9yLldISVRFKTsKKyAgICAgICAgYWN0aXZpdHkud2FpdEZvclN1cmZhY2UoKTsKKyAgICAgICAgYWN0aXZpdHkuaW5pdEdsKCk7CiAgICAgICAgIGludCB1cGRhdGVkQ291bnQ7Ci0gICAgICAgIHVwZGF0ZWRDb3VudCA9IG1BY3Rpdml0eS53YWl0Rm9yU3VyZmFjZVVwZGF0ZUNvdW50KDApOworICAgICAgICB1cGRhdGVkQ291bnQgPSBhY3Rpdml0eS53YWl0Rm9yU3VyZmFjZVVwZGF0ZUNvdW50KDApOwogICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdXBkYXRlZENvdW50KTsKLSAgICAgICAgbUFjdGl2aXR5LmRyYXdDb2xvcihDb2xvci5HUkVFTik7Ci0gICAgICAgIHVwZGF0ZWRDb3VudCA9IG1BY3Rpdml0eS53YWl0Rm9yU3VyZmFjZVVwZGF0ZUNvdW50KDEpOworICAgICAgICBhY3Rpdml0eS5kcmF3Q29sb3IoQ29sb3IuR1JFRU4pOworICAgICAgICB1cGRhdGVkQ291bnQgPSBhY3Rpdml0eS53YWl0Rm9yU3VyZmFjZVVwZGF0ZUNvdW50KDEpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMSwgdXBkYXRlZENvdW50KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKENvbG9yLldISVRFLCBnZXRQaXhlbChjZW50ZXIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKENvbG9yLldISVRFLCBnZXRQaXhlbCh3aW5kb3csIGNlbnRlcikpOwogICAgICAgICBXaWRnZXRUZXN0VXRpbHMucnVuT25NYWluQW5kRHJhd1N5bmMobUFjdGl2aXR5UnVsZSwKLSAgICAgICAgICAgICAgICBtQWN0aXZpdHkuZmluZFZpZXdCeUlkKGFuZHJvaWQuUi5pZC5jb250ZW50KSwgKCkgLT4gbUFjdGl2aXR5LnJlbW92ZUNvdmVyKCkpOworICAgICAgICAgICAgICAgIGFjdGl2aXR5LmZpbmRWaWV3QnlJZChhbmRyb2lkLlIuaWQuY29udGVudCksICgpIC0+IGFjdGl2aXR5LnJlbW92ZUNvdmVyKCkpOwogCi0gICAgICAgIGludCBjb2xvciA9IHdhaXRGb3JDaGFuZ2UoY2VudGVyLCBDb2xvci5XSElURSk7CisgICAgICAgIGludCBjb2xvciA9IHdhaXRGb3JDaGFuZ2Uod2luZG93LCBjZW50ZXIsIENvbG9yLldISVRFKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKENvbG9yLkdSRUVOLCBjb2xvcik7Ci0gICAgICAgIG1BY3Rpdml0eS5kcmF3Q29sb3IoQ29sb3IuQkxVRSk7Ci0gICAgICAgIHVwZGF0ZWRDb3VudCA9IG1BY3Rpdml0eS53YWl0Rm9yU3VyZmFjZVVwZGF0ZUNvdW50KDIpOworICAgICAgICBhY3Rpdml0eS5kcmF3Q29sb3IoQ29sb3IuQkxVRSk7CisgICAgICAgIHVwZGF0ZWRDb3VudCA9IGFjdGl2aXR5LndhaXRGb3JTdXJmYWNlVXBkYXRlQ291bnQoMik7CiAgICAgICAgIGFzc2VydEVxdWFscygyLCB1cGRhdGVkQ291bnQpOwotICAgICAgICBjb2xvciA9IHdhaXRGb3JDaGFuZ2UoY2VudGVyLCBjb2xvcik7CisgICAgICAgIGNvbG9yID0gd2FpdEZvckNoYW5nZSh3aW5kb3csIGNlbnRlciwgY29sb3IpOwogICAgICAgICBhc3NlcnRFcXVhbHMoQ29sb3IuQkxVRSwgY29sb3IpOwogICAgIH0KIAotICAgIHByaXZhdGUgaW50IGdldFBpeGVsKFBvaW50IHBvaW50KSB7Ci0gICAgICAgIEJpdG1hcCBzY3JlZW5zaG90ID0gQml0bWFwLmNyZWF0ZUJpdG1hcChtV2luZG93LmdldERlY29yVmlldygpLmdldFdpZHRoKCksCi0gICAgICAgICAgICAgICAgbVdpbmRvdy5nZXREZWNvclZpZXcoKS5nZXRIZWlnaHQoKSwgQml0bWFwLkNvbmZpZy5BUkdCXzg4ODgpOwotICAgICAgICBpbnQgcmVzdWx0ID0gbVBpeGVsQ29weS5yZXF1ZXN0KG1XaW5kb3csIHNjcmVlbnNob3QpOworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNjYWxpbmcoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgZmluYWwgVGV4dHVyZVZpZXdDdHNBY3Rpdml0eSBhY3Rpdml0eSA9IG1BY3Rpdml0eVJ1bGUubGF1bmNoQWN0aXZpdHkobnVsbCk7CisgICAgICAgIGFjdGl2aXR5LmRyYXdGcmFtZShUZXh0dXJlVmlld1Rlc3Q6OmRyYXdHbFF1YWQpOworICAgICAgICBmaW5hbCBCaXRtYXAgYml0bWFwID0gQml0bWFwLmNyZWF0ZUJpdG1hcCgxMCwgMTAsIEJpdG1hcC5Db25maWcuQVJHQl84ODg4KTsKKyAgICAgICAgbUFjdGl2aXR5UnVsZS5ydW5PblVpVGhyZWFkKCgpIC0+IHsKKyAgICAgICAgICAgIGFjdGl2aXR5LmdldFRleHR1cmVWaWV3KCkuZ2V0Qml0bWFwKGJpdG1hcCk7CisgICAgICAgIH0pOworICAgICAgICBQaXhlbENvcHlUZXN0LmFzc2VydEJpdG1hcFF1YWRDb2xvcihiaXRtYXAsCisgICAgICAgICAgICAgICAgQ29sb3IuUkVELCBDb2xvci5HUkVFTiwgQ29sb3IuQkxVRSwgQ29sb3IuQkxBQ0spOworICAgIH0KKworICAgIEBUZXN0CisgICAgQElnbm9yZSAvLyBUZW1wb3JhcnksIHNlZSBiLzExMTgwMTYyNgorICAgIHB1YmxpYyB2b2lkIHRlc3RSb3RhdGVTY2FsZSgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBmaW5hbCBUZXh0dXJlVmlld0N0c0FjdGl2aXR5IGFjdGl2aXR5ID0gbUFjdGl2aXR5UnVsZS5sYXVuY2hBY3Rpdml0eShudWxsKTsKKyAgICAgICAgZmluYWwgVGV4dHVyZVZpZXcgdGV4dHVyZVZpZXcgPSBhY3Rpdml0eS5nZXRUZXh0dXJlVmlldygpOworICAgICAgICBXaWRnZXRUZXN0VXRpbHMucnVuT25NYWluQW5kRHJhd1N5bmMobUFjdGl2aXR5UnVsZSwgYWN0aXZpdHkuZ2V0VGV4dHVyZVZpZXcoKSwgbnVsbCk7CisgICAgICAgIE1hdHJpeCByb3RhdGUgPSBuZXcgTWF0cml4KCk7CisgICAgICAgIHJvdGF0ZS5zZXRSb3RhdGUoMTgwLCB0ZXh0dXJlVmlldy5nZXRXaWR0aCgpIC8gMiwgdGV4dHVyZVZpZXcuZ2V0SGVpZ2h0KCkgLyAyKTsKKyAgICAgICAgYWN0aXZpdHkuZHJhd0ZyYW1lKHJvdGF0ZSwgVGV4dHVyZVZpZXdUZXN0OjpkcmF3R2xRdWFkKTsKKyAgICAgICAgZmluYWwgQml0bWFwIGJpdG1hcCA9IEJpdG1hcC5jcmVhdGVCaXRtYXAoMTAsIDEwLCBCaXRtYXAuQ29uZmlnLkFSR0JfODg4OCk7CisgICAgICAgIG1BY3Rpdml0eVJ1bGUucnVuT25VaVRocmVhZCgoKSAtPiB7CisgICAgICAgICAgICBhY3Rpdml0eS5nZXRUZXh0dXJlVmlldygpLmdldEJpdG1hcChiaXRtYXApOworICAgICAgICB9KTsKKyAgICAgICAgLy8gVmVyaWZ5IHRoZSBtYXRyaXggZGlkIG5vdCByb3RhdGUgY29udGVudCBvZiBnZXRUZXh0dXJlVmlldy5nZXRCaXRtYXAoKS4KKyAgICAgICAgUGl4ZWxDb3B5VGVzdC5hc3NlcnRCaXRtYXBRdWFkQ29sb3IoYml0bWFwLAorICAgICAgICAgICAgICAgIENvbG9yLlJFRCwgQ29sb3IuR1JFRU4sIENvbG9yLkJMVUUsIENvbG9yLkJMQUNLKTsKKworICAgICAgICAvLyBSZW1vdmUgY292ZXIgYW5kIGNhbGN1bGF0ZSBUZXh0dXJlVmlldyBwb3NpdGlvbiBvbiB0aGUgc2NyZWVuLgorICAgICAgICBXaWRnZXRUZXN0VXRpbHMucnVuT25NYWluQW5kRHJhd1N5bmMobUFjdGl2aXR5UnVsZSwKKyAgICAgICAgICAgICAgICBhY3Rpdml0eS5maW5kVmlld0J5SWQoYW5kcm9pZC5SLmlkLmNvbnRlbnQpLCAoKSAtPiBhY3Rpdml0eS5yZW1vdmVDb3ZlcigpKTsKKyAgICAgICAgZmluYWwgUmVjdCB2aWV3UG9zID0gbmV3IFJlY3QoKTsKKyAgICAgICAgbUFjdGl2aXR5UnVsZS5ydW5PblVpVGhyZWFkKCgpIC0+IHsKKyAgICAgICAgICAgIGludFtdIG91dExvY2F0aW9uID0gbmV3IGludFsyXTsKKyAgICAgICAgICAgIHRleHR1cmVWaWV3LmdldExvY2F0aW9uT25TY3JlZW4ob3V0TG9jYXRpb24pOworICAgICAgICAgICAgdmlld1Bvcy5sZWZ0ID0gb3V0TG9jYXRpb25bMF07CisgICAgICAgICAgICB2aWV3UG9zLnRvcCA9IG91dExvY2F0aW9uWzFdOworICAgICAgICAgICAgdmlld1Bvcy5yaWdodCA9IHZpZXdQb3MubGVmdCArIHRleHR1cmVWaWV3LmdldFdpZHRoKCk7CisgICAgICAgICAgICB2aWV3UG9zLmJvdHRvbSA9IHZpZXdQb3MudG9wICsgdGV4dHVyZVZpZXcuZ2V0SGVpZ2h0KCk7CisgICAgICAgIH0pOworCisgICAgICAgIC8vIENhcHR1cmUgdGhlIHBvcnRpb24gb2YgdGhlIHNjcmVlbiB0aGF0IGNvbnRhaW5zIHRoZSB0ZXh0dXJlIHZpZXcgb25seS4KKyAgICAgICAgV2luZG93IHdpbmRvdyA9IGFjdGl2aXR5LmdldFdpbmRvdygpOworICAgICAgICBCaXRtYXAgc2NyZWVuc2hvdCA9IEJpdG1hcC5jcmVhdGVCaXRtYXAoMTAwLCAxMDAsIEJpdG1hcC5Db25maWcuQVJHQl84ODg4KTsKKyAgICAgICAgaW50IHJlc3VsdCA9IG5ldyBTeW5jaHJvbm91c1BpeGVsQ29weSgpLnJlcXVlc3Qod2luZG93LCB2aWV3UG9zLCBzY3JlZW5zaG90KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJDb3B5IHJlcXVlc3QgZmFpbGVkIiwgUGl4ZWxDb3B5LlNVQ0NFU1MsIHJlc3VsdCk7CisgICAgICAgIC8vIFZlcmlmeSB0aGUgbWF0cml4IHJvdGF0ZWQgdGhlIFRleHR1cmVWaWV3IGNvbnRlbnQgZHJhd24gb24gdGhlIHNjcmVlbi4KKyAgICAgICAgUGl4ZWxDb3B5VGVzdC5hc3NlcnRCaXRtYXBRdWFkQ29sb3Ioc2NyZWVuc2hvdCwKKyAgICAgICAgICAgICAgICBDb2xvci5CTEFDSywgQ29sb3IuQkxVRSwgQ29sb3IuR1JFRU4sIENvbG9yLlJFRCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBASWdub3JlIC8vIFRlbXBvcmFyeSwgc2VlIGIvMTExODAxNjI2CisgICAgcHVibGljIHZvaWQgdGVzdFRyYW5zZm9ybVNjYWxlKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGZpbmFsIFRleHR1cmVWaWV3Q3RzQWN0aXZpdHkgYWN0aXZpdHkgPSBtQWN0aXZpdHlSdWxlLmxhdW5jaEFjdGl2aXR5KG51bGwpOworICAgICAgICBmaW5hbCBUZXh0dXJlVmlldyB0ZXh0dXJlVmlldyA9IGFjdGl2aXR5LmdldFRleHR1cmVWaWV3KCk7CisgICAgICAgIFdpZGdldFRlc3RVdGlscy5ydW5Pbk1haW5BbmREcmF3U3luYyhtQWN0aXZpdHlSdWxlLCBhY3Rpdml0eS5nZXRUZXh0dXJlVmlldygpLCBudWxsKTsKKyAgICAgICAgTWF0cml4IHRyYW5zZm9ybSA9IG5ldyBNYXRyaXgoKTsKKyAgICAgICAgZmluYWwgZmxvYXQgdHJhbnNsYXRlWSA9IDEwMC4wZjsKKyAgICAgICAgZmluYWwgZmxvYXQgc2NhbGVZID0gMC4yNWY7CisgICAgICAgIGZsb2F0W10gdmFsdWVzID0gezEsIDAsIDAsIDAsIHNjYWxlWSwgdHJhbnNsYXRlWSwgMCwgMCwgMX07CisgICAgICAgIHRyYW5zZm9ybS5zZXRWYWx1ZXModmFsdWVzKTsKKyAgICAgICAgYWN0aXZpdHkuZHJhd0ZyYW1lKHRyYW5zZm9ybSwgVGV4dHVyZVZpZXdUZXN0OjpkcmF3R2xRdWFkKTsKKyAgICAgICAgZmluYWwgQml0bWFwIGJpdG1hcCA9IEJpdG1hcC5jcmVhdGVCaXRtYXAoMTAsIDEwLCBCaXRtYXAuQ29uZmlnLkFSR0JfODg4OCk7CisgICAgICAgIG1BY3Rpdml0eVJ1bGUucnVuT25VaVRocmVhZCgoKSAtPiB7CisgICAgICAgICAgICBhY3Rpdml0eS5nZXRUZXh0dXJlVmlldygpLmdldEJpdG1hcChiaXRtYXApOworICAgICAgICB9KTsKKyAgICAgICAgLy8gVmVyaWZ5IHRoZSBtYXRyaXggZGlkIG5vdCBhZmZlY3QgdGhlIGNvbnRlbnQgb2YgZ2V0VGV4dHVyZVZpZXcuZ2V0Qml0bWFwKCkuCisgICAgICAgIFBpeGVsQ29weVRlc3QuYXNzZXJ0Qml0bWFwUXVhZENvbG9yKGJpdG1hcCwKKyAgICAgICAgICAgICAgICBDb2xvci5SRUQsIENvbG9yLkdSRUVOLCBDb2xvci5CTFVFLCBDb2xvci5CTEFDSyk7CisKKyAgICAgICAgLy8gUmVtb3ZlIGNvdmVyIGFuZCBjYWxjdWxhdGUgVGV4dHVyZVZpZXcgcG9zaXRpb24gb24gdGhlIHNjcmVlbi4KKyAgICAgICAgV2lkZ2V0VGVzdFV0aWxzLnJ1bk9uTWFpbkFuZERyYXdTeW5jKG1BY3Rpdml0eVJ1bGUsCisgICAgICAgICAgICAgICAgYWN0aXZpdHkuZmluZFZpZXdCeUlkKGFuZHJvaWQuUi5pZC5jb250ZW50KSwgKCkgLT4gYWN0aXZpdHkucmVtb3ZlQ292ZXIoKSk7CisgICAgICAgIGZpbmFsIFJlY3Qgdmlld1BvcyA9IG5ldyBSZWN0KCk7CisgICAgICAgIG1BY3Rpdml0eVJ1bGUucnVuT25VaVRocmVhZCgoKSAtPiB7CisgICAgICAgICAgICBpbnRbXSBvdXRMb2NhdGlvbiA9IG5ldyBpbnRbMl07CisgICAgICAgICAgICB0ZXh0dXJlVmlldy5nZXRMb2NhdGlvbk9uU2NyZWVuKG91dExvY2F0aW9uKTsKKyAgICAgICAgICAgIHZpZXdQb3MubGVmdCA9IG91dExvY2F0aW9uWzBdOworICAgICAgICAgICAgdmlld1Bvcy50b3AgPSBvdXRMb2NhdGlvblsxXTsKKyAgICAgICAgICAgIHZpZXdQb3MucmlnaHQgPSB2aWV3UG9zLmxlZnQgKyB0ZXh0dXJlVmlldy5nZXRXaWR0aCgpOworICAgICAgICAgICAgdmlld1Bvcy5ib3R0b20gPSB2aWV3UG9zLnRvcCArIHRleHR1cmVWaWV3LmdldEhlaWdodCgpOworICAgICAgICB9KTsKKworICAgICAgICAvLyBDYXB0dXJlIHRoZSBwb3J0aW9uIG9mIHRoZSBzY3JlZW4gdGhhdCBjb250YWlucyB0aGUgdGV4dHVyZSB2aWV3IG9ubHkuCisgICAgICAgIFdpbmRvdyB3aW5kb3cgPSBhY3Rpdml0eS5nZXRXaW5kb3coKTsKKyAgICAgICAgQml0bWFwIHNjcmVlbnNob3QgPSBCaXRtYXAuY3JlYXRlQml0bWFwKHZpZXdQb3Mud2lkdGgoKSwgdmlld1Bvcy5oZWlnaHQoKSwKKyAgICAgICAgICAgICAgICBCaXRtYXAuQ29uZmlnLkFSR0JfODg4OCk7CisgICAgICAgIGludCByZXN1bHQgPSBuZXcgU3luY2hyb25vdXNQaXhlbENvcHkoKS5yZXF1ZXN0KHdpbmRvdywgdmlld1Bvcywgc2NyZWVuc2hvdCk7CisgICAgICAgIGFzc2VydEVxdWFscygiQ29weSByZXF1ZXN0IGZhaWxlZCIsIFBpeGVsQ29weS5TVUNDRVNTLCByZXN1bHQpOworICAgICAgICAvLyBWZXJpZnkgdGhlIG1hdHJpeCBzY2FsZWQgYW5kIHRyYW5zbGF0ZWQgdGhlIFRleHR1cmVWaWV3IGNvbnRlbnQgZHJhd24gb24gdGhlIHNjcmVlbi4KKyAgICAgICAgLy8gInRleHR1cmVQb3MiIGhhcyBTdXJmYWNlVGV4dHVyZSBwb3NpdGlvbiBpbnNpZGUgdGhlIFRleHR1cmVWaWV3LgorICAgICAgICBmaW5hbCBSZWN0IHRleHR1cmVQb3MgPSBuZXcgUmVjdCgwLCAoaW50KSB0cmFuc2xhdGVZLCB2aWV3UG9zLndpZHRoKCksCisgICAgICAgICAgICAgICAgKGludCkgKHZpZXdQb3MuaGVpZ2h0KCkgKiBzY2FsZVkgKyB0cmFuc2xhdGVZKSk7CisKKyAgICAgICAgLy8gQXJlYXMgbm90IGNvdmVyZWQgYnkgdGhlIHRleHR1cmUgYXJlIGJsYWNrLCBiZWNhdXNlIEZyYW1lTGF5b3V0IGJhY2tncm91bmQgaXMgc2V0IHRvCisgICAgICAgIC8vIENvbG9yLkJMQUNLIGluIFRleHR1cmVWaWV3Q3RzQWN0aXZpdHkub25DcmVhdGUuCisgICAgICAgIGFzc2VydEVxdWFscygiYWJvdmUgdGV4dHVyZSIsIENvbG9yLkJMQUNLLAorICAgICAgICAgICAgICAgIHNjcmVlbnNob3QuZ2V0UGl4ZWwoMTAsIHRleHR1cmVQb3MudG9wIC0gMTApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiZWxvdyB0ZXh0dXJlIiwgQ29sb3IuQkxBQ0ssCisgICAgICAgICAgICAgICAgc2NyZWVuc2hvdC5nZXRQaXhlbCgxMCwgdGV4dHVyZVBvcy5ib3R0b20gKyAxMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRvcCBsZWZ0IiwgQ29sb3IuUkVELAorICAgICAgICAgICAgICAgIHNjcmVlbnNob3QuZ2V0UGl4ZWwodGV4dHVyZVBvcy5sZWZ0ICsgMTAsIHRleHR1cmVQb3MudG9wICsgMTApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0b3AgcmlnaHQiLCBDb2xvci5HUkVFTiwKKyAgICAgICAgICAgICAgICBzY3JlZW5zaG90LmdldFBpeGVsKHRleHR1cmVQb3MucmlnaHQgLSAxMCwgdGV4dHVyZVBvcy50b3AgKyAxMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkJvdHRvbSBsZWZ0IiwgQ29sb3IuQkxVRSwKKyAgICAgICAgICAgICAgICBzY3JlZW5zaG90LmdldFBpeGVsKHRleHR1cmVQb3MubGVmdCArIDEwLCB0ZXh0dXJlUG9zLmJvdHRvbSAtIDEwKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiQm90dG9tIHJpZ2h0IiwgQ29sb3IuQkxBQ0ssCisgICAgICAgICAgICAgICAgc2NyZWVuc2hvdC5nZXRQaXhlbCh0ZXh0dXJlUG9zLnJpZ2h0IC0gMTAsIHRleHR1cmVQb3MuYm90dG9tIC0gMTApKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRCaXRtYXBfODg4OF9QMygpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICB0ZXN0R2V0Qml0bWFwKEVHTF9HTF9DT0xPUlNQQUNFX0RJU1BMQVlfUDNfRVhULCBDb2xvclNwYWNlLk5hbWVkLkRJU1BMQVlfUDMsIGZhbHNlLAorICAgICAgICAgICAgICAgIG5ldyBGUDE2Q29tcGFyZShDb2xvclNwYWNlLk5hbWVkLkVYVEVOREVEX1NSR0IpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRCaXRtYXBfRlAxNl9QMygpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICB0ZXN0R2V0Qml0bWFwKEVHTF9HTF9DT0xPUlNQQUNFX0RJU1BMQVlfUDNfRVhULCBDb2xvclNwYWNlLk5hbWVkLkRJU1BMQVlfUDMsIHRydWUsCisgICAgICAgICAgICAgICAgbmV3IEZQMTZDb21wYXJlKENvbG9yU3BhY2UuTmFtZWQuRVhURU5ERURfU1JHQikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEJpdG1hcF9GUDE2X0xpbmVhckV4dGVuZGVkU1JHQigpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICB0ZXN0R2V0Qml0bWFwKEVHTF9HTF9DT0xPUlNQQUNFX1NDUkdCX0xJTkVBUl9FWFQsIENvbG9yU3BhY2UuTmFtZWQuTElORUFSX0VYVEVOREVEX1NSR0IsCisgICAgICAgICAgICAgICAgdHJ1ZSwgbmV3IEZQMTZDb21wYXJlKENvbG9yU3BhY2UuTmFtZWQuRVhURU5ERURfU1JHQikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldDU2NUJpdG1hcF9TUkdCKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIHRlc3RHZXRCaXRtYXAoRUdMX0dMX0NPTE9SU1BBQ0VfU1JHQl9LSFIsIENvbG9yU3BhY2UuTmFtZWQuU1JHQiwgdHJ1ZSwKKyAgICAgICAgICAgICAgICBuZXcgU1JHQkNvbXBhcmUoQml0bWFwLkNvbmZpZy5SR0JfNTY1KSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Qml0bWFwX1NSR0IoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgdGVzdEdldEJpdG1hcChFR0xfR0xfQ09MT1JTUEFDRV9TUkdCX0tIUiwgQ29sb3JTcGFjZS5OYW1lZC5TUkdCLCB0cnVlLAorICAgICAgICAgICAgICAgIG5ldyBTUkdCQ29tcGFyZShCaXRtYXAuQ29uZmlnLkFSR0JfODg4OCkpOworICAgIH0KKworICAgIGludGVyZmFjZSBDb21wYXJlRnVuY3Rpb24geworICAgICAgICBCaXRtYXAuQ29uZmlnIGdldENvbmZpZygpOworICAgICAgICBDb2xvclNwYWNlIGdldENvbG9yU3BhY2UoKTsKKyAgICAgICAgdm9pZCB2ZXJpZnkoZmxvYXRbXSBzcmNDb2xvciwgQ29sb3JTcGFjZS5OYW1lZCBzcmNDb2xvclNwYWNlLCBCaXRtYXAgZHN0Qml0bWFwKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIEZQMTZDb21wYXJlIGltcGxlbWVudHMgQ29tcGFyZUZ1bmN0aW9uIHsKKyAgICAgICAgcHJpdmF0ZSBDb2xvclNwYWNlIG1Ec3RDb2xvclNwYWNlOworCisgICAgICAgIEZQMTZDb21wYXJlKENvbG9yU3BhY2UuTmFtZWQgbmFtZWRDUykgeworICAgICAgICAgICAgbURzdENvbG9yU3BhY2UgPSBDb2xvclNwYWNlLmdldChuYW1lZENTKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCaXRtYXAuQ29uZmlnIGdldENvbmZpZygpIHsKKyAgICAgICAgICAgIHJldHVybiBCaXRtYXAuQ29uZmlnLlJHQkFfRjE2OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENvbG9yU3BhY2UgZ2V0Q29sb3JTcGFjZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtRHN0Q29sb3JTcGFjZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZlcmlmeShmbG9hdFtdIHNyY0NvbG9yLCBDb2xvclNwYWNlLk5hbWVkIHNyY0NvbG9yU3BhY2UsIEJpdG1hcCBkc3RCaXRtYXApIHsKKyAgICAgICAgICAgIC8vIHJlYWQgcGl4ZWxzIGludG8gYnVmZmVyIGFuZCBjb21wYXJlIHVzaW5nIGNvbG9yc3BhY2UgY29ubmVjdG9yCisgICAgICAgICAgICBCeXRlQnVmZmVyIGJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoZHN0Qml0bWFwLmdldEFsbG9jYXRpb25CeXRlQ291bnQoKSk7CisgICAgICAgICAgICBidWZmZXIub3JkZXIoQnl0ZU9yZGVyLkxJVFRMRV9FTkRJQU4pOworICAgICAgICAgICAgZHN0Qml0bWFwLmNvcHlQaXhlbHNUb0J1ZmZlcihidWZmZXIpOworICAgICAgICAgICAgSGFsZiBhbHBoYSA9IEhhbGYudmFsdWVPZihidWZmZXIuZ2V0U2hvcnQoNikpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEuMGYsIGFscGhhLmZsb2F0VmFsdWUoKSwgMC4wZik7CisKKyAgICAgICAgICAgIGZpbmFsIENvbG9yU3BhY2Ugc3JjU3BhY2UgPSBDb2xvclNwYWNlLmdldChzcmNDb2xvclNwYWNlKTsKKyAgICAgICAgICAgIGZpbmFsIENvbG9yU3BhY2UgZHN0U3BhY2UgPSBnZXRDb2xvclNwYWNlKCk7CisgICAgICAgICAgICBmbG9hdFtdIGV4cGVjdGVkQ29sb3IgPSBDb2xvclNwYWNlLmNvbm5lY3Qoc3JjU3BhY2UsIGRzdFNwYWNlKS50cmFuc2Zvcm0oc3JjQ29sb3IpOworICAgICAgICAgICAgZmxvYXRbXSBvdXRwdXRDb2xvciA9IHsKKyAgICAgICAgICAgICAgICAgICAgSGFsZi52YWx1ZU9mKGJ1ZmZlci5nZXRTaG9ydCgwKSkuZmxvYXRWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICBIYWxmLnZhbHVlT2YoYnVmZmVyLmdldFNob3J0KDIpKS5mbG9hdFZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgIEhhbGYudmFsdWVPZihidWZmZXIuZ2V0U2hvcnQoNCkpLmZsb2F0VmFsdWUoKSB9OworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRDb2xvclswXSwgb3V0cHV0Q29sb3JbMF0sIDAuMDFmKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZENvbG9yWzFdLCBvdXRwdXRDb2xvclsxXSwgMC4wMWYpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkQ29sb3JbMl0sIG91dHB1dENvbG9yWzJdLCAwLjAxZik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFNSR0JDb21wYXJlIGltcGxlbWVudHMgQ29tcGFyZUZ1bmN0aW9uIHsKKyAgICAgICAgcHJpdmF0ZSBCaXRtYXAuQ29uZmlnIG1Db25maWc7CisKKyAgICAgICAgU1JHQkNvbXBhcmUoQml0bWFwLkNvbmZpZyBjb25maWcpIHsKKyAgICAgICAgICAgIG1Db25maWcgPSBjb25maWc7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQml0bWFwLkNvbmZpZyBnZXRDb25maWcoKSB7CisgICAgICAgICAgICByZXR1cm4gbUNvbmZpZzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb2xvclNwYWNlIGdldENvbG9yU3BhY2UoKSB7CisgICAgICAgICAgICByZXR1cm4gQ29sb3JTcGFjZS5nZXQoQ29sb3JTcGFjZS5OYW1lZC5TUkdCKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZlcmlmeShmbG9hdFtdIHNyY0NvbG9yLCBDb2xvclNwYWNlLk5hbWVkIHNyY0NvbG9yU3BhY2UsIEJpdG1hcCBkc3RCaXRtYXApIHsKKyAgICAgICAgICAgIGludCBjb2xvciA9IGRzdEJpdG1hcC5nZXRQaXhlbCgwLCAwKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLjBmLCBDb2xvci5hbHBoYShjb2xvcikgLyAyNTUuMGYsIDAuMGYpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNyY0NvbG9yWzBdLCBDb2xvci5yZWQoY29sb3IpIC8gMjU1LjBmLCAwLjAxZik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoc3JjQ29sb3JbMV0sIENvbG9yLmdyZWVuKGNvbG9yKSAvIDI1NS4wZiwgMC4wMWYpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNyY0NvbG9yWzJdLCBDb2xvci5ibHVlKGNvbG9yKSAvIDI1NS4wZiwgMC4wMWYpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RHZXRCaXRtYXAoaW50IGVnbENvbG9yU3BhY2UsIENvbG9yU3BhY2UuTmFtZWQgY29sb3JTcGFjZSwKKyAgICAgICAgICAgIGJvb2xlYW4gdXNlSGFsZkZsb2F0LCBDb21wYXJlRnVuY3Rpb24gY29tcGFyZUZ1bmN0aW9uKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgZmluYWwgVGV4dHVyZVZpZXdDdHNBY3Rpdml0eSBhY3Rpdml0eSA9IG1BY3Rpdml0eVJ1bGUubGF1bmNoQWN0aXZpdHkobnVsbCk7CisgICAgICAgIGFjdGl2aXR5LndhaXRGb3JTdXJmYWNlKCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFjdGl2aXR5LmluaXRHbChlZ2xDb2xvclNwYWNlLCB1c2VIYWxmRmxvYXQpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGZhaWx1cmUgdG8gaW5pdCBHTCB3aXRoIHRoZSByaWdodCBjb2xvcnNwYWNlIGlzIG5vdCBhIFRleHR1cmVWaWV3IGZhaWx1cmUgYXMgc29tZQorICAgICAgICAgICAgLy8gZGV2aWNlcyBtYXkgbm90IHN1cHBvcnQgMTYtYml0cyBvciB0aGUgY29sb3JzcGFjZSBleHRlbnNpb24KKyAgICAgICAgICAgIGlmICghYWN0aXZpdHkuaW5pdEdMRXh0ZW5zaW9uVW5zdXBwb3J0ZWQoKSkgeworICAgICAgICAgICAgICAgIGZhaWwoIlVuYWJsZSB0byBpbml0R0wgOiAiICsgZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBmbG9hdFtdIGlucHV0Q29sb3IgPSB7IDEuMGYsIDEyOCAvIDI1NS4wZiwgMC4wZn07CisKKyAgICAgICAgaW50IHVwZGF0ZWRDb3VudDsKKyAgICAgICAgdXBkYXRlZENvdW50ID0gYWN0aXZpdHkud2FpdEZvclN1cmZhY2VVcGRhdGVDb3VudCgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHVwZGF0ZWRDb3VudCk7CisgICAgICAgIGFjdGl2aXR5LmRyYXdDb2xvcihpbnB1dENvbG9yWzBdLCBpbnB1dENvbG9yWzFdLCBpbnB1dENvbG9yWzJdLCAxLjBmKTsKKyAgICAgICAgdXBkYXRlZENvdW50ID0gYWN0aXZpdHkud2FpdEZvclN1cmZhY2VVcGRhdGVDb3VudCgxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHVwZGF0ZWRDb3VudCk7CisKKyAgICAgICAgZmluYWwgQml0bWFwIGJpdG1hcCA9IGFjdGl2aXR5LmdldENvbnRlbnRzKGNvbXBhcmVGdW5jdGlvbi5nZXRDb25maWcoKSwKKyAgICAgICAgICAgICAgICBjb21wYXJlRnVuY3Rpb24uZ2V0Q29sb3JTcGFjZSgpKTsKKyAgICAgICAgY29tcGFyZUZ1bmN0aW9uLnZlcmlmeShpbnB1dENvbG9yLCBjb2xvclNwYWNlLCBiaXRtYXApOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZHJhd0dsUXVhZChpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICAgICAgaW50IGN4ID0gd2lkdGggLyAyOworICAgICAgICBpbnQgY3kgPSBoZWlnaHQgLyAyOworCisgICAgICAgIGdsRW5hYmxlKEdMX1NDSVNTT1JfVEVTVCk7CisKKyAgICAgICAgZ2xTY2lzc29yKDAsIGN5LCBjeCwgaGVpZ2h0IC0gY3kpOworICAgICAgICBjbGVhckNvbG9yKENvbG9yLlJFRCk7CisKKyAgICAgICAgZ2xTY2lzc29yKGN4LCBjeSwgd2lkdGggLSBjeCwgaGVpZ2h0IC0gY3kpOworICAgICAgICBjbGVhckNvbG9yKENvbG9yLkdSRUVOKTsKKworICAgICAgICBnbFNjaXNzb3IoMCwgMCwgY3gsIGN5KTsKKyAgICAgICAgY2xlYXJDb2xvcihDb2xvci5CTFVFKTsKKworICAgICAgICBnbFNjaXNzb3IoY3gsIDAsIHdpZHRoIC0gY3gsIGN5KTsKKyAgICAgICAgY2xlYXJDb2xvcihDb2xvci5CTEFDSyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjbGVhckNvbG9yKGludCBjb2xvcikgeworICAgICAgICBnbENsZWFyQ29sb3IoQ29sb3IucmVkKGNvbG9yKSAvIDI1NS4wZiwKKyAgICAgICAgICAgICAgICBDb2xvci5ncmVlbihjb2xvcikgLyAyNTUuMGYsCisgICAgICAgICAgICAgICAgQ29sb3IuYmx1ZShjb2xvcikgLyAyNTUuMGYsCisgICAgICAgICAgICAgICAgQ29sb3IuYWxwaGEoY29sb3IpIC8gMjU1LjBmKTsKKyAgICAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBnZXRQaXhlbChXaW5kb3cgd2luZG93LCBQb2ludCBwb2ludCkgeworICAgICAgICBCaXRtYXAgc2NyZWVuc2hvdCA9IEJpdG1hcC5jcmVhdGVCaXRtYXAod2luZG93LmdldERlY29yVmlldygpLmdldFdpZHRoKCksCisgICAgICAgICAgICAgICAgd2luZG93LmdldERlY29yVmlldygpLmdldEhlaWdodCgpLCBCaXRtYXAuQ29uZmlnLkFSR0JfODg4OCk7CisgICAgICAgIGludCByZXN1bHQgPSBuZXcgU3luY2hyb25vdXNQaXhlbENvcHkoKS5yZXF1ZXN0KHdpbmRvdywgc2NyZWVuc2hvdCk7CiAgICAgICAgIGFzc2VydEVxdWFscygiQ29weSByZXF1ZXN0IGZhaWxlZCIsIFBpeGVsQ29weS5TVUNDRVNTLCByZXN1bHQpOwogICAgICAgICBpbnQgcGl4ZWwgPSBzY3JlZW5zaG90LmdldFBpeGVsKHBvaW50LngsIHBvaW50LnkpOwogICAgICAgICBzY3JlZW5zaG90LnJlY3ljbGUoKTsKICAgICAgICAgcmV0dXJuIHBpeGVsOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCB3YWl0Rm9yQ29sb3IoUG9pbnQgcG9pbnQsIGludCBjb2xvcikKKyAgICBwcml2YXRlIHZvaWQgd2FpdEZvckNvbG9yKFdpbmRvdyB3aW5kb3csIFBvaW50IHBvaW50LCBpbnQgY29sb3IpCiAgICAgICAgICAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24gewogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyBpKyspIHsKLSAgICAgICAgICAgIGludCBwaXhlbCA9IGdldFBpeGVsKHBvaW50KTsKKyAgICAgICAgICAgIGludCBwaXhlbCA9IGdldFBpeGVsKHdpbmRvdywgcG9pbnQpOwogICAgICAgICAgICAgaWYgKHBpeGVsID09IGNvbG9yKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQpAQCAtMTE3LDEwICszOTUsMTAgQEAKICAgICAgICAgdGhyb3cgbmV3IFRpbWVvdXRFeGNlcHRpb24oKTsKICAgICB9CiAKLSAgICBwcml2YXRlIGludCB3YWl0Rm9yQ2hhbmdlKFBvaW50IHBvaW50LCBpbnQgY29sb3IpCisgICAgcHJpdmF0ZSBpbnQgd2FpdEZvckNoYW5nZShXaW5kb3cgd2luZG93LCBQb2ludCBwb2ludCwgaW50IGNvbG9yKQogICAgICAgICAgICAgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uIHsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzMDsgaSsrKSB7Ci0gICAgICAgICAgICBpbnQgcGl4ZWwgPSBnZXRQaXhlbChwb2ludCk7CisgICAgICAgICAgICBpbnQgcGl4ZWwgPSBnZXRQaXhlbCh3aW5kb3csIHBvaW50KTsKICAgICAgICAgICAgIGlmIChwaXhlbCAhPSBjb2xvcikgewogICAgICAgICAgICAgICAgIHJldHVybiBwaXhlbDsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvVG9vbHRpcFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvVG9vbHRpcFRlc3QuamF2YQppbmRleCAxNzE3NzYzLi44ZmVmYjUwIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1Rvb2x0aXBUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9Ub29sdGlwVGVzdC5qYXZhCkBAIC0yMywxMCArMjMsNiBAQAogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwogaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTGFyZ2VUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OwogaW1wb3J0IGFuZHJvaWQudmlldy5JbnB1dERldmljZTsKQEAgLTM4LDYgKzM0LDExIEBACiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuUG9wdXBXaW5kb3c7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5MYXJnZVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ3RzVG91Y2hVdGlsczsKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlBvbGxpbmdDaGVjazsKIApAQCAtMTgyLDkgKzE4MywxMyBAQAogICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLnNlbmRQb2ludGVyU3luYyhldmVudCk7CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIGluamVjdEhvdmVyTW92ZShpbnQgc291cmNlLCBWaWV3IHRhcmdldCwgaW50IG9mZnNldFgsIGludCBvZmZzZXRZKSB7CisgICAgICAgIGluamVjdE1vdGlvbkV2ZW50KG9idGFpbk1vdGlvbkV2ZW50KAorICAgICAgICAgICAgICAgICAgICBzb3VyY2UsIHRhcmdldCwgTW90aW9uRXZlbnQuQUNUSU9OX0hPVkVSX01PVkUsIG9mZnNldFgsICBvZmZzZXRZKSk7CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIGluamVjdEhvdmVyTW92ZShWaWV3IHRhcmdldCwgaW50IG9mZnNldFgsIGludCBvZmZzZXRZKSB7Ci0gICAgICAgIGluamVjdE1vdGlvbkV2ZW50KG9idGFpbk1vdXNlRXZlbnQoCi0gICAgICAgICAgICAgICAgdGFyZ2V0LCBNb3Rpb25FdmVudC5BQ1RJT05fSE9WRVJfTU9WRSwgb2Zmc2V0WCwgIG9mZnNldFkpKTsKKyAgICAgICAgaW5qZWN0SG92ZXJNb3ZlKElucHV0RGV2aWNlLlNPVVJDRV9NT1VTRSwgdGFyZ2V0LCBvZmZzZXRYLCAgb2Zmc2V0WSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGluamVjdEhvdmVyTW92ZShWaWV3IHRhcmdldCkgewpAQCAtMTk3LDEzICsyMDIsMTggQEAKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBNb3Rpb25FdmVudCBvYnRhaW5Nb3VzZUV2ZW50KFZpZXcgdGFyZ2V0LCBpbnQgYWN0aW9uLCBpbnQgb2Zmc2V0WCwgaW50IG9mZnNldFkpIHsKKyAgICAgICAgcmV0dXJuIG9idGFpbk1vdGlvbkV2ZW50KElucHV0RGV2aWNlLlNPVVJDRV9NT1VTRSwgdGFyZ2V0LCBhY3Rpb24sIG9mZnNldFgsIG9mZnNldFkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIE1vdGlvbkV2ZW50IG9idGFpbk1vdGlvbkV2ZW50KAorICAgICAgICAgICAgICAgIGludCBzb3VyY2UsIFZpZXcgdGFyZ2V0LCBpbnQgYWN0aW9uLCBpbnQgb2Zmc2V0WCwgaW50IG9mZnNldFkpIHsKICAgICAgICAgZmluYWwgbG9uZyBldmVudFRpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKICAgICAgICAgZmluYWwgaW50W10geHkgPSBuZXcgaW50WzJdOwogICAgICAgICB0YXJnZXQuZ2V0TG9jYXRpb25PblNjcmVlbih4eSk7CiAgICAgICAgIE1vdGlvbkV2ZW50IGV2ZW50ID0gTW90aW9uRXZlbnQub2J0YWluKGV2ZW50VGltZSwgZXZlbnRUaW1lLCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgeHlbMF0gKyB0YXJnZXQuZ2V0V2lkdGgoKSAvIDIgKyBvZmZzZXRYLCB4eVsxXSArIHRhcmdldC5nZXRIZWlnaHQoKSAvIDIgKyBvZmZzZXRZLAogICAgICAgICAgICAgICAgIDApOwotICAgICAgICBldmVudC5zZXRTb3VyY2UoSW5wdXREZXZpY2UuU09VUkNFX01PVVNFKTsKKyAgICAgICAgZXZlbnQuc2V0U291cmNlKHNvdXJjZSk7CiAgICAgICAgIHJldHVybiBldmVudDsKICAgICB9CiAKQEAgLTI1MCwxNyArMjYwLDE2IEBACiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9Ub29sdGlwT25EaXNhYmxlZFZpZXcoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9vbHRpcE9uRGlzYWJsZWRWaWV3KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIG1BY3Rpdml0eVJ1bGUucnVuT25VaVRocmVhZCgoKSAtPiBtVG9vbHRpcFZpZXcuc2V0RW5hYmxlZChmYWxzZSkpOwogCisgICAgICAgIC8vIExvbmcgY2xpY2sgaGFzIG5vIGVmZmVjdCBvbiBhIGRpc2FibGVkIHZpZXcuCiAgICAgICAgIGluamVjdExvbmdDbGljayhtVG9vbHRpcFZpZXcpOwogICAgICAgICBhc3NlcnRGYWxzZShoYXNUb29sdGlwKG1Ub29sdGlwVmlldykpOwogCi0gICAgICAgIGluamVjdExvbmdFbnRlcihtVG9vbHRpcFZpZXcpOwotICAgICAgICBhc3NlcnRGYWxzZShoYXNUb29sdGlwKG1Ub29sdGlwVmlldykpOwotCisgICAgICAgIC8vIEhvdmVyIGRvZXMgc2hvdyB0aGUgdG9vbHRpcCBvbiBhIGRpc2FibGVkIHZpZXcuCiAgICAgICAgIGluamVjdExvbmdIb3Zlck1vdmUobVRvb2x0aXBWaWV3KTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoaGFzVG9vbHRpcChtVG9vbHRpcFZpZXcpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShoYXNUb29sdGlwKG1Ub29sdGlwVmlldykpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC02NTYsNyArNjY1LDggQEAKICAgICAgICAgaW5qZWN0SG92ZXJNb3ZlKG1Ub29sdGlwVmlldyk7CiAgICAgICAgIG1BY3Rpdml0eVJ1bGUucnVuT25VaVRocmVhZCgoKSAtPiBtVG9vbHRpcFZpZXcuc2V0RW5hYmxlZChmYWxzZSkpOwogICAgICAgICB3YWl0T3V0KFZpZXdDb25maWd1cmF0aW9uLmdldEhvdmVyVG9vbHRpcFNob3dUaW1lb3V0KCkpOwotICAgICAgICBhc3NlcnRGYWxzZShoYXNUb29sdGlwKG1Ub29sdGlwVmlldykpOworICAgICAgICAvLyBEaXNhYmxlZCB2aWV3IHN0aWxsIGRpc3BsYXlzIGEgaG92ZXIgdG9vbHRpcC4KKyAgICAgICAgYXNzZXJ0VHJ1ZShoYXNUb29sdGlwKG1Ub29sdGlwVmlldykpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC03ODcsNiArNzk3LDc2IEBACiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TW91c2VIb3ZlcldpdGhKaXR0ZXIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgdGVzdEhvdmVyV2l0aEppdHRlcihJbnB1dERldmljZS5TT1VSQ0VfTU9VU0UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0eWx1c0hvdmVyV2l0aEppdHRlcigpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICB0ZXN0SG92ZXJXaXRoSml0dGVyKElucHV0RGV2aWNlLlNPVVJDRV9TVFlMVVMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRvdWNoc2NyZWVuSG92ZXJXaXRoSml0dGVyKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIHRlc3RIb3ZlcldpdGhKaXR0ZXIoSW5wdXREZXZpY2UuU09VUkNFX1RPVUNIU0NSRUVOKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdEhvdmVyV2l0aEppdHRlcihpbnQgc291cmNlKSB7CisgICAgICAgIGZpbmFsIGludCBob3ZlclNsb3AgPSBWaWV3Q29uZmlndXJhdGlvbi5nZXQobVRvb2x0aXBWaWV3LmdldENvbnRleHQoKSkuZ2V0U2NhbGVkSG92ZXJTbG9wKCk7CisgICAgICAgIGlmIChob3ZlclNsb3AgPT0gMCkgeworICAgICAgICAgICAgLy8gWmVybyBob3ZlclNsb3AgbWFrZXMgdGhpcyB0ZXN0IHJlZHVuZGFudC4KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGludCB0b29sdGlwVGltZW91dCA9IFZpZXdDb25maWd1cmF0aW9uLmdldEhvdmVyVG9vbHRpcFNob3dUaW1lb3V0KCk7CisgICAgICAgIGZpbmFsIGxvbmcgaGFsZlRpbWVvdXQgPSB0b29sdGlwVGltZW91dCAvIDI7CisgICAgICAgIGFzc2VydFRydWUoaGFsZlRpbWVvdXQgKyBXQUlUX01BUkdJTiA8IHRvb2x0aXBUaW1lb3V0KTsKKworICAgICAgICAvLyBJbWl0YXRlIHN0cm9uZyBqaXR0ZXIgKGFib3ZlIGhvdmVyU2xvcCB0aHJlc2hvbGQpLiBObyB0b29sdGlwIHNob3VsZCBiZSBzaG93bi4KKyAgICAgICAgaW50IGppdHRlckhpZ2ggPSBob3ZlclNsb3AgKyAxOworICAgICAgICBhc3NlcnRUcnVlKGppdHRlckhpZ2ggPD0gbVRvb2x0aXBWaWV3LmdldFdpZHRoKCkpOworICAgICAgICBhc3NlcnRUcnVlKGppdHRlckhpZ2ggPD0gbVRvb2x0aXBWaWV3LmdldEhlaWdodCgpKTsKKworICAgICAgICBpbmplY3RIb3Zlck1vdmUoc291cmNlLCBtVG9vbHRpcFZpZXcsIDAsIDApOworICAgICAgICB3YWl0T3V0KGhhbGZUaW1lb3V0KTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoaGFzVG9vbHRpcChtVG9vbHRpcFZpZXcpKTsKKworICAgICAgICBpbmplY3RIb3Zlck1vdmUoc291cmNlLCBtVG9vbHRpcFZpZXcsIGppdHRlckhpZ2gsIDApOworICAgICAgICB3YWl0T3V0KGhhbGZUaW1lb3V0KTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoaGFzVG9vbHRpcChtVG9vbHRpcFZpZXcpKTsKKworICAgICAgICBpbmplY3RIb3Zlck1vdmUoc291cmNlLCBtVG9vbHRpcFZpZXcsIDAsIDApOworICAgICAgICB3YWl0T3V0KGhhbGZUaW1lb3V0KTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoaGFzVG9vbHRpcChtVG9vbHRpcFZpZXcpKTsKKworICAgICAgICBpbmplY3RIb3Zlck1vdmUoc291cmNlLCBtVG9vbHRpcFZpZXcsIDAsIGppdHRlckhpZ2gpOworICAgICAgICB3YWl0T3V0KGhhbGZUaW1lb3V0KTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoaGFzVG9vbHRpcChtVG9vbHRpcFZpZXcpKTsKKworICAgICAgICAvLyBKaXR0ZXIgYmVsb3cgdGhyZXNob2xkIHNob3VsZCBiZSBpZ25vcmVkIGFuZCB0aGUgdG9vbHRpcCBzaG91bGQgYmUgc2hvd24uCisgICAgICAgIGluamVjdEhvdmVyTW92ZShzb3VyY2UsIG1Ub29sdGlwVmlldywgMCwgMCk7CisgICAgICAgIHdhaXRPdXQoaGFsZlRpbWVvdXQpOworICAgICAgICBhc3NlcnRGYWxzZShoYXNUb29sdGlwKG1Ub29sdGlwVmlldykpOworCisgICAgICAgIGludCBqaXR0ZXJMb3cgPSBob3ZlclNsb3AgLSAxOworICAgICAgICBpbmplY3RIb3Zlck1vdmUoc291cmNlLCBtVG9vbHRpcFZpZXcsIGppdHRlckxvdywgMCk7CisgICAgICAgIHdhaXRPdXQoaGFsZlRpbWVvdXQpOworICAgICAgICBhc3NlcnRUcnVlKGhhc1Rvb2x0aXAobVRvb2x0aXBWaWV3KSk7CisKKyAgICAgICAgLy8gRGlzbWlzcyB0aGUgdG9vbHRpcAorICAgICAgICBpbmplY3RTaG9ydENsaWNrKG1Ub29sdGlwVmlldyk7CisgICAgICAgIGFzc2VydEZhbHNlKGhhc1Rvb2x0aXAobVRvb2x0aXBWaWV3KSk7CisKKyAgICAgICAgaW5qZWN0SG92ZXJNb3ZlKHNvdXJjZSwgbVRvb2x0aXBWaWV3LCAwLCAwKTsKKyAgICAgICAgd2FpdE91dChoYWxmVGltZW91dCk7CisgICAgICAgIGFzc2VydEZhbHNlKGhhc1Rvb2x0aXAobVRvb2x0aXBWaWV3KSk7CisKKyAgICAgICAgaW5qZWN0SG92ZXJNb3ZlKHNvdXJjZSwgbVRvb2x0aXBWaWV3LCAwLCBqaXR0ZXJMb3cpOworICAgICAgICB3YWl0T3V0KGhhbGZUaW1lb3V0KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShoYXNUb29sdGlwKG1Ub29sdGlwVmlldykpOworICAgIH0KKworICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFRvb2x0aXBJblBvcHVwKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIFRleHRWaWV3IHBvcHVwQ29udGVudCA9IG5ldyBUZXh0VmlldyhtQWN0aXZpdHkpOwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1RvdWNoRGVsZWdhdGVUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1RvdWNoRGVsZWdhdGVUZXN0LmphdmEKaW5kZXggMWZkM2Q4Yy4uMTc4NDVkOCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9Ub3VjaERlbGVnYXRlVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvVG91Y2hEZWxlZ2F0ZVRlc3QuamF2YQpAQCAtMTYsMjQgKzE2LDE5IEBACiAKIHBhY2thZ2UgYW5kcm9pZC52aWV3LmN0czsKIAotaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5NYXRjaGVycy5hbnk7Ci1pbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ubW9jazsKLWltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by50aW1lczsKLWltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by52ZXJpZnk7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKIAotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwogaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC52aWV3LklucHV0RGV2aWNlOwogaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVG91Y2hEZWxlZ2F0ZTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwpAQCAtNDQsMzcgKzM5LDE0NSBAQAogQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKIHB1YmxpYyBjbGFzcyBUb3VjaERlbGVnYXRlVGVzdCB7CiAgICAgcHJpdmF0ZSBJbnN0cnVtZW50YXRpb24gbUluc3RydW1lbnRhdGlvbjsKLSAgICBwcml2YXRlIEFjdGl2aXR5IG1BY3Rpdml0eTsKLSAgICBwcml2YXRlIEJ1dHRvbiBtQnV0dG9uOworICAgIHByaXZhdGUgVG91Y2hEZWxlZ2F0ZVRlc3RBY3Rpdml0eSBtQWN0aXZpdHk7CiAKICAgICBAUnVsZQotICAgIHB1YmxpYyBBY3Rpdml0eVRlc3RSdWxlPE1vY2tBY3Rpdml0eT4gbUFjdGl2aXR5UnVsZSA9Ci0gICAgICAgICAgICBuZXcgQWN0aXZpdHlUZXN0UnVsZTw+KE1vY2tBY3Rpdml0eS5jbGFzcyk7CisgICAgcHVibGljIEFjdGl2aXR5VGVzdFJ1bGU8VG91Y2hEZWxlZ2F0ZVRlc3RBY3Rpdml0eT4gbUFjdGl2aXR5UnVsZSA9CisgICAgICAgICAgICBuZXcgQWN0aXZpdHlUZXN0UnVsZTw+KFRvdWNoRGVsZWdhdGVUZXN0QWN0aXZpdHkuY2xhc3MpOwogCiAgICAgQEJlZm9yZQogICAgIHB1YmxpYyB2b2lkIHNldHVwKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIG1BY3Rpdml0eSA9IG1BY3Rpdml0eVJ1bGUuZ2V0QWN0aXZpdHkoKTsKKyAgICAgICAgbUFjdGl2aXR5LnJlc2V0Q291bnRlcnMoKTsKICAgICAgICAgbUluc3RydW1lbnRhdGlvbiA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpOwotCi0gICAgICAgIG1CdXR0b24gPSBuZXcgQnV0dG9uKG1BY3Rpdml0eSk7Ci0gICAgICAgIG1BY3Rpdml0eVJ1bGUucnVuT25VaVRocmVhZCgoKSAtPiBtQWN0aXZpdHkuYWRkQ29udGVudFZpZXcoCi0gICAgICAgICAgICAgICAgbUJ1dHRvbiwgbmV3IExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMoCi0gICAgICAgICAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwgVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpKSk7CiAgICAgICAgIG1JbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7CiAgICAgfQogCi0gICAgQFVpVGhyZWFkVGVzdAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE9uVG91Y2hFdmVudCgpIHsKLSAgICAgICAgLy8gdGVzdCBjYWxsYmFjayBvZiBvblRvdWNoRXZlbnQKLSAgICAgICAgZmluYWwgVmlldyB2aWV3ID0gbmV3IFZpZXcobUFjdGl2aXR5KTsKLSAgICAgICAgZmluYWwgVG91Y2hEZWxlZ2F0ZSB0b3VjaERlbGVnYXRlID0gbW9jayhUb3VjaERlbGVnYXRlLmNsYXNzKTsKLSAgICAgICAgdmlldy5zZXRUb3VjaERlbGVnYXRlKHRvdWNoRGVsZWdhdGUpOworICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJlbnRDbGljaygpIHsKKyAgICAgICAgLy8gSWYgb25seSBjbGlja2luZyBwYXJlbnQsIGJ1dHRvbiBzaG91bGQgbm90IHJlY2VpdmUgY2xpY2sKKyAgICAgICAgY2xpY2tQYXJlbnQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1BY3Rpdml0eS5nZXRCdXR0b25DbGlja0NvdW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbUFjdGl2aXR5LmdldFBhcmVudENsaWNrQ291bnQoKSk7CiAKLSAgICAgICAgZmluYWwgaW50IHhJbnNpZGUgPSAobUJ1dHRvbi5nZXRMZWZ0KCkgKyBtQnV0dG9uLmdldFJpZ2h0KCkpIC8gMzsKLSAgICAgICAgZmluYWwgaW50IHlJbnNpZGUgPSAobUJ1dHRvbi5nZXRUb3AoKSArIG1CdXR0b24uZ2V0Qm90dG9tKCkpIC8gMzsKKyAgICAgICAgLy8gV2hlbiBjbGlja2luZyBUb3VjaERlbGVnYXRlIGFyZWEsIGJvdGggcGFyZW50IGFuZCBidXR0b24KKyAgICAgICAgLy8gc2hvdWxkIHJlY2VpdmUgRE9XTiBhbmQgVVAgZXZlbnRzLiBIb3dldmVyLCBjbGljayB3aWxsIG9ubHkgYmUgZ2VuZXJhdGVkIGZvciB0aGUgYnV0dG9uCisgICAgICAgIG1BY3Rpdml0eS5yZXNldENvdW50ZXJzKCk7CisgICAgICAgIGNsaWNrVG91Y2hEZWxlZ2F0ZUFyZWEoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1BY3Rpdml0eS5nZXRCdXR0b25DbGlja0NvdW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbUFjdGl2aXR5LmdldFBhcmVudENsaWNrQ291bnQoKSk7CiAKLSAgICAgICAgdmlldy5vblRvdWNoRXZlbnQoTW90aW9uRXZlbnQub2J0YWluKDAsIDAsIE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOLCB4SW5zaWRlLCB5SW5zaWRlLCAwKSk7Ci0gICAgICAgIHZlcmlmeSh0b3VjaERlbGVnYXRlLCB0aW1lcygxKSkub25Ub3VjaEV2ZW50KGFueShNb3Rpb25FdmVudC5jbGFzcykpOworICAgICAgICAvLyBFbnN1cmUgcGFyZW50IGNhbiBzdGlsbCByZWNlaXZlIGNsaWNrcyBhZnRlciBUb3VjaERlbGVnYXRlIGhhcyBiZWVuIGFjdGl2YXRlZCBvbmNlCisgICAgICAgIG1BY3Rpdml0eS5yZXNldENvdW50ZXJzKCk7CisgICAgICAgIGNsaWNrUGFyZW50KCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtQWN0aXZpdHkuZ2V0QnV0dG9uQ2xpY2tDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1BY3Rpdml0eS5nZXRQYXJlbnRDbGlja0NvdW50KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENhbmNlbEV2ZW50KCkgeworICAgICAgICAvLyBFbnN1cmUgZXZlbnRzIHdpdGggQUNUSU9OX0NBTkNFTCBhcmUgcmVjZWl2ZWQgYnkgdGhlIFRvdWNoRGVsZWdhdGUKKyAgICAgICAgZmluYWwgbG9uZyBkb3duVGltZSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworICAgICAgICBkaXNwYXRjaE1vdGlvbkV2ZW50VG9BY3Rpdml0eShNb3Rpb25FdmVudC5BQ1RJT05fRE9XTiwgbUFjdGl2aXR5LnRvdWNoRGVsZWdhdGVZLAorICAgICAgICAgICAgICAgIGRvd25UaW1lKTsKKyAgICAgICAgZGlzcGF0Y2hNb3Rpb25FdmVudFRvQWN0aXZpdHkoTW90aW9uRXZlbnQuQUNUSU9OX0NBTkNFTCwgbUFjdGl2aXR5LnRvdWNoRGVsZWdhdGVZLAorICAgICAgICAgICAgICAgIGRvd25UaW1lKTsKKyAgICAgICAgbUluc3RydW1lbnRhdGlvbi53YWl0Rm9ySWRsZVN5bmMoKTsKKworICAgICAgICBlbnN1cmVPbGRlc3RBY3Rpb25FcXVhbHMoTW90aW9uRXZlbnQuQUNUSU9OX0RPV04pOworICAgICAgICBlbnN1cmVPbGRlc3RBY3Rpb25FcXVhbHMoTW90aW9uRXZlbnQuQUNUSU9OX0NBTkNFTCk7CisKKyAgICAgICAgYXNzZXJ0TnVsbChtQWN0aXZpdHkucmVtb3ZlT2xkZXN0QnV0dG9uRXZlbnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtQWN0aXZpdHkuZ2V0QnV0dG9uQ2xpY2tDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1BY3Rpdml0eS5nZXRQYXJlbnRDbGlja0NvdW50KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFR3b1BvaW50ZXJzKCkgeworICAgICAgICAvLyBFbnN1cmUgQUNUSU9OX1BPSU5URVJfRE9XTiBhbmQgQUNUSU9OX1BPSU5URVJfVVAgYXJlIGZvcndhcmRlZCB0byB0aGUgdGFyZ2V0IHZpZXcKKyAgICAgICAgLy8gYnkgdGhlIFRvdWNoRGVsZWdhdGUKKyAgICAgICAgZmluYWwgbG9uZyBkb3duVGltZSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworICAgICAgICBkaXNwYXRjaE1vdGlvbkV2ZW50VG9BY3Rpdml0eShNb3Rpb25FdmVudC5BQ1RJT05fRE9XTiwgbUFjdGl2aXR5LnRvdWNoRGVsZWdhdGVZLCBkb3duVGltZSk7CisgICAgICAgIGRpc3BhdGNoTW90aW9uRXZlbnRUb0FjdGl2aXR5KE1vdGlvbkV2ZW50LkFDVElPTl9NT1ZFLCBtQWN0aXZpdHkudG91Y2hEZWxlZ2F0ZVksIGRvd25UaW1lKTsKKyAgICAgICAgaW50IGFjdGlvblBvaW50ZXIxRG93biA9CisgICAgICAgICAgICAgICAgKDEgPDwgTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfSU5ERVhfU0hJRlQpICsgTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfRE9XTjsKKyAgICAgICAgZGlzcGF0Y2hNdWx0aVRvdWNoTW90aW9uRXZlbnRUb0FjdGl2aXR5KGFjdGlvblBvaW50ZXIxRG93biwgMiwKKyAgICAgICAgICAgICAgICBtQWN0aXZpdHkudG91Y2hEZWxlZ2F0ZVksIGRvd25UaW1lKTsKKyAgICAgICAgZGlzcGF0Y2hNdWx0aVRvdWNoTW90aW9uRXZlbnRUb0FjdGl2aXR5KE1vdGlvbkV2ZW50LkFDVElPTl9NT1ZFLCAyLAorICAgICAgICAgICAgICAgIG1BY3Rpdml0eS50b3VjaERlbGVnYXRlWSwgZG93blRpbWUpOworICAgICAgICBpbnQgYWN0aW9uUG9pbnRlcjFVcCA9CisgICAgICAgICAgICAgICAgKDEgPDwgTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfSU5ERVhfU0hJRlQpICsgTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfVVA7CisgICAgICAgIGRpc3BhdGNoTXVsdGlUb3VjaE1vdGlvbkV2ZW50VG9BY3Rpdml0eShhY3Rpb25Qb2ludGVyMVVwLCAyLAorICAgICAgICAgICAgICAgIG1BY3Rpdml0eS50b3VjaERlbGVnYXRlWSwgZG93blRpbWUpOworICAgICAgICBkaXNwYXRjaE1vdGlvbkV2ZW50VG9BY3Rpdml0eShNb3Rpb25FdmVudC5BQ1RJT05fVVAsIG1BY3Rpdml0eS50b3VjaERlbGVnYXRlWSwgZG93blRpbWUpOworICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLndhaXRGb3JJZGxlU3luYygpOworCisgICAgICAgIGVuc3VyZU9sZGVzdEFjdGlvbkVxdWFscyhNb3Rpb25FdmVudC5BQ1RJT05fRE9XTik7CisgICAgICAgIGVuc3VyZU9sZGVzdEFjdGlvbkVxdWFscyhNb3Rpb25FdmVudC5BQ1RJT05fTU9WRSk7CisgICAgICAgIGVuc3VyZU9sZGVzdEFjdGlvbkVxdWFscyhNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9ET1dOKTsKKyAgICAgICAgZW5zdXJlT2xkZXN0QWN0aW9uRXF1YWxzKE1vdGlvbkV2ZW50LkFDVElPTl9NT1ZFKTsKKyAgICAgICAgZW5zdXJlT2xkZXN0QWN0aW9uRXF1YWxzKE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX1VQKTsKKyAgICAgICAgZW5zdXJlT2xkZXN0QWN0aW9uRXF1YWxzKE1vdGlvbkV2ZW50LkFDVElPTl9VUCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGVuc3VyZU9sZGVzdEFjdGlvbkVxdWFscyhpbnQgYWN0aW9uKSB7CisgICAgICAgIE1vdGlvbkV2ZW50IGV2ZW50ID0gbUFjdGl2aXR5LnJlbW92ZU9sZGVzdEJ1dHRvbkV2ZW50KCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoZXZlbnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoYWN0aW9uLCBldmVudC5nZXRBY3Rpb25NYXNrZWQoKSk7CisgICAgICAgIGV2ZW50LnJlY3ljbGUoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2xpY2tQYXJlbnQoKSB7CisgICAgICAgIGNsaWNrKG1BY3Rpdml0eS5wYXJlbnRWaWV3WSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNsaWNrVG91Y2hEZWxlZ2F0ZUFyZWEoKSB7CisgICAgICAgIGNsaWNrKG1BY3Rpdml0eS50b3VjaERlbGVnYXRlWSk7CisgICAgfQorCisgICAgLy8gTG93LWxldmVsIGlucHV0LWhhbmRsaW5nIGZ1bmN0aW9ucyBmb3IgdGhlIGFjdGl2aXR5CisKKyAgICBwcml2YXRlIHZvaWQgY2xpY2soaW50IHkpIHsKKyAgICAgICAgZmluYWwgbG9uZyBkb3duVGltZSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworICAgICAgICBkaXNwYXRjaE1vdGlvbkV2ZW50VG9BY3Rpdml0eShNb3Rpb25FdmVudC5BQ1RJT05fRE9XTiwgeSwgZG93blRpbWUpOworICAgICAgICBkaXNwYXRjaE1vdGlvbkV2ZW50VG9BY3Rpdml0eShNb3Rpb25FdmVudC5BQ1RJT05fVVAsIHksIGRvd25UaW1lKTsKKyAgICAgICAgbUluc3RydW1lbnRhdGlvbi53YWl0Rm9ySWRsZVN5bmMoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGlzcGF0Y2hNb3Rpb25FdmVudFRvQWN0aXZpdHkoaW50IGFjdGlvbiwgaW50IHksIGxvbmcgZG93blRpbWUpIHsKKyAgICAgICAgbUFjdGl2aXR5LnJ1bk9uVWlUaHJlYWQoKCkgLT4geworICAgICAgICAgICAgZmluYWwgbG9uZyBldmVudFRpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIGZpbmFsIE1vdGlvbkV2ZW50IGV2ZW50ID0gTW90aW9uRXZlbnQub2J0YWluKGRvd25UaW1lLCBldmVudFRpbWUsIGFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2aXR5LngsIHksIDApOworICAgICAgICAgICAgZXZlbnQuc2V0U291cmNlKElucHV0RGV2aWNlLlNPVVJDRV9UT1VDSFNDUkVFTik7CisgICAgICAgICAgICBtQWN0aXZpdHkuZGlzcGF0Y2hUb3VjaEV2ZW50KGV2ZW50KTsKKyAgICAgICAgICAgIGV2ZW50LnJlY3ljbGUoKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRpc3BhdGNoTXVsdGlUb3VjaE1vdGlvbkV2ZW50VG9BY3Rpdml0eShpbnQgYWN0aW9uLCBpbnQgcG9pbnRlckNvdW50LAorICAgICAgICAgICAgaW50IHksIGxvbmcgZG93blRpbWUpIHsKKyAgICAgICAgbUFjdGl2aXR5LnJ1bk9uVWlUaHJlYWQoKCkgLT4geworICAgICAgICAgICAgZmluYWwgbG9uZyBldmVudFRpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIE1vdGlvbkV2ZW50LlBvaW50ZXJQcm9wZXJ0aWVzW10gcHJvcGVydGllcyA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBNb3Rpb25FdmVudC5Qb2ludGVyUHJvcGVydGllc1twb2ludGVyQ291bnRdOworICAgICAgICAgICAgTW90aW9uRXZlbnQuUG9pbnRlckNvb3Jkc1tdIGNvb3JkcyA9IG5ldyBNb3Rpb25FdmVudC5Qb2ludGVyQ29vcmRzW3BvaW50ZXJDb3VudF07CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcG9pbnRlckNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzW2ldID0gbmV3IE1vdGlvbkV2ZW50LlBvaW50ZXJQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICAgICAgcHJvcGVydGllc1tpXS5pZCA9IGk7CisgICAgICAgICAgICAgICAgcHJvcGVydGllc1tpXS50b29sVHlwZSA9IE1vdGlvbkV2ZW50LlRPT0xfVFlQRV9GSU5HRVI7CisgICAgICAgICAgICAgICAgY29vcmRzW2ldID0gbmV3IE1vdGlvbkV2ZW50LlBvaW50ZXJDb29yZHMoKTsKKyAgICAgICAgICAgICAgICBjb29yZHNbaV0ueCA9IG1BY3Rpdml0eS54ICsgaSAqIDEwOyAvLyBzbWFsbCBvZmZzZXQgc28gdGhhdCBwb2ludGVycyBkbyBub3Qgb3ZlcmxhcAorICAgICAgICAgICAgICAgIGNvb3Jkc1tpXS55ID0geTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgTW90aW9uRXZlbnQgZXZlbnQgPSBNb3Rpb25FdmVudC5vYnRhaW4oZG93blRpbWUsIGV2ZW50VGltZSwgYWN0aW9uLCBwb2ludGVyQ291bnQsCisgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMsIGNvb3JkcywgMCwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgMCwgMCwgSW5wdXREZXZpY2UuU09VUkNFX1RPVUNIU0NSRUVOLCAwKTsKKworICAgICAgICAgICAgbUFjdGl2aXR5LmRpc3BhdGNoVG91Y2hFdmVudChldmVudCk7CisgICAgICAgICAgICBldmVudC5yZWN5Y2xlKCk7CisgICAgICAgIH0pOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvVG91Y2hEZWxlZ2F0ZVRlc3RBY3Rpdml0eS5qYXZhIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9Ub3VjaERlbGVnYXRlVGVzdEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYwMWE5NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvVG91Y2hEZWxlZ2F0ZVRlc3RBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnZpZXcuY3RzOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVG91Y2hEZWxlZ2F0ZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld1RyZWVPYnNlcnZlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlEZXF1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuUXVldWU7CisKKy8qKgorICogVGhlIGxheW91dCBpczoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICA8LS0gdG9wIGVkZ2Ugb2YgUmVsYXRpdmVMYXlvdXQgKHBhcmVudCkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgKHRvdWNoZXMgaW4gdGhpcyByZWdpb24gc2hvdWxkIGdvIHRvIHBhcmVudCBvbmx5KQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICA8LS0gVG91Y2hEZWxlZ2F0ZSBib3VuZGFyeQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAodG91Y2hlcyBpbiB0aGlzIHJlZ2lvbiBzaG91bGQgZ28gdG8gYnV0dG9uICsgcGFyZW50KQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICA8LS0gQnV0dG9uIHRvcCBib3VuZGFyeQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKi8KK3B1YmxpYyBjbGFzcyBUb3VjaERlbGVnYXRlVGVzdEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIC8vIENvdW50ZXJzIGZvciBjbGljayBldmVudHMuIE11c3QgdXNlIHdhaXRGb3JJZGxlU3luYygpIGJlZm9yZSBhY2Nlc3NpbmcgdGhlc2UKKyAgICBwcml2YXRlIHZvbGF0aWxlIGludCBtUGFyZW50Q2xpY2tDb3VudCA9IDA7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBpbnQgbUJ1dHRvbkNsaWNrQ291bnQgPSAwOworICAgIC8vIFN0b3JhZ2UgZm9yIE1vdGlvbkV2ZW50cyByZWNlaXZlZCBieSB0aGUgVG91Y2hEZWxlZ2F0ZQorICAgIHByaXZhdGUgUXVldWU8TW90aW9uRXZlbnQ+IG1CdXR0b25FdmVudHMgPSBuZXcgQXJyYXlEZXF1ZTw+KCk7CisKKyAgICAvLyBDb29yZGluYXRlcyBmb3IgaW5qZWN0aW5nIGlucHV0IGV2ZW50cyBmcm9tIHRoZSB0ZXN0CisgICAgcHVibGljIGludCB4OyAvLyBjb21tb24gWCBjb29yZGluYXRlIGZvciBhbGwgaW5wdXQgZXZlbnRzIC0gY2VudGVyIG9mIHRoZSBzY3JlZW4KKyAgICBwdWJsaWMgaW50IHRvdWNoRGVsZWdhdGVZOyAvLyBZIGNvb3JkaW5hdGUgZm9yIHRvdWNoZXMgaW5zaWRlIFRvdWNoRGVsZWdhdGUgYXJlYQorICAgIHB1YmxpYyBpbnQgcGFyZW50Vmlld1k7IC8vIFkgY29vcmRpbmF0ZSBmb3IgdG91Y2hlcyBpbnNpZGUgcGFyZW50IGFyZWEgb25seQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC50b3VjaF9kZWxlZ2F0ZV90ZXN0X2FjdGl2aXR5X2xheW91dCk7CisKKyAgICAgICAgZmluYWwgQnV0dG9uIGJ1dHRvbiA9IGZpbmRWaWV3QnlJZChSLmlkLmJ1dHRvbik7CisgICAgICAgIGZpbmFsIFZpZXcgcGFyZW50ID0gZmluZFZpZXdCeUlkKFIuaWQubGF5b3V0KTsKKworICAgICAgICBwYXJlbnQuZ2V0Vmlld1RyZWVPYnNlcnZlcigpLmFkZE9uR2xvYmFsTGF5b3V0TGlzdGVuZXIoCisgICAgICAgICAgICAgICAgbmV3IFZpZXdUcmVlT2JzZXJ2ZXIuT25HbG9iYWxMYXlvdXRMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uR2xvYmFsTGF5b3V0KCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50W10gcGFyZW50TG9jYXRpb24gPSBuZXcgaW50WzJdOworICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LmdldExvY2F0aW9uT25TY3JlZW4ocGFyZW50TG9jYXRpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50W10gYnV0dG9uTG9jYXRpb24gPSBuZXcgaW50WzJdOworICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uLmdldExvY2F0aW9uT25TY3JlZW4oYnV0dG9uTG9jYXRpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgeCA9IHBhcmVudExvY2F0aW9uWzBdICsgcGFyZW50LmdldFdpZHRoKCkgLyAyOworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGdhcCA9IGJ1dHRvbkxvY2F0aW9uWzFdIC0gcGFyZW50TG9jYXRpb25bMV07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlY3QgcmVjdCA9IG5ldyBSZWN0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBidXR0b24uZ2V0SGl0UmVjdChyZWN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QudG9wIC09IGdhcCAvIDI7IC8vIFRvdWNoRGVsZWdhdGUgaXMgaGFsZndheSBiZXR3ZWVuIGJ1dHRvbiBhbmQgcGFyZW50CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQuc2V0VG91Y2hEZWxlZ2F0ZShuZXcgVG91Y2hEZWxlZ2F0ZShyZWN0LCBidXR0b24pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvdWNoRGVsZWdhdGVZID0gYnV0dG9uTG9jYXRpb25bMV0gLSBnYXAgLyA0OworICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Vmlld1kgPSBwYXJlbnRMb2NhdGlvblsxXSArIGdhcCAvIDQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICBwYXJlbnQuc2V0T25DbGlja0xpc3RlbmVyKHYgLT4gbVBhcmVudENsaWNrQ291bnQrKyk7CisgICAgICAgIGJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIodiAtPiBtQnV0dG9uQ2xpY2tDb3VudCsrKTsKKyAgICAgICAgYnV0dG9uLnNldE9uVG91Y2hMaXN0ZW5lcigodiwgZXZlbnQpIC0+IHsKKyAgICAgICAgICAgIG1CdXR0b25FdmVudHMuYWRkKE1vdGlvbkV2ZW50Lm9idGFpbihldmVudCkpOworICAgICAgICAgICAgcmV0dXJuIFRvdWNoRGVsZWdhdGVUZXN0QWN0aXZpdHkuc3VwZXIub25Ub3VjaEV2ZW50KGV2ZW50KTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgdm9pZCByZXNldENvdW50ZXJzKCkgeworICAgICAgICBtUGFyZW50Q2xpY2tDb3VudCA9IDA7CisgICAgICAgIG1CdXR0b25DbGlja0NvdW50ID0gMDsKKyAgICAgICAgbUJ1dHRvbkV2ZW50cy5jbGVhcigpOworICAgIH0KKworICAgIGludCBnZXRCdXR0b25DbGlja0NvdW50KCkgeworICAgICAgICByZXR1cm4gbUJ1dHRvbkNsaWNrQ291bnQ7CisgICAgfQorCisgICAgaW50IGdldFBhcmVudENsaWNrQ291bnQoKSB7CisgICAgICAgIHJldHVybiBtUGFyZW50Q2xpY2tDb3VudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYW5kIHJldHVybiB0aGUgb2xkZXN0IE1vdGlvbkV2ZW50LiBDYWxsZXIgbXVzdCByZWN5Y2xlIHRoZSByZXR1cm5lZCBvYmplY3QuCisgICAgICogQHJldHVybiB0aGUgb2xkZXN0IE1vdGlvbkV2ZW50IHRoYXQgdGhlIEJ1dHRvbiBoYXMgcmVjZWl2ZWQKKyAgICAgKi8KKyAgICBNb3Rpb25FdmVudCByZW1vdmVPbGRlc3RCdXR0b25FdmVudCgpIHsKKyAgICAgICAgcmV0dXJuIG1CdXR0b25FdmVudHMucG9sbCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvVmVsb2NpdHlUcmFja2VyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9WZWxvY2l0eVRyYWNrZXJUZXN0LmphdmEKaW5kZXggNzc0YWFkYi4uYjdhMDc4NyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9WZWxvY2l0eVRyYWNrZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9WZWxvY2l0eVRyYWNrZXJUZXN0LmphdmEKQEAgLTE4LDEyICsxOCwxMyBAQAogCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIAotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5WZWxvY2l0eVRyYWNrZXI7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKQEAgLTE3NCw3ICsxNzUsNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBhZGRNb3ZlbWVudCgpIHsKLSAgICAgICAgaWYgKG1UaW1lID49IG1MYXN0VGltZSkgeworICAgICAgICBpZiAobVRpbWUgPiBtTGFzdFRpbWUpIHsKICAgICAgICAgICAgIE1vdGlvbkV2ZW50IGV2ID0gTW90aW9uRXZlbnQub2J0YWluKDBMLCBtVGltZSwgTW90aW9uRXZlbnQuQUNUSU9OX01PVkUsIG1QeCwgbVB5LCAwKTsKICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIuYWRkTW92ZW1lbnQoZXYpOwogICAgICAgICAgICAgZXYucmVjeWNsZSgpOwpAQCAtMjAxLDkgKzIwMiw5IEBACiAgICAgICAgIGlmIChlcnJvclZ4ID4gdG9sZXJhbmNlIHx8IGVycm9yVnkgPiB0b2xlcmFuY2UpIHsKICAgICAgICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiVmVsb2NpdHkgZXhjZWVkcyB0b2xlcmFuY2Ugb2YgJTYuMWYlJTogIgogICAgICAgICAgICAgICAgICAgICArICJleHBlY3RlZCB2eD0lNi4xZiwgdnk9JTYuMWYuICIKLSAgICAgICAgICAgICAgICAgICAgKyAiYWN0dWFsIHZ4PSU2LjFmICglNi4xZiUlKSwgdnk9JTYuMWYgKCU2LjFmJSUpIiwKKyAgICAgICAgICAgICAgICAgICAgKyAiYWN0dWFsIHZ4PSU2LjFmICglNi4xZiUlKSwgdnk9JTYuMWYgKCU2LjFmJSUpLiAlcyIsCiAgICAgICAgICAgICAgICAgICAgIHRvbGVyYW5jZSAqIDEwMC4wZiwgbVZ4LCBtVnksCi0gICAgICAgICAgICAgICAgICAgIGVzdGltYXRlZFZ4LCBlcnJvclZ4ICogMTAwLjBmLCBlc3RpbWF0ZWRWeSwgZXJyb3JWeSAqIDEwMC4wZikpOworICAgICAgICAgICAgICAgICAgICBlc3RpbWF0ZWRWeCwgZXJyb3JWeCAqIDEwMC4wZiwgZXN0aW1hdGVkVnksIGVycm9yVnkgKiAxMDAuMGYsIG1lc3NhZ2UpKTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9WaWV3Q29uZmlndXJhdGlvblRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvVmlld0NvbmZpZ3VyYXRpb25UZXN0LmphdmEKaW5kZXggMmM4OGIyNS4uMTk3Zjg2NyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9WaWV3Q29uZmlndXJhdGlvblRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1ZpZXdDb25maWd1cmF0aW9uVGVzdC5qYXZhCkBAIC0xOCwxMSArMTgsMTIgQEAKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CiAKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0NvbmZpZ3VyYXRpb247CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9WaWV3RGVidWdUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1ZpZXdEZWJ1Z1Rlc3QuamF2YQppbmRleCA4YWY4YmQ5Li45MzQ4YTA1IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1ZpZXdEZWJ1Z1Rlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1ZpZXdEZWJ1Z1Rlc3QuamF2YQpAQCAtMTksMTAgKzE5LDExIEBACiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIAotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3RGVidWc7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvVmlld0dyb3VwT3ZlcmxheVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvVmlld0dyb3VwT3ZlcmxheVRlc3QuamF2YQppbmRleCBmMWIzZWE1Li5hZGU2NmNiIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1ZpZXdHcm91cE92ZXJsYXlUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9WaWV3R3JvdXBPdmVybGF5VGVzdC5qYXZhCkBAIC0zMSwxNyArMzEsMTggQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkNvbG9yRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKIGltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUHJlc3VibWl0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlBhaXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwT3ZlcmxheTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuY3RzLnV0aWwuRHJhd2luZ1V0aWxzOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkN0c1RvdWNoVXRpbHM7CiAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9WaWV3R3JvdXBUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1ZpZXdHcm91cFRlc3QuamF2YQppbmRleCAwYzEyNTc5Li43MDQ5MTg2IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1ZpZXdHcm91cFRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1ZpZXdHcm91cFRlc3QuamF2YQpAQCAtNDMsMTMgKzQzLDYgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkJpdG1hcERyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5MYXJnZVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CkBAIC03Niw2ICs2OSwxNCBAQAogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKIAoraW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTm9uTnVsbDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLkxhcmdlVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DVFNSZXN1bHQ7CiAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9WaWV3R3JvdXBfTGF5b3V0UGFyYW1zVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9WaWV3R3JvdXBfTGF5b3V0UGFyYW1zVGVzdC5qYXZhCmluZGV4IDFjNjgxMGEuLmI0ZTZlOTUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvVmlld0dyb3VwX0xheW91dFBhcmFtc1Rlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1ZpZXdHcm91cF9MYXlvdXRQYXJhbXNUZXN0LmphdmEKQEAgLTIxLDEzICsyMSwxNCBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlhtbFJlc291cmNlUGFyc2VyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cC5MYXlvdXRQYXJhbXM7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmN0cy51dGlsLlhtbFV0aWxzOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvVmlld0dyb3VwX01hcmdpbkxheW91dFBhcmFtc1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvVmlld0dyb3VwX01hcmdpbkxheW91dFBhcmFtc1Rlc3QuamF2YQppbmRleCAwODY3MzM4Li5mZTU5OGEyIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1ZpZXdHcm91cF9NYXJnaW5MYXlvdXRQYXJhbXNUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9WaWV3R3JvdXBfTWFyZ2luTGF5b3V0UGFyYW1zVGVzdC5qYXZhCkBAIC0yMyw5ICsyMyw2IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5YbWxSZXNvdXJjZVBhcnNlcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CkBAIC0zMyw2ICszMCwxMCBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5jdHMudXRpbC5YbWxVdGlsczsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9WaWV3T3V0bGluZVByb3ZpZGVyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9WaWV3T3V0bGluZVByb3ZpZGVyVGVzdC5qYXZhCmluZGV4IDhjZDBkMzcuLjU5MjFhZDQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvVmlld091dGxpbmVQcm92aWRlclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1ZpZXdPdXRsaW5lUHJvdmlkZXJUZXN0LmphdmEKQEAgLTIzLDE0ICsyMywxNSBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuT3V0bGluZTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5Db2xvckRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdPdXRsaW5lUHJvdmlkZXI7CiAKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk5vbk51bGw7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpAQCAtNDUsMTEgKzQ2LDE4IEBACiAgICAgICAgIG1Db250ZXh0ID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0VGFyZ2V0Q29udGV4dCgpOwogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBzZXRWaWV3TGVmdFRvcFJpZ2h0Qm90dG9tKFZpZXcgdmlldywgaW50IGxlZnQsIGludCB0b3AsIGludCByaWdodCwgaW50IGJvdHRvbSkgeworICAgICAgICB2aWV3LnNldExlZnQobGVmdCk7CisgICAgICAgIHZpZXcuc2V0VG9wKHRvcCk7CisgICAgICAgIHZpZXcuc2V0UmlnaHQocmlnaHQpOworICAgICAgICB2aWV3LnNldEJvdHRvbShib3R0b20pOworICAgIH0KKwogICAgIEBVaVRocmVhZFRlc3QKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RCYWNrZ3JvdW5kKCkgewogICAgICAgICBWaWV3IHZpZXcgPSBuZXcgVmlldyhtQ29udGV4dCk7Ci0gICAgICAgIHZpZXcuc2V0TGVmdFRvcFJpZ2h0Qm90dG9tKDEwMCwgMjAwLCAzMDAsIDQwMCk7CisgICAgICAgIHNldFZpZXdMZWZ0VG9wUmlnaHRCb3R0b20odmlldywgMTAwLCAyMDAsIDMwMCwgNDAwKTsKIAogICAgICAgICBPdXRsaW5lIG91dGxpbmUgPSBuZXcgT3V0bGluZSgpOwogICAgICAgICBvdXRsaW5lLnNldEFscGhhKDEuMGYpOwpAQCAtODQsMTMgKzkyLDEzIEBACiAgICAgICAgIFJlY3QgcXVlcnlSZWN0ID0gbmV3IFJlY3QoKTsKICAgICAgICAgb3V0bGluZS5zZXRBbHBoYSgwLjEyM2YpOwogCi0gICAgICAgIHZpZXcuc2V0TGVmdFRvcFJpZ2h0Qm90dG9tKDEsIDIsIDMsIDQpOworICAgICAgICBzZXRWaWV3TGVmdFRvcFJpZ2h0Qm90dG9tKHZpZXcsIDEsIDIsIDMsIDQpOwogICAgICAgICBWaWV3T3V0bGluZVByb3ZpZGVyLkJPVU5EUy5nZXRPdXRsaW5lKHZpZXcsIG91dGxpbmUpOwogICAgICAgICBvdXRsaW5lLmdldFJlY3QocXVlcnlSZWN0KTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBSZWN0KDAsIDAsIDIsIDIpLCBxdWVyeVJlY3QpOyAvLyBsb2NhbCB3aWR0aC9oZWlnaHQKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAuMTIzZiwgb3V0bGluZS5nZXRBbHBoYSgpLCAwZik7IC8vIGFscGhhIG5vdCBjaGFuZ2VkCiAKLSAgICAgICAgdmlldy5zZXRMZWZ0VG9wUmlnaHRCb3R0b20oMTAwLCAyMDAsIDMwMCwgNDAwKTsKKyAgICAgICAgc2V0Vmlld0xlZnRUb3BSaWdodEJvdHRvbSh2aWV3LCAxMDAsIDIwMCwgMzAwLCA0MDApOwogICAgICAgICBWaWV3T3V0bGluZVByb3ZpZGVyLkJPVU5EUy5nZXRPdXRsaW5lKHZpZXcsIG91dGxpbmUpOwogICAgICAgICBvdXRsaW5lLmdldFJlY3QocXVlcnlSZWN0KTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBSZWN0KDAsIDAsIDIwMCwgMjAwKSwgcXVlcnlSZWN0KTsgLy8gbG9jYWwgd2lkdGgvaGVpZ2h0CkBAIC0xMDYsNyArMTE0LDcgQEAKICAgICAgICAgUmVjdCBxdWVyeVJlY3QgPSBuZXcgUmVjdCgpOwogICAgICAgICBvdXRsaW5lLnNldEFscGhhKDAuMTIzZik7CiAKLSAgICAgICAgdmlldy5zZXRMZWZ0VG9wUmlnaHRCb3R0b20oMTAsIDIwLCAzMCwgNDApOworICAgICAgICBzZXRWaWV3TGVmdFRvcFJpZ2h0Qm90dG9tKHZpZXcsIDEwLCAyMCwgMzAsIDQwKTsKICAgICAgICAgdmlldy5zZXRQYWRkaW5nKDAsIDAsIDAsIDApOwogICAgICAgICBWaWV3T3V0bGluZVByb3ZpZGVyLlBBRERFRF9CT1VORFMuZ2V0T3V0bGluZSh2aWV3LCBvdXRsaW5lKTsKICAgICAgICAgb3V0bGluZS5nZXRSZWN0KHF1ZXJ5UmVjdCk7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1ZpZXdPdmVybGF5VGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9WaWV3T3ZlcmxheVRlc3QuamF2YQppbmRleCBiMWY3MzYzLi40ODg1MzJlIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1ZpZXdPdmVybGF5VGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvVmlld092ZXJsYXlUZXN0LmphdmEKQEAgLTIyLDE1ICsyMiwxNiBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkNvbG9yRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5QYWlyOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3T3ZlcmxheTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuY3RzLnV0aWwuRHJhd2luZ1V0aWxzOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvVmlld1BhZGRpbmdUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1ZpZXdQYWRkaW5nVGVzdC5qYXZhCmluZGV4IDYwZmExNzAuLmVjNTRhODIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvVmlld1BhZGRpbmdUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9WaWV3UGFkZGluZ1Rlc3QuamF2YQpAQCAtMjAsMTMgKzIwLDE0IEBACiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1ZpZXdTdHViVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9WaWV3U3R1YlRlc3QuamF2YQppbmRleCAzYWVmMmJiLi5mNDI1ZmY4IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1ZpZXdTdHViVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvVmlld1N0dWJUZXN0LmphdmEKQEAgLTI5LDEwICsyOSw2IEBACiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8udmVyaWZ5WmVyb0ludGVyYWN0aW9uczsKIAogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwpAQCAtNDAsNiArMzYsMTEgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld1N0dWI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvVmlld1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvVmlld1Rlc3QuamF2YQppbmRleCBjZGIyMjIzLi5hY2Q2ODQ5IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1ZpZXdUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9WaWV3VGVzdC5qYXZhCkBAIC0yNyw2ICsyNyw3IEBACiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1hdGNoZXJzLmFueUludDsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTWF0Y2hlcnMuZXE7CiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8uYW55OworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLmRvQW5zd2VyOwogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLmRvUmV0dXJuOwogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLm1vY2s7CiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ubmV2ZXI7CkBAIC02MCwxMSArNjEsNiBAQAogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwogaW1wb3J0IGFuZHJvaWQub3MuVmlicmF0b3I7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnRleHQuZm9ybWF0LkRhdGVVdGlsczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CkBAIC03Nyw2ICs3Myw3IEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LkhhcHRpY0ZlZWRiYWNrQ29uc3RhbnRzOwogaW1wb3J0IGFuZHJvaWQudmlldy5JbnB1dERldmljZTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OwogaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SW5mbGF0ZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwpAQCAtODYsNiArODMsNyBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3LkJhc2VTYXZlZFN0YXRlOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uTG9uZ0NsaWNrTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuT25VbmhhbmRsZWRLZXlFdmVudExpc3RlbmVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Q29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3UGFyZW50OwpAQCAtOTksNiArOTcsMTMgQEAKIGltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuRWRpdFRleHQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkN0c01vdXNlVXRpbDsKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkN0c1RvdWNoVXRpbHM7CkBAIC0xMzUsNiArMTQwLDcgQEAKICAgICBwcml2YXRlIFZpZXdUZXN0Q3RzQWN0aXZpdHkgbUFjdGl2aXR5OwogICAgIHByaXZhdGUgUmVzb3VyY2VzIG1SZXNvdXJjZXM7CiAgICAgcHJpdmF0ZSBNb2NrVmlld1BhcmVudCBtTW9ja1BhcmVudDsKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CiAKICAgICBAUnVsZQogICAgIHB1YmxpYyBBY3Rpdml0eVRlc3RSdWxlPFZpZXdUZXN0Q3RzQWN0aXZpdHk+IG1BY3Rpdml0eVJ1bGUgPQpAQCAtMTQ3LDExICsxNTMsMTMgQEAKICAgICBAQmVmb3JlCiAgICAgcHVibGljIHZvaWQgc2V0dXAoKSB7CiAgICAgICAgIG1JbnN0cnVtZW50YXRpb24gPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKTsKKyAgICAgICAgbUNvbnRleHQgPSBtSW5zdHJ1bWVudGF0aW9uLmdldFRhcmdldENvbnRleHQoKTsKICAgICAgICAgbUFjdGl2aXR5ID0gbUFjdGl2aXR5UnVsZS5nZXRBY3Rpdml0eSgpOwogICAgICAgICBQb2xsaW5nQ2hlY2sud2FpdEZvcihtQWN0aXZpdHk6Omhhc1dpbmRvd0ZvY3VzKTsKICAgICAgICAgbVJlc291cmNlcyA9IG1BY3Rpdml0eS5nZXRSZXNvdXJjZXMoKTsKICAgICAgICAgbU1vY2tQYXJlbnQgPSBuZXcgTW9ja1ZpZXdQYXJlbnQobUFjdGl2aXR5KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShtQWN0aXZpdHkud2FpdEZvcldpbmRvd0ZvY3VzKDUgKiBEYXRlVXRpbHMuU0VDT05EX0lOX01JTExJUykpOworICAgICAgICBQb2xsaW5nQ2hlY2sud2FpdEZvcig1ICogRGF0ZVV0aWxzLlNFQ09ORF9JTl9NSUxMSVMsIG1BY3Rpdml0eTo6aGFzV2luZG93Rm9jdXMpOworICAgICAgICBhc3NlcnRUcnVlKG1BY3Rpdml0eS5oYXNXaW5kb3dGb2N1cygpKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMzQyLDE0ICszNTAsNDUgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEZpbmRWaWV3QnlJZCgpIHsKKyAgICAgICAgLy8gdmVyaWZ5IHZpZXcgY2FuIGZpbmQgc2VsZgogICAgICAgICBWaWV3IHBhcmVudCA9IG1BY3Rpdml0eS5maW5kVmlld0J5SWQoUi5pZC52aWV3bGF5b3V0X3Jvb3QpOwogICAgICAgICBhc3NlcnRTYW1lKHBhcmVudCwgcGFyZW50LmZpbmRWaWV3QnlJZChSLmlkLnZpZXdsYXlvdXRfcm9vdCkpOwogCisgICAgICAgIC8vIGZpbmQgZXhwZWN0ZWQgdmlldyB0eXBlCiAgICAgICAgIFZpZXcgdmlldyA9IHBhcmVudC5maW5kVmlld0J5SWQoUi5pZC5tb2NrX3ZpZXcpOwogICAgICAgICBhc3NlcnRUcnVlKHZpZXcgaW5zdGFuY2VvZiBNb2NrVmlldyk7CiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWlyZVZpZXdCeUlkKCkgeworICAgICAgICBWaWV3IHBhcmVudCA9IG1BY3Rpdml0eS5maW5kVmlld0J5SWQoUi5pZC52aWV3bGF5b3V0X3Jvb3QpOworCisgICAgICAgIFZpZXcgcmVxdWlyZWRWaWV3ID0gcGFyZW50LnJlcXVpcmVWaWV3QnlJZChSLmlkLm1vY2tfdmlldyk7CisgICAgICAgIFZpZXcgZm91bmRWaWV3ID0gcGFyZW50LmZpbmRWaWV3QnlJZChSLmlkLm1vY2tfdmlldyk7CisgICAgICAgIGFzc2VydFNhbWUoZm91bmRWaWV3LCByZXF1aXJlZFZpZXcpOworICAgICAgICBhc3NlcnRUcnVlKHJlcXVpcmVkVmlldyBpbnN0YW5jZW9mIE1vY2tWaWV3KTsKKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWlyZVZpZXdCeUlkTm9JZCgpIHsKKyAgICAgICAgVmlldyBwYXJlbnQgPSBtQWN0aXZpdHkuZmluZFZpZXdCeUlkKFIuaWQudmlld2xheW91dF9yb290KTsKKyAgICAgICAgcGFyZW50LnJlcXVpcmVWaWV3QnlJZChWaWV3Lk5PX0lEKTsKKyAgICB9CisKKworICAgIEBUZXN0KGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1aXJlVmlld0J5SWRJbnZhbGlkKCkgeworICAgICAgICBWaWV3IHBhcmVudCA9IG1BY3Rpdml0eS5maW5kVmlld0J5SWQoUi5pZC52aWV3bGF5b3V0X3Jvb3QpOworICAgICAgICBwYXJlbnQucmVxdWlyZVZpZXdCeUlkKDApOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1aXJlVmlld0J5SWROb3RGb3VuZCgpIHsKKyAgICAgICAgVmlldyBwYXJlbnQgPSBtQWN0aXZpdHkuZmluZFZpZXdCeUlkKFIuaWQudmlld2xheW91dF9yb290KTsKKyAgICAgICAgcGFyZW50LnJlcXVpcmVWaWV3QnlJZChSLmlkLnZpZXcpOyAvLyBpZCBub3QgcHJlc2VudCBpbiB2aWV3X2xheW91dAorICAgIH0KKworICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEFjY2Vzc1RvdWNoRGVsZWdhdGUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgZmluYWwgTW9ja1ZpZXcgdmlldyA9IChNb2NrVmlldykgbUFjdGl2aXR5LmZpbmRWaWV3QnlJZChSLmlkLm1vY2tfdmlldyk7CiAgICAgICAgIFJlY3QgcmVjdCA9IG5ldyBSZWN0KCk7CkBAIC01MDIsNiArNTQxLDMxIEBACiAKICAgICAgICAgQml0bWFwIGJpdG1hcCA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UobVJlc291cmNlcywgUi5kcmF3YWJsZS5pY29uX2JsdWUpOwogICAgICAgICBhc3NlcnROb3ROdWxsKFBvaW50ZXJJY29uLmNyZWF0ZShiaXRtYXAsIDAsIDApKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChQb2ludGVySWNvbi5jcmVhdGUoYml0bWFwLCBiaXRtYXAuZ2V0V2lkdGgoKSAvIDIsIGJpdG1hcC5nZXRIZWlnaHQoKSAvIDIpKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgUG9pbnRlckljb24uY3JlYXRlKGJpdG1hcCwgLTEsIDApOworICAgICAgICAgICAgZmFpbCgiSG90c3BvdCB4IGNhbiBub3QgYmUgPCAwIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBQb2ludGVySWNvbi5jcmVhdGUoYml0bWFwLCAwLCAtMSk7CisgICAgICAgICAgICBmYWlsKCJIb3RzcG90IHkgY2FuIG5vdCBiZSA8IDAiKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFBvaW50ZXJJY29uLmNyZWF0ZShiaXRtYXAsIGJpdG1hcC5nZXRXaWR0aCgpLCAwKTsKKyAgICAgICAgICAgIGZhaWwoIkhvdHNwb3QgeCBjYW5ub3QgYmUgPj0gd2lkdGgiKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFBvaW50ZXJJY29uLmNyZWF0ZShiaXRtYXAsIDAsIGJpdG1hcC5nZXRIZWlnaHQoKSk7CisgICAgICAgICAgICBmYWlsKCJIb3RzcG90IHggY2Fubm90IGJlID49IGhlaWdodCIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFN5c3RlbVBvaW50ZXJJY29uKGludCBzdHlsZSkgewpAQCAtMjM5Miw2ICsyNDU2LDExMiBAQAogICAgIH0KIAogICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVuaGFuZGxlZEtleXMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgTW9ja1VuaGFuZGxlZEtleUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IE1vY2tVbmhhbmRsZWRLZXlMaXN0ZW5lcigpOworICAgICAgICBWaWV3R3JvdXAgdmlld0dyb3VwID0gKFZpZXdHcm91cCkgbUFjdGl2aXR5LmZpbmRWaWV3QnlJZChSLmlkLnZpZXdsYXlvdXRfcm9vdCk7CisgICAgICAgIC8vIEF0dGFjaGluZyBhIGZhbGxiYWNrIGhhbmRsZXIKKyAgICAgICAgVGV4dFZpZXcgbW9ja1ZpZXcxID0gbmV3IFRleHRWaWV3KG1BY3Rpdml0eSk7CisgICAgICAgIG1vY2tWaWV3MS5hZGRPblVuaGFuZGxlZEtleUV2ZW50TGlzdGVuZXIobGlzdGVuZXIpOworCisgICAgICAgIC8vIEJlZm9yZSB0aGUgdmlldyBpcyBhdHRhY2hlZCwgaXQgc2hvdWxkbid0IHJlc3BvbmQgdG8gYW55dGhpbmcKKyAgICAgICAgbUluc3RydW1lbnRhdGlvbi5zZW5kS2V5RG93blVwU3luYyhLZXlFdmVudC5LRVlDT0RFX0IpOworICAgICAgICBhc3NlcnRGYWxzZShsaXN0ZW5lci5maXJlZCgpKTsKKworICAgICAgICAvLyBPbmNlIGF0dGFjaGVkLCBpdCBzaG91bGQgc3RhcnQgcmVjZWl2aW5nIGZhbGxiYWNrIGV2ZW50cworICAgICAgICBtQWN0aXZpdHlSdWxlLnJ1bk9uVWlUaHJlYWQoKCkgLT4gdmlld0dyb3VwLmFkZFZpZXcobW9ja1ZpZXcxKSk7CisgICAgICAgIG1JbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7CisgICAgICAgIG1JbnN0cnVtZW50YXRpb24uc2VuZEtleURvd25VcFN5bmMoS2V5RXZlbnQuS0VZQ09ERV9CKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShsaXN0ZW5lci5maXJlZCgpKTsKKyAgICAgICAgbGlzdGVuZXIucmVzZXQoKTsKKworICAgICAgICAvLyBJZiBtdWx0aXBsZSBvbiBvbmUgdmlldywgbGFzdCBhZGRlZCBzaG91bGQgcmVjZWl2ZSBldmVudCBmaXJzdAorICAgICAgICBNb2NrVW5oYW5kbGVkS2V5TGlzdGVuZXIgbGlzdGVuZXIyID0gbmV3IE1vY2tVbmhhbmRsZWRLZXlMaXN0ZW5lcigpOworICAgICAgICBsaXN0ZW5lcjIubVJldHVyblZhbCA9IHRydWU7CisgICAgICAgIG1BY3Rpdml0eVJ1bGUucnVuT25VaVRocmVhZCgoKSAtPiBtb2NrVmlldzEuYWRkT25VbmhhbmRsZWRLZXlFdmVudExpc3RlbmVyKGxpc3RlbmVyMikpOworICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLndhaXRGb3JJZGxlU3luYygpOworICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLnNlbmRLZXlEb3duVXBTeW5jKEtleUV2ZW50LktFWUNPREVfQik7CisgICAgICAgIGFzc2VydFRydWUobGlzdGVuZXIyLmZpcmVkKCkpOworICAgICAgICBhc3NlcnRGYWxzZShsaXN0ZW5lci5maXJlZCgpKTsKKyAgICAgICAgbGlzdGVuZXIyLnJlc2V0KCk7CisKKyAgICAgICAgLy8gSWYgcmVtb3ZlZCwgaXQgc2hvdWxkIG5vdCByZWNlaXZlIGZhbGxiYWNrcyBhbnltb3JlCisgICAgICAgIG1BY3Rpdml0eVJ1bGUucnVuT25VaVRocmVhZCgoKSAtPiB7CisgICAgICAgICAgICBtb2NrVmlldzEucmVtb3ZlT25VbmhhbmRsZWRLZXlFdmVudExpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgICAgIG1vY2tWaWV3MS5yZW1vdmVPblVuaGFuZGxlZEtleUV2ZW50TGlzdGVuZXIobGlzdGVuZXIyKTsKKyAgICAgICAgfSk7CisgICAgICAgIG1JbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7CisgICAgICAgIG1JbnN0cnVtZW50YXRpb24uc2VuZEtleURvd25VcFN5bmMoS2V5RXZlbnQuS0VZQ09ERV9CKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobGlzdGVuZXIuZmlyZWQoKSk7CisKKyAgICAgICAgbUFjdGl2aXR5UnVsZS5ydW5PblVpVGhyZWFkKCgpIC0+IG1BY3Rpdml0eS5zZXRDb250ZW50VmlldyhSLmxheW91dC5rZXlfZmFsbGJhY2tfbGF5b3V0KSk7CisgICAgICAgIG1JbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7CisgICAgICAgIFZpZXcgaGlnaGVySW5Ob3JtYWwgPSBtQWN0aXZpdHkuZmluZFZpZXdCeUlkKFIuaWQuaGlnaGVyX2luX25vcm1hbCk7CisgICAgICAgIFZpZXcgaGlnaGVyR3JvdXAgPSBtQWN0aXZpdHkuZmluZFZpZXdCeUlkKFIuaWQuaGlnaGVyX2dyb3VwKTsKKyAgICAgICAgVmlldyBsb3dlckluSGlnaGVyID0gbUFjdGl2aXR5LmZpbmRWaWV3QnlJZChSLmlkLmxvd2VyX2luX2hpZ2hlcik7CisgICAgICAgIFZpZXcgbGFzdEJ1dHRvbiA9IG1BY3Rpdml0eS5maW5kVmlld0J5SWQoUi5pZC5sYXN0X2J1dHRvbik7CisgICAgICAgIFZpZXcgbGFzdEluSGlnaGVyID0gbUFjdGl2aXR5LmZpbmRWaWV3QnlJZChSLmlkLmxhc3RfaW5faGlnaGVyKTsKKyAgICAgICAgVmlldyBsYXN0SW5Ob3JtYWwgPSBtQWN0aXZpdHkuZmluZFZpZXdCeUlkKFIuaWQubGFzdF9pbl9ub3JtYWwpOworCisgICAgICAgIFZpZXdbXSBhbGxWaWV3cyA9IG5ldyBWaWV3W117aGlnaGVySW5Ob3JtYWwsIGhpZ2hlckdyb3VwLCBsb3dlckluSGlnaGVyLCBsYXN0QnV0dG9uLAorICAgICAgICAgICAgICAgIGxhc3RJbkhpZ2hlciwgbGFzdEluTm9ybWFsfTsKKworICAgICAgICAvLyBUZXN0IG9yZGVyaW5nIGJ5IGRlcHRoCisgICAgICAgIGxpc3RlbmVyLm1SZXR1cm5WYWwgPSB0cnVlOworICAgICAgICBtQWN0aXZpdHlSdWxlLnJ1bk9uVWlUaHJlYWQoKCkgLT4geworICAgICAgICAgICAgZm9yIChWaWV3IHYgOiBhbGxWaWV3cykgeworICAgICAgICAgICAgICAgIHYuYWRkT25VbmhhbmRsZWRLZXlFdmVudExpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIG1JbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7CisKKyAgICAgICAgbUluc3RydW1lbnRhdGlvbi5zZW5kS2V5RG93blVwU3luYyhLZXlFdmVudC5LRVlDT0RFX0IpOworICAgICAgICBhc3NlcnRFcXVhbHMobGFzdEluSGlnaGVyLCBsaXN0ZW5lci5tTGFzdFZpZXcpOworICAgICAgICBsaXN0ZW5lci5yZXNldCgpOworCisgICAgICAgIG1BY3Rpdml0eVJ1bGUucnVuT25VaVRocmVhZCgKKyAgICAgICAgICAgICAgICAoKSAtPiBsYXN0SW5IaWdoZXIucmVtb3ZlT25VbmhhbmRsZWRLZXlFdmVudExpc3RlbmVyKGxpc3RlbmVyKSk7CisgICAgICAgIG1JbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7CisgICAgICAgIG1JbnN0cnVtZW50YXRpb24uc2VuZEtleURvd25VcFN5bmMoS2V5RXZlbnQuS0VZQ09ERV9CKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGxvd2VySW5IaWdoZXIsIGxpc3RlbmVyLm1MYXN0Vmlldyk7CisgICAgICAgIGxpc3RlbmVyLnJlc2V0KCk7CisKKyAgICAgICAgbUFjdGl2aXR5UnVsZS5ydW5PblVpVGhyZWFkKAorICAgICAgICAgICAgICAgICgpIC0+IGxvd2VySW5IaWdoZXIucmVtb3ZlT25VbmhhbmRsZWRLZXlFdmVudExpc3RlbmVyKGxpc3RlbmVyKSk7CisgICAgICAgIG1JbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7CisgICAgICAgIG1JbnN0cnVtZW50YXRpb24uc2VuZEtleURvd25VcFN5bmMoS2V5RXZlbnQuS0VZQ09ERV9CKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGhpZ2hlckdyb3VwLCBsaXN0ZW5lci5tTGFzdFZpZXcpOworICAgICAgICBsaXN0ZW5lci5yZXNldCgpOworCisgICAgICAgIG1BY3Rpdml0eVJ1bGUucnVuT25VaVRocmVhZCgoKSAtPiBoaWdoZXJHcm91cC5yZW1vdmVPblVuaGFuZGxlZEtleUV2ZW50TGlzdGVuZXIobGlzdGVuZXIpKTsKKyAgICAgICAgbUluc3RydW1lbnRhdGlvbi53YWl0Rm9ySWRsZVN5bmMoKTsKKyAgICAgICAgbUluc3RydW1lbnRhdGlvbi5zZW5kS2V5RG93blVwU3luYyhLZXlFdmVudC5LRVlDT0RFX0IpOworICAgICAgICBhc3NlcnRFcXVhbHMobGFzdEJ1dHRvbiwgbGlzdGVuZXIubUxhc3RWaWV3KTsKKyAgICAgICAgbGlzdGVuZXIucmVzZXQoKTsKKworICAgICAgICBtQWN0aXZpdHlSdWxlLnJ1bk9uVWlUaHJlYWQoKCkgLT4gbGFzdEJ1dHRvbi5yZW1vdmVPblVuaGFuZGxlZEtleUV2ZW50TGlzdGVuZXIobGlzdGVuZXIpKTsKKyAgICAgICAgbUluc3RydW1lbnRhdGlvbi53YWl0Rm9ySWRsZVN5bmMoKTsKKyAgICAgICAgbUluc3RydW1lbnRhdGlvbi5zZW5kS2V5RG93blVwU3luYyhLZXlFdmVudC5LRVlDT0RFX0IpOworICAgICAgICBhc3NlcnRFcXVhbHMoaGlnaGVySW5Ob3JtYWwsIGxpc3RlbmVyLm1MYXN0Vmlldyk7CisgICAgICAgIGxpc3RlbmVyLnJlc2V0KCk7CisKKyAgICAgICAgbUFjdGl2aXR5UnVsZS5ydW5PblVpVGhyZWFkKAorICAgICAgICAgICAgICAgICgpIC0+IGhpZ2hlckluTm9ybWFsLnJlbW92ZU9uVW5oYW5kbGVkS2V5RXZlbnRMaXN0ZW5lcihsaXN0ZW5lcikpOworICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLndhaXRGb3JJZGxlU3luYygpOworICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLnNlbmRLZXlEb3duVXBTeW5jKEtleUV2ZW50LktFWUNPREVfQik7CisgICAgICAgIGFzc2VydEVxdWFscyhsYXN0SW5Ob3JtYWwsIGxpc3RlbmVyLm1MYXN0Vmlldyk7CisgICAgICAgIGxpc3RlbmVyLnJlc2V0KCk7CisKKyAgICAgICAgLy8gVGVzdCAiY2FwdHVyZSIKKyAgICAgICAgbUFjdGl2aXR5UnVsZS5ydW5PblVpVGhyZWFkKCgpIC0+IGxhc3RJbk5vcm1hbC5yZXF1ZXN0Rm9jdXMoKSk7CisgICAgICAgIG1JbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7CisgICAgICAgIGxhc3RJbk5vcm1hbC5zZXRPbktleUxpc3RlbmVyKCh2LCBrZXlDb2RlLCBldmVudCkKKyAgICAgICAgICAgICAgICAtPiAoa2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX0IgJiYgZXZlbnQuZ2V0QWN0aW9uKCkgPT0gS2V5RXZlbnQuQUNUSU9OX1VQKSk7CisgICAgICAgIG1JbnN0cnVtZW50YXRpb24uc2VuZEtleURvd25VcFN5bmMoS2V5RXZlbnQuS0VZQ09ERV9CKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShsaXN0ZW5lci5maXJlZCgpKTsgLy8gY2hlY2tzIHRoYXQgYm90aCB1cCBhbmQgZG93biB3ZXJlIHJlY2VpdmVkCisgICAgICAgIGxpc3RlbmVyLnJlc2V0KCk7CisgICAgfQorCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0V2luZG93VmlzaWJpbGl0eUNoYW5nZWQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgZmluYWwgTW9ja1ZpZXcgbW9ja1ZpZXcgPSBuZXcgTW9ja1ZpZXcobUFjdGl2aXR5KTsKICAgICAgICAgZmluYWwgVmlld0dyb3VwIHZpZXdHcm91cCA9IChWaWV3R3JvdXApIG1BY3Rpdml0eS5maW5kVmlld0J5SWQoUi5pZC52aWV3bGF5b3V0X3Jvb3QpOwpAQCAtMzk4MSw3ICs0MTUxLDkgQEAKICAgICAgICAgZmluYWwgTW9ja0VkaXRUZXh0IGVkaXRUZXh0ID0gbmV3IE1vY2tFZGl0VGV4dChtQWN0aXZpdHkpOwogCiAgICAgICAgIG1BY3Rpdml0eVJ1bGUucnVuT25VaVRocmVhZCgoKSAtPiB7Ci0gICAgICAgICAgICB2aWV3R3JvdXAuYWRkVmlldyhlZGl0VGV4dCk7CisgICAgICAgICAgICAvLyBHaXZlIGEgZml4ZWQgc2l6ZSBzaW5jZSwgb24gbW9zdCBkZXZpY2VzLCB0aGUgZWRpdHRleHQgaXMgb2ZmLXNjcmVlbgorICAgICAgICAgICAgLy8gYW5kIHRoZXJlZm9yZSBkb2Vzbid0IGdldCBsYWlkLW91dCBwcm9wZXJseS4KKyAgICAgICAgICAgIHZpZXdHcm91cC5hZGRWaWV3KGVkaXRUZXh0LCAxMDAsIDMwKTsKICAgICAgICAgICAgIGVkaXRUZXh0LnJlcXVlc3RGb2N1cygpOwogICAgICAgICB9KTsKICAgICAgICAgbUluc3RydW1lbnRhdGlvbi53YWl0Rm9ySWRsZVN5bmMoKTsKQEAgLTQyMjIsMTggKzQzOTQsNDUgQEAKICAgICAgICAgYXNzZXJ0VHJ1ZShvdmVycmlkaW5nVmlldy5oYXNPdmVybGFwcGluZ1JlbmRlcmluZygpKTsKICAgICB9CiAKKyAgICBwcml2YXRlIGJvb2xlYW4gc3RhcnREcmFnQW5kRHJvcChWaWV3IHZpZXcsIFZpZXcuRHJhZ1NoYWRvd0J1aWxkZXIgc2hhZG93QnVpbGRlcikgeworICAgICAgICBmaW5hbCBQb2ludCBzaXplID0gbmV3IFBvaW50KCk7CisgICAgICAgIG1BY3Rpdml0eS5nZXREaXNwbGF5KCkuZ2V0U2l6ZShzaXplKTsKKyAgICAgICAgZmluYWwgTW90aW9uRXZlbnQgZXZlbnQgPSBNb3Rpb25FdmVudC5vYnRhaW4oCisgICAgICAgICAgICAgICAgU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCksIFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpLAorICAgICAgICAgICAgICAgIE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOLCBzaXplLnggLyAyLCBzaXplLnkgLyAyLCAxKTsKKyAgICAgICAgZXZlbnQuc2V0U291cmNlKElucHV0RGV2aWNlLlNPVVJDRV9UT1VDSFNDUkVFTik7CisgICAgICAgIG1JbnN0cnVtZW50YXRpb24uZ2V0VWlBdXRvbWF0aW9uKCkuaW5qZWN0SW5wdXRFdmVudChldmVudCwgdHJ1ZSk7CisKKyAgICAgICAgcmV0dXJuIHZpZXcuc3RhcnREcmFnQW5kRHJvcChDbGlwRGF0YS5uZXdQbGFpblRleHQoIiIsICIiKSwgc2hhZG93QnVpbGRlciwgdmlldywgMCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgVmlldy5EcmFnU2hhZG93QnVpbGRlciBjcmVhdGVEcmFnU2hhZG93QnVpZGxlcigpIHsKKyAgICAgICAgVmlldy5EcmFnU2hhZG93QnVpbGRlciBzaGFkb3dCdWlsZGVyID0gbW9jayhWaWV3LkRyYWdTaGFkb3dCdWlsZGVyLmNsYXNzKTsKKyAgICAgICAgZG9BbnN3ZXIoYSAtPiB7CisgICAgICAgICAgICBmaW5hbCBQb2ludCBvdXRQb2ludCA9IChQb2ludCkgYS5nZXRBcmd1bWVudHMoKVswXTsKKyAgICAgICAgICAgIG91dFBvaW50LnggPSAxOworICAgICAgICAgICAgb3V0UG9pbnQueSA9IDE7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSkud2hlbihzaGFkb3dCdWlsZGVyKS5vblByb3ZpZGVTaGFkb3dNZXRyaWNzKGFueSgpLCBhbnkoKSk7CisgICAgICAgIHJldHVybiBzaGFkb3dCdWlsZGVyOworICAgIH0KKwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFVwZGF0ZURyYWdTaGFkb3coKSB7CiAgICAgICAgIFZpZXcgdmlldyA9IG1BY3Rpdml0eS5maW5kVmlld0J5SWQoUi5pZC5maXRfd2luZG93cyk7CiAgICAgICAgIGFzc2VydFRydWUodmlldy5pc0F0dGFjaGVkVG9XaW5kb3coKSk7CiAKLSAgICAgICAgVmlldy5EcmFnU2hhZG93QnVpbGRlciBzaGFkb3dCdWlsZGVyID0gbW9jayhWaWV3LkRyYWdTaGFkb3dCdWlsZGVyLmNsYXNzKTsKLSAgICAgICAgdmlldy5zdGFydERyYWdBbmREcm9wKENsaXBEYXRhLm5ld1BsYWluVGV4dCgiIiwgIiIpLCBzaGFkb3dCdWlsZGVyLCB2aWV3LCAwKTsKLSAgICAgICAgcmVzZXQoc2hhZG93QnVpbGRlcik7Ci0KLSAgICAgICAgdmlldy51cGRhdGVEcmFnU2hhZG93KHNoYWRvd0J1aWxkZXIpOwotICAgICAgICAvLyBUT0RPOiBWZXJpZnkgd2l0aCB0aGUgY2FudmFzIGZyb20gdGhlIGRyYWcgc3VyZmFjZSBpbnN0ZWFkLgotICAgICAgICB2ZXJpZnkoc2hhZG93QnVpbGRlcikub25EcmF3U2hhZG93KGFueShDYW52YXMuY2xhc3MpKTsKKyAgICAgICAgZmluYWwgVmlldy5EcmFnU2hhZG93QnVpbGRlciBzaGFkb3dCdWlsZGVyID0gY3JlYXRlRHJhZ1NoYWRvd0J1aWRsZXIoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkNvdWxkIG5vdCBzdGFydCBkcmFnIGFuZCBkcm9wIiwgc3RhcnREcmFnQW5kRHJvcCh2aWV3LCBzaGFkb3dCdWlsZGVyKSk7CisgICAgICAgICAgICByZXNldChzaGFkb3dCdWlsZGVyKTsKKyAgICAgICAgICAgIHZpZXcudXBkYXRlRHJhZ1NoYWRvdyhzaGFkb3dCdWlsZGVyKTsKKyAgICAgICAgICAgIC8vIFRPRE86IFZlcmlmeSB3aXRoIHRoZSBjYW52YXMgZnJvbSB0aGUgZHJhZyBzdXJmYWNlIGluc3RlYWQuCisgICAgICAgICAgICB2ZXJpZnkoc2hhZG93QnVpbGRlcikub25EcmF3U2hhZG93KGFueShDYW52YXMuY2xhc3MpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIC8vIEVuc3VyZSB0byBjYW5jZWwgZHJhZyBhbmQgZHJvcCBvcGVyYXRpb24gc28gdGhhdCBpdCBkb2VzIG5vdCBhZmZlY3Qgb3RoZXIgdGVzdHMuCisgICAgICAgICAgICB2aWV3LmNhbmNlbERyYWdBbmREcm9wKCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBAVGVzdApAQCAtNDI0MSwxMiArNDQ0MCwxOCBAQAogICAgICAgICBWaWV3IHZpZXcgPSBuZXcgVmlldyhtQWN0aXZpdHkpOwogICAgICAgICBhc3NlcnRGYWxzZSh2aWV3LmlzQXR0YWNoZWRUb1dpbmRvdygpKTsKIAotICAgICAgICBWaWV3LkRyYWdTaGFkb3dCdWlsZGVyIHNoYWRvd0J1aWxkZXIgPSBtb2NrKFZpZXcuRHJhZ1NoYWRvd0J1aWxkZXIuY2xhc3MpOwotICAgICAgICB2aWV3LnN0YXJ0RHJhZ0FuZERyb3AoQ2xpcERhdGEubmV3UGxhaW5UZXh0KCIiLCAiIiksIHNoYWRvd0J1aWxkZXIsIHZpZXcsIDApOwotICAgICAgICByZXNldChzaGFkb3dCdWlsZGVyKTsKKyAgICAgICAgVmlldy5EcmFnU2hhZG93QnVpbGRlciBzaGFkb3dCdWlsZGVyID0gY3JlYXRlRHJhZ1NoYWRvd0J1aWRsZXIoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKCJEcmFnIGFuZCBkcm9wIGZvciBkZXRhY2hlZCB2aWV3IG11c3QgZmFpbCIsCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0RHJhZ0FuZERyb3Aodmlldywgc2hhZG93QnVpbGRlcikpOworICAgICAgICAgICAgcmVzZXQoc2hhZG93QnVpbGRlcik7CiAKLSAgICAgICAgdmlldy51cGRhdGVEcmFnU2hhZG93KHNoYWRvd0J1aWxkZXIpOwotICAgICAgICB2ZXJpZnkoc2hhZG93QnVpbGRlciwgbmV2ZXIoKSkub25EcmF3U2hhZG93KGFueShDYW52YXMuY2xhc3MpKTsKKyAgICAgICAgICAgIHZpZXcudXBkYXRlRHJhZ1NoYWRvdyhzaGFkb3dCdWlsZGVyKTsKKyAgICAgICAgICAgIHZlcmlmeShzaGFkb3dCdWlsZGVyLCBuZXZlcigpKS5vbkRyYXdTaGFkb3coYW55KENhbnZhcy5jbGFzcykpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgLy8gRW5zdXJlIHRvIGNhbmNlbCBkcmFnIGFuZCBkcm9wIG9wZXJhdGlvbiBzbyB0aGF0IGl0IGRvZXMgbm90IGFmZmVjdCBvdGhlciB0ZXN0cy4KKyAgICAgICAgICAgIHZpZXcuY2FuY2VsRHJhZ0FuZERyb3AoKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIEBUZXN0CkBAIC00MjU0LDcgKzQ0NTksNyBAQAogICAgICAgICBWaWV3IHZpZXcgPSBtQWN0aXZpdHkuZmluZFZpZXdCeUlkKFIuaWQuZml0X3dpbmRvd3MpOwogICAgICAgICBhc3NlcnRUcnVlKHZpZXcuaXNBdHRhY2hlZFRvV2luZG93KCkpOwogCi0gICAgICAgIFZpZXcuRHJhZ1NoYWRvd0J1aWxkZXIgc2hhZG93QnVpbGRlciA9IG1vY2soVmlldy5EcmFnU2hhZG93QnVpbGRlci5jbGFzcyk7CisgICAgICAgIFZpZXcuRHJhZ1NoYWRvd0J1aWxkZXIgc2hhZG93QnVpbGRlciA9IGNyZWF0ZURyYWdTaGFkb3dCdWlkbGVyKCk7CiAgICAgICAgIHZpZXcudXBkYXRlRHJhZ1NoYWRvdyhzaGFkb3dCdWlsZGVyKTsKICAgICAgICAgdmVyaWZ5KHNoYWRvd0J1aWxkZXIsIG5ldmVyKCkpLm9uRHJhd1NoYWRvdyhhbnkoQ2FudmFzLmNsYXNzKSk7CiAgICAgfQpAQCAtNDQzNyw2ICs0NjQyLDEwMCBAQAogICAgICAgICBldmVudC5yZWN5Y2xlKCk7CiAgICAgfQogCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdFNjYWxlWE5hTigpIHsKKyAgICAgICAgVmlldyB2aWV3ID0gbmV3IFZpZXcobUNvbnRleHQpOworICAgICAgICB2aWV3LnNldFNjYWxlWChGbG9hdC5OYU4pOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RTY2FsZVhQb3NpdGl2ZUluZmluaXR5KCkgeworICAgICAgICBWaWV3IHZpZXcgPSBuZXcgVmlldyhtQ29udGV4dCk7CisgICAgICAgIHZpZXcuc2V0U2NhbGVYKEZsb2F0LlBPU0lUSVZFX0lORklOSVRZKTsKKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2NhbGVYTmVnYXRpdmVJbmZpbml0eSgpIHsKKyAgICAgICAgVmlldyB2aWV3ID0gbmV3IFZpZXcobUNvbnRleHQpOworICAgICAgICB2aWV3LnNldFNjYWxlWChGbG9hdC5ORUdBVElWRV9JTkZJTklUWSk7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdFNjYWxlWU5hTigpIHsKKyAgICAgICAgVmlldyB2aWV3ID0gbmV3IFZpZXcobUNvbnRleHQpOworICAgICAgICB2aWV3LnNldFNjYWxlWShGbG9hdC5OYU4pOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RTY2FsZVlQb3NpdGl2ZUluZmluaXR5KCkgeworICAgICAgICBWaWV3IHZpZXcgPSBuZXcgVmlldyhtQ29udGV4dCk7CisgICAgICAgIHZpZXcuc2V0U2NhbGVZKEZsb2F0LlBPU0lUSVZFX0lORklOSVRZKTsKKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2NhbGVZTmVnYXRpdmVJbmZpbml0eSgpIHsKKyAgICAgICAgVmlldyB2aWV3ID0gbmV3IFZpZXcobUNvbnRleHQpOworICAgICAgICB2aWV3LnNldFNjYWxlWShGbG9hdC5ORUdBVElWRV9JTkZJTklUWSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0R2V0T3V0bGluZVNoYWRvd0NvbG9yKCkgeworICAgICAgICBWaWV3R3JvdXAgZ3JvdXAgPSAoVmlld0dyb3VwKSBMYXlvdXRJbmZsYXRlci5mcm9tKG1Db250ZXh0KS5pbmZsYXRlKAorICAgICAgICAgICAgICAgIFIubGF5b3V0LnZpZXdfb3V0bGluZXNoYWRvd2NvbG9yLCBudWxsKTsKKyAgICAgICAgVmlldyBkZWZhdWx0U2hhZG93ID0gZ3JvdXAuZmluZFZpZXdCeUlkKFIuaWQuZGVmYXVsdF9zaGFkb3cpOworICAgICAgICBhc3NlcnRFcXVhbHMoQ29sb3IuQkxBQ0ssIGRlZmF1bHRTaGFkb3cuZ2V0T3V0bGluZVNwb3RTaGFkb3dDb2xvcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKENvbG9yLkJMQUNLLCBkZWZhdWx0U2hhZG93LmdldE91dGxpbmVBbWJpZW50U2hhZG93Q29sb3IoKSk7CisgICAgICAgIGRlZmF1bHRTaGFkb3cuc2V0T3V0bGluZVNwb3RTaGFkb3dDb2xvcihDb2xvci5ZRUxMT1cpOworICAgICAgICBkZWZhdWx0U2hhZG93LnNldE91dGxpbmVBbWJpZW50U2hhZG93Q29sb3IoQ29sb3IuR1JFRU4pOworICAgICAgICBhc3NlcnRFcXVhbHMoQ29sb3IuWUVMTE9XLCBkZWZhdWx0U2hhZG93LmdldE91dGxpbmVTcG90U2hhZG93Q29sb3IoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhDb2xvci5HUkVFTiwgZGVmYXVsdFNoYWRvdy5nZXRPdXRsaW5lQW1iaWVudFNoYWRvd0NvbG9yKCkpOworCisgICAgICAgIFZpZXcgcmVkQW1iaWVudFNoYWRvdyA9IGdyb3VwLmZpbmRWaWV3QnlJZChSLmlkLnJlZF9zaGFkb3cpOworICAgICAgICBhc3NlcnRFcXVhbHMoQ29sb3IuUkVELCByZWRBbWJpZW50U2hhZG93LmdldE91dGxpbmVBbWJpZW50U2hhZG93Q29sb3IoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhDb2xvci5CTEFDSywgcmVkQW1iaWVudFNoYWRvdy5nZXRPdXRsaW5lU3BvdFNoYWRvd0NvbG9yKCkpOworCisgICAgICAgIFZpZXcgYmx1ZVNwb3RTaGFkb3cgPSBncm91cC5maW5kVmlld0J5SWQoUi5pZC5ibHVlX3NoYWRvdyk7CisgICAgICAgIGFzc2VydEVxdWFscyhDb2xvci5CTFVFLCBibHVlU3BvdFNoYWRvdy5nZXRPdXRsaW5lU3BvdFNoYWRvd0NvbG9yKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoQ29sb3IuQkxBQ0ssIGJsdWVTcG90U2hhZG93LmdldE91dGxpbmVBbWJpZW50U2hhZG93Q29sb3IoKSk7CisKKyAgICAgICAgVmlldyBncmVlblNoYWRvdyA9IGdyb3VwLmZpbmRWaWV3QnlJZChSLmlkLmdyZWVuX3NoYWRvdyk7CisgICAgICAgIGFzc2VydEVxdWFscyhDb2xvci5HUkVFTiwgZ3JlZW5TaGFkb3cuZ2V0T3V0bGluZVNwb3RTaGFkb3dDb2xvcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKENvbG9yLkdSRUVOLCBncmVlblNoYWRvdy5nZXRPdXRsaW5lQW1iaWVudFNoYWRvd0NvbG9yKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBpdm90KCkgeworICAgICAgICBWaWV3IHZpZXcgPSBuZXcgVmlldyhtQ29udGV4dCk7CisgICAgICAgIGludCB3aWR0aFNwZWMgPSBWaWV3Lk1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYygxMDAsIFZpZXcuTWVhc3VyZVNwZWMuRVhBQ1RMWSk7CisgICAgICAgIGludCBoZWlnaHRTcGVjID0gVmlldy5NZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoMjAwLCBWaWV3Lk1lYXN1cmVTcGVjLkVYQUNUTFkpOworICAgICAgICB2aWV3Lm1lYXN1cmUod2lkdGhTcGVjLCBoZWlnaHRTcGVjKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEwMCwgdmlldy5nZXRNZWFzdXJlZFdpZHRoKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCB2aWV3LmdldE1lYXN1cmVkSGVpZ2h0KCkpOworICAgICAgICB2aWV3LmxheW91dCgwLCAwLCAxMDAsIDIwMCk7CisgICAgICAgIGFzc2VydEVxdWFscygxMDAsIHZpZXcuZ2V0V2lkdGgoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHZpZXcuZ2V0SGVpZ2h0KCkpOworCisgICAgICAgIC8vIEFzc2VydCBkZWZhdWx0IHBpdm90IGJlaGF2aW9yCisgICAgICAgIGFzc2VydEVxdWFscyg1MCwgdmlldy5nZXRQaXZvdFgoKSwgMC4wZik7CisgICAgICAgIGFzc2VydEVxdWFscygxMDAsIHZpZXcuZ2V0UGl2b3RZKCksIDAuMGYpOworICAgICAgICBhc3NlcnRGYWxzZSh2aWV3LmlzUGl2b3RTZXQoKSk7CisKKyAgICAgICAgLy8gQXNzZXJ0IGl0IGNoYW5nZXMgYXMgZXhwZWN0ZWQKKyAgICAgICAgdmlldy5zZXRQaXZvdFgoMTUpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTUsIHZpZXcuZ2V0UGl2b3RYKCksIDAuMGYpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTAwLCB2aWV3LmdldFBpdm90WSgpLCAwLjBmKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh2aWV3LmlzUGl2b3RTZXQoKSk7CisgICAgICAgIHZpZXcuc2V0UGl2b3RZKDApOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdmlldy5nZXRQaXZvdFkoKSwgMC4wZik7CisgICAgICAgIGFzc2VydFRydWUodmlldy5pc1Bpdm90U2V0KCkpOworCisgICAgICAgIC8vIEFzc2V0IHJlc2V0dGluZyBiYWNrIHRvIGRlZmF1bHQKKyAgICAgICAgdmlldy5yZXNldFBpdm90KCk7CisgICAgICAgIGFzc2VydEVxdWFscyg1MCwgdmlldy5nZXRQaXZvdFgoKSwgMC4wZik7CisgICAgICAgIGFzc2VydEVxdWFscygxMDAsIHZpZXcuZ2V0UGl2b3RZKCksIDAuMGYpOworICAgICAgICBhc3NlcnRGYWxzZSh2aWV3LmlzUGl2b3RTZXQoKSk7CisgICAgfQorCiAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTW9ja0RyYXdhYmxlIGV4dGVuZHMgRHJhd2FibGUgewogICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUNhbGxlZFNldFRpbnQgPSBmYWxzZTsKIApAQCAtNDc4OCw2ICs1MDg3LDI5IEBACiAgICAgICAgIHB1YmxpYyBWaWV3IGZpcnN0Q2hpbGQ7CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTW9ja1VuaGFuZGxlZEtleUxpc3RlbmVyIGltcGxlbWVudHMgT25VbmhhbmRsZWRLZXlFdmVudExpc3RlbmVyIHsKKyAgICAgICAgcHVibGljIFZpZXcgbUxhc3RWaWV3ID0gbnVsbDsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gbUdvdFVwID0gZmFsc2U7CisgICAgICAgIHB1YmxpYyBib29sZWFuIG1SZXR1cm5WYWwgPSBmYWxzZTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25VbmhhbmRsZWRLZXlFdmVudChWaWV3IHYsIEtleUV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0QWN0aW9uKCkgPT0gS2V5RXZlbnQuQUNUSU9OX0RPV04pIHsKKyAgICAgICAgICAgICAgICBtTGFzdFZpZXcgPSB2OworICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBLZXlFdmVudC5BQ1RJT05fVVApIHsKKyAgICAgICAgICAgICAgICBtR290VXAgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG1SZXR1cm5WYWw7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7CisgICAgICAgICAgICBtTGFzdFZpZXcgPSBudWxsOworICAgICAgICAgICAgbUdvdFVwID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGJvb2xlYW4gZmlyZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUxhc3RWaWV3ICE9IG51bGwgJiYgbUdvdFVwOworICAgICAgICB9CisgICAgfQorCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3M8Pz4gQVNZTkNfSU5GTEFURV9WSUVXU1tdID0gewogICAgICAgICBhbmRyb2lkLmFwcC5GcmFnbWVudEJyZWFkQ3J1bWJzLmNsYXNzLAogLy8gRElTQUJMRUQgYmVjYXVzZSBpdCBkb2Vzbid0IGhhdmUgYSBBcHBXaWRnZXRIb3N0VmlldyhDb250ZXh0LCBBdHRyaWJ1dGVTZXQpCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1ZpZXdUZXN0Q3RzQWN0aXZpdHkuamF2YSBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvVmlld1Rlc3RDdHNBY3Rpdml0eS5qYXZhCmluZGV4IDk3NjZmYTIuLjkxMTc5MjUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvVmlld1Rlc3RDdHNBY3Rpdml0eS5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvVmlld1Rlc3RDdHNBY3Rpdml0eS5qYXZhCkBAIC0xOCw1MiArMTgsMTMgQEAKIAogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuY3RzLlI7CiAKIHB1YmxpYyBjbGFzcyBWaWV3VGVzdEN0c0FjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgewotICAgIHByaXZhdGUgYm9vbGVhbiBtSGFzV2luZG93Rm9jdXMgPSBmYWxzZTsKLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtSGFzV2luZG93Rm9jdXNMb2NrID0gbmV3IE9iamVjdCgpOwogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgewogICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOwogICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC52aWV3X2xheW91dCk7CiAgICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25XaW5kb3dGb2N1c0NoYW5nZWQoYm9vbGVhbiBoYXNGb2N1cykgewotICAgICAgICBzdXBlci5vbldpbmRvd0ZvY3VzQ2hhbmdlZChoYXNGb2N1cyk7Ci0gICAgICAgIGlmICghaGFzRm9jdXMpIHsKLSAgICAgICAgICAgIExvZy53KCJWaWV3VGVzdEN0c0FjdGl2aXR5IiwgIlZpZXdUZXN0Q3RzQWN0aXZpdHkgbG9zdCB3aW5kb3cgZm9jdXMiKTsKLSAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQobUhhc1dpbmRvd0ZvY3VzTG9jaykgewotICAgICAgICAgICAgbUhhc1dpbmRvd0ZvY3VzID0gaGFzRm9jdXM7Ci0gICAgICAgICAgICBtSGFzV2luZG93Rm9jdXNMb2NrLm5vdGlmeSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQmxvY2tzIHRoZSBjYWxsaW5nIHRocmVhZCB1bnRpbCB0aGUge0BsaW5rIFZpZXdUZXN0Q3RzQWN0aXZpdHl9IGhhcyB3aW5kb3cgZm9jdXMgb3IgdGhlCi0gICAgICogc3BlY2lmaWVkIGR1cmF0aW9uIChpbiBtaWxsaXNlY29uZHMpIGhhcyBwYXNzZWQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gd2FpdEZvcldpbmRvd0ZvY3VzKGxvbmcgZHVyYXRpb25NaWxsaXMpIHsKLSAgICAgICAgbG9uZyBlbGFwc2VkTWlsbGlzID0gU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCk7Ci0gICAgICAgIHN5bmNocm9uaXplZChtSGFzV2luZG93Rm9jdXNMb2NrKSB7Ci0gICAgICAgICAgICBtSGFzV2luZG93Rm9jdXMgPSBoYXNXaW5kb3dGb2N1cygpOwotICAgICAgICAgICAgd2hpbGUgKCFtSGFzV2luZG93Rm9jdXMgJiYgZHVyYXRpb25NaWxsaXMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgbG9uZyBuZXdFbGFwc2VkTWlsbGlzID0gU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCk7Ci0gICAgICAgICAgICAgICAgZHVyYXRpb25NaWxsaXMgLT0gKG5ld0VsYXBzZWRNaWxsaXMgLSBlbGFwc2VkTWlsbGlzKTsKLSAgICAgICAgICAgICAgICBlbGFwc2VkTWlsbGlzID0gbmV3RWxhcHNlZE1pbGxpczsKLSAgICAgICAgICAgICAgICBpZiAoZHVyYXRpb25NaWxsaXMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSGFzV2luZG93Rm9jdXNMb2NrLndhaXQoZHVyYXRpb25NaWxsaXMpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbUhhc1dpbmRvd0ZvY3VzOwotICAgICAgICB9Ci0gICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9WaWV3VHJlZU9ic2VydmVyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9WaWV3VHJlZU9ic2VydmVyVGVzdC5qYXZhCmluZGV4IDRhYTczNzcuLjU3NGQxMjUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvVmlld1RyZWVPYnNlcnZlclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1ZpZXdUcmVlT2JzZXJ2ZXJUZXN0LmphdmEKQEAgLTI5LDE3ICsyOSwxOCBAQAogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwogaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTGFyZ2VUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdUcmVlT2JzZXJ2ZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5TY3JvbGxWaWV3OwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTGFyZ2VUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkN0c1RvdWNoVXRpbHM7CiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5Qb2xsaW5nQ2hlY2s7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvVmlld19BbmltYXRpb25UZXN0LmphdmEgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1ZpZXdfQW5pbWF0aW9uVGVzdC5qYXZhCmluZGV4IDgxMjUwYWMuLmE3MGQwMWQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvVmlld19BbmltYXRpb25UZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9WaWV3X0FuaW1hdGlvblRlc3QuamF2YQpAQCAtMjUsMTQgKzI1LDE1IEBACiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CiBpbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5MYXJnZVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uVHJhbnNsYXRlQW5pbWF0aW9uOwogaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uY3RzLkFuaW1hdGlvblRlc3RVdGlsczsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLkxhcmdlVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5Qb2xsaW5nQ2hlY2s7CiAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9WaWV3X0Jhc2VTYXZlZFN0YXRlVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9WaWV3X0Jhc2VTYXZlZFN0YXRlVGVzdC5qYXZhCmluZGV4IDc0YzI0MGIuLjJlMGQxOWQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvVmlld19CYXNlU2F2ZWRTdGF0ZVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1ZpZXdfQmFzZVNhdmVkU3RhdGVUZXN0LmphdmEKQEAgLTI2LDExICsyNiwxMiBAQAogCiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudmlldy5BYnNTYXZlZFN0YXRlOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3LkJhc2VTYXZlZFN0YXRlOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1ZpZXdfRGVmYXVsdEZvY3VzSGlnaGxpZ2h0VGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9WaWV3X0RlZmF1bHRGb2N1c0hpZ2hsaWdodFRlc3QuamF2YQppbmRleCA3ODNkOWNhLi42YjQ2Y2MyIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1ZpZXdfRGVmYXVsdEZvY3VzSGlnaGxpZ2h0VGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvVmlld19EZWZhdWx0Rm9jdXNIaWdobGlnaHRUZXN0LmphdmEKQEAgLTIxLDE1ICsyMSwxMCBAQAogCiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db2xvclN0YXRlTGlzdDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQ29sb3JEcmF3YWJsZTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuUmlwcGxlRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuRWRpdFRleHQ7CkBAIC0zNyw2ICszMiwxMSBAQAogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKQEAgLTUzLDcgKzUzLDggQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXR0ZXJzQW5kR2V0dGVycygpIHsKICAgICAgICAgQWN0aXZpdHkgYWN0aXZpdHkgPSBtQWN0aXZpdHlSdWxlLmdldEFjdGl2aXR5KCk7Ci0gICAgICAgIGlmICghaXNEZWZhdWx0Rm9jdXNIaWdobGlnaHRFbmFibGVkKGFjdGl2aXR5KSkgeworICAgICAgICBpZiAoIVZpZXcuaXNEZWZhdWx0Rm9jdXNIaWdobGlnaHRFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIC8vIFNraXAgdGhlIHRlc3Qgd2hlbiBjb25maWdfdXNlRGVmYXVsdEZvY3VzSGlnaGxpZ2h0IGlzIGZhbHNlCiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtODYsNyArODcsOCBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEluZmxhdGluZygpIHsKICAgICAgICAgQWN0aXZpdHkgYWN0aXZpdHkgPSBtQWN0aXZpdHlSdWxlLmdldEFjdGl2aXR5KCk7Ci0gICAgICAgIGlmICghaXNEZWZhdWx0Rm9jdXNIaWdobGlnaHRFbmFibGVkKGFjdGl2aXR5KSkgeworICAgICAgICBpZiAoIVZpZXcuaXNEZWZhdWx0Rm9jdXNIaWdobGlnaHRFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIC8vIFNraXAgdGhlIHRlc3Qgd2hlbiBjb25maWdfdXNlRGVmYXVsdEZvY3VzSGlnaGxpZ2h0IGlzIGZhbHNlCiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtMTA4LDcgKzExMCw4IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0SXNEZWZhdWx0Rm9jdXNIaWdobGlnaHROZWVkZWQoKSB7CiAgICAgICAgIEFjdGl2aXR5IGFjdGl2aXR5ID0gbUFjdGl2aXR5UnVsZS5nZXRBY3Rpdml0eSgpOwotICAgICAgICBpZiAoIWlzRGVmYXVsdEZvY3VzSGlnaGxpZ2h0RW5hYmxlZChhY3Rpdml0eSkpIHsKKyAgICAgICAgaWYgKCFWaWV3LmlzRGVmYXVsdEZvY3VzSGlnaGxpZ2h0RW5hYmxlZCgpKSB7CisgICAgICAgICAgICAvLyBTa2lwIHRoZSB0ZXN0IHdoZW4gY29uZmlnX3VzZURlZmF1bHRGb2N1c0hpZ2hsaWdodCBpcyBmYWxzZQogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTExNiw3ICsxMTksNyBAQAogICAgICAgICBmaW5hbCBJbWFnZVZpZXcgaW1hZ2VWaWV3ID0KICAgICAgICAgICAgICAgICAoSW1hZ2VWaWV3KSBhY3Rpdml0eS5maW5kVmlld0J5SWQoUi5pZC5pbWFnZV92aWV3X3RvX3Rlc3RfaGlnaGxpZ2h0X25lZWRlZCk7CiAKLSAgICAgICAgZmluYWwgRHJhd2FibGVbXSBkcmF3YWJsZXMgPSBuZXcgRHJhd2FibGVbXXsKKyAgICAgICAgZmluYWwgRHJhd2FibGVbXSBkcmF3YWJsZXMgPSBuZXcgRHJhd2FibGVbXSB7CiAgICAgICAgICAgICAgICAgbnVsbCwgIC8vIG51bGwKICAgICAgICAgICAgICAgICBuZXcgQ29sb3JEcmF3YWJsZShDb2xvci5XSElURSksIC8vIG5vdCBzdGF0ZWZ1bAogICAgICAgICAgICAgICAgIG5ldyBSaXBwbGVEcmF3YWJsZShDb2xvclN0YXRlTGlzdC52YWx1ZU9mKENvbG9yLldISVRFKSwgbnVsbCwgbnVsbCkgLy8gc3RhdGVmdWwKQEAgLTE2Miw5ICsxNjUsNCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzRGVmYXVsdEZvY3VzSGlnaGxpZ2h0RW5hYmxlZChBY3Rpdml0eSBhY3Rpdml0eSkgewotICAgICAgICByZXR1cm4gYWN0aXZpdHkuZ2V0UmVzb3VyY2VzKCkuZ2V0Qm9vbGVhbihSZXNvdXJjZXMuZ2V0U3lzdGVtKCkuZ2V0SWRlbnRpZmllcigKLSAgICAgICAgICAgICAgICAiY29uZmlnX3VzZURlZmF1bHRGb2N1c0hpZ2hsaWdodCIsICJib29sIiwgImFuZHJvaWQiKSk7Ci0gICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9WaWV3X0ZvY3VzSGFuZGxpbmdUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1ZpZXdfRm9jdXNIYW5kbGluZ1Rlc3QuamF2YQppbmRleCAyMWZkZDg5Li41YjIzOTViIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1ZpZXdfRm9jdXNIYW5kbGluZ1Rlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1ZpZXdfRm9jdXNIYW5kbGluZ1Rlc3QuamF2YQpAQCAtMjUsMTggKzI1LDE4IEBACiAKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKIGltcG9ydCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb247Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CkBAIC01MSw2ICs1MSw4IEBACiAgICAgQFVpVGhyZWFkVGVzdAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEZvY3VzSGFuZGxpbmcoKSB7CisgICAgICAgIEluc3RydW1lbnRhdGlvbiBpbnN0cnVtZW50YXRpb24gPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKTsKKyAgICAgICAgaW5zdHJ1bWVudGF0aW9uLnNldEluVG91Y2hNb2RlKGZhbHNlKTsKICAgICAgICAgQWN0aXZpdHkgYWN0aXZpdHkgPSBtQWN0aXZpdHlSdWxlLmdldEFjdGl2aXR5KCk7CiAKICAgICAgICAgVmlldyB2MSA9IGFjdGl2aXR5LmZpbmRWaWV3QnlJZChSLmlkLnZpZXcxKTsKQEAgLTE1MSw3ICsxNTMsNyBAQAogICAgICAgICB2Mi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CiAgICAgICAgIHYzLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKICAgICAgICAgdjQuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgdjEuaXNGb2N1c2VkKCkpOworICAgICAgICBhc3NlcnRUcnVlKHYxLmlzRm9jdXNlZCgpKTsKICAgICAgICAgYXNzZXJ0RmFsc2UodjIuaXNGb2N1c2VkKCkpOwogICAgICAgICBhc3NlcnRGYWxzZSh2My5pc0ZvY3VzZWQoKSk7CiAgICAgICAgIGFzc2VydEZhbHNlKHY0LmlzRm9jdXNlZCgpKTsKQEAgLTIyMyw2ICsyMjUsMTk0IEBACiAgICAgICAgIGFzc2VydE51bGwodjIuZmluZEZvY3VzKCkpOwogICAgICAgICBhc3NlcnROdWxsKHYzLmZpbmRGb2N1cygpKTsKICAgICAgICAgYXNzZXJ0TnVsbCh2NC5maW5kRm9jdXMoKSk7CisKKyAgICAgICAgLy8gdGVzdCB2aXNpYmlsaXR5IHdpdGggYSBuZXN0ZWQgZm9jdXNhYmxlCisgICAgICAgIFZpZXdHcm91cCB2ZyA9IChWaWV3R3JvdXApIGFjdGl2aXR5LmZpbmRWaWV3QnlJZChSLmlkLmF1dG9fdGVzdF9hcmVhKTsKKyAgICAgICAgdmcuc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7CisgICAgICAgIFZpZXcgc3ViID0gbmV3IFZpZXcoYWN0aXZpdHkpOworICAgICAgICB2Zy5hZGRWaWV3KHN1YiwgMTAsIDEwKTsKKyAgICAgICAgc3ViLnNldEZvY3VzYWJsZShWaWV3LkZPQ1VTQUJMRSk7CisgICAgICAgIGZvciAoVmlldyB2IDogbmV3IFZpZXdbXXt2MSwgdjIsIHYzLCB2NH0pIHsKKyAgICAgICAgICAgIHYuc2V0Rm9jdXNhYmxlKGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnROdWxsKHZnLmdldFJvb3RWaWV3KCkuZmluZEZvY3VzKCkpOworICAgICAgICB2Zy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgIGFzc2VydFNhbWUoc3ViLCB2Zy5nZXRSb290VmlldygpLmZpbmRGb2N1cygpKTsKKyAgICB9CisKKyAgICBAVWlUaHJlYWRUZXN0CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW5hYmxlZEhhbmRsaW5nKCkgeworICAgICAgICBBY3Rpdml0eSBhY3Rpdml0eSA9IG1BY3Rpdml0eVJ1bGUuZ2V0QWN0aXZpdHkoKTsKKworICAgICAgICBWaWV3IHYxID0gYWN0aXZpdHkuZmluZFZpZXdCeUlkKFIuaWQudmlldzEpOworICAgICAgICBWaWV3IHYyID0gYWN0aXZpdHkuZmluZFZpZXdCeUlkKFIuaWQudmlldzIpOworICAgICAgICBWaWV3IHYzID0gYWN0aXZpdHkuZmluZFZpZXdCeUlkKFIuaWQudmlldzMpOworICAgICAgICBWaWV3IHY0ID0gYWN0aXZpdHkuZmluZFZpZXdCeUlkKFIuaWQudmlldzQpOworCisgICAgICAgIGZvciAoVmlldyB2IDogbmV3IFZpZXdbXXt2MSwgdjIsIHYzLCB2NH0pIHYuc2V0Rm9jdXNhYmxlKHRydWUpOworCisgICAgICAgIGFzc2VydFRydWUodjEucmVxdWVzdEZvY3VzKCkpOworCisgICAgICAgIC8vIGRpc2FibGVkIHZpZXcgc2hvdWxkIG5vdCBiZSBmb2N1c2FibGUKKyAgICAgICAgYXNzZXJ0VHJ1ZSh2MS5oYXNGb2N1cygpKTsKKyAgICAgICAgdjEuc2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgIGFzc2VydEZhbHNlKHYxLmhhc0ZvY3VzKCkpOworICAgICAgICB2MS5yZXF1ZXN0Rm9jdXMoKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UodjEuaGFzRm9jdXMoKSk7CisgICAgICAgIHYxLnNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgIHYxLnJlcXVlc3RGb2N1cygpOworICAgICAgICBhc3NlcnRUcnVlKHYxLmhhc0ZvY3VzKCkpOworCisgICAgICAgIC8vIGFuIGVuYWJsZWQgdmlldyBzaG91bGQgbm90IHRha2UgZm9jdXMgaWYgbm90IHZpc2libGUgT1Igbm90IGVuYWJsZWQKKyAgICAgICAgdjEuc2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgIHYxLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOworICAgICAgICBhc3NlcnRGYWxzZSh2MS5oYXNGb2N1cygpKTsKKyAgICAgICAgdjEuc2V0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgdjEucmVxdWVzdEZvY3VzKCk7CisgICAgICAgIGFzc2VydEZhbHNlKHYxLmhhc0ZvY3VzKCkpOworICAgICAgICB2MS5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgdjEuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICB2MS5yZXF1ZXN0Rm9jdXMoKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UodjEuaGFzRm9jdXMoKSk7CisgICAgICAgIHYxLnNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgIHYxLnJlcXVlc3RGb2N1cygpOworICAgICAgICBhc3NlcnRUcnVlKHYxLmhhc0ZvY3VzKCkpOworCisgICAgICAgIC8vIHRlc3QgaGFzRm9jdXNhYmxlCisgICAgICAgIFZpZXdHcm91cCBwYXJlbnQgPSAoVmlld0dyb3VwKSB2MS5nZXRQYXJlbnQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShwYXJlbnQuaGFzRm9jdXNhYmxlKCkpOworICAgICAgICBmb3IgKFZpZXcgdiA6IG5ldyBWaWV3W117djEsIHYyLCB2MywgdjR9KSB2LnNldEVuYWJsZWQoZmFsc2UpOworICAgICAgICBhc3NlcnRGYWxzZSh2MS5pc0ZvY3VzZWQoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHYyLmlzRm9jdXNlZCgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UodjMuaXNGb2N1c2VkKCkpOworICAgICAgICBhc3NlcnRGYWxzZSh2NC5pc0ZvY3VzZWQoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHBhcmVudC5oYXNGb2N1c2FibGUoKSk7CisKKyAgICAgICAgLy8gYSB2aWV3IGVuYWJsZWQgd2hpbGUgbm90aGluZyBoYXMgZm9jdXMgc2hvdWxkIGdldCBmb2N1cyBpZiBub3QgaW4gdG91Y2ggbW9kZS4KKyAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkuc2V0SW5Ub3VjaE1vZGUoZmFsc2UpOworICAgICAgICBmb3IgKFZpZXcgdiA6IG5ldyBWaWV3W117djEsIHYyLCB2MywgdjR9KSB2LnNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCB2MS5pc0ZvY3VzZWQoKSk7CisKKyAgICAgICAgLy8gZW5hYmxlZCBzdGF0ZSBpcyByZXN0cmljdGVkIHRvIHRoZSB2aWV3IG9ubHkgKG5vdCBjaGlsZHJlbikKKyAgICAgICAgdjIucmVxdWVzdEZvY3VzKCk7CisgICAgICAgIHBhcmVudC5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh2Mi5pc0ZvY3VzZWQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2l6ZUhhbmRsaW5nKCkgeworICAgICAgICBBY3Rpdml0eSBhY3Rpdml0eSA9IG1BY3Rpdml0eVJ1bGUuZ2V0QWN0aXZpdHkoKTsKKyAgICAgICAgSW5zdHJ1bWVudGF0aW9uIGluc3RydW1lbnRhdGlvbiA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpOworCisgICAgICAgIFZpZXcgdjUgPSBuZXcgQnV0dG9uKGFjdGl2aXR5KTsKKyAgICAgICAgVmlld0dyb3VwIGxheW91dCA9IGFjdGl2aXR5LmZpbmRWaWV3QnlJZChSLmlkLmF1dG9fdGVzdF9hcmVhKTsKKworICAgICAgICAvLyBUZXN0IHJlcXVlc3RGb2N1cyBiZWZvcmUgZmlyc3QgbGF5b3V0IGZvY3VzZXMgaWYgbm9uLTAgc2l6ZQorICAgICAgICBhY3Rpdml0eS5ydW5PblVpVGhyZWFkKCgpIC0+IHsKKyAgICAgICAgICAgIGxheW91dC5hZGRWaWV3KHY1LCAzMCwgMzApOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpc1plcm9TaXplKHY1KSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHY1LnJlcXVlc3RGb2N1cygpKTsKKyAgICAgICAgfSk7CisgICAgICAgIGluc3RydW1lbnRhdGlvbi53YWl0Rm9ySWRsZVN5bmMoKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoaXNaZXJvU2l6ZSh2NSkpOworICAgICAgICBhc3NlcnRUcnVlKHY1LmlzRm9jdXNlZCgpKTsKKworICAgICAgICAvLyBUZXN0IHJlc2l6ZSB0byAwIGRlZm9jdXNlcworICAgICAgICBhY3Rpdml0eS5ydW5PblVpVGhyZWFkKCgpIC0+IHsKKyAgICAgICAgICAgIHY1LnNldFJpZ2h0KHY1LmdldExlZnQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdjUuZ2V0V2lkdGgoKSk7CisgICAgICAgIH0pOworICAgICAgICBpbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7CisgICAgICAgIGFzc2VydFRydWUoaXNaZXJvU2l6ZSh2NSkpOworICAgICAgICBhc3NlcnRGYWxzZSh2NS5pc0ZvY3VzZWQoKSk7CisKKyAgICAgICAgLy8gVGVzdCByZXF1ZXN0Rm9jdXMgb24gbGFpZC1vdXQgMC1zaXplIGZhaWxzCisgICAgICAgIGFjdGl2aXR5LnJ1bk9uVWlUaHJlYWQoKCkgLT4gYXNzZXJ0RmFsc2UodjUucmVxdWVzdEZvY3VzKCkpKTsKKworICAgICAgICBhY3Rpdml0eS5ydW5PblVpVGhyZWFkKCgpIC0+IGxheW91dC5yZW1vdmVBbGxWaWV3cygpKTsKKworICAgICAgICAvLyBUZXN0IHJlcXVlc3RGb2N1cyBiZWZvcmUgZmlyc3QgbGF5b3V0IGZvY3VzZXMgYSBjaGlsZCBpZiBub24tMCBzaXplCisgICAgICAgIExpbmVhckxheW91dCBsbDAgPSBuZXcgTGluZWFyTGF5b3V0KGFjdGl2aXR5KTsKKyAgICAgICAgbGwwLnNldEZvY3VzYWJsZSh0cnVlKTsKKyAgICAgICAgbGwwLnNldERlc2NlbmRhbnRGb2N1c2FiaWxpdHkoVmlld0dyb3VwLkZPQ1VTX0FGVEVSX0RFU0NFTkRBTlRTKTsKKyAgICAgICAgVmlldyBidXRJblNjcm9sbCA9IG5ldyBCdXR0b24oYWN0aXZpdHkpOworICAgICAgICBhY3Rpdml0eS5ydW5PblVpVGhyZWFkKCgpIC0+IHsKKyAgICAgICAgICAgIGxsMC5hZGRWaWV3KGJ1dEluU2Nyb2xsLCA0MCwgNDApOworICAgICAgICAgICAgbGF5b3V0LmFkZFZpZXcobGwwLCAxMDAsIDEwMCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGlzWmVyb1NpemUoYnV0SW5TY3JvbGwpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobGwwLnJlcXVlc3RGb2N1cygpKTsKKyAgICAgICAgfSk7CisgICAgICAgIGluc3RydW1lbnRhdGlvbi53YWl0Rm9ySWRsZVN5bmMoKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoaXNaZXJvU2l6ZShidXRJblNjcm9sbCkpOworICAgICAgICBhc3NlcnRUcnVlKGJ1dEluU2Nyb2xsLmlzRm9jdXNlZCgpKTsKKworICAgICAgICAvLyBUZXN0IGZvY3VzYWJsZVZpZXdBdmFpbGFibGUgb24gcmVzaXplIHRvIG5vbi0wIHNpemUKKyAgICAgICAgYWN0aXZpdHkucnVuT25VaVRocmVhZCgoKSAtPiB7CisgICAgICAgICAgICBidXRJblNjcm9sbC5zZXRSaWdodCh2NS5nZXRMZWZ0KCkpOworICAgICAgICB9KTsKKyAgICAgICAgaW5zdHJ1bWVudGF0aW9uLndhaXRGb3JJZGxlU3luYygpOworICAgICAgICBhc3NlcnRUcnVlKGlzWmVyb1NpemUoYnV0SW5TY3JvbGwpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShsbDAuaXNGb2N1c2VkKCkpOworCisgICAgICAgIGFjdGl2aXR5LnJ1bk9uVWlUaHJlYWQoKCkgLT4gbGF5b3V0LnJlbW92ZUFsbFZpZXdzKCkpOworICAgICAgICBpbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7CisKKyAgICAgICAgLy8gVGVzdCByZXF1ZXN0Rm9jdXMgYmVmb3JlIGZpcnN0IGxheW91dCBkZWZvY3VzZXMgaWYgc3RpbGwgMCBzaXplCisgICAgICAgIExpbmVhckxheW91dCBsbCA9IG5ldyBMaW5lYXJMYXlvdXQoYWN0aXZpdHkpOworICAgICAgICBWaWV3IHplcm9TaXplQnV0ID0gbmV3IEJ1dHRvbihhY3Rpdml0eSk7CisgICAgICAgIGFjdGl2aXR5LnJ1bk9uVWlUaHJlYWQoKCkgLT4geworICAgICAgICAgICAgbGwuYWRkVmlldyh6ZXJvU2l6ZUJ1dCwgMzAsIDApOworICAgICAgICAgICAgbGF5b3V0LmFkZFZpZXcobGwsIDEwMCwgMTAwKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoemVyb1NpemVCdXQucmVxdWVzdEZvY3VzKCkpOworICAgICAgICB9KTsKKyAgICAgICAgaW5zdHJ1bWVudGF0aW9uLndhaXRGb3JJZGxlU3luYygpOworICAgICAgICBhc3NlcnRUcnVlKGlzWmVyb1NpemUoemVyb1NpemVCdXQpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoemVyb1NpemVCdXQuaXNGb2N1c2VkKCkpOworCisgICAgICAgIGFjdGl2aXR5LnJ1bk9uVWlUaHJlYWQoKCkgLT4gbGF5b3V0LnJlbW92ZUFsbFZpZXdzKCkpOworICAgICAgICBpbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7CisKKyAgICAgICAgLy8gVGVzdCByZXF1ZXN0Rm9jdXMgYmVmb3JlIGZpcnN0IGxheW91dCBmb2N1c2VzIHBhcmVudCBpZiBjaGlsZCBpcyBzdGlsbCAwIHNpemUKKyAgICAgICAgTGluZWFyTGF5b3V0IGxsMiA9IG5ldyBMaW5lYXJMYXlvdXQoYWN0aXZpdHkpOworICAgICAgICBsbDIuc2V0Rm9jdXNhYmxlKHRydWUpOworICAgICAgICBsbDIuc2V0RGVzY2VuZGFudEZvY3VzYWJpbGl0eShWaWV3R3JvdXAuRk9DVVNfQUZURVJfREVTQ0VOREFOVFMpOworICAgICAgICBWaWV3IHplcm9CdXRJbkFmdGVyID0gbmV3IEJ1dHRvbihhY3Rpdml0eSk7CisgICAgICAgIGFjdGl2aXR5LnJ1bk9uVWlUaHJlYWQoKCkgLT4geworICAgICAgICAgICAgbGwyLmFkZFZpZXcoemVyb0J1dEluQWZ0ZXIsIDQwLCAwKTsKKyAgICAgICAgICAgIGxheW91dC5hZGRWaWV3KGxsMiwgMTAwLCAxMDApOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShsbDIucmVxdWVzdEZvY3VzKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh6ZXJvQnV0SW5BZnRlci5pc0ZvY3VzZWQoKSk7CisgICAgICAgIH0pOworICAgICAgICBpbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7CisgICAgICAgIGFzc2VydFRydWUoaXNaZXJvU2l6ZSh6ZXJvQnV0SW5BZnRlcikpOworICAgICAgICBhc3NlcnRGYWxzZSh6ZXJvQnV0SW5BZnRlci5pc0ZvY3VzZWQoKSk7CisgICAgICAgIGFzc2VydFRydWUobGwyLmlzRm9jdXNlZCgpKTsKKworICAgICAgICBhY3Rpdml0eS5ydW5PblVpVGhyZWFkKCgpIC0+IGxheW91dC5yZW1vdmVBbGxWaWV3cygpKTsKKyAgICAgICAgaW5zdHJ1bWVudGF0aW9uLndhaXRGb3JJZGxlU3luYygpOworCisgICAgICAgIC8vIFRlc3QgdGhhdCB3ZSBkb24ndCBmb2N1cyBhbnl0aGluZyBhYm92ZS9vdXRzaWRlIG9mIHdoZXJlIHdlIHJlcXVlc3RlZCBmb2N1cworICAgICAgICBMaW5lYXJMYXlvdXQgbGwzID0gbmV3IExpbmVhckxheW91dChhY3Rpdml0eSk7CisgICAgICAgIEJ1dHRvbiBvdXRzaWRlID0gbmV3IEJ1dHRvbihhY3Rpdml0eSk7CisgICAgICAgIExpbmVhckxheW91dCBzdWIgPSBuZXcgTGluZWFyTGF5b3V0KGFjdGl2aXR5KTsKKyAgICAgICAgQnV0dG9uIGluc2lkZSA9IG5ldyBCdXR0b24oYWN0aXZpdHkpOworICAgICAgICBhY3Rpdml0eS5ydW5PblVpVGhyZWFkKCgpIC0+IHsKKyAgICAgICAgICAgIGxsMy5hZGRWaWV3KG91dHNpZGUsIDQwLCA0MCk7CisgICAgICAgICAgICBzdWIuYWRkVmlldyhpbnNpZGUsIDMwLCAwKTsKKyAgICAgICAgICAgIGxsMy5hZGRWaWV3KHN1YiwgNDAsIDQwKTsKKyAgICAgICAgICAgIGxheW91dC5hZGRWaWV3KGxsMywgMTAwLCAxMDApOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzdWIucmVxdWVzdEZvY3VzKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpbnNpZGUuaXNGb2N1c2VkKCkpOworICAgICAgICB9KTsKKyAgICAgICAgaW5zdHJ1bWVudGF0aW9uLndhaXRGb3JJZGxlU3luYygpOworICAgICAgICBhc3NlcnRUcnVlKGlzWmVyb1NpemUoaW5zaWRlKSk7CisgICAgICAgIGFzc2VydFRydWUob3V0c2lkZS5pc0ZvY3VzYWJsZSgpICYmICFpc1plcm9TaXplKG91dHNpZGUpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChsYXlvdXQuZ2V0Um9vdFZpZXcoKS5maW5kRm9jdXMoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzWmVyb1NpemUoVmlldyB2aWV3KSB7CisgICAgICAgIHJldHVybiB2aWV3LmdldFdpZHRoKCkgPD0gMCB8fCB2aWV3LmdldEhlaWdodCgpIDw9IDA7CiAgICAgfQogCiAgICAgQFVpVGhyZWFkVGVzdApAQCAtMzI4LDIwICs1MTgsNiBAQAogICAgICAgICBhc3NlcnRUcnVlKCJzaW5nbGUgdmlldyBkb2Vzbid0IGhhc0V4cGxpY2l0Rm9jdXNhYmxlIiwgdmlldy5oYXNFeHBsaWNpdEZvY3VzYWJsZSgpKTsKICAgICB9CiAKLSAgICBwcml2YXRlIFZpZXdbXSBnZXRJbml0aWFsQW5kRmlyc3RGb2N1cyhpbnQgcmVzKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgSW5zdHJ1bWVudGF0aW9uIGluc3RydW1lbnRhdGlvbiA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpOwotICAgICAgICBpbnN0cnVtZW50YXRpb24uc2V0SW5Ub3VjaE1vZGUoZmFsc2UpOwotICAgICAgICBmaW5hbCBBY3Rpdml0eSBhY3Rpdml0eSA9IG1BY3Rpdml0eVJ1bGUuZ2V0QWN0aXZpdHkoKTsKLSAgICAgICAgbUFjdGl2aXR5UnVsZS5ydW5PblVpVGhyZWFkKCgpIC0+IGFjdGl2aXR5LmdldExheW91dEluZmxhdGVyKCkuaW5mbGF0ZShyZXMsCi0gICAgICAgICAgICAgICAgKFZpZXdHcm91cCkgYWN0aXZpdHkuZmluZFZpZXdCeUlkKFIuaWQuYXV0b190ZXN0X2FyZWEpKSk7Ci0gICAgICAgIGluc3RydW1lbnRhdGlvbi53YWl0Rm9ySWRsZVN5bmMoKTsKLSAgICAgICAgVmlldyByb290ID0gYWN0aXZpdHkuZmluZFZpZXdCeUlkKFIuaWQubWFpbl92aWV3KTsKLSAgICAgICAgVmlldyBpbml0aWFsID0gcm9vdC5maW5kRm9jdXMoKTsKLSAgICAgICAgaW5zdHJ1bWVudGF0aW9uLnNlbmRLZXlEb3duVXBTeW5jKEtleUV2ZW50LktFWUNPREVfVEFCKTsKLSAgICAgICAgVmlldyBmaXJzdCA9IHJvb3QuZmluZEZvY3VzKCk7Ci0gICAgICAgIHJldHVybiBuZXcgVmlld1tde2luaXRpYWwsIGZpcnN0fTsKLSAgICB9Ci0KICAgICBAVWlUaHJlYWRUZXN0CiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9jdXNBZnRlckRlc2NlbmRhbnRzVHJhbnNmZXIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvVmlld19JZHNUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1ZpZXdfSWRzVGVzdC5qYXZhCmluZGV4IDIwMDk2NmIuLjk0NjE1ZDEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvVmlld19JZHNUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9WaWV3X0lkc1Rlc3QuamF2YQpAQCAtMjEsMTQgKzIxLDE1IEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKIAogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkVkaXRUZXh0OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9WaWV3X0luaXRpYWxGb2N1c1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvVmlld19Jbml0aWFsRm9jdXNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEwNTQ5NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvVmlld19Jbml0aWFsRm9jdXNUZXN0LmphdmEKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC52aWV3LmN0czsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgb3JnLmp1bml0LkFzc3VtZTsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKKworQE1lZGl1bVRlc3QKK0BSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgVmlld19Jbml0aWFsRm9jdXNUZXN0IHsKKyAgICBAUnVsZQorICAgIHB1YmxpYyBBY3Rpdml0eVRlc3RSdWxlPEZvY3VzSGFuZGxpbmdDdHNBY3Rpdml0eT4gbUFjdGl2aXR5UnVsZSA9CisgICAgICAgICAgICBuZXcgQWN0aXZpdHlUZXN0UnVsZTw+KEZvY3VzSGFuZGxpbmdDdHNBY3Rpdml0eS5jbGFzcywgdHJ1ZSk7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0dXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQWN0aXZpdHkgYWN0aXZpdHkgPSBtQWN0aXZpdHlSdWxlLmdldEFjdGl2aXR5KCk7CisgICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKAorICAgICAgICAgICAgICAgIGFjdGl2aXR5LmdldFBhY2thZ2VNYW5hZ2VyKCkuaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX1RPVUNIU0NSRUVOKSk7CisgICAgICAgIEluc3RydW1lbnRhdGlvbiBpbnN0cnVtZW50YXRpb24gPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKTsKKyAgICAgICAgaW5zdHJ1bWVudGF0aW9uLnNldEluVG91Y2hNb2RlKHRydWUpOworICAgIH0KKworICAgIHByaXZhdGUgVmlld1tdIGdldEluaXRpYWxBbmRGaXJzdEZvY3VzKGludCByZXMpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBJbnN0cnVtZW50YXRpb24gaW5zdHJ1bWVudGF0aW9uID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCk7CisgICAgICAgIGZpbmFsIEFjdGl2aXR5IGFjdGl2aXR5ID0gbUFjdGl2aXR5UnVsZS5nZXRBY3Rpdml0eSgpOworICAgICAgICBtQWN0aXZpdHlSdWxlLnJ1bk9uVWlUaHJlYWQoKCkgLT4gYWN0aXZpdHkuZ2V0TGF5b3V0SW5mbGF0ZXIoKS5pbmZsYXRlKHJlcywKKyAgICAgICAgICAgICAgICAoVmlld0dyb3VwKSBhY3Rpdml0eS5maW5kVmlld0J5SWQoUi5pZC5hdXRvX3Rlc3RfYXJlYSkpKTsKKyAgICAgICAgaW5zdHJ1bWVudGF0aW9uLndhaXRGb3JJZGxlU3luYygpOworICAgICAgICBWaWV3IHJvb3QgPSBhY3Rpdml0eS5maW5kVmlld0J5SWQoUi5pZC5tYWluX3ZpZXcpOworICAgICAgICBWaWV3IGluaXRpYWwgPSByb290LmZpbmRGb2N1cygpOworICAgICAgICBpbnN0cnVtZW50YXRpb24uc2VuZEtleURvd25VcFN5bmMoS2V5RXZlbnQuS0VZQ09ERV9UQUIpOyAvLyBsZWF2ZXMgdG91Y2gtbW9kZQorICAgICAgICBWaWV3IGZpcnN0ID0gcm9vdC5maW5kRm9jdXMoKTsKKyAgICAgICAgcmV0dXJuIG5ldyBWaWV3W117aW5pdGlhbCwgZmlyc3R9OworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vSW5pdGlhbEZvY3VzKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIEFjdGl2aXR5IGFjdGl2aXR5ID0gbUFjdGl2aXR5UnVsZS5nZXRBY3Rpdml0eSgpOworICAgICAgICBWaWV3W10gcmVzdWx0ID0gZ2V0SW5pdGlhbEFuZEZpcnN0Rm9jdXMoUi5sYXlvdXQuZm9jdXNfaGFuZGxpbmdfZm9jdXNhYmxlcyk7CisgICAgICAgIGFzc2VydE51bGwocmVzdWx0WzBdKTsKKyAgICAgICAgYXNzZXJ0U2FtZShyZXN1bHRbMV0sIGFjdGl2aXR5LmZpbmRWaWV3QnlJZChSLmlkLmZvY3VzYWJsZTEpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0Rm9jdXMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgQWN0aXZpdHkgYWN0aXZpdHkgPSBtQWN0aXZpdHlSdWxlLmdldEFjdGl2aXR5KCk7CisgICAgICAgIFZpZXdbXSByZXN1bHQgPSBnZXRJbml0aWFsQW5kRmlyc3RGb2N1cyhSLmxheW91dC5mb2N1c19oYW5kbGluZ19kZWZhdWx0X2ZvY3VzKTsKKyAgICAgICAgYXNzZXJ0TnVsbChyZXN1bHRbMF0pOworICAgICAgICBhc3NlcnRTYW1lKHJlc3VsdFsxXSwgYWN0aXZpdHkuZmluZFZpZXdCeUlkKFIuaWQuZm9jdXNhYmxlMikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEluaXRpYWxGb2N1cygpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBBY3Rpdml0eSBhY3Rpdml0eSA9IG1BY3Rpdml0eVJ1bGUuZ2V0QWN0aXZpdHkoKTsKKyAgICAgICAgVmlld1tdIHJlc3VsdCA9IGdldEluaXRpYWxBbmRGaXJzdEZvY3VzKFIubGF5b3V0LmZvY3VzX2hhbmRsaW5nX2luaXRpYWxfZm9jdXMpOworICAgICAgICBhc3NlcnRTYW1lKHJlc3VsdFswXSwgYWN0aXZpdHkuZmluZFZpZXdCeUlkKFIuaWQuZm9jdXNhYmxlMykpOworICAgIH0KKworICAgIEBVaVRocmVhZFRlc3QKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbGVhckZvY3VzKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIEFjdGl2aXR5IGFjdGl2aXR5ID0gbUFjdGl2aXR5UnVsZS5nZXRBY3Rpdml0eSgpOworICAgICAgICBWaWV3IHYxID0gYWN0aXZpdHkuZmluZFZpZXdCeUlkKFIuaWQudmlldzEpOworICAgICAgICB2MS5zZXRGb2N1c2FibGVJblRvdWNoTW9kZSh0cnVlKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UodjEuaXNGb2N1c2VkKCkpOworICAgICAgICB2MS5yZXF1ZXN0Rm9jdXMoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh2MS5pc0ZvY3VzZWQoKSk7CisgICAgICAgIHYxLmNsZWFyRm9jdXMoKTsKKyAgICAgICAgYXNzZXJ0TnVsbChhY3Rpdml0eS5nZXRXaW5kb3coKS5nZXREZWNvclZpZXcoKS5maW5kRm9jdXMoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9WaWV3X0xheW91dFBvc2l0aW9uVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9WaWV3X0xheW91dFBvc2l0aW9uVGVzdC5qYXZhCmluZGV4IDgzMzUwNGUuLmEzMmNlNTkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvVmlld19MYXlvdXRQb3NpdGlvblRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1ZpZXdfTGF5b3V0UG9zaXRpb25UZXN0LmphdmEKQEAgLTIwLDEyICsyMCwxMyBAQAogCiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9WaWV3X01lYXN1cmVTcGVjVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9WaWV3X01lYXN1cmVTcGVjVGVzdC5qYXZhCmluZGV4IGNmOTdlMzcuLjA4YjVhYTggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvVmlld19NZWFzdXJlU3BlY1Rlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1ZpZXdfTWVhc3VyZVNwZWNUZXN0LmphdmEKQEAgLTE4LDExICsxOCwxMiBAQAogCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogCi1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuTWVhc3VyZVNwZWM7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvVmlld19Vc2luZ1ZpZXdzVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9WaWV3X1VzaW5nVmlld3NUZXN0LmphdmEKaW5kZXggZGQ3MzFjYy4uODM4NzJlYyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9WaWV3X1VzaW5nVmlld3NUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9WaWV3X1VzaW5nVmlld3NUZXN0LmphdmEKQEAgLTM3LDExICszNyw2IEBACiBpbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PbkNsaWNrTGlzdGVuZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOwpAQCAtNDksNiArNDQsMTIgQEAKIGltcG9ydCBhbmRyb2lkLndpZGdldC5SZWxhdGl2ZUxheW91dDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DdHNUb3VjaFV0aWxzOwogCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvV2luZG93TWFuYWdlcl9CYWRUb2tlbkV4Y2VwdGlvblRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvV2luZG93TWFuYWdlcl9CYWRUb2tlbkV4Y2VwdGlvblRlc3QuamF2YQppbmRleCAxZTMxYjExLi4zNDBiN2U0IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1dpbmRvd01hbmFnZXJfQmFkVG9rZW5FeGNlcHRpb25UZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9XaW5kb3dNYW5hZ2VyX0JhZFRva2VuRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0xOCwxMCArMTgsMTEgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKIAotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkJhZFRva2VuRXhjZXB0aW9uOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1dpbmRvd01hbmFnZXJfTGF5b3V0UGFyYW1zVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9XaW5kb3dNYW5hZ2VyX0xheW91dFBhcmFtc1Rlc3QuamF2YQppbmRleCBiODI5NDcwLi4yMmY0Mzg2IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1dpbmRvd01hbmFnZXJfTGF5b3V0UGFyYW1zVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvV2luZG93TWFuYWdlcl9MYXlvdXRQYXJhbXNUZXN0LmphdmEKQEAgLTI2LDEyICsyNiwxMyBAQAogaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5lZFN0cmluZzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9XaW5kb3dUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1dpbmRvd1Rlc3QuamF2YQppbmRleCAwNTU4NWYyLi44NGI1Y2FhIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1dpbmRvd1Rlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL1dpbmRvd1Rlc3QuamF2YQpAQCAtNDcsMTEgKzQ3LDYgQEAKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0VGhlbWVXcmFwcGVyOwpAQCAtNzIsNiArNjcsMTIgQEAKIGltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuUG9sbGluZ0NoZWNrOwogCiBpbXBvcnQgb3JnLmp1bml0LkFmdGVyOwpAQCAtMTc1LDExICsxNzYsMjggQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEZpbmRWaWV3QnlJZCgpIHsKLSAgICAgICAgVGV4dFZpZXcgdiA9IChUZXh0VmlldykgbVdpbmRvdy5maW5kVmlld0J5SWQoUi5pZC5saXN0dmlld193aW5kb3cpOworICAgICAgICBUZXh0VmlldyB2ID0gbVdpbmRvdy5maW5kVmlld0J5SWQoUi5pZC5saXN0dmlld193aW5kb3cpOwogICAgICAgICBhc3NlcnROb3ROdWxsKHYpOwogICAgICAgICBhc3NlcnRFcXVhbHMoUi5pZC5saXN0dmlld193aW5kb3csIHYuZ2V0SWQoKSk7CiAgICAgfQogCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWlyZVZpZXdCeUlkKCkgeworICAgICAgICBUZXh0VmlldyB2ID0gbVdpbmRvdy5yZXF1aXJlVmlld0J5SWQoUi5pZC5saXN0dmlld193aW5kb3cpOworICAgICAgICBhc3NlcnROb3ROdWxsKHYpOworICAgICAgICBhc3NlcnRFcXVhbHMoUi5pZC5saXN0dmlld193aW5kb3csIHYuZ2V0SWQoKSk7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdFJlcXVpcmVWaWV3QnlJZE5vSWQoKSB7CisgICAgICAgIFRleHRWaWV3IHYgPSBtV2luZG93LnJlcXVpcmVWaWV3QnlJZChWaWV3Lk5PX0lEKTsKKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWlyZVZpZXdCeUlkSW52YWxpZCgpIHsKKyAgICAgICAgVGV4dFZpZXcgdiA9IG1XaW5kb3cucmVxdWlyZVZpZXdCeUlkKFIuaWQudmlldyk7IC8vIG5vdCBwcmVzZW50IGluIGxheW91dAorICAgIH0KKwogICAgIC8qKgogICAgICAqIGdldEF0dHJpYnV0ZXM6IFJldHJpZXZlIHRoZSBjdXJyZW50IHdpbmRvdyBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBhbmVsLgogICAgICAqICAgIFJldHVybiBpcyAxLnRoZSBleGlzdGluZyB3aW5kb3cgYXR0cmlidXRlcyBvYmplY3QuCkBAIC02ODcsOCArNzA1LDYgQEAKICAgICAgICAgICAgICAgICBtUHJlc2VudGF0aW9uLmJ1dHRvbjEuZ2V0V2lkdGgoKSAvIDIsCiAgICAgICAgICAgICAgICAgbVByZXNlbnRhdGlvbi5idXR0b24xLmdldFkoKSArIG1QcmVzZW50YXRpb24uYnV0dG9uMS5nZXRIZWlnaHQoKSAvIDIpOwogICAgICAgICBhc3NlcnRUcnVlKHdhaXRpbmdTZW1hcGhvcmUudHJ5QWNxdWlyZSg1LCBUaW1lVW5pdC5TRUNPTkRTKSk7Ci0KLSAgICAgICAgZGVzdHJveVByZXNlbnRhdGlvbigpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBjaGVja1ByZXNlbnRhdGlvbkJ1dHRvbkZvY3VzKGZpbmFsIGJvb2xlYW4gYnV0dG9uMUZvY3VzZWQsCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL3N1cmZhY2V2YWxpZGF0b3IvQ2FwdHVyZWRBY3Rpdml0eS5qYXZhIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L2N0cy9zdXJmYWNldmFsaWRhdG9yL0NhcHR1cmVkQWN0aXZpdHkuamF2YQppbmRleCBjZTVhYjZlLi5mMTgzOGUyIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvY3RzL3N1cmZhY2V2YWxpZGF0b3IvQ2FwdHVyZWRBY3Rpdml0eS5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy9jdHMvc3VyZmFjZXZhbGlkYXRvci9DYXB0dXJlZEFjdGl2aXR5LmphdmEKQEAgLTMzLDcgKzMzLDYgQEAKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CiBpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QudWlhdXRvbWF0b3IuQnk7CiBpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QudWlhdXRvbWF0b3IuVWlEZXZpY2U7CiBpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QudWlhdXRvbWF0b3IuVWlPYmplY3QyOwpAQCAtNDcsMTAgKzQ2LDExIEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LmN0cy5SOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKKwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogCi0KIHB1YmxpYyBjbGFzcyBDYXB0dXJlZEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgewogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFJlc3VsdCB7CiAgICAgICAgIHB1YmxpYyBpbnQgcGFzc0ZyYW1lczsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy90ZXh0Y2xhc3NpZmllci9jdHMvVGV4dENsYXNzaWZpY2F0aW9uTWFuYWdlclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy90ZXh0Y2xhc3NpZmllci9jdHMvVGV4dENsYXNzaWZpY2F0aW9uTWFuYWdlclRlc3QuamF2YQppbmRleCA3MWNhNjc4Li5hZjkwMzAwIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvdGV4dGNsYXNzaWZpZXIvY3RzL1RleHRDbGFzc2lmaWNhdGlvbk1hbmFnZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdmlldy9zcmMvYW5kcm9pZC92aWV3L3RleHRjbGFzc2lmaWVyL2N0cy9UZXh0Q2xhc3NpZmljYXRpb25NYW5hZ2VyVGVzdC5qYXZhCkBAIC0yMywxOCArMjMsMjcgQEAKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5tb2NrOwogCiBpbXBvcnQgYW5kcm9pZC5vcy5Mb2NhbGVMaXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworaW1wb3J0IGFuZHJvaWQudmlldy50ZXh0Y2xhc3NpZmllci5TZWxlY3Rpb25FdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcudGV4dGNsYXNzaWZpZXIuVGV4dENsYXNzaWZpY2F0aW9uOworaW1wb3J0IGFuZHJvaWQudmlldy50ZXh0Y2xhc3NpZmllci5UZXh0Q2xhc3NpZmljYXRpb25Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQudmlldy50ZXh0Y2xhc3NpZmllci5UZXh0Q2xhc3NpZmljYXRpb25NYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudmlldy50ZXh0Y2xhc3NpZmllci5UZXh0Q2xhc3NpZmllcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcudGV4dGNsYXNzaWZpZXIuVGV4dExpbmtzOwogaW1wb3J0IGFuZHJvaWQudmlldy50ZXh0Y2xhc3NpZmllci5UZXh0U2VsZWN0aW9uOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKKwogQFNtYWxsVGVzdAogQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKIHB1YmxpYyBjbGFzcyBUZXh0Q2xhc3NpZmljYXRpb25NYW5hZ2VyVGVzdCB7CkBAIC00Miw3ICs1MSwxOCBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsZUxpc3QgTE9DQUxFUyA9IExvY2FsZUxpc3QuZm9yTGFuZ3VhZ2VUYWdzKCJlbiIpOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFSVCA9IDE7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVORCA9IDM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFQgPSAidGV4dCI7CisgICAgLy8gVGhpcyB0ZXh0IGhhcyBsb3RzIG9mIHRoaW5ncyB0aGF0IGFyZSBwcm9iYWJseSBlbnRpdGllcyBpbiBtYW55IGNhc2VzLgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUID0gIkFuIGVtYWlsIGFkZHJlc3MgaXMgdGVzdEBleGFtcGxlLmNvbS4gQSBwaG9uZSBudW1iZXIiCisgICAgICAgICAgICArICIgbWlnaHQgYmUgKzEyMTIyNTM3MDc3LiBTb21lYm9keSBsaXZlcyBhdCAxMjMgTWFpbiBTdHJlZXQsIE1vdW50YWluIFZpZXcsIENBLCIKKyAgICAgICAgICAgICsgIiBhbmQgdGhlcmUncyBnb29kIHN0dWZmIGF0IGh0dHBzOi8vd3d3LmFuZHJvaWQuY29tIDopIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUZXh0U2VsZWN0aW9uLlJlcXVlc3QgVEVYVF9TRUxFQ1RJT05fUkVRVUVTVCA9CisgICAgICAgICAgICBuZXcgVGV4dFNlbGVjdGlvbi5SZXF1ZXN0LkJ1aWxkZXIoVEVYVCwgU1RBUlQsIEVORCkKKyAgICAgICAgICAgICAgICAgICAgLnNldERlZmF1bHRMb2NhbGVzKExPQ0FMRVMpCisgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFRleHRDbGFzc2lmaWNhdGlvbi5SZXF1ZXN0IFRFWFRfQ0xBU1NJRklDQVRJT05fUkVRVUVTVCA9CisgICAgICAgICAgICBuZXcgVGV4dENsYXNzaWZpY2F0aW9uLlJlcXVlc3QuQnVpbGRlcihURVhULCBTVEFSVCwgRU5EKQorICAgICAgICAgICAgICAgICAgICAuc2V0RGVmYXVsdExvY2FsZXMoTE9DQUxFUykKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CiAKICAgICBwcml2YXRlIFRleHRDbGFzc2lmaWNhdGlvbk1hbmFnZXIgbU1hbmFnZXI7CiAgICAgcHJpdmF0ZSBUZXh0Q2xhc3NpZmllciBtQ2xhc3NpZmllcjsKQEAgLTUyLDM5ICs3MiwxNiBAQAogICAgICAgICBtTWFuYWdlciA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldFRhcmdldENvbnRleHQoKQogICAgICAgICAgICAgICAgIC5nZXRTeXN0ZW1TZXJ2aWNlKFRleHRDbGFzc2lmaWNhdGlvbk1hbmFnZXIuY2xhc3MpOwogICAgICAgICBtTWFuYWdlci5zZXRUZXh0Q2xhc3NpZmllcihudWxsKTsgLy8gUmVzZXRzIHRoZSBjbGFzc2lmaWVyLgotICAgICAgICBtQ2xhc3NpZmllciA9IG1NYW5hZ2VyLmdldFRleHRDbGFzc2lmaWVyKCk7CisgICAgICAgIG1DbGFzc2lmaWVyID0gbU1hbmFnZXIuY3JlYXRlVGV4dENsYXNzaWZpY2F0aW9uU2Vzc2lvbigKKyAgICAgICAgICAgICAgICBuZXcgVGV4dENsYXNzaWZpY2F0aW9uQ29udGV4dC5CdWlsZGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0VGFyZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VOYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICBUZXh0Q2xhc3NpZmllci5XSURHRVRfVFlQRV9URVhUVklFVykKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKICAgICB9CiAKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTbWFydFNlbGVjdGlvbigpIHsKLSAgICAgICAgYXNzZXJ0VmFsaWRSZXN1bHQobUNsYXNzaWZpZXIuc3VnZ2VzdFNlbGVjdGlvbihURVhULCBTVEFSVCwgRU5ELCBMT0NBTEVTKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NpZnlUZXh0KCkgewotICAgICAgICBhc3NlcnRWYWxpZFJlc3VsdChtQ2xhc3NpZmllci5jbGFzc2lmeVRleHQoVEVYVCwgU1RBUlQsIEVORCwgTE9DQUxFUykpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE5vT3BDbGFzc2lmaWVyKCkgewotICAgICAgICBtTWFuYWdlci5zZXRUZXh0Q2xhc3NpZmllcihUZXh0Q2xhc3NpZmllci5OT19PUCk7Ci0gICAgICAgIG1DbGFzc2lmaWVyID0gbU1hbmFnZXIuZ2V0VGV4dENsYXNzaWZpZXIoKTsKLQotICAgICAgICBmaW5hbCBUZXh0U2VsZWN0aW9uIHNlbGVjdGlvbiA9IG1DbGFzc2lmaWVyLnN1Z2dlc3RTZWxlY3Rpb24oVEVYVCwgU1RBUlQsIEVORCwgTE9DQUxFUyk7Ci0gICAgICAgIGFzc2VydFZhbGlkUmVzdWx0KHNlbGVjdGlvbik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTVEFSVCwgc2VsZWN0aW9uLmdldFNlbGVjdGlvblN0YXJ0SW5kZXgoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhFTkQsIHNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmRJbmRleCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHNlbGVjdGlvbi5nZXRFbnRpdHlDb3VudCgpKTsKLQotICAgICAgICBmaW5hbCBUZXh0Q2xhc3NpZmljYXRpb24gY2xhc3NpZmljYXRpb24gPQotICAgICAgICAgICAgICAgIG1DbGFzc2lmaWVyLmNsYXNzaWZ5VGV4dChURVhULCBTVEFSVCwgRU5ELCBMT0NBTEVTKTsKLSAgICAgICAgYXNzZXJ0VmFsaWRSZXN1bHQoY2xhc3NpZmljYXRpb24pOwotICAgICAgICBhc3NlcnROdWxsKGNsYXNzaWZpY2F0aW9uLmdldFRleHQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBjbGFzc2lmaWNhdGlvbi5nZXRFbnRpdHlDb3VudCgpKTsKLSAgICAgICAgYXNzZXJ0TnVsbChjbGFzc2lmaWNhdGlvbi5nZXRJY29uKCkpOwotICAgICAgICBhc3NlcnROdWxsKGNsYXNzaWZpY2F0aW9uLmdldExhYmVsKCkpOwotICAgICAgICBhc3NlcnROdWxsKGNsYXNzaWZpY2F0aW9uLmdldEludGVudCgpKTsKLSAgICAgICAgYXNzZXJ0TnVsbChjbGFzc2lmaWNhdGlvbi5nZXRPbkNsaWNrTGlzdGVuZXIoKSk7CisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CisgICAgICAgIG1DbGFzc2lmaWVyLmRlc3Ryb3koKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtOTQsOCArOTEsODcgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKGNsYXNzaWZpZXIsIG1NYW5hZ2VyLmdldFRleHRDbGFzc2lmaWVyKCkpOwogICAgIH0KIAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNtYXJ0U2VsZWN0aW9uKCkgeworICAgICAgICBhc3NlcnRWYWxpZFJlc3VsdChtQ2xhc3NpZmllci5zdWdnZXN0U2VsZWN0aW9uKFRFWFRfU0VMRUNUSU9OX1JFUVVFU1QpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbGFzc2lmeVRleHQoKSB7CisgICAgICAgIGFzc2VydFZhbGlkUmVzdWx0KG1DbGFzc2lmaWVyLmNsYXNzaWZ5VGV4dChURVhUX0NMQVNTSUZJQ0FUSU9OX1JFUVVFU1QpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb09wQ2xhc3NpZmllcigpIHsKKyAgICAgICAgbU1hbmFnZXIuc2V0VGV4dENsYXNzaWZpZXIoVGV4dENsYXNzaWZpZXIuTk9fT1ApOworICAgICAgICBtQ2xhc3NpZmllciA9IG1NYW5hZ2VyLmdldFRleHRDbGFzc2lmaWVyKCk7CisKKyAgICAgICAgZmluYWwgVGV4dFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBtQ2xhc3NpZmllci5zdWdnZXN0U2VsZWN0aW9uKFRFWFRfU0VMRUNUSU9OX1JFUVVFU1QpOworICAgICAgICBhc3NlcnRWYWxpZFJlc3VsdChzZWxlY3Rpb24pOworICAgICAgICBhc3NlcnRFcXVhbHMoU1RBUlQsIHNlbGVjdGlvbi5nZXRTZWxlY3Rpb25TdGFydEluZGV4KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoRU5ELCBzZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kSW5kZXgoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzZWxlY3Rpb24uZ2V0RW50aXR5Q291bnQoKSk7CisKKyAgICAgICAgZmluYWwgVGV4dENsYXNzaWZpY2F0aW9uIGNsYXNzaWZpY2F0aW9uID0KKyAgICAgICAgICAgICAgICBtQ2xhc3NpZmllci5jbGFzc2lmeVRleHQoVEVYVF9DTEFTU0lGSUNBVElPTl9SRVFVRVNUKTsKKyAgICAgICAgYXNzZXJ0VmFsaWRSZXN1bHQoY2xhc3NpZmljYXRpb24pOworICAgICAgICBhc3NlcnROdWxsKGNsYXNzaWZpY2F0aW9uLmdldFRleHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBjbGFzc2lmaWNhdGlvbi5nZXRFbnRpdHlDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGNsYXNzaWZpY2F0aW9uLmdldEFjdGlvbnMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnROdWxsKGNsYXNzaWZpY2F0aW9uLmdldEljb24oKSk7CisgICAgICAgIGFzc2VydE51bGwoY2xhc3NpZmljYXRpb24uZ2V0TGFiZWwoKSk7CisgICAgICAgIGFzc2VydE51bGwoY2xhc3NpZmljYXRpb24uZ2V0SW50ZW50KCkpOworICAgICAgICBhc3NlcnROdWxsKGNsYXNzaWZpY2F0aW9uLmdldE9uQ2xpY2tMaXN0ZW5lcigpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmF0ZUxpbmtzKCkgeworICAgICAgICBhc3NlcnRWYWxpZFJlc3VsdChtQ2xhc3NpZmllci5nZW5lcmF0ZUxpbmtzKG5ldyBUZXh0TGlua3MuUmVxdWVzdC5CdWlsZGVyKFRFWFQpLmJ1aWxkKCkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlRW50aXR5TGlzdE1vZGlmaWNhdGlvbnNfb25seV9oaW50cygpIHsKKyAgICAgICAgVGV4dENsYXNzaWZpZXIuRW50aXR5Q29uZmlnIGVudGl0eUNvbmZpZyA9IFRleHRDbGFzc2lmaWVyLkVudGl0eUNvbmZpZy5jcmVhdGVXaXRoSGludHMoCisgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgic29tZV9oaW50IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZW50aXR5Q29uZmlnLmdldEhpbnRzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShlbnRpdHlDb25maWcuZ2V0SGludHMoKS5jb250YWlucygic29tZV9oaW50IikpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEhhc2hTZXQ8U3RyaW5nPihBcnJheXMuYXNMaXN0KCJmb28iLCAiYmFyIikpLAorICAgICAgICAgICAgICAgIGVudGl0eUNvbmZpZy5yZXNvbHZlRW50aXR5TGlzdE1vZGlmaWNhdGlvbnMoQXJyYXlzLmFzTGlzdCgiZm9vIiwgImJhciIpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZUVudGl0eUxpc3RNb2RpZmljYXRpb25zX2luY2x1ZGVfZXhjbHVkZSgpIHsKKyAgICAgICAgVGV4dENsYXNzaWZpZXIuRW50aXR5Q29uZmlnIGVudGl0eUNvbmZpZyA9IFRleHRDbGFzc2lmaWVyLkVudGl0eUNvbmZpZy5jcmVhdGUoCisgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgic29tZV9oaW50IiksCisgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiYSIsICJiIiwgImMiKSwKKyAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJiIiwgImQiLCAieCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGVudGl0eUNvbmZpZy5nZXRIaW50cygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydFRydWUoZW50aXR5Q29uZmlnLmdldEhpbnRzKCkuY29udGFpbnMoInNvbWVfaGludCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBIYXNoU2V0KEFycmF5cy5hc0xpc3QoImEiLCAiYyIsICJ3IikpLAorICAgICAgICAgICAgICAgIG5ldyBIYXNoU2V0KGVudGl0eUNvbmZpZy5yZXNvbHZlRW50aXR5TGlzdE1vZGlmaWNhdGlvbnMoCisgICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJjIiwgInciLCAieCIpKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc29sdmVFbnRpdHlMaXN0TW9kaWZpY2F0aW9uc19leHBsaWNpdCgpIHsKKyAgICAgICAgVGV4dENsYXNzaWZpZXIuRW50aXR5Q29uZmlnIGVudGl0eUNvbmZpZyA9CisgICAgICAgICAgICAgICAgVGV4dENsYXNzaWZpZXIuRW50aXR5Q29uZmlnLmNyZWF0ZVdpdGhFeHBsaWNpdEVudGl0eUxpc3QoQXJyYXlzLmFzTGlzdCgiYSIsICJiIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwgZW50aXR5Q29uZmlnLmdldEhpbnRzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEhhc2hTZXQ8U3RyaW5nPihBcnJheXMuYXNMaXN0KCJhIiwgImIiKSksCisgICAgICAgICAgICAgICAgZW50aXR5Q29uZmlnLnJlc29sdmVFbnRpdHlMaXN0TW9kaWZpY2F0aW9ucyhBcnJheXMuYXNMaXN0KCJ3IiwgIngiKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9uU2VsZWN0aW9uRXZlbnQoKSB7CisgICAgICAgIC8vIERvZXNuJ3QgY3Jhc2guCisgICAgICAgIG1DbGFzc2lmaWVyLm9uU2VsZWN0aW9uRXZlbnQoCisgICAgICAgICAgICAgICAgU2VsZWN0aW9uRXZlbnQuY3JlYXRlU2VsZWN0aW9uU3RhcnRlZEV2ZW50KFNlbGVjdGlvbkV2ZW50LklOVk9DQVRJT05fTUFOVUFMLCAwKSk7CisgICAgfQorCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRWYWxpZFJlc3VsdChUZXh0U2VsZWN0aW9uIHNlbGVjdGlvbikgewogICAgICAgICBhc3NlcnROb3ROdWxsKHNlbGVjdGlvbik7CisgICAgICAgIGFzc2VydFRydWUoc2VsZWN0aW9uLmdldFNlbGVjdGlvblN0YXJ0SW5kZXgoKSA+PSAwKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kSW5kZXgoKSA+IHNlbGVjdGlvbi5nZXRTZWxlY3Rpb25TdGFydEluZGV4KCkpOwogICAgICAgICBhc3NlcnRUcnVlKHNlbGVjdGlvbi5nZXRFbnRpdHlDb3VudCgpID49IDApOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGlvbi5nZXRFbnRpdHlDb3VudCgpOyBpKyspIHsKICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbnRpdHkgPSBzZWxlY3Rpb24uZ2V0RW50aXR5KGkpOwpAQCAtMTE2LDYgKzE5MiwyMiBAQAogICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb25maWRlbmNlU2NvcmUgPj0gMCk7CiAgICAgICAgICAgICBhc3NlcnRUcnVlKGNvbmZpZGVuY2VTY29yZSA8PSAxKTsKICAgICAgICAgfQorICAgICAgICBhc3NlcnROb3ROdWxsKGNsYXNzaWZpY2F0aW9uLmdldEFjdGlvbnMoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRWYWxpZFJlc3VsdChUZXh0TGlua3MgbGlua3MpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChsaW5rcyk7CisgICAgICAgIGZvciAoVGV4dExpbmtzLlRleHRMaW5rIGxpbmsgOiBsaW5rcy5nZXRMaW5rcygpKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGxpbmsuZ2V0RW50aXR5Q291bnQoKSA+IDApOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShsaW5rLmdldFN0YXJ0KCkgPj0gMCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGxpbmsuZ2V0U3RhcnQoKSA8PSBsaW5rLmdldEVuZCgpKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGluay5nZXRFbnRpdHlDb3VudCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZW50aXR5VHlwZSA9IGxpbmsuZ2V0RW50aXR5KGkpOworICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZW50aXR5VHlwZSk7CisgICAgICAgICAgICAgICAgZmluYWwgZmxvYXQgY29uZmlkZW5jZVNjb3JlID0gbGluay5nZXRDb25maWRlbmNlU2NvcmUoZW50aXR5VHlwZSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb25maWRlbmNlU2NvcmUgPj0gMCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb25maWRlbmNlU2NvcmUgPD0gMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiB9Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ZpZXcvc3JjL2FuZHJvaWQvdmlldy90ZXh0Y2xhc3NpZmllci9jdHMvVGV4dENsYXNzaWZpZXJWYWx1ZU9iamVjdHNUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvdGV4dGNsYXNzaWZpZXIvY3RzL1RleHRDbGFzc2lmaWVyVmFsdWVPYmplY3RzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1YjczYWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy92aWV3L3NyYy9hbmRyb2lkL3ZpZXcvdGV4dGNsYXNzaWZpZXIvY3RzL1RleHRDbGFzc2lmaWVyVmFsdWVPYmplY3RzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzE3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnZpZXcudGV4dGNsYXNzaWZpZXIuY3RzOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5hcHAuUmVtb3RlQWN0aW9uOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkNvbG9yRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkljb247CitpbXBvcnQgYW5kcm9pZC5vcy5Mb2NhbGVMaXN0OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy50ZXh0Y2xhc3NpZmllci5UZXh0Q2xhc3NpZmljYXRpb247CitpbXBvcnQgYW5kcm9pZC52aWV3LnRleHRjbGFzc2lmaWVyLlRleHRDbGFzc2lmaWVyOworaW1wb3J0IGFuZHJvaWQudmlldy50ZXh0Y2xhc3NpZmllci5UZXh0U2VsZWN0aW9uOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKKy8qKgorICogVGV4dENsYXNzaWZpZXIgdmFsdWUgb2JqZWN0cyB0ZXN0cy4KKyAqCisgKiA8cD5Db250YWlucyB1bml0IHRlc3RzIGZvciB2YWx1ZSBvYmplY3RzIHBhc3NlZCB0by9mcm9tIFRleHRDbGFzc2lmaWVyIEFQSXMuCisgKi8KK0BTbWFsbFRlc3QKK0BSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgVGV4dENsYXNzaWZpZXJWYWx1ZU9iamVjdHNUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZSBBQ0NFUFRFRF9ERUxUQSA9IDAuMDAwMDAwMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVCA9ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVJUID0gNTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRU5EID0gMjA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gImlkMTIzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGVMaXN0IExPQ0FMRVMgPSBMb2NhbGVMaXN0LmZvckxhbmd1YWdlVGFncygiZnIsZW4sZGUsZXMiKTsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRleHRTZWxlY3Rpb24oKSB7CisgICAgICAgIGZpbmFsIGZsb2F0IGFkZHJlc3NTY29yZSA9IDAuMWY7CisgICAgICAgIGZpbmFsIGZsb2F0IGVtYWlsU2NvcmUgPSAwLjlmOworCisgICAgICAgIGZpbmFsIFRleHRTZWxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IFRleHRTZWxlY3Rpb24uQnVpbGRlcihTVEFSVCwgRU5EKQorICAgICAgICAgICAgICAgIC5zZXRFbnRpdHlUeXBlKFRleHRDbGFzc2lmaWVyLlRZUEVfQUREUkVTUywgYWRkcmVzc1Njb3JlKQorICAgICAgICAgICAgICAgIC5zZXRFbnRpdHlUeXBlKFRleHRDbGFzc2lmaWVyLlRZUEVfRU1BSUwsIGVtYWlsU2NvcmUpCisgICAgICAgICAgICAgICAgLnNldElkKElEKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworCisgICAgICAgIGFzc2VydEVxdWFscyhTVEFSVCwgc2VsZWN0aW9uLmdldFNlbGVjdGlvblN0YXJ0SW5kZXgoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhFTkQsIHNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmRJbmRleCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHNlbGVjdGlvbi5nZXRFbnRpdHlDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFRleHRDbGFzc2lmaWVyLlRZUEVfRU1BSUwsIHNlbGVjdGlvbi5nZXRFbnRpdHkoMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoVGV4dENsYXNzaWZpZXIuVFlQRV9BRERSRVNTLCBzZWxlY3Rpb24uZ2V0RW50aXR5KDEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGFkZHJlc3NTY29yZSwgc2VsZWN0aW9uLmdldENvbmZpZGVuY2VTY29yZShUZXh0Q2xhc3NpZmllci5UWVBFX0FERFJFU1MpLAorICAgICAgICAgICAgICAgIEFDQ0VQVEVEX0RFTFRBKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGVtYWlsU2NvcmUsIHNlbGVjdGlvbi5nZXRDb25maWRlbmNlU2NvcmUoVGV4dENsYXNzaWZpZXIuVFlQRV9FTUFJTCksCisgICAgICAgICAgICAgICAgQUNDRVBURURfREVMVEEpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc2VsZWN0aW9uLmdldENvbmZpZGVuY2VTY29yZSgicmFuZG9tX3R5cGUiKSwgQUNDRVBURURfREVMVEEpOworICAgICAgICBhc3NlcnRFcXVhbHMoSUQsIHNlbGVjdGlvbi5nZXRJZCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUZXh0U2VsZWN0aW9uX2RpZmZlcmVudFBhcmFtcygpIHsKKyAgICAgICAgZmluYWwgaW50IHN0YXJ0ID0gMDsKKyAgICAgICAgZmluYWwgaW50IGVuZCA9IDE7CisgICAgICAgIGZpbmFsIGZsb2F0IGNvbmZpZGVuY2VTY29yZSA9IDAuNWY7CisgICAgICAgIGZpbmFsIFN0cmluZyBpZCA9ICIyaHVrd3UzbTNrNDRmMWdiMCI7CisKKyAgICAgICAgZmluYWwgVGV4dFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgVGV4dFNlbGVjdGlvbi5CdWlsZGVyKHN0YXJ0LCBlbmQpCisgICAgICAgICAgICAgICAgLnNldEVudGl0eVR5cGUoVGV4dENsYXNzaWZpZXIuVFlQRV9VUkwsIGNvbmZpZGVuY2VTY29yZSkKKyAgICAgICAgICAgICAgICAuc2V0SWQoaWQpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHN0YXJ0LCBzZWxlY3Rpb24uZ2V0U2VsZWN0aW9uU3RhcnRJbmRleCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGVuZCwgc2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZEluZGV4KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc2VsZWN0aW9uLmdldEVudGl0eUNvdW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoVGV4dENsYXNzaWZpZXIuVFlQRV9VUkwsIHNlbGVjdGlvbi5nZXRFbnRpdHkoMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoY29uZmlkZW5jZVNjb3JlLCBzZWxlY3Rpb24uZ2V0Q29uZmlkZW5jZVNjb3JlKFRleHRDbGFzc2lmaWVyLlRZUEVfVVJMKSwKKyAgICAgICAgICAgICAgICBBQ0NFUFRFRF9ERUxUQSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzZWxlY3Rpb24uZ2V0Q29uZmlkZW5jZVNjb3JlKCJyYW5kb21fdHlwZSIpLCBBQ0NFUFRFRF9ERUxUQSk7CisgICAgICAgIGFzc2VydEVxdWFscyhpZCwgc2VsZWN0aW9uLmdldElkKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRleHRTZWxlY3Rpb25fZGVmYXVsdFZhbHVlcygpIHsKKyAgICAgICAgVGV4dFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgVGV4dFNlbGVjdGlvbi5CdWlsZGVyKFNUQVJULCBFTkQpLmJ1aWxkKCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzZWxlY3Rpb24uZ2V0RW50aXR5Q291bnQoKSk7CisgICAgICAgIGFzc2VydE51bGwoc2VsZWN0aW9uLmdldElkKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRleHRTZWxlY3Rpb25fcHJ1bmVkQ29uZmlkZW5jZVNjb3JlKCkgeworICAgICAgICBmaW5hbCBmbG9hdCBwaG9uZVNjb3JlID0gLTAuMWY7CisgICAgICAgIGZpbmFsIGZsb2F0IHBydW5lZFBob25lU2NvcmUgPSAwZjsKKyAgICAgICAgZmluYWwgZmxvYXQgb3RoZXJTY29yZSA9IDEuNWY7CisgICAgICAgIGZpbmFsIGZsb2F0IHBydW5lZE90aGVyU2NvcmUgPSAxLjBmOworCisgICAgICAgIGZpbmFsIFRleHRTZWxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IFRleHRTZWxlY3Rpb24uQnVpbGRlcihTVEFSVCwgRU5EKQorICAgICAgICAgICAgICAgIC5zZXRFbnRpdHlUeXBlKFRleHRDbGFzc2lmaWVyLlRZUEVfUEhPTkUsIHBob25lU2NvcmUpCisgICAgICAgICAgICAgICAgLnNldEVudGl0eVR5cGUoVGV4dENsYXNzaWZpZXIuVFlQRV9PVEhFUiwgb3RoZXJTY29yZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMocHJ1bmVkUGhvbmVTY29yZSwgc2VsZWN0aW9uLmdldENvbmZpZGVuY2VTY29yZShUZXh0Q2xhc3NpZmllci5UWVBFX1BIT05FKSwKKyAgICAgICAgICAgICAgICBBQ0NFUFRFRF9ERUxUQSk7CisgICAgICAgIGFzc2VydEVxdWFscyhwcnVuZWRPdGhlclNjb3JlLCBzZWxlY3Rpb24uZ2V0Q29uZmlkZW5jZVNjb3JlKFRleHRDbGFzc2lmaWVyLlRZUEVfT1RIRVIpLAorICAgICAgICAgICAgICAgIEFDQ0VQVEVEX0RFTFRBKTsKKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGV4dFNlbGVjdGlvbl9pbnZhbGlkU3RhcnRQYXJhbXMoKSB7CisgICAgICAgIG5ldyBUZXh0U2VsZWN0aW9uLkJ1aWxkZXIoLTEgLyogc3RhcnQgKi8sIEVORCkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGV4dFNlbGVjdGlvbl9pbnZhbGlkRW5kUGFyYW1zKCkgeworICAgICAgICBuZXcgVGV4dFNlbGVjdGlvbi5CdWlsZGVyKFNUQVJULCAwIC8qIGVuZCAqLykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZCA9IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdFRleHRTZWxlY3Rpb25fZW50aXR5SW5kZXhPdXRPZkJvdW5kcygpIHsKKyAgICAgICAgZmluYWwgVGV4dFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgVGV4dFNlbGVjdGlvbi5CdWlsZGVyKFNUQVJULCBFTkQpLmJ1aWxkKCk7CisgICAgICAgIGZpbmFsIGludCBvdXRPZkJvdW5kc0luZGV4ID0gc2VsZWN0aW9uLmdldEVudGl0eUNvdW50KCk7CisgICAgICAgIHNlbGVjdGlvbi5nZXRFbnRpdHkob3V0T2ZCb3VuZHNJbmRleCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGV4dFNlbGVjdGlvblJlcXVlc3QoKSB7CisgICAgICAgIGZpbmFsIFRleHRTZWxlY3Rpb24uUmVxdWVzdCByZXF1ZXN0ID0gbmV3IFRleHRTZWxlY3Rpb24uUmVxdWVzdC5CdWlsZGVyKFRFWFQsIFNUQVJULCBFTkQpCisgICAgICAgICAgICAgICAgLnNldERlZmF1bHRMb2NhbGVzKExPQ0FMRVMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhURVhULCByZXF1ZXN0LmdldFRleHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhTVEFSVCwgcmVxdWVzdC5nZXRTdGFydEluZGV4KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoRU5ELCByZXF1ZXN0LmdldEVuZEluZGV4KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTE9DQUxFUywgcmVxdWVzdC5nZXREZWZhdWx0TG9jYWxlcygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUZXh0U2VsZWN0aW9uUmVxdWVzdF9udWxsVmFsdWVzKCkgeworICAgICAgICBmaW5hbCBUZXh0U2VsZWN0aW9uLlJlcXVlc3QgcmVxdWVzdCA9CisgICAgICAgICAgICAgICAgbmV3IFRleHRTZWxlY3Rpb24uUmVxdWVzdC5CdWlsZGVyKFRFWFQsIFNUQVJULCBFTkQpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RGVmYXVsdExvY2FsZXMobnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICBhc3NlcnROdWxsKHJlcXVlc3QuZ2V0RGVmYXVsdExvY2FsZXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGV4dFNlbGVjdGlvblJlcXVlc3RfZGVmYXVsdFZhbHVlcygpIHsKKyAgICAgICAgZmluYWwgVGV4dFNlbGVjdGlvbi5SZXF1ZXN0IHJlcXVlc3QgPQorICAgICAgICAgICAgICAgIG5ldyBUZXh0U2VsZWN0aW9uLlJlcXVlc3QuQnVpbGRlcihURVhULCBTVEFSVCwgRU5EKS5idWlsZCgpOworICAgICAgICBhc3NlcnROdWxsKHJlcXVlc3QuZ2V0RGVmYXVsdExvY2FsZXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGV4dENsYXNzaWZpY2F0aW9uKCkgeworICAgICAgICBmaW5hbCBmbG9hdCBhZGRyZXNzU2NvcmUgPSAwLjFmOworICAgICAgICBmaW5hbCBmbG9hdCBlbWFpbFNjb3JlID0gMC45ZjsKKyAgICAgICAgZmluYWwgUGVuZGluZ0ludGVudCBpbnRlbnQxID0gUGVuZGluZ0ludGVudC5nZXRBY3Rpdml0eSgKKyAgICAgICAgICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRUYXJnZXRDb250ZXh0KCksIDAsIG5ldyBJbnRlbnQoKSwgMCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBsYWJlbDEgPSAibGFiZWwxIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc2NyaXB0aW9uMSA9ICJkZXNjcmlwdGlvbjEiOworICAgICAgICBmaW5hbCBJY29uIGljb24xID0gZ2VuZXJhdGVUZXN0SWNvbigxNiwgMTYsIENvbG9yLlJFRCk7CisgICAgICAgIGZpbmFsIFBlbmRpbmdJbnRlbnQgaW50ZW50MiA9IFBlbmRpbmdJbnRlbnQuZ2V0QWN0aXZpdHkoCisgICAgICAgICAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0VGFyZ2V0Q29udGV4dCgpLCAwLCBuZXcgSW50ZW50KCksIDApOworICAgICAgICBmaW5hbCBTdHJpbmcgbGFiZWwyID0gImxhYmVsMiI7CisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbjIgPSAiZGVzY3JpcHRpb24yIjsKKyAgICAgICAgZmluYWwgSWNvbiBpY29uMiA9IGdlbmVyYXRlVGVzdEljb24oMTYsIDE2LCBDb2xvci5HUkVFTik7CisKKyAgICAgICAgZmluYWwgVGV4dENsYXNzaWZpY2F0aW9uIGNsYXNzaWZpY2F0aW9uID0gbmV3IFRleHRDbGFzc2lmaWNhdGlvbi5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0VGV4dChURVhUKQorICAgICAgICAgICAgICAgIC5zZXRFbnRpdHlUeXBlKFRleHRDbGFzc2lmaWVyLlRZUEVfQUREUkVTUywgYWRkcmVzc1Njb3JlKQorICAgICAgICAgICAgICAgIC5zZXRFbnRpdHlUeXBlKFRleHRDbGFzc2lmaWVyLlRZUEVfRU1BSUwsIGVtYWlsU2NvcmUpCisgICAgICAgICAgICAgICAgLmFkZEFjdGlvbihuZXcgUmVtb3RlQWN0aW9uKGljb24xLCBsYWJlbDEsIGRlc2NyaXB0aW9uMSwgaW50ZW50MSkpCisgICAgICAgICAgICAgICAgLmFkZEFjdGlvbihuZXcgUmVtb3RlQWN0aW9uKGljb24yLCBsYWJlbDIsIGRlc2NyaXB0aW9uMiwgaW50ZW50MikpCisgICAgICAgICAgICAgICAgLnNldElkKElEKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworCisgICAgICAgIGFzc2VydEVxdWFscyhURVhULCBjbGFzc2lmaWNhdGlvbi5nZXRUZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgY2xhc3NpZmljYXRpb24uZ2V0RW50aXR5Q291bnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhUZXh0Q2xhc3NpZmllci5UWVBFX0VNQUlMLCBjbGFzc2lmaWNhdGlvbi5nZXRFbnRpdHkoMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoVGV4dENsYXNzaWZpZXIuVFlQRV9BRERSRVNTLCBjbGFzc2lmaWNhdGlvbi5nZXRFbnRpdHkoMSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoYWRkcmVzc1Njb3JlLCBjbGFzc2lmaWNhdGlvbi5nZXRDb25maWRlbmNlU2NvcmUoVGV4dENsYXNzaWZpZXIuVFlQRV9BRERSRVNTKSwKKyAgICAgICAgICAgICAgICBBQ0NFUFRFRF9ERUxUQSk7CisgICAgICAgIGFzc2VydEVxdWFscyhlbWFpbFNjb3JlLCBjbGFzc2lmaWNhdGlvbi5nZXRDb25maWRlbmNlU2NvcmUoVGV4dENsYXNzaWZpZXIuVFlQRV9FTUFJTCksCisgICAgICAgICAgICAgICAgQUNDRVBURURfREVMVEEpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgY2xhc3NpZmljYXRpb24uZ2V0Q29uZmlkZW5jZVNjb3JlKCJyYW5kb21fdHlwZSIpLCBBQ0NFUFRFRF9ERUxUQSk7CisKKyAgICAgICAgLy8gTGVnYWN5IEFQSQorICAgICAgICBhc3NlcnROdWxsKGNsYXNzaWZpY2F0aW9uLmdldEludGVudCgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChjbGFzc2lmaWNhdGlvbi5nZXRMYWJlbCgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChjbGFzc2lmaWNhdGlvbi5nZXRJY29uKCkpOworICAgICAgICBhc3NlcnROdWxsKGNsYXNzaWZpY2F0aW9uLmdldE9uQ2xpY2tMaXN0ZW5lcigpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgY2xhc3NpZmljYXRpb24uZ2V0QWN0aW9ucygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhsYWJlbDEsIGNsYXNzaWZpY2F0aW9uLmdldEFjdGlvbnMoKS5nZXQoMCkuZ2V0VGl0bGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhkZXNjcmlwdGlvbjEsIGNsYXNzaWZpY2F0aW9uLmdldEFjdGlvbnMoKS5nZXQoMCkuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoaW50ZW50MSwgY2xhc3NpZmljYXRpb24uZ2V0QWN0aW9ucygpLmdldCgwKS5nZXRBY3Rpb25JbnRlbnQoKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoY2xhc3NpZmljYXRpb24uZ2V0QWN0aW9ucygpLmdldCgwKS5nZXRJY29uKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobGFiZWwyLCBjbGFzc2lmaWNhdGlvbi5nZXRBY3Rpb25zKCkuZ2V0KDEpLmdldFRpdGxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZGVzY3JpcHRpb24yLCBjbGFzc2lmaWNhdGlvbi5nZXRBY3Rpb25zKCkuZ2V0KDEpLmdldENvbnRlbnREZXNjcmlwdGlvbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGludGVudDIsIGNsYXNzaWZpY2F0aW9uLmdldEFjdGlvbnMoKS5nZXQoMSkuZ2V0QWN0aW9uSW50ZW50KCkpOworICAgICAgICBhc3NlcnROb3ROdWxsKGNsYXNzaWZpY2F0aW9uLmdldEFjdGlvbnMoKS5nZXQoMSkuZ2V0SWNvbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKElELCBjbGFzc2lmaWNhdGlvbi5nZXRJZCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUZXh0Q2xhc3NpZmljYXRpb25MZWdhY3koKSB7CisgICAgICAgIGZpbmFsIGZsb2F0IGFkZHJlc3NTY29yZSA9IDAuMWY7CisgICAgICAgIGZpbmFsIGZsb2F0IGVtYWlsU2NvcmUgPSAwLjlmOworICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOworICAgICAgICBmaW5hbCBTdHJpbmcgbGFiZWwgPSAibGFiZWwiOworICAgICAgICBmaW5hbCBEcmF3YWJsZSBpY29uID0gbmV3IENvbG9yRHJhd2FibGUoQ29sb3IuUkVEKTsKKyAgICAgICAgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgb25DbGljayA9IHYgLT4geyB9OworCisgICAgICAgIGZpbmFsIFRleHRDbGFzc2lmaWNhdGlvbiBjbGFzc2lmaWNhdGlvbiA9IG5ldyBUZXh0Q2xhc3NpZmljYXRpb24uQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldFRleHQoVEVYVCkKKyAgICAgICAgICAgICAgICAuc2V0RW50aXR5VHlwZShUZXh0Q2xhc3NpZmllci5UWVBFX0FERFJFU1MsIGFkZHJlc3NTY29yZSkKKyAgICAgICAgICAgICAgICAuc2V0RW50aXR5VHlwZShUZXh0Q2xhc3NpZmllci5UWVBFX0VNQUlMLCBlbWFpbFNjb3JlKQorICAgICAgICAgICAgICAgIC5zZXRJbnRlbnQoaW50ZW50KQorICAgICAgICAgICAgICAgIC5zZXRMYWJlbChsYWJlbCkKKyAgICAgICAgICAgICAgICAuc2V0SWNvbihpY29uKQorICAgICAgICAgICAgICAgIC5zZXRPbkNsaWNrTGlzdGVuZXIob25DbGljaykKKyAgICAgICAgICAgICAgICAuc2V0SWQoSUQpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFRFWFQsIGNsYXNzaWZpY2F0aW9uLmdldFRleHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBjbGFzc2lmaWNhdGlvbi5nZXRFbnRpdHlDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFRleHRDbGFzc2lmaWVyLlRZUEVfRU1BSUwsIGNsYXNzaWZpY2F0aW9uLmdldEVudGl0eSgwKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhUZXh0Q2xhc3NpZmllci5UWVBFX0FERFJFU1MsIGNsYXNzaWZpY2F0aW9uLmdldEVudGl0eSgxKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhhZGRyZXNzU2NvcmUsIGNsYXNzaWZpY2F0aW9uLmdldENvbmZpZGVuY2VTY29yZShUZXh0Q2xhc3NpZmllci5UWVBFX0FERFJFU1MpLAorICAgICAgICAgICAgICAgIEFDQ0VQVEVEX0RFTFRBKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGVtYWlsU2NvcmUsIGNsYXNzaWZpY2F0aW9uLmdldENvbmZpZGVuY2VTY29yZShUZXh0Q2xhc3NpZmllci5UWVBFX0VNQUlMKSwKKyAgICAgICAgICAgICAgICBBQ0NFUFRFRF9ERUxUQSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBjbGFzc2lmaWNhdGlvbi5nZXRDb25maWRlbmNlU2NvcmUoInJhbmRvbV90eXBlIiksIEFDQ0VQVEVEX0RFTFRBKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoaW50ZW50LCBjbGFzc2lmaWNhdGlvbi5nZXRJbnRlbnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhsYWJlbCwgY2xhc3NpZmljYXRpb24uZ2V0TGFiZWwoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhpY29uLCBjbGFzc2lmaWNhdGlvbi5nZXRJY29uKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMob25DbGljaywgY2xhc3NpZmljYXRpb24uZ2V0T25DbGlja0xpc3RlbmVyKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoSUQsIGNsYXNzaWZpY2F0aW9uLmdldElkKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRleHRDbGFzc2lmaWNhdGlvbl9kZWZhdWx0VmFsdWVzKCkgeworICAgICAgICBmaW5hbCBUZXh0Q2xhc3NpZmljYXRpb24gY2xhc3NpZmljYXRpb24gPSBuZXcgVGV4dENsYXNzaWZpY2F0aW9uLkJ1aWxkZXIoKS5idWlsZCgpOworCisgICAgICAgIGFzc2VydEVxdWFscyhudWxsLCBjbGFzc2lmaWNhdGlvbi5nZXRUZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgY2xhc3NpZmljYXRpb24uZ2V0RW50aXR5Q291bnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhudWxsLCBjbGFzc2lmaWNhdGlvbi5nZXRJbnRlbnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhudWxsLCBjbGFzc2lmaWNhdGlvbi5nZXRMYWJlbCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIGNsYXNzaWZpY2F0aW9uLmdldEljb24oKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhudWxsLCBjbGFzc2lmaWNhdGlvbi5nZXRPbkNsaWNrTGlzdGVuZXIoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBjbGFzc2lmaWNhdGlvbi5nZXRBY3Rpb25zKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChjbGFzc2lmaWNhdGlvbi5nZXRJZCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUZXh0Q2xhc3NpZmljYXRpb25SZXF1ZXN0KCkgeworICAgICAgICBmaW5hbCBUZXh0Q2xhc3NpZmljYXRpb24uUmVxdWVzdCByZXF1ZXN0ID0KKyAgICAgICAgICAgICAgICBuZXcgVGV4dENsYXNzaWZpY2F0aW9uLlJlcXVlc3QuQnVpbGRlcihURVhULCBTVEFSVCwgRU5EKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldERlZmF1bHRMb2NhbGVzKExPQ0FMRVMpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKExPQ0FMRVMsIHJlcXVlc3QuZ2V0RGVmYXVsdExvY2FsZXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGV4dENsYXNzaWZpY2F0aW9uUmVxdWVzdF9udWxsVmFsdWVzKCkgeworICAgICAgICBmaW5hbCBUZXh0Q2xhc3NpZmljYXRpb24uUmVxdWVzdCByZXF1ZXN0ID0KKyAgICAgICAgICAgICAgICBuZXcgVGV4dENsYXNzaWZpY2F0aW9uLlJlcXVlc3QuQnVpbGRlcihURVhULCBTVEFSVCwgRU5EKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldERlZmF1bHRMb2NhbGVzKG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgYXNzZXJ0TnVsbChyZXF1ZXN0LmdldERlZmF1bHRMb2NhbGVzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRleHRDbGFzc2lmaWNhdGlvblJlcXVlc3RfZGVmYXVsdFZhbHVlcygpIHsKKyAgICAgICAgZmluYWwgVGV4dENsYXNzaWZpY2F0aW9uLlJlcXVlc3QgcmVxdWVzdCA9CisgICAgICAgICAgICAgICAgbmV3IFRleHRDbGFzc2lmaWNhdGlvbi5SZXF1ZXN0LkJ1aWxkZXIoVEVYVCwgU1RBUlQsIEVORCkuYnVpbGQoKTsKKyAgICAgICAgYXNzZXJ0TnVsbChyZXF1ZXN0LmdldERlZmF1bHRMb2NhbGVzKCkpOworICAgIH0KKworICAgIC8vIFRPRE86IEFkZCBtb3JlIHRlc3RzLgorCisgICAgLyoqIEhlbHBlciB0byBnZW5lcmF0ZSBJY29ucyBmb3IgdGVzdGluZy4gKi8KKyAgICBwcml2YXRlIEljb24gZ2VuZXJhdGVUZXN0SWNvbihpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBjb2xvclZhbHVlKSB7CisgICAgICAgIGZpbmFsIGludCBudW1QaXhlbHMgPSB3aWR0aCAqIGhlaWdodDsKKyAgICAgICAgZmluYWwgaW50W10gY29sb3JzID0gbmV3IGludFtudW1QaXhlbHNdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVBpeGVsczsgKytpKSB7CisgICAgICAgICAgICBjb2xvcnNbaV0gPSBjb2xvclZhbHVlOworICAgICAgICB9CisgICAgICAgIGZpbmFsIEJpdG1hcCBiaXRtYXAgPSBCaXRtYXAuY3JlYXRlQml0bWFwKGNvbG9ycywgd2lkdGgsIGhlaWdodCwgQml0bWFwLkNvbmZpZy5BUkdCXzg4ODgpOworICAgICAgICByZXR1cm4gSWNvbi5jcmVhdGVXaXRoQml0bWFwKGJpdG1hcCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdm9pY2VpbnRlcmFjdGlvbi9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvdm9pY2VpbnRlcmFjdGlvbi9BbmRyb2lkLm1rCmluZGV4IGI4M2Y0ZTkuLjJhZjVlOWYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3ZvaWNlaW50ZXJhY3Rpb24vQW5kcm9pZC5taworKysgYi90ZXN0cy90ZXN0cy92b2ljZWludGVyYWN0aW9uL0FuZHJvaWQubWsKQEAgLTIxLDcgKzIxLDkgQEAKICMgYW5kIHdoZW4gYnVpbHQgZXhwbGljaXRseSBwdXQgaXQgaW4gdGhlIGRhdGEgcGFydGl0aW9uCiBMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQogCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gQ3RzVm9pY2VJbnRlcmFjdGlvbkNvbW1vbiBjdHN0ZXN0cnVubmVyIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNWb2ljZUludGVyYWN0aW9uQ29tbW9uIGN0c3Rlc3RydW5uZXItYXh0IGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0CisKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIuc3R1YnMgYW5kcm9pZC50ZXN0LmJhc2Uuc3R1YnMKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy92b2ljZWludGVyYWN0aW9uL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy90ZXN0cy92b2ljZWludGVyYWN0aW9uL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggYjM4OTA5Yi4uNWQ3YzAwZiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdm9pY2VpbnRlcmFjdGlvbi9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL3ZvaWNlaW50ZXJhY3Rpb24vQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtNDMsNyArNDMsNyBAQAogICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIiAvPgogICAgIDwvYXBwbGljYXRpb24+CiAKLSAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLnZvaWNlaW50ZXJhY3Rpb24uY3RzIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIG9mIGFuZHJvaWQudm9pY2VpbnRlcmFjdGlvbiI+CiAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJsaXN0ZW5lciIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ZvaWNlaW50ZXJhY3Rpb24vc2VydmljZS9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvdm9pY2VpbnRlcmFjdGlvbi9zZXJ2aWNlL0FuZHJvaWQubWsKaW5kZXggMGI1MDRkOC4uZjE5Y2Y3NCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdm9pY2VpbnRlcmFjdGlvbi9zZXJ2aWNlL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvdGVzdHMvdm9pY2VpbnRlcmFjdGlvbi9zZXJ2aWNlL0FuZHJvaWQubWsKQEAgLTIxLDcgKzIxLDcgQEAKICMgYW5kIHdoZW4gYnVpbHQgZXhwbGljaXRseSBwdXQgaXQgaW4gdGhlIGRhdGEgcGFydGl0aW9uCiBMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQogCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gQ3RzVm9pY2VJbnRlcmFjdGlvbkNvbW1vbiBjdHN0ZXN0cnVubmVyIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNWb2ljZUludGVyYWN0aW9uQ29tbW9uIGN0c3Rlc3RydW5uZXItYXh0IGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0CiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdm9pY2VpbnRlcmFjdGlvbi9zZXJ2aWNlL3NyYy9hbmRyb2lkL3ZvaWNlaW50ZXJhY3Rpb24vc2VydmljZS9NYWluSW50ZXJhY3Rpb25TZXNzaW9uLmphdmEgYi90ZXN0cy90ZXN0cy92b2ljZWludGVyYWN0aW9uL3NlcnZpY2Uvc3JjL2FuZHJvaWQvdm9pY2VpbnRlcmFjdGlvbi9zZXJ2aWNlL01haW5JbnRlcmFjdGlvblNlc3Npb24uamF2YQppbmRleCA2YWRhMWI4Li4yMDNiZTRkIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy92b2ljZWludGVyYWN0aW9uL3NlcnZpY2Uvc3JjL2FuZHJvaWQvdm9pY2VpbnRlcmFjdGlvbi9zZXJ2aWNlL01haW5JbnRlcmFjdGlvblNlc3Npb24uamF2YQorKysgYi90ZXN0cy90ZXN0cy92b2ljZWludGVyYWN0aW9uL3NlcnZpY2Uvc3JjL2FuZHJvaWQvdm9pY2VpbnRlcmFjdGlvbi9zZXJ2aWNlL01haW5JbnRlcmFjdGlvblNlc3Npb24uamF2YQpAQCAtMjAsNiArMjAsNyBAQAogaW1wb3J0IGFuZHJvaWQuYXBwLlZvaWNlSW50ZXJhY3Rvci5Qcm9tcHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uTGF1bmNoZXJBcHBzOwogaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNUYXNrOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQuc2VydmljZS52b2ljZS5Wb2ljZUludGVyYWN0aW9uU2Vzc2lvbjsKQEAgLTQ2LDYgKzQ3LDEwIEBACiAgICAgcHVibGljIHZvaWQgb25DcmVhdGUoKSB7CiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKCk7CiAgICAgICAgIEludGVudCBzZXNzaW9uU3RhcnRlZCA9IG5ldyBJbnRlbnQoKTsKKyAgICAgICAgc2Vzc2lvblN0YXJ0ZWQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfUkVDRUlWRVJfRk9SRUdST1VORCk7CisgICAgICAgIGlmICghZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoTGF1bmNoZXJBcHBzLmNsYXNzKS5oYXNTaG9ydGN1dEhvc3RQZXJtaXNzaW9uKCkpIHsKKyAgICAgICAgICAgIHNlc3Npb25TdGFydGVkLnB1dEV4dHJhKCJlcnJvciIsICJEb2VzIG5vdCBoYXZlIHNob3J0Y3V0IHBlcm1pc3Npb24iKTsKKyAgICAgICAgfQogICAgICAgICBzZXNzaW9uU3RhcnRlZC5zZXRDbGFzc05hbWUoImFuZHJvaWQudm9pY2VpbnRlcmFjdGlvbi5jdHMiLAogICAgICAgICAgICAgICAgICJhbmRyb2lkLnZvaWNlaW50ZXJhY3Rpb24uY3RzLlZvaWNlSW50ZXJhY3Rpb25UZXN0UmVjZWl2ZXIiKTsKICAgICAgICAgZ2V0Q29udGV4dCgpLnNlbmRCcm9hZGNhc3Qoc2Vzc2lvblN0YXJ0ZWQpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdm9pY2VpbnRlcmFjdGlvbi9zcmMvYW5kcm9pZC92b2ljZWludGVyYWN0aW9uL2N0cy9Mb2NhbFZvaWNlSW50ZXJhY3Rpb25UZXN0LmphdmEgYi90ZXN0cy90ZXN0cy92b2ljZWludGVyYWN0aW9uL3NyYy9hbmRyb2lkL3ZvaWNlaW50ZXJhY3Rpb24vY3RzL0xvY2FsVm9pY2VJbnRlcmFjdGlvblRlc3QuamF2YQppbmRleCAwNzIzNmIyLi42NmM5NDVhIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy92b2ljZWludGVyYWN0aW9uL3NyYy9hbmRyb2lkL3ZvaWNlaW50ZXJhY3Rpb24vY3RzL0xvY2FsVm9pY2VJbnRlcmFjdGlvblRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy92b2ljZWludGVyYWN0aW9uL3NyYy9hbmRyb2lkL3ZvaWNlaW50ZXJhY3Rpb24vY3RzL0xvY2FsVm9pY2VJbnRlcmFjdGlvblRlc3QuamF2YQpAQCAtNzEsNyArNzEsNiBAQAogICAgICAgICBpZiAoIW1IYXNGZWF0dXJlKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgVm9pY2VJbnRlcmFjdGlvblRlc3RSZWNlaXZlci5zU2VydmljZVN0YXJ0ZWRMYXRjaC5hd2FpdCg1LCBUaW1lVW5pdC5TRUNPTkRTKTsKIAogICAgICAgICBhc3NlcnRUcnVlKCJEb2Vzbid0IHN1cHBvcnQgTG9jYWxWb2ljZUludGVyYWN0aW9uIiwKICAgICAgICAgICAgICAgICBtVGVzdEFjdGl2aXR5LmlzTG9jYWxWb2ljZUludGVyYWN0aW9uU3VwcG9ydGVkKCkpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdm9pY2VpbnRlcmFjdGlvbi9zcmMvYW5kcm9pZC92b2ljZWludGVyYWN0aW9uL2N0cy9Wb2ljZUludGVyYWN0aW9uVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvdm9pY2VpbnRlcmFjdGlvbi9zcmMvYW5kcm9pZC92b2ljZWludGVyYWN0aW9uL2N0cy9Wb2ljZUludGVyYWN0aW9uVGVzdC5qYXZhCmluZGV4IDc3YzlmMjYuLjFhYmQwMGYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3ZvaWNlaW50ZXJhY3Rpb24vc3JjL2FuZHJvaWQvdm9pY2VpbnRlcmFjdGlvbi9jdHMvVm9pY2VJbnRlcmFjdGlvblRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy92b2ljZWludGVyYWN0aW9uL3NyYy9hbmRyb2lkL3ZvaWNlaW50ZXJhY3Rpb24vY3RzL1ZvaWNlSW50ZXJhY3Rpb25UZXN0LmphdmEKQEAgLTg3LDcgKzg3LDcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFZvaWNlSW50ZXJhY3Rpb25UZXN0UmVjZWl2ZXIuc1NlcnZpY2VTdGFydGVkTGF0Y2guYXdhaXQoNSwgVGltZVVuaXQuU0VDT05EUyk7CisgICAgICAgIFZvaWNlSW50ZXJhY3Rpb25UZXN0UmVjZWl2ZXIud2FpdFNlc3Npb25TdGFydGVkKHRoaXMsIDUsIFRpbWVVbml0LlNFQ09ORFMpOwogCiAgICAgICAgIGlmICghbUhhc0ZlYXR1cmUpIHsKICAgICAgICAgICAgIExvZy5pKFRBRywgIlRoZSBkZXZpY2UgZG9lc24ndCBzdXBwb3J0IGZlYXR1cmU6ICIgKyBGRUFUVVJFX1ZPSUNFX1JFQ09HTklaRVJTKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ZvaWNlaW50ZXJhY3Rpb24vc3JjL2FuZHJvaWQvdm9pY2VpbnRlcmFjdGlvbi9jdHMvVm9pY2VJbnRlcmFjdGlvblRlc3RSZWNlaXZlci5qYXZhIGIvdGVzdHMvdGVzdHMvdm9pY2VpbnRlcmFjdGlvbi9zcmMvYW5kcm9pZC92b2ljZWludGVyYWN0aW9uL2N0cy9Wb2ljZUludGVyYWN0aW9uVGVzdFJlY2VpdmVyLmphdmEKaW5kZXggMTE4ZjA0OS4uN2Y4NzVjNCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdm9pY2VpbnRlcmFjdGlvbi9zcmMvYW5kcm9pZC92b2ljZWludGVyYWN0aW9uL2N0cy9Wb2ljZUludGVyYWN0aW9uVGVzdFJlY2VpdmVyLmphdmEKKysrIGIvdGVzdHMvdGVzdHMvdm9pY2VpbnRlcmFjdGlvbi9zcmMvYW5kcm9pZC92b2ljZWludGVyYWN0aW9uL2N0cy9Wb2ljZUludGVyYWN0aW9uVGVzdFJlY2VpdmVyLmphdmEKQEAgLTIxLDE1ICsyMSwzMSBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAoraW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogCiBwdWJsaWMgY2xhc3MgVm9pY2VJbnRlcmFjdGlvblRlc3RSZWNlaXZlciBleHRlbmRzIEJyb2FkY2FzdFJlY2VpdmVyIHsKIAotICAgIHB1YmxpYyBzdGF0aWMgQ291bnREb3duTGF0Y2ggc1NlcnZpY2VTdGFydGVkTGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgQ291bnREb3duTGF0Y2ggc1NlcnZpY2VTdGFydGVkTGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgSW50ZW50IHNSZWNlaXZlZEludGVudDsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3YWl0U2Vzc2lvblN0YXJ0ZWQoVGVzdENhc2UgdGVzdENhc2UsIGxvbmcgdGltZW91dCwgVGltZVVuaXQgdW5pdCkKKyAgICAgICAgICAgIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghc1NlcnZpY2VTdGFydGVkTGF0Y2guYXdhaXQoNSwgVGltZVVuaXQuU0VDT05EUykpIHsKKyAgICAgICAgICAgIHRlc3RDYXNlLmZhaWwoIlRpbWVkIG91dCB3YWl0aW5nIGZvciBzZXNzaW9uIHRvIHN0YXJ0Iik7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGVycm9yID0gc1JlY2VpdmVkSW50ZW50LmdldFN0cmluZ0V4dHJhKCJlcnJvciIpOworICAgICAgICBpZiAoZXJyb3IgIT0gbnVsbCkgeworICAgICAgICAgICAgdGVzdENhc2UuZmFpbChlcnJvcik7CisgICAgICAgIH0KKyAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CiAgICAgICAgIExvZy5pKCJWb2ljZUludGVyYWN0aW9uVGVzdFJlY2VpdmVyIiwgIkdvdCBicm9hZGNhc3QgdGhhdCBNYWluSW50ZXJhY3Rpb25TZXJ2aWNlIHN0YXJ0ZWQiKTsKKyAgICAgICAgc1JlY2VpdmVkSW50ZW50ID0gaW50ZW50OwogICAgICAgICBzU2VydmljZVN0YXJ0ZWRMYXRjaC5jb3VudERvd24oKTsKICAgICB9CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdm9pY2VpbnRlcmFjdGlvbi90ZXN0YXBwL3NyYy9hbmRyb2lkL3ZvaWNlaW50ZXJhY3Rpb24vdGVzdGFwcC9UZXN0QXBwLmphdmEgYi90ZXN0cy90ZXN0cy92b2ljZWludGVyYWN0aW9uL3Rlc3RhcHAvc3JjL2FuZHJvaWQvdm9pY2VpbnRlcmFjdGlvbi90ZXN0YXBwL1Rlc3RBcHAuamF2YQppbmRleCBkYmZiMDMxLi43YzZjZjUzIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy92b2ljZWludGVyYWN0aW9uL3Rlc3RhcHAvc3JjL2FuZHJvaWQvdm9pY2VpbnRlcmFjdGlvbi90ZXN0YXBwL1Rlc3RBcHAuamF2YQorKysgYi90ZXN0cy90ZXN0cy92b2ljZWludGVyYWN0aW9uL3Rlc3RhcHAvc3JjL2FuZHJvaWQvdm9pY2VpbnRlcmFjdGlvbi90ZXN0YXBwL1Rlc3RBcHAuamF2YQpAQCAtMTM1LDYgKzEzNSw3IEBACiAKICAgICBwcml2YXRlIHZvaWQgYnJvYWRjYXN0UmVzdWx0cygpIHsKICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoVXRpbHMuQlJPQURDQVNUX0lOVEVOVCk7CisgICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19SRUNFSVZFUl9GT1JFR1JPVU5EKTsKICAgICAgICAgaW50ZW50LnB1dEV4dHJhcyhtVG90YWxJbmZvKTsKICAgICAgICAgTG9nLmkoVEFHLCAiYnJvYWRjYXN0aW5nOiAiICsgaW50ZW50LnRvU3RyaW5nKCkgKyAiLCBCdW5kbGUgPSAiICsgbVRvdGFsSW5mby50b1N0cmluZygpKTsKICAgICAgICAgc2VuZE9yZGVyZWRCcm9hZGNhc3QoaW50ZW50LCBudWxsLCBuZXcgRG9uZVJlY2VpdmVyKCksCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy92b2ljZXNldHRpbmdzL0FuZHJvaWQubWsgYi90ZXN0cy90ZXN0cy92b2ljZXNldHRpbmdzL0FuZHJvaWQubWsKaW5kZXggY2FkMzZjYi4uZjgxYWZhYSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdm9pY2VzZXR0aW5ncy9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3Rlc3RzL3ZvaWNlc2V0dGluZ3MvQW5kcm9pZC5tawpAQCAtMjEsNyArMjEsOSBAQAogIyBhbmQgd2hlbiBidWlsdCBleHBsaWNpdGx5IHB1dCBpdCBpbiB0aGUgZGF0YSBwYXJ0aXRpb24KIExPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCiAKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjdHN0ZXN0cnVubmVyIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjdHN0ZXN0cnVubmVyLWF4dCBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dAorCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzIGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvdm9pY2VzZXR0aW5ncy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdGVzdHMvdm9pY2VzZXR0aW5ncy9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGNmMWZhMWEuLjVlYTZhODQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3ZvaWNlc2V0dGluZ3MvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy92b2ljZXNldHRpbmdzL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTM1LDcgKzM1LDcgQEAKICAgICAgICAgPC9hY3Rpdml0eT4KICAgICA8L2FwcGxpY2F0aW9uPgogCi0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC52b2ljZXNldHRpbmdzLmN0cyIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBvZiBhbmRyb2lkLnZvaWNlc2V0dGluZ3MiPgogICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0ibGlzdGVuZXIiCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy92b2ljZXNldHRpbmdzL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL3ZvaWNlc2V0dGluZ3MvQW5kcm9pZFRlc3QueG1sCmluZGV4IDQyMWRmYjcuLjViOTc4MjMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3ZvaWNlc2V0dGluZ3MvQW5kcm9pZFRlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL3ZvaWNlc2V0dGluZ3MvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgVm9pY2UgU2V0dGluZ3MgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImZyYW1ld29yayIgLz4KICAgICA8b3B0aW9uIG5hbWU9Im5vdC1zaGFyZGFibGUiIHZhbHVlPSJ0cnVlIiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgpAQCAtMjMsNiArMjQsMTAgQEAKICAgICA8L3RhcmdldF9wcmVwYXJlcj4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlJ1bkNvbW1hbmRUYXJnZXRQcmVwYXJlciI+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icnVuLWNvbW1hbmQiIHZhbHVlPSJzZXR0aW5ncyBwdXQgc2VjdXJlIHZvaWNlX2ludGVyYWN0aW9uX3NlcnZpY2UgYW5kcm9pZC52b2ljZXNldHRpbmdzLnNlcnZpY2UvLk1haW5JbnRlcmFjdGlvblNlcnZpY2UiIC8+CisKKyAgICAgICAgPCEtLSBDbG9zZSB0aGUgInR1cm4gb24gYmF0dGVyeSBzYXZlcj8iIGRpYWxvZywgYW5kIHdhaXQgZm9yIHRoZSBicm9hZGNhc3QgcXVldWUgdG8gZHJhaW4uIC0tPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlYXJkb3duLWNvbW1hbmQiIHZhbHVlPSJhbSBicm9hZGNhc3QgLS1yZWNlaXZlci1mb3JlZ3JvdW5kIC1hIGFuZHJvaWQuaW50ZW50LmFjdGlvbi5DTE9TRV9TWVNURU1fRElBTE9HUyIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZWFyZG93bi1jb21tYW5kIiB2YWx1ZT0iYW0gd2FpdC1mb3ItYnJvYWRjYXN0LWlkbGUiIC8+CiAgICAgPC90YXJnZXRfcHJlcGFyZXI+CiAgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkFuZHJvaWRKVW5pdFRlc3QiID4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJwYWNrYWdlIiB2YWx1ZT0iYW5kcm9pZC52b2ljZXNldHRpbmdzLmN0cyIgLz4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3ZvaWNlc2V0dGluZ3Mvc2VydmljZS9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvdm9pY2VzZXR0aW5ncy9zZXJ2aWNlL0FuZHJvaWQubWsKaW5kZXggZDUzYzUyYi4uMGQ4NmJmOCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvdm9pY2VzZXR0aW5ncy9zZXJ2aWNlL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvdGVzdHMvdm9pY2VzZXR0aW5ncy9zZXJ2aWNlL0FuZHJvaWQubWsKQEAgLTIxLDcgKzIxLDcgQEAKICMgYW5kIHdoZW4gYnVpbHQgZXhwbGljaXRseSBwdXQgaXQgaW4gdGhlIGRhdGEgcGFydGl0aW9uCiBMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQogCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY3RzdGVzdHJ1bm5lciBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY3RzdGVzdHJ1bm5lci1heHQgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy93ZWJraXQvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL3dlYmtpdC9BbmRyb2lkLm1rCmluZGV4IGM1NmYwMGUuLjc2MjMxYjAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3dlYmtpdC9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3Rlc3RzL3dlYmtpdC9BbmRyb2lkLm1rCkBAIC0yMSwxMyArMjEsMTcgQEAKICMgYW5kIHdoZW4gYnVpbHQgZXhwbGljaXRseSBwdXQgaXQgaW4gdGhlIGRhdGEgcGFydGl0aW9uCiBMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQogCi1MT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyIG9yZy5hcGFjaGUuaHR0cC5sZWdhY3kKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IFwKKyAgICBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzIFwKKyAgICBvcmcuYXBhY2hlLmh0dHAubGVnYWN5IFwKKyAgICBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicyBcCisKIAogTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKLSAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsIFwKLSAgICBjdHNkZXZpY2V1dGlsbGVnYWN5IFwKKyAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBcCisgICAgY3RzZGV2aWNldXRpbGxlZ2FjeS1heHQgXAogICAgIGN0c3Rlc3RzZXJ2ZXIgXAotICAgIGN0c3Rlc3RydW5uZXIKKyAgICBjdHN0ZXN0cnVubmVyLWF4dAogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKQEAgLTM4LDUgKzQyLDYgQEAKIAogIyB1bmNvbW1lbnQgd2hlbiBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0KiBhcmUgcmVtb3ZlZCBvciBwYXJ0IG9mIFNESwogI0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKK0xPQ0FMX1BSSVZBVEVfUExBVEZPUk1fQVBJUyA6PSB0cnVlCiAKIGluY2x1ZGUgJChCVUlMRF9DVFNfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dlYmtpdC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdGVzdHMvd2Via2l0L0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggODM3NzVkZi4uYWEzNTE2MiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvd2Via2l0L0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvd2Via2l0L0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTIyLDcgKzIyLDcgQEAKICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkFDQ0VTU19MT0NBVElPTl9FWFRSQV9DT01NQU5EUyIvPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uSU5URVJORVQiIC8+CiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5BQ0NFU1NfRklORV9MT0NBVElPTiIgLz4KLSAgICA8YXBwbGljYXRpb24gYW5kcm9pZDptYXhSZWNlbnRzPSIxIj4KKyAgICA8YXBwbGljYXRpb24gYW5kcm9pZDptYXhSZWNlbnRzPSIxIiBhbmRyb2lkOnVzZXNDbGVhcnRleHRUcmFmZmljPSJ0cnVlIj4KICAgICAgICAgPHByb3ZpZGVyIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC53ZWJraXQuY3RzLk1vY2tDb250ZW50UHJvdmlkZXIiCiAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIgogICAgICAgICAgICAgICAgICAgYW5kcm9pZDphdXRob3JpdGllcz0iYW5kcm9pZC53ZWJraXQuY3RzLk1vY2tDb250ZW50UHJvdmlkZXIiIC8+CkBAIC01NiwxMSArNTYsMjIgQEAKICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KICAgICAgICAgPC9hY3Rpdml0eT4KIAotICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC53ZWJraXQuV2ViVmlldy5FbmFibGVTYWZlQnJvd3NpbmciIGFuZHJvaWQ6dmFsdWU9ImZhbHNlIiAvPgorICAgICAgICA8c2VydmljZSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQud2Via2l0LmN0cy5UZXN0UHJvY2Vzc1NlcnZpY2VBIgorICAgICAgICAgICAgICAgICBhbmRyb2lkOnByb2Nlc3M9Ijp0ZXN0cHJvY2Vzc0EiCisgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9ImZhbHNlIiAvPgorCisgICAgICAgIDxzZXJ2aWNlIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC53ZWJraXQuY3RzLlRlc3RQcm9jZXNzU2VydmljZUIiCisgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cHJvY2Vzcz0iOnRlc3Rwcm9jZXNzQiIKKyAgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0iZmFsc2UiIC8+CisKKyAgICAgICAgPCEtLSBTcGVjaWZ5IGEgcHJlbG9hZGVkIGZvbnQgbGlzdCB0byBlbnN1cmUgdGhhdCB0aGlzIGRvZXNuJ3QgaW50ZXJmZXJlCisgICAgICAgICAgICAgd2l0aCB0aGUgb3BlcmF0aW9uIG9mIHRoZSByZW5kZXJlciBwcm9jZXNzIChhcyBpbiBiLzcwOTY4NDUxKQorICAgICAgICAgLS0+CisgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJwcmVsb2FkZWRfZm9udHMiIGFuZHJvaWQ6cmVzb3VyY2U9IkBhcnJheS9wcmVsb2FkZWRfZm9udHMiIC8+CiAKICAgICA8L2FwcGxpY2F0aW9uPgogCi0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC53ZWJraXQuY3RzIgogICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIG9mIGFuZHJvaWQud2Via2l0Ij4KICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9Imxpc3RlbmVyIgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2Via2l0L0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL3dlYmtpdC9BbmRyb2lkVGVzdC54bWwKaW5kZXggYTM4MDFlNC4uOTAzYWVmNyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvd2Via2l0L0FuZHJvaWRUZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy93ZWJraXQvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgV2Via2l0IHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJ3ZWJ2aWV3IiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRhcmdldHByZXAuTG9jYXRpb25DaGVjayIgLz4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dlYmtpdC9yZXMvdmFsdWVzL3ByZWxvYWRlZF9mb250cy54bWwgYi90ZXN0cy90ZXN0cy93ZWJraXQvcmVzL3ZhbHVlcy9wcmVsb2FkZWRfZm9udHMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NzE5ODIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy93ZWJraXQvcmVzL3ZhbHVlcy9wcmVsb2FkZWRfZm9udHMueG1sCkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cmVzb3VyY2VzPgorICAgIDwhLS0gU3BlY2lmeSBhIHByZWxvYWRlZCBmb250IGxpc3QgdG8gZW5zdXJlIHRoYXQgdGhpcyBkb2Vzbid0IGludGVyZmVyZQorICAgICAgICAgd2l0aCB0aGUgb3BlcmF0aW9uIG9mIHRoZSByZW5kZXJlciBwcm9jZXNzIChhcyBpbiBiLzcwOTY4NDUxKS4KKyAgICAgICAgIFRoZSBsaXN0IGlzIGludGVudGlvbmFsbHkgZW1wdHksIG9ubHkgdGhlIHJlc291cmNlIGxvb2t1cCBmb3IgdGhlIGxpc3QKKyAgICAgICAgIGl0c2VsZiBuZWVkcyB0byBiZSBjb3ZlcmVkLgorICAgICAtLT4KKyAgICA8YXJyYXkgbmFtZT0icHJlbG9hZGVkX2ZvbnRzIiB0cmFuc2xhdGFibGU9ImZhbHNlIiAvPgorICAgIDwhLS0gR2l2ZSB0aGUgcHJlbG9hZGVkIGZvbnQgbGlzdCByZXNvdXJjZSBhbiBJRCB0aGF0J3MgdW5saWtlbHkgdG8gYmUKKyAgICAgICAgIHByZXNlbnQgaW4gdGhlIEFQSyBpbXBsZW1lbnRpbmcgV2ViVmlldyB0byBlbnN1cmUgaXQgd2lsbCBjcmFzaCBpZgorICAgICAgICAgYWN0dWFsbHkgbG9va2VkIHVwIGluIHRoZSByZW5kZXJlciBwcm9jZXNzLgorICAgICAtLT4KKyAgICA8cHVibGljIHR5cGU9ImFycmF5IiBuYW1lPSJwcmVsb2FkZWRfZm9udHMiIGlkPSIweDdmNDI0MjQyIiAvPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy93ZWJraXQvc3JjL2FuZHJvaWQvd2Via2l0L2N0cy9Qb3N0TWVzc2FnZVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3dlYmtpdC9zcmMvYW5kcm9pZC93ZWJraXQvY3RzL1Bvc3RNZXNzYWdlVGVzdC5qYXZhCmluZGV4IGVjYzNlNGYuLjBmYTIzOWQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3dlYmtpdC9zcmMvYW5kcm9pZC93ZWJraXQvY3RzL1Bvc3RNZXNzYWdlVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3dlYmtpdC9zcmMvYW5kcm9pZC93ZWJraXQvY3RzL1Bvc3RNZXNzYWdlVGVzdC5qYXZhCkBAIC0xMDEsMTIgKzEwMSwyNiBAQAogCiAgICAgLy8gUG9zdCBhIHN0cmluZyBtZXNzYWdlIHRvIG1haW4gZnJhbWUgYW5kIG1ha2Ugc3VyZSBpdCBpcyByZWNlaXZlZC4KICAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlTWVzc2FnZVRvTWFpbkZyYW1lKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIHZlcmlmeVBvc3RNZXNzYWdlVG9PcmlnaW4oVXJpLnBhcnNlKEJBU0VfVVJJKSk7CisgICAgfQorCisgICAgLy8gUG9zdCBhIHN0cmluZyBtZXNzYWdlIHRvIG1haW4gZnJhbWUgcGFzc2luZyBhIHdpbGRjYXJkIGFzIHRhcmdldCBvcmlnaW4KKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2lsZGNhcmRPcmlnaW5NYXRjaGVzQW55dGhpbmcoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgdmVyaWZ5UG9zdE1lc3NhZ2VUb09yaWdpbihVcmkucGFyc2UoIioiKSk7CisgICAgfQorCisgICAgLy8gUG9zdCBhIHN0cmluZyBtZXNzYWdlIHRvIG1haW4gZnJhbWUgcGFzc2luZyBhbiBlbXB0eSBzdHJpbmcgYXMgdGFyZ2V0IG9yaWdpbgorICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eVN0cmluZ09yaWdpbk1hdGNoZXNBbnl0aGluZygpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICB2ZXJpZnlQb3N0TWVzc2FnZVRvT3JpZ2luKFVyaS5wYXJzZSgiIikpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlQb3N0TWVzc2FnZVRvT3JpZ2luKFVyaSBvcmlnaW4pIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBpZiAoIU51bGxXZWJWaWV3VXRpbHMuaXNXZWJWaWV3QXZhaWxhYmxlKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBsb2FkUGFnZShUSVRMRV9GUk9NX1BPU1RfTUVTU0FHRSk7CiAgICAgICAgIFdlYk1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBXZWJNZXNzYWdlKFdFQlZJRVdfTUVTU0FHRSk7Ci0gICAgICAgIG1PblVpVGhyZWFkLnBvc3RXZWJNZXNzYWdlKG1lc3NhZ2UsIFVyaS5wYXJzZShCQVNFX1VSSSkpOworICAgICAgICBtT25VaVRocmVhZC5wb3N0V2ViTWVzc2FnZShtZXNzYWdlLCBvcmlnaW4pOwogICAgICAgICB3YWl0Rm9yVGl0bGUoV0VCVklFV19NRVNTQUdFKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dlYmtpdC9zcmMvYW5kcm9pZC93ZWJraXQvY3RzL1Rlc3RIdG1sQ29uc3RhbnRzLmphdmEgYi90ZXN0cy90ZXN0cy93ZWJraXQvc3JjL2FuZHJvaWQvd2Via2l0L2N0cy9UZXN0SHRtbENvbnN0YW50cy5qYXZhCmluZGV4IDY4ZDk0NGIuLjI5OTZjNzYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3dlYmtpdC9zcmMvYW5kcm9pZC93ZWJraXQvY3RzL1Rlc3RIdG1sQ29uc3RhbnRzLmphdmEKKysrIGIvdGVzdHMvdGVzdHMvd2Via2l0L3NyYy9hbmRyb2lkL3dlYmtpdC9jdHMvVGVzdEh0bWxDb25zdGFudHMuamF2YQpAQCAtNjksNiArNjksNyBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUT1BfTE9BRElOR19VUkwgPSAid2Via2l0L3Rlc3Rfc3RvcF9sb2FkaW5nLmh0bWwiOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJMQU5LX1RBR19VUkwgPSAid2Via2l0L2JsYW5rX3RhZy5odG1sIjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX1dJVEhfTElOS19VUkwgPSAid2Via2l0L3BhZ2Vfd2l0aF9saW5rLmh0bWwiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9JTl9QQUdFX1dJVEhfTElOSyA9ICJodHRwOi8vZm9vLmNvbS8iOwogICAgIC8vIE5vdCBhIHJlYWwgcGFnZSwganVzdCB0cmlnZ2VycyBhIDQwNCByZXNwb25zZS4KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT05fRVhJU1RFTlRfUEFHRV9VUkwgPSAid2Via2l0L2dlbmVyYXRlXzQwNC5odG1sIjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQURfSU1BR0VfUEFHRV9VUkwgPSAid2Via2l0L3Rlc3RfYmFkX2ltYWdlX3VybC5odG1sIjsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dlYmtpdC9zcmMvYW5kcm9pZC93ZWJraXQvY3RzL1Rlc3RQcm9jZXNzQ2xpZW50LmphdmEgYi90ZXN0cy90ZXN0cy93ZWJraXQvc3JjL2FuZHJvaWQvd2Via2l0L2N0cy9UZXN0UHJvY2Vzc0NsaWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NTQ2NDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy93ZWJraXQvc3JjL2FuZHJvaWQvd2Via2l0L2N0cy9UZXN0UHJvY2Vzc0NsaWVudC5qYXZhCkBAIC0wLDAgKzEsMTc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLndlYmtpdC5jdHM7CisKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LlNlcnZpY2VDb25uZWN0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2VuZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuYW5ub3RhdGlvbnMuR3VhcmRlZEJ5OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0aW9uRmFpbGVkRXJyb3I7CisKK2NsYXNzIFRlc3RQcm9jZXNzQ2xpZW50IGV4dGVuZHMgQXNzZXJ0IGltcGxlbWVudHMgQXV0b0Nsb3NlYWJsZSwgU2VydmljZUNvbm5lY3Rpb24geworICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgQ09OTkVDVF9USU1FT1VUX01TID0gNTAwMDsKKworICAgIHByaXZhdGUgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOworICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKKyAgICBwcml2YXRlIE1lc3NlbmdlciBtU2VydmljZTsKKyAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCisgICAgcHJpdmF0ZSBJbnRlZ2VyIG1MYXN0UmVzdWx0OworICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKKyAgICBwcml2YXRlIFRocm93YWJsZSBtTGFzdEV4Y2VwdGlvbjsKKworICAgIHByaXZhdGUgZmluYWwgTWVzc2VuZ2VyIG1SZXBseUhhbmRsZXIgPSBuZXcgTWVzc2VuZ2VyKG5ldyBSZXBseUhhbmRsZXIoTG9vcGVyLmdldE1haW5Mb29wZXIoKSkpOworCisgICAgcHVibGljIHN0YXRpYyBUZXN0UHJvY2Vzc0NsaWVudCBjcmVhdGVQcm9jZXNzQShDb250ZXh0IGNvbnRleHQpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICByZXR1cm4gbmV3IFRlc3RQcm9jZXNzQ2xpZW50KGNvbnRleHQsIFRlc3RQcm9jZXNzU2VydmljZUEuY2xhc3MpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgVGVzdFByb2Nlc3NDbGllbnQgY3JlYXRlUHJvY2Vzc0IoQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUZXN0UHJvY2Vzc0NsaWVudChjb250ZXh0LCBUZXN0UHJvY2Vzc1NlcnZpY2VCLmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdWJjbGFzcyB0aGlzIHRvIGltcGxlbWVudCB0ZXN0IGNvZGUgdG8gcnVuIG9uIHRoZSBzZXJ2aWNlIHNpZGUuCisgICAgICovCisgICAgc3RhdGljIGFic3RyYWN0IGNsYXNzIFRlc3RSdW5uYWJsZSBleHRlbmRzIEFzc2VydCB7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHJ1bihDb250ZXh0IGN0eCk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIFByb2Nlc3NGcmVzaENoZWNrZXIgZXh0ZW5kcyBUZXN0UnVubmFibGUgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBPYmplY3Qgc0ZyZXNoTG9jayA9IG5ldyBPYmplY3QoKTsKKyAgICAgICAgQEd1YXJkZWRCeSgic0ZyZXNoTG9jayIpCisgICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gc0ZyZXNoUHJvY2VzcyA9IHRydWU7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bihDb250ZXh0IGN0eCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChzRnJlc2hMb2NrKSB7CisgICAgICAgICAgICAgICAgaWYgKCFzRnJlc2hQcm9jZXNzKSB7CisgICAgICAgICAgICAgICAgICAgIGZhaWwoIlNlcnZpY2UgcHJvY2VzcyB3YXMgdW5leHBlY3RlZGx5IHJldXNlZCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzRnJlc2hQcm9jZXNzID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHJpdmF0ZSBUZXN0UHJvY2Vzc0NsaWVudChDb250ZXh0IGNvbnRleHQsIENsYXNzIHNlcnZpY2UpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIEludGVudCBpID0gbmV3IEludGVudChjb250ZXh0LCBzZXJ2aWNlKTsKKyAgICAgICAgY29udGV4dC5iaW5kU2VydmljZShpLCB0aGlzLCBDb250ZXh0LkJJTkRfQVVUT19DUkVBVEUpOworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBpZiAobVNlcnZpY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1Mb2NrLndhaXQoQ09OTkVDVF9USU1FT1VUX01TKTsKKyAgICAgICAgICAgICAgICBpZiAobVNlcnZpY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmYWlsKCJUaW1lb3V0IHdhaXRpbmcgZm9yIGNvbm5lY3Rpb24iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayB0aGF0IHdlJ3JlIHVzaW5nIGFuIGFjdHVhbCBmcmVzaCBwcm9jZXNzLgorICAgICAgICAvLyAxMDAwbXMgdGltZW91dCBpcyBwbGVudHkgc2luY2UgdGhlIHNlcnZpY2UgaXMgYWxyZWFkeSBydW5uaW5nLgorICAgICAgICBydW4oUHJvY2Vzc0ZyZXNoQ2hlY2tlci5jbGFzcywgMTAwMCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcnVuKENsYXNzIHJ1bm5hYmxlQ2xhc3MsIGxvbmcgdGltZW91dE1zKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgTWVzc2FnZSBtID0gTWVzc2FnZS5vYnRhaW4obnVsbCwgVGVzdFByb2Nlc3NTZXJ2aWNlLk1TR19SVU5fVEVTVCk7CisgICAgICAgIG0ucmVwbHlUbyA9IG1SZXBseUhhbmRsZXI7CisgICAgICAgIG0uZ2V0RGF0YSgpLnB1dFN0cmluZyhUZXN0UHJvY2Vzc1NlcnZpY2UuVEVTVF9DTEFTU19LRVksIHJ1bm5hYmxlQ2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAgICAgaW50IHJlc3VsdDsKKyAgICAgICAgVGhyb3dhYmxlIGV4Y2VwdGlvbjsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgbVNlcnZpY2Uuc2VuZChtKTsKKyAgICAgICAgICAgIGlmIChtTGFzdFJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUxvY2sud2FpdCh0aW1lb3V0TXMpOworICAgICAgICAgICAgICAgIGlmIChtTGFzdFJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZhaWwoIlRpbWVvdXQgd2FpdGluZyBmb3IgcmVzdWx0Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0ID0gbUxhc3RSZXN1bHQ7CisgICAgICAgICAgICBtTGFzdFJlc3VsdCA9IG51bGw7CisgICAgICAgICAgICBleGNlcHRpb24gPSBtTGFzdEV4Y2VwdGlvbjsKKyAgICAgICAgICAgIG1MYXN0RXhjZXB0aW9uID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVzdWx0ID09IFRlc3RQcm9jZXNzU2VydmljZS5SRVBMWV9FWENFUFRJT04pIHsKKyAgICAgICAgICAgIHRocm93IGV4Y2VwdGlvbjsKKyAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQgIT0gVGVzdFByb2Nlc3NTZXJ2aWNlLlJFUExZX09LKSB7CisgICAgICAgICAgICBmYWlsKCJVbmtub3duIHJlc3VsdCBmcm9tIHNlcnZpY2U6ICIgKyByZXN1bHQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2VuZChNZXNzYWdlLm9idGFpbihudWxsLCBUZXN0UHJvY2Vzc1NlcnZpY2UuTVNHX0VYSVRfUFJPQ0VTUykpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7fQorICAgICAgICAgICAgICAgIG1TZXJ2aWNlID0gbnVsbDsKKyAgICAgICAgICAgICAgICBtQ29udGV4dC51bmJpbmRTZXJ2aWNlKHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKENvbXBvbmVudE5hbWUgY2xhc3NOYW1lLCBJQmluZGVyIHNlcnZpY2UpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgbVNlcnZpY2UgPSBuZXcgTWVzc2VuZ2VyKHNlcnZpY2UpOworICAgICAgICAgICAgbUxvY2subm90aWZ5KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VEaXNjb25uZWN0ZWQoQ29tcG9uZW50TmFtZSBjbGFzc05hbWUpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgbVNlcnZpY2UgPSBudWxsOworICAgICAgICAgICAgbUNvbnRleHQudW5iaW5kU2VydmljZSh0aGlzKTsKKyAgICAgICAgICAgIG1MYXN0UmVzdWx0ID0gVGVzdFByb2Nlc3NTZXJ2aWNlLlJFUExZX0VYQ0VQVElPTjsKKyAgICAgICAgICAgIG1MYXN0RXhjZXB0aW9uID0gbmV3IEFzc2VydGlvbkZhaWxlZEVycm9yKCJTZXJ2aWNlIGRpc2Nvbm5lY3RlZCB1bmV4cGVjdGVkbHkiKTsKKyAgICAgICAgICAgIG1Mb2NrLm5vdGlmeSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBSZXBseUhhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyIHsKKyAgICAgICAgUmVwbHlIYW5kbGVyKExvb3BlciBsb29wZXIpIHsKKyAgICAgICAgICAgIHN1cGVyKGxvb3Blcik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgICAgIG1MYXN0UmVzdWx0ID0gbXNnLndoYXQ7CisgICAgICAgICAgICAgICAgaWYgKG1zZy53aGF0ID09IFRlc3RQcm9jZXNzU2VydmljZS5SRVBMWV9FWENFUFRJT04pIHsKKyAgICAgICAgICAgICAgICAgICAgbUxhc3RFeGNlcHRpb24gPSAoVGhyb3dhYmxlKSBtc2cuZ2V0RGF0YSgpLmdldFNlcmlhbGl6YWJsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0UHJvY2Vzc1NlcnZpY2UuUkVQTFlfRVhDRVBUSU9OX0tFWSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1Mb2NrLm5vdGlmeSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2Via2l0L3NyYy9hbmRyb2lkL3dlYmtpdC9jdHMvVGVzdFByb2Nlc3NTZXJ2aWNlLmphdmEgYi90ZXN0cy90ZXN0cy93ZWJraXQvc3JjL2FuZHJvaWQvd2Via2l0L2N0cy9UZXN0UHJvY2Vzc1NlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2U4YzRjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvd2Via2l0L3NyYy9hbmRyb2lkL3dlYmtpdC9jdHMvVGVzdFByb2Nlc3NTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53ZWJraXQuY3RzOworCisKK2ltcG9ydCBhbmRyb2lkLmFwcC5TZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzZW5nZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yOworCisvLyBTdWJjbGFzc2VzIGFyZSB0aGUgb25lcyB0aGF0IGdldCBhY3R1YWxseSB1c2VkLCBzbyBtYWtlIHRoaXMgYWJzdHJhY3QKK2Fic3RyYWN0IGNsYXNzIFRlc3RQcm9jZXNzU2VydmljZSBleHRlbmRzIFNlcnZpY2UgeworICAgIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1JVTl9URVNUID0gMDsKKyAgICBzdGF0aWMgZmluYWwgaW50IE1TR19FWElUX1BST0NFU1MgPSAxOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9DTEFTU19LRVkgPSAiY2xhc3MiOworCisgICAgc3RhdGljIGZpbmFsIGludCBSRVBMWV9PSyA9IDA7CisgICAgc3RhdGljIGZpbmFsIGludCBSRVBMWV9FWENFUFRJT04gPSAxOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQTFlfRVhDRVBUSU9OX0tFWSA9ICJleGNlcHRpb24iOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElCaW5kZXIgb25CaW5kKEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgcmV0dXJuIG1NZXNzZW5nZXIuZ2V0QmluZGVyKCk7CisgICAgfQorCisgICAgZmluYWwgTWVzc2VuZ2VyIG1NZXNzZW5nZXIgPSBuZXcgTWVzc2VuZ2VyKG5ldyBJbmNvbWluZ0hhbmRsZXIoKSk7CisKKyAgICBwcml2YXRlIGNsYXNzIEluY29taW5nSGFuZGxlciBleHRlbmRzIEhhbmRsZXIgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgaWYgKG1zZy53aGF0ID09IE1TR19FWElUX1BST0NFU1MpIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAobXNnLndoYXQgIT0gTVNHX1JVTl9URVNUKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsZWRFcnJvcigiVW5rbm93biBzZXJ2aWNlIG1lc3NhZ2UgIiArIG1zZy53aGF0KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBTdHJpbmcgdGVzdENsYXNzTmFtZSA9IG1zZy5nZXREYXRhKCkuZ2V0U3RyaW5nKFRFU1RfQ0xBU1NfS0VZKTsKKyAgICAgICAgICAgICAgICBDbGFzcyB0ZXN0Q2xhc3MgPSBDbGFzcy5mb3JOYW1lKHRlc3RDbGFzc05hbWUpOworICAgICAgICAgICAgICAgIFRlc3RQcm9jZXNzQ2xpZW50LlRlc3RSdW5uYWJsZSB0ZXN0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChUZXN0UHJvY2Vzc0NsaWVudC5UZXN0UnVubmFibGUpIHRlc3RDbGFzcy5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgIHRlc3QucnVuKFRlc3RQcm9jZXNzU2VydmljZS50aGlzKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSBtID0gTWVzc2FnZS5vYnRhaW4obnVsbCwgUkVQTFlfRVhDRVBUSU9OKTsKKyAgICAgICAgICAgICAgICAgICAgbS5nZXREYXRhKCkucHV0U2VyaWFsaXphYmxlKFJFUExZX0VYQ0VQVElPTl9LRVksIHQpOworICAgICAgICAgICAgICAgICAgICBtc2cucmVwbHlUby5zZW5kKG0pOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbXNnLnJlcGx5VG8uc2VuZChNZXNzYWdlLm9idGFpbihudWxsLCBSRVBMWV9PSykpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dlYmtpdC9zcmMvYW5kcm9pZC93ZWJraXQvY3RzL1Rlc3RQcm9jZXNzU2VydmljZUEuamF2YSBiL3Rlc3RzL3Rlc3RzL3dlYmtpdC9zcmMvYW5kcm9pZC93ZWJraXQvY3RzL1Rlc3RQcm9jZXNzU2VydmljZUEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDI0MWYwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvd2Via2l0L3NyYy9hbmRyb2lkL3dlYmtpdC9jdHMvVGVzdFByb2Nlc3NTZXJ2aWNlQS5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQud2Via2l0LmN0czsKKworLy8gV2UgbmVlZCB0d28gZGlmZmVyZW50IGluc3RhbmNlcyBvZiB0aGUgc2FtZSBzZXJ2aWNlLCBzbyBtYWtlIHR3byBzdWJjbGFzc2VzLgorcHVibGljIGNsYXNzIFRlc3RQcm9jZXNzU2VydmljZUEgZXh0ZW5kcyBUZXN0UHJvY2Vzc1NlcnZpY2Uge30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dlYmtpdC9zcmMvYW5kcm9pZC93ZWJraXQvY3RzL1Rlc3RQcm9jZXNzU2VydmljZUIuamF2YSBiL3Rlc3RzL3Rlc3RzL3dlYmtpdC9zcmMvYW5kcm9pZC93ZWJraXQvY3RzL1Rlc3RQcm9jZXNzU2VydmljZUIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjM3NmY3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvd2Via2l0L3NyYy9hbmRyb2lkL3dlYmtpdC9jdHMvVGVzdFByb2Nlc3NTZXJ2aWNlQi5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQud2Via2l0LmN0czsKKworLy8gV2UgbmVlZCB0d28gZGlmZmVyZW50IGluc3RhbmNlcyBvZiB0aGUgc2FtZSBzZXJ2aWNlLCBzbyBtYWtlIHR3byBzdWJjbGFzc2VzLgorcHVibGljIGNsYXNzIFRlc3RQcm9jZXNzU2VydmljZUIgZXh0ZW5kcyBUZXN0UHJvY2Vzc1NlcnZpY2Uge30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dlYmtpdC9zcmMvYW5kcm9pZC93ZWJraXQvY3RzL1RyYWNpbmdDb250cm9sbGVyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvd2Via2l0L3NyYy9hbmRyb2lkL3dlYmtpdC9jdHMvVHJhY2luZ0NvbnRyb2xsZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIxYmUzYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3dlYmtpdC9zcmMvYW5kcm9pZC93ZWJraXQvY3RzL1RyYWNpbmdDb250cm9sbGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLndlYmtpdC5jdHM7CisKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI7CitpbXBvcnQgYW5kcm9pZC50ZXN0LlVpVGhyZWFkVGVzdDsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5UcmFjaW5nQ29uZmlnOworaW1wb3J0IGFuZHJvaWQud2Via2l0LlRyYWNpbmdDb250cm9sbGVyOworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXc7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuY3RzLldlYlZpZXdPblVpVGhyZWFkLldhaXRGb3JMb2FkZWRDbGllbnQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLk51bGxXZWJWaWV3VXRpbHM7CitpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5Qb2xsaW5nQ2hlY2s7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkRmFjdG9yeTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworcHVibGljIGNsYXNzIFRyYWNpbmdDb250cm9sbGVyVGVzdCBleHRlbmRzIEFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyPFdlYlZpZXdDdHNBY3Rpdml0eT4geworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUcmFjaW5nUmVjZWl2ZXIgZXh0ZW5kcyBPdXRwdXRTdHJlYW0geworICAgICAgICBwcml2YXRlIGludCBtQ2h1bmtDb3VudDsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1Db21wbGV0ZTsKKyAgICAgICAgcHJpdmF0ZSBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtOworCisgICAgICAgIHB1YmxpYyBUcmFjaW5nUmVjZWl2ZXIoKSB7CisgICAgICAgICAgICBvdXRwdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGNodW5rKSB7CisgICAgICAgICAgICB2YWxpZGF0ZVRocmVhZCgpOworICAgICAgICAgICAgbUNodW5rQ291bnQrKzsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLndyaXRlKGNodW5rKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgICAgIHZhbGlkYXRlVGhyZWFkKCk7CisgICAgICAgICAgICBtQ29tcGxldGUgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgeworICAgICAgICAgICAgZmFpbCgiZmx1c2ggc2hvdWxkIG5vdCBiZSBjYWxsZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgeworICAgICAgICAgICAgZmFpbCgid3JpdGUoaW50KSBzaG91bGQgbm90IGJlIGNhbGxlZCIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB7CisgICAgICAgICAgICBmYWlsKCJ3cml0ZShieXRlW10sIGludCwgaW50KSBzaG91bGQgbm90IGJlIGNhbGxlZCIpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlVGhyZWFkKCkgeworICAgICAgICAgICAgLy8gRW5zdXJlIHRoZSBjYWxsYmFja3MgYXJlIGNhbGxlZCBvbiB0aGUgY29ycmVjdCAoZXhlY3V0b3IpIHRocmVhZC4KKyAgICAgICAgICAgIGFzc2VydFRydWUoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkuc3RhcnRzV2l0aChFWEVDVVRPUl9USFJFQURfUFJFRklYKSk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgZ2V0TmJDaHVua3MoKSB7IHJldHVybiBtQ2h1bmtDb3VudDsgfQorICAgICAgICBib29sZWFuIGdldENvbXBsZXRlKCkgeyByZXR1cm4gbUNvbXBsZXRlOyB9CisKKyAgICAgICAgQ2FsbGFibGU8Qm9vbGVhbj4gZ2V0Q29tcGxldGVDYWxsYWJsZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ2FsbGFibGU8Qm9vbGVhbj4oKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIEJvb2xlYW4gY2FsbCgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldENvbXBsZXRlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgfQorCisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKSB7IHJldHVybiBvdXRwdXRTdHJlYW07IH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUE9MTElOR19USU1FT1VUID0gNjAgKiAxMDAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFWEVDVVRPUl9USU1FT1VUID0gMTA7IC8vIHRpbWVvdXQgb2YgZXhlY3V0b3Igc2h1dGRvd24gaW4gc2Vjb25kcworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWEVDVVRPUl9USFJFQURfUFJFRklYID0gIlRyYWNpbmdFeGVjdXRvclRocmVhZCI7CisgICAgcHJpdmF0ZSBXZWJWaWV3T25VaVRocmVhZCBtT25VaVRocmVhZDsKKyAgICBwcml2YXRlIEV4ZWN1dG9yU2VydmljZSBzaW5nbGVUaHJlYWRFeGVjdXRvcjsKKworICAgIHB1YmxpYyBUcmFjaW5nQ29udHJvbGxlclRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIoImFuZHJvaWQud2Via2l0LmN0cyIsIFdlYlZpZXdDdHNBY3Rpdml0eS5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgV2ViVmlldyB3ZWJ2aWV3ID0gZ2V0QWN0aXZpdHkoKS5nZXRXZWJWaWV3KCk7CisgICAgICAgIGlmICh3ZWJ2aWV3ID09IG51bGwpIHJldHVybjsKKyAgICAgICAgbU9uVWlUaHJlYWQgPSBuZXcgV2ViVmlld09uVWlUaHJlYWQodGhpcywgd2Vidmlldyk7CisgICAgICAgIHNpbmdsZVRocmVhZEV4ZWN1dG9yID0gRXhlY3V0b3JzLm5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yKGdldEN1c3RvbVRocmVhZEZhY3RvcnkoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gbWFrZSBzdXJlIHRvIHN0b3AgZXZlcnl0aGluZyBhbmQgY2xlYW4gdXAKKyAgICAgICAgZW5zdXJlVHJhY2luZ1N0b3BwZWQoKTsKKyAgICAgICAgaWYgKHNpbmdsZVRocmVhZEV4ZWN1dG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNpbmdsZVRocmVhZEV4ZWN1dG9yLnNodXRkb3duKCk7CisgICAgICAgICAgICBpZiAoIXNpbmdsZVRocmVhZEV4ZWN1dG9yLmF3YWl0VGVybWluYXRpb24oRVhFQ1VUT1JfVElNRU9VVCwgVGltZVVuaXQuU0VDT05EUykpIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJGYWlsZWQgdG8gc2h1dGRvd24gZXhlY3V0b3IiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobU9uVWlUaHJlYWQgIT0gbnVsbCkgeworICAgICAgICAgICAgbU9uVWlUaHJlYWQuY2xlYW5VcCgpOworICAgICAgICB9CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGVuc3VyZVRyYWNpbmdTdG9wcGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghTnVsbFdlYlZpZXdVdGlscy5pc1dlYlZpZXdBdmFpbGFibGUoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgVHJhY2luZ0NvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5zdG9wKG51bGwsIHNpbmdsZVRocmVhZEV4ZWN1dG9yKTsKKyAgICAgICAgQ2FsbGFibGU8Qm9vbGVhbj4gdHJhY2luZ1N0b3BwZWQgPSBuZXcgQ2FsbGFibGU8Qm9vbGVhbj4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBCb29sZWFuIGNhbGwoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICFUcmFjaW5nQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmlzVHJhY2luZygpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBQb2xsaW5nQ2hlY2suY2hlY2soIlRyYWNpbmcgZGlkIG5vdCBzdG9wIiwgUE9MTElOR19USU1FT1VULCB0cmFjaW5nU3RvcHBlZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBUaHJlYWRGYWN0b3J5IGdldEN1c3RvbVRocmVhZEZhY3RvcnkoKSB7CisgICAgICAgIHJldHVybiBuZXcgVGhyZWFkRmFjdG9yeSgpIHsKKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgQXRvbWljSW50ZWdlciB0aHJlYWRDb3VudCA9IG5ldyBBdG9taWNJbnRlZ2VyKDApOworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgVGhyZWFkIG5ld1RocmVhZChSdW5uYWJsZSByKSB7CisgICAgICAgICAgICAgICAgVGhyZWFkIHRocmVhZCA9IG5ldyBUaHJlYWQocik7CisgICAgICAgICAgICAgICAgdGhyZWFkLnNldE5hbWUoRVhFQ1VUT1JfVEhSRUFEX1BSRUZJWCArICJfIiArIHRocmVhZENvdW50LmluY3JlbWVudEFuZEdldCgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhyZWFkOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIC8vIFRlc3QgdGhhdCBjYWxsYmFja3MgYXJlIGludm9rZWQgYW5kIHRyYWNpbmcgZGF0YSBpcyByZXR1cm5lZCBvbiB0aGUgY29ycmVjdCB0aHJlYWQKKyAgICAvLyAodmlhIGV4ZWN1dG9yKS4gVHJhY2luZyBzdGFydC9zdG9wIGFuZCB3ZWJ2aWV3IGxvYWRpbmcgaGFwcGVucyBvbiB0aGUgVUkgdGhyZWFkLgorICAgIHB1YmxpYyB2b2lkIHRlc3RUcmFjaW5nQ29udHJvbGxlckNhbGxiYWNrc09uVUkoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgaWYgKCFOdWxsV2ViVmlld1V0aWxzLmlzV2ViVmlld0F2YWlsYWJsZSgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgVHJhY2luZ1JlY2VpdmVyIHRyYWNpbmdSZWNlaXZlciA9IG5ldyBUcmFjaW5nUmVjZWl2ZXIoKTsKKworICAgICAgICBydW5UZXN0T25VaVRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBydW5UcmFjaW5nVGVzdFdpdGhDYWxsYmFja3ModHJhY2luZ1JlY2VpdmVyLCBzaW5nbGVUaHJlYWRFeGVjdXRvcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBQb2xsaW5nQ2hlY2suY2hlY2soIlRyYWNpbmcgZGlkIG5vdCBjb21wbGV0ZSIsIFBPTExJTkdfVElNRU9VVCwgdHJhY2luZ1JlY2VpdmVyLmdldENvbXBsZXRlQ2FsbGFibGUoKSk7CisgICAgICAgIGFzc2VydFRydWUodHJhY2luZ1JlY2VpdmVyLmdldE5iQ2h1bmtzKCkgPiAwKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh0cmFjaW5nUmVjZWl2ZXIuZ2V0T3V0cHV0U3RyZWFtKCkuc2l6ZSgpID4gMCk7CisgICAgICAgIC8vIGN1cnJlbnRseSB0aGUgb3V0cHV0IGlzIGpzb24gKGFzIG9mIEFwcmlsIDIwMTgpLCBidXQgdGhpcyBjb3VsZCBjaGFuZ2UgaW4gdGhlIGZ1dHVyZQorICAgICAgICAvLyBzbyB3ZSBkb24ndCBleHBsaWNpdGx5IHRlc3QgdGhlIGNvbnRlbnRzIG9mIG91dHB1dCBzdHJlYW0uCisgICAgfQorCisgICAgLy8gVGVzdCB0aGF0IGNhbGxiYWNrcyBhcmUgaW52b2tlZCBhbmQgdHJhY2luZyBkYXRhIGlzIHJldHVybmVkIG9uIHRoZSBjb3JyZWN0IHRocmVhZAorICAgIC8vICh2aWEgZXhlY3V0b3IpLiBUcmFjaW5nIHN0YXJ0L3N0b3AgaGFwcGVucyBvbiB0aGUgdGVzdGluZyB0aHJlYWQ7IHdlYnZpZXcgbG9hZGluZworICAgIC8vIGhhcHBlbnMgb24gdGhlIFVJIHRocmVhZC4KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJhY2luZ0NvbnRyb2xsZXJDYWxsYmFja3MoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgaWYgKCFOdWxsV2ViVmlld1V0aWxzLmlzV2ViVmlld0F2YWlsYWJsZSgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBUcmFjaW5nUmVjZWl2ZXIgdHJhY2luZ1JlY2VpdmVyID0gbmV3IFRyYWNpbmdSZWNlaXZlcigpOworICAgICAgICBydW5UcmFjaW5nVGVzdFdpdGhDYWxsYmFja3ModHJhY2luZ1JlY2VpdmVyLCBzaW5nbGVUaHJlYWRFeGVjdXRvcik7CisgICAgICAgIFBvbGxpbmdDaGVjay5jaGVjaygiVHJhY2luZyBkaWQgbm90IGNvbXBsZXRlIiwgUE9MTElOR19USU1FT1VULCB0cmFjaW5nUmVjZWl2ZXIuZ2V0Q29tcGxldGVDYWxsYWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh0cmFjaW5nUmVjZWl2ZXIuZ2V0TmJDaHVua3MoKSA+IDApOworICAgICAgICBhc3NlcnRUcnVlKHRyYWNpbmdSZWNlaXZlci5nZXRPdXRwdXRTdHJlYW0oKS5zaXplKCkgPiAwKTsKKyAgICB9CisKKyAgICAvLyBUZXN0IHRoYXQgdHJhY2luZyBzdG9wIGhhcyBubyBlZmZlY3QgaWYgdHJhY2luZyBoYXMgbm90IGJlZW4gc3RhcnRlZC4KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJhY2luZ1N0b3BGYWxzZUlmTm90VHJhY2luZygpIHsKKyAgICAgICAgaWYgKCFOdWxsV2ViVmlld1V0aWxzLmlzV2ViVmlld0F2YWlsYWJsZSgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBUcmFjaW5nQ29udHJvbGxlciB0cmFjaW5nQ29udHJvbGxlciA9IFRyYWNpbmdDb250cm9sbGVyLmdldEluc3RhbmNlKCk7CisgICAgICAgIGFzc2VydEZhbHNlKHRyYWNpbmdDb250cm9sbGVyLnN0b3AobnVsbCwgc2luZ2xlVGhyZWFkRXhlY3V0b3IpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UodHJhY2luZ0NvbnRyb2xsZXIuaXNUcmFjaW5nKCkpOworICAgIH0KKworICAgIC8vIFRlc3QgdGhhdCB0cmFjaW5nIGNhbm5vdCBiZSBzdGFydGVkIGlmIGFscmVhZHkgdHJhY2luZy4KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJhY2luZ0Nhbm5vdFN0YXJ0SWZBbHJlYWR5VHJhY2luZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIU51bGxXZWJWaWV3VXRpbHMuaXNXZWJWaWV3QXZhaWxhYmxlKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFRyYWNpbmdDb250cm9sbGVyIHRyYWNpbmdDb250cm9sbGVyID0gVHJhY2luZ0NvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgVHJhY2luZ0NvbmZpZyBjb25maWcgPSBuZXcgVHJhY2luZ0NvbmZpZy5CdWlsZGVyKCkuYnVpbGQoKTsKKworICAgICAgICB0cmFjaW5nQ29udHJvbGxlci5zdGFydChjb25maWcpOworICAgICAgICBhc3NlcnRUcnVlKHRyYWNpbmdDb250cm9sbGVyLmlzVHJhY2luZygpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRyYWNpbmdDb250cm9sbGVyLnN0YXJ0KGNvbmZpZyk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBhcyBleHBlY3RlZAorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUodHJhY2luZ0NvbnRyb2xsZXIuc3RvcChudWxsLCBzaW5nbGVUaHJlYWRFeGVjdXRvcikpOworICAgICAgICBmYWlsKCJUcmFjaW5nIHN0YXJ0IHNob3VsZCB0aHJvdyBhbiBleGNlcHRpb24gd2hlbiBhdHRlbXB0aW5nIHRvIHN0YXJ0IHdoaWxlIGFscmVhZHkgdHJhY2luZyIpOworICAgIH0KKworICAgIC8vIFRlc3QgdGhhdCB0cmFjaW5nIGNhbm5vdCBiZSBpbnZva2VkIHdpdGggZXhjbHVkZWQgY2F0ZWdvcmllcy4KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJhY2luZ0ludmFsaWRDYXRlZ29yaWVzUGF0dGVybkV4Y2x1c2lvbigpIHsKKyAgICAgICAgaWYgKCFOdWxsV2ViVmlld1V0aWxzLmlzV2ViVmlld0F2YWlsYWJsZSgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBUcmFjaW5nQ29udHJvbGxlciB0cmFjaW5nQ29udHJvbGxlciA9IFRyYWNpbmdDb250cm9sbGVyLmdldEluc3RhbmNlKCk7CisgICAgICAgIFRyYWNpbmdDb25maWcgY29uZmlnID0gbmV3IFRyYWNpbmdDb25maWcuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLmFkZENhdGVnb3JpZXMoImFuZHJvaWRfd2VidmlldyIsIi1ibGluayIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0cmFjaW5nQ29udHJvbGxlci5zdGFydChjb25maWcpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gYXMgZXhwZWN0ZWQ7CisgICAgICAgICAgICBhc3NlcnRGYWxzZSh0cmFjaW5nQ29udHJvbGxlci5pc1RyYWNpbmcoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmYWlsKCJUcmFjaW5nIHN0YXJ0IHNob3VsZCB0aHJvdyBhbiBleGNlcHRpb24gZHVlIHRvIGludmFsaWQgY2F0ZWdvcnkgcGF0dGVybiIpOworICAgIH0KKworICAgIC8vIFRlc3QgdGhhdCB0cmFjaW5nIGNhbm5vdCBiZSBpbnZva2VkIHdpdGggY2F0ZWdvcmllcyBjb250YWluaW5nIGNvbW1hcy4KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJhY2luZ0ludmFsaWRDYXRlZ29yaWVzUGF0dGVybkNvbW1hKCkgeworICAgICAgICBpZiAoIU51bGxXZWJWaWV3VXRpbHMuaXNXZWJWaWV3QXZhaWxhYmxlKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFRyYWNpbmdDb250cm9sbGVyIHRyYWNpbmdDb250cm9sbGVyID0gVHJhY2luZ0NvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgVHJhY2luZ0NvbmZpZyBjb25maWcgPSBuZXcgVHJhY2luZ0NvbmZpZy5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuYWRkQ2F0ZWdvcmllcygiYW5kcm9pZF93ZWJ2aWV3LCBibGluayIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0cmFjaW5nQ29udHJvbGxlci5zdGFydChjb25maWcpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gYXMgZXhwZWN0ZWQ7CisgICAgICAgICAgICBhc3NlcnRGYWxzZSh0cmFjaW5nQ29udHJvbGxlci5pc1RyYWNpbmcoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmYWlsKCJUcmFjaW5nIHN0YXJ0IHNob3VsZCB0aHJvdyBhbiBleGNlcHRpb24gZHVlIHRvIGludmFsaWQgY2F0ZWdvcnkgcGF0dGVybiIpOworICAgIH0KKworICAgIC8vIFRlc3QgdGhhdCB0cmFjaW5nIGNhbm5vdCBzdGFydCB3aXRoIGEgY29uZmlndXJhdGlvbiB0aGF0IGlzIG51bGwuCisgICAgcHVibGljIHZvaWQgdGVzdFRyYWNpbmdXaXRoTnVsbENvbmZpZygpIHsKKyAgICAgICAgaWYgKCFOdWxsV2ViVmlld1V0aWxzLmlzV2ViVmlld0F2YWlsYWJsZSgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBUcmFjaW5nQ29udHJvbGxlciB0cmFjaW5nQ29udHJvbGxlciA9IFRyYWNpbmdDb250cm9sbGVyLmdldEluc3RhbmNlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0cmFjaW5nQ29udHJvbGxlci5zdGFydChudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGFzIGV4cGVjdGVkCisgICAgICAgICAgICBhc3NlcnRGYWxzZSh0cmFjaW5nQ29udHJvbGxlci5pc1RyYWNpbmcoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZmFpbCgiVHJhY2luZyBzdGFydCBzaG91bGQgdGhyb3cgZXhjZXB0aW9uIGlmIFRyYWNpbmdDb25maWcgaXMgbnVsbCIpOworICAgIH0KKworICAgIC8vIEdlbmVyaWMgaGVscGVyIGZ1bmN0aW9uIGZvciBydW5uaW5nIHRyYWNpbmcuCisgICAgcHJpdmF0ZSB2b2lkIHJ1blRyYWNpbmdUZXN0V2l0aENhbGxiYWNrcyhUcmFjaW5nUmVjZWl2ZXIgdHJhY2luZ1JlY2VpdmVyLCBFeGVjdXRvciBleGVjdXRvcikgeworICAgICAgICBUcmFjaW5nQ29udHJvbGxlciB0cmFjaW5nQ29udHJvbGxlciA9IFRyYWNpbmdDb250cm9sbGVyLmdldEluc3RhbmNlKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwodHJhY2luZ0NvbnRyb2xsZXIpOworCisgICAgICAgIFRyYWNpbmdDb25maWcgY29uZmlnID0gbmV3IFRyYWNpbmdDb25maWcuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLmFkZENhdGVnb3JpZXMoVHJhY2luZ0NvbmZpZy5DQVRFR09SSUVTX1dFQl9ERVZFTE9QRVIpCisgICAgICAgICAgICAgICAgLnNldFRyYWNpbmdNb2RlKFRyYWNpbmdDb25maWcuUkVDT1JEX0NPTlRJTlVPVVNMWSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UodHJhY2luZ0NvbnRyb2xsZXIuaXNUcmFjaW5nKCkpOworICAgICAgICB0cmFjaW5nQ29udHJvbGxlci5zdGFydChjb25maWcpOworICAgICAgICBhc3NlcnRUcnVlKHRyYWNpbmdDb250cm9sbGVyLmlzVHJhY2luZygpKTsKKworICAgICAgICBtT25VaVRocmVhZC5sb2FkVXJsQW5kV2FpdEZvckNvbXBsZXRpb24oImFib3V0OmJsYW5rIik7CisgICAgICAgIGFzc2VydFRydWUodHJhY2luZ0NvbnRyb2xsZXIuc3RvcCh0cmFjaW5nUmVjZWl2ZXIsIGV4ZWN1dG9yKSk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy93ZWJraXQvc3JjL2FuZHJvaWQvd2Via2l0L2N0cy9VUkxVdGlsVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvd2Via2l0L3NyYy9hbmRyb2lkL3dlYmtpdC9jdHMvVVJMVXRpbFRlc3QuamF2YQppbmRleCBlOGYwY2FiLi4zNGFlMTBhIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy93ZWJraXQvc3JjL2FuZHJvaWQvd2Via2l0L2N0cy9VUkxVdGlsVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3dlYmtpdC9zcmMvYW5kcm9pZC93ZWJraXQvY3RzL1VSTFV0aWxUZXN0LmphdmEKQEAgLTMwLDggKzMwLDkgQEAKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBWQUxJRF9DT05URU5UX1VSTCA9ICJjb250ZW50Oi8vdGVzdCI7CiAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVkFMSURfREFUQV9VUkwgPSAiZGF0YTovL3Rlc3QiOwogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIFZBTElEX0FCT1VUX1VSTCA9ICJhYm91dDovL3Rlc3QiOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIFZBTElEX0ZJTEVfVVJMID0gImZpbGU6Ly90ZXN0IjsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBWQUxJRF9GSUxFX1VSTCA9ICJmaWxlOi8vL3Rlc3QiOwogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIFZBTElEX0ZUUF9VUkwgPSAiZnRwOi8vd3d3LmRvbWFpbi5jb20iOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIEZJTEVfVVJMX05PX1NMQVNIID0gImZpbGU6dGVzdCI7CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0SXNBc3NldFVybCgpIHsKICAgICAgICAgYXNzZXJ0RmFsc2UoVVJMVXRpbC5pc0Fzc2V0VXJsKG51bGwpKTsKQEAgLTcwLDYgKzcxLDkgQEAKICAgICAgICAgYXNzZXJ0RmFsc2UoVVJMVXRpbC5pc0ZpbGVVcmwoVkFMSURfQVNTRVRfVVJMKSk7CiAgICAgICAgIGFzc2VydEZhbHNlKFVSTFV0aWwuaXNGaWxlVXJsKFZBTElEX1BST1hZX1VSTCkpOwogICAgICAgICBhc3NlcnRUcnVlKFVSTFV0aWwuaXNGaWxlVXJsKFZBTElEX0ZJTEVfVVJMKSk7CisgICAgICAgIC8vIEJlY2F1c2UgY2hyb21pdW0gdHJlYXRzIHRoaXMgYSBmaWxlIFVSTCwgd2Ugc2hvdWxkIG1ha2Ugc3VyZSB7QGxpbmsgVVJMVXRpbCNpc0ZpbGVVcmx9CisgICAgICAgIC8vIGFncmVlcy4KKyAgICAgICAgYXNzZXJ0VHJ1ZShVUkxVdGlsLmlzRmlsZVVybChGSUxFX1VSTF9OT19TTEFTSCkpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RJc0h0dHBzVXJsKCkgewpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2Via2l0L3NyYy9hbmRyb2lkL3dlYmtpdC9jdHMvV2ViU2V0dGluZ3NUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy93ZWJraXQvc3JjL2FuZHJvaWQvd2Via2l0L2N0cy9XZWJTZXR0aW5nc1Rlc3QuamF2YQppbmRleCBmYmEzYmY4Li5kMTk5M2RjIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy93ZWJraXQvc3JjL2FuZHJvaWQvd2Via2l0L2N0cy9XZWJTZXR0aW5nc1Rlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy93ZWJraXQvc3JjL2FuZHJvaWQvd2Via2l0L2N0cy9XZWJTZXR0aW5nc1Rlc3QuamF2YQpAQCAtNTkxLDYgKzU5MSw3IEBACiAgICAgICAgIGlmICghTnVsbFdlYlZpZXdVdGlscy5pc1dlYlZpZXdBdmFpbGFibGUoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CisgICAgICAgIG1TZXR0aW5ncy5zZXRUZXh0U2l6ZShUZXh0U2l6ZS5OT1JNQUwpOwogICAgICAgICBhc3NlcnRFcXVhbHMoVGV4dFNpemUuTk9STUFMLCBtU2V0dGluZ3MuZ2V0VGV4dFNpemUoKSk7CiAKICAgICAgICAgbVNldHRpbmdzLnNldFRleHRTaXplKFRleHRTaXplLkxBUkdFUik7CkBAIC0xMDgzLDcgKzEwODQsNiBAQAogICAgICAgICBpZiAoIU51bGxXZWJWaWV3VXRpbHMuaXNXZWJWaWV3QXZhaWxhYmxlKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBhc3NlcnRGYWxzZShtU2V0dGluZ3MuZ2V0U2FmZUJyb3dzaW5nRW5hYmxlZCgpKTsKICAgICAgICAgbVNldHRpbmdzLnNldFNhZmVCcm93c2luZ0VuYWJsZWQoZmFsc2UpOwogICAgICAgICBhc3NlcnRGYWxzZShtU2V0dGluZ3MuZ2V0U2FmZUJyb3dzaW5nRW5hYmxlZCgpKTsKICAgICB9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy93ZWJraXQvc3JjL2FuZHJvaWQvd2Via2l0L2N0cy9XZWJWaWV3Q2xpZW50VGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvd2Via2l0L3NyYy9hbmRyb2lkL3dlYmtpdC9jdHMvV2ViVmlld0NsaWVudFRlc3QuamF2YQppbmRleCA1MjNiOTBkLi4zY2U2NmFjIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy93ZWJraXQvc3JjL2FuZHJvaWQvd2Via2l0L2N0cy9XZWJWaWV3Q2xpZW50VGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3dlYmtpdC9zcmMvYW5kcm9pZC93ZWJraXQvY3RzL1dlYlZpZXdDbGllbnRUZXN0LmphdmEKQEAgLTEzNyw2ICsxMzcsNyBAQAogCiAgICAgICAgIGZpbmFsIFdlYlZpZXcgY2hpbGRXZWJWaWV3ID0gbU9uVWlUaHJlYWQuY3JlYXRlV2ViVmlldygpOwogCisgICAgICAgIFdlYlZpZXdPblVpVGhyZWFkIGNoaWxkV2ViVmlld09uVWlUaHJlYWQgPSBuZXcgV2ViVmlld09uVWlUaHJlYWQodGhpcywgY2hpbGRXZWJWaWV3KTsKICAgICAgICAgbU9uVWlUaHJlYWQuc2V0V2ViQ2hyb21lQ2xpZW50KG5ldyBXZWJDaHJvbWVDbGllbnQoKSB7CiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlV2luZG93KApAQCAtMTUyLDI4ICsxNTMsMjYgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSk7Ci0gICAgICAgIGZpbmFsIGludCBjaGlsZENhbGxDb3VudCA9IGNoaWxkV2ViVmlld0NsaWVudC5nZXRTaG91bGRPdmVycmlkZVVybExvYWRpbmdDYWxsQ291bnQoKTsKLSAgICAgICAgbU9uVWlUaHJlYWQubG9hZFVybChtV2ViU2VydmVyLmdldEFzc2V0VXJsKFRlc3RIdG1sQ29uc3RhbnRzLkJMQU5LX1RBR19VUkwpKTsKKyAgICAgICAgeworICAgICAgICAgIGZpbmFsIGludCBjaGlsZENhbGxDb3VudCA9IGNoaWxkV2ViVmlld0NsaWVudC5nZXRTaG91bGRPdmVycmlkZVVybExvYWRpbmdDYWxsQ291bnQoKTsKKyAgICAgICAgICBtT25VaVRocmVhZC5sb2FkVXJsKG1XZWJTZXJ2ZXIuZ2V0QXNzZXRVcmwoVGVzdEh0bWxDb25zdGFudHMuQkxBTktfVEFHX1VSTCkpOwogCi0gICAgICAgIG5ldyBQb2xsaW5nQ2hlY2soVEVTVF9USU1FT1VUKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHByb3RlY3RlZCBib29sZWFuIGNoZWNrKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZFdlYlZpZXdDbGllbnQuaGFzT25QYWdlRmluaXNoZWRDYWxsZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfS5ydW4oKTsKLSAgICAgICAgbmV3IFBvbGxpbmdDaGVjayhURVNUX1RJTUVPVVQpIHsKLSAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjaGVjaygpIHsKLSAgICAgICAgICAgIHJldHVybiBjaGlsZFdlYlZpZXdDbGllbnQuZ2V0U2hvdWxkT3ZlcnJpZGVVcmxMb2FkaW5nQ2FsbENvdW50KCkgPiBjaGlsZENhbGxDb3VudDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0ucnVuKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhtV2ViU2VydmVyLmdldEFzc2V0VXJsKFRlc3RIdG1sQ29uc3RhbnRzLlBBR0VfV0lUSF9MSU5LX1VSTCksCi0gICAgICAgICAgICAgICAgY2hpbGRXZWJWaWV3Q2xpZW50LmdldExhc3RTaG91bGRPdmVycmlkZVVybCgpKTsKKyAgICAgICAgICBuZXcgUG9sbGluZ0NoZWNrKFRFU1RfVElNRU9VVCkgeworICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2soKSB7CisgICAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGRXZWJWaWV3Q2xpZW50Lmhhc09uUGFnZUZpbmlzaGVkQ2FsbGVkKCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9LnJ1bigpOworICAgICAgICAgIG5ldyBQb2xsaW5nQ2hlY2soVEVTVF9USU1FT1VUKSB7CisgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjaGVjaygpIHsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZFdlYlZpZXdDbGllbnQuZ2V0U2hvdWxkT3ZlcnJpZGVVcmxMb2FkaW5nQ2FsbENvdW50KCkgPiBjaGlsZENhbGxDb3VudDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0ucnVuKCk7CisgICAgICAgICAgYXNzZXJ0RXF1YWxzKG1XZWJTZXJ2ZXIuZ2V0QXNzZXRVcmwoVGVzdEh0bWxDb25zdGFudHMuUEFHRV9XSVRIX0xJTktfVVJMKSwKKyAgICAgICAgICAgICAgICAgIGNoaWxkV2ViVmlld0NsaWVudC5nZXRMYXN0U2hvdWxkT3ZlcnJpZGVVcmwoKSk7CisgICAgICAgIH0KIAotICAgICAgICAvLyBOb3cgdGVzdCBhIG5hdmlnYXRpb24gd2l0aGluIHRoZSBwYWdlCi0gICAgICAgIC8vVE9ETyhodXNoKSBFbmFibGUgdGhpcyBwb3J0aW9uIHdoZW4gYi8xMjgwNDk4NiBpcyBmaXhlZC4KLSAgICAgICAgLyoKLSAgICAgICAgV2ViVmlld09uVWlUaHJlYWQgY2hpbGRXZWJWaWV3T25VaVRocmVhZCA9IG5ldyBXZWJWaWV3T25VaVRocmVhZCh0aGlzLCBjaGlsZFdlYlZpZXcpOwogICAgICAgICBmaW5hbCBpbnQgY2hpbGRDYWxsQ291bnQgPSBjaGlsZFdlYlZpZXdDbGllbnQuZ2V0U2hvdWxkT3ZlcnJpZGVVcmxMb2FkaW5nQ2FsbENvdW50KCk7CiAgICAgICAgIGZpbmFsIGludCBtYWluQ2FsbENvdW50ID0gbWFpbldlYlZpZXdDbGllbnQuZ2V0U2hvdWxkT3ZlcnJpZGVVcmxMb2FkaW5nQ2FsbENvdW50KCk7CiAgICAgICAgIGNsaWNrT25MaW5rVXNpbmdKcygibGluayIsIGNoaWxkV2ViVmlld09uVWlUaHJlYWQpOwpAQCAtMTg0LDggKzE4Myw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0ucnVuKCk7CiAgICAgICAgIGFzc2VydEVxdWFscyhtYWluQ2FsbENvdW50LCBtYWluV2ViVmlld0NsaWVudC5nZXRTaG91bGRPdmVycmlkZVVybExvYWRpbmdDYWxsQ291bnQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhURVNUX1VSTCwgY2hpbGRXZWJWaWV3Q2xpZW50LmdldExhc3RTaG91bGRPdmVycmlkZVVybCgpKTsKLSAgICAgICAgKi8KKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgVGVzdEh0bWxDb25zdGFudHMuVVJMX0lOX1BBR0VfV0lUSF9MSU5LLCBjaGlsZFdlYlZpZXdDbGllbnQuZ2V0TGFzdFNob3VsZE92ZXJyaWRlVXJsKCkpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBjbGlja09uTGlua1VzaW5nSnMoZmluYWwgU3RyaW5nIGxpbmtJZCwgV2ViVmlld09uVWlUaHJlYWQgd2ViVmlld09uVWlUaHJlYWQpIHsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dlYmtpdC9zcmMvYW5kcm9pZC93ZWJraXQvY3RzL1dlYlZpZXdEYXRhRGlyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvd2Via2l0L3NyYy9hbmRyb2lkL3dlYmtpdC9jdHMvV2ViVmlld0RhdGFEaXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRlYzY4MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3dlYmtpdC9zcmMvYW5kcm9pZC93ZWJraXQvY3RzL1dlYlZpZXdEYXRhRGlyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLndlYmtpdC5jdHM7CisKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQudGVzdC5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5Db29raWVNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXc7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLk51bGxXZWJWaWV3VXRpbHM7CisKK3B1YmxpYyBjbGFzcyBXZWJWaWV3RGF0YURpclRlc3QgZXh0ZW5kcyBBY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjxXZWJWaWV3Q3RzQWN0aXZpdHk+IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgUkVNT1RFX1RJTUVPVVRfTVMgPSA1MDAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTFRFUk5BVEVfRElSX05BTUUgPSAidGVzdCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPT0tJRV9VUkwgPSAiaHR0cHM6Ly93d3cud2Vidmlld2RhdGFkaXJ0ZXN0LmNvbS8iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT09LSUVfVkFMVUUgPSAiZm9vPW1haW4iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRfQ09PS0lFX1BBUkFNUyA9ICI7IE1heC1BZ2U9ODY0MDAiOworCisgICAgcHVibGljIFdlYlZpZXdEYXRhRGlyVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlcigiYW5kcm9pZC53ZWJraXQuY3RzIiwgV2ViVmlld0N0c0FjdGl2aXR5LmNsYXNzKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgVGVzdERpc2FibGVUaGVuVXNlSW1wbCBleHRlbmRzIFRlc3RQcm9jZXNzQ2xpZW50LlRlc3RSdW5uYWJsZSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBydW4oQ29udGV4dCBjdHgpIHsKKyAgICAgICAgICAgIFdlYlZpZXcuZGlzYWJsZVdlYlZpZXcoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbmV3IFdlYlZpZXcoY3R4KTsKKyAgICAgICAgICAgICAgICBmYWlsKCJkaWRuJ3QgdGhyb3cgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIik7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkge30KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3REaXNhYmxlVGhlblVzZSgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBpZiAoIU51bGxXZWJWaWV3VXRpbHMuaXNXZWJWaWV3QXZhaWxhYmxlKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSAoVGVzdFByb2Nlc3NDbGllbnQgcHJvY2VzcyA9IFRlc3RQcm9jZXNzQ2xpZW50LmNyZWF0ZVByb2Nlc3NBKGdldEFjdGl2aXR5KCkpKSB7CisgICAgICAgICAgICBwcm9jZXNzLnJ1bihUZXN0RGlzYWJsZVRoZW5Vc2VJbXBsLmNsYXNzLCBSRU1PVEVfVElNRU9VVF9NUyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXNlVGhlbkRpc2FibGUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgaWYgKCFOdWxsV2ViVmlld1V0aWxzLmlzV2ViVmlld0F2YWlsYWJsZSgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnROb3ROdWxsKGdldEFjdGl2aXR5KCkuZ2V0V2ViVmlldygpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFdlYlZpZXcuZGlzYWJsZVdlYlZpZXcoKTsKKyAgICAgICAgICAgIGZhaWwoImRpZG4ndCB0aHJvdyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFVzZVRoZW5DaGFuZ2VEaXIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgaWYgKCFOdWxsV2ViVmlld1V0aWxzLmlzV2ViVmlld0F2YWlsYWJsZSgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnROb3ROdWxsKGdldEFjdGl2aXR5KCkuZ2V0V2ViVmlldygpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFdlYlZpZXcuc2V0RGF0YURpcmVjdG9yeVN1ZmZpeChBTFRFUk5BVEVfRElSX05BTUUpOworICAgICAgICAgICAgZmFpbCgiZGlkbid0IHRocm93IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkge30KKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgVGVzdEludmFsaWREaXJJbXBsIGV4dGVuZHMgVGVzdFByb2Nlc3NDbGllbnQuVGVzdFJ1bm5hYmxlIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bihDb250ZXh0IGN0eCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBXZWJWaWV3LnNldERhdGFEaXJlY3RvcnlTdWZmaXgoIm5vL3BhdGgvc2VwYXJhdG9ycyIpOworICAgICAgICAgICAgICAgIGZhaWwoImRpZG4ndCB0aHJvdyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7fQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEludmFsaWREaXIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgaWYgKCFOdWxsV2ViVmlld1V0aWxzLmlzV2ViVmlld0F2YWlsYWJsZSgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB0cnkgKFRlc3RQcm9jZXNzQ2xpZW50IHByb2Nlc3MgPSBUZXN0UHJvY2Vzc0NsaWVudC5jcmVhdGVQcm9jZXNzQShnZXRBY3Rpdml0eSgpKSkgeworICAgICAgICAgICAgcHJvY2Vzcy5ydW4oVGVzdEludmFsaWREaXJJbXBsLmNsYXNzLCBSRU1PVEVfVElNRU9VVF9NUyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgVGVzdERlZmF1bHREaXJEaXNhbGxvd2VkIGV4dGVuZHMgVGVzdFByb2Nlc3NDbGllbnQuVGVzdFJ1bm5hYmxlIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bihDb250ZXh0IGN0eCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBuZXcgV2ViVmlldyhjdHgpOworICAgICAgICAgICAgICAgIGZhaWwoImRpZG4ndCB0aHJvdyBSdW50aW1lRXhjZXB0aW9uIik7CisgICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHt9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2FtZURpclR3b1Byb2Nlc3NlcygpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBpZiAoIU51bGxXZWJWaWV3VXRpbHMuaXNXZWJWaWV3QXZhaWxhYmxlKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydE5vdE51bGwoZ2V0QWN0aXZpdHkoKS5nZXRXZWJWaWV3KCkpOworCisgICAgICAgIHRyeSAoVGVzdFByb2Nlc3NDbGllbnQgcHJvY2Vzc0EgPSBUZXN0UHJvY2Vzc0NsaWVudC5jcmVhdGVQcm9jZXNzQShnZXRBY3Rpdml0eSgpKSkgeworICAgICAgICAgICAgcHJvY2Vzc0EucnVuKFRlc3REZWZhdWx0RGlyRGlzYWxsb3dlZC5jbGFzcywgUkVNT1RFX1RJTUVPVVRfTVMpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIFRlc3RDb29raWVJbkFsdGVybmF0ZURpciBleHRlbmRzIFRlc3RQcm9jZXNzQ2xpZW50LlRlc3RSdW5uYWJsZSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBydW4oQ29udGV4dCBjdHgpIHsKKyAgICAgICAgICAgIFdlYlZpZXcuc2V0RGF0YURpcmVjdG9yeVN1ZmZpeChBTFRFUk5BVEVfRElSX05BTUUpOworICAgICAgICAgICAgQ29va2llTWFuYWdlciBjbSA9IENvb2tpZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIFN0cmluZyBjb29raWUgPSBjbS5nZXRDb29raWUoQ09PS0lFX1VSTCk7CisgICAgICAgICAgICBhc3NlcnROdWxsKCJjb29raWUgbGVha2VkIHRvIGFsdGVybmF0ZSBjb29raWUgamFyIiwgY29va2llKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDb29raWVKYXJzU2VwYXJhdGUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgaWYgKCFOdWxsV2ViVmlld1V0aWxzLmlzV2ViVmlld0F2YWlsYWJsZSgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBDb29raWVNYW5hZ2VyIGNtID0gQ29va2llTWFuYWdlci5nZXRJbnN0YW5jZSgpOworICAgICAgICBjbS5zZXRDb29raWUoQ09PS0lFX1VSTCwgQ09PS0lFX1ZBTFVFICsgU0VUX0NPT0tJRV9QQVJBTVMpOworICAgICAgICBjbS5mbHVzaCgpOworICAgICAgICBTdHJpbmcgY29va2llID0gY20uZ2V0Q29va2llKENPT0tJRV9VUkwpOworICAgICAgICBhc3NlcnRFcXVhbHMoIndyb25nIGNvb2tpZSBpbiBkZWZhdWx0IGNvb2tpZSBqYXIiLCBDT09LSUVfVkFMVUUsIGNvb2tpZSk7CisKKyAgICAgICAgdHJ5IChUZXN0UHJvY2Vzc0NsaWVudCBwcm9jZXNzQSA9IFRlc3RQcm9jZXNzQ2xpZW50LmNyZWF0ZVByb2Nlc3NBKGdldEFjdGl2aXR5KCkpKSB7CisgICAgICAgICAgICBwcm9jZXNzQS5ydW4oVGVzdENvb2tpZUluQWx0ZXJuYXRlRGlyLmNsYXNzLCBSRU1PVEVfVElNRU9VVF9NUyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy93ZWJraXQvc3JjL2FuZHJvaWQvd2Via2l0L2N0cy9XZWJWaWV3U3NsVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvd2Via2l0L3NyYy9hbmRyb2lkL3dlYmtpdC9jdHMvV2ViVmlld1NzbFRlc3QuamF2YQppbmRleCBjOTAwYTBkLi4wOGRlNTI0IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy93ZWJraXQvc3JjL2FuZHJvaWQvd2Via2l0L2N0cy9XZWJWaWV3U3NsVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3dlYmtpdC9zcmMvYW5kcm9pZC93ZWJraXQvY3RzL1dlYlZpZXdTc2xUZXN0LmphdmEKQEAgLTkwOSw4ICs5MDksOCBAQAogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBjbGVhckNsaWVudENlcnRQcmVmZXJlbmNlcygpIHsKLSAgICAgICBmaW5hbCBBdG9taWNCb29sZWFuIGNsZWFyZWQgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7Ci0gICAgICAgIG1PblVpVGhyZWFkLmNsZWFyQ2xpZW50Q2VydFByZWZlcmVuY2VzKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgZmluYWwgQXRvbWljQm9vbGVhbiBjbGVhcmVkID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOworICAgICAgICBXZWJWaWV3LmNsZWFyQ2xpZW50Q2VydFByZWZlcmVuY2VzKG5ldyBSdW5uYWJsZSgpIHsKICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewogICAgICAgICAgICAgICAgIGNsZWFyZWQuc2V0KHRydWUpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2Via2l0L3NyYy9hbmRyb2lkL3dlYmtpdC9jdHMvV2ViVmlld1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3dlYmtpdC9zcmMvYW5kcm9pZC93ZWJraXQvY3RzL1dlYlZpZXdUZXN0LmphdmEKaW5kZXggOTVjODYwZS4uNmQ2OTk0NSAxMDA3NTUKLS0tIGEvdGVzdHMvdGVzdHMvd2Via2l0L3NyYy9hbmRyb2lkL3dlYmtpdC9jdHMvV2ViVmlld1Rlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy93ZWJraXQvc3JjL2FuZHJvaWQvd2Via2l0L2N0cy9XZWJWaWV3VGVzdC5qYXZhCkBAIC0yNyw2ICsyNyw3IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBpY3R1cmU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MucGRmLlBkZlJlbmRlcmVyOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLkNhbmNlbGxhdGlvblNpZ25hbDsKQEAgLTM4LDYgKzM5LDcgQEAKIGltcG9ydCBhbmRyb2lkLm9zLlN0cmljdE1vZGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5TdHJpY3RNb2RlLlRocmVhZFBvbGljeTsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5QcmVzdWJtaXQ7CiBpbXBvcnQgYW5kcm9pZC5wcmludC5QYWdlUmFuZ2U7CiBpbXBvcnQgYW5kcm9pZC5wcmludC5QcmludEF0dHJpYnV0ZXM7CiBpbXBvcnQgYW5kcm9pZC5wcmludC5QcmludERvY3VtZW50QWRhcHRlcjsKQEAgLTI3Miw3ICsyNzQsNyBAQAogICAgICAgICBhc3NlcnROb3ROdWxsKENvb2tpZVN5bmNNYW5hZ2VyLmdldEluc3RhbmNlKCkpOwogICAgIH0KIAotICAgIEBVaVRocmVhZFRlc3QKKyAgICAvLyBTdGF0aWMgbWV0aG9kcyBzaG91bGQgYmUgc2FmZSB0byBjYWxsIG9uIG5vbi1VSSB0aHJlYWRzCiAgICAgcHVibGljIHZvaWQgdGVzdEZpbmRBZGRyZXNzKCkgewogICAgICAgICBpZiAoIU51bGxXZWJWaWV3VXRpbHMuaXNXZWJWaWV3QXZhaWxhYmxlKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKQEAgLTQ4OSw2ICs0OTEsNyBAQAogICAgICAgICBhc3NlcnRGYWxzZShtV2ViVmlldy5vdmVybGF5VmVydGljYWxTY3JvbGxiYXIoKSk7CiAgICAgfQogCisgICAgQFByZXN1Ym1pdAogICAgIEBVaVRocmVhZFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0TG9hZFVybCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBpZiAoIU51bGxXZWJWaWV3VXRpbHMuaXNXZWJWaWV3QXZhaWxhYmxlKCkpIHsKQEAgLTI1OTIsNyArMjU5NSw4IEBACiAgICAgICAgICAgICAgICAgICAgIC8vIENhbGxlZCBvbiBVSSB0aHJlYWQKICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uTGF5b3V0RmluaXNoZWQoUHJpbnREb2N1bWVudEluZm8gaW5mbywgYm9vbGVhbiBjaGFuZ2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYXZlUHJpbnRlZFBhZ2UoYWRhcHRlciwgZGVzY3JpcHRvciwgcmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBhZ2VSYW5nZVtdIHBhZ2VSYW5nZXMgPSBuZXcgUGFnZVJhbmdlW10ge1BhZ2VSYW5nZS5BTExfUEFHRVN9OworICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZVByaW50ZWRQYWdlKGFkYXB0ZXIsIGRlc2NyaXB0b3IsIHBhZ2VSYW5nZXMsIHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgdHJ5IHsKQEAgLTI2MTAsNiArMjYxNCw1NyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLy8gVmVyaWZ5IFByaW50IGZlYXR1cmUgY2FuIGNyZWF0ZSBhIFBERiBmaWxlIHdpdGggY29ycmVjdCBudW1iZXIgb2YgcGFnZXMuCisgICAgcHVibGljIHZvaWQgdGVzdFByaW50aW5nUGFnZXNDb3VudCgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBpZiAoIU51bGxXZWJWaWV3VXRpbHMuaXNXZWJWaWV3QXZhaWxhYmxlKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgY29udGVudCA9ICI8aHRtbD48aGVhZD48L2hlYWQ+PGJvZHk+IjsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1MDA7ICsraSkgeworICAgICAgICAgICAgY29udGVudCArPSAiPGJyIC8+YWJjZGVmZ2hpams8YnIgLz4iOworICAgICAgICB9CisgICAgICAgIGNvbnRlbnQgKz0gIjwvYm9keT48L2h0bWw+IjsKKyAgICAgICAgbU9uVWlUaHJlYWQubG9hZERhdGFBbmRXYWl0Rm9yQ29tcGxldGlvbihjb250ZW50LCAidGV4dC9odG1sIiwgbnVsbCk7CisgICAgICAgIGZpbmFsIFByaW50RG9jdW1lbnRBZGFwdGVyIGFkYXB0ZXIgPSAgbU9uVWlUaHJlYWQuY3JlYXRlUHJpbnREb2N1bWVudEFkYXB0ZXIoKTsKKyAgICAgICAgcHJpbnREb2N1bWVudFN0YXJ0KGFkYXB0ZXIpOworICAgICAgICBQcmludEF0dHJpYnV0ZXMgYXR0cmlidXRlcyA9IG5ldyBQcmludEF0dHJpYnV0ZXMuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldE1lZGlhU2l6ZShQcmludEF0dHJpYnV0ZXMuTWVkaWFTaXplLklTT19BNCkKKyAgICAgICAgICAgICAgICAuc2V0UmVzb2x1dGlvbihuZXcgUHJpbnRBdHRyaWJ1dGVzLlJlc29sdXRpb24oImZvbyIsICJiYXIiLCAzMDAsIDMwMCkpCisgICAgICAgICAgICAgICAgLnNldE1pbk1hcmdpbnMoUHJpbnRBdHRyaWJ1dGVzLk1hcmdpbnMuTk9fTUFSR0lOUykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgZmluYWwgV2ViVmlld0N0c0FjdGl2aXR5IGFjdGl2aXR5ID0gZ2V0QWN0aXZpdHkoKTsKKyAgICAgICAgZmluYWwgRmlsZSBmaWxlID0gYWN0aXZpdHkuZ2V0RmlsZVN0cmVhbVBhdGgoUFJJTlRFUl9URVNUX0ZJTEUpOworICAgICAgICBmaW5hbCBQYXJjZWxGaWxlRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gUGFyY2VsRmlsZURlc2NyaXB0b3Iub3BlbihmaWxlLAorICAgICAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yLnBhcnNlTW9kZSgidyIpKTsKKyAgICAgICAgZmluYWwgRnV0dXJlVGFzazxCb29sZWFuPiByZXN1bHQgPQorICAgICAgICAgICAgICAgIG5ldyBGdXR1cmVUYXNrPEJvb2xlYW4+KG5ldyBDYWxsYWJsZTxCb29sZWFuPigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgQm9vbGVhbiBjYWxsKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgcHJpbnREb2N1bWVudExheW91dChhZGFwdGVyLCBudWxsLCBhdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgIG5ldyBMYXlvdXRSZXN1bHRDYWxsYmFjaygpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2FsbGVkIG9uIFVJIHRocmVhZAorICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25MYXlvdXRGaW5pc2hlZChQcmludERvY3VtZW50SW5mbyBpbmZvLCBib29sZWFuIGNoYW5nZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBhZ2VSYW5nZVtdIHBhZ2VSYW5nZXMgPSBuZXcgUGFnZVJhbmdlW10geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQYWdlUmFuZ2UoMSwgMSksIG5ldyBQYWdlUmFuZ2UoNCwgNykKKyAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgICAgICBzYXZlUHJpbnRlZFBhZ2UoYWRhcHRlciwgZGVzY3JpcHRvciwgcGFnZVJhbmdlcywgcmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVzdWx0LmdldChURVNUX1RJTUVPVVQsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGZpbGUubGVuZ3RoKCkgPiAwKTsKKyAgICAgICAgICAgIFBkZlJlbmRlcmVyIHJlbmRlcmVyID0gbmV3IFBkZlJlbmRlcmVyKAorICAgICAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yLm9wZW4oZmlsZSwgUGFyY2VsRmlsZURlc2NyaXB0b3IuTU9ERV9SRUFEX09OTFkpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyg1LCByZW5kZXJlci5nZXRQYWdlQ291bnQoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBkZXNjcmlwdG9yLmNsb3NlKCk7CisgICAgICAgICAgICBmaWxlLmRlbGV0ZSgpOworICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgdGVzdFZpc3VhbFN0YXRlQ2FsbGJhY2tDYWxsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgdmlzdWFsIHN0YXRlIGNhbGxiYWNrIGlzIGNhbGxlZCBjb3JyZWN0bHkuCiAgICAgICAgIGlmICghTnVsbFdlYlZpZXdVdGlscy5pc1dlYlZpZXdBdmFpbGFibGUoKSkgewpAQCAtMjgzOCw4ICsyODkzLDkgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgc2F2ZVByaW50ZWRQYWdlKGZpbmFsIFByaW50RG9jdW1lbnRBZGFwdGVyIGFkYXB0ZXIsCi0gICAgICAgICAgICBmaW5hbCBQYXJjZWxGaWxlRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBmaW5hbCBGdXR1cmVUYXNrPEJvb2xlYW4+IHJlc3VsdCkgewotICAgICAgICBhZGFwdGVyLm9uV3JpdGUobmV3IFBhZ2VSYW5nZVtdIHtQYWdlUmFuZ2UuQUxMX1BBR0VTfSwgZGVzY3JpcHRvciwKKyAgICAgICAgICAgIGZpbmFsIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIGZpbmFsIFBhZ2VSYW5nZVtdIHBhZ2VSYW5nZXMsCisgICAgICAgICAgICBmaW5hbCBGdXR1cmVUYXNrPEJvb2xlYW4+IHJlc3VsdCkgeworICAgICAgICBhZGFwdGVyLm9uV3JpdGUocGFnZVJhbmdlcywgZGVzY3JpcHRvciwKICAgICAgICAgICAgICAgICBuZXcgQ2FuY2VsbGF0aW9uU2lnbmFsKCksCiAgICAgICAgICAgICAgICAgbmV3IFdyaXRlUmVzdWx0Q2FsbGJhY2soKSB7CiAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQpAQCAtMzA0Niw0ICszMTAyLDEyIEBACiAgICAgICAgICAgICBBc3NlcnQuZmFpbCgiVGhlIHByaXZhY3kgcG9saWN5IFVSTCBzaG91bGQgYmUgYSB3ZWxsLWZvcm1lZCBVUkwiKTsKICAgICAgICAgfQogICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJWaWV3Q2xhc3NMb2FkZXJSZXR1cm5zTm9uTnVsbCgpIHsKKyAgICAgICAgaWYgKCFOdWxsV2ViVmlld1V0aWxzLmlzV2ViVmlld0F2YWlsYWJsZSgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnROb3ROdWxsKFdlYlZpZXcuZ2V0V2ViVmlld0NsYXNzTG9hZGVyKCkpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L0FuZHJvaWQubWsKaW5kZXggZWMxMDRkOC4uNjAyMDg5MCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvd2lkZ2V0L0FuZHJvaWQubWsKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L0FuZHJvaWQubWsKQEAgLTIyLDIxICsyMiwyMiBAQAogTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKIAogTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTICs9IFwKLSAgICBhbmRyb2lkLXN1cHBvcnQtdGVzdCBcCisgICAgYW5kcm9pZHguYW5ub3RhdGlvbl9hbm5vdGF0aW9uIFwKKyAgICBhbmRyb2lkeC50ZXN0LnJ1bGVzIFwKICAgICBtb2NraXRvLXRhcmdldC1taW51cy1qdW5pdDQgXAogICAgIGFuZHJvaWQtY29tbW9uIFwKLSAgICBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsIFwKLSAgICBjdHN0ZXN0cnVubmVyIFwKLSAgICBwbGF0Zm9ybS10ZXN0LWFubm90YXRpb25zIFwKLSAgICBsZWdhY3ktYW5kcm9pZC10ZXN0CisgICAgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgXAorICAgIGN0c3Rlc3RydW5uZXItYXh0IFwKKyAgICBwbGF0Zm9ybS10ZXN0LWFubm90YXRpb25zCiAKLUxPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIuc3R1YnMKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzV2lkZ2V0VGVzdENhc2VzCitMT0NBTF9QUklWQVRFX1BMQVRGT1JNX0FQSVMgOj0gdHJ1ZQogCiAjIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0Ci1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMgY3RzX2luc3RhbnQKIAogaW5jbHVkZSAkKEJVSUxEX0NUU19QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy90ZXN0cy93aWRnZXQvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBmN2ZhMWQ0Li5kNTJmMTE0IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy93aWRnZXQvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy93aWRnZXQvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMTYsMTYgKzE2LDE5IEBACiAgLS0+CiAKIDxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgcGFja2FnZT0iYW5kcm9pZC53aWRnZXQuY3RzIj4KKyAgICBwYWNrYWdlPSJhbmRyb2lkLndpZGdldC5jdHMiCisgICAgYW5kcm9pZDp0YXJnZXRTYW5kYm94VmVyc2lvbj0iMiI+CiAKICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkRJU0FCTEVfS0VZR1VBUkQiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9TRVRUSU5HUyIgLz4KIAogICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJBbmRyb2lkIFRlc3RDYXNlIgogICAgICAgICAgICAgYW5kcm9pZDppY29uPSJAZHJhd2FibGUvc2l6ZV80OHg0OCIKICAgICAgICAgICAgIGFuZHJvaWQ6bWF4UmVjZW50cz0iMSIKICAgICAgICAgICAgIGFuZHJvaWQ6bXVsdGlBcmNoPSJ0cnVlIgogICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLndpZGdldC5jdHMuTW9ja0FwcGxpY2F0aW9uIgotICAgICAgICAgICAgYW5kcm9pZDpzdXBwb3J0c1J0bD0idHJ1ZSI+CisgICAgICAgICAgICBhbmRyb2lkOnN1cHBvcnRzUnRsPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuTWF0ZXJpYWwuTGlnaHQuRGFya0FjdGlvbkJhciI+CiAKICAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CiAKQEAgLTMyOSw2ICszMzIsMTYgQEAKICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KICAgICAgICAgPC9hY3Rpdml0eT4KIAorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLndpZGdldC5jdHMuVGV4dENsb2NrQ3RzQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJUZXh0Q2xvY2tDdHNBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2NyZWVuT3JpZW50YXRpb249Im5vc2Vuc29yIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp3aW5kb3dTb2Z0SW5wdXRNb2RlPSJzdGF0ZUFsd2F5c0hpZGRlbiI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuRlJBTUVXT1JLX0lOU1RSVU1FTlRBVElPTl9URVNUIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQud2lkZ2V0LmN0cy5UZXh0Vmlld0N0c0FjdGl2aXR5IgogICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iVGV4dFZpZXdDdHNBY3Rpdml0eSIKICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2NyZWVuT3JpZW50YXRpb249Im5vc2Vuc29yIgpAQCAtNTcwLDYgKzU4MywxNCBAQAogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICA8L2FjdGl2aXR5PgogCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQud2lkZ2V0LmN0cy5NYWduaWZpZXJDdHNBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Ik1hZ25pZmllckN0c0FjdGl2aXR5Ij4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5GUkFNRVdPUktfSU5TVFJVTUVOVEFUSU9OX1RFU1QiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKICAgICAgICAgPHJlY2VpdmVyIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC53aWRnZXQuY3RzLmFwcHdpZGdldC5NeUFwcFdpZGdldFByb3ZpZGVyIiA+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hcHB3aWRnZXQuYWN0aW9uLkFQUFdJREdFVF9VUERBVEUiIC8+CkBAIC01ODMsNyArNjA0LDcgQEAKICAgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0iZmFsc2UiIC8+CiAgICAgPC9hcHBsaWNhdGlvbj4KIAotICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQud2lkZ2V0LmN0cyIKICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBvZiBhbmRyb2lkLndpZGdldCI+CiAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJsaXN0ZW5lciIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy90ZXN0cy93aWRnZXQvQW5kcm9pZFRlc3QueG1sCmluZGV4IDJlYjBiODYuLjI3YzZlYTMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9BbmRyb2lkVGVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L0FuZHJvaWRUZXN0LnhtbApAQCAtMTQsNiArMTQsNyBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIFdpZGdldCB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0idWl0b29sa2l0IiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CkBAIC0yMiw1ICsyMyw2IEBACiAgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkFuZHJvaWRKVW5pdFRlc3QiID4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJwYWNrYWdlIiB2YWx1ZT0iYW5kcm9pZC53aWRnZXQuY3RzIiAvPgogICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjExbTU1cyIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJoaWRkZW4tYXBpLWNoZWNrcyIgdmFsdWU9ImZhbHNlIiAvPgogICAgIDwvdGVzdD4KIDwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9hc3NldHMvZm9udF9zb3VyY2UvYXNjaWlfYTNlbV93ZWlnaHQxMDBfdXByaWdodC50dHggYi90ZXN0cy90ZXN0cy93aWRnZXQvYXNzZXRzL2ZvbnRfc291cmNlL2FzY2lpX2EzZW1fd2VpZ2h0MTAwX3VwcmlnaHQudHR4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NDA4N2EKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy93aWRnZXQvYXNzZXRzL2ZvbnRfc291cmNlL2FzY2lpX2EzZW1fd2VpZ2h0MTAwX3VwcmlnaHQudHR4CkBAIC0wLDAgKzEsMjA4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8dHRGb250IHNmbnRWZXJzaW9uPSJceDAwXHgwMVx4MDBceDAwIiB0dExpYlZlcnNpb249IjMuMCI+CisKKyAgPEdseXBoT3JkZXI+CisgICAgPEdseXBoSUQgaWQ9IjAiIG5hbWU9Ii5ub3RkZWYiLz4KKyAgICA8R2x5cGhJRCBpZD0iMSIgbmFtZT0iMWVtIi8+CisgICAgPEdseXBoSUQgaWQ9IjIiIG5hbWU9IjNlbSIvPgorICA8L0dseXBoT3JkZXI+CisKKyAgPGhlYWQ+CisgICAgPHRhYmxlVmVyc2lvbiB2YWx1ZT0iMS4wIi8+CisgICAgPGZvbnRSZXZpc2lvbiB2YWx1ZT0iMS4wIi8+CisgICAgPGNoZWNrU3VtQWRqdXN0bWVudCB2YWx1ZT0iMHg2NDBjZGIyZiIvPgorICAgIDxtYWdpY051bWJlciB2YWx1ZT0iMHg1ZjBmM2NmNSIvPgorICAgIDxmbGFncyB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMTEiLz4KKyAgICA8dW5pdHNQZXJFbSB2YWx1ZT0iMTAwMCIvPgorICAgIDxjcmVhdGVkIHZhbHVlPSJUaHUgRmViIDIyIDEwOjA0OjI4IDIwMTgiLz4KKyAgICA8bWFjU3R5bGUgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIi8+CisgICAgPGxvd2VzdFJlY1BQRU0gdmFsdWU9IjciLz4KKyAgICA8Zm9udERpcmVjdGlvbkhpbnQgdmFsdWU9IjIiLz4KKyAgICA8Z2x5cGhEYXRhRm9ybWF0IHZhbHVlPSIwIi8+CisgIDwvaGVhZD4KKworICA8aGhlYT4KKyAgICA8dGFibGVWZXJzaW9uIHZhbHVlPSIweDAwMDEwMDAwIi8+CisgICAgPGFzY2VudCB2YWx1ZT0iMTAwMCIvPgorICAgIDxkZXNjZW50IHZhbHVlPSItMjAwIi8+CisgICAgPGxpbmVHYXAgdmFsdWU9IjAiLz4KKyAgICA8Y2FyZXRTbG9wZVJpc2UgdmFsdWU9IjEiLz4KKyAgICA8Y2FyZXRTbG9wZVJ1biB2YWx1ZT0iMCIvPgorICAgIDxjYXJldE9mZnNldCB2YWx1ZT0iMCIvPgorICAgIDxyZXNlcnZlZDAgdmFsdWU9IjAiLz4KKyAgICA8cmVzZXJ2ZWQxIHZhbHVlPSIwIi8+CisgICAgPHJlc2VydmVkMiB2YWx1ZT0iMCIvPgorICAgIDxyZXNlcnZlZDMgdmFsdWU9IjAiLz4KKyAgICA8bWV0cmljRGF0YUZvcm1hdCB2YWx1ZT0iMCIvPgorICA8L2hoZWE+CisKKyAgPG1heHA+CisgICAgPHRhYmxlVmVyc2lvbiB2YWx1ZT0iMHgxMDAwMCIvPgorICAgIDxtYXhab25lcyB2YWx1ZT0iMCIvPgorICAgIDxtYXhUd2lsaWdodFBvaW50cyB2YWx1ZT0iMCIvPgorICAgIDxtYXhTdG9yYWdlIHZhbHVlPSIwIi8+CisgICAgPG1heEZ1bmN0aW9uRGVmcyB2YWx1ZT0iMCIvPgorICAgIDxtYXhJbnN0cnVjdGlvbkRlZnMgdmFsdWU9IjAiLz4KKyAgICA8bWF4U3RhY2tFbGVtZW50cyB2YWx1ZT0iMCIvPgorICAgIDxtYXhTaXplT2ZJbnN0cnVjdGlvbnMgdmFsdWU9IjAiLz4KKyAgICA8bWF4Q29tcG9uZW50RWxlbWVudHMgdmFsdWU9IjAiLz4KKyAgPC9tYXhwPgorCisgIDxPU18yPgorICAgIDwhLS0gVGhlIGZpZWxkcyAndXNGaXJzdENoYXJJbmRleCcgYW5kICd1c0xhc3RDaGFySW5kZXgnCisgICAgICAgICB3aWxsIGJlIHJlY2FsY3VsYXRlZCBieSB0aGUgY29tcGlsZXIgLS0+CisgICAgPHZlcnNpb24gdmFsdWU9IjMiLz4KKyAgICA8eEF2Z0NoYXJXaWR0aCB2YWx1ZT0iNTk0Ii8+CisgICAgPHVzV2VpZ2h0Q2xhc3MgdmFsdWU9IjEwMCIvPgorICAgIDx1c1dpZHRoQ2xhc3MgdmFsdWU9IjUiLz4KKyAgICA8ZnNUeXBlIHZhbHVlPSIwMDAwMDAwMCAwMDAwMTAwMCIvPgorICAgIDx5U3Vic2NyaXB0WFNpemUgdmFsdWU9IjY1MCIvPgorICAgIDx5U3Vic2NyaXB0WVNpemUgdmFsdWU9IjYwMCIvPgorICAgIDx5U3Vic2NyaXB0WE9mZnNldCB2YWx1ZT0iMCIvPgorICAgIDx5U3Vic2NyaXB0WU9mZnNldCB2YWx1ZT0iNzUiLz4KKyAgICA8eVN1cGVyc2NyaXB0WFNpemUgdmFsdWU9IjY1MCIvPgorICAgIDx5U3VwZXJzY3JpcHRZU2l6ZSB2YWx1ZT0iNjAwIi8+CisgICAgPHlTdXBlcnNjcmlwdFhPZmZzZXQgdmFsdWU9IjAiLz4KKyAgICA8eVN1cGVyc2NyaXB0WU9mZnNldCB2YWx1ZT0iMzUwIi8+CisgICAgPHlTdHJpa2VvdXRTaXplIHZhbHVlPSI1MCIvPgorICAgIDx5U3RyaWtlb3V0UG9zaXRpb24gdmFsdWU9IjMwMCIvPgorICAgIDxzRmFtaWx5Q2xhc3MgdmFsdWU9IjAiLz4KKyAgICA8cGFub3NlPgorICAgICAgPGJGYW1pbHlUeXBlIHZhbHVlPSIwIi8+CisgICAgICA8YlNlcmlmU3R5bGUgdmFsdWU9IjAiLz4KKyAgICAgIDxiV2VpZ2h0IHZhbHVlPSI1Ii8+CisgICAgICA8YlByb3BvcnRpb24gdmFsdWU9IjAiLz4KKyAgICAgIDxiQ29udHJhc3QgdmFsdWU9IjAiLz4KKyAgICAgIDxiU3Ryb2tlVmFyaWF0aW9uIHZhbHVlPSIwIi8+CisgICAgICA8YkFybVN0eWxlIHZhbHVlPSIwIi8+CisgICAgICA8YkxldHRlckZvcm0gdmFsdWU9IjAiLz4KKyAgICAgIDxiTWlkbGluZSB2YWx1ZT0iMCIvPgorICAgICAgPGJYSGVpZ2h0IHZhbHVlPSIwIi8+CisgICAgPC9wYW5vc2U+CisgICAgPHVsVW5pY29kZVJhbmdlMSB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDEiLz4KKyAgICA8dWxVbmljb2RlUmFuZ2UyIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCIvPgorICAgIDx1bFVuaWNvZGVSYW5nZTMgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIi8+CisgICAgPHVsVW5pY29kZVJhbmdlNCB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAiLz4KKyAgICA8YWNoVmVuZElEIHZhbHVlPSJVS1dOIi8+CisgICAgPGZzU2VsZWN0aW9uIHZhbHVlPSIwMDAwMDAwMCAwMTAwMDAwMCIvPgorICAgIDx1c0ZpcnN0Q2hhckluZGV4IHZhbHVlPSIzMiIvPgorICAgIDx1c0xhc3RDaGFySW5kZXggdmFsdWU9IjEyMiIvPgorICAgIDxzVHlwb0FzY2VuZGVyIHZhbHVlPSI4MDAiLz4KKyAgICA8c1R5cG9EZXNjZW5kZXIgdmFsdWU9Ii0yMDAiLz4KKyAgICA8c1R5cG9MaW5lR2FwIHZhbHVlPSIyMDAiLz4KKyAgICA8dXNXaW5Bc2NlbnQgdmFsdWU9IjEwMDAiLz4KKyAgICA8dXNXaW5EZXNjZW50IHZhbHVlPSIyMDAiLz4KKyAgICA8dWxDb2RlUGFnZVJhbmdlMSB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDEiLz4KKyAgICA8dWxDb2RlUGFnZVJhbmdlMiB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAiLz4KKyAgICA8c3hIZWlnaHQgdmFsdWU9IjUwMCIvPgorICAgIDxzQ2FwSGVpZ2h0IHZhbHVlPSI3MDAiLz4KKyAgICA8dXNEZWZhdWx0Q2hhciB2YWx1ZT0iMCIvPgorICAgIDx1c0JyZWFrQ2hhciB2YWx1ZT0iMzIiLz4KKyAgICA8dXNNYXhDb250ZXh0IHZhbHVlPSIwIi8+CisgIDwvT1NfMj4KKworICA8aG10eD4KKyAgICA8bXR4IG5hbWU9Ii5ub3RkZWYiIHdpZHRoPSI1MDAiIGxzYj0iOTMiLz4KKyAgICA8bXR4IG5hbWU9IjFlbSIgd2lkdGg9IjEwMDAiIGxzYj0iOTMiLz4KKyAgICA8bXR4IG5hbWU9IjNlbSIgd2lkdGg9IjMwMDAiIGxzYj0iOTMiLz4KKyAgPC9obXR4PgorCisgIDxjbWFwPgorICAgIDx0YWJsZVZlcnNpb24gdmVyc2lvbj0iMCIvPgorICAgIDxjbWFwX2Zvcm1hdF80IHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMTAiIGxhbmd1YWdlPSIwIj4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjEiIG5hbWU9IjNlbSIgLz4gPCEtLSBhIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2MiIgbmFtZT0iMWVtIiAvPiA8IS0tIGIgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDYzIiBuYW1lPSIxZW0iIC8+IDwhLS0gYyAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjQiIG5hbWU9IjFlbSIgLz4gPCEtLSBkIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2NSIgbmFtZT0iMWVtIiAvPiA8IS0tIGUgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDY2IiBuYW1lPSIxZW0iIC8+IDwhLS0gZiAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjciIG5hbWU9IjFlbSIgLz4gPCEtLSBnIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2OCIgbmFtZT0iMWVtIiAvPiA8IS0tIGggLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDY5IiBuYW1lPSIxZW0iIC8+IDwhLS0gaSAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNkEiIG5hbWU9IjFlbSIgLz4gPCEtLSBqIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2QiIgbmFtZT0iMWVtIiAvPiA8IS0tIGsgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDZDIiBuYW1lPSIxZW0iIC8+IDwhLS0gbCAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNkQiIG5hbWU9IjFlbSIgLz4gPCEtLSBtIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2RSIgbmFtZT0iMWVtIiAvPiA8IS0tIG4gLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDZGIiBuYW1lPSIxZW0iIC8+IDwhLS0gbyAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzAiIG5hbWU9IjFlbSIgLz4gPCEtLSBwIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3MSIgbmFtZT0iMWVtIiAvPiA8IS0tIHEgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDcyIiBuYW1lPSIxZW0iIC8+IDwhLS0gciAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzMiIG5hbWU9IjFlbSIgLz4gPCEtLSBzIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3NCIgbmFtZT0iMWVtIiAvPiA8IS0tIHQgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDc1IiBuYW1lPSIxZW0iIC8+IDwhLS0gdSAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzYiIG5hbWU9IjFlbSIgLz4gPCEtLSB2IC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3NyIgbmFtZT0iMWVtIiAvPiA8IS0tIHcgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDc4IiBuYW1lPSIxZW0iIC8+IDwhLS0geCAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzkiIG5hbWU9IjFlbSIgLz4gPCEtLSB5IC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3QSIgbmFtZT0iMWVtIiAvPiA8IS0tIHogLS0+CisgICAgPC9jbWFwX2Zvcm1hdF80PgorICA8L2NtYXA+CisKKyAgPGxvY2E+CisgICAgPCEtLSBUaGUgJ2xvY2EnIHRhYmxlIHdpbGwgYmUgY2FsY3VsYXRlZCBieSB0aGUgY29tcGlsZXIgLS0+CisgIDwvbG9jYT4KKworICA8Z2x5Zj4KKyAgICA8VFRHbHlwaCBuYW1lPSIubm90ZGVmIiB4TWluPSIwIiB5TWluPSIwIiB4TWF4PSIwIiB5TWF4PSIwIiAvPgorICAgIDxUVEdseXBoIG5hbWU9IjFlbSIgeE1pbj0iMCIgeU1pbj0iMCIgeE1heD0iMCIgeU1heD0iMCIgLz4KKyAgICA8VFRHbHlwaCBuYW1lPSIzZW0iIHhNaW49IjAiIHlNaW49IjAiIHhNYXg9IjAiIHlNYXg9IjAiIC8+CisgIDwvZ2x5Zj4KKworICA8bmFtZT4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjAiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjEiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBTYW1wbGUgRm9udAorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjIiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBSZWd1bGFyCisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iNCIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIFNhbXBsZSBGb250CisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iNiIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIFNhbXBsZUZvbnQtUmVndWxhcgorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjEzIiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjE0IiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgPC9uYW1lcmVjb3JkPgorICA8L25hbWU+CisKKyAgPHBvc3Q+CisgICAgPGZvcm1hdFR5cGUgdmFsdWU9IjMuMCIvPgorICAgIDxpdGFsaWNBbmdsZSB2YWx1ZT0iMC4wIi8+CisgICAgPHVuZGVybGluZVBvc2l0aW9uIHZhbHVlPSItNzUiLz4KKyAgICA8dW5kZXJsaW5lVGhpY2tuZXNzIHZhbHVlPSI1MCIvPgorICAgIDxpc0ZpeGVkUGl0Y2ggdmFsdWU9IjAiLz4KKyAgICA8bWluTWVtVHlwZTQyIHZhbHVlPSIwIi8+CisgICAgPG1heE1lbVR5cGU0MiB2YWx1ZT0iMCIvPgorICAgIDxtaW5NZW1UeXBlMSB2YWx1ZT0iMCIvPgorICAgIDxtYXhNZW1UeXBlMSB2YWx1ZT0iMCIvPgorICA8L3Bvc3Q+CisKKzwvdHRGb250PgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L2Fzc2V0cy9mb250X3NvdXJjZS9hc2NpaV9iM2VtX3dlaWdodDEwMF9pdGFsaWMudHR4IGIvdGVzdHMvdGVzdHMvd2lkZ2V0L2Fzc2V0cy9mb250X3NvdXJjZS9hc2NpaV9iM2VtX3dlaWdodDEwMF9pdGFsaWMudHR4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZTE3YTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy93aWRnZXQvYXNzZXRzL2ZvbnRfc291cmNlL2FzY2lpX2IzZW1fd2VpZ2h0MTAwX2l0YWxpYy50dHgKQEAgLTAsMCArMSwyMDggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzx0dEZvbnQgc2ZudFZlcnNpb249Ilx4MDBceDAxXHgwMFx4MDAiIHR0TGliVmVyc2lvbj0iMy4wIj4KKworICA8R2x5cGhPcmRlcj4KKyAgICA8R2x5cGhJRCBpZD0iMCIgbmFtZT0iLm5vdGRlZiIvPgorICAgIDxHbHlwaElEIGlkPSIxIiBuYW1lPSIxZW0iLz4KKyAgICA8R2x5cGhJRCBpZD0iMiIgbmFtZT0iM2VtIi8+CisgIDwvR2x5cGhPcmRlcj4KKworICA8aGVhZD4KKyAgICA8dGFibGVWZXJzaW9uIHZhbHVlPSIxLjAiLz4KKyAgICA8Zm9udFJldmlzaW9uIHZhbHVlPSIxLjAiLz4KKyAgICA8Y2hlY2tTdW1BZGp1c3RtZW50IHZhbHVlPSIweDY0MGNkYjJmIi8+CisgICAgPG1hZ2ljTnVtYmVyIHZhbHVlPSIweDVmMGYzY2Y1Ii8+CisgICAgPGZsYWdzIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAxMSIvPgorICAgIDx1bml0c1BlckVtIHZhbHVlPSIxMDAwIi8+CisgICAgPGNyZWF0ZWQgdmFsdWU9IlRodSBGZWIgMjIgMTA6MDQ6MjggMjAxOCIvPgorICAgIDxtYWNTdHlsZSB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMTAiLz4KKyAgICA8bG93ZXN0UmVjUFBFTSB2YWx1ZT0iNyIvPgorICAgIDxmb250RGlyZWN0aW9uSGludCB2YWx1ZT0iMiIvPgorICAgIDxnbHlwaERhdGFGb3JtYXQgdmFsdWU9IjAiLz4KKyAgPC9oZWFkPgorCisgIDxoaGVhPgorICAgIDx0YWJsZVZlcnNpb24gdmFsdWU9IjB4MDAwMTAwMDAiLz4KKyAgICA8YXNjZW50IHZhbHVlPSIxMDAwIi8+CisgICAgPGRlc2NlbnQgdmFsdWU9Ii0yMDAiLz4KKyAgICA8bGluZUdhcCB2YWx1ZT0iMCIvPgorICAgIDxjYXJldFNsb3BlUmlzZSB2YWx1ZT0iMSIvPgorICAgIDxjYXJldFNsb3BlUnVuIHZhbHVlPSIwIi8+CisgICAgPGNhcmV0T2Zmc2V0IHZhbHVlPSIwIi8+CisgICAgPHJlc2VydmVkMCB2YWx1ZT0iMCIvPgorICAgIDxyZXNlcnZlZDEgdmFsdWU9IjAiLz4KKyAgICA8cmVzZXJ2ZWQyIHZhbHVlPSIwIi8+CisgICAgPHJlc2VydmVkMyB2YWx1ZT0iMCIvPgorICAgIDxtZXRyaWNEYXRhRm9ybWF0IHZhbHVlPSIwIi8+CisgIDwvaGhlYT4KKworICA8bWF4cD4KKyAgICA8dGFibGVWZXJzaW9uIHZhbHVlPSIweDEwMDAwIi8+CisgICAgPG1heFpvbmVzIHZhbHVlPSIwIi8+CisgICAgPG1heFR3aWxpZ2h0UG9pbnRzIHZhbHVlPSIwIi8+CisgICAgPG1heFN0b3JhZ2UgdmFsdWU9IjAiLz4KKyAgICA8bWF4RnVuY3Rpb25EZWZzIHZhbHVlPSIwIi8+CisgICAgPG1heEluc3RydWN0aW9uRGVmcyB2YWx1ZT0iMCIvPgorICAgIDxtYXhTdGFja0VsZW1lbnRzIHZhbHVlPSIwIi8+CisgICAgPG1heFNpemVPZkluc3RydWN0aW9ucyB2YWx1ZT0iMCIvPgorICAgIDxtYXhDb21wb25lbnRFbGVtZW50cyB2YWx1ZT0iMCIvPgorICA8L21heHA+CisKKyAgPE9TXzI+CisgICAgPCEtLSBUaGUgZmllbGRzICd1c0ZpcnN0Q2hhckluZGV4JyBhbmQgJ3VzTGFzdENoYXJJbmRleCcKKyAgICAgICAgIHdpbGwgYmUgcmVjYWxjdWxhdGVkIGJ5IHRoZSBjb21waWxlciAtLT4KKyAgICA8dmVyc2lvbiB2YWx1ZT0iMyIvPgorICAgIDx4QXZnQ2hhcldpZHRoIHZhbHVlPSI1OTQiLz4KKyAgICA8dXNXZWlnaHRDbGFzcyB2YWx1ZT0iMTAwIi8+CisgICAgPHVzV2lkdGhDbGFzcyB2YWx1ZT0iNSIvPgorICAgIDxmc1R5cGUgdmFsdWU9IjAwMDAwMDAwIDAwMDAxMDAwIi8+CisgICAgPHlTdWJzY3JpcHRYU2l6ZSB2YWx1ZT0iNjUwIi8+CisgICAgPHlTdWJzY3JpcHRZU2l6ZSB2YWx1ZT0iNjAwIi8+CisgICAgPHlTdWJzY3JpcHRYT2Zmc2V0IHZhbHVlPSIwIi8+CisgICAgPHlTdWJzY3JpcHRZT2Zmc2V0IHZhbHVlPSI3NSIvPgorICAgIDx5U3VwZXJzY3JpcHRYU2l6ZSB2YWx1ZT0iNjUwIi8+CisgICAgPHlTdXBlcnNjcmlwdFlTaXplIHZhbHVlPSI2MDAiLz4KKyAgICA8eVN1cGVyc2NyaXB0WE9mZnNldCB2YWx1ZT0iMCIvPgorICAgIDx5U3VwZXJzY3JpcHRZT2Zmc2V0IHZhbHVlPSIzNTAiLz4KKyAgICA8eVN0cmlrZW91dFNpemUgdmFsdWU9IjUwIi8+CisgICAgPHlTdHJpa2VvdXRQb3NpdGlvbiB2YWx1ZT0iMzAwIi8+CisgICAgPHNGYW1pbHlDbGFzcyB2YWx1ZT0iMCIvPgorICAgIDxwYW5vc2U+CisgICAgICA8YkZhbWlseVR5cGUgdmFsdWU9IjAiLz4KKyAgICAgIDxiU2VyaWZTdHlsZSB2YWx1ZT0iMCIvPgorICAgICAgPGJXZWlnaHQgdmFsdWU9IjUiLz4KKyAgICAgIDxiUHJvcG9ydGlvbiB2YWx1ZT0iMCIvPgorICAgICAgPGJDb250cmFzdCB2YWx1ZT0iMCIvPgorICAgICAgPGJTdHJva2VWYXJpYXRpb24gdmFsdWU9IjAiLz4KKyAgICAgIDxiQXJtU3R5bGUgdmFsdWU9IjAiLz4KKyAgICAgIDxiTGV0dGVyRm9ybSB2YWx1ZT0iMCIvPgorICAgICAgPGJNaWRsaW5lIHZhbHVlPSIwIi8+CisgICAgICA8YlhIZWlnaHQgdmFsdWU9IjAiLz4KKyAgICA8L3Bhbm9zZT4KKyAgICA8dWxVbmljb2RlUmFuZ2UxIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMSIvPgorICAgIDx1bFVuaWNvZGVSYW5nZTIgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIi8+CisgICAgPHVsVW5pY29kZVJhbmdlMyB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAiLz4KKyAgICA8dWxVbmljb2RlUmFuZ2U0IHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCIvPgorICAgIDxhY2hWZW5kSUQgdmFsdWU9IlVLV04iLz4KKyAgICA8ZnNTZWxlY3Rpb24gdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAxIi8+CisgICAgPHVzRmlyc3RDaGFySW5kZXggdmFsdWU9IjMyIi8+CisgICAgPHVzTGFzdENoYXJJbmRleCB2YWx1ZT0iMTIyIi8+CisgICAgPHNUeXBvQXNjZW5kZXIgdmFsdWU9IjgwMCIvPgorICAgIDxzVHlwb0Rlc2NlbmRlciB2YWx1ZT0iLTIwMCIvPgorICAgIDxzVHlwb0xpbmVHYXAgdmFsdWU9IjIwMCIvPgorICAgIDx1c1dpbkFzY2VudCB2YWx1ZT0iMTAwMCIvPgorICAgIDx1c1dpbkRlc2NlbnQgdmFsdWU9IjIwMCIvPgorICAgIDx1bENvZGVQYWdlUmFuZ2UxIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMSIvPgorICAgIDx1bENvZGVQYWdlUmFuZ2UyIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCIvPgorICAgIDxzeEhlaWdodCB2YWx1ZT0iNTAwIi8+CisgICAgPHNDYXBIZWlnaHQgdmFsdWU9IjcwMCIvPgorICAgIDx1c0RlZmF1bHRDaGFyIHZhbHVlPSIwIi8+CisgICAgPHVzQnJlYWtDaGFyIHZhbHVlPSIzMiIvPgorICAgIDx1c01heENvbnRleHQgdmFsdWU9IjAiLz4KKyAgPC9PU18yPgorCisgIDxobXR4PgorICAgIDxtdHggbmFtZT0iLm5vdGRlZiIgd2lkdGg9IjUwMCIgbHNiPSI5MyIvPgorICAgIDxtdHggbmFtZT0iMWVtIiB3aWR0aD0iMTAwMCIgbHNiPSI5MyIvPgorICAgIDxtdHggbmFtZT0iM2VtIiB3aWR0aD0iMzAwMCIgbHNiPSI5MyIvPgorICA8L2htdHg+CisKKyAgPGNtYXA+CisgICAgPHRhYmxlVmVyc2lvbiB2ZXJzaW9uPSIwIi8+CisgICAgPGNtYXBfZm9ybWF0XzQgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxMCIgbGFuZ3VhZ2U9IjAiPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2MSIgbmFtZT0iMWVtIiAvPiA8IS0tIGEgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDYyIiBuYW1lPSIzZW0iIC8+IDwhLS0gYiAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjMiIG5hbWU9IjFlbSIgLz4gPCEtLSBjIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2NCIgbmFtZT0iMWVtIiAvPiA8IS0tIGQgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDY1IiBuYW1lPSIxZW0iIC8+IDwhLS0gZSAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjYiIG5hbWU9IjFlbSIgLz4gPCEtLSBmIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2NyIgbmFtZT0iMWVtIiAvPiA8IS0tIGcgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDY4IiBuYW1lPSIxZW0iIC8+IDwhLS0gaCAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjkiIG5hbWU9IjFlbSIgLz4gPCEtLSBpIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2QSIgbmFtZT0iMWVtIiAvPiA8IS0tIGogLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDZCIiBuYW1lPSIxZW0iIC8+IDwhLS0gayAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNkMiIG5hbWU9IjFlbSIgLz4gPCEtLSBsIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2RCIgbmFtZT0iMWVtIiAvPiA8IS0tIG0gLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDZFIiBuYW1lPSIxZW0iIC8+IDwhLS0gbiAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNkYiIG5hbWU9IjFlbSIgLz4gPCEtLSBvIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3MCIgbmFtZT0iMWVtIiAvPiA8IS0tIHAgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDcxIiBuYW1lPSIxZW0iIC8+IDwhLS0gcSAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzIiIG5hbWU9IjFlbSIgLz4gPCEtLSByIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3MyIgbmFtZT0iMWVtIiAvPiA8IS0tIHMgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDc0IiBuYW1lPSIxZW0iIC8+IDwhLS0gdCAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzUiIG5hbWU9IjFlbSIgLz4gPCEtLSB1IC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3NiIgbmFtZT0iMWVtIiAvPiA8IS0tIHYgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDc3IiBuYW1lPSIxZW0iIC8+IDwhLS0gdyAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzgiIG5hbWU9IjFlbSIgLz4gPCEtLSB4IC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3OSIgbmFtZT0iMWVtIiAvPiA8IS0tIHkgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDdBIiBuYW1lPSIxZW0iIC8+IDwhLS0geiAtLT4KKyAgICA8L2NtYXBfZm9ybWF0XzQ+CisgIDwvY21hcD4KKworICA8bG9jYT4KKyAgICA8IS0tIFRoZSAnbG9jYScgdGFibGUgd2lsbCBiZSBjYWxjdWxhdGVkIGJ5IHRoZSBjb21waWxlciAtLT4KKyAgPC9sb2NhPgorCisgIDxnbHlmPgorICAgIDxUVEdseXBoIG5hbWU9Ii5ub3RkZWYiIHhNaW49IjAiIHlNaW49IjAiIHhNYXg9IjAiIHlNYXg9IjAiIC8+CisgICAgPFRUR2x5cGggbmFtZT0iMWVtIiB4TWluPSIwIiB5TWluPSIwIiB4TWF4PSIwIiB5TWF4PSIwIiAvPgorICAgIDxUVEdseXBoIG5hbWU9IjNlbSIgeE1pbj0iMCIgeU1pbj0iMCIgeE1heD0iMCIgeU1heD0iMCIgLz4KKyAgPC9nbHlmPgorCisgIDxuYW1lPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iMCIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iMSIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIFNhbXBsZSBGb250CisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iMiIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIFJlZ3VsYXIKKyAgICA8L25hbWVyZWNvcmQ+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSI0IiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgU2FtcGxlIEZvbnQKKyAgICA8L25hbWVyZWNvcmQ+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSI2IiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgU2FtcGxlRm9udC1SZWd1bGFyCisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iMTMiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iMTQiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICA8L25hbWVyZWNvcmQ+CisgIDwvbmFtZT4KKworICA8cG9zdD4KKyAgICA8Zm9ybWF0VHlwZSB2YWx1ZT0iMy4wIi8+CisgICAgPGl0YWxpY0FuZ2xlIHZhbHVlPSIwLjAiLz4KKyAgICA8dW5kZXJsaW5lUG9zaXRpb24gdmFsdWU9Ii03NSIvPgorICAgIDx1bmRlcmxpbmVUaGlja25lc3MgdmFsdWU9IjUwIi8+CisgICAgPGlzRml4ZWRQaXRjaCB2YWx1ZT0iMCIvPgorICAgIDxtaW5NZW1UeXBlNDIgdmFsdWU9IjAiLz4KKyAgICA8bWF4TWVtVHlwZTQyIHZhbHVlPSIwIi8+CisgICAgPG1pbk1lbVR5cGUxIHZhbHVlPSIwIi8+CisgICAgPG1heE1lbVR5cGUxIHZhbHVlPSIwIi8+CisgIDwvcG9zdD4KKworPC90dEZvbnQ+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy93aWRnZXQvYXNzZXRzL2ZvbnRfc291cmNlL2FzY2lpX2MzZW1fd2VpZ2h0MjAwX3VwcmlnaHQudHR4IGIvdGVzdHMvdGVzdHMvd2lkZ2V0L2Fzc2V0cy9mb250X3NvdXJjZS9hc2NpaV9jM2VtX3dlaWdodDIwMF91cHJpZ2h0LnR0eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzM1MzYwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L2Fzc2V0cy9mb250X3NvdXJjZS9hc2NpaV9jM2VtX3dlaWdodDIwMF91cHJpZ2h0LnR0eApAQCAtMCwwICsxLDIwOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUworICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHR0Rm9udCBzZm50VmVyc2lvbj0iXHgwMFx4MDFceDAwXHgwMCIgdHRMaWJWZXJzaW9uPSIzLjAiPgorCisgIDxHbHlwaE9yZGVyPgorICAgIDxHbHlwaElEIGlkPSIwIiBuYW1lPSIubm90ZGVmIi8+CisgICAgPEdseXBoSUQgaWQ9IjEiIG5hbWU9IjFlbSIvPgorICAgIDxHbHlwaElEIGlkPSIyIiBuYW1lPSIzZW0iLz4KKyAgPC9HbHlwaE9yZGVyPgorCisgIDxoZWFkPgorICAgIDx0YWJsZVZlcnNpb24gdmFsdWU9IjEuMCIvPgorICAgIDxmb250UmV2aXNpb24gdmFsdWU9IjEuMCIvPgorICAgIDxjaGVja1N1bUFkanVzdG1lbnQgdmFsdWU9IjB4NjQwY2RiMmYiLz4KKyAgICA8bWFnaWNOdW1iZXIgdmFsdWU9IjB4NWYwZjNjZjUiLz4KKyAgICA8ZmxhZ3MgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDExIi8+CisgICAgPHVuaXRzUGVyRW0gdmFsdWU9IjEwMDAiLz4KKyAgICA8Y3JlYXRlZCB2YWx1ZT0iVGh1IEZlYiAyMiAxMDowNDoyOCAyMDE4Ii8+CisgICAgPG1hY1N0eWxlIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMCIvPgorICAgIDxsb3dlc3RSZWNQUEVNIHZhbHVlPSI3Ii8+CisgICAgPGZvbnREaXJlY3Rpb25IaW50IHZhbHVlPSIyIi8+CisgICAgPGdseXBoRGF0YUZvcm1hdCB2YWx1ZT0iMCIvPgorICA8L2hlYWQ+CisKKyAgPGhoZWE+CisgICAgPHRhYmxlVmVyc2lvbiB2YWx1ZT0iMHgwMDAxMDAwMCIvPgorICAgIDxhc2NlbnQgdmFsdWU9IjEwMDAiLz4KKyAgICA8ZGVzY2VudCB2YWx1ZT0iLTIwMCIvPgorICAgIDxsaW5lR2FwIHZhbHVlPSIwIi8+CisgICAgPGNhcmV0U2xvcGVSaXNlIHZhbHVlPSIxIi8+CisgICAgPGNhcmV0U2xvcGVSdW4gdmFsdWU9IjAiLz4KKyAgICA8Y2FyZXRPZmZzZXQgdmFsdWU9IjAiLz4KKyAgICA8cmVzZXJ2ZWQwIHZhbHVlPSIwIi8+CisgICAgPHJlc2VydmVkMSB2YWx1ZT0iMCIvPgorICAgIDxyZXNlcnZlZDIgdmFsdWU9IjAiLz4KKyAgICA8cmVzZXJ2ZWQzIHZhbHVlPSIwIi8+CisgICAgPG1ldHJpY0RhdGFGb3JtYXQgdmFsdWU9IjAiLz4KKyAgPC9oaGVhPgorCisgIDxtYXhwPgorICAgIDx0YWJsZVZlcnNpb24gdmFsdWU9IjB4MTAwMDAiLz4KKyAgICA8bWF4Wm9uZXMgdmFsdWU9IjAiLz4KKyAgICA8bWF4VHdpbGlnaHRQb2ludHMgdmFsdWU9IjAiLz4KKyAgICA8bWF4U3RvcmFnZSB2YWx1ZT0iMCIvPgorICAgIDxtYXhGdW5jdGlvbkRlZnMgdmFsdWU9IjAiLz4KKyAgICA8bWF4SW5zdHJ1Y3Rpb25EZWZzIHZhbHVlPSIwIi8+CisgICAgPG1heFN0YWNrRWxlbWVudHMgdmFsdWU9IjAiLz4KKyAgICA8bWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zIHZhbHVlPSIwIi8+CisgICAgPG1heENvbXBvbmVudEVsZW1lbnRzIHZhbHVlPSIwIi8+CisgIDwvbWF4cD4KKworICA8T1NfMj4KKyAgICA8IS0tIFRoZSBmaWVsZHMgJ3VzRmlyc3RDaGFySW5kZXgnIGFuZCAndXNMYXN0Q2hhckluZGV4JworICAgICAgICAgd2lsbCBiZSByZWNhbGN1bGF0ZWQgYnkgdGhlIGNvbXBpbGVyIC0tPgorICAgIDx2ZXJzaW9uIHZhbHVlPSIzIi8+CisgICAgPHhBdmdDaGFyV2lkdGggdmFsdWU9IjU5NCIvPgorICAgIDx1c1dlaWdodENsYXNzIHZhbHVlPSIyMDAiLz4KKyAgICA8dXNXaWR0aENsYXNzIHZhbHVlPSI1Ii8+CisgICAgPGZzVHlwZSB2YWx1ZT0iMDAwMDAwMDAgMDAwMDEwMDAiLz4KKyAgICA8eVN1YnNjcmlwdFhTaXplIHZhbHVlPSI2NTAiLz4KKyAgICA8eVN1YnNjcmlwdFlTaXplIHZhbHVlPSI2MDAiLz4KKyAgICA8eVN1YnNjcmlwdFhPZmZzZXQgdmFsdWU9IjAiLz4KKyAgICA8eVN1YnNjcmlwdFlPZmZzZXQgdmFsdWU9Ijc1Ii8+CisgICAgPHlTdXBlcnNjcmlwdFhTaXplIHZhbHVlPSI2NTAiLz4KKyAgICA8eVN1cGVyc2NyaXB0WVNpemUgdmFsdWU9IjYwMCIvPgorICAgIDx5U3VwZXJzY3JpcHRYT2Zmc2V0IHZhbHVlPSIwIi8+CisgICAgPHlTdXBlcnNjcmlwdFlPZmZzZXQgdmFsdWU9IjM1MCIvPgorICAgIDx5U3RyaWtlb3V0U2l6ZSB2YWx1ZT0iNTAiLz4KKyAgICA8eVN0cmlrZW91dFBvc2l0aW9uIHZhbHVlPSIzMDAiLz4KKyAgICA8c0ZhbWlseUNsYXNzIHZhbHVlPSIwIi8+CisgICAgPHBhbm9zZT4KKyAgICAgIDxiRmFtaWx5VHlwZSB2YWx1ZT0iMCIvPgorICAgICAgPGJTZXJpZlN0eWxlIHZhbHVlPSIwIi8+CisgICAgICA8YldlaWdodCB2YWx1ZT0iNSIvPgorICAgICAgPGJQcm9wb3J0aW9uIHZhbHVlPSIwIi8+CisgICAgICA8YkNvbnRyYXN0IHZhbHVlPSIwIi8+CisgICAgICA8YlN0cm9rZVZhcmlhdGlvbiB2YWx1ZT0iMCIvPgorICAgICAgPGJBcm1TdHlsZSB2YWx1ZT0iMCIvPgorICAgICAgPGJMZXR0ZXJGb3JtIHZhbHVlPSIwIi8+CisgICAgICA8Yk1pZGxpbmUgdmFsdWU9IjAiLz4KKyAgICAgIDxiWEhlaWdodCB2YWx1ZT0iMCIvPgorICAgIDwvcGFub3NlPgorICAgIDx1bFVuaWNvZGVSYW5nZTEgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAxIi8+CisgICAgPHVsVW5pY29kZVJhbmdlMiB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAiLz4KKyAgICA8dWxVbmljb2RlUmFuZ2UzIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCIvPgorICAgIDx1bFVuaWNvZGVSYW5nZTQgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIi8+CisgICAgPGFjaFZlbmRJRCB2YWx1ZT0iVUtXTiIvPgorICAgIDxmc1NlbGVjdGlvbiB2YWx1ZT0iMDAwMDAwMDAgMDEwMDAwMDAiLz4KKyAgICA8dXNGaXJzdENoYXJJbmRleCB2YWx1ZT0iMzIiLz4KKyAgICA8dXNMYXN0Q2hhckluZGV4IHZhbHVlPSIxMjIiLz4KKyAgICA8c1R5cG9Bc2NlbmRlciB2YWx1ZT0iODAwIi8+CisgICAgPHNUeXBvRGVzY2VuZGVyIHZhbHVlPSItMjAwIi8+CisgICAgPHNUeXBvTGluZUdhcCB2YWx1ZT0iMjAwIi8+CisgICAgPHVzV2luQXNjZW50IHZhbHVlPSIxMDAwIi8+CisgICAgPHVzV2luRGVzY2VudCB2YWx1ZT0iMjAwIi8+CisgICAgPHVsQ29kZVBhZ2VSYW5nZTEgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAxIi8+CisgICAgPHVsQ29kZVBhZ2VSYW5nZTIgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIi8+CisgICAgPHN4SGVpZ2h0IHZhbHVlPSI1MDAiLz4KKyAgICA8c0NhcEhlaWdodCB2YWx1ZT0iNzAwIi8+CisgICAgPHVzRGVmYXVsdENoYXIgdmFsdWU9IjAiLz4KKyAgICA8dXNCcmVha0NoYXIgdmFsdWU9IjMyIi8+CisgICAgPHVzTWF4Q29udGV4dCB2YWx1ZT0iMCIvPgorICA8L09TXzI+CisKKyAgPGhtdHg+CisgICAgPG10eCBuYW1lPSIubm90ZGVmIiB3aWR0aD0iNTAwIiBsc2I9IjkzIi8+CisgICAgPG10eCBuYW1lPSIxZW0iIHdpZHRoPSIxMDAwIiBsc2I9IjkzIi8+CisgICAgPG10eCBuYW1lPSIzZW0iIHdpZHRoPSIzMDAwIiBsc2I9IjkzIi8+CisgIDwvaG10eD4KKworICA8Y21hcD4KKyAgICA8dGFibGVWZXJzaW9uIHZlcnNpb249IjAiLz4KKyAgICA8Y21hcF9mb3JtYXRfNCBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEwIiBsYW5ndWFnZT0iMCI+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDYxIiBuYW1lPSIxZW0iIC8+IDwhLS0gYSAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjIiIG5hbWU9IjFlbSIgLz4gPCEtLSBiIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2MyIgbmFtZT0iM2VtIiAvPiA8IS0tIGMgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDY0IiBuYW1lPSIxZW0iIC8+IDwhLS0gZCAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjUiIG5hbWU9IjFlbSIgLz4gPCEtLSBlIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2NiIgbmFtZT0iMWVtIiAvPiA8IS0tIGYgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDY3IiBuYW1lPSIxZW0iIC8+IDwhLS0gZyAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjgiIG5hbWU9IjFlbSIgLz4gPCEtLSBoIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2OSIgbmFtZT0iMWVtIiAvPiA8IS0tIGkgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDZBIiBuYW1lPSIxZW0iIC8+IDwhLS0gaiAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNkIiIG5hbWU9IjFlbSIgLz4gPCEtLSBrIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2QyIgbmFtZT0iMWVtIiAvPiA8IS0tIGwgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDZEIiBuYW1lPSIxZW0iIC8+IDwhLS0gbSAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNkUiIG5hbWU9IjFlbSIgLz4gPCEtLSBuIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2RiIgbmFtZT0iMWVtIiAvPiA8IS0tIG8gLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDcwIiBuYW1lPSIxZW0iIC8+IDwhLS0gcCAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzEiIG5hbWU9IjFlbSIgLz4gPCEtLSBxIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3MiIgbmFtZT0iMWVtIiAvPiA8IS0tIHIgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDczIiBuYW1lPSIxZW0iIC8+IDwhLS0gcyAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzQiIG5hbWU9IjFlbSIgLz4gPCEtLSB0IC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3NSIgbmFtZT0iMWVtIiAvPiA8IS0tIHUgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDc2IiBuYW1lPSIxZW0iIC8+IDwhLS0gdiAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzciIG5hbWU9IjFlbSIgLz4gPCEtLSB3IC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3OCIgbmFtZT0iMWVtIiAvPiA8IS0tIHggLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDc5IiBuYW1lPSIxZW0iIC8+IDwhLS0geSAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwN0EiIG5hbWU9IjFlbSIgLz4gPCEtLSB6IC0tPgorICAgIDwvY21hcF9mb3JtYXRfND4KKyAgPC9jbWFwPgorCisgIDxsb2NhPgorICAgIDwhLS0gVGhlICdsb2NhJyB0YWJsZSB3aWxsIGJlIGNhbGN1bGF0ZWQgYnkgdGhlIGNvbXBpbGVyIC0tPgorICA8L2xvY2E+CisKKyAgPGdseWY+CisgICAgPFRUR2x5cGggbmFtZT0iLm5vdGRlZiIgeE1pbj0iMCIgeU1pbj0iMCIgeE1heD0iMCIgeU1heD0iMCIgLz4KKyAgICA8VFRHbHlwaCBuYW1lPSIxZW0iIHhNaW49IjAiIHlNaW49IjAiIHhNYXg9IjAiIHlNYXg9IjAiIC8+CisgICAgPFRUR2x5cGggbmFtZT0iM2VtIiB4TWluPSIwIiB5TWluPSIwIiB4TWF4PSIwIiB5TWF4PSIwIiAvPgorICA8L2dseWY+CisKKyAgPG5hbWU+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSIwIiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAgICA8L25hbWVyZWNvcmQ+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSIxIiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgU2FtcGxlIEZvbnQKKyAgICA8L25hbWVyZWNvcmQ+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSIyIiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgUmVndWxhcgorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjQiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBTYW1wbGUgRm9udAorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjYiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBTYW1wbGVGb250LVJlZ3VsYXIKKyAgICA8L25hbWVyZWNvcmQ+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSIxMyIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUworICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAgICA8L25hbWVyZWNvcmQ+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSIxNCIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgIDwvbmFtZXJlY29yZD4KKyAgPC9uYW1lPgorCisgIDxwb3N0PgorICAgIDxmb3JtYXRUeXBlIHZhbHVlPSIzLjAiLz4KKyAgICA8aXRhbGljQW5nbGUgdmFsdWU9IjAuMCIvPgorICAgIDx1bmRlcmxpbmVQb3NpdGlvbiB2YWx1ZT0iLTc1Ii8+CisgICAgPHVuZGVybGluZVRoaWNrbmVzcyB2YWx1ZT0iNTAiLz4KKyAgICA8aXNGaXhlZFBpdGNoIHZhbHVlPSIwIi8+CisgICAgPG1pbk1lbVR5cGU0MiB2YWx1ZT0iMCIvPgorICAgIDxtYXhNZW1UeXBlNDIgdmFsdWU9IjAiLz4KKyAgICA8bWluTWVtVHlwZTEgdmFsdWU9IjAiLz4KKyAgICA8bWF4TWVtVHlwZTEgdmFsdWU9IjAiLz4KKyAgPC9wb3N0PgorCis8L3R0Rm9udD4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9hc3NldHMvZm9udF9zb3VyY2UvYXNjaWlfZDNlbV93ZWlnaHQyMDBfaXRhbGljLnR0eCBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9hc3NldHMvZm9udF9zb3VyY2UvYXNjaWlfZDNlbV93ZWlnaHQyMDBfaXRhbGljLnR0eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjAxMTlmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L2Fzc2V0cy9mb250X3NvdXJjZS9hc2NpaV9kM2VtX3dlaWdodDIwMF9pdGFsaWMudHR4CkBAIC0wLDAgKzEsMjA4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8dHRGb250IHNmbnRWZXJzaW9uPSJceDAwXHgwMVx4MDBceDAwIiB0dExpYlZlcnNpb249IjMuMCI+CisKKyAgPEdseXBoT3JkZXI+CisgICAgPEdseXBoSUQgaWQ9IjAiIG5hbWU9Ii5ub3RkZWYiLz4KKyAgICA8R2x5cGhJRCBpZD0iMSIgbmFtZT0iMWVtIi8+CisgICAgPEdseXBoSUQgaWQ9IjIiIG5hbWU9IjNlbSIvPgorICA8L0dseXBoT3JkZXI+CisKKyAgPGhlYWQ+CisgICAgPHRhYmxlVmVyc2lvbiB2YWx1ZT0iMS4wIi8+CisgICAgPGZvbnRSZXZpc2lvbiB2YWx1ZT0iMS4wIi8+CisgICAgPGNoZWNrU3VtQWRqdXN0bWVudCB2YWx1ZT0iMHg2NDBjZGIyZiIvPgorICAgIDxtYWdpY051bWJlciB2YWx1ZT0iMHg1ZjBmM2NmNSIvPgorICAgIDxmbGFncyB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMTEiLz4KKyAgICA8dW5pdHNQZXJFbSB2YWx1ZT0iMTAwMCIvPgorICAgIDxjcmVhdGVkIHZhbHVlPSJUaHUgRmViIDIyIDEwOjA0OjI4IDIwMTgiLz4KKyAgICA8bWFjU3R5bGUgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDEwIi8+CisgICAgPGxvd2VzdFJlY1BQRU0gdmFsdWU9IjciLz4KKyAgICA8Zm9udERpcmVjdGlvbkhpbnQgdmFsdWU9IjIiLz4KKyAgICA8Z2x5cGhEYXRhRm9ybWF0IHZhbHVlPSIwIi8+CisgIDwvaGVhZD4KKworICA8aGhlYT4KKyAgICA8dGFibGVWZXJzaW9uIHZhbHVlPSIweDAwMDEwMDAwIi8+CisgICAgPGFzY2VudCB2YWx1ZT0iMTAwMCIvPgorICAgIDxkZXNjZW50IHZhbHVlPSItMjAwIi8+CisgICAgPGxpbmVHYXAgdmFsdWU9IjAiLz4KKyAgICA8Y2FyZXRTbG9wZVJpc2UgdmFsdWU9IjEiLz4KKyAgICA8Y2FyZXRTbG9wZVJ1biB2YWx1ZT0iMCIvPgorICAgIDxjYXJldE9mZnNldCB2YWx1ZT0iMCIvPgorICAgIDxyZXNlcnZlZDAgdmFsdWU9IjAiLz4KKyAgICA8cmVzZXJ2ZWQxIHZhbHVlPSIwIi8+CisgICAgPHJlc2VydmVkMiB2YWx1ZT0iMCIvPgorICAgIDxyZXNlcnZlZDMgdmFsdWU9IjAiLz4KKyAgICA8bWV0cmljRGF0YUZvcm1hdCB2YWx1ZT0iMCIvPgorICA8L2hoZWE+CisKKyAgPG1heHA+CisgICAgPHRhYmxlVmVyc2lvbiB2YWx1ZT0iMHgxMDAwMCIvPgorICAgIDxtYXhab25lcyB2YWx1ZT0iMCIvPgorICAgIDxtYXhUd2lsaWdodFBvaW50cyB2YWx1ZT0iMCIvPgorICAgIDxtYXhTdG9yYWdlIHZhbHVlPSIwIi8+CisgICAgPG1heEZ1bmN0aW9uRGVmcyB2YWx1ZT0iMCIvPgorICAgIDxtYXhJbnN0cnVjdGlvbkRlZnMgdmFsdWU9IjAiLz4KKyAgICA8bWF4U3RhY2tFbGVtZW50cyB2YWx1ZT0iMCIvPgorICAgIDxtYXhTaXplT2ZJbnN0cnVjdGlvbnMgdmFsdWU9IjAiLz4KKyAgICA8bWF4Q29tcG9uZW50RWxlbWVudHMgdmFsdWU9IjAiLz4KKyAgPC9tYXhwPgorCisgIDxPU18yPgorICAgIDwhLS0gVGhlIGZpZWxkcyAndXNGaXJzdENoYXJJbmRleCcgYW5kICd1c0xhc3RDaGFySW5kZXgnCisgICAgICAgICB3aWxsIGJlIHJlY2FsY3VsYXRlZCBieSB0aGUgY29tcGlsZXIgLS0+CisgICAgPHZlcnNpb24gdmFsdWU9IjMiLz4KKyAgICA8eEF2Z0NoYXJXaWR0aCB2YWx1ZT0iNTk0Ii8+CisgICAgPHVzV2VpZ2h0Q2xhc3MgdmFsdWU9IjIwMCIvPgorICAgIDx1c1dpZHRoQ2xhc3MgdmFsdWU9IjUiLz4KKyAgICA8ZnNUeXBlIHZhbHVlPSIwMDAwMDAwMCAwMDAwMTAwMCIvPgorICAgIDx5U3Vic2NyaXB0WFNpemUgdmFsdWU9IjY1MCIvPgorICAgIDx5U3Vic2NyaXB0WVNpemUgdmFsdWU9IjYwMCIvPgorICAgIDx5U3Vic2NyaXB0WE9mZnNldCB2YWx1ZT0iMCIvPgorICAgIDx5U3Vic2NyaXB0WU9mZnNldCB2YWx1ZT0iNzUiLz4KKyAgICA8eVN1cGVyc2NyaXB0WFNpemUgdmFsdWU9IjY1MCIvPgorICAgIDx5U3VwZXJzY3JpcHRZU2l6ZSB2YWx1ZT0iNjAwIi8+CisgICAgPHlTdXBlcnNjcmlwdFhPZmZzZXQgdmFsdWU9IjAiLz4KKyAgICA8eVN1cGVyc2NyaXB0WU9mZnNldCB2YWx1ZT0iMzUwIi8+CisgICAgPHlTdHJpa2VvdXRTaXplIHZhbHVlPSI1MCIvPgorICAgIDx5U3RyaWtlb3V0UG9zaXRpb24gdmFsdWU9IjMwMCIvPgorICAgIDxzRmFtaWx5Q2xhc3MgdmFsdWU9IjAiLz4KKyAgICA8cGFub3NlPgorICAgICAgPGJGYW1pbHlUeXBlIHZhbHVlPSIwIi8+CisgICAgICA8YlNlcmlmU3R5bGUgdmFsdWU9IjAiLz4KKyAgICAgIDxiV2VpZ2h0IHZhbHVlPSI1Ii8+CisgICAgICA8YlByb3BvcnRpb24gdmFsdWU9IjAiLz4KKyAgICAgIDxiQ29udHJhc3QgdmFsdWU9IjAiLz4KKyAgICAgIDxiU3Ryb2tlVmFyaWF0aW9uIHZhbHVlPSIwIi8+CisgICAgICA8YkFybVN0eWxlIHZhbHVlPSIwIi8+CisgICAgICA8YkxldHRlckZvcm0gdmFsdWU9IjAiLz4KKyAgICAgIDxiTWlkbGluZSB2YWx1ZT0iMCIvPgorICAgICAgPGJYSGVpZ2h0IHZhbHVlPSIwIi8+CisgICAgPC9wYW5vc2U+CisgICAgPHVsVW5pY29kZVJhbmdlMSB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDEiLz4KKyAgICA8dWxVbmljb2RlUmFuZ2UyIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCIvPgorICAgIDx1bFVuaWNvZGVSYW5nZTMgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIi8+CisgICAgPHVsVW5pY29kZVJhbmdlNCB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAiLz4KKyAgICA8YWNoVmVuZElEIHZhbHVlPSJVS1dOIi8+CisgICAgPGZzU2VsZWN0aW9uIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMSIvPgorICAgIDx1c0ZpcnN0Q2hhckluZGV4IHZhbHVlPSIzMiIvPgorICAgIDx1c0xhc3RDaGFySW5kZXggdmFsdWU9IjEyMiIvPgorICAgIDxzVHlwb0FzY2VuZGVyIHZhbHVlPSI4MDAiLz4KKyAgICA8c1R5cG9EZXNjZW5kZXIgdmFsdWU9Ii0yMDAiLz4KKyAgICA8c1R5cG9MaW5lR2FwIHZhbHVlPSIyMDAiLz4KKyAgICA8dXNXaW5Bc2NlbnQgdmFsdWU9IjEwMDAiLz4KKyAgICA8dXNXaW5EZXNjZW50IHZhbHVlPSIyMDAiLz4KKyAgICA8dWxDb2RlUGFnZVJhbmdlMSB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDEiLz4KKyAgICA8dWxDb2RlUGFnZVJhbmdlMiB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAiLz4KKyAgICA8c3hIZWlnaHQgdmFsdWU9IjUwMCIvPgorICAgIDxzQ2FwSGVpZ2h0IHZhbHVlPSI3MDAiLz4KKyAgICA8dXNEZWZhdWx0Q2hhciB2YWx1ZT0iMCIvPgorICAgIDx1c0JyZWFrQ2hhciB2YWx1ZT0iMzIiLz4KKyAgICA8dXNNYXhDb250ZXh0IHZhbHVlPSIwIi8+CisgIDwvT1NfMj4KKworICA8aG10eD4KKyAgICA8bXR4IG5hbWU9Ii5ub3RkZWYiIHdpZHRoPSI1MDAiIGxzYj0iOTMiLz4KKyAgICA8bXR4IG5hbWU9IjFlbSIgd2lkdGg9IjEwMDAiIGxzYj0iOTMiLz4KKyAgICA8bXR4IG5hbWU9IjNlbSIgd2lkdGg9IjMwMDAiIGxzYj0iOTMiLz4KKyAgPC9obXR4PgorCisgIDxjbWFwPgorICAgIDx0YWJsZVZlcnNpb24gdmVyc2lvbj0iMCIvPgorICAgIDxjbWFwX2Zvcm1hdF80IHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMTAiIGxhbmd1YWdlPSIwIj4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjEiIG5hbWU9IjFlbSIgLz4gPCEtLSBhIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2MiIgbmFtZT0iMWVtIiAvPiA8IS0tIGIgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDYzIiBuYW1lPSIxZW0iIC8+IDwhLS0gYyAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjQiIG5hbWU9IjNlbSIgLz4gPCEtLSBkIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2NSIgbmFtZT0iMWVtIiAvPiA8IS0tIGUgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDY2IiBuYW1lPSIxZW0iIC8+IDwhLS0gZiAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjciIG5hbWU9IjFlbSIgLz4gPCEtLSBnIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2OCIgbmFtZT0iMWVtIiAvPiA8IS0tIGggLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDY5IiBuYW1lPSIxZW0iIC8+IDwhLS0gaSAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNkEiIG5hbWU9IjFlbSIgLz4gPCEtLSBqIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2QiIgbmFtZT0iMWVtIiAvPiA8IS0tIGsgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDZDIiBuYW1lPSIxZW0iIC8+IDwhLS0gbCAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNkQiIG5hbWU9IjFlbSIgLz4gPCEtLSBtIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2RSIgbmFtZT0iMWVtIiAvPiA8IS0tIG4gLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDZGIiBuYW1lPSIxZW0iIC8+IDwhLS0gbyAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzAiIG5hbWU9IjFlbSIgLz4gPCEtLSBwIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3MSIgbmFtZT0iMWVtIiAvPiA8IS0tIHEgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDcyIiBuYW1lPSIxZW0iIC8+IDwhLS0gciAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzMiIG5hbWU9IjFlbSIgLz4gPCEtLSBzIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3NCIgbmFtZT0iMWVtIiAvPiA8IS0tIHQgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDc1IiBuYW1lPSIxZW0iIC8+IDwhLS0gdSAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzYiIG5hbWU9IjFlbSIgLz4gPCEtLSB2IC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3NyIgbmFtZT0iMWVtIiAvPiA8IS0tIHcgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDc4IiBuYW1lPSIxZW0iIC8+IDwhLS0geCAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzkiIG5hbWU9IjFlbSIgLz4gPCEtLSB5IC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3QSIgbmFtZT0iMWVtIiAvPiA8IS0tIHogLS0+CisgICAgPC9jbWFwX2Zvcm1hdF80PgorICA8L2NtYXA+CisKKyAgPGxvY2E+CisgICAgPCEtLSBUaGUgJ2xvY2EnIHRhYmxlIHdpbGwgYmUgY2FsY3VsYXRlZCBieSB0aGUgY29tcGlsZXIgLS0+CisgIDwvbG9jYT4KKworICA8Z2x5Zj4KKyAgICA8VFRHbHlwaCBuYW1lPSIubm90ZGVmIiB4TWluPSIwIiB5TWluPSIwIiB4TWF4PSIwIiB5TWF4PSIwIiAvPgorICAgIDxUVEdseXBoIG5hbWU9IjFlbSIgeE1pbj0iMCIgeU1pbj0iMCIgeE1heD0iMCIgeU1heD0iMCIgLz4KKyAgICA8VFRHbHlwaCBuYW1lPSIzZW0iIHhNaW49IjAiIHlNaW49IjAiIHhNYXg9IjAiIHlNYXg9IjAiIC8+CisgIDwvZ2x5Zj4KKworICA8bmFtZT4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjAiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjEiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBTYW1wbGUgRm9udAorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjIiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBSZWd1bGFyCisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iNCIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIFNhbXBsZSBGb250CisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iNiIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIFNhbXBsZUZvbnQtUmVndWxhcgorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjEzIiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjE0IiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgPC9uYW1lcmVjb3JkPgorICA8L25hbWU+CisKKyAgPHBvc3Q+CisgICAgPGZvcm1hdFR5cGUgdmFsdWU9IjMuMCIvPgorICAgIDxpdGFsaWNBbmdsZSB2YWx1ZT0iMC4wIi8+CisgICAgPHVuZGVybGluZVBvc2l0aW9uIHZhbHVlPSItNzUiLz4KKyAgICA8dW5kZXJsaW5lVGhpY2tuZXNzIHZhbHVlPSI1MCIvPgorICAgIDxpc0ZpeGVkUGl0Y2ggdmFsdWU9IjAiLz4KKyAgICA8bWluTWVtVHlwZTQyIHZhbHVlPSIwIi8+CisgICAgPG1heE1lbVR5cGU0MiB2YWx1ZT0iMCIvPgorICAgIDxtaW5NZW1UeXBlMSB2YWx1ZT0iMCIvPgorICAgIDxtYXhNZW1UeXBlMSB2YWx1ZT0iMCIvPgorICA8L3Bvc3Q+CisKKzwvdHRGb250PgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L2Fzc2V0cy9mb250X3NvdXJjZS9hc2NpaV9lM2VtX3dlaWdodDMwMF91cHJpZ2h0LnR0eCBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9hc3NldHMvZm9udF9zb3VyY2UvYXNjaWlfZTNlbV93ZWlnaHQzMDBfdXByaWdodC50dHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM0YjJiYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9hc3NldHMvZm9udF9zb3VyY2UvYXNjaWlfZTNlbV93ZWlnaHQzMDBfdXByaWdodC50dHgKQEAgLTAsMCArMSwyMDggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzx0dEZvbnQgc2ZudFZlcnNpb249Ilx4MDBceDAxXHgwMFx4MDAiIHR0TGliVmVyc2lvbj0iMy4wIj4KKworICA8R2x5cGhPcmRlcj4KKyAgICA8R2x5cGhJRCBpZD0iMCIgbmFtZT0iLm5vdGRlZiIvPgorICAgIDxHbHlwaElEIGlkPSIxIiBuYW1lPSIxZW0iLz4KKyAgICA8R2x5cGhJRCBpZD0iMiIgbmFtZT0iM2VtIi8+CisgIDwvR2x5cGhPcmRlcj4KKworICA8aGVhZD4KKyAgICA8dGFibGVWZXJzaW9uIHZhbHVlPSIxLjAiLz4KKyAgICA8Zm9udFJldmlzaW9uIHZhbHVlPSIxLjAiLz4KKyAgICA8Y2hlY2tTdW1BZGp1c3RtZW50IHZhbHVlPSIweDY0MGNkYjJmIi8+CisgICAgPG1hZ2ljTnVtYmVyIHZhbHVlPSIweDVmMGYzY2Y1Ii8+CisgICAgPGZsYWdzIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAxMSIvPgorICAgIDx1bml0c1BlckVtIHZhbHVlPSIxMDAwIi8+CisgICAgPGNyZWF0ZWQgdmFsdWU9IlRodSBGZWIgMjIgMTA6MDQ6MjggMjAxOCIvPgorICAgIDxtYWNTdHlsZSB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAiLz4KKyAgICA8bG93ZXN0UmVjUFBFTSB2YWx1ZT0iNyIvPgorICAgIDxmb250RGlyZWN0aW9uSGludCB2YWx1ZT0iMiIvPgorICAgIDxnbHlwaERhdGFGb3JtYXQgdmFsdWU9IjAiLz4KKyAgPC9oZWFkPgorCisgIDxoaGVhPgorICAgIDx0YWJsZVZlcnNpb24gdmFsdWU9IjB4MDAwMTAwMDAiLz4KKyAgICA8YXNjZW50IHZhbHVlPSIxMDAwIi8+CisgICAgPGRlc2NlbnQgdmFsdWU9Ii0yMDAiLz4KKyAgICA8bGluZUdhcCB2YWx1ZT0iMCIvPgorICAgIDxjYXJldFNsb3BlUmlzZSB2YWx1ZT0iMSIvPgorICAgIDxjYXJldFNsb3BlUnVuIHZhbHVlPSIwIi8+CisgICAgPGNhcmV0T2Zmc2V0IHZhbHVlPSIwIi8+CisgICAgPHJlc2VydmVkMCB2YWx1ZT0iMCIvPgorICAgIDxyZXNlcnZlZDEgdmFsdWU9IjAiLz4KKyAgICA8cmVzZXJ2ZWQyIHZhbHVlPSIwIi8+CisgICAgPHJlc2VydmVkMyB2YWx1ZT0iMCIvPgorICAgIDxtZXRyaWNEYXRhRm9ybWF0IHZhbHVlPSIwIi8+CisgIDwvaGhlYT4KKworICA8bWF4cD4KKyAgICA8dGFibGVWZXJzaW9uIHZhbHVlPSIweDEwMDAwIi8+CisgICAgPG1heFpvbmVzIHZhbHVlPSIwIi8+CisgICAgPG1heFR3aWxpZ2h0UG9pbnRzIHZhbHVlPSIwIi8+CisgICAgPG1heFN0b3JhZ2UgdmFsdWU9IjAiLz4KKyAgICA8bWF4RnVuY3Rpb25EZWZzIHZhbHVlPSIwIi8+CisgICAgPG1heEluc3RydWN0aW9uRGVmcyB2YWx1ZT0iMCIvPgorICAgIDxtYXhTdGFja0VsZW1lbnRzIHZhbHVlPSIwIi8+CisgICAgPG1heFNpemVPZkluc3RydWN0aW9ucyB2YWx1ZT0iMCIvPgorICAgIDxtYXhDb21wb25lbnRFbGVtZW50cyB2YWx1ZT0iMCIvPgorICA8L21heHA+CisKKyAgPE9TXzI+CisgICAgPCEtLSBUaGUgZmllbGRzICd1c0ZpcnN0Q2hhckluZGV4JyBhbmQgJ3VzTGFzdENoYXJJbmRleCcKKyAgICAgICAgIHdpbGwgYmUgcmVjYWxjdWxhdGVkIGJ5IHRoZSBjb21waWxlciAtLT4KKyAgICA8dmVyc2lvbiB2YWx1ZT0iMyIvPgorICAgIDx4QXZnQ2hhcldpZHRoIHZhbHVlPSI1OTQiLz4KKyAgICA8dXNXZWlnaHRDbGFzcyB2YWx1ZT0iMzAwIi8+CisgICAgPHVzV2lkdGhDbGFzcyB2YWx1ZT0iNSIvPgorICAgIDxmc1R5cGUgdmFsdWU9IjAwMDAwMDAwIDAwMDAxMDAwIi8+CisgICAgPHlTdWJzY3JpcHRYU2l6ZSB2YWx1ZT0iNjUwIi8+CisgICAgPHlTdWJzY3JpcHRZU2l6ZSB2YWx1ZT0iNjAwIi8+CisgICAgPHlTdWJzY3JpcHRYT2Zmc2V0IHZhbHVlPSIwIi8+CisgICAgPHlTdWJzY3JpcHRZT2Zmc2V0IHZhbHVlPSI3NSIvPgorICAgIDx5U3VwZXJzY3JpcHRYU2l6ZSB2YWx1ZT0iNjUwIi8+CisgICAgPHlTdXBlcnNjcmlwdFlTaXplIHZhbHVlPSI2MDAiLz4KKyAgICA8eVN1cGVyc2NyaXB0WE9mZnNldCB2YWx1ZT0iMCIvPgorICAgIDx5U3VwZXJzY3JpcHRZT2Zmc2V0IHZhbHVlPSIzNTAiLz4KKyAgICA8eVN0cmlrZW91dFNpemUgdmFsdWU9IjUwIi8+CisgICAgPHlTdHJpa2VvdXRQb3NpdGlvbiB2YWx1ZT0iMzAwIi8+CisgICAgPHNGYW1pbHlDbGFzcyB2YWx1ZT0iMCIvPgorICAgIDxwYW5vc2U+CisgICAgICA8YkZhbWlseVR5cGUgdmFsdWU9IjAiLz4KKyAgICAgIDxiU2VyaWZTdHlsZSB2YWx1ZT0iMCIvPgorICAgICAgPGJXZWlnaHQgdmFsdWU9IjUiLz4KKyAgICAgIDxiUHJvcG9ydGlvbiB2YWx1ZT0iMCIvPgorICAgICAgPGJDb250cmFzdCB2YWx1ZT0iMCIvPgorICAgICAgPGJTdHJva2VWYXJpYXRpb24gdmFsdWU9IjAiLz4KKyAgICAgIDxiQXJtU3R5bGUgdmFsdWU9IjAiLz4KKyAgICAgIDxiTGV0dGVyRm9ybSB2YWx1ZT0iMCIvPgorICAgICAgPGJNaWRsaW5lIHZhbHVlPSIwIi8+CisgICAgICA8YlhIZWlnaHQgdmFsdWU9IjAiLz4KKyAgICA8L3Bhbm9zZT4KKyAgICA8dWxVbmljb2RlUmFuZ2UxIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMSIvPgorICAgIDx1bFVuaWNvZGVSYW5nZTIgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIi8+CisgICAgPHVsVW5pY29kZVJhbmdlMyB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAiLz4KKyAgICA8dWxVbmljb2RlUmFuZ2U0IHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCIvPgorICAgIDxhY2hWZW5kSUQgdmFsdWU9IlVLV04iLz4KKyAgICA8ZnNTZWxlY3Rpb24gdmFsdWU9IjAwMDAwMDAwIDAxMDAwMDAwIi8+CisgICAgPHVzRmlyc3RDaGFySW5kZXggdmFsdWU9IjMyIi8+CisgICAgPHVzTGFzdENoYXJJbmRleCB2YWx1ZT0iMTIyIi8+CisgICAgPHNUeXBvQXNjZW5kZXIgdmFsdWU9IjgwMCIvPgorICAgIDxzVHlwb0Rlc2NlbmRlciB2YWx1ZT0iLTIwMCIvPgorICAgIDxzVHlwb0xpbmVHYXAgdmFsdWU9IjIwMCIvPgorICAgIDx1c1dpbkFzY2VudCB2YWx1ZT0iMTAwMCIvPgorICAgIDx1c1dpbkRlc2NlbnQgdmFsdWU9IjIwMCIvPgorICAgIDx1bENvZGVQYWdlUmFuZ2UxIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMSIvPgorICAgIDx1bENvZGVQYWdlUmFuZ2UyIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCIvPgorICAgIDxzeEhlaWdodCB2YWx1ZT0iNTAwIi8+CisgICAgPHNDYXBIZWlnaHQgdmFsdWU9IjcwMCIvPgorICAgIDx1c0RlZmF1bHRDaGFyIHZhbHVlPSIwIi8+CisgICAgPHVzQnJlYWtDaGFyIHZhbHVlPSIzMiIvPgorICAgIDx1c01heENvbnRleHQgdmFsdWU9IjAiLz4KKyAgPC9PU18yPgorCisgIDxobXR4PgorICAgIDxtdHggbmFtZT0iLm5vdGRlZiIgd2lkdGg9IjUwMCIgbHNiPSI5MyIvPgorICAgIDxtdHggbmFtZT0iMWVtIiB3aWR0aD0iMTAwMCIgbHNiPSI5MyIvPgorICAgIDxtdHggbmFtZT0iM2VtIiB3aWR0aD0iMzAwMCIgbHNiPSI5MyIvPgorICA8L2htdHg+CisKKyAgPGNtYXA+CisgICAgPHRhYmxlVmVyc2lvbiB2ZXJzaW9uPSIwIi8+CisgICAgPGNtYXBfZm9ybWF0XzQgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxMCIgbGFuZ3VhZ2U9IjAiPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2MSIgbmFtZT0iMWVtIiAvPiA8IS0tIGEgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDYyIiBuYW1lPSIxZW0iIC8+IDwhLS0gYiAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjMiIG5hbWU9IjFlbSIgLz4gPCEtLSBjIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2NCIgbmFtZT0iMWVtIiAvPiA8IS0tIGQgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDY1IiBuYW1lPSIzZW0iIC8+IDwhLS0gZSAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjYiIG5hbWU9IjFlbSIgLz4gPCEtLSBmIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2NyIgbmFtZT0iMWVtIiAvPiA8IS0tIGcgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDY4IiBuYW1lPSIxZW0iIC8+IDwhLS0gaCAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjkiIG5hbWU9IjFlbSIgLz4gPCEtLSBpIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2QSIgbmFtZT0iMWVtIiAvPiA8IS0tIGogLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDZCIiBuYW1lPSIxZW0iIC8+IDwhLS0gayAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNkMiIG5hbWU9IjFlbSIgLz4gPCEtLSBsIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2RCIgbmFtZT0iMWVtIiAvPiA8IS0tIG0gLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDZFIiBuYW1lPSIxZW0iIC8+IDwhLS0gbiAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNkYiIG5hbWU9IjFlbSIgLz4gPCEtLSBvIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3MCIgbmFtZT0iMWVtIiAvPiA8IS0tIHAgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDcxIiBuYW1lPSIxZW0iIC8+IDwhLS0gcSAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzIiIG5hbWU9IjFlbSIgLz4gPCEtLSByIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3MyIgbmFtZT0iMWVtIiAvPiA8IS0tIHMgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDc0IiBuYW1lPSIxZW0iIC8+IDwhLS0gdCAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzUiIG5hbWU9IjFlbSIgLz4gPCEtLSB1IC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3NiIgbmFtZT0iMWVtIiAvPiA8IS0tIHYgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDc3IiBuYW1lPSIxZW0iIC8+IDwhLS0gdyAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzgiIG5hbWU9IjFlbSIgLz4gPCEtLSB4IC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3OSIgbmFtZT0iMWVtIiAvPiA8IS0tIHkgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDdBIiBuYW1lPSIxZW0iIC8+IDwhLS0geiAtLT4KKyAgICA8L2NtYXBfZm9ybWF0XzQ+CisgIDwvY21hcD4KKworICA8bG9jYT4KKyAgICA8IS0tIFRoZSAnbG9jYScgdGFibGUgd2lsbCBiZSBjYWxjdWxhdGVkIGJ5IHRoZSBjb21waWxlciAtLT4KKyAgPC9sb2NhPgorCisgIDxnbHlmPgorICAgIDxUVEdseXBoIG5hbWU9Ii5ub3RkZWYiIHhNaW49IjAiIHlNaW49IjAiIHhNYXg9IjAiIHlNYXg9IjAiIC8+CisgICAgPFRUR2x5cGggbmFtZT0iMWVtIiB4TWluPSIwIiB5TWluPSIwIiB4TWF4PSIwIiB5TWF4PSIwIiAvPgorICAgIDxUVEdseXBoIG5hbWU9IjNlbSIgeE1pbj0iMCIgeU1pbj0iMCIgeE1heD0iMCIgeU1heD0iMCIgLz4KKyAgPC9nbHlmPgorCisgIDxuYW1lPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iMCIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iMSIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIFNhbXBsZSBGb250CisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iMiIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIFJlZ3VsYXIKKyAgICA8L25hbWVyZWNvcmQ+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSI0IiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgU2FtcGxlIEZvbnQKKyAgICA8L25hbWVyZWNvcmQ+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSI2IiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgU2FtcGxlRm9udC1SZWd1bGFyCisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iMTMiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iMTQiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICA8L25hbWVyZWNvcmQ+CisgIDwvbmFtZT4KKworICA8cG9zdD4KKyAgICA8Zm9ybWF0VHlwZSB2YWx1ZT0iMy4wIi8+CisgICAgPGl0YWxpY0FuZ2xlIHZhbHVlPSIwLjAiLz4KKyAgICA8dW5kZXJsaW5lUG9zaXRpb24gdmFsdWU9Ii03NSIvPgorICAgIDx1bmRlcmxpbmVUaGlja25lc3MgdmFsdWU9IjUwIi8+CisgICAgPGlzRml4ZWRQaXRjaCB2YWx1ZT0iMCIvPgorICAgIDxtaW5NZW1UeXBlNDIgdmFsdWU9IjAiLz4KKyAgICA8bWF4TWVtVHlwZTQyIHZhbHVlPSIwIi8+CisgICAgPG1pbk1lbVR5cGUxIHZhbHVlPSIwIi8+CisgICAgPG1heE1lbVR5cGUxIHZhbHVlPSIwIi8+CisgIDwvcG9zdD4KKworPC90dEZvbnQ+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy93aWRnZXQvYXNzZXRzL2ZvbnRfc291cmNlL2FzY2lpX2YzZW1fd2VpZ2h0MzAwX2l0YWxpYy50dHggYi90ZXN0cy90ZXN0cy93aWRnZXQvYXNzZXRzL2ZvbnRfc291cmNlL2FzY2lpX2YzZW1fd2VpZ2h0MzAwX2l0YWxpYy50dHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg1ZTVkYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9hc3NldHMvZm9udF9zb3VyY2UvYXNjaWlfZjNlbV93ZWlnaHQzMDBfaXRhbGljLnR0eApAQCAtMCwwICsxLDIwOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUworICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHR0Rm9udCBzZm50VmVyc2lvbj0iXHgwMFx4MDFceDAwXHgwMCIgdHRMaWJWZXJzaW9uPSIzLjAiPgorCisgIDxHbHlwaE9yZGVyPgorICAgIDxHbHlwaElEIGlkPSIwIiBuYW1lPSIubm90ZGVmIi8+CisgICAgPEdseXBoSUQgaWQ9IjEiIG5hbWU9IjFlbSIvPgorICAgIDxHbHlwaElEIGlkPSIyIiBuYW1lPSIzZW0iLz4KKyAgPC9HbHlwaE9yZGVyPgorCisgIDxoZWFkPgorICAgIDx0YWJsZVZlcnNpb24gdmFsdWU9IjEuMCIvPgorICAgIDxmb250UmV2aXNpb24gdmFsdWU9IjEuMCIvPgorICAgIDxjaGVja1N1bUFkanVzdG1lbnQgdmFsdWU9IjB4NjQwY2RiMmYiLz4KKyAgICA8bWFnaWNOdW1iZXIgdmFsdWU9IjB4NWYwZjNjZjUiLz4KKyAgICA8ZmxhZ3MgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDExIi8+CisgICAgPHVuaXRzUGVyRW0gdmFsdWU9IjEwMDAiLz4KKyAgICA8Y3JlYXRlZCB2YWx1ZT0iVGh1IEZlYiAyMiAxMDowNDoyOCAyMDE4Ii8+CisgICAgPG1hY1N0eWxlIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAxMCIvPgorICAgIDxsb3dlc3RSZWNQUEVNIHZhbHVlPSI3Ii8+CisgICAgPGZvbnREaXJlY3Rpb25IaW50IHZhbHVlPSIyIi8+CisgICAgPGdseXBoRGF0YUZvcm1hdCB2YWx1ZT0iMCIvPgorICA8L2hlYWQ+CisKKyAgPGhoZWE+CisgICAgPHRhYmxlVmVyc2lvbiB2YWx1ZT0iMHgwMDAxMDAwMCIvPgorICAgIDxhc2NlbnQgdmFsdWU9IjEwMDAiLz4KKyAgICA8ZGVzY2VudCB2YWx1ZT0iLTIwMCIvPgorICAgIDxsaW5lR2FwIHZhbHVlPSIwIi8+CisgICAgPGNhcmV0U2xvcGVSaXNlIHZhbHVlPSIxIi8+CisgICAgPGNhcmV0U2xvcGVSdW4gdmFsdWU9IjAiLz4KKyAgICA8Y2FyZXRPZmZzZXQgdmFsdWU9IjAiLz4KKyAgICA8cmVzZXJ2ZWQwIHZhbHVlPSIwIi8+CisgICAgPHJlc2VydmVkMSB2YWx1ZT0iMCIvPgorICAgIDxyZXNlcnZlZDIgdmFsdWU9IjAiLz4KKyAgICA8cmVzZXJ2ZWQzIHZhbHVlPSIwIi8+CisgICAgPG1ldHJpY0RhdGFGb3JtYXQgdmFsdWU9IjAiLz4KKyAgPC9oaGVhPgorCisgIDxtYXhwPgorICAgIDx0YWJsZVZlcnNpb24gdmFsdWU9IjB4MTAwMDAiLz4KKyAgICA8bWF4Wm9uZXMgdmFsdWU9IjAiLz4KKyAgICA8bWF4VHdpbGlnaHRQb2ludHMgdmFsdWU9IjAiLz4KKyAgICA8bWF4U3RvcmFnZSB2YWx1ZT0iMCIvPgorICAgIDxtYXhGdW5jdGlvbkRlZnMgdmFsdWU9IjAiLz4KKyAgICA8bWF4SW5zdHJ1Y3Rpb25EZWZzIHZhbHVlPSIwIi8+CisgICAgPG1heFN0YWNrRWxlbWVudHMgdmFsdWU9IjAiLz4KKyAgICA8bWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zIHZhbHVlPSIwIi8+CisgICAgPG1heENvbXBvbmVudEVsZW1lbnRzIHZhbHVlPSIwIi8+CisgIDwvbWF4cD4KKworICA8T1NfMj4KKyAgICA8IS0tIFRoZSBmaWVsZHMgJ3VzRmlyc3RDaGFySW5kZXgnIGFuZCAndXNMYXN0Q2hhckluZGV4JworICAgICAgICAgd2lsbCBiZSByZWNhbGN1bGF0ZWQgYnkgdGhlIGNvbXBpbGVyIC0tPgorICAgIDx2ZXJzaW9uIHZhbHVlPSIzIi8+CisgICAgPHhBdmdDaGFyV2lkdGggdmFsdWU9IjU5NCIvPgorICAgIDx1c1dlaWdodENsYXNzIHZhbHVlPSIzMDAiLz4KKyAgICA8dXNXaWR0aENsYXNzIHZhbHVlPSI1Ii8+CisgICAgPGZzVHlwZSB2YWx1ZT0iMDAwMDAwMDAgMDAwMDEwMDAiLz4KKyAgICA8eVN1YnNjcmlwdFhTaXplIHZhbHVlPSI2NTAiLz4KKyAgICA8eVN1YnNjcmlwdFlTaXplIHZhbHVlPSI2MDAiLz4KKyAgICA8eVN1YnNjcmlwdFhPZmZzZXQgdmFsdWU9IjAiLz4KKyAgICA8eVN1YnNjcmlwdFlPZmZzZXQgdmFsdWU9Ijc1Ii8+CisgICAgPHlTdXBlcnNjcmlwdFhTaXplIHZhbHVlPSI2NTAiLz4KKyAgICA8eVN1cGVyc2NyaXB0WVNpemUgdmFsdWU9IjYwMCIvPgorICAgIDx5U3VwZXJzY3JpcHRYT2Zmc2V0IHZhbHVlPSIwIi8+CisgICAgPHlTdXBlcnNjcmlwdFlPZmZzZXQgdmFsdWU9IjM1MCIvPgorICAgIDx5U3RyaWtlb3V0U2l6ZSB2YWx1ZT0iNTAiLz4KKyAgICA8eVN0cmlrZW91dFBvc2l0aW9uIHZhbHVlPSIzMDAiLz4KKyAgICA8c0ZhbWlseUNsYXNzIHZhbHVlPSIwIi8+CisgICAgPHBhbm9zZT4KKyAgICAgIDxiRmFtaWx5VHlwZSB2YWx1ZT0iMCIvPgorICAgICAgPGJTZXJpZlN0eWxlIHZhbHVlPSIwIi8+CisgICAgICA8YldlaWdodCB2YWx1ZT0iNSIvPgorICAgICAgPGJQcm9wb3J0aW9uIHZhbHVlPSIwIi8+CisgICAgICA8YkNvbnRyYXN0IHZhbHVlPSIwIi8+CisgICAgICA8YlN0cm9rZVZhcmlhdGlvbiB2YWx1ZT0iMCIvPgorICAgICAgPGJBcm1TdHlsZSB2YWx1ZT0iMCIvPgorICAgICAgPGJMZXR0ZXJGb3JtIHZhbHVlPSIwIi8+CisgICAgICA8Yk1pZGxpbmUgdmFsdWU9IjAiLz4KKyAgICAgIDxiWEhlaWdodCB2YWx1ZT0iMCIvPgorICAgIDwvcGFub3NlPgorICAgIDx1bFVuaWNvZGVSYW5nZTEgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAxIi8+CisgICAgPHVsVW5pY29kZVJhbmdlMiB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAiLz4KKyAgICA8dWxVbmljb2RlUmFuZ2UzIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCIvPgorICAgIDx1bFVuaWNvZGVSYW5nZTQgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIi8+CisgICAgPGFjaFZlbmRJRCB2YWx1ZT0iVUtXTiIvPgorICAgIDxmc1NlbGVjdGlvbiB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDEiLz4KKyAgICA8dXNGaXJzdENoYXJJbmRleCB2YWx1ZT0iMzIiLz4KKyAgICA8dXNMYXN0Q2hhckluZGV4IHZhbHVlPSIxMjIiLz4KKyAgICA8c1R5cG9Bc2NlbmRlciB2YWx1ZT0iODAwIi8+CisgICAgPHNUeXBvRGVzY2VuZGVyIHZhbHVlPSItMjAwIi8+CisgICAgPHNUeXBvTGluZUdhcCB2YWx1ZT0iMjAwIi8+CisgICAgPHVzV2luQXNjZW50IHZhbHVlPSIxMDAwIi8+CisgICAgPHVzV2luRGVzY2VudCB2YWx1ZT0iMjAwIi8+CisgICAgPHVsQ29kZVBhZ2VSYW5nZTEgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAxIi8+CisgICAgPHVsQ29kZVBhZ2VSYW5nZTIgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIi8+CisgICAgPHN4SGVpZ2h0IHZhbHVlPSI1MDAiLz4KKyAgICA8c0NhcEhlaWdodCB2YWx1ZT0iNzAwIi8+CisgICAgPHVzRGVmYXVsdENoYXIgdmFsdWU9IjAiLz4KKyAgICA8dXNCcmVha0NoYXIgdmFsdWU9IjMyIi8+CisgICAgPHVzTWF4Q29udGV4dCB2YWx1ZT0iMCIvPgorICA8L09TXzI+CisKKyAgPGhtdHg+CisgICAgPG10eCBuYW1lPSIubm90ZGVmIiB3aWR0aD0iNTAwIiBsc2I9IjkzIi8+CisgICAgPG10eCBuYW1lPSIxZW0iIHdpZHRoPSIxMDAwIiBsc2I9IjkzIi8+CisgICAgPG10eCBuYW1lPSIzZW0iIHdpZHRoPSIzMDAwIiBsc2I9IjkzIi8+CisgIDwvaG10eD4KKworICA8Y21hcD4KKyAgICA8dGFibGVWZXJzaW9uIHZlcnNpb249IjAiLz4KKyAgICA8Y21hcF9mb3JtYXRfNCBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEwIiBsYW5ndWFnZT0iMCI+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDYxIiBuYW1lPSIxZW0iIC8+IDwhLS0gYSAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjIiIG5hbWU9IjFlbSIgLz4gPCEtLSBiIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2MyIgbmFtZT0iMWVtIiAvPiA8IS0tIGMgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDY0IiBuYW1lPSIxZW0iIC8+IDwhLS0gZCAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjUiIG5hbWU9IjFlbSIgLz4gPCEtLSBlIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2NiIgbmFtZT0iM2VtIiAvPiA8IS0tIGYgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDY3IiBuYW1lPSIxZW0iIC8+IDwhLS0gZyAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjgiIG5hbWU9IjFlbSIgLz4gPCEtLSBoIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2OSIgbmFtZT0iMWVtIiAvPiA8IS0tIGkgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDZBIiBuYW1lPSIxZW0iIC8+IDwhLS0gaiAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNkIiIG5hbWU9IjFlbSIgLz4gPCEtLSBrIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2QyIgbmFtZT0iMWVtIiAvPiA8IS0tIGwgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDZEIiBuYW1lPSIxZW0iIC8+IDwhLS0gbSAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNkUiIG5hbWU9IjFlbSIgLz4gPCEtLSBuIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2RiIgbmFtZT0iMWVtIiAvPiA8IS0tIG8gLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDcwIiBuYW1lPSIxZW0iIC8+IDwhLS0gcCAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzEiIG5hbWU9IjFlbSIgLz4gPCEtLSBxIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3MiIgbmFtZT0iMWVtIiAvPiA8IS0tIHIgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDczIiBuYW1lPSIxZW0iIC8+IDwhLS0gcyAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzQiIG5hbWU9IjFlbSIgLz4gPCEtLSB0IC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3NSIgbmFtZT0iMWVtIiAvPiA8IS0tIHUgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDc2IiBuYW1lPSIxZW0iIC8+IDwhLS0gdiAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzciIG5hbWU9IjFlbSIgLz4gPCEtLSB3IC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3OCIgbmFtZT0iMWVtIiAvPiA8IS0tIHggLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDc5IiBuYW1lPSIxZW0iIC8+IDwhLS0geSAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwN0EiIG5hbWU9IjFlbSIgLz4gPCEtLSB6IC0tPgorICAgIDwvY21hcF9mb3JtYXRfND4KKyAgPC9jbWFwPgorCisgIDxsb2NhPgorICAgIDwhLS0gVGhlICdsb2NhJyB0YWJsZSB3aWxsIGJlIGNhbGN1bGF0ZWQgYnkgdGhlIGNvbXBpbGVyIC0tPgorICA8L2xvY2E+CisKKyAgPGdseWY+CisgICAgPFRUR2x5cGggbmFtZT0iLm5vdGRlZiIgeE1pbj0iMCIgeU1pbj0iMCIgeE1heD0iMCIgeU1heD0iMCIgLz4KKyAgICA8VFRHbHlwaCBuYW1lPSIxZW0iIHhNaW49IjAiIHlNaW49IjAiIHhNYXg9IjAiIHlNYXg9IjAiIC8+CisgICAgPFRUR2x5cGggbmFtZT0iM2VtIiB4TWluPSIwIiB5TWluPSIwIiB4TWF4PSIwIiB5TWF4PSIwIiAvPgorICA8L2dseWY+CisKKyAgPG5hbWU+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSIwIiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAgICA8L25hbWVyZWNvcmQ+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSIxIiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgU2FtcGxlIEZvbnQKKyAgICA8L25hbWVyZWNvcmQ+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSIyIiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgUmVndWxhcgorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjQiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBTYW1wbGUgRm9udAorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjYiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBTYW1wbGVGb250LVJlZ3VsYXIKKyAgICA8L25hbWVyZWNvcmQ+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSIxMyIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUworICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAgICA8L25hbWVyZWNvcmQ+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSIxNCIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgIDwvbmFtZXJlY29yZD4KKyAgPC9uYW1lPgorCisgIDxwb3N0PgorICAgIDxmb3JtYXRUeXBlIHZhbHVlPSIzLjAiLz4KKyAgICA8aXRhbGljQW5nbGUgdmFsdWU9IjAuMCIvPgorICAgIDx1bmRlcmxpbmVQb3NpdGlvbiB2YWx1ZT0iLTc1Ii8+CisgICAgPHVuZGVybGluZVRoaWNrbmVzcyB2YWx1ZT0iNTAiLz4KKyAgICA8aXNGaXhlZFBpdGNoIHZhbHVlPSIwIi8+CisgICAgPG1pbk1lbVR5cGU0MiB2YWx1ZT0iMCIvPgorICAgIDxtYXhNZW1UeXBlNDIgdmFsdWU9IjAiLz4KKyAgICA8bWluTWVtVHlwZTEgdmFsdWU9IjAiLz4KKyAgICA8bWF4TWVtVHlwZTEgdmFsdWU9IjAiLz4KKyAgPC9wb3N0PgorCis8L3R0Rm9udD4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9hc3NldHMvZm9udF9zb3VyY2UvYXNjaWlfZzNlbV93ZWlnaHQ0MDBfdXByaWdodC50dHggYi90ZXN0cy90ZXN0cy93aWRnZXQvYXNzZXRzL2ZvbnRfc291cmNlL2FzY2lpX2czZW1fd2VpZ2h0NDAwX3VwcmlnaHQudHR4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiOWEwZjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy93aWRnZXQvYXNzZXRzL2ZvbnRfc291cmNlL2FzY2lpX2czZW1fd2VpZ2h0NDAwX3VwcmlnaHQudHR4CkBAIC0wLDAgKzEsMjA4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8dHRGb250IHNmbnRWZXJzaW9uPSJceDAwXHgwMVx4MDBceDAwIiB0dExpYlZlcnNpb249IjMuMCI+CisKKyAgPEdseXBoT3JkZXI+CisgICAgPEdseXBoSUQgaWQ9IjAiIG5hbWU9Ii5ub3RkZWYiLz4KKyAgICA8R2x5cGhJRCBpZD0iMSIgbmFtZT0iMWVtIi8+CisgICAgPEdseXBoSUQgaWQ9IjIiIG5hbWU9IjNlbSIvPgorICA8L0dseXBoT3JkZXI+CisKKyAgPGhlYWQ+CisgICAgPHRhYmxlVmVyc2lvbiB2YWx1ZT0iMS4wIi8+CisgICAgPGZvbnRSZXZpc2lvbiB2YWx1ZT0iMS4wIi8+CisgICAgPGNoZWNrU3VtQWRqdXN0bWVudCB2YWx1ZT0iMHg2NDBjZGIyZiIvPgorICAgIDxtYWdpY051bWJlciB2YWx1ZT0iMHg1ZjBmM2NmNSIvPgorICAgIDxmbGFncyB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMTEiLz4KKyAgICA8dW5pdHNQZXJFbSB2YWx1ZT0iMTAwMCIvPgorICAgIDxjcmVhdGVkIHZhbHVlPSJUaHUgRmViIDIyIDEwOjA0OjI5IDIwMTgiLz4KKyAgICA8bWFjU3R5bGUgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIi8+CisgICAgPGxvd2VzdFJlY1BQRU0gdmFsdWU9IjciLz4KKyAgICA8Zm9udERpcmVjdGlvbkhpbnQgdmFsdWU9IjIiLz4KKyAgICA8Z2x5cGhEYXRhRm9ybWF0IHZhbHVlPSIwIi8+CisgIDwvaGVhZD4KKworICA8aGhlYT4KKyAgICA8dGFibGVWZXJzaW9uIHZhbHVlPSIweDAwMDEwMDAwIi8+CisgICAgPGFzY2VudCB2YWx1ZT0iMTAwMCIvPgorICAgIDxkZXNjZW50IHZhbHVlPSItMjAwIi8+CisgICAgPGxpbmVHYXAgdmFsdWU9IjAiLz4KKyAgICA8Y2FyZXRTbG9wZVJpc2UgdmFsdWU9IjEiLz4KKyAgICA8Y2FyZXRTbG9wZVJ1biB2YWx1ZT0iMCIvPgorICAgIDxjYXJldE9mZnNldCB2YWx1ZT0iMCIvPgorICAgIDxyZXNlcnZlZDAgdmFsdWU9IjAiLz4KKyAgICA8cmVzZXJ2ZWQxIHZhbHVlPSIwIi8+CisgICAgPHJlc2VydmVkMiB2YWx1ZT0iMCIvPgorICAgIDxyZXNlcnZlZDMgdmFsdWU9IjAiLz4KKyAgICA8bWV0cmljRGF0YUZvcm1hdCB2YWx1ZT0iMCIvPgorICA8L2hoZWE+CisKKyAgPG1heHA+CisgICAgPHRhYmxlVmVyc2lvbiB2YWx1ZT0iMHgxMDAwMCIvPgorICAgIDxtYXhab25lcyB2YWx1ZT0iMCIvPgorICAgIDxtYXhUd2lsaWdodFBvaW50cyB2YWx1ZT0iMCIvPgorICAgIDxtYXhTdG9yYWdlIHZhbHVlPSIwIi8+CisgICAgPG1heEZ1bmN0aW9uRGVmcyB2YWx1ZT0iMCIvPgorICAgIDxtYXhJbnN0cnVjdGlvbkRlZnMgdmFsdWU9IjAiLz4KKyAgICA8bWF4U3RhY2tFbGVtZW50cyB2YWx1ZT0iMCIvPgorICAgIDxtYXhTaXplT2ZJbnN0cnVjdGlvbnMgdmFsdWU9IjAiLz4KKyAgICA8bWF4Q29tcG9uZW50RWxlbWVudHMgdmFsdWU9IjAiLz4KKyAgPC9tYXhwPgorCisgIDxPU18yPgorICAgIDwhLS0gVGhlIGZpZWxkcyAndXNGaXJzdENoYXJJbmRleCcgYW5kICd1c0xhc3RDaGFySW5kZXgnCisgICAgICAgICB3aWxsIGJlIHJlY2FsY3VsYXRlZCBieSB0aGUgY29tcGlsZXIgLS0+CisgICAgPHZlcnNpb24gdmFsdWU9IjMiLz4KKyAgICA8eEF2Z0NoYXJXaWR0aCB2YWx1ZT0iNTk0Ii8+CisgICAgPHVzV2VpZ2h0Q2xhc3MgdmFsdWU9IjQwMCIvPgorICAgIDx1c1dpZHRoQ2xhc3MgdmFsdWU9IjUiLz4KKyAgICA8ZnNUeXBlIHZhbHVlPSIwMDAwMDAwMCAwMDAwMTAwMCIvPgorICAgIDx5U3Vic2NyaXB0WFNpemUgdmFsdWU9IjY1MCIvPgorICAgIDx5U3Vic2NyaXB0WVNpemUgdmFsdWU9IjYwMCIvPgorICAgIDx5U3Vic2NyaXB0WE9mZnNldCB2YWx1ZT0iMCIvPgorICAgIDx5U3Vic2NyaXB0WU9mZnNldCB2YWx1ZT0iNzUiLz4KKyAgICA8eVN1cGVyc2NyaXB0WFNpemUgdmFsdWU9IjY1MCIvPgorICAgIDx5U3VwZXJzY3JpcHRZU2l6ZSB2YWx1ZT0iNjAwIi8+CisgICAgPHlTdXBlcnNjcmlwdFhPZmZzZXQgdmFsdWU9IjAiLz4KKyAgICA8eVN1cGVyc2NyaXB0WU9mZnNldCB2YWx1ZT0iMzUwIi8+CisgICAgPHlTdHJpa2VvdXRTaXplIHZhbHVlPSI1MCIvPgorICAgIDx5U3RyaWtlb3V0UG9zaXRpb24gdmFsdWU9IjMwMCIvPgorICAgIDxzRmFtaWx5Q2xhc3MgdmFsdWU9IjAiLz4KKyAgICA8cGFub3NlPgorICAgICAgPGJGYW1pbHlUeXBlIHZhbHVlPSIwIi8+CisgICAgICA8YlNlcmlmU3R5bGUgdmFsdWU9IjAiLz4KKyAgICAgIDxiV2VpZ2h0IHZhbHVlPSI1Ii8+CisgICAgICA8YlByb3BvcnRpb24gdmFsdWU9IjAiLz4KKyAgICAgIDxiQ29udHJhc3QgdmFsdWU9IjAiLz4KKyAgICAgIDxiU3Ryb2tlVmFyaWF0aW9uIHZhbHVlPSIwIi8+CisgICAgICA8YkFybVN0eWxlIHZhbHVlPSIwIi8+CisgICAgICA8YkxldHRlckZvcm0gdmFsdWU9IjAiLz4KKyAgICAgIDxiTWlkbGluZSB2YWx1ZT0iMCIvPgorICAgICAgPGJYSGVpZ2h0IHZhbHVlPSIwIi8+CisgICAgPC9wYW5vc2U+CisgICAgPHVsVW5pY29kZVJhbmdlMSB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDEiLz4KKyAgICA8dWxVbmljb2RlUmFuZ2UyIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCIvPgorICAgIDx1bFVuaWNvZGVSYW5nZTMgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIi8+CisgICAgPHVsVW5pY29kZVJhbmdlNCB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAiLz4KKyAgICA8YWNoVmVuZElEIHZhbHVlPSJVS1dOIi8+CisgICAgPGZzU2VsZWN0aW9uIHZhbHVlPSIwMDAwMDAwMCAwMTAwMDAwMCIvPgorICAgIDx1c0ZpcnN0Q2hhckluZGV4IHZhbHVlPSIzMiIvPgorICAgIDx1c0xhc3RDaGFySW5kZXggdmFsdWU9IjEyMiIvPgorICAgIDxzVHlwb0FzY2VuZGVyIHZhbHVlPSI4MDAiLz4KKyAgICA8c1R5cG9EZXNjZW5kZXIgdmFsdWU9Ii0yMDAiLz4KKyAgICA8c1R5cG9MaW5lR2FwIHZhbHVlPSIyMDAiLz4KKyAgICA8dXNXaW5Bc2NlbnQgdmFsdWU9IjEwMDAiLz4KKyAgICA8dXNXaW5EZXNjZW50IHZhbHVlPSIyMDAiLz4KKyAgICA8dWxDb2RlUGFnZVJhbmdlMSB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDEiLz4KKyAgICA8dWxDb2RlUGFnZVJhbmdlMiB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAiLz4KKyAgICA8c3hIZWlnaHQgdmFsdWU9IjUwMCIvPgorICAgIDxzQ2FwSGVpZ2h0IHZhbHVlPSI3MDAiLz4KKyAgICA8dXNEZWZhdWx0Q2hhciB2YWx1ZT0iMCIvPgorICAgIDx1c0JyZWFrQ2hhciB2YWx1ZT0iMzIiLz4KKyAgICA8dXNNYXhDb250ZXh0IHZhbHVlPSIwIi8+CisgIDwvT1NfMj4KKworICA8aG10eD4KKyAgICA8bXR4IG5hbWU9Ii5ub3RkZWYiIHdpZHRoPSI1MDAiIGxzYj0iOTMiLz4KKyAgICA8bXR4IG5hbWU9IjFlbSIgd2lkdGg9IjEwMDAiIGxzYj0iOTMiLz4KKyAgICA8bXR4IG5hbWU9IjNlbSIgd2lkdGg9IjMwMDAiIGxzYj0iOTMiLz4KKyAgPC9obXR4PgorCisgIDxjbWFwPgorICAgIDx0YWJsZVZlcnNpb24gdmVyc2lvbj0iMCIvPgorICAgIDxjbWFwX2Zvcm1hdF80IHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMTAiIGxhbmd1YWdlPSIwIj4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjEiIG5hbWU9IjFlbSIgLz4gPCEtLSBhIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2MiIgbmFtZT0iMWVtIiAvPiA8IS0tIGIgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDYzIiBuYW1lPSIxZW0iIC8+IDwhLS0gYyAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjQiIG5hbWU9IjFlbSIgLz4gPCEtLSBkIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2NSIgbmFtZT0iMWVtIiAvPiA8IS0tIGUgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDY2IiBuYW1lPSIxZW0iIC8+IDwhLS0gZiAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjciIG5hbWU9IjNlbSIgLz4gPCEtLSBnIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2OCIgbmFtZT0iMWVtIiAvPiA8IS0tIGggLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDY5IiBuYW1lPSIxZW0iIC8+IDwhLS0gaSAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNkEiIG5hbWU9IjFlbSIgLz4gPCEtLSBqIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2QiIgbmFtZT0iMWVtIiAvPiA8IS0tIGsgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDZDIiBuYW1lPSIxZW0iIC8+IDwhLS0gbCAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNkQiIG5hbWU9IjFlbSIgLz4gPCEtLSBtIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2RSIgbmFtZT0iMWVtIiAvPiA8IS0tIG4gLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDZGIiBuYW1lPSIxZW0iIC8+IDwhLS0gbyAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzAiIG5hbWU9IjFlbSIgLz4gPCEtLSBwIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3MSIgbmFtZT0iMWVtIiAvPiA8IS0tIHEgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDcyIiBuYW1lPSIxZW0iIC8+IDwhLS0gciAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzMiIG5hbWU9IjFlbSIgLz4gPCEtLSBzIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3NCIgbmFtZT0iMWVtIiAvPiA8IS0tIHQgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDc1IiBuYW1lPSIxZW0iIC8+IDwhLS0gdSAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzYiIG5hbWU9IjFlbSIgLz4gPCEtLSB2IC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3NyIgbmFtZT0iMWVtIiAvPiA8IS0tIHcgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDc4IiBuYW1lPSIxZW0iIC8+IDwhLS0geCAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzkiIG5hbWU9IjFlbSIgLz4gPCEtLSB5IC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3QSIgbmFtZT0iMWVtIiAvPiA8IS0tIHogLS0+CisgICAgPC9jbWFwX2Zvcm1hdF80PgorICA8L2NtYXA+CisKKyAgPGxvY2E+CisgICAgPCEtLSBUaGUgJ2xvY2EnIHRhYmxlIHdpbGwgYmUgY2FsY3VsYXRlZCBieSB0aGUgY29tcGlsZXIgLS0+CisgIDwvbG9jYT4KKworICA8Z2x5Zj4KKyAgICA8VFRHbHlwaCBuYW1lPSIubm90ZGVmIiB4TWluPSIwIiB5TWluPSIwIiB4TWF4PSIwIiB5TWF4PSIwIiAvPgorICAgIDxUVEdseXBoIG5hbWU9IjFlbSIgeE1pbj0iMCIgeU1pbj0iMCIgeE1heD0iMCIgeU1heD0iMCIgLz4KKyAgICA8VFRHbHlwaCBuYW1lPSIzZW0iIHhNaW49IjAiIHlNaW49IjAiIHhNYXg9IjAiIHlNYXg9IjAiIC8+CisgIDwvZ2x5Zj4KKworICA8bmFtZT4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjAiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjEiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBTYW1wbGUgRm9udAorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjIiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBSZWd1bGFyCisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iNCIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIFNhbXBsZSBGb250CisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iNiIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIFNhbXBsZUZvbnQtUmVndWxhcgorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjEzIiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjE0IiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgPC9uYW1lcmVjb3JkPgorICA8L25hbWU+CisKKyAgPHBvc3Q+CisgICAgPGZvcm1hdFR5cGUgdmFsdWU9IjMuMCIvPgorICAgIDxpdGFsaWNBbmdsZSB2YWx1ZT0iMC4wIi8+CisgICAgPHVuZGVybGluZVBvc2l0aW9uIHZhbHVlPSItNzUiLz4KKyAgICA8dW5kZXJsaW5lVGhpY2tuZXNzIHZhbHVlPSI1MCIvPgorICAgIDxpc0ZpeGVkUGl0Y2ggdmFsdWU9IjAiLz4KKyAgICA8bWluTWVtVHlwZTQyIHZhbHVlPSIwIi8+CisgICAgPG1heE1lbVR5cGU0MiB2YWx1ZT0iMCIvPgorICAgIDxtaW5NZW1UeXBlMSB2YWx1ZT0iMCIvPgorICAgIDxtYXhNZW1UeXBlMSB2YWx1ZT0iMCIvPgorICA8L3Bvc3Q+CisKKzwvdHRGb250PgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L2Fzc2V0cy9mb250X3NvdXJjZS9hc2NpaV9oM2VtX3dlaWdodDQwMF9pdGFsaWMudHR4IGIvdGVzdHMvdGVzdHMvd2lkZ2V0L2Fzc2V0cy9mb250X3NvdXJjZS9hc2NpaV9oM2VtX3dlaWdodDQwMF9pdGFsaWMudHR4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNDIzYTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy93aWRnZXQvYXNzZXRzL2ZvbnRfc291cmNlL2FzY2lpX2gzZW1fd2VpZ2h0NDAwX2l0YWxpYy50dHgKQEAgLTAsMCArMSwyMDggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzx0dEZvbnQgc2ZudFZlcnNpb249Ilx4MDBceDAxXHgwMFx4MDAiIHR0TGliVmVyc2lvbj0iMy4wIj4KKworICA8R2x5cGhPcmRlcj4KKyAgICA8R2x5cGhJRCBpZD0iMCIgbmFtZT0iLm5vdGRlZiIvPgorICAgIDxHbHlwaElEIGlkPSIxIiBuYW1lPSIxZW0iLz4KKyAgICA8R2x5cGhJRCBpZD0iMiIgbmFtZT0iM2VtIi8+CisgIDwvR2x5cGhPcmRlcj4KKworICA8aGVhZD4KKyAgICA8dGFibGVWZXJzaW9uIHZhbHVlPSIxLjAiLz4KKyAgICA8Zm9udFJldmlzaW9uIHZhbHVlPSIxLjAiLz4KKyAgICA8Y2hlY2tTdW1BZGp1c3RtZW50IHZhbHVlPSIweDY0MGNkYjJmIi8+CisgICAgPG1hZ2ljTnVtYmVyIHZhbHVlPSIweDVmMGYzY2Y1Ii8+CisgICAgPGZsYWdzIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAxMSIvPgorICAgIDx1bml0c1BlckVtIHZhbHVlPSIxMDAwIi8+CisgICAgPGNyZWF0ZWQgdmFsdWU9IlRodSBGZWIgMjIgMTA6MDQ6MjkgMjAxOCIvPgorICAgIDxtYWNTdHlsZSB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMTAiLz4KKyAgICA8bG93ZXN0UmVjUFBFTSB2YWx1ZT0iNyIvPgorICAgIDxmb250RGlyZWN0aW9uSGludCB2YWx1ZT0iMiIvPgorICAgIDxnbHlwaERhdGFGb3JtYXQgdmFsdWU9IjAiLz4KKyAgPC9oZWFkPgorCisgIDxoaGVhPgorICAgIDx0YWJsZVZlcnNpb24gdmFsdWU9IjB4MDAwMTAwMDAiLz4KKyAgICA8YXNjZW50IHZhbHVlPSIxMDAwIi8+CisgICAgPGRlc2NlbnQgdmFsdWU9Ii0yMDAiLz4KKyAgICA8bGluZUdhcCB2YWx1ZT0iMCIvPgorICAgIDxjYXJldFNsb3BlUmlzZSB2YWx1ZT0iMSIvPgorICAgIDxjYXJldFNsb3BlUnVuIHZhbHVlPSIwIi8+CisgICAgPGNhcmV0T2Zmc2V0IHZhbHVlPSIwIi8+CisgICAgPHJlc2VydmVkMCB2YWx1ZT0iMCIvPgorICAgIDxyZXNlcnZlZDEgdmFsdWU9IjAiLz4KKyAgICA8cmVzZXJ2ZWQyIHZhbHVlPSIwIi8+CisgICAgPHJlc2VydmVkMyB2YWx1ZT0iMCIvPgorICAgIDxtZXRyaWNEYXRhRm9ybWF0IHZhbHVlPSIwIi8+CisgIDwvaGhlYT4KKworICA8bWF4cD4KKyAgICA8dGFibGVWZXJzaW9uIHZhbHVlPSIweDEwMDAwIi8+CisgICAgPG1heFpvbmVzIHZhbHVlPSIwIi8+CisgICAgPG1heFR3aWxpZ2h0UG9pbnRzIHZhbHVlPSIwIi8+CisgICAgPG1heFN0b3JhZ2UgdmFsdWU9IjAiLz4KKyAgICA8bWF4RnVuY3Rpb25EZWZzIHZhbHVlPSIwIi8+CisgICAgPG1heEluc3RydWN0aW9uRGVmcyB2YWx1ZT0iMCIvPgorICAgIDxtYXhTdGFja0VsZW1lbnRzIHZhbHVlPSIwIi8+CisgICAgPG1heFNpemVPZkluc3RydWN0aW9ucyB2YWx1ZT0iMCIvPgorICAgIDxtYXhDb21wb25lbnRFbGVtZW50cyB2YWx1ZT0iMCIvPgorICA8L21heHA+CisKKyAgPE9TXzI+CisgICAgPCEtLSBUaGUgZmllbGRzICd1c0ZpcnN0Q2hhckluZGV4JyBhbmQgJ3VzTGFzdENoYXJJbmRleCcKKyAgICAgICAgIHdpbGwgYmUgcmVjYWxjdWxhdGVkIGJ5IHRoZSBjb21waWxlciAtLT4KKyAgICA8dmVyc2lvbiB2YWx1ZT0iMyIvPgorICAgIDx4QXZnQ2hhcldpZHRoIHZhbHVlPSI1OTQiLz4KKyAgICA8dXNXZWlnaHRDbGFzcyB2YWx1ZT0iNDAwIi8+CisgICAgPHVzV2lkdGhDbGFzcyB2YWx1ZT0iNSIvPgorICAgIDxmc1R5cGUgdmFsdWU9IjAwMDAwMDAwIDAwMDAxMDAwIi8+CisgICAgPHlTdWJzY3JpcHRYU2l6ZSB2YWx1ZT0iNjUwIi8+CisgICAgPHlTdWJzY3JpcHRZU2l6ZSB2YWx1ZT0iNjAwIi8+CisgICAgPHlTdWJzY3JpcHRYT2Zmc2V0IHZhbHVlPSIwIi8+CisgICAgPHlTdWJzY3JpcHRZT2Zmc2V0IHZhbHVlPSI3NSIvPgorICAgIDx5U3VwZXJzY3JpcHRYU2l6ZSB2YWx1ZT0iNjUwIi8+CisgICAgPHlTdXBlcnNjcmlwdFlTaXplIHZhbHVlPSI2MDAiLz4KKyAgICA8eVN1cGVyc2NyaXB0WE9mZnNldCB2YWx1ZT0iMCIvPgorICAgIDx5U3VwZXJzY3JpcHRZT2Zmc2V0IHZhbHVlPSIzNTAiLz4KKyAgICA8eVN0cmlrZW91dFNpemUgdmFsdWU9IjUwIi8+CisgICAgPHlTdHJpa2VvdXRQb3NpdGlvbiB2YWx1ZT0iMzAwIi8+CisgICAgPHNGYW1pbHlDbGFzcyB2YWx1ZT0iMCIvPgorICAgIDxwYW5vc2U+CisgICAgICA8YkZhbWlseVR5cGUgdmFsdWU9IjAiLz4KKyAgICAgIDxiU2VyaWZTdHlsZSB2YWx1ZT0iMCIvPgorICAgICAgPGJXZWlnaHQgdmFsdWU9IjUiLz4KKyAgICAgIDxiUHJvcG9ydGlvbiB2YWx1ZT0iMCIvPgorICAgICAgPGJDb250cmFzdCB2YWx1ZT0iMCIvPgorICAgICAgPGJTdHJva2VWYXJpYXRpb24gdmFsdWU9IjAiLz4KKyAgICAgIDxiQXJtU3R5bGUgdmFsdWU9IjAiLz4KKyAgICAgIDxiTGV0dGVyRm9ybSB2YWx1ZT0iMCIvPgorICAgICAgPGJNaWRsaW5lIHZhbHVlPSIwIi8+CisgICAgICA8YlhIZWlnaHQgdmFsdWU9IjAiLz4KKyAgICA8L3Bhbm9zZT4KKyAgICA8dWxVbmljb2RlUmFuZ2UxIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMSIvPgorICAgIDx1bFVuaWNvZGVSYW5nZTIgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIi8+CisgICAgPHVsVW5pY29kZVJhbmdlMyB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAiLz4KKyAgICA8dWxVbmljb2RlUmFuZ2U0IHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCIvPgorICAgIDxhY2hWZW5kSUQgdmFsdWU9IlVLV04iLz4KKyAgICA8ZnNTZWxlY3Rpb24gdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAxIi8+CisgICAgPHVzRmlyc3RDaGFySW5kZXggdmFsdWU9IjMyIi8+CisgICAgPHVzTGFzdENoYXJJbmRleCB2YWx1ZT0iMTIyIi8+CisgICAgPHNUeXBvQXNjZW5kZXIgdmFsdWU9IjgwMCIvPgorICAgIDxzVHlwb0Rlc2NlbmRlciB2YWx1ZT0iLTIwMCIvPgorICAgIDxzVHlwb0xpbmVHYXAgdmFsdWU9IjIwMCIvPgorICAgIDx1c1dpbkFzY2VudCB2YWx1ZT0iMTAwMCIvPgorICAgIDx1c1dpbkRlc2NlbnQgdmFsdWU9IjIwMCIvPgorICAgIDx1bENvZGVQYWdlUmFuZ2UxIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMSIvPgorICAgIDx1bENvZGVQYWdlUmFuZ2UyIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCIvPgorICAgIDxzeEhlaWdodCB2YWx1ZT0iNTAwIi8+CisgICAgPHNDYXBIZWlnaHQgdmFsdWU9IjcwMCIvPgorICAgIDx1c0RlZmF1bHRDaGFyIHZhbHVlPSIwIi8+CisgICAgPHVzQnJlYWtDaGFyIHZhbHVlPSIzMiIvPgorICAgIDx1c01heENvbnRleHQgdmFsdWU9IjAiLz4KKyAgPC9PU18yPgorCisgIDxobXR4PgorICAgIDxtdHggbmFtZT0iLm5vdGRlZiIgd2lkdGg9IjUwMCIgbHNiPSI5MyIvPgorICAgIDxtdHggbmFtZT0iMWVtIiB3aWR0aD0iMTAwMCIgbHNiPSI5MyIvPgorICAgIDxtdHggbmFtZT0iM2VtIiB3aWR0aD0iMzAwMCIgbHNiPSI5MyIvPgorICA8L2htdHg+CisKKyAgPGNtYXA+CisgICAgPHRhYmxlVmVyc2lvbiB2ZXJzaW9uPSIwIi8+CisgICAgPGNtYXBfZm9ybWF0XzQgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxMCIgbGFuZ3VhZ2U9IjAiPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2MSIgbmFtZT0iMWVtIiAvPiA8IS0tIGEgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDYyIiBuYW1lPSIxZW0iIC8+IDwhLS0gYiAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjMiIG5hbWU9IjFlbSIgLz4gPCEtLSBjIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2NCIgbmFtZT0iMWVtIiAvPiA8IS0tIGQgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDY1IiBuYW1lPSIxZW0iIC8+IDwhLS0gZSAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjYiIG5hbWU9IjFlbSIgLz4gPCEtLSBmIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2NyIgbmFtZT0iMWVtIiAvPiA8IS0tIGcgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDY4IiBuYW1lPSIzZW0iIC8+IDwhLS0gaCAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjkiIG5hbWU9IjFlbSIgLz4gPCEtLSBpIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2QSIgbmFtZT0iMWVtIiAvPiA8IS0tIGogLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDZCIiBuYW1lPSIxZW0iIC8+IDwhLS0gayAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNkMiIG5hbWU9IjFlbSIgLz4gPCEtLSBsIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2RCIgbmFtZT0iMWVtIiAvPiA8IS0tIG0gLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDZFIiBuYW1lPSIxZW0iIC8+IDwhLS0gbiAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNkYiIG5hbWU9IjFlbSIgLz4gPCEtLSBvIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3MCIgbmFtZT0iMWVtIiAvPiA8IS0tIHAgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDcxIiBuYW1lPSIxZW0iIC8+IDwhLS0gcSAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzIiIG5hbWU9IjFlbSIgLz4gPCEtLSByIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3MyIgbmFtZT0iMWVtIiAvPiA8IS0tIHMgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDc0IiBuYW1lPSIxZW0iIC8+IDwhLS0gdCAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzUiIG5hbWU9IjFlbSIgLz4gPCEtLSB1IC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3NiIgbmFtZT0iMWVtIiAvPiA8IS0tIHYgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDc3IiBuYW1lPSIxZW0iIC8+IDwhLS0gdyAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzgiIG5hbWU9IjFlbSIgLz4gPCEtLSB4IC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3OSIgbmFtZT0iMWVtIiAvPiA8IS0tIHkgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDdBIiBuYW1lPSIxZW0iIC8+IDwhLS0geiAtLT4KKyAgICA8L2NtYXBfZm9ybWF0XzQ+CisgIDwvY21hcD4KKworICA8bG9jYT4KKyAgICA8IS0tIFRoZSAnbG9jYScgdGFibGUgd2lsbCBiZSBjYWxjdWxhdGVkIGJ5IHRoZSBjb21waWxlciAtLT4KKyAgPC9sb2NhPgorCisgIDxnbHlmPgorICAgIDxUVEdseXBoIG5hbWU9Ii5ub3RkZWYiIHhNaW49IjAiIHlNaW49IjAiIHhNYXg9IjAiIHlNYXg9IjAiIC8+CisgICAgPFRUR2x5cGggbmFtZT0iMWVtIiB4TWluPSIwIiB5TWluPSIwIiB4TWF4PSIwIiB5TWF4PSIwIiAvPgorICAgIDxUVEdseXBoIG5hbWU9IjNlbSIgeE1pbj0iMCIgeU1pbj0iMCIgeE1heD0iMCIgeU1heD0iMCIgLz4KKyAgPC9nbHlmPgorCisgIDxuYW1lPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iMCIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iMSIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIFNhbXBsZSBGb250CisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iMiIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIFJlZ3VsYXIKKyAgICA8L25hbWVyZWNvcmQ+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSI0IiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgU2FtcGxlIEZvbnQKKyAgICA8L25hbWVyZWNvcmQ+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSI2IiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgU2FtcGxlRm9udC1SZWd1bGFyCisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iMTMiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iMTQiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICA8L25hbWVyZWNvcmQ+CisgIDwvbmFtZT4KKworICA8cG9zdD4KKyAgICA8Zm9ybWF0VHlwZSB2YWx1ZT0iMy4wIi8+CisgICAgPGl0YWxpY0FuZ2xlIHZhbHVlPSIwLjAiLz4KKyAgICA8dW5kZXJsaW5lUG9zaXRpb24gdmFsdWU9Ii03NSIvPgorICAgIDx1bmRlcmxpbmVUaGlja25lc3MgdmFsdWU9IjUwIi8+CisgICAgPGlzRml4ZWRQaXRjaCB2YWx1ZT0iMCIvPgorICAgIDxtaW5NZW1UeXBlNDIgdmFsdWU9IjAiLz4KKyAgICA8bWF4TWVtVHlwZTQyIHZhbHVlPSIwIi8+CisgICAgPG1pbk1lbVR5cGUxIHZhbHVlPSIwIi8+CisgICAgPG1heE1lbVR5cGUxIHZhbHVlPSIwIi8+CisgIDwvcG9zdD4KKworPC90dEZvbnQ+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy93aWRnZXQvYXNzZXRzL2ZvbnRfc291cmNlL2FzY2lpX2kzZW1fd2VpZ2h0NTAwX3VwcmlnaHQudHR4IGIvdGVzdHMvdGVzdHMvd2lkZ2V0L2Fzc2V0cy9mb250X3NvdXJjZS9hc2NpaV9pM2VtX3dlaWdodDUwMF91cHJpZ2h0LnR0eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjEzYzA2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L2Fzc2V0cy9mb250X3NvdXJjZS9hc2NpaV9pM2VtX3dlaWdodDUwMF91cHJpZ2h0LnR0eApAQCAtMCwwICsxLDIwOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUworICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHR0Rm9udCBzZm50VmVyc2lvbj0iXHgwMFx4MDFceDAwXHgwMCIgdHRMaWJWZXJzaW9uPSIzLjAiPgorCisgIDxHbHlwaE9yZGVyPgorICAgIDxHbHlwaElEIGlkPSIwIiBuYW1lPSIubm90ZGVmIi8+CisgICAgPEdseXBoSUQgaWQ9IjEiIG5hbWU9IjFlbSIvPgorICAgIDxHbHlwaElEIGlkPSIyIiBuYW1lPSIzZW0iLz4KKyAgPC9HbHlwaE9yZGVyPgorCisgIDxoZWFkPgorICAgIDx0YWJsZVZlcnNpb24gdmFsdWU9IjEuMCIvPgorICAgIDxmb250UmV2aXNpb24gdmFsdWU9IjEuMCIvPgorICAgIDxjaGVja1N1bUFkanVzdG1lbnQgdmFsdWU9IjB4NjQwY2RiMmYiLz4KKyAgICA8bWFnaWNOdW1iZXIgdmFsdWU9IjB4NWYwZjNjZjUiLz4KKyAgICA8ZmxhZ3MgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDExIi8+CisgICAgPHVuaXRzUGVyRW0gdmFsdWU9IjEwMDAiLz4KKyAgICA8Y3JlYXRlZCB2YWx1ZT0iVGh1IEZlYiAyMiAxMDowNDoyOSAyMDE4Ii8+CisgICAgPG1hY1N0eWxlIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMCIvPgorICAgIDxsb3dlc3RSZWNQUEVNIHZhbHVlPSI3Ii8+CisgICAgPGZvbnREaXJlY3Rpb25IaW50IHZhbHVlPSIyIi8+CisgICAgPGdseXBoRGF0YUZvcm1hdCB2YWx1ZT0iMCIvPgorICA8L2hlYWQ+CisKKyAgPGhoZWE+CisgICAgPHRhYmxlVmVyc2lvbiB2YWx1ZT0iMHgwMDAxMDAwMCIvPgorICAgIDxhc2NlbnQgdmFsdWU9IjEwMDAiLz4KKyAgICA8ZGVzY2VudCB2YWx1ZT0iLTIwMCIvPgorICAgIDxsaW5lR2FwIHZhbHVlPSIwIi8+CisgICAgPGNhcmV0U2xvcGVSaXNlIHZhbHVlPSIxIi8+CisgICAgPGNhcmV0U2xvcGVSdW4gdmFsdWU9IjAiLz4KKyAgICA8Y2FyZXRPZmZzZXQgdmFsdWU9IjAiLz4KKyAgICA8cmVzZXJ2ZWQwIHZhbHVlPSIwIi8+CisgICAgPHJlc2VydmVkMSB2YWx1ZT0iMCIvPgorICAgIDxyZXNlcnZlZDIgdmFsdWU9IjAiLz4KKyAgICA8cmVzZXJ2ZWQzIHZhbHVlPSIwIi8+CisgICAgPG1ldHJpY0RhdGFGb3JtYXQgdmFsdWU9IjAiLz4KKyAgPC9oaGVhPgorCisgIDxtYXhwPgorICAgIDx0YWJsZVZlcnNpb24gdmFsdWU9IjB4MTAwMDAiLz4KKyAgICA8bWF4Wm9uZXMgdmFsdWU9IjAiLz4KKyAgICA8bWF4VHdpbGlnaHRQb2ludHMgdmFsdWU9IjAiLz4KKyAgICA8bWF4U3RvcmFnZSB2YWx1ZT0iMCIvPgorICAgIDxtYXhGdW5jdGlvbkRlZnMgdmFsdWU9IjAiLz4KKyAgICA8bWF4SW5zdHJ1Y3Rpb25EZWZzIHZhbHVlPSIwIi8+CisgICAgPG1heFN0YWNrRWxlbWVudHMgdmFsdWU9IjAiLz4KKyAgICA8bWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zIHZhbHVlPSIwIi8+CisgICAgPG1heENvbXBvbmVudEVsZW1lbnRzIHZhbHVlPSIwIi8+CisgIDwvbWF4cD4KKworICA8T1NfMj4KKyAgICA8IS0tIFRoZSBmaWVsZHMgJ3VzRmlyc3RDaGFySW5kZXgnIGFuZCAndXNMYXN0Q2hhckluZGV4JworICAgICAgICAgd2lsbCBiZSByZWNhbGN1bGF0ZWQgYnkgdGhlIGNvbXBpbGVyIC0tPgorICAgIDx2ZXJzaW9uIHZhbHVlPSIzIi8+CisgICAgPHhBdmdDaGFyV2lkdGggdmFsdWU9IjU5NCIvPgorICAgIDx1c1dlaWdodENsYXNzIHZhbHVlPSI1MDAiLz4KKyAgICA8dXNXaWR0aENsYXNzIHZhbHVlPSI1Ii8+CisgICAgPGZzVHlwZSB2YWx1ZT0iMDAwMDAwMDAgMDAwMDEwMDAiLz4KKyAgICA8eVN1YnNjcmlwdFhTaXplIHZhbHVlPSI2NTAiLz4KKyAgICA8eVN1YnNjcmlwdFlTaXplIHZhbHVlPSI2MDAiLz4KKyAgICA8eVN1YnNjcmlwdFhPZmZzZXQgdmFsdWU9IjAiLz4KKyAgICA8eVN1YnNjcmlwdFlPZmZzZXQgdmFsdWU9Ijc1Ii8+CisgICAgPHlTdXBlcnNjcmlwdFhTaXplIHZhbHVlPSI2NTAiLz4KKyAgICA8eVN1cGVyc2NyaXB0WVNpemUgdmFsdWU9IjYwMCIvPgorICAgIDx5U3VwZXJzY3JpcHRYT2Zmc2V0IHZhbHVlPSIwIi8+CisgICAgPHlTdXBlcnNjcmlwdFlPZmZzZXQgdmFsdWU9IjM1MCIvPgorICAgIDx5U3RyaWtlb3V0U2l6ZSB2YWx1ZT0iNTAiLz4KKyAgICA8eVN0cmlrZW91dFBvc2l0aW9uIHZhbHVlPSIzMDAiLz4KKyAgICA8c0ZhbWlseUNsYXNzIHZhbHVlPSIwIi8+CisgICAgPHBhbm9zZT4KKyAgICAgIDxiRmFtaWx5VHlwZSB2YWx1ZT0iMCIvPgorICAgICAgPGJTZXJpZlN0eWxlIHZhbHVlPSIwIi8+CisgICAgICA8YldlaWdodCB2YWx1ZT0iNSIvPgorICAgICAgPGJQcm9wb3J0aW9uIHZhbHVlPSIwIi8+CisgICAgICA8YkNvbnRyYXN0IHZhbHVlPSIwIi8+CisgICAgICA8YlN0cm9rZVZhcmlhdGlvbiB2YWx1ZT0iMCIvPgorICAgICAgPGJBcm1TdHlsZSB2YWx1ZT0iMCIvPgorICAgICAgPGJMZXR0ZXJGb3JtIHZhbHVlPSIwIi8+CisgICAgICA8Yk1pZGxpbmUgdmFsdWU9IjAiLz4KKyAgICAgIDxiWEhlaWdodCB2YWx1ZT0iMCIvPgorICAgIDwvcGFub3NlPgorICAgIDx1bFVuaWNvZGVSYW5nZTEgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAxIi8+CisgICAgPHVsVW5pY29kZVJhbmdlMiB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAiLz4KKyAgICA8dWxVbmljb2RlUmFuZ2UzIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCIvPgorICAgIDx1bFVuaWNvZGVSYW5nZTQgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIi8+CisgICAgPGFjaFZlbmRJRCB2YWx1ZT0iVUtXTiIvPgorICAgIDxmc1NlbGVjdGlvbiB2YWx1ZT0iMDAwMDAwMDAgMDEwMDAwMDAiLz4KKyAgICA8dXNGaXJzdENoYXJJbmRleCB2YWx1ZT0iMzIiLz4KKyAgICA8dXNMYXN0Q2hhckluZGV4IHZhbHVlPSIxMjIiLz4KKyAgICA8c1R5cG9Bc2NlbmRlciB2YWx1ZT0iODAwIi8+CisgICAgPHNUeXBvRGVzY2VuZGVyIHZhbHVlPSItMjAwIi8+CisgICAgPHNUeXBvTGluZUdhcCB2YWx1ZT0iMjAwIi8+CisgICAgPHVzV2luQXNjZW50IHZhbHVlPSIxMDAwIi8+CisgICAgPHVzV2luRGVzY2VudCB2YWx1ZT0iMjAwIi8+CisgICAgPHVsQ29kZVBhZ2VSYW5nZTEgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAxIi8+CisgICAgPHVsQ29kZVBhZ2VSYW5nZTIgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIi8+CisgICAgPHN4SGVpZ2h0IHZhbHVlPSI1MDAiLz4KKyAgICA8c0NhcEhlaWdodCB2YWx1ZT0iNzAwIi8+CisgICAgPHVzRGVmYXVsdENoYXIgdmFsdWU9IjAiLz4KKyAgICA8dXNCcmVha0NoYXIgdmFsdWU9IjMyIi8+CisgICAgPHVzTWF4Q29udGV4dCB2YWx1ZT0iMCIvPgorICA8L09TXzI+CisKKyAgPGhtdHg+CisgICAgPG10eCBuYW1lPSIubm90ZGVmIiB3aWR0aD0iNTAwIiBsc2I9IjkzIi8+CisgICAgPG10eCBuYW1lPSIxZW0iIHdpZHRoPSIxMDAwIiBsc2I9IjkzIi8+CisgICAgPG10eCBuYW1lPSIzZW0iIHdpZHRoPSIzMDAwIiBsc2I9IjkzIi8+CisgIDwvaG10eD4KKworICA8Y21hcD4KKyAgICA8dGFibGVWZXJzaW9uIHZlcnNpb249IjAiLz4KKyAgICA8Y21hcF9mb3JtYXRfNCBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEwIiBsYW5ndWFnZT0iMCI+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDYxIiBuYW1lPSIxZW0iIC8+IDwhLS0gYSAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjIiIG5hbWU9IjFlbSIgLz4gPCEtLSBiIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2MyIgbmFtZT0iMWVtIiAvPiA8IS0tIGMgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDY0IiBuYW1lPSIxZW0iIC8+IDwhLS0gZCAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjUiIG5hbWU9IjFlbSIgLz4gPCEtLSBlIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2NiIgbmFtZT0iMWVtIiAvPiA8IS0tIGYgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDY3IiBuYW1lPSIxZW0iIC8+IDwhLS0gZyAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjgiIG5hbWU9IjFlbSIgLz4gPCEtLSBoIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2OSIgbmFtZT0iM2VtIiAvPiA8IS0tIGkgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDZBIiBuYW1lPSIxZW0iIC8+IDwhLS0gaiAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNkIiIG5hbWU9IjFlbSIgLz4gPCEtLSBrIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2QyIgbmFtZT0iMWVtIiAvPiA8IS0tIGwgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDZEIiBuYW1lPSIxZW0iIC8+IDwhLS0gbSAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNkUiIG5hbWU9IjFlbSIgLz4gPCEtLSBuIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2RiIgbmFtZT0iMWVtIiAvPiA8IS0tIG8gLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDcwIiBuYW1lPSIxZW0iIC8+IDwhLS0gcCAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzEiIG5hbWU9IjFlbSIgLz4gPCEtLSBxIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3MiIgbmFtZT0iMWVtIiAvPiA8IS0tIHIgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDczIiBuYW1lPSIxZW0iIC8+IDwhLS0gcyAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzQiIG5hbWU9IjFlbSIgLz4gPCEtLSB0IC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3NSIgbmFtZT0iMWVtIiAvPiA8IS0tIHUgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDc2IiBuYW1lPSIxZW0iIC8+IDwhLS0gdiAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzciIG5hbWU9IjFlbSIgLz4gPCEtLSB3IC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3OCIgbmFtZT0iMWVtIiAvPiA8IS0tIHggLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDc5IiBuYW1lPSIxZW0iIC8+IDwhLS0geSAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwN0EiIG5hbWU9IjFlbSIgLz4gPCEtLSB6IC0tPgorICAgIDwvY21hcF9mb3JtYXRfND4KKyAgPC9jbWFwPgorCisgIDxsb2NhPgorICAgIDwhLS0gVGhlICdsb2NhJyB0YWJsZSB3aWxsIGJlIGNhbGN1bGF0ZWQgYnkgdGhlIGNvbXBpbGVyIC0tPgorICA8L2xvY2E+CisKKyAgPGdseWY+CisgICAgPFRUR2x5cGggbmFtZT0iLm5vdGRlZiIgeE1pbj0iMCIgeU1pbj0iMCIgeE1heD0iMCIgeU1heD0iMCIgLz4KKyAgICA8VFRHbHlwaCBuYW1lPSIxZW0iIHhNaW49IjAiIHlNaW49IjAiIHhNYXg9IjAiIHlNYXg9IjAiIC8+CisgICAgPFRUR2x5cGggbmFtZT0iM2VtIiB4TWluPSIwIiB5TWluPSIwIiB4TWF4PSIwIiB5TWF4PSIwIiAvPgorICA8L2dseWY+CisKKyAgPG5hbWU+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSIwIiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAgICA8L25hbWVyZWNvcmQ+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSIxIiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgU2FtcGxlIEZvbnQKKyAgICA8L25hbWVyZWNvcmQ+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSIyIiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgUmVndWxhcgorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjQiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBTYW1wbGUgRm9udAorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjYiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBTYW1wbGVGb250LVJlZ3VsYXIKKyAgICA8L25hbWVyZWNvcmQ+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSIxMyIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUworICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAgICA8L25hbWVyZWNvcmQ+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSIxNCIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgIDwvbmFtZXJlY29yZD4KKyAgPC9uYW1lPgorCisgIDxwb3N0PgorICAgIDxmb3JtYXRUeXBlIHZhbHVlPSIzLjAiLz4KKyAgICA8aXRhbGljQW5nbGUgdmFsdWU9IjAuMCIvPgorICAgIDx1bmRlcmxpbmVQb3NpdGlvbiB2YWx1ZT0iLTc1Ii8+CisgICAgPHVuZGVybGluZVRoaWNrbmVzcyB2YWx1ZT0iNTAiLz4KKyAgICA8aXNGaXhlZFBpdGNoIHZhbHVlPSIwIi8+CisgICAgPG1pbk1lbVR5cGU0MiB2YWx1ZT0iMCIvPgorICAgIDxtYXhNZW1UeXBlNDIgdmFsdWU9IjAiLz4KKyAgICA8bWluTWVtVHlwZTEgdmFsdWU9IjAiLz4KKyAgICA8bWF4TWVtVHlwZTEgdmFsdWU9IjAiLz4KKyAgPC9wb3N0PgorCis8L3R0Rm9udD4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9hc3NldHMvZm9udF9zb3VyY2UvYXNjaWlfajNlbV93ZWlnaHQ1MDBfaXRhbGljLnR0eCBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9hc3NldHMvZm9udF9zb3VyY2UvYXNjaWlfajNlbV93ZWlnaHQ1MDBfaXRhbGljLnR0eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTJkODFlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L2Fzc2V0cy9mb250X3NvdXJjZS9hc2NpaV9qM2VtX3dlaWdodDUwMF9pdGFsaWMudHR4CkBAIC0wLDAgKzEsMjA4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8dHRGb250IHNmbnRWZXJzaW9uPSJceDAwXHgwMVx4MDBceDAwIiB0dExpYlZlcnNpb249IjMuMCI+CisKKyAgPEdseXBoT3JkZXI+CisgICAgPEdseXBoSUQgaWQ9IjAiIG5hbWU9Ii5ub3RkZWYiLz4KKyAgICA8R2x5cGhJRCBpZD0iMSIgbmFtZT0iMWVtIi8+CisgICAgPEdseXBoSUQgaWQ9IjIiIG5hbWU9IjNlbSIvPgorICA8L0dseXBoT3JkZXI+CisKKyAgPGhlYWQ+CisgICAgPHRhYmxlVmVyc2lvbiB2YWx1ZT0iMS4wIi8+CisgICAgPGZvbnRSZXZpc2lvbiB2YWx1ZT0iMS4wIi8+CisgICAgPGNoZWNrU3VtQWRqdXN0bWVudCB2YWx1ZT0iMHg2NDBjZGIyZiIvPgorICAgIDxtYWdpY051bWJlciB2YWx1ZT0iMHg1ZjBmM2NmNSIvPgorICAgIDxmbGFncyB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMTEiLz4KKyAgICA8dW5pdHNQZXJFbSB2YWx1ZT0iMTAwMCIvPgorICAgIDxjcmVhdGVkIHZhbHVlPSJUaHUgRmViIDIyIDEwOjA0OjI5IDIwMTgiLz4KKyAgICA8bWFjU3R5bGUgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDEwIi8+CisgICAgPGxvd2VzdFJlY1BQRU0gdmFsdWU9IjciLz4KKyAgICA8Zm9udERpcmVjdGlvbkhpbnQgdmFsdWU9IjIiLz4KKyAgICA8Z2x5cGhEYXRhRm9ybWF0IHZhbHVlPSIwIi8+CisgIDwvaGVhZD4KKworICA8aGhlYT4KKyAgICA8dGFibGVWZXJzaW9uIHZhbHVlPSIweDAwMDEwMDAwIi8+CisgICAgPGFzY2VudCB2YWx1ZT0iMTAwMCIvPgorICAgIDxkZXNjZW50IHZhbHVlPSItMjAwIi8+CisgICAgPGxpbmVHYXAgdmFsdWU9IjAiLz4KKyAgICA8Y2FyZXRTbG9wZVJpc2UgdmFsdWU9IjEiLz4KKyAgICA8Y2FyZXRTbG9wZVJ1biB2YWx1ZT0iMCIvPgorICAgIDxjYXJldE9mZnNldCB2YWx1ZT0iMCIvPgorICAgIDxyZXNlcnZlZDAgdmFsdWU9IjAiLz4KKyAgICA8cmVzZXJ2ZWQxIHZhbHVlPSIwIi8+CisgICAgPHJlc2VydmVkMiB2YWx1ZT0iMCIvPgorICAgIDxyZXNlcnZlZDMgdmFsdWU9IjAiLz4KKyAgICA8bWV0cmljRGF0YUZvcm1hdCB2YWx1ZT0iMCIvPgorICA8L2hoZWE+CisKKyAgPG1heHA+CisgICAgPHRhYmxlVmVyc2lvbiB2YWx1ZT0iMHgxMDAwMCIvPgorICAgIDxtYXhab25lcyB2YWx1ZT0iMCIvPgorICAgIDxtYXhUd2lsaWdodFBvaW50cyB2YWx1ZT0iMCIvPgorICAgIDxtYXhTdG9yYWdlIHZhbHVlPSIwIi8+CisgICAgPG1heEZ1bmN0aW9uRGVmcyB2YWx1ZT0iMCIvPgorICAgIDxtYXhJbnN0cnVjdGlvbkRlZnMgdmFsdWU9IjAiLz4KKyAgICA8bWF4U3RhY2tFbGVtZW50cyB2YWx1ZT0iMCIvPgorICAgIDxtYXhTaXplT2ZJbnN0cnVjdGlvbnMgdmFsdWU9IjAiLz4KKyAgICA8bWF4Q29tcG9uZW50RWxlbWVudHMgdmFsdWU9IjAiLz4KKyAgPC9tYXhwPgorCisgIDxPU18yPgorICAgIDwhLS0gVGhlIGZpZWxkcyAndXNGaXJzdENoYXJJbmRleCcgYW5kICd1c0xhc3RDaGFySW5kZXgnCisgICAgICAgICB3aWxsIGJlIHJlY2FsY3VsYXRlZCBieSB0aGUgY29tcGlsZXIgLS0+CisgICAgPHZlcnNpb24gdmFsdWU9IjMiLz4KKyAgICA8eEF2Z0NoYXJXaWR0aCB2YWx1ZT0iNTk0Ii8+CisgICAgPHVzV2VpZ2h0Q2xhc3MgdmFsdWU9IjUwMCIvPgorICAgIDx1c1dpZHRoQ2xhc3MgdmFsdWU9IjUiLz4KKyAgICA8ZnNUeXBlIHZhbHVlPSIwMDAwMDAwMCAwMDAwMTAwMCIvPgorICAgIDx5U3Vic2NyaXB0WFNpemUgdmFsdWU9IjY1MCIvPgorICAgIDx5U3Vic2NyaXB0WVNpemUgdmFsdWU9IjYwMCIvPgorICAgIDx5U3Vic2NyaXB0WE9mZnNldCB2YWx1ZT0iMCIvPgorICAgIDx5U3Vic2NyaXB0WU9mZnNldCB2YWx1ZT0iNzUiLz4KKyAgICA8eVN1cGVyc2NyaXB0WFNpemUgdmFsdWU9IjY1MCIvPgorICAgIDx5U3VwZXJzY3JpcHRZU2l6ZSB2YWx1ZT0iNjAwIi8+CisgICAgPHlTdXBlcnNjcmlwdFhPZmZzZXQgdmFsdWU9IjAiLz4KKyAgICA8eVN1cGVyc2NyaXB0WU9mZnNldCB2YWx1ZT0iMzUwIi8+CisgICAgPHlTdHJpa2VvdXRTaXplIHZhbHVlPSI1MCIvPgorICAgIDx5U3RyaWtlb3V0UG9zaXRpb24gdmFsdWU9IjMwMCIvPgorICAgIDxzRmFtaWx5Q2xhc3MgdmFsdWU9IjAiLz4KKyAgICA8cGFub3NlPgorICAgICAgPGJGYW1pbHlUeXBlIHZhbHVlPSIwIi8+CisgICAgICA8YlNlcmlmU3R5bGUgdmFsdWU9IjAiLz4KKyAgICAgIDxiV2VpZ2h0IHZhbHVlPSI1Ii8+CisgICAgICA8YlByb3BvcnRpb24gdmFsdWU9IjAiLz4KKyAgICAgIDxiQ29udHJhc3QgdmFsdWU9IjAiLz4KKyAgICAgIDxiU3Ryb2tlVmFyaWF0aW9uIHZhbHVlPSIwIi8+CisgICAgICA8YkFybVN0eWxlIHZhbHVlPSIwIi8+CisgICAgICA8YkxldHRlckZvcm0gdmFsdWU9IjAiLz4KKyAgICAgIDxiTWlkbGluZSB2YWx1ZT0iMCIvPgorICAgICAgPGJYSGVpZ2h0IHZhbHVlPSIwIi8+CisgICAgPC9wYW5vc2U+CisgICAgPHVsVW5pY29kZVJhbmdlMSB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDEiLz4KKyAgICA8dWxVbmljb2RlUmFuZ2UyIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCIvPgorICAgIDx1bFVuaWNvZGVSYW5nZTMgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIi8+CisgICAgPHVsVW5pY29kZVJhbmdlNCB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAiLz4KKyAgICA8YWNoVmVuZElEIHZhbHVlPSJVS1dOIi8+CisgICAgPGZzU2VsZWN0aW9uIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMSIvPgorICAgIDx1c0ZpcnN0Q2hhckluZGV4IHZhbHVlPSIzMiIvPgorICAgIDx1c0xhc3RDaGFySW5kZXggdmFsdWU9IjEyMiIvPgorICAgIDxzVHlwb0FzY2VuZGVyIHZhbHVlPSI4MDAiLz4KKyAgICA8c1R5cG9EZXNjZW5kZXIgdmFsdWU9Ii0yMDAiLz4KKyAgICA8c1R5cG9MaW5lR2FwIHZhbHVlPSIyMDAiLz4KKyAgICA8dXNXaW5Bc2NlbnQgdmFsdWU9IjEwMDAiLz4KKyAgICA8dXNXaW5EZXNjZW50IHZhbHVlPSIyMDAiLz4KKyAgICA8dWxDb2RlUGFnZVJhbmdlMSB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDEiLz4KKyAgICA8dWxDb2RlUGFnZVJhbmdlMiB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAiLz4KKyAgICA8c3hIZWlnaHQgdmFsdWU9IjUwMCIvPgorICAgIDxzQ2FwSGVpZ2h0IHZhbHVlPSI3MDAiLz4KKyAgICA8dXNEZWZhdWx0Q2hhciB2YWx1ZT0iMCIvPgorICAgIDx1c0JyZWFrQ2hhciB2YWx1ZT0iMzIiLz4KKyAgICA8dXNNYXhDb250ZXh0IHZhbHVlPSIwIi8+CisgIDwvT1NfMj4KKworICA8aG10eD4KKyAgICA8bXR4IG5hbWU9Ii5ub3RkZWYiIHdpZHRoPSI1MDAiIGxzYj0iOTMiLz4KKyAgICA8bXR4IG5hbWU9IjFlbSIgd2lkdGg9IjEwMDAiIGxzYj0iOTMiLz4KKyAgICA8bXR4IG5hbWU9IjNlbSIgd2lkdGg9IjMwMDAiIGxzYj0iOTMiLz4KKyAgPC9obXR4PgorCisgIDxjbWFwPgorICAgIDx0YWJsZVZlcnNpb24gdmVyc2lvbj0iMCIvPgorICAgIDxjbWFwX2Zvcm1hdF80IHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMTAiIGxhbmd1YWdlPSIwIj4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjEiIG5hbWU9IjFlbSIgLz4gPCEtLSBhIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2MiIgbmFtZT0iMWVtIiAvPiA8IS0tIGIgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDYzIiBuYW1lPSIxZW0iIC8+IDwhLS0gYyAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjQiIG5hbWU9IjFlbSIgLz4gPCEtLSBkIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2NSIgbmFtZT0iMWVtIiAvPiA8IS0tIGUgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDY2IiBuYW1lPSIxZW0iIC8+IDwhLS0gZiAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjciIG5hbWU9IjFlbSIgLz4gPCEtLSBnIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2OCIgbmFtZT0iMWVtIiAvPiA8IS0tIGggLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDY5IiBuYW1lPSIxZW0iIC8+IDwhLS0gaSAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNkEiIG5hbWU9IjNlbSIgLz4gPCEtLSBqIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2QiIgbmFtZT0iMWVtIiAvPiA8IS0tIGsgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDZDIiBuYW1lPSIxZW0iIC8+IDwhLS0gbCAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNkQiIG5hbWU9IjFlbSIgLz4gPCEtLSBtIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2RSIgbmFtZT0iMWVtIiAvPiA8IS0tIG4gLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDZGIiBuYW1lPSIxZW0iIC8+IDwhLS0gbyAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzAiIG5hbWU9IjFlbSIgLz4gPCEtLSBwIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3MSIgbmFtZT0iMWVtIiAvPiA8IS0tIHEgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDcyIiBuYW1lPSIxZW0iIC8+IDwhLS0gciAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzMiIG5hbWU9IjFlbSIgLz4gPCEtLSBzIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3NCIgbmFtZT0iMWVtIiAvPiA8IS0tIHQgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDc1IiBuYW1lPSIxZW0iIC8+IDwhLS0gdSAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzYiIG5hbWU9IjFlbSIgLz4gPCEtLSB2IC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3NyIgbmFtZT0iMWVtIiAvPiA8IS0tIHcgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDc4IiBuYW1lPSIxZW0iIC8+IDwhLS0geCAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzkiIG5hbWU9IjFlbSIgLz4gPCEtLSB5IC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3QSIgbmFtZT0iMWVtIiAvPiA8IS0tIHogLS0+CisgICAgPC9jbWFwX2Zvcm1hdF80PgorICA8L2NtYXA+CisKKyAgPGxvY2E+CisgICAgPCEtLSBUaGUgJ2xvY2EnIHRhYmxlIHdpbGwgYmUgY2FsY3VsYXRlZCBieSB0aGUgY29tcGlsZXIgLS0+CisgIDwvbG9jYT4KKworICA8Z2x5Zj4KKyAgICA8VFRHbHlwaCBuYW1lPSIubm90ZGVmIiB4TWluPSIwIiB5TWluPSIwIiB4TWF4PSIwIiB5TWF4PSIwIiAvPgorICAgIDxUVEdseXBoIG5hbWU9IjFlbSIgeE1pbj0iMCIgeU1pbj0iMCIgeE1heD0iMCIgeU1heD0iMCIgLz4KKyAgICA8VFRHbHlwaCBuYW1lPSIzZW0iIHhNaW49IjAiIHlNaW49IjAiIHhNYXg9IjAiIHlNYXg9IjAiIC8+CisgIDwvZ2x5Zj4KKworICA8bmFtZT4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjAiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjEiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBTYW1wbGUgRm9udAorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjIiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBSZWd1bGFyCisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iNCIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIFNhbXBsZSBGb250CisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iNiIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIFNhbXBsZUZvbnQtUmVndWxhcgorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjEzIiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjE0IiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgPC9uYW1lcmVjb3JkPgorICA8L25hbWU+CisKKyAgPHBvc3Q+CisgICAgPGZvcm1hdFR5cGUgdmFsdWU9IjMuMCIvPgorICAgIDxpdGFsaWNBbmdsZSB2YWx1ZT0iMC4wIi8+CisgICAgPHVuZGVybGluZVBvc2l0aW9uIHZhbHVlPSItNzUiLz4KKyAgICA8dW5kZXJsaW5lVGhpY2tuZXNzIHZhbHVlPSI1MCIvPgorICAgIDxpc0ZpeGVkUGl0Y2ggdmFsdWU9IjAiLz4KKyAgICA8bWluTWVtVHlwZTQyIHZhbHVlPSIwIi8+CisgICAgPG1heE1lbVR5cGU0MiB2YWx1ZT0iMCIvPgorICAgIDxtaW5NZW1UeXBlMSB2YWx1ZT0iMCIvPgorICAgIDxtYXhNZW1UeXBlMSB2YWx1ZT0iMCIvPgorICA8L3Bvc3Q+CisKKzwvdHRGb250PgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L2Fzc2V0cy9mb250X3NvdXJjZS9hc2NpaV9rM2VtX3dlaWdodDYwMF91cHJpZ2h0LnR0eCBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9hc3NldHMvZm9udF9zb3VyY2UvYXNjaWlfazNlbV93ZWlnaHQ2MDBfdXByaWdodC50dHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQwNmQzZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9hc3NldHMvZm9udF9zb3VyY2UvYXNjaWlfazNlbV93ZWlnaHQ2MDBfdXByaWdodC50dHgKQEAgLTAsMCArMSwyMDggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzx0dEZvbnQgc2ZudFZlcnNpb249Ilx4MDBceDAxXHgwMFx4MDAiIHR0TGliVmVyc2lvbj0iMy4wIj4KKworICA8R2x5cGhPcmRlcj4KKyAgICA8R2x5cGhJRCBpZD0iMCIgbmFtZT0iLm5vdGRlZiIvPgorICAgIDxHbHlwaElEIGlkPSIxIiBuYW1lPSIxZW0iLz4KKyAgICA8R2x5cGhJRCBpZD0iMiIgbmFtZT0iM2VtIi8+CisgIDwvR2x5cGhPcmRlcj4KKworICA8aGVhZD4KKyAgICA8dGFibGVWZXJzaW9uIHZhbHVlPSIxLjAiLz4KKyAgICA8Zm9udFJldmlzaW9uIHZhbHVlPSIxLjAiLz4KKyAgICA8Y2hlY2tTdW1BZGp1c3RtZW50IHZhbHVlPSIweDY0MGNkYjJmIi8+CisgICAgPG1hZ2ljTnVtYmVyIHZhbHVlPSIweDVmMGYzY2Y1Ii8+CisgICAgPGZsYWdzIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAxMSIvPgorICAgIDx1bml0c1BlckVtIHZhbHVlPSIxMDAwIi8+CisgICAgPGNyZWF0ZWQgdmFsdWU9IlRodSBGZWIgMjIgMTA6MDQ6MjkgMjAxOCIvPgorICAgIDxtYWNTdHlsZSB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAiLz4KKyAgICA8bG93ZXN0UmVjUFBFTSB2YWx1ZT0iNyIvPgorICAgIDxmb250RGlyZWN0aW9uSGludCB2YWx1ZT0iMiIvPgorICAgIDxnbHlwaERhdGFGb3JtYXQgdmFsdWU9IjAiLz4KKyAgPC9oZWFkPgorCisgIDxoaGVhPgorICAgIDx0YWJsZVZlcnNpb24gdmFsdWU9IjB4MDAwMTAwMDAiLz4KKyAgICA8YXNjZW50IHZhbHVlPSIxMDAwIi8+CisgICAgPGRlc2NlbnQgdmFsdWU9Ii0yMDAiLz4KKyAgICA8bGluZUdhcCB2YWx1ZT0iMCIvPgorICAgIDxjYXJldFNsb3BlUmlzZSB2YWx1ZT0iMSIvPgorICAgIDxjYXJldFNsb3BlUnVuIHZhbHVlPSIwIi8+CisgICAgPGNhcmV0T2Zmc2V0IHZhbHVlPSIwIi8+CisgICAgPHJlc2VydmVkMCB2YWx1ZT0iMCIvPgorICAgIDxyZXNlcnZlZDEgdmFsdWU9IjAiLz4KKyAgICA8cmVzZXJ2ZWQyIHZhbHVlPSIwIi8+CisgICAgPHJlc2VydmVkMyB2YWx1ZT0iMCIvPgorICAgIDxtZXRyaWNEYXRhRm9ybWF0IHZhbHVlPSIwIi8+CisgIDwvaGhlYT4KKworICA8bWF4cD4KKyAgICA8dGFibGVWZXJzaW9uIHZhbHVlPSIweDEwMDAwIi8+CisgICAgPG1heFpvbmVzIHZhbHVlPSIwIi8+CisgICAgPG1heFR3aWxpZ2h0UG9pbnRzIHZhbHVlPSIwIi8+CisgICAgPG1heFN0b3JhZ2UgdmFsdWU9IjAiLz4KKyAgICA8bWF4RnVuY3Rpb25EZWZzIHZhbHVlPSIwIi8+CisgICAgPG1heEluc3RydWN0aW9uRGVmcyB2YWx1ZT0iMCIvPgorICAgIDxtYXhTdGFja0VsZW1lbnRzIHZhbHVlPSIwIi8+CisgICAgPG1heFNpemVPZkluc3RydWN0aW9ucyB2YWx1ZT0iMCIvPgorICAgIDxtYXhDb21wb25lbnRFbGVtZW50cyB2YWx1ZT0iMCIvPgorICA8L21heHA+CisKKyAgPE9TXzI+CisgICAgPCEtLSBUaGUgZmllbGRzICd1c0ZpcnN0Q2hhckluZGV4JyBhbmQgJ3VzTGFzdENoYXJJbmRleCcKKyAgICAgICAgIHdpbGwgYmUgcmVjYWxjdWxhdGVkIGJ5IHRoZSBjb21waWxlciAtLT4KKyAgICA8dmVyc2lvbiB2YWx1ZT0iMyIvPgorICAgIDx4QXZnQ2hhcldpZHRoIHZhbHVlPSI1OTQiLz4KKyAgICA8dXNXZWlnaHRDbGFzcyB2YWx1ZT0iNjAwIi8+CisgICAgPHVzV2lkdGhDbGFzcyB2YWx1ZT0iNSIvPgorICAgIDxmc1R5cGUgdmFsdWU9IjAwMDAwMDAwIDAwMDAxMDAwIi8+CisgICAgPHlTdWJzY3JpcHRYU2l6ZSB2YWx1ZT0iNjUwIi8+CisgICAgPHlTdWJzY3JpcHRZU2l6ZSB2YWx1ZT0iNjAwIi8+CisgICAgPHlTdWJzY3JpcHRYT2Zmc2V0IHZhbHVlPSIwIi8+CisgICAgPHlTdWJzY3JpcHRZT2Zmc2V0IHZhbHVlPSI3NSIvPgorICAgIDx5U3VwZXJzY3JpcHRYU2l6ZSB2YWx1ZT0iNjUwIi8+CisgICAgPHlTdXBlcnNjcmlwdFlTaXplIHZhbHVlPSI2MDAiLz4KKyAgICA8eVN1cGVyc2NyaXB0WE9mZnNldCB2YWx1ZT0iMCIvPgorICAgIDx5U3VwZXJzY3JpcHRZT2Zmc2V0IHZhbHVlPSIzNTAiLz4KKyAgICA8eVN0cmlrZW91dFNpemUgdmFsdWU9IjUwIi8+CisgICAgPHlTdHJpa2VvdXRQb3NpdGlvbiB2YWx1ZT0iMzAwIi8+CisgICAgPHNGYW1pbHlDbGFzcyB2YWx1ZT0iMCIvPgorICAgIDxwYW5vc2U+CisgICAgICA8YkZhbWlseVR5cGUgdmFsdWU9IjAiLz4KKyAgICAgIDxiU2VyaWZTdHlsZSB2YWx1ZT0iMCIvPgorICAgICAgPGJXZWlnaHQgdmFsdWU9IjUiLz4KKyAgICAgIDxiUHJvcG9ydGlvbiB2YWx1ZT0iMCIvPgorICAgICAgPGJDb250cmFzdCB2YWx1ZT0iMCIvPgorICAgICAgPGJTdHJva2VWYXJpYXRpb24gdmFsdWU9IjAiLz4KKyAgICAgIDxiQXJtU3R5bGUgdmFsdWU9IjAiLz4KKyAgICAgIDxiTGV0dGVyRm9ybSB2YWx1ZT0iMCIvPgorICAgICAgPGJNaWRsaW5lIHZhbHVlPSIwIi8+CisgICAgICA8YlhIZWlnaHQgdmFsdWU9IjAiLz4KKyAgICA8L3Bhbm9zZT4KKyAgICA8dWxVbmljb2RlUmFuZ2UxIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMSIvPgorICAgIDx1bFVuaWNvZGVSYW5nZTIgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIi8+CisgICAgPHVsVW5pY29kZVJhbmdlMyB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAiLz4KKyAgICA8dWxVbmljb2RlUmFuZ2U0IHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCIvPgorICAgIDxhY2hWZW5kSUQgdmFsdWU9IlVLV04iLz4KKyAgICA8ZnNTZWxlY3Rpb24gdmFsdWU9IjAwMDAwMDAwIDAxMDAwMDAwIi8+CisgICAgPHVzRmlyc3RDaGFySW5kZXggdmFsdWU9IjMyIi8+CisgICAgPHVzTGFzdENoYXJJbmRleCB2YWx1ZT0iMTIyIi8+CisgICAgPHNUeXBvQXNjZW5kZXIgdmFsdWU9IjgwMCIvPgorICAgIDxzVHlwb0Rlc2NlbmRlciB2YWx1ZT0iLTIwMCIvPgorICAgIDxzVHlwb0xpbmVHYXAgdmFsdWU9IjIwMCIvPgorICAgIDx1c1dpbkFzY2VudCB2YWx1ZT0iMTAwMCIvPgorICAgIDx1c1dpbkRlc2NlbnQgdmFsdWU9IjIwMCIvPgorICAgIDx1bENvZGVQYWdlUmFuZ2UxIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMSIvPgorICAgIDx1bENvZGVQYWdlUmFuZ2UyIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCIvPgorICAgIDxzeEhlaWdodCB2YWx1ZT0iNTAwIi8+CisgICAgPHNDYXBIZWlnaHQgdmFsdWU9IjcwMCIvPgorICAgIDx1c0RlZmF1bHRDaGFyIHZhbHVlPSIwIi8+CisgICAgPHVzQnJlYWtDaGFyIHZhbHVlPSIzMiIvPgorICAgIDx1c01heENvbnRleHQgdmFsdWU9IjAiLz4KKyAgPC9PU18yPgorCisgIDxobXR4PgorICAgIDxtdHggbmFtZT0iLm5vdGRlZiIgd2lkdGg9IjUwMCIgbHNiPSI5MyIvPgorICAgIDxtdHggbmFtZT0iMWVtIiB3aWR0aD0iMTAwMCIgbHNiPSI5MyIvPgorICAgIDxtdHggbmFtZT0iM2VtIiB3aWR0aD0iMzAwMCIgbHNiPSI5MyIvPgorICA8L2htdHg+CisKKyAgPGNtYXA+CisgICAgPHRhYmxlVmVyc2lvbiB2ZXJzaW9uPSIwIi8+CisgICAgPGNtYXBfZm9ybWF0XzQgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxMCIgbGFuZ3VhZ2U9IjAiPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2MSIgbmFtZT0iMWVtIiAvPiA8IS0tIGEgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDYyIiBuYW1lPSIxZW0iIC8+IDwhLS0gYiAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjMiIG5hbWU9IjFlbSIgLz4gPCEtLSBjIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2NCIgbmFtZT0iMWVtIiAvPiA8IS0tIGQgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDY1IiBuYW1lPSIxZW0iIC8+IDwhLS0gZSAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjYiIG5hbWU9IjFlbSIgLz4gPCEtLSBmIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2NyIgbmFtZT0iMWVtIiAvPiA8IS0tIGcgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDY4IiBuYW1lPSIxZW0iIC8+IDwhLS0gaCAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjkiIG5hbWU9IjFlbSIgLz4gPCEtLSBpIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2QSIgbmFtZT0iMWVtIiAvPiA8IS0tIGogLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDZCIiBuYW1lPSIzZW0iIC8+IDwhLS0gayAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNkMiIG5hbWU9IjFlbSIgLz4gPCEtLSBsIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2RCIgbmFtZT0iMWVtIiAvPiA8IS0tIG0gLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDZFIiBuYW1lPSIxZW0iIC8+IDwhLS0gbiAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNkYiIG5hbWU9IjFlbSIgLz4gPCEtLSBvIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3MCIgbmFtZT0iMWVtIiAvPiA8IS0tIHAgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDcxIiBuYW1lPSIxZW0iIC8+IDwhLS0gcSAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzIiIG5hbWU9IjFlbSIgLz4gPCEtLSByIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3MyIgbmFtZT0iMWVtIiAvPiA8IS0tIHMgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDc0IiBuYW1lPSIxZW0iIC8+IDwhLS0gdCAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzUiIG5hbWU9IjFlbSIgLz4gPCEtLSB1IC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3NiIgbmFtZT0iMWVtIiAvPiA8IS0tIHYgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDc3IiBuYW1lPSIxZW0iIC8+IDwhLS0gdyAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzgiIG5hbWU9IjFlbSIgLz4gPCEtLSB4IC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3OSIgbmFtZT0iMWVtIiAvPiA8IS0tIHkgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDdBIiBuYW1lPSIxZW0iIC8+IDwhLS0geiAtLT4KKyAgICA8L2NtYXBfZm9ybWF0XzQ+CisgIDwvY21hcD4KKworICA8bG9jYT4KKyAgICA8IS0tIFRoZSAnbG9jYScgdGFibGUgd2lsbCBiZSBjYWxjdWxhdGVkIGJ5IHRoZSBjb21waWxlciAtLT4KKyAgPC9sb2NhPgorCisgIDxnbHlmPgorICAgIDxUVEdseXBoIG5hbWU9Ii5ub3RkZWYiIHhNaW49IjAiIHlNaW49IjAiIHhNYXg9IjAiIHlNYXg9IjAiIC8+CisgICAgPFRUR2x5cGggbmFtZT0iMWVtIiB4TWluPSIwIiB5TWluPSIwIiB4TWF4PSIwIiB5TWF4PSIwIiAvPgorICAgIDxUVEdseXBoIG5hbWU9IjNlbSIgeE1pbj0iMCIgeU1pbj0iMCIgeE1heD0iMCIgeU1heD0iMCIgLz4KKyAgPC9nbHlmPgorCisgIDxuYW1lPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iMCIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iMSIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIFNhbXBsZSBGb250CisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iMiIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIFJlZ3VsYXIKKyAgICA8L25hbWVyZWNvcmQ+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSI0IiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgU2FtcGxlIEZvbnQKKyAgICA8L25hbWVyZWNvcmQ+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSI2IiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgU2FtcGxlRm9udC1SZWd1bGFyCisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iMTMiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iMTQiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICA8L25hbWVyZWNvcmQ+CisgIDwvbmFtZT4KKworICA8cG9zdD4KKyAgICA8Zm9ybWF0VHlwZSB2YWx1ZT0iMy4wIi8+CisgICAgPGl0YWxpY0FuZ2xlIHZhbHVlPSIwLjAiLz4KKyAgICA8dW5kZXJsaW5lUG9zaXRpb24gdmFsdWU9Ii03NSIvPgorICAgIDx1bmRlcmxpbmVUaGlja25lc3MgdmFsdWU9IjUwIi8+CisgICAgPGlzRml4ZWRQaXRjaCB2YWx1ZT0iMCIvPgorICAgIDxtaW5NZW1UeXBlNDIgdmFsdWU9IjAiLz4KKyAgICA8bWF4TWVtVHlwZTQyIHZhbHVlPSIwIi8+CisgICAgPG1pbk1lbVR5cGUxIHZhbHVlPSIwIi8+CisgICAgPG1heE1lbVR5cGUxIHZhbHVlPSIwIi8+CisgIDwvcG9zdD4KKworPC90dEZvbnQ+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy93aWRnZXQvYXNzZXRzL2ZvbnRfc291cmNlL2FzY2lpX2wzZW1fd2VpZ2h0NjAwX2l0YWxpYy50dHggYi90ZXN0cy90ZXN0cy93aWRnZXQvYXNzZXRzL2ZvbnRfc291cmNlL2FzY2lpX2wzZW1fd2VpZ2h0NjAwX2l0YWxpYy50dHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZhYjMxMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9hc3NldHMvZm9udF9zb3VyY2UvYXNjaWlfbDNlbV93ZWlnaHQ2MDBfaXRhbGljLnR0eApAQCAtMCwwICsxLDIwOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUworICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHR0Rm9udCBzZm50VmVyc2lvbj0iXHgwMFx4MDFceDAwXHgwMCIgdHRMaWJWZXJzaW9uPSIzLjAiPgorCisgIDxHbHlwaE9yZGVyPgorICAgIDxHbHlwaElEIGlkPSIwIiBuYW1lPSIubm90ZGVmIi8+CisgICAgPEdseXBoSUQgaWQ9IjEiIG5hbWU9IjFlbSIvPgorICAgIDxHbHlwaElEIGlkPSIyIiBuYW1lPSIzZW0iLz4KKyAgPC9HbHlwaE9yZGVyPgorCisgIDxoZWFkPgorICAgIDx0YWJsZVZlcnNpb24gdmFsdWU9IjEuMCIvPgorICAgIDxmb250UmV2aXNpb24gdmFsdWU9IjEuMCIvPgorICAgIDxjaGVja1N1bUFkanVzdG1lbnQgdmFsdWU9IjB4NjQwY2RiMmYiLz4KKyAgICA8bWFnaWNOdW1iZXIgdmFsdWU9IjB4NWYwZjNjZjUiLz4KKyAgICA8ZmxhZ3MgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDExIi8+CisgICAgPHVuaXRzUGVyRW0gdmFsdWU9IjEwMDAiLz4KKyAgICA8Y3JlYXRlZCB2YWx1ZT0iVGh1IEZlYiAyMiAxMDowNDozMCAyMDE4Ii8+CisgICAgPG1hY1N0eWxlIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAxMCIvPgorICAgIDxsb3dlc3RSZWNQUEVNIHZhbHVlPSI3Ii8+CisgICAgPGZvbnREaXJlY3Rpb25IaW50IHZhbHVlPSIyIi8+CisgICAgPGdseXBoRGF0YUZvcm1hdCB2YWx1ZT0iMCIvPgorICA8L2hlYWQ+CisKKyAgPGhoZWE+CisgICAgPHRhYmxlVmVyc2lvbiB2YWx1ZT0iMHgwMDAxMDAwMCIvPgorICAgIDxhc2NlbnQgdmFsdWU9IjEwMDAiLz4KKyAgICA8ZGVzY2VudCB2YWx1ZT0iLTIwMCIvPgorICAgIDxsaW5lR2FwIHZhbHVlPSIwIi8+CisgICAgPGNhcmV0U2xvcGVSaXNlIHZhbHVlPSIxIi8+CisgICAgPGNhcmV0U2xvcGVSdW4gdmFsdWU9IjAiLz4KKyAgICA8Y2FyZXRPZmZzZXQgdmFsdWU9IjAiLz4KKyAgICA8cmVzZXJ2ZWQwIHZhbHVlPSIwIi8+CisgICAgPHJlc2VydmVkMSB2YWx1ZT0iMCIvPgorICAgIDxyZXNlcnZlZDIgdmFsdWU9IjAiLz4KKyAgICA8cmVzZXJ2ZWQzIHZhbHVlPSIwIi8+CisgICAgPG1ldHJpY0RhdGFGb3JtYXQgdmFsdWU9IjAiLz4KKyAgPC9oaGVhPgorCisgIDxtYXhwPgorICAgIDx0YWJsZVZlcnNpb24gdmFsdWU9IjB4MTAwMDAiLz4KKyAgICA8bWF4Wm9uZXMgdmFsdWU9IjAiLz4KKyAgICA8bWF4VHdpbGlnaHRQb2ludHMgdmFsdWU9IjAiLz4KKyAgICA8bWF4U3RvcmFnZSB2YWx1ZT0iMCIvPgorICAgIDxtYXhGdW5jdGlvbkRlZnMgdmFsdWU9IjAiLz4KKyAgICA8bWF4SW5zdHJ1Y3Rpb25EZWZzIHZhbHVlPSIwIi8+CisgICAgPG1heFN0YWNrRWxlbWVudHMgdmFsdWU9IjAiLz4KKyAgICA8bWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zIHZhbHVlPSIwIi8+CisgICAgPG1heENvbXBvbmVudEVsZW1lbnRzIHZhbHVlPSIwIi8+CisgIDwvbWF4cD4KKworICA8T1NfMj4KKyAgICA8IS0tIFRoZSBmaWVsZHMgJ3VzRmlyc3RDaGFySW5kZXgnIGFuZCAndXNMYXN0Q2hhckluZGV4JworICAgICAgICAgd2lsbCBiZSByZWNhbGN1bGF0ZWQgYnkgdGhlIGNvbXBpbGVyIC0tPgorICAgIDx2ZXJzaW9uIHZhbHVlPSIzIi8+CisgICAgPHhBdmdDaGFyV2lkdGggdmFsdWU9IjU5NCIvPgorICAgIDx1c1dlaWdodENsYXNzIHZhbHVlPSI2MDAiLz4KKyAgICA8dXNXaWR0aENsYXNzIHZhbHVlPSI1Ii8+CisgICAgPGZzVHlwZSB2YWx1ZT0iMDAwMDAwMDAgMDAwMDEwMDAiLz4KKyAgICA8eVN1YnNjcmlwdFhTaXplIHZhbHVlPSI2NTAiLz4KKyAgICA8eVN1YnNjcmlwdFlTaXplIHZhbHVlPSI2MDAiLz4KKyAgICA8eVN1YnNjcmlwdFhPZmZzZXQgdmFsdWU9IjAiLz4KKyAgICA8eVN1YnNjcmlwdFlPZmZzZXQgdmFsdWU9Ijc1Ii8+CisgICAgPHlTdXBlcnNjcmlwdFhTaXplIHZhbHVlPSI2NTAiLz4KKyAgICA8eVN1cGVyc2NyaXB0WVNpemUgdmFsdWU9IjYwMCIvPgorICAgIDx5U3VwZXJzY3JpcHRYT2Zmc2V0IHZhbHVlPSIwIi8+CisgICAgPHlTdXBlcnNjcmlwdFlPZmZzZXQgdmFsdWU9IjM1MCIvPgorICAgIDx5U3RyaWtlb3V0U2l6ZSB2YWx1ZT0iNTAiLz4KKyAgICA8eVN0cmlrZW91dFBvc2l0aW9uIHZhbHVlPSIzMDAiLz4KKyAgICA8c0ZhbWlseUNsYXNzIHZhbHVlPSIwIi8+CisgICAgPHBhbm9zZT4KKyAgICAgIDxiRmFtaWx5VHlwZSB2YWx1ZT0iMCIvPgorICAgICAgPGJTZXJpZlN0eWxlIHZhbHVlPSIwIi8+CisgICAgICA8YldlaWdodCB2YWx1ZT0iNSIvPgorICAgICAgPGJQcm9wb3J0aW9uIHZhbHVlPSIwIi8+CisgICAgICA8YkNvbnRyYXN0IHZhbHVlPSIwIi8+CisgICAgICA8YlN0cm9rZVZhcmlhdGlvbiB2YWx1ZT0iMCIvPgorICAgICAgPGJBcm1TdHlsZSB2YWx1ZT0iMCIvPgorICAgICAgPGJMZXR0ZXJGb3JtIHZhbHVlPSIwIi8+CisgICAgICA8Yk1pZGxpbmUgdmFsdWU9IjAiLz4KKyAgICAgIDxiWEhlaWdodCB2YWx1ZT0iMCIvPgorICAgIDwvcGFub3NlPgorICAgIDx1bFVuaWNvZGVSYW5nZTEgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAxIi8+CisgICAgPHVsVW5pY29kZVJhbmdlMiB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAiLz4KKyAgICA8dWxVbmljb2RlUmFuZ2UzIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCIvPgorICAgIDx1bFVuaWNvZGVSYW5nZTQgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIi8+CisgICAgPGFjaFZlbmRJRCB2YWx1ZT0iVUtXTiIvPgorICAgIDxmc1NlbGVjdGlvbiB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDEiLz4KKyAgICA8dXNGaXJzdENoYXJJbmRleCB2YWx1ZT0iMzIiLz4KKyAgICA8dXNMYXN0Q2hhckluZGV4IHZhbHVlPSIxMjIiLz4KKyAgICA8c1R5cG9Bc2NlbmRlciB2YWx1ZT0iODAwIi8+CisgICAgPHNUeXBvRGVzY2VuZGVyIHZhbHVlPSItMjAwIi8+CisgICAgPHNUeXBvTGluZUdhcCB2YWx1ZT0iMjAwIi8+CisgICAgPHVzV2luQXNjZW50IHZhbHVlPSIxMDAwIi8+CisgICAgPHVzV2luRGVzY2VudCB2YWx1ZT0iMjAwIi8+CisgICAgPHVsQ29kZVBhZ2VSYW5nZTEgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAxIi8+CisgICAgPHVsQ29kZVBhZ2VSYW5nZTIgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIi8+CisgICAgPHN4SGVpZ2h0IHZhbHVlPSI1MDAiLz4KKyAgICA8c0NhcEhlaWdodCB2YWx1ZT0iNzAwIi8+CisgICAgPHVzRGVmYXVsdENoYXIgdmFsdWU9IjAiLz4KKyAgICA8dXNCcmVha0NoYXIgdmFsdWU9IjMyIi8+CisgICAgPHVzTWF4Q29udGV4dCB2YWx1ZT0iMCIvPgorICA8L09TXzI+CisKKyAgPGhtdHg+CisgICAgPG10eCBuYW1lPSIubm90ZGVmIiB3aWR0aD0iNTAwIiBsc2I9IjkzIi8+CisgICAgPG10eCBuYW1lPSIxZW0iIHdpZHRoPSIxMDAwIiBsc2I9IjkzIi8+CisgICAgPG10eCBuYW1lPSIzZW0iIHdpZHRoPSIzMDAwIiBsc2I9IjkzIi8+CisgIDwvaG10eD4KKworICA8Y21hcD4KKyAgICA8dGFibGVWZXJzaW9uIHZlcnNpb249IjAiLz4KKyAgICA8Y21hcF9mb3JtYXRfNCBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEwIiBsYW5ndWFnZT0iMCI+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDYxIiBuYW1lPSIxZW0iIC8+IDwhLS0gYSAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjIiIG5hbWU9IjFlbSIgLz4gPCEtLSBiIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2MyIgbmFtZT0iMWVtIiAvPiA8IS0tIGMgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDY0IiBuYW1lPSIxZW0iIC8+IDwhLS0gZCAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjUiIG5hbWU9IjFlbSIgLz4gPCEtLSBlIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2NiIgbmFtZT0iMWVtIiAvPiA8IS0tIGYgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDY3IiBuYW1lPSIxZW0iIC8+IDwhLS0gZyAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjgiIG5hbWU9IjFlbSIgLz4gPCEtLSBoIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2OSIgbmFtZT0iMWVtIiAvPiA8IS0tIGkgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDZBIiBuYW1lPSIxZW0iIC8+IDwhLS0gaiAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNkIiIG5hbWU9IjFlbSIgLz4gPCEtLSBrIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2QyIgbmFtZT0iM2VtIiAvPiA8IS0tIGwgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDZEIiBuYW1lPSIxZW0iIC8+IDwhLS0gbSAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNkUiIG5hbWU9IjFlbSIgLz4gPCEtLSBuIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2RiIgbmFtZT0iMWVtIiAvPiA8IS0tIG8gLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDcwIiBuYW1lPSIxZW0iIC8+IDwhLS0gcCAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzEiIG5hbWU9IjFlbSIgLz4gPCEtLSBxIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3MiIgbmFtZT0iMWVtIiAvPiA8IS0tIHIgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDczIiBuYW1lPSIxZW0iIC8+IDwhLS0gcyAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzQiIG5hbWU9IjFlbSIgLz4gPCEtLSB0IC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3NSIgbmFtZT0iMWVtIiAvPiA8IS0tIHUgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDc2IiBuYW1lPSIxZW0iIC8+IDwhLS0gdiAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzciIG5hbWU9IjFlbSIgLz4gPCEtLSB3IC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3OCIgbmFtZT0iMWVtIiAvPiA8IS0tIHggLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDc5IiBuYW1lPSIxZW0iIC8+IDwhLS0geSAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwN0EiIG5hbWU9IjFlbSIgLz4gPCEtLSB6IC0tPgorICAgIDwvY21hcF9mb3JtYXRfND4KKyAgPC9jbWFwPgorCisgIDxsb2NhPgorICAgIDwhLS0gVGhlICdsb2NhJyB0YWJsZSB3aWxsIGJlIGNhbGN1bGF0ZWQgYnkgdGhlIGNvbXBpbGVyIC0tPgorICA8L2xvY2E+CisKKyAgPGdseWY+CisgICAgPFRUR2x5cGggbmFtZT0iLm5vdGRlZiIgeE1pbj0iMCIgeU1pbj0iMCIgeE1heD0iMCIgeU1heD0iMCIgLz4KKyAgICA8VFRHbHlwaCBuYW1lPSIxZW0iIHhNaW49IjAiIHlNaW49IjAiIHhNYXg9IjAiIHlNYXg9IjAiIC8+CisgICAgPFRUR2x5cGggbmFtZT0iM2VtIiB4TWluPSIwIiB5TWluPSIwIiB4TWF4PSIwIiB5TWF4PSIwIiAvPgorICA8L2dseWY+CisKKyAgPG5hbWU+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSIwIiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAgICA8L25hbWVyZWNvcmQ+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSIxIiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgU2FtcGxlIEZvbnQKKyAgICA8L25hbWVyZWNvcmQ+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSIyIiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgUmVndWxhcgorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjQiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBTYW1wbGUgRm9udAorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjYiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBTYW1wbGVGb250LVJlZ3VsYXIKKyAgICA8L25hbWVyZWNvcmQ+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSIxMyIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUworICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAgICA8L25hbWVyZWNvcmQ+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSIxNCIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgIDwvbmFtZXJlY29yZD4KKyAgPC9uYW1lPgorCisgIDxwb3N0PgorICAgIDxmb3JtYXRUeXBlIHZhbHVlPSIzLjAiLz4KKyAgICA8aXRhbGljQW5nbGUgdmFsdWU9IjAuMCIvPgorICAgIDx1bmRlcmxpbmVQb3NpdGlvbiB2YWx1ZT0iLTc1Ii8+CisgICAgPHVuZGVybGluZVRoaWNrbmVzcyB2YWx1ZT0iNTAiLz4KKyAgICA8aXNGaXhlZFBpdGNoIHZhbHVlPSIwIi8+CisgICAgPG1pbk1lbVR5cGU0MiB2YWx1ZT0iMCIvPgorICAgIDxtYXhNZW1UeXBlNDIgdmFsdWU9IjAiLz4KKyAgICA8bWluTWVtVHlwZTEgdmFsdWU9IjAiLz4KKyAgICA8bWF4TWVtVHlwZTEgdmFsdWU9IjAiLz4KKyAgPC9wb3N0PgorCis8L3R0Rm9udD4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9hc3NldHMvZm9udF9zb3VyY2UvYXNjaWlfbTNlbV93ZWlnaHQ3MDBfdXByaWdodC50dHggYi90ZXN0cy90ZXN0cy93aWRnZXQvYXNzZXRzL2ZvbnRfc291cmNlL2FzY2lpX20zZW1fd2VpZ2h0NzAwX3VwcmlnaHQudHR4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2Njc1NjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy93aWRnZXQvYXNzZXRzL2ZvbnRfc291cmNlL2FzY2lpX20zZW1fd2VpZ2h0NzAwX3VwcmlnaHQudHR4CkBAIC0wLDAgKzEsMjA4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8dHRGb250IHNmbnRWZXJzaW9uPSJceDAwXHgwMVx4MDBceDAwIiB0dExpYlZlcnNpb249IjMuMCI+CisKKyAgPEdseXBoT3JkZXI+CisgICAgPEdseXBoSUQgaWQ9IjAiIG5hbWU9Ii5ub3RkZWYiLz4KKyAgICA8R2x5cGhJRCBpZD0iMSIgbmFtZT0iMWVtIi8+CisgICAgPEdseXBoSUQgaWQ9IjIiIG5hbWU9IjNlbSIvPgorICA8L0dseXBoT3JkZXI+CisKKyAgPGhlYWQ+CisgICAgPHRhYmxlVmVyc2lvbiB2YWx1ZT0iMS4wIi8+CisgICAgPGZvbnRSZXZpc2lvbiB2YWx1ZT0iMS4wIi8+CisgICAgPGNoZWNrU3VtQWRqdXN0bWVudCB2YWx1ZT0iMHg2NDBjZGIyZiIvPgorICAgIDxtYWdpY051bWJlciB2YWx1ZT0iMHg1ZjBmM2NmNSIvPgorICAgIDxmbGFncyB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMTEiLz4KKyAgICA8dW5pdHNQZXJFbSB2YWx1ZT0iMTAwMCIvPgorICAgIDxjcmVhdGVkIHZhbHVlPSJUaHUgRmViIDIyIDEwOjA0OjMwIDIwMTgiLz4KKyAgICA8bWFjU3R5bGUgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIi8+CisgICAgPGxvd2VzdFJlY1BQRU0gdmFsdWU9IjciLz4KKyAgICA8Zm9udERpcmVjdGlvbkhpbnQgdmFsdWU9IjIiLz4KKyAgICA8Z2x5cGhEYXRhRm9ybWF0IHZhbHVlPSIwIi8+CisgIDwvaGVhZD4KKworICA8aGhlYT4KKyAgICA8dGFibGVWZXJzaW9uIHZhbHVlPSIweDAwMDEwMDAwIi8+CisgICAgPGFzY2VudCB2YWx1ZT0iMTAwMCIvPgorICAgIDxkZXNjZW50IHZhbHVlPSItMjAwIi8+CisgICAgPGxpbmVHYXAgdmFsdWU9IjAiLz4KKyAgICA8Y2FyZXRTbG9wZVJpc2UgdmFsdWU9IjEiLz4KKyAgICA8Y2FyZXRTbG9wZVJ1biB2YWx1ZT0iMCIvPgorICAgIDxjYXJldE9mZnNldCB2YWx1ZT0iMCIvPgorICAgIDxyZXNlcnZlZDAgdmFsdWU9IjAiLz4KKyAgICA8cmVzZXJ2ZWQxIHZhbHVlPSIwIi8+CisgICAgPHJlc2VydmVkMiB2YWx1ZT0iMCIvPgorICAgIDxyZXNlcnZlZDMgdmFsdWU9IjAiLz4KKyAgICA8bWV0cmljRGF0YUZvcm1hdCB2YWx1ZT0iMCIvPgorICA8L2hoZWE+CisKKyAgPG1heHA+CisgICAgPHRhYmxlVmVyc2lvbiB2YWx1ZT0iMHgxMDAwMCIvPgorICAgIDxtYXhab25lcyB2YWx1ZT0iMCIvPgorICAgIDxtYXhUd2lsaWdodFBvaW50cyB2YWx1ZT0iMCIvPgorICAgIDxtYXhTdG9yYWdlIHZhbHVlPSIwIi8+CisgICAgPG1heEZ1bmN0aW9uRGVmcyB2YWx1ZT0iMCIvPgorICAgIDxtYXhJbnN0cnVjdGlvbkRlZnMgdmFsdWU9IjAiLz4KKyAgICA8bWF4U3RhY2tFbGVtZW50cyB2YWx1ZT0iMCIvPgorICAgIDxtYXhTaXplT2ZJbnN0cnVjdGlvbnMgdmFsdWU9IjAiLz4KKyAgICA8bWF4Q29tcG9uZW50RWxlbWVudHMgdmFsdWU9IjAiLz4KKyAgPC9tYXhwPgorCisgIDxPU18yPgorICAgIDwhLS0gVGhlIGZpZWxkcyAndXNGaXJzdENoYXJJbmRleCcgYW5kICd1c0xhc3RDaGFySW5kZXgnCisgICAgICAgICB3aWxsIGJlIHJlY2FsY3VsYXRlZCBieSB0aGUgY29tcGlsZXIgLS0+CisgICAgPHZlcnNpb24gdmFsdWU9IjMiLz4KKyAgICA8eEF2Z0NoYXJXaWR0aCB2YWx1ZT0iNTk0Ii8+CisgICAgPHVzV2VpZ2h0Q2xhc3MgdmFsdWU9IjcwMCIvPgorICAgIDx1c1dpZHRoQ2xhc3MgdmFsdWU9IjUiLz4KKyAgICA8ZnNUeXBlIHZhbHVlPSIwMDAwMDAwMCAwMDAwMTAwMCIvPgorICAgIDx5U3Vic2NyaXB0WFNpemUgdmFsdWU9IjY1MCIvPgorICAgIDx5U3Vic2NyaXB0WVNpemUgdmFsdWU9IjYwMCIvPgorICAgIDx5U3Vic2NyaXB0WE9mZnNldCB2YWx1ZT0iMCIvPgorICAgIDx5U3Vic2NyaXB0WU9mZnNldCB2YWx1ZT0iNzUiLz4KKyAgICA8eVN1cGVyc2NyaXB0WFNpemUgdmFsdWU9IjY1MCIvPgorICAgIDx5U3VwZXJzY3JpcHRZU2l6ZSB2YWx1ZT0iNjAwIi8+CisgICAgPHlTdXBlcnNjcmlwdFhPZmZzZXQgdmFsdWU9IjAiLz4KKyAgICA8eVN1cGVyc2NyaXB0WU9mZnNldCB2YWx1ZT0iMzUwIi8+CisgICAgPHlTdHJpa2VvdXRTaXplIHZhbHVlPSI1MCIvPgorICAgIDx5U3RyaWtlb3V0UG9zaXRpb24gdmFsdWU9IjMwMCIvPgorICAgIDxzRmFtaWx5Q2xhc3MgdmFsdWU9IjAiLz4KKyAgICA8cGFub3NlPgorICAgICAgPGJGYW1pbHlUeXBlIHZhbHVlPSIwIi8+CisgICAgICA8YlNlcmlmU3R5bGUgdmFsdWU9IjAiLz4KKyAgICAgIDxiV2VpZ2h0IHZhbHVlPSI1Ii8+CisgICAgICA8YlByb3BvcnRpb24gdmFsdWU9IjAiLz4KKyAgICAgIDxiQ29udHJhc3QgdmFsdWU9IjAiLz4KKyAgICAgIDxiU3Ryb2tlVmFyaWF0aW9uIHZhbHVlPSIwIi8+CisgICAgICA8YkFybVN0eWxlIHZhbHVlPSIwIi8+CisgICAgICA8YkxldHRlckZvcm0gdmFsdWU9IjAiLz4KKyAgICAgIDxiTWlkbGluZSB2YWx1ZT0iMCIvPgorICAgICAgPGJYSGVpZ2h0IHZhbHVlPSIwIi8+CisgICAgPC9wYW5vc2U+CisgICAgPHVsVW5pY29kZVJhbmdlMSB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDEiLz4KKyAgICA8dWxVbmljb2RlUmFuZ2UyIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCIvPgorICAgIDx1bFVuaWNvZGVSYW5nZTMgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIi8+CisgICAgPHVsVW5pY29kZVJhbmdlNCB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAiLz4KKyAgICA8YWNoVmVuZElEIHZhbHVlPSJVS1dOIi8+CisgICAgPGZzU2VsZWN0aW9uIHZhbHVlPSIwMDAwMDAwMCAwMTAwMDAwMCIvPgorICAgIDx1c0ZpcnN0Q2hhckluZGV4IHZhbHVlPSIzMiIvPgorICAgIDx1c0xhc3RDaGFySW5kZXggdmFsdWU9IjEyMiIvPgorICAgIDxzVHlwb0FzY2VuZGVyIHZhbHVlPSI4MDAiLz4KKyAgICA8c1R5cG9EZXNjZW5kZXIgdmFsdWU9Ii0yMDAiLz4KKyAgICA8c1R5cG9MaW5lR2FwIHZhbHVlPSIyMDAiLz4KKyAgICA8dXNXaW5Bc2NlbnQgdmFsdWU9IjEwMDAiLz4KKyAgICA8dXNXaW5EZXNjZW50IHZhbHVlPSIyMDAiLz4KKyAgICA8dWxDb2RlUGFnZVJhbmdlMSB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDEiLz4KKyAgICA8dWxDb2RlUGFnZVJhbmdlMiB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAiLz4KKyAgICA8c3hIZWlnaHQgdmFsdWU9IjUwMCIvPgorICAgIDxzQ2FwSGVpZ2h0IHZhbHVlPSI3MDAiLz4KKyAgICA8dXNEZWZhdWx0Q2hhciB2YWx1ZT0iMCIvPgorICAgIDx1c0JyZWFrQ2hhciB2YWx1ZT0iMzIiLz4KKyAgICA8dXNNYXhDb250ZXh0IHZhbHVlPSIwIi8+CisgIDwvT1NfMj4KKworICA8aG10eD4KKyAgICA8bXR4IG5hbWU9Ii5ub3RkZWYiIHdpZHRoPSI1MDAiIGxzYj0iOTMiLz4KKyAgICA8bXR4IG5hbWU9IjFlbSIgd2lkdGg9IjEwMDAiIGxzYj0iOTMiLz4KKyAgICA8bXR4IG5hbWU9IjNlbSIgd2lkdGg9IjMwMDAiIGxzYj0iOTMiLz4KKyAgPC9obXR4PgorCisgIDxjbWFwPgorICAgIDx0YWJsZVZlcnNpb24gdmVyc2lvbj0iMCIvPgorICAgIDxjbWFwX2Zvcm1hdF80IHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMTAiIGxhbmd1YWdlPSIwIj4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjEiIG5hbWU9IjFlbSIgLz4gPCEtLSBhIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2MiIgbmFtZT0iMWVtIiAvPiA8IS0tIGIgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDYzIiBuYW1lPSIxZW0iIC8+IDwhLS0gYyAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjQiIG5hbWU9IjFlbSIgLz4gPCEtLSBkIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2NSIgbmFtZT0iMWVtIiAvPiA8IS0tIGUgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDY2IiBuYW1lPSIxZW0iIC8+IDwhLS0gZiAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjciIG5hbWU9IjFlbSIgLz4gPCEtLSBnIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2OCIgbmFtZT0iMWVtIiAvPiA8IS0tIGggLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDY5IiBuYW1lPSIxZW0iIC8+IDwhLS0gaSAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNkEiIG5hbWU9IjFlbSIgLz4gPCEtLSBqIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2QiIgbmFtZT0iMWVtIiAvPiA8IS0tIGsgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDZDIiBuYW1lPSIxZW0iIC8+IDwhLS0gbCAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNkQiIG5hbWU9IjNlbSIgLz4gPCEtLSBtIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2RSIgbmFtZT0iMWVtIiAvPiA8IS0tIG4gLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDZGIiBuYW1lPSIxZW0iIC8+IDwhLS0gbyAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzAiIG5hbWU9IjFlbSIgLz4gPCEtLSBwIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3MSIgbmFtZT0iMWVtIiAvPiA8IS0tIHEgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDcyIiBuYW1lPSIxZW0iIC8+IDwhLS0gciAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzMiIG5hbWU9IjFlbSIgLz4gPCEtLSBzIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3NCIgbmFtZT0iMWVtIiAvPiA8IS0tIHQgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDc1IiBuYW1lPSIxZW0iIC8+IDwhLS0gdSAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzYiIG5hbWU9IjFlbSIgLz4gPCEtLSB2IC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3NyIgbmFtZT0iMWVtIiAvPiA8IS0tIHcgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDc4IiBuYW1lPSIxZW0iIC8+IDwhLS0geCAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzkiIG5hbWU9IjFlbSIgLz4gPCEtLSB5IC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3QSIgbmFtZT0iMWVtIiAvPiA8IS0tIHogLS0+CisgICAgPC9jbWFwX2Zvcm1hdF80PgorICA8L2NtYXA+CisKKyAgPGxvY2E+CisgICAgPCEtLSBUaGUgJ2xvY2EnIHRhYmxlIHdpbGwgYmUgY2FsY3VsYXRlZCBieSB0aGUgY29tcGlsZXIgLS0+CisgIDwvbG9jYT4KKworICA8Z2x5Zj4KKyAgICA8VFRHbHlwaCBuYW1lPSIubm90ZGVmIiB4TWluPSIwIiB5TWluPSIwIiB4TWF4PSIwIiB5TWF4PSIwIiAvPgorICAgIDxUVEdseXBoIG5hbWU9IjFlbSIgeE1pbj0iMCIgeU1pbj0iMCIgeE1heD0iMCIgeU1heD0iMCIgLz4KKyAgICA8VFRHbHlwaCBuYW1lPSIzZW0iIHhNaW49IjAiIHlNaW49IjAiIHhNYXg9IjAiIHlNYXg9IjAiIC8+CisgIDwvZ2x5Zj4KKworICA8bmFtZT4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjAiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjEiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBTYW1wbGUgRm9udAorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjIiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBSZWd1bGFyCisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iNCIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIFNhbXBsZSBGb250CisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iNiIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIFNhbXBsZUZvbnQtUmVndWxhcgorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjEzIiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjE0IiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgPC9uYW1lcmVjb3JkPgorICA8L25hbWU+CisKKyAgPHBvc3Q+CisgICAgPGZvcm1hdFR5cGUgdmFsdWU9IjMuMCIvPgorICAgIDxpdGFsaWNBbmdsZSB2YWx1ZT0iMC4wIi8+CisgICAgPHVuZGVybGluZVBvc2l0aW9uIHZhbHVlPSItNzUiLz4KKyAgICA8dW5kZXJsaW5lVGhpY2tuZXNzIHZhbHVlPSI1MCIvPgorICAgIDxpc0ZpeGVkUGl0Y2ggdmFsdWU9IjAiLz4KKyAgICA8bWluTWVtVHlwZTQyIHZhbHVlPSIwIi8+CisgICAgPG1heE1lbVR5cGU0MiB2YWx1ZT0iMCIvPgorICAgIDxtaW5NZW1UeXBlMSB2YWx1ZT0iMCIvPgorICAgIDxtYXhNZW1UeXBlMSB2YWx1ZT0iMCIvPgorICA8L3Bvc3Q+CisKKzwvdHRGb250PgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L2Fzc2V0cy9mb250X3NvdXJjZS9hc2NpaV9uM2VtX3dlaWdodDcwMF9pdGFsaWMudHR4IGIvdGVzdHMvdGVzdHMvd2lkZ2V0L2Fzc2V0cy9mb250X3NvdXJjZS9hc2NpaV9uM2VtX3dlaWdodDcwMF9pdGFsaWMudHR4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMjNiOGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy93aWRnZXQvYXNzZXRzL2ZvbnRfc291cmNlL2FzY2lpX24zZW1fd2VpZ2h0NzAwX2l0YWxpYy50dHgKQEAgLTAsMCArMSwyMDggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzx0dEZvbnQgc2ZudFZlcnNpb249Ilx4MDBceDAxXHgwMFx4MDAiIHR0TGliVmVyc2lvbj0iMy4wIj4KKworICA8R2x5cGhPcmRlcj4KKyAgICA8R2x5cGhJRCBpZD0iMCIgbmFtZT0iLm5vdGRlZiIvPgorICAgIDxHbHlwaElEIGlkPSIxIiBuYW1lPSIxZW0iLz4KKyAgICA8R2x5cGhJRCBpZD0iMiIgbmFtZT0iM2VtIi8+CisgIDwvR2x5cGhPcmRlcj4KKworICA8aGVhZD4KKyAgICA8dGFibGVWZXJzaW9uIHZhbHVlPSIxLjAiLz4KKyAgICA8Zm9udFJldmlzaW9uIHZhbHVlPSIxLjAiLz4KKyAgICA8Y2hlY2tTdW1BZGp1c3RtZW50IHZhbHVlPSIweDY0MGNkYjJmIi8+CisgICAgPG1hZ2ljTnVtYmVyIHZhbHVlPSIweDVmMGYzY2Y1Ii8+CisgICAgPGZsYWdzIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAxMSIvPgorICAgIDx1bml0c1BlckVtIHZhbHVlPSIxMDAwIi8+CisgICAgPGNyZWF0ZWQgdmFsdWU9IlRodSBGZWIgMjIgMTA6MDQ6MzAgMjAxOCIvPgorICAgIDxtYWNTdHlsZSB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMTAiLz4KKyAgICA8bG93ZXN0UmVjUFBFTSB2YWx1ZT0iNyIvPgorICAgIDxmb250RGlyZWN0aW9uSGludCB2YWx1ZT0iMiIvPgorICAgIDxnbHlwaERhdGFGb3JtYXQgdmFsdWU9IjAiLz4KKyAgPC9oZWFkPgorCisgIDxoaGVhPgorICAgIDx0YWJsZVZlcnNpb24gdmFsdWU9IjB4MDAwMTAwMDAiLz4KKyAgICA8YXNjZW50IHZhbHVlPSIxMDAwIi8+CisgICAgPGRlc2NlbnQgdmFsdWU9Ii0yMDAiLz4KKyAgICA8bGluZUdhcCB2YWx1ZT0iMCIvPgorICAgIDxjYXJldFNsb3BlUmlzZSB2YWx1ZT0iMSIvPgorICAgIDxjYXJldFNsb3BlUnVuIHZhbHVlPSIwIi8+CisgICAgPGNhcmV0T2Zmc2V0IHZhbHVlPSIwIi8+CisgICAgPHJlc2VydmVkMCB2YWx1ZT0iMCIvPgorICAgIDxyZXNlcnZlZDEgdmFsdWU9IjAiLz4KKyAgICA8cmVzZXJ2ZWQyIHZhbHVlPSIwIi8+CisgICAgPHJlc2VydmVkMyB2YWx1ZT0iMCIvPgorICAgIDxtZXRyaWNEYXRhRm9ybWF0IHZhbHVlPSIwIi8+CisgIDwvaGhlYT4KKworICA8bWF4cD4KKyAgICA8dGFibGVWZXJzaW9uIHZhbHVlPSIweDEwMDAwIi8+CisgICAgPG1heFpvbmVzIHZhbHVlPSIwIi8+CisgICAgPG1heFR3aWxpZ2h0UG9pbnRzIHZhbHVlPSIwIi8+CisgICAgPG1heFN0b3JhZ2UgdmFsdWU9IjAiLz4KKyAgICA8bWF4RnVuY3Rpb25EZWZzIHZhbHVlPSIwIi8+CisgICAgPG1heEluc3RydWN0aW9uRGVmcyB2YWx1ZT0iMCIvPgorICAgIDxtYXhTdGFja0VsZW1lbnRzIHZhbHVlPSIwIi8+CisgICAgPG1heFNpemVPZkluc3RydWN0aW9ucyB2YWx1ZT0iMCIvPgorICAgIDxtYXhDb21wb25lbnRFbGVtZW50cyB2YWx1ZT0iMCIvPgorICA8L21heHA+CisKKyAgPE9TXzI+CisgICAgPCEtLSBUaGUgZmllbGRzICd1c0ZpcnN0Q2hhckluZGV4JyBhbmQgJ3VzTGFzdENoYXJJbmRleCcKKyAgICAgICAgIHdpbGwgYmUgcmVjYWxjdWxhdGVkIGJ5IHRoZSBjb21waWxlciAtLT4KKyAgICA8dmVyc2lvbiB2YWx1ZT0iMyIvPgorICAgIDx4QXZnQ2hhcldpZHRoIHZhbHVlPSI1OTQiLz4KKyAgICA8dXNXZWlnaHRDbGFzcyB2YWx1ZT0iNzAwIi8+CisgICAgPHVzV2lkdGhDbGFzcyB2YWx1ZT0iNSIvPgorICAgIDxmc1R5cGUgdmFsdWU9IjAwMDAwMDAwIDAwMDAxMDAwIi8+CisgICAgPHlTdWJzY3JpcHRYU2l6ZSB2YWx1ZT0iNjUwIi8+CisgICAgPHlTdWJzY3JpcHRZU2l6ZSB2YWx1ZT0iNjAwIi8+CisgICAgPHlTdWJzY3JpcHRYT2Zmc2V0IHZhbHVlPSIwIi8+CisgICAgPHlTdWJzY3JpcHRZT2Zmc2V0IHZhbHVlPSI3NSIvPgorICAgIDx5U3VwZXJzY3JpcHRYU2l6ZSB2YWx1ZT0iNjUwIi8+CisgICAgPHlTdXBlcnNjcmlwdFlTaXplIHZhbHVlPSI2MDAiLz4KKyAgICA8eVN1cGVyc2NyaXB0WE9mZnNldCB2YWx1ZT0iMCIvPgorICAgIDx5U3VwZXJzY3JpcHRZT2Zmc2V0IHZhbHVlPSIzNTAiLz4KKyAgICA8eVN0cmlrZW91dFNpemUgdmFsdWU9IjUwIi8+CisgICAgPHlTdHJpa2VvdXRQb3NpdGlvbiB2YWx1ZT0iMzAwIi8+CisgICAgPHNGYW1pbHlDbGFzcyB2YWx1ZT0iMCIvPgorICAgIDxwYW5vc2U+CisgICAgICA8YkZhbWlseVR5cGUgdmFsdWU9IjAiLz4KKyAgICAgIDxiU2VyaWZTdHlsZSB2YWx1ZT0iMCIvPgorICAgICAgPGJXZWlnaHQgdmFsdWU9IjUiLz4KKyAgICAgIDxiUHJvcG9ydGlvbiB2YWx1ZT0iMCIvPgorICAgICAgPGJDb250cmFzdCB2YWx1ZT0iMCIvPgorICAgICAgPGJTdHJva2VWYXJpYXRpb24gdmFsdWU9IjAiLz4KKyAgICAgIDxiQXJtU3R5bGUgdmFsdWU9IjAiLz4KKyAgICAgIDxiTGV0dGVyRm9ybSB2YWx1ZT0iMCIvPgorICAgICAgPGJNaWRsaW5lIHZhbHVlPSIwIi8+CisgICAgICA8YlhIZWlnaHQgdmFsdWU9IjAiLz4KKyAgICA8L3Bhbm9zZT4KKyAgICA8dWxVbmljb2RlUmFuZ2UxIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMSIvPgorICAgIDx1bFVuaWNvZGVSYW5nZTIgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIi8+CisgICAgPHVsVW5pY29kZVJhbmdlMyB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAiLz4KKyAgICA8dWxVbmljb2RlUmFuZ2U0IHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCIvPgorICAgIDxhY2hWZW5kSUQgdmFsdWU9IlVLV04iLz4KKyAgICA8ZnNTZWxlY3Rpb24gdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAxIi8+CisgICAgPHVzRmlyc3RDaGFySW5kZXggdmFsdWU9IjMyIi8+CisgICAgPHVzTGFzdENoYXJJbmRleCB2YWx1ZT0iMTIyIi8+CisgICAgPHNUeXBvQXNjZW5kZXIgdmFsdWU9IjgwMCIvPgorICAgIDxzVHlwb0Rlc2NlbmRlciB2YWx1ZT0iLTIwMCIvPgorICAgIDxzVHlwb0xpbmVHYXAgdmFsdWU9IjIwMCIvPgorICAgIDx1c1dpbkFzY2VudCB2YWx1ZT0iMTAwMCIvPgorICAgIDx1c1dpbkRlc2NlbnQgdmFsdWU9IjIwMCIvPgorICAgIDx1bENvZGVQYWdlUmFuZ2UxIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMSIvPgorICAgIDx1bENvZGVQYWdlUmFuZ2UyIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCIvPgorICAgIDxzeEhlaWdodCB2YWx1ZT0iNTAwIi8+CisgICAgPHNDYXBIZWlnaHQgdmFsdWU9IjcwMCIvPgorICAgIDx1c0RlZmF1bHRDaGFyIHZhbHVlPSIwIi8+CisgICAgPHVzQnJlYWtDaGFyIHZhbHVlPSIzMiIvPgorICAgIDx1c01heENvbnRleHQgdmFsdWU9IjAiLz4KKyAgPC9PU18yPgorCisgIDxobXR4PgorICAgIDxtdHggbmFtZT0iLm5vdGRlZiIgd2lkdGg9IjUwMCIgbHNiPSI5MyIvPgorICAgIDxtdHggbmFtZT0iMWVtIiB3aWR0aD0iMTAwMCIgbHNiPSI5MyIvPgorICAgIDxtdHggbmFtZT0iM2VtIiB3aWR0aD0iMzAwMCIgbHNiPSI5MyIvPgorICA8L2htdHg+CisKKyAgPGNtYXA+CisgICAgPHRhYmxlVmVyc2lvbiB2ZXJzaW9uPSIwIi8+CisgICAgPGNtYXBfZm9ybWF0XzQgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxMCIgbGFuZ3VhZ2U9IjAiPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2MSIgbmFtZT0iMWVtIiAvPiA8IS0tIGEgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDYyIiBuYW1lPSIxZW0iIC8+IDwhLS0gYiAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjMiIG5hbWU9IjFlbSIgLz4gPCEtLSBjIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2NCIgbmFtZT0iMWVtIiAvPiA8IS0tIGQgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDY1IiBuYW1lPSIxZW0iIC8+IDwhLS0gZSAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjYiIG5hbWU9IjFlbSIgLz4gPCEtLSBmIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2NyIgbmFtZT0iMWVtIiAvPiA8IS0tIGcgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDY4IiBuYW1lPSIxZW0iIC8+IDwhLS0gaCAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjkiIG5hbWU9IjFlbSIgLz4gPCEtLSBpIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2QSIgbmFtZT0iMWVtIiAvPiA8IS0tIGogLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDZCIiBuYW1lPSIxZW0iIC8+IDwhLS0gayAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNkMiIG5hbWU9IjFlbSIgLz4gPCEtLSBsIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2RCIgbmFtZT0iMWVtIiAvPiA8IS0tIG0gLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDZFIiBuYW1lPSIzZW0iIC8+IDwhLS0gbiAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNkYiIG5hbWU9IjFlbSIgLz4gPCEtLSBvIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3MCIgbmFtZT0iMWVtIiAvPiA8IS0tIHAgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDcxIiBuYW1lPSIxZW0iIC8+IDwhLS0gcSAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzIiIG5hbWU9IjFlbSIgLz4gPCEtLSByIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3MyIgbmFtZT0iMWVtIiAvPiA8IS0tIHMgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDc0IiBuYW1lPSIxZW0iIC8+IDwhLS0gdCAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzUiIG5hbWU9IjFlbSIgLz4gPCEtLSB1IC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3NiIgbmFtZT0iMWVtIiAvPiA8IS0tIHYgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDc3IiBuYW1lPSIxZW0iIC8+IDwhLS0gdyAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzgiIG5hbWU9IjFlbSIgLz4gPCEtLSB4IC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3OSIgbmFtZT0iMWVtIiAvPiA8IS0tIHkgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDdBIiBuYW1lPSIxZW0iIC8+IDwhLS0geiAtLT4KKyAgICA8L2NtYXBfZm9ybWF0XzQ+CisgIDwvY21hcD4KKworICA8bG9jYT4KKyAgICA8IS0tIFRoZSAnbG9jYScgdGFibGUgd2lsbCBiZSBjYWxjdWxhdGVkIGJ5IHRoZSBjb21waWxlciAtLT4KKyAgPC9sb2NhPgorCisgIDxnbHlmPgorICAgIDxUVEdseXBoIG5hbWU9Ii5ub3RkZWYiIHhNaW49IjAiIHlNaW49IjAiIHhNYXg9IjAiIHlNYXg9IjAiIC8+CisgICAgPFRUR2x5cGggbmFtZT0iMWVtIiB4TWluPSIwIiB5TWluPSIwIiB4TWF4PSIwIiB5TWF4PSIwIiAvPgorICAgIDxUVEdseXBoIG5hbWU9IjNlbSIgeE1pbj0iMCIgeU1pbj0iMCIgeE1heD0iMCIgeU1heD0iMCIgLz4KKyAgPC9nbHlmPgorCisgIDxuYW1lPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iMCIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iMSIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIFNhbXBsZSBGb250CisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iMiIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIFJlZ3VsYXIKKyAgICA8L25hbWVyZWNvcmQ+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSI0IiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgU2FtcGxlIEZvbnQKKyAgICA8L25hbWVyZWNvcmQ+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSI2IiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgU2FtcGxlRm9udC1SZWd1bGFyCisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iMTMiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iMTQiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICA8L25hbWVyZWNvcmQ+CisgIDwvbmFtZT4KKworICA8cG9zdD4KKyAgICA8Zm9ybWF0VHlwZSB2YWx1ZT0iMy4wIi8+CisgICAgPGl0YWxpY0FuZ2xlIHZhbHVlPSIwLjAiLz4KKyAgICA8dW5kZXJsaW5lUG9zaXRpb24gdmFsdWU9Ii03NSIvPgorICAgIDx1bmRlcmxpbmVUaGlja25lc3MgdmFsdWU9IjUwIi8+CisgICAgPGlzRml4ZWRQaXRjaCB2YWx1ZT0iMCIvPgorICAgIDxtaW5NZW1UeXBlNDIgdmFsdWU9IjAiLz4KKyAgICA8bWF4TWVtVHlwZTQyIHZhbHVlPSIwIi8+CisgICAgPG1pbk1lbVR5cGUxIHZhbHVlPSIwIi8+CisgICAgPG1heE1lbVR5cGUxIHZhbHVlPSIwIi8+CisgIDwvcG9zdD4KKworPC90dEZvbnQ+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy93aWRnZXQvYXNzZXRzL2ZvbnRfc291cmNlL2FzY2lpX28zZW1fd2VpZ2h0ODAwX3VwcmlnaHQudHR4IGIvdGVzdHMvdGVzdHMvd2lkZ2V0L2Fzc2V0cy9mb250X3NvdXJjZS9hc2NpaV9vM2VtX3dlaWdodDgwMF91cHJpZ2h0LnR0eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTY5NWVkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L2Fzc2V0cy9mb250X3NvdXJjZS9hc2NpaV9vM2VtX3dlaWdodDgwMF91cHJpZ2h0LnR0eApAQCAtMCwwICsxLDIwOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUworICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHR0Rm9udCBzZm50VmVyc2lvbj0iXHgwMFx4MDFceDAwXHgwMCIgdHRMaWJWZXJzaW9uPSIzLjAiPgorCisgIDxHbHlwaE9yZGVyPgorICAgIDxHbHlwaElEIGlkPSIwIiBuYW1lPSIubm90ZGVmIi8+CisgICAgPEdseXBoSUQgaWQ9IjEiIG5hbWU9IjFlbSIvPgorICAgIDxHbHlwaElEIGlkPSIyIiBuYW1lPSIzZW0iLz4KKyAgPC9HbHlwaE9yZGVyPgorCisgIDxoZWFkPgorICAgIDx0YWJsZVZlcnNpb24gdmFsdWU9IjEuMCIvPgorICAgIDxmb250UmV2aXNpb24gdmFsdWU9IjEuMCIvPgorICAgIDxjaGVja1N1bUFkanVzdG1lbnQgdmFsdWU9IjB4NjQwY2RiMmYiLz4KKyAgICA8bWFnaWNOdW1iZXIgdmFsdWU9IjB4NWYwZjNjZjUiLz4KKyAgICA8ZmxhZ3MgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDExIi8+CisgICAgPHVuaXRzUGVyRW0gdmFsdWU9IjEwMDAiLz4KKyAgICA8Y3JlYXRlZCB2YWx1ZT0iVGh1IEZlYiAyMiAxMDowNDozMCAyMDE4Ii8+CisgICAgPG1hY1N0eWxlIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMCIvPgorICAgIDxsb3dlc3RSZWNQUEVNIHZhbHVlPSI3Ii8+CisgICAgPGZvbnREaXJlY3Rpb25IaW50IHZhbHVlPSIyIi8+CisgICAgPGdseXBoRGF0YUZvcm1hdCB2YWx1ZT0iMCIvPgorICA8L2hlYWQ+CisKKyAgPGhoZWE+CisgICAgPHRhYmxlVmVyc2lvbiB2YWx1ZT0iMHgwMDAxMDAwMCIvPgorICAgIDxhc2NlbnQgdmFsdWU9IjEwMDAiLz4KKyAgICA8ZGVzY2VudCB2YWx1ZT0iLTIwMCIvPgorICAgIDxsaW5lR2FwIHZhbHVlPSIwIi8+CisgICAgPGNhcmV0U2xvcGVSaXNlIHZhbHVlPSIxIi8+CisgICAgPGNhcmV0U2xvcGVSdW4gdmFsdWU9IjAiLz4KKyAgICA8Y2FyZXRPZmZzZXQgdmFsdWU9IjAiLz4KKyAgICA8cmVzZXJ2ZWQwIHZhbHVlPSIwIi8+CisgICAgPHJlc2VydmVkMSB2YWx1ZT0iMCIvPgorICAgIDxyZXNlcnZlZDIgdmFsdWU9IjAiLz4KKyAgICA8cmVzZXJ2ZWQzIHZhbHVlPSIwIi8+CisgICAgPG1ldHJpY0RhdGFGb3JtYXQgdmFsdWU9IjAiLz4KKyAgPC9oaGVhPgorCisgIDxtYXhwPgorICAgIDx0YWJsZVZlcnNpb24gdmFsdWU9IjB4MTAwMDAiLz4KKyAgICA8bWF4Wm9uZXMgdmFsdWU9IjAiLz4KKyAgICA8bWF4VHdpbGlnaHRQb2ludHMgdmFsdWU9IjAiLz4KKyAgICA8bWF4U3RvcmFnZSB2YWx1ZT0iMCIvPgorICAgIDxtYXhGdW5jdGlvbkRlZnMgdmFsdWU9IjAiLz4KKyAgICA8bWF4SW5zdHJ1Y3Rpb25EZWZzIHZhbHVlPSIwIi8+CisgICAgPG1heFN0YWNrRWxlbWVudHMgdmFsdWU9IjAiLz4KKyAgICA8bWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zIHZhbHVlPSIwIi8+CisgICAgPG1heENvbXBvbmVudEVsZW1lbnRzIHZhbHVlPSIwIi8+CisgIDwvbWF4cD4KKworICA8T1NfMj4KKyAgICA8IS0tIFRoZSBmaWVsZHMgJ3VzRmlyc3RDaGFySW5kZXgnIGFuZCAndXNMYXN0Q2hhckluZGV4JworICAgICAgICAgd2lsbCBiZSByZWNhbGN1bGF0ZWQgYnkgdGhlIGNvbXBpbGVyIC0tPgorICAgIDx2ZXJzaW9uIHZhbHVlPSIzIi8+CisgICAgPHhBdmdDaGFyV2lkdGggdmFsdWU9IjU5NCIvPgorICAgIDx1c1dlaWdodENsYXNzIHZhbHVlPSI4MDAiLz4KKyAgICA8dXNXaWR0aENsYXNzIHZhbHVlPSI1Ii8+CisgICAgPGZzVHlwZSB2YWx1ZT0iMDAwMDAwMDAgMDAwMDEwMDAiLz4KKyAgICA8eVN1YnNjcmlwdFhTaXplIHZhbHVlPSI2NTAiLz4KKyAgICA8eVN1YnNjcmlwdFlTaXplIHZhbHVlPSI2MDAiLz4KKyAgICA8eVN1YnNjcmlwdFhPZmZzZXQgdmFsdWU9IjAiLz4KKyAgICA8eVN1YnNjcmlwdFlPZmZzZXQgdmFsdWU9Ijc1Ii8+CisgICAgPHlTdXBlcnNjcmlwdFhTaXplIHZhbHVlPSI2NTAiLz4KKyAgICA8eVN1cGVyc2NyaXB0WVNpemUgdmFsdWU9IjYwMCIvPgorICAgIDx5U3VwZXJzY3JpcHRYT2Zmc2V0IHZhbHVlPSIwIi8+CisgICAgPHlTdXBlcnNjcmlwdFlPZmZzZXQgdmFsdWU9IjM1MCIvPgorICAgIDx5U3RyaWtlb3V0U2l6ZSB2YWx1ZT0iNTAiLz4KKyAgICA8eVN0cmlrZW91dFBvc2l0aW9uIHZhbHVlPSIzMDAiLz4KKyAgICA8c0ZhbWlseUNsYXNzIHZhbHVlPSIwIi8+CisgICAgPHBhbm9zZT4KKyAgICAgIDxiRmFtaWx5VHlwZSB2YWx1ZT0iMCIvPgorICAgICAgPGJTZXJpZlN0eWxlIHZhbHVlPSIwIi8+CisgICAgICA8YldlaWdodCB2YWx1ZT0iNSIvPgorICAgICAgPGJQcm9wb3J0aW9uIHZhbHVlPSIwIi8+CisgICAgICA8YkNvbnRyYXN0IHZhbHVlPSIwIi8+CisgICAgICA8YlN0cm9rZVZhcmlhdGlvbiB2YWx1ZT0iMCIvPgorICAgICAgPGJBcm1TdHlsZSB2YWx1ZT0iMCIvPgorICAgICAgPGJMZXR0ZXJGb3JtIHZhbHVlPSIwIi8+CisgICAgICA8Yk1pZGxpbmUgdmFsdWU9IjAiLz4KKyAgICAgIDxiWEhlaWdodCB2YWx1ZT0iMCIvPgorICAgIDwvcGFub3NlPgorICAgIDx1bFVuaWNvZGVSYW5nZTEgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAxIi8+CisgICAgPHVsVW5pY29kZVJhbmdlMiB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAiLz4KKyAgICA8dWxVbmljb2RlUmFuZ2UzIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCIvPgorICAgIDx1bFVuaWNvZGVSYW5nZTQgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIi8+CisgICAgPGFjaFZlbmRJRCB2YWx1ZT0iVUtXTiIvPgorICAgIDxmc1NlbGVjdGlvbiB2YWx1ZT0iMDAwMDAwMDAgMDEwMDAwMDAiLz4KKyAgICA8dXNGaXJzdENoYXJJbmRleCB2YWx1ZT0iMzIiLz4KKyAgICA8dXNMYXN0Q2hhckluZGV4IHZhbHVlPSIxMjIiLz4KKyAgICA8c1R5cG9Bc2NlbmRlciB2YWx1ZT0iODAwIi8+CisgICAgPHNUeXBvRGVzY2VuZGVyIHZhbHVlPSItMjAwIi8+CisgICAgPHNUeXBvTGluZUdhcCB2YWx1ZT0iMjAwIi8+CisgICAgPHVzV2luQXNjZW50IHZhbHVlPSIxMDAwIi8+CisgICAgPHVzV2luRGVzY2VudCB2YWx1ZT0iMjAwIi8+CisgICAgPHVsQ29kZVBhZ2VSYW5nZTEgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAxIi8+CisgICAgPHVsQ29kZVBhZ2VSYW5nZTIgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIi8+CisgICAgPHN4SGVpZ2h0IHZhbHVlPSI1MDAiLz4KKyAgICA8c0NhcEhlaWdodCB2YWx1ZT0iNzAwIi8+CisgICAgPHVzRGVmYXVsdENoYXIgdmFsdWU9IjAiLz4KKyAgICA8dXNCcmVha0NoYXIgdmFsdWU9IjMyIi8+CisgICAgPHVzTWF4Q29udGV4dCB2YWx1ZT0iMCIvPgorICA8L09TXzI+CisKKyAgPGhtdHg+CisgICAgPG10eCBuYW1lPSIubm90ZGVmIiB3aWR0aD0iNTAwIiBsc2I9IjkzIi8+CisgICAgPG10eCBuYW1lPSIxZW0iIHdpZHRoPSIxMDAwIiBsc2I9IjkzIi8+CisgICAgPG10eCBuYW1lPSIzZW0iIHdpZHRoPSIzMDAwIiBsc2I9IjkzIi8+CisgIDwvaG10eD4KKworICA8Y21hcD4KKyAgICA8dGFibGVWZXJzaW9uIHZlcnNpb249IjAiLz4KKyAgICA8Y21hcF9mb3JtYXRfNCBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEwIiBsYW5ndWFnZT0iMCI+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDYxIiBuYW1lPSIxZW0iIC8+IDwhLS0gYSAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjIiIG5hbWU9IjFlbSIgLz4gPCEtLSBiIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2MyIgbmFtZT0iMWVtIiAvPiA8IS0tIGMgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDY0IiBuYW1lPSIxZW0iIC8+IDwhLS0gZCAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjUiIG5hbWU9IjFlbSIgLz4gPCEtLSBlIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2NiIgbmFtZT0iMWVtIiAvPiA8IS0tIGYgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDY3IiBuYW1lPSIxZW0iIC8+IDwhLS0gZyAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjgiIG5hbWU9IjFlbSIgLz4gPCEtLSBoIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2OSIgbmFtZT0iMWVtIiAvPiA8IS0tIGkgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDZBIiBuYW1lPSIxZW0iIC8+IDwhLS0gaiAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNkIiIG5hbWU9IjFlbSIgLz4gPCEtLSBrIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2QyIgbmFtZT0iMWVtIiAvPiA8IS0tIGwgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDZEIiBuYW1lPSIxZW0iIC8+IDwhLS0gbSAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNkUiIG5hbWU9IjFlbSIgLz4gPCEtLSBuIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2RiIgbmFtZT0iM2VtIiAvPiA8IS0tIG8gLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDcwIiBuYW1lPSIxZW0iIC8+IDwhLS0gcCAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzEiIG5hbWU9IjFlbSIgLz4gPCEtLSBxIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3MiIgbmFtZT0iMWVtIiAvPiA8IS0tIHIgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDczIiBuYW1lPSIxZW0iIC8+IDwhLS0gcyAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzQiIG5hbWU9IjFlbSIgLz4gPCEtLSB0IC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3NSIgbmFtZT0iMWVtIiAvPiA8IS0tIHUgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDc2IiBuYW1lPSIxZW0iIC8+IDwhLS0gdiAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzciIG5hbWU9IjFlbSIgLz4gPCEtLSB3IC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3OCIgbmFtZT0iMWVtIiAvPiA8IS0tIHggLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDc5IiBuYW1lPSIxZW0iIC8+IDwhLS0geSAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwN0EiIG5hbWU9IjFlbSIgLz4gPCEtLSB6IC0tPgorICAgIDwvY21hcF9mb3JtYXRfND4KKyAgPC9jbWFwPgorCisgIDxsb2NhPgorICAgIDwhLS0gVGhlICdsb2NhJyB0YWJsZSB3aWxsIGJlIGNhbGN1bGF0ZWQgYnkgdGhlIGNvbXBpbGVyIC0tPgorICA8L2xvY2E+CisKKyAgPGdseWY+CisgICAgPFRUR2x5cGggbmFtZT0iLm5vdGRlZiIgeE1pbj0iMCIgeU1pbj0iMCIgeE1heD0iMCIgeU1heD0iMCIgLz4KKyAgICA8VFRHbHlwaCBuYW1lPSIxZW0iIHhNaW49IjAiIHlNaW49IjAiIHhNYXg9IjAiIHlNYXg9IjAiIC8+CisgICAgPFRUR2x5cGggbmFtZT0iM2VtIiB4TWluPSIwIiB5TWluPSIwIiB4TWF4PSIwIiB5TWF4PSIwIiAvPgorICA8L2dseWY+CisKKyAgPG5hbWU+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSIwIiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAgICA8L25hbWVyZWNvcmQ+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSIxIiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgU2FtcGxlIEZvbnQKKyAgICA8L25hbWVyZWNvcmQ+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSIyIiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgUmVndWxhcgorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjQiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBTYW1wbGUgRm9udAorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjYiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBTYW1wbGVGb250LVJlZ3VsYXIKKyAgICA8L25hbWVyZWNvcmQ+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSIxMyIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUworICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAgICA8L25hbWVyZWNvcmQ+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSIxNCIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgIDwvbmFtZXJlY29yZD4KKyAgPC9uYW1lPgorCisgIDxwb3N0PgorICAgIDxmb3JtYXRUeXBlIHZhbHVlPSIzLjAiLz4KKyAgICA8aXRhbGljQW5nbGUgdmFsdWU9IjAuMCIvPgorICAgIDx1bmRlcmxpbmVQb3NpdGlvbiB2YWx1ZT0iLTc1Ii8+CisgICAgPHVuZGVybGluZVRoaWNrbmVzcyB2YWx1ZT0iNTAiLz4KKyAgICA8aXNGaXhlZFBpdGNoIHZhbHVlPSIwIi8+CisgICAgPG1pbk1lbVR5cGU0MiB2YWx1ZT0iMCIvPgorICAgIDxtYXhNZW1UeXBlNDIgdmFsdWU9IjAiLz4KKyAgICA8bWluTWVtVHlwZTEgdmFsdWU9IjAiLz4KKyAgICA8bWF4TWVtVHlwZTEgdmFsdWU9IjAiLz4KKyAgPC9wb3N0PgorCis8L3R0Rm9udD4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9hc3NldHMvZm9udF9zb3VyY2UvYXNjaWlfcDNlbV93ZWlnaHQ4MDBfaXRhbGljLnR0eCBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9hc3NldHMvZm9udF9zb3VyY2UvYXNjaWlfcDNlbV93ZWlnaHQ4MDBfaXRhbGljLnR0eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTUyMDE0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L2Fzc2V0cy9mb250X3NvdXJjZS9hc2NpaV9wM2VtX3dlaWdodDgwMF9pdGFsaWMudHR4CkBAIC0wLDAgKzEsMjA4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8dHRGb250IHNmbnRWZXJzaW9uPSJceDAwXHgwMVx4MDBceDAwIiB0dExpYlZlcnNpb249IjMuMCI+CisKKyAgPEdseXBoT3JkZXI+CisgICAgPEdseXBoSUQgaWQ9IjAiIG5hbWU9Ii5ub3RkZWYiLz4KKyAgICA8R2x5cGhJRCBpZD0iMSIgbmFtZT0iMWVtIi8+CisgICAgPEdseXBoSUQgaWQ9IjIiIG5hbWU9IjNlbSIvPgorICA8L0dseXBoT3JkZXI+CisKKyAgPGhlYWQ+CisgICAgPHRhYmxlVmVyc2lvbiB2YWx1ZT0iMS4wIi8+CisgICAgPGZvbnRSZXZpc2lvbiB2YWx1ZT0iMS4wIi8+CisgICAgPGNoZWNrU3VtQWRqdXN0bWVudCB2YWx1ZT0iMHg2NDBjZGIyZiIvPgorICAgIDxtYWdpY051bWJlciB2YWx1ZT0iMHg1ZjBmM2NmNSIvPgorICAgIDxmbGFncyB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMTEiLz4KKyAgICA8dW5pdHNQZXJFbSB2YWx1ZT0iMTAwMCIvPgorICAgIDxjcmVhdGVkIHZhbHVlPSJUaHUgRmViIDIyIDEwOjA0OjMwIDIwMTgiLz4KKyAgICA8bWFjU3R5bGUgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDEwIi8+CisgICAgPGxvd2VzdFJlY1BQRU0gdmFsdWU9IjciLz4KKyAgICA8Zm9udERpcmVjdGlvbkhpbnQgdmFsdWU9IjIiLz4KKyAgICA8Z2x5cGhEYXRhRm9ybWF0IHZhbHVlPSIwIi8+CisgIDwvaGVhZD4KKworICA8aGhlYT4KKyAgICA8dGFibGVWZXJzaW9uIHZhbHVlPSIweDAwMDEwMDAwIi8+CisgICAgPGFzY2VudCB2YWx1ZT0iMTAwMCIvPgorICAgIDxkZXNjZW50IHZhbHVlPSItMjAwIi8+CisgICAgPGxpbmVHYXAgdmFsdWU9IjAiLz4KKyAgICA8Y2FyZXRTbG9wZVJpc2UgdmFsdWU9IjEiLz4KKyAgICA8Y2FyZXRTbG9wZVJ1biB2YWx1ZT0iMCIvPgorICAgIDxjYXJldE9mZnNldCB2YWx1ZT0iMCIvPgorICAgIDxyZXNlcnZlZDAgdmFsdWU9IjAiLz4KKyAgICA8cmVzZXJ2ZWQxIHZhbHVlPSIwIi8+CisgICAgPHJlc2VydmVkMiB2YWx1ZT0iMCIvPgorICAgIDxyZXNlcnZlZDMgdmFsdWU9IjAiLz4KKyAgICA8bWV0cmljRGF0YUZvcm1hdCB2YWx1ZT0iMCIvPgorICA8L2hoZWE+CisKKyAgPG1heHA+CisgICAgPHRhYmxlVmVyc2lvbiB2YWx1ZT0iMHgxMDAwMCIvPgorICAgIDxtYXhab25lcyB2YWx1ZT0iMCIvPgorICAgIDxtYXhUd2lsaWdodFBvaW50cyB2YWx1ZT0iMCIvPgorICAgIDxtYXhTdG9yYWdlIHZhbHVlPSIwIi8+CisgICAgPG1heEZ1bmN0aW9uRGVmcyB2YWx1ZT0iMCIvPgorICAgIDxtYXhJbnN0cnVjdGlvbkRlZnMgdmFsdWU9IjAiLz4KKyAgICA8bWF4U3RhY2tFbGVtZW50cyB2YWx1ZT0iMCIvPgorICAgIDxtYXhTaXplT2ZJbnN0cnVjdGlvbnMgdmFsdWU9IjAiLz4KKyAgICA8bWF4Q29tcG9uZW50RWxlbWVudHMgdmFsdWU9IjAiLz4KKyAgPC9tYXhwPgorCisgIDxPU18yPgorICAgIDwhLS0gVGhlIGZpZWxkcyAndXNGaXJzdENoYXJJbmRleCcgYW5kICd1c0xhc3RDaGFySW5kZXgnCisgICAgICAgICB3aWxsIGJlIHJlY2FsY3VsYXRlZCBieSB0aGUgY29tcGlsZXIgLS0+CisgICAgPHZlcnNpb24gdmFsdWU9IjMiLz4KKyAgICA8eEF2Z0NoYXJXaWR0aCB2YWx1ZT0iNTk0Ii8+CisgICAgPHVzV2VpZ2h0Q2xhc3MgdmFsdWU9IjgwMCIvPgorICAgIDx1c1dpZHRoQ2xhc3MgdmFsdWU9IjUiLz4KKyAgICA8ZnNUeXBlIHZhbHVlPSIwMDAwMDAwMCAwMDAwMTAwMCIvPgorICAgIDx5U3Vic2NyaXB0WFNpemUgdmFsdWU9IjY1MCIvPgorICAgIDx5U3Vic2NyaXB0WVNpemUgdmFsdWU9IjYwMCIvPgorICAgIDx5U3Vic2NyaXB0WE9mZnNldCB2YWx1ZT0iMCIvPgorICAgIDx5U3Vic2NyaXB0WU9mZnNldCB2YWx1ZT0iNzUiLz4KKyAgICA8eVN1cGVyc2NyaXB0WFNpemUgdmFsdWU9IjY1MCIvPgorICAgIDx5U3VwZXJzY3JpcHRZU2l6ZSB2YWx1ZT0iNjAwIi8+CisgICAgPHlTdXBlcnNjcmlwdFhPZmZzZXQgdmFsdWU9IjAiLz4KKyAgICA8eVN1cGVyc2NyaXB0WU9mZnNldCB2YWx1ZT0iMzUwIi8+CisgICAgPHlTdHJpa2VvdXRTaXplIHZhbHVlPSI1MCIvPgorICAgIDx5U3RyaWtlb3V0UG9zaXRpb24gdmFsdWU9IjMwMCIvPgorICAgIDxzRmFtaWx5Q2xhc3MgdmFsdWU9IjAiLz4KKyAgICA8cGFub3NlPgorICAgICAgPGJGYW1pbHlUeXBlIHZhbHVlPSIwIi8+CisgICAgICA8YlNlcmlmU3R5bGUgdmFsdWU9IjAiLz4KKyAgICAgIDxiV2VpZ2h0IHZhbHVlPSI1Ii8+CisgICAgICA8YlByb3BvcnRpb24gdmFsdWU9IjAiLz4KKyAgICAgIDxiQ29udHJhc3QgdmFsdWU9IjAiLz4KKyAgICAgIDxiU3Ryb2tlVmFyaWF0aW9uIHZhbHVlPSIwIi8+CisgICAgICA8YkFybVN0eWxlIHZhbHVlPSIwIi8+CisgICAgICA8YkxldHRlckZvcm0gdmFsdWU9IjAiLz4KKyAgICAgIDxiTWlkbGluZSB2YWx1ZT0iMCIvPgorICAgICAgPGJYSGVpZ2h0IHZhbHVlPSIwIi8+CisgICAgPC9wYW5vc2U+CisgICAgPHVsVW5pY29kZVJhbmdlMSB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDEiLz4KKyAgICA8dWxVbmljb2RlUmFuZ2UyIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCIvPgorICAgIDx1bFVuaWNvZGVSYW5nZTMgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIi8+CisgICAgPHVsVW5pY29kZVJhbmdlNCB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAiLz4KKyAgICA8YWNoVmVuZElEIHZhbHVlPSJVS1dOIi8+CisgICAgPGZzU2VsZWN0aW9uIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMSIvPgorICAgIDx1c0ZpcnN0Q2hhckluZGV4IHZhbHVlPSIzMiIvPgorICAgIDx1c0xhc3RDaGFySW5kZXggdmFsdWU9IjEyMiIvPgorICAgIDxzVHlwb0FzY2VuZGVyIHZhbHVlPSI4MDAiLz4KKyAgICA8c1R5cG9EZXNjZW5kZXIgdmFsdWU9Ii0yMDAiLz4KKyAgICA8c1R5cG9MaW5lR2FwIHZhbHVlPSIyMDAiLz4KKyAgICA8dXNXaW5Bc2NlbnQgdmFsdWU9IjEwMDAiLz4KKyAgICA8dXNXaW5EZXNjZW50IHZhbHVlPSIyMDAiLz4KKyAgICA8dWxDb2RlUGFnZVJhbmdlMSB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDEiLz4KKyAgICA8dWxDb2RlUGFnZVJhbmdlMiB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAiLz4KKyAgICA8c3hIZWlnaHQgdmFsdWU9IjUwMCIvPgorICAgIDxzQ2FwSGVpZ2h0IHZhbHVlPSI3MDAiLz4KKyAgICA8dXNEZWZhdWx0Q2hhciB2YWx1ZT0iMCIvPgorICAgIDx1c0JyZWFrQ2hhciB2YWx1ZT0iMzIiLz4KKyAgICA8dXNNYXhDb250ZXh0IHZhbHVlPSIwIi8+CisgIDwvT1NfMj4KKworICA8aG10eD4KKyAgICA8bXR4IG5hbWU9Ii5ub3RkZWYiIHdpZHRoPSI1MDAiIGxzYj0iOTMiLz4KKyAgICA8bXR4IG5hbWU9IjFlbSIgd2lkdGg9IjEwMDAiIGxzYj0iOTMiLz4KKyAgICA8bXR4IG5hbWU9IjNlbSIgd2lkdGg9IjMwMDAiIGxzYj0iOTMiLz4KKyAgPC9obXR4PgorCisgIDxjbWFwPgorICAgIDx0YWJsZVZlcnNpb24gdmVyc2lvbj0iMCIvPgorICAgIDxjbWFwX2Zvcm1hdF80IHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMTAiIGxhbmd1YWdlPSIwIj4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjEiIG5hbWU9IjFlbSIgLz4gPCEtLSBhIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2MiIgbmFtZT0iMWVtIiAvPiA8IS0tIGIgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDYzIiBuYW1lPSIxZW0iIC8+IDwhLS0gYyAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjQiIG5hbWU9IjFlbSIgLz4gPCEtLSBkIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2NSIgbmFtZT0iMWVtIiAvPiA8IS0tIGUgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDY2IiBuYW1lPSIxZW0iIC8+IDwhLS0gZiAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjciIG5hbWU9IjFlbSIgLz4gPCEtLSBnIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2OCIgbmFtZT0iMWVtIiAvPiA8IS0tIGggLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDY5IiBuYW1lPSIxZW0iIC8+IDwhLS0gaSAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNkEiIG5hbWU9IjFlbSIgLz4gPCEtLSBqIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2QiIgbmFtZT0iMWVtIiAvPiA8IS0tIGsgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDZDIiBuYW1lPSIxZW0iIC8+IDwhLS0gbCAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNkQiIG5hbWU9IjFlbSIgLz4gPCEtLSBtIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2RSIgbmFtZT0iMWVtIiAvPiA8IS0tIG4gLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDZGIiBuYW1lPSIxZW0iIC8+IDwhLS0gbyAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzAiIG5hbWU9IjNlbSIgLz4gPCEtLSBwIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3MSIgbmFtZT0iMWVtIiAvPiA8IS0tIHEgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDcyIiBuYW1lPSIxZW0iIC8+IDwhLS0gciAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzMiIG5hbWU9IjFlbSIgLz4gPCEtLSBzIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3NCIgbmFtZT0iMWVtIiAvPiA8IS0tIHQgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDc1IiBuYW1lPSIxZW0iIC8+IDwhLS0gdSAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzYiIG5hbWU9IjFlbSIgLz4gPCEtLSB2IC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3NyIgbmFtZT0iMWVtIiAvPiA8IS0tIHcgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDc4IiBuYW1lPSIxZW0iIC8+IDwhLS0geCAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzkiIG5hbWU9IjFlbSIgLz4gPCEtLSB5IC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3QSIgbmFtZT0iMWVtIiAvPiA8IS0tIHogLS0+CisgICAgPC9jbWFwX2Zvcm1hdF80PgorICA8L2NtYXA+CisKKyAgPGxvY2E+CisgICAgPCEtLSBUaGUgJ2xvY2EnIHRhYmxlIHdpbGwgYmUgY2FsY3VsYXRlZCBieSB0aGUgY29tcGlsZXIgLS0+CisgIDwvbG9jYT4KKworICA8Z2x5Zj4KKyAgICA8VFRHbHlwaCBuYW1lPSIubm90ZGVmIiB4TWluPSIwIiB5TWluPSIwIiB4TWF4PSIwIiB5TWF4PSIwIiAvPgorICAgIDxUVEdseXBoIG5hbWU9IjFlbSIgeE1pbj0iMCIgeU1pbj0iMCIgeE1heD0iMCIgeU1heD0iMCIgLz4KKyAgICA8VFRHbHlwaCBuYW1lPSIzZW0iIHhNaW49IjAiIHlNaW49IjAiIHhNYXg9IjAiIHlNYXg9IjAiIC8+CisgIDwvZ2x5Zj4KKworICA8bmFtZT4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjAiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjEiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBTYW1wbGUgRm9udAorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjIiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBSZWd1bGFyCisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iNCIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIFNhbXBsZSBGb250CisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iNiIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIFNhbXBsZUZvbnQtUmVndWxhcgorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjEzIiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjE0IiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgPC9uYW1lcmVjb3JkPgorICA8L25hbWU+CisKKyAgPHBvc3Q+CisgICAgPGZvcm1hdFR5cGUgdmFsdWU9IjMuMCIvPgorICAgIDxpdGFsaWNBbmdsZSB2YWx1ZT0iMC4wIi8+CisgICAgPHVuZGVybGluZVBvc2l0aW9uIHZhbHVlPSItNzUiLz4KKyAgICA8dW5kZXJsaW5lVGhpY2tuZXNzIHZhbHVlPSI1MCIvPgorICAgIDxpc0ZpeGVkUGl0Y2ggdmFsdWU9IjAiLz4KKyAgICA8bWluTWVtVHlwZTQyIHZhbHVlPSIwIi8+CisgICAgPG1heE1lbVR5cGU0MiB2YWx1ZT0iMCIvPgorICAgIDxtaW5NZW1UeXBlMSB2YWx1ZT0iMCIvPgorICAgIDxtYXhNZW1UeXBlMSB2YWx1ZT0iMCIvPgorICA8L3Bvc3Q+CisKKzwvdHRGb250PgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L2Fzc2V0cy9mb250X3NvdXJjZS9hc2NpaV9xM2VtX3dlaWdodDkwMF91cHJpZ2h0LnR0eCBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9hc3NldHMvZm9udF9zb3VyY2UvYXNjaWlfcTNlbV93ZWlnaHQ5MDBfdXByaWdodC50dHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E1ZjY0MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9hc3NldHMvZm9udF9zb3VyY2UvYXNjaWlfcTNlbV93ZWlnaHQ5MDBfdXByaWdodC50dHgKQEAgLTAsMCArMSwyMDggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzx0dEZvbnQgc2ZudFZlcnNpb249Ilx4MDBceDAxXHgwMFx4MDAiIHR0TGliVmVyc2lvbj0iMy4wIj4KKworICA8R2x5cGhPcmRlcj4KKyAgICA8R2x5cGhJRCBpZD0iMCIgbmFtZT0iLm5vdGRlZiIvPgorICAgIDxHbHlwaElEIGlkPSIxIiBuYW1lPSIxZW0iLz4KKyAgICA8R2x5cGhJRCBpZD0iMiIgbmFtZT0iM2VtIi8+CisgIDwvR2x5cGhPcmRlcj4KKworICA8aGVhZD4KKyAgICA8dGFibGVWZXJzaW9uIHZhbHVlPSIxLjAiLz4KKyAgICA8Zm9udFJldmlzaW9uIHZhbHVlPSIxLjAiLz4KKyAgICA8Y2hlY2tTdW1BZGp1c3RtZW50IHZhbHVlPSIweDY0MGNkYjJmIi8+CisgICAgPG1hZ2ljTnVtYmVyIHZhbHVlPSIweDVmMGYzY2Y1Ii8+CisgICAgPGZsYWdzIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAxMSIvPgorICAgIDx1bml0c1BlckVtIHZhbHVlPSIxMDAwIi8+CisgICAgPGNyZWF0ZWQgdmFsdWU9IlRodSBGZWIgMjIgMTA6MDQ6MzAgMjAxOCIvPgorICAgIDxtYWNTdHlsZSB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAiLz4KKyAgICA8bG93ZXN0UmVjUFBFTSB2YWx1ZT0iNyIvPgorICAgIDxmb250RGlyZWN0aW9uSGludCB2YWx1ZT0iMiIvPgorICAgIDxnbHlwaERhdGFGb3JtYXQgdmFsdWU9IjAiLz4KKyAgPC9oZWFkPgorCisgIDxoaGVhPgorICAgIDx0YWJsZVZlcnNpb24gdmFsdWU9IjB4MDAwMTAwMDAiLz4KKyAgICA8YXNjZW50IHZhbHVlPSIxMDAwIi8+CisgICAgPGRlc2NlbnQgdmFsdWU9Ii0yMDAiLz4KKyAgICA8bGluZUdhcCB2YWx1ZT0iMCIvPgorICAgIDxjYXJldFNsb3BlUmlzZSB2YWx1ZT0iMSIvPgorICAgIDxjYXJldFNsb3BlUnVuIHZhbHVlPSIwIi8+CisgICAgPGNhcmV0T2Zmc2V0IHZhbHVlPSIwIi8+CisgICAgPHJlc2VydmVkMCB2YWx1ZT0iMCIvPgorICAgIDxyZXNlcnZlZDEgdmFsdWU9IjAiLz4KKyAgICA8cmVzZXJ2ZWQyIHZhbHVlPSIwIi8+CisgICAgPHJlc2VydmVkMyB2YWx1ZT0iMCIvPgorICAgIDxtZXRyaWNEYXRhRm9ybWF0IHZhbHVlPSIwIi8+CisgIDwvaGhlYT4KKworICA8bWF4cD4KKyAgICA8dGFibGVWZXJzaW9uIHZhbHVlPSIweDEwMDAwIi8+CisgICAgPG1heFpvbmVzIHZhbHVlPSIwIi8+CisgICAgPG1heFR3aWxpZ2h0UG9pbnRzIHZhbHVlPSIwIi8+CisgICAgPG1heFN0b3JhZ2UgdmFsdWU9IjAiLz4KKyAgICA8bWF4RnVuY3Rpb25EZWZzIHZhbHVlPSIwIi8+CisgICAgPG1heEluc3RydWN0aW9uRGVmcyB2YWx1ZT0iMCIvPgorICAgIDxtYXhTdGFja0VsZW1lbnRzIHZhbHVlPSIwIi8+CisgICAgPG1heFNpemVPZkluc3RydWN0aW9ucyB2YWx1ZT0iMCIvPgorICAgIDxtYXhDb21wb25lbnRFbGVtZW50cyB2YWx1ZT0iMCIvPgorICA8L21heHA+CisKKyAgPE9TXzI+CisgICAgPCEtLSBUaGUgZmllbGRzICd1c0ZpcnN0Q2hhckluZGV4JyBhbmQgJ3VzTGFzdENoYXJJbmRleCcKKyAgICAgICAgIHdpbGwgYmUgcmVjYWxjdWxhdGVkIGJ5IHRoZSBjb21waWxlciAtLT4KKyAgICA8dmVyc2lvbiB2YWx1ZT0iMyIvPgorICAgIDx4QXZnQ2hhcldpZHRoIHZhbHVlPSI1OTQiLz4KKyAgICA8dXNXZWlnaHRDbGFzcyB2YWx1ZT0iOTAwIi8+CisgICAgPHVzV2lkdGhDbGFzcyB2YWx1ZT0iNSIvPgorICAgIDxmc1R5cGUgdmFsdWU9IjAwMDAwMDAwIDAwMDAxMDAwIi8+CisgICAgPHlTdWJzY3JpcHRYU2l6ZSB2YWx1ZT0iNjUwIi8+CisgICAgPHlTdWJzY3JpcHRZU2l6ZSB2YWx1ZT0iNjAwIi8+CisgICAgPHlTdWJzY3JpcHRYT2Zmc2V0IHZhbHVlPSIwIi8+CisgICAgPHlTdWJzY3JpcHRZT2Zmc2V0IHZhbHVlPSI3NSIvPgorICAgIDx5U3VwZXJzY3JpcHRYU2l6ZSB2YWx1ZT0iNjUwIi8+CisgICAgPHlTdXBlcnNjcmlwdFlTaXplIHZhbHVlPSI2MDAiLz4KKyAgICA8eVN1cGVyc2NyaXB0WE9mZnNldCB2YWx1ZT0iMCIvPgorICAgIDx5U3VwZXJzY3JpcHRZT2Zmc2V0IHZhbHVlPSIzNTAiLz4KKyAgICA8eVN0cmlrZW91dFNpemUgdmFsdWU9IjUwIi8+CisgICAgPHlTdHJpa2VvdXRQb3NpdGlvbiB2YWx1ZT0iMzAwIi8+CisgICAgPHNGYW1pbHlDbGFzcyB2YWx1ZT0iMCIvPgorICAgIDxwYW5vc2U+CisgICAgICA8YkZhbWlseVR5cGUgdmFsdWU9IjAiLz4KKyAgICAgIDxiU2VyaWZTdHlsZSB2YWx1ZT0iMCIvPgorICAgICAgPGJXZWlnaHQgdmFsdWU9IjUiLz4KKyAgICAgIDxiUHJvcG9ydGlvbiB2YWx1ZT0iMCIvPgorICAgICAgPGJDb250cmFzdCB2YWx1ZT0iMCIvPgorICAgICAgPGJTdHJva2VWYXJpYXRpb24gdmFsdWU9IjAiLz4KKyAgICAgIDxiQXJtU3R5bGUgdmFsdWU9IjAiLz4KKyAgICAgIDxiTGV0dGVyRm9ybSB2YWx1ZT0iMCIvPgorICAgICAgPGJNaWRsaW5lIHZhbHVlPSIwIi8+CisgICAgICA8YlhIZWlnaHQgdmFsdWU9IjAiLz4KKyAgICA8L3Bhbm9zZT4KKyAgICA8dWxVbmljb2RlUmFuZ2UxIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMSIvPgorICAgIDx1bFVuaWNvZGVSYW5nZTIgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIi8+CisgICAgPHVsVW5pY29kZVJhbmdlMyB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAiLz4KKyAgICA8dWxVbmljb2RlUmFuZ2U0IHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCIvPgorICAgIDxhY2hWZW5kSUQgdmFsdWU9IlVLV04iLz4KKyAgICA8ZnNTZWxlY3Rpb24gdmFsdWU9IjAwMDAwMDAwIDAxMDAwMDAwIi8+CisgICAgPHVzRmlyc3RDaGFySW5kZXggdmFsdWU9IjMyIi8+CisgICAgPHVzTGFzdENoYXJJbmRleCB2YWx1ZT0iMTIyIi8+CisgICAgPHNUeXBvQXNjZW5kZXIgdmFsdWU9IjgwMCIvPgorICAgIDxzVHlwb0Rlc2NlbmRlciB2YWx1ZT0iLTIwMCIvPgorICAgIDxzVHlwb0xpbmVHYXAgdmFsdWU9IjIwMCIvPgorICAgIDx1c1dpbkFzY2VudCB2YWx1ZT0iMTAwMCIvPgorICAgIDx1c1dpbkRlc2NlbnQgdmFsdWU9IjIwMCIvPgorICAgIDx1bENvZGVQYWdlUmFuZ2UxIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMSIvPgorICAgIDx1bENvZGVQYWdlUmFuZ2UyIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCIvPgorICAgIDxzeEhlaWdodCB2YWx1ZT0iNTAwIi8+CisgICAgPHNDYXBIZWlnaHQgdmFsdWU9IjcwMCIvPgorICAgIDx1c0RlZmF1bHRDaGFyIHZhbHVlPSIwIi8+CisgICAgPHVzQnJlYWtDaGFyIHZhbHVlPSIzMiIvPgorICAgIDx1c01heENvbnRleHQgdmFsdWU9IjAiLz4KKyAgPC9PU18yPgorCisgIDxobXR4PgorICAgIDxtdHggbmFtZT0iLm5vdGRlZiIgd2lkdGg9IjUwMCIgbHNiPSI5MyIvPgorICAgIDxtdHggbmFtZT0iMWVtIiB3aWR0aD0iMTAwMCIgbHNiPSI5MyIvPgorICAgIDxtdHggbmFtZT0iM2VtIiB3aWR0aD0iMzAwMCIgbHNiPSI5MyIvPgorICA8L2htdHg+CisKKyAgPGNtYXA+CisgICAgPHRhYmxlVmVyc2lvbiB2ZXJzaW9uPSIwIi8+CisgICAgPGNtYXBfZm9ybWF0XzQgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxMCIgbGFuZ3VhZ2U9IjAiPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2MSIgbmFtZT0iMWVtIiAvPiA8IS0tIGEgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDYyIiBuYW1lPSIxZW0iIC8+IDwhLS0gYiAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjMiIG5hbWU9IjFlbSIgLz4gPCEtLSBjIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2NCIgbmFtZT0iMWVtIiAvPiA8IS0tIGQgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDY1IiBuYW1lPSIxZW0iIC8+IDwhLS0gZSAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjYiIG5hbWU9IjFlbSIgLz4gPCEtLSBmIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2NyIgbmFtZT0iMWVtIiAvPiA8IS0tIGcgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDY4IiBuYW1lPSIxZW0iIC8+IDwhLS0gaCAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjkiIG5hbWU9IjFlbSIgLz4gPCEtLSBpIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2QSIgbmFtZT0iMWVtIiAvPiA8IS0tIGogLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDZCIiBuYW1lPSIxZW0iIC8+IDwhLS0gayAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNkMiIG5hbWU9IjFlbSIgLz4gPCEtLSBsIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2RCIgbmFtZT0iMWVtIiAvPiA8IS0tIG0gLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDZFIiBuYW1lPSIxZW0iIC8+IDwhLS0gbiAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNkYiIG5hbWU9IjFlbSIgLz4gPCEtLSBvIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3MCIgbmFtZT0iMWVtIiAvPiA8IS0tIHAgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDcxIiBuYW1lPSIzZW0iIC8+IDwhLS0gcSAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzIiIG5hbWU9IjFlbSIgLz4gPCEtLSByIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3MyIgbmFtZT0iMWVtIiAvPiA8IS0tIHMgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDc0IiBuYW1lPSIxZW0iIC8+IDwhLS0gdCAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzUiIG5hbWU9IjFlbSIgLz4gPCEtLSB1IC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3NiIgbmFtZT0iMWVtIiAvPiA8IS0tIHYgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDc3IiBuYW1lPSIxZW0iIC8+IDwhLS0gdyAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzgiIG5hbWU9IjFlbSIgLz4gPCEtLSB4IC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3OSIgbmFtZT0iMWVtIiAvPiA8IS0tIHkgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDdBIiBuYW1lPSIxZW0iIC8+IDwhLS0geiAtLT4KKyAgICA8L2NtYXBfZm9ybWF0XzQ+CisgIDwvY21hcD4KKworICA8bG9jYT4KKyAgICA8IS0tIFRoZSAnbG9jYScgdGFibGUgd2lsbCBiZSBjYWxjdWxhdGVkIGJ5IHRoZSBjb21waWxlciAtLT4KKyAgPC9sb2NhPgorCisgIDxnbHlmPgorICAgIDxUVEdseXBoIG5hbWU9Ii5ub3RkZWYiIHhNaW49IjAiIHlNaW49IjAiIHhNYXg9IjAiIHlNYXg9IjAiIC8+CisgICAgPFRUR2x5cGggbmFtZT0iMWVtIiB4TWluPSIwIiB5TWluPSIwIiB4TWF4PSIwIiB5TWF4PSIwIiAvPgorICAgIDxUVEdseXBoIG5hbWU9IjNlbSIgeE1pbj0iMCIgeU1pbj0iMCIgeE1heD0iMCIgeU1heD0iMCIgLz4KKyAgPC9nbHlmPgorCisgIDxuYW1lPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iMCIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iMSIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIFNhbXBsZSBGb250CisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iMiIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIFJlZ3VsYXIKKyAgICA8L25hbWVyZWNvcmQ+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSI0IiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgU2FtcGxlIEZvbnQKKyAgICA8L25hbWVyZWNvcmQ+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSI2IiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgU2FtcGxlRm9udC1SZWd1bGFyCisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iMTMiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgICAgPC9uYW1lcmVjb3JkPgorICAgIDxuYW1lcmVjb3JkIG5hbWVJRD0iMTQiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICA8L25hbWVyZWNvcmQ+CisgIDwvbmFtZT4KKworICA8cG9zdD4KKyAgICA8Zm9ybWF0VHlwZSB2YWx1ZT0iMy4wIi8+CisgICAgPGl0YWxpY0FuZ2xlIHZhbHVlPSIwLjAiLz4KKyAgICA8dW5kZXJsaW5lUG9zaXRpb24gdmFsdWU9Ii03NSIvPgorICAgIDx1bmRlcmxpbmVUaGlja25lc3MgdmFsdWU9IjUwIi8+CisgICAgPGlzRml4ZWRQaXRjaCB2YWx1ZT0iMCIvPgorICAgIDxtaW5NZW1UeXBlNDIgdmFsdWU9IjAiLz4KKyAgICA8bWF4TWVtVHlwZTQyIHZhbHVlPSIwIi8+CisgICAgPG1pbk1lbVR5cGUxIHZhbHVlPSIwIi8+CisgICAgPG1heE1lbVR5cGUxIHZhbHVlPSIwIi8+CisgIDwvcG9zdD4KKworPC90dEZvbnQ+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy93aWRnZXQvYXNzZXRzL2ZvbnRfc291cmNlL2FzY2lpX3IzZW1fd2VpZ2h0OTAwX2l0YWxpYy50dHggYi90ZXN0cy90ZXN0cy93aWRnZXQvYXNzZXRzL2ZvbnRfc291cmNlL2FzY2lpX3IzZW1fd2VpZ2h0OTAwX2l0YWxpYy50dHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJlNDk3NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9hc3NldHMvZm9udF9zb3VyY2UvYXNjaWlfcjNlbV93ZWlnaHQ5MDBfaXRhbGljLnR0eApAQCAtMCwwICsxLDIwOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUworICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHR0Rm9udCBzZm50VmVyc2lvbj0iXHgwMFx4MDFceDAwXHgwMCIgdHRMaWJWZXJzaW9uPSIzLjAiPgorCisgIDxHbHlwaE9yZGVyPgorICAgIDxHbHlwaElEIGlkPSIwIiBuYW1lPSIubm90ZGVmIi8+CisgICAgPEdseXBoSUQgaWQ9IjEiIG5hbWU9IjFlbSIvPgorICAgIDxHbHlwaElEIGlkPSIyIiBuYW1lPSIzZW0iLz4KKyAgPC9HbHlwaE9yZGVyPgorCisgIDxoZWFkPgorICAgIDx0YWJsZVZlcnNpb24gdmFsdWU9IjEuMCIvPgorICAgIDxmb250UmV2aXNpb24gdmFsdWU9IjEuMCIvPgorICAgIDxjaGVja1N1bUFkanVzdG1lbnQgdmFsdWU9IjB4NjQwY2RiMmYiLz4KKyAgICA8bWFnaWNOdW1iZXIgdmFsdWU9IjB4NWYwZjNjZjUiLz4KKyAgICA8ZmxhZ3MgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDExIi8+CisgICAgPHVuaXRzUGVyRW0gdmFsdWU9IjEwMDAiLz4KKyAgICA8Y3JlYXRlZCB2YWx1ZT0iVGh1IEZlYiAyMiAxMDowNDozMSAyMDE4Ii8+CisgICAgPG1hY1N0eWxlIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAxMCIvPgorICAgIDxsb3dlc3RSZWNQUEVNIHZhbHVlPSI3Ii8+CisgICAgPGZvbnREaXJlY3Rpb25IaW50IHZhbHVlPSIyIi8+CisgICAgPGdseXBoRGF0YUZvcm1hdCB2YWx1ZT0iMCIvPgorICA8L2hlYWQ+CisKKyAgPGhoZWE+CisgICAgPHRhYmxlVmVyc2lvbiB2YWx1ZT0iMHgwMDAxMDAwMCIvPgorICAgIDxhc2NlbnQgdmFsdWU9IjEwMDAiLz4KKyAgICA8ZGVzY2VudCB2YWx1ZT0iLTIwMCIvPgorICAgIDxsaW5lR2FwIHZhbHVlPSIwIi8+CisgICAgPGNhcmV0U2xvcGVSaXNlIHZhbHVlPSIxIi8+CisgICAgPGNhcmV0U2xvcGVSdW4gdmFsdWU9IjAiLz4KKyAgICA8Y2FyZXRPZmZzZXQgdmFsdWU9IjAiLz4KKyAgICA8cmVzZXJ2ZWQwIHZhbHVlPSIwIi8+CisgICAgPHJlc2VydmVkMSB2YWx1ZT0iMCIvPgorICAgIDxyZXNlcnZlZDIgdmFsdWU9IjAiLz4KKyAgICA8cmVzZXJ2ZWQzIHZhbHVlPSIwIi8+CisgICAgPG1ldHJpY0RhdGFGb3JtYXQgdmFsdWU9IjAiLz4KKyAgPC9oaGVhPgorCisgIDxtYXhwPgorICAgIDx0YWJsZVZlcnNpb24gdmFsdWU9IjB4MTAwMDAiLz4KKyAgICA8bWF4Wm9uZXMgdmFsdWU9IjAiLz4KKyAgICA8bWF4VHdpbGlnaHRQb2ludHMgdmFsdWU9IjAiLz4KKyAgICA8bWF4U3RvcmFnZSB2YWx1ZT0iMCIvPgorICAgIDxtYXhGdW5jdGlvbkRlZnMgdmFsdWU9IjAiLz4KKyAgICA8bWF4SW5zdHJ1Y3Rpb25EZWZzIHZhbHVlPSIwIi8+CisgICAgPG1heFN0YWNrRWxlbWVudHMgdmFsdWU9IjAiLz4KKyAgICA8bWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zIHZhbHVlPSIwIi8+CisgICAgPG1heENvbXBvbmVudEVsZW1lbnRzIHZhbHVlPSIwIi8+CisgIDwvbWF4cD4KKworICA8T1NfMj4KKyAgICA8IS0tIFRoZSBmaWVsZHMgJ3VzRmlyc3RDaGFySW5kZXgnIGFuZCAndXNMYXN0Q2hhckluZGV4JworICAgICAgICAgd2lsbCBiZSByZWNhbGN1bGF0ZWQgYnkgdGhlIGNvbXBpbGVyIC0tPgorICAgIDx2ZXJzaW9uIHZhbHVlPSIzIi8+CisgICAgPHhBdmdDaGFyV2lkdGggdmFsdWU9IjU5NCIvPgorICAgIDx1c1dlaWdodENsYXNzIHZhbHVlPSI5MDAiLz4KKyAgICA8dXNXaWR0aENsYXNzIHZhbHVlPSI1Ii8+CisgICAgPGZzVHlwZSB2YWx1ZT0iMDAwMDAwMDAgMDAwMDEwMDAiLz4KKyAgICA8eVN1YnNjcmlwdFhTaXplIHZhbHVlPSI2NTAiLz4KKyAgICA8eVN1YnNjcmlwdFlTaXplIHZhbHVlPSI2MDAiLz4KKyAgICA8eVN1YnNjcmlwdFhPZmZzZXQgdmFsdWU9IjAiLz4KKyAgICA8eVN1YnNjcmlwdFlPZmZzZXQgdmFsdWU9Ijc1Ii8+CisgICAgPHlTdXBlcnNjcmlwdFhTaXplIHZhbHVlPSI2NTAiLz4KKyAgICA8eVN1cGVyc2NyaXB0WVNpemUgdmFsdWU9IjYwMCIvPgorICAgIDx5U3VwZXJzY3JpcHRYT2Zmc2V0IHZhbHVlPSIwIi8+CisgICAgPHlTdXBlcnNjcmlwdFlPZmZzZXQgdmFsdWU9IjM1MCIvPgorICAgIDx5U3RyaWtlb3V0U2l6ZSB2YWx1ZT0iNTAiLz4KKyAgICA8eVN0cmlrZW91dFBvc2l0aW9uIHZhbHVlPSIzMDAiLz4KKyAgICA8c0ZhbWlseUNsYXNzIHZhbHVlPSIwIi8+CisgICAgPHBhbm9zZT4KKyAgICAgIDxiRmFtaWx5VHlwZSB2YWx1ZT0iMCIvPgorICAgICAgPGJTZXJpZlN0eWxlIHZhbHVlPSIwIi8+CisgICAgICA8YldlaWdodCB2YWx1ZT0iNSIvPgorICAgICAgPGJQcm9wb3J0aW9uIHZhbHVlPSIwIi8+CisgICAgICA8YkNvbnRyYXN0IHZhbHVlPSIwIi8+CisgICAgICA8YlN0cm9rZVZhcmlhdGlvbiB2YWx1ZT0iMCIvPgorICAgICAgPGJBcm1TdHlsZSB2YWx1ZT0iMCIvPgorICAgICAgPGJMZXR0ZXJGb3JtIHZhbHVlPSIwIi8+CisgICAgICA8Yk1pZGxpbmUgdmFsdWU9IjAiLz4KKyAgICAgIDxiWEhlaWdodCB2YWx1ZT0iMCIvPgorICAgIDwvcGFub3NlPgorICAgIDx1bFVuaWNvZGVSYW5nZTEgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAxIi8+CisgICAgPHVsVW5pY29kZVJhbmdlMiB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAiLz4KKyAgICA8dWxVbmljb2RlUmFuZ2UzIHZhbHVlPSIwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCIvPgorICAgIDx1bFVuaWNvZGVSYW5nZTQgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIi8+CisgICAgPGFjaFZlbmRJRCB2YWx1ZT0iVUtXTiIvPgorICAgIDxmc1NlbGVjdGlvbiB2YWx1ZT0iMDAwMDAwMDAgMDAwMDAwMDEiLz4KKyAgICA8dXNGaXJzdENoYXJJbmRleCB2YWx1ZT0iMzIiLz4KKyAgICA8dXNMYXN0Q2hhckluZGV4IHZhbHVlPSIxMjIiLz4KKyAgICA8c1R5cG9Bc2NlbmRlciB2YWx1ZT0iODAwIi8+CisgICAgPHNUeXBvRGVzY2VuZGVyIHZhbHVlPSItMjAwIi8+CisgICAgPHNUeXBvTGluZUdhcCB2YWx1ZT0iMjAwIi8+CisgICAgPHVzV2luQXNjZW50IHZhbHVlPSIxMDAwIi8+CisgICAgPHVzV2luRGVzY2VudCB2YWx1ZT0iMjAwIi8+CisgICAgPHVsQ29kZVBhZ2VSYW5nZTEgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAxIi8+CisgICAgPHVsQ29kZVBhZ2VSYW5nZTIgdmFsdWU9IjAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIi8+CisgICAgPHN4SGVpZ2h0IHZhbHVlPSI1MDAiLz4KKyAgICA8c0NhcEhlaWdodCB2YWx1ZT0iNzAwIi8+CisgICAgPHVzRGVmYXVsdENoYXIgdmFsdWU9IjAiLz4KKyAgICA8dXNCcmVha0NoYXIgdmFsdWU9IjMyIi8+CisgICAgPHVzTWF4Q29udGV4dCB2YWx1ZT0iMCIvPgorICA8L09TXzI+CisKKyAgPGhtdHg+CisgICAgPG10eCBuYW1lPSIubm90ZGVmIiB3aWR0aD0iNTAwIiBsc2I9IjkzIi8+CisgICAgPG10eCBuYW1lPSIxZW0iIHdpZHRoPSIxMDAwIiBsc2I9IjkzIi8+CisgICAgPG10eCBuYW1lPSIzZW0iIHdpZHRoPSIzMDAwIiBsc2I9IjkzIi8+CisgIDwvaG10eD4KKworICA8Y21hcD4KKyAgICA8dGFibGVWZXJzaW9uIHZlcnNpb249IjAiLz4KKyAgICA8Y21hcF9mb3JtYXRfNCBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEwIiBsYW5ndWFnZT0iMCI+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDYxIiBuYW1lPSIxZW0iIC8+IDwhLS0gYSAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjIiIG5hbWU9IjFlbSIgLz4gPCEtLSBiIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2MyIgbmFtZT0iMWVtIiAvPiA8IS0tIGMgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDY0IiBuYW1lPSIxZW0iIC8+IDwhLS0gZCAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjUiIG5hbWU9IjFlbSIgLz4gPCEtLSBlIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2NiIgbmFtZT0iMWVtIiAvPiA8IS0tIGYgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDY3IiBuYW1lPSIxZW0iIC8+IDwhLS0gZyAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNjgiIG5hbWU9IjFlbSIgLz4gPCEtLSBoIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2OSIgbmFtZT0iMWVtIiAvPiA8IS0tIGkgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDZBIiBuYW1lPSIxZW0iIC8+IDwhLS0gaiAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNkIiIG5hbWU9IjFlbSIgLz4gPCEtLSBrIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2QyIgbmFtZT0iMWVtIiAvPiA8IS0tIGwgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDZEIiBuYW1lPSIxZW0iIC8+IDwhLS0gbSAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNkUiIG5hbWU9IjFlbSIgLz4gPCEtLSBuIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA2RiIgbmFtZT0iMWVtIiAvPiA8IS0tIG8gLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDcwIiBuYW1lPSIxZW0iIC8+IDwhLS0gcCAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzEiIG5hbWU9IjFlbSIgLz4gPCEtLSBxIC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3MiIgbmFtZT0iM2VtIiAvPiA8IS0tIHIgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDczIiBuYW1lPSIxZW0iIC8+IDwhLS0gcyAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzQiIG5hbWU9IjFlbSIgLz4gPCEtLSB0IC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3NSIgbmFtZT0iMWVtIiAvPiA8IS0tIHUgLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDc2IiBuYW1lPSIxZW0iIC8+IDwhLS0gdiAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwNzciIG5hbWU9IjFlbSIgLz4gPCEtLSB3IC0tPgorICAgICAgICA8bWFwIGNvZGU9IjB4MDA3OCIgbmFtZT0iMWVtIiAvPiA8IS0tIHggLS0+CisgICAgICAgIDxtYXAgY29kZT0iMHgwMDc5IiBuYW1lPSIxZW0iIC8+IDwhLS0geSAtLT4KKyAgICAgICAgPG1hcCBjb2RlPSIweDAwN0EiIG5hbWU9IjFlbSIgLz4gPCEtLSB6IC0tPgorICAgIDwvY21hcF9mb3JtYXRfND4KKyAgPC9jbWFwPgorCisgIDxsb2NhPgorICAgIDwhLS0gVGhlICdsb2NhJyB0YWJsZSB3aWxsIGJlIGNhbGN1bGF0ZWQgYnkgdGhlIGNvbXBpbGVyIC0tPgorICA8L2xvY2E+CisKKyAgPGdseWY+CisgICAgPFRUR2x5cGggbmFtZT0iLm5vdGRlZiIgeE1pbj0iMCIgeU1pbj0iMCIgeE1heD0iMCIgeU1heD0iMCIgLz4KKyAgICA8VFRHbHlwaCBuYW1lPSIxZW0iIHhNaW49IjAiIHlNaW49IjAiIHhNYXg9IjAiIHlNYXg9IjAiIC8+CisgICAgPFRUR2x5cGggbmFtZT0iM2VtIiB4TWluPSIwIiB5TWluPSIwIiB4TWF4PSIwIiB5TWF4PSIwIiAvPgorICA8L2dseWY+CisKKyAgPG5hbWU+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSIwIiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAgICA8L25hbWVyZWNvcmQ+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSIxIiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgU2FtcGxlIEZvbnQKKyAgICA8L25hbWVyZWNvcmQ+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSIyIiBwbGF0Zm9ybUlEPSIzIiBwbGF0RW5jSUQ9IjEiIGxhbmdJRD0iMHg0MDkiPgorICAgICAgUmVndWxhcgorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjQiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBTYW1wbGUgRm9udAorICAgIDwvbmFtZXJlY29yZD4KKyAgICA8bmFtZXJlY29yZCBuYW1lSUQ9IjYiIHBsYXRmb3JtSUQ9IjMiIHBsYXRFbmNJRD0iMSIgbGFuZ0lEPSIweDQwOSI+CisgICAgICBTYW1wbGVGb250LVJlZ3VsYXIKKyAgICA8L25hbWVyZWNvcmQ+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSIxMyIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUworICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAgICA8L25hbWVyZWNvcmQ+CisgICAgPG5hbWVyZWNvcmQgbmFtZUlEPSIxNCIgcGxhdGZvcm1JRD0iMyIgcGxhdEVuY0lEPSIxIiBsYW5nSUQ9IjB4NDA5Ij4KKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgIDwvbmFtZXJlY29yZD4KKyAgPC9uYW1lPgorCisgIDxwb3N0PgorICAgIDxmb3JtYXRUeXBlIHZhbHVlPSIzLjAiLz4KKyAgICA8aXRhbGljQW5nbGUgdmFsdWU9IjAuMCIvPgorICAgIDx1bmRlcmxpbmVQb3NpdGlvbiB2YWx1ZT0iLTc1Ii8+CisgICAgPHVuZGVybGluZVRoaWNrbmVzcyB2YWx1ZT0iNTAiLz4KKyAgICA8aXNGaXhlZFBpdGNoIHZhbHVlPSIwIi8+CisgICAgPG1pbk1lbVR5cGU0MiB2YWx1ZT0iMCIvPgorICAgIDxtYXhNZW1UeXBlNDIgdmFsdWU9IjAiLz4KKyAgICA8bWluTWVtVHlwZTEgdmFsdWU9IjAiLz4KKyAgICA8bWF4TWVtVHlwZTEgdmFsdWU9IjAiLz4KKyAgPC9wb3N0PgorCis8L3R0Rm9udD4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvZm9udC9hc2NpaV9hM2VtX3dlaWdodDEwMF91cHJpZ2h0LnR0ZiBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvZm9udC9hc2NpaV9hM2VtX3dlaWdodDEwMF91cHJpZ2h0LnR0ZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2NmMGM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3Jlcy9mb250L2FzY2lpX2EzZW1fd2VpZ2h0MTAwX3VwcmlnaHQudHRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvZm9udC9hc2NpaV9iM2VtX3dlaWdodDEwMF9pdGFsaWMudHRmIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3Jlcy9mb250L2FzY2lpX2IzZW1fd2VpZ2h0MTAwX2l0YWxpYy50dGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZlZDNjZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvZm9udC9hc2NpaV9iM2VtX3dlaWdodDEwMF9pdGFsaWMudHRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvZm9udC9hc2NpaV9jM2VtX3dlaWdodDIwMF91cHJpZ2h0LnR0ZiBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvZm9udC9hc2NpaV9jM2VtX3dlaWdodDIwMF91cHJpZ2h0LnR0ZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjRhYWY3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3Jlcy9mb250L2FzY2lpX2MzZW1fd2VpZ2h0MjAwX3VwcmlnaHQudHRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvZm9udC9hc2NpaV9kM2VtX3dlaWdodDIwMF9pdGFsaWMudHRmIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3Jlcy9mb250L2FzY2lpX2QzZW1fd2VpZ2h0MjAwX2l0YWxpYy50dGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYxMDYwZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvZm9udC9hc2NpaV9kM2VtX3dlaWdodDIwMF9pdGFsaWMudHRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvZm9udC9hc2NpaV9lM2VtX3dlaWdodDMwMF91cHJpZ2h0LnR0ZiBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvZm9udC9hc2NpaV9lM2VtX3dlaWdodDMwMF91cHJpZ2h0LnR0ZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDVhZTI4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3Jlcy9mb250L2FzY2lpX2UzZW1fd2VpZ2h0MzAwX3VwcmlnaHQudHRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvZm9udC9hc2NpaV9mM2VtX3dlaWdodDMwMF9pdGFsaWMudHRmIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3Jlcy9mb250L2FzY2lpX2YzZW1fd2VpZ2h0MzAwX2l0YWxpYy50dGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcxNjk4MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvZm9udC9hc2NpaV9mM2VtX3dlaWdodDMwMF9pdGFsaWMudHRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvZm9udC9hc2NpaV9nM2VtX3dlaWdodDQwMF91cHJpZ2h0LnR0ZiBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvZm9udC9hc2NpaV9nM2VtX3dlaWdodDQwMF91cHJpZ2h0LnR0ZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2UyNWE4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3Jlcy9mb250L2FzY2lpX2czZW1fd2VpZ2h0NDAwX3VwcmlnaHQudHRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvZm9udC9hc2NpaV9oM2VtX3dlaWdodDQwMF9pdGFsaWMudHRmIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3Jlcy9mb250L2FzY2lpX2gzZW1fd2VpZ2h0NDAwX2l0YWxpYy50dGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRkMzExMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvZm9udC9hc2NpaV9oM2VtX3dlaWdodDQwMF9pdGFsaWMudHRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvZm9udC9hc2NpaV9pM2VtX3dlaWdodDUwMF91cHJpZ2h0LnR0ZiBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvZm9udC9hc2NpaV9pM2VtX3dlaWdodDUwMF91cHJpZ2h0LnR0ZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTk1YzhlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3Jlcy9mb250L2FzY2lpX2kzZW1fd2VpZ2h0NTAwX3VwcmlnaHQudHRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvZm9udC9hc2NpaV9qM2VtX3dlaWdodDUwMF9pdGFsaWMudHRmIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3Jlcy9mb250L2FzY2lpX2ozZW1fd2VpZ2h0NTAwX2l0YWxpYy50dGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE5NTMyZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvZm9udC9hc2NpaV9qM2VtX3dlaWdodDUwMF9pdGFsaWMudHRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvZm9udC9hc2NpaV9rM2VtX3dlaWdodDYwMF91cHJpZ2h0LnR0ZiBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvZm9udC9hc2NpaV9rM2VtX3dlaWdodDYwMF91cHJpZ2h0LnR0ZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGU0ZDY2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3Jlcy9mb250L2FzY2lpX2szZW1fd2VpZ2h0NjAwX3VwcmlnaHQudHRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvZm9udC9hc2NpaV9sM2VtX3dlaWdodDYwMF9pdGFsaWMudHRmIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3Jlcy9mb250L2FzY2lpX2wzZW1fd2VpZ2h0NjAwX2l0YWxpYy50dGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ5ZmNkMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvZm9udC9hc2NpaV9sM2VtX3dlaWdodDYwMF9pdGFsaWMudHRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvZm9udC9hc2NpaV9tM2VtX3dlaWdodDcwMF91cHJpZ2h0LnR0ZiBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvZm9udC9hc2NpaV9tM2VtX3dlaWdodDcwMF91cHJpZ2h0LnR0ZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDZiNTkxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3Jlcy9mb250L2FzY2lpX20zZW1fd2VpZ2h0NzAwX3VwcmlnaHQudHRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvZm9udC9hc2NpaV9uM2VtX3dlaWdodDcwMF9pdGFsaWMudHRmIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3Jlcy9mb250L2FzY2lpX24zZW1fd2VpZ2h0NzAwX2l0YWxpYy50dGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZjZmVhNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvZm9udC9hc2NpaV9uM2VtX3dlaWdodDcwMF9pdGFsaWMudHRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvZm9udC9hc2NpaV9vM2VtX3dlaWdodDgwMF91cHJpZ2h0LnR0ZiBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvZm9udC9hc2NpaV9vM2VtX3dlaWdodDgwMF91cHJpZ2h0LnR0ZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDlhY2QyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3Jlcy9mb250L2FzY2lpX28zZW1fd2VpZ2h0ODAwX3VwcmlnaHQudHRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvZm9udC9hc2NpaV9wM2VtX3dlaWdodDgwMF9pdGFsaWMudHRmIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3Jlcy9mb250L2FzY2lpX3AzZW1fd2VpZ2h0ODAwX2l0YWxpYy50dGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZmMjA4MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvZm9udC9hc2NpaV9wM2VtX3dlaWdodDgwMF9pdGFsaWMudHRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvZm9udC9hc2NpaV9xM2VtX3dlaWdodDkwMF91cHJpZ2h0LnR0ZiBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvZm9udC9hc2NpaV9xM2VtX3dlaWdodDkwMF91cHJpZ2h0LnR0ZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2MzZjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3Jlcy9mb250L2FzY2lpX3EzZW1fd2VpZ2h0OTAwX3VwcmlnaHQudHRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvZm9udC9hc2NpaV9yM2VtX3dlaWdodDkwMF9pdGFsaWMudHRmIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3Jlcy9mb250L2FzY2lpX3IzZW1fd2VpZ2h0OTAwX2l0YWxpYy50dGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBiMDY3MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvZm9udC9hc2NpaV9yM2VtX3dlaWdodDkwMF9pdGFsaWMudHRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvZm9udC9mdWxsZmFtaWx5LnhtbCBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvZm9udC9mdWxsZmFtaWx5LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDBiYzg3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3Jlcy9mb250L2Z1bGxmYW1pbHkueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Zm9udC1mYW1pbHkgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8Zm9udCBhbmRyb2lkOmZvbnQ9IkBmb250L2FzY2lpX2EzZW1fd2VpZ2h0MTAwX3VwcmlnaHQiIC8+CisgICAgPGZvbnQgYW5kcm9pZDpmb250PSJAZm9udC9hc2NpaV9iM2VtX3dlaWdodDEwMF9pdGFsaWMiIC8+CisgICAgPGZvbnQgYW5kcm9pZDpmb250PSJAZm9udC9hc2NpaV9jM2VtX3dlaWdodDIwMF91cHJpZ2h0IiAvPgorICAgIDxmb250IGFuZHJvaWQ6Zm9udD0iQGZvbnQvYXNjaWlfZDNlbV93ZWlnaHQyMDBfaXRhbGljIiAvPgorICAgIDxmb250IGFuZHJvaWQ6Zm9udD0iQGZvbnQvYXNjaWlfZTNlbV93ZWlnaHQzMDBfdXByaWdodCIgLz4KKyAgICA8Zm9udCBhbmRyb2lkOmZvbnQ9IkBmb250L2FzY2lpX2YzZW1fd2VpZ2h0MzAwX2l0YWxpYyIgLz4KKyAgICA8Zm9udCBhbmRyb2lkOmZvbnQ9IkBmb250L2FzY2lpX2czZW1fd2VpZ2h0NDAwX3VwcmlnaHQiIC8+CisgICAgPGZvbnQgYW5kcm9pZDpmb250PSJAZm9udC9hc2NpaV9oM2VtX3dlaWdodDQwMF9pdGFsaWMiIC8+CisgICAgPGZvbnQgYW5kcm9pZDpmb250PSJAZm9udC9hc2NpaV9pM2VtX3dlaWdodDUwMF91cHJpZ2h0IiAvPgorICAgIDxmb250IGFuZHJvaWQ6Zm9udD0iQGZvbnQvYXNjaWlfajNlbV93ZWlnaHQ1MDBfaXRhbGljIiAvPgorICAgIDxmb250IGFuZHJvaWQ6Zm9udD0iQGZvbnQvYXNjaWlfazNlbV93ZWlnaHQ2MDBfdXByaWdodCIgLz4KKyAgICA8Zm9udCBhbmRyb2lkOmZvbnQ9IkBmb250L2FzY2lpX2wzZW1fd2VpZ2h0NjAwX2l0YWxpYyIgLz4KKyAgICA8Zm9udCBhbmRyb2lkOmZvbnQ9IkBmb250L2FzY2lpX20zZW1fd2VpZ2h0NzAwX3VwcmlnaHQiIC8+CisgICAgPGZvbnQgYW5kcm9pZDpmb250PSJAZm9udC9hc2NpaV9uM2VtX3dlaWdodDcwMF9pdGFsaWMiIC8+CisgICAgPGZvbnQgYW5kcm9pZDpmb250PSJAZm9udC9hc2NpaV9vM2VtX3dlaWdodDgwMF91cHJpZ2h0IiAvPgorICAgIDxmb250IGFuZHJvaWQ6Zm9udD0iQGZvbnQvYXNjaWlfcDNlbV93ZWlnaHQ4MDBfaXRhbGljIiAvPgorICAgIDxmb250IGFuZHJvaWQ6Zm9udD0iQGZvbnQvYXNjaWlfcTNlbV93ZWlnaHQ5MDBfdXByaWdodCIgLz4KKyAgICA8Zm9udCBhbmRyb2lkOmZvbnQ9IkBmb250L2FzY2lpX3IzZW1fd2VpZ2h0OTAwX2l0YWxpYyIgLz4KKzwvZm9udC1mYW1pbHk+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy93aWRnZXQvcmVzL2xheW91dC9hdXRvY29tcGxldGV0ZXh0dmlld19sYXlvdXQueG1sIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3Jlcy9sYXlvdXQvYXV0b2NvbXBsZXRldGV4dHZpZXdfbGF5b3V0LnhtbAppbmRleCA3OTNkZmIwLi4zMmVlZmI3IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy93aWRnZXQvcmVzL2xheW91dC9hdXRvY29tcGxldGV0ZXh0dmlld19sYXlvdXQueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvbGF5b3V0L2F1dG9jb21wbGV0ZXRleHR2aWV3X2xheW91dC54bWwKQEAgLTE4LDYgKzE4LDcgQEAKICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgogICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KKyAgICA8cmVxdWVzdEZvY3VzIC8+CiAKICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9hdXRvY29tcGxldGV0dl90aXRsZSIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvbGF5b3V0L2xpbmVhcmxheW91dF96ZXJvX3dlaWdodF9ob3Jpem9udGFsLnhtbCBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvbGF5b3V0L2xpbmVhcmxheW91dF96ZXJvX3dlaWdodF9ob3Jpem9udGFsLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTc4Y2I3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3Jlcy9sYXlvdXQvbGluZWFybGF5b3V0X3plcm9fd2VpZ2h0X2hvcml6b250YWwueG1sCkBAIC0wLDAgKzEsNjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+Cis8RnJhbWVMYXlvdXQKKyAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCI+CisKKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY29udGFpbmVyMSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjEwMGRwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCI+CisKKyAgICAgICAgPExpbmVhckxheW91dAorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC92aWV3MSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZHAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGFuZHJvaWQ6Y29sb3IvaG9sb19ncmVlbl9saWdodCI+CisgICAgICAgICAgICA8VmlldworICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIzMGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMTBkcCIgLz4KKyAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICAgICAgPExpbmVhckxheW91dAorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC92aWV3MiIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZHAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGFuZHJvaWQ6Y29sb3IvaG9sb19vcmFuZ2VfbGlnaHQiPgorICAgICAgICAgICAgPFZpZXcKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMzBkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjEwZHAiIC8+CisgICAgICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdmlldzMiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgorICAgICAgICAgICAgPFZpZXcKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMTAwZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxMGRwIiAvPgorICAgICAgICA8L0xpbmVhckxheW91dD4KKworICAgIDwvTGluZWFyTGF5b3V0PgorCis8L0ZyYW1lTGF5b3V0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3Jlcy9sYXlvdXQvbGluZWFybGF5b3V0X3plcm9fd2VpZ2h0X3ZlcnRpY2FsLnhtbCBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvbGF5b3V0L2xpbmVhcmxheW91dF96ZXJvX3dlaWdodF92ZXJ0aWNhbC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU1MGQ3MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvbGF5b3V0L2xpbmVhcmxheW91dF96ZXJvX3dlaWdodF92ZXJ0aWNhbC54bWwKQEAgLTAsMCArMSw2MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0LgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKzxGcmFtZUxheW91dAorICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50Ij4KKworICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9jb250YWluZXIxIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjEwMGRwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+CisKKyAgICAgICAgPExpbmVhckxheW91dAorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC92aWV3MSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMGRwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGFuZHJvaWQ6Y29sb3IvaG9sb19ncmVlbl9saWdodCI+CisgICAgICAgICAgICA8VmlldworICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMzBkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMTBkcCIvPgorICAgICAgICA8L0xpbmVhckxheW91dD4KKworICAgICAgICA8TGluZWFyTGF5b3V0CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3ZpZXcyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZHAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAYW5kcm9pZDpjb2xvci9ob2xvX29yYW5nZV9saWdodCI+CisgICAgICAgICAgICA8VmlldworICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMzBkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMTBkcCIvPgorICAgICAgICA8L0xpbmVhckxheW91dD4KKworICAgICAgICA8TGluZWFyTGF5b3V0CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3ZpZXczIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50Ij4KKyAgICAgICAgICAgIDxWaWV3CisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxMDBkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMTBkcCIvPgorICAgICAgICA8L0xpbmVhckxheW91dD4KKworICAgIDwvTGluZWFyTGF5b3V0PgorCis8L0ZyYW1lTGF5b3V0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3Jlcy9sYXlvdXQvbGlzdF9wb3B1cF93aW5kb3cueG1sIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3Jlcy9sYXlvdXQvbGlzdF9wb3B1cF93aW5kb3cueG1sCmluZGV4IGJjZjU4OTMuLmZkOWRjZGYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvbGF5b3V0L2xpc3RfcG9wdXBfd2luZG93LnhtbAorKysgYi90ZXN0cy90ZXN0cy93aWRnZXQvcmVzL2xheW91dC9saXN0X3BvcHVwX3dpbmRvdy54bWwKQEAgLTE5LDYgKzE5LDcgQEAKICAgICBhbmRyb2lkOmlkPSJAK2lkL21haW5fY29udGFpbmVyIgogICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCiAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiPgorICAgIDxyZXF1ZXN0Rm9jdXMgLz4KIAogICAgIDxhbmRyb2lkLndpZGdldC5jdHMuTW9ja1ZpZXdGb3JMaXN0UG9wdXBXaW5kb3cKICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hbmNob3JfdXBwZXJfbGVmdCIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvbGF5b3V0L21hZ25pZmllcl9hY3Rpdml0eV9iYXNpY19sYXlvdXQueG1sIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3Jlcy9sYXlvdXQvbWFnbmlmaWVyX2FjdGl2aXR5X2Jhc2ljX2xheW91dC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjczNmU0OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvbGF5b3V0L21hZ25pZmllcl9hY3Rpdml0eV9iYXNpY19sYXlvdXQueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgIH4gQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAgfgorICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgfgorICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIH4KKyAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAgLS0+CisKKzxMaW5lYXJMYXlvdXQKKyAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDppZD0iQCtpZC9tYWduaWZpZXJfYWN0aXZpdHlfYmFzaWNfbGF5b3V0IgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy93aWRnZXQvcmVzL2xheW91dC9tYWduaWZpZXJfYWN0aXZpdHlfZm91cl9xdWFkcmFudHNfbGF5b3V0LnhtbCBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvbGF5b3V0L21hZ25pZmllcl9hY3Rpdml0eV9mb3VyX3F1YWRyYW50c19sYXlvdXQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNDA0OTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy93aWRnZXQvcmVzL2xheW91dC9tYWduaWZpZXJfYWN0aXZpdHlfZm91cl9xdWFkcmFudHNfbGF5b3V0LnhtbApAQCAtMCwwICsxLDU5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICB+IENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgIH4KKyAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIH4KKyAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICB+CisgIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgIC0tPgorCis8TGluZWFyTGF5b3V0CisgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6aWQ9IkAraWQvbWFnbmlmaWVyX2FjdGl2aXR5X2ZvdXJfcXVhZHJhbnRzX2xheW91dCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIiA+CisKKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEuMCIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIgPgorICAgICAgICA8RnJhbWVMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbWFnbmlmaWVyX2FjdGl2aXR5X2ZvdXJfcXVhZHJhbnRzX2xheW91dF9xdWFkcmFudF8xIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxLjAiCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBhbmRyb2lkOmNvbG9yL2hvbG9fYmx1ZV9icmlnaHQiIC8+CisgICAgICAgIDxGcmFtZUxheW91dAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxLjAiCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBhbmRyb2lkOmNvbG9yL2hvbG9fZ3JlZW5fbGlnaHQiIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEuMCIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIgPgorICAgICAgICA8RnJhbWVMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMS4wIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAYW5kcm9pZDpjb2xvci9ob2xvX29yYW5nZV9saWdodCIgLz4KKyAgICAgICAgPEZyYW1lTGF5b3V0CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEuMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGFuZHJvaWQ6Y29sb3IvaG9sb19yZWRfbGlnaHQiIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvbGF5b3V0L3RleHRjbG9ja19sYXlvdXQueG1sIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3Jlcy9sYXlvdXQvdGV4dGNsb2NrX2xheW91dC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFhY2NlOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvbGF5b3V0L3RleHRjbG9ja19sYXlvdXQueG1sCkBAIC0wLDAgKzEsMjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPFRleHRDbG9jaworICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmlkPSJAK2lkL3RleHRjbG9jayIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ii8+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy93aWRnZXQvcmVzL2xheW91dC90ZXh0dmlld19mYWxsYmFja2xpbmVzcGFjaW5nX2xheW91dC54bWwgYi90ZXN0cy90ZXN0cy93aWRnZXQvcmVzL2xheW91dC90ZXh0dmlld19mYWxsYmFja2xpbmVzcGFjaW5nX2xheW91dC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg0ZDgyMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvbGF5b3V0L3RleHR2aWV3X2ZhbGxiYWNrbGluZXNwYWNpbmdfbGF5b3V0LnhtbApAQCAtMCwwICsxLDUyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9sYXlvdXRfdGV4dHZpZXd0ZXN0IgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+CisKKyAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90ZXh0dmlld190cnVlIgorICAgICAgICAgICAgICBhbmRyb2lkOmZhbGxiYWNrTGluZVNwYWNpbmc9InRydWUiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ii8+CisKKyAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90ZXh0dmlld19mYWxzZSIKKyAgICAgICAgICAgICAgYW5kcm9pZDpmYWxsYmFja0xpbmVTcGFjaW5nPSJmYWxzZSIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiLz4KKworICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RleHR2aWV3X2RlZmF1bHQiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ii8+CisKKyAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90ZXh0dmlld19zdHlsZV90cnVlIgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5GYWxsYmFja0xpbmVTcGFjaW5nVHJ1ZSIvPgorCisgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGV4dHZpZXdfc3R5bGVfZmFsc2UiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLkZhbGxiYWNrTGluZVNwYWNpbmdGYWxzZSIvPgorCisgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGV4dHZpZXdfc3R5bGVfZGVmYXVsdCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UiLz4KKworPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy93aWRnZXQvcmVzL2xheW91dC90ZXh0dmlld19sYXlvdXQueG1sIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3Jlcy9sYXlvdXQvdGV4dHZpZXdfbGF5b3V0LnhtbAppbmRleCBkMzExZDc1Li44Njg4MmRlIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy93aWRnZXQvcmVzL2xheW91dC90ZXh0dmlld19sYXlvdXQueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvbGF5b3V0L3RleHR2aWV3X2xheW91dC54bWwKQEAgLTQ2LDEyICs0NiwxNCBAQAogICAgICAgICAgICAgPFRleHRWaWV3CiAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90ZXh0dmlld19wYXNzd29yZCIKICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhc3N3b3JkPSJ0cnVlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bWluV2lkdGg9IjFkcCIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ii8+CiAKICAgICAgICAgICAgIDxUZXh0VmlldwogICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGV4dHZpZXdfc2luZ2xlTGluZSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDptaW5XaWR0aD0iMWRwIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiLz4KIApAQCAtNTksMTIgKzYxLDE0IEBACiAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90ZXh0dmlld190ZXh0IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy90ZXh0X3ZpZXdfaGVsbG8iCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpicmVha1N0cmF0ZWd5PSJzaW1wbGUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDptaW5XaWR0aD0iMWRwIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiLz4KIAogICAgICAgICAgICAgPFRleHRWaWV3CiAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90ZXh0dmlld190ZXh0X3R3b19saW5lcyIKICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvdGV4dF92aWV3X2hlbGxvX3R3b19saW5lcyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm1pbldpZHRoPSIxZHAiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIvPgogCkBAIC0zODMsNiArMzg3LDY2IEBACiAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3NhbXBsZV90ZXh0IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6anVzdGlmaWNhdGlvbk1vZGU9ImludGVyX3dvcmQiIC8+CiAKKyAgICAgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGV4dHZpZXdfdGV4dGFwcGVhcmFuY2VfYXR0cnMxIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3NhbXBsZV90ZXh0IgorICAgICAgICAgICAgICAgIHN0eWxlPSJAbnVsbCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuWG1sMSIgLz4KKworICAgICAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90ZXh0dmlld190ZXh0YXBwZWFyYW5jZV9hdHRyczIiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc2FtcGxlX3RleHQiCisgICAgICAgICAgICAgICAgc3R5bGU9IkBudWxsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5YbWwyIiAvPgorCisgICAgICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RleHR2aWV3X3RleHRhcHBlYXJhbmNlX2F0dHJzMyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9zYW1wbGVfdGV4dCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuWG1sMiIKKyAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLlhtbDMiIC8+CisKKyAgICAgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGV4dHZpZXdfdGV4dGFwcGVhcmFuY2VfYXR0cnM0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3NhbXBsZV90ZXh0IgorICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuWG1sMyIgLz4KKworICAgICAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90ZXh0dmlld190ZXh0YXBwZWFyYW5jZV9hdHRyc19hbGxjYXBzX3Bhc3N3b3JkIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3NhbXBsZV90ZXh0IgorICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvQWxsQ2Fwc1Bhc3N3b3JkIiAvPgorCisgICAgICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RleHR2aWV3X3RleHRhcHBlYXJhbmNlX2F0dHJzX3NlcmlmX2ZvbnRmYW1pbHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc2FtcGxlX3RleHQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0eXBlZmFjZT0ic2VyaWYiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLlhtbDIiIC8+CisKKyAgICAgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGV4dHZpZXdfYmFzZWxpbmUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc2FtcGxlX3RleHQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjBkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjEwZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSIxMGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6Zmlyc3RCYXNlbGluZVRvVG9wSGVpZ2h0PSJAZGltZW4vdGV4dHZpZXdfZmlyc3RCYXNlbGluZVRvVG9wSGVpZ2h0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFzdEJhc2VsaW5lVG9Cb3R0b21IZWlnaHQ9IkBkaW1lbi90ZXh0dmlld19sYXN0QmFzZWxpbmVUb0JvdHRvbUhlaWdodCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxpbmVTcGFjaW5nRXh0cmE9IjFkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxpbmVTcGFjaW5nTXVsdGlwbGllcj0iMC41IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGluZUhlaWdodD0iQGRpbWVuL3RleHR2aWV3X2xpbmVIZWlnaHQiIC8+CisKICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CiAKIDwvU2Nyb2xsVmlldz4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvbGF5b3V0L3RleHR2aWV3X3dlaWdodF90ZXN0X2xheW91dC54bWwgYi90ZXN0cy90ZXN0cy93aWRnZXQvcmVzL2xheW91dC90ZXh0dmlld193ZWlnaHRfdGVzdF9sYXlvdXQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NjRlYzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy93aWRnZXQvcmVzL2xheW91dC90ZXh0dmlld193ZWlnaHRfdGVzdF9sYXlvdXQueG1sCkBAIC0wLDAgKzEsMzE3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmZvbnRGYW1pbHk9IkBmb250L2Z1bGxmYW1pbHkiCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGV4dFZpZXdfd2VpZ2h0MTAwX3VwcmlnaHQiCisgICAgICAgIGFuZHJvaWQ6dGV4dEZvbnRXZWlnaHQ9IjEwMCIgLz4KKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6Zm9udEZhbWlseT0iQGZvbnQvZnVsbGZhbWlseSIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90ZXh0Vmlld193ZWlnaHQxMDBfaXRhbGljIgorICAgICAgICBhbmRyb2lkOnRleHRGb250V2VpZ2h0PSIxMDAiCisgICAgICAgIGFuZHJvaWQ6dGV4dFN0eWxlPSJpdGFsaWMiIC8+CisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmZvbnRGYW1pbHk9IkBmb250L2Z1bGxmYW1pbHkiCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGV4dEFwcGVhcmFuY2Vfd2VpZ2h0MTAwX3VwcmlnaHQiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5XZWlnaHQxMDBVcHJpZ2h0IiAvPgorICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpmb250RmFtaWx5PSJAZm9udC9mdWxsZmFtaWx5IgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RleHRBcHBlYXJhbmNlX3dlaWdodDEwMF9pdGFsaWMiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5XZWlnaHQxMDBJdGFsaWMiIC8+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6Zm9udEZhbWlseT0iQGZvbnQvZnVsbGZhbWlseSIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90ZXh0Vmlld193ZWlnaHQyMDBfdXByaWdodCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0Rm9udFdlaWdodD0iMjAwIiAvPgorICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpmb250RmFtaWx5PSJAZm9udC9mdWxsZmFtaWx5IgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RleHRWaWV3X3dlaWdodDIwMF9pdGFsaWMiCisgICAgICAgIGFuZHJvaWQ6dGV4dEZvbnRXZWlnaHQ9IjIwMCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U3R5bGU9Iml0YWxpYyIgLz4KKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6Zm9udEZhbWlseT0iQGZvbnQvZnVsbGZhbWlseSIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90ZXh0QXBwZWFyYW5jZV93ZWlnaHQyMDBfdXByaWdodCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLldlaWdodDIwMFVwcmlnaHQiIC8+CisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmZvbnRGYW1pbHk9IkBmb250L2Z1bGxmYW1pbHkiCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGV4dEFwcGVhcmFuY2Vfd2VpZ2h0MjAwX2l0YWxpYyIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLldlaWdodDIwMEl0YWxpYyIgLz4KKworICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpmb250RmFtaWx5PSJAZm9udC9mdWxsZmFtaWx5IgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RleHRWaWV3X3dlaWdodDMwMF91cHJpZ2h0IgorICAgICAgICBhbmRyb2lkOnRleHRGb250V2VpZ2h0PSIzMDAiIC8+CisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmZvbnRGYW1pbHk9IkBmb250L2Z1bGxmYW1pbHkiCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGV4dFZpZXdfd2VpZ2h0MzAwX2l0YWxpYyIKKyAgICAgICAgYW5kcm9pZDp0ZXh0Rm9udFdlaWdodD0iMzAwIgorICAgICAgICBhbmRyb2lkOnRleHRTdHlsZT0iaXRhbGljIiAvPgorICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpmb250RmFtaWx5PSJAZm9udC9mdWxsZmFtaWx5IgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RleHRBcHBlYXJhbmNlX3dlaWdodDMwMF91cHJpZ2h0IgorICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuV2VpZ2h0MzAwVXByaWdodCIgLz4KKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6Zm9udEZhbWlseT0iQGZvbnQvZnVsbGZhbWlseSIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90ZXh0QXBwZWFyYW5jZV93ZWlnaHQzMDBfaXRhbGljIgorICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuV2VpZ2h0MzAwSXRhbGljIiAvPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmZvbnRGYW1pbHk9IkBmb250L2Z1bGxmYW1pbHkiCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGV4dFZpZXdfd2VpZ2h0NDAwX3VwcmlnaHQiCisgICAgICAgIGFuZHJvaWQ6dGV4dEZvbnRXZWlnaHQ9IjQwMCIgLz4KKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6Zm9udEZhbWlseT0iQGZvbnQvZnVsbGZhbWlseSIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90ZXh0Vmlld193ZWlnaHQ0MDBfaXRhbGljIgorICAgICAgICBhbmRyb2lkOnRleHRGb250V2VpZ2h0PSI0MDAiCisgICAgICAgIGFuZHJvaWQ6dGV4dFN0eWxlPSJpdGFsaWMiIC8+CisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmZvbnRGYW1pbHk9IkBmb250L2Z1bGxmYW1pbHkiCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGV4dEFwcGVhcmFuY2Vfd2VpZ2h0NDAwX3VwcmlnaHQiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5XZWlnaHQ0MDBVcHJpZ2h0IiAvPgorICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpmb250RmFtaWx5PSJAZm9udC9mdWxsZmFtaWx5IgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RleHRBcHBlYXJhbmNlX3dlaWdodDQwMF9pdGFsaWMiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5XZWlnaHQ0MDBJdGFsaWMiIC8+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6Zm9udEZhbWlseT0iQGZvbnQvZnVsbGZhbWlseSIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90ZXh0Vmlld193ZWlnaHQ1MDBfdXByaWdodCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0Rm9udFdlaWdodD0iNTAwIiAvPgorICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpmb250RmFtaWx5PSJAZm9udC9mdWxsZmFtaWx5IgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RleHRWaWV3X3dlaWdodDUwMF9pdGFsaWMiCisgICAgICAgIGFuZHJvaWQ6dGV4dEZvbnRXZWlnaHQ9IjUwMCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U3R5bGU9Iml0YWxpYyIgLz4KKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6Zm9udEZhbWlseT0iQGZvbnQvZnVsbGZhbWlseSIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90ZXh0QXBwZWFyYW5jZV93ZWlnaHQ1MDBfdXByaWdodCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLldlaWdodDUwMFVwcmlnaHQiIC8+CisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmZvbnRGYW1pbHk9IkBmb250L2Z1bGxmYW1pbHkiCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGV4dEFwcGVhcmFuY2Vfd2VpZ2h0NTAwX2l0YWxpYyIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLldlaWdodDUwMEl0YWxpYyIgLz4KKworICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpmb250RmFtaWx5PSJAZm9udC9mdWxsZmFtaWx5IgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RleHRWaWV3X3dlaWdodDYwMF91cHJpZ2h0IgorICAgICAgICBhbmRyb2lkOnRleHRGb250V2VpZ2h0PSI2MDAiIC8+CisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmZvbnRGYW1pbHk9IkBmb250L2Z1bGxmYW1pbHkiCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGV4dFZpZXdfd2VpZ2h0NjAwX2l0YWxpYyIKKyAgICAgICAgYW5kcm9pZDp0ZXh0Rm9udFdlaWdodD0iNjAwIgorICAgICAgICBhbmRyb2lkOnRleHRTdHlsZT0iaXRhbGljIiAvPgorICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpmb250RmFtaWx5PSJAZm9udC9mdWxsZmFtaWx5IgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RleHRBcHBlYXJhbmNlX3dlaWdodDYwMF91cHJpZ2h0IgorICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuV2VpZ2h0NjAwVXByaWdodCIgLz4KKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6Zm9udEZhbWlseT0iQGZvbnQvZnVsbGZhbWlseSIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90ZXh0QXBwZWFyYW5jZV93ZWlnaHQ2MDBfaXRhbGljIgorICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuV2VpZ2h0NjAwSXRhbGljIiAvPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmZvbnRGYW1pbHk9IkBmb250L2Z1bGxmYW1pbHkiCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGV4dFZpZXdfd2VpZ2h0NzAwX3VwcmlnaHQiCisgICAgICAgIGFuZHJvaWQ6dGV4dEZvbnRXZWlnaHQ9IjcwMCIgLz4KKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6Zm9udEZhbWlseT0iQGZvbnQvZnVsbGZhbWlseSIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90ZXh0Vmlld193ZWlnaHQ3MDBfaXRhbGljIgorICAgICAgICBhbmRyb2lkOnRleHRGb250V2VpZ2h0PSI3MDAiCisgICAgICAgIGFuZHJvaWQ6dGV4dFN0eWxlPSJpdGFsaWMiIC8+CisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmZvbnRGYW1pbHk9IkBmb250L2Z1bGxmYW1pbHkiCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGV4dEFwcGVhcmFuY2Vfd2VpZ2h0NzAwX3VwcmlnaHQiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5XZWlnaHQ3MDBVcHJpZ2h0IiAvPgorICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpmb250RmFtaWx5PSJAZm9udC9mdWxsZmFtaWx5IgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RleHRBcHBlYXJhbmNlX3dlaWdodDcwMF9pdGFsaWMiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5XZWlnaHQ3MDBJdGFsaWMiIC8+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6Zm9udEZhbWlseT0iQGZvbnQvZnVsbGZhbWlseSIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90ZXh0Vmlld193ZWlnaHQ4MDBfdXByaWdodCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0Rm9udFdlaWdodD0iODAwIiAvPgorICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpmb250RmFtaWx5PSJAZm9udC9mdWxsZmFtaWx5IgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RleHRWaWV3X3dlaWdodDgwMF9pdGFsaWMiCisgICAgICAgIGFuZHJvaWQ6dGV4dEZvbnRXZWlnaHQ9IjgwMCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U3R5bGU9Iml0YWxpYyIgLz4KKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6Zm9udEZhbWlseT0iQGZvbnQvZnVsbGZhbWlseSIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90ZXh0QXBwZWFyYW5jZV93ZWlnaHQ4MDBfdXByaWdodCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLldlaWdodDgwMFVwcmlnaHQiIC8+CisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmZvbnRGYW1pbHk9IkBmb250L2Z1bGxmYW1pbHkiCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGV4dEFwcGVhcmFuY2Vfd2VpZ2h0ODAwX2l0YWxpYyIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLldlaWdodDgwMEl0YWxpYyIgLz4KKworICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpmb250RmFtaWx5PSJAZm9udC9mdWxsZmFtaWx5IgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RleHRWaWV3X3dlaWdodDkwMF91cHJpZ2h0IgorICAgICAgICBhbmRyb2lkOnRleHRGb250V2VpZ2h0PSI5MDAiIC8+CisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmZvbnRGYW1pbHk9IkBmb250L2Z1bGxmYW1pbHkiCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGV4dFZpZXdfd2VpZ2h0OTAwX2l0YWxpYyIKKyAgICAgICAgYW5kcm9pZDp0ZXh0Rm9udFdlaWdodD0iOTAwIgorICAgICAgICBhbmRyb2lkOnRleHRTdHlsZT0iaXRhbGljIiAvPgorICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpmb250RmFtaWx5PSJAZm9udC9mdWxsZmFtaWx5IgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RleHRBcHBlYXJhbmNlX3dlaWdodDkwMF91cHJpZ2h0IgorICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuV2VpZ2h0OTAwVXByaWdodCIgLz4KKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6Zm9udEZhbWlseT0iQGZvbnQvZnVsbGZhbWlseSIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90ZXh0QXBwZWFyYW5jZV93ZWlnaHQ5MDBfaXRhbGljIgorICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuV2VpZ2h0OTAwSXRhbGljIiAvPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmZvbnRGYW1pbHk9IkBmb250L2Z1bGxmYW1pbHkiCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGV4dFZpZXdfbm9ybWFsIgorICAgICAgICBhbmRyb2lkOnRleHRTdHlsZT0ibm9ybWFsIiAvPgorICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpmb250RmFtaWx5PSJAZm9udC9mdWxsZmFtaWx5IgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RleHRBcHBlYXJhbmNlX25vcm1hbCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLk5vcm1hbCIgLz4KKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6Zm9udEZhbWlseT0iQGZvbnQvZnVsbGZhbWlseSIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90ZXh0Vmlld19ib2xkIgorICAgICAgICBhbmRyb2lkOnRleHRTdHlsZT0iYm9sZCIgLz4KKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6Zm9udEZhbWlseT0iQGZvbnQvZnVsbGZhbWlseSIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90ZXh0QXBwZWFyYW5jZV9ib2xkIgorICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuQm9sZCIgLz4KKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6Zm9udEZhbWlseT0iQGZvbnQvZnVsbGZhbWlseSIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90ZXh0Vmlld19pdGFsaWMiCisgICAgICAgIGFuZHJvaWQ6dGV4dFN0eWxlPSJpdGFsaWMiIC8+CisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmZvbnRGYW1pbHk9IkBmb250L2Z1bGxmYW1pbHkiCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGV4dEFwcGVhcmFuY2VfaXRhbGljIgorICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuSXRhbGljIiAvPgorICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpmb250RmFtaWx5PSJAZm9udC9mdWxsZmFtaWx5IgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RleHRWaWV3X2JvbGRfaXRhbGljIgorICAgICAgICBhbmRyb2lkOnRleHRTdHlsZT0iYm9sZHxpdGFsaWMiIC8+CisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmZvbnRGYW1pbHk9IkBmb250L2Z1bGxmYW1pbHkiCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGV4dEFwcGVhcmFuY2VfYm9sZF9pdGFsaWMiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5Cb2xkSXRhbGljIiAvPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmZvbnRGYW1pbHk9IkBmb250L2Z1bGxmYW1pbHkiCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGV4dFZpZXdfd2VpZ2h0MTAwX2JvbGQiCisgICAgICAgIGFuZHJvaWQ6dGV4dEZvbnRXZWlnaHQ9IjEwMCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U3R5bGU9ImJvbGQiIC8+CisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmZvbnRGYW1pbHk9IkBmb250L2Z1bGxmYW1pbHkiCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGV4dEFwcGVhcmFuY2Vfd2VpZ2h0MTAwX2JvbGQiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5XZWlnaHQxMDBCb2xkIiAvPgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy93aWRnZXQvcmVzL21lbnUvcG9wdXBfbWVudS54bWwgYi90ZXN0cy90ZXN0cy93aWRnZXQvcmVzL21lbnUvcG9wdXBfbWVudS54bWwKaW5kZXggMjlkYWFkMC4uYTI2NTNiNCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3Jlcy9tZW51L3BvcHVwX21lbnUueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvbWVudS9wb3B1cF9tZW51LnhtbApAQCAtMTgsMTIgKzE4LDE0IEBACiAgICAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy9wb3B1cF9tZW51X2hpZ2hsaWdodCIKICAgICAgICAgICBhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbj0iQHN0cmluZy9wb3B1cF9tZW51X2hpZ2hsaWdodF9kZXNjcmlwdGlvbiIKICAgICAgICAgICBhbmRyb2lkOnRvb2x0aXBUZXh0PSJAc3RyaW5nL3BvcHVwX21lbnVfaGlnaGxpZ2h0X3Rvb2x0aXAiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fZWRpdCIKLSAgICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL3BvcHVwX21lbnVfZWRpdCIKLSAgICAgICAgICBhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbj0iQHN0cmluZy9wb3B1cF9tZW51X2VkaXRfZGVzY3JpcHRpb24iCi0gICAgICAgICAgYW5kcm9pZDp0b29sdGlwVGV4dD0iQHN0cmluZy9wb3B1cF9tZW51X2VkaXRfdG9vbHRpcCIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL2FjdGlvbl9kZWxldGUiCi0gICAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy9wb3B1cF9tZW51X2RlbGV0ZSIgLz4KKyAgICA8Z3JvdXAgYW5kcm9pZDppZD0iQCtpZC9ncm91cF90ZXN0MiI+CisgICAgICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX2VkaXQiCisgICAgICAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvcG9wdXBfbWVudV9lZGl0IgorICAgICAgICAgICAgICBhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbj0iQHN0cmluZy9wb3B1cF9tZW51X2VkaXRfZGVzY3JpcHRpb24iCisgICAgICAgICAgICAgIGFuZHJvaWQ6dG9vbHRpcFRleHQ9IkBzdHJpbmcvcG9wdXBfbWVudV9lZGl0X3Rvb2x0aXAiIC8+CisgICAgICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX2RlbGV0ZSIKKyAgICAgICAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy9wb3B1cF9tZW51X2RlbGV0ZSIgLz4KKyAgICA8L2dyb3VwPgogICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX2lnbm9yZSIKICAgICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL3BvcHVwX21lbnVfaWdub3JlIiAvPgogICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX3NoYXJlIgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3Jlcy92YWx1ZXMvZGltZW5zLnhtbCBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvdmFsdWVzL2RpbWVucy54bWwKaW5kZXggNGFlNzBkOC4uNjg1ZTJjMSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3Jlcy92YWx1ZXMvZGltZW5zLnhtbAorKysgYi90ZXN0cy90ZXN0cy93aWRnZXQvcmVzL3ZhbHVlcy9kaW1lbnMueG1sCkBAIC00NSw2ICs0NSwxMCBAQAogICAgIDxkaW1lbiBuYW1lPSJ0ZXh0dmlld19wYWRkaW5nX2JvdHRvbSI+NGRpcDwvZGltZW4+CiAgICAgPGRpbWVuIG5hbWU9InRleHR2aWV3X2RyYXdhYmxlX3BhZGRpbmciPjJkaXA8L2RpbWVuPgogCisgICAgPGRpbWVuIG5hbWU9InRleHR2aWV3X2ZpcnN0QmFzZWxpbmVUb1RvcEhlaWdodCI+MTAwZHA8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJ0ZXh0dmlld19sYXN0QmFzZWxpbmVUb0JvdHRvbUhlaWdodCI+MzBkcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9InRleHR2aWV3X2xpbmVIZWlnaHQiPjYwZHA8L2RpbWVuPgorCiAgICAgPGRpbWVuIG5hbWU9InJhZGlvZ3JvdXBfbWFyZ2luIj40ZGlwPC9kaW1lbj4KICAgICA8ZGltZW4gbmFtZT0ibGlzdHJvd19oZWlnaHQiPjQwZHA8L2RpbWVuPgogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy93aWRnZXQvcmVzL3ZhbHVlcy9zdHlsZXMueG1sIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3Jlcy92YWx1ZXMvc3R5bGVzLnhtbAppbmRleCBhNDdmMTY5Li4wOGU5NmZlIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy93aWRnZXQvcmVzL3ZhbHVlcy9zdHlsZXMueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9yZXMvdmFsdWVzL3N0eWxlcy54bWwKQEAgLTEwOSw2ICsxMDksMTU0IEBACiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFN0eWxlIj5ub3JtYWw8L2l0ZW0+CiAgICAgPC9zdHlsZT4KIAorICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5YbWwxIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U2l6ZSI+MjJweDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0eXBlZmFjZSI+c2FuczwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U3R5bGUiPml0YWxpYzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0QWxsQ2FwcyI+dHJ1ZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsZXR0ZXJTcGFjaW5nIj4yLjQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Zm9udEZlYXR1cmVTZXR0aW5ncyI+c21jcDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLlhtbDIiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmZvbnRGYW1pbHkiPm1vbm9zcGFjZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U3R5bGUiPm5vcm1hbDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzaGFkb3dDb2xvciI+QGRyYXdhYmxlL3JlZDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzaGFkb3dEeCI+MTAuMzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzaGFkb3dEeSI+MC41PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNoYWRvd1JhZGl1cyI+My4zPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmVsZWdhbnRUZXh0SGVpZ2h0Ij50cnVlPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuWG1sMyI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFNpemUiPjMycHg8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Zm9udEZhbWlseSI+c2VyaWY8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFN0eWxlIj5ib2xkPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRBbGxDYXBzIj5mYWxzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsZXR0ZXJTcGFjaW5nIj4yLjY8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c2hhZG93Q29sb3IiPkBkcmF3YWJsZS9ibHVlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNoYWRvd0R4Ij4xLjM8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c2hhZG93RHkiPjEwLjU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c2hhZG93UmFkaXVzIj41LjM8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6ZWxlZ2FudFRleHRIZWlnaHQiPmZhbHNlPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5GYWxsYmFja0xpbmVTcGFjaW5nRmFsc2UiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmZhbGxiYWNrTGluZVNwYWNpbmciPmZhbHNlPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuRmFsbGJhY2tMaW5lU3BhY2luZ1RydWUiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmZhbGxiYWNrTGluZVNwYWNpbmciPnRydWU8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5XZWlnaHQxMDBVcHJpZ2h0Ij4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Rm9udFdlaWdodCI+MTAwPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuV2VpZ2h0MjAwVXByaWdodCI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dEZvbnRXZWlnaHQiPjIwMDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLldlaWdodDMwMFVwcmlnaHQiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRGb250V2VpZ2h0Ij4zMDA8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5XZWlnaHQ0MDBVcHJpZ2h0Ij4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Rm9udFdlaWdodCI+NDAwPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuV2VpZ2h0NTAwVXByaWdodCI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dEZvbnRXZWlnaHQiPjUwMDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLldlaWdodDYwMFVwcmlnaHQiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRGb250V2VpZ2h0Ij42MDA8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5XZWlnaHQ3MDBVcHJpZ2h0Ij4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Rm9udFdlaWdodCI+NzAwPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuV2VpZ2h0ODAwVXByaWdodCI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dEZvbnRXZWlnaHQiPjgwMDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLldlaWdodDkwMFVwcmlnaHQiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRGb250V2VpZ2h0Ij45MDA8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5XZWlnaHQxMDBJdGFsaWMiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRGb250V2VpZ2h0Ij4xMDA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFN0eWxlIj5pdGFsaWM8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5XZWlnaHQyMDBJdGFsaWMiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRGb250V2VpZ2h0Ij4yMDA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFN0eWxlIj5pdGFsaWM8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5XZWlnaHQzMDBJdGFsaWMiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRGb250V2VpZ2h0Ij4zMDA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFN0eWxlIj5pdGFsaWM8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5XZWlnaHQ0MDBJdGFsaWMiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRGb250V2VpZ2h0Ij40MDA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFN0eWxlIj5pdGFsaWM8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5XZWlnaHQ1MDBJdGFsaWMiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRGb250V2VpZ2h0Ij41MDA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFN0eWxlIj5pdGFsaWM8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5XZWlnaHQ2MDBJdGFsaWMiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRGb250V2VpZ2h0Ij42MDA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFN0eWxlIj5pdGFsaWM8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5XZWlnaHQ3MDBJdGFsaWMiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRGb250V2VpZ2h0Ij43MDA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFN0eWxlIj5pdGFsaWM8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5XZWlnaHQ4MDBJdGFsaWMiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRGb250V2VpZ2h0Ij44MDA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFN0eWxlIj5pdGFsaWM8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5XZWlnaHQ5MDBJdGFsaWMiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRGb250V2VpZ2h0Ij45MDA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFN0eWxlIj5pdGFsaWM8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5Ob3JtYWwiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTdHlsZSI+bm9ybWFsPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuQm9sZCI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFN0eWxlIj5ib2xkPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuSXRhbGljIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U3R5bGUiPml0YWxpYzwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLkJvbGRJdGFsaWMiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTdHlsZSI+Ym9sZHxpdGFsaWM8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5XZWlnaHQxMDBCb2xkIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Rm9udFdlaWdodCI+MTAwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTdHlsZSI+Ym9sZDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IkFsbENhcHNQYXNzd29yZCI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dEFsbENhcHMiPnRydWU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6cGFzc3dvcmQiPnRydWU8L2l0ZW0+CisgICAgPC9zdHlsZT4KKwogICAgIDxzdHlsZSBuYW1lPSJUZXN0RW51bTEiPgogICAgICAgICA8aXRlbSBuYW1lPSJ0ZXN0RW51bSI+dmFsMTwvaXRlbT4KICAgICA8L3N0eWxlPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvQWJzTGlzdFZpZXdUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9BYnNMaXN0Vmlld1Rlc3QuamF2YQppbmRleCA1MWU2MTAyLi5jN2JkNTI3IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9BYnNMaXN0Vmlld1Rlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9BYnNMaXN0Vmlld1Rlc3QuamF2YQpAQCAtNDEsMTggKzQxLDEyIEBACiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CiBpbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLkxhcmdlVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5FZGl0YWJsZTsKIGltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcjsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwpAQCAtNjAsMTEgKzU0LDEzIEBACiBpbXBvcnQgYW5kcm9pZC51dGlsLlhtbDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnUuQ29udGV4dE1lbnVJbmZvOworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFic0xpc3RWaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFic0xpc3RWaWV3Lk9uU2Nyb2xsTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RBZGFwdGVyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OwpAQCAtNzIsNiArNjgsMTQgQEAKIGltcG9ydCBhbmRyb2lkLndpZGdldC5jdHMudXRpbC5UZXN0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuY3RzLnV0aWwuVGVzdFV0aWxzTWF0Y2hlcnM7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLkxhcmdlVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkN0c1RvdWNoVXRpbHM7CiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5Qb2xsaW5nQ2hlY2s7CiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5XaWRnZXRUZXN0VXRpbHM7CkBAIC00MTMsNiArNDE3LDUzIEBACiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0b3JPblNjcmVlbigpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICAvLyBsZWF2ZSB0b3VjaC1tb2RlCisgICAgICAgIG1JbnN0cnVtZW50YXRpb24uc2V0SW5Ub3VjaE1vZGUoZmFsc2UpOworICAgICAgICBzZXRBZGFwdGVyKCk7CisgICAgICAgIG1JbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7CisgICAgICAgIC8vIEVudGVyaW5nIHRvdWNoIG1vZGUgaGlkZXMgc2VsZWN0b3IKKyAgICAgICAgaWYgKG1Db250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCkuaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX1RPVUNIU0NSRUVOKSkgeworICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHdlJ3ZlIGxlZnQgdG91Y2htb2RlIChpbmNsdWRpbmcgbWVzc2FnZSBzZW5kaW5nLiBpbnN0cnVtZW50YXRpb24ganVzdCBzZXRzCisgICAgICAgICAgICAvLyBhIHZhcmlhYmxlIHdpdGhvdXQgYW55IGJyb2FkY2FzdCkuCisgICAgICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLnNlbmRLZXlEb3duVXBTeW5jKEtleUV2ZW50LktFWUNPREVfVEFCKTsKKyAgICAgICAgICAgIG1BY3Rpdml0eVJ1bGUucnVuT25VaVRocmVhZCgoKSAtPiB7CisgICAgICAgICAgICAgICAgbUxpc3RWaWV3LnJlcXVlc3RGb2N1cygpOworICAgICAgICAgICAgICAgIG1MaXN0Vmlldy5zZXRTZWxlY3Rpb25Gcm9tVG9wKDEsIDApOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLndhaXRGb3JJZGxlU3luYygpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1MaXN0Vmlldy5nZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpKTsKKyAgICAgICAgICAgIGZpbmFsIGludFtdIHB0ID0gbmV3IGludFsyXTsKKyAgICAgICAgICAgIG1MaXN0Vmlldy5nZXRMb2NhdGlvbk9uU2NyZWVuKHB0KTsKKyAgICAgICAgICAgIEN0c1RvdWNoVXRpbHMuZW11bGF0ZURyYWdHZXN0dXJlKG1JbnN0cnVtZW50YXRpb24sIHB0WzBdICsgMiwgcHRbMV0gKyAyLCAwLCAxMCk7CisgICAgICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLndhaXRGb3JJZGxlU3luYygpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEFkYXB0ZXJWaWV3LklOVkFMSURfUE9TSVRJT04sIG1MaXN0Vmlldy5nZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpKTsKKyAgICAgICAgICAgIC8vIGxlYXZlIHRvdWNoLW1vZGUKKyAgICAgICAgICAgIG1JbnN0cnVtZW50YXRpb24uc2VuZEtleURvd25VcFN5bmMoS2V5RXZlbnQuS0VZQ09ERV9UQUIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2Nyb2xsIG9mZi1zY3JlZW4gaGlkZXMgc2VsZWN0b3IsIGJ1dCBzaG93cyB1cCBhZ2FpbiB3aGVuIG9uLXNjcmVlbgorICAgICAgICBtQWN0aXZpdHlSdWxlLnJ1bk9uVWlUaHJlYWQoKCkgLT4geworICAgICAgICAgICAgbUxpc3RWaWV3LnJlcXVlc3RGb2N1cygpOworICAgICAgICAgICAgbUxpc3RWaWV3LnNldFNlbGVjdGlvbkZyb21Ub3AoMSwgMCk7CisgICAgICAgIH0pOworICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLndhaXRGb3JJZGxlU3luYygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbUxpc3RWaWV3LmdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCkpOworICAgICAgICBpbnQgc2VsVmlld0hlaWdodCA9IG1MaXN0Vmlldy5nZXRTZWxlY3RlZFZpZXcoKS5nZXRIZWlnaHQoKTsKKyAgICAgICAgZmluYWwgaW50W10gcHQgPSBuZXcgaW50WzJdOworICAgICAgICBtTGlzdFZpZXcuZ2V0TG9jYXRpb25PblNjcmVlbihwdCk7CisgICAgICAgIHB0WzBdICs9IG1MaXN0Vmlldy5nZXRXaWR0aCgpIC8gMjsKKyAgICAgICAgcHRbMV0gKz0gc2VsVmlld0hlaWdodCAvIDI7CisgICAgICAgIG1BY3Rpdml0eVJ1bGUucnVuT25VaVRocmVhZCgoKSAtPiBtTGlzdFZpZXcuc2Nyb2xsTGlzdEJ5KHNlbFZpZXdIZWlnaHQgKiAyKSk7CisgICAgICAgIG1JbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtTGlzdFZpZXcuZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1MaXN0Vmlldy5zaG91bGREcmF3U2VsZWN0b3IoKSk7CisgICAgICAgIG1BY3Rpdml0eVJ1bGUucnVuT25VaVRocmVhZCgoKSAtPiBtTGlzdFZpZXcuc2Nyb2xsTGlzdEJ5KC0oc2VsVmlld0hlaWdodCAqIDQpIC8gMykpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbUxpc3RWaWV3LmdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCkpOworICAgICAgICBhc3NlcnRUcnVlKG1MaXN0Vmlldy5zaG91bGREcmF3U2VsZWN0b3IoKSk7CisgICAgfQorCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0U2Nyb2xsSW5kaWNhdG9ycygpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBmaW5hbCBBY3Rpdml0eSBhY3Rpdml0eSA9IG1BY3Rpdml0eVJ1bGUuZ2V0QWN0aXZpdHkoKTsKICAgICAgICAgVGV4dFZpZXcgdHYxID0gKFRleHRWaWV3KSBhY3Rpdml0eS5maW5kVmlld0J5SWQoUi5pZC5oZWFkZXJ2aWV3MSk7CkBAIC03MTMsNyArNzY0LDcgQEAKICAgICAgICAgbUFjdGl2aXR5UnVsZS5ydW5PblVpVGhyZWFkKCgpIC0+IG1MaXN0Vmlldy5zZXRJdGVtQ2hlY2tlZCgwLCBmYWxzZSkpOwogICAgICAgICBhc3NlcnRGYWxzZShtTGlzdFZpZXcuaXNMYXlvdXRSZXF1ZXN0ZWQoKSk7CiAgICAgfQotCisgICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrUmVzdWx0ID0gZmFsc2U7CiAgICAgQE1lZGl1bVRlc3QKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRJdGVtQ2hlY2tlZF9tdWx0aXBsZU1vZGVEaWZmZXJlbnRWYWx1ZSgpIHRocm93cyBUaHJvd2FibGUgewpAQCAtNzIzLDggKzc3NCwxNSBAQAogICAgICAgICBtQWN0aXZpdHlSdWxlLnJ1bk9uVWlUaHJlYWQoKCkgLT4gbUxpc3RWaWV3LnNldEl0ZW1DaGVja2VkKDAsIGZhbHNlKSk7CiAgICAgICAgIG1JbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7CiAgICAgICAgIGFzc2VydEZhbHNlKG1MaXN0Vmlldy5pc0xheW91dFJlcXVlc3RlZCgpKTsKLSAgICAgICAgbUFjdGl2aXR5UnVsZS5ydW5PblVpVGhyZWFkKCgpIC0+IG1MaXN0Vmlldy5zZXRJdGVtQ2hlY2tlZCgwLCB0cnVlKSk7Ci0gICAgICAgIGFzc2VydFRydWUobUxpc3RWaWV3LmlzTGF5b3V0UmVxdWVzdGVkKCkpOworICAgICAgICBjaGVja1Jlc3VsdCA9IGZhbHNlOworICAgICAgICBtQWN0aXZpdHlSdWxlLnJ1bk9uVWlUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgbUxpc3RWaWV3LnNldEl0ZW1DaGVja2VkKDAsIHRydWUpOworICAgICAgICAgICAgICAgIGNoZWNrUmVzdWx0ID0gbUxpc3RWaWV3LmlzTGF5b3V0UmVxdWVzdGVkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBhc3NlcnRUcnVlKGNoZWNrUmVzdWx0KTsKICAgICB9CiAKICAgICBATWVkaXVtVGVzdApAQCAtNzM2LDggKzc5NCwxNSBAQAogICAgICAgICBtQWN0aXZpdHlSdWxlLnJ1bk9uVWlUaHJlYWQoKCkgLT4gbUxpc3RWaWV3LnNldEl0ZW1DaGVja2VkKDAsIGZhbHNlKSk7CiAgICAgICAgIG1JbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7CiAgICAgICAgIGFzc2VydEZhbHNlKG1MaXN0Vmlldy5pc0xheW91dFJlcXVlc3RlZCgpKTsKLSAgICAgICAgbUFjdGl2aXR5UnVsZS5ydW5PblVpVGhyZWFkKCgpIC0+IG1MaXN0Vmlldy5zZXRJdGVtQ2hlY2tlZCgwLCB0cnVlKSk7Ci0gICAgICAgIGFzc2VydFRydWUobUxpc3RWaWV3LmlzTGF5b3V0UmVxdWVzdGVkKCkpOworICAgICAgICBjaGVja1Jlc3VsdCA9IGZhbHNlOworICAgICAgICBtQWN0aXZpdHlSdWxlLnJ1bk9uVWlUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgbUxpc3RWaWV3LnNldEl0ZW1DaGVja2VkKDAsIHRydWUpOworICAgICAgICAgICAgICAgIGNoZWNrUmVzdWx0ID0gbUxpc3RWaWV3LmlzTGF5b3V0UmVxdWVzdGVkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBhc3NlcnRUcnVlKGNoZWNrUmVzdWx0KTsKICAgICB9CiAKICAgICBATGFyZ2VUZXN0CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9BYnNMaXN0Vmlld19MYXlvdXRQYXJhbXNUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9BYnNMaXN0Vmlld19MYXlvdXRQYXJhbXNUZXN0LmphdmEKaW5kZXggM2JiN2Q1NS4uY2UxMTIzYSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvQWJzTGlzdFZpZXdfTGF5b3V0UGFyYW1zVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0Fic0xpc3RWaWV3X0xheW91dFBhcmFtc1Rlc3QuamF2YQpAQCAtMTksMTQgKzE5LDE1IEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFic0xpc3RWaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFic0xpc3RWaWV3LkxheW91dFBhcmFtczsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5XaWRnZXRUZXN0VXRpbHM7CiAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvQWJzTGlzdFZpZXdfU2Nyb2xsVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvQWJzTGlzdFZpZXdfU2Nyb2xsVGVzdC5qYXZhCmluZGV4IGVlNmRjMzkuLjEyNWFlYTAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0Fic0xpc3RWaWV3X1Njcm9sbFRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9BYnNMaXN0Vmlld19TY3JvbGxUZXN0LmphdmEKQEAgLTI0LDExICsyNCw2IEBACiBpbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5MYXJnZVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TdXBwcmVzczsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Q29uZmlndXJhdGlvbjsKQEAgLTQwLDYgKzM1LDEyIEBACiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5MYXJnZVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlN1cHByZXNzOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkN0c1RvdWNoVXRpbHM7CiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DdHNUb3VjaFV0aWxzLkV2ZW50SW5qZWN0aW9uTGlzdGVuZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5Qb2xsaW5nQ2hlY2s7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9BYnNTZWVrQmFyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvQWJzU2Vla0JhclRlc3QuamF2YQppbmRleCA2MDZjODZmLi43ZWMwNzRhIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9BYnNTZWVrQmFyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0Fic1NlZWtCYXJUZXN0LmphdmEKQEAgLTM0LDE3ICszNCwxOCBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkNvbG9yRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWJzU2Vla0JhcjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5TZWVrQmFyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LmN0cy51dGlsLlRlc3RVdGlsczsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlBvbGxpbmdDaGVjazsKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLldpZGdldFRlc3RVdGlsczsKIApAQCAtMjY1LDYgKzI2Niw0MiBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoa2V5UHJvZ3Jlc3NJbmNyZW1lbnQgKyAxLCBteUFic1NlZWtCYXIuZ2V0S2V5UHJvZ3Jlc3NJbmNyZW1lbnQoKSk7CiAgICAgfQogCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzTWluKCkgeworICAgICAgICBBYnNTZWVrQmFyIG15QWJzU2Vla0JhciA9IG5ldyBNeUFic1NlZWtCYXIobUFjdGl2aXR5LCBudWxsLCBSLnN0eWxlLlRlc3RQcm9ncmVzc0Jhcik7CisKKyAgICAgICAgaW50IHByb2dyZXNzID0gLTU7CisgICAgICAgIGludCBtaW4gPSBwcm9ncmVzcyAtIDE7CisgICAgICAgIGludCBtYXggPSA1OworICAgICAgICBteUFic1NlZWtCYXIuc2V0TWF4KG1heCk7CisgICAgICAgIG15QWJzU2Vla0Jhci5zZXRNaW4obWluKTsKKyAgICAgICAgbXlBYnNTZWVrQmFyLnNldFByb2dyZXNzKHByb2dyZXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1pbiwgbXlBYnNTZWVrQmFyLmdldE1pbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHByb2dyZXNzLCBteUFic1NlZWtCYXIuZ2V0UHJvZ3Jlc3MoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBteUFic1NlZWtCYXIuZ2V0S2V5UHJvZ3Jlc3NJbmNyZW1lbnQoKSk7CisKKyAgICAgICAgbWluID0gcHJvZ3Jlc3MgKyAxOworICAgICAgICBteUFic1NlZWtCYXIuc2V0TWluKG1pbik7CisgICAgICAgIGFzc2VydEVxdWFscyhtaW4sIG15QWJzU2Vla0Jhci5nZXRNaW4oKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtaW4sIG15QWJzU2Vla0Jhci5nZXRQcm9ncmVzcygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG15QWJzU2Vla0Jhci5nZXRLZXlQcm9ncmVzc0luY3JlbWVudCgpKTsKKworICAgICAgICBpbnQga2V5UHJvZ3Jlc3NJbmNyZW1lbnQgPSAxMDsKKyAgICAgICAgbXlBYnNTZWVrQmFyLnNldEtleVByb2dyZXNzSW5jcmVtZW50KGtleVByb2dyZXNzSW5jcmVtZW50KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGtleVByb2dyZXNzSW5jcmVtZW50LCBteUFic1NlZWtCYXIuZ2V0S2V5UHJvZ3Jlc3NJbmNyZW1lbnQoKSk7CisgICAgICAgIG1heCA9IChrZXlQcm9ncmVzc0luY3JlbWVudCAtIDEpICogMTA7CisgICAgICAgIG1pbiA9IC0xICoga2V5UHJvZ3Jlc3NJbmNyZW1lbnQgKiAxMDsKKyAgICAgICAgbXlBYnNTZWVrQmFyLnNldE1heChtYXgpOworICAgICAgICBteUFic1NlZWtCYXIuc2V0TWluKG1pbik7CisgICAgICAgIGFzc2VydEVxdWFscyhrZXlQcm9ncmVzc0luY3JlbWVudCwgbXlBYnNTZWVrQmFyLmdldEtleVByb2dyZXNzSW5jcmVtZW50KCkpOworCisgICAgICAgIG1heCArPSAyMDsKKyAgICAgICAgbXlBYnNTZWVrQmFyLnNldE1heChtYXgpOworICAgICAgICBhc3NlcnRFcXVhbHMoa2V5UHJvZ3Jlc3NJbmNyZW1lbnQgKyAxLCBteUFic1NlZWtCYXIuZ2V0S2V5UHJvZ3Jlc3NJbmNyZW1lbnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtaW4sIG15QWJzU2Vla0Jhci5nZXRNaW4oKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtYXgsIG15QWJzU2Vla0Jhci5nZXRNYXgoKSk7CisgICAgfQorCiAgICAgQFVpVGhyZWFkVGVzdAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFRodW1iVGludCgpIHsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0Fic1NwaW5uZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9BYnNTcGlubmVyVGVzdC5qYXZhCmluZGV4IDM2ZjU2YTEuLjJjNzVmYTMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0Fic1NwaW5uZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvQWJzU3Bpbm5lclRlc3QuamF2YQpAQCAtMjYsMTAgKzI2LDYgQEAKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFTZXRPYnNlcnZlcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5YbWw7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CkBAIC00Miw2ICszOCwxMSBAQAogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNwaW5uZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuU3Bpbm5lckFkYXB0ZXI7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9BYnNvbHV0ZUxheW91dFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0Fic29sdXRlTGF5b3V0VGVzdC5qYXZhCmluZGV4IDkyNGRhMDkuLjBhMWRiMDEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0Fic29sdXRlTGF5b3V0VGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0Fic29sdXRlTGF5b3V0VGVzdC5qYXZhCkBAIC0yMywxNiArMjMsMTcgQEAKIAogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5YbWw7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5BYnNvbHV0ZUxheW91dDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5BYnNvbHV0ZUxheW91dC5MYXlvdXRQYXJhbXM7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuV2lkZ2V0VGVzdFV0aWxzOwogCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0Fic29sdXRlTGF5b3V0X0xheW91dFBhcmFtc1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0Fic29sdXRlTGF5b3V0X0xheW91dFBhcmFtc1Rlc3QuamF2YQppbmRleCAwZmFhNTQ3Li5mZTcxNzFhIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9BYnNvbHV0ZUxheW91dF9MYXlvdXRQYXJhbXNUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvQWJzb2x1dGVMYXlvdXRfTGF5b3V0UGFyYW1zVGVzdC5qYXZhCkBAIC0yMCwxNCArMjAsMTUgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFic29sdXRlTGF5b3V0OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFic29sdXRlTGF5b3V0LkxheW91dFBhcmFtczsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5XaWRnZXRUZXN0VXRpbHM7CiAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvQWN0aW9uTWVudVZpZXdUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9BY3Rpb25NZW51Vmlld1Rlc3QuamF2YQppbmRleCAzNmIxM2QyLi43NDBmZTkwIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9BY3Rpb25NZW51Vmlld1Rlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9BY3Rpb25NZW51Vmlld1Rlc3QuamF2YQpAQCAtMjcsMTUgKzI3LDE2IEBACiBpbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3I7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFjdGlvbk1lbnVWaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LmN0cy51dGlsLlRlc3RVdGlsczsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5XaWRnZXRUZXN0VXRpbHM7CiAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvQWRhcHRlclZpZXdUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9BZGFwdGVyVmlld1Rlc3QuamF2YQppbmRleCBjYzg2ODA4Li5jYmYxOWFlIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9BZGFwdGVyVmlld1Rlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9BZGFwdGVyVmlld1Rlc3QuamF2YQpAQCAtMzYsMTAgKzM2LDYgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlhtbDsKQEAgLTU0LDYgKzUwLDExIEBACiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdEFkYXB0ZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuV2lkZ2V0VGVzdFV0aWxzOwogCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0FkYXB0ZXJWaWV3X0FkYXB0ZXJDb250ZXh0TWVudUluZm9UZXN0LmphdmEgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9BZGFwdGVyVmlld19BZGFwdGVyQ29udGV4dE1lbnVJbmZvVGVzdC5qYXZhCmluZGV4IDhmYWQ3OTEuLjAwZTk3OTYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0FkYXB0ZXJWaWV3X0FkYXB0ZXJDb250ZXh0TWVudUluZm9UZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvQWRhcHRlclZpZXdfQWRhcHRlckNvbnRleHRNZW51SW5mb1Rlc3QuamF2YQpAQCAtMTgsMTIgKzE4LDEzIEBACiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiAKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldzsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9BbHBoYWJldEluZGV4ZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9BbHBoYWJldEluZGV4ZXJUZXN0LmphdmEKaW5kZXggN2RkYmJkNS4uN2IxZThmNiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvQWxwaGFiZXRJbmRleGVyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0FscGhhYmV0SW5kZXhlclRlc3QuamF2YQpAQCAtMjEsMTAgKzIxLDExIEBACiAKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLk1hdHJpeEN1cnNvcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5BbHBoYWJldEluZGV4ZXI7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0FuYWxvZ0Nsb2NrVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvQW5hbG9nQ2xvY2tUZXN0LmphdmEKaW5kZXggMTQ0ZGVjYS4uYTVhNGE1MCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvQW5hbG9nQ2xvY2tUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvQW5hbG9nQ2xvY2tUZXN0LmphdmEKQEAgLTE3LDEzICsxNywxNCBAQAogcGFja2FnZSBhbmRyb2lkLndpZGdldC5jdHM7CiAKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFuYWxvZ0Nsb2NrOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0FycmF5QWRhcHRlclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0FycmF5QWRhcHRlclRlc3QuamF2YQppbmRleCA0MzUwMTAzLi5iZGZiNjFkIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9BcnJheUFkYXB0ZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvQXJyYXlBZGFwdGVyVGVzdC5qYXZhCkBAIC0yOSwxNSArMjksMTYgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcy5UaGVtZTsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFTZXRPYnNlcnZlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZpbHRlcjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvQXV0b0NvbXBsZXRlVGV4dFZpZXdUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9BdXRvQ29tcGxldGVUZXh0Vmlld1Rlc3QuamF2YQppbmRleCA1Yjk2OWQzLi5kODkyM2E5IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9BdXRvQ29tcGxldGVUZXh0Vmlld1Rlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9BdXRvQ29tcGxldGVUZXh0Vmlld1Rlc3QuamF2YQpAQCAtNDcsMTEgKzQ3LDYgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LkVkaXRhYmxlOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0V2F0Y2hlcjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwpAQCAtNjgsNiArNjMsMTIgQEAKIGltcG9ydCBhbmRyb2lkLndpZGdldC5GaWx0ZXJhYmxlOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LmN0cy51dGlsLlRlc3RVdGlsczsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5Qb2xsaW5nQ2hlY2s7CiAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvQmFzZUFkYXB0ZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9CYXNlQWRhcHRlclRlc3QuamF2YQppbmRleCA0ZGYwYzRhLi5hMTc5ZjE2IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9CYXNlQWRhcHRlclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9CYXNlQWRhcHRlclRlc3QuamF2YQpAQCAtMjcsMTIgKzI3LDEzIEBACiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8udmVyaWZ5WmVyb0ludGVyYWN0aW9uczsKIAogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YVNldE9ic2VydmVyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQmFzZUFkYXB0ZXI7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0Jhc2VFeHBhbmRhYmxlTGlzdEFkYXB0ZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9CYXNlRXhwYW5kYWJsZUxpc3RBZGFwdGVyVGVzdC5qYXZhCmluZGV4IDI4ODU5ZDAuLjQxMWQ5ZTAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0Jhc2VFeHBhbmRhYmxlTGlzdEFkYXB0ZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvQmFzZUV4cGFuZGFibGVMaXN0QWRhcHRlclRlc3QuamF2YQpAQCAtMjYsMTIgKzI2LDEzIEBACiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8udmVyaWZ5WmVyb0ludGVyYWN0aW9uczsKIAogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YVNldE9ic2VydmVyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQmFzZUV4cGFuZGFibGVMaXN0QWRhcHRlcjsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvQnV0dG9uVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvQnV0dG9uVGVzdC5qYXZhCmluZGV4IGMzMjA4OTUuLmFiYzM3YTYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0J1dHRvblRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9CdXR0b25UZXN0LmphdmEKQEAgLTE3LDEzICsxNywxNCBAQAogcGFja2FnZSBhbmRyb2lkLndpZGdldC5jdHM7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5YbWw7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiBpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0NhbGVuZGFyVmlld1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0NhbGVuZGFyVmlld1Rlc3QuamF2YQppbmRleCBlNjZiMWQ5Li4wNTU2YWY4IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9DYWxlbmRhclZpZXdUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvQ2FsZW5kYXJWaWV3VGVzdC5qYXZhCkBAIC0yNiwxOSArMjYsMjAgQEAKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by52ZXJpZnlOb01vcmVJbnRlcmFjdGlvbnM7CiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8udmVyaWZ5WmVyb0ludGVyYWN0aW9uczsKIAotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Db2xvckludDsKIGltcG9ydCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb247CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5DYWxlbmRhclZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuU2Nyb2xsVmlldzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5jdHMudXRpbC5UZXN0VXRpbHM7CiAKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLkNvbG9ySW50OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DdHNUb3VjaFV0aWxzOwogCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0NoZWNrQm94VGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvQ2hlY2tCb3hUZXN0LmphdmEKaW5kZXggY2QyNjVmOS4uMTBjYmZkOCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvQ2hlY2tCb3hUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvQ2hlY2tCb3hUZXN0LmphdmEKQEAgLTI2LDE0ICsyNiwxNSBAQAogCiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CiBpbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkNoZWNrQm94OwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ3RzVG91Y2hVdGlsczsKIAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9DaGVja2VkVGV4dFZpZXdUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9DaGVja2VkVGV4dFZpZXdUZXN0LmphdmEKaW5kZXggZGEzMWMyZC4uMDViYjk3MSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvQ2hlY2tlZFRleHRWaWV3VGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0NoZWNrZWRUZXh0Vmlld1Rlc3QuamF2YQpAQCAtMzAsMTEgKzMwLDYgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmY7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlN0YXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwpAQCAtNDUsNiArNDAsMTIgQEAKIGltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5jdHMudXRpbC5UZXN0VXRpbHM7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5XaWRnZXRUZXN0VXRpbHM7CiAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvQ2hyb25vbWV0ZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9DaHJvbm9tZXRlclRlc3QuamF2YQppbmRleCAyZmY0MTVmLi5iOWE0NWEzIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9DaHJvbm9tZXRlclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9DaHJvbm9tZXRlclRlc3QuamF2YQpAQCAtMjksMTUgKzI5LDE2IEBACiBpbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5MYXJnZVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0VGhlbWVXcmFwcGVyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkNocm9ub21ldGVyOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5MYXJnZVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0NvbXBvdW5kQnV0dG9uVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvQ29tcG91bmRCdXR0b25UZXN0LmphdmEKaW5kZXggYjgxYjM3Yy4uZmNiYTYwNyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvQ29tcG91bmRCdXR0b25UZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvQ29tcG91bmRCdXR0b25UZXN0LmphdmEKQEAgLTQyLDExICs0Miw2IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5Db2xvckRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5TdGF0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOwpAQCAtNTUsNiArNTAsMTIgQEAKIGltcG9ydCBhbmRyb2lkLndpZGdldC5Db21wb3VuZEJ1dHRvbjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5jdHMudXRpbC5UZXN0VXRpbHM7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0N1cnNvckFkYXB0ZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9DdXJzb3JBZGFwdGVyVGVzdC5qYXZhCmluZGV4IGZmMzZiYmQuLjNmMTU0M2EgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0N1cnNvckFkYXB0ZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvQ3Vyc29yQWRhcHRlclRlc3QuamF2YQpAQCAtMzEsMTAgKzMxLDYgQEAKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFTZXRPYnNlcnZlcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZTsKIGltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CkBAIC00Myw2ICszOSwxMSBAQAogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZpbHRlclF1ZXJ5UHJvdmlkZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuUG9sbGluZ0NoZWNrOwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuVGVzdFRocmVhZDsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvQ3Vyc29yVHJlZUFkYXB0ZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9DdXJzb3JUcmVlQWRhcHRlclRlc3QuamF2YQppbmRleCAxMDg0ODA1Li40ZTE1Mzg0IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9DdXJzb3JUcmVlQWRhcHRlclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9DdXJzb3JUcmVlQWRhcHRlclRlc3QuamF2YQpAQCAtMzMsMTAgKzMzLDYgQEAKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFTZXRPYnNlcnZlcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CkBAIC00NSw2ICs0MSwxMSBAQAogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZpbHRlclF1ZXJ5UHJvdmlkZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvRGF0ZVBpY2tlckRpYWxvZ1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0RhdGVQaWNrZXJEaWFsb2dUZXN0LmphdmEKaW5kZXggYzBhYTk1ZGMuLmI2ZWU2YTggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0RhdGVQaWNrZXJEaWFsb2dUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvRGF0ZVBpY2tlckRpYWxvZ1Rlc3QuamF2YQpAQCAtMjIsMTAgKzIyLDExIEBACiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CiBpbXBvcnQgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2c7CiBpbXBvcnQgYW5kcm9pZC5hcHAuRGF0ZVBpY2tlckRpYWxvZzsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0RhdGVQaWNrZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9EYXRlUGlja2VyVGVzdC5qYXZhCmluZGV4IGIzYzEwZTMuLjUyYjc1YjYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0RhdGVQaWNrZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvRGF0ZVBpY2tlclRlc3QuamF2YQpAQCAtMzMsMTUgKzMzLDE2IEBACiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5hdXRvZmlsbC5BdXRvZmlsbFZhbHVlOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkRhdGVQaWNrZXI7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvRGlhbGVyRmlsdGVyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvRGlhbGVyRmlsdGVyVGVzdC5qYXZhCmluZGV4IGY3ZjZiYzcuLjgxMDI3NmEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0RpYWxlckZpbHRlclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9EaWFsZXJGaWx0ZXJUZXN0LmphdmEKQEAgLTMwLDExICszMCw2IEBACiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CiBpbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0V2F0Y2hlcjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwpAQCAtNDQsNiArMzksMTIgQEAKIGltcG9ydCBhbmRyb2lkLndpZGdldC5FZGl0VGV4dDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5SZWxhdGl2ZUxheW91dDsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkN0c0tleUV2ZW50VXRpbDsKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlBvbGxpbmdDaGVjazsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvRGlnaXRhbENsb2NrVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvRGlnaXRhbENsb2NrVGVzdC5qYXZhCmluZGV4IDZjOWY1MTIuLjM0YjUwODMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0RpZ2l0YWxDbG9ja1Rlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9EaWdpdGFsQ2xvY2tUZXN0LmphdmEKQEAgLTI0LDE2ICsyNCwxNyBAQAogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuWG1sUmVzb3VyY2VQYXJzZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlhtbDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5EaWdpdGFsQ2xvY2s7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LmN0cy51dGlsLlhtbFV0aWxzOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvRWRpdFRleHRUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9FZGl0VGV4dFRlc3QuamF2YQppbmRleCA5Y2I5OTAzLi5hY2IyNGY3IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9FZGl0VGV4dFRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9FZGl0VGV4dFRlc3QuamF2YQpAQCAtMjUsMTEgKzI1LDcgQEAKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKIGltcG9ydCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb247CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworaW1wb3J0IGFuZHJvaWQudGV4dC5FZGl0YWJsZTsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudGV4dC5tZXRob2QuQXJyb3dLZXlNb3ZlbWVudE1ldGhvZDsKIGltcG9ydCBhbmRyb2lkLnRleHQubWV0aG9kLk1vdmVtZW50TWV0aG9kOwpAQCAtNDAsNiArMzYsMTIgQEAKIGltcG9ydCBhbmRyb2lkLndpZGdldC5FZGl0VGV4dDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0Vmlldy5CdWZmZXJUeXBlOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CkBAIC0zNjAsNCArMzYyLDQ1IEBACiAgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdE1vdmVtZW50TWV0aG9kKCk7CiAgICAgICAgIH0KICAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRUZXh0Tm9uRWRpdGFibGUoKSB7CisgICAgICAgIC8vIFRoaXMgc3ViY2xhc3MgY2FsbHMgZ2V0VGV4dCBiZWZvcmUgdGhlIG9iamVjdCBpcyBmdWxseSBjb25zdHJ1Y3RlZC4gVGhpcyBzaG91bGQgbm90IGNhdXNlCisgICAgICAgIC8vIGEgbnVsbCBwb2ludGVyIGV4Y2VwdGlvbi4KKyAgICAgICAgR2V0VGV4dEVkaXRUZXh0IGVkaXRUZXh0ID0gbmV3IEdldFRleHRFZGl0VGV4dChtQWN0aXZpdHkpOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgR2V0VGV4dEVkaXRUZXh0IGV4dGVuZHMgRWRpdFRleHQgeworCisgICAgICAgIEdldFRleHRFZGl0VGV4dChDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFRleHQoQ2hhclNlcXVlbmNlIHRleHQsIEJ1ZmZlclR5cGUgdHlwZSkgeworICAgICAgICAgICAgRWRpdGFibGUgY3VycmVudFRleHQgPSBnZXRUZXh0KCk7CisgICAgICAgICAgICBzdXBlci5zZXRUZXh0KHRleHQsIHR5cGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0VGV4dEJlZm9yZUNvbnN0cnVjdG9yKCkgeworICAgICAgICAvLyBUaGlzIHN1YmNsYXNzIGNhbGxzIGdldFRleHQgYmVmb3JlIHRoZSBUZXh0VmlldyBjb25zdHJ1Y3Rvci4gVGhpcyBzaG91bGQgbm90IGNhdXNlCisgICAgICAgIC8vIGEgbnVsbCBwb2ludGVyIGV4Y2VwdGlvbi4KKyAgICAgICAgR2V0VGV4dEVkaXRUZXh0MiBlZGl0VGV4dCA9IG5ldyBHZXRUZXh0RWRpdFRleHQyKG1BY3Rpdml0eSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBHZXRUZXh0RWRpdFRleHQyIGV4dGVuZHMgRWRpdFRleHQgeworCisgICAgICAgIEdldFRleHRFZGl0VGV4dDIoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRPdmVyU2Nyb2xsTW9kZShpbnQgb3ZlclNjcm9sbE1vZGUpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgVmlldyBjb25zdHJ1Y3RvciBiZWZvcmUgdGhlIFRleHRWaWV3L0VkaXRUZXh0CisgICAgICAgICAgICAvLyBjb25zdHJ1Y3RvcnMuCisgICAgICAgICAgICBFZGl0YWJsZSB0ZXh0ID0gZ2V0VGV4dCgpOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvRXhwYW5kYWJsZUxpc3RUZXN0ZXIuamF2YSBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0V4cGFuZGFibGVMaXN0VGVzdGVyLmphdmEKaW5kZXggMjk2ZjAzZi4uZDJhNTIzMCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvRXhwYW5kYWJsZUxpc3RUZXN0ZXIuamF2YQorKysgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9FeHBhbmRhYmxlTGlzdFRlc3Rlci5qYXZhCkBAIC0xNywxMyArMTcsMTQgQEAKIHBhY2thZ2UgYW5kcm9pZC53aWRnZXQuY3RzOwogCiBpbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5FeHBhbmRhYmxlTGlzdEFkYXB0ZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RWaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LmN0cy51dGlsLkxpc3RVdGlsOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ3RzS2V5RXZlbnRVdGlsOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0V4cGFuZGFibGVMaXN0Vmlld0Jhc2ljVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvRXhwYW5kYWJsZUxpc3RWaWV3QmFzaWNUZXN0LmphdmEKaW5kZXggMWY0MjcwYy4uMmQ4OTUxMCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvRXhwYW5kYWJsZUxpc3RWaWV3QmFzaWNUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvRXhwYW5kYWJsZUxpc3RWaWV3QmFzaWNUZXN0LmphdmEKQEAgLTIxLDEwICsyMSw2IEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAogaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5CYXNlRXhwYW5kYWJsZUxpc3RBZGFwdGVyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0QWRhcHRlcjsKQEAgLTMzLDYgKzI5LDExIEBACiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuY3RzLnV0aWwuRXhwYW5kYWJsZUxpc3RTY2VuYXJpby5NeUdyb3VwOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LmN0cy51dGlsLkxpc3RVdGlsOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DdHNLZXlFdmVudFV0aWw7CiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5Qb2xsaW5nQ2hlY2s7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0V4cGFuZGFibGVMaXN0Vmlld1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0V4cGFuZGFibGVMaXN0Vmlld1Rlc3QuamF2YQppbmRleCAxNDgyY2FlLi42NTRhYTg4IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9FeHBhbmRhYmxlTGlzdFZpZXdUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvRXhwYW5kYWJsZUxpc3RWaWV3VGVzdC5qYXZhCkBAIC0zOCwxMSArMzgsNiBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQml0bWFwRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5YbWw7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwpAQCAtNTQsNiArNDksMTIgQEAKIGltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5jdHMudXRpbC5FeHBhbmRhYmxlTGlzdFNjZW5hcmlvOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlBvbGxpbmdDaGVjazsKIAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9FeHBhbmRhYmxlTGlzdFZpZXdXaXRoSGVhZGVyc1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0V4cGFuZGFibGVMaXN0Vmlld1dpdGhIZWFkZXJzVGVzdC5qYXZhCmluZGV4IDc3Y2YxYjYuLjRlZGJiOTIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0V4cGFuZGFibGVMaXN0Vmlld1dpdGhIZWFkZXJzVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0V4cGFuZGFibGVMaXN0Vmlld1dpdGhIZWFkZXJzVGVzdC5qYXZhCkBAIC0yMSwxNSArMjEsMTYgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCiBpbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTGFyZ2VUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0VmlldzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5jdHMudXRpbC5MaXN0VXRpbDsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLkxhcmdlVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DdHNLZXlFdmVudFV0aWw7CiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5Qb2xsaW5nQ2hlY2s7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0V4cGFuZGFibGVMaXN0Vmlld19FeHBhbmRhYmxlTGlzdENvbnRleHRNZW51SW5mb1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0V4cGFuZGFibGVMaXN0Vmlld19FeHBhbmRhYmxlTGlzdENvbnRleHRNZW51SW5mb1Rlc3QuamF2YQppbmRleCA2OTNmZjdlLi42OWRiYzhkIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9FeHBhbmRhYmxlTGlzdFZpZXdfRXhwYW5kYWJsZUxpc3RDb250ZXh0TWVudUluZm9UZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvRXhwYW5kYWJsZUxpc3RWaWV3X0V4cGFuZGFibGVMaXN0Q29udGV4dE1lbnVJbmZvVGVzdC5qYXZhCkBAIC0yMSwxMyArMjEsMTQgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFNhbWU7CiAKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RWaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0Vmlldy5FeHBhbmRhYmxlTGlzdENvbnRleHRNZW51SW5mbzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvRmlsdGVyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvRmlsdGVyVGVzdC5qYXZhCmluZGV4IGY4ZjU3N2UuLmYyZGMwZDggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0ZpbHRlclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9GaWx0ZXJUZXN0LmphdmEKQEAgLTI2LDEyICsyNiwxMyBAQAogCiBpbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5GaWx0ZXI7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuUG9sbGluZ0NoZWNrOwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuVGVzdFRocmVhZDsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvRnJhbWVMYXlvdXRUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9GcmFtZUxheW91dFRlc3QuamF2YQppbmRleCBlZTMyMWU0Li5jZmFmMjgxIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9GcmFtZUxheW91dFRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9GcmFtZUxheW91dFRlc3QuamF2YQpAQCAtNDAsMTEgKzQwLDYgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkJpdG1hcERyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQ29sb3JEcmF3YWJsZTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5YbWw7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CkBAIC01Niw2ICs1MSwxMiBAQAogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlBvbGxpbmdDaGVjazsKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLldpZGdldFRlc3RVdGlsczsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvRnJhbWVMYXlvdXRfTGF5b3V0UGFyYW1zVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvRnJhbWVMYXlvdXRfTGF5b3V0UGFyYW1zVGVzdC5qYXZhCmluZGV4IDBhY2EyY2QuLjFiMDRiMmYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0ZyYW1lTGF5b3V0X0xheW91dFBhcmFtc1Rlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9GcmFtZUxheW91dF9MYXlvdXRQYXJhbXNUZXN0LmphdmEKQEAgLTE5LDkgKzE5LDYgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5YbWw7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CkBAIC0zMCw2ICsyNywxMCBAQAogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0LkxheW91dFBhcmFtczsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5XaWRnZXRUZXN0VXRpbHM7CiAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvR2FsbGVyeVRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0dhbGxlcnlUZXN0LmphdmEKaW5kZXggYWNiZTFlNy4uYzk3N2ZhMyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvR2FsbGVyeVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9HYWxsZXJ5VGVzdC5qYXZhCkBAIC0yNiwxMSArMjYsNiBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LlZpZXdBc3NlcnRzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlhtbDsKQEAgLTQ2LDYgKzQxLDEyIEBACiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuR2FsbGVyeTsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuV2lkZ2V0VGVzdFV0aWxzOwogCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0dhbGxlcnlfTGF5b3V0UGFyYW1zVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvR2FsbGVyeV9MYXlvdXRQYXJhbXNUZXN0LmphdmEKaW5kZXggNjFjNDQ3Yi4uZmNiNzQzNCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvR2FsbGVyeV9MYXlvdXRQYXJhbXNUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvR2FsbGVyeV9MYXlvdXRQYXJhbXNUZXN0LmphdmEKQEAgLTE4LDExICsxOCwxMiBAQAogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5YbWxSZXNvdXJjZVBhcnNlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5HYWxsZXJ5OwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLldpZGdldFRlc3RVdGlsczsKIAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvR3JpZExheW91dFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0dyaWRMYXlvdXRUZXN0LmphdmEKaW5kZXggNDkyNDQwNy4uYjE2Y2FjMyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvR3JpZExheW91dFRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9HcmlkTGF5b3V0VGVzdC5qYXZhCkBAIC0yNCwxMCArMjQsNiBAQAogCiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5YbWw7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CkBAIC0zOCw2ICszNCwxMSBAQAogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkdyaWRMYXlvdXQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvR3JpZFZpZXdUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9HcmlkVmlld1Rlc3QuamF2YQppbmRleCA5NWUzNTgxLi42MjMyZTlkIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9HcmlkVmlld1Rlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9HcmlkVmlld1Rlc3QuamF2YQpAQCAtMzgsMTMgKzM4LDYgQEAKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFTZXRPYnNlcnZhYmxlOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YVNldE9ic2VydmVyOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLkxhcmdlVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudGVzdC5WaWV3QXNzZXJ0czsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5YbWw7CkBAIC02MSw2ICs1NCwxNCBAQAogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlcjsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTGFyZ2VUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ3RzS2V5RXZlbnRVdGlsOwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuUG9sbGluZ0NoZWNrOwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuV2lkZ2V0VGVzdFV0aWxzOwpAQCAtNjA4LDYgKzYwOSw3IEBACiAgICAgICAgIGZpbmFsIEF0dGFjaERldGFjaEF3YXJlVmlldyB0aGVWaWV3ID0gbmV3IEF0dGFjaERldGFjaEF3YXJlVmlldyhtQWN0aXZpdHkpOwogICAgICAgICBXaWRnZXRUZXN0VXRpbHMucnVuT25NYWluQW5kRHJhd1N5bmMobUFjdGl2aXR5UnVsZSwgbUdyaWRWaWV3LCAoKSAtPiB7CiAgICAgICAgICAgICBtR3JpZFZpZXcuc2V0QWRhcHRlcihuZXcgRHVtbXlBZGFwdGVyKDEwMDAsIHRoZVZpZXcpKTsKKyAgICAgICAgICAgIG1HcmlkVmlldy5yZXF1ZXN0Rm9jdXMoKTsKICAgICAgICAgfSk7CiAgICAgICAgIGFzc2VydEVxdWFscygidGVzdCBzYW5pdHkiLCAxLCB0aGVWaWV3Lm1PbkF0dGFjaENvdW50KTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0IHNhbml0eSIsIDAsIHRoZVZpZXcubU9uRGV0YWNoQ291bnQpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvSGVhZGVyVmlld0xpc3RBZGFwdGVyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvSGVhZGVyVmlld0xpc3RBZGFwdGVyVGVzdC5qYXZhCmluZGV4IGRjZmQ3ZDIuLmI4N2U1ZDQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0hlYWRlclZpZXdMaXN0QWRhcHRlclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9IZWFkZXJWaWV3TGlzdEFkYXB0ZXJUZXN0LmphdmEKQEAgLTI1LDEwICsyNSw2IEBACiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFTZXRPYnNlcnZlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3OwpAQCAtMzgsNiArMzQsMTEgQEAKIGltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlcjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0hvcml6b250YWxTY3JvbGxWaWV3VGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvSG9yaXpvbnRhbFNjcm9sbFZpZXdUZXN0LmphdmEKaW5kZXggODhhYTM1Ny4uOWYyMmU3NyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvSG9yaXpvbnRhbFNjcm9sbFZpZXdUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvSG9yaXpvbnRhbFNjcm9sbFZpZXdUZXN0LmphdmEKQEAgLTI5LDExICsyOSw2IEBACiBpbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlhtbDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKQEAgLTQzLDYgKzM4LDEyIEBACiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuSG9yaXpvbnRhbFNjcm9sbFZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuUG9sbGluZ0NoZWNrOwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuV2lkZ2V0VGVzdFV0aWxzOwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9JbWFnZUJ1dHRvblRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0ltYWdlQnV0dG9uVGVzdC5qYXZhCmluZGV4IGM0MzNiZTYuLjdkZjM3ZmQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0ltYWdlQnV0dG9uVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0ltYWdlQnV0dG9uVGVzdC5qYXZhCkBAIC0xOSwxMyArMTksMTQgQEAKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlQnV0dG9uOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LmN0cy51dGlsLlRlc3RVdGlsczsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0ltYWdlU3dpdGNoZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9JbWFnZVN3aXRjaGVyVGVzdC5qYXZhCmluZGV4IGVhNzk3OTYuLjY5ZjdkMDggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0ltYWdlU3dpdGNoZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvSW1hZ2VTd2l0Y2hlclRlc3QuamF2YQpAQCAtMjgsMTUgKzI4LDE2IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5CaXRtYXBEcmF3YWJsZTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlhtbDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVN3aXRjaGVyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuV2lkZ2V0VGVzdFV0aWxzOwogCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0ltYWdlVmlld1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0ltYWdlVmlld1Rlc3QuamF2YQppbmRleCA1NDc2YjIyLi5jNGQxZjMyIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9JbWFnZVZpZXdUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvSW1hZ2VWaWV3VGVzdC5qYXZhCkBAIC00OSwxNiArNDksMTcgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkljb247CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5QYWludERyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlhtbDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3LlNjYWxlVHlwZTsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5jdHMudXRpbC5UZXN0VXRpbHM7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLldpZGdldFRlc3RVdGlsczsKIAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9MYXlvdXREaXJlY3Rpb25UZXN0LmphdmEgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9MYXlvdXREaXJlY3Rpb25UZXN0LmphdmEKaW5kZXggNzZjMmVmNi4uMDI3ZThiZCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvTGF5b3V0RGlyZWN0aW9uVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0xheW91dERpcmVjdGlvblRlc3QuamF2YQpAQCAtMjQsMTAgKzI0LDYgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiAKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuR3JpZExheW91dDsKQEAgLTM1LDYgKzMxLDExIEBACiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVsYXRpdmVMYXlvdXQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGFibGVMYXlvdXQ7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvTGluZWFyTGF5b3V0VGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvTGluZWFyTGF5b3V0VGVzdC5qYXZhCmluZGV4IDM1ODQxYTEuLjFmM2YwZTggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0xpbmVhckxheW91dFRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9MaW5lYXJMYXlvdXRUZXN0LmphdmEKQEAgLTIzLDggKzIzLDYgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uQ29sb3JJbnQ7Ci1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlOwogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwogaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKQEAgLTMyLDExICszMCw2IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudGVzdC5WaWV3QXNzZXJ0czsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5YbWw7CkBAIC01Miw2ICs0NSwxNCBAQAogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LmN0cy51dGlsLlRlc3RVdGlsczsKIAoraW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uQ29sb3JJbnQ7CitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5OdWxsYWJsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuV2lkZ2V0VGVzdFV0aWxzOwogCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKQEAgLTEyMTcsNiArMTIxOCwzMiBAQAogICAgICAgICAgICAgICAgIGRpdmlkZXJTaXplLCBDb2xvci5SRUQsIGRpdmlkZXJQYWRkaW5nKTsKICAgICB9CiAKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RaZXJvV2VpZ2h0RGlzdHJpYnV0aW9uSG9yaXpvbnRhbCgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICAvLyBFbnN1cmUgdGhhdCB3ZWlnaHQgaXMgY29ycmVjdGx5IGRpc3RyaWJ1dGVkIHdoZW4gdGhlcmUgaXMgbm8gZXhjZXNzIHNwYWNlLgorICAgICAgICBmaW5hbCBWaWV3IGNvbnRlbnQgPSBtQWN0aXZpdHkuZmluZFZpZXdCeUlkKGFuZHJvaWQuUi5pZC5jb250ZW50KTsKKyAgICAgICAgV2lkZ2V0VGVzdFV0aWxzLnJ1bk9uTWFpbkFuZERyYXdTeW5jKG1BY3Rpdml0eVJ1bGUsIGNvbnRlbnQsCisgICAgICAgICAgICAgICAgKCkgLT4gbUFjdGl2aXR5LnNldENvbnRlbnRWaWV3KFIubGF5b3V0LmxpbmVhcmxheW91dF96ZXJvX3dlaWdodF9ob3Jpem9udGFsKSk7CisKKyAgICAgICAgZmluYWwgVmlldyBwYXJlbnQgPSBtQWN0aXZpdHkuZmluZFZpZXdCeUlkKFIuaWQuY29udGFpbmVyMSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtQWN0aXZpdHkuZmluZFZpZXdCeUlkKFIuaWQudmlldzEpLmdldFdpZHRoKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbUFjdGl2aXR5LmZpbmRWaWV3QnlJZChSLmlkLnZpZXcyKS5nZXRXaWR0aCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHBhcmVudC5nZXRXaWR0aCgpLCBtQWN0aXZpdHkuZmluZFZpZXdCeUlkKFIuaWQudmlldzMpLmdldFdpZHRoKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFplcm9XZWlnaHREaXN0cmlidXRpb25WZXJ0aWNhbCgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICAvLyBFbnN1cmUgdGhhdCB3ZWlnaHQgaXMgY29ycmVjdGx5IGRpc3RyaWJ1dGVkIHdoZW4gdGhlcmUgaXMgbm8gZXhjZXNzIHNwYWNlLgorICAgICAgICBmaW5hbCBWaWV3IGNvbnRlbnQgPSBtQWN0aXZpdHkuZmluZFZpZXdCeUlkKGFuZHJvaWQuUi5pZC5jb250ZW50KTsKKyAgICAgICAgV2lkZ2V0VGVzdFV0aWxzLnJ1bk9uTWFpbkFuZERyYXdTeW5jKG1BY3Rpdml0eVJ1bGUsIGNvbnRlbnQsCisgICAgICAgICAgICAgICAgKCkgLT4gbUFjdGl2aXR5LnNldENvbnRlbnRWaWV3KFIubGF5b3V0LmxpbmVhcmxheW91dF96ZXJvX3dlaWdodF92ZXJ0aWNhbCkpOworCisgICAgICAgIGZpbmFsIFZpZXcgcGFyZW50ID0gbUFjdGl2aXR5LmZpbmRWaWV3QnlJZChSLmlkLmNvbnRhaW5lcjEpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbUFjdGl2aXR5LmZpbmRWaWV3QnlJZChSLmlkLnZpZXcxKS5nZXRIZWlnaHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtQWN0aXZpdHkuZmluZFZpZXdCeUlkKFIuaWQudmlldzIpLmdldEhlaWdodCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHBhcmVudC5nZXRIZWlnaHQoKSwgbUFjdGl2aXR5LmZpbmRWaWV3QnlJZChSLmlkLnZpZXczKS5nZXRIZWlnaHQoKSk7CisgICAgfQorCiAgICAgcHJpdmF0ZSBjbGFzcyBNb2NrTGlzdFZpZXcgZXh0ZW5kcyBMaXN0VmlldyB7CiAgICAgICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBERUZBVUxUX0NISUxEX0JBU0VfTElORSA9IDE7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0xpbmVhckxheW91dF9MYXlvdXRQYXJhbXNUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9MaW5lYXJMYXlvdXRfTGF5b3V0UGFyYW1zVGVzdC5qYXZhCmluZGV4IDc1MWNhZWYuLjU0NTEzZGUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0xpbmVhckxheW91dF9MYXlvdXRQYXJhbXNUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvTGluZWFyTGF5b3V0X0xheW91dFBhcmFtc1Rlc3QuamF2YQpAQCAtMjEsMTUgKzIxLDE2IEBACiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlhtbFJlc291cmNlUGFyc2VyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXAuTGF5b3V0UGFyYW1zOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXAuTWFyZ2luTGF5b3V0UGFyYW1zOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5jdHMudXRpbC5YbWxVdGlsczsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9MaXN0UG9wdXBXaW5kb3dUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9MaXN0UG9wdXBXaW5kb3dUZXN0LmphdmEKaW5kZXggNzBmOTY2MS4uYTFiYzBhYSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvTGlzdFBvcHVwV2luZG93VGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0xpc3RQb3B1cFdpbmRvd1Rlc3QuamF2YQpAQCAtNDAsMTAgKzQwLDYgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkNvbG9yRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKIGltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUHJlc3VibWl0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTGFyZ2VUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuRGlzcGxheTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CkBAIC01OSw2ICs1NSwxMSBAQAogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlBvcHVwV2luZG93OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTGFyZ2VUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkN0c0tleUV2ZW50VXRpbDsKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkN0c1RvdWNoVXRpbHM7CiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5XaWRnZXRUZXN0VXRpbHM7CkBAIC01MjgsMTUgKzUyOSwxOSBAQAogICAgICAgICBhc3NlcnRUcnVlKHByb21wdFZpZXcuaXNTaG93bigpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKExpc3RQb3B1cFdpbmRvdy5QT1NJVElPTl9QUk9NUFRfQUJPVkUsIG1Qb3B1cFdpbmRvdy5nZXRQcm9tcHRQb3NpdGlvbigpKTsKIAotICAgICAgICBmaW5hbCBpbnRbXSBwcm9tcHRWaWV3T25TY3JlZW5YWSA9IG5ldyBpbnRbMl07Ci0gICAgICAgIHByb21wdFZpZXcuZ2V0TG9jYXRpb25PblNjcmVlbihwcm9tcHRWaWV3T25TY3JlZW5YWSk7Ci0KICAgICAgICAgZmluYWwgTGlzdFZpZXcgbGlzdFZpZXcgPSBtUG9wdXBXaW5kb3cuZ2V0TGlzdFZpZXcoKTsKICAgICAgICAgV2lkZ2V0VGVzdFV0aWxzLnJ1bk9uTWFpbkFuZERyYXdTeW5jKG1BY3Rpdml0eVJ1bGUsIGxpc3RWaWV3LCBudWxsKTsKIAotICAgICAgICBmaW5hbCBWaWV3IGZpcnN0TGlzdENoaWxkID0gbGlzdFZpZXcuZ2V0Q2hpbGRBdCgwKTsKKyAgICAgICAgZmluYWwgaW50W10gcHJvbXB0Vmlld09uU2NyZWVuWFkgPSBuZXcgaW50WzJdOwogICAgICAgICBmaW5hbCBpbnRbXSBmaXJzdENoaWxkT25TY3JlZW5YWSA9IG5ldyBpbnRbMl07Ci0gICAgICAgIGZpcnN0TGlzdENoaWxkLmdldExvY2F0aW9uT25TY3JlZW4oZmlyc3RDaGlsZE9uU2NyZWVuWFkpOworCisgICAgICAgIG1BY3Rpdml0eVJ1bGUucnVuT25VaVRocmVhZCgoKS0+IHsKKyAgICAgICAgICAgIHByb21wdFZpZXcuZ2V0TG9jYXRpb25PblNjcmVlbihwcm9tcHRWaWV3T25TY3JlZW5YWSk7CisKKyAgICAgICAgICAgIGZpbmFsIFZpZXcgZmlyc3RMaXN0Q2hpbGQgPSBsaXN0Vmlldy5nZXRDaGlsZEF0KDApOworICAgICAgICAgICAgZmlyc3RMaXN0Q2hpbGQuZ2V0TG9jYXRpb25PblNjcmVlbihmaXJzdENoaWxkT25TY3JlZW5YWSk7CisgICAgICAgIH0pOworICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLndhaXRGb3JJZGxlU3luYygpOwogCiAgICAgICAgIGFzc2VydFRydWUocHJvbXB0Vmlld09uU2NyZWVuWFlbMV0gKyBwcm9tcHRWaWV3LmdldEhlaWdodCgpIDw9IGZpcnN0Q2hpbGRPblNjcmVlblhZWzFdKTsKICAgICB9CkBAIC01NjAsMTEgKzU2NSwxNSBAQAogICAgICAgICBXaWRnZXRUZXN0VXRpbHMucnVuT25NYWluQW5kRHJhd1N5bmMobUFjdGl2aXR5UnVsZSwgbGlzdFZpZXcsIG51bGwpOwogCiAgICAgICAgIGZpbmFsIGludFtdIHByb21wdFZpZXdPblNjcmVlblhZID0gbmV3IGludFsyXTsKLSAgICAgICAgcHJvbXB0Vmlldy5nZXRMb2NhdGlvbk9uU2NyZWVuKHByb21wdFZpZXdPblNjcmVlblhZKTsKLQotICAgICAgICBmaW5hbCBWaWV3IGxhc3RMaXN0Q2hpbGQgPSBsaXN0Vmlldy5nZXRDaGlsZEF0KGxpc3RWaWV3LmdldENoaWxkQ291bnQoKSAtIDEpOwogICAgICAgICBmaW5hbCBpbnRbXSBsYXN0Q2hpbGRPblNjcmVlblhZID0gbmV3IGludFsyXTsKLSAgICAgICAgbGFzdExpc3RDaGlsZC5nZXRMb2NhdGlvbk9uU2NyZWVuKGxhc3RDaGlsZE9uU2NyZWVuWFkpOworCisgICAgICAgIG1BY3Rpdml0eVJ1bGUucnVuT25VaVRocmVhZCgoKS0+IHsKKyAgICAgICAgICAgIHByb21wdFZpZXcuZ2V0TG9jYXRpb25PblNjcmVlbihwcm9tcHRWaWV3T25TY3JlZW5YWSk7CisKKyAgICAgICAgICAgIGZpbmFsIFZpZXcgbGFzdExpc3RDaGlsZCA9IGxpc3RWaWV3LmdldENoaWxkQXQobGlzdFZpZXcuZ2V0Q2hpbGRDb3VudCgpIC0gMSk7CisgICAgICAgICAgICBsYXN0TGlzdENoaWxkLmdldExvY2F0aW9uT25TY3JlZW4obGFzdENoaWxkT25TY3JlZW5YWSk7CisgICAgICAgIH0pOworICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLndhaXRGb3JJZGxlU3luYygpOwogCiAgICAgICAgIC8vIFRoZSBjaGlsZCBpcyBhYm92ZSB0aGUgcHJvbXB0LiBUaGV5IG1heSBvdmVybGFwLCBhcyBpbiB0aGUgY2FzZQogICAgICAgICAvLyB3aGVuIHRoZSBsaXN0IGl0ZW1zIGRvIG5vdCBhbGwgZml0IG9uIHNjcmVlbiwgYnV0IHRoaXMgaXMgc3RpbGwKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL0xpc3RWaWV3VGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvTGlzdFZpZXdUZXN0LmphdmEKaW5kZXggZDk3YzY2ZS4uZjFmNTU4MyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvTGlzdFZpZXdUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvTGlzdFZpZXdUZXN0LmphdmEKQEAgLTQ1LDEzICs0NSw2IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5Db2xvckRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTGFyZ2VUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuUGFpcjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CkBAIC03MCw2ICs2MywxNCBAQAogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LmN0cy51dGlsLlRlc3RVdGlsczsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTGFyZ2VUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ3RzS2V5RXZlbnRVdGlsOwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuUG9sbGluZ0NoZWNrOwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuV2lkZ2V0VGVzdFV0aWxzOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvTWFnbmlmaWVyQ3RzQWN0aXZpdHkuamF2YSBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL01hZ25pZmllckN0c0FjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVkOWY4MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL01hZ25pZmllckN0c0FjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53aWRnZXQuY3RzOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CisKKy8qKgorICogQSBtaW5pbWFsIGFwcGxpY2F0aW9uIGZvciB7QGxpbmsgTWFnbmlmaWVyVGVzdH0uCisgKi8KK3B1YmxpYyBjbGFzcyBNYWduaWZpZXJDdHNBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0Lm1hZ25pZmllcl9hY3Rpdml0eV9iYXNpY19sYXlvdXQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL01hZ25pZmllclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL01hZ25pZmllclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWI1MzZiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvTWFnbmlmaWVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLndpZGdldC5jdHM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc3VtZS5hc3N1bWVUcnVlOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb2ludEY7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OworaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0LkxheW91dFBhcmFtczsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5NYWduaWZpZXI7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuUG9sbGluZ0NoZWNrOworaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuV2lkZ2V0VGVzdFV0aWxzOworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCisvKioKKyAqIFRlc3RzIGZvciB7QGxpbmsgTWFnbmlmaWVyfS4KKyAqLworQFNtYWxsVGVzdAorQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBNYWduaWZpZXJUZXN0IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElNRV9MSU1JVF9FWENFRURFRCA9CisgICAgICAgICAgICAiQ29tcGxldGluZyB0aGUgbWFnbmlmaWVyIG9wZXJhdGlvbiB0b29rIHRvbyBsb25nIjsKKworICAgIHByaXZhdGUgQWN0aXZpdHkgbUFjdGl2aXR5OworICAgIHByaXZhdGUgTGluZWFyTGF5b3V0IG1MYXlvdXQ7CisgICAgcHJpdmF0ZSBNYWduaWZpZXIgbU1hZ25pZmllcjsKKworICAgIEBSdWxlCisgICAgcHVibGljIEFjdGl2aXR5VGVzdFJ1bGU8TWFnbmlmaWVyQ3RzQWN0aXZpdHk+IG1BY3Rpdml0eVJ1bGUgPQorICAgICAgICAgICAgbmV3IEFjdGl2aXR5VGVzdFJ1bGU8PihNYWduaWZpZXJDdHNBY3Rpdml0eS5jbGFzcyk7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0dXAoKSB7CisgICAgICAgIG1BY3Rpdml0eSA9IG1BY3Rpdml0eVJ1bGUuZ2V0QWN0aXZpdHkoKTsKKyAgICAgICAgUG9sbGluZ0NoZWNrLndhaXRGb3IobUFjdGl2aXR5OjpoYXNXaW5kb3dGb2N1cyk7CisgICAgICAgIG1MYXlvdXQgPSBtQWN0aXZpdHkuZmluZFZpZXdCeUlkKFIuaWQubWFnbmlmaWVyX2FjdGl2aXR5X2Jhc2ljX2xheW91dCk7CisKKyAgICAgICAgLy8gRG8gbm90IHJ1biB0aGUgdGVzdHMsIHVubGVzcyB0aGUgZGV2aWNlIHNjcmVlbiBpcyBiaWcgZW5vdWdoIHRvIGZpdCB0aGUgbWFnbmlmaWVyLgorICAgICAgICBhc3N1bWVUcnVlKGlzU2NyZWVuQmlnRW5vdWdoKCkpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc1NjcmVlbkJpZ0Vub3VnaCgpIHsKKyAgICAgICAgLy8gR2V0IHRoZSBzaXplIG9mIHRoZSBzY3JlZW4gaW4gZHAuCisgICAgICAgIGZpbmFsIERpc3BsYXlNZXRyaWNzIGRpc3BsYXlNZXRyaWNzID0gbUFjdGl2aXR5LmdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCk7CisgICAgICAgIGZpbmFsIGZsb2F0IGRwU2NyZWVuV2lkdGggPSBkaXNwbGF5TWV0cmljcy53aWR0aFBpeGVscyAvIGRpc3BsYXlNZXRyaWNzLmRlbnNpdHk7CisgICAgICAgIGZpbmFsIGZsb2F0IGRwU2NyZWVuSGVpZ2h0ID0gZGlzcGxheU1ldHJpY3MuaGVpZ2h0UGl4ZWxzIC8gZGlzcGxheU1ldHJpY3MuZGVuc2l0eTsKKyAgICAgICAgLy8gR2V0IHRoZSBzaXplIG9mIHRoZSBtYWduaWZpZXIgd2luZG93IGluIGRwLgorICAgICAgICBmaW5hbCBQb2ludEYgZHBNYWduaWZpZXIgPSBNYWduaWZpZXIuZ2V0TWFnbmlmaWVyRGVmYXVsdFNpemUoKTsKKworICAgICAgICByZXR1cm4gZHBTY3JlZW5XaWR0aCA+PSBkcE1hZ25pZmllci54ICogMS4xICYmIGRwU2NyZWVuSGVpZ2h0ID49IGRwTWFnbmlmaWVyLnkgKiAxLjE7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IoKSB7CisgICAgICAgIG5ldyBNYWduaWZpZXIobmV3IFZpZXcobUFjdGl2aXR5KSk7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBOdWxsUG9pbnRlckV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JfTlBFKCkgeworICAgICAgICBuZXcgTWFnbmlmaWVyKG51bGwpOworICAgIH0KKworICAgIEBUZXN0CisgICAgQFVpVGhyZWFkVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaG93KCkgeworICAgICAgICBmaW5hbCBWaWV3IHZpZXcgPSBuZXcgVmlldyhtQWN0aXZpdHkpOworICAgICAgICBtTGF5b3V0LmFkZFZpZXcodmlldywgbmV3IExheW91dFBhcmFtcygyMDAsIDIwMCkpOworICAgICAgICBtTWFnbmlmaWVyID0gbmV3IE1hZ25pZmllcih2aWV3KTsKKyAgICAgICAgLy8gVmFsaWQgY29vcmRpbmF0ZXMuCisgICAgICAgIG1NYWduaWZpZXIuc2hvdygwLCAwKTsKKyAgICAgICAgLy8gSW52YWxpZCBjb29yZGluYXRlcywgc2hvdWxkIGJvdGggYmUgY2xhbXBlZCB0byAwLgorICAgICAgICBtTWFnbmlmaWVyLnNob3coLTEsIC0xKTsKKyAgICAgICAgLy8gVmFsaWQgY29vcmRpbmF0ZXMuCisgICAgICAgIG1NYWduaWZpZXIuc2hvdygxMCwgMTApOworICAgICAgICAvLyBTYW1lIHZhbGlkIGNvb3JkaW5hdGUgYXMgYWJvdmUsIHNob3VsZCBza2lwIG1ha2luZyBhbm90aGVyIGNvcHkgcmVxdWVzdC4KKyAgICAgICAgbU1hZ25pZmllci5zaG93KDEwLCAxMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAVWlUaHJlYWRUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERpc21pc3MoKSB7CisgICAgICAgIGZpbmFsIFZpZXcgdmlldyA9IG5ldyBWaWV3KG1BY3Rpdml0eSk7CisgICAgICAgIG1MYXlvdXQuYWRkVmlldyh2aWV3LCBuZXcgTGF5b3V0UGFyYW1zKDIwMCwgMjAwKSk7CisgICAgICAgIG1NYWduaWZpZXIgPSBuZXcgTWFnbmlmaWVyKHZpZXcpOworICAgICAgICAvLyBWYWxpZCBjb29yZGluYXRlcy4KKyAgICAgICAgbU1hZ25pZmllci5zaG93KDEwLCAxMCk7CisgICAgICAgIG1NYWduaWZpZXIuZGlzbWlzcygpOworICAgICAgICAvLyBTaG91bGQgYmUgbm8tb3AuCisgICAgICAgIG1NYWduaWZpZXIuZGlzbWlzcygpOworICAgIH0KKworICAgIEBUZXN0CisgICAgQFVpVGhyZWFkVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVcGRhdGUoKSB7CisgICAgICAgIGZpbmFsIFZpZXcgdmlldyA9IG5ldyBWaWV3KG1BY3Rpdml0eSk7CisgICAgICAgIG1MYXlvdXQuYWRkVmlldyh2aWV3LCBuZXcgTGF5b3V0UGFyYW1zKDIwMCwgMjAwKSk7CisgICAgICAgIG1NYWduaWZpZXIgPSBuZXcgTWFnbmlmaWVyKHZpZXcpOworICAgICAgICAvLyBTaG91bGQgYmUgbm8tb3AuCisgICAgICAgIG1NYWduaWZpZXIudXBkYXRlKCk7CisgICAgICAgIC8vIFZhbGlkIGNvb3JkaW5hdGVzLgorICAgICAgICBtTWFnbmlmaWVyLnNob3coMTAsIDEwKTsKKyAgICAgICAgLy8gU2hvdWxkIG5vdCBjcmFzaC4KKyAgICAgICAgbU1hZ25pZmllci51cGRhdGUoKTsKKyAgICAgICAgbU1hZ25pZmllci5kaXNtaXNzKCk7CisgICAgICAgIC8vIFNob3VsZCBiZSBuby1vcC4KKyAgICAgICAgbU1hZ25pZmllci51cGRhdGUoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBVaVRocmVhZFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2l6ZUFuZFpvb21fYXJlVmFsaWQoKSB7CisgICAgICAgIGZpbmFsIFZpZXcgdmlldyA9IG5ldyBWaWV3KG1BY3Rpdml0eSk7CisgICAgICAgIG1MYXlvdXQuYWRkVmlldyh2aWV3LCBuZXcgTGF5b3V0UGFyYW1zKDIwMCwgMjAwKSk7CisgICAgICAgIG1NYWduaWZpZXIgPSBuZXcgTWFnbmlmaWVyKHZpZXcpOworICAgICAgICBtTWFnbmlmaWVyLnNob3coMTAsIDEwKTsKKyAgICAgICAgLy8gU2l6ZSBzaG91bGQgYmUgbm9uLXplcm8uCisgICAgICAgIGFzc2VydFRydWUobU1hZ25pZmllci5nZXRXaWR0aCgpID4gMCk7CisgICAgICAgIGFzc2VydFRydWUobU1hZ25pZmllci5nZXRIZWlnaHQoKSA+IDApOworICAgICAgICAvLyBUaGUgbWFnbmlmaWVkIHZpZXcgcmVnaW9uIHNob3VsZCBiZSB6b29tZWQgaW4sIG5vdCBvdXQuCisgICAgICAgIGFzc2VydFRydWUobU1hZ25pZmllci5nZXRab29tKCkgPiAxLjBmKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXaW5kb3dDb250ZW50KCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIHByZXBhcmVGb3VyUXVhZHJhbnRzU2NlbmFyaW8oKTsKKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgICAgIG1NYWduaWZpZXIuc2V0T25PcGVyYXRpb25Db21wbGV0ZUNhbGxiYWNrKGxhdGNoOjpjb3VudERvd24pOworCisgICAgICAgIC8vIFNob3cgdGhlIG1hZ25pZmllciBhdCB0aGUgY2VudGVyIG9mIHRoZSBhY3Rpdml0eS4KKyAgICAgICAgbUFjdGl2aXR5UnVsZS5ydW5PblVpVGhyZWFkKCgpIC0+IHsKKyAgICAgICAgICAgIG1NYWduaWZpZXIuc2hvdyhtTGF5b3V0LmdldFdpZHRoKCkgLyAyLCBtTGF5b3V0LmdldEhlaWdodCgpIC8gMik7CisgICAgICAgIH0pOworICAgICAgICBhc3NlcnRUcnVlKFRJTUVfTElNSVRfRVhDRUVERUQsIGxhdGNoLmF3YWl0KDEsIFRpbWVVbml0LlNFQ09ORFMpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMobU1hZ25pZmllci5nZXRXaWR0aCgpLCBtTWFnbmlmaWVyLmdldENvbnRlbnQoKS5nZXRXaWR0aCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1NYWduaWZpZXIuZ2V0SGVpZ2h0KCksIG1NYWduaWZpZXIuZ2V0Q29udGVudCgpLmdldEhlaWdodCgpKTsKKyAgICAgICAgYXNzZXJ0Rm91clF1YWRyYW50cyhtTWFnbmlmaWVyLmdldENvbnRlbnQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2luZG93UG9zaXRpb24oKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgcHJlcGFyZUZvdXJRdWFkcmFudHNTY2VuYXJpbygpOworICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICAgICAgbU1hZ25pZmllci5zZXRPbk9wZXJhdGlvbkNvbXBsZXRlQ2FsbGJhY2sobGF0Y2g6OmNvdW50RG93bik7CisKKyAgICAgICAgLy8gU2hvdyB0aGUgbWFnbmlmaWVyIGF0IHRoZSBjZW50ZXIgb2YgdGhlIGFjdGl2aXR5LgorICAgICAgICBtQWN0aXZpdHlSdWxlLnJ1bk9uVWlUaHJlYWQoKCkgLT4geworICAgICAgICAgICAgbU1hZ25pZmllci5zaG93KG1MYXlvdXQuZ2V0V2lkdGgoKSAvIDIsIG1MYXlvdXQuZ2V0SGVpZ2h0KCkgLyAyKTsKKyAgICAgICAgfSk7CisgICAgICAgIGFzc2VydFRydWUoVElNRV9MSU1JVF9FWENFRURFRCwgbGF0Y2guYXdhaXQoMSwgVGltZVVuaXQuU0VDT05EUykpOworCisgICAgICAgIC8vIEFzc2VydCB0aGF0IHRoZSBtYWduaWZpZXIgcG9zaXRpb24gcmVwcmVzZW50cyBhIHZhbGlkIHJlY3RhbmdsZSBvbiBzY3JlZW4uCisgICAgICAgIGZpbmFsIFJlY3QgcG9zaXRpb24gPSBtTWFnbmlmaWVyLmdldFdpbmRvd1Bvc2l0aW9uT25TY3JlZW4oKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocG9zaXRpb24uaXNFbXB0eSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IHBvc2l0aW9uLmxlZnQgJiYgcG9zaXRpb24ucmlnaHQgPD0gbUxheW91dC5nZXRXaWR0aCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IHBvc2l0aW9uLnRvcCAmJiBwb3NpdGlvbi5ib3R0b20gPD0gbUxheW91dC5nZXRIZWlnaHQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2luZG93Q29udGVudF9tb2RpZmllc0FmdGVyVXBkYXRlKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIHByZXBhcmVGb3VyUXVhZHJhbnRzU2NlbmFyaW8oKTsKKworICAgICAgICAvLyBTaG93IHRoZSBtYWduaWZpZXIgYXQgdGhlIGNlbnRlciBvZiB0aGUgYWN0aXZpdHkuCisgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGxhdGNoRm9yU2hvdyA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICAgICAgbU1hZ25pZmllci5zZXRPbk9wZXJhdGlvbkNvbXBsZXRlQ2FsbGJhY2sobGF0Y2hGb3JTaG93Ojpjb3VudERvd24pOworICAgICAgICBtQWN0aXZpdHlSdWxlLnJ1bk9uVWlUaHJlYWQoKCkgLT4geworICAgICAgICAgICAgbU1hZ25pZmllci5zaG93KG1MYXlvdXQuZ2V0V2lkdGgoKSAvIDIsIG1MYXlvdXQuZ2V0SGVpZ2h0KCkgLyAyKTsKKyAgICAgICAgfSk7CisgICAgICAgIGFzc2VydFRydWUoVElNRV9MSU1JVF9FWENFRURFRCwgbGF0Y2hGb3JTaG93LmF3YWl0KDEsIFRpbWVVbml0LlNFQ09ORFMpKTsKKworICAgICAgICBmaW5hbCBCaXRtYXAgaW5pdGlhbEJpdG1hcCA9IG1NYWduaWZpZXIuZ2V0Q29udGVudCgpCisgICAgICAgICAgICAgICAgLmNvcHkobU1hZ25pZmllci5nZXRDb250ZW50KCkuZ2V0Q29uZmlnKCksIHRydWUpOworICAgICAgICBhc3NlcnRGb3VyUXVhZHJhbnRzKGluaXRpYWxCaXRtYXApOworCisgICAgICAgIC8vIE1ha2UgdGhlIG9uZSBxdWFkcmFudCB3aGl0ZS4KKyAgICAgICAgZmluYWwgVmlldyBxdWFkcmFudDEgPQorICAgICAgICAgICAgICAgIG1BY3Rpdml0eS5maW5kVmlld0J5SWQoUi5pZC5tYWduaWZpZXJfYWN0aXZpdHlfZm91cl9xdWFkcmFudHNfbGF5b3V0X3F1YWRyYW50XzEpOworICAgICAgICBXaWRnZXRUZXN0VXRpbHMucnVuT25NYWluQW5kRHJhd1N5bmMobUFjdGl2aXR5UnVsZSwgcXVhZHJhbnQxLCAoKSAtPiB7CisgICAgICAgICAgICBxdWFkcmFudDEuc2V0QmFja2dyb3VuZChudWxsKTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgLy8gVXBkYXRlIHRoZSBtYWduaWZpZXIuCisgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGxhdGNoRm9yVXBkYXRlID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworICAgICAgICBtTWFnbmlmaWVyLnNldE9uT3BlcmF0aW9uQ29tcGxldGVDYWxsYmFjayhsYXRjaEZvclVwZGF0ZTo6Y291bnREb3duKTsKKyAgICAgICAgbUFjdGl2aXR5UnVsZS5ydW5PblVpVGhyZWFkKG1NYWduaWZpZXI6OnVwZGF0ZSk7CisgICAgICAgIGFzc2VydFRydWUoVElNRV9MSU1JVF9FWENFRURFRCwgbGF0Y2hGb3JVcGRhdGUuYXdhaXQoMSwgVGltZVVuaXQuU0VDT05EUykpOworCisgICAgICAgIGZpbmFsIEJpdG1hcCBuZXdCaXRtYXAgPSBtTWFnbmlmaWVyLmdldENvbnRlbnQoKTsKKyAgICAgICAgYXNzZXJ0Rm91clF1YWRyYW50cyhuZXdCaXRtYXApOworICAgICAgICBhc3NlcnRGYWxzZShuZXdCaXRtYXAuc2FtZUFzKGluaXRpYWxCaXRtYXApKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBhY3Rpdml0eSB0byBjb250YWluIGZvdXIgZXF1YWwgcXVhZHJhbnRzIGNvbG91cmVkIGRpZmZlcmVudGx5IGFuZAorICAgICAqIGluc3RhbnRpYXRlcyBhIG1hZ25pZmllci4gVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gdGhlIFVJIHRocmVhZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcHJlcGFyZUZvdXJRdWFkcmFudHNTY2VuYXJpbygpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBXaWRnZXRUZXN0VXRpbHMucnVuT25NYWluQW5kTGF5b3V0U3luYyhtQWN0aXZpdHlSdWxlLCAoKSAtPiB7CisgICAgICAgICAgICBtQWN0aXZpdHkuc2V0Q29udGVudFZpZXcoUi5sYXlvdXQubWFnbmlmaWVyX2FjdGl2aXR5X2ZvdXJfcXVhZHJhbnRzX2xheW91dCk7CisgICAgICAgICAgICBtTGF5b3V0ID0gbUFjdGl2aXR5LmZpbmRWaWV3QnlJZChSLmlkLm1hZ25pZmllcl9hY3Rpdml0eV9mb3VyX3F1YWRyYW50c19sYXlvdXQpOworICAgICAgICAgICAgbU1hZ25pZmllciA9IG5ldyBNYWduaWZpZXIobUxheW91dCk7CisgICAgICAgIH0sIGZhbHNlKTsKKyAgICAgICAgV2lkZ2V0VGVzdFV0aWxzLnJ1bk9uTWFpbkFuZERyYXdTeW5jKG1BY3Rpdml0eVJ1bGUsIG1MYXlvdXQsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFzc2VydHMgdGhhdCB0aGUgY3VycmVudCBiaXRtYXAgY29udGFpbnMgZm91ciBkaWZmZXJlbnQgZG9taW5hbnQgY29sb3JzLCB3aGljaAorICAgICAqIGFyZSAoYWxtb3N0KSBlcXVhbGx5IGRpc3RyaWJ1dGVkLiBUaGUgdGVzdCB0YWtlcyBpbnRvIGFjY291bnQgYW4gYW1vdW50IG9mCisgICAgICogbm9pc2UsIHBvc3NpYmxlIGNvbnNlcXVlbmNlIG9mIHVwc2NhbGluZyBhbmQgZmlsdGVyaW5nIHRoZSBtYWduaWZpZWQgY29udGVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiaXRtYXAgdGhlIGJpdG1hcCB0byBiZSBjaGVja2VkCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydEZvdXJRdWFkcmFudHMoZmluYWwgQml0bWFwIGJpdG1hcCkgeworICAgICAgICBmaW5hbCBpbnQgZXhwZWN0ZWRRdWFkcmFudHMgPSA0OworICAgICAgICBmaW5hbCBpbnQgdG90YWxQaXhlbHMgPSBiaXRtYXAuZ2V0V2lkdGgoKSAqIGJpdG1hcC5nZXRIZWlnaHQoKTsKKworICAgICAgICBmaW5hbCBNYXA8SW50ZWdlciwgSW50ZWdlcj4gY29sb3JDb3VudCA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCBiaXRtYXAuZ2V0V2lkdGgoKTsgKyt4KSB7CisgICAgICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IGJpdG1hcC5nZXRIZWlnaHQoKTsgKyt5KSB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGN1cnJlbnRDb2xvciA9IGJpdG1hcC5nZXRQaXhlbCh4LCB5KTsKKyAgICAgICAgICAgICAgICBjb2xvckNvdW50LnB1dChjdXJyZW50Q29sb3IsIGNvbG9yQ291bnQuZ2V0T3JEZWZhdWx0KGN1cnJlbnRDb2xvciwgMCkgKyAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKGNvbG9yQ291bnQuc2l6ZSgpID49IGV4cGVjdGVkUXVhZHJhbnRzKTsKKworICAgICAgICBmaW5hbCBMaXN0PEludGVnZXI+IGNvdW50cyA9IG5ldyBBcnJheUxpc3Q8Pihjb2xvckNvdW50LnZhbHVlcygpKTsKKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydChjb3VudHMpOworCisgICAgICAgIGludCBxdWFkcmFudHNUb3RhbCA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSBjb3VudHMuc2l6ZSgpIC0gZXhwZWN0ZWRRdWFkcmFudHM7IGkgPCBjb3VudHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIHF1YWRyYW50c1RvdGFsICs9IGNvdW50cy5nZXQoaSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZSgxLjBmICogKHRvdGFsUGl4ZWxzIC0gcXVhZHJhbnRzVG90YWwpIC8gdG90YWxQaXhlbHMgPD0gMC4xZik7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IGNvdW50cy5zaXplKCkgLSBleHBlY3RlZFF1YWRyYW50czsgaSA8IGNvdW50cy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgZmluYWwgZmxvYXQgcHJvcG9ydGlvbiA9IDEuMGYKKyAgICAgICAgICAgICAgICAgICAgKiBNYXRoLmFicyhleHBlY3RlZFF1YWRyYW50cyAqIGNvdW50cy5nZXQoaSkgLSBxdWFkcmFudHNUb3RhbCkgLyBxdWFkcmFudHNUb3RhbDsKKyAgICAgICAgICAgIGFzc2VydFRydWUocHJvcG9ydGlvbiA8PSAwLjFmKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL01lZGlhQ29udHJvbGxlclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL01lZGlhQ29udHJvbGxlclRlc3QuamF2YQppbmRleCAzODZjM2Q5Li5hOTlmMjFkIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9NZWRpYUNvbnRyb2xsZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvTWVkaWFDb250cm9sbGVyVGVzdC5qYXZhCkBAIC0yNCwxMSArMjQsNiBAQAogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwogaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlhtbDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CkBAIC0zNiw2ICszMSwxMiBAQAogaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lk1lZGlhQ29udHJvbGxlcjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5WaWRlb1ZpZXc7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuUG9sbGluZ0NoZWNrOwogCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL01vY2tUZXh0Vmlldy5qYXZhIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvTW9ja1RleHRWaWV3LmphdmEKaW5kZXggZmZkY2ZkZS4uMDQzYjZiYiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvTW9ja1RleHRWaWV3LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvTW9ja1RleHRWaWV3LmphdmEKQEAgLTE2LDkgKzE2LDkgQEAKIAogcGFja2FnZSBhbmRyb2lkLndpZGdldC5jdHM7CiAKLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk51bGxhYmxlOwogaW1wb3J0IGFuZHJvaWQudGV4dC5tZXRob2QuTW92ZW1lbnRNZXRob2Q7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL011bHRpQXV0b0NvbXBsZXRlVGV4dFZpZXdUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9NdWx0aUF1dG9Db21wbGV0ZVRleHRWaWV3VGVzdC5qYXZhCmluZGV4IDQwNzVhODMuLmQ4OWM0M2IgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL011bHRpQXV0b0NvbXBsZXRlVGV4dFZpZXdUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvTXVsdGlBdXRvQ29tcGxldGVUZXh0Vmlld1Rlc3QuamF2YQpAQCAtMjYsMTAgKzI2LDYgQEAKIAogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZVN0cmluZzsKIGltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5lZDsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwpAQCAtNDEsNiArMzcsMTEgQEAKIGltcG9ydCBhbmRyb2lkLndpZGdldC5NdWx0aUF1dG9Db21wbGV0ZVRleHRWaWV3LkNvbW1hVG9rZW5pemVyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lk11bHRpQXV0b0NvbXBsZXRlVGV4dFZpZXcuVG9rZW5pemVyOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL011bHRpQXV0b0NvbXBsZXRlVGV4dFZpZXdfQ29tbWFUb2tlbml6ZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9NdWx0aUF1dG9Db21wbGV0ZVRleHRWaWV3X0NvbW1hVG9rZW5pemVyVGVzdC5qYXZhCmluZGV4IGJhNDY3ZTQuLmVhMDU1Y2YgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL011bHRpQXV0b0NvbXBsZXRlVGV4dFZpZXdfQ29tbWFUb2tlbml6ZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvTXVsdGlBdXRvQ29tcGxldGVUZXh0Vmlld19Db21tYVRva2VuaXplclRlc3QuamF2YQpAQCAtMTgsMTMgKzE4LDE0IEBACiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiAKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nOwogaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmVkOwogaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5VbmRlcmxpbmVTcGFuOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lk11bHRpQXV0b0NvbXBsZXRlVGV4dFZpZXc7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL051bWJlclBpY2tlclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL051bWJlclBpY2tlclRlc3QuamF2YQppbmRleCA2NjQwY2M0Li40Y2M1ZWM2IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9OdW1iZXJQaWNrZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvTnVtYmVyUGlja2VyVGVzdC5qYXZhCkBAIC0zMCwxNSArMzAsMTcgQEAKIGltcG9ydCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb247CiBpbXBvcnQgYW5kcm9pZC5hcHAuVWlBdXRvbWF0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuTnVtYmVyUGlja2VyOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5GbGFreVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DdHNUb3VjaFV0aWxzOwogCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKQEAgLTQ3LDYgKzQ5LDcgQEAKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiBpbXBvcnQgb3JnLm1vY2tpdG8uSW5PcmRlcjsKIAorQEZsYWt5VGVzdAogQFNtYWxsVGVzdAogQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKIHB1YmxpYyBjbGFzcyBOdW1iZXJQaWNrZXJUZXN0IHsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL09XTkVSUyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODA5NWZlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvT1dORVJTCkBAIC0wLDAgKzEsNyBAQAorcGVyLWZpbGUgVGV4dFZpZXcqLmphdmEgPSBzaXlhbWVkQGdvb2dsZS5jb20KK3Blci1maWxlIFRleHRWaWV3Ki5qYXZhID0gbm9uYUBnb29nbGUuY29tCitwZXItZmlsZSBUZXh0VmlldyouamF2YSA9IGNsYXJhYmF5YXJyaUBnb29nbGUuY29tCisKK3Blci1maWxlIEVkaXRUZXh0Ki5qYXZhID0gc2l5YW1lZEBnb29nbGUuY29tCitwZXItZmlsZSBFZGl0VGV4dCouamF2YSA9IG5vbmFAZ29vZ2xlLmNvbQorcGVyLWZpbGUgRWRpdFRleHQqLmphdmEgPSBjbGFyYWJheWFycmlAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvUG9pbnRlckljb25UZXN0LmphdmEgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9Qb2ludGVySWNvblRlc3QuamF2YQppbmRleCBmZTk4NWIyLi40MzBlODBjIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9Qb2ludGVySWNvblRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9Qb2ludGVySWNvblRlc3QuamF2YQpAQCAtMTksMTAgKzE5LDYgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiAKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5Qb2ludGVySWNvbjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKQEAgLTMwLDYgKzI2LDExIEBACiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGFiV2lkZ2V0OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLldpZGdldFRlc3RVdGlsczsKIAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CkBAIC01OSw4ICs2MCwxMCBAQAogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBhc3NlcnRQb2ludGVySWNvbihTdHJpbmcgbWVzc2FnZSwgUG9pbnRlckljb24gZXhwZWN0ZWRJY29uLCBWaWV3IHRhcmdldCkgewotICAgICAgICBmaW5hbCBpbnRbXSB0b3BQb3MgPSBtVG9wVmlldy5nZXRMb2NhdGlvbk9uU2NyZWVuKCk7Ci0gICAgICAgIGZpbmFsIGludFtdIHRhcmdldFBvcyA9IHRhcmdldC5nZXRMb2NhdGlvbk9uU2NyZWVuKCk7CisgICAgICAgIGZpbmFsIGludFtdIHRvcFBvcyA9IG5ldyBpbnRbMl07CisgICAgICAgIG1Ub3BWaWV3LmdldExvY2F0aW9uT25TY3JlZW4odG9wUG9zKTsKKyAgICAgICAgZmluYWwgaW50W10gdGFyZ2V0UG9zID0gbmV3IGludFsyXTsKKyAgICAgICAgdGFyZ2V0LmdldExvY2F0aW9uT25TY3JlZW4odGFyZ2V0UG9zKTsKICAgICAgICAgZmluYWwgaW50IHggPSB0YXJnZXRQb3NbMF0gKyB0YXJnZXQuZ2V0V2lkdGgoKSAvIDIgLSB0b3BQb3NbMF07CiAgICAgICAgIGZpbmFsIGludCB5ID0gdGFyZ2V0UG9zWzFdICsgdGFyZ2V0LmdldEhlaWdodCgpIC8gMiAtIHRvcFBvc1sxXTsKICAgICAgICAgZmluYWwgTW90aW9uRXZlbnQgZXZlbnQgPSBNb3Rpb25FdmVudC5vYnRhaW4oMCwgMCwgTW90aW9uRXZlbnQuQUNUSU9OX0hPVkVSX01PVkUsIHgsIHksIDApOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvUG9wdXBNZW51VGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvUG9wdXBNZW51VGVzdC5qYXZhCmluZGV4IDVjZTczYTguLjY5NDExYzkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1BvcHVwTWVudVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9Qb3B1cE1lbnVUZXN0LmphdmEKQEAgLTI4LDExICsyOCw3IEBACiAKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKIGltcG9ydCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb247Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKIGltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUluZmxhdGVyOwpAQCAtNDAsOSArMzYsMTYgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuU3ViTWVudTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5FZGl0VGV4dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuUG9wdXBNZW51OwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkN0c1RvdWNoVXRpbHM7CiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5XaWRnZXRUZXN0VXRpbHM7CiAKQEAgLTI3Myw3ICsyNzYsNyBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0SXRlbVZpZXdBdHRyaWJ1dGVzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIG1CdWlsZGVyID0gbmV3IEJ1aWxkZXIoKS53aXRoRGlzbWlzc0xpc3RlbmVyKCk7CisgICAgICAgIG1CdWlsZGVyID0gbmV3IEJ1aWxkZXIoKS53aXRoRGlzbWlzc0xpc3RlbmVyKCkud2l0aEFuY2hvcklkKFIuaWQuYW5jaG9yX3VwcGVyX2xlZnQpOwogICAgICAgICBXaWRnZXRUZXN0VXRpbHMucnVuT25NYWluQW5kTGF5b3V0U3luYyhtQWN0aXZpdHlSdWxlLCBtQnVpbGRlcjo6c2hvdywgdHJ1ZSk7CiAKICAgICAgICAgTWVudSBtZW51ID0gbVBvcHVwTWVudS5nZXRNZW51KCk7CkBAIC0zMDMsNiArMzA2LDQwIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHcm91cERpdmlkZXJFbmFibGVkQVBJKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIHRlc3RHcm91cERpdmlkZXIoZmFsc2UpOworICAgICAgICB0ZXN0R3JvdXBEaXZpZGVyKHRydWUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0R3JvdXBEaXZpZGVyKGJvb2xlYW4gZ3JvdXBEaXZpZGVyRW5hYmxlZCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIG1CdWlsZGVyID0gbmV3IEJ1aWxkZXIoKS53aXRoR3JvdXBEaXZpZGVyKGdyb3VwRGl2aWRlckVuYWJsZWQpCisgICAgICAgICAgICAud2l0aEFuY2hvcklkKFIuaWQuYW5jaG9yX3VwcGVyX2xlZnQpOworICAgICAgICBXaWRnZXRUZXN0VXRpbHMucnVuT25NYWluQW5kTGF5b3V0U3luYyhtQWN0aXZpdHlSdWxlLCBtQnVpbGRlcjo6c2hvdywgdHJ1ZSk7CisKKyAgICAgICAgTWVudSBtZW51ID0gbVBvcHVwTWVudS5nZXRNZW51KCk7CisgICAgICAgIExpc3RWaWV3IG1lbnVJdGVtTGlzdCA9IG1Qb3B1cE1lbnUuZ2V0TWVudUxpc3RWaWV3KCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZW51SXRlbUxpc3QuZ2V0Q2hpbGRDb3VudCgpOyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBjdXJyR3JvdXBJZCA9IG1lbnUuZ2V0SXRlbShpKS5nZXRHcm91cElkKCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgcHJldkdyb3VwSWQgPQorICAgICAgICAgICAgICAgICAgICBpIC0gMSA+PSAwID8gbWVudS5nZXRJdGVtKGkgLSAxKS5nZXRHcm91cElkKCkgOiBjdXJyR3JvdXBJZDsKKyAgICAgICAgICAgIFZpZXcgaXRlbVZpZXcgPSBtZW51SXRlbUxpc3QuZ2V0Q2hpbGRBdChpKTsKKyAgICAgICAgICAgIC8vIEZpbmQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5ncm91cF9kaXZpZGVyCisgICAgICAgICAgICBJbWFnZVZpZXcgZ3JvdXBEaXZpZGVyID0gaXRlbVZpZXcuZmluZFZpZXdCeUlkKAorICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZXMuZ2V0U3lzdGVtKCkuZ2V0SWRlbnRpZmllcigiZ3JvdXBfZGl2aWRlciIsICJpZCIsICJhbmRyb2lkIikpOworCisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGdyb3VwRGl2aWRlcik7CisgICAgICAgICAgICBpZiAoIWdyb3VwRGl2aWRlckVuYWJsZWQgfHwgY3Vyckdyb3VwSWQgPT0gcHJldkdyb3VwSWQpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZ3JvdXBEaXZpZGVyLmdldFZpc2liaWxpdHkoKSwgVmlldy5HT05FKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGdyb3VwRGl2aWRlci5nZXRWaXNpYmlsaXR5KCksIFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB0ZWFyZG93bigpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIElubmVyIGhlbHBlciBjbGFzcyB0byBjb25maWd1cmUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFBvcHVwTWVudX0gZm9yIHRoZSBzcGVjaWZpYyB0ZXN0LgogICAgICAqIFRoZSBtYWluIHJlYXNvbiBmb3IgaXRzIGV4aXN0ZW5jZSBpcyB0aGF0IG9uY2UgYSBwb3B1cCBtZW51IGlzIHNob3duIHdpdGggdGhlIHNob3coKSBtZXRob2QsCkBAIC0zMTUsNiArMzUyLDcgQEAKICAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1IYXNNZW51SXRlbUNsaWNrTGlzdGVuZXI7CiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtSW5mbGF0ZVdpdGhJbmZsYXRlcjsKIAorICAgICAgICBwcml2YXRlIGludCBtQW5jaG9ySWQgPSBSLmlkLmFuY2hvcl9taWRkbGVfbGVmdDsKICAgICAgICAgcHJpdmF0ZSBpbnQgbVBvcHVwTWVudUNvbnRlbnQgPSBSLm1lbnUucG9wdXBfbWVudTsKIAogICAgICAgICBwcml2YXRlIGJvb2xlYW4gbVVzZUN1c3RvbVBvcHVwUmVzb3VyY2U7CkBAIC0zMjgsNiArMzY2LDggQEAKIAogICAgICAgICBwcml2YXRlIFZpZXcgbUFuY2hvcjsKIAorICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUdyb3VwRGl2aWRlckVuYWJsZWQgPSBmYWxzZTsKKwogICAgICAgICBwdWJsaWMgQnVpbGRlciB3aXRoTWVudUl0ZW1DbGlja0xpc3RlbmVyKCkgewogICAgICAgICAgICAgbUhhc01lbnVJdGVtQ2xpY2tMaXN0ZW5lciA9IHRydWU7CiAgICAgICAgICAgICByZXR1cm4gdGhpczsKQEAgLTM2MCw4ICs0MDAsMTggQEAKICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICB9CiAKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgd2l0aEdyb3VwRGl2aWRlcihib29sZWFuIGdyb3VwRGl2aWRlckVuYWJsZWQpIHsKKyAgICAgICAgICAgIG1Hcm91cERpdmlkZXJFbmFibGVkID0gZ3JvdXBEaXZpZGVyRW5hYmxlZDsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgd2l0aEFuY2hvcklkKGludCBhbmNob3JJZCkgeworICAgICAgICAgICAgbUFuY2hvcklkID0gYW5jaG9ySWQ7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCiAgICAgICAgIHByaXZhdGUgdm9pZCBjb25maWd1cmUoKSB7Ci0gICAgICAgICAgICBtQW5jaG9yID0gbUFjdGl2aXR5LmZpbmRWaWV3QnlJZChSLmlkLmFuY2hvcl9taWRkbGVfbGVmdCk7CisgICAgICAgICAgICBtQW5jaG9yID0gbUFjdGl2aXR5LmZpbmRWaWV3QnlJZChtQW5jaG9ySWQpOwogICAgICAgICAgICAgaWYgKCFtVXNlQ3VzdG9tR3Jhdml0eSAmJiAhbVVzZUN1c3RvbVBvcHVwUmVzb3VyY2UpIHsKICAgICAgICAgICAgICAgICBtUG9wdXBNZW51ID0gbmV3IFBvcHVwTWVudShtQWN0aXZpdHksIG1BbmNob3IpOwogICAgICAgICAgICAgfSBlbHNlIGlmICghbVVzZUN1c3RvbVBvcHVwUmVzb3VyY2UpIHsKQEAgLTM5MCw2ICs0NDAsMTAgQEAKICAgICAgICAgICAgICAgICBtT25EaXNtaXNzTGlzdGVuZXIgPSBtb2NrKFBvcHVwTWVudS5PbkRpc21pc3NMaXN0ZW5lci5jbGFzcyk7CiAgICAgICAgICAgICAgICAgbVBvcHVwTWVudS5zZXRPbkRpc21pc3NMaXN0ZW5lcihtT25EaXNtaXNzTGlzdGVuZXIpOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobUdyb3VwRGl2aWRlckVuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICBtUG9wdXBNZW51LmdldE1lbnUoKS5zZXRHcm91cERpdmlkZXJFbmFibGVkKHRydWUpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHZvaWQgc2hvdygpIHsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1BvcHVwV2luZG93VGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvUG9wdXBXaW5kb3dUZXN0LmphdmEKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCAyYzQ4M2Q3Li45MjNmNTIyCi0tLSBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1BvcHVwV2luZG93VGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1BvcHVwV2luZG93VGVzdC5qYXZhCkBAIC00MCwxMiArNDAsNiBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQ29sb3JEcmF3YWJsZTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5GbGFreVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudHJhbnNpdGlvbi5UcmFuc2l0aW9uOwogaW1wb3J0IGFuZHJvaWQudHJhbnNpdGlvbi5UcmFuc2l0aW9uLlRyYW5zaXRpb25MaXN0ZW5lcjsKIGltcG9ydCBhbmRyb2lkLnRyYW5zaXRpb24uVHJhbnNpdGlvblZhbHVlczsKQEAgLTY1LDYgKzU5LDEzIEBACiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuUG9wdXBXaW5kb3cuT25EaXNtaXNzTGlzdGVuZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLkZsYWt5VGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLldpZGdldFRlc3RVdGlsczsKIAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9Qcm9ncmVzc0JhckRyYXdhYmxlQ29udGFpbmVyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvUHJvZ3Jlc3NCYXJEcmF3YWJsZUNvbnRhaW5lclRlc3QuamF2YQppbmRleCAyYWNmOGVjZC4uMDRhYzViMiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvUHJvZ3Jlc3NCYXJEcmF3YWJsZUNvbnRhaW5lclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9Qcm9ncmVzc0JhckRyYXdhYmxlQ29udGFpbmVyVGVzdC5qYXZhCkBAIC0yMCwxMiArMjAsMTMgQEAKIAogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGVDb250YWluZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlByb2dyZXNzQmFyOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvUHJvZ3Jlc3NCYXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9Qcm9ncmVzc0JhclRlc3QuamF2YQppbmRleCA1YTY4MjczLi5jZTRkNGEzIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9Qcm9ncmVzc0JhclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9Qcm9ncmVzc0JhclRlc3QuamF2YQpAQCAtMzgsMTAgKzM4LDYgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkNvbG9yRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BY2NlbGVyYXRlRGVjZWxlcmF0ZUludGVycG9sYXRvcjsKQEAgLTUxLDYgKzQ3LDExIEBACiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuUHJvZ3Jlc3NCYXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuY3RzLnV0aWwuVGVzdFV0aWxzOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvUXVpY2tDb250YWN0QmFkZ2VUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9RdWlja0NvbnRhY3RCYWRnZVRlc3QuamF2YQppbmRleCAwYmVjODA4Li45NmEyOWY3MyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvUXVpY2tDb250YWN0QmFkZ2VUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvUXVpY2tDb250YWN0QmFkZ2VUZXN0LmphdmEKQEAgLTI4LDEyICsyOCwxMyBAQAogaW1wb3J0IGFuZHJvaWQub3MuVXNlckhhbmRsZTsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3Q7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbnRhY3RzOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlF1aWNrQ29udGFjdEJhZGdlOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvUmFkaW9CdXR0b25UZXN0LmphdmEgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9SYWRpb0J1dHRvblRlc3QuamF2YQppbmRleCAyZGFhNmVhLi4xYmE2OGIxIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9SYWRpb0J1dHRvblRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9SYWRpb0J1dHRvblRlc3QuamF2YQpAQCAtMjYsMTQgKzI2LDE1IEBACiAKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKIGltcG9ydCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb247Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmFkaW9CdXR0b247CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DdHNUb3VjaFV0aWxzOwogCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1JhZGlvR3JvdXBUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9SYWRpb0dyb3VwVGVzdC5qYXZhCmluZGV4IDg2OTEwMmIuLjc0ODUyYzUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1JhZGlvR3JvdXBUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvUmFkaW9Hcm91cFRlc3QuamF2YQpAQCAtMjUsMTAgKzI1LDYgQEAKIAogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5YbWw7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CkBAIC00Miw2ICszOCwxMSBAQAogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlJhZGlvR3JvdXAuT25DaGVja2VkQ2hhbmdlTGlzdGVuZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVsYXRpdmVMYXlvdXQ7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9SYWRpb0dyb3VwX0xheW91dFBhcmFtc1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1JhZGlvR3JvdXBfTGF5b3V0UGFyYW1zVGVzdC5qYXZhCmluZGV4IGQ3YWVjZmQuLjJkNjgwNGUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1JhZGlvR3JvdXBfTGF5b3V0UGFyYW1zVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1JhZGlvR3JvdXBfTGF5b3V0UGFyYW1zVGVzdC5qYXZhCkBAIC0yMiwxNSArMjIsMTYgQEAKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5YbWw7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5SYWRpb0dyb3VwOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1JhdGluZ0JhclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1JhdGluZ0JhclRlc3QuamF2YQppbmRleCAwNzI1YzEwLi4xMGYyNTgyIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9SYXRpbmdCYXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvUmF0aW5nQmFyVGVzdC5qYXZhCkBAIC0yNywxMiArMjcsMTMgQEAKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by52ZXJpZnlOb01vcmVJbnRlcmFjdGlvbnM7CiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8udmVyaWZ5WmVyb0ludGVyYWN0aW9uczsKIAotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5SYXRpbmdCYXI7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9SZWxhdGl2ZUxheW91dFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1JlbGF0aXZlTGF5b3V0VGVzdC5qYXZhCmluZGV4IDc2NDE1ZTguLjk0ZjAwNDYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1JlbGF0aXZlTGF5b3V0VGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1JlbGF0aXZlTGF5b3V0VGVzdC5qYXZhCkBAIC0yNSwxMCArMjUsNiBAQAogaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlhtbFJlc291cmNlUGFyc2VyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LlZpZXdBc3NlcnRzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlhtbDsKQEAgLTQwLDYgKzM2LDExIEBACiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVsYXRpdmVMYXlvdXQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuY3RzLnV0aWwuWG1sVXRpbHM7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvUmVsYXRpdmVMYXlvdXRfTGF5b3V0UGFyYW1zVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvUmVsYXRpdmVMYXlvdXRfTGF5b3V0UGFyYW1zVGVzdC5qYXZhCmluZGV4IDlkZTAzNGIuLmJmY2M3M2YgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1JlbGF0aXZlTGF5b3V0X0xheW91dFBhcmFtc1Rlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9SZWxhdGl2ZUxheW91dF9MYXlvdXRQYXJhbXNUZXN0LmphdmEKQEAgLTIxLDkgKzIxLDYgQEAKIAogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuWG1sUmVzb3VyY2VQYXJzZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnRlc3QuVmlld0Fzc2VydHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxheW91dERpcmVjdGlvbjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKQEAgLTMyLDYgKzI5LDEwIEBACiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVsYXRpdmVMYXlvdXQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuY3RzLnV0aWwuWG1sVXRpbHM7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1JlbW90ZVZpZXdzQWN0aXZpdHlUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9SZW1vdGVWaWV3c0FjdGl2aXR5VGVzdC5qYXZhCmluZGV4IDVjOTJlNjYuLmRlZDE4OTMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1JlbW90ZVZpZXdzQWN0aXZpdHlUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvUmVtb3RlVmlld3NBY3Rpdml0eVRlc3QuamF2YQpAQCAtMjEsMTQgKzIxLDE1IEBACiAKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudmlldy5JbmZsYXRlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3M7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5OdWxsV2ViVmlld1V0aWxzOwogCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1JlbW90ZVZpZXdzVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvUmVtb3RlVmlld3NUZXN0LmphdmEKaW5kZXggZjhiOTk5NC4uZjU0N2JlZCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvUmVtb3RlVmlld3NUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvUmVtb3RlVmlld3NUZXN0LmphdmEKQEAgLTM3LDEyICszNyw2IEBACiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTGFyZ2VUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKQEAgLTUyLDcgKzQ2LDYgQEAKIGltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQ2hyb25vbWV0ZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuRGF0ZVBpY2tlcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5EYXRlVGltZVZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuRWRpdFRleHQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuR3JpZExheW91dDsKQEAgLTc0LDYgKzY3LDEzIEBACiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVmlld0ZsaXBwZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuY3RzLnV0aWwuVGVzdFV0aWxzOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5MYXJnZVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuV2lkZ2V0VGVzdFV0aWxzOwogCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKQEAgLTQxMiw3ICs0MTIsNiBAQAogICAgICAgICBhc3NlcnRUcnVlKG1SZW1vdGVWaWV3cy5vbkxvYWRDbGFzcyhBbmFsb2dDbG9jay5jbGFzcykpOwogICAgICAgICBhc3NlcnRUcnVlKG1SZW1vdGVWaWV3cy5vbkxvYWRDbGFzcyhCdXR0b24uY2xhc3MpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShtUmVtb3RlVmlld3Mub25Mb2FkQ2xhc3MoQ2hyb25vbWV0ZXIuY2xhc3MpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShtUmVtb3RlVmlld3Mub25Mb2FkQ2xhc3MoRGF0ZVRpbWVWaWV3LmNsYXNzKSk7CiAgICAgICAgIGFzc2VydFRydWUobVJlbW90ZVZpZXdzLm9uTG9hZENsYXNzKEZyYW1lTGF5b3V0LmNsYXNzKSk7CiAgICAgICAgIGFzc2VydFRydWUobVJlbW90ZVZpZXdzLm9uTG9hZENsYXNzKEdyaWRMYXlvdXQuY2xhc3MpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShtUmVtb3RlVmlld3Mub25Mb2FkQ2xhc3MoR3JpZFZpZXcuY2xhc3MpKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1JlbW90ZVZpZXdzV2lkZ2V0VGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvUmVtb3RlVmlld3NXaWRnZXRUZXN0LmphdmEKaW5kZXggMGUyZjVjZi4uMjkwZGU0NyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvUmVtb3RlVmlld3NXaWRnZXRUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvUmVtb3RlVmlld3NXaWRnZXRUZXN0LmphdmEKQEAgLTM3LDEwICszNyw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuUHJvY2VzczsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLkxhcmdlVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkFwcE1vZGVGdWxsOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXc7CkBAIC01Miw2ICs0OSwxMSBAQAogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LmN0cy5hcHB3aWRnZXQuTXlBcHBXaWRnZXRQcm92aWRlcjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5jdHMuYXBwd2lkZ2V0Lk15QXBwV2lkZ2V0U2VydmljZTsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLkxhcmdlVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5Qb2xsaW5nQ2hlY2s7CiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5TeXN0ZW1VdGlsOwogCkBAIC03Myw2ICs3NSw3IEBACiAgKiBUZXN0IHtAbGluayBSZW1vdGVWaWV3c30gdGhhdCBleHBlY3QgdG8gb3BlcmF0ZSB3aXRoaW4gYSB7QGxpbmsgQXBwV2lkZ2V0SG9zdFZpZXd9IHJvb3QuCiAgKi8KIEBMYXJnZVRlc3QKK0BBcHBNb2RlRnVsbAogQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKIHB1YmxpYyBjbGFzcyBSZW1vdGVWaWV3c1dpZGdldFRlc3QgewogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gQ09VTlRSWV9MSVNUID0gbmV3IFN0cmluZ1tdIHsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1JlbW90ZVZpZXdzX0FjdGlvbkV4Y2VwdGlvblRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1JlbW90ZVZpZXdzX0FjdGlvbkV4Y2VwdGlvblRlc3QuamF2YQppbmRleCAzNTUwMTA4Li43YWFmZTk2IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9SZW1vdGVWaWV3c19BY3Rpb25FeGNlcHRpb25UZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvUmVtb3RlVmlld3NfQWN0aW9uRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0xNiwxMCArMTYsMTEgQEAKIAogcGFja2FnZSBhbmRyb2lkLndpZGdldC5jdHM7CiAKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3czsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvUmVzb3VyY2VDdXJzb3JBZGFwdGVyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvUmVzb3VyY2VDdXJzb3JBZGFwdGVyVGVzdC5qYXZhCmluZGV4IDk3MmYwOTIuLjVkNGE3OWEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1Jlc291cmNlQ3Vyc29yQWRhcHRlclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9SZXNvdXJjZUN1cnNvckFkYXB0ZXJUZXN0LmphdmEKQEAgLTI3LDE1ICsyNywxNiBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuTWF0cml4Q3Vyc29yOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5SZXNvdXJjZUN1cnNvckFkYXB0ZXI7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvUmVzb3VyY2VDdXJzb3JUcmVlQWRhcHRlclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1Jlc291cmNlQ3Vyc29yVHJlZUFkYXB0ZXJUZXN0LmphdmEKaW5kZXggMjA3NjYyMC4uZDIzNWEyMiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvUmVzb3VyY2VDdXJzb3JUcmVlQWRhcHRlclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9SZXNvdXJjZUN1cnNvclRyZWVBZGFwdGVyVGVzdC5qYXZhCkBAIC0yMiwxNSArMjIsMTYgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLk1hdHJpeEN1cnNvcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVzb3VyY2VDdXJzb3JUcmVlQWRhcHRlcjsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9TY3JvbGxWaWV3VGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvU2Nyb2xsVmlld1Rlc3QuamF2YQppbmRleCAzYWJiMDIzLi5hNGNjZDUwIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9TY3JvbGxWaWV3VGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1Njcm9sbFZpZXdUZXN0LmphdmEKQEAgLTI5LDExICsyOSw2IEBACiBpbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlhtbDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKQEAgLTQ0LDYgKzM5LDEyIEBACiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuY3RzLnV0aWwuVGVzdFV0aWxzOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlBvbGxpbmdDaGVjazsKIAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9TY3JvbGxlclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1Njcm9sbGVyVGVzdC5qYXZhCmluZGV4IGU5ZDk4YWUuLmQ4MjliY2QgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1Njcm9sbGVyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1Njcm9sbGVyVGVzdC5qYXZhCkBAIC0yMiwxMyArMjIsMTQgQEAKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5MYXJnZVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5MaW5lYXJJbnRlcnBvbGF0b3I7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuU2Nyb2xsZXI7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5MYXJnZVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9TZWFyY2hWaWV3VGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvU2VhcmNoVmlld1Rlc3QuamF2YQppbmRleCAzMDFjZWEyLi4wOGRkNmE1IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9TZWFyY2hWaWV3VGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1NlYXJjaFZpZXdUZXN0LmphdmEKQEAgLTMwLDE2ICszMCwxNyBAQAogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwogaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5JbnB1dFR5cGU7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuRWRpdG9ySW5mbzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5TZWFyY2hWaWV3OwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvU2VhcmNoVmlld19DdXJzb3JUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9TZWFyY2hWaWV3X0N1cnNvclRlc3QuamF2YQppbmRleCBjNDBjMGZkLi5mM2ZiYWNjIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9TZWFyY2hWaWV3X0N1cnNvclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9TZWFyY2hWaWV3X0N1cnNvclRlc3QuamF2YQpAQCAtMzEsMTEgKzMxLDYgQEAKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLk1hdHJpeEN1cnNvcjsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwpAQCAtNDQsNiArMzksMTIgQEAKIGltcG9ydCBhbmRyb2lkLndpZGdldC5TZWFyY2hWaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNpbXBsZUN1cnNvckFkYXB0ZXI7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ3RzVG91Y2hVdGlsczsKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlBvbGxpbmdDaGVjazsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvU2Vla0JhclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1NlZWtCYXJUZXN0LmphdmEKaW5kZXggOTM5NWRiNC4uZDdhNmM5MCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvU2Vla0JhclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9TZWVrQmFyVGVzdC5qYXZhCkBAIC0yNywxMyArMjcsMTQgQEAKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKIGltcG9ydCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5TZWVrQmFyOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1NpbXBsZUFkYXB0ZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9TaW1wbGVBZGFwdGVyVGVzdC5qYXZhCmluZGV4IDNjMzg4ZmMuLjNiMjI3OGQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1NpbXBsZUFkYXB0ZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvU2ltcGxlQWRhcHRlclRlc3QuamF2YQpAQCAtMzUsMTAgKzM1LDYgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcy5UaGVtZTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkJpdG1hcERyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CkBAIC00Nyw2ICs0MywxMSBAQAogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlR3b0xpbmVMaXN0SXRlbTsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLldpZGdldFRlc3RVdGlsczsKIAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9TaW1wbGVDdXJzb3JBZGFwdGVyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvU2ltcGxlQ3Vyc29yQWRhcHRlclRlc3QuamF2YQppbmRleCA4ODBkYTk4Li5iMGNiYjBjIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9TaW1wbGVDdXJzb3JBZGFwdGVyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1NpbXBsZUN1cnNvckFkYXB0ZXJUZXN0LmphdmEKQEAgLTM1LDEwICszNSw2IEBACiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5NYXRyaXhDdXJzb3I7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5CaXRtYXBEcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKQEAgLTQ3LDYgKzQzLDExIEBACiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuU2ltcGxlQ3Vyc29yQWRhcHRlcjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLldpZGdldFRlc3RVdGlsczsKIAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9TaW1wbGVDdXJzb3JUcmVlQWRhcHRlclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1NpbXBsZUN1cnNvclRyZWVBZGFwdGVyVGVzdC5qYXZhCmluZGV4IGZlZmQyNjEuLjdkMDU1ZTQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1NpbXBsZUN1cnNvclRyZWVBZGFwdGVyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1NpbXBsZUN1cnNvclRyZWVBZGFwdGVyVGVzdC5qYXZhCkBAIC0yNSwxNSArMjUsMTYgQEAKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLk1hdHJpeEN1cnNvcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkJpdG1hcERyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5TaW1wbGVDdXJzb3JUcmVlQWRhcHRlcjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLldpZGdldFRlc3RVdGlsczsKIAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9TaW1wbGVFeHBhbmRhYmxlTGlzdEFkYXB0ZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9TaW1wbGVFeHBhbmRhYmxlTGlzdEFkYXB0ZXJUZXN0LmphdmEKaW5kZXggZWVmMGE0OS4uOTA4ZWNjZiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvU2ltcGxlRXhwYW5kYWJsZUxpc3RBZGFwdGVyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1NpbXBsZUV4cGFuZGFibGVMaXN0QWRhcHRlclRlc3QuamF2YQpAQCAtMjIsMTAgKzIyLDYgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKQEAgLTMzLDYgKzI5LDExIEBACiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVHdvTGluZUxpc3RJdGVtOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvU2xpZGluZ0RyYXdlclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1NsaWRpbmdEcmF3ZXJUZXN0LmphdmEKaW5kZXggMTk5MzI0NC4uNDk0NmJkYSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvU2xpZGluZ0RyYXdlclRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9TbGlkaW5nRHJhd2VyVGVzdC5qYXZhCkBAIC0zMSwxMSArMzEsNiBAQAogCiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CiBpbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwpAQCAtNDMsNiArMzgsMTIgQEAKIGltcG9ydCBhbmRyb2lkLndpZGdldC5TbGlkaW5nRHJhd2VyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlBvbGxpbmdDaGVjazsKIAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9TcGlubmVyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvU3Bpbm5lclRlc3QuamF2YQppbmRleCA5YWViZDcxLi42YzM5MWIxIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9TcGlubmVyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1NwaW5uZXJUZXN0LmphdmEKQEAgLTM0LDExICszNCw2IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMuVGhlbWU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRUaGVtZVdyYXBwZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwpAQCAtNDcsNiArNDIsMTIgQEAKIGltcG9ydCBhbmRyb2lkLndpZGdldC5TcGlubmVyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LmN0cy51dGlsLlRlc3RVdGlsczsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5DdHNUb3VjaFV0aWxzOwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuV2lkZ2V0VGVzdFV0aWxzOwogCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9Td2l0Y2hUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9Td2l0Y2hUZXN0LmphdmEKaW5kZXggMTEyM2E0ZS4uMzI5ZjEyZSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvU3dpdGNoVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1N3aXRjaFRlc3QuamF2YQpAQCAtMjksMTYgKzI5LDE3IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuVHlwZWZhY2U7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0VGhlbWVXcmFwcGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuU3dpdGNoOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LmN0cy51dGlsLlRlc3RVdGlsczsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5XaWRnZXRUZXN0VXRpbHM7CiAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvVGFiSG9zdFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1RhYkhvc3RUZXN0LmphdmEKaW5kZXggMzZmNzEwOC4uNWEyMjVhMSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvVGFiSG9zdFRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9UYWJIb3N0VGVzdC5qYXZhCkBAIC0zMCwxMSArMzAsNiBAQAogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5R3JvdXA7CiBpbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKQEAgLTQzLDYgKzM4LDEyIEBACiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGFiSG9zdC5UYWJTcGVjOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuV2lkZ2V0VGVzdFV0aWxzOwogCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1RhYkhvc3RfVGFiU3BlY1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1RhYkhvc3RfVGFiU3BlY1Rlc3QuamF2YQppbmRleCBhMDQ5OGQ1Li5iNDY5MjEyIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9UYWJIb3N0X1RhYlNwZWNUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvVGFiSG9zdF9UYWJTcGVjVGVzdC5qYXZhCkBAIC0zMCwxNyArMzAsMTggQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkNvbG9yRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGFiSG9zdDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1RhYldpZGdldFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1RhYldpZGdldFRlc3QuamF2YQppbmRleCA3YWY3YWY5Li5hMDljZmRmIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9UYWJXaWRnZXRUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvVGFiV2lkZ2V0VGVzdC5qYXZhCkBAIC0yNiwxMSArMjYsNiBAQAogaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKQEAgLTQxLDYgKzM2LDEyIEBACiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuY3RzLnV0aWwuVGVzdFV0aWxzOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvVGFibGVMYXlvdXRUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9UYWJsZUxheW91dFRlc3QuamF2YQppbmRleCAzNTMyZTk5Li43MjM2MTQ5IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9UYWJsZUxheW91dFRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9UYWJsZUxheW91dFRlc3QuamF2YQpAQCAtMzAsMTEgKzMwLDYgQEAKIGltcG9ydCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb247CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5YbWxSZXNvdXJjZVBhcnNlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlhtbDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKQEAgLTQ3LDYgKzQyLDEyIEBACiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGFibGVSb3c7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9UYWJsZUxheW91dF9MYXlvdXRQYXJhbXNUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9UYWJsZUxheW91dF9MYXlvdXRQYXJhbXNUZXN0LmphdmEKaW5kZXggMDA5OTM3Zi4uMTg0Y2Y2YyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvVGFibGVMYXlvdXRfTGF5b3V0UGFyYW1zVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1RhYmxlTGF5b3V0X0xheW91dFBhcmFtc1Rlc3QuamF2YQpAQCAtMjIsMTUgKzIyLDE2IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuWG1sUmVzb3VyY2VQYXJzZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGFibGVMYXlvdXQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuY3RzLnV0aWwuWG1sVXRpbHM7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvVGFibGVSb3dUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9UYWJsZVJvd1Rlc3QuamF2YQppbmRleCAzMzBhODE4Li5mZWRlYmQ5IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9UYWJsZVJvd1Rlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9UYWJsZVJvd1Rlc3QuamF2YQpAQCAtMzAsMTAgKzMwLDYgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlhtbFJlc291cmNlUGFyc2VyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwpAQCAtNDUsNiArNDEsMTEgQEAKIGltcG9ydCBhbmRyb2lkLndpZGdldC5UYWJsZVJvdzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9UYWJsZVJvd19MYXlvdXRQYXJhbXNUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9UYWJsZVJvd19MYXlvdXRQYXJhbXNUZXN0LmphdmEKaW5kZXggNDUzYjBjMS4uYzMwNmEzZCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvVGFibGVSb3dfTGF5b3V0UGFyYW1zVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1RhYmxlUm93X0xheW91dFBhcmFtc1Rlc3QuamF2YQpAQCAtMjIsMTAgKzIyLDYgQEAKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5YbWxSZXNvdXJjZVBhcnNlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwpAQCAtMzUsNiArMzEsMTEgQEAKIGltcG9ydCBhbmRyb2lkLndpZGdldC5UYWJsZVJvdzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5jdHMudXRpbC5YbWxVdGlsczsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1RleHRDbG9ja0N0c0FjdGl2aXR5LmphdmEgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9UZXh0Q2xvY2tDdHNBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZTM1ODIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9UZXh0Q2xvY2tDdHNBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQud2lkZ2V0LmN0czsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRDbG9jazsKKworLyoqCisgKiBBIG1pbmltYWwgYXBwbGljYXRpb24gZm9yIHtAbGluayBUZXh0Q2xvY2t9IHRlc3QuCisgKi8KK3B1YmxpYyBjbGFzcyBUZXh0Q2xvY2tDdHNBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgYWN0aXZpdHkgaXMgZmlyc3QgY3JlYXRlZC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LnRleHRjbG9ja19sYXlvdXQpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvVGV4dENsb2NrVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvVGV4dENsb2NrVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4Y2FmOTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9UZXh0Q2xvY2tUZXN0LmphdmEKQEAgLTAsMCArMSwyMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQud2lkZ2V0LmN0czsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuQXBwT3BzTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTXV0YWJsZUJvb2xlYW47CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dENsb2NrOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5Qb2xsaW5nQ2hlY2s7CitpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5TeXN0ZW1VdGlsOworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CitpbXBvcnQgamF2YS51dGlsLlRpbWVab25lOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCisvKioKKyAqIFRlc3Qge0BsaW5rIFRleHRDbG9ja30uCisgKi8KK0BNZWRpdW1UZXN0CitAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIFRleHRDbG9ja1Rlc3QgeworICAgIHByaXZhdGUgQWN0aXZpdHkgbUFjdGl2aXR5OworICAgIHByaXZhdGUgVGV4dENsb2NrIG1UZXh0Q2xvY2s7CisgICAgcHJpdmF0ZSBTdHJpbmcgbURlZmF1bHRUaW1lMTIyNDsKKworICAgIEBSdWxlCisgICAgcHVibGljIEFjdGl2aXR5VGVzdFJ1bGU8VGV4dENsb2NrQ3RzQWN0aXZpdHk+IG1BY3Rpdml0eVJ1bGUgPQorICAgICAgICAgICAgbmV3IEFjdGl2aXR5VGVzdFJ1bGU8PihUZXh0Q2xvY2tDdHNBY3Rpdml0eS5jbGFzcyk7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0dXAoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgbUFjdGl2aXR5ID0gbUFjdGl2aXR5UnVsZS5nZXRBY3Rpdml0eSgpOworICAgICAgICBtVGV4dENsb2NrID0gbUFjdGl2aXR5LmZpbmRWaWV3QnlJZChSLmlkLnRleHRjbG9jayk7CisgICAgICAgIG1EZWZhdWx0VGltZTEyMjQgPSBTZXR0aW5ncy5TeXN0ZW0uZ2V0U3RyaW5nKG1BY3Rpdml0eS5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0uVElNRV8xMl8yNCk7CisgICAgfQorCisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgdGVhcmRvd24oKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgU2V0dGluZ3MuU3lzdGVtLnB1dFN0cmluZyhtQWN0aXZpdHkuZ2V0Q29udGVudFJlc29sdmVyKCksIFNldHRpbmdzLlN5c3RlbS5USU1FXzEyXzI0LAorICAgICAgICAgICAgICAgIG1EZWZhdWx0VGltZTEyMjQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVwZGF0ZTEyXzI0KCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGdyYW50V3JpdGVTZXR0aW5nc1Blcm1pc3Npb24oKTsKKworICAgICAgICBtQWN0aXZpdHlSdWxlLnJ1bk9uVWlUaHJlYWQoKCkgLT4geworICAgICAgICAgICAgbVRleHRDbG9jay5zZXRGb3JtYXQxMkhvdXIoImgiKTsKKyAgICAgICAgICAgIG1UZXh0Q2xvY2suc2V0Rm9ybWF0MjRIb3VyKCJIIik7CisgICAgICAgICAgICBtVGV4dENsb2NrLmRpc2FibGVDbG9ja1RpY2soKTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgZmluYWwgQ29udGVudFJlc29sdmVyIHJlc29sdmVyID0gbUFjdGl2aXR5LmdldENvbnRlbnRSZXNvbHZlcigpOworICAgICAgICBDYWxlbmRhciBtTm93ID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgbU5vdy5zZXRUaW1lSW5NaWxsaXMoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOyAvLyBqdXN0IGxpa2UgVGV4dENsb2NrIHVzZXMKKworICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIGNsb2NrIGlzIHNob3dpbmcgc29tZSB0aW1lID4gMTJwbSBhbmQgbm90IG5lYXIgbWlkbmlnaHQKKyAgICAgICAgZm9yIChTdHJpbmcgaWQgOiBUaW1lWm9uZS5nZXRBdmFpbGFibGVJRHMoKSkgeworICAgICAgICAgICAgZmluYWwgVGltZVpvbmUgdGltZVpvbmUgPSBUaW1lWm9uZS5nZXRUaW1lWm9uZShpZCk7CisgICAgICAgICAgICBtTm93LnNldFRpbWVab25lKHRpbWVab25lKTsKKyAgICAgICAgICAgIGludCBob3VyID0gbU5vdy5nZXQoQ2FsZW5kYXIuSE9VUl9PRl9EQVkpOworICAgICAgICAgICAgaWYgKGhvdXIgPCAyMiAmJiBob3VyID4gMTIpIHsKKyAgICAgICAgICAgICAgICBtQWN0aXZpdHlSdWxlLnJ1bk9uVWlUaHJlYWQoKCkgLT4geworICAgICAgICAgICAgICAgICAgICBtVGV4dENsb2NrLnNldFRpbWVab25lKGlkKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGNoYW5nZTEyID0gcmVnaXN0ZXJGb3JDaGFuZ2VzKFNldHRpbmdzLlN5c3RlbS5USU1FXzEyXzI0KTsKKyAgICAgICAgbUFjdGl2aXR5UnVsZS5ydW5PblVpVGhyZWFkKCgpIC0+IHsKKyAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5wdXRJbnQocmVzb2x2ZXIsIFNldHRpbmdzLlN5c3RlbS5USU1FXzEyXzI0LCAxMik7CisgICAgICAgIH0pOworICAgICAgICBhc3NlcnRUcnVlKGNoYW5nZTEyLmF3YWl0KDEsIFRpbWVVbml0LlNFQ09ORFMpKTsKKworICAgICAgICAvLyBNdXN0IHBvbGwgaGVyZSBiZWNhdXNlIHRoZXJlIGFyZSBubyB0aW1pbmcgZ3VhcmFudGVlcyBmb3IgQ29udGVudE9ic2VydmVyIG5vdGlmaWNhdGlvbgorICAgICAgICBQb2xsaW5nQ2hlY2sud2FpdEZvcigoKSAtPiB7CisgICAgICAgICAgICBmaW5hbCBNdXRhYmxlQm9vbGVhbiBvayA9IG5ldyBNdXRhYmxlQm9vbGVhbihmYWxzZSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1BY3Rpdml0eVJ1bGUucnVuT25VaVRocmVhZCgoKSAtPiB7CisgICAgICAgICAgICAgICAgICAgIGludCBob3VyID0gSW50ZWdlci5wYXJzZUludChtVGV4dENsb2NrLmdldFRleHQoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgb2sudmFsdWUgPSBob3VyID49IDEgJiYgaG91ciA8IDEyOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbih0LmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gb2sudmFsdWU7CisgICAgICAgIH0pOworCisgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGNoYW5nZTI0ID0gcmVnaXN0ZXJGb3JDaGFuZ2VzKFNldHRpbmdzLlN5c3RlbS5USU1FXzEyXzI0KTsKKyAgICAgICAgbUFjdGl2aXR5UnVsZS5ydW5PblVpVGhyZWFkKCgpIC0+IHsKKyAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5wdXRJbnQocmVzb2x2ZXIsIFNldHRpbmdzLlN5c3RlbS5USU1FXzEyXzI0LCAyNCk7CisgICAgICAgIH0pOworICAgICAgICBhc3NlcnRUcnVlKGNoYW5nZTI0LmF3YWl0KDEsIFRpbWVVbml0LlNFQ09ORFMpKTsKKworICAgICAgICAvLyBNdXN0IHBvbGwgaGVyZSBiZWNhdXNlIHRoZXJlIGFyZSBubyB0aW1pbmcgZ3VhcmFudGVlcyBmb3IgQ29udGVudE9ic2VydmVyIG5vdGlmaWNhdGlvbgorICAgICAgICBQb2xsaW5nQ2hlY2sud2FpdEZvcigoKSAtPiB7CisgICAgICAgICAgICBmaW5hbCBNdXRhYmxlQm9vbGVhbiBvayA9IG5ldyBNdXRhYmxlQm9vbGVhbihmYWxzZSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1BY3Rpdml0eVJ1bGUucnVuT25VaVRocmVhZCgoKSAtPiB7CisgICAgICAgICAgICAgICAgICAgIGludCBob3VyID0gSW50ZWdlci5wYXJzZUludChtVGV4dENsb2NrLmdldFRleHQoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgb2sudmFsdWUgPSBob3VyID4gMTIgJiYgaG91ciA8IDI0OworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIHJldHVybiBvay52YWx1ZTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24odC5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb0NoYW5nZSgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBncmFudFdyaXRlU2V0dGluZ3NQZXJtaXNzaW9uKCk7CisgICAgICAgIG1BY3Rpdml0eVJ1bGUucnVuT25VaVRocmVhZCgoKSAtPiB7CisgICAgICAgICAgICBtVGV4dENsb2NrLmRpc2FibGVDbG9ja1RpY2soKTsKKyAgICAgICAgfSk7CisgICAgICAgIGZpbmFsIENvbnRlbnRSZXNvbHZlciByZXNvbHZlciA9IG1BY3Rpdml0eS5nZXRDb250ZW50UmVzb2x2ZXIoKTsKKworICAgICAgICAvLyBOb3cgdGVzdCB0aGF0IGl0IGlzbid0IHVwZGF0ZWQgd2hlbiBhIG5vbi0xMi8yNCBob3VyIHNldHRpbmcgaXMgc2V0CisgICAgICAgIG1BY3Rpdml0eVJ1bGUucnVuT25VaVRocmVhZCgoKSAtPiB7CisgICAgICAgICAgICBtVGV4dENsb2NrLnNldFRleHQoIk5vdGhpbmciKTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgbUFjdGl2aXR5UnVsZS5ydW5PblVpVGhyZWFkKCgpIC0+IHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiTm90aGluZyIsIG1UZXh0Q2xvY2suZ2V0VGV4dCgpLnRvU3RyaW5nKCkpOworICAgICAgICB9KTsKKworICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBvdGhlckNoYW5nZSA9IHJlZ2lzdGVyRm9yQ2hhbmdlcyhTZXR0aW5ncy5TeXN0ZW0uVEVYVF9BVVRPX0NBUFMpOworICAgICAgICBtQWN0aXZpdHlSdWxlLnJ1bk9uVWlUaHJlYWQoKCkgLT4geworICAgICAgICAgICAgaW50IG9sZEF1dG9DYXBzID0gU2V0dGluZ3MuU3lzdGVtLmdldEludChyZXNvbHZlciwgU2V0dGluZ3MuU3lzdGVtLlRFWFRfQVVUT19DQVBTLAorICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaW50IG5ld0F1dG9DYXBzID0gb2xkQXV0b0NhcHMgPT0gMCA/IDEgOiAwOworICAgICAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5wdXRJbnQocmVzb2x2ZXIsIFNldHRpbmdzLlN5c3RlbS5URVhUX0FVVE9fQ0FQUywgbmV3QXV0b0NhcHMpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0ucHV0SW50KHJlc29sdmVyLCBTZXR0aW5ncy5TeXN0ZW0uVEVYVF9BVVRPX0NBUFMsIG9sZEF1dG9DYXBzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShvdGhlckNoYW5nZS5hd2FpdCgxLCBUaW1lVW5pdC5TRUNPTkRTKSk7CisgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLndhaXRGb3JJZGxlU3luYygpOworCisgICAgICAgIG1BY3Rpdml0eVJ1bGUucnVuT25VaVRocmVhZCgoKSAtPiB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIk5vdGhpbmciLCBtVGV4dENsb2NrLmdldFRleHQoKS50b1N0cmluZygpKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBDb3VudERvd25MYXRjaCByZWdpc3RlckZvckNoYW5nZXMoU3RyaW5nIHNldHRpbmcpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKworICAgICAgICBtQWN0aXZpdHlSdWxlLnJ1bk9uVWlUaHJlYWQoKCkgLT4geworICAgICAgICAgICAgZmluYWwgQ29udGVudFJlc29sdmVyIHJlc29sdmVyID0gbUFjdGl2aXR5LmdldENvbnRlbnRSZXNvbHZlcigpOworICAgICAgICAgICAgVXJpIHVyaSA9IFNldHRpbmdzLlN5c3RlbS5nZXRVcmlGb3Ioc2V0dGluZyk7CisgICAgICAgICAgICByZXNvbHZlci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcih1cmksIHRydWUsCisgICAgICAgICAgICAgICAgICAgIG5ldyBDb250ZW50T2JzZXJ2ZXIobmV3IEhhbmRsZXIoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNoYW5nZShib29sZWFuIHNlbGZDaGFuZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudERvd25BbmRSZW1vdmUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNoYW5nZShib29sZWFuIHNlbGZDaGFuZ2UsIFVyaSB1cmksIGludCB1c2VySWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudERvd25BbmRSZW1vdmUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIGNvdW50RG93bkFuZFJlbW92ZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlci51bnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKHRoaXMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBsYXRjaDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZ3JhbnRXcml0ZVNldHRpbmdzUGVybWlzc2lvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN5c3RlbVV0aWwucnVuU2hlbGxDb21tYW5kKEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLAorICAgICAgICAgICAgICAgICJhcHBvcHMgc2V0ICIgKyBtQWN0aXZpdHkuZ2V0UGFja2FnZU5hbWUoKSArICIgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBBcHBPcHNNYW5hZ2VyLk9QU1RSX1dSSVRFX1NFVFRJTkdTICsgIiBhbGxvdyIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1RleHRTd2l0Y2hlclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1RleHRTd2l0Y2hlclRlc3QuamF2YQppbmRleCBmYjk5Y2M3Li5mYWU0YTliIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9UZXh0U3dpdGNoZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvVGV4dFN3aXRjaGVyVGVzdC5qYXZhCkBAIC0yMSwxNSArMjEsMTYgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwogCiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRTd2l0Y2hlcjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9UZXh0Vmlld0ZhZGluZ0VkZ2VUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9UZXh0Vmlld0ZhZGluZ0VkZ2VUZXN0LmphdmEKaW5kZXggZjAwMWI0Ni4uNmQ4ZjI0ZCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvVGV4dFZpZXdGYWRpbmdFZGdlVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1RleHRWaWV3RmFkaW5nRWRnZVRlc3QuamF2YQpAQCAtMzAsMTQgKzMwLDE1IEBACiAKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKIGltcG9ydCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb247Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5Qb2xsaW5nQ2hlY2s7CiAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvVGV4dFZpZXdGb250V2VpZ2h0VGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvVGV4dFZpZXdGb250V2VpZ2h0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1N2FhMTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9UZXh0Vmlld0ZvbnRXZWlnaHRUZXN0LmphdmEKQEAgLTAsMCArMSwyMTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQud2lkZ2V0LmN0czsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlR5cGVmYWNlOworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBUZXN0IGZvciBmb250IHdlaWdodCBpbiBUZXh0VmlldworICovCitAU21hbGxUZXN0CitAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIFRleHRWaWV3Rm9udFdlaWdodFRlc3QgeworICAgIHByaXZhdGUgVGV4dFZpZXcgZ2V0VGV4dFZpZXcoaW50IGlkKSB7CisgICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLmdldFRhcmdldENvbnRleHQoKTsKKyAgICAgICAgZmluYWwgTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIgPSBMYXlvdXRJbmZsYXRlci5mcm9tKGNvbnRleHQpOworICAgICAgICBmaW5hbCBWaWV3R3JvdXAgY29udGFpbmVyID0KKyAgICAgICAgICAgICAgICAoVmlld0dyb3VwKSBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LnRleHR2aWV3X3dlaWdodF90ZXN0X2xheW91dCwgbnVsbCk7CisgICAgICAgIHJldHVybiAoVGV4dFZpZXcpIGNvbnRhaW5lci5maW5kVmlld0J5SWQoaWQpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEZvbnRTdHlsZSB7CisgICAgICAgIEZvbnRTdHlsZShpbnQgd2VpZ2h0LCBib29sZWFuIGl0YWxpYykgeworICAgICAgICAgICAgbVdlaWdodCA9IHdlaWdodDsKKyAgICAgICAgICAgIG1JdGFsaWMgPSBpdGFsaWM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldFdlaWdodCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtV2VpZ2h0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNJdGFsaWMoKSB7CisgICAgICAgICAgICByZXR1cm4gbUl0YWxpYzsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW50IG1XZWlnaHQ7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtSXRhbGljOworICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8Q2hhcmFjdGVyLCBGb250U3R5bGU+IENIQVJfRk9OVF9NQVA7CisgICAgc3RhdGljIHsKKyAgICAgICAgLy8gVGhpcyBtYXBwaW5nIG5lZWRzIHRvIGJlIHN5bmNlZCB3aXRoIHJlcy9mb250L2Z1bGxmYW1pbHkueG1sCisgICAgICAgIGZpbmFsIEhhc2hNYXA8Q2hhcmFjdGVyLCBGb250U3R5bGU+IG1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgbWFwLnB1dCgnYScsIG5ldyBGb250U3R5bGUoMTAwLCBmYWxzZSkpOworICAgICAgICBtYXAucHV0KCdiJywgbmV3IEZvbnRTdHlsZSgxMDAsIHRydWUpKTsKKyAgICAgICAgbWFwLnB1dCgnYycsIG5ldyBGb250U3R5bGUoMjAwLCBmYWxzZSkpOworICAgICAgICBtYXAucHV0KCdkJywgbmV3IEZvbnRTdHlsZSgyMDAsIHRydWUpKTsKKyAgICAgICAgbWFwLnB1dCgnZScsIG5ldyBGb250U3R5bGUoMzAwLCBmYWxzZSkpOworICAgICAgICBtYXAucHV0KCdmJywgbmV3IEZvbnRTdHlsZSgzMDAsIHRydWUpKTsKKyAgICAgICAgbWFwLnB1dCgnZycsIG5ldyBGb250U3R5bGUoNDAwLCBmYWxzZSkpOworICAgICAgICBtYXAucHV0KCdoJywgbmV3IEZvbnRTdHlsZSg0MDAsIHRydWUpKTsKKyAgICAgICAgbWFwLnB1dCgnaScsIG5ldyBGb250U3R5bGUoNTAwLCBmYWxzZSkpOworICAgICAgICBtYXAucHV0KCdqJywgbmV3IEZvbnRTdHlsZSg1MDAsIHRydWUpKTsKKyAgICAgICAgbWFwLnB1dCgnaycsIG5ldyBGb250U3R5bGUoNjAwLCBmYWxzZSkpOworICAgICAgICBtYXAucHV0KCdsJywgbmV3IEZvbnRTdHlsZSg2MDAsIHRydWUpKTsKKyAgICAgICAgbWFwLnB1dCgnbScsIG5ldyBGb250U3R5bGUoNzAwLCBmYWxzZSkpOworICAgICAgICBtYXAucHV0KCduJywgbmV3IEZvbnRTdHlsZSg3MDAsIHRydWUpKTsKKyAgICAgICAgbWFwLnB1dCgnbycsIG5ldyBGb250U3R5bGUoODAwLCBmYWxzZSkpOworICAgICAgICBtYXAucHV0KCdwJywgbmV3IEZvbnRTdHlsZSg4MDAsIHRydWUpKTsKKyAgICAgICAgbWFwLnB1dCgncScsIG5ldyBGb250U3R5bGUoOTAwLCBmYWxzZSkpOworICAgICAgICBtYXAucHV0KCdyJywgbmV3IEZvbnRTdHlsZSg5MDAsIHRydWUpKTsKKyAgICAgICAgQ0hBUl9GT05UX01BUCA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChtYXApOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0Rm9udFNlbGVjdGVkKFRleHRWaWV3IHR2LCBGb250U3R5bGUgc3R5bGUpIHsKKyAgICAgICAgLy8gSW4gdGhpcyB0ZXN0cywgdGhlIGZvbGxvd2luZyBzcGVjaWFsIGZvbnQgaXMgdXNlZCBmb3IgdGVzdGluZyB0eXBlZmFjZS4KKyAgICAgICAgLy8gQWxsIGZvbnRzIHN1cHBvcnQgJ2EnIHRvICd6JyBjaGFyYWN0ZXJzIGFuZCBhbGwgY2hhcmFjdGVyIGhhcyAxZW0gYWR2YW5jZSBleGNlcHQgZm9yIG9uZQorICAgICAgICAvLyBjaGFyYWN0ZXIuIEZvciBleGFtcGxlLCAnYXNjaWlfYTNlbV93ZWlnaHQxMDBfdXByaWdodC50dGYnIHN1cHBvcnRzICdhJyB0byAneicgY2hhcmFjdGVycworICAgICAgICAvLyBhbmQgJ2EnIGhhcyAzZW0gYWR2YW5jZSBhbmQgb3RoZXJzIGhhcyAxZW0gYWR2YW5jZS4gQWxzbywgdGhlIG1ldGFkYXRhIGhhcyB3aWR0aD0xMDAgYW5kCisgICAgICAgIC8vIHNsYW50PXVwcmlnaHQgaW5mb3JtYXRpb24uCisgICAgICAgIFR5cGVmYWNlIHR5cGVmYWNlID0gdHYuZ2V0VHlwZWZhY2UoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh0eXBlZmFjZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhzdHlsZS5nZXRXZWlnaHQoKSwgdHlwZWZhY2UuZ2V0V2VpZ2h0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoc3R5bGUuaXNJdGFsaWMoKSwgdHlwZWZhY2UuaXNJdGFsaWMoKSk7CisKKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNvcnJlY3QgdW5kZXJseWluZyBmb250IGlzIHNlbGVjdGVkLgorICAgICAgICBjaGFyIHRocmVlRW1DaGFyID0gMDsKKyAgICAgICAgZm9yIChjaGFyIGMgPSAnYSc7IGMgPD0gJ3onOyBjKyspIHsKKyAgICAgICAgICAgIFBhaW50IHBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBwYWludC5zZXRUZXh0U2l6ZSgxMC4wZik7ICAvLyBNYWtlIDFlbT0xMHB4CisgICAgICAgICAgICBwYWludC5zZXRUeXBlZmFjZSh0eXBlZmFjZSk7CisKKyAgICAgICAgICAgIGZpbmFsIGZsb2F0IHdpZHRoID0gcGFpbnQubWVhc3VyZVRleHQobmV3IGNoYXJbXSB7IGMgfSwgMCAvKiBpbmRleCAqLywgMSAvKiBjb3VudCAqLyk7CisgICAgICAgICAgICBpZiAod2lkdGggPT0gMzAuMGYpIHsKKyAgICAgICAgICAgICAgICBpZiAodGhyZWVFbUNoYXIgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIlRoZXJlIGFyZSBtdWx0aXBsZSAzZW0gY2hhcmFjdGVycy4gSW5jb3JyZWN0IHRlc3Qgc2V0IHVwPyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aHJlZUVtQ2hhciA9IGM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBGb250U3R5bGUgZm9udFN0eWxlID0gQ0hBUl9GT05UX01BUC5nZXQodGhyZWVFbUNoYXIpOworICAgICAgICBhc3NlcnROb3ROdWxsKGZvbnRTdHlsZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhzdHlsZS5nZXRXZWlnaHQoKSwgZm9udFN0eWxlLmdldFdlaWdodCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHN0eWxlLmlzSXRhbGljKCksIGZvbnRTdHlsZS5pc0l0YWxpYygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXZWlnaHQoKSB7CisgICAgICAgIGFzc2VydEZvbnRTZWxlY3RlZChnZXRUZXh0VmlldyhSLmlkLnRleHRWaWV3X3dlaWdodDEwMF91cHJpZ2h0KSwgbmV3IEZvbnRTdHlsZSgxMDAsIGZhbHNlKSk7CisgICAgICAgIGFzc2VydEZvbnRTZWxlY3RlZChnZXRUZXh0VmlldyhSLmlkLnRleHRWaWV3X3dlaWdodDEwMF9pdGFsaWMpLCBuZXcgRm9udFN0eWxlKDEwMCwgdHJ1ZSkpOworICAgICAgICBhc3NlcnRGb250U2VsZWN0ZWQoZ2V0VGV4dFZpZXcoUi5pZC50ZXh0Vmlld193ZWlnaHQyMDBfdXByaWdodCksIG5ldyBGb250U3R5bGUoMjAwLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRGb250U2VsZWN0ZWQoZ2V0VGV4dFZpZXcoUi5pZC50ZXh0Vmlld193ZWlnaHQyMDBfaXRhbGljKSwgbmV3IEZvbnRTdHlsZSgyMDAsIHRydWUpKTsKKyAgICAgICAgYXNzZXJ0Rm9udFNlbGVjdGVkKGdldFRleHRWaWV3KFIuaWQudGV4dFZpZXdfd2VpZ2h0MzAwX3VwcmlnaHQpLCBuZXcgRm9udFN0eWxlKDMwMCwgZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0Rm9udFNlbGVjdGVkKGdldFRleHRWaWV3KFIuaWQudGV4dFZpZXdfd2VpZ2h0MzAwX2l0YWxpYyksIG5ldyBGb250U3R5bGUoMzAwLCB0cnVlKSk7CisgICAgICAgIGFzc2VydEZvbnRTZWxlY3RlZChnZXRUZXh0VmlldyhSLmlkLnRleHRWaWV3X3dlaWdodDQwMF91cHJpZ2h0KSwgbmV3IEZvbnRTdHlsZSg0MDAsIGZhbHNlKSk7CisgICAgICAgIGFzc2VydEZvbnRTZWxlY3RlZChnZXRUZXh0VmlldyhSLmlkLnRleHRWaWV3X3dlaWdodDQwMF9pdGFsaWMpLCBuZXcgRm9udFN0eWxlKDQwMCwgdHJ1ZSkpOworICAgICAgICBhc3NlcnRGb250U2VsZWN0ZWQoZ2V0VGV4dFZpZXcoUi5pZC50ZXh0Vmlld193ZWlnaHQ1MDBfdXByaWdodCksIG5ldyBGb250U3R5bGUoNTAwLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRGb250U2VsZWN0ZWQoZ2V0VGV4dFZpZXcoUi5pZC50ZXh0Vmlld193ZWlnaHQ1MDBfaXRhbGljKSwgbmV3IEZvbnRTdHlsZSg1MDAsIHRydWUpKTsKKyAgICAgICAgYXNzZXJ0Rm9udFNlbGVjdGVkKGdldFRleHRWaWV3KFIuaWQudGV4dFZpZXdfd2VpZ2h0NjAwX3VwcmlnaHQpLCBuZXcgRm9udFN0eWxlKDYwMCwgZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0Rm9udFNlbGVjdGVkKGdldFRleHRWaWV3KFIuaWQudGV4dFZpZXdfd2VpZ2h0NjAwX2l0YWxpYyksIG5ldyBGb250U3R5bGUoNjAwLCB0cnVlKSk7CisgICAgICAgIGFzc2VydEZvbnRTZWxlY3RlZChnZXRUZXh0VmlldyhSLmlkLnRleHRWaWV3X3dlaWdodDcwMF91cHJpZ2h0KSwgbmV3IEZvbnRTdHlsZSg3MDAsIGZhbHNlKSk7CisgICAgICAgIGFzc2VydEZvbnRTZWxlY3RlZChnZXRUZXh0VmlldyhSLmlkLnRleHRWaWV3X3dlaWdodDcwMF9pdGFsaWMpLCBuZXcgRm9udFN0eWxlKDcwMCwgdHJ1ZSkpOworICAgICAgICBhc3NlcnRGb250U2VsZWN0ZWQoZ2V0VGV4dFZpZXcoUi5pZC50ZXh0Vmlld193ZWlnaHQ4MDBfdXByaWdodCksIG5ldyBGb250U3R5bGUoODAwLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRGb250U2VsZWN0ZWQoZ2V0VGV4dFZpZXcoUi5pZC50ZXh0Vmlld193ZWlnaHQ4MDBfaXRhbGljKSwgbmV3IEZvbnRTdHlsZSg4MDAsIHRydWUpKTsKKyAgICAgICAgYXNzZXJ0Rm9udFNlbGVjdGVkKGdldFRleHRWaWV3KFIuaWQudGV4dFZpZXdfd2VpZ2h0OTAwX3VwcmlnaHQpLCBuZXcgRm9udFN0eWxlKDkwMCwgZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0Rm9udFNlbGVjdGVkKGdldFRleHRWaWV3KFIuaWQudGV4dFZpZXdfd2VpZ2h0OTAwX2l0YWxpYyksIG5ldyBGb250U3R5bGUoOTAwLCB0cnVlKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGV4dEFwcGVhcmFuY2UoKSB7CisgICAgICAgIGFzc2VydEZvbnRTZWxlY3RlZChnZXRUZXh0VmlldyhSLmlkLnRleHRBcHBlYXJhbmNlX3dlaWdodDEwMF91cHJpZ2h0KSwKKyAgICAgICAgICAgICAgICBuZXcgRm9udFN0eWxlKDEwMCwgZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0Rm9udFNlbGVjdGVkKGdldFRleHRWaWV3KFIuaWQudGV4dEFwcGVhcmFuY2Vfd2VpZ2h0MTAwX2l0YWxpYyksCisgICAgICAgICAgICAgICAgbmV3IEZvbnRTdHlsZSgxMDAsIHRydWUpKTsKKyAgICAgICAgYXNzZXJ0Rm9udFNlbGVjdGVkKGdldFRleHRWaWV3KFIuaWQudGV4dEFwcGVhcmFuY2Vfd2VpZ2h0MjAwX3VwcmlnaHQpLAorICAgICAgICAgICAgICAgIG5ldyBGb250U3R5bGUoMjAwLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRGb250U2VsZWN0ZWQoZ2V0VGV4dFZpZXcoUi5pZC50ZXh0QXBwZWFyYW5jZV93ZWlnaHQyMDBfaXRhbGljKSwKKyAgICAgICAgICAgICAgICBuZXcgRm9udFN0eWxlKDIwMCwgdHJ1ZSkpOworICAgICAgICBhc3NlcnRGb250U2VsZWN0ZWQoZ2V0VGV4dFZpZXcoUi5pZC50ZXh0QXBwZWFyYW5jZV93ZWlnaHQzMDBfdXByaWdodCksCisgICAgICAgICAgICAgICAgbmV3IEZvbnRTdHlsZSgzMDAsIGZhbHNlKSk7CisgICAgICAgIGFzc2VydEZvbnRTZWxlY3RlZChnZXRUZXh0VmlldyhSLmlkLnRleHRBcHBlYXJhbmNlX3dlaWdodDMwMF9pdGFsaWMpLAorICAgICAgICAgICAgICAgIG5ldyBGb250U3R5bGUoMzAwLCB0cnVlKSk7CisgICAgICAgIGFzc2VydEZvbnRTZWxlY3RlZChnZXRUZXh0VmlldyhSLmlkLnRleHRBcHBlYXJhbmNlX3dlaWdodDQwMF91cHJpZ2h0KSwKKyAgICAgICAgICAgICAgICBuZXcgRm9udFN0eWxlKDQwMCwgZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0Rm9udFNlbGVjdGVkKGdldFRleHRWaWV3KFIuaWQudGV4dEFwcGVhcmFuY2Vfd2VpZ2h0NDAwX2l0YWxpYyksCisgICAgICAgICAgICAgICAgbmV3IEZvbnRTdHlsZSg0MDAsIHRydWUpKTsKKyAgICAgICAgYXNzZXJ0Rm9udFNlbGVjdGVkKGdldFRleHRWaWV3KFIuaWQudGV4dEFwcGVhcmFuY2Vfd2VpZ2h0NTAwX3VwcmlnaHQpLAorICAgICAgICAgICAgICAgIG5ldyBGb250U3R5bGUoNTAwLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRGb250U2VsZWN0ZWQoZ2V0VGV4dFZpZXcoUi5pZC50ZXh0QXBwZWFyYW5jZV93ZWlnaHQ1MDBfaXRhbGljKSwKKyAgICAgICAgICAgICAgICBuZXcgRm9udFN0eWxlKDUwMCwgdHJ1ZSkpOworICAgICAgICBhc3NlcnRGb250U2VsZWN0ZWQoZ2V0VGV4dFZpZXcoUi5pZC50ZXh0QXBwZWFyYW5jZV93ZWlnaHQ2MDBfdXByaWdodCksCisgICAgICAgICAgICAgICAgbmV3IEZvbnRTdHlsZSg2MDAsIGZhbHNlKSk7CisgICAgICAgIGFzc2VydEZvbnRTZWxlY3RlZChnZXRUZXh0VmlldyhSLmlkLnRleHRBcHBlYXJhbmNlX3dlaWdodDYwMF9pdGFsaWMpLAorICAgICAgICAgICAgICAgIG5ldyBGb250U3R5bGUoNjAwLCB0cnVlKSk7CisgICAgICAgIGFzc2VydEZvbnRTZWxlY3RlZChnZXRUZXh0VmlldyhSLmlkLnRleHRBcHBlYXJhbmNlX3dlaWdodDcwMF91cHJpZ2h0KSwKKyAgICAgICAgICAgICAgICBuZXcgRm9udFN0eWxlKDcwMCwgZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0Rm9udFNlbGVjdGVkKGdldFRleHRWaWV3KFIuaWQudGV4dEFwcGVhcmFuY2Vfd2VpZ2h0NzAwX2l0YWxpYyksCisgICAgICAgICAgICAgICAgbmV3IEZvbnRTdHlsZSg3MDAsIHRydWUpKTsKKyAgICAgICAgYXNzZXJ0Rm9udFNlbGVjdGVkKGdldFRleHRWaWV3KFIuaWQudGV4dEFwcGVhcmFuY2Vfd2VpZ2h0ODAwX3VwcmlnaHQpLAorICAgICAgICAgICAgICAgIG5ldyBGb250U3R5bGUoODAwLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRGb250U2VsZWN0ZWQoZ2V0VGV4dFZpZXcoUi5pZC50ZXh0QXBwZWFyYW5jZV93ZWlnaHQ4MDBfaXRhbGljKSwKKyAgICAgICAgICAgICAgICBuZXcgRm9udFN0eWxlKDgwMCwgdHJ1ZSkpOworICAgICAgICBhc3NlcnRGb250U2VsZWN0ZWQoZ2V0VGV4dFZpZXcoUi5pZC50ZXh0QXBwZWFyYW5jZV93ZWlnaHQ5MDBfdXByaWdodCksCisgICAgICAgICAgICAgICAgbmV3IEZvbnRTdHlsZSg5MDAsIGZhbHNlKSk7CisgICAgICAgIGFzc2VydEZvbnRTZWxlY3RlZChnZXRUZXh0VmlldyhSLmlkLnRleHRBcHBlYXJhbmNlX3dlaWdodDkwMF9pdGFsaWMpLAorICAgICAgICAgICAgICAgIG5ldyBGb250U3R5bGUoOTAwLCB0cnVlKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3R5bGUoKSB7CisgICAgICAgIGFzc2VydEZvbnRTZWxlY3RlZChnZXRUZXh0VmlldyhSLmlkLnRleHRWaWV3X25vcm1hbCksIG5ldyBGb250U3R5bGUoNDAwLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRGb250U2VsZWN0ZWQoZ2V0VGV4dFZpZXcoUi5pZC50ZXh0Vmlld19ib2xkKSwgbmV3IEZvbnRTdHlsZSg3MDAsIGZhbHNlKSk7CisgICAgICAgIGFzc2VydEZvbnRTZWxlY3RlZChnZXRUZXh0VmlldyhSLmlkLnRleHRWaWV3X2l0YWxpYyksIG5ldyBGb250U3R5bGUoNDAwLCB0cnVlKSk7CisgICAgICAgIGFzc2VydEZvbnRTZWxlY3RlZChnZXRUZXh0VmlldyhSLmlkLnRleHRWaWV3X2JvbGRfaXRhbGljKSwgbmV3IEZvbnRTdHlsZSg3MDAsIHRydWUpKTsKKyAgICAgICAgYXNzZXJ0Rm9udFNlbGVjdGVkKGdldFRleHRWaWV3KFIuaWQudGV4dEFwcGVhcmFuY2Vfbm9ybWFsKSwgbmV3IEZvbnRTdHlsZSg0MDAsIGZhbHNlKSk7CisgICAgICAgIGFzc2VydEZvbnRTZWxlY3RlZChnZXRUZXh0VmlldyhSLmlkLnRleHRBcHBlYXJhbmNlX2JvbGQpLCBuZXcgRm9udFN0eWxlKDcwMCwgZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0Rm9udFNlbGVjdGVkKGdldFRleHRWaWV3KFIuaWQudGV4dEFwcGVhcmFuY2VfaXRhbGljKSwgbmV3IEZvbnRTdHlsZSg0MDAsIHRydWUpKTsKKyAgICAgICAgYXNzZXJ0Rm9udFNlbGVjdGVkKGdldFRleHRWaWV3KFIuaWQudGV4dEFwcGVhcmFuY2VfYm9sZF9pdGFsaWMpLCBuZXcgRm9udFN0eWxlKDcwMCwgdHJ1ZSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdlaWdodFN0eWxlUmVzb2x2ZSgpIHsKKyAgICAgICAgLy8gSWYgYm90aCB3ZWlnaHQgYW5kIHN0eWxlPWJvbGQgaXMgc3BlY2lmaWVkLCBpZ25vcmUgdGhlIGJvbGRuZXNzIGFuZCB1c2Ugd2VpZ2h0LgorICAgICAgICBhc3NlcnRGb250U2VsZWN0ZWQoZ2V0VGV4dFZpZXcoUi5pZC50ZXh0Vmlld193ZWlnaHQxMDBfYm9sZCksIG5ldyBGb250U3R5bGUoMTAwLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRGb250U2VsZWN0ZWQoZ2V0VGV4dFZpZXcoUi5pZC50ZXh0QXBwZWFyYW5jZV93ZWlnaHQxMDBfYm9sZCksCisgICAgICAgICAgICAgICAgbmV3IEZvbnRTdHlsZSgxMDAsIGZhbHNlKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvVGV4dFZpZXdQcmVjb21wdXRlZFRleHRUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9UZXh0Vmlld1ByZWNvbXB1dGVkVGV4dFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTA0ZGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvVGV4dFZpZXdQcmVjb21wdXRlZFRleHRUZXN0LmphdmEKQEAgLTAsMCArMSwyMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQud2lkZ2V0LmN0czsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlR5cGVmYWNlOworaW1wb3J0IGFuZHJvaWQudGV4dC5MYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlByZWNvbXB1dGVkVGV4dDsKK2ltcG9ydCBhbmRyb2lkLnRleHQuUHJlY29tcHV0ZWRUZXh0LlBhcmFtczsKK2ltcG9ydCBhbmRyb2lkLnRleHQuUHJlY29tcHV0ZWRUZXh0LlBhcmFtcy5CdWlsZGVyOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0RGlyZWN0aW9uSGV1cmlzdGljOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0RGlyZWN0aW9uSGV1cmlzdGljczsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFBhaW50OworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CitpbXBvcnQgYW5kcm9pZC51dGlsLlBhaXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKworLyoqCisgKiBUZXN0cyBmb3IgVGV4dFZpZXcgd2l0aCBwcmVjb21wdXRlZCB0ZXh0LgorICovCitAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorcHVibGljIGNsYXNzIFRleHRWaWV3UHJlY29tcHV0ZWRUZXh0VGVzdCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFQgPSAiSGVsbG8sIFdvcmxkISI7CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXIoMCkKKyAgICBwdWJsaWMgYm9vbGVhbiBkaWZmZXJlbnRUZXh0U2l6ZTsKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXIoMSkKKyAgICBwdWJsaWMgYm9vbGVhbiBkaWZmZXJlbnRTY2FsZVg7CisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVyKDIpCisgICAgcHVibGljIGJvb2xlYW4gZGlmZmVyZW50U2tld1g7CisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVyKDMpCisgICAgcHVibGljIGJvb2xlYW4gZGlmZmVyZW50TGV0dGVyU3BhY2luZzsKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXIoNCkKKyAgICBwdWJsaWMgYm9vbGVhbiBkaWZmZXJlbnRUZXh0TG9jYWxlOworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcig1KQorICAgIHB1YmxpYyBib29sZWFuIGRpZmZlcmVudFR5cGVmYWNlOworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcig2KQorICAgIHB1YmxpYyBib29sZWFuIGRpZmZlcmVudEVsZWdhbnRUZXh0SGVpZ2h0OworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcig3KQorICAgIHB1YmxpYyBib29sZWFuIGRpZmZlcmVudEJyZWFrU3RyYXRlZ3k7CisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVyKDgpCisgICAgcHVibGljIGJvb2xlYW4gZGlmZmVyZW50SHlwaGVuYXRpb25GcmVxdWVuY3k7CisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVyKDkpCisgICAgcHVibGljIGJvb2xlYW4gZGlmZmVyZW50VGV4dERpcjsKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXIoMTApCisgICAgcHVibGljIGJvb2xlYW4gZGlmZmVyZW50Rm9udFZhcmlhdGlvblNldHRpbmdzOworCisgICAgLy8gdGV4dCBzaXplIGZyb20gdGhlIGRlZmF1bHQgdmFsdWUuCisgICAgcHJpdmF0ZSBQYWlyPFBhcmFtcywgU3RyaW5nW10+IG1ha2VEaWZmZXJlbnRQYXJhbXMoUGFyYW1zIHBhcmFtcykgeworICAgICAgICBmaW5hbCBUZXh0UGFpbnQgcGFpbnQgPSBuZXcgVGV4dFBhaW50KHBhcmFtcy5nZXRUZXh0UGFpbnQoKSk7CisgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IGRpZmZlcmVuY2VMaXN0ID0gbmV3IEFycmF5TGlzdCgpOworCisgICAgICAgIGlmIChkaWZmZXJlbnRUZXh0U2l6ZSkgeworICAgICAgICAgICAgcGFpbnQuc2V0VGV4dFNpemUocGFpbnQuZ2V0VGV4dFNpemUoKSAqIDIuMGYgKyAxLjBmKTsKKyAgICAgICAgICAgIGRpZmZlcmVuY2VMaXN0LmFkZCgiVGV4dCBTaXplIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRpZmZlcmVudFNjYWxlWCkgeworICAgICAgICAgICAgcGFpbnQuc2V0VGV4dFNjYWxlWChwYWludC5nZXRUZXh0U2NhbGVYKCkgKiAyLjBmICsgMS4wZik7CisgICAgICAgICAgICBkaWZmZXJlbmNlTGlzdC5hZGQoIlRleHQgU2NhbGUgWCIpOworICAgICAgICB9CisgICAgICAgIGlmIChkaWZmZXJlbnRTa2V3WCkgeworICAgICAgICAgICAgcGFpbnQuc2V0VGV4dFNrZXdYKHBhaW50LmdldFRleHRTa2V3WCgpICogMi4wZiArIDEuMGYpOworICAgICAgICAgICAgZGlmZmVyZW5jZUxpc3QuYWRkKCJUZXh0IFNrZXcgWCIpOworICAgICAgICB9CisgICAgICAgIGlmIChkaWZmZXJlbnRMZXR0ZXJTcGFjaW5nKSB7CisgICAgICAgICAgICBwYWludC5zZXRMZXR0ZXJTcGFjaW5nKHBhaW50LmdldExldHRlclNwYWNpbmcoKSAqIDIuMGYgKyAxLjBmKTsKKyAgICAgICAgICAgIGRpZmZlcmVuY2VMaXN0LmFkZCgiTGV0dGVyIFNwYWNpbmciKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGlmZmVyZW50VGV4dExvY2FsZSkgeworICAgICAgICAgICAgcGFpbnQuc2V0VGV4dExvY2FsZShMb2NhbGUuVVMuZXF1YWxzKHBhaW50LmdldFRleHRMb2NhbGUoKSkgPyBMb2NhbGUuSkFQQU4gOiBMb2NhbGUuVVMpOworICAgICAgICB9CisgICAgICAgIGlmIChkaWZmZXJlbnRUeXBlZmFjZSkgeworICAgICAgICAgICAgZmluYWwgVHlwZWZhY2UgdGYgPSBwYWludC5nZXRUeXBlZmFjZSgpOworICAgICAgICAgICAgaWYgKHRmID09IG51bGwgfHwgdGYgPT0gVHlwZWZhY2UuREVGQVVMVCkgeworICAgICAgICAgICAgICAgIHBhaW50LnNldFR5cGVmYWNlKFR5cGVmYWNlLlNFUklGKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcGFpbnQuc2V0VHlwZWZhY2UoVHlwZWZhY2UuREVGQVVMVCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkaWZmZXJlbmNlTGlzdC5hZGQoIlR5cGVmYWNlIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRpZmZlcmVudEZvbnRWYXJpYXRpb25TZXR0aW5ncykgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHdnaHQgPSAiJ3dnaHQnIDcwMCI7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgd2R0aCA9ICInd2R0aCcgMTAwIjsKKworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZhclNldHRpbmdzID0gcGFpbnQuZ2V0Rm9udFZhcmlhdGlvblNldHRpbmdzKCk7CisgICAgICAgICAgICBpZiAodmFyU2V0dGluZ3MgPT0gbnVsbCB8fCB2YXJTZXR0aW5ncy5lcXVhbHMod2dodCkpIHsKKyAgICAgICAgICAgICAgICBwYWludC5zZXRGb250VmFyaWF0aW9uU2V0dGluZ3Mod2R0aCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBhaW50LnNldEZvbnRWYXJpYXRpb25TZXR0aW5ncyh3Z2h0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRpZmZlcmVuY2VMaXN0LmFkZCgiRm9udCB2YXJpYXRpb24gc2V0dGluZ3MiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGlmZmVyZW50RWxlZ2FudFRleHRIZWlnaHQpIHsKKyAgICAgICAgICAgIHBhaW50LnNldEVsZWdhbnRUZXh0SGVpZ2h0KCFwYWludC5pc0VsZWdhbnRUZXh0SGVpZ2h0KCkpOworICAgICAgICAgICAgZGlmZmVyZW5jZUxpc3QuYWRkKCJFbGVnYW50IFRleHQgSGVpZ2h0Iik7CisgICAgICAgIH0KKworICAgICAgICBpbnQgc3RyYXRlZ3kgPSBwYXJhbXMuZ2V0QnJlYWtTdHJhdGVneSgpOworICAgICAgICBpZiAoZGlmZmVyZW50QnJlYWtTdHJhdGVneSkgeworICAgICAgICAgICAgc3RyYXRlZ3kgPSBzdHJhdGVneSA9PSBMYXlvdXQuQlJFQUtfU1RSQVRFR1lfU0lNUExFCisgICAgICAgICAgICAgICAgICAgID8gIExheW91dC5CUkVBS19TVFJBVEVHWV9ISUdIX1FVQUxJVFkgOiBMYXlvdXQuQlJFQUtfU1RSQVRFR1lfU0lNUExFOworICAgICAgICAgICAgZGlmZmVyZW5jZUxpc3QuYWRkKCJCcmVhayBzdHJhdGVneSIpOworICAgICAgICB9CisKKyAgICAgICAgaW50IGh5RnJlcSA9IHBhcmFtcy5nZXRIeXBoZW5hdGlvbkZyZXF1ZW5jeSgpOworICAgICAgICBpZiAoZGlmZmVyZW50SHlwaGVuYXRpb25GcmVxdWVuY3kpIHsKKyAgICAgICAgICAgIGh5RnJlcSA9IGh5RnJlcSA9PSBMYXlvdXQuSFlQSEVOQVRJT05fRlJFUVVFTkNZX05PTkUKKyAgICAgICAgICAgICAgICAgICAgPyBMYXlvdXQuSFlQSEVOQVRJT05fRlJFUVVFTkNZX0ZVTEwgOiBMYXlvdXQuSFlQSEVOQVRJT05fRlJFUVVFTkNZX05PTkU7CisgICAgICAgICAgICBkaWZmZXJlbmNlTGlzdC5hZGQoIkh5cGhlbmF0aW9uIEZyZXF1ZW5jeSIpOworICAgICAgICB9CisKKyAgICAgICAgVGV4dERpcmVjdGlvbkhldXJpc3RpYyBkaXIgPSBwYXJhbXMuZ2V0VGV4dERpcmVjdGlvbigpOworICAgICAgICBpZiAoZGlmZmVyZW50VGV4dERpcikgeworICAgICAgICAgICAgZGlyID0gZGlyID09IFRleHREaXJlY3Rpb25IZXVyaXN0aWNzLkxUUgorICAgICAgICAgICAgICAgICAgICA/ICBUZXh0RGlyZWN0aW9uSGV1cmlzdGljcy5SVEwgOiBUZXh0RGlyZWN0aW9uSGV1cmlzdGljcy5MVFI7CisgICAgICAgICAgICBkaWZmZXJlbmNlTGlzdC5hZGQoIlRleHQgRGlyZWN0aW9uIik7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBQYXJhbXMgb3V0UGFyYW1zID0gbmV3IEJ1aWxkZXIocGFpbnQpLnNldEJyZWFrU3RyYXRlZ3koc3RyYXRlZ3kpCisgICAgICAgICAgICAgICAgLnNldEh5cGhlbmF0aW9uRnJlcXVlbmN5KGh5RnJlcSkuc2V0VGV4dERpcmVjdGlvbihkaXIpLmJ1aWxkKCk7CisgICAgICAgIHJldHVybiBuZXcgUGFpcihvdXRQYXJhbXMsIGRpZmZlcmVuY2VMaXN0LnRvQXJyYXkobmV3IFN0cmluZ1tkaWZmZXJlbmNlTGlzdC5zaXplKCldKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgQ29udGV4dCBnZXRDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VGFyZ2V0Q29udGV4dCgpOworICAgIH0KKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMKKyAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248T2JqZWN0W10+IGdldFBhcmFtZXRlcnMoKSB7CisgICAgICAgIEFycmF5TGlzdDxPYmplY3RbXT4gYWxsUGFyYW1zID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICAgICAgLy8gQ29tcHV0ZSB0aGUgcG93ZXJzZXQgZXhjZXB0IGZvciBhbGwgZmFsc2UgY2FzZS4KKyAgICAgICAgZmluYWwgaW50IGFsbFBhcmFtZXRlckNvdW50ID0gMTE7CisgICAgICAgIC8vIFRoZSAxMS10aCBiaXQgaXMgZm9yIGZvbnQgdmFyaWF0aW9uIHNldHRpbmdzLiBEb24ndCBhZGQgdGVzdCBjYXNlIGlmIHRoZSBzeXN0ZW0gZG9uJ3QKKyAgICAgICAgLy8gaGF2ZSB2YXJpYWJsZSBmb250cy4KKyAgICAgICAgZmluYWwgaW50IGZ1bGxCaXRzID0gaGFzVmFyRm9udCgpCisgICAgICAgICAgICAgICAgPyAoMSA8PCBhbGxQYXJhbWV0ZXJDb3VudCkgLSAxIDogKDEgPDwgKGFsbFBhcmFtZXRlckNvdW50IC0gMSkpIC0gMTsKKyAgICAgICAgZm9yIChpbnQgYml0cyA9IDE7IGJpdHMgPD0gZnVsbEJpdHM7ICsrYml0cykgeworICAgICAgICAgICAgT2JqZWN0W10gcGFyYW0gPSBuZXcgT2JqZWN0W2FsbFBhcmFtZXRlckNvdW50XTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgYWxsUGFyYW1ldGVyQ291bnQ7ICsraikgeworICAgICAgICAgICAgICAgIHBhcmFtW2pdID0gbmV3IEJvb2xlYW4oKGJpdHMgJiAoMSA8PCBqKSkgIT0gMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhbGxQYXJhbXMuYWRkKHBhcmFtKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYWxsUGFyYW1zOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaGFzVmFyRm9udCgpIHsKKyAgICAgICAgZmluYWwgVGV4dFBhaW50IGNvcGllZCA9IG5ldyBUZXh0UGFpbnQoKG5ldyBUZXh0VmlldyhnZXRDb250ZXh0KCkpKS5nZXRQYWludCgpKTsKKyAgICAgICAgcmV0dXJuIGNvcGllZC5zZXRGb250VmFyaWF0aW9uU2V0dGluZ3MoIid3Z2h0JyA0MDAiKQorICAgICAgICAgICAgICAgICYmIGNvcGllZC5zZXRGb250VmFyaWF0aW9uU2V0dGluZ3MoIid3ZHRoJyAxMDAiKTsKKyAgICB9CisKKyAgICBAU21hbGxUZXN0CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzZXRUZXh0KCkgeworICAgICAgICBmaW5hbCBUZXh0VmlldyB0diA9IG5ldyBUZXh0VmlldyhnZXRDb250ZXh0KCkpOworICAgICAgICBmaW5hbCBQYXJhbXMgdHZQYXJhbXMgPSB0di5nZXRUZXh0TWV0cmljc1BhcmFtcygpOworICAgICAgICBmaW5hbCBQYWlyPFBhcmFtcywgU3RyaW5nW10+IHRlc3RDb25maWcgPSBtYWtlRGlmZmVyZW50UGFyYW1zKHR2UGFyYW1zKTsKKyAgICAgICAgZmluYWwgUGFyYW1zIHBjdFBhcmFtcyA9IHRlc3RDb25maWcuZmlyc3Q7CisKKyAgICAgICAgZmluYWwgUHJlY29tcHV0ZWRUZXh0IHBjdCA9IFByZWNvbXB1dGVkVGV4dC5jcmVhdGUoVEVYVCwgcGN0UGFyYW1zKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHR2LnNldFRleHQocGN0KTsKKyAgICAgICAgICAgIGZhaWwoIlRlc3QgQ2FzZTogeyIgKyBUZXh0VXRpbHMuam9pbigiLCIsIHRlc3RDb25maWcuc2Vjb25kKSArICJ9LCAiCisgICAgICAgICAgICAgICAgICAgICsgdHZQYXJhbXMudG9TdHJpbmcoKSArICIgdnMgIiArIHBjdFBhcmFtcy50b1N0cmluZygpKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIHBhc3MKKyAgICAgICAgfQorCisgICAgICAgIHR2LnNldFRleHRNZXRyaWNzUGFyYW1zKHBjdFBhcmFtcyk7CisgICAgICAgIHR2LnNldFRleHQocGN0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9UZXh0Vmlld1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1RleHRWaWV3VGVzdC5qYXZhCmluZGV4IDM2N2VkNDAuLjQzMmI5NGQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1RleHRWaWV3VGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1RleHRWaWV3VGVzdC5qYXZhCkBAIC00MSwxMCArNDEsNiBAQAogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnZlcmlmeVplcm9JbnRlcmFjdGlvbnM7CiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ud2hlbjsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuU09VUkNFOwotCi1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLkludERlZjsKLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7CiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CiBpbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOwogaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbi5BY3Rpdml0eU1vbml0b3I7CkBAIC01Nyw2ICs1Myw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMuTm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQuRm9udE1ldHJpY3NJbnQ7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYXRoOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQ7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOwpAQCAtNzMsMjEgKzcwLDE2IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5Mb2NhbGVMaXN0OwogaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKLWltcG9ydCBhbmRyb2lkLm9zLlJlc3VsdFJlY2VpdmVyOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnRleHQuRWRpdGFibGU7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LklucHV0RmlsdGVyOwogaW1wb3J0IGFuZHJvaWQudGV4dC5JbnB1dFR5cGU7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LkxheW91dDsKK2ltcG9ydCBhbmRyb2lkLnRleHQuUHJlY29tcHV0ZWRUZXh0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5TZWxlY3Rpb247CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZTsKIGltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nOworaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmdCdWlsZGVyOwogaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmVkOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0UGFpbnQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKQEAgLTEzOCw4ICsxMzAsNiBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5FeHRyYWN0ZWRUZXh0OwogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5FeHRyYWN0ZWRUZXh0UmVxdWVzdDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRDb25uZWN0aW9uOwotaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dE1ldGhvZE1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LnRleHRjbGFzc2lmaWVyLlRleHRDbGFzc2lmaWNhdGlvbjsKIGltcG9ydCBhbmRyb2lkLnZpZXcudGV4dGNsYXNzaWZpZXIuVGV4dENsYXNzaWZpZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LnRleHRjbGFzc2lmaWVyLlRleHRTZWxlY3Rpb247CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuRWRpdFRleHQ7CkBAIC0xNTAsNiArMTQwLDE1IEBACiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXcuQnVmZmVyVHlwZTsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5jdHMudXRpbC5UZXN0VXRpbHM7CiAKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLkludERlZjsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkN0c0tleUV2ZW50VXRpbDsKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkN0c1RvdWNoVXRpbHM7CiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5Qb2xsaW5nQ2hlY2s7CkBAIC0xNjIsNiArMTYxLDggQEAKIGltcG9ydCBvcmcubW9ja2l0by5pbnZvY2F0aW9uLkludm9jYXRpb25Pbk1vY2s7CiBpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKIAoraW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuU09VUkNFOworCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKQEAgLTE4OSwxNiArMTkwLDkgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU01BUlRTRUxFQ1RfRU5EID0gNDA7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGV4dENsYXNzaWZpZXIgRkFLRV9URVhUX0NMQVNTSUZJRVIgPSBuZXcgVGV4dENsYXNzaWZpZXIoKSB7CiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgVGV4dFNlbGVjdGlvbiBzdWdnZXN0U2VsZWN0aW9uKAotICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsIExvY2FsZUxpc3QgbG9jYWxlcykgeworICAgICAgICBwdWJsaWMgVGV4dFNlbGVjdGlvbiBzdWdnZXN0U2VsZWN0aW9uKFRleHRTZWxlY3Rpb24uUmVxdWVzdCByZXF1ZXN0KSB7CiAgICAgICAgICAgICByZXR1cm4gbmV3IFRleHRTZWxlY3Rpb24uQnVpbGRlcihTTUFSVFNFTEVDVF9TVEFSVCwgU01BUlRTRUxFQ1RfRU5EKS5idWlsZCgpOwogICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBUZXh0Q2xhc3NpZmljYXRpb24gY2xhc3NpZnlUZXh0KAotICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsIExvY2FsZUxpc3QgbG9jYWxlcykgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXh0Q2xhc3NpZmljYXRpb24uQnVpbGRlcigpLmJ1aWxkKCk7Ci0gICAgICAgIH0KICAgICB9OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTElDS19USU1FT1VUID0gVmlld0NvbmZpZ3VyYXRpb24uZ2V0RG91YmxlVGFwVGltZW91dCgpICsgNTA7CiAKQEAgLTE2NDAsNiArMTYzNCwxNiBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQFVpVGhyZWFkVGVzdAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNldFRleHRfUHJlY29tcHV0ZWRUZXh0KCkgeworICAgICAgICBmaW5hbCBUZXh0VmlldyB0diA9IGZpbmRUZXh0VmlldyhSLmlkLnRleHR2aWV3X3RleHQpOworICAgICAgICBmaW5hbCBQcmVjb21wdXRlZFRleHQgbWVhc3VyZWQgPSBQcmVjb21wdXRlZFRleHQuY3JlYXRlKAorICAgICAgICAgICAgICAgICJUaGlzIGlzIGFuIGV4YW1wbGUgdGV4dC4iLCB0di5nZXRUZXh0TWV0cmljc1BhcmFtcygpKTsKKyAgICAgICAgdHYuc2V0VGV4dChtZWFzdXJlZCk7CisgICAgICAgIGFzc2VydEVxdWFscyhtZWFzdXJlZC50b1N0cmluZygpLCB0di5nZXRUZXh0KCkudG9TdHJpbmcoKSk7CisgICAgfQorCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0VGV4dFVwZGF0ZXNIZWlnaHRBZnRlclJlbW92aW5nSW1hZ2VTcGFuKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIC8vIEhlaWdodCBjYWxjdWxhdGlvbiBoYWQgcHJvYmxlbXMgd2hlbiBUZXh0VmlldyBoYWQgd2lkdGg6IG1hdGNoX3BhcmVudApAQCAtNDM4MSw2ICs0Mzg1LDE0OSBAQAogCiAgICAgQFVpVGhyZWFkVGVzdAogICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJhc2VsaW5lQXR0cmlidXRlcygpIHsKKyAgICAgICAgbVRleHRWaWV3ID0gZmluZFRleHRWaWV3KFIuaWQudGV4dHZpZXdfYmFzZWxpbmUpOworCisgICAgICAgIGZpbmFsIGludCBmaXJzdEJhc2VsaW5lVG9Ub3BIZWlnaHQgPSBtVGV4dFZpZXcuZ2V0UmVzb3VyY2VzKCkKKyAgICAgICAgICAgICAgICAuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKFIuZGltZW4udGV4dHZpZXdfZmlyc3RCYXNlbGluZVRvVG9wSGVpZ2h0KTsKKyAgICAgICAgZmluYWwgaW50IGxhc3RCYXNlbGluZVRvQm90dG9tSGVpZ2h0ID0gbVRleHRWaWV3LmdldFJlc291cmNlcygpCisgICAgICAgICAgICAgICAgLmdldERpbWVuc2lvblBpeGVsU2l6ZShSLmRpbWVuLnRleHR2aWV3X2xhc3RCYXNlbGluZVRvQm90dG9tSGVpZ2h0KTsKKyAgICAgICAgZmluYWwgaW50IGxpbmVIZWlnaHQgPSBtVGV4dFZpZXcuZ2V0UmVzb3VyY2VzKCkKKyAgICAgICAgICAgICAgICAuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKFIuZGltZW4udGV4dHZpZXdfbGluZUhlaWdodCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZpcnN0QmFzZWxpbmVUb1RvcEhlaWdodCwgbVRleHRWaWV3LmdldEZpcnN0QmFzZWxpbmVUb1RvcEhlaWdodCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGxhc3RCYXNlbGluZVRvQm90dG9tSGVpZ2h0LCBtVGV4dFZpZXcuZ2V0TGFzdEJhc2VsaW5lVG9Cb3R0b21IZWlnaHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhsaW5lSGVpZ2h0LCBtVGV4dFZpZXcuZ2V0TGluZUhlaWdodCgpKTsKKyAgICB9CisKKyAgICBAVWlUaHJlYWRUZXN0CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0Rmlyc3RCYXNlbGluZVRvVG9wSGVpZ2h0KCkgeworICAgICAgICBtVGV4dFZpZXcgPSBuZXcgVGV4dFZpZXcobUFjdGl2aXR5KTsKKyAgICAgICAgbVRleHRWaWV3LnNldFRleHQoIlRoaXMgaXMgc29tZSByYW5kb20gdGV4dCIpOworICAgICAgICBmaW5hbCBpbnQgcGFkZGluZyA9IDEwMDsKKyAgICAgICAgbVRleHRWaWV3LnNldFBhZGRpbmcocGFkZGluZywgcGFkZGluZywgcGFkZGluZywgcGFkZGluZyk7CisKKyAgICAgICAgZmluYWwgRm9udE1ldHJpY3NJbnQgZm9udE1ldHJpY3MgPSBtVGV4dFZpZXcuZ2V0UGFpbnQoKS5nZXRGb250TWV0cmljc0ludCgpOworICAgICAgICBmaW5hbCBpbnQgZm9udE1ldHJpY3NUb3AgPSBNYXRoLm1heCgKKyAgICAgICAgICAgICAgICBNYXRoLmFicyhmb250TWV0cmljcy50b3ApLCBNYXRoLmFicyhmb250TWV0cmljcy5hc2NlbnQpKTsKKworICAgICAgICBpbnQgZmlyc3RCYXNlbGluZVRvVG9wSGVpZ2h0ID0gZm9udE1ldHJpY3NUb3AgKyAxMDsKKyAgICAgICAgbVRleHRWaWV3LnNldEZpcnN0QmFzZWxpbmVUb1RvcEhlaWdodChmaXJzdEJhc2VsaW5lVG9Ub3BIZWlnaHQpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmlyc3RCYXNlbGluZVRvVG9wSGVpZ2h0LCBtVGV4dFZpZXcuZ2V0Rmlyc3RCYXNlbGluZVRvVG9wSGVpZ2h0KCkpOworICAgICAgICBhc3NlcnROb3RFcXVhbHMocGFkZGluZywgbVRleHRWaWV3LmdldFBhZGRpbmdUb3AoKSk7CisKKyAgICAgICAgZmlyc3RCYXNlbGluZVRvVG9wSGVpZ2h0ID0gZm9udE1ldHJpY3NUb3AgKyA0MDsKKyAgICAgICAgbVRleHRWaWV3LnNldEZpcnN0QmFzZWxpbmVUb1RvcEhlaWdodChmaXJzdEJhc2VsaW5lVG9Ub3BIZWlnaHQpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmlyc3RCYXNlbGluZVRvVG9wSGVpZ2h0LCBtVGV4dFZpZXcuZ2V0Rmlyc3RCYXNlbGluZVRvVG9wSGVpZ2h0KCkpOworCisgICAgICAgIG1UZXh0Vmlldy5zZXRQYWRkaW5nKHBhZGRpbmcsIHBhZGRpbmcsIHBhZGRpbmcsIHBhZGRpbmcpOworICAgICAgICBhc3NlcnRFcXVhbHMocGFkZGluZywgbVRleHRWaWV3LmdldFBhZGRpbmdUb3AoKSk7CisgICAgfQorCisgICAgQFVpVGhyZWFkVGVzdAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNldEZpcnN0QmFzZWxpbmVUb1RvcEhlaWdodF90b29TbWFsbCgpIHsKKyAgICAgICAgbVRleHRWaWV3ID0gbmV3IFRleHRWaWV3KG1BY3Rpdml0eSk7CisgICAgICAgIG1UZXh0Vmlldy5zZXRUZXh0KCJUaGlzIGlzIHNvbWUgcmFuZG9tIHRleHQiKTsKKyAgICAgICAgZmluYWwgaW50IHBhZGRpbmcgPSAxMDA7CisgICAgICAgIG1UZXh0Vmlldy5zZXRQYWRkaW5nKHBhZGRpbmcsIHBhZGRpbmcsIHBhZGRpbmcsIHBhZGRpbmcpOworCisgICAgICAgIGZpbmFsIEZvbnRNZXRyaWNzSW50IGZvbnRNZXRyaWNzID0gbVRleHRWaWV3LmdldFBhaW50KCkuZ2V0Rm9udE1ldHJpY3NJbnQoKTsKKyAgICAgICAgZmluYWwgaW50IGZvbnRNZXRyaWNzVG9wID0gTWF0aC5taW4oCisgICAgICAgICAgICAgICAgTWF0aC5hYnMoZm9udE1ldHJpY3MudG9wKSwgTWF0aC5hYnMoZm9udE1ldHJpY3MuYXNjZW50KSk7CisKKyAgICAgICAgaW50IGZpcnN0QmFzZWxpbmVUb1RvcEhlaWdodCA9IGZvbnRNZXRyaWNzVG9wIC0gMTsKKyAgICAgICAgbVRleHRWaWV3LnNldEZpcnN0QmFzZWxpbmVUb1RvcEhlaWdodChmaXJzdEJhc2VsaW5lVG9Ub3BIZWlnaHQpOworICAgICAgICBhc3NlcnROb3RFcXVhbHMoZmlyc3RCYXNlbGluZVRvVG9wSGVpZ2h0LCBtVGV4dFZpZXcuZ2V0Rmlyc3RCYXNlbGluZVRvVG9wSGVpZ2h0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMocGFkZGluZywgbVRleHRWaWV3LmdldFBhZGRpbmdUb3AoKSk7CisgICAgfQorCisgICAgQFVpVGhyZWFkVGVzdAorICAgIEBUZXN0KGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRGaXJzdEJhc2VsaW5lVG9Ub3BIZWlnaHRfbmVnYXRpdmUoKSB7CisgICAgICAgIG5ldyBUZXh0VmlldyhtQWN0aXZpdHkpLnNldEZpcnN0QmFzZWxpbmVUb1RvcEhlaWdodCgtMSk7CisgICAgfQorCisgICAgQFVpVGhyZWFkVGVzdAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNldExhc3RCYXNlbGluZVRvQm90dG9tSGVpZ2h0KCkgeworICAgICAgICBtVGV4dFZpZXcgPSBuZXcgVGV4dFZpZXcobUFjdGl2aXR5KTsKKyAgICAgICAgbVRleHRWaWV3LnNldFRleHQoIlRoaXMgaXMgc29tZSByYW5kb20gdGV4dCIpOworICAgICAgICBmaW5hbCBpbnQgcGFkZGluZyA9IDEwMDsKKyAgICAgICAgbVRleHRWaWV3LnNldFBhZGRpbmcocGFkZGluZywgcGFkZGluZywgcGFkZGluZywgcGFkZGluZyk7CisKKyAgICAgICAgZmluYWwgRm9udE1ldHJpY3NJbnQgZm9udE1ldHJpY3MgPSBtVGV4dFZpZXcuZ2V0UGFpbnQoKS5nZXRGb250TWV0cmljc0ludCgpOworICAgICAgICBmaW5hbCBpbnQgZm9udE1ldHJpY3NCb3R0b20gPSBNYXRoLm1heCgKKyAgICAgICAgICAgICAgICBNYXRoLmFicyhmb250TWV0cmljcy5ib3R0b20pLCBNYXRoLmFicyhmb250TWV0cmljcy5kZXNjZW50KSk7CisKKyAgICAgICAgaW50IGxhc3RCYXNlbGluZVRvQm90dG9tSGVpZ2h0ID0gZm9udE1ldHJpY3NCb3R0b20gKyAyMDsKKyAgICAgICAgbVRleHRWaWV3LnNldExhc3RCYXNlbGluZVRvQm90dG9tSGVpZ2h0KGxhc3RCYXNlbGluZVRvQm90dG9tSGVpZ2h0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGxhc3RCYXNlbGluZVRvQm90dG9tSGVpZ2h0LCBtVGV4dFZpZXcuZ2V0TGFzdEJhc2VsaW5lVG9Cb3R0b21IZWlnaHQoKSk7CisgICAgICAgIGFzc2VydE5vdEVxdWFscyhwYWRkaW5nLCBtVGV4dFZpZXcuZ2V0UGFkZGluZ0JvdHRvbSgpKTsKKworICAgICAgICBsYXN0QmFzZWxpbmVUb0JvdHRvbUhlaWdodCA9IGZvbnRNZXRyaWNzQm90dG9tICsgMzA7CisgICAgICAgIG1UZXh0Vmlldy5zZXRMYXN0QmFzZWxpbmVUb0JvdHRvbUhlaWdodChsYXN0QmFzZWxpbmVUb0JvdHRvbUhlaWdodCk7CisgICAgICAgIGFzc2VydEVxdWFscyhsYXN0QmFzZWxpbmVUb0JvdHRvbUhlaWdodCwgbVRleHRWaWV3LmdldExhc3RCYXNlbGluZVRvQm90dG9tSGVpZ2h0KCkpOworCisgICAgICAgIG1UZXh0Vmlldy5zZXRQYWRkaW5nKHBhZGRpbmcsIHBhZGRpbmcsIHBhZGRpbmcsIHBhZGRpbmcpOworICAgICAgICBhc3NlcnRFcXVhbHMocGFkZGluZywgbVRleHRWaWV3LmdldFBhZGRpbmdCb3R0b20oKSk7CisgICAgfQorCisgICAgQFVpVGhyZWFkVGVzdAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNldExhc3RCYXNlbGluZVRvQm90dG9tSGVpZ2h0X3Rvb1NtYWxsKCkgeworICAgICAgICBtVGV4dFZpZXcgPSBuZXcgVGV4dFZpZXcobUFjdGl2aXR5KTsKKyAgICAgICAgbVRleHRWaWV3LnNldFRleHQoIlRoaXMgaXMgc29tZSByYW5kb20gdGV4dCIpOworICAgICAgICBmaW5hbCBpbnQgcGFkZGluZyA9IDEwMDsKKyAgICAgICAgbVRleHRWaWV3LnNldFBhZGRpbmcocGFkZGluZywgcGFkZGluZywgcGFkZGluZywgcGFkZGluZyk7CisKKyAgICAgICAgZmluYWwgRm9udE1ldHJpY3NJbnQgZm9udE1ldHJpY3MgPSBtVGV4dFZpZXcuZ2V0UGFpbnQoKS5nZXRGb250TWV0cmljc0ludCgpOworICAgICAgICBmaW5hbCBpbnQgZm9udE1ldHJpY3NCb3R0b20gPSBNYXRoLm1pbigKKyAgICAgICAgICAgICAgICBNYXRoLmFicyhmb250TWV0cmljcy5ib3R0b20pLCBNYXRoLmFicyhmb250TWV0cmljcy5kZXNjZW50KSk7CisKKyAgICAgICAgaW50IGxhc3RCYXNlbGluZVRvQm90dG9tSGVpZ2h0ID0gZm9udE1ldHJpY3NCb3R0b20gLSAxOworICAgICAgICBtVGV4dFZpZXcuc2V0TGFzdEJhc2VsaW5lVG9Cb3R0b21IZWlnaHQobGFzdEJhc2VsaW5lVG9Cb3R0b21IZWlnaHQpOworICAgICAgICBhc3NlcnROb3RFcXVhbHMobGFzdEJhc2VsaW5lVG9Cb3R0b21IZWlnaHQsIG1UZXh0Vmlldy5nZXRMYXN0QmFzZWxpbmVUb0JvdHRvbUhlaWdodCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHBhZGRpbmcsIG1UZXh0Vmlldy5nZXRQYWRkaW5nQm90dG9tKCkpOworICAgIH0KKworICAgIEBVaVRocmVhZFRlc3QKKyAgICBAVGVzdChleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0TGFzdEJhc2VsaW5lVG9Cb3R0b21IZWlnaHRfbmVnYXRpdmUoKSB7CisgICAgICAgIG5ldyBUZXh0VmlldyhtQWN0aXZpdHkpLnNldExhc3RCYXNlbGluZVRvQm90dG9tSGVpZ2h0KC0xKTsKKyAgICB9CisKKyAgICBAVWlUaHJlYWRUZXN0CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0TGluZUhlaWdodCgpIHsKKyAgICAgICAgbVRleHRWaWV3ID0gbmV3IFRleHRWaWV3KG1BY3Rpdml0eSk7CisgICAgICAgIG1UZXh0Vmlldy5zZXRUZXh0KCJUaGlzIGlzIHNvbWUgcmFuZG9tIHRleHQiKTsKKyAgICAgICAgZmluYWwgZmxvYXQgbGluZVNwYWNpbmdFeHRyYSA9IDUwOworICAgICAgICBmaW5hbCBmbG9hdCBsaW5lU3BhY2luZ011bHRpcGxpZXIgPSAwLjJmOworICAgICAgICBtVGV4dFZpZXcuc2V0TGluZVNwYWNpbmcobGluZVNwYWNpbmdFeHRyYSwgbGluZVNwYWNpbmdNdWx0aXBsaWVyKTsKKworICAgICAgICBtVGV4dFZpZXcuc2V0TGluZUhlaWdodCgxMDApOworICAgICAgICBhc3NlcnRFcXVhbHMoMTAwLCBtVGV4dFZpZXcuZ2V0TGluZUhlaWdodCgpKTsKKyAgICAgICAgYXNzZXJ0Tm90RXF1YWxzKGxpbmVTcGFjaW5nRXh0cmEsIG1UZXh0Vmlldy5nZXRMaW5lU3BhY2luZ0V4dHJhKCksIDApOworICAgICAgICBhc3NlcnROb3RFcXVhbHMobGluZVNwYWNpbmdNdWx0aXBsaWVyLCBtVGV4dFZpZXcuZ2V0TGluZVNwYWNpbmdNdWx0aXBsaWVyKCksIDApOworCisgICAgICAgIG1UZXh0Vmlldy5zZXRMaW5lSGVpZ2h0KDIwMCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIG1UZXh0Vmlldy5nZXRMaW5lSGVpZ2h0KCkpOworCisgICAgICAgIG1UZXh0Vmlldy5zZXRMaW5lU3BhY2luZyhsaW5lU3BhY2luZ0V4dHJhLCBsaW5lU3BhY2luZ011bHRpcGxpZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMobGluZVNwYWNpbmdFeHRyYSwgbVRleHRWaWV3LmdldExpbmVTcGFjaW5nRXh0cmEoKSwgMCk7CisgICAgICAgIGFzc2VydEVxdWFscyhsaW5lU3BhY2luZ011bHRpcGxpZXIsIG1UZXh0Vmlldy5nZXRMaW5lU3BhY2luZ011bHRpcGxpZXIoKSwgMCk7CisgICAgfQorCisgICAgQFVpVGhyZWFkVGVzdAorICAgIEBUZXN0KGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRMaW5lSGVpZ2h0X25lZ2F0aXZlKCkgeworICAgICAgICBuZXcgVGV4dFZpZXcobUFjdGl2aXR5KS5zZXRMaW5lSGVpZ2h0KC0xKTsKKyAgICB9CisKKyAgICBAVWlUaHJlYWRUZXN0CisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGVwcmVjYXRlZFNldFRleHRBcHBlYXJhbmNlKCkgewogICAgICAgICBtVGV4dFZpZXcgPSBuZXcgVGV4dFZpZXcobUFjdGl2aXR5KTsKIApAQCAtNDQ0NSw2ICs0NTkyLDc1IEBACiAgICAgICAgIGFzc2VydEVxdWFscyhudWxsLCBtVGV4dFZpZXcuZ2V0VHlwZWZhY2UoKSk7CiAgICAgfQogCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0WG1sVGV4dEFwcGVhcmFuY2UoKSB7CisgICAgICAgIG1UZXh0VmlldyA9IGZpbmRUZXh0VmlldyhSLmlkLnRleHR2aWV3X3RleHRhcHBlYXJhbmNlX2F0dHJzMSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMmYsIG1UZXh0Vmlldy5nZXRUZXh0U2l6ZSgpLCAwLjAxZik7CisgICAgICAgIFR5cGVmYWNlIGl0YWxpY1NhbnMgPSBUeXBlZmFjZS5jcmVhdGUoVHlwZWZhY2UuU0FOU19TRVJJRiwgVHlwZWZhY2UuSVRBTElDKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGl0YWxpY1NhbnMsIG1UZXh0Vmlldy5nZXRUeXBlZmFjZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFR5cGVmYWNlLklUQUxJQywgbVRleHRWaWV3LmdldFR5cGVmYWNlKCkuZ2V0U3R5bGUoKSk7CisgICAgICAgIGFzc2VydFRydWUobVRleHRWaWV3LmlzQWxsQ2FwcygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIuNGYsIG1UZXh0Vmlldy5nZXRMZXR0ZXJTcGFjaW5nKCksIDAuMDFmKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzbWNwIiwgbVRleHRWaWV3LmdldEZvbnRGZWF0dXJlU2V0dGluZ3MoKSk7CisKKyAgICAgICAgbVRleHRWaWV3ID0gZmluZFRleHRWaWV3KFIuaWQudGV4dHZpZXdfdGV4dGFwcGVhcmFuY2VfYXR0cnMyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFR5cGVmYWNlLk1PTk9TUEFDRSwgbVRleHRWaWV3LmdldFR5cGVmYWNlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobUFjdGl2aXR5LmdldFJlc291cmNlcygpLmdldENvbG9yKFIuZHJhd2FibGUucmVkKSwKKyAgICAgICAgICAgICAgICBtVGV4dFZpZXcuZ2V0U2hhZG93Q29sb3IoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxMC4zZiwgbVRleHRWaWV3LmdldFNoYWRvd0R4KCksIDAuMDFmKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAuNWYsIG1UZXh0Vmlldy5nZXRTaGFkb3dEeSgpLCAwLjAxZik7CisgICAgICAgIGFzc2VydEVxdWFscygzLjNmLCBtVGV4dFZpZXcuZ2V0U2hhZG93UmFkaXVzKCksIDAuMDFmKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtVGV4dFZpZXcuaXNFbGVnYW50VGV4dEhlaWdodCgpKTsKKworICAgICAgICAvLyBUaGlzIFRleHRWaWV3IGhhcyBib3RoIGEgVGV4dEFwcGVhcmFuY2UgYW5kIGEgc3R5bGUsIHNvIHRoZSBzdHlsZSBzaG91bGQgb3ZlcnJpZGUuCisgICAgICAgIG1UZXh0VmlldyA9IGZpbmRUZXh0VmlldyhSLmlkLnRleHR2aWV3X3RleHRhcHBlYXJhbmNlX2F0dHJzMyk7CisgICAgICAgIGFzc2VydEVxdWFscygzMmYsIG1UZXh0Vmlldy5nZXRUZXh0U2l6ZSgpLCAwLjAxZik7CisgICAgICAgIFR5cGVmYWNlIGJvbGRTZXJpZiA9IFR5cGVmYWNlLmNyZWF0ZShUeXBlZmFjZS5TRVJJRiwgVHlwZWZhY2UuQk9MRCk7CisgICAgICAgIGFzc2VydEVxdWFscyhib2xkU2VyaWYsIG1UZXh0Vmlldy5nZXRUeXBlZmFjZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFR5cGVmYWNlLkJPTEQsIG1UZXh0Vmlldy5nZXRUeXBlZmFjZSgpLmdldFN0eWxlKCkpOworICAgICAgICBhc3NlcnRGYWxzZShtVGV4dFZpZXcuaXNBbGxDYXBzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMi42ZiwgbVRleHRWaWV3LmdldExldHRlclNwYWNpbmcoKSwgMC4wMWYpOworICAgICAgICBhc3NlcnRFcXVhbHMobUFjdGl2aXR5LmdldFJlc291cmNlcygpLmdldENvbG9yKFIuZHJhd2FibGUuYmx1ZSksCisgICAgICAgICAgICAgICAgbVRleHRWaWV3LmdldFNoYWRvd0NvbG9yKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMS4zZiwgbVRleHRWaWV3LmdldFNoYWRvd0R4KCksIDAuMDFmKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEwLjVmLCBtVGV4dFZpZXcuZ2V0U2hhZG93RHkoKSwgMC4wMWYpOworICAgICAgICBhc3NlcnRFcXVhbHMoNS4zZiwgbVRleHRWaWV3LmdldFNoYWRvd1JhZGl1cygpLCAwLjAxZik7CisgICAgICAgIGFzc2VydEZhbHNlKG1UZXh0Vmlldy5pc0VsZWdhbnRUZXh0SGVpZ2h0KCkpOworCisgICAgICAgIC8vIFRoaXMgVGV4dFZpZXcgaGFzIG5vIFRleHRBcHBlYXJhbmNlIGFuZCBoYXMgYSBzdHlsZSwgc28gdGhlIHN0eWxlIHNob3VsZCBiZSBhcHBsaWVkLgorICAgICAgICBtVGV4dFZpZXcgPSBmaW5kVGV4dFZpZXcoUi5pZC50ZXh0dmlld190ZXh0YXBwZWFyYW5jZV9hdHRyczQpOworICAgICAgICBhc3NlcnRFcXVhbHMoMzJmLCBtVGV4dFZpZXcuZ2V0VGV4dFNpemUoKSwgMC4wMWYpOworICAgICAgICBhc3NlcnRFcXVhbHMoYm9sZFNlcmlmLCBtVGV4dFZpZXcuZ2V0VHlwZWZhY2UoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhUeXBlZmFjZS5CT0xELCBtVGV4dFZpZXcuZ2V0VHlwZWZhY2UoKS5nZXRTdHlsZSgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobVRleHRWaWV3LmlzQWxsQ2FwcygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIuNmYsIG1UZXh0Vmlldy5nZXRMZXR0ZXJTcGFjaW5nKCksIDAuMDFmKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1BY3Rpdml0eS5nZXRSZXNvdXJjZXMoKS5nZXRDb2xvcihSLmRyYXdhYmxlLmJsdWUpLAorICAgICAgICAgICAgICAgIG1UZXh0Vmlldy5nZXRTaGFkb3dDb2xvcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEuM2YsIG1UZXh0Vmlldy5nZXRTaGFkb3dEeCgpLCAwLjAxZik7CisgICAgICAgIGFzc2VydEVxdWFscygxMC41ZiwgbVRleHRWaWV3LmdldFNoYWRvd0R5KCksIDAuMDFmKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUuM2YsIG1UZXh0Vmlldy5nZXRTaGFkb3dSYWRpdXMoKSwgMC4wMWYpOworICAgICAgICBhc3NlcnRGYWxzZShtVGV4dFZpZXcuaXNFbGVnYW50VGV4dEhlaWdodCgpKTsKKworICAgICAgICAvLyBOb3RlOiB0ZXh0LCBsaW5rIGFuZCBoaW50IGNvbG9ycyBjYW4ndCBiZSB0ZXN0ZWQgZHVlIHRvIHRoZSBkZWZhdWx0IHN0eWxlIG92ZXJyaWRpbmcKKyAgICAgICAgLy8gdmFsdWVzIGIvNjM5MjM1NDIKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RYbWxUeXBlZmFjZUZvbnRGYW1pbHlIaWVyYXJjaHkoKSB7CisgICAgICAgIC8vIFRoaXMgdmlldyBoYXMgdHlwZWZhY2U9c2VyaWYgc2V0IG9uIHRoZSB2aWV3IGRpcmVjdGx5IGFuZCBhIGZvbnRGYW1pbHkgb24gdGhlIGFwcGVhcmFuY2UuCisgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgdGhlIGF0dHIgc2V0IGRpcmVjdGx5IG9uIHRoZSB2aWV3IHNob3VsZCB0YWtlIHByZWNlZGVuY2UuCisgICAgICAgIG1UZXh0VmlldyA9IGZpbmRUZXh0VmlldyhSLmlkLnRleHR2aWV3X3RleHRhcHBlYXJhbmNlX2F0dHJzX3NlcmlmX2ZvbnRmYW1pbHkpOworCisgICAgICAgIGFzc2VydEVxdWFscyhUeXBlZmFjZS5TRVJJRiwgbVRleHRWaWV3LmdldFR5cGVmYWNlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZVJlYWRpbmdfYWxsQ2Fwc0FuZFBhc3N3b3JkKCkgeworICAgICAgICAvLyBUaGlzIFRleHRWaWV3IGhhcyBhbGwgY2FwcyAmIHBhc3N3b3JkLCB0aGVyZWZvcmUgYWxsIGNhcHMgc2hvdWxkIGJlIGlnbm9yZWQuCisgICAgICAgIG1UZXh0VmlldyA9IGZpbmRUZXh0VmlldyhSLmlkLnRleHR2aWV3X3RleHRhcHBlYXJhbmNlX2F0dHJzX2FsbGNhcHNfcGFzc3dvcmQpOworICAgICAgICBhc3NlcnRGYWxzZShtVGV4dFZpZXcuaXNBbGxDYXBzKCkpOworICAgIH0KKwogICAgIEBVaVRocmVhZFRlc3QKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NDb21wb3VuZERyYXdhYmxlVGludCgpIHsKQEAgLTYyMTcsOTYgKzY0MzMsNiBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoImZyYWMiLCB0ZXh0Vmlldy5nZXRGb250RmVhdHVyZVNldHRpbmdzKCkpOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNvZnRJbnB1dFJlc3VsdFJlY2VpdmVyIGV4dGVuZHMgUmVzdWx0UmVjZWl2ZXIgewotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUlzRG9uZTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVJlc3VsdENvZGU7Ci0KLSAgICAgICAgcHVibGljIFNvZnRJbnB1dFJlc3VsdFJlY2VpdmVyKEhhbmRsZXIgaGFuZGxlcikgewotICAgICAgICAgICAgc3VwZXIoaGFuZGxlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25SZWNlaXZlUmVzdWx0KGludCByZXN1bHRDb2RlLCBCdW5kbGUgcmVzdWx0RGF0YSkgewotICAgICAgICAgICAgbVJlc3VsdENvZGUgPSByZXN1bHRDb2RlOwotICAgICAgICAgICAgbUlzRG9uZSA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKLSAgICAgICAgICAgIG1Jc0RvbmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEFjY2Vzc1Nob3dTb2Z0SW5wdXRPbkZvY3VzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIGlmICghbUFjdGl2aXR5LmdldFBhY2thZ2VNYW5hZ2VyKCkuaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX0lOUFVUX01FVEhPRFMpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBwcmVwYXJlIGEgdGVzdCBMYXlvdXQKLSAgICAgICAgLy8gd2lsbCBhZGQgYW4gZm9jdXNhYmxlIFRleHRWaWV3IHNvIHRoYXQgRWRpdFRleHQgd2lsbCBub3QgZ2V0IGZvY3VzIGF0IGFjdGl2aXR5IHN0YXJ0Ci0gICAgICAgIGZpbmFsIFRleHRWaWV3IHRleHRWaWV3ID0gbmV3IFRleHRWaWV3KG1BY3Rpdml0eSk7Ci0gICAgICAgIHRleHRWaWV3LnNldEZvY3VzYWJsZSh0cnVlKTsKLSAgICAgICAgdGV4dFZpZXcuc2V0Rm9jdXNhYmxlSW5Ub3VjaE1vZGUodHJ1ZSk7Ci0gICAgICAgIC8vIEVkaXRUZXh0IHRvIHRlc3QKLSAgICAgICAgZmluYWwgRWRpdFRleHQgZWRpdFRleHQgPSBuZXcgRWRpdFRleHQobUFjdGl2aXR5KTsKLSAgICAgICAgZWRpdFRleHQuc2V0U2hvd1NvZnRJbnB1dE9uRm9jdXModHJ1ZSk7Ci0gICAgICAgIGVkaXRUZXh0LnNldEZvY3VzYWJsZSh0cnVlKTsKLSAgICAgICAgZWRpdFRleHQuc2V0Rm9jdXNhYmxlSW5Ub3VjaE1vZGUodHJ1ZSk7Ci0gICAgICAgIC8vIHByZXBhcmUgYW5kIHNldCB0aGUgbGF5b3V0Ci0gICAgICAgIGZpbmFsIExpbmVhckxheW91dCBsYXlvdXQgPSBuZXcgTGluZWFyTGF5b3V0KG1BY3Rpdml0eSk7Ci0gICAgICAgIGxheW91dC5zZXRPcmllbnRhdGlvbihMaW5lYXJMYXlvdXQuVkVSVElDQUwpOwotICAgICAgICBsYXlvdXQuYWRkVmlldyh0ZXh0VmlldywgbmV3IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwKLSAgICAgICAgICAgICAgICBMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKSk7Ci0gICAgICAgIGxheW91dC5hZGRWaWV3KGVkaXRUZXh0LCBuZXcgVmlld0dyb3VwLkxheW91dFBhcmFtcyhMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULAotICAgICAgICAgICAgICAgIExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpKTsKLSAgICAgICAgbUFjdGl2aXR5UnVsZS5ydW5PblVpVGhyZWFkKCgpIC0+IG1BY3Rpdml0eS5zZXRDb250ZW50VmlldyhsYXlvdXQsCi0gICAgICAgICAgICAgICAgbmV3IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMoVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkpKTsKLSAgICAgICAgbUluc3RydW1lbnRhdGlvbi53YWl0Rm9ySWRsZVN5bmMoKTsKLQotICAgICAgICBhc3NlcnRUcnVlKGVkaXRUZXh0LmdldFNob3dTb2Z0SW5wdXRPbkZvY3VzKCkpOwotCi0gICAgICAgIC8vIEFuZCBlbXVsYXRlIGNsaWNrIG9uIGl0Ci0gICAgICAgIEN0c1RvdWNoVXRpbHMuZW11bGF0ZVRhcE9uVmlld0NlbnRlcihtSW5zdHJ1bWVudGF0aW9uLCBlZGl0VGV4dCk7Ci0KLSAgICAgICAgLy8gVmVyaWZ5IHRoYXQgaW5wdXQgbWV0aG9kIG1hbmFnZXIgaXMgYWN0aXZlIGFuZCBhY2NlcHRpbmcgdGV4dAotICAgICAgICBmaW5hbCBJbnB1dE1ldGhvZE1hbmFnZXIgaW1NYW5hZ2VyID0gKElucHV0TWV0aG9kTWFuYWdlcikgbUFjdGl2aXR5Ci0gICAgICAgICAgICAgICAgLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5JTlBVVF9NRVRIT0RfU0VSVklDRSk7Ci0gICAgICAgIFBvbGxpbmdDaGVjay53YWl0Rm9yKGltTWFuYWdlcjo6aXNBY3RpdmUpOwotICAgICAgICBhc3NlcnRUcnVlKGltTWFuYWdlci5pc0FjY2VwdGluZ1RleHQoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoaW1NYW5hZ2VyLmlzQWN0aXZlKGVkaXRUZXh0KSk7Ci0KLSAgICAgICAgLy8gU2luY2UgdGhlcmUgaXMgbm8gQVBJIHRvIGNoZWNrIHRoYXQgc29mdCBpbnB1dCBpcyBzaG93aW5nLCB3ZSdyZSBnb2luZyB0byBhc2sKLSAgICAgICAgLy8gdGhlIGlucHV0IG1ldGhvZCBtYW5hZ2VyIHRvIHNob3cgc29mdCBpbnB1dCwgcGFzc2luZyBvdXIgY3VzdG9tIHJlc3VsdCByZWNlaXZlci4KLSAgICAgICAgLy8gV2UncmUgZXhwZWN0aW5nIHRvIGdldCBVTkNIQU5HRURfU0hPV04sIGluZGljYXRpbmcgdGhhdCB0aGUgc29mdCBpbnB1dCB3YXMgYWxyZWFkeQotICAgICAgICAvLyBzaG93aW5nIGJlZm9yZSBzaG93U29mdElucHV0IHdhcyBjYWxsZWQuCi0gICAgICAgIFNvZnRJbnB1dFJlc3VsdFJlY2VpdmVyIHJlY2VpdmVyID0gbmV3IFNvZnRJbnB1dFJlc3VsdFJlY2VpdmVyKG1IYW5kbGVyKTsKLSAgICAgICAgaW1NYW5hZ2VyLnNob3dTb2Z0SW5wdXQoZWRpdFRleHQsIDAsIHJlY2VpdmVyKTsKLSAgICAgICAgUG9sbGluZ0NoZWNrLndhaXRGb3IoKCkgLT4gcmVjZWl2ZXIubUlzRG9uZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhJbnB1dE1ldGhvZE1hbmFnZXIuUkVTVUxUX1VOQ0hBTkdFRF9TSE9XTiwgcmVjZWl2ZXIubVJlc3VsdENvZGUpOwotCi0gICAgICAgIC8vIENsb3NlIHNvZnQgaW5wdXQKLSAgICAgICAgbUluc3RydW1lbnRhdGlvbi5zZW5kS2V5RG93blVwU3luYyhLZXlFdmVudC5LRVlDT0RFX0JBQ0spOwotCi0gICAgICAgIC8vIFJlY29uZmlndXJlIG91ciBlZGl0IHRleHQgdG8gbm90IHNob3cgc29mdCBpbnB1dCBvbiBmb2N1cwotICAgICAgICBtQWN0aXZpdHlSdWxlLnJ1bk9uVWlUaHJlYWQoKCkgLT4gZWRpdFRleHQuc2V0U2hvd1NvZnRJbnB1dE9uRm9jdXMoZmFsc2UpKTsKLSAgICAgICAgbUluc3RydW1lbnRhdGlvbi53YWl0Rm9ySWRsZVN5bmMoKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoZWRpdFRleHQuZ2V0U2hvd1NvZnRJbnB1dE9uRm9jdXMoKSk7Ci0KLSAgICAgICAgLy8gRW11bGF0ZSBjbGljayBvbiBpdAotICAgICAgICBDdHNUb3VjaFV0aWxzLmVtdWxhdGVUYXBPblZpZXdDZW50ZXIobUluc3RydW1lbnRhdGlvbiwgZWRpdFRleHQpOwotCi0gICAgICAgIC8vIEFzayBpbnB1dCBtZXRob2QgbWFuYWdlciB0byBzaG93IHNvZnQgaW5wdXQgYWdhaW4uIFRoaXMgdGltZSB3ZSdyZSBleHBlY3RpbmcgdG8gZ2V0Ci0gICAgICAgIC8vIFNIT1dOLCBpbmRpY2F0aW5nIHRoYXQgdGhlIHNvZnQgaW5wdXQgd2FzIG5vdCBzaG93aW5nIGJlZm9yZSBzaG93U29mdElucHV0IHdhcyBjYWxsZWQuCi0gICAgICAgIHJlY2VpdmVyLnJlc2V0KCk7Ci0gICAgICAgIGltTWFuYWdlci5zaG93U29mdElucHV0KGVkaXRUZXh0LCAwLCByZWNlaXZlcik7Ci0gICAgICAgIFBvbGxpbmdDaGVjay53YWl0Rm9yKCgpIC0+IHJlY2VpdmVyLm1Jc0RvbmUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoSW5wdXRNZXRob2RNYW5hZ2VyLlJFU1VMVF9TSE9XTiwgcmVjZWl2ZXIubVJlc3VsdENvZGUpOwotCi0gICAgICAgIC8vIENsb3NlIHNvZnQgaW5wdXQKLSAgICAgICAgbUluc3RydW1lbnRhdGlvbi5zZW5kS2V5RG93blVwU3luYyhLZXlFdmVudC5LRVlDT0RFX0JBQ0spOwotICAgIH0KLQogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdElzU3VnZ2VzdGlvbnNFbmFibGVkKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIG1UZXh0VmlldyA9IGZpbmRUZXh0VmlldyhSLmlkLnRleHR2aWV3X3RleHQpOwpAQCAtNzc0Myw2ICs3ODY5LDEyNSBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoVHlwZWZhY2UuREVGQVVMVCwgbVRleHRWaWV3LmdldFR5cGVmYWNlKCkpOwogICAgIH0KIAorICAgIEBVaVRocmVhZFRlc3QKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGYWxsYmFja0xpbmVTcGFjaW5nX3JlYWRzRnJvbUxheW91dFhtbCgpIHsKKyAgICAgICAgbUFjdGl2aXR5LnNldENvbnRlbnRWaWV3KFIubGF5b3V0LnRleHR2aWV3X2ZhbGxiYWNrbGluZXNwYWNpbmdfbGF5b3V0KTsKKyAgICAgICAgbVRleHRWaWV3ID0gZmluZFRleHRWaWV3KFIuaWQudGV4dHZpZXdfdHJ1ZSk7CisgICAgICAgIGFzc2VydFRydWUobVRleHRWaWV3LmlzRmFsbGJhY2tMaW5lU3BhY2luZygpKTsKKworICAgICAgICBtVGV4dFZpZXcgPSBmaW5kVGV4dFZpZXcoUi5pZC50ZXh0dmlld19kZWZhdWx0KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtVGV4dFZpZXcuaXNGYWxsYmFja0xpbmVTcGFjaW5nKCkpOworCisgICAgICAgIG1UZXh0VmlldyA9IGZpbmRUZXh0VmlldyhSLmlkLnRleHR2aWV3X2ZhbHNlKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobVRleHRWaWV3LmlzRmFsbGJhY2tMaW5lU3BhY2luZygpKTsKKyAgICB9CisKKyAgICBAVWlUaHJlYWRUZXN0CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmFsbGJhY2tMaW5lU3BhY2luZ19zZXRfZ2V0KCkgeworICAgICAgICBtQWN0aXZpdHkuc2V0Q29udGVudFZpZXcoUi5sYXlvdXQudGV4dHZpZXdfZmFsbGJhY2tsaW5lc3BhY2luZ19sYXlvdXQpOworICAgICAgICBtVGV4dFZpZXcgPSBmaW5kVGV4dFZpZXcoUi5pZC50ZXh0dmlld190cnVlKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtVGV4dFZpZXcuaXNGYWxsYmFja0xpbmVTcGFjaW5nKCkpOworCisgICAgICAgIG1UZXh0Vmlldy5zZXRGYWxsYmFja0xpbmVTcGFjaW5nKGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobVRleHRWaWV3LmlzRmFsbGJhY2tMaW5lU3BhY2luZygpKTsKKworICAgICAgICBtVGV4dFZpZXcuc2V0RmFsbGJhY2tMaW5lU3BhY2luZyh0cnVlKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtVGV4dFZpZXcuaXNGYWxsYmFja0xpbmVTcGFjaW5nKCkpOworICAgIH0KKworICAgIEBVaVRocmVhZFRlc3QKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGYWxsYmFja0xpbmVTcGFjaW5nX3JlYWRzRnJvbVN0eWxlWG1sKCkgeworICAgICAgICBtQWN0aXZpdHkuc2V0Q29udGVudFZpZXcoUi5sYXlvdXQudGV4dHZpZXdfZmFsbGJhY2tsaW5lc3BhY2luZ19sYXlvdXQpOworICAgICAgICBtVGV4dFZpZXcgPSBmaW5kVGV4dFZpZXcoUi5pZC50ZXh0dmlld19zdHlsZV90cnVlKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtVGV4dFZpZXcuaXNGYWxsYmFja0xpbmVTcGFjaW5nKCkpOworCisgICAgICAgIG1UZXh0VmlldyA9IGZpbmRUZXh0VmlldyhSLmlkLnRleHR2aWV3X3N0eWxlX2RlZmF1bHQpOworICAgICAgICBhc3NlcnRUcnVlKG1UZXh0Vmlldy5pc0ZhbGxiYWNrTGluZVNwYWNpbmcoKSk7CisKKyAgICAgICAgbVRleHRWaWV3ID0gZmluZFRleHRWaWV3KFIuaWQudGV4dHZpZXdfc3R5bGVfZmFsc2UpOworICAgICAgICBhc3NlcnRGYWxzZShtVGV4dFZpZXcuaXNGYWxsYmFja0xpbmVTcGFjaW5nKCkpOworICAgIH0KKworICAgIEBVaVRocmVhZFRlc3QKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGYWxsYmFja0xpbmVTcGFjaW5nX3RleHRBcHBlYXJhbmNlX3NldF9nZXQoKSB7CisgICAgICAgIG1BY3Rpdml0eS5zZXRDb250ZW50VmlldyhSLmxheW91dC50ZXh0dmlld19mYWxsYmFja2xpbmVzcGFjaW5nX2xheW91dCk7CisgICAgICAgIG1UZXh0VmlldyA9IGZpbmRUZXh0VmlldyhSLmlkLnRleHR2aWV3X2RlZmF1bHQpOworICAgICAgICBhc3NlcnRUcnVlKG1UZXh0Vmlldy5pc0ZhbGxiYWNrTGluZVNwYWNpbmcoKSk7CisKKyAgICAgICAgbVRleHRWaWV3LnNldFRleHRBcHBlYXJhbmNlKFIuc3R5bGUuVGV4dEFwcGVhcmFuY2VfRmFsbGJhY2tMaW5lU3BhY2luZ0ZhbHNlKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobVRleHRWaWV3LmlzRmFsbGJhY2tMaW5lU3BhY2luZygpKTsKKworICAgICAgICBtVGV4dFZpZXcuc2V0VGV4dEFwcGVhcmFuY2UoUi5zdHlsZS5UZXh0QXBwZWFyYW5jZV9GYWxsYmFja0xpbmVTcGFjaW5nVHJ1ZSk7CisgICAgICAgIGFzc2VydFRydWUobVRleHRWaWV3LmlzRmFsbGJhY2tMaW5lU3BhY2luZygpKTsKKworICAgICAgICBtVGV4dFZpZXcuc2V0RmFsbGJhY2tMaW5lU3BhY2luZyhmYWxzZSk7CisgICAgICAgIG1UZXh0Vmlldy5zZXRUZXh0QXBwZWFyYW5jZShSLnN0eWxlLlRleHRBcHBlYXJhbmNlKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobVRleHRWaWV3LmlzRmFsbGJhY2tMaW5lU3BhY2luZygpKTsKKworICAgICAgICBtVGV4dFZpZXcuc2V0RmFsbGJhY2tMaW5lU3BhY2luZyh0cnVlKTsKKyAgICAgICAgbVRleHRWaWV3LnNldFRleHRBcHBlYXJhbmNlKFIuc3R5bGUuVGV4dEFwcGVhcmFuY2UpOworICAgICAgICBhc3NlcnRUcnVlKG1UZXh0Vmlldy5pc0ZhbGxiYWNrTGluZVNwYWNpbmcoKSk7CisgICAgfQorCisgICAgQFVpVGhyZWFkVGVzdAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRleHRMYXlvdXRQYXJhbSgpIHsKKyAgICAgICAgbUFjdGl2aXR5LnNldENvbnRlbnRWaWV3KFIubGF5b3V0LnRleHR2aWV3X2ZhbGxiYWNrbGluZXNwYWNpbmdfbGF5b3V0KTsKKyAgICAgICAgbVRleHRWaWV3ID0gZmluZFRleHRWaWV3KFIuaWQudGV4dHZpZXdfZGVmYXVsdCk7CisgICAgICAgIFByZWNvbXB1dGVkVGV4dC5QYXJhbXMgcGFyYW0gPSBtVGV4dFZpZXcuZ2V0VGV4dE1ldHJpY3NQYXJhbXMoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMobVRleHRWaWV3LmdldEJyZWFrU3RyYXRlZ3koKSwgcGFyYW0uZ2V0QnJlYWtTdHJhdGVneSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1UZXh0Vmlldy5nZXRIeXBoZW5hdGlvbkZyZXF1ZW5jeSgpLCBwYXJhbS5nZXRIeXBoZW5hdGlvbkZyZXF1ZW5jeSgpKTsKKworICAgICAgICBhc3NlcnRUcnVlKHBhcmFtLmVxdWFscyhtVGV4dFZpZXcuZ2V0VGV4dE1ldHJpY3NQYXJhbXMoKSkpOworCisgICAgICAgIG1UZXh0Vmlldy5zZXRCcmVha1N0cmF0ZWd5KAorICAgICAgICAgICAgICAgIG1UZXh0Vmlldy5nZXRCcmVha1N0cmF0ZWd5KCkgPT0gTGF5b3V0LkJSRUFLX1NUUkFURUdZX1NJTVBMRQorICAgICAgICAgICAgICAgID8gIExheW91dC5CUkVBS19TVFJBVEVHWV9CQUxBTkNFRCA6IExheW91dC5CUkVBS19TVFJBVEVHWV9TSU1QTEUpOworCisgICAgICAgIGFzc2VydEZhbHNlKHBhcmFtLmVxdWFscyhtVGV4dFZpZXcuZ2V0VGV4dE1ldHJpY3NQYXJhbXMoKSkpOworCisgICAgICAgIG1UZXh0Vmlldy5zZXRUZXh0TWV0cmljc1BhcmFtcyhwYXJhbSk7CisgICAgICAgIGFzc2VydFRydWUocGFyYW0uZXF1YWxzKG1UZXh0Vmlldy5nZXRUZXh0TWV0cmljc1BhcmFtcygpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RHluYW1pY0xheW91dFJlZmxvd0NyYXNoX2I3NTY1MjgyOSgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBmaW5hbCBTcGFubmFibGVTdHJpbmdCdWlsZGVyIHRleHQgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcigiYWJjZGUiKTsKKyAgICAgICAgdGV4dC5zZXRTcGFuKG5ldyBVbmRlcmxpbmVTcGFuKCksIDAsIDUsIFNwYW5uZWQuU1BBTl9FWENMVVNJVkVfRVhDTFVTSVZFKTsKKworICAgICAgICBtQWN0aXZpdHlSdWxlLnJ1bk9uVWlUaHJlYWQoKCkgLT4geworICAgICAgICAgICAgbVRleHRWaWV3ID0gbmV3IEVkaXRUZXh0KG1BY3Rpdml0eSk7CisgICAgICAgICAgICBtQWN0aXZpdHkuc2V0Q29udGVudFZpZXcobVRleHRWaWV3KTsKKyAgICAgICAgICAgIG1UZXh0Vmlldy5zZXRUZXh0KHRleHQsIEJ1ZmZlclR5cGUuRURJVEFCTEUpOworICAgICAgICAgICAgbVRleHRWaWV3LnJlcXVlc3RGb2N1cygpOworICAgICAgICAgICAgbVRleHRWaWV3LnNldFNlbGVjdGVkKHRydWUpOworICAgICAgICAgICAgbVRleHRWaWV3LnNldFRleHRDbGFzc2lmaWVyKFRleHRDbGFzc2lmaWVyLk5PX09QKTsKKyAgICAgICAgfSk7CisgICAgICAgIG1JbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7CisKKyAgICAgICAgbUFjdGl2aXR5UnVsZS5ydW5PblVpVGhyZWFkKCgpIC0+IHsKKyAgICAgICAgICAgIC8vIFNldCBzZWxlY3Rpb24gYW5kIHRyeSB0byBzdGFydCBhY3Rpb24gbW9kZS4KKyAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBhcmdzID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgYXJncy5wdXRJbnQoQWNjZXNzaWJpbGl0eU5vZGVJbmZvLkFDVElPTl9BUkdVTUVOVF9TRUxFQ1RJT05fU1RBUlRfSU5ULCAwKTsKKyAgICAgICAgICAgIGFyZ3MucHV0SW50KEFjY2Vzc2liaWxpdHlOb2RlSW5mby5BQ1RJT05fQVJHVU1FTlRfU0VMRUNUSU9OX0VORF9JTlQsIHRleHQubGVuZ3RoKCkpOworICAgICAgICAgICAgbVRleHRWaWV3LnBlcmZvcm1BY2Nlc3NpYmlsaXR5QWN0aW9uKAorICAgICAgICAgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8uQUNUSU9OX1NFVF9TRUxFQ1RJT04sIGFyZ3MpOworICAgICAgICB9KTsKKyAgICAgICAgbUluc3RydW1lbnRhdGlvbi53YWl0Rm9ySWRsZVN5bmMoKTsKKworICAgICAgICBtQWN0aXZpdHlSdWxlLnJ1bk9uVWlUaHJlYWQoKCkgLT4geworICAgICAgICAgICAgRWRpdGFibGUgZWRpdGFibGUgPSAoRWRpdGFibGUpIG1UZXh0Vmlldy5nZXRUZXh0KCk7CisgICAgICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIHNzYiA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKCJhIik7CisgICAgICAgICAgICBzc2Iuc2V0U3BhbihuZXcgVW5kZXJsaW5lU3BhbigpLCAwLCAxLCBTcGFubmVkLlNQQU5fRVhDTFVTSVZFX0VYQ0xVU0lWRSk7CisgICAgICAgICAgICBlZGl0YWJsZS5yZXBsYWNlKDUsIDUsIHNzYik7CisgICAgICAgIH0pOworICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplVGV4dEZvclNtYXJ0U2VsZWN0aW9uKENoYXJTZXF1ZW5jZSB0ZXh0KSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgYXNzZXJ0VHJ1ZSh0ZXh0Lmxlbmd0aCgpID49IFNNQVJUU0VMRUNUX0VORCk7CiAgICAgICAgIG1BY3Rpdml0eVJ1bGUucnVuT25VaVRocmVhZCgoKSAtPiB7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9UaW1lUGlja2VyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvVGltZVBpY2tlclRlc3QuamF2YQppbmRleCAwODg2YWEzLi5iNGE0M2UzIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9UaW1lUGlja2VyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1RpbWVQaWNrZXJUZXN0LmphdmEKQEAgLTMyLDE3ICszMiwxOCBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYXV0b2ZpbGwuQXV0b2ZpbGxWYWx1ZTsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5UaW1lUGlja2VyOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkN0c0tleUV2ZW50VXRpbDsKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkN0c1RvdWNoVXRpbHM7CiAKQEAgLTM5Miw2ICszOTMsOSBAQAogICAgICAgICBpZiAoaXNXYXRjaCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KKyAgICAgICAgLy8gSGlkZSB0aW1lcGlja2VyX2Nsb2NrIHNvIHRoYXQgdGltZXBpY2tlcl9zcGlubmVyIHdvdWxkIGJlIHZpc2libGUuCisgICAgICAgIG1BY3Rpdml0eVJ1bGUucnVuT25VaVRocmVhZCgoKSAtPgorICAgICAgICAgICAgICAgIG1BY3Rpdml0eS5maW5kVmlld0J5SWQoUi5pZC50aW1lcGlja2VyX2Nsb2NrKS5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSkpOwogICAgICAgICBtVGltZVBpY2tlciA9IChUaW1lUGlja2VyKSBtQWN0aXZpdHkuZmluZFZpZXdCeUlkKFIuaWQudGltZXBpY2tlcl9zcGlubmVyKTsKIAogICAgICAgICBtQWN0aXZpdHlSdWxlLnJ1bk9uVWlUaHJlYWQoKCkgLT4gbVRpbWVQaWNrZXIuc2V0SXMyNEhvdXJWaWV3KGZhbHNlKSk7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9Ub2FzdFRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1RvYXN0VGVzdC5qYXZhCmluZGV4IGYyNDI2ZTguLmIwZDM3NTEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1RvYXN0VGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1RvYXN0VGVzdC5qYXZhCkBAIC0yNSwxMyArMjUsOSBAQAogCiBpbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5MYXJnZVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyOwpAQCAtMzksNiArMzUsMTIgQEAKIGltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVG9hc3Q7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLkxhcmdlVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5Qb2xsaW5nQ2hlY2s7CiAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwpAQCAtMjIzLDYgKzIyNSw3IEBACiAgICAgICAgIGFzc2VydEVxdWFscyhob3Jpem9udGFsMSwgcGFyYW1zMS5ob3Jpem9udGFsTWFyZ2luLCAwLjBmKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKHZlcnRpY2FsMSwgcGFyYW1zMS52ZXJ0aWNhbE1hcmdpbiwgMC4wZik7CiAgICAgICAgIGFzc2VydExheW91dERvbmUodmlldyk7CisKICAgICAgICAgaW50W10geHkxID0gbmV3IGludFsyXTsKICAgICAgICAgdmlldy5nZXRMb2NhdGlvbk9uU2NyZWVuKHh5MSk7CiAgICAgICAgIGFzc2VydFNob3dBbmRIaWRlKHZpZXcpOwpAQCAtMjQ4LDggKzI1MSwxOSBAQAogICAgICAgICB2aWV3LmdldExvY2F0aW9uT25TY3JlZW4oeHkyKTsKICAgICAgICAgYXNzZXJ0U2hvd0FuZEhpZGUodmlldyk7CiAKLSAgICAgICAgYXNzZXJ0VHJ1ZSh4eTFbMF0gPiB4eTJbMF0pOwotICAgICAgICBhc3NlcnRUcnVlKHh5MVsxXSA8IHh5MlsxXSk7CisgICAgICAgIC8qKiBDaGVjayBpZiB0aGUgdGVzdCBpcyBiZWluZyBydW4gb24gYSB3YXRjaC4KKyAgICAgICAgICoKKyAgICAgICAgICogQ2hhbmdlIEk4MTgwZTUwODBlMGE2ODYwYjQwZGJiMmZhYTc5MWYwZWRlOTI2Y2E3IHVwZGF0ZWQgaG93IHRvYXN0IGFyZSBkaXNwbGF5ZWQgb24gdGhlCisgICAgICAgICAqIHdhdGNoLiBVbmxpa2UgdGhlIHBob25lLCB3aGljaCBkaXNwbGF5cyB0b2FzdCBjZW50ZXJlZCBob3Jpem9udGFsbHkgYXQgdGhlIGJvdHRvbSBvZiB0aGUKKyAgICAgICAgICogc2NyZWVuLCB0aGUgd2F0Y2ggbm93IGRpc3BsYXlzIHRvYXN0IGluIHRoZSBjZW50ZXIgb2YgdGhlIHNjcmVlbi4KKyAgICAgICAgICovCisgICAgICAgIGlmIChtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9XQVRDSCkpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoeHkxWzBdID4geHkyWzBdKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoeHkxWzFdID4geHkyWzFdKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoeHkxWzBdID4geHkyWzBdKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoeHkxWzFdIDwgeHkyWzFdKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIEBUZXN0CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9Ub2dnbGVCdXR0b25UZXN0LmphdmEgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9Ub2dnbGVCdXR0b25UZXN0LmphdmEKaW5kZXggYTQ3Mzk4My4uY2Y4ZTk4YSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvVG9nZ2xlQnV0dG9uVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1RvZ2dsZUJ1dHRvblRlc3QuamF2YQpAQCAtMjcsMTMgKzI3LDE0IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLlN0YXRlTGlzdERyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRvZ2dsZUJ1dHRvbjsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1Rvb2xiYXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9Ub29sYmFyVGVzdC5qYXZhCmluZGV4IGZmNGRhMTAuLjE2NWI1MTkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1Rvb2xiYXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvVG9vbGJhclRlc3QuamF2YQpAQCAtMzIsMTEgKzMyLDYgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CkBAIC00NCw2ICszOSwxMiBAQAogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRvb2xiYXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuY3RzLnV0aWwuVGVzdFV0aWxzOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLldpZGdldFRlc3RVdGlsczsKIAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9Ub29sYmFyV2l0aE1hcmdpbnNUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9Ub29sYmFyV2l0aE1hcmdpbnNUZXN0LmphdmEKaW5kZXggNWJiYTQyMy4uZGZjMGY5MSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvVG9vbGJhcldpdGhNYXJnaW5zVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1Rvb2xiYXJXaXRoTWFyZ2luc1Rlc3QuamF2YQpAQCAtMTgsMTIgKzE4LDEzIEBACiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiAKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRvb2xiYXI7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvVHdvTGluZUxpc3RJdGVtVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvVHdvTGluZUxpc3RJdGVtVGVzdC5qYXZhCmluZGV4IGY5MzFhNjMuLjQzODA2ZTAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1R3b0xpbmVMaXN0SXRlbVRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9Ud29MaW5lTGlzdEl0ZW1UZXN0LmphdmEKQEAgLTI0LDE1ICsyNCwxNiBAQAogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5SZWxhdGl2ZUxheW91dC5MYXlvdXRQYXJhbXM7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVHdvTGluZUxpc3RJdGVtOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1ZpZGVvVmlld1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1ZpZGVvVmlld1Rlc3QuamF2YQppbmRleCBiYzZiYTYxLi45ODZlMDI0IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9WaWRlb1ZpZXdUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvVmlkZW9WaWV3VGVzdC5qYXZhCkBAIC0zNiwxNiArMzYsMTcgQEAKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUGxheWJhY2tDb25maWd1cmF0aW9uOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLkxhcmdlVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5NZWFzdXJlU3BlYzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5NZWRpYUNvbnRyb2xsZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVmlkZW9WaWV3OwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5MYXJnZVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuTWVkaWFVdGlsczsKIAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CkBAIC0xNzAsOCArMTcxLDcgQEAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheWJhY2tDb25maWdDaGFuZ2VkKExpc3Q8QXVkaW9QbGF5YmFja0NvbmZpZ3VyYXRpb24+IGNvbmZpZ3MpIHsKICAgICAgICAgICAgIGZvciAoQXVkaW9QbGF5YmFja0NvbmZpZ3VyYXRpb24gYXBjIDogY29uZmlncykgewotICAgICAgICAgICAgICAgIGlmIChhcGMuZ2V0UGxheWVyU3RhdGUoKSA9PSBBdWRpb1BsYXliYWNrQ29uZmlndXJhdGlvbi5QTEFZRVJfU1RBVEVfU1RBUlRFRAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgYXBjLmdldEF1ZGlvQXR0cmlidXRlcygpLmdldFVzYWdlKCkgPT0gQVVESU9fQVRUUi5nZXRVc2FnZSgpCisgICAgICAgICAgICAgICAgaWYgKGFwYy5nZXRBdWRpb0F0dHJpYnV0ZXMoKS5nZXRVc2FnZSgpID09IEFVRElPX0FUVFIuZ2V0VXNhZ2UoKQogICAgICAgICAgICAgICAgICAgICAgICAgJiYgYXBjLmdldEF1ZGlvQXR0cmlidXRlcygpLmdldENvbnRlbnRUeXBlKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gQVVESU9fQVRUUi5nZXRDb250ZW50VHlwZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIG1NYXRjaGluZ1BsYXllckZvdW5kID0gdHJ1ZTsKQEAgLTE5Nyw3ICsxOTcsNyBAQAogICAgICAgICBtVmlkZW9WaWV3LnNldEF1ZGlvQXR0cmlidXRlcyhBVURJT19BVFRSKTsKICAgICAgICAgbVZpZGVvVmlldy5zZXRBdWRpb0ZvY3VzUmVxdWVzdChBdWRpb01hbmFnZXIuQVVESU9GT0NVU19HQUlOX1RSQU5TSUVOVCk7CiAKLSAgICAgICAgZmluYWwgQXVkaW9NYW5hZ2VyIGFtID0gbmV3IEF1ZGlvTWFuYWdlcihtQWN0aXZpdHkpOworICAgICAgICBmaW5hbCBBdWRpb01hbmFnZXIgYW0gPSAoQXVkaW9NYW5hZ2VyKSBtQWN0aXZpdHkuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkFVRElPX1NFUlZJQ0UpOwogICAgICAgICBmaW5hbCBNeVBsYXliYWNrQ2FsbGJhY2sgbXlDYiA9IG5ldyBNeVBsYXliYWNrQ2FsbGJhY2soKTsKICAgICAgICAgbUFjdGl2aXR5UnVsZS5ydW5PblVpVGhyZWFkKCgpIC0+IGFtLnJlZ2lzdGVyQXVkaW9QbGF5YmFja0NhbGxiYWNrKG15Q2IsIG51bGwpKTsKICAgICAgICAgbUFjdGl2aXR5UnVsZS5ydW5PblVpVGhyZWFkKCgpIC0+IG1WaWRlb1ZpZXcuc2V0VmlkZW9QYXRoKG1WaWRlb1BhdGgpKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1ZpZXdBbmltYXRvclRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1ZpZXdBbmltYXRvclRlc3QuamF2YQppbmRleCA3NzEwZGNjLi45ZmE2OGU0IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9WaWV3QW5pbWF0b3JUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvVmlld0FuaW1hdG9yVGVzdC5qYXZhCkBAIC0yMiwxMCArMjIsNiBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlhtbDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKQEAgLTM2LDYgKzMyLDExIEBACiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVsYXRpdmVMYXlvdXQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVmlld0FuaW1hdG9yOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5hbm5vdGF0aW9uLlVpVGhyZWFkVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1ZpZXdGbGlwcGVyVGVzdC5qYXZhIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvVmlld0ZsaXBwZXJUZXN0LmphdmEKaW5kZXggYjEzNTc0NS4uMWNkNWMyNiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvVmlld0ZsaXBwZXJUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvVmlld0ZsaXBwZXJUZXN0LmphdmEKQEAgLTI0LDE4ICsyNCwxOSBAQAogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwogaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTGFyZ2VUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlZpZXdGbGlwcGVyOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5MYXJnZVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydWxlLkFjdGl2aXR5VGVzdFJ1bGU7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9WaWV3U3dpdGNoZXJUZXN0LmphdmEgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9WaWV3U3dpdGNoZXJUZXN0LmphdmEKaW5kZXggOTA4OGJhMC4uYmZiNmFmZCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvVmlld1N3aXRjaGVyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1ZpZXdTd2l0Y2hlclRlc3QuamF2YQpAQCAtMjMsOSArMjMsNiBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5YbWw7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CkBAIC0zNCw2ICszMSwxMCBAQAogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlZpZXdTd2l0Y2hlcjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5WaWV3U3dpdGNoZXIuVmlld0ZhY3Rvcnk7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvWm9vbUJ1dHRvblRlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1pvb21CdXR0b25UZXN0LmphdmEKaW5kZXggODRlYmExOC4uNTRkN2MyMiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvWm9vbUJ1dHRvblRlc3QuamF2YQorKysgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9ab29tQnV0dG9uVGVzdC5qYXZhCkBAIC0yMiwxMiArMjIsNiBAQAogCiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CiBpbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuTGFyZ2VUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bGUuQWN0aXZpdHlUZXN0UnVsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5YbWw7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CkBAIC0zNSw2ICsyOSwxMyBAQAogaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0Llpvb21CdXR0b247CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0Lkluc3RydW1lbnRhdGlvblJlZ2lzdHJ5OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLkxhcmdlVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVsZS5BY3Rpdml0eVRlc3RSdWxlOworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkN0c1RvdWNoVXRpbHM7CiAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwpAQCAtNDMsMTAgKzQ0LDYgQEAKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiBpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCiBAU21hbGxUZXN0CiBAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQogcHVibGljIGNsYXNzIFpvb21CdXR0b25UZXN0IHsKQEAgLTEyNyw4NyArMTI0LDYyIEBACiAgICAgICAgIGFzc2VydEZhbHNlKG1ab29tQnV0dG9uLmRpc3BhdGNoVW5oYW5kbGVkTW92ZShudWxsLCBWaWV3LkZPQ1VTX0RPV04pKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgdmVyaWZ5Wm9vbVNwZWVkKFpvb21DbGlja0xpc3RlbmVyIHpvb21DbGlja0xpc3RlbmVyLCBsb25nIHpvb21TcGVlZE1zKSB7Ci0gICAgICAgIG1ab29tQnV0dG9uLnNldFpvb21TcGVlZCh6b29tU3BlZWRNcyk7Ci0KLSAgICAgICAgZmluYWwgbG9uZyBzdGFydFRpbWUgPSBTeXN0ZW0ubmFub1RpbWUoKTsKLSAgICAgICAgLy8gRW11bGF0ZSBsb25nIGNsaWNrIHRoYXQgImxhc3RzIiBmb3IgdGVuIHNlY29uZHMKLSAgICAgICAgQ3RzVG91Y2hVdGlscy5lbXVsYXRlTG9uZ1ByZXNzT25WaWV3Q2VudGVyKG1JbnN0cnVtZW50YXRpb24sIG1ab29tQnV0dG9uLCAxMDAwMCk7Ci0KLSAgICAgICAgZmluYWwgTGlzdDxMb25nPiBjYWxsYmFja0ludm9jYXRpb25zID0gem9vbUNsaWNrTGlzdGVuZXIuZ2V0Q2xpY2tUaW1lcygpOwotICAgICAgICBhc3NlcnRGYWxzZSgiRXhwZWN0aW5nIGF0IGxlYXN0IG9uZSBjYWxsYmFjayIsIGNhbGxiYWNrSW52b2NhdGlvbnMuaXNFbXB0eSgpKTsKLQotICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgZmlyc3QgY2FsbGJhY2sgaXMgZmlyZWQgYWZ0ZXIgdGhlIHN5c3RlbS1sZXZlbCBsb25nIHByZXNzIHRpbWVvdXQuCi0gICAgICAgIGZpbmFsIGxvbmcgbWluVGltZVVudGlsRmlyc3RJbnZvY2F0aW9uTXMgPSBWaWV3Q29uZmlndXJhdGlvbi5nZXRMb25nUHJlc3NUaW1lb3V0KCk7Ci0gICAgICAgIGZpbmFsIGxvbmcgYWN0dWFsVGltZVVudGlsRmlyc3RJbnZvY2F0aW9uTnMgPSBjYWxsYmFja0ludm9jYXRpb25zLmdldCgwKSAtIHN0YXJ0VGltZTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRmlyc3QgY2FsbGJhY2sgbm90IGR1cmluZyBsb25nIHByZXNzIHRpbWVvdXQgd2FzICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsVGltZVVudGlsRmlyc3RJbnZvY2F0aW9uTnMgLyBOQU5PU19JTl9NSUxMSSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiIHdoaWxlIGxvbmcgcHJlc3MgdGltZW91dCBpcyAiICsgbWluVGltZVVudGlsRmlyc3RJbnZvY2F0aW9uTXMsCi0gICAgICAgICAgICAgICAgKGNhbGxiYWNrSW52b2NhdGlvbnMuZ2V0KDApIC0gc3RhcnRUaW1lKSA+Ci0gICAgICAgICAgICAgICAgICAgICAgICBtaW5UaW1lVW50aWxGaXJzdEludm9jYXRpb25NcyAqIE5BTk9TX0lOX01JTExJKTsKLQotICAgICAgICAvLyBWZXJpZnkgdGhhdCBzdWJzZXF1ZW50IGNhbGxiYWNrcyBhcmUgYXQgbGVhc3Qgem9vbS1zcGVlZCBtaWxsaXNlY29uZHMgYXBhcnQuIE5vdGUgdGhhdAotICAgICAgICAvLyB3ZSBkbyBub3QgaGF2ZSBhbnkgaGFyZCBndWFyYW50ZWUgYWJvdXQgdGhlIG1heCBsaW1pdCBvbiB0aGUgdGltZSBiZXR3ZWVuIHN1Y2Nlc3NpdmUKLSAgICAgICAgLy8gY2FsbGJhY2tzLgotICAgICAgICBmaW5hbCBsb25nIG1pblRpbWVCZXR3ZWVuSW52b2NhdGlvbnNOcyA9IHpvb21TcGVlZE1zICogTkFOT1NfSU5fTUlMTEk7Ci0gICAgICAgIGlmIChjYWxsYmFja0ludm9jYXRpb25zLnNpemUoKSA+IDEpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FsbGJhY2tJbnZvY2F0aW9ucy5zaXplKCkgLSAxOyBpKyspIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGFjdHVhbFRpbWVCZXR3ZWVuSW52b2NhdGlvbnNOcyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoY2FsbGJhY2tJbnZvY2F0aW9ucy5nZXQoaSArIDEpIC0gY2FsbGJhY2tJbnZvY2F0aW9ucy5nZXQoaSkpICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkFOT1NfSU5fTUlMTEk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQ2FsbGJhY2sgIiArIChpICsgMSkgKyAiIGhhcHBlbmVkICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxUaW1lQmV0d2Vlbkludm9jYXRpb25zTnMgLyBOQU5PU19JTl9NSUxMSSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgYWZ0ZXIgdGhlIHByZXZpb3VzIG9uZSwgd2hpbGUgem9vbSBzcGVlZCBpcyAiICsgem9vbVNwZWVkTXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxUaW1lQmV0d2Vlbkludm9jYXRpb25zTnMgPiBtaW5UaW1lQmV0d2Vlbkludm9jYXRpb25zTnMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQExhcmdlVGVzdAotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE9uTG9uZ0NsaWNrKCkgewotICAgICAgICAvLyBTaW5jZSBNb2NraXRvIGRvZXNuJ3QgaGF2ZSB1dGlsaXRpZXMgdG8gdHJhY2sgdGhlIHRpbWVzdGFtcHMgb2YgbWV0aG9kIGludm9jYXRpb25zLAotICAgICAgICAvLyB3ZSdyZSB1c2luZyBvdXIgb3duIGN1c3RvbSBjbGljayBsaXN0ZW5lciBmb3IgdGhhdC4gV2Ugd2FudCB0byB2ZXJpZnkgdGhhdCB0aGUKLSAgICAgICAgLy8gZmlyc3QgbGlzdGVuZXIgaW52b2NhdGlvbiB3YXMgYWZ0ZXIgbG9uZyBwcmVzcyB0aW1lb3V0LCBhbmQgdGhlIHJlc3Qgd2VyZSBzcGFjZWQKLSAgICAgICAgLy8gYnkgYXQgbGVhc3Qgb3VyIHpvb20gc3BlZWQgbWlsbGlzZWNvbmRzCi0KLSAgICAgICAgbVpvb21CdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgWm9vbUNsaWNrTGlzdGVuZXIgem9vbUNsaWNrTGlzdGVuZXIgPSBuZXcgWm9vbUNsaWNrTGlzdGVuZXIoKTsKLSAgICAgICAgbVpvb21CdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKHpvb21DbGlja0xpc3RlbmVyKTsKLQotICAgICAgICB2ZXJpZnlab29tU3BlZWQoem9vbUNsaWNrTGlzdGVuZXIsIDIwMDApOwotICAgIH0KLQogICAgIEBMYXJnZVRlc3QKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRab29tU3BlZWQoKSB7Ci0gICAgICAgIGZpbmFsIGxvbmdbXSB6b29tU3BlZWRzID0geyAxMDAsIC0xLCA1MDAwLCAxMDAwLCAyNTAwIH07CisgICAgICAgIGZpbmFsIGxvbmdbXSB6b29tU3BlZWRzID0geyAwLCAxMDAgfTsKICAgICAgICAgbVpvb21CdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKICAgICAgICAgWm9vbUNsaWNrTGlzdGVuZXIgem9vbUNsaWNrTGlzdGVuZXIgPSBuZXcgWm9vbUNsaWNrTGlzdGVuZXIoKTsKICAgICAgICAgbVpvb21CdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKHpvb21DbGlja0xpc3RlbmVyKTsKIAogICAgICAgICBmb3IgKGxvbmcgem9vbVNwZWVkIDogem9vbVNwZWVkcykgewotICAgICAgICAgICAgLy8gUmVzZXQgdGhlIHRyYWNrZXIgbGlzdCBvZiBvdXIgbGlzdGVuZXIsIGJ1dCBjb250aW51ZSB1c2luZyBpdCBmb3IgdGVzdGluZworICAgICAgICAgICAgLy8gUmVzZXQgdGhlIHRyYWNraW5nIHN0YXRlIG9mIG91ciBsaXN0ZW5lciwgYnV0IGNvbnRpbnVlIHVzaW5nIGl0IGZvciB0ZXN0aW5nCiAgICAgICAgICAgICAvLyB2YXJpb3VzIHpvb20gc3BlZWRzIG9uIHRoZSBzYW1lIFpvb21CdXR0b24KICAgICAgICAgICAgIHpvb21DbGlja0xpc3RlbmVyLnJlc2V0KCk7Ci0gICAgICAgICAgICB2ZXJpZnlab29tU3BlZWQoem9vbUNsaWNrTGlzdGVuZXIsIHpvb21TcGVlZCk7CisKKyAgICAgICAgICAgIG1ab29tQnV0dG9uLnNldFpvb21TcGVlZCh6b29tU3BlZWQpOworCisgICAgICAgICAgICBmaW5hbCBsb25nIHN0YXJ0VGltZSA9IFN5c3RlbS5uYW5vVGltZSgpOworICAgICAgICAgICAgLy8gRW11bGF0ZSBsb25nIGNsaWNrCisgICAgICAgICAgICBsb25nIGxvbmdQcmVzc1dhaXQgPSBWaWV3Q29uZmlndXJhdGlvbi5nZXRMb25nUHJlc3NUaW1lb3V0KCkKKyAgICAgICAgICAgICAgICAgICAgKyB6b29tU3BlZWQgKyAxMDA7CisgICAgICAgICAgICBDdHNUb3VjaFV0aWxzLmVtdWxhdGVMb25nUHJlc3NPblZpZXdDZW50ZXIobUluc3RydW1lbnRhdGlvbiwgbVpvb21CdXR0b24sCisgICAgICAgICAgICAgICAgICAgIGxvbmdQcmVzc1dhaXQpOworCisgICAgICAgICAgICBmaW5hbCBMb25nIGNhbGxiYWNrRmlyc3RJbnZvY2F0aW9uVGltZSA9IHpvb21DbGlja0xpc3RlbmVyLmdldFRpbWVPZkZpcnN0Q2xpY2soKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIkV4cGVjdGluZyBhdCBsZWFzdCBvbmUgY2FsbGJhY2siLCBjYWxsYmFja0ZpcnN0SW52b2NhdGlvblRpbWUpOworCisgICAgICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgZmlyc3QgY2FsbGJhY2sgaXMgZmlyZWQgYWZ0ZXIgdGhlIHN5c3RlbS1sZXZlbCBsb25nIHByZXNzIHRpbWVvdXQuCisgICAgICAgICAgICBmaW5hbCBsb25nIG1pblRpbWVVbnRpbEZpcnN0SW52b2NhdGlvbk1zID0gVmlld0NvbmZpZ3VyYXRpb24uZ2V0TG9uZ1ByZXNzVGltZW91dCgpOworICAgICAgICAgICAgZmluYWwgbG9uZyBhY3R1YWxUaW1lVW50aWxGaXJzdEludm9jYXRpb25OcyA9IGNhbGxiYWNrRmlyc3RJbnZvY2F0aW9uVGltZSAtIHN0YXJ0VGltZTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkZpcnN0IGNhbGxiYWNrIG5vdCBkdXJpbmcgbG9uZyBwcmVzcyB0aW1lb3V0IHdhcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBhY3R1YWxUaW1lVW50aWxGaXJzdEludm9jYXRpb25OcyAvIE5BTk9TX0lOX01JTExJCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHdoaWxlIGxvbmcgcHJlc3MgdGltZW91dCBpcyAiICsgbWluVGltZVVudGlsRmlyc3RJbnZvY2F0aW9uTXMsCisgICAgICAgICAgICAgICAgICAgIChjYWxsYmFja0ZpcnN0SW52b2NhdGlvblRpbWUgLSBzdGFydFRpbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPiBtaW5UaW1lVW50aWxGaXJzdEludm9jYXRpb25NcyAqIE5BTk9TX0lOX01JTExJKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkZpcnN0IGNhbGxiYWNrIHNob3VsZCBoYXZlIGhhcHBlbmVkIHNvb25lciB0aGFuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGFjdHVhbFRpbWVVbnRpbEZpcnN0SW52b2NhdGlvbk5zIC8gTkFOT1NfSU5fTUlMTEksCisgICAgICAgICAgICAgICAgICAgIChjYWxsYmFja0ZpcnN0SW52b2NhdGlvblRpbWUgLSBzdGFydFRpbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD0gKG1pblRpbWVVbnRpbEZpcnN0SW52b2NhdGlvbk1zICsgMTAwKSAqIE5BTk9TX0lOX01JTExJKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFpvb21DbGlja0xpc3RlbmVyIGltcGxlbWVudHMgVmlldy5PbkNsaWNrTGlzdGVuZXIgewotICAgICAgICBwcml2YXRlIExpc3Q8TG9uZz4gbUNsaWNrVGltZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgcHJpdmF0ZSBMb25nIG1UaW1lT2ZGaXJzdENsaWNrID0gbnVsbDsKIAogICAgICAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKLSAgICAgICAgICAgIG1DbGlja1RpbWVzLmNsZWFyKCk7CisgICAgICAgICAgICBtVGltZU9mRmlyc3RDbGljayA9IG51bGw7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgTGlzdDxMb25nPiBnZXRDbGlja1RpbWVzKCkgewotICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QobUNsaWNrVGltZXMpOworICAgICAgICBwdWJsaWMgTG9uZyBnZXRUaW1lT2ZGaXJzdENsaWNrKCkgeworICAgICAgICAgICAgcmV0dXJuIG1UaW1lT2ZGaXJzdENsaWNrOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIC8vIEFkZCB0aGUgY3VycmVudCBzeXN0ZW0gdGltZSB0byB0aGUgdHJhY2tlciBsaXN0Ci0gICAgICAgICAgICBtQ2xpY2tUaW1lcy5hZGQoU3lzdGVtLm5hbm9UaW1lKCkpOworICAgICAgICAgICAgaWYgKG1UaW1lT2ZGaXJzdENsaWNrID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBNYXJrIHRoZSBjdXJyZW50IHN5c3RlbSB0aW1lIGFzIHRoZSB0aW1lIG9mIGZpcnN0IGNsaWNrCisgICAgICAgICAgICAgICAgbVRpbWVPZkZpcnN0Q2xpY2sgPSBTeXN0ZW0ubmFub1RpbWUoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1pvb21Db250cm9sc1Rlc3QuamF2YSBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL1pvb21Db250cm9sc1Rlc3QuamF2YQppbmRleCBhYjBmOTQwLi41OGYyNDE2IDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy9ab29tQ29udHJvbHNUZXN0LmphdmEKKysrIGIvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvWm9vbUNvbnRyb2xzVGVzdC5qYXZhCkBAIC0yMSwxMyArMjEsMTQgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuYW5ub3RhdGlvbi5VaVRocmVhZFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuWm9vbUNvbnRyb2xzOwogCitpbXBvcnQgYW5kcm9pZHgudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmFubm90YXRpb24uVWlUaHJlYWRUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvdXRpbC9MaXN0U2NlbmFyaW8uamF2YSBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL3V0aWwvTGlzdFNjZW5hcmlvLmphdmEKaW5kZXggYzRkNDE5OS4uMWQ2M2M0MCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvdXRpbC9MaXN0U2NlbmFyaW8uamF2YQorKysgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy91dGlsL0xpc3RTY2VuYXJpby5qYXZhCkBAIC0xNiwxMyArMTYsNiBAQAogCiBwYWNrYWdlIGFuZHJvaWQud2lkZ2V0LmN0cy51dGlsOwogCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CkBAIC0zNiw2ICsyOSwxMyBAQAogaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwogCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKIC8qKgogICogVXRpbGl0eSBiYXNlIGNsYXNzIGZvciBjcmVhdGluZyB2YXJpb3VzIExpc3Qgc2NlbmFyaW9zLiAgQ29uZmlndXJhYmxlIGJ5IHRoZSBudW1iZXIKICAqIG9mIGl0ZW1zLCBob3cgdGFsbCBlYWNoIGl0ZW0gc2hvdWxkIGJlIChpbiByZWxhdGlvbiB0byB0aGUgc2NyZWVuIGhlaWdodCksIGFuZApAQCAtMzkwLDYgKzM5MCw3IEBACiAgICAgICAgICAgICBtTGluZWFyTGF5b3V0LmFkZFZpZXcobUxpc3RWaWV3KTsKICAgICAgICAgICAgIHNldENvbnRlbnRWaWV3KG1MaW5lYXJMYXlvdXQpOwogICAgICAgICB9CisgICAgICAgIG1MaW5lYXJMYXlvdXQucmVzdG9yZURlZmF1bHRGb2N1cygpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvdXRpbC9UZXN0VXRpbHMuamF2YSBiL3Rlc3RzL3Rlc3RzL3dpZGdldC9zcmMvYW5kcm9pZC93aWRnZXQvY3RzL3V0aWwvVGVzdFV0aWxzLmphdmEKaW5kZXggYWZhOGY3YS4uZTk5NThiZCAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvd2lkZ2V0L3NyYy9hbmRyb2lkL3dpZGdldC9jdHMvdXRpbC9UZXN0VXRpbHMuamF2YQorKysgYi90ZXN0cy90ZXN0cy93aWRnZXQvc3JjL2FuZHJvaWQvd2lkZ2V0L2N0cy91dGlsL1Rlc3RVdGlscy5qYXZhCkBAIC0xOSw5ICsxOSw2IEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uaGFtY3Jlc3QuTW9ja2l0b0hhbWNyZXN0LmFyZ1RoYXQ7CiAKLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uQ29sb3JJbnQ7Ci1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLkRyYXdhYmxlUmVzOwotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29sb3JTdGF0ZUxpc3Q7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CkBAIC0zMCw2ICsyNyw5IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQml0bWFwRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLkNvbG9ySW50OworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uRHJhd2FibGVSZXM7CitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5Ob25OdWxsOwogaW1wb3J0IGFuZHJvaWQudXRpbC5QYWlyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VCb29sZWFuQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy93cmFwL25vd3JhcC9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvd3JhcC9ub3dyYXAvQW5kcm9pZC5tawppbmRleCA4ZjcwYzJhLi41MGJiMzEyIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy93cmFwL25vd3JhcC9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3Rlc3RzL3dyYXAvbm93cmFwL0FuZHJvaWQubWsKQEAgLTIyLDkgKzIyLDkgQEAKIExPQ0FMX0RFWF9QUkVPUFQgOj0gZmFsc2UKIExPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCi0JY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbCBcCi0JYW5kcm9pZC1zdXBwb3J0LXRlc3QgXAotCWxlZ2FjeS1hbmRyb2lkLXRlc3QKKwljb21wYXRpYmlsaXR5LWRldmljZS11dGlsLWF4dCBcCisJYW5kcm9pZHgudGVzdC5ydWxlcworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lci5zdHVicyBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicwogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgLi4vc3JjKQogTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKIExPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKQEAgLTMyLDQgKzMyLDcgQEAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNXcmFwTm9XcmFwVGVzdENhc2VzCiBMT0NBTF9NQU5JRkVTVF9GSUxFIDo9IEFuZHJvaWRNYW5pZmVzdC54bWwKIAorIyBKYXJqYXIgdG8gbWFrZSBXcmFwVGVzdCB1bmlxdWUuCitMT0NBTF9KQVJKQVJfUlVMRVMgOj0gJChMT0NBTF9QQVRIKS9qYXJqYXItcnVsZXMudHh0CisKIGluY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd3JhcC9ub3dyYXAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL3dyYXAvbm93cmFwL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggNjE0NTM5MC4uMDRkNjI2MSAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvd3JhcC9ub3dyYXAvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy93cmFwL25vd3JhcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0zMSw3ICszMSw3IEBACiAKICAgICA8IS0tICBzZWxmLWluc3RydW1lbnRpbmcgdGVzdCBwYWNrYWdlLiAtLT4KICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBmb3Igd3JhcC5zaCIKICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLndyYXAubm93cmFwLmN0cyIgPgogICAgIDwvaW5zdHJ1bWVudGF0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd3JhcC9ub3dyYXAvQW5kcm9pZFRlc3QueG1sIGIvdGVzdHMvdGVzdHMvd3JhcC9ub3dyYXAvQW5kcm9pZFRlc3QueG1sCmluZGV4IDFjYTIzNjkuLmI4MGQ0ZWUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3dyYXAvbm93cmFwL0FuZHJvaWRUZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy93cmFwL25vd3JhcC9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBObyBXcmFwIHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJhcnQiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJub3Qtc2hhcmRhYmxlIiB2YWx1ZT0idHJ1ZSIgLz4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dyYXAvbm93cmFwL2phcmphci1ydWxlcy50eHQgYi90ZXN0cy90ZXN0cy93cmFwL25vd3JhcC9qYXJqYXItcnVsZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZTc0NTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy93cmFwL25vd3JhcC9qYXJqYXItcnVsZXMudHh0CkBAIC0wLDAgKzEgQEAKK3J1bGUgYW5kcm9pZC53cmFwLmN0cy5XcmFwVGVzdCoqIGFuZHJvaWQud3JhcC5jdHMuV3JhcFRlc3ROb1dyYXBAMQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd3JhcC93cmFwX2RlYnVnL0FuZHJvaWQubWsgYi90ZXN0cy90ZXN0cy93cmFwL3dyYXBfZGVidWcvQW5kcm9pZC5tawppbmRleCA3Mjk5ZjAyLi5mYmQ0YjhlIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy93cmFwL3dyYXBfZGVidWcvQW5kcm9pZC5taworKysgYi90ZXN0cy90ZXN0cy93cmFwL3dyYXBfZGVidWcvQW5kcm9pZC5tawpAQCAtMjIsOSArMjIsOSBAQAogTE9DQUxfREVYX1BSRU9QVCA6PSBmYWxzZQogTE9DQUxfUFJPR1VBUkRfRU5BQkxFRCA6PSBkaXNhYmxlZAogTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKLQljb21wYXRpYmlsaXR5LWRldmljZS11dGlsIFwKLQlhbmRyb2lkLXN1cHBvcnQtdGVzdCBcCi0JbGVnYWN5LWFuZHJvaWQtdGVzdAorCWNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0IFwKKwlhbmRyb2lkeC50ZXN0LnJ1bGVzCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzIGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCAuLi9zcmMpCiBMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cwogTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudApAQCAtMzksNiArMzksOSBAQAogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEN0c1dyYXBXcmFwRGVidWdUZXN0Q2FzZXMKIExPQ0FMX01BTklGRVNUX0ZJTEUgOj0gQW5kcm9pZE1hbmlmZXN0LnhtbAogCisjIEphcmphciB0byBtYWtlIFdyYXBUZXN0IHVuaXF1ZS4KK0xPQ0FMX0pBUkpBUl9SVUxFUyA6PSAkKExPQ0FMX1BBVEgpL2phcmphci1ydWxlcy50eHQKKwogaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCiAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd3JhcC93cmFwX2RlYnVnL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy90ZXN0cy93cmFwL3dyYXBfZGVidWcvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBmMzcxMTA4Li45OWVmZjQzIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy93cmFwL3dyYXBfZGVidWcvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy90ZXN0cy93cmFwL3dyYXBfZGVidWcvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMzEsNyArMzEsNyBAQAogCiAgICAgPCEtLSAgc2VsZi1pbnN0cnVtZW50aW5nIHRlc3QgcGFja2FnZS4gLS0+CiAgICAgPGluc3RydW1lbnRhdGlvbgotICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgdGVzdHMgZm9yIHdyYXAuc2giCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC53cmFwLndyYXBfZGVidWcuY3RzIiA+CiAgICAgPC9pbnN0cnVtZW50YXRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy93cmFwL3dyYXBfZGVidWcvQW5kcm9pZFRlc3QueG1sIGIvdGVzdHMvdGVzdHMvd3JhcC93cmFwX2RlYnVnL0FuZHJvaWRUZXN0LnhtbAppbmRleCBiMzQ2OGJmLi4yYjljYmUxIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy93cmFwL3dyYXBfZGVidWcvQW5kcm9pZFRlc3QueG1sCisrKyBiL3Rlc3RzL3Rlc3RzL3dyYXAvd3JhcF9kZWJ1Zy9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBEZWJ1ZyBXcmFwIHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJhcnQiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJub3Qtc2hhcmRhYmxlIiB2YWx1ZT0idHJ1ZSIgLz4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dyYXAvd3JhcF9kZWJ1Zy9qYXJqYXItcnVsZXMudHh0IGIvdGVzdHMvdGVzdHMvd3JhcC93cmFwX2RlYnVnL2phcmphci1ydWxlcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAyMDkzNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzL3dyYXAvd3JhcF9kZWJ1Zy9qYXJqYXItcnVsZXMudHh0CkBAIC0wLDAgKzEgQEAKK3J1bGUgYW5kcm9pZC53cmFwLmN0cy5XcmFwVGVzdCoqIGFuZHJvaWQud3JhcC5jdHMuV3JhcFRlc3RXcmFwRGVidWdAMQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd3JhcC93cmFwX2RlYnVnX21hbGxvY19kZWJ1Zy9BbmRyb2lkLm1rIGIvdGVzdHMvdGVzdHMvd3JhcC93cmFwX2RlYnVnX21hbGxvY19kZWJ1Zy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNmM3YmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy93cmFwL3dyYXBfZGVidWdfbWFsbG9jX2RlYnVnL0FuZHJvaWQubWsKQEAgLTAsMCArMSw0NyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTVVMVElMSUIgOj0gYm90aAorTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKK0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBX0FQUFMpCitMT0NBTF9ERVhfUFJFT1BUIDo9IGZhbHNlCitMT0NBTF9QUk9HVUFSRF9FTkFCTEVEIDo9IGRpc2FibGVkCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAorCWNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0IFwKKwlhbmRyb2lkeC50ZXN0LnJ1bGVzCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzIGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCAuLi9zcmMpCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorCitMT0NBTF9QUkVCVUlMVF9KTklfTElCU19hcm0gOj0gd3JhcC5zaAorTE9DQUxfUFJFQlVJTFRfSk5JX0xJQlNfYXJtNjQgOj0gd3JhcC5zaAorTE9DQUxfUFJFQlVJTFRfSk5JX0xJQlNfbWlwcyA6PSB3cmFwLnNoCitMT0NBTF9QUkVCVUlMVF9KTklfTElCU19taXBzNjQgOj0gd3JhcC5zaAorTE9DQUxfUFJFQlVJTFRfSk5JX0xJQlNfeDg2IDo9IHdyYXAuc2gKK0xPQ0FMX1BSRUJVSUxUX0pOSV9MSUJTX3g4Nl82NCA6PSB3cmFwLnNoCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNXcmFwV3JhcERlYnVnTWFsbG9jRGVidWdUZXN0Q2FzZXMKK0xPQ0FMX01BTklGRVNUX0ZJTEUgOj0gQW5kcm9pZE1hbmlmZXN0LnhtbAorCisjIEphcmphciB0byBtYWtlIFdyYXBUZXN0IHVuaXF1ZS4KK0xPQ0FMX0pBUkpBUl9SVUxFUyA6PSAkKExPQ0FMX1BBVEgpL2phcmphci1ydWxlcy50eHQKKworaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd3JhcC93cmFwX2RlYnVnX21hbGxvY19kZWJ1Zy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdGVzdHMvd3JhcC93cmFwX2RlYnVnX21hbGxvY19kZWJ1Zy9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3YzE4NDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy93cmFwL3dyYXBfZGVidWdfbWFsbG9jX2RlYnVnL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwzOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImFuZHJvaWQud3JhcC53cmFwX2RlYnVnX21hbGxvY19kZWJ1Zy5jdHMiPgorCisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6ZGVidWdnYWJsZT0idHJ1ZSI+CisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgorICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC53cmFwLmN0cy5leHBleHRfZW52IiBhbmRyb2lkOnZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLndyYXAuV3JhcEFjdGl2aXR5IiA+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgPC9hcHBsaWNhdGlvbj4KKworICAgIDwhLS0gIHNlbGYtaW5zdHJ1bWVudGluZyB0ZXN0IHBhY2thZ2UuIC0tPgorICAgIDxpbnN0cnVtZW50YXRpb24KKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBmb3Igd3JhcC5zaCIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLndyYXAud3JhcF9kZWJ1Z19tYWxsb2NfZGVidWcuY3RzIiA+CisgICAgPC9pbnN0cnVtZW50YXRpb24+Cis8L21hbmlmZXN0PgorCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy93cmFwL3dyYXBfZGVidWdfbWFsbG9jX2RlYnVnL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL3dyYXAvd3JhcF9kZWJ1Z19tYWxsb2NfZGVidWcvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmYWZmNjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy93cmFwL3dyYXBfZGVidWdfbWFsbG9jX2RlYnVnL0FuZHJvaWRUZXN0LnhtbApAQCAtMCwwICsxLDI3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIERlYnVnIFdyYXAgKE1hbGxvYyBEZWJ1ZykgdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KKyAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImFydCIgLz4KKyAgICA8b3B0aW9uIG5hbWU9Im5vdC1zaGFyZGFibGUiIHZhbHVlPSJ0cnVlIiAvPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJDdHNXcmFwV3JhcERlYnVnTWFsbG9jRGVidWdUZXN0Q2FzZXMuYXBrIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5BbmRyb2lkSlVuaXRUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0icGFja2FnZSIgdmFsdWU9ImFuZHJvaWQud3JhcC53cmFwX2RlYnVnX21hbGxvY19kZWJ1Zy5jdHMiIC8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd3JhcC93cmFwX2RlYnVnX21hbGxvY19kZWJ1Zy9qYXJqYXItcnVsZXMudHh0IGIvdGVzdHMvdGVzdHMvd3JhcC93cmFwX2RlYnVnX21hbGxvY19kZWJ1Zy9qYXJqYXItcnVsZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NjAyOWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy93cmFwL3dyYXBfZGVidWdfbWFsbG9jX2RlYnVnL2phcmphci1ydWxlcy50eHQKQEAgLTAsMCArMSBAQAorcnVsZSBhbmRyb2lkLndyYXAuY3RzLldyYXBUZXN0KiogYW5kcm9pZC53cmFwLmN0cy5XcmFwVGVzdERlYnVnTWFsbG9jQDEKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dyYXAvd3JhcF9kZWJ1Z19tYWxsb2NfZGVidWcvd3JhcC5zaCBiL3Rlc3RzL3Rlc3RzL3dyYXAvd3JhcF9kZWJ1Z19tYWxsb2NfZGVidWcvd3JhcC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mMDBhNTU0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvd3JhcC93cmFwX2RlYnVnX21hbGxvY19kZWJ1Zy93cmFwLnNoCkBAIC0wLDAgKzEsMTUgQEAKKyMhL3N5c3RlbS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCitMSUJDX0RFQlVHX01BTExPQ19PUFRJT05TPWJhY2t0cmFjZT0xIFdSQVBfUFJPUEVSVFk9dGVzdCAkQApkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMvd3JhcC93cmFwX25vZGVidWcvQW5kcm9pZC5tayBiL3Rlc3RzL3Rlc3RzL3dyYXAvd3JhcF9ub2RlYnVnL0FuZHJvaWQubWsKaW5kZXggZTRhOGM1MS4uMTUwODFiNyAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdHMvd3JhcC93cmFwX25vZGVidWcvQW5kcm9pZC5taworKysgYi90ZXN0cy90ZXN0cy93cmFwL3dyYXBfbm9kZWJ1Zy9BbmRyb2lkLm1rCkBAIC0yMiw5ICsyMiw5IEBACiBMT0NBTF9ERVhfUFJFT1BUIDo9IGZhbHNlCiBMT0NBTF9QUk9HVUFSRF9FTkFCTEVEIDo9IGRpc2FibGVkCiBMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAotCWNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwgXAotCWFuZHJvaWQtc3VwcG9ydC10ZXN0IFwKLQlsZWdhY3ktYW5kcm9pZC10ZXN0CisJY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgXAorCWFuZHJvaWR4LnRlc3QucnVsZXMKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIuc3R1YnMgYW5kcm9pZC50ZXN0LmJhc2Uuc3R1YnMKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIC4uL3NyYykKIExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCiBMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CkBAIC0zOSw2ICszOSw5IEBACiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ3RzV3JhcFdyYXBOb0RlYnVnVGVzdENhc2VzCiBMT0NBTF9NQU5JRkVTVF9GSUxFIDo9IEFuZHJvaWRNYW5pZmVzdC54bWwKIAorIyBKYXJqYXIgdG8gbWFrZSBXcmFwVGVzdCB1bmlxdWUuCitMT0NBTF9KQVJKQVJfUlVMRVMgOj0gJChMT0NBTF9QQVRIKS9qYXJqYXItcnVsZXMudHh0CisKIGluY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQogCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dyYXAvd3JhcF9ub2RlYnVnL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy90ZXN0cy93cmFwL3dyYXBfbm9kZWJ1Zy9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDEyN2U2YTguLjYwYTI4ODggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3RzL3dyYXAvd3JhcF9ub2RlYnVnL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvd3JhcC93cmFwX25vZGVidWcvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMzEsNyArMzEsNyBAQAogCiAgICAgPCEtLSAgc2VsZi1pbnN0cnVtZW50aW5nIHRlc3QgcGFja2FnZS4gLS0+CiAgICAgPGluc3RydW1lbnRhdGlvbgotICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgdGVzdHMgZm9yIHdyYXAuc2giCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC53cmFwLndyYXBfbm9kZWJ1Zy5jdHMiID4KICAgICA8L2luc3RydW1lbnRhdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzL3dyYXAvd3JhcF9ub2RlYnVnL0FuZHJvaWRUZXN0LnhtbCBiL3Rlc3RzL3Rlc3RzL3dyYXAvd3JhcF9ub2RlYnVnL0FuZHJvaWRUZXN0LnhtbAppbmRleCBiN2E2YTExLi5kYzU0N2NmIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0cy93cmFwL3dyYXBfbm9kZWJ1Zy9BbmRyb2lkVGVzdC54bWwKKysrIGIvdGVzdHMvdGVzdHMvd3JhcC93cmFwX25vZGVidWcvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgV3JhcCB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iYXJ0IiAvPgogICAgIDxvcHRpb24gbmFtZT0ibm90LXNoYXJkYWJsZSIgdmFsdWU9InRydWUiIC8+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cy93cmFwL3dyYXBfbm9kZWJ1Zy9qYXJqYXItcnVsZXMudHh0IGIvdGVzdHMvdGVzdHMvd3JhcC93cmFwX25vZGVidWcvamFyamFyLXJ1bGVzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWE0M2YxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHMvd3JhcC93cmFwX25vZGVidWcvamFyamFyLXJ1bGVzLnR4dApAQCAtMCwwICsxIEBACitydWxlIGFuZHJvaWQud3JhcC5jdHMuV3JhcFRlc3QqKiBhbmRyb2lkLndyYXAuY3RzLldyYXBUZXN0V3JhcE5vRGVidWdAMQpkaWZmIC0tZ2l0IGEvdGVzdHMvdHZwcm92aWRlci9BbmRyb2lkLm1rIGIvdGVzdHMvdHZwcm92aWRlci9BbmRyb2lkLm1rCmluZGV4IDRhMTM5MDkuLmNjY2YyYzEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3R2cHJvdmlkZXIvQW5kcm9pZC5taworKysgYi90ZXN0cy90dnByb3ZpZGVyL0FuZHJvaWQubWsKQEAgLTE4LDcgKzE4LDkgQEAKICMgZG9uJ3QgaW5jbHVkZSB0aGlzIHBhY2thZ2UgaW4gYW55IHRhcmdldAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwgY3RzdGVzdHJ1bm5lcgorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0IGN0c3Rlc3RydW5uZXItYXh0CisKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIuc3R1YnMgYW5kcm9pZC50ZXN0LmJhc2Uuc3R1YnMKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogCmRpZmYgLS1naXQgYS90ZXN0cy90dnByb3ZpZGVyL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy90dnByb3ZpZGVyL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggNDA3MTRhNi4uM2VkNzY3OCAxMDA2NDQKLS0tIGEvdGVzdHMvdHZwcm92aWRlci9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL3R2cHJvdmlkZXIvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjUsNyArMjUsNyBAQAogICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KICAgICA8L2FwcGxpY2F0aW9uPgogCi0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC50dnByb3ZpZGVyLmN0cyIKICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyB0ZXN0cyBmb3IgVFYgUHJvdmlkZXIiIC8+CiA8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvdHZwcm92aWRlci9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy90dnByb3ZpZGVyL0FuZHJvaWRUZXN0LnhtbAppbmRleCA5MzY1Y2JkLi5jNjJjZWM4IDEwMDY0NAotLS0gYS90ZXN0cy90dnByb3ZpZGVyL0FuZHJvaWRUZXN0LnhtbAorKysgYi90ZXN0cy90dnByb3ZpZGVyL0FuZHJvaWRUZXN0LnhtbApAQCAtMTQsNiArMTQsNyBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIFRWIFByb3ZpZGVyIHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJ0diIgLz4KICAgICA8b3B0aW9uIG5hbWU9Im5vdC1zaGFyZGFibGUiIHZhbHVlPSJ0cnVlIiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdHZwcm92aWRlci9zcmMvYW5kcm9pZC90dnByb3ZpZGVyL2N0cy9UdlByb3ZpZGVyUGVyZlRlc3QuamF2YSBiL3Rlc3RzL3R2cHJvdmlkZXIvc3JjL2FuZHJvaWQvdHZwcm92aWRlci9jdHMvVHZQcm92aWRlclBlcmZUZXN0LmphdmEKaW5kZXggZTljN2FlMC4uZTE4ZGY0YyAxMDA2NDQKLS0tIGEvdGVzdHMvdHZwcm92aWRlci9zcmMvYW5kcm9pZC90dnByb3ZpZGVyL2N0cy9UdlByb3ZpZGVyUGVyZlRlc3QuamF2YQorKysgYi90ZXN0cy90dnByb3ZpZGVyL3NyYy9hbmRyb2lkL3R2cHJvdmlkZXIvY3RzL1R2UHJvdmlkZXJQZXJmVGVzdC5qYXZhCkBAIC04Niw2ICs4NiwxMSBAQAogICAgICAgICBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fU0laRSA9IDEwMDA7CiAgICAgICAgIGRvdWJsZVtdIGFwcGx5QmF0Y2hUaW1lcyA9IE1lYXN1cmVUaW1lLm1lYXN1cmUoVFJBTlNBQ1RJT05fUlVOUywgbmV3IE1lYXN1cmVSdW4oKSB7CiAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByZXBhcmUoaW50IGkpIHsKKyAgICAgICAgICAgICAgICBtQ29udGVudFJlc29sdmVyLmRlbGV0ZShDaGFubmVscy5DT05URU5UX1VSSSwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKGludCBpKSB7CiAgICAgICAgICAgICAgICAgb3BlcmF0aW9ucy5jbGVhcigpOwogICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgVFJBTlNBQ1RJT05fU0laRTsgKytqKSB7CmRpZmYgLS1naXQgYS90ZXN0cy91aS9BbmRyb2lkLm1rIGIvdGVzdHMvdWkvQW5kcm9pZC5tawppbmRleCA1M2FlNzdlLi45YTQ2NWZjIDEwMDY0NAotLS0gYS90ZXN0cy91aS9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3VpL0FuZHJvaWQubWsKQEAgLTIwLDE0ICsyMCwxNiBAQAogCiBMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQogCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbCBjdHN0ZXN0cnVubmVyCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgY3RzdGVzdHJ1bm5lci1heHQKKworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lci5zdHVicyBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicwogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNVaURldmljZVRlc3RDYXNlcwogCiAjIFRhZyB0aGlzIG1vZHVsZSBhcyBhIGN0cyB0ZXN0IGFydGlmYWN0Ci1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cworTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMgY3RzX2luc3RhbnQKIAogTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAogCmRpZmYgLS1naXQgYS90ZXN0cy91aS9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvdWkvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA1ZWQwNmI0Li4wODQ3N2U4IDEwMDY0NAotLS0gYS90ZXN0cy91aS9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL3VpL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTE2LDcgKzE2LDggQEAKIC0tPgogCiA8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHBhY2thZ2U9ImFuZHJvaWQudWkuY3RzIiA+CisgICAgcGFja2FnZT0iYW5kcm9pZC51aS5jdHMiCisgICAgYW5kcm9pZDp0YXJnZXRTYW5kYm94VmVyc2lvbj0iMiI+CiAKICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkRJU0FCTEVfS0VZR1VBUkQiIC8+CiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9FWFRFUk5BTF9TVE9SQUdFIiAvPgpAQCAtMzYsNyArMzcsNyBAQAogICAgIDwvYXBwbGljYXRpb24+CiAKICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IlVJIExhdGVuY3kgbWVhc3VyZW1lbnQiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC51aS5jdHMiID4KICAgICAgICAgPG1ldGEtZGF0YQpkaWZmIC0tZ2l0IGEvdGVzdHMvdWkvc3JjL2FuZHJvaWQvdWkvY3RzL1dhdGNoUGVyY2VudGFnZVNjcmVlbkRpbWVuVGVzdC5qYXZhIGIvdGVzdHMvdWkvc3JjL2FuZHJvaWQvdWkvY3RzL1dhdGNoUGVyY2VudGFnZVNjcmVlbkRpbWVuVGVzdC5qYXZhCmluZGV4IGM1NTBmODIuLmQwNGM3ZDggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3VpL3NyYy9hbmRyb2lkL3VpL2N0cy9XYXRjaFBlcmNlbnRhZ2VTY3JlZW5EaW1lblRlc3QuamF2YQorKysgYi90ZXN0cy91aS9zcmMvYW5kcm9pZC91aS9jdHMvV2F0Y2hQZXJjZW50YWdlU2NyZWVuRGltZW5UZXN0LmphdmEKQEAgLTE3LDEzICsxNywxNSBAQAogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIGltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKwogaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3ZpZGVvL0FuZHJvaWQubWsgYi90ZXN0cy92aWRlby9BbmRyb2lkLm1rCmluZGV4IGM3MGNmYWYuLmY5MjI3MzQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3ZpZGVvL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvdmlkZW8vQW5kcm9pZC5tawpAQCAtMjMsOSArMjMsMTEgQEAKICMgaW5jbHVkZSBib3RoIHRoZSAzMiBhbmQgNjQgYml0IHZlcnNpb25zCiBMT0NBTF9NVUxUSUxJQiA6PSBib3RoCiAKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjdHNtZWRpYXV0aWwgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbCBjdHN0ZXN0cnVubmVyCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY3RzbWVkaWF1dGlsIGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwtYXh0IGN0c3Rlc3RydW5uZXItYXh0CiAKLUxPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmN0c21lZGlhY29kZWNfam5pIGxpYm5hdGl2ZWhlbHBlcl9jb21wYXRfbGliYysrCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzIGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCisKK0xPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmN0c2NvZGVjdXRpbHNfam5pIGxpYm5hdGl2ZWhlbHBlcl9jb21wYXRfbGliYysrCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIApkaWZmIC0tZ2l0IGEvdGVzdHMvdmlkZW8vQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL3ZpZGVvL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggMjJkYWQ5ZS4uNTM0ZmMzZCAxMDA2NDQKLS0tIGEvdGVzdHMvdmlkZW8vQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy92aWRlby9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yMyw3ICsyMyw3IEBACiAgICAgPGFwcGxpY2F0aW9uPgogICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KICAgICA8L2FwcGxpY2F0aW9uPgotICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQudmlkZW8uY3RzIgogICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQ1RTIHRlc3RzIGZvciBWaWRlbyIgPgogICAgICAgICA8bWV0YS1kYXRhCmRpZmYgLS1naXQgYS90ZXN0cy92aWRlby9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy92aWRlby9BbmRyb2lkVGVzdC54bWwKaW5kZXggZTMwYTM5NC4uMzgzNmY5OCAxMDA2NDQKLS0tIGEvdGVzdHMvdmlkZW8vQW5kcm9pZFRlc3QueG1sCisrKyBiL3Rlc3RzL3ZpZGVvL0FuZHJvaWRUZXN0LnhtbApAQCAtMTQsNiArMTQsNyBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgQ1RTIFZpZGVvIHRlc3QgY2FzZXMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJjdHMiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJjb21wb25lbnQiIHZhbHVlPSJtZWRpYSIgLz4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdmlkZW8vc3JjL2FuZHJvaWQvdmlkZW8vY3RzL1ZpZGVvRW5jb2RlckRlY29kZXJUZXN0LmphdmEgYi90ZXN0cy92aWRlby9zcmMvYW5kcm9pZC92aWRlby9jdHMvVmlkZW9FbmNvZGVyRGVjb2RlclRlc3QuamF2YQppbmRleCA3YjFkYzExLi4wN2U3YzZjIDEwMDY0NAotLS0gYS90ZXN0cy92aWRlby9zcmMvYW5kcm9pZC92aWRlby9jdHMvVmlkZW9FbmNvZGVyRGVjb2RlclRlc3QuamF2YQorKysgYi90ZXN0cy92aWRlby9zcmMvYW5kcm9pZC92aWRlby9jdHMvVmlkZW9FbmNvZGVyRGVjb2RlclRlc3QuamF2YQpAQCAtMTk1LDkgKzE5NSwxMiBAQAogICAgIC8vIHRlc3RzIGFuZCBjaGFuZ2UgdGhlIGNvdW50IGlmIHRoZXJlIGNhbiBiZSBtb3JlIGVuY29kZXJzLgogCiAgICAgLy8gQVZDIHRlc3RzCi0gICAgcHVibGljIHZvaWQgdGVzdEF2Y0NvdW50MDMyMHgwMjQwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IGNvdW50KEFWQywgMzIwLCAyNDAsIDEsIDQpOyB9CisgICAgcHVibGljIHZvaWQgdGVzdEF2Y0NvdW50MDMyMHgwMjQwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IGNvdW50KEFWQywgMzIwLCAyNDAsIDIsIDQpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdEF2Y0dvb2cwUXVhbDAzMjB4MDI0MCgpIHRocm93cyBFeGNlcHRpb24geyBxdWFsKEFWQywgMzIwLCAyNDAsIEdPT0csIDApOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdEF2Y0dvb2cwUGVyZjAzMjB4MDI0MCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKEFWQywgMzIwLCAyNDAsIEdPT0csIDApOyB9CisgICAgcHVibGljIHZvaWQgdGVzdEF2Y0dvb2cxUXVhbDAzMjB4MDI0MCgpIHRocm93cyBFeGNlcHRpb24geyBxdWFsKEFWQywgMzIwLCAyNDAsIEdPT0csIDEpOyB9CisgICAgcHVibGljIHZvaWQgdGVzdEF2Y0dvb2cxUGVyZjAzMjB4MDI0MCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKEFWQywgMzIwLCAyNDAsIEdPT0csIDEpOyB9CisKICAgICBwdWJsaWMgdm9pZCB0ZXN0QXZjT3RoZXIwUXVhbDAzMjB4MDI0MCgpIHRocm93cyBFeGNlcHRpb24geyBxdWFsKEFWQywgMzIwLCAyNDAsIE9USEVSLCAwKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RBdmNPdGhlcjBQZXJmMDMyMHgwMjQwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoQVZDLCAzMjAsIDI0MCwgT1RIRVIsIDApOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdEF2Y090aGVyMVF1YWwwMzIweDAyNDAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcXVhbChBVkMsIDMyMCwgMjQwLCBPVEhFUiwgMSk7IH0KQEAgLTIwNiw5ICsyMDksMTIgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0QXZjT3RoZXIyUGVyZjAzMjB4MDI0MCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKEFWQywgMzIwLCAyNDAsIE9USEVSLCAyKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RBdmNPdGhlcjNRdWFsMDMyMHgwMjQwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHF1YWwoQVZDLCAzMjAsIDI0MCwgT1RIRVIsIDMpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdEF2Y090aGVyM1BlcmYwMzIweDAyNDAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihBVkMsIDMyMCwgMjQwLCBPVEhFUiwgMyk7IH0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXZjQ291bnQwNzIweDA0ODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgY291bnQoQVZDLCA3MjAsIDQ4MCwgMSwgNCk7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXZjQ291bnQwNzIweDA0ODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgY291bnQoQVZDLCA3MjAsIDQ4MCwgMiwgNCk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0QXZjR29vZzBRdWFsMDcyMHgwNDgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHF1YWwoQVZDLCA3MjAsIDQ4MCwgR09PRywgMCk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0QXZjR29vZzBQZXJmMDcyMHgwNDgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoQVZDLCA3MjAsIDQ4MCwgR09PRywgMCk7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXZjR29vZzFRdWFsMDcyMHgwNDgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHF1YWwoQVZDLCA3MjAsIDQ4MCwgR09PRywgMSk7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXZjR29vZzFQZXJmMDcyMHgwNDgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoQVZDLCA3MjAsIDQ4MCwgR09PRywgMSk7IH0KKwogICAgIHB1YmxpYyB2b2lkIHRlc3RBdmNPdGhlcjBRdWFsMDcyMHgwNDgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHF1YWwoQVZDLCA3MjAsIDQ4MCwgT1RIRVIsIDApOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdEF2Y090aGVyMFBlcmYwNzIweDA0ODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihBVkMsIDcyMCwgNDgwLCBPVEhFUiwgMCk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0QXZjT3RoZXIxUXVhbDA3MjB4MDQ4MCgpIHRocm93cyBFeGNlcHRpb24geyBxdWFsKEFWQywgNzIwLCA0ODAsIE9USEVSLCAxKTsgfQpAQCAtMjE3LDkgKzIyMywxMiBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RBdmNPdGhlcjJQZXJmMDcyMHgwNDgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoQVZDLCA3MjAsIDQ4MCwgT1RIRVIsIDIpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdEF2Y090aGVyM1F1YWwwNzIweDA0ODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcXVhbChBVkMsIDcyMCwgNDgwLCBPVEhFUiwgMyk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0QXZjT3RoZXIzUGVyZjA3MjB4MDQ4MCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKEFWQywgNzIwLCA0ODAsIE9USEVSLCAzKTsgfQotICAgIHB1YmxpYyB2b2lkIHRlc3RBdmNDb3VudDEyODB4MDcyMCgpIHRocm93cyBFeGNlcHRpb24geyBjb3VudChBVkMsIDEyODAsIDcyMCwgMSwgNCk7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXZjQ291bnQxMjgweDA3MjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgY291bnQoQVZDLCAxMjgwLCA3MjAsIDIsIDQpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdEF2Y0dvb2cwUXVhbDEyODB4MDcyMCgpIHRocm93cyBFeGNlcHRpb24geyBxdWFsKEFWQywgMTI4MCwgNzIwLCBHT09HLCAwKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RBdmNHb29nMFBlcmYxMjgweDA3MjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihBVkMsIDEyODAsIDcyMCwgR09PRywgMCk7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXZjR29vZzFRdWFsMTI4MHgwNzIwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHF1YWwoQVZDLCAxMjgwLCA3MjAsIEdPT0csIDEpOyB9CisgICAgcHVibGljIHZvaWQgdGVzdEF2Y0dvb2cxUGVyZjEyODB4MDcyMCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKEFWQywgMTI4MCwgNzIwLCBHT09HLCAxKTsgfQorCiAgICAgcHVibGljIHZvaWQgdGVzdEF2Y090aGVyMFF1YWwxMjgweDA3MjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcXVhbChBVkMsIDEyODAsIDcyMCwgT1RIRVIsIDApOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdEF2Y090aGVyMFBlcmYxMjgweDA3MjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihBVkMsIDEyODAsIDcyMCwgT1RIRVIsIDApOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdEF2Y090aGVyMVF1YWwxMjgweDA3MjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcXVhbChBVkMsIDEyODAsIDcyMCwgT1RIRVIsIDEpOyB9CkBAIC0yMjgsOSArMjM3LDEyIEBACiAgICAgcHVibGljIHZvaWQgdGVzdEF2Y090aGVyMlBlcmYxMjgweDA3MjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihBVkMsIDEyODAsIDcyMCwgT1RIRVIsIDIpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdEF2Y090aGVyM1F1YWwxMjgweDA3MjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcXVhbChBVkMsIDEyODAsIDcyMCwgT1RIRVIsIDMpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdEF2Y090aGVyM1BlcmYxMjgweDA3MjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihBVkMsIDEyODAsIDcyMCwgT1RIRVIsIDMpOyB9Ci0gICAgcHVibGljIHZvaWQgdGVzdEF2Y0NvdW50MTkyMHgxMDgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IGNvdW50KEFWQywgMTkyMCwgMTA4MCwgMSwgNCk7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXZjQ291bnQxOTIweDEwODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgY291bnQoQVZDLCAxOTIwLCAxMDgwLCAyLCA0KTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RBdmNHb29nMFF1YWwxOTIweDEwODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcXVhbChBVkMsIDE5MjAsIDEwODAsIEdPT0csIDApOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdEF2Y0dvb2cwUGVyZjE5MjB4MTA4MCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKEFWQywgMTkyMCwgMTA4MCwgR09PRywgMCk7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXZjR29vZzFRdWFsMTkyMHgxMDgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHF1YWwoQVZDLCAxOTIwLCAxMDgwLCBHT09HLCAxKTsgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RBdmNHb29nMVBlcmYxOTIweDEwODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihBVkMsIDE5MjAsIDEwODAsIEdPT0csIDEpOyB9CisKICAgICBwdWJsaWMgdm9pZCB0ZXN0QXZjT3RoZXIwUXVhbDE5MjB4MTA4MCgpIHRocm93cyBFeGNlcHRpb24geyBxdWFsKEFWQywgMTkyMCwgMTA4MCwgT1RIRVIsIDApOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdEF2Y090aGVyMFBlcmYxOTIweDEwODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihBVkMsIDE5MjAsIDEwODAsIE9USEVSLCAwKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RBdmNPdGhlcjFRdWFsMTkyMHgxMDgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHF1YWwoQVZDLCAxOTIwLCAxMDgwLCBPVEhFUiwgMSk7IH0KQEAgLTI0MSwyOCArMjUzLDM0IEBACiAgICAgcHVibGljIHZvaWQgdGVzdEF2Y090aGVyM1BlcmYxOTIweDEwODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihBVkMsIDE5MjAsIDEwODAsIE9USEVSLCAzKTsgfQogCiAgICAgLy8gSDI2MyB0ZXN0cwotICAgIHB1YmxpYyB2b2lkIHRlc3RIMjYzQ291bnQwMTc2eDAxNDQoKSB0aHJvd3MgRXhjZXB0aW9uIHsgY291bnQoSDI2MywgMTc2LCAxNDQsIDEsIDIpOyB9CisgICAgcHVibGljIHZvaWQgdGVzdEgyNjNDb3VudDAxNzZ4MDE0NCgpIHRocm93cyBFeGNlcHRpb24geyBjb3VudChIMjYzLCAxNzYsIDE0NCwgMiwgMik7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0SDI2M0dvb2cwUXVhbDAxNzZ4MDE0NCgpIHRocm93cyBFeGNlcHRpb24geyBxdWFsKEgyNjMsIDE3NiwgMTQ0LCBHT09HLCAwKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RIMjYzR29vZzBQZXJmMDE3NngwMTQ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoSDI2MywgMTc2LCAxNDQsIEdPT0csIDApOyB9CisgICAgcHVibGljIHZvaWQgdGVzdEgyNjNHb29nMVF1YWwwMTc2eDAxNDQoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcXVhbChIMjYzLCAxNzYsIDE0NCwgR09PRywgMSk7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SDI2M0dvb2cxUGVyZjAxNzZ4MDE0NCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKEgyNjMsIDE3NiwgMTQ0LCBHT09HLCAxKTsgfQorCiAgICAgcHVibGljIHZvaWQgdGVzdEgyNjNPdGhlcjBRdWFsMDE3NngwMTQ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHF1YWwoSDI2MywgMTc2LCAxNDQsIE9USEVSLCAwKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RIMjYzT3RoZXIwUGVyZjAxNzZ4MDE0NCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKEgyNjMsIDE3NiwgMTQ0LCBPVEhFUiwgMCk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0SDI2M090aGVyMVF1YWwwMTc2eDAxNDQoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcXVhbChIMjYzLCAxNzYsIDE0NCwgT1RIRVIsIDEpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdEgyNjNPdGhlcjFQZXJmMDE3NngwMTQ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoSDI2MywgMTc2LCAxNDQsIE9USEVSLCAxKTsgfQotICAgIHB1YmxpYyB2b2lkIHRlc3RIMjYzQ291bnQwMzUyeDAyODgoKSB0aHJvd3MgRXhjZXB0aW9uIHsgY291bnQoSDI2MywgMzUyLCAyODgsIDEsIDIpOyB9CisgICAgcHVibGljIHZvaWQgdGVzdEgyNjNDb3VudDAzNTJ4MDI4OCgpIHRocm93cyBFeGNlcHRpb24geyBjb3VudChIMjYzLCAzNTIsIDI4OCwgMiwgMik7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0SDI2M0dvb2cwUXVhbDAzNTJ4MDI4OCgpIHRocm93cyBFeGNlcHRpb24geyBxdWFsKEgyNjMsIDM1MiwgMjg4LCBHT09HLCAwKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RIMjYzR29vZzBQZXJmMDM1MngwMjg4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoSDI2MywgMzUyLCAyODgsIEdPT0csIDApOyB9CisgICAgcHVibGljIHZvaWQgdGVzdEgyNjNHb29nMVF1YWwwMzUyeDAyODgoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcXVhbChIMjYzLCAzNTIsIDI4OCwgR09PRywgMSk7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SDI2M0dvb2cxUGVyZjAzNTJ4MDI4OCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKEgyNjMsIDM1MiwgMjg4LCBHT09HLCAxKTsgfQorCiAgICAgcHVibGljIHZvaWQgdGVzdEgyNjNPdGhlcjBRdWFsMDM1MngwMjg4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHF1YWwoSDI2MywgMzUyLCAyODgsIE9USEVSLCAwKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RIMjYzT3RoZXIwUGVyZjAzNTJ4MDI4OCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKEgyNjMsIDM1MiwgMjg4LCBPVEhFUiwgMCk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0SDI2M090aGVyMVF1YWwwMzUyeDAyODgoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcXVhbChIMjYzLCAzNTIsIDI4OCwgT1RIRVIsIDEpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdEgyNjNPdGhlcjFQZXJmMDM1MngwMjg4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoSDI2MywgMzUyLCAyODgsIE9USEVSLCAxKTsgfQotICAgIHB1YmxpYyB2b2lkIHRlc3RIMjYzQ291bnQwNzA0eDA1NzYoKSB0aHJvd3MgRXhjZXB0aW9uIHsgY291bnQoSDI2MywgNzA0LCA1NzYsIDEsIDIpOyB9CisgICAgcHVibGljIHZvaWQgdGVzdEgyNjNDb3VudDA3MDR4MDU3NigpIHRocm93cyBFeGNlcHRpb24geyBjb3VudChIMjYzLCA3MDQsIDU3NiwgMiwgMik7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0SDI2M0dvb2cwUXVhbDA3MDR4MDU3NigpIHRocm93cyBFeGNlcHRpb24geyBxdWFsKEgyNjMsIDcwNCwgNTc2LCBHT09HLCAwLCAyNSk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0SDI2M0dvb2cwUGVyZjA3MDR4MDU3NigpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKEgyNjMsIDcwNCwgNTc2LCBHT09HLCAwKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RIMjYzT3RoZXIwUXVhbDA3MDR4MDU3NigpIHRocm93cyBFeGNlcHRpb24geyBxdWFsKEgyNjMsIDcwNCwgNTc2LCBPVEhFUiwgMCwgMjUpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdEgyNjNPdGhlcjBQZXJmMDcwNHgwNTc2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoSDI2MywgNzA0LCA1NzYsIE9USEVSLCAwKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RIMjYzT3RoZXIxUXVhbDA3MDR4MDU3NigpIHRocm93cyBFeGNlcHRpb24geyBxdWFsKEgyNjMsIDcwNCwgNTc2LCBPVEhFUiwgMSwgMjUpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdEgyNjNPdGhlcjFQZXJmMDcwNHgwNTc2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoSDI2MywgNzA0LCA1NzYsIE9USEVSLCAxKTsgfQotICAgIHB1YmxpYyB2b2lkIHRlc3RIMjYzQ291bnQxNDA4eDExNTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsgY291bnQoSDI2MywgMTQwOCwgMTE1MiwgMSwgMik7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SDI2M0NvdW50MTQwOHgxMTUyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IGNvdW50KEgyNjMsIDE0MDgsIDExNTIsIDIsIDIpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdEgyNjNHb29nMFF1YWwxNDA4eDExNTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcXVhbChIMjYzLCAxNDA4LCAxMTUyLCBHT09HLCAwLCAyNSk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0SDI2M0dvb2cwUGVyZjE0MDh4MTE1MigpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKEgyNjMsIDE0MDgsIDExNTIsIEdPT0csIDApOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdEgyNjNPdGhlcjBRdWFsMTQwOHgxMTUyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHF1YWwoSDI2MywgMTQwOCwgMTE1MiwgT1RIRVIsIDAsIDI1KTsgfQpAQCAtMjcxLDkgKzI4OSwxMiBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RIMjYzT3RoZXIxUGVyZjE0MDh4MTE1MigpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKEgyNjMsIDE0MDgsIDExNTIsIE9USEVSLCAxKTsgfQogCiAgICAgLy8gSEVWQyB0ZXN0cwotICAgIHB1YmxpYyB2b2lkIHRlc3RIZXZjQ291bnQwMzIweDAyNDAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgY291bnQoSEVWQywgMzIwLCAyNDAsIDEsIDQpOyB9CisgICAgcHVibGljIHZvaWQgdGVzdEhldmNDb3VudDAzMjB4MDI0MCgpIHRocm93cyBFeGNlcHRpb24geyBjb3VudChIRVZDLCAzMjAsIDI0MCwgMiwgNCk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0SGV2Y0dvb2cwUXVhbDAzMjB4MDI0MCgpIHRocm93cyBFeGNlcHRpb24geyBxdWFsKEhFVkMsIDMyMCwgMjQwLCBHT09HLCAwKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RIZXZjR29vZzBQZXJmMDMyMHgwMjQwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoSEVWQywgMzIwLCAyNDAsIEdPT0csIDApOyB9CisgICAgcHVibGljIHZvaWQgdGVzdEhldmNHb29nMVF1YWwwMzIweDAyNDAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcXVhbChIRVZDLCAzMjAsIDI0MCwgR09PRywgMSk7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGV2Y0dvb2cxUGVyZjAzMjB4MDI0MCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKEhFVkMsIDMyMCwgMjQwLCBHT09HLCAxKTsgfQorCiAgICAgcHVibGljIHZvaWQgdGVzdEhldmNPdGhlcjBRdWFsMDMyMHgwMjQwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHF1YWwoSEVWQywgMzIwLCAyNDAsIE9USEVSLCAwKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RIZXZjT3RoZXIwUGVyZjAzMjB4MDI0MCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKEhFVkMsIDMyMCwgMjQwLCBPVEhFUiwgMCk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0SGV2Y090aGVyMVF1YWwwMzIweDAyNDAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcXVhbChIRVZDLCAzMjAsIDI0MCwgT1RIRVIsIDEpOyB9CkBAIC0yODIsOSArMzAzLDEyIEBACiAgICAgcHVibGljIHZvaWQgdGVzdEhldmNPdGhlcjJQZXJmMDMyMHgwMjQwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoSEVWQywgMzIwLCAyNDAsIE9USEVSLCAyKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RIZXZjT3RoZXIzUXVhbDAzMjB4MDI0MCgpIHRocm93cyBFeGNlcHRpb24geyBxdWFsKEhFVkMsIDMyMCwgMjQwLCBPVEhFUiwgMyk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0SGV2Y090aGVyM1BlcmYwMzIweDAyNDAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihIRVZDLCAzMjAsIDI0MCwgT1RIRVIsIDMpOyB9Ci0gICAgcHVibGljIHZvaWQgdGVzdEhldmNDb3VudDA3MjB4MDQ4MCgpIHRocm93cyBFeGNlcHRpb24geyBjb3VudChIRVZDLCA3MjAsIDQ4MCwgMSwgNCk7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGV2Y0NvdW50MDcyMHgwNDgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IGNvdW50KEhFVkMsIDcyMCwgNDgwLCAyLCA0KTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RIZXZjR29vZzBRdWFsMDcyMHgwNDgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHF1YWwoSEVWQywgNzIwLCA0ODAsIEdPT0csIDApOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdEhldmNHb29nMFBlcmYwNzIweDA0ODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihIRVZDLCA3MjAsIDQ4MCwgR09PRywgMCk7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGV2Y0dvb2cxUXVhbDA3MjB4MDQ4MCgpIHRocm93cyBFeGNlcHRpb24geyBxdWFsKEhFVkMsIDcyMCwgNDgwLCBHT09HLCAxKTsgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RIZXZjR29vZzFQZXJmMDcyMHgwNDgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoSEVWQywgNzIwLCA0ODAsIEdPT0csIDEpOyB9CisKICAgICBwdWJsaWMgdm9pZCB0ZXN0SGV2Y090aGVyMFF1YWwwNzIweDA0ODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcXVhbChIRVZDLCA3MjAsIDQ4MCwgT1RIRVIsIDApOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdEhldmNPdGhlcjBQZXJmMDcyMHgwNDgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoSEVWQywgNzIwLCA0ODAsIE9USEVSLCAwKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RIZXZjT3RoZXIxUXVhbDA3MjB4MDQ4MCgpIHRocm93cyBFeGNlcHRpb24geyBxdWFsKEhFVkMsIDcyMCwgNDgwLCBPVEhFUiwgMSk7IH0KQEAgLTI5Myw5ICszMTcsMTIgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0SGV2Y090aGVyMlBlcmYwNzIweDA0ODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihIRVZDLCA3MjAsIDQ4MCwgT1RIRVIsIDIpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdEhldmNPdGhlcjNRdWFsMDcyMHgwNDgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHF1YWwoSEVWQywgNzIwLCA0ODAsIE9USEVSLCAzKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RIZXZjT3RoZXIzUGVyZjA3MjB4MDQ4MCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKEhFVkMsIDcyMCwgNDgwLCBPVEhFUiwgMyk7IH0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGV2Y0NvdW50MTI4MHgwNzIwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IGNvdW50KEhFVkMsIDEyODAsIDcyMCwgMSwgNCk7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGV2Y0NvdW50MTI4MHgwNzIwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IGNvdW50KEhFVkMsIDEyODAsIDcyMCwgMiwgNCk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0SGV2Y0dvb2cwUXVhbDEyODB4MDcyMCgpIHRocm93cyBFeGNlcHRpb24geyBxdWFsKEhFVkMsIDEyODAsIDcyMCwgR09PRywgMCk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0SGV2Y0dvb2cwUGVyZjEyODB4MDcyMCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKEhFVkMsIDEyODAsIDcyMCwgR09PRywgMCk7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGV2Y0dvb2cxUXVhbDEyODB4MDcyMCgpIHRocm93cyBFeGNlcHRpb24geyBxdWFsKEhFVkMsIDEyODAsIDcyMCwgR09PRywgMSk7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGV2Y0dvb2cxUGVyZjEyODB4MDcyMCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKEhFVkMsIDEyODAsIDcyMCwgR09PRywgMSk7IH0KKwogICAgIHB1YmxpYyB2b2lkIHRlc3RIZXZjT3RoZXIwUXVhbDEyODB4MDcyMCgpIHRocm93cyBFeGNlcHRpb24geyBxdWFsKEhFVkMsIDEyODAsIDcyMCwgT1RIRVIsIDApOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdEhldmNPdGhlcjBQZXJmMTI4MHgwNzIwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoSEVWQywgMTI4MCwgNzIwLCBPVEhFUiwgMCk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0SGV2Y090aGVyMVF1YWwxMjgweDA3MjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcXVhbChIRVZDLCAxMjgwLCA3MjAsIE9USEVSLCAxKTsgfQpAQCAtMzA0LDkgKzMzMSwxMiBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RIZXZjT3RoZXIyUGVyZjEyODB4MDcyMCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKEhFVkMsIDEyODAsIDcyMCwgT1RIRVIsIDIpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdEhldmNPdGhlcjNRdWFsMTI4MHgwNzIwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHF1YWwoSEVWQywgMTI4MCwgNzIwLCBPVEhFUiwgMyk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0SGV2Y090aGVyM1BlcmYxMjgweDA3MjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihIRVZDLCAxMjgwLCA3MjAsIE9USEVSLCAzKTsgfQotICAgIHB1YmxpYyB2b2lkIHRlc3RIZXZjQ291bnQxOTIweDEwODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgY291bnQoSEVWQywgMTkyMCwgMTA4MCwgMSwgNCk7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGV2Y0NvdW50MTkyMHgxMDgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IGNvdW50KEhFVkMsIDE5MjAsIDEwODAsIDIsIDQpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdEhldmNHb29nMFF1YWwxOTIweDEwODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcXVhbChIRVZDLCAxOTIwLCAxMDgwLCBHT09HLCAwKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RIZXZjR29vZzBQZXJmMTkyMHgxMDgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoSEVWQywgMTkyMCwgMTA4MCwgR09PRywgMCk7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGV2Y0dvb2cxUXVhbDE5MjB4MTA4MCgpIHRocm93cyBFeGNlcHRpb24geyBxdWFsKEhFVkMsIDE5MjAsIDEwODAsIEdPT0csIDEpOyB9CisgICAgcHVibGljIHZvaWQgdGVzdEhldmNHb29nMVBlcmYxOTIweDEwODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihIRVZDLCAxOTIwLCAxMDgwLCBHT09HLCAxKTsgfQorCiAgICAgcHVibGljIHZvaWQgdGVzdEhldmNPdGhlcjBRdWFsMTkyMHgxMDgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHF1YWwoSEVWQywgMTkyMCwgMTA4MCwgT1RIRVIsIDApOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdEhldmNPdGhlcjBQZXJmMTkyMHgxMDgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoSEVWQywgMTkyMCwgMTA4MCwgT1RIRVIsIDApOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdEhldmNPdGhlcjFRdWFsMTkyMHgxMDgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHF1YWwoSEVWQywgMTkyMCwgMTA4MCwgT1RIRVIsIDEpOyB9CkBAIC0zMTUsOSArMzQ1LDEyIEBACiAgICAgcHVibGljIHZvaWQgdGVzdEhldmNPdGhlcjJQZXJmMTkyMHgxMDgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoSEVWQywgMTkyMCwgMTA4MCwgT1RIRVIsIDIpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdEhldmNPdGhlcjNRdWFsMTkyMHgxMDgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHF1YWwoSEVWQywgMTkyMCwgMTA4MCwgT1RIRVIsIDMpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdEhldmNPdGhlcjNQZXJmMTkyMHgxMDgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoSEVWQywgMTkyMCwgMTA4MCwgT1RIRVIsIDMpOyB9Ci0gICAgcHVibGljIHZvaWQgdGVzdEhldmNDb3VudDM4NDB4MjE2MCgpIHRocm93cyBFeGNlcHRpb24geyBjb3VudChIRVZDLCAzODQwLCAyMTYwLCAxLCA0KTsgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RIZXZjQ291bnQzODQweDIxNjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgY291bnQoSEVWQywgMzg0MCwgMjE2MCwgMiwgNCk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0SGV2Y0dvb2cwUXVhbDM4NDB4MjE2MCgpIHRocm93cyBFeGNlcHRpb24geyBxdWFsKEhFVkMsIDM4NDAsIDIxNjAsIEdPT0csIDApOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdEhldmNHb29nMFBlcmYzODQweDIxNjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihIRVZDLCAzODQwLCAyMTYwLCBHT09HLCAwKTsgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RIZXZjR29vZzFRdWFsMzg0MHgyMTYwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHF1YWwoSEVWQywgMzg0MCwgMjE2MCwgR09PRywgMSk7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGV2Y0dvb2cxUGVyZjM4NDB4MjE2MCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKEhFVkMsIDM4NDAsIDIxNjAsIEdPT0csIDEpOyB9CisKICAgICBwdWJsaWMgdm9pZCB0ZXN0SGV2Y090aGVyMFF1YWwzODQweDIxNjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcXVhbChIRVZDLCAzODQwLCAyMTYwLCBPVEhFUiwgMCk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0SGV2Y090aGVyMFBlcmYzODQweDIxNjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihIRVZDLCAzODQwLCAyMTYwLCBPVEhFUiwgMCk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0SGV2Y090aGVyMVF1YWwzODQweDIxNjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcXVhbChIRVZDLCAzODQwLCAyMTYwLCBPVEhFUiwgMSk7IH0KQEAgLTMyOCw5ICszNjEsMTIgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0SGV2Y090aGVyM1BlcmYzODQweDIxNjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihIRVZDLCAzODQwLCAyMTYwLCBPVEhFUiwgMyk7IH0KIAogICAgIC8vIE1QRUcyIHRlc3RzCi0gICAgcHVibGljIHZvaWQgdGVzdE1wZWcyQ291bnQwMTc2eDAxNDQoKSB0aHJvd3MgRXhjZXB0aW9uIHsgY291bnQoTVBFRzIsIDE3NiwgMTQ0LCAxLCA0KTsgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RNcGVnMkNvdW50MDE3NngwMTQ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7IGNvdW50KE1QRUcyLCAxNzYsIDE0NCwgMiwgNCk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0TXBlZzJHb29nMFF1YWwwMTc2eDAxNDQoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcXVhbChNUEVHMiwgMTc2LCAxNDQsIEdPT0csIDApOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdE1wZWcyR29vZzBQZXJmMDE3NngwMTQ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoTVBFRzIsIDE3NiwgMTQ0LCBHT09HLCAwKTsgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RNcGVnMkdvb2cxUXVhbDAxNzZ4MDE0NCgpIHRocm93cyBFeGNlcHRpb24geyBxdWFsKE1QRUcyLCAxNzYsIDE0NCwgR09PRywgMSk7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXBlZzJHb29nMVBlcmYwMTc2eDAxNDQoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihNUEVHMiwgMTc2LCAxNDQsIEdPT0csIDEpOyB9CisKICAgICBwdWJsaWMgdm9pZCB0ZXN0TXBlZzJPdGhlcjBRdWFsMDE3NngwMTQ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHF1YWwoTVBFRzIsIDE3NiwgMTQ0LCBPVEhFUiwgMCk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0TXBlZzJPdGhlcjBQZXJmMDE3NngwMTQ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoTVBFRzIsIDE3NiwgMTQ0LCBPVEhFUiwgMCk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0TXBlZzJPdGhlcjFRdWFsMDE3NngwMTQ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHF1YWwoTVBFRzIsIDE3NiwgMTQ0LCBPVEhFUiwgMSk7IH0KQEAgLTMzOSw5ICszNzUsMTIgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0TXBlZzJPdGhlcjJQZXJmMDE3NngwMTQ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoTVBFRzIsIDE3NiwgMTQ0LCBPVEhFUiwgMik7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0TXBlZzJPdGhlcjNRdWFsMDE3NngwMTQ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHF1YWwoTVBFRzIsIDE3NiwgMTQ0LCBPVEhFUiwgMyk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0TXBlZzJPdGhlcjNQZXJmMDE3NngwMTQ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoTVBFRzIsIDE3NiwgMTQ0LCBPVEhFUiwgMyk7IH0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXBlZzJDb3VudDAzNTJ4MDI4OCgpIHRocm93cyBFeGNlcHRpb24geyBjb3VudChNUEVHMiwgMzUyLCAyODgsIDEsIDQpOyB9CisgICAgcHVibGljIHZvaWQgdGVzdE1wZWcyQ291bnQwMzUyeDAyODgoKSB0aHJvd3MgRXhjZXB0aW9uIHsgY291bnQoTVBFRzIsIDM1MiwgMjg4LCAyLCA0KTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RNcGVnMkdvb2cwUXVhbDAzNTJ4MDI4OCgpIHRocm93cyBFeGNlcHRpb24geyBxdWFsKE1QRUcyLCAzNTIsIDI4OCwgR09PRywgMCk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0TXBlZzJHb29nMFBlcmYwMzUyeDAyODgoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihNUEVHMiwgMzUyLCAyODgsIEdPT0csIDApOyB9CisgICAgcHVibGljIHZvaWQgdGVzdE1wZWcyR29vZzFRdWFsMDM1MngwMjg4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHF1YWwoTVBFRzIsIDM1MiwgMjg4LCBHT09HLCAxKTsgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RNcGVnMkdvb2cxUGVyZjAzNTJ4MDI4OCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKE1QRUcyLCAzNTIsIDI4OCwgR09PRywgMSk7IH0KKwogICAgIHB1YmxpYyB2b2lkIHRlc3RNcGVnMk90aGVyMFF1YWwwMzUyeDAyODgoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcXVhbChNUEVHMiwgMzUyLCAyODgsIE9USEVSLCAwKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RNcGVnMk90aGVyMFBlcmYwMzUyeDAyODgoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihNUEVHMiwgMzUyLCAyODgsIE9USEVSLCAwKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RNcGVnMk90aGVyMVF1YWwwMzUyeDAyODgoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcXVhbChNUEVHMiwgMzUyLCAyODgsIE9USEVSLCAxKTsgfQpAQCAtMzUwLDkgKzM4OSwxMiBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RNcGVnMk90aGVyMlBlcmYwMzUyeDAyODgoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihNUEVHMiwgMzUyLCAyODgsIE9USEVSLCAyKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RNcGVnMk90aGVyM1F1YWwwMzUyeDAyODgoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcXVhbChNUEVHMiwgMzUyLCAyODgsIE9USEVSLCAzKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RNcGVnMk90aGVyM1BlcmYwMzUyeDAyODgoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihNUEVHMiwgMzUyLCAyODgsIE9USEVSLCAzKTsgfQotICAgIHB1YmxpYyB2b2lkIHRlc3RNcGVnMkNvdW50MDY0MHgwNDgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IGNvdW50KE1QRUcyLCA2NDAsIDQ4MCwgMSwgNCk7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXBlZzJDb3VudDA2NDB4MDQ4MCgpIHRocm93cyBFeGNlcHRpb24geyBjb3VudChNUEVHMiwgNjQwLCA0ODAsIDIsIDQpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdE1wZWcyR29vZzBRdWFsMDY0MHgwNDgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHF1YWwoTVBFRzIsIDY0MCwgNDgwLCBHT09HLCAwKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RNcGVnMkdvb2cwUGVyZjA2NDB4MDQ4MCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKE1QRUcyLCA2NDAsIDQ4MCwgR09PRywgMCk7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXBlZzJHb29nMVF1YWwwNjQweDA0ODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcXVhbChNUEVHMiwgNjQwLCA0ODAsIEdPT0csIDEpOyB9CisgICAgcHVibGljIHZvaWQgdGVzdE1wZWcyR29vZzFQZXJmMDY0MHgwNDgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoTVBFRzIsIDY0MCwgNDgwLCBHT09HLCAxKTsgfQorCiAgICAgcHVibGljIHZvaWQgdGVzdE1wZWcyT3RoZXIwUXVhbDA2NDB4MDQ4MCgpIHRocm93cyBFeGNlcHRpb24geyBxdWFsKE1QRUcyLCA2NDAsIDQ4MCwgT1RIRVIsIDApOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdE1wZWcyT3RoZXIwUGVyZjA2NDB4MDQ4MCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKE1QRUcyLCA2NDAsIDQ4MCwgT1RIRVIsIDApOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdE1wZWcyT3RoZXIxUXVhbDA2NDB4MDQ4MCgpIHRocm93cyBFeGNlcHRpb24geyBxdWFsKE1QRUcyLCA2NDAsIDQ4MCwgT1RIRVIsIDEpOyB9CkBAIC0zNjEsOSArNDAzLDEyIEBACiAgICAgcHVibGljIHZvaWQgdGVzdE1wZWcyT3RoZXIyUGVyZjA2NDB4MDQ4MCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKE1QRUcyLCA2NDAsIDQ4MCwgT1RIRVIsIDIpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdE1wZWcyT3RoZXIzUXVhbDA2NDB4MDQ4MCgpIHRocm93cyBFeGNlcHRpb24geyBxdWFsKE1QRUcyLCA2NDAsIDQ4MCwgT1RIRVIsIDMpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdE1wZWcyT3RoZXIzUGVyZjA2NDB4MDQ4MCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKE1QRUcyLCA2NDAsIDQ4MCwgT1RIRVIsIDMpOyB9Ci0gICAgcHVibGljIHZvaWQgdGVzdE1wZWcyQ291bnQxMjgweDA3MjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgY291bnQoTVBFRzIsIDEyODAsIDcyMCwgMSwgNCk7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXBlZzJDb3VudDEyODB4MDcyMCgpIHRocm93cyBFeGNlcHRpb24geyBjb3VudChNUEVHMiwgMTI4MCwgNzIwLCAyLCA0KTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RNcGVnMkdvb2cwUXVhbDEyODB4MDcyMCgpIHRocm93cyBFeGNlcHRpb24geyBxdWFsKE1QRUcyLCAxMjgwLCA3MjAsIEdPT0csIDApOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdE1wZWcyR29vZzBQZXJmMTI4MHgwNzIwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoTVBFRzIsIDEyODAsIDcyMCwgR09PRywgMCk7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXBlZzJHb29nMVF1YWwxMjgweDA3MjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcXVhbChNUEVHMiwgMTI4MCwgNzIwLCBHT09HLCAxKTsgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RNcGVnMkdvb2cxUGVyZjEyODB4MDcyMCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKE1QRUcyLCAxMjgwLCA3MjAsIEdPT0csIDEpOyB9CisKICAgICBwdWJsaWMgdm9pZCB0ZXN0TXBlZzJPdGhlcjBRdWFsMTI4MHgwNzIwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHF1YWwoTVBFRzIsIDEyODAsIDcyMCwgT1RIRVIsIDApOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdE1wZWcyT3RoZXIwUGVyZjEyODB4MDcyMCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKE1QRUcyLCAxMjgwLCA3MjAsIE9USEVSLCAwKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RNcGVnMk90aGVyMVF1YWwxMjgweDA3MjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcXVhbChNUEVHMiwgMTI4MCwgNzIwLCBPVEhFUiwgMSk7IH0KQEAgLTM3Miw5ICs0MTcsMTIgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0TXBlZzJPdGhlcjJQZXJmMTI4MHgwNzIwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoTVBFRzIsIDEyODAsIDcyMCwgT1RIRVIsIDIpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdE1wZWcyT3RoZXIzUXVhbDEyODB4MDcyMCgpIHRocm93cyBFeGNlcHRpb24geyBxdWFsKE1QRUcyLCAxMjgwLCA3MjAsIE9USEVSLCAzKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RNcGVnMk90aGVyM1BlcmYxMjgweDA3MjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihNUEVHMiwgMTI4MCwgNzIwLCBPVEhFUiwgMyk7IH0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXBlZzJDb3VudDE5MjB4MTA4MCgpIHRocm93cyBFeGNlcHRpb24geyBjb3VudChNUEVHMiwgMTkyMCwgMTA4MCwgMSwgNCk7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXBlZzJDb3VudDE5MjB4MTA4MCgpIHRocm93cyBFeGNlcHRpb24geyBjb3VudChNUEVHMiwgMTkyMCwgMTA4MCwgMiwgNCk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0TXBlZzJHb29nMFF1YWwxOTIweDEwODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcXVhbChNUEVHMiwgMTkyMCwgMTA4MCwgR09PRywgMCk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0TXBlZzJHb29nMFBlcmYxOTIweDEwODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihNUEVHMiwgMTkyMCwgMTA4MCwgR09PRywgMCk7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXBlZzJHb29nMVF1YWwxOTIweDEwODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcXVhbChNUEVHMiwgMTkyMCwgMTA4MCwgR09PRywgMSk7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXBlZzJHb29nMVBlcmYxOTIweDEwODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihNUEVHMiwgMTkyMCwgMTA4MCwgR09PRywgMSk7IH0KKwogICAgIHB1YmxpYyB2b2lkIHRlc3RNcGVnMk90aGVyMFF1YWwxOTIweDEwODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcXVhbChNUEVHMiwgMTkyMCwgMTA4MCwgT1RIRVIsIDApOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdE1wZWcyT3RoZXIwUGVyZjE5MjB4MTA4MCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKE1QRUcyLCAxOTIwLCAxMDgwLCBPVEhFUiwgMCk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0TXBlZzJPdGhlcjFRdWFsMTkyMHgxMDgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHF1YWwoTVBFRzIsIDE5MjAsIDEwODAsIE9USEVSLCAxKTsgfQpAQCAtMzg1LDkgKzQzMywxMiBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RNcGVnMk90aGVyM1BlcmYxOTIweDEwODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihNUEVHMiwgMTkyMCwgMTA4MCwgT1RIRVIsIDMpOyB9CiAKICAgICAvLyBNUEVHNCB0ZXN0cwotICAgIHB1YmxpYyB2b2lkIHRlc3RNcGVnNENvdW50MDE3NngwMTQ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7IGNvdW50KE1QRUc0LCAxNzYsIDE0NCwgMSwgNCk7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXBlZzRDb3VudDAxNzZ4MDE0NCgpIHRocm93cyBFeGNlcHRpb24geyBjb3VudChNUEVHNCwgMTc2LCAxNDQsIDIsIDQpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdE1wZWc0R29vZzBRdWFsMDE3NngwMTQ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHF1YWwoTVBFRzQsIDE3NiwgMTQ0LCBHT09HLCAwKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RNcGVnNEdvb2cwUGVyZjAxNzZ4MDE0NCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKE1QRUc0LCAxNzYsIDE0NCwgR09PRywgMCk7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXBlZzRHb29nMVF1YWwwMTc2eDAxNDQoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcXVhbChNUEVHNCwgMTc2LCAxNDQsIEdPT0csIDEpOyB9CisgICAgcHVibGljIHZvaWQgdGVzdE1wZWc0R29vZzFQZXJmMDE3NngwMTQ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoTVBFRzQsIDE3NiwgMTQ0LCBHT09HLCAxKTsgfQorCiAgICAgcHVibGljIHZvaWQgdGVzdE1wZWc0T3RoZXIwUXVhbDAxNzZ4MDE0NCgpIHRocm93cyBFeGNlcHRpb24geyBxdWFsKE1QRUc0LCAxNzYsIDE0NCwgT1RIRVIsIDApOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdE1wZWc0T3RoZXIwUGVyZjAxNzZ4MDE0NCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKE1QRUc0LCAxNzYsIDE0NCwgT1RIRVIsIDApOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdE1wZWc0T3RoZXIxUXVhbDAxNzZ4MDE0NCgpIHRocm93cyBFeGNlcHRpb24geyBxdWFsKE1QRUc0LCAxNzYsIDE0NCwgT1RIRVIsIDEpOyB9CkBAIC0zOTYsOSArNDQ3LDEyIEBACiAgICAgcHVibGljIHZvaWQgdGVzdE1wZWc0T3RoZXIyUGVyZjAxNzZ4MDE0NCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKE1QRUc0LCAxNzYsIDE0NCwgT1RIRVIsIDIpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdE1wZWc0T3RoZXIzUXVhbDAxNzZ4MDE0NCgpIHRocm93cyBFeGNlcHRpb24geyBxdWFsKE1QRUc0LCAxNzYsIDE0NCwgT1RIRVIsIDMpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdE1wZWc0T3RoZXIzUGVyZjAxNzZ4MDE0NCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKE1QRUc0LCAxNzYsIDE0NCwgT1RIRVIsIDMpOyB9Ci0gICAgcHVibGljIHZvaWQgdGVzdE1wZWc0Q291bnQwMzUyeDAyODgoKSB0aHJvd3MgRXhjZXB0aW9uIHsgY291bnQoTVBFRzQsIDM1MiwgMjg4LCAxLCA0KTsgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RNcGVnNENvdW50MDM1MngwMjg4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7IGNvdW50KE1QRUc0LCAzNTIsIDI4OCwgMiwgNCk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0TXBlZzRHb29nMFF1YWwwMzUyeDAyODgoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcXVhbChNUEVHNCwgMzUyLCAyODgsIEdPT0csIDApOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdE1wZWc0R29vZzBQZXJmMDM1MngwMjg4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoTVBFRzQsIDM1MiwgMjg4LCBHT09HLCAwKTsgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RNcGVnNEdvb2cxUXVhbDAzNTJ4MDI4OCgpIHRocm93cyBFeGNlcHRpb24geyBxdWFsKE1QRUc0LCAzNTIsIDI4OCwgR09PRywgMSk7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXBlZzRHb29nMVBlcmYwMzUyeDAyODgoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihNUEVHNCwgMzUyLCAyODgsIEdPT0csIDEpOyB9CisKICAgICBwdWJsaWMgdm9pZCB0ZXN0TXBlZzRPdGhlcjBRdWFsMDM1MngwMjg4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHF1YWwoTVBFRzQsIDM1MiwgMjg4LCBPVEhFUiwgMCk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0TXBlZzRPdGhlcjBQZXJmMDM1MngwMjg4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoTVBFRzQsIDM1MiwgMjg4LCBPVEhFUiwgMCk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0TXBlZzRPdGhlcjFRdWFsMDM1MngwMjg4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHF1YWwoTVBFRzQsIDM1MiwgMjg4LCBPVEhFUiwgMSk7IH0KQEAgLTQwNyw5ICs0NjEsMTIgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0TXBlZzRPdGhlcjJQZXJmMDM1MngwMjg4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoTVBFRzQsIDM1MiwgMjg4LCBPVEhFUiwgMik7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0TXBlZzRPdGhlcjNRdWFsMDM1MngwMjg4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHF1YWwoTVBFRzQsIDM1MiwgMjg4LCBPVEhFUiwgMyk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0TXBlZzRPdGhlcjNQZXJmMDM1MngwMjg4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoTVBFRzQsIDM1MiwgMjg4LCBPVEhFUiwgMyk7IH0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXBlZzRDb3VudDA2NDB4MDQ4MCgpIHRocm93cyBFeGNlcHRpb24geyBjb3VudChNUEVHNCwgNjQwLCA0ODAsIDEsIDQpOyB9CisgICAgcHVibGljIHZvaWQgdGVzdE1wZWc0Q291bnQwNjQweDA0ODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgY291bnQoTVBFRzQsIDY0MCwgNDgwLCAyLCA0KTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RNcGVnNEdvb2cwUXVhbDA2NDB4MDQ4MCgpIHRocm93cyBFeGNlcHRpb24geyBxdWFsKE1QRUc0LCA2NDAsIDQ4MCwgR09PRywgMCk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0TXBlZzRHb29nMFBlcmYwNjQweDA0ODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihNUEVHNCwgNjQwLCA0ODAsIEdPT0csIDApOyB9CisgICAgcHVibGljIHZvaWQgdGVzdE1wZWc0R29vZzFRdWFsMDY0MHgwNDgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHF1YWwoTVBFRzQsIDY0MCwgNDgwLCBHT09HLCAxKTsgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RNcGVnNEdvb2cxUGVyZjA2NDB4MDQ4MCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKE1QRUc0LCA2NDAsIDQ4MCwgR09PRywgMSk7IH0KKwogICAgIHB1YmxpYyB2b2lkIHRlc3RNcGVnNE90aGVyMFF1YWwwNjQweDA0ODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcXVhbChNUEVHNCwgNjQwLCA0ODAsIE9USEVSLCAwKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RNcGVnNE90aGVyMFBlcmYwNjQweDA0ODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihNUEVHNCwgNjQwLCA0ODAsIE9USEVSLCAwKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RNcGVnNE90aGVyMVF1YWwwNjQweDA0ODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcXVhbChNUEVHNCwgNjQwLCA0ODAsIE9USEVSLCAxKTsgfQpAQCAtNDE4LDkgKzQ3NSwxMiBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RNcGVnNE90aGVyMlBlcmYwNjQweDA0ODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihNUEVHNCwgNjQwLCA0ODAsIE9USEVSLCAyKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RNcGVnNE90aGVyM1F1YWwwNjQweDA0ODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcXVhbChNUEVHNCwgNjQwLCA0ODAsIE9USEVSLCAzKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RNcGVnNE90aGVyM1BlcmYwNjQweDA0ODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihNUEVHNCwgNjQwLCA0ODAsIE9USEVSLCAzKTsgfQotICAgIHB1YmxpYyB2b2lkIHRlc3RNcGVnNENvdW50MTI4MHgwNzIwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IGNvdW50KE1QRUc0LCAxMjgwLCA3MjAsIDEsIDQpOyB9CisgICAgcHVibGljIHZvaWQgdGVzdE1wZWc0Q291bnQxMjgweDA3MjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgY291bnQoTVBFRzQsIDEyODAsIDcyMCwgMiwgNCk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0TXBlZzRHb29nMFF1YWwxMjgweDA3MjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcXVhbChNUEVHNCwgMTI4MCwgNzIwLCBHT09HLCAwKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RNcGVnNEdvb2cwUGVyZjEyODB4MDcyMCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKE1QRUc0LCAxMjgwLCA3MjAsIEdPT0csIDApOyB9CisgICAgcHVibGljIHZvaWQgdGVzdE1wZWc0R29vZzFRdWFsMTI4MHgwNzIwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHF1YWwoTVBFRzQsIDEyODAsIDcyMCwgR09PRywgMSk7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXBlZzRHb29nMVBlcmYxMjgweDA3MjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihNUEVHNCwgMTI4MCwgNzIwLCBHT09HLCAxKTsgfQorCiAgICAgcHVibGljIHZvaWQgdGVzdE1wZWc0T3RoZXIwUXVhbDEyODB4MDcyMCgpIHRocm93cyBFeGNlcHRpb24geyBxdWFsKE1QRUc0LCAxMjgwLCA3MjAsIE9USEVSLCAwKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RNcGVnNE90aGVyMFBlcmYxMjgweDA3MjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihNUEVHNCwgMTI4MCwgNzIwLCBPVEhFUiwgMCk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0TXBlZzRPdGhlcjFRdWFsMTI4MHgwNzIwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHF1YWwoTVBFRzQsIDEyODAsIDcyMCwgT1RIRVIsIDEpOyB9CkBAIC00MzEsMzkgKzQ5MSw1NCBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RNcGVnNE90aGVyM1BlcmYxMjgweDA3MjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihNUEVHNCwgMTI4MCwgNzIwLCBPVEhFUiwgMyk7IH0KIAogICAgIC8vIFZQOCB0ZXN0cwotICAgIHB1YmxpYyB2b2lkIHRlc3RWcDhDb3VudDAzMjB4MDE4MCgpIHRocm93cyBFeGNlcHRpb24geyBjb3VudChWUDgsIDMyMCwgMTgwLCAxLCAyKTsgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RWcDhDb3VudDAzMjB4MDE4MCgpIHRocm93cyBFeGNlcHRpb24geyBjb3VudChWUDgsIDMyMCwgMTgwLCAyLCAyKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RWcDhHb29nMFF1YWwwMzIweDAxODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcXVhbChWUDgsIDMyMCwgMTgwLCBHT09HLCAwKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RWcDhHb29nMFBlcmYwMzIweDAxODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihWUDgsIDMyMCwgMTgwLCBHT09HLCAwKTsgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RWcDhHb29nMVF1YWwwMzIweDAxODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcXVhbChWUDgsIDMyMCwgMTgwLCBHT09HLCAxKTsgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RWcDhHb29nMVBlcmYwMzIweDAxODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihWUDgsIDMyMCwgMTgwLCBHT09HLCAxKTsgfQorCiAgICAgcHVibGljIHZvaWQgdGVzdFZwOE90aGVyMFF1YWwwMzIweDAxODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcXVhbChWUDgsIDMyMCwgMTgwLCBPVEhFUiwgMCk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0VnA4T3RoZXIwUGVyZjAzMjB4MDE4MCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKFZQOCwgMzIwLCAxODAsIE9USEVSLCAwKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RWcDhPdGhlcjFRdWFsMDMyMHgwMTgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHF1YWwoVlA4LCAzMjAsIDE4MCwgT1RIRVIsIDEpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdFZwOE90aGVyMVBlcmYwMzIweDAxODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihWUDgsIDMyMCwgMTgwLCBPVEhFUiwgMSk7IH0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VnA4Q291bnQwNjQweDAzNjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgY291bnQoVlA4LCA2NDAsIDM2MCwgMSwgMik7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VnA4Q291bnQwNjQweDAzNjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgY291bnQoVlA4LCA2NDAsIDM2MCwgMiwgMik7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0VnA4R29vZzBRdWFsMDY0MHgwMzYwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHF1YWwoVlA4LCA2NDAsIDM2MCwgR09PRywgMCk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0VnA4R29vZzBQZXJmMDY0MHgwMzYwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoVlA4LCA2NDAsIDM2MCwgR09PRywgMCk7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VnA4R29vZzFRdWFsMDY0MHgwMzYwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHF1YWwoVlA4LCA2NDAsIDM2MCwgR09PRywgMSk7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VnA4R29vZzFQZXJmMDY0MHgwMzYwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoVlA4LCA2NDAsIDM2MCwgR09PRywgMSk7IH0KKwogICAgIHB1YmxpYyB2b2lkIHRlc3RWcDhPdGhlcjBRdWFsMDY0MHgwMzYwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHF1YWwoVlA4LCA2NDAsIDM2MCwgT1RIRVIsIDApOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdFZwOE90aGVyMFBlcmYwNjQweDAzNjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihWUDgsIDY0MCwgMzYwLCBPVEhFUiwgMCk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0VnA4T3RoZXIxUXVhbDA2NDB4MDM2MCgpIHRocm93cyBFeGNlcHRpb24geyBxdWFsKFZQOCwgNjQwLCAzNjAsIE9USEVSLCAxKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RWcDhPdGhlcjFQZXJmMDY0MHgwMzYwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoVlA4LCA2NDAsIDM2MCwgT1RIRVIsIDEpOyB9Ci0gICAgcHVibGljIHZvaWQgdGVzdFZwOENvdW50MTI4MHgwNzIwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IGNvdW50KFZQOCwgMTI4MCwgNzIwLCAxLCAyKTsgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RWcDhDb3VudDEyODB4MDcyMCgpIHRocm93cyBFeGNlcHRpb24geyBjb3VudChWUDgsIDEyODAsIDcyMCwgMiwgMik7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0VnA4R29vZzBRdWFsMTI4MHgwNzIwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHF1YWwoVlA4LCAxMjgwLCA3MjAsIEdPT0csIDApOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdFZwOEdvb2cwUGVyZjEyODB4MDcyMCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKFZQOCwgMTI4MCwgNzIwLCBHT09HLCAwKTsgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RWcDhHb29nMVF1YWwxMjgweDA3MjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcXVhbChWUDgsIDEyODAsIDcyMCwgR09PRywgMSk7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VnA4R29vZzFQZXJmMTI4MHgwNzIwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoVlA4LCAxMjgwLCA3MjAsIEdPT0csIDEpOyB9CisKICAgICBwdWJsaWMgdm9pZCB0ZXN0VnA4T3RoZXIwUXVhbDEyODB4MDcyMCgpIHRocm93cyBFeGNlcHRpb24geyBxdWFsKFZQOCwgMTI4MCwgNzIwLCBPVEhFUiwgMCk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0VnA4T3RoZXIwUGVyZjEyODB4MDcyMCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKFZQOCwgMTI4MCwgNzIwLCBPVEhFUiwgMCk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0VnA4T3RoZXIxUXVhbDEyODB4MDcyMCgpIHRocm93cyBFeGNlcHRpb24geyBxdWFsKFZQOCwgMTI4MCwgNzIwLCBPVEhFUiwgMSk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0VnA4T3RoZXIxUGVyZjEyODB4MDcyMCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKFZQOCwgMTI4MCwgNzIwLCBPVEhFUiwgMSk7IH0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VnA4Q291bnQxOTIweDEwODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgY291bnQoVlA4LCAxOTIwLCAxMDgwLCAxLCAyKTsgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RWcDhDb3VudDE5MjB4MTA4MCgpIHRocm93cyBFeGNlcHRpb24geyBjb3VudChWUDgsIDE5MjAsIDEwODAsIDIsIDIpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdFZwOEdvb2cwUXVhbDE5MjB4MTA4MCgpIHRocm93cyBFeGNlcHRpb24geyBxdWFsKFZQOCwgMTkyMCwgMTA4MCwgR09PRywgMCk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0VnA4R29vZzBQZXJmMTkyMHgxMDgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoVlA4LCAxOTIwLCAxMDgwLCBHT09HLCAwKTsgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RWcDhHb29nMVF1YWwxOTIweDEwODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcXVhbChWUDgsIDE5MjAsIDEwODAsIEdPT0csIDEpOyB9CisgICAgcHVibGljIHZvaWQgdGVzdFZwOEdvb2cxUGVyZjE5MjB4MTA4MCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKFZQOCwgMTkyMCwgMTA4MCwgR09PRywgMSk7IH0KKwogICAgIHB1YmxpYyB2b2lkIHRlc3RWcDhPdGhlcjBRdWFsMTkyMHgxMDgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHF1YWwoVlA4LCAxOTIwLCAxMDgwLCBPVEhFUiwgMCk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0VnA4T3RoZXIwUGVyZjE5MjB4MTA4MCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKFZQOCwgMTkyMCwgMTA4MCwgT1RIRVIsIDApOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdFZwOE90aGVyMVF1YWwxOTIweDEwODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcXVhbChWUDgsIDE5MjAsIDEwODAsIE9USEVSLCAxKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RWcDhPdGhlcjFQZXJmMTkyMHgxMDgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoVlA4LCAxOTIwLCAxMDgwLCBPVEhFUiwgMSk7IH0KIAogICAgIC8vIFZQOSB0ZXN0cwotICAgIHB1YmxpYyB2b2lkIHRlc3RWcDlDb3VudDAzMjB4MDE4MCgpIHRocm93cyBFeGNlcHRpb24geyBjb3VudChWUDksIDMyMCwgMTgwLCAxLCA0KTsgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RWcDlDb3VudDAzMjB4MDE4MCgpIHRocm93cyBFeGNlcHRpb24geyBjb3VudChWUDksIDMyMCwgMTgwLCAyLCA0KTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RWcDlHb29nMFF1YWwwMzIweDAxODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcXVhbChWUDksIDMyMCwgMTgwLCBHT09HLCAwKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RWcDlHb29nMFBlcmYwMzIweDAxODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihWUDksIDMyMCwgMTgwLCBHT09HLCAwKTsgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RWcDlHb29nMVF1YWwwMzIweDAxODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcXVhbChWUDksIDMyMCwgMTgwLCBHT09HLCAxKTsgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RWcDlHb29nMVBlcmYwMzIweDAxODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihWUDksIDMyMCwgMTgwLCBHT09HLCAxKTsgfQorCiAgICAgcHVibGljIHZvaWQgdGVzdFZwOU90aGVyMFF1YWwwMzIweDAxODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcXVhbChWUDksIDMyMCwgMTgwLCBPVEhFUiwgMCk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0VnA5T3RoZXIwUGVyZjAzMjB4MDE4MCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKFZQOSwgMzIwLCAxODAsIE9USEVSLCAwKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RWcDlPdGhlcjFRdWFsMDMyMHgwMTgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHF1YWwoVlA5LCAzMjAsIDE4MCwgT1RIRVIsIDEpOyB9CkBAIC00NzIsOSArNTQ3LDEyIEBACiAgICAgcHVibGljIHZvaWQgdGVzdFZwOU90aGVyMlBlcmYwMzIweDAxODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihWUDksIDMyMCwgMTgwLCBPVEhFUiwgMik7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0VnA5T3RoZXIzUXVhbDAzMjB4MDE4MCgpIHRocm93cyBFeGNlcHRpb24geyBxdWFsKFZQOSwgMzIwLCAxODAsIE9USEVSLCAzKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RWcDlPdGhlcjNQZXJmMDMyMHgwMTgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoVlA5LCAzMjAsIDE4MCwgT1RIRVIsIDMpOyB9Ci0gICAgcHVibGljIHZvaWQgdGVzdFZwOUNvdW50MDY0MHgwMzYwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IGNvdW50KFZQOSwgNjQwLCAzNjAsIDEsIDQpOyB9CisgICAgcHVibGljIHZvaWQgdGVzdFZwOUNvdW50MDY0MHgwMzYwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IGNvdW50KFZQOSwgNjQwLCAzNjAsIDIsIDQpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdFZwOUdvb2cwUXVhbDA2NDB4MDM2MCgpIHRocm93cyBFeGNlcHRpb24geyBxdWFsKFZQOSwgNjQwLCAzNjAsIEdPT0csIDApOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdFZwOUdvb2cwUGVyZjA2NDB4MDM2MCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKFZQOSwgNjQwLCAzNjAsIEdPT0csIDApOyB9CisgICAgcHVibGljIHZvaWQgdGVzdFZwOUdvb2cxUXVhbDA2NDB4MDM2MCgpIHRocm93cyBFeGNlcHRpb24geyBxdWFsKFZQOSwgNjQwLCAzNjAsIEdPT0csIDEpOyB9CisgICAgcHVibGljIHZvaWQgdGVzdFZwOUdvb2cxUGVyZjA2NDB4MDM2MCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKFZQOSwgNjQwLCAzNjAsIEdPT0csIDEpOyB9CisKICAgICBwdWJsaWMgdm9pZCB0ZXN0VnA5T3RoZXIwUXVhbDA2NDB4MDM2MCgpIHRocm93cyBFeGNlcHRpb24geyBxdWFsKFZQOSwgNjQwLCAzNjAsIE9USEVSLCAwKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RWcDlPdGhlcjBQZXJmMDY0MHgwMzYwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoVlA5LCA2NDAsIDM2MCwgT1RIRVIsIDApOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdFZwOU90aGVyMVF1YWwwNjQweDAzNjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcXVhbChWUDksIDY0MCwgMzYwLCBPVEhFUiwgMSk7IH0KQEAgLTQ4Myw5ICs1NjEsMTIgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0VnA5T3RoZXIyUGVyZjA2NDB4MDM2MCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKFZQOSwgNjQwLCAzNjAsIE9USEVSLCAyKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RWcDlPdGhlcjNRdWFsMDY0MHgwMzYwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHF1YWwoVlA5LCA2NDAsIDM2MCwgT1RIRVIsIDMpOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdFZwOU90aGVyM1BlcmYwNjQweDAzNjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihWUDksIDY0MCwgMzYwLCBPVEhFUiwgMyk7IH0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VnA5Q291bnQxMjgweDA3MjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgY291bnQoVlA5LCAxMjgwLCA3MjAsIDEsIDQpOyB9CisgICAgcHVibGljIHZvaWQgdGVzdFZwOUNvdW50MTI4MHgwNzIwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IGNvdW50KFZQOSwgMTI4MCwgNzIwLCAyLCA0KTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RWcDlHb29nMFF1YWwxMjgweDA3MjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcXVhbChWUDksIDEyODAsIDcyMCwgR09PRywgMCk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0VnA5R29vZzBQZXJmMTI4MHgwNzIwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoVlA5LCAxMjgwLCA3MjAsIEdPT0csIDApOyB9CisgICAgcHVibGljIHZvaWQgdGVzdFZwOUdvb2cxUXVhbDEyODB4MDcyMCgpIHRocm93cyBFeGNlcHRpb24geyBxdWFsKFZQOSwgMTI4MCwgNzIwLCBHT09HLCAxKTsgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RWcDlHb29nMVBlcmYxMjgweDA3MjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihWUDksIDEyODAsIDcyMCwgR09PRywgMSk7IH0KKwogICAgIHB1YmxpYyB2b2lkIHRlc3RWcDlPdGhlcjBRdWFsMTI4MHgwNzIwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHF1YWwoVlA5LCAxMjgwLCA3MjAsIE9USEVSLCAwKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RWcDlPdGhlcjBQZXJmMTI4MHgwNzIwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoVlA5LCAxMjgwLCA3MjAsIE9USEVSLCAwKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RWcDlPdGhlcjFRdWFsMTI4MHgwNzIwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHF1YWwoVlA5LCAxMjgwLCA3MjAsIE9USEVSLCAxKTsgfQpAQCAtNDk0LDkgKzU3NSwxMiBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RWcDlPdGhlcjJQZXJmMTI4MHgwNzIwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoVlA5LCAxMjgwLCA3MjAsIE9USEVSLCAyKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RWcDlPdGhlcjNRdWFsMTI4MHgwNzIwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHF1YWwoVlA5LCAxMjgwLCA3MjAsIE9USEVSLCAzKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RWcDlPdGhlcjNQZXJmMTI4MHgwNzIwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoVlA5LCAxMjgwLCA3MjAsIE9USEVSLCAzKTsgfQotICAgIHB1YmxpYyB2b2lkIHRlc3RWcDlDb3VudDE5MjB4MTA4MCgpIHRocm93cyBFeGNlcHRpb24geyBjb3VudChWUDksIDE5MjAsIDEwODAsIDEsIDQpOyB9CisgICAgcHVibGljIHZvaWQgdGVzdFZwOUNvdW50MTkyMHgxMDgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IGNvdW50KFZQOSwgMTkyMCwgMTA4MCwgMiwgNCk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0VnA5R29vZzBRdWFsMTkyMHgxMDgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHF1YWwoVlA5LCAxOTIwLCAxMDgwLCBHT09HLCAwKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RWcDlHb29nMFBlcmYxOTIweDEwODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihWUDksIDE5MjAsIDEwODAsIEdPT0csIDApOyB9CisgICAgcHVibGljIHZvaWQgdGVzdFZwOUdvb2cxUXVhbDE5MjB4MTA4MCgpIHRocm93cyBFeGNlcHRpb24geyBxdWFsKFZQOSwgMTkyMCwgMTA4MCwgR09PRywgMSk7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VnA5R29vZzFQZXJmMTkyMHgxMDgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoVlA5LCAxOTIwLCAxMDgwLCBHT09HLCAxKTsgfQorCiAgICAgcHVibGljIHZvaWQgdGVzdFZwOU90aGVyMFF1YWwxOTIweDEwODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcXVhbChWUDksIDE5MjAsIDEwODAsIE9USEVSLCAwKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RWcDlPdGhlcjBQZXJmMTkyMHgxMDgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHBlcmYoVlA5LCAxOTIwLCAxMDgwLCBPVEhFUiwgMCk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0VnA5T3RoZXIxUXVhbDE5MjB4MTA4MCgpIHRocm93cyBFeGNlcHRpb24geyBxdWFsKFZQOSwgMTkyMCwgMTA4MCwgT1RIRVIsIDEpOyB9CkBAIC01MDUsOSArNTg5LDEyIEBACiAgICAgcHVibGljIHZvaWQgdGVzdFZwOU90aGVyMlBlcmYxOTIweDEwODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihWUDksIDE5MjAsIDEwODAsIE9USEVSLCAyKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RWcDlPdGhlcjNRdWFsMTkyMHgxMDgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHF1YWwoVlA5LCAxOTIwLCAxMDgwLCBPVEhFUiwgMyk7IH0KICAgICBwdWJsaWMgdm9pZCB0ZXN0VnA5T3RoZXIzUGVyZjE5MjB4MTA4MCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKFZQOSwgMTkyMCwgMTA4MCwgT1RIRVIsIDMpOyB9Ci0gICAgcHVibGljIHZvaWQgdGVzdFZwOUNvdW50Mzg0MHgyMTYwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IGNvdW50KFZQOSwgMzg0MCwgMjE2MCwgMSwgNCk7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VnA5Q291bnQzODQweDIxNjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgY291bnQoVlA5LCAzODQwLCAyMTYwLCAyLCA0KTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RWcDlHb29nMFF1YWwzODQweDIxNjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcXVhbChWUDksIDM4NDAsIDIxNjAsIEdPT0csIDApOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdFZwOUdvb2cwUGVyZjM4NDB4MjE2MCgpIHRocm93cyBFeGNlcHRpb24geyBwZXJmKFZQOSwgMzg0MCwgMjE2MCwgR09PRywgMCk7IH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VnA5R29vZzFRdWFsMzg0MHgyMTYwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHF1YWwoVlA5LCAzODQwLCAyMTYwLCBHT09HLCAxKTsgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RWcDlHb29nMVBlcmYzODQweDIxNjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihWUDksIDM4NDAsIDIxNjAsIEdPT0csIDEpOyB9CisKICAgICBwdWJsaWMgdm9pZCB0ZXN0VnA5T3RoZXIwUXVhbDM4NDB4MjE2MCgpIHRocm93cyBFeGNlcHRpb24geyBxdWFsKFZQOSwgMzg0MCwgMjE2MCwgT1RIRVIsIDApOyB9CiAgICAgcHVibGljIHZvaWQgdGVzdFZwOU90aGVyMFBlcmYzODQweDIxNjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgcGVyZihWUDksIDM4NDAsIDIxNjAsIE9USEVSLCAwKTsgfQogICAgIHB1YmxpYyB2b2lkIHRlc3RWcDlPdGhlcjFRdWFsMzg0MHgyMTYwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IHF1YWwoVlA5LCAzODQwLCAyMTYwLCBPVEhFUiwgMSk7IH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3ZtL0FuZHJvaWQubWsgYi90ZXN0cy92bS9BbmRyb2lkLm1rCmluZGV4IGQyOGVjMGYuLjAzM2YzZmYgMTAwNzU1Ci0tLSBhL3Rlc3RzL3ZtL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvdm0vQW5kcm9pZC5tawpAQCAtMjUsNyArMjUsNyBAQAogCiBMT0NBTF9QUk9HVUFSRF9FTkFCTEVEIDo9IGRpc2FibGVkCiAKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjb21wYXRpYmlsaXR5LWRldmljZS11dGlsIGFuZHJvaWQtc3VwcG9ydC10ZXN0CitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQgYW5kcm9pZHgudGVzdC5ydWxlcwogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKQEAgLTM2LDQgKzM2LDQgQEAKIAogTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAogCi1pbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKK2luY2x1ZGUgJChCVUlMRF9DVFNfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL3Rlc3RzL3ZtL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy92bS9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGNiZDJjOTAuLmEwODIyOGIgMTAwNzU1Ci0tLSBhL3Rlc3RzL3ZtL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvdm0vQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjQsNyArMjQsNyBAQAogCiAgICAgPCEtLSAgc2VsZi1pbnN0cnVtZW50aW5nIHRlc3QgcGFja2FnZS4gLS0+CiAgICAgPGluc3RydW1lbnRhdGlvbgotICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICBhbmRyb2lkOmxhYmVsPSJDVFMgVk0gdGVzdCBjYXNlcyIKICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLnZtLmN0cyIgPgogICAgIDwvaW5zdHJ1bWVudGF0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvdm0vQW5kcm9pZFRlc3QueG1sIGIvdGVzdHMvdm0vQW5kcm9pZFRlc3QueG1sCmluZGV4IGM2ZjIwNTguLjQwMzUzNDkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3ZtL0FuZHJvaWRUZXN0LnhtbAorKysgYi90ZXN0cy92bS9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIENUUyBWTSB0ZXN0IGNhc2VzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iY3RzIiAvPgogICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0iY29tcG9uZW50IiB2YWx1ZT0iYXJ0IiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CmRpZmYgLS1naXQgYS90ZXN0cy92ci9BbmRyb2lkLm1rIGIvdGVzdHMvdnIvQW5kcm9pZC5tawppbmRleCBlYTQ3ZDJiLi5kOTM5ZjBiIDEwMDY0NAotLS0gYS90ZXN0cy92ci9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL3ZyL0FuZHJvaWQubWsKQEAgLTI3LDcgKzI3LDkgQEAKICMgV2hlbiBidWlsdCwgZXhwbGljaXRseSBwdXQgaXQgaW4gdGhlIGRhdGEgcGFydGl0aW9uLgogTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEFfQVBQUykKIAotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwgY3RzdGVzdHJ1bm5lciBsZWdhY3ktYW5kcm9pZC10ZXN0CitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY3RzdGVzdHJ1bm5lci1heHQgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQKKworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lci5zdHVicyBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicwogCiBMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdHN2cmV4dGVuc2lvbnNfam5pIGxpYm5hdGl2ZWhlbHBlcl9jb21wYXRfbGliYysrCiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3ZyL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy92ci9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDEyNzE2NjUuLmNjNjBiZDIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3ZyL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvdnIvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjMsNyArMjMsNyBAQAogICAgIDx1c2VzLXNkayBhbmRyb2lkOm1pblNka1ZlcnNpb249IjE0IiAvPgogICAgIDx1c2VzLWZlYXR1cmUgYW5kcm9pZDpnbEVzVmVyc2lvbj0iMHgwMDAyMDAwMCIvPgogICAgIDxpbnN0cnVtZW50YXRpb24KLSAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLnZyLmN0cyIgPgogICAgICAgICA8bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0ibGlzdGVuZXIiCiAgICAgICAgICAgICBhbmRyb2lkOnZhbHVlPSJjb20uYW5kcm9pZC5jdHMucnVubmVyLkN0c1Rlc3RSdW5MaXN0ZW5lciIgLz4KZGlmZiAtLWdpdCBhL3Rlc3RzL3ZyL2puaS9WckV4dGVuc2lvbnNKbmkuY3BwIGIvdGVzdHMvdnIvam5pL1ZyRXh0ZW5zaW9uc0puaS5jcHAKaW5kZXggNmYzMDRiOC4uNDQ5NTYyMSAxMDA2NDQKLS0tIGEvdGVzdHMvdnIvam5pL1ZyRXh0ZW5zaW9uc0puaS5jcHAKKysrIGIvdGVzdHMvdnIvam5pL1ZyRXh0ZW5zaW9uc0puaS5jcHAKQEAgLTIyLDcgKzIyLDkgQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlX2J1ZmZlci5oPgogI2luY2x1ZGUgPGFuZHJvaWQvbG9nLmg+CisjaW5jbHVkZSA8Y21hdGg+CiAjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHNzdHJlYW0+CiAKICNkZWZpbmUgIExPR19UQUcgICAgIlZyRXh0ZW5zaW9uc0puaSIKICNkZWZpbmUgIExPR1YoLi4uKSAgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19WRVJCT1NFLExPR19UQUcsX19WQV9BUkdTX18pCkBAIC02Miw2ICs2NCw5IEBACiAjZGVmaW5lIEdMX01BUF9QRVJTSVNURU5UX0JJVF9FWFQgMHgwMDQwCiAjZGVmaW5lIEdMX01BUF9DT0hFUkVOVF9CSVRfRVhUICAgMHgwMDgwCiAKKy8vIERlY2xhcmUgdG9rZW5zIGFkZGVkIGFzIGEgcGFydCBvZiBFR0xfRVhUX2ltYWdlX2dsX2NvbG9yc3BhY2UuCisjZGVmaW5lIEVHTF9HTF9DT0xPUlNQQUNFX0RFRkFVTFRfRVhUIDB4MzE0RAorCiAjZGVmaW5lIExPQURfUFJPQyhOQU1FLCBUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgTkFNRSA9IHJlaW50ZXJwcmV0X2Nhc3Q8VFlQRT4oZWdsR2V0UHJvY0FkZHJlc3MoIyBOQU1FKSkKIApAQCAtODEsNiArODYsMTggQEAKICAgICBBU1NFUlQoKGEpICE9IChiKSwgImFzc2VydCBmYWlsZWQgb24gKCIgI2EgIikgYXQgIiBfX0ZJTEVfXyAiOiVkIiwgX19MSU5FX18pCiAjZGVmaW5lIEFTU0VSVF9HVChhLCBiKSBcCiAgICAgQVNTRVJUKChhKSA+IChiKSwgImFzc2VydCBmYWlsZWQgb24gKCIgI2EgIikgYXQgIiBfX0ZJTEVfXyAiOiVkIiwgX19MSU5FX18pCisjZGVmaW5lIEFTU0VSVF9ORUFSX1JHQkEoYSwgYiwgZGVsdGEpIFwKKyAgICBBU1NFUlQoYXJlTmVhclJnYmEoYSwgYiwgZGVsdGEpLCAgXAorICAgICAgICAgICAiYXNzZXJ0IGZhaWxlZCBvbiAoIiAjYSAiKSBhdCAiIF9fRklMRV9fICI6JWQiLCBfX0xJTkVfXykKKworYm9vbCBhcmVOZWFyUmdiYShpbnQzMl90IGFjdHVhbCwgaW50MzJfdCBleHBlY3RlZCwgaW50IGRlbHRhKSB7CisgICAgZm9yIChpbnQgc2hpZnQgPSAwOyBzaGlmdCA8IDMyOyBzaGlmdCArPSA4KSB7CisgICAgICAgIGlmIChzdGQ6OmFicygoYWN0dWFsID4+IHNoaWZ0ICYgMHhGRikgLSAoZXhwZWN0ZWQgPj4gc2hpZnQgJiAweEZGKSkgPiBkZWx0YSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQogCiB2b2lkIGZhaWwoSk5JRW52KiBlbnYsIGNvbnN0IGNoYXIqIGZvcm1hdCwgLi4uKSB7CiAgICAgdmFfbGlzdCBhcmdzOwpAQCAtOTksOCArMTE2LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuc2FtcGxlcykgewogICAgIEFTU0VSVF9HVChkZXNjLmxheWVycywgMSk7CiAgICAgQUhhcmR3YXJlQnVmZmVyKiBod2J1ZmZlciA9IG51bGxwdHI7Ci0gICAgaW50IGVycm9yID0gQUhhcmR3YXJlQnVmZmVyX2FsbG9jYXRlKCZkZXNjLCAmaHdidWZmZXIpOwotICAgIEFTU0VSVF9GQUxTRShlcnJvcik7CisgICAgLy8gSWYgdGhlIGZvcm1hdCBpcyB1bnN1cHBvcnRlZCBhbmQgYWxsb2NhdGlvbiBmYWlscywgc2tpcCB0aGUgdGVzdC4KKyAgICBpZiAoQUhhcmR3YXJlQnVmZmVyX2FsbG9jYXRlKCZkZXNjLCAmaHdidWZmZXIpICE9IE5PX0VSUk9SKSByZXR1cm47CiAgICAgLy8gQ3JlYXRlIEVHTENsaWVudEJ1ZmZlciBmcm9tIHRoZSBBSGFyZHdhcmVCdWZmZXIuCiAgICAgRUdMQ2xpZW50QnVmZmVyIG5hdGl2ZV9idWZmZXIgPSBlZ2xHZXROYXRpdmVDbGllbnRCdWZmZXJBTkRST0lEKGh3YnVmZmVyKTsKICAgICBBU1NFUlRfVFJVRShuYXRpdmVfYnVmZmVyKTsKQEAgLTE2OSw2ICsxODYsOCBAQAogICAgIGNvbnN0IGludCBmb3JtYXRzW10gPSB7CiAgICAgICBBSEFSRFdBUkVCVUZGRVJfRk9STUFUX1I1RzZCNV9VTk9STSwKICAgICAgIEFIQVJEV0FSRUJVRkZFUl9GT1JNQVRfUjhHOEI4QThfVU5PUk0sCisgICAgICBBSEFSRFdBUkVCVUZGRVJfRk9STUFUX1IxMEcxMEIxMEEyX1VOT1JNLAorICAgICAgQUhBUkRXQVJFQlVGRkVSX0ZPUk1BVF9SMTZHMTZCMTZBMTZfRkxPQVQsCiAgICAgICAvLyBEbyBub3QgdGVzdCBBSEFSRFdBUkVCVUZGRVJfRk9STUFUX0JMT0IsIGl0IGlzbid0IGNvbG9yLXJlbmRlcmFibGUuCiAgICAgfTsKICAgICBjb25zdCBpbnQgc2FtcGxlc1tdID0gezEsIDIsIDR9OwpAQCAtMjQ2LDcgKzI2NSw4IEBACiAgICAgSk5JRW52KiBlbnYsIGpjbGFzcyAvKiB1bnVzZWQgKi8pIHsKICAgICAvLyBGaXJzdCwgY2hlY2sgZm9yIEVYVF9leHRlcm5hbF9idWZmZXIgaW4gdGhlIGV4dGVuc2lvbiBzdHJpbmcuCiAgICAgYXV0byBleHRzID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oZ2xHZXRTdHJpbmcoR0xfRVhURU5TSU9OUykpOwotICAgIEFTU0VSVF9UUlVFKGV4dHMgJiYgc3Ryc3RyKGV4dHMsICJHTF9FWFRfZXh0ZXJuYWxfYnVmZmVyIikpOworICAgIEFTU0VSVF9UUlVFKGV4dHMpOworICAgIGlmIChzdHJzdHIoZXh0cywgIkdMX0VYVF9leHRlcm5hbF9idWZmZXIiKSA9PSBudWxscHRyKSByZXR1cm47CiAgICAgLy8gTmV4dCwgbG9hZCBlbnRyeSBwb2ludHMgcHJvdmlkZWQgYnkgZXh0ZW5zaW9ucy4KICAgICBMT0FEX1BST0MoZWdsR2V0TmF0aXZlQ2xpZW50QnVmZmVyQU5EUk9JRCwgUEZORUdMR0VUTkFUSVZFQ0xJRU5UQlVGRkVSQU5EUk9JRCk7CiAgICAgQVNTRVJUX05FKGVnbEdldE5hdGl2ZUNsaWVudEJ1ZmZlckFORFJPSUQsIG51bGxwdHIpOwpAQCAtMjY2LDMgKzI4Niw0MDEgQEAKICAgICB0ZXN0RXh0ZXJuYWxCdWZmZXIoZW52LCB1c2FnZSwgZmFsc2UsIHRlc3Rfc3RyaW5nKTsKICAgICB0ZXN0RXh0ZXJuYWxCdWZmZXIoZW52LCB1c2FnZSwgdHJ1ZSwgdGVzdF9zdHJpbmcpOwogfQorCitjb25zdCBHTGNoYXIqIGNvbnN0IGtTcmdiVmVydGV4Q29kZSA9IFIiKAorICAgIC8vIHZlcnRleCBwb3NpdGlvbiBpbiBjbGlwIHNwYWNlICgtMS4uMSkKKyAgICBhdHRyaWJ1dGUgdmVjNCBwb3NpdGlvbjsKKyAgICB2YXJ5aW5nIG1lZGl1bXAgdmVjMiB1djsKKyAgICB2b2lkIG1haW4oKSB7CisgICAgICBnbF9Qb3NpdGlvbiA9IHBvc2l0aW9uOworICAgICAgdXYgPSB2ZWMyKDAuNSAqIChwb3NpdGlvbi54ICsgMS4wKSwgMC41KTsKKyAgICB9KSI7CisKK2NvbnN0IEdMY2hhciogY29uc3Qga1NyZ2JGcmFnbWVudENvZGUgPSBSIigKKyAgICB2YXJ5aW5nIG1lZGl1bXAgdmVjMiB1djsKKyAgICB1bmlmb3JtIHNhbXBsZXIyRCB0ZXg7CisgICAgdm9pZCBtYWluKCkgeworICAgICAgZ2xfRnJhZ0NvbG9yID0gdGV4dHVyZTJEKHRleCwgdXYpOworICAgIH0pIjsKKworc3RhdGljIGlubGluZSBmbG9hdCBTcmdiQ2hhbm5lbFRvTGluZWFyKGZsb2F0IGNzKSB7CisgICAgaWYgKGNzIDw9IDAuMDQwNDUpCisgICAgICAgIHJldHVybiBjcyAvIDEyLjkyZjsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBzdGQ6OnBvdygoY3MgKyAwLjA1NWYpIC8gMS4wNTVmLCAyLjRmKTsKK30KKworc3RhdGljIGlubGluZSBmbG9hdCBMaW5lYXJDaGFubmVsVG9TcmdiKGZsb2F0IGNzKSB7CisgICAgaWYgKGNzIDw9IDAuMGYpCisgICAgICAgIHJldHVybiAwLjBmOworICAgIGVsc2UgaWYgKGNzIDwgMC4wMDMxMzA4ZikKKyAgICAgICAgcmV0dXJuIDEyLjkyZiAqIGNzOworICAgIGVsc2UgaWYgKGNzIDwgMS4wZikKKyAgICAgICAgcmV0dXJuIDEuMDU1ZiAqIHN0ZDo6cG93KGNzLCAwLjQxNjY2ZikgLSAwLjA1NWY7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMS4wZjsKK30KKworc3RhdGljIHVpbnQzMl90IFNyZ2JDb2xvclRvTGluZWFyKHVpbnQzMl90IGNvbG9yKSB7CisgICAgZmxvYXQgciA9IFNyZ2JDaGFubmVsVG9MaW5lYXIoKGNvbG9yICYgMHhmZikgLyAyNTUuMGYpOworICAgIGZsb2F0IGcgPSBTcmdiQ2hhbm5lbFRvTGluZWFyKCgoY29sb3IgPj4gOCkgJiAweGZmKSAvIDI1NS4wZik7CisgICAgZmxvYXQgYiA9IFNyZ2JDaGFubmVsVG9MaW5lYXIoKChjb2xvciA+PiAxNikgJiAweGZmKSAvIDI1NS4wZik7CisgICAgdWludDMyX3QgcjggPSByICogMjU1LjBmOworICAgIHVpbnQzMl90IGc4ID0gZyAqIDI1NS4wZjsKKyAgICB1aW50MzJfdCBiOCA9IGIgKiAyNTUuMGY7CisgICAgdWludDMyX3QgYTggPSBjb2xvciA+PiAyNDsKKyAgICByZXR1cm4gKGE4IDw8IDI0KSB8IChiOCA8PCAxNikgfCAoZzggPDwgOCkgfCByODsKK30KKworc3RhdGljIHVpbnQzMl90IExpbmVhckNvbG9yVG9TcmdiKHVpbnQzMl90IGNvbG9yKSB7CisgICAgZmxvYXQgciA9IExpbmVhckNoYW5uZWxUb1NyZ2IoKGNvbG9yICYgMHhmZikgLyAyNTUuMGYpOworICAgIGZsb2F0IGcgPSBMaW5lYXJDaGFubmVsVG9TcmdiKCgoY29sb3IgPj4gOCkgJiAweGZmKSAvIDI1NS4wZik7CisgICAgZmxvYXQgYiA9IExpbmVhckNoYW5uZWxUb1NyZ2IoKChjb2xvciA+PiAxNikgJiAweGZmKSAvIDI1NS4wZik7CisgICAgdWludDMyX3QgcjggPSByICogMjU1LjBmOworICAgIHVpbnQzMl90IGc4ID0gZyAqIDI1NS4wZjsKKyAgICB1aW50MzJfdCBiOCA9IGIgKiAyNTUuMGY7CisgICAgdWludDMyX3QgYTggPSBjb2xvciA+PiAyNDsKKyAgICByZXR1cm4gKGE4IDw8IDI0KSB8IChiOCA8PCAxNikgfCAoZzggPDwgOCkgfCByODsKK30KKworc3RhdGljIHVpbnQzMl90IExlcnBDb2xvcih1aW50MzJfdCBjb2xvcjAsIHVpbnQzMl90IGNvbG9yMSwgZmxvYXQgdCkgeworICAgIGZsb2F0IHIwID0gKGNvbG9yMCAmIDB4ZmYpIC8gMjU1LjBmOworICAgIGZsb2F0IGcwID0gKChjb2xvcjAgPj4gOCkgJiAweGZmKSAvIDI1NS4wZjsKKyAgICBmbG9hdCBiMCA9ICgoY29sb3IwID4+IDE2KSAmIDB4ZmYpIC8gMjU1LjBmOworICAgIGZsb2F0IGEwID0gKChjb2xvcjAgPj4gMjQpICYgMHhmZikgLyAyNTUuMGY7CisgICAgZmxvYXQgcjEgPSAoY29sb3IxICYgMHhmZikgLyAyNTUuMGY7CisgICAgZmxvYXQgZzEgPSAoKGNvbG9yMSA+PiA4KSAmIDB4ZmYpIC8gMjU1LjBmOworICAgIGZsb2F0IGIxID0gKChjb2xvcjEgPj4gMTYpICYgMHhmZikgLyAyNTUuMGY7CisgICAgZmxvYXQgYTEgPSAoKGNvbG9yMSA+PiAyNCkgJiAweGZmKSAvIDI1NS4wZjsKKyAgICB1aW50MzJfdCByOCA9IChyMCAqICgxLjBmIC0gdCkgKyByMSAqIHQpICogMjU1LjBmOworICAgIHVpbnQzMl90IGc4ID0gKGcwICogKDEuMGYgLSB0KSArIGcxICogdCkgKiAyNTUuMGY7CisgICAgdWludDMyX3QgYjggPSAoYjAgKiAoMS4wZiAtIHQpICsgYjEgKiB0KSAqIDI1NS4wZjsKKyAgICB1aW50MzJfdCBhOCA9IChhMCAqICgxLjBmIC0gdCkgKyBhMSAqIHQpICogMjU1LjBmOworICAgIHJldHVybiAoYTggPDwgMjQpIHwgKGI4IDw8IDE2KSB8IChnOCA8PCA4KSB8IHI4OworfQorCisvLyBDaG9vc2UgYW4gb2RkLW51bWJlcmVkIGZyYW1lYnVmZmVyIHdpZHRoIHNvIHRoYXQgd2UgY2FuCisvLyBleHRyYWN0IHRoZSBtaWRkbGUgcGl4ZWwgb2YgYSBncmFkaWVudC4KK2NvbnN0ZXhwciB1aW50MzJfdCBrRnJhbWVidWZmZXJXaWR0aCA9IDMxOworCisvLyBEZWNsYXJlIHRoZSBwaXhlbCBkYXRhIGZvciB0aGUgMngxIHRleHR1cmUuCisvLyBDb2xvciBjb21wb25lbnRzIGFyZSBvcmRlcmVkIGxpa2UgdGhpczogQUFCQkdHUlIKK2NvbnN0ZXhwciB1aW50MzJfdCBrVGV4dHVyZURhdGFbXSA9IHsKKyAgICAweGZmODAwMDAwLCAgLy8gSGFsZi1CbHVlCisgICAgMHhmZjAwMDA4MCwgIC8vIEhhbGYtUmVkCit9OworY29uc3RleHByIHVpbnQzMl90IGtUZXh0dXJlV2lkdGggPSBzaXplb2Yoa1RleHR1cmVEYXRhKSAvIHNpemVvZihrVGV4dHVyZURhdGFbMF0pOworCisvLyBEZWNsYXJlIGV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIG1pZGRsZSBwaXhlbCBmb3IgdmFyaW91cyBzYW1wbGluZyBiZWhhdmlvcnMuCitjb25zdCB1aW50MzJfdCBrRXhwZWN0ZWRNaWRkbGVQaXhlbF9Ob1NyZ2IgPSBMZXJwQ29sb3Ioa1RleHR1cmVEYXRhWzBdLCBrVGV4dHVyZURhdGFbMV0sIDAuNWYpOworY29uc3QgdWludDMyX3Qga0V4cGVjdGVkTWlkZGxlUGl4ZWxfTGluZWFyaXplQWZ0ZXJGaWx0ZXJpbmcgPQorICAgIFNyZ2JDb2xvclRvTGluZWFyKGtFeHBlY3RlZE1pZGRsZVBpeGVsX05vU3JnYik7Citjb25zdCB1aW50MzJfdCBrRXhwZWN0ZWRNaWRkbGVQaXhlbF9MaW5lYXJpemVCZWZvcmVGaWx0ZXJpbmcgPQorICAgIExlcnBDb2xvcihTcmdiQ29sb3JUb0xpbmVhcihrVGV4dHVyZURhdGFbMF0pLCBTcmdiQ29sb3JUb0xpbmVhcihrVGV4dHVyZURhdGFbMV0pLCAwLjVmKTsKKworLy8gRGVjbGFyZSBleHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBmaW5hbCBwaXhlbCBjb2xvciBmb3IgdmFyaW91cyBibGVuZGluZyBiZWhhdmlvcnMuCitjb25zdGV4cHIgdWludDMyX3Qga0JsZW5kRGVzdENvbG9yID0gMHhmZjAwMDA4MDsKK2NvbnN0ZXhwciB1aW50MzJfdCBrQmxlbmRTb3VyY2VDb2xvciA9IDB4ODA4MDAwMDA7Citjb25zdCB1aW50MzJfdCBrRXhwZWN0ZWRCbGVuZGVkUGl4ZWxfTm9TcmdiID0gTGVycENvbG9yKGtCbGVuZFNvdXJjZUNvbG9yLCBrQmxlbmREZXN0Q29sb3IsIDAuNWYpOworY29uc3QgdWludDMyX3Qga0V4cGVjdGVkQmxlbmRlZFBpeGVsX1NyZ2IgPQorICAgIExpbmVhckNvbG9yVG9TcmdiKExlcnBDb2xvcihrQmxlbmRTb3VyY2VDb2xvciwgU3JnYkNvbG9yVG9MaW5lYXIoa0JsZW5kRGVzdENvbG9yKSwgMC41ZikpOworCisvLyBEZWZpbmUgYSBzZXQgb2YgdGVzdCBmbGFncy4gTm90IHVzaW5nIGFuIGVudW0gdG8gYXZvaWQgbG90cyBvZiBjYXN0cy4KK25hbWVzcGFjZSBTcmdiRmxhZyB7Citjb25zdGV4cHIgdWludDMyX3Qga0hhcmR3YXJlQnVmZmVyID0gMSA8PCAwOworY29uc3RleHByIHVpbnQzMl90IGtTcmdiRm9ybWF0ID0gMSA8PCAxOworY29uc3RleHByIHVpbnQzMl90IGtFZ2xDb2xvcnNwYWNlRGVmYXVsdCA9IDEgPDwgMjsKK2NvbnN0ZXhwciB1aW50MzJfdCBrRWdsQ29sb3JzcGFjZUxpbmVhciA9IDEgPDwgMzsKK2NvbnN0ZXhwciB1aW50MzJfdCBrRWdsQ29sb3JzcGFjZVNyZ2IgPSAxIDw8IDQ7Cit9ICAvLyBuYW1lc3BhY2UgU3JnYkZsYWcKKworc3RhdGljIHZvaWQgY29uZmlndXJlRWdsQ29sb3JzcGFjZShFR0xpbnQgYXR0cnNbNF0sIHVpbnQzMl90IHNyZ2JfZmxhZ3MpIHsKKyAgICBpZiAoc3JnYl9mbGFncyAmIFNyZ2JGbGFnOjprRWdsQ29sb3JzcGFjZURlZmF1bHQpIHsKKyAgICAgICAgYXR0cnNbMF0gPSBFR0xfR0xfQ09MT1JTUEFDRV9LSFI7CisgICAgICAgIGF0dHJzWzFdID0gRUdMX0dMX0NPTE9SU1BBQ0VfREVGQVVMVF9FWFQ7CisgICAgfSBlbHNlIGlmIChzcmdiX2ZsYWdzICYgU3JnYkZsYWc6OmtFZ2xDb2xvcnNwYWNlTGluZWFyKSB7CisgICAgICAgIGF0dHJzWzBdID0gRUdMX0dMX0NPTE9SU1BBQ0VfS0hSOworICAgICAgICBhdHRyc1sxXSA9IEVHTF9HTF9DT0xPUlNQQUNFX0xJTkVBUl9LSFI7CisgICAgfSBlbHNlIGlmIChzcmdiX2ZsYWdzICYgU3JnYkZsYWc6OmtFZ2xDb2xvcnNwYWNlU3JnYikgeworICAgICAgICBhdHRyc1swXSA9IEVHTF9HTF9DT0xPUlNQQUNFX0tIUjsKKyAgICAgICAgYXR0cnNbMV0gPSBFR0xfR0xfQ09MT1JTUEFDRV9TUkdCX0tIUjsKKyAgICB9IGVsc2UgeworICAgICAgICBhdHRyc1swXSA9IEVHTF9OT05FOworICAgICAgICBhdHRyc1sxXSA9IEVHTF9OT05FOworICAgIH0KKyAgICBhdHRyc1syXSA9IEVHTF9OT05FOworICAgIGF0dHJzWzNdID0gRUdMX05PTkU7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50U3JnYkZsYWdzKHN0ZDo6b3N0cmVhbSYgb3V0LCB1aW50MzJfdCBzcmdiX2ZsYWdzKSB7CisgICAgaWYgKHNyZ2JfZmxhZ3MgJiBTcmdiRmxhZzo6a0hhcmR3YXJlQnVmZmVyKSB7CisgICAgICAgIG91dCA8PCAiIEFIYXJkd2FyZUJ1ZmZlciI7CisgICAgfQorICAgIGlmIChzcmdiX2ZsYWdzICYgU3JnYkZsYWc6OmtTcmdiRm9ybWF0KSB7CisgICAgICAgIG91dCA8PCAiIEdMX1NSR0JfQUxQSEEiOworICAgIH0KKyAgICBpZiAoc3JnYl9mbGFncyAmIFNyZ2JGbGFnOjprRWdsQ29sb3JzcGFjZURlZmF1bHQpIHsKKyAgICAgICAgb3V0IDw8ICIgRUdMX0dMX0NPTE9SU1BBQ0VfREVGQVVMVF9LSFIiOworICAgIH0KKyAgICBpZiAoc3JnYl9mbGFncyAmIFNyZ2JGbGFnOjprRWdsQ29sb3JzcGFjZUxpbmVhcikgeworICAgICAgICBvdXQgPDwgIiBFR0xfR0xfQ09MT1JTUEFDRV9MSU5FQVJfS0hSIjsKKyAgICB9CisgICAgaWYgKHNyZ2JfZmxhZ3MgJiBTcmdiRmxhZzo6a0VnbENvbG9yc3BhY2VTcmdiKSB7CisgICAgICAgIG91dCA8PCAiIEVHTF9HTF9DT0xPUlNQQUNFX1NSR0JfS0hSIjsKKyAgICB9Cit9CisKKy8vIERyYXdzIGEgZ3JhZGllbnQgYW5kIGV4dHJhY3RzIHRoZSBtaWRkbGUgcGl4ZWwuIFJldHVybnMgdm9pZCB0byBhbGxvdyBBU1NFUlQgdG8gd29yay4KK3N0YXRpYyB2b2lkIHRlc3RMaW5lYXJNYWduaWZpY2F0aW9uKEpOSUVudiogZW52LCB1aW50MzJfdCBmbGFncywgdWludDMyX3QqIG1pZGRsZV9waXhlbCkgeworICAgIGNvbnN0IGJvb2wgdXNlX2h3YnVmZmVyID0gZmxhZ3MgJiBTcmdiRmxhZzo6a0hhcmR3YXJlQnVmZmVyOworICAgIGNvbnN0IGJvb2wgdXNlX3NyZ2JfZm9ybWF0ID0gZmxhZ3MgJiBTcmdiRmxhZzo6a1NyZ2JGb3JtYXQ7CisgICAgR0x1aW50IHNyZ2J0ZXg7CisgICAgZ2xHZW5UZXh0dXJlcygxLCAmc3JnYnRleCk7CisgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBzcmdidGV4KTsKKyAgICBpZiAodXNlX2h3YnVmZmVyKSB7CisgICAgICAgIC8vIENyZWF0ZSBhIG9uZS1kaW1lbnNpb25hbCBBSGFyZHdhcmVCdWZmZXIuCisgICAgICAgIEFIYXJkd2FyZUJ1ZmZlcl9EZXNjIGRlc2MgPSB7fTsKKyAgICAgICAgZGVzYy53aWR0aCA9IGtUZXh0dXJlV2lkdGg7CisgICAgICAgIGRlc2MuaGVpZ2h0ID0gMTsKKyAgICAgICAgZGVzYy5sYXllcnMgPSAxOworICAgICAgICBkZXNjLmZvcm1hdCA9IEFIQVJEV0FSRUJVRkZFUl9GT1JNQVRfUjhHOEI4QThfVU5PUk07CisgICAgICAgIGRlc2MudXNhZ2UgPQorICAgICAgICAgICAgICAgIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9HUFVfU0FNUExFRF9JTUFHRSB8IEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9HUFVfQ09MT1JfT1VUUFVUOworICAgICAgICBBSGFyZHdhcmVCdWZmZXIqIGh3YnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgaW50IGVycm9yID0gQUhhcmR3YXJlQnVmZmVyX2FsbG9jYXRlKCZkZXNjLCAmaHdidWZmZXIpOworICAgICAgICBBU1NFUlRfRVEoZXJyb3IsIE5PX0VSUk9SKTsKKyAgICAgICAgLy8gUG9wdWxhdGUgdGhlIHBpeGVscy4KKyAgICAgICAgdWludDMyX3QqIHBpeGVscyA9IG51bGxwdHI7CisgICAgICAgIGVycm9yID0gQUhhcmR3YXJlQnVmZmVyX2xvY2soaHdidWZmZXIsIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9DUFVfV1JJVEVfT0ZURU4sIC0xLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCoqPigmcGl4ZWxzKSk7CisgICAgICAgIEFTU0VSVF9FUShlcnJvciwgTk9fRVJST1IpOworICAgICAgICBBU1NFUlRfVFJVRShwaXhlbHMpOworICAgICAgICBtZW1jcHkocGl4ZWxzLCBrVGV4dHVyZURhdGEsIHNpemVvZihrVGV4dHVyZURhdGEpKTsKKyAgICAgICAgZXJyb3IgPSBBSGFyZHdhcmVCdWZmZXJfdW5sb2NrKGh3YnVmZmVyLCBudWxscHRyKTsKKyAgICAgICAgQVNTRVJUX0VRKGVycm9yLCBOT19FUlJPUik7CisgICAgICAgIC8vIENyZWF0ZSBFR0xDbGllbnRCdWZmZXIgZnJvbSB0aGUgQUhhcmR3YXJlQnVmZmVyLgorICAgICAgICBFR0xDbGllbnRCdWZmZXIgbmF0aXZlX2J1ZmZlciA9IGVnbEdldE5hdGl2ZUNsaWVudEJ1ZmZlckFORFJPSUQoaHdidWZmZXIpOworICAgICAgICBBU1NFUlRfVFJVRShuYXRpdmVfYnVmZmVyKTsKKyAgICAgICAgLy8gQ3JlYXRlIEVHTEltYWdlIGZyb20gRUdMQ2xpZW50QnVmZmVyLgorICAgICAgICBFR0xpbnQgYXR0cnNbNF07CisgICAgICAgIGNvbmZpZ3VyZUVnbENvbG9yc3BhY2UoYXR0cnMsIGZsYWdzKTsKKyAgICAgICAgRUdMSW1hZ2VLSFIgaW1hZ2UgPSBlZ2xDcmVhdGVJbWFnZUtIUihlZ2xHZXRDdXJyZW50RGlzcGxheSgpLCBFR0xfTk9fQ09OVEVYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xfTkFUSVZFX0JVRkZFUl9BTkRST0lELCBuYXRpdmVfYnVmZmVyLCBhdHRycyk7CisgICAgICAgIEFTU0VSVF9UUlVFKGltYWdlKTsKKyAgICAgICAgLy8gQWxsb2NhdGUgdGhlIE9wZW5HTCB0ZXh0dXJlIHVzaW5nIHRoZSBFR0xJbWFnZS4KKyAgICAgICAgZ2xFR0xJbWFnZVRhcmdldFRleHR1cmUyRE9FUyhHTF9URVhUVVJFXzJELCBpbWFnZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgR0xlbnVtIGludGVybmFsX2Zvcm1hdCA9IHVzZV9zcmdiX2Zvcm1hdCA/IEdMX1NSR0I4X0FMUEhBOF9FWFQgOiBHTF9SR0JBOF9PRVM7CisgICAgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBpbnRlcm5hbF9mb3JtYXQsIGtUZXh0dXJlV2lkdGgsIDEsIDAsIEdMX1JHQkEsCisgICAgICAgICAgICAgICAgICAgICBHTF9VTlNJR05FRF9CWVRFLCBrVGV4dHVyZURhdGEpOworICAgIH0KKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9MSU5FQVIpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX0xJTkVBUik7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9DTEFNUF9UT19FREdFKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1QsIEdMX0NMQU1QX1RPX0VER0UpOworICAgIEFTU0VSVF9FUShnbEdldEVycm9yKCksIEdMX05PX0VSUk9SKTsKKyAgICAvLyBDbGVhciB0byBhbiBpbnRlcmVzdGluZyBjb25zdGFudCBjb2xvciB0byBtYWtlIGl0IGVhc2llciB0byBzcG90IGJ1Z3MuCisgICAgZ2xDbGVhckNvbG9yKDEuMCwgMC4wLCAwLjUsIDAuMjUpOworICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgLy8gRHJhdyB0aGUgdGV4dHVyZS4KKyAgICBjb25zdCBmbG9hdCBrVHJpYW5nbGVDb29yZHNbXSA9IHstMSwgLTEsIC0xLCAxLCAxLCAtMSwgMSwgMX07CisgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBzcmdidGV4KTsKKyAgICBjb25zdCBpbnQga1Bvc2l0aW9uU2xvdCA9IDA7CisgICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKGtQb3NpdGlvblNsb3QsIDIsIEdMX0ZMT0FULCBmYWxzZSwgMCwga1RyaWFuZ2xlQ29vcmRzKTsKKyAgICBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGtQb3NpdGlvblNsb3QpOworICAgIGdsVmlld3BvcnQoMCwgMCwga0ZyYW1lYnVmZmVyV2lkdGgsIDEpOworICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9TVFJJUCwgMCwgNCk7CisgICAgLy8gUmVhZCBiYWNrIHRoZSBmcmFtZWJ1ZmZlci4KKyAgICBnbFJlYWRQaXhlbHMoa0ZyYW1lYnVmZmVyV2lkdGggLyAyLCAwLCAxLCAxLCBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCBtaWRkbGVfcGl4ZWwpOworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBmbGFnX3N0cmluZzsKKyAgICBwcmludFNyZ2JGbGFncyhmbGFnX3N0cmluZywgZmxhZ3MpOworICAgIExPR1YoIkZpbHRlcmVkIFJlc3VsdDogJTguOFggRmxhZ3MgPSVzIiwgKm1pZGRsZV9waXhlbCwgZmxhZ19zdHJpbmcuc3RyKCkuY19zdHIoKSk7CisgICAgQVNTRVJUX0VRKGdsR2V0RXJyb3IoKSwgR0xfTk9fRVJST1IpOworfQorCisvLyBCbGVuZHMgYSBjb2xvciBpbnRvIGFuIChvcHRpb25hbGx5KSBzUkdCLWVuY29kZWQgZnJhbWVidWZmZXIgYW5kIGV4dHJhY3RzIHRoZSBmaW5hbCBjb2xvci4KKy8vIFJldHVybnMgdm9pZCB0byBhbGxvdyBBU1NFUlQgdG8gd29yay4KK3N0YXRpYyB2b2lkIHRlc3RGcmFtZWJ1ZmZlckJsZW5kaW5nKEpOSUVudiogZW52LCB1aW50MzJfdCBmbGFncywgdWludDMyX3QqIGZpbmFsX2NvbG9yKSB7CisgICAgY29uc3QgYm9vbCB1c2VfaHdidWZmZXIgPSBmbGFncyAmIFNyZ2JGbGFnOjprSGFyZHdhcmVCdWZmZXI7CisgICAgY29uc3QgYm9vbCB1c2Vfc3JnYl9mb3JtYXQgPSBmbGFncyAmIFNyZ2JGbGFnOjprU3JnYkZvcm1hdDsKKyAgICBjb25zdCBib29sIG92ZXJyaWRlX2VnbF9jb2xvcnNwYWNlID0gdXNlX2h3YnVmZmVyICYmIChmbGFncyAmIFNyZ2JGbGFnOjprRWdsQ29sb3JzcGFjZVNyZ2IpOworICAgIEdMdWludCB0ZXg7CisgICAgZ2xHZW5UZXh0dXJlcygxLCAmdGV4KTsKKyAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIHRleCk7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTElORUFSKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9MSU5FQVIpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgR0xfQ0xBTVBfVE9fRURHRSk7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9DTEFNUF9UT19FREdFKTsKKyAgICAvLyBDcmVhdGUgYSAxeDEgaGFsZi1ibHVlLCBoYWxmLW9wYXF1ZSB0ZXh0dXJlLgorICAgIGNvbnN0IHVpbnQzMl90IGtUZXh0dXJlRGF0YVtdID0geworICAgICAga0JsZW5kU291cmNlQ29sb3IsCisgICAgfTsKKyAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCQSwgMSwgMSwgMCwgR0xfUkdCQSwKKyAgICAgICAgICAgICAgICAgR0xfVU5TSUdORURfQllURSwga1RleHR1cmVEYXRhKTsKKyAgICAvLyBDcmVhdGUgMXgxIGZyYW1lYnVmZmVyIG9iamVjdC4KKyAgICBHTHVpbnQgZmJvOworICAgIGdsR2VuRnJhbWVidWZmZXJzKDEsICZmYm8pOworICAgIGdsQmluZEZyYW1lYnVmZmVyKEdMX0ZSQU1FQlVGRkVSLCBmYm8pOworICAgIEdMdWludCBmYm90ZXg7CisgICAgZ2xHZW5UZXh0dXJlcygxLCAmZmJvdGV4KTsKKyAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIGZib3RleCk7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTkVBUkVTVCk7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTkVBUkVTVCk7CisgICAgaWYgKHVzZV9od2J1ZmZlcikgeworICAgICAgICBBSGFyZHdhcmVCdWZmZXJfRGVzYyBkZXNjID0ge307CisgICAgICAgIGRlc2Mud2lkdGggPSAxOworICAgICAgICBkZXNjLmhlaWdodCA9IDE7CisgICAgICAgIGRlc2MubGF5ZXJzID0gMTsKKyAgICAgICAgZGVzYy5mb3JtYXQgPSBBSEFSRFdBUkVCVUZGRVJfRk9STUFUX1I4RzhCOEE4X1VOT1JNOworICAgICAgICBkZXNjLnVzYWdlID0KKyAgICAgICAgICAgICAgICBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfR1BVX1NBTVBMRURfSU1BR0UgfCBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfR1BVX0NPTE9SX09VVFBVVDsKKyAgICAgICAgQUhhcmR3YXJlQnVmZmVyKiBod2J1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIGludCBlcnJvciA9IEFIYXJkd2FyZUJ1ZmZlcl9hbGxvY2F0ZSgmZGVzYywgJmh3YnVmZmVyKTsKKyAgICAgICAgQVNTRVJUX0VRKGVycm9yLCBOT19FUlJPUik7CisgICAgICAgIC8vIENyZWF0ZSBFR0xDbGllbnRCdWZmZXIgZnJvbSB0aGUgQUhhcmR3YXJlQnVmZmVyLgorICAgICAgICBFR0xDbGllbnRCdWZmZXIgbmF0aXZlX2J1ZmZlciA9IGVnbEdldE5hdGl2ZUNsaWVudEJ1ZmZlckFORFJPSUQoaHdidWZmZXIpOworICAgICAgICBBU1NFUlRfVFJVRShuYXRpdmVfYnVmZmVyKTsKKyAgICAgICAgLy8gQ3JlYXRlIEVHTEltYWdlIGZyb20gRUdMQ2xpZW50QnVmZmVyLgorICAgICAgICBFR0xpbnQgYXR0cnNbNF07CisgICAgICAgIGNvbmZpZ3VyZUVnbENvbG9yc3BhY2UoYXR0cnMsIGZsYWdzKTsKKyAgICAgICAgRUdMSW1hZ2VLSFIgaW1hZ2UgPSBlZ2xDcmVhdGVJbWFnZUtIUihlZ2xHZXRDdXJyZW50RGlzcGxheSgpLCBFR0xfTk9fQ09OVEVYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xfTkFUSVZFX0JVRkZFUl9BTkRST0lELCBuYXRpdmVfYnVmZmVyLCBhdHRycyk7CisgICAgICAgIEFTU0VSVF9UUlVFKGltYWdlKTsKKyAgICAgICAgLy8gQWxsb2NhdGUgdGhlIE9wZW5HTCB0ZXh0dXJlIHVzaW5nIHRoZSBFR0xJbWFnZS4KKyAgICAgICAgZ2xFR0xJbWFnZVRhcmdldFRleHR1cmUyRE9FUyhHTF9URVhUVVJFXzJELCBpbWFnZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgR0xlbnVtIGludGVybmFsX2Zvcm1hdCA9IHVzZV9zcmdiX2Zvcm1hdCA/IEdMX1NSR0I4X0FMUEhBOF9FWFQgOiBHTF9SR0JBOF9PRVM7CisgICAgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBpbnRlcm5hbF9mb3JtYXQsIDEsIDEsIDAsIEdMX1JHQkEsCisgICAgICAgICAgICAgICAgICAgICBHTF9VTlNJR05FRF9CWVRFLCBudWxscHRyKTsKKyAgICB9CisgICAgZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRChHTF9GUkFNRUJVRkZFUiwgR0xfQ09MT1JfQVRUQUNITUVOVDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHTF9URVhUVVJFXzJELCBmYm90ZXgsIDApOworICAgIEFTU0VSVF9FUShnbENoZWNrRnJhbWVidWZmZXJTdGF0dXMoR0xfRlJBTUVCVUZGRVIpLCBHTF9GUkFNRUJVRkZFUl9DT01QTEVURSk7CisgICAgQVNTRVJUX0VRKGdsR2V0RXJyb3IoKSwgR0xfTk9fRVJST1IpOworICAgIC8vIENsZWFyIHRvIGhhbGYtcmVkLgorICAgIGlmICh1c2Vfc3JnYl9mb3JtYXQgfHwgb3ZlcnJpZGVfZWdsX2NvbG9yc3BhY2UpIHsKKyAgICAgICAgZ2xDbGVhckNvbG9yKFNyZ2JDaGFubmVsVG9MaW5lYXIoMC41KSwgMC4wLCAwLjAsIDEuMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ2xDbGVhckNvbG9yKDAuNSwgMC4wLCAwLjAsIDEuMCk7CisgICAgfQorICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgLy8gU2FuaXR5IGNoZWNrIHRoZSBjbGVhcmVkIGNvbG9yLgorICAgIHVpbnQzMl90IGNsZWFyZWRfY29sb3IgPSAwOworICAgIGdsUmVhZFBpeGVscygwLCAwLCAxLCAxLCBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCAmY2xlYXJlZF9jb2xvcik7CisgICAgTE9HVigiICBDbGVhcmVkIENvbG9yOiAlOC44WCIsIGNsZWFyZWRfY29sb3IpOworICAgIEFTU0VSVF9ORUFSX1JHQkEoY2xlYXJlZF9jb2xvciwga0JsZW5kRGVzdENvbG9yLCAxKTsKKyAgICAvLyBEcmF3IHRoZSB0ZXh0dXJlLgorICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKKyAgICBnbEJsZW5kRnVuYyhHTF9TUkNfQUxQSEEsIEdMX09ORV9NSU5VU19TUkNfQUxQSEEpOworICAgIGNvbnN0IGZsb2F0IGtUcmlhbmdsZUNvb3Jkc1tdID0gey0xLCAtMSwgLTEsIDEsIDEsIC0xLCAxLCAxfTsKKyAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIHRleCk7CisgICAgY29uc3QgaW50IGtQb3NpdGlvblNsb3QgPSAwOworICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcihrUG9zaXRpb25TbG90LCAyLCBHTF9GTE9BVCwgZmFsc2UsIDAsIGtUcmlhbmdsZUNvb3Jkcyk7CisgICAgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShrUG9zaXRpb25TbG90KTsKKyAgICBnbFZpZXdwb3J0KDAsIDAsIDEsIDEpOworICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9TVFJJUCwgMCwgNCk7CisgICAgLy8gUmVhZCBiYWNrIHRoZSBmcmFtZWJ1ZmZlci4KKyAgICBnbFJlYWRQaXhlbHMoMCwgMCwgMSwgMSwgR0xfUkdCQSwgR0xfVU5TSUdORURfQllURSwgZmluYWxfY29sb3IpOworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBmbGFnX3N0cmluZzsKKyAgICBwcmludFNyZ2JGbGFncyhmbGFnX3N0cmluZywgZmxhZ3MpOworICAgIExPR1YoIkJsZW5kaW5nIFJlc3VsdDogJTguOFggRmxhZ3MgPSVzIiwgKmZpbmFsX2NvbG9yLCBmbGFnX3N0cmluZy5zdHIoKS5jX3N0cigpKTsKKyAgICBBU1NFUlRfRVEoZ2xHZXRFcnJvcigpLCBHTF9OT19FUlJPUik7Cit9CisKK2V4dGVybiAiQyIgSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTAorSmF2YV9hbmRyb2lkX3ZyX2N0c19WckV4dGVuc2lvbkJlaGF2aW9yVGVzdF9uYXRpdmVUZXN0U3JnYkJ1ZmZlcigKKyAgICBKTklFbnYqIGVudiwgamNsYXNzIC8qIHVudXNlZCAqLykgeworICAgIC8vIEZpcnN0LCBjaGVjayB0aGUgcHVibGlzaGVkIGV4dGVuc2lvbiBzdHJpbmdzIGFnYWluc3QgZXhwZWN0YXRpb25zLgorICAgIGNvbnN0IGNoYXIgKmVnbF9leHRzID0KKyAgICAgICAgZWdsUXVlcnlTdHJpbmcoZWdsR2V0Q3VycmVudERpc3BsYXkoKSwgRUdMX0VYVEVOU0lPTlMpOworICAgIExPR1YoIkVHTCBFeHRlbnNpb25zOiAlcyIsIGVnbF9leHRzKTsKKyAgICBBU1NFUlRfVFJVRShlZ2xfZXh0cyk7CisgICAgYm9vbCBlZ2xfY29sb3JzcGFjZV9zdXBwb3J0ZWQgPSBzdHJzdHIoZWdsX2V4dHMsICJFR0xfRVhUX2ltYWdlX2dsX2NvbG9yc3BhY2UiKTsKKyAgICBhdXRvIGdsX2V4dHMgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihnbEdldFN0cmluZyhHTF9FWFRFTlNJT05TKSk7CisgICAgTE9HVigiT3BlbkdMIEV4dGVuc2lvbnM6ICVzIiwgZ2xfZXh0cyk7CisgICAgQVNTRVJUX1RSVUUoZ2xfZXh0cyk7CisgICAgLy8gTG9hZCBhbmNpbGxhcnkgZW50cnkgcG9pbnRzIHByb3ZpZGVkIGJ5IGV4dGVuc2lvbnMuCisgICAgTE9BRF9QUk9DKGVnbEdldE5hdGl2ZUNsaWVudEJ1ZmZlckFORFJPSUQsCisgICAgICAgICAgICAgIFBGTkVHTEdFVE5BVElWRUNMSUVOVEJVRkZFUkFORFJPSUQpOworICAgIEFTU0VSVF9ORShlZ2xHZXROYXRpdmVDbGllbnRCdWZmZXJBTkRST0lELCBudWxscHRyKTsKKyAgICBMT0FEX1BST0MoZWdsQ3JlYXRlSW1hZ2VLSFIsIFBGTkVHTENSRUFURUlNQUdFS0hSUFJPQyk7CisgICAgQVNTRVJUX05FKGVnbENyZWF0ZUltYWdlS0hSLCBudWxscHRyKTsKKyAgICBMT0FEX1BST0MoZ2xFR0xJbWFnZVRhcmdldFRleHR1cmUyRE9FUywKKyAgICAgICAgICAgICAgUEZOR0xFR0xJTUFHRVRBUkdFVFRFWFRVUkUyRE9FU1BST0MpOworICAgIEFTU0VSVF9ORShnbEVHTEltYWdlVGFyZ2V0VGV4dHVyZTJET0VTLCBudWxscHRyKTsKKyAgICAvLyBDcmVhdGUgYSBwbGFpbiBvbGQgb25lLWRpbWVuc2lvbmFsIEZCTyB0byByZW5kZXIgdG8uCisgICAgR0x1aW50IGZibzsKKyAgICBnbEdlbkZyYW1lYnVmZmVycygxLCAmZmJvKTsKKyAgICBnbEJpbmRGcmFtZWJ1ZmZlcihHTF9GUkFNRUJVRkZFUiwgZmJvKTsKKyAgICBHTHVpbnQgZmJvdGV4OworICAgIGdsR2VuVGV4dHVyZXMoMSwgJmZib3RleCk7CisgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBmYm90ZXgpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX05FQVJFU1QpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX05FQVJFU1QpOworICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0JBLCBrRnJhbWVidWZmZXJXaWR0aCwgMSwgMCwgR0xfUkdCQSwKKyAgICAgICAgICAgICAgICAgR0xfVU5TSUdORURfQllURSwgbnVsbHB0cik7CisgICAgZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRChHTF9GUkFNRUJVRkZFUiwgR0xfQ09MT1JfQVRUQUNITUVOVDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHTF9URVhUVVJFXzJELCBmYm90ZXgsIDApOworICAgIEFTU0VSVF9FUShnbENoZWNrRnJhbWVidWZmZXJTdGF0dXMoR0xfRlJBTUVCVUZGRVIpLCBHTF9GUkFNRUJVRkZFUl9DT01QTEVURSk7CisgICAgQVNTRVJUX0VRKGdsR2V0RXJyb3IoKSwgR0xfTk9fRVJST1IpOworICAgIC8vIENvbXBpbGUgYW5kIGxpbmsgc2hhZGVycy4KKyAgICBpbnQgcHJvZ3JhbSA9IGdsQ3JlYXRlUHJvZ3JhbSgpOworICAgIGludCB2c2hhZGVyID0gZ2xDcmVhdGVTaGFkZXIoR0xfVkVSVEVYX1NIQURFUik7CisgICAgZ2xTaGFkZXJTb3VyY2UodnNoYWRlciwgMSwgJmtTcmdiVmVydGV4Q29kZSwgbnVsbHB0cik7CisgICAgZ2xDb21waWxlU2hhZGVyKHZzaGFkZXIpOworICAgIGdsQXR0YWNoU2hhZGVyKHByb2dyYW0sIHZzaGFkZXIpOworICAgIGludCBmc2hhZGVyID0gZ2xDcmVhdGVTaGFkZXIoR0xfRlJBR01FTlRfU0hBREVSKTsKKyAgICBnbFNoYWRlclNvdXJjZShmc2hhZGVyLCAxLCAma1NyZ2JGcmFnbWVudENvZGUsIG51bGxwdHIpOworICAgIGdsQ29tcGlsZVNoYWRlcihmc2hhZGVyKTsKKyAgICBnbEF0dGFjaFNoYWRlcihwcm9ncmFtLCBmc2hhZGVyKTsKKyAgICBnbExpbmtQcm9ncmFtKHByb2dyYW0pOworICAgIGludCBzdGF0dXM7CisgICAgZ2xHZXRQcm9ncmFtaXYocHJvZ3JhbSwgR0xfTElOS19TVEFUVVMsICZzdGF0dXMpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIEdMX1RSVUUpOworICAgIGdsVXNlUHJvZ3JhbShwcm9ncmFtKTsKKyAgICBBU1NFUlRfRVEoZ2xHZXRFcnJvcigpLCBHTF9OT19FUlJPUik7CisKKyAgICAvLyBGaWx0ZXJpbmcgdGVzdC4KKyAgICBMT0dWKCJFeHBlY3RlZCB2YWx1ZSBmb3IgTm9TcmdiID0gJTguOFgiLCBrRXhwZWN0ZWRNaWRkbGVQaXhlbF9Ob1NyZ2IpOworICAgIExPR1YoIkV4cGVjdGVkIHZhbHVlIGZvciAgIFNyZ2IgPSAlOC44WCIsIGtFeHBlY3RlZE1pZGRsZVBpeGVsX0xpbmVhcml6ZUJlZm9yZUZpbHRlcmluZyk7CisgICAgdWludDMyX3QgbWlkZGxlX3BpeGVsOworICAgIC8vIEZpcnN0IGRvIGEgc2FuaXR5IGNoZWNrIHdpdGggcGxhaW4gb2xkIHByZS1saW5lYXJpemVkIHRleHR1cmVzLgorICAgIHRlc3RMaW5lYXJNYWduaWZpY2F0aW9uKGVudiwgMCwgJm1pZGRsZV9waXhlbCk7CisgICAgQVNTRVJUX05FQVJfUkdCQShtaWRkbGVfcGl4ZWwsIGtFeHBlY3RlZE1pZGRsZVBpeGVsX05vU3JnYiwgMSk7CisgICAgdGVzdExpbmVhck1hZ25pZmljYXRpb24oZW52LCBTcmdiRmxhZzo6a0hhcmR3YXJlQnVmZmVyLCAmbWlkZGxlX3BpeGVsKTsKKyAgICBBU1NFUlRfTkVBUl9SR0JBKG1pZGRsZV9waXhlbCwga0V4cGVjdGVkTWlkZGxlUGl4ZWxfTm9TcmdiLCAxKTsKKyAgICAvLyBUcnkgYSAibm9ybWFsbHkgYWxsb2NhdGVkIiBPcGVuR0wgdGV4dHVyZSB3aXRoIGFuIHNSR0Igc291cmNlIGZvcm1hdC4KKyAgICB0ZXN0TGluZWFyTWFnbmlmaWNhdGlvbihlbnYsIFNyZ2JGbGFnOjprU3JnYkZvcm1hdCwgJm1pZGRsZV9waXhlbCk7CisgICAgQVNTRVJUX05FQVJfUkdCQShtaWRkbGVfcGl4ZWwsIGtFeHBlY3RlZE1pZGRsZVBpeGVsX0xpbmVhcml6ZUJlZm9yZUZpbHRlcmluZywgMSk7CisgICAgLy8gVHJ5IEVHTF9FWFRfaW1hZ2VfZ2xfY29sb3JzcGFjZS4KKyAgICBpZiAoZWdsX2NvbG9yc3BhY2Vfc3VwcG9ydGVkKSB7CisgICAgICAgIHRlc3RMaW5lYXJNYWduaWZpY2F0aW9uKGVudiwgU3JnYkZsYWc6OmtIYXJkd2FyZUJ1ZmZlciB8IFNyZ2JGbGFnOjprRWdsQ29sb3JzcGFjZURlZmF1bHQsICZtaWRkbGVfcGl4ZWwpOworICAgICAgICBBU1NFUlRfTkVBUl9SR0JBKG1pZGRsZV9waXhlbCwga0V4cGVjdGVkTWlkZGxlUGl4ZWxfTm9TcmdiLCAxKTsKKyAgICAgICAgdGVzdExpbmVhck1hZ25pZmljYXRpb24oZW52LCBTcmdiRmxhZzo6a0hhcmR3YXJlQnVmZmVyIHwgU3JnYkZsYWc6OmtFZ2xDb2xvcnNwYWNlTGluZWFyLCAmbWlkZGxlX3BpeGVsKTsKKyAgICAgICAgQVNTRVJUX05FQVJfUkdCQShtaWRkbGVfcGl4ZWwsIGtFeHBlY3RlZE1pZGRsZVBpeGVsX05vU3JnYiwgMSk7CisgICAgICAgIHRlc3RMaW5lYXJNYWduaWZpY2F0aW9uKGVudiwgU3JnYkZsYWc6OmtIYXJkd2FyZUJ1ZmZlciB8IFNyZ2JGbGFnOjprRWdsQ29sb3JzcGFjZVNyZ2IsICZtaWRkbGVfcGl4ZWwpOworICAgICAgICBBU1NFUlRfTkVBUl9SR0JBKG1pZGRsZV9waXhlbCwga0V4cGVjdGVkTWlkZGxlUGl4ZWxfTGluZWFyaXplQmVmb3JlRmlsdGVyaW5nLCAxKTsKKyAgICB9CisKKyAgICAvLyBCbGVuZGluZyB0ZXN0LgorICAgIExPR1YoIkV4cGVjdGVkIHZhbHVlIGZvciBOb1NyZ2IgPSAlOC44WCIsIGtFeHBlY3RlZEJsZW5kZWRQaXhlbF9Ob1NyZ2IpOworICAgIExPR1YoIkV4cGVjdGVkIHZhbHVlIGZvciAgIFNyZ2IgPSAlOC44WCIsIGtFeHBlY3RlZEJsZW5kZWRQaXhlbF9TcmdiKTsKKyAgICB1aW50MzJfdCBmaW5hbF9jb2xvcjsKKyAgICAvLyBGaXJzdCBkbyBhIHNhbml0eSBjaGVjayB3aXRoIHBsYWluIG9sZCBwcmUtbGluZWFyaXplZCB0ZXh0dXJlcy4KKyAgICB0ZXN0RnJhbWVidWZmZXJCbGVuZGluZyhlbnYsIDAsICZmaW5hbF9jb2xvcik7CisgICAgQVNTRVJUX05FQVJfUkdCQShmaW5hbF9jb2xvciwga0V4cGVjdGVkQmxlbmRlZFBpeGVsX05vU3JnYiwgMSk7CisgICAgdGVzdEZyYW1lYnVmZmVyQmxlbmRpbmcoZW52LCBTcmdiRmxhZzo6a0hhcmR3YXJlQnVmZmVyLCAmZmluYWxfY29sb3IpOworICAgIEFTU0VSVF9ORUFSX1JHQkEoZmluYWxfY29sb3IsIGtFeHBlY3RlZEJsZW5kZWRQaXhlbF9Ob1NyZ2IsIDEpOworICAgIC8vIFRyeSBhICJub3JtYWxseSBhbGxvY2F0ZWQiIE9wZW5HTCB0ZXh0dXJlIHdpdGggYW4gc1JHQiBzb3VyY2UgZm9ybWF0LgorICAgIHRlc3RGcmFtZWJ1ZmZlckJsZW5kaW5nKGVudiwgU3JnYkZsYWc6OmtTcmdiRm9ybWF0LCAmZmluYWxfY29sb3IpOworICAgIEFTU0VSVF9ORUFSX1JHQkEoZmluYWxfY29sb3IsIGtFeHBlY3RlZEJsZW5kZWRQaXhlbF9TcmdiLCAxKTsKKyAgICAvLyBUcnkgRUdMX0VYVF9pbWFnZV9nbF9jb2xvcnNwYWNlLgorICAgIGlmIChlZ2xfY29sb3JzcGFjZV9zdXBwb3J0ZWQpIHsKKyAgICAgICAgdGVzdEZyYW1lYnVmZmVyQmxlbmRpbmcoZW52LCBTcmdiRmxhZzo6a0hhcmR3YXJlQnVmZmVyIHwgU3JnYkZsYWc6OmtFZ2xDb2xvcnNwYWNlRGVmYXVsdCwgJmZpbmFsX2NvbG9yKTsKKyAgICAgICAgQVNTRVJUX05FQVJfUkdCQShmaW5hbF9jb2xvciwga0V4cGVjdGVkQmxlbmRlZFBpeGVsX05vU3JnYiwgMSk7CisgICAgICAgIHRlc3RGcmFtZWJ1ZmZlckJsZW5kaW5nKGVudiwgU3JnYkZsYWc6OmtIYXJkd2FyZUJ1ZmZlciB8IFNyZ2JGbGFnOjprRWdsQ29sb3JzcGFjZUxpbmVhciwgJmZpbmFsX2NvbG9yKTsKKyAgICAgICAgQVNTRVJUX05FQVJfUkdCQShmaW5hbF9jb2xvciwga0V4cGVjdGVkQmxlbmRlZFBpeGVsX05vU3JnYiwgMSk7CisgICAgICAgIHRlc3RGcmFtZWJ1ZmZlckJsZW5kaW5nKGVudiwgU3JnYkZsYWc6OmtIYXJkd2FyZUJ1ZmZlciB8IFNyZ2JGbGFnOjprRWdsQ29sb3JzcGFjZVNyZ2IsICZmaW5hbF9jb2xvcik7CisgICAgICAgIEFTU0VSVF9ORUFSX1JHQkEoZmluYWxfY29sb3IsIGtFeHBlY3RlZEJsZW5kZWRQaXhlbF9TcmdiLCAxKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy92ci9zcmMvYW5kcm9pZC92ci9jdHMvVnJFeHRlbnNpb25CZWhhdmlvclRlc3QuamF2YSBiL3Rlc3RzL3ZyL3NyYy9hbmRyb2lkL3ZyL2N0cy9WckV4dGVuc2lvbkJlaGF2aW9yVGVzdC5qYXZhCmluZGV4IGU3ZGFmYTIuLjUyMzBlZGEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3ZyL3NyYy9hbmRyb2lkL3ZyL2N0cy9WckV4dGVuc2lvbkJlaGF2aW9yVGVzdC5qYXZhCisrKyBiL3Rlc3RzL3ZyL3NyYy9hbmRyb2lkL3ZyL2N0cy9WckV4dGVuc2lvbkJlaGF2aW9yVGVzdC5qYXZhCkBAIC0yMCw4ICsyMCw2IEBACiBpbXBvcnQgYW5kcm9pZC5vcGVuZ2wuR0xFUzMyOwogaW1wb3J0IGFuZHJvaWQudGVzdC5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ2RkVGVzdDsKLQogcHVibGljIGNsYXNzIFZyRXh0ZW5zaW9uQmVoYXZpb3JUZXN0IGV4dGVuZHMgQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI8T3BlbkdMRVNBY3Rpdml0eT4gewogICAgIHN0YXRpYyB7CiAgICAgICAgIFN5c3RlbS5sb2FkTGlicmFyeSgiY3RzdnJleHRlbnNpb25zX2puaSIpOwpAQCAtNTUsNyArNTMsNiBAQAogICAgIC8qKgogICAgICAqIFRlc3RzIHRoYXQgcHJvdGVjdGVkIGNvbnRlbnQgY29udGV4dHMgYW5kIHN1cmZhY2VzIGNhbiBiZSBjcmVhdGVkLgogICAgICAqLwotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjkuMi9DLTEtNiIpCiAgICAgcHVibGljIHZvaWQgdGVzdFByb3RlY3RlZENvbnRlbnQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgbUFjdGl2aXR5ID0gZ2V0R2xFc0FjdGl2aXR5KE9wZW5HTEVTQWN0aXZpdHkuUkVOREVSRVJfQkFTSUMsIDEsIDAsIDApOwogICAgICAgICBpZiAoIW1BY3Rpdml0eS5zdXBwb3J0c1ZySGlnaFBlcmZvcm1hbmNlKCkpCkBAIC04MCw3ICs3Nyw2IEBACiAgICAgLyoqCiAgICAgICogVGVzdHMgdGhhdCB0ZXh0dXJlcyBjYW4gYmUgbWFya2VkIGFzIHByb3RlY3RlZC4KICAgICAgKi8KLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iNy45LjIvQy0xLTgiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RQcm90ZWN0ZWRUZXh0dXJlcygpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBtQWN0aXZpdHkgPSBnZXRHbEVzQWN0aXZpdHkoT3BlbkdMRVNBY3Rpdml0eS5SRU5ERVJFUl9QUk9URUNURURURVhUVVJFUywgMSwgMCwgMCk7CiAgICAgICAgIGlmICghbUFjdGl2aXR5LnN1cHBvcnRzVnJIaWdoUGVyZm9ybWFuY2UoKSkKQEAgLTEwOCw3ICsxMDQsNiBAQAogICAgIC8qKgogICAgICAqIFRlc3RzIHRoYXQgY29udGV4dCBwcmlvcml0eSBjYW4gYmUgc2V0IHRvIGhpZ2guCiAgICAgICovCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuOS4yL0MtMS02IikKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGV4dFByaW9yaXR5SGlnaCgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBydW5Db250ZXh0UHJpb3JpdHlUZXN0KEVHTF9DT05URVhUX1BSSU9SSVRZX0hJR0hfSU1HKTsKICAgICB9CkBAIC0xMTYsNyArMTExLDYgQEAKICAgICAvKioKICAgICAgKiBUZXN0cyB0aGF0IGNvbnRleHQgcHJpb3JpdHkgY2FuIGJlIHNldCB0byBtZWRpdW0uCiAgICAgICovCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuOS4yL0MtMS02IikKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGV4dFByaW9yaXR5TWVkaXVtKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIHJ1bkNvbnRleHRQcmlvcml0eVRlc3QoRUdMX0NPTlRFWFRfUFJJT1JJVFlfTUVESVVNX0lNRyk7CiAgICAgfQpAQCAtMTI0LDcgKzExOCw2IEBACiAgICAgLyoqCiAgICAgICogVGVzdHMgdGhhdCBjb250ZXh0IHByaW9yaXR5IGNhbiBiZSBzZXQgdG8gbG93LgogICAgICAqLwotICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjkuMi9DLTEtNiIpCiAgICAgcHVibGljIHZvaWQgdGVzdENvbnRleHRQcmlvcml0eUxvdygpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBydW5Db250ZXh0UHJpb3JpdHlUZXN0KEVHTF9DT05URVhUX1BSSU9SSVRZX0xPV19JTUcpOwogICAgIH0KQEAgLTEzMiw3ICsxMjUsNiBAQAogICAgIC8qKgogICAgICAqIFRlc3RzIHRoYXQgY29udGV4dCBwcmlvcml0eSBjYW4gYmUgc2V0IHRvIGxvdy4KICAgICAgKi8KLSAgICBAQ2RkVGVzdChyZXF1aXJlbWVudD0iNy45LjIvQy0xLTYiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RNdXRhYmxlUmVuZGVyQnVmZmVyKCkgdGhyb3dzIFRocm93YWJsZSB7CiAKICAgICAgICAgbUFjdGl2aXR5ID0gZ2V0R2xFc0FjdGl2aXR5KE9wZW5HTEVTQWN0aXZpdHkuUkVOREVSRVJfQkFTSUMsIDAsIDAsIDEpOwpAQCAtMTY4LDcgKzE2MCw2IEBACiAgICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgRUdMX2ltYWdlX2FycmF5IHNwZWM6CiAgICAgICogaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvT3BlbkdML2V4dGVuc2lvbnMvRVhUL0VYVF9FR0xfaW1hZ2VfYXJyYXkudHh0CiAgICAgICovCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuOS4yL0MtMS04LEMtMS0xMCIpCiAgICAgcHVibGljIHZvaWQgdGVzdEVnbEltYWdlQXJyYXkoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgbUFjdGl2aXR5ID0gZ2V0R2xFc0FjdGl2aXR5KE9wZW5HTEVTQWN0aXZpdHkuUkVOREVSRVJfQkFTSUMsIDAsIDAsIDApOwogICAgICAgICBpZiAoIW1BY3Rpdml0eS5zdXBwb3J0c1ZySGlnaFBlcmZvcm1hbmNlKCkpCkBAIC0xODgsNyArMTc5LDYgQEAKICAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBHTF9FWFRfZXh0ZXJuYWxfYnVmZmVyIHNwZWM6CiAgICAgICogaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvT3BlbkdML2V4dGVuc2lvbnMvRVhUL0VYVF9leHRlcm5hbF9idWZmZXIudHh0CiAgICAgICovCi0gICAgQENkZFRlc3QocmVxdWlyZW1lbnQ9IjcuOS4yL0MtMS04IikKICAgICBwdWJsaWMgdm9pZCB0ZXN0RXh0ZXJuYWxCdWZmZXIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgbUFjdGl2aXR5ID0gZ2V0R2xFc0FjdGl2aXR5KE9wZW5HTEVTQWN0aXZpdHkuUkVOREVSRVJfQkFTSUMsIDAsIDAsIDApOwogICAgICAgICBpZiAoIW1BY3Rpdml0eS5zdXBwb3J0c1ZySGlnaFBlcmZvcm1hbmNlKCkpCkBAIC0yMDMsNiArMTkzLDIwIEBACiAgICAgICAgIH0pOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHRlc3RTcmdiQnVmZmVyKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIG1BY3Rpdml0eSA9IGdldEdsRXNBY3Rpdml0eShPcGVuR0xFU0FjdGl2aXR5LlJFTkRFUkVSX0JBU0lDLCAwLCAwLCAwKTsKKyAgICAgICAgaWYgKCFtQWN0aXZpdHkuc3VwcG9ydHNWckhpZ2hQZXJmb3JtYW5jZSgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGFzc2VydEVxdWFscyhHTEVTMzIuR0xfTk9fRVJST1IsIG1BY3Rpdml0eS5nbEdldEVycm9yKCkpOworCisgICAgICAgIG1BY3Rpdml0eS5ydW5PbkdsVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBuYXRpdmVUZXN0U3JnYkJ1ZmZlcigpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBSdW5zIGEgY29udGV4dCBwcmlvcml0eSB0ZXN0LgogICAgICAqLwpAQCAtMjMzLDQgKzIzNyw1IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBuYXRpdmVUZXN0RWdsSW1hZ2VBcnJheSgpOwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBib29sZWFuIG5hdGl2ZVRlc3RFeHRlcm5hbEJ1ZmZlcigpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBib29sZWFuIG5hdGl2ZVRlc3RTcmdiQnVmZmVyKCk7CiB9CmRpZmYgLS1naXQgYS90ZXN0cy92ci9zcmMvYW5kcm9pZC92ci9jdHMvVnJGZWF0dXJlc1Rlc3QuamF2YSBiL3Rlc3RzL3ZyL3NyYy9hbmRyb2lkL3ZyL2N0cy9WckZlYXR1cmVzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwYzY0NTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy92ci9zcmMvYW5kcm9pZC92ci9jdHMvVnJGZWF0dXJlc1Rlc3QuamF2YQpAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC52ci5jdHM7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Qb3dlck1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOworaW1wb3J0IGFuZHJvaWQudGVzdC5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuQ2RkVGVzdDsKKworcHVibGljIGNsYXNzIFZyRmVhdHVyZXNUZXN0IGV4dGVuZHMgQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI8Q3RzQWN0aXZpdHk+IHsKKyAgICBwcml2YXRlIEN0c0FjdGl2aXR5IG1BY3Rpdml0eTsKKworICAgIHB1YmxpYyBWckZlYXR1cmVzVGVzdCgpIHsKKyAgICAgICAgc3VwZXIoQ3RzQWN0aXZpdHkuY2xhc3MpOworICAgIH0KKworICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjkuMi9DLTEtMiIpCisgICAgcHVibGljIHZvaWQgdGVzdExhY2tzRGVwcmVjYXRlZFZyTW9kZUZlYXR1cmUoKSB7CisgICAgICAgIG1BY3Rpdml0eSA9IGdldEFjdGl2aXR5KCk7CisgICAgICAgIGJvb2xlYW4gaGFzVnJNb2RlID0gbUFjdGl2aXR5LmdldFBhY2thZ2VNYW5hZ2VyKCkuaGFzU3lzdGVtRmVhdHVyZSgKKyAgICAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlci5GRUFUVVJFX1ZSX01PREUpOworICAgICAgICBib29sZWFuIGhhc1ZyTW9kZUhpZ2hQZXJmID0gbUFjdGl2aXR5LmdldFBhY2thZ2VNYW5hZ2VyKCkuaGFzU3lzdGVtRmVhdHVyZSgKKyAgICAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlci5GRUFUVVJFX1ZSX01PREVfSElHSF9QRVJGT1JNQU5DRSk7CisgICAgICAgIGlmIChoYXNWck1vZGUgfHwgaGFzVnJNb2RlSGlnaFBlcmYpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkZFQVRVUkVfVlJfTU9ERSBhbmQgRkVBVFVSRV9WUl9NT0RFX0hJR0hfUEVSRk9STUFOQ0UgbXVzdCBiZSB1c2VkIHRvZ2V0aGVyIiwKKyAgICAgICAgICAgICAgICAgICAgaGFzVnJNb2RlICYmIGhhc1ZyTW9kZUhpZ2hQZXJmKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBDZGRUZXN0KHJlcXVpcmVtZW50PSI3LjkuMi9DLTEtMyIpCisgICAgcHVibGljIHZvaWQgdGVzdFN1c3RhaW5lZFBlcmZvcm1hbmNlTW9kZVN1cHBvcnRlZCgpIHsKKyAgICAgICAgbUFjdGl2aXR5ID0gZ2V0QWN0aXZpdHkoKTsKKyAgICAgICAgUG93ZXJNYW5hZ2VyIHBtID0gKFBvd2VyTWFuYWdlcikgbUFjdGl2aXR5LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5QT1dFUl9TRVJWSUNFKTsKKyAgICAgICAgYm9vbGVhbiBoYXNWck1vZGVIaWdoUGVyZiA9IG1BY3Rpdml0eS5nZXRQYWNrYWdlTWFuYWdlcigpLmhhc1N5c3RlbUZlYXR1cmUoCisgICAgICAgICAgICAgICAgUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9WUl9NT0RFX0hJR0hfUEVSRk9STUFOQ0UpOworICAgICAgICBib29sZWFuIGhhc1N1c3RhaW5lZFBlcmZvcm1hbmNlTW9kZSA9IHBtLmlzU3VzdGFpbmVkUGVyZm9ybWFuY2VNb2RlU3VwcG9ydGVkKCk7CisgICAgICAgIGlmIChoYXNWck1vZGVIaWdoUGVyZikgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRkVBVFVSRV9WUl9NT0RFX0hJR0hfUEVSRk9STUFOQ0UgcmVxdWlyZXMgc3VwcG9ydCBmb3Igc3VzdGFpbmVkIHBlcmZvcm1hbmNlIG1vZGUiLAorICAgICAgICAgICAgICAgICAgICBoYXNTdXN0YWluZWRQZXJmb3JtYW5jZU1vZGUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvY3RzLWFwaS1jb3ZlcmFnZS9BbmRyb2lkLm1rIGIvdG9vbHMvY3RzLWFwaS1jb3ZlcmFnZS9BbmRyb2lkLm1rCmluZGV4IGM2NmY3ZDQuLjhlNWUwZWUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2N0cy1hcGktY292ZXJhZ2UvQW5kcm9pZC5taworKysgYi90b29scy9jdHMtYXBpLWNvdmVyYWdlL0FuZHJvaWQubWsKQEAgLTE0LDIzICsxNCw1MiBAQAogCiBMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCiAKLSMgdGhlIGhhdCBzY3JpcHQKKyMgdGhlIGN0cy1hcGktY292ZXJhZ2Ugc2NyaXB0CiAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiBMT0NBTF9JU19IT1NUX01PRFVMRSA6PSB0cnVlCiBMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVhFQ1VUQUJMRVMKIExPQ0FMX01PRFVMRSA6PSBjdHMtYXBpLWNvdmVyYWdlCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAotICAgIGNvbXBhdGliaWxpdHktY29tbW9uLXV0aWwtZGV2aWNlc2lkZWxpYgogTE9DQUxfU1JDX0ZJTEVTIDo9IGV0Yy8kKExPQ0FMX01PRFVMRSkKIExPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTIDo9ICQoSE9TVF9PVVRfSkFWQV9MSUJSQVJJRVMpLyQoTE9DQUxfTU9EVUxFKSQoQ09NTU9OX0pBVkFfUEFDS0FHRV9TVUZGSVgpCiAKIGluY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKIAotIyB0aGUgb3RoZXIgc3R1ZmYKKyMgdGhlIG5kay1hcGktcmVwb3J0IHNjcmlwdAogIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLXN1YmRpcnMgOj0gJChhZGRwcmVmaXggJChMT0NBTF9QQVRIKS8sJChhZGRzdWZmaXggL0FuZHJvaWQubWssIFwKLQkJc3JjIFwKLQkpKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9JU19IT1NUX01PRFVMRSA6PSB0cnVlCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVhFQ1VUQUJMRVMKK0xPQ0FMX01PRFVMRSA6PSBuZGstYXBpLXJlcG9ydAorTE9DQUxfU1JDX0ZJTEVTIDo9IGV0Yy8kKExPQ0FMX01PRFVMRSkKIAotaW5jbHVkZSAkKHN1YmRpcnMpCitpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCisKKyMgY3RzLWFwaS1jb3ZlcmFnZSBqYXZhIGxpYnJhcnkKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICAkKGNhbGwgYWxsLXN1YmRpci1qYXZhLWZpbGVzKSBcCisgICAgJChjYWxsIGFsbC1wcm90by1maWxlcy11bmRlciwgcHJvdG8pCisKK0xPQ0FMX1BST1RPQ19PUFRJTUlaRV9UWVBFIDo9IGZ1bGwKK0xPQ0FMX1BST1RPQ19GTEFHUyA6PSAtLXByb3RvX3BhdGg9JChMT0NBTF9QQVRIKS9wcm90by8KKworTE9DQUxfSkFWQV9SRVNPVVJDRV9ESVJTIDo9IHJlcworTE9DQUxfSkFSX01BTklGRVNUIDo9IE1BTklGRVNULm1mCisKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCisgIGNvbXBhdGliaWxpdHktaG9zdC11dGlsIFwKKyAgZGV4bGliMgorCitMT0NBTF9NT0RVTEUgOj0gY3RzLWFwaS1jb3ZlcmFnZQorCisjIFRoaXMgdG9vbCBpcyBub3QgY2hlY2tpbmcgYW55IGRlcGVuZGVuY2llcyBvciBtZXRhZGF0YSwgc28gYWxsIG9mIHRoZQorIyBkZXBlbmRlbmNpZXMgb2YgYWxsIG9mIHRoZSB0ZXN0cyBtdXN0IGJlIG9uIGl0cyBjbGFzc3BhdGguIFRoaXMgaXMKKyMgc3VwZXIgZnJhZ2lsZS4KK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyArPSBcCisgIHRyYWRlZmVkIGhvc3R0ZXN0bGliIFwKKyAgcGxhdGZvcm1wcm90b3MKKworaW5jbHVkZSAkKEJVSUxEX0hPU1RfSkFWQV9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvdG9vbHMvY3RzLWFwaS1jb3ZlcmFnZS9zcmMvTUFOSUZFU1QubWYgYi90b29scy9jdHMtYXBpLWNvdmVyYWdlL01BTklGRVNULm1mCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy9jdHMtYXBpLWNvdmVyYWdlL3NyYy9NQU5JRkVTVC5tZgpyZW5hbWUgdG8gdG9vbHMvY3RzLWFwaS1jb3ZlcmFnZS9NQU5JRkVTVC5tZgpkaWZmIC0tZ2l0IGEvdG9vbHMvY3RzLWFwaS1jb3ZlcmFnZS9wcm90by9jdHNfcmVwb3J0LnByb3RvIGIvdG9vbHMvY3RzLWFwaS1jb3ZlcmFnZS9wcm90by9jdHNfcmVwb3J0LnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYjQzMzgKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9jdHMtYXBpLWNvdmVyYWdlL3Byb3RvL2N0c19yZXBvcnQucHJvdG8KQEAgLTAsMCArMSwzNTIgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBDb250YWlucyBwcm90byBkZWZpbml0aW9uIGZvciBzdG9yaW5nIENUUyByZXBvcnRzLgorCitzeW50YXggPSAicHJvdG8yIjsKKworcGFja2FnZSBjb20uYW5kcm9pZC5jdHMuYXBpY292ZXJhZ2U7CitvcHRpb24gamF2YV9wYWNrYWdlID0gImNvbS5hbmRyb2lkLmN0cy5hcGljb3ZlcmFnZSI7CitvcHRpb24gamF2YV9vdXRlcl9jbGFzc25hbWUgPSAiQ3RzUmVwb3J0UHJvdG8iOworCisvLyBmcm9tIGNvbW1vbl9yZXBvcnQucHJvdG8KKy8vIEluZm9ybWF0aW9uIGFib3V0IHRoZSBidWlsZCBvbiB0aGUgcGhvbmUuICBBbGwgdGhlIGZpZWxkcworLy8gY29ycmVzcG9uZCB0byB2YWx1ZXMgZnJvbSBhbmRyb2lkLm9zLkJ1aWxkLgorLy8gTmV4dCBJZDogMjAKK21lc3NhZ2UgQnVpbGRJbmZvIHsKKyAgb3B0aW9uYWwgc3RyaW5nIGJvYXJkID0gMTsKKyAgb3B0aW9uYWwgc3RyaW5nIGJyYW5kID0gMjsKKyAgb3B0aW9uYWwgc3RyaW5nIGRldmljZSA9IDM7CisgIG9wdGlvbmFsIHN0cmluZyBkaXNwbGF5ID0gNDsKKyAgb3B0aW9uYWwgc3RyaW5nIGZpbmdlcnByaW50ID0gNTsKKyAgb3B0aW9uYWwgc3RyaW5nIGlkID0gNjsKKyAgb3B0aW9uYWwgc3RyaW5nIG1vZGVsID0gNzsKKyAgb3B0aW9uYWwgc3RyaW5nIHByb2R1Y3QgPSA4OworICBtZXNzYWdlIFZlcnNpb24geworICAgIG9wdGlvbmFsIHN0cmluZyByZWxlYXNlID0gMTsKKyAgICBvcHRpb25hbCBzdHJpbmcgc2RrID0gMjsKKyAgfQorICBvcHRpb25hbCBWZXJzaW9uIHZlcnNpb24gPSA5OworICBvcHRpb25hbCBzdHJpbmcgbWFudWZhY3R1cmVyID0gMTA7CisgIC8vIFRoaXMgZmllbGQgaXMgZGVwcmVjYXRlZCBpbiBhbmRyb2lkLm9zLkJ1aWxkLiBVc2Ugc3VwcG9ydGVkX2FiaSBpbnN0ZWFkLgorICBvcHRpb25hbCBzdHJpbmcgYWJpID0gMTEgW2RlcHJlY2F0ZWQgPSB0cnVlXTsKKyAgLy8gVGhpcyBmaWVsZCBpcyBkZXByZWNhdGVkIGluIGFuZHJvaWQub3MuQnVpbGQuIFVzZSBzdXBwb3J0ZWRfYWJpIGluc3RlYWQuCisgIG9wdGlvbmFsIHN0cmluZyBhYmkyID0gMTIgW2RlcHJlY2F0ZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgc3RyaW5nIHN1cHBvcnRlZF9hYmkgPSAxMzsKKyAgcmVwZWF0ZWQgc3RyaW5nIHN1cHBvcnRlZF8zMl9iaXRfYWJpID0gMTQ7CisgIHJlcGVhdGVkIHN0cmluZyBzdXBwb3J0ZWRfNjRfYml0X2FiaSA9IDE1OworICAvLyBCdWlsZC5CQVNFX09TIFRoZSBiYXNlIE9TIGJ1aWxkIHRoZSBwcm9kdWN0IGlzIGJhc2VkIG9uLiBTZWUgYi8yMzAwMzk0MAorICBvcHRpb25hbCBzdHJpbmcgYmFzZV9vcyA9IDE2OworICAvLyBCdWlsZC5TRUNVUklUWV9QQVRDSCBUaGUgdXNlci12aXNpYmxlIHNlY3VyaXR5IHBhdGNoIGxldmVsLiBTZWUgYi8yMzAwMzk0MAorICBvcHRpb25hbCBzdHJpbmcgc2VjdXJpdHlfcGF0Y2ggPSAxNzsKKyAgLy8gQSBidWlsZCBmaW5nZXJwcmludCBvZiB0aGUgcmVmZXJlbmNlIGRldmljZS4gU2VlIGdvL2FwZmUtcmVmZXJlbmNlLWJ1aWxkCisgIG9wdGlvbmFsIHN0cmluZyByZWZlcmVuY2VfYnVpbGRfZmluZ2VycHJpbnQgPSAxODsKKyAgLy8gUk8gUHJvcGVydHkgc2V0IGZvciB0aGUgYnVpbGQuCisgIG1hcDxzdHJpbmcsIHN0cmluZz4gcm9fcHJvcGVydHlfbWFwID0gMTk7Cit9CisKKy8vIFN1bW1hcnkgY291bnQgb2YgdGhlIHRlc3QgcmVzdWx0cy4KK21lc3NhZ2UgU3VtbWFyeSB7CisgIG9wdGlvbmFsIGludDMyIGZhaWxlZCA9IDE7CisgIG9wdGlvbmFsIGludDMyIG5vdF9leGVjdXRlZCA9IDI7CisgIG9wdGlvbmFsIGludDMyIHBhc3MgPSAzOworICBvcHRpb25hbCBpbnQzMiB0aW1lb3V0ID0gNDsKKyAgb3B0aW9uYWwgaW50MzIgd2FybmluZyA9IDU7Cit9CisKKy8vIEluZm9ybWF0aW9uIGFib3V0IHRoZSBkZXZpY2UncyBtZW1vcnkgY29uZmlndXJhdGlvbgorbWVzc2FnZSBNZW1vcnlJbmZvIHsKKyAgICAvLyBBY3Rpdml0eU1hbmFnZXIuaXNMb3dSYW1EZXZpY2UKKyAgICBvcHRpb25hbCBib29sIGlzX2xvd19yYW1fZGV2aWNlID0gMTsKKworICAgIC8vIEFjdGl2aXR5TWFuYWdlci5nZXRNZW1vcnlDbGFzcygpCisgICAgb3B0aW9uYWwgaW50MzIgbWVtb3J5X2NsYXNzID0gMjsKKworICAgIC8vIEFjdGl2aXR5TWFuYWdlci5nZXRMYXJnZU1lbW9yeUNsYXNzKCkKKyAgICBvcHRpb25hbCBpbnQzMiBsYXJnZV9tZW1vcnlfY2xhc3MgPSAzOworCisgICAgLy8gTWVtb3J5SW5mby50b3RhbE1lbQorICAgIG9wdGlvbmFsIGludDY0IHRvdGFsX21lbW9yeSA9IDQ7Cit9CisKK21lc3NhZ2UgQ3B1SW5mbyB7CisgIC8vIFJ1bnRpbWUuYXZhaWxhYmxlUHJvY2Vzc29ycworICBvcHRpb25hbCBpbnQzMiBhdmFpbGFibGVfcHJvY2Vzc29ycyA9IDE7Cit9CisvLyBmcm9tIGNvbW1vbl9yZXBvcnQucHJvdG8gZW5kcworCisvLyBMb2dpY2FsIHNjcmVlbiBkZW5zaXR5CisvLyBUaGUgbnVtYmVycyBhcmUgaW4gZHBpIGFuZCBzaG91bGQgbWF0Y2ggYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzLkRFTlNJVFlfKgorZW51bSBMb2dpY2FsRGVuc2l0eSB7CisgIExEUEkgPSAxMjA7CisgIE1EUEkgPSAxNjA7CisgIFRWRFBJID0gMjEzOworICBIRFBJID0gMjQwOworICBERU5TSVRZXzI2MCA9IDI2MDsKKyAgREVOU0lUWV8yODAgPSAyODA7CisgIERFTlNJVFlfMzAwID0gMzAwOworICBYSERQSSA9IDMyMDsKKyAgREVOU0lUWV8zNDAgPSAzNDA7CisgIERFTlNJVFlfMzYwID0gMzYwOworICAvLyBJbnRlcm1lZGlhdGUgZGVuc2l0eSBmb3Igc2NyZWVucyB0aGF0IHNpdCBzb21ld2hlcmUgYmV0d2VlbiBERU5TSVRZX1hISUdIICgzMjAgZHBpKSBhbmQKKyAgLy8gREVOU0lUWV9YWEhJR0ggKDQ4MCBkcGkpLgorICBERU5TSVRZXzQwMCA9IDQwMDsKKyAgREVOU0lUWV80MjAgPSA0MjA7CisgIFhYSERQSSA9IDQ4MDsKKyAgLy8gSW50ZXJtZWRpYXRlIGRlbnNpdHkgZm9yIHNjcmVlbnMgdGhhdCBzaXQgc29tZXdoZXJlIGJldHdlZW4gREVOU0lUWV9YWEhJR0ggKDQ4MCBkcGkpIGFuZAorICAvLyBERU5TSVRZX1hYWEhJR0ggKDY0MCBkcGkpLgorICBERU5TSVRZXzU2MCA9IDU2MDsKKyAgWFhYSERQSSA9IDY0MDsKK30KKworLy8gTG9naWNhbCBzY3JlZW4gc2l6ZQorLy8gVGhlIG51bWJlcnMgc2hvdWxkIG1hdGNoCisvLyBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb24uU0NSRUVOTEFZT1VUX1NJWkVfKgorZW51bSBMb2dpY2FsU2l6ZSB7CisgIFVOREVGSU5FRCA9IDA7CisgIFNNQUxMID0gMTsKKyAgTk9STUFMID0gMjsKKyAgTEFSR0UgPSAzOworICBYTEFSR0UgPSA0OworfQorCisvLyBSZXN1bHQgdHlwZSBvZiBQVFMgdGVzdHMgZGVmaW5lZCBpbjoKKy8vIGN0cy9zdWl0ZS9wdHMvbGliL2NvbW1vbnV0aWwvc3JjL2NvbS9hbmRyb2lkL3B0cy91dGlsL1Jlc3VsdFR5cGUuamF2YQorZW51bSBSZXN1bHRUeXBlIHsKKyAgTE9XRVJfQkVUVEVSID0gMDsKKyAgSElHSEVSX0JFVFRFUiA9IDE7CisgIE5FVVRSQUwgPSAyOworICBXQVJOSU5HID0gMzsKK30KKworLy8gUmVzdWx0IHVuaXQgb2YgUFRTIHZhbHVlcyBkZWZpbmVkIGluOgorLy8gY3RzL3N1aXRlL3B0cy9saWIvY29tbW9udXRpbC9zcmMvY29tL2FuZHJvaWQvcHRzL3V0aWwvUmVzdWx0VW5pdC5qYXZhCitlbnVtIFJlc3VsdFVuaXQgeworICBOT05FID0gMDsKKyAgTVMgPSAxOworICBGUFMgPSAyOworICBPUFMgPSAzOworICBLQlBTID0gNDsKKyAgTUJQUyA9IDU7CisgIEJZVEUgPSA2OworICBDT1VOVCA9IDc7CisgIFNDT1JFID0gODsKK30KKworLy8gQSBDdHNSZXBvcnQgbWVzc2FnZSBlbmNhcHN1bGF0ZXMgdGhlIG91dHB1dCBvZiBhIENvbXBhdGliaWxpdHkgVGVzdCBTdWl0ZQorLy8gKENUUykgcnVuLgorbWVzc2FnZSBDdHNSZXBvcnQgeworCisgIC8vIFRlc3QgcGxhbiB0aGF0IHdhcyBydW4sIGdlbmVyYWxseSAiQ1RTIi4KKyAgb3B0aW9uYWwgc3RyaW5nIHRlc3RfcGxhbiA9IDE7CisKKyAgLy8gVmVyc2lvbiBvZiB0aGUgQ1RTIHRvb2wuCisgIG9wdGlvbmFsIHN0cmluZyB2ZXJzaW9uID0gMjsKKworICBvcHRpb25hbCBpbnQ2NCBzdGFydF90aW1lID0gMzsKKyAgb3B0aW9uYWwgaW50NjQgZW5kX3RpbWUgPSA0OworCisgIC8vIEZpZWxkcyBkZXNjcmliaW5nIHRoZSBwYXJ0aWN1bGFyIGRldmljZSB1bmRlciB0ZXN0LgorICAvLyBOZXh0IElkOiAzMgorICBtZXNzYWdlIERldmljZUluZm8geworCisgICAgb3B0aW9uYWwgc3RyaW5nIHNjcmVlbl9yZXNvbHV0aW9uID0gMTsKKyAgICBvcHRpb25hbCBMb2dpY2FsRGVuc2l0eSBsb2dpY2FsX3NjcmVlbl9kZW5zaXR5ID0gMTc7CisgICAgb3B0aW9uYWwgTG9naWNhbFNpemUgbG9naWNhbF9zY3JlZW5fc2l6ZSA9IDE4OworCisgICAgb3B0aW9uYWwgc3RyaW5nIHN1YnNjcmliZXJfaWQgPSAyIFtkZXByZWNhdGVkID0gdHJ1ZV07CisgICAgb3B0aW9uYWwgc3RyaW5nIHR5cGUgPSAzIFtkZXByZWNhdGVkID0gdHJ1ZV07CisgICAgb3B0aW9uYWwgc3RyaW5nIGRldmljZV9pZCA9IDQgW2RlcHJlY2F0ZWQgPSB0cnVlXTsKKyAgICBvcHRpb25hbCBzdHJpbmcgaW1laSA9IDUgW2RlcHJlY2F0ZWQgPSB0cnVlXTsKKyAgICBvcHRpb25hbCBzdHJpbmcgaW1zaSA9IDYgW2RlcHJlY2F0ZWQgPSB0cnVlXTsKKyAgICBvcHRpb25hbCBzdHJpbmcga2V5cGFkID0gNzsKKyAgICByZXBlYXRlZCBzdHJpbmcgbG9jYWxlID0gODsKKyAgICBvcHRpb25hbCBzdHJpbmcgbmF2aWdhdGlvbiA9IDk7CisgICAgb3B0aW9uYWwgc3RyaW5nIG5ldHdvcmsgPSAxMCBbZGVwcmVjYXRlZCA9IHRydWVdOworICAgIG9wdGlvbmFsIHN0cmluZyB0b3VjaCA9IDExOworICAgIG9wdGlvbmFsIGZsb2F0IHhfZHBpID0gMTI7CisgICAgb3B0aW9uYWwgZmxvYXQgeV9kcGkgPSAxMzsKKyAgICBvcHRpb25hbCBzdHJpbmcgb3BlbmdsX2VzX3ZlcnNpb24gPSAxOTsKKworICAgIC8vIFVzZSBCdWlsZEluZm8uc3VwcG9ydGVkX2FiaSBpbnN0ZWFkCisgICAgb3B0aW9uYWwgc3RyaW5nIGJ1aWxkX2FiaSA9IDIwIFtkZXByZWNhdGVkID0gdHJ1ZV07CisgICAgLy8gVXNlIEJ1aWxkSW5mby5zdXBwb3J0ZWRfYWJpIGluc3RlYWQKKyAgICBvcHRpb25hbCBzdHJpbmcgYnVpbGRfYWJpMiA9IDIxIFtkZXByZWNhdGVkID0gdHJ1ZV07CisKKyAgICBvcHRpb25hbCBCdWlsZEluZm8gYnVpbGRfaW5mbyA9IDE0OworICAgIG9wdGlvbmFsIE1lbW9yeUluZm8gbWVtb3J5X2luZm8gPSAyOTsKKyAgICBvcHRpb25hbCBDcHVJbmZvIGNwdV9pbmZvID0gMzA7CisKKyAgICAvLyBGaWxlc3lzdGVtIHBhcnRpdGlvbnMuCisgICAgb3B0aW9uYWwgc3RyaW5nIHBhcnRpdGlvbnMgPSAyMjsKKworICAgIHJlcGVhdGVkIHN0cmluZyBzeXN0ZW1fbGlicmFyeSA9IDIzOworICAgIC8vIERlcHJlY2F0ZWQuIFRoZXNlIHZhbHVlcyBhcmUgZm91bmQgaW4gdGhlIGV4dGVuc2lvbiBsaXN0CisgICAgcmVwZWF0ZWQgc3RyaW5nIG9wZW5nbF90ZXh0dXJlX2Zvcm1hdCA9IDI0IFtkZXByZWNhdGVkID0gdHJ1ZV07CisgICAgLy8gR0xFUzIwLkdMX0VYVEVOU0lPTlMsICBHTDEwLkdMX0VYVEVOU0lPTlMgb3IgR0xFUzMwLkdMX0VYVEVOU0lPTlMKKyAgICByZXBlYXRlZCBzdHJpbmcgb3BlbmdsX2V4dGVuc2lvbiA9IDI1OworICAgIC8vIGdsLmdsR2V0U3RyaW5nKEdMMTAuR0xfVkVORE9SKSBvciBHTEVTMjAuZ2xHZXRTdHJpbmcoR0xFUzIwLkdMX1ZFTkRPUikKKyAgICAvLyBvciBHTEVTMzAuZ2xHZXRTdHJpbmcoR0xFUzMwLkdMX1ZFTkRPUikKKyAgICBvcHRpb25hbCBzdHJpbmcgb3BlbmdsX3ZlbmRvciA9IDI2OworICAgIC8vIGdsLmdsR2V0U3RyaW5nKEdMMTAuR0xfUkVOREVSRVIpCisgICAgLy8gb3IgR0xFUzIwLmdsR2V0U3RyaW5nKEdMRVMyMC5HTF9SRU5ERVJFUikKKyAgICAvLyBvciBHTEVTMzAuZ2xHZXRTdHJpbmcoR0xFUzMwLkdMX1JFTkRFUkVSKQorICAgIG9wdGlvbmFsIHN0cmluZyBvcGVuZ2xfcmVuZGVyZXIgPSAyNzsKKworICAgIC8vIEhhcmR3YXJlIGZlYXR1cmVzIHRoYXQgbWF5IGJlIGF2YWlsYWJsZSBvbiB0aGUgZGV2aWNlLgorICAgIC8vIFRoaXMgaW5jbHVkZXMgZmVhdHVyZXMgc3VjaCBhcyBjYW1lcmEsIGdwcyBhbmQgY29tcGFzcy4KKyAgICBtZXNzYWdlIEZlYXR1cmUgeworICAgICAgb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworICAgICAgb3B0aW9uYWwgc3RyaW5nIHR5cGUgPSAyOworICAgICAgb3B0aW9uYWwgYm9vbCBhdmFpbGFibGUgPSAzOworICAgICAgb3B0aW9uYWwgaW50MzIgdmVyc2lvbiA9IDQ7CisgICAgfQorICAgIHJlcGVhdGVkIEZlYXR1cmUgZmVhdHVyZSA9IDE1OworCisgICAgLy8gUnVubmluZyBwcm9jZXNzZXMuCisgICAgbWVzc2FnZSBQcm9jZXNzIHsKKyAgICAgIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgICAgIG9wdGlvbmFsIGludDMyIHVpZCA9IDI7CisgICAgfQorICAgIHJlcGVhdGVkIFByb2Nlc3MgcHJvY2VzcyA9IDE2OworCisgICAgLy8gQ29uZmlndXJhdGlvbi5zbWFsbGVzdFNjcmVlbldpZHRoRHAKKyAgICBvcHRpb25hbCBpbnQzMiBzbWFsbGVzdF9zY3JlZW5fd2lkdGhfZHAgPSAyODsKKworICAgIC8vIFRoZSB2YWx1ZSByZXBvcnRlZCBmcm9tIFVzZXJNYW5hZ2VyLmdldE1heFN1cHBvcnRlZFVzZXJzCisgICAgb3B0aW9uYWwgaW50MzIgbWF4X3N1cHBvcnRlZF91c2VycyA9IDMxOworICB9CisgIG9wdGlvbmFsIERldmljZUluZm8gZGV2aWNlX2luZm8gPSA1OworCisgIC8vIEluZm9ybWF0aW9uIGFib3V0IHRoZSBob3N0IHJ1bm5pbmcgdGhlIHRlc3Qgc3VpdGUuCisgIG1lc3NhZ2UgSG9zdEluZm8geworCisgICAgLy8gSG9zdG5hbWUgb2YgdGhlIG1hY2hpbmUgcnVubmluZyB0aGUgdGVzdHMuCisgICAgb3B0aW9uYWwgc3RyaW5nIGhvc3RuYW1lID0gMTsKKworICAgIC8vIE9wZXJhdGluZyBzeXN0ZW0gcnVubmluZyBvbiB0aGUgaG9zdC4KKyAgICBtZXNzYWdlIE9zIHsKKyAgICAgIG9wdGlvbmFsIHN0cmluZyBhcmNoID0gMTsKKyAgICAgIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMjsKKyAgICAgIG9wdGlvbmFsIHN0cmluZyB2ZXJzaW9uID0gMzsKKyAgICB9CisgICAgb3B0aW9uYWwgT3Mgb3MgPSAyOworCisgICAgLy8gSW5mb3JtYXRpb24gYWJvdXQgdGhlIEpSRSB1c2VkIHRvIHJ1biB0aGUgdGVzdHMuCisgICAgbWVzc2FnZSBKYXZhRW52IHsKKyAgICAgIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgICAgIG9wdGlvbmFsIHN0cmluZyB2ZXJzaW9uID0gMjsKKyAgICB9CisgICAgb3B0aW9uYWwgSmF2YUVudiBqYXZhX2VudiA9IDM7CisKKyAgICAvLyBDVFMgdmVyc2lvbiBhbmQgcGFyYW1ldGVycyBkdXJpbmcgcnVudGltZS4KKyAgICBtZXNzYWdlIEN0cyB7CisgICAgICBvcHRpb25hbCBzdHJpbmcgdmVyc2lvbiA9IDE7CisKKyAgICAgIG1lc3NhZ2UgUGFyYW1ldGVyIHsKKyAgICAgICAgb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworICAgICAgICBvcHRpb25hbCBpbnQzMiB2YWx1ZSA9IDI7CisgICAgICB9CisgICAgICByZXBlYXRlZCBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gMjsKKyAgICB9CisgICAgb3B0aW9uYWwgQ3RzIGN0cyA9IDQ7CisgIH0KKyAgb3B0aW9uYWwgSG9zdEluZm8gaG9zdF9pbmZvID0gNjsKKworICBvcHRpb25hbCBTdW1tYXJ5IHN1bW1hcnkgPSA3OworCisgIC8vIEdyb3VwIG9mIHRlc3Qgc3VpdGVzIHdpdGhpbiBhIHNwZWNpZmljIGphdmEgcGFja2FnZS4KKyAgbWVzc2FnZSBUZXN0UGFja2FnZSB7CisKKyAgICAvLyBKYXZhIHBhY2thZ2UgbmFtZS4KKyAgICBvcHRpb25hbCBzdHJpbmcgZGVwcmVjYXRlZF9hcHBfcGFja2FnZV9uYW1lID0gMSBbZGVwcmVjYXRlZCA9IHRydWVdOworCisgICAgLy8gVW5pcXVlIG5hbWUgZGVzY3JpYmluZyB0aGUgdGVzdCBwYWNrYWdlIHdpdGhpbiB0aGUgamF2YSBwYWNrYWdlLgorICAgIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMjsKKyAgICBvcHRpb25hbCBzdHJpbmcgZGVwcmVjYXRlZF9kaWdlc3QgPSAzIFtkZXByZWNhdGVkID0gdHJ1ZV07CisgICAgb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkX3NpZ25hdHVyZV9jaGVjayA9IDQgW2RlcHJlY2F0ZWQgPSB0cnVlXTsKKworICAgIC8vIEdyb3VwIG9mIHRlc3QgY2FzZXMuCisgICAgbWVzc2FnZSBUZXN0U3VpdGUgeworCisgICAgICAvLyBVbmlxdWUgbmFtZSBkZXNjcmliaW5nIHRoZSB0ZXN0IHN1aXRlIHdpdGhpbiB0aGUgdGVzdCBwYWNrYWdlLgorICAgICAgb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworCisgICAgICAvLyBHcm91cCBvZiBpbmRpdmlkdWFsIHRlc3RzLgorICAgICAgbWVzc2FnZSBUZXN0Q2FzZSB7CisKKyAgICAgICAgLy8gVW5pcXVlIG5hbWUgZGVzY3JpYmluZyB0aGUgdGVzdCBjYXNlIHdpdGhpbiB0aGUgdGVzdCBzdWl0ZS4KKyAgICAgICAgb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworICAgICAgICBvcHRpb25hbCBzdHJpbmcgcHJpb3JpdHkgPSAyOworCisgICAgICAgIC8vIFNtYWxsZXN0IHRlc3QgdW5pdCwgd2hpY2ggaWRlYWxseSB0ZXN0cyBvbmx5IG9uZSBmZWF0dXJlIG9yIGZ1bmN0aW9uLgorICAgICAgICBtZXNzYWdlIFRlc3QgeworCisgICAgICAgICAgLy8gVW5pcXVlIG5hbWUgZGVzY3JpYmluZyB0aGUgdGVzdCB3aXRoaW4gdGhlIHRlc3QgY2FzZS4KKyAgICAgICAgICBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisKKyAgICAgICAgICAvLyBSZXN1bHQgb2YgdGhlIHRlc3QgcnVuLgorICAgICAgICAgIG9wdGlvbmFsIHN0cmluZyByZXN1bHQgPSAyOworCisgICAgICAgICAgLy8gQnVnIGlkIGZvciBrbm93biBpc3N1ZXMuCisgICAgICAgICAgb3B0aW9uYWwgc3RyaW5nIGRlcHJlY2F0ZWRfa25vd25fZmFpbHVyZSA9IDMgW2RlcHJlY2F0ZWQgPSB0cnVlXTsKKworICAgICAgICAgIC8vIFRpbWUgdGhpcyB0ZXN0IHdhcyBzdGFydGVkLgorICAgICAgICAgIG9wdGlvbmFsIGludDY0IGRlcHJlY2F0ZWRfc3RhcnRfdGltZSA9IDQgW2RlcHJlY2F0ZWQgPSB0cnVlXTsKKworICAgICAgICAgIC8vIFRpbWUgdGhpcyB0ZXN0IGNvbXBsZXRlZC4KKyAgICAgICAgICBvcHRpb25hbCBpbnQ2NCBkZXByZWNhdGVkX2VuZF90aW1lID0gNSBbZGVwcmVjYXRlZCA9IHRydWVdOworCisgICAgICAgICAgLy8gQ2FwdHVyZXMgYW4gZXhjZXB0aW9uIHRocm93biBkdXJpbmcgdGhlIHRlc3QuCisgICAgICAgICAgbWVzc2FnZSBGYWlsZWRTY2VuZSB7CisgICAgICAgICAgICBvcHRpb25hbCBzdHJpbmcgZXhjZXB0aW9uX21lc3NhZ2UgPSAxOworICAgICAgICAgICAgb3B0aW9uYWwgc3RyaW5nIHN0YWNrX3RyYWNlID0gMjsKKyAgICAgICAgICB9CisgICAgICAgICAgcmVwZWF0ZWQgRmFpbGVkU2NlbmUgZmFpbGVkX3NjZW5lID0gNjsKKworICAgICAgICAgIC8vIFN1bW1hcnkgb2YgdGhlIFBUUyB0ZXN0LgorICAgICAgICAgIG1lc3NhZ2UgU3VtbWFyeSB7CisgICAgICAgICAgICBvcHRpb25hbCBzdHJpbmcgbWVzc2FnZSA9IDE7CisgICAgICAgICAgICBvcHRpb25hbCBSZXN1bHRUeXBlIHNjb3JlX3R5cGUgPSAyOworICAgICAgICAgICAgb3B0aW9uYWwgUmVzdWx0VW5pdCB1bml0ID0gMzsKKyAgICAgICAgICAgIG9wdGlvbmFsIGRvdWJsZSB2YWx1ZSA9IDQ7CisgICAgICAgICAgfQorICAgICAgICAgIG9wdGlvbmFsIFN1bW1hcnkgc3VtbWFyeSA9IDc7CisKKyAgICAgICAgICAvLyBEZXRhaWxzIG9mIHRoZSBQVFMgdGVzdC4KKyAgICAgICAgICBtZXNzYWdlIERldGFpbHMgeworCisgICAgICAgICAgICAvLyBTZXQgb2YgdmFsdWVzIGNhcHR1cmVkIHdoZW4gcnVubmluZyB0aGUgUFRTIHRlc3QuCisgICAgICAgICAgICBtZXNzYWdlIFZhbHVlQXJyYXkgeworICAgICAgICAgICAgICBvcHRpb25hbCBzdHJpbmcgc291cmNlID0gMTsKKyAgICAgICAgICAgICAgb3B0aW9uYWwgc3RyaW5nIG1lc3NhZ2UgPSAyOworICAgICAgICAgICAgICBvcHRpb25hbCBSZXN1bHRUeXBlIHNjb3JlX3R5cGUgPSAzOworICAgICAgICAgICAgICBvcHRpb25hbCBSZXN1bHRVbml0IHVuaXQgPSA0OworICAgICAgICAgICAgICByZXBlYXRlZCBkb3VibGUgdmFsdWUgPSA1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVwZWF0ZWQgVmFsdWVBcnJheSB2YWx1ZV9hcnJheSA9IDE7CisgICAgICAgICAgfQorICAgICAgICAgIG9wdGlvbmFsIERldGFpbHMgZGV0YWlscyA9IDg7CisgICAgICAgIH0KKyAgICAgICAgcmVwZWF0ZWQgVGVzdCB0ZXN0ID0gMzsKKyAgICAgIH0KKyAgICAgIHJlcGVhdGVkIFRlc3RDYXNlIHRlc3RfY2FzZSA9IDI7CisgICAgfQorICAgIHJlcGVhdGVkIFRlc3RTdWl0ZSB0ZXN0X3N1aXRlID0gNTsKKworICAgIC8vIGFiaSBzcGVjaWZpZXMgdGhlIEFCSSB0aGUgdGVzdCByYW4gdW5kZXIgbGlrZSAiYXJtZWFiaSIuCisgICAgb3B0aW9uYWwgc3RyaW5nIGFiaSA9IDY7CisgIH0KKyAgcmVwZWF0ZWQgVGVzdFBhY2thZ2UgdGVzdF9wYWNrYWdlID0gODsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9jdHMtYXBpLWNvdmVyYWdlL3Byb3RvL3Rlc3RzdWl0ZS5wcm90byBiL3Rvb2xzL2N0cy1hcGktY292ZXJhZ2UvcHJvdG8vdGVzdHN1aXRlLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3YzY0ZGUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9jdHMtYXBpLWNvdmVyYWdlL3Byb3RvL3Rlc3RzdWl0ZS5wcm90bwpAQCAtMCwwICsxLDE3NSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIFtTVEFSVCBkZWNsYXJhdGlvbl0KK3N5bnRheCA9ICJwcm90bzMiOworcGFja2FnZSBjb21fYW5kcm9pZF9jdHNfYXBpY292ZXJhZ2U7CisvLyBbRU5EIGRlY2xhcmF0aW9uXQorCisvLyBbU1RBUlQgamF2YV9kZWNsYXJhdGlvbl0KK29wdGlvbiBqYXZhX3BhY2thZ2UgPSAiY29tLmFuZHJvaWQuY3RzLmFwaWNvdmVyYWdlIjsKK29wdGlvbiBqYXZhX291dGVyX2NsYXNzbmFtZSA9ICJUZXN0U3VpdGVQcm90byI7CisvLyBbRU5EIGphdmFfZGVjbGFyYXRpb25dCisKKy8vIFtTVEFSVCBtZXNzYWdlc10KK21lc3NhZ2UgT3B0aW9uIHsKKyAgICBzdHJpbmcgbmFtZSA9IDE7CisgICAgc3RyaW5nIGtleSA9IDI7CisgICAgc3RyaW5nIHZhbHVlID0zOworfQorCittZXNzYWdlIENvbmZpZ01ldGFkYXRhIHsKKyAgICBzdHJpbmcgbW9kdWxlX25hbWUgPSAxOworICAgIHN0cmluZyBjb21wb25lbnQgPSAyOworICAgIHJlcGVhdGVkIE9wdGlvbiBvcHRpb25zID0gMzsKKworICAgIG1lc3NhZ2UgVGFyZ2V0UHJlcGFyZXIgeworICAgICAgICBzdHJpbmcgdGVzdF9jbGFzcyA9IDE7CisgICAgICAgIHJlcGVhdGVkIE9wdGlvbiBvcHRpb25zID0gMjsKKyAgICB9CisgICAgcmVwZWF0ZWQgVGFyZ2V0UHJlcGFyZXIgdGFyZ2V0X3ByZXBhcmVycyA9IDQ7CisKKyAgICBtZXNzYWdlIFRlc3RDbGFzcyB7CisgICAgICAgIHN0cmluZyB0ZXN0X2NsYXNzID0gMTsKKyAgICAgICAgc3RyaW5nIHBhY2thZ2UgPSAyOworICAgICAgICByZXBlYXRlZCBPcHRpb24gb3B0aW9ucyA9IDM7CisgICAgfQorICAgIHJlcGVhdGVkIFRlc3RDbGFzcyB0ZXN0X2NsYXNzZXMgPSA1OworfQorCittZXNzYWdlIEFubm90YXRpb24geworICAgIGludDMyIHZpc2liaWxpdHkgPSAxOworICAgIHN0cmluZyB0eXBlID0gMjsKKworICAgIG1lc3NhZ2UgRWxlbWVudCB7CisgICAgICAgIHN0cmluZyBuYW1lID0gMTsKKyAgICAgICAgc3RyaW5nIHZhbHVlID0gMjsKKyAgICB9CisgICAgcmVwZWF0ZWQgRWxlbWVudCBlbGVtZW50cyA9IDM7Cit9CisKK21lc3NhZ2UgVGVzdFN1aXRlIHsKKyAgICBzdHJpbmcgbmFtZSA9IDE7CisKKyAgICBtZXNzYWdlIFBhY2thZ2UgeworICAgICAgICBzdHJpbmcgbmFtZSA9IDE7CisKKyAgICAgICAgZW51bSBUeXBlIHsKKyAgICAgICAgICAgIEFORFJPSURKVU5JVCA9IDA7CisgICAgICAgICAgICBKQVZBSE9TVCA9IDE7CisgICAgICAgICAgICBHVEVTVCA9IDI7CisgICAgICAgICAgICBERVFQID0gMzsKKyAgICAgICAgICAgIExJQkNPUkUgPSA0OworICAgICAgICAgICAgREFMVklLID0gNTsKKyAgICAgICAgfQorICAgICAgICBUeXBlIHR5cGUgPSAyOworCisgICAgICAgIG1lc3NhZ2UgQ2xhc3MgeworICAgICAgICAgICAgc3RyaW5nIG5hbWUgPSAxOworICAgICAgICAgICAgc3RyaW5nIHR5cGUgPSAyOworICAgICAgICAgICAgc3RyaW5nIHN1cGVyX2NsYXNzID0gMzsKKyAgICAgICAgICAgIHN0cmluZyBpbnRlcmZhY2UgPSA0OworCisgICAgICAgICAgICBlbnVtIENsYXNzVHlwZSB7CisgICAgICAgICAgICAgICAgVU5LTk9XTiA9IDA7CisgICAgICAgICAgICAgICAgSlVOSVQzID0gMTsKKyAgICAgICAgICAgICAgICBKVU5JVDQgPSAyOworICAgICAgICAgICAgICAgIFBBUkFNRVRFUklaRUQgPSAzOworICAgICAgICAgICAgICAgIEpBVkFIT1NUID0gNDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ2xhc3NUeXBlIGNsYXNzX3R5cGUgPSA1OworICAgICAgICAgICAgcmVwZWF0ZWQgQW5ub3RhdGlvbiBhbm5vdGF0aW9ucyA9IDY7CisKKyAgICAgICAgICAgIG1lc3NhZ2UgTWV0aG9kIHsKKyAgICAgICAgICAgICAgICBzdHJpbmcgZGVmaW5pbmdfY2xhc3MgPSAxOworICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lID0gMjsKKyAgICAgICAgICAgICAgICBzdHJpbmcgcGFyYW1ldGVycyA9IDM7CisgICAgICAgICAgICAgICAgc3RyaW5nIHJldHVybl90eXBlID0gNDsKKyAgICAgICAgICAgICAgICBpbnQzMiBhY2Nlc3NfZmxhZ3MgPSA1OworICAgICAgICAgICAgICAgIHJlcGVhdGVkIEFubm90YXRpb24gYW5ub3RhdGlvbnMgPSA2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVwZWF0ZWQgTWV0aG9kIG1ldGhvZHMgPSA3OworCisgICAgICAgICAgICBtZXNzYWdlIEZpZWxkIHsKKyAgICAgICAgICAgICAgICBzdHJpbmcgZGVmaW5pbmdfY2xhc3MgPSAxOworICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lID0gMjsKKyAgICAgICAgICAgICAgICBzdHJpbmcgdHlwZSA9IDM7CisgICAgICAgICAgICAgICAgaW50MzIgYWNjZXNzX2ZsYWdzID0gNDsKKyAgICAgICAgICAgICAgICBzdHJpbmcgaW5pdGlhbF92YWx1ZSA9IDU7CisgICAgICAgICAgICAgICAgcmVwZWF0ZWQgQW5ub3RhdGlvbiBhbm5vdGF0aW9ucyA9IDY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXBlYXRlZCBGaWVsZCBmaWVsZHMgPSA4OworICAgICAgICAgICAgc3RyaW5nIGFwayA9IDk7CisgICAgICAgIH0KKyAgICAgICAgcmVwZWF0ZWQgQ2xhc3MgY2xhc3NlcyA9IDM7CisgICAgICAgIHN0cmluZyBvcF9jb2RlcyA9IDQ7CisgICAgfQorICAgIHJlcGVhdGVkIFBhY2thZ2UgcGFja2FnZXMgPSAyOworfQorCisvLyB0YXJnZXQgRmlsZSBNZXRhZGF0YSBmb3IgZS5nLiBjb25maWcsIGFwaywgamFyLCBleGUsIHNvCittZXNzYWdlIEZpbGVNZXRhZGF0YSB7CisgICAgc3RyaW5nIGRlc2NyaXB0aW9uID0gMTsKKyAgICBDb25maWdNZXRhZGF0YSBjb25maWdfbWV0YWRhdGEgPSAyOworfQorCisvLyBBbiBlbnRyeSBpbiBhIFRlc3QgU3VpcmUgUmVsZWFzZSBtZXNzYWdlczogY3RzLCBldGMuCittZXNzYWdlIEVudHJ5IHsKKyAgICAvLyBFbnRyeSBJRAorICAgIHN0cmluZyBpZCA9IDE7CisgICAgLy8gTmFtZQorICAgIHN0cmluZyBuYW1lID0gMjsKKworICAgIGVudW0gRW50cnlUeXBlIHsKKyAgICAgICAgRk9MREVSID0gMDsKKyAgICAgICAgRklMRSA9IDE7CisgICAgICAgIENPTkZJRyA9IDI7CisgICAgICAgIEpBUiA9IDM7CisgICAgICAgIEFQSyA9IDQ7CisgICAgICAgIEVYRSA9IDU7CisgICAgICAgIFNPID0gNjsKKyAgICB9CisKKyAgICAvLyBUeXBlCisgICAgRW50cnlUeXBlIHR5cGUgPSAzOworICAgIC8vIFNpemUKKyAgICBpbnQ2NCBzaXplID0gNDsKKyAgICAvLyBDb250ZW50IElECisgICAgc3RyaW5nIGNvbnRlbnRfaWQgPSA1OworICAgIC8vIFBhcmVudCBlbnRyeSBJRAorICAgIHN0cmluZyBwYXJlbnRfaWQgPSA2OworICAgIC8vIFJlbGF0aXZlIHBhdGgKKyAgICBzdHJpbmcgcmVsYXRpdmVfcGF0aCA9IDc7CisKKyAgICBGaWxlTWV0YWRhdGEgZmlsZV9tZXRhZGF0YSA9IDg7Cit9CisKKy8vIFRlc3QgU3VpdGUgUmVsZWFzZTogY3RzLCBldGMuCittZXNzYWdlIFRlc3RTdWl0ZUNvbnRlbnQgeworICAgIC8vIEVudHJ5IElECisgICAgc3RyaW5nIGlkID0gMTsKKyAgICAvLyBOYW1lCisgICAgc3RyaW5nIG5hbWUgPSAyOworICAgIC8vIFZlcnNpb24KKyAgICBzdHJpbmcgdmVyc2lvbiA9IDM7CisgICAgLy8gQnVpbGQgSUQKKyAgICBzdHJpbmcgYmlkID0gNDsKKyAgICAvLyBDb250ZW50IElECisgICAgc3RyaW5nIGNvbnRlbnRfaWQgPSA1OworICAgIC8vIEZpbGUgRW50cmllcworICAgIHJlcGVhdGVkIEVudHJ5IGZpbGVfZW50cmllcyA9IDY7CisgICAgcmVwZWF0ZWQgc3RyaW5nIGtub3duX2ZhaWx1cmVzID0gNzsKK30KKy8vIFtFTkQgbWVzc2FnZXNdCmRpZmYgLS1naXQgYS90b29scy9jdHMtYXBpLWNvdmVyYWdlL3NyYy9yZXMvYXBpLWNvdmVyYWdlLnhzbCBiL3Rvb2xzL2N0cy1hcGktY292ZXJhZ2UvcmVzL2FwaS1jb3ZlcmFnZS54c2wKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL2N0cy1hcGktY292ZXJhZ2Uvc3JjL3Jlcy9hcGktY292ZXJhZ2UueHNsCnJlbmFtZSB0byB0b29scy9jdHMtYXBpLWNvdmVyYWdlL3Jlcy9hcGktY292ZXJhZ2UueHNsCmRpZmYgLS1naXQgYS90b29scy9jdHMtYXBpLWNvdmVyYWdlL3NyYy9BbmRyb2lkLm1rIGIvdG9vbHMvY3RzLWFwaS1jb3ZlcmFnZS9zcmMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYzYjU1OC4uMDAwMDAwMAotLS0gYS90b29scy9jdHMtYXBpLWNvdmVyYWdlL3NyYy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotCi0KLSMgY3RzLWFwaS1jb3ZlcmFnZSBqYXZhIGxpYnJhcnkKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtc3ViZGlyLWphdmEtZmlsZXMpCi1MT0NBTF9KQVZBX1JFU09VUkNFX0RJUlMgOj0gcmVzIAotTE9DQUxfSkFSX01BTklGRVNUIDo9IE1BTklGRVNULm1mCi0KLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCi0gIGNvbXBhdGliaWxpdHktaG9zdC11dGlsIFwKLSAgZGV4bGliMgotCi1MT0NBTF9NT0RVTEUgOj0gY3RzLWFwaS1jb3ZlcmFnZQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotIyBUaGlzIHRvb2wgaXMgbm90IGNoZWNraW5nIGFueSBkZXBlbmRlbmNpZXMgb3IgbWV0YWRhdGEsIHNvIGFsbCBvZiB0aGUKLSMgZGVwZW5kZW5jaWVzIG9mIGFsbCBvZiB0aGUgdGVzdHMgbXVzdCBiZSBvbiBpdHMgY2xhc3NwYXRoLiBUaGlzIGlzCi0jIHN1cGVyIGZyYWdpbGUuCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgKz0gXAotICAgICAgICBob3N0LWxpYnByb3RvYnVmLWphdmEtZnVsbCBcCi0gICAgICAgIHBsYXRmb3JtcHJvdG9zCi0KLWluY2x1ZGUgJChCVUlMRF9IT1NUX0pBVkFfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3Rvb2xzL2N0cy1hcGktY292ZXJhZ2Uvc3JjL2NvbS9hbmRyb2lkL2N0cy9hcGljb3ZlcmFnZS9Db21wYXJpc29uUmVwb3J0LmphdmEgYi90b29scy9jdHMtYXBpLWNvdmVyYWdlL3NyYy9jb20vYW5kcm9pZC9jdHMvYXBpY292ZXJhZ2UvQ29tcGFyaXNvblJlcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYjlkZTYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9jdHMtYXBpLWNvdmVyYWdlL3NyYy9jb20vYW5kcm9pZC9jdHMvYXBpY292ZXJhZ2UvQ29tcGFyaXNvblJlcG9ydC5qYXZhCkBAIC0wLDAgKzEsMjIyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5jdHMuYXBpY292ZXJhZ2U7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jdHMuYXBpY292ZXJhZ2UuVGVzdFN1aXRlUHJvdG8uKjsKK2ltcG9ydCBjb20uYW5kcm9pZC5jdHMuYXBpY292ZXJhZ2UuQ3RzUmVwb3J0UHJvdG8uKjsKKworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBDbGFzcyB0aGF0IG91dHB1dHMgYW4gWE1MIHJlcG9ydCBvZiB0aGUge0BsaW5rIEFwaUNvdmVyYWdlfSBjb2xsZWN0ZWQuIEl0IGNhbiBiZSB2aWV3ZWQgaW4gYQorICogYnJvd3NlciB3aGVuIHVzZWQgd2l0aCB0aGUgYXBpLWNvdmVyYWdlLmNzcyBhbmQgYXBpLWNvdmVyYWdlLnhzbCBmaWxlcy4KKyAqLworY2xhc3MgQ29tcGFyaXNvblJlcG9ydCB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9SRVNVTFRfRklMRV9OQU1FID0gInRlc3RfcmVzdWx0LnhtbCI7CisgICAgLy8gW21vZHVsZV0uW2NsYXNzXSNbbWV0aG9kXQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RDQVNFX05BTUVfRk9STUFUID0gIiVzLiVzIyVzIjsKKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJpbnRVc2FnZSgpIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZTogUmVwb3J0Q2hlY2tlciBbT1BUSU9OXS4uLiIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJHZW5lcmF0ZXMgYSBjb21wYXJzaW9uIHJlcG9ydCBhYm91dCBUZXN0IFN1aXRlIENvbnRlbnQgYW5kIFJlcG9ydC4iKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT3B0aW9uczoiKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC1vIEZJTEUgICAgICAgICAgICAgICAgb3V0cHV0IGZpbGUgb2YgbWlzc2luZyB0ZXN0IGNhc2UgbGlzdCIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLWUgRklMRSAgICAgICAgICAgICAgICBvdXRwdXQgZmlsZSBvZiBleHRyYSB0ZXN0IGNhc2UgbGlzdCAiKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC1yIEZJTEUgICAgICAgICAgICAgICAgdGVzdCByZXBvcnQgUEIgZmlsZSIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLXQgRklMRSAgICAgICAgICAgICAgICB0ZXN0IHN1aXRlIGNvbnRlbnQgUEIgZmlsZSIpOworCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOworICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzS25vd25GYWlsdXJlKFN0cmluZyB0c05hbWUsIExpc3Q8U3RyaW5nPiBrbm93bkZhaWx1cmVzKSB7CisgICAgICAgIGZvciAoU3RyaW5nIGtmIDoga25vd25GYWlsdXJlcykgeworICAgICAgICAgICAgaWYgKHRzTmFtZS5zdGFydHNXaXRoKGtmKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlQ29tcGFyc2lvblJlcG9ydCgKKyAgICAgICAgICAgIFRlc3RTdWl0ZSB0cywKKyAgICAgICAgICAgIEN0c1JlcG9ydCB0c1JlcG9ydCwKKyAgICAgICAgICAgIFN0cmluZyBvdXRwdXRGaWxlTmFtZSwKKyAgICAgICAgICAgIFN0cmluZyBvdXRwdXRFeHRyYVRlc3RGaWxlTmFtZSwKKyAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBrbm93bkZhaWx1cmVzLAorICAgICAgICAgICAgU3RyaW5nIGV4dHJhVGVzdFN1YlBsYW5GaWxlTmFtZSkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gdGVzdENhc2VNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAgICAgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gZXh0cmFUZXN0Q2FzZU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworICAgICAgICAvLyBBZGQgYWxsIHRlc3QgY2FzZSBpbnRvIGEgSGFzaE1hcAorICAgICAgICBmb3IgKFRlc3RTdWl0ZS5QYWNrYWdlIHBrZyA6IHRzLmdldFBhY2thZ2VzTGlzdCgpKSB7CisgICAgICAgICAgICBmb3IgKFRlc3RTdWl0ZS5QYWNrYWdlLkNsYXNzIGNscyA6IHBrZy5nZXRDbGFzc2VzTGlzdCgpKSB7CisgICAgICAgICAgICAgICAgZm9yIChUZXN0U3VpdGUuUGFja2FnZS5DbGFzcy5NZXRob2QgbXRkIDogY2xzLmdldE1ldGhvZHNMaXN0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRlc3RDYXNlTmFtZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RDQVNFX05BTUVfRk9STUFULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGtnLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNscy5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdGQuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gRmlsdGVyIG91dCBrbm93biBmYWlsdXJlcworICAgICAgICAgICAgICAgICAgICBpZiAoIWlzS25vd25GYWlsdXJlKHRlc3RDYXNlTmFtZSwga25vd25GYWlsdXJlcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0ZXN0QXBrVHlwZSA9IFN0cmluZy5mb3JtYXQoIiVzLCVzIiwgY2xzLmdldEFwaygpLCBwa2cuZ2V0VHlwZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RDYXNlTWFwLnB1dCh0ZXN0Q2FzZU5hbWUsIHRlc3RBcGtUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhVGVzdENhc2VNYXAucHV0KHRlc3RDYXNlTmFtZSwgdGVzdEFwa1R5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoImFkZDogJXM6ICVzXG4iLCB0ZXN0Q2FzZU5hbWUsIHRlc3RBcGtUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCJLRjogJXNcbiIsIHRlc3RDYXNlTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgU3lzdGVtLm91dC5wcmludGYoCisgICAgICAgICAgICAgICAgIkJlZm9yZTogdGVzdENhc2VNYXAgZW50cmllczogJWQgJiBleHRyYVRlc3RDYXNlTWFwOiAlZFxuIiwKKyAgICAgICAgICAgICAgICB0ZXN0Q2FzZU1hcC5zaXplKCksIGV4dHJhVGVzdENhc2VNYXAuc2l6ZSgpKTsKKworICAgICAgICAvL0xpc3QgbWlzc2luZyBUZXN0IENhc2VzCisgICAgICAgIEZpbGVXcml0ZXIgZldyaXRlciA9IG5ldyBGaWxlV3JpdGVyKG91dHB1dEZpbGVOYW1lKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgcFdyaXRlciA9IG5ldyBQcmludFdyaXRlcihmV3JpdGVyKTsKKworICAgICAgICBwV3JpdGVyLnByaW50Zigibm8sTW9kdWxlLFRlc3RDYXNlLGFiaVxuIik7CisgICAgICAgIGludCBpID0gMTsKKyAgICAgICAgZm9yIChDdHNSZXBvcnQuVGVzdFBhY2thZ2UgdFBrZyA6IHRzUmVwb3J0LmdldFRlc3RQYWNrYWdlTGlzdCgpKSB7CisgICAgICAgICAgICBmb3IgKEN0c1JlcG9ydC5UZXN0UGFja2FnZS5UZXN0U3VpdGUgbW9kdWxlIDogdFBrZy5nZXRUZXN0U3VpdGVMaXN0KCkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKEN0c1JlcG9ydC5UZXN0UGFja2FnZS5UZXN0U3VpdGUuVGVzdENhc2UgdGVzdENhc2UgOiBtb2R1bGUuZ2V0VGVzdENhc2VMaXN0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChDdHNSZXBvcnQuVGVzdFBhY2thZ2UuVGVzdFN1aXRlLlRlc3RDYXNlLlRlc3QgdGVzdCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdENhc2UuZ2V0VGVzdExpc3QoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRlc3RDYXNlTmFtZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVENBU0VfTkFNRV9GT1JNQVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFBrZy5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdENhc2UuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3QuZ2V0TmFtZSgpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJybTogJXMsICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0Q2FzZU5hbWUsIGV4dHJhVGVzdENhc2VNYXAucmVtb3ZlKHRlc3RDYXNlTmFtZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0ZXN0Q2FzZU1hcC5jb250YWluc0tleSh0ZXN0Q2FzZU5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdyaXRlci5wcmludGYoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJWQsJXMsJXMsJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKyssIG1vZHVsZS5nZXROYW1lKCksIHRlc3RDYXNlTmFtZSwgdFBrZy5nZXRBYmkoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcFdyaXRlci5jbG9zZSgpOworCisgICAgICAgIC8vTGlzdCBleHRyYSBUZXN0IENhc2VzCisgICAgICAgIGZXcml0ZXIgPSBuZXcgRmlsZVdyaXRlcihvdXRwdXRFeHRyYVRlc3RGaWxlTmFtZSk7CisgICAgICAgIHBXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoZldyaXRlcik7CisgICAgICAgIHBXcml0ZXIucHJpbnRmKCJubyxUZXN0Q2FzZSxBcGssVHlwZVxuIik7CisgICAgICAgIGludCBqID0gMTsKKyAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IHRlc3QgOiBleHRyYVRlc3RDYXNlTWFwLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIHBXcml0ZXIucHJpbnRmKCIlZCwlcywlc1xuIiwgaisrLCB0ZXN0LmdldEtleSgpLCB0ZXN0LmdldFZhbHVlKCkpOworICAgICAgICB9CisgICAgICAgIHBXcml0ZXIuY2xvc2UoKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGYoCisgICAgICAgICAgICAgICAgIkFmdGVyOiB0ZXN0Q2FzZU1hcCBlbnRyaWVzOiAlZCAmIGV4dHJhVGVzdENhc2VNYXA6ICVkXG4iLAorICAgICAgICAgICAgICAgIHRlc3RDYXNlTWFwLnNpemUoKSwgZXh0cmFUZXN0Q2FzZU1hcC5zaXplKCkpOworICAgICAgICAgICAgICAgIAorICAgICAgICBpZiAobnVsbCAhPSBleHRyYVRlc3RTdWJQbGFuRmlsZU5hbWUpIHsKKyAgICAgICAgICAgIC8vQ3JlYXRlIGV4dHJhIFRlc3QgQ2FzZXMgc3VicGxhbgorICAgICAgICAgICAgZldyaXRlciA9IG5ldyBGaWxlV3JpdGVyKGV4dHJhVGVzdFN1YlBsYW5GaWxlTmFtZSk7CisgICAgICAgICAgICBwV3JpdGVyID0gbmV3IFByaW50V3JpdGVyKGZXcml0ZXIpOworICAgICAgICAgICAgcFdyaXRlci5wcmludGxuKCI8P3htbCB2ZXJzaW9uPVwnMS4wXCcgZW5jb2Rpbmc9XCdVVEYtOFwnIHN0YW5kYWxvbmU9XCdub1wnID8+Iik7CisgICAgICAgICAgICBwV3JpdGVyLnByaW50bG4oIjxTdWJQbGFuIHZlcnNpb249XCcyLjBcJz4iKTsKKyAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiB0ZXN0IDogZXh0cmFUZXN0Q2FzZU1hcC5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICAgICAgcFdyaXRlci5wcmludGYoCisgICAgICAgICAgICAgICAgICAgICAgICAiICA8RW50cnkgaW5jbHVkZT1cIiVzXCIvPlxuIiwgdGVzdC5nZXRLZXkoKS5yZXBsYWNlRmlyc3QoIlxcLiIsICIgIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcFdyaXRlci5wcmludGxuKCI8L1N1YlBsYW4+Iik7CisgICAgICAgICAgICBwV3JpdGVyLmNsb3NlKCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgb3V0cHV0RmlsZU5hbWUgPSAiLi9taXNzaW5nVGVzdENhc2UuY3N2IjsKKyAgICAgICAgU3RyaW5nIHRlc3RSZXBvcnRGaWxlTmFtZSA9ICIuL2V4dHJhVGVzdENhc2UuY3N2IjsKKyAgICAgICAgU3RyaW5nIHRlc3RTdWl0ZUZpbGVOYW1lID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIHRlc3RTdWl0ZUNvbnRlbnRGaWxlTmFtZSA9IG51bGw7CisgICAgICAgIFN0cmluZyBvdXRwdXRFeHRyYVRlc3RGaWxlTmFtZSA9IG51bGw7CisgICAgICAgIFN0cmluZyBleHRyYVRlc3RTdWJQbGFuRmlsZU5hbWUgPSBudWxsOworICAgICAgICBpbnQgbnVtVGVzdE1vZHVsZSA9IDA7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoYXJnc1tpXS5zdGFydHNXaXRoKCItIikpIHsKKyAgICAgICAgICAgICAgICBpZiAoIi1vIi5lcXVhbHMoYXJnc1tpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0RmlsZU5hbWUgPSBnZXRFeHBlY3RlZEFyZyhhcmdzLCArK2kpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIi1yIi5lcXVhbHMoYXJnc1tpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGVzdFJlcG9ydEZpbGVOYW1lID0gZ2V0RXhwZWN0ZWRBcmcoYXJncywgKytpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCItZSIuZXF1YWxzKGFyZ3NbaV0pKSB7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dEV4dHJhVGVzdEZpbGVOYW1lID0gZ2V0RXhwZWN0ZWRBcmcoYXJncywgKytpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCItdCIuZXF1YWxzKGFyZ3NbaV0pKSB7CisgICAgICAgICAgICAgICAgICAgIHRlc3RTdWl0ZUZpbGVOYW1lID0gZ2V0RXhwZWN0ZWRBcmcoYXJncywgKytpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCItcyIuZXF1YWxzKGFyZ3NbaV0pKSB7CisgICAgICAgICAgICAgICAgICAgIHRlc3RTdWl0ZUNvbnRlbnRGaWxlTmFtZSA9IGdldEV4cGVjdGVkQXJnKGFyZ3MsICsraSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiLXAiLmVxdWFscyhhcmdzW2ldKSkgeworICAgICAgICAgICAgICAgICAgICBleHRyYVRlc3RTdWJQbGFuRmlsZU5hbWUgPSBnZXRFeHBlY3RlZEFyZyhhcmdzLCArK2kpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50VXNhZ2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByaW50VXNhZ2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChudWxsID09IHRlc3RSZXBvcnRGaWxlTmFtZSB8fCBudWxsID09IHRlc3RTdWl0ZUNvbnRlbnRGaWxlTmFtZSkgeworICAgICAgICAgICAgcHJpbnRVc2FnZSgpOworICAgICAgICB9CisKKyAgICAgICAgVGVzdFN1aXRlQ29udGVudCB0c0NvbnRlbnQgPQorICAgICAgICAgICAgICAgIFRlc3RTdWl0ZUNvbnRlbnQucGFyc2VGcm9tKG5ldyBGaWxlSW5wdXRTdHJlYW0odGVzdFN1aXRlQ29udGVudEZpbGVOYW1lKSk7CisgICAgICAgIFRlc3RTdWl0ZSB0cyA9IFRlc3RTdWl0ZS5wYXJzZUZyb20obmV3IEZpbGVJbnB1dFN0cmVhbSh0ZXN0U3VpdGVGaWxlTmFtZSkpOworICAgICAgICBDdHNSZXBvcnQgdHNSZXBvcnQgPSBDdHNSZXBvcnQucGFyc2VGcm9tKG5ldyBGaWxlSW5wdXRTdHJlYW0odGVzdFJlcG9ydEZpbGVOYW1lKSk7CisKKyAgICAgICAgd3JpdGVDb21wYXJzaW9uUmVwb3J0KAorICAgICAgICAgICAgICAgIHRzLAorICAgICAgICAgICAgICAgIHRzUmVwb3J0LAorICAgICAgICAgICAgICAgIG91dHB1dEZpbGVOYW1lLAorICAgICAgICAgICAgICAgIG91dHB1dEV4dHJhVGVzdEZpbGVOYW1lLAorICAgICAgICAgICAgICAgIHRzQ29udGVudC5nZXRLbm93bkZhaWx1cmVzTGlzdCgpLAorICAgICAgICAgICAgICAgIGV4dHJhVGVzdFN1YlBsYW5GaWxlTmFtZSk7CisgICAgICAgIFN5c3RlbS5lcnIucHJpbnRmKCIlcyIsIHRzQ29udGVudC5nZXRLbm93bkZhaWx1cmVzTGlzdCgpKTsKKyAgICB9CisKKyAgICAvKiogR2V0IHRoZSBhcmd1bWVudCBvciBwcmludCBvdXQgdGhlIHVzYWdlIGFuZCBleGl0LiAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRFeHBlY3RlZEFyZyhTdHJpbmdbXSBhcmdzLCBpbnQgaW5kZXgpIHsKKyAgICAgICAgaWYgKGluZGV4IDwgYXJncy5sZW5ndGgpIHsKKyAgICAgICAgICAgIHJldHVybiBhcmdzW2luZGV4XTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50VXNhZ2UoKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyBOZXZlciB3aWxsIGhhcHBlbiBiZWNhdXNlIHByaW50VXNhZ2Ugd2lsbCBjYWxsIGV4aXQoMSkKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2N0cy1hcGktY292ZXJhZ2Uvc3JjL2NvbS9hbmRyb2lkL2N0cy9hcGljb3ZlcmFnZS9DdHNSZXBvcnRIYW5kbGVyLmphdmEgYi90b29scy9jdHMtYXBpLWNvdmVyYWdlL3NyYy9jb20vYW5kcm9pZC9jdHMvYXBpY292ZXJhZ2UvQ3RzUmVwb3J0SGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZjExNTYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9jdHMtYXBpLWNvdmVyYWdlL3NyYy9jb20vYW5kcm9pZC9jdHMvYXBpY292ZXJhZ2UvQ3RzUmVwb3J0SGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmN0cy5hcGljb3ZlcmFnZTsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy5hcGljb3ZlcmFnZS5DdHNSZXBvcnRQcm90by4qOworCitpbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKKworLyoqCisgKiB7QGxpbmsgRGVmYXVsdEhhbmRsZXJ9IHRoYXQgYnVpbGRzIGFuIGVtcHR5IHtAbGluayBBcGlDb3ZlcmFnZX0gb2JqZWN0IGZyb20gc2Nhbm5pbmcKKyAqIFRlc3RNb2R1bGUueG1sLgorICovCitjbGFzcyBDdHNSZXBvcnRIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfVEFHID0gIk1vZHVsZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQ0FTRV9UQUcgPSAiVGVzdENhc2UiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1RBRyA9ICJUZXN0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9UQUcgPSAibmFtZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9UQUcgPSAicmVzdWx0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJJX1RBRyA9ICJhYmkiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBET05FX1RBRyA9ICJkb25lIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTU19UQUcgPSAicGFzcyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZBSUxFRF9UQUcgPSAiZmFpbGVkIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlVOVElNRV9UQUcgPSAicnVudGltZSI7CisKKyAgICBwcml2YXRlIEN0c1JlcG9ydC5CdWlsZGVyIG1DdHNSZXBvcnRCbGQ7CisgICAgcHJpdmF0ZSBDdHNSZXBvcnQuVGVzdFBhY2thZ2UuQnVpbGRlciBtVGVzdFBhY2thZ2VCbGQ7CisgICAgcHJpdmF0ZSBDdHNSZXBvcnQuVGVzdFBhY2thZ2UuVGVzdFN1aXRlLkJ1aWxkZXIgbVRlc3RTdWl0ZUJsZDsKKyAgICBwcml2YXRlIEN0c1JlcG9ydC5UZXN0UGFja2FnZS5UZXN0U3VpdGUuVGVzdENhc2UuQnVpbGRlciBtVGVzdENhc2VCbGQ7CisKKyAgICBDdHNSZXBvcnRIYW5kbGVyKFN0cmluZyBjb25maWdGaWxlTmFtZSkgeworICAgICAgICBtQ3RzUmVwb3J0QmxkID0gQ3RzUmVwb3J0Lm5ld0J1aWxkZXIoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykKKyAgICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBzdXBlci5zdGFydEVsZW1lbnQodXJpLCBsb2NhbE5hbWUsIG5hbWUsIGF0dHJpYnV0ZXMpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoTU9EVUxFX1RBRy5lcXVhbHNJZ25vcmVDYXNlKGxvY2FsTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBtVGVzdFBhY2thZ2VCbGQgPSBDdHNSZXBvcnQuVGVzdFBhY2thZ2UubmV3QnVpbGRlcigpOworICAgICAgICAgICAgICAgIG1UZXN0U3VpdGVCbGQgPSBDdHNSZXBvcnQuVGVzdFBhY2thZ2UuVGVzdFN1aXRlLm5ld0J1aWxkZXIoKTsKKyAgICAgICAgICAgICAgICBtVGVzdFN1aXRlQmxkLnNldE5hbWUoYXR0cmlidXRlcy5nZXRWYWx1ZShOQU1FX1RBRykpOworICAgICAgICAgICAgICAgIG1UZXN0UGFja2FnZUJsZC5zZXROYW1lKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoTkFNRV9UQUcpKTsKKyAgICAgICAgICAgICAgICAvLyBBQkkgaXMgb3B0aW9uIGZybyBhIFJlcG9ydAorICAgICAgICAgICAgICAgIGlmIChudWxsICE9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoTkFNRV9UQUcpKSB7CisgICAgICAgICAgICAgICAgICAgIG1UZXN0UGFja2FnZUJsZC5zZXRBYmkoYXR0cmlidXRlcy5nZXRWYWx1ZShBQklfVEFHKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChURVNUX0NBU0VfVEFHLmVxdWFsc0lnbm9yZUNhc2UobG9jYWxOYW1lKSkgeworICAgICAgICAgICAgICAgIG1UZXN0Q2FzZUJsZCA9IEN0c1JlcG9ydC5UZXN0UGFja2FnZS5UZXN0U3VpdGUuVGVzdENhc2UubmV3QnVpbGRlcigpOworICAgICAgICAgICAgICAgIG1UZXN0Q2FzZUJsZC5zZXROYW1lKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoTkFNRV9UQUcpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoVEVTVF9UQUcuZXF1YWxzSWdub3JlQ2FzZShsb2NhbE5hbWUpKSB7CisgICAgICAgICAgICAgICAgQ3RzUmVwb3J0LlRlc3RQYWNrYWdlLlRlc3RTdWl0ZS5UZXN0Q2FzZS5UZXN0LkJ1aWxkZXIgdGVzdEJsZDsKKyAgICAgICAgICAgICAgICB0ZXN0QmxkID0gQ3RzUmVwb3J0LlRlc3RQYWNrYWdlLlRlc3RTdWl0ZS5UZXN0Q2FzZS5UZXN0Lm5ld0J1aWxkZXIoKTsKKyAgICAgICAgICAgICAgICB0ZXN0QmxkLnNldE5hbWUoYXR0cmlidXRlcy5nZXRWYWx1ZShOQU1FX1RBRykpOworICAgICAgICAgICAgICAgIHRlc3RCbGQuc2V0UmVzdWx0KGF0dHJpYnV0ZXMuZ2V0VmFsdWUoUkVTVUxUX1RBRykpOworICAgICAgICAgICAgICAgIG1UZXN0Q2FzZUJsZC5hZGRUZXN0KHRlc3RCbGQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihsb2NhbE5hbWUgKyAiICIgKyBuYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIG5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBzdXBlci5lbmRFbGVtZW50KHVyaSwgbG9jYWxOYW1lLCBuYW1lKTsKKworICAgICAgICBpZiAoTU9EVUxFX1RBRy5lcXVhbHNJZ25vcmVDYXNlKGxvY2FsTmFtZSkpIHsKKyAgICAgICAgICAgIG1UZXN0UGFja2FnZUJsZC5hZGRUZXN0U3VpdGUobVRlc3RTdWl0ZUJsZCk7CisgICAgICAgICAgICBtQ3RzUmVwb3J0QmxkLmFkZFRlc3RQYWNrYWdlKG1UZXN0UGFja2FnZUJsZCk7CisgICAgICAgICAgICBtVGVzdFBhY2thZ2VCbGQgPSBudWxsOworICAgICAgICAgICAgbVRlc3RTdWl0ZUJsZCA9IG51bGw7CisgICAgICAgIH0gZWxzZSBpZiAoVEVTVF9DQVNFX1RBRy5lcXVhbHNJZ25vcmVDYXNlKGxvY2FsTmFtZSkpIHsKKyAgICAgICAgICAgIG1UZXN0U3VpdGVCbGQuYWRkVGVzdENhc2UobVRlc3RDYXNlQmxkKTsKKyAgICAgICAgICAgIG1UZXN0Q2FzZUJsZCA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgQ3RzUmVwb3J0IGdldEN0c1JlcG9ydCgpIHsKKyAgICAgICAgcmV0dXJuIG1DdHNSZXBvcnRCbGQuYnVpbGQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9jdHMtYXBpLWNvdmVyYWdlL3NyYy9jb20vYW5kcm9pZC9jdHMvYXBpY292ZXJhZ2UvQ3RzUmVwb3J0UGFyc2VyLmphdmEgYi90b29scy9jdHMtYXBpLWNvdmVyYWdlL3NyYy9jb20vYW5kcm9pZC9jdHMvYXBpY292ZXJhZ2UvQ3RzUmVwb3J0UGFyc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUzOTdmMAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2N0cy1hcGktY292ZXJhZ2Uvc3JjL2NvbS9hbmRyb2lkL2N0cy9hcGljb3ZlcmFnZS9DdHNSZXBvcnRQYXJzZXIuamF2YQpAQCAtMCwwICsxLDE2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY3RzLmFwaWNvdmVyYWdlOworCitpbXBvcnQgY29tLmFuZHJvaWQuY3RzLmFwaWNvdmVyYWdlLkN0c1JlcG9ydFByb3RvLio7CisKK2ltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOworaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuWE1MUmVhZGVyRmFjdG9yeTsKKworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKKy8qKgorICogQ2xhc3MgdGhhdCBvdXRwdXRzIGFuIFhNTCByZXBvcnQgb2YgdGhlIHtAbGluayBBcGlDb3ZlcmFnZX0gY29sbGVjdGVkLiBJdCBjYW4gYmUgdmlld2VkIGluIGEKKyAqIGJyb3dzZXIgd2hlbiB1c2VkIHdpdGggdGhlIGFwaS1jb3ZlcmFnZS5jc3MgYW5kIGFwaS1jb3ZlcmFnZS54c2wgZmlsZXMuCisgKi8KK2NsYXNzIEN0c1JlcG9ydFBhcnNlciB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9SRVNVTFRfRklMRV9OQU1FID0gInRlc3RfcmVzdWx0LnhtbCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50VXNhZ2UoKSB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2U6IEN0c1JlcG9ydFBhcnNlciBbT1BUSU9OXS4uLiBbQVBLXS4uLiIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJHZW5lcmF0ZXMgYSByZXBvcnQgYWJvdXQgd2hhdCBBbmRyb2lkIE5ESyBtZXRob2RzLiIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPcHRpb25zOiIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLW8gRklMRSAgICAgICAgICAgICAgICBvdXRwdXQgZmlsZSBvciBzdGFuZGFyZCBvdXQgaWYgbm90IGdpdmVuIik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtaSBQQVRIICAgICAgICAgICAgICAgIHBhdGggdG8gdGhlIFRlc3RfUmVzdWx0LnhtbCIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLXMgRklMRSAgICAgICAgICAgICAgICBzdW1tYXJ5IG91dHB1dCBmaWxlIik7CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CisgICAgICAgIFN5c3RlbS5leGl0KDEpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEN0c1JlcG9ydCBwYXJzZUN0c1JlcG9ydChTdHJpbmcgdGVzdFJlc3VsdFBhdGgpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgWE1MUmVhZGVyIHhtbFJlYWRlciA9IFhNTFJlYWRlckZhY3RvcnkuY3JlYXRlWE1MUmVhZGVyKCk7CisgICAgICAgIEN0c1JlcG9ydEhhbmRsZXIgY3RzUmVwb3J0WG1sSGFuZGxlciA9CisgICAgICAgICAgICAgICAgbmV3IEN0c1JlcG9ydEhhbmRsZXIodGVzdFJlc3VsdFBhdGgpOworICAgICAgICB4bWxSZWFkZXIuc2V0Q29udGVudEhhbmRsZXIoY3RzUmVwb3J0WG1sSGFuZGxlcik7CisgICAgICAgIEZpbGVSZWFkZXIgZmlsZVJlYWRlciA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIodGVzdFJlc3VsdFBhdGgpOworICAgICAgICAgICAgeG1sUmVhZGVyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShmaWxlUmVhZGVyKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoZmlsZVJlYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmlsZVJlYWRlci5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBjdHNSZXBvcnRYbWxIYW5kbGVyLmdldEN0c1JlcG9ydCgpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJpbnRDdHNSZXBvcnQoQ3RzUmVwb3J0IGN0c1JlcG9ydCkgeworICAgICAgICAvL0hlYWRlcgorICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1vZHVsZSxDbGFzcyxUZXN0LG5vLEFiaSxSZXN1bHQiKTsKKyAgICAgICAgaW50IGkgPSAxOworICAgICAgICBmb3IgKEN0c1JlcG9ydC5UZXN0UGFja2FnZSB0UGtnIDogY3RzUmVwb3J0LmdldFRlc3RQYWNrYWdlTGlzdCgpKSB7CisgICAgICAgICAgICBmb3IgKEN0c1JlcG9ydC5UZXN0UGFja2FnZS5UZXN0U3VpdGUgdFN1aXRlIDogdFBrZy5nZXRUZXN0U3VpdGVMaXN0KCkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKEN0c1JlcG9ydC5UZXN0UGFja2FnZS5UZXN0U3VpdGUuVGVzdENhc2UgdGVzdENhc2UgOiB0U3VpdGUuZ2V0VGVzdENhc2VMaXN0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChDdHNSZXBvcnQuVGVzdFBhY2thZ2UuVGVzdFN1aXRlLlRlc3RDYXNlLlRlc3QgdGVzdCA6IHRlc3RDYXNlLmdldFRlc3RMaXN0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMsJXMsJXMsJWQsJXMsJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRQa2cuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0Q2FzZS5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3QuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKyssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRQa2cuZ2V0QWJpKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3QuZ2V0UmVzdWx0KCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgcHJpbnRDdHNSZXBvcnRTdW1tYXJ5KEN0c1JlcG9ydCBjdHNSZXBvcnQsIFN0cmluZyBmTmFtZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9ueworCisgICAgICAgIEZpbGVXcml0ZXIgZldyaXRlciA9IG5ldyBGaWxlV3JpdGVyKGZOYW1lKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgcFdyaXRlciA9IG5ldyBQcmludFdyaXRlcihmV3JpdGVyKTsKKworICAgICAgICAvL0hlYWRlcgorICAgICAgICBwV3JpdGVyLnByaW50KCJNb2R1bGUsVGVzdCMsbm8sYWJpXG4iKTsKKworICAgICAgICBpbnQgbW9kdWxlQ250ID0gMDsKKyAgICAgICAgZm9yIChDdHNSZXBvcnQuVGVzdFBhY2thZ2UgdFBrZyA6IGN0c1JlcG9ydC5nZXRUZXN0UGFja2FnZUxpc3QoKSkgeworICAgICAgICAgICAgaW50IHRlc3RDYXNlQ250ID0gMDsKKyAgICAgICAgICAgIGZvciAoQ3RzUmVwb3J0LlRlc3RQYWNrYWdlLlRlc3RTdWl0ZSB0U3VpdGUgOiB0UGtnLmdldFRlc3RTdWl0ZUxpc3QoKSkgeworICAgICAgICAgICAgICAgIGZvciAoQ3RzUmVwb3J0LlRlc3RQYWNrYWdlLlRlc3RTdWl0ZS5UZXN0Q2FzZSB0ZXN0Q2FzZSA6IHRTdWl0ZS5nZXRUZXN0Q2FzZUxpc3QoKSkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKEN0c1JlcG9ydC5UZXN0UGFja2FnZS5UZXN0U3VpdGUuVGVzdENhc2UuVGVzdCB0ZXN0IDogdGVzdENhc2UuZ2V0VGVzdExpc3QoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGVzdENhc2VDbnQrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBXcml0ZXIucHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAiJXMsJWQsJWQsJXNcbiIsIHRQa2cuZ2V0TmFtZSgpLCB0ZXN0Q2FzZUNudCwgbW9kdWxlQ250KyssIHRQa2cuZ2V0QWJpKCkpOworICAgICAgICB9CisKKyAgICAgICAgcFdyaXRlci5jbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHRlc3RSZXN1bHRQYXRoID0gIi4vdGVzdF9yZXN1bHQueG1sIjsKKyAgICAgICAgU3RyaW5nIG91dHB1dEZpbGVOYW1lID0gIi4vdGVzdF9yZXN1bHQucGIiOworICAgICAgICBTdHJpbmcgb3V0cHV0U3VtbWFyeUZpbGVQYXRoID0gIi4vcmVwb3J0U3VtbWFyeS5jc3YiOworICAgICAgICBpbnQgbnVtVGVzdE1vZHVsZSA9IDA7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoYXJnc1tpXS5zdGFydHNXaXRoKCItIikpIHsKKyAgICAgICAgICAgICAgICBpZiAoIi1vIi5lcXVhbHMoYXJnc1tpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0RmlsZU5hbWUgPSBnZXRFeHBlY3RlZEFyZyhhcmdzLCArK2kpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIi1pIi5lcXVhbHMoYXJnc1tpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGVzdFJlc3VsdFBhdGggPSBnZXRFeHBlY3RlZEFyZyhhcmdzLCArK2kpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIi1zIi5lcXVhbHMoYXJnc1tpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3VtbWFyeUZpbGVQYXRoID0gZ2V0RXhwZWN0ZWRBcmcoYXJncywgKytpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwcmludFVzYWdlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcmludFVzYWdlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBSZWFkIG1lc3NhZ2UgZnJvbSB0aGUgZmlsZSBhbmQgcHJpbnQgdGhlbSBvdXQKKyAgICAgICAgQ3RzUmVwb3J0IGN0c1JlcG9ydCA9IHBhcnNlQ3RzUmVwb3J0KHRlc3RSZXN1bHRQYXRoKTsKKworICAgICAgICBwcmludEN0c1JlcG9ydChjdHNSZXBvcnQpOworICAgICAgICBwcmludEN0c1JlcG9ydFN1bW1hcnkoY3RzUmVwb3J0LCBvdXRwdXRTdW1tYXJ5RmlsZVBhdGgpOworCisKKyAgICAgICAgLy8gV3JpdGUgdGVzdCBjYXNlIGxpc3QgbWVzc2FnZSB0byBkaXNrLgorICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG91dHB1dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dHB1dEZpbGVOYW1lKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBjdHNSZXBvcnQud3JpdGVUbyhvdXRwdXQpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgIG91dHB1dC5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIEdldCB0aGUgYXJndW1lbnQgb3IgcHJpbnQgb3V0IHRoZSB1c2FnZSBhbmQgZXhpdC4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RXhwZWN0ZWRBcmcoU3RyaW5nW10gYXJncywgaW50IGluZGV4KSB7CisgICAgICAgIGlmIChpbmRleCA8IGFyZ3MubGVuZ3RoKSB7CisgICAgICAgICAgICByZXR1cm4gYXJnc1tpbmRleF07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludFVzYWdlKCk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gTmV2ZXIgd2lsbCBoYXBwZW4gYmVjYXVzZSBwcmludFVzYWdlIHdpbGwgY2FsbCBleGl0KDEpCisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9jdHMtYXBpLWNvdmVyYWdlL3NyYy9jb20vYW5kcm9pZC9jdHMvYXBpY292ZXJhZ2UvR1Rlc3RBcGlSZXBvcnQuamF2YSBiL3Rvb2xzL2N0cy1hcGktY292ZXJhZ2Uvc3JjL2NvbS9hbmRyb2lkL2N0cy9hcGljb3ZlcmFnZS9HVGVzdEFwaVJlcG9ydC5qYXZhCmluZGV4IGExYTY5MjMuLjNjODg5MzggMTAwNjQ0Ci0tLSBhL3Rvb2xzL2N0cy1hcGktY292ZXJhZ2Uvc3JjL2NvbS9hbmRyb2lkL2N0cy9hcGljb3ZlcmFnZS9HVGVzdEFwaVJlcG9ydC5qYXZhCisrKyBiL3Rvb2xzL2N0cy1hcGktY292ZXJhZ2Uvc3JjL2NvbS9hbmRyb2lkL2N0cy9hcGljb3ZlcmFnZS9HVGVzdEFwaVJlcG9ydC5qYXZhCkBAIC0xMjgsNyArMTI4LDcgQEAKIAogICAgICAgICAgICAgZm9yIChGaWxlIHRlc3RDb25maWdGaWxlIDogdGVzdENvbmZpZ0ZpbGVzKSB7CiAgICAgICAgICAgICAgICAgWE1MUmVhZGVyIHhtbFJlYWRlciA9IFhNTFJlYWRlckZhY3RvcnkuY3JlYXRlWE1MUmVhZGVyKCk7Ci0gICAgICAgICAgICAgICAgVGVzdE1vZHVsZUNvbmZpZ0hhbmRsZXIgdGVzdE1vZHVsZVhtbEhhbmRsZXIgPSBuZXcgVGVzdE1vZHVsZUNvbmZpZ0hhbmRsZXIoKTsKKyAgICAgICAgICAgICAgICBUZXN0TW9kdWxlQ29uZmlnSGFuZGxlciB0ZXN0TW9kdWxlWG1sSGFuZGxlciA9IG5ldyBUZXN0TW9kdWxlQ29uZmlnSGFuZGxlcihmaWxlLmdldE5hbWUoKSk7CiAgICAgICAgICAgICAgICAgeG1sUmVhZGVyLnNldENvbnRlbnRIYW5kbGVyKHRlc3RNb2R1bGVYbWxIYW5kbGVyKTsKICAgICAgICAgICAgICAgICBGaWxlUmVhZGVyIGZpbGVSZWFkZXIgPSBudWxsOwogCmRpZmYgLS1naXQgYS90b29scy9jdHMtYXBpLWNvdmVyYWdlL3NyYy9jb20vYW5kcm9pZC9jdHMvYXBpY292ZXJhZ2UvVGVzdENhc2VSZXBvcnQuamF2YSBiL3Rvb2xzL2N0cy1hcGktY292ZXJhZ2Uvc3JjL2NvbS9hbmRyb2lkL2N0cy9hcGljb3ZlcmFnZS9UZXN0Q2FzZVJlcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZWE2OGUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9jdHMtYXBpLWNvdmVyYWdlL3NyYy9jb20vYW5kcm9pZC9jdHMvYXBpY292ZXJhZ2UvVGVzdENhc2VSZXBvcnQuamF2YQpAQCAtMCwwICsxLDYwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY3RzLmFwaWNvdmVyYWdlOworCisKK2ltcG9ydCBjb20uYW5kcm9pZC5jdHMuYXBpY292ZXJhZ2UuVGVzdFN1aXRlUHJvdG8uKjsKK2ltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JUmVtb3RlVGVzdDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworCitpbXBvcnQgb3JnLmpmLmRleGxpYjIuQWNjZXNzRmxhZ3M7CitpbXBvcnQgb3JnLmpmLmRleGxpYjIuRGV4RmlsZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmpmLmRleGxpYjIuT3Bjb2RlczsKK2ltcG9ydCBvcmcuamYuZGV4bGliMi5pZmFjZS5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5qZi5kZXhsaWIyLmlmYWNlLkFubm90YXRpb25FbGVtZW50OworaW1wb3J0IG9yZy5qZi5kZXhsaWIyLmlmYWNlLkNsYXNzRGVmOworaW1wb3J0IG9yZy5qZi5kZXhsaWIyLmlmYWNlLkRleEZpbGU7CitpbXBvcnQgb3JnLmpmLmRleGxpYjIuaWZhY2UuTWV0aG9kOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlN1aXRlLlN1aXRlQ2xhc3NlczsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoczsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuamFyLkphckVudHJ5OworaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRmlsZTsKKworY2xhc3MgVGVzdENhc2VSZXBvcnQgeworICAgIC8vIEpVTklUMyBUZXN0IHN1ZmZpeAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1RBRyA9ICJUZXN0OyI7CisgICAgLy8gU29tZSBtYXkgZW5kcyB3aXRoIFRlc3RzIGUuZy4gY3RzL3Rlc3RzL3Rlc3RzL2FjY291bnRzL3NyYy9hbmRyb2lkL2FjY291bnRzL2N0cy9BYnN0cmFjdEF1dGhlbnRpY2F0b3JUZXN0cy5qYXZhCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RTX1RBRyA9ICJUZXN0czsiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1BSRUZJWF9UQUcgPSAidGVzdCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFUFJFQ0FURURfQU5OT1RBVElPTl9UQUcgPSAiTGphdmEvbGFuZy9EZXByZWNhdGVkOyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJVTl9XSVRIX0FOTk9UQVRJT05fVEFHID0KKyAgICAgICAgICAgICJMb3JnL2p1bml0L3J1bm5lci9SdW5XaXRoOyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQU5OT1RBVElPTl9UQUcgPQorICAgICAgICAgICAgIkxvcmcvanVuaXQvVGVzdDsiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVVBQUkVTU19BTk5PVEFUSU9OX1RBRyA9ICIvU3VwcHJlc3M7IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1FVEVSU19UQUcgPQorICAgICAgICAgICAgIkxvcmcvanVuaXQvcnVubmVycy9QYXJhbWV0ZXJpemVkJFBhcmFtZXRlcnMiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTkRST0lEX0pVTklUNF9URVNUX1RBRyA9CisgICAgICAgICAgICAiQW5kcm9pZEpVbml0NC5jbGFzcyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNRVRFUklaRURfVEFHID0KKyAgICAgICAgICAgICJQYXJhbWV0ZXJpemVkLmNsYXNzIjsKKworICAgIC8vIGNvbmZpZ3VyYXRpb24gb3B0aW9uCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVF9TSEFSREFCTEVfVEFHID0gIm5vdC1zaGFyZGFibGUiOworICAgIC8vIHRlc3QgY2xhc3Mgb3B0aW9uCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJVTlRJTUVfSElUX1RBRyA9ICJydW50aW1lLWhpbnQiOworICAgIC8vIGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkFuZHJvaWRKVW5pdFRlc3Qgb3B0aW9uCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0VfVEFHID0gInBhY2thZ2UiOworICAgIC8vIGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRlc3R0eXBlLkphckhvc3RUZXN0IG9wdGlvbgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVJfVEFHID0gImphciI7CisgICAgLy8gY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuR1Rlc3Qgb3B0aW9uCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BVElWRV9URVNUX0RFVklDRV9QQVRIX1RBRyA9ICJuYXRpdmUtdGVzdC1kZXZpY2UtcGF0aCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRV9UQUcgPSAibW9kdWxlLW5hbWUiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNVSVRFX0FQSV9JTlNUQUxMRVJfVEFHID0gImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIT1NUX1RFU1RfQ0xBU1NfVEFHID0KKyAgICAgICAgICAgICJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5KYXJIb3N0VGVzdCI7CisgICAgLy8gY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciBvcHRpb24KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9GSUxFX05BTUVfVEFHID0gInRlc3QtZmlsZS1uYW1lIjsKKyAgICAvLyBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50YXJnZXRwcmVwLkZpbGVQdXNoZXIgb3B0aW9uCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVU0hfVEFHID0gInB1c2giOworCisgICAgLy8gdGVzdCBjbGFzcworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTkRST0lEX0pVTklUX1RFU1RfVEFHID0gImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkFuZHJvaWRKVW5pdFRlc3QiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERVFQX1RFU1RfVEFHID0gImNvbS5kcmF3ZWxlbWVudHMuZGVxcC5ydW5uZXIuRGVxcFRlc3RSdW5uZXIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHVEVTVF9UQUcgPSAiY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuR1Rlc3QiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSUJDT1JFX1RFU1RfVEFHID0gImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkudGVzdHR5cGUuTGliY29yZVRlc3QiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQUxWSUtfVEVTVF9UQUcgPSAiY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS50ZXN0dHlwZS5EYWx2aWtUZXN0IjsKKworCisgICAgLy8gVGFyZ2V0IEZpbGUgRXh0ZW5zaW9ucworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfRVhUX1RBRyA9ICIuY29uZmlnIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX1JFR0VYID0gIi5jb25maWckIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFSX0VYVF9UQUcgPSAiLmphciI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFQS19FWFRfVEFHID0gIi5hcGsiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTT19FWFRfVEFHID0gIi5zbyI7CisKKyAgICAvLyBbbW9kdWxlXS5bY2xhc3NdI1ttZXRob2RdCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVENBU0VfTkFNRV9GT1JNQVQgPSAiJXMuJXMjJXMiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludFVzYWdlKCkgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlOiB0ZXN0LXN1aXRlLWNvbnRlbnQtcmVwb3J0IFtPUFRJT05dLi4uIik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkdlbmVyYXRlcyB0ZXN0IHRlc3QgbGlzdCBwcm90b2NhbCBidWZmZXIgbWVzc2FnZS4iKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKKyAgICAgICAgICAgICAgICAiJEFORFJPSURfSE9TVF9PVVQvYmluL3Rlc3Qtc3VpdGUtY29udGVudC1yZXBvcnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiLWkgb3V0L2hvc3QvbGludXgteDg2L2N0cy9hbmRyb2lkLWN0cy90ZXN0Y2FzZXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiLWMgLi9jdHMtY29udGVudC5wYiIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIi1vIC4vY3RzLWxpc3QucGIiKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT3B0aW9uczoiKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC1pIFBBVEggICAgICAgICAgICAgICAgcGF0aCB0byB0aGUgVGVzdCBTdWl0ZSBGb2xkZXIiKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC1jIEZJTEUgICAgICAgICAgICAgICAgaW5wdXQgZmlsZSBvZiBUZXN0IENvbnRlbnQgUHJvdG9jYWwgQnVmZmVyIik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtbyBGSUxFICAgICAgICAgICAgICAgIG91dHB1dCBmaWxlIG9mIFRlc3QgQ2FzZSBMaXN0IFByb3RvY2FsIEJ1ZmZlciIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKKyAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgfQorCisgICAgLyoqIEdldCB0aGUgYXJndW1lbnQgb3IgcHJpbnQgb3V0IHRoZSB1c2FnZSBhbmQgZXhpdC4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RXhwZWN0ZWRBcmcoU3RyaW5nW10gYXJncywgaW50IGluZGV4KSB7CisgICAgICAgIGlmIChpbmRleCA8IGFyZ3MubGVuZ3RoKSB7CisgICAgICAgICAgICByZXR1cm4gYXJnc1tpbmRleF07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludFVzYWdlKCk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsgICAgLy8gTmV2ZXIgd2lsbCBoYXBwZW4gYmVjYXVzZSBwcmludCBVc2FnZSB3aWxsIGNhbGwgZXhpdCgxKQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBoYXNBbm5vdGF0aW9uKFNldDw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gYW5ub3RhdGlvbnMsIFN0cmluZyB0YWcpIHsKKyAgICAgICAgZm9yIChBbm5vdGF0aW9uIGFubm90YXRpb24gOiBhbm5vdGF0aW9ucykgeworICAgICAgICAgICAgaWYgKGFubm90YXRpb24uZ2V0VHlwZSgpLmVxdWFscyh0YWcpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaGFzQW5ub3RhdGlvblN1ZmZpeChTZXQ8PyBleHRlbmRzIEFubm90YXRpb24+IGFubm90YXRpb25zLCBTdHJpbmcgdGFnKSB7CisgICAgICAgIGZvciAoQW5ub3RhdGlvbiBhbm5vdGF0aW9uIDogYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uLmdldFR5cGUoKS5lbmRzV2l0aCh0YWcpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFRlc3RTdWl0ZS5QYWNrYWdlLkNsYXNzLkNsYXNzVHlwZSBjaGtUZXN0VHlwZShDbGFzc0RlZiBjbGFzc0RlZikgeworICAgICAgICAvLyBPbmx5IGNhcmUgYWJvdXQgUHVibGljIENsYXNzCisgICAgICAgIGlmICgoY2xhc3NEZWYuZ2V0QWNjZXNzRmxhZ3MoKSAmIEFjY2Vzc0ZsYWdzLlBVQkxJQy5nZXRWYWx1ZSgpKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gVGVzdFN1aXRlLlBhY2thZ2UuQ2xhc3MuQ2xhc3NUeXBlLlVOS05PV047CisgICAgICAgIH0KKworICAgICAgICBmb3IgKEFubm90YXRpb24gYW5ub3RhdGlvbiA6IGNsYXNzRGVmLmdldEFubm90YXRpb25zKCkpIHsKKyAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uLmdldFR5cGUoKS5lcXVhbHMoREVQUkVDQVRFRF9BTk5PVEFUSU9OX1RBRykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGVzdFN1aXRlLlBhY2thZ2UuQ2xhc3MuQ2xhc3NUeXBlLlVOS05PV047CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYW5ub3RhdGlvbi5nZXRUeXBlKCkuZXF1YWxzKFJVTl9XSVRIX0FOTk9UQVRJT05fVEFHKSkgeworICAgICAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbkVsZW1lbnQgYW5ub3RhdGlvbkVsZSA6IGFubm90YXRpb24uZ2V0RWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYU5hbWUgPSBhbm5vdGF0aW9uRWxlLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFOYW1lLmVxdWFscyhBTkRST0lEX0pVTklUNF9URVNUX1RBRykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUZXN0U3VpdGUuUGFja2FnZS5DbGFzcy5DbGFzc1R5cGUuSlVOSVQ0OworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFOYW1lLmVxdWFscyhQQVJBTUVURVJJWkVEX1RBRykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUZXN0U3VpdGUuUGFja2FnZS5DbGFzcy5DbGFzc1R5cGUuUEFSQU1FVEVSSVpFRDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gVGVzdFN1aXRlLlBhY2thZ2UuQ2xhc3MuQ2xhc3NUeXBlLkpVTklUNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChjbGFzc0RlZi5nZXRUeXBlKCkuZW5kc1dpdGgoVEVTVF9UQUcpIHx8IGNsYXNzRGVmLmdldFR5cGUoKS5lbmRzV2l0aChURVNUU19UQUcpKSB7CisgICAgICAgICAgICByZXR1cm4gVGVzdFN1aXRlLlBhY2thZ2UuQ2xhc3MuQ2xhc3NUeXBlLkpVTklUMzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBUZXN0U3VpdGUuUGFja2FnZS5DbGFzcy5DbGFzc1R5cGUuVU5LTk9XTjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNUYXJnZXRDbGFzcyhMaXN0PFN0cmluZz4gcGtnTGlzdCwgU3RyaW5nIGNsYXNzTmFtZSkgeworICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7CisgICAgICAgIGZvciAoU3RyaW5nIHBrZyA6IHBrZ0xpc3QpIHsKKyAgICAgICAgICAgIGlmIChjbGFzc05hbWUuc3RhcnRzV2l0aChwa2cpKSB7CisgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmb3VuZDsKKyAgICB9CisKKyAgICAvLyBHZXQgdGVzdCBjYXNlIGxpc3QgZnJvbSBhbiBBUEsKKyAgICBwcml2YXRlIHN0YXRpYyBUZXN0U3VpdGUuUGFja2FnZS5CdWlsZGVyIHBhcnNlQXBrVGVzdENhc2UoTGlzdDxTdHJpbmc+IGFwa0xpc3QsCisgICAgICAgICAgICBMaXN0PFN0cmluZz4gY2xhc3NMaXN0LCBTdHJpbmcgdHNQYXRoLCBpbnQgYXBpKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgVGVzdFN1aXRlLlBhY2thZ2UuQnVpbGRlciB0c1BrZ0J1aWxkZXIgPSBUZXN0U3VpdGUuUGFja2FnZS5uZXdCdWlsZGVyKCk7CisgICAgICAgIGZvciAoU3RyaW5nIGFwa05hbWUgOiBhcGtMaXN0KSB7CisgICAgICAgICAgICBEZXhGaWxlIGRleEZpbGUgPSBudWxsOworICAgICAgICAgICAgU3RyaW5nIGFwa1BhdGggPSBQYXRocy5nZXQodHNQYXRoLCBhcGtOYW1lKS50b1N0cmluZygpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBkZXhGaWxlID0gRGV4RmlsZUZhY3RvcnkubG9hZERleEZpbGUoYXBrUGF0aCwgT3Bjb2Rlcy5mb3JBcGkoYXBpKSk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiB8IERleEZpbGVGYWN0b3J5LkRleEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVW5hYmxlIHRvIGxvYWQgZGV4IGZpbGU6ICIgKyBhcGtQYXRoKTsKKyAgICAgICAgICAgICAgICAvLyBleC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHNQa2dCdWlsZGVyLnNldE5hbWUoYXBrTmFtZSk7CisgICAgICAgICAgICBmb3IgKENsYXNzRGVmIGNsYXNzRGVmIDogZGV4RmlsZS5nZXRDbGFzc2VzKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBhZGp1c3QgdGhlIGZvcm1hdCBMY2xhc3MveTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gY2xhc3NEZWYuZ2V0VHlwZSgpLnJlcGxhY2UoJy8nLCcuJyk7CisgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIEwuLi47CisgICAgICAgICAgICAgICAgaWYgKGNsYXNzTmFtZS5sZW5ndGgoKSA+IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lLnN1YnN0cmluZygxLCBjbGFzc05hbWUubGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBUZXN0U3VpdGUuUGFja2FnZS5DbGFzcy5DbGFzc1R5cGUgY1R5cGU7CisgICAgICAgICAgICAgICAgY1R5cGUgPSBjaGtUZXN0VHlwZShjbGFzc0RlZik7CisgICAgICAgICAgICAgICAgaWYgKFRlc3RTdWl0ZS5QYWNrYWdlLkNsYXNzLkNsYXNzVHlwZS5KVU5JVDMgPT0gY1R5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgVGVzdFN1aXRlLlBhY2thZ2UuQ2xhc3MuQnVpbGRlciB0Q2xhc3NCdWlsZGVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0U3VpdGUuUGFja2FnZS5DbGFzcy5uZXdCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgICAgIHRDbGFzc0J1aWxkZXIuc2V0Q2xhc3NUeXBlKGNUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgdENsYXNzQnVpbGRlci5zZXRBcGsoYXBrTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHRDbGFzc0J1aWxkZXIuc2V0TmFtZShjbGFzc05hbWUpOworCisgICAgICAgICAgICAgICAgICAgIGZvciAoTWV0aG9kIG1ldGhvZCA6IGNsYXNzRGVmLmdldE1ldGhvZHMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChtZXRob2QuZ2V0QWNjZXNzRmxhZ3MoKSAmIEFjY2Vzc0ZsYWdzLlBVQkxJQy5nZXRWYWx1ZSgpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1OYW1lID0gbWV0aG9kLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzQW5ub3RhdGlvblN1ZmZpeCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZC5nZXRBbm5vdGF0aW9ucygpLCBTVVBQUkVTU19BTk5PVEFUSU9OX1RBRykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGYoIiVzIyVzIHdpdGggU3VwcHJlc3M6XG4iLCBjbGFzc05hbWUsIG1OYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKG1ldGhvZC5nZXRBbm5vdGF0aW9ucygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1OYW1lLnN0YXJ0c1dpdGgoVEVTVF9QUkVGSVhfVEFHKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0U3VpdGUuUGFja2FnZS5DbGFzcy5NZXRob2QuQnVpbGRlciBtZXRob2RCdWlsZGVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0U3VpdGUuUGFja2FnZS5DbGFzcy5NZXRob2QubmV3QnVpbGRlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RCdWlsZGVyLnNldE5hbWUobU5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Q2xhc3NCdWlsZGVyLmFkZE1ldGhvZHMobWV0aG9kQnVpbGRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRzUGtnQnVpbGRlci5hZGRDbGFzc2VzKHRDbGFzc0J1aWxkZXIpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoVGVzdFN1aXRlLlBhY2thZ2UuQ2xhc3MuQ2xhc3NUeXBlLkpVTklUNCA9PSBjVHlwZSkgeworICAgICAgICAgICAgICAgICAgICBUZXN0U3VpdGUuUGFja2FnZS5DbGFzcy5CdWlsZGVyIHRDbGFzc0J1aWxkZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RTdWl0ZS5QYWNrYWdlLkNsYXNzLm5ld0J1aWxkZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgdENsYXNzQnVpbGRlci5zZXRDbGFzc1R5cGUoY1R5cGUpOworICAgICAgICAgICAgICAgICAgICB0Q2xhc3NCdWlsZGVyLnNldEFwayhhcGtOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgdENsYXNzQnVpbGRlci5zZXROYW1lKGNsYXNzTmFtZSk7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChNZXRob2QgbWV0aG9kIDogY2xhc3NEZWYuZ2V0TWV0aG9kcygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzQW5ub3RhdGlvbihtZXRob2QuZ2V0QW5ub3RhdGlvbnMoKSwgVEVTVF9BTk5PVEFUSU9OX1RBRykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbU5hbWUgPSBtZXRob2QuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RTdWl0ZS5QYWNrYWdlLkNsYXNzLk1ldGhvZC5CdWlsZGVyIG1ldGhvZEJ1aWxkZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdFN1aXRlLlBhY2thZ2UuQ2xhc3MuTWV0aG9kLm5ld0J1aWxkZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RCdWlsZGVyLnNldE5hbWUobU5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRDbGFzc0J1aWxkZXIuYWRkTWV0aG9kcyhtZXRob2RCdWlsZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0c1BrZ0J1aWxkZXIuYWRkQ2xhc3Nlcyh0Q2xhc3NCdWlsZGVyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFRlc3RTdWl0ZS5QYWNrYWdlLkNsYXNzLkNsYXNzVHlwZS5QQVJBTUVURVJJWkVEID09IGNUeXBlKSB7CisgICAgICAgICAgICAgICAgICAgIFRlc3RTdWl0ZS5QYWNrYWdlLkNsYXNzLkJ1aWxkZXIgdENsYXNzQnVpbGRlciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdFN1aXRlLlBhY2thZ2UuQ2xhc3MubmV3QnVpbGRlcigpOworICAgICAgICAgICAgICAgICAgICB0Q2xhc3NCdWlsZGVyLnNldENsYXNzVHlwZShjVHlwZSk7CisgICAgICAgICAgICAgICAgICAgIHRDbGFzc0J1aWxkZXIuc2V0QXBrKGFwa05hbWUpOworICAgICAgICAgICAgICAgICAgICB0Q2xhc3NCdWlsZGVyLnNldE5hbWUoY2xhc3NOYW1lKTsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKE1ldGhvZCBtZXRob2QgOiBjbGFzc0RlZi5nZXRNZXRob2RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNBbm5vdGF0aW9uKG1ldGhvZC5nZXRBbm5vdGF0aW9ucygpLCBURVNUX0FOTk9UQVRJT05fVEFHKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtTmFtZSA9IG1ldGhvZC5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdFN1aXRlLlBhY2thZ2UuQ2xhc3MuTWV0aG9kLkJ1aWxkZXIgbWV0aG9kQnVpbGRlciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0U3VpdGUuUGFja2FnZS5DbGFzcy5NZXRob2QubmV3QnVpbGRlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEJ1aWxkZXIuc2V0TmFtZShtTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdENsYXNzQnVpbGRlci5hZGRNZXRob2RzKG1ldGhvZEJ1aWxkZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRzUGtnQnVpbGRlci5hZGRDbGFzc2VzKHRDbGFzc0J1aWxkZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHNQa2dCdWlsZGVyOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIENvbGxlY3Rpb248Q2xhc3M8Pz4+IGdldEphclRlc3RDbGFzc2VzKEZpbGUgamFyVGVzdEZpbGUsIFN0cmluZyB0ZlBhdGgpCisgICAgICAgICAgICB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICAgICAgTGlzdDxDbGFzczw/Pj4gY2xhc3NlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgICAgIHRyeSAoSmFyRmlsZSBqYXJGaWxlID0gbmV3IEphckZpbGUoamFyVGVzdEZpbGUpKSB7CisgICAgICAgICAgICBFbnVtZXJhdGlvbjxKYXJFbnRyeT4gZSA9IGphckZpbGUuZW50cmllcygpOworCisgICAgICAgICAgICBVUkxbXSB1cmxzID0geworICAgICAgICAgICAgICAgIG5ldyBVUkwoU3RyaW5nLmZvcm1hdCgiamFyOmZpbGU6JXMhLyIsIGphclRlc3RGaWxlLmdldEFic29sdXRlUGF0aCgpKSksCisgICAgICAgICAgICAgICAgbmV3IFVSTChTdHJpbmcuZm9ybWF0KCJqYXI6ZmlsZTolcyEvIiwgdGZQYXRoKSkKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBVUkxDbGFzc0xvYWRlciBjbCA9CisgICAgICAgICAgICAgICAgICAgIFVSTENsYXNzTG9hZGVyLm5ld0luc3RhbmNlKHVybHMsIEphclRlc3RGaW5kZXIuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7CisKKyAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgSmFyRW50cnkgamUgPSBlLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgaWYgKGplLmlzRGlyZWN0b3J5KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFqZS5nZXROYW1lKCkuZW5kc1dpdGgoIi5jbGFzcyIpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBqZS5nZXROYW1lKCkuY29udGFpbnMoIiQiKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgamUuZ2V0TmFtZSgpLmNvbnRhaW5zKCJqdW5pdC8iKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGdldENsYXNzTmFtZShqZS5nZXROYW1lKCkpOworCisgICAgICAgICAgICAgICAgLyppZiAoIWNsYXNzTmFtZS5lbmRzV2l0aCgiVGVzdCIpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0qLworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIENsYXNzPD8+IGNscyA9IGNsLmxvYWRDbGFzcyhjbGFzc05hbWUpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChJUmVtb3RlVGVzdC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNscykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBUZXN0LmNsYXNzLmlzQXNzaWduYWJsZUZyb20oY2xzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3Nlcy5hZGQoY2xzKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghTW9kaWZpZXIuaXNBYnN0cmFjdChjbHMuZ2V0TW9kaWZpZXJzKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgaGFzSlVuaXQ0QW5ub3RhdGlvbihjbHMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2VzLmFkZChjbHMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB8IEVycm9yIHgpIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGZpbmQgdGVzdCBjbGFzcyAlcyBmcm9tICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSwgamFyVGVzdEZpbGUuZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICAgICAgICAgIHgucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjbGFzc2VzOworICAgIH0KKworICAgIC8qKiBIZWxwZXIgdG8gZGV0ZXJtaW5lIGlmIHdlIGFyZSBkZWFsaW5nIHdpdGggYSBUZXN0IGNsYXNzIHdpdGggSnVuaXQ0IGFubm90YXRpb25zLiAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBoYXNKVW5pdDRBbm5vdGF0aW9uKENsYXNzPD8+IGNsYXNzT2JqKSB7CisgICAgICAgIGlmIChjbGFzc09iai5pc0Fubm90YXRpb25QcmVzZW50KFN1aXRlQ2xhc3Nlcy5jbGFzcykpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChjbGFzc09iai5pc0Fubm90YXRpb25QcmVzZW50KFJ1bldpdGguY2xhc3MpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAvKmZvciAoTWV0aG9kIG0gOiBjbGFzc09iai5nZXRNZXRob2RzKCkpIHsKKyAgICAgICAgICAgIGlmIChtLmlzQW5ub3RhdGlvblByZXNlbnQob3JnLmp1bml0LlRlc3QuY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0qLworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldENsYXNzTmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICAvLyAtNiBiZWNhdXNlIG9mIC5jbGFzcworICAgICAgICByZXR1cm4gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgoKSAtIDYpLnJlcGxhY2UoJy8nLCAnLicpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFRlc3RTdWl0ZS5QYWNrYWdlLkJ1aWxkZXIgcGFyc2VKYXJUZXN0Q2FzZSgKKyAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBqYXJMaXN0LCBTdHJpbmcgdHNQYXRoLCBTdHJpbmcgdGZQYXRoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBUZXN0U3VpdGUuUGFja2FnZS5CdWlsZGVyIHRzUGtnQnVpbGRlciA9IFRlc3RTdWl0ZS5QYWNrYWdlLm5ld0J1aWxkZXIoKTsKKyAgICAgICAgZm9yIChTdHJpbmcgamFyTmFtZSA6IGphckxpc3QpIHsKKyAgICAgICAgICAgIHRzUGtnQnVpbGRlci5zZXROYW1lKGphck5hbWUpOworICAgICAgICAgICAgQ29sbGVjdGlvbjxDbGFzczw/Pj4gY2xhc3NlcyA9CisgICAgICAgICAgICAgICAgICAgIGdldEphclRlc3RDbGFzc2VzKFBhdGhzLmdldCh0c1BhdGgsIGphck5hbWUpLnRvRmlsZSgpLCB0ZlBhdGgpOworICAgICAgICAgICAgZm9yIChDbGFzczw/PiBjIDogY2xhc3NlcykgeworICAgICAgICAgICAgICAgIFRlc3RTdWl0ZS5QYWNrYWdlLkNsYXNzLkJ1aWxkZXIgdENsYXNzQnVpbGRlciA9CisgICAgICAgICAgICAgICAgICAgICAgICBUZXN0U3VpdGUuUGFja2FnZS5DbGFzcy5uZXdCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgdENsYXNzQnVpbGRlci5zZXRDbGFzc1R5cGUoVGVzdFN1aXRlLlBhY2thZ2UuQ2xhc3MuQ2xhc3NUeXBlLkpBVkFIT1NUKTsKKyAgICAgICAgICAgICAgICB0Q2xhc3NCdWlsZGVyLnNldEFwayhqYXJOYW1lKTsKKyAgICAgICAgICAgICAgICB0Q2xhc3NCdWlsZGVyLnNldE5hbWUoYy5nZXROYW1lKCkpOworCisgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGYoImNsYXNzOiAlc1xuIiwgYy5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIGZvciAoamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIG0gOiBjLmdldE1ldGhvZHMoKSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgbWRmID0gbS5nZXRNb2RpZmllcnMoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKE1vZGlmaWVyLmlzUHVibGljKG1kZikgfHwgTW9kaWZpZXIuaXNQcm90ZWN0ZWQobWRmKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG0uZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoVEVTVF9QUkVGSVhfVEFHKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRmKCJ0ZXN0OiAlc1xuIiwgbS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RTdWl0ZS5QYWNrYWdlLkNsYXNzLk1ldGhvZC5CdWlsZGVyIG1ldGhvZEJ1aWxkZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdFN1aXRlLlBhY2thZ2UuQ2xhc3MuTWV0aG9kLm5ld0J1aWxkZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RCdWlsZGVyLnNldE5hbWUobS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRDbGFzc0J1aWxkZXIuYWRkTWV0aG9kcyhtZXRob2RCdWlsZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0c1BrZ0J1aWxkZXIuYWRkQ2xhc3Nlcyh0Q2xhc3NCdWlsZGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHNQa2dCdWlsZGVyOworICAgIH0KKworICAgIC8vIEl0ZXJhdGVzIHRob3VnaCBhbGwgdGVzdCBzdWl0ZSBjb250ZW50IGFuZCBwcmludHMgdGhlbS4KKyAgICBzdGF0aWMgVGVzdFN1aXRlLkJ1aWxkZXIgbGlzdFRlc3RDYXNlcyhUZXN0U3VpdGVDb250ZW50IHRzQ29udGVudCwgU3RyaW5nIHRzUGF0aCwgU3RyaW5nIHRmUGF0aCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBUZXN0U3VpdGUuQnVpbGRlciB0c0J1aWxkZXIgPSBUZXN0U3VpdGUubmV3QnVpbGRlcigpOworCisgICAgICAgIGludCBpID0gMTsKKyAgICAgICAgZm9yIChFbnRyeSBlbnRyeTogdHNDb250ZW50LmdldEZpbGVFbnRyaWVzTGlzdCgpKSB7CisgICAgICAgICAgICBpZiAoRW50cnkuRW50cnlUeXBlLkNPTkZJRyA9PSBlbnRyeS5nZXRUeXBlKCkpIHsKKyAgICAgICAgICAgICAgICBUZXN0U3VpdGUuUGFja2FnZS5UeXBlIHBUeXBlID0gbnVsbDsKKyAgICAgICAgICAgICAgICBDb25maWdNZXRhZGF0YSBjb25maWcgPSBlbnRyeS5nZXRGaWxlTWV0YWRhdGEoKS5nZXRDb25maWdNZXRhZGF0YSgpOworCisgICAgICAgICAgICAgICAgLy8gZ2V0dGluZyBwYWNrYWdlL2NsYXNzIGxpc3QgZnJvbSBUZXN0IE1vZHVsZSBDb25maWd1cmF0aW9uCisgICAgICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gdGVzdENsYXNzTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPiAoKTsKKyAgICAgICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBob3N0VGVzdEphckxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgICAgICAgICBMaXN0PE9wdGlvbj4gb3B0TGlzdDsKKyAgICAgICAgICAgICAgICBMaXN0PENvbmZpZ01ldGFkYXRhLlRlc3RDbGFzcz4gdGVzdENsYXNzZXNMaXN0ID0gY29uZmlnLmdldFRlc3RDbGFzc2VzTGlzdCgpOworICAgICAgICAgICAgICAgIGZvciAoQ29uZmlnTWV0YWRhdGEuVGVzdENsYXNzIHRDbGFzcyA6IHRlc3RDbGFzc2VzTGlzdCkgeworICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzSG9zdFRlc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0FuZHJvaWRKdW5pdFRlc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgb3B0TGlzdCA9IHRDbGFzcy5nZXRPcHRpb25zTGlzdCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoSE9TVF9URVNUX0NMQVNTX1RBRy5lcXVhbHModENsYXNzLmdldFRlc3RDbGFzcygpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaXNIb3N0VGVzdCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBwVHlwZSA9IFRlc3RTdWl0ZS5QYWNrYWdlLlR5cGUuSkFWQUhPU1Q7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQU5EUk9JRF9KVU5JVF9URVNUX1RBRy5lcXVhbHModENsYXNzLmdldFRlc3RDbGFzcygpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaXNBbmRyb2lkSnVuaXRUZXN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChHVEVTVF9UQUcuZXF1YWxzKHRDbGFzcy5nZXRUZXN0Q2xhc3MoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBUeXBlID0gVGVzdFN1aXRlLlBhY2thZ2UuVHlwZS5HVEVTVDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChERVFQX1RFU1RfVEFHLmVxdWFscyh0Q2xhc3MuZ2V0VGVzdENsYXNzKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwVHlwZSA9IFRlc3RTdWl0ZS5QYWNrYWdlLlR5cGUuREVRUDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChMSUJDT1JFX1RFU1RfVEFHLmVxdWFscyh0Q2xhc3MuZ2V0VGVzdENsYXNzKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwVHlwZSA9IFRlc3RTdWl0ZS5QYWNrYWdlLlR5cGUuTElCQ09SRTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChEQUxWSUtfVEVTVF9UQUcuZXF1YWxzKHRDbGFzcy5nZXRUZXN0Q2xhc3MoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN0cy90ZXN0cy9qZHdwL0FuZHJvaWRUZXN0LnhtbAorICAgICAgICAgICAgICAgICAgICAgICAgcFR5cGUgPSBUZXN0U3VpdGUuUGFja2FnZS5UeXBlLkRBTFZJSzsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBUZXN0IFR5cGU6ICVzICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXROYW1lKCksIHRDbGFzcy5nZXRUZXN0Q2xhc3MoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3IgKE9wdGlvbiBvcHQgOiBvcHRMaXN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNBbmRyb2lkSnVuaXRUZXN0ICYmIFBBQ0tBR0VfVEFHLmVxdWFsc0lnbm9yZUNhc2Uob3B0LmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0Q2xhc3NMaXN0LmFkZChvcHQuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzSG9zdFRlc3QgJiYgSkFSX1RBRy5lcXVhbHNJZ25vcmVDYXNlKG9wdC5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdFRlc3RKYXJMaXN0LmFkZChvcHQuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBnZXR0aW5nIGFwayBsaXN0IGZyb20gVGVzdCBNb2R1bGUgQ29uZmlndXJhdGlvbgorICAgICAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHRlc3RBcGtMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+ICgpOworICAgICAgICAgICAgICAgIExpc3Q8Q29uZmlnTWV0YWRhdGEuVGFyZ2V0UHJlcGFyZXI+IHRQcmVwTGlzdCA9IGNvbmZpZy5nZXRUYXJnZXRQcmVwYXJlcnNMaXN0KCk7CisgICAgICAgICAgICAgICAgZm9yIChDb25maWdNZXRhZGF0YS5UYXJnZXRQcmVwYXJlciB0UHJlcCA6IHRQcmVwTGlzdCkgeworICAgICAgICAgICAgICAgICAgICBvcHRMaXN0ID0gdFByZXAuZ2V0T3B0aW9uc0xpc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChPcHRpb24gb3B0IDogb3B0TGlzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFRFU1RfRklMRV9OQU1FX1RBRy5lcXVhbHNJZ25vcmVDYXNlKG9wdC5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdEFwa0xpc3QuYWRkKG9wdC5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFRlc3RTdWl0ZS5QYWNrYWdlLkJ1aWxkZXIgdHNQa2dCdWlsZGVyOworCisgICAgICAgICAgICAgICAgaWYgKHBUeXBlID09IFRlc3RTdWl0ZS5QYWNrYWdlLlR5cGUuSkFWQUhPU1QpIHsKKyAgICAgICAgICAgICAgICAgICAgdHNQa2dCdWlsZGVyID0gcGFyc2VKYXJUZXN0Q2FzZShob3N0VGVzdEphckxpc3QsIHRzUGF0aCwgdGZQYXRoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0c1BrZ0J1aWxkZXIgPSBwYXJzZUFwa1Rlc3RDYXNlKHRlc3RBcGtMaXN0LCB0ZXN0Q2xhc3NMaXN0LCB0c1BhdGgsIDI3KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0c1BrZ0J1aWxkZXIuc2V0TmFtZShlbnRyeS5nZXROYW1lKCkucmVwbGFjZUFsbChDT05GSUdfUkVHRVgsICIiKSk7CisgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gcFR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdHNQa2dCdWlsZGVyLnNldFR5cGUocFR5cGUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRzQnVpbGRlci5hZGRQYWNrYWdlcyh0c1BrZ0J1aWxkZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0c0J1aWxkZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0tub3duRmFpbHVyZShTdHJpbmcgdHNOYW1lLCBMaXN0PFN0cmluZz4ga25vd25GYWlsdXJlcykgeworICAgICAgICBmb3IgKFN0cmluZyBrZiA6IGtub3duRmFpbHVyZXMpIHsKKyAgICAgICAgICAgIGlmICh0c05hbWUuc3RhcnRzV2l0aChrZikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gSXRlcmF0ZXMgdGhvdWdoIGFsbCB0ZXN0IHN1aXRlIGNvbnRlbnQgYW5kIHByaW50cyB0aGVtLgorICAgIHN0YXRpYyB2b2lkIHByaW50VGVzdFN1aXRlKFRlc3RTdWl0ZSB0cywgTGlzdDxTdHJpbmc+IGtub3duRmFpbHVyZXMpIHsKKyAgICAgICAgLy9IZWFkZXIKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNb2R1bGUsQ2xhc3MsVGVzdCxubyxBcGssVHlwZSIpOworICAgICAgICBpbnQgaSA9IDE7CisgICAgICAgIGZvciAoVGVzdFN1aXRlLlBhY2thZ2UgcGtnIDogdHMuZ2V0UGFja2FnZXNMaXN0KCkpIHsKKyAgICAgICAgICAgIGZvciAoVGVzdFN1aXRlLlBhY2thZ2UuQ2xhc3MgY2xzIDogcGtnLmdldENsYXNzZXNMaXN0KCkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKFRlc3RTdWl0ZS5QYWNrYWdlLkNsYXNzLk1ldGhvZCBtdGQgOiBjbHMuZ2V0TWV0aG9kc0xpc3QoKSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGVzdENhc2VOYW1lID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVENBU0VfTkFNRV9GT1JNQVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwa2cuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xzLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG10ZC5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICAvLyBGaWx0ZXIgb3V0IGtub3duIGZhaWx1cmVzCisgICAgICAgICAgICAgICAgICAgIGlmICghaXNLbm93bkZhaWx1cmUodGVzdENhc2VOYW1lLCBrbm93bkZhaWx1cmVzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcywlcywlcywlZCwlcywlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGtnLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xzLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXRkLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHMuZ2V0QXBrKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNscy5nZXRDbGFzc1R5cGUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJdGVyYXRlcyB0aG91Z2ggYWxsIHRlc3Qgc3VpdGUgY29udGVudCBhbmQgcHJpbnRzIHRoZW0uCisgICAgc3RhdGljIHZvaWQgcHJpbnRUZXN0U3VpdGVTdW1tYXJ5KFRlc3RTdWl0ZSB0cywgU3RyaW5nIGZOYW1lLCBMaXN0PFN0cmluZz4ga25vd25GYWlsdXJlcykKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEZpbGVXcml0ZXIgZldyaXRlciA9IG5ldyBGaWxlV3JpdGVyKGZOYW1lKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgcFdyaXRlciA9IG5ldyBQcmludFdyaXRlcihmV3JpdGVyKTsKKworICAgICAgICAvL0hlYWRlcgorICAgICAgICBwV3JpdGVyLnByaW50KCJNb2R1bGUsVGVzdCMsbm8sVHlwZSxDbGFzcyNcbiIpOworCisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgZm9yIChUZXN0U3VpdGUuUGFja2FnZSBwa2cgOiB0cy5nZXRQYWNrYWdlc0xpc3QoKSkgeworICAgICAgICAgICAgaW50IGNsYXNzQ250ID0gMDsKKyAgICAgICAgICAgIGludCBtZXRob2RDbnQgPSAwOworICAgICAgICAgICAgZm9yIChUZXN0U3VpdGUuUGFja2FnZS5DbGFzcyBjbHMgOiBwa2cuZ2V0Q2xhc3Nlc0xpc3QoKSkgeworICAgICAgICAgICAgICAgIGZvciAoVGVzdFN1aXRlLlBhY2thZ2UuQ2xhc3MuTWV0aG9kIG10ZCA6IGNscy5nZXRNZXRob2RzTGlzdCgpKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0ZXN0Q2FzZU5hbWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVNUQ0FTRV9OQU1FX0ZPUk1BVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBrZy5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHMuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXRkLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIC8vIEZpbHRlciBvdXQga25vd24gZmFpbHVyZXMKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0tub3duRmFpbHVyZSh0ZXN0Q2FzZU5hbWUsIGtub3duRmFpbHVyZXMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RDbnQrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjbGFzc0NudCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcFdyaXRlci5wcmludGYoCisgICAgICAgICAgICAgICAgICAgICIlcywlcywlZCwlcywlZFxuIiwgcGtnLmdldE5hbWUoKSwgbWV0aG9kQ250LCBpKyssIHBrZy5nZXRUeXBlKCksIGNsYXNzQ250KTsKKyAgICAgICAgfQorCisgICAgICAgIHBXcml0ZXIuY2xvc2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyB0c0NvbnRlbnRGaWxlUGF0aCA9ICIuL3RzQ29udGVudE1lc3NhZ2UucGIiOworICAgICAgICBTdHJpbmcgb3V0cHV0VGVzdENhc2VMaXN0RmlsZVBhdGggPSAiLi90c1Rlc3RDYXNlTGlzdC5wYiI7CisgICAgICAgIFN0cmluZyBvdXRwdXRTdW1tYXJ5RmlsZVBhdGggPSAiLi90c1N1bW1hcnkuY3N2IjsKKyAgICAgICAgU3RyaW5nIHRzUGF0aCA9ICIiOworICAgICAgICBTdHJpbmcgdHJhZEZlZEphclBhdGggPSAiIjsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChhcmdzW2ldLnN0YXJ0c1dpdGgoIi0iKSkgeworICAgICAgICAgICAgICAgIGlmICgiLW8iLmVxdWFscyhhcmdzW2ldKSkgeworICAgICAgICAgICAgICAgICAgICBvdXRwdXRUZXN0Q2FzZUxpc3RGaWxlUGF0aCA9IGdldEV4cGVjdGVkQXJnKGFyZ3MsICsraSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiLWMiLmVxdWFscyhhcmdzW2ldKSkgeworICAgICAgICAgICAgICAgICAgICB0c0NvbnRlbnRGaWxlUGF0aCA9IGdldEV4cGVjdGVkQXJnKGFyZ3MsICsraSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiLXMiLmVxdWFscyhhcmdzW2ldKSkgeworICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdW1tYXJ5RmlsZVBhdGggPSBnZXRFeHBlY3RlZEFyZyhhcmdzLCArK2kpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIi10Ii5lcXVhbHMoYXJnc1tpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhZEZlZEphclBhdGggPSBnZXRFeHBlY3RlZEFyZyhhcmdzLCArK2kpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIi1pIi5lcXVhbHMoYXJnc1tpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdHNQYXRoID0gZ2V0RXhwZWN0ZWRBcmcoYXJncywgKytpKTsKKyAgICAgICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUodHNQYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gT25seSBhY2NlcHRpb24gYSBmb2xkZXIKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWxlLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50VXNhZ2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50VXNhZ2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBSZWFkIG1lc3NhZ2UgZnJvbSB0aGUgZmlsZSBhbmQgcHJpbnQgdGhlbSBvdXQKKyAgICAgICAgVGVzdFN1aXRlQ29udGVudCB0c0NvbnRlbnQgPQorICAgICAgICAgICAgICAgIFRlc3RTdWl0ZUNvbnRlbnQucGFyc2VGcm9tKG5ldyBGaWxlSW5wdXRTdHJlYW0odHNDb250ZW50RmlsZVBhdGgpKTsKKworICAgICAgICBUZXN0U3VpdGUgdHMgPSBsaXN0VGVzdENhc2VzKHRzQ29udGVudCwgdHNQYXRoLCB0cmFkRmVkSmFyUGF0aCkuYnVpbGQoKTsKKworICAgICAgICAvLyBXcml0ZSB0ZXN0IGNhc2UgbGlzdCBtZXNzYWdlIHRvIGRpc2suCisgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0cHV0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0cHV0VGVzdENhc2VMaXN0RmlsZVBhdGgpOworICAgICAgICB0cnkgeworICAgICAgICAgIHRzLndyaXRlVG8ob3V0cHV0KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICBvdXRwdXQuY2xvc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlYWQgbWVzc2FnZSBmcm9tIHRoZSBmaWxlIGFuZCBwcmludCB0aGVtIG91dAorICAgICAgICBUZXN0U3VpdGUgdHMxID0gVGVzdFN1aXRlLnBhcnNlRnJvbShuZXcgRmlsZUlucHV0U3RyZWFtKG91dHB1dFRlc3RDYXNlTGlzdEZpbGVQYXRoKSk7CisgICAgICAgIHByaW50VGVzdFN1aXRlKHRzMSwgdHNDb250ZW50LmdldEtub3duRmFpbHVyZXNMaXN0KCkpOworICAgICAgICBwcmludFRlc3RTdWl0ZVN1bW1hcnkodHMxLCBvdXRwdXRTdW1tYXJ5RmlsZVBhdGgsIHRzQ29udGVudC5nZXRLbm93bkZhaWx1cmVzTGlzdCgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9jdHMtYXBpLWNvdmVyYWdlL3NyYy9jb20vYW5kcm9pZC9jdHMvYXBpY292ZXJhZ2UvVGVzdE1vZHVsZUNvbmZpZ0hhbmRsZXIuamF2YSBiL3Rvb2xzL2N0cy1hcGktY292ZXJhZ2Uvc3JjL2NvbS9hbmRyb2lkL2N0cy9hcGljb3ZlcmFnZS9UZXN0TW9kdWxlQ29uZmlnSGFuZGxlci5qYXZhCmluZGV4IDg1NDIzYjcuLjIyOWFlYWEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2N0cy1hcGktY292ZXJhZ2Uvc3JjL2NvbS9hbmRyb2lkL2N0cy9hcGljb3ZlcmFnZS9UZXN0TW9kdWxlQ29uZmlnSGFuZGxlci5qYXZhCisrKyBiL3Rvb2xzL2N0cy1hcGktY292ZXJhZ2Uvc3JjL2NvbS9hbmRyb2lkL2N0cy9hcGljb3ZlcmFnZS9UZXN0TW9kdWxlQ29uZmlnSGFuZGxlci5qYXZhCkBAIC0xNiw2ICsxNiw4IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuY3RzLmFwaWNvdmVyYWdlOwogCitpbXBvcnQgY29tLmFuZHJvaWQuY3RzLmFwaWNvdmVyYWdlLlRlc3RTdWl0ZVByb3RvLio7CisKIGltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwogaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwpAQCAtMjUsMjUgKzI3LDY1IEBACiAgKiBUZXN0TW9kdWxlLnhtbC4KICAqLwogY2xhc3MgVGVzdE1vZHVsZUNvbmZpZ0hhbmRsZXIgZXh0ZW5kcyBEZWZhdWx0SGFuZGxlciB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbVRlc3RDbGFzc05hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbU1vZHVsZU5hbWU7Ci0gICAgcHJpdmF0ZSBCb29sZWFuIGluVGVzdEVsZSA9IGZhbHNlOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdVUkFUSU9OX1RBRyA9ICJjb25maWd1cmF0aW9uIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fVEFHID0gImRlc2NyaXB0aW9uIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX1RBRyA9ICJvcHRpb24iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfUFJFUEFSRVJfVEFHID0gInRhcmdldF9wcmVwYXJlciI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfVEFHID0gInRlc3QiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19UQUcgPSAiY2xhc3MiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1RBRyA9ICJuYW1lIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1RBRyA9ICJrZXkiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9UQUcgPSAidmFsdWUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfTkFNRV9UQUcgPSAibW9kdWxlLW5hbWUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHVEVTVF9DTEFTU19UQUcgPSAiY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuR1Rlc3QiOworCisgICAgcHJpdmF0ZSBGaWxlTWV0YWRhdGEuQnVpbGRlciBtRmlsZU1ldGFkYXRhOworICAgIHByaXZhdGUgQ29uZmlnTWV0YWRhdGEuQnVpbGRlciBtQ29uZmlnTWV0YWRhdGE7CisgICAgcHJpdmF0ZSBDb25maWdNZXRhZGF0YS5UZXN0Q2xhc3MuQnVpbGRlciBtVGVzdENhc2U7CisgICAgcHJpdmF0ZSBDb25maWdNZXRhZGF0YS5UYXJnZXRQcmVwYXJlci5CdWlsZGVyIG1UYXJnZXRQcmVwYXJlcjsKKyAgICBwcml2YXRlIFN0cmluZyBtTW9kdWxlTmFtZSA9IG51bGw7CisKKyAgICBUZXN0TW9kdWxlQ29uZmlnSGFuZGxlcihTdHJpbmcgY29uZmlnRmlsZU5hbWUpIHsKKyAgICAgICAgbUZpbGVNZXRhZGF0YSA9IEZpbGVNZXRhZGF0YS5uZXdCdWlsZGVyKCk7CisgICAgICAgIG1Db25maWdNZXRhZGF0YSA9IENvbmZpZ01ldGFkYXRhLm5ld0J1aWxkZXIoKTsKKyAgICAgICAgbVRlc3RDYXNlID0gbnVsbDsKKyAgICAgICAgbVRhcmdldFByZXBhcmVyID0gbnVsbDsKKyAgICAgICAgLy8gRGVmYXVsdCBNb2R1bGUgTmFtZSBpcyB0aGUgQ29uZmlnIEZpbGUgTmFtZQorICAgICAgICBtTW9kdWxlTmFtZSA9IGNvbmZpZ0ZpbGVOYW1lLnJlcGxhY2VBbGwoIi5jb25maWckIiwgIiIpOworICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKQogICAgICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CiAgICAgICAgIHN1cGVyLnN0YXJ0RWxlbWVudCh1cmksIGxvY2FsTmFtZSwgbmFtZSwgYXR0cmlidXRlcyk7CiAKLSAgICAgICAgaWYgKCJ0ZXN0Ii5lcXVhbHNJZ25vcmVDYXNlKGxvY2FsTmFtZSkpIHsKLSAgICAgICAgICAgIG1UZXN0Q2xhc3NOYW1lID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiY2xhc3MiKTsKLSAgICAgICAgICAgIGluVGVzdEVsZSA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoIm9wdGlvbiIuZXF1YWxzSWdub3JlQ2FzZShsb2NhbE5hbWUpKSB7Ci0gICAgICAgICAgICBpZiAoaW5UZXN0RWxlKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG9wdE5hbWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJuYW1lIik7Ci0gICAgICAgICAgICAgICAgaWYgKCJtb2R1bGUtbmFtZSIuZXF1YWxzSWdub3JlQ2FzZShvcHROYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBtTW9kdWxlTmFtZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInZhbHVlIik7CisgICAgICAgIGlmIChDT05GSUdVUkFUSU9OX1RBRy5lcXVhbHNJZ25vcmVDYXNlKGxvY2FsTmFtZSkpIHsKKyAgICAgICAgICAgIGlmIChudWxsICE9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoREVTQ1JJUFRJT05fVEFHKSkgeworICAgICAgICAgICAgICAgIG1GaWxlTWV0YWRhdGEuc2V0RGVzY3JpcHRpb24oYXR0cmlidXRlcy5nZXRWYWx1ZShERVNDUklQVElPTl9UQUcpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUZpbGVNZXRhZGF0YS5zZXREZXNjcmlwdGlvbigiV0FSTklORzogbm8gZGVzY3JpcHRpb24uIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoVEVTVF9UQUcuZXF1YWxzSWdub3JlQ2FzZShsb2NhbE5hbWUpKSB7CisgICAgICAgICAgICBtVGVzdENhc2UgPSBDb25maWdNZXRhZGF0YS5UZXN0Q2xhc3MubmV3QnVpbGRlcigpOworICAgICAgICAgICAgbVRlc3RDYXNlLnNldFRlc3RDbGFzcyhhdHRyaWJ1dGVzLmdldFZhbHVlKENMQVNTX1RBRykpOworICAgICAgICB9IGVsc2UgaWYgKFRBUkdFVF9QUkVQQVJFUl9UQUcuZXF1YWxzSWdub3JlQ2FzZShsb2NhbE5hbWUpKSB7CisgICAgICAgICAgICBtVGFyZ2V0UHJlcGFyZXIgPSBDb25maWdNZXRhZGF0YS5UYXJnZXRQcmVwYXJlci5uZXdCdWlsZGVyKCk7CisgICAgICAgICAgICBtVGFyZ2V0UHJlcGFyZXIuc2V0VGVzdENsYXNzKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoQ0xBU1NfVEFHKSk7CisgICAgICAgIH0gZWxzZSBpZiAoT1BUSU9OX1RBRy5lcXVhbHNJZ25vcmVDYXNlKGxvY2FsTmFtZSkpIHsKKyAgICAgICAgICAgIE9wdGlvbi5CdWlsZGVyIG9wdGlvbiA9IE9wdGlvbi5uZXdCdWlsZGVyKCk7CisgICAgICAgICAgICBvcHRpb24uc2V0TmFtZShhdHRyaWJ1dGVzLmdldFZhbHVlKE5BTUVfVEFHKSk7CisgICAgICAgICAgICBvcHRpb24uc2V0VmFsdWUoYXR0cmlidXRlcy5nZXRWYWx1ZShWQUxVRV9UQUcpKTsKKyAgICAgICAgICAgIFN0cmluZyBrZXlTdHIgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKEtFWV9UQUcpOworICAgICAgICAgICAgaWYgKG51bGwgIT0ga2V5U3RyKSB7CisgICAgICAgICAgICAgICAgb3B0aW9uLnNldEtleShrZXlTdHIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG51bGwgIT0gbVRlc3RDYXNlKSB7CisgICAgICAgICAgICAgICAgbVRlc3RDYXNlLmFkZE9wdGlvbnMob3B0aW9uKTsKKyAgICAgICAgICAgICAgICBpZiAoTU9EVUxFX05BTUVfVEFHLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbU1vZHVsZU5hbWUgPSBvcHRpb24uZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oU3RyaW5nLmZvcm1hdCgiJXM6ICVzLCAlcywgJXMiLCBsb2NhbE5hbWUsIG5hbWUsIG9wdE5hbWUsIGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInZhbHVlIikpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobnVsbCAhPSBtVGFyZ2V0UHJlcGFyZXIpIHsKKyAgICAgICAgICAgICAgICBtVGFyZ2V0UHJlcGFyZXIuYWRkT3B0aW9ucyhvcHRpb24pOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtNTEsOCArOTMsMTQgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBuYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKICAgICAgICAgc3VwZXIuZW5kRWxlbWVudCh1cmksIGxvY2FsTmFtZSwgbmFtZSk7Ci0gICAgICAgIGlmICgidGVzdCIuZXF1YWxzSWdub3JlQ2FzZShsb2NhbE5hbWUpKSB7Ci0gICAgICAgICAgICBpblRlc3RFbGUgPSBmYWxzZTsKKyAgICAgICAgaWYgKFRFU1RfVEFHLmVxdWFsc0lnbm9yZUNhc2UobG9jYWxOYW1lKSkgeworICAgICAgICAgICAgbUNvbmZpZ01ldGFkYXRhLmFkZFRlc3RDbGFzc2VzKG1UZXN0Q2FzZSk7CisgICAgICAgICAgICBtVGVzdENhc2UgPSBudWxsOworICAgICAgICB9IGVsc2UgaWYgKFRBUkdFVF9QUkVQQVJFUl9UQUcuZXF1YWxzSWdub3JlQ2FzZShsb2NhbE5hbWUpKSB7CisgICAgICAgICAgICBtQ29uZmlnTWV0YWRhdGEuYWRkVGFyZ2V0UHJlcGFyZXJzKG1UYXJnZXRQcmVwYXJlcik7CisgICAgICAgICAgICBtVGFyZ2V0UHJlcGFyZXIgPSBudWxsOworICAgICAgICB9IGVsc2UgaWYgKENPTkZJR1VSQVRJT05fVEFHLmVxdWFsc0lnbm9yZUNhc2UobG9jYWxOYW1lKSkgeworICAgICAgICAgICAgbUZpbGVNZXRhZGF0YS5zZXRDb25maWdNZXRhZGF0YShtQ29uZmlnTWV0YWRhdGEpOwogICAgICAgICB9CiAgICAgfQogCkBAIC02MSw2ICsxMDksMTEgQEAKICAgICB9CiAKICAgICBwdWJsaWMgU3RyaW5nIGdldFRlc3RDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtVGVzdENsYXNzTmFtZTsKKyAgICAgICAgLy9yZXR1cm4gdGhlIDFzdCBUZXN0IENsYXNzCisgICAgICAgIHJldHVybiBtRmlsZU1ldGFkYXRhLmdldENvbmZpZ01ldGFkYXRhKCkuZ2V0VGVzdENsYXNzZXNMaXN0KCkuZ2V0KDApLmdldFRlc3RDbGFzcygpOworICAgIH0KKworICAgIHB1YmxpYyBGaWxlTWV0YWRhdGEgZ2V0RmlsZU1ldGFkYXRhKCkgeworICAgICAgICByZXR1cm4gbUZpbGVNZXRhZGF0YS5idWlsZCgpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL2N0cy1hcGktY292ZXJhZ2Uvc3JjL2NvbS9hbmRyb2lkL2N0cy9hcGljb3ZlcmFnZS9UZXN0U3VpdGVDb250ZW50UmVwb3J0LmphdmEgYi90b29scy9jdHMtYXBpLWNvdmVyYWdlL3NyYy9jb20vYW5kcm9pZC9jdHMvYXBpY292ZXJhZ2UvVGVzdFN1aXRlQ29udGVudFJlcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZTViMmEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9jdHMtYXBpLWNvdmVyYWdlL3NyYy9jb20vYW5kcm9pZC9jdHMvYXBpY292ZXJhZ2UvVGVzdFN1aXRlQ29udGVudFJlcG9ydC5qYXZhCkBAIC0wLDAgKzEsNDMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5jdHMuYXBpY292ZXJhZ2U7CisKKworaW1wb3J0IGNvbS5hbmRyb2lkLmN0cy5hcGljb3ZlcmFnZS5UZXN0U3VpdGVQcm90by4qOworCitpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7CitpbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOworaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuWE1MUmVhZGVyRmFjdG9yeTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aHM7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7CitpbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOworCitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOworCitjbGFzcyBUZXN0U3VpdGVDb250ZW50UmVwb3J0IHsKKyAgICAvLyBjb25maWd1cmF0aW9uIG9wdGlvbgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RfU0hBUkRBQkxFX1RBRyA9ICJub3Qtc2hhcmRhYmxlIjsKKyAgICAvLyB0ZXN0IGNsYXNzIG9wdGlvbgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSVU5USU1FX0hJVF9UQUcgPSAicnVudGltZS1oaW50IjsKKyAgICAvLyBjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5BbmRyb2lkSlVuaXRUZXN0IG9wdGlvbgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFX1RBRyA9ICJwYWNrYWdlIjsKKyAgICAvLyBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5KYXJIb3N0VGVzdCBvcHRpb24KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFSX05BTUVfVEFHID0gImphciI7CisgICAgLy8gY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuR1Rlc3Qgb3B0aW9uCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BVElWRV9URVNUX0RFVklDRV9QQVRIX1RBRyA9ICJuYXRpdmUtdGVzdC1kZXZpY2UtcGF0aCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRV9UQUcgPSAibW9kdWxlLW5hbWUiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNVSVRFX0FQSV9JTlNUQUxMRVJfVEFHID0gImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVJfSE9TVF9URVNUX1RBRyA9ICJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5KYXJIb3N0VGVzdCI7CisgICAgLy8gY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciBvcHRpb24KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9GSUxFX05BTUVfVEFHID0gInRlc3QtZmlsZS1uYW1lIjsKKyAgICAvLyBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50YXJnZXRwcmVwLkZpbGVQdXNoZXIgb3B0aW9uCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVU0hfVEFHID0gInB1c2giOworCisgICAgLy8gdGVzdCBjbGFzcworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTkRST0lEX0pVTklUX1RFU1RfVEFHID0gImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkFuZHJvaWRKVW5pdFRlc3QiOworCisgICAgLy8gVGFyZ2V0IEZpbGUgRXh0ZW5zaW9ucworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfRVhUX1RBRyA9ICIuY29uZmlnIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFSX0VYVF9UQUcgPSAiLmphciI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFQS19FWFRfVEFHID0gIi5hcGsiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTT19FWFRfVEFHID0gIi5zbyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfU1VJVEVfSEFSTkVTUyA9ICItdHJhZGVmZWQuamFyIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS05PV05fRkFJTFVSRVNfWE1MX0ZJTEUgPSAiLWtub3duLWZhaWx1cmVzLnhtbCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX1RBRyA9ICJvcHRpb24iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1RBRyA9ICJuYW1lIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhDTFVERV9GSUxURVJfVEFHID0gImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9UQUcgPSAidmFsdWUiOworCisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50VXNhZ2UoKSB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2U6IHRlc3Qtc3VpdGUtY29udGVudC1yZXBvcnQgW09QVElPTl0uLi4iKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiR2VuZXJhdGVzIHRlc3Qgc3VpdGUgY29udGVudCBwcm90b2NhbCBidWZmZXIgbWVzc2FnZS4iKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKKyAgICAgICAgICAgICAgICAiJEFORFJPSURfSE9TVF9PVVQvYmluL3Rlc3Qtc3VpdGUtY29udGVudC1yZXBvcnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiLWkgb3V0L2hvc3QvbGludXgteDg2L2N0cy9hbmRyb2lkLWN0cyAiCisgICAgICAgICAgICAgICAgICAgICAgICArICItbyAuL2N0cy1jb250ZW50LnBiIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiLXQgLi9jdHMtbGlzdC5wYiIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPcHRpb25zOiIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLWkgUEFUSCAgICAgICAgICAgICAgICBwYXRoIHRvIHRoZSBUZXN0IFN1aXRlIEZvbGRlciIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLW8gRklMRSAgICAgICAgICAgICAgICBvdXRwdXQgZmlsZSBvZiBUZXN0IENvbnRlbnQgUHJvdG9jYWwgQnVmZmVyIik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtdCBGSUxFICAgICAgICAgICAgICAgIG91dHB1dCBmaWxlIG9mIFRlc3QgQ2FzZSBMaXN0IFByb3RvY2FsIEJ1ZmZlciIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKKyAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgfQorCisgICAgLyoqIEdldCB0aGUgYXJndW1lbnQgb3IgcHJpbnQgb3V0IHRoZSB1c2FnZSBhbmQgZXhpdC4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RXhwZWN0ZWRBcmcoU3RyaW5nW10gYXJncywgaW50IGluZGV4KSB7CisgICAgICAgIGlmIChpbmRleCA8IGFyZ3MubGVuZ3RoKSB7CisgICAgICAgICAgICByZXR1cm4gYXJnc1tpbmRleF07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludFVzYWdlKCk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsgICAgLy8gTmV2ZXIgd2lsbCBoYXBwZW4gYmVjYXVzZSBwcmludFVzYWdlIHdpbGwgY2FsbCBleGl0KDEpCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFRlc3RTdWl0ZUNvbnRlbnQgcGFyc2VUZXN0U3VpdGVGb2xkZXIoU3RyaW5nIHRlc3RTdWl0ZVBhdGgpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CisKKyAgICAgICAgVGVzdFN1aXRlQ29udGVudC5CdWlsZGVyIHRlc3RTdWl0ZUNvbnRlbnQgPSBUZXN0U3VpdGVDb250ZW50Lm5ld0J1aWxkZXIoKTsKKyAgICAgICAgdGVzdFN1aXRlQ29udGVudC5hZGRGaWxlRW50cmllcyhwYXJzZUZvbGRlcih0ZXN0U3VpdGVDb250ZW50LCB0ZXN0U3VpdGVQYXRoLCB0ZXN0U3VpdGVQYXRoKSk7CisgICAgICAgIHJldHVybiB0ZXN0U3VpdGVDb250ZW50LmJ1aWxkKCk7CisgICAgfQorCisgICAgLy8gUGFyc2UgYSBmaWxlCisgICAgcHJpdmF0ZSBzdGF0aWMgRmlsZU1ldGFkYXRhIHBhcnNlRmlsZU1ldGFkYXRhKEVudHJ5LkJ1aWxkZXIgZkVudHJ5LCBGaWxlIGZpbGUpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGZpbGUuZ2V0TmFtZSgpLmVuZHNXaXRoKENPTkZJR19FWFRfVEFHKSkgeworICAgICAgICAgICAgZkVudHJ5LnNldFR5cGUoRW50cnkuRW50cnlUeXBlLkNPTkZJRyk7CisgICAgICAgICAgICByZXR1cm4gcGFyc2VDb25maWdGaWxlKGZpbGUpOworICAgICAgICB9IGVsc2UgaWYgKGZpbGUuZ2V0TmFtZSgpLmVuZHNXaXRoKEFQS19FWFRfVEFHKSkgeworICAgICAgICAgICAgZkVudHJ5LnNldFR5cGUoRW50cnkuRW50cnlUeXBlLkFQSyk7CisgICAgICAgIH0gZWxzZSBpZiAoZmlsZS5nZXROYW1lKCkuZW5kc1dpdGgoSkFSX0VYVF9UQUcpKSB7CisgICAgICAgICAgICBmRW50cnkuc2V0VHlwZShFbnRyeS5FbnRyeVR5cGUuSkFSKTsKKyAgICAgICAgfSBlbHNlIGlmIChmaWxlLmdldE5hbWUoKS5lbmRzV2l0aChTT19FWFRfVEFHKSkgeworICAgICAgICAgICAgZkVudHJ5LnNldFR5cGUoRW50cnkuRW50cnlUeXBlLlNPKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEp1c3QgZmlsZSBpbiBnZW5lcmFsCisgICAgICAgICAgICBmRW50cnkuc2V0VHlwZShFbnRyeS5FbnRyeVR5cGUuRklMRSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgRmlsZU1ldGFkYXRhIHBhcnNlQ29uZmlnRmlsZShGaWxlIGZpbGUpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgWE1MUmVhZGVyIHhtbFJlYWRlciA9IFhNTFJlYWRlckZhY3RvcnkuY3JlYXRlWE1MUmVhZGVyKCk7CisgICAgICAgIFRlc3RNb2R1bGVDb25maWdIYW5kbGVyIHRlc3RNb2R1bGVYbWxIYW5kbGVyID0gbmV3IFRlc3RNb2R1bGVDb25maWdIYW5kbGVyKGZpbGUuZ2V0TmFtZSgpKTsKKyAgICAgICAgeG1sUmVhZGVyLnNldENvbnRlbnRIYW5kbGVyKHRlc3RNb2R1bGVYbWxIYW5kbGVyKTsKKyAgICAgICAgRmlsZVJlYWRlciBmaWxlUmVhZGVyID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbGVSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcihmaWxlKTsKKyAgICAgICAgICAgIHhtbFJlYWRlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UoZmlsZVJlYWRlcikpOworICAgICAgICAgICAgcmV0dXJuIHRlc3RNb2R1bGVYbWxIYW5kbGVyLmdldEZpbGVNZXRhZGF0YSgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKG51bGwgIT0gZmlsZVJlYWRlcikgeworICAgICAgICAgICAgICAgIGZpbGVSZWFkZXIuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEtub3duRmFpbHVyZXNYbWxIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgeworICAgICAgICBwcml2YXRlIFRlc3RTdWl0ZUNvbnRlbnQuQnVpbGRlciBtVHNCbGQgPSBudWxsOworCisgICAgICAgIEtub3duRmFpbHVyZXNYbWxIYW5kbGVyKFRlc3RTdWl0ZUNvbnRlbnQuQnVpbGRlciB0c0JsZCkgeworICAgICAgICAgICAgbVRzQmxkID0gdHNCbGQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpCisgICAgICAgICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBzdXBlci5zdGFydEVsZW1lbnQodXJpLCBsb2NhbE5hbWUsIG5hbWUsIGF0dHJpYnV0ZXMpOworCisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50ZigKKyAgICAgICAgICAgICAgICAgICAgImVsZSAlczogJXM6ICVzIFxuIiwKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxOYW1lLCBhdHRyaWJ1dGVzLmdldFZhbHVlKE5BTUVfVEFHKSwgYXR0cmlidXRlcy5nZXRWYWx1ZShWQUxVRV9UQUcpKTsKKyAgICAgICAgICAgIGlmIChFWENMVURFX0ZJTFRFUl9UQUcuZXF1YWxzKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoTkFNRV9UQUcpKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBrZkZpbHRlciA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoVkFMVUVfVEFHKS5yZXBsYWNlKCcgJywgJy4nKTsKKyAgICAgICAgICAgICAgICBtVHNCbGQuYWRkS25vd25GYWlsdXJlcyhrZkZpbHRlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHBhcnNlS25vd25GYWlsdXJlcyhUZXN0U3VpdGVDb250ZW50LkJ1aWxkZXIgdHNCbGQsIEZpbGUgZmlsZSkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIFppcEZpbGUgemlwID0gbmV3IFppcEZpbGUoZmlsZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBFbnVtZXJhdGlvbjw/IGV4dGVuZHMgWmlwRW50cnk+IGVudHJpZXMgPSB6aXAuZW50cmllcygpOworICAgICAgICAgICAgd2hpbGUgKGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICBaaXBFbnRyeSBlbnRyeSA9IGVudHJpZXMubmV4dEVsZW1lbnQoKTsKKworICAgICAgICAgICAgICAgIGlmIChlbnRyeS5nZXROYW1lKCkuZW5kc1dpdGgoS05PV05fRkFJTFVSRVNfWE1MX0ZJTEUpKSB7CisgICAgICAgICAgICAgICAgICAgIFNBWFBhcnNlckZhY3Rvcnkgc3BmID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgICAgICBzcGYuc2V0TmFtZXNwYWNlQXdhcmUoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBTQVhQYXJzZXIgc2F4UGFyc2VyID0gc3BmLm5ld1NBWFBhcnNlcigpOworICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSB4bWxTdHJlYW0gPSB6aXAuZ2V0SW5wdXRTdHJlYW0oZW50cnkpOworICAgICAgICAgICAgICAgICAgICBLbm93bkZhaWx1cmVzWG1sSGFuZGxlciBrZlhtbEhhbmRsZXIgPSBuZXcgS25vd25GYWlsdXJlc1htbEhhbmRsZXIodHNCbGQpOworICAgICAgICAgICAgICAgICAgICBzYXhQYXJzZXIucGFyc2UoeG1sU3RyZWFtLCBrZlhtbEhhbmRsZXIpOworICAgICAgICAgICAgICAgICAgICB4bWxTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB6aXAuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFBhcnNlIGEgZm9sZGVyIHRvIGFkZCBhbGwgZW50cmllcworICAgIHByaXZhdGUgc3RhdGljIEVudHJ5LkJ1aWxkZXIgcGFyc2VGb2xkZXIoVGVzdFN1aXRlQ29udGVudC5CdWlsZGVyIHRlc3RTdWl0ZUNvbnRlbnQsIFN0cmluZyBmUGF0aCwgU3RyaW5nIHJQYXRoKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24geworICAgICAgICBFbnRyeS5CdWlsZGVyIGZvbGRlckVudHJ5ID0gRW50cnkubmV3QnVpbGRlcigpOworCisgICAgICAgIEZpbGUgZm9sZGVyID0gbmV3IEZpbGUoZlBhdGgpOworICAgICAgICBGaWxlIHJGb2xkZXIgPSBuZXcgRmlsZShyUGF0aCk7CisgICAgICAgIFBhdGggZm9sZGVyUGF0aCA9IFBhdGhzLmdldChmb2xkZXIuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICBQYXRoIHJvb3RQYXRoID0gUGF0aHMuZ2V0KHJGb2xkZXIuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICBTdHJpbmcgZm9sZGVyUmVsYXRpdmVQYXRoID0gcm9vdFBhdGgucmVsYXRpdml6ZShmb2xkZXJQYXRoKS50b1N0cmluZygpOworICAgICAgICBTdHJpbmcgZm9sZGVySWQgPSBnZXRJZChmb2xkZXJSZWxhdGl2ZVBhdGgpOworICAgICAgICBGaWxlW10gZmlsZUxpc3QgPSBmb2xkZXIubGlzdEZpbGVzKCk7CisgICAgICAgIExvbmcgZm9sZGVyU2l6ZSA9IDBMOworICAgICAgICBMaXN0IDxFbnRyeT4gZW50cnlMaXN0ID0gbmV3IEFycmF5TGlzdDxFbnRyeT4gKCk7CisgICAgICAgIGZvciAoRmlsZSBmaWxlIDogZmlsZUxpc3QpeworICAgICAgICAgICAgaWYgKGZpbGUuaXNGaWxlKCkpeworICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlUmVsYXRpdmVQYXRoID0gcm9vdFBhdGgucmVsYXRpdml6ZShQYXRocy5nZXQoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgRW50cnkuQnVpbGRlciBmaWxlRW50cnkgPSBFbnRyeS5uZXdCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgZmlsZUVudHJ5LnNldElkKGdldElkKGZpbGVSZWxhdGl2ZVBhdGgpKTsKKyAgICAgICAgICAgICAgICBmaWxlRW50cnkuc2V0TmFtZShmaWxlLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgZmlsZUVudHJ5LnNldFNpemUoZmlsZS5sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgZmlsZUVudHJ5LnNldENvbnRlbnRJZChnZXRGaWxlQ29udGVudElkKGZpbGUpKTsKKyAgICAgICAgICAgICAgICBmaWxlRW50cnkuc2V0UmVsYXRpdmVQYXRoKGZpbGVSZWxhdGl2ZVBhdGgpOworICAgICAgICAgICAgICAgIGZpbGVFbnRyeS5zZXRQYXJlbnRJZChmb2xkZXJJZCk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgRmlsZU1ldGFkYXRhIGZNZXRhZGF0YSA9IHBhcnNlRmlsZU1ldGFkYXRhKGZpbGVFbnRyeSwgZmlsZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9IGZNZXRhZGF0YSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUVudHJ5LnNldEZpbGVNZXRhZGF0YShmTWV0YWRhdGEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIGdldCBbY3RzXS1rbm93bi1mYWlsdXJlcy54bWwKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUuZ2V0TmFtZSgpLmVuZHNXaXRoKFRFU1RfU1VJVEVfSEFSTkVTUykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlS25vd25GYWlsdXJlcyh0ZXN0U3VpdGVDb250ZW50LCBmaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiQ2Fubm90IHBhcnNlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRlc3RTdWl0ZUNvbnRlbnQuYWRkRmlsZUVudHJpZXMoZmlsZUVudHJ5KTsKKyAgICAgICAgICAgICAgICBlbnRyeUxpc3QuYWRkKGZpbGVFbnRyeS5idWlsZCgpKTsKKyAgICAgICAgICAgICAgICBmb2xkZXJTaXplICs9IGZpbGUubGVuZ3RoKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSl7CisgICAgICAgICAgICAgICAgRW50cnkuQnVpbGRlciBzdWJGb2xkZXJFbnRyeSA9IHBhcnNlRm9sZGVyKHRlc3RTdWl0ZUNvbnRlbnQsIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIHJQYXRoKTsKKyAgICAgICAgICAgICAgICBzdWJGb2xkZXJFbnRyeS5zZXRQYXJlbnRJZChmb2xkZXJJZCk7CisgICAgICAgICAgICAgICAgdGVzdFN1aXRlQ29udGVudC5hZGRGaWxlRW50cmllcyhzdWJGb2xkZXJFbnRyeSk7CisgICAgICAgICAgICAgICAgZm9sZGVyU2l6ZSArPSBzdWJGb2xkZXJFbnRyeS5nZXRTaXplKCk7CisgICAgICAgICAgICAgICAgZW50cnlMaXN0LmFkZChzdWJGb2xkZXJFbnRyeS5idWlsZCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvbGRlckVudHJ5LnNldElkKGZvbGRlcklkKTsKKyAgICAgICAgZm9sZGVyRW50cnkuc2V0TmFtZShmb2xkZXJSZWxhdGl2ZVBhdGgpOworICAgICAgICBmb2xkZXJFbnRyeS5zZXRTaXplKGZvbGRlclNpemUpOworICAgICAgICBmb2xkZXJFbnRyeS5zZXRUeXBlKEVudHJ5LkVudHJ5VHlwZS5GT0xERVIpOworICAgICAgICBmb2xkZXJFbnRyeS5zZXRDb250ZW50SWQoZ2V0Rm9sZGVyQ29udGVudElkKGZvbGRlckVudHJ5LCBlbnRyeUxpc3QpKTsKKyAgICAgICAgZm9sZGVyRW50cnkuc2V0UmVsYXRpdmVQYXRoKGZvbGRlclJlbGF0aXZlUGF0aCk7CisgICAgICAgIHJldHVybiBmb2xkZXJFbnRyeTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RmlsZUNvbnRlbnRJZChGaWxlIGZpbGUpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CisgICAgICAgIE1lc3NhZ2VEaWdlc3QgbWQgPSBNZXNzYWdlRGlnZXN0LmdldEluc3RhbmNlKCJTSEEtMjU2Iik7CisgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOworCisgICAgICAgIGJ5dGVbXSBkYXRhQnl0ZXMgPSBuZXcgYnl0ZVsxMDI0MF07CisKKyAgICAgICAgaW50IG5yZWFkID0gMDsKKyAgICAgICAgd2hpbGUgKChucmVhZCA9IGZpcy5yZWFkKGRhdGFCeXRlcykpICE9IC0xKSB7CisgICAgICAgICAgbWQudXBkYXRlKGRhdGFCeXRlcywgMCwgbnJlYWQpOworICAgICAgICB9OworICAgICAgICBieXRlW10gbWRieXRlcyA9IG1kLmRpZ2VzdCgpOworCisgICAgICAgIC8vIENvbnZlcnRzIHRvIEhleCBTdHJpbmcKKyAgICAgICAgU3RyaW5nQnVmZmVyIGhleFN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgZm9yIChpbnQgaT0wO2k8bWRieXRlcy5sZW5ndGg7aSsrKSB7CisgICAgICAgICAgICBoZXhTdHJpbmcuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcoMHhGRiAmIG1kYnl0ZXNbaV0pKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaGV4U3RyaW5nLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEZvbGRlckNvbnRlbnRJZChFbnRyeS5CdWlsZGVyIGZvbGRlckVudHJ5LCBMaXN0PEVudHJ5PiBlbnRyeUxpc3QpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CisgICAgICAgIE1lc3NhZ2VEaWdlc3QgbWQgPSBNZXNzYWdlRGlnZXN0LmdldEluc3RhbmNlKCJTSEEtMjU2Iik7CisKKyAgICAgICAgZm9yIChFbnRyeSBlbnRyeTogZW50cnlMaXN0KSB7CisgICAgICAgICAgICBtZC51cGRhdGUoZW50cnkuZ2V0Q29udGVudElkKCkuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpOworICAgICAgICB9CisgICAgICAgIGJ5dGVbXSBtZGJ5dGVzID0gbWQuZGlnZXN0KCk7CisKKyAgICAgICAgLy8gQ29udmVydHMgdG8gSGV4IFN0cmluZworICAgICAgICBTdHJpbmdCdWZmZXIgaGV4U3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBmb3IgKGludCBpPTA7aTxtZGJ5dGVzLmxlbmd0aDtpKyspIHsKKyAgICAgICAgICAgIGhleFN0cmluZy5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZygweEZGICYgbWRieXRlc1tpXSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBoZXhTdHJpbmcudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0SWQoU3RyaW5nIG5hbWUpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CisgICAgICAgIE1lc3NhZ2VEaWdlc3QgbWQgPSBNZXNzYWdlRGlnZXN0LmdldEluc3RhbmNlKCJTSEEtMjU2Iik7CisgICAgICAgIG1kLnVwZGF0ZShuYW1lLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKTsKKyAgICAgICAgYnl0ZVtdIG1kYnl0ZXMgPSBtZC5kaWdlc3QoKTsKKworICAgICAgICAvLyBDb252ZXJ0cyB0byBIZXggU3RyaW5nCisgICAgICAgIFN0cmluZ0J1ZmZlciBoZXhTdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGZvciAoaW50IGk9MDtpPG1kYnl0ZXMubGVuZ3RoO2krKykgeworICAgICAgICAgICAgaGV4U3RyaW5nLmFwcGVuZChJbnRlZ2VyLnRvSGV4U3RyaW5nKDB4RkYgJiBtZGJ5dGVzW2ldKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGhleFN0cmluZy50b1N0cmluZygpOworICAgIH0KKworICAgIC8vIEl0ZXJhdGVzIHRob3VnaCBhbGwgdGVzdCBzdWl0ZSBjb250ZW50IGFuZCBwcmludHMgdGhlbS4KKyAgICBzdGF0aWMgdm9pZCBwcmludFRlc3RTdWl0ZUNvbnRlbnQoVGVzdFN1aXRlQ29udGVudCB0c0NvbnRlbnQpIHsKKyAgICAgICAgLy9IZWFkZXIKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIm5vLHR5cGUsbmFtZSxzaXplLHJlbGF0aXZlIHBhdGgsaWQsY29udGVudCBpZCxwYXJlbnQgaWQsZGVzY3JpcHRpb24sdGVzdCBjbGFzcyIpOworICAgICAgICAvLyB0ZXN0IGNsYXNzIGhlYWRlcgorICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiLCVzLCVzLCVzLCVzLCVzIiwKKyAgICAgICAgICAgICAgICBSVU5USU1FX0hJVF9UQUcsIFBBQ0tBR0VfVEFHLCBKQVJfTkFNRV9UQUcsIE5BVElWRV9URVNUX0RFVklDRV9QQVRIX1RBRywgTU9EVUxFX1RBRyk7CisgICAgICAgIC8vIHRhcmdldCBwcmVwYXJlciBoZWFkZXIKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIiwlcywlc1xuIiwKKyAgICAgICAgICAgICAgICBURVNUX0ZJTEVfTkFNRV9UQUcsIFBVU0hfVEFHKTsKKworICAgICAgICBpbnQgaSA9IDE7CisgICAgICAgIGZvciAoRW50cnkgZW50cnk6IHRzQ29udGVudC5nZXRGaWxlRW50cmllc0xpc3QoKSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIiVkLCVzLCVzLCVkLCVzLCVzLCVzLCVzIiwKKyAgICAgICAgICAgICAgICBpKyssIGVudHJ5LmdldFR5cGUoKSwgZW50cnkuZ2V0TmFtZSgpLCBlbnRyeS5nZXRTaXplKCksCisgICAgICAgICAgICAgICAgZW50cnkuZ2V0UmVsYXRpdmVQYXRoKCksIGVudHJ5LmdldElkKCksIGVudHJ5LmdldENvbnRlbnRJZCgpLAorICAgICAgICAgICAgICAgIGVudHJ5LmdldFBhcmVudElkKCkpOworCisgICAgICAgICAgICBpZiAoRW50cnkuRW50cnlUeXBlLkNPTkZJRyA9PSBlbnRyeS5nZXRUeXBlKCkpIHsKKyAgICAgICAgICAgICAgICBDb25maWdNZXRhZGF0YSBjb25maWcgPSBlbnRyeS5nZXRGaWxlTWV0YWRhdGEoKS5nZXRDb25maWdNZXRhZGF0YSgpOworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIsJXMiLCBlbnRyeS5nZXRGaWxlTWV0YWRhdGEoKS5nZXREZXNjcmlwdGlvbigpKTsKKyAgICAgICAgICAgICAgICBMaXN0PE9wdGlvbj4gb3B0TGlzdDsKKyAgICAgICAgICAgICAgICBMaXN0PENvbmZpZ01ldGFkYXRhLlRlc3RDbGFzcz4gdGVzdENsYXNzZXNMaXN0ID0gY29uZmlnLmdldFRlc3RDbGFzc2VzTGlzdCgpOworICAgICAgICAgICAgICAgIFN0cmluZyBydEhpdCA9ICIiOworICAgICAgICAgICAgICAgIFN0cmluZyBwa2cgPSAiIjsKKyAgICAgICAgICAgICAgICBTdHJpbmcgamFyID0gIiI7CisgICAgICAgICAgICAgICAgU3RyaW5nIG50ZFBhdGggPSAiIjsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbW9kdWxlID0gIiI7CisKKyAgICAgICAgICAgICAgICBmb3IgKENvbmZpZ01ldGFkYXRhLlRlc3RDbGFzcyB0Q2xhc3MgOiB0ZXN0Q2xhc3Nlc0xpc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIiwlcyIsIHRDbGFzcy5nZXRUZXN0Q2xhc3MoKSk7CisgICAgICAgICAgICAgICAgICAgIG9wdExpc3QgPSB0Q2xhc3MuZ2V0T3B0aW9uc0xpc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChPcHRpb24gb3B0IDogb3B0TGlzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJVTlRJTUVfSElUX1RBRy5lcXVhbHNJZ25vcmVDYXNlKG9wdC5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRIaXQgPSBydEhpdCArIG9wdC5nZXRWYWx1ZSgpICsgIiAiOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChQQUNLQUdFX1RBRy5lcXVhbHNJZ25vcmVDYXNlKG9wdC5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGtnID0gcGtnICsgb3B0LmdldFZhbHVlKCkgKyAiICI7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEpBUl9OQU1FX1RBRy5lcXVhbHNJZ25vcmVDYXNlKG9wdC5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgamFyID0gamFyICsgb3B0LmdldFZhbHVlKCkgKyAiICI7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKE5BVElWRV9URVNUX0RFVklDRV9QQVRIX1RBRy5lcXVhbHNJZ25vcmVDYXNlKG9wdC5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnRkUGF0aCA9IG50ZFBhdGggKyBvcHQuZ2V0VmFsdWUoKSArICIgIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoTU9EVUxFX1RBRy5lcXVhbHNJZ25vcmVDYXNlKG9wdC5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlID0gbW9kdWxlICsgb3B0LmdldFZhbHVlKCkgKyAiICI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIiwlcywlcywlcywlcywlcyIsIHJ0SGl0LnRyaW0oKSwgcGtnLnRyaW0oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGphci50cmltKCksIG1vZHVsZS50cmltKCksIG50ZFBhdGgudHJpbSgpKTsKKworICAgICAgICAgICAgICAgIExpc3Q8Q29uZmlnTWV0YWRhdGEuVGFyZ2V0UHJlcGFyZXI+IHRQcmVwTGlzdCA9IGNvbmZpZy5nZXRUYXJnZXRQcmVwYXJlcnNMaXN0KCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHRlc3RGaWxlID0gIiI7CisgICAgICAgICAgICAgICAgU3RyaW5nIHB1c2hMaXN0ID0gIiI7CisgICAgICAgICAgICAgICAgZm9yIChDb25maWdNZXRhZGF0YS5UYXJnZXRQcmVwYXJlciB0UHJlcCA6IHRQcmVwTGlzdCkgeworICAgICAgICAgICAgICAgICAgICBvcHRMaXN0ID0gdFByZXAuZ2V0T3B0aW9uc0xpc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChPcHRpb24gb3B0IDogb3B0TGlzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFRFU1RfRklMRV9OQU1FX1RBRy5lcXVhbHNJZ25vcmVDYXNlKG9wdC5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdEZpbGUgPSB0ZXN0RmlsZSArIG9wdC5nZXRWYWx1ZSgpICsgIiAiOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChQVVNIX1RBRy5lcXVhbHNJZ25vcmVDYXNlKG9wdC5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaExpc3QgPSBwdXNoTGlzdCArIG9wdC5nZXRWYWx1ZSgpICsgIiAiOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIsJXMsJXMiLCB0ZXN0RmlsZS50cmltKCksIHB1c2hMaXN0LnRyaW0oKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiXG4iKTsKKyAgICAgICAgfQorCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCJcbktub3duIEZhaWx1cmVzXG4iKTsKKyAgICAgICAgZm9yIChTdHJpbmcga2YgOiB0c0NvbnRlbnQuZ2V0S25vd25GYWlsdXJlc0xpc3QoKSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIiVzXG4iLCBrZik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgb3V0cHV0RmlsZVBhdGggPSAiLi90c0NvbnRlbnRNZXNzYWdlLnBiIjsKKyAgICAgICAgU3RyaW5nIG91dHB1dFRlc3RDYXNlTGlzdEZpbGVQYXRoID0gIi4vdHNUZXN0Q2FzZUxpc3QucGIiOworICAgICAgICBTdHJpbmcgdHNQYXRoID0gIiI7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoYXJnc1tpXS5zdGFydHNXaXRoKCItIikpIHsKKyAgICAgICAgICAgICAgICBpZiAoIi1vIi5lcXVhbHMoYXJnc1tpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0RmlsZVBhdGggPSBnZXRFeHBlY3RlZEFyZyhhcmdzLCArK2kpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIi10Ii5lcXVhbHMoYXJnc1tpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0VGVzdENhc2VMaXN0RmlsZVBhdGggPSBnZXRFeHBlY3RlZEFyZyhhcmdzLCArK2kpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIi1pIi5lcXVhbHMoYXJnc1tpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdHNQYXRoID0gZ2V0RXhwZWN0ZWRBcmcoYXJncywgKytpKTsKKyAgICAgICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUodHNQYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gT25seSBhY2NlcHRpb24gYSBmb2xkZXIKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWxlLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50VXNhZ2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50VXNhZ2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBUZXN0U3VpdGVDb250ZW50IHRzQ29udGVudCA9IHBhcnNlVGVzdFN1aXRlRm9sZGVyKHRzUGF0aCk7CisKKyAgICAgICAgLy8gV3JpdGUgdGVzdCBzdWl0ZSBjb250ZW50IG1lc3NhZ2UgdG8gZGlzay4KKyAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXRwdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRwdXRGaWxlUGF0aCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgdHNDb250ZW50LndyaXRlVG8ob3V0cHV0KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICBvdXRwdXQuY2xvc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlYWQgbWVzc2FnZSBmcm9tIHRoZSBmaWxlIGFuZCBwcmludCB0aGVtIG91dAorICAgICAgICBUZXN0U3VpdGVDb250ZW50IHRzQ29udGVudDEgPQorICAgICAgICAgICAgICAgIFRlc3RTdWl0ZUNvbnRlbnQucGFyc2VGcm9tKG5ldyBGaWxlSW5wdXRTdHJlYW0ob3V0cHV0RmlsZVBhdGgpKTsKKyAgICAgICAgcHJpbnRUZXN0U3VpdGVDb250ZW50KHRzQ29udGVudDEpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2N0cy1kZXZpY2UtaW5mby9BbmRyb2lkLm1rIGIvdG9vbHMvY3RzLWRldmljZS1pbmZvL0FuZHJvaWQubWsKaW5kZXggMmYxMWRiOS4uNDcxNWY1MiAxMDA2NDQKLS0tIGEvdG9vbHMvY3RzLWRldmljZS1pbmZvL0FuZHJvaWQubWsKKysrIGIvdG9vbHMvY3RzLWRldmljZS1pbmZvL0FuZHJvaWQubWsKQEAgLTE4LDYgKzE4LDggQEAKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicworCiBMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdHNkZXZpY2VpbmZvCiAKIExPQ0FMX01VTFRJTElCIDo9IGJvdGgKQEAgLTM2LDcgKzM4LDcgQEAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNEZXZpY2VJbmZvCiAKICMgVGFnIHRoaXMgbW9kdWxlIGFzIGEgY3RzIHRlc3QgYXJ0aWZhY3QKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGN0cyB2dHMgZ2VuZXJhbC10ZXN0cyBzdHMgY3RzX2luc3RhbnQKIAogaW5jbHVkZSAkKEJVSUxEX0NUU19ERVZJQ0VfSU5GT19QQUNLQUdFKQogCmRpZmYgLS1naXQgYS90b29scy9jdHMtZGV2aWNlLWluZm8vam5pL0FuZHJvaWQubWsgYi90b29scy9jdHMtZGV2aWNlLWluZm8vam5pL0FuZHJvaWQubWsKaW5kZXggMzBiZGU1My4uNTc4NmMyMCAxMDA2NDQKLS0tIGEvdG9vbHMvY3RzLWRldmljZS1pbmZvL2puaS9BbmRyb2lkLm1rCisrKyBiL3Rvb2xzL2N0cy1kZXZpY2UtaW5mby9qbmkvQW5kcm9pZC5tawpAQCAtMjgsNyArMjgsOCBAQAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJ2dWxrYW4gbGlibG9nIGxpYmRsCiBMT0NBTF9OREtfU1RMX1ZBUklBTlQgOj0gYysrX3N0YXRpYwogCi0jIFdvdWxkIGJlICJjdXJyZW50IiBpZiB0aGF0IHdhcyBzdXBwb3J0ZWQgZm9yIG5hdGl2ZSBjb2RlLgotTE9DQUxfU0RLX1ZFUlNJT04gOj0gMjQKK0xPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yCisKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKIAogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvdG9vbHMvY3RzLWRldmljZS1pbmZvL3NyYy9jb20vYW5kcm9pZC9jdHMvZGV2aWNlaW5mby9DYW1lcmFEZXZpY2VJbmZvLmphdmEgYi90b29scy9jdHMtZGV2aWNlLWluZm8vc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2VpbmZvL0NhbWVyYURldmljZUluZm8uamF2YQppbmRleCA0MWFmZGI5Li4yMGM1YzI3IDEwMDY0NAotLS0gYS90b29scy9jdHMtZGV2aWNlLWluZm8vc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2VpbmZvL0NhbWVyYURldmljZUluZm8uamF2YQorKysgYi90b29scy9jdHMtZGV2aWNlLWluZm8vc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2VpbmZvL0NhbWVyYURldmljZUluZm8uamF2YQpAQCAtNDY4LDYgKzQ2OCw3IEBACiAgICAgICAgIGNoYXJzS2V5TmFtZXMuYWRkKENhbWVyYUNoYXJhY3RlcmlzdGljcy5IT1RfUElYRUxfQVZBSUxBQkxFX0hPVF9QSVhFTF9NT0RFUy5nZXROYW1lKCkpOwogICAgICAgICBjaGFyc0tleU5hbWVzLmFkZChDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuSlBFR19BVkFJTEFCTEVfVEhVTUJOQUlMX1NJWkVTLmdldE5hbWUoKSk7CiAgICAgICAgIGNoYXJzS2V5TmFtZXMuYWRkKENhbWVyYUNoYXJhY3RlcmlzdGljcy5MRU5TX0ZBQ0lORy5nZXROYW1lKCkpOworICAgICAgICBjaGFyc0tleU5hbWVzLmFkZChDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuTEVOU19QT1NFX1JFRkVSRU5DRS5nZXROYW1lKCkpOwogICAgICAgICBjaGFyc0tleU5hbWVzLmFkZChDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuTEVOU19JTkZPX0FWQUlMQUJMRV9BUEVSVFVSRVMuZ2V0TmFtZSgpKTsKICAgICAgICAgY2hhcnNLZXlOYW1lcy5hZGQoQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLkxFTlNfSU5GT19BVkFJTEFCTEVfRklMVEVSX0RFTlNJVElFUy5nZXROYW1lKCkpOwogICAgICAgICBjaGFyc0tleU5hbWVzLmFkZChDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuTEVOU19JTkZPX0FWQUlMQUJMRV9GT0NBTF9MRU5HVEhTLmdldE5hbWUoKSk7CkBAIC01MTUsMTIgKzUxNiwxNiBAQAogICAgICAgICBjaGFyc0tleU5hbWVzLmFkZChDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuU1RBVElTVElDU19JTkZPX01BWF9GQUNFX0NPVU5ULmdldE5hbWUoKSk7CiAgICAgICAgIGNoYXJzS2V5TmFtZXMuYWRkKENhbWVyYUNoYXJhY3RlcmlzdGljcy5TVEFUSVNUSUNTX0lORk9fQVZBSUxBQkxFX0hPVF9QSVhFTF9NQVBfTU9ERVMuZ2V0TmFtZSgpKTsKICAgICAgICAgY2hhcnNLZXlOYW1lcy5hZGQoQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLlNUQVRJU1RJQ1NfSU5GT19BVkFJTEFCTEVfTEVOU19TSEFESU5HX01BUF9NT0RFUy5nZXROYW1lKCkpOworICAgICAgICBjaGFyc0tleU5hbWVzLmFkZChDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuU1RBVElTVElDU19JTkZPX0FWQUlMQUJMRV9PSVNfREFUQV9NT0RFUy5nZXROYW1lKCkpOwogICAgICAgICBjaGFyc0tleU5hbWVzLmFkZChDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuVE9ORU1BUF9NQVhfQ1VSVkVfUE9JTlRTLmdldE5hbWUoKSk7CiAgICAgICAgIGNoYXJzS2V5TmFtZXMuYWRkKENhbWVyYUNoYXJhY3RlcmlzdGljcy5UT05FTUFQX0FWQUlMQUJMRV9UT05FX01BUF9NT0RFUy5nZXROYW1lKCkpOwogICAgICAgICBjaGFyc0tleU5hbWVzLmFkZChDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuSU5GT19TVVBQT1JURURfSEFSRFdBUkVfTEVWRUwuZ2V0TmFtZSgpKTsKKyAgICAgICAgY2hhcnNLZXlOYW1lcy5hZGQoQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLklORk9fVkVSU0lPTi5nZXROYW1lKCkpOwogICAgICAgICBjaGFyc0tleU5hbWVzLmFkZChDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuU1lOQ19NQVhfTEFURU5DWS5nZXROYW1lKCkpOwogICAgICAgICBjaGFyc0tleU5hbWVzLmFkZChDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuUkVQUk9DRVNTX01BWF9DQVBUVVJFX1NUQUxMLmdldE5hbWUoKSk7CiAgICAgICAgIGNoYXJzS2V5TmFtZXMuYWRkKENhbWVyYUNoYXJhY3RlcmlzdGljcy5ERVBUSF9ERVBUSF9JU19FWENMVVNJVkUuZ2V0TmFtZSgpKTsKKyAgICAgICAgY2hhcnNLZXlOYW1lcy5hZGQoQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLkxPR0lDQUxfTVVMVElfQ0FNRVJBX1NFTlNPUl9TWU5DX1RZUEUuZ2V0TmFtZSgpKTsKKyAgICAgICAgY2hhcnNLZXlOYW1lcy5hZGQoQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLkRJU1RPUlRJT05fQ09SUkVDVElPTl9BVkFJTEFCTEVfTU9ERVMuZ2V0TmFtZSgpKTsKIAogICAgICAgICByZXR1cm4gY2hhcnNLZXlOYW1lczsKICAgICB9CmRpZmYgLS1naXQgYS90b29scy9jdHMtZGV2aWNlLWluZm8vc3JjL2NvbS9hbmRyb2lkL2N0cy9kZXZpY2VpbmZvL1Z1bGthbkRldmljZUluZm8uamF2YSBiL3Rvb2xzL2N0cy1kZXZpY2UtaW5mby9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZWluZm8vVnVsa2FuRGV2aWNlSW5mby5qYXZhCmluZGV4IGZjOTlkNzUuLjIwNjZkMTQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2N0cy1kZXZpY2UtaW5mby9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZWluZm8vVnVsa2FuRGV2aWNlSW5mby5qYXZhCisrKyBiL3Rvb2xzL2N0cy1kZXZpY2UtaW5mby9zcmMvY29tL2FuZHJvaWQvY3RzL2RldmljZWluZm8vVnVsa2FuRGV2aWNlSW5mby5qYXZhCkBAIC0xNiw2ICsxNiw3IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuY3RzLmRldmljZWluZm87CiAKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi5kZXZpY2VpbmZvLkRldmljZUluZm87CiBpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5EZXZpY2VJbmZvU3RvcmU7CiAKQEAgLTcyLDI1ICs3MywzOCBAQAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgVnVsa2FuRGV2aWNlSW5mbyBleHRlbmRzIERldmljZUluZm8gewogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV8xNkJJVF9TVE9SQUdFX0ZFQVRVUkVTID0gIjE2Yml0U3RvcmFnZUZlYXR1cmVzIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0FMUEhBX1RPX09ORSA9ICJhbHBoYVRvT25lIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0FQSV9WRVJTSU9OID0gImFwaVZlcnNpb24iOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQlVGRkVSX0ZFQVRVUkVTID0gImJ1ZmZlckZlYXR1cmVzIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0JVRkZFUl9JTUFHRV9HUkFOVUxBUklUWSA9ICJidWZmZXJJbWFnZUdyYW51bGFyaXR5IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTVBBVElCTEVfSEFORExFX1RZUEVTID0gImNvbXBhdGlibGVIYW5kbGVUeXBlcyI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ERVBUSCA9ICJkZXB0aCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ERVBUSF9CSUFTX0NMQU1QID0gImRlcHRoQmlhc0NsYW1wIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RFUFRIX0JPVU5EUyA9ICJkZXB0aEJvdW5kcyI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ERVBUSF9DTEFNUCA9ICJkZXB0aENsYW1wIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RFU0NSSVBUSU9OID0gImRlc2NyaXB0aW9uIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RFVklDRV9HUk9VUFMgPSAiZGV2aWNlR3JvdXBzIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RFVklDRV9JRCA9ICJkZXZpY2VJRCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ERVZJQ0VfTFVJRCA9ICJkZXZpY2VMVUlEIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RFVklDRV9MVUlEX1ZBTElEID0gImRldmljZUxVSURWYWxpZCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ERVZJQ0VfTkFNRSA9ICJkZXZpY2VOYW1lIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RFVklDRV9OT0RFX01BU0sgPSAiZGV2aWNlTm9kZU1hc2siOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfREVWSUNFX1RZUEUgPSAiZGV2aWNlVHlwZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ERVZJQ0VfVVVJRCA9ICJkZXZpY2VVVUlEIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RFVklDRVMgPSAiZGV2aWNlcyI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ESVNDUkVURV9RVUVVRV9QUklPUklUSUVTID0gImRpc2NyZXRlUXVldWVQcmlvcml0aWVzIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RSQVdfSU5ESVJFQ1RfRklSU1RfSU5TVEFOQ0UgPSAiZHJhd0luZGlyZWN0Rmlyc3RJbnN0YW5jZSI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9EUklWRVJfVkVSU0lPTiA9ICJkcml2ZXJWZXJzaW9uIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RSSVZFUl9VVUlEID0gImRyaXZlclVVSUQiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRFVBTF9TUkNfQkxFTkQgPSAiZHVhbFNyY0JsZW5kIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0VYUE9SVF9GUk9NX0lNUE9SVEVEX0hBTkRMRV9UWVBFUyA9ICJleHBvcnRGcm9tSW1wb3J0ZWRIYW5kbGVUeXBlcyI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9FWFRFTlNJT05fTkFNRSA9ICJleHRlbnNpb25OYW1lIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0VYVEVOU0lPTlMgPSAiZXh0ZW5zaW9ucyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9FWFRFUk5BTF9GRU5DRV9GRUFUVVJFUyA9ICJleHRlcm5hbEZlbmNlRmVhdHVyZXMiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRVhURVJOQUxfRkVOQ0VfUFJPUEVSVElFUyA9ICJleHRlcm5hbEZlbmNlUHJvcGVydGllcyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9FWFRFUk5BTF9TRU1BUEhPUkVfRkVBVFVSRVMgPSAiZXh0ZXJuYWxTZW1hcGhvcmVGZWF0dXJlcyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9FWFRFUk5BTF9TRU1BUEhPUkVfUFJPUEVSVElFUyA9ICJleHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRkVBVFVSRVMgPSAiZmVhdHVyZXMiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRklMTF9NT0RFX05PTl9TT0xJRCA9ICJmaWxsTW9kZU5vblNvbGlkIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0ZMQUdTID0gImZsYWdzIjsKQEAgLTEwNCw2ICsxMTgsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfR0VPTUVUUllfU0hBREVSID0gImdlb21ldHJ5U2hhZGVyIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0hFQVBfSU5ERVggPSAiaGVhcEluZGV4IjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0hFSUdIVCA9ICJoZWlnaHQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfSURfUFJPUEVSVElFUyA9ICJpZFByb3BlcnRpZXMiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfSU1BR0VfQ1VCRV9BUlJBWSA9ICJpbWFnZUN1YmVBcnJheSI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9JTVBMRU1FTlRBVElPTl9WRVJTSU9OID0gImltcGxlbWVudGF0aW9uVmVyc2lvbiI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9JTkRFUEVOREVOVF9CTEVORCA9ICJpbmRlcGVuZGVudEJsZW5kIjsKQEAgLTExNiw2ICsxMzEsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTElORV9XSURUSF9SQU5HRSA9ICJsaW5lV2lkdGhSYW5nZSI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9MSU5FQVJfVElMSU5HX0ZFQVRVUkVTID0gImxpbmVhclRpbGluZ0ZlYXR1cmVzIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0xPR0lDX09QID0gImxvZ2ljT3AiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTUFJTlRFTkFOQ0VfM19QUk9QRVJUSUVTID0gIm1haW50ZW5hbmNlM1Byb3BlcnRpZXMiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTUFYX0JPVU5EX0RFU0NSSVBUT1JfU0VUUyA9ICJtYXhCb3VuZERlc2NyaXB0b3JTZXRzIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX01BWF9DTElQX0RJU1RBTkNFUyA9ICJtYXhDbGlwRGlzdGFuY2VzIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX01BWF9DT0xPUl9BVFRBQ0hNRU5UUyA9ICJtYXhDb2xvckF0dGFjaG1lbnRzIjsKQEAgLTE1NCw2ICsxNzAsMTAgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX01BWF9JTUFHRV9ESU1FTlNJT05fQ1VCRSA9ICJtYXhJbWFnZURpbWVuc2lvbkN1YmUiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTUFYX0lOVEVSUE9MQVRJT05fT0ZGU0VUID0gIm1heEludGVycG9sYXRpb25PZmZzZXQiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTUFYX01FTU9SWV9BTExPQ0FUSU9OX0NPVU5UID0gIm1heE1lbW9yeUFsbG9jYXRpb25Db3VudCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9NQVhfTUVNT1JZX0FMTE9DQVRJT05fU0laRSA9ICJtYXhNZW1vcnlBbGxvY2F0aW9uU2l6ZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9NQVhfTVVMVElWSUVXX0lOU1RBTkNFX0lOREVYID0gIm1heE11bHRpdmlld0luc3RhbmNlSW5kZXgiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTUFYX01VTFRJVklFV19WSUVXX0NPVU5UID0gIm1heE11bHRpdmlld1ZpZXdDb3VudCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9NQVhfUEVSX1NFVF9ERVNDUklQVE9SUyA9ICJtYXhQZXJTZXREZXNjcmlwdG9ycyI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9NQVhfUEVSX1NUQUdFX0RFU0NSSVBUT1JfSU5QVVRfQVRUQUNITUVOVFMgPSAibWF4UGVyU3RhZ2VEZXNjcmlwdG9ySW5wdXRBdHRhY2htZW50cyI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9NQVhfUEVSX1NUQUdFX0RFU0NSSVBUT1JfU0FNUExFRF9JTUFHRVMgPSAibWF4UGVyU3RhZ2VEZXNjcmlwdG9yU2FtcGxlZEltYWdlcyI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9NQVhfUEVSX1NUQUdFX0RFU0NSSVBUT1JfU0FNUExFUlMgPSAibWF4UGVyU3RhZ2VEZXNjcmlwdG9yU2FtcGxlcnMiOwpAQCAtMjAyLDYgKzIyMiwxMSBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTUlQTUFQX1BSRUNJU0lPTl9CSVRTID0gIm1pcG1hcFByZWNpc2lvbkJpdHMiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTVVMVElfRFJBV19JTkRJUkVDVCA9ICJtdWx0aURyYXdJbmRpcmVjdCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9NVUxUSV9WSUVXUE9SVCA9ICJtdWx0aVZpZXdwb3J0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX01VTFRJVklFVyA9ICJtdWx0aXZpZXciOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTVVMVElWSUVXX0ZFQVRVUkVTID0gIm11bHRpdmlld0ZlYXR1cmVzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX01VTFRJVklFV19HRU9NRVRSWV9TSEFERVIgPSAibXVsdGl2aWV3R2VvbWV0cnlTaGFkZXIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTVVMVElWSUVXX1BST1BFUlRJRVMgPSAibXVsdGl2aWV3UHJvcGVydGllcyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9NVUxUSVZJRVdfVEVTU0VMTEFUSU9OX1NIQURFUiA9ICJtdWx0aXZpZXdUZXNzZWxsYXRpb25TaGFkZXIiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTk9OX0NPSEVSRU5UX0FUT01fU0laRSA9ICJub25Db2hlcmVudEF0b21TaXplIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX09DQ0xVU0lPTl9RVUVSWV9QUkVDSVNFID0gIm9jY2x1c2lvblF1ZXJ5UHJlY2lzZSI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9PUFRJTUFMX0JVRkZFUl9DT1BZX09GRlNFVF9BTElHTk1FTlQgPSAib3B0aW1hbEJ1ZmZlckNvcHlPZmZzZXRBbGlnbm1lbnQiOwpAQCAtMjA5LDEwICsyMzQsMTUgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX09QVElNQUxfVElMSU5HX0ZFQVRVUkVTID0gIm9wdGltYWxUaWxpbmdGZWF0dXJlcyI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QSVBFTElORV9DQUNIRV9VVUlEID0gInBpcGVsaW5lQ2FjaGVVVUlEIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BJUEVMSU5FX1NUQVRJU1RJQ1NfUVVFUlkgPSAicGlwZWxpbmVTdGF0aXN0aWNzUXVlcnkiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUE9JTlRfQ0xJUFBJTkdfQkVIQVZJT1IgPSAicG9pbnRDbGlwcGluZ0JlaGF2aW9yIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BPSU5UX0NMSVBQSU5HX1BST1BFUlRJRVMgPSAicG9pbnRDbGlwcGluZ1Byb3BlcnRpZXMiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUE9JTlRfU0laRV9HUkFOVUxBUklUWSA9ICJwb2ludFNpemVHcmFudWxhcml0eSI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QT0lOVF9TSVpFX1JBTkdFID0gInBvaW50U2l6ZVJhbmdlIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BST1BFUlRJRVMgPSAicHJvcGVydGllcyI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QUk9QRVJUWV9GTEFHUyA9ICJwcm9wZXJ0eUZsYWdzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BST1RFQ1RFRF9NRU1PUlkgPSAicHJvdGVjdGVkTWVtb3J5IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BST1RFQ1RFRF9NRU1PUllfRkVBVFVSRVMgPSAicHJvdGVjdGVkTWVtb3J5RmVhdHVyZXMiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUVVBRF9PUEVSQVRJT05TX0lOX0FMTF9TVEFHRVMgPSAicXVhZE9wZXJhdGlvbnNJbkFsbFN0YWdlcyI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9RVUVVRV9DT1VOVCA9ICJxdWV1ZUNvdW50IjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1FVRVVFX0ZMQUdTID0gInF1ZXVlRmxhZ3MiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUVVFVUVTID0gInF1ZXVlcyI7CkBAIC0yMjgsOCArMjU4LDEyIEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TQU1QTEVEX0lNQUdFX0lOVEVHRVJfU0FNUExFX0NPVU5UUyA9ICJzYW1wbGVkSW1hZ2VJbnRlZ2VyU2FtcGxlQ291bnRzIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NBTVBMRURfSU1BR0VfU1RFTkNJTF9TQU1QTEVfQ09VTlRTID0gInNhbXBsZWRJbWFnZVN0ZW5jaWxTYW1wbGVDb3VudHMiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0FNUExFUl9BTklTT1RST1BZID0gInNhbXBsZXJBbmlzb3Ryb3B5IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTiA9ICJzYW1wbGVyWWNiY3JDb252ZXJzaW9uIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9GRUFUVVJFUyA9ICJzYW1wbGVyWWNiY3JDb252ZXJzaW9uRmVhdHVyZXMiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0hBREVSX0NMSVBfRElTVEFOQ0UgPSAic2hhZGVyQ2xpcERpc3RhbmNlIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NIQURFUl9DVUxMX0RJU1RBTkNFID0gInNoYWRlckN1bGxEaXN0YW5jZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TSEFERVJfRFJBV19QQVJBTUVURVJfRkVBVFVSRVMgPSAic2hhZGVyRHJhd1BhcmFtZXRlckZlYXR1cmVzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NIQURFUl9EUkFXX1BBUkFNRVRFUlMgPSAic2hhZGVyRHJhd1BhcmFtZXRlcnMiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0hBREVSX0ZMT0FUNjQgPSAic2hhZGVyRmxvYXQ2NCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TSEFERVJfSU1BR0VfR0FUSEVSX0VYVEVOREVEID0gInNoYWRlckltYWdlR2F0aGVyRXh0ZW5kZWQiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0hBREVSX0lOVDE2ID0gInNoYWRlckludDE2IjsKQEAgLTI1OSwxMSArMjkzLDE5IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TUEFSU0VfUkVTSURFTkNZX0lNQUdFXzNEID0gInNwYXJzZVJlc2lkZW5jeUltYWdlM0QiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU1BFQ19WRVJTSU9OID0gInNwZWNWZXJzaW9uIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NUQU5EQVJEX1NBTVBMRV9MT0NBVElPTlMgPSAic3RhbmRhcmRTYW1wbGVMb2NhdGlvbnMiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU1RPUkFHRV9CVUZGRVJfMTZCSVRfQUNDRVNTID0gInN0b3JhZ2VCdWZmZXIxNkJpdEFjY2VzcyI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TVE9SQUdFX0lNQUdFX1NBTVBMRV9DT1VOVFMgPSAic3RvcmFnZUltYWdlU2FtcGxlQ291bnRzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NUT1JBR0VfSU5QVVRfT1VUUFVUXzE2ID0gInN0b3JhZ2VJbnB1dE91dHB1dDE2IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NUT1JBR0VfUFVTSF9DT05TVEFOVF8xNiA9ICJzdG9yYWdlUHVzaENvbnN0YW50MTYiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU1RSSUNUX0xJTkVTID0gInN0cmljdExpbmVzIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NVQl9QSVhFTF9JTlRFUlBPTEFUSU9OX09GRlNFVF9CSVRTID0gInN1YlBpeGVsSW50ZXJwb2xhdGlvbk9mZnNldEJpdHMiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU1VCX1BJWEVMX1BSRUNJU0lPTl9CSVRTID0gInN1YlBpeGVsUHJlY2lzaW9uQml0cyI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TVUJfVEVYRUxfUFJFQ0lTSU9OX0JJVFMgPSAic3ViVGV4ZWxQcmVjaXNpb25CaXRzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NVQkdST1VQX1BST1BFUlRJRVMgPSAic3ViZ3JvdXBQcm9wZXJ0aWVzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NVQkdST1VQX1NJWkUgPSAic3ViZ3JvdXBTaXplIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NVQlNFVF9BTExPQ0FUSU9OID0gInN1YnNldEFsbG9jYXRpb24iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU1VQUE9SVEVEX09QRVJBVElPTlMgPSAic3VwcG9ydGVkT3BlcmF0aW9ucyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TVVBQT1JURURfU1RBR0VTID0gInN1cHBvcnRlZFN0YWdlcyI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9URVNTRUxMQVRJT05fU0hBREVSID0gInRlc3NlbGxhdGlvblNoYWRlciI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9URVhUVVJFX0NPTVBSRVNTSU9OX0FTVENfTERSID0gInRleHR1cmVDb21wcmVzc2lvbkFTVENfTERSIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1RFWFRVUkVfQ09NUFJFU1NJT05fQkMgPSAidGV4dHVyZUNvbXByZXNzaW9uQkMiOwpAQCAtMjcxLDIyICszMTMsMzYgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1RJTUVTVEFNUF9DT01QVVRFX0FORF9HUkFQSElDUyA9ICJ0aW1lc3RhbXBDb21wdXRlQW5kR3JhcGhpY3MiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVElNRVNUQU1QX1BFUklPRCA9ICJ0aW1lc3RhbXBQZXJpb2QiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVElNRVNUQU1QX1ZBTElEX0JJVFMgPSAidGltZXN0YW1wVmFsaWRCaXRzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1VOSUZPUk1fQU5EX1NUT1JBR0VfQlVGRkVSXzE2QklUX0FDQ0VTUyA9ICJ1bmlmb3JtQW5kU3RvcmFnZUJ1ZmZlcjE2Qml0QWNjZXNzIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1ZBUklBQkxFX01VTFRJU0FNUExFX1JBVEUgPSAidmFyaWFibGVNdWx0aXNhbXBsZVJhdGUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVkFSSUFCTEVfUE9JTlRFUl9GRUFUVVJFUyA9ICJ2YXJpYWJsZVBvaW50ZXJGZWF0dXJlcyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9WQVJJQUJMRV9QT0lOVEVSX0ZFQVRVUkVTX0tIUiA9ICJ2YXJpYWJsZVBvaW50ZXJGZWF0dXJlc0tIUiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9WQVJJQUJMRV9QT0lOVEVSUyA9ICJ2YXJpYWJsZVBvaW50ZXJzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1ZBUklBQkxFX1BPSU5URVJTX1NUT1JBR0VfQlVGRkVSID0gInZhcmlhYmxlUG9pbnRlcnNTdG9yYWdlQnVmZmVyIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1ZFTkRPUl9JRCA9ICJ2ZW5kb3JJRCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9WRVJURVhfUElQRUxJTkVfU1RPUkVTX0FORF9BVE9NSUNTID0gInZlcnRleFBpcGVsaW5lU3RvcmVzQW5kQXRvbWljcyI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9WSUVXUE9SVF9CT1VORFNfUkFOR0UgPSAidmlld3BvcnRCb3VuZHNSYW5nZSI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9WSUVXUE9SVF9TVUJfUElYRUxfQklUUyA9ICJ2aWV3cG9ydFN1YlBpeGVsQml0cyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9WS19LSFJfVkFSSUFCTEVfUE9JTlRFUlMgPSAiVktfS0hSX3ZhcmlhYmxlX3BvaW50ZXJzIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1dJREVfTElORVMgPSAid2lkZUxpbmVzIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1dJRFRIID0gIndpZHRoIjsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWS19BUElfVkVSU0lPTl8xXzEgPSA0MTk4NDAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTlVNX1ZLX0tIUl9WQVJJQUJMRV9QT0lOVEVSUyA9IDA7CisKKyAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4gZXh0ZW5zaW9uTmFtZVRvRW51bTsKKwogICAgIHN0YXRpYyB7CiAgICAgICAgIFN5c3RlbS5sb2FkTGlicmFyeSgiY3RzZGV2aWNlaW5mbyIpOworICAgICAgICBleHRlbnNpb25OYW1lVG9FbnVtID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBleHRlbnNpb25OYW1lVG9FbnVtLnB1dChLRVlfVktfS0hSX1ZBUklBQkxFX1BPSU5URVJTLCBFTlVNX1ZLX0tIUl9WQVJJQUJMRV9QT0lOVEVSUyk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgY29sbGVjdERldmljZUluZm8oRGV2aWNlSW5mb1N0b3JlIHN0b3JlKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIEpTT05PYmplY3QgaW5zdGFuY2UgPSBuZXcgSlNPTk9iamVjdChuYXRpdmVHZXRWa0pTT04oKSk7CisgICAgICAgICAgICBlbWl0RGV2aWNlR3JvdXBzKHN0b3JlLCBpbnN0YW5jZSk7CiAgICAgICAgICAgICBlbWl0TGF5ZXJzKHN0b3JlLCBpbnN0YW5jZSk7CiAgICAgICAgICAgICBlbWl0RXh0ZW5zaW9ucyhzdG9yZSwgaW5zdGFuY2UpOwogICAgICAgICAgICAgZW1pdERldmljZXMoc3RvcmUsIGluc3RhbmNlKTsKQEAgLTI5Niw2ICszNTIsMjIgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZW1pdERldmljZUdyb3VwcyhEZXZpY2VJbmZvU3RvcmUgc3RvcmUsIEpTT05PYmplY3QgcGFyZW50KQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEpTT05BcnJheSBkZXZpY2VHcm91cHMgPSBwYXJlbnQuZ2V0SlNPTkFycmF5KEtFWV9ERVZJQ0VfR1JPVVBTKTsKKyAgICAgICAgc3RvcmUuc3RhcnRBcnJheShjb252ZXJ0TmFtZShLRVlfREVWSUNFX0dST1VQUykpOworICAgICAgICBmb3IgKGludCBkZXZpY2VHcm91cElkeCA9IDA7IGRldmljZUdyb3VwSWR4IDwgZGV2aWNlR3JvdXBzLmxlbmd0aCgpOyBkZXZpY2VHcm91cElkeCsrKSB7CisgICAgICAgICAgICBKU09OT2JqZWN0IGRldmljZUdyb3VwID0gZGV2aWNlR3JvdXBzLmdldEpTT05PYmplY3QoZGV2aWNlR3JvdXBJZHgpOworICAgICAgICAgICAgc3RvcmUuc3RhcnRHcm91cCgpOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVtaXRMb25nQXJyYXkoc3RvcmUsIGRldmljZUdyb3VwLCBLRVlfREVWSUNFUyk7CisgICAgICAgICAgICAgICAgZW1pdEJvb2xlYW4oc3RvcmUsIGRldmljZUdyb3VwLCBLRVlfU1VCU0VUX0FMTE9DQVRJT04pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RvcmUuZW5kR3JvdXAoKTsKKyAgICAgICAgfQorICAgICAgICBzdG9yZS5lbmRBcnJheSgpOworICAgIH0KKwogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZW1pdERldmljZXMoRGV2aWNlSW5mb1N0b3JlIHN0b3JlLCBKU09OT2JqZWN0IHBhcmVudCkKICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBKU09OQXJyYXkgZGV2aWNlcyA9IHBhcmVudC5nZXRKU09OQXJyYXkoS0VZX0RFVklDRVMpOwpAQCAtNTgzLDYgKzY1NSwxMzIgQEAKICAgICAgICAgICAgICAgICAgICAgc3RvcmUuZW5kR3JvdXAoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgc3RvcmUuZW5kQXJyYXkoKTsKKworICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzLmdldExvbmcoS0VZX0FQSV9WRVJTSU9OKSA+PSBWS19BUElfVkVSU0lPTl8xXzEpIHsKKyAgICAgICAgICAgICAgICAgICAgSlNPTk9iamVjdCBzdWJncm91cFByb3BlcnRpZXMgPSBkZXZpY2UuZ2V0SlNPTk9iamVjdChLRVlfU1VCR1JPVVBfUFJPUEVSVElFUyk7CisgICAgICAgICAgICAgICAgICAgIHN0b3JlLnN0YXJ0R3JvdXAoY29udmVydE5hbWUoS0VZX1NVQkdST1VQX1BST1BFUlRJRVMpKTsKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZW1pdExvbmcoc3RvcmUsIHN1Ymdyb3VwUHJvcGVydGllcywgS0VZX1NVQkdST1VQX1NJWkUpOworICAgICAgICAgICAgICAgICAgICAgICAgZW1pdExvbmcoc3RvcmUsIHN1Ymdyb3VwUHJvcGVydGllcywgS0VZX1NVUFBPUlRFRF9TVEFHRVMpOworICAgICAgICAgICAgICAgICAgICAgICAgZW1pdExvbmcoc3RvcmUsIHN1Ymdyb3VwUHJvcGVydGllcywgS0VZX1NVUFBPUlRFRF9PUEVSQVRJT05TKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRCb29sZWFuKHN0b3JlLCBzdWJncm91cFByb3BlcnRpZXMsIEtFWV9RVUFEX09QRVJBVElPTlNfSU5fQUxMX1NUQUdFUyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3RvcmUuZW5kR3JvdXAoKTsKKworICAgICAgICAgICAgICAgICAgICBKU09OT2JqZWN0IHBvaW50Q2xpcHBpbmdQcm9wZXJ0aWVzID0gZGV2aWNlLmdldEpTT05PYmplY3QoS0VZX1BPSU5UX0NMSVBQSU5HX1BST1BFUlRJRVMpOworICAgICAgICAgICAgICAgICAgICBzdG9yZS5zdGFydEdyb3VwKGNvbnZlcnROYW1lKEtFWV9QT0lOVF9DTElQUElOR19QUk9QRVJUSUVTKSk7CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRMb25nKHN0b3JlLCBwb2ludENsaXBwaW5nUHJvcGVydGllcywgS0VZX1BPSU5UX0NMSVBQSU5HX0JFSEFWSU9SKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzdG9yZS5lbmRHcm91cCgpOworCisgICAgICAgICAgICAgICAgICAgIEpTT05PYmplY3QgbXVsdGl2aWV3UHJvcGVydGllcyA9IGRldmljZS5nZXRKU09OT2JqZWN0KEtFWV9NVUxUSVZJRVdfUFJPUEVSVElFUyk7CisgICAgICAgICAgICAgICAgICAgIHN0b3JlLnN0YXJ0R3JvdXAoY29udmVydE5hbWUoS0VZX01VTFRJVklFV19QUk9QRVJUSUVTKSk7CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRMb25nKHN0b3JlLCBtdWx0aXZpZXdQcm9wZXJ0aWVzLCBLRVlfTUFYX01VTFRJVklFV19WSUVXX0NPVU5UKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRMb25nKHN0b3JlLCBtdWx0aXZpZXdQcm9wZXJ0aWVzLCBLRVlfTUFYX01VTFRJVklFV19JTlNUQU5DRV9JTkRFWCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3RvcmUuZW5kR3JvdXAoKTsKKworICAgICAgICAgICAgICAgICAgICBKU09OT2JqZWN0IGlkUHJvcGVydGllcyA9IGRldmljZS5nZXRKU09OT2JqZWN0KEtFWV9JRF9QUk9QRVJUSUVTKTsKKyAgICAgICAgICAgICAgICAgICAgc3RvcmUuc3RhcnRHcm91cChjb252ZXJ0TmFtZShLRVlfSURfUFJPUEVSVElFUykpOworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbWl0TG9uZ0FycmF5KHN0b3JlLCBpZFByb3BlcnRpZXMsIEtFWV9ERVZJQ0VfVVVJRCk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbWl0TG9uZ0FycmF5KHN0b3JlLCBpZFByb3BlcnRpZXMsIEtFWV9EUklWRVJfVVVJRCk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbWl0TG9uZ0FycmF5KHN0b3JlLCBpZFByb3BlcnRpZXMsIEtFWV9ERVZJQ0VfTFVJRCk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbWl0TG9uZyhzdG9yZSwgaWRQcm9wZXJ0aWVzLCBLRVlfREVWSUNFX05PREVfTUFTSyk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbWl0Qm9vbGVhbihzdG9yZSwgaWRQcm9wZXJ0aWVzLCBLRVlfREVWSUNFX0xVSURfVkFMSUQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN0b3JlLmVuZEdyb3VwKCk7CisKKyAgICAgICAgICAgICAgICAgICAgSlNPTk9iamVjdCBtYWludGVuYW5jZTNQcm9wZXJ0aWVzID0gZGV2aWNlLmdldEpTT05PYmplY3QoS0VZX01BSU5URU5BTkNFXzNfUFJPUEVSVElFUyk7CisgICAgICAgICAgICAgICAgICAgIHN0b3JlLnN0YXJ0R3JvdXAoY29udmVydE5hbWUoS0VZX01BSU5URU5BTkNFXzNfUFJPUEVSVElFUykpOworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbWl0TG9uZyhzdG9yZSwgbWFpbnRlbmFuY2UzUHJvcGVydGllcywgS0VZX01BWF9QRVJfU0VUX0RFU0NSSVBUT1JTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRTdHJpbmcoc3RvcmUsIG1haW50ZW5hbmNlM1Byb3BlcnRpZXMsIEtFWV9NQVhfTUVNT1JZX0FMTE9DQVRJT05fU0laRSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3RvcmUuZW5kR3JvdXAoKTsKKworICAgICAgICAgICAgICAgICAgICBKU09OT2JqZWN0IGJpdDE2U3RvcmFnZUZlYXR1cmVzID0gZGV2aWNlLmdldEpTT05PYmplY3QoS0VZXzE2QklUX1NUT1JBR0VfRkVBVFVSRVMpOworICAgICAgICAgICAgICAgICAgICBzdG9yZS5zdGFydEdyb3VwKGNvbnZlcnROYW1lKEtFWV8xNkJJVF9TVE9SQUdFX0ZFQVRVUkVTKSk7CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRCb29sZWFuKHN0b3JlLCBiaXQxNlN0b3JhZ2VGZWF0dXJlcywgS0VZX1NUT1JBR0VfQlVGRkVSXzE2QklUX0FDQ0VTUyk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbWl0Qm9vbGVhbihzdG9yZSwgYml0MTZTdG9yYWdlRmVhdHVyZXMsIEtFWV9VTklGT1JNX0FORF9TVE9SQUdFX0JVRkZFUl8xNkJJVF9BQ0NFU1MpOworICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEJvb2xlYW4oc3RvcmUsIGJpdDE2U3RvcmFnZUZlYXR1cmVzLCBLRVlfU1RPUkFHRV9QVVNIX0NPTlNUQU5UXzE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRCb29sZWFuKHN0b3JlLCBiaXQxNlN0b3JhZ2VGZWF0dXJlcywgS0VZX1NUT1JBR0VfSU5QVVRfT1VUUFVUXzE2KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzdG9yZS5lbmRHcm91cCgpOworCisgICAgICAgICAgICAgICAgICAgIEpTT05PYmplY3QgbXVsdGl2aWV3RmVhdHVyZXMgPSBkZXZpY2UuZ2V0SlNPTk9iamVjdChLRVlfTVVMVElWSUVXX0ZFQVRVUkVTKTsKKyAgICAgICAgICAgICAgICAgICAgc3RvcmUuc3RhcnRHcm91cChjb252ZXJ0TmFtZShLRVlfTVVMVElWSUVXX0ZFQVRVUkVTKSk7CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRCb29sZWFuKHN0b3JlLCBtdWx0aXZpZXdGZWF0dXJlcywgS0VZX01VTFRJVklFVyk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbWl0Qm9vbGVhbihzdG9yZSwgbXVsdGl2aWV3RmVhdHVyZXMsIEtFWV9NVUxUSVZJRVdfR0VPTUVUUllfU0hBREVSKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRCb29sZWFuKHN0b3JlLCBtdWx0aXZpZXdGZWF0dXJlcywgS0VZX01VTFRJVklFV19URVNTRUxMQVRJT05fU0hBREVSKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzdG9yZS5lbmRHcm91cCgpOworCisgICAgICAgICAgICAgICAgICAgIEpTT05PYmplY3QgdmFyaWFibGVQb2ludGVyRmVhdHVyZXMgPSBkZXZpY2UuZ2V0SlNPTk9iamVjdChLRVlfVkFSSUFCTEVfUE9JTlRFUl9GRUFUVVJFUyk7CisgICAgICAgICAgICAgICAgICAgIHN0b3JlLnN0YXJ0R3JvdXAoY29udmVydE5hbWUoS0VZX1ZBUklBQkxFX1BPSU5URVJfRkVBVFVSRVMpKTsKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEJvb2xlYW4oc3RvcmUsIHZhcmlhYmxlUG9pbnRlckZlYXR1cmVzLCBLRVlfVkFSSUFCTEVfUE9JTlRFUlNfU1RPUkFHRV9CVUZGRVIpOworICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEJvb2xlYW4oc3RvcmUsIHZhcmlhYmxlUG9pbnRlckZlYXR1cmVzLCBLRVlfVkFSSUFCTEVfUE9JTlRFUlMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN0b3JlLmVuZEdyb3VwKCk7CisKKyAgICAgICAgICAgICAgICAgICAgSlNPTk9iamVjdCBwcm90ZWN0ZWRNZW1vcnlGZWF0dXJlcyA9IGRldmljZS5nZXRKU09OT2JqZWN0KEtFWV9QUk9URUNURURfTUVNT1JZX0ZFQVRVUkVTKTsKKyAgICAgICAgICAgICAgICAgICAgc3RvcmUuc3RhcnRHcm91cChjb252ZXJ0TmFtZShLRVlfUFJPVEVDVEVEX01FTU9SWV9GRUFUVVJFUykpOworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbWl0Qm9vbGVhbihzdG9yZSwgcHJvdGVjdGVkTWVtb3J5RmVhdHVyZXMsIEtFWV9QUk9URUNURURfTUVNT1JZKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzdG9yZS5lbmRHcm91cCgpOworCisgICAgICAgICAgICAgICAgICAgIEpTT05PYmplY3Qgc2FtcGxlclljYmNyQ29udmVyc2lvbkZlYXR1cmVzID0gZGV2aWNlLmdldEpTT05PYmplY3QoS0VZX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9GRUFUVVJFUyk7CisgICAgICAgICAgICAgICAgICAgIHN0b3JlLnN0YXJ0R3JvdXAoY29udmVydE5hbWUoS0VZX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTl9GRUFUVVJFUykpOworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbWl0Qm9vbGVhbihzdG9yZSwgc2FtcGxlclljYmNyQ29udmVyc2lvbkZlYXR1cmVzLCBLRVlfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzdG9yZS5lbmRHcm91cCgpOworCisgICAgICAgICAgICAgICAgICAgIEpTT05PYmplY3Qgc2hhZGVyRHJhd1BhcmFtZXRlckZlYXR1cmVzID0gZGV2aWNlLmdldEpTT05PYmplY3QoS0VZX1NIQURFUl9EUkFXX1BBUkFNRVRFUl9GRUFUVVJFUyk7CisgICAgICAgICAgICAgICAgICAgIHN0b3JlLnN0YXJ0R3JvdXAoY29udmVydE5hbWUoS0VZX1NIQURFUl9EUkFXX1BBUkFNRVRFUl9GRUFUVVJFUykpOworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbWl0Qm9vbGVhbihzdG9yZSwgc2hhZGVyRHJhd1BhcmFtZXRlckZlYXR1cmVzLCBLRVlfU0hBREVSX0RSQVdfUEFSQU1FVEVSUyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3RvcmUuZW5kR3JvdXAoKTsKKworICAgICAgICAgICAgICAgICAgICBKU09OQXJyYXkgZXh0ZXJuYWxGZW5jZXMgPSBkZXZpY2UuZ2V0SlNPTkFycmF5KEtFWV9FWFRFUk5BTF9GRU5DRV9QUk9QRVJUSUVTKTsKKyAgICAgICAgICAgICAgICAgICAgc3RvcmUuc3RhcnRBcnJheShjb252ZXJ0TmFtZShLRVlfRVhURVJOQUxfRkVOQ0VfUFJPUEVSVElFUykpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpZHggPSAwOyBpZHggPCBleHRlcm5hbEZlbmNlcy5sZW5ndGgoKTsgKytpZHgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEpTT05BcnJheSBleHRlcm5hbEZlbmNlUGFpciA9IGV4dGVybmFsRmVuY2VzLmdldEpTT05BcnJheShpZHgpOworICAgICAgICAgICAgICAgICAgICAgICAgSlNPTk9iamVjdCBleHRlcm5hbEZlbmNlUHJvcGVydGllcyA9IGV4dGVybmFsRmVuY2VQYWlyLmdldEpTT05PYmplY3QoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZS5zdGFydEdyb3VwKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmUuYWRkUmVzdWx0KCJoYW5kbGVfdHlwZSIsIGV4dGVybmFsRmVuY2VQYWlyLmdldExvbmcoMCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRMb25nKHN0b3JlLCBleHRlcm5hbEZlbmNlUHJvcGVydGllcywgS0VZX0VYUE9SVF9GUk9NX0lNUE9SVEVEX0hBTkRMRV9UWVBFUyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdExvbmcoc3RvcmUsIGV4dGVybmFsRmVuY2VQcm9wZXJ0aWVzLCBLRVlfQ09NUEFUSUJMRV9IQU5ETEVfVFlQRVMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRMb25nKHN0b3JlLCBleHRlcm5hbEZlbmNlUHJvcGVydGllcywgS0VZX0VYVEVSTkFMX0ZFTkNFX0ZFQVRVUkVTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlLmVuZEdyb3VwKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3RvcmUuZW5kQXJyYXkoKTsKKworICAgICAgICAgICAgICAgICAgICBKU09OQXJyYXkgZXh0ZXJuYWxTZW1hcGhvcmVzID0gZGV2aWNlLmdldEpTT05BcnJheShLRVlfRVhURVJOQUxfU0VNQVBIT1JFX1BST1BFUlRJRVMpOworICAgICAgICAgICAgICAgICAgICBzdG9yZS5zdGFydEFycmF5KGNvbnZlcnROYW1lKEtFWV9FWFRFUk5BTF9TRU1BUEhPUkVfUFJPUEVSVElFUykpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpZHggPSAwOyBpZHggPCBleHRlcm5hbFNlbWFwaG9yZXMubGVuZ3RoKCk7ICsraWR4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBKU09OQXJyYXkgZXh0ZXJuYWxTZW1hcGhvcmVQYWlyID0gZXh0ZXJuYWxTZW1hcGhvcmVzLmdldEpTT05BcnJheShpZHgpOworICAgICAgICAgICAgICAgICAgICAgICAgSlNPTk9iamVjdCBleHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMgPSBleHRlcm5hbFNlbWFwaG9yZVBhaXIuZ2V0SlNPTk9iamVjdCgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlLnN0YXJ0R3JvdXAoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZS5hZGRSZXN1bHQoImhhbmRsZV90eXBlIiwgZXh0ZXJuYWxTZW1hcGhvcmVQYWlyLmdldExvbmcoMCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRMb25nKHN0b3JlLCBleHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMsIEtFWV9FWFBPUlRfRlJPTV9JTVBPUlRFRF9IQU5ETEVfVFlQRVMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRMb25nKHN0b3JlLCBleHRlcm5hbFNlbWFwaG9yZVByb3BlcnRpZXMsIEtFWV9DT01QQVRJQkxFX0hBTkRMRV9UWVBFUyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdExvbmcoc3RvcmUsIGV4dGVybmFsU2VtYXBob3JlUHJvcGVydGllcywgS0VZX0VYVEVSTkFMX1NFTUFQSE9SRV9GRUFUVVJFUyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZS5lbmRHcm91cCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN0b3JlLmVuZEFycmF5KCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3RvcmUuZW5kR3JvdXAoKTsKICAgICAgICAgfQpAQCAtNjEzLDYgKzgxMSw0MCBAQAogICAgICAgICBzdG9yZS5lbmRBcnJheSgpOwogICAgIH0KIAorICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZW1pdFZhcmlhYmxlUG9pbnRlckZlYXR1cmVzS0hSKERldmljZUluZm9TdG9yZSBzdG9yZSwgSlNPTk9iamVjdCBwYXJlbnQpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEpTT05PYmplY3QgZXh0VmFyaWFibGVQb2ludGVyRmVhdHVyZXMgPSBwYXJlbnQuZ2V0SlNPTk9iamVjdChLRVlfVktfS0hSX1ZBUklBQkxFX1BPSU5URVJTKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc3RvcmUuc3RhcnRHcm91cChjb252ZXJ0TmFtZShLRVlfVktfS0hSX1ZBUklBQkxFX1BPSU5URVJTKSk7CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBKU09OT2JqZWN0IHZhcmlhYmxlUG9pbnRlckZlYXR1cmVzS0hSID0gZXh0VmFyaWFibGVQb2ludGVyRmVhdHVyZXMuZ2V0SlNPTk9iamVjdChLRVlfVkFSSUFCTEVfUE9JTlRFUl9GRUFUVVJFU19LSFIpOworICAgICAgICAgICAgICAgICAgICBzdG9yZS5zdGFydEdyb3VwKGNvbnZlcnROYW1lKEtFWV9WQVJJQUJMRV9QT0lOVEVSX0ZFQVRVUkVTX0tIUikpOworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbWl0Qm9vbGVhbihzdG9yZSwgdmFyaWFibGVQb2ludGVyRmVhdHVyZXNLSFIsIEtFWV9WQVJJQUJMRV9QT0lOVEVSU19TVE9SQUdFX0JVRkZFUik7CisgICAgICAgICAgICAgICAgICAgICAgICBlbWl0Qm9vbGVhbihzdG9yZSwgdmFyaWFibGVQb2ludGVyRmVhdHVyZXNLSFIsIEtFWV9WQVJJQUJMRV9QT0lOVEVSUyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3RvcmUuZW5kR3JvdXAoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RvcmUuZW5kR3JvdXAoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEpTT05FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEpTT05FeGNlcHRpb24gaWdub3JlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBlbWl0RXh0ZW5zaW9uKFN0cmluZyBrZXksIERldmljZUluZm9TdG9yZSBzdG9yZSwgSlNPTk9iamVjdCBwYXJlbnQpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFleHRlbnNpb25OYW1lVG9FbnVtLmNvbnRhaW5zS2V5KGtleSkpIHJldHVybjsKKyAgICAgICAgc3dpdGNoIChleHRlbnNpb25OYW1lVG9FbnVtLmdldChrZXkpKSB7CisgICAgICAgICAgICBjYXNlIEVOVU1fVktfS0hSX1ZBUklBQkxFX1BPSU5URVJTOgorICAgICAgICAgICAgICBlbWl0VmFyaWFibGVQb2ludGVyRmVhdHVyZXNLSFIoc3RvcmUsIHBhcmVudCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBlbWl0RXh0ZW5zaW9ucyhEZXZpY2VJbmZvU3RvcmUgc3RvcmUsIEpTT05PYmplY3QgcGFyZW50KQogICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEpTT05BcnJheSBleHRlbnNpb25zID0gcGFyZW50LmdldEpTT05BcnJheShLRVlfRVhURU5TSU9OUyk7CkBAIC02MjcsNiArODU5LDEyIEBACiAgICAgICAgICAgICBzdG9yZS5lbmRHcm91cCgpOwogICAgICAgICB9CiAgICAgICAgIHN0b3JlLmVuZEFycmF5KCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgIEpTT05PYmplY3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXRKU09OT2JqZWN0KGkpOworICAgICAgICAgICAgU3RyaW5nIGtleSA9IGV4dGVuc2lvbi5nZXRTdHJpbmcoS0VZX0VYVEVOU0lPTl9OQU1FKTsKKyAgICAgICAgICAgIGVtaXRFeHRlbnNpb24oa2V5LCBzdG9yZSwgcGFyZW50KTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZW1pdEJvb2xlYW4oRGV2aWNlSW5mb1N0b3JlIHN0b3JlLCBKU09OT2JqZWN0IHBhcmVudCwgU3RyaW5nIG5hbWUpCkBAIC02NzMsMjUgKzkxMSwzOCBAQAogICAgICAgICAvLyBUaGlzIHRyYW5zbGF0aW9uIGNvdWxkIGJlIGRvbmUgYWxnb3JpdGhtaWNhbGx5LCBidXQgaW4gdGhpcyBjYXNlIGJlaW5nIGFibGUgdG8KICAgICAgICAgLy8gY29kZS1zZWFyY2ggZm9yIGJvdGggdGhlIG9yaWdpbmFsIGFuZCBjb252ZXJ0ZWQgbmFtZXMgaXMgbW9yZSBpbXBvcnRhbnQuCiAgICAgICAgIHN3aXRjaCAobmFtZSkgeworICAgICAgICAgICAgY2FzZSBLRVlfMTZCSVRfU1RPUkFHRV9GRUFUVVJFUzogcmV0dXJuICJiaXQxNl9zdG9yYWdlX2ZlYXR1cmVzIjsKICAgICAgICAgICAgIGNhc2UgS0VZX0FMUEhBX1RPX09ORTogcmV0dXJuICJhbHBoYV90b19vbmUiOwogICAgICAgICAgICAgY2FzZSBLRVlfQVBJX1ZFUlNJT046IHJldHVybiAiYXBpX3ZlcnNpb24iOwogICAgICAgICAgICAgY2FzZSBLRVlfQlVGRkVSX0ZFQVRVUkVTOiByZXR1cm4gImJ1ZmZlcl9mZWF0dXJlcyI7CiAgICAgICAgICAgICBjYXNlIEtFWV9CVUZGRVJfSU1BR0VfR1JBTlVMQVJJVFk6IHJldHVybiAiYnVmZmVyX2ltYWdlX2dyYW51bGFyaXR5IjsKKyAgICAgICAgICAgIGNhc2UgS0VZX0NPTVBBVElCTEVfSEFORExFX1RZUEVTOiByZXR1cm4gImNvbXBhdGlibGVfaGFuZGxlX3R5cGVzIjsKICAgICAgICAgICAgIGNhc2UgS0VZX0RFUFRIOiByZXR1cm4gImRlcHRoIjsKICAgICAgICAgICAgIGNhc2UgS0VZX0RFUFRIX0JJQVNfQ0xBTVA6IHJldHVybiAiZGVwdGhfYmlhc19jbGFtcCI7CiAgICAgICAgICAgICBjYXNlIEtFWV9ERVBUSF9CT1VORFM6IHJldHVybiAiZGVwdGhfYm91bmRzIjsKICAgICAgICAgICAgIGNhc2UgS0VZX0RFUFRIX0NMQU1QOiByZXR1cm4gImRlcHRoX2NsYW1wIjsKICAgICAgICAgICAgIGNhc2UgS0VZX0RFU0NSSVBUSU9OOiByZXR1cm4gImRlc2NyaXB0aW9uIjsKKyAgICAgICAgICAgIGNhc2UgS0VZX0RFVklDRV9HUk9VUFM6IHJldHVybiAiZGV2aWNlX2dyb3VwcyI7CiAgICAgICAgICAgICBjYXNlIEtFWV9ERVZJQ0VfSUQ6IHJldHVybiAiZGV2aWNlX2lkIjsKKyAgICAgICAgICAgIGNhc2UgS0VZX0RFVklDRV9MVUlEOiByZXR1cm4gImRldmljZV9sdWlkIjsKKyAgICAgICAgICAgIGNhc2UgS0VZX0RFVklDRV9MVUlEX1ZBTElEOiByZXR1cm4gImRldmljZV9sdWlkX3ZhbGlkIjsKKyAgICAgICAgICAgIGNhc2UgS0VZX0RFVklDRV9OT0RFX01BU0s6IHJldHVybiAiZGV2aWNlX25vZGVfbWFzayI7CiAgICAgICAgICAgICBjYXNlIEtFWV9ERVZJQ0VfTkFNRTogcmV0dXJuICJkZXZpY2VfbmFtZSI7CiAgICAgICAgICAgICBjYXNlIEtFWV9ERVZJQ0VfVFlQRTogcmV0dXJuICJkZXZpY2VfdHlwZSI7CisgICAgICAgICAgICBjYXNlIEtFWV9ERVZJQ0VfVVVJRDogcmV0dXJuICJkZXZpY2VfdXVpZCI7CiAgICAgICAgICAgICBjYXNlIEtFWV9ERVZJQ0VTOiByZXR1cm4gImRldmljZXMiOwogICAgICAgICAgICAgY2FzZSBLRVlfRElTQ1JFVEVfUVVFVUVfUFJJT1JJVElFUzogcmV0dXJuICJkaXNjcmV0ZV9xdWV1ZV9wcmlvcml0aWVzIjsKICAgICAgICAgICAgIGNhc2UgS0VZX0RSQVdfSU5ESVJFQ1RfRklSU1RfSU5TVEFOQ0U6IHJldHVybiAiZHJhd19pbmRpcmVjdF9maXJzdF9pbnN0YW5jZSI7CiAgICAgICAgICAgICBjYXNlIEtFWV9EUklWRVJfVkVSU0lPTjogcmV0dXJuICJkcml2ZXJfdmVyc2lvbiI7CisgICAgICAgICAgICBjYXNlIEtFWV9EUklWRVJfVVVJRDogcmV0dXJuICJkcml2ZXJfdXVpZCI7CiAgICAgICAgICAgICBjYXNlIEtFWV9EVUFMX1NSQ19CTEVORDogcmV0dXJuICJkdWFsX3NyY19ibGVuZCI7CisgICAgICAgICAgICBjYXNlIEtFWV9FWFBPUlRfRlJPTV9JTVBPUlRFRF9IQU5ETEVfVFlQRVM6IHJldHVybiAiZXhwb3J0X2Zyb21faW1wb3J0ZWRfaGFuZGxlX3R5cGVzIjsKICAgICAgICAgICAgIGNhc2UgS0VZX0VYVEVOU0lPTl9OQU1FOiByZXR1cm4gImV4dGVuc2lvbl9uYW1lIjsKICAgICAgICAgICAgIGNhc2UgS0VZX0VYVEVOU0lPTlM6IHJldHVybiAiZXh0ZW5zaW9ucyI7CisgICAgICAgICAgICBjYXNlIEtFWV9FWFRFUk5BTF9GRU5DRV9GRUFUVVJFUzogcmV0dXJuICJleHRlcm5hbF9mZW5jZV9mZWF0dXJlcyI7CisgICAgICAgICAgICBjYXNlIEtFWV9FWFRFUk5BTF9GRU5DRV9QUk9QRVJUSUVTOiByZXR1cm4gImV4dGVybmFsX2ZlbmNlX3Byb3BlcnRpZXMiOworICAgICAgICAgICAgY2FzZSBLRVlfRVhURVJOQUxfU0VNQVBIT1JFX0ZFQVRVUkVTOiByZXR1cm4gImV4dGVybmFsX3NlbWFwaG9yZV9mZWF0dXJlcyI7CisgICAgICAgICAgICBjYXNlIEtFWV9FWFRFUk5BTF9TRU1BUEhPUkVfUFJPUEVSVElFUzogcmV0dXJuICJleHRlcm5hbF9zZW1hcGhvcmVfcHJvcGVydGllcyI7CiAgICAgICAgICAgICBjYXNlIEtFWV9GRUFUVVJFUzogcmV0dXJuICJmZWF0dXJlcyI7CiAgICAgICAgICAgICBjYXNlIEtFWV9GSUxMX01PREVfTk9OX1NPTElEOiByZXR1cm4gImZpbGxfbW9kZV9ub25fc29saWQiOwogICAgICAgICAgICAgY2FzZSBLRVlfRkxBR1M6IHJldHVybiAiZmxhZ3MiOwpAQCAtNzA1LDYgKzk1Niw3IEBACiAgICAgICAgICAgICBjYXNlIEtFWV9HRU9NRVRSWV9TSEFERVI6IHJldHVybiAiZ2VvbWV0cnlfc2hhZGVyIjsKICAgICAgICAgICAgIGNhc2UgS0VZX0hFQVBfSU5ERVg6IHJldHVybiAiaGVhcF9pbmRleCI7CiAgICAgICAgICAgICBjYXNlIEtFWV9IRUlHSFQ6IHJldHVybiAiaGVpZ2h0IjsKKyAgICAgICAgICAgIGNhc2UgS0VZX0lEX1BST1BFUlRJRVM6IHJldHVybiAiaWRfcHJvcGVydGllcyI7CiAgICAgICAgICAgICBjYXNlIEtFWV9JTUFHRV9DVUJFX0FSUkFZOiByZXR1cm4gImltYWdlX2N1YmVfYXJyYXkiOwogICAgICAgICAgICAgY2FzZSBLRVlfSU1QTEVNRU5UQVRJT05fVkVSU0lPTjogcmV0dXJuICJpbXBsZW1lbnRhdGlvbl92ZXJzaW9uIjsKICAgICAgICAgICAgIGNhc2UgS0VZX0lOREVQRU5ERU5UX0JMRU5EOiByZXR1cm4gImluZGVwZW5kZW50X2JsZW5kIjsKQEAgLTcxNyw2ICs5NjksNyBAQAogICAgICAgICAgICAgY2FzZSBLRVlfTElORV9XSURUSF9SQU5HRTogcmV0dXJuICJsaW5lX3dpZHRoX3JhbmdlIjsKICAgICAgICAgICAgIGNhc2UgS0VZX0xJTkVBUl9USUxJTkdfRkVBVFVSRVM6IHJldHVybiAibGluZWFyX3RpbGluZ19mZWF0dXJlcyI7CiAgICAgICAgICAgICBjYXNlIEtFWV9MT0dJQ19PUDogcmV0dXJuICJsb2dpY19vcCI7CisgICAgICAgICAgICBjYXNlIEtFWV9NQUlOVEVOQU5DRV8zX1BST1BFUlRJRVM6IHJldHVybiAibWFpbnRlbmFuY2VfM19wcm9wZXJ0aWVzIjsKICAgICAgICAgICAgIGNhc2UgS0VZX01BWF9CT1VORF9ERVNDUklQVE9SX1NFVFM6IHJldHVybiAibWF4X2JvdW5kX2Rlc2NyaXB0b3Jfc2V0cyI7CiAgICAgICAgICAgICBjYXNlIEtFWV9NQVhfQ0xJUF9ESVNUQU5DRVM6IHJldHVybiAibWF4X2NsaXBfZGlzdGFuY2VzIjsKICAgICAgICAgICAgIGNhc2UgS0VZX01BWF9DT0xPUl9BVFRBQ0hNRU5UUzogcmV0dXJuICJtYXhfY29sb3JfYXR0YWNobWVudHMiOwpAQCAtNzU1LDYgKzEwMDgsMTAgQEAKICAgICAgICAgICAgIGNhc2UgS0VZX01BWF9JTUFHRV9ESU1FTlNJT05fQ1VCRTogcmV0dXJuICJtYXhfaW1hZ2VfZGltZW5zaW9uX2N1YmUiOwogICAgICAgICAgICAgY2FzZSBLRVlfTUFYX0lOVEVSUE9MQVRJT05fT0ZGU0VUOiByZXR1cm4gIm1heF9pbnRlcnBvbGF0aW9uX29mZnNldCI7CiAgICAgICAgICAgICBjYXNlIEtFWV9NQVhfTUVNT1JZX0FMTE9DQVRJT05fQ09VTlQ6IHJldHVybiAibWF4X21lbW9yeV9hbGxvY2F0aW9uX2NvdW50IjsKKyAgICAgICAgICAgIGNhc2UgS0VZX01BWF9NRU1PUllfQUxMT0NBVElPTl9TSVpFOiByZXR1cm4gIm1heF9tZW1vcnlfYWxsb2NhdGlvbl9zaXplIjsKKyAgICAgICAgICAgIGNhc2UgS0VZX01BWF9NVUxUSVZJRVdfVklFV19DT1VOVDogcmV0dXJuICJtYXhfbXVsdGl2aWV3X3ZpZXdfY291bnQiOworICAgICAgICAgICAgY2FzZSBLRVlfTUFYX01VTFRJVklFV19JTlNUQU5DRV9JTkRFWDogcmV0dXJuICJtYXhfbXVsdGl2aWV3X2luc3RhbmNlX2luZGV4IjsKKyAgICAgICAgICAgIGNhc2UgS0VZX01BWF9QRVJfU0VUX0RFU0NSSVBUT1JTOiByZXR1cm4gIm1heF9wZXJfc2V0X2Rlc2NyaXB0b3JzIjsKICAgICAgICAgICAgIGNhc2UgS0VZX01BWF9QRVJfU1RBR0VfREVTQ1JJUFRPUl9JTlBVVF9BVFRBQ0hNRU5UUzogcmV0dXJuICJtYXhfcGVyX3N0YWdlX2Rlc2NyaXB0b3JfaW5wdXRfYXR0YWNobWVudHMiOwogICAgICAgICAgICAgY2FzZSBLRVlfTUFYX1BFUl9TVEFHRV9ERVNDUklQVE9SX1NBTVBMRURfSU1BR0VTOiByZXR1cm4gIm1heF9wZXJfc3RhZ2VfZGVzY3JpcHRvcl9zYW1wbGVkX2ltYWdlcyI7CiAgICAgICAgICAgICBjYXNlIEtFWV9NQVhfUEVSX1NUQUdFX0RFU0NSSVBUT1JfU0FNUExFUlM6IHJldHVybiAibWF4X3Blcl9zdGFnZV9kZXNjcmlwdG9yX3NhbXBsZXJzIjsKQEAgLTgwMyw2ICsxMDYwLDExIEBACiAgICAgICAgICAgICBjYXNlIEtFWV9NSVBNQVBfUFJFQ0lTSU9OX0JJVFM6IHJldHVybiAibWlwbWFwX3ByZWNpc2lvbl9iaXRzIjsKICAgICAgICAgICAgIGNhc2UgS0VZX01VTFRJX0RSQVdfSU5ESVJFQ1Q6IHJldHVybiAibXVsdGlfZHJhd19pbmRpcmVjdCI7CiAgICAgICAgICAgICBjYXNlIEtFWV9NVUxUSV9WSUVXUE9SVDogcmV0dXJuICJtdWx0aV92aWV3cG9ydCI7CisgICAgICAgICAgICBjYXNlIEtFWV9NVUxUSVZJRVc6IHJldHVybiAibXVsdGl2aWV3IjsKKyAgICAgICAgICAgIGNhc2UgS0VZX01VTFRJVklFV19GRUFUVVJFUzogcmV0dXJuICJtdWx0aXZpZXdfZmVhdHVyZXMiOworICAgICAgICAgICAgY2FzZSBLRVlfTVVMVElWSUVXX0dFT01FVFJZX1NIQURFUjogcmV0dXJuICJtdWx0aXZpZXdfZ2VvbWV0cnlfc2hhZGVyIjsKKyAgICAgICAgICAgIGNhc2UgS0VZX01VTFRJVklFV19QUk9QRVJUSUVTOiByZXR1cm4gIm11bHRpdmlld19wcm9wZXJ0aWVzIjsKKyAgICAgICAgICAgIGNhc2UgS0VZX01VTFRJVklFV19URVNTRUxMQVRJT05fU0hBREVSOiByZXR1cm4gIm11bHRpdmlld190ZXNzZWxsYXRpb25fc2hhZGVyIjsKICAgICAgICAgICAgIGNhc2UgS0VZX05PTl9DT0hFUkVOVF9BVE9NX1NJWkU6IHJldHVybiAibm9uX2NvaGVyZW50X2F0b21fc2l6ZSI7CiAgICAgICAgICAgICBjYXNlIEtFWV9PQ0NMVVNJT05fUVVFUllfUFJFQ0lTRTogcmV0dXJuICJvY2NsdXNpb25fcXVlcnlfcHJlY2lzZSI7CiAgICAgICAgICAgICBjYXNlIEtFWV9PUFRJTUFMX0JVRkZFUl9DT1BZX09GRlNFVF9BTElHTk1FTlQ6IHJldHVybiAib3B0aW1hbF9idWZmZXJfY29weV9vZmZzZXRfYWxpZ25tZW50IjsKQEAgLTgxMCwxMCArMTA3MiwxNSBAQAogICAgICAgICAgICAgY2FzZSBLRVlfT1BUSU1BTF9USUxJTkdfRkVBVFVSRVM6IHJldHVybiAib3B0aW1hbF90aWxpbmdfZmVhdHVyZXMiOwogICAgICAgICAgICAgY2FzZSBLRVlfUElQRUxJTkVfQ0FDSEVfVVVJRDogcmV0dXJuICJwaXBlbGluZV9jYWNoZV91dWlkIjsKICAgICAgICAgICAgIGNhc2UgS0VZX1BJUEVMSU5FX1NUQVRJU1RJQ1NfUVVFUlk6IHJldHVybiAicGlwZWxpbmVfc3RhdGlzdGljc19xdWVyeSI7CisgICAgICAgICAgICBjYXNlIEtFWV9QT0lOVF9DTElQUElOR19CRUhBVklPUjogcmV0dXJuICJwb2ludF9jbGlwcGluZ19iZWhhdmlvciI7CisgICAgICAgICAgICBjYXNlIEtFWV9QT0lOVF9DTElQUElOR19QUk9QRVJUSUVTOiByZXR1cm4gInBvaW50X2NsaXBwaW5nX3Byb3BlcnRpZXMiOwogICAgICAgICAgICAgY2FzZSBLRVlfUE9JTlRfU0laRV9HUkFOVUxBUklUWTogcmV0dXJuICJwb2ludF9zaXplX2dyYW51bGFyaXR5IjsKICAgICAgICAgICAgIGNhc2UgS0VZX1BPSU5UX1NJWkVfUkFOR0U6IHJldHVybiAicG9pbnRfc2l6ZV9yYW5nZSI7CiAgICAgICAgICAgICBjYXNlIEtFWV9QUk9QRVJUSUVTOiByZXR1cm4gInByb3BlcnRpZXMiOwogICAgICAgICAgICAgY2FzZSBLRVlfUFJPUEVSVFlfRkxBR1M6IHJldHVybiAicHJvcGVydHlfZmxhZ3MiOworICAgICAgICAgICAgY2FzZSBLRVlfUFJPVEVDVEVEX01FTU9SWTogcmV0dXJuICJwcm90ZWN0ZWRfbWVtb3J5IjsKKyAgICAgICAgICAgIGNhc2UgS0VZX1BST1RFQ1RFRF9NRU1PUllfRkVBVFVSRVM6IHJldHVybiAicHJvdGVjdGVkX21lbW9yeV9mZWF0dXJlcyI7CisgICAgICAgICAgICBjYXNlIEtFWV9RVUFEX09QRVJBVElPTlNfSU5fQUxMX1NUQUdFUzogcmV0dXJuICJxdWFkX29wZXJhdGlvbnNfaW5fYWxsX3N0YWdlcyI7CiAgICAgICAgICAgICBjYXNlIEtFWV9RVUVVRV9DT1VOVDogcmV0dXJuICJxdWV1ZV9jb3VudCI7CiAgICAgICAgICAgICBjYXNlIEtFWV9RVUVVRV9GTEFHUzogcmV0dXJuICJxdWV1ZV9mbGFncyI7CiAgICAgICAgICAgICBjYXNlIEtFWV9RVUVVRVM6IHJldHVybiAicXVldWVzIjsKQEAgLTgyOSw4ICsxMDk2LDEyIEBACiAgICAgICAgICAgICBjYXNlIEtFWV9TQU1QTEVEX0lNQUdFX0lOVEVHRVJfU0FNUExFX0NPVU5UUzogcmV0dXJuICJzYW1wbGVkX2ltYWdlX2ludGVnZXJfc2FtcGxlX2NvdW50cyI7CiAgICAgICAgICAgICBjYXNlIEtFWV9TQU1QTEVEX0lNQUdFX1NURU5DSUxfU0FNUExFX0NPVU5UUzogcmV0dXJuICJzYW1wbGVkX2ltYWdlX3N0ZW5jaWxfc2FtcGxlX2NvdW50cyI7CiAgICAgICAgICAgICBjYXNlIEtFWV9TQU1QTEVSX0FOSVNPVFJPUFk6IHJldHVybiAic2FtcGxlcl9hbmlzb3Ryb3B5IjsKKyAgICAgICAgICAgIGNhc2UgS0VZX1NBTVBMRVJfWUNCQ1JfQ09OVkVSU0lPTjogcmV0dXJuICJzYW1wbGVyX3ljYmNyX2NvbnZlcnNpb24iOworICAgICAgICAgICAgY2FzZSBLRVlfU0FNUExFUl9ZQ0JDUl9DT05WRVJTSU9OX0ZFQVRVUkVTOiByZXR1cm4gInNhbXBsZXJfeWNiY3JfY29udmVyc2lvbl9mZWF0dXJlcyI7CiAgICAgICAgICAgICBjYXNlIEtFWV9TSEFERVJfQ0xJUF9ESVNUQU5DRTogcmV0dXJuICJzaGFkZXJfY2xpcF9kaXN0YW5jZSI7CiAgICAgICAgICAgICBjYXNlIEtFWV9TSEFERVJfQ1VMTF9ESVNUQU5DRTogcmV0dXJuICJzaGFkZXJfY3VsbF9kaXN0YW5jZSI7CisgICAgICAgICAgICBjYXNlIEtFWV9TSEFERVJfRFJBV19QQVJBTUVURVJfRkVBVFVSRVM6IHJldHVybiAic2hhZGVyX2RyYXdfcGFyYW1ldGVyX2ZlYXR1cmVzIjsKKyAgICAgICAgICAgIGNhc2UgS0VZX1NIQURFUl9EUkFXX1BBUkFNRVRFUlM6IHJldHVybiAic2hhZGVyX2RyYXdfcGFyYW1ldGVycyI7CiAgICAgICAgICAgICBjYXNlIEtFWV9TSEFERVJfRkxPQVQ2NDogcmV0dXJuICJzaGFkZXJfZmxvYXQ2NCI7CiAgICAgICAgICAgICBjYXNlIEtFWV9TSEFERVJfSU1BR0VfR0FUSEVSX0VYVEVOREVEOiByZXR1cm4gInNoYWRlcl9pbWFnZV9nYXRoZXJfZXh0ZW5kZWQiOwogICAgICAgICAgICAgY2FzZSBLRVlfU0hBREVSX0lOVDE2OiByZXR1cm4gInNoYWRlcl9pbnQxNiI7CkBAIC04NjAsMTEgKzExMzEsMTkgQEAKICAgICAgICAgICAgIGNhc2UgS0VZX1NQQVJTRV9SRVNJREVOQ1lfSU1BR0VfM0Q6IHJldHVybiAic3BhcnNlX3Jlc2lkZW5jeV9pbWFnZV8zZCI7CiAgICAgICAgICAgICBjYXNlIEtFWV9TUEVDX1ZFUlNJT046IHJldHVybiAic3BlY192ZXJzaW9uIjsKICAgICAgICAgICAgIGNhc2UgS0VZX1NUQU5EQVJEX1NBTVBMRV9MT0NBVElPTlM6IHJldHVybiAic3RhbmRhcmRfc2FtcGxlX2xvY2F0aW9ucyI7CisgICAgICAgICAgICBjYXNlIEtFWV9TVE9SQUdFX0JVRkZFUl8xNkJJVF9BQ0NFU1M6IHJldHVybiAic3RvcmFnZV9idWZmZXJfMTZiaXRfYWNjZXNzIjsKICAgICAgICAgICAgIGNhc2UgS0VZX1NUT1JBR0VfSU1BR0VfU0FNUExFX0NPVU5UUzogcmV0dXJuICJzdG9yYWdlX2ltYWdlX3NhbXBsZV9jb3VudHMiOworICAgICAgICAgICAgY2FzZSBLRVlfU1RPUkFHRV9JTlBVVF9PVVRQVVRfMTY6IHJldHVybiAic3RvcmFnZV9pbnB1dF9vdXRwdXRfMTYiOworICAgICAgICAgICAgY2FzZSBLRVlfU1RPUkFHRV9QVVNIX0NPTlNUQU5UXzE2OiByZXR1cm4gInN0b3JhZ2VfcHVzaF9jb25zdGFudF8xNiI7CiAgICAgICAgICAgICBjYXNlIEtFWV9TVFJJQ1RfTElORVM6IHJldHVybiAic3RyaWN0X2xpbmVzIjsKICAgICAgICAgICAgIGNhc2UgS0VZX1NVQl9QSVhFTF9JTlRFUlBPTEFUSU9OX09GRlNFVF9CSVRTOiByZXR1cm4gInN1Yl9waXhlbF9pbnRlcnBvbGF0aW9uX29mZnNldF9iaXRzIjsKICAgICAgICAgICAgIGNhc2UgS0VZX1NVQl9QSVhFTF9QUkVDSVNJT05fQklUUzogcmV0dXJuICJzdWJfcGl4ZWxfcHJlY2lzaW9uX2JpdHMiOwogICAgICAgICAgICAgY2FzZSBLRVlfU1VCX1RFWEVMX1BSRUNJU0lPTl9CSVRTOiByZXR1cm4gInN1Yl90ZXhlbF9wcmVjaXNpb25fYml0cyI7CisgICAgICAgICAgICBjYXNlIEtFWV9TVUJHUk9VUF9QUk9QRVJUSUVTOiByZXR1cm4gInN1Ymdyb3VwX3Byb3BlcnRpZXMiOworICAgICAgICAgICAgY2FzZSBLRVlfU1VCR1JPVVBfU0laRTogcmV0dXJuICJzdWJncm91cF9zaXplIjsKKyAgICAgICAgICAgIGNhc2UgS0VZX1NVQlNFVF9BTExPQ0FUSU9OOiByZXR1cm4gInN1YnNldF9hbGxvY2F0aW9uIjsKKyAgICAgICAgICAgIGNhc2UgS0VZX1NVUFBPUlRFRF9PUEVSQVRJT05TOiByZXR1cm4gInN1cHBvcnRlZF9vcGVyYXRpb25zIjsKKyAgICAgICAgICAgIGNhc2UgS0VZX1NVUFBPUlRFRF9TVEFHRVM6IHJldHVybiAic3VwcG9ydGVkX3N0YWdlcyI7CiAgICAgICAgICAgICBjYXNlIEtFWV9URVNTRUxMQVRJT05fU0hBREVSOiByZXR1cm4gInRlc3NlbGxhdGlvbl9zaGFkZXIiOwogICAgICAgICAgICAgY2FzZSBLRVlfVEVYVFVSRV9DT01QUkVTU0lPTl9BU1RDX0xEUjogcmV0dXJuICJ0ZXh0dXJlX2NvbXByZXNzaW9uX2FzdGNfbGRyIjsKICAgICAgICAgICAgIGNhc2UgS0VZX1RFWFRVUkVfQ09NUFJFU1NJT05fQkM6IHJldHVybiAidGV4dHVyZV9jb21wcmVzc2lvbl9iYyI7CkBAIC04NzIsMTEgKzExNTEsMTcgQEAKICAgICAgICAgICAgIGNhc2UgS0VZX1RJTUVTVEFNUF9DT01QVVRFX0FORF9HUkFQSElDUzogcmV0dXJuICJ0aW1lc3RhbXBfY29tcHV0ZV9hbmRfZ3JhcGhpY3MiOwogICAgICAgICAgICAgY2FzZSBLRVlfVElNRVNUQU1QX1BFUklPRDogcmV0dXJuICJ0aW1lc3RhbXBfcGVyaW9kIjsKICAgICAgICAgICAgIGNhc2UgS0VZX1RJTUVTVEFNUF9WQUxJRF9CSVRTOiByZXR1cm4gInRpbWVzdGFtcF92YWxpZF9iaXRzIjsKKyAgICAgICAgICAgIGNhc2UgS0VZX1VOSUZPUk1fQU5EX1NUT1JBR0VfQlVGRkVSXzE2QklUX0FDQ0VTUzogcmV0dXJuICJ1bmlmb3JtX2FuZF9zdG9yYWdlX2J1ZmZlcl8xNmJpdF9hY2Nlc3MiOwogICAgICAgICAgICAgY2FzZSBLRVlfVkFSSUFCTEVfTVVMVElTQU1QTEVfUkFURTogcmV0dXJuICJ2YXJpYWJsZV9tdWx0aXNhbXBsZV9yYXRlIjsKKyAgICAgICAgICAgIGNhc2UgS0VZX1ZBUklBQkxFX1BPSU5URVJfRkVBVFVSRVM6IHJldHVybiAidmFyaWFibGVfcG9pbnRlcl9mZWF0dXJlcyI7CisgICAgICAgICAgICBjYXNlIEtFWV9WQVJJQUJMRV9QT0lOVEVSX0ZFQVRVUkVTX0tIUjogcmV0dXJuICJ2YXJpYWJsZV9wb2ludGVyX2ZlYXR1cmVzX2tociI7CisgICAgICAgICAgICBjYXNlIEtFWV9WQVJJQUJMRV9QT0lOVEVSUzogcmV0dXJuICJ2YXJpYWJsZV9wb2ludGVycyI7CisgICAgICAgICAgICBjYXNlIEtFWV9WQVJJQUJMRV9QT0lOVEVSU19TVE9SQUdFX0JVRkZFUjogcmV0dXJuICJ2YXJpYWJsZV9wb2ludGVyc19zdG9yYWdlX2J1ZmZlciI7CiAgICAgICAgICAgICBjYXNlIEtFWV9WRU5ET1JfSUQ6IHJldHVybiAidmVuZG9yX2lkIjsKICAgICAgICAgICAgIGNhc2UgS0VZX1ZFUlRFWF9QSVBFTElORV9TVE9SRVNfQU5EX0FUT01JQ1M6IHJldHVybiAidmVydGV4X3BpcGVsaW5lX3N0b3Jlc19hbmRfYXRvbWljcyI7CiAgICAgICAgICAgICBjYXNlIEtFWV9WSUVXUE9SVF9CT1VORFNfUkFOR0U6IHJldHVybiAidmlld3BvcnRfYm91bmRzX3JhbmdlIjsKICAgICAgICAgICAgIGNhc2UgS0VZX1ZJRVdQT1JUX1NVQl9QSVhFTF9CSVRTOiByZXR1cm4gInZpZXdwb3J0X3N1Yl9waXhlbF9iaXRzIjsKKyAgICAgICAgICAgIGNhc2UgS0VZX1ZLX0tIUl9WQVJJQUJMRV9QT0lOVEVSUzogcmV0dXJuICJ2a19raHJfdmFyaWFibGVfcG9pbnRlcnMiOwogICAgICAgICAgICAgY2FzZSBLRVlfV0lERV9MSU5FUzogcmV0dXJuICJ3aWRlX2xpbmVzIjsKICAgICAgICAgICAgIGNhc2UgS0VZX1dJRFRIOiByZXR1cm4gIndpZHRoIjsKICAgICAgICAgICAgIGRlZmF1bHQ6IHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJ1bmtub3duIGtleSBuYW1lOiAiICsgbmFtZSk7CmRpZmYgLS1naXQgYS90b29scy9jdHMtaG9sby1nZW5lcmF0aW9uL0FuZHJvaWQubWsgYi90b29scy9jdHMtaG9sby1nZW5lcmF0aW9uL0FuZHJvaWQubWsKaW5kZXggNDNiMzQ2ZC4uZGUzOWM2MyAxMDA2NDQKLS0tIGEvdG9vbHMvY3RzLWhvbG8tZ2VuZXJhdGlvbi9BbmRyb2lkLm1rCisrKyBiL3Rvb2xzL2N0cy1ob2xvLWdlbmVyYXRpb24vQW5kcm9pZC5tawpAQCAtMjMsNyArMjMsOSBAQAogTE9DQUxfREVYX1BSRU9QVCA6PSBmYWxzZQogTE9DQUxfUFJPR1VBUkRfRU5BQkxFRCA6PSBkaXNhYmxlZAogCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC1zdXBwb3J0LXRlc3QgbGVnYWN5LWFuZHJvaWQtdGVzdAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWR4LnRlc3QucnVsZXMKKworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lci5zdHVicyBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicwogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL2N0cy1ob2xvLWdlbmVyYXRpb24vQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rvb2xzL2N0cy1ob2xvLWdlbmVyYXRpb24vQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBhZDRhZTIyLi40MWZhYjAwIDEwMDY0NAotLS0gYS90b29scy9jdHMtaG9sby1nZW5lcmF0aW9uL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdG9vbHMvY3RzLWhvbG8tZ2VuZXJhdGlvbi9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uV1JJVEVfRVhURVJOQUxfU1RPUkFHRSIgLz4KIAogICAgIDxpbnN0cnVtZW50YXRpb24KLSAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5jdHMuaG9sb19jYXB0dXJlIiAvPgogCiAgICAgPGFwcGxpY2F0aW9uPgpkaWZmIC0tZ2l0IGEvdG9vbHMvY3RzLW1lZGlhLXByZXBhcmVyLWFwcC9BbmRyb2lkLm1rIGIvdG9vbHMvY3RzLW1lZGlhLXByZXBhcmVyLWFwcC9BbmRyb2lkLm1rCmluZGV4IDlkNDRmOGMuLmMyZDU3MzEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2N0cy1tZWRpYS1wcmVwYXJlci1hcHAvQW5kcm9pZC5taworKysgYi90b29scy9jdHMtbWVkaWEtcHJlcGFyZXItYXBwL0FuZHJvaWQubWsKQEAgLTI3LDcgKzI3LDcgQEAKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC1zdXBwb3J0LXRlc3QgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWR4LnRlc3QucnVsZXMgY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbC1heHQKIAogIyB0YWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAogTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKZGlmZiAtLWdpdCBhL3Rvb2xzL2N0cy1tZWRpYS1wcmVwYXJlci1hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rvb2xzL2N0cy1tZWRpYS1wcmVwYXJlci1hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBkYThkM2QyLi4xNWFmYmE0IDEwMDY0NAotLS0gYS90b29scy9jdHMtbWVkaWEtcHJlcGFyZXItYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdG9vbHMvY3RzLW1lZGlhLXByZXBhcmVyLWFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yMyw3ICsyMyw3IEBACiAgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgogICAgIDwvYXBwbGljYXRpb24+CiAKLSAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgogICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLm1lZGlhc3RyZXNzLmN0cy5wcmVjb25kaXRpb25zLmFwcCIKICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkRldmljZS1zaWRlIENUUyBtZWRpYXN0cmVzcyBwcmVwYXJhdGlvbiIgLz4KIDwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS90b29scy9jdHMtbWVkaWEtcHJlcGFyZXItYXBwL3NyYy9hbmRyb2lkL21lZGlhc3RyZXNzL2N0cy9wcmVjb25kaXRpb25zL2FwcC9NZWRpYVByZXBhcmVyQXBwVGVzdC5qYXZhIGIvdG9vbHMvY3RzLW1lZGlhLXByZXBhcmVyLWFwcC9zcmMvYW5kcm9pZC9tZWRpYXN0cmVzcy9jdHMvcHJlY29uZGl0aW9ucy9hcHAvTWVkaWFQcmVwYXJlckFwcFRlc3QuamF2YQppbmRleCAxYjU1MTk2Li4wZjRmZDY5IDEwMDY0NAotLS0gYS90b29scy9jdHMtbWVkaWEtcHJlcGFyZXItYXBwL3NyYy9hbmRyb2lkL21lZGlhc3RyZXNzL2N0cy9wcmVjb25kaXRpb25zL2FwcC9NZWRpYVByZXBhcmVyQXBwVGVzdC5qYXZhCisrKyBiL3Rvb2xzL2N0cy1tZWRpYS1wcmVwYXJlci1hcHAvc3JjL2FuZHJvaWQvbWVkaWFzdHJlc3MvY3RzL3ByZWNvbmRpdGlvbnMvYXBwL01lZGlhUHJlcGFyZXJBcHBUZXN0LmphdmEKQEAgLTE1LDEzICsxNSwxNCBAQAogICovCiBwYWNrYWdlIGFuZHJvaWQubWVkaWFzdHJlc3MuY3RzLnByZWNvbmRpdGlvbnMuYXBwOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5EeW5hbWljQ29uZmlnRGV2aWNlU2lkZTsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLk1lZGlhVXRpbHM7Ci0KIGltcG9ydCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb247CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUZvcm1hdDsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudGVzdC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkR5bmFtaWNDb25maWdEZXZpY2VTaWRlOworaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnV0aWwuTWVkaWFVdGlsczsKIAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKZGlmZiAtLWdpdCBhL3Rvb2xzL2N0cy1wcmVjb25kaXRpb25zL0FuZHJvaWQubWsgYi90b29scy9jdHMtcHJlY29uZGl0aW9ucy9BbmRyb2lkLm1rCmluZGV4IDc2YmZhYTguLjljNjRlNzYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2N0cy1wcmVjb25kaXRpb25zL0FuZHJvaWQubWsKKysrIGIvdG9vbHMvY3RzLXByZWNvbmRpdGlvbnMvQW5kcm9pZC5tawpAQCAtMjYsMTcgKzI2LDE4IEBACiBMT0NBTF9QUk9HVUFSRF9FTkFCTEVEIDo9IGRpc2FibGVkCiAKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCi0gICAgYW5kcm9pZC1zdXBwb3J0LXRlc3QgXAotICAgIGNvbXBhdGliaWxpdHktZGV2aWNlLXByZWNvbmRpdGlvbnMgXAotICAgIGxlZ2FjeS1hbmRyb2lkLXRlc3QKKyAgICBhbmRyb2lkeC50ZXN0LnJ1bGVzIFwKKyAgICBjb21wYXRpYmlsaXR5LWRldmljZS1wcmVjb25kaXRpb25zCisKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIAogIyBUYWcgdGhpcyBtb2R1bGUgYXMgYSBjdHMgdGVzdCBhcnRpZmFjdAotTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBjdHMgdnRzIGdlbmVyYWwtdGVzdHMKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gY3RzIHZ0cyBnZW5lcmFsLXRlc3RzIGN0c19pbnN0YW50CiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDdHNQcmVjb25kaXRpb25zCiAKLUxPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKK0xPQ0FMX1NES19WRVJTSU9OIDo9IDI2CiAKIGluY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvdG9vbHMvY3RzLXByZWNvbmRpdGlvbnMvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rvb2xzL2N0cy1wcmVjb25kaXRpb25zL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggYThlYjgyNy4uOTg0ZWY2YSAxMDA2NDQKLS0tIGEvdG9vbHMvY3RzLXByZWNvbmRpdGlvbnMvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90b29scy9jdHMtcHJlY29uZGl0aW9ucy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yNCw3ICsyNCw3IEBACiAKICAgICA8IS0tICBzZWxmLWluc3RydW1lbnRpbmcgdGVzdCBwYWNrYWdlLiAtLT4KICAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNUUyBwcmVjb25kaXRpb25zIHRlc3QiCiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmFuZHJvaWQucHJlY29uZGl0aW9ucy5jdHMiID4KICAgICA8L2luc3RydW1lbnRhdGlvbj4KZGlmZiAtLWdpdCBhL3Rvb2xzL2N0cy1yZWZlcmVuY2UtYXBwLWxpYi9BbmRyb2lkLm1rIGIvdG9vbHMvY3RzLXJlZmVyZW5jZS1hcHAtbGliL0FuZHJvaWQubWsKaW5kZXggOGY2MDM5ZC4uZjAwNmJiMCAxMDA2NDQKLS0tIGEvdG9vbHMvY3RzLXJlZmVyZW5jZS1hcHAtbGliL0FuZHJvaWQubWsKKysrIGIvdG9vbHMvY3RzLXJlZmVyZW5jZS1hcHAtbGliL0FuZHJvaWQubWsKQEAgLTI0LDcgKzI0LDkgQEAKICMgYW5kIHdoZW4gYnVpbHQgZXhwbGljaXRseSBwdXQgaXQgaW4gdGhlIGRhdGEgcGFydGl0aW9uCiBMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQV9BUFBTKQogCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gbGVnYWN5LWFuZHJvaWQtdGVzdCBqdW5pdAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGp1bml0CisKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIuc3R1YnMgYW5kcm9pZC50ZXN0LmJhc2Uuc3R1YnMKIAogTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAogCmRpZmYgLS1naXQgYS90b29scy9jdHMtdGVzdC1tZXRyaWNzL0N0c0NhbWVyYVRlc3RDYXNlcy5yZXBvcnRsb2cuanNvbiBiL3Rvb2xzL2N0cy10ZXN0LW1ldHJpY3MvQ3RzQ2FtZXJhVGVzdENhc2VzLnJlcG9ydGxvZy5qc29uCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWE5ZWYxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2N0cy10ZXN0LW1ldHJpY3MvQ3RzQ2FtZXJhVGVzdENhc2VzLnJlcG9ydGxvZy5qc29uCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAoteyJ0ZXN0X3JlcHJvY2Vzc2luZ190aHJvdWdocHV0IjpbeyJjYW1lcmFfaWQiOiIwIiwiZm9ybWF0IjozNSwicmVwcm9jZXNzX3R5cGUiOiJZVVYgcmVwcm9jZXNzaW5nIiwiY2FwdHVyZV9tZXNzYWdlIjoiY2FwdHVyZSBsYXRlbmN5IiwibGF0ZW5jeSI6WzIzNy4wLDEwMi4wLDk5LjAsMTA1LjAsMTI0LjAsOTIuMF0sImNhbWVyYV9yZXByb2Nlc3NpbmdfYXZlcmFnZV9sYXRlbmN5IjoxMjYuNX0seyJjYW1lcmFfaWQiOiIwIiwiZm9ybWF0IjozNCwicmVwcm9jZXNzX3R5cGUiOiJvcGFxdWUgcmVwcm9jZXNzaW5nIiwiY2FwdHVyZV9tZXNzYWdlIjoiY2FwdHVyZSBsYXRlbmN5IiwibGF0ZW5jeSI6WzIwNi4wLDkxLjAsOTIuMCw4OS4wLDExOS4wLDg0LjBdLCJjYW1lcmFfcmVwcm9jZXNzaW5nX2F2ZXJhZ2VfbGF0ZW5jeSI6MTEzLjV9LHsiY2FtZXJhX2lkIjoiMSIsImZvcm1hdCI6MzUsInJlcHJvY2Vzc190eXBlIjoiWVVWIHJlcHJvY2Vzc2luZyIsImNhcHR1cmVfbWVzc2FnZSI6ImNhcHR1cmUgbGF0ZW5jeSIsImxhdGVuY3kiOlsyMTYuMCw4NC4wLDgwLjAsODMuMCw5My4wLDc2LjBdLCJjYW1lcmFfcmVwcm9jZXNzaW5nX2F2ZXJhZ2VfbGF0ZW5jeSI6MTA1LjMzMzMzMzMzMzMzMzMzfSx7ImNhbWVyYV9pZCI6IjEiLCJmb3JtYXQiOjM0LCJyZXByb2Nlc3NfdHlwZSI6Im9wYXF1ZSByZXByb2Nlc3NpbmciLCJjYXB0dXJlX21lc3NhZ2UiOiJjYXB0dXJlIGxhdGVuY3kiLCJsYXRlbmN5IjpbMjEyLjAsODMuMCw3MS4wLDgwLjAsOTMuMCw3NC4wXSwiY2FtZXJhX3JlcHJvY2Vzc2luZ19hdmVyYWdlX2xhdGVuY3kiOjEwMi4xNjY2NjY2NjY2NjY2N30seyJjYW1lcmFfaWQiOiIwIiwiZm9ybWF0IjozNSwicmVwcm9jZXNzX3R5cGUiOiJZVVYgcmVwcm9jZXNzaW5nIiwiY2FwdHVyZV9tZXNzYWdlIjoiY2FwdHVyZSBsYXRlbmN5IiwibGF0ZW5jeSI6WzIyOC4wLDEwNS4wLDg1LjAsODYuMCwxMTYuMCw4My4wXSwiY2FtZXJhX3JlcHJvY2Vzc2luZ19hdmVyYWdlX2xhdGVuY3kiOjExNy4xNjY2NjY2NjY2NjY2N30seyJjYW1lcmFfaWQiOiIwIiwiZm9ybWF0IjozNCwicmVwcm9jZXNzX3R5cGUiOiJvcGFxdWUgcmVwcm9jZXNzaW5nIiwiY2FwdHVyZV9tZXNzYWdlIjoiY2FwdHVyZSBsYXRlbmN5IiwibGF0ZW5jeSI6WzE5NS4wLDg5LjAsOTQuMCw5NC4wLDExNi4wLDg2LjBdLCJjYW1lcmFfcmVwcm9jZXNzaW5nX2F2ZXJhZ2VfbGF0ZW5jeSI6MTEyLjMzMzMzMzMzMzMzMzMzfSx7ImNhbWVyYV9pZCI6IjEiLCJmb3JtYXQiOjM1LCJyZXByb2Nlc3NfdHlwZSI6IllVViByZXByb2Nlc3NpbmciLCJjYXB0dXJlX21lc3NhZ2UiOiJjYXB0dXJlIGxhdGVuY3kiLCJsYXRlbmN5IjpbMTUwLjAsODMuMCw3NS4wLDc1LjAsMTAyLjAsNzYuMF0sImNhbWVyYV9yZXByb2Nlc3NpbmdfYXZlcmFnZV9sYXRlbmN5Ijo5My41fSx7ImNhbWVyYV9pZCI6IjEiLCJmb3JtYXQiOjM0LCJyZXByb2Nlc3NfdHlwZSI6Im9wYXF1ZSByZXByb2Nlc3NpbmciLCJjYXB0dXJlX21lc3NhZ2UiOiJjYXB0dXJlIGxhdGVuY3kiLCJsYXRlbmN5IjpbMTk4LjAsODUuMCw3OC4wLDcxLjAsOTUuMCw3Ny4wXSwiY2FtZXJhX3JlcHJvY2Vzc2luZ19hdmVyYWdlX2xhdGVuY3kiOjEwMC42NjY2NjY2NjY2NjY2N31dLCJ0ZXN0X2NhbWVyYV9sYXVuY2hfYXZlcmFnZSI6W3siY2FtZXJhX2xhdW5jaF9hdmVyYWdlX3RpbWVfZm9yX2FsbF9jYW1lcmFzIjozMjYuMX0seyJjYW1lcmFfbGF1bmNoX2F2ZXJhZ2VfdGltZV9mb3JfYWxsX2NhbWVyYXMiOjMyMS44fV0sInRlc3RfcmVwcm9jZXNzaW5nX2xhdGVuY3kiOlt7ImNhbWVyYV9pZCI6IjAiLCJmb3JtYXQiOjM1LCJyZXByb2Nlc3NfdHlwZSI6IllVViByZXByb2Nlc3NpbmciLCJjYXB0dXJlX21lc3NhZ2UiOiJzaG90IHRvIHNob3QgbGF0ZW5jeSIsImxhdGVuY3kiOlszMDMuMCwyNTQuMCwyNTkuMCwxOTYuMCwyMDEuMCwxOTUuMF0sImNhbWVyYV9yZXByb2Nlc3Npbmdfc2hvdF90b19zaG90X2F2ZXJhZ2VfbGF0ZW5jeSI6MjM0LjY2NjY2NjY2NjY2NjY2fSx7ImNhbWVyYV9pZCI6IjAiLCJmb3JtYXQiOjM0LCJyZXByb2Nlc3NfdHlwZSI6Im9wYXF1ZSByZXByb2Nlc3NpbmciLCJjYXB0dXJlX21lc3NhZ2UiOiJzaG90IHRvIHNob3QgbGF0ZW5jeSIsImxhdGVuY3kiOlsyNDguMCwxNzIuMCwyMDkuMCwxODguMCwyMDEuMCwyMDQuMF0sImNhbWVyYV9yZXByb2Nlc3Npbmdfc2hvdF90b19zaG90X2F2ZXJhZ2VfbGF0ZW5jeSI6MjAzLjY2NjY2NjY2NjY2NjY2fSx7ImNhbWVyYV9pZCI6IjEiLCJmb3JtYXQiOjM1LCJyZXByb2Nlc3NfdHlwZSI6IllVViByZXByb2Nlc3NpbmciLCJjYXB0dXJlX21lc3NhZ2UiOiJzaG90IHRvIHNob3QgbGF0ZW5jeSIsImxhdGVuY3kiOlsxOTAuMCwyMzguMCwyMjAuMCwyMTMuMCwxNDQuMCwxNTQuMF0sImNhbWVyYV9yZXByb2Nlc3Npbmdfc2hvdF90b19zaG90X2F2ZXJhZ2VfbGF0ZW5jeSI6MTkzLjE2NjY2NjY2NjY2NjY2fSx7ImNhbWVyYV9pZCI6IjEiLCJmb3JtYXQiOjM0LCJyZXByb2Nlc3NfdHlwZSI6Im9wYXF1ZSByZXByb2Nlc3NpbmciLCJjYXB0dXJlX21lc3NhZ2UiOiJzaG90IHRvIHNob3QgbGF0ZW5jeSIsImxhdGVuY3kiOlsyMzcuMCwxNjYuMCwxNTMuMCwxNDguMCwxNjIuMCwxNDAuMF0sImNhbWVyYV9yZXByb2Nlc3Npbmdfc2hvdF90b19zaG90X2F2ZXJhZ2VfbGF0ZW5jeSI6MTY3LjY2NjY2NjY2NjY2NjY2fSx7ImNhbWVyYV9pZCI6IjAiLCJmb3JtYXQiOjM1LCJyZXByb2Nlc3NfdHlwZSI6IllVViByZXByb2Nlc3NpbmciLCJjYXB0dXJlX21lc3NhZ2UiOiJzaG90IHRvIHNob3QgbGF0ZW5jeSIsImxhdGVuY3kiOlszMDIuMCwyNjIuMCwyNTYuMCwxOTcuMCwyMDAuMCwyMDEuMF0sImNhbWVyYV9yZXByb2Nlc3Npbmdfc2hvdF90b19zaG90X2F2ZXJhZ2VfbGF0ZW5jeSI6MjM2LjMzMzMzMzMzMzMzMzM0fSx7ImNhbWVyYV9pZCI6IjAiLCJmb3JtYXQiOjM0LCJyZXByb2Nlc3NfdHlwZSI6Im9wYXF1ZSByZXByb2Nlc3NpbmciLCJjYXB0dXJlX21lc3NhZ2UiOiJzaG90IHRvIHNob3QgbGF0ZW5jeSIsImxhdGVuY3kiOlsyNTEuMCwxNjYuMCwxOTkuMCwxOTkuMCwyMTMuMCwyMDEuMF0sImNhbWVyYV9yZXByb2Nlc3Npbmdfc2hvdF90b19zaG90X2F2ZXJhZ2VfbGF0ZW5jeSI6MjA0LjgzMzMzMzMzMzMzMzM0fSx7ImNhbWVyYV9pZCI6IjEiLCJmb3JtYXQiOjM1LCJyZXByb2Nlc3NfdHlwZSI6IllVViByZXByb2Nlc3NpbmciLCJjYXB0dXJlX21lc3NhZ2UiOiJzaG90IHRvIHNob3QgbGF0ZW5jeSIsImxhdGVuY3kiOlsxOTkuMCwxNTMuMCwxNTkuMCwxNjQuMCwxNTIuMCwxNjYuMF0sImNhbWVyYV9yZXByb2Nlc3Npbmdfc2hvdF90b19zaG90X2F2ZXJhZ2VfbGF0ZW5jeSI6MTY1LjV9LHsiY2FtZXJhX2lkIjoiMSIsImZvcm1hdCI6MzQsInJlcHJvY2Vzc190eXBlIjoib3BhcXVlIHJlcHJvY2Vzc2luZyIsImNhcHR1cmVfbWVzc2FnZSI6InNob3QgdG8gc2hvdCBsYXRlbmN5IiwibGF0ZW5jeSI6WzIxMC4wLDE0My4wLDE2MS4wLDE2Mi4wLDE1OC4wLDE1Ni4wXSwiY2FtZXJhX3JlcHJvY2Vzc2luZ19zaG90X3RvX3Nob3RfYXZlcmFnZV9sYXRlbmN5IjoxNjUuMH1dLCJ0ZXN0X2hpZ2hfcXVhbGl0eV9yZXByb2Nlc3NpbmdfbGF0ZW5jeSI6W3siY2FtZXJhX2lkIjoiMCIsImZvcm1hdCI6MzUsInJlcHJvY2Vzc190eXBlIjoiWVVWIHJlcHJvY2Vzc2luZyIsImNhcHR1cmVfbWVzc2FnZSI6InNob3QgdG8gc2hvdCBsYXRlbmN5IGZvciBIaWdoIFF1YWxpdHkgbm9pc2UgcmVkdWN0aW9uIGFuZCBlZGdlIG1vZGVzIiwibGF0ZW5jeSI6WzQ3OS4wLDM5OC4wLDM1MS4wLDQ4Ny4wLDQ2MS4wLDM5NS4wXSwiY2FtZXJhX3JlcHJvY2Vzc2luZ19zaG90X3RvX3Nob3RfYXZlcmFnZV9sYXRlbmN5Ijo0MjguNX0seyJjYW1lcmFfaWQiOiIwIiwiZm9ybWF0IjozNCwicmVwcm9jZXNzX3R5cGUiOiJvcGFxdWUgcmVwcm9jZXNzaW5nIiwiY2FwdHVyZV9tZXNzYWdlIjoic2hvdCB0byBzaG90IGxhdGVuY3kgZm9yIEhpZ2ggUXVhbGl0eSBub2lzZSByZWR1Y3Rpb24gYW5kIGVkZ2UgbW9kZXMiLCJsYXRlbmN5IjpbMzU1LjAsMzI0LjAsMzM1LjAsMzM0LjAsMzM2LjAsMzQ3LjBdLCJjYW1lcmFfcmVwcm9jZXNzaW5nX3Nob3RfdG9fc2hvdF9hdmVyYWdlX2xhdGVuY3kiOjMzOC41fSx7ImNhbWVyYV9pZCI6IjEiLCJmb3JtYXQiOjM1LCJyZXByb2Nlc3NfdHlwZSI6IllVViByZXByb2Nlc3NpbmciLCJjYXB0dXJlX21lc3NhZ2UiOiJzaG90IHRvIHNob3QgbGF0ZW5jeSBmb3IgSGlnaCBRdWFsaXR5IG5vaXNlIHJlZHVjdGlvbiBhbmQgZWRnZSBtb2RlcyIsImxhdGVuY3kiOlsyMzUuMCwyMjAuMCwyMjMuMCwyMjguMCwyMjIuMCwyMjcuMF0sImNhbWVyYV9yZXByb2Nlc3Npbmdfc2hvdF90b19zaG90X2F2ZXJhZ2VfbGF0ZW5jeSI6MjI1LjgzMzMzMzMzMzMzMzM0fSx7ImNhbWVyYV9pZCI6IjEiLCJmb3JtYXQiOjM0LCJyZXByb2Nlc3NfdHlwZSI6Im9wYXF1ZSByZXByb2Nlc3NpbmciLCJjYXB0dXJlX21lc3NhZ2UiOiJzaG90IHRvIHNob3QgbGF0ZW5jeSBmb3IgSGlnaCBRdWFsaXR5IG5vaXNlIHJlZHVjdGlvbiBhbmQgZWRnZSBtb2RlcyIsImxhdGVuY3kiOlsyNTYuMCwxODYuMCwyMzAuMCwyMTUuMCwyMjYuMCwyNDIuMF0sImNhbWVyYV9yZXByb2Nlc3Npbmdfc2hvdF90b19zaG90X2F2ZXJhZ2VfbGF0ZW5jeSI6MjI1LjgzMzMzMzMzMzMzMzM0fSx7ImNhbWVyYV9pZCI6IjAiLCJmb3JtYXQiOjM1LCJyZXByb2Nlc3NfdHlwZSI6IllVViByZXByb2Nlc3NpbmciLCJjYXB0dXJlX21lc3NhZ2UiOiJzaG90IHRvIHNob3QgbGF0ZW5jeSBmb3IgSGlnaCBRdWFsaXR5IG5vaXNlIHJlZHVjdGlvbiBhbmQgZWRnZSBtb2RlcyIsImxhdGVuY3kiOls0MTUuMCwzMjcuMCwzMzYuMCwzNDAuMCwzMjMuMCwzMzIuMF0sImNhbWVyYV9yZXByb2Nlc3Npbmdfc2hvdF90b19zaG90X2F2ZXJhZ2VfbGF0ZW5jeSI6MzQ1LjV9LHsiY2FtZXJhX2lkIjoiMCIsImZvcm1hdCI6MzQsInJlcHJvY2Vzc190eXBlIjoib3BhcXVlIHJlcHJvY2Vzc2luZyIsImNhcHR1cmVfbWVzc2FnZSI6InNob3QgdG8gc2hvdCBsYXRlbmN5IGZvciBIaWdoIFF1YWxpdHkgbm9pc2UgcmVkdWN0aW9uIGFuZCBlZGdlIG1vZGVzIiwibGF0ZW5jeSI6WzM4MS4wLDMwMi4wLDMzMS4wLDMzMi4wLDMzNi4wLDMzMy4wXSwiY2FtZXJhX3JlcHJvY2Vzc2luZ19zaG90X3RvX3Nob3RfYXZlcmFnZV9sYXRlbmN5IjozMzUuODMzMzMzMzMzMzMzM30seyJjYW1lcmFfaWQiOiIxIiwiZm9ybWF0IjozNSwicmVwcm9jZXNzX3R5cGUiOiJZVVYgcmVwcm9jZXNzaW5nIiwiY2FwdHVyZV9tZXNzYWdlIjoic2hvdCB0byBzaG90IGxhdGVuY3kgZm9yIEhpZ2ggUXVhbGl0eSBub2lzZSByZWR1Y3Rpb24gYW5kIGVkZ2UgbW9kZXMiLCJsYXRlbmN5IjpbMjMxLjAsMjIyLjAsMjIzLjAsMjI3LjAsMjI3LjAsMjIzLjBdLCJjYW1lcmFfcmVwcm9jZXNzaW5nX3Nob3RfdG9fc2hvdF9hdmVyYWdlX2xhdGVuY3kiOjIyNS41fSx7ImNhbWVyYV9pZCI6IjEiLCJmb3JtYXQiOjM0LCJyZXByb2Nlc3NfdHlwZSI6Im9wYXF1ZSByZXByb2Nlc3NpbmciLCJjYXB0dXJlX21lc3NhZ2UiOiJzaG90IHRvIHNob3QgbGF0ZW5jeSBmb3IgSGlnaCBRdWFsaXR5IG5vaXNlIHJlZHVjdGlvbiBhbmQgZWRnZSBtb2RlcyIsImxhdGVuY3kiOlsyNzUuMCwxNzguMCwyMjIuMCwyMjQuMCwyNDkuMCwyMDQuMF0sImNhbWVyYV9yZXByb2Nlc3Npbmdfc2hvdF90b19zaG90X2F2ZXJhZ2VfbGF0ZW5jeSI6MjI1LjMzMzMzMzMzMzMzMzM0fV0sInRlc3Rfc2luZ2xlX2NhcHR1cmUiOlt7ImNhbWVyYV9pZCI6IjAiLCJjYW1lcmFfY2FwdHVyZV9sYXRlbmN5IjpbNDc2LjAsNjM5LjAsNjU0LjAsNjM5LjAsNjY1LjBdLCJjYW1lcmFfY2FwdHVyZV9yZXN1bHRfbGF0ZW5jeSI6WzI2MC4wLDQ2NS4wLDQ5MC4wLDQ3MS4wLDQ3NC4wXX0seyJjYW1lcmFfaWQiOiIxIiwiY2FtZXJhX2NhcHR1cmVfbGF0ZW5jeSI6WzQ2MS4wLDYzOS4wLDYyNy4wLDYzNy4wLDYzMS4wXSwiY2FtZXJhX2NhcHR1cmVfcmVzdWx0X2xhdGVuY3kiOlszNDEuMCw1MzAuMCw1MzMuMCw1MzMuMCw1MzUuMF19LHsiY2FtZXJhX2lkIjoiMCIsImNhbWVyYV9jYXB0dXJlX2xhdGVuY3kiOls0NjUuMCw2NDMuMCw2NjAuMCw2NDkuMCw2NDIuMF0sImNhbWVyYV9jYXB0dXJlX3Jlc3VsdF9sYXRlbmN5IjpbMjUxLjAsNDY3LjAsNDkxLjAsNDc0LjAsNDc1LjBdfSx7ImNhbWVyYV9pZCI6IjEiLCJjYW1lcmFfY2FwdHVyZV9sYXRlbmN5IjpbNDU3LjAsNTQxLjAsNTMzLjAsNTQ2LjAsNTM0LjBdLCJjYW1lcmFfY2FwdHVyZV9yZXN1bHRfbGF0ZW5jeSI6WzMzOC4wLDQ3NS4wLDQ2Ny4wLDQ3Ny4wLDQ3MS4wXX1dLCJ0ZXN0X3NpbmdsZV9jYXB0dXJlX2F2ZXJhZ2UiOlt7ImNhbWVyYV9jYXB0dXJlX3Jlc3VsdF9hdmVyYWdlX2xhdGVuY3lfZm9yX2FsbF9jYW1lcmFzIjo0NjMuMn0seyJjYW1lcmFfY2FwdHVyZV9yZXN1bHRfYXZlcmFnZV9sYXRlbmN5X2Zvcl9hbGxfY2FtZXJhcyI6NDM4LjZ9XSwidGVzdF9yZXByb2Nlc3NpbmdfY2FwdHVyZV9zdGFsbCI6W3siY2FtZXJhX2lkIjoiMCIsImZvcm1hdCI6MzUsInJlcHJvY2Vzc190eXBlIjoiWVVWIHJlcHJvY2Vzc2luZyIsIm1heF9jYXB0dXJlX3RpbWVzdGFtcF9nYXBzIjpbNjYuOTI5ODQ5LDY2LjkyNzA3Niw2Ni44MjcwNzJdLCJjYXB0dXJlX2F2ZXJhZ2VfZnJhbWVfZHVyYXRpb24iOls2Ni43NDI3OTIsNjYuNzQyNzkyLDY2Ljc0Mjc5Ml0sImNhbWVyYV9yZXByb2Nlc3NpbmdfYXZlcmFnZV9tYXhfY2FwdHVyZV90aW1lc3RhbXBfZ2FwcyI6NjYuODk0NjY1NjY2NjY2NjV9LHsiY2FtZXJhX2lkIjoiMCIsImZvcm1hdCI6MzQsInJlcHJvY2Vzc190eXBlIjoib3BhcXVlIHJlcHJvY2Vzc2luZyIsIm1heF9jYXB0dXJlX3RpbWVzdGFtcF9nYXBzIjpbNjYuODM4NDk0LDY2Ljg2Mjk2OSw2Ny4wNTQzNDJdLCJjYXB0dXJlX2F2ZXJhZ2VfZnJhbWVfZHVyYXRpb24iOls2Ni43NDI3OTIsNjYuNzQyNzkyLDY2Ljc0Mjc5Ml0sImNhbWVyYV9yZXByb2Nlc3NpbmdfYXZlcmFnZV9tYXhfY2FwdHVyZV90aW1lc3RhbXBfZ2FwcyI6NjYuOTE4NjAxNjY2NjY2Njd9LHsiY2FtZXJhX2lkIjoiMSIsImZvcm1hdCI6MzUsInJlcHJvY2Vzc190eXBlIjoiWVVWIHJlcHJvY2Vzc2luZyIsIm1heF9jYXB0dXJlX3RpbWVzdGFtcF9nYXBzIjpbNzUuMDkxLDc1LjE1Niw3NS4wOTJdLCJjYXB0dXJlX2F2ZXJhZ2VfZnJhbWVfZHVyYXRpb24iOls3NS4wODQ2MDgwMDAwMDAwMyw3NS4wODQ2MDgwMDAwMDAwMyw3NS4wODQ2MDgwMDAwMDAwM10sImNhbWVyYV9yZXByb2Nlc3NpbmdfYXZlcmFnZV9tYXhfY2FwdHVyZV90aW1lc3RhbXBfZ2FwcyI6NzUuMTEzfSx7ImNhbWVyYV9pZCI6IjEiLCJmb3JtYXQiOjM0LCJyZXByb2Nlc3NfdHlwZSI6Im9wYXF1ZSByZXByb2Nlc3NpbmciLCJtYXhfY2FwdHVyZV90aW1lc3RhbXBfZ2FwcyI6Wzc1LjA5Niw3NS4wOSw3NS4wOTFdLCJjYXB0dXJlX2F2ZXJhZ2VfZnJhbWVfZHVyYXRpb24iOls3NS4wODQ2MDgwMDAwMDAwMyw3NS4wODQ2MDgwMDAwMDAwMyw3NS4wODQ2MDgwMDAwMDAwM10sImNhbWVyYV9yZXByb2Nlc3NpbmdfYXZlcmFnZV9tYXhfY2FwdHVyZV90aW1lc3RhbXBfZ2FwcyI6NzUuMDkyMzMzMzMzMzMzMzN9LHsiY2FtZXJhX2lkIjoiMCIsImZvcm1hdCI6MzUsInJlcHJvY2Vzc190eXBlIjoiWVVWIHJlcHJvY2Vzc2luZyIsIm1heF9jYXB0dXJlX3RpbWVzdGFtcF9nYXBzIjpbNjYuODEwNjU2LDY3LjEwMTYxNyw2Ni44MTE4NTddLCJjYXB0dXJlX2F2ZXJhZ2VfZnJhbWVfZHVyYXRpb24iOls2Ni43NDI3OTIsNjYuNzQyNzkyLDY2Ljc0Mjc5Ml0sImNhbWVyYV9yZXByb2Nlc3NpbmdfYXZlcmFnZV9tYXhfY2FwdHVyZV90aW1lc3RhbXBfZ2FwcyI6NjYuOTA4MDQzMzMzMzMzMzR9LHsiY2FtZXJhX2lkIjoiMCIsImZvcm1hdCI6MzQsInJlcHJvY2Vzc190eXBlIjoib3BhcXVlIHJlcHJvY2Vzc2luZyIsIm1heF9jYXB0dXJlX3RpbWVzdGFtcF9nYXBzIjpbMTMzLjMyMjU3NSw2Ni45MTk3NDEsNjYuOTUwODhdLCJjYXB0dXJlX2F2ZXJhZ2VfZnJhbWVfZHVyYXRpb24iOls2Ni43NDI3OTIsNjYuNzQyNzkyLDY2Ljc0Mjc5Ml0sImNhbWVyYV9yZXByb2Nlc3NpbmdfYXZlcmFnZV9tYXhfY2FwdHVyZV90aW1lc3RhbXBfZ2FwcyI6ODkuMDY0Mzk4NjY2NjY2NjZ9LHsiY2FtZXJhX2lkIjoiMSIsImZvcm1hdCI6MzUsInJlcHJvY2Vzc190eXBlIjoiWVVWIHJlcHJvY2Vzc2luZyIsIm1heF9jYXB0dXJlX3RpbWVzdGFtcF9nYXBzIjpbODAuMDg4LDgwLjA5MSw4MC4wODldLCJjYXB0dXJlX2F2ZXJhZ2VfZnJhbWVfZHVyYXRpb24iOls4MC4wODUwNzIwMDAwMDAwMSw4MC4wODUwNzIwMDAwMDAwMSw4MC4wODUwNzIwMDAwMDAwMV0sImNhbWVyYV9yZXByb2Nlc3NpbmdfYXZlcmFnZV9tYXhfY2FwdHVyZV90aW1lc3RhbXBfZ2FwcyI6ODAuMDg5MzMzMzMzMzMzMzN9LHsiY2FtZXJhX2lkIjoiMSIsImZvcm1hdCI6MzQsInJlcHJvY2Vzc190eXBlIjoib3BhcXVlIHJlcHJvY2Vzc2luZyIsIm1heF9jYXB0dXJlX3RpbWVzdGFtcF9nYXBzIjpbODAuMDkyLDgwLjA5MSw4MC4wOTFdLCJjYXB0dXJlX2F2ZXJhZ2VfZnJhbWVfZHVyYXRpb24iOls4MC4wODUwNzIwMDAwMDAwMSw4MC4wODUwNzIwMDAwMDAwMSw4MC4wODUwNzIwMDAwMDAwMV0sImNhbWVyYV9yZXByb2Nlc3NpbmdfYXZlcmFnZV9tYXhfY2FwdHVyZV90aW1lc3RhbXBfZ2FwcyI6ODAuMDkxMzMzMzMzMzMzMzR9XSwidGVzdF9jYW1lcmFfbGF1bmNoIjpbeyJjYW1lcmFfaWQiOiIwIiwiY2FtZXJhX29wZW5fdGltZSI6WzExNi4wLDg1LjAsODguMCw4My4wLDg2LjBdLCJjYW1lcmFfY29uZmlndXJlX3N0cmVhbV90aW1lIjpbMjAuMCwxMS4wLDExLjAsMTAuMCwxMC4wXSwiY2FtZXJhX3N0YXJ0X3ByZXZpZXdfdGltZSI6WzMxMi4wLDIyNC4wLDIyMy4wLDIxOS4wLDIzMC4wXSwiY2FtZXJhX2NhbWVyYV9zdG9wX3ByZXZpZXciOlsyNzguMCwyNTUuMCwyNjUuMCwyNjguMCwyNjcuMF0sImNhbWVyYV9jYW1lcmFfY2xvc2VfdGltZSI6WzEwNy4wLDEyNC4wLDEwMy4wLDEwOC4wLDEyNy4wXSwiY2FtZXJhX2xhdW5jaF90aW1lIjpbNDQ4LjAsMzIwLjAsMzIyLjAsMzEyLjAsMzI2LjBdfSx7ImNhbWVyYV9pZCI6IjEiLCJjYW1lcmFfb3Blbl90aW1lIjpbNzIuMCw2Ny4wLDY3LjAsNjcuMCw2NS4wXSwiY2FtZXJhX2NvbmZpZ3VyZV9zdHJlYW1fdGltZSI6WzEyLjAsMTAuMCwxMS4wLDEwLjAsMTEuMF0sImNhbWVyYV9zdGFydF9wcmV2aWV3X3RpbWUiOlsyMjcuMCwyMzEuMCwyMjQuMCwyMjYuMCwyMzMuMF0sImNhbWVyYV9jYW1lcmFfc3RvcF9wcmV2aWV3IjpbMTY3LjAsMTYyLjAsMTcxLjAsMTcwLjAsMTY4LjBdLCJjYW1lcmFfY2FtZXJhX2Nsb3NlX3RpbWUiOls5Ni4wLDg3LjAsOTEuMCw4NS4wLDkwLjBdLCJjYW1lcmFfbGF1bmNoX3RpbWUiOlszMTEuMCwzMDguMCwzMDIuMCwzMDMuMCwzMDkuMF19LHsiY2FtZXJhX2lkIjoiMCIsImNhbWVyYV9vcGVuX3RpbWUiOls5Ni4wLDg1LjAsODkuMCw4OS4wLDg0LjBdLCJjYW1lcmFfY29uZmlndXJlX3N0cmVhbV90aW1lIjpbMTQuMCwxMC4wLDEwLjAsMTAuMCwxMC4wXSwiY2FtZXJhX3N0YXJ0X3ByZXZpZXdfdGltZSI6WzI2Mi4wLDIyMC4wLDIyNC4wLDIyMS4wLDIyNi4wXSwiY2FtZXJhX2NhbWVyYV9zdG9wX3ByZXZpZXciOlsyNTkuMCwyNTEuMCwyNzEuMCwyNTcuMCwyNjUuMF0sImNhbWVyYV9jYW1lcmFfY2xvc2VfdGltZSI6WzExNy4wLDE1My4wLDEyMC4wLDEyMi4wLDExOC4wXSwiY2FtZXJhX2xhdW5jaF90aW1lIjpbMzcyLjAsMzE1LjAsMzIzLjAsMzIwLjAsMzIwLjBdfSx7ImNhbWVyYV9pZCI6IjEiLCJjYW1lcmFfb3Blbl90aW1lIjpbNzEuMCw2Ny4wLDY4LjAsNzAuMCw2OS4wXSwiY2FtZXJhX2NvbmZpZ3VyZV9zdHJlYW1fdGltZSI6WzExLjAsMTAuMCwxMC4wLDEwLjAsMTAuMF0sImNhbWVyYV9zdGFydF9wcmV2aWV3X3RpbWUiOlsyMjguMCwyMzUuMCwyMzMuMCwyMzcuMCwyMzkuMF0sImNhbWVyYV9jYW1lcmFfc3RvcF9wcmV2aWV3IjpbMTY3LjAsMTY5LjAsMTY5LjAsMTYyLjAsMTczLjBdLCJjYW1lcmFfY2FtZXJhX2Nsb3NlX3RpbWUiOls5NS4wLDg5LjAsOTMuMCw5NC4wLDEwMy4wXSwiY2FtZXJhX2xhdW5jaF90aW1lIjpbMzEwLjAsMzEyLjAsMzExLjAsMzE3LjAsMzE4LjBdfV0sInRlc3RfaGlnaF9xdWFsaXR5X3JlcHJvY2Vzc2luZ190aHJvdWdocHV0IjpbeyJjYW1lcmFfaWQiOiIwIiwiZm9ybWF0IjozNSwicmVwcm9jZXNzX3R5cGUiOiJZVVYgcmVwcm9jZXNzaW5nIiwiY2FwdHVyZV9tZXNzYWdlIjoiY2FwdHVyZSBsYXRlbmN5IGZvciBIaWdoIFF1YWxpdHkgbm9pc2UgcmVkdWN0aW9uIGFuZCBlZGdlIG1vZGVzIiwibGF0ZW5jeSI6WzI3Mi4wLDI0Ni4wLDIxMS4wLDIxMC4wLDIzNS4wLDIwMi4wXSwiY2FtZXJhX3JlcHJvY2Vzc2luZ19hdmVyYWdlX2xhdGVuY3kiOjIyOS4zMzMzMzMzMzMzMzMzNH0seyJjYW1lcmFfaWQiOiIwIiwiZm9ybWF0IjozNCwicmVwcm9jZXNzX3R5cGUiOiJvcGFxdWUgcmVwcm9jZXNzaW5nIiwiY2FwdHVyZV9tZXNzYWdlIjoiY2FwdHVyZSBsYXRlbmN5IGZvciBIaWdoIFF1YWxpdHkgbm9pc2UgcmVkdWN0aW9uIGFuZCBlZGdlIG1vZGVzIiwibGF0ZW5jeSI6WzMwNC4wLDIxMC4wLDIwNi4wLDIwOS4wLDIyNi4wLDIyOS4wXSwiY2FtZXJhX3JlcHJvY2Vzc2luZ19hdmVyYWdlX2xhdGVuY3kiOjIzMC42NjY2NjY2NjY2NjY2Nn0seyJjYW1lcmFfaWQiOiIxIiwiZm9ybWF0IjozNSwicmVwcm9jZXNzX3R5cGUiOiJZVVYgcmVwcm9jZXNzaW5nIiwiY2FwdHVyZV9tZXNzYWdlIjoiY2FwdHVyZSBsYXRlbmN5IGZvciBIaWdoIFF1YWxpdHkgbm9pc2UgcmVkdWN0aW9uIGFuZCBlZGdlIG1vZGVzIiwibGF0ZW5jeSI6WzI0Ni4wLDEyMy4wLDExNi4wLDExNC4wLDEzMS4wLDEwOS4wXSwiY2FtZXJhX3JlcHJvY2Vzc2luZ19hdmVyYWdlX2xhdGVuY3kiOjEzOS44MzMzMzMzMzMzMzMzNH0seyJjYW1lcmFfaWQiOiIxIiwiZm9ybWF0IjozNCwicmVwcm9jZXNzX3R5cGUiOiJvcGFxdWUgcmVwcm9jZXNzaW5nIiwiY2FwdHVyZV9tZXNzYWdlIjoiY2FwdHVyZSBsYXRlbmN5IGZvciBIaWdoIFF1YWxpdHkgbm9pc2UgcmVkdWN0aW9uIGFuZCBlZGdlIG1vZGVzIiwibGF0ZW5jeSI6WzIxMS4wLDExMi4wLDExNi4wLDExMi4wLDEyMy4wLDExMC4wXSwiY2FtZXJhX3JlcHJvY2Vzc2luZ19hdmVyYWdlX2xhdGVuY3kiOjEzMC42NjY2NjY2NjY2NjY2Nn0seyJjYW1lcmFfaWQiOiIwIiwiZm9ybWF0IjozNSwicmVwcm9jZXNzX3R5cGUiOiJZVVYgcmVwcm9jZXNzaW5nIiwiY2FwdHVyZV9tZXNzYWdlIjoiY2FwdHVyZSBsYXRlbmN5IGZvciBIaWdoIFF1YWxpdHkgbm9pc2UgcmVkdWN0aW9uIGFuZCBlZGdlIG1vZGVzIiwibGF0ZW5jeSI6WzM0OS4wLDIxNS4wLDIxNC4wLDIxNC4wLDIzOC4wLDIxMy4wXSwiY2FtZXJhX3JlcHJvY2Vzc2luZ19hdmVyYWdlX2xhdGVuY3kiOjI0MC41fSx7ImNhbWVyYV9pZCI6IjAiLCJmb3JtYXQiOjM0LCJyZXByb2Nlc3NfdHlwZSI6Im9wYXF1ZSByZXByb2Nlc3NpbmciLCJjYXB0dXJlX21lc3NhZ2UiOiJjYXB0dXJlIGxhdGVuY3kgZm9yIEhpZ2ggUXVhbGl0eSBub2lzZSByZWR1Y3Rpb24gYW5kIGVkZ2UgbW9kZXMiLCJsYXRlbmN5IjpbMzI2LjAsMjA2LjAsMjA0LjAsMjA2LjAsMjI1LjAsMjMyLjBdLCJjYW1lcmFfcmVwcm9jZXNzaW5nX2F2ZXJhZ2VfbGF0ZW5jeSI6MjMzLjE2NjY2NjY2NjY2NjY2fSx7ImNhbWVyYV9pZCI6IjEiLCJmb3JtYXQiOjM1LCJyZXByb2Nlc3NfdHlwZSI6IllVViByZXByb2Nlc3NpbmciLCJjYXB0dXJlX21lc3NhZ2UiOiJjYXB0dXJlIGxhdGVuY3kgZm9yIEhpZ2ggUXVhbGl0eSBub2lzZSByZWR1Y3Rpb24gYW5kIGVkZ2UgbW9kZXMiLCJsYXRlbmN5IjpbMjM4LjAsMTE5LjAsMTMwLjAsMTE2LjAsMTMwLjAsMTE0LjBdLCJjYW1lcmFfcmVwcm9jZXNzaW5nX2F2ZXJhZ2VfbGF0ZW5jeSI6MTQxLjE2NjY2NjY2NjY2NjY2fSx7ImNhbWVyYV9pZCI6IjEiLCJmb3JtYXQiOjM0LCJyZXByb2Nlc3NfdHlwZSI6Im9wYXF1ZSByZXByb2Nlc3NpbmciLCJjYXB0dXJlX21lc3NhZ2UiOiJjYXB0dXJlIGxhdGVuY3kgZm9yIEhpZ2ggUXVhbGl0eSBub2lzZSByZWR1Y3Rpb24gYW5kIGVkZ2UgbW9kZXMiLCJsYXRlbmN5IjpbMjQ5LjAsMTE3LjAsMTIyLjAsMTEzLjAsMTI5LjAsMTE5LjBdLCJjYW1lcmFfcmVwcm9jZXNzaW5nX2F2ZXJhZ2VfbGF0ZW5jeSI6MTQxLjV9XX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9jdHMtdGVzdC1tZXRyaWNzL0N0c1VpSG9zdFRlc3RDYXNlcy5yZXBvcnRsb2cuanNvbiBiL3Rvb2xzL2N0cy10ZXN0LW1ldHJpY3MvQ3RzVWlIb3N0VGVzdENhc2VzLnJlcG9ydGxvZy5qc29uCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzU1ZmUzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2N0cy10ZXN0LW1ldHJpY3MvQ3RzVWlIb3N0VGVzdENhc2VzLnJlcG9ydGxvZy5qc29uCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAoteyJ0ZXN0X2luc3RhbGxfdGltZSI6W3siaW5zdGFsbF90aW1lIjpbMTk1MC4wLDE3MjIuMCwxNzYyLjAsMTY3OC4wLDE3MzguMCwxNjk0LjAsMTc4Ny4wLDE3OTcuMCwxNzk5LjAsMTc4Ni4wXSwiaW5zdGFsbF90aW1lX2F2ZXJhZ2UiOjE3NzEuM30seyJpbnN0YWxsX3RpbWUiOlsxOTc2LjAsMTk4Ni4wLDE5MzAuMCwxNzI5LjAsMTg1OS4wLDE4NzUuMCwxOTA0LjAsMTgwNS4wLDE3NDguMCwxODc1LjBdLCJpbnN0YWxsX3RpbWVfYXZlcmFnZSI6MTg2OC43fV19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvY3RzLXRlc3QtbWV0cmljcy9SRUFETUUgYi90b29scy9jdHMtdGVzdC1tZXRyaWNzL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I2OGYzYS4uMDAwMDAwMAotLS0gYS90b29scy9jdHMtdGVzdC1tZXRyaWNzL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLVRoZSBwYXJzZV90ZXN0X21ldHJpY3MucHkgc2NyaXB0IGNhbiBiZSB1c2VkIHRvIHBhcnNlIHRlc3QgbWV0cmljcyBqc29uIGZpbGVzLiBSdW4gdGhlIGZvbGxvd2luZwotY29tbWFuZCB0byBzZWUgYSBkZW1vOgotcHl0aG9uIHBhcnNlX3Rlc3RfbWV0cmljcy5weSBDdHNDYW1lcmFUZXN0Q2FzZXMucmVwb3J0bG9nLmpzb24KLQotVG8gcGFyc2UgbXVsdGlwbGUgZmlsZXMsIGxpc3QgYWxsIGZpbGVzIGFzIGFyZ3VtZW50cy4gVHJ5IHRoZSBmb2xsb3dpbmc6Ci1weXRob24gcGFyc2VfdGVzdF9tZXRyaWNzLnB5IEN0c0NhbWVyYVRlc3RDYXNlcy5yZXBvcnRsb2cuanNvbiBDdHNVaUhvc3RUZXN0Q2FzZXMucmVwb3J0bG9nLmpzb24KLXB5dGhvbiBwYXJzZV90ZXN0X21ldHJpY3MucHkgKi5qc29uCi0KLVRlc3QgbWV0cmljcyBqc29uIGZpbGVzIGNhbiBiZSBmb3VuZCBpbiAkQ1RTX1JPT1QvcmVwb3NpdG9yeS9yZXN1bHRzLyRSRVNVTFRfRElSL3JlcG9ydC1sb2ctZmlsZXMvCi1kaXJlY3RvcnkuCi0KLVRoZSBNZXRyaWNzUGFyc2VyIGNsYXNzIGRlZmluZXMgZnVuY3Rpb25zIHRvIHBhcnNlIGEganNvbiBmaWxlLiBUaGUgX1BhcnNlIGZ1bmN0aW9uIHRha2VzIGEgZmlsZW5hbWUKLWFzIGlucHV0LCByZWFkcyB0aGUganNvbiBmaWxlIGFuZCBhZGRzIHRoZSBqc29uIG9iamVjdCB0byBqc29uX2RhdGEuIFRoZSBfUHJpbnRKc29uIGZ1bmN0aW9uCi10YWtlcyB0aGUgZmlsZW5hbWUgYW5kIGNvcnJlc3BvbmRpbmcganNvbl9kYXRhIGFuZCBwcmludHMgb3V0IHRoZSBzdHJlYW1zIGFzIGtleSwgdmFsdWUgcGFpcnMuCmRpZmYgLS1naXQgYS90b29scy9jdHMtdGVzdC1tZXRyaWNzL3BhcnNlX3Rlc3RfbWV0cmljcy5weSBiL3Rvb2xzL2N0cy10ZXN0LW1ldHJpY3MvcGFyc2VfdGVzdF9tZXRyaWNzLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MzllMzcyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2N0cy10ZXN0LW1ldHJpY3MvcGFyc2VfdGVzdF9tZXRyaWNzLnB5CisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotIyEvdXNyL2Jpbi9weXRob24KLSMgQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLWltcG9ydCBhcmdwYXJzZSwganNvbiwgc3lzCi0KLWNsYXNzIE1ldHJpY3NQYXJzZXIob2JqZWN0KToKLSAgIiIiRXhlY3V0b3Igb2YgdGhpcyB1dGlsaXR5IiIiCi0KLSAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgIHNlbGYuX3BhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCdQYXJzZSBDVFMgVGVzdCBtZXRyaWNzIGpzb25zJykKLSAgICBzZWxmLl9wYXJzZXIuYWRkX2FyZ3VtZW50KCdmaWxlbmFtZXMnLCBtZXRhdmFyPSdmaWxlbmFtZXMnLCBuYXJncz0nKycsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdmaWxlbmFtZXMgb2YgbWV0cmljcyBqc29ucyB0byBiZSBwYXJzZWQnKQotICAgIHNlbGYuX21ldHJpY3MgPSBbXQotCi0gIGRlZiBfUGFyc2VBcmdzKHNlbGYpOgotICAgIHNlbGYuX2FyZ3MgPSBzZWxmLl9wYXJzZXIucGFyc2VfYXJncygpCi0KLSAgZGVmIF9QYXJzZShzZWxmLCBmaWxlbmFtZSk6Ci0gICAganNvbl9maWxlID0gb3BlbihmaWxlbmFtZSkKLSAgICBqc29uX2RhdGEgPSBqc29uLmxvYWQoanNvbl9maWxlKQotICAgIHNlbGYuX21ldHJpY3MuYXBwZW5kKGpzb25fZGF0YSkKLSAgICBzZWxmLl9QcmludEpzb24oZmlsZW5hbWUsIGpzb25fZGF0YSkKLQotICBkZWYgX1ByaW50SnNvbihzZWxmLCBmaWxlbmFtZSwganNvbl9kYXRhKToKLSAgICBwcmludCAiXG5GaWxlbmFtZTogJXMiICUgZmlsZW5hbWUKLSAgICBzdHJlYW1fbmFtZXMgPSBqc29uX2RhdGEua2V5cygpCi0gICAgZm9yIHN0cmVhbV9uYW1lIGluIHN0cmVhbV9uYW1lczoKLSAgICAgIG1ldHJpY3NfbGlzdCA9IGpzb25fZGF0YS5nZXQoc3RyZWFtX25hbWUpCi0gICAgICBmb3IgbWV0cmljcyBpbiBtZXRyaWNzX2xpc3Q6Ci0gICAgICAgIHByaW50ICJcblN0cmVhbSBOYW1lOiAlcyIgJSBzdHJlYW1fbmFtZQotICAgICAgICBmb3Iga2V5IGluIG1ldHJpY3Mua2V5cygpOgotICAgICAgICAgIHByaW50ICJLZXk6ICVzIFx0IFZhbHVlOiAlcyIgJSAoa2V5LCBzdHIobWV0cmljcy5nZXQoa2V5KSkpCi0KLSAgZGVmIFJ1bihzZWxmKToKLSAgICBzZWxmLl9QYXJzZUFyZ3MoKQotICAgIHRyeToKLSAgICAgIGZvciBmaWxlbmFtZSBpbiBzZWxmLl9hcmdzLmZpbGVuYW1lczoKLSAgICAgICAgc2VsZi5fUGFyc2UoZmlsZW5hbWUpCi0gICAgZXhjZXB0IChJT0Vycm9yLCBWYWx1ZUVycm9yKSBhcyBlOgotICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgZQotICAgICAgcmFpc2UgS2V5Ym9hcmRJbnRlcnJ1cHQKLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgTWV0cmljc1BhcnNlcigpLlJ1bigpCi0KZGlmZiAtLWdpdCBhL3Rvb2xzL2N0cy10cmFkZWZlZC9BbmRyb2lkLm1rIGIvdG9vbHMvY3RzLXRyYWRlZmVkL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NGZiMDkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvY3RzLXRyYWRlZmVkL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCAuLi8uLi9jb21tb24vaG9zdC1zaWRlL3RyYWRlZmVkL3NyYykKLQotTE9DQUxfSkFWQV9SRVNPVVJDRV9ESVJTIDo9IHJlcwotTE9DQUxfSkFWQV9SRVNPVVJDRV9ESVJTICs9IC4uLy4uL2NvbW1vbi9ob3N0LXNpZGUvdHJhZGVmZWQvcmVzCi1MT0NBTF9NT0RVTEUgOj0gY3RzLXRyYWRlZmVkLWhhcm5lc3MKLUxPQ0FMX0pBVkFfTElCUkFSSUVTICs9IHRyYWRlZmVkIGNvbXBhdGliaWxpdHktaG9zdC11dGlsCi1pbmNsdWRlICQoQlVJTERfSE9TVF9KQVZBX0xJQlJBUlkpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfU1VJVEVfQlVJTERfTlVNQkVSIDo9ICQoQlVJTERfTlVNQkVSX0ZST01fRklMRSkKLUxPQ0FMX1NVSVRFX1RBUkdFVF9BUkNIIDo9ICQoVEFSR0VUX0FSQ0gpCi1MT0NBTF9TVUlURV9OQU1FIDo9IENUUwotTE9DQUxfU1VJVEVfRlVMTE5BTUUgOj0gIkNvbXBhdGliaWxpdHkgVGVzdCBTdWl0ZSIKLUxPQ0FMX1NVSVRFX1ZFUlNJT04gOj0gOC4xX3IxNwotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTICs9IGN0cy10cmFkZWZlZC1oYXJuZXNzCi0KLUxPQ0FMX01PRFVMRSA6PSBjdHMtdHJhZGVmZWQKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gZ2VuZXJhbC10ZXN0cwotaW5jbHVkZSBjdHMvZXJyb3JfcHJvbmVfcnVsZXMubWsKLWluY2x1ZGUgJChCVUlMRF9DT01QQVRJQklMSVRZX1NVSVRFKQotCi0jIEJ1aWxkIGFsbCBzdWItZGlyZWN0b3JpZXMKLWluY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL3Rvb2xzL2N0cy10cmFkZWZlZC9EeW5hbWljQ29uZmlnLnhtbCBiL3Rvb2xzL2N0cy10cmFkZWZlZC9EeW5hbWljQ29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA5ZTJhYS4uMDAwMDAwMAotLS0gYS90b29scy9jdHMtdHJhZGVmZWQvRHluYW1pY0NvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08IS0tIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxkeW5hbWljQ29uZmlnPgotICAgIDxlbnRyeSBrZXk9Im1lZGlhX2ZpbGVzX3VybCI+Ci0gICAgICAgICA8dmFsdWU+aHR0cHM6Ly9kbC5nb29nbGUuY29tL2RsL2FuZHJvaWQvY3RzL2FuZHJvaWQtY3RzLW1lZGlhLTEuNC56aXA8L3ZhbHVlPgotICAgIDwvZW50cnk+Ci08L2R5bmFtaWNDb25maWc+CmRpZmYgLS1naXQgYS90b29scy9jdHMtdHJhZGVmZWQvUkVBRE1FIGIvdG9vbHMvY3RzLXRyYWRlZmVkL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RlNDJmZS4uMDAwMDAwMAotLS0gYS90b29scy9jdHMtdHJhZGVmZWQvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotQ1RTIFRyYWRlIEZlZGVyYXRpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1DVFMgVHJhZGUgRmVkZXJhdGlvbiwgY3RzLXRyYWRlZmVkIGZvciBzaG9ydCwgaXMgdGhlIG5leHQKLWdlbmVyYXRpb24gdGVzdCBoYXJuZXNzIGZvciBDVFMuCi0KLWN0cy10cmFkZWZlZCBpcyBidWlsdCBvbiB0b3Agb2YgdGhlIEFuZHJvaWQgVHJhZGUgRmVkZXJhdGlvbiB0ZXN0IGhhcm5lc3MuCi0KLUl0IHdvcmtzIGluIGEgc2ltaWxhciBtYW5uZXIgdG8gdGhlIHByaW9yIENUUyBoYXJuZXNzLCBidXQgc3VwcG9ydHMgc29tZQotYWR2YW5jZWQgZmVhdHVyZXMgc3VjaCBhczoKLQotICAtIG1vZHVsYXIsIGZsZXhpYmxlIGV4dGVuc2libGUgZGVzaWduLiBjdHMtdHJhZGVmZWQgY2FuIGJlIGV4dGVuZGVkIHRvCi1zdXBwb3J0IHJ1bm5pbmcgQ1RTIGluIGEgY29udGludW91cyB0ZXN0IGVudmlyb25tZW50LgotICAtIHN1cHBvcnRzIHNoYXJkaW5nIGEgQ1RTIHRlc3QgcnVuIGFjcm9zcyBtdWx0aXBsZSBkZXZpY2VzIGluIHBhcmFsbGVsCi0gIC0gYXV0b21hdGljYWxseSBjb250aW51ZSBhIENUUyB0ZXN0IHJ1biBvbiBhbm90aGVyIGRldmljZSBpZiBjb25uZWN0aW9uCi1pcyBsb3N0Ci0KLUNvbmZpZ3VyaW5nIGN0cy10cmFkZWZlZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLTEuIEVuc3VyZSAnYWRiJyBpcyBpbiB5b3VyIGN1cnJlbnQgUEFUSC4gYWRiIGNhbiBiZSBmb3VuZCBpbiB0aGUKLUFuZHJvaWQgU0RLIGF2YWlsYWJsZSBmcm9tIGh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20KLQotRXhhbXBsZToKLSAgUEFUSD0kUEFUSDovaG9tZS9teXVzZXIvYW5kcm9pZC1zZGstbGludXhfeDg2L3BsYXRmb3JtLXRvb2xzCi0KLTIuIEZvbGxvdyB0aGUgJ1NldHRpbmcgdXAgeW91ciBkZXZpY2UnIHN0ZXBzIGRvY3VtZW50ZWQgaW4gdGhlCi1DVFMgVXNlciBNYW51YWwuIFRoZSBDVFMgVXNlciBNYW51YWwgY2FuIGJlIGRvd25sb2FkZWQgYXQKLWh0dHA6Ly9zb3VyY2UuYW5kcm9pZC5jb20vY29tcGF0aWJpbGl0eS9kb3dubG9hZHMuaHRtbAotCi0zLiBDb25uZWN0IHRoZSBkZXZpY2UgdG8gdGhlIGhvc3QgbWFjaGluZS4KLQotNC4gRW5zdXJlIGRldmljZSBpcyB2aXNpYmxlIHZpYSAnYWRiIGRldmljZXMnCi0KLVVzaW5nIGN0cy10cmFkZWZlZAotLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UbyBydW4gYSB0ZXN0IHBsYW4gb24gYSBzaW5nbGUgZGV2aWNlOgotCi0xLiBNYWtlIHN1cmUgeW91IGhhdmUgYXQgbGVhc3Qgb25lIGRldmljZSBjb25uZWN0ZWQKLTIuIExhdW5jaCB0aGUgY3RzLXRyYWRlZmVkIGNvbnNvbGUgYnkgcnVubmluZyB0aGUgJ2N0cy10cmFkZWZlZCcuIElmIHlvdSd2ZQotZG93bmxvYWRlZCBhbmQgZXh0cmFjdGVkIHRoZSBDVFMgemlwLCB0aGUgc2NyaXB0IGNhbiBiZSBmb3VuZCBhdAotICBhbmRyb2lkLWN0cy90b29scy9jdHMtdHJhZGVmZWQKLU9yIGVsc2UgaWYgeW91IGFyZSB3b3JraW5nIGZyb20gdGhlIEFuZHJvaWQgc291cmNlIHRyZWUgYW5kIGhhdmUgcnVuIG1ha2UgY3RzLAotdGhlIHNjcmlwdCBjYW4gYmUgZm91bmQgYXQKLSAgb3V0L2hvc3QvbGludXgteDg2L2N0cy9hbmRyb2lkLWN0cy90b29scy9jdHMtdHJhZGVmZWQKLTMuIFR5cGU6Ci0ncnVuIGN0cycgdG8gcnVuIHRoZSBkZWZhdWx0IENUUyBwbGFuCi0KLVNvbWUgb3RoZXIgdXNlZnVsIGNvbW1hbmRzIGFyZQotCi1UbyBydW4gYSB0ZXN0IG1vZHVsZToKLSdydW4gY3RzIC0tbW9kdWxlIDxtb2R1bGVfbmFtZT4nCi0KLVRvIHJ1biBhIHNwZWNpZmljIHRlc3Q6Ci0ncnVuIGN0cyAtLW1vZHVsZSA8bW9kdWxlX25hbWU+IC0tdGVzdCA8dGVzdF9uYW1lPicKLQotVG8gc2hhcmQgYSBwbGFuIHRlc3QgcnVuIG9uIG11bHRpcGxlIGRldmljZXMKLSdydW4gY3RzIC0tc2hhcmRzIDxudW1iZXIgb2Ygc2hhcmRzPgotbm90ZTogYWxsIGNvbm5lY3RlZCBkZXZpY2VzIG11c3QgYmUgcnVubmluZyB0aGUgc2FtZSBidWlsZAotCi1Gb3IgbW9yZSBvcHRpb25zOgotJ3J1biBjdHMgLS1oZWxwJwotCi1DVFMgVHJhZGVmZWQgRGV2ZWxvcG1lbnQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotU2VlIGh0dHA6Ly9zb3VyY2UuYW5kcm9pZC5jb20gZm9yIGluc3RydWN0aW9ucyBvbiBvYnRhaW5pbmcgdGhlIEFuZHJvaWQKLXBsYXRmb3JtIHNvdXJjZSBjb2RlIGFuZCBzZXR0aW5nIHVwIGEgYnVpbGQgZW52aXJvbm1lbnQuCi0KLVRoZSBzb3VyY2UgZm9yIHRoZSBDVFMgZXh0ZW5zaW9ucyBmb3IgdHJhZGVmZWQgY2FuIGJlIGZvdW5kIGF0Ci08YW5kcm9pZCBzb3VyY2Ugcm9vdD4vY3RzL3Rvb2xzL3RyYWRlZmVkLWhvc3QKLQotVGhlIHNvdXJjZSBmb3IgdGhlIHRyYWRlZmVkIGZyYW1ld29yayBjYW4gYmUgZm91bmQgb24gdGhlICd0cmFkZWZlZCcgYnJhbmNoLgotCi1QZXJmb3JtIHRoZXNlIHN0ZXBzIHRvIGJ1aWxkIGFuZCBydW4gY3RzLXRyYWRlZmVkIGZyb20gdGhlIGRldmVsb3BtZW50Ci1lbnZpcm9ubWVudDoKLWNkIDxwYXRoIHRvIGFuZHJvaWQgc291cmNlIHJvb3Q+Ci1tYWtlIGN0cwotY3RzLXRyYWRlZmVkCi0KLU1vcmUgZG9jdW1lbnRhdGlvbiBhbmQgZGV0YWlscyBvbiB1c2luZyBhbmQgZXh0ZW5kaW5nIHRyYWRlIGZlZGVyYXRpb24gd2lsbAotYmUgZm9ydGhjb21pbmcgaW4gdGhlIG5lYXIgZnV0dXJlLgotCmRpZmYgLS1naXQgYS90b29scy9jdHMtdHJhZGVmZWQvZXRjL0FuZHJvaWQubWsgYi90b29scy9jdHMtdHJhZGVmZWQvZXRjL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMzc2ZGIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvY3RzLXRyYWRlZmVkL2V0Yy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLUxPQ0FMX1BSRUJVSUxUX0VYRUNVVEFCTEVTIDo9IGN0cy10cmFkZWZlZAotaW5jbHVkZSAkKEJVSUxEX0hPU1RfUFJFQlVJTFQpCi0KZGlmZiAtLWdpdCBhL3Rvb2xzL2N0cy10cmFkZWZlZC9ldGMvY3RzLXRyYWRlZmVkIGIvdG9vbHMvY3RzLXRyYWRlZmVkL2V0Yy9jdHMtdHJhZGVmZWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkzZjc4MjQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvY3RzLXRyYWRlZmVkL2V0Yy9jdHMtdHJhZGVmZWQKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotIyEvYmluL2Jhc2gKLQotIyBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSMgbGF1bmNoZXIgc2NyaXB0IGZvciBjdHMtdHJhZGVmZWQgaGFybmVzcwotIyBjYW4gYmUgdXNlZCBmcm9tIGFuIEFuZHJvaWQgYnVpbGQgZW52aXJvbm1lbnQsIG9yIGEgc3RhbmRhbG9uZSBjdHMgemlwCi0KLWNoZWNrRmlsZSgpIHsKLSAgICBpZiBbICEgLWYgIiQxIiBdOyB0aGVuCi0gICAgICAgIGVjaG8gIlVuYWJsZSB0byBsb2NhdGUgJDEiCi0gICAgICAgIGV4aXQKLSAgICBmaTsKLX0KLQotY2hlY2tQYXRoKCkgewotICAgIGlmICEgdHlwZSAtUCAkMSAmPiAvZGV2L251bGw7IHRoZW4KLSAgICAgICAgZWNobyAiVW5hYmxlIHRvIGZpbmQgJDEgaW4gcGF0aC4iCi0gICAgICAgIGV4aXQKLSAgICBmaTsKLX0KLQotIyByZWFkbGluayBkb2VzIG5vdCB3b3JrIG9uIE1hY09TIHNvIHJlbHkgb24gb3VyIG93biByZWFscGF0aAotcmVhbHBhdGgoKSB7Ci0gICAgW1sgJDEgPSAvKiBdXSAmJiBlY2hvICIkMSIgfHwgZWNobyAiJFBXRC8kezEjLi99IgotfQotCi1jaGVja1BhdGggYWFwdAotY2hlY2tQYXRoIGFkYgotY2hlY2tQYXRoIGphdmEKLQotIyBjaGVjayBqYXZhIHZlcnNpb24KLWlmIFsgIiR7RVhQRVJJTUVOVEFMX1VTRV9PUEVOSkRLOX0iID09ICIiIF07IHRoZW4KLSAgICBKQVZBX1ZFUlNJT049JChqYXZhIC12ZXJzaW9uIDI+JjEgfCBoZWFkIC1uIDIgfCBncmVwICdbICJdMVwuWzY3OF1bXC4gIiQkXScpCi0gICAgaWYgWyAiJHtKQVZBX1ZFUlNJT059IiA9PSAiIiBdOyB0aGVuCi0gICAgICAgIGVjaG8gIldyb25nIGphdmEgdmVyc2lvbi4gMS42LCAxLjcgb3IgMS44IGlzIHJlcXVpcmVkLiIKLSAgICAgICAgZXhpdAotICAgIGZpCi1lbHNlCi0gICAgSkFWQV9WRVJTSU9OPSQoamF2YSAtdmVyc2lvbiAyPiYxIHwgaGVhZCAtbiAyIHwgZ3JlcCAnXmphdmEgLiogIjkuKicpCi0gICAgaWYgWyAiJHtKQVZBX1ZFUlNJT059IiA9PSAiIiBdOyB0aGVuCi0gICAgICAgIGVjaG8gIldyb25nIGphdmEgdmVyc2lvbi4gVmVyc2lvbiA5IGlzIHJlcXVpcmVkLiIKLSAgICAgICAgZXhpdAotICAgIGZpCi1maQotCi0jIGNoZWNrIGRlYnVnIGZsYWcgYW5kIHNldCB1cCByZW1vdGUgZGVidWdnaW5nCi1pZiBbIC1uICIke1RGX0RFQlVHfSIgXTsgdGhlbgotICBpZiBbIC16ICIke1RGX0RFQlVHX1BPUlR9IiBdOyB0aGVuCi0gICAgVEZfREVCVUdfUE9SVD0xMDA4OAotICBmaQotICBSREJHX0ZMQUc9LWFnZW50bGliOmpkd3A9dHJhbnNwb3J0PWR0X3NvY2tldCxzZXJ2ZXI9eSxzdXNwZW5kPXksYWRkcmVzcz0ke1RGX0RFQlVHX1BPUlR9Ci1maQotCi0jIGdldCBPUwotSE9TVD1gdW5hbWVgCi1pZiBbICIkSE9TVCIgPT0gIkxpbnV4IiBdOyB0aGVuCi0gICAgT1M9ImxpbnV4LXg4NiIKLWVsaWYgWyAiJEhPU1QiID09ICJEYXJ3aW4iIF07IHRoZW4KLSAgICBPUz0iZGFyd2luLXg4NiIKLWVsc2UKLSAgICBlY2hvICJVbnJlY29nbml6ZWQgT1MiCi0gICAgZXhpdAotZmkKLQotIyBjaGVjayBpZiBpbiBBbmRyb2lkIGJ1aWxkIGVudgotaWYgWyAhIC16ICIke0FORFJPSURfQlVJTERfVE9QfSIgXTsgdGhlbgotICAgIGlmIFsgISAteiAiJHtBTkRST0lEX0hPU1RfT1VUfSIgXTsgdGhlbgotICAgICAgQ1RTX1JPT1Q9JHtBTkRST0lEX0hPU1RfT1VUfS9jdHMKLSAgICBlbHNlCi0gICAgICBDVFNfUk9PVD0ke0FORFJPSURfQlVJTERfVE9QfS8ke09VVF9ESVI6LW91dH0vaG9zdC8ke09TfS9jdHMKLSAgICBmaQotICAgIGlmIFsgISAtZCAke0NUU19ST09UfSBdOyB0aGVuCi0gICAgICAgIGVjaG8gIkNvdWxkIG5vdCBmaW5kICRDVFNfUk9PVCBpbiBBbmRyb2lkIGJ1aWxkIGVudmlyb25tZW50LiBUcnkgJ21ha2UgY3RzJyIKLSAgICAgICAgZXhpdAotICAgIGZpOwotZmk7Ci0KLWlmIFsgLXogJHtDVFNfUk9PVH0gXTsgdGhlbgotICAgICMgYXNzdW1lIHdlJ3JlIGluIGFuIGV4dHJhY3RlZCBjdHMgaW5zdGFsbAotICAgIENUU19ST09UPSIkKGRpcm5hbWUgJChyZWFscGF0aCAkMCkpLy4uLy4uIgotZmk7Ci0KLUpBUl9ESVI9JHtDVFNfUk9PVH0vYW5kcm9pZC1jdHMvdG9vbHMKLUpBUlM9InRyYWRlZmVkCi0gIGhvc3R0ZXN0bGliCi0gIGNvbXBhdGliaWxpdHktaG9zdC11dGlsCi0gIGNvbXBhdGliaWxpdHktaG9zdC11dGlsLXRlc3RzCi0gIGN0cy10cmFkZWZlZAotICBjdHMtdHJhZGVmZWQtdGVzdHMKLSAgY29tcGF0aWJpbGl0eS1jb21tb24tdXRpbC10ZXN0cwotICBjb21wYXRpYmlsaXR5LXRyYWRlZmVkLXRlc3RzCi0gIGhvc3QtbGlicHJvdG9idWYtamF2YS1mdWxsIgotCi1mb3IgSkFSIGluICRKQVJTOyBkbwotICAgIGNoZWNrRmlsZSAke0pBUl9ESVJ9LyR7SkFSfS5qYXIKLSAgICBKQVJfUEFUSD0ke0pBUl9QQVRIfToke0pBUl9ESVJ9LyR7SkFSfS5qYXIKLWRvbmUKLQotT1BUSU9OQUxfSkFSUz0iCi0gIGdvb2dsZS10cmFkZWZlZAotICBnb29nbGUtdHJhZGVmZWQtdGVzdHMKLSAgZ29vZ2xlLXRmLXByb2QtdGVzdHMiCi0KLWZvciBKQVIgaW4gJE9QVElPTkFMX0pBUlM7IGRvCi0gICAgaWYgWyAtZiAiJHtKQVJfRElSfS8ke0pBUn0uamFyIiBdOyB0aGVuCi0gICAgICAgIEpBUl9QQVRIPSR7SkFSX1BBVEh9OiR7SkFSX0RJUn0vJHtKQVJ9LmphcgotICAgIGZpOwotZG9uZQotCi0jIGxvYWQgYW55IHNoYXJlZCBsaWJyYXJpZXMgZm9yIGhvc3Qtc2lkZSBleGVjdXRhYmxlcwotTElCX0RJUj0ke0NUU19ST09UfS9hbmRyb2lkLWN0cy9saWIKLWlmIFsgIiRIT1NUIiA9PSAiTGludXgiIF07IHRoZW4KLSAgICBMRF9MSUJSQVJZX1BBVEg9JHtMSUJfRElSfToke0xJQl9ESVJ9NjQ6JHtMRF9MSUJSQVJZX1BBVEh9Ci0gICAgZXhwb3J0IExEX0xJQlJBUllfUEFUSAotZWxpZiBbICIkSE9TVCIgPT0gIkRhcndpbiIgXTsgdGhlbgotICAgIERZTERfTElCUkFSWV9QQVRIPSR7TElCX0RJUn06JHtMSUJfRElSfTY0OiR7RFlMRF9MSUJSQVJZX1BBVEh9Ci0gICAgZXhwb3J0IERZTERfTElCUkFSWV9QQVRICi1maQotCi0jIGluY2x1ZGUgYW55IGhvc3Qtc2lkZSB0ZXN0IGphcnMKLWZvciBqIGluICR7Q1RTX1JPT1R9L2FuZHJvaWQtY3RzL3Rlc3RjYXNlcy8qLmphcjsgZG8KLSAgICBKQVJfUEFUSD0ke0pBUl9QQVRIfTokagotZG9uZQotCi1qYXZhICRSREJHX0ZMQUcgLVhteDRnIC1YWDorSGVhcER1bXBPbk91dE9mTWVtb3J5RXJyb3IgLWNwICR7SkFSX1BBVEh9IC1EQ1RTX1JPT1Q9JHtDVFNfUk9PVH0gY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQuY29tbWFuZC5Db21wYXRpYmlsaXR5Q29uc29sZSAiJEAiCi0KZGlmZiAtLWdpdCBhL3Rvb2xzL2N0cy10cmFkZWZlZC9yZXMvY29uZmlnL2Jhc2ljLXJlcG9ydGVycy54bWwgYi90b29scy9jdHMtdHJhZGVmZWQvcmVzL2NvbmZpZy9iYXNpYy1yZXBvcnRlcnMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmRkZjI0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2N0cy10cmFkZWZlZC9yZXMvY29uZmlnL2Jhc2ljLXJlcG9ydGVycy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZ3VyYXRpb24gd2l0aCBiYXNpYyBDVFMgcmVwb3J0ZXJzIiA+Ci08L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS90b29scy9jdHMtdHJhZGVmZWQvcmVzL2NvbmZpZy9jb2xsZWN0LXRlc3RzLW9ubHkueG1sIGIvdG9vbHMvY3RzLXRyYWRlZmVkL3Jlcy9jb25maWcvY29sbGVjdC10ZXN0cy1vbmx5LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQxNzlhMi4uMDAwMDAwMAotLS0gYS90b29scy9jdHMtdHJhZGVmZWQvcmVzL2NvbmZpZy9jb2xsZWN0LXRlc3RzLW9ubHkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJSdW5zIENUUyBmcm9tIGEgcHJlLWV4aXN0aW5nIENUUyBpbnN0YWxsYXRpb24iPgotCi0gICAgPGluY2x1ZGUgbmFtZT0iY3RzIiAvPgotCi0gICAgPCEtLSBUaGlzIHRlbGxzIGN0cy10cmFkZWZlZCBhbmQgdGhlIHNlcnZlciB3aGF0IHRoZSBwbGFuIG5hbWUgaXMsIHJlcG9ydHMgdGhhdCBoYXZlIHRoaXMgcGxhbgotICAgICAgICAgbmFtZSBzaG91bGQgbm90IGJlIGFjY2VwdGVkLCBhcyBpdCBkb2Vzbid0IGFjdHVhbGx5IHJ1biB0aGUgdGVzdHMgaXQgc2ltcGx5IG1hcmtzIGFsbCBvZgotICAgICAgICAgdGhlbSBhcyBwYXNzZWQuCi0gICAgICAgICBPYnZpb3VzbHkgbm8gb25lIHdvdWxkIG1vZGlmeSB0aGUgcmVwb3J0IGJlZm9yZSB1cGxvYWRpbmcgdG8gZmFsc2lmeSB0aGlzCi0gICAgICAgICBpbmZvcm1hdGlvbiwgYXMgdGhhdCB3b3VsZCBiZSBkaXNob25lc3QsIGFuZCBkaXNob25lc3R5IGtpbGxzIGtpdHRlbnMgOicoIC0tPgotICAgIDxvcHRpb24gbmFtZT0icGxhbiIgdmFsdWU9ImNvbGxlY3QtdGVzdHMtb25seSIgLz4KLQotICAgIDxvcHRpb24gbmFtZT0ic2tpcC1wcmVjb25kaXRpb25zIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9InNraXAtY29ubmVjdGl2aXR5LWNoZWNrIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9InByZXBhcmVyLXdoaXRlbGlzdCIgdmFsdWU9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJwcmVwYXJlci13aGl0ZWxpc3QiIHZhbHVlPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50YXJnZXRwcmVwLkFwa0luc3RhbGxlciIgLz4KLSAgICA8b3B0aW9uIG5hbWU9InByZXBhcmVyLXdoaXRlbGlzdCIgdmFsdWU9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRhcmdldHByZXAuRmlsZVB1c2hlciIgLz4KLQotICAgIDxvcHRpb24gbmFtZT0iY29tcGF0aWJpbGl0eTpjb2xsZWN0LXRlc3RzLW9ubHkiIHZhbHVlPSJ0cnVlIiAvPgotCi08L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS90b29scy9jdHMtdHJhZGVmZWQvcmVzL2NvbmZpZy9jdHMtYXV0b21hdGVkLnhtbCBiL3Rvb2xzL2N0cy10cmFkZWZlZC9yZXMvY29uZmlnL2N0cy1hdXRvbWF0ZWQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWRmYjE1Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2N0cy10cmFkZWZlZC9yZXMvY29uZmlnL2N0cy1hdXRvbWF0ZWQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJSdW5zIENUUyB3aXRoIGNvbW1vbiBvcHRpb25zIHNldCBmb3IgYW4gYXV0b21hdGVkIHJ1biBvbiB1c2VyZGVidWcvZW5nIGJ1aWxkcyI+Ci0KLSAgICA8aW5jbHVkZSBuYW1lPSJjdHMiIC8+Ci0KLSAgICA8b3B0aW9uIG5hbWU9InBsYW4iIHZhbHVlPSJjdHMiIC8+Ci0KLSAgICA8b3B0aW9uIG5hbWU9InNraXAtcHJlY29uZGl0aW9ucyIgdmFsdWU9ImZhbHNlIiAvPgotICAgIDxvcHRpb24gbmFtZT0ic2tpcC1jb25uZWN0aXZpdHktY2hlY2siIHZhbHVlPSJmYWxzZSIgLz4KLQotICAgIDwhLS0gVGVsbCBhbGwgQW5kcm9pZEpVbml0VGVzdHMgdG8gZXhjbHVkZSBjZXJ0YWluIGFubm90YXRpb25zIC0tPgotICAgIDxvcHRpb24gbmFtZT0iY29tcGF0aWJpbGl0eTp0ZXN0LWFyZyIgdmFsdWU9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkFuZHJvaWRKVW5pdFRlc3Q6ZXhjbHVkZS1hbm5vdGF0aW9uOmFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5SZXN0cmljdGVkQnVpbGRUZXN0IiAvPgotCi0gICAgPCEtLSBUZWxsIGFsbCBIb3N0VGVzdHMgdG8gZXhjbHVkZSBjZXJ0YWluIGFubm90YXRpb25zIC0tPgotICAgIDxvcHRpb24gbmFtZT0iY29tcGF0aWJpbGl0eTp0ZXN0LWFyZyIgdmFsdWU9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkhvc3RUZXN0OmV4Y2x1ZGUtYW5ub3RhdGlvbjphbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUmVzdHJpY3RlZEJ1aWxkVGVzdCIgLz4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6dGVzdC1hcmciIHZhbHVlPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5KYXJIb3N0VGVzdDpleGNsdWRlLWFubm90YXRpb246YW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlJlc3RyaWN0ZWRCdWlsZFRlc3QiIC8+Ci0KLTwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3Rvb2xzL2N0cy10cmFkZWZlZC9yZXMvY29uZmlnL2N0cy1jYW1lcmEueG1sIGIvdG9vbHMvY3RzLXRyYWRlZmVkL3Jlcy9jb25maWcvY3RzLWNhbWVyYS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3Mzc3YjQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvY3RzLXRyYWRlZmVkL3Jlcy9jb25maWcvY3RzLWNhbWVyYS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IlJ1bnMgQ1RTLWNhbWVyYSBmcm9tIGEgcHJlLWV4aXN0aW5nIENUUyBpbnN0YWxsYXRpb24iPgotCi0gICAgPGluY2x1ZGUgbmFtZT0iY3RzIiAvPgotCi0gICAgPG9wdGlvbiBuYW1lPSJwbGFuIiB2YWx1ZT0iY3RzLWNhbWVyYSIgLz4KLQotICAgIDwhLS0gQWxsIGNhbWVyYSBDVFMgdGVzdHMgLS0+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb21wYXRpYmlsaXR5OmluY2x1ZGUtZmlsdGVyIiB2YWx1ZT0iQ3RzQ2FtZXJhVGVzdENhc2VzIiAvPgotCi0gICAgPCEtLSBPdGhlciBjYW1lcmEgcmVsYXRlZCBDVFMgdGVzdHMgLS0+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb21wYXRpYmlsaXR5OmluY2x1ZGUtZmlsdGVyIgotICAgICAgICB2YWx1ZT0iQ3RzQXBwVGVzdENhc2VzIGFuZHJvaWQuYXBwLmN0cy5TeXN0ZW1GZWF0dXJlc1Rlc3QjdGVzdENhbWVyYUZlYXR1cmVzIi8+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb21wYXRpYmlsaXR5OmluY2x1ZGUtZmlsdGVyIgotICAgICAgICB2YWx1ZT0iQ3RzUGVybWlzc2lvblRlc3RDYXNlcyBhbmRyb2lkLnBlcm1pc3Npb24uY3RzLkNhbWVyYVBlcm1pc3Npb25UZXN0Ii8+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb21wYXRpYmlsaXR5OmluY2x1ZGUtZmlsdGVyIgotICAgICAgICB2YWx1ZT0iQ3RzUGVybWlzc2lvblRlc3RDYXNlcyBhbmRyb2lkLnBlcm1pc3Npb24uY3RzLkNhbWVyYTJQZXJtaXNzaW9uVGVzdCIvPgotCi08L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS90b29scy9jdHMtdHJhZGVmZWQvcmVzL2NvbmZpZy9jdHMtY29tbW9uLnhtbCBiL3Rvb2xzL2N0cy10cmFkZWZlZC9yZXMvY29uZmlnL2N0cy1jb21tb24ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTljYWQxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2N0cy10cmFkZWZlZC9yZXMvY29uZmlnL2N0cy1jb21tb24ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb21tb24gY29uZmlndXJhdGlvbiBmb3IgY3RzIGFuZCBjdHMtcmVmZXJlbmNlLWFvc3AiPgotCi0gICAgPGluY2x1ZGUgbmFtZT0iZXZlcnl0aGluZyIgLz4KLSAgICA8aW5jbHVkZSBuYW1lPSJjdHMtcHJlY29uZGl0aW9ucyIgLz4KLSAgICA8aW5jbHVkZSBuYW1lPSJjdHMtc3lzdGVtLWNoZWNrZXJzIiAvPgotICAgIDxpbmNsdWRlIG5hbWU9ImN0cy1rbm93bi1mYWlsdXJlcyIgLz4KLQotICAgIDxvcHRpb24gbmFtZT0idGVzdC10YWciIHZhbHVlPSJjdHMiIC8+Ci0KLSAgICA8b3B0aW9uIG5hbWU9ImVuYWJsZS1yb290IiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgPCEtLSByZXRhaW4gMjAwTUIgb2YgaG9zdCBsb2cgLS0+Ci0gICAgPG9wdGlvbiBuYW1lPSJtYXgtbG9nLXNpemUiIHZhbHVlPSIyMDAiIC8+Ci0gICAgPCEtLSAgcmV0YWluIDIwME1CIG9mIGxvZ2NhdCAtLT4KLSAgICA8b3B0aW9uIG5hbWU9Im1heC10bXAtbG9nY2F0LWZpbGUiIHZhbHVlPSIyMDk3MTUyMDAiIC8+Ci0KLSAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlJ1bkNvbW1hbmRUYXJnZXRQcmVwYXJlciI+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0icnVuLWNvbW1hbmQiIHZhbHVlPSJzZXR0aW5ncyBwdXQgZ2xvYmFsIHBhY2thZ2VfdmVyaWZpZXJfZW5hYmxlIDAiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0idGVhcmRvd24tY29tbWFuZCIgdmFsdWU9InNldHRpbmdzIHB1dCBnbG9iYWwgcGFja2FnZV92ZXJpZmllcl9lbmFibGUgMSIvPgotICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgotCi0gICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGFyZ2V0cHJlcC5Qcm9wZXJ0eUNoZWNrIj4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJwcm9wZXJ0eS1uYW1lIiB2YWx1ZT0icm8uYnVpbGQudHlwZSIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJleHBlY3RlZC12YWx1ZSIgdmFsdWU9InVzZXIiLz4gPCEtLSBEZXZpY2Ugc2hvdWxkIGhhdmUgdXNlciBidWlsZCAtLT4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJ0aHJvdy1lcnJvciIgdmFsdWU9ImZhbHNlIi8+IDwhLS0gT25seSBwcmludCB3YXJuaW5nIGlmIG5vdCB1c2VyIGJ1aWxkIC0tPgotICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgotCi0gICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGFyZ2V0cHJlcC5Qcm9wZXJ0eUNoZWNrIj4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJwcm9wZXJ0eS1uYW1lIiB2YWx1ZT0icm8ucHJvZHVjdC5sb2NhbGUiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iZXhwZWN0ZWQtdmFsdWUiIHZhbHVlPSJlbi1VUyIvPiA8IS0tIERldmljZSBsb2NhbGUgc2hvdWxkIGJlIFVTIEVuZ2xpc2ggLS0+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0idGhyb3ctZXJyb3IiIHZhbHVlPSJmYWxzZSIvPiA8IS0tIE9ubHkgcHJpbnQgd2FybmluZyBpZiBub3QgZW4tVVMgLS0+Ci0gICAgPC90YXJnZXRfcHJlcGFyZXI+Ci0gICAgPHRlbXBsYXRlLWluY2x1ZGUgbmFtZT0icmVwb3J0ZXJzIiBkZWZhdWx0PSJiYXNpYy1yZXBvcnRlcnMiIC8+Ci0KLSAgICA8IS0tIEluY2x1ZGUgYWRkaXRpb25hbCB0ZXN0IG1ldGFkYXRhIG91dHB1dC4gLS0+Ci0gICAgPHRlbXBsYXRlLWluY2x1ZGUgbmFtZT0ibWV0YWRhdGEtcmVwb3J0ZXJzIiBkZWZhdWx0PSJlbXB0eSIgLz4KLQotPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvdG9vbHMvY3RzLXRyYWRlZmVkL3Jlcy9jb25maWcvY3RzLWRldi54bWwgYi90b29scy9jdHMtdHJhZGVmZWQvcmVzL2NvbmZpZy9jdHMtZGV2LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGViZGExYi4uMDAwMDAwMAotLS0gYS90b29scy9jdHMtdHJhZGVmZWQvcmVzL2NvbmZpZy9jdHMtZGV2LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iUnVucyBDVFMgd2l0aCBjb21tb24gb3B0aW9ucyBzZXQgZGV2ZWxvcGVyIHdvcmtmbG93OiBza2lwcyBtb3N0IGNoZWNrcyI+Ci0KLSAgICA8aW5jbHVkZSBuYW1lPSJjdHMiIC8+Ci0KLSAgICA8b3B0aW9uIG5hbWU9ImxvZy1sZXZlbCIgdmFsdWU9InZlcmJvc2UiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJza2lwLXByZWNvbmRpdGlvbnMiIHZhbHVlPSJ0cnVlIiAvPgotICAgIDxvcHRpb24gbmFtZT0ic2tpcC1kZXZpY2UtaW5mbyIgdmFsdWU9InRydWUiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJyZXN1bHQtcmVwb3J0ZXI6Y29tcHJlc3MtbG9ncyIgdmFsdWU9ImZhbHNlIiAvPgotCi0gICAgPG9wdGlvbiBuYW1lPSJwbGFuIiB2YWx1ZT0iY3RzLWRldiIgLz4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6c2tpcC1hbGwtc3lzdGVtLXN0YXR1cy1jaGVjayIgdmFsdWU9InRydWUiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb21wYXRpYmlsaXR5OnByaW1hcnktYWJpLW9ubHkiIHZhbHVlPSJ0cnVlIiAvPgotCi08L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS90b29scy9jdHMtdHJhZGVmZWQvcmVzL2NvbmZpZy9jdHMtZGV2aWNlLWZpbGVzLnhtbCBiL3Rvb2xzL2N0cy10cmFkZWZlZC9yZXMvY29uZmlnL2N0cy1kZXZpY2UtZmlsZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmEzZTI4Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2N0cy10cmFkZWZlZC9yZXMvY29uZmlnL2N0cy1kZXZpY2UtZmlsZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDVFMgZGV2aWNlIGZpbGVzIGNvbGxlY3Rpb24iPgotICAgIDxvcHRpb24gbmFtZT0icGxhbiIgdmFsdWU9ImN0cy1kZXZpY2UtZmlsZXMiIC8+Ci0KLSAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50YXJnZXRwcmVwLkRldmljZUZpbGVDb2xsZWN0b3IiPgotICAgICAgICA8b3B0aW9uIG5hbWU9InNyYy1maWxlIiB2YWx1ZT0iL3N5cy9mcy9zZWxpbnV4L3BvbGljeSIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJkZXN0LWZpbGUiIHZhbHVlPSJ2aW50Zi1maWxlcy9zZXBvbGljeSIvPgotICAgICAgICA8b3B0aW9uIG5hbWU9InByb3BlcnR5IiBrZXk9InJvLnRyZWJsZS5lbmFibGVkIiB2YWx1ZT0idHJ1ZSIvPgotICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgotCi0gICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGFyZ2V0cHJlcC5EZXZpY2VGaWxlQ29sbGVjdG9yIj4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJzcmMtZmlsZSIgdmFsdWU9Ii9zeXN0ZW0vbWFuaWZlc3QueG1sIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9ImRlc3QtZmlsZSIgdmFsdWU9InZpbnRmLWZpbGVzL2ZyYW1ld29ya19tYW5pZmVzdC54bWwiLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJwcm9wZXJ0eSIga2V5PSJyby50cmVibGUuZW5hYmxlZCIgdmFsdWU9InRydWUiLz4KLSAgICA8L3RhcmdldF9wcmVwYXJlcj4KLQotICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRhcmdldHByZXAuRGV2aWNlRmlsZUNvbGxlY3RvciI+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ic3JjLWZpbGUiIHZhbHVlPSIvc3lzdGVtL2NvbXBhdGliaWxpdHlfbWF0cml4LnhtbCIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJkZXN0LWZpbGUiIHZhbHVlPSJ2aW50Zi1maWxlcy9mcmFtZXdvcmtfY29tcGF0aWJpbGl0eV9tYXRyaXgueG1sIi8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0icHJvcGVydHkiIGtleT0icm8udHJlYmxlLmVuYWJsZWQiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgPC90YXJnZXRfcHJlcGFyZXI+Ci0KLSAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50YXJnZXRwcmVwLkRldmljZUZpbGVDb2xsZWN0b3IiPgotICAgICAgICA8b3B0aW9uIG5hbWU9InNyYy1maWxlIiB2YWx1ZT0iL3ZlbmRvci9tYW5pZmVzdC54bWwiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iZGVzdC1maWxlIiB2YWx1ZT0idmludGYtZmlsZXMvZGV2aWNlX21hbmlmZXN0LnhtbCIvPgotICAgICAgICA8b3B0aW9uIG5hbWU9InByb3BlcnR5IiBrZXk9InJvLnRyZWJsZS5lbmFibGVkIiB2YWx1ZT0idHJ1ZSIvPgotICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgotCi0gICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGFyZ2V0cHJlcC5EZXZpY2VGaWxlQ29sbGVjdG9yIj4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJzcmMtZmlsZSIgdmFsdWU9Ii92ZW5kb3IvY29tcGF0aWJpbGl0eV9tYXRyaXgueG1sIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9ImRlc3QtZmlsZSIgdmFsdWU9InZpbnRmLWZpbGVzL2RldmljZV9jb21wYXRpYmlsaXR5X21hdHJpeC54bWwiLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJwcm9wZXJ0eSIga2V5PSJyby50cmVibGUuZW5hYmxlZCIgdmFsdWU9InRydWUiLz4KLSAgICA8L3RhcmdldF9wcmVwYXJlcj4KLQotICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRhcmdldHByZXAuRGV2aWNlRmlsZUNvbGxlY3RvciI+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ic3JjLWZpbGUiIHZhbHVlPSIvcHJvYy9jb25maWcuZ3oiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iZGVzdC1maWxlIiB2YWx1ZT0idmludGYtZmlsZXMvcHJvY19jb25maWcuZ3oiLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJwcm9wZXJ0eSIga2V5PSJyby50cmVibGUuZW5hYmxlZCIgdmFsdWU9InRydWUiLz4KLSAgICA8L3RhcmdldF9wcmVwYXJlcj4KLTwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3Rvb2xzL2N0cy10cmFkZWZlZC9yZXMvY29uZmlnL2N0cy1leGNsdWRlLnhtbCBiL3Rvb2xzL2N0cy10cmFkZWZlZC9yZXMvY29uZmlnL2N0cy1leGNsdWRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQwZmZhMS4uMDAwMDAwMAotLS0gYS90b29scy9jdHMtdHJhZGVmZWQvcmVzL2NvbmZpZy9jdHMtZXhjbHVkZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkV4Y2x1ZGVkIHRlc3RzIGZyb20gbWFpbiBDVFMgcnVucyI+Ci0gICAgPCEtLSBiLzY0MTI3MTM2IC0tPgotICAgIDxvcHRpb24gbmFtZT0iY29tcGF0aWJpbGl0eTpleGNsdWRlLWZpbHRlciIgdmFsdWU9IkN0c1NlY3VyaXR5SG9zdFRlc3RDYXNlcyBhbmRyb2lkLnNlY3VyaXR5LmN0cy5TRUxpbnV4SG9zdFRlc3QjdGVzdE5vRXhlbXB0aW9uc0ZvckJpbmRlckluVmVuZG9yQmFuIiAvPgotICAgIDxvcHRpb24gbmFtZT0iY29tcGF0aWJpbGl0eTpleGNsdWRlLWZpbHRlciIgdmFsdWU9IkN0c1NlY3VyaXR5SG9zdFRlc3RDYXNlcyBhbmRyb2lkLnNlY3VyaXR5LmN0cy5TRUxpbnV4SG9zdFRlc3QjdGVzdE5vRXhlbXB0aW9uc0ZvclNvY2tldHNCZXR3ZWVuQ29yZUFuZFZlbmRvckJhbiIgLz4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJDdHNTZWN1cml0eUhvc3RUZXN0Q2FzZXMgYW5kcm9pZC5zZWN1cml0eS5jdHMuU0VMaW51eEhvc3RUZXN0I3Rlc3ROb0V4ZW1wdGlvbnNGb3JWZW5kb3JFeGVjdXRpbmdDb3JlIiAvPgotPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvdG9vbHMvY3RzLXRyYWRlZmVkL3Jlcy9jb25maWcvY3RzLWZpbHRlcmVkLXNhbXBsZS54bWwgYi90b29scy9jdHMtdHJhZGVmZWQvcmVzL2NvbmZpZy9jdHMtZmlsdGVyZWQtc2FtcGxlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRmNDU0Yi4uMDAwMDAwMAotLS0gYS90b29scy9jdHMtdHJhZGVmZWQvcmVzL2NvbmZpZy9jdHMtZmlsdGVyZWQtc2FtcGxlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iUnVucyBDVFMgZnJvbSBhIHByZS1leGlzdGluZyBDVFMgaW5zdGFsbGF0aW9uIj4KLQotICAgIDxpbmNsdWRlIG5hbWU9ImNvbW1vbi1jb21wYXRpYmlsaXR5LWNvbmZpZyIgLz4KLQotICAgIDxvcHRpb24gbmFtZT0icGxhbiIgdmFsdWU9ImN0cy1maWx0ZXJlZC1zYW1wbGUiIC8+Ci0KLSAgICA8IS0tIFRlbGwgYWxsIEFuZHJvaWRKVW5pdFRlc3RzIHRvIG9ubHkgcnVuIHRoZSBtZWRpdW0gc2l6ZWQgdGVzdHMgLS0+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb21wYXRpYmlsaXR5OnRlc3QtYXJnIiB2YWx1ZT0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuQW5kcm9pZEpVbml0VGVzdDpzaXplOm1lZGl1bSIgLz4KLQotICAgIDwhLS0gSW5jbHVkZSA2NGJpdCBDdHNDb250ZW50VGVzdENhc2VzIGFuZCB0ZWxsIGl0IHdoaWNoIHRpbWVvdXQgdG8gdXNlIC0tPgotICAgIDxvcHRpb24gbmFtZT0iY29tcGF0aWJpbGl0eTppbmNsdWRlLWZpbHRlciIgdmFsdWU9ImFybTY0LXY4YSBDdHNDb250ZW50VGVzdENhc2VzIiAvPgotICAgIDxvcHRpb24gbmFtZT0iY29tcGF0aWJpbGl0eTptb2R1bGUtYXJnIiB2YWx1ZT0iYXJtNjQtdjhhIEN0c0NvbnRlbnRUZXN0Q2FzZXM6dGVzdC10aW1lb3V0OjYwMCIgLz4KLQotICAgIDwhLS0gSW5jbHVkZSBDdHNHZXN0dXJlVGVzdENhc2VzIGJ1dCBvbmx5IHJ1biB0aGUgdGVzdHMgb24gYXJtMzIgLS0+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb21wYXRpYmlsaXR5OmluY2x1ZGUtZmlsdGVyIiB2YWx1ZT0iYXJtZWFiaS12N2EgQ3RzR2VzdHVyZVRlc3RDYXNlcyIgLz4KLQotICAgIDwhLS0gRXhjbHVkZSBDdHNNZWRpYVN0cmVzc1Rlc3RDYXNlcyAtLT4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJDdHNNZWRpYVN0cmVzc1Rlc3RDYXNlcyIgLz4KLQotICAgIDwhLS0gSW5jbHVkZSBDdHNVdGlsVGVzdENhc2VzIGJ1dCBvbmx5IHJ1biB0aGUgc21hbGwgdGVzdHMgLS0+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb21wYXRpYmlsaXR5OmluY2x1ZGUtZmlsdGVyIiB2YWx1ZT0iQ3RzVXRpbFRlc3RDYXNlcyIgLz4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6bW9kdWxlLWFyZyIgdmFsdWU9IkN0c1V0aWxUZXN0Q2FzZXM6c2l6ZTpzbWFsbCIgLz4KLQotPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvdG9vbHMvY3RzLXRyYWRlZmVkL3Jlcy9jb25maWcvY3RzLWdsb2JhbC1wcmVzdWJtaXQueG1sIGIvdG9vbHMvY3RzLXRyYWRlZmVkL3Jlcy9jb25maWcvY3RzLWdsb2JhbC1wcmVzdWJtaXQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTg1OGU3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2N0cy10cmFkZWZlZC9yZXMvY29uZmlnL2N0cy1nbG9iYWwtcHJlc3VibWl0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iUnVucyBDVFMgZ2xvYmFsIHByZXN1Ym1pdCB0ZXN0IGNhc2VzIj4KLQotICAgIDxpbmNsdWRlIG5hbWU9ImN0cy1hdXRvbWF0ZWQiIC8+Ci0KLSAgICA8b3B0aW9uIG5hbWU9InBsYW4iIHZhbHVlPSJjdHMiIC8+Ci0KLSAgICA8IS0tIEluY2x1ZGUgbW9kdWxlcyB3aXRoIHByZXN1Ym1pdCB0ZXN0IGNhc2VzLCByZXBlYXQgZm9yIGVhY2ggYXBwbGljYWJsZSBtb2R1bGUgLS0+Ci0gICAgPCEtLW9wdGlvbiBuYW1lPSJjb21wYXRpYmlsaXR5OmluY2x1ZGUtZmlsdGVyIiB2YWx1ZT0iPENUUyBtb2R1bGUgbmFtZSBnb2VzIGhlcmU+IiAvLS0+Ci0KLSAgICA8IS0tIE9ubHkgcnVuIHRlc3RzIHdpdGggQEdsb2JhbFByZXN1Ym1pdCBhbm5vdGF0aW9uLiAtLT4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6dGVzdC1hcmciIHZhbHVlPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5KYXJIb3N0VGVzdDppbmNsdWRlLWFubm90YXRpb246YW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkdsb2JhbFByZXN1Ym1pdCIgLz4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6dGVzdC1hcmciIHZhbHVlPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5BbmRyb2lkSlVuaXRUZXN0OmluY2x1ZGUtYW5ub3RhdGlvbjphbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuR2xvYmFsUHJlc3VibWl0IiAvPgotICAgIDxvcHRpb24gbmFtZT0iY29tcGF0aWJpbGl0eTp0ZXN0LWFyZyIgdmFsdWU9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkhvc3RUZXN0OmluY2x1ZGUtYW5ub3RhdGlvbjphbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuR2xvYmFsUHJlc3VibWl0IiAvPgotCi08L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS90b29scy9jdHMtdHJhZGVmZWQvcmVzL2NvbmZpZy9jdHMtamF2YS54bWwgYi90b29scy9jdHMtdHJhZGVmZWQvcmVzL2NvbmZpZy9jdHMtamF2YS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMmQ4ZjcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvY3RzLXRyYWRlZmVkL3Jlcy9jb25maWcvY3RzLWphdmEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJSdW5zIENvcmUgSmF2YSBUZXN0cyBmcm9tIGEgcHJlLWV4aXN0aW5nIENUUyBpbnN0YWxsYXRpb24iPgotCi0gICAgPGluY2x1ZGUgbmFtZT0iY3RzIiAvPgotCi0gICAgPG9wdGlvbiBuYW1lPSJwbGFuIiB2YWx1ZT0iY3RzLWphdmEiIC8+Ci0KLSAgICA8IS0tIEluY2x1ZGUgQ3RzTGliY29yZVRlc3RDYXNlcyAtLT4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6aW5jbHVkZS1maWx0ZXIiIHZhbHVlPSJDdHNMaWJjb3JlVGVzdENhc2VzIiAvPgotCi0gICAgPCEtLSBFeGNsdWRlIEN0c0xpYmNvcmVUZXN0Q2FzZXMgaGFybW9ueSAtLT4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJDdHNMaWJjb3JlVGVzdENhc2VzIGFuZHJvaWQuY29yZS50ZXN0cy5saWJjb3JlLnBhY2thZ2UuaGFybW9ueSIgLz4KLQotPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvdG9vbHMvY3RzLXRyYWRlZmVkL3Jlcy9jb25maWcvY3RzLWtub3duLWZhaWx1cmVzLnhtbCBiL3Rvb2xzL2N0cy10cmFkZWZlZC9yZXMvY29uZmlnL2N0cy1rbm93bi1mYWlsdXJlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNDM5NTYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvY3RzLXRyYWRlZmVkL3Jlcy9jb25maWcvY3RzLWtub3duLWZhaWx1cmVzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZ3VyYXRpb24gd2l0aCBDVFMga25vd24gZmFpbHVyZXMiID4KLSAgICA8IS0tIDxvcHRpb24gbmFtZT0iY29tcGF0aWJpbGl0eTpleGNsdWRlLWZpbHRlciIgdmFsdWU9Ik1PRFVMRV9OQU1FIiAvPiBFeGNsdWRlcyB3aG9sZSBtb2R1bGUgLS0+Ci0gICAgPCEtLSA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJNT0RVTEVfTkFNRSBQQUNLQUdFX05BTUUiIC8+IEV4Y2x1ZGVzIHdob2xlIHBhY2thZ2UgLS0+Ci0gICAgPCEtLSA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJNT0RVTEVfTkFNRSBQQUNLQUdFX05BTUUuQ0xBU1NfTkFNRSIgLz4gRXhjbHVkZXMgd2hvbGUgY2xhc3MgLS0+Ci0gICAgPCEtLSA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJNT0RVTEVfTkFNRSBQQUNLQUdFX05BTUUuQ0xBU1NfTkFNRSNURVNUX05BTUUiIC8+IEV4Y2x1ZGVzIGluZGl2aWR1YWwgdGVzdCAtLT4KLQotICAgIDwhLS0gYi8zODE4MjIzNSAtLT4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJDdHNMb2NhdGlvblRlc3RDYXNlcyBhbmRyb2lkLmxvY2F0aW9uLmN0cy5HbnNzVHRmZlRlc3RzI3Rlc3RUdGZmV2l0aE5ldHdvcmsiIC8+Ci0KLSAgICA8IS0tIGIvMzUzMTQ4MzUgLS0+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb21wYXRpYmlsaXR5OmV4Y2x1ZGUtZmlsdGVyIiB2YWx1ZT0iQ3RzU2VydmljZXNIb3N0VGVzdENhc2VzIGFuZHJvaWQuc2VydmVyLmN0cy5BY3Rpdml0eU1hbmFnZXJQaW5uZWRTdGFja1Rlc3RzI3Rlc3RBbHdheXNGb2N1c2FibGVQaXBBY3Rpdml0eSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJDdHNTZXJ2aWNlc0hvc3RUZXN0Q2FzZXMgYW5kcm9pZC5zZXJ2ZXIuY3RzLkFjdGl2aXR5TWFuYWdlclBpbm5lZFN0YWNrVGVzdHMjdGVzdExhdW5jaEludG9QaW5uZWRTdGFjayIgLz4KLQotICAgIDwhLS0gYi8xNzU5NTA1MCAtLT4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJDdHNBY2Nlc3NpYmlsaXR5U2VydmljZVRlc3RDYXNlcyBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLmN0cy5BY2Nlc3NpYmlsaXR5VGV4dFRyYXZlcnNhbFRlc3QjdGVzdEFjdGlvbk5leHRBbmRQcmV2aW91c0F0R3JhbnVsYXJpdHlQYWdlT3ZlclRleHQiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb21wYXRpYmlsaXR5OmV4Y2x1ZGUtZmlsdGVyIiB2YWx1ZT0iQ3RzQWNjZXNzaWJpbGl0eVNlcnZpY2VUZXN0Q2FzZXMgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5jdHMuQWNjZXNzaWJpbGl0eVRleHRUcmF2ZXJzYWxUZXN0I3Rlc3RBY3Rpb25OZXh0QW5kUHJldmlvdXNBdEdyYW51bGFyaXR5UGFnZU92ZXJUZXh0RXh0ZW5kIiAvPgotCi0gICAgPCEtLSBiLzE3OTg5NTMyIC0tPgotICAgIDxvcHRpb24gbmFtZT0iY29tcGF0aWJpbGl0eTpleGNsdWRlLWZpbHRlciIgdmFsdWU9IkN0c0NhbWVyYVRlc3RDYXNlcyBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuY3RzLlN1cmZhY2VWaWV3UHJldmlld1Rlc3QjdGVzdFByZXBhcmVQZXJmb3JtYW5jZSIgLz4KLQotICAgIDwhLS0gVGhlc2UgdGVzdCBjYXNlcyBhcmUgb25seSBhcHBsaWNhYmxlIHRvIEFuZHJvaWQgQXV0byBFbWJlZGRlZCB0YXJnZXRzLi0tPgotICAgIDxvcHRpb24gbmFtZT0iY29tcGF0aWJpbGl0eTpleGNsdWRlLWZpbHRlciIgdmFsdWU9IkN0c0NhclRlc3RDYXNlcyIgLz4KLQotICAgIDwhLS0gYi8yMzc3Njg5MyAtLT4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJDdHNEdW1wc3lzSG9zdFRlc3RDYXNlcyBhbmRyb2lkLmR1bXBzeXMuY3RzLkR1bXBzeXNIb3N0VGVzdCN0ZXN0QmF0dGVyeXN0YXRzT3V0cHV0IiAvPgotICAgIDxvcHRpb24gbmFtZT0iY29tcGF0aWJpbGl0eTpleGNsdWRlLWZpbHRlciIgdmFsdWU9IkN0c0R1bXBzeXNIb3N0VGVzdENhc2VzIGFuZHJvaWQuZHVtcHN5cy5jdHMuRHVtcHN5c0hvc3RUZXN0I3Rlc3RHZnhpbmZvRnJhbWVzdGF0cyIgLz4KLQotICAgIDwhLS0gYi8xNjcyMDY4OSAtLT4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJDdHNKZHdwIG9yZy5hcGFjaGUuaGFybW9ueS5qcGRhLnRlc3RzLmpkd3AuRGVidWdnZXJPbkRlbWFuZC5PbnRocm93RGVidWdnZXJMYXVuY2hUZXN0I3Rlc3REZWJ1Z2dlckxhdW5jaDAwMSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJDdHNKZHdwIG9yZy5hcGFjaGUuaGFybW9ueS5qcGRhLnRlc3RzLmpkd3AuRGVidWdnZXJPbkRlbWFuZC5PbnRocm93RGVidWdnZXJMYXVuY2hUZXN0I3Rlc3REZWJ1Z2dlckxhdW5jaDAwMiIgLz4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJDdHNKZHdwIG9yZy5hcGFjaGUuaGFybW9ueS5qcGRhLnRlc3RzLmpkd3AuRGVidWdnZXJPbkRlbWFuZC5PbnRocm93RGVidWdnZXJMYXVuY2hUZXN0I3Rlc3REZWJ1Z2dlckxhdW5jaDAwMyIgLz4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJDdHNKZHdwIG9yZy5hcGFjaGUuaGFybW9ueS5qcGRhLnRlc3RzLmpkd3AuRGVidWdnZXJPbkRlbWFuZC5PbnRocm93RGVidWdnZXJMYXVuY2hUZXN0I3Rlc3REZWJ1Z2dlckxhdW5jaDAwNCIgLz4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJDdHNKZHdwIG9yZy5hcGFjaGUuaGFybW9ueS5qcGRhLnRlc3RzLmpkd3AuRGVidWdnZXJPbkRlbWFuZC5PbnRocm93TGF1bmNoRGVidWdnZXIwMDEjdGVzdERlYnVnZ2VyMDAyIiAvPgotICAgIDxvcHRpb24gbmFtZT0iY29tcGF0aWJpbGl0eTpleGNsdWRlLWZpbHRlciIgdmFsdWU9IkN0c0pkd3Agb3JnLmFwYWNoZS5oYXJtb255LmpwZGEudGVzdHMuamR3cC5EZWJ1Z2dlck9uRGVtYW5kLk9udGhyb3dMYXVuY2hEZWJ1Z2dlcjAwMiN0ZXN0RGVidWdnZXIiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb21wYXRpYmlsaXR5OmV4Y2x1ZGUtZmlsdGVyIiB2YWx1ZT0iQ3RzSmR3cCBvcmcuYXBhY2hlLmhhcm1vbnkuanBkYS50ZXN0cy5qZHdwLkV2ZW50cy5DbGFzc1VubG9hZFRlc3QjdGVzdENsYXNzVW5sb2FkRXZlbnQiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb21wYXRpYmlsaXR5OmV4Y2x1ZGUtZmlsdGVyIiB2YWx1ZT0iQ3RzSmR3cCBvcmcuYXBhY2hlLmhhcm1vbnkuanBkYS50ZXN0cy5qZHdwLkV2ZW50cy5Nb25pdG9yQ29udGVuZGVkRW50ZXJlZFRlc3QjdGVzdE1vbml0b3JDb250ZW5kZWRFbnRlcmVkRm9yQ2xhc3NNYXRjaCIgLz4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJDdHNKZHdwIG9yZy5hcGFjaGUuaGFybW9ueS5qcGRhLnRlc3RzLmpkd3AuRXZlbnRzLk1vbml0b3JDb250ZW5kZWRFbnRlclRlc3QjdGVzdE1vbml0b3JDb250ZW5kZWRFbnRlckZvckNsYXNzTWF0Y2giIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb21wYXRpYmlsaXR5OmV4Y2x1ZGUtZmlsdGVyIiB2YWx1ZT0iQ3RzSmR3cCBvcmcuYXBhY2hlLmhhcm1vbnkuanBkYS50ZXN0cy5qZHdwLkV2ZW50cy5Nb25pdG9yV2FpdGVkVGVzdCN0ZXN0TW9uaXRvcldhaXRlZEZvckNsYXNzRXhjbHVkZSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJDdHNKZHdwIG9yZy5hcGFjaGUuaGFybW9ueS5qcGRhLnRlc3RzLmpkd3AuRXZlbnRzLk1vbml0b3JXYWl0ZWRUZXN0I3Rlc3RNb25pdG9yV2FpdGVkRm9yQ2xhc3NNYXRjaEV4YWN0IiAvPgotICAgIDxvcHRpb24gbmFtZT0iY29tcGF0aWJpbGl0eTpleGNsdWRlLWZpbHRlciIgdmFsdWU9IkN0c0pkd3Agb3JnLmFwYWNoZS5oYXJtb255LmpwZGEudGVzdHMuamR3cC5FdmVudHMuTW9uaXRvcldhaXRlZFRlc3QjdGVzdE1vbml0b3JXYWl0ZWRGb3JDbGFzc01hdGNoRmlyc3QiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb21wYXRpYmlsaXR5OmV4Y2x1ZGUtZmlsdGVyIiB2YWx1ZT0iQ3RzSmR3cCBvcmcuYXBhY2hlLmhhcm1vbnkuanBkYS50ZXN0cy5qZHdwLkV2ZW50cy5Nb25pdG9yV2FpdGVkVGVzdCN0ZXN0TW9uaXRvcldhaXRlZEZvckNsYXNzTWF0Y2hTZWNvbmQiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb21wYXRpYmlsaXR5OmV4Y2x1ZGUtZmlsdGVyIiB2YWx1ZT0iQ3RzSmR3cCBvcmcuYXBhY2hlLmhhcm1vbnkuanBkYS50ZXN0cy5qZHdwLkV2ZW50cy5Nb25pdG9yV2FpdGVkVGVzdCN0ZXN0TW9uaXRvcldhaXRlZEZvckNsYXNzT25seSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJDdHNKZHdwIG9yZy5hcGFjaGUuaGFybW9ueS5qcGRhLnRlc3RzLmpkd3AuRXZlbnRzLk1vbml0b3JXYWl0VGVzdCN0ZXN0TW9uaXRvcldhaXRGb3JDbGFzc0V4Y2x1ZGUiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb21wYXRpYmlsaXR5OmV4Y2x1ZGUtZmlsdGVyIiB2YWx1ZT0iQ3RzSmR3cCBvcmcuYXBhY2hlLmhhcm1vbnkuanBkYS50ZXN0cy5qZHdwLkV2ZW50cy5Nb25pdG9yV2FpdFRlc3QjdGVzdE1vbml0b3JXYWl0Rm9yQ2xhc3NNYXRjaEV4YWN0IiAvPgotICAgIDxvcHRpb24gbmFtZT0iY29tcGF0aWJpbGl0eTpleGNsdWRlLWZpbHRlciIgdmFsdWU9IkN0c0pkd3Agb3JnLmFwYWNoZS5oYXJtb255LmpwZGEudGVzdHMuamR3cC5FdmVudHMuTW9uaXRvcldhaXRUZXN0I3Rlc3RNb25pdG9yV2FpdEZvckNsYXNzTWF0Y2hGaXJzdCIgLz4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJDdHNKZHdwIG9yZy5hcGFjaGUuaGFybW9ueS5qcGRhLnRlc3RzLmpkd3AuRXZlbnRzLk1vbml0b3JXYWl0VGVzdCN0ZXN0TW9uaXRvcldhaXRGb3JDbGFzc01hdGNoU2Vjb25kIiAvPgotICAgIDxvcHRpb24gbmFtZT0iY29tcGF0aWJpbGl0eTpleGNsdWRlLWZpbHRlciIgdmFsdWU9IkN0c0pkd3Agb3JnLmFwYWNoZS5oYXJtb255LmpwZGEudGVzdHMuamR3cC5FdmVudHMuTW9uaXRvcldhaXRUZXN0I3Rlc3RNb25pdG9yV2FpdEZvckNsYXNzT25seSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJDdHNKZHdwIG9yZy5hcGFjaGUuaGFybW9ueS5qcGRhLnRlc3RzLmpkd3AuUmVmZXJlbmNlVHlwZS5DbGFzc0ZpbGVWZXJzaW9uVGVzdCN0ZXN0Q2xhc3NGaWxlVmVyc2lvbjAwMSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJDdHNKZHdwIG9yZy5hcGFjaGUuaGFybW9ueS5qcGRhLnRlc3RzLmpkd3AuUmVmZXJlbmNlVHlwZS5OZXN0ZWRUeXBlc1Rlc3QjdGVzdE5lc3RlZFR5cGVzMDAxIiAvPgotICAgIDxvcHRpb24gbmFtZT0iY29tcGF0aWJpbGl0eTpleGNsdWRlLWZpbHRlciIgdmFsdWU9IkN0c0pkd3Agb3JnLmFwYWNoZS5oYXJtb255LmpwZGEudGVzdHMuamR3cC5UaHJlYWRSZWZlcmVuY2UuU3RvcFRlc3QjdGVzdFN0b3AwMDEiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb21wYXRpYmlsaXR5OmV4Y2x1ZGUtZmlsdGVyIiB2YWx1ZT0iQ3RzSmR3cCBvcmcuYXBhY2hlLmhhcm1vbnkuanBkYS50ZXN0cy5qZHdwLlZpcnR1YWxNYWNoaW5lLkhvbGRFdmVudHNUZXN0I3Rlc3RIb2xkRXZlbnRzMDAxIiAvPgotICAgIDxvcHRpb24gbmFtZT0iY29tcGF0aWJpbGl0eTpleGNsdWRlLWZpbHRlciIgdmFsdWU9IkN0c0pkd3Agb3JnLmFwYWNoZS5oYXJtb255LmpwZGEudGVzdHMuamR3cC5WaXJ0dWFsTWFjaGluZS5SZWxlYXNlRXZlbnRzVGVzdCN0ZXN0UmVsZWFzZUV2ZW50czAwMSIgLz4KLQotICAgIDwhLS0gYi8yMTI2MjIyNiAtLT4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJDdHNKb2JTY2hlZHVsZXJUZXN0Q2FzZXMgYW5kcm9pZC5qb2JzY2hlZHVsZXIuY3RzLkNvbm5lY3Rpdml0eUNvbnN0cmFpbnRUZXN0I3Rlc3RDb25uZWN0aXZpdHlDb25zdHJhaW50RXhlY3V0ZXNfd2l0aE1vYmlsZSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJDdHNKb2JTY2hlZHVsZXJUZXN0Q2FzZXMgYW5kcm9pZC5qb2JzY2hlZHVsZXIuY3RzLkNvbm5lY3Rpdml0eUNvbnN0cmFpbnRUZXN0I3Rlc3RVbm1ldGVyZWRDb25zdHJhaW50RmFpbHNfd2l0aE1vYmlsZSIgLz4KLQotICAgIDwhLS0gYi82MjYxNjk0NCAtLT4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJDdHNMaWJjb3JlSmF2YVV0aWxDb2xsZWN0aW9uc1Rlc3RDYXNlcyIgLz4KLQotICAgIDwhLS0gYi8xODY4MjMxNSAtLT4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJDdHNOZXRUZXN0Q2FzZXMgYW5kcm9pZC5uZXQuY3RzLlNTTENlcnRpZmljYXRlU29ja2V0RmFjdG9yeVRlc3QjdGVzdF9jcmVhdGVTb2NrZXRfYmluZCIgLz4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJDdHNOZXRUZXN0Q2FzZXMgYW5kcm9pZC5uZXQuY3RzLlNTTENlcnRpZmljYXRlU29ja2V0RmFjdG9yeVRlc3QjdGVzdF9jcmVhdGVTb2NrZXRfc2ltcGxlIiAvPgotICAgIDxvcHRpb24gbmFtZT0iY29tcGF0aWJpbGl0eTpleGNsdWRlLWZpbHRlciIgdmFsdWU9IkN0c05ldFRlc3RDYXNlcyBhbmRyb2lkLm5ldC5jdHMuU1NMQ2VydGlmaWNhdGVTb2NrZXRGYWN0b3J5VGVzdCN0ZXN0X2NyZWF0ZVNvY2tldF93cmFwcGluZyIgLz4KLQotICAgIDwhLS0gYi8xNzM5NDMyMSAtLT4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJDdHNPcGVuR2xQZXJmVGVzdENhc2VzIGFuZHJvaWQub3BlbmdscGVyZi5jdHMuR2xBcHBTd2l0Y2hUZXN0I3Rlc3RHbEFjdGl2aXR5U3dpdGNoaW5nRmFzdCIgLz4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJDdHNPcGVuR2xQZXJmVGVzdENhc2VzIGFuZHJvaWQub3BlbmdscGVyZi5jdHMuR2xBcHBTd2l0Y2hUZXN0I3Rlc3RHbEFjdGl2aXR5U3dpdGNoaW5nU2xvdyIgLz4KLQotICAgIDwhLS0gYi8xODQ2MTY3MCAtLT4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJDdHNTZWN1cml0eVRlc3RDYXNlcyBhbmRyb2lkLnNlY3VyaXR5LmN0cy5BdWRpb1BvbGljeUJpbmRlclRlc3QjdGVzdF9nZXRTdHJlYW1Wb2x1bWVMZWFrIiAvPgotICAgIDxvcHRpb24gbmFtZT0iY29tcGF0aWJpbGl0eTpleGNsdWRlLWZpbHRlciIgdmFsdWU9IkN0c1NlY3VyaXR5VGVzdENhc2VzIGFuZHJvaWQuc2VjdXJpdHkuY3RzLkF1ZGlvUG9saWN5QmluZGVyVGVzdCN0ZXN0X2lzU3RyZWFtQWN0aXZlIiAvPgotICAgIDxvcHRpb24gbmFtZT0iY29tcGF0aWJpbGl0eTpleGNsdWRlLWZpbHRlciIgdmFsdWU9IkN0c1NlY3VyaXR5VGVzdENhc2VzIGFuZHJvaWQuc2VjdXJpdHkuY3RzLkF1ZGlvUG9saWN5QmluZGVyVGVzdCN0ZXN0X2lzU3RyZWFtQWN0aXZlUmVtb3RlbHkiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb21wYXRpYmlsaXR5OmV4Y2x1ZGUtZmlsdGVyIiB2YWx1ZT0iQ3RzU2VjdXJpdHlUZXN0Q2FzZXMgYW5kcm9pZC5zZWN1cml0eS5jdHMuQXVkaW9Qb2xpY3lCaW5kZXJUZXN0I3Rlc3Rfc3RhcnRBdWRpb1NvdXJjZSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJDdHNTZWN1cml0eVRlc3RDYXNlcyBhbmRyb2lkLnNlY3VyaXR5LmN0cy5BdWRpb1BvbGljeUJpbmRlclRlc3QjdGVzdF9zdGFydE91dHB1dCIgLz4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJDdHNTZWN1cml0eVRlc3RDYXNlcyBhbmRyb2lkLnNlY3VyaXR5LmN0cy5BdWRpb1BvbGljeUJpbmRlclRlc3QjdGVzdF9zdG9wT3V0cHV0IiAvPgotICAgIDwhLS0gYi8yNzIxODUwMiAtLT4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJDdHNTZWN1cml0eVRlc3RDYXNlcyBhbmRyb2lkLnNlY3VyaXR5LmN0cy5NZWRpYUNyeXB0b1Rlc3QjdGVzdE1lZGlhQ3J5cHRvQ2xlYXJLZXkiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb21wYXRpYmlsaXR5OmV4Y2x1ZGUtZmlsdGVyIiB2YWx1ZT0iQ3RzU2VjdXJpdHlUZXN0Q2FzZXMgYW5kcm9pZC5zZWN1cml0eS5jdHMuTWVkaWFDcnlwdG9UZXN0I3Rlc3RNZWRpYUNyeXB0b1dpZGV2aW5lIiAvPgotCi0gICAgPCEtLSBiLzYyMzAyMTYzIC0tPgotICAgIDxvcHRpb24gbmFtZT0iY29tcGF0aWJpbGl0eTpleGNsdWRlLWZpbHRlciIgdmFsdWU9IkN0c1NlY3VyaXR5QnVsbGV0aW5Ib3N0VGVzdENhc2VzIGFuZHJvaWQuc2VjdXJpdHkuY3RzLlBvYzE3XzA0I3Rlc3RQb2NDVkVfMjAxN18wNTY0IiAvPgotCi0gICAgPCEtLSBiLzI3ODczODE1IC0tPgotICAgIDxvcHRpb24gbmFtZT0iY29tcGF0aWJpbGl0eTpleGNsdWRlLWZpbHRlciIgdmFsdWU9ImFybTY0LXY4YSBDdHNSZW5kZXJzY3JpcHRMZWdhY3lUZXN0Q2FzZXMiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb21wYXRpYmlsaXR5OmV4Y2x1ZGUtZmlsdGVyIiB2YWx1ZT0ieDg2XzY0IEN0c1JlbmRlcnNjcmlwdExlZ2FjeVRlc3RDYXNlcyIgLz4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJtaXBzNjQgQ3RzUmVuZGVyc2NyaXB0TGVnYWN5VGVzdENhc2VzIiAvPgotCi0gICAgPCEtLSBiLzE3NTM2MTEzIC0tPgotICAgIDxvcHRpb24gbmFtZT0iY29tcGF0aWJpbGl0eTpleGNsdWRlLWZpbHRlciIgdmFsdWU9IkN0c1VzYWdlU3RhdHNUZXN0Q2FzZXMgYW5kcm9pZC5hcHAudXNhZ2UuY3RzLlVzYWdlU3RhdHNUZXN0I3Rlc3ROb0FjY2Vzc1NpbGVudGx5RmFpbHMiIC8+Ci0KLSAgICA8IS0tIGIvMjYyMzUyNDQgLS0+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb21wYXRpYmlsaXR5OmV4Y2x1ZGUtZmlsdGVyIiB2YWx1ZT0iYW5kcm9pZC51dGlsLmN0cy5FdmVudExvZ1Rlc3QjdGVzdFdyaXRlRXZlbnRXaXRoT3ZlcnNpemVWYWx1ZSIgLz4KLQotICAgIDwhLS0gYi8zMTgwMzYzMCAtLT4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJDdHNTZWN1cml0eVRlc3RDYXNlcyBhbmRyb2lkLnNlY3VyaXR5LmN0cy5MaXN0ZW5pbmdQb3J0c1Rlc3QiIC8+Ci0KLSAgICA8IS0tIGIvNjMxMTU0MDAgLS0+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb21wYXRpYmlsaXR5OmV4Y2x1ZGUtZmlsdGVyIiB2YWx1ZT0iQ3RzU2VjdXJpdHlIb3N0VGVzdENhc2VzIGFuZHJvaWQuc2VjdXJpdHkuY3RzLlNFTGludXhIb3N0VGVzdCN0ZXN0QW9zcEZpbGVDb250ZXh0cyIgLz4KLSAgICA8IS0tIGIvNjQyMjE0OTQgLS0+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb21wYXRpYmlsaXR5OmV4Y2x1ZGUtZmlsdGVyIiB2YWx1ZT0iQ3RzU2VjdXJpdHlIb3N0VGVzdENhc2VzIGFuZHJvaWQuc2VjdXJpdHkuY3RzLlNFTGludXhIb3N0VGVzdCN0ZXN0QW9zcFByb3BlcnR5Q29udGV4dHMiIC8+Ci0gICAgPCEtLSBiLzY0MjIxNDk0IC0tPgotICAgIDxvcHRpb24gbmFtZT0iY29tcGF0aWJpbGl0eTpleGNsdWRlLWZpbHRlciIgdmFsdWU9IkN0c1NlY3VyaXR5SG9zdFRlc3RDYXNlcyBhbmRyb2lkLnNlY3VyaXR5LmN0cy5TRUxpbnV4SG9zdFRlc3QjdGVzdEFvc3BTZWFwcENvbnRleHRzIiAvPgotCi0gICAgPCEtLSBiLzYzMzc4Mjk0IGIvNjQzODIzODEgLS0+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb21wYXRpYmlsaXR5OmV4Y2x1ZGUtZmlsdGVyIiB2YWx1ZT0iQ3RzU2VjdXJpdHlIb3N0VGVzdENhc2VzIGFuZHJvaWQuc2VjdXJpdHkuY3RzLlNFTGludXhOZXZlcmFsbG93UnVsZXNUZXN0I3Rlc3ROZXZlcmFsbG93UnVsZXM0NDAiIC8+Ci0KLSAgICA8IS0tIGIvMzY2ODYzODMgLS0+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb21wYXRpYmlsaXR5OmV4Y2x1ZGUtZmlsdGVyIiB2YWx1ZT0iQ3RzSW5jaWRlbnRIb3N0VGVzdENhc2VzIGNvbS5hbmRyb2lkLnNlcnZlci5jdHMuRXJyb3JzVGVzdCN0ZXN0QU5SIiAvPgotCi0gICAgPCEtLSBiLzM3NDgyMzcyIC0tPgotICAgIDxvcHRpb24gbmFtZT0iY29tcGF0aWJpbGl0eTpleGNsdWRlLWZpbHRlciIgdmFsdWU9IkN0c1ByZWZlcmVuY2UyVGVzdENhc2VzIGFuZHJvaWQucHJlZmVyZW5jZTIuY3RzLlByZWZlcmVuY2VBY3Rpdml0eUZsb3dQb3J0cmFpdFRlc3QjbXVsdGlXaW5kb3dIaXN0b3J5UHJlc2VydmVQb3J0cmFpdFRlc3QiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb21wYXRpYmlsaXR5OmV4Y2x1ZGUtZmlsdGVyIiB2YWx1ZT0iQ3RzUHJlZmVyZW5jZTJUZXN0Q2FzZXMgYW5kcm9pZC5wcmVmZXJlbmNlMi5jdHMuUHJlZmVyZW5jZUFjdGl2aXR5Rmxvd1BvcnRyYWl0VGVzdCNtdWx0aVdpbmRvd0luT3V0UG9ydHJhaXRUZXN0IiAvPgotICAgIDxvcHRpb24gbmFtZT0iY29tcGF0aWJpbGl0eTpleGNsdWRlLWZpbHRlciIgdmFsdWU9IkN0c1ByZWZlcmVuY2UyVGVzdENhc2VzIGFuZHJvaWQucHJlZmVyZW5jZTIuY3RzLlByZWZlcmVuY2VBY3Rpdml0eUZsb3dQb3J0cmFpdFRlc3QjbXVsdGlXaW5kb3dJbml0aWFsSGVhZGVyT25CYWNrUG9ydHJhaXRUZXN0IiAvPgotICAgIDxvcHRpb24gbmFtZT0iY29tcGF0aWJpbGl0eTpleGNsdWRlLWZpbHRlciIgdmFsdWU9IkN0c1ByZWZlcmVuY2UyVGVzdENhc2VzIGFuZHJvaWQucHJlZmVyZW5jZTIuY3RzLlByZWZlcmVuY2VBY3Rpdml0eUZsb3dQb3J0cmFpdFRlc3QjbXVsdGlXaW5kb3dJbm5lckZyYWdtZW50SW5PdXRQb3J0cmFpdFRlc3QiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb21wYXRpYmlsaXR5OmV4Y2x1ZGUtZmlsdGVyIiB2YWx1ZT0iQ3RzUHJlZmVyZW5jZTJUZXN0Q2FzZXMgYW5kcm9pZC5wcmVmZXJlbmNlMi5jdHMuUHJlZmVyZW5jZUFjdGl2aXR5Rmxvd1BvcnRyYWl0VGVzdCNzdGFydFdpdGhGcmFnbWVudEFuZEluaXRUaXRsZU11bHRpV2luZG93UG9ydHJhaXRUZXN0IiAvPgotICAgIDxvcHRpb24gbmFtZT0iY29tcGF0aWJpbGl0eTpleGNsdWRlLWZpbHRlciIgdmFsdWU9IkN0c1ByZWZlcmVuY2UyVGVzdENhc2VzIGFuZHJvaWQucHJlZmVyZW5jZTIuY3RzLlByZWZlcmVuY2VBY3Rpdml0eUZsb3dQb3J0cmFpdFRlc3Qjc3RhcnRXaXRoRnJhZ21lbnROb0hlYWRlcnNNdWx0aVdpbmRvd1BvcnRyYWl0VGVzdCIgLz4KLQotICAgIDwhLS0gYi82MzkxNjI3NCAtLT4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJDdHNUZWxlY29tVGVzdENhc2VzIGFuZHJvaWQudGVsZWNvbS5jdHMuV2lyZWRIZWFkc2V0VGVzdCIgLz4KLQotICAgIDwhLS0gYi8zODE3NzM5NiAtLT4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJDdHNQcmVmZXJlbmNlMlRlc3RDYXNlcyBhbmRyb2lkLnByZWZlcmVuY2UyLmN0cy5QcmVmZXJlbmNlQWN0aXZpdHlGbG93TGFuZHNjYXBlVGVzdCNtdWx0aVdpbmRvd0hpc3RvcnlQcmVzZXJ2ZUxhbmRzY2FwZVRlc3QiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb21wYXRpYmlsaXR5OmV4Y2x1ZGUtZmlsdGVyIiB2YWx1ZT0iQ3RzUHJlZmVyZW5jZTJUZXN0Q2FzZXMgYW5kcm9pZC5wcmVmZXJlbmNlMi5jdHMuUHJlZmVyZW5jZUFjdGl2aXR5Rmxvd0xhbmRzY2FwZVRlc3QjbXVsdGlXaW5kb3dJbk91dExhbmRzY2FwZVRlc3QiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb21wYXRpYmlsaXR5OmV4Y2x1ZGUtZmlsdGVyIiB2YWx1ZT0iQ3RzUHJlZmVyZW5jZTJUZXN0Q2FzZXMgYW5kcm9pZC5wcmVmZXJlbmNlMi5jdHMuUHJlZmVyZW5jZUFjdGl2aXR5Rmxvd0xhbmRzY2FwZVRlc3QjbXVsdGlXaW5kb3dJbml0aWFsSGVhZGVyT25CYWNrTGFuZHNjYXBlVGVzdCIgLz4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJDdHNQcmVmZXJlbmNlMlRlc3RDYXNlcyBhbmRyb2lkLnByZWZlcmVuY2UyLmN0cy5QcmVmZXJlbmNlQWN0aXZpdHlGbG93TGFuZHNjYXBlVGVzdCNtdWx0aVdpbmRvd0lubmVyRnJhZ21lbnRJbk91dExhbmRzY2FwZVRlc3QiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb21wYXRpYmlsaXR5OmV4Y2x1ZGUtZmlsdGVyIiB2YWx1ZT0iQ3RzUHJlZmVyZW5jZTJUZXN0Q2FzZXMgYW5kcm9pZC5wcmVmZXJlbmNlMi5jdHMuUHJlZmVyZW5jZUFjdGl2aXR5Rmxvd0xhbmRzY2FwZVRlc3Qjc3RhcnRXaXRoRnJhZ21lbnRBbmRJbml0VGl0bGVNdWx0aVdpbmRvd0xhbmRzY2FwZVRlc3QiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb21wYXRpYmlsaXR5OmV4Y2x1ZGUtZmlsdGVyIiB2YWx1ZT0iQ3RzUHJlZmVyZW5jZTJUZXN0Q2FzZXMgYW5kcm9pZC5wcmVmZXJlbmNlMi5jdHMuUHJlZmVyZW5jZUFjdGl2aXR5Rmxvd0xhbmRzY2FwZVRlc3Qjc3RhcnRXaXRoRnJhZ21lbnROb0hlYWRlcnNNdWx0aVdpbmRvd0xhbmRzY2FwZVRlc3QiIC8+Ci0KLSAgICA8IS0tIGIvNjIzNjg0MjMgLS0+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb21wYXRpYmlsaXR5OmV4Y2x1ZGUtZmlsdGVyIiB2YWx1ZT0iQ3RzUHJlZmVyZW5jZTJUZXN0Q2FzZXMgYW5kcm9pZC5wcmVmZXJlbmNlMi5jdHMuUHJlZmVyZW5jZUFjdGl2aXR5Rmxvd0xhbmRzY2FwZVRlc3Qjc3RhcnRXaXRoRnJhZ21lbnRBbmRSZWNyZWF0ZUxhbmRzY2FwZVRlc3QiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb21wYXRpYmlsaXR5OmV4Y2x1ZGUtZmlsdGVyIiB2YWx1ZT0iQ3RzUHJlZmVyZW5jZTJUZXN0Q2FzZXMgYW5kcm9pZC5wcmVmZXJlbmNlMi5jdHMuUHJlZmVyZW5jZUFjdGl2aXR5Rmxvd1BvcnRyYWl0VGVzdCNzdGFydFdpdGhGcmFnbWVudEFuZFJlY3JlYXRlUG9ydHJhaXRUZXN0IiAvPgotCi0gICAgPCEtLSBiLzYyOTI0NjQ5IC0tPgotICAgIDxvcHRpb24gbmFtZT0iY29tcGF0aWJpbGl0eTpleGNsdWRlLWZpbHRlciIgdmFsdWU9IkN0c1ByZWZlcmVuY2UyVGVzdENhc2VzIGFuZHJvaWQucHJlZmVyZW5jZTIuY3RzLlByZWZlcmVuY2VBY3Rpdml0eUxlZ2FjeUZsb3dUZXN0I2xlZ2FjeUFjdGl2aXR5TXVsdGlXaW5kb3dUZXN0IiAvPgotICAgIDxvcHRpb24gbmFtZT0iY29tcGF0aWJpbGl0eTpleGNsdWRlLWZpbHRlciIgdmFsdWU9IkN0c1ByZWZlcmVuY2UyVGVzdENhc2VzIGFuZHJvaWQucHJlZmVyZW5jZTIuY3RzLlByZWZlcmVuY2VBY3Rpdml0eUxlZ2FjeUZsb3dUZXN0I2xlZ2FjeUFjdGl2aXR5TXVsdGlXaW5kb3dUb2dnbGVUZXN0IiAvPgotICAgIDwhLS0gYi82NzczODgyOSAtLT4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJDdHNQcmVmZXJlbmNlMlRlc3RDYXNlcyBhbmRyb2lkLnByZWZlcmVuY2UyLmN0cy5QcmVmZXJlbmNlQWN0aXZpdHlMZWdhY3lGbG93VGVzdCNsZWdhY3lBY3Rpdml0eVJlY3JlYXRlVGVzdCIgLz4KLQotICAgIDwhLS0gYi8zODIyNDY5MCAtLT4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJDdHNNZWRpYVRlc3RDYXNlcyBhbmRyb2lkLm1lZGlhLmN0cy5OYXRpdmVFbmNvZGVyVGVzdCIgLz4KLQotICAgIDwhLS0gYi8zODQ2Mzg4MiAtLT4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJ4ODZfNjQgQ3RzTGlibG9nVGVzdENhc2VzIGxpYmxvZyNldmVudF9sb2dfdGFncyIgLz4KLQotICAgIDwhLS0gYi8zODQ2NDgyOCAtLT4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJDdHNGaWxlU3lzdGVtVGVzdENhc2VzIGFuZHJvaWQuZmlsZXN5c3RlbS5jdHMuQWxtb3N0RnVsbFRlc3QiIC8+Ci0KLSAgICA8IS0tIGIvMzcyNzE5MjcgLS0+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb21wYXRpYmlsaXR5OmV4Y2x1ZGUtZmlsdGVyIiB2YWx1ZT0iQ3RzVmlld1Rlc3RDYXNlcyBhbmRyb2lkLnZpZXcuY3RzLlZpZXdUZXN0I3Rlc3RVcGRhdGVEcmFnU2hhZG93IiAvPgotCi0gICAgPCEtLSBiLzYyNDgxODcwIC0tPgotICAgIDxvcHRpb24gbmFtZT0iY29tcGF0aWJpbGl0eTpleGNsdWRlLWZpbHRlciIgdmFsdWU9IkN0c05hdGl2ZU1lZGlhQUF1ZGlvVGVzdENhc2VzIGFuZHJvaWQubmF0aXZlbWVkaWEuYWF1ZGlvLkFBdWRpb091dHB1dFN0cmVhbUNhbGxiYWNrVGVzdCN0ZXN0UGxheWJhY2siIC8+Ci0KLSAgICA8IS0tIGIvNjI5NzY3MTMgLS0+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb21wYXRpYmlsaXR5OmV4Y2x1ZGUtZmlsdGVyIiB2YWx1ZT0iYXJtNjQtdjhhIEN0c01lZGlhQml0c3RyZWFtc1Rlc3RDYXNlcyIgLz4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJ4ODZfNjQgQ3RzTWVkaWFCaXRzdHJlYW1zVGVzdENhc2VzIiAvPgotICAgIDxvcHRpb24gbmFtZT0iY29tcGF0aWJpbGl0eTpleGNsdWRlLWZpbHRlciIgdmFsdWU9Im1pcHM2NCBDdHNNZWRpYUJpdHN0cmVhbXNUZXN0Q2FzZXMiIC8+Ci0KLSAgICA8IS0tIGIvMzg0MjA4OTggLS0+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb21wYXRpYmlsaXR5OmV4Y2x1ZGUtZmlsdGVyIiB2YWx1ZT0iQ3RzU2Vuc29yVGVzdENhc2VzIGFuZHJvaWQuaGFyZHdhcmUuY3RzLlNlbnNvckRpcmVjdFJlcG9ydFRlc3QjdGVzdFJhdGVJbmRlcGVuZGVuY3lBY2NlbE11bHRpQ2hhbm5lbCIgLz4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJDdHNTZW5zb3JUZXN0Q2FzZXMgYW5kcm9pZC5oYXJkd2FyZS5jdHMuU2Vuc29yRGlyZWN0UmVwb3J0VGVzdCN0ZXN0UmF0ZUluZGVwZW5kZW5jeUd5cm9NdWx0aUNoYW5uZWwiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb21wYXRpYmlsaXR5OmV4Y2x1ZGUtZmlsdGVyIiB2YWx1ZT0iQ3RzU2Vuc29yVGVzdENhc2VzIGFuZHJvaWQuaGFyZHdhcmUuY3RzLlNlbnNvckRpcmVjdFJlcG9ydFRlc3QjdGVzdFJhdGVJbmRlcGVuZGVuY3lNYWdNdWx0aUNoYW5uZWwiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb21wYXRpYmlsaXR5OmV4Y2x1ZGUtZmlsdGVyIiB2YWx1ZT0iQ3RzU2Vuc29yVGVzdENhc2VzIGFuZHJvaWQuaGFyZHdhcmUuY3RzLlNlbnNvckRpcmVjdFJlcG9ydFRlc3QjdGVzdFJhdGVJbmRlcGVuZGVuY3lBY2NlbE11bHRpTW9kZSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJDdHNTZW5zb3JUZXN0Q2FzZXMgYW5kcm9pZC5oYXJkd2FyZS5jdHMuU2Vuc29yRGlyZWN0UmVwb3J0VGVzdCN0ZXN0UmF0ZUluZGVwZW5kZW5jeUd5cm9NdWx0aU1vZGUiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb21wYXRpYmlsaXR5OmV4Y2x1ZGUtZmlsdGVyIiB2YWx1ZT0iQ3RzU2Vuc29yVGVzdENhc2VzIGFuZHJvaWQuaGFyZHdhcmUuY3RzLlNlbnNvckRpcmVjdFJlcG9ydFRlc3QjdGVzdFJhdGVJbmRlcGVuZGVuY3lNYWdNdWx0aU1vZGUiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb21wYXRpYmlsaXR5OmV4Y2x1ZGUtZmlsdGVyIiB2YWx1ZT0iQ3RzU2Vuc29yVGVzdENhc2VzIGFuZHJvaWQuaGFyZHdhcmUuY3RzLlNlbnNvckRpcmVjdFJlcG9ydFRlc3QjdGVzdFJlZ2lzdGVyTXVsdGlwbGVDaGFubmVsc1VzaW5nU2FtZU1lbW9yeSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJDdHNTZW5zb3JUZXN0Q2FzZXMgYW5kcm9pZC5oYXJkd2FyZS5jdHMuU2Vuc29yRGlyZWN0UmVwb3J0VGVzdCN0ZXN0Q2xvc2VXaXRob3V0Q29uZmlnU3RvcCIgLz4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJDdHNTZW5zb3JUZXN0Q2FzZXMgYW5kcm9pZC5oYXJkd2FyZS5jdHMuU2Vuc29yRGlyZWN0UmVwb3J0VGVzdCN0ZXN0UmF0ZUluZGVwZW5kZW5jeUFjY2VsR3lyb1NpbmdsZUNoYW5uZWwiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb21wYXRpYmlsaXR5OmV4Y2x1ZGUtZmlsdGVyIiB2YWx1ZT0iQ3RzU2Vuc29yVGVzdENhc2VzIGFuZHJvaWQuaGFyZHdhcmUuY3RzLlNlbnNvckRpcmVjdFJlcG9ydFRlc3QjdGVzdFJhdGVJbmRlcGVuZGVuY3lBY2NlbE1hZ1NpbmdsZUNoYW5uZWwiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb21wYXRpYmlsaXR5OmV4Y2x1ZGUtZmlsdGVyIiB2YWx1ZT0iQ3RzU2Vuc29yVGVzdENhc2VzIGFuZHJvaWQuaGFyZHdhcmUuY3RzLlNlbnNvckRpcmVjdFJlcG9ydFRlc3QjdGVzdFJhdGVJbmRlcGVuZGVuY3lHeXJvTWFnU2luZ2xlQ2hhbm5lbCIgLz4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJDdHNTZW5zb3JUZXN0Q2FzZXMgYW5kcm9pZC5oYXJkd2FyZS5jdHMuU2Vuc29yRGlyZWN0UmVwb3J0VGVzdCN0ZXN0UmF0ZUluZGVwZW5kZW5jeUFjY2VsVW5jYWxBY2NlbFNpbmdsZUNoYW5uZWwiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb21wYXRpYmlsaXR5OmV4Y2x1ZGUtZmlsdGVyIiB2YWx1ZT0iQ3RzU2Vuc29yVGVzdENhc2VzIGFuZHJvaWQuaGFyZHdhcmUuY3RzLlNlbnNvckRpcmVjdFJlcG9ydFRlc3QjdGVzdFJhdGVJbmRlcGVuZGVuY3lHeXJvVW5jYWxHeXJvU2luZ2xlQ2hhbm5lbCIgLz4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJDdHNTZW5zb3JUZXN0Q2FzZXMgYW5kcm9pZC5oYXJkd2FyZS5jdHMuU2Vuc29yRGlyZWN0UmVwb3J0VGVzdCN0ZXN0UmF0ZUluZGVwZW5kZW5jeU1hZ1VuY2FsTWFnU2luZ2xlQ2hhbm5lbCIgLz4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJDdHNTZW5zb3JUZXN0Q2FzZXMgYW5kcm9pZC5oYXJkd2FyZS5jdHMuU2Vuc29yRGlyZWN0UmVwb3J0VGVzdCN0ZXN0VGltZXN0YW1wQWNjZWwiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb21wYXRpYmlsaXR5OmV4Y2x1ZGUtZmlsdGVyIiB2YWx1ZT0iQ3RzU2Vuc29yVGVzdENhc2VzIGFuZHJvaWQuaGFyZHdhcmUuY3RzLlNlbnNvckRpcmVjdFJlcG9ydFRlc3QjdGVzdFRpbWVzdGFtcEd5cm8iIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb21wYXRpYmlsaXR5OmV4Y2x1ZGUtZmlsdGVyIiB2YWx1ZT0iQ3RzU2Vuc29yVGVzdENhc2VzIGFuZHJvaWQuaGFyZHdhcmUuY3RzLlNlbnNvckRpcmVjdFJlcG9ydFRlc3QjdGVzdFRpbWVzdGFtcE1hZyIgLz4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJDdHNTZW5zb3JUZXN0Q2FzZXMgYW5kcm9pZC5oYXJkd2FyZS5jdHMuU2Vuc29yRGlyZWN0UmVwb3J0VGVzdCN0ZXN0QXRvbWljQ291bnRlckFjY2VsIiAvPgotICAgIDxvcHRpb24gbmFtZT0iY29tcGF0aWJpbGl0eTpleGNsdWRlLWZpbHRlciIgdmFsdWU9IkN0c1NlbnNvclRlc3RDYXNlcyBhbmRyb2lkLmhhcmR3YXJlLmN0cy5TZW5zb3JEaXJlY3RSZXBvcnRUZXN0I3Rlc3RBdG9taWNDb3VudGVyR3lybyIgLz4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJDdHNTZW5zb3JUZXN0Q2FzZXMgYW5kcm9pZC5oYXJkd2FyZS5jdHMuU2Vuc29yRGlyZWN0UmVwb3J0VGVzdCN0ZXN0QXRvbWljQ291bnRlck1hZyIgLz4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJDdHNTZW5zb3JUZXN0Q2FzZXMgYW5kcm9pZC5oYXJkd2FyZS5jdHMuU2Vuc29yRGlyZWN0UmVwb3J0VGVzdCN0ZXN0UmVnaXN0ZXJNdWx0aXBsZUNoYW5uZWxzIiAvPgotICAgIDxvcHRpb24gbmFtZT0iY29tcGF0aWJpbGl0eTpleGNsdWRlLWZpbHRlciIgdmFsdWU9IkN0c1NlbnNvclRlc3RDYXNlcyBhbmRyb2lkLmhhcmR3YXJlLmN0cy5TZW5zb3JEaXJlY3RSZXBvcnRUZXN0I3Rlc3RSZWNvbmZpZ3VyZSIgLz4KLQotICAgIDwhLS0gYi82NTg0MzA5NSAtLT4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJDdHNMb2dkVGVzdENhc2VzIGxvZ2Qjc3RhdGlzdGljcyIgLz4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6ZXhjbHVkZS1maWx0ZXIiIHZhbHVlPSJDdHNMb2dkVGVzdENhc2VzIGxvZ2Qjc2Vwb2xpY3lfcmF0ZV9saW1pdGVyIiAvPgotCi0gICAgPCEtLSBiLzY3Mzc3NDMzIC0tPgotICAgIDwhLS0gZmFpbHMgb25seSBvbiBhbmdsZXIvYnVsbGhlYWQgdXNlcmRlYnVnIC0tPgotICAgIDxvcHRpb24gbmFtZT0iY29tcGF0aWJpbGl0eTpleGNsdWRlLWZpbHRlciIgdmFsdWU9IkN0c0xpYmxvZ1Rlc3RDYXNlcyBsaWJsb2cjd3JhcF9tb2RlX2Jsb2NrcyIgLz4KLSAgICA8IS0tYi8xMTg4MzMyMDIgLS0+Ci0gICAgPCEtLSB0ZXN0IGZhaWxzIGlmIHVzYiBjaGFyZ2luZyBpcyBkaXNhYmxlZCB3aGljaCBpcyBub3QgbWFuZGF0b3J5IC0tPgotICAgIDxvcHRpb24gbmFtZT0iY29tcGF0aWJpbGl0eTpleGNsdWRlLWZpbHRlciIgdmFsdWU9IkN0c0R1bXBzeXNIb3N0VGVzdENhc2VzICBhbmRyb2lkLmR1bXBzeXMuY3RzLlN0b3JhZ2VkRHVtcHN5c1Rlc3QjdGVzdFN0b3JhZ2VkT3V0cHV0IiAvPgotCi08L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS90b29scy9jdHMtdHJhZGVmZWQvcmVzL2NvbmZpZy9jdHMtcHJlY29uZGl0aW9ucy54bWwgYi90b29scy9jdHMtdHJhZGVmZWQvcmVzL2NvbmZpZy9jdHMtcHJlY29uZGl0aW9ucy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMjE1ZGYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvY3RzLXRyYWRlZmVkL3Jlcy9jb25maWcvY3RzLXByZWNvbmRpdGlvbnMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDVFMgcHJlY29uZGl0aW9uIGNvbmZpZ3MiPgotCi0gICAgPGluY2x1ZGUgbmFtZT0iY3RzLWRldmljZS1maWxlcyIgLz4KLQotICAgIDxvcHRpb24gbmFtZT0icGxhbiIgdmFsdWU9ImN0cy1wcmVjb25kaXRpb25zIiAvPgotCi0gICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGFyZ2V0cHJlcC5EeW5hbWljQ29uZmlnUHVzaGVyIj4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJ0YXJnZXQiIHZhbHVlPSJob3N0IiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1maWxlbmFtZSIgdmFsdWU9ImN0cyIvPgotICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgotCi0gICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGFyZ2V0cHJlcC5TdGF5QXdha2VQcmVwYXJlciIgLz4KLQotICAgIDwhLS0gRGlzYWJsZSAiQW5kcm9pZCBCZXRhIFByb2dyYW0iIC0tPgotICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRhcmdldHByZXAuUGFja2FnZURpc2FibGVyIiA+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0icGFja2FnZSIgdmFsdWU9ImNvbS5hbmRyb2lkLnlhZGF5YWRhIi8+Ci0gICAgPC90YXJnZXRfcHJlcGFyZXI+Ci0KLSAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50YXJnZXRwcmVwLlNldHRpbmdzUHJlcGFyZXIiPgotICAgICAgICA8b3B0aW9uIG5hbWU9ImRldmljZS1zZXR0aW5nIiB2YWx1ZT0idmVyaWZpZXJfdmVyaWZ5X2FkYl9pbnN0YWxscyIvPgotICAgICAgICA8b3B0aW9uIG5hbWU9InNldHRpbmctdHlwZSIgdmFsdWU9Imdsb2JhbCIvPgotICAgICAgICA8b3B0aW9uIG5hbWU9InNldC12YWx1ZSIgdmFsdWU9IjAiLz4KLSAgICA8L3RhcmdldF9wcmVwYXJlcj4KLQotICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRhcmdldHByZXAuQXBrUHJlY29uZGl0aW9uQ2hlY2siPgotICAgICAgICA8b3B0aW9uIG5hbWU9ImFwayIgdmFsdWU9IkN0c1ByZWNvbmRpdGlvbnMuYXBrIi8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0icGFja2FnZSIgdmFsdWU9ImNvbS5hbmRyb2lkLnByZWNvbmRpdGlvbnMuY3RzIi8+Ci0gICAgPC90YXJnZXRfcHJlcGFyZXI+Ci0KLSAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50YXJnZXRwcmVwLldpZmlDaGVjayIgLz4KLQotICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuUnVuQ29tbWFuZFRhcmdldFByZXBhcmVyIj4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJydW4tY29tbWFuZCIgdmFsdWU9InJtIC1yZiAvc2RjYXJkL2RldmljZS1pbmZvLWZpbGVzIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bi1jb21tYW5kIiB2YWx1ZT0icm0gLXJmIC9zZGNhcmQvcmVwb3J0LWxvZy1maWxlcyIgLz4KLSAgICA8L3RhcmdldF9wcmVwYXJlcj4KLQotICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRhcmdldHByZXAuRGV2aWNlSW5mb0NvbGxlY3RvciI+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iYXBrIiB2YWx1ZT0iQ3RzRGV2aWNlSW5mby5hcGsiLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJwYWNrYWdlIiB2YWx1ZT0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24uZGV2aWNlaW5mbyIvPgotICAgICAgICA8b3B0aW9uIG5hbWU9InNyYy1kaXIiIHZhbHVlPSIvc2RjYXJkL2RldmljZS1pbmZvLWZpbGVzLyIvPgotICAgICAgICA8b3B0aW9uIG5hbWU9ImRlc3QtZGlyIiB2YWx1ZT0iZGV2aWNlLWluZm8tZmlsZXMvIi8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0idGVtcC1kaXIiIHZhbHVlPSJ0ZW1wLWRldmljZS1pbmZvLWZpbGVzLyIvPgotICAgICAgICA8b3B0aW9uIG5hbWU9InRocm93LWVycm9yIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICA8L3RhcmdldF9wcmVwYXJlcj4KLQotICAgIDwhLS0gVGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIHVzZWQgaW4gY3RzL2NvbW1vbi9kZXZpY2Utc2lkZS91dGlsL0RldmljZVJlcG9ydExvZy5qYXZhLAotICAgIGN0cy9jb21tb24vaG9zdC1zaWRlL3V0aWwvTWV0cmljc1JlcG9ydExvZy5qYXZhIGFuZCB0b29scy90cmFkZWZlZC1ob3N0L3V0aWwvUmVwb3J0TG9nVXRpbC5qYXZhLgotICAgIEFueSBjaGFuZ2UgaW4gdGhlc2UgdmFsdWVzIG11c3QgYWxzbyBiZSB0cmFuc2xhdGVkIHRvIHRoZSBzdGF0ZWQgZmlsZXMuCi0gICAgLS0+Ci0gICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGFyZ2V0cHJlcC5SZXBvcnRMb2dDb2xsZWN0b3IiPgotICAgICAgICA8b3B0aW9uIG5hbWU9InNyYy1kaXIiIHZhbHVlPSIvc2RjYXJkL3JlcG9ydC1sb2ctZmlsZXMvIi8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iZGVzdC1kaXIiIHZhbHVlPSJyZXBvcnQtbG9nLWZpbGVzLyIvPgotICAgICAgICA8b3B0aW9uIG5hbWU9InRlbXAtZGlyIiB2YWx1ZT0idGVtcC1yZXBvcnQtbG9ncy8iLz4KLSAgICA8L3RhcmdldF9wcmVwYXJlcj4KLTwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3Rvb2xzL2N0cy10cmFkZWZlZC9yZXMvY29uZmlnL2N0cy1wcmVzdWJtaXQueG1sIGIvdG9vbHMvY3RzLXRyYWRlZmVkL3Jlcy9jb25maWcvY3RzLXByZXN1Ym1pdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5OTc3NzkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvY3RzLXRyYWRlZmVkL3Jlcy9jb25maWcvY3RzLXByZXN1Ym1pdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IlJ1bnMgQ1RTIHByZXN1Ym1pdCB0ZXN0IGNhc2VzIj4KLQotICAgIDxpbmNsdWRlIG5hbWU9ImN0cy1hdXRvbWF0ZWQiIC8+Ci0KLSAgICA8IS0tIE9ubHkgcnVuIHRlc3RzIHdpdGggQFByZXN1Ym1pdCBhbm5vdGF0aW9uIC0tPgotICAgIDwhLS0gVGhpcyBzZXJ2ZSBhcyBhIGJhc2UgY29uZmlnIGZvciBDVFMgdGVzdHMgdXNlZCBmb3IgcHJlc3VibWl0OwotICAgICAgICAgYWRkaXRpb25hbCBmaWx0ZXJpbmcgcGFyYW1ldGVycyBzaG91bGQgYmUgYXBwbGllZCB0byBmdXJ0aGVyIG5hcnJvdwotICAgICAgICAgZG93biB0aGUgY2hvaWNlIG9mIHRlc3RzLCBlLmcuIG1vZHVsZSBmaWx0ZXIKLSAgICAtLT4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6dGVzdC1hcmciIHZhbHVlPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50ZXN0dHlwZS5KYXJIb3N0VGVzdDppbmNsdWRlLWFubm90YXRpb246YW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlByZXN1Ym1pdCIgLz4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6dGVzdC1hcmciIHZhbHVlPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5BbmRyb2lkSlVuaXRUZXN0OmluY2x1ZGUtYW5ub3RhdGlvbjphbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUHJlc3VibWl0IiAvPgotICAgIDxvcHRpb24gbmFtZT0iY29tcGF0aWJpbGl0eTp0ZXN0LWFyZyIgdmFsdWU9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkhvc3RUZXN0OmluY2x1ZGUtYW5ub3RhdGlvbjphbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUHJlc3VibWl0IiAvPgotCi08L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS90b29scy9jdHMtdHJhZGVmZWQvcmVzL2NvbmZpZy9jdHMtc3VpdGUtYXV0b21hdGVkLnhtbCBiL3Rvb2xzL2N0cy10cmFkZWZlZC9yZXMvY29uZmlnL2N0cy1zdWl0ZS1hdXRvbWF0ZWQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGQ0NTBmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2N0cy10cmFkZWZlZC9yZXMvY29uZmlnL2N0cy1zdWl0ZS1hdXRvbWF0ZWQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJSdW5zIENUUyB3aXRoIGNvbW1vbiBvcHRpb25zIHNldCBmb3IgYW4gYXV0b21hdGVkIHJ1biBvbiB1c2VyZGVidWcvZW5nIGJ1aWxkcyI+Ci0KLSAgICA8aW5jbHVkZSBuYW1lPSJjdHMtc3VpdGUiIC8+Ci0KLSAgICA8b3B0aW9uIG5hbWU9InBsYW4iIHZhbHVlPSJjdHMtc3VpdGUiIC8+Ci0KLSAgICA8b3B0aW9uIG5hbWU9InNraXAtcHJlY29uZGl0aW9ucyIgdmFsdWU9ImZhbHNlIiAvPgotCi0gICAgPCEtLSBUZWxsIGFsbCBBbmRyb2lkSlVuaXRUZXN0cyB0byBleGNsdWRlIGNlcnRhaW4gYW5ub3RhdGlvbnMgLS0+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb21wYXRpYmlsaXR5OnRlc3QtYXJnIiB2YWx1ZT0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuQW5kcm9pZEpVbml0VGVzdDpleGNsdWRlLWFubm90YXRpb246YW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlJlc3RyaWN0ZWRCdWlsZFRlc3QiIC8+Ci0KLSAgICA8IS0tIFRlbGwgYWxsIEhvc3RUZXN0cyB0byBleGNsdWRlIGNlcnRhaW4gYW5ub3RhdGlvbnMgLS0+Ci0gICAgPG9wdGlvbiBuYW1lPSJjb21wYXRpYmlsaXR5OnRlc3QtYXJnIiB2YWx1ZT0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSG9zdFRlc3Q6ZXhjbHVkZS1hbm5vdGF0aW9uOmFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5SZXN0cmljdGVkQnVpbGRUZXN0IiAvPgotICAgIDxvcHRpb24gbmFtZT0iY29tcGF0aWJpbGl0eTp0ZXN0LWFyZyIgdmFsdWU9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRlc3R0eXBlLkphckhvc3RUZXN0OmV4Y2x1ZGUtYW5ub3RhdGlvbjphbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUmVzdHJpY3RlZEJ1aWxkVGVzdCIgLz4KLQotPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvdG9vbHMvY3RzLXRyYWRlZmVkL3Jlcy9jb25maWcvY3RzLXN1aXRlLXZpcnR1YWwtZGV2aWNlLnhtbCBiL3Rvb2xzL2N0cy10cmFkZWZlZC9yZXMvY29uZmlnL2N0cy1zdWl0ZS12aXJ0dWFsLWRldmljZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMmZmZTEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvY3RzLXRyYWRlZmVkL3Jlcy9jb25maWcvY3RzLXN1aXRlLXZpcnR1YWwtZGV2aWNlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iUnVucyBDVFMgd2l0aCBjb21tb24gb3B0aW9ucyBzZXQgZm9yIGFuIGF1dG9tYXRlZCBydW4gb24gdXNlcmRlYnVnL2VuZyBidWlsZHMsIGFuZCBwZXIgbW9kdWxlIHJ1bGVzIHN1aXRhYmxlIGZvciB2aXJ0dWFsIGRldmljZXMiPgotCi0gICAgPGluY2x1ZGUgbmFtZT0iY3RzLXN1aXRlLWF1dG9tYXRlZCIgLz4KLQotICAgIDwhLS0gYWRkIHBlciBtb2R1bGUgcnVsZXMgZm9yIHZpcnR1YWwgZGV2aWNlcyBiZWxvdyAtLT4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6bW9kdWxlLWFyZyIgdmFsdWU9IkN0c0RldmljZVBvbGljeU1hbmFnZXJUZXN0Q2FzZXM6ZXhjbHVkZS1hbm5vdGF0aW9uOmFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5SZXF1aXJlc0RldmljZSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6bW9kdWxlLWFyZyIgdmFsdWU9IkN0c0RlcXBUZXN0Q2FzZXM6aW5jbHVkZS1maWx0ZXI6ZEVRUC1HTEVTMi5mdW5jdGlvbmFsLnByZXJlcXVpc2l0ZSMqIiAvPgotICAgIDxvcHRpb24gbmFtZT0iY29tcGF0aWJpbGl0eTptb2R1bGUtYXJnIiB2YWx1ZT0iQ3RzRGVxcFRlc3RDYXNlczppbmNsdWRlLWZpbHRlcjpkRVFQLUVHTC4qIiAvPgotICAgIDxvcHRpb24gbmFtZT0iY29tcGF0aWJpbGl0eTptb2R1bGUtYXJnIiB2YWx1ZT0iQ3RzTGliY29yZVRlc3RDYXNlczpjb3JlLWV4cGVjdGF0aW9uOi92aXJ0dWFsZGV2aWNla25vd25mYWlsdXJlcy50eHQiIC8+Ci08L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS90b29scy9jdHMtdHJhZGVmZWQvcmVzL2NvbmZpZy9jdHMtc3VpdGUueG1sIGIvdG9vbHMvY3RzLXRyYWRlZmVkL3Jlcy9jb25maWcvY3RzLXN1aXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI2NzJlYy4uMDAwMDAwMAotLS0gYS90b29scy9jdHMtdHJhZGVmZWQvcmVzL2NvbmZpZy9jdHMtc3VpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJSdW5zIENUUyBhcyBhIHN1aXRlIj4KLSAgICA8IS0tIHJ1bm5pbmcgY29uZmlnIC0tPgotICAgIDxidWlsZF9wcm92aWRlciBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQuYnVpbGQuQ29tcGF0aWJpbGl0eUJ1aWxkUHJvdmlkZXIiIC8+Ci0gICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRlc3R0eXBlLnN1aXRlLkNvbXBhdGliaWxpdHlUZXN0U3VpdGUiIC8+Ci0KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6dGVzdC1hcmciIHZhbHVlPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5BbmRyb2lkSlVuaXRUZXN0OnJlcnVuLWZyb20tZmlsZTp0cnVlIiAvPgotICAgIDxvcHRpb24gbmFtZT0iY29tcGF0aWJpbGl0eTp0ZXN0LWFyZyIgdmFsdWU9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkFuZHJvaWRKVW5pdFRlc3Q6ZmFsbGJhY2stdG8tc2VyaWFsLXJlcnVuOmZhbHNlIiAvPgotCi0gICAgPGxvZ2dlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQubG9nLkZpbGVMb2dnZXIiPgotICAgICAgICA8b3B0aW9uIG5hbWU9ImxvZy1sZXZlbC1kaXNwbGF5IiB2YWx1ZT0iV0FSTiIgLz4KLSAgICA8L2xvZ2dlcj4KLSAgICA8IS0tIHNldHVwIGNvbmZpZ3MgLS0+Ci0gICAgPGluY2x1ZGUgbmFtZT0iY3RzLXByZWNvbmRpdGlvbnMiIC8+Ci0gICAgPGluY2x1ZGUgbmFtZT0iY3RzLXN5c3RlbS1jaGVja2VycyIgLz4KLSAgICA8aW5jbHVkZSBuYW1lPSJjdHMta25vd24tZmFpbHVyZXMiIC8+Ci0gICAgPGluY2x1ZGUgbmFtZT0iY3RzLWV4Y2x1ZGUiIC8+Ci0KLSAgICA8b3B0aW9uIG5hbWU9InBsYW4iIHZhbHVlPSJjdHMtc3VpdGUiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXRhZyIgdmFsdWU9ImN0cy1zdWl0ZSIgLz4KLQotICAgIDxvcHRpb24gbmFtZT0iZW5hYmxlLXJvb3QiIHZhbHVlPSJmYWxzZSIgLz4KLSAgICA8IS0tIHJldGFpbiAyMDBNQiBvZiBob3N0IGxvZyAtLT4KLSAgICA8b3B0aW9uIG5hbWU9Im1heC1sb2ctc2l6ZSIgdmFsdWU9IjIwMCIgLz4KLSAgICA8IS0tICByZXRhaW4gMjAwTUIgb2YgbG9nY2F0IC0tPgotICAgIDxvcHRpb24gbmFtZT0ibWF4LXRtcC1sb2djYXQtZmlsZSIgdmFsdWU9IjIwOTcxNTIwMCIgLz4KLQotICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuUnVuQ29tbWFuZFRhcmdldFByZXBhcmVyIj4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJydW4tY29tbWFuZCIgdmFsdWU9InNldHRpbmdzIHB1dCBnbG9iYWwgcGFja2FnZV92ZXJpZmllcl9lbmFibGUgMCIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZWFyZG93bi1jb21tYW5kIiB2YWx1ZT0ic2V0dGluZ3MgcHV0IGdsb2JhbCBwYWNrYWdlX3ZlcmlmaWVyX2VuYWJsZSAxIi8+Ci0gICAgPC90YXJnZXRfcHJlcGFyZXI+Ci0KLSAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50YXJnZXRwcmVwLlByb3BlcnR5Q2hlY2siPgotICAgICAgICA8b3B0aW9uIG5hbWU9InByb3BlcnR5LW5hbWUiIHZhbHVlPSJyby5idWlsZC50eXBlIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9ImV4cGVjdGVkLXZhbHVlIiB2YWx1ZT0idXNlciIvPiA8IS0tIERldmljZSBzaG91bGQgaGF2ZSB1c2VyIGJ1aWxkIC0tPgotICAgICAgICA8b3B0aW9uIG5hbWU9InRocm93LWVycm9yIiB2YWx1ZT0iZmFsc2UiLz4gPCEtLSBPbmx5IHByaW50IHdhcm5pbmcgaWYgbm90IHVzZXIgYnVpbGQgLS0+Ci0gICAgPC90YXJnZXRfcHJlcGFyZXI+Ci0KLSAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50YXJnZXRwcmVwLlByb3BlcnR5Q2hlY2siPgotICAgICAgICA8b3B0aW9uIG5hbWU9InByb3BlcnR5LW5hbWUiIHZhbHVlPSJyby5wcm9kdWN0LmxvY2FsZSIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJleHBlY3RlZC12YWx1ZSIgdmFsdWU9ImVuLVVTIi8+IDwhLS0gRGV2aWNlIGxvY2FsZSBzaG91bGQgYmUgVVMgRW5nbGlzaCAtLT4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJ0aHJvdy1lcnJvciIgdmFsdWU9ImZhbHNlIi8+IDwhLS0gT25seSBwcmludCB3YXJuaW5nIGlmIG5vdCBlbi1VUyAtLT4KLSAgICA8L3RhcmdldF9wcmVwYXJlcj4KLQotICAgIDx0ZW1wbGF0ZS1pbmNsdWRlIG5hbWU9InJlcG9ydGVycyIgZGVmYXVsdD0iYmFzaWMtcmVwb3J0ZXJzIiAvPgotCi0gICAgPCEtLSBJbmNsdWRlIGFkZGl0aW9uYWwgdGVzdCBtZXRhZGF0YSBvdXRwdXQuIC0tPgotICAgIDx0ZW1wbGF0ZS1pbmNsdWRlIG5hbWU9Im1ldGFkYXRhLXJlcG9ydGVycyIgZGVmYXVsdD0iZW1wdHkiIC8+Ci0KLSAgICA8cmVzdWx0X3JlcG9ydGVyIGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC5yZXN1bHQuQ29uc29sZVJlcG9ydGVyIiAvPgotICAgIDxyZXN1bHRfcmVwb3J0ZXIgY2xhc3M9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnJlc3VsdC5SZXN1bHRSZXBvcnRlciIgLz4KLSAgICA8cmVzdWx0X3JlcG9ydGVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC5yZXN1bHQuc3VpdGUuU3VpdGVSZXN1bHRSZXBvcnRlciIgLz4KLTwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3Rvb2xzL2N0cy10cmFkZWZlZC9yZXMvY29uZmlnL2N0cy1zeXN0ZW0tY2hlY2tlcnMueG1sIGIvdG9vbHMvY3RzLXRyYWRlZmVkL3Jlcy9jb25maWcvY3RzLXN5c3RlbS1jaGVja2Vycy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzYWRiNjkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvY3RzLXRyYWRlZmVkL3Jlcy9jb25maWcvY3RzLXN5c3RlbS1jaGVja2Vycy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNUUyBzeXN0ZW0gY2hlY2tlciBjb25maWdzIj4KLSAgICA8c3lzdGVtX2NoZWNrZXIgY2xhc3M9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRhcmdldHByZXAuTmV0d29ya0Nvbm5lY3Rpdml0eUNoZWNrZXIiIC8+Ci0gICAgPHN5c3RlbV9jaGVja2VyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC5zdWl0ZS5jaGVja2VyLktleWd1YXJkU3RhdHVzQ2hlY2tlciIgLz4KLSAgICA8c3lzdGVtX2NoZWNrZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnN1aXRlLmNoZWNrZXIuU3lzdGVtU2VydmVyU3RhdHVzQ2hlY2tlciIgLz4KLSAgICA8c3lzdGVtX2NoZWNrZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnN1aXRlLmNoZWNrZXIuU3lzdGVtU2VydmVyRmlsZURlc2NyaXB0b3JDaGVja2VyIiAvPgotPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvdG9vbHMvY3RzLXRyYWRlZmVkL3Jlcy9jb25maWcvY3RzLXZpcnR1YWwtZGV2aWNlLnhtbCBiL3Rvb2xzL2N0cy10cmFkZWZlZC9yZXMvY29uZmlnL2N0cy12aXJ0dWFsLWRldmljZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwOTQ1ZjAuLjAwMDAwMDAKLS0tIGEvdG9vbHMvY3RzLXRyYWRlZmVkL3Jlcy9jb25maWcvY3RzLXZpcnR1YWwtZGV2aWNlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iUnVucyBDVFMgd2l0aCBjb21tb24gb3B0aW9ucyBzZXQgZm9yIGFuIGF1dG9tYXRlZCBydW4gb24gdXNlcmRlYnVnL2VuZyBidWlsZHMsIGFuZCBwZXIgbW9kdWxlIHJ1bGVzIHN1aXRhYmxlIGZvciB2aXJ0dWFsIGRldmljZXMiPgotCi0gICAgPGluY2x1ZGUgbmFtZT0iY3RzLWF1dG9tYXRlZCIgLz4KLQotICAgIDwhLS0gYWRkIHBlciBtb2R1bGUgcnVsZXMgZm9yIHZpcnR1YWwgZGV2aWNlcyBiZWxvdyAtLT4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6bW9kdWxlLWFyZyIgdmFsdWU9IkN0c0RldmljZVBvbGljeU1hbmFnZXJUZXN0Q2FzZXM6ZXhjbHVkZS1hbm5vdGF0aW9uOmFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5SZXF1aXJlc0RldmljZSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6bW9kdWxlLWFyZyIgdmFsdWU9IkN0c0RlcXBUZXN0Q2FzZXM6aW5jbHVkZS1maWx0ZXI6ZEVRUC1HTEVTMi5mdW5jdGlvbmFsLnByZXJlcXVpc2l0ZSMqIiAvPgotICAgIDxvcHRpb24gbmFtZT0iY29tcGF0aWJpbGl0eTptb2R1bGUtYXJnIiB2YWx1ZT0iQ3RzRGVxcFRlc3RDYXNlczppbmNsdWRlLWZpbHRlcjpkRVFQLUVHTC4qIiAvPgotICAgIDxvcHRpb24gbmFtZT0iY29tcGF0aWJpbGl0eTptb2R1bGUtYXJnIiB2YWx1ZT0iQ3RzTGliY29yZVRlc3RDYXNlczpjb3JlLWV4cGVjdGF0aW9uOi92aXJ0dWFsZGV2aWNla25vd25mYWlsdXJlcy50eHQiIC8+Ci08L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS90b29scy9jdHMtdHJhZGVmZWQvcmVzL2NvbmZpZy9jdHMueG1sIGIvdG9vbHMvY3RzLXRyYWRlZmVkL3Jlcy9jb25maWcvY3RzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAyMmE0MS4uMDAwMDAwMAotLS0gYS90b29scy9jdHMtdHJhZGVmZWQvcmVzL2NvbmZpZy9jdHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJSdW5zIENUUyBmcm9tIGEgcHJlLWV4aXN0aW5nIENUUyBpbnN0YWxsYXRpb24iPgotCi0gICAgPGluY2x1ZGUgbmFtZT0iY3RzLWNvbW1vbiIgLz4KLSAgICA8aW5jbHVkZSBuYW1lPSJjdHMtZXhjbHVkZSIgLz4KLQotICAgIDxvcHRpb24gbmFtZT0icGxhbiIgdmFsdWU9ImN0cyIgLz4KLQotPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvdG9vbHMvY3RzLXRyYWRlZmVkL3Jlcy9jb25maWcvcmV0cnkueG1sIGIvdG9vbHMvY3RzLXRyYWRlZmVkL3Jlcy9jb25maWcvcmV0cnkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmVjYWRhLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2N0cy10cmFkZWZlZC9yZXMvY29uZmlnL3JldHJ5LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iUnVucyBhIHJldHJ5IG9mIGEgcHJldmlvdXMgQ1RTIHNlc3Npb24uIj4KLQotICAgIDxkZXZpY2VfcmVjb3ZlcnkgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLmRldmljZS5XYWl0RGV2aWNlUmVjb3ZlcnkiIC8+Ci0gICAgPGJ1aWxkX3Byb3ZpZGVyIGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC5idWlsZC5Db21wYXRpYmlsaXR5QnVpbGRQcm92aWRlciIgLz4KLSAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGVzdHR5cGUucmV0cnkuUmV0cnlGYWN0b3J5VGVzdCIgLz4KLSAgICA8bG9nZ2VyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC5sb2cuRmlsZUxvZ2dlciI+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ibG9nLWxldmVsLWRpc3BsYXkiIHZhbHVlPSJXQVJOIiAvPgotICAgIDwvbG9nZ2VyPgotCi0gICAgPGluY2x1ZGUgbmFtZT0iY3RzLXByZWNvbmRpdGlvbnMiIC8+Ci0gICAgPGluY2x1ZGUgbmFtZT0iY3RzLXN5c3RlbS1jaGVja2VycyIgLz4KLSAgICA8aW5jbHVkZSBuYW1lPSJjdHMta25vd24tZmFpbHVyZXMiIC8+Ci0gICAgPGluY2x1ZGUgbmFtZT0iY3RzLWV4Y2x1ZGUiIC8+Ci0KLSAgICA8b3B0aW9uIG5hbWU9InBsYW4iIHZhbHVlPSJjdHMtcmV0cnkiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXRhZyIgdmFsdWU9ImN0cyIgLz4KLSAgICA8b3B0aW9uIG5hbWU9InNraXAtZGV2aWNlLWluZm8iIHZhbHVlPSJ0cnVlIiAvPgotICAgIDxvcHRpb24gbmFtZT0iZW5hYmxlLXJvb3QiIHZhbHVlPSJmYWxzZSIgLz4KLQotICAgIDxyZXN1bHRfcmVwb3J0ZXIgY2xhc3M9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnJlc3VsdC5Db25zb2xlUmVwb3J0ZXIiIC8+Ci0gICAgPHJlc3VsdF9yZXBvcnRlciBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQucmVzdWx0LlJlc3VsdFJlcG9ydGVyIiAvPgotCi0gICAgPHRlbXBsYXRlLWluY2x1ZGUgbmFtZT0icmVwb3J0ZXJzIiBkZWZhdWx0PSJiYXNpYy1yZXBvcnRlcnMiIC8+Ci0KLSAgICA8IS0tIEluY2x1ZGUgYWRkaXRpb25hbCB0ZXN0IG1ldGFkYXRhIG91dHB1dC4gLS0+Ci0gICAgPHRlbXBsYXRlLWluY2x1ZGUgbmFtZT0ibWV0YWRhdGEtcmVwb3J0ZXJzIiBkZWZhdWx0PSJlbXB0eSIgLz4KLQotPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvdG9vbHMvY3RzLXRyYWRlZmVkL3Jlcy9jb25maWcvc2VjdXJpdHktYnVsbGV0aW4ueG1sIGIvdG9vbHMvY3RzLXRyYWRlZmVkL3Jlcy9jb25maWcvc2VjdXJpdHktYnVsbGV0aW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjE3NWE5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2N0cy10cmFkZWZlZC9yZXMvY29uZmlnL3NlY3VyaXR5LWJ1bGxldGluLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iUnVucyBTZWN1cml0eSBQYXRjaCB0ZXN0IGNhc2VzIj4KLQotICAgIDxvcHRpb24gbmFtZT0icGxhbiIgdmFsdWU9InNlY3VyaXR5LWJ1bGxldGluIiAvPgotCi0gICAgPGluY2x1ZGUgbmFtZT0iY3RzIi8+Ci0KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6aW5jbHVkZS1maWx0ZXIiIHZhbHVlPSJDdHNTZWN1cml0eVRlc3RDYXNlcyIgLz4KLQotICAgIDxvcHRpb24gbmFtZT0iY29tcGF0aWJpbGl0eTppbmNsdWRlLWZpbHRlciIgdmFsdWU9IkN0c1NlY3VyaXR5SG9zdFRlc3RDYXNlcyIgLz4KLQotICAgIDwhLS0gT25seSBydW4gdGVzdHMgd2l0aCBAU2VjdXJpdHlUZXN0IGFubm90YXRpb24uIC0tPgotICAgIDxvcHRpb24gbmFtZT0iY29tcGF0aWJpbGl0eTptb2R1bGUtYXJnIiB2YWx1ZT0iQ3RzU2VjdXJpdHlIb3N0VGVzdENhc2VzOmluY2x1ZGUtYW5ub3RhdGlvbjphbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuU2VjdXJpdHlUZXN0Ii8+Ci0KLSAgICA8b3B0aW9uIG5hbWU9ImNvbXBhdGliaWxpdHk6dGVzdC1hcmciIHZhbHVlPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5BbmRyb2lkSlVuaXRUZXN0OmluY2x1ZGUtYW5ub3RhdGlvbjphbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuU2VjdXJpdHlUZXN0IiAvPgotCi08L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS90b29scy9jdHMtdHJhZGVmZWQvdGVzdHMvQW5kcm9pZC5tayBiL3Rvb2xzL2N0cy10cmFkZWZlZC90ZXN0cy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTM5MWMwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2N0cy10cmFkZWZlZC90ZXN0cy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQotCi1MT0NBTF9NT0RVTEUgOj0gY3RzLXRyYWRlZmVkLXRlc3RzCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gdHJhZGVmZWQgY3RzLXRyYWRlZmVkCi0jIFdlIHNoaXAgdGhlIERlcXAgUnVubmVyIHRlc3RzIHdpdGggdGhlIENUUyBvbmUgdG8gdmFsaWRhdGUgdGhlbS4KLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBDdHNEZXFwUnVubmVyVGVzdHMKLQotaW5jbHVkZSAkKEJVSUxEX0hPU1RfSkFWQV9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvdG9vbHMvY3RzLXRyYWRlZmVkL3Rlc3RzL3J1bl90ZXN0cy5zaCBiL3Rvb2xzL2N0cy10cmFkZWZlZC90ZXN0cy9ydW5fdGVzdHMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY0ZjRiYjYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvY3RzLXRyYWRlZmVkL3Rlc3RzL3J1bl90ZXN0cy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSMhL2Jpbi9iYXNoCi0KLSMgQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jIEhlbHBlciBzY3JpcHQgZm9yIHJ1bm5pbmcgdW5pdCB0ZXN0cyBmb3IgY29tcGF0aWJpbGl0eSBsaWJyYXJpZXMKLQotQ1RTX0RJUj0kKGRpcm5hbWUgJHswfSkvLi4vLi4vLi4KLXNvdXJjZSAke0NUU19ESVJ9L3Rlc3RfZGVmcy5zaAotCi1KQVJTPSIKLSAgICBjb21wYXRpYmlsaXR5LWNvbW1vbi11dGlsLWhvc3RzaWRlbGliXAotICAgIGNvbXBhdGliaWxpdHktaG9zdC11dGlsXAotICAgIGN0cy10cmFkZWZlZC10ZXN0c1wKLSAgICBjdHMtdHJhZGVmZWQiCi0KLXJ1bl90ZXN0cyAiY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS50cmFkZWZlZC5DdHNUcmFkZWZlZFRlc3QiICIke0pBUlN9IiAiJHtAfSIKZGlmZiAtLWdpdCBhL3Rvb2xzL2N0cy10cmFkZWZlZC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS90cmFkZWZlZC9DdHNUcmFkZWZlZFRlc3QuamF2YSBiL3Rvb2xzL2N0cy10cmFkZWZlZC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvY29tcGF0aWJpbGl0eS90cmFkZWZlZC9DdHNUcmFkZWZlZFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTEyZDhiZC4uMDAwMDAwMAotLS0gYS90b29scy9jdHMtdHJhZGVmZWQvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvdHJhZGVmZWQvQ3RzVHJhZGVmZWRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS50cmFkZWZlZDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLmJ1aWxkLkNvbXBhdGliaWxpdHlCdWlsZEhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC5idWlsZC5Db21wYXRpYmlsaXR5QnVpbGRQcm92aWRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC5idWlsZC5JQnVpbGRJbmZvOwotaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLmNvbmZpZy5PcHRpb25TZXR0ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudXRpbC5GaWxlVXRpbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiBUZXN0cyBmb3IgY3RzLXRyYWRlZmVkLgotICovCi1wdWJsaWMgY2xhc3MgQ3RzVHJhZGVmZWRUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX05BTUUgPSAiQ1RTX1JPT1QiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVUlURV9GVUxMX05BTUUgPSAiQ29tcGF0aWJpbGl0eSBUZXN0IFN1aXRlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VJVEVfTkFNRSA9ICJDVFMiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVUlURV9QTEFOID0gImN0cyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERZTkFNSUNfQ09ORklHX1VSTCA9ICIiOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbU9yaWdpbmFsUHJvcGVydHkgPSBudWxsOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgbU9yaWdpbmFsUHJvcGVydHkgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoUFJPUEVSVFlfTkFNRSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KFBST1BFUlRZX05BTUUsIG1PcmlnaW5hbFByb3BlcnR5KTsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3VpdGVJbmZvTG9hZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBUZXN0IHRoZSB2YWx1ZXMgaW4gdGhlIG1hbmlmZXN0IGNhbiBiZSBsb2FkZWQKLSAgICAgICAgRmlsZSByb290ID0gRmlsZVV0aWwuY3JlYXRlVGVtcERpcigicm9vdCIpOwotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoUFJPUEVSVFlfTkFNRSwgcm9vdC5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgIEZpbGUgYmFzZSA9IG5ldyBGaWxlKHJvb3QsICJhbmRyb2lkLWN0cyIpOwotICAgICAgICBiYXNlLm1rZGlycygpOwotICAgICAgICBGaWxlIHRlc3RzID0gbmV3IEZpbGUoYmFzZSwgInRlc3RjYXNlcyIpOwotICAgICAgICB0ZXN0cy5ta2RpcnMoKTsKLSAgICAgICAgQ29tcGF0aWJpbGl0eUJ1aWxkUHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgQ29tcGF0aWJpbGl0eUJ1aWxkUHJvdmlkZXIoKTsKLSAgICAgICAgT3B0aW9uU2V0dGVyIHNldHRlciA9IG5ldyBPcHRpb25TZXR0ZXIocHJvdmlkZXIpOwotICAgICAgICBzZXR0ZXIuc2V0T3B0aW9uVmFsdWUoInBsYW4iLCBTVUlURV9QTEFOKTsKLSAgICAgICAgc2V0dGVyLnNldE9wdGlvblZhbHVlKCJkeW5hbWljLWNvbmZpZy11cmwiLCBEWU5BTUlDX0NPTkZJR19VUkwpOwotICAgICAgICBJQnVpbGRJbmZvIGluZm8gPSBwcm92aWRlci5nZXRCdWlsZCgpOwotICAgICAgICBDb21wYXRpYmlsaXR5QnVpbGRIZWxwZXIgaGVscGVyID0gbmV3IENvbXBhdGliaWxpdHlCdWlsZEhlbHBlcihpbmZvKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3Qgc3VpdGUgZnVsbCBuYW1lIiwgU1VJVEVfRlVMTF9OQU1FLCBoZWxwZXIuZ2V0U3VpdGVGdWxsTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3Qgc3VpdGUgbmFtZSIsIFNVSVRFX05BTUUsIGhlbHBlci5nZXRTdWl0ZU5hbWUoKSk7Ci0gICAgICAgIEZpbGVVdGlsLnJlY3Vyc2l2ZURlbGV0ZShyb290KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9kZXZpY2Utc2V0dXAvVGVzdERldmljZVNldHVwL0FuZHJvaWQubWsgYi90b29scy9kZXZpY2Utc2V0dXAvVGVzdERldmljZVNldHVwL0FuZHJvaWQubWsKaW5kZXggZWRiODVkMi4uMTgyMDM0NyAxMDA2NDQKLS0tIGEvdG9vbHMvZGV2aWNlLXNldHVwL1Rlc3REZXZpY2VTZXR1cC9BbmRyb2lkLm1rCisrKyBiL3Rvb2xzL2RldmljZS1zZXR1cC9UZXN0RGV2aWNlU2V0dXAvQW5kcm9pZC5tawpAQCAtMjcsNiArMjcsNyBAQAogCiAjIHVuY29tbWVudCB3aGVuIGIvMTMyODIyNTQgaXMgZml4ZWQKICNMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CitMT0NBTF9TREtfVkVSU0lPTiA6PSBzeXN0ZW1fY3VycmVudAogCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gVGVzdERldmljZVNldHVwCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL2RleC10b29scy9BbmRyb2lkLm1rIGIvdG9vbHMvZGV4LXRvb2xzL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNWE1NjYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGV4LXRvb2xzL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi0KLSMgZGV4LXRvb2xzIGphdmEgbGlicmFyeQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLHNyYykKLQotTE9DQUxfTU9EVUxFIDo9IGRleC10b29scwotTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gZHgKLQotaW5jbHVkZSAkKEJVSUxEX0hPU1RfSkFWQV9MSUJSQVJZKQotCmRpZmYgLS1naXQgYS90b29scy9kZXgtdG9vbHMvUkVBRE1FLnR4dCBiL3Rvb2xzL2RleC10b29scy9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmQxMGViLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RleC10b29scy9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotX19kZXgtdG9vbHNfXwotCi1UaGlzIHByb2plY3QgY29udGFpbnMgdGhlIHNvdXJjZSBjb2RlIGFuZCB0ZXN0cyBmb3IgYSBkZXggZmlsZSBwYXJzZXIuIAotVGhlIHBhcnNlciBpcyBhYmxlIHRvIHJlYWQgIGEgZGV4IGZpbGUgYW5kIHRvIGNyZWF0ZSBhIGRhdGFzdHJ1Y3R1cmUgYmFzZWQgb24gaXQuIAotSXQgaXMgZGVzaWduZWQgdG8gYmUgZmFzdCBhbmQgY2xvc2UgdG8gdGhlIHNwZWMuIAotU3VwcG9ydCBmb3IgZGlyZWN0IG5hdmlnYXRpb24gdG8gc3VwZXIgY2xhc3NlcyBhbmQgc2ltaWxhciB3aWxsIGJlIGltcGxlbWVudGVkIGluIGEgbGF5ZXIgb24gdG9wIG9mIHRoZSBwcm92aWRlZCBkYXRhIHN0cnVjdHVyZS4KLQotU2luY2UgdGhpcyBmb2xkZXIgY29udGFpbnMgYSAucHJvamVjdCBmaWxlLCBpdCBjYW4gYmUgaW1wb3J0ZWQgZGlyZWN0bHkgaW50byBlY2xpcHNlIGFzIGEgamF2YSBwcm9qZWN0LgotCi1GZWVsIGZyZWUgdG8gaW1wcm92ZSEKLQotX1N0cnVjdHVyZV8KLQotZGV4LnJlYWRlcgotICB8Ci0gIGRleCAgIDogdGVzdCBkYXRhCi0gIHwKLSAgZG9jICAgOiBkZXggZmlsZSBzcGVjIG9uIHdoaWNoIHRoaXMgcGFyc2VyIGlzIGJhc2VkCi0gIHwgCi0gIHNyYyAgIDogc291cmNlY29kZSBvZiB0aGUgcGFyc2VyCi0gIHwKLSAgbGliICAgOiBkeC5qYXIgdGhlIGphciBmcm9tIHRoZSBkeCB0b29sLiBVc2VkIGZvciBpbi1tZW1vcnkgamF2YSAtPiBieXRlIGNvZGUgLT4gZGV4IGNvZGUgLT4gZGV4IG1vZGVsIHRlc3RzCi0gIHwKLSAgdGVzdCAgOiBzb3VyY2UgY29kZSBvZiB0aGUgc21hbGwgdGVzdCBzdWl0ZQotICB8Ci0gIFJFQURNRS50eHQgOiB5b3UgYXJlIGhlcmUKLSAgfAotICBUT0RPLnR4dCAgIDogdGFza3Mgd2hpY2ggYXJlIHN0aWxsIG9wZW4KLSAKZGlmZiAtLWdpdCBhL3Rvb2xzL2RleC10b29scy9UT0RPLnR4dCBiL3Rvb2xzL2RleC10b29scy9UT0RPLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM3NzRjMS4uMDAwMDAwMAotLS0gYS90b29scy9kZXgtdG9vbHMvVE9ETy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLV9fVG9kb19fCi0KLUFkZCBtb3JlIGNvbXBsZXggdGVzdHMKLUNoZWNrIGlmIGZpbGVmb3JtYXQgdmVyc2lvbiBtYXRjaGVzIGRleCByZWFkZXIKLUFkZCBzdXBwb3J0IGZvciBiaWcgZW5kaWFuIGVuY29kZWQgZmlsZXMKLWRleC5yZWFkZXIuRGV4RW5jb2RlZFZhbHVlSW1wbCBoYXMgc29tZSBGSVhNRXMKLWRleC5yZWFkZXIuRGV4QnVmZmVyIG5lZWRzIHRvIGJlIHBvbGlzaGVkIHJlZ2FyZGluZyB1bnNpZ25lZCBkYXRhdHlwZXMgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGV4LXRvb2xzL2RleC9jbGFzc2VzLmRleCBiL3Rvb2xzL2RleC10b29scy9kZXgvY2xhc3Nlcy5kZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxZGVmNWYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGV4LXRvb2xzL2RleC9jbGFzc2VzLmRleAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2RleC10b29scy9kZXgvY2xhc3Nlcy5vdXQuZGV4IGIvdG9vbHMvZGV4LXRvb2xzL2RleC9jbGFzc2VzLm91dC5kZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ZmYwOWEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGV4LXRvb2xzL2RleC9jbGFzc2VzLm91dC5kZXgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQ0MTMgKzAsMCBAQAotLS0tLS0tLS0tLS0tLS0tLURFWF9GSUxFLS0tLS0tLS0tLS0tLS0KLQotRmlsZW5hbWU6IERleEZpbGUKLS0tLS0tLS0tLS0tREVGSU5FRF9DTEFTU0VTLS0tLS0tLS0tLS0tCi0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9NYW5pZmVzdDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNSBuYW1lID1wZXJtaXNzaW9uICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLk1hbmlmZXN0JHBlcm1pc3Npb24gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBQ0NFU1NfQ0hFQ0tJTl9QUk9QRVJUSUVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBQ0NFU1NfQ09BUlNFX0xPQ0FUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBQ0NFU1NfRklORV9MT0NBVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUNDRVNTX0xPQ0FUSU9OX0VYVFJBX0NPTU1BTkRTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBQ0NFU1NfTU9DS19MT0NBVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUNDRVNTX05FVFdPUktfU1RBVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDQ0VTU19TVVJGQUNFX0ZMSU5HRVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDQ0VTU19XSUZJX1NUQVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBRERfU1lTVEVNX1NFUlZJQ0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEJBVFRFUllfU1RBVFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEJMVUVUT09USAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQkxVRVRPT1RIX0FETUlOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBCUklDSwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQlJPQURDQVNUX1BBQ0tBR0VfUkVNT1ZFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQlJPQURDQVNUX1NUSUNLWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ0FMTF9QSE9ORQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ0FMTF9QUklWSUxFR0VECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDQU1FUkEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENIQU5HRV9DT01QT05FTlRfRU5BQkxFRF9TVEFURQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ0hBTkdFX0NPTkZJR1VSQVRJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENIQU5HRV9ORVRXT1JLX1NUQVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDSEFOR0VfV0lGSV9TVEFURQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ0xFQVJfQVBQX0NBQ0hFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDTEVBUl9BUFBfVVNFUl9EQVRBCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDT05UUk9MX0xPQ0FUSU9OX1VQREFURVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFTEVURV9DQUNIRV9GSUxFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVMRVRFX1BBQ0tBR0VTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERVZJQ0VfUE9XRVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERJQUdOT1NUSUMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERJU0FCTEVfS0VZR1VBUkQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERVTVAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEVYUEFORF9TVEFUVVNfQkFSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBGQUNUT1JZX1RFU1QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEZMQVNITElHSFQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEZPUkNFX0JBQ0sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEZPVEFfVVBEQVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBHRVRfQUNDT1VOVFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEdFVF9QQUNLQUdFX1NJWkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEdFVF9UQVNLUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSEFSRFdBUkVfVEVTVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSU5KRUNUX0VWRU5UUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSU5TVEFMTF9QQUNLQUdFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSU5URVJOQUxfU1lTVEVNX1dJTkRPVwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSU5URVJORVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1BTkFHRV9BUFBfVE9LRU5TCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBNQVNURVJfQ0xFQVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1PRElGWV9BVURJT19TRVRUSU5HUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTU9ESUZZX1BIT05FX1NUQVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBNT1VOVF9VTk1PVU5UX0ZJTEVTWVNURU1TCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQRVJTSVNURU5UX0FDVElWSVRZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQUk9DRVNTX09VVEdPSU5HX0NBTExTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSRUFEX0NBTEVOREFSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSRUFEX0NPTlRBQ1RTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSRUFEX0ZSQU1FX0JVRkZFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUkVBRF9JTlBVVF9TVEFURQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUkVBRF9MT0dTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSRUFEX09XTkVSX0RBVEEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFJFQURfUEhPTkVfU1RBVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFJFQURfU01TCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSRUFEX1NZTkNfU0VUVElOR1MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFJFQURfU1lOQ19TVEFUUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUkVCT09UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSRUNFSVZFX0JPT1RfQ09NUExFVEVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSRUNFSVZFX01NUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUkVDRUlWRV9TTVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFJFQ0VJVkVfV0FQX1BVU0gKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFJFQ09SRF9BVURJTwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUkVPUkRFUl9UQVNLUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUkVTVEFSVF9QQUNLQUdFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0VORF9TTVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNFVF9BQ1RJVklUWV9XQVRDSEVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTRVRfQUxXQVlTX0ZJTklTSAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0VUX0FOSU1BVElPTl9TQ0FMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0VUX0RFQlVHX0FQUAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0VUX09SSUVOVEFUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTRVRfUFJFRkVSUkVEX0FQUExJQ0FUSU9OUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0VUX1BST0NFU1NfRk9SRUdST1VORAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0VUX1BST0NFU1NfTElNSVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNFVF9USU1FX1pPTkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNFVF9XQUxMUEFQRVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNFVF9XQUxMUEFQRVJfSElOVFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNJR05BTF9QRVJTSVNURU5UX1BST0NFU1NFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU1RBVFVTX0JBUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU1VCU0NSSUJFRF9GRUVEU19SRUFECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTVUJTQ1JJQkVEX0ZFRURTX1dSSVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTWVNURU1fQUxFUlRfV0lORE9XCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBWSUJSQVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBXQUtFX0xPQ0sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFdSSVRFX0FQTl9TRVRUSU5HUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgV1JJVEVfQ0FMRU5EQVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFdSSVRFX0NPTlRBQ1RTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBXUklURV9HU0VSVklDRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFdSSVRFX09XTkVSX0RBVEEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFdSSVRFX1NFVFRJTkdTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBXUklURV9TTVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFdSSVRFX1NZTkNfU0VUVElOR1MKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvTWFuaWZlc3QkcGVybWlzc2lvbjsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQuTWFuaWZlc3QgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9SOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI1IG5hbWUgPWFuaW0gKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQuUiRhbmltIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBhY2NlbGVyYXRlX2RlY2VsZXJhdGVfaW50ZXJwb2xhdG9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGFjY2VsZXJhdGVfaW50ZXJwb2xhdG9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGRlY2VsZXJhdGVfaW50ZXJwb2xhdG9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGZhZGVfaW4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZmFkZV9vdXQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2xpZGVfaW5fbGVmdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzbGlkZV9vdXRfcmlnaHQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL1I7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjUgbmFtZSA9YXJyYXkgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQuUiRhcnJheSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZW1haWxBZGRyZXNzVHlwZXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaW1Qcm90b2NvbHMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgb3JnYW5pemF0aW9uVHlwZXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGhvbmVUeXBlcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwb3N0YWxBZGRyZXNzVHlwZXMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjUgbmFtZSA9YXR0ciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9SOyApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5SJGF0dHIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGFic0xpc3RWaWV3U3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYWN0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGFjdGl2aXR5Q2xvc2VFbnRlckFuaW1hdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBhY3Rpdml0eUNsb3NlRXhpdEFuaW1hdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBhY3Rpdml0eU9wZW5FbnRlckFuaW1hdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBhY3Rpdml0eU9wZW5FeGl0QW5pbWF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGFkZFN0YXRlc0Zyb21DaGlsZHJlbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBhZGp1c3RWaWV3Qm91bmRzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGFsZXJ0RGlhbG9nU3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYWxsb3dDbGVhclVzZXJEYXRhCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGFsbG93VGFza1JlcGFyZW50aW5nCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGFscGhhYmV0aWNTaG9ydGN1dAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBhbHdheXNEcmF3bldpdGhDYWNoZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBhbHdheXNSZXRhaW5UYXNrU3RhdGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYW5nbGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYW5pbWF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGFuaW1hdGlvbkNhY2hlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGFuaW1hdGlvbkR1cmF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGFuaW1hdGlvbk9yZGVyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGFudGlhbGlhcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBhcGlLZXkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYXV0aG9yaXRpZXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYXV0b0NvbXBsZXRlVGV4dFZpZXdTdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBhdXRvTGluawotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBhdXRvVGV4dAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBiYWNrZ3JvdW5kCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJhY2tncm91bmREaW1BbW91bnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYmFzZWxpbmVBbGlnbkJvdHRvbQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBiYXNlbGluZUFsaWduZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYmFzZWxpbmVBbGlnbmVkQ2hpbGRJbmRleAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBib3R0b20KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYm90dG9tQnJpZ2h0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJvdHRvbURhcmsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYm90dG9tTGVmdFJhZGl1cwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBib3R0b21NZWRpdW0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYm90dG9tUmlnaHRSYWRpdXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYnVmZmVyVHlwZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBidXR0b24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYnV0dG9uU3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYnV0dG9uU3R5bGVJbnNldAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBidXR0b25TdHlsZVNtYWxsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ1dHRvblN0eWxlVG9nZ2xlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNhY2hlQ29sb3JIaW50Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNhcGl0YWxpemUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY2VudGVyQnJpZ2h0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNlbnRlckNvbG9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNlbnRlckRhcmsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY2VudGVyTWVkaXVtCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNlbnRlclgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY2VudGVyWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjaGVja0JveFByZWZlcmVuY2VTdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjaGVja01hcmsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY2hlY2thYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNoZWNrYWJsZUJlaGF2aW9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNoZWNrYm94U3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY2hlY2tlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjaGVja2VkQnV0dG9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNoaWxkRGl2aWRlcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjaGlsZEluZGljYXRvcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjaGlsZEluZGljYXRvckxlZnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY2hpbGRJbmRpY2F0b3JSaWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjaG9pY2VNb2RlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNsZWFyVGFza09uTGF1bmNoCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNsaWNrYWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjbGlwQ2hpbGRyZW4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY2xpcE9yaWVudGF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNsaXBUb1BhZGRpbmcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY29sbGFwc2VDb2x1bW5zCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNvbG9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNvbG9yQmFja2dyb3VuZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb2xvckZvcmVncm91bmQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY29sb3JGb3JlZ3JvdW5kSW52ZXJzZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb2x1bW5EZWxheQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb2x1bW5XaWR0aAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb21wbGV0aW9uSGludAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb21wbGV0aW9uSGludFZpZXcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY29tcGxldGlvblRocmVzaG9sZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb25maWdDaGFuZ2VzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNvbnN0YW50U2l6ZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjcm9wVG9QYWRkaW5nCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGN1cnNvclZpc2libGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY3ljbGVzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGRhc2hHYXAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGFzaFdpZHRoCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGRhdGEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGVidWdnYWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkZWZhdWx0VmFsdWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGVsYXkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGVwZW5kZW5jeQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkZXNjZW5kYW50Rm9jdXNhYmlsaXR5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGRlc2NyaXB0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGRpYWwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGlhbG9nSWNvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkaWFsb2dMYXlvdXQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGlhbG9nTWVzc2FnZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkaWFsb2dQcmVmZXJlbmNlU3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGlhbG9nVGl0bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGlnaXRzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGRpcmVjdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkaXJlY3Rpb25Qcmlvcml0eQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkaXNhYmxlRGVwZW5kZW50c1N0YXRlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGRpc2FibGVkQWxwaGEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGl0aGVyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGRpdmlkZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGl2aWRlckhlaWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkcmF3U2VsZWN0b3JPblRvcAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkcmF3YWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkcmF3YWJsZUJvdHRvbQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkcmF3YWJsZUxlZnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZHJhd2FibGVQYWRkaW5nCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGRyYXdhYmxlUmlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZHJhd2FibGVUb3AKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZHJhd2luZ0NhY2hlUXVhbGl0eQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkcm9wRG93bkhpbnRBcHBlYXJhbmNlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGRyb3BEb3duSXRlbVN0eWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGRyb3BEb3duTGlzdFZpZXdTdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkcm9wRG93blNlbGVjdG9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGR1cGxpY2F0ZVBhcmVudFN0YXRlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGR1cmF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGVkaXRUZXh0UHJlZmVyZW5jZVN0eWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGVkaXRUZXh0U3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZWRpdGFibGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZWxsaXBzaXplCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGVtcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBlbmFibGVkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGVuZENvbG9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGVuZFllYXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZW50cmllcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBlbnRyeVZhbHVlcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBleGNsdWRlRnJvbVJlY2VudHMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZXhwYW5kYWJsZUxpc3RQcmVmZXJyZWRDaGlsZEluZGljYXRvckxlZnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZXhwYW5kYWJsZUxpc3RQcmVmZXJyZWRDaGlsZEluZGljYXRvclJpZ2h0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGV4cGFuZGFibGVMaXN0UHJlZmVycmVkQ2hpbGRQYWRkaW5nTGVmdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBleHBhbmRhYmxlTGlzdFByZWZlcnJlZEl0ZW1JbmRpY2F0b3JMZWZ0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGV4cGFuZGFibGVMaXN0UHJlZmVycmVkSXRlbUluZGljYXRvclJpZ2h0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGV4cGFuZGFibGVMaXN0UHJlZmVycmVkSXRlbVBhZGRpbmdMZWZ0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGV4cGFuZGFibGVMaXN0Vmlld1N0eWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGV4cG9ydGVkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGZhY3RvcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBmYWRpbmdFZGdlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGZhZGluZ0VkZ2VMZW5ndGgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZmlsbEFmdGVyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGZpbGxCZWZvcmUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZmlsbFZpZXdwb3J0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGZpbHRlcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBmaW5pc2hPblRhc2tMYXVuY2gKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZml0c1N5c3RlbVdpbmRvd3MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZmxpcEludGVydmFsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGZvY3VzYWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBmb2N1c2FibGVJblRvdWNoTW9kZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBmb3JlZ3JvdW5kCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGZvcmVncm91bmRHcmF2aXR5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGZvcm1hdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBmcmVlemVzVGV4dAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBmcm9tQWxwaGEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZnJvbURlZ3JlZXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZnJvbVhEZWx0YQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBmcm9tWFNjYWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGZyb21ZRGVsdGEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZnJvbVlTY2FsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBmdWxsQnJpZ2h0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGZ1bGxEYXJrCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGZ1bmN0aW9uYWxUZXN0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGdhbGxlcnlJdGVtQmFja2dyb3VuZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBnYWxsZXJ5U3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZ3JhZGllbnRSYWRpdXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZ3JhbnRVcmlQZXJtaXNzaW9ucwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBncmF2aXR5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGdyaWRWaWV3U3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZ3JvdXBJbmRpY2F0b3IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaGFuZF9ob3VyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGhhbmRfbWludXRlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGhhbmRsZVByb2ZpbGluZwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBoYXNDb2RlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGhlYWRlckJhY2tncm91bmQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaGVpZ2h0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGhpbnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaG9yaXpvbnRhbERpdmlkZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaG9yaXpvbnRhbFNwYWNpbmcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaG9zdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY29uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGlkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGlnbm9yZUdyYXZpdHkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaW1hZ2VCdXR0b25TdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpbWFnZVdlbGxTdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpbkFuaW1hdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpbmNsdWRlRm9udFBhZGRpbmcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaW5kZXRlcm1pbmF0ZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpbmRldGVybWluYXRlQmVoYXZpb3IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaW5kZXRlcm1pbmF0ZURyYXdhYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGluZGV0ZXJtaW5hdGVEdXJhdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpbmRldGVybWluYXRlT25seQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpbmRpY2F0b3JMZWZ0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGluZGljYXRvclJpZ2h0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGluZmxhdGVkSWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaW5pdE9yZGVyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGlubmVyUmFkaXVzUmF0aW8KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaW5wdXRNZXRob2QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaW5zZXRCb3R0b20KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaW5zZXRMZWZ0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGluc2V0UmlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaW5zZXRUb3AKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaW50ZXJwb2xhdG9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGlzSW5kaWNhdG9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGl0ZW1CYWNrZ3JvdW5kCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGl0ZW1JY29uRGlzYWJsZWRBbHBoYQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpdGVtVGV4dEFwcGVhcmFuY2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQga2VlcFNjcmVlbk9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGtleQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBrZXljb2RlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxhYmVsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxhdW5jaE1vZGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGF5b3V0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxheW91dEFuaW1hdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBsYXlvdXRfYWJvdmUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGF5b3V0X2FsaWduQmFzZWxpbmUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGF5b3V0X2FsaWduQm90dG9tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxheW91dF9hbGlnbkxlZnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGF5b3V0X2FsaWduUGFyZW50Qm90dG9tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxheW91dF9hbGlnblBhcmVudExlZnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGF5b3V0X2FsaWduUGFyZW50UmlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGF5b3V0X2FsaWduUGFyZW50VG9wCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxheW91dF9hbGlnblJpZ2h0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxheW91dF9hbGlnblRvcAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBsYXlvdXRfYWxpZ25XaXRoUGFyZW50SWZNaXNzaW5nCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxheW91dF9iZWxvdwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBsYXlvdXRfY2VudGVySG9yaXpvbnRhbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBsYXlvdXRfY2VudGVySW5QYXJlbnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGF5b3V0X2NlbnRlclZlcnRpY2FsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxheW91dF9jb2x1bW4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGF5b3V0X2dyYXZpdHkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGF5b3V0X2hlaWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBsYXlvdXRfbWFyZ2luCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxheW91dF9tYXJnaW5Cb3R0b20KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGF5b3V0X21hcmdpbkxlZnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGF5b3V0X21hcmdpblJpZ2h0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxheW91dF9tYXJnaW5Ub3AKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGF5b3V0X3NjYWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxheW91dF9zcGFuCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxheW91dF90b0xlZnRPZgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBsYXlvdXRfdG9SaWdodE9mCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxheW91dF93ZWlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGF5b3V0X3dpZHRoCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxheW91dF94Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxheW91dF95Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxlZnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGluZVNwYWNpbmdFeHRyYQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBsaW5lU3BhY2luZ011bHRpcGxpZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGluZXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGlua3NDbGlja2FibGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGlzdENob2ljZUluZGljYXRvck11bHRpcGxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxpc3RDaG9pY2VJbmRpY2F0b3JTaW5nbGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGlzdERpdmlkZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGlzdFByZWZlcnJlZEl0ZW1IZWlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGlzdFNlbGVjdG9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxpc3RTZXBhcmF0b3JUZXh0Vmlld1N0eWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxpc3RWaWV3U3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGlzdFZpZXdXaGl0ZVN0eWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxvbmdDbGlja2FibGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbWFuYWdlU3BhY2VBY3Rpdml0eQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBtYXBWaWV3U3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbWF4Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1heEVtcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBtYXhIZWlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbWF4SXRlbXNQZXJSb3cKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbWF4TGVuZ3RoCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1heExldmVsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1heExpbmVzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1heFJvd3MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbWF4V2lkdGgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbWVhc3VyZUFsbENoaWxkcmVuCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1lbnVDYXRlZ29yeQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBtaW1lVHlwZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBtaW5FbXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbWluSGVpZ2h0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1pbkxldmVsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1pbkxpbmVzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1pblNka1ZlcnNpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbWluV2lkdGgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbW9kZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBtb3JlSWNvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBtdWx0aXByb2Nlc3MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbmFtZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBuZWdhdGl2ZUJ1dHRvblRleHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbmV4dEZvY3VzRG93bgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBuZXh0Rm9jdXNMZWZ0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG5leHRGb2N1c1JpZ2h0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG5leHRGb2N1c1VwCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG51bUNvbHVtbnMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbnVtU3RhcnMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbnVtZXJpYwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBudW1lcmljU2hvcnRjdXQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgb25lc2hvdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBvcmRlcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBvcmRlckluQ2F0ZWdvcnkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgb3JkZXJpbmdGcm9tWG1sCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG9yaWVudGF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG91dEFuaW1hdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwYWRkaW5nCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBhZGRpbmdCb3R0b20KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGFkZGluZ0xlZnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGFkZGluZ1JpZ2h0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBhZGRpbmdUb3AKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGFuZWxCYWNrZ3JvdW5kCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBhbmVsQ29sb3JCYWNrZ3JvdW5kCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBhbmVsQ29sb3JGb3JlZ3JvdW5kCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBhbmVsRnVsbEJhY2tncm91bmQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGFuZWxUZXh0QXBwZWFyYW5jZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwYXNzd29yZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwYXRoCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBhdGhQYXR0ZXJuCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBhdGhQcmVmaXgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWlzc2lvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtaXNzaW9uR3JvdXAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVyc2lzdGVudAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJzaXN0ZW50RHJhd2luZ0NhY2hlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBob25lTnVtYmVyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBpdm90WAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwaXZvdFkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcG9wdXBCYWNrZ3JvdW5kCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBvcHVwV2luZG93U3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcG9ydAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwb3NpdGl2ZUJ1dHRvblRleHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJlZmVyZW5jZUNhdGVnb3J5U3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJlZmVyZW5jZUluZm9ybWF0aW9uU3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJlZmVyZW5jZUxheW91dENoaWxkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByZWZlcmVuY2VTY3JlZW5TdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcmVmZXJlbmNlU3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJpb3JpdHkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJvY2VzcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcm9ncmVzcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcm9ncmVzc0JhclN0eWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByb2dyZXNzQmFyU3R5bGVIb3Jpem9udGFsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByb2dyZXNzQmFyU3R5bGVMYXJnZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcm9ncmVzc0JhclN0eWxlU21hbGwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJvZ3Jlc3NCYXJTdHlsZVNtYWxsVGl0bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJvZ3Jlc3NEcmF3YWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcm9tcHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJvdGVjdGlvbkxldmVsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHF1ZXJ5QWN0aW9uTXNnCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHJhZGlvQnV0dG9uU3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcmFkaXVzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHJhdGluZwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCByYXRpbmdCYXJTdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCByYXRpbmdCYXJTdHlsZUluZGljYXRvcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCByYXRpbmdCYXJTdHlsZVNtYWxsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHJlYWRQZXJtaXNzaW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHJlcGVhdENvdW50Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHJlcGVhdE1vZGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcmVzb3VyY2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcmlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcmluZ3RvbmVQcmVmZXJlbmNlU3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcmluZ3RvbmVUeXBlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHJvd0RlbGF5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHJvd0hlaWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzYXZlRW5hYmxlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzY2FsZUdyYXZpdHkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2NhbGVIZWlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2NhbGVUeXBlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNjYWxlV2lkdGgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2NoZW1lCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNjcmVlbk9yaWVudGF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNjcm9sbEhvcml6b250YWxseQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzY3JvbGxWaWV3U3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2Nyb2xsWAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzY3JvbGxZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNjcm9sbGJhckFsd2F5c0RyYXdIb3Jpem9udGFsVHJhY2sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2Nyb2xsYmFyQWx3YXlzRHJhd1ZlcnRpY2FsVHJhY2sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2Nyb2xsYmFyU2l6ZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzY3JvbGxiYXJTdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzY3JvbGxiYXJUaHVtYkhvcml6b250YWwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2Nyb2xsYmFyVGh1bWJWZXJ0aWNhbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzY3JvbGxiYXJUcmFja0hvcml6b250YWwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2Nyb2xsYmFyVHJhY2tWZXJ0aWNhbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzY3JvbGxiYXJzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNjcm9sbGluZ0NhY2hlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNlYXJjaEJ1dHRvblRleHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2VhcmNoTW9kZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzZWFyY2hTdWdnZXN0QXV0aG9yaXR5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNlYXJjaFN1Z2dlc3RJbnRlbnRBY3Rpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2VhcmNoU3VnZ2VzdEludGVudERhdGEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2VhcmNoU3VnZ2VzdFBhdGgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2VhcmNoU3VnZ2VzdFNlbGVjdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzZWNvbmRhcnlQcm9ncmVzcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzZWVrQmFyU3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2VsZWN0QWxsT25Gb2N1cwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzZWxlY3RhYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNoYWRvd0NvbG9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNoYWRvd0R4Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNoYWRvd0R5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNoYWRvd1JhZGl1cwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzaGFwZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzaGFyZUludGVycG9sYXRvcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzaGFyZWRVc2VySWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2hvdWxkRGlzYWJsZVZpZXcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2hvd0RlZmF1bHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2hvd1NpbGVudAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzaHJpbmtDb2x1bW5zCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNpbmdsZUxpbmUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc291bmRFZmZlY3RzRW5hYmxlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzcGFjaW5nCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNwaW5uZXJEcm9wRG93bkl0ZW1TdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzcGlubmVySXRlbVN0eWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNwaW5uZXJTdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzcmMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhY2tGcm9tQm90dG9tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXJTdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGFydENvbG9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXJ0T2Zmc2V0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXJ0WWVhcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0ZU5vdE5lZWRlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0ZV9hYm92ZV9hbmNob3IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdGVfYWN0aXZlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXRlX2NoZWNrYWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0ZV9jaGVja2VkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXRlX2VtcHR5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXRlX2VuYWJsZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdGVfZXhwYW5kZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdGVfZmlyc3QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdGVfZm9jdXNlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0ZV9sYXN0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXRlX21pZGRsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0ZV9wcmVzc2VkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXRlX3NlbGVjdGVkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXRlX3NpbmdsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0ZV93aW5kb3dfZm9jdXNlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGVwU2l6ZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdHJlYW1UeXBlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0cmV0Y2hDb2x1bW5zCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0cmV0Y2hNb2RlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN1Z2dlc3RBY3Rpb25Nc2cKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3VnZ2VzdEFjdGlvbk1zZ0NvbHVtbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdW1tYXJ5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN1bW1hcnlPZmYKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3VtbWFyeU9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN5bmNhYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRhYldpZGdldFN0eWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRhZwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0YXJnZXRBY3Rpdml0eQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0YXJnZXRDbGFzcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0YXJnZXRQYWNrYWdlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRhc2tBZmZpbml0eQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0YXNrQ2xvc2VFbnRlckFuaW1hdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0YXNrQ2xvc2VFeGl0QW5pbWF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRhc2tPcGVuRW50ZXJBbmltYXRpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGFza09wZW5FeGl0QW5pbWF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRhc2tUb0JhY2tFbnRlckFuaW1hdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0YXNrVG9CYWNrRXhpdEFuaW1hdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0YXNrVG9Gcm9udEVudGVyQW5pbWF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRhc2tUb0Zyb250RXhpdEFuaW1hdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0ZXh0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRleHRBcHBlYXJhbmNlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRleHRBcHBlYXJhbmNlQnV0dG9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRleHRBcHBlYXJhbmNlSW52ZXJzZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0ZXh0QXBwZWFyYW5jZUxhcmdlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRleHRBcHBlYXJhbmNlTGFyZ2VJbnZlcnNlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRleHRBcHBlYXJhbmNlTWVkaXVtCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRleHRBcHBlYXJhbmNlTWVkaXVtSW52ZXJzZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0ZXh0QXBwZWFyYW5jZVNtYWxsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRleHRBcHBlYXJhbmNlU21hbGxJbnZlcnNlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRleHRDaGVja01hcmsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGV4dENoZWNrTWFya0ludmVyc2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGV4dENvbG9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRleHRDb2xvckhpZ2hsaWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0ZXh0Q29sb3JIaW50Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRleHRDb2xvckhpbnRJbnZlcnNlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRleHRDb2xvckxpbmsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGV4dENvbG9yUHJpbWFyeQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0ZXh0Q29sb3JQcmltYXJ5RGlzYWJsZU9ubHkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGV4dENvbG9yUHJpbWFyeUludmVyc2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGV4dENvbG9yUHJpbWFyeUludmVyc2VOb0Rpc2FibGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGV4dENvbG9yUHJpbWFyeU5vRGlzYWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0ZXh0Q29sb3JTZWNvbmRhcnkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGV4dENvbG9yU2Vjb25kYXJ5SW52ZXJzZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0ZXh0Q29sb3JTZWNvbmRhcnlJbnZlcnNlTm9EaXNhYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRleHRDb2xvclNlY29uZGFyeU5vRGlzYWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0ZXh0Q29sb3JUZXJ0aWFyeQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0ZXh0Q29sb3JUZXJ0aWFyeUludmVyc2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGV4dEZpbHRlckVuYWJsZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGV4dE9mZgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0ZXh0T24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGV4dFNjYWxlWAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0ZXh0U2l6ZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0ZXh0U3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGV4dFZpZXdTdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0aGVtZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0aGlja25lc3NSYXRpbwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0aHVtYgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0aHVtYk9mZnNldAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0aWxlTW9kZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0aW50Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRpdGxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRpdGxlQ29uZGVuc2VkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRvQWxwaGEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdG9EZWdyZWVzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRvWERlbHRhCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRvWFNjYWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRvWURlbHRhCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRvWVNjYWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRvcAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0b3BCcmlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdG9wRGFyawotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0b3BMZWZ0UmFkaXVzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRvcFJpZ2h0UmFkaXVzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRyYW5zY3JpcHRNb2RlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHR5cGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdHlwZWZhY2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdW5zZWxlY3RlZEFscGhhCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHVzZUxldmVsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHZhbHVlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHZhcmlhYmxlUGFkZGluZwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB2ZXJzaW9uQ29kZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB2ZXJzaW9uTmFtZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB2ZXJ0aWNhbERpdmlkZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdmVydGljYWxTcGFjaW5nCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHZpc2liaWxpdHkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdmlzaWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB3ZWJWaWV3U3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgd2VpZ2h0U3VtCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHdpZGdldExheW91dAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB3aWR0aAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB3aW5kb3dBbmltYXRpb25TdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB3aW5kb3dCYWNrZ3JvdW5kCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHdpbmRvd0NvbnRlbnRPdmVybGF5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHdpbmRvd0VudGVyQW5pbWF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHdpbmRvd0V4aXRBbmltYXRpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgd2luZG93RnJhbWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgd2luZG93RnVsbHNjcmVlbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB3aW5kb3dIaWRlQW5pbWF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHdpbmRvd0lzRmxvYXRpbmcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgd2luZG93SXNUcmFuc2x1Y2VudAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB3aW5kb3dOb1RpdGxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHdpbmRvd1Nob3dBbmltYXRpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgd2luZG93VGl0bGVCYWNrZ3JvdW5kU3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgd2luZG93VGl0bGVTaXplCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHdpbmRvd1RpdGxlU3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgd3JpdGVQZXJtaXNzaW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgeQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB5ZXNOb1ByZWZlcmVuY2VTdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB6QWRqdXN0bWVudAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvUjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNSBuYW1lID1jb2xvciApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5SJGNvbG9yIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBiYWNrZ3JvdW5kX2RhcmsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYmFja2dyb3VuZF9saWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBibGFjawotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkYXJrZXJfZ3JheQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcmltYXJ5X3RleHRfZGFyawotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcmltYXJ5X3RleHRfZGFya19ub2Rpc2FibGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJpbWFyeV90ZXh0X2xpZ2h0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByaW1hcnlfdGV4dF9saWdodF9ub2Rpc2FibGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2Vjb25kYXJ5X3RleHRfZGFyawotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzZWNvbmRhcnlfdGV4dF9kYXJrX25vZGlzYWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzZWNvbmRhcnlfdGV4dF9saWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzZWNvbmRhcnlfdGV4dF9saWdodF9ub2Rpc2FibGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGFiX2luZGljYXRvcl90ZXh0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRlcnRpYXJ5X3RleHRfZGFyawotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0ZXJ0aWFyeV90ZXh0X2xpZ2h0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRyYW5zcGFyZW50Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHdoaXRlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHdpZGdldF9lZGl0dGV4dF9kYXJrCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI1IG5hbWUgPWRpbWVuICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL1I7ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLlIkZGltZW4gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGFwcF9pY29uX3NpemUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGh1bWJuYWlsX2hlaWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0aHVtYm5haWxfd2lkdGgKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL1I7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjUgbmFtZSA9ZHJhd2FibGUgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQuUiRkcmF3YWJsZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYWxlcnRfZGFya19mcmFtZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBhbGVydF9saWdodF9mcmFtZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBhcnJvd19kb3duX2Zsb2F0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGFycm93X3VwX2Zsb2F0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJvdHRvbV9iYXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYnRuX2RlZmF1bHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYnRuX2RlZmF1bHRfc21hbGwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYnRuX2RpYWxvZwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBidG5fZHJvcGRvd24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYnRuX21pbnVzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ0bl9wbHVzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ0bl9yYWRpbwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBidG5fc3RhcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBidG5fc3Rhcl9iaWdfb2ZmCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ0bl9zdGFyX2JpZ19vbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBidXR0b25fb25vZmZfaW5kaWNhdG9yX29mZgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBidXR0b25fb25vZmZfaW5kaWNhdG9yX29uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNoZWNrYm94X29mZl9iYWNrZ3JvdW5kCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNoZWNrYm94X29uX2JhY2tncm91bmQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGlhbG9nX2ZyYW1lCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGRpdmlkZXJfaG9yaXpvbnRhbF9icmlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGl2aWRlcl9ob3Jpem9udGFsX2RhcmsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGl2aWRlcl9ob3Jpem9udGFsX2RpbV9kYXJrCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGRpdmlkZXJfaG9yaXpvbnRhbF90ZXh0ZmllbGQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZWRpdF90ZXh0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGVkaXRib3hfYmFja2dyb3VuZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBlZGl0Ym94X2JhY2tncm91bmRfbm9ybWFsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGVkaXRib3hfZHJvcGRvd25fZGFya19mcmFtZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBlZGl0Ym94X2Ryb3Bkb3duX2xpZ2h0X2ZyYW1lCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGdhbGxlcnlfdGh1bWIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfZGVsZXRlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX2RpYWxvZ19hbGVydAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19kaWFsb2dfZGlhbGVyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX2RpYWxvZ19lbWFpbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19kaWFsb2dfaW5mbwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19kaWFsb2dfbWFwCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX2lucHV0X2FkZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19pbnB1dF9kZWxldGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfaW5wdXRfZ2V0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX2xvY2tfaWRsZV9hbGFybQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19sb2NrX2lkbGVfY2hhcmdpbmcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfbG9ja19pZGxlX2xvY2sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfbG9ja19pZGxlX2xvd19iYXR0ZXJ5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX2xvY2tfbG9jawotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19sb2NrX3Bvd2VyX29mZgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19sb2NrX3NpbGVudF9tb2RlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX2xvY2tfc2lsZW50X21vZGVfb2ZmCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX21lZGlhX2ZmCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX21lZGlhX25leHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfbWVkaWFfcGF1c2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfbWVkaWFfcGxheQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19tZWRpYV9wcmV2aW91cwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19tZWRpYV9yZXcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfbWVudV9hZGQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfbWVudV9hZ2VuZGEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfbWVudV9hbHdheXNfbGFuZHNjYXBlX3BvcnRyYWl0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX21lbnVfY2FsbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19tZW51X2NhbWVyYQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19tZW51X2Nsb3NlX2NsZWFyX2NhbmNlbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19tZW51X2NvbXBhc3MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfbWVudV9jcm9wCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX21lbnVfZGF5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX21lbnVfZGVsZXRlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX21lbnVfZGlyZWN0aW9ucwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19tZW51X2VkaXQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfbWVudV9nYWxsZXJ5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX21lbnVfaGVscAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19tZW51X2luZm9fZGV0YWlscwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19tZW51X21hbmFnZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19tZW51X21hcG1vZGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfbWVudV9tb250aAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19tZW51X21vcmUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfbWVudV9teV9jYWxlbmRhcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19tZW51X215bG9jYXRpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfbWVudV9teXBsYWNlcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19tZW51X3ByZWZlcmVuY2VzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX21lbnVfcmVjZW50X2hpc3RvcnkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfbWVudV9yZXBvcnRfaW1hZ2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfbWVudV9yZXZlcnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfbWVudV9yb3RhdGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfbWVudV9zYXZlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX21lbnVfc2VhcmNoCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX21lbnVfc2VuZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19tZW51X3NldF9hcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19tZW51X3NoYXJlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX21lbnVfc2xpZGVzaG93Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX21lbnVfc29ydF9hbHBoYWJldGljYWxseQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19tZW51X3NvcnRfYnlfc2l6ZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19tZW51X3RvZGF5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX21lbnVfdXBsb2FkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX21lbnVfdXBsb2FkX3lvdV90dWJlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX21lbnVfdmlldwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19tZW51X3dlZWsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfbWVudV96b29tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX25vdGlmaWNhdGlvbl9jbGVhcl9hbGwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfbm90aWZpY2F0aW9uX292ZXJsYXkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfcGFydGlhbF9zZWN1cmUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfcG9wdXBfZGlza19mdWxsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX3BvcHVwX3JlbWluZGVyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX3BvcHVwX3N5bmMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfc2VhcmNoX2NhdGVnb3J5X2RlZmF1bHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfc2VjdXJlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBtZW51X2ZyYW1lCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1lbnVfZnVsbF9mcmFtZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBtZW51aXRlbV9iYWNrZ3JvdW5kCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBpY3R1cmVfZnJhbWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJlc2VuY2VfYXdheQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcmVzZW5jZV9idXN5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByZXNlbmNlX2ludmlzaWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcmVzZW5jZV9vZmZsaW5lCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByZXNlbmNlX29ubGluZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcm9ncmVzc19ob3Jpem9udGFsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByb2dyZXNzX2luZGV0ZXJtaW5hdGVfaG9yaXpvbnRhbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCByYWRpb2J1dHRvbl9vZmZfYmFja2dyb3VuZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCByYWRpb2J1dHRvbl9vbl9iYWNrZ3JvdW5kCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNjcmVlbl9iYWNrZ3JvdW5kX2RhcmsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2NyZWVuX2JhY2tncm91bmRfbGlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3Bpbm5lcl9iYWNrZ3JvdW5kCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNwaW5uZXJfZHJvcGRvd25fYmFja2dyb3VuZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGFyX2JpZ19vZmYKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3Rhcl9iaWdfb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3Rhcl9vZmYKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3Rhcl9vbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0X25vdGlmeV9jYWxsX211dGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdF9ub3RpZnlfY2hhdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0X25vdGlmeV9lcnJvcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0X25vdGlmeV9taXNzZWRfY2FsbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0X25vdGlmeV9tb3JlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXRfbm90aWZ5X3NkY2FyZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0X25vdGlmeV9zZGNhcmRfdXNiCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXRfbm90aWZ5X3N5bmMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdF9ub3RpZnlfc3luY19ub2FuaW0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdF9ub3RpZnlfdm9pY2VtYWlsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXRfc3lzX2RhdGFfYmx1ZXRvb3RoCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXRfc3lzX2Rvd25sb2FkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXRfc3lzX2Rvd25sb2FkX2RvbmUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdF9zeXNfaGVhZHNldAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0X3N5c19waG9uZV9jYWxsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXRfc3lzX3Bob25lX2NhbGxfZm9yd2FyZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0X3N5c19waG9uZV9jYWxsX29uX2hvbGQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdF9zeXNfc3BlYWtlcnBob25lCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXRfc3lzX3VwbG9hZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0X3N5c191cGxvYWRfZG9uZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0X3N5c193YXJuaW5nCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXR1c19iYXJfaXRlbV9hcHBfYmFja2dyb3VuZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0dXNfYmFyX2l0ZW1fYmFja2dyb3VuZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzeW1fYWN0aW9uX2NhbGwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3ltX2FjdGlvbl9jaGF0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN5bV9hY3Rpb25fZW1haWwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3ltX2NhbGxfaW5jb21pbmcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3ltX2NhbGxfbWlzc2VkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN5bV9jYWxsX291dGdvaW5nCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN5bV9jb250YWN0X2NhcmQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3ltX2RlZl9hcHBfaWNvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0aXRsZV9iYXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdG9hc3RfZnJhbWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgem9vbV9wbGF0ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNSBuYW1lID1pZCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9SOyApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5SJGlkIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBiYWNrZ3JvdW5kCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ1dHRvbjEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYnV0dG9uMgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBidXR0b24zCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNoZWNrYm94Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNvbnRlbnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZWRpdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBlbXB0eQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBoaW50Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNvbjEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNvbjIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaW5wdXQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGlzdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBtZXNzYWdlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByaW1hcnkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJvZ3Jlc3MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2Vjb25kYXJ5UHJvZ3Jlc3MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2VsZWN0ZWRJY29uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN1bW1hcnkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGFiY29udGVudAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0YWJob3N0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRhYnMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGV4dDEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGV4dDIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGl0bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdG9nZ2xlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHdpZGdldF9mcmFtZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvUjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNSBuYW1lID1sYXlvdXQgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQuUiRsYXlvdXQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGFjdGl2aXR5X2xpc3RfaXRlbQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBicm93c2VyX2xpbmtfY29udGV4dF9oZWFkZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZXhwYW5kYWJsZV9saXN0X2NvbnRlbnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJlZmVyZW5jZV9jYXRlZ29yeQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzZWxlY3RfZGlhbG9nX2l0ZW0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2VsZWN0X2RpYWxvZ19tdWx0aWNob2ljZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzZWxlY3RfZGlhbG9nX3NpbmdsZWNob2ljZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzaW1wbGVfZHJvcGRvd25faXRlbV8xbGluZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzaW1wbGVfZXhwYW5kYWJsZV9saXN0X2l0ZW1fMQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzaW1wbGVfZXhwYW5kYWJsZV9saXN0X2l0ZW1fMgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzaW1wbGVfZ2FsbGVyeV9pdGVtCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNpbXBsZV9saXN0X2l0ZW1fMQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzaW1wbGVfbGlzdF9pdGVtXzIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2ltcGxlX2xpc3RfaXRlbV9jaGVja2VkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNpbXBsZV9saXN0X2l0ZW1fbXVsdGlwbGVfY2hvaWNlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNpbXBsZV9saXN0X2l0ZW1fc2luZ2xlX2Nob2ljZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzaW1wbGVfc3Bpbm5lcl9kcm9wZG93bl9pdGVtCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNpbXBsZV9zcGlubmVyX2l0ZW0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGVzdF9saXN0X2l0ZW0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdHdvX2xpbmVfbGlzdF9pdGVtCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI1IG5hbWUgPXBsdXJhbHMgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvUjsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQuUiRwbHVyYWxzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNSBuYW1lID1yYXcgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvUjsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQuUiRyYXcgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI1IG5hbWUgPXN0cmluZyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9SOyApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5SJHN0cmluZyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVmlkZW9WaWV3X2Vycm9yX2J1dHRvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWaWRlb1ZpZXdfZXJyb3JfdGV4dF91bmtub3duCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZpZGVvVmlld19lcnJvcl90aXRsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjYW5jZWwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY29weQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb3B5VXJsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGN1dAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkZWZhdWx0TXNpc2RuQWxwaGFUYWcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGVmYXVsdFZvaWNlTWFpbEFscGhhVGFnCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGVtcHR5UGhvbmVOdW1iZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaHR0cEVycm9yQmFkVXJsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGh0dHBFcnJvclVuc3VwcG9ydGVkU2NoZW1lCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG5vCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG9rCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBhc3RlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNlYXJjaF9nbwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzZWxlY3RBbGwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdW5rbm93bk5hbWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdW50aXRsZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgeWVzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9SOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI1IG5hbWUgPXN0eWxlICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLlIkc3R5bGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuaW1hdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmltYXRpb25fQWN0aXZpdHkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5pbWF0aW9uX0RpYWxvZwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmltYXRpb25fVG9hc3QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5pbWF0aW9uX1RyYW5zbHVjZW50Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1lZGlhQnV0dG9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1lZGlhQnV0dG9uX0Zmd2QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTWVkaWFCdXR0b25fTmV4dAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNZWRpYUJ1dHRvbl9QYXVzZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNZWRpYUJ1dHRvbl9QbGF5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1lZGlhQnV0dG9uX1ByZXZpb3VzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1lZGlhQnV0dG9uX1JldwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0QXBwZWFyYW5jZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0QXBwZWFyYW5jZV9EaWFsb2dXaW5kb3dUaXRsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0QXBwZWFyYW5jZV9JbnZlcnNlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRBcHBlYXJhbmNlX0xhcmdlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRBcHBlYXJhbmNlX0xhcmdlX0ludmVyc2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dEFwcGVhcmFuY2VfTWVkaXVtCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRBcHBlYXJhbmNlX01lZGl1bV9JbnZlcnNlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRBcHBlYXJhbmNlX1NtYWxsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRBcHBlYXJhbmNlX1NtYWxsX0ludmVyc2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dEFwcGVhcmFuY2VfVGhlbWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dEFwcGVhcmFuY2VfVGhlbWVfRGlhbG9nCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRBcHBlYXJhbmNlX1dpZGdldAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0QXBwZWFyYW5jZV9XaWRnZXRfQnV0dG9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRBcHBlYXJhbmNlX1dpZGdldF9Ecm9wRG93bkhpbnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dEFwcGVhcmFuY2VfV2lkZ2V0X0Ryb3BEb3duSXRlbQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0QXBwZWFyYW5jZV9XaWRnZXRfRWRpdFRleHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dEFwcGVhcmFuY2VfV2lkZ2V0X0ljb25NZW51X0l0ZW0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dEFwcGVhcmFuY2VfV2lkZ2V0X1RhYldpZGdldAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0QXBwZWFyYW5jZV9XaWRnZXRfVGV4dFZpZXcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dEFwcGVhcmFuY2VfV2lkZ2V0X1RleHRWaWV3X1BvcHVwTWVudQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0QXBwZWFyYW5jZV9XaWRnZXRfVGV4dFZpZXdfU3Bpbm5lckl0ZW0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dEFwcGVhcmFuY2VfV2luZG93VGl0bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfQmxhY2sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfQmxhY2tfTm9UaXRsZUJhcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9CbGFja19Ob1RpdGxlQmFyX0Z1bGxzY3JlZW4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfRGlhbG9nCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX0xpZ2h0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX0xpZ2h0X05vVGl0bGVCYXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfTGlnaHRfTm9UaXRsZUJhcl9GdWxsc2NyZWVuCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX05vVGl0bGVCYXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfTm9UaXRsZUJhcl9GdWxsc2NyZWVuCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX1RyYW5zbHVjZW50Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX1RyYW5zbHVjZW50X05vVGl0bGVCYXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfVHJhbnNsdWNlbnRfTm9UaXRsZUJhcl9GdWxsc2NyZWVuCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpZGdldAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaWRnZXRfQWJzTGlzdFZpZXcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2lkZ2V0X0F1dG9Db21wbGV0ZVRleHRWaWV3Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpZGdldF9CdXR0b24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2lkZ2V0X0J1dHRvbl9JbnNldAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaWRnZXRfQnV0dG9uX1NtYWxsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpZGdldF9CdXR0b25fVG9nZ2xlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpZGdldF9Db21wb3VuZEJ1dHRvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaWRnZXRfQ29tcG91bmRCdXR0b25fQ2hlY2tCb3gKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2lkZ2V0X0NvbXBvdW5kQnV0dG9uX1JhZGlvQnV0dG9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpZGdldF9Db21wb3VuZEJ1dHRvbl9TdGFyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpZGdldF9Ecm9wRG93bkl0ZW0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2lkZ2V0X0Ryb3BEb3duSXRlbV9TcGlubmVyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpZGdldF9FZGl0VGV4dAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaWRnZXRfRXhwYW5kYWJsZUxpc3RWaWV3Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpZGdldF9HYWxsZXJ5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpZGdldF9HcmlkVmlldwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaWRnZXRfSW1hZ2VCdXR0b24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2lkZ2V0X0ltYWdlV2VsbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaWRnZXRfTGlzdFZpZXcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2lkZ2V0X0xpc3RWaWV3X0Ryb3BEb3duCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpZGdldF9MaXN0Vmlld19NZW51Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpZGdldF9MaXN0Vmlld19XaGl0ZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaWRnZXRfUG9wdXBXaW5kb3cKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2lkZ2V0X1Byb2dyZXNzQmFyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpZGdldF9Qcm9ncmVzc0Jhcl9Ib3Jpem9udGFsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpZGdldF9Qcm9ncmVzc0Jhcl9MYXJnZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaWRnZXRfUHJvZ3Jlc3NCYXJfU21hbGwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2lkZ2V0X1JhdGluZ0JhcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaWRnZXRfU2Nyb2xsVmlldwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaWRnZXRfU2Vla0JhcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaWRnZXRfU3Bpbm5lcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaWRnZXRfVGFiV2lkZ2V0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpZGdldF9UZXh0VmlldwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaWRnZXRfVGV4dFZpZXdfUG9wdXBNZW51Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpZGdldF9UZXh0Vmlld19TcGlubmVySXRlbQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaWRnZXRfV2ViVmlldwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNSBuYW1lID1zdHlsZWFibGUgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvUjsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQuUiRzdHlsZWFibGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gQWJzTGlzdFZpZXcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQWJzTGlzdFZpZXdfY2FjaGVDb2xvckhpbnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQWJzTGlzdFZpZXdfZHJhd1NlbGVjdG9yT25Ub3AKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQWJzTGlzdFZpZXdfbGlzdFNlbGVjdG9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFic0xpc3RWaWV3X3Njcm9sbGluZ0NhY2hlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFic0xpc3RWaWV3X3N0YWNrRnJvbUJvdHRvbQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBYnNMaXN0Vmlld190ZXh0RmlsdGVyRW5hYmxlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBYnNMaXN0Vmlld190cmFuc2NyaXB0TW9kZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEFic1NwaW5uZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQWJzU3Bpbm5lcl9lbnRyaWVzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gQWJzb2x1dGVMYXlvdXRfTGF5b3V0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFic29sdXRlTGF5b3V0X0xheW91dF9sYXlvdXRfeAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBYnNvbHV0ZUxheW91dF9MYXlvdXRfbGF5b3V0X3kKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBBY2NlbGVyYXRlSW50ZXJwb2xhdG9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFjY2VsZXJhdGVJbnRlcnBvbGF0b3JfZmFjdG9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gQWxlcnREaWFsb2cKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQWxlcnREaWFsb2dfYm90dG9tQnJpZ2h0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFsZXJ0RGlhbG9nX2JvdHRvbURhcmsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQWxlcnREaWFsb2dfYm90dG9tTWVkaXVtCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFsZXJ0RGlhbG9nX2NlbnRlckJyaWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbGVydERpYWxvZ19jZW50ZXJEYXJrCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFsZXJ0RGlhbG9nX2NlbnRlck1lZGl1bQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbGVydERpYWxvZ19mdWxsQnJpZ2h0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFsZXJ0RGlhbG9nX2Z1bGxEYXJrCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFsZXJ0RGlhbG9nX3RvcEJyaWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbGVydERpYWxvZ190b3BEYXJrCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gQWxwaGFBbmltYXRpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQWxwaGFBbmltYXRpb25fZnJvbUFscGhhCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFscGhhQW5pbWF0aW9uX3RvQWxwaGEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBBbmFsb2dDbG9jawotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmFsb2dDbG9ja19kaWFsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuYWxvZ0Nsb2NrX2hhbmRfaG91cgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmFsb2dDbG9ja19oYW5kX21pbnV0ZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEFuZHJvaWRNYW5pZmVzdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEFuZHJvaWRNYW5pZmVzdEFjdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RBY3Rpb25fbmFtZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEFuZHJvaWRNYW5pZmVzdEFjdGl2aXR5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gQW5kcm9pZE1hbmlmZXN0QWN0aXZpdHlBbGlhcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RBY3Rpdml0eUFsaWFzX2VuYWJsZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0QWN0aXZpdHlBbGlhc19leHBvcnRlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RBY3Rpdml0eUFsaWFzX2ljb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0QWN0aXZpdHlBbGlhc19sYWJlbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RBY3Rpdml0eUFsaWFzX25hbWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0QWN0aXZpdHlBbGlhc19wZXJtaXNzaW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdEFjdGl2aXR5QWxpYXNfdGFyZ2V0QWN0aXZpdHkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0QWN0aXZpdHlfYWxsb3dUYXNrUmVwYXJlbnRpbmcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0QWN0aXZpdHlfYWx3YXlzUmV0YWluVGFza1N0YXRlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdEFjdGl2aXR5X2NsZWFyVGFza09uTGF1bmNoCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdEFjdGl2aXR5X2NvbmZpZ0NoYW5nZXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0QWN0aXZpdHlfZW5hYmxlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RBY3Rpdml0eV9leGNsdWRlRnJvbVJlY2VudHMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0QWN0aXZpdHlfZXhwb3J0ZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0QWN0aXZpdHlfZmluaXNoT25UYXNrTGF1bmNoCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdEFjdGl2aXR5X2ljb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0QWN0aXZpdHlfbGFiZWwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0QWN0aXZpdHlfbGF1bmNoTW9kZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RBY3Rpdml0eV9tdWx0aXByb2Nlc3MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0QWN0aXZpdHlfbmFtZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RBY3Rpdml0eV9wZXJtaXNzaW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdEFjdGl2aXR5X3Byb2Nlc3MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0QWN0aXZpdHlfc2NyZWVuT3JpZW50YXRpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0QWN0aXZpdHlfc3RhdGVOb3ROZWVkZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0QWN0aXZpdHlfdGFza0FmZmluaXR5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdEFjdGl2aXR5X3RoZW1lCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gQW5kcm9pZE1hbmlmZXN0QXBwbGljYXRpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0QXBwbGljYXRpb25fYWxsb3dDbGVhclVzZXJEYXRhCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdEFwcGxpY2F0aW9uX2FsbG93VGFza1JlcGFyZW50aW5nCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdEFwcGxpY2F0aW9uX2RlYnVnZ2FibGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0QXBwbGljYXRpb25fZGVzY3JpcHRpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0QXBwbGljYXRpb25fZW5hYmxlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RBcHBsaWNhdGlvbl9oYXNDb2RlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdEFwcGxpY2F0aW9uX2ljb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0QXBwbGljYXRpb25fbGFiZWwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0QXBwbGljYXRpb25fbWFuYWdlU3BhY2VBY3Rpdml0eQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RBcHBsaWNhdGlvbl9uYW1lCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdEFwcGxpY2F0aW9uX3Blcm1pc3Npb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0QXBwbGljYXRpb25fcGVyc2lzdGVudAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RBcHBsaWNhdGlvbl9wcm9jZXNzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdEFwcGxpY2F0aW9uX3Rhc2tBZmZpbml0eQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RBcHBsaWNhdGlvbl90aGVtZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEFuZHJvaWRNYW5pZmVzdENhdGVnb3J5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdENhdGVnb3J5X25hbWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBBbmRyb2lkTWFuaWZlc3REYXRhCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdERhdGFfaG9zdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3REYXRhX21pbWVUeXBlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdERhdGFfcGF0aAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3REYXRhX3BhdGhQYXR0ZXJuCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdERhdGFfcGF0aFByZWZpeAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3REYXRhX3BvcnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0RGF0YV9zY2hlbWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBBbmRyb2lkTWFuaWZlc3RHcmFudFVyaVBlcm1pc3Npb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0R3JhbnRVcmlQZXJtaXNzaW9uX3BhdGgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0R3JhbnRVcmlQZXJtaXNzaW9uX3BhdGhQYXR0ZXJuCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdEdyYW50VXJpUGVybWlzc2lvbl9wYXRoUHJlZml4Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gQW5kcm9pZE1hbmlmZXN0SW5zdHJ1bWVudGF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdEluc3RydW1lbnRhdGlvbl9mdW5jdGlvbmFsVGVzdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RJbnN0cnVtZW50YXRpb25faGFuZGxlUHJvZmlsaW5nCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdEluc3RydW1lbnRhdGlvbl9pY29uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdEluc3RydW1lbnRhdGlvbl9sYWJlbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RJbnN0cnVtZW50YXRpb25fbmFtZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RJbnN0cnVtZW50YXRpb25fdGFyZ2V0UGFja2FnZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEFuZHJvaWRNYW5pZmVzdEludGVudEZpbHRlcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RJbnRlbnRGaWx0ZXJfaWNvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RJbnRlbnRGaWx0ZXJfbGFiZWwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0SW50ZW50RmlsdGVyX3ByaW9yaXR5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gQW5kcm9pZE1hbmlmZXN0TWV0YURhdGEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0TWV0YURhdGFfbmFtZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RNZXRhRGF0YV9yZXNvdXJjZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RNZXRhRGF0YV92YWx1ZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEFuZHJvaWRNYW5pZmVzdFBlcm1pc3Npb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBBbmRyb2lkTWFuaWZlc3RQZXJtaXNzaW9uR3JvdXAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0UGVybWlzc2lvbkdyb3VwX2Rlc2NyaXB0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdFBlcm1pc3Npb25Hcm91cF9pY29uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdFBlcm1pc3Npb25Hcm91cF9sYWJlbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RQZXJtaXNzaW9uR3JvdXBfbmFtZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEFuZHJvaWRNYW5pZmVzdFBlcm1pc3Npb25UcmVlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdFBlcm1pc3Npb25UcmVlX2ljb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0UGVybWlzc2lvblRyZWVfbGFiZWwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0UGVybWlzc2lvblRyZWVfbmFtZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RQZXJtaXNzaW9uX2Rlc2NyaXB0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdFBlcm1pc3Npb25faWNvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RQZXJtaXNzaW9uX2xhYmVsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdFBlcm1pc3Npb25fbmFtZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RQZXJtaXNzaW9uX3Blcm1pc3Npb25Hcm91cAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RQZXJtaXNzaW9uX3Byb3RlY3Rpb25MZXZlbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEFuZHJvaWRNYW5pZmVzdFByb3ZpZGVyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdFByb3ZpZGVyX2F1dGhvcml0aWVzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdFByb3ZpZGVyX2VuYWJsZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0UHJvdmlkZXJfZXhwb3J0ZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0UHJvdmlkZXJfZ3JhbnRVcmlQZXJtaXNzaW9ucwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RQcm92aWRlcl9pY29uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdFByb3ZpZGVyX2luaXRPcmRlcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RQcm92aWRlcl9sYWJlbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RQcm92aWRlcl9tdWx0aXByb2Nlc3MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0UHJvdmlkZXJfbmFtZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RQcm92aWRlcl9wZXJtaXNzaW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdFByb3ZpZGVyX3Byb2Nlc3MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0UHJvdmlkZXJfcmVhZFBlcm1pc3Npb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0UHJvdmlkZXJfc3luY2FibGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0UHJvdmlkZXJfd3JpdGVQZXJtaXNzaW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gQW5kcm9pZE1hbmlmZXN0UmVjZWl2ZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0UmVjZWl2ZXJfZW5hYmxlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RSZWNlaXZlcl9leHBvcnRlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RSZWNlaXZlcl9pY29uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdFJlY2VpdmVyX2xhYmVsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdFJlY2VpdmVyX25hbWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0UmVjZWl2ZXJfcGVybWlzc2lvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RSZWNlaXZlcl9wcm9jZXNzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gQW5kcm9pZE1hbmlmZXN0U2VydmljZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RTZXJ2aWNlX2VuYWJsZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0U2VydmljZV9leHBvcnRlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RTZXJ2aWNlX2ljb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0U2VydmljZV9sYWJlbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RTZXJ2aWNlX25hbWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0U2VydmljZV9wZXJtaXNzaW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdFNlcnZpY2VfcHJvY2VzcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEFuZHJvaWRNYW5pZmVzdFVzZXNMaWJyYXJ5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdFVzZXNMaWJyYXJ5X25hbWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBBbmRyb2lkTWFuaWZlc3RVc2VzUGVybWlzc2lvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RVc2VzUGVybWlzc2lvbl9uYW1lCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gQW5kcm9pZE1hbmlmZXN0VXNlc1NkawotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RVc2VzU2RrX21pblNka1ZlcnNpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0X3NoYXJlZFVzZXJJZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RfdmVyc2lvbkNvZGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0X3ZlcnNpb25OYW1lCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gQW5pbWF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gQW5pbWF0aW9uRHJhd2FibGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBBbmltYXRpb25EcmF3YWJsZUl0ZW0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5pbWF0aW9uRHJhd2FibGVJdGVtX2RyYXdhYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuaW1hdGlvbkRyYXdhYmxlSXRlbV9kdXJhdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmltYXRpb25EcmF3YWJsZV9vbmVzaG90Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuaW1hdGlvbkRyYXdhYmxlX3ZhcmlhYmxlUGFkZGluZwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmltYXRpb25EcmF3YWJsZV92aXNpYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gQW5pbWF0aW9uU2V0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuaW1hdGlvblNldF9zaGFyZUludGVycG9sYXRvcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmltYXRpb25fZHVyYXRpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5pbWF0aW9uX2ZpbGxBZnRlcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmltYXRpb25fZmlsbEJlZm9yZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmltYXRpb25faW50ZXJwb2xhdG9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuaW1hdGlvbl9yZXBlYXRDb3VudAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmltYXRpb25fcmVwZWF0TW9kZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmltYXRpb25fc3RhcnRPZmZzZXQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5pbWF0aW9uX3pBZGp1c3RtZW50Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gQXV0b0NvbXBsZXRlVGV4dFZpZXcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQXV0b0NvbXBsZXRlVGV4dFZpZXdfY29tcGxldGlvbkhpbnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQXV0b0NvbXBsZXRlVGV4dFZpZXdfY29tcGxldGlvbkhpbnRWaWV3Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEF1dG9Db21wbGV0ZVRleHRWaWV3X2NvbXBsZXRpb25UaHJlc2hvbGQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQXV0b0NvbXBsZXRlVGV4dFZpZXdfZHJvcERvd25TZWxlY3RvcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEJpdG1hcERyYXdhYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJpdG1hcERyYXdhYmxlX2FudGlhbGlhcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCaXRtYXBEcmF3YWJsZV9kaXRoZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQml0bWFwRHJhd2FibGVfZmlsdGVyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJpdG1hcERyYXdhYmxlX2dyYXZpdHkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQml0bWFwRHJhd2FibGVfc3JjCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJpdG1hcERyYXdhYmxlX3RpbGVNb2RlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gQnV0dG9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gQ2hlY2tCb3hQcmVmZXJlbmNlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENoZWNrQm94UHJlZmVyZW5jZV9kaXNhYmxlRGVwZW5kZW50c1N0YXRlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENoZWNrQm94UHJlZmVyZW5jZV9zdW1tYXJ5T2ZmCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENoZWNrQm94UHJlZmVyZW5jZV9zdW1tYXJ5T24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBDaGVja2VkVGV4dFZpZXcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ2hlY2tlZFRleHRWaWV3X2NoZWNrTWFyawotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDaGVja2VkVGV4dFZpZXdfY2hlY2tlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIENocm9ub21ldGVyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENocm9ub21ldGVyX2Zvcm1hdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIENsaXBEcmF3YWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDbGlwRHJhd2FibGVfY2xpcE9yaWVudGF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENsaXBEcmF3YWJsZV9kcmF3YWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDbGlwRHJhd2FibGVfZ3Jhdml0eQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIENvbG9yRHJhd2FibGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ29sb3JEcmF3YWJsZV9jb2xvcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIENvbXBvdW5kQnV0dG9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENvbXBvdW5kQnV0dG9uX2J1dHRvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDb21wb3VuZEJ1dHRvbl9jaGVja2VkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gQ3ljbGVJbnRlcnBvbGF0b3IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ3ljbGVJbnRlcnBvbGF0b3JfY3ljbGVzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gRGF0ZVBpY2tlcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBEYXRlUGlja2VyX2VuZFllYXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRGF0ZVBpY2tlcl9zdGFydFllYXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBEZWNlbGVyYXRlSW50ZXJwb2xhdG9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERlY2VsZXJhdGVJbnRlcnBvbGF0b3JfZmFjdG9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gRGlhbG9nUHJlZmVyZW5jZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBEaWFsb2dQcmVmZXJlbmNlX2RpYWxvZ0ljb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRGlhbG9nUHJlZmVyZW5jZV9kaWFsb2dMYXlvdXQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRGlhbG9nUHJlZmVyZW5jZV9kaWFsb2dNZXNzYWdlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERpYWxvZ1ByZWZlcmVuY2VfZGlhbG9nVGl0bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRGlhbG9nUHJlZmVyZW5jZV9uZWdhdGl2ZUJ1dHRvblRleHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRGlhbG9nUHJlZmVyZW5jZV9wb3NpdGl2ZUJ1dHRvblRleHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBEcmF3YWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIERyYXdhYmxlQ29ybmVycwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBEcmF3YWJsZUNvcm5lcnNfYm90dG9tTGVmdFJhZGl1cwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBEcmF3YWJsZUNvcm5lcnNfYm90dG9tUmlnaHRSYWRpdXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRHJhd2FibGVDb3JuZXJzX3JhZGl1cwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBEcmF3YWJsZUNvcm5lcnNfdG9wTGVmdFJhZGl1cwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBEcmF3YWJsZUNvcm5lcnNfdG9wUmlnaHRSYWRpdXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBEcmF3YWJsZVN0YXRlcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBEcmF3YWJsZVN0YXRlc19zdGF0ZV9hY3RpdmUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRHJhd2FibGVTdGF0ZXNfc3RhdGVfY2hlY2thYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERyYXdhYmxlU3RhdGVzX3N0YXRlX2NoZWNrZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRHJhd2FibGVTdGF0ZXNfc3RhdGVfZW5hYmxlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBEcmF3YWJsZVN0YXRlc19zdGF0ZV9maXJzdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBEcmF3YWJsZVN0YXRlc19zdGF0ZV9mb2N1c2VkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERyYXdhYmxlU3RhdGVzX3N0YXRlX2xhc3QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRHJhd2FibGVTdGF0ZXNfc3RhdGVfbWlkZGxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERyYXdhYmxlU3RhdGVzX3N0YXRlX3ByZXNzZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRHJhd2FibGVTdGF0ZXNfc3RhdGVfc2VsZWN0ZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRHJhd2FibGVTdGF0ZXNfc3RhdGVfc2luZ2xlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERyYXdhYmxlU3RhdGVzX3N0YXRlX3dpbmRvd19mb2N1c2VkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERyYXdhYmxlX3Zpc2libGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBFZGl0VGV4dAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEV4cGFuZGFibGVMaXN0Q2hpbGRJbmRpY2F0b3JTdGF0ZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFeHBhbmRhYmxlTGlzdENoaWxkSW5kaWNhdG9yU3RhdGVfc3RhdGVfbGFzdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEV4cGFuZGFibGVMaXN0R3JvdXBJbmRpY2F0b3JTdGF0ZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFeHBhbmRhYmxlTGlzdEdyb3VwSW5kaWNhdG9yU3RhdGVfc3RhdGVfZW1wdHkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRXhwYW5kYWJsZUxpc3RHcm91cEluZGljYXRvclN0YXRlX3N0YXRlX2V4cGFuZGVkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gRXhwYW5kYWJsZUxpc3RWaWV3Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEV4cGFuZGFibGVMaXN0Vmlld19jaGlsZERpdmlkZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRXhwYW5kYWJsZUxpc3RWaWV3X2NoaWxkSW5kaWNhdG9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEV4cGFuZGFibGVMaXN0Vmlld19jaGlsZEluZGljYXRvckxlZnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRXhwYW5kYWJsZUxpc3RWaWV3X2NoaWxkSW5kaWNhdG9yUmlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRXhwYW5kYWJsZUxpc3RWaWV3X2dyb3VwSW5kaWNhdG9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEV4cGFuZGFibGVMaXN0Vmlld19pbmRpY2F0b3JMZWZ0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEV4cGFuZGFibGVMaXN0Vmlld19pbmRpY2F0b3JSaWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEZyYW1lTGF5b3V0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gRnJhbWVMYXlvdXRfTGF5b3V0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZyYW1lTGF5b3V0X0xheW91dF9sYXlvdXRfZ3Jhdml0eQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGcmFtZUxheW91dF9mb3JlZ3JvdW5kCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZyYW1lTGF5b3V0X2ZvcmVncm91bmRHcmF2aXR5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZyYW1lTGF5b3V0X21lYXN1cmVBbGxDaGlsZHJlbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEdhbGxlcnkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR2FsbGVyeV9hbmltYXRpb25EdXJhdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHYWxsZXJ5X2dyYXZpdHkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR2FsbGVyeV9zcGFjaW5nCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdhbGxlcnlfdW5zZWxlY3RlZEFscGhhCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gR3JhZGllbnREcmF3YWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEdyYWRpZW50RHJhd2FibGVHcmFkaWVudAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHcmFkaWVudERyYXdhYmxlR3JhZGllbnRfYW5nbGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR3JhZGllbnREcmF3YWJsZUdyYWRpZW50X2NlbnRlckNvbG9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdyYWRpZW50RHJhd2FibGVHcmFkaWVudF9jZW50ZXJYCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdyYWRpZW50RHJhd2FibGVHcmFkaWVudF9jZW50ZXJZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdyYWRpZW50RHJhd2FibGVHcmFkaWVudF9lbmRDb2xvcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHcmFkaWVudERyYXdhYmxlR3JhZGllbnRfZ3JhZGllbnRSYWRpdXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR3JhZGllbnREcmF3YWJsZUdyYWRpZW50X3N0YXJ0Q29sb3IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR3JhZGllbnREcmF3YWJsZUdyYWRpZW50X3R5cGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR3JhZGllbnREcmF3YWJsZUdyYWRpZW50X3VzZUxldmVsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gR3JhZGllbnREcmF3YWJsZVBhZGRpbmcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR3JhZGllbnREcmF3YWJsZVBhZGRpbmdfYm90dG9tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdyYWRpZW50RHJhd2FibGVQYWRkaW5nX2xlZnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR3JhZGllbnREcmF3YWJsZVBhZGRpbmdfcmlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR3JhZGllbnREcmF3YWJsZVBhZGRpbmdfdG9wCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gR3JhZGllbnREcmF3YWJsZVNpemUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR3JhZGllbnREcmF3YWJsZVNpemVfaGVpZ2h0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdyYWRpZW50RHJhd2FibGVTaXplX3dpZHRoCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gR3JhZGllbnREcmF3YWJsZVNvbGlkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdyYWRpZW50RHJhd2FibGVTb2xpZF9jb2xvcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEdyYWRpZW50RHJhd2FibGVTdHJva2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR3JhZGllbnREcmF3YWJsZVN0cm9rZV9jb2xvcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHcmFkaWVudERyYXdhYmxlU3Ryb2tlX2Rhc2hHYXAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR3JhZGllbnREcmF3YWJsZVN0cm9rZV9kYXNoV2lkdGgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR3JhZGllbnREcmF3YWJsZVN0cm9rZV93aWR0aAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHcmFkaWVudERyYXdhYmxlX2lubmVyUmFkaXVzUmF0aW8KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR3JhZGllbnREcmF3YWJsZV9zaGFwZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHcmFkaWVudERyYXdhYmxlX3RoaWNrbmVzc1JhdGlvCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdyYWRpZW50RHJhd2FibGVfdXNlTGV2ZWwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR3JhZGllbnREcmF3YWJsZV92aXNpYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gR3JpZExheW91dEFuaW1hdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHcmlkTGF5b3V0QW5pbWF0aW9uX2NvbHVtbkRlbGF5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdyaWRMYXlvdXRBbmltYXRpb25fZGlyZWN0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdyaWRMYXlvdXRBbmltYXRpb25fZGlyZWN0aW9uUHJpb3JpdHkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR3JpZExheW91dEFuaW1hdGlvbl9yb3dEZWxheQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEdyaWRWaWV3Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdyaWRWaWV3X2NvbHVtbldpZHRoCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdyaWRWaWV3X2dyYXZpdHkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR3JpZFZpZXdfaG9yaXpvbnRhbFNwYWNpbmcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR3JpZFZpZXdfbnVtQ29sdW1ucwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHcmlkVmlld19zdHJldGNoTW9kZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHcmlkVmlld192ZXJ0aWNhbFNwYWNpbmcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBJY29uTWVudVZpZXcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSWNvbk1lbnVWaWV3X21heEl0ZW1zUGVyUm93Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEljb25NZW51Vmlld19tYXhSb3dzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEljb25NZW51Vmlld19tb3JlSWNvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJY29uTWVudVZpZXdfcm93SGVpZ2h0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gSW1hZ2VTd2l0Y2hlcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEltYWdlVmlldwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJbWFnZVZpZXdfYWRqdXN0Vmlld0JvdW5kcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJbWFnZVZpZXdfYmFzZWxpbmVBbGlnbkJvdHRvbQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJbWFnZVZpZXdfY3JvcFRvUGFkZGluZwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJbWFnZVZpZXdfbWF4SGVpZ2h0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEltYWdlVmlld19tYXhXaWR0aAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJbWFnZVZpZXdfc2NhbGVUeXBlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEltYWdlVmlld19zcmMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSW1hZ2VWaWV3X3RpbnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBJbnNldERyYXdhYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEluc2V0RHJhd2FibGVfZHJhd2FibGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSW5zZXREcmF3YWJsZV9pbnNldEJvdHRvbQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJbnNldERyYXdhYmxlX2luc2V0TGVmdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJbnNldERyYXdhYmxlX2luc2V0UmlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSW5zZXREcmF3YWJsZV9pbnNldFRvcAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJbnNldERyYXdhYmxlX3Zpc2libGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBJbnRlbnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBJbnRlbnRDYXRlZ29yeQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJbnRlbnRDYXRlZ29yeV9uYW1lCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gSW50ZW50RXh0cmEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSW50ZW50RXh0cmFfbmFtZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJbnRlbnRFeHRyYV92YWx1ZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJbnRlbnRfYWN0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEludGVudF9kYXRhCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEludGVudF9taW1lVHlwZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJbnRlbnRfdGFyZ2V0Q2xhc3MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSW50ZW50X3RhcmdldFBhY2thZ2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBMYXllckRyYXdhYmxlSXRlbQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMYXllckRyYXdhYmxlSXRlbV9ib3R0b20KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTGF5ZXJEcmF3YWJsZUl0ZW1fZHJhd2FibGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTGF5ZXJEcmF3YWJsZUl0ZW1faWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTGF5ZXJEcmF3YWJsZUl0ZW1fbGVmdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMYXllckRyYXdhYmxlSXRlbV9yaWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMYXllckRyYXdhYmxlSXRlbV90b3AKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBMYXlvdXRBbmltYXRpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTGF5b3V0QW5pbWF0aW9uX2FuaW1hdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMYXlvdXRBbmltYXRpb25fYW5pbWF0aW9uT3JkZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTGF5b3V0QW5pbWF0aW9uX2RlbGF5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExheW91dEFuaW1hdGlvbl9pbnRlcnBvbGF0b3IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBMZXZlbExpc3REcmF3YWJsZUl0ZW0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTGV2ZWxMaXN0RHJhd2FibGVJdGVtX2RyYXdhYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExldmVsTGlzdERyYXdhYmxlSXRlbV9tYXhMZXZlbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMZXZlbExpc3REcmF3YWJsZUl0ZW1fbWluTGV2ZWwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBMaW5lYXJMYXlvdXQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBMaW5lYXJMYXlvdXRfTGF5b3V0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExpbmVhckxheW91dF9MYXlvdXRfbGF5b3V0X2dyYXZpdHkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTGluZWFyTGF5b3V0X0xheW91dF9sYXlvdXRfaGVpZ2h0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExpbmVhckxheW91dF9MYXlvdXRfbGF5b3V0X3dlaWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMaW5lYXJMYXlvdXRfTGF5b3V0X2xheW91dF93aWR0aAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMaW5lYXJMYXlvdXRfYmFzZWxpbmVBbGlnbmVkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExpbmVhckxheW91dF9iYXNlbGluZUFsaWduZWRDaGlsZEluZGV4Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExpbmVhckxheW91dF9ncmF2aXR5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExpbmVhckxheW91dF9vcmllbnRhdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMaW5lYXJMYXlvdXRfd2VpZ2h0U3VtCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gTGlzdFByZWZlcmVuY2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTGlzdFByZWZlcmVuY2VfZW50cmllcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMaXN0UHJlZmVyZW5jZV9lbnRyeVZhbHVlcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIExpc3RWaWV3Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExpc3RWaWV3X2Nob2ljZU1vZGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTGlzdFZpZXdfZGl2aWRlcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMaXN0Vmlld19kaXZpZGVySGVpZ2h0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExpc3RWaWV3X2VudHJpZXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBNYXBWaWV3Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1hcFZpZXdfYXBpS2V5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gTWVudQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIE1lbnVHcm91cAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNZW51R3JvdXBfY2hlY2thYmxlQmVoYXZpb3IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTWVudUdyb3VwX2VuYWJsZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTWVudUdyb3VwX2lkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1lbnVHcm91cF9tZW51Q2F0ZWdvcnkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTWVudUdyb3VwX29yZGVySW5DYXRlZ29yeQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNZW51R3JvdXBfdmlzaWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIE1lbnVJdGVtCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gTWVudUl0ZW1DaGVja2VkRm9jdXNlZFN0YXRlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1lbnVJdGVtQ2hlY2tlZEZvY3VzZWRTdGF0ZV9zdGF0ZV9jaGVja2FibGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTWVudUl0ZW1DaGVja2VkRm9jdXNlZFN0YXRlX3N0YXRlX2NoZWNrZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTWVudUl0ZW1DaGVja2VkRm9jdXNlZFN0YXRlX3N0YXRlX2ZvY3VzZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBNZW51SXRlbUNoZWNrZWRTdGF0ZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNZW51SXRlbUNoZWNrZWRTdGF0ZV9zdGF0ZV9jaGVja2FibGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTWVudUl0ZW1DaGVja2VkU3RhdGVfc3RhdGVfY2hlY2tlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIE1lbnVJdGVtVW5jaGVja2VkRm9jdXNlZFN0YXRlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1lbnVJdGVtVW5jaGVja2VkRm9jdXNlZFN0YXRlX3N0YXRlX2NoZWNrYWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNZW51SXRlbVVuY2hlY2tlZEZvY3VzZWRTdGF0ZV9zdGF0ZV9mb2N1c2VkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gTWVudUl0ZW1VbmNoZWNrZWRTdGF0ZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNZW51SXRlbVVuY2hlY2tlZFN0YXRlX3N0YXRlX2NoZWNrYWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNZW51SXRlbV9hbHBoYWJldGljU2hvcnRjdXQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTWVudUl0ZW1fY2hlY2thYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1lbnVJdGVtX2NoZWNrZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTWVudUl0ZW1fZW5hYmxlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNZW51SXRlbV9pY29uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1lbnVJdGVtX2lkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1lbnVJdGVtX21lbnVDYXRlZ29yeQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNZW51SXRlbV9udW1lcmljU2hvcnRjdXQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTWVudUl0ZW1fb3JkZXJJbkNhdGVnb3J5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1lbnVJdGVtX3RpdGxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1lbnVJdGVtX3RpdGxlQ29uZGVuc2VkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1lbnVJdGVtX3Zpc2libGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBNZW51VmlldwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNZW51Vmlld19oZWFkZXJCYWNrZ3JvdW5kCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1lbnVWaWV3X2hvcml6b250YWxEaXZpZGVyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1lbnVWaWV3X2l0ZW1CYWNrZ3JvdW5kCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1lbnVWaWV3X2l0ZW1JY29uRGlzYWJsZWRBbHBoYQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNZW51Vmlld19pdGVtVGV4dEFwcGVhcmFuY2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTWVudVZpZXdfdmVydGljYWxEaXZpZGVyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1lbnVWaWV3X3dpbmRvd0FuaW1hdGlvblN0eWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gUG9wdXBXaW5kb3cKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBQb3B1cFdpbmRvd0JhY2tncm91bmRTdGF0ZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQb3B1cFdpbmRvd0JhY2tncm91bmRTdGF0ZV9zdGF0ZV9hYm92ZV9hbmNob3IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUG9wdXBXaW5kb3dfcG9wdXBCYWNrZ3JvdW5kCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gUHJlZmVyZW5jZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIFByZWZlcmVuY2VHcm91cAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQcmVmZXJlbmNlR3JvdXBfb3JkZXJpbmdGcm9tWG1sCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFByZWZlcmVuY2VfZGVmYXVsdFZhbHVlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFByZWZlcmVuY2VfZGVwZW5kZW5jeQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQcmVmZXJlbmNlX2VuYWJsZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUHJlZmVyZW5jZV9rZXkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUHJlZmVyZW5jZV9sYXlvdXQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUHJlZmVyZW5jZV9vcmRlcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQcmVmZXJlbmNlX3BlcnNpc3RlbnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUHJlZmVyZW5jZV9zZWxlY3RhYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFByZWZlcmVuY2Vfc2hvdWxkRGlzYWJsZVZpZXcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUHJlZmVyZW5jZV9zdW1tYXJ5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFByZWZlcmVuY2VfdGl0bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUHJlZmVyZW5jZV93aWRnZXRMYXlvdXQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBQcm9ncmVzc0JhcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQcm9ncmVzc0Jhcl9pbmRldGVybWluYXRlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFByb2dyZXNzQmFyX2luZGV0ZXJtaW5hdGVCZWhhdmlvcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQcm9ncmVzc0Jhcl9pbmRldGVybWluYXRlRHJhd2FibGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUHJvZ3Jlc3NCYXJfaW5kZXRlcm1pbmF0ZUR1cmF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFByb2dyZXNzQmFyX2luZGV0ZXJtaW5hdGVPbmx5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFByb2dyZXNzQmFyX2ludGVycG9sYXRvcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQcm9ncmVzc0Jhcl9tYXgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUHJvZ3Jlc3NCYXJfbWF4SGVpZ2h0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFByb2dyZXNzQmFyX21heFdpZHRoCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFByb2dyZXNzQmFyX21pbkhlaWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQcm9ncmVzc0Jhcl9taW5XaWR0aAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQcm9ncmVzc0Jhcl9wcm9ncmVzcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQcm9ncmVzc0Jhcl9wcm9ncmVzc0RyYXdhYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFByb2dyZXNzQmFyX3NlY29uZGFyeVByb2dyZXNzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gUmFkaW9Hcm91cAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSYWRpb0dyb3VwX2NoZWNrZWRCdXR0b24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUmFkaW9Hcm91cF9vcmllbnRhdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIFJhdGluZ0JhcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSYXRpbmdCYXJfaXNJbmRpY2F0b3IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUmF0aW5nQmFyX251bVN0YXJzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJhdGluZ0Jhcl9yYXRpbmcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUmF0aW5nQmFyX3N0ZXBTaXplCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gUmVsYXRpdmVMYXlvdXQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBSZWxhdGl2ZUxheW91dF9MYXlvdXQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUmVsYXRpdmVMYXlvdXRfTGF5b3V0X2xheW91dF9hYm92ZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSZWxhdGl2ZUxheW91dF9MYXlvdXRfbGF5b3V0X2FsaWduQmFzZWxpbmUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUmVsYXRpdmVMYXlvdXRfTGF5b3V0X2xheW91dF9hbGlnbkJvdHRvbQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSZWxhdGl2ZUxheW91dF9MYXlvdXRfbGF5b3V0X2FsaWduTGVmdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSZWxhdGl2ZUxheW91dF9MYXlvdXRfbGF5b3V0X2FsaWduUGFyZW50Qm90dG9tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJlbGF0aXZlTGF5b3V0X0xheW91dF9sYXlvdXRfYWxpZ25QYXJlbnRMZWZ0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJlbGF0aXZlTGF5b3V0X0xheW91dF9sYXlvdXRfYWxpZ25QYXJlbnRSaWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSZWxhdGl2ZUxheW91dF9MYXlvdXRfbGF5b3V0X2FsaWduUGFyZW50VG9wCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJlbGF0aXZlTGF5b3V0X0xheW91dF9sYXlvdXRfYWxpZ25SaWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSZWxhdGl2ZUxheW91dF9MYXlvdXRfbGF5b3V0X2FsaWduVG9wCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJlbGF0aXZlTGF5b3V0X0xheW91dF9sYXlvdXRfYWxpZ25XaXRoUGFyZW50SWZNaXNzaW5nCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJlbGF0aXZlTGF5b3V0X0xheW91dF9sYXlvdXRfYmVsb3cKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUmVsYXRpdmVMYXlvdXRfTGF5b3V0X2xheW91dF9jZW50ZXJIb3Jpem9udGFsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJlbGF0aXZlTGF5b3V0X0xheW91dF9sYXlvdXRfY2VudGVySW5QYXJlbnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUmVsYXRpdmVMYXlvdXRfTGF5b3V0X2xheW91dF9jZW50ZXJWZXJ0aWNhbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSZWxhdGl2ZUxheW91dF9MYXlvdXRfbGF5b3V0X3RvTGVmdE9mCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJlbGF0aXZlTGF5b3V0X0xheW91dF9sYXlvdXRfdG9SaWdodE9mCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJlbGF0aXZlTGF5b3V0X2dyYXZpdHkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUmVsYXRpdmVMYXlvdXRfaWdub3JlR3Jhdml0eQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIFJpbmd0b25lUHJlZmVyZW5jZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSaW5ndG9uZVByZWZlcmVuY2VfcmluZ3RvbmVUeXBlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJpbmd0b25lUHJlZmVyZW5jZV9zaG93RGVmYXVsdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSaW5ndG9uZVByZWZlcmVuY2Vfc2hvd1NpbGVudAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIFJvdGF0ZUFuaW1hdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSb3RhdGVBbmltYXRpb25fZnJvbURlZ3JlZXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUm90YXRlQW5pbWF0aW9uX3Bpdm90WAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSb3RhdGVBbmltYXRpb25fcGl2b3RZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJvdGF0ZUFuaW1hdGlvbl90b0RlZ3JlZXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBSb3RhdGVEcmF3YWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSb3RhdGVEcmF3YWJsZV9kcmF3YWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSb3RhdGVEcmF3YWJsZV9mcm9tRGVncmVlcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSb3RhdGVEcmF3YWJsZV9waXZvdFgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUm90YXRlRHJhd2FibGVfcGl2b3RZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJvdGF0ZURyYXdhYmxlX3RvRGVncmVlcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSb3RhdGVEcmF3YWJsZV92aXNpYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gU2NhbGVBbmltYXRpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU2NhbGVBbmltYXRpb25fZnJvbVhTY2FsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTY2FsZUFuaW1hdGlvbl9mcm9tWVNjYWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNjYWxlQW5pbWF0aW9uX3Bpdm90WAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTY2FsZUFuaW1hdGlvbl9waXZvdFkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU2NhbGVBbmltYXRpb25fdG9YU2NhbGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU2NhbGVBbmltYXRpb25fdG9ZU2NhbGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBTY2FsZURyYXdhYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNjYWxlRHJhd2FibGVfZHJhd2FibGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU2NhbGVEcmF3YWJsZV9zY2FsZUdyYXZpdHkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU2NhbGVEcmF3YWJsZV9zY2FsZUhlaWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTY2FsZURyYXdhYmxlX3NjYWxlV2lkdGgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBTY3JvbGxWaWV3Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNjcm9sbFZpZXdfZmlsbFZpZXdwb3J0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gU2VhcmNoYWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIFNlYXJjaGFibGVBY3Rpb25LZXkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU2VhcmNoYWJsZUFjdGlvbktleV9rZXljb2RlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNlYXJjaGFibGVBY3Rpb25LZXlfcXVlcnlBY3Rpb25Nc2cKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU2VhcmNoYWJsZUFjdGlvbktleV9zdWdnZXN0QWN0aW9uTXNnCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNlYXJjaGFibGVBY3Rpb25LZXlfc3VnZ2VzdEFjdGlvbk1zZ0NvbHVtbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTZWFyY2hhYmxlX2hpbnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU2VhcmNoYWJsZV9pY29uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNlYXJjaGFibGVfbGFiZWwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU2VhcmNoYWJsZV9zZWFyY2hCdXR0b25UZXh0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNlYXJjaGFibGVfc2VhcmNoTW9kZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTZWFyY2hhYmxlX3NlYXJjaFN1Z2dlc3RBdXRob3JpdHkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU2VhcmNoYWJsZV9zZWFyY2hTdWdnZXN0SW50ZW50QWN0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNlYXJjaGFibGVfc2VhcmNoU3VnZ2VzdEludGVudERhdGEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU2VhcmNoYWJsZV9zZWFyY2hTdWdnZXN0UGF0aAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTZWFyY2hhYmxlX3NlYXJjaFN1Z2dlc3RTZWxlY3Rpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBTZWVrQmFyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNlZWtCYXJfdGh1bWIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU2Vla0Jhcl90aHVtYk9mZnNldAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIFNoYXBlRHJhd2FibGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBTaGFwZURyYXdhYmxlUGFkZGluZwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTaGFwZURyYXdhYmxlUGFkZGluZ19ib3R0b20KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU2hhcGVEcmF3YWJsZVBhZGRpbmdfbGVmdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTaGFwZURyYXdhYmxlUGFkZGluZ19yaWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTaGFwZURyYXdhYmxlUGFkZGluZ190b3AKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU2hhcGVEcmF3YWJsZV9jb2xvcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTaGFwZURyYXdhYmxlX2hlaWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTaGFwZURyYXdhYmxlX3dpZHRoCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gU2xpZGluZ0RyYXdlcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTbGlkaW5nRHJhd2VyX2FuaW1hdGVPbkNsaWNrCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNsaWRpbmdEcmF3ZXJfYm90dG9tT2Zmc2V0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNsaWRpbmdEcmF3ZXJfY29udGVudAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTbGlkaW5nRHJhd2VyX2hhbmRsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTbGlkaW5nRHJhd2VyX29yaWVudGF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNsaWRpbmdEcmF3ZXJfdG9wT2Zmc2V0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gU3Bpbm5lcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTcGlubmVyX3Byb21wdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIFN0YXRlTGlzdERyYXdhYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFN0YXRlTGlzdERyYXdhYmxlX2NvbnN0YW50U2l6ZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTdGF0ZUxpc3REcmF3YWJsZV92YXJpYWJsZVBhZGRpbmcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU3RhdGVMaXN0RHJhd2FibGVfdmlzaWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIFRhYldpZGdldAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIFRhYmxlTGF5b3V0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRhYmxlTGF5b3V0X2NvbGxhcHNlQ29sdW1ucwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUYWJsZUxheW91dF9zaHJpbmtDb2x1bW5zCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRhYmxlTGF5b3V0X3N0cmV0Y2hDb2x1bW5zCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gVGFibGVSb3cKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBUYWJsZVJvd19DZWxsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRhYmxlUm93X0NlbGxfbGF5b3V0X2NvbHVtbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUYWJsZVJvd19DZWxsX2xheW91dF9zcGFuCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gVGV4dEFwcGVhcmFuY2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dEFwcGVhcmFuY2VfdGV4dENvbG9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRBcHBlYXJhbmNlX3RleHRDb2xvckhpZ2hsaWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0QXBwZWFyYW5jZV90ZXh0Q29sb3JIaW50Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRBcHBlYXJhbmNlX3RleHRDb2xvckxpbmsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dEFwcGVhcmFuY2VfdGV4dFNpemUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dEFwcGVhcmFuY2VfdGV4dFN0eWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRBcHBlYXJhbmNlX3R5cGVmYWNlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gVGV4dFN3aXRjaGVyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gVGV4dFZpZXcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dFZpZXdfYXV0b0xpbmsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dFZpZXdfYXV0b1RleHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dFZpZXdfYnVmZmVyVHlwZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0Vmlld19jYXBpdGFsaXplCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRWaWV3X2N1cnNvclZpc2libGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dFZpZXdfZGlnaXRzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRWaWV3X2RyYXdhYmxlQm90dG9tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRWaWV3X2RyYXdhYmxlTGVmdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0Vmlld19kcmF3YWJsZVBhZGRpbmcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dFZpZXdfZHJhd2FibGVSaWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0Vmlld19kcmF3YWJsZVRvcAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0Vmlld19lZGl0YWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0Vmlld19lbGxpcHNpemUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dFZpZXdfZW1zCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRWaWV3X2VuYWJsZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dFZpZXdfZnJlZXplc1RleHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dFZpZXdfZ3Jhdml0eQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0Vmlld19oZWlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dFZpZXdfaGludAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0Vmlld19pbmNsdWRlRm9udFBhZGRpbmcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dFZpZXdfaW5wdXRNZXRob2QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dFZpZXdfbGluZVNwYWNpbmdFeHRyYQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0Vmlld19saW5lU3BhY2luZ011bHRpcGxpZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dFZpZXdfbGluZXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dFZpZXdfbGlua3NDbGlja2FibGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dFZpZXdfbWF4RW1zCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRWaWV3X21heEhlaWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0Vmlld19tYXhMZW5ndGgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dFZpZXdfbWF4TGluZXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dFZpZXdfbWF4V2lkdGgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dFZpZXdfbWluRW1zCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRWaWV3X21pbkhlaWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0Vmlld19taW5MaW5lcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0Vmlld19taW5XaWR0aAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0Vmlld19udW1lcmljCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRWaWV3X3Bhc3N3b3JkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRWaWV3X3Bob25lTnVtYmVyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRWaWV3X3Njcm9sbEhvcml6b250YWxseQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0Vmlld19zZWxlY3RBbGxPbkZvY3VzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRWaWV3X3NoYWRvd0NvbG9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRWaWV3X3NoYWRvd0R4Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRWaWV3X3NoYWRvd0R5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRWaWV3X3NoYWRvd1JhZGl1cwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0Vmlld19zaW5nbGVMaW5lCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRWaWV3X3RleHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dFZpZXdfdGV4dEFwcGVhcmFuY2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dFZpZXdfdGV4dENvbG9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRWaWV3X3RleHRDb2xvckhpZ2hsaWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0Vmlld190ZXh0Q29sb3JIaW50Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRWaWV3X3RleHRDb2xvckxpbmsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dFZpZXdfdGV4dFNjYWxlWAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0Vmlld190ZXh0U2l6ZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0Vmlld190ZXh0U3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dFZpZXdfdHlwZWZhY2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dFZpZXdfd2lkdGgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBUaGVtZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9hYnNMaXN0Vmlld1N0eWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX2FsZXJ0RGlhbG9nU3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfYXV0b0NvbXBsZXRlVGV4dFZpZXdTdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9iYWNrZ3JvdW5kRGltQW1vdW50Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX2J1dHRvblN0eWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX2J1dHRvblN0eWxlSW5zZXQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfYnV0dG9uU3R5bGVTbWFsbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9idXR0b25TdHlsZVRvZ2dsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9jaGVja0JveFByZWZlcmVuY2VTdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9jaGVja2JveFN0eWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX2NvbG9yQmFja2dyb3VuZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9jb2xvckZvcmVncm91bmQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfY29sb3JGb3JlZ3JvdW5kSW52ZXJzZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9kaWFsb2dQcmVmZXJlbmNlU3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfZGlzYWJsZWRBbHBoYQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9kcm9wRG93bkhpbnRBcHBlYXJhbmNlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX2Ryb3BEb3duSXRlbVN0eWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX2Ryb3BEb3duTGlzdFZpZXdTdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9lZGl0VGV4dFByZWZlcmVuY2VTdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9lZGl0VGV4dFN0eWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX2V4cGFuZGFibGVMaXN0UHJlZmVycmVkQ2hpbGRJbmRpY2F0b3JMZWZ0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX2V4cGFuZGFibGVMaXN0UHJlZmVycmVkQ2hpbGRJbmRpY2F0b3JSaWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9leHBhbmRhYmxlTGlzdFByZWZlcnJlZENoaWxkUGFkZGluZ0xlZnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfZXhwYW5kYWJsZUxpc3RQcmVmZXJyZWRJdGVtSW5kaWNhdG9yTGVmdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9leHBhbmRhYmxlTGlzdFByZWZlcnJlZEl0ZW1JbmRpY2F0b3JSaWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9leHBhbmRhYmxlTGlzdFByZWZlcnJlZEl0ZW1QYWRkaW5nTGVmdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9leHBhbmRhYmxlTGlzdFZpZXdTdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9nYWxsZXJ5SXRlbUJhY2tncm91bmQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfZ2FsbGVyeVN0eWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX2dyaWRWaWV3U3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfaW1hZ2VCdXR0b25TdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9pbWFnZVdlbGxTdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9saXN0Q2hvaWNlSW5kaWNhdG9yTXVsdGlwbGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfbGlzdENob2ljZUluZGljYXRvclNpbmdsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9saXN0RGl2aWRlcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9saXN0UHJlZmVycmVkSXRlbUhlaWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9saXN0U2VwYXJhdG9yVGV4dFZpZXdTdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9saXN0Vmlld1N0eWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX2xpc3RWaWV3V2hpdGVTdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9tYXBWaWV3U3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfcGFuZWxCYWNrZ3JvdW5kCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX3BhbmVsQ29sb3JCYWNrZ3JvdW5kCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX3BhbmVsQ29sb3JGb3JlZ3JvdW5kCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX3BhbmVsRnVsbEJhY2tncm91bmQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfcGFuZWxUZXh0QXBwZWFyYW5jZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9wb3B1cFdpbmRvd1N0eWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX3ByZWZlcmVuY2VDYXRlZ29yeVN0eWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX3ByZWZlcmVuY2VJbmZvcm1hdGlvblN0eWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX3ByZWZlcmVuY2VMYXlvdXRDaGlsZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9wcmVmZXJlbmNlU2NyZWVuU3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfcHJlZmVyZW5jZVN0eWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX3Byb2dyZXNzQmFyU3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfcHJvZ3Jlc3NCYXJTdHlsZUhvcml6b250YWwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfcHJvZ3Jlc3NCYXJTdHlsZUxhcmdlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX3Byb2dyZXNzQmFyU3R5bGVTbWFsbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9wcm9ncmVzc0JhclN0eWxlU21hbGxUaXRsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9yYWRpb0J1dHRvblN0eWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX3JhdGluZ0JhclN0eWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX3JhdGluZ0JhclN0eWxlSW5kaWNhdG9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX3JhdGluZ0JhclN0eWxlU21hbGwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfcmluZ3RvbmVQcmVmZXJlbmNlU3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfc2Nyb2xsVmlld1N0eWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX3NlZWtCYXJTdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9zcGlubmVyRHJvcERvd25JdGVtU3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfc3Bpbm5lckl0ZW1TdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9zcGlubmVyU3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfc3RhclN0eWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX3RhYldpZGdldFN0eWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX3RleHRBcHBlYXJhbmNlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX3RleHRBcHBlYXJhbmNlQnV0dG9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX3RleHRBcHBlYXJhbmNlSW52ZXJzZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV90ZXh0QXBwZWFyYW5jZUxhcmdlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX3RleHRBcHBlYXJhbmNlTGFyZ2VJbnZlcnNlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX3RleHRBcHBlYXJhbmNlTWVkaXVtCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX3RleHRBcHBlYXJhbmNlTWVkaXVtSW52ZXJzZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV90ZXh0QXBwZWFyYW5jZVNtYWxsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX3RleHRBcHBlYXJhbmNlU21hbGxJbnZlcnNlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX3RleHRDaGVja01hcmsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfdGV4dENoZWNrTWFya0ludmVyc2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfdGV4dENvbG9ySGludEludmVyc2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfdGV4dENvbG9yUHJpbWFyeQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV90ZXh0Q29sb3JQcmltYXJ5RGlzYWJsZU9ubHkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfdGV4dENvbG9yUHJpbWFyeUludmVyc2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfdGV4dENvbG9yUHJpbWFyeUludmVyc2VOb0Rpc2FibGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfdGV4dENvbG9yUHJpbWFyeU5vRGlzYWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV90ZXh0Q29sb3JTZWNvbmRhcnkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfdGV4dENvbG9yU2Vjb25kYXJ5SW52ZXJzZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV90ZXh0Q29sb3JTZWNvbmRhcnlJbnZlcnNlTm9EaXNhYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX3RleHRDb2xvclNlY29uZGFyeU5vRGlzYWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV90ZXh0Q29sb3JUZXJ0aWFyeQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV90ZXh0Q29sb3JUZXJ0aWFyeUludmVyc2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfdGV4dFZpZXdTdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV93ZWJWaWV3U3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfd2luZG93QW5pbWF0aW9uU3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfd2luZG93QmFja2dyb3VuZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV93aW5kb3dDb250ZW50T3ZlcmxheQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV93aW5kb3dGcmFtZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV93aW5kb3dGdWxsc2NyZWVuCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX3dpbmRvd0lzRmxvYXRpbmcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfd2luZG93SXNUcmFuc2x1Y2VudAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV93aW5kb3dOb1RpdGxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX3dpbmRvd1RpdGxlQmFja2dyb3VuZFN0eWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX3dpbmRvd1RpdGxlU2l6ZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV93aW5kb3dUaXRsZVN0eWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX3llc05vUHJlZmVyZW5jZVN0eWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gVG9nZ2xlQnV0dG9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRvZ2dsZUJ1dHRvbl9kaXNhYmxlZEFscGhhCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRvZ2dsZUJ1dHRvbl90ZXh0T2ZmCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRvZ2dsZUJ1dHRvbl90ZXh0T24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBUcmFuc2xhdGVBbmltYXRpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVHJhbnNsYXRlQW5pbWF0aW9uX2Zyb21YRGVsdGEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVHJhbnNsYXRlQW5pbWF0aW9uX2Zyb21ZRGVsdGEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVHJhbnNsYXRlQW5pbWF0aW9uX3RvWERlbHRhCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRyYW5zbGF0ZUFuaW1hdGlvbl90b1lEZWx0YQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIFR3b0xpbmVMaXN0SXRlbQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUd29MaW5lTGlzdEl0ZW1fbW9kZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIFZlcnRpY2FsU2xpZGVyX0xheW91dAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWZXJ0aWNhbFNsaWRlcl9MYXlvdXRfbGF5b3V0X3NjYWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gVmlldwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIFZpZXdBbmltYXRvcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWaWV3QW5pbWF0b3JfaW5BbmltYXRpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVmlld0FuaW1hdG9yX291dEFuaW1hdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIFZpZXdEcmF3YWJsZVN0YXRlcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWaWV3RHJhd2FibGVTdGF0ZXNfc3RhdGVfZW5hYmxlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWaWV3RHJhd2FibGVTdGF0ZXNfc3RhdGVfZm9jdXNlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWaWV3RHJhd2FibGVTdGF0ZXNfc3RhdGVfcHJlc3NlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWaWV3RHJhd2FibGVTdGF0ZXNfc3RhdGVfc2VsZWN0ZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVmlld0RyYXdhYmxlU3RhdGVzX3N0YXRlX3dpbmRvd19mb2N1c2VkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gVmlld0ZsaXBwZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVmlld0ZsaXBwZXJfZmxpcEludGVydmFsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gVmlld0dyb3VwCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gVmlld0dyb3VwX0xheW91dAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWaWV3R3JvdXBfTGF5b3V0X2xheW91dF9oZWlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVmlld0dyb3VwX0xheW91dF9sYXlvdXRfd2lkdGgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBWaWV3R3JvdXBfTWFyZ2luTGF5b3V0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZpZXdHcm91cF9NYXJnaW5MYXlvdXRfbGF5b3V0X2hlaWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWaWV3R3JvdXBfTWFyZ2luTGF5b3V0X2xheW91dF9tYXJnaW4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVmlld0dyb3VwX01hcmdpbkxheW91dF9sYXlvdXRfbWFyZ2luQm90dG9tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZpZXdHcm91cF9NYXJnaW5MYXlvdXRfbGF5b3V0X21hcmdpbkxlZnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVmlld0dyb3VwX01hcmdpbkxheW91dF9sYXlvdXRfbWFyZ2luUmlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVmlld0dyb3VwX01hcmdpbkxheW91dF9sYXlvdXRfbWFyZ2luVG9wCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZpZXdHcm91cF9NYXJnaW5MYXlvdXRfbGF5b3V0X3dpZHRoCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZpZXdHcm91cF9hZGRTdGF0ZXNGcm9tQ2hpbGRyZW4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVmlld0dyb3VwX2Fsd2F5c0RyYXduV2l0aENhY2hlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZpZXdHcm91cF9hbmltYXRpb25DYWNoZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWaWV3R3JvdXBfY2xpcENoaWxkcmVuCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZpZXdHcm91cF9jbGlwVG9QYWRkaW5nCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZpZXdHcm91cF9kZXNjZW5kYW50Rm9jdXNhYmlsaXR5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZpZXdHcm91cF9sYXlvdXRBbmltYXRpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVmlld0dyb3VwX3BlcnNpc3RlbnREcmF3aW5nQ2FjaGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBWaWV3U3R1YgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWaWV3U3R1Yl9pbmZsYXRlZElkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZpZXdTdHViX2xheW91dAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIFZpZXdTd2l0Y2hlcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWaWV3X2JhY2tncm91bmQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVmlld19jbGlja2FibGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVmlld19kcmF3aW5nQ2FjaGVRdWFsaXR5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZpZXdfZHVwbGljYXRlUGFyZW50U3RhdGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVmlld19mYWRpbmdFZGdlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZpZXdfZmFkaW5nRWRnZUxlbmd0aAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWaWV3X2ZpdHNTeXN0ZW1XaW5kb3dzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZpZXdfZm9jdXNhYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZpZXdfZm9jdXNhYmxlSW5Ub3VjaE1vZGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVmlld19pZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWaWV3X2tlZXBTY3JlZW5PbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWaWV3X2xvbmdDbGlja2FibGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVmlld19taW5IZWlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVmlld19taW5XaWR0aAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWaWV3X25leHRGb2N1c0Rvd24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVmlld19uZXh0Rm9jdXNMZWZ0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZpZXdfbmV4dEZvY3VzUmlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVmlld19uZXh0Rm9jdXNVcAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWaWV3X3BhZGRpbmcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVmlld19wYWRkaW5nQm90dG9tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZpZXdfcGFkZGluZ0xlZnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVmlld19wYWRkaW5nUmlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVmlld19wYWRkaW5nVG9wCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZpZXdfc2F2ZUVuYWJsZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVmlld19zY3JvbGxYCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZpZXdfc2Nyb2xsWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWaWV3X3Njcm9sbGJhckFsd2F5c0RyYXdIb3Jpem9udGFsVHJhY2sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVmlld19zY3JvbGxiYXJBbHdheXNEcmF3VmVydGljYWxUcmFjawotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWaWV3X3Njcm9sbGJhclNpemUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVmlld19zY3JvbGxiYXJTdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWaWV3X3Njcm9sbGJhclRodW1iSG9yaXpvbnRhbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWaWV3X3Njcm9sbGJhclRodW1iVmVydGljYWwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVmlld19zY3JvbGxiYXJUcmFja0hvcml6b250YWwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVmlld19zY3JvbGxiYXJUcmFja1ZlcnRpY2FsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZpZXdfc2Nyb2xsYmFycwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWaWV3X3NvdW5kRWZmZWN0c0VuYWJsZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVmlld190YWcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVmlld192aXNpYmlsaXR5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gVm9sdW1lUHJlZmVyZW5jZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWb2x1bWVQcmVmZXJlbmNlX3N0cmVhbVR5cGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBXaW5kb3cKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBXaW5kb3dBbmltYXRpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2luZG93QW5pbWF0aW9uX2FjdGl2aXR5Q2xvc2VFbnRlckFuaW1hdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaW5kb3dBbmltYXRpb25fYWN0aXZpdHlDbG9zZUV4aXRBbmltYXRpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2luZG93QW5pbWF0aW9uX2FjdGl2aXR5T3BlbkVudGVyQW5pbWF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpbmRvd0FuaW1hdGlvbl9hY3Rpdml0eU9wZW5FeGl0QW5pbWF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpbmRvd0FuaW1hdGlvbl90YXNrQ2xvc2VFbnRlckFuaW1hdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaW5kb3dBbmltYXRpb25fdGFza0Nsb3NlRXhpdEFuaW1hdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaW5kb3dBbmltYXRpb25fdGFza09wZW5FbnRlckFuaW1hdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaW5kb3dBbmltYXRpb25fdGFza09wZW5FeGl0QW5pbWF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpbmRvd0FuaW1hdGlvbl90YXNrVG9CYWNrRW50ZXJBbmltYXRpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2luZG93QW5pbWF0aW9uX3Rhc2tUb0JhY2tFeGl0QW5pbWF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpbmRvd0FuaW1hdGlvbl90YXNrVG9Gcm9udEVudGVyQW5pbWF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpbmRvd0FuaW1hdGlvbl90YXNrVG9Gcm9udEV4aXRBbmltYXRpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2luZG93QW5pbWF0aW9uX3dpbmRvd0VudGVyQW5pbWF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpbmRvd0FuaW1hdGlvbl93aW5kb3dFeGl0QW5pbWF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpbmRvd0FuaW1hdGlvbl93aW5kb3dIaWRlQW5pbWF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpbmRvd0FuaW1hdGlvbl93aW5kb3dTaG93QW5pbWF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpbmRvd190ZXh0Q29sb3IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2luZG93X3dpbmRvd0FuaW1hdGlvblN0eWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpbmRvd193aW5kb3dCYWNrZ3JvdW5kCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpbmRvd193aW5kb3dDb250ZW50T3ZlcmxheQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaW5kb3dfd2luZG93RnJhbWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2luZG93X3dpbmRvd0Z1bGxzY3JlZW4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2luZG93X3dpbmRvd0lzRmxvYXRpbmcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2luZG93X3dpbmRvd0lzVHJhbnNsdWNlbnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2luZG93X3dpbmRvd05vVGl0bGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNSBuYW1lID14bWwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvUjsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQuUiR4bWwgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL1Ikc3R5bGVhYmxlO0xhbmRyb2lkL1IkeG1sO0xhbmRyb2lkL1Ikc3R5bGU7TGFuZHJvaWQvUiRzdHJpbmc7TGFuZHJvaWQvUiRyYXc7TGFuZHJvaWQvUiRwbHVyYWxzO0xhbmRyb2lkL1IkbGF5b3V0O0xhbmRyb2lkL1IkaWQ7TGFuZHJvaWQvUiRkcmF3YWJsZTtMYW5kcm9pZC9SJGRpbWVuO0xhbmRyb2lkL1IkY29sb3I7TGFuZHJvaWQvUiRhdHRyO0xhbmRyb2lkL1IkYXJyYXk7TGFuZHJvaWQvUiRhbmltOyApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5SIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPUFjY291bnRVcGRhdGVyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2FjY291bnRzL0FjY291bnRNb25pdG9yOyApCi0gY2xhc3MgYW5kcm9pZC5hY2NvdW50cy5BY2NvdW50TW9uaXRvciRBY2NvdW50VXBkYXRlciBleHRlbmRzIGphdmEubGFuZy5UaHJlYWQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLm9zLklCaW5kZXIgbVNlcnZpY2UKLQotZmluYWwgYW5kcm9pZC5hY2NvdW50cy5BY2NvdW50TW9uaXRvciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmFjY291bnRzLkFjY291bnRNb25pdG9yCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXB1YmxpYyB2b2lkIHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGJvb2xlYW4gbUFib3J0QnJvYWRjYXN0Ci0KLXByaXZhdGUgYm9vbGVhbiBtRGVidWdVbnJlZ2lzdGVyCi0KLXByaXZhdGUgYm9vbGVhbiBtT3JkZXJlZEhpbnQKLQotcHJpdmF0ZSBpbnQgbVJlc3VsdENvZGUKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1SZXN1bHREYXRhCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5CdW5kbGUgbVJlc3VsdEV4dHJhcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIGFib3J0QnJvYWRjYXN0KCkKLQotIHZvaWQgY2hlY2tTeW5jaHJvbm91c0hpbnQoKQotCi1wdWJsaWMgZmluYWwgdm9pZCBjbGVhckFib3J0QnJvYWRjYXN0KCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gZ2V0QWJvcnRCcm9hZGNhc3QoKQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBnZXREZWJ1Z1VucmVnaXN0ZXIoKQotCi1wdWJsaWMgZmluYWwgaW50IGdldFJlc3VsdENvZGUoKQotCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBnZXRSZXN1bHREYXRhKCkKLQotcHVibGljIGZpbmFsIGFuZHJvaWQub3MuQnVuZGxlIGdldFJlc3VsdEV4dHJhcygKLWJvb2xlYW4pCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uUmVjZWl2ZSgKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLmNvbnRlbnQuSW50ZW50KQotCi1wdWJsaWMgZmluYWwgdm9pZCBzZXREZWJ1Z1VucmVnaXN0ZXIoCi1ib29sZWFuKQotCi1wdWJsaWMgZmluYWwgdm9pZCBzZXRPcmRlcmVkSGludCgKLWJvb2xlYW4pCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHNldFJlc3VsdCgKLWludAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5vcy5CdW5kbGUpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHNldFJlc3VsdENvZGUoCi1pbnQpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHNldFJlc3VsdERhdGEoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgZmluYWwgdm9pZCBzZXRSZXN1bHRFeHRyYXMoCi1hbmRyb2lkLm9zLkJ1bmRsZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5jb250ZW50LlNlcnZpY2VDb25uZWN0aW9uIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uU2VydmljZUNvbm5lY3RlZCgKLWFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uU2VydmljZURpc2Nvbm5lY3RlZCgKLWFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvYWNjb3VudHMvQWNjb3VudE1vbml0b3IkQWNjb3VudFVwZGF0ZXI7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmFjY291bnRzLkFjY291bnRNb25pdG9yIGV4dGVuZHMgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyIGltcGxlbWVudHMgYW5kcm9pZC5jb250ZW50LlNlcnZpY2VDb25uZWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYm9vbGVhbiBtQ2xvc2VkCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgbUNvbnRleHQKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLmFjY291bnRzLkFjY291bnRNb25pdG9yTGlzdGVuZXIgbUxpc3RlbmVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQuYWNjb3VudHMuQWNjb3VudE1vbml0b3JMaXN0ZW5lcikKLQotc3RhdGljIGFuZHJvaWQuY29udGVudC5Db250ZXh0IGFjY2VzcyQwMDAoCi1hbmRyb2lkLmFjY291bnRzLkFjY291bnRNb25pdG9yKQotCi1zdGF0aWMgYW5kcm9pZC5hY2NvdW50cy5BY2NvdW50TW9uaXRvckxpc3RlbmVyIGFjY2VzcyQxMDAoCi1hbmRyb2lkLmFjY291bnRzLkFjY291bnRNb25pdG9yKQotCi1wcml2YXRlIHZvaWQgbm90aWZ5TGlzdGVuZXIoKQotCi1wdWJsaWMgdm9pZCBjbG9zZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9UaHJvd2FibGU7ICkKLXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkKLQotcHVibGljIHZvaWQgb25SZWNlaXZlKAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQuY29udGVudC5JbnRlbnQpCi0KLXB1YmxpYyB2b2lkIG9uU2VydmljZUNvbm5lY3RlZCgKLWFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXB1YmxpYyB2b2lkIG9uU2VydmljZURpc2Nvbm5lY3RlZCgKLWFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLmFjY291bnRzLkFjY291bnRNb25pdG9yTGlzdGVuZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgb25BY2NvdW50c1VwZGF0ZWQoCi1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5hY2NvdW50cy5BY2NvdW50c1NlcnZpY2VDb25zdGFudHMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBQ0NPVU5UU19TRVJWSUNFX0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTE9HSU5fQUNDT1VOVFNfQ0hBTkdFRF9BQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIExPR0lOX0FDQ09VTlRTX01JU1NJTkdfQUNUSU9OCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQub3MuSUludGVyZmFjZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL2FjY291bnRzL0lBY2NvdW50c1NlcnZpY2UkU3R1YjsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLmFjY291bnRzLklBY2NvdW50c1NlcnZpY2UgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5JSW50ZXJmYWNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0QWNjb3VudHMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2FjY291bnRzL0lBY2NvdW50c1NlcnZpY2UkU3R1YjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1Qcm94eSApCi0gY2xhc3MgYW5kcm9pZC5hY2NvdW50cy5JQWNjb3VudHNTZXJ2aWNlJFN0dWIkUHJveHkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5hY2NvdW50cy5JQWNjb3VudHNTZXJ2aWNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5JQmluZGVyIG1SZW1vdGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBnZXRBY2NvdW50cygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEludGVyZmFjZURlc2NyaXB0b3IoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvb3MvSUJpbmRlciREZWF0aFJlY2lwaWVudDsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLm9zLklCaW5kZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERVTVBfVFJBTlNBQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklSU1RfQ0FMTF9UUkFOU0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX09ORVdBWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUkZBQ0VfVFJBTlNBQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEFTVF9DQUxMX1RSQU5TQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBJTkdfVFJBTlNBQ1RJT04KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzQmluZGVyQWxpdmUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgbGlua1RvRGVhdGgoCi1hbmRyb2lkLm9zLklCaW5kZXIkRGVhdGhSZWNpcGllbnQKLWludCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gcGluZ0JpbmRlcigpCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLm9zLklJbnRlcmZhY2UgcXVlcnlMb2NhbEludGVyZmFjZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiB0cmFuc2FjdCgKLWludAotYW5kcm9pZC5vcy5QYXJjZWwKLWFuZHJvaWQub3MuUGFyY2VsCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHVubGlua1RvRGVhdGgoCi1hbmRyb2lkLm9zLklCaW5kZXIkRGVhdGhSZWNpcGllbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLm9zLkJpbmRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLklCaW5kZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBGSU5EX1BPVEVOVElBTF9MRUFLUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRBRwotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbURlc2NyaXB0b3IKLQotcHJpdmF0ZSBpbnQgbU9iamVjdAotCi1wcml2YXRlIGFuZHJvaWQub3MuSUludGVyZmFjZSBtT3duZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBsb25nIGNsZWFyQ2FsbGluZ0lkZW50aXR5KCkKLQotcHJpdmF0ZSBmaW5hbCBuYXRpdmUgdm9pZCBkZXN0cm95KCkKLQotcHJpdmF0ZSBib29sZWFuIGV4ZWNUcmFuc2FjdCgKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBmbHVzaFBlbmRpbmdDb21tYW5kcygpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBnZXRDYWxsaW5nUGlkKCkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGdldENhbGxpbmdVaWQoKQotCi1wcml2YXRlIGZpbmFsIG5hdGl2ZSB2b2lkIGluaXQoKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGpvaW5UaHJlYWRQb29sKCkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCByZXN0b3JlQ2FsbGluZ0lkZW50aXR5KAotbG9uZykKLQotcHVibGljIHZvaWQgYXR0YWNoSW50ZXJmYWNlKAotYW5kcm9pZC5vcy5JSW50ZXJmYWNlCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcm90ZWN0ZWQgdm9pZCBkdW1wKAotamF2YS5pby5GaWxlRGVzY3JpcHRvcgotamF2YS5pby5QcmludFdyaXRlcgotamF2YS5sYW5nLlN0cmluZ1tdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvVGhyb3dhYmxlOyApCi1wcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEludGVyZmFjZURlc2NyaXB0b3IoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0JpbmRlckFsaXZlKCkKLQotcHVibGljIHZvaWQgbGlua1RvRGVhdGgoCi1hbmRyb2lkLm9zLklCaW5kZXIkRGVhdGhSZWNpcGllbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXByb3RlY3RlZCBib29sZWFuIG9uVHJhbnNhY3QoCi1pbnQKLWFuZHJvaWQub3MuUGFyY2VsCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBwaW5nQmluZGVyKCkKLQotcHVibGljIGFuZHJvaWQub3MuSUludGVyZmFjZSBxdWVyeUxvY2FsSW50ZXJmYWNlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBib29sZWFuIHRyYW5zYWN0KAotaW50Ci1hbmRyb2lkLm9zLlBhcmNlbAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotcHVibGljIGJvb2xlYW4gdW5saW5rVG9EZWF0aCgKLWFuZHJvaWQub3MuSUJpbmRlciREZWF0aFJlY2lwaWVudAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAzMyBuYW1lID1TdHViICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvYWNjb3VudHMvSUFjY291bnRzU2VydmljZSRTdHViJFByb3h5OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9hY2NvdW50cy9JQWNjb3VudHNTZXJ2aWNlOyApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC5hY2NvdW50cy5JQWNjb3VudHNTZXJ2aWNlJFN0dWIgZXh0ZW5kcyBhbmRyb2lkLm9zLkJpbmRlciBpbXBsZW1lbnRzIGFuZHJvaWQuYWNjb3VudHMuSUFjY291bnRzU2VydmljZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFU0NSSVBUT1IKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9nZXRBY2NvdW50cwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5hY2NvdW50cy5JQWNjb3VudHNTZXJ2aWNlIGFzSW50ZXJmYWNlKAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIG9uVHJhbnNhY3QoCi1pbnQKLWFuZHJvaWQub3MuUGFyY2VsCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL0VudW08TGFuZHJvaWQvYW5ub3RhdGlvbi9TZGtDb25zdGFudCRTZGtDb25zdGFudFR5cGU7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvYW5ub3RhdGlvbi9TZGtDb25zdGFudDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNjQwOSBuYW1lID1TZGtDb25zdGFudFR5cGUgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQuYW5ub3RhdGlvbi5TZGtDb25zdGFudCRTZGtDb25zdGFudFR5cGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmFubm90YXRpb24uU2RrQ29uc3RhbnQkU2RrQ29uc3RhbnRUeXBlW10gJFZBTFVFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuYW5ub3RhdGlvbi5TZGtDb25zdGFudCRTZGtDb25zdGFudFR5cGUgQUNUSVZJVFlfSU5URU5UX0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuYW5ub3RhdGlvbi5TZGtDb25zdGFudCRTZGtDb25zdGFudFR5cGUgQlJPQURDQVNUX0lOVEVOVF9BQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmFubm90YXRpb24uU2RrQ29uc3RhbnQkU2RrQ29uc3RhbnRUeXBlIElOVEVOVF9DQVRFR09SWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuYW5ub3RhdGlvbi5TZGtDb25zdGFudCRTZGtDb25zdGFudFR5cGUgU0VSVklDRV9BQ1RJT04KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClWICkKLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5hbm5vdGF0aW9uLlNka0NvbnN0YW50JFNka0NvbnN0YW50VHlwZSB2YWx1ZU9mKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmFubm90YXRpb24uU2RrQ29uc3RhbnQkU2RrQ29uc3RhbnRUeXBlW10gdmFsdWVzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uICh2YWx1ZSA9TGphdmEvbGFuZy9hbm5vdGF0aW9uL1JldGVudGlvblBvbGljeTshU09VUkNFICkKLUBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQgKHZhbHVlID1MamF2YS9sYW5nL2Fubm90YXRpb24vRWxlbWVudFR5cGU7IUZJRUxEICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvYW5ub3RhdGlvbi9TZGtDb25zdGFudCRTZGtDb25zdGFudFR5cGU7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5hbm5vdGF0aW9uLlNka0NvbnN0YW50IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC5hbm5vdGF0aW9uLlNka0NvbnN0YW50JFNka0NvbnN0YW50VHlwZSB2YWx1ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbiAodmFsdWUgPUxqYXZhL2xhbmcvYW5ub3RhdGlvbi9SZXRlbnRpb25Qb2xpY3k7IVNPVVJDRSApCi1AamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0ICh2YWx1ZSA9TGphdmEvbGFuZy9hbm5vdGF0aW9uL0VsZW1lbnRUeXBlOyFUWVBFICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5hbm5vdGF0aW9uLldpZGdldCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9hcHAvQWN0aXZpdHk7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjYgbmFtZSA9TWFuYWdlZEN1cnNvciApCi1maW5hbCBjbGFzcyBhbmRyb2lkLmFwcC5BY3Rpdml0eSRNYW5hZ2VkQ3Vyc29yIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIG1DdXJzb3IKLQotcHJpdmF0ZSBib29sZWFuIG1SZWxlYXNlZAotCi1wcml2YXRlIGJvb2xlYW4gbVVwZGF0ZWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmRhdGFiYXNlLkN1cnNvcikKLQotc3RhdGljIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIGFjY2VzcyQwMDAoCi1hbmRyb2lkLmFwcC5BY3Rpdml0eSRNYW5hZ2VkQ3Vyc29yKQotCi1zdGF0aWMgYm9vbGVhbiBhY2Nlc3MkMTAwKAotYW5kcm9pZC5hcHAuQWN0aXZpdHkkTWFuYWdlZEN1cnNvcikKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDEwMigKLWFuZHJvaWQuYXBwLkFjdGl2aXR5JE1hbmFnZWRDdXJzb3IKLWJvb2xlYW4pCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQyMDAoCi1hbmRyb2lkLmFwcC5BY3Rpdml0eSRNYW5hZ2VkQ3Vyc29yKQotCi1zdGF0aWMgYm9vbGVhbiBhY2Nlc3MkMjAyKAotYW5kcm9pZC5hcHAuQWN0aXZpdHkkTWFuYWdlZEN1cnNvcgotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDVElWSVRZX1NFUlZJQ0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFMQVJNX1NFUlZJQ0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFVRElPX1NFUlZJQ0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklORF9BVVRPX0NSRUFURQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCSU5EX0RFQlVHX1VOQklORAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQkxVRVRPT1RIX1NFUlZJQ0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENMSVBCT0FSRF9TRVJWSUNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDT05ORUNUSVZJVFlfU0VSVklDRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05URVhUX0lHTk9SRV9TRUNVUklUWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05URVhUX0lOQ0xVREVfQ09ERQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgS0VZR1VBUkRfU0VSVklDRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTEFZT1VUX0lORkxBVEVSX1NFUlZJQ0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIExPQ0FUSU9OX1NFUlZJQ0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9BUFBFTkQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9QUklWQVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfV09STERfUkVBREFCTEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9XT1JMRF9XUklURUFCTEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE5PVElGSUNBVElPTl9TRVJWSUNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQT1dFUl9TRVJWSUNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTRUFSQ0hfU0VSVklDRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0VOU09SX1NFUlZJQ0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNUQVRVU19CQVJfU0VSVklDRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEVMRVBIT05ZX1NFUlZJQ0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFZJQlJBVE9SX1NFUlZJQ0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFdBTExQQVBFUl9TRVJWSUNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBXSUZJX1NFUlZJQ0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFdJTkRPV19TRVJWSUNFCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gYmluZFNlcnZpY2UoCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50Ci1hbmRyb2lkLmNvbnRlbnQuU2VydmljZUNvbm5lY3Rpb24KLWludCkKLQotcHVibGljIGFic3RyYWN0IGludCBjaGVja0NhbGxpbmdPclNlbGZQZXJtaXNzaW9uKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IGludCBjaGVja0NhbGxpbmdPclNlbGZVcmlQZXJtaXNzaW9uKAotYW5kcm9pZC5uZXQuVXJpCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgY2hlY2tDYWxsaW5nUGVybWlzc2lvbigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgY2hlY2tDYWxsaW5nVXJpUGVybWlzc2lvbigKLWFuZHJvaWQubmV0LlVyaQotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGNoZWNrUGVybWlzc2lvbigKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGNoZWNrVXJpUGVybWlzc2lvbigKLWFuZHJvaWQubmV0LlVyaQotaW50Ci1pbnQKLWludCkKLQotcHVibGljIGFic3RyYWN0IGludCBjaGVja1VyaVBlcm1pc3Npb24oCi1hbmRyb2lkLm5ldC5VcmkKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGNsZWFyV2FsbHBhcGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VNYW5hZ2VyJE5hbWVOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQuY29udGVudC5Db250ZXh0IGNyZWF0ZVBhY2thZ2VDb250ZXh0KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZ1tdIGRhdGFiYXNlTGlzdCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGRlbGV0ZURhdGFiYXNlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZGVsZXRlRmlsZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGVuZm9yY2VDYWxsaW5nT3JTZWxmVXJpUGVybWlzc2lvbigKLWFuZHJvaWQubmV0LlVyaQotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBlbmZvcmNlQ2FsbGluZ1Blcm1pc3Npb24oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBlbmZvcmNlQ2FsbGluZ1VyaVBlcm1pc3Npb24oCi1hbmRyb2lkLm5ldC5VcmkKLWludAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZW5mb3JjZVBlcm1pc3Npb24oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZW5mb3JjZVVyaVBlcm1pc3Npb24oCi1hbmRyb2lkLm5ldC5VcmkKLWludAotaW50Ci1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGVuZm9yY2VVcmlQZXJtaXNzaW9uKAotYW5kcm9pZC5uZXQuVXJpCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZ1tdIGZpbGVMaXN0KCkKLQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQuY29udGVudC5Db250ZXh0IGdldEFwcGxpY2F0aW9uQ29udGV4dCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0TWFuYWdlciBnZXRBc3NldHMoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5pby5GaWxlIGdldENhY2hlRGlyKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5DbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlcigpCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyIGdldENvbnRlbnRSZXNvbHZlcigpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmlvLkZpbGUgZ2V0RGF0YWJhc2VQYXRoKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IGphdmEuaW8uRmlsZSBnZXREaXIoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmlvLkZpbGUgZ2V0RmlsZVN0cmVhbVBhdGgoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5pby5GaWxlIGdldEZpbGVzRGlyKCkKLQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQub3MuTG9vcGVyIGdldE1haW5Mb29wZXIoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRQYWNrYWdlQ29kZVBhdGgoKQotCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyIGdldFBhY2thZ2VNYW5hZ2VyKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0UGFja2FnZU5hbWUoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRQYWNrYWdlUmVzb3VyY2VQYXRoKCkKLQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzIGdldFJlc291cmNlcygpCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXMgZ2V0U2hhcmVkUHJlZmVyZW5jZXMoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygKLWludCkKLQotcHVibGljIGZpbmFsIHRyYW5zaWVudCBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygKLWludAotamF2YS5sYW5nLk9iamVjdFtdKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLk9iamVjdCBnZXRTeXN0ZW1TZXJ2aWNlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGZpbmFsIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgZ2V0VGV4dCgKLWludCkKLQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzJFRoZW1lIGdldFRoZW1lKCkKLQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgZ2V0V2FsbHBhcGVyKCkKLQotcHVibGljIGFic3RyYWN0IGludCBnZXRXYWxscGFwZXJEZXNpcmVkTWluaW11bUhlaWdodCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0V2FsbHBhcGVyRGVzaXJlZE1pbmltdW1XaWR0aCgpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdyYW50VXJpUGVybWlzc2lvbigKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQubmV0LlVyaQotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvcmVzL1Jlc291cmNlcyROb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheSBvYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKAotaW50Ci1pbnRbXSkKLQotcHVibGljIGZpbmFsIGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheSBvYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldAotaW50W10pCi0KLXB1YmxpYyBmaW5hbCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXkgb2J0YWluU3R5bGVkQXR0cmlidXRlcygKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQKLWludFtdCi1pbnQKLWludCkKLQotcHVibGljIGZpbmFsIGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheSBvYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKAotaW50W10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vRmlsZU5vdEZvdW5kRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5pby5GaWxlSW5wdXRTdHJlYW0gb3BlbkZpbGVJbnB1dCgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vRmlsZU5vdEZvdW5kRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtIG9wZW5GaWxlT3V0cHV0KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2Ugb3Blbk9yQ3JlYXRlRGF0YWJhc2UoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlJEN1cnNvckZhY3RvcnkpCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIHBlZWtXYWxscGFwZXIoKQotCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC5jb250ZW50LkludGVudCByZWdpc3RlclJlY2VpdmVyKAotYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyKQotCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC5jb250ZW50LkludGVudCByZWdpc3RlclJlY2VpdmVyKAotYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLkhhbmRsZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlbW92ZVN0aWNreUJyb2FkY2FzdCgKLWFuZHJvaWQuY29udGVudC5JbnRlbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJldm9rZVVyaVBlcm1pc3Npb24oCi1hbmRyb2lkLm5ldC5VcmkKLWludCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2VuZEJyb2FkY2FzdCgKLWFuZHJvaWQuY29udGVudC5JbnRlbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNlbmRCcm9hZGNhc3QoCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZW5kT3JkZXJlZEJyb2FkY2FzdCgKLWFuZHJvaWQuY29udGVudC5JbnRlbnQKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNlbmRPcmRlcmVkQnJvYWRjYXN0KAotYW5kcm9pZC5jb250ZW50LkludGVudAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyCi1hbmRyb2lkLm9zLkhhbmRsZXIKLWludAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5vcy5CdW5kbGUpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNlbmRTdGlja3lCcm9hZGNhc3QoCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRUaGVtZSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0V2FsbHBhcGVyKAotYW5kcm9pZC5ncmFwaGljcy5CaXRtYXApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFdhbGxwYXBlcigKLWphdmEuaW8uSW5wdXRTdHJlYW0pCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHN0YXJ0QWN0aXZpdHkoCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50KQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzdGFydEluc3RydW1lbnRhdGlvbigKLWFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLkJ1bmRsZSkKLQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIHN0YXJ0U2VydmljZSgKLWFuZHJvaWQuY29udGVudC5JbnRlbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHN0b3BTZXJ2aWNlKAotYW5kcm9pZC5jb250ZW50LkludGVudCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgdW5iaW5kU2VydmljZSgKLWFuZHJvaWQuY29udGVudC5TZXJ2aWNlQ29ubmVjdGlvbikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgdW5yZWdpc3RlclJlY2VpdmVyKAotYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuY29udGVudC5Db250ZXh0V3JhcHBlciBleHRlbmRzIGFuZHJvaWQuY29udGVudC5Db250ZXh0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBtQmFzZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wcm90ZWN0ZWQgdm9pZCBhdHRhY2hCYXNlQ29udGV4dCgKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wdWJsaWMgYm9vbGVhbiBiaW5kU2VydmljZSgKLWFuZHJvaWQuY29udGVudC5JbnRlbnQKLWFuZHJvaWQuY29udGVudC5TZXJ2aWNlQ29ubmVjdGlvbgotaW50KQotCi1wdWJsaWMgaW50IGNoZWNrQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgaW50IGNoZWNrQ2FsbGluZ09yU2VsZlVyaVBlcm1pc3Npb24oCi1hbmRyb2lkLm5ldC5VcmkKLWludCkKLQotcHVibGljIGludCBjaGVja0NhbGxpbmdQZXJtaXNzaW9uKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGludCBjaGVja0NhbGxpbmdVcmlQZXJtaXNzaW9uKAotYW5kcm9pZC5uZXQuVXJpCi1pbnQpCi0KLXB1YmxpYyBpbnQgY2hlY2tQZXJtaXNzaW9uKAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQpCi0KLXB1YmxpYyBpbnQgY2hlY2tVcmlQZXJtaXNzaW9uKAotYW5kcm9pZC5uZXQuVXJpCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgaW50IGNoZWNrVXJpUGVybWlzc2lvbigKLWFuZHJvaWQubmV0LlVyaQotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY2xlYXJXYWxscGFwZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZU1hbmFnZXIkTmFtZU5vdEZvdW5kRXhjZXB0aW9uOyApCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgY3JlYXRlUGFja2FnZUNvbnRleHQoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gZGF0YWJhc2VMaXN0KCkKLQotcHVibGljIGJvb2xlYW4gZGVsZXRlRGF0YWJhc2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYm9vbGVhbiBkZWxldGVGaWxlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgZW5mb3JjZUNhbGxpbmdPclNlbGZVcmlQZXJtaXNzaW9uKAotYW5kcm9pZC5uZXQuVXJpCi1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIGVuZm9yY2VDYWxsaW5nUGVybWlzc2lvbigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIGVuZm9yY2VDYWxsaW5nVXJpUGVybWlzc2lvbigKLWFuZHJvaWQubmV0LlVyaQotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBlbmZvcmNlUGVybWlzc2lvbigKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBlbmZvcmNlVXJpUGVybWlzc2lvbigKLWFuZHJvaWQubmV0LlVyaQotaW50Ci1pbnQKLWludAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgZW5mb3JjZVVyaVBlcm1pc3Npb24oCi1hbmRyb2lkLm5ldC5VcmkKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50Ci1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gZmlsZUxpc3QoKQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgZ2V0QXBwbGljYXRpb25Db250ZXh0KCkKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRNYW5hZ2VyIGdldEFzc2V0cygpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBnZXRCYXNlQ29udGV4dCgpCi0KLXB1YmxpYyBqYXZhLmlvLkZpbGUgZ2V0Q2FjaGVEaXIoKQotCi1wdWJsaWMgamF2YS5sYW5nLkNsYXNzTG9hZGVyIGdldENsYXNzTG9hZGVyKCkKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIgZ2V0Q29udGVudFJlc29sdmVyKCkKLQotcHVibGljIGphdmEuaW8uRmlsZSBnZXREYXRhYmFzZVBhdGgoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5pby5GaWxlIGdldERpcigKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIGphdmEuaW8uRmlsZSBnZXRGaWxlU3RyZWFtUGF0aCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmlvLkZpbGUgZ2V0RmlsZXNEaXIoKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5Mb29wZXIgZ2V0TWFpbkxvb3BlcigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFBhY2thZ2VDb2RlUGF0aCgpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIgZ2V0UGFja2FnZU1hbmFnZXIoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRQYWNrYWdlTmFtZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFBhY2thZ2VSZXNvdXJjZVBhdGgoKQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMgZ2V0UmVzb3VyY2VzKCkKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlcyBnZXRTaGFyZWRQcmVmZXJlbmNlcygKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0U3lzdGVtU2VydmljZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcyRUaGVtZSBnZXRUaGVtZSgpCi0KLXB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIGdldFdhbGxwYXBlcigpCi0KLXB1YmxpYyBpbnQgZ2V0V2FsbHBhcGVyRGVzaXJlZE1pbmltdW1IZWlnaHQoKQotCi1wdWJsaWMgaW50IGdldFdhbGxwYXBlckRlc2lyZWRNaW5pbXVtV2lkdGgoKQotCi1wdWJsaWMgdm9pZCBncmFudFVyaVBlcm1pc3Npb24oCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm5ldC5VcmkKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9GaWxlTm90Rm91bmRFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbSBvcGVuRmlsZUlucHV0KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9GaWxlTm90Rm91bmRFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW0gb3BlbkZpbGVPdXRwdXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSBvcGVuT3JDcmVhdGVEYXRhYmFzZSgKLWphdmEubGFuZy5TdHJpbmcKLWludAotYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UkQ3Vyc29yRmFjdG9yeSkKLQotcHVibGljIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgcGVla1dhbGxwYXBlcigpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50IHJlZ2lzdGVyUmVjZWl2ZXIoCi1hbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXIKLWFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXIpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50IHJlZ2lzdGVyUmVjZWl2ZXIoCi1hbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXIKLWFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXIKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuSGFuZGxlcikKLQotcHVibGljIHZvaWQgcmVtb3ZlU3RpY2t5QnJvYWRjYXN0KAotYW5kcm9pZC5jb250ZW50LkludGVudCkKLQotcHVibGljIHZvaWQgcmV2b2tlVXJpUGVybWlzc2lvbigKLWFuZHJvaWQubmV0LlVyaQotaW50KQotCi1wdWJsaWMgdm9pZCBzZW5kQnJvYWRjYXN0KAotYW5kcm9pZC5jb250ZW50LkludGVudCkKLQotcHVibGljIHZvaWQgc2VuZEJyb2FkY2FzdCgKLWFuZHJvaWQuY29udGVudC5JbnRlbnQKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHNlbmRPcmRlcmVkQnJvYWRjYXN0KAotYW5kcm9pZC5jb250ZW50LkludGVudAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2VuZE9yZGVyZWRCcm9hZGNhc3QoCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXIKLWFuZHJvaWQub3MuSGFuZGxlcgotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLkJ1bmRsZSkKLQotcHVibGljIHZvaWQgc2VuZFN0aWNreUJyb2FkY2FzdCgKLWFuZHJvaWQuY29udGVudC5JbnRlbnQpCi0KLXB1YmxpYyB2b2lkIHNldFRoZW1lKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRXYWxscGFwZXIoCi1hbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0V2FsbHBhcGVyKAotamF2YS5pby5JbnB1dFN0cmVhbSkKLQotcHVibGljIHZvaWQgc3RhcnRBY3Rpdml0eSgKLWFuZHJvaWQuY29udGVudC5JbnRlbnQpCi0KLXB1YmxpYyBib29sZWFuIHN0YXJ0SW5zdHJ1bWVudGF0aW9uKAotYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuQnVuZGxlKQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUgc3RhcnRTZXJ2aWNlKAotYW5kcm9pZC5jb250ZW50LkludGVudCkKLQotcHVibGljIGJvb2xlYW4gc3RvcFNlcnZpY2UoCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50KQotCi1wdWJsaWMgdm9pZCB1bmJpbmRTZXJ2aWNlKAotYW5kcm9pZC5jb250ZW50LlNlcnZpY2VDb25uZWN0aW9uKQotCi1wdWJsaWMgdm9pZCB1bnJlZ2lzdGVyUmVjZWl2ZXIoCi1hbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC52aWV3LkNvbnRleHRUaGVtZVdyYXBwZXIgZXh0ZW5kcyBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dFdyYXBwZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBtQmFzZQotCi1wcml2YXRlIGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlciBtSW5mbGF0ZXIKLQotcHJpdmF0ZSBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcyRUaGVtZSBtVGhlbWUKLQotcHJpdmF0ZSBpbnQgbVRoZW1lUmVzb3VyY2UKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotaW50KQotCi1wcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVRoZW1lKCkKLQotcHJvdGVjdGVkIHZvaWQgYXR0YWNoQmFzZUNvbnRleHQoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0U3lzdGVtU2VydmljZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcyRUaGVtZSBnZXRUaGVtZSgpCi0KLXByb3RlY3RlZCB2b2lkIG9uQXBwbHlUaGVtZVJlc291cmNlKAotYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMkVGhlbWUKLWludAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0VGhlbWUoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9MYXlvdXRJbmZsYXRlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPUZhY3RvcnkgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXIkRmFjdG9yeSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC52aWV3LlZpZXcgb25DcmVhdGVWaWV3KAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9XaW5kb3c7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1DYWxsYmFjayApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQudmlldy5XaW5kb3ckQ2FsbGJhY2sgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZGlzcGF0Y2hLZXlFdmVudCgKLWFuZHJvaWQudmlldy5LZXlFdmVudCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZGlzcGF0Y2hUb3VjaEV2ZW50KAotYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50KQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBkaXNwYXRjaFRyYWNrYmFsbEV2ZW50KAotYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvbkNvbnRlbnRDaGFuZ2VkKCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gb25DcmVhdGVQYW5lbE1lbnUoCi1pbnQKLWFuZHJvaWQudmlldy5NZW51KQotCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC52aWV3LlZpZXcgb25DcmVhdGVQYW5lbFZpZXcoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIG9uTWVudUl0ZW1TZWxlY3RlZCgKLWludAotYW5kcm9pZC52aWV3Lk1lbnVJdGVtKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBvbk1lbnVPcGVuZWQoCi1pbnQKLWFuZHJvaWQudmlldy5NZW51KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvblBhbmVsQ2xvc2VkKAotaW50Ci1hbmRyb2lkLnZpZXcuTWVudSkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gb25QcmVwYXJlUGFuZWwoCi1pbnQKLWFuZHJvaWQudmlldy5WaWV3Ci1hbmRyb2lkLnZpZXcuTWVudSkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gb25TZWFyY2hSZXF1ZXN0ZWQoKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvbldpbmRvd0F0dHJpYnV0ZXNDaGFuZ2VkKAotYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIkTGF5b3V0UGFyYW1zKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvbldpbmRvd0ZvY3VzQ2hhbmdlZCgKLWJvb2xlYW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9LZXlFdmVudDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPUNhbGxiYWNrICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC52aWV3LktleUV2ZW50JENhbGxiYWNrIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIG9uS2V5RG93bigKLWludAotYW5kcm9pZC52aWV3LktleUV2ZW50KQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBvbktleU11bHRpcGxlKAotaW50Ci1pbnQKLWFuZHJvaWQudmlldy5LZXlFdmVudCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gb25LZXlVcCgKLWludAotYW5kcm9pZC52aWV3LktleUV2ZW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3ZpZXcvVmlldzsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPU9uQ3JlYXRlQ29udGV4dE1lbnVMaXN0ZW5lciApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQudmlldy5WaWV3JE9uQ3JlYXRlQ29udGV4dE1lbnVMaXN0ZW5lciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvbkNyZWF0ZUNvbnRleHRNZW51KAotYW5kcm9pZC52aWV3LkNvbnRleHRNZW51Ci1hbmRyb2lkLnZpZXcuVmlldwotYW5kcm9pZC52aWV3LkNvbnRleHRNZW51JENvbnRleHRNZW51SW5mbykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudENhbGxiYWNrcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKAotYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvbkxvd01lbW9yeSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9hcHAvQWN0aXZpdHkkTWFuYWdlZEN1cnNvcjsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQuYXBwLkFjdGl2aXR5IGV4dGVuZHMgYW5kcm9pZC52aWV3LkNvbnRleHRUaGVtZVdyYXBwZXIgaW1wbGVtZW50cyBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXIkRmFjdG9yeSwgYW5kcm9pZC52aWV3LldpbmRvdyRDYWxsYmFjaywgYW5kcm9pZC52aWV3LktleUV2ZW50JENhbGxiYWNrLCBhbmRyb2lkLnZpZXcuVmlldyRPbkNyZWF0ZUNvbnRleHRNZW51TGlzdGVuZXIsIGFuZHJvaWQuY29udGVudC5Db21wb25lbnRDYWxsYmFja3MKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9LRVlTX0RJQUxFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0tFWVNfRElTQUJMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0tFWVNfU0VBUkNIX0dMT0JBTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0tFWVNfU0VBUkNIX0xPQ0FMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfS0VZU19TSE9SVENVVAotCi1wcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIEZPQ1VTRURfU1RBVEVfU0VUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1VMVF9DQU5DRUxFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNVTFRfRklSU1RfVVNFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNVTFRfT0sKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTQVZFRF9ESUFMT0dTX1RBRwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNBVkVEX0RJQUxPR19JRFNfS0VZCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0FWRURfRElBTE9HX0tFWV9QUkVGSVgKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTQVZFRF9TRUFSQ0hfRElBTE9HX0tFWQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRBRwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFdJTkRPV19ISUVSQVJDSFlfVEFHCi0KLXByaXZhdGUgc3RhdGljIGxvbmcgc0luc3RhbmNlQ291bnQKLQotIGFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm8gbUFjdGl2aXR5SW5mbwotCi1wcml2YXRlIGFuZHJvaWQuYXBwLkFwcGxpY2F0aW9uIG1BcHBsaWNhdGlvbgotCi0gYm9vbGVhbiBtQ2FsbGVkCi0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUgbUNvbXBvbmVudAotCi0gaW50IG1Db25maWdDaGFuZ2VGbGFncwotCi0gYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uIG1DdXJyZW50Q29uZmlnCi0KLSBhbmRyb2lkLnZpZXcuVmlldyBtRGVjb3IKLQotcHJpdmF0ZSBpbnQgbURlZmF1bHRLZXlNb2RlCi0KLXByaXZhdGUgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgbURlZmF1bHRLZXlTc2IKLQotIGphdmEubGFuZy5TdHJpbmcgbUVtYmVkZGVkSUQKLQotIGJvb2xlYW4gbUZpbmlzaGVkCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5vcy5IYW5kbGVyIG1IYW5kbGVyCi0KLXByaXZhdGUgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uIG1JbnN0cnVtZW50YXRpb24KLQotcHJpdmF0ZSBhbmRyb2lkLmNvbnRlbnQuSW50ZW50IG1JbnRlbnQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuT2JqZWN0IG1MYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlCi0KLSBhbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZCBtTWFpblRocmVhZAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQXJyYXlMaXN0PExhbmRyb2lkL2FwcC9BY3Rpdml0eSRNYW5hZ2VkQ3Vyc29yOz47ICkKLXByaXZhdGUgZmluYWwgamF2YS51dGlsLkFycmF5TGlzdCBtTWFuYWdlZEN1cnNvcnMKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MYW5kcm9pZC91dGlsL1NwYXJzZUFycmF5PExhbmRyb2lkL2FwcC9EaWFsb2c7PjsgKQotcHJpdmF0ZSBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXkgbU1hbmFnZWREaWFsb2dzCi0KLSBhbmRyb2lkLmFwcC5BY3Rpdml0eSBtUGFyZW50Ci0KLSBpbnQgbVJlc3VsdENvZGUKLQotIGFuZHJvaWQuY29udGVudC5JbnRlbnQgbVJlc3VsdERhdGEKLQotcHJpdmF0ZSBib29sZWFuIG1SZXN1bWVkCi0KLSBib29sZWFuIG1TdGFydGVkQWN0aXZpdHkKLQotcHJpdmF0ZSBib29sZWFuIG1TdG9wcGVkCi0KLXByaXZhdGUgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBtVGl0bGUKLQotcHJpdmF0ZSBpbnQgbVRpdGxlQ29sb3IKLQotcHJpdmF0ZSBib29sZWFuIG1UaXRsZVJlYWR5Ci0KLXByaXZhdGUgYW5kcm9pZC5vcy5JQmluZGVyIG1Ub2tlbgotCi1wcml2YXRlIGphdmEubGFuZy5UaHJlYWQgbVVpVGhyZWFkCi0KLXByaXZhdGUgYW5kcm9pZC52aWV3LldpbmRvdyBtV2luZG93Ci0KLXByaXZhdGUgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIgbVdpbmRvd01hbmFnZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgbG9uZyBnZXRJbnN0YW5jZUNvdW50KCkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG1pc3NpbmdEaWFsb2coCi1pbnQpCi0KLXByaXZhdGUgdm9pZCByZXN0b3JlTWFuYWdlZERpYWxvZ3MoCi1hbmRyb2lkLm9zLkJ1bmRsZSkKLQotcHJpdmF0ZSB2b2lkIHNhdmVNYW5hZ2VkRGlhbG9ncygKLWFuZHJvaWQub3MuQnVuZGxlKQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgc2F2ZWREaWFsb2dLZXlGb3IoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGFkZENvbnRlbnRWaWV3KAotYW5kcm9pZC52aWV3LlZpZXcKLWFuZHJvaWQudmlldy5WaWV3R3JvdXAkTGF5b3V0UGFyYW1zKQotCi1maW5hbCB2b2lkIGF0dGFjaCgKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZAotYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uCi1hbmRyb2lkLm9zLklCaW5kZXIKLWFuZHJvaWQuYXBwLkFwcGxpY2F0aW9uCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50Ci1hbmRyb2lkLmNvbnRlbnQucG0uQWN0aXZpdHlJbmZvCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1hbmRyb2lkLmFwcC5BY3Rpdml0eQotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLk9iamVjdAotYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uKQotCi1wdWJsaWMgdm9pZCBjbG9zZU9wdGlvbnNNZW51KCkKLQotcHVibGljIGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQgY3JlYXRlUGVuZGluZ1Jlc3VsdCgKLWludAotYW5kcm9pZC5jb250ZW50LkludGVudAotaW50KQotCi1wdWJsaWMgZmluYWwgdm9pZCBkaXNtaXNzRGlhbG9nKAotaW50KQotCi0gdm9pZCBkaXNwYXRjaEFjdGl2aXR5UmVzdWx0KAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQKLWFuZHJvaWQuY29udGVudC5JbnRlbnQpCi0KLXB1YmxpYyBib29sZWFuIGRpc3BhdGNoS2V5RXZlbnQoCi1hbmRyb2lkLnZpZXcuS2V5RXZlbnQpCi0KLXB1YmxpYyBib29sZWFuIGRpc3BhdGNoVG91Y2hFdmVudCgKLWFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCkKLQotcHVibGljIGJvb2xlYW4gZGlzcGF0Y2hUcmFja2JhbGxFdmVudCgKLWFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL1Rocm93YWJsZTsgKQotcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKQotCi1wdWJsaWMgYW5kcm9pZC52aWV3LlZpZXcgZmluZFZpZXdCeUlkKAotaW50KQotCi1wdWJsaWMgdm9pZCBmaW5pc2goKQotCi1wdWJsaWMgdm9pZCBmaW5pc2hBY3Rpdml0eSgKLWludCkKLQotcHVibGljIHZvaWQgZmluaXNoQWN0aXZpdHlGcm9tQ2hpbGQoCi1hbmRyb2lkLmFwcC5BY3Rpdml0eQotaW50KQotCi1wdWJsaWMgdm9pZCBmaW5pc2hGcm9tQ2hpbGQoCi1hbmRyb2lkLmFwcC5BY3Rpdml0eSkKLQotZmluYWwgYW5kcm9pZC5vcy5JQmluZGVyIGdldEFjdGl2aXR5VG9rZW4oKQotCi1wdWJsaWMgZmluYWwgYW5kcm9pZC5hcHAuQXBwbGljYXRpb24gZ2V0QXBwbGljYXRpb24oKQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUgZ2V0Q2FsbGluZ0FjdGl2aXR5KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Q2FsbGluZ1BhY2thZ2UoKQotCi1wdWJsaWMgaW50IGdldENoYW5naW5nQ29uZmlndXJhdGlvbnMoKQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUgZ2V0Q29tcG9uZW50TmFtZSgpCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuVmlldyBnZXRDdXJyZW50Rm9jdXMoKQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LkludGVudCBnZXRJbnRlbnQoKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRMYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlKCkKLQotcHVibGljIGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlciBnZXRMYXlvdXRJbmZsYXRlcigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldExvY2FsQ2xhc3NOYW1lKCkKLQotcHVibGljIGFuZHJvaWQudmlldy5NZW51SW5mbGF0ZXIgZ2V0TWVudUluZmxhdGVyKCkKLQotcHVibGljIGZpbmFsIGFuZHJvaWQuYXBwLkFjdGl2aXR5IGdldFBhcmVudCgpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0UmVxdWVzdGVkT3JpZW50YXRpb24oKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRTeXN0ZW1TZXJ2aWNlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGludCBnZXRUYXNrSWQoKQotCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBnZXRUaXRsZSgpCi0KLXB1YmxpYyBmaW5hbCBpbnQgZ2V0VGl0bGVDb2xvcigpCi0KLXB1YmxpYyBmaW5hbCBpbnQgZ2V0Vm9sdW1lQ29udHJvbFN0cmVhbSgpCi0KLXB1YmxpYyBpbnQgZ2V0V2FsbHBhcGVyRGVzaXJlZE1pbmltdW1IZWlnaHQoKQotCi1wdWJsaWMgaW50IGdldFdhbGxwYXBlckRlc2lyZWRNaW5pbXVtV2lkdGgoKQotCi1wdWJsaWMgYW5kcm9pZC52aWV3LldpbmRvdyBnZXRXaW5kb3coKQotCi1wdWJsaWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIgZ2V0V2luZG93TWFuYWdlcigpCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGlzQ2hpbGQoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0ZpbmlzaGluZygpCi0KLWZpbmFsIGJvb2xlYW4gaXNSZXN1bWVkKCkKLQotcHVibGljIGJvb2xlYW4gaXNUYXNrUm9vdCgpCi1AamF2YS5sYW5nLkRlcHJlY2F0ZWQKLXB1YmxpYyB2b2lkIG1hbmFnZWRDb21taXRVcGRhdGVzKAotYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IpCi0KLXB1YmxpYyBmaW5hbCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciBtYW5hZ2VkUXVlcnkoCi1hbmRyb2lkLm5ldC5VcmkKLWphdmEubGFuZy5TdHJpbmdbXQotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGZpbmFsIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIG1hbmFnZWRRdWVyeSgKLWFuZHJvaWQubmV0LlVyaQotamF2YS5sYW5nLlN0cmluZ1tdCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nW10KLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBib29sZWFuIG1vdmVUYXNrVG9CYWNrKAotYm9vbGVhbikKLQotcHJvdGVjdGVkIHZvaWQgb25BY3Rpdml0eVJlc3VsdCgKLWludAotaW50Ci1hbmRyb2lkLmNvbnRlbnQuSW50ZW50KQotCi1wcm90ZWN0ZWQgdm9pZCBvbkFwcGx5VGhlbWVSZXNvdXJjZSgKLWFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzJFRoZW1lCi1pbnQKLWJvb2xlYW4pCi0KLXByb3RlY3RlZCB2b2lkIG9uQ2hpbGRUaXRsZUNoYW5nZWQoCi1hbmRyb2lkLmFwcC5BY3Rpdml0eQotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotcHVibGljIHZvaWQgb25Db25maWd1cmF0aW9uQ2hhbmdlZCgKLWFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbikKLQotcHVibGljIHZvaWQgb25Db250ZW50Q2hhbmdlZCgpCi0KLXB1YmxpYyBib29sZWFuIG9uQ29udGV4dEl0ZW1TZWxlY3RlZCgKLWFuZHJvaWQudmlldy5NZW51SXRlbSkKLQotcHVibGljIHZvaWQgb25Db250ZXh0TWVudUNsb3NlZCgKLWFuZHJvaWQudmlldy5NZW51KQotCi1wcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZSgKLWFuZHJvaWQub3MuQnVuZGxlKQotCi1wdWJsaWMgdm9pZCBvbkNyZWF0ZUNvbnRleHRNZW51KAotYW5kcm9pZC52aWV3LkNvbnRleHRNZW51Ci1hbmRyb2lkLnZpZXcuVmlldwotYW5kcm9pZC52aWV3LkNvbnRleHRNZW51JENvbnRleHRNZW51SW5mbykKLQotcHVibGljIGphdmEubGFuZy5DaGFyU2VxdWVuY2Ugb25DcmVhdGVEZXNjcmlwdGlvbigpCi0KLXByb3RlY3RlZCBhbmRyb2lkLmFwcC5EaWFsb2cgb25DcmVhdGVEaWFsb2coCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIG9uQ3JlYXRlT3B0aW9uc01lbnUoCi1hbmRyb2lkLnZpZXcuTWVudSkKLQotcHVibGljIGJvb2xlYW4gb25DcmVhdGVQYW5lbE1lbnUoCi1pbnQKLWFuZHJvaWQudmlldy5NZW51KQotCi1wdWJsaWMgYW5kcm9pZC52aWV3LlZpZXcgb25DcmVhdGVQYW5lbFZpZXcoCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIG9uQ3JlYXRlVGh1bWJuYWlsKAotYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAKLWFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzKQotCi1wdWJsaWMgYW5kcm9pZC52aWV3LlZpZXcgb25DcmVhdGVWaWV3KAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi0KLXByb3RlY3RlZCB2b2lkIG9uRGVzdHJveSgpCi0KLXB1YmxpYyBib29sZWFuIG9uS2V5RG93bigKLWludAotYW5kcm9pZC52aWV3LktleUV2ZW50KQotCi1wdWJsaWMgYm9vbGVhbiBvbktleU11bHRpcGxlKAotaW50Ci1pbnQKLWFuZHJvaWQudmlldy5LZXlFdmVudCkKLQotcHVibGljIGJvb2xlYW4gb25LZXlVcCgKLWludAotYW5kcm9pZC52aWV3LktleUV2ZW50KQotCi1wdWJsaWMgdm9pZCBvbkxvd01lbW9yeSgpCi0KLXB1YmxpYyBib29sZWFuIG9uTWVudUl0ZW1TZWxlY3RlZCgKLWludAotYW5kcm9pZC52aWV3Lk1lbnVJdGVtKQotCi1wdWJsaWMgYm9vbGVhbiBvbk1lbnVPcGVuZWQoCi1pbnQKLWFuZHJvaWQudmlldy5NZW51KQotCi1wcm90ZWN0ZWQgdm9pZCBvbk5ld0ludGVudCgKLWFuZHJvaWQuY29udGVudC5JbnRlbnQpCi0KLXB1YmxpYyBib29sZWFuIG9uT3B0aW9uc0l0ZW1TZWxlY3RlZCgKLWFuZHJvaWQudmlldy5NZW51SXRlbSkKLQotcHVibGljIHZvaWQgb25PcHRpb25zTWVudUNsb3NlZCgKLWFuZHJvaWQudmlldy5NZW51KQotCi1wdWJsaWMgdm9pZCBvblBhbmVsQ2xvc2VkKAotaW50Ci1hbmRyb2lkLnZpZXcuTWVudSkKLQotcHJvdGVjdGVkIHZvaWQgb25QYXVzZSgpCi0KLXByb3RlY3RlZCB2b2lkIG9uUG9zdENyZWF0ZSgKLWFuZHJvaWQub3MuQnVuZGxlKQotCi1wcm90ZWN0ZWQgdm9pZCBvblBvc3RSZXN1bWUoKQotCi1wcm90ZWN0ZWQgdm9pZCBvblByZXBhcmVEaWFsb2coCi1pbnQKLWFuZHJvaWQuYXBwLkRpYWxvZykKLQotcHVibGljIGJvb2xlYW4gb25QcmVwYXJlT3B0aW9uc01lbnUoCi1hbmRyb2lkLnZpZXcuTWVudSkKLQotcHVibGljIGJvb2xlYW4gb25QcmVwYXJlUGFuZWwoCi1pbnQKLWFuZHJvaWQudmlldy5WaWV3Ci1hbmRyb2lkLnZpZXcuTWVudSkKLQotcHJvdGVjdGVkIHZvaWQgb25SZXN0YXJ0KCkKLQotcHJvdGVjdGVkIHZvaWQgb25SZXN0b3JlSW5zdGFuY2VTdGF0ZSgKLWFuZHJvaWQub3MuQnVuZGxlKQotCi1wcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IG9uUmV0YWluTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlKCkKLQotcHJvdGVjdGVkIHZvaWQgb25TYXZlSW5zdGFuY2VTdGF0ZSgKLWFuZHJvaWQub3MuQnVuZGxlKQotCi1wdWJsaWMgYm9vbGVhbiBvblNlYXJjaFJlcXVlc3RlZCgpCi0KLXByb3RlY3RlZCB2b2lkIG9uU3RhcnQoKQotCi1wcm90ZWN0ZWQgdm9pZCBvblN0b3AoKQotCi1wcm90ZWN0ZWQgdm9pZCBvblRpdGxlQ2hhbmdlZCgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWludCkKLQotcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KAotYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50KQotCi1wdWJsaWMgYm9vbGVhbiBvblRyYWNrYmFsbEV2ZW50KAotYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50KQotCi1wdWJsaWMgdm9pZCBvbldpbmRvd0F0dHJpYnV0ZXNDaGFuZ2VkKAotYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIkTGF5b3V0UGFyYW1zKQotCi1wdWJsaWMgdm9pZCBvbldpbmRvd0ZvY3VzQ2hhbmdlZCgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIG9wZW5Db250ZXh0TWVudSgKLWFuZHJvaWQudmlldy5WaWV3KQotCi1wdWJsaWMgdm9pZCBvcGVuT3B0aW9uc01lbnUoKQotCi1maW5hbCB2b2lkIHBlcmZvcm1SZXN0YXJ0KCkKLQotZmluYWwgdm9pZCBwZXJmb3JtUmVzdG9yZUluc3RhbmNlU3RhdGUoCi1hbmRyb2lkLm9zLkJ1bmRsZSkKLQotZmluYWwgdm9pZCBwZXJmb3JtUmVzdW1lKCkKLQotZmluYWwgdm9pZCBwZXJmb3JtU2F2ZUluc3RhbmNlU3RhdGUoCi1hbmRyb2lkLm9zLkJ1bmRsZSkKLQotZmluYWwgdm9pZCBwZXJmb3JtU3RhcnQoKQotCi1maW5hbCB2b2lkIHBlcmZvcm1TdG9wKCkKLQotcHVibGljIHZvaWQgcmVnaXN0ZXJGb3JDb250ZXh0TWVudSgKLWFuZHJvaWQudmlldy5WaWV3KQotCi1wdWJsaWMgZmluYWwgdm9pZCByZW1vdmVEaWFsb2coCi1pbnQpCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIHJlcXVlc3RXaW5kb3dGZWF0dXJlKAotaW50KQotCi1wdWJsaWMgZmluYWwgdm9pZCBydW5PblVpVGhyZWFkKAotamF2YS5sYW5nLlJ1bm5hYmxlKQotCi1wdWJsaWMgdm9pZCBzZXRDb250ZW50VmlldygKLWludCkKLQotcHVibGljIHZvaWQgc2V0Q29udGVudFZpZXcoCi1hbmRyb2lkLnZpZXcuVmlldykKLQotcHVibGljIHZvaWQgc2V0Q29udGVudFZpZXcoCi1hbmRyb2lkLnZpZXcuVmlldwotYW5kcm9pZC52aWV3LlZpZXdHcm91cCRMYXlvdXRQYXJhbXMpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHNldERlZmF1bHRLZXlNb2RlKAotaW50KQotCi1wdWJsaWMgZmluYWwgdm9pZCBzZXRGZWF0dXJlRHJhd2FibGUoCi1pbnQKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHNldEZlYXR1cmVEcmF3YWJsZUFscGhhKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHNldEZlYXR1cmVEcmF3YWJsZVJlc291cmNlKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHNldEZlYXR1cmVEcmF3YWJsZVVyaSgKLWludAotYW5kcm9pZC5uZXQuVXJpKQotCi1wdWJsaWMgdm9pZCBzZXRJbnRlbnQoCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50KQotCi1maW5hbCB2b2lkIHNldFBhcmVudCgKLWFuZHJvaWQuYXBwLkFjdGl2aXR5KQotCi1wdWJsaWMgdm9pZCBzZXRQZXJzaXN0ZW50KAotYm9vbGVhbikKLQotcHVibGljIGZpbmFsIHZvaWQgc2V0UHJvZ3Jlc3MoCi1pbnQpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHNldFByb2dyZXNzQmFySW5kZXRlcm1pbmF0ZSgKLWJvb2xlYW4pCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHNldFByb2dyZXNzQmFySW5kZXRlcm1pbmF0ZVZpc2liaWxpdHkoCi1ib29sZWFuKQotCi1wdWJsaWMgZmluYWwgdm9pZCBzZXRQcm9ncmVzc0JhclZpc2liaWxpdHkoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRSZXF1ZXN0ZWRPcmllbnRhdGlvbigKLWludCkKLQotcHVibGljIGZpbmFsIHZvaWQgc2V0UmVzdWx0KAotaW50KQotCi1wdWJsaWMgZmluYWwgdm9pZCBzZXRSZXN1bHQoCi1pbnQKLWFuZHJvaWQuY29udGVudC5JbnRlbnQpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHNldFNlY29uZGFyeVByb2dyZXNzKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRUaXRsZSgKLWludCkKLQotcHVibGljIHZvaWQgc2V0VGl0bGUoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotCi1wdWJsaWMgdm9pZCBzZXRUaXRsZUNvbG9yKAotaW50KQotCi1wdWJsaWMgZmluYWwgdm9pZCBzZXRWb2x1bWVDb250cm9sU3RyZWFtKAotaW50KQotCi1wdWJsaWMgZmluYWwgdm9pZCBzaG93RGlhbG9nKAotaW50KQotCi1wdWJsaWMgdm9pZCBzdGFydEFjdGl2aXR5KAotYW5kcm9pZC5jb250ZW50LkludGVudCkKLQotcHVibGljIHZvaWQgc3RhcnRBY3Rpdml0eUZvclJlc3VsdCgKLWFuZHJvaWQuY29udGVudC5JbnRlbnQKLWludCkKLQotcHVibGljIHZvaWQgc3RhcnRBY3Rpdml0eUZyb21DaGlsZCgKLWFuZHJvaWQuYXBwLkFjdGl2aXR5Ci1hbmRyb2lkLmNvbnRlbnQuSW50ZW50Ci1pbnQpCi0KLXB1YmxpYyBib29sZWFuIHN0YXJ0QWN0aXZpdHlJZk5lZWRlZCgKLWFuZHJvaWQuY29udGVudC5JbnRlbnQKLWludCkKLQotcHVibGljIHZvaWQgc3RhcnRNYW5hZ2luZ0N1cnNvcigKLWFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yKQotCi1wdWJsaWMgYm9vbGVhbiBzdGFydE5leHRNYXRjaGluZ0FjdGl2aXR5KAotYW5kcm9pZC5jb250ZW50LkludGVudCkKLQotcHVibGljIHZvaWQgc3RhcnRTZWFyY2goCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuCi1hbmRyb2lkLm9zLkJ1bmRsZQotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc3RvcE1hbmFnaW5nQ3Vyc29yKAotYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IpCi0KLXB1YmxpYyB2b2lkIHRha2VLZXlFdmVudHMoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCB1bnJlZ2lzdGVyRm9yQ29udGV4dE1lbnUoCi1hbmRyb2lkLnZpZXcuVmlldykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmFwcC5BY3Rpdml0eUdyb3VwIGV4dGVuZHMgYW5kcm9pZC5hcHAuQWN0aXZpdHkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTVEFURVNfS0VZCi0KLXByb3RlY3RlZCBhbmRyb2lkLmFwcC5Mb2NhbEFjdGl2aXR5TWFuYWdlciBtTG9jYWxBY3Rpdml0eU1hbmFnZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ib29sZWFuKQotCi0gdm9pZCBkaXNwYXRjaEFjdGl2aXR5UmVzdWx0KAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQKLWFuZHJvaWQuY29udGVudC5JbnRlbnQpCi0KLXB1YmxpYyBhbmRyb2lkLmFwcC5BY3Rpdml0eSBnZXRDdXJyZW50QWN0aXZpdHkoKQotCi1wdWJsaWMgZmluYWwgYW5kcm9pZC5hcHAuTG9jYWxBY3Rpdml0eU1hbmFnZXIgZ2V0TG9jYWxBY3Rpdml0eU1hbmFnZXIoKQotCi1wcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZSgKLWFuZHJvaWQub3MuQnVuZGxlKQotCi1wcm90ZWN0ZWQgdm9pZCBvbkRlc3Ryb3koKQotCi1wcm90ZWN0ZWQgdm9pZCBvblBhdXNlKCkKLQotcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKQotCi1wcm90ZWN0ZWQgdm9pZCBvblNhdmVJbnN0YW5jZVN0YXRlKAotYW5kcm9pZC5vcy5CdW5kbGUpCi0KLXByb3RlY3RlZCB2b2lkIG9uU3RvcCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID00MTA0IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0FjdGl2aXR5TWFuYWdlcjsgKQotIGNsYXNzIGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlciQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPUNyZWF0b3IgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS9sYW5nL09iamVjdDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUGFyY2VsYWJsZTsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMYW5kcm9pZC9vcy9QYXJjZWw7KVRUOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLk9iamVjdCBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KEkpW1RUOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLk9iamVjdFtdIG5ld0FycmF5KAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9BY3Rpdml0eU1hbmFnZXIkTWVtb3J5SW5mbzsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC9hcHAvQWN0aXZpdHlNYW5hZ2VyJE1lbW9yeUluZm87PjsgKQotZmluYWwgY2xhc3MgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyJE1lbW9yeUluZm8kMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXIkTWVtb3J5SW5mbyBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlciRNZW1vcnlJbmZvW10gbmV3QXJyYXkoCi1pbnQpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0W10gbmV3QXJyYXkoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5vcy5QYXJjZWxhYmxlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05URU5UU19GSUxFX0RFU0NSSVBUT1IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFSQ0VMQUJMRV9XUklURV9SRVRVUk5fVkFMVUUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGRlc2NyaWJlQ29udGVudHMoKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZVRvUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9hcHAvQWN0aXZpdHlNYW5hZ2VyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9TWVtb3J5SW5mbyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyJE1lbW9yeUluZm8gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExhbmRyb2lkL2FwcC9BY3Rpdml0eU1hbmFnZXIkTWVtb3J5SW5mbzs+OyApCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yIENSRUFUT1IKLQotcHVibGljIGxvbmcgYXZhaWxNZW0KLQotcHVibGljIGJvb2xlYW4gbG93TWVtb3J5Ci0KLXB1YmxpYyBsb25nIHRocmVzaG9sZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuUGFyY2VsKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLlBhcmNlbAotYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyJDEpCi0KLXB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpCi0KLXB1YmxpYyB2b2lkIHJlYWRGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9BY3Rpdml0eU1hbmFnZXIkUHJvY2Vzc0Vycm9yU3RhdGVJbmZvOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExhbmRyb2lkL2FwcC9BY3Rpdml0eU1hbmFnZXIkUHJvY2Vzc0Vycm9yU3RhdGVJbmZvOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLWZpbmFsIGNsYXNzIGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlciRQcm9jZXNzRXJyb3JTdGF0ZUluZm8kMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXIkUHJvY2Vzc0Vycm9yU3RhdGVJbmZvIGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyJFByb2Nlc3NFcnJvclN0YXRlSW5mb1tdIG5ld0FycmF5KAotaW50KQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdFtdIG5ld0FycmF5KAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1Qcm9jZXNzRXJyb3JTdGF0ZUluZm8gKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0FjdGl2aXR5TWFuYWdlcjsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlciRQcm9jZXNzRXJyb3JTdGF0ZUluZm8gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENSQVNIRUQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I8TGFuZHJvaWQvYXBwL0FjdGl2aXR5TWFuYWdlciRQcm9jZXNzRXJyb3JTdGF0ZUluZm87PjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvciBDUkVBVE9SCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PVF9SRVNQT05ESU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PX0VSUk9SCi0KLXB1YmxpYyBpbnQgY29uZGl0aW9uCi0KLXB1YmxpYyBieXRlW10gY3Jhc2hEYXRhCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGxvbmdNc2cKLQotcHVibGljIGludCBwaWQKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgcHJvY2Vzc05hbWUKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgc2hvcnRNc2cKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdGFnCi0KLXB1YmxpYyBpbnQgdWlkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuUGFyY2VsCi1hbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXIkMSkKLQotcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkKLQotcHVibGljIHZvaWQgcmVhZEZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0FjdGl2aXR5TWFuYWdlciRSZWNlbnRUYXNrSW5mbzsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC9hcHAvQWN0aXZpdHlNYW5hZ2VyJFJlY2VudFRhc2tJbmZvOz47ICkKLWZpbmFsIGNsYXNzIGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlciRSZWNlbnRUYXNrSW5mbyQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlciRSZWNlbnRUYXNrSW5mbyBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlciRSZWNlbnRUYXNrSW5mb1tdIG5ld0FycmF5KAotaW50KQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdFtdIG5ld0FycmF5KAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1SZWNlbnRUYXNrSW5mbyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9hcHAvQWN0aXZpdHlNYW5hZ2VyOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyJFJlY2VudFRhc2tJbmZvIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC9hcHAvQWN0aXZpdHlNYW5hZ2VyJFJlY2VudFRhc2tJbmZvOz47ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IgQ1JFQVRPUgotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LkludGVudCBiYXNlSW50ZW50Ci0KLXB1YmxpYyBpbnQgaWQKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIG9yaWdBY3Rpdml0eQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuUGFyY2VsKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLlBhcmNlbAotYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyJDEpCi0KLXB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpCi0KLXB1YmxpYyB2b2lkIHJlYWRGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I8TGFuZHJvaWQvYXBwL0FjdGl2aXR5TWFuYWdlciRSdW5uaW5nU2VydmljZUluZm87PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0FjdGl2aXR5TWFuYWdlciRSdW5uaW5nU2VydmljZUluZm87ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLWZpbmFsIGNsYXNzIGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlciRSdW5uaW5nU2VydmljZUluZm8kMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXIkUnVubmluZ1NlcnZpY2VJbmZvIGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyJFJ1bm5pbmdTZXJ2aWNlSW5mb1tdIG5ld0FycmF5KAotaW50KQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdFtdIG5ld0FycmF5KAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9BY3Rpdml0eU1hbmFnZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1SdW5uaW5nU2VydmljZUluZm8gKQotcHVibGljIGNsYXNzIGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlciRSdW5uaW5nU2VydmljZUluZm8gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExhbmRyb2lkL2FwcC9BY3Rpdml0eU1hbmFnZXIkUnVubmluZ1NlcnZpY2VJbmZvOz47ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IgQ1JFQVRPUgotCi1wdWJsaWMgbG9uZyBhY3RpdmVTaW5jZQotCi1wdWJsaWMgaW50IGNsaWVudENvdW50Ci0KLXB1YmxpYyBpbnQgY3Jhc2hDb3VudAotCi1wdWJsaWMgYm9vbGVhbiBmb3JlZ3JvdW5kCi0KLXB1YmxpYyBsb25nIGxhc3RBY3Rpdml0eVRpbWUKLQotcHVibGljIGludCBwaWQKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgcHJvY2VzcwotCi1wdWJsaWMgbG9uZyByZXN0YXJ0aW5nCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSBzZXJ2aWNlCi0KLXB1YmxpYyBib29sZWFuIHN0YXJ0ZWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5QYXJjZWwKLWFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlciQxKQotCi1wdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKQotCi1wdWJsaWMgdm9pZCByZWFkRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9hcHAvQWN0aXZpdHlNYW5hZ2VyJFJ1bm5pbmdUYXNrSW5mbzsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC9hcHAvQWN0aXZpdHlNYW5hZ2VyJFJ1bm5pbmdUYXNrSW5mbzs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1maW5hbCBjbGFzcyBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXIkUnVubmluZ1Rhc2tJbmZvJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyJFJ1bm5pbmdUYXNrSW5mbyBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlciRSdW5uaW5nVGFza0luZm9bXSBuZXdBcnJheSgKLWludCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3RbXSBuZXdBcnJheSgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9UnVubmluZ1Rhc2tJbmZvICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9BY3Rpdml0eU1hbmFnZXI7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXIkUnVubmluZ1Rhc2tJbmZvIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC9hcHAvQWN0aXZpdHlNYW5hZ2VyJFJ1bm5pbmdUYXNrSW5mbzs+OyApCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yIENSRUFUT1IKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIGJhc2VBY3Rpdml0eQotCi1wdWJsaWMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBkZXNjcmlwdGlvbgotCi1wdWJsaWMgaW50IGlkCi0KLXB1YmxpYyBpbnQgbnVtQWN0aXZpdGllcwotCi1wdWJsaWMgaW50IG51bVJ1bm5pbmcKLQotcHVibGljIGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwIHRodW1ibmFpbAotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUgdG9wQWN0aXZpdHkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5QYXJjZWwKLWFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlciQxKQotCi1wdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKQotCi1wdWJsaWMgdm9pZCByZWFkRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9BY3Rpdml0eU1hbmFnZXIkMTtMYW5kcm9pZC9hcHAvQWN0aXZpdHlNYW5hZ2VyJFByb2Nlc3NFcnJvclN0YXRlSW5mbztMYW5kcm9pZC9hcHAvQWN0aXZpdHlNYW5hZ2VyJE1lbW9yeUluZm87TGFuZHJvaWQvYXBwL0FjdGl2aXR5TWFuYWdlciRSdW5uaW5nU2VydmljZUluZm87TGFuZHJvaWQvYXBwL0FjdGl2aXR5TWFuYWdlciRSdW5uaW5nVGFza0luZm87TGFuZHJvaWQvYXBwL0FjdGl2aXR5TWFuYWdlciRSZWNlbnRUYXNrSW5mbzsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBERUJVRwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUNFTlRfV0lUSF9FWENMVURFRAotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIFRBRwotCi1wcml2YXRlIHN0YXRpYyBib29sZWFuIGxvY2FsTE9HVgotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQuY29udGVudC5Db250ZXh0IG1Db250ZXh0Ci0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5vcy5IYW5kbGVyIG1IYW5kbGVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC5vcy5IYW5kbGVyKQotCi1wdWJsaWMgYm9vbGVhbiBjbGVhckFwcGxpY2F0aW9uVXNlckRhdGEoCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLmNvbnRlbnQucG0uSVBhY2thZ2VEYXRhT2JzZXJ2ZXIpCi0KLXB1YmxpYyB2b2lkIGdldE1lbW9yeUluZm8oCi1hbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXIkTWVtb3J5SW5mbykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9hcHAvQWN0aXZpdHlNYW5hZ2VyJFByb2Nlc3NFcnJvclN0YXRlSW5mbzs+OyApCi1wdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0UHJvY2Vzc2VzSW5FcnJvclN0YXRlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSUkpTGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL2FwcC9BY3Rpdml0eU1hbmFnZXIkUmVjZW50VGFza0luZm87PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvU2VjdXJpdHlFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRSZWNlbnRUYXNrcygKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvU2VjdXJpdHlFeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSSlMamF2YS91dGlsL0xpc3Q8TGFuZHJvaWQvYXBwL0FjdGl2aXR5TWFuYWdlciRSdW5uaW5nU2VydmljZUluZm87PjsgKQotcHVibGljIGphdmEudXRpbC5MaXN0IGdldFJ1bm5pbmdTZXJ2aWNlcygKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL1NlY3VyaXR5RXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KEkpTGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL2FwcC9BY3Rpdml0eU1hbmFnZXIkUnVubmluZ1Rhc2tJbmZvOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRSdW5uaW5nVGFza3MoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9hcHAvSUFjdGl2aXR5TWFuYWdlciQxO0xhbmRyb2lkL2FwcC9JQWN0aXZpdHlNYW5hZ2VyJENvbnRlbnRQcm92aWRlckhvbGRlcjsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLmFwcC5JQWN0aXZpdHlNYW5hZ2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuSUludGVyZmFjZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ1RJVklUWV9ERVNUUk9ZRURfVFJBTlNBQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNUSVZJVFlfSURMRV9UUkFOU0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ1RJVklUWV9QQVVTRURfVFJBTlNBQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNUSVZJVFlfU1RPUFBFRF9UUkFOU0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRBQ0hfQVBQTElDQVRJT05fVFJBTlNBQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklORF9TRVJWSUNFX1RSQU5TQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJST0FEQ0FTVF9JTlRFTlRfVFJBTlNBQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlJPQURDQVNUX1NUSUNLWV9DQU5UX0hBVkVfUEVSTUlTU0lPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCUk9BRENBU1RfU1VDQ0VTUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQU5DRUxfSU5URU5UX1NFTkRFUl9UUkFOU0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSEVDS19QRVJNSVNTSU9OX1RSQU5TQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIRUNLX1VSSV9QRVJNSVNTSU9OX1RSQU5TQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMRUFSX0FQUF9EQVRBX1RSQU5TQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOVEVSX1NBRkVfTU9ERV9UUkFOU0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSU5JU0hfQUNUSVZJVFlfVFJBTlNBQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklOSVNIX0lOU1RSVU1FTlRBVElPTl9UUkFOU0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSU5JU0hfT1RIRVJfSU5TVEFOQ0VTX1RSQU5TQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTklTSF9SRUNFSVZFUl9UUkFOU0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSU5JU0hfU1VCX0FDVElWSVRZX1RSQU5TQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdFVF9BQ1RJVklUWV9DTEFTU19GT1JfVE9LRU5fVFJBTlNBQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0VUX0NBTExJTkdfQUNUSVZJVFlfVFJBTlNBQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0VUX0NBTExJTkdfUEFDS0FHRV9UUkFOU0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHRVRfQ09ORklHVVJBVElPTl9UUkFOU0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHRVRfQ09OVEVOVF9QUk9WSURFUl9UUkFOU0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHRVRfSU5URU5UX1NFTkRFUl9UUkFOU0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHRVRfTUVNT1JZX0lORk9fVFJBTlNBQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0VUX1BBQ0tBR0VfRk9SX0lOVEVOVF9TRU5ERVJfVFJBTlNBQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0VUX1BBQ0tBR0VfRk9SX1RPS0VOX1RSQU5TQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdFVF9QUk9DRVNTRVNfSU5fRVJST1JfU1RBVEVfVFJBTlNBQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0VUX1BST0NFU1NfTElNSVRfVFJBTlNBQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0VUX1JFQ0VOVF9UQVNLU19UUkFOU0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHRVRfUkVRVUVTVEVEX09SSUVOVEFUSU9OX1RSQU5TQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdFVF9TRVJWSUNFU19UUkFOU0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHRVRfVEFTS1NfVFJBTlNBQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0VUX1RBU0tfRk9SX0FDVElWSVRZX1RSQU5TQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdPSU5HX1RPX1NMRUVQX1RSQU5TQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdSQU5UX1VSSV9QRVJNSVNTSU9OX1RSQU5TQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhBTkRMRV9BUFBMSUNBVElPTl9FUlJPUl9UUkFOU0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFTlRfU0VOREVSX0FDVElWSVRZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVOVF9TRU5ERVJfQUNUSVZJVFlfUkVTVUxUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVOVF9TRU5ERVJfQlJPQURDQVNUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVOVF9TRU5ERVJfU0VSVklDRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLSUxMX1BJRFNfRk9SX01FTU9SWV9UUkFOU0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT1ZFX0FDVElWSVRZX1RBU0tfVE9fQkFDS19UUkFOU0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT1ZFX1RBU0tfQkFDS1dBUkRTX1RSQU5TQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PVkVfVEFTS19UT19CQUNLX1RSQU5TQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PVkVfVEFTS19UT19GUk9OVF9UUkFOU0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1RFX1dBS0VVUF9BTEFSTV9UUkFOU0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUEVOX0NPTlRFTlRfVVJJX1RSQU5TQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBVQkxJU0hfQ09OVEVOVF9QUk9WSURFUlNfVFJBTlNBQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFVCTElTSF9TRVJWSUNFX1RSQU5TQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFR0lTVEVSX1JFQ0VJVkVSX1RSQU5TQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTU9WRV9DT05URU5UX1BST1ZJREVSX1RSQU5TQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUE9SVF9QU1NfVFJBTlNBQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVQT1JUX1RIVU1CTkFJTF9UUkFOU0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNUQVJUX1BBQ0tBR0VfVFJBTlNBQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVWT0tFX1VSSV9QRVJNSVNTSU9OX1RSQU5TQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfRE9ORV9FWEVDVVRJTkdfVFJBTlNBQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VUX0FDVElWSVRZX1dBVENIRVJfVFJBTlNBQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VUX0FMV0FZU19GSU5JU0hfVFJBTlNBQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VUX0RFQlVHX0FQUF9UUkFOU0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVRfUEVSU0lTVEVOVF9UUkFOU0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVRfUFJPQ0VTU19GT1JFR1JPVU5EX1RSQU5TQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFVF9QUk9DRVNTX0xJTUlUX1RSQU5TQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFVF9SRVFVRVNURURfT1JJRU5UQVRJT05fVFJBTlNBQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VUX1NFUlZJQ0VfRk9SRUdST1VORF9UUkFOU0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9XX1dBSVRJTkdfRk9SX0RFQlVHR0VSX1RSQU5TQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJR05BTF9QRVJTSVNURU5UX1BST0NFU1NFU19UUkFOU0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFSVF9BQ1RJVklUWV9UUkFOU0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFSVF9DTEFTU19OT1RfRk9VTkQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBUlRfREVMSVZFUkVEX1RPX1RPUAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFSVF9GT1JXQVJEX0FORF9SRVFVRVNUX0NPTkZMSUNUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVJUX0lOU1RSVU1FTlRBVElPTl9UUkFOU0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFSVF9JTlRFTlRfTk9UX1JFU09MVkVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVJUX05FWFRfTUFUQ0hJTkdfQUNUSVZJVFlfVFJBTlNBQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBUlRfUEVSTUlTU0lPTl9ERU5JRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBUlRfUkVUVVJOX0lOVEVOVF9UT19DQUxMRVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBUlRfUlVOTklOR19UUkFOU0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFSVF9TRVJWSUNFX1RSQU5TQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVJUX1NVQ0NFU1MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBUlRfVEFTS19UT19GUk9OVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVE9QX1NFUlZJQ0VfVE9LRU5fVFJBTlNBQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RPUF9TRVJWSUNFX1RSQU5TQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNZU1RFTV9SRUFEWV9UUkFOU0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTkJJTkRfRklOSVNIRURfVFJBTlNBQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5CSU5EX1NFUlZJQ0VfVFJBTlNBQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5CUk9BRENBU1RfSU5URU5UX1RSQU5TQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOSEFORExFRF9CQUNLX1RSQU5TQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOUkVHSVNURVJfUkVDRUlWRVJfVFJBTlNBQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVBEQVRFX0NPTkZJR1VSQVRJT05fVFJBTlNBQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FLSU5HX1VQX1RSQU5TQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBkZXNjcmlwdG9yCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGFjdGl2aXR5RGVzdHJveWVkKAotYW5kcm9pZC5vcy5JQmluZGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgYWN0aXZpdHlJZGxlKAotYW5kcm9pZC5vcy5JQmluZGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgYWN0aXZpdHlQYXVzZWQoCi1hbmRyb2lkLm9zLklCaW5kZXIKLWFuZHJvaWQub3MuQnVuZGxlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgYWN0aXZpdHlTdG9wcGVkKAotYW5kcm9pZC5vcy5JQmluZGVyCi1hbmRyb2lkLmdyYXBoaWNzLkJpdG1hcAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGF0dGFjaEFwcGxpY2F0aW9uKAotYW5kcm9pZC5hcHAuSUFwcGxpY2F0aW9uVGhyZWFkKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCBiaW5kU2VydmljZSgKLWFuZHJvaWQuYXBwLklBcHBsaWNhdGlvblRocmVhZAotYW5kcm9pZC5vcy5JQmluZGVyCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLmFwcC5JU2VydmljZUNvbm5lY3Rpb24KLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgYnJvYWRjYXN0SW50ZW50KAotYW5kcm9pZC5hcHAuSUFwcGxpY2F0aW9uVGhyZWFkCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLmFwcC5JSW50ZW50UmVjZWl2ZXIKLWludAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5vcy5CdW5kbGUKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4KLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBjYW5jZWxJbnRlbnRTZW5kZXIoCi1hbmRyb2lkLmFwcC5JSW50ZW50U2VuZGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCBjaGVja1Blcm1pc3Npb24oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgY2hlY2tVcmlQZXJtaXNzaW9uKAotYW5kcm9pZC5uZXQuVXJpCi1pbnQKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gY2xlYXJBcHBsaWNhdGlvblVzZXJEYXRhKAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5jb250ZW50LnBtLklQYWNrYWdlRGF0YU9ic2VydmVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgZW50ZXJTYWZlTW9kZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBmaW5pc2hBY3Rpdml0eSgKLWFuZHJvaWQub3MuSUJpbmRlcgotaW50Ci1hbmRyb2lkLmNvbnRlbnQuSW50ZW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgZmluaXNoSW5zdHJ1bWVudGF0aW9uKAotYW5kcm9pZC5hcHAuSUFwcGxpY2F0aW9uVGhyZWFkCi1pbnQKLWFuZHJvaWQub3MuQnVuZGxlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgZmluaXNoT3RoZXJJbnN0YW5jZXMoCi1hbmRyb2lkLm9zLklCaW5kZXIKLWFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgZmluaXNoUmVjZWl2ZXIoCi1hbmRyb2lkLm9zLklCaW5kZXIKLWludAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5vcy5CdW5kbGUKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBmaW5pc2hTdWJBY3Rpdml0eSgKLWFuZHJvaWQub3MuSUJpbmRlcgotamF2YS5sYW5nLlN0cmluZwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIGdldEFjdGl2aXR5Q2xhc3NGb3JUb2tlbigKLWFuZHJvaWQub3MuSUJpbmRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSBnZXRDYWxsaW5nQWN0aXZpdHkoCi1hbmRyb2lkLm9zLklCaW5kZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRDYWxsaW5nUGFja2FnZSgKLWFuZHJvaWQub3MuSUJpbmRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC5hcHAuSUFjdGl2aXR5TWFuYWdlciRDb250ZW50UHJvdmlkZXJIb2xkZXIgZ2V0Q29udGVudFByb3ZpZGVyKAotYW5kcm9pZC5hcHAuSUFwcGxpY2F0aW9uVGhyZWFkCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQuYXBwLklJbnRlbnRTZW5kZXIgZ2V0SW50ZW50U2VuZGVyKAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLklCaW5kZXIKLWphdmEubGFuZy5TdHJpbmcKLWludAotYW5kcm9pZC5jb250ZW50LkludGVudAotamF2YS5sYW5nLlN0cmluZwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2V0TWVtb3J5SW5mbygKLWFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlciRNZW1vcnlJbmZvKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0UGFja2FnZUZvckludGVudFNlbmRlcigKLWFuZHJvaWQuYXBwLklJbnRlbnRTZW5kZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRQYWNrYWdlRm9yVG9rZW4oCi1hbmRyb2lkLm9zLklCaW5kZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldFByb2Nlc3NMaW1pdCgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0xpc3Q8TGFuZHJvaWQvYXBwL0FjdGl2aXR5TWFuYWdlciRQcm9jZXNzRXJyb3JTdGF0ZUluZm87PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEudXRpbC5MaXN0IGdldFByb2Nlc3Nlc0luRXJyb3JTdGF0ZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KElJKUxqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9hcHAvQWN0aXZpdHlNYW5hZ2VyJFJlY2VudFRhc2tJbmZvOz47ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnV0aWwuTGlzdCBnZXRSZWNlbnRUYXNrcygKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCBnZXRSZXF1ZXN0ZWRPcmllbnRhdGlvbigKLWFuZHJvaWQub3MuSUJpbmRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnV0aWwuTGlzdCBnZXRTZXJ2aWNlcygKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCBnZXRUYXNrRm9yQWN0aXZpdHkoCi1hbmRyb2lkLm9zLklCaW5kZXIKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLkxpc3QgZ2V0VGFza3MoCi1pbnQKLWludAotYW5kcm9pZC5hcHAuSVRodW1ibmFpbFJlY2VpdmVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgZ29pbmdUb1NsZWVwKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdyYW50VXJpUGVybWlzc2lvbigKLWFuZHJvaWQuYXBwLklBcHBsaWNhdGlvblRocmVhZAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5uZXQuVXJpCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGhhbmRsZUFwcGxpY2F0aW9uRXJyb3IoCi1hbmRyb2lkLm9zLklCaW5kZXIKLWludAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4ga2lsbFBpZHNGb3JNZW1vcnkoCi1pbnRbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIG1vdmVBY3Rpdml0eVRhc2tUb0JhY2soCi1hbmRyb2lkLm9zLklCaW5kZXIKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBtb3ZlVGFza0JhY2t3YXJkcygKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG1vdmVUYXNrVG9CYWNrKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgbW92ZVRhc2tUb0Zyb250KAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgbm90ZVdha2V1cEFsYXJtKAotYW5kcm9pZC5hcHAuSUludGVudFNlbmRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yIG9wZW5Db250ZW50VXJpKAotYW5kcm9pZC5uZXQuVXJpKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMYW5kcm9pZC9hcHAvSUFwcGxpY2F0aW9uVGhyZWFkO0xqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9hcHAvSUFjdGl2aXR5TWFuYWdlciRDb250ZW50UHJvdmlkZXJIb2xkZXI7PjspViApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBwdWJsaXNoQ29udGVudFByb3ZpZGVycygKLWFuZHJvaWQuYXBwLklBcHBsaWNhdGlvblRocmVhZAotamF2YS51dGlsLkxpc3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBwdWJsaXNoU2VydmljZSgKLWFuZHJvaWQub3MuSUJpbmRlcgotYW5kcm9pZC5jb250ZW50LkludGVudAotYW5kcm9pZC5vcy5JQmluZGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQuY29udGVudC5JbnRlbnQgcmVnaXN0ZXJSZWNlaXZlcigKLWFuZHJvaWQuYXBwLklBcHBsaWNhdGlvblRocmVhZAotYW5kcm9pZC5hcHAuSUludGVudFJlY2VpdmVyCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgcmVtb3ZlQ29udGVudFByb3ZpZGVyKAotYW5kcm9pZC5hcHAuSUFwcGxpY2F0aW9uVGhyZWFkCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgcmVwb3J0UHNzKAotYW5kcm9pZC5hcHAuSUFwcGxpY2F0aW9uVGhyZWFkCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCByZXBvcnRUaHVtYm5haWwoCi1hbmRyb2lkLm9zLklCaW5kZXIKLWFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgcmVzdGFydFBhY2thZ2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgcmV2b2tlVXJpUGVybWlzc2lvbigKLWFuZHJvaWQuYXBwLklBcHBsaWNhdGlvblRocmVhZAotYW5kcm9pZC5uZXQuVXJpCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXJ2aWNlRG9uZUV4ZWN1dGluZygKLWFuZHJvaWQub3MuSUJpbmRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEFjdGl2aXR5V2F0Y2hlcigKLWFuZHJvaWQuYXBwLklBY3Rpdml0eVdhdGNoZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRBbHdheXNGaW5pc2goCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RGVidWdBcHAoCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0UGVyc2lzdGVudCgKLWFuZHJvaWQub3MuSUJpbmRlcgotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFByb2Nlc3NGb3JlZ3JvdW5kKAotYW5kcm9pZC5vcy5JQmluZGVyCi1pbnQKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRQcm9jZXNzTGltaXQoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRSZXF1ZXN0ZWRPcmllbnRhdGlvbigKLWFuZHJvaWQub3MuSUJpbmRlcgotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0U2VydmljZUZvcmVncm91bmQoCi1hbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZQotYW5kcm9pZC5vcy5JQmluZGVyCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2hvd1dhaXRpbmdGb3JEZWJ1Z2dlcigKLWFuZHJvaWQuYXBwLklBcHBsaWNhdGlvblRocmVhZAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IHN0YXJ0QWN0aXZpdHkoCi1hbmRyb2lkLmFwcC5JQXBwbGljYXRpb25UaHJlYWQKLWFuZHJvaWQuY29udGVudC5JbnRlbnQKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQubmV0LlVyaVtdCi1pbnQKLWFuZHJvaWQub3MuSUJpbmRlcgotamF2YS5sYW5nLlN0cmluZwotaW50Ci1ib29sZWFuCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gc3RhcnRJbnN0cnVtZW50YXRpb24oCi1hbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZQotamF2YS5sYW5nLlN0cmluZwotaW50Ci1hbmRyb2lkLm9zLkJ1bmRsZQotYW5kcm9pZC5hcHAuSUluc3RydW1lbnRhdGlvbldhdGNoZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzdGFydE5leHRNYXRjaGluZ0FjdGl2aXR5KAotYW5kcm9pZC5vcy5JQmluZGVyCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc3RhcnRSdW5uaW5nKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSBzdGFydFNlcnZpY2UoCi1hbmRyb2lkLmFwcC5JQXBwbGljYXRpb25UaHJlYWQKLWFuZHJvaWQuY29udGVudC5JbnRlbnQKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IHN0b3BTZXJ2aWNlKAotYW5kcm9pZC5hcHAuSUFwcGxpY2F0aW9uVGhyZWFkCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gc3RvcFNlcnZpY2VUb2tlbigKLWFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lCi1hbmRyb2lkLm9zLklCaW5kZXIKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHN5c3RlbVJlYWR5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHVuYmluZEZpbmlzaGVkKAotYW5kcm9pZC5vcy5JQmluZGVyCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50Ci1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gdW5iaW5kU2VydmljZSgKLWFuZHJvaWQuYXBwLklTZXJ2aWNlQ29ubmVjdGlvbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHVuYnJvYWRjYXN0SW50ZW50KAotYW5kcm9pZC5hcHAuSUFwcGxpY2F0aW9uVGhyZWFkCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgdW5oYW5kbGVkQmFjaygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB1bnJlZ2lzdGVyUmVjZWl2ZXIoCi1hbmRyb2lkLmFwcC5JSW50ZW50UmVjZWl2ZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB1cGRhdGVDb25maWd1cmF0aW9uKAotYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgd2FraW5nVXAoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlck5hdGl2ZSBleHRlbmRzIGFuZHJvaWQub3MuQmluZGVyIGltcGxlbWVudHMgYW5kcm9pZC5hcHAuSUFjdGl2aXR5TWFuYWdlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLmFwcC5JQWN0aXZpdHlNYW5hZ2VyIGdEZWZhdWx0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmFwcC5JQWN0aXZpdHlNYW5hZ2VyIGFzSW50ZXJmYWNlKAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgYnJvYWRjYXN0U3RpY2t5SW50ZW50KAotYW5kcm9pZC5jb250ZW50LkludGVudAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmFwcC5JQWN0aXZpdHlNYW5hZ2VyIGdldERlZmF1bHQoKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbm90ZVdha2V1cEFsYXJtKAotYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudCkKLQotcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBvblRyYW5zYWN0KAotaW50Ci1hbmRyb2lkLm9zLlBhcmNlbAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLSBjbGFzcyBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXJQcm94eSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLmFwcC5JQWN0aXZpdHlNYW5hZ2VyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5JQmluZGVyIG1SZW1vdGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLklCaW5kZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBhY3Rpdml0eURlc3Ryb3llZCgKLWFuZHJvaWQub3MuSUJpbmRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGFjdGl2aXR5SWRsZSgKLWFuZHJvaWQub3MuSUJpbmRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGFjdGl2aXR5UGF1c2VkKAotYW5kcm9pZC5vcy5JQmluZGVyCi1hbmRyb2lkLm9zLkJ1bmRsZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGFjdGl2aXR5U3RvcHBlZCgKLWFuZHJvaWQub3MuSUJpbmRlcgotYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgYXR0YWNoQXBwbGljYXRpb24oCi1hbmRyb2lkLmFwcC5JQXBwbGljYXRpb25UaHJlYWQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGJpbmRTZXJ2aWNlKAotYW5kcm9pZC5hcHAuSUFwcGxpY2F0aW9uVGhyZWFkCi1hbmRyb2lkLm9zLklCaW5kZXIKLWFuZHJvaWQuY29udGVudC5JbnRlbnQKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQuYXBwLklTZXJ2aWNlQ29ubmVjdGlvbgotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGludCBicm9hZGNhc3RJbnRlbnQoCi1hbmRyb2lkLmFwcC5JQXBwbGljYXRpb25UaHJlYWQKLWFuZHJvaWQuY29udGVudC5JbnRlbnQKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQuYXBwLklJbnRlbnRSZWNlaXZlcgotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLkJ1bmRsZQotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbgotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNhbmNlbEludGVudFNlbmRlcigKLWFuZHJvaWQuYXBwLklJbnRlbnRTZW5kZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGNoZWNrUGVybWlzc2lvbigKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGludCBjaGVja1VyaVBlcm1pc3Npb24oCi1hbmRyb2lkLm5ldC5VcmkKLWludAotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBjbGVhckFwcGxpY2F0aW9uVXNlckRhdGEoCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLmNvbnRlbnQucG0uSVBhY2thZ2VEYXRhT2JzZXJ2ZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBlbnRlclNhZmVNb2RlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIGZpbmlzaEFjdGl2aXR5KAotYW5kcm9pZC5vcy5JQmluZGVyCi1pbnQKLWFuZHJvaWQuY29udGVudC5JbnRlbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBmaW5pc2hJbnN0cnVtZW50YXRpb24oCi1hbmRyb2lkLmFwcC5JQXBwbGljYXRpb25UaHJlYWQKLWludAotYW5kcm9pZC5vcy5CdW5kbGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBmaW5pc2hPdGhlckluc3RhbmNlcygKLWFuZHJvaWQub3MuSUJpbmRlcgotYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBmaW5pc2hSZWNlaXZlcigKLWFuZHJvaWQub3MuSUJpbmRlcgotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLkJ1bmRsZQotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGZpbmlzaFN1YkFjdGl2aXR5KAotYW5kcm9pZC5vcy5JQmluZGVyCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUgZ2V0QWN0aXZpdHlDbGFzc0ZvclRva2VuKAotYW5kcm9pZC5vcy5JQmluZGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIGdldENhbGxpbmdBY3Rpdml0eSgKLWFuZHJvaWQub3MuSUJpbmRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldENhbGxpbmdQYWNrYWdlKAotYW5kcm9pZC5vcy5JQmluZGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbiBnZXRDb25maWd1cmF0aW9uKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhbmRyb2lkLmFwcC5JQWN0aXZpdHlNYW5hZ2VyJENvbnRlbnRQcm92aWRlckhvbGRlciBnZXRDb250ZW50UHJvdmlkZXIoCi1hbmRyb2lkLmFwcC5JQXBwbGljYXRpb25UaHJlYWQKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYW5kcm9pZC5hcHAuSUludGVudFNlbmRlciBnZXRJbnRlbnRTZW5kZXIoCi1pbnQKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuSUJpbmRlcgotamF2YS5sYW5nLlN0cmluZwotaW50Ci1hbmRyb2lkLmNvbnRlbnQuSW50ZW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBnZXRNZW1vcnlJbmZvKAotYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyJE1lbW9yeUluZm8pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRQYWNrYWdlRm9ySW50ZW50U2VuZGVyKAotYW5kcm9pZC5hcHAuSUludGVudFNlbmRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFBhY2thZ2VGb3JUb2tlbigKLWFuZHJvaWQub3MuSUJpbmRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgZ2V0UHJvY2Vzc0xpbWl0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9hcHAvQWN0aXZpdHlNYW5hZ2VyJFByb2Nlc3NFcnJvclN0YXRlSW5mbzs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0UHJvY2Vzc2VzSW5FcnJvclN0YXRlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSUkpTGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL2FwcC9BY3Rpdml0eU1hbmFnZXIkUmVjZW50VGFza0luZm87PjsgKQotcHVibGljIGphdmEudXRpbC5MaXN0IGdldFJlY2VudFRhc2tzKAotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGdldFJlcXVlc3RlZE9yaWVudGF0aW9uKAotYW5kcm9pZC5vcy5JQmluZGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEudXRpbC5MaXN0IGdldFNlcnZpY2VzKAotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGdldFRhc2tGb3JBY3Rpdml0eSgKLWFuZHJvaWQub3MuSUJpbmRlcgotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRUYXNrcygKLWludAotaW50Ci1hbmRyb2lkLmFwcC5JVGh1bWJuYWlsUmVjZWl2ZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBnb2luZ1RvU2xlZXAoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgZ3JhbnRVcmlQZXJtaXNzaW9uKAotYW5kcm9pZC5hcHAuSUFwcGxpY2F0aW9uVGhyZWFkCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm5ldC5VcmkKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgaGFuZGxlQXBwbGljYXRpb25FcnJvcigKLWFuZHJvaWQub3MuSUJpbmRlcgotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBraWxsUGlkc0Zvck1lbW9yeSgKLWludFtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gbW92ZUFjdGl2aXR5VGFza1RvQmFjaygKLWFuZHJvaWQub3MuSUJpbmRlcgotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIG1vdmVUYXNrQmFja3dhcmRzKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgbW92ZVRhc2tUb0JhY2soCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBtb3ZlVGFza1RvRnJvbnQoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBub3RlV2FrZXVwQWxhcm0oCi1hbmRyb2lkLmFwcC5JSW50ZW50U2VuZGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3Igb3BlbkNvbnRlbnRVcmkoCi1hbmRyb2lkLm5ldC5VcmkpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExhbmRyb2lkL2FwcC9JQXBwbGljYXRpb25UaHJlYWQ7TGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL2FwcC9JQWN0aXZpdHlNYW5hZ2VyJENvbnRlbnRQcm92aWRlckhvbGRlcjs+OylWICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHB1Ymxpc2hDb250ZW50UHJvdmlkZXJzKAotYW5kcm9pZC5hcHAuSUFwcGxpY2F0aW9uVGhyZWFkCi1qYXZhLnV0aWwuTGlzdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHB1Ymxpc2hTZXJ2aWNlKAotYW5kcm9pZC5vcy5JQmluZGVyCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50Ci1hbmRyb2lkLm9zLklCaW5kZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LkludGVudCByZWdpc3RlclJlY2VpdmVyKAotYW5kcm9pZC5hcHAuSUFwcGxpY2F0aW9uVGhyZWFkCi1hbmRyb2lkLmFwcC5JSW50ZW50UmVjZWl2ZXIKLWFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXIKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCByZW1vdmVDb250ZW50UHJvdmlkZXIoCi1hbmRyb2lkLmFwcC5JQXBwbGljYXRpb25UaHJlYWQKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCByZXBvcnRQc3MoCi1hbmRyb2lkLmFwcC5JQXBwbGljYXRpb25UaHJlYWQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHJlcG9ydFRodW1ibmFpbCgKLWFuZHJvaWQub3MuSUJpbmRlcgotYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCByZXN0YXJ0UGFja2FnZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCByZXZva2VVcmlQZXJtaXNzaW9uKAotYW5kcm9pZC5hcHAuSUFwcGxpY2F0aW9uVGhyZWFkCi1hbmRyb2lkLm5ldC5VcmkKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNlcnZpY2VEb25lRXhlY3V0aW5nKAotYW5kcm9pZC5vcy5JQmluZGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0QWN0aXZpdHlXYXRjaGVyKAotYW5kcm9pZC5hcHAuSUFjdGl2aXR5V2F0Y2hlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldEFsd2F5c0ZpbmlzaCgKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXREZWJ1Z0FwcCgKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4KLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRQZXJzaXN0ZW50KAotYW5kcm9pZC5vcy5JQmluZGVyCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0UHJvY2Vzc0ZvcmVncm91bmQoCi1hbmRyb2lkLm9zLklCaW5kZXIKLWludAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldFByb2Nlc3NMaW1pdCgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldFJlcXVlc3RlZE9yaWVudGF0aW9uKAotYW5kcm9pZC5vcy5JQmluZGVyCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRTZXJ2aWNlRm9yZWdyb3VuZCgKLWFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lCi1hbmRyb2lkLm9zLklCaW5kZXIKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzaG93V2FpdGluZ0ZvckRlYnVnZ2VyKAotYW5kcm9pZC5hcHAuSUFwcGxpY2F0aW9uVGhyZWFkCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcygKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgc3RhcnRBY3Rpdml0eSgKLWFuZHJvaWQuYXBwLklBcHBsaWNhdGlvblRocmVhZAotYW5kcm9pZC5jb250ZW50LkludGVudAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5uZXQuVXJpW10KLWludAotYW5kcm9pZC5vcy5JQmluZGVyCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWJvb2xlYW4KLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBzdGFydEluc3RydW1lbnRhdGlvbigKLWFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWFuZHJvaWQub3MuQnVuZGxlCi1hbmRyb2lkLmFwcC5JSW5zdHJ1bWVudGF0aW9uV2F0Y2hlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIHN0YXJ0TmV4dE1hdGNoaW5nQWN0aXZpdHkoCi1hbmRyb2lkLm9zLklCaW5kZXIKLWFuZHJvaWQuY29udGVudC5JbnRlbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzdGFydFJ1bm5pbmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIHN0YXJ0U2VydmljZSgKLWFuZHJvaWQuYXBwLklBcHBsaWNhdGlvblRocmVhZAotYW5kcm9pZC5jb250ZW50LkludGVudAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgc3RvcFNlcnZpY2UoCi1hbmRyb2lkLmFwcC5JQXBwbGljYXRpb25UaHJlYWQKLWFuZHJvaWQuY29udGVudC5JbnRlbnQKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBzdG9wU2VydmljZVRva2VuKAotYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUKLWFuZHJvaWQub3MuSUJpbmRlcgotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc3lzdGVtUmVhZHkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgdW5iaW5kRmluaXNoZWQoCi1hbmRyb2lkLm9zLklCaW5kZXIKLWFuZHJvaWQuY29udGVudC5JbnRlbnQKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiB1bmJpbmRTZXJ2aWNlKAotYW5kcm9pZC5hcHAuSVNlcnZpY2VDb25uZWN0aW9uKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgdW5icm9hZGNhc3RJbnRlbnQoCi1hbmRyb2lkLmFwcC5JQXBwbGljYXRpb25UaHJlYWQKLWFuZHJvaWQuY29udGVudC5JbnRlbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB1bmhhbmRsZWRCYWNrKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHVucmVnaXN0ZXJSZWNlaXZlcigKLWFuZHJvaWQuYXBwLklJbnRlbnRSZWNlaXZlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHVwZGF0ZUNvbmZpZ3VyYXRpb24oCi1hbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb24pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB3YWtpbmdVcCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0FjdGl2aXR5VGhyZWFkOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTQxMDQgbmFtZSA9bnVsbCApCi0gY2xhc3MgYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjYgbmFtZSA9QWN0aXZpdHlSZWNvcmQgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0FjdGl2aXR5VGhyZWFkOyApCi1maW5hbCBjbGFzcyBhbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZCRBY3Rpdml0eVJlY29yZCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGFuZHJvaWQuYXBwLkFjdGl2aXR5IGFjdGl2aXR5Ci0KLSBhbmRyb2lkLmNvbnRlbnQucG0uQWN0aXZpdHlJbmZvIGFjdGl2aXR5SW5mbwotCi0gamF2YS5sYW5nLlN0cmluZyBlbWJlZGRlZElECi0KLSBib29sZWFuIGhpZGVGb3JOb3cKLQotIGFuZHJvaWQuY29udGVudC5JbnRlbnQgaW50ZW50Ci0KLSBqYXZhLmxhbmcuT2JqZWN0IGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UKLQotIGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbiBuZXdDb25maWcKLQotIGFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkJEFjdGl2aXR5UmVjb3JkIG5leHRJZGxlCi0KLSBhbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZCRQYWNrYWdlSW5mbyBwYWNrYWdlSW5mbwotCi0gYW5kcm9pZC5hcHAuQWN0aXZpdHkgcGFyZW50Ci0KLSBib29sZWFuIHBhdXNlZAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9jb250ZW50L0ludGVudDs+OyApCi0gamF2YS51dGlsLkxpc3QgcGVuZGluZ0ludGVudHMKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0xpc3Q8TGFuZHJvaWQvYXBwL1Jlc3VsdEluZm87PjsgKQotIGphdmEudXRpbC5MaXN0IHBlbmRpbmdSZXN1bHRzCi0KLSBib29sZWFuIHN0YXJ0c05vdFJlc3VtZWQKLQotIGFuZHJvaWQub3MuQnVuZGxlIHN0YXRlCi0KLSBib29sZWFuIHN0b3BwZWQKLQotIGFuZHJvaWQub3MuSUJpbmRlciB0b2tlbgotCi0gYW5kcm9pZC52aWV3LldpbmRvdyB3aW5kb3cKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0FjdGl2aXR5VGhyZWFkOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI2IG5hbWUgPUFwcEJpbmREYXRhICkKLWZpbmFsIGNsYXNzIGFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkJEFwcEJpbmREYXRhIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gYW5kcm9pZC5jb250ZW50LnBtLkFwcGxpY2F0aW9uSW5mbyBhcHBJbmZvCi0KLSBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb24gY29uZmlnCi0KLSBpbnQgZGVidWdNb2RlCi0KLSBib29sZWFuIGhhbmRsaW5nUHJvZmlsaW5nCi0KLSBhbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZCRQYWNrYWdlSW5mbyBpbmZvCi0KLSBhbmRyb2lkLm9zLkJ1bmRsZSBpbnN0cnVtZW50YXRpb25BcmdzCi0KLSBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSBpbnN0cnVtZW50YXRpb25OYW1lCi0KLSBhbmRyb2lkLmFwcC5JSW5zdHJ1bWVudGF0aW9uV2F0Y2hlciBpbnN0cnVtZW50YXRpb25XYXRjaGVyCi0KLSBqYXZhLmxhbmcuU3RyaW5nIHByb2Nlc3NOYW1lCi0KLSBqYXZhLmxhbmcuU3RyaW5nIHByb2ZpbGVGaWxlCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL2NvbnRlbnQvcG0vUHJvdmlkZXJJbmZvOz47ICkKLSBqYXZhLnV0aWwuTGlzdCBwcm92aWRlcnMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQkMSkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLmFwcC5JQXBwbGljYXRpb25UaHJlYWQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5JSW50ZXJmYWNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJJTkRfQVBQTElDQVRJT05fVFJBTlNBQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVCVUdfT0ZGCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFQlVHX09OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFQlVHX1dBSVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRFVNUF9TRVJWSUNFX1RSQU5TQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST0NFU1NfSU5fQkFDS0dST1VORF9UUkFOU0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVFVRVNUX1BTU19UUkFOU0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVFVRVNUX1RIVU1CTkFJTF9UUkFOU0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ0hFRFVMRV9BQ1RJVklUWV9DT05GSUdVUkFUSU9OX0NIQU5HRURfVFJBTlNBQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NIRURVTEVfQklORF9TRVJWSUNFX1RSQU5TQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDSEVEVUxFX0NPTkZJR1VSQVRJT05fQ0hBTkdFRF9UUkFOU0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ0hFRFVMRV9DUkVBVEVfU0VSVklDRV9UUkFOU0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ0hFRFVMRV9FWElUX1RSQU5TQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDSEVEVUxFX0ZJTklTSF9BQ1RJVklUWV9UUkFOU0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ0hFRFVMRV9MQVVOQ0hfQUNUSVZJVFlfVFJBTlNBQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NIRURVTEVfTE9XX01FTU9SWV9UUkFOU0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ0hFRFVMRV9ORVdfSU5URU5UX1RSQU5TQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDSEVEVUxFX1BBVVNFX0FDVElWSVRZX1RSQU5TQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDSEVEVUxFX1JFQ0VJVkVSX1RSQU5TQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDSEVEVUxFX1JFR0lTVEVSRURfUkVDRUlWRVJfVFJBTlNBQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NIRURVTEVfUkVMQVVOQ0hfQUNUSVZJVFlfVFJBTlNBQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NIRURVTEVfUkVTVU1FX0FDVElWSVRZX1RSQU5TQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDSEVEVUxFX1NFTkRfUkVTVUxUX1RSQU5TQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDSEVEVUxFX1NFUlZJQ0VfQVJHU19UUkFOU0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ0hFRFVMRV9TVE9QX0FDVElWSVRZX1RSQU5TQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDSEVEVUxFX1NUT1BfU0VSVklDRV9UUkFOU0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ0hFRFVMRV9VTkJJTkRfU0VSVklDRV9UUkFOU0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ0hFRFVMRV9XSU5ET1dfVklTSUJJTElUWV9UUkFOU0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBVUERBVEVfVElNRV9aT05FX1RSQU5TQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBkZXNjcmlwdG9yCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9TdHJpbmc7TGFuZHJvaWQvY29udGVudC9wbS9BcHBsaWNhdGlvbkluZm87TGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL2NvbnRlbnQvcG0vUHJvdmlkZXJJbmZvOz47TGFuZHJvaWQvY29udGVudC9Db21wb25lbnROYW1lO0xqYXZhL2xhbmcvU3RyaW5nO0xhbmRyb2lkL29zL0J1bmRsZTtMYW5kcm9pZC9hcHAvSUluc3RydW1lbnRhdGlvbldhdGNoZXI7SUxhbmRyb2lkL2NvbnRlbnQvcmVzL0NvbmZpZ3VyYXRpb247TGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TGFuZHJvaWQvb3MvSUJpbmRlcjs+OylWICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGJpbmRBcHBsaWNhdGlvbigKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm8KLWphdmEudXRpbC5MaXN0Ci1hbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZQotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5vcy5CdW5kbGUKLWFuZHJvaWQuYXBwLklJbnN0cnVtZW50YXRpb25XYXRjaGVyCi1pbnQKLWFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbgotamF2YS51dGlsLk1hcCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGR1bXBTZXJ2aWNlKAotamF2YS5pby5GaWxlRGVzY3JpcHRvcgotYW5kcm9pZC5vcy5JQmluZGVyCi1qYXZhLmxhbmcuU3RyaW5nW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBwcm9jZXNzSW5CYWNrZ3JvdW5kKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlcXVlc3RQc3MoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgcmVxdWVzdFRodW1ibmFpbCgKLWFuZHJvaWQub3MuSUJpbmRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNjaGVkdWxlQWN0aXZpdHlDb25maWd1cmF0aW9uQ2hhbmdlZCgKLWFuZHJvaWQub3MuSUJpbmRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNjaGVkdWxlQmluZFNlcnZpY2UoCi1hbmRyb2lkLm9zLklCaW5kZXIKLWFuZHJvaWQuY29udGVudC5JbnRlbnQKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzY2hlZHVsZUNvbmZpZ3VyYXRpb25DaGFuZ2VkKAotYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2NoZWR1bGVDcmVhdGVTZXJ2aWNlKAotYW5kcm9pZC5vcy5JQmluZGVyCi1hbmRyb2lkLmNvbnRlbnQucG0uU2VydmljZUluZm8pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzY2hlZHVsZURlc3Ryb3lBY3Rpdml0eSgKLWFuZHJvaWQub3MuSUJpbmRlcgotYm9vbGVhbgotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2NoZWR1bGVFeGl0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGFuZHJvaWQvY29udGVudC9JbnRlbnQ7TGFuZHJvaWQvb3MvSUJpbmRlcjtMYW5kcm9pZC9jb250ZW50L3BtL0FjdGl2aXR5SW5mbztMYW5kcm9pZC9vcy9CdW5kbGU7TGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL2FwcC9SZXN1bHRJbmZvOz47TGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL2NvbnRlbnQvSW50ZW50Oz47WilWICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNjaGVkdWxlTGF1bmNoQWN0aXZpdHkoCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50Ci1hbmRyb2lkLm9zLklCaW5kZXIKLWFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm8KLWFuZHJvaWQub3MuQnVuZGxlCi1qYXZhLnV0aWwuTGlzdAotamF2YS51dGlsLkxpc3QKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzY2hlZHVsZUxvd01lbW9yeSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9jb250ZW50L0ludGVudDs+O0xhbmRyb2lkL29zL0lCaW5kZXI7KVYgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2NoZWR1bGVOZXdJbnRlbnQoCi1qYXZhLnV0aWwuTGlzdAotYW5kcm9pZC5vcy5JQmluZGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2NoZWR1bGVQYXVzZUFjdGl2aXR5KAotYW5kcm9pZC5vcy5JQmluZGVyCi1ib29sZWFuCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzY2hlZHVsZVJlY2VpdmVyKAotYW5kcm9pZC5jb250ZW50LkludGVudAotYW5kcm9pZC5jb250ZW50LnBtLkFjdGl2aXR5SW5mbwotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLkJ1bmRsZQotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNjaGVkdWxlUmVnaXN0ZXJlZFJlY2VpdmVyKAotYW5kcm9pZC5hcHAuSUludGVudFJlY2VpdmVyCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50Ci1pbnQKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuQnVuZGxlCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMYW5kcm9pZC9vcy9JQmluZGVyO0xqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9hcHAvUmVzdWx0SW5mbzs+O0xqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9jb250ZW50L0ludGVudDs+O0laKVYgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2NoZWR1bGVSZWxhdW5jaEFjdGl2aXR5KAotYW5kcm9pZC5vcy5JQmluZGVyCi1qYXZhLnV0aWwuTGlzdAotamF2YS51dGlsLkxpc3QKLWludAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNjaGVkdWxlUmVzdW1lQWN0aXZpdHkoCi1hbmRyb2lkLm9zLklCaW5kZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExhbmRyb2lkL29zL0lCaW5kZXI7TGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL2FwcC9SZXN1bHRJbmZvOz47KVYgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2NoZWR1bGVTZW5kUmVzdWx0KAotYW5kcm9pZC5vcy5JQmluZGVyCi1qYXZhLnV0aWwuTGlzdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNjaGVkdWxlU2VydmljZUFyZ3MoCi1hbmRyb2lkLm9zLklCaW5kZXIKLWludAotYW5kcm9pZC5jb250ZW50LkludGVudCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNjaGVkdWxlU3RvcEFjdGl2aXR5KAotYW5kcm9pZC5vcy5JQmluZGVyCi1ib29sZWFuCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzY2hlZHVsZVN0b3BTZXJ2aWNlKAotYW5kcm9pZC5vcy5JQmluZGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2NoZWR1bGVVbmJpbmRTZXJ2aWNlKAotYW5kcm9pZC5vcy5JQmluZGVyCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2NoZWR1bGVXaW5kb3dWaXNpYmlsaXR5KAotYW5kcm9pZC5vcy5JQmluZGVyCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgdXBkYXRlVGltZVpvbmUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGFuZHJvaWQuYXBwLkFwcGxpY2F0aW9uVGhyZWFkTmF0aXZlIGV4dGVuZHMgYW5kcm9pZC5vcy5CaW5kZXIgaW1wbGVtZW50cyBhbmRyb2lkLmFwcC5JQXBwbGljYXRpb25UaHJlYWQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuYXBwLklBcHBsaWNhdGlvblRocmVhZCBhc0ludGVyZmFjZSgKLWFuZHJvaWQub3MuSUJpbmRlcikKLQotcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBvblRyYW5zYWN0KAotaW50Ci1hbmRyb2lkLm9zLlBhcmNlbAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQ7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTggbmFtZSA9QXBwbGljYXRpb25UaHJlYWQgKQotZmluYWwgY2xhc3MgYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQkQXBwbGljYXRpb25UaHJlYWQgZXh0ZW5kcyBhbmRyb2lkLmFwcC5BcHBsaWNhdGlvblRocmVhZE5hdGl2ZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEhFQVBfQ09MVU1OCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgT05FX0NPVU5UX0NPTFVNTgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRXT19DT1VOVF9DT0xVTU5TCi0KLWZpbmFsIGFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZCkKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQKLWFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkJDEpCi0KLXByaXZhdGUgdHJhbnNpZW50IHZvaWQgcHJpbnRSb3coCi1qYXZhLmlvLlByaW50V3JpdGVyCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0W10pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvU3RyaW5nO0xhbmRyb2lkL2NvbnRlbnQvcG0vQXBwbGljYXRpb25JbmZvO0xqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9jb250ZW50L3BtL1Byb3ZpZGVySW5mbzs+O0xhbmRyb2lkL2NvbnRlbnQvQ29tcG9uZW50TmFtZTtMamF2YS9sYW5nL1N0cmluZztMYW5kcm9pZC9vcy9CdW5kbGU7TGFuZHJvaWQvYXBwL0lJbnN0cnVtZW50YXRpb25XYXRjaGVyO0lMYW5kcm9pZC9jb250ZW50L3Jlcy9Db25maWd1cmF0aW9uO0xqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xhbmRyb2lkL29zL0lCaW5kZXI7PjspViApCi1wdWJsaWMgZmluYWwgdm9pZCBiaW5kQXBwbGljYXRpb24oCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLmNvbnRlbnQucG0uQXBwbGljYXRpb25JbmZvCi1qYXZhLnV0aWwuTGlzdAotYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuQnVuZGxlCi1hbmRyb2lkLmFwcC5JSW5zdHJ1bWVudGF0aW9uV2F0Y2hlcgotaW50Ci1hbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb24KLWphdmEudXRpbC5NYXApCi0KLXByb3RlY3RlZCB2b2lkIGR1bXAoCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1qYXZhLmlvLlByaW50V3JpdGVyCi1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLXB1YmxpYyB2b2lkIGR1bXBTZXJ2aWNlKAotamF2YS5pby5GaWxlRGVzY3JpcHRvcgotYW5kcm9pZC5vcy5JQmluZGVyCi1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLXB1YmxpYyB2b2lkIHByb2Nlc3NJbkJhY2tncm91bmQoKQotCi1wdWJsaWMgdm9pZCByZXF1ZXN0UHNzKCkKLQotcHVibGljIHZvaWQgcmVxdWVzdFRodW1ibmFpbCgKLWFuZHJvaWQub3MuSUJpbmRlcikKLQotcHVibGljIHZvaWQgc2NoZWR1bGVBY3Rpdml0eUNvbmZpZ3VyYXRpb25DaGFuZ2VkKAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgZmluYWwgdm9pZCBzY2hlZHVsZUJpbmRTZXJ2aWNlKAotYW5kcm9pZC5vcy5JQmluZGVyCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50Ci1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzY2hlZHVsZUNvbmZpZ3VyYXRpb25DaGFuZ2VkKAotYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uKQotCi1wdWJsaWMgZmluYWwgdm9pZCBzY2hlZHVsZUNyZWF0ZVNlcnZpY2UoCi1hbmRyb2lkLm9zLklCaW5kZXIKLWFuZHJvaWQuY29udGVudC5wbS5TZXJ2aWNlSW5mbykKLQotcHVibGljIGZpbmFsIHZvaWQgc2NoZWR1bGVEZXN0cm95QWN0aXZpdHkoCi1hbmRyb2lkLm9zLklCaW5kZXIKLWJvb2xlYW4KLWludCkKLQotcHVibGljIGZpbmFsIHZvaWQgc2NoZWR1bGVFeGl0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGFuZHJvaWQvY29udGVudC9JbnRlbnQ7TGFuZHJvaWQvb3MvSUJpbmRlcjtMYW5kcm9pZC9jb250ZW50L3BtL0FjdGl2aXR5SW5mbztMYW5kcm9pZC9vcy9CdW5kbGU7TGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL2FwcC9SZXN1bHRJbmZvOz47TGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL2NvbnRlbnQvSW50ZW50Oz47WilWICkKLXB1YmxpYyBmaW5hbCB2b2lkIHNjaGVkdWxlTGF1bmNoQWN0aXZpdHkoCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50Ci1hbmRyb2lkLm9zLklCaW5kZXIKLWFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm8KLWFuZHJvaWQub3MuQnVuZGxlCi1qYXZhLnV0aWwuTGlzdAotamF2YS51dGlsLkxpc3QKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNjaGVkdWxlTG93TWVtb3J5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL2NvbnRlbnQvSW50ZW50Oz47TGFuZHJvaWQvb3MvSUJpbmRlcjspViApCi1wdWJsaWMgZmluYWwgdm9pZCBzY2hlZHVsZU5ld0ludGVudCgKLWphdmEudXRpbC5MaXN0Ci1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHNjaGVkdWxlUGF1c2VBY3Rpdml0eSgKLWFuZHJvaWQub3MuSUJpbmRlcgotYm9vbGVhbgotaW50KQotCi1wdWJsaWMgZmluYWwgdm9pZCBzY2hlZHVsZVJlY2VpdmVyKAotYW5kcm9pZC5jb250ZW50LkludGVudAotYW5kcm9pZC5jb250ZW50LnBtLkFjdGl2aXR5SW5mbwotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLkJ1bmRsZQotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNjaGVkdWxlUmVnaXN0ZXJlZFJlY2VpdmVyKAotYW5kcm9pZC5hcHAuSUludGVudFJlY2VpdmVyCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50Ci1pbnQKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuQnVuZGxlCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMYW5kcm9pZC9vcy9JQmluZGVyO0xqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9hcHAvUmVzdWx0SW5mbzs+O0xqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9jb250ZW50L0ludGVudDs+O0laKVYgKQotcHVibGljIGZpbmFsIHZvaWQgc2NoZWR1bGVSZWxhdW5jaEFjdGl2aXR5KAotYW5kcm9pZC5vcy5JQmluZGVyCi1qYXZhLnV0aWwuTGlzdAotamF2YS51dGlsLkxpc3QKLWludAotYm9vbGVhbikKLQotcHVibGljIGZpbmFsIHZvaWQgc2NoZWR1bGVSZXN1bWVBY3Rpdml0eSgKLWFuZHJvaWQub3MuSUJpbmRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGFuZHJvaWQvb3MvSUJpbmRlcjtMamF2YS91dGlsL0xpc3Q8TGFuZHJvaWQvYXBwL1Jlc3VsdEluZm87PjspViApCi1wdWJsaWMgZmluYWwgdm9pZCBzY2hlZHVsZVNlbmRSZXN1bHQoCi1hbmRyb2lkLm9zLklCaW5kZXIKLWphdmEudXRpbC5MaXN0KQotCi1wdWJsaWMgZmluYWwgdm9pZCBzY2hlZHVsZVNlcnZpY2VBcmdzKAotYW5kcm9pZC5vcy5JQmluZGVyCi1pbnQKLWFuZHJvaWQuY29udGVudC5JbnRlbnQpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHNjaGVkdWxlU3RvcEFjdGl2aXR5KAotYW5kcm9pZC5vcy5JQmluZGVyCi1ib29sZWFuCi1pbnQpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHNjaGVkdWxlU3RvcFNlcnZpY2UoCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHNjaGVkdWxlVW5iaW5kU2VydmljZSgKLWFuZHJvaWQub3MuSUJpbmRlcgotYW5kcm9pZC5jb250ZW50LkludGVudCkKLQotcHVibGljIGZpbmFsIHZvaWQgc2NoZWR1bGVXaW5kb3dWaXNpYmlsaXR5KAotYW5kcm9pZC5vcy5JQmluZGVyCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCB1cGRhdGVUaW1lWm9uZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0FjdGl2aXR5VGhyZWFkOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI2IG5hbWUgPUJpbmRTZXJ2aWNlRGF0YSApCi1maW5hbCBjbGFzcyBhbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZCRCaW5kU2VydmljZURhdGEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBhbmRyb2lkLmNvbnRlbnQuSW50ZW50IGludGVudAotCi0gYm9vbGVhbiByZWJpbmQKLQotIGFuZHJvaWQub3MuSUJpbmRlciB0b2tlbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZCQxKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0FjdGl2aXR5VGhyZWFkOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI2IG5hbWUgPUNvbnRleHRDbGVhbnVwSW5mbyApCi1maW5hbCBjbGFzcyBhbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZCRDb250ZXh0Q2xlYW51cEluZm8gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBhbmRyb2lkLmFwcC5BcHBsaWNhdGlvbkNvbnRleHQgY29udGV4dAotCi0gamF2YS5sYW5nLlN0cmluZyB3aGF0Ci0KLSBqYXZhLmxhbmcuU3RyaW5nIHdobwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZCQxKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjYgbmFtZSA9Q3JlYXRlU2VydmljZURhdGEgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0FjdGl2aXR5VGhyZWFkOyApCi1maW5hbCBjbGFzcyBhbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZCRDcmVhdGVTZXJ2aWNlRGF0YSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGFuZHJvaWQuY29udGVudC5wbS5TZXJ2aWNlSW5mbyBpbmZvCi0KLSBhbmRyb2lkLmNvbnRlbnQuSW50ZW50IGludGVudAotCi0gYW5kcm9pZC5vcy5JQmluZGVyIHRva2VuCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkJDEpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQ7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjYgbmFtZSA9RHVtcFNlcnZpY2VJbmZvICkKLWZpbmFsIGNsYXNzIGFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkJER1bXBTZXJ2aWNlSW5mbyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGphdmEubGFuZy5TdHJpbmdbXSBhcmdzCi0KLSBib29sZWFuIGR1bXBlZAotCi0gamF2YS5pby5GaWxlRGVzY3JpcHRvciBmZAotCi0gYW5kcm9pZC5vcy5JQmluZGVyIHNlcnZpY2UKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQkMSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9vcy9NZXNzYWdlUXVldWU7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1JZGxlSGFuZGxlciApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQub3MuTWVzc2FnZVF1ZXVlJElkbGVIYW5kbGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHF1ZXVlSWRsZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNiBuYW1lID1HY0lkbGVyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9BY3Rpdml0eVRocmVhZDsgKQotZmluYWwgY2xhc3MgYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQkR2NJZGxlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLk1lc3NhZ2VRdWV1ZSRJZGxlSGFuZGxlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZCB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gcXVldWVJZGxlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL29zL0hhbmRsZXIkMTtMYW5kcm9pZC9vcy9IYW5kbGVyJE1lc3NlbmdlckltcGw7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLm9zLkhhbmRsZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gRklORF9QT1RFTlRJQUxfTEVBS1MKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLQotZmluYWwgYW5kcm9pZC5vcy5Mb29wZXIgbUxvb3BlcgotCi0gYW5kcm9pZC5vcy5JTWVzc2VuZ2VyIG1NZXNzZW5nZXIKLQotZmluYWwgYW5kcm9pZC5vcy5NZXNzYWdlUXVldWUgbVF1ZXVlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5Mb29wZXIpCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5vcy5NZXNzYWdlIGdldFBvc3RNZXNzYWdlKAotamF2YS5sYW5nLlJ1bm5hYmxlKQotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQub3MuTWVzc2FnZSBnZXRQb3N0TWVzc2FnZSgKLWphdmEubGFuZy5SdW5uYWJsZQotamF2YS5sYW5nLk9iamVjdCkKLQotcHJpdmF0ZSBmaW5hbCB2b2lkIGhhbmRsZUNhbGxiYWNrKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBkaXNwYXRjaE1lc3NhZ2UoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIGR1bXAoCi1hbmRyb2lkLnV0aWwuUHJpbnRlcgotamF2YS5sYW5nLlN0cmluZykKLQotZmluYWwgYW5kcm9pZC5vcy5JTWVzc2VuZ2VyIGdldElNZXNzZW5nZXIoKQotCi1wdWJsaWMgZmluYWwgYW5kcm9pZC5vcy5Mb29wZXIgZ2V0TG9vcGVyKCkKLQotcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZSgKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzTWVzc2FnZXMoCi1pbnQpCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGhhc01lc3NhZ2VzKAotaW50Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgZmluYWwgYW5kcm9pZC5vcy5NZXNzYWdlIG9idGFpbk1lc3NhZ2UoKQotCi1wdWJsaWMgZmluYWwgYW5kcm9pZC5vcy5NZXNzYWdlIG9idGFpbk1lc3NhZ2UoCi1pbnQpCi0KLXB1YmxpYyBmaW5hbCBhbmRyb2lkLm9zLk1lc3NhZ2Ugb2J0YWluTWVzc2FnZSgKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBmaW5hbCBhbmRyb2lkLm9zLk1lc3NhZ2Ugb2J0YWluTWVzc2FnZSgKLWludAotaW50Ci1pbnQKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBmaW5hbCBhbmRyb2lkLm9zLk1lc3NhZ2Ugb2J0YWluTWVzc2FnZSgKLWludAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gcG9zdCgKLWphdmEubGFuZy5SdW5uYWJsZSkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gcG9zdEF0RnJvbnRPZlF1ZXVlKAotamF2YS5sYW5nLlJ1bm5hYmxlKQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBwb3N0QXRUaW1lKAotamF2YS5sYW5nLlJ1bm5hYmxlCi1sb25nKQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBwb3N0QXRUaW1lKAotamF2YS5sYW5nLlJ1bm5hYmxlCi1qYXZhLmxhbmcuT2JqZWN0Ci1sb25nKQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBwb3N0RGVsYXllZCgKLWphdmEubGFuZy5SdW5uYWJsZQotbG9uZykKLQotcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlQ2FsbGJhY2tzKAotamF2YS5sYW5nLlJ1bm5hYmxlKQotCi1wdWJsaWMgZmluYWwgdm9pZCByZW1vdmVDYWxsYmFja3MoCi1qYXZhLmxhbmcuUnVubmFibGUKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZUNhbGxiYWNrc0FuZE1lc3NhZ2VzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlTWVzc2FnZXMoCi1pbnQpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZU1lc3NhZ2VzKAotaW50Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBzZW5kRW1wdHlNZXNzYWdlKAotaW50KQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBzZW5kRW1wdHlNZXNzYWdlQXRUaW1lKAotaW50Ci1sb25nKQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBzZW5kRW1wdHlNZXNzYWdlRGVsYXllZCgKLWludAotbG9uZykKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gc2VuZE1lc3NhZ2UoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIHNlbmRNZXNzYWdlQXRGcm9udE9mUXVldWUoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyBib29sZWFuIHNlbmRNZXNzYWdlQXRUaW1lKAotYW5kcm9pZC5vcy5NZXNzYWdlCi1sb25nKQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBzZW5kTWVzc2FnZURlbGF5ZWQoCi1hbmRyb2lkLm9zLk1lc3NhZ2UKLWxvbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQ7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTggbmFtZSA9SCApCi1maW5hbCBjbGFzcyBhbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZCRIIGV4dGVuZHMgYW5kcm9pZC5vcy5IYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDVElWSVRZX0NPTkZJR1VSQVRJT05fQ0hBTkdFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCSU5EX0FQUExJQ0FUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJJTkRfU0VSVklDRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTEVBTl9VUF9DT05URVhUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTkZJR1VSQVRJT05fQ0hBTkdFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDUkVBVEVfU0VSVklDRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVNUUk9ZX0FDVElWSVRZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERVTVBfU0VSVklDRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWElUX0FQUExJQ0FUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdDX1dIRU5fSURMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBISURFX1dJTkRPVwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMQVVOQ0hfQUNUSVZJVFkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9XX01FTU9SWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBORVdfSU5URU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBVVNFX0FDVElWSVRZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBVVNFX0FDVElWSVRZX0ZJTklTSElORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUNFSVZFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUxBVU5DSF9BQ1RJVklUWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVFVRVNUX1RIVU1CTkFJTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNVTUVfQUNUSVZJVFkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VORF9SRVNVTFQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9BUkdTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIT1dfV0lORE9XCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUT1BfQUNUSVZJVFlfSElERQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVE9QX0FDVElWSVRZX1NIT1cKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RPUF9TRVJWSUNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOQklORF9TRVJWSUNFCi0KLWZpbmFsIGFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZCkKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQKLWFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkJDEpCi0KLSBqYXZhLmxhbmcuU3RyaW5nIGNvZGVUb1N0cmluZygKLWludCkKLQotcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZSgKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE4IG5hbWUgPUlkbGVyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9BY3Rpdml0eVRocmVhZDsgKQotZmluYWwgY2xhc3MgYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQkSWRsZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5NZXNzYWdlUXVldWUkSWRsZUhhbmRsZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZAotYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQkMSkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gcXVldWVJZGxlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI2IG5hbWUgPU5ld0ludGVudERhdGEgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0FjdGl2aXR5VGhyZWFkOyApCi1maW5hbCBjbGFzcyBhbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZCROZXdJbnRlbnREYXRhIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9jb250ZW50L0ludGVudDs+OyApCi0gamF2YS51dGlsLkxpc3QgaW50ZW50cwotCi0gYW5kcm9pZC5vcy5JQmluZGVyIHRva2VuCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkJDEpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE2IG5hbWUgPUFyZ3MgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0FjdGl2aXR5VGhyZWFkJFBhY2thZ2VJbmZvJFJlY2VpdmVyRGlzcGF0Y2hlcjsgKQotZmluYWwgY2xhc3MgYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQkUGFja2FnZUluZm8kUmVjZWl2ZXJEaXNwYXRjaGVyJEFyZ3MgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5sYW5nLlJ1bm5hYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgaW50IG1DdXJDb2RlCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtQ3VyRGF0YQotCi1wcml2YXRlIGFuZHJvaWQuY29udGVudC5JbnRlbnQgbUN1ckludGVudAotCi1wcml2YXRlIGFuZHJvaWQub3MuQnVuZGxlIG1DdXJNYXAKLQotcHJpdmF0ZSBib29sZWFuIG1DdXJPcmRlcmVkCi0KLWZpbmFsIGFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkJFBhY2thZ2VJbmZvJFJlY2VpdmVyRGlzcGF0Y2hlciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZCRQYWNrYWdlSW5mbyRSZWNlaXZlckRpc3BhdGNoZXIpCi0KLXN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50IGFjY2VzcyQxMDIoCi1hbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZCRQYWNrYWdlSW5mbyRSZWNlaXZlckRpc3BhdGNoZXIkQXJncwotYW5kcm9pZC5jb250ZW50LkludGVudCkKLQotc3RhdGljIGludCBhY2Nlc3MkMjAwKAotYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQkUGFja2FnZUluZm8kUmVjZWl2ZXJEaXNwYXRjaGVyJEFyZ3MpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDIwMigKLWFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkJFBhY2thZ2VJbmZvJFJlY2VpdmVyRGlzcGF0Y2hlciRBcmdzCi1pbnQpCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGFjY2VzcyQzMDAoCi1hbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZCRQYWNrYWdlSW5mbyRSZWNlaXZlckRpc3BhdGNoZXIkQXJncykKLQotc3RhdGljIGphdmEubGFuZy5TdHJpbmcgYWNjZXNzJDMwMigKLWFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkJFBhY2thZ2VJbmZvJFJlY2VpdmVyRGlzcGF0Y2hlciRBcmdzCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1zdGF0aWMgYW5kcm9pZC5vcy5CdW5kbGUgYWNjZXNzJDQwMCgKLWFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkJFBhY2thZ2VJbmZvJFJlY2VpdmVyRGlzcGF0Y2hlciRBcmdzKQotCi1zdGF0aWMgYW5kcm9pZC5vcy5CdW5kbGUgYWNjZXNzJDQwMigKLWFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkJFBhY2thZ2VJbmZvJFJlY2VpdmVyRGlzcGF0Y2hlciRBcmdzCi1hbmRyb2lkLm9zLkJ1bmRsZSkKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDUwMigKLWFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkJFBhY2thZ2VJbmZvJFJlY2VpdmVyRGlzcGF0Y2hlciRBcmdzCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0lJbnRlbnRSZWNlaXZlciRTdHViOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQuYXBwLklJbnRlbnRSZWNlaXZlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLklJbnRlcmZhY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgcGVyZm9ybVJlY2VpdmUoCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50Ci1pbnQKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuQnVuZGxlCi1ib29sZWFuKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAzMyBuYW1lID1TdHViICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0lJbnRlbnRSZWNlaXZlciRTdHViJFByb3h5OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9hcHAvSUludGVudFJlY2VpdmVyOyApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC5hcHAuSUludGVudFJlY2VpdmVyJFN0dWIgZXh0ZW5kcyBhbmRyb2lkLm9zLkJpbmRlciBpbXBsZW1lbnRzIGFuZHJvaWQuYXBwLklJbnRlbnRSZWNlaXZlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFU0NSSVBUT1IKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9wZXJmb3JtUmVjZWl2ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5hcHAuSUludGVudFJlY2VpdmVyIGFzSW50ZXJmYWNlKAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIG9uVHJhbnNhY3QoCi1pbnQKLWFuZHJvaWQub3MuUGFyY2VsCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjQgbmFtZSA9SW5uZXJSZWNlaXZlciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQkUGFja2FnZUluZm8kUmVjZWl2ZXJEaXNwYXRjaGVyOyApCi1maW5hbCBjbGFzcyBhbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZCRQYWNrYWdlSW5mbyRSZWNlaXZlckRpc3BhdGNoZXIkSW5uZXJSZWNlaXZlciBleHRlbmRzIGFuZHJvaWQuYXBwLklJbnRlbnRSZWNlaXZlciRTdHViCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9yZWYvV2Vha1JlZmVyZW5jZTxMYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQkUGFja2FnZUluZm8kUmVjZWl2ZXJEaXNwYXRjaGVyOz47ICkKLWZpbmFsIGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZSBtRGlzcGF0Y2hlcgotCi1maW5hbCBhbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZCRQYWNrYWdlSW5mbyRSZWNlaXZlckRpc3BhdGNoZXIgbVN0cm9uZ1JlZgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkJFBhY2thZ2VJbmZvJFJlY2VpdmVyRGlzcGF0Y2hlcgotYm9vbGVhbikKLQotcHVibGljIHZvaWQgcGVyZm9ybVJlY2VpdmUoCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50Ci1pbnQKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuQnVuZGxlCi1ib29sZWFuKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0FjdGl2aXR5VGhyZWFkJFBhY2thZ2VJbmZvJFJlY2VpdmVyRGlzcGF0Y2hlciRBcmdzO0xhbmRyb2lkL2FwcC9BY3Rpdml0eVRocmVhZCRQYWNrYWdlSW5mbyRSZWNlaXZlckRpc3BhdGNoZXIkSW5uZXJSZWNlaXZlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0FjdGl2aXR5VGhyZWFkJFBhY2thZ2VJbmZvOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI0IG5hbWUgPVJlY2VpdmVyRGlzcGF0Y2hlciApCi1maW5hbCBjbGFzcyBhbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZCRQYWNrYWdlSW5mbyRSZWNlaXZlckRpc3BhdGNoZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQub3MuSGFuZGxlciBtQWN0aXZpdHlUaHJlYWQKLQotZmluYWwgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgbUNvbnRleHQKLQotZmluYWwgYW5kcm9pZC5hcHAuSUludGVudFJlY2VpdmVyJFN0dWIgbUlJbnRlbnRSZWNlaXZlcgotCi1maW5hbCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb24gbUluc3RydW1lbnRhdGlvbgotCi1maW5hbCBhbmRyb2lkLmFwcC5JbnRlbnRSZWNlaXZlckxlYWtlZCBtTG9jYXRpb24KLQotZmluYWwgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyIG1SZWNlaXZlcgotCi1maW5hbCBib29sZWFuIG1SZWdpc3RlcmVkCi0KLSBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiBtVW5yZWdpc3RlckxvY2F0aW9uCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC5vcy5IYW5kbGVyCi1hbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb24KLWJvb2xlYW4pCi0KLSBhbmRyb2lkLmFwcC5JSW50ZW50UmVjZWl2ZXIgZ2V0SUludGVudFJlY2VpdmVyKCkKLQotIGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlciBnZXRJbnRlbnRSZWNlaXZlcigpCi0KLSBhbmRyb2lkLmFwcC5JbnRlbnRSZWNlaXZlckxlYWtlZCBnZXRMb2NhdGlvbigpCi0KLSBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiBnZXRVbnJlZ2lzdGVyTG9jYXRpb24oKQotCi1wdWJsaWMgdm9pZCBwZXJmb3JtUmVjZWl2ZSgKLWFuZHJvaWQuY29udGVudC5JbnRlbnQKLWludAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5vcy5CdW5kbGUKLWJvb2xlYW4pCi0KLSB2b2lkIHNldFVucmVnaXN0ZXJMb2NhdGlvbigKLWphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uKQotCi0gdm9pZCB2YWxpZGF0ZSgKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLm9zLkhhbmRsZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0FjdGl2aXR5VGhyZWFkJFBhY2thZ2VJbmZvJFNlcnZpY2VEaXNwYXRjaGVyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPUNvbm5lY3Rpb25JbmZvICkKLSBjbGFzcyBhbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZCRQYWNrYWdlSW5mbyRTZXJ2aWNlRGlzcGF0Y2hlciRDb25uZWN0aW9uSW5mbyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGFuZHJvaWQub3MuSUJpbmRlciBiaW5kZXIKLQotIGFuZHJvaWQub3MuSUJpbmRlciREZWF0aFJlY2lwaWVudCBkZWF0aE1vbml0b3IKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQkMSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9RGVhdGhSZWNpcGllbnQgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvb3MvSUJpbmRlcjsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLm9zLklCaW5kZXIkRGVhdGhSZWNpcGllbnQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgYmluZGVyRGllZCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0FjdGl2aXR5VGhyZWFkJFBhY2thZ2VJbmZvJFNlcnZpY2VEaXNwYXRjaGVyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE4IG5hbWUgPURlYXRoTW9uaXRvciApCi1maW5hbCBjbGFzcyBhbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZCRQYWNrYWdlSW5mbyRTZXJ2aWNlRGlzcGF0Y2hlciREZWF0aE1vbml0b3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5JQmluZGVyJERlYXRoUmVjaXBpZW50Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIG1OYW1lCi0KLWZpbmFsIGFuZHJvaWQub3MuSUJpbmRlciBtU2VydmljZQotCi1maW5hbCBhbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZCRQYWNrYWdlSW5mbyRTZXJ2aWNlRGlzcGF0Y2hlciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZCRQYWNrYWdlSW5mbyRTZXJ2aWNlRGlzcGF0Y2hlcgotYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUKLWFuZHJvaWQub3MuSUJpbmRlcikKLQotcHVibGljIHZvaWQgYmluZGVyRGllZCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9hcHAvSVNlcnZpY2VDb25uZWN0aW9uJFN0dWI7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5hcHAuSVNlcnZpY2VDb25uZWN0aW9uIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuSUludGVyZmFjZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBjb25uZWN0ZWQoCi1hbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZQotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAzMyBuYW1lID1TdHViICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0lTZXJ2aWNlQ29ubmVjdGlvbiRTdHViJFByb3h5OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9hcHAvSVNlcnZpY2VDb25uZWN0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC5hcHAuSVNlcnZpY2VDb25uZWN0aW9uJFN0dWIgZXh0ZW5kcyBhbmRyb2lkLm9zLkJpbmRlciBpbXBsZW1lbnRzIGFuZHJvaWQuYXBwLklTZXJ2aWNlQ29ubmVjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFU0NSSVBUT1IKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9jb25uZWN0ZWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuYXBwLklTZXJ2aWNlQ29ubmVjdGlvbiBhc0ludGVyZmFjZSgKLWFuZHJvaWQub3MuSUJpbmRlcikKLQotcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBvblRyYW5zYWN0KAotaW50Ci1hbmRyb2lkLm9zLlBhcmNlbAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPUlubmVyQ29ubmVjdGlvbiApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQkUGFja2FnZUluZm8kU2VydmljZURpc3BhdGNoZXI7ICkKLSBjbGFzcyBhbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZCRQYWNrYWdlSW5mbyRTZXJ2aWNlRGlzcGF0Y2hlciRJbm5lckNvbm5lY3Rpb24gZXh0ZW5kcyBhbmRyb2lkLmFwcC5JU2VydmljZUNvbm5lY3Rpb24kU3R1YgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvcmVmL1dlYWtSZWZlcmVuY2U8TGFuZHJvaWQvYXBwL0FjdGl2aXR5VGhyZWFkJFBhY2thZ2VJbmZvJFNlcnZpY2VEaXNwYXRjaGVyOz47ICkKLWZpbmFsIGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZSBtRGlzcGF0Y2hlcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkJFBhY2thZ2VJbmZvJFNlcnZpY2VEaXNwYXRjaGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY29ubmVjdGVkKAotYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUKLWFuZHJvaWQub3MuSUJpbmRlcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQkUGFja2FnZUluZm8kU2VydmljZURpc3BhdGNoZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTggbmFtZSA9UnVuQ29ubmVjdGlvbiApCi1maW5hbCBjbGFzcyBhbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZCRQYWNrYWdlSW5mbyRTZXJ2aWNlRGlzcGF0Y2hlciRSdW5Db25uZWN0aW9uIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5SdW5uYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBpbnQgbUNvbW1hbmQKLQotZmluYWwgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUgbU5hbWUKLQotZmluYWwgYW5kcm9pZC5vcy5JQmluZGVyIG1TZXJ2aWNlCi0KLWZpbmFsIGFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkJFBhY2thZ2VJbmZvJFNlcnZpY2VEaXNwYXRjaGVyIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkJFBhY2thZ2VJbmZvJFNlcnZpY2VEaXNwYXRjaGVyCi1hbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZQotYW5kcm9pZC5vcy5JQmluZGVyCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNCBuYW1lID1TZXJ2aWNlRGlzcGF0Y2hlciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQkUGFja2FnZUluZm87ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0FjdGl2aXR5VGhyZWFkJFBhY2thZ2VJbmZvJFNlcnZpY2VEaXNwYXRjaGVyJERlYXRoTW9uaXRvcjtMYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQkUGFja2FnZUluZm8kU2VydmljZURpc3BhdGNoZXIkUnVuQ29ubmVjdGlvbjtMYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQkUGFja2FnZUluZm8kU2VydmljZURpc3BhdGNoZXIkSW5uZXJDb25uZWN0aW9uO0xhbmRyb2lkL2FwcC9BY3Rpdml0eVRocmVhZCRQYWNrYWdlSW5mbyRTZXJ2aWNlRGlzcGF0Y2hlciRDb25uZWN0aW9uSW5mbzsgKQotZmluYWwgY2xhc3MgYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQkUGFja2FnZUluZm8kU2VydmljZURpc3BhdGNoZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNoTWFwPExhbmRyb2lkL2NvbnRlbnQvQ29tcG9uZW50TmFtZTtMYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQkUGFja2FnZUluZm8kU2VydmljZURpc3BhdGNoZXIkQ29ubmVjdGlvbkluZm87PjsgKQotcHJpdmF0ZSBmaW5hbCBqYXZhLnV0aWwuSGFzaE1hcCBtQWN0aXZlQ29ubmVjdGlvbnMKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLm9zLkhhbmRsZXIgbUFjdGl2aXR5VGhyZWFkCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5jb250ZW50LlNlcnZpY2VDb25uZWN0aW9uIG1Db25uZWN0aW9uCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgbUNvbnRleHQKLQotcHJpdmF0ZSBib29sZWFuIG1EaWVkCi0KLXByaXZhdGUgZmluYWwgaW50IG1GbGFncwotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkJFBhY2thZ2VJbmZvJFNlcnZpY2VEaXNwYXRjaGVyJElubmVyQ29ubmVjdGlvbiBtSVNlcnZpY2VDb25uZWN0aW9uCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5hcHAuU2VydmljZUNvbm5lY3Rpb25MZWFrZWQgbUxvY2F0aW9uCi0KLXByaXZhdGUgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24gbVVuYmluZExvY2F0aW9uCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LlNlcnZpY2VDb25uZWN0aW9uCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC5vcy5IYW5kbGVyCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGNvbm5lY3RlZCgKLWFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXB1YmxpYyB2b2lkIGRlYXRoKAotYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUKLWFuZHJvaWQub3MuSUJpbmRlcikKLQotcHVibGljIHZvaWQgZG9Db25uZWN0ZWQoCi1hbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZQotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgdm9pZCBkb0RlYXRoKAotYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUKLWFuZHJvaWQub3MuSUJpbmRlcikKLQotIHZvaWQgZG9Gb3JnZXQoKQotCi0gaW50IGdldEZsYWdzKCkKLQotIGFuZHJvaWQuYXBwLklTZXJ2aWNlQ29ubmVjdGlvbiBnZXRJU2VydmljZUNvbm5lY3Rpb24oKQotCi0gYW5kcm9pZC5hcHAuU2VydmljZUNvbm5lY3Rpb25MZWFrZWQgZ2V0TG9jYXRpb24oKQotCi0gYW5kcm9pZC5jb250ZW50LlNlcnZpY2VDb25uZWN0aW9uIGdldFNlcnZpY2VDb25uZWN0aW9uKCkKLQotIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uIGdldFVuYmluZExvY2F0aW9uKCkKLQotIHZvaWQgc2V0VW5iaW5kTG9jYXRpb24oCi1qYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbikKLQotIHZvaWQgdmFsaWRhdGUoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC5vcy5IYW5kbGVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjUgbmFtZSA9UGFja2FnZUluZm8gKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0FjdGl2aXR5VGhyZWFkOyApCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9BY3Rpdml0eVRocmVhZCRQYWNrYWdlSW5mbyRTZXJ2aWNlRGlzcGF0Y2hlcjtMYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQkUGFja2FnZUluZm8kUmVjZWl2ZXJEaXNwYXRjaGVyOyApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQkUGFja2FnZUluZm8gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQgbUFjdGl2aXR5VGhyZWFkCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBtQXBwRGlyCi0KLXByaXZhdGUgYW5kcm9pZC5hcHAuQXBwbGljYXRpb24gbUFwcGxpY2F0aW9uCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5jb250ZW50LnBtLkFwcGxpY2F0aW9uSW5mbyBtQXBwbGljYXRpb25JbmZvCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLkNsYXNzTG9hZGVyIG1CYXNlQ2xhc3NMb2FkZXIKLQotcHJpdmF0ZSBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIgbUNsYXNzTG9hZGVyCi0KLSBpbnQgbUNsaWVudENvdW50Ci0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBtRGF0YURpcgotCi1wcml2YXRlIGZpbmFsIGphdmEuaW8uRmlsZSBtRGF0YURpckZpbGUKLQotcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1JbmNsdWRlQ29kZQotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgbVBhY2thZ2VOYW1lCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNoTWFwPExhbmRyb2lkL2NvbnRlbnQvQ29udGV4dDtMamF2YS91dGlsL0hhc2hNYXA8TGFuZHJvaWQvY29udGVudC9Ccm9hZGNhc3RSZWNlaXZlcjtMYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQkUGFja2FnZUluZm8kUmVjZWl2ZXJEaXNwYXRjaGVyOz47PjsgKQotcHJpdmF0ZSBmaW5hbCBqYXZhLnV0aWwuSGFzaE1hcCBtUmVjZWl2ZXJzCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBtUmVzRGlyCi0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMgbVJlc291cmNlcwotCi1wcml2YXRlIGZpbmFsIGJvb2xlYW4gbVNlY3VyaXR5VmlvbGF0aW9uCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNoTWFwPExhbmRyb2lkL2NvbnRlbnQvQ29udGV4dDtMamF2YS91dGlsL0hhc2hNYXA8TGFuZHJvaWQvY29udGVudC9TZXJ2aWNlQ29ubmVjdGlvbjtMYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQkUGFja2FnZUluZm8kU2VydmljZURpc3BhdGNoZXI7Pjs+OyApCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5IYXNoTWFwIG1TZXJ2aWNlcwotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmdbXSBtU2hhcmVkTGlicmFyaWVzCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNoTWFwPExhbmRyb2lkL2NvbnRlbnQvQ29udGV4dDtMamF2YS91dGlsL0hhc2hNYXA8TGFuZHJvaWQvY29udGVudC9TZXJ2aWNlQ29ubmVjdGlvbjtMYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQkUGFja2FnZUluZm8kU2VydmljZURpc3BhdGNoZXI7Pjs+OyApCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5IYXNoTWFwIG1VbmJvdW5kU2VydmljZXMKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0hhc2hNYXA8TGFuZHJvaWQvY29udGVudC9Db250ZXh0O0xqYXZhL3V0aWwvSGFzaE1hcDxMYW5kcm9pZC9jb250ZW50L0Jyb2FkY2FzdFJlY2VpdmVyO0xhbmRyb2lkL2FwcC9BY3Rpdml0eVRocmVhZCRQYWNrYWdlSW5mbyRSZWNlaXZlckRpc3BhdGNoZXI7Pjs+OyApCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5IYXNoTWFwIG1VbnJlZ2lzdGVyZWRSZWNlaXZlcnMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZAotYW5kcm9pZC5jb250ZW50LnBtLkFwcGxpY2F0aW9uSW5mbwotYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQKLWphdmEubGFuZy5DbGFzc0xvYWRlcgotYm9vbGVhbgotYm9vbGVhbikKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1zdGF0aWMgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMgYWNjZXNzJDM3MDAoCi1hbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZCRQYWNrYWdlSW5mbykKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBjb21iaW5lTGlicygKLWphdmEubGFuZy5TdHJpbmdbXQotamF2YS5sYW5nLlN0cmluZ1tdKQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0TGlicmFyaWVzRm9yKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFuZHJvaWQuYXBwLklJbnRlbnRSZWNlaXZlciBmb3JnZXRSZWNlaXZlckRpc3BhdGNoZXIoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyKQotCi1wdWJsaWMgZmluYWwgYW5kcm9pZC5hcHAuSVNlcnZpY2VDb25uZWN0aW9uIGZvcmdldFNlcnZpY2VEaXNwYXRjaGVyKAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQuY29udGVudC5TZXJ2aWNlQ29ubmVjdGlvbikKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QXBwRGlyKCkKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRNYW5hZ2VyIGdldEFzc2V0cygKLWFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkKQotCi1wdWJsaWMgamF2YS5sYW5nLkNsYXNzTG9hZGVyIGdldENsYXNzTG9hZGVyKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RGF0YURpcigpCi0KLXB1YmxpYyBqYXZhLmlvLkZpbGUgZ2V0RGF0YURpckZpbGUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRQYWNrYWdlTmFtZSgpCi0KLXB1YmxpYyBhbmRyb2lkLmFwcC5JSW50ZW50UmVjZWl2ZXIgZ2V0UmVjZWl2ZXJEaXNwYXRjaGVyKAotYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC5vcy5IYW5kbGVyCi1hbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb24KLWJvb2xlYW4pCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFJlc0RpcigpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcyBnZXRSZXNvdXJjZXMoCi1hbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZCkKLQotcHVibGljIGZpbmFsIGFuZHJvaWQuYXBwLklTZXJ2aWNlQ29ubmVjdGlvbiBnZXRTZXJ2aWNlRGlzcGF0Y2hlcigKLWFuZHJvaWQuY29udGVudC5TZXJ2aWNlQ29ubmVjdGlvbgotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQub3MuSGFuZGxlcgotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBpc1NlY3VyaXR5VmlvbGF0aW9uKCkKLQotcHVibGljIGFuZHJvaWQuYXBwLkFwcGxpY2F0aW9uIG1ha2VBcHBsaWNhdGlvbigpCi0KLXB1YmxpYyB2b2lkIHJlbW92ZUNvbnRleHRSZWdpc3RyYXRpb25zKAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0FjdGl2aXR5VGhyZWFkOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE4IG5hbWUgPVByb3ZpZGVyUmVjb3JkICkKLWZpbmFsIGNsYXNzIGFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkJFByb3ZpZGVyUmVjb3JkIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuSUJpbmRlciREZWF0aFJlY2lwaWVudAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyIG1Mb2NhbFByb3ZpZGVyCi0KLWZpbmFsIGphdmEubGFuZy5TdHJpbmcgbU5hbWUKLQotZmluYWwgYW5kcm9pZC5jb250ZW50LklDb250ZW50UHJvdmlkZXIgbVByb3ZpZGVyCi0KLWZpbmFsIGFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLmNvbnRlbnQuSUNvbnRlbnRQcm92aWRlcgotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlcikKLQotcHVibGljIHZvaWQgYmluZGVyRGllZCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xOCBuYW1lID1Qcm92aWRlclJlZkNvdW50ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9BY3Rpdml0eVRocmVhZDsgKQotZmluYWwgY2xhc3MgYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQkUHJvdmlkZXJSZWZDb3VudCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGludCBjb3VudAotCi1maW5hbCBhbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZCB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9BY3Rpdml0eVRocmVhZDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNiBuYW1lID1SZWNlaXZlckRhdGEgKQotZmluYWwgY2xhc3MgYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQkUmVjZWl2ZXJEYXRhIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gYW5kcm9pZC5jb250ZW50LnBtLkFjdGl2aXR5SW5mbyBpbmZvCi0KLSBhbmRyb2lkLmNvbnRlbnQuSW50ZW50IGludGVudAotCi0gYm9vbGVhbiByZXN1bHRBYm9ydAotCi0gaW50IHJlc3VsdENvZGUKLQotIGphdmEubGFuZy5TdHJpbmcgcmVzdWx0RGF0YQotCi0gYW5kcm9pZC5vcy5CdW5kbGUgcmVzdWx0RXh0cmFzCi0KLSBib29sZWFuIHN5bmMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQkMSkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjYgbmFtZSA9UmVzdWx0RGF0YSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQ7ICkKLWZpbmFsIGNsYXNzIGFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkJFJlc3VsdERhdGEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL2FwcC9SZXN1bHRJbmZvOz47ICkKLSBqYXZhLnV0aWwuTGlzdCByZXN1bHRzCi0KLSBhbmRyb2lkLm9zLklCaW5kZXIgdG9rZW4KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQkMSkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjYgbmFtZSA9U2VydmljZUFyZ3NEYXRhICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9BY3Rpdml0eVRocmVhZDsgKQotZmluYWwgY2xhc3MgYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQkU2VydmljZUFyZ3NEYXRhIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gYW5kcm9pZC5jb250ZW50LkludGVudCBhcmdzCi0KLSBpbnQgc3RhcnRJZAotCi0gYW5kcm9pZC5vcy5JQmluZGVyIHRva2VuCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkJDEpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPVN0b3BJbmZvICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9BY3Rpdml0eVRocmVhZDsgKQotIGNsYXNzIGFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkJFN0b3BJbmZvIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBkZXNjcmlwdGlvbgotCi0gYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAgdGh1bWJuYWlsCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkJDEpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQkMTtMYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQkUHJvdmlkZXJSZWZDb3VudDtMYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQkU3RvcEluZm87TGFuZHJvaWQvYXBwL0FjdGl2aXR5VGhyZWFkJEdjSWRsZXI7TGFuZHJvaWQvYXBwL0FjdGl2aXR5VGhyZWFkJElkbGVyO0xhbmRyb2lkL2FwcC9BY3Rpdml0eVRocmVhZCRIO0xhbmRyb2lkL2FwcC9BY3Rpdml0eVRocmVhZCRBcHBsaWNhdGlvblRocmVhZDtMYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQkQ29udGV4dENsZWFudXBJbmZvO0xhbmRyb2lkL2FwcC9BY3Rpdml0eVRocmVhZCRSZXN1bHREYXRhO0xhbmRyb2lkL2FwcC9BY3Rpdml0eVRocmVhZCREdW1wU2VydmljZUluZm87TGFuZHJvaWQvYXBwL0FjdGl2aXR5VGhyZWFkJEFwcEJpbmREYXRhO0xhbmRyb2lkL2FwcC9BY3Rpdml0eVRocmVhZCRTZXJ2aWNlQXJnc0RhdGE7TGFuZHJvaWQvYXBwL0FjdGl2aXR5VGhyZWFkJEJpbmRTZXJ2aWNlRGF0YTtMYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQkQ3JlYXRlU2VydmljZURhdGE7TGFuZHJvaWQvYXBwL0FjdGl2aXR5VGhyZWFkJFJlY2VpdmVyRGF0YTtMYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQkTmV3SW50ZW50RGF0YTtMYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQkUHJvdmlkZXJSZWNvcmQ7TGFuZHJvaWQvYXBwL0FjdGl2aXR5VGhyZWFkJEFjdGl2aXR5UmVjb3JkO0xhbmRyb2lkL2FwcC9BY3Rpdml0eVRocmVhZCRQYWNrYWdlSW5mbzsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfQlJPQURDQVNUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMT0dfT05fUEFVU0VfQ0FMTEVECi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMT0dfT05fUkVTVU1FX0NBTExFRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIE1JTl9USU1FX0JFVFdFRU5fR0NTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEudXRpbC5yZWdleC5QYXR0ZXJuIFBBVFRFUk5fU0VNSUNPTE9OCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTUUxJVEVfTUVNX1JFTEVBU0VEX0VWRU5UX0xPR19UQUcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBsb2NhbExPR1YKLQotcHJpdmF0ZSBzdGF0aWMgYW5kcm9pZC5hcHAuQXBwbGljYXRpb25Db250ZXh0IG1TeXN0ZW1Db250ZXh0Ci0KLXN0YXRpYyBhbmRyb2lkLmNvbnRlbnQucG0uSVBhY2thZ2VNYW5hZ2VyIHNQYWNrYWdlTWFuYWdlcgotCi1zdGF0aWMgZmluYWwgamF2YS5sYW5nLlRocmVhZExvY2FsIHNUaHJlYWRMb2NhbAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaE1hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL3JlZi9XZWFrUmVmZXJlbmNlPExhbmRyb2lkL2NvbnRlbnQvcmVzL1Jlc291cmNlczs+Oz47ICkKLSBqYXZhLnV0aWwuSGFzaE1hcCBtQWN0aXZlUmVzb3VyY2VzCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNoTWFwPExhbmRyb2lkL29zL0lCaW5kZXI7TGFuZHJvaWQvYXBwL0FjdGl2aXR5VGhyZWFkJEFjdGl2aXR5UmVjb3JkOz47ICkKLWZpbmFsIGphdmEudXRpbC5IYXNoTWFwIG1BY3Rpdml0aWVzCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9BcnJheUxpc3Q8TGFuZHJvaWQvYXBwL0FwcGxpY2F0aW9uOz47ICkKLWZpbmFsIGphdmEudXRpbC5BcnJheUxpc3QgbUFsbEFwcGxpY2F0aW9ucwotCi1maW5hbCBhbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZCRBcHBsaWNhdGlvblRocmVhZCBtQXBwVGhyZWFkCi0KLSBhbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZCRBcHBCaW5kRGF0YSBtQm91bmRBcHBsaWNhdGlvbgotCi0gYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uIG1Db25maWd1cmF0aW9uCi0KLSBhbmRyb2lkLnZpZXcuRGlzcGxheSBtRGlzcGxheQotCi1maW5hbCBhbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZCRHY0lkbGVyIG1HY0lkbGVyCi0KLSBib29sZWFuIG1HY0lkbGVyU2NoZWR1bGVkCi0KLWZpbmFsIGFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkJEggbUgKLQotIGFuZHJvaWQuYXBwLkFwcGxpY2F0aW9uIG1Jbml0aWFsQXBwbGljYXRpb24KLQotIGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbiBtSW5zdHJ1bWVudGF0aW9uCi0KLSBqYXZhLmxhbmcuU3RyaW5nIG1JbnN0cnVtZW50YXRpb25BcHBEaXIKLQotIGphdmEubGFuZy5TdHJpbmcgbUluc3RydW1lbnRhdGlvbkFwcFBhY2thZ2UKLQotIGphdmEubGFuZy5TdHJpbmcgbUluc3RydW1lbnRlZEFwcERpcgotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaE1hcDxMYW5kcm9pZC9vcy9JQmluZGVyO0xhbmRyb2lkL2FwcC9BY3Rpdml0eVRocmVhZCRQcm92aWRlclJlY29yZDs+OyApCi1maW5hbCBqYXZhLnV0aWwuSGFzaE1hcCBtTG9jYWxQcm92aWRlcnMKLQotZmluYWwgYW5kcm9pZC5vcy5Mb29wZXIgbUxvb3BlcgotCi0gYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQkQWN0aXZpdHlSZWNvcmQgbU5ld0FjdGl2aXRpZXMKLQotIGludCBtTnVtVmlzaWJsZUFjdGl2aXRpZXMKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0hhc2hNYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9yZWYvV2Vha1JlZmVyZW5jZTxMYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQkUGFja2FnZUluZm87Pjs+OyApCi1maW5hbCBqYXZhLnV0aWwuSGFzaE1hcCBtUGFja2FnZXMKLQotIGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbiBtUGVuZGluZ0NvbmZpZ3VyYXRpb24KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0hhc2hNYXA8TGphdmEvbGFuZy9TdHJpbmc7TGFuZHJvaWQvYXBwL0FjdGl2aXR5VGhyZWFkJFByb3ZpZGVyUmVjb3JkOz47ICkKLWZpbmFsIGphdmEudXRpbC5IYXNoTWFwIG1Qcm92aWRlck1hcAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaE1hcDxMYW5kcm9pZC9vcy9JQmluZGVyO0xhbmRyb2lkL2FwcC9BY3Rpdml0eVRocmVhZCRQcm92aWRlclJlZkNvdW50Oz47ICkKLWZpbmFsIGphdmEudXRpbC5IYXNoTWFwIG1Qcm92aWRlclJlZkNvdW50TWFwCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9BcnJheUxpc3Q8TGFuZHJvaWQvYXBwL0FjdGl2aXR5VGhyZWFkJEFjdGl2aXR5UmVjb3JkOz47ICkKLWZpbmFsIGphdmEudXRpbC5BcnJheUxpc3QgbVJlbGF1bmNoaW5nQWN0aXZpdGllcwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaE1hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL3JlZi9XZWFrUmVmZXJlbmNlPExhbmRyb2lkL2FwcC9BY3Rpdml0eVRocmVhZCRQYWNrYWdlSW5mbzs+Oz47ICkKLWZpbmFsIGphdmEudXRpbC5IYXNoTWFwIG1SZXNvdXJjZVBhY2thZ2VzCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNoTWFwPExhbmRyb2lkL29zL0lCaW5kZXI7TGFuZHJvaWQvYXBwL1NlcnZpY2U7PjsgKQotZmluYWwgamF2YS51dGlsLkhhc2hNYXAgbVNlcnZpY2VzCi0KLSBib29sZWFuIG1TeXN0ZW1UaHJlYWQKLQotcHJpdmF0ZSBpbnQgbVRodW1ibmFpbEhlaWdodAotCi1wcml2YXRlIGludCBtVGh1bWJuYWlsV2lkdGgKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLSB2b2lkIDxpbml0PigpCi0KLXN0YXRpYyBhbmRyb2lkLmFwcC5BcHBsaWNhdGlvbkNvbnRleHQgYWNjZXNzJDAwMCgpCi0KLXN0YXRpYyBhbmRyb2lkLmFwcC5BcHBsaWNhdGlvbkNvbnRleHQgYWNjZXNzJDAwMigKLWFuZHJvaWQuYXBwLkFwcGxpY2F0aW9uQ29udGV4dCkKLQotc3RhdGljIHZvaWQgYWNjZXNzJDE4MDAoCi1hbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZAotYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQkQWN0aXZpdHlSZWNvcmQpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQxOTAwKAotYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQKLWFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkJEFjdGl2aXR5UmVjb3JkCi1pbnQpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQyMDAwKAotYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQKLWFuZHJvaWQub3MuSUJpbmRlcgotYm9vbGVhbgotaW50KQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMjEwMCgKLWFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkCi1hbmRyb2lkLm9zLklCaW5kZXIKLWJvb2xlYW4KLWludCkKLQotc3RhdGljIHZvaWQgYWNjZXNzJDIyMDAoCi1hbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZAotYW5kcm9pZC5vcy5JQmluZGVyCi1ib29sZWFuKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMjMwMCgKLWFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkCi1hbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZCRSZXN1bHREYXRhKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMjQwMCgKLWFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkCi1hbmRyb2lkLm9zLklCaW5kZXIKLWJvb2xlYW4KLWludAotYm9vbGVhbikKLQotc3RhdGljIHZvaWQgYWNjZXNzJDI1MDAoCi1hbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZAotYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQkQXBwQmluZERhdGEpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQyNjAwKAotYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQKLWFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkJE5ld0ludGVudERhdGEpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQyNzAwKAotYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQKLWFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkJFJlY2VpdmVyRGF0YSkKLQotc3RhdGljIHZvaWQgYWNjZXNzJDI4MDAoCi1hbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZAotYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQkQ3JlYXRlU2VydmljZURhdGEpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQyOTAwKAotYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQKLWFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkJEJpbmRTZXJ2aWNlRGF0YSkKLQotc3RhdGljIHZvaWQgYWNjZXNzJDMwMDAoCi1hbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZAotYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQkQmluZFNlcnZpY2VEYXRhKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMzEwMCgKLWFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkCi1hbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZCRTZXJ2aWNlQXJnc0RhdGEpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQzMjAwKAotYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQKLWFuZHJvaWQub3MuSUJpbmRlcikKLQotc3RhdGljIHZvaWQgYWNjZXNzJDMzMDAoCi1hbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMzQwMCgKLWFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkCi1hbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZCREdW1wU2VydmljZUluZm8pCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQ3MDAoCi1hbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZAotaW50Ci1qYXZhLmxhbmcuT2JqZWN0Ci1pbnQpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQ4MDAoCi1hbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZAotaW50Ci1qYXZhLmxhbmcuT2JqZWN0Ci1pbnQKLWludCkKLQotc3RhdGljIHZvaWQgYWNjZXNzJDkwMCgKLWFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi0KLXByaXZhdGUgZmluYWwgdm9pZCBhdHRhY2goCi1ib29sZWFuKQotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwIGNyZWF0ZVRodW1ibmFpbEJpdG1hcCgKLWFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkJEFjdGl2aXR5UmVjb3JkKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkIGN1cnJlbnRBY3Rpdml0eVRocmVhZCgpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBjdXJyZW50UGFja2FnZU5hbWUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQkQWN0aXZpdHlSZWNvcmQ7TGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL2NvbnRlbnQvSW50ZW50Oz47KVYgKQotcHJpdmF0ZSBmaW5hbCB2b2lkIGRlbGl2ZXJOZXdJbnRlbnRzKAotYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQkQWN0aXZpdHlSZWNvcmQKLWphdmEudXRpbC5MaXN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQkQWN0aXZpdHlSZWNvcmQ7TGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL2FwcC9SZXN1bHRJbmZvOz47KVYgKQotcHJpdmF0ZSBmaW5hbCB2b2lkIGRlbGl2ZXJSZXN1bHRzKAotYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQkQWN0aXZpdHlSZWNvcmQKLWphdmEudXRpbC5MaXN0KQotCi1wcml2YXRlIGZpbmFsIHZvaWQgZGV0YWNoKCkKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZCRQYWNrYWdlSW5mbyBnZXRQYWNrYWdlSW5mbygKLWFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm8KLWphdmEubGFuZy5DbGFzc0xvYWRlcgotYm9vbGVhbgotYm9vbGVhbikKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQucG0uSVBhY2thZ2VNYW5hZ2VyIGdldFBhY2thZ2VNYW5hZ2VyKCkKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLmNvbnRlbnQuSUNvbnRlbnRQcm92aWRlciBnZXRQcm92aWRlcigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIGZpbmFsIHZvaWQgaGFuZGxlQmluZEFwcGxpY2F0aW9uKAotYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQkQXBwQmluZERhdGEpCi0KLXByaXZhdGUgZmluYWwgdm9pZCBoYW5kbGVCaW5kU2VydmljZSgKLWFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkJEJpbmRTZXJ2aWNlRGF0YSkKLQotcHJpdmF0ZSBmaW5hbCB2b2lkIGhhbmRsZUNyZWF0ZVNlcnZpY2UoCi1hbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZCRDcmVhdGVTZXJ2aWNlRGF0YSkKLQotcHJpdmF0ZSBmaW5hbCB2b2lkIGhhbmRsZURlc3Ryb3lBY3Rpdml0eSgKLWFuZHJvaWQub3MuSUJpbmRlcgotYm9vbGVhbgotaW50Ci1ib29sZWFuKQotCi1wcml2YXRlIHZvaWQgaGFuZGxlRHVtcFNlcnZpY2UoCi1hbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZCREdW1wU2VydmljZUluZm8pCi0KLXByaXZhdGUgZmluYWwgdm9pZCBoYW5kbGVMYXVuY2hBY3Rpdml0eSgKLWFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkJEFjdGl2aXR5UmVjb3JkKQotCi1wcml2YXRlIGZpbmFsIHZvaWQgaGFuZGxlTmV3SW50ZW50KAotYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQkTmV3SW50ZW50RGF0YSkKLQotcHJpdmF0ZSBmaW5hbCB2b2lkIGhhbmRsZVBhdXNlQWN0aXZpdHkoCi1hbmRyb2lkLm9zLklCaW5kZXIKLWJvb2xlYW4KLWludCkKLQotcHJpdmF0ZSBmaW5hbCB2b2lkIGhhbmRsZVJlY2VpdmVyKAotYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQkUmVjZWl2ZXJEYXRhKQotCi1wcml2YXRlIGZpbmFsIHZvaWQgaGFuZGxlUmVsYXVuY2hBY3Rpdml0eSgKLWFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkJEFjdGl2aXR5UmVjb3JkCi1pbnQpCi0KLXByaXZhdGUgZmluYWwgdm9pZCBoYW5kbGVSZXF1ZXN0VGh1bWJuYWlsKAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wcml2YXRlIGZpbmFsIHZvaWQgaGFuZGxlU2VuZFJlc3VsdCgKLWFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkJFJlc3VsdERhdGEpCi0KLXByaXZhdGUgZmluYWwgdm9pZCBoYW5kbGVTZXJ2aWNlQXJncygKLWFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkJFNlcnZpY2VBcmdzRGF0YSkKLQotcHJpdmF0ZSBmaW5hbCB2b2lkIGhhbmRsZVN0b3BBY3Rpdml0eSgKLWFuZHJvaWQub3MuSUJpbmRlcgotYm9vbGVhbgotaW50KQotCi1wcml2YXRlIGZpbmFsIHZvaWQgaGFuZGxlU3RvcFNlcnZpY2UoCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXByaXZhdGUgZmluYWwgdm9pZCBoYW5kbGVVbmJpbmRTZXJ2aWNlKAotYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQkQmluZFNlcnZpY2VEYXRhKQotCi1wcml2YXRlIGZpbmFsIHZvaWQgaGFuZGxlV2luZG93VmlzaWJpbGl0eSgKLWFuZHJvaWQub3MuSUJpbmRlcgotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGFuZHJvaWQvY29udGVudC9Db250ZXh0O0xqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9jb250ZW50L3BtL1Byb3ZpZGVySW5mbzs+OylWICkKLXByaXZhdGUgZmluYWwgdm9pZCBpbnN0YWxsQ29udGVudFByb3ZpZGVycygKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1qYXZhLnV0aWwuTGlzdCkKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLmNvbnRlbnQuSUNvbnRlbnRQcm92aWRlciBpbnN0YWxsUHJvdmlkZXIoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC5jb250ZW50LklDb250ZW50UHJvdmlkZXIKLWFuZHJvaWQuY29udGVudC5wbS5Qcm92aWRlckluZm8KLWJvb2xlYW4pCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBtYWluKAotamF2YS5sYW5nLlN0cmluZ1tdKQotCi1wcml2YXRlIGZpbmFsIHZvaWQgcGVyZm9ybUNvbmZpZ3VyYXRpb25DaGFuZ2VkKAotYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudENhbGxiYWNrcwotYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uKQotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkJEFjdGl2aXR5UmVjb3JkIHBlcmZvcm1EZXN0cm95QWN0aXZpdHkoCi1hbmRyb2lkLm9zLklCaW5kZXIKLWJvb2xlYW4KLWludAotYm9vbGVhbikKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLmFwcC5BY3Rpdml0eSBwZXJmb3JtTGF1bmNoQWN0aXZpdHkoCi1hbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZCRBY3Rpdml0eVJlY29yZCkKLQotcHJpdmF0ZSBmaW5hbCB2b2lkIHBlcmZvcm1TdG9wQWN0aXZpdHlJbm5lcigKLWFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkJEFjdGl2aXR5UmVjb3JkCi1hbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZCRTdG9wSW5mbwotYm9vbGVhbikKLQotcHJpdmF0ZSBmaW5hbCB2b2lkIHF1ZXVlT3JTZW5kTWVzc2FnZSgKLWludAotamF2YS5sYW5nLk9iamVjdCkKLQotcHJpdmF0ZSBmaW5hbCB2b2lkIHF1ZXVlT3JTZW5kTWVzc2FnZSgKLWludAotamF2YS5sYW5nLk9iamVjdAotaW50KQotCi1wcml2YXRlIGZpbmFsIHZvaWQgcXVldWVPclNlbmRNZXNzYWdlKAotaW50Ci1qYXZhLmxhbmcuT2JqZWN0Ci1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZCBzeXN0ZW1NYWluKCkKLQotcHJpdmF0ZSBmaW5hbCB2b2lkIHVwZGF0ZVZpc2liaWxpdHkoCi1hbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZCRBY3Rpdml0eVJlY29yZAotYm9vbGVhbikKLQotcHVibGljIGZpbmFsIGFuZHJvaWQuY29udGVudC5JQ29udGVudFByb3ZpZGVyIGFjcXVpcmVQcm92aWRlcigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShaTGFuZHJvaWQvY29udGVudC9yZXMvQ29uZmlndXJhdGlvbjspTGphdmEvdXRpbC9BcnJheUxpc3Q8TGFuZHJvaWQvY29udGVudC9Db21wb25lbnRDYWxsYmFja3M7PjsgKQotIGphdmEudXRpbC5BcnJheUxpc3QgY29sbGVjdENvbXBvbmVudENhbGxiYWNrc0xvY2tlZCgKLWJvb2xlYW4KLWFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbikKLQotIHZvaWQgZG9HY0lmTmVlZGVkKCkKLQotZmluYWwgdm9pZCBmaW5pc2hJbnN0cnVtZW50YXRpb24oCi1pbnQKLWFuZHJvaWQub3MuQnVuZGxlKQotCi1wdWJsaWMgZmluYWwgYW5kcm9pZC5hcHAuQWN0aXZpdHkgZ2V0QWN0aXZpdHkoCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXB1YmxpYyBhbmRyb2lkLmFwcC5BcHBsaWNhdGlvbiBnZXRBcHBsaWNhdGlvbigpCi0KLXB1YmxpYyBhbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZCRBcHBsaWNhdGlvblRocmVhZCBnZXRBcHBsaWNhdGlvblRocmVhZCgpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpCi0KLSBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3MgZ2V0RGlzcGxheU1ldHJpY3NMb2NrZWQoKQotCi1maW5hbCBhbmRyb2lkLm9zLkhhbmRsZXIgZ2V0SGFuZGxlcigpCi0KLXB1YmxpYyBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb24gZ2V0SW5zdHJ1bWVudGF0aW9uKCkKLQotcHVibGljIGFuZHJvaWQub3MuTG9vcGVyIGdldExvb3BlcigpCi0KLXB1YmxpYyBmaW5hbCBhbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZCRQYWNrYWdlSW5mbyBnZXRQYWNrYWdlSW5mbygKLWFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm8KLWludCkKLQotcHVibGljIGZpbmFsIGFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkJFBhY2thZ2VJbmZvIGdldFBhY2thZ2VJbmZvKAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgZmluYWwgYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQkUGFja2FnZUluZm8gZ2V0UGFja2FnZUluZm9Ob0NoZWNrKAotYW5kcm9pZC5jb250ZW50LnBtLkFwcGxpY2F0aW9uSW5mbykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UHJvZmlsZUZpbGVQYXRoKCkKLQotcHVibGljIGFuZHJvaWQuYXBwLkFwcGxpY2F0aW9uQ29udGV4dCBnZXRTeXN0ZW1Db250ZXh0KCkKLQotIGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzIGdldFRvcExldmVsUmVzb3VyY2VzKAotamF2YS5sYW5nLlN0cmluZykKLQotZmluYWwgdm9pZCBoYW5kbGVBY3Rpdml0eUNvbmZpZ3VyYXRpb25DaGFuZ2VkKAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1maW5hbCB2b2lkIGhhbmRsZUNvbmZpZ3VyYXRpb25DaGFuZ2VkKAotYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uKQotCi1maW5hbCB2b2lkIGhhbmRsZUxvd01lbW9yeSgpCi0KLWZpbmFsIHZvaWQgaGFuZGxlUmVzdW1lQWN0aXZpdHkoCi1hbmRyb2lkLm9zLklCaW5kZXIKLWJvb2xlYW4pCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGhhc1BhY2thZ2VJbmZvKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGZpbmFsIHZvaWQgaW5zdGFsbFN5c3RlbVByb3ZpZGVycygKLWphdmEudXRpbC5MaXN0KQotCi1wdWJsaWMgYm9vbGVhbiBpc1Byb2ZpbGluZygpCi0KLXB1YmxpYyBmaW5hbCBhbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZCRBY3Rpdml0eVJlY29yZCBwZXJmb3JtRGVzdHJveUFjdGl2aXR5KAotYW5kcm9pZC5vcy5JQmluZGVyCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMYW5kcm9pZC9vcy9JQmluZGVyO0xqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9jb250ZW50L0ludGVudDs+OylWICkKLXB1YmxpYyBmaW5hbCB2b2lkIHBlcmZvcm1OZXdJbnRlbnRzKAotYW5kcm9pZC5vcy5JQmluZGVyCi1qYXZhLnV0aWwuTGlzdCkKLQotZmluYWwgYW5kcm9pZC5vcy5CdW5kbGUgcGVyZm9ybVBhdXNlQWN0aXZpdHkoCi1hbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZCRBY3Rpdml0eVJlY29yZAotYm9vbGVhbgotYm9vbGVhbikKLQotZmluYWwgYW5kcm9pZC5vcy5CdW5kbGUgcGVyZm9ybVBhdXNlQWN0aXZpdHkoCi1hbmRyb2lkLm9zLklCaW5kZXIKLWJvb2xlYW4KLWJvb2xlYW4pCi0KLWZpbmFsIHZvaWQgcGVyZm9ybVJlc3RhcnRBY3Rpdml0eSgKLWFuZHJvaWQub3MuSUJpbmRlcikKLQotcHVibGljIGZpbmFsIGFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkJEFjdGl2aXR5UmVjb3JkIHBlcmZvcm1SZXN1bWVBY3Rpdml0eSgKLWFuZHJvaWQub3MuSUJpbmRlcgotYm9vbGVhbikKLQotZmluYWwgdm9pZCBwZXJmb3JtU3RvcEFjdGl2aXR5KAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiByZWxlYXNlUHJvdmlkZXIoCi1hbmRyb2lkLmNvbnRlbnQuSUNvbnRlbnRQcm92aWRlcikKLQotZmluYWwgdm9pZCByZW1vdmVEZWFkUHJvdmlkZXIoCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLmNvbnRlbnQuSUNvbnRlbnRQcm92aWRlcikKLQotZmluYWwgdm9pZCByZW1vdmVEZWFkUHJvdmlkZXJMb2NrZWQoCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLmNvbnRlbnQuSUNvbnRlbnRQcm92aWRlcikKLQotcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlUHJvdmlkZXJMb2NrZWQoCi1hbmRyb2lkLmNvbnRlbnQuSUNvbnRlbnRQcm92aWRlcikKLQotcHVibGljIGZpbmFsIGFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm8gcmVzb2x2ZUFjdGl2aXR5SW5mbygKLWFuZHJvaWQuY29udGVudC5JbnRlbnQpCi0KLWZpbmFsIHZvaWQgc2NoZWR1bGVDb250ZXh0Q2xlYW51cCgKLWFuZHJvaWQuYXBwLkFwcGxpY2F0aW9uQ29udGV4dAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotIHZvaWQgc2NoZWR1bGVHY0lkbGVyKCkKLQotcHVibGljIGZpbmFsIHZvaWQgc2VuZEFjdGl2aXR5UmVzdWx0KAotYW5kcm9pZC5vcy5JQmluZGVyCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludAotYW5kcm9pZC5jb250ZW50LkludGVudCkKLQotcHVibGljIGZpbmFsIGFuZHJvaWQuYXBwLkFjdGl2aXR5IHN0YXJ0QWN0aXZpdHlOb3coCi1hbmRyb2lkLmFwcC5BY3Rpdml0eQotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5jb250ZW50LkludGVudAotYW5kcm9pZC5jb250ZW50LnBtLkFjdGl2aXR5SW5mbwotYW5kcm9pZC5vcy5JQmluZGVyCi1hbmRyb2lkLm9zLkJ1bmRsZSkKLQotcHVibGljIGZpbmFsIGFuZHJvaWQuYXBwLkFjdGl2aXR5IHN0YXJ0QWN0aXZpdHlOb3coCi1hbmRyb2lkLmFwcC5BY3Rpdml0eQotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5jb250ZW50LkludGVudAotYW5kcm9pZC5vcy5JQmluZGVyCi1hbmRyb2lkLm9zLkJ1bmRsZSkKLQotIHZvaWQgdW5zY2hlZHVsZUdjSWRsZXIoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuYXBwLkFsYXJtTWFuYWdlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUxBUFNFRF9SRUFMVElNRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTEFQU0VEX1JFQUxUSU1FX1dBS0VVUAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVEMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlRDX1dBS0VVUAotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLmFwcC5JQWxhcm1NYW5hZ2VyIG1TZXJ2aWNlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi0gdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCBjYW5jZWwoCi1hbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50KQotCi1wdWJsaWMgdm9pZCBzZXQoCi1pbnQKLWxvbmcKLWFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQpCi0KLXB1YmxpYyB2b2lkIHNldFJlcGVhdGluZygKLWludAotbG9uZwotbG9uZwotYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudCkKLQotcHVibGljIHZvaWQgc2V0VGltZVpvbmUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9BbGVydERpYWxvZzsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPUJ1aWxkZXIgKQotcHVibGljIGNsYXNzIGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nJEJ1aWxkZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLkFsZXJ0Q29udHJvbGxlciRBbGVydFBhcmFtcyBQCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXB1YmxpYyBhbmRyb2lkLmFwcC5BbGVydERpYWxvZyBjcmVhdGUoKQotCi1wdWJsaWMgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2ckQnVpbGRlciBzZXRBZGFwdGVyKAotYW5kcm9pZC53aWRnZXQuTGlzdEFkYXB0ZXIKLWFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UkT25DbGlja0xpc3RlbmVyKQotCi1wdWJsaWMgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2ckQnVpbGRlciBzZXRDYW5jZWxhYmxlKAotYm9vbGVhbikKLQotcHVibGljIGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nJEJ1aWxkZXIgc2V0Q3Vyc29yKAotYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IKLWFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UkT25DbGlja0xpc3RlbmVyCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2ckQnVpbGRlciBzZXRDdXN0b21UaXRsZSgKLWFuZHJvaWQudmlldy5WaWV3KQotCi1wdWJsaWMgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2ckQnVpbGRlciBzZXRJY29uKAotaW50KQotCi1wdWJsaWMgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2ckQnVpbGRlciBzZXRJY29uKAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSkKLQotcHVibGljIGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nJEJ1aWxkZXIgc2V0SW52ZXJzZUJhY2tncm91bmRGb3JjZWQoCi1ib29sZWFuKQotCi1wdWJsaWMgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2ckQnVpbGRlciBzZXRJdGVtcygKLWludAotYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZSRPbkNsaWNrTGlzdGVuZXIpCi0KLXB1YmxpYyBhbmRyb2lkLmFwcC5BbGVydERpYWxvZyRCdWlsZGVyIHNldEl0ZW1zKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZVtdCi1hbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlJE9uQ2xpY2tMaXN0ZW5lcikKLQotcHVibGljIGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nJEJ1aWxkZXIgc2V0TWVzc2FnZSgKLWludCkKLQotcHVibGljIGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nJEJ1aWxkZXIgc2V0TWVzc2FnZSgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi0KLXB1YmxpYyBhbmRyb2lkLmFwcC5BbGVydERpYWxvZyRCdWlsZGVyIHNldE11bHRpQ2hvaWNlSXRlbXMoCi1pbnQKLWJvb2xlYW5bXQotYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZSRPbk11bHRpQ2hvaWNlQ2xpY2tMaXN0ZW5lcikKLQotcHVibGljIGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nJEJ1aWxkZXIgc2V0TXVsdGlDaG9pY2VJdGVtcygKLWFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlJE9uTXVsdGlDaG9pY2VDbGlja0xpc3RlbmVyKQotCi1wdWJsaWMgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2ckQnVpbGRlciBzZXRNdWx0aUNob2ljZUl0ZW1zKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZVtdCi1ib29sZWFuW10KLWFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UkT25NdWx0aUNob2ljZUNsaWNrTGlzdGVuZXIpCi0KLXB1YmxpYyBhbmRyb2lkLmFwcC5BbGVydERpYWxvZyRCdWlsZGVyIHNldE5lZ2F0aXZlQnV0dG9uKAotaW50Ci1hbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlJE9uQ2xpY2tMaXN0ZW5lcikKLQotcHVibGljIGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nJEJ1aWxkZXIgc2V0TmVnYXRpdmVCdXR0b24oCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1hbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlJE9uQ2xpY2tMaXN0ZW5lcikKLQotcHVibGljIGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nJEJ1aWxkZXIgc2V0TmV1dHJhbEJ1dHRvbigKLWludAotYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZSRPbkNsaWNrTGlzdGVuZXIpCi0KLXB1YmxpYyBhbmRyb2lkLmFwcC5BbGVydERpYWxvZyRCdWlsZGVyIHNldE5ldXRyYWxCdXR0b24oCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1hbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlJE9uQ2xpY2tMaXN0ZW5lcikKLQotcHVibGljIGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nJEJ1aWxkZXIgc2V0T25DYW5jZWxMaXN0ZW5lcigKLWFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UkT25DYW5jZWxMaXN0ZW5lcikKLQotcHVibGljIGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nJEJ1aWxkZXIgc2V0T25JdGVtU2VsZWN0ZWRMaXN0ZW5lcigKLWFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3JE9uSXRlbVNlbGVjdGVkTGlzdGVuZXIpCi0KLXB1YmxpYyBhbmRyb2lkLmFwcC5BbGVydERpYWxvZyRCdWlsZGVyIHNldE9uS2V5TGlzdGVuZXIoCi1hbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlJE9uS2V5TGlzdGVuZXIpCi0KLXB1YmxpYyBhbmRyb2lkLmFwcC5BbGVydERpYWxvZyRCdWlsZGVyIHNldFBvc2l0aXZlQnV0dG9uKAotaW50Ci1hbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlJE9uQ2xpY2tMaXN0ZW5lcikKLQotcHVibGljIGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nJEJ1aWxkZXIgc2V0UG9zaXRpdmVCdXR0b24oCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1hbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlJE9uQ2xpY2tMaXN0ZW5lcikKLQotcHVibGljIGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nJEJ1aWxkZXIgc2V0U2luZ2xlQ2hvaWNlSXRlbXMoCi1pbnQKLWludAotYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZSRPbkNsaWNrTGlzdGVuZXIpCi0KLXB1YmxpYyBhbmRyb2lkLmFwcC5BbGVydERpYWxvZyRCdWlsZGVyIHNldFNpbmdsZUNob2ljZUl0ZW1zKAotYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IKLWludAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZSRPbkNsaWNrTGlzdGVuZXIpCi0KLXB1YmxpYyBhbmRyb2lkLmFwcC5BbGVydERpYWxvZyRCdWlsZGVyIHNldFNpbmdsZUNob2ljZUl0ZW1zKAotYW5kcm9pZC53aWRnZXQuTGlzdEFkYXB0ZXIKLWludAotYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZSRPbkNsaWNrTGlzdGVuZXIpCi0KLXB1YmxpYyBhbmRyb2lkLmFwcC5BbGVydERpYWxvZyRCdWlsZGVyIHNldFNpbmdsZUNob2ljZUl0ZW1zKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZVtdCi1pbnQKLWFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UkT25DbGlja0xpc3RlbmVyKQotCi1wdWJsaWMgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2ckQnVpbGRlciBzZXRUaXRsZSgKLWludCkKLQotcHVibGljIGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nJEJ1aWxkZXIgc2V0VGl0bGUoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotCi1wdWJsaWMgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2ckQnVpbGRlciBzZXRWaWV3KAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXB1YmxpYyBhbmRyb2lkLmFwcC5BbGVydERpYWxvZyBzaG93KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvRGlhbG9nSW50ZXJmYWNlJE9uS2V5TGlzdGVuZXI7TGFuZHJvaWQvY29udGVudC9EaWFsb2dJbnRlcmZhY2UkT25NdWx0aUNob2ljZUNsaWNrTGlzdGVuZXI7TGFuZHJvaWQvY29udGVudC9EaWFsb2dJbnRlcmZhY2UkT25DbGlja0xpc3RlbmVyO0xhbmRyb2lkL2NvbnRlbnQvRGlhbG9nSW50ZXJmYWNlJE9uRGlzbWlzc0xpc3RlbmVyO0xhbmRyb2lkL2NvbnRlbnQvRGlhbG9nSW50ZXJmYWNlJE9uQ2FuY2VsTGlzdGVuZXI7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlVUVE9OMQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVVRUT04yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJVVFRPTjMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBjYW5jZWwoKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBkaXNtaXNzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9EaWFsb2ckRGlzbWlzc0NhbmNlbEhhbmRsZXI7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmFwcC5EaWFsb2cgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZSwgYW5kcm9pZC52aWV3LldpbmRvdyRDYWxsYmFjaywgYW5kcm9pZC52aWV3LktleUV2ZW50JENhbGxiYWNrLCBhbmRyb2lkLnZpZXcuVmlldyRPbkNyZWF0ZUNvbnRleHRNZW51TGlzdGVuZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENBTkNFTAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERJQUxPR19ISUVSQVJDSFlfVEFHCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRElBTE9HX1NIT1dJTkdfVEFHCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBESVNNSVNTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTE9HX1RBRwotCi1wcml2YXRlIGFuZHJvaWQub3MuTWVzc2FnZSBtQ2FuY2VsTWVzc2FnZQotCi1wcm90ZWN0ZWQgYm9vbGVhbiBtQ2FuY2VsYWJsZQotCi1wcml2YXRlIGJvb2xlYW4gbUNhbmNlbGVkT25Ub3VjaE91dHNpZGUKLQotZmluYWwgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgbUNvbnRleHQKLQotcHJpdmF0ZSBib29sZWFuIG1DcmVhdGVkCi0KLSBhbmRyb2lkLnZpZXcuVmlldyBtRGVjb3IKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuUnVubmFibGUgbURpc21pc3NBY3Rpb24KLQotcHJpdmF0ZSBhbmRyb2lkLm9zLkhhbmRsZXIgbURpc21pc3NDYW5jZWxIYW5kbGVyCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5NZXNzYWdlIG1EaXNtaXNzTWVzc2FnZQotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQub3MuSGFuZGxlciBtSGFuZGxlcgotCi1wcml2YXRlIGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UkT25LZXlMaXN0ZW5lciBtT25LZXlMaXN0ZW5lcgotCi1wcml2YXRlIGFuZHJvaWQuYXBwLkFjdGl2aXR5IG1Pd25lckFjdGl2aXR5Ci0KLXByaXZhdGUgYm9vbGVhbiBtU2hvd2luZwotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5UaHJlYWQgbVVpVGhyZWFkCi0KLSBhbmRyb2lkLnZpZXcuV2luZG93IG1XaW5kb3cKLQotZmluYWwgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIgbVdpbmRvd01hbmFnZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWludCkKLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWJvb2xlYW4KLWFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UkT25DYW5jZWxMaXN0ZW5lcikKLUBqYXZhLmxhbmcuRGVwcmVjYXRlZAotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWJvb2xlYW4KLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotc3RhdGljIHZvaWQgYWNjZXNzJDAwMCgKLWFuZHJvaWQuYXBwLkRpYWxvZykKLQotcHJpdmF0ZSB2b2lkIGRpc21pc3NEaWFsb2coKQotCi1wcml2YXRlIGJvb2xlYW4gaXNPdXRPZkJvdW5kcygKLWFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCkKLQotcHJpdmF0ZSB2b2lkIHNlbmREaXNtaXNzTWVzc2FnZSgpCi0KLXB1YmxpYyB2b2lkIGFkZENvbnRlbnRWaWV3KAotYW5kcm9pZC52aWV3LlZpZXcKLWFuZHJvaWQudmlldy5WaWV3R3JvdXAkTGF5b3V0UGFyYW1zKQotCi1wdWJsaWMgdm9pZCBjYW5jZWwoKQotCi1wdWJsaWMgdm9pZCBjbG9zZU9wdGlvbnNNZW51KCkKLQotcHVibGljIHZvaWQgZGlzbWlzcygpCi0KLXB1YmxpYyBib29sZWFuIGRpc3BhdGNoS2V5RXZlbnQoCi1hbmRyb2lkLnZpZXcuS2V5RXZlbnQpCi0KLSB2b2lkIGRpc3BhdGNoT25DcmVhdGUoCi1hbmRyb2lkLm9zLkJ1bmRsZSkKLQotcHVibGljIGJvb2xlYW4gZGlzcGF0Y2hUb3VjaEV2ZW50KAotYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50KQotCi1wdWJsaWMgYm9vbGVhbiBkaXNwYXRjaFRyYWNrYmFsbEV2ZW50KAotYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50KQotCi1wdWJsaWMgYW5kcm9pZC52aWV3LlZpZXcgZmluZFZpZXdCeUlkKAotaW50KQotCi1wdWJsaWMgZmluYWwgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgZ2V0Q29udGV4dCgpCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuVmlldyBnZXRDdXJyZW50Rm9jdXMoKQotCi1wdWJsaWMgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyIGdldExheW91dEluZmxhdGVyKCkKLQotcHVibGljIGZpbmFsIGFuZHJvaWQuYXBwLkFjdGl2aXR5IGdldE93bmVyQWN0aXZpdHkoKQotCi1wdWJsaWMgZmluYWwgaW50IGdldFZvbHVtZUNvbnRyb2xTdHJlYW0oKQotCi1wdWJsaWMgYW5kcm9pZC52aWV3LldpbmRvdyBnZXRXaW5kb3coKQotCi1wdWJsaWMgdm9pZCBoaWRlKCkKLQotcHVibGljIGJvb2xlYW4gaXNTaG93aW5nKCkKLQotcHVibGljIHZvaWQgb25Db250ZW50Q2hhbmdlZCgpCi0KLXB1YmxpYyBib29sZWFuIG9uQ29udGV4dEl0ZW1TZWxlY3RlZCgKLWFuZHJvaWQudmlldy5NZW51SXRlbSkKLQotcHVibGljIHZvaWQgb25Db250ZXh0TWVudUNsb3NlZCgKLWFuZHJvaWQudmlldy5NZW51KQotCi1wcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZSgKLWFuZHJvaWQub3MuQnVuZGxlKQotCi1wdWJsaWMgdm9pZCBvbkNyZWF0ZUNvbnRleHRNZW51KAotYW5kcm9pZC52aWV3LkNvbnRleHRNZW51Ci1hbmRyb2lkLnZpZXcuVmlldwotYW5kcm9pZC52aWV3LkNvbnRleHRNZW51JENvbnRleHRNZW51SW5mbykKLQotcHVibGljIGJvb2xlYW4gb25DcmVhdGVPcHRpb25zTWVudSgKLWFuZHJvaWQudmlldy5NZW51KQotCi1wdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZVBhbmVsTWVudSgKLWludAotYW5kcm9pZC52aWV3Lk1lbnUpCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuVmlldyBvbkNyZWF0ZVBhbmVsVmlldygKLWludCkKLQotcHVibGljIGJvb2xlYW4gb25LZXlEb3duKAotaW50Ci1hbmRyb2lkLnZpZXcuS2V5RXZlbnQpCi0KLXB1YmxpYyBib29sZWFuIG9uS2V5TXVsdGlwbGUoCi1pbnQKLWludAotYW5kcm9pZC52aWV3LktleUV2ZW50KQotCi1wdWJsaWMgYm9vbGVhbiBvbktleVVwKAotaW50Ci1hbmRyb2lkLnZpZXcuS2V5RXZlbnQpCi0KLXB1YmxpYyBib29sZWFuIG9uTWVudUl0ZW1TZWxlY3RlZCgKLWludAotYW5kcm9pZC52aWV3Lk1lbnVJdGVtKQotCi1wdWJsaWMgYm9vbGVhbiBvbk1lbnVPcGVuZWQoCi1pbnQKLWFuZHJvaWQudmlldy5NZW51KQotCi1wdWJsaWMgYm9vbGVhbiBvbk9wdGlvbnNJdGVtU2VsZWN0ZWQoCi1hbmRyb2lkLnZpZXcuTWVudUl0ZW0pCi0KLXB1YmxpYyB2b2lkIG9uT3B0aW9uc01lbnVDbG9zZWQoCi1hbmRyb2lkLnZpZXcuTWVudSkKLQotcHVibGljIHZvaWQgb25QYW5lbENsb3NlZCgKLWludAotYW5kcm9pZC52aWV3Lk1lbnUpCi0KLXB1YmxpYyBib29sZWFuIG9uUHJlcGFyZU9wdGlvbnNNZW51KAotYW5kcm9pZC52aWV3Lk1lbnUpCi0KLXB1YmxpYyBib29sZWFuIG9uUHJlcGFyZVBhbmVsKAotaW50Ci1hbmRyb2lkLnZpZXcuVmlldwotYW5kcm9pZC52aWV3Lk1lbnUpCi0KLXB1YmxpYyB2b2lkIG9uUmVzdG9yZUluc3RhbmNlU3RhdGUoCi1hbmRyb2lkLm9zLkJ1bmRsZSkKLQotcHVibGljIGFuZHJvaWQub3MuQnVuZGxlIG9uU2F2ZUluc3RhbmNlU3RhdGUoKQotCi1wdWJsaWMgYm9vbGVhbiBvblNlYXJjaFJlcXVlc3RlZCgpCi0KLXByb3RlY3RlZCB2b2lkIG9uU3RhcnQoKQotCi1wcm90ZWN0ZWQgdm9pZCBvblN0b3AoKQotCi1wdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnQoCi1hbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQpCi0KLXB1YmxpYyBib29sZWFuIG9uVHJhY2tiYWxsRXZlbnQoCi1hbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQpCi0KLXB1YmxpYyB2b2lkIG9uV2luZG93QXR0cmlidXRlc0NoYW5nZWQoCi1hbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlciRMYXlvdXRQYXJhbXMpCi0KLXB1YmxpYyB2b2lkIG9uV2luZG93Rm9jdXNDaGFuZ2VkKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgb3BlbkNvbnRleHRNZW51KAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXB1YmxpYyB2b2lkIG9wZW5PcHRpb25zTWVudSgpCi0KLXB1YmxpYyB2b2lkIHJlZ2lzdGVyRm9yQ29udGV4dE1lbnUoCi1hbmRyb2lkLnZpZXcuVmlldykKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gcmVxdWVzdFdpbmRvd0ZlYXR1cmUoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldENhbmNlbE1lc3NhZ2UoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIHNldENhbmNlbGFibGUoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRDYW5jZWxlZE9uVG91Y2hPdXRzaWRlKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0Q29udGVudFZpZXcoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldENvbnRlbnRWaWV3KAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXB1YmxpYyB2b2lkIHNldENvbnRlbnRWaWV3KAotYW5kcm9pZC52aWV3LlZpZXcKLWFuZHJvaWQudmlldy5WaWV3R3JvdXAkTGF5b3V0UGFyYW1zKQotCi1wdWJsaWMgdm9pZCBzZXREaXNtaXNzTWVzc2FnZSgKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIGZpbmFsIHZvaWQgc2V0RmVhdHVyZURyYXdhYmxlKAotaW50Ci1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlKQotCi1wdWJsaWMgZmluYWwgdm9pZCBzZXRGZWF0dXJlRHJhd2FibGVBbHBoYSgKLWludAotaW50KQotCi1wdWJsaWMgZmluYWwgdm9pZCBzZXRGZWF0dXJlRHJhd2FibGVSZXNvdXJjZSgKLWludAotaW50KQotCi1wdWJsaWMgZmluYWwgdm9pZCBzZXRGZWF0dXJlRHJhd2FibGVVcmkoCi1pbnQKLWFuZHJvaWQubmV0LlVyaSkKLQotcHVibGljIHZvaWQgc2V0T25DYW5jZWxMaXN0ZW5lcigKLWFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UkT25DYW5jZWxMaXN0ZW5lcikKLQotcHVibGljIHZvaWQgc2V0T25EaXNtaXNzTGlzdGVuZXIoCi1hbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlJE9uRGlzbWlzc0xpc3RlbmVyKQotCi1wdWJsaWMgdm9pZCBzZXRPbktleUxpc3RlbmVyKAotYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZSRPbktleUxpc3RlbmVyKQotCi1wdWJsaWMgZmluYWwgdm9pZCBzZXRPd25lckFjdGl2aXR5KAotYW5kcm9pZC5hcHAuQWN0aXZpdHkpCi0KLXB1YmxpYyB2b2lkIHNldFRpdGxlKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRUaXRsZSgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHNldFZvbHVtZUNvbnRyb2xTdHJlYW0oCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNob3coKQotCi1wdWJsaWMgdm9pZCB0YWtlS2V5RXZlbnRzKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgdW5yZWdpc3RlckZvckNvbnRleHRNZW51KAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9hcHAvQWxlcnREaWFsb2ckQnVpbGRlcjsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nIGV4dGVuZHMgYW5kcm9pZC5hcHAuRGlhbG9nIGltcGxlbWVudHMgYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5BbGVydENvbnRyb2xsZXIgbUFsZXJ0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1pbnQpCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1ib29sZWFuCi1hbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlJE9uQ2FuY2VsTGlzdGVuZXIpCi0KLXN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuQWxlcnRDb250cm9sbGVyIGFjY2VzcyQwMDAoCi1hbmRyb2lkLmFwcC5BbGVydERpYWxvZykKLQotcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoCi1hbmRyb2lkLm9zLkJ1bmRsZSkKLQotcHVibGljIGJvb2xlYW4gb25LZXlEb3duKAotaW50Ci1hbmRyb2lkLnZpZXcuS2V5RXZlbnQpCi0KLXB1YmxpYyBib29sZWFuIG9uS2V5VXAoCi1pbnQKLWFuZHJvaWQudmlldy5LZXlFdmVudCkKLQotcHVibGljIHZvaWQgc2V0QnV0dG9uKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZSRPbkNsaWNrTGlzdGVuZXIpCi0KLXB1YmxpYyB2b2lkIHNldEJ1dHRvbigKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgc2V0QnV0dG9uMigKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UkT25DbGlja0xpc3RlbmVyKQotCi1wdWJsaWMgdm9pZCBzZXRCdXR0b24yKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBzZXRCdXR0b24zKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZSRPbkNsaWNrTGlzdGVuZXIpCi0KLXB1YmxpYyB2b2lkIHNldEJ1dHRvbjMoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIHNldEN1c3RvbVRpdGxlKAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXB1YmxpYyB2b2lkIHNldEljb24oCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldEljb24oCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlKQotCi1wdWJsaWMgdm9pZCBzZXRJbnZlcnNlQmFja2dyb3VuZEZvcmNlZCgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotCi1wdWJsaWMgdm9pZCBzZXRUaXRsZSgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi0KLXB1YmxpYyB2b2lkIHNldFZpZXcoCi1hbmRyb2lkLnZpZXcuVmlldykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmFwcC5BbGlhc0FjdGl2aXR5IGV4dGVuZHMgYW5kcm9pZC5hcHAuQWN0aXZpdHkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUxJQVNfTUVUQV9EQVRBCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBhbmRyb2lkLmNvbnRlbnQuSW50ZW50IHBhcnNlQWxpYXMoCi1vcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyKQotCi1wcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZSgKLWFuZHJvaWQub3MuQnVuZGxlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuYXBwLkFwcGxpY2F0aW9uIGV4dGVuZHMgYW5kcm9pZC5jb250ZW50LkNvbnRleHRXcmFwcGVyIGltcGxlbWVudHMgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudENhbGxiYWNrcwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLWZpbmFsIHZvaWQgYXR0YWNoKAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXB1YmxpYyB2b2lkIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQoCi1hbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb24pCi0KLXB1YmxpYyB2b2lkIG9uQ3JlYXRlKCkKLQotcHVibGljIHZvaWQgb25Mb3dNZW1vcnkoKQotCi1wdWJsaWMgdm9pZCBvblRlcm1pbmF0ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0FwcGxpY2F0aW9uQ29udGV4dDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID00MTA0IG5hbWUgPW51bGwgKQotIGNsYXNzIGFuZHJvaWQuYXBwLkFwcGxpY2F0aW9uQ29udGV4dCQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L0NvbnRlbnRSZXNvbHZlciRQYXJjZWxGaWxlRGVzY3JpcHRvcklubmVyO0xhbmRyb2lkL2NvbnRlbnQvQ29udGVudFJlc29sdmVyJEN1cnNvcldyYXBwZXJJbm5lcjsgKQotcHVibGljIGFic3RyYWN0IGNsYXNzIGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDVVJTT1JfRElSX0JBU0VfVFlQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ1VSU09SX0lURU1fQkFTRV9UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTQ0hFTUVfQU5EUk9JRF9SRVNPVVJDRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0NIRU1FX0NPTlRFTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNDSEVNRV9GSUxFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTWU5DX0VYVFJBU19BQ0NPVU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTWU5DX0VYVFJBU19ESVNDQVJEX0xPQ0FMX0RFTEVUSU9OUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU1lOQ19FWFRSQVNfRVhQRURJVEVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTWU5DX0VYVFJBU19GT1JDRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU1lOQ19FWFRSQVNfT1ZFUlJJREVfVE9PX01BTllfREVMRVRJT05TCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTWU5DX0VYVFJBU19VUExPQUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBtQ29udGV4dAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVTeW5jRXh0cmFzQnVuZGxlKAotYW5kcm9pZC5vcy5CdW5kbGUpCi0KLXByb3RlY3RlZCBhYnN0cmFjdCBhbmRyb2lkLmNvbnRlbnQuSUNvbnRlbnRQcm92aWRlciBhY3F1aXJlUHJvdmlkZXIoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGZpbmFsIGFuZHJvaWQuY29udGVudC5JQ29udGVudFByb3ZpZGVyIGFjcXVpcmVQcm92aWRlcigKLWFuZHJvaWQubmV0LlVyaSkKLQotcHVibGljIGZpbmFsIGFuZHJvaWQuY29udGVudC5JQ29udGVudFByb3ZpZGVyIGFjcXVpcmVQcm92aWRlcigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBmaW5hbCBpbnQgYnVsa0luc2VydCgKLWFuZHJvaWQubmV0LlVyaQotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXNbXSkKLQotcHVibGljIHZvaWQgY2FuY2VsU3luYygKLWFuZHJvaWQubmV0LlVyaSkKLQotcHVibGljIGZpbmFsIGludCBkZWxldGUoCi1hbmRyb2lkLm5ldC5VcmkKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotcHVibGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgZ2V0VHlwZSgKLWFuZHJvaWQubmV0LlVyaSkKLQotcHVibGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBpbnNlcnQoCi1hbmRyb2lkLm5ldC5VcmkKLWFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzKQotCi1wdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2UoCi1hbmRyb2lkLm5ldC5VcmkKLWFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyKQotCi1wdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2UoCi1hbmRyb2lkLm5ldC5VcmkKLWFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0ZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3Igb3BlbkZpbGVEZXNjcmlwdG9yKAotYW5kcm9pZC5uZXQuVXJpCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0ZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIGphdmEuaW8uSW5wdXRTdHJlYW0gb3BlbklucHV0U3RyZWFtKAotYW5kcm9pZC5uZXQuVXJpKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0ZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIGphdmEuaW8uT3V0cHV0U3RyZWFtIG9wZW5PdXRwdXRTdHJlYW0oCi1hbmRyb2lkLm5ldC5VcmkpCi0KLXB1YmxpYyBmaW5hbCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciBxdWVyeSgKLWFuZHJvaWQubmV0LlVyaQotamF2YS5sYW5nLlN0cmluZ1tdCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nW10KLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHJlZ2lzdGVyQ29udGVudE9ic2VydmVyKAotYW5kcm9pZC5uZXQuVXJpCi1ib29sZWFuCi1hbmRyb2lkLmRhdGFiYXNlLkNvbnRlbnRPYnNlcnZlcikKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gcmVsZWFzZVByb3ZpZGVyKAotYW5kcm9pZC5jb250ZW50LklDb250ZW50UHJvdmlkZXIpCi0KLXB1YmxpYyB2b2lkIHN0YXJ0U3luYygKLWFuZHJvaWQubmV0LlVyaQotYW5kcm9pZC5vcy5CdW5kbGUpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHVucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoCi1hbmRyb2lkLmRhdGFiYXNlLkNvbnRlbnRPYnNlcnZlcikKLQotcHVibGljIGZpbmFsIGludCB1cGRhdGUoCi1hbmRyb2lkLm5ldC5VcmkKLWFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNiBuYW1lID1BcHBsaWNhdGlvbkNvbnRlbnRSZXNvbHZlciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9hcHAvQXBwbGljYXRpb25Db250ZXh0OyApCi1maW5hbCBjbGFzcyBhbmRyb2lkLmFwcC5BcHBsaWNhdGlvbkNvbnRleHQkQXBwbGljYXRpb25Db250ZW50UmVzb2x2ZXIgZXh0ZW5kcyBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQgbU1haW5UaHJlYWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQpCi0KLXByb3RlY3RlZCBhbmRyb2lkLmNvbnRlbnQuSUNvbnRlbnRQcm92aWRlciBhY3F1aXJlUHJvdmlkZXIoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJvb2xlYW4gcmVsZWFzZVByb3ZpZGVyKAotYW5kcm9pZC5jb250ZW50LklDb250ZW50UHJvdmlkZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNiBuYW1lID1QYWNrYWdlUmVtb3ZlZFJlY2VpdmVyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9BcHBsaWNhdGlvbkNvbnRleHQkQXBwbGljYXRpb25QYWNrYWdlTWFuYWdlcjsgKQotZmluYWwgY2xhc3MgYW5kcm9pZC5hcHAuQXBwbGljYXRpb25Db250ZXh0JEFwcGxpY2F0aW9uUGFja2FnZU1hbmFnZXIkUGFja2FnZVJlbW92ZWRSZWNlaXZlciBleHRlbmRzIGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmFwcC5BcHBsaWNhdGlvbkNvbnRleHQkMSkKLQotcHVibGljIHZvaWQgb25SZWNlaXZlKAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQuY29udGVudC5JbnRlbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNiBuYW1lID1SZXNvdXJjZU5hbWUgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0FwcGxpY2F0aW9uQ29udGV4dCRBcHBsaWNhdGlvblBhY2thZ2VNYW5hZ2VyOyApCi1maW5hbCBjbGFzcyBhbmRyb2lkLmFwcC5BcHBsaWNhdGlvbkNvbnRleHQkQXBwbGljYXRpb25QYWNrYWdlTWFuYWdlciRSZXNvdXJjZU5hbWUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGludCBpY29uSWQKLQotZmluYWwgamF2YS5sYW5nLlN0cmluZyBwYWNrYWdlTmFtZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm8KLWludCkKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LnBtLkNvbXBvbmVudEluZm8KLWludCkKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LnBtLlJlc29sdmVJbmZvCi1pbnQpCi0KLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZU1hbmFnZXIkTmFtZU5vdEZvdW5kRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01QT05FTlRfRU5BQkxFRF9TVEFURV9ERUZBVUxUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTVBPTkVOVF9FTkFCTEVEX1NUQVRFX0RJU0FCTEVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTVBPTkVOVF9FTkFCTEVEX1NUQVRFX0VOQUJMRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRE9OVF9ERUxFVEVfREFUQQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBET05UX0tJTExfQVBQCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUldBUkRfTE9DS19QQUNLQUdFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdFVF9BQ1RJVklUSUVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdFVF9ESVNBQkxFRF9DT01QT05FTlRTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdFVF9HSURTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdFVF9JTlNUUlVNRU5UQVRJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0VUX0lOVEVOVF9GSUxURVJTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdFVF9NRVRBX0RBVEEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0VUX1BFUk1JU1NJT05TCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdFVF9QUk9WSURFUlMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0VUX1JFQ0VJVkVSUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHRVRfUkVTT0xWRURfRklMVEVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdFVF9TRVJWSUNFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHRVRfU0hBUkVEX0xJQlJBUllfRklMRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0VUX1NJR05BVFVSRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0VUX1VSSV9QRVJNSVNTSU9OX1BBVFRFUk5TCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOU1RBTExfRkFJTEVEX0FMUkVBRFlfRVhJU1RTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOU1RBTExfRkFJTEVEX0RFWE9QVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlNUQUxMX0ZBSUxFRF9EVVBMSUNBVEVfUEFDS0FHRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlNUQUxMX0ZBSUxFRF9JTlNVRkZJQ0lFTlRfU1RPUkFHRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlNUQUxMX0ZBSUxFRF9JTlZBTElEX0FQSwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlNUQUxMX0ZBSUxFRF9JTlZBTElEX1VSSQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlNUQUxMX0ZBSUxFRF9NSVNTSU5HX1NIQVJFRF9MSUJSQVJZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOU1RBTExfRkFJTEVEX05PX1NIQVJFRF9VU0VSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOU1RBTExfRkFJTEVEX09MREVSX1NESwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlNUQUxMX0ZBSUxFRF9SRVBMQUNFX0NPVUxETlRfREVMRVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOU1RBTExfRkFJTEVEX1NIQVJFRF9VU0VSX0lOQ09NUEFUSUJMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlNUQUxMX0ZBSUxFRF9VUERBVEVfSU5DT01QQVRJQkxFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOU1RBTExfUEFSU0VfRkFJTEVEX0JBRF9NQU5JRkVTVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlNUQUxMX1BBUlNFX0ZBSUxFRF9CQURfUEFDS0FHRV9OQU1FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOU1RBTExfUEFSU0VfRkFJTEVEX0JBRF9TSEFSRURfVVNFUl9JRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlNUQUxMX1BBUlNFX0ZBSUxFRF9DRVJUSUZJQ0FURV9FTkNPRElORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlNUQUxMX1BBUlNFX0ZBSUxFRF9JTkNPTlNJU1RFTlRfQ0VSVElGSUNBVEVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOU1RBTExfUEFSU0VfRkFJTEVEX01BTklGRVNUX0VNUFRZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOU1RBTExfUEFSU0VfRkFJTEVEX01BTklGRVNUX01BTEZPUk1FRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlNUQUxMX1BBUlNFX0ZBSUxFRF9OT1RfQVBLCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOU1RBTExfUEFSU0VfRkFJTEVEX05PX0NFUlRJRklDQVRFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlNUQUxMX1BBUlNFX0ZBSUxFRF9VTkVYUEVDVEVEX0VYQ0VQVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlNUQUxMX1NVQ0NFRURFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVRDSF9ERUZBVUxUX09OTFkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEVSTUlTU0lPTl9ERU5JRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEVSTUlTU0lPTl9HUkFOVEVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBLR19JTlNUQUxMX0NPTVBMRVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBLR19JTlNUQUxMX0lOQ09NUExFVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVQTEFDRV9FWElTVElOR19QQUNLQUdFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJR05BVFVSRV9GSVJTVF9OT1RfU0lHTkVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJR05BVFVSRV9NQVRDSAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSUdOQVRVUkVfTkVJVEhFUl9TSUdORUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0lHTkFUVVJFX05PX01BVENICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJR05BVFVSRV9TRUNPTkRfTk9UX1NJR05FRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSUdOQVRVUkVfVU5LTk9XTl9QQUNLQUdFCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgYWRkUGFja2FnZVRvUHJlZmVycmVkKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gYWRkUGVybWlzc2lvbigKLWFuZHJvaWQuY29udGVudC5wbS5QZXJtaXNzaW9uSW5mbykKLQotcHVibGljIGFic3RyYWN0IHZvaWQgYWRkUHJlZmVycmVkQWN0aXZpdHkoCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyCi1pbnQKLWFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lW10KLWFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lKQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGNoZWNrUGVybWlzc2lvbigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgY2hlY2tTaWduYXR1cmVzKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IHZvaWQgY2xlYXJBcHBsaWNhdGlvblVzZXJEYXRhKAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5jb250ZW50LnBtLklQYWNrYWdlRGF0YU9ic2VydmVyKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBjbGVhclBhY2thZ2VQcmVmZXJyZWRBY3Rpdml0aWVzKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZGVsZXRlQXBwbGljYXRpb25DYWNoZUZpbGVzKAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5jb250ZW50LnBtLklQYWNrYWdlRGF0YU9ic2VydmVyKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBkZWxldGVQYWNrYWdlKAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5jb250ZW50LnBtLklQYWNrYWdlRGVsZXRlT2JzZXJ2ZXIKLWludCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZnJlZUFwcGxpY2F0aW9uQ2FjaGUoCi1sb25nCi1hbmRyb2lkLmNvbnRlbnQucG0uSVBhY2thZ2VEYXRhT2JzZXJ2ZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlTWFuYWdlciROYW1lTm90Rm91bmRFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIGdldEFjdGl2aXR5SWNvbigKLWFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZU1hbmFnZXIkTmFtZU5vdEZvdW5kRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSBnZXRBY3Rpdml0eUljb24oCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZU1hbmFnZXIkTmFtZU5vdEZvdW5kRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC5jb250ZW50LnBtLkFjdGl2aXR5SW5mbyBnZXRBY3Rpdml0eUluZm8oCi1hbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZQotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJKUxqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9jb250ZW50L3BtL1Blcm1pc3Npb25Hcm91cEluZm87PjsgKQotcHVibGljIGFic3RyYWN0IGphdmEudXRpbC5MaXN0IGdldEFsbFBlcm1pc3Npb25Hcm91cHMoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0QXBwbGljYXRpb25FbmFibGVkU2V0dGluZygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIGdldEFwcGxpY2F0aW9uSWNvbigKLWFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm8pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlTWFuYWdlciROYW1lTm90Rm91bmRFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIGdldEFwcGxpY2F0aW9uSWNvbigKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlTWFuYWdlciROYW1lTm90Rm91bmRFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLmNvbnRlbnQucG0uQXBwbGljYXRpb25JbmZvIGdldEFwcGxpY2F0aW9uSW5mbygKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5DaGFyU2VxdWVuY2UgZ2V0QXBwbGljYXRpb25MYWJlbCgKLWFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm8pCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0Q29tcG9uZW50RW5hYmxlZFNldHRpbmcoCi1hbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSkKLQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgZ2V0RGVmYXVsdEFjdGl2aXR5SWNvbigpCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIGdldERyYXdhYmxlKAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1hbmRyb2lkLmNvbnRlbnQucG0uQXBwbGljYXRpb25JbmZvKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJKUxqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9jb250ZW50L3BtL0FwcGxpY2F0aW9uSW5mbzs+OyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLkxpc3QgZ2V0SW5zdGFsbGVkQXBwbGljYXRpb25zKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJKUxqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VJbmZvOz47ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnV0aWwuTGlzdCBnZXRJbnN0YWxsZWRQYWNrYWdlcygKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VNYW5hZ2VyJE5hbWVOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQuY29udGVudC5wbS5JbnN0cnVtZW50YXRpb25JbmZvIGdldEluc3RydW1lbnRhdGlvbkluZm8oCi1hbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZQotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXROYW1lRm9yVWlkKAotaW50KQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VJbmZvIGdldFBhY2thZ2VBcmNoaXZlSW5mbygKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VNYW5hZ2VyJE5hbWVOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludFtdIGdldFBhY2thZ2VHaWRzKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VNYW5hZ2VyJE5hbWVOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlSW5mbyBnZXRQYWNrYWdlSW5mbygKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2V0UGFja2FnZVNpemVJbmZvKAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5jb250ZW50LnBtLklQYWNrYWdlU3RhdHNPYnNlcnZlcikKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmdbXSBnZXRQYWNrYWdlc0ZvclVpZCgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VNYW5hZ2VyJE5hbWVOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQuY29udGVudC5wbS5QZXJtaXNzaW9uR3JvdXBJbmZvIGdldFBlcm1pc3Npb25Hcm91cEluZm8oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlTWFuYWdlciROYW1lTm90Rm91bmRFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLmNvbnRlbnQucG0uUGVybWlzc2lvbkluZm8gZ2V0UGVybWlzc2lvbkluZm8oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9jb250ZW50L0ludGVudEZpbHRlcjs+O0xqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9jb250ZW50L0NvbXBvbmVudE5hbWU7PjtMamF2YS9sYW5nL1N0cmluZzspSSApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldFByZWZlcnJlZEFjdGl2aXRpZXMoCi1qYXZhLnV0aWwuTGlzdAotamF2YS51dGlsLkxpc3QKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KEkpTGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZUluZm87PjsgKQotcHVibGljIGFic3RyYWN0IGphdmEudXRpbC5MaXN0IGdldFByZWZlcnJlZFBhY2thZ2VzKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZU1hbmFnZXIkTmFtZU5vdEZvdW5kRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC5jb250ZW50LnBtLkFjdGl2aXR5SW5mbyBnZXRSZWNlaXZlckluZm8oCi1hbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZQotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZU1hbmFnZXIkTmFtZU5vdEZvdW5kRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMgZ2V0UmVzb3VyY2VzRm9yQWN0aXZpdHkoCi1hbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VNYW5hZ2VyJE5hbWVOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzIGdldFJlc291cmNlc0ZvckFwcGxpY2F0aW9uKAotYW5kcm9pZC5jb250ZW50LnBtLkFwcGxpY2F0aW9uSW5mbykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VNYW5hZ2VyJE5hbWVOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzIGdldFJlc291cmNlc0ZvckFwcGxpY2F0aW9uKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VNYW5hZ2VyJE5hbWVOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQuY29udGVudC5wbS5TZXJ2aWNlSW5mbyBnZXRTZXJ2aWNlSW5mbygKLWFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIGdldFRleHQoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm8pCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLmNvbnRlbnQucmVzLlhtbFJlc291cmNlUGFyc2VyIGdldFhtbCgKLWphdmEubGFuZy5TdHJpbmcKLWludAotYW5kcm9pZC5jb250ZW50LnBtLkFwcGxpY2F0aW9uSW5mbykKLQotcHVibGljIHZvaWQgaW5zdGFsbFBhY2thZ2UoCi1hbmRyb2lkLm5ldC5VcmkpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGluc3RhbGxQYWNrYWdlKAotYW5kcm9pZC5uZXQuVXJpCi1hbmRyb2lkLmNvbnRlbnQucG0uSVBhY2thZ2VJbnN0YWxsT2JzZXJ2ZXIKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGFuZHJvaWQvY29udGVudC9JbnRlbnQ7SSlMamF2YS91dGlsL0xpc3Q8TGFuZHJvaWQvY29udGVudC9wbS9SZXNvbHZlSW5mbzs+OyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLkxpc3QgcXVlcnlCcm9hZGNhc3RSZWNlaXZlcnMoCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvU3RyaW5nO0lJKUxqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9jb250ZW50L3BtL1Byb3ZpZGVySW5mbzs+OyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLkxpc3QgcXVlcnlDb250ZW50UHJvdmlkZXJzKAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvU3RyaW5nO0kpTGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL2NvbnRlbnQvcG0vSW5zdHJ1bWVudGF0aW9uSW5mbzs+OyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLkxpc3QgcXVlcnlJbnN0cnVtZW50YXRpb24oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExhbmRyb2lkL2NvbnRlbnQvSW50ZW50O0kpTGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL2NvbnRlbnQvcG0vUmVzb2x2ZUluZm87PjsgKQotcHVibGljIGFic3RyYWN0IGphdmEudXRpbC5MaXN0IHF1ZXJ5SW50ZW50QWN0aXZpdGllcygKLWFuZHJvaWQuY29udGVudC5JbnRlbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGFuZHJvaWQvY29udGVudC9Db21wb25lbnROYW1lO1tMYW5kcm9pZC9jb250ZW50L0ludGVudDtMYW5kcm9pZC9jb250ZW50L0ludGVudDtJKUxqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9jb250ZW50L3BtL1Jlc29sdmVJbmZvOz47ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnV0aWwuTGlzdCBxdWVyeUludGVudEFjdGl2aXR5T3B0aW9ucygKLWFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50W10KLWFuZHJvaWQuY29udGVudC5JbnRlbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGFuZHJvaWQvY29udGVudC9JbnRlbnQ7SSlMamF2YS91dGlsL0xpc3Q8TGFuZHJvaWQvY29udGVudC9wbS9SZXNvbHZlSW5mbzs+OyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLkxpc3QgcXVlcnlJbnRlbnRTZXJ2aWNlcygKLWFuZHJvaWQuY29udGVudC5JbnRlbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9TdHJpbmc7SSlMamF2YS91dGlsL0xpc3Q8TGFuZHJvaWQvY29udGVudC9wbS9QZXJtaXNzaW9uSW5mbzs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlTWFuYWdlciROYW1lTm90Rm91bmRFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnV0aWwuTGlzdCBxdWVyeVBlcm1pc3Npb25zQnlHcm91cCgKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgcmVtb3ZlUGFja2FnZUZyb21QcmVmZXJyZWQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCByZW1vdmVQZXJtaXNzaW9uKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQuY29udGVudC5wbS5SZXNvbHZlSW5mbyByZXNvbHZlQWN0aXZpdHkoCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50Ci1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLmNvbnRlbnQucG0uUHJvdmlkZXJJbmZvIHJlc29sdmVDb250ZW50UHJvdmlkZXIoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLmNvbnRlbnQucG0uUmVzb2x2ZUluZm8gcmVzb2x2ZVNlcnZpY2UoCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50Ci1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEFwcGxpY2F0aW9uRW5hYmxlZFNldHRpbmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0Q29tcG9uZW50RW5hYmxlZFNldHRpbmcoCi1hbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZQotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNCBuYW1lID1BcHBsaWNhdGlvblBhY2thZ2VNYW5hZ2VyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9BcHBsaWNhdGlvbkNvbnRleHQ7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0FwcGxpY2F0aW9uQ29udGV4dCRBcHBsaWNhdGlvblBhY2thZ2VNYW5hZ2VyJFJlc291cmNlTmFtZTtMYW5kcm9pZC9hcHAvQXBwbGljYXRpb25Db250ZXh0JEFwcGxpY2F0aW9uUGFja2FnZU1hbmFnZXIkUGFja2FnZVJlbW92ZWRSZWNlaXZlcjsgKQotZmluYWwgY2xhc3MgYW5kcm9pZC5hcHAuQXBwbGljYXRpb25Db250ZXh0JEFwcGxpY2F0aW9uUGFja2FnZU1hbmFnZXIgZXh0ZW5kcyBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0hhc2hNYXA8TGFuZHJvaWQvYXBwL0FwcGxpY2F0aW9uQ29udGV4dCRBcHBsaWNhdGlvblBhY2thZ2VNYW5hZ2VyJFJlc291cmNlTmFtZTtMamF2YS9sYW5nL3JlZi9XZWFrUmVmZXJlbmNlPExhbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0RyYXdhYmxlOz47PjsgKQotcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLkhhc2hNYXAgc0ljb25DYWNoZQotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXIgc1BhY2thZ2VSZW1vdmVkUmVjZWl2ZXIKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLk9iamVjdCBzUGFja2FnZVJlbW92ZWRTeW5jCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNoTWFwPExhbmRyb2lkL2FwcC9BcHBsaWNhdGlvbkNvbnRleHQkQXBwbGljYXRpb25QYWNrYWdlTWFuYWdlciRSZXNvdXJjZU5hbWU7TGphdmEvbGFuZy9yZWYvV2Vha1JlZmVyZW5jZTxMamF2YS9sYW5nL0NoYXJTZXF1ZW5jZTs+Oz47ICkKLXByaXZhdGUgc3RhdGljIGphdmEudXRpbC5IYXNoTWFwIHNTdHJpbmdDYWNoZQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuT2JqZWN0IHNTeW5jCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5hcHAuQXBwbGljYXRpb25Db250ZXh0IG1Db250ZXh0Ci0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5jb250ZW50LnBtLklQYWNrYWdlTWFuYWdlciBtUE0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQuYXBwLkFwcGxpY2F0aW9uQ29udGV4dAotYW5kcm9pZC5jb250ZW50LnBtLklQYWNrYWdlTWFuYWdlcikKLQotc3RhdGljIGphdmEubGFuZy5PYmplY3QgYWNjZXNzJDIwMCgpCi0KLXN0YXRpYyBqYXZhLnV0aWwuSGFzaE1hcCBhY2Nlc3MkMzAwKCkKLQotc3RhdGljIGphdmEudXRpbC5IYXNoTWFwIGFjY2VzcyQ0MDAoKQotCi1zdGF0aWMgdm9pZCBjb25maWd1cmF0aW9uQ2hhbmdlZCgpCi0KLXByaXZhdGUgdm9pZCBlc3RhYmxpc2hQYWNrYWdlUmVtb3ZlZFJlY2VpdmVyKCkKLQotcHJpdmF0ZSBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIGdldENhY2hlZEljb24oCi1hbmRyb2lkLmFwcC5BcHBsaWNhdGlvbkNvbnRleHQkQXBwbGljYXRpb25QYWNrYWdlTWFuYWdlciRSZXNvdXJjZU5hbWUpCi0KLXByaXZhdGUgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBnZXRDYWNoZWRTdHJpbmcoCi1hbmRyb2lkLmFwcC5BcHBsaWNhdGlvbkNvbnRleHQkQXBwbGljYXRpb25QYWNrYWdlTWFuYWdlciRSZXNvdXJjZU5hbWUpCi0KLXByaXZhdGUgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBnZXRMYWJlbCgKLWFuZHJvaWQuYXBwLkFwcGxpY2F0aW9uQ29udGV4dCRBcHBsaWNhdGlvblBhY2thZ2VNYW5hZ2VyJFJlc291cmNlTmFtZQotYW5kcm9pZC5jb250ZW50LnBtLkFwcGxpY2F0aW9uSW5mbwotaW50KQotCi1wcml2YXRlIHZvaWQgcHV0Q2FjaGVkSWNvbigKLWFuZHJvaWQuYXBwLkFwcGxpY2F0aW9uQ29udGV4dCRBcHBsaWNhdGlvblBhY2thZ2VNYW5hZ2VyJFJlc291cmNlTmFtZQotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSkKLQotcHJpdmF0ZSB2b2lkIHB1dENhY2hlZFN0cmluZygKLWFuZHJvaWQuYXBwLkFwcGxpY2F0aW9uQ29udGV4dCRBcHBsaWNhdGlvblBhY2thZ2VNYW5hZ2VyJFJlc291cmNlTmFtZQotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotcHVibGljIHZvaWQgYWRkUGFja2FnZVRvUHJlZmVycmVkKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJvb2xlYW4gYWRkUGVybWlzc2lvbigKLWFuZHJvaWQuY29udGVudC5wbS5QZXJtaXNzaW9uSW5mbykKLQotcHVibGljIHZvaWQgYWRkUHJlZmVycmVkQWN0aXZpdHkoCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyCi1pbnQKLWFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lW10KLWFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lKQotCi1wdWJsaWMgaW50IGNoZWNrUGVybWlzc2lvbigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBpbnQgY2hlY2tTaWduYXR1cmVzKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgY2xlYXJBcHBsaWNhdGlvblVzZXJEYXRhKAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5jb250ZW50LnBtLklQYWNrYWdlRGF0YU9ic2VydmVyKQotCi1wdWJsaWMgdm9pZCBjbGVhclBhY2thZ2VQcmVmZXJyZWRBY3Rpdml0aWVzKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgZGVsZXRlQXBwbGljYXRpb25DYWNoZUZpbGVzKAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5jb250ZW50LnBtLklQYWNrYWdlRGF0YU9ic2VydmVyKQotCi1wdWJsaWMgdm9pZCBkZWxldGVQYWNrYWdlKAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5jb250ZW50LnBtLklQYWNrYWdlRGVsZXRlT2JzZXJ2ZXIKLWludCkKLQotcHVibGljIHZvaWQgZnJlZUFwcGxpY2F0aW9uQ2FjaGUoCi1sb25nCi1hbmRyb2lkLmNvbnRlbnQucG0uSVBhY2thZ2VEYXRhT2JzZXJ2ZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlTWFuYWdlciROYW1lTm90Rm91bmRFeGNlcHRpb247ICkKLXB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIGdldEFjdGl2aXR5SWNvbigKLWFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZU1hbmFnZXIkTmFtZU5vdEZvdW5kRXhjZXB0aW9uOyApCi1wdWJsaWMgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSBnZXRBY3Rpdml0eUljb24oCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZU1hbmFnZXIkTmFtZU5vdEZvdW5kRXhjZXB0aW9uOyApCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LnBtLkFjdGl2aXR5SW5mbyBnZXRBY3Rpdml0eUluZm8oCi1hbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZQotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJKUxqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9jb250ZW50L3BtL1Blcm1pc3Npb25Hcm91cEluZm87PjsgKQotcHVibGljIGphdmEudXRpbC5MaXN0IGdldEFsbFBlcm1pc3Npb25Hcm91cHMoCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0QXBwbGljYXRpb25FbmFibGVkU2V0dGluZygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIGdldEFwcGxpY2F0aW9uSWNvbigKLWFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm8pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlTWFuYWdlciROYW1lTm90Rm91bmRFeGNlcHRpb247ICkKLXB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIGdldEFwcGxpY2F0aW9uSWNvbigKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlTWFuYWdlciROYW1lTm90Rm91bmRFeGNlcHRpb247ICkKLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQucG0uQXBwbGljYXRpb25JbmZvIGdldEFwcGxpY2F0aW9uSW5mbygKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgZ2V0QXBwbGljYXRpb25MYWJlbCgKLWFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm8pCi0KLXB1YmxpYyBpbnQgZ2V0Q29tcG9uZW50RW5hYmxlZFNldHRpbmcoCi1hbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSkKLQotcHVibGljIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgZ2V0RGVmYXVsdEFjdGl2aXR5SWNvbigpCi0KLXB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIGdldERyYXdhYmxlKAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1hbmRyb2lkLmNvbnRlbnQucG0uQXBwbGljYXRpb25JbmZvKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJKUxqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9jb250ZW50L3BtL0FwcGxpY2F0aW9uSW5mbzs+OyApCi1wdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0SW5zdGFsbGVkQXBwbGljYXRpb25zKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJKUxqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VJbmZvOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRJbnN0YWxsZWRQYWNrYWdlcygKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VNYW5hZ2VyJE5hbWVOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHVibGljIGFuZHJvaWQuY29udGVudC5wbS5JbnN0cnVtZW50YXRpb25JbmZvIGdldEluc3RydW1lbnRhdGlvbkluZm8oCi1hbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZQotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXROYW1lRm9yVWlkKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZU1hbmFnZXIkTmFtZU5vdEZvdW5kRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50W10gZ2V0UGFja2FnZUdpZHMoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZU1hbmFnZXIkTmFtZU5vdEZvdW5kRXhjZXB0aW9uOyApCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VJbmZvIGdldFBhY2thZ2VJbmZvKAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgdm9pZCBnZXRQYWNrYWdlU2l6ZUluZm8oCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLmNvbnRlbnQucG0uSVBhY2thZ2VTdGF0c09ic2VydmVyKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIGdldFBhY2thZ2VzRm9yVWlkKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZU1hbmFnZXIkTmFtZU5vdEZvdW5kRXhjZXB0aW9uOyApCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LnBtLlBlcm1pc3Npb25Hcm91cEluZm8gZ2V0UGVybWlzc2lvbkdyb3VwSW5mbygKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VNYW5hZ2VyJE5hbWVOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHVibGljIGFuZHJvaWQuY29udGVudC5wbS5QZXJtaXNzaW9uSW5mbyBnZXRQZXJtaXNzaW9uSW5mbygKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL2NvbnRlbnQvSW50ZW50RmlsdGVyOz47TGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL2NvbnRlbnQvQ29tcG9uZW50TmFtZTs+O0xqYXZhL2xhbmcvU3RyaW5nOylJICkKLXB1YmxpYyBpbnQgZ2V0UHJlZmVycmVkQWN0aXZpdGllcygKLWphdmEudXRpbC5MaXN0Ci1qYXZhLnV0aWwuTGlzdAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSSlMamF2YS91dGlsL0xpc3Q8TGFuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlSW5mbzs+OyApCi1wdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0UHJlZmVycmVkUGFja2FnZXMoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlTWFuYWdlciROYW1lTm90Rm91bmRFeGNlcHRpb247ICkKLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQucG0uQWN0aXZpdHlJbmZvIGdldFJlY2VpdmVySW5mbygKLWFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlTWFuYWdlciROYW1lTm90Rm91bmRFeGNlcHRpb247ICkKLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcyBnZXRSZXNvdXJjZXNGb3JBY3Rpdml0eSgKLWFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZU1hbmFnZXIkTmFtZU5vdEZvdW5kRXhjZXB0aW9uOyApCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMgZ2V0UmVzb3VyY2VzRm9yQXBwbGljYXRpb24oCi1hbmRyb2lkLmNvbnRlbnQucG0uQXBwbGljYXRpb25JbmZvKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZU1hbmFnZXIkTmFtZU5vdEZvdW5kRXhjZXB0aW9uOyApCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMgZ2V0UmVzb3VyY2VzRm9yQXBwbGljYXRpb24oCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZU1hbmFnZXIkTmFtZU5vdEZvdW5kRXhjZXB0aW9uOyApCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LnBtLlNlcnZpY2VJbmZvIGdldFNlcnZpY2VJbmZvKAotYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUKLWludCkKLQotcHVibGljIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgZ2V0VGV4dCgKLWphdmEubGFuZy5TdHJpbmcKLWludAotYW5kcm9pZC5jb250ZW50LnBtLkFwcGxpY2F0aW9uSW5mbykKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5yZXMuWG1sUmVzb3VyY2VQYXJzZXIgZ2V0WG1sKAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1hbmRyb2lkLmNvbnRlbnQucG0uQXBwbGljYXRpb25JbmZvKQotCi1wdWJsaWMgdm9pZCBpbnN0YWxsUGFja2FnZSgKLWFuZHJvaWQubmV0LlVyaQotYW5kcm9pZC5jb250ZW50LnBtLklQYWNrYWdlSW5zdGFsbE9ic2VydmVyCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExhbmRyb2lkL2NvbnRlbnQvSW50ZW50O0kpTGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL2NvbnRlbnQvcG0vUmVzb2x2ZUluZm87PjsgKQotcHVibGljIGphdmEudXRpbC5MaXN0IHF1ZXJ5QnJvYWRjYXN0UmVjZWl2ZXJzKAotYW5kcm9pZC5jb250ZW50LkludGVudAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1N0cmluZztJSSlMamF2YS91dGlsL0xpc3Q8TGFuZHJvaWQvY29udGVudC9wbS9Qcm92aWRlckluZm87PjsgKQotcHVibGljIGphdmEudXRpbC5MaXN0IHF1ZXJ5Q29udGVudFByb3ZpZGVycygKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1N0cmluZztJKUxqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9jb250ZW50L3BtL0luc3RydW1lbnRhdGlvbkluZm87PjsgKQotcHVibGljIGphdmEudXRpbC5MaXN0IHF1ZXJ5SW5zdHJ1bWVudGF0aW9uKAotamF2YS5sYW5nLlN0cmluZwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMYW5kcm9pZC9jb250ZW50L0ludGVudDtJKUxqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9jb250ZW50L3BtL1Jlc29sdmVJbmZvOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBxdWVyeUludGVudEFjdGl2aXRpZXMoCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExhbmRyb2lkL2NvbnRlbnQvQ29tcG9uZW50TmFtZTtbTGFuZHJvaWQvY29udGVudC9JbnRlbnQ7TGFuZHJvaWQvY29udGVudC9JbnRlbnQ7SSlMamF2YS91dGlsL0xpc3Q8TGFuZHJvaWQvY29udGVudC9wbS9SZXNvbHZlSW5mbzs+OyApCi1wdWJsaWMgamF2YS51dGlsLkxpc3QgcXVlcnlJbnRlbnRBY3Rpdml0eU9wdGlvbnMoCi1hbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZQotYW5kcm9pZC5jb250ZW50LkludGVudFtdCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExhbmRyb2lkL2NvbnRlbnQvSW50ZW50O0kpTGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL2NvbnRlbnQvcG0vUmVzb2x2ZUluZm87PjsgKQotcHVibGljIGphdmEudXRpbC5MaXN0IHF1ZXJ5SW50ZW50U2VydmljZXMoCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvU3RyaW5nO0kpTGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL2NvbnRlbnQvcG0vUGVybWlzc2lvbkluZm87PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZU1hbmFnZXIkTmFtZU5vdEZvdW5kRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS51dGlsLkxpc3QgcXVlcnlQZXJtaXNzaW9uc0J5R3JvdXAoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHJlbW92ZVBhY2thZ2VGcm9tUHJlZmVycmVkKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgcmVtb3ZlUGVybWlzc2lvbigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQucG0uUmVzb2x2ZUluZm8gcmVzb2x2ZUFjdGl2aXR5KAotYW5kcm9pZC5jb250ZW50LkludGVudAotaW50KQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LnBtLlByb3ZpZGVySW5mbyByZXNvbHZlQ29udGVudFByb3ZpZGVyKAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LnBtLlJlc29sdmVJbmZvIHJlc29sdmVTZXJ2aWNlKAotYW5kcm9pZC5jb250ZW50LkludGVudAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRBcHBsaWNhdGlvbkVuYWJsZWRTZXR0aW5nKAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldENvbXBvbmVudEVuYWJsZWRTZXR0aW5nKAotYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUKLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1FZGl0b3IgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9TaGFyZWRQcmVmZXJlbmNlczsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXMkRWRpdG9yIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXMkRWRpdG9yIGNsZWFyKCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gY29tbWl0KCkKLQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlcyRFZGl0b3IgcHV0Qm9vbGVhbigKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4pCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXMkRWRpdG9yIHB1dEZsb2F0KAotamF2YS5sYW5nLlN0cmluZwotZmxvYXQpCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXMkRWRpdG9yIHB1dEludCgKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlcyRFZGl0b3IgcHV0TG9uZygKLWphdmEubGFuZy5TdHJpbmcKLWxvbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXMkRWRpdG9yIHB1dFN0cmluZygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXMkRWRpdG9yIHJlbW92ZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNyBuYW1lID1FZGl0b3JJbXBsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9BcHBsaWNhdGlvbkNvbnRleHQkU2hhcmVkUHJlZmVyZW5jZXNJbXBsOyApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5hcHAuQXBwbGljYXRpb25Db250ZXh0JFNoYXJlZFByZWZlcmVuY2VzSW1wbCRFZGl0b3JJbXBsIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlcyRFZGl0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBib29sZWFuIG1DbGVhcgotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvT2JqZWN0Oz47ICkKLXByaXZhdGUgZmluYWwgamF2YS51dGlsLk1hcCBtTW9kaWZpZWQKLQotZmluYWwgYW5kcm9pZC5hcHAuQXBwbGljYXRpb25Db250ZXh0JFNoYXJlZFByZWZlcmVuY2VzSW1wbCB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmFwcC5BcHBsaWNhdGlvbkNvbnRleHQkU2hhcmVkUHJlZmVyZW5jZXNJbXBsKQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzJEVkaXRvciBjbGVhcigpCi0KLXB1YmxpYyBib29sZWFuIGNvbW1pdCgpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXMkRWRpdG9yIHB1dEJvb2xlYW4oCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuKQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzJEVkaXRvciBwdXRGbG9hdCgKLWphdmEubGFuZy5TdHJpbmcKLWZsb2F0KQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzJEVkaXRvciBwdXRJbnQoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXMkRWRpdG9yIHB1dExvbmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1sb25nKQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzJEVkaXRvciBwdXRTdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzJEVkaXRvciByZW1vdmUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9TaGFyZWRQcmVmZXJlbmNlcyRFZGl0b3I7TGFuZHJvaWQvY29udGVudC9TaGFyZWRQcmVmZXJlbmNlcyRPblNoYXJlZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcjsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gY29udGFpbnMoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzJEVkaXRvciBlZGl0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcvU3RyaW5nOyo+OyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLk1hcCBnZXRBbGwoKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBnZXRCb29sZWFuKAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotcHVibGljIGFic3RyYWN0IGZsb2F0IGdldEZsb2F0KAotamF2YS5sYW5nLlN0cmluZwotZmxvYXQpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0SW50KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgbG9uZyBnZXRMb25nKAotamF2YS5sYW5nLlN0cmluZwotbG9uZykKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IHZvaWQgcmVnaXN0ZXJPblNoYXJlZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcigKLWFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlcyRPblNoYXJlZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgdW5yZWdpc3Rlck9uU2hhcmVkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKAotYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzJE9uU2hhcmVkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0FwcGxpY2F0aW9uQ29udGV4dCRTaGFyZWRQcmVmZXJlbmNlc0ltcGwkRWRpdG9ySW1wbDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNiBuYW1lID1TaGFyZWRQcmVmZXJlbmNlc0ltcGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0FwcGxpY2F0aW9uQ29udGV4dDsgKQotZmluYWwgY2xhc3MgYW5kcm9pZC5hcHAuQXBwbGljYXRpb25Db250ZXh0JFNoYXJlZFByZWZlcmVuY2VzSW1wbCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmlvLkZpbGUgbUZpbGUKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLm9zLkZpbGVVdGlscyRGaWxlU3RhdHVzIG1GaWxlU3RhdHVzCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL2NvbnRlbnQvU2hhcmVkUHJlZmVyZW5jZXMkT25TaGFyZWRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXI7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdCBtTGlzdGVuZXJzCi0KLXByaXZhdGUgamF2YS51dGlsLk1hcCBtTWFwCi0KLXByaXZhdGUgZmluYWwgaW50IG1Nb2RlCi0KLXByaXZhdGUgbG9uZyBtVGltZXN0YW1wCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS5pby5GaWxlCi1pbnQKLWphdmEudXRpbC5NYXApCi0KLXN0YXRpYyBqYXZhLnV0aWwuTGlzdCBhY2Nlc3MkNTAwKAotYW5kcm9pZC5hcHAuQXBwbGljYXRpb25Db250ZXh0JFNoYXJlZFByZWZlcmVuY2VzSW1wbCkKLQotc3RhdGljIGphdmEudXRpbC5NYXAgYWNjZXNzJDYwMCgKLWFuZHJvaWQuYXBwLkFwcGxpY2F0aW9uQ29udGV4dCRTaGFyZWRQcmVmZXJlbmNlc0ltcGwpCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQ3MDAoCi1hbmRyb2lkLmFwcC5BcHBsaWNhdGlvbkNvbnRleHQkU2hhcmVkUHJlZmVyZW5jZXNJbXBsKQotCi1wcml2YXRlIGJvb2xlYW4gd3JpdGVGaWxlTG9ja2VkKCkKLQotcHVibGljIGJvb2xlYW4gY29udGFpbnMoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzJEVkaXRvciBlZGl0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcvU3RyaW5nOyo+OyApCi1wdWJsaWMgamF2YS51dGlsLk1hcCBnZXRBbGwoKQotCi1wdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuKAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotcHVibGljIGZsb2F0IGdldEZsb2F0KAotamF2YS5sYW5nLlN0cmluZwotZmxvYXQpCi0KLXB1YmxpYyBpbnQgZ2V0SW50KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgbG9uZyBnZXRMb25nKAotamF2YS5sYW5nLlN0cmluZwotbG9uZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJvb2xlYW4gaGFzRmlsZUNoYW5nZWQoKQotCi1wdWJsaWMgdm9pZCByZWdpc3Rlck9uU2hhcmVkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKAotYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzJE9uU2hhcmVkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKQotCi1wdWJsaWMgdm9pZCByZXBsYWNlKAotamF2YS51dGlsLk1hcCkKLQotcHVibGljIHZvaWQgdW5yZWdpc3Rlck9uU2hhcmVkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKAotYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzJE9uU2hhcmVkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0lXYWxscGFwZXJTZXJ2aWNlQ2FsbGJhY2skU3R1YjsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLmFwcC5JV2FsbHBhcGVyU2VydmljZUNhbGxiYWNrIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuSUludGVyZmFjZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvbldhbGxwYXBlckNoYW5nZWQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0lXYWxscGFwZXJTZXJ2aWNlQ2FsbGJhY2skU3R1YiRQcm94eTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMDMzIG5hbWUgPVN0dWIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0lXYWxscGFwZXJTZXJ2aWNlQ2FsbGJhY2s7ICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBhbmRyb2lkLmFwcC5JV2FsbHBhcGVyU2VydmljZUNhbGxiYWNrJFN0dWIgZXh0ZW5kcyBhbmRyb2lkLm9zLkJpbmRlciBpbXBsZW1lbnRzIGFuZHJvaWQuYXBwLklXYWxscGFwZXJTZXJ2aWNlQ2FsbGJhY2sKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERVNDUklQVE9SCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fb25XYWxscGFwZXJDaGFuZ2VkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmFwcC5JV2FsbHBhcGVyU2VydmljZUNhbGxiYWNrIGFzSW50ZXJmYWNlKAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIG9uVHJhbnNhY3QoCi1pbnQKLWFuZHJvaWQub3MuUGFyY2VsCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9BcHBsaWNhdGlvbkNvbnRleHQ7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9V2FsbHBhcGVyQ2FsbGJhY2sgKQotIGNsYXNzIGFuZHJvaWQuYXBwLkFwcGxpY2F0aW9uQ29udGV4dCRXYWxscGFwZXJDYWxsYmFjayBleHRlbmRzIGFuZHJvaWQuYXBwLklXYWxscGFwZXJTZXJ2aWNlQ2FsbGJhY2skU3R1YgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvcmVmL1dlYWtSZWZlcmVuY2U8TGFuZHJvaWQvYXBwL0FwcGxpY2F0aW9uQ29udGV4dDs+OyApCi1wcml2YXRlIGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZSBtQ29udGV4dAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuYXBwLkFwcGxpY2F0aW9uQ29udGV4dCkKLQotcHVibGljIHZvaWQgb25XYWxscGFwZXJDaGFuZ2VkKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9BcHBsaWNhdGlvbkNvbnRleHQkMTtMYW5kcm9pZC9hcHAvQXBwbGljYXRpb25Db250ZXh0JFdhbGxwYXBlckNhbGxiYWNrO0xhbmRyb2lkL2FwcC9BcHBsaWNhdGlvbkNvbnRleHQkU2hhcmVkUHJlZmVyZW5jZXNJbXBsO0xhbmRyb2lkL2FwcC9BcHBsaWNhdGlvbkNvbnRleHQkQXBwbGljYXRpb25QYWNrYWdlTWFuYWdlcjtMYW5kcm9pZC9hcHAvQXBwbGljYXRpb25Db250ZXh0JEFwcGxpY2F0aW9uQ29udGVudFJlc29sdmVyOyApCi0gY2xhc3MgYW5kcm9pZC5hcHAuQXBwbGljYXRpb25Db250ZXh0IGV4dGVuZHMgYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19JQ09OUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gRU1QVFlfRklMRV9MSVNUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEFHCi0KLXByaXZhdGUgc3RhdGljIGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZSBzQmx1ZXRvb3RoRGV2aWNlCi0KLXByaXZhdGUgc3RhdGljIGFuZHJvaWQubmV0LkNvbm5lY3Rpdml0eU1hbmFnZXIgc0Nvbm5lY3Rpdml0eU1hbmFnZXIKLQotcHJpdmF0ZSBzdGF0aWMgbG9uZyBzSW5zdGFuY2VDb3VudAotCi1wcml2YXRlIHN0YXRpYyBib29sZWFuIHNJc0JsdWV0b290aERldmljZUNhY2hlZAotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uTWFuYWdlciBzTG9jYXRpb25NYW5hZ2VyCi0KLXByaXZhdGUgc3RhdGljIGFuZHJvaWQub3MuUG93ZXJNYW5hZ2VyIHNQb3dlck1hbmFnZXIKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0hhc2hNYXA8TGphdmEvaW8vRmlsZTtMYW5kcm9pZC9hcHAvQXBwbGljYXRpb25Db250ZXh0JFNoYXJlZFByZWZlcmVuY2VzSW1wbDs+OyApCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuSGFzaE1hcCBzU2hhcmVkUHJlZnMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLk9iamVjdCBzU3luYwotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLmFwcC5JV2FsbHBhcGVyU2VydmljZSBzV2FsbHBhcGVyU2VydmljZQotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyIHNXaWZpTWFuYWdlcgotCi1wcml2YXRlIGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlciBtQWN0aXZpdHlNYW5hZ2VyCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5JQmluZGVyIG1BY3Rpdml0eVRva2VuCi0KLXByaXZhdGUgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXIgbUF1ZGlvTWFuYWdlcgotCi1wcml2YXRlIGphdmEuaW8uRmlsZSBtQ2FjaGVEaXIKLQotcHJpdmF0ZSBhbmRyb2lkLnRleHQuQ2xpcGJvYXJkTWFuYWdlciBtQ2xpcGJvYXJkTWFuYWdlcgotCi1wcml2YXRlIGFuZHJvaWQuYXBwLkFwcGxpY2F0aW9uQ29udGV4dCRBcHBsaWNhdGlvbkNvbnRlbnRSZXNvbHZlciBtQ29udGVudFJlc29sdmVyCi0KLXByaXZhdGUgamF2YS5pby5GaWxlIG1EYXRhYmFzZXNEaXIKLQotcHJpdmF0ZSBqYXZhLmlvLkZpbGUgbUZpbGVzRGlyCi0KLXByaXZhdGUgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyIG1MYXlvdXRJbmZsYXRlcgotCi0gYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQgbU1haW5UaHJlYWQKLQotcHJpdmF0ZSBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb25NYW5hZ2VyIG1Ob3RpZmljYXRpb25NYW5hZ2VyCi0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgbU91dGVyQ29udGV4dAotCi0gYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQkUGFja2FnZUluZm8gbVBhY2thZ2VJbmZvCi0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyIG1QYWNrYWdlTWFuYWdlcgotCi1wcml2YXRlIGphdmEuaW8uRmlsZSBtUHJlZmVyZW5jZXNEaXIKLQotcHJpdmF0ZSBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBtUmVjZWl2ZXJSZXN0cmljdGVkQ29udGV4dAotCi1wcml2YXRlIGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzIG1SZXNvdXJjZXMKLQotcHJpdmF0ZSBhbmRyb2lkLmFwcC5TZWFyY2hNYW5hZ2VyIG1TZWFyY2hNYW5hZ2VyCi0KLXByaXZhdGUgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3JNYW5hZ2VyIG1TZW5zb3JNYW5hZ2VyCi0KLXByaXZhdGUgYW5kcm9pZC5hcHAuU3RhdHVzQmFyTWFuYWdlciBtU3RhdHVzQmFyTWFuYWdlcgotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5PYmplY3QgbVN5bmMKLQotcHJpdmF0ZSBhbmRyb2lkLnRlbGVwaG9ueS5UZWxlcGhvbnlNYW5hZ2VyIG1UZWxlcGhvbnlNYW5hZ2VyCi0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMkVGhlbWUgbVRoZW1lCi0KLXByaXZhdGUgaW50IG1UaGVtZVJlc291cmNlCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5WaWJyYXRvciBtVmlicmF0b3IKLQotcHJpdmF0ZSBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIG1XYWxscGFwZXIKLQotcHJpdmF0ZSBhbmRyb2lkLmFwcC5JV2FsbHBhcGVyU2VydmljZUNhbGxiYWNrIG1XYWxscGFwZXJDYWxsYmFjawotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5hcHAuQXBwbGljYXRpb25Db250ZXh0KQotCi1zdGF0aWMgYW5kcm9pZC5jb250ZW50LkludGVudCBhY2Nlc3MkMTAwKAotYW5kcm9pZC5hcHAuQXBwbGljYXRpb25Db250ZXh0Ci1hbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXIKLWFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXIKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuSGFuZGxlcgotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQ4MDAoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludCkKLQotc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgYWNjZXNzJDkwMigKLWFuZHJvaWQuYXBwLkFwcGxpY2F0aW9uQ29udGV4dAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSkKLQotc3RhdGljIGFuZHJvaWQuYXBwLkFwcGxpY2F0aW9uQ29udGV4dCBjcmVhdGVTeXN0ZW1Db250ZXh0KAotYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQpCi0KLXByaXZhdGUgdm9pZCBlbmZvcmNlKAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1ib29sZWFuCi1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgdm9pZCBlbmZvcmNlRm9yVXJpKAotaW50Ci1pbnQKLWJvb2xlYW4KLWludAotYW5kcm9pZC5uZXQuVXJpCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlciBnZXRBY3Rpdml0eU1hbmFnZXIoKQotCi1wcml2YXRlIGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyIGdldEF1ZGlvTWFuYWdlcigpCi0KLXByaXZhdGUgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlIGdldEJsdWV0b290aERldmljZSgpCi0KLXByaXZhdGUgYW5kcm9pZC50ZXh0LkNsaXBib2FyZE1hbmFnZXIgZ2V0Q2xpcGJvYXJkTWFuYWdlcigpCi0KLXByaXZhdGUgYW5kcm9pZC5uZXQuQ29ubmVjdGl2aXR5TWFuYWdlciBnZXRDb25uZWN0aXZpdHlNYW5hZ2VyKCkKLQotcHJpdmF0ZSBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIGdldEN1cnJlbnRXYWxscGFwZXJMb2NrZWQoKQotCi1wcml2YXRlIGphdmEuaW8uRmlsZSBnZXREYXRhRGlyRmlsZSgpCi0KLXByaXZhdGUgamF2YS5pby5GaWxlIGdldERhdGFiYXNlc0RpcigpCi0KLXB1YmxpYyBzdGF0aWMgbG9uZyBnZXRJbnN0YW5jZUNvdW50KCkKLQotcHJpdmF0ZSBhbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uTWFuYWdlciBnZXRMb2NhdGlvbk1hbmFnZXIoKQotCi1wcml2YXRlIGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbk1hbmFnZXIgZ2V0Tm90aWZpY2F0aW9uTWFuYWdlcigpCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5Qb3dlck1hbmFnZXIgZ2V0UG93ZXJNYW5hZ2VyKCkKLQotcHJpdmF0ZSBqYXZhLmlvLkZpbGUgZ2V0UHJlZmVyZW5jZXNEaXIoKQotCi1wcml2YXRlIGFuZHJvaWQuYXBwLlNlYXJjaE1hbmFnZXIgZ2V0U2VhcmNoTWFuYWdlcigpCi0KLXByaXZhdGUgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3JNYW5hZ2VyIGdldFNlbnNvck1hbmFnZXIoKQotCi1wcml2YXRlIGFuZHJvaWQudGVsZXBob255LlRlbGVwaG9ueU1hbmFnZXIgZ2V0VGVsZXBob255TWFuYWdlcigpCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5WaWJyYXRvciBnZXRWaWJyYXRvcigpCi0KLXByaXZhdGUgYW5kcm9pZC5hcHAuSVdhbGxwYXBlclNlcnZpY2UgZ2V0V2FsbHBhcGVyU2VydmljZSgpCi0KLXByaXZhdGUgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlciBnZXRXaWZpTWFuYWdlcigpCi0KLXByaXZhdGUgamF2YS5pby5GaWxlIG1ha2VGaWxlbmFtZSgKLWphdmEuaW8uRmlsZQotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBhbmRyb2lkLmNvbnRlbnQuSW50ZW50IHJlZ2lzdGVyUmVjZWl2ZXJJbnRlcm5hbCgKLWFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcgotYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcgotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5vcy5IYW5kbGVyCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRGaWxlUGVybWlzc2lvbnNGcm9tTW9kZSgKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgc2V0V2FsbHBhcGVyKAotamF2YS5pby5JbnB1dFN0cmVhbQotamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtKQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgdXJpTW9kZUZsYWdUb1N0cmluZygKLWludCkKLQotcHVibGljIGJvb2xlYW4gYmluZFNlcnZpY2UoCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50Ci1hbmRyb2lkLmNvbnRlbnQuU2VydmljZUNvbm5lY3Rpb24KLWludCkKLQotcHVibGljIGludCBjaGVja0NhbGxpbmdPclNlbGZQZXJtaXNzaW9uKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGludCBjaGVja0NhbGxpbmdPclNlbGZVcmlQZXJtaXNzaW9uKAotYW5kcm9pZC5uZXQuVXJpCi1pbnQpCi0KLXB1YmxpYyBpbnQgY2hlY2tDYWxsaW5nUGVybWlzc2lvbigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBpbnQgY2hlY2tDYWxsaW5nVXJpUGVybWlzc2lvbigKLWFuZHJvaWQubmV0LlVyaQotaW50KQotCi1wdWJsaWMgaW50IGNoZWNrUGVybWlzc2lvbigKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50KQotCi1wdWJsaWMgaW50IGNoZWNrVXJpUGVybWlzc2lvbigKLWFuZHJvaWQubmV0LlVyaQotaW50Ci1pbnQKLWludCkKLQotcHVibGljIGludCBjaGVja1VyaVBlcm1pc3Npb24oCi1hbmRyb2lkLm5ldC5VcmkKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNsZWFyV2FsbHBhcGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VNYW5hZ2VyJE5hbWVOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHVibGljIGFuZHJvaWQuY29udGVudC5Db250ZXh0IGNyZWF0ZVBhY2thZ2VDb250ZXh0KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIGRhdGFiYXNlTGlzdCgpCi0KLXB1YmxpYyBib29sZWFuIGRlbGV0ZURhdGFiYXNlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJvb2xlYW4gZGVsZXRlRmlsZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIGVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIGVuZm9yY2VDYWxsaW5nT3JTZWxmVXJpUGVybWlzc2lvbigKLWFuZHJvaWQubmV0LlVyaQotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBlbmZvcmNlQ2FsbGluZ1Blcm1pc3Npb24oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBlbmZvcmNlQ2FsbGluZ1VyaVBlcm1pc3Npb24oCi1hbmRyb2lkLm5ldC5VcmkKLWludAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgZW5mb3JjZVBlcm1pc3Npb24oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgZW5mb3JjZVVyaVBlcm1pc3Npb24oCi1hbmRyb2lkLm5ldC5VcmkKLWludAotaW50Ci1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIGVuZm9yY2VVcmlQZXJtaXNzaW9uKAotYW5kcm9pZC5uZXQuVXJpCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIGZpbGVMaXN0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL1Rocm93YWJsZTsgKQotcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKQotCi1maW5hbCBhbmRyb2lkLm9zLklCaW5kZXIgZ2V0QWN0aXZpdHlUb2tlbigpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBnZXRBcHBsaWNhdGlvbkNvbnRleHQoKQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldE1hbmFnZXIgZ2V0QXNzZXRzKCkKLQotcHVibGljIGphdmEuaW8uRmlsZSBnZXRDYWNoZURpcigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXIoKQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlciBnZXRDb250ZW50UmVzb2x2ZXIoKQotCi1wdWJsaWMgamF2YS5pby5GaWxlIGdldERhdGFiYXNlUGF0aCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmlvLkZpbGUgZ2V0RGlyKAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgamF2YS5pby5GaWxlIGdldEZpbGVTdHJlYW1QYXRoKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEuaW8uRmlsZSBnZXRGaWxlc0RpcigpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLkxvb3BlciBnZXRNYWluTG9vcGVyKCkKLQotZmluYWwgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgZ2V0T3V0ZXJDb250ZXh0KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UGFja2FnZUNvZGVQYXRoKCkKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlciBnZXRQYWNrYWdlTWFuYWdlcigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UGFja2FnZVJlc291cmNlUGF0aCgpCi0KLWZpbmFsIGFuZHJvaWQuY29udGVudC5Db250ZXh0IGdldFJlY2VpdmVyUmVzdHJpY3RlZENvbnRleHQoKQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMgZ2V0UmVzb3VyY2VzKCkKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlcyBnZXRTaGFyZWRQcmVmZXJlbmNlcygKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0U3lzdGVtU2VydmljZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcyRUaGVtZSBnZXRUaGVtZSgpCi0KLXB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIGdldFdhbGxwYXBlcigpCi0KLXB1YmxpYyBpbnQgZ2V0V2FsbHBhcGVyRGVzaXJlZE1pbmltdW1IZWlnaHQoKQotCi1wdWJsaWMgaW50IGdldFdhbGxwYXBlckRlc2lyZWRNaW5pbXVtV2lkdGgoKQotCi1wdWJsaWMgdm9pZCBncmFudFVyaVBlcm1pc3Npb24oCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm5ldC5VcmkKLWludCkKLQotZmluYWwgdm9pZCBpbml0KAotYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQkUGFja2FnZUluZm8KLWFuZHJvaWQub3MuSUJpbmRlcgotYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQpCi0KLWZpbmFsIHZvaWQgaW5pdCgKLWFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzCi1hbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9GaWxlTm90Rm91bmRFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbSBvcGVuRmlsZUlucHV0KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9GaWxlTm90Rm91bmRFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW0gb3BlbkZpbGVPdXRwdXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSBvcGVuT3JDcmVhdGVEYXRhYmFzZSgKLWphdmEubGFuZy5TdHJpbmcKLWludAotYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UkQ3Vyc29yRmFjdG9yeSkKLQotcHVibGljIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgcGVla1dhbGxwYXBlcigpCi0KLWZpbmFsIHZvaWQgcGVyZm9ybUZpbmFsQ2xlYW51cCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50IHJlZ2lzdGVyUmVjZWl2ZXIoCi1hbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXIKLWFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXIpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50IHJlZ2lzdGVyUmVjZWl2ZXIoCi1hbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXIKLWFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXIKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuSGFuZGxlcikKLQotcHVibGljIHZvaWQgcmVtb3ZlU3RpY2t5QnJvYWRjYXN0KAotYW5kcm9pZC5jb250ZW50LkludGVudCkKLQotcHVibGljIHZvaWQgcmV2b2tlVXJpUGVybWlzc2lvbigKLWFuZHJvaWQubmV0LlVyaQotaW50KQotCi1maW5hbCB2b2lkIHNjaGVkdWxlRmluYWxDbGVhbnVwKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2VuZEJyb2FkY2FzdCgKLWFuZHJvaWQuY29udGVudC5JbnRlbnQpCi0KLXB1YmxpYyB2b2lkIHNlbmRCcm9hZGNhc3QoCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZW5kT3JkZXJlZEJyb2FkY2FzdCgKLWFuZHJvaWQuY29udGVudC5JbnRlbnQKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHNlbmRPcmRlcmVkQnJvYWRjYXN0KAotYW5kcm9pZC5jb250ZW50LkludGVudAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyCi1hbmRyb2lkLm9zLkhhbmRsZXIKLWludAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5vcy5CdW5kbGUpCi0KLXB1YmxpYyB2b2lkIHNlbmRTdGlja3lCcm9hZGNhc3QoCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50KQotCi1maW5hbCB2b2lkIHNldEFjdGl2aXR5VG9rZW4oCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLWZpbmFsIHZvaWQgc2V0T3V0ZXJDb250ZXh0KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXB1YmxpYyB2b2lkIHNldFRoZW1lKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRXYWxscGFwZXIoCi1hbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0V2FsbHBhcGVyKAotamF2YS5pby5JbnB1dFN0cmVhbSkKLQotcHVibGljIHZvaWQgc3RhcnRBY3Rpdml0eSgKLWFuZHJvaWQuY29udGVudC5JbnRlbnQpCi0KLXB1YmxpYyBib29sZWFuIHN0YXJ0SW5zdHJ1bWVudGF0aW9uKAotYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuQnVuZGxlKQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUgc3RhcnRTZXJ2aWNlKAotYW5kcm9pZC5jb250ZW50LkludGVudCkKLQotcHVibGljIGJvb2xlYW4gc3RvcFNlcnZpY2UoCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50KQotCi1wdWJsaWMgdm9pZCB1bmJpbmRTZXJ2aWNlKAotYW5kcm9pZC5jb250ZW50LlNlcnZpY2VDb25uZWN0aW9uKQotCi1wdWJsaWMgdm9pZCB1bnJlZ2lzdGVyUmVjZWl2ZXIoCi1hbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi0gY2xhc3MgYW5kcm9pZC5hcHAuQXBwbGljYXRpb25Mb2FkZXJzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmFwcC5BcHBsaWNhdGlvbkxvYWRlcnMgZ0FwcGxpY2F0aW9uTG9hZGVycwotCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5IYXNoTWFwIG1Mb2FkZXJzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi0gdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuYXBwLkFwcGxpY2F0aW9uTG9hZGVycyBnZXREZWZhdWx0KCkKLQotcHVibGljIGphdmEubGFuZy5DbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlcigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5DbGFzc0xvYWRlcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLSBjbGFzcyBhbmRyb2lkLmFwcC5BcHBsaWNhdGlvblRocmVhZFByb3h5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQuYXBwLklBcHBsaWNhdGlvblRocmVhZAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQub3MuSUJpbmRlciBtUmVtb3RlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgZmluYWwgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9TdHJpbmc7TGFuZHJvaWQvY29udGVudC9wbS9BcHBsaWNhdGlvbkluZm87TGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL2NvbnRlbnQvcG0vUHJvdmlkZXJJbmZvOz47TGFuZHJvaWQvY29udGVudC9Db21wb25lbnROYW1lO0xqYXZhL2xhbmcvU3RyaW5nO0xhbmRyb2lkL29zL0J1bmRsZTtMYW5kcm9pZC9hcHAvSUluc3RydW1lbnRhdGlvbldhdGNoZXI7SUxhbmRyb2lkL2NvbnRlbnQvcmVzL0NvbmZpZ3VyYXRpb247TGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TGFuZHJvaWQvb3MvSUJpbmRlcjs+OylWICkKLXB1YmxpYyBmaW5hbCB2b2lkIGJpbmRBcHBsaWNhdGlvbigKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm8KLWphdmEudXRpbC5MaXN0Ci1hbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZQotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5vcy5CdW5kbGUKLWFuZHJvaWQuYXBwLklJbnN0cnVtZW50YXRpb25XYXRjaGVyCi1pbnQKLWFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbgotamF2YS51dGlsLk1hcCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGR1bXBTZXJ2aWNlKAotamF2YS5pby5GaWxlRGVzY3JpcHRvcgotYW5kcm9pZC5vcy5JQmluZGVyCi1qYXZhLmxhbmcuU3RyaW5nW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBwcm9jZXNzSW5CYWNrZ3JvdW5kKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCB2b2lkIHJlcXVlc3RQc3MoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIHZvaWQgcmVxdWVzdFRodW1ibmFpbCgKLWFuZHJvaWQub3MuSUJpbmRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCB2b2lkIHNjaGVkdWxlQWN0aXZpdHlDb25maWd1cmF0aW9uQ2hhbmdlZCgKLWFuZHJvaWQub3MuSUJpbmRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCB2b2lkIHNjaGVkdWxlQmluZFNlcnZpY2UoCi1hbmRyb2lkLm9zLklCaW5kZXIKLWFuZHJvaWQuY29udGVudC5JbnRlbnQKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgdm9pZCBzY2hlZHVsZUNvbmZpZ3VyYXRpb25DaGFuZ2VkKAotYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIHZvaWQgc2NoZWR1bGVDcmVhdGVTZXJ2aWNlKAotYW5kcm9pZC5vcy5JQmluZGVyCi1hbmRyb2lkLmNvbnRlbnQucG0uU2VydmljZUluZm8pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgdm9pZCBzY2hlZHVsZURlc3Ryb3lBY3Rpdml0eSgKLWFuZHJvaWQub3MuSUJpbmRlcgotYm9vbGVhbgotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIHZvaWQgc2NoZWR1bGVFeGl0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGFuZHJvaWQvY29udGVudC9JbnRlbnQ7TGFuZHJvaWQvb3MvSUJpbmRlcjtMYW5kcm9pZC9jb250ZW50L3BtL0FjdGl2aXR5SW5mbztMYW5kcm9pZC9vcy9CdW5kbGU7TGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL2FwcC9SZXN1bHRJbmZvOz47TGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL2NvbnRlbnQvSW50ZW50Oz47WilWICkKLXB1YmxpYyBmaW5hbCB2b2lkIHNjaGVkdWxlTGF1bmNoQWN0aXZpdHkoCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50Ci1hbmRyb2lkLm9zLklCaW5kZXIKLWFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm8KLWFuZHJvaWQub3MuQnVuZGxlCi1qYXZhLnV0aWwuTGlzdAotamF2YS51dGlsLkxpc3QKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgdm9pZCBzY2hlZHVsZUxvd01lbW9yeSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9jb250ZW50L0ludGVudDs+O0xhbmRyb2lkL29zL0lCaW5kZXI7KVYgKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2NoZWR1bGVOZXdJbnRlbnQoCi1qYXZhLnV0aWwuTGlzdAotYW5kcm9pZC5vcy5JQmluZGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIHZvaWQgc2NoZWR1bGVQYXVzZUFjdGl2aXR5KAotYW5kcm9pZC5vcy5JQmluZGVyCi1ib29sZWFuCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgdm9pZCBzY2hlZHVsZVJlY2VpdmVyKAotYW5kcm9pZC5jb250ZW50LkludGVudAotYW5kcm9pZC5jb250ZW50LnBtLkFjdGl2aXR5SW5mbwotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLkJ1bmRsZQotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNjaGVkdWxlUmVnaXN0ZXJlZFJlY2VpdmVyKAotYW5kcm9pZC5hcHAuSUludGVudFJlY2VpdmVyCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50Ci1pbnQKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuQnVuZGxlCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMYW5kcm9pZC9vcy9JQmluZGVyO0xqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9hcHAvUmVzdWx0SW5mbzs+O0xqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9jb250ZW50L0ludGVudDs+O0laKVYgKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIHZvaWQgc2NoZWR1bGVSZWxhdW5jaEFjdGl2aXR5KAotYW5kcm9pZC5vcy5JQmluZGVyCi1qYXZhLnV0aWwuTGlzdAotamF2YS51dGlsLkxpc3QKLWludAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCB2b2lkIHNjaGVkdWxlUmVzdW1lQWN0aXZpdHkoCi1hbmRyb2lkLm9zLklCaW5kZXIpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExhbmRyb2lkL29zL0lCaW5kZXI7TGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL2FwcC9SZXN1bHRJbmZvOz47KVYgKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIHZvaWQgc2NoZWR1bGVTZW5kUmVzdWx0KAotYW5kcm9pZC5vcy5JQmluZGVyCi1qYXZhLnV0aWwuTGlzdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCB2b2lkIHNjaGVkdWxlU2VydmljZUFyZ3MoCi1hbmRyb2lkLm9zLklCaW5kZXIKLWludAotYW5kcm9pZC5jb250ZW50LkludGVudCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCB2b2lkIHNjaGVkdWxlU3RvcEFjdGl2aXR5KAotYW5kcm9pZC5vcy5JQmluZGVyCi1ib29sZWFuCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgdm9pZCBzY2hlZHVsZVN0b3BTZXJ2aWNlKAotYW5kcm9pZC5vcy5JQmluZGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIHZvaWQgc2NoZWR1bGVVbmJpbmRTZXJ2aWNlKAotYW5kcm9pZC5vcy5JQmluZGVyCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIHZvaWQgc2NoZWR1bGVXaW5kb3dWaXNpYmlsaXR5KAotYW5kcm9pZC5vcy5JQmluZGVyCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgdXBkYXRlVGltZVpvbmUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9EYXRlUGlja2VyRGlhbG9nOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9T25EYXRlU2V0TGlzdGVuZXIgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLmFwcC5EYXRlUGlja2VyRGlhbG9nJE9uRGF0ZVNldExpc3RlbmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uRGF0ZVNldCgKLWFuZHJvaWQud2lkZ2V0LkRhdGVQaWNrZXIKLWludAotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPU9uQ2xpY2tMaXN0ZW5lciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L0RpYWxvZ0ludGVyZmFjZTsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlJE9uQ2xpY2tMaXN0ZW5lciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvbkNsaWNrKAotYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZQotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9EYXRlUGlja2VyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9T25EYXRlQ2hhbmdlZExpc3RlbmVyICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC53aWRnZXQuRGF0ZVBpY2tlciRPbkRhdGVDaGFuZ2VkTGlzdGVuZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgb25EYXRlQ2hhbmdlZCgKLWFuZHJvaWQud2lkZ2V0LkRhdGVQaWNrZXIKLWludAotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9hcHAvRGF0ZVBpY2tlckRpYWxvZyRPbkRhdGVTZXRMaXN0ZW5lcjsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQuYXBwLkRhdGVQaWNrZXJEaWFsb2cgZXh0ZW5kcyBhbmRyb2lkLmFwcC5BbGVydERpYWxvZyBpbXBsZW1lbnRzIGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UkT25DbGlja0xpc3RlbmVyLCBhbmRyb2lkLndpZGdldC5EYXRlUGlja2VyJE9uRGF0ZUNoYW5nZWRMaXN0ZW5lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERBWQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1PTlRICi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgWUVBUgotCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5DYWxlbmRhciBtQ2FsZW5kYXIKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLmFwcC5EYXRlUGlja2VyRGlhbG9nJE9uRGF0ZVNldExpc3RlbmVyIG1DYWxsQmFjawotCi1wcml2YXRlIGZpbmFsIGphdmEudGV4dC5EYXRlRm9ybWF0IG1EYXRlRm9ybWF0Ci0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC53aWRnZXQuRGF0ZVBpY2tlciBtRGF0ZVBpY2tlcgotCi1wcml2YXRlIGludCBtSW5pdGlhbERheQotCi1wcml2YXRlIGludCBtSW5pdGlhbE1vbnRoCi0KLXByaXZhdGUgaW50IG1Jbml0aWFsWWVhcgotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmdbXSBtV2Vla0RheXMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotaW50Ci1hbmRyb2lkLmFwcC5EYXRlUGlja2VyRGlhbG9nJE9uRGF0ZVNldExpc3RlbmVyCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC5hcHAuRGF0ZVBpY2tlckRpYWxvZyRPbkRhdGVTZXRMaXN0ZW5lcgotaW50Ci1pbnQKLWludCkKLQotcHJpdmF0ZSB2b2lkIHVwZGF0ZVRpdGxlKAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgb25DbGljaygKLWFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UKLWludCkKLQotcHVibGljIHZvaWQgb25EYXRlQ2hhbmdlZCgKLWFuZHJvaWQud2lkZ2V0LkRhdGVQaWNrZXIKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIG9uUmVzdG9yZUluc3RhbmNlU3RhdGUoCi1hbmRyb2lkLm9zLkJ1bmRsZSkKLQotcHVibGljIGFuZHJvaWQub3MuQnVuZGxlIG9uU2F2ZUluc3RhbmNlU3RhdGUoKQotCi1wdWJsaWMgdm9pZCBzaG93KCkKLQotcHVibGljIHZvaWQgdXBkYXRlRGF0ZSgKLWludAotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0RpYWxvZzsgKQotIGNsYXNzIGFuZHJvaWQuYXBwLkRpYWxvZyQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5SdW5uYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLmFwcC5EaWFsb2cgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5hcHAuRGlhbG9nKQotCi1wdWJsaWMgdm9pZCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9EaWFsb2c7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjYgbmFtZSA9RGlzbWlzc0NhbmNlbEhhbmRsZXIgKQotZmluYWwgY2xhc3MgYW5kcm9pZC5hcHAuRGlhbG9nJERpc21pc3NDYW5jZWxIYW5kbGVyIGV4dGVuZHMgYW5kcm9pZC5vcy5IYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9yZWYvV2Vha1JlZmVyZW5jZTxMYW5kcm9pZC9jb250ZW50L0RpYWxvZ0ludGVyZmFjZTs+OyApCi1wcml2YXRlIGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZSBtRGlhbG9nCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5hcHAuRGlhbG9nKQotCi1wdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1PbkNoaWxkQ2xpY2tMaXN0ZW5lciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvRXhwYW5kYWJsZUxpc3RWaWV3OyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0VmlldyRPbkNoaWxkQ2xpY2tMaXN0ZW5lciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBvbkNoaWxkQ2xpY2soCi1hbmRyb2lkLndpZGdldC5FeHBhbmRhYmxlTGlzdFZpZXcKLWFuZHJvaWQudmlldy5WaWV3Ci1pbnQKLWludAotbG9uZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvRXhwYW5kYWJsZUxpc3RWaWV3OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9T25Hcm91cENvbGxhcHNlTGlzdGVuZXIgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLndpZGdldC5FeHBhbmRhYmxlTGlzdFZpZXckT25Hcm91cENvbGxhcHNlTGlzdGVuZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgb25Hcm91cENvbGxhcHNlKAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1Pbkdyb3VwRXhwYW5kTGlzdGVuZXIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L0V4cGFuZGFibGVMaXN0VmlldzsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLndpZGdldC5FeHBhbmRhYmxlTGlzdFZpZXckT25Hcm91cEV4cGFuZExpc3RlbmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uR3JvdXBFeHBhbmQoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5hcHAuRXhwYW5kYWJsZUxpc3RBY3Rpdml0eSBleHRlbmRzIGFuZHJvaWQuYXBwLkFjdGl2aXR5IGltcGxlbWVudHMgYW5kcm9pZC52aWV3LlZpZXckT25DcmVhdGVDb250ZXh0TWVudUxpc3RlbmVyLCBhbmRyb2lkLndpZGdldC5FeHBhbmRhYmxlTGlzdFZpZXckT25DaGlsZENsaWNrTGlzdGVuZXIsIGFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0VmlldyRPbkdyb3VwQ29sbGFwc2VMaXN0ZW5lciwgYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RWaWV3JE9uR3JvdXBFeHBhbmRMaXN0ZW5lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RBZGFwdGVyIG1BZGFwdGVyCi0KLSBib29sZWFuIG1GaW5pc2hlZFN0YXJ0Ci0KLSBhbmRyb2lkLndpZGdldC5FeHBhbmRhYmxlTGlzdFZpZXcgbUxpc3QKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIHZvaWQgZW5zdXJlTGlzdCgpCi0KLXB1YmxpYyBhbmRyb2lkLndpZGdldC5FeHBhbmRhYmxlTGlzdEFkYXB0ZXIgZ2V0RXhwYW5kYWJsZUxpc3RBZGFwdGVyKCkKLQotcHVibGljIGFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0VmlldyBnZXRFeHBhbmRhYmxlTGlzdFZpZXcoKQotCi1wdWJsaWMgbG9uZyBnZXRTZWxlY3RlZElkKCkKLQotcHVibGljIGxvbmcgZ2V0U2VsZWN0ZWRQb3NpdGlvbigpCi0KLXB1YmxpYyBib29sZWFuIG9uQ2hpbGRDbGljaygKLWFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0VmlldwotYW5kcm9pZC52aWV3LlZpZXcKLWludAotaW50Ci1sb25nKQotCi1wdWJsaWMgdm9pZCBvbkNvbnRlbnRDaGFuZ2VkKCkKLQotcHVibGljIHZvaWQgb25DcmVhdGVDb250ZXh0TWVudSgKLWFuZHJvaWQudmlldy5Db250ZXh0TWVudQotYW5kcm9pZC52aWV3LlZpZXcKLWFuZHJvaWQudmlldy5Db250ZXh0TWVudSRDb250ZXh0TWVudUluZm8pCi0KLXB1YmxpYyB2b2lkIG9uR3JvdXBDb2xsYXBzZSgKLWludCkKLQotcHVibGljIHZvaWQgb25Hcm91cEV4cGFuZCgKLWludCkKLQotcHJvdGVjdGVkIHZvaWQgb25SZXN0b3JlSW5zdGFuY2VTdGF0ZSgKLWFuZHJvaWQub3MuQnVuZGxlKQotCi1wdWJsaWMgdm9pZCBzZXRMaXN0QWRhcHRlcigKLWFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0QWRhcHRlcikKLQotcHVibGljIGJvb2xlYW4gc2V0U2VsZWN0ZWRDaGlsZCgKLWludAotaW50Ci1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRTZWxlY3RlZEdyb3VwKAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9JQWN0aXZpdHlNYW5hZ2VyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTQxMDQgbmFtZSA9bnVsbCApCi0gY2xhc3MgYW5kcm9pZC5hcHAuSUFjdGl2aXR5TWFuYWdlciQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0lBY3Rpdml0eU1hbmFnZXIkQ29udGVudFByb3ZpZGVySG9sZGVyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExhbmRyb2lkL2FwcC9JQWN0aXZpdHlNYW5hZ2VyJENvbnRlbnRQcm92aWRlckhvbGRlcjs+OyApCi1maW5hbCBjbGFzcyBhbmRyb2lkLmFwcC5JQWN0aXZpdHlNYW5hZ2VyJENvbnRlbnRQcm92aWRlckhvbGRlciQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGFuZHJvaWQuYXBwLklBY3Rpdml0eU1hbmFnZXIkQ29udGVudFByb3ZpZGVySG9sZGVyIGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgYW5kcm9pZC5hcHAuSUFjdGl2aXR5TWFuYWdlciRDb250ZW50UHJvdmlkZXJIb2xkZXJbXSBuZXdBcnJheSgKLWludCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3RbXSBuZXdBcnJheSgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9Q29udGVudFByb3ZpZGVySG9sZGVyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9JQWN0aXZpdHlNYW5hZ2VyOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5hcHAuSUFjdGl2aXR5TWFuYWdlciRDb250ZW50UHJvdmlkZXJIb2xkZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExhbmRyb2lkL2FwcC9JQWN0aXZpdHlNYW5hZ2VyJENvbnRlbnRQcm92aWRlckhvbGRlcjs+OyApCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yIENSRUFUT1IKLQotcHVibGljIGZpbmFsIGFuZHJvaWQuY29udGVudC5wbS5Qcm92aWRlckluZm8gaW5mbwotCi1wdWJsaWMgYm9vbGVhbiBub1JlbGVhc2VOZWVkZWQKLQotcHVibGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgcGVybWlzc2lvbkZhaWx1cmUKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5JQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQucG0uUHJvdmlkZXJJbmZvKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQucG0uUHJvdmlkZXJJbmZvCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuUGFyY2VsCi1hbmRyb2lkLmFwcC5JQWN0aXZpdHlNYW5hZ2VyJDEpCi0KLXB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpCi0KLXB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0lBY3Rpdml0eVBlbmRpbmdSZXN1bHQkU3R1YjsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLmFwcC5JQWN0aXZpdHlQZW5kaW5nUmVzdWx0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuSUludGVyZmFjZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzZW5kUmVzdWx0KAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLkJ1bmRsZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPVByb3h5ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9JQWN0aXZpdHlQZW5kaW5nUmVzdWx0JFN0dWI7ICkKLSBjbGFzcyBhbmRyb2lkLmFwcC5JQWN0aXZpdHlQZW5kaW5nUmVzdWx0JFN0dWIkUHJveHkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5hcHAuSUFjdGl2aXR5UGVuZGluZ1Jlc3VsdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGFuZHJvaWQub3MuSUJpbmRlciBtUmVtb3RlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBzZW5kUmVzdWx0KAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLkJ1bmRsZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9hcHAvSUFjdGl2aXR5UGVuZGluZ1Jlc3VsdDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMDMzIG5hbWUgPVN0dWIgKQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9hcHAvSUFjdGl2aXR5UGVuZGluZ1Jlc3VsdCRTdHViJFByb3h5OyApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC5hcHAuSUFjdGl2aXR5UGVuZGluZ1Jlc3VsdCRTdHViIGV4dGVuZHMgYW5kcm9pZC5vcy5CaW5kZXIgaW1wbGVtZW50cyBhbmRyb2lkLmFwcC5JQWN0aXZpdHlQZW5kaW5nUmVzdWx0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVTQ1JJUFRPUgotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3NlbmRSZXN1bHQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuYXBwLklBY3Rpdml0eVBlbmRpbmdSZXN1bHQgYXNJbnRlcmZhY2UoCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gb25UcmFuc2FjdCgKLWludAotYW5kcm9pZC5vcy5QYXJjZWwKLWFuZHJvaWQub3MuUGFyY2VsCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9hcHAvSUFjdGl2aXR5V2F0Y2hlciRTdHViOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQuYXBwLklBY3Rpdml0eVdhdGNoZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5JSW50ZXJmYWNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGFjdGl2aXR5UmVzdW1pbmcoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gYWN0aXZpdHlTdGFydGluZygKLWFuZHJvaWQuY29udGVudC5JbnRlbnQKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBhcHBDcmFzaGVkKAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGFwcE5vdFJlc3BvbmRpbmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1Qcm94eSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9hcHAvSUFjdGl2aXR5V2F0Y2hlciRTdHViOyApCi0gY2xhc3MgYW5kcm9pZC5hcHAuSUFjdGl2aXR5V2F0Y2hlciRTdHViJFByb3h5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQuYXBwLklBY3Rpdml0eVdhdGNoZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLm9zLklCaW5kZXIgbVJlbW90ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuSUJpbmRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIGFjdGl2aXR5UmVzdW1pbmcoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gYWN0aXZpdHlTdGFydGluZygKLWFuZHJvaWQuY29udGVudC5JbnRlbnQKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBhcHBDcmFzaGVkKAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGFwcE5vdFJlc3BvbmRpbmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwMzMgbmFtZSA9U3R1YiApCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9JQWN0aXZpdHlXYXRjaGVyJFN0dWIkUHJveHk7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9JQWN0aXZpdHlXYXRjaGVyOyApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC5hcHAuSUFjdGl2aXR5V2F0Y2hlciRTdHViIGV4dGVuZHMgYW5kcm9pZC5vcy5CaW5kZXIgaW1wbGVtZW50cyBhbmRyb2lkLmFwcC5JQWN0aXZpdHlXYXRjaGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVTQ1JJUFRPUgotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2FjdGl2aXR5UmVzdW1pbmcKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9hY3Rpdml0eVN0YXJ0aW5nCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fYXBwQ3Jhc2hlZAotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2FwcE5vdFJlc3BvbmRpbmcKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuYXBwLklBY3Rpdml0eVdhdGNoZXIgYXNJbnRlcmZhY2UoCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gb25UcmFuc2FjdCgKLWludAotYW5kcm9pZC5vcy5QYXJjZWwKLWFuZHJvaWQub3MuUGFyY2VsCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9hcHAvSUFsYXJtTWFuYWdlciRTdHViOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQuYXBwLklBbGFybU1hbmFnZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5JSW50ZXJmYWNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlbW92ZSgKLWFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXQoCi1pbnQKLWxvbmcKLWFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRSZXBlYXRpbmcoCi1pbnQKLWxvbmcKLWxvbmcKLWFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRUaW1lWm9uZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1Qcm94eSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9hcHAvSUFsYXJtTWFuYWdlciRTdHViOyApCi0gY2xhc3MgYW5kcm9pZC5hcHAuSUFsYXJtTWFuYWdlciRTdHViJFByb3h5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQuYXBwLklBbGFybU1hbmFnZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLm9zLklCaW5kZXIgbVJlbW90ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuSUJpbmRlcikKLQotcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEludGVyZmFjZURlc2NyaXB0b3IoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcmVtb3ZlKAotYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldCgKLWludAotbG9uZwotYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldFJlcGVhdGluZygKLWludAotbG9uZwotbG9uZwotYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldFRpbWVab25lKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwMzMgbmFtZSA9U3R1YiApCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9JQWxhcm1NYW5hZ2VyJFN0dWIkUHJveHk7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9JQWxhcm1NYW5hZ2VyOyApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC5hcHAuSUFsYXJtTWFuYWdlciRTdHViIGV4dGVuZHMgYW5kcm9pZC5vcy5CaW5kZXIgaW1wbGVtZW50cyBhbmRyb2lkLmFwcC5JQWxhcm1NYW5hZ2VyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVTQ1JJUFRPUgotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3JlbW92ZQotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3NldAotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3NldFJlcGVhdGluZwotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3NldFRpbWVab25lCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmFwcC5JQWxhcm1NYW5hZ2VyIGFzSW50ZXJmYWNlKAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIG9uVHJhbnNhY3QoCi1pbnQKLWFuZHJvaWQub3MuUGFyY2VsCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0lJbnN0cnVtZW50YXRpb25XYXRjaGVyJFN0dWI7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5hcHAuSUluc3RydW1lbnRhdGlvbldhdGNoZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5JSW50ZXJmYWNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGluc3RydW1lbnRhdGlvbkZpbmlzaGVkKAotYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUKLWludAotYW5kcm9pZC5vcy5CdW5kbGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBpbnN0cnVtZW50YXRpb25TdGF0dXMoCi1hbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZQotaW50Ci1hbmRyb2lkLm9zLkJ1bmRsZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPVByb3h5ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9JSW5zdHJ1bWVudGF0aW9uV2F0Y2hlciRTdHViOyApCi0gY2xhc3MgYW5kcm9pZC5hcHAuSUluc3RydW1lbnRhdGlvbldhdGNoZXIkU3R1YiRQcm94eSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLmFwcC5JSW5zdHJ1bWVudGF0aW9uV2F0Y2hlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGFuZHJvaWQub3MuSUJpbmRlciBtUmVtb3RlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBpbnN0cnVtZW50YXRpb25GaW5pc2hlZCgKLWFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lCi1pbnQKLWFuZHJvaWQub3MuQnVuZGxlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgaW5zdHJ1bWVudGF0aW9uU3RhdHVzKAotYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUKLWludAotYW5kcm9pZC5vcy5CdW5kbGUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9hcHAvSUluc3RydW1lbnRhdGlvbldhdGNoZXIkU3R1YiRQcm94eTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0lJbnN0cnVtZW50YXRpb25XYXRjaGVyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwMzMgbmFtZSA9U3R1YiApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC5hcHAuSUluc3RydW1lbnRhdGlvbldhdGNoZXIkU3R1YiBleHRlbmRzIGFuZHJvaWQub3MuQmluZGVyIGltcGxlbWVudHMgYW5kcm9pZC5hcHAuSUluc3RydW1lbnRhdGlvbldhdGNoZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERVNDUklQVE9SCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05faW5zdHJ1bWVudGF0aW9uRmluaXNoZWQKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9pbnN0cnVtZW50YXRpb25TdGF0dXMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuYXBwLklJbnN0cnVtZW50YXRpb25XYXRjaGVyIGFzSW50ZXJmYWNlKAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIG9uVHJhbnNhY3QoCi1pbnQKLWFuZHJvaWQub3MuUGFyY2VsCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9JSW50ZW50UmVjZWl2ZXIkU3R1YjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1Qcm94eSApCi0gY2xhc3MgYW5kcm9pZC5hcHAuSUludGVudFJlY2VpdmVyJFN0dWIkUHJveHkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5hcHAuSUludGVudFJlY2VpdmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5JQmluZGVyIG1SZW1vdGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHBlcmZvcm1SZWNlaXZlKAotYW5kcm9pZC5jb250ZW50LkludGVudAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLkJ1bmRsZQotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9JSW50ZW50U2VuZGVyJFN0dWI7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5hcHAuSUludGVudFNlbmRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLklJbnRlcmZhY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCBzZW5kKAotaW50Ci1hbmRyb2lkLmNvbnRlbnQuSW50ZW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLmFwcC5JSW50ZW50UmVjZWl2ZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1Qcm94eSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9hcHAvSUludGVudFNlbmRlciRTdHViOyApCi0gY2xhc3MgYW5kcm9pZC5hcHAuSUludGVudFNlbmRlciRTdHViJFByb3h5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQuYXBwLklJbnRlbnRTZW5kZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLm9zLklCaW5kZXIgbVJlbW90ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuSUJpbmRlcikKLQotcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEludGVyZmFjZURlc2NyaXB0b3IoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGludCBzZW5kKAotaW50Ci1hbmRyb2lkLmNvbnRlbnQuSW50ZW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLmFwcC5JSW50ZW50UmVjZWl2ZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMDMzIG5hbWUgPVN0dWIgKQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9hcHAvSUludGVudFNlbmRlciRTdHViJFByb3h5OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9hcHAvSUludGVudFNlbmRlcjsgKQotcHVibGljIGFic3RyYWN0IGNsYXNzIGFuZHJvaWQuYXBwLklJbnRlbnRTZW5kZXIkU3R1YiBleHRlbmRzIGFuZHJvaWQub3MuQmluZGVyIGltcGxlbWVudHMgYW5kcm9pZC5hcHAuSUludGVudFNlbmRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFU0NSSVBUT1IKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9zZW5kCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmFwcC5JSW50ZW50U2VuZGVyIGFzSW50ZXJmYWNlKAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIG9uVHJhbnNhY3QoCi1pbnQKLWFuZHJvaWQub3MuUGFyY2VsCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0lOb3RpZmljYXRpb25NYW5hZ2VyJFN0dWI7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5hcHAuSU5vdGlmaWNhdGlvbk1hbmFnZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5JSW50ZXJmYWNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGNhbmNlbEFsbE5vdGlmaWNhdGlvbnMoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgY2FuY2VsTm90aWZpY2F0aW9uKAotamF2YS5sYW5nLlN0cmluZwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgY2FuY2VsVG9hc3QoCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLmFwcC5JVHJhbnNpZW50Tm90aWZpY2F0aW9uKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgZW5xdWV1ZU5vdGlmaWNhdGlvbigKLWphdmEubGFuZy5TdHJpbmcKLWludAotYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uCi1pbnRbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGVucXVldWVUb2FzdCgKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQuYXBwLklUcmFuc2llbnROb3RpZmljYXRpb24KLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPVByb3h5ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9JTm90aWZpY2F0aW9uTWFuYWdlciRTdHViOyApCi0gY2xhc3MgYW5kcm9pZC5hcHAuSU5vdGlmaWNhdGlvbk1hbmFnZXIkU3R1YiRQcm94eSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLmFwcC5JTm90aWZpY2F0aW9uTWFuYWdlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGFuZHJvaWQub3MuSUJpbmRlciBtUmVtb3RlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNhbmNlbEFsbE5vdGlmaWNhdGlvbnMoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY2FuY2VsTm90aWZpY2F0aW9uKAotamF2YS5sYW5nLlN0cmluZwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY2FuY2VsVG9hc3QoCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLmFwcC5JVHJhbnNpZW50Tm90aWZpY2F0aW9uKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgZW5xdWV1ZU5vdGlmaWNhdGlvbigKLWphdmEubGFuZy5TdHJpbmcKLWludAotYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uCi1pbnRbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGVucXVldWVUb2FzdCgKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQuYXBwLklUcmFuc2llbnROb3RpZmljYXRpb24KLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9hcHAvSU5vdGlmaWNhdGlvbk1hbmFnZXIkU3R1YiRQcm94eTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0lOb3RpZmljYXRpb25NYW5hZ2VyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwMzMgbmFtZSA9U3R1YiApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC5hcHAuSU5vdGlmaWNhdGlvbk1hbmFnZXIkU3R1YiBleHRlbmRzIGFuZHJvaWQub3MuQmluZGVyIGltcGxlbWVudHMgYW5kcm9pZC5hcHAuSU5vdGlmaWNhdGlvbk1hbmFnZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERVNDUklQVE9SCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fY2FuY2VsQWxsTm90aWZpY2F0aW9ucwotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2NhbmNlbE5vdGlmaWNhdGlvbgotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2NhbmNlbFRvYXN0Ci0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZW5xdWV1ZU5vdGlmaWNhdGlvbgotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2VucXVldWVUb2FzdAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5hcHAuSU5vdGlmaWNhdGlvbk1hbmFnZXIgYXNJbnRlcmZhY2UoCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gb25UcmFuc2FjdCgKLWludAotYW5kcm9pZC5vcy5QYXJjZWwKLWFuZHJvaWQub3MuUGFyY2VsCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9hcHAvSVNlYXJjaE1hbmFnZXIkU3R1YjsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLmFwcC5JU2VhcmNoTWFuYWdlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLklJbnRlcmZhY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQuc2VydmVyLnNlYXJjaC5TZWFyY2hhYmxlSW5mbyBnZXRTZWFyY2hhYmxlSW5mbygKLWFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lCi1ib29sZWFuKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9UHJveHkgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0lTZWFyY2hNYW5hZ2VyJFN0dWI7ICkKLSBjbGFzcyBhbmRyb2lkLmFwcC5JU2VhcmNoTWFuYWdlciRTdHViJFByb3h5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQuYXBwLklTZWFyY2hNYW5hZ2VyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5JQmluZGVyIG1SZW1vdGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhbmRyb2lkLnNlcnZlci5zZWFyY2guU2VhcmNoYWJsZUluZm8gZ2V0U2VhcmNoYWJsZUluZm8oCi1hbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZQotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9hcHAvSVNlYXJjaE1hbmFnZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0lTZWFyY2hNYW5hZ2VyJFN0dWIkUHJveHk7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAzMyBuYW1lID1TdHViICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBhbmRyb2lkLmFwcC5JU2VhcmNoTWFuYWdlciRTdHViIGV4dGVuZHMgYW5kcm9pZC5vcy5CaW5kZXIgaW1wbGVtZW50cyBhbmRyb2lkLmFwcC5JU2VhcmNoTWFuYWdlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFU0NSSVBUT1IKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9nZXRTZWFyY2hhYmxlSW5mbwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5hcHAuSVNlYXJjaE1hbmFnZXIgYXNJbnRlcmZhY2UoCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gb25UcmFuc2FjdCgKLWludAotYW5kcm9pZC5vcy5QYXJjZWwKLWFuZHJvaWQub3MuUGFyY2VsCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0lTZXJ2aWNlQ29ubmVjdGlvbiRTdHViOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPVByb3h5ICkKLSBjbGFzcyBhbmRyb2lkLmFwcC5JU2VydmljZUNvbm5lY3Rpb24kU3R1YiRQcm94eSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLmFwcC5JU2VydmljZUNvbm5lY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLm9zLklCaW5kZXIgbVJlbW90ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuSUJpbmRlcikKLQotcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjb25uZWN0ZWQoCi1hbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZQotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9JU3RhdHVzQmFyJFN0dWI7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5hcHAuSVN0YXR1c0JhciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLklJbnRlcmZhY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgYWN0aXZhdGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQub3MuSUJpbmRlciBhZGRJY29uKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBkZWFjdGl2YXRlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGRpc2FibGUoCi1pbnQKLWFuZHJvaWQub3MuSUJpbmRlcgotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlbW92ZUljb24oCi1hbmRyb2lkLm9zLklCaW5kZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB0b2dnbGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgdXBkYXRlSWNvbigKLWFuZHJvaWQub3MuSUJpbmRlcgotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1Qcm94eSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9hcHAvSVN0YXR1c0JhciRTdHViOyApCi0gY2xhc3MgYW5kcm9pZC5hcHAuSVN0YXR1c0JhciRTdHViJFByb3h5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQuYXBwLklTdGF0dXNCYXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLm9zLklCaW5kZXIgbVJlbW90ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuSUJpbmRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGFjdGl2YXRlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYWRkSWNvbigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50KQotCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgZGlzYWJsZSgKLWludAotYW5kcm9pZC5vcy5JQmluZGVyCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHJlbW92ZUljb24oCi1hbmRyb2lkLm9zLklCaW5kZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB0b2dnbGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgdXBkYXRlSWNvbigKLWFuZHJvaWQub3MuSUJpbmRlcgotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMDMzIG5hbWUgPVN0dWIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0lTdGF0dXNCYXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0lTdGF0dXNCYXIkU3R1YiRQcm94eTsgKQotcHVibGljIGFic3RyYWN0IGNsYXNzIGFuZHJvaWQuYXBwLklTdGF0dXNCYXIkU3R1YiBleHRlbmRzIGFuZHJvaWQub3MuQmluZGVyIGltcGxlbWVudHMgYW5kcm9pZC5hcHAuSVN0YXR1c0JhcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFU0NSSVBUT1IKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9hY3RpdmF0ZQotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2FkZEljb24KLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9kZWFjdGl2YXRlCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZGlzYWJsZQotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3JlbW92ZUljb24KLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl90b2dnbGUKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl91cGRhdGVJY29uCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmFwcC5JU3RhdHVzQmFyIGFzSW50ZXJmYWNlKAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIG9uVHJhbnNhY3QoCi1pbnQKLWFuZHJvaWQub3MuUGFyY2VsCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0lUaHVtYm5haWxSZWNlaXZlciRTdHViOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQuYXBwLklUaHVtYm5haWxSZWNlaXZlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLklJbnRlcmZhY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgZmluaXNoZWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgbmV3VGh1bWJuYWlsKAotaW50Ci1hbmRyb2lkLmdyYXBoaWNzLkJpdG1hcAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPVByb3h5ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9JVGh1bWJuYWlsUmVjZWl2ZXIkU3R1YjsgKQotIGNsYXNzIGFuZHJvaWQuYXBwLklUaHVtYm5haWxSZWNlaXZlciRTdHViJFByb3h5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQuYXBwLklUaHVtYm5haWxSZWNlaXZlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGFuZHJvaWQub3MuSUJpbmRlciBtUmVtb3RlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGZpbmlzaGVkKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBuZXdUaHVtYm5haWwoCi1pbnQKLWFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAzMyBuYW1lID1TdHViICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0lUaHVtYm5haWxSZWNlaXZlciRTdHViJFByb3h5OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9hcHAvSVRodW1ibmFpbFJlY2VpdmVyOyApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC5hcHAuSVRodW1ibmFpbFJlY2VpdmVyJFN0dWIgZXh0ZW5kcyBhbmRyb2lkLm9zLkJpbmRlciBpbXBsZW1lbnRzIGFuZHJvaWQuYXBwLklUaHVtYm5haWxSZWNlaXZlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFU0NSSVBUT1IKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9maW5pc2hlZAotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX25ld1RodW1ibmFpbAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5hcHAuSVRodW1ibmFpbFJlY2VpdmVyIGFzSW50ZXJmYWNlKAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIG9uVHJhbnNhY3QoCi1pbnQKLWFuZHJvaWQub3MuUGFyY2VsCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0lUcmFuc2llbnROb3RpZmljYXRpb24kU3R1YjsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLmFwcC5JVHJhbnNpZW50Tm90aWZpY2F0aW9uIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuSUludGVyZmFjZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBoaWRlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNob3coKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9JVHJhbnNpZW50Tm90aWZpY2F0aW9uJFN0dWI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9UHJveHkgKQotIGNsYXNzIGFuZHJvaWQuYXBwLklUcmFuc2llbnROb3RpZmljYXRpb24kU3R1YiRQcm94eSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLmFwcC5JVHJhbnNpZW50Tm90aWZpY2F0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5JQmluZGVyIG1SZW1vdGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGhpZGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2hvdygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9hcHAvSVRyYW5zaWVudE5vdGlmaWNhdGlvbiRTdHViJFByb3h5OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9hcHAvSVRyYW5zaWVudE5vdGlmaWNhdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMDMzIG5hbWUgPVN0dWIgKQotcHVibGljIGFic3RyYWN0IGNsYXNzIGFuZHJvaWQuYXBwLklUcmFuc2llbnROb3RpZmljYXRpb24kU3R1YiBleHRlbmRzIGFuZHJvaWQub3MuQmluZGVyIGltcGxlbWVudHMgYW5kcm9pZC5hcHAuSVRyYW5zaWVudE5vdGlmaWNhdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFU0NSSVBUT1IKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9oaWRlCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fc2hvdwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5hcHAuSVRyYW5zaWVudE5vdGlmaWNhdGlvbiBhc0ludGVyZmFjZSgKLWFuZHJvaWQub3MuSUJpbmRlcikKLQotcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBvblRyYW5zYWN0KAotaW50Ci1hbmRyb2lkLm9zLlBhcmNlbAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9JV2FsbHBhcGVyU2VydmljZSRTdHViOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQuYXBwLklXYWxscGFwZXJTZXJ2aWNlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuSUludGVyZmFjZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBjbGVhcldhbGxwYXBlcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldEhlaWdodEhpbnQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IgZ2V0V2FsbHBhcGVyKAotYW5kcm9pZC5hcHAuSVdhbGxwYXBlclNlcnZpY2VDYWxsYmFjaykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0V2lkdGhIaW50KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldERpbWVuc2lvbkhpbnRzKAotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciBzZXRXYWxscGFwZXIoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9JV2FsbHBhcGVyU2VydmljZSRTdHViOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPVByb3h5ICkKLSBjbGFzcyBhbmRyb2lkLmFwcC5JV2FsbHBhcGVyU2VydmljZSRTdHViJFByb3h5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQuYXBwLklXYWxscGFwZXJTZXJ2aWNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5JQmluZGVyIG1SZW1vdGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY2xlYXJXYWxscGFwZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXRIZWlnaHRIaW50KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciBnZXRXYWxscGFwZXIoCi1hbmRyb2lkLmFwcC5JV2FsbHBhcGVyU2VydmljZUNhbGxiYWNrKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXRXaWR0aEhpbnQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0RGltZW5zaW9uSGludHMoCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yIHNldFdhbGxwYXBlcigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMDMzIG5hbWUgPVN0dWIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0lXYWxscGFwZXJTZXJ2aWNlOyApCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9JV2FsbHBhcGVyU2VydmljZSRTdHViJFByb3h5OyApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC5hcHAuSVdhbGxwYXBlclNlcnZpY2UkU3R1YiBleHRlbmRzIGFuZHJvaWQub3MuQmluZGVyIGltcGxlbWVudHMgYW5kcm9pZC5hcHAuSVdhbGxwYXBlclNlcnZpY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERVNDUklQVE9SCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fY2xlYXJXYWxscGFwZXIKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9nZXRIZWlnaHRIaW50Ci0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZ2V0V2FsbHBhcGVyCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZ2V0V2lkdGhIaW50Ci0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fc2V0RGltZW5zaW9uSGludHMKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9zZXRXYWxscGFwZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuYXBwLklXYWxscGFwZXJTZXJ2aWNlIGFzSW50ZXJmYWNlKAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIG9uVHJhbnNhY3QoCi1pbnQKLWFuZHJvaWQub3MuUGFyY2VsCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9UHJveHkgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0lXYWxscGFwZXJTZXJ2aWNlQ2FsbGJhY2skU3R1YjsgKQotIGNsYXNzIGFuZHJvaWQuYXBwLklXYWxscGFwZXJTZXJ2aWNlQ2FsbGJhY2skU3R1YiRQcm94eSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLmFwcC5JV2FsbHBhcGVyU2VydmljZUNhbGxiYWNrCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5JQmluZGVyIG1SZW1vdGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIG9uV2FsbHBhcGVyQ2hhbmdlZCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0luc3RydW1lbnRhdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID00MTA0IG5hbWUgPW51bGwgKQotIGNsYXNzIGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbiQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPUNvbnRleHRNZW51UnVubmFibGUgKQotIGNsYXNzIGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbiQxQ29udGV4dE1lbnVSdW5uYWJsZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmxhbmcuUnVubmFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLmFwcC5BY3Rpdml0eSBhY3Rpdml0eQotCi1wcml2YXRlIGZpbmFsIGludCBmbGFncwotCi1wcml2YXRlIGZpbmFsIGludCBpZGVudGlmaWVyCi0KLSBib29sZWFuIHJldHVyblZhbHVlCi0KLWZpbmFsIGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbiB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb24KLWFuZHJvaWQuYXBwLkFjdGl2aXR5Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9TWVudVJ1bm5hYmxlICkKLSBjbGFzcyBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb24kMU1lbnVSdW5uYWJsZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmxhbmcuUnVubmFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLmFwcC5BY3Rpdml0eSBhY3Rpdml0eQotCi1wcml2YXRlIGZpbmFsIGludCBmbGFncwotCi1wcml2YXRlIGZpbmFsIGludCBpZGVudGlmaWVyCi0KLSBib29sZWFuIHJldHVyblZhbHVlCi0KLWZpbmFsIGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbiB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb24KLWFuZHJvaWQuYXBwLkFjdGl2aXR5Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE4IG5hbWUgPUFjdGl2aXR5R29pbmcgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0luc3RydW1lbnRhdGlvbjsgKQotZmluYWwgY2xhc3MgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uJEFjdGl2aXR5R29pbmcgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5NZXNzYWdlUXVldWUkSWRsZUhhbmRsZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb24kQWN0aXZpdHlXYWl0ZXIgbVdhaXRlcgotCi1maW5hbCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb24gdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uCi1hbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb24kQWN0aXZpdHlXYWl0ZXIpCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIHF1ZXVlSWRsZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPUFjdGl2aXR5TW9uaXRvciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9hcHAvSW5zdHJ1bWVudGF0aW9uOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uJEFjdGl2aXR5TW9uaXRvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1CbG9jawotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgbUNsYXNzCi0KLSBpbnQgbUhpdHMKLQotIGFuZHJvaWQuYXBwLkFjdGl2aXR5IG1MYXN0QWN0aXZpdHkKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb24kQWN0aXZpdHlSZXN1bHQgbVJlc3VsdAotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXIgbVdoaWNoCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcgotYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uJEFjdGl2aXR5UmVzdWx0Ci1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb24kQWN0aXZpdHlSZXN1bHQKLWJvb2xlYW4pCi0KLXB1YmxpYyBmaW5hbCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyIGdldEZpbHRlcigpCi0KLXB1YmxpYyBmaW5hbCBpbnQgZ2V0SGl0cygpCi0KLXB1YmxpYyBmaW5hbCBhbmRyb2lkLmFwcC5BY3Rpdml0eSBnZXRMYXN0QWN0aXZpdHkoKQotCi1wdWJsaWMgZmluYWwgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uJEFjdGl2aXR5UmVzdWx0IGdldFJlc3VsdCgpCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGlzQmxvY2tpbmcoKQotCi1maW5hbCBib29sZWFuIG1hdGNoKAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQuYXBwLkFjdGl2aXR5Ci1hbmRyb2lkLmNvbnRlbnQuSW50ZW50KQotCi1wdWJsaWMgZmluYWwgYW5kcm9pZC5hcHAuQWN0aXZpdHkgd2FpdEZvckFjdGl2aXR5KCkKLQotcHVibGljIGZpbmFsIGFuZHJvaWQuYXBwLkFjdGl2aXR5IHdhaXRGb3JBY3Rpdml0eVdpdGhUaW1lb3V0KAotbG9uZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9hcHAvSW5zdHJ1bWVudGF0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI1IG5hbWUgPUFjdGl2aXR5UmVzdWx0ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb24kQWN0aXZpdHlSZXN1bHQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgaW50IG1SZXN1bHRDb2RlCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5jb250ZW50LkludGVudCBtUmVzdWx0RGF0YQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotYW5kcm9pZC5jb250ZW50LkludGVudCkKLQotcHVibGljIGludCBnZXRSZXN1bHRDb2RlKCkKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5JbnRlbnQgZ2V0UmVzdWx0RGF0YSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0luc3RydW1lbnRhdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNiBuYW1lID1BY3Rpdml0eVdhaXRlciApCi1maW5hbCBjbGFzcyBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb24kQWN0aXZpdHlXYWl0ZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhbmRyb2lkLmFwcC5BY3Rpdml0eSBhY3Rpdml0eQotCi1wdWJsaWMgZmluYWwgYW5kcm9pZC5jb250ZW50LkludGVudCBpbnRlbnQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9JbnN0cnVtZW50YXRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjYgbmFtZSA9RW1wdHlSdW5uYWJsZSApCi1maW5hbCBjbGFzcyBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb24kRW1wdHlSdW5uYWJsZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmxhbmcuUnVubmFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uJDEpCi0KLXB1YmxpYyB2b2lkIHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNiBuYW1lID1JZGxlciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9hcHAvSW5zdHJ1bWVudGF0aW9uOyApCi1maW5hbCBjbGFzcyBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb24kSWRsZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5NZXNzYWdlUXVldWUkSWRsZUhhbmRsZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuUnVubmFibGUgbUNhbGxiYWNrCi0KLXByaXZhdGUgYm9vbGVhbiBtSWRsZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5SdW5uYWJsZSkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gcXVldWVJZGxlKCkKLQotcHVibGljIHZvaWQgd2FpdEZvcklkbGUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9JbnN0cnVtZW50YXRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTggbmFtZSA9SW5zdHJ1bWVudGF0aW9uVGhyZWFkICkKLWZpbmFsIGNsYXNzIGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbiRJbnN0cnVtZW50YXRpb25UaHJlYWQgZXh0ZW5kcyBqYXZhLmxhbmcuVGhyZWFkCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbiB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb24KLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNiBuYW1lID1TeW5jUnVubmFibGUgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0luc3RydW1lbnRhdGlvbjsgKQotZmluYWwgY2xhc3MgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uJFN5bmNSdW5uYWJsZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmxhbmcuUnVubmFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBib29sZWFuIG1Db21wbGV0ZQotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5SdW5uYWJsZSBtVGFyZ2V0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlJ1bm5hYmxlKQotCi1wdWJsaWMgdm9pZCBydW4oKQotCi1wdWJsaWMgdm9pZCB3YWl0Rm9yQ29tcGxldGUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0luc3RydW1lbnRhdGlvbiQxO0xhbmRyb2lkL2FwcC9JbnN0cnVtZW50YXRpb24kSWRsZXI7TGFuZHJvaWQvYXBwL0luc3RydW1lbnRhdGlvbiRBY3Rpdml0eUdvaW5nO0xhbmRyb2lkL2FwcC9JbnN0cnVtZW50YXRpb24kQWN0aXZpdHlXYWl0ZXI7TGFuZHJvaWQvYXBwL0luc3RydW1lbnRhdGlvbiRTeW5jUnVubmFibGU7TGFuZHJvaWQvYXBwL0luc3RydW1lbnRhdGlvbiRFbXB0eVJ1bm5hYmxlO0xhbmRyb2lkL2FwcC9JbnN0cnVtZW50YXRpb24kSW5zdHJ1bWVudGF0aW9uVGhyZWFkO0xhbmRyb2lkL2FwcC9JbnN0cnVtZW50YXRpb24kQWN0aXZpdHlSZXN1bHQ7TGFuZHJvaWQvYXBwL0luc3RydW1lbnRhdGlvbiRBY3Rpdml0eU1vbml0b3I7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSRVBPUlRfS0VZX0lERU5USUZJRVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFJFUE9SVF9LRVlfU1RSRUFNUkVTVUxUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEFHCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL2FwcC9JbnN0cnVtZW50YXRpb24kQWN0aXZpdHlNb25pdG9yOz47ICkKLXByaXZhdGUgamF2YS51dGlsLkxpc3QgbUFjdGl2aXR5TW9uaXRvcnMKLQotcHJpdmF0ZSBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBtQXBwQ29udGV4dAotCi1wcml2YXRlIGJvb2xlYW4gbUF1dG9tYXRpY1BlcmZvcm1hbmNlU25hcHNob3RzCi0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUgbUNvbXBvbmVudAotCi1wcml2YXRlIGFuZHJvaWQuY29udGVudC5Db250ZXh0IG1JbnN0ckNvbnRleHQKLQotcHJpdmF0ZSBhbmRyb2lkLm9zLk1lc3NhZ2VRdWV1ZSBtTWVzc2FnZVF1ZXVlCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5CdW5kbGUgbVBlcmZNZXRyaWNzCi0KLXByaXZhdGUgbG9uZyBtUHJlQ3B1VGltZQotCi1wcml2YXRlIGFuZHJvaWQub3MuQnVuZGxlIG1QcmVQZXJmTWV0cmljcwotCi1wcml2YXRlIGphdmEubGFuZy5UaHJlYWQgbVJ1bm5lcgotCi1wcml2YXRlIGxvbmcgbVN0YXJ0Ci0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLk9iamVjdCBtU3luYwotCi1wcml2YXRlIGFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkIG1UaHJlYWQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0xpc3Q8TGFuZHJvaWQvYXBwL0luc3RydW1lbnRhdGlvbiRBY3Rpdml0eVdhaXRlcjs+OyApCi1wcml2YXRlIGphdmEudXRpbC5MaXN0IG1XYWl0aW5nQWN0aXZpdGllcwotCi1wcml2YXRlIGFuZHJvaWQuYXBwLklJbnN0cnVtZW50YXRpb25XYXRjaGVyIG1XYXRjaGVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDEwMCgKLWFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbikKLQotc3RhdGljIGphdmEubGFuZy5PYmplY3QgYWNjZXNzJDIwMCgKLWFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbikKLQotc3RhdGljIGphdmEudXRpbC5MaXN0IGFjY2VzcyQzMDAoCi1hbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb24pCi0KLXByaXZhdGUgdm9pZCBhZGRQZXJmTWV0cmljSW50KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wcml2YXRlIHZvaWQgYWRkUGVyZk1ldHJpY0xvbmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1sb25nKQotCi1wcml2YXRlIHZvaWQgYWRkVmFsdWUoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWFuZHJvaWQub3MuQnVuZGxlKQotCi1zdGF0aWMgdm9pZCBjaGVja1N0YXJ0QWN0aXZpdHlSZXN1bHQoCi1pbnQKLWFuZHJvaWQuY29udGVudC5JbnRlbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbnN0YW50aWF0aW9uRXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbjtMamF2YS9sYW5nL0NsYXNzTm90Rm91bmRFeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9DbGFzczwqPjtMYW5kcm9pZC9jb250ZW50L0NvbnRleHQ7KUxhbmRyb2lkL2FwcC9BcHBsaWNhdGlvbjsgKQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmFwcC5BcHBsaWNhdGlvbiBuZXdBcHBsaWNhdGlvbigKLWphdmEubGFuZy5DbGFzcwotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXByaXZhdGUgZmluYWwgdm9pZCB2YWxpZGF0ZU5vdEFwcFRocmVhZCgpCi0KLXB1YmxpYyBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb24kQWN0aXZpdHlNb25pdG9yIGFkZE1vbml0b3IoCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyCi1hbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb24kQWN0aXZpdHlSZXN1bHQKLWJvb2xlYW4pCi0KLXB1YmxpYyBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb24kQWN0aXZpdHlNb25pdG9yIGFkZE1vbml0b3IoCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb24kQWN0aXZpdHlSZXN1bHQKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIGFkZE1vbml0b3IoCi1hbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb24kQWN0aXZpdHlNb25pdG9yKQotCi1wdWJsaWMgdm9pZCBjYWxsQWN0aXZpdHlPbkNyZWF0ZSgKLWFuZHJvaWQuYXBwLkFjdGl2aXR5Ci1hbmRyb2lkLm9zLkJ1bmRsZSkKLQotcHVibGljIHZvaWQgY2FsbEFjdGl2aXR5T25EZXN0cm95KAotYW5kcm9pZC5hcHAuQWN0aXZpdHkpCi0KLXB1YmxpYyB2b2lkIGNhbGxBY3Rpdml0eU9uTmV3SW50ZW50KAotYW5kcm9pZC5hcHAuQWN0aXZpdHkKLWFuZHJvaWQuY29udGVudC5JbnRlbnQpCi0KLXB1YmxpYyB2b2lkIGNhbGxBY3Rpdml0eU9uUGF1c2UoCi1hbmRyb2lkLmFwcC5BY3Rpdml0eSkKLQotcHVibGljIHZvaWQgY2FsbEFjdGl2aXR5T25Qb3N0Q3JlYXRlKAotYW5kcm9pZC5hcHAuQWN0aXZpdHkKLWFuZHJvaWQub3MuQnVuZGxlKQotCi1wdWJsaWMgdm9pZCBjYWxsQWN0aXZpdHlPblJlc3RhcnQoCi1hbmRyb2lkLmFwcC5BY3Rpdml0eSkKLQotcHVibGljIHZvaWQgY2FsbEFjdGl2aXR5T25SZXN0b3JlSW5zdGFuY2VTdGF0ZSgKLWFuZHJvaWQuYXBwLkFjdGl2aXR5Ci1hbmRyb2lkLm9zLkJ1bmRsZSkKLQotcHVibGljIHZvaWQgY2FsbEFjdGl2aXR5T25SZXN1bWUoCi1hbmRyb2lkLmFwcC5BY3Rpdml0eSkKLQotcHVibGljIHZvaWQgY2FsbEFjdGl2aXR5T25TYXZlSW5zdGFuY2VTdGF0ZSgKLWFuZHJvaWQuYXBwLkFjdGl2aXR5Ci1hbmRyb2lkLm9zLkJ1bmRsZSkKLQotcHVibGljIHZvaWQgY2FsbEFjdGl2aXR5T25TdGFydCgKLWFuZHJvaWQuYXBwLkFjdGl2aXR5KQotCi1wdWJsaWMgdm9pZCBjYWxsQWN0aXZpdHlPblN0b3AoCi1hbmRyb2lkLmFwcC5BY3Rpdml0eSkKLQotcHVibGljIHZvaWQgY2FsbEFwcGxpY2F0aW9uT25DcmVhdGUoCi1hbmRyb2lkLmFwcC5BcHBsaWNhdGlvbikKLQotcHVibGljIGJvb2xlYW4gY2hlY2tNb25pdG9ySGl0KAotYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uJEFjdGl2aXR5TW9uaXRvcgotaW50KQotCi1wdWJsaWMgdm9pZCBlbmRQZXJmb3JtYW5jZVNuYXBzaG90KCkKLQotcHVibGljIGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbiRBY3Rpdml0eVJlc3VsdCBleGVjU3RhcnRBY3Rpdml0eSgKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLm9zLklCaW5kZXIKLWFuZHJvaWQub3MuSUJpbmRlcgotYW5kcm9pZC5hcHAuQWN0aXZpdHkKLWFuZHJvaWQuY29udGVudC5JbnRlbnQKLWludCkKLQotcHVibGljIHZvaWQgZmluaXNoKAotaW50Ci1hbmRyb2lkLm9zLkJ1bmRsZSkKLQotcHVibGljIGFuZHJvaWQub3MuQnVuZGxlIGdldEFsbG9jQ291bnRzKCkKLQotcHVibGljIGFuZHJvaWQub3MuQnVuZGxlIGdldEJpbmRlckNvdW50cygpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSBnZXRDb21wb25lbnROYW1lKCkKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5Db250ZXh0IGdldENvbnRleHQoKQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgZ2V0VGFyZ2V0Q29udGV4dCgpCi0KLWZpbmFsIHZvaWQgaW5pdCgKLWFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lCi1hbmRyb2lkLmFwcC5JSW5zdHJ1bWVudGF0aW9uV2F0Y2hlcikKLQotcHVibGljIGJvb2xlYW4gaW52b2tlQ29udGV4dE1lbnVBY3Rpb24oCi1hbmRyb2lkLmFwcC5BY3Rpdml0eQotaW50Ci1pbnQpCi0KLXB1YmxpYyBib29sZWFuIGludm9rZU1lbnVBY3Rpb25TeW5jKAotYW5kcm9pZC5hcHAuQWN0aXZpdHkKLWludAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBpc1Byb2ZpbGluZygpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvQ2xhc3M8Kj47TGFuZHJvaWQvY29udGVudC9Db250ZXh0O0xhbmRyb2lkL29zL0lCaW5kZXI7TGFuZHJvaWQvYXBwL0FwcGxpY2F0aW9uO0xhbmRyb2lkL2NvbnRlbnQvSW50ZW50O0xhbmRyb2lkL2NvbnRlbnQvcG0vQWN0aXZpdHlJbmZvO0xqYXZhL2xhbmcvQ2hhclNlcXVlbmNlO0xhbmRyb2lkL2FwcC9BY3Rpdml0eTtMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL09iamVjdDspTGFuZHJvaWQvYXBwL0FjdGl2aXR5OyApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbnN0YW50aWF0aW9uRXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbjsgKQotcHVibGljIGFuZHJvaWQuYXBwLkFjdGl2aXR5IG5ld0FjdGl2aXR5KAotamF2YS5sYW5nLkNsYXNzCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC5vcy5JQmluZGVyCi1hbmRyb2lkLmFwcC5BcHBsaWNhdGlvbgotYW5kcm9pZC5jb250ZW50LkludGVudAotYW5kcm9pZC5jb250ZW50LnBtLkFjdGl2aXR5SW5mbwotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotYW5kcm9pZC5hcHAuQWN0aXZpdHkKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbnN0YW50aWF0aW9uRXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbjtMamF2YS9sYW5nL0NsYXNzTm90Rm91bmRFeGNlcHRpb247ICkKLXB1YmxpYyBhbmRyb2lkLmFwcC5BY3Rpdml0eSBuZXdBY3Rpdml0eSgKLWphdmEubGFuZy5DbGFzc0xvYWRlcgotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5jb250ZW50LkludGVudCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0luc3RhbnRpYXRpb25FeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsQWNjZXNzRXhjZXB0aW9uO0xqYXZhL2xhbmcvQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHVibGljIGFuZHJvaWQuYXBwLkFwcGxpY2F0aW9uIG5ld0FwcGxpY2F0aW9uKAotamF2YS5sYW5nLkNsYXNzTG9hZGVyCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotcHVibGljIHZvaWQgb25DcmVhdGUoCi1hbmRyb2lkLm9zLkJ1bmRsZSkKLQotcHVibGljIHZvaWQgb25EZXN0cm95KCkKLQotcHVibGljIGJvb2xlYW4gb25FeGNlcHRpb24oCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1wdWJsaWMgdm9pZCBvblN0YXJ0KCkKLQotcHVibGljIHZvaWQgcmVtb3ZlTW9uaXRvcigKLWFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbiRBY3Rpdml0eU1vbml0b3IpCi0KLXB1YmxpYyB2b2lkIHJ1bk9uTWFpblN5bmMoCi1qYXZhLmxhbmcuUnVubmFibGUpCi0KLXB1YmxpYyB2b2lkIHNlbmRDaGFyYWN0ZXJTeW5jKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZW5kS2V5RG93blVwU3luYygKLWludCkKLQotcHVibGljIHZvaWQgc2VuZEtleVN5bmMoCi1hbmRyb2lkLnZpZXcuS2V5RXZlbnQpCi0KLXB1YmxpYyB2b2lkIHNlbmRQb2ludGVyU3luYygKLWFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCkKLQotcHVibGljIHZvaWQgc2VuZFN0YXR1cygKLWludAotYW5kcm9pZC5vcy5CdW5kbGUpCi0KLXB1YmxpYyB2b2lkIHNlbmRTdHJpbmdTeW5jKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2VuZFRyYWNrYmFsbEV2ZW50U3luYygKLWFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCkKLQotcHVibGljIHZvaWQgc2V0QXV0b21hdGljUGVyZm9ybWFuY2VTbmFwc2hvdHMoKQotCi1wdWJsaWMgdm9pZCBzZXRJblRvdWNoTW9kZSgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHN0YXJ0KCkKLQotcHVibGljIGFuZHJvaWQuYXBwLkFjdGl2aXR5IHN0YXJ0QWN0aXZpdHlTeW5jKAotYW5kcm9pZC5jb250ZW50LkludGVudCkKLQotcHVibGljIHZvaWQgc3RhcnRBbGxvY0NvdW50aW5nKCkKLQotcHVibGljIHZvaWQgc3RhcnRQZXJmb3JtYW5jZVNuYXBzaG90KCkKLQotcHVibGljIHZvaWQgc3RhcnRQcm9maWxpbmcoKQotCi1wdWJsaWMgdm9pZCBzdG9wQWxsb2NDb3VudGluZygpCi0KLXB1YmxpYyB2b2lkIHN0b3BQcm9maWxpbmcoKQotCi1wdWJsaWMgdm9pZCB3YWl0Rm9ySWRsZSgKLWphdmEubGFuZy5SdW5uYWJsZSkKLQotcHVibGljIHZvaWQgd2FpdEZvcklkbGVTeW5jKCkKLQotcHVibGljIGFuZHJvaWQuYXBwLkFjdGl2aXR5IHdhaXRGb3JNb25pdG9yKAotYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uJEFjdGl2aXR5TW9uaXRvcikKLQotcHVibGljIGFuZHJvaWQuYXBwLkFjdGl2aXR5IHdhaXRGb3JNb25pdG9yV2l0aFRpbWVvdXQoCi1hbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb24kQWN0aXZpdHlNb25pdG9yCi1sb25nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQudXRpbC5BbmRyb2lkUnVudGltZUV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLkV4Y2VwdGlvbikKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLWZpbmFsIGNsYXNzIGFuZHJvaWQuYXBwLkludGVudFJlY2VpdmVyTGVha2VkIGV4dGVuZHMgYW5kcm9pZC51dGlsLkFuZHJvaWRSdW50aW1lRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3ZpZXcvSU9uS2V5Z3VhcmRFeGl0UmVzdWx0JFN0dWI7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC52aWV3LklPbktleWd1YXJkRXhpdFJlc3VsdCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLklJbnRlcmZhY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgb25LZXlndWFyZEV4aXRSZXN1bHQoCi1ib29sZWFuKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3ZpZXcvSU9uS2V5Z3VhcmRFeGl0UmVzdWx0OyApCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3ZpZXcvSU9uS2V5Z3VhcmRFeGl0UmVzdWx0JFN0dWIkUHJveHk7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAzMyBuYW1lID1TdHViICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBhbmRyb2lkLnZpZXcuSU9uS2V5Z3VhcmRFeGl0UmVzdWx0JFN0dWIgZXh0ZW5kcyBhbmRyb2lkLm9zLkJpbmRlciBpbXBsZW1lbnRzIGFuZHJvaWQudmlldy5JT25LZXlndWFyZEV4aXRSZXN1bHQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERVNDUklQVE9SCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fb25LZXlndWFyZEV4aXRSZXN1bHQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQudmlldy5JT25LZXlndWFyZEV4aXRSZXN1bHQgYXNJbnRlcmZhY2UoCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gb25UcmFuc2FjdCgKLWludAotYW5kcm9pZC5vcy5QYXJjZWwKLWFuZHJvaWQub3MuUGFyY2VsCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotIGNsYXNzIGFuZHJvaWQuYXBwLktleWd1YXJkTWFuYWdlciQxIGV4dGVuZHMgYW5kcm9pZC52aWV3LklPbktleWd1YXJkRXhpdFJlc3VsdCRTdHViCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQuYXBwLktleWd1YXJkTWFuYWdlciB0aGlzJDAKLQotZmluYWwgYW5kcm9pZC5hcHAuS2V5Z3VhcmRNYW5hZ2VyJE9uS2V5Z3VhcmRFeGl0UmVzdWx0IHZhbCRjYWxsYmFjawotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQuYXBwLktleWd1YXJkTWFuYWdlcgotYW5kcm9pZC5hcHAuS2V5Z3VhcmRNYW5hZ2VyJE9uS2V5Z3VhcmRFeGl0UmVzdWx0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgb25LZXlndWFyZEV4aXRSZXN1bHQoCi1ib29sZWFuKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9LZXlndWFyZE1hbmFnZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MSBuYW1lID1LZXlndWFyZExvY2sgKQotcHVibGljIGNsYXNzIGFuZHJvaWQuYXBwLktleWd1YXJkTWFuYWdlciRLZXlndWFyZExvY2sgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtVGFnCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5JQmluZGVyIG1Ub2tlbgotCi1maW5hbCBhbmRyb2lkLmFwcC5LZXlndWFyZE1hbmFnZXIgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5hcHAuS2V5Z3VhcmRNYW5hZ2VyCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBkaXNhYmxlS2V5Z3VhcmQoKQotCi1wdWJsaWMgdm9pZCByZWVuYWJsZUtleWd1YXJkKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9T25LZXlndWFyZEV4aXRSZXN1bHQgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0tleWd1YXJkTWFuYWdlcjsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLmFwcC5LZXlndWFyZE1hbmFnZXIkT25LZXlndWFyZEV4aXRSZXN1bHQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgb25LZXlndWFyZEV4aXRSZXN1bHQoCi1ib29sZWFuKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0tleWd1YXJkTWFuYWdlciRPbktleWd1YXJkRXhpdFJlc3VsdDtMYW5kcm9pZC9hcHAvS2V5Z3VhcmRNYW5hZ2VyJEtleWd1YXJkTG9jazsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQuYXBwLktleWd1YXJkTWFuYWdlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLnZpZXcuSVdpbmRvd01hbmFnZXIgbVdNCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotc3RhdGljIGFuZHJvaWQudmlldy5JV2luZG93TWFuYWdlciBhY2Nlc3MkMDAwKAotYW5kcm9pZC5hcHAuS2V5Z3VhcmRNYW5hZ2VyKQotCi1wdWJsaWMgdm9pZCBleGl0S2V5Z3VhcmRTZWN1cmVseSgKLWFuZHJvaWQuYXBwLktleWd1YXJkTWFuYWdlciRPbktleWd1YXJkRXhpdFJlc3VsdCkKLQotcHVibGljIGJvb2xlYW4gaW5LZXlndWFyZFJlc3RyaWN0ZWRJbnB1dE1vZGUoKQotCi1wdWJsaWMgYW5kcm9pZC5hcHAuS2V5Z3VhcmRNYW5hZ2VyJEtleWd1YXJkTG9jayBuZXdLZXlndWFyZExvY2soCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9MYXVuY2hlckFjdGl2aXR5OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTQxMDQgbmFtZSA9bnVsbCApCi0gY2xhc3MgYW5kcm9pZC5hcHAuTGF1bmNoZXJBY3Rpdml0eSQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvRmlsdGVyJDE7TGFuZHJvaWQvd2lkZ2V0L0ZpbHRlciRSZXF1ZXN0QXJndW1lbnRzO0xhbmRyb2lkL3dpZGdldC9GaWx0ZXIkUmVzdWx0c0hhbmRsZXI7TGFuZHJvaWQvd2lkZ2V0L0ZpbHRlciRSZXF1ZXN0SGFuZGxlcjtMYW5kcm9pZC93aWRnZXQvRmlsdGVyJEZpbHRlckxpc3RlbmVyO0xhbmRyb2lkL3dpZGdldC9GaWx0ZXIkRmlsdGVyUmVzdWx0czsgKQotcHVibGljIGFic3RyYWN0IGNsYXNzIGFuZHJvaWQud2lkZ2V0LkZpbHRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZJTFRFUl9UT0tFTgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRklOSVNIX1RPS0VOCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEhSRUFEX05BTUUKLQotcHJpdmF0ZSBhbmRyb2lkLm9zLkhhbmRsZXIgbVJlc3VsdEhhbmRsZXIKLQotcHJpdmF0ZSBhbmRyb2lkLm9zLkhhbmRsZXIgbVRocmVhZEhhbmRsZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1zdGF0aWMgYW5kcm9pZC5vcy5IYW5kbGVyIGFjY2VzcyQyMDAoCi1hbmRyb2lkLndpZGdldC5GaWx0ZXIpCi0KLXN0YXRpYyBhbmRyb2lkLm9zLkhhbmRsZXIgYWNjZXNzJDMwMCgKLWFuZHJvaWQud2lkZ2V0LkZpbHRlcikKLQotc3RhdGljIGFuZHJvaWQub3MuSGFuZGxlciBhY2Nlc3MkMzAyKAotYW5kcm9pZC53aWRnZXQuRmlsdGVyCi1hbmRyb2lkLm9zLkhhbmRsZXIpCi0KLXB1YmxpYyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIGNvbnZlcnRSZXN1bHRUb1N0cmluZygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIGZpbHRlcigKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIGZpbHRlcigKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWFuZHJvaWQud2lkZ2V0LkZpbHRlciRGaWx0ZXJMaXN0ZW5lcikKLQotcHJvdGVjdGVkIGFic3RyYWN0IGFuZHJvaWQud2lkZ2V0LkZpbHRlciRGaWx0ZXJSZXN1bHRzIHBlcmZvcm1GaWx0ZXJpbmcoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotCi1wcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwdWJsaXNoUmVzdWx0cygKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWFuZHJvaWQud2lkZ2V0LkZpbHRlciRGaWx0ZXJSZXN1bHRzKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9MYXVuY2hlckFjdGl2aXR5JEFjdGl2aXR5QWRhcHRlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPUFycmF5RmlsdGVyICkKLSBjbGFzcyBhbmRyb2lkLmFwcC5MYXVuY2hlckFjdGl2aXR5JEFjdGl2aXR5QWRhcHRlciRBcnJheUZpbHRlciBleHRlbmRzIGFuZHJvaWQud2lkZ2V0LkZpbHRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLmFwcC5MYXVuY2hlckFjdGl2aXR5JEFjdGl2aXR5QWRhcHRlciB0aGlzJDEKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5hcHAuTGF1bmNoZXJBY3Rpdml0eSRBY3Rpdml0eUFkYXB0ZXIpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQuYXBwLkxhdW5jaGVyQWN0aXZpdHkkQWN0aXZpdHlBZGFwdGVyCi1hbmRyb2lkLmFwcC5MYXVuY2hlckFjdGl2aXR5JDEpCi0KLXByb3RlY3RlZCBhbmRyb2lkLndpZGdldC5GaWx0ZXIkRmlsdGVyUmVzdWx0cyBwZXJmb3JtRmlsdGVyaW5nKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotcHJvdGVjdGVkIHZvaWQgcHVibGlzaFJlc3VsdHMoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1hbmRyb2lkLndpZGdldC5GaWx0ZXIkRmlsdGVyUmVzdWx0cykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC53aWRnZXQuQWRhcHRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUdOT1JFX0lURU1fVklFV19UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PX1NFTEVDVElPTgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0Q291bnQoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLk9iamVjdCBnZXRJdGVtKAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgbG9uZyBnZXRJdGVtSWQoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0SXRlbVZpZXdUeXBlKAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC52aWV3LlZpZXcgZ2V0VmlldygKLWludAotYW5kcm9pZC52aWV3LlZpZXcKLWFuZHJvaWQudmlldy5WaWV3R3JvdXApCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0Vmlld1R5cGVDb3VudCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGhhc1N0YWJsZUlkcygpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzRW1wdHkoKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCByZWdpc3RlckRhdGFTZXRPYnNlcnZlcigKLWFuZHJvaWQuZGF0YWJhc2UuRGF0YVNldE9ic2VydmVyKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB1bnJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKAotYW5kcm9pZC5kYXRhYmFzZS5EYXRhU2V0T2JzZXJ2ZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQud2lkZ2V0Lkxpc3RBZGFwdGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBhcmVBbGxJdGVtc0VuYWJsZWQoKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0VuYWJsZWQoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQud2lkZ2V0LlNwaW5uZXJBZGFwdGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC52aWV3LlZpZXcgZ2V0RHJvcERvd25WaWV3KAotaW50Ci1hbmRyb2lkLnZpZXcuVmlldwotYW5kcm9pZC52aWV3LlZpZXdHcm91cCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBhbmRyb2lkLndpZGdldC5CYXNlQWRhcHRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlciwgYW5kcm9pZC53aWRnZXQuU3Bpbm5lckFkYXB0ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFTZXRPYnNlcnZhYmxlIG1EYXRhU2V0T2JzZXJ2YWJsZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBib29sZWFuIGFyZUFsbEl0ZW1zRW5hYmxlZCgpCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuVmlldyBnZXREcm9wRG93blZpZXcoCi1pbnQKLWFuZHJvaWQudmlldy5WaWV3Ci1hbmRyb2lkLnZpZXcuVmlld0dyb3VwKQotCi1wdWJsaWMgaW50IGdldEl0ZW1WaWV3VHlwZSgKLWludCkKLQotcHVibGljIGludCBnZXRWaWV3VHlwZUNvdW50KCkKLQotcHVibGljIGJvb2xlYW4gaGFzU3RhYmxlSWRzKCkKLQotcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpCi0KLXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgKLWludCkKLQotcHVibGljIHZvaWQgbm90aWZ5RGF0YVNldENoYW5nZWQoKQotCi1wdWJsaWMgdm9pZCBub3RpZnlEYXRhU2V0SW52YWxpZGF0ZWQoKQotCi1wdWJsaWMgdm9pZCByZWdpc3RlckRhdGFTZXRPYnNlcnZlcigKLWFuZHJvaWQuZGF0YWJhc2UuRGF0YVNldE9ic2VydmVyKQotCi1wdWJsaWMgdm9pZCB1bnJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKAotYW5kcm9pZC5kYXRhYmFzZS5EYXRhU2V0T2JzZXJ2ZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQud2lkZ2V0LkZpbHRlcmFibGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQud2lkZ2V0LkZpbHRlciBnZXRGaWx0ZXIoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9MYXVuY2hlckFjdGl2aXR5OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTIgbmFtZSA9QWN0aXZpdHlBZGFwdGVyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0xhdW5jaGVyQWN0aXZpdHkkQWN0aXZpdHlBZGFwdGVyJEFycmF5RmlsdGVyOyApCi0gY2xhc3MgYW5kcm9pZC5hcHAuTGF1bmNoZXJBY3Rpdml0eSRBY3Rpdml0eUFkYXB0ZXIgZXh0ZW5kcyBhbmRyb2lkLndpZGdldC5CYXNlQWRhcHRlciBpbXBsZW1lbnRzIGFuZHJvaWQud2lkZ2V0LkZpbHRlcmFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuT2JqZWN0IGxvY2sKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0xpc3Q8TGFuZHJvaWQvY29udGVudC9wbS9SZXNvbHZlSW5mbzs+OyApCi1wcm90ZWN0ZWQgamF2YS51dGlsLkxpc3QgbUFjdGl2aXRpZXNMaXN0Ci0KLXByb3RlY3RlZCBmaW5hbCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBtQ29udGV4dAotCi1wcml2YXRlIGFuZHJvaWQud2lkZ2V0LkZpbHRlciBtRmlsdGVyCi0KLXByb3RlY3RlZCBmaW5hbCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXIgbUluZmxhdGVyCi0KLXByb3RlY3RlZCBmaW5hbCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50IG1JbnRlbnQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0FycmF5TGlzdDxMYW5kcm9pZC9jb250ZW50L3BtL1Jlc29sdmVJbmZvOz47ICkKLXByaXZhdGUgamF2YS51dGlsLkFycmF5TGlzdCBtT3JpZ2luYWxWYWx1ZXMKLQotZmluYWwgYW5kcm9pZC5hcHAuTGF1bmNoZXJBY3Rpdml0eSB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmFwcC5MYXVuY2hlckFjdGl2aXR5Ci1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC5jb250ZW50LkludGVudCkKLQotc3RhdGljIGphdmEudXRpbC5BcnJheUxpc3QgYWNjZXNzJDEwMCgKLWFuZHJvaWQuYXBwLkxhdW5jaGVyQWN0aXZpdHkkQWN0aXZpdHlBZGFwdGVyKQotCi1zdGF0aWMgamF2YS51dGlsLkFycmF5TGlzdCBhY2Nlc3MkMTAyKAotYW5kcm9pZC5hcHAuTGF1bmNoZXJBY3Rpdml0eSRBY3Rpdml0eUFkYXB0ZXIKLWphdmEudXRpbC5BcnJheUxpc3QpCi0KLXN0YXRpYyBqYXZhLmxhbmcuT2JqZWN0IGFjY2VzcyQyMDAoCi1hbmRyb2lkLmFwcC5MYXVuY2hlckFjdGl2aXR5JEFjdGl2aXR5QWRhcHRlcikKLQotcHJpdmF0ZSB2b2lkIGJpbmRWaWV3KAotYW5kcm9pZC52aWV3LlZpZXcKLWFuZHJvaWQuY29udGVudC5wbS5SZXNvbHZlSW5mbykKLQotcHJpdmF0ZSBjaGFyIGdldENhbmRpZGF0ZUxldHRlcigKLWFuZHJvaWQuY29udGVudC5wbS5SZXNvbHZlSW5mbykKLQotcHVibGljIGludCBnZXRDb3VudCgpCi0KLXB1YmxpYyBhbmRyb2lkLndpZGdldC5GaWx0ZXIgZ2V0RmlsdGVyKCkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0SXRlbSgKLWludCkKLQotcHVibGljIGxvbmcgZ2V0SXRlbUlkKAotaW50KQotCi1wdWJsaWMgYW5kcm9pZC52aWV3LlZpZXcgZ2V0VmlldygKLWludAotYW5kcm9pZC52aWV3LlZpZXcKLWFuZHJvaWQudmlldy5WaWV3R3JvdXApCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50IGludGVudEZvclBvc2l0aW9uKAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuYXBwLkxpc3RBY3Rpdml0eSBleHRlbmRzIGFuZHJvaWQuYXBwLkFjdGl2aXR5Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCBhbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlciBtQWRhcHRlcgotCi1wcml2YXRlIGJvb2xlYW4gbUZpbmlzaGVkU3RhcnQKLQotcHJpdmF0ZSBhbmRyb2lkLm9zLkhhbmRsZXIgbUhhbmRsZXIKLQotcHJvdGVjdGVkIGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3IG1MaXN0Ci0KLXByaXZhdGUgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXckT25JdGVtQ2xpY2tMaXN0ZW5lciBtT25DbGlja0xpc3RlbmVyCi0KLXByaXZhdGUgamF2YS5sYW5nLlJ1bm5hYmxlIG1SZXF1ZXN0Rm9jdXMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIHZvaWQgZW5zdXJlTGlzdCgpCi0KLXB1YmxpYyBhbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlciBnZXRMaXN0QWRhcHRlcigpCi0KLXB1YmxpYyBhbmRyb2lkLndpZGdldC5MaXN0VmlldyBnZXRMaXN0VmlldygpCi0KLXB1YmxpYyBsb25nIGdldFNlbGVjdGVkSXRlbUlkKCkKLQotcHVibGljIGludCBnZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpCi0KLXB1YmxpYyB2b2lkIG9uQ29udGVudENoYW5nZWQoKQotCi1wcm90ZWN0ZWQgdm9pZCBvbkxpc3RJdGVtQ2xpY2soCi1hbmRyb2lkLndpZGdldC5MaXN0VmlldwotYW5kcm9pZC52aWV3LlZpZXcKLWludAotbG9uZykKLQotcHJvdGVjdGVkIHZvaWQgb25SZXN0b3JlSW5zdGFuY2VTdGF0ZSgKLWFuZHJvaWQub3MuQnVuZGxlKQotCi1wdWJsaWMgdm9pZCBzZXRMaXN0QWRhcHRlcigKLWFuZHJvaWQud2lkZ2V0Lkxpc3RBZGFwdGVyKQotCi1wdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9hcHAvTGF1bmNoZXJBY3Rpdml0eSQxO0xhbmRyb2lkL2FwcC9MYXVuY2hlckFjdGl2aXR5JEFjdGl2aXR5QWRhcHRlcjsgKQotcHVibGljIGFic3RyYWN0IGNsYXNzIGFuZHJvaWQuYXBwLkxhdW5jaGVyQWN0aXZpdHkgZXh0ZW5kcyBhbmRyb2lkLmFwcC5MaXN0QWN0aXZpdHkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcm90ZWN0ZWQgYWJzdHJhY3QgYW5kcm9pZC5jb250ZW50LkludGVudCBnZXRUYXJnZXRJbnRlbnQoKQotCi1wcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZSgKLWFuZHJvaWQub3MuQnVuZGxlKQotCi1wcm90ZWN0ZWQgdm9pZCBvbkxpc3RJdGVtQ2xpY2soCi1hbmRyb2lkLndpZGdldC5MaXN0VmlldwotYW5kcm9pZC52aWV3LlZpZXcKLWludAotbG9uZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9hcHAvTGlzdEFjdGl2aXR5OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi0gY2xhc3MgYW5kcm9pZC5hcHAuTGlzdEFjdGl2aXR5JDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5sYW5nLlJ1bm5hYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQuYXBwLkxpc3RBY3Rpdml0eSB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmFwcC5MaXN0QWN0aXZpdHkpCi0KLXB1YmxpYyB2b2lkIHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L0FkYXB0ZXJWaWV3OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9T25JdGVtQ2xpY2tMaXN0ZW5lciApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3JE9uSXRlbUNsaWNrTGlzdGVuZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGFuZHJvaWQvd2lkZ2V0L0FkYXB0ZXJWaWV3PCo+O0xhbmRyb2lkL3ZpZXcvVmlldztJSilWICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uSXRlbUNsaWNrKAotYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXcKLWFuZHJvaWQudmlldy5WaWV3Ci1pbnQKLWxvbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0xpc3RBY3Rpdml0eTsgKQotIGNsYXNzIGFuZHJvaWQuYXBwLkxpc3RBY3Rpdml0eSQyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3JE9uSXRlbUNsaWNrTGlzdGVuZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC5hcHAuTGlzdEFjdGl2aXR5IHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQuYXBwLkxpc3RBY3Rpdml0eSkKLQotcHVibGljIHZvaWQgb25JdGVtQ2xpY2soCi1hbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldwotYW5kcm9pZC52aWV3LlZpZXcKLWludAotbG9uZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9hcHAvTG9jYWxBY3Rpdml0eU1hbmFnZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9TG9jYWxBY3Rpdml0eVJlY29yZCApCi0gY2xhc3MgYW5kcm9pZC5hcHAuTG9jYWxBY3Rpdml0eU1hbmFnZXIkTG9jYWxBY3Rpdml0eVJlY29yZCBleHRlbmRzIGFuZHJvaWQub3MuQmluZGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBhbmRyb2lkLmFwcC5BY3Rpdml0eSBhY3Rpdml0eQotCi0gYW5kcm9pZC5jb250ZW50LnBtLkFjdGl2aXR5SW5mbyBhY3Rpdml0eUluZm8KLQotIGludCBjdXJTdGF0ZQotCi1maW5hbCBqYXZhLmxhbmcuU3RyaW5nIGlkCi0KLSBhbmRyb2lkLm9zLkJ1bmRsZSBpbnN0YW5jZVN0YXRlCi0KLSBhbmRyb2lkLmNvbnRlbnQuSW50ZW50IGludGVudAotCi0gYW5kcm9pZC52aWV3LldpbmRvdyB3aW5kb3cKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL0xvY2FsQWN0aXZpdHlNYW5hZ2VyJExvY2FsQWN0aXZpdHlSZWNvcmQ7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmFwcC5Mb2NhbEFjdGl2aXR5TWFuYWdlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIGludCBDUkVBVEVECi0KLXN0YXRpYyBmaW5hbCBpbnQgREVTVFJPWUVECi0KLXN0YXRpYyBmaW5hbCBpbnQgSU5JVElBTElaSU5HCi0KLXN0YXRpYyBmaW5hbCBpbnQgUkVTVE9SRUQKLQotc3RhdGljIGZpbmFsIGludCBSRVNVTUVECi0KLXN0YXRpYyBmaW5hbCBpbnQgU1RBUlRFRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRBRwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGxvY2FsTE9HVgotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xhbmRyb2lkL2FwcC9Mb2NhbEFjdGl2aXR5TWFuYWdlciRMb2NhbEFjdGl2aXR5UmVjb3JkOz47ICkKLXByaXZhdGUgZmluYWwgamF2YS51dGlsLk1hcCBtQWN0aXZpdGllcwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQXJyYXlMaXN0PExhbmRyb2lkL2FwcC9Mb2NhbEFjdGl2aXR5TWFuYWdlciRMb2NhbEFjdGl2aXR5UmVjb3JkOz47ICkKLXByaXZhdGUgZmluYWwgamF2YS51dGlsLkFycmF5TGlzdCBtQWN0aXZpdHlBcnJheQotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkIG1BY3Rpdml0eVRocmVhZAotCi1wcml2YXRlIGludCBtQ3VyU3RhdGUKLQotcHJpdmF0ZSBib29sZWFuIG1GaW5pc2hpbmcKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLmFwcC5BY3Rpdml0eSBtUGFyZW50Ci0KLXByaXZhdGUgYW5kcm9pZC5hcHAuTG9jYWxBY3Rpdml0eU1hbmFnZXIkTG9jYWxBY3Rpdml0eVJlY29yZCBtUmVzdW1lZAotCi1wcml2YXRlIGJvb2xlYW4gbVNpbmdsZU1vZGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmFwcC5BY3Rpdml0eQotYm9vbGVhbikKLQotcHJpdmF0ZSB2b2lkIG1vdmVUb1N0YXRlKAotYW5kcm9pZC5hcHAuTG9jYWxBY3Rpdml0eU1hbmFnZXIkTG9jYWxBY3Rpdml0eVJlY29yZAotaW50KQotCi1wcml2YXRlIGFuZHJvaWQudmlldy5XaW5kb3cgcGVyZm9ybURlc3Ryb3koCi1hbmRyb2lkLmFwcC5Mb2NhbEFjdGl2aXR5TWFuYWdlciRMb2NhbEFjdGl2aXR5UmVjb3JkCi1ib29sZWFuKQotCi1wcml2YXRlIHZvaWQgcGVyZm9ybVBhdXNlKAotYW5kcm9pZC5hcHAuTG9jYWxBY3Rpdml0eU1hbmFnZXIkTG9jYWxBY3Rpdml0eVJlY29yZAotYm9vbGVhbikKLQotcHVibGljIGFuZHJvaWQudmlldy5XaW5kb3cgZGVzdHJveUFjdGl2aXR5KAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotcHVibGljIHZvaWQgZGlzcGF0Y2hDcmVhdGUoCi1hbmRyb2lkLm9zLkJ1bmRsZSkKLQotcHVibGljIHZvaWQgZGlzcGF0Y2hEZXN0cm95KAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgZGlzcGF0Y2hQYXVzZSgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIGRpc3BhdGNoUmVzdW1lKCkKLQotcHVibGljIHZvaWQgZGlzcGF0Y2hTdG9wKCkKLQotcHVibGljIGFuZHJvaWQuYXBwLkFjdGl2aXR5IGdldEFjdGl2aXR5KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFuZHJvaWQuYXBwLkFjdGl2aXR5IGdldEN1cnJlbnRBY3Rpdml0eSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEN1cnJlbnRJZCgpCi0KLXB1YmxpYyB2b2lkIHJlbW92ZUFsbEFjdGl2aXRpZXMoKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5CdW5kbGUgc2F2ZUluc3RhbmNlU3RhdGUoKQotCi1wdWJsaWMgYW5kcm9pZC52aWV3LldpbmRvdyBzdGFydEFjdGl2aXR5KAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5jb250ZW50LkludGVudCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9hcHAvTm90aWZpY2F0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExhbmRyb2lkL2FwcC9Ob3RpZmljYXRpb247PjsgKQotZmluYWwgY2xhc3MgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uIGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uW10gbmV3QXJyYXkoCi1pbnQpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0W10gbmV3QXJyYXkoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC9hcHAvTm90aWZpY2F0aW9uOz47ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IgQ1JFQVRPUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0FMTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0xJR0hUUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1NPVU5ECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfVklCUkFURQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX0FVVE9fQ0FOQ0VMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfSU5TSVNURU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfTk9fQ0xFQVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19PTkdPSU5HX0VWRU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfT05MWV9BTEVSVF9PTkNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfU0hPV19MSUdIVFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RSRUFNX0RFRkFVTFQKLQotcHVibGljIGludCBhdWRpb1N0cmVhbVR5cGUKLQotcHVibGljIGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQgY29udGVudEludGVudAotCi1wdWJsaWMgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MgY29udGVudFZpZXcKLQotcHVibGljIGludCBkZWZhdWx0cwotCi1wdWJsaWMgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudCBkZWxldGVJbnRlbnQKLQotcHVibGljIGludCBmbGFncwotCi1wdWJsaWMgaW50IGljb24KLQotcHVibGljIGludCBpY29uTGV2ZWwKLQotcHVibGljIGludCBsZWRBUkdCCi0KLXB1YmxpYyBpbnQgbGVkT2ZmTVMKLQotcHVibGljIGludCBsZWRPbk1TCi0KLXB1YmxpYyBpbnQgbnVtYmVyCi0KLXB1YmxpYyBhbmRyb2lkLm5ldC5Vcmkgc291bmQKLQotcHVibGljIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgdGlja2VyVGV4dAotCi1wdWJsaWMgbG9uZ1tdIHZpYnJhdGUKLQotcHVibGljIGxvbmcgd2hlbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50Ci1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1sb25nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotaW50Ci1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1sb25nCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkKLQotcHVibGljIHZvaWQgc2V0TGF0ZXN0RXZlbnRJbmZvKAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uTWFuYWdlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBERUJVRwotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIFRBRwotCi1wcml2YXRlIHN0YXRpYyBib29sZWFuIGxvY2FsTE9HVgotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLmFwcC5JTm90aWZpY2F0aW9uTWFuYWdlciBzU2VydmljZQotCi1wcml2YXRlIGFuZHJvaWQuY29udGVudC5Db250ZXh0IG1Db250ZXh0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC5vcy5IYW5kbGVyKQotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLmFwcC5JTm90aWZpY2F0aW9uTWFuYWdlciBnZXRTZXJ2aWNlKCkKLQotcHVibGljIHZvaWQgY2FuY2VsKAotaW50KQotCi1wdWJsaWMgdm9pZCBjYW5jZWxBbGwoKQotCi1wdWJsaWMgdm9pZCBub3RpZnkoCi1pbnQKLWFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExhbmRyb2lkL2FwcC9QZW5kaW5nSW50ZW50Oz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9QZW5kaW5nSW50ZW50OyApCi1maW5hbCBjbGFzcyBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50JDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudCBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnRbXSBuZXdBcnJheSgKLWludCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3RbXSBuZXdBcnJheSgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnV0aWwuQW5kcm9pZEV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5FeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuRXhjZXB0aW9uKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9QZW5kaW5nSW50ZW50OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9Q2FuY2VsZWRFeGNlcHRpb24gKQotcHVibGljIGNsYXNzIGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQkQ2FuY2VsZWRFeGNlcHRpb24gZXh0ZW5kcyBhbmRyb2lkLnV0aWwuQW5kcm9pZEV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5FeGNlcHRpb24pCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL1BlbmRpbmdJbnRlbnQ7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9RmluaXNoZWREaXNwYXRjaGVyICkKLSBjbGFzcyBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50JEZpbmlzaGVkRGlzcGF0Y2hlciBleHRlbmRzIGFuZHJvaWQuYXBwLklJbnRlbnRSZWNlaXZlciRTdHViIGltcGxlbWVudHMgamF2YS5sYW5nLlJ1bm5hYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5vcy5IYW5kbGVyIG1IYW5kbGVyCi0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LkludGVudCBtSW50ZW50Ci0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudCBtUGVuZGluZ0ludGVudAotCi1wcml2YXRlIGludCBtUmVzdWx0Q29kZQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbVJlc3VsdERhdGEKLQotcHJpdmF0ZSBhbmRyb2lkLm9zLkJ1bmRsZSBtUmVzdWx0RXh0cmFzCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudCRPbkZpbmlzaGVkIG1XaG8KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50Ci1hbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50JE9uRmluaXNoZWQKLWFuZHJvaWQub3MuSGFuZGxlcikKLQotcHVibGljIHZvaWQgcGVyZm9ybVJlY2VpdmUoCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50Ci1pbnQKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuQnVuZGxlCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1PbkZpbmlzaGVkICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9QZW5kaW5nSW50ZW50OyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQkT25GaW5pc2hlZCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvblNlbmRGaW5pc2hlZCgKLWFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQKLWFuZHJvaWQuY29udGVudC5JbnRlbnQKLWludAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5vcy5CdW5kbGUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9hcHAvUGVuZGluZ0ludGVudCRGaW5pc2hlZERpc3BhdGNoZXI7TGFuZHJvaWQvYXBwL1BlbmRpbmdJbnRlbnQkT25GaW5pc2hlZDtMYW5kcm9pZC9hcHAvUGVuZGluZ0ludGVudCRDYW5jZWxlZEV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExhbmRyb2lkL2FwcC9QZW5kaW5nSW50ZW50Oz47ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IgQ1JFQVRPUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX0NBTkNFTF9DVVJSRU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfTk9fQ1JFQVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfT05FX1NIT1QKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLmFwcC5JSW50ZW50U2VuZGVyIG1UYXJnZXQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQuYXBwLklJbnRlbnRTZW5kZXIpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuSUJpbmRlcikKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50IGdldEFjdGl2aXR5KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWludAotYW5kcm9pZC5jb250ZW50LkludGVudAotaW50KQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQgZ2V0QnJvYWRjYXN0KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWludAotYW5kcm9pZC5jb250ZW50LkludGVudAotaW50KQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQgZ2V0U2VydmljZSgKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1pbnQKLWFuZHJvaWQuY29udGVudC5JbnRlbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50IHJlYWRQZW5kaW5nSW50ZW50T3JOdWxsRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVQZW5kaW5nSW50ZW50T3JOdWxsVG9QYXJjZWwoCi1hbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50Ci1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIHZvaWQgY2FuY2VsKCkKLQotcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotIGFuZHJvaWQuYXBwLklJbnRlbnRTZW5kZXIgZ2V0VGFyZ2V0KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VGFyZ2V0UGFja2FnZSgpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL2FwcC9QZW5kaW5nSW50ZW50JENhbmNlbGVkRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZW5kKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9hcHAvUGVuZGluZ0ludGVudCRDYW5jZWxlZEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2VuZCgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9hcHAvUGVuZGluZ0ludGVudCRDYW5jZWxlZEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2VuZCgKLWludAotYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudCRPbkZpbmlzaGVkCi1hbmRyb2lkLm9zLkhhbmRsZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL1BlbmRpbmdJbnRlbnQkQ2FuY2VsZWRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNlbmQoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotaW50Ci1hbmRyb2lkLmNvbnRlbnQuSW50ZW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL2FwcC9QZW5kaW5nSW50ZW50JENhbmNlbGVkRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZW5kKAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWludAotYW5kcm9pZC5jb250ZW50LkludGVudAotYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudCRPbkZpbmlzaGVkCi1hbmRyb2lkLm9zLkhhbmRsZXIpCi0KLXB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLSBjbGFzcyBhbmRyb2lkLmFwcC5Qcm9ncmVzc0RpYWxvZyQxIGV4dGVuZHMgYW5kcm9pZC5vcy5IYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQuYXBwLlByb2dyZXNzRGlhbG9nIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQuYXBwLlByb2dyZXNzRGlhbG9nKQotCi1wdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuYXBwLlByb2dyZXNzRGlhbG9nIGV4dGVuZHMgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2cKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RZTEVfSE9SSVpPTlRBTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVFlMRV9TUElOTkVSCi0KLXByaXZhdGUgYm9vbGVhbiBtSGFzU3RhcnRlZAotCi1wcml2YXRlIGludCBtSW5jcmVtZW50QnkKLQotcHJpdmF0ZSBpbnQgbUluY3JlbWVudFNlY29uZGFyeUJ5Ci0KLXByaXZhdGUgYm9vbGVhbiBtSW5kZXRlcm1pbmF0ZQotCi1wcml2YXRlIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgbUluZGV0ZXJtaW5hdGVEcmF3YWJsZQotCi1wcml2YXRlIGludCBtTWF4Ci0KLXByaXZhdGUgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBtTWVzc2FnZQotCi1wcml2YXRlIGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3IG1NZXNzYWdlVmlldwotCi1wcml2YXRlIGFuZHJvaWQud2lkZ2V0LlByb2dyZXNzQmFyIG1Qcm9ncmVzcwotCi1wcml2YXRlIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgbVByb2dyZXNzRHJhd2FibGUKLQotcHJpdmF0ZSBhbmRyb2lkLndpZGdldC5UZXh0VmlldyBtUHJvZ3Jlc3NOdW1iZXIKLQotcHJpdmF0ZSBhbmRyb2lkLndpZGdldC5UZXh0VmlldyBtUHJvZ3Jlc3NQZXJjZW50Ci0KLXByaXZhdGUgamF2YS50ZXh0Lk51bWJlckZvcm1hdCBtUHJvZ3Jlc3NQZXJjZW50Rm9ybWF0Ci0KLXByaXZhdGUgaW50IG1Qcm9ncmVzc1N0eWxlCi0KLXByaXZhdGUgaW50IG1Qcm9ncmVzc1ZhbAotCi1wcml2YXRlIGludCBtU2Vjb25kYXJ5UHJvZ3Jlc3NWYWwKLQotcHJpdmF0ZSBhbmRyb2lkLm9zLkhhbmRsZXIgbVZpZXdVcGRhdGVIYW5kbGVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1pbnQpCi0KLXN0YXRpYyBhbmRyb2lkLndpZGdldC5Qcm9ncmVzc0JhciBhY2Nlc3MkMDAwKAotYW5kcm9pZC5hcHAuUHJvZ3Jlc3NEaWFsb2cpCi0KLXN0YXRpYyBhbmRyb2lkLndpZGdldC5UZXh0VmlldyBhY2Nlc3MkMTAwKAotYW5kcm9pZC5hcHAuUHJvZ3Jlc3NEaWFsb2cpCi0KLXN0YXRpYyBqYXZhLnRleHQuTnVtYmVyRm9ybWF0IGFjY2VzcyQyMDAoCi1hbmRyb2lkLmFwcC5Qcm9ncmVzc0RpYWxvZykKLQotc3RhdGljIGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3IGFjY2VzcyQzMDAoCi1hbmRyb2lkLmFwcC5Qcm9ncmVzc0RpYWxvZykKLQotcHJpdmF0ZSB2b2lkIG9uUHJvZ3Jlc3NDaGFuZ2VkKCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmFwcC5Qcm9ncmVzc0RpYWxvZyBzaG93KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5hcHAuUHJvZ3Jlc3NEaWFsb2cgc2hvdygKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1ib29sZWFuKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuYXBwLlByb2dyZXNzRGlhbG9nIHNob3coCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotYm9vbGVhbgotYm9vbGVhbikKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmFwcC5Qcm9ncmVzc0RpYWxvZyBzaG93KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWJvb2xlYW4KLWJvb2xlYW4KLWFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UkT25DYW5jZWxMaXN0ZW5lcikKLQotcHVibGljIGludCBnZXRNYXgoKQotCi1wdWJsaWMgaW50IGdldFByb2dyZXNzKCkKLQotcHVibGljIGludCBnZXRTZWNvbmRhcnlQcm9ncmVzcygpCi0KLXB1YmxpYyB2b2lkIGluY3JlbWVudFByb2dyZXNzQnkoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGluY3JlbWVudFNlY29uZGFyeVByb2dyZXNzQnkoCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIGlzSW5kZXRlcm1pbmF0ZSgpCi0KLXByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKAotYW5kcm9pZC5vcy5CdW5kbGUpCi0KLXB1YmxpYyB2b2lkIG9uU3RhcnQoKQotCi1wcm90ZWN0ZWQgdm9pZCBvblN0b3AoKQotCi1wdWJsaWMgdm9pZCBzZXRJbmRldGVybWluYXRlKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0SW5kZXRlcm1pbmF0ZURyYXdhYmxlKAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSkKLQotcHVibGljIHZvaWQgc2V0TWF4KAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRNZXNzYWdlKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotcHVibGljIHZvaWQgc2V0UHJvZ3Jlc3MoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldFByb2dyZXNzRHJhd2FibGUoCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlKQotCi1wdWJsaWMgdm9pZCBzZXRQcm9ncmVzc1N0eWxlKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRTZWNvbmRhcnlQcm9ncmVzcygKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLSBjbGFzcyBhbmRyb2lkLmFwcC5SZWNlaXZlclJlc3RyaWN0ZWRDb250ZXh0IGV4dGVuZHMgYW5kcm9pZC5jb250ZW50LkNvbnRleHRXcmFwcGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXB1YmxpYyBib29sZWFuIGJpbmRTZXJ2aWNlKAotYW5kcm9pZC5jb250ZW50LkludGVudAotYW5kcm9pZC5jb250ZW50LlNlcnZpY2VDb25uZWN0aW9uCi1pbnQpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50IHJlZ2lzdGVyUmVjZWl2ZXIoCi1hbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXIKLWFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXIpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50IHJlZ2lzdGVyUmVjZWl2ZXIoCi1hbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXIKLWFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXIKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuSGFuZGxlcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9hcHAvUmVzdWx0SW5mbzsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC9hcHAvUmVzdWx0SW5mbzs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1maW5hbCBjbGFzcyBhbmRyb2lkLmFwcC5SZXN1bHRJbmZvJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgYW5kcm9pZC5hcHAuUmVzdWx0SW5mbyBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIGFuZHJvaWQuYXBwLlJlc3VsdEluZm9bXSBuZXdBcnJheSgKLWludCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3RbXSBuZXdBcnJheSgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmFwcC5SZXN1bHRJbmZvIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC9hcHAvUmVzdWx0SW5mbzs+OyApCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yIENSRUFUT1IKLQotcHVibGljIGZpbmFsIGFuZHJvaWQuY29udGVudC5JbnRlbnQgbURhdGEKLQotcHVibGljIGZpbmFsIGludCBtUmVxdWVzdENvZGUKLQotcHVibGljIGZpbmFsIGludCBtUmVzdWx0Q29kZQotCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBtUmVzdWx0V2hvCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQKLWFuZHJvaWQuY29udGVudC5JbnRlbnQpCi0KLXB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPU9uR2xvYmFsTGF5b3V0TGlzdGVuZXIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9WaWV3VHJlZU9ic2VydmVyOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyJE9uR2xvYmFsTGF5b3V0TGlzdGVuZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgb25HbG9iYWxMYXlvdXQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9TZWFyY2hEaWFsb2c7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLSBjbGFzcyBhbmRyb2lkLmFwcC5TZWFyY2hEaWFsb2ckMTAgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC52aWV3LlZpZXdUcmVlT2JzZXJ2ZXIkT25HbG9iYWxMYXlvdXRMaXN0ZW5lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLmFwcC5TZWFyY2hEaWFsb2cgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5hcHAuU2VhcmNoRGlhbG9nKQotCi1wdWJsaWMgdm9pZCBvbkdsb2JhbExheW91dCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL1NlYXJjaERpYWxvZzsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotIGNsYXNzIGFuZHJvaWQuYXBwLlNlYXJjaERpYWxvZyQxMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldyRPbkl0ZW1DbGlja0xpc3RlbmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQuYXBwLlNlYXJjaERpYWxvZyB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmFwcC5TZWFyY2hEaWFsb2cpCi0KLXB1YmxpYyB2b2lkIG9uSXRlbUNsaWNrKAotYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXcKLWFuZHJvaWQudmlldy5WaWV3Ci1pbnQKLWxvbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQudGV4dC5UZXh0V2F0Y2hlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBhZnRlclRleHRDaGFuZ2VkKAotYW5kcm9pZC50ZXh0LkVkaXRhYmxlKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBiZWZvcmVUZXh0Q2hhbmdlZCgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uVGV4dENoYW5nZWQoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9TZWFyY2hEaWFsb2c7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLSBjbGFzcyBhbmRyb2lkLmFwcC5TZWFyY2hEaWFsb2ckMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnRleHQuVGV4dFdhdGNoZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC5hcHAuU2VhcmNoRGlhbG9nIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQuYXBwLlNlYXJjaERpYWxvZykKLQotcHVibGljIHZvaWQgYWZ0ZXJUZXh0Q2hhbmdlZCgKLWFuZHJvaWQudGV4dC5FZGl0YWJsZSkKLQotcHVibGljIHZvaWQgYmVmb3JlVGV4dENoYW5nZWQoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBvblRleHRDaGFuZ2VkKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotaW50Ci1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC92aWV3L1ZpZXc7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1PbktleUxpc3RlbmVyICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC52aWV3LlZpZXckT25LZXlMaXN0ZW5lciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBvbktleSgKLWFuZHJvaWQudmlldy5WaWV3Ci1pbnQKLWFuZHJvaWQudmlldy5LZXlFdmVudCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9hcHAvU2VhcmNoRGlhbG9nOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi0gY2xhc3MgYW5kcm9pZC5hcHAuU2VhcmNoRGlhbG9nJDIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC52aWV3LlZpZXckT25LZXlMaXN0ZW5lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLmFwcC5TZWFyY2hEaWFsb2cgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5hcHAuU2VhcmNoRGlhbG9nKQotCi1wdWJsaWMgYm9vbGVhbiBvbktleSgKLWFuZHJvaWQudmlldy5WaWV3Ci1pbnQKLWFuZHJvaWQudmlldy5LZXlFdmVudCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9T25DbGlja0xpc3RlbmVyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3ZpZXcvVmlldzsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLnZpZXcuVmlldyRPbkNsaWNrTGlzdGVuZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgb25DbGljaygKLWFuZHJvaWQudmlldy5WaWV3KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9TZWFyY2hEaWFsb2c7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLSBjbGFzcyBhbmRyb2lkLmFwcC5TZWFyY2hEaWFsb2ckMyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnZpZXcuVmlldyRPbkNsaWNrTGlzdGVuZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC5hcHAuU2VhcmNoRGlhbG9nIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQuYXBwLlNlYXJjaERpYWxvZykKLQotcHVibGljIHZvaWQgb25DbGljaygKLWFuZHJvaWQudmlldy5WaWV3KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9TZWFyY2hEaWFsb2c7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLSBjbGFzcyBhbmRyb2lkLmFwcC5TZWFyY2hEaWFsb2ckNCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnZpZXcuVmlldyRPbktleUxpc3RlbmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQuYXBwLlNlYXJjaERpYWxvZyB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmFwcC5TZWFyY2hEaWFsb2cpCi0KLXB1YmxpYyBib29sZWFuIG9uS2V5KAotYW5kcm9pZC52aWV3LlZpZXcKLWludAotYW5kcm9pZC52aWV3LktleUV2ZW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9TZWFyY2hEaWFsb2c7ICkKLSBjbGFzcyBhbmRyb2lkLmFwcC5TZWFyY2hEaWFsb2ckNSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnZpZXcuVmlldyRPbktleUxpc3RlbmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQuYXBwLlNlYXJjaERpYWxvZyB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmFwcC5TZWFyY2hEaWFsb2cpCi0KLXB1YmxpYyBib29sZWFuIG9uS2V5KAotYW5kcm9pZC52aWV3LlZpZXcKLWludAotYW5kcm9pZC52aWV3LktleUV2ZW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1PbkZvY3VzQ2hhbmdlTGlzdGVuZXIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9WaWV3OyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQudmlldy5WaWV3JE9uRm9jdXNDaGFuZ2VMaXN0ZW5lciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvbkZvY3VzQ2hhbmdlKAotYW5kcm9pZC52aWV3LlZpZXcKLWJvb2xlYW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL1NlYXJjaERpYWxvZzsgKQotIGNsYXNzIGFuZHJvaWQuYXBwLlNlYXJjaERpYWxvZyQ2IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQudmlldy5WaWV3JE9uRm9jdXNDaGFuZ2VMaXN0ZW5lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLmFwcC5TZWFyY2hEaWFsb2cgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5hcHAuU2VhcmNoRGlhbG9nKQotCi1wdWJsaWMgdm9pZCBvbkZvY3VzQ2hhbmdlKAotYW5kcm9pZC52aWV3LlZpZXcKLWJvb2xlYW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPU9uSXRlbVNlbGVjdGVkTGlzdGVuZXIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L0FkYXB0ZXJWaWV3OyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3JE9uSXRlbVNlbGVjdGVkTGlzdGVuZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGFuZHJvaWQvd2lkZ2V0L0FkYXB0ZXJWaWV3PCo+O0xhbmRyb2lkL3ZpZXcvVmlldztJSilWICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uSXRlbVNlbGVjdGVkKAotYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXcKLWFuZHJvaWQudmlldy5WaWV3Ci1pbnQKLWxvbmcpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExhbmRyb2lkL3dpZGdldC9BZGFwdGVyVmlldzwqPjspViApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvbk5vdGhpbmdTZWxlY3RlZCgKLWFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9TZWFyY2hEaWFsb2c7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLSBjbGFzcyBhbmRyb2lkLmFwcC5TZWFyY2hEaWFsb2ckNyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldyRPbkl0ZW1TZWxlY3RlZExpc3RlbmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQuYXBwLlNlYXJjaERpYWxvZyB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmFwcC5TZWFyY2hEaWFsb2cpCi0KLXB1YmxpYyB2b2lkIG9uSXRlbVNlbGVjdGVkKAotYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXcKLWFuZHJvaWQudmlldy5WaWV3Ci1pbnQKLWxvbmcpCi0KLXB1YmxpYyB2b2lkIG9uTm90aGluZ1NlbGVjdGVkKAotYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL1NlYXJjaERpYWxvZzsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotIGNsYXNzIGFuZHJvaWQuYXBwLlNlYXJjaERpYWxvZyQ4IGV4dGVuZHMgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQuYXBwLlNlYXJjaERpYWxvZyB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmFwcC5TZWFyY2hEaWFsb2cpCi0KLXB1YmxpYyB2b2lkIG9uUmVjZWl2ZSgKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLmNvbnRlbnQuSW50ZW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9TZWFyY2hEaWFsb2c7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLSBjbGFzcyBhbmRyb2lkLmFwcC5TZWFyY2hEaWFsb2ckOSBleHRlbmRzIGFuZHJvaWQub3MuSGFuZGxlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLmFwcC5TZWFyY2hEaWFsb2cgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5hcHAuU2VhcmNoRGlhbG9nKQotCi1wdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NCBuYW1lID1DdXJzb3JGaWx0ZXJDbGllbnQgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L0N1cnNvckZpbHRlcjsgKQotYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQud2lkZ2V0LkN1cnNvckZpbHRlciRDdXJzb3JGaWx0ZXJDbGllbnQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgY2hhbmdlQ3Vyc29yKAotYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIGNvbnZlcnRUb1N0cmluZygKLWFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yKQotCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IgZ2V0Q3Vyc29yKCkKLQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIHJ1blF1ZXJ5T25CYWNrZ3JvdW5kVGhyZWFkKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9DdXJzb3JBZGFwdGVyJDE7TGFuZHJvaWQvd2lkZ2V0L0N1cnNvckFkYXB0ZXIkTXlEYXRhU2V0T2JzZXJ2ZXI7TGFuZHJvaWQvd2lkZ2V0L0N1cnNvckFkYXB0ZXIkQ2hhbmdlT2JzZXJ2ZXI7ICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBhbmRyb2lkLndpZGdldC5DdXJzb3JBZGFwdGVyIGV4dGVuZHMgYW5kcm9pZC53aWRnZXQuQmFzZUFkYXB0ZXIgaW1wbGVtZW50cyBhbmRyb2lkLndpZGdldC5GaWx0ZXJhYmxlLCBhbmRyb2lkLndpZGdldC5DdXJzb3JGaWx0ZXIkQ3Vyc29yRmlsdGVyQ2xpZW50Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCBib29sZWFuIG1BdXRvUmVxdWVyeQotCi1wcm90ZWN0ZWQgYW5kcm9pZC53aWRnZXQuQ3Vyc29yQWRhcHRlciRDaGFuZ2VPYnNlcnZlciBtQ2hhbmdlT2JzZXJ2ZXIKLQotcHJvdGVjdGVkIGFuZHJvaWQuY29udGVudC5Db250ZXh0IG1Db250ZXh0Ci0KLXByb3RlY3RlZCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciBtQ3Vyc29yCi0KLXByb3RlY3RlZCBhbmRyb2lkLndpZGdldC5DdXJzb3JGaWx0ZXIgbUN1cnNvckZpbHRlcgotCi1wcm90ZWN0ZWQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhU2V0T2JzZXJ2ZXIgbURhdGFTZXRPYnNlcnZlcgotCi1wcm90ZWN0ZWQgYm9vbGVhbiBtRGF0YVZhbGlkCi0KLXByb3RlY3RlZCBhbmRyb2lkLndpZGdldC5GaWx0ZXJRdWVyeVByb3ZpZGVyIG1GaWx0ZXJRdWVyeVByb3ZpZGVyCi0KLXByb3RlY3RlZCBpbnQgbVJvd0lEQ29sdW1uCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IKLWJvb2xlYW4pCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGJpbmRWaWV3KAotYW5kcm9pZC52aWV3LlZpZXcKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLmRhdGFiYXNlLkN1cnNvcikKLQotcHVibGljIHZvaWQgY2hhbmdlQ3Vyc29yKAotYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IpCi0KLXB1YmxpYyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIGNvbnZlcnRUb1N0cmluZygKLWFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yKQotCi1wdWJsaWMgZmluYWwgaW50IGdldENvdW50KCkKLQotcHVibGljIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIGdldEN1cnNvcigpCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuVmlldyBnZXREcm9wRG93blZpZXcoCi1pbnQKLWFuZHJvaWQudmlldy5WaWV3Ci1hbmRyb2lkLnZpZXcuVmlld0dyb3VwKQotCi1wdWJsaWMgYW5kcm9pZC53aWRnZXQuRmlsdGVyIGdldEZpbHRlcigpCi0KLXB1YmxpYyBhbmRyb2lkLndpZGdldC5GaWx0ZXJRdWVyeVByb3ZpZGVyIGdldEZpbHRlclF1ZXJ5UHJvdmlkZXIoKQotCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLk9iamVjdCBnZXRJdGVtKAotaW50KQotCi1wdWJsaWMgZmluYWwgbG9uZyBnZXRJdGVtSWQoCi1pbnQpCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuVmlldyBnZXRWaWV3KAotaW50Ci1hbmRyb2lkLnZpZXcuVmlldwotYW5kcm9pZC52aWV3LlZpZXdHcm91cCkKLQotcHVibGljIGJvb2xlYW4gaGFzU3RhYmxlSWRzKCkKLQotcHJvdGVjdGVkIHZvaWQgaW5pdCgKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLmRhdGFiYXNlLkN1cnNvcgotYm9vbGVhbikKLQotcHVibGljIGFuZHJvaWQudmlldy5WaWV3IG5ld0Ryb3BEb3duVmlldygKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLmRhdGFiYXNlLkN1cnNvcgotYW5kcm9pZC52aWV3LlZpZXdHcm91cCkKLQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQudmlldy5WaWV3IG5ld1ZpZXcoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IKLWFuZHJvaWQudmlldy5WaWV3R3JvdXApCi0KLXB1YmxpYyBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciBydW5RdWVyeU9uQmFja2dyb3VuZFRocmVhZCgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi0KLXB1YmxpYyB2b2lkIHNldEZpbHRlclF1ZXJ5UHJvdmlkZXIoCi1hbmRyb2lkLndpZGdldC5GaWx0ZXJRdWVyeVByb3ZpZGVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGFuZHJvaWQud2lkZ2V0LlJlc291cmNlQ3Vyc29yQWRhcHRlciBleHRlbmRzIGFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBpbnQgbURyb3BEb3duTGF5b3V0Ci0KLXByaXZhdGUgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyIG1JbmZsYXRlcgotCi1wcml2YXRlIGludCBtTGF5b3V0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWludAotYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IpCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuVmlldyBuZXdEcm9wRG93blZpZXcoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IKLWFuZHJvaWQudmlldy5WaWV3R3JvdXApCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuVmlldyBuZXdWaWV3KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yCi1hbmRyb2lkLnZpZXcuVmlld0dyb3VwKQotCi1wdWJsaWMgdm9pZCBzZXREcm9wRG93blZpZXdSZXNvdXJjZSgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9TaW1wbGVDdXJzb3JBZGFwdGVyJEN1cnNvclRvU3RyaW5nQ29udmVydGVyO0xhbmRyb2lkL3dpZGdldC9TaW1wbGVDdXJzb3JBZGFwdGVyJFZpZXdCaW5kZXI7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLndpZGdldC5TaW1wbGVDdXJzb3JBZGFwdGVyIGV4dGVuZHMgYW5kcm9pZC53aWRnZXQuUmVzb3VyY2VDdXJzb3JBZGFwdGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYW5kcm9pZC53aWRnZXQuU2ltcGxlQ3Vyc29yQWRhcHRlciRDdXJzb3JUb1N0cmluZ0NvbnZlcnRlciBtQ3Vyc29yVG9TdHJpbmdDb252ZXJ0ZXIKLQotcHJvdGVjdGVkIGludFtdIG1Gcm9tCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZ1tdIG1PcmlnaW5hbEZyb20KLQotcHJpdmF0ZSBpbnQgbVN0cmluZ0NvbnZlcnNpb25Db2x1bW4KLQotcHJvdGVjdGVkIGludFtdIG1UbwotCi1wcml2YXRlIGFuZHJvaWQud2lkZ2V0LlNpbXBsZUN1cnNvckFkYXB0ZXIkVmlld0JpbmRlciBtVmlld0JpbmRlcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1pbnQKLWFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yCi1qYXZhLmxhbmcuU3RyaW5nW10KLWludFtdKQotCi1wcml2YXRlIHZvaWQgZmluZENvbHVtbnMoCi1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLXB1YmxpYyB2b2lkIGJpbmRWaWV3KAotYW5kcm9pZC52aWV3LlZpZXcKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLmRhdGFiYXNlLkN1cnNvcikKLQotcHVibGljIHZvaWQgY2hhbmdlQ3Vyc29yKAotYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IpCi0KLXB1YmxpYyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIGNvbnZlcnRUb1N0cmluZygKLWFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yKQotCi1wdWJsaWMgYW5kcm9pZC53aWRnZXQuU2ltcGxlQ3Vyc29yQWRhcHRlciRDdXJzb3JUb1N0cmluZ0NvbnZlcnRlciBnZXRDdXJzb3JUb1N0cmluZ0NvbnZlcnRlcigpCi0KLXB1YmxpYyBpbnQgZ2V0U3RyaW5nQ29udmVyc2lvbkNvbHVtbigpCi0KLXB1YmxpYyBhbmRyb2lkLndpZGdldC5TaW1wbGVDdXJzb3JBZGFwdGVyJFZpZXdCaW5kZXIgZ2V0Vmlld0JpbmRlcigpCi0KLXB1YmxpYyB2b2lkIHNldEN1cnNvclRvU3RyaW5nQ29udmVydGVyKAotYW5kcm9pZC53aWRnZXQuU2ltcGxlQ3Vyc29yQWRhcHRlciRDdXJzb3JUb1N0cmluZ0NvbnZlcnRlcikKLQotcHVibGljIHZvaWQgc2V0U3RyaW5nQ29udmVyc2lvbkNvbHVtbigKLWludCkKLQotcHVibGljIHZvaWQgc2V0Vmlld0JpbmRlcigKLWFuZHJvaWQud2lkZ2V0LlNpbXBsZUN1cnNvckFkYXB0ZXIkVmlld0JpbmRlcikKLQotcHVibGljIHZvaWQgc2V0Vmlld0ltYWdlKAotYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRWaWV3VGV4dCgKLWFuZHJvaWQud2lkZ2V0LlRleHRWaWV3Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9U3VnZ2VzdGlvbnNDdXJzb3JBZGFwdGVyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9TZWFyY2hEaWFsb2c7ICkKLSBjbGFzcyBhbmRyb2lkLmFwcC5TZWFyY2hEaWFsb2ckU3VnZ2VzdGlvbnNDdXJzb3JBZGFwdGVyIGV4dGVuZHMgYW5kcm9pZC53aWRnZXQuU2ltcGxlQ3Vyc29yQWRhcHRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzIG1Qcm92aWRlclJlc291cmNlcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1pbnQKLWFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yCi1qYXZhLmxhbmcuU3RyaW5nW10KLWludFtdCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotcHVibGljIGFuZHJvaWQudmlldy5WaWV3IGdldFZpZXcoCi1pbnQKLWFuZHJvaWQudmlldy5WaWV3Ci1hbmRyb2lkLnZpZXcuVmlld0dyb3VwKQotCi1wdWJsaWMgdm9pZCBzZXRWaWV3SW1hZ2UoCi1hbmRyb2lkLndpZGdldC5JbWFnZVZpZXcKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotIGNsYXNzIGFuZHJvaWQuYXBwLlNlYXJjaERpYWxvZyRTdWdnZXN0aW9uc1J1bm5lciQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5SdW5uYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLmFwcC5TZWFyY2hEaWFsb2ckU3VnZ2VzdGlvbnNSdW5uZXIgdGhpcyQxCi0KLWZpbmFsIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIHZhbCRjCi0KLWZpbmFsIGFuZHJvaWQuYXBwLlNlYXJjaERpYWxvZyRTdWdnZXN0aW9uc1J1bm5lciRSZXF1ZXN0IHZhbCR1c2VSZXF1ZXN0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5hcHAuU2VhcmNoRGlhbG9nJFN1Z2dlc3Rpb25zUnVubmVyCi1hbmRyb2lkLmRhdGFiYXNlLkN1cnNvcgotYW5kcm9pZC5hcHAuU2VhcmNoRGlhbG9nJFN1Z2dlc3Rpb25zUnVubmVyJFJlcXVlc3QpCi0KLXB1YmxpYyB2b2lkIHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPVJlcXVlc3QgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL1NlYXJjaERpYWxvZyRTdWdnZXN0aW9uc1J1bm5lcjsgKQotIGNsYXNzIGFuZHJvaWQuYXBwLlNlYXJjaERpYWxvZyRTdWdnZXN0aW9uc1J1bm5lciRSZXF1ZXN0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBib29sZWFuIGNhbmNlbFJlcXVlc3QKLQotZmluYWwgamF2YS5sYW5nLlN0cmluZyBtUXVlcnlUZXh0Ci0KLWZpbmFsIGFuZHJvaWQuc2VydmVyLnNlYXJjaC5TZWFyY2hhYmxlSW5mbyBtU2VhcmNoYWJsZUluZm8KLQotZmluYWwgYW5kcm9pZC5hcHAuU2VhcmNoRGlhbG9nJFN1Z2dlc3Rpb25zUnVubmVyIHRoaXMkMQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQuYXBwLlNlYXJjaERpYWxvZyRTdWdnZXN0aW9uc1J1bm5lcikKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5hcHAuU2VhcmNoRGlhbG9nJFN1Z2dlc3Rpb25zUnVubmVyCi1hbmRyb2lkLnNlcnZlci5zZWFyY2guU2VhcmNoYWJsZUluZm8KLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPVN1Z2dlc3Rpb25zUnVubmVyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL1NlYXJjaERpYWxvZyRTdWdnZXN0aW9uc1J1bm5lciRSZXF1ZXN0OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9hcHAvU2VhcmNoRGlhbG9nOyApCi0gY2xhc3MgYW5kcm9pZC5hcHAuU2VhcmNoRGlhbG9nJFN1Z2dlc3Rpb25zUnVubmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5SdW5uYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvY29uY3VycmVudC9MaW5rZWRCbG9ja2luZ1F1ZXVlPExhbmRyb2lkL2FwcC9TZWFyY2hEaWFsb2ckU3VnZ2VzdGlvbnNSdW5uZXIkUmVxdWVzdDs+OyApCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5jb25jdXJyZW50LkxpbmtlZEJsb2NraW5nUXVldWUgbVN1Z2dlc3Rpb25zUXVldWUKLQotZmluYWwgYW5kcm9pZC5hcHAuU2VhcmNoRGlhbG9nIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmFwcC5TZWFyY2hEaWFsb2cpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQuYXBwLlNlYXJjaERpYWxvZwotYW5kcm9pZC5hcHAuU2VhcmNoRGlhbG9nJDEpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQxMDAoCi1hbmRyb2lkLmFwcC5TZWFyY2hEaWFsb2ckU3VnZ2VzdGlvbnNSdW5uZXIpCi0KLXByaXZhdGUgdm9pZCBjYW5jZWxTdWdnZXN0aW9ucygpCi0KLXB1YmxpYyB2b2lkIHJlcXVlc3RTdWdnZXN0aW9ucygKLWFuZHJvaWQuc2VydmVyLnNlYXJjaC5TZWFyY2hhYmxlSW5mbwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9TZWFyY2hEaWFsb2ckU3VnZ2VzdGlvbnNDdXJzb3JBZGFwdGVyO0xhbmRyb2lkL2FwcC9TZWFyY2hEaWFsb2ckU3VnZ2VzdGlvbnNSdW5uZXI7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmFwcC5TZWFyY2hEaWFsb2cgZXh0ZW5kcyBhbmRyb2lkLmFwcC5EaWFsb2cKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIGludCBEQkdfSkFNX1RIUkVBRElORwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREJHX0xPR19USU1JTkcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBJTlNUQU5DRV9LRVlfQVBQREFUQQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIElOU1RBTkNFX0tFWV9DT01QT05FTlQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBJTlNUQU5DRV9LRVlfRElTUExBWV9RVUVSWQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIElOU1RBTkNFX0tFWV9ESVNQTEFZX1NFTF9FTkQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBJTlNUQU5DRV9LRVlfRElTUExBWV9TRUxfU1RBUlQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBJTlNUQU5DRV9LRVlfR0xPQkFMU0VBUkNICi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSU5TVEFOQ0VfS0VZX1NFTEVDVEVEX0VMRU1FTlQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBJTlNUQU5DRV9LRVlfU1VHR0VTVElPTl9RVUVSWQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIElOU1RBTkNFX0tFWV9VU0VSX1FVRVJZCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTlNUQU5DRV9TRUxFQ1RFRF9CVVRUT04KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOU1RBTkNFX1NFTEVDVEVEX1FVRVJZCi0KLXN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIExPR19UQUcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfRElTTUlTUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gT05FX0xJTkVfRlJPTQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gT05FX0xJTkVfSUNPTlNfRlJPTQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBPTkVfTElORV9JQ09OU19UTwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBPTkVfTElORV9UTwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gVFdPX0xJTkVfRlJPTQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gVFdPX0xJTkVfSUNPTlNfRlJPTQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBUV09fTElORV9JQ09OU19UTwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBUV09fTElORV9UTwotCi1wcml2YXRlIGFuZHJvaWQuY29udGVudC5Db250ZXh0IG1BY3Rpdml0eUNvbnRleHQKLQotcHJpdmF0ZSBhbmRyb2lkLm9zLkJ1bmRsZSBtQXBwU2VhcmNoRGF0YQotCi1wcml2YXRlIGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3IG1CYWRnZUxhYmVsCi0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyIG1Ccm9hZGNhc3RSZWNlaXZlcgotCi0gYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlciBtQ2xvc2VEaWFsb2dzRmlsdGVyCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5IYW5kbGVyIG1EaXNtaXNzSGFuZGxlcgotCi1wcml2YXRlIGFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyJE9uR2xvYmFsTGF5b3V0TGlzdGVuZXIgbUdsb2JhbExheW91dExpc3RlbmVyCi0KLXByaXZhdGUgYm9vbGVhbiBtR2xvYmFsU2VhcmNoTW9kZQotCi1wcml2YXRlIGFuZHJvaWQud2lkZ2V0LkJ1dHRvbiBtR29CdXR0b24KLQotIGFuZHJvaWQudmlldy5WaWV3JE9uQ2xpY2tMaXN0ZW5lciBtR29CdXR0b25DbGlja0xpc3RlbmVyCi0KLSBhbmRyb2lkLnZpZXcuVmlldyRPbktleUxpc3RlbmVyIG1Hb0J1dHRvbktleUxpc3RlbmVyCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5vcy5IYW5kbGVyIG1IYW5kbGVyCi0KLXByaXZhdGUgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0xvbmcgbUxhc3RMb2dUaW1lCi0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUgbUxhdW5jaENvbXBvbmVudAotCi1wcml2YXRlIGJvb2xlYW4gbUxlYXZlSmFtbWVkUXVlcnlPblJlZm9jdXMKLQotcHJpdmF0ZSBib29sZWFuIG1Ob25Vc2VyUXVlcnkKLQotIGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXIgbVBhY2thZ2VGaWx0ZXIKLQotcHJpdmF0ZSBpbnQgbVByZXNldFNlbGVjdGlvbgotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbVByZXZpb3VzU3VnZ2VzdGlvblF1ZXJ5Ci0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgbVByb3ZpZGVyQ29udGV4dAotCi1wcml2YXRlIGFuZHJvaWQudmlldy5WaWV3IG1TZWFyY2hCYXJMYXlvdXQKLQotcHJpdmF0ZSBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQgbVNlYXJjaEVkaXRMYXlvdXQKLQotcHJpdmF0ZSBhbmRyb2lkLndpZGdldC5FZGl0VGV4dCBtU2VhcmNoVGV4dEZpZWxkCi0KLXByaXZhdGUgYW5kcm9pZC5zZXJ2ZXIuc2VhcmNoLlNlYXJjaGFibGVJbmZvIG1TZWFyY2hhYmxlCi0KLXByaXZhdGUgYm9vbGVhbiBtU2tpcE5leHRBbmltYXRlCi0KLSBhbmRyb2lkLnZpZXcuVmlldyRPbkZvY3VzQ2hhbmdlTGlzdGVuZXIgbVN1Z2dlc3RGb2N1c0xpc3RlbmVyCi0KLSBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldyRPbkl0ZW1TZWxlY3RlZExpc3RlbmVyIG1TdWdnZXN0U2VsZWN0ZWRMaXN0ZW5lcgotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbVN1Z2dlc3Rpb25BY3Rpb24KLQotcHJpdmF0ZSBhbmRyb2lkLm5ldC5VcmkgbVN1Z2dlc3Rpb25EYXRhCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtU3VnZ2VzdGlvblF1ZXJ5Ci0KLXByaXZhdGUgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb24gbVN1Z2dlc3Rpb25zRW50cnkKLQotcHJpdmF0ZSBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvbiBtU3VnZ2VzdGlvbnNFeGl0Ci0KLSBhbmRyb2lkLnZpZXcuVmlldyRPbktleUxpc3RlbmVyIG1TdWdnZXN0aW9uc0tleUxpc3RlbmVyCi0KLXByaXZhdGUgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXcgbVN1Z2dlc3Rpb25zTGlzdAotCi1wcml2YXRlIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3JE9uSXRlbUNsaWNrTGlzdGVuZXIgbVN1Z2dlc3Rpb25zTGlzdEl0ZW1DbGlja0xpc3RlbmVyCi0KLXByaXZhdGUgYW5kcm9pZC5hcHAuU2VhcmNoRGlhbG9nJFN1Z2dlc3Rpb25zUnVubmVyIG1TdWdnZXN0aW9uc1J1bm5lcgotCi0gYW5kcm9pZC52aWV3LlZpZXckT25LZXlMaXN0ZW5lciBtVGV4dEtleUxpc3RlbmVyCi0KLXByaXZhdGUgYW5kcm9pZC50ZXh0LlRleHRXYXRjaGVyIG1UZXh0V2F0Y2hlcgotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbVVzZXJRdWVyeQotCi1wcml2YXRlIGludCBtVXNlclF1ZXJ5U2VsRW5kCi0KLXByaXZhdGUgaW50IG1Vc2VyUXVlcnlTZWxTdGFydAotCi1wcml2YXRlIGFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyIG1WaWV3VHJlZU9ic2VydmVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotc3RhdGljIGFuZHJvaWQub3MuSGFuZGxlciBhY2Nlc3MkMTAwMCgKLWFuZHJvaWQuYXBwLlNlYXJjaERpYWxvZykKLQotc3RhdGljIGFuZHJvaWQuc2VydmVyLnNlYXJjaC5TZWFyY2hhYmxlSW5mbyBhY2Nlc3MkMTEwMCgKLWFuZHJvaWQuYXBwLlNlYXJjaERpYWxvZykKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDEyMDAoCi1hbmRyb2lkLmFwcC5TZWFyY2hEaWFsb2cKLWFuZHJvaWQudmlldy5WaWV3Ci1pbnQKLWFuZHJvaWQudmlldy5LZXlFdmVudCkKLQotc3RhdGljIHZvaWQgYWNjZXNzJDEzMDAoCi1hbmRyb2lkLmFwcC5TZWFyY2hEaWFsb2cKLWludAotamF2YS5sYW5nLlN0cmluZykKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDE0MDAoCi1hbmRyb2lkLmFwcC5TZWFyY2hEaWFsb2cKLWFuZHJvaWQudmlldy5WaWV3Ci1pbnQKLWFuZHJvaWQudmlldy5LZXlFdmVudCkKLQotc3RhdGljIGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3IGFjY2VzcyQxNTAwKAotYW5kcm9pZC5hcHAuU2VhcmNoRGlhbG9nKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMTYwMCgKLWFuZHJvaWQuYXBwLlNlYXJjaERpYWxvZwotYm9vbGVhbgotYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXcKLWludCkKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDE3MDAoCi1hbmRyb2lkLmFwcC5TZWFyY2hEaWFsb2cpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQxODAwKAotYW5kcm9pZC5hcHAuU2VhcmNoRGlhbG9nKQotCi1zdGF0aWMgYm9vbGVhbiBhY2Nlc3MkMTkwMCgKLWFuZHJvaWQuYXBwLlNlYXJjaERpYWxvZwotYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXcKLWludCkKLQotc3RhdGljIHZvaWQgYWNjZXNzJDIwMCgKLWFuZHJvaWQuYXBwLlNlYXJjaERpYWxvZykKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDMwMCgKLWFuZHJvaWQuYXBwLlNlYXJjaERpYWxvZykKLQotc3RhdGljIHZvaWQgYWNjZXNzJDQwMCgKLWFuZHJvaWQuYXBwLlNlYXJjaERpYWxvZykKLQotc3RhdGljIGphdmEubGFuZy5TdHJpbmcgYWNjZXNzJDUwMigKLWFuZHJvaWQuYXBwLlNlYXJjaERpYWxvZwotamF2YS5sYW5nLlN0cmluZykKLQotc3RhdGljIGFuZHJvaWQud2lkZ2V0LkVkaXRUZXh0IGFjY2VzcyQ2MDAoCi1hbmRyb2lkLmFwcC5TZWFyY2hEaWFsb2cpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDcwMigKLWFuZHJvaWQuYXBwLlNlYXJjaERpYWxvZwotaW50KQotCi1zdGF0aWMgaW50IGFjY2VzcyQ4MDIoCi1hbmRyb2lkLmFwcC5TZWFyY2hEaWFsb2cKLWludCkKLQotc3RhdGljIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIGFjY2VzcyQ5MDAoCi1hbmRyb2lkLmFwcC5TZWFyY2hEaWFsb2cKLWFuZHJvaWQuc2VydmVyLnNlYXJjaC5TZWFyY2hhYmxlSW5mbwotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSB2b2lkIGRiZ0xvZ1RpbWluZygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgdm9pZCBkaXNjYXJkTGlzdEN1cnNvcigKLWFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3KQotCi1wcml2YXRlIGJvb2xlYW4gZG9TdWdnZXN0aW9uc0tleSgKLWFuZHJvaWQudmlldy5WaWV3Ci1pbnQKLWFuZHJvaWQudmlldy5LZXlFdmVudCkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGdldEFjdGlvbktleU1lc3NhZ2UoCi1hbmRyb2lkLmRhdGFiYXNlLkN1cnNvcgotYW5kcm9pZC5zZXJ2ZXIuc2VhcmNoLlNlYXJjaGFibGVJbmZvJEFjdGlvbktleUluZm8pCi0KLXByaXZhdGUgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IgZ2V0U3VnZ2VzdGlvbnMoCi1hbmRyb2lkLnNlcnZlci5zZWFyY2guU2VhcmNoYWJsZUluZm8KLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExhbmRyb2lkL3dpZGdldC9BZGFwdGVyVmlldzwqPjspTGFuZHJvaWQvd2lkZ2V0L0N1cnNvckFkYXB0ZXI7ICkKLXByaXZhdGUgc3RhdGljIGFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXIgZ2V0U3VnZ2VzdGlvbnNBZGFwdGVyKAotYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXcpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFpMYW5kcm9pZC93aWRnZXQvQWRhcHRlclZpZXc8Kj47SSlWICkKLXByaXZhdGUgdm9pZCBqYW1TdWdnZXN0aW9uUXVlcnkoCi1ib29sZWFuCi1hbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldwotaW50KQotCi1wcml2YXRlIHZvaWQgbGF1bmNoUXVlcnlTZWFyY2goCi1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExhbmRyb2lkL3dpZGdldC9BZGFwdGVyVmlldzwqPjtJKVogKQotcHJpdmF0ZSBib29sZWFuIGxhdW5jaFN1Z2dlc3Rpb24oCi1hbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldwotaW50KQotCi1wcml2YXRlIHZvaWQgbGF5b3V0U3VnZ2VzdGlvbnNMaXN0KCkKLQotcHJpdmF0ZSBib29sZWFuIHJlZm9jdXNpbmdLZXlMaXN0ZW5lcigKLWFuZHJvaWQudmlldy5WaWV3Ci1pbnQKLWFuZHJvaWQudmlldy5LZXlFdmVudCkKLQotcHJpdmF0ZSB2b2lkIHNlbmRMYXVuY2hJbnRlbnQoCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm5ldC5VcmkKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuQnVuZGxlCi1pbnQKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQuc2VydmVyLnNlYXJjaC5TZWFyY2hhYmxlSW5mbykKLQotcHJpdmF0ZSB2b2lkIHNldHVwU2VhcmNoYWJsZUluZm8oKQotCi1wcml2YXRlIHZvaWQgc2hvd1N1Z2dlc3Rpb25zKAotYm9vbGVhbgotYm9vbGVhbikKLQotcHJpdmF0ZSB2b2lkIHVwZGF0ZVF1ZXJ5SGludCgpCi0KLXByaXZhdGUgdm9pZCB1cGRhdGVTZWFyY2hCYWRnZSgpCi0KLXByaXZhdGUgdm9pZCB1cGRhdGVTZWFyY2hCdXR0b24oKQotCi1wcml2YXRlIHZvaWQgdXBkYXRlU3VnZ2VzdGlvbnMoKQotCi1wcml2YXRlIHZvaWQgdXBkYXRlV2lkZ2V0U3RhdGUoKQotCi1wdWJsaWMgdm9pZCBkaXNtaXNzKCkKLQotcHVibGljIHZvaWQgb25Db25maWd1cmF0aW9uQ2hhbmdlZCgKLWFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbikKLQotcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoCi1hbmRyb2lkLm9zLkJ1bmRsZSkKLQotcHVibGljIGJvb2xlYW4gb25LZXlEb3duKAotaW50Ci1hbmRyb2lkLnZpZXcuS2V5RXZlbnQpCi0KLXB1YmxpYyB2b2lkIG9uUGFja2FnZUxpc3RDaGFuZ2UoKQotCi1wdWJsaWMgdm9pZCBvblJlc3RvcmVJbnN0YW5jZVN0YXRlKAotYW5kcm9pZC5vcy5CdW5kbGUpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLkJ1bmRsZSBvblNhdmVJbnN0YW5jZVN0YXRlKCkKLQotIHZvaWQgc2V0dXBTdWdnZXN0aW9uSW50ZW50KAotYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IKLWFuZHJvaWQuc2VydmVyLnNlYXJjaC5TZWFyY2hhYmxlSW5mbykKLQotcHVibGljIHZvaWQgc2hvdygpCi0KLXB1YmxpYyBib29sZWFuIHNob3coCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuCi1hbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZQotYW5kcm9pZC5vcy5CdW5kbGUKLWJvb2xlYW4pCi0KLSB2b2lkIHVwZGF0ZVN1Z2dlc3Rpb25zV2l0aEN1cnNvcigKLWFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yCi1hbmRyb2lkLnNlcnZlci5zZWFyY2guU2VhcmNoYWJsZUluZm8pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL1NlYXJjaE1hbmFnZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1PbkNhbmNlbExpc3RlbmVyICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5hcHAuU2VhcmNoTWFuYWdlciRPbkNhbmNlbExpc3RlbmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uQ2FuY2VsKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9T25EaXNtaXNzTGlzdGVuZXIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL1NlYXJjaE1hbmFnZXI7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5hcHAuU2VhcmNoTWFuYWdlciRPbkRpc21pc3NMaXN0ZW5lciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvbkRpc21pc3MoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1PbkRpc21pc3NMaXN0ZW5lciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L0RpYWxvZ0ludGVyZmFjZTsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlJE9uRGlzbWlzc0xpc3RlbmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uRGlzbWlzcygKLWFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPU9uQ2FuY2VsTGlzdGVuZXIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9EaWFsb2dJbnRlcmZhY2U7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZSRPbkNhbmNlbExpc3RlbmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uQ2FuY2VsKAotYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9TZWFyY2hNYW5hZ2VyJE9uQ2FuY2VsTGlzdGVuZXI7TGFuZHJvaWQvYXBwL1NlYXJjaE1hbmFnZXIkT25EaXNtaXNzTGlzdGVuZXI7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmFwcC5TZWFyY2hNYW5hZ2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UkT25EaXNtaXNzTGlzdGVuZXIsIGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UkT25DYW5jZWxMaXN0ZW5lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUNUSU9OX0tFWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUNUSU9OX01TRwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQVBQX0RBVEEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIE1FTlVfS0VZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FTlVfS0VZQ09ERQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUVVFUlkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNVR0dFU1RfQ09MVU1OX0ZPUk1BVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU1VHR0VTVF9DT0xVTU5fSUNPTl8xCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTVUdHRVNUX0NPTFVNTl9JQ09OXzIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNVR0dFU1RfQ09MVU1OX0lOVEVOVF9BQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNVR0dFU1RfQ09MVU1OX0lOVEVOVF9EQVRBCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTVUdHRVNUX0NPTFVNTl9JTlRFTlRfREFUQV9JRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU1VHR0VTVF9DT0xVTU5fUVVFUlkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNVR0dFU1RfQ09MVU1OX1RFWFRfMQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU1VHR0VTVF9DT0xVTU5fVEVYVF8yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTVUdHRVNUX01JTUVfVFlQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU1VHR0VTVF9VUklfUEFUSF9RVUVSWQotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLmFwcC5JU2VhcmNoTWFuYWdlciBtU2VydmljZQotCi1wcml2YXRlIGFuZHJvaWQuYXBwLlNlYXJjaE1hbmFnZXIkT25DYW5jZWxMaXN0ZW5lciBtQ2FuY2VsTGlzdGVuZXIKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBtQ29udGV4dAotCi1wcml2YXRlIGFuZHJvaWQuYXBwLlNlYXJjaE1hbmFnZXIkT25EaXNtaXNzTGlzdGVuZXIgbURpc21pc3NMaXN0ZW5lcgotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQub3MuSGFuZGxlciBtSGFuZGxlcgotCi1wcml2YXRlIGFuZHJvaWQuYXBwLlNlYXJjaERpYWxvZyBtU2VhcmNoRGlhbG9nCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC5vcy5IYW5kbGVyKQotCi1wdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKQotCi1wdWJsaWMgdm9pZCBvbkNhbmNlbCgKLWFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UpCi0KLSB2b2lkIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQoCi1hbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb24pCi0KLXB1YmxpYyB2b2lkIG9uRGlzbWlzcygKLWFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UpCi0KLSB2b2lkIHJlc3RvcmVTZWFyY2hEaWFsb2coCi1hbmRyb2lkLm9zLkJ1bmRsZQotamF2YS5sYW5nLlN0cmluZykKLQotIHZvaWQgc2F2ZVNlYXJjaERpYWxvZygKLWFuZHJvaWQub3MuQnVuZGxlCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRPbkNhbmNlbExpc3RlbmVyKAotYW5kcm9pZC5hcHAuU2VhcmNoTWFuYWdlciRPbkNhbmNlbExpc3RlbmVyKQotCi1wdWJsaWMgdm9pZCBzZXRPbkRpc21pc3NMaXN0ZW5lcigKLWFuZHJvaWQuYXBwLlNlYXJjaE1hbmFnZXIkT25EaXNtaXNzTGlzdGVuZXIpCi0KLXB1YmxpYyB2b2lkIHN0YXJ0U2VhcmNoKAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbgotYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUKLWFuZHJvaWQub3MuQnVuZGxlCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzdG9wU2VhcmNoKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBhbmRyb2lkLmFwcC5TZXJ2aWNlIGV4dGVuZHMgYW5kcm9pZC5jb250ZW50LkNvbnRleHRXcmFwcGVyIGltcGxlbWVudHMgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudENhbGxiYWNrcwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRBRwotCi1wcml2YXRlIGFuZHJvaWQuYXBwLklBY3Rpdml0eU1hbmFnZXIgbUFjdGl2aXR5TWFuYWdlcgotCi1wcml2YXRlIGFuZHJvaWQuYXBwLkFwcGxpY2F0aW9uIG1BcHBsaWNhdGlvbgotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbUNsYXNzTmFtZQotCi1wcml2YXRlIGFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkIG1UaHJlYWQKLQotcHJpdmF0ZSBhbmRyb2lkLm9zLklCaW5kZXIgbVRva2VuCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGZpbmFsIHZvaWQgYXR0YWNoKAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLklCaW5kZXIKLWFuZHJvaWQuYXBwLkFwcGxpY2F0aW9uCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wcm90ZWN0ZWQgdm9pZCBkdW1wKAotamF2YS5pby5GaWxlRGVzY3JpcHRvcgotamF2YS5pby5QcmludFdyaXRlcgotamF2YS5sYW5nLlN0cmluZ1tdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvVGhyb3dhYmxlOyApCi1wcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpCi0KLXB1YmxpYyBmaW5hbCBhbmRyb2lkLmFwcC5BcHBsaWNhdGlvbiBnZXRBcHBsaWNhdGlvbigpCi0KLWZpbmFsIGphdmEubGFuZy5TdHJpbmcgZ2V0Q2xhc3NOYW1lKCkKLQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQub3MuSUJpbmRlciBvbkJpbmQoCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50KQotCi1wdWJsaWMgdm9pZCBvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKAotYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uKQotCi1wdWJsaWMgdm9pZCBvbkNyZWF0ZSgpCi0KLXB1YmxpYyB2b2lkIG9uRGVzdHJveSgpCi0KLXB1YmxpYyB2b2lkIG9uTG93TWVtb3J5KCkKLQotcHVibGljIHZvaWQgb25SZWJpbmQoCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50KQotCi1wdWJsaWMgdm9pZCBvblN0YXJ0KAotYW5kcm9pZC5jb250ZW50LkludGVudAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBvblVuYmluZCgKLWFuZHJvaWQuY29udGVudC5JbnRlbnQpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHNldEZvcmVncm91bmQoCi1ib29sZWFuKQotCi1wdWJsaWMgZmluYWwgdm9pZCBzdG9wU2VsZigpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHN0b3BTZWxmKAotaW50KQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBzdG9wU2VsZlJlc3VsdCgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLWZpbmFsIGNsYXNzIGFuZHJvaWQuYXBwLlNlcnZpY2VDb25uZWN0aW9uTGVha2VkIGV4dGVuZHMgYW5kcm9pZC51dGlsLkFuZHJvaWRSdW50aW1lRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmFwcC5TdGF0dXNCYXJNYW5hZ2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVNBQkxFX0VYUEFORAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVNBQkxFX05PTkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTQUJMRV9OT1RJRklDQVRJT05fQUxFUlRTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TCi0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgbUNvbnRleHQKLQotcHJpdmF0ZSBhbmRyb2lkLmFwcC5JU3RhdHVzQmFyIG1TZXJ2aWNlCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5JQmluZGVyIG1Ub2tlbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFkZEljb24oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgY29sbGFwc2UoKQotCi1wdWJsaWMgdm9pZCBkaXNhYmxlKAotaW50KQotCi1wdWJsaWMgdm9pZCBleHBhbmQoKQotCi1wdWJsaWMgdm9pZCByZW1vdmVJY29uKAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgdm9pZCB0b2dnbGUoKQotCi1wdWJsaWMgdm9pZCB1cGRhdGVJY29uKAotYW5kcm9pZC5vcy5JQmluZGVyCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLWZpbmFsIGNsYXNzIGFuZHJvaWQuYXBwLlN1cGVyTm90Q2FsbGVkRXhjZXB0aW9uIGV4dGVuZHMgYW5kcm9pZC51dGlsLkFuZHJvaWRSdW50aW1lRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmFwcC5UYWJBY3Rpdml0eSBleHRlbmRzIGFuZHJvaWQuYXBwLkFjdGl2aXR5R3JvdXAKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1EZWZhdWx0VGFiCi0KLXByaXZhdGUgaW50IG1EZWZhdWx0VGFiSW5kZXgKLQotcHJpdmF0ZSBhbmRyb2lkLndpZGdldC5UYWJIb3N0IG1UYWJIb3N0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIGVuc3VyZVRhYkhvc3QoKQotCi1wdWJsaWMgYW5kcm9pZC53aWRnZXQuVGFiSG9zdCBnZXRUYWJIb3N0KCkKLQotcHVibGljIGFuZHJvaWQud2lkZ2V0LlRhYldpZGdldCBnZXRUYWJXaWRnZXQoKQotCi1wcm90ZWN0ZWQgdm9pZCBvbkNoaWxkVGl0bGVDaGFuZ2VkKAotYW5kcm9pZC5hcHAuQWN0aXZpdHkKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi0KLXB1YmxpYyB2b2lkIG9uQ29udGVudENoYW5nZWQoKQotCi1wcm90ZWN0ZWQgdm9pZCBvblBvc3RDcmVhdGUoCi1hbmRyb2lkLm9zLkJ1bmRsZSkKLQotcHJvdGVjdGVkIHZvaWQgb25SZXN0b3JlSW5zdGFuY2VTdGF0ZSgKLWFuZHJvaWQub3MuQnVuZGxlKQotCi1wcm90ZWN0ZWQgdm9pZCBvblNhdmVJbnN0YW5jZVN0YXRlKAotYW5kcm9pZC5vcy5CdW5kbGUpCi0KLXB1YmxpYyB2b2lkIHNldERlZmF1bHRUYWIoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldERlZmF1bHRUYWIoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2FwcC9UaW1lUGlja2VyRGlhbG9nOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9T25UaW1lU2V0TGlzdGVuZXIgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLmFwcC5UaW1lUGlja2VyRGlhbG9nJE9uVGltZVNldExpc3RlbmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uVGltZVNldCgKLWFuZHJvaWQud2lkZ2V0LlRpbWVQaWNrZXIKLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9UaW1lUGlja2VyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9T25UaW1lQ2hhbmdlZExpc3RlbmVyICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC53aWRnZXQuVGltZVBpY2tlciRPblRpbWVDaGFuZ2VkTGlzdGVuZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgb25UaW1lQ2hhbmdlZCgKLWFuZHJvaWQud2lkZ2V0LlRpbWVQaWNrZXIKLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvYXBwL1RpbWVQaWNrZXJEaWFsb2ckT25UaW1lU2V0TGlzdGVuZXI7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmFwcC5UaW1lUGlja2VyRGlhbG9nIGV4dGVuZHMgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2cgaW1wbGVtZW50cyBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlJE9uQ2xpY2tMaXN0ZW5lciwgYW5kcm9pZC53aWRnZXQuVGltZVBpY2tlciRPblRpbWVDaGFuZ2VkTGlzdGVuZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBIT1VSCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSVNfMjRfSE9VUgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1JTlVURQotCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5DYWxlbmRhciBtQ2FsZW5kYXIKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLmFwcC5UaW1lUGlja2VyRGlhbG9nJE9uVGltZVNldExpc3RlbmVyIG1DYWxsYmFjawotCi1wcml2YXRlIGZpbmFsIGphdmEudGV4dC5EYXRlRm9ybWF0IG1EYXRlRm9ybWF0Ci0KLSBpbnQgbUluaXRpYWxIb3VyT2ZEYXkKLQotIGludCBtSW5pdGlhbE1pbnV0ZQotCi0gYm9vbGVhbiBtSXMyNEhvdXJWaWV3Ci0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC53aWRnZXQuVGltZVBpY2tlciBtVGltZVBpY2tlcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1pbnQKLWFuZHJvaWQuYXBwLlRpbWVQaWNrZXJEaWFsb2ckT25UaW1lU2V0TGlzdGVuZXIKLWludAotaW50Ci1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC5hcHAuVGltZVBpY2tlckRpYWxvZyRPblRpbWVTZXRMaXN0ZW5lcgotaW50Ci1pbnQKLWJvb2xlYW4pCi0KLXByaXZhdGUgdm9pZCB1cGRhdGVUaXRsZSgKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBvbkNsaWNrKAotYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZQotaW50KQotCi1wdWJsaWMgdm9pZCBvblJlc3RvcmVJbnN0YW5jZVN0YXRlKAotYW5kcm9pZC5vcy5CdW5kbGUpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLkJ1bmRsZSBvblNhdmVJbnN0YW5jZVN0YXRlKCkKLQotcHVibGljIHZvaWQgb25UaW1lQ2hhbmdlZCgKLWFuZHJvaWQud2lkZ2V0LlRpbWVQaWNrZXIKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCB1cGRhdGVUaW1lKAotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC5ibHVldG9vdGguQXRDb21tYW5kSGFuZGxlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgYW5kcm9pZC5ibHVldG9vdGguQXRDb21tYW5kUmVzdWx0IGhhbmRsZUFjdGlvbkNvbW1hbmQoKQotCi1wdWJsaWMgYW5kcm9pZC5ibHVldG9vdGguQXRDb21tYW5kUmVzdWx0IGhhbmRsZUJhc2ljQ29tbWFuZCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhbmRyb2lkLmJsdWV0b290aC5BdENvbW1hbmRSZXN1bHQgaGFuZGxlUmVhZENvbW1hbmQoKQotCi1wdWJsaWMgYW5kcm9pZC5ibHVldG9vdGguQXRDb21tYW5kUmVzdWx0IGhhbmRsZVNldENvbW1hbmQoCi1qYXZhLmxhbmcuT2JqZWN0W10pCi0KLXB1YmxpYyBhbmRyb2lkLmJsdWV0b290aC5BdENvbW1hbmRSZXN1bHQgaGFuZGxlVGVzdENvbW1hbmQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuYmx1ZXRvb3RoLkF0Q29tbWFuZFJlc3VsdCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1IKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBFUlJPUl9TVFJJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0sKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBPS19TVFJJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5TT0xJQ0lURUQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlciBtUmVzcG9uc2UKLQotcHJpdmF0ZSBpbnQgbVJlc3VsdENvZGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBhcHBlbmRXaXRoQ3JsZigKLWphdmEubGFuZy5TdHJpbmdCdWlsZGVyCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBhZGRSZXNwb25zZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIGFkZFJlc3VsdCgKLWFuZHJvaWQuYmx1ZXRvb3RoLkF0Q29tbWFuZFJlc3VsdCkKLQotcHVibGljIGludCBnZXRSZXN1bHRDb2RlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuYmx1ZXRvb3RoLkF0UGFyc2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9BQ1RJT04KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRZUEVfUkVBRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9TRVQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRZUEVfVEVTVAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaE1hcDxMamF2YS9sYW5nL0NoYXJhY3RlcjtMYW5kcm9pZC9ibHVldG9vdGgvQXRDb21tYW5kSGFuZGxlcjs+OyApCi1wcml2YXRlIGphdmEudXRpbC5IYXNoTWFwIG1CYXNpY0hhbmRsZXJzCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNoTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xhbmRyb2lkL2JsdWV0b290aC9BdENvbW1hbmRIYW5kbGVyOz47ICkKLXByaXZhdGUgamF2YS51dGlsLkhhc2hNYXAgbUV4dEhhbmRsZXJzCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtTGFzdElucHV0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBjbGVhbigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgc3RhdGljIGludCBmaW5kQ2hhcigKLWNoYXIKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgaW50IGZpbmRFbmRFeHRlbmRlZE5hbWUoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5PYmplY3RbXSBnZW5lcmF0ZUFyZ3MoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQXRvWigKLWNoYXIpCi0KLXB1YmxpYyBhbmRyb2lkLmJsdWV0b290aC5BdENvbW1hbmRSZXN1bHQgcHJvY2VzcygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHJlZ2lzdGVyKAotamF2YS5sYW5nLkNoYXJhY3RlcgotYW5kcm9pZC5ibHVldG9vdGguQXRDb21tYW5kSGFuZGxlcikKLQotcHVibGljIHZvaWQgcmVnaXN0ZXIoCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLmJsdWV0b290aC5BdENvbW1hbmRIYW5kbGVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLSBjbGFzcyBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhBdWRpb0dhdGV3YXkkMSBleHRlbmRzIGphdmEubGFuZy5UaHJlYWQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQXVkaW9HYXRld2F5IHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEF1ZGlvR2F0ZXdheQotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoQXVkaW9HYXRld2F5OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEgbmFtZSA9SW5jb21pbmdDb25uZWN0aW9uSW5mbyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQXVkaW9HYXRld2F5JEluY29taW5nQ29ubmVjdGlvbkluZm8gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIG1BZGRyZXNzCi0KLXB1YmxpYyBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2UgbUJsdWV0b290aAotCi1wdWJsaWMgaW50IG1SZmNvbW1DaGFuCi0KLXB1YmxpYyBpbnQgbVNvY2tldEZkCi0KLWZpbmFsIGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEF1ZGlvR2F0ZXdheSB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhBdWRpb0dhdGV3YXkKLWFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZQotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoQXVkaW9HYXRld2F5JEluY29taW5nQ29ubmVjdGlvbkluZm87ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhBdWRpb0dhdGV3YXkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfSEZfQUdfQ0hBTk5FTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0hTX0FHX0NIQU5ORUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0lOQ09NSU5HX0hBTkRTRlJFRV9DT05ORUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19JTkNPTUlOR19IRUFEU0VUX0NPTk5FQ1RJT04KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFTEVDVF9XQUlUX1RJTUVPVVQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLQotcHJpdmF0ZSBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2UgbUJsdWV0b290aAotCi1wcml2YXRlIGFuZHJvaWQub3MuSGFuZGxlciBtQ2FsbGJhY2sKLQotcHJpdmF0ZSBqYXZhLmxhbmcuVGhyZWFkIG1Db25uZWN0VGhlYWQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1Db25uZWN0aW5nSGFuZHNmcmVlQWRkcmVzcwotCi1wcml2YXRlIGludCBtQ29ubmVjdGluZ0hhbmRzZnJlZVJmY29tbUNoYW5uZWwKLQotcHJpdmF0ZSBpbnQgbUNvbm5lY3RpbmdIYW5kc2ZyZWVTb2NrZXRGZAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbUNvbm5lY3RpbmdIZWFkc2V0QWRkcmVzcwotCi1wcml2YXRlIGludCBtQ29ubmVjdGluZ0hlYWRzZXRSZmNvbW1DaGFubmVsCi0KLXByaXZhdGUgaW50IG1Db25uZWN0aW5nSGVhZHNldFNvY2tldEZkCi0KLXByaXZhdGUgaW50IG1IYW5kc2ZyZWVBZ1JmY29tbUNoYW5uZWwKLQotcHJpdmF0ZSBpbnQgbUhlYWRzZXRBZ1JmY29tbUNoYW5uZWwKLQotcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIG1JbnRlcnJ1cHRlZAotCi1wcml2YXRlIGludCBtTmF0aXZlRGF0YQotCi1wcml2YXRlIGludCBtVGltZW91dFJlbWFpbmluZ01zCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2UpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZQotaW50Ci1pbnQpCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQwMDAoCi1hbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhBdWRpb0dhdGV3YXkpCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQwMDIoCi1hbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhBdWRpb0dhdGV3YXkKLWJvb2xlYW4pCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDEwMCgKLWFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEF1ZGlvR2F0ZXdheSkKLQotc3RhdGljIGludCBhY2Nlc3MkMTAwMCgKLWFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEF1ZGlvR2F0ZXdheSkKLQotc3RhdGljIGludCBhY2Nlc3MkMTAyKAotYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQXVkaW9HYXRld2F5Ci1pbnQpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDIwMCgKLWFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEF1ZGlvR2F0ZXdheSkKLQotc3RhdGljIGludCBhY2Nlc3MkMjAyKAotYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQXVkaW9HYXRld2F5Ci1pbnQpCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQzMDAoCi1hbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhBdWRpb0dhdGV3YXkKLWludCkKLQotc3RhdGljIGludCBhY2Nlc3MkNDAwKAotYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQXVkaW9HYXRld2F5KQotCi1zdGF0aWMgamF2YS5sYW5nLlN0cmluZyBhY2Nlc3MkNTAwKAotYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQXVkaW9HYXRld2F5KQotCi1zdGF0aWMgYW5kcm9pZC5vcy5IYW5kbGVyIGFjY2VzcyQ2MDAoCi1hbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhBdWRpb0dhdGV3YXkpCi0KLXN0YXRpYyBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2UgYWNjZXNzJDcwMCgKLWFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEF1ZGlvR2F0ZXdheSkKLQotc3RhdGljIGludCBhY2Nlc3MkODAwKAotYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQXVkaW9HYXRld2F5KQotCi1zdGF0aWMgamF2YS5sYW5nLlN0cmluZyBhY2Nlc3MkOTAwKAotYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQXVkaW9HYXRld2F5KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBjbGFzc0luaXROYXRpdmUoKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIGNsZWFudXBOYXRpdmVEYXRhTmF0aXZlKCkKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBpbml0aWFsaXplTmF0aXZlRGF0YU5hdGl2ZSgpCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgbG9nKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBzZXRVcExpc3RlbmluZ1NvY2tldHNOYXRpdmUoKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIHRlYXJEb3duTGlzdGVuaW5nU29ja2V0c05hdGl2ZSgpCi0KLXByaXZhdGUgbmF0aXZlIGJvb2xlYW4gd2FpdEZvckhhbmRzZnJlZUNvbm5lY3ROYXRpdmUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9UaHJvd2FibGU7ICkKLXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkKLQotcHVibGljIGJvb2xlYW4gc3RhcnQoCi1hbmRyb2lkLm9zLkhhbmRsZXIpCi0KLXB1YmxpYyB2b2lkIHN0b3AoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFERFJFU1NfTEVOR1RICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfQ09OTkVDVEFCTEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9ESVNDT1ZFUkFCTEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9PRkYKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9VTktOT1dOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1VMVF9GQUlMVVJFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1VMVF9TVUNDRVNTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEFHCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5ibHVldG9vdGguSUJsdWV0b290aERldmljZSBtU2VydmljZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuYmx1ZXRvb3RoLklCbHVldG9vdGhEZXZpY2UpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja0JsdWV0b290aEFkZHJlc3MoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGJ5dGVbXSBjb252ZXJ0UGluVG9CeXRlcygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBib29sZWFuIGNhbmNlbEJvbmRpbmdQcm9jZXNzKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgY2FuY2VsRGlzY292ZXJ5KCkKLQotcHVibGljIGJvb2xlYW4gY2FuY2VsUGluKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJvb2xlYW4gY2xlYXJSZW1vdGVBbGlhcygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBib29sZWFuIGNyZWF0ZUJvbmRpbmcoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYm9vbGVhbiBjcmVhdGVCb25kaW5nKAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5ibHVldG9vdGguSUJsdWV0b290aERldmljZUNhbGxiYWNrKQotCi1wdWJsaWMgYm9vbGVhbiBkaXNhYmxlKCkKLQotcHVibGljIGJvb2xlYW4gZGlzY29ubmVjdFJlbW90ZURldmljZUFjbCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBib29sZWFuIGVuYWJsZSgpCi0KLXB1YmxpYyBib29sZWFuIGVuYWJsZSgKLWFuZHJvaWQuYmx1ZXRvb3RoLklCbHVldG9vdGhEZXZpY2VDYWxsYmFjaykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QWRkcmVzcygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldENvbXBhbnkoKQotCi1wdWJsaWMgaW50IGdldERpc2NvdmVyYWJsZVRpbWVvdXQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRNYWpvckNsYXNzKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TWFudWZhY3R1cmVyKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TWlub3JDbGFzcygpCi0KLXB1YmxpYyBpbnQgZ2V0TW9kZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE5hbWUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRSZW1vdGVBbGlhcygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBpbnQgZ2V0UmVtb3RlQ2xhc3MoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRSZW1vdGVDb21wYW55KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJ5dGVbXSBnZXRSZW1vdGVGZWF0dXJlcygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFJlbW90ZU1ham9yQ2xhc3MoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRSZW1vdGVNYW51ZmFjdHVyZXIoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRSZW1vdGVNaW5vckNsYXNzKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UmVtb3RlTmFtZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFJlbW90ZVJldmlzaW9uKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJvb2xlYW4gZ2V0UmVtb3RlU2VydmljZUNoYW5uZWwoCi1qYXZhLmxhbmcuU3RyaW5nCi1zaG9ydAotYW5kcm9pZC5ibHVldG9vdGguSUJsdWV0b290aERldmljZUNhbGxiYWNrKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIGdldFJlbW90ZVNlcnZpY2VDbGFzc2VzKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UmVtb3RlVmVyc2lvbigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFJldmlzaW9uKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VmVyc2lvbigpCi0KLXB1YmxpYyBib29sZWFuIGhhc0JvbmRpbmcoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYm9vbGVhbiBpc0FjbENvbm5lY3RlZCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBib29sZWFuIGlzRGlzY292ZXJpbmcoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKQotCi1wdWJsaWMgYm9vbGVhbiBpc1BlcmlvZGljRGlzY292ZXJ5KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgbGFzdFNlZW4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBsYXN0VXNlZCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gbGlzdEFjbENvbm5lY3Rpb25zKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBsaXN0Qm9uZGluZ3MoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIGxpc3RSZW1vdGVEZXZpY2VzKCkKLQotcHVibGljIGJvb2xlYW4gcmVtb3ZlQm9uZGluZygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHNldERpc2NvdmVyYWJsZVRpbWVvdXQoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldE1vZGUoCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIHNldE5hbWUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYm9vbGVhbiBzZXRQaW4oCi1qYXZhLmxhbmcuU3RyaW5nCi1ieXRlW10pCi0KLXB1YmxpYyBib29sZWFuIHNldFJlbW90ZUFsaWFzKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJvb2xlYW4gc3RhcnREaXNjb3ZlcnkoKQotCi1wdWJsaWMgYm9vbGVhbiBzdGFydERpc2NvdmVyeSgKLWJvb2xlYW4pCi0KLXB1YmxpYyBib29sZWFuIHN0YXJ0UGVyaW9kaWNEaXNjb3ZlcnkoKQotCi1wdWJsaWMgYm9vbGVhbiBzdG9wUGVyaW9kaWNEaXNjb3ZlcnkoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhIZWFkc2V0OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi0gY2xhc3MgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoSGVhZHNldCQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQuY29udGVudC5TZXJ2aWNlQ29ubmVjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhIZWFkc2V0IHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEhlYWRzZXQpCi0KLXB1YmxpYyB2b2lkIG9uU2VydmljZUNvbm5lY3RlZCgKLWFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXB1YmxpYyB2b2lkIG9uU2VydmljZURpc2Nvbm5lY3RlZCgKLWFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEhlYWRzZXQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1VMVF9DQU5DRUxMRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTVUxUX0ZBSUxVUkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTVUxUX1NVQ0NFU1MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQ09OTkVDVEVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0NPTk5FQ1RJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfRElTQ09OTkVDVEVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0VSUk9SCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEFHCi0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LlNlcnZpY2VDb25uZWN0aW9uIG1Db25uZWN0aW9uCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgbUNvbnRleHQKLQotcHJpdmF0ZSBhbmRyb2lkLmJsdWV0b290aC5JQmx1ZXRvb3RoSGVhZHNldCBtU2VydmljZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1zdGF0aWMgYW5kcm9pZC5ibHVldG9vdGguSUJsdWV0b290aEhlYWRzZXQgYWNjZXNzJDAwMigKLWFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEhlYWRzZXQKLWFuZHJvaWQuYmx1ZXRvb3RoLklCbHVldG9vdGhIZWFkc2V0KQotCi1wdWJsaWMgdm9pZCBjbG9zZSgpCi0KLXB1YmxpYyBib29sZWFuIGNvbm5lY3RIZWFkc2V0KAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5ibHVldG9vdGguSUJsdWV0b290aEhlYWRzZXRDYWxsYmFjaykKLQotcHVibGljIGJvb2xlYW4gZGlzY29ubmVjdEhlYWRzZXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvVGhyb3dhYmxlOyApCi1wcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEhlYWRzZXRBZGRyZXNzKCkKLQotcHVibGljIGludCBnZXRTdGF0ZSgpCi0KLXB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGVkKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoSW50ZW50IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUREUkVTUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUxJQVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEJPTkRJTkdfQ1JFQVRFRF9BQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEJPTkRJTkdfUkVNT1ZFRF9BQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENMQVNTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBESVNBQkxFRF9BQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERJU0NPVkVSWV9DT01QTEVURURfQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBESVNDT1ZFUllfU1RBUlRFRF9BQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEVOQUJMRURfQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBIRUFEU0VUX1BSRVZJT1VTX1NUQVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBIRUFEU0VUX1NUQVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBIRUFEU0VUX1NUQVRFX0NIQU5HRURfQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBNT0RFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBNT0RFX0NIQU5HRURfQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBOQU1FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBOQU1FX0NIQU5HRURfQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQQUlSSU5HX0NBTkNFTF9BQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBBSVJJTkdfUkVRVUVTVF9BQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFJFTU9URV9BTElBU19DSEFOR0VEX0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUkVNT1RFX0FMSUFTX0NMRUFSRURfQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSRU1PVEVfREVWSUNFX0NMQVNTX1VQREFURURfQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSRU1PVEVfREVWSUNFX0NPTk5FQ1RFRF9BQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFJFTU9URV9ERVZJQ0VfRElTQVBQRUFSRURfQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSRU1PVEVfREVWSUNFX0RJU0NPTk5FQ1RFRF9BQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFJFTU9URV9ERVZJQ0VfRElTQ09OTkVDVF9SRVFVRVNURURfQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSRU1PVEVfREVWSUNFX0ZPVU5EX0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUkVNT1RFX05BTUVfRkFJTEVEX0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUkVNT1RFX05BTUVfVVBEQVRFRF9BQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFJTU0kKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQuYmx1ZXRvb3RoLkRhdGFiYXNlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLmJsdWV0b290aC5EYXRhYmFzZSBtSW5zdGFuY2UKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBzTG9nTmFtZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgbmF0aXZlIGludCBhZGRTZXJ2aWNlUmVjb3JkRnJvbVhtbE5hdGl2ZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgbmF0aXZlIGludCBhZGRTZXJ2aWNlUmVjb3JkTmF0aXZlKAotYnl0ZVtdKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBjbGFzc0luaXROYXRpdmUoKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIGNsZWFudXBOYXRpdmVEYXRhTmF0aXZlKCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmJsdWV0b290aC5EYXRhYmFzZSBnZXRJbnN0YW5jZSgpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgaW5pdGlhbGl6ZU5hdGl2ZURhdGFOYXRpdmUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIG5hdGl2ZSB2b2lkIHJlbW92ZVNlcnZpY2VSZWNvcmROYXRpdmUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgbmF0aXZlIHZvaWQgdXBkYXRlU2VydmljZVJlY29yZEZyb21YbWxOYXRpdmUoCi1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgbmF0aXZlIHZvaWQgdXBkYXRlU2VydmljZVJlY29yZE5hdGl2ZSgKLWludAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGFkZFNlcnZpY2VSZWNvcmQoCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgYWRkU2VydmljZVJlY29yZEZyb21YbWwoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGFkdmVydGlzZVJmY29tbVNlcnZpY2UoCi1hbmRyb2lkLmJsdWV0b290aC5SZmNvbW1Tb2NrZXQKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudXRpbC5VVUlEKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvVGhyb3dhYmxlOyApCi1wcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpCi0KLXB1YmxpYyB2b2lkIHJlbW92ZVNlcnZpY2VSZWNvcmQoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHVwZGF0ZVNlcnZpY2VSZWNvcmQoCi1pbnQKLWJ5dGVbXSkKLQotcHVibGljIHZvaWQgdXBkYXRlU2VydmljZVJlY29yZEZyb21YbWwoCi1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5ibHVldG9vdGguRGV2aWNlQ2xhc3MgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMQVNTX1VOS05PV04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFKT1JfQ0xBU1NfQVVESU9fVklERU8KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFKT1JfQ0xBU1NfQklUTUFTSwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQUpPUl9DTEFTU19DT01QVVRFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQUpPUl9DTEFTU19JTUFHSU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BSk9SX0NMQVNTX01FRElDQUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFKT1JfQ0xBU1NfTUlTQwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQUpPUl9DTEFTU19ORVRXT1JLSU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BSk9SX0NMQVNTX1BFUklQSEVSQUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFKT1JfQ0xBU1NfUEhPTkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFKT1JfQ0xBU1NfVE9ZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BSk9SX0NMQVNTX1VOQ0FURUdPUklaRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFKT1JfQ0xBU1NfV0VBUkFCTEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlOT1JfQ0xBU1NfQVVESU9fVklERU9fQklUTUFTSwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSU5PUl9DTEFTU19BVURJT19WSURFT19DQU1DT1JERVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlOT1JfQ0xBU1NfQVVESU9fVklERU9fQ0FSX0FVRElPCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JTk9SX0NMQVNTX0FVRElPX1ZJREVPX0hBTkRTRlJFRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSU5PUl9DTEFTU19BVURJT19WSURFT19IRUFEUEhPTkVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JTk9SX0NMQVNTX0FVRElPX1ZJREVPX0hFQURTRVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlOT1JfQ0xBU1NfQVVESU9fVklERU9fSElGSV9BVURJTwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSU5PUl9DTEFTU19BVURJT19WSURFT19MT1VEU1BFQUtFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSU5PUl9DTEFTU19BVURJT19WSURFT19NSUNST1BIT05FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JTk9SX0NMQVNTX0FVRElPX1ZJREVPX1BPUlRBQkxFX0FVRElPCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JTk9SX0NMQVNTX0FVRElPX1ZJREVPX1NFVF9UT1BfQk9YCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JTk9SX0NMQVNTX0FVRElPX1ZJREVPX1VOQ0FURUdPUklaRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlOT1JfQ0xBU1NfQVVESU9fVklERU9fVkNSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JTk9SX0NMQVNTX0FVRElPX1ZJREVPX1ZJREVPX0NBTUVSQQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSU5PUl9DTEFTU19BVURJT19WSURFT19WSURFT19DT05GRVJFTkNJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlOT1JfQ0xBU1NfQVVESU9fVklERU9fVklERU9fRElTUExBWV9BTkRfTE9VRFNQRUFLRVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlOT1JfQ0xBU1NfQVVESU9fVklERU9fVklERU9fR0FNSU5HX1RPWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSU5PUl9DTEFTU19BVURJT19WSURFT19WSURFT19NT05JVE9SCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfQ0xBU1NfQVVESU8KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9DTEFTU19CSVRNQVNLCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfQ0xBU1NfQ0FQVFVSRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX0NMQVNTX0lORk9STUFUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfQ0xBU1NfTElNSVRFRF9ESVNDT1ZFUkFCSUxJVFkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9DTEFTU19ORVRXT1JLSU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfQ0xBU1NfT0JKRUNUX1RSQU5TRkVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfQ0xBU1NfUE9TSVRJT05JTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9DTEFTU19SRU5ERVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9DTEFTU19URUxFUEhPTlkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGludCBnZXRNYWpvckNsYXNzKAotaW50KQotCi1wdWJsaWMgc3RhdGljIGludCBnZXRNaW5vckNsYXNzKAotaW50KQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzU2VydmljZUNsYXNzKAotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotIGNsYXNzIGFuZHJvaWQuYmx1ZXRvb3RoLkhlYWRzZXRCYXNlJDEgZXh0ZW5kcyBhbmRyb2lkLmJsdWV0b290aC5BdENvbW1hbmRIYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQuYmx1ZXRvb3RoLkhlYWRzZXRCYXNlIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQuYmx1ZXRvb3RoLkhlYWRzZXRCYXNlKQotCi1wdWJsaWMgYW5kcm9pZC5ibHVldG9vdGguQXRDb21tYW5kUmVzdWx0IGhhbmRsZVNldENvbW1hbmQoCi1qYXZhLmxhbmcuT2JqZWN0W10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotIGNsYXNzIGFuZHJvaWQuYmx1ZXRvb3RoLkhlYWRzZXRCYXNlJDIgZXh0ZW5kcyBhbmRyb2lkLmJsdWV0b290aC5BdENvbW1hbmRIYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQuYmx1ZXRvb3RoLkhlYWRzZXRCYXNlIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQuYmx1ZXRvb3RoLkhlYWRzZXRCYXNlKQotCi1wdWJsaWMgYW5kcm9pZC5ibHVldG9vdGguQXRDb21tYW5kUmVzdWx0IGhhbmRsZVNldENvbW1hbmQoCi1qYXZhLmxhbmcuT2JqZWN0W10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotIGNsYXNzIGFuZHJvaWQuYmx1ZXRvb3RoLkhlYWRzZXRCYXNlJDMgZXh0ZW5kcyBqYXZhLmxhbmcuVGhyZWFkCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQuYmx1ZXRvb3RoLkhlYWRzZXRCYXNlIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQuYmx1ZXRvb3RoLkhlYWRzZXRCYXNlCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuYmx1ZXRvb3RoLkhlYWRzZXRCYXNlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVJFQ1RJT05fSU5DT01JTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElSRUNUSU9OX09VVEdPSU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJGQ09NTV9ESVNDT05ORUNURUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIG1BZGRyZXNzCi0KLXByb3RlY3RlZCBhbmRyb2lkLmJsdWV0b290aC5BdFBhcnNlciBtQXRQYXJzZXIKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2UgbUJsdWV0b290aAotCi1wcml2YXRlIGZpbmFsIGxvbmcgbUNvbm5lY3RUaW1lc3RhbXAKLQotcHJpdmF0ZSBmaW5hbCBpbnQgbURpcmVjdGlvbgotCi1wcml2YXRlIGphdmEubGFuZy5UaHJlYWQgbUV2ZW50VGhyZWFkCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5IYW5kbGVyIG1FdmVudFRocmVhZEhhbmRsZXIKLQotcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIG1FdmVudFRocmVhZEludGVycnVwdGVkCi0KLXByaXZhdGUgaW50IG1OYXRpdmVEYXRhCi0KLXByaXZhdGUgZmluYWwgaW50IG1SZmNvbW1DaGFubmVsCi0KLXByaXZhdGUgaW50IG1UaW1lb3V0UmVtYWluaW5nTXMKLQotcHJpdmF0ZSBhbmRyb2lkLm9zLlBvd2VyTWFuYWdlciRXYWtlTG9jayBtV2FrZUxvY2sKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuUG93ZXJNYW5hZ2VyCi1hbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2UKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5Qb3dlck1hbmFnZXIKLWFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZQotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQKLWFuZHJvaWQub3MuSGFuZGxlcikKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDAwMCgKLWFuZHJvaWQuYmx1ZXRvb3RoLkhlYWRzZXRCYXNlKQotCi1zdGF0aWMgamF2YS5sYW5nLlN0cmluZyBhY2Nlc3MkMTAwKAotYW5kcm9pZC5ibHVldG9vdGguSGVhZHNldEJhc2UKLWludCkKLQotc3RhdGljIGludCBhY2Nlc3MkMjAwKAotYW5kcm9pZC5ibHVldG9vdGguSGVhZHNldEJhc2UpCi0KLXN0YXRpYyBhbmRyb2lkLm9zLkhhbmRsZXIgYWNjZXNzJDMwMCgKLWFuZHJvaWQuYmx1ZXRvb3RoLkhlYWRzZXRCYXNlKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkNDAwKAotYW5kcm9pZC5ibHVldG9vdGguSGVhZHNldEJhc2UpCi0KLXByaXZhdGUgdm9pZCBhY3F1aXJlV2FrZUxvY2soKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBjbGFzc0luaXROYXRpdmUoKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIGNsZWFudXBOYXRpdmVEYXRhTmF0aXZlKCkKLQotcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBjb25uZWN0QXN5bmNOYXRpdmUoKQotCi1wcml2YXRlIG5hdGl2ZSBib29sZWFuIGNvbm5lY3ROYXRpdmUoKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIGRpc2Nvbm5lY3ROYXRpdmUoKQotCi1wcml2YXRlIG5hdGl2ZSBpbnQgZ2V0TGFzdFJlYWRTdGF0dXNOYXRpdmUoKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIGluaXRpYWxpemVOYXRpdmVEYXRhTmF0aXZlKAotaW50KQotCi1wcml2YXRlIHZvaWQgbG9nKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBuYXRpdmUgamF2YS5sYW5nLlN0cmluZyByZWFkTmF0aXZlKAotaW50KQotCi1wcml2YXRlIHZvaWQgcmVsZWFzZVdha2VMb2NrKCkKLQotcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBzZW5kVVJDTmF0aXZlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSB2b2lkIHN0b3BFdmVudFRocmVhZCgpCi0KLXByaXZhdGUgbmF0aXZlIGludCB3YWl0Rm9yQXN5bmNDb25uZWN0TmF0aXZlKAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBjb25uZWN0KAotYW5kcm9pZC5vcy5IYW5kbGVyKQotCi1wdWJsaWMgYm9vbGVhbiBjb25uZWN0QXN5bmMoKQotCi1wdWJsaWMgdm9pZCBkaXNjb25uZWN0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL1Rocm93YWJsZTsgKQotcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRBZGRyZXNzKCkKLQotcHVibGljIGFuZHJvaWQuYmx1ZXRvb3RoLkF0UGFyc2VyIGdldEF0UGFyc2VyKCkKLQotcHVibGljIGxvbmcgZ2V0Q29ubmVjdFRpbWVzdGFtcCgpCi0KLXB1YmxpYyBpbnQgZ2V0RGlyZWN0aW9uKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TmFtZSgpCi0KLXB1YmxpYyBpbnQgZ2V0UmVtYWluaW5nQXN5bmNDb25uZWN0V2FpdGluZ1RpbWVNcygpCi0KLXByb3RlY3RlZCB2b2lkIGhhbmRsZUlucHV0KAotamF2YS5sYW5nLlN0cmluZykKLQotcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUF0UGFyc2VyKCkKLQotcHVibGljIGJvb2xlYW4gaXNDb25uZWN0ZWQoKQotCi1wdWJsaWMgYm9vbGVhbiBzZW5kVVJDKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc3RhcnRFdmVudFRocmVhZCgpCi0KLXB1YmxpYyBpbnQgd2FpdEZvckFzeW5jQ29ubmVjdCgKLWludAotYW5kcm9pZC5vcy5IYW5kbGVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhEZXZpY2UkU3R1YjsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLmJsdWV0b290aC5JQmx1ZXRvb3RoRGV2aWNlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuSUludGVyZmFjZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBjYW5jZWxCb25kaW5nUHJvY2VzcygKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBjYW5jZWxEaXNjb3ZlcnkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gY2FuY2VsUGluKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGNsZWFyUmVtb3RlQWxpYXMoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gY3JlYXRlQm9uZGluZygKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQuYmx1ZXRvb3RoLklCbHVldG9vdGhEZXZpY2VDYWxsYmFjaykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGRpc2FibGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZGlzY29ubmVjdFJlbW90ZURldmljZUFjbCgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBlbmFibGUoCi1hbmRyb2lkLmJsdWV0b290aC5JQmx1ZXRvb3RoRGV2aWNlQ2FsbGJhY2spCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRBZGRyZXNzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldENvbXBhbnkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCBnZXREaXNjb3ZlcmFibGVUaW1lb3V0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldE1ham9yQ2xhc3MoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0TWFudWZhY3R1cmVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldE1pbm9yQ2xhc3MoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCBnZXRNb2RlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldE5hbWUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0UmVtb3RlQWxpYXMoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCBnZXRSZW1vdGVDbGFzcygKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRSZW1vdGVDb21wYW55KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBieXRlW10gZ2V0UmVtb3RlRmVhdHVyZXMoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0UmVtb3RlTWFqb3JDbGFzcygKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRSZW1vdGVNYW51ZmFjdHVyZXIoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0UmVtb3RlTWlub3JDbGFzcygKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRSZW1vdGVOYW1lKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldFJlbW90ZVJldmlzaW9uKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGdldFJlbW90ZVNlcnZpY2VDaGFubmVsKAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1hbmRyb2lkLmJsdWV0b290aC5JQmx1ZXRvb3RoRGV2aWNlQ2FsbGJhY2spCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZ1tdIGdldFJlbW90ZVNlcnZpY2VDbGFzc2VzKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldFJlbW90ZVZlcnNpb24oCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0UmV2aXNpb24oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0VmVyc2lvbigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBoYXNCb25kaW5nKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzQWNsQ29ubmVjdGVkKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzRGlzY292ZXJpbmcoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNFbmFibGVkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzUGVyaW9kaWNEaXNjb3ZlcnkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgbGFzdFNlZW4oCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgbGFzdFVzZWQoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmdbXSBsaXN0QWNsQ29ubmVjdGlvbnMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmdbXSBsaXN0Qm9uZGluZ3MoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmdbXSBsaXN0UmVtb3RlRGV2aWNlcygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiByZW1vdmVCb25kaW5nKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHNldERpc2NvdmVyYWJsZVRpbWVvdXQoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzZXRNb2RlKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gc2V0TmFtZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzZXRQaW4oCi1qYXZhLmxhbmcuU3RyaW5nCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzZXRSZW1vdGVBbGlhcygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzdGFydERpc2NvdmVyeSgKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzdGFydFBlcmlvZGljRGlzY292ZXJ5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHN0b3BQZXJpb2RpY0Rpc2NvdmVyeSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhEZXZpY2UkU3R1YjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1Qcm94eSApCi0gY2xhc3MgYW5kcm9pZC5ibHVldG9vdGguSUJsdWV0b290aERldmljZSRTdHViJFByb3h5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQuYmx1ZXRvb3RoLklCbHVldG9vdGhEZXZpY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLm9zLklCaW5kZXIgbVJlbW90ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuSUJpbmRlcikKLQotcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBjYW5jZWxCb25kaW5nUHJvY2VzcygKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBjYW5jZWxEaXNjb3ZlcnkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gY2FuY2VsUGluKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIGNsZWFyUmVtb3RlQWxpYXMoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gY3JlYXRlQm9uZGluZygKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQuYmx1ZXRvb3RoLklCbHVldG9vdGhEZXZpY2VDYWxsYmFjaykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIGRpc2FibGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gZGlzY29ubmVjdFJlbW90ZURldmljZUFjbCgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBlbmFibGUoCi1hbmRyb2lkLmJsdWV0b290aC5JQmx1ZXRvb3RoRGV2aWNlQ2FsbGJhY2spCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRBZGRyZXNzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldENvbXBhbnkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXREaXNjb3ZlcmFibGVUaW1lb3V0KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRNYWpvckNsYXNzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE1hbnVmYWN0dXJlcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRNaW5vckNsYXNzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgZ2V0TW9kZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXROYW1lKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFJlbW90ZUFsaWFzKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgZ2V0UmVtb3RlQ2xhc3MoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UmVtb3RlQ29tcGFueSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYnl0ZVtdIGdldFJlbW90ZUZlYXR1cmVzKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFJlbW90ZU1ham9yQ2xhc3MoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UmVtb3RlTWFudWZhY3R1cmVyKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFJlbW90ZU1pbm9yQ2xhc3MoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UmVtb3RlTmFtZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRSZW1vdGVSZXZpc2lvbigKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBnZXRSZW1vdGVTZXJ2aWNlQ2hhbm5lbCgKLWphdmEubGFuZy5TdHJpbmcKLWludAotYW5kcm9pZC5ibHVldG9vdGguSUJsdWV0b290aERldmljZUNhbGxiYWNrKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBnZXRSZW1vdGVTZXJ2aWNlQ2xhc3NlcygKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRSZW1vdGVWZXJzaW9uKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFJldmlzaW9uKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFZlcnNpb24oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gaGFzQm9uZGluZygKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBpc0FjbENvbm5lY3RlZCgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBpc0Rpc2NvdmVyaW5nKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBpc1BlcmlvZGljRGlzY292ZXJ5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGxhc3RTZWVuKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGxhc3RVc2VkKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gbGlzdEFjbENvbm5lY3Rpb25zKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gbGlzdEJvbmRpbmdzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gbGlzdFJlbW90ZURldmljZXMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gcmVtb3ZlQm9uZGluZygKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBzZXREaXNjb3ZlcmFibGVUaW1lb3V0KAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gc2V0TW9kZSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIHNldE5hbWUoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gc2V0UGluKAotamF2YS5sYW5nLlN0cmluZwotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gc2V0UmVtb3RlQWxpYXMoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gc3RhcnREaXNjb3ZlcnkoCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gc3RhcnRQZXJpb2RpY0Rpc2NvdmVyeSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBzdG9wUGVyaW9kaWNEaXNjb3ZlcnkoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoRGV2aWNlOyApCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoRGV2aWNlJFN0dWIkUHJveHk7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAzMyBuYW1lID1TdHViICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBhbmRyb2lkLmJsdWV0b290aC5JQmx1ZXRvb3RoRGV2aWNlJFN0dWIgZXh0ZW5kcyBhbmRyb2lkLm9zLkJpbmRlciBpbXBsZW1lbnRzIGFuZHJvaWQuYmx1ZXRvb3RoLklCbHVldG9vdGhEZXZpY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERVNDUklQVE9SCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fY2FuY2VsQm9uZGluZ1Byb2Nlc3MKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9jYW5jZWxEaXNjb3ZlcnkKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9jYW5jZWxQaW4KLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9jbGVhclJlbW90ZUFsaWFzCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fY3JlYXRlQm9uZGluZwotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2Rpc2FibGUKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9kaXNjb25uZWN0UmVtb3RlRGV2aWNlQWNsCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZW5hYmxlCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZ2V0QWRkcmVzcwotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2dldENvbXBhbnkKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9nZXREaXNjb3ZlcmFibGVUaW1lb3V0Ci0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZ2V0TWFqb3JDbGFzcwotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2dldE1hbnVmYWN0dXJlcgotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2dldE1pbm9yQ2xhc3MKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9nZXRNb2RlCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZ2V0TmFtZQotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2dldFJlbW90ZUFsaWFzCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZ2V0UmVtb3RlQ2xhc3MKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9nZXRSZW1vdGVDb21wYW55Ci0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZ2V0UmVtb3RlRmVhdHVyZXMKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9nZXRSZW1vdGVNYWpvckNsYXNzCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZ2V0UmVtb3RlTWFudWZhY3R1cmVyCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZ2V0UmVtb3RlTWlub3JDbGFzcwotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2dldFJlbW90ZU5hbWUKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9nZXRSZW1vdGVSZXZpc2lvbgotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2dldFJlbW90ZVNlcnZpY2VDaGFubmVsCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZ2V0UmVtb3RlU2VydmljZUNsYXNzZXMKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9nZXRSZW1vdGVWZXJzaW9uCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZ2V0UmV2aXNpb24KLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9nZXRWZXJzaW9uCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05faGFzQm9uZGluZwotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2lzQWNsQ29ubmVjdGVkCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05faXNEaXNjb3ZlcmluZwotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2lzRW5hYmxlZAotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2lzUGVyaW9kaWNEaXNjb3ZlcnkKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9sYXN0U2VlbgotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2xhc3RVc2VkCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fbGlzdEFjbENvbm5lY3Rpb25zCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fbGlzdEJvbmRpbmdzCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fbGlzdFJlbW90ZURldmljZXMKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9yZW1vdmVCb25kaW5nCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fc2V0RGlzY292ZXJhYmxlVGltZW91dAotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3NldE1vZGUKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9zZXROYW1lCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fc2V0UGluCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fc2V0UmVtb3RlQWxpYXMKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9zdGFydERpc2NvdmVyeQotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3N0YXJ0UGVyaW9kaWNEaXNjb3ZlcnkKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9zdG9wUGVyaW9kaWNEaXNjb3ZlcnkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuYmx1ZXRvb3RoLklCbHVldG9vdGhEZXZpY2UgYXNJbnRlcmZhY2UoCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gb25UcmFuc2FjdCgKLWludAotYW5kcm9pZC5vcy5QYXJjZWwKLWFuZHJvaWQub3MuUGFyY2VsCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aERldmljZUNhbGxiYWNrJFN0dWI7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5ibHVldG9vdGguSUJsdWV0b290aERldmljZUNhbGxiYWNrIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuSUludGVyZmFjZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvbkNyZWF0ZUJvbmRpbmdSZXN1bHQoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvbkVuYWJsZVJlc3VsdCgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uR2V0UmVtb3RlU2VydmljZUNoYW5uZWxSZXN1bHQoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhEZXZpY2VDYWxsYmFjayRTdHViOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPVByb3h5ICkKLSBjbGFzcyBhbmRyb2lkLmJsdWV0b290aC5JQmx1ZXRvb3RoRGV2aWNlQ2FsbGJhY2skU3R1YiRQcm94eSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLmJsdWV0b290aC5JQmx1ZXRvb3RoRGV2aWNlQ2FsbGJhY2sKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLm9zLklCaW5kZXIgbVJlbW90ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuSUJpbmRlcikKLQotcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEludGVyZmFjZURlc2NyaXB0b3IoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgb25DcmVhdGVCb25kaW5nUmVzdWx0KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgb25FbmFibGVSZXN1bHQoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBvbkdldFJlbW90ZVNlcnZpY2VDaGFubmVsUmVzdWx0KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAzMyBuYW1lID1TdHViICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoRGV2aWNlQ2FsbGJhY2s7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhEZXZpY2VDYWxsYmFjayRTdHViJFByb3h5OyApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC5ibHVldG9vdGguSUJsdWV0b290aERldmljZUNhbGxiYWNrJFN0dWIgZXh0ZW5kcyBhbmRyb2lkLm9zLkJpbmRlciBpbXBsZW1lbnRzIGFuZHJvaWQuYmx1ZXRvb3RoLklCbHVldG9vdGhEZXZpY2VDYWxsYmFjawotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFU0NSSVBUT1IKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9vbkNyZWF0ZUJvbmRpbmdSZXN1bHQKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9vbkVuYWJsZVJlc3VsdAotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX29uR2V0UmVtb3RlU2VydmljZUNoYW5uZWxSZXN1bHQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuYmx1ZXRvb3RoLklCbHVldG9vdGhEZXZpY2VDYWxsYmFjayBhc0ludGVyZmFjZSgKLWFuZHJvaWQub3MuSUJpbmRlcikKLQotcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBvblRyYW5zYWN0KAotaW50Ci1hbmRyb2lkLm9zLlBhcmNlbAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoSGVhZHNldCRTdHViOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQuYmx1ZXRvb3RoLklCbHVldG9vdGhIZWFkc2V0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuSUludGVyZmFjZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBjb25uZWN0SGVhZHNldCgKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQuYmx1ZXRvb3RoLklCbHVldG9vdGhIZWFkc2V0Q2FsbGJhY2spCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBkaXNjb25uZWN0SGVhZHNldCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRIZWFkc2V0QWRkcmVzcygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldFN0YXRlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzQ29ubmVjdGVkKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aEhlYWRzZXQkU3R1YjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1Qcm94eSApCi0gY2xhc3MgYW5kcm9pZC5ibHVldG9vdGguSUJsdWV0b290aEhlYWRzZXQkU3R1YiRQcm94eSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLmJsdWV0b290aC5JQmx1ZXRvb3RoSGVhZHNldAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGFuZHJvaWQub3MuSUJpbmRlciBtUmVtb3RlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIGNvbm5lY3RIZWFkc2V0KAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5ibHVldG9vdGguSUJsdWV0b290aEhlYWRzZXRDYWxsYmFjaykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGRpc2Nvbm5lY3RIZWFkc2V0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEhlYWRzZXRBZGRyZXNzKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGdldFN0YXRlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGVkKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwMzMgbmFtZSA9U3R1YiApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aEhlYWRzZXQ7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhIZWFkc2V0JFN0dWIkUHJveHk7ICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBhbmRyb2lkLmJsdWV0b290aC5JQmx1ZXRvb3RoSGVhZHNldCRTdHViIGV4dGVuZHMgYW5kcm9pZC5vcy5CaW5kZXIgaW1wbGVtZW50cyBhbmRyb2lkLmJsdWV0b290aC5JQmx1ZXRvb3RoSGVhZHNldAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFU0NSSVBUT1IKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9jb25uZWN0SGVhZHNldAotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2Rpc2Nvbm5lY3RIZWFkc2V0Ci0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZ2V0SGVhZHNldEFkZHJlc3MKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9nZXRTdGF0ZQotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2lzQ29ubmVjdGVkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmJsdWV0b290aC5JQmx1ZXRvb3RoSGVhZHNldCBhc0ludGVyZmFjZSgKLWFuZHJvaWQub3MuSUJpbmRlcikKLQotcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBvblRyYW5zYWN0KAotaW50Ci1hbmRyb2lkLm9zLlBhcmNlbAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoSGVhZHNldENhbGxiYWNrJFN0dWI7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5ibHVldG9vdGguSUJsdWV0b290aEhlYWRzZXRDYWxsYmFjayBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLklJbnRlcmZhY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgb25Db25uZWN0SGVhZHNldFJlc3VsdCgKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPVByb3h5ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoSGVhZHNldENhbGxiYWNrJFN0dWI7ICkKLSBjbGFzcyBhbmRyb2lkLmJsdWV0b290aC5JQmx1ZXRvb3RoSGVhZHNldENhbGxiYWNrJFN0dWIkUHJveHkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5ibHVldG9vdGguSUJsdWV0b290aEhlYWRzZXRDYWxsYmFjawotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGFuZHJvaWQub3MuSUJpbmRlciBtUmVtb3RlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBvbkNvbm5lY3RIZWFkc2V0UmVzdWx0KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhIZWFkc2V0Q2FsbGJhY2skU3R1YiRQcm94eTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhIZWFkc2V0Q2FsbGJhY2s7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAzMyBuYW1lID1TdHViICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBhbmRyb2lkLmJsdWV0b290aC5JQmx1ZXRvb3RoSGVhZHNldENhbGxiYWNrJFN0dWIgZXh0ZW5kcyBhbmRyb2lkLm9zLkJpbmRlciBpbXBsZW1lbnRzIGFuZHJvaWQuYmx1ZXRvb3RoLklCbHVldG9vdGhIZWFkc2V0Q2FsbGJhY2sKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERVNDUklQVE9SCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fb25Db25uZWN0SGVhZHNldFJlc3VsdAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5ibHVldG9vdGguSUJsdWV0b290aEhlYWRzZXRDYWxsYmFjayBhc0ludGVyZmFjZSgKLWFuZHJvaWQub3MuSUJpbmRlcikKLQotcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBvblRyYW5zYWN0KAotaW50Ci1hbmRyb2lkLm9zLlBhcmNlbAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmJsdWV0b290aC5SZmNvbW1Tb2NrZXQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgaW50IG1BY2NlcHRUaW1lb3V0UmVtYWluaW5nTXMKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1BZGRyZXNzCi0KLXByaXZhdGUgamF2YS5pby5GaWxlRGVzY3JpcHRvciBtRmQKLQotcHJvdGVjdGVkIGphdmEuaW8uRmlsZUlucHV0U3RyZWFtIG1JbnB1dFN0cmVhbQotCi1wcml2YXRlIGJvb2xlYW4gbUlzQm91bmQKLQotcHJpdmF0ZSBib29sZWFuIG1Jc0Nvbm5lY3RpbmcKLQotcHJpdmF0ZSBib29sZWFuIG1Jc0xpc3RlbmluZwotCi1wcml2YXRlIGludCBtTmF0aXZlRGF0YQotCi1wcm90ZWN0ZWQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtIG1PdXRwdXRTdHJlYW0KLQotcHJpdmF0ZSBpbnQgbVBvcnQKLQotcHJpdmF0ZSBpbnQgbVRpbWVvdXRSZW1haW5pbmdNcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSBuYXRpdmUgamF2YS5pby5GaWxlRGVzY3JpcHRvciBhY2NlcHROYXRpdmUoCi1hbmRyb2lkLmJsdWV0b290aC5SZmNvbW1Tb2NrZXQKLWludCkKLQotcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBiaW5kTmF0aXZlKAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBjbGFzc0luaXROYXRpdmUoKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIGNsZWFudXBOYXRpdmVEYXRhTmF0aXZlKCkKLQotcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBjb25uZWN0QXN5bmNOYXRpdmUoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXByaXZhdGUgbmF0aXZlIGJvb2xlYW4gY29ubmVjdE5hdGl2ZSgKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHJpdmF0ZSBuYXRpdmUgamF2YS5pby5GaWxlRGVzY3JpcHRvciBjcmVhdGVOYXRpdmUoKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIGRlc3Ryb3lOYXRpdmUoKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIGluaXRpYWxpemVOYXRpdmVEYXRhTmF0aXZlKCkKLQotcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBpbnRlcnJ1cHRBc3luY0Nvbm5lY3ROYXRpdmUoKQotCi1wcml2YXRlIG5hdGl2ZSBpbnQgaXNDb25uZWN0ZWROYXRpdmUoKQotCi1wcml2YXRlIG5hdGl2ZSBib29sZWFuIGxpc3Rlbk5hdGl2ZSgKLWludCkKLQotcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBzaHV0ZG93bk5hdGl2ZSgKLWJvb2xlYW4pCi0KLXByaXZhdGUgbmF0aXZlIGludCB3YWl0Rm9yQXN5bmNDb25uZWN0TmF0aXZlKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5pby5GaWxlRGVzY3JpcHRvciBhY2NlcHQoCi1hbmRyb2lkLmJsdWV0b290aC5SZmNvbW1Tb2NrZXQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gYmluZCgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIGJpbmQoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIGNvbm5lY3QoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIGNvbm5lY3RBc3luYygKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuaW8uRmlsZURlc2NyaXB0b3IgY3JlYXRlKCkKLQotcHVibGljIHZvaWQgZGVzdHJveSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9UaHJvd2FibGU7ICkKLXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuaW8uRmlsZURlc2NyaXB0b3IgZ2V0RmlsZURlc2NyaXB0b3IoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5pby5JbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmlvLk91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGdldFBvcnQoKQotCi1wdWJsaWMgaW50IGdldFJlbWFpbmluZ0FjY2VwdFdhaXRpbmdUaW1lTXMoKQotCi1wdWJsaWMgaW50IGdldFJlbWFpbmluZ0FzeW5jQ29ubmVjdFdhaXRpbmdUaW1lTXMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBpbnRlcnJ1cHRBc3luY0Nvbm5lY3QoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RlZCgpCi0KLXB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGluZygpCi0KLXB1YmxpYyBib29sZWFuIGlzSW5wdXRDb25uZWN0ZWQoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0xpc3RlbmluZygpCi0KLXB1YmxpYyBib29sZWFuIGlzT3V0cHV0Q29ubmVjdGVkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gbGlzdGVuKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBzaHV0ZG93bigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIHNodXRkb3duSW5wdXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBzaHV0ZG93bk91dHB1dCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgd2FpdEZvckFzeW5jQ29ubmVjdCgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmJsdWV0b290aC5TY29Tb2NrZXQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0FDQ0VQVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9DTE9TRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQ09OTkVDVEVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0NPTk5FQ1RJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfUkVBRFkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBWREJHCi0KLXByaXZhdGUgaW50IG1BY2NlcHRlZENvZGUKLQotcHJpdmF0ZSBpbnQgbUNsb3NlZENvZGUKLQotcHJpdmF0ZSBpbnQgbUNvbm5lY3RlZENvZGUKLQotcHJpdmF0ZSBhbmRyb2lkLm9zLkhhbmRsZXIgbUhhbmRsZXIKLQotcHJpdmF0ZSBpbnQgbU5hdGl2ZURhdGEKLQotcHJpdmF0ZSBpbnQgbVN0YXRlCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5Qb3dlck1hbmFnZXIkV2FrZUxvY2sgbVdha2VMb2NrCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLlBvd2VyTWFuYWdlcgotYW5kcm9pZC5vcy5IYW5kbGVyCi1pbnQKLWludAotaW50KQotCi1wcml2YXRlIG5hdGl2ZSBib29sZWFuIGFjY2VwdE5hdGl2ZSgpCi0KLXByaXZhdGUgdm9pZCBhY3F1aXJlV2FrZUxvY2soKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBjbGFzc0luaXROYXRpdmUoKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIGNsb3NlTmF0aXZlKCkKLQotcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBjb25uZWN0TmF0aXZlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBkZXN0cm95TmF0aXZlKCkKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBpbml0TmF0aXZlKCkKLQotcHJpdmF0ZSB2b2lkIGxvZygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgdm9pZCBvbkFjY2VwdGVkKAotaW50KQotCi1wcml2YXRlIHZvaWQgb25DbG9zZWQoKQotCi1wcml2YXRlIHZvaWQgb25Db25uZWN0ZWQoCi1pbnQpCi0KLXByaXZhdGUgdm9pZCByZWxlYXNlV2FrZUxvY2soKQotCi1wdWJsaWMgYm9vbGVhbiBhY2NlcHQoKQotCi1wdWJsaWMgdm9pZCBjbG9zZSgpCi0KLXB1YmxpYyBib29sZWFuIGNvbm5lY3QoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvVGhyb3dhYmxlOyApCi1wcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpCi0KLXB1YmxpYyBpbnQgZ2V0U3RhdGUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGFuZHJvaWQuY29udGVudC5BYnN0cmFjdFRhYmxlTWVyZ2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNFTEVDVF9CWV9JRF9BTkRfQUNDT1VOVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNFTEVDVF9NQVJLRUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTRUxFQ1RfVU5TWU5DRUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLQotcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBUUkFDRQotCi1wcm90ZWN0ZWQgc3RhdGljIGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzIG1TeW5jTWFya1ZhbHVlcwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gc3luY0RpcnR5UHJvamVjdGlvbgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gc3luY0lkQW5kVmVyc2lvblByb2plY3Rpb24KLQotcHJvdGVjdGVkIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlIG1EYgotCi1wcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBtRGVsZXRlZFRhYmxlCi0KLXByb3RlY3RlZCBhbmRyb2lkLm5ldC5VcmkgbURlbGV0ZWRUYWJsZVVSTAotCi1wcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gbUlzTWVyZ2VDYW5jZWxsZWQKLQotcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgbVRhYmxlCi0KLXByb3RlY3RlZCBhbmRyb2lkLm5ldC5VcmkgbVRhYmxlVVJMCi0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXMgbVZhbHVlcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQubmV0LlVyaQotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5uZXQuVXJpKQotCi1wcml2YXRlIHN0YXRpYyBib29sZWFuIGZpbmRJbkN1cnNvcigKLWFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yCi1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgdm9pZCBmaW5kTG9jYWxDaGFuZ2VzKAotYW5kcm9pZC5jb250ZW50LlRlbXBQcm92aWRlclN5bmNSZXN1bHQKLWFuZHJvaWQuY29udGVudC5TeW5jYWJsZUNvbnRlbnRQcm92aWRlcgotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5jb250ZW50LlN5bmNSZXN1bHQpCi0KLXByaXZhdGUgdm9pZCBmdWxseURlbGV0ZVJvd3NXaXRoU3luY0lkKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5jb250ZW50LlN5bmNSZXN1bHQpCi0KLXByaXZhdGUgdm9pZCBtZXJnZVNlcnZlckRpZmZzKAotYW5kcm9pZC5jb250ZW50LlN5bmNDb250ZXh0Ci1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLmNvbnRlbnQuU3luY2FibGVDb250ZW50UHJvdmlkZXIKLWFuZHJvaWQuY29udGVudC5TeW5jUmVzdWx0KQotCi1wcm90ZWN0ZWQgdm9pZCBjdXJzb3JSb3dUb0NvbnRlbnRWYWx1ZXMoCi1hbmRyb2lkLmRhdGFiYXNlLkN1cnNvcgotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXMpCi0KLXB1YmxpYyB2b2lkIGRlbGV0ZVJvdygKLWFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBpbnNlcnRSb3coCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyCi1hbmRyb2lkLmRhdGFiYXNlLkN1cnNvcikKLQotcHVibGljIHZvaWQgbWVyZ2UoCi1hbmRyb2lkLmNvbnRlbnQuU3luY0NvbnRleHQKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQuY29udGVudC5TeW5jYWJsZUNvbnRlbnRQcm92aWRlcgotYW5kcm9pZC5jb250ZW50LlRlbXBQcm92aWRlclN5bmNSZXN1bHQKLWFuZHJvaWQuY29udGVudC5TeW5jUmVzdWx0Ci1hbmRyb2lkLmNvbnRlbnQuU3luY2FibGVDb250ZW50UHJvdmlkZXIpCi0KLXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIG5vdGlmeUNoYW5nZXMoKQotCi1wdWJsaWMgdm9pZCBvbk1lcmdlQ2FuY2VsbGVkKCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgcmVzb2x2ZVJvdygKLWxvbmcKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXIKLWFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB1cGRhdGVSb3coCi1sb25nCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyCi1hbmRyb2lkLmRhdGFiYXNlLkN1cnNvcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmNvbnRlbnQuQWN0aXZpdHlOb3RGb3VuZEV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI4IG5hbWUgPVdvcmtlckFyZ3MgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9Bc3luY1F1ZXJ5SGFuZGxlcjsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQuY29udGVudC5Bc3luY1F1ZXJ5SGFuZGxlciRXb3JrZXJBcmdzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBjb29raWUKLQotcHVibGljIGFuZHJvaWQub3MuSGFuZGxlciBoYW5kbGVyCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIG9yZGVyQnkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBwcm9qZWN0aW9uCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHJlc3VsdAotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBzZWxlY3Rpb24KLQotcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBzZWxlY3Rpb25BcmdzCi0KLXB1YmxpYyBhbmRyb2lkLm5ldC5VcmkgdXJpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlcyB2YWx1ZXMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9NCBuYW1lID1Xb3JrZXJIYW5kbGVyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvQXN5bmNRdWVyeUhhbmRsZXI7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmNvbnRlbnQuQXN5bmNRdWVyeUhhbmRsZXIkV29ya2VySGFuZGxlciBleHRlbmRzIGFuZHJvaWQub3MuSGFuZGxlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLmNvbnRlbnQuQXN5bmNRdWVyeUhhbmRsZXIgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkFzeW5jUXVlcnlIYW5kbGVyCi1hbmRyb2lkLm9zLkxvb3BlcikKLQotcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZSgKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvQXN5bmNRdWVyeUhhbmRsZXIkV29ya2VySGFuZGxlcjtMYW5kcm9pZC9jb250ZW50L0FzeW5jUXVlcnlIYW5kbGVyJFdvcmtlckFyZ3M7ICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBhbmRyb2lkLmNvbnRlbnQuQXN5bmNRdWVyeUhhbmRsZXIgZXh0ZW5kcyBhbmRyb2lkLm9zLkhhbmRsZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0FSR19ERUxFVEUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0FSR19JTlNFUlQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0FSR19RVUVSWQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfQVJHX1VQREFURQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRBRwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGxvY2FsTE9HVgotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLm9zLkxvb3BlciBzTG9vcGVyCi0KLSBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyIG1SZXNvbHZlcgotCi1wcml2YXRlIGFuZHJvaWQub3MuSGFuZGxlciBtV29ya2VyVGhyZWFkSGFuZGxlcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcikKLQotcHVibGljIGZpbmFsIHZvaWQgY2FuY2VsT3BlcmF0aW9uKAotaW50KQotCi1wcm90ZWN0ZWQgYW5kcm9pZC5vcy5IYW5kbGVyIGNyZWF0ZUhhbmRsZXIoCi1hbmRyb2lkLm9zLkxvb3BlcikKLQotcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZSgKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHJvdGVjdGVkIHZvaWQgb25EZWxldGVDb21wbGV0ZSgKLWludAotamF2YS5sYW5nLk9iamVjdAotaW50KQotCi1wcm90ZWN0ZWQgdm9pZCBvbkluc2VydENvbXBsZXRlKAotaW50Ci1qYXZhLmxhbmcuT2JqZWN0Ci1hbmRyb2lkLm5ldC5VcmkpCi0KLXByb3RlY3RlZCB2b2lkIG9uUXVlcnlDb21wbGV0ZSgKLWludAotamF2YS5sYW5nLk9iamVjdAotYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IpCi0KLXByb3RlY3RlZCB2b2lkIG9uVXBkYXRlQ29tcGxldGUoCi1pbnQKLWphdmEubGFuZy5PYmplY3QKLWludCkKLQotcHVibGljIGZpbmFsIHZvaWQgc3RhcnREZWxldGUoCi1pbnQKLWphdmEubGFuZy5PYmplY3QKLWFuZHJvaWQubmV0LlVyaQotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZ1tdKQotCi1wdWJsaWMgZmluYWwgdm9pZCBzdGFydEluc2VydCgKLWludAotamF2YS5sYW5nLk9iamVjdAotYW5kcm9pZC5uZXQuVXJpCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlcykKLQotcHVibGljIHZvaWQgc3RhcnRRdWVyeSgKLWludAotamF2YS5sYW5nLk9iamVjdAotYW5kcm9pZC5uZXQuVXJpCi1qYXZhLmxhbmcuU3RyaW5nW10KLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmdbXQotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGZpbmFsIHZvaWQgc3RhcnRVcGRhdGUoCi1pbnQKLWphdmEubGFuZy5PYmplY3QKLWFuZHJvaWQubmV0LlVyaQotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXMKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExhbmRyb2lkL2NvbnRlbnQvQ29tcG9uZW50TmFtZTs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L0NvbXBvbmVudE5hbWU7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLWZpbmFsIGNsYXNzIGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUgY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZVtdIG5ld0FycmF5KAotaW50KQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdFtdIG5ld0FycmF5KAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC9jb250ZW50L0NvbXBvbmVudE5hbWU7PjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvciBDUkVBVE9SCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBtQ2xhc3MKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIG1QYWNrYWdlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMYW5kcm9pZC9jb250ZW50L0NvbnRleHQ7TGphdmEvbGFuZy9DbGFzczwqPjspViApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotamF2YS5sYW5nLkNsYXNzKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSByZWFkRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIHVuZmxhdHRlbkZyb21TdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVUb1BhcmNlbCgKLWFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZmxhdHRlblRvU2hvcnRTdHJpbmcoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBmbGF0dGVuVG9TdHJpbmcoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRDbGFzc05hbWUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRQYWNrYWdlTmFtZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFNob3J0Q2xhc3NOYW1lKCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU2hvcnRTdHJpbmcoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLXB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLmNvbnRlbnQuQ29udGVudEluc2VydEhhbmRsZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xvcmcveG1sL3NheC9TQVhFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGluc2VydCgKLWFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIKLWphdmEuaW8uSW5wdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgaW5zZXJ0KAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcgotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5jb250ZW50LklDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5JSW50ZXJmYWNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJVTEtfSU5TRVJUX1RSQU5TQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFTEVURV9UUkFOU0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHRVRfU1lOQ19BREFQVEVSX1RSQU5TQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdFVF9UWVBFX1RSQU5TQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOU0VSVF9UUkFOU0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUEVOX0ZJTEVfVFJBTlNBQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUVVFUllfVFJBTlNBQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVBEQVRFX1RSQU5TQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBkZXNjcmlwdG9yCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgYnVsa0luc2VydCgKLWFuZHJvaWQubmV0LlVyaQotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXNbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLmRhdGFiYXNlLklCdWxrQ3Vyc29yIGJ1bGtRdWVyeSgKLWFuZHJvaWQubmV0LlVyaQotamF2YS5sYW5nLlN0cmluZ1tdCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nW10KLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQuZGF0YWJhc2UuSUNvbnRlbnRPYnNlcnZlcgotYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3JXaW5kb3cpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGRlbGV0ZSgKLWFuZHJvaWQubmV0LlVyaQotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZ1tdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQuY29udGVudC5JU3luY0FkYXB0ZXIgZ2V0U3luY0FkYXB0ZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0VHlwZSgKLWFuZHJvaWQubmV0LlVyaSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLm5ldC5VcmkgaW5zZXJ0KAotYW5kcm9pZC5uZXQuVXJpCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247TGphdmEvaW8vRmlsZU5vdEZvdW5kRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciBvcGVuRmlsZSgKLWFuZHJvaWQubmV0LlVyaQotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciBxdWVyeSgKLWFuZHJvaWQubmV0LlVyaQotamF2YS5sYW5nLlN0cmluZ1tdCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nW10KLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IHVwZGF0ZSgKLWFuZHJvaWQubmV0LlVyaQotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXMKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyTmF0aXZlIGV4dGVuZHMgYW5kcm9pZC5vcy5CaW5kZXIgaW1wbGVtZW50cyBhbmRyb2lkLmNvbnRlbnQuSUNvbnRlbnRQcm92aWRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRBRwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5jb250ZW50LklDb250ZW50UHJvdmlkZXIgYXNJbnRlcmZhY2UoCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gb25UcmFuc2FjdCgKLWludAotYW5kcm9pZC5vcy5QYXJjZWwKLWFuZHJvaWQub3MuUGFyY2VsCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPVRyYW5zcG9ydCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L0NvbnRlbnRQcm92aWRlcjsgKQotIGNsYXNzIGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXIkVHJhbnNwb3J0IGV4dGVuZHMgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlck5hdGl2ZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXIpCi0KLXByaXZhdGUgdm9pZCBjaGVja1JlYWRQZXJtaXNzaW9uKAotYW5kcm9pZC5uZXQuVXJpKQotCi1wcml2YXRlIHZvaWQgY2hlY2tXcml0ZVBlcm1pc3Npb24oCi1hbmRyb2lkLm5ldC5VcmkpCi0KLXB1YmxpYyBpbnQgYnVsa0luc2VydCgKLWFuZHJvaWQubmV0LlVyaQotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXNbXSkKLQotcHVibGljIGFuZHJvaWQuZGF0YWJhc2UuSUJ1bGtDdXJzb3IgYnVsa1F1ZXJ5KAotYW5kcm9pZC5uZXQuVXJpCi1qYXZhLmxhbmcuU3RyaW5nW10KLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmdbXQotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5kYXRhYmFzZS5JQ29udGVudE9ic2VydmVyCi1hbmRyb2lkLmRhdGFiYXNlLkN1cnNvcldpbmRvdykKLQotcHVibGljIGludCBkZWxldGUoCi1hbmRyb2lkLm5ldC5VcmkKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotIGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXIgZ2V0Q29udGVudFByb3ZpZGVyKCkKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5JU3luY0FkYXB0ZXIgZ2V0U3luY0FkYXB0ZXIoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRUeXBlKAotYW5kcm9pZC5uZXQuVXJpKQotCi1wdWJsaWMgYW5kcm9pZC5uZXQuVXJpIGluc2VydCgKLWFuZHJvaWQubmV0LlVyaQotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vRmlsZU5vdEZvdW5kRXhjZXB0aW9uOyApCi1wdWJsaWMgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciBvcGVuRmlsZSgKLWFuZHJvaWQubmV0LlVyaQotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIHF1ZXJ5KAotYW5kcm9pZC5uZXQuVXJpCi1qYXZhLmxhbmcuU3RyaW5nW10KLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmdbXQotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGludCB1cGRhdGUoCi1hbmRyb2lkLm5ldC5VcmkKLWFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L0NvbnRlbnRQcm92aWRlciRUcmFuc3BvcnQ7ICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQuY29udGVudC5Db21wb25lbnRDYWxsYmFja3MKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBtQ29udGV4dAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbVJlYWRQZXJtaXNzaW9uCi0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlciRUcmFuc3BvcnQgbVRyYW5zcG9ydAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbVdyaXRlUGVybWlzc2lvbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlciBjb2VyY2VUb0xvY2FsQ29udGVudFByb3ZpZGVyKAotYW5kcm9pZC5jb250ZW50LklDb250ZW50UHJvdmlkZXIpCi0KLXB1YmxpYyB2b2lkIGF0dGFjaEluZm8oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC5jb250ZW50LnBtLlByb3ZpZGVySW5mbykKLQotcHVibGljIGludCBidWxrSW5zZXJ0KAotYW5kcm9pZC5uZXQuVXJpCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlc1tdKQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGRlbGV0ZSgKLWFuZHJvaWQubmV0LlVyaQotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZ1tdKQotCi1wdWJsaWMgZmluYWwgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgZ2V0Q29udGV4dCgpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuSUNvbnRlbnRQcm92aWRlciBnZXRJQ29udGVudFByb3ZpZGVyKCkKLQotcHVibGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgZ2V0UmVhZFBlcm1pc3Npb24oKQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LlN5bmNBZGFwdGVyIGdldFN5bmNBZGFwdGVyKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0VHlwZSgKLWFuZHJvaWQubmV0LlVyaSkKLQotcHVibGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgZ2V0V3JpdGVQZXJtaXNzaW9uKCkKLQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQubmV0LlVyaSBpbnNlcnQoCi1hbmRyb2lkLm5ldC5VcmkKLWFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzKQotCi1wcm90ZWN0ZWQgYm9vbGVhbiBpc1RlbXBvcmFyeSgpCi0KLXB1YmxpYyB2b2lkIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQoCi1hbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb24pCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIG9uQ3JlYXRlKCkKLQotcHVibGljIHZvaWQgb25Mb3dNZW1vcnkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0ZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHVibGljIGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3Igb3BlbkZpbGUoCi1hbmRyb2lkLm5ldC5VcmkKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vRmlsZU5vdEZvdW5kRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciBvcGVuRmlsZUhlbHBlcigKLWFuZHJvaWQubmV0LlVyaQotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIHF1ZXJ5KAotYW5kcm9pZC5uZXQuVXJpCi1qYXZhLmxhbmcuU3RyaW5nW10KLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmdbXQotamF2YS5sYW5nLlN0cmluZykKLQotcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0UmVhZFBlcm1pc3Npb24oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRXcml0ZVBlcm1pc3Npb24oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IHVwZGF0ZSgKLWFuZHJvaWQubmV0LlVyaQotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXMKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLWZpbmFsIGNsYXNzIGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXJQcm94eSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLmNvbnRlbnQuSUNvbnRlbnRQcm92aWRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGFuZHJvaWQub3MuSUJpbmRlciBtUmVtb3RlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgYnVsa0luc2VydCgKLWFuZHJvaWQubmV0LlVyaQotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXNbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhbmRyb2lkLmRhdGFiYXNlLklCdWxrQ3Vyc29yIGJ1bGtRdWVyeSgKLWFuZHJvaWQubmV0LlVyaQotamF2YS5sYW5nLlN0cmluZ1tdCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nW10KLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQuZGF0YWJhc2UuSUNvbnRlbnRPYnNlcnZlcgotYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3JXaW5kb3cpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGRlbGV0ZSgKLWFuZHJvaWQubmV0LlVyaQotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZ1tdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFuZHJvaWQuY29udGVudC5JU3luY0FkYXB0ZXIgZ2V0U3luY0FkYXB0ZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VHlwZSgKLWFuZHJvaWQubmV0LlVyaSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhbmRyb2lkLm5ldC5VcmkgaW5zZXJ0KAotYW5kcm9pZC5uZXQuVXJpCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247TGphdmEvaW8vRmlsZU5vdEZvdW5kRXhjZXB0aW9uOyApCi1wdWJsaWMgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciBvcGVuRmlsZSgKLWFuZHJvaWQubmV0LlVyaQotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciBxdWVyeSgKLWFuZHJvaWQubmV0LlVyaQotamF2YS5sYW5nLlN0cmluZ1tdCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nW10KLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHVwZGF0ZSgKLWFuZHJvaWQubmV0LlVyaQotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXMKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL2RhdGFiYXNlL0NvbnRlbnRPYnNlcnZlciRUcmFuc3BvcnQ7TGFuZHJvaWQvZGF0YWJhc2UvQ29udGVudE9ic2VydmVyJE5vdGlmaWNhdGlvblJ1bm5hYmxlOyApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS5sYW5nLk9iamVjdCBsb2NrCi0KLSBhbmRyb2lkLm9zLkhhbmRsZXIgbUhhbmRsZXIKLQotcHJpdmF0ZSBhbmRyb2lkLmRhdGFiYXNlLkNvbnRlbnRPYnNlcnZlciRUcmFuc3BvcnQgbVRyYW5zcG9ydAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuSGFuZGxlcikKLQotcHVibGljIGJvb2xlYW4gZGVsaXZlclNlbGZOb3RpZmljYXRpb25zKCkKLQotcHVibGljIGZpbmFsIHZvaWQgZGlzcGF0Y2hDaGFuZ2UoCi1ib29sZWFuKQotCi1wdWJsaWMgYW5kcm9pZC5kYXRhYmFzZS5JQ29udGVudE9ic2VydmVyIGdldENvbnRlbnRPYnNlcnZlcigpCi0KLXB1YmxpYyB2b2lkIG9uQ2hhbmdlKAotYm9vbGVhbikKLQotcHVibGljIGFuZHJvaWQuZGF0YWJhc2UuSUNvbnRlbnRPYnNlcnZlciByZWxlYXNlQ29udGVudE9ic2VydmVyKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi0gY2xhc3MgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRRdWVyeU1hcCQxIGV4dGVuZHMgYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRRdWVyeU1hcCB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFF1ZXJ5TWFwCi1hbmRyb2lkLm9zLkhhbmRsZXIpCi0KLXB1YmxpYyB2b2lkIG9uQ2hhbmdlKAotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFF1ZXJ5TWFwIGV4dGVuZHMgamF2YS51dGlsLk9ic2VydmFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nW10gbUNvbHVtbk5hbWVzCi0KLXByaXZhdGUgYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXIgbUNvbnRlbnRPYnNlcnZlcgotCi1wcml2YXRlIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIG1DdXJzb3IKLQotcHJpdmF0ZSBib29sZWFuIG1EaXJ0eQotCi1wcml2YXRlIGFuZHJvaWQub3MuSGFuZGxlciBtSGFuZGxlckZvclVwZGF0ZU5vdGlmaWNhdGlvbnMKLQotcHJpdmF0ZSBib29sZWFuIG1LZWVwVXBkYXRlZAotCi1wcml2YXRlIGludCBtS2V5Q29sdW1uCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TGFuZHJvaWQvY29udGVudC9Db250ZW50VmFsdWVzOz47ICkKLXByaXZhdGUgamF2YS51dGlsLk1hcCBtVmFsdWVzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4KLWFuZHJvaWQub3MuSGFuZGxlcikKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDAwMigKLWFuZHJvaWQuY29udGVudC5Db250ZW50UXVlcnlNYXAKLWJvb2xlYW4pCi0KLXByaXZhdGUgdm9pZCByZWFkQ3Vyc29ySW50b0NhY2hlKCkKLQotcHVibGljIHZvaWQgY2xvc2UoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvVGhyb3dhYmxlOyApCi1wcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMYW5kcm9pZC9jb250ZW50L0NvbnRlbnRWYWx1ZXM7PjsgKQotcHVibGljIGphdmEudXRpbC5NYXAgZ2V0Um93cygpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlcyBnZXRWYWx1ZXMoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCByZXF1ZXJ5KCkKLQotcHVibGljIHZvaWQgc2V0S2VlcFVwZGF0ZWQoCi1ib29sZWFuKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGphdmEubGFuZy5EZXByZWNhdGVkCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBhYm9ydFVwZGF0ZXMoKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBjbG9zZSgpCi1AamF2YS5sYW5nLkRlcHJlY2F0ZWQKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGNvbW1pdFVwZGF0ZXMoKQotQGphdmEubGFuZy5EZXByZWNhdGVkCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTWFwPCtMamF2YS9sYW5nL0xvbmc7K0xqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvT2JqZWN0Oz47PjspWiApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBjb21taXRVcGRhdGVzKAotamF2YS51dGlsLk1hcCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgY29weVN0cmluZ1RvQnVmZmVyKAotaW50Ci1hbmRyb2lkLmRhdGFiYXNlLkNoYXJBcnJheUJ1ZmZlcikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZGVhY3RpdmF0ZSgpCi1AamF2YS5sYW5nLkRlcHJlY2F0ZWQKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGRlbGV0ZVJvdygpCi0KLXB1YmxpYyBhYnN0cmFjdCBieXRlW10gZ2V0QmxvYigKLWludCkKLQotcHVibGljIGFic3RyYWN0IGludCBnZXRDb2x1bW5Db3VudCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0Q29sdW1uSW5kZXgoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldENvbHVtbkluZGV4T3JUaHJvdygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldENvbHVtbk5hbWUoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0Q29sdW1uTmFtZXMoKQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldENvdW50KCkKLQotcHVibGljIGFic3RyYWN0IGRvdWJsZSBnZXREb3VibGUoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLm9zLkJ1bmRsZSBnZXRFeHRyYXMoKQotCi1wdWJsaWMgYWJzdHJhY3QgZmxvYXQgZ2V0RmxvYXQoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0SW50KAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgbG9uZyBnZXRMb25nKAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldFBvc2l0aW9uKCkKLQotcHVibGljIGFic3RyYWN0IHNob3J0IGdldFNob3J0KAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRTdHJpbmcoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGdldFdhbnRzQWxsT25Nb3ZlQ2FsbHMoKQotQGphdmEubGFuZy5EZXByZWNhdGVkCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBoYXNVcGRhdGVzKCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNBZnRlckxhc3QoKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0JlZm9yZUZpcnN0KCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNDbG9zZWQoKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0ZpcnN0KCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNMYXN0KCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNOdWxsKAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBtb3ZlKAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBtb3ZlVG9GaXJzdCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIG1vdmVUb0xhc3QoKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBtb3ZlVG9OZXh0KCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gbW92ZVRvUG9zaXRpb24oCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIG1vdmVUb1ByZXZpb3VzKCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgcmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoCi1hbmRyb2lkLmRhdGFiYXNlLkNvbnRlbnRPYnNlcnZlcikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgcmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIoCi1hbmRyb2lkLmRhdGFiYXNlLkRhdGFTZXRPYnNlcnZlcikKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gcmVxdWVyeSgpCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLm9zLkJ1bmRsZSByZXNwb25kKAotYW5kcm9pZC5vcy5CdW5kbGUpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldE5vdGlmaWNhdGlvblVyaSgKLWFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIKLWFuZHJvaWQubmV0LlVyaSkKLUBqYXZhLmxhbmcuRGVwcmVjYXRlZAotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gc3VwcG9ydHNVcGRhdGVzKCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgdW5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcigKLWFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB1bnJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKAotYW5kcm9pZC5kYXRhYmFzZS5EYXRhU2V0T2JzZXJ2ZXIpCi1AamF2YS5sYW5nLkRlcHJlY2F0ZWQKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHVwZGF0ZUJsb2IoCi1pbnQKLWJ5dGVbXSkKLUBqYXZhLmxhbmcuRGVwcmVjYXRlZAotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gdXBkYXRlRG91YmxlKAotaW50Ci1kb3VibGUpCi1AamF2YS5sYW5nLkRlcHJlY2F0ZWQKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHVwZGF0ZUZsb2F0KAotaW50Ci1mbG9hdCkKLUBqYXZhLmxhbmcuRGVwcmVjYXRlZAotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gdXBkYXRlSW50KAotaW50Ci1pbnQpCi1AamF2YS5sYW5nLkRlcHJlY2F0ZWQKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHVwZGF0ZUxvbmcoCi1pbnQKLWxvbmcpCi1AamF2YS5sYW5nLkRlcHJlY2F0ZWQKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHVwZGF0ZVNob3J0KAotaW50Ci1zaG9ydCkKLUBqYXZhLmxhbmcuRGVwcmVjYXRlZAotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gdXBkYXRlU3RyaW5nKAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotQGphdmEubGFuZy5EZXByZWNhdGVkCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiB1cGRhdGVUb051bGwoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3JXcmFwcGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IgbUN1cnNvcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yKQotCi1wdWJsaWMgdm9pZCBhYm9ydFVwZGF0ZXMoKQotCi1wdWJsaWMgdm9pZCBjbG9zZSgpCi0KLXB1YmxpYyBib29sZWFuIGNvbW1pdFVwZGF0ZXMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL01hcDwrTGphdmEvbGFuZy9Mb25nOytMamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL09iamVjdDs+Oz47KVogKQotcHVibGljIGJvb2xlYW4gY29tbWl0VXBkYXRlcygKLWphdmEudXRpbC5NYXApCi0KLXB1YmxpYyB2b2lkIGNvcHlTdHJpbmdUb0J1ZmZlcigKLWludAotYW5kcm9pZC5kYXRhYmFzZS5DaGFyQXJyYXlCdWZmZXIpCi0KLXB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKQotCi1wdWJsaWMgYm9vbGVhbiBkZWxldGVSb3coKQotCi1wdWJsaWMgYnl0ZVtdIGdldEJsb2IoCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0Q29sdW1uQ291bnQoKQotCi1wdWJsaWMgaW50IGdldENvbHVtbkluZGV4KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXRDb2x1bW5JbmRleE9yVGhyb3coCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRDb2x1bW5OYW1lKAotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIGdldENvbHVtbk5hbWVzKCkKLQotcHVibGljIGludCBnZXRDb3VudCgpCi0KLXB1YmxpYyBkb3VibGUgZ2V0RG91YmxlKAotaW50KQotCi1wdWJsaWMgYW5kcm9pZC5vcy5CdW5kbGUgZ2V0RXh0cmFzKCkKLQotcHVibGljIGZsb2F0IGdldEZsb2F0KAotaW50KQotCi1wdWJsaWMgaW50IGdldEludCgKLWludCkKLQotcHVibGljIGxvbmcgZ2V0TG9uZygKLWludCkKLQotcHVibGljIGludCBnZXRQb3NpdGlvbigpCi0KLXB1YmxpYyBzaG9ydCBnZXRTaG9ydCgKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nKAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBnZXRXYW50c0FsbE9uTW92ZUNhbGxzKCkKLQotcHVibGljIGJvb2xlYW4gaGFzVXBkYXRlcygpCi0KLXB1YmxpYyBib29sZWFuIGlzQWZ0ZXJMYXN0KCkKLQotcHVibGljIGJvb2xlYW4gaXNCZWZvcmVGaXJzdCgpCi0KLXB1YmxpYyBib29sZWFuIGlzQ2xvc2VkKCkKLQotcHVibGljIGJvb2xlYW4gaXNGaXJzdCgpCi0KLXB1YmxpYyBib29sZWFuIGlzTGFzdCgpCi0KLXB1YmxpYyBib29sZWFuIGlzTnVsbCgKLWludCkKLQotcHVibGljIGJvb2xlYW4gbW92ZSgKLWludCkKLQotcHVibGljIGJvb2xlYW4gbW92ZVRvRmlyc3QoKQotCi1wdWJsaWMgYm9vbGVhbiBtb3ZlVG9MYXN0KCkKLQotcHVibGljIGJvb2xlYW4gbW92ZVRvTmV4dCgpCi0KLXB1YmxpYyBib29sZWFuIG1vdmVUb1Bvc2l0aW9uKAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBtb3ZlVG9QcmV2aW91cygpCi0KLXB1YmxpYyB2b2lkIHJlZ2lzdGVyQ29udGVudE9ic2VydmVyKAotYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXIpCi0KLXB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKAotYW5kcm9pZC5kYXRhYmFzZS5EYXRhU2V0T2JzZXJ2ZXIpCi0KLXB1YmxpYyBib29sZWFuIHJlcXVlcnkoKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5CdW5kbGUgcmVzcG9uZCgKLWFuZHJvaWQub3MuQnVuZGxlKQotCi1wdWJsaWMgdm9pZCBzZXROb3RpZmljYXRpb25VcmkoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1hbmRyb2lkLm5ldC5VcmkpCi0KLXB1YmxpYyBib29sZWFuIHN1cHBvcnRzVXBkYXRlcygpCi0KLXB1YmxpYyB2b2lkIHVucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoCi1hbmRyb2lkLmRhdGFiYXNlLkNvbnRlbnRPYnNlcnZlcikKLQotcHVibGljIHZvaWQgdW5yZWdpc3RlckRhdGFTZXRPYnNlcnZlcigKLWFuZHJvaWQuZGF0YWJhc2UuRGF0YVNldE9ic2VydmVyKQotCi1wdWJsaWMgYm9vbGVhbiB1cGRhdGVCbG9iKAotaW50Ci1ieXRlW10pCi0KLXB1YmxpYyBib29sZWFuIHVwZGF0ZURvdWJsZSgKLWludAotZG91YmxlKQotCi1wdWJsaWMgYm9vbGVhbiB1cGRhdGVGbG9hdCgKLWludAotZmxvYXQpCi0KLXB1YmxpYyBib29sZWFuIHVwZGF0ZUludCgKLWludAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiB1cGRhdGVMb25nKAotaW50Ci1sb25nKQotCi1wdWJsaWMgYm9vbGVhbiB1cGRhdGVTaG9ydCgKLWludAotc2hvcnQpCi0KLXB1YmxpYyBib29sZWFuIHVwZGF0ZVN0cmluZygKLWludAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJvb2xlYW4gdXBkYXRlVG9OdWxsKAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvQ29udGVudFJlc29sdmVyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE4IG5hbWUgPUN1cnNvcldyYXBwZXJJbm5lciApCi1maW5hbCBjbGFzcyBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyJEN1cnNvcldyYXBwZXJJbm5lciBleHRlbmRzIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yV3JhcHBlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEFHCi0KLXByaXZhdGUgYm9vbGVhbiBtQ2xvc2VGbGFnCi0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LklDb250ZW50UHJvdmlkZXIgbUNvbnRlbnRQcm92aWRlcgotCi1maW5hbCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIKLWFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yCi1hbmRyb2lkLmNvbnRlbnQuSUNvbnRlbnRQcm92aWRlcikKLQotcHVibGljIHZvaWQgY2xvc2UoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvVGhyb3dhYmxlOyApCi1wcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9vcy9QYXJjZWxGaWxlRGVzY3JpcHRvciRBdXRvQ2xvc2VPdXRwdXRTdHJlYW07TGFuZHJvaWQvb3MvUGFyY2VsRmlsZURlc2NyaXB0b3IkQXV0b0Nsb3NlSW5wdXRTdHJlYW07ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC9vcy9QYXJjZWxGaWxlRGVzY3JpcHRvcjs+OyApCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yIENSRUFUT1IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9DUkVBVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9SRUFEX09OTFkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9SRUFEX1dSSVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfVFJVTkNBVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9XT1JMRF9SRUFEQUJMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX1dPUkxEX1dSSVRFQUJMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX1dSSVRFX09OTFkKLQotcHJpdmF0ZSBib29sZWFuIG1DbG9zZWQKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yIG1GaWxlRGVzY3JpcHRvcgotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IgbVBhcmNlbERlc2NyaXB0b3IKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IpCi0KLSB2b2lkIDxpbml0PigKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciBmcm9tU29ja2V0KAotamF2YS5uZXQuU29ja2V0KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgamF2YS5pby5GaWxlRGVzY3JpcHRvciBnZXRGaWxlRGVzY3JpcHRvckZyb21Tb2NrZXQoCi1qYXZhLm5ldC5Tb2NrZXQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vRmlsZU5vdEZvdW5kRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3Igb3BlbigKLWphdmEuaW8uRmlsZQotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjbG9zZSgpCi0KLXB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9UaHJvd2FibGU7ICkKLXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkKLQotcHVibGljIGphdmEuaW8uRmlsZURlc2NyaXB0b3IgZ2V0RmlsZURlc2NyaXB0b3IoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLXB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvQ29udGVudFJlc29sdmVyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE4IG5hbWUgPVBhcmNlbEZpbGVEZXNjcmlwdG9ySW5uZXIgKQotZmluYWwgY2xhc3MgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlciRQYXJjZWxGaWxlRGVzY3JpcHRvcklubmVyIGV4dGVuZHMgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEFHCi0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LklDb250ZW50UHJvdmlkZXIgbUNvbnRlbnRQcm92aWRlcgotCi1wcml2YXRlIGJvb2xlYW4gbVJlbGVhc2VQcm92aWRlckZsYWcKLQotZmluYWwgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1hbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yCi1hbmRyb2lkLmNvbnRlbnQuSUNvbnRlbnRQcm92aWRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY2xvc2UoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvVGhyb3dhYmxlOyApCi1wcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9Db250ZW50U2VydmljZTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNSBuYW1lID1PYnNlcnZlckNhbGwgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQuY29udGVudC5Db250ZW50U2VydmljZSRPYnNlcnZlckNhbGwgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQuY29udGVudC5Db250ZW50U2VydmljZSRPYnNlcnZlck5vZGUgbU5vZGUKLQotZmluYWwgYW5kcm9pZC5kYXRhYmFzZS5JQ29udGVudE9ic2VydmVyIG1PYnNlcnZlcgotCi1maW5hbCBib29sZWFuIG1TZWxmTm90aWZ5Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRTZXJ2aWNlJE9ic2VydmVyTm9kZQotYW5kcm9pZC5kYXRhYmFzZS5JQ29udGVudE9ic2VydmVyCi1ib29sZWFuKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvQ29udGVudFNlcnZpY2UkT2JzZXJ2ZXJOb2RlOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTIgbmFtZSA9T2JzZXJ2ZXJFbnRyeSApCi0gY2xhc3MgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRTZXJ2aWNlJE9ic2VydmVyTm9kZSRPYnNlcnZlckVudHJ5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuSUJpbmRlciREZWF0aFJlY2lwaWVudAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYm9vbGVhbiBub3RpZnlGb3JEZXNjZW5kZW50cwotCi1wdWJsaWMgYW5kcm9pZC5kYXRhYmFzZS5JQ29udGVudE9ic2VydmVyIG9ic2VydmVyCi0KLWZpbmFsIGFuZHJvaWQuY29udGVudC5Db250ZW50U2VydmljZSRPYnNlcnZlck5vZGUgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRTZXJ2aWNlJE9ic2VydmVyTm9kZQotYW5kcm9pZC5kYXRhYmFzZS5JQ29udGVudE9ic2VydmVyCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBiaW5kZXJEaWVkKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI1IG5hbWUgPU9ic2VydmVyTm9kZSApCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvQ29udGVudFNlcnZpY2UkT2JzZXJ2ZXJOb2RlJE9ic2VydmVyRW50cnk7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvQ29udGVudFNlcnZpY2U7ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFNlcnZpY2UkT2JzZXJ2ZXJOb2RlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUxFVEVfVFlQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlNFUlRfVFlQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBVUERBVEVfVFlQRQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQXJyYXlMaXN0PExhbmRyb2lkL2NvbnRlbnQvQ29udGVudFNlcnZpY2UkT2JzZXJ2ZXJOb2RlOz47ICkKLXByaXZhdGUgamF2YS51dGlsLkFycmF5TGlzdCBtQ2hpbGRyZW4KLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1OYW1lCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9BcnJheUxpc3Q8TGFuZHJvaWQvY29udGVudC9Db250ZW50U2VydmljZSRPYnNlcnZlck5vZGUkT2JzZXJ2ZXJFbnRyeTs+OyApCi1wcml2YXRlIGphdmEudXRpbC5BcnJheUxpc3QgbU9ic2VydmVycwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXN0YXRpYyBqYXZhLnV0aWwuQXJyYXlMaXN0IGFjY2VzcyQwMDAoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFNlcnZpY2UkT2JzZXJ2ZXJOb2RlKQotCi1wcml2YXRlIHZvaWQgYWRkT2JzZXJ2ZXIoCi1hbmRyb2lkLm5ldC5VcmkKLWludAotYW5kcm9pZC5kYXRhYmFzZS5JQ29udGVudE9ic2VydmVyCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMYW5kcm9pZC9uZXQvVXJpO1pMYW5kcm9pZC9kYXRhYmFzZS9JQ29udGVudE9ic2VydmVyO1pMamF2YS91dGlsL0FycmF5TGlzdDxMYW5kcm9pZC9jb250ZW50L0NvbnRlbnRTZXJ2aWNlJE9ic2VydmVyQ2FsbDs+OylWICkKLXByaXZhdGUgdm9pZCBjb2xsZWN0TXlPYnNlcnZlcnMoCi1hbmRyb2lkLm5ldC5VcmkKLWJvb2xlYW4KLWFuZHJvaWQuZGF0YWJhc2UuSUNvbnRlbnRPYnNlcnZlcgotYm9vbGVhbgotamF2YS51dGlsLkFycmF5TGlzdCkKLQotcHJpdmF0ZSBpbnQgY291bnRVcmlTZWdtZW50cygKLWFuZHJvaWQubmV0LlVyaSkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGdldFVyaVNlZ21lbnQoCi1hbmRyb2lkLm5ldC5VcmkKLWludCkKLQotcHVibGljIHZvaWQgYWRkT2JzZXJ2ZXIoCi1hbmRyb2lkLm5ldC5VcmkKLWFuZHJvaWQuZGF0YWJhc2UuSUNvbnRlbnRPYnNlcnZlcgotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGFuZHJvaWQvbmV0L1VyaTtJTGFuZHJvaWQvZGF0YWJhc2UvSUNvbnRlbnRPYnNlcnZlcjtaTGphdmEvdXRpbC9BcnJheUxpc3Q8TGFuZHJvaWQvY29udGVudC9Db250ZW50U2VydmljZSRPYnNlcnZlckNhbGw7PjspViApCi1wdWJsaWMgdm9pZCBjb2xsZWN0T2JzZXJ2ZXJzKAotYW5kcm9pZC5uZXQuVXJpCi1pbnQKLWFuZHJvaWQuZGF0YWJhc2UuSUNvbnRlbnRPYnNlcnZlcgotYm9vbGVhbgotamF2YS51dGlsLkFycmF5TGlzdCkKLQotcHVibGljIGJvb2xlYW4gcmVtb3ZlT2JzZXJ2ZXIoCi1hbmRyb2lkLmRhdGFiYXNlLklDb250ZW50T2JzZXJ2ZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQuY29udGVudC5JQ29udGVudFNlcnZpY2UgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5JSW50ZXJmYWNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBTkNFTF9TWU5DX1RSQU5TQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PVElGWV9DSEFOR0VfVFJBTlNBQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVHSVNURVJfQ09OVEVOVF9PQlNFUlZFUl9UUkFOU0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0VSVklDRV9OQU1FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVJUX1NZTkNfVFJBTlNBQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5SRUdJU1RFUl9DSEFOR0VfT0JTRVJWRVJfVFJBTlNBQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGRlc2NyaXB0b3IKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgY2FuY2VsU3luYygKLWFuZHJvaWQubmV0LlVyaSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG5vdGlmeUNoYW5nZSgKLWFuZHJvaWQubmV0LlVyaQotYW5kcm9pZC5kYXRhYmFzZS5JQ29udGVudE9ic2VydmVyCi1ib29sZWFuCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgcmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoCi1hbmRyb2lkLm5ldC5VcmkKLWJvb2xlYW4KLWFuZHJvaWQuZGF0YWJhc2UuSUNvbnRlbnRPYnNlcnZlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHN0YXJ0U3luYygKLWFuZHJvaWQubmV0LlVyaQotYW5kcm9pZC5vcy5CdW5kbGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB1bnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKAotYW5kcm9pZC5kYXRhYmFzZS5JQ29udGVudE9ic2VydmVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRTZXJ2aWNlTmF0aXZlIGV4dGVuZHMgYW5kcm9pZC5vcy5CaW5kZXIgaW1wbGVtZW50cyBhbmRyb2lkLmNvbnRlbnQuSUNvbnRlbnRTZXJ2aWNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGFuZHJvaWQuY29udGVudC5JQ29udGVudFNlcnZpY2UgZ0RlZmF1bHQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuY29udGVudC5JQ29udGVudFNlcnZpY2UgYXNJbnRlcmZhY2UoCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5jb250ZW50LklDb250ZW50U2VydmljZSBnZXREZWZhdWx0KCkKLQotcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCi0KLXB1YmxpYyBib29sZWFuIG9uVHJhbnNhY3QoCi1pbnQKLWFuZHJvaWQub3MuUGFyY2VsCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9Db250ZW50U2VydmljZSRPYnNlcnZlck5vZGU7TGFuZHJvaWQvY29udGVudC9Db250ZW50U2VydmljZSRPYnNlcnZlckNhbGw7ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFNlcnZpY2UgZXh0ZW5kcyBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFNlcnZpY2VOYXRpdmUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLQotcHJpdmF0ZSBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBtQ29udGV4dAotCi1wcml2YXRlIGJvb2xlYW4gbUZhY3RvcnlUZXN0Ci0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRTZXJ2aWNlJE9ic2VydmVyTm9kZSBtUm9vdE5vZGUKLQotcHJpdmF0ZSBhbmRyb2lkLmNvbnRlbnQuU3luY01hbmFnZXIgbVN5bmNNYW5hZ2VyCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLk9iamVjdCBtU3luY01hbmFnZXJMb2NrCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWJvb2xlYW4pCi0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LlN5bmNNYW5hZ2VyIGdldFN5bmNNYW5hZ2VyKCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuSUNvbnRlbnRTZXJ2aWNlIG1haW4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYm9vbGVhbikKLQotcHVibGljIHZvbGF0aWxlIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCi0KLXB1YmxpYyB2b2lkIGNhbmNlbFN5bmMoCi1hbmRyb2lkLm5ldC5VcmkpCi0KLXByb3RlY3RlZCB2b2lkIGR1bXAoCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1qYXZhLmlvLlByaW50V3JpdGVyCi1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZSgKLWFuZHJvaWQubmV0LlVyaQotYW5kcm9pZC5kYXRhYmFzZS5JQ29udGVudE9ic2VydmVyCi1ib29sZWFuCi1ib29sZWFuKQotCi1wdWJsaWMgdm9sYXRpbGUgYm9vbGVhbiBvblRyYW5zYWN0KAotaW50Ci1hbmRyb2lkLm9zLlBhcmNlbAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotcHVibGljIHZvaWQgcmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoCi1hbmRyb2lkLm5ldC5VcmkKLWJvb2xlYW4KLWFuZHJvaWQuZGF0YWJhc2UuSUNvbnRlbnRPYnNlcnZlcikKLQotcHVibGljIHZvaWQgc3RhcnRTeW5jKAotYW5kcm9pZC5uZXQuVXJpCi1hbmRyb2lkLm9zLkJ1bmRsZSkKLQotcHVibGljIHZvaWQgdW5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcigKLWFuZHJvaWQuZGF0YWJhc2UuSUNvbnRlbnRPYnNlcnZlcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLWZpbmFsIGNsYXNzIGFuZHJvaWQuY29udGVudC5Db250ZW50U2VydmljZVByb3h5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQuY29udGVudC5JQ29udGVudFNlcnZpY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLm9zLklCaW5kZXIgbVJlbW90ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuSUJpbmRlcikKLQotcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjYW5jZWxTeW5jKAotYW5kcm9pZC5uZXQuVXJpKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlKAotYW5kcm9pZC5uZXQuVXJpCi1hbmRyb2lkLmRhdGFiYXNlLklDb250ZW50T2JzZXJ2ZXIKLWJvb2xlYW4KLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCByZWdpc3RlckNvbnRlbnRPYnNlcnZlcigKLWFuZHJvaWQubmV0LlVyaQotYm9vbGVhbgotYW5kcm9pZC5kYXRhYmFzZS5JQ29udGVudE9ic2VydmVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc3RhcnRTeW5jKAotYW5kcm9pZC5uZXQuVXJpCi1hbmRyb2lkLm9zLkJ1bmRsZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHVucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoCi1hbmRyb2lkLmRhdGFiYXNlLklDb250ZW50T2JzZXJ2ZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRVcmlzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5uZXQuVXJpJEJ1aWxkZXIgYXBwZW5kSWQoCi1hbmRyb2lkLm5ldC5VcmkkQnVpbGRlcgotbG9uZykKLQotcHVibGljIHN0YXRpYyBsb25nIHBhcnNlSWQoCi1hbmRyb2lkLm5ldC5VcmkpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5uZXQuVXJpIHdpdGhBcHBlbmRlZElkKAotYW5kcm9pZC5uZXQuVXJpCi1sb25nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I8TGFuZHJvaWQvY29udGVudC9Db250ZW50VmFsdWVzOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvQ29udGVudFZhbHVlczsgKQotZmluYWwgY2xhc3MgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXMkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlcyBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzW10gbmV3QXJyYXkoCi1pbnQpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0W10gbmV3QXJyYXkoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExhbmRyb2lkL2NvbnRlbnQvQ29udGVudFZhbHVlczs+OyApCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yIENSRUFUT1IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRBRwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaE1hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL09iamVjdDs+OyApCi1wcml2YXRlIGphdmEudXRpbC5IYXNoTWFwIG1WYWx1ZXMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXMpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvSGFzaE1hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL09iamVjdDs+OylWICkKLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuSGFzaE1hcCkKLQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkhhc2hNYXAKLWFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzJDEpCi0KLXB1YmxpYyB2b2lkIGNsZWFyKCkKLQotcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLkJvb2xlYW4gZ2V0QXNCb29sZWFuKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5CeXRlIGdldEFzQnl0ZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBieXRlW10gZ2V0QXNCeXRlQXJyYXkoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLkRvdWJsZSBnZXRBc0RvdWJsZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuRmxvYXQgZ2V0QXNGbG9hdCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuSW50ZWdlciBnZXRBc0ludGVnZXIoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLkxvbmcgZ2V0QXNMb25nKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TaG9ydCBnZXRBc1Nob3J0KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QXNTdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvdXRpbC9BcnJheUxpc3Q8TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotQGphdmEubGFuZy5EZXByZWNhdGVkCi1wdWJsaWMgamF2YS51dGlsLkFycmF5TGlzdCBnZXRTdHJpbmdBcnJheUxpc3QoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLQotcHVibGljIHZvaWQgcHV0KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLkJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHB1dCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5CeXRlKQotCi1wdWJsaWMgdm9pZCBwdXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuRG91YmxlKQotCi1wdWJsaWMgdm9pZCBwdXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuRmxvYXQpCi0KLXB1YmxpYyB2b2lkIHB1dCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5JbnRlZ2VyKQotCi1wdWJsaWMgdm9pZCBwdXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuTG9uZykKLQotcHVibGljIHZvaWQgcHV0KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlNob3J0KQotCi1wdWJsaWMgdm9pZCBwdXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBwdXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1ieXRlW10pCi0KLXB1YmxpYyB2b2lkIHB1dEFsbCgKLWFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzKQotCi1wdWJsaWMgdm9pZCBwdXROdWxsKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvdXRpbC9BcnJheUxpc3Q8TGphdmEvbGFuZy9TdHJpbmc7PjspViApCi1AamF2YS5sYW5nLkRlcHJlY2F0ZWQKLXB1YmxpYyB2b2lkIHB1dFN0cmluZ0FycmF5TGlzdCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudXRpbC5BcnJheUxpc3QpCi0KLXB1YmxpYyB2b2lkIHJlbW92ZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBpbnQgc2l6ZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvU2V0PExqYXZhL3V0aWwvTWFwJEVudHJ5PExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvT2JqZWN0Oz47PjsgKQotcHVibGljIGphdmEudXRpbC5TZXQgdmFsdWVTZXQoKQotCi1wdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmNvbnRlbnQuRGVmYXVsdERhdGFIYW5kbGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQuY29udGVudC5Db250ZW50SW5zZXJ0SGFuZGxlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFSRwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENPTAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFTAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBPU1RGSVgKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBST1cKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTRUxFQ1QKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBVUklfU1RSCi0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlciBtQ29udGVudFJlc29sdmVyCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9TdGFjazxMYW5kcm9pZC9uZXQvVXJpOz47ICkKLXByaXZhdGUgamF2YS51dGlsLlN0YWNrIG1VcmlzCi0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXMgbVZhbHVlcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgYW5kcm9pZC5uZXQuVXJpIGluc2VydFJvdygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHBhcnNlUm93KAotb3JnLnhtbC5zYXguQXR0cmlidXRlcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKAotY2hhcltdCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBlbmREb2N1bWVudCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgZW5kRWxlbWVudCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgZW5kUHJlZml4TWFwcGluZygKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgaWdub3JhYmxlV2hpdGVzcGFjZSgKLWNoYXJbXQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgaW5zZXJ0KAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcgotamF2YS5pby5JbnB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBpbnNlcnQoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHByb2Nlc3NpbmdJbnN0cnVjdGlvbigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHNldERvY3VtZW50TG9jYXRvcigKLW9yZy54bWwuc2F4LkxvY2F0b3IpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2tpcHBlZEVudGl0eSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc3RhcnREb2N1bWVudCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotb3JnLnhtbC5zYXguQXR0cmlidXRlcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzdGFydFByZWZpeE1hcHBpbmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1PbktleUxpc3RlbmVyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvRGlhbG9nSW50ZXJmYWNlOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UkT25LZXlMaXN0ZW5lciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBvbktleSgKLWFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UKLWludAotYW5kcm9pZC52aWV3LktleUV2ZW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1Pbk11bHRpQ2hvaWNlQ2xpY2tMaXN0ZW5lciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L0RpYWxvZ0ludGVyZmFjZTsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlJE9uTXVsdGlDaG9pY2VDbGlja0xpc3RlbmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uQ2xpY2soCi1hbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlCi1pbnQKLWJvb2xlYW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5jb250ZW50LkZvcm1hdHRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZm9ybWF0RmlsZVNpemUoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotbG9uZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvSVN5bmNBZGFwdGVyJFN0dWI7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5jb250ZW50LklTeW5jQWRhcHRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLklJbnRlcmZhY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgY2FuY2VsU3luYygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdGFydFN5bmMoCi1hbmRyb2lkLmNvbnRlbnQuSVN5bmNDb250ZXh0Ci1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLkJ1bmRsZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPVByb3h5ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvSVN5bmNBZGFwdGVyJFN0dWI7ICkKLSBjbGFzcyBhbmRyb2lkLmNvbnRlbnQuSVN5bmNBZGFwdGVyJFN0dWIkUHJveHkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5jb250ZW50LklTeW5jQWRhcHRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGFuZHJvaWQub3MuSUJpbmRlciBtUmVtb3RlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNhbmNlbFN5bmMoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHN0YXJ0U3luYygKLWFuZHJvaWQuY29udGVudC5JU3luY0NvbnRleHQKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuQnVuZGxlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvSVN5bmNBZGFwdGVyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwMzMgbmFtZSA9U3R1YiApCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvSVN5bmNBZGFwdGVyJFN0dWIkUHJveHk7ICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBhbmRyb2lkLmNvbnRlbnQuSVN5bmNBZGFwdGVyJFN0dWIgZXh0ZW5kcyBhbmRyb2lkLm9zLkJpbmRlciBpbXBsZW1lbnRzIGFuZHJvaWQuY29udGVudC5JU3luY0FkYXB0ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERVNDUklQVE9SCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fY2FuY2VsU3luYwotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3N0YXJ0U3luYwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5jb250ZW50LklTeW5jQWRhcHRlciBhc0ludGVyZmFjZSgKLWFuZHJvaWQub3MuSUJpbmRlcikKLQotcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBvblRyYW5zYWN0KAotaW50Ci1hbmRyb2lkLm9zLlBhcmNlbAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvSVN5bmNDb250ZXh0JFN0dWI7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5jb250ZW50LklTeW5jQ29udGV4dCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLklJbnRlcmZhY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgb25GaW5pc2hlZCgKLWFuZHJvaWQuY29udGVudC5TeW5jUmVzdWx0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2VuZEhlYXJ0YmVhdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9JU3luY0NvbnRleHQkU3R1YjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1Qcm94eSApCi0gY2xhc3MgYW5kcm9pZC5jb250ZW50LklTeW5jQ29udGV4dCRTdHViJFByb3h5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQuY29udGVudC5JU3luY0NvbnRleHQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLm9zLklCaW5kZXIgbVJlbW90ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuSUJpbmRlcikKLQotcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEludGVyZmFjZURlc2NyaXB0b3IoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgb25GaW5pc2hlZCgKLWFuZHJvaWQuY29udGVudC5TeW5jUmVzdWx0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2VuZEhlYXJ0YmVhdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L0lTeW5jQ29udGV4dCRTdHViJFByb3h5OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwMzMgbmFtZSA9U3R1YiApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L0lTeW5jQ29udGV4dDsgKQotcHVibGljIGFic3RyYWN0IGNsYXNzIGFuZHJvaWQuY29udGVudC5JU3luY0NvbnRleHQkU3R1YiBleHRlbmRzIGFuZHJvaWQub3MuQmluZGVyIGltcGxlbWVudHMgYW5kcm9pZC5jb250ZW50LklTeW5jQ29udGV4dAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFU0NSSVBUT1IKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9vbkZpbmlzaGVkCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fc2VuZEhlYXJ0YmVhdAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5jb250ZW50LklTeW5jQ29udGV4dCBhc0ludGVyZmFjZSgKLWFuZHJvaWQub3MuSUJpbmRlcikKLQotcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBvblRyYW5zYWN0KAotaW50Ci1hbmRyb2lkLm9zLlBhcmNlbAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L0ludGVudDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC9jb250ZW50L0ludGVudDs+OyApCi1maW5hbCBjbGFzcyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50JDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LkludGVudCBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5JbnRlbnRbXSBuZXdBcnJheSgKLWludCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3RbXSBuZXdBcnJheSgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L0ludGVudDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNSBuYW1lID1GaWx0ZXJDb21wYXJpc29uICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50JEZpbHRlckNvbXBhcmlzb24gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgaW50IG1IYXNoQ29kZQotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQuY29udGVudC5JbnRlbnQgbUludGVudAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5JbnRlbnQpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50IGdldEludGVudCgpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvSW50ZW50JFNob3J0Y3V0SWNvblJlc291cmNlOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExhbmRyb2lkL2NvbnRlbnQvSW50ZW50JFNob3J0Y3V0SWNvblJlc291cmNlOz47ICkKLWZpbmFsIGNsYXNzIGFuZHJvaWQuY29udGVudC5JbnRlbnQkU2hvcnRjdXRJY29uUmVzb3VyY2UkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50JFNob3J0Y3V0SWNvblJlc291cmNlIGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LkludGVudCRTaG9ydGN1dEljb25SZXNvdXJjZVtdIG5ld0FycmF5KAotaW50KQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdFtdIG5ld0FycmF5KAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1TaG9ydGN1dEljb25SZXNvdXJjZSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L0ludGVudDsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQuY29udGVudC5JbnRlbnQkU2hvcnRjdXRJY29uUmVzb3VyY2UgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExhbmRyb2lkL2NvbnRlbnQvSW50ZW50JFNob3J0Y3V0SWNvblJlc291cmNlOz47ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IgQ1JFQVRPUgotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBwYWNrYWdlTmFtZQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyByZXNvdXJjZU5hbWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5jb250ZW50LkludGVudCRTaG9ydGN1dEljb25SZXNvdXJjZSBmcm9tQ29udGV4dCgKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1pbnQpCi0KLXB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L0ludGVudCRGaWx0ZXJDb21wYXJpc29uO0xhbmRyb2lkL2NvbnRlbnQvSW50ZW50JFNob3J0Y3V0SWNvblJlc291cmNlOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5jb250ZW50LkludGVudCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDVElPTl9BSVJQTEFORV9NT0RFX0NIQU5HRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDVElPTl9BTEFSTV9DSEFOR0VECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBQ1RJT05fQUxMX0FQUFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDVElPTl9BTlNXRVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDVElPTl9BVFRBQ0hfREFUQQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUNUSU9OX0JBVFRFUllfQ0hBTkdFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUNUSU9OX0JBVFRFUllfTE9XCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBQ1RJT05fQk9PVF9DT01QTEVURUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDVElPTl9CVUdfUkVQT1JUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBQ1RJT05fQ0FMTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUNUSU9OX0NBTExfQlVUVE9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBQ1RJT05fQ0FMTF9FTUVSR0VOQ1kKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDVElPTl9DQUxMX1BSSVZJTEVHRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDVElPTl9DQU1FUkFfQlVUVE9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBQ1RJT05fQ0hPT1NFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUNUSU9OX0NMT1NFX1NZU1RFTV9ESUFMT0dTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBQ1RJT05fQ09ORklHVVJBVElPTl9DSEFOR0VECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBQ1RJT05fQ1JFQVRFX1NIT1JUQ1VUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBQ1RJT05fREFURV9DSEFOR0VECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBQ1RJT05fREVGQVVMVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUNUSU9OX0RFTEVURQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUNUSU9OX0RFVklDRV9TVE9SQUdFX0xPVwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUNUSU9OX0RFVklDRV9TVE9SQUdFX09LCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBQ1RJT05fRElBTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUNUSU9OX0VESVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDVElPTl9GQUNUT1JZX1RFU1QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDVElPTl9HRVRfQ09OVEVOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUNUSU9OX0dUQUxLX1NFUlZJQ0VfQ09OTkVDVEVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBQ1RJT05fR1RBTEtfU0VSVklDRV9ESVNDT05ORUNURUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDVElPTl9IRUFEU0VUX1BMVUcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDVElPTl9JTlNFUlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDVElPTl9JTlNFUlRfT1JfRURJVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUNUSU9OX01BSU4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDVElPTl9NQU5BR0VfUEFDS0FHRV9TVE9SQUdFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBQ1RJT05fTUVESUFfQkFEX1JFTU9WQUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDVElPTl9NRURJQV9CVVRUT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDVElPTl9NRURJQV9FSkVDVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUNUSU9OX01FRElBX01PVU5URUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDVElPTl9NRURJQV9SRU1PVkVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBQ1RJT05fTUVESUFfU0NBTk5FUl9GSU5JU0hFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUNUSU9OX01FRElBX1NDQU5ORVJfU0NBTl9GSUxFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBQ1RJT05fTUVESUFfU0NBTk5FUl9TVEFSVEVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBQ1RJT05fTUVESUFfU0hBUkVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBQ1RJT05fTUVESUFfVU5NT1VOVEFCTEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDVElPTl9NRURJQV9VTk1PVU5URUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDVElPTl9ORVdfT1VUR09JTkdfQ0FMTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUNUSU9OX1BBQ0tBR0VfQURERUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDVElPTl9QQUNLQUdFX0NIQU5HRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDVElPTl9QQUNLQUdFX0lOU1RBTEwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDVElPTl9QQUNLQUdFX1JFTU9WRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDVElPTl9QQUNLQUdFX1JFU1RBUlRFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUNUSU9OX1BJQ0sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDVElPTl9QSUNLX0FDVElWSVRZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBQ1RJT05fUFJPVklERVJfQ0hBTkdFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUNUSU9OX1JFQk9PVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUNUSU9OX1JVTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUNUSU9OX1NDUkVFTl9PRkYKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDVElPTl9TQ1JFRU5fT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDVElPTl9TRUFSQ0gKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDVElPTl9TRU5ECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBQ1RJT05fU0VORFRPCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBQ1RJT05fU0VUX1dBTExQQVBFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUNUSU9OX1NZTkMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDVElPTl9TWU5DX1NUQVRFX0NIQU5HRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDVElPTl9USU1FWk9ORV9DSEFOR0VECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBQ1RJT05fVElNRV9DSEFOR0VECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBQ1RJT05fVElNRV9USUNLCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBQ1RJT05fVUlEX1JFTU9WRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDVElPTl9VTVNfQ09OTkVDVEVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBQ1RJT05fVU1TX0RJU0NPTk5FQ1RFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUNUSU9OX1ZJRVcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDVElPTl9WT0lDRV9DT01NQU5ECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBQ1RJT05fV0FMTFBBUEVSX0NIQU5HRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDVElPTl9XRUJfU0VBUkNICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDQVRFR09SWV9BTFRFUk5BVElWRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ0FURUdPUllfQlJPV1NBQkxFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDQVRFR09SWV9ERUZBVUxUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDQVRFR09SWV9ERVZFTE9QTUVOVF9QUkVGRVJFTkNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDQVRFR09SWV9FTUJFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ0FURUdPUllfRlJBTUVXT1JLX0lOU1RSVU1FTlRBVElPTl9URVNUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDQVRFR09SWV9HQURHRVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENBVEVHT1JZX0hPTUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENBVEVHT1JZX0xBVU5DSEVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDQVRFR09SWV9NT05LRVkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENBVEVHT1JZX09QRU5BQkxFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDQVRFR09SWV9QUkVGRVJFTkNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDQVRFR09SWV9TQU1QTEVfQ09ERQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ0FURUdPUllfU0VMRUNURURfQUxURVJOQVRJVkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENBVEVHT1JZX1RBQgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ0FURUdPUllfVEVTVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ0FURUdPUllfVU5JVF9URVNUCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExhbmRyb2lkL2NvbnRlbnQvSW50ZW50Oz47ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IgQ1JFQVRPUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRVhUUkFfQUxBUk1fQ09VTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEVYVFJBX0JDQwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRVhUUkFfQ0MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEVYVFJBX0RPTlRfS0lMTF9BUFAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEVYVFJBX0VNQUlMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBFWFRSQV9JTlRFTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEVYVFJBX0tFWV9FVkVOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRVhUUkFfUEhPTkVfTlVNQkVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBFWFRSQV9TSE9SVENVVF9JQ09OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBFWFRSQV9TSE9SVENVVF9JQ09OX1JFU09VUkNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBFWFRSQV9TSE9SVENVVF9JTlRFTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEVYVFJBX1NIT1JUQ1VUX05BTUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEVYVFJBX1NUUkVBTQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRVhUUkFfU1VCSkVDVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRVhUUkFfVEVNUExBVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEVYVFJBX1RFWFQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEVYVFJBX1RJVExFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBFWFRSQV9VSUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMTF9JTl9BQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMTF9JTl9DQVRFR09SSUVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTExfSU5fQ09NUE9ORU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTExfSU5fREFUQQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX0FDVElWSVRZX0JST1VHSFRfVE9fRlJPTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19BQ1RJVklUWV9DTEVBUl9UT1AKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19BQ1RJVklUWV9FWENMVURFX0ZST01fUkVDRU5UUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX0FDVElWSVRZX0ZPUldBUkRfUkVTVUxUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfQUNUSVZJVFlfTEFVTkNIRURfRlJPTV9ISVNUT1JZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfQUNUSVZJVFlfTVVMVElQTEVfVEFTSwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX0FDVElWSVRZX05FV19UQVNLCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfQUNUSVZJVFlfTk9fSElTVE9SWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX0FDVElWSVRZX1BSRVZJT1VTX0lTX1RPUAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX0FDVElWSVRZX1JFU0VUX1RBU0tfSUZfTkVFREVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfQUNUSVZJVFlfU0lOR0xFX1RPUAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX0RFQlVHX0xPR19SRVNPTFVUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfRlJPTV9CQUNLR1JPVU5ECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfR1JBTlRfUkVBRF9VUklfUEVSTUlTU0lPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX0dSQU5UX1dSSVRFX1VSSV9QRVJNSVNTSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfUkVDRUlWRVJfUkVHSVNURVJFRF9PTkxZCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtQWN0aW9uCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNoU2V0PExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXByaXZhdGUgamF2YS51dGlsLkhhc2hTZXQgbUNhdGVnb3JpZXMKLQotcHJpdmF0ZSBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSBtQ29tcG9uZW50Ci0KLXByaXZhdGUgYW5kcm9pZC5uZXQuVXJpIG1EYXRhCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5CdW5kbGUgbUV4dHJhcwotCi1wcml2YXRlIGludCBtRmxhZ3MKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1UeXBlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMYW5kcm9pZC9jb250ZW50L0NvbnRleHQ7TGphdmEvbGFuZy9DbGFzczwqPjspViApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotamF2YS5sYW5nLkNsYXNzKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50KQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkludGVudAotYm9vbGVhbikKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuUGFyY2VsKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLlBhcmNlbAotYW5kcm9pZC5jb250ZW50LkludGVudCQxKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm5ldC5VcmkpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvU3RyaW5nO0xhbmRyb2lkL25ldC9Vcmk7TGFuZHJvaWQvY29udGVudC9Db250ZXh0O0xqYXZhL2xhbmcvQ2xhc3M8Kj47KVYgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5uZXQuVXJpCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotamF2YS5sYW5nLkNsYXNzKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuY29udGVudC5JbnRlbnQgY3JlYXRlQ2hvb3NlcigKLWFuZHJvaWQuY29udGVudC5JbnRlbnQKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1VSSVN5bnRheEV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50IGdldEludGVudCgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1VSSVN5bnRheEV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50IGdldEludGVudE9sZCgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgc3RhdGljIHZvaWQgcGFyc2VFeHRyYSgKLWFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50Ci1vcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyCi1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuY29udGVudC5JbnRlbnQgcGFyc2VJbnRlbnQoCi1hbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcwotb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcgotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5JbnRlbnQgYWRkQ2F0ZWdvcnkoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LkludGVudCBhZGRGbGFncygKLWludCkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgY2xvbmUoKQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LkludGVudCBjbG9uZUZpbHRlcigpCi0KLXB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpCi0KLXB1YmxpYyBpbnQgZmlsbEluKAotYW5kcm9pZC5jb250ZW50LkludGVudAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBmaWx0ZXJFcXVhbHMoCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50KQotCi1wdWJsaWMgaW50IGZpbHRlckhhc2hDb2RlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QWN0aW9uKCkKLQotcHVibGljIGJvb2xlYW5bXSBnZXRCb29sZWFuQXJyYXlFeHRyYSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBib29sZWFuIGdldEJvb2xlYW5FeHRyYSgKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4pCi0KLXB1YmxpYyBhbmRyb2lkLm9zLkJ1bmRsZSBnZXRCdW5kbGVFeHRyYSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBieXRlW10gZ2V0Qnl0ZUFycmF5RXh0cmEoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYnl0ZSBnZXRCeXRlRXh0cmEoCi1qYXZhLmxhbmcuU3RyaW5nCi1ieXRlKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9TZXQ8TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHVibGljIGphdmEudXRpbC5TZXQgZ2V0Q2F0ZWdvcmllcygpCi0KLXB1YmxpYyBjaGFyW10gZ2V0Q2hhckFycmF5RXh0cmEoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgY2hhciBnZXRDaGFyRXh0cmEoCi1qYXZhLmxhbmcuU3RyaW5nCi1jaGFyKQotCi1wdWJsaWMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBnZXRDaGFyU2VxdWVuY2VFeHRyYSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSBnZXRDb21wb25lbnQoKQotCi1wdWJsaWMgYW5kcm9pZC5uZXQuVXJpIGdldERhdGEoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXREYXRhU3RyaW5nKCkKLQotcHVibGljIGRvdWJsZVtdIGdldERvdWJsZUFycmF5RXh0cmEoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgZG91YmxlIGdldERvdWJsZUV4dHJhKAotamF2YS5sYW5nLlN0cmluZwotZG91YmxlKQotQGphdmEubGFuZy5EZXByZWNhdGVkCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRFeHRyYSgKLWphdmEubGFuZy5TdHJpbmcpCi1AamF2YS5sYW5nLkRlcHJlY2F0ZWQKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldEV4dHJhKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGFuZHJvaWQub3MuQnVuZGxlIGdldEV4dHJhcygpCi0KLXB1YmxpYyBpbnQgZ2V0RmxhZ3MoKQotCi1wdWJsaWMgZmxvYXRbXSBnZXRGbG9hdEFycmF5RXh0cmEoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgZmxvYXQgZ2V0RmxvYXRFeHRyYSgKLWphdmEubGFuZy5TdHJpbmcKLWZsb2F0KQotQGphdmEubGFuZy5EZXByZWNhdGVkCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGdldElCaW5kZXJFeHRyYSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBpbnRbXSBnZXRJbnRBcnJheUV4dHJhKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGludCBnZXRJbnRFeHRyYSgKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL3V0aWwvQXJyYXlMaXN0PExqYXZhL2xhbmcvSW50ZWdlcjs+OyApCi1wdWJsaWMgamF2YS51dGlsLkFycmF5TGlzdCBnZXRJbnRlZ2VyQXJyYXlMaXN0RXh0cmEoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgbG9uZ1tdIGdldExvbmdBcnJheUV4dHJhKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGxvbmcgZ2V0TG9uZ0V4dHJhKAotamF2YS5sYW5nLlN0cmluZwotbG9uZykKLQotcHVibGljIGFuZHJvaWQub3MuUGFyY2VsYWJsZVtdIGdldFBhcmNlbGFibGVBcnJheUV4dHJhKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDo6TGFuZHJvaWQvb3MvUGFyY2VsYWJsZTs+KExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS91dGlsL0FycmF5TGlzdDxUVDs+OyApCi1wdWJsaWMgamF2YS51dGlsLkFycmF5TGlzdCBnZXRQYXJjZWxhYmxlQXJyYXlMaXN0RXh0cmEoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOjpMYW5kcm9pZC9vcy9QYXJjZWxhYmxlOz4oTGphdmEvbGFuZy9TdHJpbmc7KVRUOyApCi1wdWJsaWMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlIGdldFBhcmNlbGFibGVFeHRyYSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFNjaGVtZSgpCi0KLXB1YmxpYyBqYXZhLmlvLlNlcmlhbGl6YWJsZSBnZXRTZXJpYWxpemFibGVFeHRyYSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzaG9ydFtdIGdldFNob3J0QXJyYXlFeHRyYSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzaG9ydCBnZXRTaG9ydEV4dHJhKAotamF2YS5sYW5nLlN0cmluZwotc2hvcnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0U3RyaW5nQXJyYXlFeHRyYSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS91dGlsL0FycmF5TGlzdDxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wdWJsaWMgamF2YS51dGlsLkFycmF5TGlzdCBnZXRTdHJpbmdBcnJheUxpc3RFeHRyYSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZ0V4dHJhKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VHlwZSgpCi0KLXB1YmxpYyBib29sZWFuIGhhc0NhdGVnb3J5KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJvb2xlYW4gaGFzRXh0cmEoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYm9vbGVhbiBoYXNGaWxlRGVzY3JpcHRvcnMoKQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LkludGVudCBwdXRFeHRyYSgKLWphdmEubGFuZy5TdHJpbmcKLWJ5dGUpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50IHB1dEV4dHJhKAotamF2YS5sYW5nLlN0cmluZwotY2hhcikKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5JbnRlbnQgcHV0RXh0cmEoCi1qYXZhLmxhbmcuU3RyaW5nCi1kb3VibGUpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50IHB1dEV4dHJhKAotamF2YS5sYW5nLlN0cmluZwotZmxvYXQpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50IHB1dEV4dHJhKAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LkludGVudCBwdXRFeHRyYSgKLWphdmEubGFuZy5TdHJpbmcKLWxvbmcpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50IHB1dEV4dHJhKAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5vcy5CdW5kbGUpCi1AamF2YS5sYW5nLkRlcHJlY2F0ZWQKLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50IHB1dEV4dHJhKAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LkludGVudCBwdXRFeHRyYSgKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuUGFyY2VsYWJsZSkKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5JbnRlbnQgcHV0RXh0cmEoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmlvLlNlcmlhbGl6YWJsZSkKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5JbnRlbnQgcHV0RXh0cmEoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LkludGVudCBwdXRFeHRyYSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50IHB1dEV4dHJhKAotamF2YS5sYW5nLlN0cmluZwotc2hvcnQpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50IHB1dEV4dHJhKAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5JbnRlbnQgcHV0RXh0cmEoCi1qYXZhLmxhbmcuU3RyaW5nCi1ieXRlW10pCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50IHB1dEV4dHJhKAotamF2YS5sYW5nLlN0cmluZwotY2hhcltdKQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LkludGVudCBwdXRFeHRyYSgKLWphdmEubGFuZy5TdHJpbmcKLWRvdWJsZVtdKQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LkludGVudCBwdXRFeHRyYSgKLWphdmEubGFuZy5TdHJpbmcKLWZsb2F0W10pCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50IHB1dEV4dHJhKAotamF2YS5sYW5nLlN0cmluZwotaW50W10pCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50IHB1dEV4dHJhKAotamF2YS5sYW5nLlN0cmluZwotbG9uZ1tdKQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LkludGVudCBwdXRFeHRyYSgKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuUGFyY2VsYWJsZVtdKQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LkludGVudCBwdXRFeHRyYSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5JbnRlbnQgcHV0RXh0cmEoCi1qYXZhLmxhbmcuU3RyaW5nCi1zaG9ydFtdKQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LkludGVudCBwdXRFeHRyYSgKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW5bXSkKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5JbnRlbnQgcHV0RXh0cmFzKAotYW5kcm9pZC5jb250ZW50LkludGVudCkKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5JbnRlbnQgcHV0RXh0cmFzKAotYW5kcm9pZC5vcy5CdW5kbGUpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL3V0aWwvQXJyYXlMaXN0PExqYXZhL2xhbmcvSW50ZWdlcjs+OylMYW5kcm9pZC9jb250ZW50L0ludGVudDsgKQotcHVibGljIGFuZHJvaWQuY29udGVudC5JbnRlbnQgcHV0SW50ZWdlckFycmF5TGlzdEV4dHJhKAotamF2YS5sYW5nLlN0cmluZwotamF2YS51dGlsLkFycmF5TGlzdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvdXRpbC9BcnJheUxpc3Q8K0xhbmRyb2lkL29zL1BhcmNlbGFibGU7PjspTGFuZHJvaWQvY29udGVudC9JbnRlbnQ7ICkKLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50IHB1dFBhcmNlbGFibGVBcnJheUxpc3RFeHRyYSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudXRpbC5BcnJheUxpc3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL3V0aWwvQXJyYXlMaXN0PExqYXZhL2xhbmcvU3RyaW5nOz47KUxhbmRyb2lkL2NvbnRlbnQvSW50ZW50OyApCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LkludGVudCBwdXRTdHJpbmdBcnJheUxpc3RFeHRyYSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudXRpbC5BcnJheUxpc3QpCi0KLXB1YmxpYyB2b2lkIHJlYWRGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyB2b2lkIHJlbW92ZUNhdGVnb3J5KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgcmVtb3ZlRXh0cmEoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUgcmVzb2x2ZUFjdGl2aXR5KAotYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyKQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LnBtLkFjdGl2aXR5SW5mbyByZXNvbHZlQWN0aXZpdHlJbmZvKAotYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHJlc29sdmVUeXBlKAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcikKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgcmVzb2x2ZVR5cGUoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgcmVzb2x2ZVR5cGVJZk5lZWRlZCgKLWFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50IHNldEFjdGlvbigKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExhbmRyb2lkL2NvbnRlbnQvQ29udGV4dDtMamF2YS9sYW5nL0NsYXNzPCo+OylMYW5kcm9pZC9jb250ZW50L0ludGVudDsgKQotcHVibGljIGFuZHJvaWQuY29udGVudC5JbnRlbnQgc2V0Q2xhc3MoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotamF2YS5sYW5nLkNsYXNzKQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LkludGVudCBzZXRDbGFzc05hbWUoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5JbnRlbnQgc2V0Q2xhc3NOYW1lKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5JbnRlbnQgc2V0Q29tcG9uZW50KAotYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50IHNldERhdGEoCi1hbmRyb2lkLm5ldC5VcmkpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50IHNldERhdGFBbmRUeXBlKAotYW5kcm9pZC5uZXQuVXJpCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRFeHRyYXNDbGFzc0xvYWRlcigKLWphdmEubGFuZy5DbGFzc0xvYWRlcikKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5JbnRlbnQgc2V0RmxhZ3MoCi1pbnQpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50IHNldFR5cGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvVVJJKCkKLQotcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC9jb250ZW50L0ludGVudEZpbHRlcjs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L0ludGVudEZpbHRlcjsgKQotZmluYWwgY2xhc3MgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlciQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXIgY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyW10gbmV3QXJyYXkoCi1pbnQpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0W10gbmV3QXJyYXkoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9JbnRlbnRGaWx0ZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjUgbmFtZSA9QXV0aG9yaXR5RW50cnkgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXIkQXV0aG9yaXR5RW50cnkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBtSG9zdAotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgbU9yaWdIb3N0Ci0KLXByaXZhdGUgZmluYWwgaW50IG1Qb3J0Ci0KLXByaXZhdGUgZmluYWwgYm9vbGVhbiBtV2lsZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1zdGF0aWMgamF2YS5sYW5nLlN0cmluZyBhY2Nlc3MkMDAwKAotYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlciRBdXRob3JpdHlFbnRyeSkKLQotc3RhdGljIGludCBhY2Nlc3MkMTAwKAotYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlciRBdXRob3JpdHlFbnRyeSkKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDIwMCgKLWFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXIkQXV0aG9yaXR5RW50cnkpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEhvc3QoKQotCi1wdWJsaWMgaW50IGdldFBvcnQoKQotCi1wdWJsaWMgaW50IG1hdGNoKAotYW5kcm9pZC5uZXQuVXJpKQotCi0gdm9pZCB3cml0ZVRvUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9JbnRlbnRGaWx0ZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1NYWxmb3JtZWRNaW1lVHlwZUV4Y2VwdGlvbiApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlciRNYWxmb3JtZWRNaW1lVHlwZUV4Y2VwdGlvbiBleHRlbmRzIGFuZHJvaWQudXRpbC5BbmRyb2lkRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvSW50ZW50RmlsdGVyJEF1dGhvcml0eUVudHJ5O0xhbmRyb2lkL2NvbnRlbnQvSW50ZW50RmlsdGVyJE1hbGZvcm1lZE1pbWVUeXBlRXhjZXB0aW9uOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBQ1RJT05fU1RSCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQVVUSF9TVFIKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDQVRfU1RSCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExhbmRyb2lkL2NvbnRlbnQvSW50ZW50RmlsdGVyOz47ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IgQ1JFQVRPUgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEhPU1RfU1RSCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTElURVJBTF9TVFIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFUQ0hfQURKVVNUTUVOVF9NQVNLCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BVENIX0FESlVTVE1FTlRfTk9STUFMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BVENIX0NBVEVHT1JZX0VNUFRZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BVENIX0NBVEVHT1JZX0hPU1QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFUQ0hfQ0FURUdPUllfTUFTSwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVRDSF9DQVRFR09SWV9QQVRICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BVENIX0NBVEVHT1JZX1BPUlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFUQ0hfQ0FURUdPUllfU0NIRU1FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BVENIX0NBVEVHT1JZX1RZUEUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBOQU1FX1NUUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT19NQVRDSF9BQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9fTUFUQ0hfQ0FURUdPUlkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9fTUFUQ0hfREFUQQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT19NQVRDSF9UWVBFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUEFUSF9TVFIKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQT1JUX1NUUgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBSRUZJWF9TVFIKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTQ0hFTUVfU1RSCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0dMT0JfU1RSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNZU1RFTV9ISUdIX1BSSU9SSVRZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNZU1RFTV9MT1dfUFJJT1JJVFkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUWVBFX1NUUgotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQXJyYXlMaXN0PExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXByaXZhdGUgZmluYWwgamF2YS51dGlsLkFycmF5TGlzdCBtQWN0aW9ucwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQXJyYXlMaXN0PExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXByaXZhdGUgamF2YS51dGlsLkFycmF5TGlzdCBtQ2F0ZWdvcmllcwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQXJyYXlMaXN0PExhbmRyb2lkL2NvbnRlbnQvSW50ZW50RmlsdGVyJEF1dGhvcml0eUVudHJ5Oz47ICkKLXByaXZhdGUgamF2YS51dGlsLkFycmF5TGlzdCBtRGF0YUF1dGhvcml0aWVzCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9BcnJheUxpc3Q8TGFuZHJvaWQvb3MvUGF0dGVybk1hdGNoZXI7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuQXJyYXlMaXN0IG1EYXRhUGF0aHMKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0FycmF5TGlzdDxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wcml2YXRlIGphdmEudXRpbC5BcnJheUxpc3QgbURhdGFTY2hlbWVzCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9BcnJheUxpc3Q8TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuQXJyYXlMaXN0IG1EYXRhVHlwZXMKLQotcHJpdmF0ZSBib29sZWFuIG1IYXNQYXJ0aWFsVHlwZXMKLQotcHJpdmF0ZSBpbnQgbVByaW9yaXR5Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuUGFyY2VsCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyJDEpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9JbnRlbnRGaWx0ZXIkTWFsZm9ybWVkTWltZVR5cGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmdbXSBhZGRTdHJpbmdUb1NldCgKLWphdmEubGFuZy5TdHJpbmdbXQotamF2YS5sYW5nLlN0cmluZwotaW50W10KLWludCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyIGNyZWF0ZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgZmluYWwgYm9vbGVhbiBmaW5kTWltZVR5cGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHN0YXRpYyBpbnQgZmluZFN0cmluZ0luU2V0KAotamF2YS5sYW5nLlN0cmluZ1tdCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnRbXQotaW50KQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nW10gcmVtb3ZlU3RyaW5nRnJvbVNldCgKLWphdmEubGFuZy5TdHJpbmdbXQotamF2YS5sYW5nLlN0cmluZwotaW50W10KLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvSXRlcmF0b3I8TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHVibGljIGZpbmFsIGphdmEudXRpbC5JdGVyYXRvciBhY3Rpb25zSXRlcmF0b3IoKQotCi1wdWJsaWMgZmluYWwgdm9pZCBhZGRBY3Rpb24oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgZmluYWwgdm9pZCBhZGRDYXRlZ29yeSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIGFkZERhdGFBdXRob3JpdHkoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgZmluYWwgdm9pZCBhZGREYXRhUGF0aCgKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIGZpbmFsIHZvaWQgYWRkRGF0YVNjaGVtZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9JbnRlbnRGaWx0ZXIkTWFsZm9ybWVkTWltZVR5cGVFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCB2b2lkIGFkZERhdGFUeXBlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvSXRlcmF0b3I8TGFuZHJvaWQvY29udGVudC9JbnRlbnRGaWx0ZXIkQXV0aG9yaXR5RW50cnk7PjsgKQotcHVibGljIGZpbmFsIGphdmEudXRpbC5JdGVyYXRvciBhdXRob3JpdGllc0l0ZXJhdG9yKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvSXRlcmF0b3I8TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHVibGljIGZpbmFsIGphdmEudXRpbC5JdGVyYXRvciBjYXRlZ29yaWVzSXRlcmF0b3IoKQotCi1wdWJsaWMgZmluYWwgaW50IGNvdW50QWN0aW9ucygpCi0KLXB1YmxpYyBmaW5hbCBpbnQgY291bnRDYXRlZ29yaWVzKCkKLQotcHVibGljIGZpbmFsIGludCBjb3VudERhdGFBdXRob3JpdGllcygpCi0KLXB1YmxpYyBmaW5hbCBpbnQgY291bnREYXRhUGF0aHMoKQotCi1wdWJsaWMgZmluYWwgaW50IGNvdW50RGF0YVNjaGVtZXMoKQotCi1wdWJsaWMgZmluYWwgaW50IGNvdW50RGF0YVR5cGVzKCkKLQotcHVibGljIGJvb2xlYW4gZGVidWdDaGVjaygpCi0KLXB1YmxpYyBmaW5hbCBpbnQgZGVzY3JpYmVDb250ZW50cygpCi0KLXB1YmxpYyB2b2lkIGR1bXAoCi1hbmRyb2lkLnV0aWwuUHJpbnRlcgotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgZ2V0QWN0aW9uKAotaW50KQotCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBnZXRDYXRlZ29yeSgKLWludCkKLQotcHVibGljIGZpbmFsIGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXIkQXV0aG9yaXR5RW50cnkgZ2V0RGF0YUF1dGhvcml0eSgKLWludCkKLQotcHVibGljIGZpbmFsIGFuZHJvaWQub3MuUGF0dGVybk1hdGNoZXIgZ2V0RGF0YVBhdGgoCi1pbnQpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGdldERhdGFTY2hlbWUoCi1pbnQpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGdldERhdGFUeXBlKAotaW50KQotCi1wdWJsaWMgZmluYWwgaW50IGdldFByaW9yaXR5KCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzQWN0aW9uKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzQ2F0ZWdvcnkoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNEYXRhQXV0aG9yaXR5KAotYW5kcm9pZC5uZXQuVXJpKQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNEYXRhUGF0aCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGhhc0RhdGFTY2hlbWUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNEYXRhVHlwZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBmaW5hbCBpbnQgbWF0Y2goCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50Ci1ib29sZWFuCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZztMYW5kcm9pZC9uZXQvVXJpO0xqYXZhL3V0aWwvU2V0PExqYXZhL2xhbmcvU3RyaW5nOz47TGphdmEvbGFuZy9TdHJpbmc7KUkgKQotcHVibGljIGZpbmFsIGludCBtYXRjaCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQubmV0LlVyaQotamF2YS51dGlsLlNldAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gbWF0Y2hBY3Rpb24oCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL1NldDxMamF2YS9sYW5nL1N0cmluZzs+OylMamF2YS9sYW5nL1N0cmluZzsgKQotcHVibGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgbWF0Y2hDYXRlZ29yaWVzKAotamF2YS51dGlsLlNldCkKLQotcHVibGljIGZpbmFsIGludCBtYXRjaERhdGEoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm5ldC5VcmkpCi0KLXB1YmxpYyBmaW5hbCBpbnQgbWF0Y2hEYXRhQXV0aG9yaXR5KAotYW5kcm9pZC5uZXQuVXJpKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9JdGVyYXRvcjxMYW5kcm9pZC9vcy9QYXR0ZXJuTWF0Y2hlcjs+OyApCi1wdWJsaWMgZmluYWwgamF2YS51dGlsLkl0ZXJhdG9yIHBhdGhzSXRlcmF0b3IoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCByZWFkRnJvbVhtbCgKLW9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXIpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0l0ZXJhdG9yPExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXB1YmxpYyBmaW5hbCBqYXZhLnV0aWwuSXRlcmF0b3Igc2NoZW1lc0l0ZXJhdG9yKCkKLQotcHVibGljIGZpbmFsIHZvaWQgc2V0UHJpb3JpdHkoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0l0ZXJhdG9yPExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXB1YmxpYyBmaW5hbCBqYXZhLnV0aWwuSXRlcmF0b3IgdHlwZXNJdGVyYXRvcigpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlVG9QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB3cml0ZVRvWG1sKAotb3JnLnhtbHB1bGwudjEuWG1sU2VyaWFsaXplcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmNvbnRlbnQuTXV0YWJsZUNvbnRleHRXcmFwcGVyIGV4dGVuZHMgYW5kcm9pZC5jb250ZW50LkNvbnRleHRXcmFwcGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXB1YmxpYyB2b2lkIHNldEJhc2VDb250ZXh0KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5jb250ZW50LlJlY2VpdmVyQ2FsbE5vdEFsbG93ZWRFeGNlcHRpb24gZXh0ZW5kcyBhbmRyb2lkLnV0aWwuQW5kcm9pZFJ1bnRpbWVFeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZU9wZW5IZWxwZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEFHCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgbUNvbnRleHQKLQotcHJpdmF0ZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSBtRGF0YWJhc2UKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSRDdXJzb3JGYWN0b3J5IG1GYWN0b3J5Ci0KLXByaXZhdGUgYm9vbGVhbiBtSXNJbml0aWFsaXppbmcKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIG1OYW1lCi0KLXByaXZhdGUgZmluYWwgaW50IG1OZXdWZXJzaW9uCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UkQ3Vyc29yRmFjdG9yeQotaW50KQotCi1wdWJsaWMgdm9pZCBjbG9zZSgpCi0KLXB1YmxpYyBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSBnZXRSZWFkYWJsZURhdGFiYXNlKCkKLQotcHVibGljIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlIGdldFdyaXRhYmxlRGF0YWJhc2UoKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvbkNyZWF0ZSgKLWFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlKQotCi1wdWJsaWMgdm9pZCBvbk9wZW4oCi1hbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgb25VcGdyYWRlKAotYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UKLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvU2VhcmNoUmVjZW50U3VnZ2VzdGlvbnNQcm92aWRlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1EYXRhYmFzZUhlbHBlciApCi0gY2xhc3MgYW5kcm9pZC5jb250ZW50LlNlYXJjaFJlY2VudFN1Z2dlc3Rpb25zUHJvdmlkZXIkRGF0YWJhc2VIZWxwZXIgZXh0ZW5kcyBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVPcGVuSGVscGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgaW50IG1OZXdWZXJzaW9uCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWludCkKLQotcHVibGljIHZvaWQgb25DcmVhdGUoCi1hbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSkKLQotcHVibGljIHZvaWQgb25VcGdyYWRlKAotYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UKLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9TZWFyY2hSZWNlbnRTdWdnZXN0aW9uc1Byb3ZpZGVyJERhdGFiYXNlSGVscGVyOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5jb250ZW50LlNlYXJjaFJlY2VudFN1Z2dlc3Rpb25zUHJvdmlkZXIgZXh0ZW5kcyBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERBVEFCQVNFX01PREVfMkxJTkVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERBVEFCQVNFX01PREVfUVVFUklFUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREFUQUJBU0VfVkVSU0lPTgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE5VTExfQ09MVU1OCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgT1JERVJfQlkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVSSV9NQVRDSF9TVUdHRVNUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgc0RhdGFiYXNlTmFtZQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIHNTdWdnZXN0aW9ucwotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbUF1dGhvcml0eQotCi1wcml2YXRlIGludCBtTW9kZQotCi1wcml2YXRlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZU9wZW5IZWxwZXIgbU9wZW5IZWxwZXIKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1TdWdnZXN0U3VnZ2VzdGlvbkNsYXVzZQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmdbXSBtU3VnZ2VzdGlvblByb2plY3Rpb24KLQotcHJpdmF0ZSBhbmRyb2lkLm5ldC5VcmkgbVN1Z2dlc3Rpb25zVXJpCi0KLXByaXZhdGUgYm9vbGVhbiBtVHdvTGluZURpc3BsYXkKLQotcHJpdmF0ZSBhbmRyb2lkLmNvbnRlbnQuVXJpTWF0Y2hlciBtVXJpTWF0Y2hlcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBpbnQgZGVsZXRlKAotYW5kcm9pZC5uZXQuVXJpCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFR5cGUoCi1hbmRyb2lkLm5ldC5VcmkpCi0KLXB1YmxpYyBhbmRyb2lkLm5ldC5VcmkgaW5zZXJ0KAotYW5kcm9pZC5uZXQuVXJpCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlcykKLQotcHVibGljIGJvb2xlYW4gb25DcmVhdGUoKQotCi1wdWJsaWMgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IgcXVlcnkoCi1hbmRyb2lkLm5ldC5VcmkKLWphdmEubGFuZy5TdHJpbmdbXQotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZ1tdCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcm90ZWN0ZWQgdm9pZCBzZXR1cFN1Z2dlc3Rpb25zKAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgaW50IHVwZGF0ZSgKLWFuZHJvaWQubmV0LlVyaQotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXMKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9T25TaGFyZWRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9TaGFyZWRQcmVmZXJlbmNlczsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXMkT25TaGFyZWRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgb25TaGFyZWRQcmVmZXJlbmNlQ2hhbmdlZCgKLWFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlcwotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9VHJhbnNwb3J0ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvU3luY0FkYXB0ZXI7ICkKLSBjbGFzcyBhbmRyb2lkLmNvbnRlbnQuU3luY0FkYXB0ZXIkVHJhbnNwb3J0IGV4dGVuZHMgYW5kcm9pZC5jb250ZW50LklTeW5jQWRhcHRlciRTdHViCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQuY29udGVudC5TeW5jQWRhcHRlciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuU3luY0FkYXB0ZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjYW5jZWxTeW5jKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHN0YXJ0U3luYygKLWFuZHJvaWQuY29udGVudC5JU3luY0NvbnRleHQKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuQnVuZGxlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9TeW5jQWRhcHRlciRUcmFuc3BvcnQ7ICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBhbmRyb2lkLmNvbnRlbnQuU3luY0FkYXB0ZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPR19TWU5DX0RFVEFJTFMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLQotIGFuZHJvaWQuY29udGVudC5TeW5jQWRhcHRlciRUcmFuc3BvcnQgbVRyYW5zcG9ydAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGNhbmNlbFN5bmMoKQotCi1maW5hbCBhbmRyb2lkLmNvbnRlbnQuSVN5bmNBZGFwdGVyIGdldElTeW5jQWRhcHRlcigpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHN0YXJ0U3luYygKLWFuZHJvaWQuY29udGVudC5TeW5jQ29udGV4dAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5vcy5CdW5kbGUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5jb250ZW50LlN5bmNDb250ZXh0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEhFQVJUQkVBVF9TRU5EX0lOVEVSVkFMX0lOX01TCi0KLXByaXZhdGUgbG9uZyBtTGFzdEhlYXJ0YmVhdFNlbmRUaW1lCi0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LklTeW5jQ29udGV4dCBtU3luY0NvbnRleHQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuSVN5bmNDb250ZXh0KQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LklTeW5jQ29udGV4dCBnZXRJU3luY0NvbnRleHQoKQotCi1wdWJsaWMgdm9pZCBvbkZpbmlzaGVkKAotYW5kcm9pZC5jb250ZW50LlN5bmNSZXN1bHQpCi0KLXB1YmxpYyB2b2lkIHNldFN0YXR1c1RleHQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCB1cGRhdGVIZWFydGJlYXQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvU3luY01hbmFnZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLSBjbGFzcyBhbmRyb2lkLmNvbnRlbnQuU3luY01hbmFnZXIkMSBleHRlbmRzIGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLmNvbnRlbnQuU3luY01hbmFnZXIgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LlN5bmNNYW5hZ2VyKQotCi1wdWJsaWMgdm9pZCBvblJlY2VpdmUoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC5jb250ZW50LkludGVudCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L1N5bmNNYW5hZ2VyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi0gY2xhc3MgYW5kcm9pZC5jb250ZW50LlN5bmNNYW5hZ2VyJDIgZXh0ZW5kcyBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC5jb250ZW50LlN5bmNNYW5hZ2VyIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5TeW5jTWFuYWdlcikKLQotcHVibGljIHZvaWQgb25SZWNlaXZlKAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQuY29udGVudC5JbnRlbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotIGNsYXNzIGFuZHJvaWQuY29udGVudC5TeW5jTWFuYWdlciQzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQuYWNjb3VudHMuQWNjb3VudE1vbml0b3JMaXN0ZW5lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLmNvbnRlbnQuU3luY01hbmFnZXIgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LlN5bmNNYW5hZ2VyKQotCi1wdWJsaWMgdm9pZCBvbkFjY291bnRzVXBkYXRlZCgKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi0gY2xhc3MgYW5kcm9pZC5jb250ZW50LlN5bmNNYW5hZ2VyJDQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLk9ic2VydmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQuY29udGVudC5TeW5jTWFuYWdlciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuU3luY01hbmFnZXIpCi0KLXB1YmxpYyB2b2lkIHVwZGF0ZSgKLWphdmEudXRpbC5PYnNlcnZhYmxlCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9NDEwNCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvU3luY01hbmFnZXI7ICkKLSBjbGFzcyBhbmRyb2lkLmNvbnRlbnQuU3luY01hbmFnZXIkNSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIGludFtdICRTd2l0Y2hNYXAkYW5kcm9pZCRuZXQkTmV0d29ya0luZm8kU3RhdGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPUFjdGl2ZVN5bmNDb250ZXh0ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvU3luY01hbmFnZXI7ICkKLSBjbGFzcyBhbmRyb2lkLmNvbnRlbnQuU3luY01hbmFnZXIkQWN0aXZlU3luY0NvbnRleHQgZXh0ZW5kcyBhbmRyb2lkLmNvbnRlbnQuSVN5bmNDb250ZXh0JFN0dWIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC5jb250ZW50LklDb250ZW50UHJvdmlkZXIgbUNvbnRlbnRQcm92aWRlcgotCi1maW5hbCBsb25nIG1IaXN0b3J5Um93SWQKLQotZmluYWwgbG9uZyBtU3RhcnRUaW1lCi0KLWZpbmFsIGFuZHJvaWQuY29udGVudC5JU3luY0FkYXB0ZXIgbVN5bmNBZGFwdGVyCi0KLWZpbmFsIGFuZHJvaWQuY29udGVudC5TeW5jTWFuYWdlciRTeW5jT3BlcmF0aW9uIG1TeW5jT3BlcmF0aW9uCi0KLSBsb25nIG1UaW1lb3V0U3RhcnRUaW1lCi0KLWZpbmFsIGFuZHJvaWQuY29udGVudC5TeW5jTWFuYWdlciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuU3luY01hbmFnZXIKLWFuZHJvaWQuY29udGVudC5TeW5jTWFuYWdlciRTeW5jT3BlcmF0aW9uCi1hbmRyb2lkLmNvbnRlbnQuSUNvbnRlbnRQcm92aWRlcgotYW5kcm9pZC5jb250ZW50LklTeW5jQWRhcHRlcgotbG9uZykKLQotcHVibGljIHZvaWQgb25GaW5pc2hlZCgKLWFuZHJvaWQuY29udGVudC5TeW5jUmVzdWx0KQotCi1wdWJsaWMgdm9pZCBzZW5kSGVhcnRiZWF0KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1wdWJsaWMgdm9pZCB0b1N0cmluZygKLWphdmEubGFuZy5TdHJpbmdCdWlsZGVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvU3luY01hbmFnZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1TeW5jQWxhcm1JbnRlbnRSZWNlaXZlciApCi0gY2xhc3MgYW5kcm9pZC5jb250ZW50LlN5bmNNYW5hZ2VyJFN5bmNBbGFybUludGVudFJlY2VpdmVyIGV4dGVuZHMgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQuY29udGVudC5TeW5jTWFuYWdlciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuU3luY01hbmFnZXIpCi0KLXB1YmxpYyB2b2lkIG9uUmVjZWl2ZSgKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLmNvbnRlbnQuSW50ZW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1TeW5jTm90aWZpY2F0aW9uSW5mbyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L1N5bmNNYW5hZ2VyJFN5bmNIYW5kbGVyOyApCi0gY2xhc3MgYW5kcm9pZC5jb250ZW50LlN5bmNNYW5hZ2VyJFN5bmNIYW5kbGVyJFN5bmNOb3RpZmljYXRpb25JbmZvIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBhY2NvdW50Ci0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGF1dGhvcml0eQotCi1wdWJsaWMgYm9vbGVhbiBpc0FjdGl2ZQotCi1wdWJsaWMgamF2YS5sYW5nLkxvbmcgc3RhcnRUaW1lCi0KLWZpbmFsIGFuZHJvaWQuY29udGVudC5TeW5jTWFuYWdlciRTeW5jSGFuZGxlciB0aGlzJDEKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuU3luY01hbmFnZXIkU3luY0hhbmRsZXIpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotcHVibGljIHZvaWQgdG9TdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nQnVpbGRlcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L1N5bmNNYW5hZ2VyOyApCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvU3luY01hbmFnZXIkU3luY0hhbmRsZXIkU3luY05vdGlmaWNhdGlvbkluZm87ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1TeW5jSGFuZGxlciApCi0gY2xhc3MgYW5kcm9pZC5jb250ZW50LlN5bmNNYW5hZ2VyJFN5bmNIYW5kbGVyIGV4dGVuZHMgYW5kcm9pZC5vcy5IYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX0NIRUNLX0FMQVJNUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9TWU5DX0FMQVJNCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1NZTkNfRklOSVNIRUQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuTG9uZyBtQWxhcm1TY2hlZHVsZVRpbWUKLQotcHJpdmF0ZSBib29sZWFuIG1FcnJvck5vdGlmaWNhdGlvbkluc3RhbGxlZAotCi1wdWJsaWMgZmluYWwgYW5kcm9pZC5jb250ZW50LlN5bmNNYW5hZ2VyJFN5bmNIYW5kbGVyJFN5bmNOb3RpZmljYXRpb25JbmZvIG1TeW5jTm90aWZpY2F0aW9uSW5mbwotCi1wdWJsaWMgZmluYWwgYW5kcm9pZC5jb250ZW50LlN5bmNNYW5hZ2VyJFN5bmNUaW1lVHJhY2tlciBtU3luY1RpbWVUcmFja2VyCi0KLWZpbmFsIGFuZHJvaWQuY29udGVudC5TeW5jTWFuYWdlciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuU3luY01hbmFnZXIKLWFuZHJvaWQub3MuTG9vcGVyKQotCi1zdGF0aWMgamF2YS5sYW5nLkxvbmcgYWNjZXNzJDEyMDAoCi1hbmRyb2lkLmNvbnRlbnQuU3luY01hbmFnZXIkU3luY0hhbmRsZXIpCi0KLXByaXZhdGUgdm9pZCBoYW5kbGVTeW5jSGFuZGxlck1lc3NhZ2UoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXByaXZhdGUgdm9pZCBpbnN0YWxsSGFuZGxlVG9vTWFueURlbGV0ZXNOb3RpZmljYXRpb24oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1sb25nKQotCi1wcml2YXRlIHZvaWQgbWFuYWdlRXJyb3JOb3RpZmljYXRpb24oKQotCi1wcml2YXRlIHZvaWQgbWFuYWdlU3luY0FsYXJtKCkKLQotcHJpdmF0ZSB2b2lkIG1hbmFnZVN5bmNOb3RpZmljYXRpb24oKQotCi1wcml2YXRlIHZvaWQgcnVuU3RhdGVJZGxlKCkKLQotcHJpdmF0ZSB2b2lkIHJ1blN0YXRlU3luY2luZygpCi0KLXByaXZhdGUgdm9pZCBydW5TeW5jRmluaXNoZWRPckNhbmNlbGVkKAotYW5kcm9pZC5jb250ZW50LlN5bmNSZXN1bHQpCi0KLXByaXZhdGUgdm9pZCBzZW5kU3luY1N0YXRlSW50ZW50KCkKLQotcHJpdmF0ZSBpbnQgc3luY1Jlc3VsdFRvRXJyb3JOdW1iZXIoCi1hbmRyb2lkLmNvbnRlbnQuU3luY1Jlc3VsdCkKLQotcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZSgKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIGxvbmcgaW5zZXJ0U3RhcnRTeW5jRXZlbnQoCi1hbmRyb2lkLmNvbnRlbnQuU3luY01hbmFnZXIkU3luY09wZXJhdGlvbikKLQotcHVibGljIHZvaWQgc3RvcFN5bmNFdmVudCgKLWxvbmcKLWFuZHJvaWQuY29udGVudC5TeW5jTWFuYWdlciRTeW5jT3BlcmF0aW9uCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludAotbG9uZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L1N5bmNNYW5hZ2VyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9U3luY0hhbmRsZXJNZXNzYWdlUGF5bG9hZCApCi0gY2xhc3MgYW5kcm9pZC5jb250ZW50LlN5bmNNYW5hZ2VyJFN5bmNIYW5kbGVyTWVzc2FnZVBheWxvYWQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBmaW5hbCBhbmRyb2lkLmNvbnRlbnQuU3luY01hbmFnZXIkQWN0aXZlU3luY0NvbnRleHQgYWN0aXZlU3luY0NvbnRleHQKLQotcHVibGljIGZpbmFsIGFuZHJvaWQuY29udGVudC5TeW5jUmVzdWx0IHN5bmNSZXN1bHQKLQotZmluYWwgYW5kcm9pZC5jb250ZW50LlN5bmNNYW5hZ2VyIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5TeW5jTWFuYWdlcgotYW5kcm9pZC5jb250ZW50LlN5bmNNYW5hZ2VyJEFjdGl2ZVN5bmNDb250ZXh0Ci1hbmRyb2lkLmNvbnRlbnQuU3luY1Jlc3VsdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9U3luY09wZXJhdGlvbiApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L1N5bmNNYW5hZ2VyOyApCi0gY2xhc3MgYW5kcm9pZC5jb250ZW50LlN5bmNNYW5hZ2VyJFN5bmNPcGVyYXRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5sYW5nLkNvbXBhcmFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgamF2YS5sYW5nLlN0cmluZyBhY2NvdW50Ci0KLSBqYXZhLmxhbmcuU3RyaW5nIGF1dGhvcml0eQotCi0gbG9uZyBkZWxheQotCi0gbG9uZyBlYXJsaWVzdFJ1blRpbWUKLQotIGFuZHJvaWQub3MuQnVuZGxlIGV4dHJhcwotCi1maW5hbCBqYXZhLmxhbmcuU3RyaW5nIGtleQotCi0gamF2YS5sYW5nLkxvbmcgcm93SWQKLQotIGludCBzeW5jU291cmNlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LlN5bmNNYW5hZ2VyJFN5bmNPcGVyYXRpb24pCi0KLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5vcy5CdW5kbGUKLWxvbmcpCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgZXh0cmFzVG9TdHJpbmdCdWlsZGVyKAotYW5kcm9pZC5vcy5CdW5kbGUKLWphdmEubGFuZy5TdHJpbmdCdWlsZGVyKQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgdG9LZXkoKQotCi1wdWJsaWMgaW50IGNvbXBhcmVUbygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2lkIHNldERlbGF5KAotbG9uZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1TeW5jUG9sbEFsYXJtUmVjZWl2ZXIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9TeW5jTWFuYWdlcjsgKQotIGNsYXNzIGFuZHJvaWQuY29udGVudC5TeW5jTWFuYWdlciRTeW5jUG9sbEFsYXJtUmVjZWl2ZXIgZXh0ZW5kcyBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC5jb250ZW50LlN5bmNNYW5hZ2VyIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5TeW5jTWFuYWdlcikKLQotcHVibGljIHZvaWQgb25SZWNlaXZlKAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQuY29udGVudC5JbnRlbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9TeW5jTWFuYWdlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPVN5bmNRdWV1ZSApCi0gY2xhc3MgYW5kcm9pZC5jb250ZW50LlN5bmNNYW5hZ2VyJFN5bmNRdWV1ZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTFVNTl9BQ0NPVU5UCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fQVVUSE9SSVRZCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fRVhUUkFTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fSUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTFVNTl9TT1VSQ0UKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19DSEVDS19EQVRBX0NPTlNJU1RFTkNZCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZ1tdIENPTFVNTlMKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0hhc2hNYXA8TGphdmEvbGFuZy9TdHJpbmc7TGFuZHJvaWQvY29udGVudC9TeW5jTWFuYWdlciRTeW5jT3BlcmF0aW9uOz47ICkKLXByaXZhdGUgZmluYWwgamF2YS51dGlsLkhhc2hNYXAgbU9wc0J5S2V5Ci1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9Qcmlvcml0eVF1ZXVlPExhbmRyb2lkL2NvbnRlbnQvU3luY01hbmFnZXIkU3luY09wZXJhdGlvbjs+OyApCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5Qcmlvcml0eVF1ZXVlIG1PcHNCeVdoZW4KLQotcHJpdmF0ZSBhbmRyb2lkLmNvbnRlbnQuU3luY1N0b3JhZ2VFbmdpbmUgbVN5bmNTdG9yYWdlRW5naW5lCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LlN5bmNTdG9yYWdlRW5naW5lKQotCi1wcml2YXRlIGJvb2xlYW4gYWRkKAotYW5kcm9pZC5jb250ZW50LlN5bmNNYW5hZ2VyJFN5bmNPcGVyYXRpb24KLWJvb2xlYW4pCi0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LlN5bmNNYW5hZ2VyJFN5bmNPcGVyYXRpb24gY3Vyc29yVG9PcGVyYXRpb24oCi1hbmRyb2lkLmRhdGFiYXNlLkN1cnNvcikKLQotcHJpdmF0ZSB2b2lkIGRlYnVnQ2hlY2tEYXRhU3RydWN0dXJlcygKLWJvb2xlYW4pCi0KLXB1YmxpYyBib29sZWFuIGFkZCgKLWFuZHJvaWQuY29udGVudC5TeW5jTWFuYWdlciRTeW5jT3BlcmF0aW9uKQotCi1wdWJsaWMgdm9pZCBjbGVhcigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIGR1bXAoCi1qYXZhLmxhbmcuU3RyaW5nQnVpbGRlcikKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5TeW5jTWFuYWdlciRTeW5jT3BlcmF0aW9uIGhlYWQoKQotCi1wdWJsaWMgdm9pZCBwb3BIZWFkKCkKLQotcHVibGljIHZvaWQgcmVtb3ZlQnlLZXkoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvU3luY01hbmFnZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MiBuYW1lID1TeW5jVGltZVRyYWNrZXIgKQotIGNsYXNzIGFuZHJvaWQuY29udGVudC5TeW5jTWFuYWdlciRTeW5jVGltZVRyYWNrZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBib29sZWFuIG1MYXN0V2FzU3luY2luZwotCi1wcml2YXRlIGxvbmcgbVRpbWVTcGVudFN5bmNpbmcKLQotIGxvbmcgbVdoZW5TeW5jU3RhcnRlZAotCi1maW5hbCBhbmRyb2lkLmNvbnRlbnQuU3luY01hbmFnZXIgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5TeW5jTWFuYWdlcikKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LlN5bmNNYW5hZ2VyCi1hbmRyb2lkLmNvbnRlbnQuU3luY01hbmFnZXIkMSkKLQotcHVibGljIGxvbmcgdGltZVNwZW50U3luY2luZygpCi0KLXB1YmxpYyB2b2lkIHVwZGF0ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L1N5bmNNYW5hZ2VyJDU7TGFuZHJvaWQvY29udGVudC9TeW5jTWFuYWdlciRTeW5jUXVldWU7TGFuZHJvaWQvY29udGVudC9TeW5jTWFuYWdlciRTeW5jSGFuZGxlcjtMYW5kcm9pZC9jb250ZW50L1N5bmNNYW5hZ2VyJFN5bmNUaW1lVHJhY2tlcjtMYW5kcm9pZC9jb250ZW50L1N5bmNNYW5hZ2VyJEFjdGl2ZVN5bmNDb250ZXh0O0xhbmRyb2lkL2NvbnRlbnQvU3luY01hbmFnZXIkU3luY09wZXJhdGlvbjtMYW5kcm9pZC9jb250ZW50L1N5bmNNYW5hZ2VyJFN5bmNQb2xsQWxhcm1SZWNlaXZlcjtMYW5kcm9pZC9jb250ZW50L1N5bmNNYW5hZ2VyJFN5bmNBbGFybUludGVudFJlY2VpdmVyO0xhbmRyb2lkL2NvbnRlbnQvU3luY01hbmFnZXIkU3luY0hhbmRsZXJNZXNzYWdlUGF5bG9hZDsgKQotIGNsYXNzIGFuZHJvaWQuY29udGVudC5TeW5jTWFuYWdlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBQ1RJT05fU1lOQ19BTEFSTQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIERFRkFVTFRfTUFYX1NZTkNfUkVUUllfVElNRV9JTl9TRUNPTkRTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgRVJST1JfTk9USUZJQ0FUSU9OX0RFTEFZX01TCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSEFORExFX1NZTkNfQUxBUk1fV0FLRV9MT0NLCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgSU5JVElBTF9TWU5DX1JFVFJZX1RJTUVfSU5fTVMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBMT0NBTF9TWU5DX0RFTEFZCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfU1lOQ19QT0xMX0RFTEFZX1NFQ09ORFMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBNQVhfVElNRV9QRVJfU1lOQwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIE1JTExJU19JTl80V0VFS1MKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBNSUxMSVNfSU5fREFZCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgTUlMTElTX0lOX0hPVVIKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBNSUxMSVNfSU5fV0VFSwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUlOX1NZTkNfUE9MTF9ERUxBWV9TRUNPTkRTCi0KLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmdbXSBTVEFUVVNfUFJPSkVDVElPTgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNZTkNNQU5BR0VSX1BSRUZTX0ZJTEVOQU1FCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmdbXSBTWU5DX0FDVElWRV9QUk9KRUNUSU9OCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgU1lOQ19OT1RJRklDQVRJT05fREVMQVkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZ1tdIFNZTkNfUEVORElOR19QUk9KRUNUSU9OCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU1lOQ19QT0xMX0FMQVJNCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU1lOQ19XQUtFX0xPQ0sKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLQotcHJpdmF0ZSBhbmRyb2lkLmFjY291bnRzLkFjY291bnRNb25pdG9yIG1BY2NvdW50TW9uaXRvcgotCi1wcml2YXRlIHZvbGF0aWxlIGphdmEubGFuZy5TdHJpbmdbXSBtQWNjb3VudHMKLQotcHJpdmF0ZSBhbmRyb2lkLmNvbnRlbnQuU3luY01hbmFnZXIkQWN0aXZlU3luY0NvbnRleHQgbUFjdGl2ZVN5bmNDb250ZXh0Ci0KLXByaXZhdGUgYW5kcm9pZC5hcHAuQWxhcm1NYW5hZ2VyIG1BbGFybVNlcnZpY2UKLQotcHJpdmF0ZSBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXIgbUNvbm5lY3Rpdml0eUludGVudFJlY2VpdmVyCi0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlciBtQ29udGVudFJlc29sdmVyCi0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgbUNvbnRleHQKLQotcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIG1EYXRhQ29ubmVjdGlvbklzQ29ubmVjdGVkCi0KLXByaXZhdGUgdm9sYXRpbGUgYW5kcm9pZC5vcy5Qb3dlck1hbmFnZXIkV2FrZUxvY2sgbUhhbmRsZUFsYXJtV2FrZUxvY2sKLQotcHJpdmF0ZSBsb25nIG1IZWFydGJlYXRUaW1lCi0KLXByaXZhdGUgYm9vbGVhbiBtTmVlZFN5bmNBY3RpdmVOb3RpZmljYXRpb24KLQotcHJpdmF0ZSBib29sZWFuIG1OZWVkU3luY0Vycm9yTm90aWZpY2F0aW9uCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uTWFuYWdlciBtTm90aWZpY2F0aW9uTWdyCi0KLXByaXZhdGUgdm9sYXRpbGUgYW5kcm9pZC5jb250ZW50LnBtLklQYWNrYWdlTWFuYWdlciBtUGFja2FnZU1hbmFnZXIKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1TdGF0dXNUZXh0Ci0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyIG1TdG9yYWdlSW50ZW50UmVjZWl2ZXIKLQotcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIG1TdG9yYWdlSXNMb3cKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50IG1TeW5jQWxhcm1JbnRlbnQKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLmNvbnRlbnQuU3luY01hbmFnZXIkU3luY0hhbmRsZXIgbVN5bmNIYW5kbGVyCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudCBtU3luY1BvbGxBbGFybUludGVudAotCi1wcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gbVN5bmNQb2xsSW5pdGlhbGl6ZWQKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLmNvbnRlbnQuU3luY01hbmFnZXIkU3luY1F1ZXVlIG1TeW5jUXVldWUKLQotcHJpdmF0ZSBhbmRyb2lkLnByb3ZpZGVyLlN5bmMkU2V0dGluZ3MkUXVlcnlNYXAgbVN5bmNTZXR0aW5ncwotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQuY29udGVudC5TeW5jU3RvcmFnZUVuZ2luZSBtU3luY1N0b3JhZ2VFbmdpbmUKLQotcHJpdmF0ZSBhbmRyb2lkLm9zLkhhbmRsZXJUaHJlYWQgbVN5bmNUaHJlYWQKLQotcHJpdmF0ZSB2b2xhdGlsZSBhbmRyb2lkLm9zLlBvd2VyTWFuYWdlciRXYWtlTG9jayBtU3luY1dha2VMb2NrCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYm9vbGVhbikKLQotc3RhdGljIHZvaWQgYWNjZXNzJDAwMCgKLWFuZHJvaWQuY29udGVudC5TeW5jTWFuYWdlcikKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDEwMCgKLWFuZHJvaWQuY29udGVudC5TeW5jTWFuYWdlcikKLQotc3RhdGljIHZvaWQgYWNjZXNzJDEwMDAoCi1hbmRyb2lkLmNvbnRlbnQuU3luY01hbmFnZXIpCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQxMDIoCi1hbmRyb2lkLmNvbnRlbnQuU3luY01hbmFnZXIKLWJvb2xlYW4pCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQxMTAwKAotYW5kcm9pZC5jb250ZW50LlN5bmNNYW5hZ2VyKQotCi1zdGF0aWMgYW5kcm9pZC5vcy5Qb3dlck1hbmFnZXIkV2FrZUxvY2sgYWNjZXNzJDE0MDAoCi1hbmRyb2lkLmNvbnRlbnQuU3luY01hbmFnZXIpCi0KLXN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuU3luY01hbmFnZXIkU3luY1F1ZXVlIGFjY2VzcyQxNTAwKAotYW5kcm9pZC5jb250ZW50LlN5bmNNYW5hZ2VyKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMTYwMCgKLWFuZHJvaWQuY29udGVudC5TeW5jTWFuYWdlcgotYW5kcm9pZC5jb250ZW50LlN5bmNNYW5hZ2VyJFN5bmNPcGVyYXRpb24pCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQxNzAwKAotYW5kcm9pZC5jb250ZW50LlN5bmNNYW5hZ2VyCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1zdGF0aWMgYW5kcm9pZC5wcm92aWRlci5TeW5jJFNldHRpbmdzJFF1ZXJ5TWFwIGFjY2VzcyQxODAwKAotYW5kcm9pZC5jb250ZW50LlN5bmNNYW5hZ2VyKQotCi1zdGF0aWMgYm9vbGVhbiBhY2Nlc3MkMTkwMCgKLWFuZHJvaWQuY29udGVudC5TeW5jTWFuYWdlcikKLQotc3RhdGljIHZvaWQgYWNjZXNzJDIwMCgKLWFuZHJvaWQuY29udGVudC5TeW5jTWFuYWdlcikKLQotc3RhdGljIGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIgYWNjZXNzJDIwMDAoCi1hbmRyb2lkLmNvbnRlbnQuU3luY01hbmFnZXIpCi0KLXN0YXRpYyBsb25nIGFjY2VzcyQyMTAwKAotYW5kcm9pZC5jb250ZW50LlN5bmNNYW5hZ2VyCi1hbmRyb2lkLmNvbnRlbnQuU3luY01hbmFnZXIkU3luY09wZXJhdGlvbikKLQotc3RhdGljIGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbk1hbmFnZXIgYWNjZXNzJDIyMDAoCi1hbmRyb2lkLmNvbnRlbnQuU3luY01hbmFnZXIpCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQyMzAwKAotYW5kcm9pZC5jb250ZW50LlN5bmNNYW5hZ2VyKQotCi1zdGF0aWMgYm9vbGVhbiBhY2Nlc3MkMjMwMigKLWFuZHJvaWQuY29udGVudC5TeW5jTWFuYWdlcgotYm9vbGVhbikKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDI0MDAoCi1hbmRyb2lkLmNvbnRlbnQuU3luY01hbmFnZXIpCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQyNDAyKAotYW5kcm9pZC5jb250ZW50LlN5bmNNYW5hZ2VyCi1ib29sZWFuKQotCi1zdGF0aWMgYW5kcm9pZC5jb250ZW50LlN5bmNNYW5hZ2VyJFN5bmNIYW5kbGVyIGFjY2VzcyQyNTAwKAotYW5kcm9pZC5jb250ZW50LlN5bmNNYW5hZ2VyKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMjYwMCgKLWFuZHJvaWQuY29udGVudC5TeW5jTWFuYWdlcikKLQotc3RhdGljIGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQgYWNjZXNzJDI3MDAoCi1hbmRyb2lkLmNvbnRlbnQuU3luY01hbmFnZXIpCi0KLXN0YXRpYyBhbmRyb2lkLmFwcC5BbGFybU1hbmFnZXIgYWNjZXNzJDI4MDAoCi1hbmRyb2lkLmNvbnRlbnQuU3luY01hbmFnZXIpCi0KLXN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBhY2Nlc3MkMjkwMCgKLWFuZHJvaWQuY29udGVudC5TeW5jTWFuYWdlcikKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDMwMCgKLWFuZHJvaWQuY29udGVudC5TeW5jTWFuYWdlcikKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDMwMigKLWFuZHJvaWQuY29udGVudC5TeW5jTWFuYWdlcgotYm9vbGVhbikKLQotc3RhdGljIHZvaWQgYWNjZXNzJDQwMCgKLWFuZHJvaWQuY29udGVudC5TeW5jTWFuYWdlcikKLQotc3RhdGljIGphdmEubGFuZy5TdHJpbmdbXSBhY2Nlc3MkNTAwKAotYW5kcm9pZC5jb250ZW50LlN5bmNNYW5hZ2VyKQotCi1zdGF0aWMgamF2YS5sYW5nLlN0cmluZ1tdIGFjY2VzcyQ1MDIoCi1hbmRyb2lkLmNvbnRlbnQuU3luY01hbmFnZXIKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotc3RhdGljIGFuZHJvaWQuY29udGVudC5TeW5jTWFuYWdlciRBY3RpdmVTeW5jQ29udGV4dCBhY2Nlc3MkNjAwKAotYW5kcm9pZC5jb250ZW50LlN5bmNNYW5hZ2VyKQotCi1zdGF0aWMgYW5kcm9pZC5jb250ZW50LlN5bmNNYW5hZ2VyJEFjdGl2ZVN5bmNDb250ZXh0IGFjY2VzcyQ2MDIoCi1hbmRyb2lkLmNvbnRlbnQuU3luY01hbmFnZXIKLWFuZHJvaWQuY29udGVudC5TeW5jTWFuYWdlciRBY3RpdmVTeW5jQ29udGV4dCkKLQotc3RhdGljIHZvaWQgYWNjZXNzJDcwMCgKLWFuZHJvaWQuY29udGVudC5TeW5jTWFuYWdlcgotYW5kcm9pZC5jb250ZW50LlN5bmNNYW5hZ2VyJEFjdGl2ZVN5bmNDb250ZXh0Ci1hbmRyb2lkLmNvbnRlbnQuU3luY1Jlc3VsdCkKLQotc3RhdGljIGFuZHJvaWQuY29udGVudC5TeW5jU3RvcmFnZUVuZ2luZSBhY2Nlc3MkODAwKAotYW5kcm9pZC5jb250ZW50LlN5bmNNYW5hZ2VyKQotCi1zdGF0aWMgYW5kcm9pZC5vcy5Qb3dlck1hbmFnZXIkV2FrZUxvY2sgYWNjZXNzJDkwMCgKLWFuZHJvaWQuY29udGVudC5TeW5jTWFuYWdlcikKLQotcHJpdmF0ZSB2b2lkIGR1bXBTeW5jSGlzdG9yeUZvb3RlcigKLWphdmEubGFuZy5TdHJpbmdCdWlsZGVyKQotCi1wcml2YXRlIHZvaWQgZHVtcFN5bmNIaXN0b3J5SGVhZGVyKAotamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgdm9pZCBkdW1wU3luY0hpc3RvcnlSb3coCi1qYXZhLmxhbmcuU3RyaW5nQnVpbGRlcgotYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IpCi0KLXByaXZhdGUgdm9pZCBkdW1wU3luY0ludGVydmFsKAotamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIKLWphdmEubGFuZy5TdHJpbmcKLWxvbmcKLWxvbmcKLWxvbmcpCi0KLXByaXZhdGUgdm9pZCBkdW1wU3luY0ludGVydmFsRm9vdGVyKAotamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIpCi0KLXByaXZhdGUgdm9pZCBkdW1wU3luY0ludGVydmFsSGVhZGVyKAotamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIpCi0KLXByaXZhdGUgdm9pZCBkdW1wU3luY1BlbmRpbmdGb290ZXIoCi1qYXZhLmxhbmcuU3RyaW5nQnVpbGRlcikKLQotcHJpdmF0ZSB2b2lkIGR1bXBTeW5jUGVuZGluZ0hlYWRlcigKLWphdmEubGFuZy5TdHJpbmdCdWlsZGVyKQotCi1wcml2YXRlIHZvaWQgZHVtcFN5bmNQZW5kaW5nUm93KAotamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIKLWFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yKQotCi1wcml2YXRlIHZvaWQgZW5zdXJlQWxhcm1TZXJ2aWNlKCkKLQotcHJpdmF0ZSB2b2lkIGVuc3VyZUNvbnRlbnRSZXNvbHZlcigpCi0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LnBtLklQYWNrYWdlTWFuYWdlciBnZXRQYWNrYWdlTWFuYWdlcigpCi0KLXByaXZhdGUgYW5kcm9pZC5wcm92aWRlci5TeW5jJFNldHRpbmdzJFF1ZXJ5TWFwIGdldFN5bmNTZXR0aW5ncygpCi0KLXByaXZhdGUgdm9pZCBoYW5kbGVTeW5jUG9sbEFsYXJtKCkKLQotcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVTeW5jUG9sbCgpCi0KLXByaXZhdGUgYm9vbGVhbiBpc1N5bmNFbmFibGVkKCkKLQotcHJpdmF0ZSBsb25nIGppdHRlcml6ZSgKLWxvbmcKLWxvbmcpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExhbmRyb2lkL25ldC9Vcmk7TGphdmEvdXRpbC9MaXN0PExqYXZhL2xhbmcvU3RyaW5nOz47TGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL2NvbnRlbnQvcG0vUHJvdmlkZXJJbmZvOz47KVYgKQotcHJpdmF0ZSB2b2lkIHBvcHVsYXRlUHJvdmlkZXJzTGlzdCgKLWFuZHJvaWQubmV0LlVyaQotamF2YS51dGlsLkxpc3QKLWphdmEudXRpbC5MaXN0KQotCi1wcml2YXRlIGxvbmcgcmVhZFN5bmNQb2xsVGltZSgpCi0KLXByaXZhdGUgdm9pZCByZXNjaGVkdWxlSW1tZWRpYXRlbHkoCi1hbmRyb2lkLmNvbnRlbnQuU3luY01hbmFnZXIkU3luY09wZXJhdGlvbikKLQotcHJpdmF0ZSBsb25nIHJlc2NoZWR1bGVXaXRoRGVsYXkoCi1hbmRyb2lkLmNvbnRlbnQuU3luY01hbmFnZXIkU3luY09wZXJhdGlvbikKLQotcHJpdmF0ZSB2b2lkIHNjaGVkdWxlU3luY1BvbGxBbGFybSgKLWxvbmcpCi0KLXByaXZhdGUgdm9pZCBzZW5kQ2hlY2tBbGFybXNNZXNzYWdlKCkKLQotcHJpdmF0ZSB2b2lkIHNlbmRTeW5jQWxhcm1NZXNzYWdlKCkKLQotcHJpdmF0ZSB2b2lkIHNlbmRTeW5jRmluaXNoZWRPckNhbmNlbGVkTWVzc2FnZSgKLWFuZHJvaWQuY29udGVudC5TeW5jTWFuYWdlciRBY3RpdmVTeW5jQ29udGV4dAotYW5kcm9pZC5jb250ZW50LlN5bmNSZXN1bHQpCi0KLXByaXZhdGUgdm9pZCBzZXRTdGF0dXNUZXh0KAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSB2b2lkIHdyaXRlU3luY1BvbGxUaW1lKAotbG9uZykKLQotcHVibGljIHZvaWQgY2FuY2VsQWN0aXZlU3luYygKLWFuZHJvaWQubmV0LlVyaSkKLQotcHVibGljIHZvaWQgY2xlYXJTY2hlZHVsZWRTeW5jT3BlcmF0aW9ucygKLWFuZHJvaWQubmV0LlVyaSkKLQotcHJvdGVjdGVkIHZvaWQgZHVtcCgKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IKLWphdmEuaW8uUHJpbnRXcml0ZXIpCi0KLXByb3RlY3RlZCB2b2lkIGR1bXBTeW5jSGlzdG9yeSgKLWphdmEubGFuZy5TdHJpbmdCdWlsZGVyKQotCi1wcm90ZWN0ZWQgdm9pZCBkdW1wU3luY1N0YXRlKAotamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuU3luY01hbmFnZXIkQWN0aXZlU3luY0NvbnRleHQgZ2V0QWN0aXZlU3luY0NvbnRleHQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTeW5jaW5nQWNjb3VudCgpCi0KLSB2b2lkIG1heWJlUmVzY2hlZHVsZVN5bmMoCi1hbmRyb2lkLmNvbnRlbnQuU3luY1Jlc3VsdAotYW5kcm9pZC5jb250ZW50LlN5bmNNYW5hZ2VyJFN5bmNPcGVyYXRpb24pCi0KLXB1YmxpYyB2b2lkIHNjaGVkdWxlTG9jYWxTeW5jKAotYW5kcm9pZC5uZXQuVXJpKQotCi1wdWJsaWMgdm9pZCBzY2hlZHVsZVN5bmMoCi1hbmRyb2lkLm5ldC5VcmkKLWFuZHJvaWQub3MuQnVuZGxlCi1sb25nKQotCi1wdWJsaWMgdm9pZCBzY2hlZHVsZVN5bmNPcGVyYXRpb24oCi1hbmRyb2lkLmNvbnRlbnQuU3luY01hbmFnZXIkU3luY09wZXJhdGlvbikKLQotcHVibGljIHZvaWQgc3RhcnRTeW5jKAotYW5kcm9pZC5uZXQuVXJpCi1hbmRyb2lkLm9zLkJ1bmRsZSkKLQotcHVibGljIHZvaWQgdXBkYXRlSGVhcnRiZWF0VGltZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5jb250ZW50LlN5bmNQcm92aWRlciBleHRlbmRzIGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLmNvbnRlbnQuU3luY1N0b3JhZ2VFbmdpbmUgbVN5bmNTdG9yYWdlRW5naW5lCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGludCBkZWxldGUoCi1hbmRyb2lkLm5ldC5VcmkKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VHlwZSgKLWFuZHJvaWQubmV0LlVyaSkKLQotcHVibGljIGFuZHJvaWQubmV0LlVyaSBpbnNlcnQoCi1hbmRyb2lkLm5ldC5VcmkKLWFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzKQotCi1wdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZSgpCi0KLXB1YmxpYyBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciBxdWVyeSgKLWFuZHJvaWQubmV0LlVyaQotamF2YS5sYW5nLlN0cmluZ1tdCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nW10KLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBpbnQgdXBkYXRlKAotYW5kcm9pZC5uZXQuVXJpCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlcwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZ1tdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvU3luY1Jlc3VsdDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC9jb250ZW50L1N5bmNSZXN1bHQ7PjsgKQotZmluYWwgY2xhc3MgYW5kcm9pZC5jb250ZW50LlN5bmNSZXN1bHQkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuU3luY1Jlc3VsdCBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5TeW5jUmVzdWx0W10gbmV3QXJyYXkoCi1pbnQpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0W10gbmV3QXJyYXkoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5jb250ZW50LlN5bmNSZXN1bHQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5jb250ZW50LlN5bmNSZXN1bHQgQUxSRUFEWV9JTl9QUk9HUkVTUwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC9jb250ZW50L1N5bmNSZXN1bHQ7PjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvciBDUkVBVE9SCi0KLXB1YmxpYyBib29sZWFuIGRhdGFiYXNlRXJyb3IKLQotcHVibGljIGJvb2xlYW4gZnVsbFN5bmNSZXF1ZXN0ZWQKLQotcHVibGljIGJvb2xlYW4gbW9yZVJlY29yZHNUb0dldAotCi1wdWJsaWMgYm9vbGVhbiBwYXJ0aWFsU3luY1VuYXZhaWxhYmxlCi0KLXB1YmxpYyBmaW5hbCBhbmRyb2lkLmNvbnRlbnQuU3luY1N0YXRzIHN0YXRzCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIHN5bmNBbHJlYWR5SW5Qcm9ncmVzcwotCi1wdWJsaWMgYm9vbGVhbiB0b29NYW55RGVsZXRpb25zCi0KLXB1YmxpYyBib29sZWFuIHRvb01hbnlSZXRyaWVzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuUGFyY2VsCi1hbmRyb2lkLmNvbnRlbnQuU3luY1Jlc3VsdCQxKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgY2xlYXIoKQotCi1wdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKQotCi1wdWJsaWMgYm9vbGVhbiBoYXNFcnJvcigpCi0KLXB1YmxpYyBib29sZWFuIGhhc0hhcmRFcnJvcigpCi0KLXB1YmxpYyBib29sZWFuIGhhc1NvZnRFcnJvcigpCi0KLXB1YmxpYyBib29sZWFuIG1hZGVTb21lUHJvZ3Jlc3MoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b0RlYnVnU3RyaW5nKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1wdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9UHJvdmlkZXIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9TeW5jU3RhdGVDb250ZW50UHJvdmlkZXJIZWxwZXI7ICkKLSBjbGFzcyBhbmRyb2lkLmNvbnRlbnQuU3luY1N0YXRlQ29udGVudFByb3ZpZGVySGVscGVyJFByb3ZpZGVyIGV4dGVuZHMgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLmNvbnRlbnQuU3luY1N0YXRlQ29udGVudFByb3ZpZGVySGVscGVyIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5TeW5jU3RhdGVDb250ZW50UHJvdmlkZXJIZWxwZXIpCi0KLXB1YmxpYyBpbnQgZGVsZXRlKAotYW5kcm9pZC5uZXQuVXJpCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFR5cGUoCi1hbmRyb2lkLm5ldC5VcmkpCi0KLXB1YmxpYyBhbmRyb2lkLm5ldC5VcmkgaW5zZXJ0KAotYW5kcm9pZC5uZXQuVXJpCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlcykKLQotcHVibGljIGJvb2xlYW4gb25DcmVhdGUoKQotCi1wdWJsaWMgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IgcXVlcnkoCi1hbmRyb2lkLm5ldC5VcmkKLWphdmEubGFuZy5TdHJpbmdbXQotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZ1tdCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgaW50IHVwZGF0ZSgKLWFuZHJvaWQubmV0LlVyaQotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXMKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvU3luY1N0YXRlQ29udGVudFByb3ZpZGVySGVscGVyJFByb3ZpZGVyOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5jb250ZW50LlN5bmNTdGF0ZUNvbnRlbnRQcm92aWRlckhlbHBlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZ1tdIEFDQ09VTlRfUFJPSkVDVElPTgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDQ09VTlRfV0hFUkUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIENPTlRFTlRfVVJJCi0KLXByaXZhdGUgc3RhdGljIGxvbmcgREJfVkVSU0lPTgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTWU5DX1NUQVRFX0FVVEhPUklUWQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNZTkNfU1RBVEVfVEFCTEUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYW5kcm9pZC5jb250ZW50LlVyaU1hdGNoZXIgc1VSSU1hdGNoZXIKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLmNvbnRlbnQuU3luY1N0YXRlQ29udGVudFByb3ZpZGVySGVscGVyJFByb3ZpZGVyIG1JbnRlcm5hbFByb3ZpZGVySW50ZXJmYWNlCi0KLWZpbmFsIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZU9wZW5IZWxwZXIgbU9wZW5IZWxwZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZU9wZW5IZWxwZXIpCi0KLXN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuVXJpTWF0Y2hlciBhY2Nlc3MkMDAwKCkKLQotc3RhdGljIGFuZHJvaWQubmV0LlVyaSBhY2Nlc3MkMTAwKCkKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXIgYXNDb250ZW50UHJvdmlkZXIoKQotCi1wdWJsaWMgdm9pZCBjb3B5U3luY1N0YXRlKAotYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UKLWFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBjcmVhdGVEYXRhYmFzZSgKLWFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlKQotCi1wdWJsaWMgdm9pZCBkaXNjYXJkU3luY0RhdGEoCi1hbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZQotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJvb2xlYW4gbWF0Y2hlcygKLWFuZHJvaWQubmV0LlVyaSkKLQotcHVibGljIHZvaWQgb25BY2NvdW50c0NoYW5nZWQoCi1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLXByb3RlY3RlZCB2b2lkIG9uRGF0YWJhc2VPcGVuZWQoCi1hbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSkKLQotcHVibGljIGJ5dGVbXSByZWFkU3luY0RhdGFCeXRlcygKLWFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCB3cml0ZVN5bmNEYXRhQnl0ZXMoCi1hbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZQotamF2YS5sYW5nLlN0cmluZwotYnl0ZVtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvU3luY1N0YXRzOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExhbmRyb2lkL2NvbnRlbnQvU3luY1N0YXRzOz47ICkKLWZpbmFsIGNsYXNzIGFuZHJvaWQuY29udGVudC5TeW5jU3RhdHMkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuU3luY1N0YXRzIGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LlN5bmNTdGF0c1tdIG5ld0FycmF5KAotaW50KQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdFtdIG5ld0FycmF5KAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuY29udGVudC5TeW5jU3RhdHMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExhbmRyb2lkL2NvbnRlbnQvU3luY1N0YXRzOz47ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IgQ1JFQVRPUgotCi1wdWJsaWMgbG9uZyBudW1BdXRoRXhjZXB0aW9ucwotCi1wdWJsaWMgbG9uZyBudW1Db25mbGljdERldGVjdGVkRXhjZXB0aW9ucwotCi1wdWJsaWMgbG9uZyBudW1EZWxldGVzCi0KLXB1YmxpYyBsb25nIG51bUVudHJpZXMKLQotcHVibGljIGxvbmcgbnVtSW5zZXJ0cwotCi1wdWJsaWMgbG9uZyBudW1Jb0V4Y2VwdGlvbnMKLQotcHVibGljIGxvbmcgbnVtUGFyc2VFeGNlcHRpb25zCi0KLXB1YmxpYyBsb25nIG51bVNraXBwZWRFbnRyaWVzCi0KLXB1YmxpYyBsb25nIG51bVVwZGF0ZXMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgdm9pZCBjbGVhcigpCi0KLXB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9TeW5jU3RvcmFnZUVuZ2luZTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPURhdGFiYXNlSGVscGVyICkKLSBjbGFzcyBhbmRyb2lkLmNvbnRlbnQuU3luY1N0b3JhZ2VFbmdpbmUkRGF0YWJhc2VIZWxwZXIgZXh0ZW5kcyBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVPcGVuSGVscGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQuY29udGVudC5TeW5jU3RvcmFnZUVuZ2luZSB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuU3luY1N0b3JhZ2VFbmdpbmUKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wdWJsaWMgdm9pZCBvbkNyZWF0ZSgKLWFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlKQotCi1wdWJsaWMgdm9pZCBvbk9wZW4oCi1hbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSkKLQotcHVibGljIHZvaWQgb25VcGdyYWRlKAotYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UKLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9TeW5jU3RvcmFnZUVuZ2luZSREYXRhYmFzZUhlbHBlcjsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQuY29udGVudC5TeW5jU3RvcmFnZUVuZ2luZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFDVElWRQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaE1hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuSGFzaE1hcCBBQ1RJVkVfUFJPSkVDVElPTl9NQVAKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBEQVRBQkFTRV9OQU1FCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEQVRBQkFTRV9WRVJTSU9OCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBISVNUT1JZCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBISVNUT1JZX0lECi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNoTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEudXRpbC5IYXNoTWFwIEhJU1RPUllfUFJPSkVDVElPTl9NQVAKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9ISVNUT1JZX0VWRU5UU19UT19LRUVQCi0KLXN0YXRpYyBmaW5hbCBsb25nIE1JTExJU19JTl80V0VFS1MKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBFTkRJTkcKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0hhc2hNYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS51dGlsLkhhc2hNYXAgUEVORElOR19QUk9KRUNUSU9OX01BUAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNFTEVDVF9JTklUSUFMX0ZBSUxVUkVfVElNRV9RVUVSWV9TVFJJTkcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFVFRJTkdTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFUUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gU1RBVFNfQUNDT1VOVF9QUk9KRUNUSU9OCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFUU19JRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNoTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEudXRpbC5IYXNoTWFwIFNUQVRVU19QUk9KRUNUSU9OX01BUAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRBRwotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuU3luY1N0b3JhZ2VFbmdpbmUgc1N5bmNTdG9yYWdlRW5naW5lCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGFuZHJvaWQuY29udGVudC5VcmlNYXRjaGVyIHNVUkxNYXRjaGVyCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgbUNvbnRleHQKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVPcGVuSGVscGVyIG1PcGVuSGVscGVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tDYWxsZXIoCi1ib29sZWFuCi1pbnQpCi0KLXByaXZhdGUgbG9uZyBjcmVhdGVTdGF0c1Jvd0lmTmVjZXNzYXJ5KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSB2b2lkIGNyZWF0ZVN0YXR1c1Jvd0lmTmVjZXNzYXJ5KAotbG9uZykKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuU3luY1N0b3JhZ2VFbmdpbmUgZ2V0U2luZ2xldG9uKCkKLQotcHVibGljIHN0YXRpYyB2b2lkIGluaXQoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuU3luY1N0b3JhZ2VFbmdpbmUgbmV3VGVzdEluc3RhbmNlKAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXByaXZhdGUgYm9vbGVhbiBwdXJnZU9sZEhpc3RvcnlFdmVudHMoCi1sb25nKQotCi1wcml2YXRlIGludCB1cGRhdGVBY3RpdmVTeW5jKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLkxvbmcpCi0KLSBpbnQgY2xlYXJQZW5kaW5nKCkKLQotcHVibGljIGludCBkZWxldGUoCi1ib29sZWFuCi1hbmRyb2lkLm5ldC5VcmkKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotIGludCBkZWxldGVGcm9tUGVuZGluZygKLWxvbmcpCi0KLXByb3RlY3RlZCB2b2lkIGRvRGF0YWJhc2VDbGVhbnVwKAotamF2YS5sYW5nLlN0cmluZ1tdKQotCi1wdWJsaWMgbG9uZyBnZXRJbml0aWFsU3luY0ZhaWx1cmVUaW1lKCkKLQotcHVibGljIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIGdldFBlbmRpbmdTeW5jc0N1cnNvcigKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VHlwZSgKLWFuZHJvaWQubmV0LlVyaSkKLQotcHVibGljIGFuZHJvaWQubmV0LlVyaSBpbnNlcnQoCi1ib29sZWFuCi1hbmRyb2lkLm5ldC5VcmkKLWFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzKQotCi1wcm90ZWN0ZWQgYW5kcm9pZC5uZXQuVXJpIGluc2VydEludG9QZW5kaW5nKAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXMpCi0KLXB1YmxpYyBsb25nIGluc2VydFN0YXJ0U3luY0V2ZW50KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotbG9uZwotaW50KQotCi1wdWJsaWMgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IgcXVlcnkoCi1hbmRyb2lkLm5ldC5VcmkKLWphdmEubGFuZy5TdHJpbmdbXQotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZ1tdCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRBY3RpdmVTeW5jKAotYW5kcm9pZC5jb250ZW50LlN5bmNNYW5hZ2VyJEFjdGl2ZVN5bmNDb250ZXh0KQotCi1wdWJsaWMgdm9pZCBzdG9wU3luY0V2ZW50KAotbG9uZwotbG9uZwotamF2YS5sYW5nLlN0cmluZwotbG9uZwotbG9uZykKLQotcHVibGljIGludCB1cGRhdGUoCi1ib29sZWFuCi1hbmRyb2lkLm5ldC5VcmkKLWFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGphdmEubGFuZy5EZXByZWNhdGVkCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQuY29udGVudC5TeW5jVUlDb250ZXh0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBjb250ZXh0KCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0U3RhdHVzVGV4dCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotIGNsYXNzIGFuZHJvaWQuY29udGVudC5TeW5jYWJsZUNvbnRlbnRQcm92aWRlciQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQuYWNjb3VudHMuQWNjb3VudE1vbml0b3JMaXN0ZW5lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLmNvbnRlbnQuU3luY2FibGVDb250ZW50UHJvdmlkZXIgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LlN5bmNhYmxlQ29udGVudFByb3ZpZGVyKQotCi1wdWJsaWMgdm9pZCBvbkFjY291bnRzVXBkYXRlZCgKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L1N5bmNhYmxlQ29udGVudFByb3ZpZGVyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTIgbmFtZSA9RGF0YWJhc2VIZWxwZXIgKQotIGNsYXNzIGFuZHJvaWQuY29udGVudC5TeW5jYWJsZUNvbnRlbnRQcm92aWRlciREYXRhYmFzZUhlbHBlciBleHRlbmRzIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZU9wZW5IZWxwZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC5jb250ZW50LlN5bmNhYmxlQ29udGVudFByb3ZpZGVyIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5TeW5jYWJsZUNvbnRlbnRQcm92aWRlcgotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIG9uQ3JlYXRlKAotYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UpCi0KLXB1YmxpYyB2b2lkIG9uT3BlbigKLWFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlKQotCi1wdWJsaWMgdm9pZCBvblVwZ3JhZGUoCi1hbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZQotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L1N5bmNhYmxlQ29udGVudFByb3ZpZGVyJERhdGFiYXNlSGVscGVyOyApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC5jb250ZW50LlN5bmNhYmxlQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNZTkNfQUNDT1VOVF9XSEVSRV9DTEFVU0UKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZ1tdIHNBY2NvdW50UHJvamVjdGlvbgotCi1wcml2YXRlIGFuZHJvaWQuYWNjb3VudHMuQWNjb3VudE1vbml0b3IgbUFjY291bnRNb25pdG9yCi0KLXByaXZhdGUgYm9vbGVhbiBtQ29udGFpbnNEaWZmcwotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBtQ29udGVudFVyaQotCi1wcml2YXRlIGFuZHJvaWQuY29udGVudC5BYnN0cmFjdFRhYmxlTWVyZ2VyIG1DdXJyZW50TWVyZ2VyCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBtRGF0YWJhc2VOYW1lCi0KLXByaXZhdGUgZmluYWwgaW50IG1EYXRhYmFzZVZlcnNpb24KLQotcHJvdGVjdGVkIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlIG1EYgotCi1wcml2YXRlIGJvb2xlYW4gbUlzTWVyZ2VDYW5jZWxsZWQKLQotcHJpdmF0ZSBib29sZWFuIG1Jc1RlbXBvcmFyeQotCi1wcm90ZWN0ZWQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlT3BlbkhlbHBlciBtT3BlbkhlbHBlcgotCi1wcml2YXRlIGFuZHJvaWQuY29udGVudC5TeW5jU3RhdGVDb250ZW50UHJvdmlkZXJIZWxwZXIgbVN5bmNTdGF0ZQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbVN5bmNpbmdBY2NvdW50Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWFuZHJvaWQubmV0LlVyaSkKLQotc3RhdGljIGludCBhY2Nlc3MkMDAwKAotYW5kcm9pZC5jb250ZW50LlN5bmNhYmxlQ29udGVudFByb3ZpZGVyKQotCi1zdGF0aWMgYW5kcm9pZC5jb250ZW50LlN5bmNTdGF0ZUNvbnRlbnRQcm92aWRlckhlbHBlciBhY2Nlc3MkMTAwKAotYW5kcm9pZC5jb250ZW50LlN5bmNhYmxlQ29udGVudFByb3ZpZGVyKQotCi1zdGF0aWMgYW5kcm9pZC5uZXQuVXJpIGFjY2VzcyQyMDAoCi1hbmRyb2lkLmNvbnRlbnQuU3luY2FibGVDb250ZW50UHJvdmlkZXIpCi0KLXByb3RlY3RlZCB2b2lkIGJvb3RzdHJhcERhdGFiYXNlKAotYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UpCi0KLXB1YmxpYyBmaW5hbCBpbnQgYnVsa0luc2VydCgKLWFuZHJvaWQubmV0LlVyaQotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXNbXSkKLQotcHVibGljIGJvb2xlYW4gY2hhbmdlUmVxdWlyZXNMb2NhbFN5bmMoCi1hbmRyb2lkLm5ldC5VcmkpCi0KLXB1YmxpYyB2b2lkIGNsb3NlKCkKLQotcHVibGljIGZpbmFsIGludCBkZWxldGUoCi1hbmRyb2lkLm5ldC5VcmkKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotcHJvdGVjdGVkIGFic3RyYWN0IGludCBkZWxldGVJbnRlcm5hbCgKLWFuZHJvaWQubmV0LlVyaQotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZ1tdKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL0Jvb2xlYW47PjtMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspViApCi1wcm90ZWN0ZWQgdm9pZCBkZWxldGVSb3dzRm9yUmVtb3ZlZEFjY291bnRzKAotamF2YS51dGlsLk1hcAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJvb2xlYW4gZ2V0Q29udGFpbnNEaWZmcygpCi0KLXB1YmxpYyBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSBnZXREYXRhYmFzZSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS9sYW5nL0l0ZXJhYmxlPCtMYW5kcm9pZC9jb250ZW50L0Fic3RyYWN0VGFibGVNZXJnZXI7PjsgKQotcHJvdGVjdGVkIGphdmEubGFuZy5JdGVyYWJsZSBnZXRNZXJnZXJzKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3luY2luZ0FjY291bnQoKQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LlN5bmNhYmxlQ29udGVudFByb3ZpZGVyIGdldFRlbXBvcmFyeUluc3RhbmNlKCkKLQotcHVibGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBpbnNlcnQoCi1hbmRyb2lkLm5ldC5VcmkKLWFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzKQotCi1wcm90ZWN0ZWQgYWJzdHJhY3QgYW5kcm9pZC5uZXQuVXJpIGluc2VydEludGVybmFsKAotYW5kcm9pZC5uZXQuVXJpCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlcykKLQotcHVibGljIGJvb2xlYW4gaXNNZXJnZUNhbmNlbGxlZCgpCi0KLXByb3RlY3RlZCBib29sZWFuIGlzVGVtcG9yYXJ5KCkKLQotcHVibGljIHZvaWQgbWVyZ2UoCi1hbmRyb2lkLmNvbnRlbnQuU3luY0NvbnRleHQKLWFuZHJvaWQuY29udGVudC5TeW5jYWJsZUNvbnRlbnRQcm92aWRlcgotYW5kcm9pZC5jb250ZW50LlRlbXBQcm92aWRlclN5bmNSZXN1bHQKLWFuZHJvaWQuY29udGVudC5TeW5jUmVzdWx0KQotCi1wcm90ZWN0ZWQgdm9pZCBvbkFjY291bnRzQ2hhbmdlZCgKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotcHVibGljIGJvb2xlYW4gb25DcmVhdGUoKQotCi1wcm90ZWN0ZWQgdm9pZCBvbkRhdGFiYXNlT3BlbmVkKAotYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UpCi0KLXB1YmxpYyB2b2lkIG9uU3luY0NhbmNlbGVkKCkKLQotcHVibGljIHZvaWQgb25TeW5jU3RhcnQoCi1hbmRyb2lkLmNvbnRlbnQuU3luY0NvbnRleHQKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIG9uU3luY1N0b3AoCi1hbmRyb2lkLmNvbnRlbnQuU3luY0NvbnRleHQKLWJvb2xlYW4pCi0KLXB1YmxpYyBmaW5hbCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciBxdWVyeSgKLWFuZHJvaWQubmV0LlVyaQotamF2YS5sYW5nLlN0cmluZ1tdCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nW10KLWphdmEubGFuZy5TdHJpbmcpCi0KLXByb3RlY3RlZCBhYnN0cmFjdCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciBxdWVyeUludGVybmFsKAotYW5kcm9pZC5uZXQuVXJpCi1qYXZhLmxhbmcuU3RyaW5nW10KLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmdbXQotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJ5dGVbXSByZWFkU3luY0RhdGFCeXRlcygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHNldENvbnRhaW5zRGlmZnMoCi1ib29sZWFuKQotCi1wdWJsaWMgZmluYWwgaW50IHVwZGF0ZSgKLWFuZHJvaWQubmV0LlVyaQotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXMKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotcHJvdGVjdGVkIGFic3RyYWN0IGludCB1cGRhdGVJbnRlcm5hbCgKLWFuZHJvaWQubmV0LlVyaQotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXMKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gdXBncmFkZURhdGFiYXNlKAotYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCB3aXBlQWNjb3VudCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHdyaXRlU3luY0RhdGFCeXRlcygKLWphdmEubGFuZy5TdHJpbmcKLWJ5dGVbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwMzMgbmFtZSA9U3luY0RhdGEgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9UZW1wUHJvdmlkZXJTeW5jQWRhcHRlcjsgKQotcHVibGljIGFic3RyYWN0IGNsYXNzIGFuZHJvaWQuY29udGVudC5UZW1wUHJvdmlkZXJTeW5jQWRhcHRlciRTeW5jRGF0YSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MiBuYW1lID1TeW5jVGhyZWFkICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvVGVtcFByb3ZpZGVyU3luY0FkYXB0ZXI7ICkKLSBjbGFzcyBhbmRyb2lkLmNvbnRlbnQuVGVtcFByb3ZpZGVyU3luY0FkYXB0ZXIkU3luY1RocmVhZCBleHRlbmRzIGphdmEubGFuZy5UaHJlYWQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIG1BY2NvdW50Ci0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5vcy5CdW5kbGUgbUV4dHJhcwotCi1wcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gbUlzQ2FuY2VsZWQKLQotcHJpdmF0ZSBsb25nW10gbU5ldFN0YXRzCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5jb250ZW50LlN5bmNSZXN1bHQgbVJlc3VsdAotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQuY29udGVudC5TeW5jQ29udGV4dCBtU3luY0NvbnRleHQKLQotZmluYWwgYW5kcm9pZC5jb250ZW50LlRlbXBQcm92aWRlclN5bmNBZGFwdGVyIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5UZW1wUHJvdmlkZXJTeW5jQWRhcHRlcgotYW5kcm9pZC5jb250ZW50LlN5bmNDb250ZXh0Ci1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLkJ1bmRsZSkKLQotcHJpdmF0ZSB2b2lkIHJ1blN5bmNMb29wKAotYW5kcm9pZC5jb250ZW50LlN5bmNDb250ZXh0Ci1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLkJ1bmRsZSkKLQotcHJpdmF0ZSB2b2lkIHN5bmMoCi1hbmRyb2lkLmNvbnRlbnQuU3luY0NvbnRleHQKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuQnVuZGxlKQotCi0gdm9pZCBjYW5jZWxTeW5jKCkKLQotcHVibGljIHZvaWQgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvVGVtcFByb3ZpZGVyU3luY0FkYXB0ZXIkU3luY1RocmVhZDtMYW5kcm9pZC9jb250ZW50L1RlbXBQcm92aWRlclN5bmNBZGFwdGVyJFN5bmNEYXRhOyApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC5jb250ZW50LlRlbXBQcm92aWRlclN5bmNBZGFwdGVyIGV4dGVuZHMgYW5kcm9pZC5jb250ZW50LlN5bmNBZGFwdGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfR0VUX1NFUlZFUl9ESUZGU19MT09QX0NPVU5UCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfVVBMT0FEX0NIQU5HRVNfTE9PUF9DT1VOVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTlVNX0FMTE9XRURfU0lNVUxUQU5FT1VTX0RFTEVUSU9OUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFBFUkNFTlRfQUxMT1dFRF9TSU1VTFRBTkVPVVNfREVMRVRJT05TCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEFHCi0KLXByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBtQWRhcHRlclN5bmNTdGFydGVkCi0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgbUNvbnRleHQKLQotcHJpdmF0ZSB2b2xhdGlsZSBhbmRyb2lkLmNvbnRlbnQuU3luY2FibGVDb250ZW50UHJvdmlkZXIgbVByb3ZpZGVyCi0KLXByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBtUHJvdmlkZXJTeW5jU3RhcnRlZAotCi1wcml2YXRlIHZvbGF0aWxlIGFuZHJvaWQuY29udGVudC5UZW1wUHJvdmlkZXJTeW5jQWRhcHRlciRTeW5jVGhyZWFkIG1TeW5jVGhyZWFkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LlN5bmNhYmxlQ29udGVudFByb3ZpZGVyKQotCi1zdGF0aWMgYm9vbGVhbiBhY2Nlc3MkMDAwKAotYW5kcm9pZC5jb250ZW50LlRlbXBQcm92aWRlclN5bmNBZGFwdGVyKQotCi1zdGF0aWMgYm9vbGVhbiBhY2Nlc3MkMDAyKAotYW5kcm9pZC5jb250ZW50LlRlbXBQcm92aWRlclN5bmNBZGFwdGVyCi1ib29sZWFuKQotCi1zdGF0aWMgYm9vbGVhbiBhY2Nlc3MkMTAwKAotYW5kcm9pZC5jb250ZW50LlRlbXBQcm92aWRlclN5bmNBZGFwdGVyKQotCi1zdGF0aWMgYm9vbGVhbiBhY2Nlc3MkMTAyKAotYW5kcm9pZC5jb250ZW50LlRlbXBQcm92aWRlclN5bmNBZGFwdGVyCi1ib29sZWFuKQotCi1zdGF0aWMgYW5kcm9pZC5jb250ZW50LlN5bmNhYmxlQ29udGVudFByb3ZpZGVyIGFjY2VzcyQyMDAoCi1hbmRyb2lkLmNvbnRlbnQuVGVtcFByb3ZpZGVyU3luY0FkYXB0ZXIpCi0KLXN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuVGVtcFByb3ZpZGVyU3luY0FkYXB0ZXIkU3luY1RocmVhZCBhY2Nlc3MkMzAyKAotYW5kcm9pZC5jb250ZW50LlRlbXBQcm92aWRlclN5bmNBZGFwdGVyCi1hbmRyb2lkLmNvbnRlbnQuVGVtcFByb3ZpZGVyU3luY0FkYXB0ZXIkU3luY1RocmVhZCkKLQotcHVibGljIHZvaWQgY2FuY2VsU3luYygpCi0KLXByb3RlY3RlZCBqYXZhLmxhbmcuT2JqZWN0IGNyZWF0ZVN5bmNJbmZvKCkKLQotcHVibGljIGZpbmFsIGFuZHJvaWQuY29udGVudC5Db250ZXh0IGdldENvbnRleHQoKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnZXRTZXJ2ZXJEaWZmcygKLWFuZHJvaWQuY29udGVudC5TeW5jQ29udGV4dAotYW5kcm9pZC5jb250ZW50LlRlbXBQcm92aWRlclN5bmNBZGFwdGVyJFN5bmNEYXRhCi1hbmRyb2lkLmNvbnRlbnQuU3luY2FibGVDb250ZW50UHJvdmlkZXIKLWFuZHJvaWQub3MuQnVuZGxlCi1qYXZhLmxhbmcuT2JqZWN0Ci1hbmRyb2lkLmNvbnRlbnQuU3luY1Jlc3VsdCkKLQotcHJvdGVjdGVkIGJvb2xlYW4gaGFzVG9vTWFueURlbGV0aW9ucygKLWFuZHJvaWQuY29udGVudC5TeW5jU3RhdHMpCi0KLXByb3RlY3RlZCB2b2lkIGluaXRUZW1wUHJvdmlkZXIoCi1hbmRyb2lkLmNvbnRlbnQuU3luY2FibGVDb250ZW50UHJvdmlkZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzUmVhZE9ubHkoKQotCi1wcm90ZWN0ZWQgdm9pZCBsb2dTeW5jRGV0YWlscygKLWxvbmcKLWxvbmcKLWFuZHJvaWQuY29udGVudC5TeW5jUmVzdWx0KQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LlRlbXBQcm92aWRlclN5bmNBZGFwdGVyJFN5bmNEYXRhIG5ld1N5bmNEYXRhKCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgb25BY2NvdW50c0NoYW5nZWQoCi1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uU3luY0NhbmNlbGVkKCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgb25TeW5jRW5kaW5nKAotYW5kcm9pZC5jb250ZW50LlN5bmNDb250ZXh0Ci1ib29sZWFuKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvblN5bmNTdGFydGluZygKLWFuZHJvaWQuY29udGVudC5TeW5jQ29udGV4dAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbgotYW5kcm9pZC5jb250ZW50LlN5bmNSZXN1bHQpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuVGVtcFByb3ZpZGVyU3luY0FkYXB0ZXIkU3luY0RhdGEgcmVhZFN5bmNEYXRhKAotYW5kcm9pZC5jb250ZW50LlN5bmNhYmxlQ29udGVudFByb3ZpZGVyKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZW5kQ2xpZW50RGlmZnMoCi1hbmRyb2lkLmNvbnRlbnQuU3luY0NvbnRleHQKLWFuZHJvaWQuY29udGVudC5TeW5jYWJsZUNvbnRlbnRQcm92aWRlcgotYW5kcm9pZC5jb250ZW50LlN5bmNhYmxlQ29udGVudFByb3ZpZGVyCi1hbmRyb2lkLmNvbnRlbnQuU3luY1Jlc3VsdAotYm9vbGVhbikKLQotcHVibGljIGZpbmFsIHZvaWQgc2V0Q29udGV4dCgKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wdWJsaWMgdm9pZCBzdGFydFN5bmMoCi1hbmRyb2lkLmNvbnRlbnQuU3luY0NvbnRleHQKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuQnVuZGxlKQotCi1wdWJsaWMgdm9pZCB3cml0ZVN5bmNEYXRhKAotYW5kcm9pZC5jb250ZW50LlRlbXBQcm92aWRlclN5bmNBZGFwdGVyJFN5bmNEYXRhCi1hbmRyb2lkLmNvbnRlbnQuU3luY2FibGVDb250ZW50UHJvdmlkZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5jb250ZW50LlRlbXBQcm92aWRlclN5bmNSZXN1bHQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuU3luY2FibGVDb250ZW50UHJvdmlkZXIgdGVtcENvbnRlbnRQcm92aWRlcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5jb250ZW50LlVyaU1hdGNoZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFWEFDVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT19NQVRDSAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTlVNQkVSCi0KLXN0YXRpYyBmaW5hbCBqYXZhLnV0aWwucmVnZXguUGF0dGVybiBQQVRIX1NQTElUX1BBVFRFUk4KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRFWFQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0FycmF5TGlzdDxMYW5kcm9pZC9jb250ZW50L1VyaU1hdGNoZXI7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuQXJyYXlMaXN0IG1DaGlsZHJlbgotCi1wcml2YXRlIGludCBtQ29kZQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbVRleHQKLQotcHJpdmF0ZSBpbnQgbVdoaWNoCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50KQotCi1wdWJsaWMgdm9pZCBhZGRVUkkoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyBpbnQgbWF0Y2goCi1hbmRyb2lkLm5ldC5VcmkpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9wbS9BY3Rpdml0eUluZm87ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I8TGFuZHJvaWQvY29udGVudC9wbS9BY3Rpdml0eUluZm87PjsgKQotZmluYWwgY2xhc3MgYW5kcm9pZC5jb250ZW50LnBtLkFjdGl2aXR5SW5mbyQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm8gY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQucG0uQWN0aXZpdHlJbmZvW10gbmV3QXJyYXkoCi1pbnQpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0W10gbmV3QXJyYXkoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VJdGVtSW5mbyREaXNwbGF5TmFtZUNvbXBhcmF0b3I7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZUl0ZW1JbmZvIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgaW50IGljb24KLQotcHVibGljIGludCBsYWJlbFJlcwotCi1wdWJsaWMgYW5kcm9pZC5vcy5CdW5kbGUgbWV0YURhdGEKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgbmFtZQotCi1wdWJsaWMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBub25Mb2NhbGl6ZWRMYWJlbAotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBwYWNrYWdlTmFtZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlSXRlbUluZm8pCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wcm90ZWN0ZWQgdm9pZCBkdW1wQmFjaygKLWFuZHJvaWQudXRpbC5QcmludGVyCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcm90ZWN0ZWQgdm9pZCBkdW1wRnJvbnQoCi1hbmRyb2lkLnV0aWwuUHJpbnRlcgotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgbG9hZEljb24oCi1hbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIpCi0KLXB1YmxpYyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIGxvYWRMYWJlbCgKLWFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcikKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5yZXMuWG1sUmVzb3VyY2VQYXJzZXIgbG9hZFhtbE1ldGFEYXRhKAotYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmNvbnRlbnQucG0uQ29tcG9uZW50SW5mbyBleHRlbmRzIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlSXRlbUluZm8KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm8gYXBwbGljYXRpb25JbmZvCi0KLXB1YmxpYyBib29sZWFuIGVuYWJsZWQKLQotcHVibGljIGJvb2xlYW4gZXhwb3J0ZWQKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgcHJvY2Vzc05hbWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQucG0uQ29tcG9uZW50SW5mbykKLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXByb3RlY3RlZCB2b2lkIGR1bXBCYWNrKAotYW5kcm9pZC51dGlsLlByaW50ZXIKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByb3RlY3RlZCB2b2lkIGR1bXBGcm9udCgKLWFuZHJvaWQudXRpbC5QcmludGVyCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgZmluYWwgaW50IGdldEljb25SZXNvdXJjZSgpCi0KLXB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIGxvYWRJY29uKAotYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyKQotCi1wdWJsaWMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBsb2FkTGFiZWwoCi1hbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIpCi0KLXB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm8gZXh0ZW5kcyBhbmRyb2lkLmNvbnRlbnQucG0uQ29tcG9uZW50SW5mbyBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05GSUdfRk9OVF9TQ0FMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05GSUdfS0VZQk9BUkQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09ORklHX0tFWUJPQVJEX0hJRERFTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05GSUdfTE9DQUxFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTkZJR19NQ0MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09ORklHX01OQwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05GSUdfTkFWSUdBVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05GSUdfT1JJRU5UQVRJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09ORklHX1RPVUNIU0NSRUVOCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExhbmRyb2lkL2NvbnRlbnQvcG0vQWN0aXZpdHlJbmZvOz47ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IgQ1JFQVRPUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX0FMTE9XX1RBU0tfUkVQQVJFTlRJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19BTFdBWVNfUkVUQUlOX1RBU0tfU1RBVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19DTEVBUl9UQVNLX09OX0xBVU5DSAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX0VYQ0xVREVfRlJPTV9SRUNFTlRTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfRklOSVNIX09OX1RBU0tfTEFVTkNICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfTVVMVElQUk9DRVNTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfU1RBVEVfTk9UX05FRURFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMQVVOQ0hfTVVMVElQTEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEFVTkNIX1NJTkdMRV9JTlNUQU5DRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMQVVOQ0hfU0lOR0xFX1RBU0sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEFVTkNIX1NJTkdMRV9UT1AKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NSRUVOX09SSUVOVEFUSU9OX0JFSElORAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ1JFRU5fT1JJRU5UQVRJT05fTEFORFNDQVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDUkVFTl9PUklFTlRBVElPTl9OT1NFTlNPUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ1JFRU5fT1JJRU5UQVRJT05fUE9SVFJBSVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NSRUVOX09SSUVOVEFUSU9OX1NFTlNPUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ1JFRU5fT1JJRU5UQVRJT05fVU5TUEVDSUZJRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NSRUVOX09SSUVOVEFUSU9OX1VTRVIKLQotcHVibGljIGludCBjb25maWdDaGFuZ2VzCi0KLXB1YmxpYyBpbnQgZmxhZ3MKLQotcHVibGljIGludCBsYXVuY2hNb2RlCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHBlcm1pc3Npb24KLQotcHVibGljIGludCBzY3JlZW5PcmllbnRhdGlvbgotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0YXJnZXRBY3Rpdml0eQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0YXNrQWZmaW5pdHkKLQotcHVibGljIGludCB0aGVtZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LnBtLkFjdGl2aXR5SW5mbykKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuUGFyY2VsKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLlBhcmNlbAotYW5kcm9pZC5jb250ZW50LnBtLkFjdGl2aXR5SW5mbyQxKQotCi1wdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKQotCi1wdWJsaWMgdm9pZCBkdW1wKAotYW5kcm9pZC51dGlsLlByaW50ZXIKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBmaW5hbCBpbnQgZ2V0VGhlbWVSZXNvdXJjZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9wbS9BcHBsaWNhdGlvbkluZm87ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I8TGFuZHJvaWQvY29udGVudC9wbS9BcHBsaWNhdGlvbkluZm87PjsgKQotZmluYWwgY2xhc3MgYW5kcm9pZC5jb250ZW50LnBtLkFwcGxpY2F0aW9uSW5mbyQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm8gY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQucG0uQXBwbGljYXRpb25JbmZvW10gbmV3QXJyYXkoCi1pbnQpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0W10gbmV3QXJyYXkoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPURpc3BsYXlOYW1lQ29tcGFyYXRvciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3BtL0FwcGxpY2F0aW9uSW5mbzsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3V0aWwvQ29tcGFyYXRvcjxMYW5kcm9pZC9jb250ZW50L3BtL0FwcGxpY2F0aW9uSW5mbzs+OyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5jb250ZW50LnBtLkFwcGxpY2F0aW9uSW5mbyREaXNwbGF5TmFtZUNvbXBhcmF0b3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLkNvbXBhcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIgbVBNCi0KLXByaXZhdGUgZmluYWwgamF2YS50ZXh0LkNvbGxhdG9yIHNDb2xsYXRvcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcikKLQotcHVibGljIGZpbmFsIGludCBjb21wYXJlKAotYW5kcm9pZC5jb250ZW50LnBtLkFwcGxpY2F0aW9uSW5mbwotYW5kcm9pZC5jb250ZW50LnBtLkFwcGxpY2F0aW9uSW5mbykKLQotcHVibGljIHZvbGF0aWxlIGludCBjb21wYXJlKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvcG0vQXBwbGljYXRpb25JbmZvJERpc3BsYXlOYW1lQ29tcGFyYXRvcjsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm8gZXh0ZW5kcyBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZUl0ZW1JbmZvIGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExhbmRyb2lkL2NvbnRlbnQvcG0vQXBwbGljYXRpb25JbmZvOz47ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IgQ1JFQVRPUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX0FMTE9XX0NMRUFSX1VTRVJfREFUQQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX0FMTE9XX1RBU0tfUkVQQVJFTlRJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19ERUJVR0dBQkxFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfRkFDVE9SWV9URVNUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfSEFTX0NPREUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19QRVJTSVNURU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfU1lTVEVNCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGNsYXNzTmFtZQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBkYXRhRGlyCi0KLXB1YmxpYyBpbnQgZGVzY3JpcHRpb25SZXMKLQotcHVibGljIGJvb2xlYW4gZW5hYmxlZAotCi1wdWJsaWMgaW50IGZsYWdzCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIG1hbmFnZVNwYWNlQWN0aXZpdHlOYW1lCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHBlcm1pc3Npb24KLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgcHJvY2Vzc05hbWUKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgcHVibGljU291cmNlRGlyCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gc2hhcmVkTGlicmFyeUZpbGVzCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHNvdXJjZURpcgotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0YXNrQWZmaW5pdHkKLQotcHVibGljIGludCB0aGVtZQotCi1wdWJsaWMgaW50IHVpZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LnBtLkFwcGxpY2F0aW9uSW5mbykKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuUGFyY2VsKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLlBhcmNlbAotYW5kcm9pZC5jb250ZW50LnBtLkFwcGxpY2F0aW9uSW5mbyQxKQotCi1wdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKQotCi1wdWJsaWMgdm9pZCBkdW1wKAotYW5kcm9pZC51dGlsLlByaW50ZXIKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIGxvYWREZXNjcmlwdGlvbigKLWFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcikKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1wdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvcG0vSVBhY2thZ2VEYXRhT2JzZXJ2ZXIkU3R1YjsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLmNvbnRlbnQucG0uSVBhY2thZ2VEYXRhT2JzZXJ2ZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5JSW50ZXJmYWNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uUmVtb3ZlQ29tcGxldGVkKAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPVByb3h5ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvcG0vSVBhY2thZ2VEYXRhT2JzZXJ2ZXIkU3R1YjsgKQotIGNsYXNzIGFuZHJvaWQuY29udGVudC5wbS5JUGFja2FnZURhdGFPYnNlcnZlciRTdHViJFByb3h5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQuY29udGVudC5wbS5JUGFja2FnZURhdGFPYnNlcnZlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGFuZHJvaWQub3MuSUJpbmRlciBtUmVtb3RlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBvblJlbW92ZUNvbXBsZXRlZCgKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMDMzIG5hbWUgPVN0dWIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9wbS9JUGFja2FnZURhdGFPYnNlcnZlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3BtL0lQYWNrYWdlRGF0YU9ic2VydmVyJFN0dWIkUHJveHk7ICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBhbmRyb2lkLmNvbnRlbnQucG0uSVBhY2thZ2VEYXRhT2JzZXJ2ZXIkU3R1YiBleHRlbmRzIGFuZHJvaWQub3MuQmluZGVyIGltcGxlbWVudHMgYW5kcm9pZC5jb250ZW50LnBtLklQYWNrYWdlRGF0YU9ic2VydmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVTQ1JJUFRPUgotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX29uUmVtb3ZlQ29tcGxldGVkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQucG0uSVBhY2thZ2VEYXRhT2JzZXJ2ZXIgYXNJbnRlcmZhY2UoCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gb25UcmFuc2FjdCgKLWludAotYW5kcm9pZC5vcy5QYXJjZWwKLWFuZHJvaWQub3MuUGFyY2VsCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3BtL0lQYWNrYWdlRGVsZXRlT2JzZXJ2ZXIkU3R1YjsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLmNvbnRlbnQucG0uSVBhY2thZ2VEZWxldGVPYnNlcnZlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLklJbnRlcmZhY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgcGFja2FnZURlbGV0ZWQoCi1ib29sZWFuKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvcG0vSVBhY2thZ2VEZWxldGVPYnNlcnZlciRTdHViOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPVByb3h5ICkKLSBjbGFzcyBhbmRyb2lkLmNvbnRlbnQucG0uSVBhY2thZ2VEZWxldGVPYnNlcnZlciRTdHViJFByb3h5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQuY29udGVudC5wbS5JUGFja2FnZURlbGV0ZU9ic2VydmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5JQmluZGVyIG1SZW1vdGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHBhY2thZ2VEZWxldGVkKAotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3BtL0lQYWNrYWdlRGVsZXRlT2JzZXJ2ZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9wbS9JUGFja2FnZURlbGV0ZU9ic2VydmVyJFN0dWIkUHJveHk7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAzMyBuYW1lID1TdHViICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBhbmRyb2lkLmNvbnRlbnQucG0uSVBhY2thZ2VEZWxldGVPYnNlcnZlciRTdHViIGV4dGVuZHMgYW5kcm9pZC5vcy5CaW5kZXIgaW1wbGVtZW50cyBhbmRyb2lkLmNvbnRlbnQucG0uSVBhY2thZ2VEZWxldGVPYnNlcnZlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFU0NSSVBUT1IKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9wYWNrYWdlRGVsZXRlZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5jb250ZW50LnBtLklQYWNrYWdlRGVsZXRlT2JzZXJ2ZXIgYXNJbnRlcmZhY2UoCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gb25UcmFuc2FjdCgKLWludAotYW5kcm9pZC5vcy5QYXJjZWwKLWFuZHJvaWQub3MuUGFyY2VsCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3BtL0lQYWNrYWdlSW5zdGFsbE9ic2VydmVyJFN0dWI7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5jb250ZW50LnBtLklQYWNrYWdlSW5zdGFsbE9ic2VydmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuSUludGVyZmFjZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBwYWNrYWdlSW5zdGFsbGVkKAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9UHJveHkgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9wbS9JUGFja2FnZUluc3RhbGxPYnNlcnZlciRTdHViOyApCi0gY2xhc3MgYW5kcm9pZC5jb250ZW50LnBtLklQYWNrYWdlSW5zdGFsbE9ic2VydmVyJFN0dWIkUHJveHkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5jb250ZW50LnBtLklQYWNrYWdlSW5zdGFsbE9ic2VydmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5JQmluZGVyIG1SZW1vdGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHBhY2thZ2VJbnN0YWxsZWQoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMDMzIG5hbWUgPVN0dWIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9wbS9JUGFja2FnZUluc3RhbGxPYnNlcnZlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3BtL0lQYWNrYWdlSW5zdGFsbE9ic2VydmVyJFN0dWIkUHJveHk7ICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBhbmRyb2lkLmNvbnRlbnQucG0uSVBhY2thZ2VJbnN0YWxsT2JzZXJ2ZXIkU3R1YiBleHRlbmRzIGFuZHJvaWQub3MuQmluZGVyIGltcGxlbWVudHMgYW5kcm9pZC5jb250ZW50LnBtLklQYWNrYWdlSW5zdGFsbE9ic2VydmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVTQ1JJUFRPUgotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3BhY2thZ2VJbnN0YWxsZWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuY29udGVudC5wbS5JUGFja2FnZUluc3RhbGxPYnNlcnZlciBhc0ludGVyZmFjZSgKLWFuZHJvaWQub3MuSUJpbmRlcikKLQotcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBvblRyYW5zYWN0KAotaW50Ci1hbmRyb2lkLm9zLlBhcmNlbAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvcG0vSVBhY2thZ2VNYW5hZ2VyJFN0dWI7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5jb250ZW50LnBtLklQYWNrYWdlTWFuYWdlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLklJbnRlcmZhY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgYWRkUGFja2FnZVRvUHJlZmVycmVkKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGFkZFBlcm1pc3Npb24oCi1hbmRyb2lkLmNvbnRlbnQucG0uUGVybWlzc2lvbkluZm8pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBhZGRQcmVmZXJyZWRBY3Rpdml0eSgKLWFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXIKLWludAotYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWVbXQotYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGNoZWNrUGVybWlzc2lvbigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGNoZWNrU2lnbmF0dXJlcygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGNoZWNrVWlkUGVybWlzc2lvbigKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGNsZWFyQXBwbGljYXRpb25Vc2VyRGF0YSgKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQuY29udGVudC5wbS5JUGFja2FnZURhdGFPYnNlcnZlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGNsZWFyUGFja2FnZVByZWZlcnJlZEFjdGl2aXRpZXMoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgZGVsZXRlQXBwbGljYXRpb25DYWNoZUZpbGVzKAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5jb250ZW50LnBtLklQYWNrYWdlRGF0YU9ic2VydmVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgZGVsZXRlUGFja2FnZSgKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQuY29udGVudC5wbS5JUGFja2FnZURlbGV0ZU9ic2VydmVyCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBlbnRlclNhZmVNb2RlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGZyZWVBcHBsaWNhdGlvbkNhY2hlKAotbG9uZwotYW5kcm9pZC5jb250ZW50LnBtLklQYWNrYWdlRGF0YU9ic2VydmVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm8gZ2V0QWN0aXZpdHlJbmZvKAotYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSSlMamF2YS91dGlsL0xpc3Q8TGFuZHJvaWQvY29udGVudC9wbS9QZXJtaXNzaW9uR3JvdXBJbmZvOz47ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnV0aWwuTGlzdCBnZXRBbGxQZXJtaXNzaW9uR3JvdXBzKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCBnZXRBcHBsaWNhdGlvbkVuYWJsZWRTZXR0aW5nKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLmNvbnRlbnQucG0uQXBwbGljYXRpb25JbmZvIGdldEFwcGxpY2F0aW9uSW5mbygKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0Q29tcG9uZW50RW5hYmxlZFNldHRpbmcoCi1hbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSSlMamF2YS91dGlsL0xpc3Q8TGFuZHJvaWQvY29udGVudC9wbS9BcHBsaWNhdGlvbkluZm87PjsgKQotcHVibGljIGFic3RyYWN0IGphdmEudXRpbC5MaXN0IGdldEluc3RhbGxlZEFwcGxpY2F0aW9ucygKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSSlMamF2YS91dGlsL0xpc3Q8TGFuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlSW5mbzs+OyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLkxpc3QgZ2V0SW5zdGFsbGVkUGFja2FnZXMoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC5jb250ZW50LnBtLkluc3RydW1lbnRhdGlvbkluZm8gZ2V0SW5zdHJ1bWVudGF0aW9uSW5mbygKLWFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXROYW1lRm9yVWlkKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludFtdIGdldFBhY2thZ2VHaWRzKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZUluZm8gZ2V0UGFja2FnZUluZm8oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnZXRQYWNrYWdlU2l6ZUluZm8oCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLmNvbnRlbnQucG0uSVBhY2thZ2VTdGF0c09ic2VydmVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCBnZXRQYWNrYWdlVWlkKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0UGFja2FnZXNGb3JVaWQoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC5jb250ZW50LnBtLlBlcm1pc3Npb25Hcm91cEluZm8gZ2V0UGVybWlzc2lvbkdyb3VwSW5mbygKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLmNvbnRlbnQucG0uUGVybWlzc2lvbkluZm8gZ2V0UGVybWlzc2lvbkluZm8oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KEkpTGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL2NvbnRlbnQvcG0vQXBwbGljYXRpb25JbmZvOz47ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnV0aWwuTGlzdCBnZXRQZXJzaXN0ZW50QXBwbGljYXRpb25zKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0xpc3Q8TGFuZHJvaWQvY29udGVudC9JbnRlbnRGaWx0ZXI7PjtMamF2YS91dGlsL0xpc3Q8TGFuZHJvaWQvY29udGVudC9Db21wb25lbnROYW1lOz47TGphdmEvbGFuZy9TdHJpbmc7KUkgKQotcHVibGljIGFic3RyYWN0IGludCBnZXRQcmVmZXJyZWRBY3Rpdml0aWVzKAotamF2YS51dGlsLkxpc3QKLWphdmEudXRpbC5MaXN0Ci1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJKUxqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VJbmZvOz47ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnV0aWwuTGlzdCBnZXRQcmVmZXJyZWRQYWNrYWdlcygKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLmNvbnRlbnQucG0uQWN0aXZpdHlJbmZvIGdldFJlY2VpdmVySW5mbygKLWFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC5jb250ZW50LnBtLlNlcnZpY2VJbmZvIGdldFNlcnZpY2VJbmZvKAotYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGhhc1N5c3RlbVVpZEVycm9ycygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBpbnN0YWxsUGFja2FnZSgKLWFuZHJvaWQubmV0LlVyaQotYW5kcm9pZC5jb250ZW50LnBtLklQYWNrYWdlSW5zdGFsbE9ic2VydmVyCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvU3RyaW5nO0lJKUxqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9jb250ZW50L3BtL1Byb3ZpZGVySW5mbzs+OyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLkxpc3QgcXVlcnlDb250ZW50UHJvdmlkZXJzKAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvU3RyaW5nO0kpTGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL2NvbnRlbnQvcG0vSW5zdHJ1bWVudGF0aW9uSW5mbzs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLkxpc3QgcXVlcnlJbnN0cnVtZW50YXRpb24oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExhbmRyb2lkL2NvbnRlbnQvSW50ZW50O0xqYXZhL2xhbmcvU3RyaW5nO0kpTGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL2NvbnRlbnQvcG0vUmVzb2x2ZUluZm87PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEudXRpbC5MaXN0IHF1ZXJ5SW50ZW50QWN0aXZpdGllcygKLWFuZHJvaWQuY29udGVudC5JbnRlbnQKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGFuZHJvaWQvY29udGVudC9Db21wb25lbnROYW1lO1tMYW5kcm9pZC9jb250ZW50L0ludGVudDtbTGphdmEvbGFuZy9TdHJpbmc7TGFuZHJvaWQvY29udGVudC9JbnRlbnQ7TGphdmEvbGFuZy9TdHJpbmc7SSlMamF2YS91dGlsL0xpc3Q8TGFuZHJvaWQvY29udGVudC9wbS9SZXNvbHZlSW5mbzs+OyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLkxpc3QgcXVlcnlJbnRlbnRBY3Rpdml0eU9wdGlvbnMoCi1hbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZQotYW5kcm9pZC5jb250ZW50LkludGVudFtdCi1qYXZhLmxhbmcuU3RyaW5nW10KLWFuZHJvaWQuY29udGVudC5JbnRlbnQKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGFuZHJvaWQvY29udGVudC9JbnRlbnQ7TGphdmEvbGFuZy9TdHJpbmc7SSlMamF2YS91dGlsL0xpc3Q8TGFuZHJvaWQvY29udGVudC9wbS9SZXNvbHZlSW5mbzs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLkxpc3QgcXVlcnlJbnRlbnRSZWNlaXZlcnMoCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExhbmRyb2lkL2NvbnRlbnQvSW50ZW50O0xqYXZhL2xhbmcvU3RyaW5nO0kpTGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL2NvbnRlbnQvcG0vUmVzb2x2ZUluZm87PjsgKQotcHVibGljIGFic3RyYWN0IGphdmEudXRpbC5MaXN0IHF1ZXJ5SW50ZW50U2VydmljZXMoCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvU3RyaW5nO0kpTGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL2NvbnRlbnQvcG0vUGVybWlzc2lvbkluZm87PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEudXRpbC5MaXN0IHF1ZXJ5UGVybWlzc2lvbnNCeUdyb3VwKAotamF2YS5sYW5nLlN0cmluZwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0xpc3Q8TGphdmEvbGFuZy9TdHJpbmc7PjtMamF2YS91dGlsL0xpc3Q8TGFuZHJvaWQvY29udGVudC9wbS9Qcm92aWRlckluZm87PjspViApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBxdWVyeVN5bmNQcm92aWRlcnMoCi1qYXZhLnV0aWwuTGlzdAotamF2YS51dGlsLkxpc3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCByZW1vdmVQYWNrYWdlRnJvbVByZWZlcnJlZCgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCByZW1vdmVQZXJtaXNzaW9uKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLmNvbnRlbnQucG0uUHJvdmlkZXJJbmZvIHJlc29sdmVDb250ZW50UHJvdmlkZXIoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC5jb250ZW50LnBtLlJlc29sdmVJbmZvIHJlc29sdmVJbnRlbnQoCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC5jb250ZW50LnBtLlJlc29sdmVJbmZvIHJlc29sdmVTZXJ2aWNlKAotYW5kcm9pZC5jb250ZW50LkludGVudAotamF2YS5sYW5nLlN0cmluZwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0QXBwbGljYXRpb25FbmFibGVkU2V0dGluZygKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0Q29tcG9uZW50RW5hYmxlZFNldHRpbmcoCi1hbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzeXN0ZW1SZWFkeSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1Qcm94eSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3BtL0lQYWNrYWdlTWFuYWdlciRTdHViOyApCi0gY2xhc3MgYW5kcm9pZC5jb250ZW50LnBtLklQYWNrYWdlTWFuYWdlciRTdHViJFByb3h5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQuY29udGVudC5wbS5JUGFja2FnZU1hbmFnZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLm9zLklCaW5kZXIgbVJlbW90ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuSUJpbmRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGFkZFBhY2thZ2VUb1ByZWZlcnJlZCgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBhZGRQZXJtaXNzaW9uKAotYW5kcm9pZC5jb250ZW50LnBtLlBlcm1pc3Npb25JbmZvKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgYWRkUHJlZmVycmVkQWN0aXZpdHkoCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyCi1pbnQKLWFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lW10KLWFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgY2hlY2tQZXJtaXNzaW9uKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgY2hlY2tTaWduYXR1cmVzKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgY2hlY2tVaWRQZXJtaXNzaW9uKAotamF2YS5sYW5nLlN0cmluZwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY2xlYXJBcHBsaWNhdGlvblVzZXJEYXRhKAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5jb250ZW50LnBtLklQYWNrYWdlRGF0YU9ic2VydmVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY2xlYXJQYWNrYWdlUHJlZmVycmVkQWN0aXZpdGllcygKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBkZWxldGVBcHBsaWNhdGlvbkNhY2hlRmlsZXMoCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLmNvbnRlbnQucG0uSVBhY2thZ2VEYXRhT2JzZXJ2ZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBkZWxldGVQYWNrYWdlKAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5jb250ZW50LnBtLklQYWNrYWdlRGVsZXRlT2JzZXJ2ZXIKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGVudGVyU2FmZU1vZGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgZnJlZUFwcGxpY2F0aW9uQ2FjaGUoCi1sb25nCi1hbmRyb2lkLmNvbnRlbnQucG0uSVBhY2thZ2VEYXRhT2JzZXJ2ZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LnBtLkFjdGl2aXR5SW5mbyBnZXRBY3Rpdml0eUluZm8oCi1hbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZQotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJKUxqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9jb250ZW50L3BtL1Blcm1pc3Npb25Hcm91cEluZm87PjsgKQotcHVibGljIGphdmEudXRpbC5MaXN0IGdldEFsbFBlcm1pc3Npb25Hcm91cHMoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGdldEFwcGxpY2F0aW9uRW5hYmxlZFNldHRpbmcoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm8gZ2V0QXBwbGljYXRpb25JbmZvKAotamF2YS5sYW5nLlN0cmluZwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXRDb21wb25lbnRFbmFibGVkU2V0dGluZygKLWFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJKUxqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9jb250ZW50L3BtL0FwcGxpY2F0aW9uSW5mbzs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0SW5zdGFsbGVkQXBwbGljYXRpb25zKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJKUxqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VJbmZvOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRJbnN0YWxsZWRQYWNrYWdlcygKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQucG0uSW5zdHJ1bWVudGF0aW9uSW5mbyBnZXRJbnN0cnVtZW50YXRpb25JbmZvKAotYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXROYW1lRm9yVWlkKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGludFtdIGdldFBhY2thZ2VHaWRzKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZUluZm8gZ2V0UGFja2FnZUluZm8oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBnZXRQYWNrYWdlU2l6ZUluZm8oCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLmNvbnRlbnQucG0uSVBhY2thZ2VTdGF0c09ic2VydmVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXRQYWNrYWdlVWlkKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0UGFja2FnZXNGb3JVaWQoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LnBtLlBlcm1pc3Npb25Hcm91cEluZm8gZ2V0UGVybWlzc2lvbkdyb3VwSW5mbygKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQucG0uUGVybWlzc2lvbkluZm8gZ2V0UGVybWlzc2lvbkluZm8oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KEkpTGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL2NvbnRlbnQvcG0vQXBwbGljYXRpb25JbmZvOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRQZXJzaXN0ZW50QXBwbGljYXRpb25zKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0xpc3Q8TGFuZHJvaWQvY29udGVudC9JbnRlbnRGaWx0ZXI7PjtMamF2YS91dGlsL0xpc3Q8TGFuZHJvaWQvY29udGVudC9Db21wb25lbnROYW1lOz47TGphdmEvbGFuZy9TdHJpbmc7KUkgKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXRQcmVmZXJyZWRBY3Rpdml0aWVzKAotamF2YS51dGlsLkxpc3QKLWphdmEudXRpbC5MaXN0Ci1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJKUxqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VJbmZvOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRQcmVmZXJyZWRQYWNrYWdlcygKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQucG0uQWN0aXZpdHlJbmZvIGdldFJlY2VpdmVySW5mbygKLWFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LnBtLlNlcnZpY2VJbmZvIGdldFNlcnZpY2VJbmZvKAotYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIGhhc1N5c3RlbVVpZEVycm9ycygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBpbnN0YWxsUGFja2FnZSgKLWFuZHJvaWQubmV0LlVyaQotYW5kcm9pZC5jb250ZW50LnBtLklQYWNrYWdlSW5zdGFsbE9ic2VydmVyCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvU3RyaW5nO0lJKUxqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9jb250ZW50L3BtL1Byb3ZpZGVySW5mbzs+OyApCi1wdWJsaWMgamF2YS51dGlsLkxpc3QgcXVlcnlDb250ZW50UHJvdmlkZXJzKAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvU3RyaW5nO0kpTGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL2NvbnRlbnQvcG0vSW5zdHJ1bWVudGF0aW9uSW5mbzs+OyApCi1wdWJsaWMgamF2YS51dGlsLkxpc3QgcXVlcnlJbnN0cnVtZW50YXRpb24oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExhbmRyb2lkL2NvbnRlbnQvSW50ZW50O0xqYXZhL2xhbmcvU3RyaW5nO0kpTGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL2NvbnRlbnQvcG0vUmVzb2x2ZUluZm87PjsgKQotcHVibGljIGphdmEudXRpbC5MaXN0IHF1ZXJ5SW50ZW50QWN0aXZpdGllcygKLWFuZHJvaWQuY29udGVudC5JbnRlbnQKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGFuZHJvaWQvY29udGVudC9Db21wb25lbnROYW1lO1tMYW5kcm9pZC9jb250ZW50L0ludGVudDtbTGphdmEvbGFuZy9TdHJpbmc7TGFuZHJvaWQvY29udGVudC9JbnRlbnQ7TGphdmEvbGFuZy9TdHJpbmc7SSlMamF2YS91dGlsL0xpc3Q8TGFuZHJvaWQvY29udGVudC9wbS9SZXNvbHZlSW5mbzs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS51dGlsLkxpc3QgcXVlcnlJbnRlbnRBY3Rpdml0eU9wdGlvbnMoCi1hbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZQotYW5kcm9pZC5jb250ZW50LkludGVudFtdCi1qYXZhLmxhbmcuU3RyaW5nW10KLWFuZHJvaWQuY29udGVudC5JbnRlbnQKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGFuZHJvaWQvY29udGVudC9JbnRlbnQ7TGphdmEvbGFuZy9TdHJpbmc7SSlMamF2YS91dGlsL0xpc3Q8TGFuZHJvaWQvY29udGVudC9wbS9SZXNvbHZlSW5mbzs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS51dGlsLkxpc3QgcXVlcnlJbnRlbnRSZWNlaXZlcnMoCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExhbmRyb2lkL2NvbnRlbnQvSW50ZW50O0xqYXZhL2xhbmcvU3RyaW5nO0kpTGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL2NvbnRlbnQvcG0vUmVzb2x2ZUluZm87PjsgKQotcHVibGljIGphdmEudXRpbC5MaXN0IHF1ZXJ5SW50ZW50U2VydmljZXMoCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvU3RyaW5nO0kpTGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL2NvbnRlbnQvcG0vUGVybWlzc2lvbkluZm87PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEudXRpbC5MaXN0IHF1ZXJ5UGVybWlzc2lvbnNCeUdyb3VwKAotamF2YS5sYW5nLlN0cmluZwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0xpc3Q8TGphdmEvbGFuZy9TdHJpbmc7PjtMamF2YS91dGlsL0xpc3Q8TGFuZHJvaWQvY29udGVudC9wbS9Qcm92aWRlckluZm87PjspViApCi1wdWJsaWMgdm9pZCBxdWVyeVN5bmNQcm92aWRlcnMoCi1qYXZhLnV0aWwuTGlzdAotamF2YS51dGlsLkxpc3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCByZW1vdmVQYWNrYWdlRnJvbVByZWZlcnJlZCgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCByZW1vdmVQZXJtaXNzaW9uKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQucG0uUHJvdmlkZXJJbmZvIHJlc29sdmVDb250ZW50UHJvdmlkZXIoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LnBtLlJlc29sdmVJbmZvIHJlc29sdmVJbnRlbnQoCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LnBtLlJlc29sdmVJbmZvIHJlc29sdmVTZXJ2aWNlKAotYW5kcm9pZC5jb250ZW50LkludGVudAotamF2YS5sYW5nLlN0cmluZwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0QXBwbGljYXRpb25FbmFibGVkU2V0dGluZygKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0Q29tcG9uZW50RW5hYmxlZFNldHRpbmcoCi1hbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzeXN0ZW1SZWFkeSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3BtL0lQYWNrYWdlTWFuYWdlciRTdHViJFByb3h5OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3BtL0lQYWNrYWdlTWFuYWdlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMDMzIG5hbWUgPVN0dWIgKQotcHVibGljIGFic3RyYWN0IGNsYXNzIGFuZHJvaWQuY29udGVudC5wbS5JUGFja2FnZU1hbmFnZXIkU3R1YiBleHRlbmRzIGFuZHJvaWQub3MuQmluZGVyIGltcGxlbWVudHMgYW5kcm9pZC5jb250ZW50LnBtLklQYWNrYWdlTWFuYWdlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFU0NSSVBUT1IKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9hZGRQYWNrYWdlVG9QcmVmZXJyZWQKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9hZGRQZXJtaXNzaW9uCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fYWRkUHJlZmVycmVkQWN0aXZpdHkKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9jaGVja1Blcm1pc3Npb24KLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9jaGVja1NpZ25hdHVyZXMKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9jaGVja1VpZFBlcm1pc3Npb24KLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9jbGVhckFwcGxpY2F0aW9uVXNlckRhdGEKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9jbGVhclBhY2thZ2VQcmVmZXJyZWRBY3Rpdml0aWVzCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZGVsZXRlQXBwbGljYXRpb25DYWNoZUZpbGVzCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZGVsZXRlUGFja2FnZQotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2VudGVyU2FmZU1vZGUKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9mcmVlQXBwbGljYXRpb25DYWNoZQotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2dldEFjdGl2aXR5SW5mbwotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2dldEFsbFBlcm1pc3Npb25Hcm91cHMKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9nZXRBcHBsaWNhdGlvbkVuYWJsZWRTZXR0aW5nCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZ2V0QXBwbGljYXRpb25JbmZvCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZ2V0Q29tcG9uZW50RW5hYmxlZFNldHRpbmcKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9nZXRJbnN0YWxsZWRBcHBsaWNhdGlvbnMKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9nZXRJbnN0YWxsZWRQYWNrYWdlcwotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2dldEluc3RydW1lbnRhdGlvbkluZm8KLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9nZXROYW1lRm9yVWlkCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZ2V0UGFja2FnZUdpZHMKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9nZXRQYWNrYWdlSW5mbwotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2dldFBhY2thZ2VTaXplSW5mbwotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2dldFBhY2thZ2VVaWQKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9nZXRQYWNrYWdlc0ZvclVpZAotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2dldFBlcm1pc3Npb25Hcm91cEluZm8KLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9nZXRQZXJtaXNzaW9uSW5mbwotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2dldFBlcnNpc3RlbnRBcHBsaWNhdGlvbnMKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9nZXRQcmVmZXJyZWRBY3Rpdml0aWVzCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZ2V0UHJlZmVycmVkUGFja2FnZXMKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9nZXRSZWNlaXZlckluZm8KLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9nZXRTZXJ2aWNlSW5mbwotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2hhc1N5c3RlbVVpZEVycm9ycwotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2luc3RhbGxQYWNrYWdlCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fcXVlcnlDb250ZW50UHJvdmlkZXJzCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fcXVlcnlJbnN0cnVtZW50YXRpb24KLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9xdWVyeUludGVudEFjdGl2aXRpZXMKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9xdWVyeUludGVudEFjdGl2aXR5T3B0aW9ucwotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3F1ZXJ5SW50ZW50UmVjZWl2ZXJzCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fcXVlcnlJbnRlbnRTZXJ2aWNlcwotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3F1ZXJ5UGVybWlzc2lvbnNCeUdyb3VwCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fcXVlcnlTeW5jUHJvdmlkZXJzCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fcmVtb3ZlUGFja2FnZUZyb21QcmVmZXJyZWQKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9yZW1vdmVQZXJtaXNzaW9uCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fcmVzb2x2ZUNvbnRlbnRQcm92aWRlcgotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3Jlc29sdmVJbnRlbnQKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9yZXNvbHZlU2VydmljZQotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3NldEFwcGxpY2F0aW9uRW5hYmxlZFNldHRpbmcKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9zZXRDb21wb25lbnRFbmFibGVkU2V0dGluZwotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3N5c3RlbVJlYWR5Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQucG0uSVBhY2thZ2VNYW5hZ2VyIGFzSW50ZXJmYWNlKAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIG9uVHJhbnNhY3QoCi1pbnQKLWFuZHJvaWQub3MuUGFyY2VsCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9wbS9JUGFja2FnZVN0YXRzT2JzZXJ2ZXIkU3R1YjsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLmNvbnRlbnQucG0uSVBhY2thZ2VTdGF0c09ic2VydmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuSUludGVyZmFjZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvbkdldFN0YXRzQ29tcGxldGVkKAotYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VTdGF0cwotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPVByb3h5ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvcG0vSVBhY2thZ2VTdGF0c09ic2VydmVyJFN0dWI7ICkKLSBjbGFzcyBhbmRyb2lkLmNvbnRlbnQucG0uSVBhY2thZ2VTdGF0c09ic2VydmVyJFN0dWIkUHJveHkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5jb250ZW50LnBtLklQYWNrYWdlU3RhdHNPYnNlcnZlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGFuZHJvaWQub3MuSUJpbmRlciBtUmVtb3RlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBvbkdldFN0YXRzQ29tcGxldGVkKAotYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VTdGF0cwotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3BtL0lQYWNrYWdlU3RhdHNPYnNlcnZlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3BtL0lQYWNrYWdlU3RhdHNPYnNlcnZlciRTdHViJFByb3h5OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwMzMgbmFtZSA9U3R1YiApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC5jb250ZW50LnBtLklQYWNrYWdlU3RhdHNPYnNlcnZlciRTdHViIGV4dGVuZHMgYW5kcm9pZC5vcy5CaW5kZXIgaW1wbGVtZW50cyBhbmRyb2lkLmNvbnRlbnQucG0uSVBhY2thZ2VTdGF0c09ic2VydmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVTQ1JJUFRPUgotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX29uR2V0U3RhdHNDb21wbGV0ZWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuY29udGVudC5wbS5JUGFja2FnZVN0YXRzT2JzZXJ2ZXIgYXNJbnRlcmZhY2UoCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gb25UcmFuc2FjdCgKLWludAotYW5kcm9pZC5vcy5QYXJjZWwKLWFuZHJvaWQub3MuUGFyY2VsCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9wbS9JbnN0cnVtZW50YXRpb25JbmZvOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExhbmRyb2lkL2NvbnRlbnQvcG0vSW5zdHJ1bWVudGF0aW9uSW5mbzs+OyApCi1maW5hbCBjbGFzcyBhbmRyb2lkLmNvbnRlbnQucG0uSW5zdHJ1bWVudGF0aW9uSW5mbyQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5wbS5JbnN0cnVtZW50YXRpb25JbmZvIGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LnBtLkluc3RydW1lbnRhdGlvbkluZm9bXSBuZXdBcnJheSgKLWludCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3RbXSBuZXdBcnJheSgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmNvbnRlbnQucG0uSW5zdHJ1bWVudGF0aW9uSW5mbyBleHRlbmRzIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlSXRlbUluZm8gaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I8TGFuZHJvaWQvY29udGVudC9wbS9JbnN0cnVtZW50YXRpb25JbmZvOz47ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IgQ1JFQVRPUgotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBkYXRhRGlyCi0KLXB1YmxpYyBib29sZWFuIGZ1bmN0aW9uYWxUZXN0Ci0KLXB1YmxpYyBib29sZWFuIGhhbmRsZVByb2ZpbGluZwotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBwdWJsaWNTb3VyY2VEaXIKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgc291cmNlRGlyCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRhcmdldFBhY2thZ2UKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5wbS5JbnN0cnVtZW50YXRpb25JbmZvKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuUGFyY2VsCi1hbmRyb2lkLmNvbnRlbnQucG0uSW5zdHJ1bWVudGF0aW9uSW5mbyQxKQotCi1wdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLXB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZUluZm87ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I8TGFuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlSW5mbzs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1maW5hbCBjbGFzcyBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZUluZm8kMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZUluZm8gY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZUluZm9bXSBuZXdBcnJheSgKLWludCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3RbXSBuZXdBcnJheSgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZUluZm8gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExhbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZUluZm87PjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvciBDUkVBVE9SCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQucG0uQWN0aXZpdHlJbmZvW10gYWN0aXZpdGllcwotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LnBtLkFwcGxpY2F0aW9uSW5mbyBhcHBsaWNhdGlvbkluZm8KLQotcHVibGljIGludFtdIGdpZHMKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5wbS5JbnN0cnVtZW50YXRpb25JbmZvW10gaW5zdHJ1bWVudGF0aW9uCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHBhY2thZ2VOYW1lCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQucG0uUGVybWlzc2lvbkluZm9bXSBwZXJtaXNzaW9ucwotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LnBtLlByb3ZpZGVySW5mb1tdIHByb3ZpZGVycwotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LnBtLkFjdGl2aXR5SW5mb1tdIHJlY2VpdmVycwotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIHJlcXVlc3RlZFBlcm1pc3Npb25zCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQucG0uU2VydmljZUluZm9bXSBzZXJ2aWNlcwotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LnBtLlNpZ25hdHVyZVtdIHNpZ25hdHVyZXMKLQotcHVibGljIGludCB2ZXJzaW9uQ29kZQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB2ZXJzaW9uTmFtZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuUGFyY2VsKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLlBhcmNlbAotYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VJbmZvJDEpCi0KLXB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3V0aWwvQ29tcGFyYXRvcjxMYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VJdGVtSW5mbzs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VJdGVtSW5mbzsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPURpc3BsYXlOYW1lQ29tcGFyYXRvciApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VJdGVtSW5mbyREaXNwbGF5TmFtZUNvbXBhcmF0b3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLkNvbXBhcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIgbVBNCi0KLXByaXZhdGUgZmluYWwgamF2YS50ZXh0LkNvbGxhdG9yIHNDb2xsYXRvcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcikKLQotcHVibGljIGZpbmFsIGludCBjb21wYXJlKAotYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VJdGVtSW5mbwotYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VJdGVtSW5mbykKLQotcHVibGljIHZvbGF0aWxlIGludCBjb21wYXJlKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VNYW5hZ2VyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9TmFtZU5vdEZvdW5kRXhjZXB0aW9uICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIkTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGV4dGVuZHMgYW5kcm9pZC51dGlsLkFuZHJvaWRFeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08SUk6TGFuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlUGFyc2VyJEludGVudEluZm87PkxqYXZhL2xhbmcvT2JqZWN0OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VQYXJzZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1Db21wb25lbnQgKQotcHVibGljIGNsYXNzIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlUGFyc2VyJENvbXBvbmVudCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIGNvbXBvbmVudAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQXJyYXlMaXN0PFRJSTs+OyApCi1wdWJsaWMgZmluYWwgamF2YS51dGlsLkFycmF5TGlzdCBpbnRlbnRzCi0KLXB1YmxpYyBhbmRyb2lkLm9zLkJ1bmRsZSBtZXRhRGF0YQotCi1wdWJsaWMgZmluYWwgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VQYXJzZXIkUGFja2FnZSBvd25lcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExhbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZVBhcnNlciRDb21wb25lbnQ8VElJOz47KVYgKQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VQYXJzZXIkQ29tcG9uZW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZVBhcnNlciRQYWNrYWdlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VQYXJzZXIkQ29tcG9uZW50PExhbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZVBhcnNlciRBY3Rpdml0eUludGVudEluZm87PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNSBuYW1lID1BY3Rpdml0eSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VQYXJzZXI7ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZVBhcnNlciRBY3Rpdml0eSBleHRlbmRzIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlUGFyc2VyJENvbXBvbmVudAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgZmluYWwgYW5kcm9pZC5jb250ZW50LnBtLkFjdGl2aXR5SW5mbyBpbmZvCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VQYXJzZXIkUGFja2FnZSkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1JbnRlbnRJbmZvICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZVBhcnNlcjsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlUGFyc2VyJEludGVudEluZm8gZXh0ZW5kcyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBib29sZWFuIGhhc0RlZmF1bHQKLQotcHVibGljIGludCBpY29uCi0KLXB1YmxpYyBpbnQgbGFiZWxSZXMKLQotcHVibGljIGphdmEubGFuZy5DaGFyU2VxdWVuY2Ugbm9uTG9jYWxpemVkTGFiZWwKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjUgbmFtZSA9QWN0aXZpdHlJbnRlbnRJbmZvICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZVBhcnNlcjsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlUGFyc2VyJEFjdGl2aXR5SW50ZW50SW5mbyBleHRlbmRzIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlUGFyc2VyJEludGVudEluZm8KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGZpbmFsIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlUGFyc2VyJEFjdGl2aXR5IGFjdGl2aXR5Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VQYXJzZXIkQWN0aXZpdHkpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VQYXJzZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjUgbmFtZSA9SW5zdHJ1bWVudGF0aW9uICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZVBhcnNlciRJbnN0cnVtZW50YXRpb24gZXh0ZW5kcyBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZVBhcnNlciRDb21wb25lbnQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGZpbmFsIGFuZHJvaWQuY29udGVudC5wbS5JbnN0cnVtZW50YXRpb25JbmZvIGluZm8KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZVBhcnNlciRQYWNrYWdlKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNSBuYW1lID1QYWNrYWdlICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZVBhcnNlcjsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlUGFyc2VyJFBhY2thZ2UgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9BcnJheUxpc3Q8TGFuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlUGFyc2VyJEFjdGl2aXR5Oz47ICkKLXB1YmxpYyBmaW5hbCBqYXZhLnV0aWwuQXJyYXlMaXN0IGFjdGl2aXRpZXMKLQotcHVibGljIGZpbmFsIGFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm8gYXBwbGljYXRpb25JbmZvCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9BcnJheUxpc3Q8TGFuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlUGFyc2VyJEluc3RydW1lbnRhdGlvbjs+OyApCi1wdWJsaWMgZmluYWwgamF2YS51dGlsLkFycmF5TGlzdCBpbnN0cnVtZW50YXRpb24KLQotcHVibGljIGFuZHJvaWQub3MuQnVuZGxlIG1BcHBNZXRhRGF0YQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBtRXh0cmFzCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIG1QYXRoCi0KLXB1YmxpYyBpbnQgbVByZWZlcnJlZE9yZGVyCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIG1TaGFyZWRVc2VySWQKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5wbS5TaWduYXR1cmVbXSBtU2lnbmF0dXJlcwotCi1wdWJsaWMgYm9vbGVhbiBtU3lzdGVtCi0KLXB1YmxpYyBpbnQgbVZlcnNpb25Db2RlCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIG1WZXJzaW9uTmFtZQotCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBwYWNrYWdlTmFtZQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQXJyYXlMaXN0PExhbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZVBhcnNlciRQZXJtaXNzaW9uR3JvdXA7PjsgKQotcHVibGljIGZpbmFsIGphdmEudXRpbC5BcnJheUxpc3QgcGVybWlzc2lvbkdyb3VwcwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQXJyYXlMaXN0PExhbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZVBhcnNlciRQZXJtaXNzaW9uOz47ICkKLXB1YmxpYyBmaW5hbCBqYXZhLnV0aWwuQXJyYXlMaXN0IHBlcm1pc3Npb25zCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9BcnJheUxpc3Q8TGFuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlUGFyc2VyJFByb3ZpZGVyOz47ICkKLXB1YmxpYyBmaW5hbCBqYXZhLnV0aWwuQXJyYXlMaXN0IHByb3ZpZGVycwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQXJyYXlMaXN0PExhbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZVBhcnNlciRBY3Rpdml0eTs+OyApCi1wdWJsaWMgZmluYWwgamF2YS51dGlsLkFycmF5TGlzdCByZWNlaXZlcnMKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0FycmF5TGlzdDxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wdWJsaWMgZmluYWwgamF2YS51dGlsLkFycmF5TGlzdCByZXF1ZXN0ZWRQZXJtaXNzaW9ucwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQXJyYXlMaXN0PExhbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZVBhcnNlciRTZXJ2aWNlOz47ICkKLXB1YmxpYyBmaW5hbCBqYXZhLnV0aWwuQXJyYXlMaXN0IHNlcnZpY2VzCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9BcnJheUxpc3Q8TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHVibGljIGZpbmFsIGphdmEudXRpbC5BcnJheUxpc3QgdXNlc0xpYnJhcmllcwotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIHVzZXNMaWJyYXJ5RmlsZXMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNSBuYW1lID1QZXJtaXNzaW9uICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VQYXJzZXIkQ29tcG9uZW50PExhbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZVBhcnNlciRJbnRlbnRJbmZvOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZVBhcnNlcjsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlUGFyc2VyJFBlcm1pc3Npb24gZXh0ZW5kcyBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZVBhcnNlciRDb21wb25lbnQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlUGFyc2VyJFBlcm1pc3Npb25Hcm91cCBncm91cAotCi1wdWJsaWMgZmluYWwgYW5kcm9pZC5jb250ZW50LnBtLlBlcm1pc3Npb25JbmZvIGluZm8KLQotcHVibGljIGJvb2xlYW4gdHJlZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlUGFyc2VyJFBhY2thZ2UpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlUGFyc2VyJFBhY2thZ2UKLWFuZHJvaWQuY29udGVudC5wbS5QZXJtaXNzaW9uSW5mbykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjUgbmFtZSA9UGVybWlzc2lvbkdyb3VwICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZVBhcnNlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZVBhcnNlciRDb21wb25lbnQ8TGFuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlUGFyc2VyJEludGVudEluZm87PjsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlUGFyc2VyJFBlcm1pc3Npb25Hcm91cCBleHRlbmRzIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlUGFyc2VyJENvbXBvbmVudAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgZmluYWwgYW5kcm9pZC5jb250ZW50LnBtLlBlcm1pc3Npb25Hcm91cEluZm8gaW5mbwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlUGFyc2VyJFBhY2thZ2UpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlUGFyc2VyJFBhY2thZ2UKLWFuZHJvaWQuY29udGVudC5wbS5QZXJtaXNzaW9uR3JvdXBJbmZvKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlUGFyc2VyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI1IG5hbWUgPVByb3ZpZGVyICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZVBhcnNlciRQcm92aWRlciBleHRlbmRzIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlUGFyc2VyJENvbXBvbmVudAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgZmluYWwgYW5kcm9pZC5jb250ZW50LnBtLlByb3ZpZGVySW5mbyBpbmZvCi0KLXB1YmxpYyBib29sZWFuIHN5bmNhYmxlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VQYXJzZXIkUGFja2FnZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VQYXJzZXIkUHJvdmlkZXIpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI1IG5hbWUgPVNlcnZpY2UgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlUGFyc2VyOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlUGFyc2VyJENvbXBvbmVudDxMYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VQYXJzZXIkU2VydmljZUludGVudEluZm87PjsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlUGFyc2VyJFNlcnZpY2UgZXh0ZW5kcyBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZVBhcnNlciRDb21wb25lbnQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGZpbmFsIGFuZHJvaWQuY29udGVudC5wbS5TZXJ2aWNlSW5mbyBpbmZvCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VQYXJzZXIkUGFja2FnZSkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZVBhcnNlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNSBuYW1lID1TZXJ2aWNlSW50ZW50SW5mbyApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VQYXJzZXIkU2VydmljZUludGVudEluZm8gZXh0ZW5kcyBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZVBhcnNlciRJbnRlbnRJbmZvCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBmaW5hbCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZVBhcnNlciRTZXJ2aWNlIHNlcnZpY2UKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZVBhcnNlciRTZXJ2aWNlKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VQYXJzZXIkU2VydmljZUludGVudEluZm87TGFuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlUGFyc2VyJEFjdGl2aXR5SW50ZW50SW5mbztMYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VQYXJzZXIkSW50ZW50SW5mbztMYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VQYXJzZXIkSW5zdHJ1bWVudGF0aW9uO0xhbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZVBhcnNlciRQcm92aWRlcjtMYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VQYXJzZXIkU2VydmljZTtMYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VQYXJzZXIkQWN0aXZpdHk7TGFuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlUGFyc2VyJFBlcm1pc3Npb25Hcm91cDtMYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VQYXJzZXIkUGVybWlzc2lvbjtMYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VQYXJzZXIkQ29tcG9uZW50O0xhbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZVBhcnNlciRQYWNrYWdlOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VQYXJzZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQU5EUk9JRF9SRVNPVVJDRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFSU0VfQ0hBVFRZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBUlNFX0lHTk9SRV9QUk9DRVNTRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFSU0VfSVNfU1lTVEVNCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBUlNFX01VU1RfQkVfQVBLCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gUklHSURfUEFSU0VSCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEFHCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9yZWYvV2Vha1JlZmVyZW5jZTxbQj47ICkKLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZSBtUmVhZEJ1ZmZlcgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuT2JqZWN0IG1TeW5jCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtQXJjaGl2ZVNvdXJjZVBhdGgKLQotcHJpdmF0ZSBpbnQgbVBhcnNlRXJyb3IKLQotcHJpdmF0ZSBpbnQgbVNka1ZlcnNpb24KLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nW10gbVNlcGFyYXRlUHJvY2Vzc2VzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGJ1aWxkQ2xhc3NOYW1lKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotamF2YS5sYW5nLlN0cmluZ1tdKQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGJ1aWxkQ29tcG91bmROYW1lKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZ1tdKQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGJ1aWxkUHJvY2Vzc05hbWUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWphdmEubGFuZy5TdHJpbmdbXQotamF2YS5sYW5nLlN0cmluZ1tdKQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGJ1aWxkVGFza0FmZmluaXR5TmFtZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb3B5TmVlZGVkKAotaW50Ci1hbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZVBhcnNlciRQYWNrYWdlCi1hbmRyb2lkLm9zLkJ1bmRsZSkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmNvbnRlbnQucG0uQWN0aXZpdHlJbmZvIGdlbmVyYXRlQWN0aXZpdHlJbmZvKAotYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VQYXJzZXIkQWN0aXZpdHkKLWludCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQucG0uQXBwbGljYXRpb25JbmZvIGdlbmVyYXRlQXBwbGljYXRpb25JbmZvKAotYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VQYXJzZXIkUGFja2FnZQotaW50KQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuY29udGVudC5wbS5JbnN0cnVtZW50YXRpb25JbmZvIGdlbmVyYXRlSW5zdHJ1bWVudGF0aW9uSW5mbygKLWFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlUGFyc2VyJEluc3RydW1lbnRhdGlvbgotaW50KQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlSW5mbyBnZW5lcmF0ZVBhY2thZ2VJbmZvKAotYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VQYXJzZXIkUGFja2FnZQotaW50W10KLWludCkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmNvbnRlbnQucG0uUGVybWlzc2lvbkdyb3VwSW5mbyBnZW5lcmF0ZVBlcm1pc3Npb25Hcm91cEluZm8oCi1hbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZVBhcnNlciRQZXJtaXNzaW9uR3JvdXAKLWludCkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmNvbnRlbnQucG0uUGVybWlzc2lvbkluZm8gZ2VuZXJhdGVQZXJtaXNzaW9uSW5mbygKLWFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlUGFyc2VyJFBlcm1pc3Npb24KLWludCkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmNvbnRlbnQucG0uUHJvdmlkZXJJbmZvIGdlbmVyYXRlUHJvdmlkZXJJbmZvKAotYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VQYXJzZXIkUHJvdmlkZXIKLWludCkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmNvbnRlbnQucG0uU2VydmljZUluZm8gZ2VuZXJhdGVTZXJ2aWNlSW5mbygKLWFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlUGFyc2VyJFNlcnZpY2UKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1BhY2thZ2VGaWxlbmFtZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlW10gbG9hZENlcnRpZmljYXRlcygKLWphdmEudXRpbC5qYXIuSmFyRmlsZQotamF2YS51dGlsLmphci5KYXJFbnRyeQotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlUGFyc2VyJEFjdGl2aXR5IHBhcnNlQWN0aXZpdHkoCi1hbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZVBhcnNlciRQYWNrYWdlCi1hbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcwotb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcgotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nW10KLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VQYXJzZXIkQWN0aXZpdHkgcGFyc2VBY3Rpdml0eUFsaWFzKAotYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VQYXJzZXIkUGFja2FnZQotYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMKLW9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXIKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQKLWludAotamF2YS5sYW5nLlN0cmluZ1tdCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIGJvb2xlYW4gcGFyc2VBbGxNZXRhRGF0YSgKLWFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzCi1vcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyCi1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ci1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZVBhcnNlciRDb21wb25lbnQKLWphdmEubGFuZy5TdHJpbmdbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBib29sZWFuIHBhcnNlQXBwbGljYXRpb24oCi1hbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZVBhcnNlciRQYWNrYWdlCi1hbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcwotb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcgotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLXByaXZhdGUgYm9vbGVhbiBwYXJzZUNvbXBvbmVudEluZm8oCi1hbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZVBhcnNlciRQYWNrYWdlCi1pbnQKLWFuZHJvaWQuY29udGVudC5wbS5Db21wb25lbnRJbmZvCi1qYXZhLmxhbmcuU3RyaW5nW10KLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheQotaW50Ci1pbnQKLWludAotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VQYXJzZXIkSW5zdHJ1bWVudGF0aW9uIHBhcnNlSW5zdHJ1bWVudGF0aW9uKAotYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VQYXJzZXIkUGFja2FnZQotYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMKLW9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXIKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQKLWphdmEubGFuZy5TdHJpbmdbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBib29sZWFuIHBhcnNlSW50ZW50KAotYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMKLW9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXIKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQKLWFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlUGFyc2VyJEludGVudEluZm8KLWphdmEubGFuZy5TdHJpbmdbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBhbmRyb2lkLm9zLkJ1bmRsZSBwYXJzZU1ldGFEYXRhKAotYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMKLW9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXIKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQKLWFuZHJvaWQub3MuQnVuZGxlCi1qYXZhLmxhbmcuU3RyaW5nW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VQYXJzZXIkUGFja2FnZSBwYXJzZVBhY2thZ2UoCi1hbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcwotYW5kcm9pZC5jb250ZW50LnJlcy5YbWxSZXNvdXJjZVBhcnNlcgotaW50Ci1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLXByaXZhdGUgYm9vbGVhbiBwYXJzZVBhY2thZ2VJdGVtSW5mbygKLWFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlUGFyc2VyJFBhY2thZ2UKLWFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlSXRlbUluZm8KLWphdmEubGFuZy5TdHJpbmdbXQotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgcGFyc2VQYWNrYWdlTmFtZSgKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsgKQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBwYXJzZVBhY2thZ2VOYW1lKAotb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcgotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VQYXJzZXIkUGVybWlzc2lvbiBwYXJzZVBlcm1pc3Npb24oCi1hbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZVBhcnNlciRQYWNrYWdlCi1hbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcwotb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcgotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldAotamF2YS5sYW5nLlN0cmluZ1tdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlUGFyc2VyJFBlcm1pc3Npb25Hcm91cCBwYXJzZVBlcm1pc3Npb25Hcm91cCgKLWFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlUGFyc2VyJFBhY2thZ2UKLWFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzCi1vcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyCi1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ci1qYXZhLmxhbmcuU3RyaW5nW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VQYXJzZXIkUGVybWlzc2lvbiBwYXJzZVBlcm1pc3Npb25UcmVlKAotYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VQYXJzZXIkUGFja2FnZQotYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMKLW9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXIKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQKLWphdmEubGFuZy5TdHJpbmdbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZVBhcnNlciRQcm92aWRlciBwYXJzZVByb3ZpZGVyKAotYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VQYXJzZXIkUGFja2FnZQotYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMKLW9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXIKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQKLWludAotamF2YS5sYW5nLlN0cmluZ1tdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIGJvb2xlYW4gcGFyc2VQcm92aWRlclRhZ3MoCi1hbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcwotb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcgotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldAotYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VQYXJzZXIkUHJvdmlkZXIKLWphdmEubGFuZy5TdHJpbmdbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZVBhcnNlciRTZXJ2aWNlIHBhcnNlU2VydmljZSgKLWFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlUGFyc2VyJFBhY2thZ2UKLWFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzCi1vcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyCi1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ci1pbnQKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQucG0uU2lnbmF0dXJlIHN0cmluZ1RvU2lnbmF0dXJlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyB2YWxpZGF0ZU5hbWUoCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuKQotCi1wdWJsaWMgYm9vbGVhbiBjb2xsZWN0Q2VydGlmaWNhdGVzKAotYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VQYXJzZXIkUGFja2FnZQotaW50KQotCi1wdWJsaWMgaW50IGdldFBhcnNlRXJyb3IoKQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VQYXJzZXIkUGFja2FnZSBwYXJzZVBhY2thZ2UoCi1qYXZhLmlvLkZpbGUKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljcwotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRTZGtWZXJzaW9uKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRTZXBhcmF0ZVByb2Nlc3NlcygKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VTdGF0czsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VTdGF0czs+OyApCi1maW5hbCBjbGFzcyBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZVN0YXRzJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VTdGF0cyBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlU3RhdHNbXSBuZXdBcnJheSgKLWludCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3RbXSBuZXdBcnJheSgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZVN0YXRzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VTdGF0czs+OyApCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yIENSRUFUT1IKLQotcHVibGljIGxvbmcgY2FjaGVTaXplCi0KLXB1YmxpYyBsb25nIGNvZGVTaXplCi0KLXB1YmxpYyBsb25nIGRhdGFTaXplCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHBhY2thZ2VOYW1lCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZVN0YXRzKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1wdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExhbmRyb2lkL2NvbnRlbnQvcG0vUGVybWlzc2lvbkdyb3VwSW5mbzs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3BtL1Blcm1pc3Npb25Hcm91cEluZm87ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLWZpbmFsIGNsYXNzIGFuZHJvaWQuY29udGVudC5wbS5QZXJtaXNzaW9uR3JvdXBJbmZvJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LnBtLlBlcm1pc3Npb25Hcm91cEluZm8gY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQucG0uUGVybWlzc2lvbkdyb3VwSW5mb1tdIG5ld0FycmF5KAotaW50KQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdFtdIG5ld0FycmF5KAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuY29udGVudC5wbS5QZXJtaXNzaW9uR3JvdXBJbmZvIGV4dGVuZHMgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VJdGVtSW5mbyBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC9jb250ZW50L3BtL1Blcm1pc3Npb25Hcm91cEluZm87PjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvciBDUkVBVE9SCi0KLXB1YmxpYyBpbnQgZGVzY3JpcHRpb25SZXMKLQotcHVibGljIGphdmEubGFuZy5DaGFyU2VxdWVuY2Ugbm9uTG9jYWxpemVkRGVzY3JpcHRpb24KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5wbS5QZXJtaXNzaW9uR3JvdXBJbmZvKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuUGFyY2VsCi1hbmRyb2lkLmNvbnRlbnQucG0uUGVybWlzc2lvbkdyb3VwSW5mbyQxKQotCi1wdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKQotCi1wdWJsaWMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBsb2FkRGVzY3JpcHRpb24oCi1hbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9wbS9QZXJtaXNzaW9uSW5mbzsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC9jb250ZW50L3BtL1Blcm1pc3Npb25JbmZvOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLWZpbmFsIGNsYXNzIGFuZHJvaWQuY29udGVudC5wbS5QZXJtaXNzaW9uSW5mbyQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5wbS5QZXJtaXNzaW9uSW5mbyBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5wbS5QZXJtaXNzaW9uSW5mb1tdIG5ld0FycmF5KAotaW50KQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdFtdIG5ld0FycmF5KAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuY29udGVudC5wbS5QZXJtaXNzaW9uSW5mbyBleHRlbmRzIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlSXRlbUluZm8gaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I8TGFuZHJvaWQvY29udGVudC9wbS9QZXJtaXNzaW9uSW5mbzs+OyApCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yIENSRUFUT1IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPVEVDVElPTl9EQU5HRVJPVVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPVEVDVElPTl9OT1JNQUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPVEVDVElPTl9TSUdOQVRVUkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPVEVDVElPTl9TSUdOQVRVUkVfT1JfU1lTVEVNCi0KLXB1YmxpYyBpbnQgZGVzY3JpcHRpb25SZXMKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ3JvdXAKLQotcHVibGljIGphdmEubGFuZy5DaGFyU2VxdWVuY2Ugbm9uTG9jYWxpemVkRGVzY3JpcHRpb24KLQotcHVibGljIGludCBwcm90ZWN0aW9uTGV2ZWwKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5wbS5QZXJtaXNzaW9uSW5mbykKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuUGFyY2VsKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLlBhcmNlbAotYW5kcm9pZC5jb250ZW50LnBtLlBlcm1pc3Npb25JbmZvJDEpCi0KLXB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIGxvYWREZXNjcmlwdGlvbigKLWFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcikKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1wdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3BtL1Byb3ZpZGVySW5mbzsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC9jb250ZW50L3BtL1Byb3ZpZGVySW5mbzs+OyApCi1maW5hbCBjbGFzcyBhbmRyb2lkLmNvbnRlbnQucG0uUHJvdmlkZXJJbmZvJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LnBtLlByb3ZpZGVySW5mbyBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5wbS5Qcm92aWRlckluZm9bXSBuZXdBcnJheSgKLWludCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3RbXSBuZXdBcnJheSgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLmNvbnRlbnQucG0uUHJvdmlkZXJJbmZvIGV4dGVuZHMgYW5kcm9pZC5jb250ZW50LnBtLkNvbXBvbmVudEluZm8gaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I8TGFuZHJvaWQvY29udGVudC9wbS9Qcm92aWRlckluZm87PjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvciBDUkVBVE9SCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGF1dGhvcml0eQotCi1wdWJsaWMgYm9vbGVhbiBncmFudFVyaVBlcm1pc3Npb25zCi0KLXB1YmxpYyBpbnQgaW5pdE9yZGVyCi0KLXB1YmxpYyBib29sZWFuIGlzU3luY2FibGUKLQotcHVibGljIGJvb2xlYW4gbXVsdGlwcm9jZXNzCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHJlYWRQZXJtaXNzaW9uCi0KLXB1YmxpYyBhbmRyb2lkLm9zLlBhdHRlcm5NYXRjaGVyW10gdXJpUGVybWlzc2lvblBhdHRlcm5zCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlUGVybWlzc2lvbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LnBtLlByb3ZpZGVySW5mbykKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuUGFyY2VsKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLlBhcmNlbAotYW5kcm9pZC5jb250ZW50LnBtLlByb3ZpZGVySW5mbyQxKQotCi1wdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLXB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvcG0vUmVzb2x2ZUluZm87ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I8TGFuZHJvaWQvY29udGVudC9wbS9SZXNvbHZlSW5mbzs+OyApCi1maW5hbCBjbGFzcyBhbmRyb2lkLmNvbnRlbnQucG0uUmVzb2x2ZUluZm8kMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQucG0uUmVzb2x2ZUluZm8gY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQucG0uUmVzb2x2ZUluZm9bXSBuZXdBcnJheSgKLWludCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3RbXSBuZXdBcnJheSgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvdXRpbC9Db21wYXJhdG9yPExhbmRyb2lkL2NvbnRlbnQvcG0vUmVzb2x2ZUluZm87PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPURpc3BsYXlOYW1lQ29tcGFyYXRvciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3BtL1Jlc29sdmVJbmZvOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5jb250ZW50LnBtLlJlc29sdmVJbmZvJERpc3BsYXlOYW1lQ29tcGFyYXRvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuQ29tcGFyYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlciBtUE0KLQotcHJpdmF0ZSBmaW5hbCBqYXZhLnRleHQuQ29sbGF0b3Igc0NvbGxhdG9yCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyKQotCi1wdWJsaWMgZmluYWwgaW50IGNvbXBhcmUoCi1hbmRyb2lkLmNvbnRlbnQucG0uUmVzb2x2ZUluZm8KLWFuZHJvaWQuY29udGVudC5wbS5SZXNvbHZlSW5mbykKLQotcHVibGljIHZvbGF0aWxlIGludCBjb21wYXJlKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvcG0vUmVzb2x2ZUluZm8kRGlzcGxheU5hbWVDb21wYXJhdG9yOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5jb250ZW50LnBtLlJlc29sdmVJbmZvIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC9jb250ZW50L3BtL1Jlc29sdmVJbmZvOz47ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IgQ1JFQVRPUgotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LnBtLkFjdGl2aXR5SW5mbyBhY3Rpdml0eUluZm8KLQotcHVibGljIGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXIgZmlsdGVyCi0KLXB1YmxpYyBpbnQgaWNvbgotCi1wdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHQKLQotcHVibGljIGludCBsYWJlbFJlcwotCi1wdWJsaWMgaW50IG1hdGNoCi0KLXB1YmxpYyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIG5vbkxvY2FsaXplZExhYmVsCi0KLXB1YmxpYyBpbnQgcHJlZmVycmVkT3JkZXIKLQotcHVibGljIGludCBwcmlvcml0eQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LnBtLlNlcnZpY2VJbmZvIHNlcnZpY2VJbmZvCi0KLXB1YmxpYyBpbnQgc3BlY2lmaWNJbmRleAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuUGFyY2VsKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLlBhcmNlbAotYW5kcm9pZC5jb250ZW50LnBtLlJlc29sdmVJbmZvJDEpCi0KLXB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpCi0KLXB1YmxpYyB2b2lkIGR1bXAoCi1hbmRyb2lkLnV0aWwuUHJpbnRlcgotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGZpbmFsIGludCBnZXRJY29uUmVzb3VyY2UoKQotCi1wdWJsaWMgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSBsb2FkSWNvbigKLWFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcikKLQotcHVibGljIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgbG9hZExhYmVsKAotYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLXB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvcG0vU2VydmljZUluZm87ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I8TGFuZHJvaWQvY29udGVudC9wbS9TZXJ2aWNlSW5mbzs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1maW5hbCBjbGFzcyBhbmRyb2lkLmNvbnRlbnQucG0uU2VydmljZUluZm8kMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQucG0uU2VydmljZUluZm8gY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQucG0uU2VydmljZUluZm9bXSBuZXdBcnJheSgKLWludCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3RbXSBuZXdBcnJheSgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmNvbnRlbnQucG0uU2VydmljZUluZm8gZXh0ZW5kcyBhbmRyb2lkLmNvbnRlbnQucG0uQ29tcG9uZW50SW5mbyBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC9jb250ZW50L3BtL1NlcnZpY2VJbmZvOz47ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IgQ1JFQVRPUgotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBwZXJtaXNzaW9uCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQucG0uU2VydmljZUluZm8pCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5QYXJjZWwKLWFuZHJvaWQuY29udGVudC5wbS5TZXJ2aWNlSW5mbyQxKQotCi1wdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLXB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvcG0vU2lnbmF0dXJlOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExhbmRyb2lkL2NvbnRlbnQvcG0vU2lnbmF0dXJlOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLWZpbmFsIGNsYXNzIGFuZHJvaWQuY29udGVudC5wbS5TaWduYXR1cmUkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQucG0uU2lnbmF0dXJlIGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LnBtLlNpZ25hdHVyZVtdIG5ld0FycmF5KAotaW50KQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdFtdIG5ld0FycmF5KAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuY29udGVudC5wbS5TaWduYXR1cmUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExhbmRyb2lkL2NvbnRlbnQvcG0vU2lnbmF0dXJlOz47ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IgQ1JFQVRPUgotCi1wcml2YXRlIGludCBtSGFzaENvZGUKLQotcHJpdmF0ZSBib29sZWFuIG1IYXZlSGFzaENvZGUKLQotcHJpdmF0ZSBmaW5hbCBieXRlW10gbVNpZ25hdHVyZQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbVN0cmluZwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuUGFyY2VsKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLlBhcmNlbAotYW5kcm9pZC5jb250ZW50LnBtLlNpZ25hdHVyZSQxKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ieXRlW10pCi0KLXB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1wdWJsaWMgYnl0ZVtdIHRvQnl0ZUFycmF5KCkKLQotcHVibGljIGNoYXJbXSB0b0NoYXJzKCkKLQotcHVibGljIGNoYXJbXSB0b0NoYXJzKAotY2hhcltdCi1pbnRbXSkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9DaGFyc1N0cmluZygpCi0KLXB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRGaWxlRGVzY3JpcHRvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yIG1GZAotCi1wcml2YXRlIGZpbmFsIGxvbmcgbUxlbmd0aAotCi1wcml2YXRlIGZpbmFsIGxvbmcgbVN0YXJ0T2Zmc2V0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcgotbG9uZwotbG9uZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY2xvc2UoKQotCi1wdWJsaWMgamF2YS5pby5GaWxlRGVzY3JpcHRvciBnZXRGaWxlRGVzY3JpcHRvcigpCi0KLXB1YmxpYyBsb25nIGdldExlbmd0aCgpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yIGdldFBhcmNlbEZpbGVEZXNjcmlwdG9yKCkKLQotcHVibGljIGxvbmcgZ2V0U3RhcnRPZmZzZXQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9NDEwNCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvcmVzL0Fzc2V0TWFuYWdlcjsgKQotIGNsYXNzIGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRNYW5hZ2VyJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE3IG5hbWUgPUFzc2V0SW5wdXRTdHJlYW0gKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9yZXMvQXNzZXRNYW5hZ2VyOyApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldE1hbmFnZXIkQXNzZXRJbnB1dFN0cmVhbSBleHRlbmRzIGphdmEuaW8uSW5wdXRTdHJlYW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBpbnQgbUFzc2V0Ci0KLXByaXZhdGUgbG9uZyBtTGVuZ3RoCi0KLXByaXZhdGUgbG9uZyBtTWFya1BvcwotCi1maW5hbCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0TWFuYWdlciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldE1hbmFnZXIKLWludCkKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldE1hbmFnZXIKLWludAotYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldE1hbmFnZXIkMSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIGludCBhdmFpbGFibGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgdm9pZCBjbG9zZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9UaHJvd2FibGU7ICkKLXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkKLQotcHVibGljIGZpbmFsIGludCBnZXRBc3NldEludCgpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIG1hcmsoCi1pbnQpCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgaW50IHJlYWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgaW50IHJlYWQoCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBpbnQgcmVhZCgKLWJ5dGVbXQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCB2b2lkIHJlc2V0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIGxvbmcgc2tpcCgKLWxvbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3Jlcy9Bc3NldE1hbmFnZXIkMTtMYW5kcm9pZC9jb250ZW50L3Jlcy9Bc3NldE1hbmFnZXIkQXNzZXRJbnB1dFN0cmVhbTsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRNYW5hZ2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ0NFU1NfQlVGRkVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDQ0VTU19SQU5ET00KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNDRVNTX1NUUkVBTUlORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ0NFU1NfVU5LTk9XTgotCi1zdGF0aWMgZmluYWwgaW50IFNUWUxFX0FTU0VUX0NPT0tJRQotCi1zdGF0aWMgZmluYWwgaW50IFNUWUxFX0NIQU5HSU5HX0NPTkZJR1VSQVRJT05TCi0KLXN0YXRpYyBmaW5hbCBpbnQgU1RZTEVfREFUQQotCi1zdGF0aWMgZmluYWwgaW50IFNUWUxFX05VTV9FTlRSSUVTCi0KLXN0YXRpYyBmaW5hbCBpbnQgU1RZTEVfUkVTT1VSQ0VfSUQKLQotc3RhdGljIGZpbmFsIGludCBTVFlMRV9UWVBFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEFHCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gbG9jYWxMT0dWCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBtT2Zmc2V0cwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuT2JqZWN0IG1TeW5jCi0KLXByaXZhdGUgc3RhdGljIGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRNYW5hZ2VyIG1TeXN0ZW0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYW5kcm9pZC51dGlsLlR5cGVkVmFsdWUgbVZhbHVlCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtQXBwTmFtZQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbUFzc2V0RGlyCi0KLXByaXZhdGUgaW50IG1OdW1SZWZzCi0KLXByaXZhdGUgaW50IG1PYmplY3QKLQotcHJpdmF0ZSBib29sZWFuIG1PcGVuCi0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LnJlcy5TdHJpbmdCbG9ja1tdIG1TdHJpbmdCbG9ja3MKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1ib29sZWFuKQotCi1zdGF0aWMgbG9uZyBhY2Nlc3MkMTAwKAotYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldE1hbmFnZXIKLWludCkKLQotc3RhdGljIGludCBhY2Nlc3MkMjAwKAotYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldE1hbmFnZXIKLWludCkKLQotc3RhdGljIGxvbmcgYWNjZXNzJDMwMCgKLWFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRNYW5hZ2VyCi1pbnQpCi0KLXN0YXRpYyBqYXZhLmxhbmcuT2JqZWN0IGFjY2VzcyQ0MDAoKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkNTAwKAotYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldE1hbmFnZXIKLWludCkKLQotc3RhdGljIHZvaWQgYWNjZXNzJDYwMCgKLWFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRNYW5hZ2VyKQotCi1zdGF0aWMgbG9uZyBhY2Nlc3MkNzAwKAotYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldE1hbmFnZXIKLWludAotbG9uZwotaW50KQotCi1zdGF0aWMgaW50IGFjY2VzcyQ4MDAoCi1hbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0TWFuYWdlcgotaW50Ci1ieXRlW10KLWludAotaW50KQotCi1zdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gYXBwbHlTdHlsZSgKLWludAotaW50Ci1pbnQKLWludAotaW50W10KLWludFtdCi1pbnRbXSkKLQotc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGFwcGx5VGhlbWVTdHlsZSgKLWludAotaW50Ci1ib29sZWFuKQotCi1zdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgY29weVRoZW1lKAotaW50Ci1pbnQpCi0KLXByaXZhdGUgZmluYWwgdm9pZCBkZWNSZWZzTG9ja2VkKCkKLQotcHJpdmF0ZSBmaW5hbCBuYXRpdmUgdm9pZCBkZWxldGVUaGVtZSgKLWludCkKLQotcHJpdmF0ZSBmaW5hbCBuYXRpdmUgdm9pZCBkZXN0cm95KCkKLQotcHJpdmF0ZSBmaW5hbCBuYXRpdmUgdm9pZCBkZXN0cm95QXNzZXQoCi1pbnQpCi0KLXN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBkdW1wVGhlbWUoCi1pbnQKLWludAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBlbnN1cmVTeXN0ZW1Bc3NldHMoKQotCi1wcml2YXRlIGZpbmFsIG5hdGl2ZSBpbnRbXSBnZXRBcnJheVN0cmluZ0luZm8oCi1pbnQpCi0KLXByaXZhdGUgZmluYWwgbmF0aXZlIGphdmEubGFuZy5TdHJpbmdbXSBnZXRBcnJheVN0cmluZ1Jlc291cmNlKAotaW50KQotCi1wcml2YXRlIGZpbmFsIG5hdGl2ZSBsb25nIGdldEFzc2V0TGVuZ3RoKAotaW50KQotCi1wcml2YXRlIGZpbmFsIG5hdGl2ZSBsb25nIGdldEFzc2V0UmVtYWluaW5nTGVuZ3RoKAotaW50KQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2V0R2xvYmFsQXNzZXRDb3VudCgpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBnZXRHbG9iYWxBc3NldE1hbmFnZXJDb3VudCgpCi0KLXByaXZhdGUgZmluYWwgbmF0aXZlIGludCBnZXROYXRpdmVTdHJpbmdCbG9jaygKLWludCkKLQotcHJpdmF0ZSBmaW5hbCBuYXRpdmUgaW50IGdldFN0cmluZ0Jsb2NrQ291bnQoKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRNYW5hZ2VyIGdldFN5c3RlbSgpCi0KLXByaXZhdGUgZmluYWwgbmF0aXZlIHZvaWQgaW5pdCgpCi0KLXByaXZhdGUgZmluYWwgbmF0aXZlIGludCBsb2FkUmVzb3VyY2VCYWdWYWx1ZSgKLWludAotaW50Ci1hbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZQotYm9vbGVhbikKLQotcHJpdmF0ZSBmaW5hbCBuYXRpdmUgaW50IGxvYWRSZXNvdXJjZVZhbHVlKAotaW50Ci1hbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZQotYm9vbGVhbikKLQotc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgbG9hZFRoZW1lQXR0cmlidXRlVmFsdWUoCi1pbnQKLWludAotYW5kcm9pZC51dGlsLlR5cGVkVmFsdWUKLWJvb2xlYW4pCi0KLXByaXZhdGUgZmluYWwgdm9pZCBtYWtlU3RyaW5nQmxvY2tzKAotYm9vbGVhbikKLQotcHJpdmF0ZSBmaW5hbCBuYXRpdmUgaW50IG5ld1RoZW1lKCkKLQotcHJpdmF0ZSBmaW5hbCBuYXRpdmUgaW50IG9wZW5Bc3NldCgKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBmaW5hbCBuYXRpdmUgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciBvcGVuQXNzZXRGZCgKLWphdmEubGFuZy5TdHJpbmcKLWxvbmdbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBuYXRpdmUgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciBvcGVuTm9uQXNzZXRGZE5hdGl2ZSgKLWludAotamF2YS5sYW5nLlN0cmluZwotbG9uZ1tdKQotCi1wcml2YXRlIGZpbmFsIG5hdGl2ZSBpbnQgb3Blbk5vbkFzc2V0TmF0aXZlKAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXByaXZhdGUgZmluYWwgbmF0aXZlIGludCBvcGVuWG1sQXNzZXROYXRpdmUoCi1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgZmluYWwgbmF0aXZlIGludCByZWFkQXNzZXQoCi1pbnQKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLXByaXZhdGUgZmluYWwgbmF0aXZlIGludCByZWFkQXNzZXRDaGFyKAotaW50KQotCi1wcml2YXRlIGZpbmFsIG5hdGl2ZSBsb25nIHNlZWtBc3NldCgKLWludAotbG9uZwotaW50KQotCi1wdWJsaWMgZmluYWwgbmF0aXZlIGludCBhZGRBc3NldFBhdGgoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBjbG9zZSgpCi0KLWZpbmFsIGludCBjcmVhdGVUaGVtZSgpCi0KLWZpbmFsIHZvaWQgZW5zdXJlU3RyaW5nQmxvY2tzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL1Rocm93YWJsZTsgKQotcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKQotCi1maW5hbCBuYXRpdmUgaW50W10gZ2V0QXJyYXlJbnRSZXNvdXJjZSgKLWludCkKLQotZmluYWwgbmF0aXZlIGludCBnZXRBcnJheVNpemUoCi1pbnQpCi0KLXB1YmxpYyBmaW5hbCBuYXRpdmUgamF2YS5sYW5nLlN0cmluZyBnZXRDb29raWVOYW1lKAotaW50KQotCi1wdWJsaWMgZmluYWwgbmF0aXZlIGphdmEubGFuZy5TdHJpbmdbXSBnZXRMb2NhbGVzKCkKLQotZmluYWwgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBnZXRQb29sZWRTdHJpbmcoCi1pbnQKLWludCkKLQotZmluYWwgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBnZXRSZXNvdXJjZUJhZ1RleHQoCi1pbnQKLWludCkKLQotZmluYWwgbmF0aXZlIGphdmEubGFuZy5TdHJpbmcgZ2V0UmVzb3VyY2VFbnRyeU5hbWUoCi1pbnQpCi0KLWZpbmFsIG5hdGl2ZSBpbnQgZ2V0UmVzb3VyY2VJZGVudGlmaWVyKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotZmluYWwgbmF0aXZlIGphdmEubGFuZy5TdHJpbmcgZ2V0UmVzb3VyY2VOYW1lKAotaW50KQotCi1maW5hbCBuYXRpdmUgamF2YS5sYW5nLlN0cmluZyBnZXRSZXNvdXJjZVBhY2thZ2VOYW1lKAotaW50KQotCi1maW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0UmVzb3VyY2VTdHJpbmdBcnJheSgKLWludCkKLQotZmluYWwgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBnZXRSZXNvdXJjZVRleHQoCi1pbnQpCi0KLWZpbmFsIGphdmEubGFuZy5DaGFyU2VxdWVuY2VbXSBnZXRSZXNvdXJjZVRleHRBcnJheSgKLWludCkKLQotZmluYWwgbmF0aXZlIGphdmEubGFuZy5TdHJpbmcgZ2V0UmVzb3VyY2VUeXBlTmFtZSgKLWludCkKLQotZmluYWwgYm9vbGVhbiBnZXRSZXNvdXJjZVZhbHVlKAotaW50Ci1hbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZQotYm9vbGVhbikKLQotZmluYWwgYm9vbGVhbiBnZXRUaGVtZVZhbHVlKAotaW50Ci1pbnQKLWFuZHJvaWQudXRpbC5UeXBlZFZhbHVlCi1ib29sZWFuKQotCi1wdWJsaWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gaXNVcFRvRGF0ZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBuYXRpdmUgamF2YS5sYW5nLlN0cmluZ1tdIGxpc3QoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgamF2YS5pby5JbnB1dFN0cmVhbSBvcGVuKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIGphdmEuaW8uSW5wdXRTdHJlYW0gb3BlbigKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRGaWxlRGVzY3JpcHRvciBvcGVuRmQoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgamF2YS5pby5JbnB1dFN0cmVhbSBvcGVuTm9uQXNzZXQoCi1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBqYXZhLmlvLklucHV0U3RyZWFtIG9wZW5Ob25Bc3NldCgKLWludAotamF2YS5sYW5nLlN0cmluZwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgamF2YS5pby5JbnB1dFN0cmVhbSBvcGVuTm9uQXNzZXQoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgamF2YS5pby5JbnB1dFN0cmVhbSBvcGVuTm9uQXNzZXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0RmlsZURlc2NyaXB0b3Igb3Blbk5vbkFzc2V0RmQoCi1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0RmlsZURlc2NyaXB0b3Igb3Blbk5vbkFzc2V0RmQoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1maW5hbCBhbmRyb2lkLmNvbnRlbnQucmVzLlhtbEJsb2NrIG9wZW5YbWxCbG9ja0Fzc2V0KAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1maW5hbCBhbmRyb2lkLmNvbnRlbnQucmVzLlhtbEJsb2NrIG9wZW5YbWxCbG9ja0Fzc2V0KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIGFuZHJvaWQuY29udGVudC5yZXMuWG1sUmVzb3VyY2VQYXJzZXIgb3BlblhtbFJlc291cmNlUGFyc2VyKAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgYW5kcm9pZC5jb250ZW50LnJlcy5YbWxSZXNvdXJjZVBhcnNlciBvcGVuWG1sUmVzb3VyY2VQYXJzZXIoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1maW5hbCB2b2lkIHJlbGVhc2VUaGVtZSgKLWludCkKLQotZmluYWwgbmF0aXZlIGludCByZXRyaWV2ZUFycmF5KAotaW50Ci1pbnRbXSkKLQotZmluYWwgbmF0aXZlIGJvb2xlYW4gcmV0cmlldmVBdHRyaWJ1dGVzKAotaW50Ci1pbnRbXQotaW50W10KLWludFtdKQotCi1wdWJsaWMgZmluYWwgbmF0aXZlIHZvaWQgc2V0Q29uZmlndXJhdGlvbigKLWludAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgZmluYWwgbmF0aXZlIHZvaWQgc2V0TG9jYWxlKAotamF2YS5sYW5nLlN0cmluZykKLQotIHZvaWQgeG1sQmxvY2tHb25lKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExhbmRyb2lkL2NvbnRlbnQvcmVzL0NvbG9yU3RhdGVMaXN0Oz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvcmVzL0NvbG9yU3RhdGVMaXN0OyApCi1maW5hbCBjbGFzcyBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbG9yU3RhdGVMaXN0JDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LnJlcy5Db2xvclN0YXRlTGlzdCBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5yZXMuQ29sb3JTdGF0ZUxpc3RbXSBuZXdBcnJheSgKLWludCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3RbXSBuZXdBcnJheSgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbG9yU3RhdGVMaXN0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC9jb250ZW50L3Jlcy9Db2xvclN0YXRlTGlzdDs+OyApCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yIENSRUFUT1IKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W11bXSBFTVBUWQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxhbmRyb2lkL3V0aWwvU3BhcnNlQXJyYXk8TGphdmEvbGFuZy9yZWYvV2Vha1JlZmVyZW5jZTxMYW5kcm9pZC9jb250ZW50L3Jlcy9Db2xvclN0YXRlTGlzdDs+Oz47ICkKLXByaXZhdGUgc3RhdGljIGZpbmFsIGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheSBzQ2FjaGUKLQotcHJpdmF0ZSBpbnRbXSBtQ29sb3JzCi0KLXByaXZhdGUgaW50IG1EZWZhdWx0Q29sb3IKLQotcHJpdmF0ZSBpbnRbXVtdIG1TdGF0ZVNwZWNzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50W11bXQotaW50W10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5jb250ZW50LnJlcy5Db2xvclN0YXRlTGlzdCBjcmVhdGVGcm9tWG1sKAotYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMKLW9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgc3RhdGljIGFuZHJvaWQuY29udGVudC5yZXMuQ29sb3JTdGF0ZUxpc3QgY3JlYXRlRnJvbVhtbElubmVyKAotYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMKLW9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXIKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCBpbmZsYXRlKAotYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMKLW9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXIKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5jb250ZW50LnJlcy5Db2xvclN0YXRlTGlzdCB2YWx1ZU9mKAotaW50KQotCi1wdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKQotCi1wdWJsaWMgaW50IGdldENvbG9yRm9yU3RhdGUoCi1pbnRbXQotaW50KQotCi1wdWJsaWMgaW50IGdldERlZmF1bHRDb2xvcigpCi0KLXB1YmxpYyBib29sZWFuIGlzU3RhdGVmdWwoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbG9yU3RhdGVMaXN0IHdpdGhBbHBoYSgKLWludCkKLQotcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC9jb250ZW50L3Jlcy9Db25maWd1cmF0aW9uOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvcmVzL0NvbmZpZ3VyYXRpb247ICkKLWZpbmFsIGNsYXNzIGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbiQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbiBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbltdIG5ld0FycmF5KAotaW50KQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdFtdIG5ld0FycmF5KAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMYW5kcm9pZC9vcy9QYXJjZWxhYmxlO0xqYXZhL2xhbmcvQ29tcGFyYWJsZTxMYW5kcm9pZC9jb250ZW50L3Jlcy9Db25maWd1cmF0aW9uOz47ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLCBqYXZhLmxhbmcuQ29tcGFyYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC9jb250ZW50L3Jlcy9Db25maWd1cmF0aW9uOz47ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IgQ1JFQVRPUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlCT0FSREhJRERFTl9OTwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlCT0FSREhJRERFTl9VTkRFRklORUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQk9BUkRISURERU5fWUVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUJPQVJEXzEyS0VZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUJPQVJEX05PS0VZUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlCT0FSRF9RV0VSVFkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQk9BUkRfVU5ERUZJTkVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5BVklHQVRJT05fRFBBRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBOQVZJR0FUSU9OX05PTkFWCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5BVklHQVRJT05fVFJBQ0tCQUxMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5BVklHQVRJT05fVU5ERUZJTkVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5BVklHQVRJT05fV0hFRUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1JJRU5UQVRJT05fTEFORFNDQVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9SSUVOVEFUSU9OX1BPUlRSQUlUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9SSUVOVEFUSU9OX1NRVUFSRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUklFTlRBVElPTl9VTkRFRklORUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE9VQ0hTQ1JFRU5fRklOR0VSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPVUNIU0NSRUVOX05PVE9VQ0gKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE9VQ0hTQ1JFRU5fU1RZTFVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPVUNIU0NSRUVOX1VOREVGSU5FRAotCi1wdWJsaWMgZmxvYXQgZm9udFNjYWxlCi0KLXB1YmxpYyBpbnQga2V5Ym9hcmQKLQotcHVibGljIGludCBrZXlib2FyZEhpZGRlbgotCi1wdWJsaWMgamF2YS51dGlsLkxvY2FsZSBsb2NhbGUKLQotcHVibGljIGludCBtY2MKLQotcHVibGljIGludCBtbmMKLQotcHVibGljIGludCBuYXZpZ2F0aW9uCi0KLXB1YmxpYyBpbnQgb3JpZW50YXRpb24KLQotcHVibGljIGludCB0b3VjaHNjcmVlbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuUGFyY2VsCi1hbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb24kMSkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIG5lZWROZXdSZXNvdXJjZXMoCi1pbnQKLWludCkKLQotcHVibGljIGludCBjb21wYXJlVG8oCi1hbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb24pCi0KLXB1YmxpYyB2b2xhdGlsZSBpbnQgY29tcGFyZVRvKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkKLQotcHVibGljIGludCBkaWZmKAotYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1hbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb24pCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotQGphdmEubGFuZy5EZXByZWNhdGVkCi1wdWJsaWMgdm9pZCBtYWtlRGVmYXVsdCgpCi0KLXB1YmxpYyB2b2lkIHNldFRvRGVmYXVsdHMoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLXB1YmxpYyBpbnQgdXBkYXRlRnJvbSgKLWFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbikKLQotcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9yZXMvUGx1cmFsUnVsZXM7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9NDEwNCBuYW1lID1udWxsICkKLSBjbGFzcyBhbmRyb2lkLmNvbnRlbnQucmVzLlBsdXJhbFJ1bGVzJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvcmVzL1BsdXJhbFJ1bGVzJDE7TGFuZHJvaWQvY29udGVudC9yZXMvUGx1cmFsUnVsZXMkZW47TGFuZHJvaWQvY29udGVudC9yZXMvUGx1cmFsUnVsZXMkY3M7ICkKLWFic3RyYWN0IGNsYXNzIGFuZHJvaWQuY29udGVudC5yZXMuUGx1cmFsUnVsZXMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBmaW5hbCBpbnQgSURfT1RIRVIKLQotc3RhdGljIGZpbmFsIGludCBRVUFOVElUWV9GRVcKLQotc3RhdGljIGZpbmFsIGludCBRVUFOVElUWV9NQU5ZCi0KLXN0YXRpYyBmaW5hbCBpbnQgUVVBTlRJVFlfT05FCi0KLXN0YXRpYyBmaW5hbCBpbnQgUVVBTlRJVFlfT1RIRVIKLQotc3RhdGljIGZpbmFsIGludCBRVUFOVElUWV9UV08KLQotc3RhdGljIGZpbmFsIGludCBRVUFOVElUWV9aRVJPCi0KLXByaXZhdGUgc3RhdGljIGFuZHJvaWQuY29udGVudC5yZXMuUGx1cmFsUnVsZXMgY3MKLQotcHJpdmF0ZSBzdGF0aWMgYW5kcm9pZC5jb250ZW50LnJlcy5QbHVyYWxSdWxlcyBlbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXN0YXRpYyBmaW5hbCBpbnQgYXR0ckZvclF1YW50aXR5KAotaW50KQotCi1zdGF0aWMgZmluYWwgYW5kcm9pZC5jb250ZW50LnJlcy5QbHVyYWxSdWxlcyBydWxlRm9yTG9jYWxlKAotamF2YS51dGlsLkxvY2FsZSkKLQotc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgc3RyaW5nRm9yUXVhbnRpdHkoCi1pbnQpCi0KLWZpbmFsIGludCBhdHRyRm9yTnVtYmVyKAotaW50KQotCi1hYnN0cmFjdCBpbnQgcXVhbnRpdHlGb3JOdW1iZXIoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9yZXMvUGx1cmFsUnVsZXM7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9Y3MgKQotIGNsYXNzIGFuZHJvaWQuY29udGVudC5yZXMuUGx1cmFsUnVsZXMkY3MgZXh0ZW5kcyBhbmRyb2lkLmNvbnRlbnQucmVzLlBsdXJhbFJ1bGVzCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5yZXMuUGx1cmFsUnVsZXMkMSkKLQotIGludCBxdWFudGl0eUZvck51bWJlcigKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPWVuICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvcmVzL1BsdXJhbFJ1bGVzOyApCi0gY2xhc3MgYW5kcm9pZC5jb250ZW50LnJlcy5QbHVyYWxSdWxlcyRlbiBleHRlbmRzIGFuZHJvaWQuY29udGVudC5yZXMuUGx1cmFsUnVsZXMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LnJlcy5QbHVyYWxSdWxlcyQxKQotCi0gaW50IHF1YW50aXR5Rm9yTnVtYmVyKAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvcmVzL1Jlc291cmNlczsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPU5vdEZvdW5kRXhjZXB0aW9uICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcyROb3RGb3VuZEV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3Jlcy9SZXNvdXJjZXM7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTcgbmFtZSA9VGhlbWUgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzJFRoZW1lIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRNYW5hZ2VyIG1Bc3NldHMKLQotcHJpdmF0ZSBmaW5hbCBpbnQgbVRoZW1lCi0KLWZpbmFsIGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzKQotCi1wdWJsaWMgdm9pZCBhcHBseVN0eWxlKAotaW50Ci1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBkdW1wKAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvVGhyb3dhYmxlOyApCi1wcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9yZXMvUmVzb3VyY2VzJE5vdEZvdW5kRXhjZXB0aW9uOyApCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5IG9idGFpblN0eWxlZEF0dHJpYnV0ZXMoCi1pbnQKLWludFtdKQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5IG9idGFpblN0eWxlZEF0dHJpYnV0ZXMoCi1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ci1pbnRbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXkgb2J0YWluU3R5bGVkQXR0cmlidXRlcygKLWludFtdKQotCi1wdWJsaWMgYm9vbGVhbiByZXNvbHZlQXR0cmlidXRlKAotaW50Ci1hbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZQotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0VG8oCi1hbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcyRUaGVtZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvcmVzL1Jlc291cmNlcyRUaGVtZTtMYW5kcm9pZC9jb250ZW50L3Jlcy9SZXNvdXJjZXMkTm90Rm91bmRFeGNlcHRpb247ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19DT05GSUcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19MT0FECi0KLXN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRBRwotCi1wcml2YXRlIHN0YXRpYyBib29sZWFuIG1QcmVsb2FkZWQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MYW5kcm9pZC91dGlsL1NwYXJzZUFycmF5PExhbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0RyYXdhYmxlJENvbnN0YW50U3RhdGU7PjsgKQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5IG1QcmVsb2FkZWREcmF3YWJsZXMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLk9iamVjdCBtU3luYwotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcyBtU3lzdGVtCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBzU2RrVmVyc2lvbgotCi1maW5hbCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0TWFuYWdlciBtQXNzZXRzCi0KLSBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXkgbUNhY2hlZFN0eWxlZEF0dHJpYnV0ZXMKLQotcHJpdmF0ZSBmaW5hbCBpbnRbXSBtQ2FjaGVkWG1sQmxvY2tJZHMKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLmNvbnRlbnQucmVzLlhtbEJsb2NrW10gbUNhY2hlZFhtbEJsb2NrcwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxhbmRyb2lkL3V0aWwvU3BhcnNlQXJyYXk8TGphdmEvbGFuZy9yZWYvV2Vha1JlZmVyZW5jZTxMYW5kcm9pZC9jb250ZW50L3Jlcy9Db2xvclN0YXRlTGlzdDs+Oz47ICkKLXByaXZhdGUgZmluYWwgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5IG1Db2xvclN0YXRlTGlzdENhY2hlCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uIG1Db25maWd1cmF0aW9uCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGFuZHJvaWQvdXRpbC9TcGFyc2VBcnJheTxMamF2YS9sYW5nL3JlZi9XZWFrUmVmZXJlbmNlPExhbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0RyYXdhYmxlJENvbnN0YW50U3RhdGU7Pjs+OyApCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheSBtRHJhd2FibGVDYWNoZQotCi1wcml2YXRlIGludCBtTGFzdENhY2hlZFhtbEJsb2NrSW5kZXgKLQotZmluYWwgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzIG1NZXRyaWNzCi0KLSBhbmRyb2lkLmNvbnRlbnQucmVzLlBsdXJhbFJ1bGVzIG1QbHVyYWxSdWxlCi0KLXByaXZhdGUgYm9vbGVhbiBtUHJlbG9hZGluZwotCi1maW5hbCBhbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZSBtVG1wVmFsdWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0TWFuYWdlcgotYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzCi1hbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb24pCi0KLXN0YXRpYyBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXkgYWNjZXNzJDAwMCgKLWFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzCi1pbnQpCi0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LnJlcy5Db2xvclN0YXRlTGlzdCBnZXRDYWNoZWRDb2xvclN0YXRlTGlzdCgKLWludCkKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIGdldENhY2hlZERyYXdhYmxlKAotaW50KQotCi1wcml2YXRlIGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheSBnZXRDYWNoZWRTdHlsZWRBdHRyaWJ1dGVzKAotaW50KQotCi1wcml2YXRlIGFuZHJvaWQuY29udGVudC5yZXMuUGx1cmFsUnVsZXMgZ2V0UGx1cmFsUnVsZSgpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMgZ2V0U3lzdGVtKCkKLQotcHVibGljIGZpbmFsIHZvaWQgZmluaXNoUHJlbG9hZGluZygpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIGZsdXNoTGF5b3V0Q2FjaGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvcmVzL1Jlc291cmNlcyROb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHVibGljIGFuZHJvaWQuY29udGVudC5yZXMuWG1sUmVzb3VyY2VQYXJzZXIgZ2V0QW5pbWF0aW9uKAotaW50KQotCi1wdWJsaWMgZmluYWwgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldE1hbmFnZXIgZ2V0QXNzZXRzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3Jlcy9SZXNvdXJjZXMkTm90Rm91bmRFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgZ2V0Q29sb3IoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9yZXMvUmVzb3VyY2VzJE5vdEZvdW5kRXhjZXB0aW9uOyApCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LnJlcy5Db2xvclN0YXRlTGlzdCBnZXRDb2xvclN0YXRlTGlzdCgKLWludCkKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbiBnZXRDb25maWd1cmF0aW9uKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3Jlcy9SZXNvdXJjZXMkTm90Rm91bmRFeGNlcHRpb247ICkKLXB1YmxpYyBmbG9hdCBnZXREaW1lbnNpb24oCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9yZXMvUmVzb3VyY2VzJE5vdEZvdW5kRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGdldERpbWVuc2lvblBpeGVsT2Zmc2V0KAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvcmVzL1Jlc291cmNlcyROb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXREaW1lbnNpb25QaXhlbFNpemUoCi1pbnQpCi0KLXB1YmxpYyBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3MgZ2V0RGlzcGxheU1ldHJpY3MoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvcmVzL1Jlc291cmNlcyROb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHVibGljIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgZ2V0RHJhd2FibGUoCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0SWRlbnRpZmllcigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9yZXMvUmVzb3VyY2VzJE5vdEZvdW5kRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50W10gZ2V0SW50QXJyYXkoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9yZXMvUmVzb3VyY2VzJE5vdEZvdW5kRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGdldEludGVnZXIoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9yZXMvUmVzb3VyY2VzJE5vdEZvdW5kRXhjZXB0aW9uOyApCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LnJlcy5YbWxSZXNvdXJjZVBhcnNlciBnZXRMYXlvdXQoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9yZXMvUmVzb3VyY2VzJE5vdEZvdW5kRXhjZXB0aW9uOyApCi1wdWJsaWMgYW5kcm9pZC5ncmFwaGljcy5Nb3ZpZSBnZXRNb3ZpZSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3Jlcy9SZXNvdXJjZXMkTm90Rm91bmRFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFF1YW50aXR5U3RyaW5nKAotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9yZXMvUmVzb3VyY2VzJE5vdEZvdW5kRXhjZXB0aW9uOyApCi1wdWJsaWMgdHJhbnNpZW50IGphdmEubGFuZy5TdHJpbmcgZ2V0UXVhbnRpdHlTdHJpbmcoCi1pbnQKLWludAotamF2YS5sYW5nLk9iamVjdFtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvcmVzL1Jlc291cmNlcyROb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgZ2V0UXVhbnRpdHlUZXh0KAotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9yZXMvUmVzb3VyY2VzJE5vdEZvdW5kRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRSZXNvdXJjZUVudHJ5TmFtZSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3Jlcy9SZXNvdXJjZXMkTm90Rm91bmRFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFJlc291cmNlTmFtZSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3Jlcy9SZXNvdXJjZXMkTm90Rm91bmRFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFJlc291cmNlUGFja2FnZU5hbWUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9yZXMvUmVzb3VyY2VzJE5vdEZvdW5kRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRSZXNvdXJjZVR5cGVOYW1lKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvcmVzL1Jlc291cmNlcyROb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvcmVzL1Jlc291cmNlcyROb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHVibGljIHRyYW5zaWVudCBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygKLWludAotamF2YS5sYW5nLk9iamVjdFtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvcmVzL1Jlc291cmNlcyROb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBnZXRTdHJpbmdBcnJheSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3Jlcy9SZXNvdXJjZXMkTm90Rm91bmRFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIGdldFRleHQoCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIGdldFRleHQoCi1pbnQKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9yZXMvUmVzb3VyY2VzJE5vdEZvdW5kRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZVtdIGdldFRleHRBcnJheSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3Jlcy9SZXNvdXJjZXMkTm90Rm91bmRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGdldFZhbHVlKAotaW50Ci1hbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZQotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3Jlcy9SZXNvdXJjZXMkTm90Rm91bmRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGdldFZhbHVlKAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC51dGlsLlR5cGVkVmFsdWUKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9yZXMvUmVzb3VyY2VzJE5vdEZvdW5kRXhjZXB0aW9uOyApCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LnJlcy5YbWxSZXNvdXJjZVBhcnNlciBnZXRYbWwoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9yZXMvUmVzb3VyY2VzJE5vdEZvdW5kRXhjZXB0aW9uOyApCi0gYW5kcm9pZC5jb250ZW50LnJlcy5Db2xvclN0YXRlTGlzdCBsb2FkQ29sb3JTdGF0ZUxpc3QoCi1hbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZQotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvcmVzL1Jlc291cmNlcyROb3RGb3VuZEV4Y2VwdGlvbjsgKQotIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgbG9hZERyYXdhYmxlKAotYW5kcm9pZC51dGlsLlR5cGVkVmFsdWUKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3Jlcy9SZXNvdXJjZXMkTm90Rm91bmRFeGNlcHRpb247ICkKLSBhbmRyb2lkLmNvbnRlbnQucmVzLlhtbFJlc291cmNlUGFyc2VyIGxvYWRYbWxSZXNvdXJjZVBhcnNlcigKLWludAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3Jlcy9SZXNvdXJjZXMkTm90Rm91bmRFeGNlcHRpb247ICkKLSBhbmRyb2lkLmNvbnRlbnQucmVzLlhtbFJlc291cmNlUGFyc2VyIGxvYWRYbWxSZXNvdXJjZVBhcnNlcigKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgZmluYWwgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMkVGhlbWUgbmV3VGhlbWUoKQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5IG9idGFpbkF0dHJpYnV0ZXMoCi1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ci1pbnRbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3Jlcy9SZXNvdXJjZXMkTm90Rm91bmRFeGNlcHRpb247ICkKLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXkgb2J0YWluVHlwZWRBcnJheSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3Jlcy9SZXNvdXJjZXMkTm90Rm91bmRFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmlvLklucHV0U3RyZWFtIG9wZW5SYXdSZXNvdXJjZSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3Jlcy9SZXNvdXJjZXMkTm90Rm91bmRFeGNlcHRpb247ICkKLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0RmlsZURlc2NyaXB0b3Igb3BlblJhd1Jlc291cmNlRmQoCi1pbnQpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHN0YXJ0UHJlbG9hZGluZygpCi0KLXB1YmxpYyB2b2lkIHVwZGF0ZUNvbmZpZ3VyYXRpb24oCi1hbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb24KLWFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljcykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC50ZXh0LnN0eWxlLlBhcmFncmFwaFN0eWxlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQudGV4dC5zdHlsZS5XcmFwVG9nZXRoZXJTcGFuIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQudGV4dC5zdHlsZS5QYXJhZ3JhcGhTdHlsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQudGV4dC5zdHlsZS5MaW5lSGVpZ2h0U3BhbiBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnRleHQuc3R5bGUuUGFyYWdyYXBoU3R5bGUsIGFuZHJvaWQudGV4dC5zdHlsZS5XcmFwVG9nZXRoZXJTcGFuCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgY2hvb3NlSGVpZ2h0KAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotaW50Ci1pbnQKLWludAotaW50Ci1hbmRyb2lkLmdyYXBoaWNzLlBhaW50JEZvbnRNZXRyaWNzSW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9SGVpZ2h0ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvcmVzL1N0cmluZ0Jsb2NrOyApCi0gY2xhc3MgYW5kcm9pZC5jb250ZW50LnJlcy5TdHJpbmdCbG9jayRIZWlnaHQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC50ZXh0LnN0eWxlLkxpbmVIZWlnaHRTcGFuCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZsb2F0IHNQcm9wb3J0aW9uCi0KLXByaXZhdGUgaW50IG1TaXplCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGNob29zZUhlaWdodCgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWludAotaW50Ci1pbnQKLWludAotYW5kcm9pZC5ncmFwaGljcy5QYWludCRGb250TWV0cmljc0ludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI0IG5hbWUgPVN0eWxlSURzICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvcmVzL1N0cmluZ0Jsb2NrOyApCi1maW5hbCBjbGFzcyBhbmRyb2lkLmNvbnRlbnQucmVzLlN0cmluZ0Jsb2NrJFN0eWxlSURzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGludCBiaWdJZAotCi1wcml2YXRlIGludCBib2xkSWQKLQotcHJpdmF0ZSBpbnQgaXRhbGljSWQKLQotcHJpdmF0ZSBpbnQgbGlzdEl0ZW1JZAotCi1wcml2YXRlIGludCBzbWFsbElkCi0KLXByaXZhdGUgaW50IHN0cmlrZUlkCi0KLXByaXZhdGUgaW50IHN1YklkCi0KLXByaXZhdGUgaW50IHN1cElkCi0KLXByaXZhdGUgaW50IHR0SWQKLQotcHJpdmF0ZSBpbnQgdW5kZXJsaW5lSWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1zdGF0aWMgaW50IGFjY2VzcyQwMDAoCi1hbmRyb2lkLmNvbnRlbnQucmVzLlN0cmluZ0Jsb2NrJFN0eWxlSURzKQotCi1zdGF0aWMgaW50IGFjY2VzcyQwMDIoCi1hbmRyb2lkLmNvbnRlbnQucmVzLlN0cmluZ0Jsb2NrJFN0eWxlSURzCi1pbnQpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDEwMCgKLWFuZHJvaWQuY29udGVudC5yZXMuU3RyaW5nQmxvY2skU3R5bGVJRHMpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDEwMigKLWFuZHJvaWQuY29udGVudC5yZXMuU3RyaW5nQmxvY2skU3R5bGVJRHMKLWludCkKLQotc3RhdGljIGludCBhY2Nlc3MkMjAwKAotYW5kcm9pZC5jb250ZW50LnJlcy5TdHJpbmdCbG9jayRTdHlsZUlEcykKLQotc3RhdGljIGludCBhY2Nlc3MkMjAyKAotYW5kcm9pZC5jb250ZW50LnJlcy5TdHJpbmdCbG9jayRTdHlsZUlEcwotaW50KQotCi1zdGF0aWMgaW50IGFjY2VzcyQzMDAoCi1hbmRyb2lkLmNvbnRlbnQucmVzLlN0cmluZ0Jsb2NrJFN0eWxlSURzKQotCi1zdGF0aWMgaW50IGFjY2VzcyQzMDIoCi1hbmRyb2lkLmNvbnRlbnQucmVzLlN0cmluZ0Jsb2NrJFN0eWxlSURzCi1pbnQpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDQwMCgKLWFuZHJvaWQuY29udGVudC5yZXMuU3RyaW5nQmxvY2skU3R5bGVJRHMpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDQwMigKLWFuZHJvaWQuY29udGVudC5yZXMuU3RyaW5nQmxvY2skU3R5bGVJRHMKLWludCkKLQotc3RhdGljIGludCBhY2Nlc3MkNTAwKAotYW5kcm9pZC5jb250ZW50LnJlcy5TdHJpbmdCbG9jayRTdHlsZUlEcykKLQotc3RhdGljIGludCBhY2Nlc3MkNTAyKAotYW5kcm9pZC5jb250ZW50LnJlcy5TdHJpbmdCbG9jayRTdHlsZUlEcwotaW50KQotCi1zdGF0aWMgaW50IGFjY2VzcyQ2MDAoCi1hbmRyb2lkLmNvbnRlbnQucmVzLlN0cmluZ0Jsb2NrJFN0eWxlSURzKQotCi1zdGF0aWMgaW50IGFjY2VzcyQ2MDIoCi1hbmRyb2lkLmNvbnRlbnQucmVzLlN0cmluZ0Jsb2NrJFN0eWxlSURzCi1pbnQpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDcwMCgKLWFuZHJvaWQuY29udGVudC5yZXMuU3RyaW5nQmxvY2skU3R5bGVJRHMpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDcwMigKLWFuZHJvaWQuY29udGVudC5yZXMuU3RyaW5nQmxvY2skU3R5bGVJRHMKLWludCkKLQotc3RhdGljIGludCBhY2Nlc3MkODAwKAotYW5kcm9pZC5jb250ZW50LnJlcy5TdHJpbmdCbG9jayRTdHlsZUlEcykKLQotc3RhdGljIGludCBhY2Nlc3MkODAyKAotYW5kcm9pZC5jb250ZW50LnJlcy5TdHJpbmdCbG9jayRTdHlsZUlEcwotaW50KQotCi1zdGF0aWMgaW50IGFjY2VzcyQ5MDAoCi1hbmRyb2lkLmNvbnRlbnQucmVzLlN0cmluZ0Jsb2NrJFN0eWxlSURzKQotCi1zdGF0aWMgaW50IGFjY2VzcyQ5MDIoCi1hbmRyb2lkLmNvbnRlbnQucmVzLlN0cmluZ0Jsb2NrJFN0eWxlSURzCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3Jlcy9TdHJpbmdCbG9jayRIZWlnaHQ7TGFuZHJvaWQvY29udGVudC9yZXMvU3RyaW5nQmxvY2skU3R5bGVJRHM7ICkKLWZpbmFsIGNsYXNzIGFuZHJvaWQuY29udGVudC5yZXMuU3RyaW5nQmxvY2sgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEFHCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gbG9jYWxMT0dWCi0KLXByaXZhdGUgZmluYWwgaW50IG1OYXRpdmUKLQotcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Pd25zTmF0aXZlCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGFuZHJvaWQvdXRpbC9TcGFyc2VBcnJheTxMamF2YS9sYW5nL0NoYXJTZXF1ZW5jZTs+OyApCi1wcml2YXRlIGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheSBtU3BhcnNlU3RyaW5ncwotCi1wcml2YXRlIGphdmEubGFuZy5DaGFyU2VxdWVuY2VbXSBtU3RyaW5ncwotCi0gYW5kcm9pZC5jb250ZW50LnJlcy5TdHJpbmdCbG9jayRTdHlsZUlEcyBtU3R5bGVJRHMKLQotcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Vc2VTcGFyc2UKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1pbnQKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWJ5dGVbXQotaW50Ci1pbnQKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWJ5dGVbXQotYm9vbGVhbikKLQotcHJpdmF0ZSBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIGFwcGx5U3R5bGVzKAotamF2YS5sYW5nLlN0cmluZwotaW50W10KLWFuZHJvaWQuY29udGVudC5yZXMuU3RyaW5nQmxvY2skU3R5bGVJRHMpCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgbmF0aXZlQ3JlYXRlKAotYnl0ZVtdCi1pbnQKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgbmF0aXZlRGVzdHJveSgKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBuYXRpdmVHZXRTaXplKAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBuYXRpdmUgamF2YS5sYW5nLlN0cmluZyBuYXRpdmVHZXRTdHJpbmcoCi1pbnQKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbmF0aXZlIGludFtdIG5hdGl2ZUdldFN0eWxlKAotaW50Ci1pbnQpCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgbmF0aXZlSW5kZXhPZlN0cmluZygKLWludAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBzdWJ0YWcoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvVGhyb3dhYmxlOyApCi1wcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIGdldCgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBpbnRbXSBtRGF0YQotCi0gaW50W10gbUluZGljZXMKLQotIGludCBtTGVuZ3RoCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMgbVJlc291cmNlcwotCi0gaW50W10gbVJzcmNzCi0KLXByaXZhdGUgYW5kcm9pZC51dGlsLlR5cGVkVmFsdWUgbVZhbHVlCi0KLSBhbmRyb2lkLmNvbnRlbnQucmVzLlhtbEJsb2NrJFBhcnNlciBtWG1sCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMKLWludFtdCi1pbnRbXQotaW50KQotCi1wcml2YXRlIGJvb2xlYW4gZ2V0VmFsdWVBdCgKLWludAotYW5kcm9pZC51dGlsLlR5cGVkVmFsdWUpCi0KLXByaXZhdGUgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBsb2FkU3RyaW5nVmFsdWVBdCgKLWludCkKLQotcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhbigKLWludAotYm9vbGVhbikKLQotcHVibGljIGludCBnZXRDb2xvcigKLWludAotaW50KQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LnJlcy5Db2xvclN0YXRlTGlzdCBnZXRDb2xvclN0YXRlTGlzdCgKLWludCkKLQotcHVibGljIGZsb2F0IGdldERpbWVuc2lvbigKLWludAotZmxvYXQpCi0KLXB1YmxpYyBpbnQgZ2V0RGltZW5zaW9uUGl4ZWxPZmZzZXQoCi1pbnQKLWludCkKLQotcHVibGljIGludCBnZXREaW1lbnNpb25QaXhlbFNpemUoCi1pbnQKLWludCkKLQotcHVibGljIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgZ2V0RHJhd2FibGUoCi1pbnQpCi0KLXB1YmxpYyBmbG9hdCBnZXRGbG9hdCgKLWludAotZmxvYXQpCi0KLXB1YmxpYyBmbG9hdCBnZXRGcmFjdGlvbigKLWludAotaW50Ci1pbnQKLWZsb2F0KQotCi1wdWJsaWMgaW50IGdldEluZGV4KAotaW50KQotCi1wdWJsaWMgaW50IGdldEluZGV4Q291bnQoKQotCi1wdWJsaWMgaW50IGdldEludCgKLWludAotaW50KQotCi1wdWJsaWMgaW50IGdldEludGVnZXIoCi1pbnQKLWludCkKLQotcHVibGljIGludCBnZXRMYXlvdXREaW1lbnNpb24oCi1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFBvc2l0aW9uRGVzY3JpcHRpb24oKQotCi1wdWJsaWMgaW50IGdldFJlc291cmNlSWQoCi1pbnQKLWludCkKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzIGdldFJlc291cmNlcygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygKLWludCkKLQotcHVibGljIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgZ2V0VGV4dCgKLWludCkKLQotcHVibGljIGphdmEubGFuZy5DaGFyU2VxdWVuY2VbXSBnZXRUZXh0QXJyYXkoCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIGdldFZhbHVlKAotaW50Ci1hbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZSkKLQotcHVibGljIGJvb2xlYW4gaGFzVmFsdWUoCi1pbnQpCi0KLXB1YmxpYyBpbnQgbGVuZ3RoKCkKLQotcHVibGljIGFuZHJvaWQudXRpbC5UeXBlZFZhbHVlIHBlZWtWYWx1ZSgKLWludCkKLQotcHVibGljIHZvaWQgcmVjeWNsZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBnZXRBdHRyaWJ1dGVCb29sZWFuVmFsdWUoCi1pbnQKLWJvb2xlYW4pCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGdldEF0dHJpYnV0ZUJvb2xlYW5WYWx1ZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4pCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0QXR0cmlidXRlQ291bnQoKQotCi1wdWJsaWMgYWJzdHJhY3QgZmxvYXQgZ2V0QXR0cmlidXRlRmxvYXRWYWx1ZSgKLWludAotZmxvYXQpCi0KLXB1YmxpYyBhYnN0cmFjdCBmbG9hdCBnZXRBdHRyaWJ1dGVGbG9hdFZhbHVlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotZmxvYXQpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0QXR0cmlidXRlSW50VmFsdWUoCi1pbnQKLWludCkKLQotcHVibGljIGFic3RyYWN0IGludCBnZXRBdHRyaWJ1dGVJbnRWYWx1ZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIGFic3RyYWN0IGludCBnZXRBdHRyaWJ1dGVMaXN0VmFsdWUoCi1pbnQKLWphdmEubGFuZy5TdHJpbmdbXQotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldEF0dHJpYnV0ZUxpc3RWYWx1ZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmdbXQotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldEF0dHJpYnV0ZU5hbWVSZXNvdXJjZSgKLWludCkKLQotcHVibGljIGFic3RyYWN0IGludCBnZXRBdHRyaWJ1dGVSZXNvdXJjZVZhbHVlKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0QXR0cmlidXRlUmVzb3VyY2VWYWx1ZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIGFic3RyYWN0IGludCBnZXRBdHRyaWJ1dGVVbnNpZ25lZEludFZhbHVlKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0QXR0cmlidXRlVW5zaWduZWRJbnRWYWx1ZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0Q2xhc3NBdHRyaWJ1dGUoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRJZEF0dHJpYnV0ZSgpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0SWRBdHRyaWJ1dGVSZXNvdXJjZVZhbHVlKAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRQb3NpdGlvbkRlc2NyaXB0aW9uKCkKLQotcHVibGljIGFic3RyYWN0IGludCBnZXRTdHlsZUF0dHJpYnV0ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQuY29udGVudC5yZXMuWG1sUmVzb3VyY2VQYXJzZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlciwgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGNsb3NlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3Jlcy9YbWxCbG9jazsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNiBuYW1lID1QYXJzZXIgKQotZmluYWwgY2xhc3MgYW5kcm9pZC5jb250ZW50LnJlcy5YbWxCbG9jayRQYXJzZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5jb250ZW50LnJlcy5YbWxSZXNvdXJjZVBhcnNlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQuY29udGVudC5yZXMuWG1sQmxvY2sgbUJsb2NrCi0KLXByaXZhdGUgYm9vbGVhbiBtRGVjTmV4dERlcHRoCi0KLXByaXZhdGUgaW50IG1EZXB0aAotCi1wcml2YXRlIGludCBtRXZlbnRUeXBlCi0KLSBpbnQgbVBhcnNlU3RhdGUKLQotcHJpdmF0ZSBib29sZWFuIG1TdGFydGVkCi0KLWZpbmFsIGFuZHJvaWQuY29udGVudC5yZXMuWG1sQmxvY2sgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LnJlcy5YbWxCbG9jawotaW50Ci1hbmRyb2lkLmNvbnRlbnQucmVzLlhtbEJsb2NrKQotCi1wdWJsaWMgdm9pZCBjbG9zZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGRlZmluZUVudGl0eVJlcGxhY2VtZW50VGV4dCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9UaHJvd2FibGU7ICkKLXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkKLQotcHVibGljIGJvb2xlYW4gZ2V0QXR0cmlidXRlQm9vbGVhblZhbHVlKAotaW50Ci1ib29sZWFuKQotCi1wdWJsaWMgYm9vbGVhbiBnZXRBdHRyaWJ1dGVCb29sZWFuVmFsdWUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuKQotCi1wdWJsaWMgaW50IGdldEF0dHJpYnV0ZUNvdW50KCkKLQotcHVibGljIGZsb2F0IGdldEF0dHJpYnV0ZUZsb2F0VmFsdWUoCi1pbnQKLWZsb2F0KQotCi1wdWJsaWMgZmxvYXQgZ2V0QXR0cmlidXRlRmxvYXRWYWx1ZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWZsb2F0KQotCi1wdWJsaWMgaW50IGdldEF0dHJpYnV0ZUludFZhbHVlKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0QXR0cmlidXRlSW50VmFsdWUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0QXR0cmlidXRlTGlzdFZhbHVlKAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nW10KLWludCkKLQotcHVibGljIGludCBnZXRBdHRyaWJ1dGVMaXN0VmFsdWUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nW10KLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgKLWludCkKLQotcHVibGljIGludCBnZXRBdHRyaWJ1dGVOYW1lUmVzb3VyY2UoCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWVzcGFjZSgKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QXR0cmlidXRlUHJlZml4KAotaW50KQotCi1wdWJsaWMgaW50IGdldEF0dHJpYnV0ZVJlc291cmNlVmFsdWUoCi1pbnQKLWludCkKLQotcHVibGljIGludCBnZXRBdHRyaWJ1dGVSZXNvdXJjZVZhbHVlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRBdHRyaWJ1dGVUeXBlKAotaW50KQotCi1wdWJsaWMgaW50IGdldEF0dHJpYnV0ZVVuc2lnbmVkSW50VmFsdWUoCi1pbnQKLWludCkKLQotcHVibGljIGludCBnZXRBdHRyaWJ1dGVVbnNpZ25lZEludFZhbHVlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZSgKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRDbGFzc0F0dHJpYnV0ZSgpCi0KLXB1YmxpYyBpbnQgZ2V0Q29sdW1uTnVtYmVyKCkKLQotcHVibGljIGludCBnZXREZXB0aCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgZ2V0RXZlbnRUeXBlKCkKLQotcHVibGljIGJvb2xlYW4gZ2V0RmVhdHVyZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldElkQXR0cmlidXRlKCkKLQotcHVibGljIGludCBnZXRJZEF0dHJpYnV0ZVJlc291cmNlVmFsdWUoCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldElucHV0RW5jb2RpbmcoKQotCi1wdWJsaWMgaW50IGdldExpbmVOdW1iZXIoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXROYW1lKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TmFtZXNwYWNlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TmFtZXNwYWNlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXROYW1lc3BhY2VDb3VudCgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TmFtZXNwYWNlUHJlZml4KAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXROYW1lc3BhY2VVcmkoCi1pbnQpCi0KLWZpbmFsIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgZ2V0UG9vbGVkU3RyaW5nKAotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRQb3NpdGlvbkRlc2NyaXB0aW9uKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UHJlZml4KCkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0UHJvcGVydHkoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgaW50IGdldFN0eWxlQXR0cmlidXRlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VGV4dCgpCi0KLXB1YmxpYyBjaGFyW10gZ2V0VGV4dENoYXJhY3RlcnMoCi1pbnRbXSkKLQotcHVibGljIGJvb2xlYW4gaXNBdHRyaWJ1dGVEZWZhdWx0KAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBpc0VtcHR5RWxlbWVudFRhZygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIGlzV2hpdGVzcGFjZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgbmV4dCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgbmV4dFRhZygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIG5leHRUZXh0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCBuZXh0VG9rZW4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCByZXF1aXJlKAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRGZWF0dXJlKAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0SW5wdXQoCi1qYXZhLmlvLklucHV0U3RyZWFtCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRJbnB1dCgKLWphdmEuaW8uUmVhZGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3Jlcy9YbWxCbG9jayRQYXJzZXI7ICkKLWZpbmFsIGNsYXNzIGFuZHJvaWQuY29udGVudC5yZXMuWG1sQmxvY2sgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0TWFuYWdlciBtQXNzZXRzCi0KLXByaXZhdGUgZmluYWwgaW50IG1OYXRpdmUKLQotcHJpdmF0ZSBib29sZWFuIG1PcGVuCi0KLXByaXZhdGUgaW50IG1PcGVuQ291bnQKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLmNvbnRlbnQucmVzLlN0cmluZ0Jsb2NrIG1TdHJpbmdzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldE1hbmFnZXIKLWludCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYnl0ZVtdKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ieXRlW10KLWludAotaW50KQotCi1zdGF0aWMgaW50IGFjY2VzcyQwMDgoCi1hbmRyb2lkLmNvbnRlbnQucmVzLlhtbEJsb2NrKQotCi1zdGF0aWMgaW50IGFjY2VzcyQxMDAoCi1pbnQpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDEwMDAoCi1pbnQKLWludCkKLQotc3RhdGljIGludCBhY2Nlc3MkMTEwMCgKLWludAotaW50KQotCi1zdGF0aWMgaW50IGFjY2VzcyQxMjAwKAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1zdGF0aWMgaW50IGFjY2VzcyQxMzAwKAotaW50KQotCi1zdGF0aWMgaW50IGFjY2VzcyQxNDAwKAotaW50Ci1pbnQpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDE1MDAoCi1pbnQpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDE2MDAoCi1pbnQpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDE3MDAoCi1pbnQpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQxODAwKAotaW50KQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMTkwMCgKLWFuZHJvaWQuY29udGVudC5yZXMuWG1sQmxvY2spCi0KLXN0YXRpYyBhbmRyb2lkLmNvbnRlbnQucmVzLlN0cmluZ0Jsb2NrIGFjY2VzcyQyMDAoCi1hbmRyb2lkLmNvbnRlbnQucmVzLlhtbEJsb2NrKQotCi1zdGF0aWMgaW50IGFjY2VzcyQzMDAoCi1pbnQpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDQwMCgKLWludCkKLQotc3RhdGljIGludCBhY2Nlc3MkNTAwKAotaW50KQotCi1zdGF0aWMgaW50IGFjY2VzcyQ2MDAoCi1pbnQKLWludCkKLQotc3RhdGljIGludCBhY2Nlc3MkNzAwKAotaW50Ci1pbnQpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDgwMCgKLWludCkKLQotc3RhdGljIGludCBhY2Nlc3MkOTAwKAotaW50Ci1pbnQpCi0KLXByaXZhdGUgdm9pZCBkZWNPcGVuQ291bnRMb2NrZWQoKQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IG5hdGl2ZUNyZWF0ZSgKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgbmF0aXZlQ3JlYXRlUGFyc2VTdGF0ZSgKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgbmF0aXZlRGVzdHJveSgKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgbmF0aXZlRGVzdHJveVBhcnNlU3RhdGUoCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgbmF0aXZlR2V0QXR0cmlidXRlQ291bnQoCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgbmF0aXZlR2V0QXR0cmlidXRlRGF0YSgKLWludAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IG5hdGl2ZUdldEF0dHJpYnV0ZURhdGFUeXBlKAotaW50Ci1pbnQpCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgbmF0aXZlR2V0QXR0cmlidXRlSW5kZXgoCi1pbnQKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgbmF0aXZlR2V0QXR0cmlidXRlTmFtZSgKLWludAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IG5hdGl2ZUdldEF0dHJpYnV0ZU5hbWVzcGFjZSgKLWludAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IG5hdGl2ZUdldEF0dHJpYnV0ZVJlc291cmNlKAotaW50Ci1pbnQpCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgbmF0aXZlR2V0QXR0cmlidXRlU3RyaW5nVmFsdWUoCi1pbnQKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBuYXRpdmVHZXRDbGFzc0F0dHJpYnV0ZSgKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBuYXRpdmVHZXRJZEF0dHJpYnV0ZSgKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBuYXRpdmVHZXRMaW5lTnVtYmVyKAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IG5hdGl2ZUdldE5hbWUoCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgbmF0aXZlR2V0TmFtZXNwYWNlKAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IG5hdGl2ZUdldFN0cmluZ0Jsb2NrKAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IG5hdGl2ZUdldFN0eWxlQXR0cmlidXRlKAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IG5hdGl2ZUdldFRleHQoCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgbmF0aXZlTmV4dCgKLWludCkKLQotcHVibGljIHZvaWQgY2xvc2UoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvVGhyb3dhYmxlOyApCi1wcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQucmVzLlhtbFJlc291cmNlUGFyc2VyIG5ld1BhcnNlcigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMiBuYW1lID1TZWxmQ29udGVudE9ic2VydmVyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2RhdGFiYXNlL0Fic3RyYWN0Q3Vyc29yOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5kYXRhYmFzZS5BYnN0cmFjdEN1cnNvciRTZWxmQ29udGVudE9ic2VydmVyIGV4dGVuZHMgYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL3JlZi9XZWFrUmVmZXJlbmNlPExhbmRyb2lkL2RhdGFiYXNlL0Fic3RyYWN0Q3Vyc29yOz47ICkKLSBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2UgbUN1cnNvcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuZGF0YWJhc2UuQWJzdHJhY3RDdXJzb3IpCi0KLXB1YmxpYyBib29sZWFuIGRlbGl2ZXJTZWxmTm90aWZpY2F0aW9ucygpCi0KLXB1YmxpYyB2b2lkIG9uQ2hhbmdlKAotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5kYXRhYmFzZS5Dcm9zc1Byb2Nlc3NDdXJzb3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBmaWxsV2luZG93KAotaW50Ci1hbmRyb2lkLmRhdGFiYXNlLkN1cnNvcldpbmRvdykKLQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yV2luZG93IGdldFdpbmRvdygpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIG9uTW92ZSgKLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvZGF0YWJhc2UvQWJzdHJhY3RDdXJzb3IkU2VsZkNvbnRlbnRPYnNlcnZlcjsgKQotcHVibGljIGFic3RyYWN0IGNsYXNzIGFuZHJvaWQuZGF0YWJhc2UuQWJzdHJhY3RDdXJzb3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5kYXRhYmFzZS5Dcm9zc1Byb2Nlc3NDdXJzb3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLQotcHJvdGVjdGVkIGJvb2xlYW4gbUNsb3NlZAotCi0gYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2YWJsZSBtQ29udGVudE9ic2VydmFibGUKLQotcHJvdGVjdGVkIGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIgbUNvbnRlbnRSZXNvbHZlcgotCi1wcm90ZWN0ZWQgamF2YS5sYW5nLkxvbmcgbUN1cnJlbnRSb3dJRAotCi0gYW5kcm9pZC5kYXRhYmFzZS5EYXRhU2V0T2JzZXJ2YWJsZSBtRGF0YVNldE9ic2VydmFibGUKLQotcHJpdmF0ZSBhbmRyb2lkLm5ldC5VcmkgbU5vdGlmeVVyaQotCi1wcm90ZWN0ZWQgaW50IG1Qb3MKLQotcHJvdGVjdGVkIGludCBtUm93SWRDb2x1bW5JbmRleAotCi1wcml2YXRlIGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyIG1TZWxmT2JzZXJ2ZXIKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuT2JqZWN0IG1TZWxmT2JzZXJ2ZXJMb2NrCi0KLXByaXZhdGUgYm9vbGVhbiBtU2VsZk9ic2VydmVyUmVnaXN0ZXJlZAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaE1hcDxMamF2YS9sYW5nL0xvbmc7TGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9PYmplY3Q7Pjs+OyApCi1wcm90ZWN0ZWQgamF2YS51dGlsLkhhc2hNYXAgbVVwZGF0ZWRSb3dzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgYWJvcnRVcGRhdGVzKCkKLQotcHJvdGVjdGVkIHZvaWQgY2hlY2tQb3NpdGlvbigpCi0KLXB1YmxpYyB2b2lkIGNsb3NlKCkKLQotcHVibGljIGJvb2xlYW4gY29tbWl0VXBkYXRlcygpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTWFwPCtMamF2YS9sYW5nL0xvbmc7K0xqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvT2JqZWN0Oz47PjspWiApCi1wdWJsaWMgYm9vbGVhbiBjb21taXRVcGRhdGVzKAotamF2YS51dGlsLk1hcCkKLQotcHVibGljIHZvaWQgY29weVN0cmluZ1RvQnVmZmVyKAotaW50Ci1hbmRyb2lkLmRhdGFiYXNlLkNoYXJBcnJheUJ1ZmZlcikKLQotcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpCi0KLXB1YmxpYyB2b2lkIGRlYWN0aXZhdGVJbnRlcm5hbCgpCi0KLXB1YmxpYyBib29sZWFuIGRlbGV0ZVJvdygpCi0KLXB1YmxpYyB2b2lkIGZpbGxXaW5kb3coCi1pbnQKLWFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yV2luZG93KQotCi1wcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpCi0KLXB1YmxpYyBieXRlW10gZ2V0QmxvYigKLWludCkKLQotcHVibGljIGludCBnZXRDb2x1bW5Db3VudCgpCi0KLXB1YmxpYyBpbnQgZ2V0Q29sdW1uSW5kZXgoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgaW50IGdldENvbHVtbkluZGV4T3JUaHJvdygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldENvbHVtbk5hbWUoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0Q29sdW1uTmFtZXMoKQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldENvdW50KCkKLQotcHVibGljIGFic3RyYWN0IGRvdWJsZSBnZXREb3VibGUoCi1pbnQpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLkJ1bmRsZSBnZXRFeHRyYXMoKQotCi1wdWJsaWMgYWJzdHJhY3QgZmxvYXQgZ2V0RmxvYXQoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0SW50KAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgbG9uZyBnZXRMb25nKAotaW50KQotCi1wdWJsaWMgZmluYWwgaW50IGdldFBvc2l0aW9uKCkKLQotcHVibGljIGFic3RyYWN0IHNob3J0IGdldFNob3J0KAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRTdHJpbmcoCi1pbnQpCi0KLXByb3RlY3RlZCBqYXZhLmxhbmcuT2JqZWN0IGdldFVwZGF0ZWRGaWVsZCgKLWludCkKLQotcHVibGljIGJvb2xlYW4gZ2V0V2FudHNBbGxPbk1vdmVDYWxscygpCi0KLXB1YmxpYyBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcldpbmRvdyBnZXRXaW5kb3coKQotCi1wdWJsaWMgYm9vbGVhbiBoYXNVcGRhdGVzKCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gaXNBZnRlckxhc3QoKQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBpc0JlZm9yZUZpcnN0KCkKLQotcHVibGljIGJvb2xlYW4gaXNDbG9zZWQoKQotCi1wcm90ZWN0ZWQgYm9vbGVhbiBpc0ZpZWxkVXBkYXRlZCgKLWludCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gaXNGaXJzdCgpCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGlzTGFzdCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzTnVsbCgKLWludCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gbW92ZSgKLWludCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gbW92ZVRvRmlyc3QoKQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBtb3ZlVG9MYXN0KCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gbW92ZVRvTmV4dCgpCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIG1vdmVUb1Bvc2l0aW9uKAotaW50KQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBtb3ZlVG9QcmV2aW91cygpCi0KLXByb3RlY3RlZCB2b2lkIG9uQ2hhbmdlKAotYm9vbGVhbikKLQotcHVibGljIGJvb2xlYW4gb25Nb3ZlKAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIHJlZ2lzdGVyQ29udGVudE9ic2VydmVyKAotYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXIpCi0KLXB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKAotYW5kcm9pZC5kYXRhYmFzZS5EYXRhU2V0T2JzZXJ2ZXIpCi0KLXB1YmxpYyBib29sZWFuIHJlcXVlcnkoKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5CdW5kbGUgcmVzcG9uZCgKLWFuZHJvaWQub3MuQnVuZGxlKQotCi1wdWJsaWMgdm9pZCBzZXROb3RpZmljYXRpb25VcmkoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1hbmRyb2lkLm5ldC5VcmkpCi0KLXB1YmxpYyBib29sZWFuIHN1cHBvcnRzVXBkYXRlcygpCi0KLXB1YmxpYyB2b2lkIHVucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoCi1hbmRyb2lkLmRhdGFiYXNlLkNvbnRlbnRPYnNlcnZlcikKLQotcHVibGljIHZvaWQgdW5yZWdpc3RlckRhdGFTZXRPYnNlcnZlcigKLWFuZHJvaWQuZGF0YWJhc2UuRGF0YVNldE9ic2VydmVyKQotCi1wdWJsaWMgYm9vbGVhbiB1cGRhdGUoCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBib29sZWFuIHVwZGF0ZUJsb2IoCi1pbnQKLWJ5dGVbXSkKLQotcHVibGljIGJvb2xlYW4gdXBkYXRlRG91YmxlKAotaW50Ci1kb3VibGUpCi0KLXB1YmxpYyBib29sZWFuIHVwZGF0ZUZsb2F0KAotaW50Ci1mbG9hdCkKLQotcHVibGljIGJvb2xlYW4gdXBkYXRlSW50KAotaW50Ci1pbnQpCi0KLXB1YmxpYyBib29sZWFuIHVwZGF0ZUxvbmcoCi1pbnQKLWxvbmcpCi0KLXB1YmxpYyBib29sZWFuIHVwZGF0ZVNob3J0KAotaW50Ci1zaG9ydCkKLQotcHVibGljIGJvb2xlYW4gdXBkYXRlU3RyaW5nKAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYm9vbGVhbiB1cGRhdGVUb051bGwoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC5kYXRhYmFzZS5BYnN0cmFjdFdpbmRvd2VkQ3Vyc29yIGV4dGVuZHMgYW5kcm9pZC5kYXRhYmFzZS5BYnN0cmFjdEN1cnNvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3JXaW5kb3cgbVdpbmRvdwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByb3RlY3RlZCB2b2lkIGNoZWNrUG9zaXRpb24oKQotCi1wdWJsaWMgdm9pZCBjb3B5U3RyaW5nVG9CdWZmZXIoCi1pbnQKLWFuZHJvaWQuZGF0YWJhc2UuQ2hhckFycmF5QnVmZmVyKQotCi1wdWJsaWMgYnl0ZVtdIGdldEJsb2IoCi1pbnQpCi0KLXB1YmxpYyBkb3VibGUgZ2V0RG91YmxlKAotaW50KQotCi1wdWJsaWMgZmxvYXQgZ2V0RmxvYXQoCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0SW50KAotaW50KQotCi1wdWJsaWMgbG9uZyBnZXRMb25nKAotaW50KQotCi1wdWJsaWMgc2hvcnQgZ2V0U2hvcnQoCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygKLWludCkKLQotcHVibGljIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yV2luZG93IGdldFdpbmRvdygpCi0KLXB1YmxpYyBib29sZWFuIGhhc1dpbmRvdygpCi0KLXB1YmxpYyBib29sZWFuIGlzQmxvYigKLWludCkKLQotcHVibGljIGJvb2xlYW4gaXNOdWxsKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRXaW5kb3coCi1hbmRyb2lkLmRhdGFiYXNlLkN1cnNvcldpbmRvdykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5kYXRhYmFzZS5JQnVsa0N1cnNvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLklJbnRlcmZhY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xPU0VfVFJBTlNBQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09VTlRfVFJBTlNBQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVBQ1RJVkFURV9UUkFOU0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUxFVEVfUk9XX1RSQU5TQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdFVF9DT0xVTU5fTkFNRVNfVFJBTlNBQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0VUX0NVUlNPUl9XSU5ET1dfVFJBTlNBQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0VUX0VYVFJBU19UUkFOU0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPTl9NT1ZFX1RSQU5TQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUVVFUllfVFJBTlNBQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9ORF9UUkFOU0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBVUERBVEVfUk9XU19UUkFOU0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQU5UU19PTl9NT1ZFX1RSQU5TQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBkZXNjcmlwdG9yCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGNsb3NlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgY291bnQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgZGVhY3RpdmF0ZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBkZWxldGVSb3coCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZ1tdIGdldENvbHVtbk5hbWVzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLm9zLkJ1bmRsZSBnZXRFeHRyYXMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZ2V0V2FudHNBbGxPbk1vdmVDYWxscygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3JXaW5kb3cgZ2V0V2luZG93KAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgb25Nb3ZlKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCByZXF1ZXJ5KAotYW5kcm9pZC5kYXRhYmFzZS5JQ29udGVudE9ic2VydmVyCi1hbmRyb2lkLmRhdGFiYXNlLkN1cnNvcldpbmRvdykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLm9zLkJ1bmRsZSByZXNwb25kKAotYW5kcm9pZC5vcy5CdW5kbGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTWFwPCtMamF2YS9sYW5nL0xvbmc7K0xqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvT2JqZWN0Oz47PjspWiApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiB1cGRhdGVSb3dzKAotamF2YS51dGlsLk1hcCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBhbmRyb2lkLmRhdGFiYXNlLkJ1bGtDdXJzb3JOYXRpdmUgZXh0ZW5kcyBhbmRyb2lkLm9zLkJpbmRlciBpbXBsZW1lbnRzIGFuZHJvaWQuZGF0YWJhc2UuSUJ1bGtDdXJzb3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuZGF0YWJhc2UuSUJ1bGtDdXJzb3IgYXNJbnRlcmZhY2UoCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gb25UcmFuc2FjdCgKLWludAotYW5kcm9pZC5vcy5QYXJjZWwKLWFuZHJvaWQub3MuUGFyY2VsCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1maW5hbCBjbGFzcyBhbmRyb2lkLmRhdGFiYXNlLkJ1bGtDdXJzb3JQcm94eSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLmRhdGFiYXNlLklCdWxrQ3Vyc29yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5CdW5kbGUgbUV4dHJhcwotCi1wcml2YXRlIGFuZHJvaWQub3MuSUJpbmRlciBtUmVtb3RlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNsb3NlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgY291bnQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBkZWxldGVSb3coCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIGdldENvbHVtbk5hbWVzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhbmRyb2lkLm9zLkJ1bmRsZSBnZXRFeHRyYXMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gZ2V0V2FudHNBbGxPbk1vdmVDYWxscygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3JXaW5kb3cgZ2V0V2luZG93KAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgb25Nb3ZlKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGludCByZXF1ZXJ5KAotYW5kcm9pZC5kYXRhYmFzZS5JQ29udGVudE9ic2VydmVyCi1hbmRyb2lkLmRhdGFiYXNlLkN1cnNvcldpbmRvdykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhbmRyb2lkLm9zLkJ1bmRsZSByZXNwb25kKAotYW5kcm9pZC5vcy5CdW5kbGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiB1cGRhdGVSb3dzKAotamF2YS51dGlsLk1hcCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLmRhdGFiYXNlLkJ1bGtDdXJzb3JUb0N1cnNvckFkYXB0b3IgZXh0ZW5kcyBhbmRyb2lkLmRhdGFiYXNlLkFic3RyYWN0V2luZG93ZWRDdXJzb3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLQotcHJpdmF0ZSBhbmRyb2lkLmRhdGFiYXNlLklCdWxrQ3Vyc29yIG1CdWxrQ3Vyc29yCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZ1tdIG1Db2x1bW5zCi0KLXByaXZhdGUgaW50IG1Db3VudAotCi1wcml2YXRlIGFuZHJvaWQuZGF0YWJhc2UuQWJzdHJhY3RDdXJzb3IkU2VsZkNvbnRlbnRPYnNlcnZlciBtT2JzZXJ2ZXJCcmlkZ2UKLQotcHJpdmF0ZSBib29sZWFuIG1XYW50c0FsbE9uTW92ZUNhbGxzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgY2xvc2UoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL01hcDwrTGphdmEvbGFuZy9Mb25nOytMamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL09iamVjdDs+Oz47KVogKQotcHVibGljIGJvb2xlYW4gY29tbWl0VXBkYXRlcygKLWphdmEudXRpbC5NYXApCi0KLXB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKQotCi1wdWJsaWMgYm9vbGVhbiBkZWxldGVSb3coKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIGdldENvbHVtbk5hbWVzKCkKLQotcHVibGljIGludCBnZXRDb3VudCgpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLkJ1bmRsZSBnZXRFeHRyYXMoKQotCi1wdWJsaWMgYW5kcm9pZC5kYXRhYmFzZS5JQ29udGVudE9ic2VydmVyIGdldE9ic2VydmVyKCkKLQotcHVibGljIGJvb2xlYW4gb25Nb3ZlKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBib29sZWFuIHJlcXVlcnkoKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5CdW5kbGUgcmVzcG9uZCgKLWFuZHJvaWQub3MuQnVuZGxlKQotCi1wdWJsaWMgdm9pZCBzZXQoCi1hbmRyb2lkLmRhdGFiYXNlLklCdWxrQ3Vyc29yKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQuZGF0YWJhc2UuQ2hhckFycmF5QnVmZmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgY2hhcltdIGRhdGEKLQotcHVibGljIGludCBzaXplQ29waWVkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1jaGFyW10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS9sYW5nL09iamVjdDsgKQotcHVibGljIGFic3RyYWN0IGNsYXNzIGFuZHJvaWQuZGF0YWJhc2UuT2JzZXJ2YWJsZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0FycmF5TGlzdDxUVDs+OyApCi1wcm90ZWN0ZWQgZmluYWwgamF2YS51dGlsLkFycmF5TGlzdCBtT2JzZXJ2ZXJzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVFQ7KVYgKQotcHVibGljIHZvaWQgcmVnaXN0ZXJPYnNlcnZlcigKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2lkIHVucmVnaXN0ZXJBbGwoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUVDspViApCi1wdWJsaWMgdm9pZCB1bnJlZ2lzdGVyT2JzZXJ2ZXIoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MYW5kcm9pZC9kYXRhYmFzZS9PYnNlcnZhYmxlPExhbmRyb2lkL2RhdGFiYXNlL0NvbnRlbnRPYnNlcnZlcjs+OyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2YWJsZSBleHRlbmRzIGFuZHJvaWQuZGF0YWJhc2UuT2JzZXJ2YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIGRpc3BhdGNoQ2hhbmdlKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgcmVnaXN0ZXJPYnNlcnZlcigKLWFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyKQotCi1wdWJsaWMgdm9sYXRpbGUgdm9pZCByZWdpc3Rlck9ic2VydmVyKAotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE4IG5hbWUgPU5vdGlmaWNhdGlvblJ1bm5hYmxlICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2RhdGFiYXNlL0NvbnRlbnRPYnNlcnZlcjsgKQotZmluYWwgY2xhc3MgYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXIkTm90aWZpY2F0aW9uUnVubmFibGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5sYW5nLlJ1bm5hYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYm9vbGVhbiBtU2VsZgotCi1maW5hbCBhbmRyb2lkLmRhdGFiYXNlLkNvbnRlbnRPYnNlcnZlciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmRhdGFiYXNlLkNvbnRlbnRPYnNlcnZlcgotYm9vbGVhbikKLQotcHVibGljIHZvaWQgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL2RhdGFiYXNlL0lDb250ZW50T2JzZXJ2ZXIkU3R1YjsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLmRhdGFiYXNlLklDb250ZW50T2JzZXJ2ZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5JSW50ZXJmYWNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uQ2hhbmdlKAotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwMzMgbmFtZSA9U3R1YiApCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL2RhdGFiYXNlL0lDb250ZW50T2JzZXJ2ZXIkU3R1YiRQcm94eTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvZGF0YWJhc2UvSUNvbnRlbnRPYnNlcnZlcjsgKQotcHVibGljIGFic3RyYWN0IGNsYXNzIGFuZHJvaWQuZGF0YWJhc2UuSUNvbnRlbnRPYnNlcnZlciRTdHViIGV4dGVuZHMgYW5kcm9pZC5vcy5CaW5kZXIgaW1wbGVtZW50cyBhbmRyb2lkLmRhdGFiYXNlLklDb250ZW50T2JzZXJ2ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERVNDUklQVE9SCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fb25DaGFuZ2UKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuZGF0YWJhc2UuSUNvbnRlbnRPYnNlcnZlciBhc0ludGVyZmFjZSgKLWFuZHJvaWQub3MuSUJpbmRlcikKLQotcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBvblRyYW5zYWN0KAotaW50Ci1hbmRyb2lkLm9zLlBhcmNlbAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI2IG5hbWUgPVRyYW5zcG9ydCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9kYXRhYmFzZS9Db250ZW50T2JzZXJ2ZXI7ICkKLWZpbmFsIGNsYXNzIGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyJFRyYW5zcG9ydCBleHRlbmRzIGFuZHJvaWQuZGF0YWJhc2UuSUNvbnRlbnRPYnNlcnZlciRTdHViCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBhbmRyb2lkLmRhdGFiYXNlLkNvbnRlbnRPYnNlcnZlciBtQ29udGVudE9ic2VydmVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXIpCi0KLXB1YmxpYyBib29sZWFuIGRlbGl2ZXJTZWxmTm90aWZpY2F0aW9ucygpCi0KLXB1YmxpYyB2b2lkIG9uQ2hhbmdlKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgcmVsZWFzZUNvbnRlbnRPYnNlcnZlcigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3JJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLkluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTQxMDQgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JKb2luZXI7ICkKLSBjbGFzcyBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvckpvaW5lciQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgaW50W10gJFN3aXRjaE1hcCRhbmRyb2lkJGRhdGFiYXNlJEN1cnNvckpvaW5lciRSZXN1bHQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvZGF0YWJhc2UvQ3Vyc29ySm9pbmVyOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9FbnVtPExhbmRyb2lkL2RhdGFiYXNlL0N1cnNvckpvaW5lciRSZXN1bHQ7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNjQwOSBuYW1lID1SZXN1bHQgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29ySm9pbmVyJFJlc3VsdCBleHRlbmRzIGphdmEubGFuZy5FbnVtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29ySm9pbmVyJFJlc3VsdFtdICRWQUxVRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvckpvaW5lciRSZXN1bHQgQk9USAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29ySm9pbmVyJFJlc3VsdCBMRUZUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3JKb2luZXIkUmVzdWx0IFJJR0hUCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpViApCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29ySm9pbmVyJFJlc3VsdCB2YWx1ZU9mKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvckpvaW5lciRSZXN1bHRbXSB2YWx1ZXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvZGF0YWJhc2UvQ3Vyc29ySm9pbmVyJDE7TGFuZHJvaWQvZGF0YWJhc2UvQ3Vyc29ySm9pbmVyJFJlc3VsdDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3V0aWwvSXRlcmF0b3I8TGFuZHJvaWQvZGF0YWJhc2UvQ3Vyc29ySm9pbmVyJFJlc3VsdDs+O0xqYXZhL2xhbmcvSXRlcmFibGU8TGFuZHJvaWQvZGF0YWJhc2UvQ3Vyc29ySm9pbmVyJFJlc3VsdDs+OyApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3JKb2luZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLkl0ZXJhdG9yLCBqYXZhLmxhbmcuSXRlcmFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIGJvb2xlYW4gJGFzc2VydGlvbnNEaXNhYmxlZAotCi1wcml2YXRlIGludFtdIG1Db2x1bW5zTGVmdAotCi1wcml2YXRlIGludFtdIG1Db2x1bW5zUmlnaHQKLQotcHJpdmF0ZSBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvckpvaW5lciRSZXN1bHQgbUNvbXBhcmVSZXN1bHQKLQotcHJpdmF0ZSBib29sZWFuIG1Db21wYXJlUmVzdWx0SXNWYWxpZAotCi1wcml2YXRlIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIG1DdXJzb3JMZWZ0Ci0KLXByaXZhdGUgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IgbUN1cnNvclJpZ2h0Ci0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZ1tdIG1WYWx1ZXMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yCi1qYXZhLmxhbmcuU3RyaW5nW10KLWFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yCi1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLXByaXZhdGUgaW50W10gYnVpbGRDb2x1bW5JbmRpY2llc0FycmF5KAotYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotcHJpdmF0ZSBzdGF0aWMgdHJhbnNpZW50IGludCBjb21wYXJlU3RyaW5ncygKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotcHJpdmF0ZSB2b2lkIGluY3JlbWVudEN1cnNvcnMoKQotCi1wcml2YXRlIHN0YXRpYyB2b2lkIHBvcHVsYXRlVmFsdWVzKAotamF2YS5sYW5nLlN0cmluZ1tdCi1hbmRyb2lkLmRhdGFiYXNlLkN1cnNvcgotaW50W10KLWludCkKLQotcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0l0ZXJhdG9yPExhbmRyb2lkL2RhdGFiYXNlL0N1cnNvckpvaW5lciRSZXN1bHQ7PjsgKQotcHVibGljIGphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvcigpCi0KLXB1YmxpYyBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvckpvaW5lciRSZXN1bHQgbmV4dCgpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IG5leHQoKQotCi1wdWJsaWMgdm9pZCByZW1vdmUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2RhdGFiYXNlL0N1cnNvclRvQnVsa0N1cnNvckFkYXB0b3I7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjYgbmFtZSA9Q29udGVudE9ic2VydmVyUHJveHkgKQotZmluYWwgY2xhc3MgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3JUb0J1bGtDdXJzb3JBZGFwdG9yJENvbnRlbnRPYnNlcnZlclByb3h5IGV4dGVuZHMgYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIGFuZHJvaWQuZGF0YWJhc2UuSUNvbnRlbnRPYnNlcnZlciBtUmVtb3RlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5kYXRhYmFzZS5JQ29udGVudE9ic2VydmVyCi1hbmRyb2lkLm9zLklCaW5kZXIkRGVhdGhSZWNpcGllbnQpCi0KLXB1YmxpYyBib29sZWFuIGRlbGl2ZXJTZWxmTm90aWZpY2F0aW9ucygpCi0KLXB1YmxpYyB2b2lkIG9uQ2hhbmdlKAotYm9vbGVhbikKLQotcHVibGljIGJvb2xlYW4gdW5saW5rVG9EZWF0aCgKLWFuZHJvaWQub3MuSUJpbmRlciREZWF0aFJlY2lwaWVudCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL2RhdGFiYXNlL0N1cnNvclRvQnVsa0N1cnNvckFkYXB0b3IkQ29udGVudE9ic2VydmVyUHJveHk7ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvclRvQnVsa0N1cnNvckFkYXB0b3IgZXh0ZW5kcyBhbmRyb2lkLmRhdGFiYXNlLkJ1bGtDdXJzb3JOYXRpdmUgaW1wbGVtZW50cyBhbmRyb2lkLm9zLklCaW5kZXIkRGVhdGhSZWNpcGllbnQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLmRhdGFiYXNlLkNyb3NzUHJvY2Vzc0N1cnNvciBtQ3Vyc29yCi0KLXByaXZhdGUgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3JUb0J1bGtDdXJzb3JBZGFwdG9yJENvbnRlbnRPYnNlcnZlclByb3h5IG1PYnNlcnZlcgotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgbVByb3ZpZGVyTmFtZQotCi1wcml2YXRlIGZpbmFsIGJvb2xlYW4gbVJlYWRPbmx5Ci0KLXByaXZhdGUgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3JXaW5kb3cgbVdpbmRvdwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yCi1hbmRyb2lkLmRhdGFiYXNlLklDb250ZW50T2JzZXJ2ZXIKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4KLWFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yV2luZG93KQotCi1wcml2YXRlIHZvaWQgY3JlYXRlQW5kUmVnaXN0ZXJPYnNlcnZlclByb3h5KAotYW5kcm9pZC5kYXRhYmFzZS5JQ29udGVudE9ic2VydmVyKQotCi1wcml2YXRlIHZvaWQgbWF5YmVVbnJlZ2lzdGVyT2JzZXJ2ZXJQcm94eSgpCi0KLXB1YmxpYyB2b2lkIGJpbmRlckRpZWQoKQotCi1wdWJsaWMgdm9pZCBjbG9zZSgpCi0KLXB1YmxpYyBpbnQgY291bnQoKQotCi1wdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkKLQotcHVibGljIGJvb2xlYW4gZGVsZXRlUm93KAotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIGdldENvbHVtbk5hbWVzKCkKLQotcHVibGljIGFuZHJvaWQub3MuQnVuZGxlIGdldEV4dHJhcygpCi0KLXB1YmxpYyBib29sZWFuIGdldFdhbnRzQWxsT25Nb3ZlQ2FsbHMoKQotCi1wdWJsaWMgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3JXaW5kb3cgZ2V0V2luZG93KAotaW50KQotCi1wdWJsaWMgdm9pZCBvbk1vdmUoCi1pbnQpCi0KLXB1YmxpYyBpbnQgcmVxdWVyeSgKLWFuZHJvaWQuZGF0YWJhc2UuSUNvbnRlbnRPYnNlcnZlcgotYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3JXaW5kb3cpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLkJ1bmRsZSByZXNwb25kKAotYW5kcm9pZC5vcy5CdW5kbGUpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTWFwPCtMamF2YS9sYW5nL0xvbmc7K0xqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvT2JqZWN0Oz47PjspWiApCi1wdWJsaWMgYm9vbGVhbiB1cGRhdGVSb3dzKAotamF2YS51dGlsLk1hcCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExhbmRyb2lkL2RhdGFiYXNlL0N1cnNvcldpbmRvdzs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JXaW5kb3c7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLWZpbmFsIGNsYXNzIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yV2luZG93JDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3JXaW5kb3cgY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcldpbmRvd1tdIG5ld0FycmF5KAotaW50KQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdFtdIG5ld0FycmF5KAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUNsb3NhYmxlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEubGFuZy5PYmplY3QgbUxvY2sKLQotcHJpdmF0ZSBpbnQgbVJlZmVyZW5jZUNvdW50Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgYWNxdWlyZVJlZmVyZW5jZSgpCi0KLXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIG9uQWxsUmVmZXJlbmNlc1JlbGVhc2VkKCkKLQotcHJvdGVjdGVkIHZvaWQgb25BbGxSZWZlcmVuY2VzUmVsZWFzZWRGcm9tQ29udGFpbmVyKCkKLQotcHVibGljIHZvaWQgcmVsZWFzZVJlZmVyZW5jZSgpCi0KLXB1YmxpYyB2b2lkIHJlbGVhc2VSZWZlcmVuY2VGcm9tQ29udGFpbmVyKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcldpbmRvdyBleHRlbmRzIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUNsb3NhYmxlIGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExhbmRyb2lkL2RhdGFiYXNlL0N1cnNvcldpbmRvdzs+OyApCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yIENSRUFUT1IKLQotcHJpdmF0ZSBpbnQgbVN0YXJ0UG9zCi0KLXByaXZhdGUgaW50IG5XaW5kb3cKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5QYXJjZWwKLWFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yV2luZG93JDEpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWJvb2xlYW4pCi0KLXByaXZhdGUgbmF0aXZlIGJvb2xlYW4gYWxsb2NSb3dfbmF0aXZlKCkKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBjbG9zZV9uYXRpdmUoKQotCi1wcml2YXRlIG5hdGl2ZSBjaGFyW10gY29weVN0cmluZ1RvQnVmZmVyX25hdGl2ZSgKLWludAotaW50Ci1pbnQKLWFuZHJvaWQuZGF0YWJhc2UuQ2hhckFycmF5QnVmZmVyKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIGZyZWVMYXN0Um93X25hdGl2ZSgpCi0KLXByaXZhdGUgbmF0aXZlIGJ5dGVbXSBnZXRCbG9iX25hdGl2ZSgKLWludAotaW50KQotCi1wcml2YXRlIG5hdGl2ZSBkb3VibGUgZ2V0RG91YmxlX25hdGl2ZSgKLWludAotaW50KQotCi1wcml2YXRlIG5hdGl2ZSBsb25nIGdldExvbmdfbmF0aXZlKAotaW50Ci1pbnQpCi0KLXByaXZhdGUgbmF0aXZlIGludCBnZXROdW1Sb3dzX25hdGl2ZSgpCi0KLXByaXZhdGUgbmF0aXZlIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nX25hdGl2ZSgKLWludAotaW50KQotCi1wcml2YXRlIG5hdGl2ZSBib29sZWFuIGlzQmxvYl9uYXRpdmUoCi1pbnQKLWludCkKLQotcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBpc051bGxfbmF0aXZlKAotaW50Ci1pbnQpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlX2NsZWFyKCkKLQotcHJpdmF0ZSBuYXRpdmUgYW5kcm9pZC5vcy5JQmluZGVyIG5hdGl2ZV9nZXRCaW5kZXIoKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZV9pbml0KAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZV9pbml0KAotYm9vbGVhbikKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcldpbmRvdyBuZXdGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXByaXZhdGUgbmF0aXZlIGJvb2xlYW4gcHV0QmxvYl9uYXRpdmUoCi1ieXRlW10KLWludAotaW50KQotCi1wcml2YXRlIG5hdGl2ZSBib29sZWFuIHB1dERvdWJsZV9uYXRpdmUoCi1kb3VibGUKLWludAotaW50KQotCi1wcml2YXRlIG5hdGl2ZSBib29sZWFuIHB1dExvbmdfbmF0aXZlKAotbG9uZwotaW50Ci1pbnQpCi0KLXByaXZhdGUgbmF0aXZlIGJvb2xlYW4gcHV0TnVsbF9uYXRpdmUoCi1pbnQKLWludCkKLQotcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBwdXRTdHJpbmdfbmF0aXZlKAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQpCi0KLXByaXZhdGUgbmF0aXZlIGJvb2xlYW4gc2V0TnVtQ29sdW1uc19uYXRpdmUoCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIGFsbG9jUm93KCkKLQotcHVibGljIHZvaWQgY2xlYXIoKQotCi1wdWJsaWMgdm9pZCBjbG9zZSgpCi0KLXB1YmxpYyB2b2lkIGNvcHlTdHJpbmdUb0J1ZmZlcigKLWludAotaW50Ci1hbmRyb2lkLmRhdGFiYXNlLkNoYXJBcnJheUJ1ZmZlcikKLQotcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkKLQotcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKQotCi1wdWJsaWMgdm9pZCBmcmVlTGFzdFJvdygpCi0KLXB1YmxpYyBieXRlW10gZ2V0QmxvYigKLWludAotaW50KQotCi1wdWJsaWMgZG91YmxlIGdldERvdWJsZSgKLWludAotaW50KQotCi1wdWJsaWMgZmxvYXQgZ2V0RmxvYXQoCi1pbnQKLWludCkKLQotcHVibGljIGludCBnZXRJbnQoCi1pbnQKLWludCkKLQotcHVibGljIGxvbmcgZ2V0TG9uZygKLWludAotaW50KQotCi1wdWJsaWMgaW50IGdldE51bVJvd3MoKQotCi1wdWJsaWMgc2hvcnQgZ2V0U2hvcnQoCi1pbnQKLWludCkKLQotcHVibGljIGludCBnZXRTdGFydFBvc2l0aW9uKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBib29sZWFuIGlzQmxvYigKLWludAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBpc051bGwoCi1pbnQKLWludCkKLQotcHJvdGVjdGVkIHZvaWQgb25BbGxSZWZlcmVuY2VzUmVsZWFzZWQoKQotCi1wdWJsaWMgYm9vbGVhbiBwdXRCbG9iKAotYnl0ZVtdCi1pbnQKLWludCkKLQotcHVibGljIGJvb2xlYW4gcHV0RG91YmxlKAotZG91YmxlCi1pbnQKLWludCkKLQotcHVibGljIGJvb2xlYW4gcHV0TG9uZygKLWxvbmcKLWludAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBwdXROdWxsKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBib29sZWFuIHB1dFN0cmluZygKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBzZXROdW1Db2x1bW5zKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRTdGFydFBvc2l0aW9uKAotaW50KQotCi1wdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGFuZHJvaWQvZGF0YWJhc2UvT2JzZXJ2YWJsZTxMYW5kcm9pZC9kYXRhYmFzZS9EYXRhU2V0T2JzZXJ2ZXI7PjsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQuZGF0YWJhc2UuRGF0YVNldE9ic2VydmFibGUgZXh0ZW5kcyBhbmRyb2lkLmRhdGFiYXNlLk9ic2VydmFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKCkKLQotcHVibGljIHZvaWQgbm90aWZ5SW52YWxpZGF0ZWQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGFuZHJvaWQuZGF0YWJhc2UuRGF0YVNldE9ic2VydmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIG9uQ2hhbmdlZCgpCi0KLXB1YmxpYyB2b2lkIG9uSW52YWxpZGF0ZWQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1JbnNlcnRIZWxwZXIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvZGF0YWJhc2UvRGF0YWJhc2VVdGlsczsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VVdGlscyRJbnNlcnRIZWxwZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBQkxFX0lORk9fUFJBR01BX0NPTFVNTk5BTUVfSU5ERVgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFCTEVfSU5GT19QUkFHTUFfREVGQVVMVF9JTkRFWAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaE1hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL0ludGVnZXI7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuSGFzaE1hcCBtQ29sdW1ucwotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlIG1EYgotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbUluc2VydFNRTAotCi1wcml2YXRlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZVN0YXRlbWVudCBtSW5zZXJ0U3RhdGVtZW50Ci0KLXByaXZhdGUgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlU3RhdGVtZW50IG1QcmVwYXJlZFN0YXRlbWVudAotCi1wcml2YXRlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZVN0YXRlbWVudCBtUmVwbGFjZVN0YXRlbWVudAotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgbVRhYmxlTmFtZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL2RhdGFiYXNlL1NRTEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIGJ1aWxkU1FMKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9kYXRhYmFzZS9TUUxFeGNlcHRpb247ICkKLXByaXZhdGUgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlU3RhdGVtZW50IGdldFN0YXRlbWVudCgKLWJvb2xlYW4pCi0KLXByaXZhdGUgbG9uZyBpbnNlcnRJbnRlcm5hbCgKLWFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBiaW5kKAotaW50Ci1kb3VibGUpCi0KLXB1YmxpYyB2b2lkIGJpbmQoCi1pbnQKLWZsb2F0KQotCi1wdWJsaWMgdm9pZCBiaW5kKAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIGJpbmQoCi1pbnQKLWxvbmcpCi0KLXB1YmxpYyB2b2lkIGJpbmQoCi1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIGJpbmQoCi1pbnQKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIGJpbmQoCi1pbnQKLWJ5dGVbXSkKLQotcHVibGljIHZvaWQgYmluZE51bGwoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGNsb3NlKCkKLQotcHVibGljIGxvbmcgZXhlY3V0ZSgpCi0KLXB1YmxpYyBpbnQgZ2V0Q29sdW1uSW5kZXgoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgbG9uZyBpbnNlcnQoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlcykKLQotcHVibGljIHZvaWQgcHJlcGFyZUZvckluc2VydCgpCi0KLXB1YmxpYyB2b2lkIHByZXBhcmVGb3JSZXBsYWNlKCkKLQotcHVibGljIGxvbmcgcmVwbGFjZSgKLWFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvZGF0YWJhc2UvRGF0YWJhc2VVdGlscyRJbnNlcnRIZWxwZXI7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlVXRpbHMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0NBTF9MT0dWCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEFHCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmdbXSBjb3VudFByb2plY3Rpb24KLQotcHJpdmF0ZSBzdGF0aWMgamF2YS50ZXh0LkNvbGxhdG9yIG1Db2xsCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGphdmEubGFuZy5EZXByZWNhdGVkCi1wdWJsaWMgc3RhdGljIHZvaWQgYXBwZW5kRXNjYXBlZFNRTFN0cmluZygKLWphdmEubGFuZy5TdHJpbmdCdWlsZGVyCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgYXBwZW5kVmFsdWVUb1NxbCgKLWphdmEubGFuZy5TdHJpbmdCdWlsZGVyCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIHZvaWQgYmluZE9iamVjdFRvUHJvZ3JhbSgKLWFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZVByb2dyYW0KLWludAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZURiRnJvbVNxbFN0YXRlbWVudHMoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgY3Vyc29yRG91YmxlVG9Db250ZW50VmFsdWVzKAotYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgY3Vyc29yRG91YmxlVG9DdXJzb3JWYWx1ZXMoCi1hbmRyb2lkLmRhdGFiYXNlLkN1cnNvcgotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXMpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBjdXJzb3JJbnRUb0NvbnRlbnRWYWx1ZXMoCi1hbmRyb2lkLmRhdGFiYXNlLkN1cnNvcgotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXMpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBjdXJzb3JJbnRUb0NvbnRlbnRWYWx1ZXMoCi1hbmRyb2lkLmRhdGFiYXNlLkN1cnNvcgotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXMKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBjdXJzb3JMb25nVG9Db250ZW50VmFsdWVzKAotYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgY3Vyc29yTG9uZ1RvQ29udGVudFZhbHVlcygKLWFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlcwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyB2b2lkIGN1cnNvclJvd1RvQ29udGVudFZhbHVlcygKLWFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlcykKLQotcHVibGljIHN0YXRpYyB2b2lkIGN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlcygKLWFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlcykKLQotcHVibGljIHN0YXRpYyB2b2lkIGN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlcygKLWFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlcwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyB2b2lkIGN1cnNvclN0cmluZ1RvSW5zZXJ0SGVscGVyKAotYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VVdGlscyRJbnNlcnRIZWxwZXIKLWludCkKLQotcHVibGljIHN0YXRpYyB2b2lkIGR1bXBDdXJyZW50Um93KAotYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBkdW1wQ3VycmVudFJvdygKLWFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yCi1qYXZhLmlvLlByaW50U3RyZWFtKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgZHVtcEN1cnJlbnRSb3coCi1hbmRyb2lkLmRhdGFiYXNlLkN1cnNvcgotamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBkdW1wQ3VycmVudFJvd1RvU3RyaW5nKAotYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBkdW1wQ3Vyc29yKAotYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBkdW1wQ3Vyc29yKAotYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IKLWphdmEuaW8uUHJpbnRTdHJlYW0pCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBkdW1wQ3Vyc29yKAotYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IKLWphdmEubGFuZy5TdHJpbmdCdWlsZGVyKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZHVtcEN1cnNvclRvU3RyaW5nKAotYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRDb2xsYXRpb25LZXkoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHN0YXRpYyBieXRlW10gZ2V0Q29sbGF0aW9uS2V5SW5CeXRlcygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRIZXhDb2xsYXRpb25LZXkoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHN0YXRpYyBpbnQgZ2V0S2V5TGVuKAotYnl0ZVtdKQotCi1wdWJsaWMgc3RhdGljIGxvbmcgbG9uZ0ZvclF1ZXJ5KAotYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotcHVibGljIHN0YXRpYyBsb25nIGxvbmdGb3JRdWVyeSgKLWFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZVN0YXRlbWVudAotamF2YS5sYW5nLlN0cmluZ1tdKQotCi1wdWJsaWMgc3RhdGljIGxvbmcgcXVlcnlOdW1FbnRyaWVzKAotYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCByZWFkRXhjZXB0aW9uRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCB2b2lkIHJlYWRFeGNlcHRpb25Gcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9GaWxlTm90Rm91bmRFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgdm9pZCByZWFkRXhjZXB0aW9uV2l0aEZpbGVOb3RGb3VuZEV4Y2VwdGlvbkZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIHNxbEVzY2FwZVN0cmluZygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBzdHJpbmdGb3JRdWVyeSgKLWFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBzdHJpbmdGb3JRdWVyeSgKLWFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZVN0YXRlbWVudAotamF2YS5sYW5nLlN0cmluZ1tdKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgd3JpdGVFeGNlcHRpb25Ub1BhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsCi1qYXZhLmxhbmcuRXhjZXB0aW9uKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9UHJveHkgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvZGF0YWJhc2UvSUNvbnRlbnRPYnNlcnZlciRTdHViOyApCi0gY2xhc3MgYW5kcm9pZC5kYXRhYmFzZS5JQ29udGVudE9ic2VydmVyJFN0dWIkUHJveHkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5kYXRhYmFzZS5JQ29udGVudE9ic2VydmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5JQmluZGVyIG1SZW1vdGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIG9uQ2hhbmdlKAotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEgbmFtZSA9Um93QnVpbGRlciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9kYXRhYmFzZS9NYXRyaXhDdXJzb3I7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmRhdGFiYXNlLk1hdHJpeEN1cnNvciRSb3dCdWlsZGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGludCBlbmRJbmRleAotCi1wcml2YXRlIGludCBpbmRleAotCi1maW5hbCBhbmRyb2lkLmRhdGFiYXNlLk1hdHJpeEN1cnNvciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmRhdGFiYXNlLk1hdHJpeEN1cnNvcgotaW50Ci1pbnQpCi0KLXB1YmxpYyBhbmRyb2lkLmRhdGFiYXNlLk1hdHJpeEN1cnNvciRSb3dCdWlsZGVyIGFkZCgKLWphdmEubGFuZy5PYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9kYXRhYmFzZS9NYXRyaXhDdXJzb3IkUm93QnVpbGRlcjsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQuZGF0YWJhc2UuTWF0cml4Q3Vyc29yIGV4dGVuZHMgYW5kcm9pZC5kYXRhYmFzZS5BYnN0cmFjdEN1cnNvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGludCBjb2x1bW5Db3VudAotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmdbXSBjb2x1bW5OYW1lcwotCi1wcml2YXRlIGphdmEubGFuZy5PYmplY3RbXSBkYXRhCi0KLXByaXZhdGUgaW50IHJvd0NvdW50Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZ1tdKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nW10KLWludCkKLQotc3RhdGljIGphdmEubGFuZy5PYmplY3RbXSBhY2Nlc3MkMDAwKAotYW5kcm9pZC5kYXRhYmFzZS5NYXRyaXhDdXJzb3IpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvQXJyYXlMaXN0PCo+O0kpViApCi1wcml2YXRlIHZvaWQgYWRkUm93KAotamF2YS51dGlsLkFycmF5TGlzdAotaW50KQotCi1wcml2YXRlIHZvaWQgZW5zdXJlQ2FwYWNpdHkoCi1pbnQpCi0KLXByaXZhdGUgamF2YS5sYW5nLk9iamVjdCBnZXQoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvSXRlcmFibGU8Kj47KVYgKQotcHVibGljIHZvaWQgYWRkUm93KAotamF2YS5sYW5nLkl0ZXJhYmxlKQotCi1wdWJsaWMgdm9pZCBhZGRSb3coCi1qYXZhLmxhbmcuT2JqZWN0W10pCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0Q29sdW1uTmFtZXMoKQotCi1wdWJsaWMgaW50IGdldENvdW50KCkKLQotcHVibGljIGRvdWJsZSBnZXREb3VibGUoCi1pbnQpCi0KLXB1YmxpYyBmbG9hdCBnZXRGbG9hdCgKLWludCkKLQotcHVibGljIGludCBnZXRJbnQoCi1pbnQpCi0KLXB1YmxpYyBsb25nIGdldExvbmcoCi1pbnQpCi0KLXB1YmxpYyBzaG9ydCBnZXRTaG9ydCgKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nKAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBpc051bGwoCi1pbnQpCi0KLXB1YmxpYyBhbmRyb2lkLmRhdGFiYXNlLk1hdHJpeEN1cnNvciRSb3dCdWlsZGVyIG5ld1JvdygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvZGF0YWJhc2UvTWVyZ2VDdXJzb3I7ICkKLSBjbGFzcyBhbmRyb2lkLmRhdGFiYXNlLk1lcmdlQ3Vyc29yJDEgZXh0ZW5kcyBhbmRyb2lkLmRhdGFiYXNlLkRhdGFTZXRPYnNlcnZlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLmRhdGFiYXNlLk1lcmdlQ3Vyc29yIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQuZGF0YWJhc2UuTWVyZ2VDdXJzb3IpCi0KLXB1YmxpYyB2b2lkIG9uQ2hhbmdlZCgpCi0KLXB1YmxpYyB2b2lkIG9uSW52YWxpZGF0ZWQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuZGF0YWJhc2UuTWVyZ2VDdXJzb3IgZXh0ZW5kcyBhbmRyb2lkLmRhdGFiYXNlLkFic3RyYWN0Q3Vyc29yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IgbUN1cnNvcgotCi1wcml2YXRlIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yW10gbUN1cnNvcnMKLQotcHJpdmF0ZSBhbmRyb2lkLmRhdGFiYXNlLkRhdGFTZXRPYnNlcnZlciBtT2JzZXJ2ZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmRhdGFiYXNlLkN1cnNvcltdKQotCi1wdWJsaWMgdm9pZCBjbG9zZSgpCi0KLXB1YmxpYyBib29sZWFuIGNvbW1pdFVwZGF0ZXMoKQotCi1wdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkKLQotcHVibGljIGJvb2xlYW4gZGVsZXRlUm93KCkKLQotcHVibGljIGJ5dGVbXSBnZXRCbG9iKAotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIGdldENvbHVtbk5hbWVzKCkKLQotcHVibGljIGludCBnZXRDb3VudCgpCi0KLXB1YmxpYyBkb3VibGUgZ2V0RG91YmxlKAotaW50KQotCi1wdWJsaWMgZmxvYXQgZ2V0RmxvYXQoCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0SW50KAotaW50KQotCi1wdWJsaWMgbG9uZyBnZXRMb25nKAotaW50KQotCi1wdWJsaWMgc2hvcnQgZ2V0U2hvcnQoCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygKLWludCkKLQotcHVibGljIGJvb2xlYW4gaXNOdWxsKAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBvbk1vdmUoCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgcmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoCi1hbmRyb2lkLmRhdGFiYXNlLkNvbnRlbnRPYnNlcnZlcikKLQotcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIoCi1hbmRyb2lkLmRhdGFiYXNlLkRhdGFTZXRPYnNlcnZlcikKLQotcHVibGljIGJvb2xlYW4gcmVxdWVyeSgpCi0KLXB1YmxpYyB2b2lkIHVucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoCi1hbmRyb2lkLmRhdGFiYXNlLkNvbnRlbnRPYnNlcnZlcikKLQotcHVibGljIHZvaWQgdW5yZWdpc3RlckRhdGFTZXRPYnNlcnZlcigKLWFuZHJvaWQuZGF0YWJhc2UuRGF0YVNldE9ic2VydmVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuZGF0YWJhc2UuU1FMRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuZGF0YWJhc2UuU3RhbGVEYXRhRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUV4Y2VwdGlvbiBleHRlbmRzIGFuZHJvaWQuZGF0YWJhc2UuU1FMRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVBYm9ydEV4Y2VwdGlvbiBleHRlbmRzIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlQ29uc3RyYWludEV4Y2VwdGlvbiBleHRlbmRzIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlQ3Vyc29yIGV4dGVuZHMgYW5kcm9pZC5kYXRhYmFzZS5BYnN0cmFjdFdpbmRvd2VkQ3Vyc29yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBmaW5hbCBpbnQgTk9fQ09VTlQKLQotc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEFHCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9JbnRlZ2VyOz47ICkKLXByaXZhdGUgamF2YS51dGlsLk1hcCBtQ29sdW1uTmFtZU1hcAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmdbXSBtQ29sdW1ucwotCi1wcml2YXRlIGludCBtQ291bnQKLQotcHJpdmF0ZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSBtRGF0YWJhc2UKLQotcHJpdmF0ZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVDdXJzb3JEcml2ZXIgbURyaXZlcgotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbUVkaXRUYWJsZQotCi1wcml2YXRlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZVF1ZXJ5IG1RdWVyeQotCi1wcml2YXRlIGphdmEubGFuZy5TdGFja1RyYWNlRWxlbWVudFtdIG1TdGFja1RyYWNlRWxlbWVudHMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZQotYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlQ3Vyc29yRHJpdmVyCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVRdWVyeSkKLQotcHJpdmF0ZSB2b2lkIGRlYWN0aXZhdGVDb21tb24oKQotCi1wcml2YXRlIHZvaWQgZmlsbFdpbmRvdygKLWludCkKLQotcHVibGljIHZvaWQgY2xvc2UoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL01hcDwrTGphdmEvbGFuZy9Mb25nOytMamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL09iamVjdDs+Oz47KVogKQotcHVibGljIGJvb2xlYW4gY29tbWl0VXBkYXRlcygKLWphdmEudXRpbC5NYXApCi0KLXB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKQotCi1wdWJsaWMgYm9vbGVhbiBkZWxldGVSb3coKQotCi1wcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpCi0KLXB1YmxpYyBpbnQgZ2V0Q29sdW1uSW5kZXgoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIGdldENvbHVtbk5hbWVzKCkKLQotcHVibGljIGludCBnZXRDb3VudCgpCi0KLXB1YmxpYyBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSBnZXREYXRhYmFzZSgpCi0KLXB1YmxpYyBib29sZWFuIG9uTW92ZSgKLWludAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiByZXF1ZXJ5KCkKLQotcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uQXJndW1lbnRzKAotamF2YS5sYW5nLlN0cmluZ1tdKQotCi1wdWJsaWMgdm9pZCBzZXRXaW5kb3coCi1hbmRyb2lkLmRhdGFiYXNlLkN1cnNvcldpbmRvdykKLQotcHVibGljIGJvb2xlYW4gc3VwcG9ydHNVcGRhdGVzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlQ3Vyc29yRHJpdmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGN1cnNvckNsb3NlZCgpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGN1cnNvckRlYWN0aXZhdGVkKCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgY3Vyc29yUmVxdWVyaWVkKAotYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IpCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciBxdWVyeSgKLWFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlJEN1cnNvckZhY3RvcnkKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0QmluZEFyZ3VtZW50cygKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YWJhc2U7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1DdXJzb3JGYWN0b3J5ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UkQ3Vyc29yRmFjdG9yeSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IgbmV3Q3Vyc29yKAotYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UKLWFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUN1cnNvckRyaXZlcgotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlUXVlcnkpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1TeW5jVXBkYXRlSW5mbyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YWJhc2U7ICkKLSBjbGFzcyBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSRTeW5jVXBkYXRlSW5mbyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGphdmEubGFuZy5TdHJpbmcgZGVsZXRlZFRhYmxlCi0KLSBqYXZhLmxhbmcuU3RyaW5nIGZvcmVpZ25LZXkKLQotIGphdmEubGFuZy5TdHJpbmcgbWFzdGVyVGFibGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlJEN1cnNvckZhY3Rvcnk7TGFuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlJFN5bmNVcGRhdGVJbmZvOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UgZXh0ZW5kcyBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVDbG9zYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDUkVBVEVfSUZfTkVDRVNTQVJZCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMT0NLX0FDUVVJUkVEX1dBUk5JTkdfVEhSRUFEX1RJTUVfSU5fTVMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExPQ0tfQUNRVUlSRURfV0FSTklOR19USU1FX0lOX01TCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMT0NLX0FDUVVJUkVEX1dBUk5JTkdfVElNRV9JTl9NU19BTFdBWVNfUFJJTlQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExPQ0tfV0FSTklOR19XSU5ET1dfSU5fTVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9fTE9DQUxJWkVEX0NPTExBVE9SUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUEVOX1JFQURPTkxZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QRU5fUkVBRFdSSVRFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPUEVOX1JFQURfTUFTSwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUUxJVEVfTUFYX0xJS0VfUEFUVEVSTl9MRU5HVEgKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLQotcHJpdmF0ZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSRDdXJzb3JGYWN0b3J5IG1GYWN0b3J5Ci0KLXByaXZhdGUgaW50IG1GbGFncwotCi1wcml2YXRlIGJvb2xlYW4gbUlubmVyVHJhbnNhY3Rpb25Jc1N1Y2Nlc3NmdWwKLQotcHJpdmF0ZSBsb25nIG1MYXN0TG9ja01lc3NhZ2VUaW1lCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24gbUxlYWtlZEV4Y2VwdGlvbgotCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudExvY2sgbUxvY2sKLQotcHJpdmF0ZSBsb25nIG1Mb2NrQWNxdWlyZWRUaHJlYWRUaW1lCi0KLXByaXZhdGUgbG9uZyBtTG9ja0FjcXVpcmVkV2FsbFRpbWUKLQotcHJpdmF0ZSBib29sZWFuIG1Mb2NraW5nRW5hYmxlZAotCi0gaW50IG1OYXRpdmVIYW5kbGUKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1QYXRoCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9XZWFrSGFzaE1hcDxMYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ2xvc2FibGU7TGphdmEvbGFuZy9PYmplY3Q7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuV2Vha0hhc2hNYXAgbVByb2dyYW1zCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TGFuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlJFN5bmNVcGRhdGVJbmZvOz47ICkKLXByaXZhdGUgZmluYWwgamF2YS51dGlsLk1hcCBtU3luY1VwZGF0ZUluZm8KLQotIGludCBtVGVtcFRhYmxlU2VxdWVuY2UKLQotcHJpdmF0ZSBib29sZWFuIG1UcmFuc2FjdGlvbklzU3VjY2Vzc2Z1bAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSRDdXJzb3JGYWN0b3J5Ci1pbnQpCi0KLXByaXZhdGUgdm9pZCBjaGVja0xvY2tIb2xkVGltZSgpCi0KLXByaXZhdGUgdm9pZCBjbG9zZUNsb3NhYmxlKCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSBjcmVhdGUoCi1hbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSRDdXJzb3JGYWN0b3J5KQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIGRiY2xvc2UoKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIGRib3BlbigKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGZpbmRFZGl0VGFibGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIGxvbmcgaW5zZXJ0T3JSZXBsYWNlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXMKLWJvb2xlYW4pCi0KLXByaXZhdGUgdm9pZCBsb2NrRm9yY2VkKCkKLQotcHJpdmF0ZSB2b2lkIG1hcmtUYWJsZVN5bmNhYmxlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSBvcGVuRGF0YWJhc2UoCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSRDdXJzb3JGYWN0b3J5Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2Ugb3Blbk9yQ3JlYXRlRGF0YWJhc2UoCi1qYXZhLmlvLkZpbGUKLWFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlJEN1cnNvckZhY3RvcnkpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2Ugb3Blbk9yQ3JlYXRlRGF0YWJhc2UoCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSRDdXJzb3JGYWN0b3J5KQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgcmVsZWFzZU1lbW9yeSgpCi0KLXByaXZhdGUgdm9pZCB1bmxvY2tGb3JjZWQoKQotCi0gdm9pZCBhZGRTUUxpdGVDbG9zYWJsZSgKLWFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUNsb3NhYmxlKQotCi1wdWJsaWMgdm9pZCBiZWdpblRyYW5zYWN0aW9uKCkKLQotcHVibGljIHZvaWQgY2xvc2UoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL2RhdGFiYXNlL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZVN0YXRlbWVudCBjb21waWxlU3RhdGVtZW50KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGludCBkZWxldGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLXB1YmxpYyB2b2lkIGVuZFRyYW5zYWN0aW9uKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9kYXRhYmFzZS9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGV4ZWNTUUwoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL2RhdGFiYXNlL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgZXhlY1NRTCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3RbXSkKLQotcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKQotCi1wdWJsaWMgbG9uZyBnZXRNYXhpbXVtU2l6ZSgpCi0KLXB1YmxpYyBsb25nIGdldFBhZ2VTaXplKCkKLQotcHVibGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgZ2V0UGF0aCgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wdWJsaWMgamF2YS51dGlsLk1hcCBnZXRTeW5jZWRUYWJsZXMoKQotCi1wdWJsaWMgaW50IGdldFZlcnNpb24oKQotCi1wdWJsaWMgYm9vbGVhbiBpblRyYW5zYWN0aW9uKCkKLQotcHVibGljIGxvbmcgaW5zZXJ0KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvZGF0YWJhc2UvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgbG9uZyBpbnNlcnRPclRocm93KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXMpCi0KLXB1YmxpYyBib29sZWFuIGlzRGJMb2NrZWRCeUN1cnJlbnRUaHJlYWQoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0RiTG9ja2VkQnlPdGhlclRocmVhZHMoKQotCi1wdWJsaWMgYm9vbGVhbiBpc09wZW4oKQotCi1wdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkKLQotbmF0aXZlIGludCBsYXN0Q2hhbmdlQ291bnQoKQotCi1uYXRpdmUgbG9uZyBsYXN0SW5zZXJ0Um93KCkKLQotIHZvaWQgbG9jaygpCi0KLXB1YmxpYyB2b2lkIG1hcmtUYWJsZVN5bmNhYmxlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgbWFya1RhYmxlU3luY2FibGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL2RhdGFiYXNlL1NRTEV4Y2VwdGlvbjsgKQotbmF0aXZlIHZvaWQgbmF0aXZlX2V4ZWNTUUwoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1uYXRpdmUgdm9pZCBuYXRpdmVfc2V0TG9jYWxlKAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBuZWVkVXBncmFkZSgKLWludCkKLQotcHJvdGVjdGVkIHZvaWQgb25BbGxSZWZlcmVuY2VzUmVsZWFzZWQoKQotCi0gdm9pZCBvbkNvcnJ1cHRpb24oKQotCi1wdWJsaWMgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IgcXVlcnkoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nW10KLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmdbXQotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIHF1ZXJ5KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZ1tdCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nW10KLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciBxdWVyeSgKLWJvb2xlYW4KLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmdbXQotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZ1tdCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IgcXVlcnlXaXRoRmFjdG9yeSgKLWFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlJEN1cnNvckZhY3RvcnkKLWJvb2xlYW4KLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmdbXQotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZ1tdCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IgcmF3UXVlcnkoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLXB1YmxpYyBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciByYXdRdWVyeVdpdGhGYWN0b3J5KAotYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UkQ3Vyc29yRmFjdG9yeQotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZ1tdCi1qYXZhLmxhbmcuU3RyaW5nKQotCi0gdm9pZCByZW1vdmVTUUxpdGVDbG9zYWJsZSgKLWFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUNsb3NhYmxlKQotCi1wdWJsaWMgbG9uZyByZXBsYWNlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvZGF0YWJhc2UvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgbG9uZyByZXBsYWNlT3JUaHJvdygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzKQotCi0gdm9pZCByb3dVcGRhdGVkKAotamF2YS5sYW5nLlN0cmluZwotbG9uZykKLQotcHVibGljIHZvaWQgc2V0TG9jYWxlKAotamF2YS51dGlsLkxvY2FsZSkKLQotcHVibGljIHZvaWQgc2V0TG9ja2luZ0VuYWJsZWQoCi1ib29sZWFuKQotCi1wdWJsaWMgbG9uZyBzZXRNYXhpbXVtU2l6ZSgKLWxvbmcpCi0KLXB1YmxpYyB2b2lkIHNldFBhZ2VTaXplKAotbG9uZykKLQotcHVibGljIHZvaWQgc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCkKLQotcHVibGljIHZvaWQgc2V0VmVyc2lvbigKLWludCkKLQotIHZvaWQgdW5sb2NrKCkKLQotcHVibGljIGludCB1cGRhdGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlcwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZ1tdKQotCi1wdWJsaWMgYm9vbGVhbiB5aWVsZElmQ29udGVuZGVkKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZUNvcnJ1cHRFeGNlcHRpb24gZXh0ZW5kcyBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVFeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEZWJ1ZzsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPVBhZ2VyU3RhdHMgKQotcHVibGljIGNsYXNzIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURlYnVnJFBhZ2VyU3RhdHMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBsb25nIGRhdGFiYXNlQnl0ZXMKLQotcHVibGljIGludCBudW1QYWdlcnMKLQotcHVibGljIGxvbmcgcmVmZXJlbmNlZEJ5dGVzCi0KLXB1YmxpYyBsb25nIHRvdGFsQnl0ZXMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURlYnVnJFBhZ2VyU3RhdHM7ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEZWJ1ZyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX0FDVElWRV9DVVJTT1JfRklOQUxJWkFUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19MT0NLX1RJTUVfVFJBQ0tJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX0xPQ0tfVElNRV9UUkFDS0lOR19TVEFDS19UUkFDRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfU1FMX1NUQVRFTUVOVFMKLQotcHJpdmF0ZSBzdGF0aWMgaW50IHNOdW1BY3RpdmVDdXJzb3JzRmluYWxpemVkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBsb25nIGdldEhlYXBBbGxvY2F0ZWRTaXplKCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBnZXRIZWFwRGlydHlQYWdlcygKLWludFtdKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBsb25nIGdldEhlYXBGcmVlU2l6ZSgpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGxvbmcgZ2V0SGVhcFNpemUoKQotCi1wdWJsaWMgc3RhdGljIGludCBnZXROdW1BY3RpdmVDdXJzb3JzRmluYWxpemVkKCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBnZXRQYWdlclN0YXRzKAotYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGVidWckUGFnZXJTdGF0cykKLQotc3RhdGljIHZvaWQgbm90aWZ5QWN0aXZlQ3Vyc29yRmluYWxpemVkKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEaXJlY3RDdXJzb3JEcml2ZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlQ3Vyc29yRHJpdmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgVEFHCi0KLXByaXZhdGUgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IgbUN1cnNvcgotCi1wcml2YXRlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlIG1EYXRhYmFzZQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbUVkaXRUYWJsZQotCi1wcml2YXRlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZVF1ZXJ5IG1RdWVyeQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbVNxbAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIGN1cnNvckNsb3NlZCgpCi0KLXB1YmxpYyB2b2lkIGN1cnNvckRlYWN0aXZhdGVkKCkKLQotcHVibGljIHZvaWQgY3Vyc29yUmVxdWVyaWVkKAotYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IpCi0KLXB1YmxpYyBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciBxdWVyeSgKLWFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlJEN1cnNvckZhY3RvcnkKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotcHVibGljIHZvaWQgc2V0QmluZEFyZ3VtZW50cygKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURpc2tJT0V4Y2VwdGlvbiBleHRlbmRzIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRG9uZUV4Y2VwdGlvbiBleHRlbmRzIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRnVsbEV4Y2VwdGlvbiBleHRlbmRzIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlTWlzdXNlRXhjZXB0aW9uIGV4dGVuZHMgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVQcm9ncmFtIGV4dGVuZHMgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlQ2xvc2FibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEFHCi0KLXByb3RlY3RlZCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSBtRGF0YWJhc2UKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RhY2tUcmFjZUVsZW1lbnRbXSBtU3RhY2tUcmFjZUVsZW1lbnRzCi0KLXByb3RlY3RlZCBpbnQgbkhhbmRsZQotCi1wcm90ZWN0ZWQgaW50IG5TdGF0ZW1lbnQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZQotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBmaW5hbCBuYXRpdmUgdm9pZCBuYXRpdmVfY2xlYXJfYmluZGluZ3MoKQotCi1wdWJsaWMgdm9pZCBiaW5kQmxvYigKLWludAotYnl0ZVtdKQotCi1wdWJsaWMgdm9pZCBiaW5kRG91YmxlKAotaW50Ci1kb3VibGUpCi0KLXB1YmxpYyB2b2lkIGJpbmRMb25nKAotaW50Ci1sb25nKQotCi1wdWJsaWMgdm9pZCBiaW5kTnVsbCgKLWludCkKLQotcHVibGljIHZvaWQgYmluZFN0cmluZygKLWludAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgY2xlYXJCaW5kaW5ncygpCi0KLXB1YmxpYyB2b2lkIGNsb3NlKCkKLQotcHJvdGVjdGVkIHZvaWQgY29tcGlsZSgKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4pCi0KLXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkKLQotcHVibGljIGZpbmFsIGludCBnZXRVbmlxdWVJZCgpCi0KLXByb3RlY3RlZCBmaW5hbCBuYXRpdmUgdm9pZCBuYXRpdmVfYmluZF9ibG9iKAotaW50Ci1ieXRlW10pCi0KLXByb3RlY3RlZCBmaW5hbCBuYXRpdmUgdm9pZCBuYXRpdmVfYmluZF9kb3VibGUoCi1pbnQKLWRvdWJsZSkKLQotcHJvdGVjdGVkIGZpbmFsIG5hdGl2ZSB2b2lkIG5hdGl2ZV9iaW5kX2xvbmcoCi1pbnQKLWxvbmcpCi0KLXByb3RlY3RlZCBmaW5hbCBuYXRpdmUgdm9pZCBuYXRpdmVfYmluZF9udWxsKAotaW50KQotCi1wcm90ZWN0ZWQgZmluYWwgbmF0aXZlIHZvaWQgbmF0aXZlX2JpbmRfc3RyaW5nKAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcm90ZWN0ZWQgZmluYWwgbmF0aXZlIHZvaWQgbmF0aXZlX2NvbXBpbGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcm90ZWN0ZWQgZmluYWwgbmF0aXZlIHZvaWQgbmF0aXZlX2ZpbmFsaXplKCkKLQotcHJvdGVjdGVkIHZvaWQgb25BbGxSZWZlcmVuY2VzUmVsZWFzZWQoKQotCi1wcm90ZWN0ZWQgdm9pZCBvbkFsbFJlZmVyZW5jZXNSZWxlYXNlZEZyb21Db250YWluZXIoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZVF1ZXJ5IGV4dGVuZHMgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlUHJvZ3JhbQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmdbXSBtQmluZEFyZ3MKLQotcHJpdmF0ZSBib29sZWFuIG1DbG9zZWQKLQotcHJpdmF0ZSBpbnQgbU9mZnNldEluZGV4Ci0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtUXVlcnkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZQotamF2YS5sYW5nLlN0cmluZwotaW50Ci1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLXByaXZhdGUgZmluYWwgbmF0aXZlIGludCBuYXRpdmVfY29sdW1uX2NvdW50KCkKLQotcHJpdmF0ZSBmaW5hbCBuYXRpdmUgamF2YS5sYW5nLlN0cmluZyBuYXRpdmVfY29sdW1uX25hbWUoCi1pbnQpCi0KLXByaXZhdGUgZmluYWwgbmF0aXZlIGludCBuYXRpdmVfZmlsbF93aW5kb3coCi1hbmRyb2lkLmRhdGFiYXNlLkN1cnNvcldpbmRvdwotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIGJpbmREb3VibGUoCi1pbnQKLWRvdWJsZSkKLQotcHVibGljIHZvaWQgYmluZExvbmcoCi1pbnQKLWxvbmcpCi0KLXB1YmxpYyB2b2lkIGJpbmROdWxsKAotaW50KQotCi1wdWJsaWMgdm9pZCBiaW5kU3RyaW5nKAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBjbG9zZSgpCi0KLSBpbnQgY29sdW1uQ291bnRMb2NrZWQoKQotCi0gamF2YS5sYW5nLlN0cmluZyBjb2x1bW5OYW1lTG9ja2VkKAotaW50KQotCi0gaW50IGZpbGxXaW5kb3coCi1hbmRyb2lkLmRhdGFiYXNlLkN1cnNvcldpbmRvdwotaW50KQotCi0gdm9pZCByZXF1ZXJ5KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVRdWVyeUJ1aWxkZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEFHCi0KLXByaXZhdGUgYm9vbGVhbiBtRGlzdGluY3QKLQotcHJpdmF0ZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSRDdXJzb3JGYWN0b3J5IG1GYWN0b3J5Ci1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuTWFwIG1Qcm9qZWN0aW9uTWFwCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtVGFibGVzCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIgbVdoZXJlQ2xhdXNlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBhcHBlbmRDbGF1c2UoCi1qYXZhLmxhbmcuU3RyaW5nQnVpbGRlcgotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBhcHBlbmRDbGF1c2VFc2NhcGVDbGF1c2UoCi1qYXZhLmxhbmcuU3RyaW5nQnVpbGRlcgotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyB2b2lkIGFwcGVuZENvbHVtbnMoCi1qYXZhLmxhbmcuU3RyaW5nQnVpbGRlcgotamF2YS5sYW5nLlN0cmluZ1tdKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgYnVpbGRRdWVyeVN0cmluZygKLWJvb2xlYW4KLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmdbXQotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nW10gY29tcHV0ZVByb2plY3Rpb24oCi1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLXB1YmxpYyB2b2lkIGFwcGVuZFdoZXJlKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotcHVibGljIHZvaWQgYXBwZW5kV2hlcmVFc2NhcGVTdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBidWlsZFF1ZXJ5KAotamF2YS5sYW5nLlN0cmluZ1tdCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nW10KLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGJ1aWxkVW5pb25RdWVyeSgKLWphdmEubGFuZy5TdHJpbmdbXQotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9TdHJpbmc7W0xqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL3V0aWwvU2V0PExqYXZhL2xhbmcvU3RyaW5nOz47SUxqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nO1tMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmc7ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGJ1aWxkVW5pb25TdWJRdWVyeSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmdbXQotamF2YS51dGlsLlNldAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nW10KLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFRhYmxlcygpCi0KLXB1YmxpYyBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciBxdWVyeSgKLWFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlCi1qYXZhLmxhbmcuU3RyaW5nW10KLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmdbXQotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIHF1ZXJ5KAotYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UKLWphdmEubGFuZy5TdHJpbmdbXQotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZ1tdCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRDdXJzb3JGYWN0b3J5KAotYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UkQ3Vyc29yRmFjdG9yeSkKLQotcHVibGljIHZvaWQgc2V0RGlzdGluY3QoCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzs+OylWICkKLXB1YmxpYyB2b2lkIHNldFByb2plY3Rpb25NYXAoCi1qYXZhLnV0aWwuTWFwKQotCi1wdWJsaWMgdm9pZCBzZXRUYWJsZXMoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZVN0YXRlbWVudCBleHRlbmRzIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZVByb2dyYW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZQotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBmaW5hbCBuYXRpdmUgbG9uZyBuYXRpdmVfMXgxX2xvbmcoKQotCi1wcml2YXRlIGZpbmFsIG5hdGl2ZSBqYXZhLmxhbmcuU3RyaW5nIG5hdGl2ZV8xeDFfc3RyaW5nKCkKLQotcHJpdmF0ZSBmaW5hbCBuYXRpdmUgdm9pZCBuYXRpdmVfZXhlY3V0ZSgpCi0KLXB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotCi1wdWJsaWMgbG9uZyBleGVjdXRlSW5zZXJ0KCkKLQotcHVibGljIGxvbmcgc2ltcGxlUXVlcnlGb3JMb25nKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgc2ltcGxlUXVlcnlGb3JTdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuZGRtLkRkbUhhbmRsZUFwcE5hbWUgZXh0ZW5kcyBvcmcuYXBhY2hlLmhhcm1vbnkuZGFsdmlrLmRkbWMuQ2h1bmtIYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIVU5LX0FQTk0KLQotcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgamF2YS5sYW5nLlN0cmluZyBtQXBwTmFtZQotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLmRkbS5EZG1IYW5kbGVBcHBOYW1lIG1JbnN0YW5jZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRBcHBOYW1lKCkKLQotcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyKCkKLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZW5kQVBOTSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRBcHBOYW1lKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgY29ubmVjdGVkKCkKLQotcHVibGljIHZvaWQgZGlzY29ubmVjdGVkKCkKLQotcHVibGljIG9yZy5hcGFjaGUuaGFybW9ueS5kYWx2aWsuZGRtYy5DaHVuayBoYW5kbGVDaHVuaygKLW9yZy5hcGFjaGUuaGFybW9ueS5kYWx2aWsuZGRtYy5DaHVuaykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmRkbS5EZG1IYW5kbGVFeGl0IGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LmRhbHZpay5kZG1jLkNodW5rSGFuZGxlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSFVOS19FWElUCi0KLXByaXZhdGUgc3RhdGljIGFuZHJvaWQuZGRtLkRkbUhhbmRsZUV4aXQgbUluc3RhbmNlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyKCkKLQotcHVibGljIHZvaWQgY29ubmVjdGVkKCkKLQotcHVibGljIHZvaWQgZGlzY29ubmVjdGVkKCkKLQotcHVibGljIG9yZy5hcGFjaGUuaGFybW9ueS5kYWx2aWsuZGRtYy5DaHVuayBoYW5kbGVDaHVuaygKLW9yZy5hcGFjaGUuaGFybW9ueS5kYWx2aWsuZGRtYy5DaHVuaykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmRkbS5EZG1IYW5kbGVIZWFwIGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LmRhbHZpay5kZG1jLkNodW5rSGFuZGxlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSFVOS19IUEdDCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIVU5LX0hQSUYKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hVTktfSFBTRwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSFVOS19OSFNHCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIVU5LX1JFQUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hVTktfUkVBTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSFVOS19SRUFRCi0KLXByaXZhdGUgc3RhdGljIGFuZHJvaWQuZGRtLkRkbUhhbmRsZUhlYXAgbUluc3RhbmNlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSBvcmcuYXBhY2hlLmhhcm1vbnkuZGFsdmlrLmRkbWMuQ2h1bmsgaGFuZGxlSFBHQygKLW9yZy5hcGFjaGUuaGFybW9ueS5kYWx2aWsuZGRtYy5DaHVuaykKLQotcHJpdmF0ZSBvcmcuYXBhY2hlLmhhcm1vbnkuZGFsdmlrLmRkbWMuQ2h1bmsgaGFuZGxlSFBJRigKLW9yZy5hcGFjaGUuaGFybW9ueS5kYWx2aWsuZGRtYy5DaHVuaykKLQotcHJpdmF0ZSBvcmcuYXBhY2hlLmhhcm1vbnkuZGFsdmlrLmRkbWMuQ2h1bmsgaGFuZGxlSFBTR05IU0coCi1vcmcuYXBhY2hlLmhhcm1vbnkuZGFsdmlrLmRkbWMuQ2h1bmsKLWJvb2xlYW4pCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5oYXJtb255LmRhbHZpay5kZG1jLkNodW5rIGhhbmRsZVJFQUUoCi1vcmcuYXBhY2hlLmhhcm1vbnkuZGFsdmlrLmRkbWMuQ2h1bmspCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5oYXJtb255LmRhbHZpay5kZG1jLkNodW5rIGhhbmRsZVJFQUwoCi1vcmcuYXBhY2hlLmhhcm1vbnkuZGFsdmlrLmRkbWMuQ2h1bmspCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5oYXJtb255LmRhbHZpay5kZG1jLkNodW5rIGhhbmRsZVJFQVEoCi1vcmcuYXBhY2hlLmhhcm1vbnkuZGFsdmlrLmRkbWMuQ2h1bmspCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcigpCi0KLXB1YmxpYyB2b2lkIGNvbm5lY3RlZCgpCi0KLXB1YmxpYyB2b2lkIGRpc2Nvbm5lY3RlZCgpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmhhcm1vbnkuZGFsdmlrLmRkbWMuQ2h1bmsgaGFuZGxlQ2h1bmsoCi1vcmcuYXBhY2hlLmhhcm1vbnkuZGFsdmlrLmRkbWMuQ2h1bmspCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5kZG0uRGRtSGFuZGxlSGVsbG8gZXh0ZW5kcyBvcmcuYXBhY2hlLmhhcm1vbnkuZGFsdmlrLmRkbWMuQ2h1bmtIYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIVU5LX0hFTE8KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hVTktfV0FJVAotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLmRkbS5EZG1IYW5kbGVIZWxsbyBtSW5zdGFuY2UKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXIoKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgc2VuZFdBSVQoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGNvbm5lY3RlZCgpCi0KLXB1YmxpYyB2b2lkIGRpc2Nvbm5lY3RlZCgpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmhhcm1vbnkuZGFsdmlrLmRkbWMuQ2h1bmsgaGFuZGxlQ2h1bmsoCi1vcmcuYXBhY2hlLmhhcm1vbnkuZGFsdmlrLmRkbWMuQ2h1bmspCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5kZG0uRGRtSGFuZGxlTmF0aXZlSGVhcCBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS5kYWx2aWsuZGRtYy5DaHVua0hhbmRsZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hVTktfTkhHVAotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLmRkbS5EZG1IYW5kbGVOYXRpdmVIZWFwIG1JbnN0YW5jZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgbmF0aXZlIGJ5dGVbXSBnZXRMZWFrSW5mbygpCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5oYXJtb255LmRhbHZpay5kZG1jLkNodW5rIGhhbmRsZU5IR1QoCi1vcmcuYXBhY2hlLmhhcm1vbnkuZGFsdmlrLmRkbWMuQ2h1bmspCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcigpCi0KLXB1YmxpYyB2b2lkIGNvbm5lY3RlZCgpCi0KLXB1YmxpYyB2b2lkIGRpc2Nvbm5lY3RlZCgpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmhhcm1vbnkuZGFsdmlrLmRkbWMuQ2h1bmsgaGFuZGxlQ2h1bmsoCi1vcmcuYXBhY2hlLmhhcm1vbnkuZGFsdmlrLmRkbWMuQ2h1bmspCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5kZG0uRGRtSGFuZGxlVGhyZWFkIGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LmRhbHZpay5kZG1jLkNodW5rSGFuZGxlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSFVOS19TVEtMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIVU5LX1RIQ1IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hVTktfVEhERQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSFVOS19USEVOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIVU5LX1RIU1QKLQotcHJpdmF0ZSBzdGF0aWMgYW5kcm9pZC5kZG0uRGRtSGFuZGxlVGhyZWFkIG1JbnN0YW5jZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5oYXJtb255LmRhbHZpay5kZG1jLkNodW5rIGNyZWF0ZVN0YWNrQ2h1bmsoCi1qYXZhLmxhbmcuU3RhY2tUcmFjZUVsZW1lbnRbXQotaW50KQotCi1wcml2YXRlIG9yZy5hcGFjaGUuaGFybW9ueS5kYWx2aWsuZGRtYy5DaHVuayBoYW5kbGVTVEtMKAotb3JnLmFwYWNoZS5oYXJtb255LmRhbHZpay5kZG1jLkNodW5rKQotCi1wcml2YXRlIG9yZy5hcGFjaGUuaGFybW9ueS5kYWx2aWsuZGRtYy5DaHVuayBoYW5kbGVUSEVOKAotb3JnLmFwYWNoZS5oYXJtb255LmRhbHZpay5kZG1jLkNodW5rKQotCi1wcml2YXRlIG9yZy5hcGFjaGUuaGFybW9ueS5kYWx2aWsuZGRtYy5DaHVuayBoYW5kbGVUSFNUKAotb3JnLmFwYWNoZS5oYXJtb255LmRhbHZpay5kZG1jLkNodW5rKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXIoKQotCi1wdWJsaWMgdm9pZCBjb25uZWN0ZWQoKQotCi1wdWJsaWMgdm9pZCBkaXNjb25uZWN0ZWQoKQotCi1wdWJsaWMgb3JnLmFwYWNoZS5oYXJtb255LmRhbHZpay5kZG1jLkNodW5rIGhhbmRsZUNodW5rKAotb3JnLmFwYWNoZS5oYXJtb255LmRhbHZpay5kZG1jLkNodW5rKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuZGRtLkRkbVJlZ2lzdGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXJIYW5kbGVycygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5kZWJ1Zy5KTklUZXN0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgbmF0aXZlIGludCBwYXJ0MSgKLWludAotZG91YmxlCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnRbXSkKLQotcHJpdmF0ZSBpbnQgcGFydDIoCi1kb3VibGUKLWludAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBwYXJ0MygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBpbnQgdGVzdCgKLWludAotZG91YmxlCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuZHJtLm1vYmlsZTEuRHJtQ29uc3RyYWludEluZm8gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgaW50IGNvdW50Ci0KLXByaXZhdGUgbG9uZyBlbmREYXRlCi0KLXByaXZhdGUgbG9uZyBpbnRlcnZhbAotCi1wcml2YXRlIGxvbmcgc3RhcnREYXRlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGludCBnZXRDb3VudCgpCi0KLXB1YmxpYyBqYXZhLnV0aWwuRGF0ZSBnZXRFbmREYXRlKCkKLQotcHVibGljIGxvbmcgZ2V0SW50ZXJ2YWwoKQotCi1wdWJsaWMgamF2YS51dGlsLkRhdGUgZ2V0U3RhcnREYXRlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmRybS5tb2JpbGUxLkRybUV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5FeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9kcm0vbW9iaWxlMS9Ecm1SYXdDb250ZW50OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9RHJtSW5wdXRTdHJlYW0gKQotIGNsYXNzIGFuZHJvaWQuZHJtLm1vYmlsZTEuRHJtUmF3Q29udGVudCREcm1JbnB1dFN0cmVhbSBleHRlbmRzIGphdmEuaW8uSW5wdXRTdHJlYW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBieXRlW10gYgotCi1wcml2YXRlIGJvb2xlYW4gaXNDbG9zZWQKLQotcHJpdmF0ZSBpbnQgb2Zmc2V0Ci0KLWZpbmFsIGFuZHJvaWQuZHJtLm1vYmlsZTEuRHJtUmF3Q29udGVudCB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmRybS5tb2JpbGUxLkRybVJhd0NvbnRlbnQKLWFuZHJvaWQuZHJtLm1vYmlsZTEuRHJtUmlnaHRzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGF2YWlsYWJsZSgpCi0KLXB1YmxpYyB2b2lkIGNsb3NlKCkKLQotcHVibGljIHZvaWQgbWFyaygKLWludCkKLQotcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcmVhZCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcmVhZCgKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCByZWFkKAotYnl0ZVtdCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcmVzZXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgbG9uZyBza2lwKAotbG9uZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL2RybS9tb2JpbGUxL0RybVJhd0NvbnRlbnQkRHJtSW5wdXRTdHJlYW07ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmRybS5tb2JpbGUxLkRybVJhd0NvbnRlbnQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERSTV9DT01CSU5FRF9ERUxJVkVSWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBEUk1fRk9SV0FSRF9MT0NLCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEUk1fTUlNRVRZUEVfQ09OVEVOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRFJNX01JTUVUWVBFX0NPTlRFTlRfU1RSSU5HCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEUk1fTUlNRVRZUEVfTUVTU0FHRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRFJNX01JTUVUWVBFX01FU1NBR0VfU1RSSU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERSTV9TRVBBUkFURV9ERUxJVkVSWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBEUk1fU0VQQVJBVEVfREVMSVZFUllfRE0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRFJNX1VOS05PV05fREFUQV9MRU4KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEpOSV9EUk1fRU9GCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBKTklfRFJNX0ZBSUxVUkUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEpOSV9EUk1fU1VDQ0VTUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSk5JX0RSTV9VTktOT1dOX0RBVEFfTEVOCi0KLXByaXZhdGUgaW50IGlkCi0KLXByaXZhdGUgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtIGluRGF0YQotCi1wcml2YXRlIGludCBpbkRhdGFMZW4KLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1lZGlhVHlwZQotCi1wcml2YXRlIGludCByYXdUeXBlCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByaWdodHNJc3N1ZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvZHJtL21vYmlsZTEvRHJtRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmlvLklucHV0U3RyZWFtCi1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDAwMCgKLWFuZHJvaWQuZHJtLm1vYmlsZTEuRHJtUmF3Q29udGVudCkKLQotc3RhdGljIGludCBhY2Nlc3MkMTAwKAotYW5kcm9pZC5kcm0ubW9iaWxlMS5Ecm1SYXdDb250ZW50Ci1ieXRlW10KLWludAotaW50Ci1pbnQpCi0KLXByaXZhdGUgbmF0aXZlIGludCBuYXRpdmVDb25zdHJ1Y3REcm1Db250ZW50KAotamF2YS5pby5JbnB1dFN0cmVhbQotaW50Ci1pbnQpCi0KLXByaXZhdGUgbmF0aXZlIGludCBuYXRpdmVHZXRDb250ZW50TGVuZ3RoKCkKLQotcHJpdmF0ZSBuYXRpdmUgamF2YS5sYW5nLlN0cmluZyBuYXRpdmVHZXRDb250ZW50VHlwZSgpCi0KLXByaXZhdGUgbmF0aXZlIGludCBuYXRpdmVHZXREZWxpdmVyeU1ldGhvZCgpCi0KLXByaXZhdGUgbmF0aXZlIGphdmEubGFuZy5TdHJpbmcgbmF0aXZlR2V0UmlnaHRzQWRkcmVzcygpCi0KLXByaXZhdGUgbmF0aXZlIGludCBuYXRpdmVSZWFkQ29udGVudCgKLWJ5dGVbXQotaW50Ci1pbnQKLWludCkKLQotcHJvdGVjdGVkIG5hdGl2ZSB2b2lkIGZpbmFsaXplKCkKLQotcHVibGljIGphdmEuaW8uSW5wdXRTdHJlYW0gZ2V0Q29udGVudElucHV0U3RyZWFtKAotYW5kcm9pZC5kcm0ubW9iaWxlMS5Ecm1SaWdodHMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvZHJtL21vYmlsZTEvRHJtRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGdldENvbnRlbnRMZW5ndGgoCi1hbmRyb2lkLmRybS5tb2JpbGUxLkRybVJpZ2h0cykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Q29udGVudFR5cGUoKQotCi1wdWJsaWMgaW50IGdldFJhd1R5cGUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRSaWdodHNBZGRyZXNzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmRybS5tb2JpbGUxLkRybVJpZ2h0cyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRFJNX1BFUk1JU1NJT05fRElTUExBWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBEUk1fUEVSTUlTU0lPTl9FWEVDVVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERSTV9QRVJNSVNTSU9OX1BMQVkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRFJNX1BFUk1JU1NJT05fUFJJTlQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEpOSV9EUk1fRkFJTFVSRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSk5JX0RSTV9TVUNDRVNTCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByb0lkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIG5hdGl2ZSBpbnQgbmF0aXZlQ29uc3VtZVJpZ2h0cygKLWludCkKLQotcHJpdmF0ZSBuYXRpdmUgaW50IG5hdGl2ZUdldENvbnN0cmFpbnRJbmZvKAotaW50Ci1hbmRyb2lkLmRybS5tb2JpbGUxLkRybUNvbnN0cmFpbnRJbmZvKQotCi1wdWJsaWMgYm9vbGVhbiBjb25zdW1lUmlnaHRzKAotaW50KQotCi1wdWJsaWMgYW5kcm9pZC5kcm0ubW9iaWxlMS5Ecm1Db25zdHJhaW50SW5mbyBnZXRDb25zdHJhaW50KAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuZHJtLm1vYmlsZTEuRHJtUmlnaHRzTWFuYWdlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERSTV9NSU1FVFlQRV9NRVNTQUdFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEUk1fTUlNRVRZUEVfUklHSFRTX1dCWE1MCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBEUk1fTUlNRVRZUEVfUklHSFRTX1dCWE1MX1NUUklORwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRFJNX01JTUVUWVBFX1JJR0hUU19YTUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERSTV9NSU1FVFlQRV9SSUdIVFNfWE1MX1NUUklORwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSk5JX0RSTV9GQUlMVVJFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBKTklfRFJNX1NVQ0NFU1MKLQotcHJpdmF0ZSBzdGF0aWMgYW5kcm9pZC5kcm0ubW9iaWxlMS5Ecm1SaWdodHNNYW5hZ2VyIHNpbmdsZXRvbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmRybS5tb2JpbGUxLkRybVJpZ2h0c01hbmFnZXIgZ2V0SW5zdGFuY2UoKQotCi1wcml2YXRlIG5hdGl2ZSBpbnQgbmF0aXZlRGVsZXRlUmlnaHRzKAotYW5kcm9pZC5kcm0ubW9iaWxlMS5Ecm1SaWdodHMpCi0KLXByaXZhdGUgbmF0aXZlIGludCBuYXRpdmVHZXROdW1PZlJpZ2h0cygpCi0KLXByaXZhdGUgbmF0aXZlIGludCBuYXRpdmVHZXRSaWdodHNMaXN0KAotYW5kcm9pZC5kcm0ubW9iaWxlMS5Ecm1SaWdodHNbXQotaW50KQotCi1wcml2YXRlIG5hdGl2ZSBpbnQgbmF0aXZlSW5zdGFsbERybVJpZ2h0cygKLWphdmEuaW8uSW5wdXRTdHJlYW0KLWludAotaW50Ci1hbmRyb2lkLmRybS5tb2JpbGUxLkRybVJpZ2h0cykKLQotcHJpdmF0ZSBuYXRpdmUgaW50IG5hdGl2ZVF1ZXJ5UmlnaHRzKAotYW5kcm9pZC5kcm0ubW9iaWxlMS5Ecm1SYXdDb250ZW50Ci1hbmRyb2lkLmRybS5tb2JpbGUxLkRybVJpZ2h0cykKLQotcHVibGljIHZvaWQgZGVsZXRlUmlnaHRzKAotYW5kcm9pZC5kcm0ubW9iaWxlMS5Ecm1SaWdodHMpCi0KLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRSaWdodHNMaXN0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9kcm0vbW9iaWxlMS9Ecm1FeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhbmRyb2lkLmRybS5tb2JpbGUxLkRybVJpZ2h0cyBpbnN0YWxsUmlnaHRzKAotamF2YS5pby5JbnB1dFN0cmVhbQotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYW5kcm9pZC5kcm0ubW9iaWxlMS5Ecm1SaWdodHMgcXVlcnlSaWdodHMoCi1hbmRyb2lkLmRybS5tb2JpbGUxLkRybVJhd0NvbnRlbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvZ3JhcGhpY3MvQXZvaWRYZmVybW9kZTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvRW51bTxMYW5kcm9pZC9ncmFwaGljcy9Bdm9pZFhmZXJtb2RlJE1vZGU7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNjQwOSBuYW1lID1Nb2RlICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLmdyYXBoaWNzLkF2b2lkWGZlcm1vZGUkTW9kZSBleHRlbmRzIGphdmEubGFuZy5FbnVtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuQXZvaWRYZmVybW9kZSRNb2RlW10gJFZBTFVFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuQXZvaWRYZmVybW9kZSRNb2RlIEFWT0lECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5Bdm9pZFhmZXJtb2RlJE1vZGUgVEFSR0VUCi0KLWZpbmFsIGludCBuYXRpdmVJbnQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KEkpViApCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5Bdm9pZFhmZXJtb2RlJE1vZGUgdmFsdWVPZigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5Bdm9pZFhmZXJtb2RlJE1vZGVbXSB2YWx1ZXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuZ3JhcGhpY3MuWGZlcm1vZGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBpbnQgbmF0aXZlX2luc3RhbmNlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgZmluYWxpemVyKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvVGhyb3dhYmxlOyApCi1wcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9ncmFwaGljcy9Bdm9pZFhmZXJtb2RlJE1vZGU7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmdyYXBoaWNzLkF2b2lkWGZlcm1vZGUgZXh0ZW5kcyBhbmRyb2lkLmdyYXBoaWNzLlhmZXJtb2RlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50Ci1pbnQKLWFuZHJvaWQuZ3JhcGhpY3MuQXZvaWRYZmVybW9kZSRNb2RlKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZUNyZWF0ZSgKLWludAotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC9ncmFwaGljcy9CaXRtYXA7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvZ3JhcGhpY3MvQml0bWFwOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1maW5hbCBjbGFzcyBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwIGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBbXSBuZXdBcnJheSgKLWludCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3RbXSBuZXdBcnJheSgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9ncmFwaGljcy9CaXRtYXA7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL0VudW08TGFuZHJvaWQvZ3JhcGhpY3MvQml0bWFwJENvbXByZXNzRm9ybWF0Oz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTY0MDkgbmFtZSA9Q29tcHJlc3NGb3JtYXQgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwJENvbXByZXNzRm9ybWF0IGV4dGVuZHMgamF2YS5sYW5nLkVudW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAkQ29tcHJlc3NGb3JtYXRbXSAkVkFMVUVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAkQ29tcHJlc3NGb3JtYXQgSlBFRwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwJENvbXByZXNzRm9ybWF0IFBORwotCi1maW5hbCBpbnQgbmF0aXZlSW50Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJKVYgKQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwJENvbXByZXNzRm9ybWF0IHZhbHVlT2YoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwJENvbXByZXNzRm9ybWF0W10gdmFsdWVzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE2NDA5IG5hbWUgPUNvbmZpZyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9FbnVtPExhbmRyb2lkL2dyYXBoaWNzL0JpdG1hcCRDb25maWc7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvZ3JhcGhpY3MvQml0bWFwOyApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAkQ29uZmlnIGV4dGVuZHMgamF2YS5sYW5nLkVudW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAkQ29uZmlnW10gJFZBTFVFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwJENvbmZpZyBBTFBIQV84Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAkQ29uZmlnIEFSR0JfNDQ0NAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwJENvbmZpZyBBUkdCXzg4ODgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCRDb25maWcgUkdCXzU2NQotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCRDb25maWdbXSBzQ29uZmlncwotCi1maW5hbCBpbnQgbmF0aXZlSW50Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJKVYgKQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50KQotCi1zdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAkQ29uZmlnIG5hdGl2ZVRvQ29uZmlnKAotaW50KQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwJENvbmZpZyB2YWx1ZU9mKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCRDb25maWdbXSB2YWx1ZXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvZ3JhcGhpY3MvQml0bWFwJENvbXByZXNzRm9ybWF0O0xhbmRyb2lkL2dyYXBoaWNzL0JpdG1hcCRDb25maWc7ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I8TGFuZHJvaWQvZ3JhcGhpY3MvQml0bWFwOz47ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IgQ1JFQVRPUgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV09SS0lOR19DT01QUkVTU19TVE9SQUdFCi0KLXByaXZhdGUgc3RhdGljIHZvbGF0aWxlIGFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4IHNTY2FsZU1hdHJpeAotCi1wcml2YXRlIGludCBtSGVpZ2h0Ci0KLXByaXZhdGUgZmluYWwgYm9vbGVhbiBtSXNNdXRhYmxlCi0KLXByaXZhdGUgZmluYWwgaW50IG1OYXRpdmVCaXRtYXAKLQotcHJpdmF0ZSBieXRlW10gbU5pbmVQYXRjaENodW5rCi0KLXByaXZhdGUgYm9vbGVhbiBtUmVjeWNsZWQKLQotcHJpdmF0ZSBpbnQgbVdpZHRoCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotaW50Ci1ib29sZWFuCi1ieXRlW10pCi0KLXN0YXRpYyBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCBhY2Nlc3MkMDAwKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXByaXZhdGUgdm9pZCBjaGVja1BpeGVsQWNjZXNzKAotaW50Ci1pbnQpCi0KLXByaXZhdGUgdm9pZCBjaGVja1BpeGVsc0FjY2VzcygKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludFtdKQotCi1wcml2YXRlIHZvaWQgY2hlY2tSZWN5Y2xlZCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tXaWR0aEhlaWdodCgKLWludAotaW50KQotCi1wcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrWFlTaWduKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAgY3JlYXRlQml0bWFwKAotaW50Ci1pbnQKLWFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwJENvbmZpZykKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCBjcmVhdGVCaXRtYXAoCi1hbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCBjcmVhdGVCaXRtYXAoCi1hbmRyb2lkLmdyYXBoaWNzLkJpdG1hcAotaW50Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwIGNyZWF0ZUJpdG1hcCgKLWFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwCi1pbnQKLWludAotaW50Ci1pbnQKLWFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4Ci1ib29sZWFuKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwIGNyZWF0ZUJpdG1hcCgKLWludFtdCi1pbnQKLWludAotaW50Ci1pbnQKLWFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwJENvbmZpZykKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCBjcmVhdGVCaXRtYXAoCi1pbnRbXQotaW50Ci1pbnQKLWFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwJENvbmZpZykKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCBjcmVhdGVTY2FsZWRCaXRtYXAoCi1hbmRyb2lkLmdyYXBoaWNzLkJpdG1hcAotaW50Ci1pbnQKLWJvb2xlYW4pCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBib29sZWFuIG5hdGl2ZUNvbXByZXNzKAotaW50Ci1pbnQKLWludAotamF2YS5pby5PdXRwdXRTdHJlYW0KLWJ5dGVbXSkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVDb25maWcoCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCBuYXRpdmVDb3B5KAotaW50Ci1pbnQKLWJvb2xlYW4pCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZUNvcHlQaXhlbHNUb0J1ZmZlcigKLWludAotamF2YS5uaW8uQnVmZmVyKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAgbmF0aXZlQ3JlYXRlKAotaW50W10KLWludAotaW50Ci1pbnQKLWludAotaW50Ci1ib29sZWFuKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAgbmF0aXZlQ3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVEZXN0cnVjdG9yKAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVFcmFzZSgKLWludAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAgbmF0aXZlRXh0cmFjdEFscGhhKAotaW50Ci1pbnQKLWludFtdKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZUdldFBpeGVsKAotaW50Ci1pbnQKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlR2V0UGl4ZWxzKAotaW50Ci1pbnRbXQotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gbmF0aXZlSGFzQWxwaGEoCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlSGVpZ2h0KAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVSZWN5Y2xlKAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZVJvd0J5dGVzKAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVTZXRQaXhlbCgKLWludAotaW50Ci1pbnQKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlU2V0UGl4ZWxzKAotaW50Ci1pbnRbXQotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVXaWR0aCgKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gbmF0aXZlV3JpdGVUb1BhcmNlbCgKLWludAotYm9vbGVhbgotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyBib29sZWFuIGNvbXByZXNzKAotYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAkQ29tcHJlc3NGb3JtYXQKLWludAotamF2YS5pby5PdXRwdXRTdHJlYW0pCi0KLXB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCBjb3B5KAotYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAkQ29uZmlnCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBjb3B5UGl4ZWxzVG9CdWZmZXIoCi1qYXZhLm5pby5CdWZmZXIpCi0KLXB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpCi0KLXB1YmxpYyB2b2lkIGVyYXNlQ29sb3IoCi1pbnQpCi0KLXB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCBleHRyYWN0QWxwaGEoKQotCi1wdWJsaWMgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAgZXh0cmFjdEFscGhhKAotYW5kcm9pZC5ncmFwaGljcy5QYWludAotaW50W10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9UaHJvd2FibGU7ICkKLXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkKLQotcHVibGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwJENvbmZpZyBnZXRDb25maWcoKQotCi1wdWJsaWMgZmluYWwgaW50IGdldEhlaWdodCgpCi0KLXB1YmxpYyBieXRlW10gZ2V0TmluZVBhdGNoQ2h1bmsoKQotCi1wdWJsaWMgaW50IGdldFBpeGVsKAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIGdldFBpeGVscygKLWludFtdCi1pbnQKLWludAotaW50Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgZmluYWwgaW50IGdldFJvd0J5dGVzKCkKLQotcHVibGljIGZpbmFsIGludCBnZXRXaWR0aCgpCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGhhc0FscGhhKCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gaXNNdXRhYmxlKCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gaXNSZWN5Y2xlZCgpCi0KLWZpbmFsIGludCBuaSgpCi0KLXB1YmxpYyB2b2lkIHJlY3ljbGUoKQotCi1wdWJsaWMgdm9pZCBzZXRQaXhlbCgKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldFBpeGVscygKLWludFtdCi1pbnQKLWludAotaW50Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9T3B0aW9ucyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9ncmFwaGljcy9CaXRtYXBGYWN0b3J5OyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5JE9wdGlvbnMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBib29sZWFuIGluRGl0aGVyCi0KLXB1YmxpYyBib29sZWFuIGluSnVzdERlY29kZUJvdW5kcwotCi1wdWJsaWMgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAkQ29uZmlnIGluUHJlZmVycmVkQ29uZmlnCi0KLXB1YmxpYyBpbnQgaW5TYW1wbGVTaXplCi0KLXB1YmxpYyBieXRlW10gaW5UZW1wU3RvcmFnZQotCi1wdWJsaWMgYm9vbGVhbiBtQ2FuY2VsCi0KLXB1YmxpYyBpbnQgb3V0SGVpZ2h0Ci0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIG91dE1pbWVUeXBlCi0KLXB1YmxpYyBpbnQgb3V0V2lkdGgKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIHJlcXVlc3RDYW5jZWwoKQotCi1wdWJsaWMgdm9pZCByZXF1ZXN0Q2FuY2VsRGVjb2RlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL2dyYXBoaWNzL0JpdG1hcEZhY3RvcnkkT3B0aW9uczsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19MT0FECi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEFHCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCBkZWNvZGVCeXRlQXJyYXkoCi1ieXRlW10KLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwIGRlY29kZUJ5dGVBcnJheSgKLWJ5dGVbXQotaW50Ci1pbnQKLWFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeSRPcHRpb25zKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwIGRlY29kZUZpbGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwIGRlY29kZUZpbGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3RvcnkkT3B0aW9ucykKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCBkZWNvZGVGaWxlRGVzY3JpcHRvcigKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAgZGVjb2RlRmlsZURlc2NyaXB0b3IoCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3QKLWFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeSRPcHRpb25zKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwIGRlY29kZVJlc291cmNlKAotYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMKLWludCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCBkZWNvZGVSZXNvdXJjZSgKLWFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzCi1pbnQKLWFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeSRPcHRpb25zKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwIGRlY29kZVN0cmVhbSgKLWphdmEuaW8uSW5wdXRTdHJlYW0pCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAgZGVjb2RlU3RyZWFtKAotamF2YS5pby5JbnB1dFN0cmVhbQotYW5kcm9pZC5ncmFwaGljcy5SZWN0Ci1hbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3RvcnkkT3B0aW9ucykKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwIG5hdGl2ZURlY29kZUFzc2V0KAotaW50Ci1hbmRyb2lkLmdyYXBoaWNzLlJlY3QKLWFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeSRPcHRpb25zKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAgbmF0aXZlRGVjb2RlQnl0ZUFycmF5KAotYnl0ZVtdCi1pbnQKLWludAotYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5JE9wdGlvbnMpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCBuYXRpdmVEZWNvZGVGaWxlRGVzY3JpcHRvcigKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdAotYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5JE9wdGlvbnMpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCBuYXRpdmVEZWNvZGVTdHJlYW0oCi1qYXZhLmlvLklucHV0U3RyZWFtCi1ieXRlW10KLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdAotYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5JE9wdGlvbnMpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9ncmFwaGljcy9TaGFkZXIkVGlsZU1vZGU7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmdyYXBoaWNzLlNoYWRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGludCBuYXRpdmVfaW5zdGFuY2UKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVEZXN0cnVjdG9yKAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBuYXRpdmVHZXRMb2NhbE1hdHJpeCgKLWludAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVTZXRMb2NhbE1hdHJpeCgKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvVGhyb3dhYmxlOyApCi1wcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpCi0KLXB1YmxpYyBib29sZWFuIGdldExvY2FsTWF0cml4KAotYW5kcm9pZC5ncmFwaGljcy5NYXRyaXgpCi0KLXB1YmxpYyB2b2lkIHNldExvY2FsTWF0cml4KAotYW5kcm9pZC5ncmFwaGljcy5NYXRyaXgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBTaGFkZXIgZXh0ZW5kcyBhbmRyb2lkLmdyYXBoaWNzLlNoYWRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwIG1CaXRtYXAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmdyYXBoaWNzLkJpdG1hcAotYW5kcm9pZC5ncmFwaGljcy5TaGFkZXIkVGlsZU1vZGUKLWFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyJFRpbGVNb2RlKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZUNyZWF0ZSgKLWludAotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvRW51bTxMYW5kcm9pZC9ncmFwaGljcy9CbHVyTWFza0ZpbHRlciRCbHVyOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2dyYXBoaWNzL0JsdXJNYXNrRmlsdGVyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE2NDA5IG5hbWUgPUJsdXIgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQuZ3JhcGhpY3MuQmx1ck1hc2tGaWx0ZXIkQmx1ciBleHRlbmRzIGphdmEubGFuZy5FbnVtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuQmx1ck1hc2tGaWx0ZXIkQmx1cltdICRWQUxVRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLkJsdXJNYXNrRmlsdGVyJEJsdXIgSU5ORVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLkJsdXJNYXNrRmlsdGVyJEJsdXIgTk9STUFMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5CbHVyTWFza0ZpbHRlciRCbHVyIE9VVEVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5CbHVyTWFza0ZpbHRlciRCbHVyIFNPTElECi0KLWZpbmFsIGludCBuYXRpdmVfaW50Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJKVYgKQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuQmx1ck1hc2tGaWx0ZXIkQmx1ciB2YWx1ZU9mKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmdyYXBoaWNzLkJsdXJNYXNrRmlsdGVyJEJsdXJbXSB2YWx1ZXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuZ3JhcGhpY3MuTWFza0ZpbHRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGludCBuYXRpdmVfaW5zdGFuY2UKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVEZXN0cnVjdG9yKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvVGhyb3dhYmxlOyApCi1wcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9ncmFwaGljcy9CbHVyTWFza0ZpbHRlciRCbHVyOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5ncmFwaGljcy5CbHVyTWFza0ZpbHRlciBleHRlbmRzIGFuZHJvaWQuZ3JhcGhpY3MuTWFza0ZpbHRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWZsb2F0Ci1hbmRyb2lkLmdyYXBoaWNzLkJsdXJNYXNrRmlsdGVyJEJsdXIpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlQ29uc3RydWN0b3IoCi1mbG9hdAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuZ3JhcGhpY3MuQ2FtZXJhIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gaW50IG5hdGl2ZV9pbnN0YW5jZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlQXBwbHlUb0NhbnZhcygKLWludCkKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVDb25zdHJ1Y3RvcigpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlRGVzdHJ1Y3RvcigpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlR2V0TWF0cml4KAotaW50KQotCi1wdWJsaWMgdm9pZCBhcHBseVRvQ2FudmFzKAotYW5kcm9pZC5ncmFwaGljcy5DYW52YXMpCi0KLXB1YmxpYyBuYXRpdmUgZmxvYXQgZG90V2l0aE5vcm1hbCgKLWZsb2F0Ci1mbG9hdAotZmxvYXQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9UaHJvd2FibGU7ICkKLXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkKLQotcHVibGljIHZvaWQgZ2V0TWF0cml4KAotYW5kcm9pZC5ncmFwaGljcy5NYXRyaXgpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCByZXN0b3JlKCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIHJvdGF0ZVgoCi1mbG9hdCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIHJvdGF0ZVkoCi1mbG9hdCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIHJvdGF0ZVooCi1mbG9hdCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIHNhdmUoKQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgdHJhbnNsYXRlKAotZmxvYXQKLWZsb2F0Ci1mbG9hdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE2NDA5IG5hbWUgPUVkZ2VUeXBlICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2dyYXBoaWNzL0NhbnZhczsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvRW51bTxMYW5kcm9pZC9ncmFwaGljcy9DYW52YXMkRWRnZVR5cGU7PjsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzJEVkZ2VUeXBlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMkRWRnZVR5cGVbXSAkVkFMVUVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMkRWRnZVR5cGUgQUEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhcyRFZGdlVHlwZSBCVwotCi1maW5hbCBpbnQgbmF0aXZlSW50Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJKVYgKQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzJEVkZ2VUeXBlIHZhbHVlT2YoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzJEVkZ2VUeXBlW10gdmFsdWVzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9FbnVtPExhbmRyb2lkL2dyYXBoaWNzL0NhbnZhcyRWZXJ0ZXhNb2RlOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2dyYXBoaWNzL0NhbnZhczsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNjQwOSBuYW1lID1WZXJ0ZXhNb2RlICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhcyRWZXJ0ZXhNb2RlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMkVmVydGV4TW9kZVtdICRWQUxVRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhcyRWZXJ0ZXhNb2RlIFRSSUFOR0xFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzJFZlcnRleE1vZGUgVFJJQU5HTEVfRkFOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMkVmVydGV4TW9kZSBUUklBTkdMRV9TVFJJUAotCi1maW5hbCBpbnQgbmF0aXZlSW50Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJKVYgKQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzJFZlcnRleE1vZGUgdmFsdWVPZigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMkVmVydGV4TW9kZVtdIHZhbHVlcygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9ncmFwaGljcy9DYW52YXMkVmVydGV4TW9kZTtMYW5kcm9pZC9ncmFwaGljcy9DYW52YXMkRWRnZVR5cGU7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUxMX1NBVkVfRkxBRwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElQX1NBVkVfRkxBRwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElQX1RPX0xBWUVSX1NBVkVfRkxBRwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGVUxMX0NPTE9SX0xBWUVSX1NBVkVfRkxBRwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBIQVNfQUxQSEFfTEFZRVJfU0FWRV9GTEFHCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BVFJJWF9TQVZFX0ZMQUcKLQotcHJpdmF0ZSBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCBtQml0bWFwCi0KLXByaXZhdGUgYW5kcm9pZC5ncmFwaGljcy5EcmF3RmlsdGVyIG1EcmF3RmlsdGVyCi0KLXByaXZhdGUgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wgbUdMCi0KLWZpbmFsIGludCBtTmF0aXZlQ2FudmFzCi0KLXByaXZhdGUgaW50IG1TdXJmYWNlRm9ybWF0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KAotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wpCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tSYW5nZSgKLWludAotaW50Ci1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIGZpbmFsaXplcigKLWludCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBmcmVlR2xDYWNoZXMoKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IGluaXRHTCgpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgaW5pdFJhc3RlcigKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlRHJhd0JpdG1hcE1hdHJpeCgKLWludAotaW50Ci1pbnQKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlRHJhd0JpdG1hcE1lc2goCi1pbnQKLWludAotaW50Ci1pbnQKLWZsb2F0W10KLWludAotaW50W10KLWludAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVEcmF3VmVydGljZXMoCi1pbnQKLWludAotaW50Ci1mbG9hdFtdCi1pbnQKLWZsb2F0W10KLWludAotaW50W10KLWludAotc2hvcnRbXQotaW50Ci1pbnQKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlU2V0RHJhd0ZpbHRlcigKLWludAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVTZXRWaWV3cG9ydCgKLWludAotaW50Ci1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBib29sZWFuIG5hdGl2ZV9jbGlwUGF0aCgKLWludAotaW50Ci1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBib29sZWFuIG5hdGl2ZV9jbGlwUmVjdCgKLWludAotZmxvYXQKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gbmF0aXZlX2NsaXBSZWdpb24oCi1pbnQKLWludAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfY29uY2F0KAotaW50Ci1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9kcmF3QVJHQigKLWludAotaW50Ci1pbnQKLWludAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfZHJhd0FyYygKLWludAotYW5kcm9pZC5ncmFwaGljcy5SZWN0RgotZmxvYXQKLWZsb2F0Ci1ib29sZWFuCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9kcmF3Qml0bWFwKAotaW50Ci1pbnQKLWZsb2F0Ci1mbG9hdAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfZHJhd0JpdG1hcCgKLWludAotaW50Ci1hbmRyb2lkLmdyYXBoaWNzLlJlY3QKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfZHJhd0JpdG1hcCgKLWludAotaW50Ci1hbmRyb2lkLmdyYXBoaWNzLlJlY3QKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdEYKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX2RyYXdCaXRtYXAoCi1pbnQKLWludFtdCi1pbnQKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1ib29sZWFuCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9kcmF3Q2lyY2xlKAotaW50Ci1mbG9hdAotZmxvYXQKLWZsb2F0Ci1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9kcmF3Q29sb3IoCi1pbnQKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX2RyYXdDb2xvcigKLWludAotaW50Ci1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9kcmF3TGluZSgKLWludAotZmxvYXQKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX2RyYXdPdmFsKAotaW50Ci1hbmRyb2lkLmdyYXBoaWNzLlJlY3RGCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9kcmF3UGFpbnQoCi1pbnQKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX2RyYXdQYXRoKAotaW50Ci1pbnQKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX2RyYXdQaWN0dXJlKAotaW50Ci1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9kcmF3UG9zVGV4dCgKLWludAotamF2YS5sYW5nLlN0cmluZwotZmxvYXRbXQotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfZHJhd1Bvc1RleHQoCi1pbnQKLWNoYXJbXQotaW50Ci1pbnQKLWZsb2F0W10KLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX2RyYXdSR0IoCi1pbnQKLWludAotaW50Ci1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9kcmF3UmVjdCgKLWludAotZmxvYXQKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX2RyYXdSZWN0KAotaW50Ci1hbmRyb2lkLmdyYXBoaWNzLlJlY3RGCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9kcmF3Um91bmRSZWN0KAotaW50Ci1hbmRyb2lkLmdyYXBoaWNzLlJlY3RGCi1mbG9hdAotZmxvYXQKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX2RyYXdUZXh0KAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludAotZmxvYXQKLWZsb2F0Ci1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9kcmF3VGV4dCgKLWludAotY2hhcltdCi1pbnQKLWludAotZmxvYXQKLWZsb2F0Ci1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9kcmF3VGV4dE9uUGF0aCgKLWludAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1mbG9hdAotZmxvYXQKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX2RyYXdUZXh0T25QYXRoKAotaW50Ci1jaGFyW10KLWludAotaW50Ci1pbnQKLWZsb2F0Ci1mbG9hdAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfZ2V0Q1RNKAotaW50Ci1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBib29sZWFuIG5hdGl2ZV9nZXRDbGlwQm91bmRzKAotaW50Ci1hbmRyb2lkLmdyYXBoaWNzLlJlY3QpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBib29sZWFuIG5hdGl2ZV9xdWlja1JlamVjdCgKLWludAotZmxvYXQKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gbmF0aXZlX3F1aWNrUmVqZWN0KAotaW50Ci1pbnQKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gbmF0aXZlX3F1aWNrUmVqZWN0KAotaW50Ci1hbmRyb2lkLmdyYXBoaWNzLlJlY3RGCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlX3NhdmVMYXllcigKLWludAotZmxvYXQKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWludAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZV9zYXZlTGF5ZXIoCi1pbnQKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdEYKLWludAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZV9zYXZlTGF5ZXJBbHBoYSgKLWludAotZmxvYXQKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWludAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZV9zYXZlTGF5ZXJBbHBoYSgKLWludAotYW5kcm9pZC5ncmFwaGljcy5SZWN0RgotaW50Ci1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9zZXRCaXRtYXAoCi1pbnQKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX3NldE1hdHJpeCgKLWludAotaW50KQotCi1wcml2YXRlIHN0YXRpYyB2b2lkIHRocm93SWZSZWN5Y2xlZCgKLWFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwKQotCi1wdWJsaWMgYm9vbGVhbiBjbGlwUGF0aCgKLWFuZHJvaWQuZ3JhcGhpY3MuUGF0aCkKLQotcHVibGljIGJvb2xlYW4gY2xpcFBhdGgoCi1hbmRyb2lkLmdyYXBoaWNzLlBhdGgKLWFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uJE9wKQotCi1wdWJsaWMgbmF0aXZlIGJvb2xlYW4gY2xpcFJlY3QoCi1mbG9hdAotZmxvYXQKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIGJvb2xlYW4gY2xpcFJlY3QoCi1mbG9hdAotZmxvYXQKLWZsb2F0Ci1mbG9hdAotYW5kcm9pZC5ncmFwaGljcy5SZWdpb24kT3ApCi0KLXB1YmxpYyBuYXRpdmUgYm9vbGVhbiBjbGlwUmVjdCgKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIG5hdGl2ZSBib29sZWFuIGNsaXBSZWN0KAotYW5kcm9pZC5ncmFwaGljcy5SZWN0KQotCi1wdWJsaWMgYm9vbGVhbiBjbGlwUmVjdCgKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdAotYW5kcm9pZC5ncmFwaGljcy5SZWdpb24kT3ApCi0KLXB1YmxpYyBuYXRpdmUgYm9vbGVhbiBjbGlwUmVjdCgKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdEYpCi0KLXB1YmxpYyBib29sZWFuIGNsaXBSZWN0KAotYW5kcm9pZC5ncmFwaGljcy5SZWN0RgotYW5kcm9pZC5ncmFwaGljcy5SZWdpb24kT3ApCi0KLXB1YmxpYyBib29sZWFuIGNsaXBSZWdpb24oCi1hbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbikKLQotcHVibGljIGJvb2xlYW4gY2xpcFJlZ2lvbigKLWFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uCi1hbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbiRPcCkKLQotcHVibGljIHZvaWQgY29uY2F0KAotYW5kcm9pZC5ncmFwaGljcy5NYXRyaXgpCi0KLXB1YmxpYyB2b2lkIGRyYXdBUkdCKAotaW50Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBkcmF3QXJjKAotYW5kcm9pZC5ncmFwaGljcy5SZWN0RgotZmxvYXQKLWZsb2F0Ci1ib29sZWFuCi1hbmRyb2lkLmdyYXBoaWNzLlBhaW50KQotCi1wdWJsaWMgdm9pZCBkcmF3Qml0bWFwKAotYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAKLWZsb2F0Ci1mbG9hdAotYW5kcm9pZC5ncmFwaGljcy5QYWludCkKLQotcHVibGljIHZvaWQgZHJhd0JpdG1hcCgKLWFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwCi1hbmRyb2lkLmdyYXBoaWNzLk1hdHJpeAotYW5kcm9pZC5ncmFwaGljcy5QYWludCkKLQotcHVibGljIHZvaWQgZHJhd0JpdG1hcCgKLWFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3QKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdAotYW5kcm9pZC5ncmFwaGljcy5QYWludCkKLQotcHVibGljIHZvaWQgZHJhd0JpdG1hcCgKLWFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3QKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdEYKLWFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQpCi0KLXB1YmxpYyB2b2lkIGRyYXdCaXRtYXAoCi1pbnRbXQotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludAotYm9vbGVhbgotYW5kcm9pZC5ncmFwaGljcy5QYWludCkKLQotcHVibGljIHZvaWQgZHJhd0JpdG1hcE1lc2goCi1hbmRyb2lkLmdyYXBoaWNzLkJpdG1hcAotaW50Ci1pbnQKLWZsb2F0W10KLWludAotaW50W10KLWludAotYW5kcm9pZC5ncmFwaGljcy5QYWludCkKLQotcHVibGljIHZvaWQgZHJhd0NpcmNsZSgKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQpCi0KLXB1YmxpYyB2b2lkIGRyYXdDb2xvcigKLWludCkKLQotcHVibGljIHZvaWQgZHJhd0NvbG9yKAotaW50Ci1hbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmYkTW9kZSkKLQotcHVibGljIHZvaWQgZHJhd0xpbmUoCi1mbG9hdAotZmxvYXQKLWZsb2F0Ci1mbG9hdAotYW5kcm9pZC5ncmFwaGljcy5QYWludCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGRyYXdMaW5lcygKLWZsb2F0W10KLWludAotaW50Ci1hbmRyb2lkLmdyYXBoaWNzLlBhaW50KQotCi1wdWJsaWMgdm9pZCBkcmF3TGluZXMoCi1mbG9hdFtdCi1hbmRyb2lkLmdyYXBoaWNzLlBhaW50KQotCi1wdWJsaWMgdm9pZCBkcmF3T3ZhbCgKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdEYKLWFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQpCi0KLXB1YmxpYyB2b2lkIGRyYXdQYWludCgKLWFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQpCi0KLXB1YmxpYyB2b2lkIGRyYXdQYXRoKAotYW5kcm9pZC5ncmFwaGljcy5QYXRoCi1hbmRyb2lkLmdyYXBoaWNzLlBhaW50KQotCi1wdWJsaWMgdm9pZCBkcmF3UGljdHVyZSgKLWFuZHJvaWQuZ3JhcGhpY3MuUGljdHVyZSkKLQotcHVibGljIHZvaWQgZHJhd1BpY3R1cmUoCi1hbmRyb2lkLmdyYXBoaWNzLlBpY3R1cmUKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdCkKLQotcHVibGljIHZvaWQgZHJhd1BpY3R1cmUoCi1hbmRyb2lkLmdyYXBoaWNzLlBpY3R1cmUKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdEYpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBkcmF3UG9pbnQoCi1mbG9hdAotZmxvYXQKLWFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBkcmF3UG9pbnRzKAotZmxvYXRbXQotaW50Ci1pbnQKLWFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQpCi0KLXB1YmxpYyB2b2lkIGRyYXdQb2ludHMoCi1mbG9hdFtdCi1hbmRyb2lkLmdyYXBoaWNzLlBhaW50KQotCi1wdWJsaWMgdm9pZCBkcmF3UG9zVGV4dCgKLWphdmEubGFuZy5TdHJpbmcKLWZsb2F0W10KLWFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQpCi0KLXB1YmxpYyB2b2lkIGRyYXdQb3NUZXh0KAotY2hhcltdCi1pbnQKLWludAotZmxvYXRbXQotYW5kcm9pZC5ncmFwaGljcy5QYWludCkKLQotcHVibGljIHZvaWQgZHJhd1JHQigKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIGRyYXdSZWN0KAotZmxvYXQKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQpCi0KLXB1YmxpYyB2b2lkIGRyYXdSZWN0KAotYW5kcm9pZC5ncmFwaGljcy5SZWN0Ci1hbmRyb2lkLmdyYXBoaWNzLlBhaW50KQotCi1wdWJsaWMgdm9pZCBkcmF3UmVjdCgKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdEYKLWFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQpCi0KLXB1YmxpYyB2b2lkIGRyYXdSb3VuZFJlY3QoCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3RGCi1mbG9hdAotZmxvYXQKLWFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQpCi0KLXB1YmxpYyB2b2lkIGRyYXdUZXh0KAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotaW50Ci1pbnQKLWZsb2F0Ci1mbG9hdAotYW5kcm9pZC5ncmFwaGljcy5QYWludCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGRyYXdUZXh0KAotamF2YS5sYW5nLlN0cmluZwotZmxvYXQKLWZsb2F0Ci1hbmRyb2lkLmdyYXBoaWNzLlBhaW50KQotCi1wdWJsaWMgdm9pZCBkcmF3VGV4dCgKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50Ci1mbG9hdAotZmxvYXQKLWFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQpCi0KLXB1YmxpYyB2b2lkIGRyYXdUZXh0KAotY2hhcltdCi1pbnQKLWludAotZmxvYXQKLWZsb2F0Ci1hbmRyb2lkLmdyYXBoaWNzLlBhaW50KQotCi1wdWJsaWMgdm9pZCBkcmF3VGV4dE9uUGF0aCgKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQuZ3JhcGhpY3MuUGF0aAotZmxvYXQKLWZsb2F0Ci1hbmRyb2lkLmdyYXBoaWNzLlBhaW50KQotCi1wdWJsaWMgdm9pZCBkcmF3VGV4dE9uUGF0aCgKLWNoYXJbXQotaW50Ci1pbnQKLWFuZHJvaWQuZ3JhcGhpY3MuUGF0aAotZmxvYXQKLWZsb2F0Ci1hbmRyb2lkLmdyYXBoaWNzLlBhaW50KQotCi1wdWJsaWMgdm9pZCBkcmF3VmVydGljZXMoCi1hbmRyb2lkLmdyYXBoaWNzLkNhbnZhcyRWZXJ0ZXhNb2RlCi1pbnQKLWZsb2F0W10KLWludAotZmxvYXRbXQotaW50Ci1pbnRbXQotaW50Ci1zaG9ydFtdCi1pbnQKLWludAotYW5kcm9pZC5ncmFwaGljcy5QYWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL1Rocm93YWJsZTsgKQotcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKQotCi1wdWJsaWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5SZWN0IGdldENsaXBCb3VuZHMoKQotCi1wdWJsaWMgYm9vbGVhbiBnZXRDbGlwQm91bmRzKAotYW5kcm9pZC5ncmFwaGljcy5SZWN0KQotCi1wdWJsaWMgYW5kcm9pZC5ncmFwaGljcy5EcmF3RmlsdGVyIGdldERyYXdGaWx0ZXIoKQotCi1wdWJsaWMgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wgZ2V0R0woKQotCi1wdWJsaWMgbmF0aXZlIGludCBnZXRIZWlnaHQoKQotCi1wdWJsaWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5NYXRyaXggZ2V0TWF0cml4KCkKLQotcHVibGljIHZvaWQgZ2V0TWF0cml4KAotYW5kcm9pZC5ncmFwaGljcy5NYXRyaXgpCi0KLXB1YmxpYyBuYXRpdmUgaW50IGdldFNhdmVDb3VudCgpCi0KLXB1YmxpYyBuYXRpdmUgaW50IGdldFdpZHRoKCkKLQotcHVibGljIG5hdGl2ZSBib29sZWFuIGlzT3BhcXVlKCkKLQotcHVibGljIGJvb2xlYW4gcXVpY2tSZWplY3QoCi1mbG9hdAotZmxvYXQKLWZsb2F0Ci1mbG9hdAotYW5kcm9pZC5ncmFwaGljcy5DYW52YXMkRWRnZVR5cGUpCi0KLXB1YmxpYyBib29sZWFuIHF1aWNrUmVqZWN0KAotYW5kcm9pZC5ncmFwaGljcy5QYXRoCi1hbmRyb2lkLmdyYXBoaWNzLkNhbnZhcyRFZGdlVHlwZSkKLQotcHVibGljIGJvb2xlYW4gcXVpY2tSZWplY3QoCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3RGCi1hbmRyb2lkLmdyYXBoaWNzLkNhbnZhcyRFZGdlVHlwZSkKLQotcHVibGljIG5hdGl2ZSB2b2lkIHJlc3RvcmUoKQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgcmVzdG9yZVRvQ291bnQoCi1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCByb3RhdGUoCi1mbG9hdCkKLQotcHVibGljIGZpbmFsIHZvaWQgcm90YXRlKAotZmxvYXQKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIG5hdGl2ZSBpbnQgc2F2ZSgpCi0KLXB1YmxpYyBuYXRpdmUgaW50IHNhdmUoCi1pbnQpCi0KLXB1YmxpYyBpbnQgc2F2ZUxheWVyKAotZmxvYXQKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQKLWludCkKLQotcHVibGljIGludCBzYXZlTGF5ZXIoCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3RGCi1hbmRyb2lkLmdyYXBoaWNzLlBhaW50Ci1pbnQpCi0KLXB1YmxpYyBpbnQgc2F2ZUxheWVyQWxwaGEoCi1mbG9hdAotZmxvYXQKLWZsb2F0Ci1mbG9hdAotaW50Ci1pbnQpCi0KLXB1YmxpYyBpbnQgc2F2ZUxheWVyQWxwaGEoCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3RGCi1pbnQKLWludCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIHNjYWxlKAotZmxvYXQKLWZsb2F0KQotCi1wdWJsaWMgZmluYWwgdm9pZCBzY2FsZSgKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWZsb2F0KQotCi1wdWJsaWMgdm9pZCBzZXRCaXRtYXAoCi1hbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCkKLQotcHVibGljIHZvaWQgc2V0RHJhd0ZpbHRlcigKLWFuZHJvaWQuZ3JhcGhpY3MuRHJhd0ZpbHRlcikKLQotcHVibGljIHZvaWQgc2V0TWF0cml4KAotYW5kcm9pZC5ncmFwaGljcy5NYXRyaXgpCi0KLXB1YmxpYyB2b2lkIHNldFZpZXdwb3J0KAotaW50Ci1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBza2V3KAotZmxvYXQKLWZsb2F0KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgdHJhbnNsYXRlKAotZmxvYXQKLWZsb2F0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJMQUNLCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJMVUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ1lBTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBES0dSQVkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR1JBWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHUkVFTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMVEdSQVkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFHRU5UQQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNQQVJFTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0hJVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWUVMTE9XCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNoTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvSW50ZWdlcjs+OyApCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuSGFzaE1hcCBzQ29sb3JOYW1lTWFwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGludCBIU1ZUb0NvbG9yKAotaW50Ci1mbG9hdFtdKQotCi1wdWJsaWMgc3RhdGljIGludCBIU1ZUb0NvbG9yKAotZmxvYXRbXSkKLQotcHVibGljIHN0YXRpYyB2b2lkIFJHQlRvSFNWKAotaW50Ci1pbnQKLWludAotZmxvYXRbXSkKLQotcHVibGljIHN0YXRpYyBpbnQgYWxwaGEoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgaW50IGFyZ2IoCi1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgaW50IGJsdWUoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBjb2xvclRvSFNWKAotaW50Ci1mbG9hdFtdKQotCi1wdWJsaWMgc3RhdGljIGludCBncmVlbigKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVIU1ZUb0NvbG9yKAotaW50Ci1mbG9hdFtdKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVSR0JUb0hTVigKLWludAotaW50Ci1pbnQKLWZsb2F0W10pCi0KLXB1YmxpYyBzdGF0aWMgaW50IHBhcnNlQ29sb3IoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGludCByZWQoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgaW50IHJnYigKLWludAotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5ncmFwaGljcy5Db2xvckZpbHRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGludCBuYXRpdmVfaW5zdGFuY2UKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBmaW5hbGl6ZXIoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9UaHJvd2FibGU7ICkKLXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yTWF0cml4IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGZsb2F0W10gbUFycmF5Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5ncmFwaGljcy5Db2xvck1hdHJpeCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotZmxvYXRbXSkKLQotcHVibGljIGZpbmFsIGZsb2F0W10gZ2V0QXJyYXkoKQotCi1wdWJsaWMgdm9pZCBwb3N0Q29uY2F0KAotYW5kcm9pZC5ncmFwaGljcy5Db2xvck1hdHJpeCkKLQotcHVibGljIHZvaWQgcHJlQ29uY2F0KAotYW5kcm9pZC5ncmFwaGljcy5Db2xvck1hdHJpeCkKLQotcHVibGljIHZvaWQgcmVzZXQoKQotCi1wdWJsaWMgdm9pZCBzZXQoCi1hbmRyb2lkLmdyYXBoaWNzLkNvbG9yTWF0cml4KQotCi1wdWJsaWMgdm9pZCBzZXQoCi1mbG9hdFtdKQotCi1wdWJsaWMgdm9pZCBzZXRDb25jYXQoCi1hbmRyb2lkLmdyYXBoaWNzLkNvbG9yTWF0cml4Ci1hbmRyb2lkLmdyYXBoaWNzLkNvbG9yTWF0cml4KQotCi1wdWJsaWMgdm9pZCBzZXRSR0IyWVVWKCkKLQotcHVibGljIHZvaWQgc2V0Um90YXRlKAotaW50Ci1mbG9hdCkKLQotcHVibGljIHZvaWQgc2V0U2F0dXJhdGlvbigKLWZsb2F0KQotCi1wdWJsaWMgdm9pZCBzZXRTY2FsZSgKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWZsb2F0KQotCi1wdWJsaWMgdm9pZCBzZXRZVVYyUkdCKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yTWF0cml4Q29sb3JGaWx0ZXIgZXh0ZW5kcyBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yRmlsdGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5ncmFwaGljcy5Db2xvck1hdHJpeCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotZmxvYXRbXSkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVDb2xvck1hdHJpeEZpbHRlcigKLWZsb2F0W10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5ncmFwaGljcy5QYXRoRWZmZWN0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gaW50IG5hdGl2ZV9pbnN0YW5jZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZURlc3RydWN0b3IoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9UaHJvd2FibGU7ICkKLXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmdyYXBoaWNzLkNvbXBvc2VQYXRoRWZmZWN0IGV4dGVuZHMgYW5kcm9pZC5ncmFwaGljcy5QYXRoRWZmZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5ncmFwaGljcy5QYXRoRWZmZWN0Ci1hbmRyb2lkLmdyYXBoaWNzLlBhdGhFZmZlY3QpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlQ3JlYXRlKAotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5ncmFwaGljcy5Db21wb3NlU2hhZGVyIGV4dGVuZHMgYW5kcm9pZC5ncmFwaGljcy5TaGFkZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmdyYXBoaWNzLlNoYWRlcgotYW5kcm9pZC5ncmFwaGljcy5TaGFkZXIKLWFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZiRNb2RlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmdyYXBoaWNzLlNoYWRlcgotYW5kcm9pZC5ncmFwaGljcy5TaGFkZXIKLWFuZHJvaWQuZ3JhcGhpY3MuWGZlcm1vZGUpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlQ3JlYXRlMSgKLWludAotaW50Ci1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlQ3JlYXRlMigKLWludAotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5ncmFwaGljcy5Db3JuZXJQYXRoRWZmZWN0IGV4dGVuZHMgYW5kcm9pZC5ncmFwaGljcy5QYXRoRWZmZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotZmxvYXQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlQ3JlYXRlKAotZmxvYXQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5ncmFwaGljcy5EYXNoUGF0aEVmZmVjdCBleHRlbmRzIGFuZHJvaWQuZ3JhcGhpY3MuUGF0aEVmZmVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWZsb2F0W10KLWZsb2F0KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZUNyZWF0ZSgKLWZsb2F0W10KLWZsb2F0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuZ3JhcGhpY3MuRGlzY3JldGVQYXRoRWZmZWN0IGV4dGVuZHMgYW5kcm9pZC5ncmFwaGljcy5QYXRoRWZmZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotZmxvYXQKLWZsb2F0KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZUNyZWF0ZSgKLWZsb2F0Ci1mbG9hdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmdyYXBoaWNzLkRyYXdGaWx0ZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBpbnQgbU5hdGl2ZUludAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZURlc3RydWN0b3IoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9UaHJvd2FibGU7ICkKLXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmdyYXBoaWNzLkVtYm9zc01hc2tGaWx0ZXIgZXh0ZW5kcyBhbmRyb2lkLmdyYXBoaWNzLk1hc2tGaWx0ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1mbG9hdFtdCi1mbG9hdAotZmxvYXQKLWZsb2F0KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZUNvbnN0cnVjdG9yKAotZmxvYXRbXQotZmxvYXQKLWZsb2F0Ci1mbG9hdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9FbnVtPExhbmRyb2lkL2dyYXBoaWNzL0ludGVycG9sYXRvciRSZXN1bHQ7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvZ3JhcGhpY3MvSW50ZXJwb2xhdG9yOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE2NDA5IG5hbWUgPVJlc3VsdCApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5ncmFwaGljcy5JbnRlcnBvbGF0b3IkUmVzdWx0IGV4dGVuZHMgamF2YS5sYW5nLkVudW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5JbnRlcnBvbGF0b3IkUmVzdWx0W10gJFZBTFVFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuSW50ZXJwb2xhdG9yJFJlc3VsdCBGUkVFWkVfRU5ECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5JbnRlcnBvbGF0b3IkUmVzdWx0IEZSRUVaRV9TVEFSVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuSW50ZXJwb2xhdG9yJFJlc3VsdCBOT1JNQUwKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClWICkKLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5JbnRlcnBvbGF0b3IkUmVzdWx0IHZhbHVlT2YoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuSW50ZXJwb2xhdG9yJFJlc3VsdFtdIHZhbHVlcygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9ncmFwaGljcy9JbnRlcnBvbGF0b3IkUmVzdWx0OyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5ncmFwaGljcy5JbnRlcnBvbGF0b3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgaW50IG1GcmFtZUNvdW50Ci0KLXByaXZhdGUgaW50IG1WYWx1ZUNvdW50Ci0KLXByaXZhdGUgZmluYWwgaW50IG5hdGl2ZV9pbnN0YW5jZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50Ci1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlQ29uc3RydWN0b3IoCi1pbnQKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlRGVzdHJ1Y3RvcigKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlUmVzZXQoCi1pbnQKLWludAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVTZXRLZXlGcmFtZSgKLWludAotaW50Ci1pbnQKLWZsb2F0W10KLWZsb2F0W10pCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZVNldFJlcGVhdE1pcnJvcigKLWludAotZmxvYXQKLWJvb2xlYW4pCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlVGltZVRvVmFsdWVzKAotaW50Ci1pbnQKLWZsb2F0W10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9UaHJvd2FibGU7ICkKLXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkKLQotcHVibGljIGZpbmFsIGludCBnZXRLZXlGcmFtZUNvdW50KCkKLQotcHVibGljIGZpbmFsIGludCBnZXRWYWx1ZUNvdW50KCkKLQotcHVibGljIHZvaWQgcmVzZXQoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHJlc2V0KAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldEtleUZyYW1lKAotaW50Ci1pbnQKLWZsb2F0W10pCi0KLXB1YmxpYyB2b2lkIHNldEtleUZyYW1lKAotaW50Ci1pbnQKLWZsb2F0W10KLWZsb2F0W10pCi0KLXB1YmxpYyB2b2lkIHNldFJlcGVhdE1pcnJvcigKLWZsb2F0Ci1ib29sZWFuKQotCi1wdWJsaWMgYW5kcm9pZC5ncmFwaGljcy5JbnRlcnBvbGF0b3IkUmVzdWx0IHRpbWVUb1ZhbHVlcygKLWludAotZmxvYXRbXSkKLQotcHVibGljIGFuZHJvaWQuZ3JhcGhpY3MuSW50ZXJwb2xhdG9yJFJlc3VsdCB0aW1lVG9WYWx1ZXMoCi1mbG9hdFtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuZ3JhcGhpY3MuUmFzdGVyaXplciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGludCBuYXRpdmVfaW5zdGFuY2UKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBmaW5hbGl6ZXIoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9UaHJvd2FibGU7ICkKLXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmdyYXBoaWNzLkxheWVyUmFzdGVyaXplciBleHRlbmRzIGFuZHJvaWQuZ3JhcGhpY3MuUmFzdGVyaXplcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZUFkZExheWVyKAotaW50Ci1pbnQKLWZsb2F0Ci1mbG9hdCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVDb25zdHJ1Y3RvcigpCi0KLXB1YmxpYyB2b2lkIGFkZExheWVyKAotYW5kcm9pZC5ncmFwaGljcy5QYWludCkKLQotcHVibGljIHZvaWQgYWRkTGF5ZXIoCi1hbmRyb2lkLmdyYXBoaWNzLlBhaW50Ci1mbG9hdAotZmxvYXQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5ncmFwaGljcy5MaWdodGluZ0NvbG9yRmlsdGVyIGV4dGVuZHMgYW5kcm9pZC5ncmFwaGljcy5Db2xvckZpbHRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZV9DcmVhdGVMaWdodGluZ0ZpbHRlcigKLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuZ3JhcGhpY3MuTGluZWFyR3JhZGllbnQgZXh0ZW5kcyBhbmRyb2lkLmdyYXBoaWNzLlNoYWRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWZsb2F0Ci1pbnQKLWludAotYW5kcm9pZC5ncmFwaGljcy5TaGFkZXIkVGlsZU1vZGUpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWZsb2F0Ci1pbnRbXQotZmxvYXRbXQotYW5kcm9pZC5ncmFwaGljcy5TaGFkZXIkVGlsZU1vZGUpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlQ3JlYXRlMSgKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWZsb2F0Ci1pbnRbXQotZmxvYXRbXQotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZUNyZWF0ZTIoCi1mbG9hdAotZmxvYXQKLWZsb2F0Ci1mbG9hdAotaW50Ci1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9ncmFwaGljcy9NYXRyaXg7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTY0MDkgbmFtZSA9U2NhbGVUb0ZpdCApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9FbnVtPExhbmRyb2lkL2dyYXBoaWNzL01hdHJpeCRTY2FsZVRvRml0Oz47ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLmdyYXBoaWNzLk1hdHJpeCRTY2FsZVRvRml0IGV4dGVuZHMgamF2YS5sYW5nLkVudW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5NYXRyaXgkU2NhbGVUb0ZpdFtdICRWQUxVRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLk1hdHJpeCRTY2FsZVRvRml0IENFTlRFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4JFNjYWxlVG9GaXQgRU5ECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5NYXRyaXgkU2NhbGVUb0ZpdCBGSUxMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5NYXRyaXgkU2NhbGVUb0ZpdCBTVEFSVAotCi1maW5hbCBpbnQgbmF0aXZlSW50Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJKVYgKQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4JFNjYWxlVG9GaXQgdmFsdWVPZigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5NYXRyaXgkU2NhbGVUb0ZpdFtdIHZhbHVlcygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9ncmFwaGljcy9NYXRyaXgkU2NhbGVUb0ZpdDsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNUEVSU1BfMAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNUEVSU1BfMQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNUEVSU1BfMgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0NBTEVfWAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0NBTEVfWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0tFV19YCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TS0VXX1kKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVRSQU5TX1gKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVRSQU5TX1kKLQotIGludCBuYXRpdmVfaW5zdGFuY2UKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmdyYXBoaWNzLk1hdHJpeCkKLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja1BvaW50QXJyYXlzKAotZmxvYXRbXQotaW50Ci1mbG9hdFtdCi1pbnQKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgZmluYWxpemVyKAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZV9jcmVhdGUoCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBib29sZWFuIG5hdGl2ZV9lcXVhbHMoCi1pbnQKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX2dldFZhbHVlcygKLWludAotZmxvYXRbXSkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gbmF0aXZlX2ludmVydCgKLWludAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBuYXRpdmVfaXNJZGVudGl0eSgKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX21hcFBvaW50cygKLWludAotZmxvYXRbXQotaW50Ci1mbG9hdFtdCi1pbnQKLWludAotYm9vbGVhbikKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGZsb2F0IG5hdGl2ZV9tYXBSYWRpdXMoCi1pbnQKLWZsb2F0KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBuYXRpdmVfbWFwUmVjdCgKLWludAotYW5kcm9pZC5ncmFwaGljcy5SZWN0RgotYW5kcm9pZC5ncmFwaGljcy5SZWN0RikKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gbmF0aXZlX3Bvc3RDb25jYXQoCi1pbnQKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gbmF0aXZlX3Bvc3RSb3RhdGUoCi1pbnQKLWZsb2F0KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBuYXRpdmVfcG9zdFJvdGF0ZSgKLWludAotZmxvYXQKLWZsb2F0Ci1mbG9hdCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gbmF0aXZlX3Bvc3RTY2FsZSgKLWludAotZmxvYXQKLWZsb2F0KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBuYXRpdmVfcG9zdFNjYWxlKAotaW50Ci1mbG9hdAotZmxvYXQKLWZsb2F0Ci1mbG9hdCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gbmF0aXZlX3Bvc3RTa2V3KAotaW50Ci1mbG9hdAotZmxvYXQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBib29sZWFuIG5hdGl2ZV9wb3N0U2tldygKLWludAotZmxvYXQKLWZsb2F0Ci1mbG9hdAotZmxvYXQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBib29sZWFuIG5hdGl2ZV9wb3N0VHJhbnNsYXRlKAotaW50Ci1mbG9hdAotZmxvYXQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBib29sZWFuIG5hdGl2ZV9wcmVDb25jYXQoCi1pbnQKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gbmF0aXZlX3ByZVJvdGF0ZSgKLWludAotZmxvYXQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBib29sZWFuIG5hdGl2ZV9wcmVSb3RhdGUoCi1pbnQKLWZsb2F0Ci1mbG9hdAotZmxvYXQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBib29sZWFuIG5hdGl2ZV9wcmVTY2FsZSgKLWludAotZmxvYXQKLWZsb2F0KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBuYXRpdmVfcHJlU2NhbGUoCi1pbnQKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWZsb2F0KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBuYXRpdmVfcHJlU2tldygKLWludAotZmxvYXQKLWZsb2F0KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBuYXRpdmVfcHJlU2tldygKLWludAotZmxvYXQKLWZsb2F0Ci1mbG9hdAotZmxvYXQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBib29sZWFuIG5hdGl2ZV9wcmVUcmFuc2xhdGUoCi1pbnQKLWZsb2F0Ci1mbG9hdCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gbmF0aXZlX3JlY3RTdGF5c1JlY3QoCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9yZXNldCgKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX3NldCgKLWludAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBuYXRpdmVfc2V0Q29uY2F0KAotaW50Ci1pbnQKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gbmF0aXZlX3NldFBvbHlUb1BvbHkoCi1pbnQKLWZsb2F0W10KLWludAotZmxvYXRbXQotaW50Ci1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBib29sZWFuIG5hdGl2ZV9zZXRSZWN0VG9SZWN0KAotaW50Ci1hbmRyb2lkLmdyYXBoaWNzLlJlY3RGCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3RGCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9zZXRSb3RhdGUoCi1pbnQKLWZsb2F0KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfc2V0Um90YXRlKAotaW50Ci1mbG9hdAotZmxvYXQKLWZsb2F0KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfc2V0U2NhbGUoCi1pbnQKLWZsb2F0Ci1mbG9hdCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX3NldFNjYWxlKAotaW50Ci1mbG9hdAotZmxvYXQKLWZsb2F0Ci1mbG9hdCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX3NldFNpbkNvcygKLWludAotZmxvYXQKLWZsb2F0KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfc2V0U2luQ29zKAotaW50Ci1mbG9hdAotZmxvYXQKLWZsb2F0Ci1mbG9hdCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX3NldFNrZXcoCi1pbnQKLWZsb2F0Ci1mbG9hdCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX3NldFNrZXcoCi1pbnQKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWZsb2F0KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfc2V0VHJhbnNsYXRlKAotaW50Ci1mbG9hdAotZmxvYXQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9zZXRWYWx1ZXMoCi1pbnQKLWZsb2F0W10pCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9UaHJvd2FibGU7ICkKLXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkKLQotcHVibGljIHZvaWQgZ2V0VmFsdWVzKAotZmxvYXRbXSkKLQotcHVibGljIGJvb2xlYW4gaW52ZXJ0KAotYW5kcm9pZC5ncmFwaGljcy5NYXRyaXgpCi0KLXB1YmxpYyBib29sZWFuIGlzSWRlbnRpdHkoKQotCi1wdWJsaWMgdm9pZCBtYXBQb2ludHMoCi1mbG9hdFtdKQotCi1wdWJsaWMgdm9pZCBtYXBQb2ludHMoCi1mbG9hdFtdCi1pbnQKLWZsb2F0W10KLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBtYXBQb2ludHMoCi1mbG9hdFtdCi1mbG9hdFtdKQotCi1wdWJsaWMgZmxvYXQgbWFwUmFkaXVzKAotZmxvYXQpCi0KLXB1YmxpYyBib29sZWFuIG1hcFJlY3QoCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3RGKQotCi1wdWJsaWMgYm9vbGVhbiBtYXBSZWN0KAotYW5kcm9pZC5ncmFwaGljcy5SZWN0RgotYW5kcm9pZC5ncmFwaGljcy5SZWN0RikKLQotcHVibGljIHZvaWQgbWFwVmVjdG9ycygKLWZsb2F0W10pCi0KLXB1YmxpYyB2b2lkIG1hcFZlY3RvcnMoCi1mbG9hdFtdCi1pbnQKLWZsb2F0W10KLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBtYXBWZWN0b3JzKAotZmxvYXRbXQotZmxvYXRbXSkKLQotZmluYWwgaW50IG5pKCkKLQotcHVibGljIGJvb2xlYW4gcG9zdENvbmNhdCgKLWFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4KQotCi1wdWJsaWMgYm9vbGVhbiBwb3N0Um90YXRlKAotZmxvYXQpCi0KLXB1YmxpYyBib29sZWFuIHBvc3RSb3RhdGUoCi1mbG9hdAotZmxvYXQKLWZsb2F0KQotCi1wdWJsaWMgYm9vbGVhbiBwb3N0U2NhbGUoCi1mbG9hdAotZmxvYXQpCi0KLXB1YmxpYyBib29sZWFuIHBvc3RTY2FsZSgKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWZsb2F0KQotCi1wdWJsaWMgYm9vbGVhbiBwb3N0U2tldygKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIGJvb2xlYW4gcG9zdFNrZXcoCi1mbG9hdAotZmxvYXQKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIGJvb2xlYW4gcG9zdFRyYW5zbGF0ZSgKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIGJvb2xlYW4gcHJlQ29uY2F0KAotYW5kcm9pZC5ncmFwaGljcy5NYXRyaXgpCi0KLXB1YmxpYyBib29sZWFuIHByZVJvdGF0ZSgKLWZsb2F0KQotCi1wdWJsaWMgYm9vbGVhbiBwcmVSb3RhdGUoCi1mbG9hdAotZmxvYXQKLWZsb2F0KQotCi1wdWJsaWMgYm9vbGVhbiBwcmVTY2FsZSgKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIGJvb2xlYW4gcHJlU2NhbGUoCi1mbG9hdAotZmxvYXQKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIGJvb2xlYW4gcHJlU2tldygKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIGJvb2xlYW4gcHJlU2tldygKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWZsb2F0KQotCi1wdWJsaWMgYm9vbGVhbiBwcmVUcmFuc2xhdGUoCi1mbG9hdAotZmxvYXQpCi0KLXB1YmxpYyBib29sZWFuIHJlY3RTdGF5c1JlY3QoKQotCi1wdWJsaWMgdm9pZCByZXNldCgpCi0KLXB1YmxpYyB2b2lkIHNldCgKLWFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4KQotCi1wdWJsaWMgYm9vbGVhbiBzZXRDb25jYXQoCi1hbmRyb2lkLmdyYXBoaWNzLk1hdHJpeAotYW5kcm9pZC5ncmFwaGljcy5NYXRyaXgpCi0KLXB1YmxpYyBib29sZWFuIHNldFBvbHlUb1BvbHkoCi1mbG9hdFtdCi1pbnQKLWZsb2F0W10KLWludAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBzZXRSZWN0VG9SZWN0KAotYW5kcm9pZC5ncmFwaGljcy5SZWN0RgotYW5kcm9pZC5ncmFwaGljcy5SZWN0RgotYW5kcm9pZC5ncmFwaGljcy5NYXRyaXgkU2NhbGVUb0ZpdCkKLQotcHVibGljIHZvaWQgc2V0Um90YXRlKAotZmxvYXQpCi0KLXB1YmxpYyB2b2lkIHNldFJvdGF0ZSgKLWZsb2F0Ci1mbG9hdAotZmxvYXQpCi0KLXB1YmxpYyB2b2lkIHNldFNjYWxlKAotZmxvYXQKLWZsb2F0KQotCi1wdWJsaWMgdm9pZCBzZXRTY2FsZSgKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWZsb2F0KQotCi1wdWJsaWMgdm9pZCBzZXRTaW5Db3MoCi1mbG9hdAotZmxvYXQpCi0KLXB1YmxpYyB2b2lkIHNldFNpbkNvcygKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWZsb2F0KQotCi1wdWJsaWMgdm9pZCBzZXRTa2V3KAotZmxvYXQKLWZsb2F0KQotCi1wdWJsaWMgdm9pZCBzZXRTa2V3KAotZmxvYXQKLWZsb2F0Ci1mbG9hdAotZmxvYXQpCi0KLXB1YmxpYyB2b2lkIHNldFRyYW5zbGF0ZSgKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIHZvaWQgc2V0VmFsdWVzKAotZmxvYXRbXSkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TaG9ydFN0cmluZygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmdyYXBoaWNzLk1vdmllIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGludCBtTmF0aXZlTW92aWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotaW50KQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBhbmRyb2lkLmdyYXBoaWNzLk1vdmllIGRlY29kZUJ5dGVBcnJheSgKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5Nb3ZpZSBkZWNvZGVGaWxlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgYW5kcm9pZC5ncmFwaGljcy5Nb3ZpZSBkZWNvZGVTdHJlYW0oCi1qYXZhLmlvLklucHV0U3RyZWFtKQotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLmdyYXBoaWNzLk1vdmllIGRlY29kZVRlbXBTdHJlYW0oCi1qYXZhLmlvLklucHV0U3RyZWFtKQotCi1wdWJsaWMgdm9pZCBkcmF3KAotYW5kcm9pZC5ncmFwaGljcy5DYW52YXMKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGRyYXcoCi1hbmRyb2lkLmdyYXBoaWNzLkNhbnZhcwotZmxvYXQKLWZsb2F0Ci1hbmRyb2lkLmdyYXBoaWNzLlBhaW50KQotCi1wdWJsaWMgbmF0aXZlIGludCBkdXJhdGlvbigpCi0KLXB1YmxpYyBuYXRpdmUgaW50IGhlaWdodCgpCi0KLXB1YmxpYyBuYXRpdmUgYm9vbGVhbiBpc09wYXF1ZSgpCi0KLXB1YmxpYyBuYXRpdmUgYm9vbGVhbiBzZXRUaW1lKAotaW50KQotCi1wdWJsaWMgbmF0aXZlIGludCB3aWR0aCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5ncmFwaGljcy5OaW5lUGF0Y2ggZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAgbUJpdG1hcAotCi1wcml2YXRlIGZpbmFsIGJ5dGVbXSBtQ2h1bmsKLQotcHJpdmF0ZSBhbmRyb2lkLmdyYXBoaWNzLlBhaW50IG1QYWludAotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUmVjdCBtUmVjdAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbVNyY05hbWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmdyYXBoaWNzLkJpdG1hcAotYnl0ZVtdCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIGlzTmluZVBhdGNoQ2h1bmsoCi1ieXRlW10pCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZURyYXcoCi1pbnQKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdAotaW50Ci1ieXRlW10KLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlRHJhdygKLWludAotYW5kcm9pZC5ncmFwaGljcy5SZWN0RgotaW50Ci1ieXRlW10KLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVHZXRUcmFuc3BhcmVudFJlZ2lvbigKLWludAotYnl0ZVtdCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3QpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIHZhbGlkYXRlTmluZVBhdGNoQ2h1bmsoCi1pbnQKLWJ5dGVbXSkKLQotcHVibGljIHZvaWQgZHJhdygKLWFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3QpCi0KLXB1YmxpYyB2b2lkIGRyYXcoCi1hbmRyb2lkLmdyYXBoaWNzLkNhbnZhcwotYW5kcm9pZC5ncmFwaGljcy5SZWN0Ci1hbmRyb2lkLmdyYXBoaWNzLlBhaW50KQotCi1wdWJsaWMgdm9pZCBkcmF3KAotYW5kcm9pZC5ncmFwaGljcy5DYW52YXMKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdEYpCi0KLXB1YmxpYyBpbnQgZ2V0SGVpZ2h0KCkKLQotcHVibGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uIGdldFRyYW5zcGFyZW50UmVnaW9uKAotYW5kcm9pZC5ncmFwaGljcy5SZWN0KQotCi1wdWJsaWMgaW50IGdldFdpZHRoKCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzQWxwaGEoKQotCi1wdWJsaWMgdm9pZCBzZXRQYWludCgKLWFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNjQwOSBuYW1lID1BbGlnbiApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9FbnVtPExhbmRyb2lkL2dyYXBoaWNzL1BhaW50JEFsaWduOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2dyYXBoaWNzL1BhaW50OyApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5ncmFwaGljcy5QYWludCRBbGlnbiBleHRlbmRzIGphdmEubGFuZy5FbnVtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQkQWxpZ25bXSAkVkFMVUVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYWludCRBbGlnbiBDRU5URVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50JEFsaWduIExFRlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50JEFsaWduIFJJR0hUCi0KLWZpbmFsIGludCBuYXRpdmVJbnQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KEkpViApCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5QYWludCRBbGlnbiB2YWx1ZU9mKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmdyYXBoaWNzLlBhaW50JEFsaWduW10gdmFsdWVzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9ncmFwaGljcy9QYWludDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvRW51bTxMYW5kcm9pZC9ncmFwaGljcy9QYWludCRDYXA7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNjQwOSBuYW1lID1DYXAgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQkQ2FwIGV4dGVuZHMgamF2YS5sYW5nLkVudW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYWludCRDYXBbXSAkVkFMVUVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYWludCRDYXAgQlVUVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQkQ2FwIFJPVU5ECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYWludCRDYXAgU1FVQVJFCi0KLWZpbmFsIGludCBuYXRpdmVJbnQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KEkpViApCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5QYWludCRDYXAgdmFsdWVPZigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5QYWludCRDYXBbXSB2YWx1ZXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2dyYXBoaWNzL1BhaW50OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9Rm9udE1ldHJpY3MgKQotcHVibGljIGNsYXNzIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQkRm9udE1ldHJpY3MgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBmbG9hdCBhc2NlbnQKLQotcHVibGljIGZsb2F0IGJvdHRvbQotCi1wdWJsaWMgZmxvYXQgZGVzY2VudAotCi1wdWJsaWMgZmxvYXQgbGVhZGluZwotCi1wdWJsaWMgZmxvYXQgdG9wCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9ncmFwaGljcy9QYWludDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPUZvbnRNZXRyaWNzSW50ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmdyYXBoaWNzLlBhaW50JEZvbnRNZXRyaWNzSW50IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgaW50IGFzY2VudAotCi1wdWJsaWMgaW50IGJvdHRvbQotCi1wdWJsaWMgaW50IGRlc2NlbnQKLQotcHVibGljIGludCBsZWFkaW5nCi0KLXB1YmxpYyBpbnQgdG9wCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTY0MDkgbmFtZSA9Sm9pbiApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9FbnVtPExhbmRyb2lkL2dyYXBoaWNzL1BhaW50JEpvaW47PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvZ3JhcGhpY3MvUGFpbnQ7ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLmdyYXBoaWNzLlBhaW50JEpvaW4gZXh0ZW5kcyBqYXZhLmxhbmcuRW51bQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50JEpvaW5bXSAkVkFMVUVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYWludCRKb2luIEJFVkVMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYWludCRKb2luIE1JVEVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYWludCRKb2luIFJPVU5ECi0KLWZpbmFsIGludCBuYXRpdmVJbnQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KEkpViApCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5QYWludCRKb2luIHZhbHVlT2YoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQkSm9pbltdIHZhbHVlcygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvRW51bTxMYW5kcm9pZC9ncmFwaGljcy9QYWludCRTdHlsZTs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE2NDA5IG5hbWUgPVN0eWxlICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2dyYXBoaWNzL1BhaW50OyApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5ncmFwaGljcy5QYWludCRTdHlsZSBleHRlbmRzIGphdmEubGFuZy5FbnVtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQkU3R5bGVbXSAkVkFMVUVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYWludCRTdHlsZSBGSUxMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYWludCRTdHlsZSBGSUxMX0FORF9TVFJPS0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50JFN0eWxlIFNUUk9LRQotCi1maW5hbCBpbnQgbmF0aXZlSW50Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJKVYgKQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQkU3R5bGUgdmFsdWVPZigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5QYWludCRTdHlsZVtdIHZhbHVlcygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9ncmFwaGljcy9QYWludCRGb250TWV0cmljc0ludDtMYW5kcm9pZC9ncmFwaGljcy9QYWludCRGb250TWV0cmljcztMYW5kcm9pZC9ncmFwaGljcy9QYWludCRBbGlnbjtMYW5kcm9pZC9ncmFwaGljcy9QYWludCRKb2luO0xhbmRyb2lkL2dyYXBoaWNzL1BhaW50JENhcDtMYW5kcm9pZC9ncmFwaGljcy9QYWludCRTdHlsZTsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFOVElfQUxJQVNfRkxBRwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9QQUlOVF9GTEFHUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZfS0VSTl9URVhUX0ZMQUcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElUSEVSX0ZMQUcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkFLRV9CT0xEX1RFWFRfRkxBRwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxURVJfQklUTUFQX0ZMQUcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTElORUFSX1RFWFRfRkxBRwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVFJJS0VfVEhSVV9URVhUX0ZMQUcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1VCUElYRUxfVEVYVF9GTEFHCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOREVSTElORV9URVhUX0ZMQUcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYWludCRBbGlnbltdIHNBbGlnbkFycmF5Ci0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQkQ2FwW10gc0NhcEFycmF5Ci0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQkSm9pbltdIHNKb2luQXJyYXkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYWludCRTdHlsZVtdIHNTdHlsZUFycmF5Ci0KLXByaXZhdGUgYW5kcm9pZC5ncmFwaGljcy5Db2xvckZpbHRlciBtQ29sb3JGaWx0ZXIKLQotcHJpdmF0ZSBhbmRyb2lkLmdyYXBoaWNzLk1hc2tGaWx0ZXIgbU1hc2tGaWx0ZXIKLQotIGludCBtTmF0aXZlUGFpbnQKLQotcHJpdmF0ZSBhbmRyb2lkLmdyYXBoaWNzLlBhdGhFZmZlY3QgbVBhdGhFZmZlY3QKLQotcHJpdmF0ZSBhbmRyb2lkLmdyYXBoaWNzLlJhc3Rlcml6ZXIgbVJhc3Rlcml6ZXIKLQotcHJpdmF0ZSBhbmRyb2lkLmdyYXBoaWNzLlNoYWRlciBtU2hhZGVyCi0KLXByaXZhdGUgYW5kcm9pZC5ncmFwaGljcy5UeXBlZmFjZSBtVHlwZWZhY2UKLQotcHJpdmF0ZSBhbmRyb2lkLmdyYXBoaWNzLlhmZXJtb2RlIG1YZmVybW9kZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmdyYXBoaWNzLlBhaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBmaW5hbGl6ZXIoCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZUdldENoYXJBcnJheUJvdW5kcygKLWludAotY2hhcltdCi1pbnQKLWludAotYW5kcm9pZC5ncmFwaGljcy5SZWN0KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVHZXRTdHJpbmdCb3VuZHMoCi1pbnQKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50Ci1hbmRyb2lkLmdyYXBoaWNzLlJlY3QpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBib29sZWFuIG5hdGl2ZV9nZXRGaWxsUGF0aCgKLWludAotaW50Ci1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBmbG9hdCBuYXRpdmVfZ2V0Rm9udE1ldHJpY3MoCi1pbnQKLWFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQkRm9udE1ldHJpY3MpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlX2dldFN0cm9rZUNhcCgKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVfZ2V0U3Ryb2tlSm9pbigKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVfZ2V0U3R5bGUoCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlX2dldFRleHRBbGlnbigKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX2dldFRleHRQYXRoKAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludAotZmxvYXQKLWZsb2F0Ci1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9nZXRUZXh0UGF0aCgKLWludAotY2hhcltdCi1pbnQKLWludAotZmxvYXQKLWZsb2F0Ci1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlX2dldFRleHRXaWR0aHMoCi1pbnQKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50Ci1mbG9hdFtdKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZV9nZXRUZXh0V2lkdGhzKAotaW50Ci1jaGFyW10KLWludAotaW50Ci1mbG9hdFtdKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZV9pbml0KCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVfaW5pdFdpdGhQYWludCgKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX3Jlc2V0KAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfc2V0KAotaW50Ci1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlX3NldENvbG9yRmlsdGVyKAotaW50Ci1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlX3NldE1hc2tGaWx0ZXIoCi1pbnQKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVfc2V0UGF0aEVmZmVjdCgKLWludAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZV9zZXRSYXN0ZXJpemVyKAotaW50Ci1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlX3NldFNoYWRlcigKLWludAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfc2V0U3Ryb2tlQ2FwKAotaW50Ci1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9zZXRTdHJva2VKb2luKAotaW50Ci1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9zZXRTdHlsZSgKLWludAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfc2V0VGV4dEFsaWduKAotaW50Ci1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlX3NldFR5cGVmYWNlKAotaW50Ci1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlX3NldFhmZXJtb2RlKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgZmxvYXQgYXNjZW50KCkKLQotcHVibGljIGludCBicmVha1RleHQoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludAotYm9vbGVhbgotZmxvYXQKLWZsb2F0W10pCi0KLXB1YmxpYyBuYXRpdmUgaW50IGJyZWFrVGV4dCgKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4KLWZsb2F0Ci1mbG9hdFtdKQotCi1wdWJsaWMgbmF0aXZlIGludCBicmVha1RleHQoCi1jaGFyW10KLWludAotaW50Ci1mbG9hdAotZmxvYXRbXSkKLQotcHVibGljIHZvaWQgY2xlYXJTaGFkb3dMYXllcigpCi0KLXB1YmxpYyBuYXRpdmUgZmxvYXQgZGVzY2VudCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9UaHJvd2FibGU7ICkKLXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkKLQotcHVibGljIG5hdGl2ZSBpbnQgZ2V0QWxwaGEoKQotCi1wdWJsaWMgbmF0aXZlIGludCBnZXRDb2xvcigpCi0KLXB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yRmlsdGVyIGdldENvbG9yRmlsdGVyKCkKLQotcHVibGljIGJvb2xlYW4gZ2V0RmlsbFBhdGgoCi1hbmRyb2lkLmdyYXBoaWNzLlBhdGgKLWFuZHJvaWQuZ3JhcGhpY3MuUGF0aCkKLQotcHVibGljIG5hdGl2ZSBpbnQgZ2V0RmxhZ3MoKQotCi1wdWJsaWMgbmF0aXZlIGZsb2F0IGdldEZvbnRNZXRyaWNzKAotYW5kcm9pZC5ncmFwaGljcy5QYWludCRGb250TWV0cmljcykKLQotcHVibGljIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQkRm9udE1ldHJpY3MgZ2V0Rm9udE1ldHJpY3MoKQotCi1wdWJsaWMgbmF0aXZlIGludCBnZXRGb250TWV0cmljc0ludCgKLWFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQkRm9udE1ldHJpY3NJbnQpCi0KLXB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLlBhaW50JEZvbnRNZXRyaWNzSW50IGdldEZvbnRNZXRyaWNzSW50KCkKLQotcHVibGljIGZsb2F0IGdldEZvbnRTcGFjaW5nKCkKLQotcHVibGljIGFuZHJvaWQuZ3JhcGhpY3MuTWFza0ZpbHRlciBnZXRNYXNrRmlsdGVyKCkKLQotcHVibGljIGFuZHJvaWQuZ3JhcGhpY3MuUGF0aEVmZmVjdCBnZXRQYXRoRWZmZWN0KCkKLQotcHVibGljIGFuZHJvaWQuZ3JhcGhpY3MuUmFzdGVyaXplciBnZXRSYXN0ZXJpemVyKCkKLQotcHVibGljIGFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyIGdldFNoYWRlcigpCi0KLXB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLlBhaW50JENhcCBnZXRTdHJva2VDYXAoKQotCi1wdWJsaWMgYW5kcm9pZC5ncmFwaGljcy5QYWludCRKb2luIGdldFN0cm9rZUpvaW4oKQotCi1wdWJsaWMgbmF0aXZlIGZsb2F0IGdldFN0cm9rZU1pdGVyKCkKLQotcHVibGljIG5hdGl2ZSBmbG9hdCBnZXRTdHJva2VXaWR0aCgpCi0KLXB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLlBhaW50JFN0eWxlIGdldFN0eWxlKCkKLQotcHVibGljIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQkQWxpZ24gZ2V0VGV4dEFsaWduKCkKLQotcHVibGljIHZvaWQgZ2V0VGV4dEJvdW5kcygKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50Ci1hbmRyb2lkLmdyYXBoaWNzLlJlY3QpCi0KLXB1YmxpYyB2b2lkIGdldFRleHRCb3VuZHMoCi1jaGFyW10KLWludAotaW50Ci1hbmRyb2lkLmdyYXBoaWNzLlJlY3QpCi0KLXB1YmxpYyB2b2lkIGdldFRleHRQYXRoKAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQKLWZsb2F0Ci1mbG9hdAotYW5kcm9pZC5ncmFwaGljcy5QYXRoKQotCi1wdWJsaWMgdm9pZCBnZXRUZXh0UGF0aCgKLWNoYXJbXQotaW50Ci1pbnQKLWZsb2F0Ci1mbG9hdAotYW5kcm9pZC5ncmFwaGljcy5QYXRoKQotCi1wdWJsaWMgbmF0aXZlIGZsb2F0IGdldFRleHRTY2FsZVgoKQotCi1wdWJsaWMgbmF0aXZlIGZsb2F0IGdldFRleHRTaXplKCkKLQotcHVibGljIG5hdGl2ZSBmbG9hdCBnZXRUZXh0U2tld1goKQotCi1wdWJsaWMgaW50IGdldFRleHRXaWR0aHMoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludAotZmxvYXRbXSkKLQotcHVibGljIGludCBnZXRUZXh0V2lkdGhzKAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQKLWZsb2F0W10pCi0KLXB1YmxpYyBpbnQgZ2V0VGV4dFdpZHRocygKLWphdmEubGFuZy5TdHJpbmcKLWZsb2F0W10pCi0KLXB1YmxpYyBpbnQgZ2V0VGV4dFdpZHRocygKLWNoYXJbXQotaW50Ci1pbnQKLWZsb2F0W10pCi0KLXB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLlR5cGVmYWNlIGdldFR5cGVmYWNlKCkKLQotcHVibGljIGFuZHJvaWQuZ3JhcGhpY3MuWGZlcm1vZGUgZ2V0WGZlcm1vZGUoKQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBpc0FudGlBbGlhcygpCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGlzRGl0aGVyKCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gaXNGYWtlQm9sZFRleHQoKQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBpc0ZpbHRlckJpdG1hcCgpCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGlzTGluZWFyVGV4dCgpCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGlzU3RyaWtlVGhydVRleHQoKQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBpc1N1YnBpeGVsVGV4dCgpCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGlzVW5kZXJsaW5lVGV4dCgpCi0KLXB1YmxpYyBmbG9hdCBtZWFzdXJlVGV4dCgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWludAotaW50KQotCi1wdWJsaWMgbmF0aXZlIGZsb2F0IG1lYXN1cmVUZXh0KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIG5hdGl2ZSBmbG9hdCBtZWFzdXJlVGV4dCgKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50KQotCi1wdWJsaWMgbmF0aXZlIGZsb2F0IG1lYXN1cmVUZXh0KAotY2hhcltdCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgcmVzZXQoKQotCi1wdWJsaWMgdm9pZCBzZXQoCi1hbmRyb2lkLmdyYXBoaWNzLlBhaW50KQotCi1wdWJsaWMgdm9pZCBzZXRBUkdCKAotaW50Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgc2V0QWxwaGEoCi1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBzZXRBbnRpQWxpYXMoCi1ib29sZWFuKQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgc2V0Q29sb3IoCi1pbnQpCi0KLXB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yRmlsdGVyIHNldENvbG9yRmlsdGVyKAotYW5kcm9pZC5ncmFwaGljcy5Db2xvckZpbHRlcikKLQotcHVibGljIG5hdGl2ZSB2b2lkIHNldERpdGhlcigKLWJvb2xlYW4pCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBzZXRGYWtlQm9sZFRleHQoCi1ib29sZWFuKQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgc2V0RmlsdGVyQml0bWFwKAotYm9vbGVhbikKLQotcHVibGljIG5hdGl2ZSB2b2lkIHNldEZsYWdzKAotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgc2V0TGluZWFyVGV4dCgKLWJvb2xlYW4pCi0KLXB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLk1hc2tGaWx0ZXIgc2V0TWFza0ZpbHRlcigKLWFuZHJvaWQuZ3JhcGhpY3MuTWFza0ZpbHRlcikKLQotcHVibGljIGFuZHJvaWQuZ3JhcGhpY3MuUGF0aEVmZmVjdCBzZXRQYXRoRWZmZWN0KAotYW5kcm9pZC5ncmFwaGljcy5QYXRoRWZmZWN0KQotCi1wdWJsaWMgYW5kcm9pZC5ncmFwaGljcy5SYXN0ZXJpemVyIHNldFJhc3Rlcml6ZXIoCi1hbmRyb2lkLmdyYXBoaWNzLlJhc3Rlcml6ZXIpCi0KLXB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLlNoYWRlciBzZXRTaGFkZXIoCi1hbmRyb2lkLmdyYXBoaWNzLlNoYWRlcikKLQotcHVibGljIG5hdGl2ZSB2b2lkIHNldFNoYWRvd0xheWVyKAotZmxvYXQKLWZsb2F0Ci1mbG9hdAotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgc2V0U3RyaWtlVGhydVRleHQoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRTdHJva2VDYXAoCi1hbmRyb2lkLmdyYXBoaWNzLlBhaW50JENhcCkKLQotcHVibGljIHZvaWQgc2V0U3Ryb2tlSm9pbigKLWFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQkSm9pbikKLQotcHVibGljIG5hdGl2ZSB2b2lkIHNldFN0cm9rZU1pdGVyKAotZmxvYXQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBzZXRTdHJva2VXaWR0aCgKLWZsb2F0KQotCi1wdWJsaWMgdm9pZCBzZXRTdHlsZSgKLWFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQkU3R5bGUpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBzZXRTdWJwaXhlbFRleHQoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRUZXh0QWxpZ24oCi1hbmRyb2lkLmdyYXBoaWNzLlBhaW50JEFsaWduKQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgc2V0VGV4dFNjYWxlWCgKLWZsb2F0KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgc2V0VGV4dFNpemUoCi1mbG9hdCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIHNldFRleHRTa2V3WCgKLWZsb2F0KQotCi1wdWJsaWMgYW5kcm9pZC5ncmFwaGljcy5UeXBlZmFjZSBzZXRUeXBlZmFjZSgKLWFuZHJvaWQuZ3JhcGhpY3MuVHlwZWZhY2UpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBzZXRVbmRlcmxpbmVUZXh0KAotYm9vbGVhbikKLQotcHVibGljIGFuZHJvaWQuZ3JhcGhpY3MuWGZlcm1vZGUgc2V0WGZlcm1vZGUoCi1hbmRyb2lkLmdyYXBoaWNzLlhmZXJtb2RlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnRGbGFnc0RyYXdGaWx0ZXIgZXh0ZW5kcyBhbmRyb2lkLmdyYXBoaWNzLkRyYXdGaWx0ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVDb25zdHJ1Y3RvcigKLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTY0MDkgbmFtZSA9RGlyZWN0aW9uICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL0VudW08TGFuZHJvaWQvZ3JhcGhpY3MvUGF0aCREaXJlY3Rpb247PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvZ3JhcGhpY3MvUGF0aDsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQuZ3JhcGhpY3MuUGF0aCREaXJlY3Rpb24gZXh0ZW5kcyBqYXZhLmxhbmcuRW51bQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBhdGgkRGlyZWN0aW9uW10gJFZBTFVFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGF0aCREaXJlY3Rpb24gQ0NXCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYXRoJERpcmVjdGlvbiBDVwotCi1maW5hbCBpbnQgbmF0aXZlSW50Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJKVYgKQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuUGF0aCREaXJlY3Rpb24gdmFsdWVPZigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5QYXRoJERpcmVjdGlvbltdIHZhbHVlcygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvRW51bTxMYW5kcm9pZC9ncmFwaGljcy9QYXRoJEZpbGxUeXBlOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2dyYXBoaWNzL1BhdGg7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTY0MDkgbmFtZSA9RmlsbFR5cGUgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQuZ3JhcGhpY3MuUGF0aCRGaWxsVHlwZSBleHRlbmRzIGphdmEubGFuZy5FbnVtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGF0aCRGaWxsVHlwZVtdICRWQUxVRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBhdGgkRmlsbFR5cGUgRVZFTl9PREQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBhdGgkRmlsbFR5cGUgSU5WRVJTRV9FVkVOX09ERAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGF0aCRGaWxsVHlwZSBJTlZFUlNFX1dJTkRJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBhdGgkRmlsbFR5cGUgV0lORElORwotCi1maW5hbCBpbnQgbmF0aXZlSW50Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJKVYgKQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuUGF0aCRGaWxsVHlwZSB2YWx1ZU9mKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmdyYXBoaWNzLlBhdGgkRmlsbFR5cGVbXSB2YWx1ZXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvZ3JhcGhpY3MvUGF0aCREaXJlY3Rpb247TGFuZHJvaWQvZ3JhcGhpY3MvUGF0aCRGaWxsVHlwZTsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQuZ3JhcGhpY3MuUGF0aCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYXRoJEZpbGxUeXBlW10gc0ZpbGxUeXBlQXJyYXkKLQotcHJpdmF0ZSBmaW5hbCBpbnQgbU5hdGl2ZVBhdGgKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuZ3JhcGhpY3MuUGF0aCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgZmluYWxpemVyKAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IGluaXQxKCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBpbml0MigKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX2FkZEFyYygKLWludAotYW5kcm9pZC5ncmFwaGljcy5SZWN0RgotZmxvYXQKLWZsb2F0KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfYWRkQ2lyY2xlKAotaW50Ci1mbG9hdAotZmxvYXQKLWZsb2F0Ci1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9hZGRPdmFsKAotaW50Ci1hbmRyb2lkLmdyYXBoaWNzLlJlY3RGCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9hZGRQYXRoKAotaW50Ci1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9hZGRQYXRoKAotaW50Ci1pbnQKLWZsb2F0Ci1mbG9hdCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX2FkZFBhdGgoCi1pbnQKLWludAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfYWRkUmVjdCgKLWludAotZmxvYXQKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX2FkZFJlY3QoCi1pbnQKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdEYKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX2FkZFJvdW5kUmVjdCgKLWludAotYW5kcm9pZC5ncmFwaGljcy5SZWN0RgotZmxvYXQKLWZsb2F0Ci1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9hZGRSb3VuZFJlY3QoCi1pbnQKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdEYKLWZsb2F0W10KLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX2FyY1RvKAotaW50Ci1hbmRyb2lkLmdyYXBoaWNzLlJlY3RGCi1mbG9hdAotZmxvYXQKLWJvb2xlYW4pCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9jbG9zZSgKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX2NvbXB1dGVCb3VuZHMoCi1pbnQKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdEYKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX2N1YmljVG8oCi1pbnQKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWZsb2F0Ci1mbG9hdAotZmxvYXQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlX2dldEZpbGxUeXBlKAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfaW5jUmVzZXJ2ZSgKLWludAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBuYXRpdmVfaXNFbXB0eSgKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gbmF0aXZlX2lzUmVjdCgKLWludAotYW5kcm9pZC5ncmFwaGljcy5SZWN0RikKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX2xpbmVUbygKLWludAotZmxvYXQKLWZsb2F0KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfbW92ZVRvKAotaW50Ci1mbG9hdAotZmxvYXQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9vZmZzZXQoCi1pbnQKLWZsb2F0Ci1mbG9hdCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX29mZnNldCgKLWludAotZmxvYXQKLWZsb2F0Ci1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9xdWFkVG8oCi1pbnQKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWZsb2F0KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfckN1YmljVG8oCi1pbnQKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWZsb2F0Ci1mbG9hdAotZmxvYXQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9yTGluZVRvKAotaW50Ci1mbG9hdAotZmxvYXQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9yTW92ZVRvKAotaW50Ci1mbG9hdAotZmxvYXQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9yUXVhZFRvKAotaW50Ci1mbG9hdAotZmxvYXQKLWZsb2F0Ci1mbG9hdCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX3Jlc2V0KAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfcmV3aW5kKAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfc2V0KAotaW50Ci1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9zZXRGaWxsVHlwZSgKLWludAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfc2V0TGFzdFBvaW50KAotaW50Ci1mbG9hdAotZmxvYXQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV90cmFuc2Zvcm0oCi1pbnQKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX3RyYW5zZm9ybSgKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIGFkZEFyYygKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdEYKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIHZvaWQgYWRkQ2lyY2xlKAotZmxvYXQKLWZsb2F0Ci1mbG9hdAotYW5kcm9pZC5ncmFwaGljcy5QYXRoJERpcmVjdGlvbikKLQotcHVibGljIHZvaWQgYWRkT3ZhbCgKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdEYKLWFuZHJvaWQuZ3JhcGhpY3MuUGF0aCREaXJlY3Rpb24pCi0KLXB1YmxpYyB2b2lkIGFkZFBhdGgoCi1hbmRyb2lkLmdyYXBoaWNzLlBhdGgpCi0KLXB1YmxpYyB2b2lkIGFkZFBhdGgoCi1hbmRyb2lkLmdyYXBoaWNzLlBhdGgKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIHZvaWQgYWRkUGF0aCgKLWFuZHJvaWQuZ3JhcGhpY3MuUGF0aAotYW5kcm9pZC5ncmFwaGljcy5NYXRyaXgpCi0KLXB1YmxpYyB2b2lkIGFkZFJlY3QoCi1mbG9hdAotZmxvYXQKLWZsb2F0Ci1mbG9hdAotYW5kcm9pZC5ncmFwaGljcy5QYXRoJERpcmVjdGlvbikKLQotcHVibGljIHZvaWQgYWRkUmVjdCgKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdEYKLWFuZHJvaWQuZ3JhcGhpY3MuUGF0aCREaXJlY3Rpb24pCi0KLXB1YmxpYyB2b2lkIGFkZFJvdW5kUmVjdCgKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdEYKLWZsb2F0Ci1mbG9hdAotYW5kcm9pZC5ncmFwaGljcy5QYXRoJERpcmVjdGlvbikKLQotcHVibGljIHZvaWQgYWRkUm91bmRSZWN0KAotYW5kcm9pZC5ncmFwaGljcy5SZWN0RgotZmxvYXRbXQotYW5kcm9pZC5ncmFwaGljcy5QYXRoJERpcmVjdGlvbikKLQotcHVibGljIHZvaWQgYXJjVG8oCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3RGCi1mbG9hdAotZmxvYXQpCi0KLXB1YmxpYyB2b2lkIGFyY1RvKAotYW5kcm9pZC5ncmFwaGljcy5SZWN0RgotZmxvYXQKLWZsb2F0Ci1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBjbG9zZSgpCi0KLXB1YmxpYyB2b2lkIGNvbXB1dGVCb3VuZHMoCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3RGCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBjdWJpY1RvKAotZmxvYXQKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWZsb2F0Ci1mbG9hdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL1Rocm93YWJsZTsgKQotcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKQotCi1wdWJsaWMgYW5kcm9pZC5ncmFwaGljcy5QYXRoJEZpbGxUeXBlIGdldEZpbGxUeXBlKCkKLQotcHVibGljIHZvaWQgaW5jUmVzZXJ2ZSgKLWludCkKLQotcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpCi0KLXB1YmxpYyBib29sZWFuIGlzSW52ZXJzZUZpbGxUeXBlKCkKLQotcHVibGljIGJvb2xlYW4gaXNSZWN0KAotYW5kcm9pZC5ncmFwaGljcy5SZWN0RikKLQotcHVibGljIHZvaWQgbGluZVRvKAotZmxvYXQKLWZsb2F0KQotCi1wdWJsaWMgdm9pZCBtb3ZlVG8oCi1mbG9hdAotZmxvYXQpCi0KLWZpbmFsIGludCBuaSgpCi0KLXB1YmxpYyB2b2lkIG9mZnNldCgKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIHZvaWQgb2Zmc2V0KAotZmxvYXQKLWZsb2F0Ci1hbmRyb2lkLmdyYXBoaWNzLlBhdGgpCi0KLXB1YmxpYyB2b2lkIHF1YWRUbygKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWZsb2F0KQotCi1wdWJsaWMgdm9pZCByQ3ViaWNUbygKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWZsb2F0Ci1mbG9hdAotZmxvYXQpCi0KLXB1YmxpYyB2b2lkIHJMaW5lVG8oCi1mbG9hdAotZmxvYXQpCi0KLXB1YmxpYyB2b2lkIHJNb3ZlVG8oCi1mbG9hdAotZmxvYXQpCi0KLXB1YmxpYyB2b2lkIHJRdWFkVG8oCi1mbG9hdAotZmxvYXQKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIHZvaWQgcmVzZXQoKQotCi1wdWJsaWMgdm9pZCByZXdpbmQoKQotCi1wdWJsaWMgdm9pZCBzZXQoCi1hbmRyb2lkLmdyYXBoaWNzLlBhdGgpCi0KLXB1YmxpYyB2b2lkIHNldEZpbGxUeXBlKAotYW5kcm9pZC5ncmFwaGljcy5QYXRoJEZpbGxUeXBlKQotCi1wdWJsaWMgdm9pZCBzZXRMYXN0UG9pbnQoCi1mbG9hdAotZmxvYXQpCi0KLXB1YmxpYyB2b2lkIHRvZ2dsZUludmVyc2VGaWxsVHlwZSgpCi0KLXB1YmxpYyB2b2lkIHRyYW5zZm9ybSgKLWFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4KQotCi1wdWJsaWMgdm9pZCB0cmFuc2Zvcm0oCi1hbmRyb2lkLmdyYXBoaWNzLk1hdHJpeAotYW5kcm9pZC5ncmFwaGljcy5QYXRoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL0VudW08TGFuZHJvaWQvZ3JhcGhpY3MvUGF0aERhc2hQYXRoRWZmZWN0JFN0eWxlOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2dyYXBoaWNzL1BhdGhEYXNoUGF0aEVmZmVjdDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNjQwOSBuYW1lID1TdHlsZSApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5ncmFwaGljcy5QYXRoRGFzaFBhdGhFZmZlY3QkU3R5bGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBhdGhEYXNoUGF0aEVmZmVjdCRTdHlsZVtdICRWQUxVRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBhdGhEYXNoUGF0aEVmZmVjdCRTdHlsZSBNT1JQSAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGF0aERhc2hQYXRoRWZmZWN0JFN0eWxlIFJPVEFURQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGF0aERhc2hQYXRoRWZmZWN0JFN0eWxlIFRSQU5TTEFURQotCi0gaW50IG5hdGl2ZV9zdHlsZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSSlWICkKLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmdyYXBoaWNzLlBhdGhEYXNoUGF0aEVmZmVjdCRTdHlsZSB2YWx1ZU9mKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmdyYXBoaWNzLlBhdGhEYXNoUGF0aEVmZmVjdCRTdHlsZVtdIHZhbHVlcygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9ncmFwaGljcy9QYXRoRGFzaFBhdGhFZmZlY3QkU3R5bGU7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmdyYXBoaWNzLlBhdGhEYXNoUGF0aEVmZmVjdCBleHRlbmRzIGFuZHJvaWQuZ3JhcGhpY3MuUGF0aEVmZmVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuZ3JhcGhpY3MuUGF0aAotZmxvYXQKLWZsb2F0Ci1hbmRyb2lkLmdyYXBoaWNzLlBhdGhEYXNoUGF0aEVmZmVjdCRTdHlsZSkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVDcmVhdGUoCi1pbnQKLWZsb2F0Ci1mbG9hdAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuZ3JhcGhpY3MuUGF0aE1lYXN1cmUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPU0lUSU9OX01BVFJJWF9GTEFHCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBTkdFTlRfTUFUUklYX0ZMQUcKLQotcHJpdmF0ZSBmaW5hbCBpbnQgbmF0aXZlX2luc3RhbmNlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5ncmFwaGljcy5QYXRoCi1ib29sZWFuKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZV9jcmVhdGUoCi1pbnQKLWJvb2xlYW4pCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9kZXN0cm95KAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgZmxvYXQgbmF0aXZlX2dldExlbmd0aCgKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gbmF0aXZlX2dldE1hdHJpeCgKLWludAotZmxvYXQKLWludAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBuYXRpdmVfZ2V0UG9zVGFuKAotaW50Ci1mbG9hdAotZmxvYXRbXQotZmxvYXRbXSkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gbmF0aXZlX2dldFNlZ21lbnQoCi1pbnQKLWZsb2F0Ci1mbG9hdAotaW50Ci1ib29sZWFuKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBuYXRpdmVfaXNDbG9zZWQoCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBib29sZWFuIG5hdGl2ZV9uZXh0Q29udG91cigKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX3NldFBhdGgoCi1pbnQKLWludAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL1Rocm93YWJsZTsgKQotcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKQotCi1wdWJsaWMgZmxvYXQgZ2V0TGVuZ3RoKCkKLQotcHVibGljIGJvb2xlYW4gZ2V0TWF0cml4KAotZmxvYXQKLWFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4Ci1pbnQpCi0KLXB1YmxpYyBib29sZWFuIGdldFBvc1RhbigKLWZsb2F0Ci1mbG9hdFtdCi1mbG9hdFtdKQotCi1wdWJsaWMgYm9vbGVhbiBnZXRTZWdtZW50KAotZmxvYXQKLWZsb2F0Ci1hbmRyb2lkLmdyYXBoaWNzLlBhdGgKLWJvb2xlYW4pCi0KLXB1YmxpYyBib29sZWFuIGlzQ2xvc2VkKCkKLQotcHVibGljIGJvb2xlYW4gbmV4dENvbnRvdXIoKQotCi1wdWJsaWMgdm9pZCBzZXRQYXRoKAotYW5kcm9pZC5ncmFwaGljcy5QYXRoCi1ib29sZWFuKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9UmVjb3JkaW5nQ2FudmFzICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2dyYXBoaWNzL1BpY3R1cmU7ICkKLSBjbGFzcyBhbmRyb2lkLmdyYXBoaWNzLlBpY3R1cmUkUmVjb3JkaW5nQ2FudmFzIGV4dGVuZHMgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBpY3R1cmUgbVBpY3R1cmUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmdyYXBoaWNzLlBpY3R1cmUKLWludCkKLQotcHVibGljIHZvaWQgZHJhd1BpY3R1cmUoCi1hbmRyb2lkLmdyYXBoaWNzLlBpY3R1cmUpCi0KLXB1YmxpYyB2b2lkIHNldEJpdG1hcCgKLWFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvZ3JhcGhpY3MvUGljdHVyZSRSZWNvcmRpbmdDYW52YXM7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmdyYXBoaWNzLlBpY3R1cmUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXT1JLSU5HX1NUUkVBTV9TVE9SQUdFCi0KLXByaXZhdGUgZmluYWwgaW50IG1OYXRpdmVQaWN0dXJlCi0KLXByaXZhdGUgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMgbVJlY29yZGluZ0NhbnZhcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1pbnQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuZ3JhcGhpY3MuUGljdHVyZSkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmdyYXBoaWNzLlBpY3R1cmUgY3JlYXRlRnJvbVN0cmVhbSgKLWphdmEuaW8uSW5wdXRTdHJlYW0pCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlQmVnaW5SZWNvcmRpbmcoCi1pbnQKLWludAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZUNvbnN0cnVjdG9yKAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZUNyZWF0ZUZyb21TdHJlYW0oCi1qYXZhLmlvLklucHV0U3RyZWFtCi1ieXRlW10pCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZURlc3RydWN0b3IoCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZURyYXcoCi1pbnQKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlRW5kUmVjb3JkaW5nKAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBuYXRpdmVXcml0ZVRvU3RyZWFtKAotaW50Ci1qYXZhLmlvLk91dHB1dFN0cmVhbQotYnl0ZVtdKQotCi1wdWJsaWMgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMgYmVnaW5SZWNvcmRpbmcoCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgZHJhdygKLWFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzKQotCi1wdWJsaWMgdm9pZCBlbmRSZWNvcmRpbmcoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvVGhyb3dhYmxlOyApCi1wcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpCi0KLXB1YmxpYyBuYXRpdmUgaW50IGdldEhlaWdodCgpCi0KLXB1YmxpYyBuYXRpdmUgaW50IGdldFdpZHRoKCkKLQotZmluYWwgaW50IG5pKCkKLQotcHVibGljIHZvaWQgd3JpdGVUb1N0cmVhbSgKLWphdmEuaW8uT3V0cHV0U3RyZWFtKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuZ3JhcGhpY3MuUGl4ZWxGb3JtYXQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFfOAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBKUEVHCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExBXzg4Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExfOAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUEFRVUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkdCQV80NDQ0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJHQkFfNTU1MQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSR0JBXzg4ODgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkdCWF84ODg4Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJHQl8zMzIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkdCXzU2NQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSR0JfODg4Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSQU5TTFVDRU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSQU5TUEFSRU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOS05PV04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWUNiQ3JfNDIwX1NQCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFlDYkNyXzQyMl9TUAotCi1wdWJsaWMgaW50IGJpdHNQZXJQaXhlbAotCi1wdWJsaWMgaW50IGJ5dGVzUGVyUGl4ZWwKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBmb3JtYXRIYXNBbHBoYSgKLWludCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBnZXRQaXhlbEZvcm1hdEluZm8oCi1pbnQKLWFuZHJvaWQuZ3JhcGhpY3MuUGl4ZWxGb3JtYXQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZUNsYXNzSW5pdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5ncmFwaGljcy5QaXhlbFhvclhmZXJtb2RlIGV4dGVuZHMgYW5kcm9pZC5ncmFwaGljcy5YZmVybW9kZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVDcmVhdGUoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5ncmFwaGljcy5Qb2ludCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGludCB4Ci0KLXB1YmxpYyBpbnQgeQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmdyYXBoaWNzLlBvaW50KQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBlcXVhbHMoCi1pbnQKLWludCkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIG5lZ2F0ZSgpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIG9mZnNldCgKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXQoCi1pbnQKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnRGIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgZmxvYXQgeAotCi1wdWJsaWMgZmxvYXQgeQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5ncmFwaGljcy5Qb2ludCkKLQotcHVibGljIHN0YXRpYyBmbG9hdCBsZW5ndGgoCi1mbG9hdAotZmxvYXQpCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGVxdWFscygKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIGZpbmFsIGZsb2F0IGxlbmd0aCgpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIG5lZ2F0ZSgpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIG9mZnNldCgKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIGZpbmFsIHZvaWQgc2V0KAotZmxvYXQKLWZsb2F0KQotCi1wdWJsaWMgZmluYWwgdm9pZCBzZXQoCi1hbmRyb2lkLmdyYXBoaWNzLlBvaW50RikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9FbnVtPExhbmRyb2lkL2dyYXBoaWNzL1BvcnRlckR1ZmYkTW9kZTs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE2NDA5IG5hbWUgPU1vZGUgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvZ3JhcGhpY3MvUG9ydGVyRHVmZjsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZiRNb2RlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmJE1vZGVbXSAkVkFMVUVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmJE1vZGUgQ0xFQVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmYkTW9kZSBEQVJLRU4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmYkTW9kZSBEU1QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmYkTW9kZSBEU1RfQVRPUAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZiRNb2RlIERTVF9JTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZiRNb2RlIERTVF9PVVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmYkTW9kZSBEU1RfT1ZFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZiRNb2RlIExJR0hURU4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmYkTW9kZSBNVUxUSVBMWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZiRNb2RlIFNDUkVFTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZiRNb2RlIFNSQwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZiRNb2RlIFNSQ19BVE9QCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmJE1vZGUgU1JDX0lOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmJE1vZGUgU1JDX09VVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZiRNb2RlIFNSQ19PVkVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmJE1vZGUgWE9SCi0KLWZpbmFsIGludCBuYXRpdmVJbnQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KEkpViApCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmJE1vZGUgdmFsdWVPZigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmJE1vZGVbXSB2YWx1ZXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvZ3JhcGhpY3MvUG9ydGVyRHVmZiRNb2RlOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmQ29sb3JGaWx0ZXIgZXh0ZW5kcyBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yRmlsdGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50Ci1hbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmYkTW9kZSkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVfQ3JlYXRlUG9ydGVyRHVmZkZpbHRlcigKLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZlhmZXJtb2RlIGV4dGVuZHMgYW5kcm9pZC5ncmFwaGljcy5YZmVybW9kZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZiRNb2RlKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZUNyZWF0ZVhmZXJtb2RlKAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuZ3JhcGhpY3MuUmFkaWFsR3JhZGllbnQgZXh0ZW5kcyBhbmRyb2lkLmdyYXBoaWNzLlNoYWRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWludAotaW50Ci1hbmRyb2lkLmdyYXBoaWNzLlNoYWRlciRUaWxlTW9kZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotZmxvYXQKLWZsb2F0Ci1mbG9hdAotaW50W10KLWZsb2F0W10KLWFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyJFRpbGVNb2RlKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZUNyZWF0ZTEoCi1mbG9hdAotZmxvYXQKLWZsb2F0Ci1pbnRbXQotZmxvYXRbXQotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZUNyZWF0ZTIoCi1mbG9hdAotZmxvYXQKLWZsb2F0Ci1pbnQKLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I8TGFuZHJvaWQvZ3JhcGhpY3MvUmVjdDs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9ncmFwaGljcy9SZWN0OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1maW5hbCBjbGFzcyBhbmRyb2lkLmdyYXBoaWNzLlJlY3QkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLlJlY3QgY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLlJlY3RbXSBuZXdBcnJheSgKLWludCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3RbXSBuZXdBcnJheSgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLmdyYXBoaWNzLlJlY3QgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExhbmRyb2lkL2dyYXBoaWNzL1JlY3Q7PjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvciBDUkVBVE9SCi0KLXB1YmxpYyBpbnQgYm90dG9tCi0KLXB1YmxpYyBpbnQgbGVmdAotCi1wdWJsaWMgaW50IHJpZ2h0Ci0KLXB1YmxpYyBpbnQgdG9wCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdCkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGludGVyc2VjdHMoCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3QKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdCkKLQotcHVibGljIGZpbmFsIGludCBjZW50ZXJYKCkKLQotcHVibGljIGZpbmFsIGludCBjZW50ZXJZKCkKLQotcHVibGljIGJvb2xlYW4gY29udGFpbnMoCi1pbnQKLWludCkKLQotcHVibGljIGJvb2xlYW4gY29udGFpbnMoCi1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKAotYW5kcm9pZC5ncmFwaGljcy5SZWN0KQotCi1wdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgZmluYWwgZmxvYXQgZXhhY3RDZW50ZXJYKCkKLQotcHVibGljIGZpbmFsIGZsb2F0IGV4YWN0Q2VudGVyWSgpCi0KLXB1YmxpYyBmaW5hbCBpbnQgaGVpZ2h0KCkKLQotcHVibGljIHZvaWQgaW5zZXQoCi1pbnQKLWludCkKLQotcHVibGljIGJvb2xlYW4gaW50ZXJzZWN0KAotaW50Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBpbnRlcnNlY3QoCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3QpCi0KLXB1YmxpYyBib29sZWFuIGludGVyc2VjdHMoCi1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGlzRW1wdHkoKQotCi1wdWJsaWMgdm9pZCBvZmZzZXQoCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgb2Zmc2V0VG8oCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgcmVhZEZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIHZvaWQgc2V0KAotaW50Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXQoCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3QpCi0KLXB1YmxpYyB2b2lkIHNldEVtcHR5KCkKLQotcHVibGljIGJvb2xlYW4gc2V0SW50ZXJzZWN0KAotYW5kcm9pZC5ncmFwaGljcy5SZWN0Ci1hbmRyb2lkLmdyYXBoaWNzLlJlY3QpCi0KLXB1YmxpYyB2b2lkIHNvcnQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLXB1YmxpYyB2b2lkIHVuaW9uKAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIHVuaW9uKAotaW50Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCB1bmlvbigKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdCkKLQotcHVibGljIGZpbmFsIGludCB3aWR0aCgpCi0KLXB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuZ3JhcGhpY3MuUmVjdEYgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBmbG9hdCBib3R0b20KLQotcHVibGljIGZsb2F0IGxlZnQKLQotcHVibGljIGZsb2F0IHJpZ2h0Ci0KLXB1YmxpYyBmbG9hdCB0b3AKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1mbG9hdAotZmxvYXQKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5ncmFwaGljcy5SZWN0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3RGKQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaW50ZXJzZWN0cygKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdEYKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdEYpCi0KLXB1YmxpYyBmaW5hbCBmbG9hdCBjZW50ZXJYKCkKLQotcHVibGljIGZpbmFsIGZsb2F0IGNlbnRlclkoKQotCi1wdWJsaWMgYm9vbGVhbiBjb250YWlucygKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIGJvb2xlYW4gY29udGFpbnMoCi1mbG9hdAotZmxvYXQKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIGJvb2xlYW4gY29udGFpbnMoCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3RGKQotCi1wdWJsaWMgZmluYWwgZmxvYXQgaGVpZ2h0KCkKLQotcHVibGljIHZvaWQgaW5zZXQoCi1mbG9hdAotZmxvYXQpCi0KLXB1YmxpYyBib29sZWFuIGludGVyc2VjdCgKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWZsb2F0KQotCi1wdWJsaWMgYm9vbGVhbiBpbnRlcnNlY3QoCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3RGKQotCi1wdWJsaWMgYm9vbGVhbiBpbnRlcnNlY3RzKAotZmxvYXQKLWZsb2F0Ci1mbG9hdAotZmxvYXQpCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGlzRW1wdHkoKQotCi1wdWJsaWMgdm9pZCBvZmZzZXQoCi1mbG9hdAotZmxvYXQpCi0KLXB1YmxpYyB2b2lkIG9mZnNldFRvKAotZmxvYXQKLWZsb2F0KQotCi1wdWJsaWMgdm9pZCByb3VuZCgKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdCkKLQotcHVibGljIHZvaWQgcm91bmRPdXQoCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3QpCi0KLXB1YmxpYyB2b2lkIHNldCgKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWZsb2F0KQotCi1wdWJsaWMgdm9pZCBzZXQoCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3QpCi0KLXB1YmxpYyB2b2lkIHNldCgKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdEYpCi0KLXB1YmxpYyB2b2lkIHNldEVtcHR5KCkKLQotcHVibGljIGJvb2xlYW4gc2V0SW50ZXJzZWN0KAotYW5kcm9pZC5ncmFwaGljcy5SZWN0RgotYW5kcm9pZC5ncmFwaGljcy5SZWN0RikKLQotcHVibGljIHZvaWQgc29ydCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotcHVibGljIHZvaWQgdW5pb24oCi1mbG9hdAotZmxvYXQpCi0KLXB1YmxpYyB2b2lkIHVuaW9uKAotZmxvYXQKLWZsb2F0Ci1mbG9hdAotZmxvYXQpCi0KLXB1YmxpYyB2b2lkIHVuaW9uKAotYW5kcm9pZC5ncmFwaGljcy5SZWN0RikKLQotcHVibGljIGZpbmFsIGZsb2F0IHdpZHRoKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9ncmFwaGljcy9SZWdpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I8TGFuZHJvaWQvZ3JhcGhpY3MvUmVnaW9uOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLWZpbmFsIGNsYXNzIGFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgYW5kcm9pZC5ncmFwaGljcy5SZWdpb24gY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbltdIG5ld0FycmF5KAotaW50KQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdFtdIG5ld0FycmF5KAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL0VudW08TGFuZHJvaWQvZ3JhcGhpY3MvUmVnaW9uJE9wOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTY0MDkgbmFtZSA9T3AgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvZ3JhcGhpY3MvUmVnaW9uOyApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5ncmFwaGljcy5SZWdpb24kT3AgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbiRPcFtdICRWQUxVRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbiRPcCBESUZGRVJFTkNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5SZWdpb24kT3AgSU5URVJTRUNUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5SZWdpb24kT3AgUkVQTEFDRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uJE9wIFJFVkVSU0VfRElGRkVSRU5DRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uJE9wIFVOSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5SZWdpb24kT3AgWE9SCi0KLWZpbmFsIGludCBuYXRpdmVJbnQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KEkpViApCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5SZWdpb24kT3AgdmFsdWVPZigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5SZWdpb24kT3BbXSB2YWx1ZXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvZ3JhcGhpY3MvUmVnaW9uJE9wOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5ncmFwaGljcy5SZWdpb24gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExhbmRyb2lkL2dyYXBoaWNzL1JlZ2lvbjs+OyApCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yIENSRUFUT1IKLQotcHJpdmF0ZSBmaW5hbCBpbnQgbU5hdGl2ZVJlZ2lvbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KAotaW50KQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5ncmFwaGljcy5SZWN0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbikKLQotc3RhdGljIGludCBhY2Nlc3MkMDAwKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlQ29uc3RydWN0b3IoKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZUNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlRGVzdHJ1Y3RvcigKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gbmF0aXZlR2V0Qm91bmRhcnlQYXRoKAotaW50Ci1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBib29sZWFuIG5hdGl2ZUdldEJvdW5kcygKLWludAotYW5kcm9pZC5ncmFwaGljcy5SZWN0KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBuYXRpdmVPcCgKLWludAotaW50Ci1pbnQKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gbmF0aXZlT3AoCi1pbnQKLWludAotaW50Ci1pbnQKLWludAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBuYXRpdmVPcCgKLWludAotYW5kcm9pZC5ncmFwaGljcy5SZWN0Ci1pbnQKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gbmF0aXZlU2V0UGF0aCgKLWludAotaW50Ci1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBib29sZWFuIG5hdGl2ZVNldFJlY3QoCi1pbnQKLWludAotaW50Ci1pbnQKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gbmF0aXZlU2V0UmVnaW9uKAotaW50Ci1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBib29sZWFuIG5hdGl2ZVdyaXRlVG9QYXJjZWwoCi1pbnQKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgbmF0aXZlIGJvb2xlYW4gY29udGFpbnMoCi1pbnQKLWludCkKLQotcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL1Rocm93YWJsZTsgKQotcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKQotCi1wdWJsaWMgYW5kcm9pZC5ncmFwaGljcy5QYXRoIGdldEJvdW5kYXJ5UGF0aCgpCi0KLXB1YmxpYyBib29sZWFuIGdldEJvdW5kYXJ5UGF0aCgKLWFuZHJvaWQuZ3JhcGhpY3MuUGF0aCkKLQotcHVibGljIGFuZHJvaWQuZ3JhcGhpY3MuUmVjdCBnZXRCb3VuZHMoKQotCi1wdWJsaWMgYm9vbGVhbiBnZXRCb3VuZHMoCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3QpCi0KLXB1YmxpYyBuYXRpdmUgYm9vbGVhbiBpc0NvbXBsZXgoKQotCi1wdWJsaWMgbmF0aXZlIGJvb2xlYW4gaXNFbXB0eSgpCi0KLXB1YmxpYyBuYXRpdmUgYm9vbGVhbiBpc1JlY3QoKQotCi1maW5hbCBpbnQgbmkoKQotCi1wdWJsaWMgYm9vbGVhbiBvcCgKLWludAotaW50Ci1pbnQKLWludAotYW5kcm9pZC5ncmFwaGljcy5SZWdpb24kT3ApCi0KLXB1YmxpYyBib29sZWFuIG9wKAotYW5kcm9pZC5ncmFwaGljcy5SZWN0Ci1hbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbiRPcCkKLQotcHVibGljIGJvb2xlYW4gb3AoCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3QKLWFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uCi1hbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbiRPcCkKLQotcHVibGljIGJvb2xlYW4gb3AoCi1hbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbgotYW5kcm9pZC5ncmFwaGljcy5SZWdpb24kT3ApCi0KLXB1YmxpYyBib29sZWFuIG9wKAotYW5kcm9pZC5ncmFwaGljcy5SZWdpb24KLWFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uCi1hbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbiRPcCkKLQotcHVibGljIG5hdGl2ZSBib29sZWFuIHF1aWNrQ29udGFpbnMoCi1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBib29sZWFuIHF1aWNrQ29udGFpbnMoCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3QpCi0KLXB1YmxpYyBuYXRpdmUgYm9vbGVhbiBxdWlja1JlamVjdCgKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIGJvb2xlYW4gcXVpY2tSZWplY3QoCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3QpCi0KLXB1YmxpYyBuYXRpdmUgYm9vbGVhbiBxdWlja1JlamVjdCgKLWFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uKQotCi1wdWJsaWMgYm9vbGVhbiBzZXQoCi1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBib29sZWFuIHNldCgKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdCkKLQotcHVibGljIGJvb2xlYW4gc2V0KAotYW5kcm9pZC5ncmFwaGljcy5SZWdpb24pCi0KLXB1YmxpYyB2b2lkIHNldEVtcHR5KCkKLQotcHVibGljIGJvb2xlYW4gc2V0UGF0aCgKLWFuZHJvaWQuZ3JhcGhpY3MuUGF0aAotYW5kcm9pZC5ncmFwaGljcy5SZWdpb24pCi0KLXB1YmxpYyB2b2lkIHRyYW5zbGF0ZSgKLWludAotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgdHJhbnNsYXRlKAotaW50Ci1pbnQKLWFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uKQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiB1bmlvbigKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdCkKLQotcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5ncmFwaGljcy5SZWdpb25JdGVyYXRvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBpbnQgbU5hdGl2ZUl0ZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbikKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVDb25zdHJ1Y3RvcigKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlRGVzdHJ1Y3RvcigKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gbmF0aXZlTmV4dCgKLWludAotYW5kcm9pZC5ncmFwaGljcy5SZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvVGhyb3dhYmxlOyApCi1wcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIG5leHQoCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNjQwOSBuYW1lID1UaWxlTW9kZSApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9FbnVtPExhbmRyb2lkL2dyYXBoaWNzL1NoYWRlciRUaWxlTW9kZTs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9ncmFwaGljcy9TaGFkZXI7ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLmdyYXBoaWNzLlNoYWRlciRUaWxlTW9kZSBleHRlbmRzIGphdmEubGFuZy5FbnVtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyJFRpbGVNb2RlW10gJFZBTFVFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyJFRpbGVNb2RlIENMQU1QCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5TaGFkZXIkVGlsZU1vZGUgTUlSUk9SCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5TaGFkZXIkVGlsZU1vZGUgUkVQRUFUCi0KLWZpbmFsIGludCBuYXRpdmVJbnQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KEkpViApCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5TaGFkZXIkVGlsZU1vZGUgdmFsdWVPZigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5TaGFkZXIkVGlsZU1vZGVbXSB2YWx1ZXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuZ3JhcGhpY3MuU3VtUGF0aEVmZmVjdCBleHRlbmRzIGFuZHJvaWQuZ3JhcGhpY3MuUGF0aEVmZmVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuZ3JhcGhpY3MuUGF0aEVmZmVjdAotYW5kcm9pZC5ncmFwaGljcy5QYXRoRWZmZWN0KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZUNyZWF0ZSgKLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuZ3JhcGhpY3MuU3dlZXBHcmFkaWVudCBleHRlbmRzIGFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotZmxvYXQKLWZsb2F0Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotZmxvYXQKLWZsb2F0Ci1pbnRbXQotZmxvYXRbXSkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVDcmVhdGUxKAotZmxvYXQKLWZsb2F0Ci1pbnRbXQotZmxvYXRbXSkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVDcmVhdGUyKAotZmxvYXQKLWZsb2F0Ci1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLSBjbGFzcyBhbmRyb2lkLmdyYXBoaWNzLlRlbXBvcmFyeUJ1ZmZlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgY2hhcltdIHNUZW1wCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi0gdm9pZCA8aW5pdD4oKQotCi1zdGF0aWMgY2hhcltdIG9idGFpbigKLWludCkKLQotc3RhdGljIHZvaWQgcmVjeWNsZSgKLWNoYXJbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmdyYXBoaWNzLlR5cGVmYWNlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCT0xECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJPTERfSVRBTElDCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5UeXBlZmFjZSBERUZBVUxUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5UeXBlZmFjZSBERUZBVUxUX0JPTEQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSVRBTElDCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5UeXBlZmFjZSBNT05PU1BBQ0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9STUFMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5UeXBlZmFjZSBTQU5TX1NFUklGCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5UeXBlZmFjZSBTRVJJRgotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLmdyYXBoaWNzLlR5cGVmYWNlW10gc0RlZmF1bHRzCi0KLSBpbnQgbmF0aXZlX2luc3RhbmNlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotaW50KQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuVHlwZWZhY2UgY3JlYXRlKAotYW5kcm9pZC5ncmFwaGljcy5UeXBlZmFjZQotaW50KQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuVHlwZWZhY2UgY3JlYXRlKAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuVHlwZWZhY2UgY3JlYXRlRnJvbUFzc2V0KAotYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldE1hbmFnZXIKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5UeXBlZmFjZSBkZWZhdWx0RnJvbVN0eWxlKAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZUNyZWF0ZSgKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVDcmVhdGVGcm9tQXNzZXQoCi1hbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0TWFuYWdlcgotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVDcmVhdGVGcm9tVHlwZWZhY2UoCi1pbnQKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVHZXRTdHlsZSgKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlVW5yZWYoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9UaHJvd2FibGU7ICkKLXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkKLQotcHVibGljIGludCBnZXRTdHlsZSgpCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGlzQm9sZCgpCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGlzSXRhbGljKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9BbmltYXRpb25EcmF3YWJsZTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID00MTA0IG5hbWUgPW51bGwgKQotIGNsYXNzIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQW5pbWF0aW9uRHJhd2FibGUkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAzMyBuYW1lID1Db25zdGFudFN0YXRlICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0RyYXdhYmxlOyApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSRDb25zdGFudFN0YXRlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0Q2hhbmdpbmdDb25maWd1cmF0aW9ucygpCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIG5ld0RyYXdhYmxlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwMzMgbmFtZSA9RHJhd2FibGVDb250YWluZXJTdGF0ZSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9EcmF3YWJsZUNvbnRhaW5lcjsgKQotcHVibGljIGFic3RyYWN0IGNsYXNzIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGVDb250YWluZXIkRHJhd2FibGVDb250YWluZXJTdGF0ZSBleHRlbmRzIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUkQ29uc3RhbnRTdGF0ZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gYm9vbGVhbiBtQ2FuQ29uc3RhbnRTdGF0ZQotCi0gaW50IG1DaGFuZ2luZ0NvbmZpZ3VyYXRpb25zCi0KLSBib29sZWFuIG1DaGVja2VkQ29uc3RhbnRTdGF0ZQotCi0gaW50IG1DaGlsZHJlbkNoYW5naW5nQ29uZmlndXJhdGlvbnMKLQotIGJvb2xlYW4gbUNvbXB1dGVkQ29uc3RhbnRTaXplCi0KLSBpbnQgbUNvbnN0YW50SGVpZ2h0Ci0KLSBpbnQgbUNvbnN0YW50TWluaW11bUhlaWdodAotCi0gaW50IG1Db25zdGFudE1pbmltdW1XaWR0aAotCi0gYW5kcm9pZC5ncmFwaGljcy5SZWN0IG1Db25zdGFudFBhZGRpbmcKLQotIGJvb2xlYW4gbUNvbnN0YW50U2l6ZQotCi0gaW50IG1Db25zdGFudFdpZHRoCi0KLSBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlW10gbURyYXdhYmxlcwotCi0gYm9vbGVhbiBtSGF2ZU9wYWNpdHkKLQotIGJvb2xlYW4gbUhhdmVTdGF0ZWZ1bAotCi0gaW50IG1OdW1DaGlsZHJlbgotCi0gaW50IG1PcGFjaXR5Ci0KLWZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGVDb250YWluZXIgbU93bmVyCi0KLSBib29sZWFuIG1TdGF0ZWZ1bAotCi0gYm9vbGVhbiBtVmFyaWFibGVQYWRkaW5nCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZUNvbnRhaW5lciREcmF3YWJsZUNvbnRhaW5lclN0YXRlCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlQ29udGFpbmVyKQotCi1wcml2YXRlIHZvaWQgY29tcHV0ZUNvbnN0YW50U2l6ZSgpCi0KLXB1YmxpYyBmaW5hbCBpbnQgYWRkQ2hpbGQoCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlKQotCi1wdWJsaWMgYm9vbGVhbiBjYW5Db25zdGFudFN0YXRlKCkKLQotcHVibGljIGludCBnZXRDaGFuZ2luZ0NvbmZpZ3VyYXRpb25zKCkKLQotcHVibGljIGZpbmFsIGludCBnZXRDaGlsZENvdW50KCkKLQotcHVibGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGVbXSBnZXRDaGlsZHJlbigpCi0KLXB1YmxpYyBmaW5hbCBpbnQgZ2V0Q29uc3RhbnRIZWlnaHQoKQotCi1wdWJsaWMgZmluYWwgaW50IGdldENvbnN0YW50TWluaW11bUhlaWdodCgpCi0KLXB1YmxpYyBmaW5hbCBpbnQgZ2V0Q29uc3RhbnRNaW5pbXVtV2lkdGgoKQotCi1wdWJsaWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5SZWN0IGdldENvbnN0YW50UGFkZGluZygpCi0KLXB1YmxpYyBmaW5hbCBpbnQgZ2V0Q29uc3RhbnRXaWR0aCgpCi0KLXB1YmxpYyBmaW5hbCBpbnQgZ2V0T3BhY2l0eSgpCi0KLXB1YmxpYyB2b2lkIGdyb3dBcnJheSgKLWludAotaW50KQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBpc0NvbnN0YW50U2l6ZSgpCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGlzU3RhdGVmdWwoKQotCi1wdWJsaWMgZmluYWwgdm9pZCBzZXRDb25zdGFudFNpemUoCi1ib29sZWFuKQotCi1wdWJsaWMgZmluYWwgdm9pZCBzZXRWYXJpYWJsZVBhZGRpbmcoCi1ib29sZWFuKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjYgbmFtZSA9QW5pbWF0aW9uU3RhdGUgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvQW5pbWF0aW9uRHJhd2FibGU7ICkKLWZpbmFsIGNsYXNzIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQW5pbWF0aW9uRHJhd2FibGUkQW5pbWF0aW9uU3RhdGUgZXh0ZW5kcyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlQ29udGFpbmVyJERyYXdhYmxlQ29udGFpbmVyU3RhdGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBpbnRbXSBtRHVyYXRpb25zCi0KLXByaXZhdGUgYm9vbGVhbiBtT25lU2hvdAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQW5pbWF0aW9uRHJhd2FibGUkQW5pbWF0aW9uU3RhdGUKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQW5pbWF0aW9uRHJhd2FibGUpCi0KLXN0YXRpYyBpbnRbXSBhY2Nlc3MkMDAwKAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5BbmltYXRpb25EcmF3YWJsZSRBbmltYXRpb25TdGF0ZSkKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDEwMCgKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQW5pbWF0aW9uRHJhd2FibGUkQW5pbWF0aW9uU3RhdGUpCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQxMDIoCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkFuaW1hdGlvbkRyYXdhYmxlJEFuaW1hdGlvblN0YXRlCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBhZGRGcmFtZSgKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUKLWludCkKLQotcHVibGljIHZvaWQgZ3Jvd0FycmF5KAotaW50Ci1pbnQpCi0KLXB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIG5ld0RyYXdhYmxlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0RyYXdhYmxlJENvbnN0YW50U3RhdGU7TGFuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvRHJhd2FibGUkQ2FsbGJhY2s7ICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGFuZHJvaWQuZ3JhcGhpY3MuUmVjdCBtQm91bmRzCi0KLSBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlJENhbGxiYWNrIG1DYWxsYmFjawotCi1wcml2YXRlIGludCBtQ2hhbmdpbmdDb25maWd1cmF0aW9ucwotCi1wcml2YXRlIGludCBtTGV2ZWwKLQotcHJpdmF0ZSBpbnRbXSBtU3RhdGVTZXQKLQotcHJpdmF0ZSBib29sZWFuIG1WaXNpYmxlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIGNyZWF0ZUZyb21QYXRoKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIGNyZWF0ZUZyb21TdHJlYW0oCi1qYXZhLmlvLklucHV0U3RyZWFtCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgY3JlYXRlRnJvbVhtbCgKLWFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzCi1vcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgY3JlYXRlRnJvbVhtbElubmVyKAotYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMKLW9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXIKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi0KLXByaXZhdGUgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgZHJhd2FibGVGcm9tQml0bWFwKAotYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAKLWJ5dGVbXQotYW5kcm9pZC5ncmFwaGljcy5SZWN0Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGludCByZXNvbHZlT3BhY2l0eSgKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBjbGVhckNvbG9yRmlsdGVyKCkKLQotcHVibGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUmVjdCBjb3B5Qm91bmRzKCkKLQotcHVibGljIGZpbmFsIHZvaWQgY29weUJvdW5kcygKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZHJhdygKLWFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzKQotCi1wdWJsaWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5SZWN0IGdldEJvdW5kcygpCi0KLXB1YmxpYyBpbnQgZ2V0Q2hhbmdpbmdDb25maWd1cmF0aW9ucygpCi0KLXB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlJENvbnN0YW50U3RhdGUgZ2V0Q29uc3RhbnRTdGF0ZSgpCi0KLXB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIGdldEN1cnJlbnQoKQotCi1wdWJsaWMgaW50IGdldEludHJpbnNpY0hlaWdodCgpCi0KLXB1YmxpYyBpbnQgZ2V0SW50cmluc2ljV2lkdGgoKQotCi1wdWJsaWMgZmluYWwgaW50IGdldExldmVsKCkKLQotcHVibGljIGludCBnZXRNaW5pbXVtSGVpZ2h0KCkKLQotcHVibGljIGludCBnZXRNaW5pbXVtV2lkdGgoKQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldE9wYWNpdHkoKQotCi1wdWJsaWMgYm9vbGVhbiBnZXRQYWRkaW5nKAotYW5kcm9pZC5ncmFwaGljcy5SZWN0KQotCi1wdWJsaWMgaW50W10gZ2V0U3RhdGUoKQotCi1wdWJsaWMgYW5kcm9pZC5ncmFwaGljcy5SZWdpb24gZ2V0VHJhbnNwYXJlbnRSZWdpb24oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBpbmZsYXRlKAotYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMKLW9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXIKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLSB2b2lkIGluZmxhdGVXaXRoQXR0cmlidXRlcygKLWFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzCi1vcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyCi1hbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXkKLWludCkKLQotcHVibGljIHZvaWQgaW52YWxpZGF0ZVNlbGYoKQotCi1wdWJsaWMgYm9vbGVhbiBpc1N0YXRlZnVsKCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gaXNWaXNpYmxlKCkKLQotcHJvdGVjdGVkIHZvaWQgb25Cb3VuZHNDaGFuZ2UoCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3QpCi0KLXByb3RlY3RlZCBib29sZWFuIG9uTGV2ZWxDaGFuZ2UoCi1pbnQpCi0KLXByb3RlY3RlZCBib29sZWFuIG9uU3RhdGVDaGFuZ2UoCi1pbnRbXSkKLQotcHVibGljIHZvaWQgc2NoZWR1bGVTZWxmKAotamF2YS5sYW5nLlJ1bm5hYmxlCi1sb25nKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRBbHBoYSgKLWludCkKLQotcHVibGljIHZvaWQgc2V0Qm91bmRzKAotaW50Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRCb3VuZHMoCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3QpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHNldENhbGxiYWNrKAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSRDYWxsYmFjaykKLQotcHVibGljIHZvaWQgc2V0Q2hhbmdpbmdDb25maWd1cmF0aW9ucygKLWludCkKLQotcHVibGljIHZvaWQgc2V0Q29sb3JGaWx0ZXIoCi1pbnQKLWFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZiRNb2RlKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRDb2xvckZpbHRlcigKLWFuZHJvaWQuZ3JhcGhpY3MuQ29sb3JGaWx0ZXIpCi0KLXB1YmxpYyB2b2lkIHNldERpdGhlcigKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldEZpbHRlckJpdG1hcCgKLWJvb2xlYW4pCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIHNldExldmVsKAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBzZXRTdGF0ZSgKLWludFtdKQotCi1wdWJsaWMgYm9vbGVhbiBzZXRWaXNpYmxlKAotYm9vbGVhbgotYm9vbGVhbikKLQotcHVibGljIHZvaWQgdW5zY2hlZHVsZVNlbGYoCi1qYXZhLmxhbmcuUnVubmFibGUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPUNhbGxiYWNrICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0RyYXdhYmxlOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUkQ2FsbGJhY2sgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgaW52YWxpZGF0ZURyYXdhYmxlKAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2NoZWR1bGVEcmF3YWJsZSgKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUKLWphdmEubGFuZy5SdW5uYWJsZQotbG9uZykKLQotcHVibGljIGFic3RyYWN0IHZvaWQgdW5zY2hlZHVsZURyYXdhYmxlKAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZQotamF2YS5sYW5nLlJ1bm5hYmxlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvRHJhd2FibGVDb250YWluZXIkRHJhd2FibGVDb250YWluZXJTdGF0ZTsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGVDb250YWluZXIgZXh0ZW5kcyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIGltcGxlbWVudHMgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSRDYWxsYmFjawotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGludCBtQWxwaGEKLQotcHJpdmF0ZSBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yRmlsdGVyIG1Db2xvckZpbHRlcgotCi1wcml2YXRlIGludCBtQ3VySW5kZXgKLQotcHJpdmF0ZSBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIG1DdXJyRHJhd2FibGUKLQotcHJpdmF0ZSBib29sZWFuIG1EaXRoZXIKLQotcHJpdmF0ZSBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlQ29udGFpbmVyJERyYXdhYmxlQ29udGFpbmVyU3RhdGUgbURyYXdhYmxlQ29udGFpbmVyU3RhdGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCBkcmF3KAotYW5kcm9pZC5ncmFwaGljcy5DYW52YXMpCi0KLXB1YmxpYyBpbnQgZ2V0Q2hhbmdpbmdDb25maWd1cmF0aW9ucygpCi0KLXB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlJENvbnN0YW50U3RhdGUgZ2V0Q29uc3RhbnRTdGF0ZSgpCi0KLXB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIGdldEN1cnJlbnQoKQotCi1wdWJsaWMgaW50IGdldEludHJpbnNpY0hlaWdodCgpCi0KLXB1YmxpYyBpbnQgZ2V0SW50cmluc2ljV2lkdGgoKQotCi1wdWJsaWMgaW50IGdldE1pbmltdW1IZWlnaHQoKQotCi1wdWJsaWMgaW50IGdldE1pbmltdW1XaWR0aCgpCi0KLXB1YmxpYyBpbnQgZ2V0T3BhY2l0eSgpCi0KLXB1YmxpYyBib29sZWFuIGdldFBhZGRpbmcoCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3QpCi0KLXB1YmxpYyB2b2lkIGludmFsaWRhdGVEcmF3YWJsZSgKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUpCi0KLXB1YmxpYyBib29sZWFuIGlzU3RhdGVmdWwoKQotCi1wcm90ZWN0ZWQgdm9pZCBvbkJvdW5kc0NoYW5nZSgKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdCkKLQotcHJvdGVjdGVkIGJvb2xlYW4gb25MZXZlbENoYW5nZSgKLWludCkKLQotcHJvdGVjdGVkIGJvb2xlYW4gb25TdGF0ZUNoYW5nZSgKLWludFtdKQotCi1wdWJsaWMgdm9pZCBzY2hlZHVsZURyYXdhYmxlKAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZQotamF2YS5sYW5nLlJ1bm5hYmxlCi1sb25nKQotCi1wdWJsaWMgYm9vbGVhbiBzZWxlY3REcmF3YWJsZSgKLWludCkKLQotcHVibGljIHZvaWQgc2V0QWxwaGEoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldENvbG9yRmlsdGVyKAotYW5kcm9pZC5ncmFwaGljcy5Db2xvckZpbHRlcikKLQotcHJvdGVjdGVkIHZvaWQgc2V0Q29uc3RhbnRTdGF0ZSgKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGVDb250YWluZXIkRHJhd2FibGVDb250YWluZXJTdGF0ZSkKLQotcHVibGljIHZvaWQgc2V0RGl0aGVyKAotYm9vbGVhbikKLQotcHVibGljIGJvb2xlYW4gc2V0VmlzaWJsZSgKLWJvb2xlYW4KLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHVuc2NoZWR1bGVEcmF3YWJsZSgKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUKLWphdmEubGFuZy5SdW5uYWJsZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0FuaW1hdGlvbkRyYXdhYmxlJDE7TGFuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvQW5pbWF0aW9uRHJhd2FibGUkQW5pbWF0aW9uU3RhdGU7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkFuaW1hdGlvbkRyYXdhYmxlIGV4dGVuZHMgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZUNvbnRhaW5lciBpbXBsZW1lbnRzIGphdmEubGFuZy5SdW5uYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQW5pbWF0aW9uRHJhd2FibGUkQW5pbWF0aW9uU3RhdGUgbUFuaW1hdGlvblN0YXRlCi0KLXByaXZhdGUgaW50IG1DdXJGcmFtZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkFuaW1hdGlvbkRyYXdhYmxlJEFuaW1hdGlvblN0YXRlKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkFuaW1hdGlvbkRyYXdhYmxlJEFuaW1hdGlvblN0YXRlCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkFuaW1hdGlvbkRyYXdhYmxlJDEpCi0KLXByaXZhdGUgdm9pZCBuZXh0RnJhbWUoCi1ib29sZWFuKQotCi1wcml2YXRlIHZvaWQgc2V0RnJhbWUoCi1pbnQKLWJvb2xlYW4KLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIGFkZEZyYW1lKAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZQotaW50KQotCi1wdWJsaWMgaW50IGdldER1cmF0aW9uKAotaW50KQotCi1wdWJsaWMgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSBnZXRGcmFtZSgKLWludCkKLQotcHVibGljIGludCBnZXROdW1iZXJPZkZyYW1lcygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGluZmxhdGUoCi1hbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcwotb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcgotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHVibGljIGJvb2xlYW4gaXNPbmVTaG90KCkKLQotcHVibGljIGJvb2xlYW4gaXNSdW5uaW5nKCkKLQotcHVibGljIHZvaWQgcnVuKCkKLQotcHVibGljIHZvaWQgc2V0T25lU2hvdCgKLWJvb2xlYW4pCi0KLXB1YmxpYyBib29sZWFuIHNldFZpc2libGUoCi1ib29sZWFuCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzdGFydCgpCi0KLXB1YmxpYyB2b2lkIHN0b3AoKQotCi1wdWJsaWMgdm9pZCB1bnNjaGVkdWxlU2VsZigKLWphdmEubGFuZy5SdW5uYWJsZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9CaXRtYXBEcmF3YWJsZTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID00MTA0IG5hbWUgPW51bGwgKQotIGNsYXNzIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQml0bWFwRHJhd2FibGUkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0JpdG1hcERyYXdhYmxlOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI0IG5hbWUgPUJpdG1hcFN0YXRlICkKLWZpbmFsIGNsYXNzIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQml0bWFwRHJhd2FibGUkQml0bWFwU3RhdGUgZXh0ZW5kcyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlJENvbnN0YW50U3RhdGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwIG1CaXRtYXAKLQotIGludCBtQ2hhbmdpbmdDb25maWd1cmF0aW9ucwotCi0gaW50IG1HcmF2aXR5Ci0KLSBhbmRyb2lkLmdyYXBoaWNzLlBhaW50IG1QYWludAotCi0gYW5kcm9pZC5ncmFwaGljcy5TaGFkZXIkVGlsZU1vZGUgbVRpbGVNb2RlWAotCi0gYW5kcm9pZC5ncmFwaGljcy5TaGFkZXIkVGlsZU1vZGUgbVRpbGVNb2RlWQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwKQotCi1wdWJsaWMgaW50IGdldENoYW5naW5nQ29uZmlndXJhdGlvbnMoKQotCi1wdWJsaWMgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSBuZXdEcmF3YWJsZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9CaXRtYXBEcmF3YWJsZSQxO0xhbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0JpdG1hcERyYXdhYmxlJEJpdG1hcFN0YXRlOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5CaXRtYXBEcmF3YWJsZSBleHRlbmRzIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfUEFJTlRfRkxBR1MKLQotcHJpdmF0ZSBib29sZWFuIG1BcHBseUdyYXZpdHkKLQotcHJpdmF0ZSBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCBtQml0bWFwCi0KLXByaXZhdGUgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5CaXRtYXBEcmF3YWJsZSRCaXRtYXBTdGF0ZSBtQml0bWFwU3RhdGUKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlJlY3QgbURzdFJlY3QKLQotcHJpdmF0ZSBib29sZWFuIG1SZWJ1aWxkU2hhZGVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5ncmFwaGljcy5CaXRtYXApCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkJpdG1hcERyYXdhYmxlJEJpdG1hcFN0YXRlKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkJpdG1hcERyYXdhYmxlJEJpdG1hcFN0YXRlCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkJpdG1hcERyYXdhYmxlJDEpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uSW5wdXRTdHJlYW0pCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIGRyYXcoCi1hbmRyb2lkLmdyYXBoaWNzLkNhbnZhcykKLQotcHVibGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwIGdldEJpdG1hcCgpCi0KLXB1YmxpYyBpbnQgZ2V0Q2hhbmdpbmdDb25maWd1cmF0aW9ucygpCi0KLXB1YmxpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlJENvbnN0YW50U3RhdGUgZ2V0Q29uc3RhbnRTdGF0ZSgpCi0KLXB1YmxpYyBpbnQgZ2V0R3Jhdml0eSgpCi0KLXB1YmxpYyBpbnQgZ2V0SW50cmluc2ljSGVpZ2h0KCkKLQotcHVibGljIGludCBnZXRJbnRyaW5zaWNXaWR0aCgpCi0KLXB1YmxpYyBpbnQgZ2V0T3BhY2l0eSgpCi0KLXB1YmxpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50IGdldFBhaW50KCkKLQotcHVibGljIGFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyJFRpbGVNb2RlIGdldFRpbGVNb2RlWCgpCi0KLXB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLlNoYWRlciRUaWxlTW9kZSBnZXRUaWxlTW9kZVkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBpbmZsYXRlKAotYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMKLW9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXIKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi0KLXByb3RlY3RlZCB2b2lkIG9uQm91bmRzQ2hhbmdlKAotYW5kcm9pZC5ncmFwaGljcy5SZWN0KQotCi1wdWJsaWMgdm9pZCBzZXRBbHBoYSgKLWludCkKLQotcHVibGljIHZvaWQgc2V0QW50aUFsaWFzKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0Q29sb3JGaWx0ZXIoCi1hbmRyb2lkLmdyYXBoaWNzLkNvbG9yRmlsdGVyKQotCi1wdWJsaWMgdm9pZCBzZXREaXRoZXIoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRGaWx0ZXJCaXRtYXAoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRHcmF2aXR5KAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRUaWxlTW9kZVgoCi1hbmRyb2lkLmdyYXBoaWNzLlNoYWRlciRUaWxlTW9kZSkKLQotcHVibGljIHZvaWQgc2V0VGlsZU1vZGVYWSgKLWFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyJFRpbGVNb2RlCi1hbmRyb2lkLmdyYXBoaWNzLlNoYWRlciRUaWxlTW9kZSkKLQotcHVibGljIGZpbmFsIHZvaWQgc2V0VGlsZU1vZGVZKAotYW5kcm9pZC5ncmFwaGljcy5TaGFkZXIkVGlsZU1vZGUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID00MTA0IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvQ2xpcERyYXdhYmxlOyApCi0gY2xhc3MgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5DbGlwRHJhd2FibGUkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjQgbmFtZSA9Q2xpcFN0YXRlICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0NsaXBEcmF3YWJsZTsgKQotZmluYWwgY2xhc3MgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5DbGlwRHJhd2FibGUkQ2xpcFN0YXRlIGV4dGVuZHMgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSRDb25zdGFudFN0YXRlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYm9vbGVhbiBtQ2FuQ29uc3RhbnRTdGF0ZQotCi0gaW50IG1DaGFuZ2luZ0NvbmZpZ3VyYXRpb25zCi0KLXByaXZhdGUgYm9vbGVhbiBtQ2hlY2tlZENvbnN0YW50U3RhdGUKLQotIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgbURyYXdhYmxlCi0KLSBpbnQgbUdyYXZpdHkKLQotIGludCBtT3JpZW50YXRpb24KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkNsaXBEcmF3YWJsZSRDbGlwU3RhdGUKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQ2xpcERyYXdhYmxlKQotCi0gYm9vbGVhbiBjYW5Db25zdGFudFN0YXRlKCkKLQotcHVibGljIGludCBnZXRDaGFuZ2luZ0NvbmZpZ3VyYXRpb25zKCkKLQotcHVibGljIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgbmV3RHJhd2FibGUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvQ2xpcERyYXdhYmxlJDE7TGFuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvQ2xpcERyYXdhYmxlJENsaXBTdGF0ZTsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQ2xpcERyYXdhYmxlIGV4dGVuZHMgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSBpbXBsZW1lbnRzIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUkQ2FsbGJhY2sKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSE9SSVpPTlRBTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWRVJUSUNBTAotCi1wcml2YXRlIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQ2xpcERyYXdhYmxlJENsaXBTdGF0ZSBtQ2xpcFN0YXRlCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5SZWN0IG1UbXBSZWN0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQ2xpcERyYXdhYmxlJENsaXBTdGF0ZSkKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5DbGlwRHJhd2FibGUkQ2xpcFN0YXRlCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkNsaXBEcmF3YWJsZSQxKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgZHJhdygKLWFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzKQotCi1wdWJsaWMgaW50IGdldENoYW5naW5nQ29uZmlndXJhdGlvbnMoKQotCi1wdWJsaWMgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSRDb25zdGFudFN0YXRlIGdldENvbnN0YW50U3RhdGUoKQotCi1wdWJsaWMgaW50IGdldEludHJpbnNpY0hlaWdodCgpCi0KLXB1YmxpYyBpbnQgZ2V0SW50cmluc2ljV2lkdGgoKQotCi1wdWJsaWMgaW50IGdldE9wYWNpdHkoKQotCi1wdWJsaWMgYm9vbGVhbiBnZXRQYWRkaW5nKAotYW5kcm9pZC5ncmFwaGljcy5SZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBpbmZsYXRlKAotYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMKLW9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXIKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi0KLXB1YmxpYyB2b2lkIGludmFsaWRhdGVEcmF3YWJsZSgKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUpCi0KLXB1YmxpYyBib29sZWFuIGlzU3RhdGVmdWwoKQotCi1wcm90ZWN0ZWQgdm9pZCBvbkJvdW5kc0NoYW5nZSgKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdCkKLQotcHJvdGVjdGVkIGJvb2xlYW4gb25MZXZlbENoYW5nZSgKLWludCkKLQotcHJvdGVjdGVkIGJvb2xlYW4gb25TdGF0ZUNoYW5nZSgKLWludFtdKQotCi1wdWJsaWMgdm9pZCBzY2hlZHVsZURyYXdhYmxlKAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZQotamF2YS5sYW5nLlJ1bm5hYmxlCi1sb25nKQotCi1wdWJsaWMgdm9pZCBzZXRBbHBoYSgKLWludCkKLQotcHVibGljIHZvaWQgc2V0Q29sb3JGaWx0ZXIoCi1hbmRyb2lkLmdyYXBoaWNzLkNvbG9yRmlsdGVyKQotCi1wdWJsaWMgYm9vbGVhbiBzZXRWaXNpYmxlKAotYm9vbGVhbgotYm9vbGVhbikKLQotcHVibGljIHZvaWQgdW5zY2hlZHVsZURyYXdhYmxlKAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZQotamF2YS5sYW5nLlJ1bm5hYmxlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9NDEwNCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0NvbG9yRHJhd2FibGU7ICkKLSBjbGFzcyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkNvbG9yRHJhd2FibGUkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0NvbG9yRHJhd2FibGU7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjQgbmFtZSA9Q29sb3JTdGF0ZSApCi1maW5hbCBjbGFzcyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkNvbG9yRHJhd2FibGUkQ29sb3JTdGF0ZSBleHRlbmRzIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUkQ29uc3RhbnRTdGF0ZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gaW50IG1CYXNlQ29sb3IKLQotIGludCBtQ2hhbmdpbmdDb25maWd1cmF0aW9ucwotCi0gaW50IG1Vc2VDb2xvcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQ29sb3JEcmF3YWJsZSRDb2xvclN0YXRlKQotCi1wdWJsaWMgaW50IGdldENoYW5naW5nQ29uZmlndXJhdGlvbnMoKQotCi1wdWJsaWMgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSBuZXdEcmF3YWJsZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9Db2xvckRyYXdhYmxlJDE7TGFuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvQ29sb3JEcmF3YWJsZSRDb2xvclN0YXRlOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5Db2xvckRyYXdhYmxlIGV4dGVuZHMgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQ29sb3JEcmF3YWJsZSRDb2xvclN0YXRlIG1TdGF0ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQ29sb3JEcmF3YWJsZSRDb2xvclN0YXRlKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkNvbG9yRHJhd2FibGUkQ29sb3JTdGF0ZQotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5Db2xvckRyYXdhYmxlJDEpCi0KLXB1YmxpYyB2b2lkIGRyYXcoCi1hbmRyb2lkLmdyYXBoaWNzLkNhbnZhcykKLQotcHVibGljIGludCBnZXRBbHBoYSgpCi0KLXB1YmxpYyBpbnQgZ2V0Q2hhbmdpbmdDb25maWd1cmF0aW9ucygpCi0KLXB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlJENvbnN0YW50U3RhdGUgZ2V0Q29uc3RhbnRTdGF0ZSgpCi0KLXB1YmxpYyBpbnQgZ2V0T3BhY2l0eSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGluZmxhdGUoCi1hbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcwotb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcgotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHVibGljIHZvaWQgc2V0QWxwaGEoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldENvbG9yRmlsdGVyKAotYW5kcm9pZC5ncmFwaGljcy5Db2xvckZpbHRlcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9HcmFkaWVudERyYXdhYmxlOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTQxMDQgbmFtZSA9bnVsbCApCi0gY2xhc3MgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5HcmFkaWVudERyYXdhYmxlJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBmaW5hbCBpbnRbXSAkU3dpdGNoTWFwJGFuZHJvaWQkZ3JhcGhpY3MkZHJhd2FibGUkR3JhZGllbnREcmF3YWJsZSRPcmllbnRhdGlvbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI0IG5hbWUgPUdyYWRpZW50U3RhdGUgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvR3JhZGllbnREcmF3YWJsZTsgKQotZmluYWwgY2xhc3MgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5HcmFkaWVudERyYXdhYmxlJEdyYWRpZW50U3RhdGUgZXh0ZW5kcyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlJENvbnN0YW50U3RhdGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmbG9hdCBtQ2VudGVyWAotCi1wcml2YXRlIGZsb2F0IG1DZW50ZXJZCi0KLXB1YmxpYyBpbnQgbUNoYW5naW5nQ29uZmlndXJhdGlvbnMKLQotcHVibGljIGludFtdIG1Db2xvcnMKLQotcHVibGljIGludCBtR3JhZGllbnQKLQotcHJpdmF0ZSBmbG9hdCBtR3JhZGllbnRSYWRpdXMKLQotcHVibGljIGJvb2xlYW4gbUhhc1NvbGlkQ29sb3IKLQotcHVibGljIGludCBtSGVpZ2h0Ci0KLXB1YmxpYyBmbG9hdCBtSW5uZXJSYWRpdXMKLQotcHVibGljIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuR3JhZGllbnREcmF3YWJsZSRPcmllbnRhdGlvbiBtT3JpZW50YXRpb24KLQotcHVibGljIGFuZHJvaWQuZ3JhcGhpY3MuUmVjdCBtUGFkZGluZwotCi1wdWJsaWMgZmxvYXRbXSBtUG9zaXRpb25zCi0KLXB1YmxpYyBmbG9hdCBtUmFkaXVzCi0KLXB1YmxpYyBmbG9hdFtdIG1SYWRpdXNBcnJheQotCi1wdWJsaWMgaW50IG1TaGFwZQotCi1wdWJsaWMgaW50IG1Tb2xpZENvbG9yCi0KLXB1YmxpYyBpbnQgbVN0cm9rZUNvbG9yCi0KLXB1YmxpYyBmbG9hdCBtU3Ryb2tlRGFzaEdhcAotCi1wdWJsaWMgZmxvYXQgbVN0cm9rZURhc2hXaWR0aAotCi1wdWJsaWMgaW50IG1TdHJva2VXaWR0aAotCi1wdWJsaWMgZmxvYXQgbVRoaWNrbmVzcwotCi1wcml2YXRlIGJvb2xlYW4gbVVzZUxldmVsCi0KLXByaXZhdGUgYm9vbGVhbiBtVXNlTGV2ZWxGb3JTaGFwZQotCi1wdWJsaWMgaW50IG1XaWR0aAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuR3JhZGllbnREcmF3YWJsZSRPcmllbnRhdGlvbgotaW50W10pCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQwMDAoCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkdyYWRpZW50RHJhd2FibGUkR3JhZGllbnRTdGF0ZSkKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDAwMigKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuR3JhZGllbnREcmF3YWJsZSRHcmFkaWVudFN0YXRlCi1ib29sZWFuKQotCi1zdGF0aWMgYm9vbGVhbiBhY2Nlc3MkMTAwKAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5HcmFkaWVudERyYXdhYmxlJEdyYWRpZW50U3RhdGUpCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQxMDIoCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkdyYWRpZW50RHJhd2FibGUkR3JhZGllbnRTdGF0ZQotYm9vbGVhbikKLQotc3RhdGljIGZsb2F0IGFjY2VzcyQyMDAoCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkdyYWRpZW50RHJhd2FibGUkR3JhZGllbnRTdGF0ZSkKLQotc3RhdGljIGZsb2F0IGFjY2VzcyQyMDIoCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkdyYWRpZW50RHJhd2FibGUkR3JhZGllbnRTdGF0ZQotZmxvYXQpCi0KLXN0YXRpYyBmbG9hdCBhY2Nlc3MkMzAwKAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5HcmFkaWVudERyYXdhYmxlJEdyYWRpZW50U3RhdGUpCi0KLXN0YXRpYyBmbG9hdCBhY2Nlc3MkMzAyKAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5HcmFkaWVudERyYXdhYmxlJEdyYWRpZW50U3RhdGUKLWZsb2F0KQotCi1zdGF0aWMgZmxvYXQgYWNjZXNzJDQwMCgKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuR3JhZGllbnREcmF3YWJsZSRHcmFkaWVudFN0YXRlKQotCi1zdGF0aWMgZmxvYXQgYWNjZXNzJDQwMigKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuR3JhZGllbnREcmF3YWJsZSRHcmFkaWVudFN0YXRlCi1mbG9hdCkKLQotcHVibGljIGludCBnZXRDaGFuZ2luZ0NvbmZpZ3VyYXRpb25zKCkKLQotcHVibGljIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgbmV3RHJhd2FibGUoKQotCi1wdWJsaWMgdm9pZCBzZXRDb3JuZXJSYWRpaSgKLWZsb2F0W10pCi0KLXB1YmxpYyB2b2lkIHNldENvcm5lclJhZGl1cygKLWZsb2F0KQotCi1wdWJsaWMgdm9pZCBzZXRHcmFkaWVudENlbnRlcigKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIHZvaWQgc2V0R3JhZGllbnRSYWRpdXMoCi1mbG9hdCkKLQotcHVibGljIHZvaWQgc2V0R3JhZGllbnRUeXBlKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRTaGFwZSgKLWludCkKLQotcHVibGljIHZvaWQgc2V0U2l6ZSgKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRTb2xpZENvbG9yKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRTdHJva2UoCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgc2V0U3Ryb2tlKAotaW50Ci1pbnQKLWZsb2F0Ci1mbG9hdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9HcmFkaWVudERyYXdhYmxlOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9FbnVtPExhbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0dyYWRpZW50RHJhd2FibGUkT3JpZW50YXRpb247PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNjQwOSBuYW1lID1PcmllbnRhdGlvbiApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5HcmFkaWVudERyYXdhYmxlJE9yaWVudGF0aW9uIGV4dGVuZHMgamF2YS5sYW5nLkVudW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5HcmFkaWVudERyYXdhYmxlJE9yaWVudGF0aW9uW10gJFZBTFVFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuR3JhZGllbnREcmF3YWJsZSRPcmllbnRhdGlvbiBCTF9UUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuR3JhZGllbnREcmF3YWJsZSRPcmllbnRhdGlvbiBCT1RUT01fVE9QCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5HcmFkaWVudERyYXdhYmxlJE9yaWVudGF0aW9uIEJSX1RMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5HcmFkaWVudERyYXdhYmxlJE9yaWVudGF0aW9uIExFRlRfUklHSFQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkdyYWRpZW50RHJhd2FibGUkT3JpZW50YXRpb24gUklHSFRfTEVGVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuR3JhZGllbnREcmF3YWJsZSRPcmllbnRhdGlvbiBUTF9CUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuR3JhZGllbnREcmF3YWJsZSRPcmllbnRhdGlvbiBUT1BfQk9UVE9NCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5HcmFkaWVudERyYXdhYmxlJE9yaWVudGF0aW9uIFRSX0JMCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpViApCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuR3JhZGllbnREcmF3YWJsZSRPcmllbnRhdGlvbiB2YWx1ZU9mKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkdyYWRpZW50RHJhd2FibGUkT3JpZW50YXRpb25bXSB2YWx1ZXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvR3JhZGllbnREcmF3YWJsZSQxO0xhbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0dyYWRpZW50RHJhd2FibGUkR3JhZGllbnRTdGF0ZTtMYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9HcmFkaWVudERyYXdhYmxlJE9yaWVudGF0aW9uOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5HcmFkaWVudERyYXdhYmxlIGV4dGVuZHMgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMSU5FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExJTkVBUl9HUkFESUVOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPVkFMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJBRElBTF9HUkFESUVOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUNUQU5HTEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTV0VFUF9HUkFESUVOVAotCi1wcml2YXRlIGludCBtQWxwaGEKLQotcHJpdmF0ZSBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yRmlsdGVyIG1Db2xvckZpbHRlcgotCi1wcml2YXRlIGJvb2xlYW4gbURpdGhlcgotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQgbUZpbGxQYWludAotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuR3JhZGllbnREcmF3YWJsZSRHcmFkaWVudFN0YXRlIG1HcmFkaWVudFN0YXRlCi0KLXByaXZhdGUgYW5kcm9pZC5ncmFwaGljcy5QYWludCBtTGF5ZXJQYWludAotCi1wcml2YXRlIGFuZHJvaWQuZ3JhcGhpY3MuUmVjdCBtUGFkZGluZwotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGF0aCBtUGF0aAotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUmVjdEYgbVJlY3QKLQotcHJpdmF0ZSBib29sZWFuIG1SZWN0SXNEaXJ0eQotCi1wcml2YXRlIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQgbVN0cm9rZVBhaW50Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuR3JhZGllbnREcmF3YWJsZSRHcmFkaWVudFN0YXRlKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkdyYWRpZW50RHJhd2FibGUkR3JhZGllbnRTdGF0ZQotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5HcmFkaWVudERyYXdhYmxlJDEpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuR3JhZGllbnREcmF3YWJsZSRPcmllbnRhdGlvbgotaW50W10pCi0KLXByaXZhdGUgYW5kcm9pZC5ncmFwaGljcy5QYXRoIGJ1aWxkUmluZygKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuR3JhZGllbnREcmF3YWJsZSRHcmFkaWVudFN0YXRlKQotCi1wcml2YXRlIGJvb2xlYW4gZW5zdXJlVmFsaWRSZWN0KCkKLQotcHJpdmF0ZSBzdGF0aWMgZmxvYXQgZ2V0RmxvYXRPckZyYWN0aW9uKAotYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5Ci1pbnQKLWZsb2F0KQotCi1wcml2YXRlIGludCBtb2R1bGF0ZUFscGhhKAotaW50KQotCi1wdWJsaWMgdm9pZCBkcmF3KAotYW5kcm9pZC5ncmFwaGljcy5DYW52YXMpCi0KLXB1YmxpYyBpbnQgZ2V0Q2hhbmdpbmdDb25maWd1cmF0aW9ucygpCi0KLXB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlJENvbnN0YW50U3RhdGUgZ2V0Q29uc3RhbnRTdGF0ZSgpCi0KLXB1YmxpYyBpbnQgZ2V0SW50cmluc2ljSGVpZ2h0KCkKLQotcHVibGljIGludCBnZXRJbnRyaW5zaWNXaWR0aCgpCi0KLXB1YmxpYyBpbnQgZ2V0T3BhY2l0eSgpCi0KLXB1YmxpYyBib29sZWFuIGdldFBhZGRpbmcoCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGluZmxhdGUoCi1hbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcwotb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcgotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHJvdGVjdGVkIHZvaWQgb25Cb3VuZHNDaGFuZ2UoCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3QpCi0KLXByb3RlY3RlZCBib29sZWFuIG9uTGV2ZWxDaGFuZ2UoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldEFscGhhKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRDb2xvcigKLWludCkKLQotcHVibGljIHZvaWQgc2V0Q29sb3JGaWx0ZXIoCi1hbmRyb2lkLmdyYXBoaWNzLkNvbG9yRmlsdGVyKQotCi1wdWJsaWMgdm9pZCBzZXRDb3JuZXJSYWRpaSgKLWZsb2F0W10pCi0KLXB1YmxpYyB2b2lkIHNldENvcm5lclJhZGl1cygKLWZsb2F0KQotCi1wdWJsaWMgdm9pZCBzZXREaXRoZXIoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRHcmFkaWVudENlbnRlcigKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIHZvaWQgc2V0R3JhZGllbnRSYWRpdXMoCi1mbG9hdCkKLQotcHVibGljIHZvaWQgc2V0R3JhZGllbnRUeXBlKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRTaGFwZSgKLWludCkKLQotcHVibGljIHZvaWQgc2V0U2l6ZSgKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRTdHJva2UoCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgc2V0U3Ryb2tlKAotaW50Ci1pbnQKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIHZvaWQgc2V0VXNlTGV2ZWwoCi1ib29sZWFuKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0luc2V0RHJhd2FibGU7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9NDEwNCBuYW1lID1udWxsICkKLSBjbGFzcyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkluc2V0RHJhd2FibGUkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjQgbmFtZSA9SW5zZXRTdGF0ZSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9JbnNldERyYXdhYmxlOyApCi1maW5hbCBjbGFzcyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkluc2V0RHJhd2FibGUkSW5zZXRTdGF0ZSBleHRlbmRzIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUkQ29uc3RhbnRTdGF0ZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gYm9vbGVhbiBtQ2FuQ29uc3RhbnRTdGF0ZQotCi0gaW50IG1DaGFuZ2luZ0NvbmZpZ3VyYXRpb25zCi0KLSBib29sZWFuIG1DaGVja2VkQ29uc3RhbnRTdGF0ZQotCi0gYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSBtRHJhd2FibGUKLQotIGludCBtSW5zZXRCb3R0b20KLQotIGludCBtSW5zZXRMZWZ0Ci0KLSBpbnQgbUluc2V0UmlnaHQKLQotIGludCBtSW5zZXRUb3AKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkluc2V0RHJhd2FibGUkSW5zZXRTdGF0ZQotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5JbnNldERyYXdhYmxlKQotCi0gYm9vbGVhbiBjYW5Db25zdGFudFN0YXRlKCkKLQotcHVibGljIGludCBnZXRDaGFuZ2luZ0NvbmZpZ3VyYXRpb25zKCkKLQotcHVibGljIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgbmV3RHJhd2FibGUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvSW5zZXREcmF3YWJsZSQxO0xhbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0luc2V0RHJhd2FibGUkSW5zZXRTdGF0ZTsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuSW5zZXREcmF3YWJsZSBleHRlbmRzIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgaW1wbGVtZW50cyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlJENhbGxiYWNrCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5JbnNldERyYXdhYmxlJEluc2V0U3RhdGUgbUluc2V0U3RhdGUKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlJlY3QgbVRtcFJlY3QKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlCi1pbnQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUKLWludAotaW50Ci1pbnQKLWludCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuSW5zZXREcmF3YWJsZSRJbnNldFN0YXRlKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkluc2V0RHJhd2FibGUkSW5zZXRTdGF0ZQotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5JbnNldERyYXdhYmxlJDEpCi0KLXB1YmxpYyB2b2lkIGRyYXcoCi1hbmRyb2lkLmdyYXBoaWNzLkNhbnZhcykKLQotcHVibGljIGludCBnZXRDaGFuZ2luZ0NvbmZpZ3VyYXRpb25zKCkKLQotcHVibGljIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUkQ29uc3RhbnRTdGF0ZSBnZXRDb25zdGFudFN0YXRlKCkKLQotcHVibGljIGludCBnZXRJbnRyaW5zaWNIZWlnaHQoKQotCi1wdWJsaWMgaW50IGdldEludHJpbnNpY1dpZHRoKCkKLQotcHVibGljIGludCBnZXRPcGFjaXR5KCkKLQotcHVibGljIGJvb2xlYW4gZ2V0UGFkZGluZygKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgaW5mbGF0ZSgKLWFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzCi1vcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyCi1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0KQotCi1wdWJsaWMgdm9pZCBpbnZhbGlkYXRlRHJhd2FibGUoCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlKQotCi1wdWJsaWMgYm9vbGVhbiBpc1N0YXRlZnVsKCkKLQotcHJvdGVjdGVkIHZvaWQgb25Cb3VuZHNDaGFuZ2UoCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3QpCi0KLXByb3RlY3RlZCBib29sZWFuIG9uU3RhdGVDaGFuZ2UoCi1pbnRbXSkKLQotcHVibGljIHZvaWQgc2NoZWR1bGVEcmF3YWJsZSgKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUKLWphdmEubGFuZy5SdW5uYWJsZQotbG9uZykKLQotcHVibGljIHZvaWQgc2V0QWxwaGEoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldENvbG9yRmlsdGVyKAotYW5kcm9pZC5ncmFwaGljcy5Db2xvckZpbHRlcikKLQotcHVibGljIGJvb2xlYW4gc2V0VmlzaWJsZSgKLWJvb2xlYW4KLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHVuc2NoZWR1bGVEcmF3YWJsZSgKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUKLWphdmEubGFuZy5SdW5uYWJsZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9TGF5ZXJTdGF0ZSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9MYXllckRyYXdhYmxlOyApCi0gY2xhc3MgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5MYXllckRyYXdhYmxlJExheWVyU3RhdGUgZXh0ZW5kcyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlJENvbnN0YW50U3RhdGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuTGF5ZXJEcmF3YWJsZSRSZWNbXSBtQXJyYXkKLQotcHJpdmF0ZSBib29sZWFuIG1DYW5Db25zdGFudFN0YXRlCi0KLSBpbnQgbUNoYW5naW5nQ29uZmlndXJhdGlvbnMKLQotcHJpdmF0ZSBib29sZWFuIG1DaGVja2VkQ29uc3RhbnRTdGF0ZQotCi0gaW50IG1DaGlsZHJlbkNoYW5naW5nQ29uZmlndXJhdGlvbnMKLQotcHJpdmF0ZSBib29sZWFuIG1IYXZlT3BhY2l0eQotCi1wcml2YXRlIGJvb2xlYW4gbUhhdmVTdGF0ZWZ1bAotCi0gaW50IG1OdW0KLQotcHJpdmF0ZSBpbnQgbU9wYWNpdHkKLQotcHJpdmF0ZSBib29sZWFuIG1TdGF0ZWZ1bAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuTGF5ZXJEcmF3YWJsZSRMYXllclN0YXRlCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkxheWVyRHJhd2FibGUpCi0KLXB1YmxpYyBib29sZWFuIGNhbkNvbnN0YW50U3RhdGUoKQotCi1wdWJsaWMgaW50IGdldENoYW5naW5nQ29uZmlndXJhdGlvbnMoKQotCi1wdWJsaWMgZmluYWwgaW50IGdldE9wYWNpdHkoKQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBpc1N0YXRlZnVsKCkKLQotcHVibGljIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgbmV3RHJhd2FibGUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1SZWMgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvTGF5ZXJEcmF3YWJsZTsgKQotIGNsYXNzIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuTGF5ZXJEcmF3YWJsZSRSZWMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIG1EcmF3YWJsZQotCi1wdWJsaWMgaW50IG1JZAotCi1wdWJsaWMgaW50IG1JbnNldEIKLQotcHVibGljIGludCBtSW5zZXRMCi0KLXB1YmxpYyBpbnQgbUluc2V0UgotCi1wdWJsaWMgaW50IG1JbnNldFQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvTGF5ZXJEcmF3YWJsZSRMYXllclN0YXRlO0xhbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0xheWVyRHJhd2FibGUkUmVjOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5MYXllckRyYXdhYmxlIGV4dGVuZHMgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSBpbXBsZW1lbnRzIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUkQ2FsbGJhY2sKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuTGF5ZXJEcmF3YWJsZSRMYXllclN0YXRlIG1MYXllclN0YXRlCi0KLXByaXZhdGUgaW50W10gbVBhZGRpbmdCCi0KLXByaXZhdGUgaW50W10gbVBhZGRpbmdMCi0KLXByaXZhdGUgaW50W10gbVBhZGRpbmdSCi0KLXByaXZhdGUgaW50W10gbVBhZGRpbmdUCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5SZWN0IG1UbXBSZWN0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5MYXllckRyYXdhYmxlJExheWVyU3RhdGUpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGVbXSkKLQotcHJpdmF0ZSB2b2lkIGFkZExheWVyKAotaW50Ci1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlCi1pbnQKLWludAotaW50Ci1pbnQpCi0KLXByaXZhdGUgdm9pZCBlbnN1cmVQYWRkaW5nKCkKLQotcHJpdmF0ZSBib29sZWFuIHJlYXBwbHlQYWRkaW5nKAotaW50Ci1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkxheWVyRHJhd2FibGUkUmVjKQotCi0gYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5MYXllckRyYXdhYmxlJExheWVyU3RhdGUgY3JlYXRlQ29uc3RhbnRTdGF0ZSgKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuTGF5ZXJEcmF3YWJsZSRMYXllclN0YXRlKQotCi1wdWJsaWMgdm9pZCBkcmF3KAotYW5kcm9pZC5ncmFwaGljcy5DYW52YXMpCi0KLXB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIGZpbmREcmF3YWJsZUJ5TGF5ZXJJZCgKLWludCkKLQotcHVibGljIGludCBnZXRDaGFuZ2luZ0NvbmZpZ3VyYXRpb25zKCkKLQotcHVibGljIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUkQ29uc3RhbnRTdGF0ZSBnZXRDb25zdGFudFN0YXRlKCkKLQotcHVibGljIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgZ2V0RHJhd2FibGUoCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0SWQoCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0SW50cmluc2ljSGVpZ2h0KCkKLQotcHVibGljIGludCBnZXRJbnRyaW5zaWNXaWR0aCgpCi0KLXB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZMYXllcnMoKQotCi1wdWJsaWMgaW50IGdldE9wYWNpdHkoKQotCi1wdWJsaWMgYm9vbGVhbiBnZXRQYWRkaW5nKAotYW5kcm9pZC5ncmFwaGljcy5SZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBpbmZsYXRlKAotYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMKLW9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXIKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi0KLXB1YmxpYyB2b2lkIGludmFsaWRhdGVEcmF3YWJsZSgKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUpCi0KLXB1YmxpYyBib29sZWFuIGlzU3RhdGVmdWwoKQotCi1wcm90ZWN0ZWQgdm9pZCBvbkJvdW5kc0NoYW5nZSgKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdCkKLQotcHJvdGVjdGVkIGJvb2xlYW4gb25MZXZlbENoYW5nZSgKLWludCkKLQotcHJvdGVjdGVkIGJvb2xlYW4gb25TdGF0ZUNoYW5nZSgKLWludFtdKQotCi1wdWJsaWMgdm9pZCBzY2hlZHVsZURyYXdhYmxlKAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZQotamF2YS5sYW5nLlJ1bm5hYmxlCi1sb25nKQotCi1wdWJsaWMgdm9pZCBzZXRBbHBoYSgKLWludCkKLQotcHVibGljIHZvaWQgc2V0Q29sb3JGaWx0ZXIoCi1hbmRyb2lkLmdyYXBoaWNzLkNvbG9yRmlsdGVyKQotCi1wdWJsaWMgdm9pZCBzZXREaXRoZXIoCi1ib29sZWFuKQotCi1wdWJsaWMgYm9vbGVhbiBzZXREcmF3YWJsZUJ5TGF5ZXJJZCgKLWludAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSkKLQotcHVibGljIHZvaWQgc2V0SWQoCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgc2V0TGF5ZXJJbnNldCgKLWludAotaW50Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBzZXRWaXNpYmxlKAotYm9vbGVhbgotYm9vbGVhbikKLQotcHVibGljIHZvaWQgdW5zY2hlZHVsZURyYXdhYmxlKAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZQotamF2YS5sYW5nLlJ1bm5hYmxlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9NDEwNCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0xldmVsTGlzdERyYXdhYmxlOyApCi0gY2xhc3MgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5MZXZlbExpc3REcmF3YWJsZSQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNiBuYW1lID1MZXZlbExpc3RTdGF0ZSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9MZXZlbExpc3REcmF3YWJsZTsgKQotZmluYWwgY2xhc3MgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5MZXZlbExpc3REcmF3YWJsZSRMZXZlbExpc3RTdGF0ZSBleHRlbmRzIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGVDb250YWluZXIkRHJhd2FibGVDb250YWluZXJTdGF0ZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGludFtdIG1IaWdocwotCi1wcml2YXRlIGludFtdIG1Mb3dzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5MZXZlbExpc3REcmF3YWJsZSRMZXZlbExpc3RTdGF0ZQotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5MZXZlbExpc3REcmF3YWJsZSkKLQotcHVibGljIHZvaWQgYWRkTGV2ZWwoCi1pbnQKLWludAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSkKLQotcHVibGljIHZvaWQgZ3Jvd0FycmF5KAotaW50Ci1pbnQpCi0KLXB1YmxpYyBpbnQgaW5kZXhPZkxldmVsKAotaW50KQotCi1wdWJsaWMgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSBuZXdEcmF3YWJsZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9MZXZlbExpc3REcmF3YWJsZSQxO0xhbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0xldmVsTGlzdERyYXdhYmxlJExldmVsTGlzdFN0YXRlOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5MZXZlbExpc3REcmF3YWJsZSBleHRlbmRzIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGVDb250YWluZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkxldmVsTGlzdERyYXdhYmxlJExldmVsTGlzdFN0YXRlIG1MZXZlbExpc3RTdGF0ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkxldmVsTGlzdERyYXdhYmxlJExldmVsTGlzdFN0YXRlKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkxldmVsTGlzdERyYXdhYmxlJExldmVsTGlzdFN0YXRlCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkxldmVsTGlzdERyYXdhYmxlJDEpCi0KLXB1YmxpYyB2b2lkIGFkZExldmVsKAotaW50Ci1pbnQKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGluZmxhdGUoCi1hbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcwotb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcgotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHJvdGVjdGVkIGJvb2xlYW4gb25MZXZlbENoYW5nZSgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTQxMDQgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9OaW5lUGF0Y2hEcmF3YWJsZTsgKQotIGNsYXNzIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuTmluZVBhdGNoRHJhd2FibGUkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL05pbmVQYXRjaERyYXdhYmxlOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI0IG5hbWUgPU5pbmVQYXRjaFN0YXRlICkKLWZpbmFsIGNsYXNzIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuTmluZVBhdGNoRHJhd2FibGUkTmluZVBhdGNoU3RhdGUgZXh0ZW5kcyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlJENvbnN0YW50U3RhdGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGludCBtQ2hhbmdpbmdDb25maWd1cmF0aW9ucwotCi1maW5hbCBhbmRyb2lkLmdyYXBoaWNzLk5pbmVQYXRjaCBtTmluZVBhdGNoCi0KLWZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUmVjdCBtUGFkZGluZwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQuZ3JhcGhpY3MuTmluZVBhdGNoCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3QpCi0KLXB1YmxpYyBpbnQgZ2V0Q2hhbmdpbmdDb25maWd1cmF0aW9ucygpCi0KLXB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIG5ld0RyYXdhYmxlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL05pbmVQYXRjaERyYXdhYmxlJDE7TGFuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvTmluZVBhdGNoRHJhd2FibGUkTmluZVBhdGNoU3RhdGU7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLk5pbmVQYXRjaERyYXdhYmxlIGV4dGVuZHMgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuTmluZVBhdGNoIG1OaW5lUGF0Y2gKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLk5pbmVQYXRjaERyYXdhYmxlJE5pbmVQYXRjaFN0YXRlIG1OaW5lUGF0Y2hTdGF0ZQotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUmVjdCBtUGFkZGluZwotCi1wcml2YXRlIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQgbVBhaW50Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAKLWJ5dGVbXQotYW5kcm9pZC5ncmFwaGljcy5SZWN0Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmdyYXBoaWNzLk5pbmVQYXRjaCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuTmluZVBhdGNoRHJhd2FibGUkTmluZVBhdGNoU3RhdGUpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuTmluZVBhdGNoRHJhd2FibGUkTmluZVBhdGNoU3RhdGUKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuTmluZVBhdGNoRHJhd2FibGUkMSkKLQotcHVibGljIHZvaWQgZHJhdygKLWFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzKQotCi1wdWJsaWMgaW50IGdldENoYW5naW5nQ29uZmlndXJhdGlvbnMoKQotCi1wdWJsaWMgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSRDb25zdGFudFN0YXRlIGdldENvbnN0YW50U3RhdGUoKQotCi1wdWJsaWMgaW50IGdldEludHJpbnNpY0hlaWdodCgpCi0KLXB1YmxpYyBpbnQgZ2V0SW50cmluc2ljV2lkdGgoKQotCi1wdWJsaWMgaW50IGdldE1pbmltdW1IZWlnaHQoKQotCi1wdWJsaWMgaW50IGdldE1pbmltdW1XaWR0aCgpCi0KLXB1YmxpYyBpbnQgZ2V0T3BhY2l0eSgpCi0KLXB1YmxpYyBib29sZWFuIGdldFBhZGRpbmcoCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3QpCi0KLXB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLlBhaW50IGdldFBhaW50KCkKLQotcHVibGljIGFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uIGdldFRyYW5zcGFyZW50UmVnaW9uKCkKLQotcHVibGljIHZvaWQgc2V0QWxwaGEoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldENvbG9yRmlsdGVyKAotYW5kcm9pZC5ncmFwaGljcy5Db2xvckZpbHRlcikKLQotcHVibGljIHZvaWQgc2V0RGl0aGVyKAotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL1NoYXBlRHJhd2FibGUkMTtMYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9TaGFwZURyYXdhYmxlJFNoYWRlckZhY3Rvcnk7TGFuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvU2hhcGVEcmF3YWJsZSRTaGFwZVN0YXRlOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5TaGFwZURyYXdhYmxlIGV4dGVuZHMgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU2hhcGVEcmF3YWJsZSRTaGFwZVN0YXRlIG1TaGFwZVN0YXRlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU2hhcGVEcmF3YWJsZSRTaGFwZVN0YXRlKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLlNoYXBlRHJhd2FibGUkU2hhcGVTdGF0ZQotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5TaGFwZURyYXdhYmxlJDEpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuc2hhcGVzLlNoYXBlKQotCi1wcml2YXRlIHN0YXRpYyBpbnQgbW9kdWxhdGVBbHBoYSgKLWludAotaW50KQotCi1wcml2YXRlIHZvaWQgdXBkYXRlU2hhcGUoKQotCi1wdWJsaWMgdm9pZCBkcmF3KAotYW5kcm9pZC5ncmFwaGljcy5DYW52YXMpCi0KLXB1YmxpYyBpbnQgZ2V0Q2hhbmdpbmdDb25maWd1cmF0aW9ucygpCi0KLXB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlJENvbnN0YW50U3RhdGUgZ2V0Q29uc3RhbnRTdGF0ZSgpCi0KLXB1YmxpYyBpbnQgZ2V0SW50cmluc2ljSGVpZ2h0KCkKLQotcHVibGljIGludCBnZXRJbnRyaW5zaWNXaWR0aCgpCi0KLXB1YmxpYyBpbnQgZ2V0T3BhY2l0eSgpCi0KLXB1YmxpYyBib29sZWFuIGdldFBhZGRpbmcoCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3QpCi0KLXB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLlBhaW50IGdldFBhaW50KCkKLQotcHVibGljIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU2hhcGVEcmF3YWJsZSRTaGFkZXJGYWN0b3J5IGdldFNoYWRlckZhY3RvcnkoKQotCi1wdWJsaWMgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5zaGFwZXMuU2hhcGUgZ2V0U2hhcGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBpbmZsYXRlKAotYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMKLW9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXIKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi0KLXByb3RlY3RlZCBib29sZWFuIGluZmxhdGVUYWcoCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcwotb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcgotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHJvdGVjdGVkIHZvaWQgb25Cb3VuZHNDaGFuZ2UoCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3QpCi0KLXByb3RlY3RlZCB2b2lkIG9uRHJhdygKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuc2hhcGVzLlNoYXBlCi1hbmRyb2lkLmdyYXBoaWNzLkNhbnZhcwotYW5kcm9pZC5ncmFwaGljcy5QYWludCkKLQotcHVibGljIHZvaWQgc2V0QWxwaGEoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldENvbG9yRmlsdGVyKAotYW5kcm9pZC5ncmFwaGljcy5Db2xvckZpbHRlcikKLQotcHVibGljIHZvaWQgc2V0RGl0aGVyKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0SW50cmluc2ljSGVpZ2h0KAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRJbnRyaW5zaWNXaWR0aCgKLWludCkKLQotcHVibGljIHZvaWQgc2V0UGFkZGluZygKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgc2V0UGFkZGluZygKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdCkKLQotcHVibGljIHZvaWQgc2V0U2hhZGVyRmFjdG9yeSgKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU2hhcGVEcmF3YWJsZSRTaGFkZXJGYWN0b3J5KQotCi1wdWJsaWMgdm9pZCBzZXRTaGFwZSgKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuc2hhcGVzLlNoYXBlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuUGFpbnREcmF3YWJsZSBleHRlbmRzIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU2hhcGVEcmF3YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludCkKLQotcHJvdGVjdGVkIGJvb2xlYW4gaW5mbGF0ZVRhZygKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzCi1vcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyCi1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0KQotCi1wdWJsaWMgdm9pZCBzZXRDb3JuZXJSYWRpaSgKLWZsb2F0W10pCi0KLXB1YmxpYyB2b2lkIHNldENvcm5lclJhZGl1cygKLWZsb2F0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuUGljdHVyZURyYXdhYmxlIGV4dGVuZHMgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGFuZHJvaWQuZ3JhcGhpY3MuUGljdHVyZSBtUGljdHVyZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuZ3JhcGhpY3MuUGljdHVyZSkKLQotcHVibGljIHZvaWQgZHJhdygKLWFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzKQotCi1wdWJsaWMgaW50IGdldEludHJpbnNpY0hlaWdodCgpCi0KLXB1YmxpYyBpbnQgZ2V0SW50cmluc2ljV2lkdGgoKQotCi1wdWJsaWMgaW50IGdldE9wYWNpdHkoKQotCi1wdWJsaWMgYW5kcm9pZC5ncmFwaGljcy5QaWN0dXJlIGdldFBpY3R1cmUoKQotCi1wdWJsaWMgdm9pZCBzZXRBbHBoYSgKLWludCkKLQotcHVibGljIHZvaWQgc2V0Q29sb3JGaWx0ZXIoCi1hbmRyb2lkLmdyYXBoaWNzLkNvbG9yRmlsdGVyKQotCi1wdWJsaWMgdm9pZCBzZXREaXRoZXIoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRGaWx0ZXJCaXRtYXAoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRQaWN0dXJlKAotYW5kcm9pZC5ncmFwaGljcy5QaWN0dXJlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL1JvdGF0ZURyYXdhYmxlOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTQxMDQgbmFtZSA9bnVsbCApCi0gY2xhc3MgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5Sb3RhdGVEcmF3YWJsZSQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvUm90YXRlRHJhd2FibGU7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjQgbmFtZSA9Um90YXRlU3RhdGUgKQotZmluYWwgY2xhc3MgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5Sb3RhdGVEcmF3YWJsZSRSb3RhdGVTdGF0ZSBleHRlbmRzIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUkQ29uc3RhbnRTdGF0ZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGJvb2xlYW4gbUNhbkNvbnN0YW50U3RhdGUKLQotIGludCBtQ2hhbmdpbmdDb25maWd1cmF0aW9ucwotCi1wcml2YXRlIGJvb2xlYW4gbUNoZWNrZWRDb25zdGFudFN0YXRlCi0KLSBmbG9hdCBtQ3VycmVudERlZ3JlZXMKLQotIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgbURyYXdhYmxlCi0KLSBmbG9hdCBtRnJvbURlZ3JlZXMKLQotIGZsb2F0IG1QaXZvdFgKLQotIGJvb2xlYW4gbVBpdm90WFJlbAotCi0gZmxvYXQgbVBpdm90WQotCi0gYm9vbGVhbiBtUGl2b3RZUmVsCi0KLSBmbG9hdCBtVG9EZWdyZWVzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5Sb3RhdGVEcmF3YWJsZSRSb3RhdGVTdGF0ZQotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5Sb3RhdGVEcmF3YWJsZSkKLQotcHVibGljIGJvb2xlYW4gY2FuQ29uc3RhbnRTdGF0ZSgpCi0KLXB1YmxpYyBpbnQgZ2V0Q2hhbmdpbmdDb25maWd1cmF0aW9ucygpCi0KLXB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIG5ld0RyYXdhYmxlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL1JvdGF0ZURyYXdhYmxlJDE7TGFuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvUm90YXRlRHJhd2FibGUkUm90YXRlU3RhdGU7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLlJvdGF0ZURyYXdhYmxlIGV4dGVuZHMgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSBpbXBsZW1lbnRzIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUkQ2FsbGJhY2sKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgTUFYX0xFVkVMCi0KLXByaXZhdGUgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5Sb3RhdGVEcmF3YWJsZSRSb3RhdGVTdGF0ZSBtU3RhdGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5Sb3RhdGVEcmF3YWJsZSRSb3RhdGVTdGF0ZSkKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5Sb3RhdGVEcmF3YWJsZSRSb3RhdGVTdGF0ZQotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5Sb3RhdGVEcmF3YWJsZSQxKQotCi1wdWJsaWMgdm9pZCBkcmF3KAotYW5kcm9pZC5ncmFwaGljcy5DYW52YXMpCi0KLXB1YmxpYyBpbnQgZ2V0Q2hhbmdpbmdDb25maWd1cmF0aW9ucygpCi0KLXB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlJENvbnN0YW50U3RhdGUgZ2V0Q29uc3RhbnRTdGF0ZSgpCi0KLXB1YmxpYyBpbnQgZ2V0SW50cmluc2ljSGVpZ2h0KCkKLQotcHVibGljIGludCBnZXRJbnRyaW5zaWNXaWR0aCgpCi0KLXB1YmxpYyBpbnQgZ2V0T3BhY2l0eSgpCi0KLXB1YmxpYyBib29sZWFuIGdldFBhZGRpbmcoCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGluZmxhdGUoCi1hbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcwotb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcgotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHVibGljIHZvaWQgaW52YWxpZGF0ZURyYXdhYmxlKAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSkKLQotcHVibGljIGJvb2xlYW4gaXNTdGF0ZWZ1bCgpCi0KLXByb3RlY3RlZCB2b2lkIG9uQm91bmRzQ2hhbmdlKAotYW5kcm9pZC5ncmFwaGljcy5SZWN0KQotCi1wcm90ZWN0ZWQgYm9vbGVhbiBvbkxldmVsQ2hhbmdlKAotaW50KQotCi1wcm90ZWN0ZWQgYm9vbGVhbiBvblN0YXRlQ2hhbmdlKAotaW50W10pCi0KLXB1YmxpYyB2b2lkIHNjaGVkdWxlRHJhd2FibGUoCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlCi1qYXZhLmxhbmcuUnVubmFibGUKLWxvbmcpCi0KLXB1YmxpYyB2b2lkIHNldEFscGhhKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRDb2xvckZpbHRlcigKLWFuZHJvaWQuZ3JhcGhpY3MuQ29sb3JGaWx0ZXIpCi0KLXB1YmxpYyBib29sZWFuIHNldFZpc2libGUoCi1ib29sZWFuCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCB1bnNjaGVkdWxlRHJhd2FibGUoCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlCi1qYXZhLmxhbmcuUnVubmFibGUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvU2NhbGVEcmF3YWJsZTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID00MTA0IG5hbWUgPW51bGwgKQotIGNsYXNzIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU2NhbGVEcmF3YWJsZSQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNCBuYW1lID1TY2FsZVN0YXRlICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL1NjYWxlRHJhd2FibGU7ICkKLWZpbmFsIGNsYXNzIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU2NhbGVEcmF3YWJsZSRTY2FsZVN0YXRlIGV4dGVuZHMgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSRDb25zdGFudFN0YXRlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYm9vbGVhbiBtQ2FuQ29uc3RhbnRTdGF0ZQotCi0gaW50IG1DaGFuZ2luZ0NvbmZpZ3VyYXRpb25zCi0KLXByaXZhdGUgYm9vbGVhbiBtQ2hlY2tlZENvbnN0YW50U3RhdGUKLQotIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgbURyYXdhYmxlCi0KLSBpbnQgbUdyYXZpdHkKLQotIGZsb2F0IG1TY2FsZUhlaWdodAotCi0gZmxvYXQgbVNjYWxlV2lkdGgKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLlNjYWxlRHJhd2FibGUkU2NhbGVTdGF0ZQotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5TY2FsZURyYXdhYmxlKQotCi0gYm9vbGVhbiBjYW5Db25zdGFudFN0YXRlKCkKLQotcHVibGljIGludCBnZXRDaGFuZ2luZ0NvbmZpZ3VyYXRpb25zKCkKLQotcHVibGljIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgbmV3RHJhd2FibGUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvU2NhbGVEcmF3YWJsZSQxO0xhbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL1NjYWxlRHJhd2FibGUkU2NhbGVTdGF0ZTsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU2NhbGVEcmF3YWJsZSBleHRlbmRzIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgaW1wbGVtZW50cyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlJENhbGxiYWNrCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5TY2FsZURyYXdhYmxlJFNjYWxlU3RhdGUgbVNjYWxlU3RhdGUKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlJlY3QgbVRtcFJlY3QKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlCi1pbnQKLWZsb2F0Ci1mbG9hdCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU2NhbGVEcmF3YWJsZSRTY2FsZVN0YXRlKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLlNjYWxlRHJhd2FibGUkU2NhbGVTdGF0ZQotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5TY2FsZURyYXdhYmxlJDEpCi0KLXByaXZhdGUgc3RhdGljIGZsb2F0IGdldFBlcmNlbnQoCi1hbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXkKLWludCkKLQotcHVibGljIHZvaWQgZHJhdygKLWFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzKQotCi1wdWJsaWMgaW50IGdldENoYW5naW5nQ29uZmlndXJhdGlvbnMoKQotCi1wdWJsaWMgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSRDb25zdGFudFN0YXRlIGdldENvbnN0YW50U3RhdGUoKQotCi1wdWJsaWMgaW50IGdldEludHJpbnNpY0hlaWdodCgpCi0KLXB1YmxpYyBpbnQgZ2V0SW50cmluc2ljV2lkdGgoKQotCi1wdWJsaWMgaW50IGdldE9wYWNpdHkoKQotCi1wdWJsaWMgYm9vbGVhbiBnZXRQYWRkaW5nKAotYW5kcm9pZC5ncmFwaGljcy5SZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBpbmZsYXRlKAotYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMKLW9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXIKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi0KLXB1YmxpYyB2b2lkIGludmFsaWRhdGVEcmF3YWJsZSgKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUpCi0KLXB1YmxpYyBib29sZWFuIGlzU3RhdGVmdWwoKQotCi1wcm90ZWN0ZWQgdm9pZCBvbkJvdW5kc0NoYW5nZSgKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdCkKLQotcHJvdGVjdGVkIGJvb2xlYW4gb25MZXZlbENoYW5nZSgKLWludCkKLQotcHJvdGVjdGVkIGJvb2xlYW4gb25TdGF0ZUNoYW5nZSgKLWludFtdKQotCi1wdWJsaWMgdm9pZCBzY2hlZHVsZURyYXdhYmxlKAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZQotamF2YS5sYW5nLlJ1bm5hYmxlCi1sb25nKQotCi1wdWJsaWMgdm9pZCBzZXRBbHBoYSgKLWludCkKLQotcHVibGljIHZvaWQgc2V0Q29sb3JGaWx0ZXIoCi1hbmRyb2lkLmdyYXBoaWNzLkNvbG9yRmlsdGVyKQotCi1wdWJsaWMgYm9vbGVhbiBzZXRWaXNpYmxlKAotYm9vbGVhbgotYm9vbGVhbikKLQotcHVibGljIHZvaWQgdW5zY2hlZHVsZURyYXdhYmxlKAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZQotamF2YS5sYW5nLlJ1bm5hYmxlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL1NoYXBlRHJhd2FibGU7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9NDEwNCBuYW1lID1udWxsICkKLSBjbGFzcyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLlNoYXBlRHJhd2FibGUkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAzMyBuYW1lID1TaGFkZXJGYWN0b3J5ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL1NoYXBlRHJhd2FibGU7ICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLlNoYXBlRHJhd2FibGUkU2hhZGVyRmFjdG9yeSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC5ncmFwaGljcy5TaGFkZXIgcmVzaXplKAotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNCBuYW1lID1TaGFwZVN0YXRlICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL1NoYXBlRHJhd2FibGU7ICkKLWZpbmFsIGNsYXNzIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU2hhcGVEcmF3YWJsZSRTaGFwZVN0YXRlIGV4dGVuZHMgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSRDb25zdGFudFN0YXRlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBpbnQgbUFscGhhCi0KLSBpbnQgbUNoYW5naW5nQ29uZmlndXJhdGlvbnMKLQotIGludCBtSW50cmluc2ljSGVpZ2h0Ci0KLSBpbnQgbUludHJpbnNpY1dpZHRoCi0KLSBhbmRyb2lkLmdyYXBoaWNzLlJlY3QgbVBhZGRpbmcKLQotIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQgbVBhaW50Ci0KLSBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLlNoYXBlRHJhd2FibGUkU2hhZGVyRmFjdG9yeSBtU2hhZGVyRmFjdG9yeQotCi0gYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5zaGFwZXMuU2hhcGUgbVNoYXBlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5TaGFwZURyYXdhYmxlJFNoYXBlU3RhdGUpCi0KLXB1YmxpYyBpbnQgZ2V0Q2hhbmdpbmdDb25maWd1cmF0aW9ucygpCi0KLXB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIG5ld0RyYXdhYmxlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9TdGF0ZUxpc3REcmF3YWJsZTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID00MTA0IG5hbWUgPW51bGwgKQotIGNsYXNzIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU3RhdGVMaXN0RHJhd2FibGUkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL1N0YXRlTGlzdERyYXdhYmxlOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI0IG5hbWUgPVN0YXRlTGlzdFN0YXRlICkKLWZpbmFsIGNsYXNzIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU3RhdGVMaXN0RHJhd2FibGUkU3RhdGVMaXN0U3RhdGUgZXh0ZW5kcyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlQ29udGFpbmVyJERyYXdhYmxlQ29udGFpbmVyU3RhdGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBpbnRbXVtdIG1TdGF0ZVNldHMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLlN0YXRlTGlzdERyYXdhYmxlJFN0YXRlTGlzdFN0YXRlCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLlN0YXRlTGlzdERyYXdhYmxlKQotCi1zdGF0aWMgaW50IGFjY2VzcyQwMDAoCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLlN0YXRlTGlzdERyYXdhYmxlJFN0YXRlTGlzdFN0YXRlCi1pbnRbXSkKLQotcHJpdmF0ZSBpbnQgaW5kZXhPZlN0YXRlU2V0KAotaW50W10pCi0KLSBpbnQgYWRkU3RhdGVTZXQoCi1pbnRbXQotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSkKLQotcHVibGljIHZvaWQgZ3Jvd0FycmF5KAotaW50Ci1pbnQpCi0KLXB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIG5ld0RyYXdhYmxlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL1N0YXRlTGlzdERyYXdhYmxlJDE7TGFuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvU3RhdGVMaXN0RHJhd2FibGUkU3RhdGVMaXN0U3RhdGU7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLlN0YXRlTGlzdERyYXdhYmxlIGV4dGVuZHMgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZUNvbnRhaW5lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU3RhdGVMaXN0RHJhd2FibGUkU3RhdGVMaXN0U3RhdGUgbVN0YXRlTGlzdFN0YXRlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU3RhdGVMaXN0RHJhd2FibGUkU3RhdGVMaXN0U3RhdGUpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU3RhdGVMaXN0RHJhd2FibGUkU3RhdGVMaXN0U3RhdGUKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU3RhdGVMaXN0RHJhd2FibGUkMSkKLQotcHVibGljIHZvaWQgYWRkU3RhdGUoCi1pbnRbXQotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSkKLQotIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU3RhdGVMaXN0RHJhd2FibGUkU3RhdGVMaXN0U3RhdGUgZ2V0U3RhdGVMaXN0U3RhdGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBpbmZsYXRlKAotYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMKLW9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXIKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi0KLXB1YmxpYyBib29sZWFuIGlzU3RhdGVmdWwoKQotCi1wcm90ZWN0ZWQgYm9vbGVhbiBvblN0YXRlQ2hhbmdlKAotaW50W10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvVHJhbnNpdGlvbkRyYXdhYmxlOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTQxMDQgbmFtZSA9bnVsbCApCi0gY2xhc3MgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5UcmFuc2l0aW9uRHJhd2FibGUkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1UcmFuc2l0aW9uU3RhdGUgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvVHJhbnNpdGlvbkRyYXdhYmxlOyApCi0gY2xhc3MgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5UcmFuc2l0aW9uRHJhd2FibGUkVHJhbnNpdGlvblN0YXRlIGV4dGVuZHMgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5MYXllckRyYXdhYmxlJExheWVyU3RhdGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGludCBtQWxwaGEKLQotIGJvb2xlYW4gbUNyb3NzRmFkZQotCi0gaW50IG1EdXJhdGlvbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuVHJhbnNpdGlvbkRyYXdhYmxlJFRyYW5zaXRpb25TdGF0ZQotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5UcmFuc2l0aW9uRHJhd2FibGUpCi0KLXB1YmxpYyBpbnQgZ2V0Q2hhbmdpbmdDb25maWd1cmF0aW9ucygpCi0KLXB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIG5ld0RyYXdhYmxlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL1RyYW5zaXRpb25EcmF3YWJsZSQxO0xhbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL1RyYW5zaXRpb25EcmF3YWJsZSRUcmFuc2l0aW9uU3RhdGU7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLlRyYW5zaXRpb25EcmF3YWJsZSBleHRlbmRzIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuTGF5ZXJEcmF3YWJsZSBpbXBsZW1lbnRzIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUkQ2FsbGJhY2sKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRSQU5TSVRJT05fTk9ORQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNJVElPTl9SVU5OSU5HCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUUkFOU0lUSU9OX1NUQVJUSU5HCi0KLXByaXZhdGUgaW50IG1EdXJhdGlvbgotCi1wcml2YXRlIGludCBtRnJvbQotCi1wcml2YXRlIGJvb2xlYW4gbVJldmVyc2UKLQotcHJpdmF0ZSBsb25nIG1TdGFydFRpbWVNaWxsaXMKLQotcHJpdmF0ZSBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLlRyYW5zaXRpb25EcmF3YWJsZSRUcmFuc2l0aW9uU3RhdGUgbVN0YXRlCi0KLXByaXZhdGUgaW50IG1UbwotCi1wcml2YXRlIGludCBtVHJhbnNpdGlvblN0YXRlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuVHJhbnNpdGlvbkRyYXdhYmxlJFRyYW5zaXRpb25TdGF0ZSkKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5UcmFuc2l0aW9uRHJhd2FibGUkVHJhbnNpdGlvblN0YXRlCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLlRyYW5zaXRpb25EcmF3YWJsZSQxKQotCi0gYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5MYXllckRyYXdhYmxlJExheWVyU3RhdGUgY3JlYXRlQ29uc3RhbnRTdGF0ZSgKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuTGF5ZXJEcmF3YWJsZSRMYXllclN0YXRlKQotCi1wdWJsaWMgdm9pZCBkcmF3KAotYW5kcm9pZC5ncmFwaGljcy5DYW52YXMpCi0KLXB1YmxpYyBib29sZWFuIGlzQ3Jvc3NGYWRlRW5hYmxlZCgpCi0KLXB1YmxpYyB2b2lkIHJlc2V0VHJhbnNpdGlvbigpCi0KLXB1YmxpYyB2b2lkIHJldmVyc2VUcmFuc2l0aW9uKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRDcm9zc0ZhZGVFbmFibGVkKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc3RhcnRUcmFuc2l0aW9uKAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuc2hhcGVzLlNoYXBlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZsb2F0IG1IZWlnaHQKLQotcHJpdmF0ZSBmbG9hdCBtV2lkdGgKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBkcmF3KAotYW5kcm9pZC5ncmFwaGljcy5DYW52YXMKLWFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQpCi0KLXB1YmxpYyBmaW5hbCBmbG9hdCBnZXRIZWlnaHQoKQotCi1wdWJsaWMgZmluYWwgZmxvYXQgZ2V0V2lkdGgoKQotCi1wdWJsaWMgYm9vbGVhbiBoYXNBbHBoYSgpCi0KLXByb3RlY3RlZCB2b2lkIG9uUmVzaXplKAotZmxvYXQKLWZsb2F0KQotCi1wdWJsaWMgZmluYWwgdm9pZCByZXNpemUoCi1mbG9hdAotZmxvYXQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5zaGFwZXMuUmVjdFNoYXBlIGV4dGVuZHMgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5zaGFwZXMuU2hhcGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLmdyYXBoaWNzLlJlY3RGIG1SZWN0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgZHJhdygKLWFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzCi1hbmRyb2lkLmdyYXBoaWNzLlBhaW50KQotCi1wcm90ZWN0ZWQgdm9pZCBvblJlc2l6ZSgKLWZsb2F0Ci1mbG9hdCkKLQotcHJvdGVjdGVkIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUmVjdEYgcmVjdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5zaGFwZXMuQXJjU2hhcGUgZXh0ZW5kcyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLnNoYXBlcy5SZWN0U2hhcGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmbG9hdCBtU3RhcnQKLQotcHJpdmF0ZSBmbG9hdCBtU3dlZXAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1mbG9hdAotZmxvYXQpCi0KLXB1YmxpYyB2b2lkIGRyYXcoCi1hbmRyb2lkLmdyYXBoaWNzLkNhbnZhcwotYW5kcm9pZC5ncmFwaGljcy5QYWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLnNoYXBlcy5PdmFsU2hhcGUgZXh0ZW5kcyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLnNoYXBlcy5SZWN0U2hhcGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCBkcmF3KAotYW5kcm9pZC5ncmFwaGljcy5DYW52YXMKLWFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5zaGFwZXMuUGF0aFNoYXBlIGV4dGVuZHMgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5zaGFwZXMuU2hhcGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLmdyYXBoaWNzLlBhdGggbVBhdGgKLQotcHJpdmF0ZSBmbG9hdCBtU2NhbGVYCi0KLXByaXZhdGUgZmxvYXQgbVNjYWxlWQotCi1wcml2YXRlIGZsb2F0IG1TdGRIZWlnaHQKLQotcHJpdmF0ZSBmbG9hdCBtU3RkV2lkdGgKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmdyYXBoaWNzLlBhdGgKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIHZvaWQgZHJhdygKLWFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzCi1hbmRyb2lkLmdyYXBoaWNzLlBhaW50KQotCi1wcm90ZWN0ZWQgdm9pZCBvblJlc2l6ZSgKLWZsb2F0Ci1mbG9hdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLnNoYXBlcy5Sb3VuZFJlY3RTaGFwZSBleHRlbmRzIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuc2hhcGVzLlJlY3RTaGFwZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZsb2F0W10gbUlubmVyUmFkaWkKLQotcHJpdmF0ZSBhbmRyb2lkLmdyYXBoaWNzLlJlY3RGIG1Jbm5lclJlY3QKLQotcHJpdmF0ZSBhbmRyb2lkLmdyYXBoaWNzLlJlY3RGIG1JbnNldAotCi1wcml2YXRlIGZsb2F0W10gbU91dGVyUmFkaWkKLQotcHJpdmF0ZSBhbmRyb2lkLmdyYXBoaWNzLlBhdGggbVBhdGgKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1mbG9hdFtdCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3RGCi1mbG9hdFtdKQotCi1wdWJsaWMgdm9pZCBkcmF3KAotYW5kcm9pZC5ncmFwaGljcy5DYW52YXMKLWFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQpCi0KLXByb3RlY3RlZCB2b2lkIG9uUmVzaXplKAotZmxvYXQKLWZsb2F0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2hhcmR3YXJlL0NhbWVyYTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID00MTA0IG5hbWUgPW51bGwgKQotIGNsYXNzIGFuZHJvaWQuaGFyZHdhcmUuQ2FtZXJhJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9oYXJkd2FyZS9DYW1lcmE7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1BdXRvRm9jdXNDYWxsYmFjayApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQuaGFyZHdhcmUuQ2FtZXJhJEF1dG9Gb2N1c0NhbGxiYWNrIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uQXV0b0ZvY3VzKAotYm9vbGVhbgotYW5kcm9pZC5oYXJkd2FyZS5DYW1lcmEpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvaGFyZHdhcmUvQ2FtZXJhOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9RXJyb3JDYWxsYmFjayApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQuaGFyZHdhcmUuQ2FtZXJhJEVycm9yQ2FsbGJhY2sgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgb25FcnJvcigKLWludAotYW5kcm9pZC5oYXJkd2FyZS5DYW1lcmEpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPUV2ZW50SGFuZGxlciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9oYXJkd2FyZS9DYW1lcmE7ICkKLSBjbGFzcyBhbmRyb2lkLmhhcmR3YXJlLkNhbWVyYSRFdmVudEhhbmRsZXIgZXh0ZW5kcyBhbmRyb2lkLm9zLkhhbmRsZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLmhhcmR3YXJlLkNhbWVyYSBtQ2FtZXJhCi0KLWZpbmFsIGFuZHJvaWQuaGFyZHdhcmUuQ2FtZXJhIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuaGFyZHdhcmUuQ2FtZXJhCi1hbmRyb2lkLmhhcmR3YXJlLkNhbWVyYQotYW5kcm9pZC5vcy5Mb29wZXIpCi0KLXB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvaGFyZHdhcmUvQ2FtZXJhOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEgbmFtZSA9UGFyYW1ldGVycyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5oYXJkd2FyZS5DYW1lcmEkUGFyYW1ldGVycyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0hhc2hNYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuSGFzaE1hcCBtTWFwCi0KLWZpbmFsIGFuZHJvaWQuaGFyZHdhcmUuQ2FtZXJhIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmhhcmR3YXJlLkNhbWVyYSkKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5oYXJkd2FyZS5DYW1lcmEKLWFuZHJvaWQuaGFyZHdhcmUuQ2FtZXJhJDEpCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBjYW1lcmFGb3JtYXRGb3JQaXhlbEZvcm1hdCgKLWludCkKLQotcHJpdmF0ZSBpbnQgcGl4ZWxGb3JtYXRGb3JDYW1lcmFGb3JtYXQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBkdW1wKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZmxhdHRlbigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBpbnQgZ2V0SW50KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGludCBnZXRQaWN0dXJlRm9ybWF0KCkKLQotcHVibGljIGFuZHJvaWQuaGFyZHdhcmUuQ2FtZXJhJFNpemUgZ2V0UGljdHVyZVNpemUoKQotCi1wdWJsaWMgaW50IGdldFByZXZpZXdGb3JtYXQoKQotCi1wdWJsaWMgaW50IGdldFByZXZpZXdGcmFtZVJhdGUoKQotCi1wdWJsaWMgYW5kcm9pZC5oYXJkd2FyZS5DYW1lcmEkU2l6ZSBnZXRQcmV2aWV3U2l6ZSgpCi0KLXB1YmxpYyB2b2lkIHJlbW92ZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHNldCgKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIHZvaWQgc2V0KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0UGljdHVyZUZvcm1hdCgKLWludCkKLQotcHVibGljIHZvaWQgc2V0UGljdHVyZVNpemUoCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgc2V0UHJldmlld0Zvcm1hdCgKLWludCkKLQotcHVibGljIHZvaWQgc2V0UHJldmlld0ZyYW1lUmF0ZSgKLWludCkKLQotcHVibGljIHZvaWQgc2V0UHJldmlld1NpemUoCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgdW5mbGF0dGVuKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9oYXJkd2FyZS9DYW1lcmE7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1QaWN0dXJlQ2FsbGJhY2sgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLmhhcmR3YXJlLkNhbWVyYSRQaWN0dXJlQ2FsbGJhY2sgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgb25QaWN0dXJlVGFrZW4oCi1ieXRlW10KLWFuZHJvaWQuaGFyZHdhcmUuQ2FtZXJhKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2hhcmR3YXJlL0NhbWVyYTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPVByZXZpZXdDYWxsYmFjayApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQuaGFyZHdhcmUuQ2FtZXJhJFByZXZpZXdDYWxsYmFjayBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvblByZXZpZXdGcmFtZSgKLWJ5dGVbXQotYW5kcm9pZC5oYXJkd2FyZS5DYW1lcmEpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPVNodXR0ZXJDYWxsYmFjayApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9oYXJkd2FyZS9DYW1lcmE7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5oYXJkd2FyZS5DYW1lcmEkU2h1dHRlckNhbGxiYWNrIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uU2h1dHRlcigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvaGFyZHdhcmUvQ2FtZXJhOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEgbmFtZSA9U2l6ZSApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5oYXJkd2FyZS5DYW1lcmEkU2l6ZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGludCBoZWlnaHQKLQotZmluYWwgYW5kcm9pZC5oYXJkd2FyZS5DYW1lcmEgdGhpcyQwCi0KLXB1YmxpYyBpbnQgd2lkdGgKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmhhcmR3YXJlLkNhbWVyYQotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9oYXJkd2FyZS9DYW1lcmEkMTtMYW5kcm9pZC9oYXJkd2FyZS9DYW1lcmEkUGFyYW1ldGVycztMYW5kcm9pZC9oYXJkd2FyZS9DYW1lcmEkU2l6ZTtMYW5kcm9pZC9oYXJkd2FyZS9DYW1lcmEkRXJyb3JDYWxsYmFjaztMYW5kcm9pZC9oYXJkd2FyZS9DYW1lcmEkUGljdHVyZUNhbGxiYWNrO0xhbmRyb2lkL2hhcmR3YXJlL0NhbWVyYSRTaHV0dGVyQ2FsbGJhY2s7TGFuZHJvaWQvaGFyZHdhcmUvQ2FtZXJhJEF1dG9Gb2N1c0NhbGxiYWNrO0xhbmRyb2lkL2hhcmR3YXJlL0NhbWVyYSRFdmVudEhhbmRsZXI7TGFuZHJvaWQvaGFyZHdhcmUvQ2FtZXJhJFByZXZpZXdDYWxsYmFjazsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQuaGFyZHdhcmUuQ2FtZXJhIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVVUT0ZPQ1VTX0NBTExCQUNLCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBTUVSQV9FUlJPUl9TRVJWRVJfRElFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQU1FUkFfRVJST1JfVU5LTk9XTgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfQ0FMTEJBQ0sKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEpQRUdfUElDVFVSRV9DQUxMQkFDSwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFJFVklFV19DQUxMQkFDSwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkFXX1BJQ1RVUkVfQ0FMTEJBQ0sKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNIVVRURVJfQ0FMTEJBQ0sKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLQotcHJpdmF0ZSBhbmRyb2lkLmhhcmR3YXJlLkNhbWVyYSRBdXRvRm9jdXNDYWxsYmFjayBtQXV0b0ZvY3VzQ2FsbGJhY2sKLQotcHJpdmF0ZSBhbmRyb2lkLmhhcmR3YXJlLkNhbWVyYSRFcnJvckNhbGxiYWNrIG1FcnJvckNhbGxiYWNrCi0KLXByaXZhdGUgYW5kcm9pZC5oYXJkd2FyZS5DYW1lcmEkRXZlbnRIYW5kbGVyIG1FdmVudEhhbmRsZXIKLQotcHJpdmF0ZSBhbmRyb2lkLmhhcmR3YXJlLkNhbWVyYSRQaWN0dXJlQ2FsbGJhY2sgbUpwZWdDYWxsYmFjawotCi1wcml2YXRlIGludCBtTGlzdGVuZXJDb250ZXh0Ci0KLXByaXZhdGUgaW50IG1OYXRpdmVDb250ZXh0Ci0KLXByaXZhdGUgYW5kcm9pZC5oYXJkd2FyZS5DYW1lcmEkUHJldmlld0NhbGxiYWNrIG1QcmV2aWV3Q2FsbGJhY2sKLQotcHJpdmF0ZSBhbmRyb2lkLmhhcmR3YXJlLkNhbWVyYSRQaWN0dXJlQ2FsbGJhY2sgbVJhd0ltYWdlQ2FsbGJhY2sKLQotcHJpdmF0ZSBhbmRyb2lkLmhhcmR3YXJlLkNhbWVyYSRTaHV0dGVyQ2FsbGJhY2sgbVNodXR0ZXJDYWxsYmFjawotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXN0YXRpYyBhbmRyb2lkLmhhcmR3YXJlLkNhbWVyYSRTaHV0dGVyQ2FsbGJhY2sgYWNjZXNzJDAwMCgKLWFuZHJvaWQuaGFyZHdhcmUuQ2FtZXJhKQotCi1zdGF0aWMgYW5kcm9pZC5oYXJkd2FyZS5DYW1lcmEkUGljdHVyZUNhbGxiYWNrIGFjY2VzcyQxMDAoCi1hbmRyb2lkLmhhcmR3YXJlLkNhbWVyYSkKLQotc3RhdGljIGFuZHJvaWQuaGFyZHdhcmUuQ2FtZXJhJFBpY3R1cmVDYWxsYmFjayBhY2Nlc3MkMjAwKAotYW5kcm9pZC5oYXJkd2FyZS5DYW1lcmEpCi0KLXN0YXRpYyBhbmRyb2lkLmhhcmR3YXJlLkNhbWVyYSRQcmV2aWV3Q2FsbGJhY2sgYWNjZXNzJDMwMCgKLWFuZHJvaWQuaGFyZHdhcmUuQ2FtZXJhKQotCi1zdGF0aWMgYW5kcm9pZC5oYXJkd2FyZS5DYW1lcmEkQXV0b0ZvY3VzQ2FsbGJhY2sgYWNjZXNzJDQwMCgKLWFuZHJvaWQuaGFyZHdhcmUuQ2FtZXJhKQotCi1zdGF0aWMgYW5kcm9pZC5oYXJkd2FyZS5DYW1lcmEkRXJyb3JDYWxsYmFjayBhY2Nlc3MkNTAwKAotYW5kcm9pZC5oYXJkd2FyZS5DYW1lcmEpCi0KLXByaXZhdGUgZmluYWwgbmF0aXZlIHZvaWQgbmF0aXZlX2F1dG9Gb2N1cygpCi0KLXByaXZhdGUgZmluYWwgbmF0aXZlIGphdmEubGFuZy5TdHJpbmcgbmF0aXZlX2dldFBhcmFtZXRlcnMoKQotCi1wcml2YXRlIGZpbmFsIG5hdGl2ZSB2b2lkIG5hdGl2ZV9yZWxlYXNlKCkKLQotcHJpdmF0ZSBmaW5hbCBuYXRpdmUgdm9pZCBuYXRpdmVfc2V0UGFyYW1ldGVycygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgZmluYWwgbmF0aXZlIHZvaWQgbmF0aXZlX3NldHVwKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHJpdmF0ZSBmaW5hbCBuYXRpdmUgdm9pZCBuYXRpdmVfdGFrZVBpY3R1cmUoKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuaGFyZHdhcmUuQ2FtZXJhIG9wZW4oKQotCi1wcml2YXRlIHN0YXRpYyB2b2lkIHBvc3RFdmVudEZyb21OYXRpdmUoCi1qYXZhLmxhbmcuT2JqZWN0Ci1pbnQKLWludAotaW50Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wcml2YXRlIGZpbmFsIG5hdGl2ZSB2b2lkIHNldEhhc1ByZXZpZXdDYWxsYmFjaygKLWJvb2xlYW4pCi0KLXByaXZhdGUgZmluYWwgbmF0aXZlIHZvaWQgc2V0UHJldmlld0Rpc3BsYXkoCi1hbmRyb2lkLnZpZXcuU3VyZmFjZSkKLQotcHVibGljIGZpbmFsIHZvaWQgYXV0b0ZvY3VzKAotYW5kcm9pZC5oYXJkd2FyZS5DYW1lcmEkQXV0b0ZvY3VzQ2FsbGJhY2spCi0KLXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkKLQotcHVibGljIGFuZHJvaWQuaGFyZHdhcmUuQ2FtZXJhJFBhcmFtZXRlcnMgZ2V0UGFyYW1ldGVycygpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHJlbGVhc2UoKQotCi1wdWJsaWMgZmluYWwgdm9pZCBzZXRFcnJvckNhbGxiYWNrKAotYW5kcm9pZC5oYXJkd2FyZS5DYW1lcmEkRXJyb3JDYWxsYmFjaykKLQotcHVibGljIHZvaWQgc2V0UGFyYW1ldGVycygKLWFuZHJvaWQuaGFyZHdhcmUuQ2FtZXJhJFBhcmFtZXRlcnMpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHNldFByZXZpZXdDYWxsYmFjaygKLWFuZHJvaWQuaGFyZHdhcmUuQ2FtZXJhJFByZXZpZXdDYWxsYmFjaykKLQotcHVibGljIGZpbmFsIHZvaWQgc2V0UHJldmlld0Rpc3BsYXkoCi1hbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlcikKLQotcHVibGljIGZpbmFsIG5hdGl2ZSB2b2lkIHN0YXJ0UHJldmlldygpCi0KLXB1YmxpYyBmaW5hbCBuYXRpdmUgdm9pZCBzdG9wUHJldmlldygpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHRha2VQaWN0dXJlKAotYW5kcm9pZC5oYXJkd2FyZS5DYW1lcmEkU2h1dHRlckNhbGxiYWNrCi1hbmRyb2lkLmhhcmR3YXJlLkNhbWVyYSRQaWN0dXJlQ2FsbGJhY2sKLWFuZHJvaWQuaGFyZHdhcmUuQ2FtZXJhJFBpY3R1cmVDYWxsYmFjaykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL2hhcmR3YXJlL0lTZW5zb3JTZXJ2aWNlJFN0dWI7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5oYXJkd2FyZS5JU2Vuc29yU2VydmljZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLklJbnRlcmZhY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZW5hYmxlU2Vuc29yKAotYW5kcm9pZC5vcy5JQmluZGVyCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yIGdldERhdGFDaGFuZWwoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgcmVwb3J0QWNjdXJhY3koCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPVByb3h5ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2hhcmR3YXJlL0lTZW5zb3JTZXJ2aWNlJFN0dWI7ICkKLSBjbGFzcyBhbmRyb2lkLmhhcmR3YXJlLklTZW5zb3JTZXJ2aWNlJFN0dWIkUHJveHkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5oYXJkd2FyZS5JU2Vuc29yU2VydmljZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGFuZHJvaWQub3MuSUJpbmRlciBtUmVtb3RlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIGVuYWJsZVNlbnNvcigKLWFuZHJvaWQub3MuSUJpbmRlcgotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciBnZXREYXRhQ2hhbmVsKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCByZXBvcnRBY2N1cmFjeSgKLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAzMyBuYW1lID1TdHViICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvaGFyZHdhcmUvSVNlbnNvclNlcnZpY2UkU3R1YiRQcm94eTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvaGFyZHdhcmUvSVNlbnNvclNlcnZpY2U7ICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBhbmRyb2lkLmhhcmR3YXJlLklTZW5zb3JTZXJ2aWNlJFN0dWIgZXh0ZW5kcyBhbmRyb2lkLm9zLkJpbmRlciBpbXBsZW1lbnRzIGFuZHJvaWQuaGFyZHdhcmUuSVNlbnNvclNlcnZpY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERVNDUklQVE9SCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZW5hYmxlU2Vuc29yCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZ2V0RGF0YUNoYW5lbAotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3JlcG9ydEFjY3VyYWN5Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmhhcmR3YXJlLklTZW5zb3JTZXJ2aWNlIGFzSW50ZXJmYWNlKAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIG9uVHJhbnNhY3QoCi1pbnQKLWFuZHJvaWQub3MuUGFyY2VsCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvckxpc3RlbmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uQWNjdXJhY3lDaGFuZ2VkKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uU2Vuc29yQ2hhbmdlZCgKLWludAotZmxvYXRbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTQxMDQgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9oYXJkd2FyZS9TZW5zb3JNYW5hZ2VyOyApCi0gY2xhc3MgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3JNYW5hZ2VyJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9oYXJkd2FyZS9TZW5zb3JNYW5hZ2VyJExpc3RlbmVyRGVsZWdhdGU7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLSBjbGFzcyBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvck1hbmFnZXIkTGlzdGVuZXJEZWxlZ2F0ZSQxIGV4dGVuZHMgYW5kcm9pZC5vcy5IYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQuaGFyZHdhcmUuU2Vuc29yTWFuYWdlciRMaXN0ZW5lckRlbGVnYXRlIHRoaXMkMQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQuaGFyZHdhcmUuU2Vuc29yTWFuYWdlciRMaXN0ZW5lckRlbGVnYXRlCi1hbmRyb2lkLm9zLkxvb3BlcikKLQotcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZSgKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTIgbmFtZSA9TGlzdGVuZXJEZWxlZ2F0ZSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9oYXJkd2FyZS9TZW5zb3JNYW5hZ2VyOyApCi0gY2xhc3MgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3JNYW5hZ2VyJExpc3RlbmVyRGVsZWdhdGUgZXh0ZW5kcyBhbmRyb2lkLm9zLkJpbmRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQub3MuSGFuZGxlciBtSGFuZGxlcgotCi1wcml2YXRlIGFuZHJvaWQuaGFyZHdhcmUuU2Vuc29yTGlzdGVuZXIgbUxpc3RlbmVyCi0KLXByaXZhdGUgaW50IG1TZW5zb3JzCi0KLXByaXZhdGUgZmxvYXRbXSBtVmFsdWVzUG9vbAotCi1maW5hbCBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvck1hbmFnZXIgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3JNYW5hZ2VyCi1hbmRyb2lkLmhhcmR3YXJlLlNlbnNvckxpc3RlbmVyCi1pbnQpCi0KLXN0YXRpYyBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvckxpc3RlbmVyIGFjY2VzcyQxMDAwKAotYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3JNYW5hZ2VyJExpc3RlbmVyRGVsZWdhdGUpCi0KLXN0YXRpYyBmbG9hdFtdIGFjY2VzcyQxMTAwKAotYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3JNYW5hZ2VyJExpc3RlbmVyRGVsZWdhdGUpCi0KLXN0YXRpYyBmbG9hdFtdIGFjY2VzcyQxMTAyKAotYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3JNYW5hZ2VyJExpc3RlbmVyRGVsZWdhdGUKLWZsb2F0W10pCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDMwMCgKLWFuZHJvaWQuaGFyZHdhcmUuU2Vuc29yTWFuYWdlciRMaXN0ZW5lckRlbGVnYXRlKQotCi0gaW50IGFkZFNlbnNvcnMoCi1pbnQpCi0KLSBib29sZWFuIGhhc1NlbnNvcigKLWludCkKLQotIHZvaWQgb25TZW5zb3JDaGFuZ2VkKAotaW50Ci1mbG9hdFtdCi1pbnQpCi0KLSBpbnQgcmVtb3ZlU2Vuc29ycygKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9oYXJkd2FyZS9TZW5zb3JNYW5hZ2VyJFNlbnNvclRocmVhZDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPVNlbnNvclRocmVhZFJ1bm5hYmxlICkKLSBjbGFzcyBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvck1hbmFnZXIkU2Vuc29yVGhyZWFkJFNlbnNvclRocmVhZFJ1bm5hYmxlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5SdW5uYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGJ5dGVbXSBtQWNjdXJhY2llcwotCi1wcml2YXRlIGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IgbVNlbnNvckRhdGFGZAotCi1wcml2YXRlIGFuZHJvaWQuaGFyZHdhcmUuSVNlbnNvclNlcnZpY2UgbVNlbnNvclNlcnZpY2UKLQotZmluYWwgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3JNYW5hZ2VyJFNlbnNvclRocmVhZCB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmhhcmR3YXJlLlNlbnNvck1hbmFnZXIkU2Vuc29yVGhyZWFkCi1hbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yCi1hbmRyb2lkLmhhcmR3YXJlLklTZW5zb3JTZXJ2aWNlKQotCi1wdWJsaWMgdm9pZCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2hhcmR3YXJlL1NlbnNvck1hbmFnZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9U2Vuc29yVGhyZWFkICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvaGFyZHdhcmUvU2Vuc29yTWFuYWdlciRTZW5zb3JUaHJlYWQkU2Vuc29yVGhyZWFkUnVubmFibGU7ICkKLSBjbGFzcyBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvck1hbmFnZXIkU2Vuc29yVGhyZWFkIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEubGFuZy5UaHJlYWQgbVRocmVhZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmhhcmR3YXJlLlNlbnNvck1hbmFnZXIkMSkKLQotc3RhdGljIGphdmEubGFuZy5UaHJlYWQgYWNjZXNzJDYwMigKLWFuZHJvaWQuaGFyZHdhcmUuU2Vuc29yTWFuYWdlciRTZW5zb3JUaHJlYWQKLWphdmEubGFuZy5UaHJlYWQpCi0KLSB2b2lkIHN0YXJ0TG9ja2VkKAotYW5kcm9pZC5oYXJkd2FyZS5JU2Vuc29yU2VydmljZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3ZpZXcvSVJvdGF0aW9uV2F0Y2hlciRTdHViOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQudmlldy5JUm90YXRpb25XYXRjaGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuSUludGVyZmFjZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvblJvdGF0aW9uQ2hhbmdlZCgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC92aWV3L0lSb3RhdGlvbldhdGNoZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9JUm90YXRpb25XYXRjaGVyJFN0dWIkUHJveHk7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAzMyBuYW1lID1TdHViICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBhbmRyb2lkLnZpZXcuSVJvdGF0aW9uV2F0Y2hlciRTdHViIGV4dGVuZHMgYW5kcm9pZC5vcy5CaW5kZXIgaW1wbGVtZW50cyBhbmRyb2lkLnZpZXcuSVJvdGF0aW9uV2F0Y2hlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFU0NSSVBUT1IKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9vblJvdGF0aW9uQ2hhbmdlZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC52aWV3LklSb3RhdGlvbldhdGNoZXIgYXNJbnRlcmZhY2UoCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gb25UcmFuc2FjdCgKLWludAotYW5kcm9pZC5vcy5QYXJjZWwKLWFuZHJvaWQub3MuUGFyY2VsCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9oYXJkd2FyZS9TZW5zb3JNYW5hZ2VyJDE7TGFuZHJvaWQvaGFyZHdhcmUvU2Vuc29yTWFuYWdlciRMaXN0ZW5lckRlbGVnYXRlO0xhbmRyb2lkL2hhcmR3YXJlL1NlbnNvck1hbmFnZXIkU2Vuc29yVGhyZWFkOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3JNYW5hZ2VyIGV4dGVuZHMgYW5kcm9pZC52aWV3LklSb3RhdGlvbldhdGNoZXIkU3R1YgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBEQVRBX1gKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREFUQV9ZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERBVEFfWgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGZsb2F0IEdSQVZJVFlfREVBVEhfU1RBUl9JCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgZmxvYXQgR1JBVklUWV9FQVJUSAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGZsb2F0IEdSQVZJVFlfSlVQSVRFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGZsb2F0IEdSQVZJVFlfTUFSUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGZsb2F0IEdSQVZJVFlfTUVSQ1VSWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGZsb2F0IEdSQVZJVFlfTU9PTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGZsb2F0IEdSQVZJVFlfTkVQVFVOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgZmxvYXQgR1JBVklUWV9QTFVUTwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGZsb2F0IEdSQVZJVFlfU0FUVVJOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgZmxvYXQgR1JBVklUWV9TVU4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBmbG9hdCBHUkFWSVRZX1RIRV9JU0xBTkQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBmbG9hdCBHUkFWSVRZX1VSQU5VUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGZsb2F0IEdSQVZJVFlfVkVOVVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBmbG9hdCBMSUdIVF9DTE9VRFkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBmbG9hdCBMSUdIVF9GVUxMTU9PTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGZsb2F0IExJR0hUX05PX01PT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBmbG9hdCBMSUdIVF9PVkVSQ0FTVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGZsb2F0IExJR0hUX1NIQURFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgZmxvYXQgTElHSFRfU1VOTElHSFQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBmbG9hdCBMSUdIVF9TVU5MSUdIVF9NQVgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBmbG9hdCBMSUdIVF9TVU5SSVNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgZmxvYXQgTUFHTkVUSUNfRklFTERfRUFSVEhfTUFYCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgZmxvYXQgTUFHTkVUSUNfRklFTERfRUFSVEhfTUlOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJBV19EQVRBX0lOREVYCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJBV19EQVRBX1gKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkFXX0RBVEFfWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSQVdfREFUQV9aCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFTlNPUl9BQ0NFTEVST01FVEVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFTlNPUl9BTEwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VOU09SX0RFTEFZX0ZBU1RFU1QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VOU09SX0RFTEFZX0dBTUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VOU09SX0RFTEFZX05PUk1BTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRU5TT1JfREVMQVlfVUkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFTlNPUl9ESVNBQkxFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFTlNPUl9MSUdIVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRU5TT1JfTUFHTkVUSUNfRklFTEQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VOU09SX01BWAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRU5TT1JfTUlOCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRU5TT1JfT1JERVJfTUFTSwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRU5TT1JfT1JJRU5UQVRJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VOU09SX09SSUVOVEFUSU9OX1JBVwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRU5TT1JfUFJPWElNSVRZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFTlNPUl9TVEFUVVNfQUNDVVJBQ1lfSElHSAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRU5TT1JfU1RBVFVTX0FDQ1VSQUNZX0xPVwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRU5TT1JfU1RBVFVTX0FDQ1VSQUNZX01FRElVTQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VOU09SX1NUQVRVU19TSElGVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRU5TT1JfU1RBVFVTX1VOUkVMSUFCTEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VOU09SX1RFTVBFUkFUVVJFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFTlNPUl9UUklDT1JERVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBmbG9hdCBTVEFOREFSRF9HUkFWSVRZCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEFHCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9BcnJheUxpc3Q8TGFuZHJvaWQvaGFyZHdhcmUvU2Vuc29yTWFuYWdlciRMaXN0ZW5lckRlbGVnYXRlOz47ICkKLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEudXRpbC5BcnJheUxpc3Qgc0xpc3RlbmVycwotCi1wcml2YXRlIHN0YXRpYyBpbnQgc1JvdGF0aW9uCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGFuZHJvaWQuaGFyZHdhcmUuU2Vuc29yTWFuYWdlciRTZW5zb3JUaHJlYWQgc1NlbnNvclRocmVhZAotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLnZpZXcuSVdpbmRvd01hbmFnZXIgc1dpbmRvd01hbmFnZXIKLQotcHJpdmF0ZSBhbmRyb2lkLm9zLkxvb3BlciBtTG9vcGVyCi0KLXByaXZhdGUgYW5kcm9pZC5oYXJkd2FyZS5JU2Vuc29yU2VydmljZSBtU2Vuc29yU2VydmljZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5Mb29wZXIpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgX3NlbnNvcnNfZGF0YV9jbG9zZSgpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgX3NlbnNvcnNfZGF0YV9nZXRfc2Vuc29ycygpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgX3NlbnNvcnNfZGF0YV9vcGVuKAotamF2YS5pby5GaWxlRGVzY3JpcHRvcikKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBfc2Vuc29yc19kYXRhX3BvbGwoCi1mbG9hdFtdCi1pbnQpCi0KLXN0YXRpYyBqYXZhLnV0aWwuQXJyYXlMaXN0IGFjY2VzcyQxMDAoKQotCi1zdGF0aWMgaW50IGFjY2VzcyQyMDAoCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yKQotCi1zdGF0aWMgaW50IGFjY2VzcyQ0MDAoCi1mbG9hdFtdCi1pbnQpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDUwMCgpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDcwMCgpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQ4MDAoCi1pbnQKLWZsb2F0W10KLWludCkKLQotc3RhdGljIGFuZHJvaWQub3MuTG9vcGVyIGFjY2VzcyQ5MDAoCi1hbmRyb2lkLmhhcmR3YXJlLlNlbnNvck1hbmFnZXIpCi0KLXByaXZhdGUgc3RhdGljIGludCBnZXRSb3RhdGlvbigpCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgbWFwU2Vuc29yRGF0YVRvV2luZG93KAotaW50Ci1mbG9hdFtdCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0U2Vuc29ycygpCi0KLXB1YmxpYyB2b2lkIG9uUm90YXRpb25DaGFuZ2VkKAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiByZWdpc3Rlckxpc3RlbmVyKAotYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3JMaXN0ZW5lcgotaW50KQotCi1wdWJsaWMgYm9vbGVhbiByZWdpc3Rlckxpc3RlbmVyKAotYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3JMaXN0ZW5lcgotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIHVucmVnaXN0ZXJMaXN0ZW5lcigKLWFuZHJvaWQuaGFyZHdhcmUuU2Vuc29yTGlzdGVuZXIpCi0KLXB1YmxpYyB2b2lkIHVucmVnaXN0ZXJMaXN0ZW5lcigKLWFuZHJvaWQuaGFyZHdhcmUuU2Vuc29yTGlzdGVuZXIKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExhbmRyb2lkL2xvY2F0aW9uL0FkZHJlc3M7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvbG9jYXRpb24vQWRkcmVzczsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotZmluYWwgY2xhc3MgYW5kcm9pZC5sb2NhdGlvbi5BZGRyZXNzJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgYW5kcm9pZC5sb2NhdGlvbi5BZGRyZXNzIGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgYW5kcm9pZC5sb2NhdGlvbi5BZGRyZXNzW10gbmV3QXJyYXkoCi1pbnQpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0W10gbmV3QXJyYXkoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5sb2NhdGlvbi5BZGRyZXNzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC9sb2NhdGlvbi9BZGRyZXNzOz47ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IgQ1JFQVRPUgotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaE1hcDxMamF2YS9sYW5nL0ludGVnZXI7TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuSGFzaE1hcCBtQWRkcmVzc0xpbmVzCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtQWRtaW5BcmVhCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtQ291bnRyeUNvZGUKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1Db3VudHJ5TmFtZQotCi1wcml2YXRlIGFuZHJvaWQub3MuQnVuZGxlIG1FeHRyYXMKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1GZWF0dXJlTmFtZQotCi1wcml2YXRlIGJvb2xlYW4gbUhhc0xhdGl0dWRlCi0KLXByaXZhdGUgYm9vbGVhbiBtSGFzTG9uZ2l0dWRlCi0KLXByaXZhdGUgZG91YmxlIG1MYXRpdHVkZQotCi1wcml2YXRlIGphdmEudXRpbC5Mb2NhbGUgbUxvY2FsZQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbUxvY2FsaXR5Ci0KLXByaXZhdGUgZG91YmxlIG1Mb25naXR1ZGUKLQotcHJpdmF0ZSBpbnQgbU1heEFkZHJlc3NMaW5lSW5kZXgKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1QaG9uZQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbVBvc3RhbENvZGUKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1TdWJBZG1pbkFyZWEKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1UaG9yb3VnaGZhcmUKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1VcmwKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEudXRpbC5Mb2NhbGUpCi0KLXN0YXRpYyBqYXZhLnV0aWwuSGFzaE1hcCBhY2Nlc3MkMDAwKAotYW5kcm9pZC5sb2NhdGlvbi5BZGRyZXNzKQotCi1zdGF0aWMgamF2YS51dGlsLkhhc2hNYXAgYWNjZXNzJDAwMigKLWFuZHJvaWQubG9jYXRpb24uQWRkcmVzcwotamF2YS51dGlsLkhhc2hNYXApCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDEwMCgKLWFuZHJvaWQubG9jYXRpb24uQWRkcmVzcykKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDEwMDAoCi1hbmRyb2lkLmxvY2F0aW9uLkFkZHJlc3MpCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQxMDAyKAotYW5kcm9pZC5sb2NhdGlvbi5BZGRyZXNzCi1ib29sZWFuKQotCi1zdGF0aWMgaW50IGFjY2VzcyQxMDIoCi1hbmRyb2lkLmxvY2F0aW9uLkFkZHJlc3MKLWludCkKLQotc3RhdGljIGRvdWJsZSBhY2Nlc3MkMTEwMigKLWFuZHJvaWQubG9jYXRpb24uQWRkcmVzcwotZG91YmxlKQotCi1zdGF0aWMgYm9vbGVhbiBhY2Nlc3MkMTIwMCgKLWFuZHJvaWQubG9jYXRpb24uQWRkcmVzcykKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDEyMDIoCi1hbmRyb2lkLmxvY2F0aW9uLkFkZHJlc3MKLWJvb2xlYW4pCi0KLXN0YXRpYyBkb3VibGUgYWNjZXNzJDEzMDIoCi1hbmRyb2lkLmxvY2F0aW9uLkFkZHJlc3MKLWRvdWJsZSkKLQotc3RhdGljIGphdmEubGFuZy5TdHJpbmcgYWNjZXNzJDE0MDIoCi1hbmRyb2lkLmxvY2F0aW9uLkFkZHJlc3MKLWphdmEubGFuZy5TdHJpbmcpCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGFjY2VzcyQxNTAyKAotYW5kcm9pZC5sb2NhdGlvbi5BZGRyZXNzCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1zdGF0aWMgYW5kcm9pZC5vcy5CdW5kbGUgYWNjZXNzJDE2MDIoCi1hbmRyb2lkLmxvY2F0aW9uLkFkZHJlc3MKLWFuZHJvaWQub3MuQnVuZGxlKQotCi1zdGF0aWMgamF2YS5sYW5nLlN0cmluZyBhY2Nlc3MkMjAyKAotYW5kcm9pZC5sb2NhdGlvbi5BZGRyZXNzCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1zdGF0aWMgamF2YS5sYW5nLlN0cmluZyBhY2Nlc3MkMzAyKAotYW5kcm9pZC5sb2NhdGlvbi5BZGRyZXNzCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1zdGF0aWMgamF2YS5sYW5nLlN0cmluZyBhY2Nlc3MkNDAyKAotYW5kcm9pZC5sb2NhdGlvbi5BZGRyZXNzCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1zdGF0aWMgamF2YS5sYW5nLlN0cmluZyBhY2Nlc3MkNTAyKAotYW5kcm9pZC5sb2NhdGlvbi5BZGRyZXNzCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1zdGF0aWMgamF2YS5sYW5nLlN0cmluZyBhY2Nlc3MkNjAyKAotYW5kcm9pZC5sb2NhdGlvbi5BZGRyZXNzCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1zdGF0aWMgamF2YS5sYW5nLlN0cmluZyBhY2Nlc3MkNzAyKAotYW5kcm9pZC5sb2NhdGlvbi5BZGRyZXNzCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1zdGF0aWMgamF2YS5sYW5nLlN0cmluZyBhY2Nlc3MkODAyKAotYW5kcm9pZC5sb2NhdGlvbi5BZGRyZXNzCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1zdGF0aWMgamF2YS5sYW5nLlN0cmluZyBhY2Nlc3MkOTAyKAotYW5kcm9pZC5sb2NhdGlvbi5BZGRyZXNzCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBjbGVhckxhdGl0dWRlKCkKLQotcHVibGljIHZvaWQgY2xlYXJMb25naXR1ZGUoKQotCi1wdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRBZGRyZXNzTGluZSgKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QWRtaW5BcmVhKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Q291bnRyeUNvZGUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRDb3VudHJ5TmFtZSgpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLkJ1bmRsZSBnZXRFeHRyYXMoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRGZWF0dXJlTmFtZSgpCi0KLXB1YmxpYyBkb3VibGUgZ2V0TGF0aXR1ZGUoKQotCi1wdWJsaWMgamF2YS51dGlsLkxvY2FsZSBnZXRMb2NhbGUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRMb2NhbGl0eSgpCi0KLXB1YmxpYyBkb3VibGUgZ2V0TG9uZ2l0dWRlKCkKLQotcHVibGljIGludCBnZXRNYXhBZGRyZXNzTGluZUluZGV4KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UGhvbmUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRQb3N0YWxDb2RlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3ViQWRtaW5BcmVhKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VGhvcm91Z2hmYXJlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VXJsKCkKLQotcHVibGljIGJvb2xlYW4gaGFzTGF0aXR1ZGUoKQotCi1wdWJsaWMgYm9vbGVhbiBoYXNMb25naXR1ZGUoKQotCi1wdWJsaWMgdm9pZCBzZXRBZGRyZXNzTGluZSgKLWludAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0QWRtaW5BcmVhKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0Q291bnRyeUNvZGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRDb3VudHJ5TmFtZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHNldEV4dHJhcygKLWFuZHJvaWQub3MuQnVuZGxlKQotCi1wdWJsaWMgdm9pZCBzZXRGZWF0dXJlTmFtZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHNldExhdGl0dWRlKAotZG91YmxlKQotCi1wdWJsaWMgdm9pZCBzZXRMb2NhbGl0eSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHNldExvbmdpdHVkZSgKLWRvdWJsZSkKLQotcHVibGljIHZvaWQgc2V0UGhvbmUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRQb3N0YWxDb2RlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0U3ViQWRtaW5BcmVhKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0VGhvcm91Z2hmYXJlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0VXJsKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1wdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9sb2NhdGlvbi9Dcml0ZXJpYTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC9sb2NhdGlvbi9Dcml0ZXJpYTs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1maW5hbCBjbGFzcyBhbmRyb2lkLmxvY2F0aW9uLkNyaXRlcmlhJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgYW5kcm9pZC5sb2NhdGlvbi5Dcml0ZXJpYSBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIGFuZHJvaWQubG9jYXRpb24uQ3JpdGVyaWFbXSBuZXdBcnJheSgKLWludCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3RbXSBuZXdBcnJheSgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLmxvY2F0aW9uLkNyaXRlcmlhIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ0NVUkFDWV9DT0FSU0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNDVVJBQ1lfRklORQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC9sb2NhdGlvbi9Dcml0ZXJpYTs+OyApCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yIENSRUFUT1IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9fUkVRVUlSRU1FTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUE9XRVJfSElHSAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1dFUl9MT1cKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUE9XRVJfTUVESVVNCi0KLXByaXZhdGUgaW50IG1BY2N1cmFjeQotCi1wcml2YXRlIGJvb2xlYW4gbUFsdGl0dWRlUmVxdWlyZWQKLQotcHJpdmF0ZSBib29sZWFuIG1CZWFyaW5nUmVxdWlyZWQKLQotcHJpdmF0ZSBib29sZWFuIG1Db3N0QWxsb3dlZAotCi1wcml2YXRlIGludCBtUG93ZXJSZXF1aXJlbWVudAotCi1wcml2YXRlIGJvb2xlYW4gbVNwZWVkUmVxdWlyZWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQubG9jYXRpb24uQ3JpdGVyaWEpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDAwMigKLWFuZHJvaWQubG9jYXRpb24uQ3JpdGVyaWEKLWludCkKLQotc3RhdGljIGludCBhY2Nlc3MkMTAyKAotYW5kcm9pZC5sb2NhdGlvbi5Dcml0ZXJpYQotaW50KQotCi1zdGF0aWMgYm9vbGVhbiBhY2Nlc3MkMjAyKAotYW5kcm9pZC5sb2NhdGlvbi5Dcml0ZXJpYQotYm9vbGVhbikKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDMwMigKLWFuZHJvaWQubG9jYXRpb24uQ3JpdGVyaWEKLWJvb2xlYW4pCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQ0MDIoCi1hbmRyb2lkLmxvY2F0aW9uLkNyaXRlcmlhCi1ib29sZWFuKQotCi1zdGF0aWMgYm9vbGVhbiBhY2Nlc3MkNTAyKAotYW5kcm9pZC5sb2NhdGlvbi5Dcml0ZXJpYQotYm9vbGVhbikKLQotcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkKLQotcHVibGljIGludCBnZXRBY2N1cmFjeSgpCi0KLXB1YmxpYyBpbnQgZ2V0UG93ZXJSZXF1aXJlbWVudCgpCi0KLXB1YmxpYyBib29sZWFuIGlzQWx0aXR1ZGVSZXF1aXJlZCgpCi0KLXB1YmxpYyBib29sZWFuIGlzQmVhcmluZ1JlcXVpcmVkKCkKLQotcHVibGljIGJvb2xlYW4gaXNDb3N0QWxsb3dlZCgpCi0KLXB1YmxpYyBib29sZWFuIGlzU3BlZWRSZXF1aXJlZCgpCi0KLXB1YmxpYyB2b2lkIHNldEFjY3VyYWN5KAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRBbHRpdHVkZVJlcXVpcmVkKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0QmVhcmluZ1JlcXVpcmVkKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0Q29zdEFsbG93ZWQoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRQb3dlclJlcXVpcmVtZW50KAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRTcGVlZFJlcXVpcmVkKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvblByb3ZpZGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVkFJTEFCTEUKLQotc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQkFEX0NIQVJTX1JFR0VYCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9VVF9PRl9TRVJWSUNFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEFHCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRFTVBPUkFSSUxZX1VOQVZBSUxBQkxFCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtTmFtZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0QWNjdXJhY3koKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXROYW1lKCkKLQotcHVibGljIGFic3RyYWN0IGludCBnZXRQb3dlclJlcXVpcmVtZW50KCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaGFzTW9uZXRhcnlDb3N0KCkKLQotcHVibGljIGJvb2xlYW4gbWVldHNDcml0ZXJpYSgKLWFuZHJvaWQubG9jYXRpb24uQ3JpdGVyaWEpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHJlcXVpcmVzQ2VsbCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHJlcXVpcmVzTmV0d29yaygpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHJlcXVpcmVzU2F0ZWxsaXRlKCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gc3VwcG9ydHNBbHRpdHVkZSgpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHN1cHBvcnRzQmVhcmluZygpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHN1cHBvcnRzU3BlZWQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotIGNsYXNzIGFuZHJvaWQubG9jYXRpb24uRHVtbXlMb2NhdGlvblByb3ZpZGVyIGV4dGVuZHMgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvblByb3ZpZGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEFHCi0KLSBpbnQgbUFjY3VyYWN5Ci0KLSBib29sZWFuIG1IYXNNb25ldGFyeUNvc3QKLQotIGphdmEubGFuZy5TdHJpbmcgbU5hbWUKLQotIGludCBtUG93ZXJSZXF1aXJlbWVudAotCi0gYm9vbGVhbiBtUmVxdWlyZXNDZWxsCi0KLSBib29sZWFuIG1SZXF1aXJlc05ldHdvcmsKLQotIGJvb2xlYW4gbVJlcXVpcmVzU2F0ZWxsaXRlCi0KLSBib29sZWFuIG1TdXBwb3J0c0FsdGl0dWRlCi0KLSBib29sZWFuIG1TdXBwb3J0c0JlYXJpbmcKLQotIGJvb2xlYW4gbVN1cHBvcnRzU3BlZWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgaW50IGdldEFjY3VyYWN5KCkKLQotcHVibGljIGludCBnZXRQb3dlclJlcXVpcmVtZW50KCkKLQotcHVibGljIGJvb2xlYW4gaGFzTW9uZXRhcnlDb3N0KCkKLQotcHVibGljIGJvb2xlYW4gcmVxdWlyZXNDZWxsKCkKLQotcHVibGljIGJvb2xlYW4gcmVxdWlyZXNOZXR3b3JrKCkKLQotcHVibGljIGJvb2xlYW4gcmVxdWlyZXNTYXRlbGxpdGUoKQotCi1wdWJsaWMgdm9pZCBzZXRBY2N1cmFjeSgKLWludCkKLQotcHVibGljIHZvaWQgc2V0SGFzTW9uZXRhcnlDb3N0KAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0UG93ZXJSZXF1aXJlbWVudCgKLWludCkKLQotcHVibGljIHZvaWQgc2V0UmVxdWlyZXNDZWxsKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0UmVxdWlyZXNOZXR3b3JrKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0UmVxdWlyZXNTYXRlbGxpdGUoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRTdXBwb3J0c0FsdGl0dWRlKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0U3VwcG9ydHNCZWFyaW5nKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0U3VwcG9ydHNTcGVlZCgKLWJvb2xlYW4pCi0KLXB1YmxpYyBib29sZWFuIHN1cHBvcnRzQWx0aXR1ZGUoKQotCi1wdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0JlYXJpbmcoKQotCi1wdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1NwZWVkKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLmxvY2F0aW9uLkdlb2NvZGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRBRwotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbUFwcE5hbWUKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1Db3VudHJ5Ci0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtTGFuZ3VhZ2UKLQotcHJpdmF0ZSBhbmRyb2lkLmxvY2F0aW9uLklMb2NhdGlvbk1hbmFnZXIgbVNlcnZpY2UKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1WYXJpYW50Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1qYXZhLnV0aWwuTG9jYWxlKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShEREkpTGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL2xvY2F0aW9uL0FkZHJlc3M7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0RnJvbUxvY2F0aW9uKAotZG91YmxlCi1kb3VibGUKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1N0cmluZztJKUxqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9sb2NhdGlvbi9BZGRyZXNzOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRGcm9tTG9jYXRpb25OYW1lKAotamF2YS5sYW5nLlN0cmluZwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1N0cmluZztJRERERClMamF2YS91dGlsL0xpc3Q8TGFuZHJvaWQvbG9jYXRpb24vQWRkcmVzczs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRGcm9tTG9jYXRpb25OYW1lKAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1kb3VibGUKLWRvdWJsZQotZG91YmxlCi1kb3VibGUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQubG9jYXRpb24uR3BzU3RhdHVzTGlzdGVuZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgb25GaXJzdEZpeCgKLWludCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgb25HcHNTdGFydGVkKCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgb25HcHNTdG9wcGVkKCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgb25TdlN0YXR1c0NoYW5nZWQoCi1pbnQKLWludFtdCi1mbG9hdFtdCi1mbG9hdFtdCi1mbG9hdFtdCi1pbnQKLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvbG9jYXRpb24vSUdwc1N0YXR1c0xpc3RlbmVyJFN0dWI7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5sb2NhdGlvbi5JR3BzU3RhdHVzTGlzdGVuZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5JSW50ZXJmYWNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uRmlyc3RGaXgoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvbkdwc1N0YXJ0ZWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgb25HcHNTdG9wcGVkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uU3ZTdGF0dXNDaGFuZ2VkKAotaW50Ci1pbnRbXQotZmxvYXRbXQotZmxvYXRbXQotZmxvYXRbXQotaW50Ci1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPVByb3h5ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2xvY2F0aW9uL0lHcHNTdGF0dXNMaXN0ZW5lciRTdHViOyApCi0gY2xhc3MgYW5kcm9pZC5sb2NhdGlvbi5JR3BzU3RhdHVzTGlzdGVuZXIkU3R1YiRQcm94eSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLmxvY2F0aW9uLklHcHNTdGF0dXNMaXN0ZW5lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGFuZHJvaWQub3MuSUJpbmRlciBtUmVtb3RlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBvbkZpcnN0Rml4KAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgb25HcHNTdGFydGVkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIG9uR3BzU3RvcHBlZCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBvblN2U3RhdHVzQ2hhbmdlZCgKLWludAotaW50W10KLWZsb2F0W10KLWZsb2F0W10KLWZsb2F0W10KLWludAotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvbG9jYXRpb24vSUdwc1N0YXR1c0xpc3RlbmVyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwMzMgbmFtZSA9U3R1YiApCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL2xvY2F0aW9uL0lHcHNTdGF0dXNMaXN0ZW5lciRTdHViJFByb3h5OyApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC5sb2NhdGlvbi5JR3BzU3RhdHVzTGlzdGVuZXIkU3R1YiBleHRlbmRzIGFuZHJvaWQub3MuQmluZGVyIGltcGxlbWVudHMgYW5kcm9pZC5sb2NhdGlvbi5JR3BzU3RhdHVzTGlzdGVuZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERVNDUklQVE9SCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fb25GaXJzdEZpeAotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX29uR3BzU3RhcnRlZAotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX29uR3BzU3RvcHBlZAotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX29uU3ZTdGF0dXNDaGFuZ2VkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmxvY2F0aW9uLklHcHNTdGF0dXNMaXN0ZW5lciBhc0ludGVyZmFjZSgKLWFuZHJvaWQub3MuSUJpbmRlcikKLQotcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBvblRyYW5zYWN0KAotaW50Ci1hbmRyb2lkLm9zLlBhcmNlbAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL2xvY2F0aW9uL0lMb2NhdGlvbkxpc3RlbmVyJFN0dWI7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5sb2NhdGlvbi5JTG9jYXRpb25MaXN0ZW5lciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLklJbnRlcmZhY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgb25Mb2NhdGlvbkNoYW5nZWQoCi1hbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgb25Qcm92aWRlckRpc2FibGVkKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uUHJvdmlkZXJFbmFibGVkKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uU3RhdHVzQ2hhbmdlZCgKLWphdmEubGFuZy5TdHJpbmcKLWludAotYW5kcm9pZC5vcy5CdW5kbGUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvbG9jYXRpb24vSUxvY2F0aW9uTGlzdGVuZXIkU3R1YjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1Qcm94eSApCi0gY2xhc3MgYW5kcm9pZC5sb2NhdGlvbi5JTG9jYXRpb25MaXN0ZW5lciRTdHViJFByb3h5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQubG9jYXRpb24uSUxvY2F0aW9uTGlzdGVuZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLm9zLklCaW5kZXIgbVJlbW90ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuSUJpbmRlcikKLQotcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEludGVyZmFjZURlc2NyaXB0b3IoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgb25Mb2NhdGlvbkNoYW5nZWQoCi1hbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgb25Qcm92aWRlckRpc2FibGVkKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIG9uUHJvdmlkZXJFbmFibGVkKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIG9uU3RhdHVzQ2hhbmdlZCgKLWphdmEubGFuZy5TdHJpbmcKLWludAotYW5kcm9pZC5vcy5CdW5kbGUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9sb2NhdGlvbi9JTG9jYXRpb25MaXN0ZW5lciRTdHViJFByb3h5OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwMzMgbmFtZSA9U3R1YiApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9sb2NhdGlvbi9JTG9jYXRpb25MaXN0ZW5lcjsgKQotcHVibGljIGFic3RyYWN0IGNsYXNzIGFuZHJvaWQubG9jYXRpb24uSUxvY2F0aW9uTGlzdGVuZXIkU3R1YiBleHRlbmRzIGFuZHJvaWQub3MuQmluZGVyIGltcGxlbWVudHMgYW5kcm9pZC5sb2NhdGlvbi5JTG9jYXRpb25MaXN0ZW5lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFU0NSSVBUT1IKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9vbkxvY2F0aW9uQ2hhbmdlZAotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX29uUHJvdmlkZXJEaXNhYmxlZAotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX29uUHJvdmlkZXJFbmFibGVkCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fb25TdGF0dXNDaGFuZ2VkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmxvY2F0aW9uLklMb2NhdGlvbkxpc3RlbmVyIGFzSW50ZXJmYWNlKAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIG9uVHJhbnNhY3QoCi1pbnQKLWFuZHJvaWQub3MuUGFyY2VsCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvbG9jYXRpb24vSUxvY2F0aW9uTWFuYWdlciRTdHViOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQubG9jYXRpb24uSUxvY2F0aW9uTWFuYWdlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLklJbnRlcmZhY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gYWRkR3BzU3RhdHVzTGlzdGVuZXIoCi1hbmRyb2lkLmxvY2F0aW9uLklHcHNTdGF0dXNMaXN0ZW5lcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGFkZFByb3hpbWl0eUFsZXJ0KAotZG91YmxlCi1kb3VibGUKLWZsb2F0Ci1sb25nCi1hbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgYWRkVGVzdFByb3ZpZGVyKAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbgotYm9vbGVhbgotYm9vbGVhbgotYm9vbGVhbgotYm9vbGVhbgotYm9vbGVhbgotYm9vbGVhbgotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBjbGVhclRlc3RQcm92aWRlckVuYWJsZWQoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgY2xlYXJUZXN0UHJvdmlkZXJMb2NhdGlvbigKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBjbGVhclRlc3RQcm92aWRlclN0YXR1cygKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLkxpc3QgZ2V0QWxsUHJvdmlkZXJzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oRERJTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL2xvY2F0aW9uL0FkZHJlc3M7PjspTGphdmEvbGFuZy9TdHJpbmc7ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldEZyb21Mb2NhdGlvbigKLWRvdWJsZQotZG91YmxlCi1pbnQKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudXRpbC5MaXN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1N0cmluZztERERESUxqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9sb2NhdGlvbi9BZGRyZXNzOz47KUxqYXZhL2xhbmcvU3RyaW5nOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRGcm9tTG9jYXRpb25OYW1lKAotamF2YS5sYW5nLlN0cmluZwotZG91YmxlCi1kb3VibGUKLWRvdWJsZQotZG91YmxlCi1pbnQKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudXRpbC5MaXN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQubG9jYXRpb24uTG9jYXRpb24gZ2V0TGFzdEtub3duTG9jYXRpb24oCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQub3MuQnVuZGxlIGdldFByb3ZpZGVySW5mbygKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLkxpc3QgZ2V0UHJvdmlkZXJzKAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzUHJvdmlkZXJFbmFibGVkKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlbW92ZUdwc1N0YXR1c0xpc3RlbmVyKAotYW5kcm9pZC5sb2NhdGlvbi5JR3BzU3RhdHVzTGlzdGVuZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCByZW1vdmVQcm94aW1pdHlBbGVydCgKLWFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCByZW1vdmVUZXN0UHJvdmlkZXIoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgcmVtb3ZlVXBkYXRlcygKLWFuZHJvaWQubG9jYXRpb24uSUxvY2F0aW9uTGlzdGVuZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCByZXF1ZXN0TG9jYXRpb25VcGRhdGVzKAotamF2YS5sYW5nLlN0cmluZwotbG9uZwotZmxvYXQKLWFuZHJvaWQubG9jYXRpb24uSUxvY2F0aW9uTGlzdGVuZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzZW5kRXh0cmFDb21tYW5kKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5vcy5CdW5kbGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRUZXN0UHJvdmlkZXJFbmFibGVkKAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFRlc3RQcm92aWRlckxvY2F0aW9uKAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFRlc3RQcm92aWRlclN0YXR1cygKLWphdmEubGFuZy5TdHJpbmcKLWludAotYW5kcm9pZC5vcy5CdW5kbGUKLWxvbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB1cGRhdGVQcm92aWRlcnMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9UHJveHkgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvbG9jYXRpb24vSUxvY2F0aW9uTWFuYWdlciRTdHViOyApCi0gY2xhc3MgYW5kcm9pZC5sb2NhdGlvbi5JTG9jYXRpb25NYW5hZ2VyJFN0dWIkUHJveHkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5sb2NhdGlvbi5JTG9jYXRpb25NYW5hZ2VyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5JQmluZGVyIG1SZW1vdGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLklCaW5kZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBhZGRHcHNTdGF0dXNMaXN0ZW5lcigKLWFuZHJvaWQubG9jYXRpb24uSUdwc1N0YXR1c0xpc3RlbmVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgYWRkUHJveGltaXR5QWxlcnQoCi1kb3VibGUKLWRvdWJsZQotZmxvYXQKLWxvbmcKLWFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBhZGRUZXN0UHJvdmlkZXIoCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuCi1ib29sZWFuCi1ib29sZWFuCi1ib29sZWFuCi1ib29sZWFuCi1ib29sZWFuCi1ib29sZWFuCi1pbnQKLWludCkKLQotcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjbGVhclRlc3RQcm92aWRlckVuYWJsZWQoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY2xlYXJUZXN0UHJvdmlkZXJMb2NhdGlvbigKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjbGVhclRlc3RQcm92aWRlclN0YXR1cygKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0QWxsUHJvdmlkZXJzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oRERJTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL2xvY2F0aW9uL0FkZHJlc3M7PjspTGphdmEvbGFuZy9TdHJpbmc7ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEZyb21Mb2NhdGlvbigKLWRvdWJsZQotZG91YmxlCi1pbnQKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudXRpbC5MaXN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1N0cmluZztERERESUxqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9sb2NhdGlvbi9BZGRyZXNzOz47KUxqYXZhL2xhbmcvU3RyaW5nOyApCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRGcm9tTG9jYXRpb25OYW1lKAotamF2YS5sYW5nLlN0cmluZwotZG91YmxlCi1kb3VibGUKLWRvdWJsZQotZG91YmxlCi1pbnQKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudXRpbC5MaXN0KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uIGdldExhc3RLbm93bkxvY2F0aW9uKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhbmRyb2lkLm9zLkJ1bmRsZSBnZXRQcm92aWRlckluZm8oCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEudXRpbC5MaXN0IGdldFByb3ZpZGVycygKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBpc1Byb3ZpZGVyRW5hYmxlZCgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCByZW1vdmVHcHNTdGF0dXNMaXN0ZW5lcigKLWFuZHJvaWQubG9jYXRpb24uSUdwc1N0YXR1c0xpc3RlbmVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcmVtb3ZlUHJveGltaXR5QWxlcnQoCi1hbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcmVtb3ZlVGVzdFByb3ZpZGVyKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHJlbW92ZVVwZGF0ZXMoCi1hbmRyb2lkLmxvY2F0aW9uLklMb2NhdGlvbkxpc3RlbmVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcmVxdWVzdExvY2F0aW9uVXBkYXRlcygKLWphdmEubGFuZy5TdHJpbmcKLWxvbmcKLWZsb2F0Ci1hbmRyb2lkLmxvY2F0aW9uLklMb2NhdGlvbkxpc3RlbmVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gc2VuZEV4dHJhQ29tbWFuZCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuQnVuZGxlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0VGVzdFByb3ZpZGVyRW5hYmxlZCgKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRUZXN0UHJvdmlkZXJMb2NhdGlvbigKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQubG9jYXRpb24uTG9jYXRpb24pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRUZXN0UHJvdmlkZXJTdGF0dXMoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWFuZHJvaWQub3MuQnVuZGxlCi1sb25nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgdXBkYXRlUHJvdmlkZXJzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL2xvY2F0aW9uL0lMb2NhdGlvbk1hbmFnZXIkU3R1YiRQcm94eTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMDMzIG5hbWUgPVN0dWIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvbG9jYXRpb24vSUxvY2F0aW9uTWFuYWdlcjsgKQotcHVibGljIGFic3RyYWN0IGNsYXNzIGFuZHJvaWQubG9jYXRpb24uSUxvY2F0aW9uTWFuYWdlciRTdHViIGV4dGVuZHMgYW5kcm9pZC5vcy5CaW5kZXIgaW1wbGVtZW50cyBhbmRyb2lkLmxvY2F0aW9uLklMb2NhdGlvbk1hbmFnZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERVNDUklQVE9SCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fYWRkR3BzU3RhdHVzTGlzdGVuZXIKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9hZGRQcm94aW1pdHlBbGVydAotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2FkZFRlc3RQcm92aWRlcgotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2NsZWFyVGVzdFByb3ZpZGVyRW5hYmxlZAotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2NsZWFyVGVzdFByb3ZpZGVyTG9jYXRpb24KLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9jbGVhclRlc3RQcm92aWRlclN0YXR1cwotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2dldEFsbFByb3ZpZGVycwotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2dldEZyb21Mb2NhdGlvbgotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2dldEZyb21Mb2NhdGlvbk5hbWUKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9nZXRMYXN0S25vd25Mb2NhdGlvbgotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2dldFByb3ZpZGVySW5mbwotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2dldFByb3ZpZGVycwotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2lzUHJvdmlkZXJFbmFibGVkCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fcmVtb3ZlR3BzU3RhdHVzTGlzdGVuZXIKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9yZW1vdmVQcm94aW1pdHlBbGVydAotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3JlbW92ZVRlc3RQcm92aWRlcgotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3JlbW92ZVVwZGF0ZXMKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9yZXF1ZXN0TG9jYXRpb25VcGRhdGVzCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fc2VuZEV4dHJhQ29tbWFuZAotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3NldFRlc3RQcm92aWRlckVuYWJsZWQKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9zZXRUZXN0UHJvdmlkZXJMb2NhdGlvbgotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3NldFRlc3RQcm92aWRlclN0YXR1cwotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3VwZGF0ZVByb3ZpZGVycwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5sb2NhdGlvbi5JTG9jYXRpb25NYW5hZ2VyIGFzSW50ZXJmYWNlKAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIG9uVHJhbnNhY3QoCi1pbnQKLWFuZHJvaWQub3MuUGFyY2VsCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2xvY2F0aW9uL0xvY2F0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExhbmRyb2lkL2xvY2F0aW9uL0xvY2F0aW9uOz47ICkKLWZpbmFsIGNsYXNzIGFuZHJvaWQubG9jYXRpb24uTG9jYXRpb24kMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBhbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uIGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbltdIG5ld0FycmF5KAotaW50KQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdFtdIG5ld0FycmF5KAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQubG9jYXRpb24uTG9jYXRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExhbmRyb2lkL2xvY2F0aW9uL0xvY2F0aW9uOz47ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IgQ1JFQVRPUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfREVHUkVFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfTUlOVVRFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfU0VDT05EUwotCi1wcml2YXRlIGZsb2F0IG1BY2N1cmFjeQotCi1wcml2YXRlIGRvdWJsZSBtQWx0aXR1ZGUKLQotcHJpdmF0ZSBmbG9hdCBtQmVhcmluZwotCi1wcml2YXRlIGZsb2F0IG1EaXN0YW5jZQotCi1wcml2YXRlIGFuZHJvaWQub3MuQnVuZGxlIG1FeHRyYXMKLQotcHJpdmF0ZSBib29sZWFuIG1IYXNBY2N1cmFjeQotCi1wcml2YXRlIGJvb2xlYW4gbUhhc0FsdGl0dWRlCi0KLXByaXZhdGUgYm9vbGVhbiBtSGFzQmVhcmluZwotCi1wcml2YXRlIGJvb2xlYW4gbUhhc1NwZWVkCi0KLXByaXZhdGUgZmxvYXQgbUluaXRpYWxCZWFyaW5nCi0KLXByaXZhdGUgZG91YmxlIG1MYXQxCi0KLXByaXZhdGUgZG91YmxlIG1MYXQyCi0KLXByaXZhdGUgZG91YmxlIG1MYXRpdHVkZQotCi1wcml2YXRlIGRvdWJsZSBtTG9uMQotCi1wcml2YXRlIGRvdWJsZSBtTG9uMgotCi1wcml2YXRlIGRvdWJsZSBtTG9uZ2l0dWRlCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtUHJvdmlkZXIKLQotcHJpdmF0ZSBmbG9hdFtdIG1SZXN1bHRzCi0KLXByaXZhdGUgZmxvYXQgbVNwZWVkCi0KLXByaXZhdGUgbG9uZyBtVGltZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbikKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotc3RhdGljIGxvbmcgYWNjZXNzJDAwMigKLWFuZHJvaWQubG9jYXRpb24uTG9jYXRpb24KLWxvbmcpCi0KLXN0YXRpYyBmbG9hdCBhY2Nlc3MkMTAwMigKLWFuZHJvaWQubG9jYXRpb24uTG9jYXRpb24KLWZsb2F0KQotCi1zdGF0aWMgZG91YmxlIGFjY2VzcyQxMDIoCi1hbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uCi1kb3VibGUpCi0KLXN0YXRpYyBhbmRyb2lkLm9zLkJ1bmRsZSBhY2Nlc3MkMTEwMigKLWFuZHJvaWQubG9jYXRpb24uTG9jYXRpb24KLWFuZHJvaWQub3MuQnVuZGxlKQotCi1zdGF0aWMgZG91YmxlIGFjY2VzcyQyMDIoCi1hbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uCi1kb3VibGUpCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQzMDIoCi1hbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uCi1ib29sZWFuKQotCi1zdGF0aWMgZG91YmxlIGFjY2VzcyQ0MDIoCi1hbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uCi1kb3VibGUpCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQ1MDIoCi1hbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uCi1ib29sZWFuKQotCi1zdGF0aWMgZmxvYXQgYWNjZXNzJDYwMigKLWFuZHJvaWQubG9jYXRpb24uTG9jYXRpb24KLWZsb2F0KQotCi1zdGF0aWMgYm9vbGVhbiBhY2Nlc3MkNzAyKAotYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbgotYm9vbGVhbikKLQotc3RhdGljIGZsb2F0IGFjY2VzcyQ4MDIoCi1hbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uCi1mbG9hdCkKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDkwMigKLWFuZHJvaWQubG9jYXRpb24uTG9jYXRpb24KLWJvb2xlYW4pCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgY29tcHV0ZURpc3RhbmNlQW5kQmVhcmluZygKLWRvdWJsZQotZG91YmxlCi1kb3VibGUKLWRvdWJsZQotZmxvYXRbXSkKLQotcHVibGljIHN0YXRpYyBkb3VibGUgY29udmVydCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBjb252ZXJ0KAotZG91YmxlCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBkaXN0YW5jZUJldHdlZW4oCi1kb3VibGUKLWRvdWJsZQotZG91YmxlCi1kb3VibGUKLWZsb2F0W10pCi0KLXB1YmxpYyBmbG9hdCBiZWFyaW5nVG8oCi1hbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uKQotCi1wdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKQotCi1wdWJsaWMgZmxvYXQgZGlzdGFuY2VUbygKLWFuZHJvaWQubG9jYXRpb24uTG9jYXRpb24pCi0KLXB1YmxpYyBmbG9hdCBnZXRBY2N1cmFjeSgpCi0KLXB1YmxpYyBkb3VibGUgZ2V0QWx0aXR1ZGUoKQotCi1wdWJsaWMgZmxvYXQgZ2V0QmVhcmluZygpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLkJ1bmRsZSBnZXRFeHRyYXMoKQotCi1wdWJsaWMgZG91YmxlIGdldExhdGl0dWRlKCkKLQotcHVibGljIGRvdWJsZSBnZXRMb25naXR1ZGUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRQcm92aWRlcigpCi0KLXB1YmxpYyBmbG9hdCBnZXRTcGVlZCgpCi0KLXB1YmxpYyBsb25nIGdldFRpbWUoKQotCi1wdWJsaWMgYm9vbGVhbiBoYXNBY2N1cmFjeSgpCi0KLXB1YmxpYyBib29sZWFuIGhhc0FsdGl0dWRlKCkKLQotcHVibGljIGJvb2xlYW4gaGFzQmVhcmluZygpCi0KLXB1YmxpYyBib29sZWFuIGhhc1NwZWVkKCkKLQotcHVibGljIHZvaWQgcmVtb3ZlQWNjdXJhY3koKQotCi1wdWJsaWMgdm9pZCByZW1vdmVBbHRpdHVkZSgpCi0KLXB1YmxpYyB2b2lkIHJlbW92ZUJlYXJpbmcoKQotCi1wdWJsaWMgdm9pZCByZW1vdmVTcGVlZCgpCi0KLXB1YmxpYyB2b2lkIHJlc2V0KCkKLQotcHVibGljIHZvaWQgc2V0KAotYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbikKLQotcHVibGljIHZvaWQgc2V0QWNjdXJhY3koCi1mbG9hdCkKLQotcHVibGljIHZvaWQgc2V0QWx0aXR1ZGUoCi1kb3VibGUpCi0KLXB1YmxpYyB2b2lkIHNldEJlYXJpbmcoCi1mbG9hdCkKLQotcHVibGljIHZvaWQgc2V0RXh0cmFzKAotYW5kcm9pZC5vcy5CdW5kbGUpCi0KLXB1YmxpYyB2b2lkIHNldExhdGl0dWRlKAotZG91YmxlKQotCi1wdWJsaWMgdm9pZCBzZXRMb25naXR1ZGUoCi1kb3VibGUpCi0KLXB1YmxpYyB2b2lkIHNldFByb3ZpZGVyKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0U3BlZWQoCi1mbG9hdCkKLQotcHVibGljIHZvaWQgc2V0VGltZSgKLWxvbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQubG9jYXRpb24uTG9jYXRpb25MaXN0ZW5lciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvbkxvY2F0aW9uQ2hhbmdlZCgKLWFuZHJvaWQubG9jYXRpb24uTG9jYXRpb24pCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uUHJvdmlkZXJEaXNhYmxlZCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uUHJvdmlkZXJFbmFibGVkKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IHZvaWQgb25TdGF0dXNDaGFuZ2VkKAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1hbmRyb2lkLm9zLkJ1bmRsZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9sb2NhdGlvbi9Mb2NhdGlvbk1hbmFnZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9NDEwNCBuYW1lID1udWxsICkKLSBjbGFzcyBhbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uTWFuYWdlciQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvbG9jYXRpb24vTG9jYXRpb25NYW5hZ2VyJEdwc1N0YXR1c0xpc3RlbmVyVHJhbnNwb3J0OyApCi0gY2xhc3MgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbk1hbmFnZXIkR3BzU3RhdHVzTGlzdGVuZXJUcmFuc3BvcnQkMSBleHRlbmRzIGFuZHJvaWQub3MuSGFuZGxlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uTWFuYWdlciRHcHNTdGF0dXNMaXN0ZW5lclRyYW5zcG9ydCB0aGlzJDEKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uTWFuYWdlciRHcHNTdGF0dXNMaXN0ZW5lclRyYW5zcG9ydCkKLQotcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZSgKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTIgbmFtZSA9R3BzU3RhdHVzTGlzdGVuZXJUcmFuc3BvcnQgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvbG9jYXRpb24vTG9jYXRpb25NYW5hZ2VyOyApCi0gY2xhc3MgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbk1hbmFnZXIkR3BzU3RhdHVzTGlzdGVuZXJUcmFuc3BvcnQgZXh0ZW5kcyBhbmRyb2lkLmxvY2F0aW9uLklHcHNTdGF0dXNMaXN0ZW5lciRTdHViCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHUFNfRklSU1RfRklYCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHUFNfU1RBUlRFRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR1BTX1NUT1BQRUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdQU19TVl9TVEFUVVMKLQotcHJpdmF0ZSBpbnQgbUFsbWFuYWNNYXNrCi0KLXByaXZhdGUgZmxvYXRbXSBtQXppbXV0aHMKLQotcHJpdmF0ZSBmbG9hdFtdIG1FbGV2YXRpb25zCi0KLXByaXZhdGUgaW50IG1FcGhlbWVyaXNNYXNrCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5vcy5IYW5kbGVyIG1HcHNIYW5kbGVyCi0KLXByaXZhdGUgYW5kcm9pZC5sb2NhdGlvbi5HcHNTdGF0dXNMaXN0ZW5lciBtTGlzdGVuZXIKLQotcHJpdmF0ZSBpbnRbXSBtUHJucwotCi1wcml2YXRlIGZsb2F0W10gbVNucnMKLQotcHJpdmF0ZSBpbnQgbVN2Q291bnQKLQotcHJpdmF0ZSBpbnQgbVRURkYKLQotcHJpdmF0ZSBpbnQgbVVzZWRJbkZpeE1hc2sKLQotZmluYWwgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbk1hbmFnZXIgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbk1hbmFnZXIKLWFuZHJvaWQubG9jYXRpb24uR3BzU3RhdHVzTGlzdGVuZXIpCi0KLXN0YXRpYyBmbG9hdFtdIGFjY2VzcyQxMDAwKAotYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbk1hbmFnZXIkR3BzU3RhdHVzTGlzdGVuZXJUcmFuc3BvcnQpCi0KLXN0YXRpYyBmbG9hdFtdIGFjY2VzcyQxMTAwKAotYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbk1hbmFnZXIkR3BzU3RhdHVzTGlzdGVuZXJUcmFuc3BvcnQpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDEyMDAoCi1hbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uTWFuYWdlciRHcHNTdGF0dXNMaXN0ZW5lclRyYW5zcG9ydCkKLQotc3RhdGljIGludCBhY2Nlc3MkMTMwMCgKLWFuZHJvaWQubG9jYXRpb24uTG9jYXRpb25NYW5hZ2VyJEdwc1N0YXR1c0xpc3RlbmVyVHJhbnNwb3J0KQotCi1zdGF0aWMgaW50IGFjY2VzcyQxNDAwKAotYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbk1hbmFnZXIkR3BzU3RhdHVzTGlzdGVuZXJUcmFuc3BvcnQpCi0KLXN0YXRpYyBhbmRyb2lkLmxvY2F0aW9uLkdwc1N0YXR1c0xpc3RlbmVyIGFjY2VzcyQ1MDAoCi1hbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uTWFuYWdlciRHcHNTdGF0dXNMaXN0ZW5lclRyYW5zcG9ydCkKLQotc3RhdGljIGludCBhY2Nlc3MkNjAwKAotYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbk1hbmFnZXIkR3BzU3RhdHVzTGlzdGVuZXJUcmFuc3BvcnQpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDcwMCgKLWFuZHJvaWQubG9jYXRpb24uTG9jYXRpb25NYW5hZ2VyJEdwc1N0YXR1c0xpc3RlbmVyVHJhbnNwb3J0KQotCi1zdGF0aWMgaW50W10gYWNjZXNzJDgwMCgKLWFuZHJvaWQubG9jYXRpb24uTG9jYXRpb25NYW5hZ2VyJEdwc1N0YXR1c0xpc3RlbmVyVHJhbnNwb3J0KQotCi1zdGF0aWMgZmxvYXRbXSBhY2Nlc3MkOTAwKAotYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbk1hbmFnZXIkR3BzU3RhdHVzTGlzdGVuZXJUcmFuc3BvcnQpCi0KLXB1YmxpYyB2b2lkIG9uRmlyc3RGaXgoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIG9uR3BzU3RhcnRlZCgpCi0KLXB1YmxpYyB2b2lkIG9uR3BzU3RvcHBlZCgpCi0KLXB1YmxpYyB2b2lkIG9uU3ZTdGF0dXNDaGFuZ2VkKAotaW50Ci1pbnRbXQotZmxvYXRbXQotZmxvYXRbXQotZmxvYXRbXQotaW50Ci1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi0gY2xhc3MgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbk1hbmFnZXIkTGlzdGVuZXJUcmFuc3BvcnQkMSBleHRlbmRzIGFuZHJvaWQub3MuSGFuZGxlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uTWFuYWdlciRMaXN0ZW5lclRyYW5zcG9ydCB0aGlzJDEKLQotZmluYWwgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbk1hbmFnZXIgdmFsJHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQubG9jYXRpb24uTG9jYXRpb25NYW5hZ2VyJExpc3RlbmVyVHJhbnNwb3J0Ci1hbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uTWFuYWdlcikKLQotcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZSgKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi0gY2xhc3MgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbk1hbmFnZXIkTGlzdGVuZXJUcmFuc3BvcnQkMiBleHRlbmRzIGFuZHJvaWQub3MuSGFuZGxlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uTWFuYWdlciRMaXN0ZW5lclRyYW5zcG9ydCB0aGlzJDEKLQotZmluYWwgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbk1hbmFnZXIgdmFsJHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQubG9jYXRpb24uTG9jYXRpb25NYW5hZ2VyJExpc3RlbmVyVHJhbnNwb3J0Ci1hbmRyb2lkLm9zLkxvb3BlcgotYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbk1hbmFnZXIpCi0KLXB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPUxpc3RlbmVyVHJhbnNwb3J0ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2xvY2F0aW9uL0xvY2F0aW9uTWFuYWdlcjsgKQotIGNsYXNzIGFuZHJvaWQubG9jYXRpb24uTG9jYXRpb25NYW5hZ2VyJExpc3RlbmVyVHJhbnNwb3J0IGV4dGVuZHMgYW5kcm9pZC5sb2NhdGlvbi5JTG9jYXRpb25MaXN0ZW5lciRTdHViCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUWVBFX0xPQ0FUSU9OX0NIQU5HRUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRZUEVfUFJPVklERVJfRElTQUJMRUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRZUEVfUFJPVklERVJfRU5BQkxFRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9TVEFUVVNfQ0hBTkdFRAotCi1wcml2YXRlIGFuZHJvaWQubG9jYXRpb24uTG9jYXRpb25MaXN0ZW5lciBtTGlzdGVuZXIKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLm9zLkhhbmRsZXIgbUxpc3RlbmVySGFuZGxlcgotCi1maW5hbCBhbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uTWFuYWdlciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uTWFuYWdlcgotYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbkxpc3RlbmVyCi1hbmRyb2lkLm9zLkxvb3BlcikKLQotcHJpdmF0ZSB2b2lkIF9oYW5kbGVNZXNzYWdlKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMDAwKAotYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbk1hbmFnZXIkTGlzdGVuZXJUcmFuc3BvcnQKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgb25Mb2NhdGlvbkNoYW5nZWQoCi1hbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uKQotCi1wdWJsaWMgdm9pZCBvblByb3ZpZGVyRGlzYWJsZWQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBvblByb3ZpZGVyRW5hYmxlZCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIG9uU3RhdHVzQ2hhbmdlZCgKLWphdmEubGFuZy5TdHJpbmcKLWludAotYW5kcm9pZC5vcy5CdW5kbGUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMDI2IG5hbWUgPUxwQ29tcGFyYXRvciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9sb2NhdGlvbi9Mb2NhdGlvbk1hbmFnZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS91dGlsL0NvbXBhcmF0b3I8TGFuZHJvaWQvbG9jYXRpb24vTG9jYXRpb25Qcm92aWRlcjs+OyApCi1hYnN0cmFjdCBjbGFzcyBhbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uTWFuYWdlciRMcENvbXBhcmF0b3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLkNvbXBhcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbk1hbmFnZXIgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQubG9jYXRpb24uTG9jYXRpb25NYW5hZ2VyKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uTWFuYWdlcgotYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbk1hbmFnZXIkMSkKLQotcHVibGljIGludCBjb21wYXJlKAotZmxvYXQKLWZsb2F0KQotCi1wdWJsaWMgaW50IGNvbXBhcmUoCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9sb2NhdGlvbi9Mb2NhdGlvbk1hbmFnZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MiBuYW1lID1McEFjY3VyYWN5Q29tcGFyYXRvciApCi0gY2xhc3MgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbk1hbmFnZXIkTHBBY2N1cmFjeUNvbXBhcmF0b3IgZXh0ZW5kcyBhbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uTWFuYWdlciRMcENvbXBhcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbk1hbmFnZXIgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQubG9jYXRpb24uTG9jYXRpb25NYW5hZ2VyKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uTWFuYWdlcgotYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbk1hbmFnZXIkMSkKLQotcHVibGljIGludCBjb21wYXJlKAotYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvblByb3ZpZGVyCi1hbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uUHJvdmlkZXIpCi0KLXB1YmxpYyB2b2xhdGlsZSBpbnQgY29tcGFyZSgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWFuZHJvaWQubG9jYXRpb24uTG9jYXRpb25Qcm92aWRlcgotYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvblByb3ZpZGVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2xvY2F0aW9uL0xvY2F0aW9uTWFuYWdlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPUxwQ2FwYWJpbGl0eUNvbXBhcmF0b3IgKQotIGNsYXNzIGFuZHJvaWQubG9jYXRpb24uTG9jYXRpb25NYW5hZ2VyJExwQ2FwYWJpbGl0eUNvbXBhcmF0b3IgZXh0ZW5kcyBhbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uTWFuYWdlciRMcENvbXBhcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFMVElUVURFX1NDT1JFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCRUFSSU5HX1NDT1JFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTUEVFRF9TQ09SRQotCi1maW5hbCBhbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uTWFuYWdlciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbk1hbmFnZXIpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQubG9jYXRpb24uTG9jYXRpb25NYW5hZ2VyCi1hbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uTWFuYWdlciQxKQotCi1wcml2YXRlIGludCBzY29yZSgKLWFuZHJvaWQubG9jYXRpb24uTG9jYXRpb25Qcm92aWRlcikKLQotcHVibGljIGludCBjb21wYXJlKAotYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvblByb3ZpZGVyCi1hbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uUHJvdmlkZXIpCi0KLXB1YmxpYyB2b2xhdGlsZSBpbnQgY29tcGFyZSgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWFuZHJvaWQubG9jYXRpb24uTG9jYXRpb25Qcm92aWRlcgotYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvblByb3ZpZGVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL2xvY2F0aW9uL0xvY2F0aW9uTWFuYWdlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPUxwUG93ZXJDb21wYXJhdG9yICkKLSBjbGFzcyBhbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uTWFuYWdlciRMcFBvd2VyQ29tcGFyYXRvciBleHRlbmRzIGFuZHJvaWQubG9jYXRpb24uTG9jYXRpb25NYW5hZ2VyJExwQ29tcGFyYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uTWFuYWdlciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbk1hbmFnZXIpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQubG9jYXRpb24uTG9jYXRpb25NYW5hZ2VyCi1hbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uTWFuYWdlciQxKQotCi1wdWJsaWMgaW50IGNvbXBhcmUoCi1hbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uUHJvdmlkZXIKLWFuZHJvaWQubG9jYXRpb24uTG9jYXRpb25Qcm92aWRlcikKLQotcHVibGljIHZvbGF0aWxlIGludCBjb21wYXJlKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvblByb3ZpZGVyCi1hbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uUHJvdmlkZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9sb2NhdGlvbi9Mb2NhdGlvbk1hbmFnZXIkMTtMYW5kcm9pZC9sb2NhdGlvbi9Mb2NhdGlvbk1hbmFnZXIkR3BzU3RhdHVzTGlzdGVuZXJUcmFuc3BvcnQ7TGFuZHJvaWQvbG9jYXRpb24vTG9jYXRpb25NYW5hZ2VyJExwQ2FwYWJpbGl0eUNvbXBhcmF0b3I7TGFuZHJvaWQvbG9jYXRpb24vTG9jYXRpb25NYW5hZ2VyJExwQWNjdXJhY3lDb21wYXJhdG9yO0xhbmRyb2lkL2xvY2F0aW9uL0xvY2F0aW9uTWFuYWdlciRMcFBvd2VyQ29tcGFyYXRvcjtMYW5kcm9pZC9sb2NhdGlvbi9Mb2NhdGlvbk1hbmFnZXIkTHBDb21wYXJhdG9yO0xhbmRyb2lkL2xvY2F0aW9uL0xvY2F0aW9uTWFuYWdlciRMaXN0ZW5lclRyYW5zcG9ydDsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQubG9jYXRpb24uTG9jYXRpb25NYW5hZ2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgR1BTX1BST1ZJREVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBLRVlfUFJPWElNSVRZX0VOVEVSSU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBORVRXT1JLX1BST1ZJREVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQUk9WSURFUl9ESVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNZU1RFTV9ESVIKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0hhc2hNYXA8TGFuZHJvaWQvbG9jYXRpb24vR3BzU3RhdHVzTGlzdGVuZXI7TGFuZHJvaWQvbG9jYXRpb24vTG9jYXRpb25NYW5hZ2VyJEdwc1N0YXR1c0xpc3RlbmVyVHJhbnNwb3J0Oz47ICkKLXByaXZhdGUgamF2YS51dGlsLkhhc2hNYXAgbUdwc1N0YXR1c0xpc3RlbmVycwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaE1hcDxMYW5kcm9pZC9sb2NhdGlvbi9Mb2NhdGlvbkxpc3RlbmVyO0xhbmRyb2lkL2xvY2F0aW9uL0xvY2F0aW9uTWFuYWdlciRMaXN0ZW5lclRyYW5zcG9ydDs+OyApCi1wcml2YXRlIGphdmEudXRpbC5IYXNoTWFwIG1MaXN0ZW5lcnMKLQotcHJpdmF0ZSBhbmRyb2lkLmxvY2F0aW9uLklMb2NhdGlvbk1hbmFnZXIgbVNlcnZpY2UKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmxvY2F0aW9uLklMb2NhdGlvbk1hbmFnZXIpCi0KLXByaXZhdGUgdm9pZCBfcmVxdWVzdExvY2F0aW9uVXBkYXRlcygKLWphdmEubGFuZy5TdHJpbmcKLWxvbmcKLWZsb2F0Ci1hbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uTGlzdGVuZXIKLWFuZHJvaWQub3MuTG9vcGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0xpc3Q8TGphdmEvbGFuZy9TdHJpbmc7PjspTGFuZHJvaWQvbG9jYXRpb24vTG9jYXRpb25Qcm92aWRlcjsgKQotcHJpdmF0ZSBhbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uUHJvdmlkZXIgYmVzdCgKLWphdmEudXRpbC5MaXN0KQotCi1wcml2YXRlIGFuZHJvaWQubG9jYXRpb24uTG9jYXRpb25Qcm92aWRlciBjcmVhdGVQcm92aWRlcigKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuQnVuZGxlKQotCi1wcml2YXRlIGludCBuZXh0QWNjdXJhY3koCi1pbnQpCi0KLXByaXZhdGUgaW50IG5leHRQb3dlcigKLWludCkKLQotcHVibGljIHZvaWQgYWRkUHJveGltaXR5QWxlcnQoCi1kb3VibGUKLWRvdWJsZQotZmxvYXQKLWxvbmcKLWFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQpCi0KLXB1YmxpYyB2b2lkIGFkZFRlc3RQcm92aWRlcigKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4KLWJvb2xlYW4KLWJvb2xlYW4KLWJvb2xlYW4KLWJvb2xlYW4KLWJvb2xlYW4KLWJvb2xlYW4KLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBjbGVhclRlc3RQcm92aWRlckVuYWJsZWQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBjbGVhclRlc3RQcm92aWRlckxvY2F0aW9uKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgY2xlYXJUZXN0UHJvdmlkZXJTdGF0dXMoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9MaXN0PExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRBbGxQcm92aWRlcnMoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRCZXN0UHJvdmlkZXIoCi1hbmRyb2lkLmxvY2F0aW9uLkNyaXRlcmlhCi1ib29sZWFuKQotCi1wdWJsaWMgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbiBnZXRMYXN0S25vd25Mb2NhdGlvbigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uUHJvdmlkZXIgZ2V0UHJvdmlkZXIoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMYW5kcm9pZC9sb2NhdGlvbi9Dcml0ZXJpYTtaKUxqYXZhL3V0aWwvTGlzdDxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0UHJvdmlkZXJzKAotYW5kcm9pZC5sb2NhdGlvbi5Dcml0ZXJpYQotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oWilMamF2YS91dGlsL0xpc3Q8TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHVibGljIGphdmEudXRpbC5MaXN0IGdldFByb3ZpZGVycygKLWJvb2xlYW4pCi0KLXB1YmxpYyBib29sZWFuIGlzUHJvdmlkZXJFbmFibGVkKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJvb2xlYW4gcmVnaXN0ZXJHcHNTdGF0dXNMaXN0ZW5lcigKLWFuZHJvaWQubG9jYXRpb24uR3BzU3RhdHVzTGlzdGVuZXIpCi0KLXB1YmxpYyB2b2lkIHJlbW92ZVByb3hpbWl0eUFsZXJ0KAotYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudCkKLQotcHVibGljIHZvaWQgcmVtb3ZlVGVzdFByb3ZpZGVyKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgcmVtb3ZlVXBkYXRlcygKLWFuZHJvaWQubG9jYXRpb24uTG9jYXRpb25MaXN0ZW5lcikKLQotcHVibGljIHZvaWQgcmVxdWVzdExvY2F0aW9uVXBkYXRlcygKLWphdmEubGFuZy5TdHJpbmcKLWxvbmcKLWZsb2F0Ci1hbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uTGlzdGVuZXIpCi0KLXB1YmxpYyB2b2lkIHJlcXVlc3RMb2NhdGlvblVwZGF0ZXMoCi1qYXZhLmxhbmcuU3RyaW5nCi1sb25nCi1mbG9hdAotYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbkxpc3RlbmVyCi1hbmRyb2lkLm9zLkxvb3BlcikKLQotcHVibGljIGJvb2xlYW4gc2VuZEV4dHJhQ29tbWFuZCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuQnVuZGxlKQotCi1wdWJsaWMgdm9pZCBzZXRUZXN0UHJvdmlkZXJFbmFibGVkKAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0VGVzdFByb3ZpZGVyTG9jYXRpb24oCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uKQotCi1wdWJsaWMgdm9pZCBzZXRUZXN0UHJvdmlkZXJTdGF0dXMoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWFuZHJvaWQub3MuQnVuZGxlCi1sb25nKQotCi1wdWJsaWMgdm9pZCB1bnJlZ2lzdGVyR3BzU3RhdHVzTGlzdGVuZXIoCi1hbmRyb2lkLmxvY2F0aW9uLkdwc1N0YXR1c0xpc3RlbmVyKQotCi1wdWJsaWMgdm9pZCB1cGRhdGVQcm92aWRlcnMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGFuZHJvaWQubG9jYXRpb24uTG9jYXRpb25Qcm92aWRlckltcGwgZXh0ZW5kcyBhbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uUHJvdmlkZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0FycmF5TGlzdDxMYW5kcm9pZC9sb2NhdGlvbi9Mb2NhdGlvblByb3ZpZGVySW1wbDs+OyApCi1wcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuQXJyYXlMaXN0IHNQcm92aWRlcnMKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0hhc2hNYXA8TGphdmEvbGFuZy9TdHJpbmc7TGFuZHJvaWQvbG9jYXRpb24vTG9jYXRpb25Qcm92aWRlckltcGw7PjsgKQotcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLkhhc2hNYXAgc1Byb3ZpZGVyc0J5TmFtZQotCi1wcml2YXRlIGJvb2xlYW4gbUxvY2F0aW9uVHJhY2tpbmcKLQotcHJpdmF0ZSBsb25nIG1NaW5UaW1lCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgYWRkUHJvdmlkZXIoCi1hbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uUHJvdmlkZXJJbXBsKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQubG9jYXRpb24uTG9jYXRpb25Qcm92aWRlckltcGwgZ2V0UHJvdmlkZXIoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL2xvY2F0aW9uL0xvY2F0aW9uUHJvdmlkZXJJbXBsOz47ICkKLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLkxpc3QgZ2V0UHJvdmlkZXJzKCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uUHJvdmlkZXJJbXBsIGxvYWRGcm9tQ2xhc3MoCi1qYXZhLmlvLkZpbGUpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVQcm92aWRlcigKLWFuZHJvaWQubG9jYXRpb24uTG9jYXRpb25Qcm92aWRlckltcGwpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGRpc2FibGUoKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBlbmFibGUoKQotCi1wdWJsaWMgdm9pZCBlbmFibGVMb2NhdGlvblRyYWNraW5nKAotYm9vbGVhbikKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZ2V0TG9jYXRpb24oCi1hbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uKQotCi1wdWJsaWMgbG9uZyBnZXRNaW5UaW1lKCkKLQotcHVibGljIGludCBnZXRTdGF0dXMoKQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldFN0YXR1cygKLWFuZHJvaWQub3MuQnVuZGxlKQotCi1wdWJsaWMgbG9uZyBnZXRTdGF0dXNVcGRhdGVUaW1lKCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNFbmFibGVkKCkKLQotcHVibGljIGJvb2xlYW4gaXNMb2NhdGlvblRyYWNraW5nKCkKLQotcHVibGljIGJvb2xlYW4gc2VuZEV4dHJhQ29tbWFuZCgKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuQnVuZGxlKQotCi1wdWJsaWMgdm9pZCBzZXRNaW5UaW1lKAotbG9uZykKLQotcHVibGljIHZvaWQgdXBkYXRlQ2VsbFN0YXRlKAotY29tLmFuZHJvaWQuaW50ZXJuYWwubG9jYXRpb24uQ2VsbFN0YXRlKQotCi1wdWJsaWMgdm9pZCB1cGRhdGVOZXR3b3JrU3RhdGUoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvbWVkaWEvQXN5bmNQbGF5ZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9NDEwNCBuYW1lID1udWxsICkKLSBjbGFzcyBhbmRyb2lkLm1lZGlhLkFzeW5jUGxheWVyJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI2IG5hbWUgPUNvbW1hbmQgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvbWVkaWEvQXN5bmNQbGF5ZXI7ICkKLWZpbmFsIGNsYXNzIGFuZHJvaWQubWVkaWEuQXN5bmNQbGF5ZXIkQ29tbWFuZCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGludCBjb2RlCi0KLSBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBjb250ZXh0Ci0KLSBib29sZWFuIGxvb3BpbmcKLQotIGFuZHJvaWQubWVkaWEuQXN5bmNQbGF5ZXIkQ29tbWFuZCBuZXh0Ci0KLSBpbnQgc3RyZWFtCi0KLSBhbmRyb2lkLm5ldC5VcmkgdXJpCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQubWVkaWEuQXN5bmNQbGF5ZXIkMSkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL21lZGlhL0FzeW5jUGxheWVyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE4IG5hbWUgPVRocmVhZCApCi1maW5hbCBjbGFzcyBhbmRyb2lkLm1lZGlhLkFzeW5jUGxheWVyJFRocmVhZCBleHRlbmRzIGphdmEubGFuZy5UaHJlYWQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC5tZWRpYS5Bc3luY1BsYXllciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm1lZGlhLkFzeW5jUGxheWVyKQotCi1wdWJsaWMgdm9pZCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvbWVkaWEvQXN5bmNQbGF5ZXIkMTtMYW5kcm9pZC9tZWRpYS9Bc3luY1BsYXllciRUaHJlYWQ7TGFuZHJvaWQvbWVkaWEvQXN5bmNQbGF5ZXIkQ29tbWFuZDsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQubWVkaWEuQXN5bmNQbGF5ZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQTEFZCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVE9QCi0KLXByaXZhdGUgYW5kcm9pZC5tZWRpYS5Bc3luY1BsYXllciRDb21tYW5kIG1IZWFkCi0KLXByaXZhdGUgamF2YS5sYW5nLk9iamVjdCBtTG9jawotCi1wcml2YXRlIGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIgbVBsYXllcgotCi1wcml2YXRlIGludCBtU3RhdGUKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1UYWcKLQotcHJpdmF0ZSBhbmRyb2lkLm1lZGlhLkFzeW5jUGxheWVyJENvbW1hbmQgbVRhaWwKLQotcHJpdmF0ZSBhbmRyb2lkLm1lZGlhLkFzeW5jUGxheWVyJFRocmVhZCBtVGhyZWFkCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5Qb3dlck1hbmFnZXIkV2FrZUxvY2sgbVdha2VMb2NrCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotc3RhdGljIGphdmEubGFuZy5TdHJpbmcgYWNjZXNzJDAwMCgKLWFuZHJvaWQubWVkaWEuQXN5bmNQbGF5ZXIpCi0KLXN0YXRpYyBqYXZhLmxhbmcuT2JqZWN0IGFjY2VzcyQxMDAoCi1hbmRyb2lkLm1lZGlhLkFzeW5jUGxheWVyKQotCi1zdGF0aWMgYW5kcm9pZC5tZWRpYS5Bc3luY1BsYXllciRDb21tYW5kIGFjY2VzcyQyMDAoCi1hbmRyb2lkLm1lZGlhLkFzeW5jUGxheWVyKQotCi1zdGF0aWMgYW5kcm9pZC5tZWRpYS5Bc3luY1BsYXllciRDb21tYW5kIGFjY2VzcyQyMDIoCi1hbmRyb2lkLm1lZGlhLkFzeW5jUGxheWVyCi1hbmRyb2lkLm1lZGlhLkFzeW5jUGxheWVyJENvbW1hbmQpCi0KLXN0YXRpYyBhbmRyb2lkLm1lZGlhLkFzeW5jUGxheWVyJENvbW1hbmQgYWNjZXNzJDMwMCgKLWFuZHJvaWQubWVkaWEuQXN5bmNQbGF5ZXIpCi0KLXN0YXRpYyBhbmRyb2lkLm1lZGlhLkFzeW5jUGxheWVyJENvbW1hbmQgYWNjZXNzJDMwMigKLWFuZHJvaWQubWVkaWEuQXN5bmNQbGF5ZXIKLWFuZHJvaWQubWVkaWEuQXN5bmNQbGF5ZXIkQ29tbWFuZCkKLQotc3RhdGljIGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIgYWNjZXNzJDQwMCgKLWFuZHJvaWQubWVkaWEuQXN5bmNQbGF5ZXIpCi0KLXN0YXRpYyBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyIGFjY2VzcyQ0MDIoCi1hbmRyb2lkLm1lZGlhLkFzeW5jUGxheWVyCi1hbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyKQotCi1zdGF0aWMgYW5kcm9pZC5tZWRpYS5Bc3luY1BsYXllciRUaHJlYWQgYWNjZXNzJDUwMigKLWFuZHJvaWQubWVkaWEuQXN5bmNQbGF5ZXIKLWFuZHJvaWQubWVkaWEuQXN5bmNQbGF5ZXIkVGhyZWFkKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkNjAwKAotYW5kcm9pZC5tZWRpYS5Bc3luY1BsYXllcikKLQotcHJpdmF0ZSB2b2lkIGFjcXVpcmVXYWtlTG9jaygpCi0KLXByaXZhdGUgdm9pZCBlbnF1ZXVlTG9ja2VkKAotYW5kcm9pZC5tZWRpYS5Bc3luY1BsYXllciRDb21tYW5kKQotCi1wcml2YXRlIHZvaWQgcmVsZWFzZVdha2VMb2NrKCkKLQotcHVibGljIHZvaWQgcGxheSgKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLm5ldC5VcmkKLWJvb2xlYW4KLWludCkKLQotcHVibGljIHZvaWQgc2V0VXNlc1dha2VMb2NrKAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXB1YmxpYyB2b2lkIHN0b3AoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBREpVU1RfTE9XRVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQURKVVNUX1JBSVNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFESlVTVF9TQU1FCi0KLXByaXZhdGUgc3RhdGljIGJvb2xlYW4gREVCVUcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBERUZBVUxUX1NUUkVBTV9WT0xVTUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEVYVFJBX1JJTkdFUl9NT0RFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBFWFRSQV9WSUJSQVRFX1NFVFRJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEVYVFJBX1ZJQlJBVEVfVFlQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX0FMTE9XX1JJTkdFUl9NT0RFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1BMQVlfU09VTkQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19SRU1PVkVfU09VTkRfQU5EX1ZJQlJBVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19TSE9XX1VJCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfVklCUkFURQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGWF9GT0NVU19OQVZJR0FUSU9OX0RPV04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRlhfRk9DVVNfTkFWSUdBVElPTl9MRUZUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZYX0ZPQ1VTX05BVklHQVRJT05fUklHSFQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRlhfRk9DVVNfTkFWSUdBVElPTl9VUAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGWF9LRVlfQ0xJQ0sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBNQVhfU1RSRUFNX1ZPTFVNRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX0NVUlJFTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9JTlZBTElECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfSU5fQ0FMTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX05PUk1BTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX1JJTkdUT05FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5VTV9TT1VORF9FRkZFQ1RTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5VTV9TVFJFQU1TCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSSU5HRVJfTU9ERV9DSEFOR0VEX0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSU5HRVJfTU9ERV9OT1JNQUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklOR0VSX01PREVfU0lMRU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJTkdFUl9NT0RFX1ZJQlJBVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUk9VVEVfQUxMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJPVVRFX0JMVUVUT09USAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBST1VURV9FQVJQSUVDRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBST1VURV9IRUFEU0VUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJPVVRFX1NQRUFLRVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RSRUFNX0FMQVJNCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUUkVBTV9NVVNJQwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVFJFQU1fUklORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVFJFQU1fU1lTVEVNCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUUkVBTV9WT0lDRV9DQUxMCi0KLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgVEFHCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVTRV9ERUZBVUxUX1NUUkVBTV9UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBWSUJSQVRFX1NFVFRJTkdfQ0hBTkdFRF9BQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklCUkFURV9TRVRUSU5HX09GRgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSUJSQVRFX1NFVFRJTkdfT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklCUkFURV9TRVRUSU5HX09OTFlfU0lMRU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJQlJBVEVfVFlQRV9OT1RJRklDQVRJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklCUkFURV9UWVBFX1JJTkdFUgotCi1wcml2YXRlIHN0YXRpYyBib29sZWFuIGxvY2FsTE9HVgotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLm1lZGlhLklBdWRpb1NlcnZpY2Ugc1NlcnZpY2UKLQotcHJpdmF0ZSBhbmRyb2lkLmRhdGFiYXNlLkNvbnRlbnRPYnNlcnZlciBtQ29udGVudE9ic2VydmVyCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgbUNvbnRleHQKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLm9zLkhhbmRsZXIgbUhhbmRsZXIKLQotcHJpdmF0ZSBhbmRyb2lkLm9zLklCaW5kZXIgbUlDYWxsQmFjawotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXByaXZhdGUgc3RhdGljIGFuZHJvaWQubWVkaWEuSUF1ZGlvU2VydmljZSBnZXRTZXJ2aWNlKCkKLQotcHJpdmF0ZSBib29sZWFuIHF1ZXJ5U291bmRFZmZlY3RzRW5hYmxlZCgpCi0KLXB1YmxpYyB2b2lkIGFkanVzdFN0cmVhbVZvbHVtZSgKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIGFkanVzdFN1Z2dlc3RlZFN0cmVhbVZvbHVtZSgKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIGFkanVzdFZvbHVtZSgKLWludAotaW50KQotCi1wdWJsaWMgaW50IGdldE1vZGUoKQotCi1wdWJsaWMgaW50IGdldFJpbmdlck1vZGUoKQotCi1wdWJsaWMgaW50IGdldFJvdXRpbmcoCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0U3RyZWFtTWF4Vm9sdW1lKAotaW50KQotCi1wdWJsaWMgaW50IGdldFN0cmVhbVZvbHVtZSgKLWludCkKLQotcHVibGljIGludCBnZXRWaWJyYXRlU2V0dGluZygKLWludCkKLQotcHVibGljIGJvb2xlYW4gaXNCbHVldG9vdGhTY29PbigpCi0KLXB1YmxpYyBib29sZWFuIGlzTWljcm9waG9uZU11dGUoKQotCi1wdWJsaWMgYm9vbGVhbiBpc011c2ljQWN0aXZlKCkKLQotcHVibGljIGJvb2xlYW4gaXNTcGVha2VycGhvbmVPbigpCi0KLXB1YmxpYyB2b2lkIGxvYWRTb3VuZEVmZmVjdHMoKQotCi1wdWJsaWMgdm9pZCBwbGF5U291bmRFZmZlY3QoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldEJsdWV0b290aFNjb09uKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0TWljcm9waG9uZU11dGUoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRNb2RlKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXIoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRSaW5nZXJNb2RlKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRSb3V0aW5nKAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgc2V0U3BlYWtlcnBob25lT24oCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRTdHJlYW1NdXRlKAotaW50Ci1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRTdHJlYW1Tb2xvKAotaW50Ci1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRTdHJlYW1Wb2x1bWUoCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRWaWJyYXRlU2V0dGluZygKLWludAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBzaG91bGRWaWJyYXRlKAotaW50KQotCi1wdWJsaWMgdm9pZCB1bmxvYWRTb3VuZEVmZmVjdHMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL21lZGlhL0F1ZGlvU3lzdGVtOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9RXJyb3JDYWxsYmFjayApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQubWVkaWEuQXVkaW9TeXN0ZW0kRXJyb3JDYWxsYmFjayBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvbkVycm9yKAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL21lZGlhL0F1ZGlvU2VydmljZTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotIGNsYXNzIGFuZHJvaWQubWVkaWEuQXVkaW9TZXJ2aWNlJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5tZWRpYS5BdWRpb1N5c3RlbSRFcnJvckNhbGxiYWNrCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQubWVkaWEuQXVkaW9TZXJ2aWNlIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQubWVkaWEuQXVkaW9TZXJ2aWNlKQotCi1wdWJsaWMgdm9pZCBvbkVycm9yKAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1PbkNvbXBsZXRpb25MaXN0ZW5lciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9tZWRpYS9NZWRpYVBsYXllcjsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyJE9uQ29tcGxldGlvbkxpc3RlbmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uQ29tcGxldGlvbigKLWFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotIGNsYXNzIGFuZHJvaWQubWVkaWEuQXVkaW9TZXJ2aWNlJEF1ZGlvSGFuZGxlciQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIkT25Db21wbGV0aW9uTGlzdGVuZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC5tZWRpYS5BdWRpb1NlcnZpY2UkQXVkaW9IYW5kbGVyIHRoaXMkMQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQubWVkaWEuQXVkaW9TZXJ2aWNlJEF1ZGlvSGFuZGxlcikKLQotcHVibGljIHZvaWQgb25Db21wbGV0aW9uKAotYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9tZWRpYS9NZWRpYVBsYXllcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPU9uRXJyb3JMaXN0ZW5lciApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIkT25FcnJvckxpc3RlbmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIG9uRXJyb3IoCi1hbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi0gY2xhc3MgYW5kcm9pZC5tZWRpYS5BdWRpb1NlcnZpY2UkQXVkaW9IYW5kbGVyJDIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllciRPbkVycm9yTGlzdGVuZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC5tZWRpYS5BdWRpb1NlcnZpY2UkQXVkaW9IYW5kbGVyIHRoaXMkMQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQubWVkaWEuQXVkaW9TZXJ2aWNlJEF1ZGlvSGFuZGxlcikKLQotcHVibGljIGJvb2xlYW4gb25FcnJvcigKLWFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIKLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MiBuYW1lID1BdWRpb0hhbmRsZXIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvbWVkaWEvQXVkaW9TZXJ2aWNlOyApCi0gY2xhc3MgYW5kcm9pZC5tZWRpYS5BdWRpb1NlcnZpY2UkQXVkaW9IYW5kbGVyIGV4dGVuZHMgYW5kcm9pZC5vcy5IYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQubWVkaWEuQXVkaW9TZXJ2aWNlIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm1lZGlhLkF1ZGlvU2VydmljZSkKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5tZWRpYS5BdWRpb1NlcnZpY2UKLWFuZHJvaWQubWVkaWEuQXVkaW9TZXJ2aWNlJDEpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQyMjAwKAotYW5kcm9pZC5tZWRpYS5BdWRpb1NlcnZpY2UkQXVkaW9IYW5kbGVyCi1hbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyKQotCi1wcml2YXRlIHZvaWQgY2xlYW51cFBsYXllcigKLWFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIpCi0KLXByaXZhdGUgdm9pZCBwZXJzaXN0UmluZ2VyTW9kZSgpCi0KLXByaXZhdGUgdm9pZCBwZXJzaXN0VmlicmF0ZVNldHRpbmcoKQotCi1wcml2YXRlIHZvaWQgcGVyc2lzdFZvbHVtZSgKLWFuZHJvaWQubWVkaWEuQXVkaW9TZXJ2aWNlJFZvbHVtZVN0cmVhbVN0YXRlKQotCi1wcml2YXRlIHZvaWQgcGxheVNvdW5kRWZmZWN0KAotaW50KQotCi1wcml2YXRlIHZvaWQgc2V0U3lzdGVtVm9sdW1lKAotYW5kcm9pZC5tZWRpYS5BdWRpb1NlcnZpY2UkVm9sdW1lU3RyZWFtU3RhdGUpCi0KLXB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvbWVkaWEvQXVkaW9TZXJ2aWNlOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTIgbmFtZSA9QXVkaW9TeXN0ZW1UaHJlYWQgKQotIGNsYXNzIGFuZHJvaWQubWVkaWEuQXVkaW9TZXJ2aWNlJEF1ZGlvU3lzdGVtVGhyZWFkIGV4dGVuZHMgamF2YS5sYW5nLlRocmVhZAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLm1lZGlhLkF1ZGlvU2VydmljZSB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm1lZGlhLkF1ZGlvU2VydmljZSkKLQotcHVibGljIHZvaWQgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9tZWRpYS9BdWRpb1NlcnZpY2UkVm9sdW1lU3RyZWFtU3RhdGU7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MiBuYW1lID1Wb2x1bWVEZWF0aEhhbmRsZXIgKQotIGNsYXNzIGFuZHJvaWQubWVkaWEuQXVkaW9TZXJ2aWNlJFZvbHVtZVN0cmVhbVN0YXRlJFZvbHVtZURlYXRoSGFuZGxlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLklCaW5kZXIkRGVhdGhSZWNpcGllbnQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLm9zLklCaW5kZXIgbUlDYWxsYmFjawotCi1wcml2YXRlIGludCBtTXV0ZUNvdW50Ci0KLWZpbmFsIGFuZHJvaWQubWVkaWEuQXVkaW9TZXJ2aWNlJFZvbHVtZVN0cmVhbVN0YXRlIHRoaXMkMQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQubWVkaWEuQXVkaW9TZXJ2aWNlJFZvbHVtZVN0cmVhbVN0YXRlCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDExMDAoCi1hbmRyb2lkLm1lZGlhLkF1ZGlvU2VydmljZSRWb2x1bWVTdHJlYW1TdGF0ZSRWb2x1bWVEZWF0aEhhbmRsZXIpCi0KLXN0YXRpYyBhbmRyb2lkLm9zLklCaW5kZXIgYWNjZXNzJDEyMDAoCi1hbmRyb2lkLm1lZGlhLkF1ZGlvU2VydmljZSRWb2x1bWVTdHJlYW1TdGF0ZSRWb2x1bWVEZWF0aEhhbmRsZXIpCi0KLXB1YmxpYyB2b2lkIGJpbmRlckRpZWQoKQotCi1wdWJsaWMgdm9pZCBtdXRlKAotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEgbmFtZSA9Vm9sdW1lU3RyZWFtU3RhdGUgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvbWVkaWEvQXVkaW9TZXJ2aWNlOyApCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL21lZGlhL0F1ZGlvU2VydmljZSRWb2x1bWVTdHJlYW1TdGF0ZSRWb2x1bWVEZWF0aEhhbmRsZXI7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLm1lZGlhLkF1ZGlvU2VydmljZSRWb2x1bWVTdHJlYW1TdGF0ZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0FycmF5TGlzdDxMYW5kcm9pZC9tZWRpYS9BdWRpb1NlcnZpY2UkVm9sdW1lU3RyZWFtU3RhdGUkVm9sdW1lRGVhdGhIYW5kbGVyOz47ICkKLXByaXZhdGUgamF2YS51dGlsLkFycmF5TGlzdCBtRGVhdGhIYW5kbGVycwotCi1wcml2YXRlIGludCBtSW5kZXgKLQotcHJpdmF0ZSBpbnQgbUxhc3RBdWRpYmxlSW5kZXgKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIG1MYXN0QXVkaWJsZVZvbHVtZUluZGV4U2V0dGluZ05hbWUKLQotcHJpdmF0ZSBmaW5hbCBpbnQgbVN0cmVhbVR5cGUKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIG1Wb2x1bWVJbmRleFNldHRpbmdOYW1lCi0KLXByaXZhdGUgZmluYWwgaW50W10gbVZvbHVtZXMKLQotZmluYWwgYW5kcm9pZC5tZWRpYS5BdWRpb1NlcnZpY2UgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQubWVkaWEuQXVkaW9TZXJ2aWNlCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludFtdKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm1lZGlhLkF1ZGlvU2VydmljZQotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnRbXQotYW5kcm9pZC5tZWRpYS5BdWRpb1NlcnZpY2UkMSkKLQotc3RhdGljIGludFtdIGFjY2VzcyQxNDAwKAotYW5kcm9pZC5tZWRpYS5BdWRpb1NlcnZpY2UkVm9sdW1lU3RyZWFtU3RhdGUpCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGFjY2VzcyQxNTAwKAotYW5kcm9pZC5tZWRpYS5BdWRpb1NlcnZpY2UkVm9sdW1lU3RyZWFtU3RhdGUpCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGFjY2VzcyQxNjAwKAotYW5kcm9pZC5tZWRpYS5BdWRpb1NlcnZpY2UkVm9sdW1lU3RyZWFtU3RhdGUpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDQwMCgKLWFuZHJvaWQubWVkaWEuQXVkaW9TZXJ2aWNlJFZvbHVtZVN0cmVhbVN0YXRlKQotCi1zdGF0aWMgaW50IGFjY2VzcyQ1MDAoCi1hbmRyb2lkLm1lZGlhLkF1ZGlvU2VydmljZSRWb2x1bWVTdHJlYW1TdGF0ZSkKLQotc3RhdGljIGludCBhY2Nlc3MkNjAwKAotYW5kcm9pZC5tZWRpYS5BdWRpb1NlcnZpY2UkVm9sdW1lU3RyZWFtU3RhdGUpCi0KLXN0YXRpYyBqYXZhLnV0aWwuQXJyYXlMaXN0IGFjY2VzcyQ4MDAoCi1hbmRyb2lkLm1lZGlhLkF1ZGlvU2VydmljZSRWb2x1bWVTdHJlYW1TdGF0ZSkKLQotc3RhdGljIGludCBhY2Nlc3MkOTAwKAotYW5kcm9pZC5tZWRpYS5BdWRpb1NlcnZpY2UkVm9sdW1lU3RyZWFtU3RhdGUpCi0KLXByaXZhdGUgYW5kcm9pZC5tZWRpYS5BdWRpb1NlcnZpY2UkVm9sdW1lU3RyZWFtU3RhdGUkVm9sdW1lRGVhdGhIYW5kbGVyIGdldERlYXRoSGFuZGxlcigKLWFuZHJvaWQub3MuSUJpbmRlcgotYm9vbGVhbikKLQotcHJpdmF0ZSBpbnQgZ2V0VmFsaWRJbmRleCgKLWludCkKLQotcHJpdmF0ZSBpbnQgbXV0ZUNvdW50KCkKLQotcHVibGljIGJvb2xlYW4gYWRqdXN0SW5kZXgoCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0TWF4SW5kZXgoKQotCi1wdWJsaWMgdm9pZCBtdXRlKAotYW5kcm9pZC5vcy5JQmluZGVyCi1ib29sZWFuKQotCi1wdWJsaWMgYm9vbGVhbiBzZXRJbmRleCgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL21lZGlhL0lBdWRpb1NlcnZpY2UkU3R1YjsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLm1lZGlhLklBdWRpb1NlcnZpY2UgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5JSW50ZXJmYWNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGFkanVzdFN0cmVhbVZvbHVtZSgKLWludAotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBhZGp1c3RTdWdnZXN0ZWRTdHJlYW1Wb2x1bWUoCi1pbnQKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgYWRqdXN0Vm9sdW1lKAotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldE1vZGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCBnZXRSaW5nZXJNb2RlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0Um91dGluZygKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0U3RyZWFtTWF4Vm9sdW1lKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCBnZXRTdHJlYW1Wb2x1bWUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldFZpYnJhdGVTZXR0aW5nKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNNaWNyb3Bob25lTXV0ZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc011c2ljQWN0aXZlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGxvYWRTb3VuZEVmZmVjdHMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgcGxheVNvdW5kRWZmZWN0KAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0TWljcm9waG9uZU11dGUoCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0TW9kZSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFBhcmFtZXRlcigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRSaW5nZXJNb2RlKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0Um91dGluZygKLWludAotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRTdHJlYW1NdXRlKAotaW50Ci1ib29sZWFuCi1hbmRyb2lkLm9zLklCaW5kZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRTdHJlYW1Tb2xvKAotaW50Ci1ib29sZWFuCi1hbmRyb2lkLm9zLklCaW5kZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRTdHJlYW1Wb2x1bWUoCi1pbnQKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0VmlicmF0ZVNldHRpbmcoCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHNob3VsZFZpYnJhdGUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB1bmxvYWRTb3VuZEVmZmVjdHMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvbWVkaWEvSUF1ZGlvU2VydmljZSRTdHViJFByb3h5OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwMzMgbmFtZSA9U3R1YiApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9tZWRpYS9JQXVkaW9TZXJ2aWNlOyApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC5tZWRpYS5JQXVkaW9TZXJ2aWNlJFN0dWIgZXh0ZW5kcyBhbmRyb2lkLm9zLkJpbmRlciBpbXBsZW1lbnRzIGFuZHJvaWQubWVkaWEuSUF1ZGlvU2VydmljZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFU0NSSVBUT1IKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9hZGp1c3RTdHJlYW1Wb2x1bWUKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9hZGp1c3RTdWdnZXN0ZWRTdHJlYW1Wb2x1bWUKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9hZGp1c3RWb2x1bWUKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9nZXRNb2RlCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZ2V0UmluZ2VyTW9kZQotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2dldFJvdXRpbmcKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9nZXRTdHJlYW1NYXhWb2x1bWUKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9nZXRTdHJlYW1Wb2x1bWUKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9nZXRWaWJyYXRlU2V0dGluZwotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2lzTWljcm9waG9uZU11dGUKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9pc011c2ljQWN0aXZlCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fbG9hZFNvdW5kRWZmZWN0cwotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3BsYXlTb3VuZEVmZmVjdAotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3NldE1pY3JvcGhvbmVNdXRlCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fc2V0TW9kZQotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3NldFBhcmFtZXRlcgotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3NldFJpbmdlck1vZGUKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9zZXRSb3V0aW5nCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fc2V0U3RyZWFtTXV0ZQotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3NldFN0cmVhbVNvbG8KLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9zZXRTdHJlYW1Wb2x1bWUKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9zZXRWaWJyYXRlU2V0dGluZwotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3Nob3VsZFZpYnJhdGUKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl91bmxvYWRTb3VuZEVmZmVjdHMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQubWVkaWEuSUF1ZGlvU2VydmljZSBhc0ludGVyZmFjZSgKLWFuZHJvaWQub3MuSUJpbmRlcikKLQotcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBvblRyYW5zYWN0KAotaW50Ci1hbmRyb2lkLm9zLlBhcmNlbAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL21lZGlhL0F1ZGlvU2VydmljZSRBdWRpb0hhbmRsZXI7TGFuZHJvaWQvbWVkaWEvQXVkaW9TZXJ2aWNlJEF1ZGlvU3lzdGVtVGhyZWFkO0xhbmRyb2lkL21lZGlhL0F1ZGlvU2VydmljZSRWb2x1bWVTdHJlYW1TdGF0ZTsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQubWVkaWEuQXVkaW9TZXJ2aWNlIGV4dGVuZHMgYW5kcm9pZC5tZWRpYS5JQXVkaW9TZXJ2aWNlJFN0dWIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19NRURJQV9TRVJWRVJfRElFRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX01FRElBX1NFUlZFUl9TVEFSVEVECi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfUEVSU0lTVF9SSU5HRVJfTU9ERQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1BFUlNJU1RfVklCUkFURV9TRVRUSU5HCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfUEVSU0lTVF9WT0xVTUUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19QTEFZX1NPVU5EX0VGRkVDVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1NFVF9TWVNURU1fVk9MVU1FCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOVU1fU09VTkRQT09MX0NIQU5ORUxTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQRVJTSVNUX0RFTEFZCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRU5ETVNHX05PT1AKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFTkRNU0dfUVVFVUUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFTkRNU0dfUkVQTEFDRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0hBUkVEX01TRwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNPVU5EX0VGRkVDVFNfUEFUSAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gU09VTkRfRUZGRUNUX0ZJTEVTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IFNPVU5EX0VGRkVDVF9WT0xVTUUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLQotcHJpdmF0ZSBpbnRbXVtdIFNPVU5EX0VGRkVDVF9GSUxFU19NQVAKLQotcHJpdmF0ZSBhbmRyb2lkLm1lZGlhLkF1ZGlvU2VydmljZSRBdWRpb0hhbmRsZXIgbUF1ZGlvSGFuZGxlcgotCi1wcml2YXRlIGFuZHJvaWQubWVkaWEuQXVkaW9TeXN0ZW0kRXJyb3JDYWxsYmFjayBtQXVkaW9TeXN0ZW1DYWxsYmFjawotCi1wcml2YXRlIGFuZHJvaWQubWVkaWEuQXVkaW9TZXJ2aWNlJEF1ZGlvU3lzdGVtVGhyZWFkIG1BdWRpb1N5c3RlbVRocmVhZAotCi1wcml2YXRlIGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIgbUNvbnRlbnRSZXNvbHZlcgotCi1wcml2YXRlIGFuZHJvaWQuY29udGVudC5Db250ZXh0IG1Db250ZXh0Ci0KLXByaXZhdGUgYm9vbGVhbiBtTWVkaWFTZXJ2ZXJPawotCi1wcml2YXRlIGJvb2xlYW4gbU1pY011dGUKLQotcHJpdmF0ZSBpbnQgbU1vZGUKLQotcHJpdmF0ZSBpbnQgbU11dGVBZmZlY3RlZFN0cmVhbXMKLQotcHJpdmF0ZSBpbnQgbVJpbmdlck1vZGUKLQotcHJpdmF0ZSBpbnQgbVJpbmdlck1vZGVBZmZlY3RlZFN0cmVhbXMKLQotcHJpdmF0ZSBpbnRbXSBtUm91dGVzCi0KLXByaXZhdGUgamF2YS5sYW5nLk9iamVjdCBtU2V0dGluZ3NMb2NrCi0KLXByaXZhdGUgamF2YS5sYW5nLk9iamVjdCBtU291bmRFZmZlY3RzTG9jawotCi1wcml2YXRlIGFuZHJvaWQubWVkaWEuU291bmRQb29sIG1Tb3VuZFBvb2wKLQotcHJpdmF0ZSBhbmRyb2lkLm1lZGlhLkF1ZGlvU2VydmljZSRWb2x1bWVTdHJlYW1TdGF0ZVtdIG1TdHJlYW1TdGF0ZXMKLQotcHJpdmF0ZSBpbnQgbVZpYnJhdGVTZXR0aW5nCi0KLXByaXZhdGUgYW5kcm9pZC52aWV3LlZvbHVtZVBhbmVsIG1Wb2x1bWVQYW5lbAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQwMDAoCi1hbmRyb2lkLm1lZGlhLkF1ZGlvU2VydmljZSkKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDAwMigKLWFuZHJvaWQubWVkaWEuQXVkaW9TZXJ2aWNlCi1ib29sZWFuKQotCi1zdGF0aWMgYW5kcm9pZC5tZWRpYS5BdWRpb1NlcnZpY2UkQXVkaW9IYW5kbGVyIGFjY2VzcyQxMDAoCi1hbmRyb2lkLm1lZGlhLkF1ZGlvU2VydmljZSkKLQotc3RhdGljIGludCBhY2Nlc3MkMTAwMCgKLWFuZHJvaWQubWVkaWEuQXVkaW9TZXJ2aWNlKQotCi1zdGF0aWMgYW5kcm9pZC5tZWRpYS5BdWRpb1NlcnZpY2UkQXVkaW9IYW5kbGVyIGFjY2VzcyQxMDIoCi1hbmRyb2lkLm1lZGlhLkF1ZGlvU2VydmljZQotYW5kcm9pZC5tZWRpYS5BdWRpb1NlcnZpY2UkQXVkaW9IYW5kbGVyKQotCi1zdGF0aWMgaW50IGFjY2VzcyQxNzAwKAotYW5kcm9pZC5tZWRpYS5BdWRpb1NlcnZpY2UpCi0KLXN0YXRpYyBqYXZhLmxhbmcuT2JqZWN0IGFjY2VzcyQxODAwKAotYW5kcm9pZC5tZWRpYS5BdWRpb1NlcnZpY2UpCi0KLXN0YXRpYyBhbmRyb2lkLm1lZGlhLlNvdW5kUG9vbCBhY2Nlc3MkMTkwMCgKLWFuZHJvaWQubWVkaWEuQXVkaW9TZXJ2aWNlKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMjAwKAotYW5kcm9pZC5vcy5IYW5kbGVyCi1pbnQKLWludAotaW50Ci1pbnQKLWludAotamF2YS5sYW5nLk9iamVjdAotaW50KQotCi1zdGF0aWMgaW50W11bXSBhY2Nlc3MkMjAwMCgKLWFuZHJvaWQubWVkaWEuQXVkaW9TZXJ2aWNlKQotCi1zdGF0aWMgamF2YS5sYW5nLlN0cmluZ1tdIGFjY2VzcyQyMTAwKCkKLQotc3RhdGljIGludCBhY2Nlc3MkMjMwMCgKLWludCkKLQotc3RhdGljIHZvaWQgYWNjZXNzJDI0MDAoCi1hbmRyb2lkLm1lZGlhLkF1ZGlvU2VydmljZSkKLQotc3RhdGljIGFuZHJvaWQubWVkaWEuQXVkaW9TZXJ2aWNlJFZvbHVtZVN0cmVhbVN0YXRlW10gYWNjZXNzJDI1MDAoCi1hbmRyb2lkLm1lZGlhLkF1ZGlvU2VydmljZSkKLQotc3RhdGljIGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIgYWNjZXNzJDcwMCgKLWFuZHJvaWQubWVkaWEuQXVkaW9TZXJ2aWNlKQotCi1wcml2YXRlIHZvaWQgYXBwbHlBdWRpb1NldHRpbmdzKCkKLQotcHJpdmF0ZSB2b2lkIGJyb2FkY2FzdFJpbmdlck1vZGUoKQotCi1wcml2YXRlIHZvaWQgYnJvYWRjYXN0VmlicmF0ZVNldHRpbmcoCi1pbnQpCi0KLXByaXZhdGUgYm9vbGVhbiBjaGVja0ZvclJpbmdlck1vZGVDaGFuZ2UoCi1pbnQKLWludCkKLQotcHJpdmF0ZSB2b2lkIGNyZWF0ZUF1ZGlvU3lzdGVtVGhyZWFkKCkKLQotcHJpdmF0ZSB2b2lkIGNyZWF0ZVN0cmVhbVN0YXRlcygpCi0KLXByaXZhdGUgc3RhdGljIGludFtdIGNyZWF0ZVZvbHVtZUxldmVscygKLWludAotaW50KQotCi1wcml2YXRlIHZvaWQgZW5zdXJlVmFsaWREaXJlY3Rpb24oCi1pbnQpCi0KLXByaXZhdGUgdm9pZCBlbnN1cmVWYWxpZFN0cmVhbVR5cGUoCi1pbnQpCi0KLXByaXZhdGUgaW50IGdldEFjdGl2ZVN0cmVhbVR5cGUoCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIGludCBnZXRNc2coCi1pbnQKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgaW50IGdldE1zZ0Jhc2UoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgaW50IGdldFZhbHVlRm9yVmlicmF0ZVNldHRpbmcoCi1pbnQKLWludAotaW50KQotCi1wcml2YXRlIHZvaWQgcmVhZEF1ZGlvU2V0dGluZ3MoKQotCi1wcml2YXRlIHZvaWQgcmVhZFBlcnNpc3RlZFNldHRpbmdzKCkKLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZW5kTXNnKAotYW5kcm9pZC5vcy5IYW5kbGVyCi1pbnQKLWludAotaW50Ci1pbnQKLWludAotamF2YS5sYW5nLk9iamVjdAotaW50KQotCi1wcml2YXRlIHZvaWQgc2V0U3RyZWFtVm9sdW1lSW50KAotaW50Ci1pbnQpCi0KLXByaXZhdGUgdm9pZCB3YWl0Rm9yQXVkaW9IYW5kbGVyQ3JlYXRpb24oKQotCi1wdWJsaWMgdm9pZCBhZGp1c3RTdHJlYW1Wb2x1bWUoCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBhZGp1c3RTdWdnZXN0ZWRTdHJlYW1Wb2x1bWUoCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBhZGp1c3RWb2x1bWUoCi1pbnQKLWludCkKLQotIGJvb2xlYW4gY2hlY2tBdWRpb1NldHRpbmdzUGVybWlzc2lvbigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBpbnQgZ2V0TW9kZSgpCi0KLXB1YmxpYyBpbnQgZ2V0UmluZ2VyTW9kZSgpCi0KLXB1YmxpYyBpbnQgZ2V0Um91dGluZygKLWludCkKLQotcHVibGljIGludCBnZXRTdHJlYW1NYXhWb2x1bWUoCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0U3RyZWFtVm9sdW1lKAotaW50KQotCi1wdWJsaWMgaW50IGdldFZpYnJhdGVTZXR0aW5nKAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBpc01pY3JvcGhvbmVNdXRlKCkKLQotcHVibGljIGJvb2xlYW4gaXNNdXNpY0FjdGl2ZSgpCi0KLXB1YmxpYyBib29sZWFuIGlzU3RyZWFtQWZmZWN0ZWRCeU11dGUoCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIGlzU3RyZWFtQWZmZWN0ZWRCeVJpbmdlck1vZGUoCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIGxvYWRTb3VuZEVmZmVjdHMoKQotCi1wdWJsaWMgdm9pZCBwbGF5U291bmRFZmZlY3QoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldE1pY3JvcGhvbmVNdXRlKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0TW9kZSgKLWludCkKLQotcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0UmluZ2VyTW9kZSgKLWludCkKLQotcHVibGljIHZvaWQgc2V0Um91dGluZygKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldFN0cmVhbU11dGUoCi1pbnQKLWJvb2xlYW4KLWFuZHJvaWQub3MuSUJpbmRlcikKLQotcHVibGljIHZvaWQgc2V0U3RyZWFtU29sbygKLWludAotYm9vbGVhbgotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgdm9pZCBzZXRTdHJlYW1Wb2x1bWUoCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRWaWJyYXRlU2V0dGluZygKLWludAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBzaG91bGRWaWJyYXRlKAotaW50KQotCi1wdWJsaWMgdm9pZCB1bmxvYWRTb3VuZEVmZmVjdHMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvbWVkaWEvQXVkaW9TeXN0ZW0kRXJyb3JDYWxsYmFjazsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQubWVkaWEuQXVkaW9TeXN0ZW0gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFVRElPX1NUQVRVU19FUlJPUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVURJT19TVEFUVVNfT0sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVVESU9fU1RBVFVTX1NFUlZFUl9ESUVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9WT0xVTUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlOX1ZPTFVNRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX0NVUlJFTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9JTlZBTElECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfSU5fQ0FMTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX05PUk1BTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX1JJTkdUT05FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5VTV9NT0RFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBOVU1fU1RSRUFNUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBST1VURV9BTEwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUk9VVEVfQkxVRVRPT1RICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJPVVRFX0VBUlBJRUNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJPVVRFX0hFQURTRVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUk9VVEVfU1BFQUtFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVFJFQU1fQUxBUk0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RSRUFNX01VU0lDCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUUkVBTV9SSU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUUkVBTV9TWVNURU0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RSRUFNX1ZPSUNFX0NBTEwKLQotcHJpdmF0ZSBzdGF0aWMgYW5kcm9pZC5tZWRpYS5BdWRpb1N5c3RlbSRFcnJvckNhbGxiYWNrIG1FcnJvckNhbGxiYWNrCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBlcnJvckNhbGxiYWNrRnJvbU5hdGl2ZSgKLWludCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGdldE1vZGUoKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgZ2V0Um91dGluZygKLWludCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGdldFZvbHVtZSgKLWludCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBpc01pY3JvcGhvbmVNdXRlZCgpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gaXNNdXNpY0FjdGl2ZSgpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBtdXRlTWljcm9waG9uZSgKLWJvb2xlYW4pCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRFcnJvckNhbGxiYWNrKAotYW5kcm9pZC5tZWRpYS5BdWRpb1N5c3RlbSRFcnJvckNhbGxiYWNrKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgc2V0TW9kZSgKLWludCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBzZXRQYXJhbWV0ZXIoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgc2V0Um91dGluZygKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBzZXRWb2x1bWUoCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTQxMDQgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9tZWRpYS9GYWNlRGV0ZWN0b3I7ICkKLSBjbGFzcyBhbmRyb2lkLm1lZGlhLkZhY2VEZXRlY3RvciQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xIG5hbWUgPUZhY2UgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvbWVkaWEvRmFjZURldGVjdG9yOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5tZWRpYS5GYWNlRGV0ZWN0b3IkRmFjZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBmbG9hdCBDT05GSURFTkNFX1RIUkVTSE9MRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVUxFUl9YCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVVTEVSX1kKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVVMRVJfWgotCi1wcml2YXRlIGZsb2F0IG1Db25maWRlbmNlCi0KLXByaXZhdGUgZmxvYXQgbUV5ZXNEaXN0Ci0KLXByaXZhdGUgZmxvYXQgbU1pZFBvaW50WAotCi1wcml2YXRlIGZsb2F0IG1NaWRQb2ludFkKLQotcHJpdmF0ZSBmbG9hdCBtUG9zZUV1bGVyWAotCi1wcml2YXRlIGZsb2F0IG1Qb3NlRXVsZXJZCi0KLXByaXZhdGUgZmxvYXQgbVBvc2VFdWxlcloKLQotZmluYWwgYW5kcm9pZC5tZWRpYS5GYWNlRGV0ZWN0b3IgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQubWVkaWEuRmFjZURldGVjdG9yKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm1lZGlhLkZhY2VEZXRlY3RvcgotYW5kcm9pZC5tZWRpYS5GYWNlRGV0ZWN0b3IkMSkKLQotcHVibGljIGZsb2F0IGNvbmZpZGVuY2UoKQotCi1wdWJsaWMgZmxvYXQgZXllc0Rpc3RhbmNlKCkKLQotcHVibGljIHZvaWQgZ2V0TWlkUG9pbnQoCi1hbmRyb2lkLmdyYXBoaWNzLlBvaW50RikKLQotcHVibGljIGZsb2F0IHBvc2UoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9tZWRpYS9GYWNlRGV0ZWN0b3IkMTtMYW5kcm9pZC9tZWRpYS9GYWNlRGV0ZWN0b3IkRmFjZTsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQubWVkaWEuRmFjZURldGVjdG9yIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGJ5dGVbXSBtQldCdWZmZXIKLQotcHJpdmF0ZSBpbnQgbUZECi0KLXByaXZhdGUgYnl0ZVtdIG1GYWNlRGF0YUFycmF5Ci0KLXByaXZhdGUgaW50IG1GYWNlRGF0YVNpemUKLQotcHJpdmF0ZSBpbnQgbUhlaWdodAotCi1wcml2YXRlIGludCBtTWF4RmFjZXMKLQotcHJpdmF0ZSBpbnQgbVdpZHRoCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWludAotaW50KQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIGZmdF9kZXN0cm95KCkKLQotcHJpdmF0ZSBuYXRpdmUgaW50IGZmdF9kZXRlY3QoCi1hbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCkKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBmZnRfZ2V0X2ZhY2UoCi1hbmRyb2lkLm1lZGlhLkZhY2VEZXRlY3RvciRGYWNlCi1pbnQpCi0KLXByaXZhdGUgbmF0aXZlIGludCBmZnRfaW5pdGlhbGl6ZSgKLWludAotaW50Ci1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZUNsYXNzSW5pdCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9UaHJvd2FibGU7ICkKLXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkKLQotcHVibGljIGludCBmaW5kRmFjZXMoCi1hbmRyb2lkLmdyYXBoaWNzLkJpdG1hcAotYW5kcm9pZC5tZWRpYS5GYWNlRGV0ZWN0b3IkRmFjZVtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9UHJveHkgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvbWVkaWEvSUF1ZGlvU2VydmljZSRTdHViOyApCi0gY2xhc3MgYW5kcm9pZC5tZWRpYS5JQXVkaW9TZXJ2aWNlJFN0dWIkUHJveHkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5tZWRpYS5JQXVkaW9TZXJ2aWNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5JQmluZGVyIG1SZW1vdGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLklCaW5kZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBhZGp1c3RTdHJlYW1Wb2x1bWUoCi1pbnQKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgYWRqdXN0U3VnZ2VzdGVkU3RyZWFtVm9sdW1lKAotaW50Ci1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGFkanVzdFZvbHVtZSgKLWludAotaW50KQotCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGdldE1vZGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXRSaW5nZXJNb2RlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgZ2V0Um91dGluZygKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgZ2V0U3RyZWFtTWF4Vm9sdW1lKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXRTdHJlYW1Wb2x1bWUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGdldFZpYnJhdGVTZXR0aW5nKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gaXNNaWNyb3Bob25lTXV0ZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBpc011c2ljQWN0aXZlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIGxvYWRTb3VuZEVmZmVjdHMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcGxheVNvdW5kRWZmZWN0KAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0TWljcm9waG9uZU11dGUoCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0TW9kZSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldFBhcmFtZXRlcigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRSaW5nZXJNb2RlKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0Um91dGluZygKLWludAotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRTdHJlYW1NdXRlKAotaW50Ci1ib29sZWFuCi1hbmRyb2lkLm9zLklCaW5kZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRTdHJlYW1Tb2xvKAotaW50Ci1ib29sZWFuCi1hbmRyb2lkLm9zLklCaW5kZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRTdHJlYW1Wb2x1bWUoCi1pbnQKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0VmlicmF0ZVNldHRpbmcoCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIHNob3VsZFZpYnJhdGUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB1bmxvYWRTb3VuZEVmZmVjdHMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvbWVkaWEvSU1lZGlhU2Nhbm5lckxpc3RlbmVyJFN0dWI7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5tZWRpYS5JTWVkaWFTY2FubmVyTGlzdGVuZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5JSW50ZXJmYWNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNjYW5Db21wbGV0ZWQoCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm5ldC5VcmkpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvbWVkaWEvSU1lZGlhU2Nhbm5lckxpc3RlbmVyJFN0dWI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9UHJveHkgKQotIGNsYXNzIGFuZHJvaWQubWVkaWEuSU1lZGlhU2Nhbm5lckxpc3RlbmVyJFN0dWIkUHJveHkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5tZWRpYS5JTWVkaWFTY2FubmVyTGlzdGVuZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLm9zLklCaW5kZXIgbVJlbW90ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuSUJpbmRlcikKLQotcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEludGVyZmFjZURlc2NyaXB0b3IoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2NhbkNvbXBsZXRlZCgKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQubmV0LlVyaSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwMzMgbmFtZSA9U3R1YiApCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL21lZGlhL0lNZWRpYVNjYW5uZXJMaXN0ZW5lciRTdHViJFByb3h5OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9tZWRpYS9JTWVkaWFTY2FubmVyTGlzdGVuZXI7ICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBhbmRyb2lkLm1lZGlhLklNZWRpYVNjYW5uZXJMaXN0ZW5lciRTdHViIGV4dGVuZHMgYW5kcm9pZC5vcy5CaW5kZXIgaW1wbGVtZW50cyBhbmRyb2lkLm1lZGlhLklNZWRpYVNjYW5uZXJMaXN0ZW5lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFU0NSSVBUT1IKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9zY2FuQ29tcGxldGVkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLm1lZGlhLklNZWRpYVNjYW5uZXJMaXN0ZW5lciBhc0ludGVyZmFjZSgKLWFuZHJvaWQub3MuSUJpbmRlcikKLQotcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBvblRyYW5zYWN0KAotaW50Ci1hbmRyb2lkLm9zLlBhcmNlbAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL21lZGlhL0lNZWRpYVNjYW5uZXJTZXJ2aWNlJFN0dWI7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5tZWRpYS5JTWVkaWFTY2FubmVyU2VydmljZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLklJbnRlcmZhY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgcmVxdWVzdFNjYW5GaWxlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5tZWRpYS5JTWVkaWFTY2FubmVyTGlzdGVuZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzY2FuRmlsZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1Qcm94eSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9tZWRpYS9JTWVkaWFTY2FubmVyU2VydmljZSRTdHViOyApCi0gY2xhc3MgYW5kcm9pZC5tZWRpYS5JTWVkaWFTY2FubmVyU2VydmljZSRTdHViJFByb3h5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQubWVkaWEuSU1lZGlhU2Nhbm5lclNlcnZpY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLm9zLklCaW5kZXIgbVJlbW90ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuSUJpbmRlcikKLQotcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEludGVyZmFjZURlc2NyaXB0b3IoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcmVxdWVzdFNjYW5GaWxlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5tZWRpYS5JTWVkaWFTY2FubmVyTGlzdGVuZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzY2FuRmlsZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9tZWRpYS9JTWVkaWFTY2FubmVyU2VydmljZSRTdHViJFByb3h5OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwMzMgbmFtZSA9U3R1YiApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9tZWRpYS9JTWVkaWFTY2FubmVyU2VydmljZTsgKQotcHVibGljIGFic3RyYWN0IGNsYXNzIGFuZHJvaWQubWVkaWEuSU1lZGlhU2Nhbm5lclNlcnZpY2UkU3R1YiBleHRlbmRzIGFuZHJvaWQub3MuQmluZGVyIGltcGxlbWVudHMgYW5kcm9pZC5tZWRpYS5JTWVkaWFTY2FubmVyU2VydmljZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFU0NSSVBUT1IKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9yZXF1ZXN0U2NhbkZpbGUKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9zY2FuRmlsZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5tZWRpYS5JTWVkaWFTY2FubmVyU2VydmljZSBhc0ludGVyZmFjZSgKLWFuZHJvaWQub3MuSUJpbmRlcikKLQotcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBvblRyYW5zYWN0KAotaW50Ci1hbmRyb2lkLm9zLlBhcmNlbAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9TWVkaWFGaWxlVHlwZSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9tZWRpYS9NZWRpYUZpbGU7ICkKLSBjbGFzcyBhbmRyb2lkLm1lZGlhLk1lZGlhRmlsZSRNZWRpYUZpbGVUeXBlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gaW50IGZpbGVUeXBlCi0KLSBqYXZhLmxhbmcuU3RyaW5nIG1pbWVUeXBlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvbWVkaWEvTWVkaWFGaWxlJE1lZGlhRmlsZVR5cGU7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLm1lZGlhLk1lZGlhRmlsZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9UWVBFXzNHUFAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9UWVBFXzNHUFAyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTEVfVFlQRV9BTVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9UWVBFX0FXQgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxFX1RZUEVfQk1QCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTEVfVFlQRV9HSUYKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9UWVBFX0lNWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxFX1RZUEVfSlBFRwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxFX1RZUEVfTTNVCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTEVfVFlQRV9NNEEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9UWVBFX000VgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxFX1RZUEVfTUlECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTEVfVFlQRV9NUDMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9UWVBFX01QNAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxFX1RZUEVfT0dHCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTEVfVFlQRV9QTFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9UWVBFX1BORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxFX1RZUEVfU01GCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTEVfVFlQRV9XQVYKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9UWVBFX1dCTVAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9UWVBFX1dNQQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxFX1RZUEVfV01WCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTEVfVFlQRV9XUEwKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZJUlNUX0FVRElPX0ZJTEVfVFlQRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRklSU1RfSU1BR0VfRklMRV9UWVBFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGSVJTVF9NSURJX0ZJTEVfVFlQRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRklSU1RfUExBWUxJU1RfRklMRV9UWVBFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGSVJTVF9WSURFT19GSUxFX1RZUEUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExBU1RfQVVESU9fRklMRV9UWVBFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMQVNUX0lNQUdFX0ZJTEVfVFlQRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTEFTVF9NSURJX0ZJTEVfVFlQRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTEFTVF9QTEFZTElTVF9GSUxFX1RZUEUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExBU1RfVklERU9fRklMRV9UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBVTktOT1dOX1NUUklORwotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgc0ZpbGVFeHRlbnNpb25zCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNoTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xhbmRyb2lkL21lZGlhL01lZGlhRmlsZSRNZWRpYUZpbGVUeXBlOz47ICkKLXByaXZhdGUgc3RhdGljIGphdmEudXRpbC5IYXNoTWFwIHNGaWxlVHlwZU1hcAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaE1hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL0ludGVnZXI7PjsgKQotcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLkhhc2hNYXAgc01pbWVUeXBlTWFwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1zdGF0aWMgdm9pZCBhZGRGaWxlVHlwZSgKLWphdmEubGFuZy5TdHJpbmcKLWludAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLm1lZGlhLk1lZGlhRmlsZSRNZWRpYUZpbGVUeXBlIGdldEZpbGVUeXBlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBpbnQgZ2V0RmlsZVR5cGVGb3JNaW1lVHlwZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0F1ZGlvRmlsZVR5cGUoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ltYWdlRmlsZVR5cGUoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1BsYXlMaXN0RmlsZVR5cGUoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZpZGVvRmlsZVR5cGUoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhUmV0cmlldmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVRBREFUQV9LRVlfQUxCVU0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVUQURBVEFfS0VZX0FSVElTVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVRBREFUQV9LRVlfQVVUSE9SCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FVEFEQVRBX0tFWV9DRF9UUkFDS19OVU1CRVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVUQURBVEFfS0VZX0NPTVBPU0VSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FVEFEQVRBX0tFWV9EQVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FVEFEQVRBX0tFWV9EVVJBVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVRBREFUQV9LRVlfR0VOUkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVUQURBVEFfS0VZX05VTV9UUkFDS1MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVUQURBVEFfS0VZX1RJVExFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FVEFEQVRBX0tFWV9ZRUFSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfQ0FQVFVSRV9GUkFNRV9PTkxZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfR0VUX01FVEFEQVRBX09OTFkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgZmluYWwgbmF0aXZlIHZvaWQgbmF0aXZlX2ZpbmFsaXplKCkKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVfc2V0dXAoKQotCi1wdWJsaWMgbmF0aXZlIGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwIGNhcHR1cmVGcmFtZSgpCi0KLXB1YmxpYyBuYXRpdmUgYnl0ZVtdIGV4dHJhY3RBbGJ1bUFydCgpCi0KLXB1YmxpYyBuYXRpdmUgamF2YS5sYW5nLlN0cmluZyBleHRyYWN0TWV0YWRhdGEoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9UaHJvd2FibGU7ICkKLXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIHJlbGVhc2UoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOyApCi1wdWJsaWMgbmF0aXZlIHZvaWQgc2V0RGF0YVNvdXJjZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBzZXRNb2RlKAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MiBuYW1lID1FdmVudEhhbmRsZXIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvbWVkaWEvTWVkaWFQbGF5ZXI7ICkKLSBjbGFzcyBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyJEV2ZW50SGFuZGxlciBleHRlbmRzIGFuZHJvaWQub3MuSGFuZGxlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIgbU1lZGlhUGxheWVyCi0KLWZpbmFsIGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcgotYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcgotYW5kcm9pZC5vcy5Mb29wZXIpCi0KLXB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPU9uQnVmZmVyaW5nVXBkYXRlTGlzdGVuZXIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvbWVkaWEvTWVkaWFQbGF5ZXI7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllciRPbkJ1ZmZlcmluZ1VwZGF0ZUxpc3RlbmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uQnVmZmVyaW5nVXBkYXRlKAotYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcgotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL21lZGlhL01lZGlhUGxheWVyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9T25QcmVwYXJlZExpc3RlbmVyICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllciRPblByZXBhcmVkTGlzdGVuZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgb25QcmVwYXJlZCgKLWFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvbWVkaWEvTWVkaWFQbGF5ZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1PblNlZWtDb21wbGV0ZUxpc3RlbmVyICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllciRPblNlZWtDb21wbGV0ZUxpc3RlbmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uU2Vla0NvbXBsZXRlKAotYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL21lZGlhL01lZGlhUGxheWVyJE9uRXJyb3JMaXN0ZW5lcjtMYW5kcm9pZC9tZWRpYS9NZWRpYVBsYXllciRPblNlZWtDb21wbGV0ZUxpc3RlbmVyO0xhbmRyb2lkL21lZGlhL01lZGlhUGxheWVyJE9uQnVmZmVyaW5nVXBkYXRlTGlzdGVuZXI7TGFuZHJvaWQvbWVkaWEvTWVkaWFQbGF5ZXIkT25Db21wbGV0aW9uTGlzdGVuZXI7TGFuZHJvaWQvbWVkaWEvTWVkaWFQbGF5ZXIkT25QcmVwYXJlZExpc3RlbmVyO0xhbmRyb2lkL21lZGlhL01lZGlhUGxheWVyJEV2ZW50SGFuZGxlcjsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFUlJPUl9DT05URU5UX0lTX1BPT1JMWV9JTlRFUkxFQVZFRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfU0VFS19OT1RfU1VQUE9SVEVECi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFUlJPUl9WSURFT19UUkFDS19JU19GQUxMSU5HX0JFSElORAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVESUFfQlVGRkVSSU5HX1VQREFURQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVESUFfRVJST1IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVESUFfRVJST1JfU0VSVkVSX0RJRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVESUFfRVJST1JfVU5LTk9XTgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVESUFfTk9QCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRURJQV9QTEFZQkFDS19DT01QTEVURQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVESUFfUFJFUEFSRUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FRElBX1NFRUtfQ09NUExFVEUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLQotcHJpdmF0ZSBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyJEV2ZW50SGFuZGxlciBtRXZlbnRIYW5kbGVyCi0KLXByaXZhdGUgaW50IG1MaXN0ZW5lckNvbnRleHQKLQotcHJpdmF0ZSBpbnQgbU5hdGl2ZUNvbnRleHQKLQotcHJpdmF0ZSBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyJE9uQnVmZmVyaW5nVXBkYXRlTGlzdGVuZXIgbU9uQnVmZmVyaW5nVXBkYXRlTGlzdGVuZXIKLQotcHJpdmF0ZSBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyJE9uQ29tcGxldGlvbkxpc3RlbmVyIG1PbkNvbXBsZXRpb25MaXN0ZW5lcgotCi1wcml2YXRlIGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIkT25FcnJvckxpc3RlbmVyIG1PbkVycm9yTGlzdGVuZXIKLQotcHJpdmF0ZSBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyJE9uUHJlcGFyZWRMaXN0ZW5lciBtT25QcmVwYXJlZExpc3RlbmVyCi0KLXByaXZhdGUgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllciRPblNlZWtDb21wbGV0ZUxpc3RlbmVyIG1PblNlZWtDb21wbGV0ZUxpc3RlbmVyCi0KLXByaXZhdGUgYm9vbGVhbiBtU2NyZWVuT25XaGlsZVBsYXlpbmcKLQotcHJpdmF0ZSBib29sZWFuIG1TdGF5QXdha2UKLQotcHJpdmF0ZSBhbmRyb2lkLnZpZXcuU3VyZmFjZSBtU3VyZmFjZQotCi1wcml2YXRlIGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyIG1TdXJmYWNlSG9sZGVyCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5Qb3dlck1hbmFnZXIkV2FrZUxvY2sgbVdha2VMb2NrCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uOyApCi1wcml2YXRlIG5hdGl2ZSB2b2lkIF9wYXVzZSgpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgX3JlbGVhc2UoKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIF9yZXNldCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247ICkKLXByaXZhdGUgbmF0aXZlIHZvaWQgX3N0YXJ0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsgKQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBfc3RvcCgpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDAwMCgKLWFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIpCi0KLXN0YXRpYyBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyJE9uUHJlcGFyZWRMaXN0ZW5lciBhY2Nlc3MkMTAwKAotYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcikKLQotc3RhdGljIGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIkT25Db21wbGV0aW9uTGlzdGVuZXIgYWNjZXNzJDIwMCgKLWFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQzMDAoCi1hbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyCi1ib29sZWFuKQotCi1zdGF0aWMgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllciRPbkJ1ZmZlcmluZ1VwZGF0ZUxpc3RlbmVyIGFjY2VzcyQ0MDAoCi1hbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyKQotCi1zdGF0aWMgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllciRPblNlZWtDb21wbGV0ZUxpc3RlbmVyIGFjY2VzcyQ1MDAoCi1hbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyKQotCi1zdGF0aWMgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllciRPbkVycm9yTGlzdGVuZXIgYWNjZXNzJDYwMCgKLWFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllciBjcmVhdGUoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotaW50KQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIgY3JlYXRlKAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQubmV0LlVyaSkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyIGNyZWF0ZSgKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLm5ldC5VcmkKLWFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyKQotCi1wcml2YXRlIGZpbmFsIG5hdGl2ZSB2b2lkIG5hdGl2ZV9maW5hbGl6ZSgpCi0KLXByaXZhdGUgZmluYWwgbmF0aXZlIHZvaWQgbmF0aXZlX3NldHVwKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBwb3N0RXZlbnRGcm9tTmF0aXZlKAotamF2YS5sYW5nLk9iamVjdAotaW50Ci1pbnQKLWludAotamF2YS5sYW5nLk9iamVjdCkKLQotcHJpdmF0ZSB2b2lkIHN0YXlBd2FrZSgKLWJvb2xlYW4pCi0KLXByaXZhdGUgdm9pZCB1cGRhdGVTdXJmYWNlU2NyZWVuT24oKQotCi1wcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpCi0KLXB1YmxpYyBuYXRpdmUgaW50IGdldEN1cnJlbnRQb3NpdGlvbigpCi0KLXB1YmxpYyBuYXRpdmUgaW50IGdldER1cmF0aW9uKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsgKQotcHVibGljIG5hdGl2ZSBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCBnZXRGcmFtZUF0KAotaW50KQotCi1wdWJsaWMgbmF0aXZlIGludCBnZXRWaWRlb0hlaWdodCgpCi0KLXB1YmxpYyBuYXRpdmUgaW50IGdldFZpZGVvV2lkdGgoKQotCi1wdWJsaWMgbmF0aXZlIGJvb2xlYW4gaXNQbGF5aW5nKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcGF1c2UoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgbmF0aXZlIHZvaWQgcHJlcGFyZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBuYXRpdmUgdm9pZCBwcmVwYXJlQXN5bmMoKQotCi1wdWJsaWMgdm9pZCByZWxlYXNlKCkKLQotcHVibGljIHZvaWQgcmVzZXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgbmF0aXZlIHZvaWQgc2Vla1RvKAotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgc2V0QXVkaW9TdHJlYW1UeXBlKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uO0xqYXZhL2xhbmcvU2VjdXJpdHlFeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldERhdGFTb3VyY2UoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC5uZXQuVXJpKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXREYXRhU291cmNlKAotamF2YS5pby5GaWxlRGVzY3JpcHRvcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjtMamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsgKQotcHVibGljIG5hdGl2ZSB2b2lkIHNldERhdGFTb3VyY2UoCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1sb25nCi1sb25nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgbmF0aXZlIHZvaWQgc2V0RGF0YVNvdXJjZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHNldERpc3BsYXkoCi1hbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlcikKLQotcHVibGljIG5hdGl2ZSB2b2lkIHNldExvb3BpbmcoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRPbkJ1ZmZlcmluZ1VwZGF0ZUxpc3RlbmVyKAotYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllciRPbkJ1ZmZlcmluZ1VwZGF0ZUxpc3RlbmVyKQotCi1wdWJsaWMgdm9pZCBzZXRPbkNvbXBsZXRpb25MaXN0ZW5lcigKLWFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIkT25Db21wbGV0aW9uTGlzdGVuZXIpCi0KLXB1YmxpYyB2b2lkIHNldE9uRXJyb3JMaXN0ZW5lcigKLWFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIkT25FcnJvckxpc3RlbmVyKQotCi1wdWJsaWMgdm9pZCBzZXRPblByZXBhcmVkTGlzdGVuZXIoCi1hbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyJE9uUHJlcGFyZWRMaXN0ZW5lcikKLQotcHVibGljIHZvaWQgc2V0T25TZWVrQ29tcGxldGVMaXN0ZW5lcigKLWFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIkT25TZWVrQ29tcGxldGVMaXN0ZW5lcikKLQotcHVibGljIHZvaWQgc2V0U2NyZWVuT25XaGlsZVBsYXlpbmcoCi1ib29sZWFuKQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgc2V0Vm9sdW1lKAotZmxvYXQKLWZsb2F0KQotCi1wdWJsaWMgdm9pZCBzZXRXYWtlTW9kZSgKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHN0YXJ0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc3RvcCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvbWVkaWEvTWVkaWFSZWNvcmRlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNyBuYW1lID1BdWRpb0VuY29kZXIgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQubWVkaWEuTWVkaWFSZWNvcmRlciRBdWRpb0VuY29kZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFNUl9OQgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUCi0KLWZpbmFsIGFuZHJvaWQubWVkaWEuTWVkaWFSZWNvcmRlciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5tZWRpYS5NZWRpYVJlY29yZGVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL21lZGlhL01lZGlhUmVjb3JkZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTcgbmFtZSA9QXVkaW9Tb3VyY2UgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQubWVkaWEuTWVkaWFSZWNvcmRlciRBdWRpb1NvdXJjZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSUMKLQotZmluYWwgYW5kcm9pZC5tZWRpYS5NZWRpYVJlY29yZGVyIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm1lZGlhLk1lZGlhUmVjb3JkZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvbWVkaWEvTWVkaWFSZWNvcmRlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNyBuYW1lID1PdXRwdXRGb3JtYXQgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQubWVkaWEuTWVkaWFSZWNvcmRlciRPdXRwdXRGb3JtYXQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVBFR180Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRIUkVFX0dQUAotCi1maW5hbCBhbmRyb2lkLm1lZGlhLk1lZGlhUmVjb3JkZXIgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQubWVkaWEuTWVkaWFSZWNvcmRlcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9tZWRpYS9NZWRpYVJlY29yZGVyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE3IG5hbWUgPVZpZGVvRW5jb2RlciApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5tZWRpYS5NZWRpYVJlY29yZGVyJFZpZGVvRW5jb2RlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBIMjYzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEgyNjQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVBFR180X1NQCi0KLWZpbmFsIGFuZHJvaWQubWVkaWEuTWVkaWFSZWNvcmRlciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5tZWRpYS5NZWRpYVJlY29yZGVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTcgbmFtZSA9VmlkZW9Tb3VyY2UgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvbWVkaWEvTWVkaWFSZWNvcmRlcjsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQubWVkaWEuTWVkaWFSZWNvcmRlciRWaWRlb1NvdXJjZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FNRVJBCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFQKLQotZmluYWwgYW5kcm9pZC5tZWRpYS5NZWRpYVJlY29yZGVyIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm1lZGlhLk1lZGlhUmVjb3JkZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9tZWRpYS9NZWRpYVJlY29yZGVyJFZpZGVvRW5jb2RlcjtMYW5kcm9pZC9tZWRpYS9NZWRpYVJlY29yZGVyJEF1ZGlvRW5jb2RlcjtMYW5kcm9pZC9tZWRpYS9NZWRpYVJlY29yZGVyJE91dHB1dEZvcm1hdDtMYW5kcm9pZC9tZWRpYS9NZWRpYVJlY29yZGVyJFZpZGVvU291cmNlO0xhbmRyb2lkL21lZGlhL01lZGlhUmVjb3JkZXIkQXVkaW9Tb3VyY2U7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLm1lZGlhLk1lZGlhUmVjb3JkZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEFHCi0KLXByaXZhdGUgaW50IG1OYXRpdmVDb250ZXh0Ci0KLXByaXZhdGUgYW5kcm9pZC52aWV3LlN1cmZhY2UgbVN1cmZhY2UKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgdm9pZCBsb2coCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIGZpbmFsIG5hdGl2ZSB2b2lkIG5hdGl2ZV9maW5hbGl6ZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247ICkKLXByaXZhdGUgZmluYWwgbmF0aXZlIHZvaWQgbmF0aXZlX3NldHVwKCkKLQotcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgbmF0aXZlIGludCBnZXRNYXhBbXBsaXR1ZGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgbmF0aXZlIHZvaWQgcHJlcGFyZSgpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCByZWxlYXNlKCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIHJlc2V0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsgKQotcHVibGljIG5hdGl2ZSB2b2lkIHNldEF1ZGlvRW5jb2RlcigKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsgKQotcHVibGljIG5hdGl2ZSB2b2lkIHNldEF1ZGlvU291cmNlKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgbmF0aXZlIHZvaWQgc2V0T3V0cHV0RmlsZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBuYXRpdmUgdm9pZCBzZXRPdXRwdXRGb3JtYXQoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldFByZXZpZXdEaXNwbGF5KAotYW5kcm9pZC52aWV3LlN1cmZhY2UpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBuYXRpdmUgdm9pZCBzZXRWaWRlb0VuY29kZXIoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBuYXRpdmUgdm9pZCBzZXRWaWRlb0ZyYW1lUmF0ZSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsgKQotcHVibGljIG5hdGl2ZSB2b2lkIHNldFZpZGVvU2l6ZSgKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgbmF0aXZlIHZvaWQgc2V0VmlkZW9Tb3VyY2UoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBuYXRpdmUgdm9pZCBzdGFydCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBuYXRpdmUgdm9pZCBzdG9wKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTQxMDQgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9tZWRpYS9NZWRpYVNjYW5uZXI7ICkKLSBjbGFzcyBhbmRyb2lkLm1lZGlhLk1lZGlhU2Nhbm5lciQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvbWVkaWEvTWVkaWFTY2FubmVyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPUZpbGVDYWNoZUVudHJ5ICkKLSBjbGFzcyBhbmRyb2lkLm1lZGlhLk1lZGlhU2Nhbm5lciRGaWxlQ2FjaGVFbnRyeSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGxvbmcgbUxhc3RNb2RpZmllZAotCi0gYm9vbGVhbiBtTGFzdE1vZGlmaWVkQ2hhbmdlZAotCi0gamF2YS5sYW5nLlN0cmluZyBtUGF0aAotCi0gbG9uZyBtUm93SWQKLQotIGJvb2xlYW4gbVNlZW5JbkZpbGVTeXN0ZW0KLQotIGFuZHJvaWQubmV0LlVyaSBtVGFibGVVcmkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm5ldC5VcmkKLWxvbmcKLWphdmEubGFuZy5TdHJpbmcKLWxvbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5tZWRpYS5NZWRpYVNjYW5uZXJDbGllbnQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgaGFuZGxlU3RyaW5nVGFnKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2NhbkZpbGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1sb25nCi1sb25nKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzY2FuRmlsZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWxvbmcKLWxvbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldE1pbWVUeXBlKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9tZWRpYS9NZWRpYVNjYW5uZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MiBuYW1lID1NeU1lZGlhU2Nhbm5lckNsaWVudCApCi0gY2xhc3MgYW5kcm9pZC5tZWRpYS5NZWRpYVNjYW5uZXIkTXlNZWRpYVNjYW5uZXJDbGllbnQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5tZWRpYS5NZWRpYVNjYW5uZXJDbGllbnQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1BbGJ1bQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbUFsYnVtQXJ0aXN0Ci0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtQXJ0aXN0Ci0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtQ29tcG9zZXIKLQotcHJpdmF0ZSBpbnQgbUR1cmF0aW9uCi0KLXByaXZhdGUgbG9uZyBtRmlsZVNpemUKLQotcHJpdmF0ZSBpbnQgbUZpbGVUeXBlCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtR2VucmUKLQotcHJpdmF0ZSBsb25nIG1MYXN0TW9kaWZpZWQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1NaW1lVHlwZQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbVBhdGgKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1UaXRsZQotCi1wcml2YXRlIGludCBtVHJhY2sKLQotcHJpdmF0ZSBpbnQgbVllYXIKLQotZmluYWwgYW5kcm9pZC5tZWRpYS5NZWRpYVNjYW5uZXIgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQubWVkaWEuTWVkaWFTY2FubmVyKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm1lZGlhLk1lZGlhU2Nhbm5lcgotYW5kcm9pZC5tZWRpYS5NZWRpYVNjYW5uZXIkMSkKLQotcHJpdmF0ZSBib29sZWFuIGRvZXNQYXRoSGF2ZUZpbGVuYW1lKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBpbnQgcGFyc2VTdWJzdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludCkKLQotcHJpdmF0ZSB2b2lkIHNldFNldHRpbmdJZk5vdFNldCgKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQubmV0LlVyaQotbG9uZykKLQotcHJpdmF0ZSBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlcyB0b1ZhbHVlcygpCi0KLXB1YmxpYyBhbmRyb2lkLm1lZGlhLk1lZGlhU2Nhbm5lciRGaWxlQ2FjaGVFbnRyeSBiZWdpbkZpbGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1sb25nCi1sb25nKQotCi1wdWJsaWMgYW5kcm9pZC5uZXQuVXJpIGRvU2NhbkZpbGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1sb25nCi1sb25nCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFuZHJvaWQubmV0LlVyaSBlbmRGaWxlKAotYW5kcm9pZC5tZWRpYS5NZWRpYVNjYW5uZXIkRmlsZUNhY2hlRW50cnkKLWJvb2xlYW4KLWJvb2xlYW4KLWJvb2xlYW4KLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIGhhbmRsZVN0cmluZ1RhZygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHNjYW5GaWxlKAotamF2YS5sYW5nLlN0cmluZwotbG9uZwotbG9uZykKLQotcHVibGljIHZvaWQgc2NhbkZpbGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1sb25nCi1sb25nKQotCi1wdWJsaWMgdm9pZCBzZXRNaW1lVHlwZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQuc2F4LlN0YXJ0RWxlbWVudExpc3RlbmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHN0YXJ0KAotb3JnLnhtbC5zYXguQXR0cmlidXRlcykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5zYXguRW5kRWxlbWVudExpc3RlbmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGVuZCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQuc2F4LkVsZW1lbnRMaXN0ZW5lciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnNheC5TdGFydEVsZW1lbnRMaXN0ZW5lciwgYW5kcm9pZC5zYXguRW5kRWxlbWVudExpc3RlbmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9V3BsSGFuZGxlciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9tZWRpYS9NZWRpYVNjYW5uZXI7ICkKLSBjbGFzcyBhbmRyb2lkLm1lZGlhLk1lZGlhU2Nhbm5lciRXcGxIYW5kbGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQuc2F4LkVsZW1lbnRMaXN0ZW5lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciBoYW5kbGVyCi0KLSBpbnQgaW5kZXgKLQotIGphdmEubGFuZy5TdHJpbmcgcGxheUxpc3REaXJlY3RvcnkKLQotZmluYWwgYW5kcm9pZC5tZWRpYS5NZWRpYVNjYW5uZXIgdGhpcyQwCi0KLSBhbmRyb2lkLm5ldC5VcmkgdXJpCi0KLSBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlcyB2YWx1ZXMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm1lZGlhLk1lZGlhU2Nhbm5lcgotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5uZXQuVXJpKQotCi1wdWJsaWMgdm9pZCBlbmQoKQotCi0gb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIgZ2V0Q29udGVudEhhbmRsZXIoKQotCi1wdWJsaWMgdm9pZCBzdGFydCgKLW9yZy54bWwuc2F4LkF0dHJpYnV0ZXMpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9tZWRpYS9NZWRpYVNjYW5uZXIkMTtMYW5kcm9pZC9tZWRpYS9NZWRpYVNjYW5uZXIkV3BsSGFuZGxlcjtMYW5kcm9pZC9tZWRpYS9NZWRpYVNjYW5uZXIkTXlNZWRpYVNjYW5uZXJDbGllbnQ7TGFuZHJvaWQvbWVkaWEvTWVkaWFTY2FubmVyJEZpbGVDYWNoZUVudHJ5OyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5tZWRpYS5NZWRpYVNjYW5uZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUxBUk1TX0RJUgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gQVVESU9fUFJPSkVDVElPTgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREFURV9NT0RJRklFRF9BVURJT19DT0xVTU5fSU5ERVgKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERBVEVfTU9ESUZJRURfSU1BR0VTX0NPTFVNTl9JTkRFWAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREFURV9NT0RJRklFRF9QTEFZTElTVFNfQ09MVU1OX0lOREVYCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEQVRFX01PRElGSUVEX1ZJREVPX0NPTFVNTl9JTkRFWAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFRkFVTFRfUklOR1RPTkVfUFJPUEVSVFlfUFJFRklYCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmdbXSBHRU5SRV9MT09LVVBfUFJPSkVDVElPTgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gSUQzX0dFTlJFUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSURfQVVESU9fQ09MVU1OX0lOREVYCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJRF9JTUFHRVNfQ09MVU1OX0lOREVYCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJRF9QTEFZTElTVFNfQ09MVU1OX0lOREVYCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJRF9WSURFT19DT0xVTU5fSU5ERVgKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZ1tdIElNQUdFU19QUk9KRUNUSU9OCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTVVTSUNfRElSCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTk9USUZJQ0FUSU9OU19ESVIKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBVEhfQVVESU9fQ09MVU1OX0lOREVYCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQQVRIX0lNQUdFU19DT0xVTU5fSU5ERVgKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBVEhfUExBWUxJU1RTX0NPTFVNTl9JTkRFWAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEFUSF9WSURFT19DT0xVTU5fSU5ERVgKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZ1tdIFBMQVlMSVNUU19QUk9KRUNUSU9OCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmdbXSBQTEFZTElTVF9NRU1CRVJTX1BST0pFQ1RJT04KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSSU5HVE9ORVNfRElSCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEFHCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmdbXSBWSURFT19QUk9KRUNUSU9OCi0KLXByaXZhdGUgYW5kcm9pZC5uZXQuVXJpIG1BdWRpb1VyaQotCi1wcml2YXRlIGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeSRPcHRpb25zIG1CaXRtYXBPcHRpb25zCi0KLXByaXZhdGUgYm9vbGVhbiBtQ2FzZUluc2Vuc2l0aXZlUGF0aHMKLQotcHJpdmF0ZSBhbmRyb2lkLm1lZGlhLk1lZGlhU2Nhbm5lciRNeU1lZGlhU2Nhbm5lckNsaWVudCBtQ2xpZW50Ci0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgbUNvbnRleHQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1EZWZhdWx0Tm90aWZpY2F0aW9uRmlsZW5hbWUKLQotcHJpdmF0ZSBib29sZWFuIG1EZWZhdWx0Tm90aWZpY2F0aW9uU2V0Ci0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtRGVmYXVsdFJpbmd0b25lRmlsZW5hbWUKLQotcHJpdmF0ZSBib29sZWFuIG1EZWZhdWx0UmluZ3RvbmVTZXQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0hhc2hNYXA8TGphdmEvbGFuZy9TdHJpbmc7TGFuZHJvaWQvbWVkaWEvTWVkaWFTY2FubmVyJEZpbGVDYWNoZUVudHJ5Oz47ICkKLXByaXZhdGUgamF2YS51dGlsLkhhc2hNYXAgbUZpbGVDYWNoZQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaE1hcDxMamF2YS9sYW5nL1N0cmluZztMYW5kcm9pZC9uZXQvVXJpOz47ICkKLXByaXZhdGUgamF2YS51dGlsLkhhc2hNYXAgbUdlbnJlQ2FjaGUKLQotcHJpdmF0ZSBhbmRyb2lkLm5ldC5VcmkgbUdlbnJlc1VyaQotCi1wcml2YXRlIGFuZHJvaWQubmV0LlVyaSBtSW1hZ2VzVXJpCi0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LklDb250ZW50UHJvdmlkZXIgbU1lZGlhUHJvdmlkZXIKLQotcHJpdmF0ZSBpbnQgbU5hdGl2ZUNvbnRleHQKLQotcHJpdmF0ZSBpbnQgbU9yaWdpbmFsQ291bnQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0FycmF5TGlzdDxMYW5kcm9pZC9tZWRpYS9NZWRpYVNjYW5uZXIkRmlsZUNhY2hlRW50cnk7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuQXJyYXlMaXN0IG1QbGF5TGlzdHMKLQotcHJpdmF0ZSBhbmRyb2lkLm5ldC5VcmkgbVBsYXlsaXN0c1VyaQotCi1wcml2YXRlIGJvb2xlYW4gbVByb2Nlc3NHZW5yZXMKLQotcHJpdmF0ZSBib29sZWFuIG1Qcm9jZXNzUGxheWxpc3RzCi0KLXByaXZhdGUgYW5kcm9pZC5uZXQuVXJpIG1UaHVtYnNVcmkKLQotcHJpdmF0ZSBhbmRyb2lkLm5ldC5VcmkgbVZpZGVvVXJpCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDEwMCgKLWFuZHJvaWQubWVkaWEuTWVkaWFTY2FubmVyKQotCi1zdGF0aWMgYW5kcm9pZC5jb250ZW50LklDb250ZW50UHJvdmlkZXIgYWNjZXNzJDEwMDAoCi1hbmRyb2lkLm1lZGlhLk1lZGlhU2Nhbm5lcikKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDExMDAoCi1hbmRyb2lkLm1lZGlhLk1lZGlhU2Nhbm5lcikKLQotc3RhdGljIGphdmEudXRpbC5IYXNoTWFwIGFjY2VzcyQxMjAwKAotYW5kcm9pZC5tZWRpYS5NZWRpYVNjYW5uZXIpCi0KLXN0YXRpYyBhbmRyb2lkLm5ldC5VcmkgYWNjZXNzJDEzMDAoCi1hbmRyb2lkLm1lZGlhLk1lZGlhU2Nhbm5lcikKLQotc3RhdGljIGphdmEubGFuZy5TdHJpbmdbXSBhY2Nlc3MkMTQwMCgpCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQxNTAwKAotYW5kcm9pZC5tZWRpYS5NZWRpYVNjYW5uZXIpCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQxNTAyKAotYW5kcm9pZC5tZWRpYS5NZWRpYVNjYW5uZXIKLWJvb2xlYW4pCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGFjY2VzcyQxNjAwKAotYW5kcm9pZC5tZWRpYS5NZWRpYVNjYW5uZXIpCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQxNzAwKAotYW5kcm9pZC5tZWRpYS5NZWRpYVNjYW5uZXIpCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQxNzAyKAotYW5kcm9pZC5tZWRpYS5NZWRpYVNjYW5uZXIKLWJvb2xlYW4pCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGFjY2VzcyQxODAwKAotYW5kcm9pZC5tZWRpYS5NZWRpYVNjYW5uZXIpCi0KLXN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBhY2Nlc3MkMTkwMCgKLWFuZHJvaWQubWVkaWEuTWVkaWFTY2FubmVyKQotCi1zdGF0aWMgamF2YS51dGlsLkhhc2hNYXAgYWNjZXNzJDIwMCgKLWFuZHJvaWQubWVkaWEuTWVkaWFTY2FubmVyKQotCi1zdGF0aWMgYm9vbGVhbiBhY2Nlc3MkMjAwMCgKLWFuZHJvaWQubWVkaWEuTWVkaWFTY2FubmVyCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm5ldC5VcmkKLWFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzCi1pbnQpCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQzMDAoCi1hbmRyb2lkLm1lZGlhLk1lZGlhU2Nhbm5lcikKLQotc3RhdGljIGphdmEudXRpbC5BcnJheUxpc3QgYWNjZXNzJDQwMCgKLWFuZHJvaWQubWVkaWEuTWVkaWFTY2FubmVyKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkNTAwKAotYW5kcm9pZC5tZWRpYS5NZWRpYVNjYW5uZXIKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQubWVkaWEuTWVkaWFTY2FubmVyQ2xpZW50KQotCi1zdGF0aWMgamF2YS5sYW5nLlN0cmluZ1tdIGFjY2VzcyQ2MDAoKQotCi1zdGF0aWMgYW5kcm9pZC5uZXQuVXJpIGFjY2VzcyQ3MDAoCi1hbmRyb2lkLm1lZGlhLk1lZGlhU2Nhbm5lcikKLQotc3RhdGljIGFuZHJvaWQubmV0LlVyaSBhY2Nlc3MkODAwKAotYW5kcm9pZC5tZWRpYS5NZWRpYVNjYW5uZXIpCi0KLXN0YXRpYyBhbmRyb2lkLm5ldC5VcmkgYWNjZXNzJDkwMCgKLWFuZHJvaWQubWVkaWEuTWVkaWFTY2FubmVyKQotCi1wcml2YXRlIGJvb2xlYW4gYWRkUGxheUxpc3RFbnRyeSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQubmV0LlVyaQotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXMKLWludCkKLQotcHJpdmF0ZSBib29sZWFuIGluU2NhbkRpcmVjdG9yeSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIGludCBtYXRjaFBhdGhzKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBmaW5hbCBuYXRpdmUgdm9pZCBuYXRpdmVfZmluYWxpemUoKQotCi1wcml2YXRlIGZpbmFsIG5hdGl2ZSB2b2lkIG5hdGl2ZV9zZXR1cCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgcG9zdHNjYW4oCi1qYXZhLmxhbmcuU3RyaW5nW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgcHJlc2NhbigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgcHJvY2Vzc0RpcmVjdG9yeSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQubWVkaWEuTWVkaWFTY2FubmVyQ2xpZW50KQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIHByb2Nlc3NGaWxlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5tZWRpYS5NZWRpYVNjYW5uZXJDbGllbnQpCi0KLXByaXZhdGUgdm9pZCBwcm9jZXNzTTN1UGxheUxpc3QoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm5ldC5VcmkKLWFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHByb2Nlc3NQbGF5TGlzdHMoKQotCi1wcml2YXRlIHZvaWQgcHJvY2Vzc1Bsc1BsYXlMaXN0KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5uZXQuVXJpCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlcykKLQotcHJpdmF0ZSB2b2lkIHByb2Nlc3NXcGxQbGF5TGlzdCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQubmV0LlVyaSkKLQotcHJpdmF0ZSB2b2lkIHBydW5lRGVhZFRodW1ibmFpbEZpbGVzKCkKLQotcHJpdmF0ZSB2b2lkIHNldERlZmF1bHRSaW5ndG9uZUZpbGVOYW1lcygpCi0KLXB1YmxpYyBuYXRpdmUgYnl0ZVtdIGV4dHJhY3RBbGJ1bUFydCgKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IpCi0KLXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkKLQotcHVibGljIHZvaWQgc2NhbkRpcmVjdG9yaWVzKAotamF2YS5sYW5nLlN0cmluZ1tdCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYW5kcm9pZC5uZXQuVXJpIHNjYW5TaW5nbGVGaWxlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9tZWRpYS9NZWRpYVNjYW5uZXJDb25uZWN0aW9uOyApCi0gY2xhc3MgYW5kcm9pZC5tZWRpYS5NZWRpYVNjYW5uZXJDb25uZWN0aW9uJDEgZXh0ZW5kcyBhbmRyb2lkLm1lZGlhLklNZWRpYVNjYW5uZXJMaXN0ZW5lciRTdHViCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQubWVkaWEuTWVkaWFTY2FubmVyQ29ubmVjdGlvbiB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm1lZGlhLk1lZGlhU2Nhbm5lckNvbm5lY3Rpb24pCi0KLXB1YmxpYyB2b2lkIHNjYW5Db21wbGV0ZWQoCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm5ldC5VcmkpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPU1lZGlhU2Nhbm5lckNvbm5lY3Rpb25DbGllbnQgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvbWVkaWEvTWVkaWFTY2FubmVyQ29ubmVjdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLm1lZGlhLk1lZGlhU2Nhbm5lckNvbm5lY3Rpb24kTWVkaWFTY2FubmVyQ29ubmVjdGlvbkNsaWVudCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvbk1lZGlhU2Nhbm5lckNvbm5lY3RlZCgpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uU2NhbkNvbXBsZXRlZCgKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQubmV0LlVyaSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL21lZGlhL01lZGlhU2Nhbm5lckNvbm5lY3Rpb24kTWVkaWFTY2FubmVyQ29ubmVjdGlvbkNsaWVudDsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQubWVkaWEuTWVkaWFTY2FubmVyQ29ubmVjdGlvbiBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLmNvbnRlbnQuU2VydmljZUNvbm5lY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLQotcHJpdmF0ZSBhbmRyb2lkLm1lZGlhLk1lZGlhU2Nhbm5lckNvbm5lY3Rpb24kTWVkaWFTY2FubmVyQ29ubmVjdGlvbkNsaWVudCBtQ2xpZW50Ci0KLXByaXZhdGUgYm9vbGVhbiBtQ29ubmVjdGVkCi0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgbUNvbnRleHQKLQotcHJpdmF0ZSBhbmRyb2lkLm1lZGlhLklNZWRpYVNjYW5uZXJMaXN0ZW5lciRTdHViIG1MaXN0ZW5lcgotCi1wcml2YXRlIGFuZHJvaWQubWVkaWEuSU1lZGlhU2Nhbm5lclNlcnZpY2UgbVNlcnZpY2UKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC5tZWRpYS5NZWRpYVNjYW5uZXJDb25uZWN0aW9uJE1lZGlhU2Nhbm5lckNvbm5lY3Rpb25DbGllbnQpCi0KLXN0YXRpYyBhbmRyb2lkLm1lZGlhLk1lZGlhU2Nhbm5lckNvbm5lY3Rpb24kTWVkaWFTY2FubmVyQ29ubmVjdGlvbkNsaWVudCBhY2Nlc3MkMDAwKAotYW5kcm9pZC5tZWRpYS5NZWRpYVNjYW5uZXJDb25uZWN0aW9uKQotCi1wdWJsaWMgdm9pZCBjb25uZWN0KCkKLQotcHVibGljIHZvaWQgZGlzY29ubmVjdCgpCi0KLXB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGVkKCkKLQotcHVibGljIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKAotYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUKLWFuZHJvaWQub3MuSUJpbmRlcikKLQotcHVibGljIHZvaWQgb25TZXJ2aWNlRGlzY29ubmVjdGVkKAotYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUpCi0KLXB1YmxpYyB2b2lkIHNjYW5GaWxlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLm1lZGlhLlJpbmd0b25lIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gRFJNX0NPTFVNTlMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZ1tdIE1FRElBX0NPTFVNTlMKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBUQUcKLQotcHJpdmF0ZSBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0RmlsZURlc2NyaXB0b3IgbUFzc2V0RmlsZURlc2NyaXB0b3IKLQotcHJpdmF0ZSBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyIG1BdWRpbwotCi1wcml2YXRlIGFuZHJvaWQuY29udGVudC5Db250ZXh0IG1Db250ZXh0Ci0KLXByaXZhdGUgamF2YS5pby5GaWxlRGVzY3JpcHRvciBtRmlsZURlc2NyaXB0b3IKLQotcHJpdmF0ZSBpbnQgbVN0cmVhbVR5cGUKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1UaXRsZQotCi1wcml2YXRlIGFuZHJvaWQubmV0LlVyaSBtVXJpCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRUaXRsZSgKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLm5ldC5VcmkKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCBvcGVuTWVkaWFQbGF5ZXIoKQotCi1wdWJsaWMgaW50IGdldFN0cmVhbVR5cGUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRUaXRsZSgKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wdWJsaWMgYm9vbGVhbiBpc1BsYXlpbmcoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi0gdm9pZCBvcGVuKAotYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldEZpbGVEZXNjcmlwdG9yKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi0gdm9pZCBvcGVuKAotYW5kcm9pZC5uZXQuVXJpKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi0gdm9pZCBvcGVuKAotamF2YS5pby5GaWxlRGVzY3JpcHRvcikKLQotcHVibGljIHZvaWQgcGxheSgpCi0KLXB1YmxpYyB2b2lkIHNldFN0cmVhbVR5cGUoCi1pbnQpCi0KLSB2b2lkIHNldFRpdGxlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc3RvcCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5tZWRpYS5SaW5ndG9uZU1hbmFnZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBQ1RJT05fUklOR1RPTkVfUElDS0VSCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmdbXSBEUk1fQ09MVU1OUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRVhUUkFfUklOR1RPTkVfREVGQVVMVF9VUkkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEVYVFJBX1JJTkdUT05FX0VYSVNUSU5HX1VSSQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRVhUUkFfUklOR1RPTkVfSU5DTFVERV9EUk0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEVYVFJBX1JJTkdUT05FX1BJQ0tFRF9VUkkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEVYVFJBX1JJTkdUT05FX1NIT1dfREVGQVVMVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRVhUUkFfUklOR1RPTkVfU0hPV19TSUxFTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEVYVFJBX1JJTkdUT05FX1RJVExFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBFWFRSQV9SSU5HVE9ORV9UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NPTFVNTl9JTkRFWAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gSU5URVJOQUxfQ09MVU1OUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gTUVESUFfQ09MVU1OUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRBRwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUSVRMRV9DT0xVTU5fSU5ERVgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9BTEFSTQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0FMTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX05PVElGSUNBVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1JJTkdUT05FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVSSV9DT0xVTU5fSU5ERVgKLQotcHJpdmF0ZSBhbmRyb2lkLmFwcC5BY3Rpdml0eSBtQWN0aXZpdHkKLQotcHJpdmF0ZSBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBtQ29udGV4dAotCi1wcml2YXRlIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIG1DdXJzb3IKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0xpc3Q8TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdCBtRmlsdGVyQ29sdW1ucwotCi1wcml2YXRlIGJvb2xlYW4gbUluY2x1ZGVEcm0KLQotcHJpdmF0ZSBhbmRyb2lkLm1lZGlhLlJpbmd0b25lIG1QcmV2aW91c1Jpbmd0b25lCi0KLXByaXZhdGUgYm9vbGVhbiBtU3RvcFByZXZpb3VzUmluZ3RvbmUKLQotcHJpdmF0ZSBpbnQgbVR5cGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuYXBwLkFjdGl2aXR5KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9MaXN0PExqYXZhL2xhbmcvU3RyaW5nOz47KUxqYXZhL2xhbmcvU3RyaW5nOyApCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGNvbnN0cnVjdEJvb2xlYW5UcnVlV2hlcmVDbGF1c2UoCi1qYXZhLnV0aWwuTGlzdCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLm5ldC5VcmkgZ2V0QWN0dWFsRGVmYXVsdFJpbmd0b25lVXJpKAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWludCkKLQotcHVibGljIHN0YXRpYyBpbnQgZ2V0RGVmYXVsdFR5cGUoCi1hbmRyb2lkLm5ldC5VcmkpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5uZXQuVXJpIGdldERlZmF1bHRVcmkoCi1pbnQpCi0KLXByaXZhdGUgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IgZ2V0RHJtUmluZ3RvbmVzKCkKLQotcHJpdmF0ZSBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciBnZXRJbnRlcm5hbFJpbmd0b25lcygpCi0KLXByaXZhdGUgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IgZ2V0TWVkaWFSaW5ndG9uZXMoKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQubWVkaWEuUmluZ3RvbmUgZ2V0UmluZ3RvbmUoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC5uZXQuVXJpKQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFNldHRpbmdGb3JUeXBlKAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLm5ldC5VcmkgZ2V0VXJpRnJvbUN1cnNvcigKLWFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQubmV0LlVyaSBnZXRWYWxpZFJpbmd0b25lVXJpKAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXByaXZhdGUgc3RhdGljIGFuZHJvaWQubmV0LlVyaSBnZXRWYWxpZFJpbmd0b25lVXJpRnJvbUN1cnNvckFuZENsb3NlKAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yKQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEZWZhdWx0KAotYW5kcm9pZC5uZXQuVXJpKQotCi1wcml2YXRlIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIHF1ZXJ5KAotYW5kcm9pZC5uZXQuVXJpCi1qYXZhLmxhbmcuU3RyaW5nW10KLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmdbXQotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyB2b2lkIHNldEFjdHVhbERlZmF1bHRSaW5ndG9uZVVyaSgKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1pbnQKLWFuZHJvaWQubmV0LlVyaSkKLQotcHJpdmF0ZSB2b2lkIHNldEZpbHRlckNvbHVtbnNMaXN0KAotaW50KQotCi1wdWJsaWMgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IgZ2V0Q3Vyc29yKCkKLQotcHVibGljIGJvb2xlYW4gZ2V0SW5jbHVkZURybSgpCi0KLXB1YmxpYyBhbmRyb2lkLm1lZGlhLlJpbmd0b25lIGdldFJpbmd0b25lKAotaW50KQotCi1wdWJsaWMgaW50IGdldFJpbmd0b25lUG9zaXRpb24oCi1hbmRyb2lkLm5ldC5VcmkpCi0KLXB1YmxpYyBhbmRyb2lkLm5ldC5VcmkgZ2V0UmluZ3RvbmVVcmkoCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIGdldFN0b3BQcmV2aW91c1Jpbmd0b25lKCkKLQotcHVibGljIHZvaWQgc2V0SW5jbHVkZURybSgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldFN0b3BQcmV2aW91c1Jpbmd0b25lKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0VHlwZSgKLWludCkKLQotcHVibGljIHZvaWQgc3RvcFByZXZpb3VzUmluZ3RvbmUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQubWVkaWEuU291bmRQb29sIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRBRwotCi1wcml2YXRlIGludCBtTmF0aXZlQ29udGV4dAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50Ci1pbnQKLWludCkKLQotcHJpdmF0ZSBmaW5hbCBuYXRpdmUgaW50IF9sb2FkKAotamF2YS5pby5GaWxlRGVzY3JpcHRvcgotbG9uZwotbG9uZwotaW50KQotCi1wcml2YXRlIGZpbmFsIG5hdGl2ZSBpbnQgX2xvYWQoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXByaXZhdGUgZmluYWwgbmF0aXZlIHZvaWQgbmF0aXZlX3NldHVwKAotamF2YS5sYW5nLk9iamVjdAotaW50Ci1pbnQKLWludCkKLQotcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKQotCi1wdWJsaWMgaW50IGxvYWQoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotaW50Ci1pbnQpCi0KLXB1YmxpYyBpbnQgbG9hZCgKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIGZpbmFsIG5hdGl2ZSB2b2lkIHBhdXNlKAotaW50KQotCi1wdWJsaWMgZmluYWwgbmF0aXZlIGludCBwbGF5KAotaW50Ci1mbG9hdAotZmxvYXQKLWludAotaW50Ci1mbG9hdCkKLQotcHVibGljIGZpbmFsIG5hdGl2ZSB2b2lkIHJlbGVhc2UoKQotCi1wdWJsaWMgZmluYWwgbmF0aXZlIHZvaWQgcmVzdW1lKAotaW50KQotCi1wdWJsaWMgZmluYWwgbmF0aXZlIHZvaWQgc2V0TG9vcCgKLWludAotaW50KQotCi1wdWJsaWMgZmluYWwgbmF0aXZlIHZvaWQgc2V0UHJpb3JpdHkoCi1pbnQKLWludCkKLQotcHVibGljIGZpbmFsIG5hdGl2ZSB2b2lkIHNldFJhdGUoCi1pbnQKLWZsb2F0KQotCi1wdWJsaWMgZmluYWwgbmF0aXZlIHZvaWQgc2V0Vm9sdW1lKAotaW50Ci1mbG9hdAotZmxvYXQpCi0KLXB1YmxpYyBmaW5hbCBuYXRpdmUgdm9pZCBzdG9wKAotaW50KQotCi1wdWJsaWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gdW5sb2FkKAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQubWVkaWEuVG9uZUdlbmVyYXRvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1ZPTFVNRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSU5fVk9MVU1FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPTkVfRFRNRl8wCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPTkVfRFRNRl8xCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPTkVfRFRNRl8yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPTkVfRFRNRl8zCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPTkVfRFRNRl80Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPTkVfRFRNRl81Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPTkVfRFRNRl82Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPTkVfRFRNRl83Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPTkVfRFRNRl84Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPTkVfRFRNRl85Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPTkVfRFRNRl9BCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPTkVfRFRNRl9CCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPTkVfRFRNRl9DCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPTkVfRFRNRl9ECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPTkVfRFRNRl9QCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPTkVfRFRNRl9TCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPTkVfUFJPUF9BQ0sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE9ORV9QUk9QX0JFRVAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE9ORV9QUk9QX0JFRVAyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPTkVfUFJPUF9OQUNLCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPTkVfUFJPUF9QUk9NUFQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE9ORV9TVVBfQlVTWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUT05FX1NVUF9DQUxMX1dBSVRJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE9ORV9TVVBfQ09OR0VTVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUT05FX1NVUF9ESUFMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPTkVfU1VQX0VSUk9SCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPTkVfU1VQX1JBRElPX0FDSwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUT05FX1NVUF9SQURJT19OT1RBVkFJTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUT05FX1NVUF9SSU5HVE9ORQotCi1wcml2YXRlIGludCBtTmF0aXZlQ29udGV4dAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotaW50KQotCi1wcml2YXRlIGZpbmFsIG5hdGl2ZSB2b2lkIG5hdGl2ZV9maW5hbGl6ZSgpCi0KLXByaXZhdGUgZmluYWwgbmF0aXZlIHZvaWQgbmF0aXZlX3NldHVwKAotaW50Ci1pbnQpCi0KLXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIHJlbGVhc2UoKQotCi1wdWJsaWMgbmF0aXZlIGJvb2xlYW4gc3RhcnRUb25lKAotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgc3RvcFRvbmUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQubmV0LkNvbm5lY3Rpdml0eU1hbmFnZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDT05ORUNUSVZJVFlfQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfTkVUV09SS19QUkVGRVJFTkNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBFWFRSQV9FWFRSQV9JTkZPCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBFWFRSQV9JU19GQUlMT1ZFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRVhUUkFfTkVUV09SS19JTkZPCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBFWFRSQV9OT19DT05ORUNUSVZJVFkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEVYVFJBX09USEVSX05FVFdPUktfSU5GTwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRVhUUkFfUkVBU09OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfTU9CSUxFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfV0lGSQotCi1wcml2YXRlIGFuZHJvaWQubmV0LklDb25uZWN0aXZpdHlNYW5hZ2VyIG1TZXJ2aWNlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQubmV0LklDb25uZWN0aXZpdHlNYW5hZ2VyKQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNOZXR3b3JrVHlwZVZhbGlkKAotaW50KQotCi1wdWJsaWMgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8gZ2V0QWN0aXZlTmV0d29ya0luZm8oKQotCi1wdWJsaWMgYW5kcm9pZC5uZXQuTmV0d29ya0luZm9bXSBnZXRBbGxOZXR3b3JrSW5mbygpCi0KLXB1YmxpYyBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbyBnZXROZXR3b3JrSW5mbygKLWludCkKLQotcHVibGljIGludCBnZXROZXR3b3JrUHJlZmVyZW5jZSgpCi0KLXB1YmxpYyBib29sZWFuIHJlcXVlc3RSb3V0ZVRvSG9zdCgKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXROZXR3b3JrUHJlZmVyZW5jZSgKLWludCkKLQotcHVibGljIGJvb2xlYW4gc2V0UmFkaW8oCi1pbnQKLWJvb2xlYW4pCi0KLXB1YmxpYyBib29sZWFuIHNldFJhZGlvcygKLWJvb2xlYW4pCi0KLXB1YmxpYyBpbnQgc3RhcnRVc2luZ05ldHdvcmtGZWF0dXJlKAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgaW50IHN0b3BVc2luZ05ldHdvcmtGZWF0dXJlKAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQubmV0LkNyZWRlbnRpYWxzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGludCBnaWQKLQotcHJpdmF0ZSBmaW5hbCBpbnQgcGlkCi0KLXByaXZhdGUgZmluYWwgaW50IHVpZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0R2lkKCkKLQotcHVibGljIGludCBnZXRQaWQoKQotCi1wdWJsaWMgaW50IGdldFVpZCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvbmV0L0RoY3BJbmZvOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExhbmRyb2lkL25ldC9EaGNwSW5mbzs+OyApCi1maW5hbCBjbGFzcyBhbmRyb2lkLm5ldC5EaGNwSW5mbyQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGFuZHJvaWQubmV0LkRoY3BJbmZvIGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgYW5kcm9pZC5uZXQuRGhjcEluZm9bXSBuZXdBcnJheSgKLWludCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3RbXSBuZXdBcnJheSgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLm5ldC5EaGNwSW5mbyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I8TGFuZHJvaWQvbmV0L0RoY3BJbmZvOz47ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IgQ1JFQVRPUgotCi1wdWJsaWMgaW50IGRuczEKLQotcHVibGljIGludCBkbnMyCi0KLXB1YmxpYyBpbnQgZ2F0ZXdheQotCi1wdWJsaWMgaW50IGlwQWRkcmVzcwotCi1wdWJsaWMgaW50IGxlYXNlRHVyYXRpb24KLQotcHVibGljIGludCBuZXRtYXNrCi0KLXB1YmxpYyBpbnQgc2VydmVyQWRkcmVzcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBwdXRBZGRyZXNzKAotamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgotaW50KQotCi1wdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLXB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvbmV0L0lDb25uZWN0aXZpdHlNYW5hZ2VyJFN0dWI7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5uZXQuSUNvbm5lY3Rpdml0eU1hbmFnZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5JSW50ZXJmYWNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbyBnZXRBY3RpdmVOZXR3b3JrSW5mbygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC5uZXQuTmV0d29ya0luZm9bXSBnZXRBbGxOZXR3b3JrSW5mbygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8gZ2V0TmV0d29ya0luZm8oCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldE5ldHdvcmtQcmVmZXJlbmNlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHJlcXVlc3RSb3V0ZVRvSG9zdCgKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0TmV0d29ya1ByZWZlcmVuY2UoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzZXRSYWRpbygKLWludAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHNldFJhZGlvcygKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IHN0YXJ0VXNpbmdOZXR3b3JrRmVhdHVyZSgKLWludAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgc3RvcFVzaW5nTmV0d29ya0ZlYXR1cmUoCi1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1Qcm94eSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9uZXQvSUNvbm5lY3Rpdml0eU1hbmFnZXIkU3R1YjsgKQotIGNsYXNzIGFuZHJvaWQubmV0LklDb25uZWN0aXZpdHlNYW5hZ2VyJFN0dWIkUHJveHkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5uZXQuSUNvbm5lY3Rpdml0eU1hbmFnZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLm9zLklCaW5kZXIgbVJlbW90ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuSUJpbmRlcikKLQotcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8gZ2V0QWN0aXZlTmV0d29ya0luZm8oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvW10gZ2V0QWxsTmV0d29ya0luZm8oKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbyBnZXROZXR3b3JrSW5mbygKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgZ2V0TmV0d29ya1ByZWZlcmVuY2UoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gcmVxdWVzdFJvdXRlVG9Ib3N0KAotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXROZXR3b3JrUHJlZmVyZW5jZSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIHNldFJhZGlvKAotaW50Ci1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gc2V0UmFkaW9zKAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgc3RhcnRVc2luZ05ldHdvcmtGZWF0dXJlKAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGludCBzdG9wVXNpbmdOZXR3b3JrRmVhdHVyZSgKLWludAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwMzMgbmFtZSA9U3R1YiApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9uZXQvSUNvbm5lY3Rpdml0eU1hbmFnZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvbmV0L0lDb25uZWN0aXZpdHlNYW5hZ2VyJFN0dWIkUHJveHk7ICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBhbmRyb2lkLm5ldC5JQ29ubmVjdGl2aXR5TWFuYWdlciRTdHViIGV4dGVuZHMgYW5kcm9pZC5vcy5CaW5kZXIgaW1wbGVtZW50cyBhbmRyb2lkLm5ldC5JQ29ubmVjdGl2aXR5TWFuYWdlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFU0NSSVBUT1IKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9nZXRBY3RpdmVOZXR3b3JrSW5mbwotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2dldEFsbE5ldHdvcmtJbmZvCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZ2V0TmV0d29ya0luZm8KLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9nZXROZXR3b3JrUHJlZmVyZW5jZQotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3JlcXVlc3RSb3V0ZVRvSG9zdAotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3NldE5ldHdvcmtQcmVmZXJlbmNlCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fc2V0UmFkaW8KLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9zZXRSYWRpb3MKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9zdGFydFVzaW5nTmV0d29ya0ZlYXR1cmUKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9zdG9wVXNpbmdOZXR3b3JrRmVhdHVyZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5uZXQuSUNvbm5lY3Rpdml0eU1hbmFnZXIgYXNJbnRlcmZhY2UoCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gb25UcmFuc2FjdCgKLWludAotYW5kcm9pZC5vcy5QYXJjZWwKLWFuZHJvaWQub3MuUGFyY2VsCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5uZXQuTG9jYWxTZXJ2ZXJTb2NrZXQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMSVNURU5fQkFDS0xPRwotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQubmV0LkxvY2FsU29ja2V0SW1wbCBpbXBsCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5uZXQuTG9jYWxTb2NrZXRBZGRyZXNzIGxvY2FsQWRkcmVzcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhbmRyb2lkLm5ldC5Mb2NhbFNvY2tldCBhY2NlcHQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjbG9zZSgpCi0KLXB1YmxpYyBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yIGdldEZpbGVEZXNjcmlwdG9yKCkKLQotcHVibGljIGFuZHJvaWQubmV0LkxvY2FsU29ja2V0QWRkcmVzcyBnZXRMb2NhbFNvY2tldEFkZHJlc3MoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQubmV0LkxvY2FsU29ja2V0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGFuZHJvaWQubmV0LkxvY2FsU29ja2V0SW1wbCBpbXBsCi0KLXByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBpbXBsQ3JlYXRlZAotCi1wcml2YXRlIGJvb2xlYW4gaXNCb3VuZAotCi1wcml2YXRlIGJvb2xlYW4gaXNDb25uZWN0ZWQKLQotcHJpdmF0ZSBhbmRyb2lkLm5ldC5Mb2NhbFNvY2tldEFkZHJlc3MgbG9jYWxBZGRyZXNzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5uZXQuTG9jYWxTb2NrZXRJbXBsKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgaW1wbENyZWF0ZUlmTmVlZGVkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgYmluZCgKLWFuZHJvaWQubmV0LkxvY2FsU29ja2V0QWRkcmVzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY2xvc2UoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjb25uZWN0KAotYW5kcm9pZC5uZXQuTG9jYWxTb2NrZXRBZGRyZXNzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjb25uZWN0KAotYW5kcm9pZC5uZXQuTG9jYWxTb2NrZXRBZGRyZXNzCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yW10gZ2V0QW5jaWxsYXJ5RmlsZURlc2NyaXB0b3JzKCkKLQotcHVibGljIGphdmEuaW8uRmlsZURlc2NyaXB0b3IgZ2V0RmlsZURlc2NyaXB0b3IoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5pby5JbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpCi0KLXB1YmxpYyBhbmRyb2lkLm5ldC5Mb2NhbFNvY2tldEFkZHJlc3MgZ2V0TG9jYWxTb2NrZXRBZGRyZXNzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuaW8uT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhbmRyb2lkLm5ldC5DcmVkZW50aWFscyBnZXRQZWVyQ3JlZGVudGlhbHMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGdldFJlY2VpdmVCdWZmZXJTaXplKCkKLQotcHVibGljIGFuZHJvaWQubmV0LkxvY2FsU29ja2V0QWRkcmVzcyBnZXRSZW1vdGVTb2NrZXRBZGRyZXNzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXRTZW5kQnVmZmVyU2l6ZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgZ2V0U29UaW1lb3V0KCkKLQotcHVibGljIGJvb2xlYW4gaXNCb3VuZCgpCi0KLXB1YmxpYyBib29sZWFuIGlzQ2xvc2VkKCkKLQotcHVibGljIGJvb2xlYW4gaXNDb25uZWN0ZWQoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0lucHV0U2h1dGRvd24oKQotCi1wdWJsaWMgYm9vbGVhbiBpc091dHB1dFNodXRkb3duKCkKLQotcHVibGljIHZvaWQgc2V0RmlsZURlc2NyaXB0b3JzRm9yU2VuZCgKLWphdmEuaW8uRmlsZURlc2NyaXB0b3JbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0UmVjZWl2ZUJ1ZmZlclNpemUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldFNlbmRCdWZmZXJTaXplKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRTb1RpbWVvdXQoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNodXRkb3duSW5wdXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzaHV0ZG93bk91dHB1dCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9uZXQvTG9jYWxTb2NrZXRBZGRyZXNzOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE2NDA5IG5hbWUgPU5hbWVzcGFjZSApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9FbnVtPExhbmRyb2lkL25ldC9Mb2NhbFNvY2tldEFkZHJlc3MkTmFtZXNwYWNlOz47ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLm5ldC5Mb2NhbFNvY2tldEFkZHJlc3MkTmFtZXNwYWNlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuTG9jYWxTb2NrZXRBZGRyZXNzJE5hbWVzcGFjZVtdICRWQUxVRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5Mb2NhbFNvY2tldEFkZHJlc3MkTmFtZXNwYWNlIEFCU1RSQUNUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuTG9jYWxTb2NrZXRBZGRyZXNzJE5hbWVzcGFjZSBGSUxFU1lTVEVNCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuTG9jYWxTb2NrZXRBZGRyZXNzJE5hbWVzcGFjZSBSRVNFUlZFRAotCi1wcml2YXRlIGludCBpZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSSlWICkKLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLm5ldC5Mb2NhbFNvY2tldEFkZHJlc3MkTmFtZXNwYWNlIHZhbHVlT2YoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQubmV0LkxvY2FsU29ja2V0QWRkcmVzcyROYW1lc3BhY2VbXSB2YWx1ZXMoKQotCi0gaW50IGdldElkKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL25ldC9Mb2NhbFNvY2tldEFkZHJlc3MkTmFtZXNwYWNlOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5uZXQuTG9jYWxTb2NrZXRBZGRyZXNzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgbmFtZQotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQubmV0LkxvY2FsU29ja2V0QWRkcmVzcyROYW1lc3BhY2UgbmFtZXNwYWNlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5uZXQuTG9jYWxTb2NrZXRBZGRyZXNzJE5hbWVzcGFjZSkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TmFtZSgpCi0KLXB1YmxpYyBhbmRyb2lkLm5ldC5Mb2NhbFNvY2tldEFkZHJlc3MkTmFtZXNwYWNlIGdldE5hbWVzcGFjZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPVNvY2tldElucHV0U3RyZWFtICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL25ldC9Mb2NhbFNvY2tldEltcGw7ICkKLSBjbGFzcyBhbmRyb2lkLm5ldC5Mb2NhbFNvY2tldEltcGwkU29ja2V0SW5wdXRTdHJlYW0gZXh0ZW5kcyBqYXZhLmlvLklucHV0U3RyZWFtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQubmV0LkxvY2FsU29ja2V0SW1wbCB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm5ldC5Mb2NhbFNvY2tldEltcGwpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgYXZhaWxhYmxlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY2xvc2UoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcmVhZCgKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvbmV0L0xvY2FsU29ja2V0SW1wbDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPVNvY2tldE91dHB1dFN0cmVhbSApCi0gY2xhc3MgYW5kcm9pZC5uZXQuTG9jYWxTb2NrZXRJbXBsJFNvY2tldE91dHB1dFN0cmVhbSBleHRlbmRzIGphdmEuaW8uT3V0cHV0U3RyZWFtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQubmV0LkxvY2FsU29ja2V0SW1wbCB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm5ldC5Mb2NhbFNvY2tldEltcGwpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNsb3NlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgd3JpdGUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHdyaXRlKAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB3cml0ZSgKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9uZXQvTG9jYWxTb2NrZXRJbXBsJFNvY2tldE91dHB1dFN0cmVhbTtMYW5kcm9pZC9uZXQvTG9jYWxTb2NrZXRJbXBsJFNvY2tldElucHV0U3RyZWFtOyApCi0gY2xhc3MgYW5kcm9pZC5uZXQuTG9jYWxTb2NrZXRJbXBsIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEuaW8uRmlsZURlc2NyaXB0b3IgZmQKLQotcHJpdmF0ZSBhbmRyb2lkLm5ldC5Mb2NhbFNvY2tldEltcGwkU29ja2V0SW5wdXRTdHJlYW0gZmlzCi0KLXByaXZhdGUgYW5kcm9pZC5uZXQuTG9jYWxTb2NrZXRJbXBsJFNvY2tldE91dHB1dFN0cmVhbSBmb3MKLQotIGphdmEuaW8uRmlsZURlc2NyaXB0b3JbXSBpbmJvdW5kRmlsZURlc2NyaXB0b3JzCi0KLSBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yW10gb3V0Ym91bmRGaWxlRGVzY3JpcHRvcnMKLQotcHJpdmF0ZSBqYXZhLmxhbmcuT2JqZWN0IHJlYWRNb25pdG9yCi0KLXByaXZhdGUgamF2YS5sYW5nLk9iamVjdCB3cml0ZU1vbml0b3IKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi0gdm9pZCA8aW5pdD4oCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIG5hdGl2ZSBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yIGFjY2VwdCgKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IKLWFuZHJvaWQubmV0LkxvY2FsU29ja2V0SW1wbCkKLQotc3RhdGljIGphdmEuaW8uRmlsZURlc2NyaXB0b3IgYWNjZXNzJDAwMCgKLWFuZHJvaWQubmV0LkxvY2FsU29ja2V0SW1wbCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotc3RhdGljIGludCBhY2Nlc3MkMTAwKAotYW5kcm9pZC5uZXQuTG9jYWxTb2NrZXRJbXBsCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yKQotCi1zdGF0aWMgamF2YS5sYW5nLk9iamVjdCBhY2Nlc3MkMjAwKAotYW5kcm9pZC5uZXQuTG9jYWxTb2NrZXRJbXBsKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1zdGF0aWMgaW50IGFjY2VzcyQzMDAoCi1hbmRyb2lkLm5ldC5Mb2NhbFNvY2tldEltcGwKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXN0YXRpYyBpbnQgYWNjZXNzJDQwMCgKLWFuZHJvaWQubmV0LkxvY2FsU29ja2V0SW1wbAotYnl0ZVtdCi1pbnQKLWludAotamF2YS5pby5GaWxlRGVzY3JpcHRvcikKLQotc3RhdGljIGphdmEubGFuZy5PYmplY3QgYWNjZXNzJDUwMCgKLWFuZHJvaWQubmV0LkxvY2FsU29ja2V0SW1wbCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotc3RhdGljIHZvaWQgYWNjZXNzJDYwMCgKLWFuZHJvaWQubmV0LkxvY2FsU29ja2V0SW1wbAotYnl0ZVtdCi1pbnQKLWludAotamF2YS5pby5GaWxlRGVzY3JpcHRvcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotc3RhdGljIHZvaWQgYWNjZXNzJDcwMCgKLWFuZHJvaWQubmV0LkxvY2FsU29ja2V0SW1wbAotaW50Ci1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIG5hdGl2ZSBpbnQgYXZhaWxhYmxlX25hdGl2ZSgKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgbmF0aXZlIHZvaWQgYmluZExvY2FsKAotamF2YS5pby5GaWxlRGVzY3JpcHRvcgotamF2YS5sYW5nLlN0cmluZwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIG5hdGl2ZSB2b2lkIGNsb3NlX25hdGl2ZSgKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgbmF0aXZlIHZvaWQgY29ubmVjdExvY2FsKAotamF2YS5pby5GaWxlRGVzY3JpcHRvcgotamF2YS5sYW5nLlN0cmluZwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIG5hdGl2ZSBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yIGNyZWF0ZV9uYXRpdmUoCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIG5hdGl2ZSBpbnQgZ2V0T3B0aW9uX25hdGl2ZSgKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBuYXRpdmUgYW5kcm9pZC5uZXQuQ3JlZGVudGlhbHMgZ2V0UGVlckNyZWRlbnRpYWxzX25hdGl2ZSgKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgbmF0aXZlIHZvaWQgbGlzdGVuX25hdGl2ZSgKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBuYXRpdmUgaW50IHJlYWRfbmF0aXZlKAotamF2YS5pby5GaWxlRGVzY3JpcHRvcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBuYXRpdmUgaW50IHJlYWRiYV9uYXRpdmUoCi1ieXRlW10KLWludAotaW50Ci1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIG5hdGl2ZSB2b2lkIHNldE9wdGlvbl9uYXRpdmUoCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1pbnQKLWludAotaW50KQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIHNodXRkb3duKAotamF2YS5pby5GaWxlRGVzY3JpcHRvcgotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBuYXRpdmUgdm9pZCB3cml0ZV9uYXRpdmUoCi1pbnQKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgbmF0aXZlIHZvaWQgd3JpdGViYV9uYXRpdmUoCi1ieXRlW10KLWludAotaW50Ci1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBhY2NlcHQoCi1hbmRyb2lkLm5ldC5Mb2NhbFNvY2tldEltcGwpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCBpbnQgYXZhaWxhYmxlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgYmluZCgKLWFuZHJvaWQubmV0LkxvY2FsU29ja2V0QWRkcmVzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY2xvc2UoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBjb25uZWN0KAotYW5kcm9pZC5uZXQuTG9jYWxTb2NrZXRBZGRyZXNzCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNyZWF0ZSgKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuaW8uRmlsZURlc2NyaXB0b3JbXSBnZXRBbmNpbGxhcnlGaWxlRGVzY3JpcHRvcnMoKQotCi1wcm90ZWN0ZWQgamF2YS5pby5GaWxlRGVzY3JpcHRvciBnZXRGaWxlRGVzY3JpcHRvcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCBqYXZhLmlvLklucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0T3B0aW9uKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgamF2YS5pby5PdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFuZHJvaWQubmV0LkNyZWRlbnRpYWxzIGdldFBlZXJDcmVkZW50aWFscygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhbmRyb2lkLm5ldC5Mb2NhbFNvY2tldEFkZHJlc3MgZ2V0U29ja0FkZHJlc3MoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBsaXN0ZW4oCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIHNlbmRVcmdlbnREYXRhKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRGaWxlRGVzY3JpcHRvcnNGb3JTZW5kKAotamF2YS5pby5GaWxlRGVzY3JpcHRvcltdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRPcHRpb24oCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIHNodXRkb3duSW5wdXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBzaHV0ZG93bk91dHB1dCgpCi0KLXByb3RlY3RlZCBib29sZWFuIHN1cHBvcnRzVXJnZW50RGF0YSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLm5ldC5NYWlsVG8gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQk9EWQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENDCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBNQUlMVE9fU0NIRU1FCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU1VCSkVDVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRPCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNoTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXByaXZhdGUgamF2YS51dGlsLkhhc2hNYXAgbUhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzTWFpbFRvKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9uZXQvUGFyc2VFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5uZXQuTWFpbFRvIHBhcnNlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Qm9keSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldENjKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuTWFwIGdldEhlYWRlcnMoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdWJqZWN0KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VG8oKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID00MTA0IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvbmV0L01vYmlsZURhdGFTdGF0ZVRyYWNrZXI7ICkKLSBjbGFzcyBhbmRyb2lkLm5ldC5Nb2JpbGVEYXRhU3RhdGVUcmFja2VyJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBmaW5hbCBpbnRbXSAkU3dpdGNoTWFwJGNvbSRhbmRyb2lkJGludGVybmFsJHRlbGVwaG9ueSRQaG9uZSREYXRhU3RhdGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvbmV0L01vYmlsZURhdGFTdGF0ZVRyYWNrZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MiBuYW1lID1Nb2JpbGVEYXRhU3RhdGVSZWNlaXZlciApCi0gY2xhc3MgYW5kcm9pZC5uZXQuTW9iaWxlRGF0YVN0YXRlVHJhY2tlciRNb2JpbGVEYXRhU3RhdGVSZWNlaXZlciBleHRlbmRzIGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLm5ldC5Nb2JpbGVEYXRhU3RhdGVUcmFja2VyIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm5ldC5Nb2JpbGVEYXRhU3RhdGVUcmFja2VyKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm5ldC5Nb2JpbGVEYXRhU3RhdGVUcmFja2VyCi1hbmRyb2lkLm5ldC5Nb2JpbGVEYXRhU3RhdGVUcmFja2VyJDEpCi0KLXB1YmxpYyB2b2lkIG9uUmVjZWl2ZSgKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLmNvbnRlbnQuSW50ZW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGFuZHJvaWQubmV0Lk5ldHdvcmtTdGF0ZVRyYWNrZXIgZXh0ZW5kcyBhbmRyb2lkLm9zLkhhbmRsZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBEQkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfQ09ORklHVVJBVElPTl9DSEFOR0VECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX05PVElGSUNBVElPTl9DSEFOR0VECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1NDQU5fUkVTVUxUU19BVkFJTEFCTEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfU1RBVEVfQ0hBTkdFRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRBRwotCi1wcm90ZWN0ZWQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgbUNvbnRleHQKLQotcHJvdGVjdGVkIGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvIG1OZXR3b3JrSW5mbwotCi1wcm90ZWN0ZWQgYW5kcm9pZC5vcy5IYW5kbGVyIG1UYXJnZXQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLm9zLkhhbmRsZXIKLWludCkKLQotcHJvdGVjdGVkIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0TmFtZVNlcnZlckxpc3QoCi1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLXByaXZhdGUgdm9pZCBzZXRCdWZmZXJTaXplKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHN0cmluZ1RvRmlsZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0TmFtZVNlcnZlcnMoKQotCi1wdWJsaWMgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8gZ2V0TmV0d29ya0luZm8oKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRUY3BCdWZmZXJTaXplc1Byb3BOYW1lKCkKLQotcHVibGljIHZvaWQgaW50ZXJwcmV0U2NhblJlc3VsdHNBdmFpbGFibGUoKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0F2YWlsYWJsZSgpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHJlY29ubmVjdCgpCi0KLXB1YmxpYyBib29sZWFuIHJlcXVlc3RSb3V0ZVRvSG9zdCgKLWludCkKLQotcHJvdGVjdGVkIHZvaWQgc2VuZFNjYW5SZXN1bHRzQXZhaWxhYmxlKCkKLQotcHVibGljIHZvaWQgc2V0RGV0YWlsZWRTdGF0ZSgKLWFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvJERldGFpbGVkU3RhdGUpCi0KLXB1YmxpYyB2b2lkIHNldERldGFpbGVkU3RhdGUoCi1hbmRyb2lkLm5ldC5OZXR3b3JrSW5mbyREZXRhaWxlZFN0YXRlCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcm90ZWN0ZWQgdm9pZCBzZXREZXRhaWxlZFN0YXRlSW50ZXJuYWwoCi1hbmRyb2lkLm5ldC5OZXR3b3JrSW5mbyREZXRhaWxlZFN0YXRlKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzZXRSYWRpbygKLWJvb2xlYW4pCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHN0YXJ0TW9uaXRvcmluZygpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgc3RhcnRVc2luZ05ldHdvcmtGZWF0dXJlKAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgc3RvcFVzaW5nTmV0d29ya0ZlYXR1cmUoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gdGVhcmRvd24oKQotCi1wdWJsaWMgdm9pZCB1cGRhdGVOZXR3b3JrU2V0dGluZ3MoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvbmV0L01vYmlsZURhdGFTdGF0ZVRyYWNrZXIkMTtMYW5kcm9pZC9uZXQvTW9iaWxlRGF0YVN0YXRlVHJhY2tlciRNb2JpbGVEYXRhU3RhdGVSZWNlaXZlcjsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQubmV0Lk1vYmlsZURhdGFTdGF0ZVRyYWNrZXIgZXh0ZW5kcyBhbmRyb2lkLm5ldC5OZXR3b3JrU3RhdGVUcmFja2VyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEFHCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmdbXSBzRG5zUHJvcE5hbWVzCi0KLXByaXZhdGUgaW50IG1EZWZhdWx0R2F0ZXdheUFkZHIKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0xpc3Q8TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdCBtRG5zU2VydmVycwotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbUludGVyZmFjZU5hbWUKLQotcHJpdmF0ZSBpbnQgbUxhc3RDYWxsaW5nUGlkCi0KLXByaXZhdGUgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lJERhdGFTdGF0ZSBtTW9iaWxlRGF0YVN0YXRlCi0KLXByaXZhdGUgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LklUZWxlcGhvbnkgbVBob25lU2VydmljZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQub3MuSGFuZGxlcikKLQotc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZSREYXRhU3RhdGUgYWNjZXNzJDEwMCgKLWFuZHJvaWQuY29udGVudC5JbnRlbnQpCi0KLXN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmUkRGF0YVN0YXRlIGFjY2VzcyQyMDAoCi1hbmRyb2lkLm5ldC5Nb2JpbGVEYXRhU3RhdGVUcmFja2VyKQotCi1zdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lJERhdGFTdGF0ZSBhY2Nlc3MkMjAyKAotYW5kcm9pZC5uZXQuTW9iaWxlRGF0YVN0YXRlVHJhY2tlcgotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lJERhdGFTdGF0ZSkKLQotc3RhdGljIGphdmEubGFuZy5TdHJpbmcgYWNjZXNzJDMwMCgKLWFuZHJvaWQubmV0Lk1vYmlsZURhdGFTdGF0ZVRyYWNrZXIpCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGFjY2VzcyQzMDIoCi1hbmRyb2lkLm5ldC5Nb2JpbGVEYXRhU3RhdGVUcmFja2VyCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1zdGF0aWMgaW50IGFjY2VzcyQ0MDIoCi1hbmRyb2lkLm5ldC5Nb2JpbGVEYXRhU3RhdGVUcmFja2VyCi1pbnQpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQ1MDAoCi1hbmRyb2lkLm5ldC5Nb2JpbGVEYXRhU3RhdGVUcmFja2VyKQotCi1wcml2YXRlIHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmUkRGF0YVN0YXRlIGdldE1vYmlsZURhdGFTdGF0ZSgKLWFuZHJvaWQuY29udGVudC5JbnRlbnQpCi0KLXByaXZhdGUgdm9pZCBnZXRQaG9uZVNlcnZpY2UoCi1ib29sZWFuKQotCi1wcml2YXRlIGludCBzZXRFbmFibGVBcG4oCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuKQotCi1wcml2YXRlIHZvaWQgc2V0dXBEbnNQcm9wZXJ0aWVzKCkKLQotcHVibGljIHZvaWQgYWRkUHJpdmF0ZVJvdXRlcygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0TmFtZVNlcnZlcnMoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRUY3BCdWZmZXJTaXplc1Byb3BOYW1lKCkKLQotcHVibGljIGJvb2xlYW4gaXNBdmFpbGFibGUoKQotCi1wdWJsaWMgYm9vbGVhbiByZWNvbm5lY3QoKQotCi1wdWJsaWMgdm9pZCByZW1vdmVEZWZhdWx0Um91dGUoKQotCi1wdWJsaWMgdm9pZCByZW1vdmVQcml2YXRlUm91dGVzKCkKLQotcHVibGljIGJvb2xlYW4gcmVxdWVzdFJvdXRlVG9Ib3N0KAotaW50KQotCi1wdWJsaWMgdm9pZCByZXN0b3JlRGVmYXVsdFJvdXRlKCkKLQotcHVibGljIGJvb2xlYW4gc2V0UmFkaW8oCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzdGFydE1vbml0b3JpbmcoKQotCi1wdWJsaWMgaW50IHN0YXJ0VXNpbmdOZXR3b3JrRmVhdHVyZSgKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50KQotCi1wdWJsaWMgaW50IHN0b3BVc2luZ05ldHdvcmtGZWF0dXJlKAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQpCi0KLXB1YmxpYyBib29sZWFuIHRlYXJkb3duKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9NDEwNCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL25ldC9OZXR3b3JrQ29ubmVjdGl2aXR5TGlzdGVuZXI7ICkKLSBjbGFzcyBhbmRyb2lkLm5ldC5OZXR3b3JrQ29ubmVjdGl2aXR5TGlzdGVuZXIkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL25ldC9OZXR3b3JrQ29ubmVjdGl2aXR5TGlzdGVuZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MiBuYW1lID1Db25uZWN0aXZpdHlCcm9hZGNhc3RSZWNlaXZlciApCi0gY2xhc3MgYW5kcm9pZC5uZXQuTmV0d29ya0Nvbm5lY3Rpdml0eUxpc3RlbmVyJENvbm5lY3Rpdml0eUJyb2FkY2FzdFJlY2VpdmVyIGV4dGVuZHMgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQubmV0Lk5ldHdvcmtDb25uZWN0aXZpdHlMaXN0ZW5lciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5uZXQuTmV0d29ya0Nvbm5lY3Rpdml0eUxpc3RlbmVyKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm5ldC5OZXR3b3JrQ29ubmVjdGl2aXR5TGlzdGVuZXIKLWFuZHJvaWQubmV0Lk5ldHdvcmtDb25uZWN0aXZpdHlMaXN0ZW5lciQxKQotCi1wdWJsaWMgdm9pZCBvblJlY2VpdmUoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC5jb250ZW50LkludGVudCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9FbnVtPExhbmRyb2lkL25ldC9OZXR3b3JrQ29ubmVjdGl2aXR5TGlzdGVuZXIkU3RhdGU7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvbmV0L05ldHdvcmtDb25uZWN0aXZpdHlMaXN0ZW5lcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNjQwOSBuYW1lID1TdGF0ZSApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5uZXQuTmV0d29ya0Nvbm5lY3Rpdml0eUxpc3RlbmVyJFN0YXRlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuTmV0d29ya0Nvbm5lY3Rpdml0eUxpc3RlbmVyJFN0YXRlW10gJFZBTFVFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0Lk5ldHdvcmtDb25uZWN0aXZpdHlMaXN0ZW5lciRTdGF0ZSBDT05ORUNURUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5OZXR3b3JrQ29ubmVjdGl2aXR5TGlzdGVuZXIkU3RhdGUgTk9UX0NPTk5FQ1RFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0Lk5ldHdvcmtDb25uZWN0aXZpdHlMaXN0ZW5lciRTdGF0ZSBVTktOT1dOCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpViApCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQubmV0Lk5ldHdvcmtDb25uZWN0aXZpdHlMaXN0ZW5lciRTdGF0ZSB2YWx1ZU9mKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLm5ldC5OZXR3b3JrQ29ubmVjdGl2aXR5TGlzdGVuZXIkU3RhdGVbXSB2YWx1ZXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvbmV0L05ldHdvcmtDb25uZWN0aXZpdHlMaXN0ZW5lciQxO0xhbmRyb2lkL25ldC9OZXR3b3JrQ29ubmVjdGl2aXR5TGlzdGVuZXIkU3RhdGU7TGFuZHJvaWQvbmV0L05ldHdvcmtDb25uZWN0aXZpdHlMaXN0ZW5lciRDb25uZWN0aXZpdHlCcm9hZGNhc3RSZWNlaXZlcjsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQubmV0Lk5ldHdvcmtDb25uZWN0aXZpdHlMaXN0ZW5lciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLQotcHJpdmF0ZSBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBtQ29udGV4dAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaE1hcDxMYW5kcm9pZC9vcy9IYW5kbGVyO0xqYXZhL2xhbmcvSW50ZWdlcjs+OyApCi1wcml2YXRlIGphdmEudXRpbC5IYXNoTWFwIG1IYW5kbGVycwotCi1wcml2YXRlIGJvb2xlYW4gbUlzRmFpbG92ZXIKLQotcHJpdmF0ZSBib29sZWFuIG1MaXN0ZW5pbmcKLQotcHJpdmF0ZSBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbyBtTmV0d29ya0luZm8KLQotcHJpdmF0ZSBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbyBtT3RoZXJOZXR3b3JrSW5mbwotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbVJlYXNvbgotCi1wcml2YXRlIGFuZHJvaWQubmV0Lk5ldHdvcmtDb25uZWN0aXZpdHlMaXN0ZW5lciRDb25uZWN0aXZpdHlCcm9hZGNhc3RSZWNlaXZlciBtUmVjZWl2ZXIKLQotcHJpdmF0ZSBhbmRyb2lkLm5ldC5OZXR3b3JrQ29ubmVjdGl2aXR5TGlzdGVuZXIkU3RhdGUgbVN0YXRlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDAwMCgKLWFuZHJvaWQubmV0Lk5ldHdvcmtDb25uZWN0aXZpdHlMaXN0ZW5lcikKLQotc3RhdGljIGFuZHJvaWQubmV0Lk5ldHdvcmtDb25uZWN0aXZpdHlMaXN0ZW5lciRTdGF0ZSBhY2Nlc3MkMTAwKAotYW5kcm9pZC5uZXQuTmV0d29ya0Nvbm5lY3Rpdml0eUxpc3RlbmVyKQotCi1zdGF0aWMgYW5kcm9pZC5uZXQuTmV0d29ya0Nvbm5lY3Rpdml0eUxpc3RlbmVyJFN0YXRlIGFjY2VzcyQxMDIoCi1hbmRyb2lkLm5ldC5OZXR3b3JrQ29ubmVjdGl2aXR5TGlzdGVuZXIKLWFuZHJvaWQubmV0Lk5ldHdvcmtDb25uZWN0aXZpdHlMaXN0ZW5lciRTdGF0ZSkKLQotc3RhdGljIGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvIGFjY2VzcyQyMDIoCi1hbmRyb2lkLm5ldC5OZXR3b3JrQ29ubmVjdGl2aXR5TGlzdGVuZXIKLWFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvKQotCi1zdGF0aWMgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8gYWNjZXNzJDMwMigKLWFuZHJvaWQubmV0Lk5ldHdvcmtDb25uZWN0aXZpdHlMaXN0ZW5lcgotYW5kcm9pZC5uZXQuTmV0d29ya0luZm8pCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGFjY2VzcyQ0MDIoCi1hbmRyb2lkLm5ldC5OZXR3b3JrQ29ubmVjdGl2aXR5TGlzdGVuZXIKLWphdmEubGFuZy5TdHJpbmcpCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQ1MDIoCi1hbmRyb2lkLm5ldC5OZXR3b3JrQ29ubmVjdGl2aXR5TGlzdGVuZXIKLWJvb2xlYW4pCi0KLXN0YXRpYyBqYXZhLnV0aWwuSGFzaE1hcCBhY2Nlc3MkNjAwKAotYW5kcm9pZC5uZXQuTmV0d29ya0Nvbm5lY3Rpdml0eUxpc3RlbmVyKQotCi1wdWJsaWMgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8gZ2V0TmV0d29ya0luZm8oKQotCi1wdWJsaWMgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8gZ2V0T3RoZXJOZXR3b3JrSW5mbygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFJlYXNvbigpCi0KLXB1YmxpYyBhbmRyb2lkLm5ldC5OZXR3b3JrQ29ubmVjdGl2aXR5TGlzdGVuZXIkU3RhdGUgZ2V0U3RhdGUoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0ZhaWxvdmVyKCkKLQotcHVibGljIHZvaWQgcmVnaXN0ZXJIYW5kbGVyKAotYW5kcm9pZC5vcy5IYW5kbGVyCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHN0YXJ0TGlzdGVuaW5nKAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXB1YmxpYyB2b2lkIHN0b3BMaXN0ZW5pbmcoKQotCi1wdWJsaWMgdm9pZCB1bnJlZ2lzdGVySGFuZGxlcigKLWFuZHJvaWQub3MuSGFuZGxlcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9uZXQvTmV0d29ya0luZm87ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I8TGFuZHJvaWQvbmV0L05ldHdvcmtJbmZvOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLWZpbmFsIGNsYXNzIGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8gY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mb1tdIG5ld0FycmF5KAotaW50KQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdFtdIG5ld0FycmF5KAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL25ldC9OZXR3b3JrSW5mbzsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvRW51bTxMYW5kcm9pZC9uZXQvTmV0d29ya0luZm8kRGV0YWlsZWRTdGF0ZTs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE2NDA5IG5hbWUgPURldGFpbGVkU3RhdGUgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvJERldGFpbGVkU3RhdGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbyREZXRhaWxlZFN0YXRlW10gJFZBTFVFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvJERldGFpbGVkU3RhdGUgQVVUSEVOVElDQVRJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbyREZXRhaWxlZFN0YXRlIENPTk5FQ1RFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvJERldGFpbGVkU3RhdGUgQ09OTkVDVElORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvJERldGFpbGVkU3RhdGUgRElTQ09OTkVDVEVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8kRGV0YWlsZWRTdGF0ZSBESVNDT05ORUNUSU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8kRGV0YWlsZWRTdGF0ZSBGQUlMRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbyREZXRhaWxlZFN0YXRlIElETEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbyREZXRhaWxlZFN0YXRlIE9CVEFJTklOR19JUEFERFIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbyREZXRhaWxlZFN0YXRlIFNDQU5OSU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8kRGV0YWlsZWRTdGF0ZSBTVVNQRU5ERUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClWICkKLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8kRGV0YWlsZWRTdGF0ZSB2YWx1ZU9mKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbyREZXRhaWxlZFN0YXRlW10gdmFsdWVzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9FbnVtPExhbmRyb2lkL25ldC9OZXR3b3JrSW5mbyRTdGF0ZTs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE2NDA5IG5hbWUgPVN0YXRlICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL25ldC9OZXR3b3JrSW5mbzsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvJFN0YXRlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8kU3RhdGVbXSAkVkFMVUVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8kU3RhdGUgQ09OTkVDVEVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8kU3RhdGUgQ09OTkVDVElORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvJFN0YXRlIERJU0NPTk5FQ1RFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvJFN0YXRlIERJU0NPTk5FQ1RJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbyRTdGF0ZSBTVVNQRU5ERUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbyRTdGF0ZSBVTktOT1dOCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpViApCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvJFN0YXRlIHZhbHVlT2YoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvJFN0YXRlW10gdmFsdWVzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL25ldC9OZXR3b3JrSW5mbyREZXRhaWxlZFN0YXRlO0xhbmRyb2lkL25ldC9OZXR3b3JrSW5mbyRTdGF0ZTsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC9uZXQvTmV0d29ya0luZm87PjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvciBDUkVBVE9SCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9FbnVtTWFwPExhbmRyb2lkL25ldC9OZXR3b3JrSW5mbyREZXRhaWxlZFN0YXRlO0xhbmRyb2lkL25ldC9OZXR3b3JrSW5mbyRTdGF0ZTs+OyApCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuRW51bU1hcCBzdGF0ZU1hcAotCi1wcml2YXRlIGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvJERldGFpbGVkU3RhdGUgbURldGFpbGVkU3RhdGUKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1FeHRyYUluZm8KLQotcHJpdmF0ZSBib29sZWFuIG1Jc0F2YWlsYWJsZQotCi1wcml2YXRlIGJvb2xlYW4gbUlzRmFpbG92ZXIKLQotcHJpdmF0ZSBpbnQgbU5ldHdvcmtUeXBlCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtUmVhc29uCi0KLXByaXZhdGUgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8kU3RhdGUgbVN0YXRlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQpCi0KLXN0YXRpYyBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbyRTdGF0ZSBhY2Nlc3MkMDAyKAotYW5kcm9pZC5uZXQuTmV0d29ya0luZm8KLWFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvJFN0YXRlKQotCi1zdGF0aWMgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8kRGV0YWlsZWRTdGF0ZSBhY2Nlc3MkMTAyKAotYW5kcm9pZC5uZXQuTmV0d29ya0luZm8KLWFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvJERldGFpbGVkU3RhdGUpCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQyMDIoCi1hbmRyb2lkLm5ldC5OZXR3b3JrSW5mbwotYm9vbGVhbikKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDMwMigKLWFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvCi1ib29sZWFuKQotCi1zdGF0aWMgamF2YS5sYW5nLlN0cmluZyBhY2Nlc3MkNDAyKAotYW5kcm9pZC5uZXQuTmV0d29ya0luZm8KLWphdmEubGFuZy5TdHJpbmcpCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGFjY2VzcyQ1MDIoCi1hbmRyb2lkLm5ldC5OZXR3b3JrSW5mbwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkKLQotcHVibGljIGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvJERldGFpbGVkU3RhdGUgZ2V0RGV0YWlsZWRTdGF0ZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEV4dHJhSW5mbygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFJlYXNvbigpCi0KLXB1YmxpYyBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbyRTdGF0ZSBnZXRTdGF0ZSgpCi0KLXB1YmxpYyBpbnQgZ2V0VHlwZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFR5cGVOYW1lKCkKLQotcHVibGljIGJvb2xlYW4gaXNBdmFpbGFibGUoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RlZCgpCi0KLXB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGVkT3JDb25uZWN0aW5nKCkKLQotcHVibGljIGJvb2xlYW4gaXNGYWlsb3ZlcigpCi0KLSB2b2lkIHNldERldGFpbGVkU3RhdGUoCi1hbmRyb2lkLm5ldC5OZXR3b3JrSW5mbyREZXRhaWxlZFN0YXRlCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRGYWlsb3ZlcigKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldElzQXZhaWxhYmxlKAotYm9vbGVhbikKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1wdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLm5ldC5OZXR3b3JrVXRpbHMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGFkZEhvc3RSb3V0ZSgKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGNvbmZpZ3VyZUludGVyZmFjZSgKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQubmV0LkRoY3BJbmZvKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBjb25maWd1cmVOYXRpdmUoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGRpc2FibGVJbnRlcmZhY2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgZ2V0RGVmYXVsdFJvdXRlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgamF2YS5sYW5nLlN0cmluZyBnZXREaGNwRXJyb3IoKQotCi1wdWJsaWMgc3RhdGljIGludCBsb29rdXBIb3N0KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IHJlbW92ZURlZmF1bHRSb3V0ZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCByZW1vdmVIb3N0Um91dGVzKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IHJlc2V0Q29ubmVjdGlvbnMoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIHJ1bkRoY3AoCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm5ldC5EaGNwSW5mbykKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IHNldERlZmF1bHRSb3V0ZSgKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBzdG9wRGhjcCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5uZXQuUGFyc2VFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyByZXNwb25zZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5uZXQuUHJveHkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQUk9YWV9DSEFOR0VfQUNUSU9OCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGdldERlZmF1bHRIb3N0KCkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZ2V0RGVmYXVsdFBvcnQoKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgZ2V0SG9zdCgKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBnZXRQb3J0KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvbmV0L1NTTENlcnRpZmljYXRlU29ja2V0RmFjdG9yeTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotZmluYWwgY2xhc3MgYW5kcm9pZC5uZXQuU1NMQ2VydGlmaWNhdGVTb2NrZXRGYWN0b3J5JDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YXgubmV0LnNzbC5YNTA5VHJ1c3RNYW5hZ2VyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgY2hlY2tDbGllbnRUcnVzdGVkKAotamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZVtdCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBjaGVja1NlcnZlclRydXN0ZWQoCi1qYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlW10KLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlW10gZ2V0QWNjZXB0ZWRJc3N1ZXJzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLm5ldC5TU0xDZXJ0aWZpY2F0ZVNvY2tldEZhY3RvcnkgZXh0ZW5kcyBqYXZheC5uZXQuc3NsLlNTTFNvY2tldEZhY3RvcnkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMT0dfVEFHCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmF4Lm5ldC5zc2wuVHJ1c3RNYW5hZ2VyW10gVFJVU1RfTUFOQUdFUgotCi1wcml2YXRlIHN0YXRpYyBqYXZheC5uZXQuc3NsLlg1MDlUcnVzdE1hbmFnZXIgc0RlZmF1bHRUcnVzdE1hbmFnZXIKLQotcHJpdmF0ZSBqYXZheC5uZXQuc3NsLlNTTFNvY2tldEZhY3RvcnkgZmFjdG9yeQotCi1wcml2YXRlIGZpbmFsIGludCBzb2NrZXRSZWFkVGltZW91dEZvclNzbEhhbmRzaGFrZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247TGphdmEvc2VjdXJpdHkvS2V5TWFuYWdlbWVudEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50KQotCi1wdWJsaWMgc3RhdGljIGphdmF4Lm5ldC5Tb2NrZXRGYWN0b3J5IGdldERlZmF1bHQoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgYm9vbGVhbiBoYXNWYWxpZENlcnRpZmljYXRlQ2hhaW4oCi1qYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHZhbGlkYXRlU29ja2V0KAotamF2YXgubmV0LnNzbC5TU0xTb2NrZXQKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLm5ldC5Tb2NrZXQgY3JlYXRlU29ja2V0KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5uZXQuU29ja2V0IGNyZWF0ZVNvY2tldCgKLWphdmEubGFuZy5TdHJpbmcKLWludAotamF2YS5uZXQuSW5ldEFkZHJlc3MKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubmV0LlNvY2tldCBjcmVhdGVTb2NrZXQoCi1qYXZhLm5ldC5JbmV0QWRkcmVzcwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5uZXQuU29ja2V0IGNyZWF0ZVNvY2tldCgKLWphdmEubmV0LkluZXRBZGRyZXNzCi1pbnQKLWphdmEubmV0LkluZXRBZGRyZXNzCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLm5ldC5Tb2NrZXQgY3JlYXRlU29ja2V0KAotamF2YS5uZXQuU29ja2V0Ci1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWJvb2xlYW4pCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0RGVmYXVsdENpcGhlclN1aXRlcygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0U3VwcG9ydGVkQ2lwaGVyU3VpdGVzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLm5ldC5TbnRwQ2xpZW50IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTlRQX01PREVfQ0xJRU5UCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOVFBfUEFDS0VUX1NJWkUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5UUF9QT1JUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOVFBfVkVSU0lPTgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIE9GRlNFVF8xOTAwX1RPXzE5NzAKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9SSUdJTkFURV9USU1FX09GRlNFVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVDRUlWRV9USU1FX09GRlNFVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVGRVJFTkNFX1RJTUVfT0ZGU0VUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEFHCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUUkFOU01JVF9USU1FX09GRlNFVAotCi1wcml2YXRlIGxvbmcgbU50cFRpbWUKLQotcHJpdmF0ZSBsb25nIG1OdHBUaW1lUmVmZXJlbmNlCi0KLXByaXZhdGUgbG9uZyBtUm91bmRUcmlwVGltZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgbG9uZyByZWFkMzIoCi1ieXRlW10KLWludCkKLQotcHJpdmF0ZSBsb25nIHJlYWRUaW1lU3RhbXAoCi1ieXRlW10KLWludCkKLQotcHJpdmF0ZSB2b2lkIHdyaXRlVGltZVN0YW1wKAotYnl0ZVtdCi1pbnQKLWxvbmcpCi0KLXB1YmxpYyBsb25nIGdldE50cFRpbWUoKQotCi1wdWJsaWMgbG9uZyBnZXROdHBUaW1lUmVmZXJlbmNlKCkKLQotcHVibGljIGxvbmcgZ2V0Um91bmRUcmlwVGltZSgpCi0KLXB1YmxpYyBib29sZWFuIHJlcXVlc3RUaW1lKAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I8TGFuZHJvaWQvbmV0L1VyaTs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9uZXQvVXJpOyApCi1maW5hbCBjbGFzcyBhbmRyb2lkLm5ldC5VcmkkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBhbmRyb2lkLm5ldC5VcmkgY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyBhbmRyb2lkLm5ldC5VcmlbXSBuZXdBcnJheSgKLWludCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3RbXSBuZXdBcnJheSgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL25ldC9VcmkkUGF0aFBhcnQ7TGFuZHJvaWQvbmV0L1VyaSRQYXJ0O0xhbmRyb2lkL25ldC9VcmkkQWJzdHJhY3RQYXJ0O0xhbmRyb2lkL25ldC9VcmkkQnVpbGRlcjtMYW5kcm9pZC9uZXQvVXJpJEhpZXJhcmNoaWNhbFVyaTtMYW5kcm9pZC9uZXQvVXJpJEFic3RyYWN0SGllcmFyY2hpY2FsVXJpO0xhbmRyb2lkL25ldC9VcmkkUGF0aFNlZ21lbnRzQnVpbGRlcjtMYW5kcm9pZC9uZXQvVXJpJFBhdGhTZWdtZW50cztMYW5kcm9pZC9uZXQvVXJpJE9wYXF1ZVVyaTtMYW5kcm9pZC9uZXQvVXJpJFN0cmluZ1VyaTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xhbmRyb2lkL29zL1BhcmNlbGFibGU7TGphdmEvbGFuZy9Db21wYXJhYmxlPExhbmRyb2lkL25ldC9Vcmk7PjsgKQotcHVibGljIGFic3RyYWN0IGNsYXNzIGFuZHJvaWQubmV0LlVyaSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUsIGphdmEubGFuZy5Db21wYXJhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExhbmRyb2lkL25ldC9Vcmk7PjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvciBDUkVBVE9SCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVGQVVMVF9FTkNPRElORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBFTVBUWQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gSEVYX0RJR0lUUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIExPRwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE5PVF9DQUNIRUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PVF9DQUxDVUxBVEVECi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOT1RfRk9VTkQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBOT1RfSElFUkFSQ0hJQ0FMCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOVUxMX1RZUEVfSUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIFJFUExBQ0VNRU5UCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5uZXQuVXJpJDEpCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGFjY2VzcyQzMDAoKQotCi1zdGF0aWMgamF2YS5sYW5nLlN0cmluZyBhY2Nlc3MkNjAwKCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGRlY29kZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBlbmNvZGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZW5jb2RlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLm5ldC5VcmkgZnJvbUZpbGUoCi1qYXZhLmlvLkZpbGUpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5uZXQuVXJpIGZyb21QYXJ0cygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNBbGxvd2VkKAotY2hhcgotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLm5ldC5VcmkgcGFyc2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQubmV0LlVyaSB3aXRoQXBwZW5kZWRQYXRoKAotYW5kcm9pZC5uZXQuVXJpCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVUb1BhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsCi1hbmRyb2lkLm5ldC5VcmkpCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLm5ldC5VcmkkQnVpbGRlciBidWlsZFVwb24oKQotCi1wdWJsaWMgaW50IGNvbXBhcmVUbygKLWFuZHJvaWQubmV0LlVyaSkKLQotcHVibGljIHZvbGF0aWxlIGludCBjb21wYXJlVG8oCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRBdXRob3JpdHkoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRFbmNvZGVkQXV0aG9yaXR5KCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0RW5jb2RlZEZyYWdtZW50KCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0RW5jb2RlZFBhdGgoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRFbmNvZGVkUXVlcnkoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRFbmNvZGVkU2NoZW1lU3BlY2lmaWNQYXJ0KCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0RW5jb2RlZFVzZXJJbmZvKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0RnJhZ21lbnQoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRIb3N0KCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0TGFzdFBhdGhTZWdtZW50KCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0UGF0aCgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0xpc3Q8TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHVibGljIGFic3RyYWN0IGphdmEudXRpbC5MaXN0IGdldFBhdGhTZWdtZW50cygpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0UG9ydCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldFF1ZXJ5KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UXVlcnlQYXJhbWV0ZXIoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvdXRpbC9MaXN0PExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRRdWVyeVBhcmFtZXRlcnMoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRTY2hlbWUoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRTY2hlbWVTcGVjaWZpY1BhcnQoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRVc2VySW5mbygpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0Fic29sdXRlKCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNIaWVyYXJjaGljYWwoKQotCi1wdWJsaWMgYm9vbGVhbiBpc09wYXF1ZSgpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzUmVsYXRpdmUoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvbmV0L1VyaTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMDM0IG5hbWUgPUFic3RyYWN0SGllcmFyY2hpY2FsVXJpICkKLWFic3RyYWN0IGNsYXNzIGFuZHJvaWQubmV0LlVyaSRBYnN0cmFjdEhpZXJhcmNoaWNhbFVyaSBleHRlbmRzIGFuZHJvaWQubmV0LlVyaQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvbGF0aWxlIGphdmEubGFuZy5TdHJpbmcgaG9zdAotCi1wcml2YXRlIHZvbGF0aWxlIGludCBwb3J0Ci0KLXByaXZhdGUgYW5kcm9pZC5uZXQuVXJpJFBhcnQgdXNlckluZm8KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5uZXQuVXJpJDEpCi0KLXByaXZhdGUgYW5kcm9pZC5uZXQuVXJpJFBhcnQgZ2V0VXNlckluZm9QYXJ0KCkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHBhcnNlSG9zdCgpCi0KLXByaXZhdGUgaW50IHBhcnNlUG9ydCgpCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBwYXJzZVVzZXJJbmZvKCkKLQotcHVibGljIHZvbGF0aWxlIGludCBjb21wYXJlVG8oCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBnZXRFbmNvZGVkVXNlckluZm8oKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRIb3N0KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TGFzdFBhdGhTZWdtZW50KCkKLQotcHVibGljIGludCBnZXRQb3J0KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VXNlckluZm8oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1SZXByZXNlbnRhdGlvbiApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9uZXQvVXJpJEFic3RyYWN0UGFydDsgKQotIGNsYXNzIGFuZHJvaWQubmV0LlVyaSRBYnN0cmFjdFBhcnQkUmVwcmVzZW50YXRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBmaW5hbCBpbnQgQk9USAotCi1zdGF0aWMgZmluYWwgaW50IERFQ09ERUQKLQotc3RhdGljIGZpbmFsIGludCBFTkNPREVECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9uZXQvVXJpOyApCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL25ldC9VcmkkQWJzdHJhY3RQYXJ0JFJlcHJlc2VudGF0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwMzIgbmFtZSA9QWJzdHJhY3RQYXJ0ICkKLWFic3RyYWN0IGNsYXNzIGFuZHJvaWQubmV0LlVyaSRBYnN0cmFjdFBhcnQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXZvbGF0aWxlIGphdmEubGFuZy5TdHJpbmcgZGVjb2RlZAotCi12b2xhdGlsZSBqYXZhLmxhbmcuU3RyaW5nIGVuY29kZWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1maW5hbCBqYXZhLmxhbmcuU3RyaW5nIGdldERlY29kZWQoKQotCi1hYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldEVuY29kZWQoKQotCi1maW5hbCB2b2lkIHdyaXRlVG8oCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI1IG5hbWUgPUJ1aWxkZXIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvbmV0L1VyaTsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQubmV0LlVyaSRCdWlsZGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGFuZHJvaWQubmV0LlVyaSRQYXJ0IGF1dGhvcml0eQotCi1wcml2YXRlIGFuZHJvaWQubmV0LlVyaSRQYXJ0IGZyYWdtZW50Ci0KLXByaXZhdGUgYW5kcm9pZC5uZXQuVXJpJFBhcnQgb3BhcXVlUGFydAotCi1wcml2YXRlIGFuZHJvaWQubmV0LlVyaSRQYXRoUGFydCBwYXRoCi0KLXByaXZhdGUgYW5kcm9pZC5uZXQuVXJpJFBhcnQgcXVlcnkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHNjaGVtZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgYm9vbGVhbiBoYXNTY2hlbWVPckF1dGhvcml0eSgpCi0KLXB1YmxpYyBhbmRyb2lkLm5ldC5VcmkkQnVpbGRlciBhcHBlbmRFbmNvZGVkUGF0aCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhbmRyb2lkLm5ldC5VcmkkQnVpbGRlciBhcHBlbmRQYXRoKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFuZHJvaWQubmV0LlVyaSRCdWlsZGVyIGFwcGVuZFF1ZXJ5UGFyYW1ldGVyKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotIGFuZHJvaWQubmV0LlVyaSRCdWlsZGVyIGF1dGhvcml0eSgKLWFuZHJvaWQubmV0LlVyaSRQYXJ0KQotCi1wdWJsaWMgYW5kcm9pZC5uZXQuVXJpJEJ1aWxkZXIgYXV0aG9yaXR5KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFuZHJvaWQubmV0LlVyaSBidWlsZCgpCi0KLXB1YmxpYyBhbmRyb2lkLm5ldC5VcmkkQnVpbGRlciBlbmNvZGVkQXV0aG9yaXR5KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFuZHJvaWQubmV0LlVyaSRCdWlsZGVyIGVuY29kZWRGcmFnbWVudCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhbmRyb2lkLm5ldC5VcmkkQnVpbGRlciBlbmNvZGVkT3BhcXVlUGFydCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhbmRyb2lkLm5ldC5VcmkkQnVpbGRlciBlbmNvZGVkUGF0aCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhbmRyb2lkLm5ldC5VcmkkQnVpbGRlciBlbmNvZGVkUXVlcnkoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi0gYW5kcm9pZC5uZXQuVXJpJEJ1aWxkZXIgZnJhZ21lbnQoCi1hbmRyb2lkLm5ldC5VcmkkUGFydCkKLQotcHVibGljIGFuZHJvaWQubmV0LlVyaSRCdWlsZGVyIGZyYWdtZW50KAotamF2YS5sYW5nLlN0cmluZykKLQotIGFuZHJvaWQubmV0LlVyaSRCdWlsZGVyIG9wYXF1ZVBhcnQoCi1hbmRyb2lkLm5ldC5VcmkkUGFydCkKLQotcHVibGljIGFuZHJvaWQubmV0LlVyaSRCdWlsZGVyIG9wYXF1ZVBhcnQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi0gYW5kcm9pZC5uZXQuVXJpJEJ1aWxkZXIgcGF0aCgKLWFuZHJvaWQubmV0LlVyaSRQYXRoUGFydCkKLQotcHVibGljIGFuZHJvaWQubmV0LlVyaSRCdWlsZGVyIHBhdGgoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi0gYW5kcm9pZC5uZXQuVXJpJEJ1aWxkZXIgcXVlcnkoCi1hbmRyb2lkLm5ldC5VcmkkUGFydCkKLQotcHVibGljIGFuZHJvaWQubmV0LlVyaSRCdWlsZGVyIHF1ZXJ5KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFuZHJvaWQubmV0LlVyaSRCdWlsZGVyIHNjaGVtZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9uZXQvVXJpOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPUhpZXJhcmNoaWNhbFVyaSApCi0gY2xhc3MgYW5kcm9pZC5uZXQuVXJpJEhpZXJhcmNoaWNhbFVyaSBleHRlbmRzIGFuZHJvaWQubmV0LlVyaSRBYnN0cmFjdEhpZXJhcmNoaWNhbFVyaQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgaW50IFRZUEVfSUQKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLm5ldC5VcmkkUGFydCBhdXRob3JpdHkKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLm5ldC5VcmkkUGFydCBmcmFnbWVudAotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQubmV0LlVyaSRQYXRoUGFydCBwYXRoCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5uZXQuVXJpJFBhcnQgcXVlcnkKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIHNjaGVtZQotCi1wcml2YXRlIGFuZHJvaWQubmV0LlVyaSRQYXJ0IHNzcAotCi1wcml2YXRlIHZvbGF0aWxlIGphdmEubGFuZy5TdHJpbmcgdXJpU3RyaW5nCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQubmV0LlVyaSRQYXJ0Ci1hbmRyb2lkLm5ldC5VcmkkUGF0aFBhcnQKLWFuZHJvaWQubmV0LlVyaSRQYXJ0Ci1hbmRyb2lkLm5ldC5VcmkkUGFydCkKLQotIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5uZXQuVXJpJFBhcnQKLWFuZHJvaWQubmV0LlVyaSRQYXRoUGFydAotYW5kcm9pZC5uZXQuVXJpJFBhcnQKLWFuZHJvaWQubmV0LlVyaSRQYXJ0Ci1hbmRyb2lkLm5ldC5VcmkkMSkKLQotcHJpdmF0ZSB2b2lkIGFwcGVuZFNzcFRvKAotamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIpCi0KLXByaXZhdGUgYW5kcm9pZC5uZXQuVXJpJFBhcnQgZ2V0U3NwKCkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1ha2VTY2hlbWVTcGVjaWZpY1BhcnQoKQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbWFrZVVyaVN0cmluZygpCi0KLXN0YXRpYyBhbmRyb2lkLm5ldC5VcmkgcmVhZEZyb20oCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIGFuZHJvaWQubmV0LlVyaSRCdWlsZGVyIGJ1aWxkVXBvbigpCi0KLXB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEF1dGhvcml0eSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEVuY29kZWRBdXRob3JpdHkoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRFbmNvZGVkRnJhZ21lbnQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRFbmNvZGVkUGF0aCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEVuY29kZWRRdWVyeSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEVuY29kZWRTY2hlbWVTcGVjaWZpY1BhcnQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRGcmFnbWVudCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFBhdGgoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9MaXN0PExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRQYXRoU2VnbWVudHMoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRRdWVyeSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFNjaGVtZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFNjaGVtZVNwZWNpZmljUGFydCgpCi0KLXB1YmxpYyBib29sZWFuIGlzSGllcmFyY2hpY2FsKCkKLQotcHVibGljIGJvb2xlYW4gaXNSZWxhdGl2ZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvbmV0L1VyaTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1PcGFxdWVVcmkgKQotIGNsYXNzIGFuZHJvaWQubmV0LlVyaSRPcGFxdWVVcmkgZXh0ZW5kcyBhbmRyb2lkLm5ldC5VcmkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIGludCBUWVBFX0lECi0KLXByaXZhdGUgdm9sYXRpbGUgamF2YS5sYW5nLlN0cmluZyBjYWNoZWRTdHJpbmcKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLm5ldC5VcmkkUGFydCBmcmFnbWVudAotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgc2NoZW1lCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5uZXQuVXJpJFBhcnQgc3NwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQubmV0LlVyaSRQYXJ0Ci1hbmRyb2lkLm5ldC5VcmkkUGFydCkKLQotIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5uZXQuVXJpJFBhcnQKLWFuZHJvaWQubmV0LlVyaSRQYXJ0Ci1hbmRyb2lkLm5ldC5VcmkkMSkKLQotc3RhdGljIGFuZHJvaWQubmV0LlVyaSByZWFkRnJvbSgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgYW5kcm9pZC5uZXQuVXJpJEJ1aWxkZXIgYnVpbGRVcG9uKCkKLQotcHVibGljIHZvbGF0aWxlIGludCBjb21wYXJlVG8oCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRBdXRob3JpdHkoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRFbmNvZGVkQXV0aG9yaXR5KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RW5jb2RlZEZyYWdtZW50KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RW5jb2RlZFBhdGgoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRFbmNvZGVkUXVlcnkoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRFbmNvZGVkU2NoZW1lU3BlY2lmaWNQYXJ0KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RW5jb2RlZFVzZXJJbmZvKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RnJhZ21lbnQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRIb3N0KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TGFzdFBhdGhTZWdtZW50KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UGF0aCgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0xpc3Q8TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHVibGljIGphdmEudXRpbC5MaXN0IGdldFBhdGhTZWdtZW50cygpCi0KLXB1YmxpYyBpbnQgZ2V0UG9ydCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFF1ZXJ5KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U2NoZW1lKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U2NoZW1lU3BlY2lmaWNQYXJ0KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VXNlckluZm8oKQotCi1wdWJsaWMgYm9vbGVhbiBpc0hpZXJhcmNoaWNhbCgpCi0KLXB1YmxpYyBib29sZWFuIGlzUmVsYXRpdmUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLXB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvbmV0L1VyaSRQYXJ0JEVtcHR5UGFydDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvbmV0L1VyaTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPVBhcnQgKQotIGNsYXNzIGFuZHJvaWQubmV0LlVyaSRQYXJ0IGV4dGVuZHMgYW5kcm9pZC5uZXQuVXJpJEFic3RyYWN0UGFydAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpJFBhcnQgRU1QVFkKLQotc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSRQYXJ0IE5VTEwKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm5ldC5VcmkkMSkKLQotc3RhdGljIGFuZHJvaWQubmV0LlVyaSRQYXJ0IGZyb20oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1zdGF0aWMgYW5kcm9pZC5uZXQuVXJpJFBhcnQgZnJvbURlY29kZWQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1zdGF0aWMgYW5kcm9pZC5uZXQuVXJpJFBhcnQgZnJvbUVuY29kZWQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1zdGF0aWMgYW5kcm9pZC5uZXQuVXJpJFBhcnQgbm9uTnVsbCgKLWFuZHJvaWQubmV0LlVyaSRQYXJ0KQotCi1zdGF0aWMgYW5kcm9pZC5uZXQuVXJpJFBhcnQgcmVhZEZyb20oCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotIGphdmEubGFuZy5TdHJpbmcgZ2V0RW5jb2RlZCgpCi0KLSBib29sZWFuIGlzRW1wdHkoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9RW1wdHlQYXJ0ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL25ldC9VcmkkUGFydDsgKQotIGNsYXNzIGFuZHJvaWQubmV0LlVyaSRQYXJ0JEVtcHR5UGFydCBleHRlbmRzIGFuZHJvaWQubmV0LlVyaSRQYXJ0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotIGJvb2xlYW4gaXNFbXB0eSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPVBhdGhQYXJ0ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL25ldC9Vcmk7ICkKLSBjbGFzcyBhbmRyb2lkLm5ldC5VcmkkUGF0aFBhcnQgZXh0ZW5kcyBhbmRyb2lkLm5ldC5VcmkkQWJzdHJhY3RQYXJ0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmkkUGF0aFBhcnQgRU1QVFkKLQotc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSRQYXRoUGFydCBOVUxMCi0KLXByaXZhdGUgYW5kcm9pZC5uZXQuVXJpJFBhdGhTZWdtZW50cyBwYXRoU2VnbWVudHMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1zdGF0aWMgYW5kcm9pZC5uZXQuVXJpJFBhdGhQYXJ0IGFwcGVuZERlY29kZWRTZWdtZW50KAotYW5kcm9pZC5uZXQuVXJpJFBhdGhQYXJ0Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1zdGF0aWMgYW5kcm9pZC5uZXQuVXJpJFBhdGhQYXJ0IGFwcGVuZEVuY29kZWRTZWdtZW50KAotYW5kcm9pZC5uZXQuVXJpJFBhdGhQYXJ0Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1zdGF0aWMgYW5kcm9pZC5uZXQuVXJpJFBhdGhQYXJ0IGZyb20oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1zdGF0aWMgYW5kcm9pZC5uZXQuVXJpJFBhdGhQYXJ0IGZyb21EZWNvZGVkKAotamF2YS5sYW5nLlN0cmluZykKLQotc3RhdGljIGFuZHJvaWQubmV0LlVyaSRQYXRoUGFydCBmcm9tRW5jb2RlZCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXN0YXRpYyBhbmRyb2lkLm5ldC5VcmkkUGF0aFBhcnQgbWFrZUFic29sdXRlKAotYW5kcm9pZC5uZXQuVXJpJFBhdGhQYXJ0KQotCi1zdGF0aWMgYW5kcm9pZC5uZXQuVXJpJFBhdGhQYXJ0IHJlYWRGcm9tKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLSBqYXZhLmxhbmcuU3RyaW5nIGdldEVuY29kZWQoKQotCi0gYW5kcm9pZC5uZXQuVXJpJFBhdGhTZWdtZW50cyBnZXRQYXRoU2VnbWVudHMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL25ldC9Vcmk7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1QYXRoU2VnbWVudHMgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQWJzdHJhY3RMaXN0PExqYXZhL2xhbmcvU3RyaW5nOz47TGphdmEvdXRpbC9SYW5kb21BY2Nlc3M7ICkKLSBjbGFzcyBhbmRyb2lkLm5ldC5VcmkkUGF0aFNlZ21lbnRzIGV4dGVuZHMgamF2YS51dGlsLkFic3RyYWN0TGlzdCBpbXBsZW1lbnRzIGphdmEudXRpbC5SYW5kb21BY2Nlc3MKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSRQYXRoU2VnbWVudHMgRU1QVFkKLQotZmluYWwgamF2YS5sYW5nLlN0cmluZ1tdIHNlZ21lbnRzCi0KLWZpbmFsIGludCBzaXplCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nW10KLWludCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgZ2V0KAotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXQoCi1pbnQpCi0KLXB1YmxpYyBpbnQgc2l6ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvbmV0L1VyaTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPVBhdGhTZWdtZW50c0J1aWxkZXIgKQotIGNsYXNzIGFuZHJvaWQubmV0LlVyaSRQYXRoU2VnbWVudHNCdWlsZGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gamF2YS5sYW5nLlN0cmluZ1tdIHNlZ21lbnRzCi0KLSBpbnQgc2l6ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLSB2b2lkIGFkZCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLSBhbmRyb2lkLm5ldC5VcmkkUGF0aFNlZ21lbnRzIGJ1aWxkKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPVN0cmluZ1VyaSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9uZXQvVXJpOyApCi0gY2xhc3MgYW5kcm9pZC5uZXQuVXJpJFN0cmluZ1VyaSBleHRlbmRzIGFuZHJvaWQubmV0LlVyaSRBYnN0cmFjdEhpZXJhcmNoaWNhbFVyaQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgaW50IFRZUEVfSUQKLQotcHJpdmF0ZSBhbmRyb2lkLm5ldC5VcmkkUGFydCBhdXRob3JpdHkKLQotcHJpdmF0ZSB2b2xhdGlsZSBpbnQgY2FjaGVkRnNpCi0KLXByaXZhdGUgdm9sYXRpbGUgaW50IGNhY2hlZFNzaQotCi1wcml2YXRlIGFuZHJvaWQubmV0LlVyaSRQYXJ0IGZyYWdtZW50Ci0KLXByaXZhdGUgYW5kcm9pZC5uZXQuVXJpJFBhdGhQYXJ0IHBhdGgKLQotcHJpdmF0ZSBhbmRyb2lkLm5ldC5VcmkkUGFydCBxdWVyeQotCi1wcml2YXRlIHZvbGF0aWxlIGphdmEubGFuZy5TdHJpbmcgc2NoZW1lCi0KLXByaXZhdGUgYW5kcm9pZC5uZXQuVXJpJFBhcnQgc3NwCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyB1cmlTdHJpbmcKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5uZXQuVXJpJDEpCi0KLXByaXZhdGUgaW50IGZpbmRGcmFnbWVudFNlcGFyYXRvcigpCi0KLXByaXZhdGUgaW50IGZpbmRTY2hlbWVTZXBhcmF0b3IoKQotCi1wcml2YXRlIGFuZHJvaWQubmV0LlVyaSRQYXJ0IGdldEF1dGhvcml0eVBhcnQoKQotCi1wcml2YXRlIGFuZHJvaWQubmV0LlVyaSRQYXJ0IGdldEZyYWdtZW50UGFydCgpCi0KLXByaXZhdGUgYW5kcm9pZC5uZXQuVXJpJFBhdGhQYXJ0IGdldFBhdGhQYXJ0KCkKLQotcHJpdmF0ZSBhbmRyb2lkLm5ldC5VcmkkUGFydCBnZXRRdWVyeVBhcnQoKQotCi1wcml2YXRlIGFuZHJvaWQubmV0LlVyaSRQYXJ0IGdldFNzcCgpCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIHBhcnNlQXV0aG9yaXR5KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcGFyc2VGcmFnbWVudCgpCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBwYXJzZVBhdGgoKQotCi1zdGF0aWMgamF2YS5sYW5nLlN0cmluZyBwYXJzZVBhdGgoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBwYXJzZVF1ZXJ5KCkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHBhcnNlU2NoZW1lKCkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHBhcnNlU3NwKCkKLQotc3RhdGljIGFuZHJvaWQubmV0LlVyaSByZWFkRnJvbSgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgYW5kcm9pZC5uZXQuVXJpJEJ1aWxkZXIgYnVpbGRVcG9uKCkKLQotcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QXV0aG9yaXR5KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RW5jb2RlZEF1dGhvcml0eSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEVuY29kZWRGcmFnbWVudCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEVuY29kZWRQYXRoKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RW5jb2RlZFF1ZXJ5KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RW5jb2RlZFNjaGVtZVNwZWNpZmljUGFydCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEZyYWdtZW50KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UGF0aCgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0xpc3Q8TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHVibGljIGphdmEudXRpbC5MaXN0IGdldFBhdGhTZWdtZW50cygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFF1ZXJ5KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U2NoZW1lKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U2NoZW1lU3BlY2lmaWNQYXJ0KCkKLQotcHVibGljIGJvb2xlYW4gaXNIaWVyYXJjaGljYWwoKQotCi1wdWJsaWMgYm9vbGVhbiBpc1JlbGF0aXZlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1wdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9uZXQvVXJsUXVlcnlTYW5pdGl6ZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1WYWx1ZVNhbml0aXplciApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQubmV0LlVybFF1ZXJ5U2FuaXRpemVyJFZhbHVlU2FuaXRpemVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIHNhbml0aXplKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9SWxsZWdhbENoYXJhY3RlclZhbHVlU2FuaXRpemVyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL25ldC9VcmxRdWVyeVNhbml0aXplcjsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQubmV0LlVybFF1ZXJ5U2FuaXRpemVyJElsbGVnYWxDaGFyYWN0ZXJWYWx1ZVNhbml0aXplciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm5ldC5VcmxRdWVyeVNhbml0aXplciRWYWx1ZVNhbml0aXplcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTExfQlVUX05VTF9BTkRfQU5HTEVfQlJBQ0tFVFNfTEVHQUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUxMX0JVVF9OVUxfTEVHQUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUxMX0JVVF9XSElURVNQQUNFX0xFR0FMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFMTF9JTExFR0FMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFMTF9PSwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTExfV0hJVEVTUEFDRV9PSwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTVBfQU5EX1NQQUNFX0xFR0FMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFNUF9MRUdBTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTVBfT0sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRFFVT1RFX09LCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdUX09LCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSkFWQVNDUklQVF9QUkVGSVgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTFRfT0sKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1JTl9TQ1JJUFRfUFJFRklYX0xFTkdUSAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT05fN19CSVRfQVNDSUlfT0sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTlVMX09LCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9USEVSX1dISVRFU1BBQ0VfT0sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUENUX09LCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDUklQVF9VUkxfT0sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1BBQ0VfTEVHQUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1BBQ0VfT0sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1FVT1RFX09LCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVSTF9BTkRfU1BBQ0VfTEVHQUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVJMX0xFR0FMCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVkJTQ1JJUFRfUFJFRklYCi0KLXByaXZhdGUgaW50IG1GbGFncwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50KQotCi1wcml2YXRlIGJvb2xlYW4gY2hhcmFjdGVySXNMZWdhbCgKLWNoYXIpCi0KLXByaXZhdGUgYm9vbGVhbiBpc1doaXRlc3BhY2UoCi1jaGFyKQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgdHJpbVdoaXRlc3BhY2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBzYW5pdGl6ZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xIG5hbWUgPVBhcmFtZXRlclZhbHVlUGFpciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9uZXQvVXJsUXVlcnlTYW5pdGl6ZXI7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLm5ldC5VcmxRdWVyeVNhbml0aXplciRQYXJhbWV0ZXJWYWx1ZVBhaXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIG1QYXJhbWV0ZXIKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgbVZhbHVlCi0KLWZpbmFsIGFuZHJvaWQubmV0LlVybFF1ZXJ5U2FuaXRpemVyIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQubmV0LlVybFF1ZXJ5U2FuaXRpemVyCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvbmV0L1VybFF1ZXJ5U2FuaXRpemVyJElsbGVnYWxDaGFyYWN0ZXJWYWx1ZVNhbml0aXplcjtMYW5kcm9pZC9uZXQvVXJsUXVlcnlTYW5pdGl6ZXIkVmFsdWVTYW5pdGl6ZXI7TGFuZHJvaWQvbmV0L1VybFF1ZXJ5U2FuaXRpemVyJFBhcmFtZXRlclZhbHVlUGFpcjsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQubmV0LlVybFF1ZXJ5U2FuaXRpemVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmxRdWVyeVNhbml0aXplciRWYWx1ZVNhbml0aXplciBzQWxsQnV0TnVsQW5kQW5nbGVCcmFja2V0c0xlZ2FsCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVybFF1ZXJ5U2FuaXRpemVyJFZhbHVlU2FuaXRpemVyIHNBbGxCdXROdWxMZWdhbAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmxRdWVyeVNhbml0aXplciRWYWx1ZVNhbml0aXplciBzQWxsQnV0V2hpdGVzcGFjZUxlZ2FsCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVybFF1ZXJ5U2FuaXRpemVyJFZhbHVlU2FuaXRpemVyIHNBbGxJbGxlZ2FsCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVybFF1ZXJ5U2FuaXRpemVyJFZhbHVlU2FuaXRpemVyIHNBbXBBbmRTcGFjZUxlZ2FsCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVybFF1ZXJ5U2FuaXRpemVyJFZhbHVlU2FuaXRpemVyIHNBbXBMZWdhbAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmxRdWVyeVNhbml0aXplciRWYWx1ZVNhbml0aXplciBzU3BhY2VMZWdhbAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmxRdWVyeVNhbml0aXplciRWYWx1ZVNhbml0aXplciBzVVJMTGVnYWwKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJsUXVlcnlTYW5pdGl6ZXIkVmFsdWVTYW5pdGl6ZXIgc1VybEFuZFNwYWNlTGVnYWwKLQotcHJpdmF0ZSBib29sZWFuIG1BbGxvd1VucmVnaXN0ZXJlZFBhcmFtYXRlcnMKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0hhc2hNYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHJpdmF0ZSBmaW5hbCBqYXZhLnV0aWwuSGFzaE1hcCBtRW50cmllcwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQXJyYXlMaXN0PExhbmRyb2lkL25ldC9VcmxRdWVyeVNhbml0aXplciRQYXJhbWV0ZXJWYWx1ZVBhaXI7PjsgKQotcHJpdmF0ZSBmaW5hbCBqYXZhLnV0aWwuQXJyYXlMaXN0IG1FbnRyaWVzTGlzdAotCi1wcml2YXRlIGJvb2xlYW4gbVByZWZlckZpcnN0UmVwZWF0ZWRQYXJhbWV0ZXIKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0hhc2hNYXA8TGphdmEvbGFuZy9TdHJpbmc7TGFuZHJvaWQvbmV0L1VybFF1ZXJ5U2FuaXRpemVyJFZhbHVlU2FuaXRpemVyOz47ICkKLXByaXZhdGUgZmluYWwgamF2YS51dGlsLkhhc2hNYXAgbVNhbml0aXplcnMKLQotcHJpdmF0ZSBhbmRyb2lkLm5ldC5VcmxRdWVyeVNhbml0aXplciRWYWx1ZVNhbml0aXplciBtVW5yZWdpc3RlcmVkUGFyYW1ldGVyVmFsdWVTYW5pdGl6ZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJsUXVlcnlTYW5pdGl6ZXIkVmFsdWVTYW5pdGl6ZXIgZ2V0QWxsQnV0TnVsQW5kQW5nbGVCcmFja2V0c0xlZ2FsKCkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmxRdWVyeVNhbml0aXplciRWYWx1ZVNhbml0aXplciBnZXRBbGxCdXROdWxMZWdhbCgpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJsUXVlcnlTYW5pdGl6ZXIkVmFsdWVTYW5pdGl6ZXIgZ2V0QWxsQnV0V2hpdGVzcGFjZUxlZ2FsKCkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmxRdWVyeVNhbml0aXplciRWYWx1ZVNhbml0aXplciBnZXRBbGxJbGxlZ2FsKCkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmxRdWVyeVNhbml0aXplciRWYWx1ZVNhbml0aXplciBnZXRBbXBBbmRTcGFjZUxlZ2FsKCkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmxRdWVyeVNhbml0aXplciRWYWx1ZVNhbml0aXplciBnZXRBbXBMZWdhbCgpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJsUXVlcnlTYW5pdGl6ZXIkVmFsdWVTYW5pdGl6ZXIgZ2V0U3BhY2VMZWdhbCgpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJsUXVlcnlTYW5pdGl6ZXIkVmFsdWVTYW5pdGl6ZXIgZ2V0VXJsQW5kU3BhY2VMZWdhbCgpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJsUXVlcnlTYW5pdGl6ZXIkVmFsdWVTYW5pdGl6ZXIgZ2V0VXJsTGVnYWwoKQotCi1wcm90ZWN0ZWQgdm9pZCBhZGRTYW5pdGl6ZWRFbnRyeSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByb3RlY3RlZCB2b2lkIGNsZWFyKCkKLQotcHJvdGVjdGVkIGludCBkZWNvZGVIZXhEaWdpdCgKLWNoYXIpCi0KLXB1YmxpYyBib29sZWFuIGdldEFsbG93VW5yZWdpc3RlcmVkUGFyYW1hdGVycygpCi0KLXB1YmxpYyBhbmRyb2lkLm5ldC5VcmxRdWVyeVNhbml0aXplciRWYWx1ZVNhbml0aXplciBnZXRFZmZlY3RpdmVWYWx1ZVNhbml0aXplcigKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0xpc3Q8TGFuZHJvaWQvbmV0L1VybFF1ZXJ5U2FuaXRpemVyJFBhcmFtZXRlclZhbHVlUGFpcjs+OyApCi1wdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0UGFyYW1ldGVyTGlzdCgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL1NldDxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wdWJsaWMgamF2YS51dGlsLlNldCBnZXRQYXJhbWV0ZXJTZXQoKQotCi1wdWJsaWMgYm9vbGVhbiBnZXRQcmVmZXJGaXJzdFJlcGVhdGVkUGFyYW1ldGVyKCkKLQotcHVibGljIGFuZHJvaWQubmV0LlVybFF1ZXJ5U2FuaXRpemVyJFZhbHVlU2FuaXRpemVyIGdldFVucmVnaXN0ZXJlZFBhcmFtZXRlclZhbHVlU2FuaXRpemVyKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VmFsdWUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYW5kcm9pZC5uZXQuVXJsUXVlcnlTYW5pdGl6ZXIkVmFsdWVTYW5pdGl6ZXIgZ2V0VmFsdWVTYW5pdGl6ZXIoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYm9vbGVhbiBoYXNQYXJhbWV0ZXIoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcm90ZWN0ZWQgYm9vbGVhbiBpc0hleERpZ2l0KAotY2hhcikKLQotcHJvdGVjdGVkIHZvaWQgcGFyc2VFbnRyeSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHBhcnNlUXVlcnkoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBwYXJzZVVybCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHJlZ2lzdGVyUGFyYW1ldGVyKAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5uZXQuVXJsUXVlcnlTYW5pdGl6ZXIkVmFsdWVTYW5pdGl6ZXIpCi0KLXB1YmxpYyB2b2lkIHJlZ2lzdGVyUGFyYW1ldGVycygKLWphdmEubGFuZy5TdHJpbmdbXQotYW5kcm9pZC5uZXQuVXJsUXVlcnlTYW5pdGl6ZXIkVmFsdWVTYW5pdGl6ZXIpCi0KLXB1YmxpYyB2b2lkIHNldEFsbG93VW5yZWdpc3RlcmVkUGFyYW1hdGVycygKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldFByZWZlckZpcnN0UmVwZWF0ZWRQYXJhbWV0ZXIoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRVbnJlZ2lzdGVyZWRQYXJhbWV0ZXJWYWx1ZVNhbml0aXplcigKLWFuZHJvaWQubmV0LlVybFF1ZXJ5U2FuaXRpemVyJFZhbHVlU2FuaXRpemVyKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB1bmVzY2FwZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5uZXQuV2ViQWRkcmVzcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMT0dUQUcKLQotc3RhdGljIGZpbmFsIGludCBNQVRDSF9HUk9VUF9BVVRIT1JJVFkKLQotc3RhdGljIGZpbmFsIGludCBNQVRDSF9HUk9VUF9IT1NUCi0KLXN0YXRpYyBmaW5hbCBpbnQgTUFUQ0hfR1JPVVBfUEFUSAotCi1zdGF0aWMgZmluYWwgaW50IE1BVENIX0dST1VQX1BPUlQKLQotc3RhdGljIGZpbmFsIGludCBNQVRDSF9HUk9VUF9TQ0hFTUUKLQotc3RhdGljIGphdmEudXRpbC5yZWdleC5QYXR0ZXJuIHNBZGRyZXNzUGF0dGVybgotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBtQXV0aEluZm8KLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgbUhvc3QKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgbVBhdGgKLQotcHVibGljIGludCBtUG9ydAotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBtU2NoZW1lCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL25ldC9QYXJzZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlcXVlc3RJbnRlcmNlcHRvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvSHR0cEV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgcHJvY2VzcygKLW9yZy5hcGFjaGUuaHR0cC5IdHRwUmVxdWVzdAotb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBDb250ZXh0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL25ldC9odHRwL0FuZHJvaWRIdHRwQ2xpZW50OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1maW5hbCBjbGFzcyBhbmRyb2lkLm5ldC5odHRwLkFuZHJvaWRIdHRwQ2xpZW50JDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmFwYWNoZS5odHRwLkh0dHBSZXF1ZXN0SW50ZXJjZXB0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCBwcm9jZXNzKAotb3JnLmFwYWNoZS5odHRwLkh0dHBSZXF1ZXN0Ci1vcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cENvbnRleHQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5jbGllbnQuSHR0cENsaWVudCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xvcmcvYXBhY2hlL2h0dHAvY2xpZW50L0NsaWVudFByb3RvY29sRXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFQ6TGphdmEvbGFuZy9PYmplY3Q7PihMb3JnL2FwYWNoZS9odHRwL0h0dHBIb3N0O0xvcmcvYXBhY2hlL2h0dHAvSHR0cFJlcXVlc3Q7TG9yZy9hcGFjaGUvaHR0cC9jbGllbnQvUmVzcG9uc2VIYW5kbGVyPCtUVDs+OylUVDsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5PYmplY3QgZXhlY3V0ZSgKLW9yZy5hcGFjaGUuaHR0cC5IdHRwSG9zdAotb3JnLmFwYWNoZS5odHRwLkh0dHBSZXF1ZXN0Ci1vcmcuYXBhY2hlLmh0dHAuY2xpZW50LlJlc3BvbnNlSGFuZGxlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+KExvcmcvYXBhY2hlL2h0dHAvSHR0cEhvc3Q7TG9yZy9hcGFjaGUvaHR0cC9IdHRwUmVxdWVzdDtMb3JnL2FwYWNoZS9odHRwL2NsaWVudC9SZXNwb25zZUhhbmRsZXI8K1RUOz47TG9yZy9hcGFjaGUvaHR0cC9wcm90b2NvbC9IdHRwQ29udGV4dDspVFQ7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMb3JnL2FwYWNoZS9odHRwL2NsaWVudC9DbGllbnRQcm90b2NvbEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5PYmplY3QgZXhlY3V0ZSgKLW9yZy5hcGFjaGUuaHR0cC5IdHRwSG9zdAotb3JnLmFwYWNoZS5odHRwLkh0dHBSZXF1ZXN0Ci1vcmcuYXBhY2hlLmh0dHAuY2xpZW50LlJlc3BvbnNlSGFuZGxlcgotb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBDb250ZXh0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz4oTG9yZy9hcGFjaGUvaHR0cC9jbGllbnQvbWV0aG9kcy9IdHRwVXJpUmVxdWVzdDtMb3JnL2FwYWNoZS9odHRwL2NsaWVudC9SZXNwb25zZUhhbmRsZXI8K1RUOz47KVRUOyApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TG9yZy9hcGFjaGUvaHR0cC9jbGllbnQvQ2xpZW50UHJvdG9jb2xFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuT2JqZWN0IGV4ZWN1dGUoCi1vcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuSHR0cFVyaVJlcXVlc3QKLW9yZy5hcGFjaGUuaHR0cC5jbGllbnQuUmVzcG9uc2VIYW5kbGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz4oTG9yZy9hcGFjaGUvaHR0cC9jbGllbnQvbWV0aG9kcy9IdHRwVXJpUmVxdWVzdDtMb3JnL2FwYWNoZS9odHRwL2NsaWVudC9SZXNwb25zZUhhbmRsZXI8K1RUOz47TG9yZy9hcGFjaGUvaHR0cC9wcm90b2NvbC9IdHRwQ29udGV4dDspVFQ7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMb3JnL2FwYWNoZS9odHRwL2NsaWVudC9DbGllbnRQcm90b2NvbEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5PYmplY3QgZXhlY3V0ZSgKLW9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcy5IdHRwVXJpUmVxdWVzdAotb3JnLmFwYWNoZS5odHRwLmNsaWVudC5SZXNwb25zZUhhbmRsZXIKLW9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwQ29udGV4dCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMb3JnL2FwYWNoZS9odHRwL2NsaWVudC9DbGllbnRQcm90b2NvbEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IG9yZy5hcGFjaGUuaHR0cC5IdHRwUmVzcG9uc2UgZXhlY3V0ZSgKLW9yZy5hcGFjaGUuaHR0cC5IdHRwSG9zdAotb3JnLmFwYWNoZS5odHRwLkh0dHBSZXF1ZXN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xvcmcvYXBhY2hlL2h0dHAvY2xpZW50L0NsaWVudFByb3RvY29sRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLmFwYWNoZS5odHRwLkh0dHBSZXNwb25zZSBleGVjdXRlKAotb3JnLmFwYWNoZS5odHRwLkh0dHBIb3N0Ci1vcmcuYXBhY2hlLmh0dHAuSHR0cFJlcXVlc3QKLW9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwQ29udGV4dCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMb3JnL2FwYWNoZS9odHRwL2NsaWVudC9DbGllbnRQcm90b2NvbEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IG9yZy5hcGFjaGUuaHR0cC5IdHRwUmVzcG9uc2UgZXhlY3V0ZSgKLW9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcy5IdHRwVXJpUmVxdWVzdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMb3JnL2FwYWNoZS9odHRwL2NsaWVudC9DbGllbnRQcm90b2NvbEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IG9yZy5hcGFjaGUuaHR0cC5IdHRwUmVzcG9uc2UgZXhlY3V0ZSgKLW9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcy5IdHRwVXJpUmVxdWVzdAotb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBDb250ZXh0KQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLmFwYWNoZS5odHRwLmNvbm4uQ2xpZW50Q29ubmVjdGlvbk1hbmFnZXIgZ2V0Q29ubmVjdGlvbk1hbmFnZXIoKQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zIGdldFBhcmFtcygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmltcGwuY2xpZW50LkFic3RyYWN0SHR0cENsaWVudCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lkh0dHBDbGllbnQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBvcmcuYXBhY2hlLmh0dHAuY29ubi5DbGllbnRDb25uZWN0aW9uTWFuYWdlciBjb25uTWFuYWdlcgotCi1wcml2YXRlIG9yZy5hcGFjaGUuaHR0cC5jbGllbnQuQ29va2llU3RvcmUgY29va2llU3RvcmUKLQotcHJpdmF0ZSBvcmcuYXBhY2hlLmh0dHAuY2xpZW50LkNyZWRlbnRpYWxzUHJvdmlkZXIgY3JlZHNQcm92aWRlcgotCi1wcml2YXRlIG9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcyBkZWZhdWx0UGFyYW1zCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkJhc2ljSHR0cFByb2Nlc3NvciBodHRwUHJvY2Vzc29yCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5odHRwLmNvbm4uQ29ubmVjdGlvbktlZXBBbGl2ZVN0cmF0ZWd5IGtlZXBBbGl2ZVN0cmF0ZWd5Ci0KLXByaXZhdGUgZmluYWwgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZwotCi1wcml2YXRlIG9yZy5hcGFjaGUuaHR0cC5jbGllbnQuQXV0aGVudGljYXRpb25IYW5kbGVyIHByb3h5QXV0aEhhbmRsZXIKLQotcHJpdmF0ZSBvcmcuYXBhY2hlLmh0dHAuY2xpZW50LlJlZGlyZWN0SGFuZGxlciByZWRpcmVjdEhhbmRsZXIKLQotcHJpdmF0ZSBvcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cFJlcXVlc3RFeGVjdXRvciByZXF1ZXN0RXhlYwotCi1wcml2YXRlIG9yZy5hcGFjaGUuaHR0cC5jbGllbnQuSHR0cFJlcXVlc3RSZXRyeUhhbmRsZXIgcmV0cnlIYW5kbGVyCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5odHRwLkNvbm5lY3Rpb25SZXVzZVN0cmF0ZWd5IHJldXNlU3RyYXRlZ3kKLQotcHJpdmF0ZSBvcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLkh0dHBSb3V0ZVBsYW5uZXIgcm91dGVQbGFubmVyCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5odHRwLmF1dGguQXV0aFNjaGVtZVJlZ2lzdHJ5IHN1cHBvcnRlZEF1dGhTY2hlbWVzCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5Db29raWVTcGVjUmVnaXN0cnkgc3VwcG9ydGVkQ29va2llU3BlY3MKLQotcHJpdmF0ZSBvcmcuYXBhY2hlLmh0dHAuY2xpZW50LkF1dGhlbnRpY2F0aW9uSGFuZGxlciB0YXJnZXRBdXRoSGFuZGxlcgotCi1wcml2YXRlIG9yZy5hcGFjaGUuaHR0cC5jbGllbnQuVXNlclRva2VuSGFuZGxlciB1c2VyVG9rZW5IYW5kbGVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5odHRwLmNvbm4uQ2xpZW50Q29ubmVjdGlvbk1hbmFnZXIKLW9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcykKLQotcHJpdmF0ZSBvcmcuYXBhY2hlLmh0dHAuSHR0cEhvc3QgZGV0ZXJtaW5lVGFyZ2V0KAotb3JnLmFwYWNoZS5odHRwLmNsaWVudC5tZXRob2RzLkh0dHBVcmlSZXF1ZXN0KQotCi1wdWJsaWMgdm9pZCBhZGRSZXF1ZXN0SW50ZXJjZXB0b3IoCi1vcmcuYXBhY2hlLmh0dHAuSHR0cFJlcXVlc3RJbnRlcmNlcHRvcikKLQotcHVibGljIHZvaWQgYWRkUmVxdWVzdEludGVyY2VwdG9yKAotb3JnLmFwYWNoZS5odHRwLkh0dHBSZXF1ZXN0SW50ZXJjZXB0b3IKLWludCkKLQotcHVibGljIHZvaWQgYWRkUmVzcG9uc2VJbnRlcmNlcHRvcigKLW9yZy5hcGFjaGUuaHR0cC5IdHRwUmVzcG9uc2VJbnRlcmNlcHRvcikKLQotcHVibGljIHZvaWQgYWRkUmVzcG9uc2VJbnRlcmNlcHRvcigKLW9yZy5hcGFjaGUuaHR0cC5IdHRwUmVzcG9uc2VJbnRlcmNlcHRvcgotaW50KQotCi1wdWJsaWMgdm9pZCBjbGVhclJlcXVlc3RJbnRlcmNlcHRvcnMoKQotCi1wdWJsaWMgdm9pZCBjbGVhclJlc3BvbnNlSW50ZXJjZXB0b3JzKCkKLQotcHJvdGVjdGVkIGFic3RyYWN0IG9yZy5hcGFjaGUuaHR0cC5hdXRoLkF1dGhTY2hlbWVSZWdpc3RyeSBjcmVhdGVBdXRoU2NoZW1lUmVnaXN0cnkoKQotCi1wcm90ZWN0ZWQgYWJzdHJhY3Qgb3JnLmFwYWNoZS5odHRwLmNvbm4uQ2xpZW50Q29ubmVjdGlvbk1hbmFnZXIgY3JlYXRlQ2xpZW50Q29ubmVjdGlvbk1hbmFnZXIoKQotCi1wcm90ZWN0ZWQgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5SZXF1ZXN0RGlyZWN0b3IgY3JlYXRlQ2xpZW50UmVxdWVzdERpcmVjdG9yKAotb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBSZXF1ZXN0RXhlY3V0b3IKLW9yZy5hcGFjaGUuaHR0cC5jb25uLkNsaWVudENvbm5lY3Rpb25NYW5hZ2VyCi1vcmcuYXBhY2hlLmh0dHAuQ29ubmVjdGlvblJldXNlU3RyYXRlZ3kKLW9yZy5hcGFjaGUuaHR0cC5jb25uLkNvbm5lY3Rpb25LZWVwQWxpdmVTdHJhdGVneQotb3JnLmFwYWNoZS5odHRwLmNvbm4ucm91dGluZy5IdHRwUm91dGVQbGFubmVyCi1vcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cFByb2Nlc3Nvcgotb3JnLmFwYWNoZS5odHRwLmNsaWVudC5IdHRwUmVxdWVzdFJldHJ5SGFuZGxlcgotb3JnLmFwYWNoZS5odHRwLmNsaWVudC5SZWRpcmVjdEhhbmRsZXIKLW9yZy5hcGFjaGUuaHR0cC5jbGllbnQuQXV0aGVudGljYXRpb25IYW5kbGVyCi1vcmcuYXBhY2hlLmh0dHAuY2xpZW50LkF1dGhlbnRpY2F0aW9uSGFuZGxlcgotb3JnLmFwYWNoZS5odHRwLmNsaWVudC5Vc2VyVG9rZW5IYW5kbGVyCi1vcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMpCi0KLXByb3RlY3RlZCBhYnN0cmFjdCBvcmcuYXBhY2hlLmh0dHAuY29ubi5Db25uZWN0aW9uS2VlcEFsaXZlU3RyYXRlZ3kgY3JlYXRlQ29ubmVjdGlvbktlZXBBbGl2ZVN0cmF0ZWd5KCkKLQotcHJvdGVjdGVkIGFic3RyYWN0IG9yZy5hcGFjaGUuaHR0cC5Db25uZWN0aW9uUmV1c2VTdHJhdGVneSBjcmVhdGVDb25uZWN0aW9uUmV1c2VTdHJhdGVneSgpCi0KLXByb3RlY3RlZCBhYnN0cmFjdCBvcmcuYXBhY2hlLmh0dHAuY29va2llLkNvb2tpZVNwZWNSZWdpc3RyeSBjcmVhdGVDb29raWVTcGVjUmVnaXN0cnkoKQotCi1wcm90ZWN0ZWQgYWJzdHJhY3Qgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5Db29raWVTdG9yZSBjcmVhdGVDb29raWVTdG9yZSgpCi0KLXByb3RlY3RlZCBhYnN0cmFjdCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50LkNyZWRlbnRpYWxzUHJvdmlkZXIgY3JlYXRlQ3JlZGVudGlhbHNQcm92aWRlcigpCi0KLXByb3RlY3RlZCBhYnN0cmFjdCBvcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cENvbnRleHQgY3JlYXRlSHR0cENvbnRleHQoKQotCi1wcm90ZWN0ZWQgYWJzdHJhY3Qgb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zIGNyZWF0ZUh0dHBQYXJhbXMoKQotCi1wcm90ZWN0ZWQgYWJzdHJhY3Qgb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkJhc2ljSHR0cFByb2Nlc3NvciBjcmVhdGVIdHRwUHJvY2Vzc29yKCkKLQotcHJvdGVjdGVkIGFic3RyYWN0IG9yZy5hcGFjaGUuaHR0cC5jbGllbnQuSHR0cFJlcXVlc3RSZXRyeUhhbmRsZXIgY3JlYXRlSHR0cFJlcXVlc3RSZXRyeUhhbmRsZXIoKQotCi1wcm90ZWN0ZWQgYWJzdHJhY3Qgb3JnLmFwYWNoZS5odHRwLmNvbm4ucm91dGluZy5IdHRwUm91dGVQbGFubmVyIGNyZWF0ZUh0dHBSb3V0ZVBsYW5uZXIoKQotCi1wcm90ZWN0ZWQgYWJzdHJhY3Qgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5BdXRoZW50aWNhdGlvbkhhbmRsZXIgY3JlYXRlUHJveHlBdXRoZW50aWNhdGlvbkhhbmRsZXIoKQotCi1wcm90ZWN0ZWQgYWJzdHJhY3Qgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5SZWRpcmVjdEhhbmRsZXIgY3JlYXRlUmVkaXJlY3RIYW5kbGVyKCkKLQotcHJvdGVjdGVkIGFic3RyYWN0IG9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwUmVxdWVzdEV4ZWN1dG9yIGNyZWF0ZVJlcXVlc3RFeGVjdXRvcigpCi0KLXByb3RlY3RlZCBhYnN0cmFjdCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50LkF1dGhlbnRpY2F0aW9uSGFuZGxlciBjcmVhdGVUYXJnZXRBdXRoZW50aWNhdGlvbkhhbmRsZXIoKQotCi1wcm90ZWN0ZWQgYWJzdHJhY3Qgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5Vc2VyVG9rZW5IYW5kbGVyIGNyZWF0ZVVzZXJUb2tlbkhhbmRsZXIoKQotCi1wcm90ZWN0ZWQgb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zIGRldGVybWluZVBhcmFtcygKLW9yZy5hcGFjaGUuaHR0cC5IdHRwUmVxdWVzdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+KExvcmcvYXBhY2hlL2h0dHAvSHR0cEhvc3Q7TG9yZy9hcGFjaGUvaHR0cC9IdHRwUmVxdWVzdDtMb3JnL2FwYWNoZS9odHRwL2NsaWVudC9SZXNwb25zZUhhbmRsZXI8K1RUOz47KVRUOyApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TG9yZy9hcGFjaGUvaHR0cC9jbGllbnQvQ2xpZW50UHJvdG9jb2xFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGV4ZWN1dGUoCi1vcmcuYXBhY2hlLmh0dHAuSHR0cEhvc3QKLW9yZy5hcGFjaGUuaHR0cC5IdHRwUmVxdWVzdAotb3JnLmFwYWNoZS5odHRwLmNsaWVudC5SZXNwb25zZUhhbmRsZXIpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFQ6TGphdmEvbGFuZy9PYmplY3Q7PihMb3JnL2FwYWNoZS9odHRwL0h0dHBIb3N0O0xvcmcvYXBhY2hlL2h0dHAvSHR0cFJlcXVlc3Q7TG9yZy9hcGFjaGUvaHR0cC9jbGllbnQvUmVzcG9uc2VIYW5kbGVyPCtUVDs+O0xvcmcvYXBhY2hlL2h0dHAvcHJvdG9jb2wvSHR0cENvbnRleHQ7KVRUOyApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TG9yZy9hcGFjaGUvaHR0cC9jbGllbnQvQ2xpZW50UHJvdG9jb2xFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGV4ZWN1dGUoCi1vcmcuYXBhY2hlLmh0dHAuSHR0cEhvc3QKLW9yZy5hcGFjaGUuaHR0cC5IdHRwUmVxdWVzdAotb3JnLmFwYWNoZS5odHRwLmNsaWVudC5SZXNwb25zZUhhbmRsZXIKLW9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwQ29udGV4dCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+KExvcmcvYXBhY2hlL2h0dHAvY2xpZW50L21ldGhvZHMvSHR0cFVyaVJlcXVlc3Q7TG9yZy9hcGFjaGUvaHR0cC9jbGllbnQvUmVzcG9uc2VIYW5kbGVyPCtUVDs+OylUVDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xvcmcvYXBhY2hlL2h0dHAvY2xpZW50L0NsaWVudFByb3RvY29sRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBleGVjdXRlKAotb3JnLmFwYWNoZS5odHRwLmNsaWVudC5tZXRob2RzLkh0dHBVcmlSZXF1ZXN0Ci1vcmcuYXBhY2hlLmh0dHAuY2xpZW50LlJlc3BvbnNlSGFuZGxlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMb3JnL2FwYWNoZS9odHRwL2NsaWVudC9DbGllbnRQcm90b2NvbEV4Y2VwdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz4oTG9yZy9hcGFjaGUvaHR0cC9jbGllbnQvbWV0aG9kcy9IdHRwVXJpUmVxdWVzdDtMb3JnL2FwYWNoZS9odHRwL2NsaWVudC9SZXNwb25zZUhhbmRsZXI8K1RUOz47TG9yZy9hcGFjaGUvaHR0cC9wcm90b2NvbC9IdHRwQ29udGV4dDspVFQ7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGV4ZWN1dGUoCi1vcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuSHR0cFVyaVJlcXVlc3QKLW9yZy5hcGFjaGUuaHR0cC5jbGllbnQuUmVzcG9uc2VIYW5kbGVyCi1vcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cENvbnRleHQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TG9yZy9hcGFjaGUvaHR0cC9jbGllbnQvQ2xpZW50UHJvdG9jb2xFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlIGV4ZWN1dGUoCi1vcmcuYXBhY2hlLmh0dHAuSHR0cEhvc3QKLW9yZy5hcGFjaGUuaHR0cC5IdHRwUmVxdWVzdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMb3JnL2FwYWNoZS9odHRwL2NsaWVudC9DbGllbnRQcm90b2NvbEV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5IdHRwUmVzcG9uc2UgZXhlY3V0ZSgKLW9yZy5hcGFjaGUuaHR0cC5IdHRwSG9zdAotb3JnLmFwYWNoZS5odHRwLkh0dHBSZXF1ZXN0Ci1vcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cENvbnRleHQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TG9yZy9hcGFjaGUvaHR0cC9jbGllbnQvQ2xpZW50UHJvdG9jb2xFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlIGV4ZWN1dGUoCi1vcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuSHR0cFVyaVJlcXVlc3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TG9yZy9hcGFjaGUvaHR0cC9jbGllbnQvQ2xpZW50UHJvdG9jb2xFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlIGV4ZWN1dGUoCi1vcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuSHR0cFVyaVJlcXVlc3QKLW9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwQ29udGV4dCkKLQotcHVibGljIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5hdXRoLkF1dGhTY2hlbWVSZWdpc3RyeSBnZXRBdXRoU2NoZW1lcygpCi0KLXB1YmxpYyBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuY29ubi5Db25uZWN0aW9uS2VlcEFsaXZlU3RyYXRlZ3kgZ2V0Q29ubmVjdGlvbktlZXBBbGl2ZVN0cmF0ZWd5KCkKLQotcHVibGljIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5jb25uLkNsaWVudENvbm5lY3Rpb25NYW5hZ2VyIGdldENvbm5lY3Rpb25NYW5hZ2VyKCkKLQotcHVibGljIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5Db25uZWN0aW9uUmV1c2VTdHJhdGVneSBnZXRDb25uZWN0aW9uUmV1c2VTdHJhdGVneSgpCi0KLXB1YmxpYyBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuY29va2llLkNvb2tpZVNwZWNSZWdpc3RyeSBnZXRDb29raWVTcGVjcygpCi0KLXB1YmxpYyBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50LkNvb2tpZVN0b3JlIGdldENvb2tpZVN0b3JlKCkKLQotcHVibGljIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5jbGllbnQuQ3JlZGVudGlhbHNQcm92aWRlciBnZXRDcmVkZW50aWFsc1Byb3ZpZGVyKCkKLQotcHJvdGVjdGVkIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5CYXNpY0h0dHBQcm9jZXNzb3IgZ2V0SHR0cFByb2Nlc3NvcigpCi0KLXB1YmxpYyBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lkh0dHBSZXF1ZXN0UmV0cnlIYW5kbGVyIGdldEh0dHBSZXF1ZXN0UmV0cnlIYW5kbGVyKCkKLQotcHVibGljIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcyBnZXRQYXJhbXMoKQotCi1wdWJsaWMgZmluYWwgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5BdXRoZW50aWNhdGlvbkhhbmRsZXIgZ2V0UHJveHlBdXRoZW50aWNhdGlvbkhhbmRsZXIoKQotCi1wdWJsaWMgZmluYWwgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5SZWRpcmVjdEhhbmRsZXIgZ2V0UmVkaXJlY3RIYW5kbGVyKCkKLQotcHVibGljIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwUmVxdWVzdEV4ZWN1dG9yIGdldFJlcXVlc3RFeGVjdXRvcigpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlcXVlc3RJbnRlcmNlcHRvciBnZXRSZXF1ZXN0SW50ZXJjZXB0b3IoCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0UmVxdWVzdEludGVyY2VwdG9yQ291bnQoKQotCi1wdWJsaWMgb3JnLmFwYWNoZS5odHRwLkh0dHBSZXNwb25zZUludGVyY2VwdG9yIGdldFJlc3BvbnNlSW50ZXJjZXB0b3IoCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0UmVzcG9uc2VJbnRlcmNlcHRvckNvdW50KCkKLQotcHVibGljIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5jb25uLnJvdXRpbmcuSHR0cFJvdXRlUGxhbm5lciBnZXRSb3V0ZVBsYW5uZXIoKQotCi1wdWJsaWMgZmluYWwgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5BdXRoZW50aWNhdGlvbkhhbmRsZXIgZ2V0VGFyZ2V0QXV0aGVudGljYXRpb25IYW5kbGVyKCkKLQotcHVibGljIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5jbGllbnQuVXNlclRva2VuSGFuZGxlciBnZXRVc2VyVG9rZW5IYW5kbGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9DbGFzczwrTG9yZy9hcGFjaGUvaHR0cC9IdHRwUmVxdWVzdEludGVyY2VwdG9yOz47KVYgKQotcHVibGljIHZvaWQgcmVtb3ZlUmVxdWVzdEludGVyY2VwdG9yQnlDbGFzcygKLWphdmEubGFuZy5DbGFzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9DbGFzczwrTG9yZy9hcGFjaGUvaHR0cC9IdHRwUmVzcG9uc2VJbnRlcmNlcHRvcjs+OylWICkKLXB1YmxpYyB2b2lkIHJlbW92ZVJlc3BvbnNlSW50ZXJjZXB0b3JCeUNsYXNzKAotamF2YS5sYW5nLkNsYXNzKQotCi1wdWJsaWMgdm9pZCBzZXRBdXRoU2NoZW1lcygKLW9yZy5hcGFjaGUuaHR0cC5hdXRoLkF1dGhTY2hlbWVSZWdpc3RyeSkKLQotcHVibGljIHZvaWQgc2V0Q29va2llU3BlY3MoCi1vcmcuYXBhY2hlLmh0dHAuY29va2llLkNvb2tpZVNwZWNSZWdpc3RyeSkKLQotcHVibGljIHZvaWQgc2V0Q29va2llU3RvcmUoCi1vcmcuYXBhY2hlLmh0dHAuY2xpZW50LkNvb2tpZVN0b3JlKQotCi1wdWJsaWMgdm9pZCBzZXRDcmVkZW50aWFsc1Byb3ZpZGVyKAotb3JnLmFwYWNoZS5odHRwLmNsaWVudC5DcmVkZW50aWFsc1Byb3ZpZGVyKQotCi1wdWJsaWMgdm9pZCBzZXRIdHRwUmVxdWVzdFJldHJ5SGFuZGxlcigKLW9yZy5hcGFjaGUuaHR0cC5jbGllbnQuSHR0cFJlcXVlc3RSZXRyeUhhbmRsZXIpCi0KLXB1YmxpYyB2b2lkIHNldEtlZXBBbGl2ZVN0cmF0ZWd5KAotb3JnLmFwYWNoZS5odHRwLmNvbm4uQ29ubmVjdGlvbktlZXBBbGl2ZVN0cmF0ZWd5KQotCi1wdWJsaWMgdm9pZCBzZXRQYXJhbXMoCi1vcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMpCi0KLXB1YmxpYyB2b2lkIHNldFByb3h5QXV0aGVudGljYXRpb25IYW5kbGVyKAotb3JnLmFwYWNoZS5odHRwLmNsaWVudC5BdXRoZW50aWNhdGlvbkhhbmRsZXIpCi0KLXB1YmxpYyB2b2lkIHNldFJlZGlyZWN0SGFuZGxlcigKLW9yZy5hcGFjaGUuaHR0cC5jbGllbnQuUmVkaXJlY3RIYW5kbGVyKQotCi1wdWJsaWMgdm9pZCBzZXRSZXVzZVN0cmF0ZWd5KAotb3JnLmFwYWNoZS5odHRwLkNvbm5lY3Rpb25SZXVzZVN0cmF0ZWd5KQotCi1wdWJsaWMgdm9pZCBzZXRSb3V0ZVBsYW5uZXIoCi1vcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLkh0dHBSb3V0ZVBsYW5uZXIpCi0KLXB1YmxpYyB2b2lkIHNldFRhcmdldEF1dGhlbnRpY2F0aW9uSGFuZGxlcigKLW9yZy5hcGFjaGUuaHR0cC5jbGllbnQuQXV0aGVudGljYXRpb25IYW5kbGVyKQotCi1wdWJsaWMgdm9pZCBzZXRVc2VyVG9rZW5IYW5kbGVyKAotb3JnLmFwYWNoZS5odHRwLmNsaWVudC5Vc2VyVG9rZW5IYW5kbGVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNsaWVudC5EZWZhdWx0SHR0cENsaWVudCBleHRlbmRzIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNsaWVudC5BYnN0cmFjdEh0dHBDbGllbnQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmh0dHAuY29ubi5DbGllbnRDb25uZWN0aW9uTWFuYWdlcgotb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMpCi0KLXByb3RlY3RlZCBvcmcuYXBhY2hlLmh0dHAuYXV0aC5BdXRoU2NoZW1lUmVnaXN0cnkgY3JlYXRlQXV0aFNjaGVtZVJlZ2lzdHJ5KCkKLQotcHJvdGVjdGVkIG9yZy5hcGFjaGUuaHR0cC5jb25uLkNsaWVudENvbm5lY3Rpb25NYW5hZ2VyIGNyZWF0ZUNsaWVudENvbm5lY3Rpb25NYW5hZ2VyKCkKLQotcHJvdGVjdGVkIG9yZy5hcGFjaGUuaHR0cC5jb25uLkNvbm5lY3Rpb25LZWVwQWxpdmVTdHJhdGVneSBjcmVhdGVDb25uZWN0aW9uS2VlcEFsaXZlU3RyYXRlZ3koKQotCi1wcm90ZWN0ZWQgb3JnLmFwYWNoZS5odHRwLkNvbm5lY3Rpb25SZXVzZVN0cmF0ZWd5IGNyZWF0ZUNvbm5lY3Rpb25SZXVzZVN0cmF0ZWd5KCkKLQotcHJvdGVjdGVkIG9yZy5hcGFjaGUuaHR0cC5jb29raWUuQ29va2llU3BlY1JlZ2lzdHJ5IGNyZWF0ZUNvb2tpZVNwZWNSZWdpc3RyeSgpCi0KLXByb3RlY3RlZCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50LkNvb2tpZVN0b3JlIGNyZWF0ZUNvb2tpZVN0b3JlKCkKLQotcHJvdGVjdGVkIG9yZy5hcGFjaGUuaHR0cC5jbGllbnQuQ3JlZGVudGlhbHNQcm92aWRlciBjcmVhdGVDcmVkZW50aWFsc1Byb3ZpZGVyKCkKLQotcHJvdGVjdGVkIG9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwQ29udGV4dCBjcmVhdGVIdHRwQ29udGV4dCgpCi0KLXByb3RlY3RlZCBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMgY3JlYXRlSHR0cFBhcmFtcygpCi0KLXByb3RlY3RlZCBvcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuQmFzaWNIdHRwUHJvY2Vzc29yIGNyZWF0ZUh0dHBQcm9jZXNzb3IoKQotCi1wcm90ZWN0ZWQgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5IdHRwUmVxdWVzdFJldHJ5SGFuZGxlciBjcmVhdGVIdHRwUmVxdWVzdFJldHJ5SGFuZGxlcigpCi0KLXByb3RlY3RlZCBvcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLkh0dHBSb3V0ZVBsYW5uZXIgY3JlYXRlSHR0cFJvdXRlUGxhbm5lcigpCi0KLXByb3RlY3RlZCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50LkF1dGhlbnRpY2F0aW9uSGFuZGxlciBjcmVhdGVQcm94eUF1dGhlbnRpY2F0aW9uSGFuZGxlcigpCi0KLXByb3RlY3RlZCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50LlJlZGlyZWN0SGFuZGxlciBjcmVhdGVSZWRpcmVjdEhhbmRsZXIoKQotCi1wcm90ZWN0ZWQgb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBSZXF1ZXN0RXhlY3V0b3IgY3JlYXRlUmVxdWVzdEV4ZWN1dG9yKCkKLQotcHJvdGVjdGVkIG9yZy5hcGFjaGUuaHR0cC5jbGllbnQuQXV0aGVudGljYXRpb25IYW5kbGVyIGNyZWF0ZVRhcmdldEF1dGhlbnRpY2F0aW9uSGFuZGxlcigpCi0KLXByb3RlY3RlZCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50LlVzZXJUb2tlbkhhbmRsZXIgY3JlYXRlVXNlclRva2VuSGFuZGxlcigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotIGNsYXNzIGFuZHJvaWQubmV0Lmh0dHAuQW5kcm9pZEh0dHBDbGllbnQkMiBleHRlbmRzIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNsaWVudC5EZWZhdWx0SHR0cENsaWVudAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLm5ldC5odHRwLkFuZHJvaWRIdHRwQ2xpZW50IHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQubmV0Lmh0dHAuQW5kcm9pZEh0dHBDbGllbnQKLW9yZy5hcGFjaGUuaHR0cC5jb25uLkNsaWVudENvbm5lY3Rpb25NYW5hZ2VyCi1vcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMpCi0KLXByb3RlY3RlZCBvcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cENvbnRleHQgY3JlYXRlSHR0cENvbnRleHQoKQotCi1wcm90ZWN0ZWQgb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkJhc2ljSHR0cFByb2Nlc3NvciBjcmVhdGVIdHRwUHJvY2Vzc29yKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9uZXQvaHR0cC9BbmRyb2lkSHR0cENsaWVudDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPUN1cmxMb2dnZXIgKQotIGNsYXNzIGFuZHJvaWQubmV0Lmh0dHAuQW5kcm9pZEh0dHBDbGllbnQkQ3VybExvZ2dlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlcXVlc3RJbnRlcmNlcHRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLm5ldC5odHRwLkFuZHJvaWRIdHRwQ2xpZW50IHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm5ldC5odHRwLkFuZHJvaWRIdHRwQ2xpZW50KQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm5ldC5odHRwLkFuZHJvaWRIdHRwQ2xpZW50Ci1hbmRyb2lkLm5ldC5odHRwLkFuZHJvaWRIdHRwQ2xpZW50JDEpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9IdHRwRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBwcm9jZXNzKAotb3JnLmFwYWNoZS5odHRwLkh0dHBSZXF1ZXN0Ci1vcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cENvbnRleHQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1Mb2dnaW5nQ29uZmlndXJhdGlvbiApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9uZXQvaHR0cC9BbmRyb2lkSHR0cENsaWVudDsgKQotIGNsYXNzIGFuZHJvaWQubmV0Lmh0dHAuQW5kcm9pZEh0dHBDbGllbnQkTG9nZ2luZ0NvbmZpZ3VyYXRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgaW50IGxldmVsCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyB0YWcKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWFuZHJvaWQubmV0Lmh0dHAuQW5kcm9pZEh0dHBDbGllbnQkMSkKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDUwMCgKLWFuZHJvaWQubmV0Lmh0dHAuQW5kcm9pZEh0dHBDbGllbnQkTG9nZ2luZ0NvbmZpZ3VyYXRpb24pCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQ3MDAoCi1hbmRyb2lkLm5ldC5odHRwLkFuZHJvaWRIdHRwQ2xpZW50JExvZ2dpbmdDb25maWd1cmF0aW9uCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIGJvb2xlYW4gaXNMb2dnYWJsZSgpCi0KLXByaXZhdGUgdm9pZCBwcmludGxuKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL25ldC9odHRwL0FuZHJvaWRIdHRwQ2xpZW50JEN1cmxMb2dnZXI7TGFuZHJvaWQvbmV0L2h0dHAvQW5kcm9pZEh0dHBDbGllbnQkTG9nZ2luZ0NvbmZpZ3VyYXRpb247ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLm5ldC5odHRwLkFuZHJvaWRIdHRwQ2xpZW50IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaHR0cC5jbGllbnQuSHR0cENsaWVudAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGxvbmcgREVGQVVMVF9TWU5DX01JTl9HWklQX0JZVEVTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEFHCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9UaHJlYWRMb2NhbDxMamF2YS9sYW5nL0Jvb2xlYW47PjsgKQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlRocmVhZExvY2FsIHNUaHJlYWRCbG9ja2VkCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5IdHRwUmVxdWVzdEludGVyY2VwdG9yIHNUaHJlYWRDaGVja0ludGVyY2VwdG9yCi0KLXByaXZhdGUgdm9sYXRpbGUgYW5kcm9pZC5uZXQuaHR0cC5BbmRyb2lkSHR0cENsaWVudCRMb2dnaW5nQ29uZmlndXJhdGlvbiBjdXJsQ29uZmlndXJhdGlvbgotCi1wcml2YXRlIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5jbGllbnQuSHR0cENsaWVudCBkZWxlZ2F0ZQotCi1wcml2YXRlIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uIG1MZWFrZWRFeGNlcHRpb24KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmh0dHAuY29ubi5DbGllbnRDb25uZWN0aW9uTWFuYWdlcgotb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zKQotCi1zdGF0aWMgamF2YS5sYW5nLlRocmVhZExvY2FsIGFjY2VzcyQwMDAoKQotCi1zdGF0aWMgb3JnLmFwYWNoZS5odHRwLkh0dHBSZXF1ZXN0SW50ZXJjZXB0b3IgYWNjZXNzJDEwMCgpCi0KLXN0YXRpYyBhbmRyb2lkLm5ldC5odHRwLkFuZHJvaWRIdHRwQ2xpZW50JExvZ2dpbmdDb25maWd1cmF0aW9uIGFjY2VzcyQ0MDAoCi1hbmRyb2lkLm5ldC5odHRwLkFuZHJvaWRIdHRwQ2xpZW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1zdGF0aWMgamF2YS5sYW5nLlN0cmluZyBhY2Nlc3MkNjAwKAotb3JnLmFwYWNoZS5odHRwLmNsaWVudC5tZXRob2RzLkh0dHBVcmlSZXF1ZXN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUuaHR0cC5lbnRpdHkuQWJzdHJhY3RIdHRwRW50aXR5IGdldENvbXByZXNzZWRFbnRpdHkoCi1ieXRlW10KLWFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIpCi0KLXB1YmxpYyBzdGF0aWMgbG9uZyBnZXRNaW5HemlwU2l6ZSgKLWFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgamF2YS5pby5JbnB1dFN0cmVhbSBnZXRVbmd6aXBwZWRDb250ZW50KAotb3JnLmFwYWNoZS5odHRwLkh0dHBFbnRpdHkpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtb2RpZnlSZXF1ZXN0VG9BY2NlcHRHemlwUmVzcG9uc2UoCi1vcmcuYXBhY2hlLmh0dHAuSHR0cFJlcXVlc3QpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5uZXQuaHR0cC5BbmRyb2lkSHR0cENsaWVudCBuZXdJbnN0YW5jZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRUaHJlYWRCbG9ja2VkKAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyB0b0N1cmwoCi1vcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuSHR0cFVyaVJlcXVlc3QpCi0KLXB1YmxpYyB2b2lkIGNsb3NlKCkKLQotcHVibGljIHZvaWQgZGlzYWJsZUN1cmxMb2dnaW5nKCkKLQotcHVibGljIHZvaWQgZW5hYmxlQ3VybExvZ2dpbmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TG9yZy9hcGFjaGUvaHR0cC9jbGllbnQvQ2xpZW50UHJvdG9jb2xFeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+KExvcmcvYXBhY2hlL2h0dHAvSHR0cEhvc3Q7TG9yZy9hcGFjaGUvaHR0cC9IdHRwUmVxdWVzdDtMb3JnL2FwYWNoZS9odHRwL2NsaWVudC9SZXNwb25zZUhhbmRsZXI8K1RUOz47KVRUOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBleGVjdXRlKAotb3JnLmFwYWNoZS5odHRwLkh0dHBIb3N0Ci1vcmcuYXBhY2hlLmh0dHAuSHR0cFJlcXVlc3QKLW9yZy5hcGFjaGUuaHR0cC5jbGllbnQuUmVzcG9uc2VIYW5kbGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz4oTG9yZy9hcGFjaGUvaHR0cC9IdHRwSG9zdDtMb3JnL2FwYWNoZS9odHRwL0h0dHBSZXF1ZXN0O0xvcmcvYXBhY2hlL2h0dHAvY2xpZW50L1Jlc3BvbnNlSGFuZGxlcjwrVFQ7PjtMb3JnL2FwYWNoZS9odHRwL3Byb3RvY29sL0h0dHBDb250ZXh0OylUVDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xvcmcvYXBhY2hlL2h0dHAvY2xpZW50L0NsaWVudFByb3RvY29sRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBleGVjdXRlKAotb3JnLmFwYWNoZS5odHRwLkh0dHBIb3N0Ci1vcmcuYXBhY2hlLmh0dHAuSHR0cFJlcXVlc3QKLW9yZy5hcGFjaGUuaHR0cC5jbGllbnQuUmVzcG9uc2VIYW5kbGVyCi1vcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cENvbnRleHQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFQ6TGphdmEvbGFuZy9PYmplY3Q7PihMb3JnL2FwYWNoZS9odHRwL2NsaWVudC9tZXRob2RzL0h0dHBVcmlSZXF1ZXN0O0xvcmcvYXBhY2hlL2h0dHAvY2xpZW50L1Jlc3BvbnNlSGFuZGxlcjwrVFQ7PjspVFQ7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMb3JnL2FwYWNoZS9odHRwL2NsaWVudC9DbGllbnRQcm90b2NvbEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZXhlY3V0ZSgKLW9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcy5IdHRwVXJpUmVxdWVzdAotb3JnLmFwYWNoZS5odHRwLmNsaWVudC5SZXNwb25zZUhhbmRsZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TG9yZy9hcGFjaGUvaHR0cC9jbGllbnQvQ2xpZW50UHJvdG9jb2xFeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+KExvcmcvYXBhY2hlL2h0dHAvY2xpZW50L21ldGhvZHMvSHR0cFVyaVJlcXVlc3Q7TG9yZy9hcGFjaGUvaHR0cC9jbGllbnQvUmVzcG9uc2VIYW5kbGVyPCtUVDs+O0xvcmcvYXBhY2hlL2h0dHAvcHJvdG9jb2wvSHR0cENvbnRleHQ7KVRUOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBleGVjdXRlKAotb3JnLmFwYWNoZS5odHRwLmNsaWVudC5tZXRob2RzLkh0dHBVcmlSZXF1ZXN0Ci1vcmcuYXBhY2hlLmh0dHAuY2xpZW50LlJlc3BvbnNlSGFuZGxlcgotb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBDb250ZXh0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgb3JnLmFwYWNoZS5odHRwLkh0dHBSZXNwb25zZSBleGVjdXRlKAotb3JnLmFwYWNoZS5odHRwLkh0dHBIb3N0Ci1vcmcuYXBhY2hlLmh0dHAuSHR0cFJlcXVlc3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlIGV4ZWN1dGUoCi1vcmcuYXBhY2hlLmh0dHAuSHR0cEhvc3QKLW9yZy5hcGFjaGUuaHR0cC5IdHRwUmVxdWVzdAotb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBDb250ZXh0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgb3JnLmFwYWNoZS5odHRwLkh0dHBSZXNwb25zZSBleGVjdXRlKAotb3JnLmFwYWNoZS5odHRwLmNsaWVudC5tZXRob2RzLkh0dHBVcmlSZXF1ZXN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgb3JnLmFwYWNoZS5odHRwLkh0dHBSZXNwb25zZSBleGVjdXRlKAotb3JnLmFwYWNoZS5odHRwLmNsaWVudC5tZXRob2RzLkh0dHBVcmlSZXF1ZXN0Ci1vcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cENvbnRleHQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9UaHJvd2FibGU7ICkKLXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkKLQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5jb25uLkNsaWVudENvbm5lY3Rpb25NYW5hZ2VyIGdldENvbm5lY3Rpb25NYW5hZ2VyKCkKLQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcyBnZXRQYXJhbXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuSHR0cENvbm5lY3Rpb24gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgY2xvc2UoKQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLmFwYWNoZS5odHRwLkh0dHBDb25uZWN0aW9uTWV0cmljcyBnZXRNZXRyaWNzKCkKLQotcHVibGljIGFic3RyYWN0IGludCBnZXRTb2NrZXRUaW1lb3V0KCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNPcGVuKCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNTdGFsZSgpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFNvY2tldFRpbWVvdXQoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNodXRkb3duKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLkh0dHBJbmV0Q29ubmVjdGlvbiBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmh0dHAuSHR0cENvbm5lY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5uZXQuSW5ldEFkZHJlc3MgZ2V0TG9jYWxBZGRyZXNzKCkKLQotcHVibGljIGFic3RyYWN0IGludCBnZXRMb2NhbFBvcnQoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5uZXQuSW5ldEFkZHJlc3MgZ2V0UmVtb3RlQWRkcmVzcygpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0UmVtb3RlUG9ydCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5uZXQuaHR0cC5BbmRyb2lkSHR0cENsaWVudENvbm5lY3Rpb24gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmFwYWNoZS5odHRwLkh0dHBJbmV0Q29ubmVjdGlvbiwgb3JnLmFwYWNoZS5odHRwLkh0dHBDb25uZWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgb3JnLmFwYWNoZS5odHRwLmltcGwuZW50aXR5LkVudGl0eVNlcmlhbGl6ZXIgZW50aXR5c2VyaWFsaXplcgotCi1wcml2YXRlIG9yZy5hcGFjaGUuaHR0cC5pby5TZXNzaW9uSW5wdXRCdWZmZXIgaW5idWZmZXIKLQotcHJpdmF0ZSBpbnQgbWF4SGVhZGVyQ291bnQKLQotcHJpdmF0ZSBpbnQgbWF4TGluZUxlbmd0aAotCi1wcml2YXRlIG9yZy5hcGFjaGUuaHR0cC5pbXBsLkh0dHBDb25uZWN0aW9uTWV0cmljc0ltcGwgbWV0cmljcwotCi1wcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gb3BlbgotCi1wcml2YXRlIG9yZy5hcGFjaGUuaHR0cC5pby5TZXNzaW9uT3V0cHV0QnVmZmVyIG91dGJ1ZmZlcgotCi1wcml2YXRlIG9yZy5hcGFjaGUuaHR0cC5pby5IdHRwTWVzc2FnZVdyaXRlciByZXF1ZXN0V3JpdGVyCi0KLXByaXZhdGUgamF2YS5uZXQuU29ja2V0IHNvY2tldAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgdm9pZCBhc3NlcnROb3RPcGVuKCkKLQotcHJpdmF0ZSB2b2lkIGFzc2VydE9wZW4oKQotCi1wcml2YXRlIGxvbmcgZGV0ZXJtaW5lTGVuZ3RoKAotYW5kcm9pZC5uZXQuaHR0cC5IZWFkZXJzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBiaW5kKAotamF2YS5uZXQuU29ja2V0Ci1vcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNsb3NlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgZG9GbHVzaCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGZsdXNoKCkKLQotcHVibGljIGphdmEubmV0LkluZXRBZGRyZXNzIGdldExvY2FsQWRkcmVzcygpCi0KLXB1YmxpYyBpbnQgZ2V0TG9jYWxQb3J0KCkKLQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5IdHRwQ29ubmVjdGlvbk1ldHJpY3MgZ2V0TWV0cmljcygpCi0KLXB1YmxpYyBqYXZhLm5ldC5JbmV0QWRkcmVzcyBnZXRSZW1vdGVBZGRyZXNzKCkKLQotcHVibGljIGludCBnZXRSZW1vdGVQb3J0KCkKLQotcHVibGljIGludCBnZXRTb2NrZXRUaW1lb3V0KCkKLQotcHVibGljIGJvb2xlYW4gaXNPcGVuKCkKLQotcHVibGljIGJvb2xlYW4gaXNTdGFsZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TG9yZy9hcGFjaGUvaHR0cC9QYXJzZUV4Y2VwdGlvbjsgKQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5TdGF0dXNMaW5lIHBhcnNlUmVzcG9uc2VIZWFkZXIoCi1hbmRyb2lkLm5ldC5odHRwLkhlYWRlcnMpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAuSHR0cEVudGl0eSByZWNlaXZlUmVzcG9uc2VFbnRpdHkoCi1hbmRyb2lkLm5ldC5odHRwLkhlYWRlcnMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9IdHRwRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZW5kUmVxdWVzdEVudGl0eSgKLW9yZy5hcGFjaGUuaHR0cC5IdHRwRW50aXR5RW5jbG9zaW5nUmVxdWVzdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL0h0dHBFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNlbmRSZXF1ZXN0SGVhZGVyKAotb3JnLmFwYWNoZS5odHRwLkh0dHBSZXF1ZXN0KQotCi1wdWJsaWMgdm9pZCBzZXRTb2NrZXRUaW1lb3V0KAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzaHV0ZG93bigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLSBjbGFzcyBhbmRyb2lkLm5ldC5odHRwLkNlcnRpZmljYXRlQ2hhaW5WYWxpZGF0b3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGFuZHJvaWQubmV0Lmh0dHAuQ2VydGlmaWNhdGVDaGFpblZhbGlkYXRvciBzSW5zdGFuY2UKLQotcHJpdmF0ZSBzdGF0aWMgbG9uZyBzVG90YWwKLQotcHJpdmF0ZSBzdGF0aWMgbG9uZyBzVG90YWxSZXVzZWQKLQotcHJpdmF0ZSBqYXZheC5uZXQuc3NsLlg1MDlUcnVzdE1hbmFnZXIgbURlZmF1bHRUcnVzdE1hbmFnZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZheC9uZXQvc3NsL1NTTEhhbmRzaGFrZUV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIGNsb3NlU29ja2V0VGhyb3dFeGNlcHRpb24oCi1qYXZheC5uZXQuc3NsLlNTTFNvY2tldAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YXgvbmV0L3NzbC9TU0xIYW5kc2hha2VFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCBjbG9zZVNvY2tldFRocm93RXhjZXB0aW9uKAotamF2YXgubmV0LnNzbC5TU0xTb2NrZXQKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5uZXQuaHR0cC5DZXJ0aWZpY2F0ZUNoYWluVmFsaWRhdG9yIGdldEluc3RhbmNlKCkKLQotcHJpdmF0ZSBqYXZheC5uZXQuc3NsLlNTTFNlc3Npb24gZ2V0U1NMU2Vzc2lvbigKLWphdmF4Lm5ldC5zc2wuU1NMQ29udGV4dAotb3JnLmFwYWNoZS5odHRwLkh0dHBIb3N0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZheC9uZXQvc3NsL1NTTEhhbmRzaGFrZUV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFuZHJvaWQubmV0Lmh0dHAuU3NsRXJyb3IgZG9IYW5kc2hha2VBbmRWYWxpZGF0ZVNlcnZlckNlcnRpZmljYXRlcygKLWFuZHJvaWQubmV0Lmh0dHAuSHR0cHNDb25uZWN0aW9uCi1qYXZheC5uZXQuc3NsLlNTTFNvY2tldAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9uZXQvaHR0cC9DZXJ0aWZpY2F0ZVZhbGlkYXRvckNhY2hlOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTIgbmFtZSA9Q2FjaGVFbnRyeSApCi0gY2xhc3MgYW5kcm9pZC5uZXQuaHR0cC5DZXJ0aWZpY2F0ZVZhbGlkYXRvckNhY2hlJENhY2hlRW50cnkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtRG9tYWluCi0KLXByaXZhdGUgYnl0ZVtdIG1IYXNoCi0KLXB1YmxpYyBsb25nIG1TYXZlCi0KLXByaXZhdGUgbG9uZyBtVGltZQotCi1maW5hbCBhbmRyb2lkLm5ldC5odHRwLkNlcnRpZmljYXRlVmFsaWRhdG9yQ2FjaGUgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5uZXQuaHR0cC5DZXJ0aWZpY2F0ZVZhbGlkYXRvckNhY2hlCi1qYXZhLmxhbmcuU3RyaW5nCi1ieXRlW10KLWxvbmcpCi0KLXB1YmxpYyBib29sZWFuIGV4cGlyZWQoKQotCi1wdWJsaWMgYm9vbGVhbiBoYXMoCi1qYXZhLmxhbmcuU3RyaW5nCi1ieXRlW10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9uZXQvaHR0cC9DZXJ0aWZpY2F0ZVZhbGlkYXRvckNhY2hlJENhY2hlRW50cnk7ICkKLSBjbGFzcyBhbmRyb2lkLm5ldC5odHRwLkNlcnRpZmljYXRlVmFsaWRhdG9yQ2FjaGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgQ0FDSEVfRU5UUllfTElGRVRJTUUKLQotcHVibGljIHN0YXRpYyBsb25nIG1Db3N0Ci0KLXB1YmxpYyBzdGF0aWMgbG9uZyBtU2F2ZQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVGYWN0b3J5IHNDZXJ0aWZpY2F0ZUZhY3RvcnkKLQotcHJpdmF0ZSBpbnQgbUJpZ1NjcmV3Ci1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNoTWFwPExqYXZhL2xhbmcvSW50ZWdlcjtMYW5kcm9pZC9uZXQvaHR0cC9DZXJ0aWZpY2F0ZVZhbGlkYXRvckNhY2hlJENhY2hlRW50cnk7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuSGFzaE1hcCBtQ2FjaGVNYXAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgYnl0ZVtdIHNlY3VyZUhhc2goCi1qYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVbXSkKLQotcHVibGljIGJvb2xlYW4gaGFzKAotamF2YS5sYW5nLlN0cmluZwotYnl0ZVtdKQotCi1wdWJsaWMgYm9vbGVhbiBwdXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1ieXRlW10KLWxvbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi0gY2xhc3MgYW5kcm9pZC5uZXQuaHR0cC5DaGFyQXJyYXlCdWZmZXJzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgY2hhciB1cHBlcmNhc2VBZGRvbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXN0YXRpYyBib29sZWFuIGNvbnRhaW5zSWdub3JlQ2FzZVRyaW1tZWQoCi1vcmcuYXBhY2hlLmh0dHAudXRpbC5DaGFyQXJyYXlCdWZmZXIKLWludAotamF2YS5sYW5nLlN0cmluZykKLQotc3RhdGljIGludCBzZXRMb3dlcmNhc2VJbmRleE9mKAotb3JnLmFwYWNoZS5odHRwLnV0aWwuQ2hhckFycmF5QnVmZmVyCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIGNoYXIgdG9Mb3dlcigKLWNoYXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1hYnN0cmFjdCBjbGFzcyBhbmRyb2lkLm5ldC5odHRwLkNvbm5lY3Rpb24gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBET05FCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEUkFJTgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEhUVFBfQ09OTkVDVElPTgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1BJUEUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1JTl9QSVBFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRUFECi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVRSWV9SRVFVRVNUX0xJTUlUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRU5ECi0KLXN0YXRpYyBmaW5hbCBpbnQgU09DS0VUX1RJTUVPVVQKLQotcHJpdmF0ZSBzdGF0aWMgaW50IFNUQVRFX0NBTkNFTF9SRVFVRVNURUQKLQotcHJpdmF0ZSBzdGF0aWMgaW50IFNUQVRFX05PUk1BTAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gc3RhdGVzCi0KLXByaXZhdGUgaW50IG1BY3RpdmUKLQotcHJpdmF0ZSBieXRlW10gbUJ1ZgotCi1wcml2YXRlIGJvb2xlYW4gbUNhblBlcnNpc3QKLQotcHJvdGVjdGVkIGFuZHJvaWQubmV0Lmh0dHAuU3NsQ2VydGlmaWNhdGUgbUNlcnRpZmljYXRlCi0KLSBhbmRyb2lkLm5ldC5odHRwLlJlcXVlc3RRdWV1ZSRDb25uZWN0aW9uTWFuYWdlciBtQ29ubmVjdGlvbk1hbmFnZXIKLQotIGFuZHJvaWQuY29udGVudC5Db250ZXh0IG1Db250ZXh0Ci0KLSBvcmcuYXBhY2hlLmh0dHAuSHR0cEhvc3QgbUhvc3QKLQotcHJvdGVjdGVkIGFuZHJvaWQubmV0Lmh0dHAuQW5kcm9pZEh0dHBDbGllbnRDb25uZWN0aW9uIG1IdHRwQ2xpZW50Q29ubmVjdGlvbgotCi1wcml2YXRlIG9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwQ29udGV4dCBtSHR0cENvbnRleHQKLQotIGFuZHJvaWQubmV0Lmh0dHAuUmVxdWVzdEZlZWRlciBtUmVxdWVzdEZlZWRlcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLW9yZy5hcGFjaGUuaHR0cC5IdHRwSG9zdAotYW5kcm9pZC5uZXQuaHR0cC5SZXF1ZXN0UXVldWUkQ29ubmVjdGlvbk1hbmFnZXIKLWFuZHJvaWQubmV0Lmh0dHAuUmVxdWVzdEZlZWRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9MaW5rZWRMaXN0PExhbmRyb2lkL25ldC9odHRwL1JlcXVlc3Q7PjspWiApCi1wcml2YXRlIGJvb2xlYW4gY2xlYXJQaXBlKAotamF2YS51dGlsLkxpbmtlZExpc3QpCi0KLXN0YXRpYyBhbmRyb2lkLm5ldC5odHRwLkNvbm5lY3Rpb24gZ2V0Q29ubmVjdGlvbigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1vcmcuYXBhY2hlLmh0dHAuSHR0cEhvc3QKLWFuZHJvaWQubmV0Lmh0dHAuUmVxdWVzdFF1ZXVlJENvbm5lY3Rpb25NYW5hZ2VyCi1hbmRyb2lkLm5ldC5odHRwLlJlcXVlc3RGZWVkZXIpCi0KLXByaXZhdGUgYm9vbGVhbiBodHRwRmFpbHVyZSgKLWFuZHJvaWQubmV0Lmh0dHAuUmVxdWVzdAotaW50Ci1qYXZhLmxhbmcuRXhjZXB0aW9uKQotCi1wcml2YXRlIGJvb2xlYW4ga2VlcEFsaXZlKAotb3JnLmFwYWNoZS5odHRwLkh0dHBFbnRpdHkKLW9yZy5hcGFjaGUuaHR0cC5Qcm90b2NvbFZlcnNpb24KLWludAotb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBDb250ZXh0KQotCi1wcml2YXRlIGJvb2xlYW4gb3Blbkh0dHBDb25uZWN0aW9uKAotYW5kcm9pZC5uZXQuaHR0cC5SZXF1ZXN0KQotCi0gdm9pZCBjYW5jZWwoKQotCi1hYnN0cmFjdCB2b2lkIGNsb3NlQ29ubmVjdGlvbigpCi0KLSBieXRlW10gZ2V0QnVmKCkKLQotIGJvb2xlYW4gZ2V0Q2FuUGVyc2lzdCgpCi0KLSBhbmRyb2lkLm5ldC5odHRwLlNzbENlcnRpZmljYXRlIGdldENlcnRpZmljYXRlKCkKLQotIG9yZy5hcGFjaGUuaHR0cC5IdHRwSG9zdCBnZXRIb3N0KCkKLQotIG9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwQ29udGV4dCBnZXRIdHRwQ29udGV4dCgpCi0KLWFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0U2NoZW1lKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotYWJzdHJhY3QgYW5kcm9pZC5uZXQuaHR0cC5BbmRyb2lkSHR0cENsaWVudENvbm5lY3Rpb24gb3BlbkNvbm5lY3Rpb24oCi1hbmRyb2lkLm5ldC5odHRwLlJlcXVlc3QpCi0KLSB2b2lkIHByb2Nlc3NSZXF1ZXN0cygKLWFuZHJvaWQubmV0Lmh0dHAuUmVxdWVzdCkKLQotIHZvaWQgc2V0Q2FuUGVyc2lzdCgKLW9yZy5hcGFjaGUuaHR0cC5IdHRwRW50aXR5Ci1vcmcuYXBhY2hlLmh0dHAuUHJvdG9jb2xWZXJzaW9uCi1pbnQpCi0KLSB2b2lkIHNldENhblBlcnNpc3QoCi1ib29sZWFuKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi0gY2xhc3MgYW5kcm9pZC5uZXQuaHR0cC5Db25uZWN0aW9uVGhyZWFkIGV4dGVuZHMgamF2YS5sYW5nLlRocmVhZAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgaW50IFdBSVRfVElDSwotCi1zdGF0aWMgZmluYWwgaW50IFdBSVRfVElNRU9VVAotCi0gYW5kcm9pZC5uZXQuaHR0cC5Db25uZWN0aW9uIG1Db25uZWN0aW9uCi0KLXByaXZhdGUgYW5kcm9pZC5uZXQuaHR0cC5SZXF1ZXN0UXVldWUkQ29ubmVjdGlvbk1hbmFnZXIgbUNvbm5lY3Rpb25NYW5hZ2VyCi0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgbUNvbnRleHQKLQotIGxvbmcgbUN1cnJlbnRUaHJlYWRUaW1lCi0KLXByaXZhdGUgaW50IG1JZAotCi1wcml2YXRlIGFuZHJvaWQubmV0Lmh0dHAuUmVxdWVzdEZlZWRlciBtUmVxdWVzdEZlZWRlcgotCi1wcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gbVJ1bm5pbmcKLQotIGxvbmcgbVN0YXJ0VGhyZWFkVGltZQotCi1wcml2YXRlIGJvb2xlYW4gbVdhaXRpbmcKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotaW50Ci1hbmRyb2lkLm5ldC5odHRwLlJlcXVlc3RRdWV1ZSRDb25uZWN0aW9uTWFuYWdlcgotYW5kcm9pZC5uZXQuaHR0cC5SZXF1ZXN0RmVlZGVyKQotCi0gdm9pZCByZXF1ZXN0U3RvcCgpCi0KLXB1YmxpYyB2b2lkIHJ1bigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLm5ldC5odHRwLkRvbWFpbk5hbWVDaGVja2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUxUX0ROU19OQU1FCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBTFRfSVBBX05BTUUKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4gUVVJQ0tfSVBfUEFUVEVSTgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkb21haW5Ub2tlbk1hdGNoKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0lwQWRkcmVzcygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBtYXRjaCgKLWphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGUKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbWF0Y2hEbnMoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHN0YXRpYyBib29sZWFuIG1hdGNoRG5zKAotamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZQotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtYXRjaElwQWRkcmVzcygKLWphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGUKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQubmV0Lmh0dHAuRXZlbnRIYW5kbGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9BVVRICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0JBRF9VUkwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfQ09OTkVDVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9GQUlMRURfU1NMX0hBTkRTSEFLRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9JTwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9MT09LVVAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfUFJPWFlBVVRICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX1JFRElSRUNUX0xPT1AKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfVElNRU9VVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9VTlNVUFBPUlRFRF9BVVRIX1NDSEVNRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9VTlNVUFBPUlRFRF9TQ0hFTUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9FUlJPUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxFX05PVF9GT1VORF9FUlJPUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPSwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUT09fTUFOWV9SRVFVRVNUU19FUlJPUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIGVycm9yU3RyaW5nUmVzb3VyY2VzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBjZXJ0aWZpY2F0ZSgKLWFuZHJvaWQubmV0Lmh0dHAuU3NsQ2VydGlmaWNhdGUpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGRhdGEoCi1ieXRlW10KLWludCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZW5kRGF0YSgpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGVycm9yKAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBoYW5kbGVTc2xFcnJvclJlcXVlc3QoCi1hbmRyb2lkLm5ldC5odHRwLlNzbEVycm9yKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBoZWFkZXJzKAotYW5kcm9pZC5uZXQuaHR0cC5IZWFkZXJzKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdGF0dXMoCi1pbnQKLWludAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQubmV0Lmh0dHAuSGVhZGVycyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDQ0VQVF9SQU5HRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENBQ0hFX0NPTlRST0wKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OTl9DTE9TRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ09OTl9ESVJFQ1RJVkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OTl9LRUVQX0FMSVZFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDT05URU5UX0RJU1BPU0lUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDT05URU5UX0VOQ09ESU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDT05URU5UX0xFTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ09OVEVOVF9UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBFVEFHCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBFWFBJUkVTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIQVNIX0FDQ0VQVF9SQU5HRVMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhBU0hfQ0FDSEVfQ09OVFJPTAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSEFTSF9DT05OX0RJUkVDVElWRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSEFTSF9DT05URU5UX0RJU1BPU0lUSU9OCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIQVNIX0NPTlRFTlRfRU5DT0RJTkcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhBU0hfQ09OVEVOVF9MRU4KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhBU0hfQ09OVEVOVF9UWVBFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIQVNIX0VUQUcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhBU0hfRVhQSVJFUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSEFTSF9MQVNUX01PRElGSUVECi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIQVNIX0xPQ0FUSU9OCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIQVNIX1BSQUdNQQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSEFTSF9QUk9YWV9BVVRIRU5USUNBVEUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhBU0hfUFJPWFlfQ09OTkVDVElPTgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSEFTSF9SRUZSRVNICi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIQVNIX1NFVF9DT09LSUUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhBU0hfVFJBTlNGRVJfRU5DT0RJTkcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhBU0hfV1dXX0FVVEhFTlRJQ0FURQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTEFTVF9NT0RJRklFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTE9DQVRJT04KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMT0dUQUcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9fQ09OTl9UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBOT19DT05URU5UX0xFTkdUSAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgTk9fVFJBTlNGRVJfRU5DT0RJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBSQUdNQQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUFJPWFlfQVVUSEVOVElDQVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQUk9YWV9DT05ORUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSRUZSRVNICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTRVRfQ09PS0lFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUUkFOU0ZFUl9FTkNPRElORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgV1dXX0FVVEhFTlRJQ0FURQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgYWNjZXB0UmFuZ2VzCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBjYWNoZUNvbnRyb2wKLQotcHJpdmF0ZSBpbnQgY29ubmVjdGlvblR5cGUKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnREaXNwb3NpdGlvbgotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgY29udGVudEVuY29kaW5nCi0KLXByaXZhdGUgbG9uZyBjb250ZW50TGVuZ3RoCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBjb250ZW50VHlwZQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQXJyYXlMaXN0PExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXByaXZhdGUgamF2YS51dGlsLkFycmF5TGlzdCBjb29raWVzCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBldGFnCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBleHBpcmVzCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBsYXN0TW9kaWZpZWQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGxvY2F0aW9uCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBwcmFnbWEKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHByb3h5QXV0aGVudGljYXRlCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWZyZXNoCi0KLXByaXZhdGUgbG9uZyB0cmFuc2ZlckVuY29kaW5nCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyB3d3dBdXRoZW50aWNhdGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIHZvaWQgc2V0Q29ubmVjdGlvblR5cGUoCi1vcmcuYXBhY2hlLmh0dHAudXRpbC5DaGFyQXJyYXlCdWZmZXIKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QWNjZXB0UmFuZ2VzKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Q2FjaGVDb250cm9sKCkKLQotcHVibGljIGludCBnZXRDb25uZWN0aW9uVHlwZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldENvbnRlbnREaXNwb3NpdGlvbigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldENvbnRlbnRFbmNvZGluZygpCi0KLXB1YmxpYyBsb25nIGdldENvbnRlbnRMZW5ndGgoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRDb250ZW50VHlwZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEV0YWcoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRFeHBpcmVzKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TGFzdE1vZGlmaWVkKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TG9jYXRpb24oKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRQcmFnbWEoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRQcm94eUF1dGhlbnRpY2F0ZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFJlZnJlc2goKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9BcnJheUxpc3Q8TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHVibGljIGphdmEudXRpbC5BcnJheUxpc3QgZ2V0U2V0Q29va2llKCkKLQotcHVibGljIGxvbmcgZ2V0VHJhbnNmZXJFbmNvZGluZygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFd3d0F1dGhlbnRpY2F0ZSgpCi0KLXB1YmxpYyB2b2lkIHBhcnNlSGVhZGVyKAotb3JnLmFwYWNoZS5odHRwLnV0aWwuQ2hhckFycmF5QnVmZmVyKQotCi1wdWJsaWMgdm9pZCBzZXRBY2NlcHRSYW5nZXMoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRDYWNoZUNvbnRyb2woCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRDb250ZW50RGlzcG9zaXRpb24oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRDb250ZW50RW5jb2RpbmcoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRDb250ZW50TGVuZ3RoKAotbG9uZykKLQotcHVibGljIHZvaWQgc2V0Q29udGVudFR5cGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRFdGFnKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0RXhwaXJlcygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHNldExhc3RNb2RpZmllZCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHNldExvY2F0aW9uKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0UHJveHlBdXRoZW50aWNhdGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRXd3dBdXRoZW50aWNhdGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQubmV0Lmh0dHAuSHR0cEF1dGhIZWFkZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUxHT1JJVEhNX1RPS0VOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJBU0lDCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBCQVNJQ19UT0tFTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBESUdFU1QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERJR0VTVF9UT0tFTgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE5PTkNFX1RPS0VOCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgT1BBUVVFX1RPS0VOCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUU9QX1RPS0VOCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUkVBTE1fVE9LRU4KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTVEFMRV9UT0tFTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTktOT1dOCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtQWxnb3JpdGhtCi0KLXByaXZhdGUgYm9vbGVhbiBtSXNQcm94eQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbU5vbmNlCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtT3BhcXVlCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtUGFzc3dvcmQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1Rb3AKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1SZWFsbQotCi1wcml2YXRlIGludCBtU2NoZW1lCi0KLXByaXZhdGUgYm9vbGVhbiBtU3RhbGUKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1Vc2VybmFtZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgdm9pZCBwYXJzZUhlYWRlcigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgdm9pZCBwYXJzZVBhcmFtZXRlcigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgdm9pZCBwYXJzZVBhcmFtZXRlcigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgdm9pZCBwYXJzZVBhcmFtZXRlcnMoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcGFyc2VTY2hlbWUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHZvaWQgcGFyc2VTdGFsZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgdHJpbURvdWJsZVF1b3Rlc0lmQW55KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QWxnb3JpdGhtKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Tm9uY2UoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRPcGFxdWUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRQYXNzd29yZCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFFvcCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFJlYWxtKCkKLQotcHVibGljIGludCBnZXRTY2hlbWUoKQotCi1wdWJsaWMgYm9vbGVhbiBnZXRTdGFsZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFVzZXJuYW1lKCkKLQotcHVibGljIGJvb2xlYW4gaXNCYXNpYygpCi0KLXB1YmxpYyBib29sZWFuIGlzRGlnZXN0KCkKLQotcHVibGljIGJvb2xlYW4gaXNQcm94eSgpCi0KLXB1YmxpYyBib29sZWFuIGlzU3VwcG9ydGVkU2NoZW1lKCkKLQotcHVibGljIHZvaWQgc2V0UGFzc3dvcmQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRQcm94eSgpCi0KLXB1YmxpYyB2b2lkIHNldFVzZXJuYW1lKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLSBjbGFzcyBhbmRyb2lkLm5ldC5odHRwLkh0dHBDb25uZWN0aW9uIGV4dGVuZHMgYW5kcm9pZC5uZXQuaHR0cC5Db25uZWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLW9yZy5hcGFjaGUuaHR0cC5IdHRwSG9zdAotYW5kcm9pZC5uZXQuaHR0cC5SZXF1ZXN0UXVldWUkQ29ubmVjdGlvbk1hbmFnZXIKLWFuZHJvaWQubmV0Lmh0dHAuUmVxdWVzdEZlZWRlcikKLQotIHZvaWQgY2xvc2VDb25uZWN0aW9uKCkKLQotIGphdmEubGFuZy5TdHJpbmcgZ2V0U2NoZW1lKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotIGFuZHJvaWQubmV0Lmh0dHAuQW5kcm9pZEh0dHBDbGllbnRDb25uZWN0aW9uIG9wZW5Db25uZWN0aW9uKAotYW5kcm9pZC5uZXQuaHR0cC5SZXF1ZXN0KQotCi0gdm9pZCByZXN0YXJ0Q29ubmVjdGlvbigKLWJvb2xlYW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi0gY2xhc3MgYW5kcm9pZC5uZXQuaHR0cC5IdHRwTG9nIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTE9HVEFHCi0KLXN0YXRpYyBmaW5hbCBib29sZWFuIExPR1YKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1zdGF0aWMgdm9pZCBlKAotamF2YS5sYW5nLlN0cmluZykKLQotc3RhdGljIHZvaWQgdigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvbmV0L2h0dHAvSHR0cHNDb25uZWN0aW9uOyApCi1maW5hbCBjbGFzcyBhbmRyb2lkLm5ldC5odHRwLkh0dHBzQ29ubmVjdGlvbiQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmF4Lm5ldC5zc2wuWDUwOVRydXN0TWFuYWdlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIGNoZWNrQ2xpZW50VHJ1c3RlZCgKLWphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGVbXQotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgY2hlY2tTZXJ2ZXJUcnVzdGVkKAotamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZVtdCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZVtdIGdldEFjY2VwdGVkSXNzdWVycygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi0gY2xhc3MgYW5kcm9pZC5uZXQuaHR0cC5IdHRwc0Nvbm5lY3Rpb24gZXh0ZW5kcyBhbmRyb2lkLm5ldC5odHRwLkNvbm5lY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgamF2YXgubmV0LnNzbC5TU0xDb250ZXh0IG1Tc2xDb250ZXh0Ci0KLXByaXZhdGUgc3RhdGljIGphdmF4Lm5ldC5zc2wuU1NMU29ja2V0RmFjdG9yeSBtU3NsU29ja2V0RmFjdG9yeQotCi1wcml2YXRlIGJvb2xlYW4gbUFib3J0ZWQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuT2JqZWN0IG1TdXNwZW5kTG9jawotCi1wcml2YXRlIGJvb2xlYW4gbVN1c3BlbmRlZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLW9yZy5hcGFjaGUuaHR0cC5IdHRwSG9zdAotYW5kcm9pZC5uZXQuaHR0cC5SZXF1ZXN0UXVldWUkQ29ubmVjdGlvbk1hbmFnZXIKLWFuZHJvaWQubmV0Lmh0dHAuUmVxdWVzdEZlZWRlcikKLQotc3RhdGljIGphdmF4Lm5ldC5zc2wuU1NMQ29udGV4dCBnZXRDb250ZXh0KCkKLQotIHZvaWQgY2xvc2VDb25uZWN0aW9uKCkKLQotIGphdmEubGFuZy5TdHJpbmcgZ2V0U2NoZW1lKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotIGFuZHJvaWQubmV0Lmh0dHAuQW5kcm9pZEh0dHBDbGllbnRDb25uZWN0aW9uIG9wZW5Db25uZWN0aW9uKAotYW5kcm9pZC5uZXQuaHR0cC5SZXF1ZXN0KQotCi0gdm9pZCByZXN0YXJ0Q29ubmVjdGlvbigKLWJvb2xlYW4pCi0KLSB2b2lkIHNldENlcnRpZmljYXRlKAotYW5kcm9pZC5uZXQuaHR0cC5Tc2xDZXJ0aWZpY2F0ZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTQxMDQgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9uZXQvaHR0cC9JZGxlQ2FjaGU7ICkKLSBjbGFzcyBhbmRyb2lkLm5ldC5odHRwLklkbGVDYWNoZSQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvbmV0L2h0dHAvSWRsZUNhY2hlOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9RW50cnkgKQotIGNsYXNzIGFuZHJvaWQubmV0Lmh0dHAuSWRsZUNhY2hlJEVudHJ5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gYW5kcm9pZC5uZXQuaHR0cC5Db25uZWN0aW9uIG1Db25uZWN0aW9uCi0KLSBvcmcuYXBhY2hlLmh0dHAuSHR0cEhvc3QgbUhvc3QKLQotIGxvbmcgbVRpbWVvdXQKLQotZmluYWwgYW5kcm9pZC5uZXQuaHR0cC5JZGxlQ2FjaGUgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5uZXQuaHR0cC5JZGxlQ2FjaGUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvbmV0L2h0dHAvSWRsZUNhY2hlOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTIgbmFtZSA9SWRsZVJlYXBlciApCi0gY2xhc3MgYW5kcm9pZC5uZXQuaHR0cC5JZGxlQ2FjaGUkSWRsZVJlYXBlciBleHRlbmRzIGphdmEubGFuZy5UaHJlYWQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC5uZXQuaHR0cC5JZGxlQ2FjaGUgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQubmV0Lmh0dHAuSWRsZUNhY2hlKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm5ldC5odHRwLklkbGVDYWNoZQotYW5kcm9pZC5uZXQuaHR0cC5JZGxlQ2FjaGUkMSkKLQotcHVibGljIHZvaWQgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL25ldC9odHRwL0lkbGVDYWNoZSQxO0xhbmRyb2lkL25ldC9odHRwL0lkbGVDYWNoZSRJZGxlUmVhcGVyO0xhbmRyb2lkL25ldC9odHRwL0lkbGVDYWNoZSRFbnRyeTsgKQotIGNsYXNzIGFuZHJvaWQubmV0Lmh0dHAuSWRsZUNhY2hlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0hFQ0tfSU5URVJWQUwKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVNUFRZX0NIRUNLX01BWAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSURMRV9DQUNIRV9NQVgKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRJTUVPVVQKLQotcHJpdmF0ZSBpbnQgbUNhY2hlZAotCi1wcml2YXRlIGludCBtQ291bnQKLQotcHJpdmF0ZSBhbmRyb2lkLm5ldC5odHRwLklkbGVDYWNoZSRFbnRyeVtdIG1FbnRyaWVzCi0KLXByaXZhdGUgaW50IG1SZXVzZWQKLQotcHJpdmF0ZSBhbmRyb2lkLm5ldC5odHRwLklkbGVDYWNoZSRJZGxlUmVhcGVyIG1UaHJlYWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1zdGF0aWMgaW50IGFjY2VzcyQxMDAoCi1hbmRyb2lkLm5ldC5odHRwLklkbGVDYWNoZSkKLQotc3RhdGljIHZvaWQgYWNjZXNzJDIwMCgKLWFuZHJvaWQubmV0Lmh0dHAuSWRsZUNhY2hlKQotCi1zdGF0aWMgYW5kcm9pZC5uZXQuaHR0cC5JZGxlQ2FjaGUkSWRsZVJlYXBlciBhY2Nlc3MkMzAyKAotYW5kcm9pZC5uZXQuaHR0cC5JZGxlQ2FjaGUKLWFuZHJvaWQubmV0Lmh0dHAuSWRsZUNhY2hlJElkbGVSZWFwZXIpCi0KLXByaXZhdGUgdm9pZCBjbGVhcklkbGUoKQotCi0gYm9vbGVhbiBjYWNoZUNvbm5lY3Rpb24oCi1vcmcuYXBhY2hlLmh0dHAuSHR0cEhvc3QKLWFuZHJvaWQubmV0Lmh0dHAuQ29ubmVjdGlvbikKLQotIHZvaWQgY2xlYXIoKQotCi0gYW5kcm9pZC5uZXQuaHR0cC5Db25uZWN0aW9uIGdldENvbm5lY3Rpb24oCi1vcmcuYXBhY2hlLmh0dHAuSHR0cEhvc3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5uZXQuaHR0cC5Mb2dnaW5nRXZlbnRIYW5kbGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQubmV0Lmh0dHAuRXZlbnRIYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgY2VydGlmaWNhdGUoCi1hbmRyb2lkLm5ldC5odHRwLlNzbENlcnRpZmljYXRlKQotCi1wdWJsaWMgdm9pZCBkYXRhKAotYnl0ZVtdCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGVuZERhdGEoKQotCi1wdWJsaWMgdm9pZCBlcnJvcigKLWludAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgaGFuZGxlU3NsRXJyb3JSZXF1ZXN0KAotYW5kcm9pZC5uZXQuaHR0cC5Tc2xFcnJvcikKLQotcHVibGljIHZvaWQgaGVhZGVycygKLWFuZHJvaWQubmV0Lmh0dHAuSGVhZGVycykKLQotcHVibGljIHZvaWQgbG9jYXRpb25DaGFuZ2VkKAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotcHVibGljIHZvaWQgcmVxdWVzdFNlbnQoKQotCi1wdWJsaWMgdm9pZCBzdGF0dXMoCi1pbnQKLWludAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotIGNsYXNzIGFuZHJvaWQubmV0Lmh0dHAuUmVxdWVzdCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBQ0NFUFRfRU5DT0RJTkdfSEVBREVSCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ09OVEVOVF9MRU5HVEhfSEVBREVSCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSE9TVF9IRUFERVIKLQotcHJpdmF0ZSBzdGF0aWMgb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLlJlcXVlc3RDb250ZW50IHJlcXVlc3RDb250ZW50UHJvY2Vzc29yCi0KLXByaXZhdGUgaW50IG1Cb2R5TGVuZ3RoCi0KLXByaXZhdGUgamF2YS5pby5JbnB1dFN0cmVhbSBtQm9keVByb3ZpZGVyCi0KLXZvbGF0aWxlIGJvb2xlYW4gbUNhbmNlbGxlZAotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5PYmplY3QgbUNsaWVudFJlc291cmNlCi0KLXByaXZhdGUgYW5kcm9pZC5uZXQuaHR0cC5Db25uZWN0aW9uIG1Db25uZWN0aW9uCi0KLSBhbmRyb2lkLm5ldC5odHRwLkV2ZW50SGFuZGxlciBtRXZlbnRIYW5kbGVyCi0KLSBpbnQgbUZhaWxDb3VudAotCi0gYm9vbGVhbiBtSGlnaFByaW9yaXR5Ci0KLSBvcmcuYXBhY2hlLmh0dHAuSHR0cEhvc3QgbUhvc3QKLQotIG9yZy5hcGFjaGUuaHR0cC5tZXNzYWdlLkJhc2ljSHR0cFJlcXVlc3QgbUh0dHBSZXF1ZXN0Ci0KLSBqYXZhLmxhbmcuU3RyaW5nIG1QYXRoCi0KLSBvcmcuYXBhY2hlLmh0dHAuSHR0cEhvc3QgbVByb3h5SG9zdAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9TdHJpbmc7TG9yZy9hcGFjaGUvaHR0cC9IdHRwSG9zdDtMb3JnL2FwYWNoZS9odHRwL0h0dHBIb3N0O0xqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2lvL0lucHV0U3RyZWFtO0lMYW5kcm9pZC9uZXQvaHR0cC9FdmVudEhhbmRsZXI7TGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7PjtaKVYgKQotIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotb3JnLmFwYWNoZS5odHRwLkh0dHBIb3N0Ci1vcmcuYXBhY2hlLmh0dHAuSHR0cEhvc3QKLWphdmEubGFuZy5TdHJpbmcKLWphdmEuaW8uSW5wdXRTdHJlYW0KLWludAotYW5kcm9pZC5uZXQuaHR0cC5FdmVudEhhbmRsZXIKLWphdmEudXRpbC5NYXAKLWJvb2xlYW4pCi0KLXByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2FuUmVzcG9uc2VIYXZlQm9keSgKLW9yZy5hcGFjaGUuaHR0cC5IdHRwUmVxdWVzdAotaW50KQotCi1wcml2YXRlIHZvaWQgc2V0Qm9keVByb3ZpZGVyKAotamF2YS5pby5JbnB1dFN0cmVhbQotaW50KQotCi0gdm9pZCBhZGRIZWFkZXIoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzs+OylWICkKLSB2b2lkIGFkZEhlYWRlcnMoCi1qYXZhLnV0aWwuTWFwKQotCi0gdm9pZCBjYW5jZWwoKQotCi0gdm9pZCBjb21wbGV0ZSgpCi0KLSB2b2lkIGVycm9yKAotaW50Ci1pbnQpCi0KLSBhbmRyb2lkLm5ldC5odHRwLkV2ZW50SGFuZGxlciBnZXRFdmVudEhhbmRsZXIoKQotCi0gamF2YS5sYW5nLlN0cmluZyBnZXRIb3N0UG9ydCgpCi0KLSBqYXZhLmxhbmcuU3RyaW5nIGdldFVyaSgpCi0KLXB1YmxpYyB2b2lkIGhhbmRsZVNzbEVycm9yUmVzcG9uc2UoCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xvcmcvYXBhY2hlL2h0dHAvUGFyc2VFeGNlcHRpb247ICkKLSB2b2lkIHJlYWRSZXNwb25zZSgKLWFuZHJvaWQubmV0Lmh0dHAuQW5kcm9pZEh0dHBDbGllbnRDb25uZWN0aW9uKQotCi0gdm9pZCByZXNldCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9IdHRwRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi0gdm9pZCBzZW5kUmVxdWVzdCgKLWFuZHJvaWQubmV0Lmh0dHAuQW5kcm9pZEh0dHBDbGllbnRDb25uZWN0aW9uKQotCi0gdm9pZCBzZXRDb25uZWN0aW9uKAotYW5kcm9pZC5uZXQuaHR0cC5Db25uZWN0aW9uKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLSB2b2lkIHdhaXRVbnRpbENvbXBsZXRlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLWFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLm5ldC5odHRwLlJlcXVlc3RGZWVkZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQubmV0Lmh0dHAuUmVxdWVzdCBnZXRSZXF1ZXN0KCkKLQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQubmV0Lmh0dHAuUmVxdWVzdCBnZXRSZXF1ZXN0KAotb3JnLmFwYWNoZS5odHRwLkh0dHBIb3N0KQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBoYXZlUmVxdWVzdCgKLW9yZy5hcGFjaGUuaHR0cC5IdHRwSG9zdCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgcmVxdWV1ZVJlcXVlc3QoCi1hbmRyb2lkLm5ldC5odHRwLlJlcXVlc3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5uZXQuaHR0cC5SZXF1ZXN0SGFuZGxlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFVVEhPUklaQVRJT05fSEVBREVSCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfUkVESVJFQ1RfQ09VTlQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQUk9YWV9BVVRIT1JJWkFUSU9OX0hFQURFUgotCi1wcml2YXRlIGludCBtQm9keUxlbmd0aAotCi1wcml2YXRlIGphdmEuaW8uSW5wdXRTdHJlYW0gbUJvZHlQcm92aWRlcgotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXByaXZhdGUgamF2YS51dGlsLk1hcCBtSGVhZGVycwotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbU1ldGhvZAotCi1wcml2YXRlIGludCBtUmVkaXJlY3RDb3VudAotCi1wcml2YXRlIGFuZHJvaWQubmV0Lmh0dHAuUmVxdWVzdCBtUmVxdWVzdAotCi1wcml2YXRlIGFuZHJvaWQubmV0Lmh0dHAuUmVxdWVzdFF1ZXVlIG1SZXF1ZXN0UXVldWUKLQotcHJpdmF0ZSBhbmRyb2lkLm5ldC5XZWJBZGRyZXNzIG1VcmkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1VcmwKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMYW5kcm9pZC9uZXQvaHR0cC9SZXF1ZXN0UXVldWU7TGphdmEvbGFuZy9TdHJpbmc7TGFuZHJvaWQvbmV0L1dlYkFkZHJlc3M7TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7PjtMamF2YS9pby9JbnB1dFN0cmVhbTtJTGFuZHJvaWQvbmV0L2h0dHAvUmVxdWVzdDspViApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm5ldC5odHRwLlJlcXVlc3RRdWV1ZQotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5uZXQuV2ViQWRkcmVzcwotamF2YS5sYW5nLlN0cmluZwotamF2YS51dGlsLk1hcAotamF2YS5pby5JbnB1dFN0cmVhbQotaW50Ci1hbmRyb2lkLm5ldC5odHRwLlJlcXVlc3QpCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBIKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIEtEKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGF1dGhvcml6YXRpb25IZWFkZXIoCi1ib29sZWFuKQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgYnVmZmVyVG9IZXgoCi1ieXRlW10pCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBjb21wdXRlQmFzaWNBdXRoUmVzcG9uc2UoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgY29tcHV0ZUNub25jZSgpCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBjb21wdXRlRGlnZXN0KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGNvbXB1dGVEaWdlc3RBdXRoUmVzcG9uc2UoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHZvaWQgY3JlYXRlQW5kUXVldWVOZXdSZXF1ZXN0KCkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGRvdWJsZVF1b3RlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSB2b2lkIHNldHVwQXV0aFJlc3BvbnNlKCkKLQotcHVibGljIHZvaWQgY2FuY2VsKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TWV0aG9kKCkKLQotcHVibGljIHZvaWQgaGFuZGxlU3NsRXJyb3JSZXNwb25zZSgKLWJvb2xlYW4pCi0KLXB1YmxpYyBib29sZWFuIGlzUmVkaXJlY3RNYXgoKQotCi1wdWJsaWMgdm9pZCBzZXR1cEJhc2ljQXV0aFJlc3BvbnNlKAotYm9vbGVhbgotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0dXBEaWdlc3RBdXRoUmVzcG9uc2UoCi1ib29sZWFuCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1N0cmluZztJTGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7PjspWiApCi1wdWJsaWMgYm9vbGVhbiBzZXR1cFJlZGlyZWN0KAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1qYXZhLnV0aWwuTWFwKQotCi1wdWJsaWMgdm9pZCB3YWl0VW50aWxDb21wbGV0ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotIGNsYXNzIGFuZHJvaWQubmV0Lmh0dHAuUmVxdWVzdFF1ZXVlJDEgZXh0ZW5kcyBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC5uZXQuaHR0cC5SZXF1ZXN0UXVldWUgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5uZXQuaHR0cC5SZXF1ZXN0UXVldWUpCi0KLXB1YmxpYyB2b2lkIG9uUmVjZWl2ZSgKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLmNvbnRlbnQuSW50ZW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NCBuYW1lID1Db25uZWN0aW9uTWFuYWdlciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9uZXQvaHR0cC9SZXF1ZXN0UXVldWU7ICkKLWFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLm5ldC5odHRwLlJlcXVlc3RRdWV1ZSRDb25uZWN0aW9uTWFuYWdlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC5uZXQuaHR0cC5Db25uZWN0aW9uIGdldENvbm5lY3Rpb24oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotb3JnLmFwYWNoZS5odHRwLkh0dHBIb3N0KQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLmFwYWNoZS5odHRwLkh0dHBIb3N0IGdldFByb3h5SG9zdCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzTmV0d29ya0Nvbm5lY3RlZCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHJlY3ljbGVDb25uZWN0aW9uKAotb3JnLmFwYWNoZS5odHRwLkh0dHBIb3N0Ci1hbmRyb2lkLm5ldC5odHRwLkNvbm5lY3Rpb24pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvbmV0L2h0dHAvUmVxdWVzdFF1ZXVlOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9QWN0aXZlUG9vbCApCi0gY2xhc3MgYW5kcm9pZC5uZXQuaHR0cC5SZXF1ZXN0UXVldWUkQWN0aXZlUG9vbCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm5ldC5odHRwLlJlcXVlc3RRdWV1ZSRDb25uZWN0aW9uTWFuYWdlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGludCBtQ29ubmVjdGlvbkNvdW50Ci0KLSBhbmRyb2lkLm5ldC5odHRwLklkbGVDYWNoZSBtSWRsZUNhY2hlCi0KLSBhbmRyb2lkLm5ldC5odHRwLkNvbm5lY3Rpb25UaHJlYWRbXSBtVGhyZWFkcwotCi1wcml2YXRlIGludCBtVG90YWxDb25uZWN0aW9uCi0KLXByaXZhdGUgaW50IG1Ub3RhbFJlcXVlc3QKLQotZmluYWwgYW5kcm9pZC5uZXQuaHR0cC5SZXF1ZXN0UXVldWUgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5uZXQuaHR0cC5SZXF1ZXN0UXVldWUKLWludCkKLQotc3RhdGljIGludCBhY2Nlc3MkMzA4KAotYW5kcm9pZC5uZXQuaHR0cC5SZXF1ZXN0UXVldWUkQWN0aXZlUG9vbCkKLQotIHZvaWQgZGlzYWJsZVBlcnNpc3RlbmNlKCkKLQotcHVibGljIGFuZHJvaWQubmV0Lmh0dHAuQ29ubmVjdGlvbiBnZXRDb25uZWN0aW9uKAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLW9yZy5hcGFjaGUuaHR0cC5IdHRwSG9zdCkKLQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5IdHRwSG9zdCBnZXRQcm94eUhvc3QoKQotCi0gYW5kcm9pZC5uZXQuaHR0cC5Db25uZWN0aW9uVGhyZWFkIGdldFRocmVhZCgKLW9yZy5hcGFjaGUuaHR0cC5IdHRwSG9zdCkKLQotcHVibGljIGJvb2xlYW4gaXNOZXR3b3JrQ29ubmVjdGVkKCkKLQotIHZvaWQgbG9nU3RhdGUoKQotCi1wdWJsaWMgYm9vbGVhbiByZWN5Y2xlQ29ubmVjdGlvbigKLW9yZy5hcGFjaGUuaHR0cC5IdHRwSG9zdAotYW5kcm9pZC5uZXQuaHR0cC5Db25uZWN0aW9uKQotCi0gdm9pZCBzaHV0ZG93bigpCi0KLSB2b2lkIHN0YXJ0Q29ubmVjdGlvblRocmVhZCgpCi0KLXB1YmxpYyB2b2lkIHN0YXJ0VGltaW5nKCkKLQotIHZvaWQgc3RhcnR1cCgpCi0KLXB1YmxpYyB2b2lkIHN0b3BUaW1pbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL25ldC9odHRwL1JlcXVlc3RRdWV1ZSROZXR3b3JrU3RhdGVUcmFja2VyOyApCi0gY2xhc3MgYW5kcm9pZC5uZXQuaHR0cC5SZXF1ZXN0UXVldWUkTmV0d29ya1N0YXRlVHJhY2tlciQxIGV4dGVuZHMgYW5kcm9pZC5vcy5IYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQubmV0Lmh0dHAuUmVxdWVzdFF1ZXVlJE5ldHdvcmtTdGF0ZVRyYWNrZXIgdGhpcyQxCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5uZXQuaHR0cC5SZXF1ZXN0UXVldWUkTmV0d29ya1N0YXRlVHJhY2tlcikKLQotcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZSgKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9TmV0d29ya1N0YXRlVHJhY2tlciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9uZXQvaHR0cC9SZXF1ZXN0UXVldWU7ICkKLSBjbGFzcyBhbmRyb2lkLm5ldC5odHRwLlJlcXVlc3RRdWV1ZSROZXR3b3JrU3RhdGVUcmFja2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgaW50IEVWRU5UX0RBVEFfU1RBVEVfQ0hBTkdFRAotCi0gYW5kcm9pZC5uZXQuTmV0d29ya0Nvbm5lY3Rpdml0eUxpc3RlbmVyIG1Db25uZWN0aXZpdHlMaXN0ZW5lcgotCi0gYW5kcm9pZC5jb250ZW50LkNvbnRleHQgbUNvbnRleHQKLQotIGludCBtQ3VycmVudE5ldHdvcmtUeXBlCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5IYW5kbGVyIG1IYW5kbGVyCi0KLSBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbyRTdGF0ZSBtTGFzdE5ldHdvcmtTdGF0ZQotCi1maW5hbCBhbmRyb2lkLm5ldC5odHRwLlJlcXVlc3RRdWV1ZSB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm5ldC5odHRwLlJlcXVlc3RRdWV1ZQotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLSB2b2lkIGJyb2FkY2FzdFN0YXRlKAotYm9vbGVhbikKLQotcHJvdGVjdGVkIHZvaWQgZGlzYWJsZSgpCi0KLXByb3RlY3RlZCB2b2lkIGVuYWJsZSgpCi0KLSBpbnQgZ2V0Q3VycmVudE5ldHdvcmtUeXBlKCkKLQotIHZvaWQgbmV0d29ya1N0YXRlQ2hhbmdlZCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9uZXQvaHR0cC9SZXF1ZXN0UXVldWUkQ29ubmVjdGlvbk1hbmFnZXI7TGFuZHJvaWQvbmV0L2h0dHAvUmVxdWVzdFF1ZXVlJEFjdGl2ZVBvb2w7TGFuZHJvaWQvbmV0L2h0dHAvUmVxdWVzdFF1ZXVlJE5ldHdvcmtTdGF0ZVRyYWNrZXI7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLm5ldC5odHRwLlJlcXVlc3RRdWV1ZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm5ldC5odHRwLlJlcXVlc3RGZWVkZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RJT05fQ09VTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEhUVFBfTkVUV09SS19TVEFURV9DSEFOR0VEX0lOVEVOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSFRUUF9ORVRXT1JLX1NUQVRFX1VQCi0KLXByaXZhdGUgYW5kcm9pZC5uZXQuaHR0cC5SZXF1ZXN0UXVldWUkQWN0aXZlUG9vbCBtQWN0aXZlUG9vbAotCi1wcml2YXRlIGJvb2xlYW4gbUNsaWVudFdhaXRpbmcKLQotcHJpdmF0ZSBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBtQ29udGV4dAotCi0gYm9vbGVhbiBtTmV0d29ya0Nvbm5lY3RlZAotCi1wcml2YXRlIGFuZHJvaWQubmV0Lmh0dHAuUmVxdWVzdFF1ZXVlJE5ldHdvcmtTdGF0ZVRyYWNrZXIgbU5ldHdvcmtTdGF0ZVRyYWNrZXIKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0xpbmtlZEhhc2hNYXA8TG9yZy9hcGFjaGUvaHR0cC9IdHRwSG9zdDtMamF2YS91dGlsL0xpbmtlZExpc3Q8TGFuZHJvaWQvbmV0L2h0dHAvUmVxdWVzdDs+Oz47ICkKLXByaXZhdGUgamF2YS51dGlsLkxpbmtlZEhhc2hNYXAgbVBlbmRpbmcKLQotcHJpdmF0ZSBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXIgbVByb3h5Q2hhbmdlUmVjZWl2ZXIKLQotcHJpdmF0ZSBvcmcuYXBhY2hlLmh0dHAuSHR0cEhvc3QgbVByb3h5SG9zdAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotaW50KQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMDAwKAotYW5kcm9pZC5uZXQuaHR0cC5SZXF1ZXN0UXVldWUpCi0KLXN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBhY2Nlc3MkMTAwKAotYW5kcm9pZC5uZXQuaHR0cC5SZXF1ZXN0UXVldWUpCi0KLXN0YXRpYyBvcmcuYXBhY2hlLmh0dHAuSHR0cEhvc3QgYWNjZXNzJDIwMCgKLWFuZHJvaWQubmV0Lmh0dHAuUmVxdWVzdFF1ZXVlKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0xpbmtlZEhhc2hNYXA8TG9yZy9hcGFjaGUvaHR0cC9IdHRwSG9zdDtMamF2YS91dGlsL0xpbmtlZExpc3Q8TGFuZHJvaWQvbmV0L2h0dHAvUmVxdWVzdDs+Oz47KUxhbmRyb2lkL25ldC9odHRwL1JlcXVlc3Q7ICkKLXByaXZhdGUgYW5kcm9pZC5uZXQuaHR0cC5SZXF1ZXN0IHJlbW92ZUZpcnN0KAotamF2YS51dGlsLkxpbmtlZEhhc2hNYXApCi0KLXByaXZhdGUgdm9pZCBzZXRQcm94eUNvbmZpZygpCi0KLXB1YmxpYyB2b2lkIGRpc2FibGVQbGF0Zm9ybU5vdGlmaWNhdGlvbnMoKQotCi0gdm9pZCBkdW1wKCkKLQotcHVibGljIHZvaWQgZW5hYmxlUGxhdGZvcm1Ob3RpZmljYXRpb25zKCkKLQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5IdHRwSG9zdCBnZXRQcm94eUhvc3QoKQotCi1wdWJsaWMgYW5kcm9pZC5uZXQuaHR0cC5SZXF1ZXN0IGdldFJlcXVlc3QoKQotCi1wdWJsaWMgYW5kcm9pZC5uZXQuaHR0cC5SZXF1ZXN0IGdldFJlcXVlc3QoCi1vcmcuYXBhY2hlLmh0dHAuSHR0cEhvc3QpCi0KLXB1YmxpYyBib29sZWFuIGhhdmVSZXF1ZXN0KAotb3JnLmFwYWNoZS5odHRwLkh0dHBIb3N0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1N0cmluZztMYW5kcm9pZC9uZXQvV2ViQWRkcmVzcztMamF2YS9sYW5nL1N0cmluZztMamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzs+O0xhbmRyb2lkL25ldC9odHRwL0V2ZW50SGFuZGxlcjtMamF2YS9pby9JbnB1dFN0cmVhbTtJWilMYW5kcm9pZC9uZXQvaHR0cC9SZXF1ZXN0SGFuZGxlOyApCi1wdWJsaWMgYW5kcm9pZC5uZXQuaHR0cC5SZXF1ZXN0SGFuZGxlIHF1ZXVlUmVxdWVzdCgKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQubmV0LldlYkFkZHJlc3MKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudXRpbC5NYXAKLWFuZHJvaWQubmV0Lmh0dHAuRXZlbnRIYW5kbGVyCi1qYXZhLmlvLklucHV0U3RyZWFtCi1pbnQKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOz47TGFuZHJvaWQvbmV0L2h0dHAvRXZlbnRIYW5kbGVyO0xqYXZhL2lvL0lucHV0U3RyZWFtO0laKUxhbmRyb2lkL25ldC9odHRwL1JlcXVlc3RIYW5kbGU7ICkKLXB1YmxpYyBhbmRyb2lkLm5ldC5odHRwLlJlcXVlc3RIYW5kbGUgcXVldWVSZXF1ZXN0KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS51dGlsLk1hcAotYW5kcm9pZC5uZXQuaHR0cC5FdmVudEhhbmRsZXIKLWphdmEuaW8uSW5wdXRTdHJlYW0KLWludAotYm9vbGVhbikKLQotcHJvdGVjdGVkIHZvaWQgcXVldWVSZXF1ZXN0KAotYW5kcm9pZC5uZXQuaHR0cC5SZXF1ZXN0Ci1ib29sZWFuKQotCi0gYm9vbGVhbiByZXF1ZXN0c1BlbmRpbmcoKQotCi1wdWJsaWMgdm9pZCByZXF1ZXVlUmVxdWVzdCgKLWFuZHJvaWQubmV0Lmh0dHAuUmVxdWVzdCkKLQotcHVibGljIHZvaWQgc2V0TmV0d29ya1N0YXRlKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2h1dGRvd24oKQotCi1wdWJsaWMgdm9pZCBzdGFydFRpbWluZygpCi0KLXB1YmxpYyB2b2lkIHN0b3BUaW1pbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotIGNsYXNzIGFuZHJvaWQubmV0Lmh0dHAuU1NMQ29ubmVjdGlvbkNsb3NlZEJ5VXNlckV4Y2VwdGlvbiBleHRlbmRzIGphdmF4Lm5ldC5zc2wuU1NMRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9uZXQvaHR0cC9Tc2xDZXJ0aWZpY2F0ZTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xIG5hbWUgPUROYW1lICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLm5ldC5odHRwLlNzbENlcnRpZmljYXRlJEROYW1lIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbUNOYW1lCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtRE5hbWUKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1PTmFtZQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbVVOYW1lCi0KLWZpbmFsIGFuZHJvaWQubmV0Lmh0dHAuU3NsQ2VydGlmaWNhdGUgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5uZXQuaHR0cC5Tc2xDZXJ0aWZpY2F0ZQotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Q05hbWUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRETmFtZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE9OYW1lKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VU5hbWUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvbmV0L2h0dHAvU3NsQ2VydGlmaWNhdGUkRE5hbWU7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLm5ldC5odHRwLlNzbENlcnRpZmljYXRlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIElTU1VFRF9CWQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIElTU1VFRF9UTwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFZBTElEX05PVF9BRlRFUgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFZBTElEX05PVF9CRUZPUkUKLQotcHJpdmF0ZSBhbmRyb2lkLm5ldC5odHRwLlNzbENlcnRpZmljYXRlJEROYW1lIG1Jc3N1ZWRCeQotCi1wcml2YXRlIGFuZHJvaWQubmV0Lmh0dHAuU3NsQ2VydGlmaWNhdGUkRE5hbWUgbUlzc3VlZFRvCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtVmFsaWROb3RBZnRlcgotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbVZhbGlkTm90QmVmb3JlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZSkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLm5ldC5odHRwLlNzbENlcnRpZmljYXRlIHJlc3RvcmVTdGF0ZSgKLWFuZHJvaWQub3MuQnVuZGxlKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQub3MuQnVuZGxlIHNhdmVTdGF0ZSgKLWFuZHJvaWQubmV0Lmh0dHAuU3NsQ2VydGlmaWNhdGUpCi0KLXB1YmxpYyBhbmRyb2lkLm5ldC5odHRwLlNzbENlcnRpZmljYXRlJEROYW1lIGdldElzc3VlZEJ5KCkKLQotcHVibGljIGFuZHJvaWQubmV0Lmh0dHAuU3NsQ2VydGlmaWNhdGUkRE5hbWUgZ2V0SXNzdWVkVG8oKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRWYWxpZE5vdEFmdGVyKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VmFsaWROb3RCZWZvcmUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5uZXQuaHR0cC5Tc2xFcnJvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1NMX0VYUElSRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1NMX0lETUlTTUFUQ0gKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1NMX01BWF9FUlJPUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTU0xfTk9UWUVUVkFMSUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1NMX1VOVFJVU1RFRAotCi0gYW5kcm9pZC5uZXQuaHR0cC5Tc2xDZXJ0aWZpY2F0ZSBtQ2VydGlmaWNhdGUKLQotIGludCBtRXJyb3JzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50Ci1hbmRyb2lkLm5ldC5odHRwLlNzbENlcnRpZmljYXRlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGUpCi0KLXB1YmxpYyBib29sZWFuIGFkZEVycm9yKAotaW50KQotCi1wdWJsaWMgYW5kcm9pZC5uZXQuaHR0cC5Tc2xDZXJ0aWZpY2F0ZSBnZXRDZXJ0aWZpY2F0ZSgpCi0KLXB1YmxpYyBpbnQgZ2V0UHJpbWFyeUVycm9yKCkKLQotcHVibGljIGJvb2xlYW4gaGFzRXJyb3IoCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLSBjbGFzcyBhbmRyb2lkLm5ldC5odHRwLlRpbWVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGxvbmcgbUxhc3QKLQotcHJpdmF0ZSBsb25nIG1TdGFydAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIG1hcmsoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvbmV0L3dpZmkvSVdpZmlNYW5hZ2VyJFN0dWI7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5uZXQud2lmaS5JV2lmaU1hbmFnZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5JSW50ZXJmYWNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGFjcXVpcmVXaWZpTG9jaygKLWFuZHJvaWQub3MuSUJpbmRlcgotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgYWRkT3JVcGRhdGVOZXR3b3JrKAotYW5kcm9pZC5uZXQud2lmaS5XaWZpQ29uZmlndXJhdGlvbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGRpc2FibGVOZXR3b3JrKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZGlzY29ubmVjdCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBlbmFibGVOZXR3b3JrKAotaW50Ci1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL25ldC93aWZpL1dpZmlDb25maWd1cmF0aW9uOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnV0aWwuTGlzdCBnZXRDb25maWd1cmVkTmV0d29ya3MoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQubmV0LndpZmkuV2lmaUluZm8gZ2V0Q29ubmVjdGlvbkluZm8oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQubmV0LkRoY3BJbmZvIGdldERoY3BJbmZvKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9uZXQvd2lmaS9TY2FuUmVzdWx0Oz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnV0aWwuTGlzdCBnZXRTY2FuUmVzdWx0cygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldFdpZmlTdGF0ZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBwaW5nU3VwcGxpY2FudCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiByZWFzc29jaWF0ZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiByZWNvbm5lY3QoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gcmVsZWFzZVdpZmlMb2NrKAotYW5kcm9pZC5vcy5JQmluZGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gcmVtb3ZlTmV0d29yaygKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHNhdmVDb25maWd1cmF0aW9uKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHNldFdpZmlFbmFibGVkKAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHN0YXJ0U2NhbigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1Qcm94eSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9uZXQvd2lmaS9JV2lmaU1hbmFnZXIkU3R1YjsgKQotIGNsYXNzIGFuZHJvaWQubmV0LndpZmkuSVdpZmlNYW5hZ2VyJFN0dWIkUHJveHkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5uZXQud2lmaS5JV2lmaU1hbmFnZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLm9zLklCaW5kZXIgbVJlbW90ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuSUJpbmRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIGFjcXVpcmVXaWZpTG9jaygKLWFuZHJvaWQub3MuSUJpbmRlcgotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgYWRkT3JVcGRhdGVOZXR3b3JrKAotYW5kcm9pZC5uZXQud2lmaS5XaWZpQ29uZmlndXJhdGlvbikKLQotcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBkaXNhYmxlTmV0d29yaygKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIGRpc2Nvbm5lY3QoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gZW5hYmxlTmV0d29yaygKLWludAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9uZXQvd2lmaS9XaWZpQ29uZmlndXJhdGlvbjs+OyApCi1wdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0Q29uZmlndXJlZE5ldHdvcmtzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlJbmZvIGdldENvbm5lY3Rpb25JbmZvKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhbmRyb2lkLm5ldC5EaGNwSW5mbyBnZXREaGNwSW5mbygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEludGVyZmFjZURlc2NyaXB0b3IoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL25ldC93aWZpL1NjYW5SZXN1bHQ7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEudXRpbC5MaXN0IGdldFNjYW5SZXN1bHRzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgZ2V0V2lmaVN0YXRlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIHBpbmdTdXBwbGljYW50KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIHJlYXNzb2NpYXRlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIHJlY29ubmVjdCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiByZWxlYXNlV2lmaUxvY2soCi1hbmRyb2lkLm9zLklCaW5kZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiByZW1vdmVOZXR3b3JrKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gc2F2ZUNvbmZpZ3VyYXRpb24oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gc2V0V2lmaUVuYWJsZWQoCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gc3RhcnRTY2FuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwMzMgbmFtZSA9U3R1YiApCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL25ldC93aWZpL0lXaWZpTWFuYWdlciRTdHViJFByb3h5OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9uZXQvd2lmaS9JV2lmaU1hbmFnZXI7ICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBhbmRyb2lkLm5ldC53aWZpLklXaWZpTWFuYWdlciRTdHViIGV4dGVuZHMgYW5kcm9pZC5vcy5CaW5kZXIgaW1wbGVtZW50cyBhbmRyb2lkLm5ldC53aWZpLklXaWZpTWFuYWdlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFU0NSSVBUT1IKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9hY3F1aXJlV2lmaUxvY2sKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9hZGRPclVwZGF0ZU5ldHdvcmsKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9kaXNhYmxlTmV0d29yawotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2Rpc2Nvbm5lY3QKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9lbmFibGVOZXR3b3JrCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZ2V0Q29uZmlndXJlZE5ldHdvcmtzCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZ2V0Q29ubmVjdGlvbkluZm8KLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9nZXREaGNwSW5mbwotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2dldFNjYW5SZXN1bHRzCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZ2V0V2lmaVN0YXRlCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fcGluZ1N1cHBsaWNhbnQKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9yZWFzc29jaWF0ZQotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3JlY29ubmVjdAotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3JlbGVhc2VXaWZpTG9jawotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3JlbW92ZU5ldHdvcmsKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9zYXZlQ29uZmlndXJhdGlvbgotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3NldFdpZmlFbmFibGVkCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fc3RhcnRTY2FuCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLklXaWZpTWFuYWdlciBhc0ludGVyZmFjZSgKLWFuZHJvaWQub3MuSUJpbmRlcikKLQotcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBvblRyYW5zYWN0KAotaW50Ci1hbmRyb2lkLm9zLlBhcmNlbAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9uZXQvd2lmaS9TY2FuUmVzdWx0OyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExhbmRyb2lkL25ldC93aWZpL1NjYW5SZXN1bHQ7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotZmluYWwgY2xhc3MgYW5kcm9pZC5uZXQud2lmaS5TY2FuUmVzdWx0JDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgYW5kcm9pZC5uZXQud2lmaS5TY2FuUmVzdWx0IGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgYW5kcm9pZC5uZXQud2lmaS5TY2FuUmVzdWx0W10gbmV3QXJyYXkoCi1pbnQpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0W10gbmV3QXJyYXkoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5uZXQud2lmaS5TY2FuUmVzdWx0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC9uZXQvd2lmaS9TY2FuUmVzdWx0Oz47ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IgQ1JFQVRPUgotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBCU1NJRAotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBTU0lECi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGNhcGFiaWxpdGllcwotCi1wdWJsaWMgaW50IGZyZXF1ZW5jeQotCi1wdWJsaWMgaW50IGxldmVsCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludCkKLQotcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1wdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExhbmRyb2lkL25ldC93aWZpL1N1cHBsaWNhbnRTdGF0ZTs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9uZXQvd2lmaS9TdXBwbGljYW50U3RhdGU7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLWZpbmFsIGNsYXNzIGFuZHJvaWQubmV0LndpZmkuU3VwcGxpY2FudFN0YXRlJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgYW5kcm9pZC5uZXQud2lmaS5TdXBwbGljYW50U3RhdGUgY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyBhbmRyb2lkLm5ldC53aWZpLlN1cHBsaWNhbnRTdGF0ZVtdIG5ld0FycmF5KAotaW50KQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdFtdIG5ld0FycmF5KAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL0VudW08TGFuZHJvaWQvbmV0L3dpZmkvU3VwcGxpY2FudFN0YXRlOz47TGFuZHJvaWQvb3MvUGFyY2VsYWJsZTsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQubmV0LndpZmkuU3VwcGxpY2FudFN0YXRlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQud2lmaS5TdXBwbGljYW50U3RhdGVbXSAkVkFMVUVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQud2lmaS5TdXBwbGljYW50U3RhdGUgQVNTT0NJQVRFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LndpZmkuU3VwcGxpY2FudFN0YXRlIEFTU09DSUFUSU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQud2lmaS5TdXBwbGljYW50U3RhdGUgQ09NUExFVEVECi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExhbmRyb2lkL25ldC93aWZpL1N1cHBsaWNhbnRTdGF0ZTs+OyApCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yIENSRUFUT1IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC53aWZpLlN1cHBsaWNhbnRTdGF0ZSBESVNDT05ORUNURUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC53aWZpLlN1cHBsaWNhbnRTdGF0ZSBET1JNQU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQud2lmaS5TdXBwbGljYW50U3RhdGUgRk9VUl9XQVlfSEFORFNIQUtFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQud2lmaS5TdXBwbGljYW50U3RhdGUgR1JPVVBfSEFORFNIQUtFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQud2lmaS5TdXBwbGljYW50U3RhdGUgSU5BQ1RJVkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC53aWZpLlN1cHBsaWNhbnRTdGF0ZSBJTlZBTElECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQud2lmaS5TdXBwbGljYW50U3RhdGUgU0NBTk5JTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC53aWZpLlN1cHBsaWNhbnRTdGF0ZSBVTklOSVRJQUxJWkVECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpViApCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZFN0YXRlKAotYW5kcm9pZC5uZXQud2lmaS5TdXBwbGljYW50U3RhdGUpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5TdXBwbGljYW50U3RhdGUgdmFsdWVPZigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5TdXBwbGljYW50U3RhdGVbXSB2YWx1ZXMoKQotCi1wdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKQotCi1wdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9uZXQvd2lmaS9XaWZpQ29uZmlndXJhdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC9uZXQvd2lmaS9XaWZpQ29uZmlndXJhdGlvbjs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1maW5hbCBjbGFzcyBhbmRyb2lkLm5ldC53aWZpLldpZmlDb25maWd1cmF0aW9uJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpQ29uZmlndXJhdGlvbiBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIGFuZHJvaWQubmV0LndpZmkuV2lmaUNvbmZpZ3VyYXRpb25bXSBuZXdBcnJheSgKLWludCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3RbXSBuZXdBcnJheSgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9uZXQvd2lmaS9XaWZpQ29uZmlndXJhdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPUF1dGhBbGdvcml0aG0gKQotcHVibGljIGNsYXNzIGFuZHJvaWQubmV0LndpZmkuV2lmaUNvbmZpZ3VyYXRpb24kQXV0aEFsZ29yaXRobSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVBUAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUEVOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIQVJFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmdbXSBzdHJpbmdzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyB2YXJOYW1lCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9uZXQvd2lmaS9XaWZpQ29uZmlndXJhdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPUdyb3VwQ2lwaGVyICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLm5ldC53aWZpLldpZmlDb25maWd1cmF0aW9uJEdyb3VwQ2lwaGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQ01QCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRLSVAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0VQMTA0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdFUDQwCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZ1tdIHN0cmluZ3MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIHZhck5hbWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1LZXlNZ210ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL25ldC93aWZpL1dpZmlDb25maWd1cmF0aW9uOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5uZXQud2lmaS5XaWZpQ29uZmlndXJhdGlvbiRLZXlNZ210IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRUVFODAyMVgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9ORQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBXUEFfRUFQCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdQQV9QU0sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gc3RyaW5ncwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgdmFyTmFtZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPVBhaXJ3aXNlQ2lwaGVyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL25ldC93aWZpL1dpZmlDb25maWd1cmF0aW9uOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5uZXQud2lmaS5XaWZpQ29uZmlndXJhdGlvbiRQYWlyd2lzZUNpcGhlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0NNUAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT05FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRLSVAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gc3RyaW5ncwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgdmFyTmFtZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPVByb3RvY29sICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL25ldC93aWZpL1dpZmlDb25maWd1cmF0aW9uOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5uZXQud2lmaS5XaWZpQ29uZmlndXJhdGlvbiRQcm90b2NvbCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlNOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdQQQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmdbXSBzdHJpbmdzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyB2YXJOYW1lCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9uZXQvd2lmaS9XaWZpQ29uZmlndXJhdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPVN0YXR1cyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5uZXQud2lmaS5XaWZpQ29uZmlndXJhdGlvbiRTdGF0dXMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENVUlJFTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTQUJMRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5BQkxFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmdbXSBzdHJpbmdzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL25ldC93aWZpL1dpZmlDb25maWd1cmF0aW9uJFN0YXR1cztMYW5kcm9pZC9uZXQvd2lmaS9XaWZpQ29uZmlndXJhdGlvbiRHcm91cENpcGhlcjtMYW5kcm9pZC9uZXQvd2lmaS9XaWZpQ29uZmlndXJhdGlvbiRQYWlyd2lzZUNpcGhlcjtMYW5kcm9pZC9uZXQvd2lmaS9XaWZpQ29uZmlndXJhdGlvbiRBdXRoQWxnb3JpdGhtO0xhbmRyb2lkL25ldC93aWZpL1dpZmlDb25maWd1cmF0aW9uJFByb3RvY29sO0xhbmRyb2lkL25ldC93aWZpL1dpZmlDb25maWd1cmF0aW9uJEtleU1nbXQ7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLm5ldC53aWZpLldpZmlDb25maWd1cmF0aW9uIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC9uZXQvd2lmaS9XaWZpQ29uZmlndXJhdGlvbjs+OyApCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yIENSRUFUT1IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGJzc2lkVmFyTmFtZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgaGlkZGVuU1NJRFZhck5hbWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIHByaW9yaXR5VmFyTmFtZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgcHNrVmFyTmFtZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgc3NpZFZhck5hbWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gd2VwS2V5VmFyTmFtZXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIHdlcFR4S2V5SWR4VmFyTmFtZQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBCU1NJRAotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBTU0lECi0KLXB1YmxpYyBqYXZhLnV0aWwuQml0U2V0IGFsbG93ZWRBdXRoQWxnb3JpdGhtcwotCi1wdWJsaWMgamF2YS51dGlsLkJpdFNldCBhbGxvd2VkR3JvdXBDaXBoZXJzCi0KLXB1YmxpYyBqYXZhLnV0aWwuQml0U2V0IGFsbG93ZWRLZXlNYW5hZ2VtZW50Ci0KLXB1YmxpYyBqYXZhLnV0aWwuQml0U2V0IGFsbG93ZWRQYWlyd2lzZUNpcGhlcnMKLQotcHVibGljIGphdmEudXRpbC5CaXRTZXQgYWxsb3dlZFByb3RvY29scwotCi1wdWJsaWMgYm9vbGVhbiBoaWRkZW5TU0lECi0KLXB1YmxpYyBpbnQgbmV0d29ya0lkCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHByZVNoYXJlZEtleQotCi1wdWJsaWMgaW50IHByaW9yaXR5Ci0KLXB1YmxpYyBpbnQgc3RhdHVzCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gd2VwS2V5cwotCi1wdWJsaWMgaW50IHdlcFR4S2V5SW5kZXgKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXN0YXRpYyBqYXZhLnV0aWwuQml0U2V0IGFjY2VzcyQwMDAoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLkJpdFNldCByZWFkQml0U2V0KAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVCaXRTZXQoCi1hbmRyb2lkLm9zLlBhcmNlbAotamF2YS51dGlsLkJpdFNldCkKLQotcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkKLQotcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvbmV0L3dpZmkvV2lmaUluZm87ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I8TGFuZHJvaWQvbmV0L3dpZmkvV2lmaUluZm87PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotZmluYWwgY2xhc3MgYW5kcm9pZC5uZXQud2lmaS5XaWZpSW5mbyQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGFuZHJvaWQubmV0LndpZmkuV2lmaUluZm8gY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlJbmZvW10gbmV3QXJyYXkoCi1pbnQpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0W10gbmV3QXJyYXkoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5uZXQud2lmaS5XaWZpSW5mbyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I8TGFuZHJvaWQvbmV0L3dpZmkvV2lmaUluZm87PjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvciBDUkVBVE9SCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMSU5LX1NQRUVEX1VOSVRTCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9FbnVtTWFwPExhbmRyb2lkL25ldC93aWZpL1N1cHBsaWNhbnRTdGF0ZTtMYW5kcm9pZC9uZXQvTmV0d29ya0luZm8kRGV0YWlsZWRTdGF0ZTs+OyApCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuRW51bU1hcCBzdGF0ZU1hcAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbUJTU0lECi0KLXByaXZhdGUgYm9vbGVhbiBtSGlkZGVuU1NJRAotCi1wcml2YXRlIGludCBtSXBBZGRyZXNzCi0KLXByaXZhdGUgaW50IG1MaW5rU3BlZWQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1NYWNBZGRyZXNzCi0KLXByaXZhdGUgaW50IG1OZXR3b3JrSWQKLQotcHJpdmF0ZSBpbnQgbVJzc2kKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1TU0lECi0KLXByaXZhdGUgYW5kcm9pZC5uZXQud2lmaS5TdXBwbGljYW50U3RhdGUgbVN1cHBsaWNhbnRTdGF0ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KCkKLQotc3RhdGljIGphdmEubGFuZy5TdHJpbmcgYWNjZXNzJDAwMigKLWFuZHJvaWQubmV0LndpZmkuV2lmaUluZm8KLWphdmEubGFuZy5TdHJpbmcpCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGFjY2VzcyQxMDIoCi1hbmRyb2lkLm5ldC53aWZpLldpZmlJbmZvCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1zdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5TdXBwbGljYW50U3RhdGUgYWNjZXNzJDIwMigKLWFuZHJvaWQubmV0LndpZmkuV2lmaUluZm8KLWFuZHJvaWQubmV0LndpZmkuU3VwcGxpY2FudFN0YXRlKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvJERldGFpbGVkU3RhdGUgZ2V0RGV0YWlsZWRTdGF0ZU9mKAotYW5kcm9pZC5uZXQud2lmaS5TdXBwbGljYW50U3RhdGUpCi0KLXN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLlN1cHBsaWNhbnRTdGF0ZSB2YWx1ZU9mKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QlNTSUQoKQotCi1wdWJsaWMgYm9vbGVhbiBnZXRIaWRkZW5TU0lEKCkKLQotcHVibGljIGludCBnZXRJcEFkZHJlc3MoKQotCi1wdWJsaWMgaW50IGdldExpbmtTcGVlZCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE1hY0FkZHJlc3MoKQotCi1wdWJsaWMgaW50IGdldE5ldHdvcmtJZCgpCi0KLXB1YmxpYyBpbnQgZ2V0UnNzaSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFNTSUQoKQotCi1wdWJsaWMgYW5kcm9pZC5uZXQud2lmaS5TdXBwbGljYW50U3RhdGUgZ2V0U3VwcGxpY2FudFN0YXRlKCkKLQotIHZvaWQgc2V0QlNTSUQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRIaWRkZW5TU0lEKAotYm9vbGVhbikKLQotIHZvaWQgc2V0SXBBZGRyZXNzKAotaW50KQotCi0gdm9pZCBzZXRMaW5rU3BlZWQoCi1pbnQpCi0KLSB2b2lkIHNldE1hY0FkZHJlc3MoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi0gdm9pZCBzZXROZXR3b3JrSWQoCi1pbnQpCi0KLSB2b2lkIHNldFJzc2koCi1pbnQpCi0KLSB2b2lkIHNldFNTSUQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi0gdm9pZCBzZXRTdXBwbGljYW50U3RhdGUoCi1hbmRyb2lkLm5ldC53aWZpLlN1cHBsaWNhbnRTdGF0ZSkKLQotIHZvaWQgc2V0U3VwcGxpY2FudFN0YXRlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1wdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9uZXQvd2lmaS9XaWZpTWFuYWdlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID00MTA0IG5hbWUgPW51bGwgKQotIGNsYXNzIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL25ldC93aWZpL1dpZmlNYW5hZ2VyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEgbmFtZSA9V2lmaUxvY2sgKQotcHVibGljIGNsYXNzIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIkV2lmaUxvY2sgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5JQmluZGVyIG1CaW5kZXIKLQotcHJpdmF0ZSBib29sZWFuIG1IZWxkCi0KLXByaXZhdGUgaW50IG1SZWZDb3VudAotCi1wcml2YXRlIGJvb2xlYW4gbVJlZkNvdW50ZWQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1UYWcKLQotZmluYWwgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlcgotamF2YS5sYW5nLlN0cmluZykKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlcgotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlciQxKQotCi1wdWJsaWMgdm9pZCBhY3F1aXJlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL1Rocm93YWJsZTsgKQotcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0hlbGQoKQotCi1wdWJsaWMgdm9pZCByZWxlYXNlKCkKLQotcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlQ291bnRlZCgKLWJvb2xlYW4pCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL25ldC93aWZpL1dpZmlNYW5hZ2VyJDE7TGFuZHJvaWQvbmV0L3dpZmkvV2lmaU1hbmFnZXIkV2lmaUxvY2s7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUNUSU9OX1BJQ0tfV0lGSV9ORVRXT1JLCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0FVVEhFTlRJQ0FUSU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBFWFRSQV9CU1NJRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRVhUUkFfTkVUV09SS19JTkZPCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBFWFRSQV9ORVdfUlNTSQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRVhUUkFfTkVXX1NUQVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBFWFRSQV9QUkVWSU9VU19XSUZJX1NUQVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBFWFRSQV9TVVBQTElDQU5UX0NPTk5FQ1RFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRVhUUkFfU1VQUExJQ0FOVF9FUlJPUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRVhUUkFfV0lGSV9TVEFURQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1JTU0kKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1JTl9SU1NJCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBORVRXT1JLX0lEU19DSEFOR0VEX0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTkVUV09SS19TVEFURV9DSEFOR0VEX0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUlNTSV9DSEFOR0VEX0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0NBTl9SRVNVTFRTX0FWQUlMQUJMRV9BQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNVUFBMSUNBTlRfQ09OTkVDVElPTl9DSEFOR0VfQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTVVBQTElDQU5UX1NUQVRFX0NIQU5HRURfQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBXSUZJX1NUQVRFX0NIQU5HRURfQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdJRklfU1RBVEVfRElTQUJMRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lGSV9TVEFURV9ESVNBQkxJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lGSV9TVEFURV9FTkFCTEVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdJRklfU1RBVEVfRU5BQkxJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lGSV9TVEFURV9VTktOT1dOCi0KLSBhbmRyb2lkLm9zLkhhbmRsZXIgbUhhbmRsZXIKLQotIGFuZHJvaWQubmV0LndpZmkuSVdpZmlNYW5hZ2VyIG1TZXJ2aWNlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQubmV0LndpZmkuSVdpZmlNYW5hZ2VyCi1hbmRyb2lkLm9zLkhhbmRsZXIpCi0KLXByaXZhdGUgaW50IGFkZE9yVXBkYXRlTmV0d29yaygKLWFuZHJvaWQubmV0LndpZmkuV2lmaUNvbmZpZ3VyYXRpb24pCi0KLXB1YmxpYyBzdGF0aWMgaW50IGNhbGN1bGF0ZVNpZ25hbExldmVsKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmVTaWduYWxMZXZlbCgKLWludAotaW50KQotCi1wdWJsaWMgaW50IGFkZE5ldHdvcmsoCi1hbmRyb2lkLm5ldC53aWZpLldpZmlDb25maWd1cmF0aW9uKQotCi1wdWJsaWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlciRXaWZpTG9jayBjcmVhdGVXaWZpTG9jaygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBib29sZWFuIGRpc2FibGVOZXR3b3JrKAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBkaXNjb25uZWN0KCkKLQotcHVibGljIGJvb2xlYW4gZW5hYmxlTmV0d29yaygKLWludAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9uZXQvd2lmaS9XaWZpQ29uZmlndXJhdGlvbjs+OyApCi1wdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0Q29uZmlndXJlZE5ldHdvcmtzKCkKLQotcHVibGljIGFuZHJvaWQubmV0LndpZmkuV2lmaUluZm8gZ2V0Q29ubmVjdGlvbkluZm8oKQotCi1wdWJsaWMgYW5kcm9pZC5uZXQuRGhjcEluZm8gZ2V0RGhjcEluZm8oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL25ldC93aWZpL1NjYW5SZXN1bHQ7PjsgKQotcHVibGljIGphdmEudXRpbC5MaXN0IGdldFNjYW5SZXN1bHRzKCkKLQotcHVibGljIGludCBnZXRXaWZpU3RhdGUoKQotCi1wdWJsaWMgYm9vbGVhbiBpc1dpZmlFbmFibGVkKCkKLQotcHVibGljIGJvb2xlYW4gcGluZ1N1cHBsaWNhbnQoKQotCi1wdWJsaWMgYm9vbGVhbiByZWFzc29jaWF0ZSgpCi0KLXB1YmxpYyBib29sZWFuIHJlY29ubmVjdCgpCi0KLXB1YmxpYyBib29sZWFuIHJlbW92ZU5ldHdvcmsoCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIHNhdmVDb25maWd1cmF0aW9uKCkKLQotcHVibGljIGJvb2xlYW4gc2V0V2lmaUVuYWJsZWQoCi1ib29sZWFuKQotCi1wdWJsaWMgYm9vbGVhbiBzdGFydFNjYW4oKQotCi1wdWJsaWMgaW50IHVwZGF0ZU5ldHdvcmsoCi1hbmRyb2lkLm5ldC53aWZpLldpZmlDb25maWd1cmF0aW9uKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL25ldC93aWZpL1dpZmlNb25pdG9yOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9TW9uaXRvclRocmVhZCApCi0gY2xhc3MgYW5kcm9pZC5uZXQud2lmaS5XaWZpTW9uaXRvciRNb25pdG9yVGhyZWFkIGV4dGVuZHMgamF2YS5sYW5nLlRocmVhZAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLm5ldC53aWZpLldpZmlNb25pdG9yIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQubmV0LndpZmkuV2lmaU1vbml0b3IpCi0KLXByaXZhdGUgdm9pZCBlbnN1cmVTdXBwbGljYW50Q29ubmVjdGlvbigpCi0KLXByaXZhdGUgdm9pZCBoYW5kbGVEcml2ZXJFdmVudCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgdm9pZCBoYW5kbGVQYXNzd29yZEtleU1heUJlSW5jb3JyZWN0KCkKLQotcHJpdmF0ZSB2b2lkIGhhbmRsZVN1cHBsaWNhbnRTdGF0ZUNoYW5nZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLSB2b2lkIGhhbmRsZUV2ZW50KAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvbmV0L3dpZmkvV2lmaU1vbml0b3IkTW9uaXRvclRocmVhZDsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQubmV0LndpZmkuV2lmaU1vbml0b3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT05ORUNURUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJU0NPTk5FQ1RFRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRFJJVkVSX1NUQVRFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMSU5LX1NQRUVECi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTQ0FOX1JFU1VMVFMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0NIQU5HRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRBRwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEVSTUlOQVRJTkcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVOS05PV04KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBjb25uZWN0ZWRFdmVudAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGRpc2Nvbm5lY3RlZEV2ZW50Ci0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgZHJpdmVyU3RhdGVFdmVudAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGV2ZW50UHJlZml4Ci0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBldmVudFByZWZpeExlbgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGxpbmtTcGVlZEV2ZW50Ci0KLXByaXZhdGUgc3RhdGljIGphdmEudXRpbC5yZWdleC5QYXR0ZXJuIG1Db25uZWN0ZWRFdmVudFBhdHRlcm4KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBwYXNzd29yZEtleU1heUJlSW5jb3JyZWN0RXZlbnQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBzY2FuUmVzdWx0c0V2ZW50Ci0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgc3RhdGVDaGFuZ2VFdmVudAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIHRlcm1pbmF0aW5nRXZlbnQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyB3cGFFdmVudFByZWZpeAotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQubmV0LndpZmkuV2lmaVN0YXRlVHJhY2tlciBtV2lmaVN0YXRlVHJhY2tlcgotCi1wcml2YXRlIGJvb2xlYW4gb25lU2hvdAotCi1wcml2YXRlIGJvb2xlYW4gc3VwcGxpY2FudENvbm5lY3RlZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5uZXQud2lmaS5XaWZpU3RhdGVUcmFja2VyKQotCi1zdGF0aWMgaW50IGFjY2VzcyQwMDAoKQotCi1zdGF0aWMgYm9vbGVhbiBhY2Nlc3MkMTAwKAotYW5kcm9pZC5uZXQud2lmaS5XaWZpTW9uaXRvcikKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDEwMigKLWFuZHJvaWQubmV0LndpZmkuV2lmaU1vbml0b3IKLWJvb2xlYW4pCi0KLXN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlTdGF0ZVRyYWNrZXIgYWNjZXNzJDIwMCgKLWFuZHJvaWQubmV0LndpZmkuV2lmaU1vbml0b3IpCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQzMDAoCi1hbmRyb2lkLm5ldC53aWZpLldpZmlNb25pdG9yKQotCi1zdGF0aWMgYm9vbGVhbiBhY2Nlc3MkMzAyKAotYW5kcm9pZC5uZXQud2lmaS5XaWZpTW9uaXRvcgotYm9vbGVhbikKLQotc3RhdGljIHZvaWQgYWNjZXNzJDQwMCgKLWludCkKLQotc3RhdGljIHZvaWQgYWNjZXNzJDUwMCgKLWFuZHJvaWQubmV0LndpZmkuV2lmaU1vbml0b3IKLWFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvJERldGFpbGVkU3RhdGUKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgdm9pZCBoYW5kbGVOZXR3b3JrU3RhdGVDaGFuZ2UoCi1hbmRyb2lkLm5ldC5OZXR3b3JrSW5mbyREZXRhaWxlZFN0YXRlCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHN0YXRpYyB2b2lkIG5hcCgKLWludCkKLQotcHVibGljIGFuZHJvaWQubmV0Lk5ldHdvcmtTdGF0ZVRyYWNrZXIgZ2V0TmV0d29ya1N0YXRlVHJhY2tlcigpCi0KLXB1YmxpYyB2b2lkIHN0YXJ0TW9uaXRvcmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5uZXQud2lmaS5XaWZpTmF0aXZlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBhZGROZXR3b3JrQ29tbWFuZCgpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gYWRkVG9CbGFja2xpc3RDb21tYW5kKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBjbGVhckJsYWNrbGlzdENvbW1hbmQoKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIGNsb3NlU3VwcGxpY2FudENvbm5lY3Rpb24oKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIGNvbm5lY3RUb1N1cHBsaWNhbnQoKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIGRpc2FibGVOZXR3b3JrQ29tbWFuZCgKLWludCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBkaXNjb25uZWN0Q29tbWFuZCgpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gZG9EaGNwUmVxdWVzdCgKLWFuZHJvaWQubmV0LkRoY3BJbmZvKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIGVuYWJsZU5ldHdvcmtDb21tYW5kKAotaW50Ci1ib29sZWFuKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBqYXZhLmxhbmcuU3RyaW5nIGdldERoY3BFcnJvcigpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGphdmEubGFuZy5TdHJpbmcgZ2V0RXJyb3JTdHJpbmcoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBnZXRMaW5rU3BlZWRDb21tYW5kKCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgamF2YS5sYW5nLlN0cmluZyBnZXRNYWNBZGRyZXNzQ29tbWFuZCgpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGphdmEubGFuZy5TdHJpbmcgZ2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZCgKLWludAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGdldFJzc2lDb21tYW5kKCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgamF2YS5sYW5nLlN0cmluZyBsaXN0TmV0d29ya3NDb21tYW5kKCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBsb2FkRHJpdmVyKCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBwaW5nQ29tbWFuZCgpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gcmVhc3NvY2lhdGVDb21tYW5kKCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiByZWNvbm5lY3RDb21tYW5kKCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiByZWxvYWRDb25maWdDb21tYW5kKCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiByZW1vdmVOZXR3b3JrQ29tbWFuZCgKLWludCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBzYXZlQ29uZmlnQ29tbWFuZCgpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gc2NhbkNvbW1hbmQoKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBqYXZhLmxhbmcuU3RyaW5nIHNjYW5SZXN1bHRzQ29tbWFuZCgpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gc2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZCgKLWludAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBzZXRQb3dlck1vZGVDb21tYW5kKAotaW50KQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIHNldFNjYW5Nb2RlQ29tbWFuZCgKLWJvb2xlYW4pCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gc2V0U2NhblJlc3VsdEhhbmRsaW5nQ29tbWFuZCgKLWludCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBzdGFydERyaXZlckNvbW1hbmQoKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIHN0YXJ0U3VwcGxpY2FudCgpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGphdmEubGFuZy5TdHJpbmcgc3RhdHVzQ29tbWFuZCgpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gc3RvcERyaXZlckNvbW1hbmQoKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIHN0b3BTdXBwbGljYW50KCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiB1bmxvYWREcml2ZXIoKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBqYXZhLmxhbmcuU3RyaW5nIHdhaXRGb3JFdmVudCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvbmV0L3dpZmkvV2lmaVN0YXRlVHJhY2tlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPURoY3BIYW5kbGVyICkKLSBjbGFzcyBhbmRyb2lkLm5ldC53aWZpLldpZmlTdGF0ZVRyYWNrZXIkRGhjcEhhbmRsZXIgZXh0ZW5kcyBhbmRyb2lkLm9zLkhhbmRsZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBib29sZWFuIG1DYW5jZWxDYWxsYmFjawotCi1wcml2YXRlIGFuZHJvaWQub3MuSGFuZGxlciBtVGFyZ2V0Ci0KLWZpbmFsIGFuZHJvaWQubmV0LndpZmkuV2lmaVN0YXRlVHJhY2tlciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm5ldC53aWZpLldpZmlTdGF0ZVRyYWNrZXIKLWFuZHJvaWQub3MuTG9vcGVyCi1hbmRyb2lkLm9zLkhhbmRsZXIpCi0KLXB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIHNldENhbmNlbENhbGxiYWNrKAotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9uZXQvd2lmaS9XaWZpU3RhdGVUcmFja2VyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPU5ldHdvcmtTdGF0ZUNoYW5nZVJlc3VsdCApCi0gY2xhc3MgYW5kcm9pZC5uZXQud2lmaS5XaWZpU3RhdGVUcmFja2VyJE5ldHdvcmtTdGF0ZUNoYW5nZVJlc3VsdCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGphdmEubGFuZy5TdHJpbmcgQlNTSUQKLQotIGludCBuZXR3b3JrSWQKLQotIGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvJERldGFpbGVkU3RhdGUgc3RhdGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm5ldC5OZXR3b3JrSW5mbyREZXRhaWxlZFN0YXRlCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPU5vdGlmaWNhdGlvbkVuYWJsZWRTZXR0aW5nT2JzZXJ2ZXIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvbmV0L3dpZmkvV2lmaVN0YXRlVHJhY2tlcjsgKQotIGNsYXNzIGFuZHJvaWQubmV0LndpZmkuV2lmaVN0YXRlVHJhY2tlciROb3RpZmljYXRpb25FbmFibGVkU2V0dGluZ09ic2VydmVyIGV4dGVuZHMgYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC5uZXQud2lmaS5XaWZpU3RhdGVUcmFja2VyIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQubmV0LndpZmkuV2lmaVN0YXRlVHJhY2tlcgotYW5kcm9pZC5vcy5IYW5kbGVyKQotCi1wcml2YXRlIGJvb2xlYW4gZ2V0VmFsdWUoKQotCi1wdWJsaWMgdm9pZCBvbkNoYW5nZSgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHJlZ2lzdGVyKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTIgbmFtZSA9U3RhdGljSXBTZXR0aW5nT2JzZXJ2ZXIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvbmV0L3dpZmkvV2lmaVN0YXRlVHJhY2tlcjsgKQotIGNsYXNzIGFuZHJvaWQubmV0LndpZmkuV2lmaVN0YXRlVHJhY2tlciRTdGF0aWNJcFNldHRpbmdPYnNlcnZlciBleHRlbmRzIGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQubmV0LndpZmkuV2lmaVN0YXRlVHJhY2tlciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm5ldC53aWZpLldpZmlTdGF0ZVRyYWNrZXIKLWFuZHJvaWQub3MuSGFuZGxlcikKLQotcHVibGljIHZvaWQgb25DaGFuZ2UoCi1ib29sZWFuKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9U3VwcGxpY2FudFN0YXRlQ2hhbmdlUmVzdWx0ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL25ldC93aWZpL1dpZmlTdGF0ZVRyYWNrZXI7ICkKLSBjbGFzcyBhbmRyb2lkLm5ldC53aWZpLldpZmlTdGF0ZVRyYWNrZXIkU3VwcGxpY2FudFN0YXRlQ2hhbmdlUmVzdWx0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gaW50IG5ldHdvcmtJZAotCi0gYW5kcm9pZC5uZXQud2lmaS5TdXBwbGljYW50U3RhdGUgc3RhdGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1pbnQKLWFuZHJvaWQubmV0LndpZmkuU3VwcGxpY2FudFN0YXRlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvbmV0L3dpZmkvV2lmaVN0YXRlVHJhY2tlciROb3RpZmljYXRpb25FbmFibGVkU2V0dGluZ09ic2VydmVyO0xhbmRyb2lkL25ldC93aWZpL1dpZmlTdGF0ZVRyYWNrZXIkU3RhdGljSXBTZXR0aW5nT2JzZXJ2ZXI7TGFuZHJvaWQvbmV0L3dpZmkvV2lmaVN0YXRlVHJhY2tlciREaGNwSGFuZGxlcjtMYW5kcm9pZC9uZXQvd2lmaS9XaWZpU3RhdGVUcmFja2VyJE5ldHdvcmtTdGF0ZUNoYW5nZVJlc3VsdDtMYW5kcm9pZC9uZXQvd2lmaS9XaWZpU3RhdGVUcmFja2VyJFN1cHBsaWNhbnRTdGF0ZUNoYW5nZVJlc3VsdDsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQubmV0LndpZmkuV2lmaVN0YXRlVHJhY2tlciBleHRlbmRzIGFuZHJvaWQubmV0Lk5ldHdvcmtTdGF0ZVRyYWNrZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJU0NPTk5FQ1RfREVMQVlfTVNFQ1MKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERSSVZFUl9QT1dFUl9NT0RFX0FDVElWRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRFJJVkVSX1BPV0VSX01PREVfQVVUTwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRMT0dfRFJJVkVSX1NUQVRFX0NIQU5HRUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UTE9HX0lOVEVSRkFDRV9DT05GSUdVUkFUSU9OX1NUQVRFX0NIQU5HRUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UTE9HX05FVFdPUktfU1RBVEVfQ0hBTkdFRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRMT0dfU1VQUExJQ0FOVF9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UTE9HX1NVUFBMSUNBTlRfU1RBVEVfQ0hBTkdFRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfREVGRVJSRURfRElTQ09OTkVDVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfREVGRVJSRURfUkVDT05ORUNUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9ESENQX1NUQVJUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9EUklWRVJfU1RBVEVfQ0hBTkdFRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfSU5URVJGQUNFX0NPTkZJR1VSQVRJT05fRkFJTEVECi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9JTlRFUkZBQ0VfQ09ORklHVVJBVElPTl9TVUNDRUVERUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX05FVFdPUktfU1RBVEVfQ0hBTkdFRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfUEFTU1dPUkRfS0VZX01BWV9CRV9JTkNPUlJFQ1QKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1BPTExfSU5URVJWQUwKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1NDQU5fUkVTVUxUU19BVkFJTEFCTEUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1NVUFBMSUNBTlRfQ09OTkVDVElPTgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfU1VQUExJQ0FOVF9ESVNDT05ORUNUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9TVVBQTElDQU5UX1NUQVRFX0NIQU5HRUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElDT05fTkVUV09SS1NfQVZBSUxBQkxFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gTE9DQUxfTE9HRAotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIExTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfUkVDT05ORUNUX0FUVEVNUFRTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfU1VQUExJQ0FOVF9MT09QX0lURVJBVElPTlMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5VTV9TQ0FOU19CRUZPUkVfQUNUVUFMTFlfU0NBTk5JTkcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBPTExfU1RBVFVTX0lOVEVSVkFMX01TRUNTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRUNPTk5FQ1RfREVMQVlfTVNFQ1MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1VQUExfU0NBTl9IQU5ETElOR19MSVNUX09OTFkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1VQUExfU0NBTl9IQU5ETElOR19OT1JNQUwKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZ1tdIHNEbnNQcm9wTmFtZXMKLQotcHJpdmF0ZSBmaW5hbCBsb25nIE5PVElGSUNBVElPTl9SRVBFQVRfREVMQVlfTVMKLQotcHJpdmF0ZSBhbmRyb2lkLm5ldC5EaGNwSW5mbyBtRGhjcEluZm8KLQotcHJpdmF0ZSBhbmRyb2lkLm5ldC53aWZpLldpZmlTdGF0ZVRyYWNrZXIkRGhjcEhhbmRsZXIgbURoY3BUYXJnZXQKLQotcHJpdmF0ZSBib29sZWFuIG1EaXNjb25uZWN0UGVuZGluZwotCi1wcml2YXRlIGJvb2xlYW4gbURyaXZlcklzU3RvcHBlZAotCi1wcml2YXRlIGJvb2xlYW4gbUV4cGxpY2l0bHlEaXNhYmxlZAotCi1wcml2YXRlIGJvb2xlYW4gbUhhdmVJUEFkZHJlc3MKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1JbnRlcmZhY2VOYW1lCi0KLXByaXZhdGUgYm9vbGVhbiBtSXNTY2FuTW9kZUFjdGl2ZQotCi1wcml2YXRlIGJvb2xlYW4gbUlzU2Nhbk1vZGVTZXREdWVUb0FIaWRkZW5OZXR3b3JrCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtTGFzdEJzc2lkCi0KLXByaXZhdGUgaW50IG1MYXN0TmV0d29ya0lkCi0KLXByaXZhdGUgaW50IG1MYXN0U2lnbmFsTGV2ZWwKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1MYXN0U3NpZAotCi1wcml2YXRlIGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbiBtTm90aWZpY2F0aW9uCi0KLXByaXZhdGUgYm9vbGVhbiBtTm90aWZpY2F0aW9uRW5hYmxlZAotCi1wcml2YXRlIGFuZHJvaWQubmV0LndpZmkuV2lmaVN0YXRlVHJhY2tlciROb3RpZmljYXRpb25FbmFibGVkU2V0dGluZ09ic2VydmVyIG1Ob3RpZmljYXRpb25FbmFibGVkU2V0dGluZ09ic2VydmVyCi0KLXByaXZhdGUgbG9uZyBtTm90aWZpY2F0aW9uUmVwZWF0VGltZQotCi1wcml2YXRlIGJvb2xlYW4gbU5vdGlmaWNhdGlvblNob3duCi0KLXByaXZhdGUgaW50IG1OdW1TY2Fuc1NpbmNlTmV0d29ya1N0YXRlQ2hhbmdlCi0KLXByaXZhdGUgaW50IG1OdW1TdXBwbGljYW50TG9vcEl0ZXJhdGlvbnMKLQotcHJpdmF0ZSBib29sZWFuIG1PYnRhaW5pbmdJUEFkZHJlc3MKLQotcHJpdmF0ZSBib29sZWFuIG1QYXNzd29yZEtleU1heUJlSW5jb3JyZWN0Ci0KLXByaXZhdGUgaW50IG1SZWNvbm5lY3RDb3VudAotCi1wcml2YXRlIGludFtdIG1TYXZlZENvbmZpZ3VyYXRpb24KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0xpc3Q8TGFuZHJvaWQvbmV0L3dpZmkvU2NhblJlc3VsdDs+OyApCi1wcml2YXRlIGphdmEudXRpbC5MaXN0IG1TY2FuUmVzdWx0cwotCi1wcml2YXRlIGFuZHJvaWQubmV0LndpZmkuV2lmaVN0YXRlVHJhY2tlciRTdGF0aWNJcFNldHRpbmdPYnNlcnZlciBtU3RhdGljSXBTZXR0aW5nT2JzZXJ2ZXIKLQotcHJpdmF0ZSBhbmRyb2lkLm5ldC53aWZpLlN1cHBsaWNhbnRTdGF0ZSBtU3VwcGxpY2FudExvb3BTdGF0ZQotCi1wcml2YXRlIGJvb2xlYW4gbVVzZVN0YXRpY0lwCi0KLXByaXZhdGUgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlciBtV00KLQotcHJpdmF0ZSBhbmRyb2lkLm5ldC53aWZpLldpZmlJbmZvIG1XaWZpSW5mbwotCi1wcml2YXRlIGFuZHJvaWQubmV0LndpZmkuV2lmaU1vbml0b3IgbVdpZmlNb25pdG9yCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC5vcy5IYW5kbGVyKQotCi1zdGF0aWMgamF2YS5sYW5nLlN0cmluZyBhY2Nlc3MkMDAwKAotYW5kcm9pZC5uZXQud2lmaS5XaWZpU3RhdGVUcmFja2VyKQotCi1zdGF0aWMgYW5kcm9pZC5uZXQuRGhjcEluZm8gYWNjZXNzJDEwMCgKLWFuZHJvaWQubmV0LndpZmkuV2lmaVN0YXRlVHJhY2tlcikKLQotc3RhdGljIHZvaWQgYWNjZXNzJDEwMDAoCi1hbmRyb2lkLm5ldC53aWZpLldpZmlTdGF0ZVRyYWNrZXIpCi0KLXN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBhY2Nlc3MkMTEwMCgKLWFuZHJvaWQubmV0LndpZmkuV2lmaVN0YXRlVHJhY2tlcikKLQotc3RhdGljIGFuZHJvaWQuY29udGVudC5Db250ZXh0IGFjY2VzcyQyMDAoCi1hbmRyb2lkLm5ldC53aWZpLldpZmlTdGF0ZVRyYWNrZXIpCi0KLXN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlJbmZvIGFjY2VzcyQzMDAoCi1hbmRyb2lkLm5ldC53aWZpLldpZmlTdGF0ZVRyYWNrZXIpCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQ0MDAoCi1hbmRyb2lkLm5ldC53aWZpLldpZmlTdGF0ZVRyYWNrZXIpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQ1MDAoCi1hbmRyb2lkLm5ldC53aWZpLldpZmlTdGF0ZVRyYWNrZXIpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQ2MDAoCi1hbmRyb2lkLm5ldC53aWZpLldpZmlTdGF0ZVRyYWNrZXIpCi0KLXN0YXRpYyBhbmRyb2lkLm9zLkhhbmRsZXIgYWNjZXNzJDcwMCgKLWFuZHJvaWQubmV0LndpZmkuV2lmaVN0YXRlVHJhY2tlcikKLQotc3RhdGljIGFuZHJvaWQuY29udGVudC5Db250ZXh0IGFjY2VzcyQ4MDAoCi1hbmRyb2lkLm5ldC53aWZpLldpZmlTdGF0ZVRyYWNrZXIpCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQ5MDAoCi1hbmRyb2lkLm5ldC53aWZpLldpZmlTdGF0ZVRyYWNrZXIpCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQ5MDIoCi1hbmRyb2lkLm5ldC53aWZpLldpZmlTdGF0ZVRyYWNrZXIKLWJvb2xlYW4pCi0KLXByaXZhdGUgdm9pZCBjYW5jZWxEaXNjb25uZWN0KCkKLQotcHJpdmF0ZSB2b2lkIGNoZWNrVXNlU3RhdGljSXAoKQotCi1wcml2YXRlIHZvaWQgY29uZmlndXJlSW50ZXJmYWNlKCkKLQotcHJpdmF0ZSB2b2lkIGhhbmRsZURpc2Nvbm5lY3RlZFN0YXRlKAotYW5kcm9pZC5uZXQuTmV0d29ya0luZm8kRGV0YWlsZWRTdGF0ZSkKLQotcHJpdmF0ZSBib29sZWFuIGlzU3VwcGxpY2FudExvb3BpbmcoCi1hbmRyb2lkLm5ldC53aWZpLlN1cHBsaWNhbnRTdGF0ZSkKLQotcHJpdmF0ZSB2b2lkIHJlcXVlc3RDb25uZWN0aW9uU3RhdHVzKAotYW5kcm9pZC5uZXQud2lmaS5XaWZpSW5mbykKLQotcHJpdmF0ZSB2b2lkIHJlcXVlc3RQb2xsZWRJbmZvKAotYW5kcm9pZC5uZXQud2lmaS5XaWZpSW5mbykKLQotcHJpdmF0ZSB2b2lkIHJlc2V0Tm90aWZpY2F0aW9uVGltZXIoKQotCi1wcml2YXRlIHZvaWQgcmVzZXRTdXBwbGljYW50TG9vcFN0YXRlKCkKLQotcHJpdmF0ZSB2b2lkIHNjaGVkdWxlRGlzY29ubmVjdCgpCi0KLXByaXZhdGUgdm9pZCBzZW5kTmV0d29ya1N0YXRlQ2hhbmdlQnJvYWRjYXN0KCkKLQotcHJpdmF0ZSB2b2lkIHNlbmRSc3NpQ2hhbmdlQnJvYWRjYXN0KAotaW50KQotCi1wcml2YXRlIHZvaWQgc2V0RXhwbGljaXRseURpc2FibGVkKAotYm9vbGVhbikKLQotcHJpdmF0ZSB2b2lkIHNldFBvbGxUaW1lcigpCi0KLXByaXZhdGUgdm9pZCBzZXRTdXBwbGljYW50U3RhdGUoCi1hbmRyb2lkLm5ldC53aWZpLlN1cHBsaWNhbnRTdGF0ZSkKLQotcHJpdmF0ZSB2b2lkIHNldFN1cHBsaWNhbnRTdGF0ZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1Vua25vd25Ib3N0RXhjZXB0aW9uOyApCi1wcml2YXRlIHN0YXRpYyBpbnQgc3RyaW5nVG9JcEFkZHIoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHZvaWQgdXBkYXRlTmV0d29ya0luZm8oKQotCi1wcml2YXRlIGJvb2xlYW4gd2lmaU1hbmFnZXJEaXNhYmxlTmV0d29yaygKLWludCkKLQotcHVibGljIGJvb2xlYW4gYWRkVG9CbGFja2xpc3QoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYm9vbGVhbiBjbGVhckJsYWNrbGlzdCgpCi0KLXB1YmxpYyBhbmRyb2lkLm5ldC5EaGNwSW5mbyBnZXREaGNwSW5mbygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0TmFtZVNlcnZlcnMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL25ldC93aWZpL1NjYW5SZXN1bHQ7PjsgKQotcHVibGljIGphdmEudXRpbC5MaXN0IGdldFNjYW5SZXN1bHRzTGlzdCgpCi0KLXB1YmxpYyBhbmRyb2lkLm5ldC53aWZpLlN1cHBsaWNhbnRTdGF0ZSBnZXRTdXBwbGljYW50U3RhdGUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRUY3BCdWZmZXJTaXplc1Byb3BOYW1lKCkKLQotcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZSgKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgaW50ZXJwcmV0U2NhblJlc3VsdHNBdmFpbGFibGUoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0F2YWlsYWJsZSgpCi0KLXB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGlvbkNvbXBsZXRlZCgpCi0KLSB2b2lkIG5vdGlmeURyaXZlclN0YXJ0ZWQoKQotCi0gdm9pZCBub3RpZnlEcml2ZXJTdG9wcGVkKCkKLQotIHZvaWQgbm90aWZ5UGFzc3dvcmRLZXlNYXlCZUluY29ycmVjdCgpCi0KLSB2b2lkIG5vdGlmeVNjYW5SZXN1bHRzQXZhaWxhYmxlKCkKLQotIHZvaWQgbm90aWZ5U3RhdGVDaGFuZ2UoCi1pbnQKLWFuZHJvaWQubmV0LndpZmkuU3VwcGxpY2FudFN0YXRlKQotCi0gdm9pZCBub3RpZnlTdGF0ZUNoYW5nZSgKLWFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvJERldGFpbGVkU3RhdGUKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotIHZvaWQgbm90aWZ5U3VwcGxpY2FudENvbm5lY3Rpb24oKQotCi0gdm9pZCBub3RpZnlTdXBwbGljYW50TG9zdCgpCi0KLXB1YmxpYyBib29sZWFuIHJlY29ubmVjdCgpCi0KLXB1YmxpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlJbmZvIHJlcXVlc3RDb25uZWN0aW9uSW5mbygpCi0KLXB1YmxpYyB2b2lkIHJlc2V0SW50ZXJmYWNlKCkKLQotcHVibGljIHZvaWQgc2V0Tm90aWZpY2F0aW9uVmlzaWJsZSgKLWJvb2xlYW4KLWludAotYm9vbGVhbgotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBzZXRSYWRpbygKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldFNjYW5Nb2RlKAotYm9vbGVhbgotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL25ldC93aWZpL1NjYW5SZXN1bHQ7PjspViApCi1wdWJsaWMgdm9pZCBzZXRTY2FuUmVzdWx0c0xpc3QoCi1qYXZhLnV0aWwuTGlzdCkKLQotcHVibGljIHZvaWQgc3RhcnRFdmVudExvb3AoKQotCi1wdWJsaWMgdm9pZCBzdGFydE1vbml0b3JpbmcoKQotCi1wdWJsaWMgaW50IHN0YXJ0VXNpbmdOZXR3b3JrRmVhdHVyZSgKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50KQotCi1wdWJsaWMgaW50IHN0b3BVc2luZ05ldHdvcmtGZWF0dXJlKAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQpCi0KLXB1YmxpYyBib29sZWFuIHRlYXJkb3duKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0wxMCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVHTF9BTFBIQV9GT1JNQVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUdMX0FMUEhBX01BU0tfU0laRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFR0xfQUxQSEFfU0laRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFR0xfQkFEX0FDQ0VTUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFR0xfQkFEX0FMTE9DCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVHTF9CQURfQVRUUklCVVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVHTF9CQURfQ09ORklHCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVHTF9CQURfQ09OVEVYVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFR0xfQkFEX0NVUlJFTlRfU1VSRkFDRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFR0xfQkFEX0RJU1BMQVkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUdMX0JBRF9NQVRDSAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFR0xfQkFEX05BVElWRV9QSVhNQVAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUdMX0JBRF9OQVRJVkVfV0lORE9XCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVHTF9CQURfUEFSQU1FVEVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVHTF9CQURfU1VSRkFDRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFR0xfQkxVRV9TSVpFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVHTF9CVUZGRVJfU0laRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFR0xfQ09MT1JTUEFDRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFR0xfQ09MT1JfQlVGRkVSX1RZUEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUdMX0NPTkZJR19DQVZFQVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUdMX0NPTkZJR19JRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFR0xfQ09SRV9OQVRJVkVfRU5HSU5FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLk9iamVjdCBFR0xfREVGQVVMVF9ESVNQTEFZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVHTF9ERVBUSF9TSVpFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVHTF9ET05UX0NBUkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUdMX0RSQVcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUdMX0VYVEVOU0lPTlMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUdMX0dSRUVOX1NJWkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUdMX0hFSUdIVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFR0xfSE9SSVpPTlRBTF9SRVNPTFVUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVHTF9MQVJHRVNUX1BCVUZGRVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUdMX0xFVkVMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVHTF9MVU1JTkFOQ0VfQlVGRkVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVHTF9MVU1JTkFOQ0VfU0laRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFR0xfTUFYX1BCVUZGRVJfSEVJR0hUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVHTF9NQVhfUEJVRkZFUl9QSVhFTFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUdMX01BWF9QQlVGRkVSX1dJRFRICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVHTF9OQVRJVkVfUkVOREVSQUJMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFR0xfTkFUSVZFX1ZJU1VBTF9JRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFR0xfTkFUSVZFX1ZJU1VBTF9UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVHTF9OT05FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVHTF9OT05fQ09ORk9STUFOVF9DT05GSUcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUdMX05PVF9JTklUSUFMSVpFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb250ZXh0IEVHTF9OT19DT05URVhUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTERpc3BsYXkgRUdMX05PX0RJU1BMQVkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMU3VyZmFjZSBFR0xfTk9fU1VSRkFDRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFR0xfUEJVRkZFUl9CSVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUdMX1BJWEVMX0FTUEVDVF9SQVRJTwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFR0xfUElYTUFQX0JJVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFR0xfUkVBRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFR0xfUkVEX1NJWkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUdMX1JFTkRFUkFCTEVfVFlQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFR0xfUkVOREVSX0JVRkZFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFR0xfUkdCX0JVRkZFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFR0xfU0FNUExFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFR0xfU0FNUExFX0JVRkZFUlMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUdMX1NJTkdMRV9CVUZGRVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUdMX1NMT1dfQ09ORklHCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVHTF9TVEVOQ0lMX1NJWkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUdMX1NVQ0NFU1MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUdMX1NVUkZBQ0VfVFlQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFR0xfVFJBTlNQQVJFTlRfQkxVRV9WQUxVRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFR0xfVFJBTlNQQVJFTlRfR1JFRU5fVkFMVUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUdMX1RSQU5TUEFSRU5UX1JFRF9WQUxVRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFR0xfVFJBTlNQQVJFTlRfUkdCCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVHTF9UUkFOU1BBUkVOVF9UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVHTF9WRU5ET1IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUdMX1ZFUlNJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUdMX1ZFUlRJQ0FMX1JFU09MVVRJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUdMX1dJRFRICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVHTF9XSU5ET1dfQklUCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBlZ2xDaG9vc2VDb25maWcoCi1qYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMRGlzcGxheQotaW50W10KLWphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb25maWdbXQotaW50Ci1pbnRbXSkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZWdsQ29weUJ1ZmZlcnMoCi1qYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMRGlzcGxheQotamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTFN1cmZhY2UKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMQ29udGV4dCBlZ2xDcmVhdGVDb250ZXh0KAotamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTERpc3BsYXkKLWphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb25maWcKLWphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb250ZXh0Ci1pbnRbXSkKLQotcHVibGljIGFic3RyYWN0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xTdXJmYWNlIGVnbENyZWF0ZVBidWZmZXJTdXJmYWNlKAotamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTERpc3BsYXkKLWphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb25maWcKLWludFtdKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTFN1cmZhY2UgZWdsQ3JlYXRlUGl4bWFwU3VyZmFjZSgKLWphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xEaXNwbGF5Ci1qYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMQ29uZmlnCi1qYXZhLmxhbmcuT2JqZWN0Ci1pbnRbXSkKLQotcHVibGljIGFic3RyYWN0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xTdXJmYWNlIGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UoCi1qYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMRGlzcGxheQotamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbmZpZwotamF2YS5sYW5nLk9iamVjdAotaW50W10pCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGVnbERlc3Ryb3lDb250ZXh0KAotamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTERpc3BsYXkKLWphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb250ZXh0KQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBlZ2xEZXN0cm95U3VyZmFjZSgKLWphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xEaXNwbGF5Ci1qYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMU3VyZmFjZSkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZWdsR2V0Q29uZmlnQXR0cmliKAotamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTERpc3BsYXkKLWphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb25maWcKLWludAotaW50W10pCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGVnbEdldENvbmZpZ3MoCi1qYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMRGlzcGxheQotamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbmZpZ1tdCi1pbnQKLWludFtdKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbnRleHQgZWdsR2V0Q3VycmVudENvbnRleHQoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTERpc3BsYXkgZWdsR2V0Q3VycmVudERpc3BsYXkoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTFN1cmZhY2UgZWdsR2V0Q3VycmVudFN1cmZhY2UoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMRGlzcGxheSBlZ2xHZXREaXNwbGF5KAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGFic3RyYWN0IGludCBlZ2xHZXRFcnJvcigpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGVnbEluaXRpYWxpemUoCi1qYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMRGlzcGxheQotaW50W10pCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGVnbE1ha2VDdXJyZW50KAotamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTERpc3BsYXkKLWphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xTdXJmYWNlCi1qYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMU3VyZmFjZQotamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbnRleHQpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGVnbFF1ZXJ5Q29udGV4dCgKLWphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xEaXNwbGF5Ci1qYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMQ29udGV4dAotaW50Ci1pbnRbXSkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZWdsUXVlcnlTdHJpbmcoCi1qYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMRGlzcGxheQotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBlZ2xRdWVyeVN1cmZhY2UoCi1qYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMRGlzcGxheQotamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTFN1cmZhY2UKLWludAotaW50W10pCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGVnbFN3YXBCdWZmZXJzKAotamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTERpc3BsYXkKLWphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xTdXJmYWNlKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBlZ2xUZXJtaW5hdGUoCi1qYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMRGlzcGxheSkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZWdsV2FpdEdMKCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZWdsV2FpdE5hdGl2ZSgKLWludAotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTDExIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0wxMAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFR0xfQ09OVEVYVF9MT1NUCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLSBjbGFzcyBhbmRyb2lkLm9wZW5nbC5FR0xMb2dXcmFwcGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0wxMQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGludCBtQXJnQ291bnQKLQotIGJvb2xlYW4gbUNoZWNrRXJyb3IKLQotcHJpdmF0ZSBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMMTAgbUVnbDEwCi0KLSBqYXZhLmlvLldyaXRlciBtTG9nCi0KLSBib29sZWFuIG1Mb2dBcmd1bWVudE5hbWVzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTAotaW50Ci1qYXZhLmlvLldyaXRlcikKLQotcHJpdmF0ZSB2b2lkIGFyZygKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHJpdmF0ZSB2b2lkIGFyZygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3QpCi0KLXByaXZhdGUgdm9pZCBhcmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHZvaWQgYXJnKAotamF2YS5sYW5nLlN0cmluZwotamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbnRleHQpCi0KLXByaXZhdGUgdm9pZCBhcmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMRGlzcGxheSkKLQotcHJpdmF0ZSB2b2lkIGFyZygKLWphdmEubGFuZy5TdHJpbmcKLWphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xTdXJmYWNlKQotCi1wcml2YXRlIHZvaWQgYXJnKAotamF2YS5sYW5nLlN0cmluZwotaW50W10pCi0KLXByaXZhdGUgdm9pZCBhcmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0W10pCi0KLXByaXZhdGUgdm9pZCBiZWdpbigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgdm9pZCBjaGVja0Vycm9yKCkKLQotcHJpdmF0ZSB2b2lkIGVuZCgpCi0KLXByaXZhdGUgdm9pZCBmbHVzaCgpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRFcnJvclN0cmluZygKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRIZXgoCi1pbnQpCi0KLXByaXZhdGUgdm9pZCBsb2coCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHZvaWQgbG9nTGluZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgdm9pZCByZXR1cm5zKAotaW50KQotCi1wcml2YXRlIHZvaWQgcmV0dXJucygKLWphdmEubGFuZy5PYmplY3QpCi0KLXByaXZhdGUgdm9pZCByZXR1cm5zKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSB2b2lkIHJldHVybnMoCi1ib29sZWFuKQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoCi1pbnQKLWludFtdCi1pbnQpCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygKLWludAotamF2YS5sYW5nLk9iamVjdFtdCi1pbnQpCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBib29sZWFuIGVnbENob29zZUNvbmZpZygKLWphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xEaXNwbGF5Ci1pbnRbXQotamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbmZpZ1tdCi1pbnQKLWludFtdKQotCi1wdWJsaWMgYm9vbGVhbiBlZ2xDb3B5QnVmZmVycygKLWphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xEaXNwbGF5Ci1qYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMU3VyZmFjZQotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb250ZXh0IGVnbENyZWF0ZUNvbnRleHQoCi1qYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMRGlzcGxheQotamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbmZpZwotamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbnRleHQKLWludFtdKQotCi1wdWJsaWMgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTFN1cmZhY2UgZWdsQ3JlYXRlUGJ1ZmZlclN1cmZhY2UoCi1qYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMRGlzcGxheQotamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbmZpZwotaW50W10pCi0KLXB1YmxpYyBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMU3VyZmFjZSBlZ2xDcmVhdGVQaXhtYXBTdXJmYWNlKAotamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTERpc3BsYXkKLWphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb25maWcKLWphdmEubGFuZy5PYmplY3QKLWludFtdKQotCi1wdWJsaWMgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTFN1cmZhY2UgZWdsQ3JlYXRlV2luZG93U3VyZmFjZSgKLWphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xEaXNwbGF5Ci1qYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMQ29uZmlnCi1qYXZhLmxhbmcuT2JqZWN0Ci1pbnRbXSkKLQotcHVibGljIGJvb2xlYW4gZWdsRGVzdHJveUNvbnRleHQoCi1qYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMRGlzcGxheQotamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbnRleHQpCi0KLXB1YmxpYyBib29sZWFuIGVnbERlc3Ryb3lTdXJmYWNlKAotamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTERpc3BsYXkKLWphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xTdXJmYWNlKQotCi1wdWJsaWMgYm9vbGVhbiBlZ2xHZXRDb25maWdBdHRyaWIoCi1qYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMRGlzcGxheQotamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbmZpZwotaW50Ci1pbnRbXSkKLQotcHVibGljIGJvb2xlYW4gZWdsR2V0Q29uZmlncygKLWphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xEaXNwbGF5Ci1qYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMQ29uZmlnW10KLWludAotaW50W10pCi0KLXB1YmxpYyBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMQ29udGV4dCBlZ2xHZXRDdXJyZW50Q29udGV4dCgpCi0KLXB1YmxpYyBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMRGlzcGxheSBlZ2xHZXRDdXJyZW50RGlzcGxheSgpCi0KLXB1YmxpYyBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMU3VyZmFjZSBlZ2xHZXRDdXJyZW50U3VyZmFjZSgKLWludCkKLQotcHVibGljIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xEaXNwbGF5IGVnbEdldERpc3BsYXkoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50IGVnbEdldEVycm9yKCkKLQotcHVibGljIGJvb2xlYW4gZWdsSW5pdGlhbGl6ZSgKLWphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xEaXNwbGF5Ci1pbnRbXSkKLQotcHVibGljIGJvb2xlYW4gZWdsTWFrZUN1cnJlbnQoCi1qYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMRGlzcGxheQotamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTFN1cmZhY2UKLWphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xTdXJmYWNlCi1qYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMQ29udGV4dCkKLQotcHVibGljIGJvb2xlYW4gZWdsUXVlcnlDb250ZXh0KAotamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTERpc3BsYXkKLWphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb250ZXh0Ci1pbnQKLWludFtdKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBlZ2xRdWVyeVN0cmluZygKLWphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xEaXNwbGF5Ci1pbnQpCi0KLXB1YmxpYyBib29sZWFuIGVnbFF1ZXJ5U3VyZmFjZSgKLWphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xEaXNwbGF5Ci1qYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMU3VyZmFjZQotaW50Ci1pbnRbXSkKLQotcHVibGljIGJvb2xlYW4gZWdsU3dhcEJ1ZmZlcnMoCi1qYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMRGlzcGxheQotamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTFN1cmZhY2UpCi0KLXB1YmxpYyBib29sZWFuIGVnbFRlcm1pbmF0ZSgKLWphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xEaXNwbGF5KQotCi1wdWJsaWMgYm9vbGVhbiBlZ2xXYWl0R0woKQotCi1wdWJsaWMgYm9vbGVhbiBlZ2xXYWl0TmF0aXZlKAotaW50Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQub3BlbmdsLkdMRGVidWdIZWxwZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTkZJR19DSEVDS19HTF9FUlJPUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05GSUdfQ0hFQ0tfVEhSRUFECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTkZJR19MT0dfQVJHVU1FTlRfTkFNRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfV1JPTkdfVEhSRUFECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMIHdyYXAoCi1qYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMCi1pbnQKLWphdmEuaW8uV3JpdGVyKQotCi1wdWJsaWMgc3RhdGljIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMIHdyYXAoCi1qYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTAotaW50Ci1qYXZhLmlvLldyaXRlcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9BREQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUxJQVNFRF9MSU5FX1dJRFRIX1JBTkdFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FMSUFTRURfUE9JTlRfU0laRV9SQU5HRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9BTFBIQQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9BTFBIQV9CSVRTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FMUEhBX1RFU1QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUxXQVlTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FNQklFTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQU1CSUVOVF9BTkRfRElGRlVTRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9BTkQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQU5EX0lOVkVSVEVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FORF9SRVZFUlNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0JBQ0sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQkxFTkQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQkxVRV9CSVRTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0JZVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ0NXCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NMQU1QX1RPX0VER0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ0xFQVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfQVJSQVkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfQlVGRkVSX0JJVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9MT0dJQ19PUAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9NQVRFUklBTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT05TVEFOVF9BVFRFTlVBVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT1BZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPUFlfSU5WRVJURUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ1VMTF9GQUNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NXCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RFQ0FMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RFQ1IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVQVEhfQklUUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ERVBUSF9CVUZGRVJfQklUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RFUFRIX1RFU1QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRElGRlVTRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ESVRIRVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRE9OVF9DQVJFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RTVF9BTFBIQQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9EU1RfQ09MT1IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRU1JU1NJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRVFVQUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRVFVSVYKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRVhQCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0VYUDIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRVhURU5TSU9OUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GQUxTRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GQVNURVNUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZJWEVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZMQVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRkxPQVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRk9HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZPR19DT0xPUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GT0dfREVOU0lUWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GT0dfRU5ECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZPR19ISU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZPR19NT0RFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZPR19TVEFSVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GUk9OVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GUk9OVF9BTkRfQkFDSwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9HRVFVQUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfR1JFQVRFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9HUkVFTl9CSVRTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfRk9STUFUX09FUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX1RZUEVfT0VTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOQ1IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5WQUxJRF9FTlVNCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOVkFMSURfT1BFUkFUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOVkFMSURfVkFMVUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5WRVJUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0tFRVAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTEVRVUFMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xFU1MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElHSFQwCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJR0hUMQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MSUdIVDIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElHSFQzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJR0hUNAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MSUdIVDUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElHSFQ2Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJR0hUNwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MSUdIVElORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MSUdIVF9NT0RFTF9BTUJJRU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJR0hUX01PREVMX1RXT19TSURFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJTkVBUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MSU5FQVJfQVRURU5VQVRJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElORUFSX01JUE1BUF9MSU5FQVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElORUFSX01JUE1BUF9ORUFSRVNUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJTkVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJTkVfTE9PUAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MSU5FX1NNT09USAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MSU5FX1NNT09USF9ISU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJTkVfU1RSSVAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTFVNSU5BTkNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xVTUlOQU5DRV9BTFBIQQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVhfRUxFTUVOVFNfSU5ESUNFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVhfRUxFTUVOVFNfVkVSVElDRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX0xJR0hUUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVhfTU9ERUxWSUVXX1NUQUNLX0RFUFRICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BWF9QUk9KRUNUSU9OX1NUQUNLX0RFUFRICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BWF9URVhUVVJFX1NJWkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX1RFWFRVUkVfU1RBQ0tfREVQVEgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX1RFWFRVUkVfVU5JVFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX1ZJRVdQT1JUX0RJTVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTU9ERUxWSUVXCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01PRFVMQVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01VTFRJU0FNUExFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX05BTkQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTkVBUkVTVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ORUFSRVNUX01JUE1BUF9MSU5FQVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTkVBUkVTVF9NSVBNQVBfTkVBUkVTVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ORVZFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9OSUNFU1QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTk9PUAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9OT1IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTk9STUFMSVpFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX05PUk1BTF9BUlJBWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9OT1RFUVVBTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9OT19FUlJPUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9OVU1fQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfT05FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX09ORV9NSU5VU19EU1RfQUxQSEEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfT05FX01JTlVTX0RTVF9DT0xPUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX09ORV9NSU5VU19TUkNfQ09MT1IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfT1IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfT1JfSU5WRVJURUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfT1JfUkVWRVJTRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9PVVRfT0ZfTUVNT1JZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BBQ0tfQUxJR05NRU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BBTEVUVEU0X1I1X0c2X0I1X09FUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QQUxFVFRFNF9SR0I1X0ExX09FUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QQUxFVFRFNF9SR0I4X09FUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QQUxFVFRFNF9SR0JBNF9PRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUEFMRVRURTRfUkdCQThfT0VTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BBTEVUVEU4X1I1X0c2X0I1X09FUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QQUxFVFRFOF9SR0I1X0ExX09FUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QQUxFVFRFOF9SR0I4X09FUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QQUxFVFRFOF9SR0JBNF9PRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUEFMRVRURThfUkdCQThfT0VTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BFUlNQRUNUSVZFX0NPUlJFQ1RJT05fSElOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QT0lOVFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9JTlRfRkFERV9USFJFU0hPTERfU0laRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QT0lOVF9TSVpFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPSU5UX1NNT09USAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QT0lOVF9TTU9PVEhfSElOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QT0xZR09OX09GRlNFVF9GSUxMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPTFlHT05fU01PT1RIX0hJTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9TSVRJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUFJPSkVDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9RVUFEUkFUSUNfQVRURU5VQVRJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkVEX0JJVFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkVOREVSRVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkVQRUFUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JFUExBQ0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkVTQ0FMRV9OT1JNQUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkdCCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JHQkEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NBTVBMRV9BTFBIQV9UT19PTkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU0FNUExFX0NPVkVSQUdFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NDSVNTT1JfVEVTVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TRVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU0hJTklORVNTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NIT1JUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NNT09USAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TTU9PVEhfTElORV9XSURUSF9SQU5HRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TTU9PVEhfUE9JTlRfU0laRV9SQU5HRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TUEVDVUxBUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TUE9UX0NVVE9GRgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TUE9UX0RJUkVDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TUE9UX0VYUE9ORU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NSQ19BTFBIQQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TUkNfQUxQSEFfU0FUVVJBVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1JDX0NPTE9SCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NUQUNLX09WRVJGTE9XCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NUQUNLX1VOREVSRkxPVwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX0JJVFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RFTkNJTF9CVUZGRVJfQklUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NURU5DSUxfVEVTVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVUJQSVhFTF9CSVRTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRTAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRTEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRTEwCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkUxMQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFMTIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRTEzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkUxNAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFMTUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRTE2Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkUxNwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFMTgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRTE5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkUyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkUyMAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFMjEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRTIyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkUyMwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFMjQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRTI1Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkUyNgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFMjcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRTI4Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkUyOQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFMwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFMzAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRTMxCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkU0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkU1Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkU2Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkU3Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkU4Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkU5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfMkQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9DT09SRF9BUlJBWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0VOVgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0VOVl9DT0xPUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0VOVl9NT0RFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfTUFHX0ZJTFRFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX01JTl9GSUxURVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9XUkFQX1MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9XUkFQX1QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVFJJQU5HTEVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RSSUFOR0xFX0ZBTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9UUklBTkdMRV9TVFJJUAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9UUlVFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1VOUEFDS19BTElHTk1FTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVU5TSUdORURfQllURQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9VTlNJR05FRF9TSE9SVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1VOU0lHTkVEX1NIT1JUXzVfNV81XzEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVU5TSUdORURfU0hPUlRfNV82XzUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVkVORE9SCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1ZFUlNJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVkVSVEVYX0FSUkFZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1hPUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9aRVJPCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xBY3RpdmVUZXh0dXJlKAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbEFscGhhRnVuYygKLWludAotZmxvYXQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsQWxwaGFGdW5jeCgKLWludAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbEJpbmRUZXh0dXJlKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsQmxlbmRGdW5jKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsQ2xlYXIoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsQ2xlYXJDb2xvcigKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWZsb2F0KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbENsZWFyQ29sb3J4KAotaW50Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbENsZWFyRGVwdGhmKAotZmxvYXQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsQ2xlYXJEZXB0aHgoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsQ2xlYXJTdGVuY2lsKAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbENsaWVudEFjdGl2ZVRleHR1cmUoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsQ29sb3I0ZigKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWZsb2F0KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbENvbG9yNHgoCi1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsQ29sb3JNYXNrKAotYm9vbGVhbgotYm9vbGVhbgotYm9vbGVhbgotYm9vbGVhbikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xDb2xvclBvaW50ZXIoCi1pbnQKLWludAotaW50Ci1qYXZhLm5pby5CdWZmZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsQ29tcHJlc3NlZFRleEltYWdlMkQoCi1pbnQKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWphdmEubmlvLkJ1ZmZlcikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UyRCgKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1qYXZhLm5pby5CdWZmZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsQ29weVRleEltYWdlMkQoCi1pbnQKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xDb3B5VGV4U3ViSW1hZ2UyRCgKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbEN1bGxGYWNlKAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbERlbGV0ZVRleHR1cmVzKAotaW50Ci1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsRGVsZXRlVGV4dHVyZXMoCi1pbnQKLWludFtdCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsRGVwdGhGdW5jKAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbERlcHRoTWFzaygKLWJvb2xlYW4pCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsRGVwdGhSYW5nZWYoCi1mbG9hdAotZmxvYXQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsRGVwdGhSYW5nZXgoCi1pbnQKLWludCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xEaXNhYmxlKAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbERpc2FibGVDbGllbnRTdGF0ZSgKLWludCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xEcmF3QXJyYXlzKAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xEcmF3RWxlbWVudHMoCi1pbnQKLWludAotaW50Ci1qYXZhLm5pby5CdWZmZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsRW5hYmxlKAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbEVuYWJsZUNsaWVudFN0YXRlKAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbEZpbmlzaCgpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsRmx1c2goKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbEZvZ2YoCi1pbnQKLWZsb2F0KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbEZvZ2Z2KAotaW50Ci1qYXZhLm5pby5GbG9hdEJ1ZmZlcikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xGb2dmdigKLWludAotZmxvYXRbXQotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbEZvZ3goCi1pbnQKLWludCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xGb2d4digKLWludAotamF2YS5uaW8uSW50QnVmZmVyKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbEZvZ3h2KAotaW50Ci1pbnRbXQotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbEZyb250RmFjZSgKLWludCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xGcnVzdHVtZigKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWZsb2F0Ci1mbG9hdAotZmxvYXQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsRnJ1c3R1bXgoCi1pbnQKLWludAotaW50Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbEdlblRleHR1cmVzKAotaW50Ci1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsR2VuVGV4dHVyZXMoCi1pbnQKLWludFtdCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2xHZXRFcnJvcigpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsR2V0SW50ZWdlcnYoCi1pbnQKLWphdmEubmlvLkludEJ1ZmZlcikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xHZXRJbnRlZ2VydigKLWludAotaW50W10KLWludCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2xHZXRTdHJpbmcoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsSGludCgKLWludAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbExpZ2h0TW9kZWxmKAotaW50Ci1mbG9hdCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xMaWdodE1vZGVsZnYoCi1pbnQKLWphdmEubmlvLkZsb2F0QnVmZmVyKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbExpZ2h0TW9kZWxmdigKLWludAotZmxvYXRbXQotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbExpZ2h0TW9kZWx4KAotaW50Ci1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsTGlnaHRNb2RlbHh2KAotaW50Ci1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsTGlnaHRNb2RlbHh2KAotaW50Ci1pbnRbXQotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbExpZ2h0ZigKLWludAotaW50Ci1mbG9hdCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xMaWdodGZ2KAotaW50Ci1pbnQKLWphdmEubmlvLkZsb2F0QnVmZmVyKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbExpZ2h0ZnYoCi1pbnQKLWludAotZmxvYXRbXQotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbExpZ2h0eCgKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsTGlnaHR4digKLWludAotaW50Ci1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsTGlnaHR4digKLWludAotaW50Ci1pbnRbXQotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbExpbmVXaWR0aCgKLWZsb2F0KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbExpbmVXaWR0aHgoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsTG9hZElkZW50aXR5KCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xMb2FkTWF0cml4ZigKLWphdmEubmlvLkZsb2F0QnVmZmVyKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbExvYWRNYXRyaXhmKAotZmxvYXRbXQotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbExvYWRNYXRyaXh4KAotamF2YS5uaW8uSW50QnVmZmVyKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbExvYWRNYXRyaXh4KAotaW50W10KLWludCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xMb2dpY09wKAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbE1hdGVyaWFsZigKLWludAotaW50Ci1mbG9hdCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xNYXRlcmlhbGZ2KAotaW50Ci1pbnQKLWphdmEubmlvLkZsb2F0QnVmZmVyKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbE1hdGVyaWFsZnYoCi1pbnQKLWludAotZmxvYXRbXQotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbE1hdGVyaWFseCgKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsTWF0ZXJpYWx4digKLWludAotaW50Ci1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsTWF0ZXJpYWx4digKLWludAotaW50Ci1pbnRbXQotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbE1hdHJpeE1vZGUoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsTXVsdE1hdHJpeGYoCi1qYXZhLm5pby5GbG9hdEJ1ZmZlcikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xNdWx0TWF0cml4ZigKLWZsb2F0W10KLWludCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xNdWx0TWF0cml4eCgKLWphdmEubmlvLkludEJ1ZmZlcikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xNdWx0TWF0cml4eCgKLWludFtdCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsTXVsdGlUZXhDb29yZDRmKAotaW50Ci1mbG9hdAotZmxvYXQKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xNdWx0aVRleENvb3JkNHgoCi1pbnQKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xOb3JtYWwzZigKLWZsb2F0Ci1mbG9hdAotZmxvYXQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsTm9ybWFsM3goCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbE5vcm1hbFBvaW50ZXIoCi1pbnQKLWludAotamF2YS5uaW8uQnVmZmVyKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbE9ydGhvZigKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWZsb2F0Ci1mbG9hdAotZmxvYXQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsT3J0aG94KAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xQaXhlbFN0b3JlaSgKLWludAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbFBvaW50U2l6ZSgKLWZsb2F0KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbFBvaW50U2l6ZXgoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsUG9seWdvbk9mZnNldCgKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xQb2x5Z29uT2Zmc2V0eCgKLWludAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbFBvcE1hdHJpeCgpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsUHVzaE1hdHJpeCgpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsUmVhZFBpeGVscygKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWphdmEubmlvLkJ1ZmZlcikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xSb3RhdGVmKAotZmxvYXQKLWZsb2F0Ci1mbG9hdAotZmxvYXQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsUm90YXRleCgKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xTYW1wbGVDb3ZlcmFnZSgKLWZsb2F0Ci1ib29sZWFuKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbFNhbXBsZUNvdmVyYWdleCgKLWludAotYm9vbGVhbikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xTY2FsZWYoCi1mbG9hdAotZmxvYXQKLWZsb2F0KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbFNjYWxleCgKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsU2Npc3NvcigKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xTaGFkZU1vZGVsKAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbFN0ZW5jaWxGdW5jKAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xTdGVuY2lsTWFzaygKLWludCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xTdGVuY2lsT3AoCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbFRleENvb3JkUG9pbnRlcigKLWludAotaW50Ci1pbnQKLWphdmEubmlvLkJ1ZmZlcikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xUZXhFbnZmKAotaW50Ci1pbnQKLWZsb2F0KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbFRleEVudmZ2KAotaW50Ci1pbnQKLWphdmEubmlvLkZsb2F0QnVmZmVyKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbFRleEVudmZ2KAotaW50Ci1pbnQKLWZsb2F0W10KLWludCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xUZXhFbnZ4KAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xUZXhFbnZ4digKLWludAotaW50Ci1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsVGV4RW52eHYoCi1pbnQKLWludAotaW50W10KLWludCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xUZXhJbWFnZTJEKAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWphdmEubmlvLkJ1ZmZlcikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xUZXhQYXJhbWV0ZXJmKAotaW50Ci1pbnQKLWZsb2F0KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbFRleFBhcmFtZXRlcngoCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbFRleFN1YkltYWdlMkQoCi1pbnQKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludAotamF2YS5uaW8uQnVmZmVyKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbFRyYW5zbGF0ZWYoCi1mbG9hdAotZmxvYXQKLWZsb2F0KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbFRyYW5zbGF0ZXgoCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbFZlcnRleFBvaW50ZXIoCi1pbnQKLWludAotaW50Ci1qYXZhLm5pby5CdWZmZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsVmlld3BvcnQoCi1pbnQKLWludAotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTBFeHQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdsUXVlcnlNYXRyaXh4T0VTKAotamF2YS5uaW8uSW50QnVmZmVyCi1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2xRdWVyeU1hdHJpeHhPRVMoCi1pbnRbXQotaW50Ci1pbnRbXQotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDExIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTAKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUNUSVZFX1RFWFRVUkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUREX1NJR05FRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9BTFBIQV9TQ0FMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9BTFBIQV9URVNUX0ZVTkMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUxQSEFfVEVTVF9SRUYKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQVJSQVlfQlVGRkVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FSUkFZX0JVRkZFUl9CSU5ESU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0JMRU5EX0RTVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CTEVORF9TUkMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQlVGRkVSX0FDQ0VTUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CVUZGRVJfU0laRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CVUZGRVJfVVNBR0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ0xJRU5UX0FDVElWRV9URVhUVVJFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NMSVBfUExBTkUwCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NMSVBfUExBTkUxCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NMSVBfUExBTkUyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NMSVBfUExBTkUzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NMSVBfUExBTkU0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NMSVBfUExBTkU1Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTE9SX0FSUkFZX0JVRkZFUl9CSU5ESU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTE9SX0FSUkFZX1BPSU5URVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfQVJSQVlfU0laRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9BUlJBWV9TVFJJREUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfQVJSQVlfVFlQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9DTEVBUl9WQUxVRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9XUklURU1BU0sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09NQklORQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT01CSU5FX0FMUEhBCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTUJJTkVfUkdCCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTlNUQU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPT1JEX1JFUExBQ0VfT0VTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NVTExfRkFDRV9NT0RFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NVUlJFTlRfQ09MT1IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ1VSUkVOVF9OT1JNQUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ1VSUkVOVF9URVhUVVJFX0NPT1JEUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ERVBUSF9DTEVBUl9WQUxVRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ERVBUSF9GVU5DCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RFUFRIX1JBTkdFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RFUFRIX1dSSVRFTUFTSwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ET1QzX1JHQgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ET1QzX1JHQkEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRFlOQU1JQ19EUkFXCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSX0JJTkRJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRlJPTlRfRkFDRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9HRU5FUkFURV9NSVBNQVAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfR0VORVJBVEVfTUlQTUFQX0hJTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5URVJQT0xBVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElORV9XSURUSAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MT0dJQ19PUF9NT0RFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BVFJJWF9NT0RFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BWF9DTElQX1BMQU5FUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NT0RFTFZJRVdfTUFUUklYCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01PREVMVklFV19NQVRSSVhfRkxPQVRfQVNfSU5UX0JJVFNfT0VTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01PREVMVklFV19TVEFDS19ERVBUSAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9OT1JNQUxfQVJSQVlfQlVGRkVSX0JJTkRJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTk9STUFMX0FSUkFZX1BPSU5URVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTk9STUFMX0FSUkFZX1NUUklERQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9OT1JNQUxfQVJSQVlfVFlQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9PUEVSQU5EMF9BTFBIQQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9PUEVSQU5EMF9SR0IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfT1BFUkFORDFfQUxQSEEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfT1BFUkFORDFfUkdCCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX09QRVJBTkQyX0FMUEhBCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX09QRVJBTkQyX1JHQgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QT0lOVF9ESVNUQU5DRV9BVFRFTlVBVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QT0lOVF9GQURFX1RIUkVTSE9MRF9TSVpFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPSU5UX1NJWkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9JTlRfU0laRV9BUlJBWV9CVUZGRVJfQklORElOR19PRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9JTlRfU0laRV9BUlJBWV9PRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9JTlRfU0laRV9BUlJBWV9QT0lOVEVSX09FUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QT0lOVF9TSVpFX0FSUkFZX1NUUklERV9PRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9JTlRfU0laRV9BUlJBWV9UWVBFX09FUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QT0lOVF9TSVpFX01BWAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QT0lOVF9TSVpFX01JTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QT0lOVF9TUFJJVEVfT0VTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPTFlHT05fT0ZGU0VUX0ZBQ1RPUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QT0xZR09OX09GRlNFVF9VTklUUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QUkVWSU9VUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QUklNQVJZX0NPTE9SCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BST0pFQ1RJT05fTUFUUklYCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BST0pFQ1RJT05fTUFUUklYX0ZMT0FUX0FTX0lOVF9CSVRTX09FUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QUk9KRUNUSU9OX1NUQUNLX0RFUFRICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JHQl9TQ0FMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TQU1QTEVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NBTVBMRV9CVUZGRVJTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NBTVBMRV9DT1ZFUkFHRV9JTlZFUlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU0FNUExFX0NPVkVSQUdFX1ZBTFVFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NDSVNTT1JfQk9YCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NIQURFX01PREVMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NSQzBfQUxQSEEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1JDMF9SR0IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1JDMV9BTFBIQQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TUkMxX1JHQgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TUkMyX0FMUEhBCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NSQzJfUkdCCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NUQVRJQ19EUkFXCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NURU5DSUxfQ0xFQVJfVkFMVUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RFTkNJTF9GQUlMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NURU5DSUxfRlVOQwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX1BBU1NfREVQVEhfRkFJTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX1BBU1NfREVQVEhfUEFTUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX1JFRgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX1ZBTFVFX01BU0sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RFTkNJTF9XUklURU1BU0sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1VCVFJBQ1QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9CSU5ESU5HXzJECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfQlVGRkVSX0JJTkRJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9QT0lOVEVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfU0laRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1NUUklERQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1RZUEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9NQVRSSVgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9NQVRSSVhfRkxPQVRfQVNfSU5UX0JJVFNfT0VTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfU1RBQ0tfREVQVEgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVkVSVEVYX0FSUkFZX0JVRkZFUl9CSU5ESU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1ZFUlRFWF9BUlJBWV9QT0lOVEVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1ZFUlRFWF9BUlJBWV9TSVpFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1ZFUlRFWF9BUlJBWV9TVFJJREUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVkVSVEVYX0FSUkFZX1RZUEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVklFV1BPUlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfV1JJVEVfT05MWQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsQmluZEJ1ZmZlcigKLWludAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbEJ1ZmZlckRhdGEoCi1pbnQKLWludAotamF2YS5uaW8uQnVmZmVyCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsQnVmZmVyU3ViRGF0YSgKLWludAotaW50Ci1pbnQKLWphdmEubmlvLkJ1ZmZlcikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xDbGlwUGxhbmVmKAotaW50Ci1qYXZhLm5pby5GbG9hdEJ1ZmZlcikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xDbGlwUGxhbmVmKAotaW50Ci1mbG9hdFtdCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsQ2xpcFBsYW5leCgKLWludAotamF2YS5uaW8uSW50QnVmZmVyKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbENsaXBQbGFuZXgoCi1pbnQKLWludFtdCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsQ29sb3I0dWIoCi1ieXRlCi1ieXRlCi1ieXRlCi1ieXRlKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbENvbG9yUG9pbnRlcigKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xEZWxldGVCdWZmZXJzKAotaW50Ci1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsRGVsZXRlQnVmZmVycygKLWludAotaW50W10KLWludCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xEcmF3RWxlbWVudHMoCi1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsR2VuQnVmZmVycygKLWludAotamF2YS5uaW8uSW50QnVmZmVyKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbEdlbkJ1ZmZlcnMoCi1pbnQKLWludFtdCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsR2V0Qm9vbGVhbnYoCi1pbnQKLWphdmEubmlvLkludEJ1ZmZlcikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xHZXRCb29sZWFudigKLWludAotYm9vbGVhbltdCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsR2V0QnVmZmVyUGFyYW1ldGVyaXYoCi1pbnQKLWludAotamF2YS5uaW8uSW50QnVmZmVyKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbEdldEJ1ZmZlclBhcmFtZXRlcml2KAotaW50Ci1pbnQKLWludFtdCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsR2V0Q2xpcFBsYW5lZigKLWludAotamF2YS5uaW8uRmxvYXRCdWZmZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsR2V0Q2xpcFBsYW5lZigKLWludAotZmxvYXRbXQotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbEdldENsaXBQbGFuZXgoCi1pbnQKLWphdmEubmlvLkludEJ1ZmZlcikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xHZXRDbGlwUGxhbmV4KAotaW50Ci1pbnRbXQotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbEdldEZpeGVkdigKLWludAotamF2YS5uaW8uSW50QnVmZmVyKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbEdldEZpeGVkdigKLWludAotaW50W10KLWludCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xHZXRGbG9hdHYoCi1pbnQKLWphdmEubmlvLkZsb2F0QnVmZmVyKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbEdldEZsb2F0digKLWludAotZmxvYXRbXQotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbEdldExpZ2h0ZnYoCi1pbnQKLWludAotamF2YS5uaW8uRmxvYXRCdWZmZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsR2V0TGlnaHRmdigKLWludAotaW50Ci1mbG9hdFtdCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsR2V0TGlnaHR4digKLWludAotaW50Ci1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsR2V0TGlnaHR4digKLWludAotaW50Ci1pbnRbXQotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbEdldE1hdGVyaWFsZnYoCi1pbnQKLWludAotamF2YS5uaW8uRmxvYXRCdWZmZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsR2V0TWF0ZXJpYWxmdigKLWludAotaW50Ci1mbG9hdFtdCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsR2V0TWF0ZXJpYWx4digKLWludAotaW50Ci1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsR2V0TWF0ZXJpYWx4digKLWludAotaW50Ci1pbnRbXQotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbEdldFBvaW50ZXJ2KAotaW50Ci1qYXZhLm5pby5CdWZmZXJbXSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xHZXRUZXhFbnZpdigKLWludAotaW50Ci1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsR2V0VGV4RW52aXYoCi1pbnQKLWludAotaW50W10KLWludCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xHZXRUZXhFbnZ4digKLWludAotaW50Ci1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsR2V0VGV4RW52eHYoCi1pbnQKLWludAotaW50W10KLWludCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xHZXRUZXhQYXJhbWV0ZXJmdigKLWludAotaW50Ci1qYXZhLm5pby5GbG9hdEJ1ZmZlcikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xHZXRUZXhQYXJhbWV0ZXJmdigKLWludAotaW50Ci1mbG9hdFtdCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsR2V0VGV4UGFyYW1ldGVyaXYoCi1pbnQKLWludAotamF2YS5uaW8uSW50QnVmZmVyKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbEdldFRleFBhcmFtZXRlcml2KAotaW50Ci1pbnQKLWludFtdCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsR2V0VGV4UGFyYW1ldGVyeHYoCi1pbnQKLWludAotamF2YS5uaW8uSW50QnVmZmVyKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbEdldFRleFBhcmFtZXRlcnh2KAotaW50Ci1pbnQKLWludFtdCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGdsSXNCdWZmZXIoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGdsSXNFbmFibGVkKAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBnbElzVGV4dHVyZSgKLWludCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xOb3JtYWxQb2ludGVyKAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xQb2ludFBhcmFtZXRlcmYoCi1pbnQKLWZsb2F0KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbFBvaW50UGFyYW1ldGVyZnYoCi1pbnQKLWphdmEubmlvLkZsb2F0QnVmZmVyKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbFBvaW50UGFyYW1ldGVyZnYoCi1pbnQKLWZsb2F0W10KLWludCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xQb2ludFBhcmFtZXRlcngoCi1pbnQKLWludCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xQb2ludFBhcmFtZXRlcnh2KAotaW50Ci1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsUG9pbnRQYXJhbWV0ZXJ4digKLWludAotaW50W10KLWludCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xQb2ludFNpemVQb2ludGVyT0VTKAotaW50Ci1pbnQKLWphdmEubmlvLkJ1ZmZlcikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xUZXhDb29yZFBvaW50ZXIoCi1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsVGV4RW52aSgKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsVGV4RW52aXYoCi1pbnQKLWludAotamF2YS5uaW8uSW50QnVmZmVyKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbFRleEVudml2KAotaW50Ci1pbnQKLWludFtdCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsVGV4UGFyYW1ldGVyZnYoCi1pbnQKLWludAotamF2YS5uaW8uRmxvYXRCdWZmZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsVGV4UGFyYW1ldGVyZnYoCi1pbnQKLWludAotZmxvYXRbXQotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbFRleFBhcmFtZXRlcmkoCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbFRleFBhcmFtZXRlcml2KAotaW50Ci1pbnQKLWphdmEubmlvLkludEJ1ZmZlcikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xUZXhQYXJhbWV0ZXJpdigKLWludAotaW50Ci1pbnRbXQotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbFRleFBhcmFtZXRlcnh2KAotaW50Ci1pbnQKLWphdmEubmlvLkludEJ1ZmZlcikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xUZXhQYXJhbWV0ZXJ4digKLWludAotaW50Ci1pbnRbXQotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbFZlcnRleFBvaW50ZXIoCi1pbnQKLWludAotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTFFeHQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFUUklYX0lOREVYX0FSUkFZX0JVRkZFUl9CSU5ESU5HX09FUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfT0VTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BVFJJWF9JTkRFWF9BUlJBWV9QT0lOVEVSX09FUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfU0laRV9PRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFUUklYX0lOREVYX0FSUkFZX1NUUklERV9PRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFUUklYX0lOREVYX0FSUkFZX1RZUEVfT0VTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BVFJJWF9QQUxFVFRFX09FUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVhfUEFMRVRURV9NQVRSSUNFU19PRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX1ZFUlRFWF9VTklUU19PRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1dFSUdIVF9BUlJBWV9CVUZGRVJfQklORElOR19PRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfV0VJR0hUX0FSUkFZX09FUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9XRUlHSFRfQVJSQVlfUE9JTlRFUl9PRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfV0VJR0hUX0FSUkFZX1NJWkVfT0VTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1dFSUdIVF9BUlJBWV9TVFJJREVfT0VTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1dFSUdIVF9BUlJBWV9UWVBFX09FUwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsQ3VycmVudFBhbGV0dGVNYXRyaXhPRVMoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsRHJhd1RleGZPRVMoCi1mbG9hdAotZmxvYXQKLWZsb2F0Ci1mbG9hdAotZmxvYXQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsRHJhd1RleGZ2T0VTKAotamF2YS5uaW8uRmxvYXRCdWZmZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsRHJhd1RleGZ2T0VTKAotZmxvYXRbXQotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbERyYXdUZXhpT0VTKAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsRHJhd1RleGl2T0VTKAotamF2YS5uaW8uSW50QnVmZmVyKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbERyYXdUZXhpdk9FUygKLWludFtdCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsRHJhd1RleHNPRVMoCi1zaG9ydAotc2hvcnQKLXNob3J0Ci1zaG9ydAotc2hvcnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsRHJhd1RleHN2T0VTKAotamF2YS5uaW8uU2hvcnRCdWZmZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsRHJhd1RleHN2T0VTKAotc2hvcnRbXQotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbERyYXdUZXh4T0VTKAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsRHJhd1RleHh2T0VTKAotamF2YS5uaW8uSW50QnVmZmVyKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbERyYXdUZXh4dk9FUygKLWludFtdCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsRW5hYmxlKAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbEVuYWJsZUNsaWVudFN0YXRlKAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbExvYWRQYWxldHRlRnJvbU1vZGVsVmlld01hdHJpeE9FUygpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsTWF0cml4SW5kZXhQb2ludGVyT0VTKAotaW50Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbE1hdHJpeEluZGV4UG9pbnRlck9FUygKLWludAotaW50Ci1pbnQKLWphdmEubmlvLkJ1ZmZlcikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xUZXhQYXJhbWV0ZXJmdigKLWludAotaW50Ci1mbG9hdFtdCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsV2VpZ2h0UG9pbnRlck9FUygKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xXZWlnaHRQb2ludGVyT0VTKAotaW50Ci1pbnQKLWludAotamF2YS5uaW8uQnVmZmVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC5vcGVuZ2wuR0xXcmFwcGVyQmFzZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTCwgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMCwgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMEV4dCwgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMSwgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMUV4dAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMCBtZ2wKLQotcHJvdGVjdGVkIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTBFeHQgbWdsMTBFeHQKLQotcHJvdGVjdGVkIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTEgbWdsMTEKLQotcHJvdGVjdGVkIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTFFeHQgbWdsMTFFeHQKLQotcHJvdGVjdGVkIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTFFeHRlbnNpb25QYWNrIG1nbDExRXh0ZW5zaW9uUGFjawotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMKQotCi1wdWJsaWMgdm9pZCBnbEJpbmRCdWZmZXIoCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgZ2xCaW5kRnJhbWVidWZmZXJPRVMoCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgZ2xCaW5kUmVuZGVyYnVmZmVyT0VTKAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsQmxlbmRFcXVhdGlvbigKLWludCkKLQotcHVibGljIHZvaWQgZ2xCbGVuZEVxdWF0aW9uU2VwYXJhdGUoCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgZ2xCbGVuZEZ1bmNTZXBhcmF0ZSgKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgZ2xCdWZmZXJEYXRhKAotaW50Ci1pbnQKLWphdmEubmlvLkJ1ZmZlcgotaW50KQotCi1wdWJsaWMgdm9pZCBnbEJ1ZmZlclN1YkRhdGEoCi1pbnQKLWludAotaW50Ci1qYXZhLm5pby5CdWZmZXIpCi0KLSBpbnQgZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzT0VTKAotaW50KQotCi1wdWJsaWMgdm9pZCBnbENvbG9yNHViKAotYnl0ZQotYnl0ZQotYnl0ZQotYnl0ZSkKLQotcHVibGljIHZvaWQgZ2xDb2xvclBvaW50ZXIoCi1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsQ29tcHJlc3NlZFRleEltYWdlMkQoCi1pbnQKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsQ3VycmVudFBhbGV0dGVNYXRyaXhPRVMoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsRGVsZXRlQnVmZmVycygKLWludAotamF2YS5uaW8uSW50QnVmZmVyKQotCi1wdWJsaWMgdm9pZCBnbERlbGV0ZUJ1ZmZlcnMoCi1pbnQKLWludFtdCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsRGVsZXRlRnJhbWVidWZmZXJzT0VTKAotaW50Ci1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyB2b2lkIGdsRGVsZXRlRnJhbWVidWZmZXJzT0VTKAotaW50Ci1pbnRbXQotaW50KQotCi1wdWJsaWMgdm9pZCBnbERlbGV0ZVJlbmRlcmJ1ZmZlcnNPRVMoCi1pbnQKLWphdmEubmlvLkludEJ1ZmZlcikKLQotcHVibGljIHZvaWQgZ2xEZWxldGVSZW5kZXJidWZmZXJzT0VTKAotaW50Ci1pbnRbXQotaW50KQotCi1wdWJsaWMgdm9pZCBnbERyYXdFbGVtZW50cygKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgZ2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlck9FUygKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRE9FUygKLWludAotaW50Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBnbEdlbkJ1ZmZlcnMoCi1pbnQKLWphdmEubmlvLkludEJ1ZmZlcikKLQotcHVibGljIHZvaWQgZ2xHZW5CdWZmZXJzKAotaW50Ci1pbnRbXQotaW50KQotCi1wdWJsaWMgdm9pZCBnbEdlbkZyYW1lYnVmZmVyc09FUygKLWludAotamF2YS5uaW8uSW50QnVmZmVyKQotCi1wdWJsaWMgdm9pZCBnbEdlbkZyYW1lYnVmZmVyc09FUygKLWludAotaW50W10KLWludCkKLQotcHVibGljIHZvaWQgZ2xHZW5SZW5kZXJidWZmZXJzT0VTKAotaW50Ci1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyB2b2lkIGdsR2VuUmVuZGVyYnVmZmVyc09FUygKLWludAotaW50W10KLWludCkKLQotcHVibGljIHZvaWQgZ2xHZW5lcmF0ZU1pcG1hcE9FUygKLWludCkKLQotcHVibGljIHZvaWQgZ2xHZXRCb29sZWFudigKLWludAotamF2YS5uaW8uSW50QnVmZmVyKQotCi1wdWJsaWMgdm9pZCBnbEdldEJvb2xlYW52KAotaW50Ci1ib29sZWFuW10KLWludCkKLQotcHVibGljIHZvaWQgZ2xHZXRCdWZmZXJQYXJhbWV0ZXJpdigKLWludAotaW50Ci1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyB2b2lkIGdsR2V0QnVmZmVyUGFyYW1ldGVyaXYoCi1pbnQKLWludAotaW50W10KLWludCkKLQotcHVibGljIHZvaWQgZ2xHZXRDbGlwUGxhbmVmKAotaW50Ci1qYXZhLm5pby5GbG9hdEJ1ZmZlcikKLQotcHVibGljIHZvaWQgZ2xHZXRDbGlwUGxhbmVmKAotaW50Ci1mbG9hdFtdCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsR2V0Q2xpcFBsYW5leCgKLWludAotamF2YS5uaW8uSW50QnVmZmVyKQotCi1wdWJsaWMgdm9pZCBnbEdldENsaXBQbGFuZXgoCi1pbnQKLWludFtdCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsR2V0Rml4ZWR2KAotaW50Ci1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyB2b2lkIGdsR2V0Rml4ZWR2KAotaW50Ci1pbnRbXQotaW50KQotCi1wdWJsaWMgdm9pZCBnbEdldEZsb2F0digKLWludAotamF2YS5uaW8uRmxvYXRCdWZmZXIpCi0KLXB1YmxpYyB2b2lkIGdsR2V0RmxvYXR2KAotaW50Ci1mbG9hdFtdCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXZPRVMoCi1pbnQKLWludAotaW50Ci1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyB2b2lkIGdsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXZPRVMoCi1pbnQKLWludAotaW50Ci1pbnRbXQotaW50KQotCi1wdWJsaWMgdm9pZCBnbEdldExpZ2h0ZnYoCi1pbnQKLWludAotamF2YS5uaW8uRmxvYXRCdWZmZXIpCi0KLXB1YmxpYyB2b2lkIGdsR2V0TGlnaHRmdigKLWludAotaW50Ci1mbG9hdFtdCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsR2V0TGlnaHR4digKLWludAotaW50Ci1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyB2b2lkIGdsR2V0TGlnaHR4digKLWludAotaW50Ci1pbnRbXQotaW50KQotCi1wdWJsaWMgdm9pZCBnbEdldE1hdGVyaWFsZnYoCi1pbnQKLWludAotamF2YS5uaW8uRmxvYXRCdWZmZXIpCi0KLXB1YmxpYyB2b2lkIGdsR2V0TWF0ZXJpYWxmdigKLWludAotaW50Ci1mbG9hdFtdCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsR2V0TWF0ZXJpYWx4digKLWludAotaW50Ci1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyB2b2lkIGdsR2V0TWF0ZXJpYWx4digKLWludAotaW50Ci1pbnRbXQotaW50KQotCi1wdWJsaWMgdm9pZCBnbEdldFBvaW50ZXJ2KAotaW50Ci1qYXZhLm5pby5CdWZmZXJbXSkKLQotcHVibGljIHZvaWQgZ2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdk9FUygKLWludAotaW50Ci1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyB2b2lkIGdsR2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXZPRVMoCi1pbnQKLWludAotaW50W10KLWludCkKLQotcHVibGljIHZvaWQgZ2xHZXRUZXhFbnZpdigKLWludAotaW50Ci1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyB2b2lkIGdsR2V0VGV4RW52aXYoCi1pbnQKLWludAotaW50W10KLWludCkKLQotcHVibGljIHZvaWQgZ2xHZXRUZXhFbnZ4digKLWludAotaW50Ci1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyB2b2lkIGdsR2V0VGV4RW52eHYoCi1pbnQKLWludAotaW50W10KLWludCkKLQotcHVibGljIHZvaWQgZ2xHZXRUZXhHZW5mdigKLWludAotaW50Ci1qYXZhLm5pby5GbG9hdEJ1ZmZlcikKLQotcHVibGljIHZvaWQgZ2xHZXRUZXhHZW5mdigKLWludAotaW50Ci1mbG9hdFtdCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsR2V0VGV4R2VuaXYoCi1pbnQKLWludAotamF2YS5uaW8uSW50QnVmZmVyKQotCi1wdWJsaWMgdm9pZCBnbEdldFRleEdlbml2KAotaW50Ci1pbnQKLWludFtdCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsR2V0VGV4R2VueHYoCi1pbnQKLWludAotamF2YS5uaW8uSW50QnVmZmVyKQotCi1wdWJsaWMgdm9pZCBnbEdldFRleEdlbnh2KAotaW50Ci1pbnQKLWludFtdCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsR2V0VGV4UGFyYW1ldGVyZnYoCi1pbnQKLWludAotamF2YS5uaW8uRmxvYXRCdWZmZXIpCi0KLXB1YmxpYyB2b2lkIGdsR2V0VGV4UGFyYW1ldGVyZnYoCi1pbnQKLWludAotZmxvYXRbXQotaW50KQotCi1wdWJsaWMgdm9pZCBnbEdldFRleFBhcmFtZXRlcml2KAotaW50Ci1pbnQKLWphdmEubmlvLkludEJ1ZmZlcikKLQotcHVibGljIHZvaWQgZ2xHZXRUZXhQYXJhbWV0ZXJpdigKLWludAotaW50Ci1pbnRbXQotaW50KQotCi1wdWJsaWMgdm9pZCBnbEdldFRleFBhcmFtZXRlcnh2KAotaW50Ci1pbnQKLWphdmEubmlvLkludEJ1ZmZlcikKLQotcHVibGljIHZvaWQgZ2xHZXRUZXhQYXJhbWV0ZXJ4digKLWludAotaW50Ci1pbnRbXQotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBnbElzQnVmZmVyKAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBnbElzRW5hYmxlZCgKLWludCkKLQotcHVibGljIGJvb2xlYW4gZ2xJc0ZyYW1lYnVmZmVyT0VTKAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBnbElzUmVuZGVyYnVmZmVyT0VTKAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBnbElzVGV4dHVyZSgKLWludCkKLQotcHVibGljIHZvaWQgZ2xMb2FkUGFsZXR0ZUZyb21Nb2RlbFZpZXdNYXRyaXhPRVMoKQotCi1wdWJsaWMgdm9pZCBnbE1hdHJpeEluZGV4UG9pbnRlck9FUygKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgZ2xNYXRyaXhJbmRleFBvaW50ZXJPRVMoCi1pbnQKLWludAotaW50Ci1qYXZhLm5pby5CdWZmZXIpCi0KLXB1YmxpYyB2b2lkIGdsTm9ybWFsUG9pbnRlcigKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsUG9pbnRQYXJhbWV0ZXJmKAotaW50Ci1mbG9hdCkKLQotcHVibGljIHZvaWQgZ2xQb2ludFBhcmFtZXRlcmZ2KAotaW50Ci1qYXZhLm5pby5GbG9hdEJ1ZmZlcikKLQotcHVibGljIHZvaWQgZ2xQb2ludFBhcmFtZXRlcmZ2KAotaW50Ci1mbG9hdFtdCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsUG9pbnRQYXJhbWV0ZXJ4KAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsUG9pbnRQYXJhbWV0ZXJ4digKLWludAotamF2YS5uaW8uSW50QnVmZmVyKQotCi1wdWJsaWMgdm9pZCBnbFBvaW50UGFyYW1ldGVyeHYoCi1pbnQKLWludFtdCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsUG9pbnRTaXplUG9pbnRlck9FUygKLWludAotaW50Ci1qYXZhLm5pby5CdWZmZXIpCi0KLXB1YmxpYyB2b2lkIGdsUmVuZGVyYnVmZmVyU3RvcmFnZU9FUygKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgZ2xUZXhDb29yZFBvaW50ZXIoCi1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsVGV4RW52aSgKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsVGV4RW52aXYoCi1pbnQKLWludAotamF2YS5uaW8uSW50QnVmZmVyKQotCi1wdWJsaWMgdm9pZCBnbFRleEVudml2KAotaW50Ci1pbnQKLWludFtdCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsVGV4R2VuZigKLWludAotaW50Ci1mbG9hdCkKLQotcHVibGljIHZvaWQgZ2xUZXhHZW5mdigKLWludAotaW50Ci1qYXZhLm5pby5GbG9hdEJ1ZmZlcikKLQotcHVibGljIHZvaWQgZ2xUZXhHZW5mdigKLWludAotaW50Ci1mbG9hdFtdCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsVGV4R2VuaSgKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsVGV4R2VuaXYoCi1pbnQKLWludAotamF2YS5uaW8uSW50QnVmZmVyKQotCi1wdWJsaWMgdm9pZCBnbFRleEdlbml2KAotaW50Ci1pbnQKLWludFtdCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsVGV4R2VueCgKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsVGV4R2VueHYoCi1pbnQKLWludAotamF2YS5uaW8uSW50QnVmZmVyKQotCi1wdWJsaWMgdm9pZCBnbFRleEdlbnh2KAotaW50Ci1pbnQKLWludFtdCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsVGV4UGFyYW1ldGVyZnYoCi1pbnQKLWludAotamF2YS5uaW8uRmxvYXRCdWZmZXIpCi0KLXB1YmxpYyB2b2lkIGdsVGV4UGFyYW1ldGVyZnYoCi1pbnQKLWludAotZmxvYXRbXQotaW50KQotCi1wdWJsaWMgdm9pZCBnbFRleFBhcmFtZXRlcmkoCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBnbFRleFBhcmFtZXRlcnh2KAotaW50Ci1pbnQKLWphdmEubmlvLkludEJ1ZmZlcikKLQotcHVibGljIHZvaWQgZ2xUZXhQYXJhbWV0ZXJ4digKLWludAotaW50Ci1pbnRbXQotaW50KQotCi1wdWJsaWMgdm9pZCBnbFZlcnRleFBvaW50ZXIoCi1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsV2VpZ2h0UG9pbnRlck9FUygKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgZ2xXZWlnaHRQb2ludGVyT0VTKAotaW50Ci1pbnQKLWludAotamF2YS5uaW8uQnVmZmVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotIGNsYXNzIGFuZHJvaWQub3BlbmdsLkdMRXJyb3JXcmFwcGVyIGV4dGVuZHMgYW5kcm9pZC5vcGVuZ2wuR0xXcmFwcGVyQmFzZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gYm9vbGVhbiBtQ2hlY2tFcnJvcgotCi0gYm9vbGVhbiBtQ2hlY2tUaHJlYWQKLQotIGphdmEubGFuZy5UaHJlYWQgbU91clRocmVhZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMCi1pbnQpCi0KLXByaXZhdGUgdm9pZCBjaGVja0Vycm9yKCkKLQotcHJpdmF0ZSB2b2lkIGNoZWNrVGhyZWFkKCkKLQotcHVibGljIHZvaWQgZ2xBY3RpdmVUZXh0dXJlKAotaW50KQotCi1wdWJsaWMgdm9pZCBnbEFscGhhRnVuYygKLWludAotZmxvYXQpCi0KLXB1YmxpYyB2b2lkIGdsQWxwaGFGdW5jeCgKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBnbEJpbmRUZXh0dXJlKAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsQmxlbmRGdW5jKAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsQ2xlYXIoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsQ2xlYXJDb2xvcigKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWZsb2F0KQotCi1wdWJsaWMgdm9pZCBnbENsZWFyQ29sb3J4KAotaW50Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBnbENsZWFyRGVwdGhmKAotZmxvYXQpCi0KLXB1YmxpYyB2b2lkIGdsQ2xlYXJEZXB0aHgoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsQ2xlYXJTdGVuY2lsKAotaW50KQotCi1wdWJsaWMgdm9pZCBnbENsaWVudEFjdGl2ZVRleHR1cmUoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsQ2xpcFBsYW5lZigKLWludAotamF2YS5uaW8uRmxvYXRCdWZmZXIpCi0KLXB1YmxpYyB2b2lkIGdsQ2xpcFBsYW5lZigKLWludAotZmxvYXRbXQotaW50KQotCi1wdWJsaWMgdm9pZCBnbENsaXBQbGFuZXgoCi1pbnQKLWphdmEubmlvLkludEJ1ZmZlcikKLQotcHVibGljIHZvaWQgZ2xDbGlwUGxhbmV4KAotaW50Ci1pbnRbXQotaW50KQotCi1wdWJsaWMgdm9pZCBnbENvbG9yNGYoCi1mbG9hdAotZmxvYXQKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIHZvaWQgZ2xDb2xvcjR4KAotaW50Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBnbENvbG9yTWFzaygKLWJvb2xlYW4KLWJvb2xlYW4KLWJvb2xlYW4KLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIGdsQ29sb3JQb2ludGVyKAotaW50Ci1pbnQKLWludAotamF2YS5uaW8uQnVmZmVyKQotCi1wdWJsaWMgdm9pZCBnbENvbXByZXNzZWRUZXhJbWFnZTJEKAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1qYXZhLm5pby5CdWZmZXIpCi0KLXB1YmxpYyB2b2lkIGdsQ29tcHJlc3NlZFRleFN1YkltYWdlMkQoCi1pbnQKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludAotamF2YS5uaW8uQnVmZmVyKQotCi1wdWJsaWMgdm9pZCBnbENvcHlUZXhJbWFnZTJEKAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsQ29weVRleFN1YkltYWdlMkQoCi1pbnQKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgZ2xDdWxsRmFjZSgKLWludCkKLQotcHVibGljIHZvaWQgZ2xEZWxldGVUZXh0dXJlcygKLWludAotamF2YS5uaW8uSW50QnVmZmVyKQotCi1wdWJsaWMgdm9pZCBnbERlbGV0ZVRleHR1cmVzKAotaW50Ci1pbnRbXQotaW50KQotCi1wdWJsaWMgdm9pZCBnbERlcHRoRnVuYygKLWludCkKLQotcHVibGljIHZvaWQgZ2xEZXB0aE1hc2soCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBnbERlcHRoUmFuZ2VmKAotZmxvYXQKLWZsb2F0KQotCi1wdWJsaWMgdm9pZCBnbERlcHRoUmFuZ2V4KAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsRGlzYWJsZSgKLWludCkKLQotcHVibGljIHZvaWQgZ2xEaXNhYmxlQ2xpZW50U3RhdGUoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsRHJhd0FycmF5cygKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsRHJhd0VsZW1lbnRzKAotaW50Ci1pbnQKLWludAotamF2YS5uaW8uQnVmZmVyKQotCi1wdWJsaWMgdm9pZCBnbERyYXdUZXhmT0VTKAotZmxvYXQKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWZsb2F0KQotCi1wdWJsaWMgdm9pZCBnbERyYXdUZXhmdk9FUygKLWphdmEubmlvLkZsb2F0QnVmZmVyKQotCi1wdWJsaWMgdm9pZCBnbERyYXdUZXhmdk9FUygKLWZsb2F0W10KLWludCkKLQotcHVibGljIHZvaWQgZ2xEcmF3VGV4aU9FUygKLWludAotaW50Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBnbERyYXdUZXhpdk9FUygKLWphdmEubmlvLkludEJ1ZmZlcikKLQotcHVibGljIHZvaWQgZ2xEcmF3VGV4aXZPRVMoCi1pbnRbXQotaW50KQotCi1wdWJsaWMgdm9pZCBnbERyYXdUZXhzT0VTKAotc2hvcnQKLXNob3J0Ci1zaG9ydAotc2hvcnQKLXNob3J0KQotCi1wdWJsaWMgdm9pZCBnbERyYXdUZXhzdk9FUygKLWphdmEubmlvLlNob3J0QnVmZmVyKQotCi1wdWJsaWMgdm9pZCBnbERyYXdUZXhzdk9FUygKLXNob3J0W10KLWludCkKLQotcHVibGljIHZvaWQgZ2xEcmF3VGV4eE9FUygKLWludAotaW50Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBnbERyYXdUZXh4dk9FUygKLWphdmEubmlvLkludEJ1ZmZlcikKLQotcHVibGljIHZvaWQgZ2xEcmF3VGV4eHZPRVMoCi1pbnRbXQotaW50KQotCi1wdWJsaWMgdm9pZCBnbEVuYWJsZSgKLWludCkKLQotcHVibGljIHZvaWQgZ2xFbmFibGVDbGllbnRTdGF0ZSgKLWludCkKLQotcHVibGljIHZvaWQgZ2xGaW5pc2goKQotCi1wdWJsaWMgdm9pZCBnbEZsdXNoKCkKLQotcHVibGljIHZvaWQgZ2xGb2dmKAotaW50Ci1mbG9hdCkKLQotcHVibGljIHZvaWQgZ2xGb2dmdigKLWludAotamF2YS5uaW8uRmxvYXRCdWZmZXIpCi0KLXB1YmxpYyB2b2lkIGdsRm9nZnYoCi1pbnQKLWZsb2F0W10KLWludCkKLQotcHVibGljIHZvaWQgZ2xGb2d4KAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsRm9neHYoCi1pbnQKLWphdmEubmlvLkludEJ1ZmZlcikKLQotcHVibGljIHZvaWQgZ2xGb2d4digKLWludAotaW50W10KLWludCkKLQotcHVibGljIHZvaWQgZ2xGcm9udEZhY2UoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsRnJ1c3R1bWYoCi1mbG9hdAotZmxvYXQKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWZsb2F0KQotCi1wdWJsaWMgdm9pZCBnbEZydXN0dW14KAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgZ2xHZW5UZXh0dXJlcygKLWludAotamF2YS5uaW8uSW50QnVmZmVyKQotCi1wdWJsaWMgdm9pZCBnbEdlblRleHR1cmVzKAotaW50Ci1pbnRbXQotaW50KQotCi1wdWJsaWMgaW50IGdsR2V0RXJyb3IoKQotCi1wdWJsaWMgdm9pZCBnbEdldEludGVnZXJ2KAotaW50Ci1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyB2b2lkIGdsR2V0SW50ZWdlcnYoCi1pbnQKLWludFtdCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdsR2V0U3RyaW5nKAotaW50KQotCi1wdWJsaWMgdm9pZCBnbEhpbnQoCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgZ2xMaWdodE1vZGVsZigKLWludAotZmxvYXQpCi0KLXB1YmxpYyB2b2lkIGdsTGlnaHRNb2RlbGZ2KAotaW50Ci1qYXZhLm5pby5GbG9hdEJ1ZmZlcikKLQotcHVibGljIHZvaWQgZ2xMaWdodE1vZGVsZnYoCi1pbnQKLWZsb2F0W10KLWludCkKLQotcHVibGljIHZvaWQgZ2xMaWdodE1vZGVseCgKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBnbExpZ2h0TW9kZWx4digKLWludAotamF2YS5uaW8uSW50QnVmZmVyKQotCi1wdWJsaWMgdm9pZCBnbExpZ2h0TW9kZWx4digKLWludAotaW50W10KLWludCkKLQotcHVibGljIHZvaWQgZ2xMaWdodGYoCi1pbnQKLWludAotZmxvYXQpCi0KLXB1YmxpYyB2b2lkIGdsTGlnaHRmdigKLWludAotaW50Ci1qYXZhLm5pby5GbG9hdEJ1ZmZlcikKLQotcHVibGljIHZvaWQgZ2xMaWdodGZ2KAotaW50Ci1pbnQKLWZsb2F0W10KLWludCkKLQotcHVibGljIHZvaWQgZ2xMaWdodHgoCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBnbExpZ2h0eHYoCi1pbnQKLWludAotamF2YS5uaW8uSW50QnVmZmVyKQotCi1wdWJsaWMgdm9pZCBnbExpZ2h0eHYoCi1pbnQKLWludAotaW50W10KLWludCkKLQotcHVibGljIHZvaWQgZ2xMaW5lV2lkdGgoCi1mbG9hdCkKLQotcHVibGljIHZvaWQgZ2xMaW5lV2lkdGh4KAotaW50KQotCi1wdWJsaWMgdm9pZCBnbExvYWRJZGVudGl0eSgpCi0KLXB1YmxpYyB2b2lkIGdsTG9hZE1hdHJpeGYoCi1qYXZhLm5pby5GbG9hdEJ1ZmZlcikKLQotcHVibGljIHZvaWQgZ2xMb2FkTWF0cml4ZigKLWZsb2F0W10KLWludCkKLQotcHVibGljIHZvaWQgZ2xMb2FkTWF0cml4eCgKLWphdmEubmlvLkludEJ1ZmZlcikKLQotcHVibGljIHZvaWQgZ2xMb2FkTWF0cml4eCgKLWludFtdCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsTG9naWNPcCgKLWludCkKLQotcHVibGljIHZvaWQgZ2xNYXRlcmlhbGYoCi1pbnQKLWludAotZmxvYXQpCi0KLXB1YmxpYyB2b2lkIGdsTWF0ZXJpYWxmdigKLWludAotaW50Ci1qYXZhLm5pby5GbG9hdEJ1ZmZlcikKLQotcHVibGljIHZvaWQgZ2xNYXRlcmlhbGZ2KAotaW50Ci1pbnQKLWZsb2F0W10KLWludCkKLQotcHVibGljIHZvaWQgZ2xNYXRlcmlhbHgoCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBnbE1hdGVyaWFseHYoCi1pbnQKLWludAotamF2YS5uaW8uSW50QnVmZmVyKQotCi1wdWJsaWMgdm9pZCBnbE1hdGVyaWFseHYoCi1pbnQKLWludAotaW50W10KLWludCkKLQotcHVibGljIHZvaWQgZ2xNYXRyaXhNb2RlKAotaW50KQotCi1wdWJsaWMgdm9pZCBnbE11bHRNYXRyaXhmKAotamF2YS5uaW8uRmxvYXRCdWZmZXIpCi0KLXB1YmxpYyB2b2lkIGdsTXVsdE1hdHJpeGYoCi1mbG9hdFtdCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsTXVsdE1hdHJpeHgoCi1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyB2b2lkIGdsTXVsdE1hdHJpeHgoCi1pbnRbXQotaW50KQotCi1wdWJsaWMgdm9pZCBnbE11bHRpVGV4Q29vcmQ0ZigKLWludAotZmxvYXQKLWZsb2F0Ci1mbG9hdAotZmxvYXQpCi0KLXB1YmxpYyB2b2lkIGdsTXVsdGlUZXhDb29yZDR4KAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsTm9ybWFsM2YoCi1mbG9hdAotZmxvYXQKLWZsb2F0KQotCi1wdWJsaWMgdm9pZCBnbE5vcm1hbDN4KAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgZ2xOb3JtYWxQb2ludGVyKAotaW50Ci1pbnQKLWphdmEubmlvLkJ1ZmZlcikKLQotcHVibGljIHZvaWQgZ2xPcnRob2YoCi1mbG9hdAotZmxvYXQKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWZsb2F0KQotCi1wdWJsaWMgdm9pZCBnbE9ydGhveCgKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsUGl4ZWxTdG9yZWkoCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgZ2xQb2ludFNpemUoCi1mbG9hdCkKLQotcHVibGljIHZvaWQgZ2xQb2ludFNpemV4KAotaW50KQotCi1wdWJsaWMgdm9pZCBnbFBvbHlnb25PZmZzZXQoCi1mbG9hdAotZmxvYXQpCi0KLXB1YmxpYyB2b2lkIGdsUG9seWdvbk9mZnNldHgoCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgZ2xQb3BNYXRyaXgoKQotCi1wdWJsaWMgdm9pZCBnbFB1c2hNYXRyaXgoKQotCi1wdWJsaWMgaW50IGdsUXVlcnlNYXRyaXh4T0VTKAotamF2YS5uaW8uSW50QnVmZmVyCi1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyBpbnQgZ2xRdWVyeU1hdHJpeHhPRVMoCi1pbnRbXQotaW50Ci1pbnRbXQotaW50KQotCi1wdWJsaWMgdm9pZCBnbFJlYWRQaXhlbHMoCi1pbnQKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1qYXZhLm5pby5CdWZmZXIpCi0KLXB1YmxpYyB2b2lkIGdsUm90YXRlZigKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWZsb2F0KQotCi1wdWJsaWMgdm9pZCBnbFJvdGF0ZXgoCi1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsU2FtcGxlQ292ZXJhZ2UoCi1mbG9hdAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgZ2xTYW1wbGVDb3ZlcmFnZXgoCi1pbnQKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIGdsU2NhbGVmKAotZmxvYXQKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIHZvaWQgZ2xTY2FsZXgoCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBnbFNjaXNzb3IoCi1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsU2hhZGVNb2RlbCgKLWludCkKLQotcHVibGljIHZvaWQgZ2xTdGVuY2lsRnVuYygKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsU3RlbmNpbE1hc2soCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsU3RlbmNpbE9wKAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgZ2xUZXhDb29yZFBvaW50ZXIoCi1pbnQKLWludAotaW50Ci1qYXZhLm5pby5CdWZmZXIpCi0KLXB1YmxpYyB2b2lkIGdsVGV4RW52ZigKLWludAotaW50Ci1mbG9hdCkKLQotcHVibGljIHZvaWQgZ2xUZXhFbnZmdigKLWludAotaW50Ci1qYXZhLm5pby5GbG9hdEJ1ZmZlcikKLQotcHVibGljIHZvaWQgZ2xUZXhFbnZmdigKLWludAotaW50Ci1mbG9hdFtdCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsVGV4RW52eCgKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsVGV4RW52eHYoCi1pbnQKLWludAotamF2YS5uaW8uSW50QnVmZmVyKQotCi1wdWJsaWMgdm9pZCBnbFRleEVudnh2KAotaW50Ci1pbnQKLWludFtdCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsVGV4SW1hZ2UyRCgKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1qYXZhLm5pby5CdWZmZXIpCi0KLXB1YmxpYyB2b2lkIGdsVGV4UGFyYW1ldGVyZigKLWludAotaW50Ci1mbG9hdCkKLQotcHVibGljIHZvaWQgZ2xUZXhQYXJhbWV0ZXJpdigKLWludAotaW50Ci1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyB2b2lkIGdsVGV4UGFyYW1ldGVyaXYoCi1pbnQKLWludAotaW50W10KLWludCkKLQotcHVibGljIHZvaWQgZ2xUZXhQYXJhbWV0ZXJ4KAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgZ2xUZXhTdWJJbWFnZTJEKAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWphdmEubmlvLkJ1ZmZlcikKLQotcHVibGljIHZvaWQgZ2xUcmFuc2xhdGVmKAotZmxvYXQKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIHZvaWQgZ2xUcmFuc2xhdGV4KAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgZ2xWZXJ0ZXhQb2ludGVyKAotaW50Ci1pbnQKLWludAotamF2YS5uaW8uQnVmZmVyKQotCi1wdWJsaWMgdm9pZCBnbFZpZXdwb3J0KAotaW50Ci1pbnQKLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQub3BlbmdsLkdMRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBpbnQgbUVycm9yCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RXJyb3JTdHJpbmcoCi1pbnQpCi0KLSBpbnQgZ2V0RXJyb3IoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MiBuYW1lID1Qb2ludGVySW5mbyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9vcGVuZ2wvR0xMb2dXcmFwcGVyOyApCi0gY2xhc3MgYW5kcm9pZC5vcGVuZ2wuR0xMb2dXcmFwcGVyJFBvaW50ZXJJbmZvIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgamF2YS5uaW8uQnVmZmVyIG1Qb2ludGVyCi0KLXB1YmxpYyBpbnQgbVNpemUKLQotcHVibGljIGludCBtU3RyaWRlCi0KLXB1YmxpYyBqYXZhLm5pby5CeXRlQnVmZmVyIG1UZW1wQnl0ZUJ1ZmZlcgotCi1wdWJsaWMgaW50IG1UeXBlCi0KLWZpbmFsIGFuZHJvaWQub3BlbmdsLkdMTG9nV3JhcHBlciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9wZW5nbC5HTExvZ1dyYXBwZXIKLWludAotaW50Ci1pbnQKLWphdmEubmlvLkJ1ZmZlcikKLQotcHVibGljIHZvaWQgYmluZEJ5dGVCdWZmZXIoKQotCi1wdWJsaWMgaW50IGdldFN0cmlkZSgpCi0KLXB1YmxpYyBpbnQgc2l6ZW9mKAotaW50KQotCi1wdWJsaWMgdm9pZCB1bmJpbmRCeXRlQnVmZmVyKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL29wZW5nbC9HTExvZ1dyYXBwZXIkUG9pbnRlckluZm87ICkKLSBjbGFzcyBhbmRyb2lkLm9wZW5nbC5HTExvZ1dyYXBwZXIgZXh0ZW5kcyBhbmRyb2lkLm9wZW5nbC5HTFdyYXBwZXJCYXNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfRklYRUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9GTE9BVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0lOVAotCi1wcml2YXRlIGludCBtQXJnQ291bnQKLQotIGJvb2xlYW4gbUNvbG9yQXJyYXlFbmFibGVkCi0KLXByaXZhdGUgYW5kcm9pZC5vcGVuZ2wuR0xMb2dXcmFwcGVyJFBvaW50ZXJJbmZvIG1Db2xvclBvaW50ZXIKLQotcHJpdmF0ZSBqYXZhLmlvLldyaXRlciBtTG9nCi0KLXByaXZhdGUgYm9vbGVhbiBtTG9nQXJndW1lbnROYW1lcwotCi0gYm9vbGVhbiBtTm9ybWFsQXJyYXlFbmFibGVkCi0KLXByaXZhdGUgYW5kcm9pZC5vcGVuZ2wuR0xMb2dXcmFwcGVyJFBvaW50ZXJJbmZvIG1Ob3JtYWxQb2ludGVyCi0KLSBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlciBtU3RyaW5nQnVpbGRlcgotCi1wcml2YXRlIGFuZHJvaWQub3BlbmdsLkdMTG9nV3JhcHBlciRQb2ludGVySW5mbyBtVGV4Q29vcmRQb2ludGVyCi0KLSBib29sZWFuIG1UZXh0dXJlQ29vcmRBcnJheUVuYWJsZWQKLQotIGJvb2xlYW4gbVZlcnRleEFycmF5RW5hYmxlZAotCi1wcml2YXRlIGFuZHJvaWQub3BlbmdsLkdMTG9nV3JhcHBlciRQb2ludGVySW5mbyBtVmVydGV4UG9pbnRlcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMCi1qYXZhLmlvLldyaXRlcgotYm9vbGVhbikKLQotc3RhdGljIGphdmEubmlvLkJ5dGVCdWZmZXIgYWNjZXNzJDAwMCgKLWFuZHJvaWQub3BlbmdsLkdMTG9nV3JhcHBlcgotaW50Ci1qYXZhLm5pby5CdWZmZXIpCi0KLXByaXZhdGUgdm9pZCBhcmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1mbG9hdCkKLQotcHJpdmF0ZSB2b2lkIGFyZygKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHJpdmF0ZSB2b2lkIGFyZygKLWphdmEubGFuZy5TdHJpbmcKLWludAotamF2YS5uaW8uRmxvYXRCdWZmZXIpCi0KLXByaXZhdGUgdm9pZCBhcmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWphdmEubmlvLkludEJ1ZmZlcikKLQotcHJpdmF0ZSB2b2lkIGFyZygKLWphdmEubGFuZy5TdHJpbmcKLWludAotamF2YS5uaW8uU2hvcnRCdWZmZXIpCi0KLXByaXZhdGUgdm9pZCBhcmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWZsb2F0W10KLWludCkKLQotcHJpdmF0ZSB2b2lkIGFyZygKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50W10KLWludCkKLQotcHJpdmF0ZSB2b2lkIGFyZygKLWphdmEubGFuZy5TdHJpbmcKLWludAotc2hvcnRbXQotaW50KQotCi1wcml2YXRlIHZvaWQgYXJnKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSB2b2lkIGFyZygKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4pCi0KLXByaXZhdGUgdm9pZCBhcmdQb2ludGVyKAotaW50Ci1pbnQKLWludAotamF2YS5uaW8uQnVmZmVyKQotCi1wcml2YXRlIHZvaWQgYmVnaW4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHZvaWQgYmluZEFycmF5cygpCi0KLXByaXZhdGUgdm9pZCBjaGVja0Vycm9yKCkKLQotcHJpdmF0ZSB2b2lkIGRvQXJyYXlFbGVtZW50KAotamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIKLWJvb2xlYW4KLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3BlbmdsLkdMTG9nV3JhcHBlciRQb2ludGVySW5mbwotaW50KQotCi1wcml2YXRlIHZvaWQgZG9FbGVtZW50KAotamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIKLWludAotaW50KQotCi1wcml2YXRlIHZvaWQgZW5kKCkKLQotcHJpdmF0ZSB2b2lkIGVuZExvZ0luZGljZXMoKQotCi1wcml2YXRlIHZvaWQgZmx1c2goKQotCi1wcml2YXRlIHZvaWQgZm9ybWF0dGVkQXBwZW5kKAotamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIKLWludAotaW50KQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZ2V0QmVnaW5Nb2RlKAotaW50KQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZ2V0Q2FwKAotaW50KQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZ2V0Q2xlYXJCdWZmZXJNYXNrKAotaW50KQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZ2V0Q2xpZW50U3RhdGUoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRFcnJvclN0cmluZygKLWludCkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGdldEZhY2VOYW1lKAotaW50KQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZ2V0RmFjdG9yKAotaW50KQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZ2V0Rm9nUE5hbWUoCi1pbnQpCi0KLXByaXZhdGUgaW50IGdldEZvZ1BhcmFtQ291bnQoCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SGV4KAotaW50KQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZ2V0SGludE1vZGUoCi1pbnQpCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBnZXRIaW50VGFyZ2V0KAotaW50KQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZ2V0SW5kZXhUeXBlKAotaW50KQotCi1wcml2YXRlIGludCBnZXRJbnRlZ2VyU3RhdGVGb3JtYXQoCi1pbnQpCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBnZXRJbnRlZ2VyU3RhdGVOYW1lKAotaW50KQotCi1wcml2YXRlIGludCBnZXRJbnRlZ2VyU3RhdGVTaXplKAotaW50KQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZ2V0TGlnaHRNb2RlbFBOYW1lKAotaW50KQotCi1wcml2YXRlIGludCBnZXRMaWdodE1vZGVsUGFyYW1Db3VudCgKLWludCkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGdldExpZ2h0TmFtZSgKLWludCkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGdldExpZ2h0UE5hbWUoCi1pbnQpCi0KLXByaXZhdGUgaW50IGdldExpZ2h0UGFyYW1Db3VudCgKLWludCkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGdldE1hdGVyaWFsUE5hbWUoCi1pbnQpCi0KLXByaXZhdGUgaW50IGdldE1hdGVyaWFsUGFyYW1Db3VudCgKLWludCkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGdldE1hdHJpeE1vZGUoCi1pbnQpCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBnZXRQb2ludGVyVHlwZU5hbWUoCi1pbnQpCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBnZXRTaGFkZU1vZGVsKAotaW50KQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZ2V0VGV4dHVyZUVudlBOYW1lKAotaW50KQotCi1wcml2YXRlIGludCBnZXRUZXh0dXJlRW52UGFyYW1Db3VudCgKLWludCkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGdldFRleHR1cmVFbnZQYXJhbU5hbWUoCi1mbG9hdCkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGdldFRleHR1cmVFbnZUYXJnZXQoCi1pbnQpCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBnZXRUZXh0dXJlUE5hbWUoCi1pbnQpCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBnZXRUZXh0dXJlUGFyYW1OYW1lKAotZmxvYXQpCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBnZXRUZXh0dXJlVGFyZ2V0KAotaW50KQotCi1wcml2YXRlIHZvaWQgbG9nKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSB2b2lkIGxvZ0xpbmUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHZvaWQgcmV0dXJucygKLWludCkKLQotcHJpdmF0ZSB2b2lkIHJldHVybnMoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHZvaWQgc3RhcnRMb2dJbmRpY2VzKCkKLQotcHJpdmF0ZSBqYXZhLm5pby5CeXRlQnVmZmVyIHRvQnl0ZUJ1ZmZlcigKLWludAotamF2YS5uaW8uQnVmZmVyKQotCi1wcml2YXRlIGNoYXJbXSB0b0NoYXJJbmRpY2VzKAotaW50Ci1pbnQKLWphdmEubmlvLkJ1ZmZlcikKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKAotaW50Ci1pbnQKLWphdmEubmlvLkludEJ1ZmZlcikKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKAotaW50Ci1pbnQKLWludFtdCi1pbnQpCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygKLWludAotamF2YS5uaW8uRmxvYXRCdWZmZXIpCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygKLWludAotamF2YS5uaW8uU2hvcnRCdWZmZXIpCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygKLWludAotZmxvYXRbXQotaW50KQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoCi1pbnQKLXNob3J0W10KLWludCkKLQotcHJpdmF0ZSB2b2lkIHVuYmluZEFycmF5cygpCi0KLXB1YmxpYyB2b2lkIGdsQWN0aXZlVGV4dHVyZSgKLWludCkKLQotcHVibGljIHZvaWQgZ2xBbHBoYUZ1bmMoCi1pbnQKLWZsb2F0KQotCi1wdWJsaWMgdm9pZCBnbEFscGhhRnVuY3goCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgZ2xCaW5kQnVmZmVyKAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsQmluZFRleHR1cmUoCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgZ2xCbGVuZEZ1bmMoCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgZ2xCdWZmZXJEYXRhKAotaW50Ci1pbnQKLWphdmEubmlvLkJ1ZmZlcgotaW50KQotCi1wdWJsaWMgdm9pZCBnbEJ1ZmZlclN1YkRhdGEoCi1pbnQKLWludAotaW50Ci1qYXZhLm5pby5CdWZmZXIpCi0KLXB1YmxpYyB2b2lkIGdsQ2xlYXIoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsQ2xlYXJDb2xvcigKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWZsb2F0KQotCi1wdWJsaWMgdm9pZCBnbENsZWFyQ29sb3J4KAotaW50Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBnbENsZWFyRGVwdGhmKAotZmxvYXQpCi0KLXB1YmxpYyB2b2lkIGdsQ2xlYXJEZXB0aHgoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsQ2xlYXJTdGVuY2lsKAotaW50KQotCi1wdWJsaWMgdm9pZCBnbENsaWVudEFjdGl2ZVRleHR1cmUoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsQ2xpcFBsYW5lZigKLWludAotamF2YS5uaW8uRmxvYXRCdWZmZXIpCi0KLXB1YmxpYyB2b2lkIGdsQ2xpcFBsYW5lZigKLWludAotZmxvYXRbXQotaW50KQotCi1wdWJsaWMgdm9pZCBnbENsaXBQbGFuZXgoCi1pbnQKLWphdmEubmlvLkludEJ1ZmZlcikKLQotcHVibGljIHZvaWQgZ2xDbGlwUGxhbmV4KAotaW50Ci1pbnRbXQotaW50KQotCi1wdWJsaWMgdm9pZCBnbENvbG9yNGYoCi1mbG9hdAotZmxvYXQKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIHZvaWQgZ2xDb2xvcjR1YigKLWJ5dGUKLWJ5dGUKLWJ5dGUKLWJ5dGUpCi0KLXB1YmxpYyB2b2lkIGdsQ29sb3I0eCgKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgZ2xDb2xvck1hc2soCi1ib29sZWFuCi1ib29sZWFuCi1ib29sZWFuCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBnbENvbG9yUG9pbnRlcigKLWludAotaW50Ci1pbnQKLWphdmEubmlvLkJ1ZmZlcikKLQotcHVibGljIHZvaWQgZ2xDb21wcmVzc2VkVGV4SW1hZ2UyRCgKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludAotamF2YS5uaW8uQnVmZmVyKQotCi1wdWJsaWMgdm9pZCBnbENvbXByZXNzZWRUZXhTdWJJbWFnZTJEKAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWphdmEubmlvLkJ1ZmZlcikKLQotcHVibGljIHZvaWQgZ2xDb3B5VGV4SW1hZ2UyRCgKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBnbENvcHlUZXhTdWJJbWFnZTJEKAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsQ3VsbEZhY2UoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsRGVsZXRlQnVmZmVycygKLWludAotamF2YS5uaW8uSW50QnVmZmVyKQotCi1wdWJsaWMgdm9pZCBnbERlbGV0ZUJ1ZmZlcnMoCi1pbnQKLWludFtdCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsRGVsZXRlVGV4dHVyZXMoCi1pbnQKLWphdmEubmlvLkludEJ1ZmZlcikKLQotcHVibGljIHZvaWQgZ2xEZWxldGVUZXh0dXJlcygKLWludAotaW50W10KLWludCkKLQotcHVibGljIHZvaWQgZ2xEZXB0aEZ1bmMoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsRGVwdGhNYXNrKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgZ2xEZXB0aFJhbmdlZigKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIHZvaWQgZ2xEZXB0aFJhbmdleCgKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBnbERpc2FibGUoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsRGlzYWJsZUNsaWVudFN0YXRlKAotaW50KQotCi1wdWJsaWMgdm9pZCBnbERyYXdBcnJheXMoCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBnbERyYXdFbGVtZW50cygKLWludAotaW50Ci1pbnQKLWphdmEubmlvLkJ1ZmZlcikKLQotcHVibGljIHZvaWQgZ2xEcmF3VGV4Zk9FUygKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIHZvaWQgZ2xEcmF3VGV4ZnZPRVMoCi1qYXZhLm5pby5GbG9hdEJ1ZmZlcikKLQotcHVibGljIHZvaWQgZ2xEcmF3VGV4ZnZPRVMoCi1mbG9hdFtdCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsRHJhd1RleGlPRVMoCi1pbnQKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgZ2xEcmF3VGV4aXZPRVMoCi1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyB2b2lkIGdsRHJhd1RleGl2T0VTKAotaW50W10KLWludCkKLQotcHVibGljIHZvaWQgZ2xEcmF3VGV4c09FUygKLXNob3J0Ci1zaG9ydAotc2hvcnQKLXNob3J0Ci1zaG9ydCkKLQotcHVibGljIHZvaWQgZ2xEcmF3VGV4c3ZPRVMoCi1qYXZhLm5pby5TaG9ydEJ1ZmZlcikKLQotcHVibGljIHZvaWQgZ2xEcmF3VGV4c3ZPRVMoCi1zaG9ydFtdCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsRHJhd1RleHhPRVMoCi1pbnQKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgZ2xEcmF3VGV4eHZPRVMoCi1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyB2b2lkIGdsRHJhd1RleHh2T0VTKAotaW50W10KLWludCkKLQotcHVibGljIHZvaWQgZ2xFbmFibGUoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsRW5hYmxlQ2xpZW50U3RhdGUoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsRmluaXNoKCkKLQotcHVibGljIHZvaWQgZ2xGbHVzaCgpCi0KLXB1YmxpYyB2b2lkIGdsRm9nZigKLWludAotZmxvYXQpCi0KLXB1YmxpYyB2b2lkIGdsRm9nZnYoCi1pbnQKLWphdmEubmlvLkZsb2F0QnVmZmVyKQotCi1wdWJsaWMgdm9pZCBnbEZvZ2Z2KAotaW50Ci1mbG9hdFtdCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsRm9neCgKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBnbEZvZ3h2KAotaW50Ci1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyB2b2lkIGdsRm9neHYoCi1pbnQKLWludFtdCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsRnJvbnRGYWNlKAotaW50KQotCi1wdWJsaWMgdm9pZCBnbEZydXN0dW1mKAotZmxvYXQKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIHZvaWQgZ2xGcnVzdHVteCgKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsR2VuQnVmZmVycygKLWludAotamF2YS5uaW8uSW50QnVmZmVyKQotCi1wdWJsaWMgdm9pZCBnbEdlbkJ1ZmZlcnMoCi1pbnQKLWludFtdCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsR2VuVGV4dHVyZXMoCi1pbnQKLWphdmEubmlvLkludEJ1ZmZlcikKLQotcHVibGljIHZvaWQgZ2xHZW5UZXh0dXJlcygKLWludAotaW50W10KLWludCkKLQotcHVibGljIHZvaWQgZ2xHZXRCb29sZWFudigKLWludAotamF2YS5uaW8uSW50QnVmZmVyKQotCi1wdWJsaWMgdm9pZCBnbEdldEJvb2xlYW52KAotaW50Ci1ib29sZWFuW10KLWludCkKLQotcHVibGljIHZvaWQgZ2xHZXRCdWZmZXJQYXJhbWV0ZXJpdigKLWludAotaW50Ci1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyB2b2lkIGdsR2V0QnVmZmVyUGFyYW1ldGVyaXYoCi1pbnQKLWludAotaW50W10KLWludCkKLQotcHVibGljIHZvaWQgZ2xHZXRDbGlwUGxhbmVmKAotaW50Ci1qYXZhLm5pby5GbG9hdEJ1ZmZlcikKLQotcHVibGljIHZvaWQgZ2xHZXRDbGlwUGxhbmVmKAotaW50Ci1mbG9hdFtdCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsR2V0Q2xpcFBsYW5leCgKLWludAotamF2YS5uaW8uSW50QnVmZmVyKQotCi1wdWJsaWMgdm9pZCBnbEdldENsaXBQbGFuZXgoCi1pbnQKLWludFtdCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2xHZXRFcnJvcigpCi0KLXB1YmxpYyB2b2lkIGdsR2V0Rml4ZWR2KAotaW50Ci1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyB2b2lkIGdsR2V0Rml4ZWR2KAotaW50Ci1pbnRbXQotaW50KQotCi1wdWJsaWMgdm9pZCBnbEdldEZsb2F0digKLWludAotamF2YS5uaW8uRmxvYXRCdWZmZXIpCi0KLXB1YmxpYyB2b2lkIGdsR2V0RmxvYXR2KAotaW50Ci1mbG9hdFtdCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsR2V0SW50ZWdlcnYoCi1pbnQKLWphdmEubmlvLkludEJ1ZmZlcikKLQotcHVibGljIHZvaWQgZ2xHZXRJbnRlZ2VydigKLWludAotaW50W10KLWludCkKLQotcHVibGljIHZvaWQgZ2xHZXRMaWdodGZ2KAotaW50Ci1pbnQKLWphdmEubmlvLkZsb2F0QnVmZmVyKQotCi1wdWJsaWMgdm9pZCBnbEdldExpZ2h0ZnYoCi1pbnQKLWludAotZmxvYXRbXQotaW50KQotCi1wdWJsaWMgdm9pZCBnbEdldExpZ2h0eHYoCi1pbnQKLWludAotamF2YS5uaW8uSW50QnVmZmVyKQotCi1wdWJsaWMgdm9pZCBnbEdldExpZ2h0eHYoCi1pbnQKLWludAotaW50W10KLWludCkKLQotcHVibGljIHZvaWQgZ2xHZXRNYXRlcmlhbGZ2KAotaW50Ci1pbnQKLWphdmEubmlvLkZsb2F0QnVmZmVyKQotCi1wdWJsaWMgdm9pZCBnbEdldE1hdGVyaWFsZnYoCi1pbnQKLWludAotZmxvYXRbXQotaW50KQotCi1wdWJsaWMgdm9pZCBnbEdldE1hdGVyaWFseHYoCi1pbnQKLWludAotamF2YS5uaW8uSW50QnVmZmVyKQotCi1wdWJsaWMgdm9pZCBnbEdldE1hdGVyaWFseHYoCi1pbnQKLWludAotaW50W10KLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2xHZXRTdHJpbmcoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsR2V0VGV4RW52aXYoCi1pbnQKLWludAotamF2YS5uaW8uSW50QnVmZmVyKQotCi1wdWJsaWMgdm9pZCBnbEdldFRleEVudml2KAotaW50Ci1pbnQKLWludFtdCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsR2V0VGV4RW52eHYoCi1pbnQKLWludAotamF2YS5uaW8uSW50QnVmZmVyKQotCi1wdWJsaWMgdm9pZCBnbEdldFRleEVudnh2KAotaW50Ci1pbnQKLWludFtdCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsR2V0VGV4UGFyYW1ldGVyZnYoCi1pbnQKLWludAotamF2YS5uaW8uRmxvYXRCdWZmZXIpCi0KLXB1YmxpYyB2b2lkIGdsR2V0VGV4UGFyYW1ldGVyZnYoCi1pbnQKLWludAotZmxvYXRbXQotaW50KQotCi1wdWJsaWMgdm9pZCBnbEdldFRleFBhcmFtZXRlcml2KAotaW50Ci1pbnQKLWphdmEubmlvLkludEJ1ZmZlcikKLQotcHVibGljIHZvaWQgZ2xHZXRUZXhQYXJhbWV0ZXJpdigKLWludAotaW50Ci1pbnRbXQotaW50KQotCi1wdWJsaWMgdm9pZCBnbEdldFRleFBhcmFtZXRlcnh2KAotaW50Ci1pbnQKLWphdmEubmlvLkludEJ1ZmZlcikKLQotcHVibGljIHZvaWQgZ2xHZXRUZXhQYXJhbWV0ZXJ4digKLWludAotaW50Ci1pbnRbXQotaW50KQotCi1wdWJsaWMgdm9pZCBnbEhpbnQoCi1pbnQKLWludCkKLQotcHVibGljIGJvb2xlYW4gZ2xJc0J1ZmZlcigKLWludCkKLQotcHVibGljIGJvb2xlYW4gZ2xJc0VuYWJsZWQoCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIGdsSXNUZXh0dXJlKAotaW50KQotCi1wdWJsaWMgdm9pZCBnbExpZ2h0TW9kZWxmKAotaW50Ci1mbG9hdCkKLQotcHVibGljIHZvaWQgZ2xMaWdodE1vZGVsZnYoCi1pbnQKLWphdmEubmlvLkZsb2F0QnVmZmVyKQotCi1wdWJsaWMgdm9pZCBnbExpZ2h0TW9kZWxmdigKLWludAotZmxvYXRbXQotaW50KQotCi1wdWJsaWMgdm9pZCBnbExpZ2h0TW9kZWx4KAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsTGlnaHRNb2RlbHh2KAotaW50Ci1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyB2b2lkIGdsTGlnaHRNb2RlbHh2KAotaW50Ci1pbnRbXQotaW50KQotCi1wdWJsaWMgdm9pZCBnbExpZ2h0ZigKLWludAotaW50Ci1mbG9hdCkKLQotcHVibGljIHZvaWQgZ2xMaWdodGZ2KAotaW50Ci1pbnQKLWphdmEubmlvLkZsb2F0QnVmZmVyKQotCi1wdWJsaWMgdm9pZCBnbExpZ2h0ZnYoCi1pbnQKLWludAotZmxvYXRbXQotaW50KQotCi1wdWJsaWMgdm9pZCBnbExpZ2h0eCgKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsTGlnaHR4digKLWludAotaW50Ci1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyB2b2lkIGdsTGlnaHR4digKLWludAotaW50Ci1pbnRbXQotaW50KQotCi1wdWJsaWMgdm9pZCBnbExpbmVXaWR0aCgKLWZsb2F0KQotCi1wdWJsaWMgdm9pZCBnbExpbmVXaWR0aHgoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsTG9hZElkZW50aXR5KCkKLQotcHVibGljIHZvaWQgZ2xMb2FkTWF0cml4ZigKLWphdmEubmlvLkZsb2F0QnVmZmVyKQotCi1wdWJsaWMgdm9pZCBnbExvYWRNYXRyaXhmKAotZmxvYXRbXQotaW50KQotCi1wdWJsaWMgdm9pZCBnbExvYWRNYXRyaXh4KAotamF2YS5uaW8uSW50QnVmZmVyKQotCi1wdWJsaWMgdm9pZCBnbExvYWRNYXRyaXh4KAotaW50W10KLWludCkKLQotcHVibGljIHZvaWQgZ2xMb2dpY09wKAotaW50KQotCi1wdWJsaWMgdm9pZCBnbE1hdGVyaWFsZigKLWludAotaW50Ci1mbG9hdCkKLQotcHVibGljIHZvaWQgZ2xNYXRlcmlhbGZ2KAotaW50Ci1pbnQKLWphdmEubmlvLkZsb2F0QnVmZmVyKQotCi1wdWJsaWMgdm9pZCBnbE1hdGVyaWFsZnYoCi1pbnQKLWludAotZmxvYXRbXQotaW50KQotCi1wdWJsaWMgdm9pZCBnbE1hdGVyaWFseCgKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsTWF0ZXJpYWx4digKLWludAotaW50Ci1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyB2b2lkIGdsTWF0ZXJpYWx4digKLWludAotaW50Ci1pbnRbXQotaW50KQotCi1wdWJsaWMgdm9pZCBnbE1hdHJpeE1vZGUoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsTXVsdE1hdHJpeGYoCi1qYXZhLm5pby5GbG9hdEJ1ZmZlcikKLQotcHVibGljIHZvaWQgZ2xNdWx0TWF0cml4ZigKLWZsb2F0W10KLWludCkKLQotcHVibGljIHZvaWQgZ2xNdWx0TWF0cml4eCgKLWphdmEubmlvLkludEJ1ZmZlcikKLQotcHVibGljIHZvaWQgZ2xNdWx0TWF0cml4eCgKLWludFtdCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsTXVsdGlUZXhDb29yZDRmKAotaW50Ci1mbG9hdAotZmxvYXQKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIHZvaWQgZ2xNdWx0aVRleENvb3JkNHgoCi1pbnQKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgZ2xOb3JtYWwzZigKLWZsb2F0Ci1mbG9hdAotZmxvYXQpCi0KLXB1YmxpYyB2b2lkIGdsTm9ybWFsM3goCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBnbE5vcm1hbFBvaW50ZXIoCi1pbnQKLWludAotamF2YS5uaW8uQnVmZmVyKQotCi1wdWJsaWMgdm9pZCBnbE9ydGhvZigKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWZsb2F0Ci1mbG9hdAotZmxvYXQpCi0KLXB1YmxpYyB2b2lkIGdsT3J0aG94KAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgZ2xQaXhlbFN0b3JlaSgKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBnbFBvaW50UGFyYW1ldGVyZigKLWludAotZmxvYXQpCi0KLXB1YmxpYyB2b2lkIGdsUG9pbnRQYXJhbWV0ZXJmdigKLWludAotamF2YS5uaW8uRmxvYXRCdWZmZXIpCi0KLXB1YmxpYyB2b2lkIGdsUG9pbnRQYXJhbWV0ZXJmdigKLWludAotZmxvYXRbXQotaW50KQotCi1wdWJsaWMgdm9pZCBnbFBvaW50UGFyYW1ldGVyeCgKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBnbFBvaW50UGFyYW1ldGVyeHYoCi1pbnQKLWphdmEubmlvLkludEJ1ZmZlcikKLQotcHVibGljIHZvaWQgZ2xQb2ludFBhcmFtZXRlcnh2KAotaW50Ci1pbnRbXQotaW50KQotCi1wdWJsaWMgdm9pZCBnbFBvaW50U2l6ZSgKLWZsb2F0KQotCi1wdWJsaWMgdm9pZCBnbFBvaW50U2l6ZVBvaW50ZXJPRVMoCi1pbnQKLWludAotamF2YS5uaW8uQnVmZmVyKQotCi1wdWJsaWMgdm9pZCBnbFBvaW50U2l6ZXgoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsUG9seWdvbk9mZnNldCgKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIHZvaWQgZ2xQb2x5Z29uT2Zmc2V0eCgKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBnbFBvcE1hdHJpeCgpCi0KLXB1YmxpYyB2b2lkIGdsUHVzaE1hdHJpeCgpCi0KLXB1YmxpYyBpbnQgZ2xRdWVyeU1hdHJpeHhPRVMoCi1qYXZhLm5pby5JbnRCdWZmZXIKLWphdmEubmlvLkludEJ1ZmZlcikKLQotcHVibGljIGludCBnbFF1ZXJ5TWF0cml4eE9FUygKLWludFtdCi1pbnQKLWludFtdCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsUmVhZFBpeGVscygKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWphdmEubmlvLkJ1ZmZlcikKLQotcHVibGljIHZvaWQgZ2xSb3RhdGVmKAotZmxvYXQKLWZsb2F0Ci1mbG9hdAotZmxvYXQpCi0KLXB1YmxpYyB2b2lkIGdsUm90YXRleCgKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgZ2xTYW1wbGVDb3ZlcmFnZSgKLWZsb2F0Ci1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBnbFNhbXBsZUNvdmVyYWdleCgKLWludAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgZ2xTY2FsZWYoCi1mbG9hdAotZmxvYXQKLWZsb2F0KQotCi1wdWJsaWMgdm9pZCBnbFNjYWxleCgKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsU2Npc3NvcigKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgZ2xTaGFkZU1vZGVsKAotaW50KQotCi1wdWJsaWMgdm9pZCBnbFN0ZW5jaWxGdW5jKAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgZ2xTdGVuY2lsTWFzaygKLWludCkKLQotcHVibGljIHZvaWQgZ2xTdGVuY2lsT3AoCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBnbFRleENvb3JkUG9pbnRlcigKLWludAotaW50Ci1pbnQKLWphdmEubmlvLkJ1ZmZlcikKLQotcHVibGljIHZvaWQgZ2xUZXhFbnZmKAotaW50Ci1pbnQKLWZsb2F0KQotCi1wdWJsaWMgdm9pZCBnbFRleEVudmZ2KAotaW50Ci1pbnQKLWphdmEubmlvLkZsb2F0QnVmZmVyKQotCi1wdWJsaWMgdm9pZCBnbFRleEVudmZ2KAotaW50Ci1pbnQKLWZsb2F0W10KLWludCkKLQotcHVibGljIHZvaWQgZ2xUZXhFbnZpKAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgZ2xUZXhFbnZpdigKLWludAotaW50Ci1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyB2b2lkIGdsVGV4RW52aXYoCi1pbnQKLWludAotaW50W10KLWludCkKLQotcHVibGljIHZvaWQgZ2xUZXhFbnZ4KAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgZ2xUZXhFbnZ4digKLWludAotaW50Ci1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyB2b2lkIGdsVGV4RW52eHYoCi1pbnQKLWludAotaW50W10KLWludCkKLQotcHVibGljIHZvaWQgZ2xUZXhJbWFnZTJEKAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWphdmEubmlvLkJ1ZmZlcikKLQotcHVibGljIHZvaWQgZ2xUZXhQYXJhbWV0ZXJmKAotaW50Ci1pbnQKLWZsb2F0KQotCi1wdWJsaWMgdm9pZCBnbFRleFBhcmFtZXRlcmZ2KAotaW50Ci1pbnQKLWphdmEubmlvLkZsb2F0QnVmZmVyKQotCi1wdWJsaWMgdm9pZCBnbFRleFBhcmFtZXRlcmZ2KAotaW50Ci1pbnQKLWZsb2F0W10KLWludCkKLQotcHVibGljIHZvaWQgZ2xUZXhQYXJhbWV0ZXJpKAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgZ2xUZXhQYXJhbWV0ZXJpdigKLWludAotaW50Ci1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyB2b2lkIGdsVGV4UGFyYW1ldGVyaXYoCi1pbnQKLWludAotaW50W10KLWludCkKLQotcHVibGljIHZvaWQgZ2xUZXhQYXJhbWV0ZXJ4KAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgZ2xUZXhQYXJhbWV0ZXJ4digKLWludAotaW50Ci1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyB2b2lkIGdsVGV4UGFyYW1ldGVyeHYoCi1pbnQKLWludAotaW50W10KLWludCkKLQotcHVibGljIHZvaWQgZ2xUZXhTdWJJbWFnZTJEKAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWphdmEubmlvLkJ1ZmZlcikKLQotcHVibGljIHZvaWQgZ2xUcmFuc2xhdGVmKAotZmxvYXQKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIHZvaWQgZ2xUcmFuc2xhdGV4KAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgZ2xWZXJ0ZXhQb2ludGVyKAotaW50Ci1pbnQKLWludAotamF2YS5uaW8uQnVmZmVyKQotCi1wdWJsaWMgdm9pZCBnbFZpZXdwb3J0KAotaW50Ci1pbnQKLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQub3BlbmdsLkdMVSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2x1RXJyb3JTdHJpbmcoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBnbHVMb29rQXQoCi1qYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDEwCi1mbG9hdAotZmxvYXQKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWZsb2F0KQotCi1wdWJsaWMgc3RhdGljIHZvaWQgZ2x1T3J0aG8yRCgKLWphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTAKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWZsb2F0KQotCi1wdWJsaWMgc3RhdGljIHZvaWQgZ2x1UGVyc3BlY3RpdmUoCi1qYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDEwCi1mbG9hdAotZmxvYXQKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIHN0YXRpYyBpbnQgZ2x1UHJvamVjdCgKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWZsb2F0W10KLWludAotZmxvYXRbXQotaW50Ci1pbnRbXQotaW50Ci1mbG9hdFtdCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgaW50IGdsdVVuUHJvamVjdCgKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWZsb2F0W10KLWludAotZmxvYXRbXQotaW50Ci1pbnRbXQotaW50Ci1mbG9hdFtdCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvb3BlbmdsL0dMVXRpbHM7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9NDEwNCBuYW1lID1udWxsICkKLSBjbGFzcyBhbmRyb2lkLm9wZW5nbC5HTFV0aWxzJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBmaW5hbCBpbnRbXSAkU3dpdGNoTWFwJGFuZHJvaWQkZ3JhcGhpY3MkQml0bWFwJENvbmZpZwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL29wZW5nbC9HTFV0aWxzJDE7ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLm9wZW5nbC5HTFV0aWxzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgaW50IGdldEludGVybmFsRm9ybWF0KAotYW5kcm9pZC5ncmFwaGljcy5CaXRtYXApCi0KLXB1YmxpYyBzdGF0aWMgaW50IGdldFR5cGUoCi1hbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlQ2xhc3NJbml0KCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVfdGV4SW1hZ2UyRCgKLWludAotaW50Ci1pbnQKLWFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwCi1pbnQKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVfdGV4U3ViSW1hZ2UyRCgKLWludAotaW50Ci1pbnQKLWludAotYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAKLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIHZvaWQgdGV4SW1hZ2UyRCgKLWludAotaW50Ci1pbnQKLWFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCB0ZXhJbWFnZTJEKAotaW50Ci1pbnQKLWludAotYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAKLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIHZvaWQgdGV4SW1hZ2UyRCgKLWludAotaW50Ci1hbmRyb2lkLmdyYXBoaWNzLkJpdG1hcAotaW50KQotCi1wdWJsaWMgc3RhdGljIHZvaWQgdGV4U3ViSW1hZ2UyRCgKLWludAotaW50Ci1pbnQKLWludAotYW5kcm9pZC5ncmFwaGljcy5CaXRtYXApCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCB0ZXhTdWJJbWFnZTJEKAotaW50Ci1pbnQKLWludAotaW50Ci1hbmRyb2lkLmdyYXBoaWNzLkJpdG1hcAotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5vcGVuZ2wuR3JvdXAgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL29wZW5nbC9NYXRlcmlhbEluZGljZXM7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdCBtYXRlcmlhbEluZGljZXMKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG5hbWUKLQotcHJpdmF0ZSBhbmRyb2lkLm9wZW5nbC5PYmplY3QzRCBwYXJlbnQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9wZW5nbC5PYmplY3QzRCkKLQotcHVibGljIHZvaWQgZHJhdygKLWphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTApCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE5hbWUoKQotCi1wdWJsaWMgaW50IGdldE51bVRyaWFuZ2xlcygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGxvYWQoCi1qYXZhLmlvLkRhdGFJbnB1dFN0cmVhbSkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQub3BlbmdsLk1hdGVyaWFsIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmbG9hdFtdIGJsYWNrCi0KLXByaXZhdGUgZmxvYXQgZAotCi1wcml2YXRlIGludCBpbGx1bQotCi1wcml2YXRlIGZsb2F0W10ga2EKLQotcHJpdmF0ZSBmbG9hdFtdIGtkCi0KLXByaXZhdGUgZmxvYXRbXSBrcwotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbWFwX2tkCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBuYW1lCi0KLXByaXZhdGUgZmxvYXQgbnMKLQotcHJpdmF0ZSBhbmRyb2lkLm9wZW5nbC5PYmplY3QzRCBwYXJlbnQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQub3BlbmdsLk9iamVjdDNEKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRNYXBfS2QoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXROYW1lKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgbG9hZCgKLWphdmEuaW8uRGF0YUlucHV0U3RyZWFtKQotCi1wdWJsaWMgdm9pZCBzZXRNYXRlcmlhbFBhcmFtZXRlcnMoCi1qYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDEwKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi0gY2xhc3MgYW5kcm9pZC5vcGVuZ2wuTWF0ZXJpYWxJbmRpY2VzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEubmlvLlNob3J0QnVmZmVyIGluZGV4QnVmZmVyCi0KLXByaXZhdGUgYW5kcm9pZC5vcGVuZ2wuTWF0ZXJpYWwgbWF0ZXJpYWwKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9wZW5nbC5NYXRlcmlhbAotamF2YS5uaW8uU2hvcnRCdWZmZXIpCi0KLXB1YmxpYyBqYXZhLm5pby5TaG9ydEJ1ZmZlciBnZXRJbmRleEJ1ZmZlcigpCi0KLXB1YmxpYyBhbmRyb2lkLm9wZW5nbC5NYXRlcmlhbCBnZXRNYXRlcmlhbCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5vcGVuZ2wuTWF0cml4IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBmcnVzdHVtTSgKLWZsb2F0W10KLWludAotZmxvYXQKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGludmVydE0oCi1mbG9hdFtdCi1pbnQKLWZsb2F0W10KLWludCkKLQotcHVibGljIHN0YXRpYyBmbG9hdCBsZW5ndGgoCi1mbG9hdAotZmxvYXQKLWZsb2F0KQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIG11bHRpcGx5TU0oCi1mbG9hdFtdCi1pbnQKLWZsb2F0W10KLWludAotZmxvYXRbXQotaW50KQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIG11bHRpcGx5TVYoCi1mbG9hdFtdCi1pbnQKLWZsb2F0W10KLWludAotZmxvYXRbXQotaW50KQotCi1wdWJsaWMgc3RhdGljIHZvaWQgb3J0aG9NKAotZmxvYXRbXQotaW50Ci1mbG9hdAotZmxvYXQKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWZsb2F0KQotCi1wdWJsaWMgc3RhdGljIHZvaWQgcm90YXRlTSgKLWZsb2F0W10KLWludAotZmxvYXQKLWZsb2F0Ci1mbG9hdAotZmxvYXQpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCByb3RhdGVNKAotZmxvYXRbXQotaW50Ci1mbG9hdFtdCi1pbnQKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWZsb2F0KQotCi1wdWJsaWMgc3RhdGljIHZvaWQgc2NhbGVNKAotZmxvYXRbXQotaW50Ci1mbG9hdAotZmxvYXQKLWZsb2F0KQotCi1wdWJsaWMgc3RhdGljIHZvaWQgc2NhbGVNKAotZmxvYXRbXQotaW50Ci1mbG9hdFtdCi1pbnQKLWZsb2F0Ci1mbG9hdAotZmxvYXQpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJZGVudGl0eU0oCi1mbG9hdFtdCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRSb3RhdGVFdWxlck0oCi1mbG9hdFtdCi1pbnQKLWZsb2F0Ci1mbG9hdAotZmxvYXQpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRSb3RhdGVNKAotZmxvYXRbXQotaW50Ci1mbG9hdAotZmxvYXQKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIHN0YXRpYyB2b2lkIHRyYW5zbGF0ZU0oCi1mbG9hdFtdCi1pbnQKLWZsb2F0Ci1mbG9hdAotZmxvYXQpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFuc2xhdGVNKAotZmxvYXRbXQotaW50Ci1mbG9hdFtdCi1pbnQKLWZsb2F0Ci1mbG9hdAotZmxvYXQpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFuc3Bvc2VNKAotZmxvYXRbXQotaW50Ci1mbG9hdFtdCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC5vcGVuZ2wuT2JqZWN0M0QgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmxvYXQgbUJvdW5kc01heFgKLQotcHJpdmF0ZSBmbG9hdCBtQm91bmRzTWF4WQotCi1wcml2YXRlIGZsb2F0IG1Cb3VuZHNNYXhaCi0KLXByaXZhdGUgZmxvYXQgbUJvdW5kc01pblgKLQotcHJpdmF0ZSBmbG9hdCBtQm91bmRzTWluWQotCi1wcml2YXRlIGZsb2F0IG1Cb3VuZHNNaW5aCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TGFuZHJvaWQvb3BlbmdsL0dyb3VwOz47ICkKLXByaXZhdGUgamF2YS51dGlsLk1hcCBtR3JvdXBzCi0KLXByaXZhdGUgYm9vbGVhbiBtSGFzVGV4Y29vcmRzCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TGFuZHJvaWQvb3BlbmdsL01hdGVyaWFsOz47ICkKLXByaXZhdGUgamF2YS51dGlsLk1hcCBtTWF0ZXJpYWxzCi0KLXByaXZhdGUgamF2YS5uaW8uSW50QnVmZmVyIG1Ob3JtYWxCdWZmZXIKLQotcHJpdmF0ZSBqYXZhLm5pby5JbnRCdWZmZXIgbVRleGNvb3JkQnVmZmVyCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TGFuZHJvaWQvb3BlbmdsL1RleHR1cmU7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuTWFwIG1UZXh0dXJlcwotCi1wcml2YXRlIGphdmEubmlvLkludEJ1ZmZlciBtVmVydGV4QnVmZmVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIHJlc2V0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBzdGF0aWMgdm9pZCB2ZXJpZnlCeXRlKAotamF2YS5pby5EYXRhSW5wdXRTdHJlYW0KLWludCkKLQotcHVibGljIHZvaWQgZHJhdygKLWphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTApCi0KLXB1YmxpYyBmbG9hdCBnZXRCb3VuZHNNYXhYKCkKLQotcHVibGljIGZsb2F0IGdldEJvdW5kc01heFkoKQotCi1wdWJsaWMgZmxvYXQgZ2V0Qm91bmRzTWF4WigpCi0KLXB1YmxpYyBmbG9hdCBnZXRCb3VuZHNNaW5YKCkKLQotcHVibGljIGZsb2F0IGdldEJvdW5kc01pblkoKQotCi1wdWJsaWMgZmxvYXQgZ2V0Qm91bmRzTWluWigpCi0KLXB1YmxpYyBhbmRyb2lkLm9wZW5nbC5NYXRlcmlhbCBnZXRNYXRlcmlhbCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLm5pby5JbnRCdWZmZXIgZ2V0Tm9ybWFsQnVmZmVyKCkKLQotcHVibGljIGludCBnZXROdW1UcmlhbmdsZXMoKQotCi1wdWJsaWMgamF2YS5uaW8uSW50QnVmZmVyIGdldFRleGNvb3JkQnVmZmVyKCkKLQotcHVibGljIGFuZHJvaWQub3BlbmdsLlRleHR1cmUgZ2V0VGV4dHVyZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLm5pby5JbnRCdWZmZXIgZ2V0VmVydGV4QnVmZmVyKCkKLQotcHVibGljIGJvb2xlYW4gaGFzVGV4Y29vcmRzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgbG9hZCgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGxvYWRUZXh0dXJlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEuaW8uSW5wdXRTdHJlYW0gcmVhZEZpbGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQub3BlbmdsLlRleHR1cmUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgaW50IGJwcAotCi1wcml2YXRlIGphdmEubmlvLkJ5dGVCdWZmZXIgZGF0YQotCi1wcml2YXRlIGludCBoZWlnaHQKLQotcHJpdmF0ZSBpbnQgbmFtZQotCi1wcml2YXRlIGludCB3aWR0aAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uSW5wdXRTdHJlYW0pCi0KLXByaXZhdGUgaW50IGxvYWRUZXh0dXJlKAotamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludAotamF2YS5uaW8uQnVmZmVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIGludCByZWFkSW50MTYoCi1qYXZhLmlvLklucHV0U3RyZWFtKQotCi1wdWJsaWMgdm9pZCBzZXRUZXh0dXJlUGFyYW1ldGVycygKLWphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTApCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5vcGVuZ2wuVmlzaWJpbGl0eSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIGNvbXB1dGVCb3VuZGluZ1NwaGVyZSgKLWZsb2F0W10KLWludAotaW50Ci1mbG9hdFtdCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBmcnVzdHVtQ3VsbFNwaGVyZXMoCi1mbG9hdFtdCi1pbnQKLWZsb2F0W10KLWludAotaW50Ci1pbnRbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCB2aXNpYmlsaXR5VGVzdCgKLWZsb2F0W10KLWludAotZmxvYXRbXQotaW50Ci1jaGFyW10KLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQub3MuQXN5bmNSZXN1bHQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBqYXZhLmxhbmcuVGhyb3dhYmxlIGV4Y2VwdGlvbgotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCByZXN1bHQKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgdXNlck9iagotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5vcy5Bc3luY1Jlc3VsdCBmb3JNZXNzYWdlKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQub3MuQXN5bmNSZXN1bHQgZm9yTWVzc2FnZSgKLWFuZHJvaWQub3MuTWVzc2FnZQotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLlRocm93YWJsZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLm9zLkJhZFBhcmNlbGFibGVFeGNlcHRpb24gZXh0ZW5kcyBhbmRyb2lkLnV0aWwuQW5kcm9pZFJ1bnRpbWVFeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuRXhjZXB0aW9uKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQub3MuQmFzZTY0VXRpbHMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBieXRlW10gZGVjb2RlQmFzZTY0KAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJ5dGVbXSBkZWNvZGVCYXNlNjROYXRpdmUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQub3MuQmF0dGVyeU1hbmFnZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJBVFRFUllfSEVBTFRIX0RFQUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkFUVEVSWV9IRUFMVEhfR09PRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCQVRURVJZX0hFQUxUSF9PVkVSSEVBVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCQVRURVJZX0hFQUxUSF9PVkVSX1ZPTFRBR0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkFUVEVSWV9IRUFMVEhfVU5LTk9XTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCQVRURVJZX0hFQUxUSF9VTlNQRUNJRklFRF9GQUlMVVJFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJBVFRFUllfUExVR0dFRF9BQwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCQVRURVJZX1BMVUdHRURfVVNCCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJBVFRFUllfU1RBVFVTX0NIQVJHSU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJBVFRFUllfU1RBVFVTX0RJU0NIQVJHSU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJBVFRFUllfU1RBVFVTX0ZVTEwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkFUVEVSWV9TVEFUVVNfTk9UX0NIQVJHSU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJBVFRFUllfU1RBVFVTX1VOS05PV04KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotZmluYWwgY2xhc3MgYW5kcm9pZC5vcy5CaW5kZXJQcm94eSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLklCaW5kZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBpbnQgbU9iamVjdAotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZSBtU2VsZgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgZmluYWwgbmF0aXZlIHZvaWQgZGVzdHJveSgpCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIHZvaWQgc2VuZERlYXRoTm90aWNlKAotYW5kcm9pZC5vcy5JQmluZGVyJERlYXRoUmVjaXBpZW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvVGhyb3dhYmxlOyApCi1wcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgbmF0aXZlIGphdmEubGFuZy5TdHJpbmcgZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpCi0KLXB1YmxpYyBuYXRpdmUgYm9vbGVhbiBpc0JpbmRlckFsaXZlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBuYXRpdmUgdm9pZCBsaW5rVG9EZWF0aCgKLWFuZHJvaWQub3MuSUJpbmRlciREZWF0aFJlY2lwaWVudAotaW50KQotCi1wdWJsaWMgbmF0aXZlIGJvb2xlYW4gcGluZ0JpbmRlcigpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLklJbnRlcmZhY2UgcXVlcnlMb2NhbEludGVyZmFjZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgbmF0aXZlIGJvb2xlYW4gdHJhbnNhY3QoCi1pbnQKLWFuZHJvaWQub3MuUGFyY2VsCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1wdWJsaWMgbmF0aXZlIGJvb2xlYW4gdW5saW5rVG9EZWF0aCgKLWFuZHJvaWQub3MuSUJpbmRlciREZWF0aFJlY2lwaWVudAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9NDEwNCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL29zL0Jyb2FkY2FzdGVyOyApCi0gY2xhc3MgYW5kcm9pZC5vcy5Ccm9hZGNhc3RlciQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPVJlZ2lzdHJhdGlvbiApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9vcy9Ccm9hZGNhc3RlcjsgKQotIGNsYXNzIGFuZHJvaWQub3MuQnJvYWRjYXN0ZXIkUmVnaXN0cmF0aW9uIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gYW5kcm9pZC5vcy5Ccm9hZGNhc3RlciRSZWdpc3RyYXRpb24gbmV4dAotCi0gYW5kcm9pZC5vcy5Ccm9hZGNhc3RlciRSZWdpc3RyYXRpb24gcHJldgotCi0gaW50IHNlbmRlcldoYXQKLQotIGludFtdIHRhcmdldFdoYXRzCi0KLSBhbmRyb2lkLm9zLkhhbmRsZXJbXSB0YXJnZXRzCi0KLWZpbmFsIGFuZHJvaWQub3MuQnJvYWRjYXN0ZXIgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuQnJvYWRjYXN0ZXIpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuQnJvYWRjYXN0ZXIKLWFuZHJvaWQub3MuQnJvYWRjYXN0ZXIkMSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL29zL0Jyb2FkY2FzdGVyJDE7TGFuZHJvaWQvb3MvQnJvYWRjYXN0ZXIkUmVnaXN0cmF0aW9uOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5vcy5Ccm9hZGNhc3RlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLm9zLkJyb2FkY2FzdGVyJFJlZ2lzdHJhdGlvbiBtUmVnCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgYnJvYWRjYXN0KAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBjYW5jZWxSZXF1ZXN0KAotaW50Ci1hbmRyb2lkLm9zLkhhbmRsZXIKLWludCkKLQotcHVibGljIHZvaWQgZHVtcFJlZ2lzdHJhdGlvbnMoKQotCi1wdWJsaWMgdm9pZCByZXF1ZXN0KAotaW50Ci1hbmRyb2lkLm9zLkhhbmRsZXIKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9VkVSU0lPTiApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9vcy9CdWlsZDsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQub3MuQnVpbGQkVkVSU0lPTiBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIElOQ1JFTUVOVEFMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSRUxFQVNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTREsKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9vcy9CdWlsZCRWRVJTSU9OOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5vcy5CdWlsZCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEJPQVJECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBCUkFORAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVWSUNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBGSU5HRVJQUklOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSE9TVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1PREVMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQUk9EVUNUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUdTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBUSU1FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUWVBFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVU5LTk9XTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVVNFUgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotc3RhdGljIGphdmEubGFuZy5TdHJpbmcgYWNjZXNzJDAwMCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgc3RhdGljIGxvbmcgZ2V0TG9uZygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExhbmRyb2lkL29zL0J1bmRsZTs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9vcy9CdW5kbGU7ICkKLWZpbmFsIGNsYXNzIGFuZHJvaWQub3MuQnVuZGxlJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5CdW5kbGUgY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLkJ1bmRsZVtdIG5ld0FycmF5KAotaW50KQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdFtdIG5ld0FycmF5KAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQub3MuQnVuZGxlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSwgamF2YS5sYW5nLkNsb25lYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC9vcy9CdW5kbGU7PjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvciBDUkVBVE9SCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5CdW5kbGUgRU1QVFkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMT0dfVEFHCi0KLXByaXZhdGUgamF2YS5sYW5nLkNsYXNzTG9hZGVyIG1DbGFzc0xvYWRlcgotCi1wcml2YXRlIGJvb2xlYW4gbUZkc0tub3duCi0KLXByaXZhdGUgYm9vbGVhbiBtSGFzRmRzCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9PYmplY3Q7PjsgKQotIGphdmEudXRpbC5NYXAgbU1hcAotCi0gYW5kcm9pZC5vcy5QYXJjZWwgbVBhcmNlbGxlZERhdGEKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5CdW5kbGUpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuQ2xhc3NMb2FkZXIpCi0KLXByaXZhdGUgdm9pZCB0eXBlV2FybmluZygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5DbGFzc0Nhc3RFeGNlcHRpb24pCi0KLXByaXZhdGUgdm9pZCB0eXBlV2FybmluZygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5DbGFzc0Nhc3RFeGNlcHRpb24pCi0KLXB1YmxpYyB2b2lkIGNsZWFyKCkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgY2xvbmUoKQotCi1wdWJsaWMgYm9vbGVhbiBjb250YWluc0tleSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBib29sZWFuIGdldEJvb2xlYW4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuKAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotcHVibGljIGJvb2xlYW5bXSBnZXRCb29sZWFuQXJyYXkoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5CdW5kbGUgZ2V0QnVuZGxlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJ5dGUgZ2V0Qnl0ZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuQnl0ZSBnZXRCeXRlKAotamF2YS5sYW5nLlN0cmluZwotYnl0ZSkKLQotcHVibGljIGJ5dGVbXSBnZXRCeXRlQXJyYXkoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgY2hhciBnZXRDaGFyKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGNoYXIgZ2V0Q2hhcigKLWphdmEubGFuZy5TdHJpbmcKLWNoYXIpCi0KLXB1YmxpYyBjaGFyW10gZ2V0Q2hhckFycmF5KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgZ2V0Q2hhclNlcXVlbmNlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGRvdWJsZSBnZXREb3VibGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgZG91YmxlIGdldERvdWJsZSgKLWphdmEubGFuZy5TdHJpbmcKLWRvdWJsZSkKLQotcHVibGljIGRvdWJsZVtdIGdldERvdWJsZUFycmF5KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGZsb2F0IGdldEZsb2F0KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGZsb2F0IGdldEZsb2F0KAotamF2YS5sYW5nLlN0cmluZwotZmxvYXQpCi0KLXB1YmxpYyBmbG9hdFtdIGdldEZsb2F0QXJyYXkoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGphdmEubGFuZy5EZXByZWNhdGVkCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGdldElCaW5kZXIoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgaW50IGdldEludCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBpbnQgZ2V0SW50KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgaW50W10gZ2V0SW50QXJyYXkoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvdXRpbC9BcnJheUxpc3Q8TGphdmEvbGFuZy9JbnRlZ2VyOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuQXJyYXlMaXN0IGdldEludGVnZXJBcnJheUxpc3QoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgbG9uZyBnZXRMb25nKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGxvbmcgZ2V0TG9uZygKLWphdmEubGFuZy5TdHJpbmcKLWxvbmcpCi0KLXB1YmxpYyBsb25nW10gZ2V0TG9uZ0FycmF5KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDo6TGFuZHJvaWQvb3MvUGFyY2VsYWJsZTs+KExqYXZhL2xhbmcvU3RyaW5nOylUVDsgKQotcHVibGljIGFuZHJvaWQub3MuUGFyY2VsYWJsZSBnZXRQYXJjZWxhYmxlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFuZHJvaWQub3MuUGFyY2VsYWJsZVtdIGdldFBhcmNlbGFibGVBcnJheSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFQ6OkxhbmRyb2lkL29zL1BhcmNlbGFibGU7PihMamF2YS9sYW5nL1N0cmluZzspTGphdmEvdXRpbC9BcnJheUxpc3Q8VFQ7PjsgKQotcHVibGljIGphdmEudXRpbC5BcnJheUxpc3QgZ2V0UGFyY2VsYWJsZUFycmF5TGlzdCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmlvLlNlcmlhbGl6YWJsZSBnZXRTZXJpYWxpemFibGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc2hvcnQgZ2V0U2hvcnQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc2hvcnQgZ2V0U2hvcnQoCi1qYXZhLmxhbmcuU3RyaW5nCi1zaG9ydCkKLQotcHVibGljIHNob3J0W10gZ2V0U2hvcnRBcnJheSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFQ6OkxhbmRyb2lkL29zL1BhcmNlbGFibGU7PihMamF2YS9sYW5nL1N0cmluZzspTGFuZHJvaWQvdXRpbC9TcGFyc2VBcnJheTxUVDs+OyApCi1wdWJsaWMgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5IGdldFNwYXJzZVBhcmNlbGFibGVBcnJheSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0U3RyaW5nQXJyYXkoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvdXRpbC9BcnJheUxpc3Q8TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHVibGljIGphdmEudXRpbC5BcnJheUxpc3QgZ2V0U3RyaW5nQXJyYXlMaXN0KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJvb2xlYW4gaGFzRmlsZURlc2NyaXB0b3JzKCkKLQotcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL1NldDxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wdWJsaWMgamF2YS51dGlsLlNldCBrZXlTZXQoKQotCi1wdWJsaWMgdm9pZCBwdXRBbGwoCi1hbmRyb2lkLm9zLkJ1bmRsZSkKLQotcHVibGljIHZvaWQgcHV0Qm9vbGVhbigKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHB1dEJvb2xlYW5BcnJheSgKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW5bXSkKLQotcHVibGljIHZvaWQgcHV0QnVuZGxlKAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5vcy5CdW5kbGUpCi0KLXB1YmxpYyB2b2lkIHB1dEJ5dGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1ieXRlKQotCi1wdWJsaWMgdm9pZCBwdXRCeXRlQXJyYXkoCi1qYXZhLmxhbmcuU3RyaW5nCi1ieXRlW10pCi0KLXB1YmxpYyB2b2lkIHB1dENoYXIoCi1qYXZhLmxhbmcuU3RyaW5nCi1jaGFyKQotCi1wdWJsaWMgdm9pZCBwdXRDaGFyQXJyYXkoCi1qYXZhLmxhbmcuU3RyaW5nCi1jaGFyW10pCi0KLXB1YmxpYyB2b2lkIHB1dENoYXJTZXF1ZW5jZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi0KLXB1YmxpYyB2b2lkIHB1dERvdWJsZSgKLWphdmEubGFuZy5TdHJpbmcKLWRvdWJsZSkKLQotcHVibGljIHZvaWQgcHV0RG91YmxlQXJyYXkoCi1qYXZhLmxhbmcuU3RyaW5nCi1kb3VibGVbXSkKLQotcHVibGljIHZvaWQgcHV0RmxvYXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1mbG9hdCkKLQotcHVibGljIHZvaWQgcHV0RmxvYXRBcnJheSgKLWphdmEubGFuZy5TdHJpbmcKLWZsb2F0W10pCi1AamF2YS5sYW5nLkRlcHJlY2F0ZWQKLXB1YmxpYyB2b2lkIHB1dElCaW5kZXIoCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXB1YmxpYyB2b2lkIHB1dEludCgKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIHZvaWQgcHV0SW50QXJyYXkoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnRbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvdXRpbC9BcnJheUxpc3Q8TGphdmEvbGFuZy9JbnRlZ2VyOz47KVYgKQotcHVibGljIHZvaWQgcHV0SW50ZWdlckFycmF5TGlzdCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudXRpbC5BcnJheUxpc3QpCi0KLXB1YmxpYyB2b2lkIHB1dExvbmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1sb25nKQotCi1wdWJsaWMgdm9pZCBwdXRMb25nQXJyYXkoCi1qYXZhLmxhbmcuU3RyaW5nCi1sb25nW10pCi0KLXB1YmxpYyB2b2lkIHB1dFBhcmNlbGFibGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLlBhcmNlbGFibGUpCi0KLXB1YmxpYyB2b2lkIHB1dFBhcmNlbGFibGVBcnJheSgKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuUGFyY2VsYWJsZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1N0cmluZztMamF2YS91dGlsL0FycmF5TGlzdDwrTGFuZHJvaWQvb3MvUGFyY2VsYWJsZTs+OylWICkKLXB1YmxpYyB2b2lkIHB1dFBhcmNlbGFibGVBcnJheUxpc3QoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnV0aWwuQXJyYXlMaXN0KQotCi1wdWJsaWMgdm9pZCBwdXRTZXJpYWxpemFibGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmlvLlNlcmlhbGl6YWJsZSkKLQotcHVibGljIHZvaWQgcHV0U2hvcnQoCi1qYXZhLmxhbmcuU3RyaW5nCi1zaG9ydCkKLQotcHVibGljIHZvaWQgcHV0U2hvcnRBcnJheSgKLWphdmEubGFuZy5TdHJpbmcKLXNob3J0W10pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvU3RyaW5nO0xhbmRyb2lkL3V0aWwvU3BhcnNlQXJyYXk8K0xhbmRyb2lkL29zL1BhcmNlbGFibGU7PjspViApCi1wdWJsaWMgdm9pZCBwdXRTcGFyc2VQYXJjZWxhYmxlQXJyYXkoCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXkpCi0KLXB1YmxpYyB2b2lkIHB1dFN0cmluZygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHB1dFN0cmluZ0FycmF5KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZ1tdKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1N0cmluZztMamF2YS91dGlsL0FycmF5TGlzdDxMamF2YS9sYW5nL1N0cmluZzs+OylWICkKLXB1YmxpYyB2b2lkIHB1dFN0cmluZ0FycmF5TGlzdCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudXRpbC5BcnJheUxpc3QpCi0KLXB1YmxpYyB2b2lkIHJlYWRGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyB2b2lkIHJlbW92ZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHNldENsYXNzTG9hZGVyKAotamF2YS5sYW5nLkNsYXNzTG9hZGVyKQotCi1wdWJsaWMgaW50IHNpemUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLSB2b2lkIHVucGFyY2VsKCkKLQotcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5vcy5Db25kaXRpb25WYXJpYWJsZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIG1Db25kaXRpb24KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBibG9jaygpCi0KLXB1YmxpYyBib29sZWFuIGJsb2NrKAotbG9uZykKLQotcHVibGljIHZvaWQgY2xvc2UoKQotCi1wdWJsaWMgdm9pZCBvcGVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9vcy9Db3VudERvd25UaW1lcjsgKQotIGNsYXNzIGFuZHJvaWQub3MuQ291bnREb3duVGltZXIkMSBleHRlbmRzIGFuZHJvaWQub3MuSGFuZGxlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLm9zLkNvdW50RG93blRpbWVyIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuQ291bnREb3duVGltZXIpCi0KLXB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC5vcy5Db3VudERvd25UaW1lciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TRwotCi1wcml2YXRlIGZpbmFsIGxvbmcgbUNvdW50ZG93bkludGVydmFsCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5IYW5kbGVyIG1IYW5kbGVyCi0KLXByaXZhdGUgZmluYWwgbG9uZyBtTWlsbGlzSW5GdXR1cmUKLQotcHJpdmF0ZSBsb25nIG1TdG9wVGltZUluRnV0dXJlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotbG9uZwotbG9uZykKLQotc3RhdGljIGxvbmcgYWNjZXNzJDAwMCgKLWFuZHJvaWQub3MuQ291bnREb3duVGltZXIpCi0KLXN0YXRpYyBsb25nIGFjY2VzcyQxMDAoCi1hbmRyb2lkLm9zLkNvdW50RG93blRpbWVyKQotCi1wdWJsaWMgZmluYWwgdm9pZCBjYW5jZWwoKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvbkZpbmlzaCgpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uVGljaygKLWxvbmcpCi0KLXB1YmxpYyBmaW5hbCBhbmRyb2lkLm9zLkNvdW50RG93blRpbWVyIHN0YXJ0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbiBleHRlbmRzIGFuZHJvaWQudXRpbC5BbmRyb2lkRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLm9zLkRlYWRPYmplY3RFeGNlcHRpb24gZXh0ZW5kcyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPUluc3RydWN0aW9uQ291bnQgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvb3MvRGVidWc7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLm9zLkRlYnVnJEluc3RydWN0aW9uQ291bnQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOVU1fSU5TVFIKLQotcHJpdmF0ZSBpbnRbXSBtQ291bnRzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGJvb2xlYW4gY29sbGVjdCgpCi0KLXB1YmxpYyBpbnQgZ2xvYmFsTWV0aG9kSW52b2NhdGlvbnMoKQotCi1wdWJsaWMgaW50IGdsb2JhbFRvdGFsKCkKLQotcHVibGljIGJvb2xlYW4gcmVzZXRBbmRTdGFydCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPU1lbW9yeUluZm8gKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvb3MvRGVidWc7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLm9zLkRlYnVnJE1lbW9yeUluZm8gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBpbnQgZGFsdmlrUHJpdmF0ZURpcnR5Ci0KLXB1YmxpYyBpbnQgZGFsdmlrUHNzCi0KLXB1YmxpYyBpbnQgZGFsdmlrU2hhcmVkRGlydHkKLQotcHVibGljIGludCBuYXRpdmVQcml2YXRlRGlydHkKLQotcHVibGljIGludCBuYXRpdmVQc3MKLQotcHVibGljIGludCBuYXRpdmVTaGFyZWREaXJ0eQotCi1wdWJsaWMgaW50IG90aGVyUHJpdmF0ZURpcnR5Ci0KLXB1YmxpYyBpbnQgb3RoZXJQc3MKLQotcHVibGljIGludCBvdGhlclNoYXJlZERpcnR5Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL29zL0RlYnVnJEluc3RydWN0aW9uQ291bnQ7TGFuZHJvaWQvb3MvRGVidWckTWVtb3J5SW5mbzsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQub3MuRGVidWcgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVGQVVMVF9UUkFDRV9CT0RZCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVGQVVMVF9UUkFDRV9FWFRFTlNJT04KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERUZBVUxUX1RSQUNFX0ZJTEVfUEFUSAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFRkFVTFRfVFJBQ0VfUEFUSF9QUkVGSVgKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1JTl9ERUJVR0dFUl9JRExFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIT1dfQ0xBU1NMT0FERVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hPV19GVUxMX0RFVEFJTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9XX0lOSVRJQUxJWkVECi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTUElOX0RFTEFZCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU1lTRlNfUUVNVV9UUkFDRV9TVEFURQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUUkFDRV9DT1VOVF9BTExPQ1MKLQotcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgYm9vbGVhbiBtV2FpdGluZwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBjaGFuZ2VEZWJ1Z1BvcnQoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBlbmFibGVFbXVsYXRvclRyYWNlT3V0cHV0KCkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGdldEJpbmRlckRlYXRoT2JqZWN0Q291bnQoKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2V0QmluZGVyTG9jYWxPYmplY3RDb3VudCgpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBnZXRCaW5kZXJQcm94eU9iamVjdENvdW50KCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGdldEJpbmRlclJlY2VpdmVkVHJhbnNhY3Rpb25zKCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGdldEJpbmRlclNlbnRUcmFuc2FjdGlvbnMoKQotCi1wdWJsaWMgc3RhdGljIGludCBnZXRHbG9iYWxBbGxvY0NvdW50KCkKLQotcHVibGljIHN0YXRpYyBpbnQgZ2V0R2xvYmFsQWxsb2NTaXplKCkKLQotcHVibGljIHN0YXRpYyBpbnQgZ2V0R2xvYmFsRXh0ZXJuYWxBbGxvY0NvdW50KCkKLQotcHVibGljIHN0YXRpYyBpbnQgZ2V0R2xvYmFsRXh0ZXJuYWxBbGxvY1NpemUoKQotCi1wdWJsaWMgc3RhdGljIGludCBnZXRHbG9iYWxFeHRlcm5hbEZyZWVkQ291bnQoKQotCi1wdWJsaWMgc3RhdGljIGludCBnZXRHbG9iYWxFeHRlcm5hbEZyZWVkU2l6ZSgpCi0KLXB1YmxpYyBzdGF0aWMgaW50IGdldEdsb2JhbEZyZWVkQ291bnQoKQotCi1wdWJsaWMgc3RhdGljIGludCBnZXRHbG9iYWxGcmVlZFNpemUoKQotCi1wdWJsaWMgc3RhdGljIGludCBnZXRHbG9iYWxHY0ludm9jYXRpb25Db3VudCgpCi0KLXB1YmxpYyBzdGF0aWMgaW50IGdldExvYWRlZENsYXNzQ291bnQoKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIGdldE1lbW9yeUluZm8oCi1hbmRyb2lkLm9zLkRlYnVnJE1lbW9yeUluZm8pCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGxvbmcgZ2V0TmF0aXZlSGVhcEFsbG9jYXRlZFNpemUoKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBsb25nIGdldE5hdGl2ZUhlYXBGcmVlU2l6ZSgpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGxvbmcgZ2V0TmF0aXZlSGVhcFNpemUoKQotCi1wdWJsaWMgc3RhdGljIGludCBnZXRUaHJlYWRBbGxvY0NvdW50KCkKLQotcHVibGljIHN0YXRpYyBpbnQgZ2V0VGhyZWFkQWxsb2NTaXplKCkKLQotcHVibGljIHN0YXRpYyBpbnQgZ2V0VGhyZWFkRXh0ZXJuYWxBbGxvY0NvdW50KCkKLQotcHVibGljIHN0YXRpYyBpbnQgZ2V0VGhyZWFkRXh0ZXJuYWxBbGxvY1NpemUoKQotCi1wdWJsaWMgc3RhdGljIGludCBnZXRUaHJlYWRHY0ludm9jYXRpb25Db3VudCgpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RlYnVnZ2VyQ29ubmVjdGVkKCkKLQotcHVibGljIHN0YXRpYyB2b2lkIHByaW50TG9hZGVkQ2xhc3NlcygKLWludCkKLQotcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0QWxsQ291bnRzKCkKLQotcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0R2xvYmFsQWxsb2NDb3VudCgpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCByZXNldEdsb2JhbEFsbG9jU2l6ZSgpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCByZXNldEdsb2JhbEV4dGVybmFsQWxsb2NDb3VudCgpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCByZXNldEdsb2JhbEV4dGVybmFsQWxsb2NTaXplKCkKLQotcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0R2xvYmFsRXh0ZXJuYWxGcmVlZENvdW50KCkKLQotcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0R2xvYmFsRXh0ZXJuYWxGcmVlZFNpemUoKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgcmVzZXRHbG9iYWxGcmVlZENvdW50KCkKLQotcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0R2xvYmFsRnJlZWRTaXplKCkKLQotcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0R2xvYmFsR2NJbnZvY2F0aW9uQ291bnQoKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgcmVzZXRUaHJlYWRBbGxvY0NvdW50KCkKLQotcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0VGhyZWFkQWxsb2NTaXplKCkKLQotcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0VGhyZWFkRXh0ZXJuYWxBbGxvY0NvdW50KCkKLQotcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0VGhyZWFkRXh0ZXJuYWxBbGxvY1NpemUoKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgcmVzZXRUaHJlYWRHY0ludm9jYXRpb25Db3VudCgpCi0KLXB1YmxpYyBzdGF0aWMgaW50IHNldEFsbG9jYXRpb25MaW1pdCgKLWludCkKLQotcHVibGljIHN0YXRpYyBpbnQgc2V0R2xvYmFsQWxsb2NhdGlvbkxpbWl0KAotaW50KQotCi1wdWJsaWMgc3RhdGljIHZvaWQgc3RhcnRBbGxvY0NvdW50aW5nKCkKLQotcHVibGljIHN0YXRpYyB2b2lkIHN0YXJ0TWV0aG9kVHJhY2luZygpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBzdGFydE1ldGhvZFRyYWNpbmcoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgc3RhcnRNZXRob2RUcmFjaW5nKAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgc3RhdGljIHZvaWQgc3RhcnRNZXRob2RUcmFjaW5nKAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBzdGFydE5hdGl2ZVRyYWNpbmcoKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgc3RvcEFsbG9jQ291bnRpbmcoKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgc3RvcE1ldGhvZFRyYWNpbmcoKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgc3RvcE5hdGl2ZVRyYWNpbmcoKQotCi1wdWJsaWMgc3RhdGljIGxvbmcgdGhyZWFkQ3B1VGltZU5hbm9zKCkKLQotcHVibGljIHN0YXRpYyB2b2lkIHdhaXRGb3JEZWJ1Z2dlcigpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB3YWl0aW5nRm9yRGVidWdnZXIoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQub3MuRW52aXJvbm1lbnQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEuaW8uRmlsZSBEQVRBX0RJUkVDVE9SWQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmlvLkZpbGUgRE9XTkxPQURfQ0FDSEVfRElSRUNUT1JZCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEuaW8uRmlsZSBFWFRFUk5BTF9TVE9SQUdFX0RJUkVDVE9SWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTUVESUFfQkFEX1JFTU9WQUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1FRElBX01PVU5URUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1FRElBX01PVU5URURfUkVBRF9PTkxZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBNRURJQV9SRU1PVkVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBNRURJQV9TSEFSRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1FRElBX1VOTU9VTlRBQkxFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBNRURJQV9VTk1PVU5URUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5pby5GaWxlIFJPT1RfRElSRUNUT1JZCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGphdmEuaW8uRmlsZSBnZXREYXRhRGlyZWN0b3J5KCkKLQotc3RhdGljIGphdmEuaW8uRmlsZSBnZXREaXJlY3RvcnkoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGphdmEuaW8uRmlsZSBnZXREb3dubG9hZENhY2hlRGlyZWN0b3J5KCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmlvLkZpbGUgZ2V0RXh0ZXJuYWxTdG9yYWdlRGlyZWN0b3J5KCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEV4dGVybmFsU3RvcmFnZVN0YXRlKCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmlvLkZpbGUgZ2V0Um9vdERpcmVjdG9yeSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5vcy5FeGVjIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5pby5GaWxlRGVzY3JpcHRvciBjcmVhdGVTdWJwcm9jZXNzKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgamF2YS5pby5GaWxlRGVzY3JpcHRvciBjcmVhdGVTdWJwcm9jZXNzKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotaW50W10pCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgc2V0UHR5V2luZG93U2l6ZSgKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IHdhaXRGb3IoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1PYnNlcnZlclRocmVhZCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9vcy9GaWxlT2JzZXJ2ZXI7ICkKLSBjbGFzcyBhbmRyb2lkLm9zLkZpbGVPYnNlcnZlciRPYnNlcnZlclRocmVhZCBleHRlbmRzIGphdmEubGFuZy5UaHJlYWQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBpbnQgbV9mZAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaE1hcDxMamF2YS9sYW5nL0ludGVnZXI7TGphdmEvbGFuZy9yZWYvV2Vha1JlZmVyZW5jZTs+OyApCi1wcml2YXRlIGphdmEudXRpbC5IYXNoTWFwIG1fb2JzZXJ2ZXJzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSBuYXRpdmUgaW50IGluaXQoKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIG9ic2VydmUoCi1pbnQpCi0KLXByaXZhdGUgbmF0aXZlIGludCBzdGFydFdhdGNoaW5nKAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgc3RvcFdhdGNoaW5nKAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIG9uRXZlbnQoCi1pbnQKLWludAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgcnVuKCkKLQotcHVibGljIGludCBzdGFydFdhdGNoaW5nKAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1hbmRyb2lkLm9zLkZpbGVPYnNlcnZlcikKLQotcHVibGljIHZvaWQgc3RvcFdhdGNoaW5nKAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvb3MvRmlsZU9ic2VydmVyJE9ic2VydmVyVGhyZWFkOyApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC5vcy5GaWxlT2JzZXJ2ZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDQ0VTUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTExfRVZFTlRTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTE9TRV9OT1dSSVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMT1NFX1dSSVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENSRUFURQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUxFVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVMRVRFX1NFTEYKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMT0dfVEFHCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PRElGWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT1ZFRF9GUk9NCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PVkVEX1RPCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PVkVfU0VMRgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUEVOCi0KLXByaXZhdGUgc3RhdGljIGFuZHJvaWQub3MuRmlsZU9ic2VydmVyJE9ic2VydmVyVGhyZWFkIHNfb2JzZXJ2ZXJUaHJlYWQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuSW50ZWdlciBtX2Rlc2NyaXB0b3IKLQotcHJpdmF0ZSBpbnQgbV9tYXNrCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtX3BhdGgKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvbkV2ZW50KAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzdGFydFdhdGNoaW5nKCkKLQotcHVibGljIHZvaWQgc3RvcFdhdGNoaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI1IG5hbWUgPUZpbGVTdGF0dXMgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvb3MvRmlsZVV0aWxzOyApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5vcy5GaWxlVXRpbHMkRmlsZVN0YXR1cyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGxvbmcgYXRpbWUKLQotcHVibGljIGludCBibGtzaXplCi0KLXB1YmxpYyBsb25nIGJsb2NrcwotCi1wdWJsaWMgbG9uZyBjdGltZQotCi1wdWJsaWMgaW50IGRldgotCi1wdWJsaWMgaW50IGdpZAotCi1wdWJsaWMgaW50IGlubwotCi1wdWJsaWMgaW50IG1vZGUKLQotcHVibGljIGxvbmcgbXRpbWUKLQotcHVibGljIGludCBubGluawotCi1wdWJsaWMgaW50IHJkZXYKLQotcHVibGljIGxvbmcgc2l6ZQotCi1wdWJsaWMgaW50IHVpZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9vcy9GaWxlVXRpbHMkRmlsZVN0YXR1czsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQub3MuRmlsZVV0aWxzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwucmVnZXguUGF0dGVybiBTQUZFX0ZJTEVOQU1FX1BBVFRFUk4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU19JUkdSUAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTX0lST1RICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNfSVJVU1IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU19JUldYRwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTX0lSV1hPCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNfSVJXWFUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU19JV0dSUAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTX0lXT1RICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNfSVdVU1IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU19JWEdSUAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTX0lYT1RICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNfSVhVU1IKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb3B5RmlsZSgKLWphdmEuaW8uRmlsZQotamF2YS5pby5GaWxlKQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gY29weVRvRmlsZSgKLWphdmEuaW8uSW5wdXRTdHJlYW0KLWphdmEuaW8uRmlsZSkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGdldEZhdFZvbHVtZUlkKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBnZXRGaWxlU3RhdHVzKAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5vcy5GaWxlVXRpbHMkRmlsZVN0YXR1cykKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGdldFBlcm1pc3Npb25zKAotamF2YS5sYW5nLlN0cmluZwotaW50W10pCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ZpbGVuYW1lU2FmZSgKLWphdmEuaW8uRmlsZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIHJlYWRUZXh0RmlsZSgKLWphdmEuaW8uRmlsZQotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgc2V0UGVybWlzc2lvbnMoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9NDEwNCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL29zL0hhbmRsZXI7ICkKLSBjbGFzcyBhbmRyb2lkLm9zLkhhbmRsZXIkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvb3MvSU1lc3NlbmdlciRTdHViOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQub3MuSU1lc3NlbmdlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLklJbnRlcmZhY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2VuZCgKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9vcy9JTWVzc2VuZ2VyOyApCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL29zL0lNZXNzZW5nZXIkU3R1YiRQcm94eTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMDMzIG5hbWUgPVN0dWIgKQotcHVibGljIGFic3RyYWN0IGNsYXNzIGFuZHJvaWQub3MuSU1lc3NlbmdlciRTdHViIGV4dGVuZHMgYW5kcm9pZC5vcy5CaW5kZXIgaW1wbGVtZW50cyBhbmRyb2lkLm9zLklNZXNzZW5nZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERVNDUklQVE9SCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fc2VuZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5vcy5JTWVzc2VuZ2VyIGFzSW50ZXJmYWNlKAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIG9uVHJhbnNhY3QoCi1pbnQKLWFuZHJvaWQub3MuUGFyY2VsCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL29zL0hhbmRsZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTggbmFtZSA9TWVzc2VuZ2VySW1wbCApCi1maW5hbCBjbGFzcyBhbmRyb2lkLm9zLkhhbmRsZXIkTWVzc2VuZ2VySW1wbCBleHRlbmRzIGFuZHJvaWQub3MuSU1lc3NlbmdlciRTdHViCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQub3MuSGFuZGxlciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5IYW5kbGVyKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLkhhbmRsZXIKLWFuZHJvaWQub3MuSGFuZGxlciQxKQotCi1wdWJsaWMgdm9pZCBzZW5kKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLm9zLkhhbmRsZXJJbnRlcmZhY2UgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgaGFuZGxlTWVzc2FnZSgKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLm9zLkhhbmRsZXJUaHJlYWQgZXh0ZW5kcyBqYXZhLmxhbmcuVGhyZWFkCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5Mb29wZXIgbUxvb3BlcgotCi1wcml2YXRlIGludCBtUHJpb3JpdHkKLQotcHJpdmF0ZSBpbnQgbVRpZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIGFuZHJvaWQub3MuTG9vcGVyIGdldExvb3BlcigpCi0KLXB1YmxpYyBpbnQgZ2V0VGhyZWFkSWQoKQotCi1wcm90ZWN0ZWQgdm9pZCBvbkxvb3BlclByZXBhcmVkKCkKLQotcHVibGljIHZvaWQgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLm9zLkhhcmR3YXJlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgZW5hYmxlQ2FtZXJhRmxhc2goCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gZ2V0Rmxhc2hsaWdodEVuYWJsZWQoKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHNldEJ1dHRvbkJhY2tsaWdodCgKLWJvb2xlYW4pCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgc2V0Rmxhc2hsaWdodEVuYWJsZWQoCi1ib29sZWFuKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHNldEtleWJvYXJkQmFja2xpZ2h0KAotYm9vbGVhbikKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IHNldExlZFN0YXRlKAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBzZXRTY3JlZW5CYWNrbGlnaHQoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9vcy9JQ2hlY2tpblNlcnZpY2UkU3R1YjsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLm9zLklDaGVja2luU2VydmljZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLklJbnRlcmZhY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2V0UGFyZW50YWxDb250cm9sU3RhdGUoCi1hbmRyb2lkLm9zLklQYXJlbnRhbENvbnRyb2xDYWxsYmFjaykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG1hc3RlckNsZWFyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlcG9ydENyYXNoQXN5bmMoCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCByZXBvcnRDcmFzaFN5bmMoCi1ieXRlW10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1Qcm94eSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9vcy9JQ2hlY2tpblNlcnZpY2UkU3R1YjsgKQotIGNsYXNzIGFuZHJvaWQub3MuSUNoZWNraW5TZXJ2aWNlJFN0dWIkUHJveHkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5JQ2hlY2tpblNlcnZpY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLm9zLklCaW5kZXIgbVJlbW90ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuSUJpbmRlcikKLQotcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEludGVyZmFjZURlc2NyaXB0b3IoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgZ2V0UGFyZW50YWxDb250cm9sU3RhdGUoCi1hbmRyb2lkLm9zLklQYXJlbnRhbENvbnRyb2xDYWxsYmFjaykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIG1hc3RlckNsZWFyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHJlcG9ydENyYXNoQXN5bmMoCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCByZXBvcnRDcmFzaFN5bmMoCi1ieXRlW10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9vcy9JQ2hlY2tpblNlcnZpY2UkU3R1YiRQcm94eTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvb3MvSUNoZWNraW5TZXJ2aWNlOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwMzMgbmFtZSA9U3R1YiApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC5vcy5JQ2hlY2tpblNlcnZpY2UkU3R1YiBleHRlbmRzIGFuZHJvaWQub3MuQmluZGVyIGltcGxlbWVudHMgYW5kcm9pZC5vcy5JQ2hlY2tpblNlcnZpY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERVNDUklQVE9SCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZ2V0UGFyZW50YWxDb250cm9sU3RhdGUKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9tYXN0ZXJDbGVhcgotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3JlcG9ydENyYXNoQXN5bmMKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9yZXBvcnRDcmFzaFN5bmMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQub3MuSUNoZWNraW5TZXJ2aWNlIGFzSW50ZXJmYWNlKAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIG9uVHJhbnNhY3QoCi1pbnQKLWFuZHJvaWQub3MuUGFyY2VsCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvb3MvSUhhcmR3YXJlU2VydmljZSRTdHViOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQub3MuSUhhcmR3YXJlU2VydmljZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLklJbnRlcmZhY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgY2FuY2VsVmlicmF0ZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBlbmFibGVDYW1lcmFGbGFzaCgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGdldEZsYXNobGlnaHRFbmFibGVkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEJ1dHRvbkJhY2tsaWdodCgKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRGbGFzaGxpZ2h0RW5hYmxlZCgKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRLZXlib2FyZEJhY2tsaWdodCgKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRMZWRTdGF0ZSgKLWludAotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRTY3JlZW5CYWNrbGlnaHQoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB2aWJyYXRlKAotbG9uZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHZpYnJhdGVQYXR0ZXJuKAotbG9uZ1tdCi1pbnQKLWFuZHJvaWQub3MuSUJpbmRlcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPVByb3h5ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL29zL0lIYXJkd2FyZVNlcnZpY2UkU3R1YjsgKQotIGNsYXNzIGFuZHJvaWQub3MuSUhhcmR3YXJlU2VydmljZSRTdHViJFByb3h5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuSUhhcmR3YXJlU2VydmljZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGFuZHJvaWQub3MuSUJpbmRlciBtUmVtb3RlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNhbmNlbFZpYnJhdGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgZW5hYmxlQ2FtZXJhRmxhc2goCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBnZXRGbGFzaGxpZ2h0RW5hYmxlZCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEludGVyZmFjZURlc2NyaXB0b3IoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0QnV0dG9uQmFja2xpZ2h0KAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldEZsYXNobGlnaHRFbmFibGVkKAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldEtleWJvYXJkQmFja2xpZ2h0KAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldExlZFN0YXRlKAotaW50Ci1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldFNjcmVlbkJhY2tsaWdodCgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHZpYnJhdGUoCi1sb25nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgdmlicmF0ZVBhdHRlcm4oCi1sb25nW10KLWludAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvb3MvSUhhcmR3YXJlU2VydmljZSRTdHViJFByb3h5OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9vcy9JSGFyZHdhcmVTZXJ2aWNlOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwMzMgbmFtZSA9U3R1YiApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC5vcy5JSGFyZHdhcmVTZXJ2aWNlJFN0dWIgZXh0ZW5kcyBhbmRyb2lkLm9zLkJpbmRlciBpbXBsZW1lbnRzIGFuZHJvaWQub3MuSUhhcmR3YXJlU2VydmljZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFU0NSSVBUT1IKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9jYW5jZWxWaWJyYXRlCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZW5hYmxlQ2FtZXJhRmxhc2gKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9nZXRGbGFzaGxpZ2h0RW5hYmxlZAotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3NldEJ1dHRvbkJhY2tsaWdodAotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3NldEZsYXNobGlnaHRFbmFibGVkCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fc2V0S2V5Ym9hcmRCYWNrbGlnaHQKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9zZXRMZWRTdGF0ZQotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3NldFNjcmVlbkJhY2tsaWdodAotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3ZpYnJhdGUKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl92aWJyYXRlUGF0dGVybgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5vcy5JSGFyZHdhcmVTZXJ2aWNlIGFzSW50ZXJmYWNlKAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIG9uVHJhbnNhY3QoCi1pbnQKLWFuZHJvaWQub3MuUGFyY2VsCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9UHJveHkgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvb3MvSU1lc3NlbmdlciRTdHViOyApCi0gY2xhc3MgYW5kcm9pZC5vcy5JTWVzc2VuZ2VyJFN0dWIkUHJveHkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5JTWVzc2VuZ2VyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5JQmluZGVyIG1SZW1vdGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNlbmQoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9vcy9JTW91bnRTZXJ2aWNlJFN0dWI7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5vcy5JTW91bnRTZXJ2aWNlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuSUludGVyZmFjZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBnZXRNYXNzU3RvcmFnZUNvbm5lY3RlZCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBnZXRNYXNzU3RvcmFnZUVuYWJsZWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgbW91bnRNZWRpYSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRNYXNzU3RvcmFnZUVuYWJsZWQoCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgdW5tb3VudE1lZGlhKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPVByb3h5ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL29zL0lNb3VudFNlcnZpY2UkU3R1YjsgKQotIGNsYXNzIGFuZHJvaWQub3MuSU1vdW50U2VydmljZSRTdHViJFByb3h5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuSU1vdW50U2VydmljZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGFuZHJvaWQub3MuSUJpbmRlciBtUmVtb3RlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBnZXRNYXNzU3RvcmFnZUNvbm5lY3RlZCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBnZXRNYXNzU3RvcmFnZUVuYWJsZWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgbW91bnRNZWRpYSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRNYXNzU3RvcmFnZUVuYWJsZWQoCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgdW5tb3VudE1lZGlhKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL29zL0lNb3VudFNlcnZpY2UkU3R1YiRQcm94eTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMDMzIG5hbWUgPVN0dWIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvb3MvSU1vdW50U2VydmljZTsgKQotcHVibGljIGFic3RyYWN0IGNsYXNzIGFuZHJvaWQub3MuSU1vdW50U2VydmljZSRTdHViIGV4dGVuZHMgYW5kcm9pZC5vcy5CaW5kZXIgaW1wbGVtZW50cyBhbmRyb2lkLm9zLklNb3VudFNlcnZpY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERVNDUklQVE9SCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZ2V0TWFzc1N0b3JhZ2VDb25uZWN0ZWQKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9nZXRNYXNzU3RvcmFnZUVuYWJsZWQKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9tb3VudE1lZGlhCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fc2V0TWFzc1N0b3JhZ2VFbmFibGVkCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fdW5tb3VudE1lZGlhCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLm9zLklNb3VudFNlcnZpY2UgYXNJbnRlcmZhY2UoCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gb25UcmFuc2FjdCgKLWludAotYW5kcm9pZC5vcy5QYXJjZWwKLWFuZHJvaWQub3MuUGFyY2VsCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9vcy9JTmV0U3RhdFNlcnZpY2UkU3R1YjsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLm9zLklOZXRTdGF0U2VydmljZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLklJbnRlcmZhY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCBnZXRSeEJ5dGVzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0UnhQYWNrZXRzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0VHhCeXRlcygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldFR4UGFja2V0cygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvb3MvSU5ldFN0YXRTZXJ2aWNlJFN0dWI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9UHJveHkgKQotIGNsYXNzIGFuZHJvaWQub3MuSU5ldFN0YXRTZXJ2aWNlJFN0dWIkUHJveHkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5JTmV0U3RhdFNlcnZpY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLm9zLklCaW5kZXIgbVJlbW90ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuSUJpbmRlcikKLQotcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEludGVyZmFjZURlc2NyaXB0b3IoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXRSeEJ5dGVzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgZ2V0UnhQYWNrZXRzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgZ2V0VHhCeXRlcygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGdldFR4UGFja2V0cygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMDMzIG5hbWUgPVN0dWIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvb3MvSU5ldFN0YXRTZXJ2aWNlOyApCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL29zL0lOZXRTdGF0U2VydmljZSRTdHViJFByb3h5OyApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC5vcy5JTmV0U3RhdFNlcnZpY2UkU3R1YiBleHRlbmRzIGFuZHJvaWQub3MuQmluZGVyIGltcGxlbWVudHMgYW5kcm9pZC5vcy5JTmV0U3RhdFNlcnZpY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERVNDUklQVE9SCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZ2V0UnhCeXRlcwotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2dldFJ4UGFja2V0cwotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2dldFR4Qnl0ZXMKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9nZXRUeFBhY2tldHMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQub3MuSU5ldFN0YXRTZXJ2aWNlIGFzSW50ZXJmYWNlKAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIG9uVHJhbnNhY3QoCi1pbnQKLWFuZHJvaWQub3MuUGFyY2VsCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvb3MvSVBhcmVudGFsQ29udHJvbENhbGxiYWNrJFN0dWI7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5vcy5JUGFyZW50YWxDb250cm9sQ2FsbGJhY2sgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5JSW50ZXJmYWNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uUmVzdWx0KAotY29tLmdvb2dsZS5hbmRyb2lkLm5ldC5QYXJlbnRhbENvbnRyb2xTdGF0ZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9vcy9JUGFyZW50YWxDb250cm9sQ2FsbGJhY2skU3R1YjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1Qcm94eSApCi0gY2xhc3MgYW5kcm9pZC5vcy5JUGFyZW50YWxDb250cm9sQ2FsbGJhY2skU3R1YiRQcm94eSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLklQYXJlbnRhbENvbnRyb2xDYWxsYmFjawotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGFuZHJvaWQub3MuSUJpbmRlciBtUmVtb3RlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBvblJlc3VsdCgKLWNvbS5nb29nbGUuYW5kcm9pZC5uZXQuUGFyZW50YWxDb250cm9sU3RhdGUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9vcy9JUGFyZW50YWxDb250cm9sQ2FsbGJhY2skU3R1YiRQcm94eTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMDMzIG5hbWUgPVN0dWIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvb3MvSVBhcmVudGFsQ29udHJvbENhbGxiYWNrOyApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC5vcy5JUGFyZW50YWxDb250cm9sQ2FsbGJhY2skU3R1YiBleHRlbmRzIGFuZHJvaWQub3MuQmluZGVyIGltcGxlbWVudHMgYW5kcm9pZC5vcy5JUGFyZW50YWxDb250cm9sQ2FsbGJhY2sKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERVNDUklQVE9SCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fb25SZXN1bHQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQub3MuSVBhcmVudGFsQ29udHJvbENhbGxiYWNrIGFzSW50ZXJmYWNlKAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIG9uVHJhbnNhY3QoCi1pbnQKLWFuZHJvaWQub3MuUGFyY2VsCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvb3MvSVBlcm1pc3Npb25Db250cm9sbGVyJFN0dWI7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5vcy5JUGVybWlzc2lvbkNvbnRyb2xsZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5JSW50ZXJmYWNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGNoZWNrUGVybWlzc2lvbigKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9UHJveHkgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvb3MvSVBlcm1pc3Npb25Db250cm9sbGVyJFN0dWI7ICkKLSBjbGFzcyBhbmRyb2lkLm9zLklQZXJtaXNzaW9uQ29udHJvbGxlciRTdHViJFByb3h5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuSVBlcm1pc3Npb25Db250cm9sbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5JQmluZGVyIG1SZW1vdGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gY2hlY2tQZXJtaXNzaW9uKAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEludGVyZmFjZURlc2NyaXB0b3IoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL29zL0lQZXJtaXNzaW9uQ29udHJvbGxlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMDMzIG5hbWUgPVN0dWIgKQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9vcy9JUGVybWlzc2lvbkNvbnRyb2xsZXIkU3R1YiRQcm94eTsgKQotcHVibGljIGFic3RyYWN0IGNsYXNzIGFuZHJvaWQub3MuSVBlcm1pc3Npb25Db250cm9sbGVyJFN0dWIgZXh0ZW5kcyBhbmRyb2lkLm9zLkJpbmRlciBpbXBsZW1lbnRzIGFuZHJvaWQub3MuSVBlcm1pc3Npb25Db250cm9sbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVTQ1JJUFRPUgotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2NoZWNrUGVybWlzc2lvbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5vcy5JUGVybWlzc2lvbkNvbnRyb2xsZXIgYXNJbnRlcmZhY2UoCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gb25UcmFuc2FjdCgKLWludAotYW5kcm9pZC5vcy5QYXJjZWwKLWFuZHJvaWQub3MuUGFyY2VsCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9vcy9JUG93ZXJNYW5hZ2VyJFN0dWI7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5vcy5JUG93ZXJNYW5hZ2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuSUludGVyZmFjZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBhY3F1aXJlV2FrZUxvY2soCi1pbnQKLWFuZHJvaWQub3MuSUJpbmRlcgotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBsb25nIGdldFNjcmVlbk9uVGltZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnb1RvU2xlZXAoCi1sb25nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgcmVsZWFzZVdha2VMb2NrKAotYW5kcm9pZC5vcy5JQmluZGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0UG9rZUxvY2soCi1pbnQKLWFuZHJvaWQub3MuSUJpbmRlcgotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFN0YXlPblNldHRpbmcoCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgdXNlckFjdGl2aXR5KAotbG9uZwotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHVzZXJBY3Rpdml0eVdpdGhGb3JjZSgKLWxvbmcKLWJvb2xlYW4KLWJvb2xlYW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1Qcm94eSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9vcy9JUG93ZXJNYW5hZ2VyJFN0dWI7ICkKLSBjbGFzcyBhbmRyb2lkLm9zLklQb3dlck1hbmFnZXIkU3R1YiRQcm94eSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLklQb3dlck1hbmFnZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLm9zLklCaW5kZXIgbVJlbW90ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuSUJpbmRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGFjcXVpcmVXYWtlTG9jaygKLWludAotYW5kcm9pZC5vcy5JQmluZGVyCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgbG9uZyBnZXRTY3JlZW5PblRpbWUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgZ29Ub1NsZWVwKAotbG9uZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHJlbGVhc2VXYWtlTG9jaygKLWFuZHJvaWQub3MuSUJpbmRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldFBva2VMb2NrKAotaW50Ci1hbmRyb2lkLm9zLklCaW5kZXIKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRTdGF5T25TZXR0aW5nKAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHVzZXJBY3Rpdml0eSgKLWxvbmcKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB1c2VyQWN0aXZpdHlXaXRoRm9yY2UoCi1sb25nCi1ib29sZWFuCi1ib29sZWFuKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvb3MvSVBvd2VyTWFuYWdlciRTdHViJFByb3h5OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwMzMgbmFtZSA9U3R1YiApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9vcy9JUG93ZXJNYW5hZ2VyOyApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC5vcy5JUG93ZXJNYW5hZ2VyJFN0dWIgZXh0ZW5kcyBhbmRyb2lkLm9zLkJpbmRlciBpbXBsZW1lbnRzIGFuZHJvaWQub3MuSVBvd2VyTWFuYWdlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFU0NSSVBUT1IKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9hY3F1aXJlV2FrZUxvY2sKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9nZXRTY3JlZW5PblRpbWUKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9nb1RvU2xlZXAKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9yZWxlYXNlV2FrZUxvY2sKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9zZXRQb2tlTG9jawotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3NldFN0YXlPblNldHRpbmcKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl91c2VyQWN0aXZpdHkKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl91c2VyQWN0aXZpdHlXaXRoRm9yY2UKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQub3MuSVBvd2VyTWFuYWdlciBhc0ludGVyZmFjZSgKLWFuZHJvaWQub3MuSUJpbmRlcikKLQotcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBvblRyYW5zYWN0KAotaW50Ci1hbmRyb2lkLm9zLlBhcmNlbAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5vcy5JU2VydmljZU1hbmFnZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5JSW50ZXJmYWNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFERF9TRVJWSUNFX1RSQU5TQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIRUNLX1NFUlZJQ0VTX1RSQU5TQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIRUNLX1NFUlZJQ0VfVFJBTlNBQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0VUX1NFUlZJQ0VfVFJBTlNBQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTElTVF9TRVJWSUNFU19UUkFOU0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVRfUEVSTUlTU0lPTl9DT05UUk9MTEVSX1RSQU5TQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBkZXNjcmlwdG9yCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGFkZFNlcnZpY2UoCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLklCaW5kZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC5vcy5JQmluZGVyIGNoZWNrU2VydmljZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC5vcy5JQmluZGVyIGdldFNlcnZpY2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmdbXSBsaXN0U2VydmljZXMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0UGVybWlzc2lvbkNvbnRyb2xsZXIoCi1hbmRyb2lkLm9zLklQZXJtaXNzaW9uQ29udHJvbGxlcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5vcy5Mb2NhbFBvd2VyTWFuYWdlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlVUVE9OX0VWRU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIRUVLX0VWRU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9USEVSX0VWRU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPS0VfTE9DS19JR05PUkVfQ0hFRUtfRVZFTlRTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPS0VfTE9DS19NRURJVU1fVElNRU9VVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT0tFX0xPQ0tfU0hPUlRfVElNRU9VVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT0tFX0xPQ0tfVElNRU9VVF9NQVNLCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPVUNIX0VWRU5UCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgZW5hYmxlVXNlckFjdGl2aXR5KAotYm9vbGVhbikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ29Ub1NsZWVwKAotbG9uZykKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0S2V5Ym9hcmRWaXNpYmlsaXR5KAotYm9vbGVhbikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgdXNlckFjdGl2aXR5KAotbG9uZwotYm9vbGVhbgotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1IYW5kbGVyRXhjZXB0aW9uICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL29zL0xvb3BlcjsgKQotIGNsYXNzIGFuZHJvaWQub3MuTG9vcGVyJEhhbmRsZXJFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5NZXNzYWdlCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1zdGF0aWMgamF2YS5sYW5nLlN0cmluZyBjcmVhdGVNZXNzYWdlKAotamF2YS5sYW5nLlRocm93YWJsZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL29zL0xvb3BlciRIYW5kbGVyRXhjZXB0aW9uOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5vcy5Mb29wZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBsb2NhbExPR1YKLQotcHJpdmF0ZSBzdGF0aWMgYW5kcm9pZC5vcy5Mb29wZXIgbU1haW5Mb29wZXIKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlRocmVhZExvY2FsIHNUaHJlYWRMb2NhbAotCi1wcml2YXRlIGFuZHJvaWQudXRpbC5QcmludGVyIG1Mb2dnaW5nCi0KLWZpbmFsIGFuZHJvaWQub3MuTWVzc2FnZVF1ZXVlIG1RdWV1ZQotCi12b2xhdGlsZSBib29sZWFuIG1SdW4KLQotIGphdmEubGFuZy5UaHJlYWQgbVRocmVhZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5Mb29wZXIgZ2V0TWFpbkxvb3BlcigpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBsb29wKCkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLkxvb3BlciBteUxvb3BlcigpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5NZXNzYWdlUXVldWUgbXlRdWV1ZSgpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBwcmVwYXJlKCkKLQotcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHByZXBhcmVNYWluTG9vcGVyKCkKLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRNYWluTG9vcGVyKAotYW5kcm9pZC5vcy5Mb29wZXIpCi0KLXB1YmxpYyB2b2lkIGR1bXAoCi1hbmRyb2lkLnV0aWwuUHJpbnRlcgotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgcXVpdCgpCi0KLXB1YmxpYyB2b2lkIHNldE1lc3NhZ2VMb2dnaW5nKAotYW5kcm9pZC51dGlsLlByaW50ZXIpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLm9zLk1haWxib3hOb3RBdmFpbGFibGVFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuVGhyb3dhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTQxMDQgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9vcy9NZW1vcnlGaWxlOyApCi0gY2xhc3MgYW5kcm9pZC5vcy5NZW1vcnlGaWxlJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9vcy9NZW1vcnlGaWxlOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTIgbmFtZSA9TWVtb3J5SW5wdXRTdHJlYW0gKQotIGNsYXNzIGFuZHJvaWQub3MuTWVtb3J5RmlsZSRNZW1vcnlJbnB1dFN0cmVhbSBleHRlbmRzIGphdmEuaW8uSW5wdXRTdHJlYW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBpbnQgbU1hcmsKLQotcHJpdmF0ZSBpbnQgbU9mZnNldAotCi1wcml2YXRlIGJ5dGVbXSBtU2luZ2xlQnl0ZQotCi1maW5hbCBhbmRyb2lkLm9zLk1lbW9yeUZpbGUgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuTWVtb3J5RmlsZSkKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5NZW1vcnlGaWxlCi1hbmRyb2lkLm9zLk1lbW9yeUZpbGUkMSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCBhdmFpbGFibGUoKQotCi1wdWJsaWMgdm9pZCBtYXJrKAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBtYXJrU3VwcG9ydGVkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCByZWFkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCByZWFkKAotYnl0ZVtdCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcmVzZXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgbG9uZyBza2lwKAotbG9uZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTIgbmFtZSA9TWVtb3J5T3V0cHV0U3RyZWFtICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL29zL01lbW9yeUZpbGU7ICkKLSBjbGFzcyBhbmRyb2lkLm9zLk1lbW9yeUZpbGUkTWVtb3J5T3V0cHV0U3RyZWFtIGV4dGVuZHMgamF2YS5pby5PdXRwdXRTdHJlYW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBpbnQgbU9mZnNldAotCi1wcml2YXRlIGJ5dGVbXSBtU2luZ2xlQnl0ZQotCi1maW5hbCBhbmRyb2lkLm9zLk1lbW9yeUZpbGUgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuTWVtb3J5RmlsZSkKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5NZW1vcnlGaWxlCi1hbmRyb2lkLm9zLk1lbW9yeUZpbGUkMSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgd3JpdGUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHdyaXRlKAotYnl0ZVtdCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL29zL01lbW9yeUZpbGUkMTtMYW5kcm9pZC9vcy9NZW1vcnlGaWxlJE1lbW9yeU91dHB1dFN0cmVhbTtMYW5kcm9pZC9vcy9NZW1vcnlGaWxlJE1lbW9yeUlucHV0U3RyZWFtOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5vcy5NZW1vcnlGaWxlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIFRBRwotCi1wcml2YXRlIGludCBtQWRkcmVzcwotCi1wcml2YXRlIGJvb2xlYW4gbUFsbG93UHVyZ2luZwotCi1wcml2YXRlIGludCBtRkQKLQotcHJpdmF0ZSBpbnQgbUxlbmd0aAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1zdGF0aWMgaW50IGFjY2VzcyQyMDAoCi1hbmRyb2lkLm9zLk1lbW9yeUZpbGUpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlX2Nsb3NlKAotaW50KQotCi1wcml2YXRlIG5hdGl2ZSBpbnQgbmF0aXZlX21tYXAoCi1pbnQKLWludCkKLQotcHJpdmF0ZSBuYXRpdmUgaW50IG5hdGl2ZV9vcGVuKAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZV9waW4oCi1pbnQKLWJvb2xlYW4pCi0KLXByaXZhdGUgbmF0aXZlIGludCBuYXRpdmVfcmVhZCgKLWludAotaW50Ci1ieXRlW10KLWludAotaW50Ci1pbnQKLWJvb2xlYW4pCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlX3dyaXRlKAotaW50Ci1pbnQKLWJ5dGVbXQotaW50Ci1pbnQKLWludAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gYWxsb3dQdXJnaW5nKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgY2xvc2UoKQotCi1wcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpCi0KLXB1YmxpYyBqYXZhLmlvLklucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkKLQotcHVibGljIGphdmEuaW8uT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpCi0KLXB1YmxpYyBib29sZWFuIGlzUHVyZ2luZ0FsbG93ZWQoKQotCi1wdWJsaWMgaW50IGxlbmd0aCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcmVhZEJ5dGVzKAotYnl0ZVtdCi1pbnQKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB3cml0ZUJ5dGVzKAotYnl0ZVtdCi1pbnQKLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL29zL01lc3NhZ2U7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I8TGFuZHJvaWQvb3MvTWVzc2FnZTs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1maW5hbCBjbGFzcyBhbmRyb2lkLm9zLk1lc3NhZ2UkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLk1lc3NhZ2UgY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLk1lc3NhZ2VbXSBuZXdBcnJheSgKLWludCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3RbXSBuZXdBcnJheSgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLm9zLk1lc3NhZ2UgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExhbmRyb2lkL29zL01lc3NhZ2U7PjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvciBDUkVBVE9SCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfUE9PTF9TSVpFCi0KLXByaXZhdGUgc3RhdGljIGFuZHJvaWQub3MuTWVzc2FnZSBtUG9vbAotCi1wcml2YXRlIHN0YXRpYyBpbnQgbVBvb2xTaXplCi0KLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5PYmplY3QgbVBvb2xTeW5jCi0KLXB1YmxpYyBpbnQgYXJnMQotCi1wdWJsaWMgaW50IGFyZzIKLQotIGphdmEubGFuZy5SdW5uYWJsZSBjYWxsYmFjawotCi0gYW5kcm9pZC5vcy5CdW5kbGUgZGF0YQotCi0gYW5kcm9pZC5vcy5NZXNzYWdlIG5leHQKLQotcHVibGljIGphdmEubGFuZy5PYmplY3Qgb2JqCi0KLXB1YmxpYyBhbmRyb2lkLm9zLk1lc3NlbmdlciByZXBseVRvCi0KLSBhbmRyb2lkLm9zLkhhbmRsZXIgdGFyZ2V0Ci0KLXB1YmxpYyBpbnQgd2hhdAotCi0gbG9uZyB3aGVuCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMDAwKAotYW5kcm9pZC5vcy5NZXNzYWdlCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLm9zLk1lc3NhZ2Ugb2J0YWluKCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLm9zLk1lc3NhZ2Ugb2J0YWluKAotYW5kcm9pZC5vcy5IYW5kbGVyKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQub3MuTWVzc2FnZSBvYnRhaW4oCi1hbmRyb2lkLm9zLkhhbmRsZXIKLWludCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLm9zLk1lc3NhZ2Ugb2J0YWluKAotYW5kcm9pZC5vcy5IYW5kbGVyCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQub3MuTWVzc2FnZSBvYnRhaW4oCi1hbmRyb2lkLm9zLkhhbmRsZXIKLWludAotaW50Ci1pbnQKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5vcy5NZXNzYWdlIG9idGFpbigKLWFuZHJvaWQub3MuSGFuZGxlcgotaW50Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQub3MuTWVzc2FnZSBvYnRhaW4oCi1hbmRyb2lkLm9zLkhhbmRsZXIKLWphdmEubGFuZy5SdW5uYWJsZSkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLm9zLk1lc3NhZ2Ugb2J0YWluKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wcml2YXRlIGZpbmFsIHZvaWQgcmVhZEZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotIHZvaWQgY2xlYXJGb3JSZWN5Y2xlKCkKLQotcHVibGljIHZvaWQgY29weUZyb20oCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuUnVubmFibGUgZ2V0Q2FsbGJhY2soKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5CdW5kbGUgZ2V0RGF0YSgpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLkhhbmRsZXIgZ2V0VGFyZ2V0KCkKLQotcHVibGljIGxvbmcgZ2V0V2hlbigpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLkJ1bmRsZSBwZWVrRGF0YSgpCi0KLXB1YmxpYyB2b2lkIHJlY3ljbGUoKQotCi1wdWJsaWMgdm9pZCBzZW5kVG9UYXJnZXQoKQotCi1wdWJsaWMgdm9pZCBzZXREYXRhKAotYW5kcm9pZC5vcy5CdW5kbGUpCi0KLXB1YmxpYyB2b2lkIHNldFRhcmdldCgKLWFuZHJvaWQub3MuSGFuZGxlcikKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1wdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL29zL01lc3NhZ2VRdWV1ZSRJZGxlSGFuZGxlcjsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQub3MuTWVzc2FnZVF1ZXVlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5BcnJheUxpc3QgbUlkbGVIYW5kbGVycwotCi0gYW5kcm9pZC5vcy5NZXNzYWdlIG1NZXNzYWdlcwotCi0gYm9vbGVhbiBtUXVpdEFsbG93ZWQKLQotcHJpdmF0ZSBib29sZWFuIG1RdWl0aW5nCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGZpbmFsIHZvaWQgYWRkSWRsZUhhbmRsZXIoCi1hbmRyb2lkLm9zLk1lc3NhZ2VRdWV1ZSRJZGxlSGFuZGxlcikKLQotZmluYWwgYm9vbGVhbiBlbnF1ZXVlTWVzc2FnZSgKLWFuZHJvaWQub3MuTWVzc2FnZQotbG9uZykKLQotZmluYWwgYW5kcm9pZC5vcy5NZXNzYWdlIG5leHQoKQotCi0gdm9pZCBwb2tlKCkKLQotZmluYWwgYW5kcm9pZC5vcy5NZXNzYWdlIHB1bGxOZXh0TG9ja2VkKAotbG9uZykKLQotZmluYWwgdm9pZCByZW1vdmVDYWxsYmFja3NBbmRNZXNzYWdlcygKLWFuZHJvaWQub3MuSGFuZGxlcgotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlSWRsZUhhbmRsZXIoCi1hbmRyb2lkLm9zLk1lc3NhZ2VRdWV1ZSRJZGxlSGFuZGxlcikKLQotZmluYWwgdm9pZCByZW1vdmVNZXNzYWdlcygKLWFuZHJvaWQub3MuSGFuZGxlcgotamF2YS5sYW5nLlJ1bm5hYmxlCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1maW5hbCBib29sZWFuIHJlbW92ZU1lc3NhZ2VzKAotYW5kcm9pZC5vcy5IYW5kbGVyCi1pbnQKLWphdmEubGFuZy5PYmplY3QKLWJvb2xlYW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC9vcy9NZXNzZW5nZXI7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvb3MvTWVzc2VuZ2VyOyApCi1maW5hbCBjbGFzcyBhbmRyb2lkLm9zLk1lc3NlbmdlciQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGFuZHJvaWQub3MuTWVzc2VuZ2VyIGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5NZXNzZW5nZXJbXSBuZXdBcnJheSgKLWludCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3RbXSBuZXdBcnJheSgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLm9zLk1lc3NlbmdlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I8TGFuZHJvaWQvb3MvTWVzc2VuZ2VyOz47ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IgQ1JFQVRPUgotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQub3MuSU1lc3NlbmdlciBtVGFyZ2V0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLkhhbmRsZXIpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuSUJpbmRlcikKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLm9zLk1lc3NlbmdlciByZWFkTWVzc2VuZ2VyT3JOdWxsRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVNZXNzZW5nZXJPck51bGxUb1BhcmNlbCgKLWFuZHJvaWQub3MuTWVzc2VuZ2VyCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBnZXRCaW5kZXIoKQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNlbmQoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQub3MuTmV0U3RhdCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgbmV0U3RhdEdldFJ4Qnl0ZXMoKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgbmV0U3RhdEdldFJ4UGt0cygpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBuZXRTdGF0R2V0VHhCeXRlcygpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBuZXRTdGF0R2V0VHhQa3RzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL29zL1BhcmNlbDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotZmluYWwgY2xhc3MgYW5kcm9pZC5vcy5QYXJjZWwkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdFtdIG5ld0FycmF5KAotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIG5ld0FycmF5KAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQub3MuUGFyY2VsIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX1JFQ1lDTEUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVYX0JBRF9QQVJDRUxBQkxFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFWF9JTExFR0FMX0FSR1VNRU5UCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFWF9JTExFR0FMX1NUQVRFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFWF9OVUxMX1BPSU5URVIKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVYX1NFQ1VSSVRZCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQT09MX1NJWkUKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I8TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvciBTVFJJTkdfQ1JFQVRPUgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVkFMX0JPT0xFQU4KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZBTF9CT09MRUFOQVJSQVkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZBTF9CVU5ETEUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZBTF9CWVRFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWQUxfQllURUFSUkFZCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWQUxfQ0hBUlNFUVVFTkNFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWQUxfRE9VQkxFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWQUxfRkxPQVQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZBTF9JQklOREVSCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWQUxfSU5UQVJSQVkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZBTF9JTlRFR0VSCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWQUxfTElTVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVkFMX0xPTkcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZBTF9MT05HQVJSQVkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZBTF9NQVAKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZBTF9OVUxMCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWQUxfT0JKRUNUQVJSQVkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZBTF9QQVJDRUxBQkxFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWQUxfUEFSQ0VMQUJMRUFSUkFZCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWQUxfU0VSSUFMSVpBQkxFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWQUxfU0hPUlQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZBTF9TUEFSU0VBUlJBWQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVkFMX1NQQVJTRUJPT0xFQU5BUlJBWQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVkFMX1NUUklORwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVkFMX1NUUklOR0FSUkFZCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNoTWFwPExqYXZhL2xhbmcvQ2xhc3NMb2FkZXI7TGphdmEvdXRpbC9IYXNoTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjs+Oz47ICkKLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEudXRpbC5IYXNoTWFwIG1DcmVhdG9ycwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLlBhcmNlbFtdIHNIb2xkZXJQb29sCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsW10gc093bmVkUG9vbAotCi1wcml2YXRlIGludCBtT2JqZWN0Ci0KLXByaXZhdGUgaW50IG1Pd25PYmplY3QKLQotcHJpdmF0ZSBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiBtU3RhY2sKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXN0YXRpYyBuYXRpdmUgdm9pZCBjbG9zZUZpbGVEZXNjcmlwdG9yKAotamF2YS5pby5GaWxlRGVzY3JpcHRvcikKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBkZXN0cm95KCkKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBmcmVlQnVmZmVyKCkKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBpbml0KAotaW50KQotCi1wcml2YXRlIG5hdGl2ZSBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yIGludGVybmFsUmVhZEZpbGVEZXNjcmlwdG9yKCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLm9zLlBhcmNlbCBvYnRhaW4oKQotCi1wcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsIG9idGFpbigKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9GaWxlTm90Rm91bmRFeGNlcHRpb247ICkKLXN0YXRpYyBuYXRpdmUgamF2YS5pby5GaWxlRGVzY3JpcHRvciBvcGVuRmlsZURlc2NyaXB0b3IoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXByaXZhdGUgdm9pZCByZWFkQXJyYXlJbnRlcm5hbCgKLWphdmEubGFuZy5PYmplY3RbXQotaW50Ci1qYXZhLmxhbmcuQ2xhc3NMb2FkZXIpCi0KLXByaXZhdGUgdm9pZCByZWFkTGlzdEludGVybmFsKAotamF2YS51dGlsLkxpc3QKLWludAotamF2YS5sYW5nLkNsYXNzTG9hZGVyKQotCi1wcml2YXRlIHZvaWQgcmVhZE1hcEludGVybmFsKAotamF2YS51dGlsLk1hcAotaW50Ci1qYXZhLmxhbmcuQ2xhc3NMb2FkZXIpCi0KLXByaXZhdGUgdm9pZCByZWFkU3BhcnNlQXJyYXlJbnRlcm5hbCgKLWFuZHJvaWQudXRpbC5TcGFyc2VBcnJheQotaW50Ci1qYXZhLmxhbmcuQ2xhc3NMb2FkZXIpCi0KLXByaXZhdGUgdm9pZCByZWFkU3BhcnNlQm9vbGVhbkFycmF5SW50ZXJuYWwoCi1hbmRyb2lkLnV0aWwuU3BhcnNlQm9vbGVhbkFycmF5Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvT2JqZWN0Oz47KVYgKQotcHJpdmF0ZSB2b2lkIHdyaXRlTWFwSW50ZXJuYWwoCi1qYXZhLnV0aWwuTWFwKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIHdyaXRlTmF0aXZlKAotYnl0ZVtdCi1pbnQKLWludCkKLQotcHVibGljIGZpbmFsIG5hdGl2ZSB2b2lkIGFwcGVuZEZyb20oCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50Ci1pbnQpCi0KLXB1YmxpYyBmaW5hbCBhbmRyb2lkLm9zLklCaW5kZXJbXSBjcmVhdGVCaW5kZXJBcnJheSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0FycmF5TGlzdDxMYW5kcm9pZC9vcy9JQmluZGVyOz47ICkKLXB1YmxpYyBmaW5hbCBqYXZhLnV0aWwuQXJyYXlMaXN0IGNyZWF0ZUJpbmRlckFycmF5TGlzdCgpCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuW10gY3JlYXRlQm9vbGVhbkFycmF5KCkKLQotcHVibGljIGZpbmFsIG5hdGl2ZSBieXRlW10gY3JlYXRlQnl0ZUFycmF5KCkKLQotcHVibGljIGZpbmFsIGNoYXJbXSBjcmVhdGVDaGFyQXJyYXkoKQotCi1wdWJsaWMgZmluYWwgZG91YmxlW10gY3JlYXRlRG91YmxlQXJyYXkoKQotCi1wdWJsaWMgZmluYWwgZmxvYXRbXSBjcmVhdGVGbG9hdEFycmF5KCkKLQotcHVibGljIGZpbmFsIGludFtdIGNyZWF0ZUludEFycmF5KCkKLQotcHVibGljIGZpbmFsIGxvbmdbXSBjcmVhdGVMb25nQXJyYXkoKQotCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLlN0cmluZ1tdIGNyZWF0ZVN0cmluZ0FycmF5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvQXJyYXlMaXN0PExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXB1YmxpYyBmaW5hbCBqYXZhLnV0aWwuQXJyYXlMaXN0IGNyZWF0ZVN0cmluZ0FycmF5TGlzdCgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFQ6TGphdmEvbGFuZy9PYmplY3Q7PihMYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I8VFQ7PjspW1RUOyApCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLk9iamVjdFtdIGNyZWF0ZVR5cGVkQXJyYXkoCi1hbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+KExhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxUVDs+OylMamF2YS91dGlsL0FycmF5TGlzdDxUVDs+OyApCi1wdWJsaWMgZmluYWwgamF2YS51dGlsLkFycmF5TGlzdCBjcmVhdGVUeXBlZEFycmF5TGlzdCgKLWFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yKQotCi1wdWJsaWMgZmluYWwgbmF0aXZlIGludCBkYXRhQXZhaWwoKQotCi1wdWJsaWMgZmluYWwgbmF0aXZlIGludCBkYXRhQ2FwYWNpdHkoKQotCi1wdWJsaWMgZmluYWwgbmF0aXZlIGludCBkYXRhUG9zaXRpb24oKQotCi1wdWJsaWMgZmluYWwgbmF0aXZlIGludCBkYXRhU2l6ZSgpCi0KLXB1YmxpYyBmaW5hbCBuYXRpdmUgdm9pZCBlbmZvcmNlSW50ZXJmYWNlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL1Rocm93YWJsZTsgKQotcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKQotCi1wdWJsaWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gaGFzRmlsZURlc2NyaXB0b3JzKCkKLQotcHVibGljIGZpbmFsIG5hdGl2ZSBieXRlW10gbWFyc2hhbGwoKQotCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLk9iamVjdFtdIHJlYWRBcnJheSgKLWphdmEubGFuZy5DbGFzc0xvYWRlcikKLQotcHVibGljIGZpbmFsIGphdmEudXRpbC5BcnJheUxpc3QgcmVhZEFycmF5TGlzdCgKLWphdmEubGFuZy5DbGFzc0xvYWRlcikKLQotcHVibGljIGZpbmFsIHZvaWQgcmVhZEJpbmRlckFycmF5KAotYW5kcm9pZC5vcy5JQmluZGVyW10pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9vcy9JQmluZGVyOz47KVYgKQotcHVibGljIGZpbmFsIHZvaWQgcmVhZEJpbmRlckxpc3QoCi1qYXZhLnV0aWwuTGlzdCkKLQotcHVibGljIGZpbmFsIHZvaWQgcmVhZEJvb2xlYW5BcnJheSgKLWJvb2xlYW5bXSkKLQotcHVibGljIGZpbmFsIGFuZHJvaWQub3MuQnVuZGxlIHJlYWRCdW5kbGUoKQotCi1wdWJsaWMgZmluYWwgYW5kcm9pZC5vcy5CdW5kbGUgcmVhZEJ1bmRsZSgKLWphdmEubGFuZy5DbGFzc0xvYWRlcikKLQotIGFuZHJvaWQub3MuQnVuZGxlIHJlYWRCdW5kbGVVbnBhY2tlZCgKLWphdmEubGFuZy5DbGFzc0xvYWRlcikKLQotcHVibGljIGZpbmFsIGJ5dGUgcmVhZEJ5dGUoKQotCi1wdWJsaWMgZmluYWwgdm9pZCByZWFkQnl0ZUFycmF5KAotYnl0ZVtdKQotCi1wdWJsaWMgZmluYWwgdm9pZCByZWFkQ2hhckFycmF5KAotY2hhcltdKQotCi1wdWJsaWMgZmluYWwgbmF0aXZlIGRvdWJsZSByZWFkRG91YmxlKCkKLQotcHVibGljIGZpbmFsIHZvaWQgcmVhZERvdWJsZUFycmF5KAotZG91YmxlW10pCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHJlYWRFeGNlcHRpb24oKQotCi1wdWJsaWMgZmluYWwgdm9pZCByZWFkRXhjZXB0aW9uKAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciByZWFkRmlsZURlc2NyaXB0b3IoKQotCi1wdWJsaWMgZmluYWwgbmF0aXZlIGZsb2F0IHJlYWRGbG9hdCgpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHJlYWRGbG9hdEFycmF5KAotZmxvYXRbXSkKLQotcHVibGljIGZpbmFsIGphdmEudXRpbC5IYXNoTWFwIHJlYWRIYXNoTWFwKAotamF2YS5sYW5nLkNsYXNzTG9hZGVyKQotCi1wdWJsaWMgZmluYWwgbmF0aXZlIGludCByZWFkSW50KCkKLQotcHVibGljIGZpbmFsIHZvaWQgcmVhZEludEFycmF5KAotaW50W10pCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHJlYWRMaXN0KAotamF2YS51dGlsLkxpc3QKLWphdmEubGFuZy5DbGFzc0xvYWRlcikKLQotcHVibGljIGZpbmFsIG5hdGl2ZSBsb25nIHJlYWRMb25nKCkKLQotcHVibGljIGZpbmFsIHZvaWQgcmVhZExvbmdBcnJheSgKLWxvbmdbXSkKLQotcHVibGljIGZpbmFsIHZvaWQgcmVhZE1hcCgKLWphdmEudXRpbC5NYXAKLWphdmEubGFuZy5DbGFzc0xvYWRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDo6TGFuZHJvaWQvb3MvUGFyY2VsYWJsZTs+KExqYXZhL2xhbmcvQ2xhc3NMb2FkZXI7KVRUOyApCi1wdWJsaWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlIHJlYWRQYXJjZWxhYmxlKAotamF2YS5sYW5nLkNsYXNzTG9hZGVyKQotCi1wdWJsaWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlW10gcmVhZFBhcmNlbGFibGVBcnJheSgKLWphdmEubGFuZy5DbGFzc0xvYWRlcikKLQotcHVibGljIGZpbmFsIGphdmEuaW8uU2VyaWFsaXphYmxlIHJlYWRTZXJpYWxpemFibGUoKQotCi1wdWJsaWMgZmluYWwgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5IHJlYWRTcGFyc2VBcnJheSgKLWphdmEubGFuZy5DbGFzc0xvYWRlcikKLQotcHVibGljIGZpbmFsIGFuZHJvaWQudXRpbC5TcGFyc2VCb29sZWFuQXJyYXkgcmVhZFNwYXJzZUJvb2xlYW5BcnJheSgpCi0KLXB1YmxpYyBmaW5hbCBuYXRpdmUgamF2YS5sYW5nLlN0cmluZyByZWFkU3RyaW5nKCkKLQotcHVibGljIGZpbmFsIHZvaWQgcmVhZFN0cmluZ0FycmF5KAotamF2YS5sYW5nLlN0cmluZ1tdKQotCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLlN0cmluZ1tdIHJlYWRTdHJpbmdBcnJheSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTGlzdDxMamF2YS9sYW5nL1N0cmluZzs+OylWICkKLXB1YmxpYyBmaW5hbCB2b2lkIHJlYWRTdHJpbmdMaXN0KAotamF2YS51dGlsLkxpc3QpCi0KLXB1YmxpYyBmaW5hbCBuYXRpdmUgYW5kcm9pZC5vcy5JQmluZGVyIHJlYWRTdHJvbmdCaW5kZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz4oW1RUO0xhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxUVDs+OylWICkKLXB1YmxpYyBmaW5hbCB2b2lkIHJlYWRUeXBlZEFycmF5KAotamF2YS5sYW5nLk9iamVjdFtdCi1hbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvcikKLUBqYXZhLmxhbmcuRGVwcmVjYXRlZAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz4oTGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPFRUOz47KVtUVDsgKQotcHVibGljIGZpbmFsIGphdmEubGFuZy5PYmplY3RbXSByZWFkVHlwZWRBcnJheSgKLWFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz4oTGphdmEvdXRpbC9MaXN0PFRUOz47TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPFRUOz47KVYgKQotcHVibGljIGZpbmFsIHZvaWQgcmVhZFR5cGVkTGlzdCgKLWphdmEudXRpbC5MaXN0Ci1hbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvcikKLQotcHVibGljIGZpbmFsIGphdmEubGFuZy5PYmplY3QgcmVhZFZhbHVlKAotamF2YS5sYW5nLkNsYXNzTG9hZGVyKQotCi1wdWJsaWMgZmluYWwgdm9pZCByZWN5Y2xlKCkKLQotcHVibGljIGZpbmFsIG5hdGl2ZSB2b2lkIHNldERhdGFDYXBhY2l0eSgKLWludCkKLQotcHVibGljIGZpbmFsIG5hdGl2ZSB2b2lkIHNldERhdGFQb3NpdGlvbigKLWludCkKLQotcHVibGljIGZpbmFsIG5hdGl2ZSB2b2lkIHNldERhdGFTaXplKAotaW50KQotCi1wdWJsaWMgZmluYWwgbmF0aXZlIHZvaWQgdW5tYXJzaGFsbCgKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlQXJyYXkoCi1qYXZhLmxhbmcuT2JqZWN0W10pCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlQmluZGVyQXJyYXkoCi1hbmRyb2lkLm9zLklCaW5kZXJbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL29zL0lCaW5kZXI7PjspViApCi1wdWJsaWMgZmluYWwgdm9pZCB3cml0ZUJpbmRlckxpc3QoCi1qYXZhLnV0aWwuTGlzdCkKLQotcHVibGljIGZpbmFsIHZvaWQgd3JpdGVCb29sZWFuQXJyYXkoCi1ib29sZWFuW10pCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlQnVuZGxlKAotYW5kcm9pZC5vcy5CdW5kbGUpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlQnl0ZSgKLWJ5dGUpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlQnl0ZUFycmF5KAotYnl0ZVtdKQotCi1wdWJsaWMgZmluYWwgdm9pZCB3cml0ZUJ5dGVBcnJheSgKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlQ2hhckFycmF5KAotY2hhcltdKQotCi1wdWJsaWMgZmluYWwgbmF0aXZlIHZvaWQgd3JpdGVEb3VibGUoCi1kb3VibGUpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlRG91YmxlQXJyYXkoCi1kb3VibGVbXSkKLQotcHVibGljIGZpbmFsIHZvaWQgd3JpdGVFeGNlcHRpb24oCi1qYXZhLmxhbmcuRXhjZXB0aW9uKQotCi1wdWJsaWMgZmluYWwgbmF0aXZlIHZvaWQgd3JpdGVGaWxlRGVzY3JpcHRvcigKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IpCi0KLXB1YmxpYyBmaW5hbCBuYXRpdmUgdm9pZCB3cml0ZUZsb2F0KAotZmxvYXQpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlRmxvYXRBcnJheSgKLWZsb2F0W10pCi0KLXB1YmxpYyBmaW5hbCBuYXRpdmUgdm9pZCB3cml0ZUludCgKLWludCkKLQotcHVibGljIGZpbmFsIHZvaWQgd3JpdGVJbnRBcnJheSgKLWludFtdKQotCi1wdWJsaWMgZmluYWwgbmF0aXZlIHZvaWQgd3JpdGVJbnRlcmZhY2VUb2tlbigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlTGlzdCgKLWphdmEudXRpbC5MaXN0KQotCi1wdWJsaWMgZmluYWwgbmF0aXZlIHZvaWQgd3JpdGVMb25nKAotbG9uZykKLQotcHVibGljIGZpbmFsIHZvaWQgd3JpdGVMb25nQXJyYXkoCi1sb25nW10pCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlTWFwKAotamF2YS51dGlsLk1hcCkKLQotcHVibGljIGZpbmFsIHZvaWQgd3JpdGVOb0V4Y2VwdGlvbigpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlUGFyY2VsYWJsZSgKLWFuZHJvaWQub3MuUGFyY2VsYWJsZQotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOjpMYW5kcm9pZC9vcy9QYXJjZWxhYmxlOz4oW1RUO0kpViApCi1wdWJsaWMgZmluYWwgdm9pZCB3cml0ZVBhcmNlbGFibGVBcnJheSgKLWFuZHJvaWQub3MuUGFyY2VsYWJsZVtdCi1pbnQpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlU2VyaWFsaXphYmxlKAotamF2YS5pby5TZXJpYWxpemFibGUpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExhbmRyb2lkL3V0aWwvU3BhcnNlQXJyYXk8TGphdmEvbGFuZy9PYmplY3Q7PjspViApCi1wdWJsaWMgZmluYWwgdm9pZCB3cml0ZVNwYXJzZUFycmF5KAotYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5KQotCi1wdWJsaWMgZmluYWwgdm9pZCB3cml0ZVNwYXJzZUJvb2xlYW5BcnJheSgKLWFuZHJvaWQudXRpbC5TcGFyc2VCb29sZWFuQXJyYXkpCi0KLXB1YmxpYyBmaW5hbCBuYXRpdmUgdm9pZCB3cml0ZVN0cmluZygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlU3RyaW5nQXJyYXkoCi1qYXZhLmxhbmcuU3RyaW5nW10pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTGlzdDxMamF2YS9sYW5nL1N0cmluZzs+OylWICkKLXB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlU3RyaW5nTGlzdCgKLWphdmEudXRpbC5MaXN0KQotCi1wdWJsaWMgZmluYWwgbmF0aXZlIHZvaWQgd3JpdGVTdHJvbmdCaW5kZXIoCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlU3Ryb25nSW50ZXJmYWNlKAotYW5kcm9pZC5vcy5JSW50ZXJmYWNlKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOjpMYW5kcm9pZC9vcy9QYXJjZWxhYmxlOz4oW1RUO0kpViApCi1wdWJsaWMgZmluYWwgdm9pZCB3cml0ZVR5cGVkQXJyYXkoCi1hbmRyb2lkLm9zLlBhcmNlbGFibGVbXQotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOjpMYW5kcm9pZC9vcy9QYXJjZWxhYmxlOz4oTGphdmEvdXRpbC9MaXN0PFRUOz47KVYgKQotcHVibGljIGZpbmFsIHZvaWQgd3JpdGVUeXBlZExpc3QoCi1qYXZhLnV0aWwuTGlzdCkKLQotcHVibGljIGZpbmFsIHZvaWQgd3JpdGVWYWx1ZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC9vcy9QYXJjZWxGaWxlRGVzY3JpcHRvcjs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9vcy9QYXJjZWxGaWxlRGVzY3JpcHRvcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotZmluYWwgY2xhc3MgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IgY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yW10gbmV3QXJyYXkoCi1pbnQpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0W10gbmV3QXJyYXkoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPUF1dG9DbG9zZUlucHV0U3RyZWFtICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL29zL1BhcmNlbEZpbGVEZXNjcmlwdG9yOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciRBdXRvQ2xvc2VJbnB1dFN0cmVhbSBleHRlbmRzIGphdmEuaW8uRmlsZUlucHV0U3RyZWFtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciBtRmQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjbG9zZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPUF1dG9DbG9zZU91dHB1dFN0cmVhbSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9vcy9QYXJjZWxGaWxlRGVzY3JpcHRvcjsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IkQXV0b0Nsb3NlT3V0cHV0U3RyZWFtIGV4dGVuZHMgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciBtRmQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjbG9zZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5vcy5QYXJjZWxGb3JtYXRFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC9vcy9QYXR0ZXJuTWF0Y2hlcjs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9vcy9QYXR0ZXJuTWF0Y2hlcjsgKQotZmluYWwgY2xhc3MgYW5kcm9pZC5vcy5QYXR0ZXJuTWF0Y2hlciQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGFuZHJvaWQub3MuUGF0dGVybk1hdGNoZXIgY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLlBhdHRlcm5NYXRjaGVyW10gbmV3QXJyYXkoCi1pbnQpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0W10gbmV3QXJyYXkoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5vcy5QYXR0ZXJuTWF0Y2hlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I8TGFuZHJvaWQvb3MvUGF0dGVybk1hdGNoZXI7PjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvciBDUkVBVE9SCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBVFRFUk5fTElURVJBTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVRURVJOX1BSRUZJWAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVRURVJOX1NJTVBMRV9HTE9CCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBtUGF0dGVybgotCi1wcml2YXRlIGZpbmFsIGludCBtVHlwZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotc3RhdGljIGJvb2xlYW4gbWF0Y2hQYXR0ZXJuKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKQotCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBnZXRQYXRoKCkKLQotcHVibGljIGZpbmFsIGludCBnZXRUeXBlKCkKLQotcHVibGljIGJvb2xlYW4gbWF0Y2goCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLXB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQub3MuUG93ZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFMTF9MSUdIVFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlJJR0hUTkVTU19ESU0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlJJR0hUTkVTU19MT1dfQkFUVEVSWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCUklHSFRORVNTX09GRgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCUklHSFRORVNTX09OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJVVFRPTl9MSUdIVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGVUxMX1dBS0VfTE9DSwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlCT0FSRF9MSUdIVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT1dfQkFUVEVSWV9USFJFU0hPTEQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFSVElBTF9XQUtFX0xPQ0sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NSRUVOX0xJR0hUCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgYWNxdWlyZVdha2VMb2NrKAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHJlYm9vdCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgcmVsZWFzZVdha2VMb2NrKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IHNldExhc3RVc2VyQWN0aXZpdHlUaW1lb3V0KAotbG9uZykKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IHNldExpZ2h0QnJpZ2h0bmVzcygKLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgc2V0U2NyZWVuU3RhdGUoCi1ib29sZWFuKQotQGphdmEubGFuZy5EZXByZWNhdGVkCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHNodXRkb3duKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9vcy9Qb3dlck1hbmFnZXIkV2FrZUxvY2s7ICkKLSBjbGFzcyBhbmRyb2lkLm9zLlBvd2VyTWFuYWdlciRXYWtlTG9jayQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5SdW5uYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLm9zLlBvd2VyTWFuYWdlciRXYWtlTG9jayB0aGlzJDEKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLlBvd2VyTWFuYWdlciRXYWtlTG9jaykKLQotcHVibGljIHZvaWQgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEgbmFtZSA9V2FrZUxvY2sgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUG93ZXJNYW5hZ2VyOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5vcy5Qb3dlck1hbmFnZXIkV2FrZUxvY2sgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBmaW5hbCBpbnQgUkVMRUFTRV9XQUtFX0xPQ0sKLQotIGludCBtQ291bnQKLQotIGludCBtRmxhZ3MKLQotIGJvb2xlYW4gbUhlbGQKLQotIGJvb2xlYW4gbVJlZkNvdW50ZWQKLQotIGphdmEubGFuZy5SdW5uYWJsZSBtUmVsZWFzZXIKLQotIGphdmEubGFuZy5TdHJpbmcgbVRhZwotCi0gYW5kcm9pZC5vcy5JQmluZGVyIG1Ub2tlbgotCi1maW5hbCBhbmRyb2lkLm9zLlBvd2VyTWFuYWdlciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLlBvd2VyTWFuYWdlcgotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBhY3F1aXJlKCkKLQotcHVibGljIHZvaWQgYWNxdWlyZSgKLWxvbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9UaHJvd2FibGU7ICkKLXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkKLQotcHVibGljIGJvb2xlYW4gaXNIZWxkKCkKLQotcHVibGljIHZvaWQgcmVsZWFzZSgpCi0KLXB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZUNvdW50ZWQoCi1ib29sZWFuKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9vcy9Qb3dlck1hbmFnZXIkV2FrZUxvY2s7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLm9zLlBvd2VyTWFuYWdlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNRVUlSRV9DQVVTRVNfV0FLRVVQCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZVTExfV0FLRV9MT0NLCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMT0NLX01BU0sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT05fQUZURVJfUkVMRUFTRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVJUSUFMX1dBS0VfTE9DSwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ1JFRU5fQlJJR0hUX1dBS0VfTE9DSwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ1JFRU5fRElNX1dBS0VfTE9DSwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRBRwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0FLRV9CSVRfQ1BVX1NUUk9ORwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0FLRV9CSVRfQ1BVX1dFQUsKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdBS0VfQklUX0tFWUJPQVJEX0JSSUdIVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0FLRV9CSVRfU0NSRUVOX0JSSUdIVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0FLRV9CSVRfU0NSRUVOX0RJTQotCi0gYW5kcm9pZC5vcy5IYW5kbGVyIG1IYW5kbGVyCi0KLSBhbmRyb2lkLm9zLklQb3dlck1hbmFnZXIgbVNlcnZpY2UKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5JUG93ZXJNYW5hZ2VyCi1hbmRyb2lkLm9zLkhhbmRsZXIpCi0KLXB1YmxpYyB2b2lkIGdvVG9TbGVlcCgKLWxvbmcpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLlBvd2VyTWFuYWdlciRXYWtlTG9jayBuZXdXYWtlTG9jaygKLWludAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgdXNlckFjdGl2aXR5KAotbG9uZwotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1maW5hbCBjbGFzcyBhbmRyb2lkLm9zLlByb2Nlc3MkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmxhbmcuUnVubmFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgamF2YS5sYW5nLlN0cmluZyB2YWwkcHJvY2Vzc0NsYXNzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLm9zLlByb2Nlc3MgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBTkRST0lEX1NIQVJFRF9NRURJQQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCTFVFVE9PVEhfR0lECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJUlNUX0FQUExJQ0FUSU9OX1VJRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgR09PR0xFX1NIQVJFRF9BUFBfQ09OVEVOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMQVNUX0FQUExJQ0FUSU9OX1VJRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIExPR19UQUcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEhPTkVfVUlECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST0NfQ09NQklORQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9DX09VVF9GTE9BVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9DX09VVF9MT05HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST0NfT1VUX1NUUklORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9DX1BBUkVOUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9DX1NQQUNFX1RFUk0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPQ19URVJNX01BU0sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPQ19aRVJPX1RFUk0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0lHTkFMX0tJTEwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0lHTkFMX1FVSVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0lHTkFMX1VTUjEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1lTVEVNX1VJRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUSFJFQURfUFJJT1JJVFlfQVVESU8KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEhSRUFEX1BSSU9SSVRZX0JBQ0tHUk9VTkQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEhSRUFEX1BSSU9SSVRZX0RFRkFVTFQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEhSRUFEX1BSSU9SSVRZX0RJU1BMQVkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEhSRUFEX1BSSU9SSVRZX0ZPUkVHUk9VTkQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEhSRUFEX1BSSU9SSVRZX0xFU1NfRkFWT1JBQkxFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRIUkVBRF9QUklPUklUWV9MT1dFU1QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEhSRUFEX1BSSU9SSVRZX01PUkVfRkFWT1JBQkxFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRIUkVBRF9QUklPUklUWV9VUkdFTlRfQVVESU8KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEhSRUFEX1BSSU9SSVRZX1VSR0VOVF9ESVNQTEFZCi0KLXN0YXRpYyBmaW5hbCBpbnQgWllHT1RFX1JFVFJZX01JTExJUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFpZR09URV9TT0NLRVQKLQotc3RhdGljIGJvb2xlYW4gc1ByZXZpb3VzWnlnb3RlT3BlbkZhaWxlZAotCi1zdGF0aWMgamF2YS5pby5EYXRhSW5wdXRTdHJlYW0gc1p5Z290ZUlucHV0U3RyZWFtCi0KLXN0YXRpYyBhbmRyb2lkLm5ldC5Mb2NhbFNvY2tldCBzWnlnb3RlU29ja2V0Ci0KLXN0YXRpYyBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyIHNaeWdvdGVXcml0ZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMDAwKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgbG9uZyBnZXRFbGFwc2VkQ3B1VGltZSgpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBnZXRGcmVlTWVtb3J5KCkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGdldEdpZEZvck5hbWUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnRbXSBnZXRQaWRzKAotamF2YS5sYW5nLlN0cmluZwotaW50W10pCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGxvbmcgZ2V0UHNzKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2V0VGhyZWFkUHJpb3JpdHkoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBnZXRVaWRGb3JOYW1lKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbnZva2VTdGF0aWNNYWluKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIGtpbGxQcm9jZXNzKAotaW50KQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgbXlQaWQoKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgbXlUaWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1p5Z290ZVN0YXJ0RmFpbGVkRXg7ICkKLXByaXZhdGUgc3RhdGljIHZvaWQgb3Blblp5Z290ZVNvY2tldElmTmVlZGVkKCkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiByZWFkUHJvY0ZpbGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnRbXQotamF2YS5sYW5nLlN0cmluZ1tdCi1sb25nW10KLWZsb2F0W10pCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgcmVhZFByb2NMaW5lcygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmdbXQotbG9uZ1tdKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIHNlbmRTaWduYWwoCi1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBzZXRBcmdWMCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBzZXRHaWQoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gc2V0T29tQWRqKAotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247TGphdmEvbGFuZy9TZWN1cml0eUV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBzZXRUaHJlYWRQcmlvcml0eSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjtMamF2YS9sYW5nL1NlY3VyaXR5RXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIHNldFRocmVhZFByaW9yaXR5KAotaW50Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBzZXRVaWQoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXJ0KAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQKLWludFtdCi1ib29sZWFuCi1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXJ0KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQKLWludFtdCi1ib29sZWFuCi1qYXZhLmxhbmcuU3RyaW5nW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvWnlnb3RlU3RhcnRGYWlsZWRFeDsgKQotcHJpdmF0ZSBzdGF0aWMgaW50IHN0YXJ0VmlhWnlnb3RlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQKLWludFtdCi1ib29sZWFuCi1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gc3VwcG9ydHNQcm9jZXNzZXMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1p5Z290ZVN0YXJ0RmFpbGVkRXg7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9BcnJheUxpc3Q8TGphdmEvbGFuZy9TdHJpbmc7PjspSSApCi1wcml2YXRlIHN0YXRpYyBpbnQgenlnb3RlU2VuZEFyZ3NBbmRHZXRQaWQoCi1qYXZhLnV0aWwuQXJyYXlMaXN0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQub3MuUmVnaXN0cmFudCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZSByZWZICi0KLSBqYXZhLmxhbmcuT2JqZWN0IHVzZXJPYmoKLQotIGludCB3aGF0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5IYW5kbGVyCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2lkIGNsZWFyKCkKLQotcHVibGljIGFuZHJvaWQub3MuSGFuZGxlciBnZXRIYW5kbGVyKCkKLQotIHZvaWQgaW50ZXJuYWxOb3RpZnlSZWdpc3RyYW50KAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLlRocm93YWJsZSkKLQotcHVibGljIGFuZHJvaWQub3MuTWVzc2FnZSBtZXNzYWdlRm9yUmVnaXN0cmFudCgpCi0KLXB1YmxpYyB2b2lkIG5vdGlmeUV4Y2VwdGlvbigKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLXB1YmxpYyB2b2lkIG5vdGlmeVJlZ2lzdHJhbnQoKQotCi1wdWJsaWMgdm9pZCBub3RpZnlSZWdpc3RyYW50KAotYW5kcm9pZC5vcy5Bc3luY1Jlc3VsdCkKLQotcHVibGljIHZvaWQgbm90aWZ5UmVzdWx0KAotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLm9zLlJlZ2lzdHJhbnRMaXN0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gamF2YS51dGlsLkFycmF5TGlzdCByZWdpc3RyYW50cwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgdm9pZCBpbnRlcm5hbE5vdGlmeVJlZ2lzdHJhbnRzKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLlRocm93YWJsZSkKLQotcHVibGljIHZvaWQgYWRkKAotYW5kcm9pZC5vcy5IYW5kbGVyCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2lkIGFkZCgKLWFuZHJvaWQub3MuUmVnaXN0cmFudCkKLQotcHVibGljIHZvaWQgYWRkVW5pcXVlKAotYW5kcm9pZC5vcy5IYW5kbGVyCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldCgKLWludCkKLQotcHVibGljIHZvaWQgbm90aWZ5RXhjZXB0aW9uKAotamF2YS5sYW5nLlRocm93YWJsZSkKLQotcHVibGljIHZvaWQgbm90aWZ5UmVnaXN0cmFudHMoKQotCi1wdWJsaWMgdm9pZCBub3RpZnlSZWdpc3RyYW50cygKLWFuZHJvaWQub3MuQXN5bmNSZXN1bHQpCi0KLXB1YmxpYyB2b2lkIG5vdGlmeVJlc3VsdCgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2lkIHJlbW92ZSgKLWFuZHJvaWQub3MuSGFuZGxlcikKLQotcHVibGljIHZvaWQgcmVtb3ZlQ2xlYXJlZCgpCi0KLXB1YmxpYyBpbnQgc2l6ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xOCBuYW1lID1DYWxsYmFjayApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVDYWxsYmFja0xpc3Q7ICkKLWZpbmFsIGNsYXNzIGFuZHJvaWQub3MuUmVtb3RlQ2FsbGJhY2tMaXN0JENhbGxiYWNrIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuSUJpbmRlciREZWF0aFJlY2lwaWVudAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPVRFOyApCi1maW5hbCBhbmRyb2lkLm9zLklJbnRlcmZhY2UgbUNhbGxiYWNrCi0KLWZpbmFsIGFuZHJvaWQub3MuUmVtb3RlQ2FsbGJhY2tMaXN0IHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRFOylWICkKLSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuUmVtb3RlQ2FsbGJhY2tMaXN0Ci1hbmRyb2lkLm9zLklJbnRlcmZhY2UpCi0KLXB1YmxpYyB2b2lkIGJpbmRlckRpZWQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlQ2FsbGJhY2tMaXN0JENhbGxiYWNrOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEU6OkxhbmRyb2lkL29zL0lJbnRlcmZhY2U7PkxqYXZhL2xhbmcvT2JqZWN0OyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5vcy5SZW1vdGVDYWxsYmFja0xpc3QgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5JSW50ZXJmYWNlW10gbUFjdGl2ZUJyb2FkY2FzdAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaE1hcDxMYW5kcm9pZC9vcy9JQmluZGVyO0xhbmRyb2lkL29zL1JlbW90ZUNhbGxiYWNrTGlzdDxURTs+LkNhbGxiYWNrOz47ICkKLSBqYXZhLnV0aWwuSGFzaE1hcCBtQ2FsbGJhY2tzCi0KLXByaXZhdGUgYm9vbGVhbiBtS2lsbGVkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGludCBiZWdpbkJyb2FkY2FzdCgpCi0KLXB1YmxpYyB2b2lkIGZpbmlzaEJyb2FkY2FzdCgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KEkpVEU7ICkKLXB1YmxpYyBhbmRyb2lkLm9zLklJbnRlcmZhY2UgZ2V0QnJvYWRjYXN0SXRlbSgKLWludCkKLQotcHVibGljIHZvaWQga2lsbCgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRFOylWICkKLXB1YmxpYyB2b2lkIG9uQ2FsbGJhY2tEaWVkKAotYW5kcm9pZC5vcy5JSW50ZXJmYWNlKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShURTspWiApCi1wdWJsaWMgYm9vbGVhbiByZWdpc3RlcigKLWFuZHJvaWQub3MuSUludGVyZmFjZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEU7KVogKQotcHVibGljIGJvb2xlYW4gdW5yZWdpc3RlcigKLWFuZHJvaWQub3MuSUludGVyZmFjZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLm9zLlJlbW90ZU1haWxFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRBRwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaE1hcDxMamF2YS9sYW5nL1N0cmluZztMYW5kcm9pZC9vcy9JQmluZGVyOz47ICkKLXByaXZhdGUgc3RhdGljIGphdmEudXRpbC5IYXNoTWFwIHNDYWNoZQotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLm9zLklTZXJ2aWNlTWFuYWdlciBzU2VydmljZU1hbmFnZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRTZXJ2aWNlKAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQub3MuSUJpbmRlciBjaGVja1NlcnZpY2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLm9zLklTZXJ2aWNlTWFuYWdlciBnZXRJU2VydmljZU1hbmFnZXIoKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQub3MuSUJpbmRlciBnZXRTZXJ2aWNlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TGFuZHJvaWQvb3MvSUJpbmRlcjs+OylWICkKLXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0U2VydmljZUNhY2hlKAotamF2YS51dGlsLk1hcCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZ1tdIGxpc3RTZXJ2aWNlcygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlck5hdGl2ZSBleHRlbmRzIGFuZHJvaWQub3MuQmluZGVyIGltcGxlbWVudHMgYW5kcm9pZC5vcy5JU2VydmljZU1hbmFnZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQub3MuSVNlcnZpY2VNYW5hZ2VyIGFzSW50ZXJmYWNlKAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKLQotcHVibGljIGJvb2xlYW4gb25UcmFuc2FjdCgKLWludAotYW5kcm9pZC5vcy5QYXJjZWwKLWFuZHJvaWQub3MuUGFyY2VsCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi0gY2xhc3MgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlclByb3h5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuSVNlcnZpY2VNYW5hZ2VyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5JQmluZGVyIG1SZW1vdGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLklCaW5kZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBhZGRTZXJ2aWNlKAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgY2hlY2tTZXJ2aWNlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgZ2V0U2VydmljZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIGxpc3RTZXJ2aWNlcygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRQZXJtaXNzaW9uQ29udHJvbGxlcigKLWFuZHJvaWQub3MuSVBlcm1pc3Npb25Db250cm9sbGVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQub3MuU3RhdEZzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGludCBtTmF0aXZlQ29udGV4dAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlX2ZpbmFsaXplKCkKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVfcmVzdGF0KAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVfc2V0dXAoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpCi0KLXB1YmxpYyBuYXRpdmUgaW50IGdldEF2YWlsYWJsZUJsb2NrcygpCi0KLXB1YmxpYyBuYXRpdmUgaW50IGdldEJsb2NrQ291bnQoKQotCi1wdWJsaWMgbmF0aXZlIGludCBnZXRCbG9ja1NpemUoKQotCi1wdWJsaWMgbmF0aXZlIGludCBnZXRGcmVlQmxvY2tzKCkKLQotcHVibGljIHZvaWQgcmVzdGF0KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBsb25nIGN1cnJlbnRUaHJlYWRUaW1lTWlsbGlzKCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgbG9uZyBlbGFwc2VkUmVhbHRpbWUoKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIHNldEN1cnJlbnRUaW1lTWlsbGlzKAotbG9uZykKLQotcHVibGljIHN0YXRpYyB2b2lkIHNsZWVwKAotbG9uZykKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgbG9uZyB1cHRpbWVNaWxsaXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUF9OQU1FX01BWAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QX1ZBTFVFX01BWAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGdldEJvb2xlYW4oCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuKQotCi1wdWJsaWMgc3RhdGljIGludCBnZXRJbnQoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgbG9uZyBnZXRMb25nKAotamF2YS5sYW5nLlN0cmluZwotbG9uZykKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGphdmEubGFuZy5TdHJpbmcgbmF0aXZlX2dldCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBqYXZhLmxhbmcuU3RyaW5nIG5hdGl2ZV9nZXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfc2V0KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyB2b2lkIHNldCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5vcy5TeXN0ZW1TZXJ2aWNlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBzdGFydCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBzdG9wKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9vcy9Ub2tlbldhdGNoZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLSBjbGFzcyBhbmRyb2lkLm9zLlRva2VuV2F0Y2hlciQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5SdW5uYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLm9zLlRva2VuV2F0Y2hlciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLlRva2VuV2F0Y2hlcikKLQotcHVibGljIHZvaWQgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9vcy9Ub2tlbldhdGNoZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MiBuYW1lID1EZWF0aCApCi0gY2xhc3MgYW5kcm9pZC5vcy5Ub2tlbldhdGNoZXIkRGVhdGggZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5JQmluZGVyJERlYXRoUmVjaXBpZW50Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBqYXZhLmxhbmcuU3RyaW5nIHRhZwotCi1maW5hbCBhbmRyb2lkLm9zLlRva2VuV2F0Y2hlciB0aGlzJDAKLQotIGFuZHJvaWQub3MuSUJpbmRlciB0b2tlbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuVG9rZW5XYXRjaGVyCi1hbmRyb2lkLm9zLklCaW5kZXIKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIGJpbmRlckRpZWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvVGhyb3dhYmxlOyApCi1wcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9vcy9Ub2tlbldhdGNoZXIkRGVhdGg7ICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBhbmRyb2lkLm9zLlRva2VuV2F0Y2hlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIG1BY3F1aXJlZAotCi1wcml2YXRlIGFuZHJvaWQub3MuSGFuZGxlciBtSGFuZGxlcgotCi1wcml2YXRlIGludCBtTm90aWZpY2F0aW9uUXVldWUKLQotcHJpdmF0ZSBqYXZhLmxhbmcuUnVubmFibGUgbU5vdGlmaWNhdGlvblRhc2sKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1UYWcKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL1dlYWtIYXNoTWFwPExhbmRyb2lkL29zL0lCaW5kZXI7TGFuZHJvaWQvb3MvVG9rZW5XYXRjaGVyJERlYXRoOz47ICkKLXByaXZhdGUgamF2YS51dGlsLldlYWtIYXNoTWFwIG1Ub2tlbnMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLkhhbmRsZXIKLWphdmEubGFuZy5TdHJpbmcpCi0KLXN0YXRpYyBqYXZhLnV0aWwuV2Vha0hhc2hNYXAgYWNjZXNzJDAwMCgKLWFuZHJvaWQub3MuVG9rZW5XYXRjaGVyKQotCi1zdGF0aWMgaW50IGFjY2VzcyQxMDAoCi1hbmRyb2lkLm9zLlRva2VuV2F0Y2hlcikKLQotc3RhdGljIGludCBhY2Nlc3MkMTAyKAotYW5kcm9pZC5vcy5Ub2tlbldhdGNoZXIKLWludCkKLQotc3RhdGljIGphdmEubGFuZy5TdHJpbmcgYWNjZXNzJDIwMCgKLWFuZHJvaWQub3MuVG9rZW5XYXRjaGVyKQotCi1wcml2YXRlIHZvaWQgc2VuZE5vdGlmaWNhdGlvbkxvY2tlZCgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIGFjcXVpcmUoCi1hbmRyb2lkLm9zLklCaW5kZXIKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGFjcXVpcmVkKCkKLQotcHVibGljIHZvaWQgY2xlYW51cCgKLWFuZHJvaWQub3MuSUJpbmRlcgotYm9vbGVhbikKLQotcHVibGljIHZvaWQgZHVtcCgpCi0KLXB1YmxpYyBib29sZWFuIGlzQWNxdWlyZWQoKQotCi1wdWJsaWMgdm9pZCByZWxlYXNlKAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCByZWxlYXNlZCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvb3MvVUV2ZW50T2JzZXJ2ZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1VRXZlbnQgKQotcHVibGljIGNsYXNzIGFuZHJvaWQub3MuVUV2ZW50T2JzZXJ2ZXIkVUV2ZW50IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaE1hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wdWJsaWMgamF2YS51dGlsLkhhc2hNYXAgbU1hcAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPVVFdmVudFRocmVhZCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9vcy9VRXZlbnRPYnNlcnZlcjsgKQotIGNsYXNzIGFuZHJvaWQub3MuVUV2ZW50T2JzZXJ2ZXIkVUV2ZW50VGhyZWFkIGV4dGVuZHMgamF2YS5sYW5nLlRocmVhZAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQXJyYXlMaXN0PExqYXZhL2xhbmcvT2JqZWN0Oz47ICkKLXByaXZhdGUgamF2YS51dGlsLkFycmF5TGlzdCBtT2JzZXJ2ZXJzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgYWRkT2JzZXJ2ZXIoCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLlVFdmVudE9ic2VydmVyKQotCi1wdWJsaWMgdm9pZCByZW1vdmVPYnNlcnZlcigKLWFuZHJvaWQub3MuVUV2ZW50T2JzZXJ2ZXIpCi0KLXB1YmxpYyB2b2lkIHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9vcy9VRXZlbnRPYnNlcnZlciRVRXZlbnRUaHJlYWQ7TGFuZHJvaWQvb3MvVUV2ZW50T2JzZXJ2ZXIkVUV2ZW50OyApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC5vcy5VRXZlbnRPYnNlcnZlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLQotcHJpdmF0ZSBzdGF0aWMgYW5kcm9pZC5vcy5VRXZlbnRPYnNlcnZlciRVRXZlbnRUaHJlYWQgc1RocmVhZAotCi1wcml2YXRlIHN0YXRpYyBib29sZWFuIHNUaHJlYWRTdGFydGVkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMDAwKCkKLQotc3RhdGljIGludCBhY2Nlc3MkMTAwKAotYnl0ZVtdKQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCB2b2lkIGVuc3VyZVRocmVhZFN0YXJ0ZWQoKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfc2V0dXAoKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5leHRfZXZlbnQoCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9UaHJvd2FibGU7ICkKLXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgb25VRXZlbnQoCi1hbmRyb2lkLm9zLlVFdmVudE9ic2VydmVyJFVFdmVudCkKLQotcHVibGljIGZpbmFsIHZvaWQgc3RhcnRPYnNlcnZpbmcoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgZmluYWwgdm9pZCBzdG9wT2JzZXJ2aW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLm9zLlZpYnJhdG9yIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gYW5kcm9pZC5vcy5JSGFyZHdhcmVTZXJ2aWNlIG1TZXJ2aWNlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgY2FuY2VsKCkKLQotcHVibGljIHZvaWQgdmlicmF0ZSgKLWxvbmcpCi0KLXB1YmxpYyB2b2lkIHZpYnJhdGUoCi1sb25nW10KLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLSBjbGFzcyBhbmRyb2lkLm9zLlp5Z290ZVN0YXJ0RmFpbGVkRXggZXh0ZW5kcyBqYXZhLmxhbmcuRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlRocm93YWJsZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTQxMDQgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9waW0vQ29udGFjdHNBc3luY0hlbHBlcjsgKQotIGNsYXNzIGFuZHJvaWQucGltLkNvbnRhY3RzQXN5bmNIZWxwZXIkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3BpbS9Db250YWN0c0FzeW5jSGVscGVyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9SW1hZ2VUcmFja2VyICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnBpbS5Db250YWN0c0FzeW5jSGVscGVyJEltYWdlVHJhY2tlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTUExBWV9ERUZBVUxUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU1BMQVlfSU1BR0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTUExBWV9VTkRFRklORUQKLQotcHJpdmF0ZSBpbnQgZGlzcGxheU1vZGUKLQotcHJpdmF0ZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ2FsbGVySW5mbyBtQ3VycmVudENhbGxlckluZm8KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgaW50IGdldFBob3RvU3RhdGUoKQotCi1wdWJsaWMgYW5kcm9pZC5uZXQuVXJpIGdldFBob3RvVXJpKCkKLQotcHVibGljIGJvb2xlYW4gaXNEaWZmZXJlbnRJbWFnZVJlcXVlc3QoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ2FsbGVySW5mbykKLQotcHVibGljIGJvb2xlYW4gaXNEaWZmZXJlbnRJbWFnZVJlcXVlc3QoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ29ubmVjdGlvbikKLQotcHVibGljIHZvaWQgc2V0UGhvdG9SZXF1ZXN0KAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNhbGxlckluZm8pCi0KLXB1YmxpYyB2b2lkIHNldFBob3RvU3RhdGUoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPU9uSW1hZ2VMb2FkQ29tcGxldGVMaXN0ZW5lciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9waW0vQ29udGFjdHNBc3luY0hlbHBlcjsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLnBpbS5Db250YWN0c0FzeW5jSGVscGVyJE9uSW1hZ2VMb2FkQ29tcGxldGVMaXN0ZW5lciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvbkltYWdlTG9hZENvbXBsZXRlKAotaW50Ci1qYXZhLmxhbmcuT2JqZWN0Ci1hbmRyb2lkLndpZGdldC5JbWFnZVZpZXcKLWJvb2xlYW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcGltL0NvbnRhY3RzQXN5bmNIZWxwZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjYgbmFtZSA9V29ya2VyQXJncyApCi1maW5hbCBjbGFzcyBhbmRyb2lkLnBpbS5Db250YWN0c0FzeW5jSGVscGVyJFdvcmtlckFyZ3MgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBjb250ZXh0Ci0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGNvb2tpZQotCi1wdWJsaWMgaW50IGRlZmF1bHRSZXNvdXJjZQotCi1wdWJsaWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNhbGxlckluZm8gaW5mbwotCi1wdWJsaWMgYW5kcm9pZC5waW0uQ29udGFjdHNBc3luY0hlbHBlciRPbkltYWdlTG9hZENvbXBsZXRlTGlzdGVuZXIgbGlzdGVuZXIKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgcmVzdWx0Ci0KLXB1YmxpYyBhbmRyb2lkLm5ldC5VcmkgdXJpCi0KLXB1YmxpYyBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXcgdmlldwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLnBpbS5Db250YWN0c0FzeW5jSGVscGVyJDEpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcGltL0NvbnRhY3RzQXN5bmNIZWxwZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MiBuYW1lID1Xb3JrZXJIYW5kbGVyICkKLSBjbGFzcyBhbmRyb2lkLnBpbS5Db250YWN0c0FzeW5jSGVscGVyJFdvcmtlckhhbmRsZXIgZXh0ZW5kcyBhbmRyb2lkLm9zLkhhbmRsZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC5waW0uQ29udGFjdHNBc3luY0hlbHBlciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLnBpbS5Db250YWN0c0FzeW5jSGVscGVyCi1hbmRyb2lkLm9zLkxvb3BlcikKLQotcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZSgKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3BpbS9Db250YWN0c0FzeW5jSGVscGVyJDE7TGFuZHJvaWQvcGltL0NvbnRhY3RzQXN5bmNIZWxwZXIkV29ya2VySGFuZGxlcjtMYW5kcm9pZC9waW0vQ29udGFjdHNBc3luY0hlbHBlciRJbWFnZVRyYWNrZXI7TGFuZHJvaWQvcGltL0NvbnRhY3RzQXN5bmNIZWxwZXIkV29ya2VyQXJncztMYW5kcm9pZC9waW0vQ29udGFjdHNBc3luY0hlbHBlciRPbkltYWdlTG9hZENvbXBsZXRlTGlzdGVuZXI7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnBpbS5Db250YWN0c0FzeW5jSGVscGVyIGV4dGVuZHMgYW5kcm9pZC5vcy5IYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1RPS0VOCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9MT0FEX0lNQUdFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTE9HX1RBRwotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLnBpbS5Db250YWN0c0FzeW5jSGVscGVyIHNJbnN0YW5jZQotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLm9zLkhhbmRsZXIgc1RocmVhZEhhbmRsZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgdXBkYXRlSW1hZ2VWaWV3V2l0aENvbnRhY3RQaG90b0FzeW5jKAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQud2lkZ2V0LkltYWdlVmlldwotYW5kcm9pZC5uZXQuVXJpCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCB1cGRhdGVJbWFnZVZpZXdXaXRoQ29udGFjdFBob3RvQXN5bmMoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ2FsbGVySW5mbwotaW50Ci1hbmRyb2lkLnBpbS5Db250YWN0c0FzeW5jSGVscGVyJE9uSW1hZ2VMb2FkQ29tcGxldGVMaXN0ZW5lcgotamF2YS5sYW5nLk9iamVjdAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQud2lkZ2V0LkltYWdlVmlldwotYW5kcm9pZC5uZXQuVXJpCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCB1cGRhdGVJbWFnZVZpZXdXaXRoQ29udGFjdFBob3RvQXN5bmMoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ2FsbGVySW5mbwotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQud2lkZ2V0LkltYWdlVmlldwotYW5kcm9pZC5uZXQuVXJpCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5waW0uRGF0ZUV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5FeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQucGltLkRhdGVGb3JtYXQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBBTV9QTQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ0FQSVRBTF9BTV9QTQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgREFURQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgREFZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBIT1VSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBIT1VSX09GX0RBWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgTUlOVVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBNT05USAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgUVVPVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFNFQ09ORFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFRJTUVfWk9ORQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgWUVBUgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBhcHBlbmRRdW90ZWRUZXh0KAotYW5kcm9pZC50ZXh0LlNwYW5uYWJsZVN0cmluZ0J1aWxkZXIKLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgZm9ybWF0KAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotbG9uZykKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIGZvcm1hdCgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWphdmEudXRpbC5DYWxlbmRhcikKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIGZvcm1hdCgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWphdmEudXRpbC5EYXRlKQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGZvcm1hdFpvbmVPZmZzZXQoCi1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnRleHQuRGF0ZUZvcm1hdCBnZXREYXRlRm9ybWF0KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIGdldERhdGVGb3JtYXRPcmRlcigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldERhdGVGb3JtYXRTdHJpbmcoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnRleHQuRGF0ZUZvcm1hdCBnZXRMb25nRGF0ZUZvcm1hdCgKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGdldE1vbnRoU3RyaW5nKAotamF2YS51dGlsLkNhbGVuZGFyCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS50ZXh0LkRhdGVGb3JtYXQgZ2V0VGltZUZvcm1hdCgKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGdldFRpbWVab25lU3RyaW5nKAotamF2YS51dGlsLkNhbGVuZGFyCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgZ2V0WWVhclN0cmluZygKLWphdmEudXRpbC5DYWxlbmRhcgotaW50KQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXMyNEhvdXJGb3JtYXQoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyB6ZXJvUGFkKAotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5waW0uRGF0ZVV0aWxzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUJCUkVWX01PTlRIX0ZPUk1BVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUJCUkVWX1dFRUtEQVlfRk9STUFUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBEQVlfSU5fTUlMTElTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRkFTVF9GT1JNQVRfSE1NU1MKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBGQVNUX0ZPUk1BVF9NTVNTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF8yNEhPVVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FCQlJFVl9BTEwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FCQlJFVl9NT05USAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQUJCUkVWX1RJTUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FCQlJFVl9XRUVLREFZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9DQVBfQU1QTQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQ0FQX01JRE5JR0hUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9DQVBfTk9PTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQ0FQX05PT05fTUlETklHSFQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX05PX01JRE5JR0hUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9OT19NT05USF9EQVkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX05PX05PT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX05PX05PT05fTUlETklHSFQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX05PX1lFQVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX05VTUVSSUNfREFURQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfU0hPV19EQVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9TSE9XX1RJTUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1NIT1dfV0VFS0RBWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfU0hPV19ZRUFSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9VVEMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEhPVVJfQU1QTQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSE9VUl9DQVBfQU1QTQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgSE9VUl9JTl9NSUxMSVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEhPVVJfTUlOVVRFXzI0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBIT1VSX01JTlVURV9BTVBNCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBIT1VSX01JTlVURV9DQVBfQU1QTQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRU5HVEhfTE9ORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRU5HVEhfTUVESVVNCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFTkdUSF9TSE9SVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRU5HVEhfU0hPUlRFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRU5HVEhfU0hPUlRFU1QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIE1JTlVURV9JTl9NSUxMSVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1PTlRIX0RBWV9GT1JNQVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1PTlRIX0ZPUk1BVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTlVNRVJJQ19NT05USF9GT1JNQVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIFNFQ09ORF9JTl9NSUxMSVMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBUSU1FX1BBRERJTkcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBUSU1FX1NFUEFSQVRPUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgV0VFS0RBWV9GT1JNQVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIFdFRUtfSU5fTUlMTElTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBZRUFSX0ZPUk1BVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgWUVBUl9GT1JNQVRfVFdPX0RJR0lUUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgWUVBUl9JTl9NSUxMSVMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gc0FtUG0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gc0RheXNMb25nCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIHNEYXlzTWVkaXVtCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIHNEYXlzU2hvcnQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gc0RheXNTaG9ydGVyCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIHNEYXlzU2hvcnRlc3QKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBzRWxhcHNlZEZvcm1hdEhNTVNTCi0KLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgc0VsYXBzZWRGb3JtYXRNTVNTCi0KLXByaXZhdGUgc3RhdGljIGludCBzRmlyc3REYXkKLQotcHJpdmF0ZSBzdGF0aWMgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uIHNMYXN0Q29uZmlnCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5PYmplY3Qgc0xvY2sKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBzTW9udGhEYXlGb3JtYXQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gc01vbnRoc0xvbmcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gc01vbnRoc01lZGl1bQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBzTW9udGhzU2hvcnRlc3QKLQotcHJpdmF0ZSBzdGF0aWMgYW5kcm9pZC5waW0uVGltZSBzTm93VGltZQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIHNTdGF0dXNEYXRlRm9ybWF0Ci0KLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgc1N0YXR1c1RpbWVGb3JtYXQKLQotcHJpdmF0ZSBzdGF0aWMgYW5kcm9pZC5waW0uVGltZSBzVGhlblRpbWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBzYW1lTW9udGhUYWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIHNhbWVZZWFyVGFibGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBhc3NpZ24oCi1qYXZhLnV0aWwuQ2FsZW5kYXIKLWphdmEudXRpbC5DYWxlbmRhcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9waW0vRGF0ZUV4Y2VwdGlvbjsgKQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGNoZWNrKAotaW50Ci1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9waW0vRGF0ZUV4Y2VwdGlvbjsgKQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGN0b2koCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBkYXRlU3RyaW5nKAotbG9uZykKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGZvcm1hdERhdGVSYW5nZSgKLWxvbmcKLWxvbmcKLWludCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGZvcm1hdEVsYXBzZWRUaW1lKAotbG9uZykKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBmb3JtYXRFbGFwc2VkVGltZSgKLWphdmEubGFuZy5TdHJpbmcKLWxvbmcKLWxvbmcpCi0KLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZm9ybWF0RWxhcHNlZFRpbWUoCi1qYXZhLmxhbmcuU3RyaW5nCi1sb25nCi1sb25nCi1sb25nKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgZm9ybWF0U2FtZURheVRpbWUoCi1sb25nCi1sb25nCi1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEFNUE1TdHJpbmcoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXREYXlPZldlZWtTdHJpbmcoCi1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE1vbnRoU3RyaW5nKAotaW50Ci1pbnQpCi0KLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UHJlcG9zaXRpb25EYXRlKAotYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMKLWFuZHJvaWQucGltLlRpbWUKLWludAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBnZXRSZWxhdGl2ZURheVN0cmluZygKLWFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzCi1sb25nCi1sb25nKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgZ2V0UmVsYXRpdmVUaW1lU3BhblN0cmluZygKLWxvbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBnZXRSZWxhdGl2ZVRpbWVTcGFuU3RyaW5nKAotbG9uZwotbG9uZwotbG9uZykKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIGdldFJlbGF0aXZlVGltZVNwYW5TdHJpbmcoCi1sb25nCi1sb25nCi1sb25nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgZ2V0UmVsYXRpdmVUaW1lU3BhblN0cmluZygKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1sb25nKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgZ2V0UmVsYXRpdmVUaW1lU3BhblN0cmluZygKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1sb25nCi1ib29sZWFuKQotCi1wcml2YXRlIHN0YXRpYyB2b2lkIGluaXRGb3JtYXRTdHJpbmdzKCkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzVG9kYXkoCi1sb25nKQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNVVEMoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5DYWxlbmRhciBuZXdDYWxlbmRhcigKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvcGltL0RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgdm9pZCBwYXJzZURhdGVUaW1lKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS51dGlsLkNhbGVuZGFyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL3BpbS9EYXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gcGFyc2VEYXRlVGltZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudXRpbC5DYWxlbmRhcikKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBwbHVyYWxpemVkU3BhbigKLWxvbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSB0aW1lU3RyaW5nKAotbG9uZykKLQotcHJpdmF0ZSBzdGF0aWMgY2hhciB0b0RpZ2l0Q2hhcigKLWxvbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyB3cml0ZURhdGVUaW1lKAotamF2YS51dGlsLkNhbGVuZGFyKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgd3JpdGVEYXRlVGltZSgKLWphdmEudXRpbC5DYWxlbmRhcgotamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyB3cml0ZURhdGVUaW1lKAotamF2YS51dGlsLkNhbGVuZGFyCi1ib29sZWFuKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1JbnZhbGlkRm9ybWF0RXhjZXB0aW9uICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3BpbS9FdmVudFJlY3VycmVuY2U7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnBpbS5FdmVudFJlY3VycmVuY2UkSW52YWxpZEZvcm1hdEV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3BpbS9FdmVudFJlY3VycmVuY2UkSW52YWxpZEZvcm1hdEV4Y2VwdGlvbjsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQucGltLkV2ZW50UmVjdXJyZW5jZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREFJTFkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRlIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSE9VUkxZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JTlVURUxZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PTlRITFkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0EKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VDT05ETFkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0VFS0xZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFlFQVJMWQotCi1wdWJsaWMgaW50W10gYnlkYXkKLQotcHVibGljIGludCBieWRheUNvdW50Ci0KLXB1YmxpYyBpbnRbXSBieWRheU51bQotCi1wdWJsaWMgaW50W10gYnlob3VyCi0KLXB1YmxpYyBpbnQgYnlob3VyQ291bnQKLQotcHVibGljIGludFtdIGJ5bWludXRlCi0KLXB1YmxpYyBpbnQgYnltaW51dGVDb3VudAotCi1wdWJsaWMgaW50W10gYnltb250aAotCi1wdWJsaWMgaW50IGJ5bW9udGhDb3VudAotCi1wdWJsaWMgaW50W10gYnltb250aGRheQotCi1wdWJsaWMgaW50IGJ5bW9udGhkYXlDb3VudAotCi1wdWJsaWMgaW50W10gYnlzZWNvbmQKLQotcHVibGljIGludCBieXNlY29uZENvdW50Ci0KLXB1YmxpYyBpbnRbXSBieXNldHBvcwotCi1wdWJsaWMgaW50IGJ5c2V0cG9zQ291bnQKLQotcHVibGljIGludFtdIGJ5d2Vla25vCi0KLXB1YmxpYyBpbnQgYnl3ZWVrbm9Db3VudAotCi1wdWJsaWMgaW50W10gYnl5ZWFyZGF5Ci0KLXB1YmxpYyBpbnQgYnl5ZWFyZGF5Q291bnQKLQotcHVibGljIGludCBjb3VudAotCi1wdWJsaWMgaW50IGZyZXEKLQotcHVibGljIGludCBpbnRlcnZhbAotCi1wdWJsaWMgYW5kcm9pZC5waW0uVGltZSBzdGFydERhdGUKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdW50aWwKLQotcHVibGljIGludCB3a3N0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIGFwcGVuZEJ5RGF5KAotamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBhcHBlbmROdW1iZXJzKAotamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50W10pCi0KLXB1YmxpYyBzdGF0aWMgaW50IGNhbGVuZGFyRGF5MkRheSgKLWludCkKLQotcHVibGljIHN0YXRpYyBpbnQgZGF5MkNhbGVuZGFyRGF5KAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGRheTJTdHJpbmcoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgaW50IGRheTJUaW1lRGF5KAotaW50KQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZGF5VG9TdHJpbmcoCi1hbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcwotaW50KQotCi1wdWJsaWMgc3RhdGljIGludCB0aW1lRGF5MkRheSgKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UmVwZWF0U3RyaW5nKCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIHBhcnNlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJvb2xlYW4gcmVwZWF0c01vbnRobHlPbkRheUNvdW50KCkKLQotcHVibGljIGJvb2xlYW4gcmVwZWF0c09uRXZlcnlXZWVrRGF5KCkKLQotcHVibGljIHZvaWQgc2V0U3RhcnREYXRlKAotYW5kcm9pZC5waW0uVGltZSkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9NDEwNCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3BpbS9JQ2FsZW5kYXI7ICkKLSBjbGFzcyBhbmRyb2lkLnBpbS5JQ2FsZW5kYXIkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1Db21wb25lbnQgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcGltL0lDYWxlbmRhcjsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQucGltLklDYWxlbmRhciRDb21wb25lbnQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQkVHSU4KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBFTkQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBORVdMSU5FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBWQUxBUk0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFZDQUxFTkRBUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVkVWRU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBWRlJFRUJVU1kKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFZKT1VSTkFMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBWVElNRVpPTkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFZUT0RPCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9MaW5rZWRMaXN0PExhbmRyb2lkL3BpbS9JQ2FsZW5kYXIkQ29tcG9uZW50Oz47ICkKLXByaXZhdGUgamF2YS51dGlsLkxpbmtlZExpc3QgbUNoaWxkcmVuCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBtTmFtZQotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQucGltLklDYWxlbmRhciRDb21wb25lbnQgbVBhcmVudAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvTGlua2VkSGFzaE1hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS91dGlsL0FycmF5TGlzdDxMYW5kcm9pZC9waW0vSUNhbGVuZGFyJFByb3BlcnR5Oz47PjsgKQotcHJpdmF0ZSBmaW5hbCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcCBtUHJvcHNNYXAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLnBpbS5JQ2FsZW5kYXIkQ29tcG9uZW50KQotCi1wdWJsaWMgdm9pZCBhZGRDaGlsZCgKLWFuZHJvaWQucGltLklDYWxlbmRhciRDb21wb25lbnQpCi0KLXB1YmxpYyB2b2lkIGFkZFByb3BlcnR5KAotYW5kcm9pZC5waW0uSUNhbGVuZGFyJFByb3BlcnR5KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL3BpbS9JQ2FsZW5kYXIkQ29tcG9uZW50Oz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRDb21wb25lbnRzKCkKLQotcHVibGljIGFuZHJvaWQucGltLklDYWxlbmRhciRQcm9wZXJ0eSBnZXRGaXJzdFByb3BlcnR5KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TmFtZSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0xpbmtlZExpc3Q8TGFuZHJvaWQvcGltL0lDYWxlbmRhciRDb21wb25lbnQ7PjsgKQotcHJvdGVjdGVkIGphdmEudXRpbC5MaW5rZWRMaXN0IGdldE9yQ3JlYXRlQ2hpbGRyZW4oKQotCi1wdWJsaWMgYW5kcm9pZC5waW0uSUNhbGVuZGFyJENvbXBvbmVudCBnZXRQYXJlbnQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL3BpbS9JQ2FsZW5kYXIkUHJvcGVydHk7PjsgKQotcHVibGljIGphdmEudXRpbC5MaXN0IGdldFByb3BlcnRpZXMoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9TZXQ8TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHVibGljIGphdmEudXRpbC5TZXQgZ2V0UHJvcGVydHlOYW1lcygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotcHVibGljIHZvaWQgdG9TdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nQnVpbGRlcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9Rm9ybWF0RXhjZXB0aW9uICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3BpbS9JQ2FsZW5kYXI7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnBpbS5JQ2FsZW5kYXIkRm9ybWF0RXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLkV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcGltL0lDYWxlbmRhcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPVBhcmFtZXRlciApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5waW0uSUNhbGVuZGFyJFBhcmFtZXRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgbmFtZQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB2YWx1ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotcHVibGljIHZvaWQgdG9TdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nQnVpbGRlcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9waW0vSUNhbGVuZGFyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI2IG5hbWUgPVBhcnNlclN0YXRlICkKLWZpbmFsIGNsYXNzIGFuZHJvaWQucGltLklDYWxlbmRhciRQYXJzZXJTdGF0ZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGludCBpbmRleAotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBsaW5lCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQucGltLklDYWxlbmRhciQxKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3BpbS9JQ2FsZW5kYXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1Qcm9wZXJ0eSApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5waW0uSUNhbGVuZGFyJFByb3BlcnR5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRFRFTkQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERUU1RBUlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERVUkFUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBFWERBVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEVYUlVMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUkRBVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFJSVUxFCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBtTmFtZQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvTGlua2VkSGFzaE1hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS91dGlsL0FycmF5TGlzdDxMYW5kcm9pZC9waW0vSUNhbGVuZGFyJFBhcmFtZXRlcjs+Oz47ICkKLXByaXZhdGUgamF2YS51dGlsLkxpbmtlZEhhc2hNYXAgbVBhcmFtc01hcAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbVZhbHVlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgYWRkUGFyYW1ldGVyKAotYW5kcm9pZC5waW0uSUNhbGVuZGFyJFBhcmFtZXRlcikKLQotcHVibGljIGFuZHJvaWQucGltLklDYWxlbmRhciRQYXJhbWV0ZXIgZ2V0Rmlyc3RQYXJhbWV0ZXIoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXROYW1lKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvU2V0PExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuU2V0IGdldFBhcmFtZXRlck5hbWVzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9waW0vSUNhbGVuZGFyJFBhcmFtZXRlcjs+OyApCi1wdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0UGFyYW1ldGVycygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFZhbHVlKCkKLQotcHVibGljIHZvaWQgc2V0VmFsdWUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLXB1YmxpYyB2b2lkIHRvU3RyaW5nKAotamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9waW0vSUNhbGVuZGFyJDE7TGFuZHJvaWQvcGltL0lDYWxlbmRhciRQYXJzZXJTdGF0ZTtMYW5kcm9pZC9waW0vSUNhbGVuZGFyJFBhcmFtZXRlcjtMYW5kcm9pZC9waW0vSUNhbGVuZGFyJFByb3BlcnR5O0xhbmRyb2lkL3BpbS9JQ2FsZW5kYXIkQ29tcG9uZW50O0xhbmRyb2lkL3BpbS9JQ2FsZW5kYXIkRm9ybWF0RXhjZXB0aW9uOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5waW0uSUNhbGVuZGFyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRBRwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL3BpbS9JQ2FsZW5kYXIkRm9ybWF0RXhjZXB0aW9uOyApCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLnBpbS5JQ2FsZW5kYXIkUGFyYW1ldGVyIGV4dHJhY3RQYXJhbWV0ZXIoCi1hbmRyb2lkLnBpbS5JQ2FsZW5kYXIkUGFyc2VyU3RhdGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvcGltL0lDYWxlbmRhciRGb3JtYXRFeGNlcHRpb247ICkKLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZXh0cmFjdFZhbHVlKAotYW5kcm9pZC5waW0uSUNhbGVuZGFyJFBhcnNlclN0YXRlKQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIG5vcm1hbGl6ZVRleHQoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL3BpbS9JQ2FsZW5kYXIkRm9ybWF0RXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQucGltLklDYWxlbmRhciRDb21wb25lbnQgcGFyc2VDYWxlbmRhcigKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvcGltL0lDYWxlbmRhciRGb3JtYXRFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5waW0uSUNhbGVuZGFyJENvbXBvbmVudCBwYXJzZUNvbXBvbmVudCgKLWFuZHJvaWQucGltLklDYWxlbmRhciRDb21wb25lbnQKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvcGltL0lDYWxlbmRhciRGb3JtYXRFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5waW0uSUNhbGVuZGFyJENvbXBvbmVudCBwYXJzZUNvbXBvbmVudCgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvcGltL0lDYWxlbmRhciRGb3JtYXRFeGNlcHRpb247ICkKLXByaXZhdGUgc3RhdGljIGFuZHJvaWQucGltLklDYWxlbmRhciRDb21wb25lbnQgcGFyc2VDb21wb25lbnRJbXBsKAotYW5kcm9pZC5waW0uSUNhbGVuZGFyJENvbXBvbmVudAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9waW0vSUNhbGVuZGFyJEZvcm1hdEV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBhbmRyb2lkLnBpbS5JQ2FsZW5kYXIkQ29tcG9uZW50IHBhcnNlRXZlbnQoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL3BpbS9JQ2FsZW5kYXIkRm9ybWF0RXhjZXB0aW9uOyApCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLnBpbS5JQ2FsZW5kYXIkQ29tcG9uZW50IHBhcnNlTGluZSgKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQucGltLklDYWxlbmRhciRQYXJzZXJTdGF0ZQotYW5kcm9pZC5waW0uSUNhbGVuZGFyJENvbXBvbmVudCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnBpbS5SZWN1cnJlbmNlU2V0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFJVTEVfU0VQQVJBVE9SCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEFHCi0KLXB1YmxpYyBsb25nW10gZXhkYXRlcwotCi1wdWJsaWMgYW5kcm9pZC5waW0uRXZlbnRSZWN1cnJlbmNlW10gZXhydWxlcwotCi1wdWJsaWMgbG9uZ1tdIHJkYXRlcwotCi1wdWJsaWMgYW5kcm9pZC5waW0uRXZlbnRSZWN1cnJlbmNlW10gcnJ1bGVzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXMpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHN0YXRpYyB2b2lkIGFkZFByb3BlcnRpZXNGb3JSdWxlU3RyKAotYW5kcm9pZC5waW0uSUNhbGVuZGFyJENvbXBvbmVudAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRQcm9wZXJ0eUZvckRhdGVTdHIoCi1hbmRyb2lkLnBpbS5JQ2FsZW5kYXIkQ29tcG9uZW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGNvbXB1dGVEdXJhdGlvbigKLWFuZHJvaWQucGltLlRpbWUKLWFuZHJvaWQucGltLklDYWxlbmRhciRDb21wb25lbnQpCi0KLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZXh0cmFjdERhdGVzKAotYW5kcm9pZC5waW0uSUNhbGVuZGFyJFByb3BlcnR5KQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGZsYXR0ZW5Qcm9wZXJ0aWVzKAotYW5kcm9pZC5waW0uSUNhbGVuZGFyJENvbXBvbmVudAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSB2b2lkIGluaXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGxvbmdbXSBwYXJzZVJlY3VycmVuY2VEYXRlcygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwb3B1bGF0ZUNvbXBvbmVudCgKLWFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yCi1hbmRyb2lkLnBpbS5JQ2FsZW5kYXIkQ29tcG9uZW50KQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gcG9wdWxhdGVDb250ZW50VmFsdWVzKAotYW5kcm9pZC5waW0uSUNhbGVuZGFyJENvbXBvbmVudAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXMpCi0KLXB1YmxpYyBib29sZWFuIGhhc1JlY3VycmVuY2UoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQucGltLlRpbWUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIERBWVNfUEVSX01PTlRICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVQT0NIX0pVTElBTl9EQVkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRlJJREFZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhPVVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlOVVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PTkRBWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT05USAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT05USF9EQVkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0FUVVJEQVkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VDT05ECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNVTkRBWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUSFVSU0RBWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVElNRVpPTkVfVVRDCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRVRVNEQVkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0VETkVTREFZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdFRUtfREFZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdFRUtfTlVNCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFlFQVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWUVBUl9EQVkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gc1RodXJzZGF5T2Zmc2V0Ci0KLXB1YmxpYyBib29sZWFuIGFsbERheQotCi1wdWJsaWMgbG9uZyBnbXRvZmYKLQotcHVibGljIGludCBob3VyCi0KLXB1YmxpYyBpbnQgaXNEc3QKLQotcHVibGljIGludCBtaW51dGUKLQotcHVibGljIGludCBtb250aAotCi1wdWJsaWMgaW50IG1vbnRoRGF5Ci0KLXB1YmxpYyBpbnQgc2Vjb25kCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRpbWV6b25lCi0KLXB1YmxpYyBpbnQgd2Vla0RheQotCi1wdWJsaWMgaW50IHllYXIKLQotcHVibGljIGludCB5ZWFyRGF5Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLnBpbS5UaW1lKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgY29tcGFyZSgKLWFuZHJvaWQucGltLlRpbWUKLWFuZHJvaWQucGltLlRpbWUpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRDdXJyZW50VGltZXpvbmUoKQotCi1wdWJsaWMgc3RhdGljIGludCBnZXRKdWxpYW5EYXkoCi1sb25nCi1sb25nKQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFcG9jaCgKLWFuZHJvaWQucGltLlRpbWUpCi0KLXByaXZhdGUgbmF0aXZlIGJvb2xlYW4gbmF0aXZlUGFyc2UyNDQ1KAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBuYXRpdmVQYXJzZTMzMzkoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYm9vbGVhbiBhZnRlcigKLWFuZHJvaWQucGltLlRpbWUpCi0KLXB1YmxpYyBib29sZWFuIGJlZm9yZSgKLWFuZHJvaWQucGltLlRpbWUpCi0KLXB1YmxpYyB2b2lkIGNsZWFyKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIG5hdGl2ZSBqYXZhLmxhbmcuU3RyaW5nIGZvcm1hdCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBuYXRpdmUgamF2YS5sYW5nLlN0cmluZyBmb3JtYXQyNDQ1KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZm9ybWF0MzMzOSgKLWJvb2xlYW4pCi0KLXB1YmxpYyBpbnQgZ2V0QWN0dWFsTWF4aW11bSgKLWludCkKLQotcHVibGljIGludCBnZXRXZWVrTnVtYmVyKCkKLQotcHVibGljIG5hdGl2ZSBsb25nIG5vcm1hbGl6ZSgKLWJvb2xlYW4pCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBwYXJzZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBib29sZWFuIHBhcnNlMjQ0NSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBib29sZWFuIHBhcnNlMzMzOSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHNldCgKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldCgKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBzZXQoCi1sb25nKQotCi1wdWJsaWMgdm9pZCBzZXQoCi1hbmRyb2lkLnBpbS5UaW1lKQotCi1wdWJsaWMgbG9uZyBzZXRKdWxpYW5EYXkoCi1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBzZXRUb05vdygpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBzd2l0Y2hUaW1lem9uZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBuYXRpdmUgbG9uZyB0b01pbGxpcygKLWJvb2xlYW4pCi0KLXB1YmxpYyBuYXRpdmUgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJlZmVyZW5jZS9DaGVja0JveFByZWZlcmVuY2UkU2F2ZWRTdGF0ZTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC9wcmVmZXJlbmNlL0NoZWNrQm94UHJlZmVyZW5jZSRTYXZlZFN0YXRlOz47ICkKLWZpbmFsIGNsYXNzIGFuZHJvaWQucHJlZmVyZW5jZS5DaGVja0JveFByZWZlcmVuY2UkU2F2ZWRTdGF0ZSQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGFuZHJvaWQucHJlZmVyZW5jZS5DaGVja0JveFByZWZlcmVuY2UkU2F2ZWRTdGF0ZSBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIGFuZHJvaWQucHJlZmVyZW5jZS5DaGVja0JveFByZWZlcmVuY2UkU2F2ZWRTdGF0ZVtdIG5ld0FycmF5KAotaW50KQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdFtdIG5ld0FycmF5KAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGFuZHJvaWQudmlldy5BYnNTYXZlZFN0YXRlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC92aWV3L0Fic1NhdmVkU3RhdGU7PjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvciBDUkVBVE9SCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC52aWV3LkFic1NhdmVkU3RhdGUgRU1QVFlfU1RBVEUKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLm9zLlBhcmNlbGFibGUgbVN1cGVyU3RhdGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5QYXJjZWxhYmxlKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLnZpZXcuQWJzU2F2ZWRTdGF0ZSQxKQotCi1wdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKQotCi1wdWJsaWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlIGdldFN1cGVyU3RhdGUoKQotCi1wdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9QmFzZVNhdmVkU3RhdGUgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2UkQmFzZVNhdmVkU3RhdGUgZXh0ZW5kcyBhbmRyb2lkLnZpZXcuQWJzU2F2ZWRTdGF0ZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2UkQmFzZVNhdmVkU3RhdGU7PjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvciBDUkVBVE9SCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5QYXJjZWxhYmxlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9U2F2ZWRTdGF0ZSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcmVmZXJlbmNlL0NoZWNrQm94UHJlZmVyZW5jZTsgKQotIGNsYXNzIGFuZHJvaWQucHJlZmVyZW5jZS5DaGVja0JveFByZWZlcmVuY2UkU2F2ZWRTdGF0ZSBleHRlbmRzIGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlJEJhc2VTYXZlZFN0YXRlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExhbmRyb2lkL3ByZWZlcmVuY2UvQ2hlY2tCb3hQcmVmZXJlbmNlJFNhdmVkU3RhdGU7PjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvciBDUkVBVE9SCi0KLSBib29sZWFuIGNoZWNrZWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLlBhcmNlbGFibGUpCi0KLXB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQucHJlZmVyZW5jZS5PbkRlcGVuZGVuY3lDaGFuZ2VMaXN0ZW5lciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvbkRlcGVuZGVuY3lDaGFuZ2VkKAotYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2UKLWJvb2xlYW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcvQ29tcGFyYWJsZTxMYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2U7PjtMYW5kcm9pZC9wcmVmZXJlbmNlL09uRGVwZW5kZW5jeUNoYW5nZUxpc3RlbmVyOyApCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZSRCYXNlU2F2ZWRTdGF0ZTtMYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2UkT25QcmVmZXJlbmNlQ2hhbmdlSW50ZXJuYWxMaXN0ZW5lcjtMYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2UkT25QcmVmZXJlbmNlQ2xpY2tMaXN0ZW5lcjtMYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2UkT25QcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXI7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmxhbmcuQ29tcGFyYWJsZSwgYW5kcm9pZC5wcmVmZXJlbmNlLk9uRGVwZW5kZW5jeUNoYW5nZUxpc3RlbmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfT1JERVIKLQotcHJpdmF0ZSBib29sZWFuIG1CYXNlTWV0aG9kQ2FsbGVkCi0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgbUNvbnRleHQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuT2JqZWN0IG1EZWZhdWx0VmFsdWUKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1EZXBlbmRlbmN5S2V5Ci1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZTs+OyApCi1wcml2YXRlIGphdmEudXRpbC5MaXN0IG1EZXBlbmRlbnRzCi0KLXByaXZhdGUgYm9vbGVhbiBtRW5hYmxlZAotCi1wcml2YXRlIGJvb2xlYW4gbUhhc1NwZWNpZmllZExheW91dAotCi1wcml2YXRlIGxvbmcgbUlkCi0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LkludGVudCBtSW50ZW50Ci0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtS2V5Ci0KLXByaXZhdGUgaW50IG1MYXlvdXRSZXNJZAotCi1wcml2YXRlIGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlJE9uUHJlZmVyZW5jZUNoYW5nZUludGVybmFsTGlzdGVuZXIgbUxpc3RlbmVyCi0KLXByaXZhdGUgYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2UkT25QcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIgbU9uQ2hhbmdlTGlzdGVuZXIKLQotcHJpdmF0ZSBhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZSRPblByZWZlcmVuY2VDbGlja0xpc3RlbmVyIG1PbkNsaWNrTGlzdGVuZXIKLQotcHJpdmF0ZSBpbnQgbU9yZGVyCi0KLXByaXZhdGUgYm9vbGVhbiBtUGVyc2lzdGVudAotCi1wcml2YXRlIGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlTWFuYWdlciBtUHJlZmVyZW5jZU1hbmFnZXIKLQotcHJpdmF0ZSBib29sZWFuIG1SZXF1aXJlc0tleQotCi1wcml2YXRlIGJvb2xlYW4gbVNlbGVjdGFibGUKLQotcHJpdmF0ZSBib29sZWFuIG1TaG91bGREaXNhYmxlVmlldwotCi1wcml2YXRlIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgbVN1bW1hcnkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIG1UaXRsZQotCi1wcml2YXRlIGludCBtV2lkZ2V0TGF5b3V0UmVzSWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ci1pbnQpCi0KLXByaXZhdGUgdm9pZCBkaXNwYXRjaFNldEluaXRpYWxWYWx1ZSgpCi0KLXByaXZhdGUgdm9pZCByZWdpc3RlckRlcGVuZGVuY3koKQotCi1wcml2YXRlIHZvaWQgcmVnaXN0ZXJEZXBlbmRlbnQoCi1hbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZSkKLQotcHJpdmF0ZSB2b2lkIHNldEVuYWJsZWRTdGF0ZU9uVmlld3MoCi1hbmRyb2lkLnZpZXcuVmlldwotYm9vbGVhbikKLQotcHJpdmF0ZSB2b2lkIHRyeUNvbW1pdCgKLWFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlcyRFZGl0b3IpCi0KLXByaXZhdGUgdm9pZCB1bnJlZ2lzdGVyRGVwZW5kZW5jeSgpCi0KLXByaXZhdGUgdm9pZCB1bnJlZ2lzdGVyRGVwZW5kZW50KAotYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2UpCi0KLXByb3RlY3RlZCBib29sZWFuIGNhbGxDaGFuZ2VMaXN0ZW5lcigKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBpbnQgY29tcGFyZVRvKAotYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2UpCi0KLXB1YmxpYyB2b2xhdGlsZSBpbnQgY29tcGFyZVRvKAotamF2YS5sYW5nLk9iamVjdCkKLQotIHZvaWQgZGlzcGF0Y2hSZXN0b3JlSW5zdGFuY2VTdGF0ZSgKLWFuZHJvaWQub3MuQnVuZGxlKQotCi0gdm9pZCBkaXNwYXRjaFNhdmVJbnN0YW5jZVN0YXRlKAotYW5kcm9pZC5vcy5CdW5kbGUpCi0KLXByb3RlY3RlZCBhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZSBmaW5kUHJlZmVyZW5jZUluSGllcmFyY2h5KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5Db250ZXh0IGdldENvbnRleHQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXREZXBlbmRlbmN5KCkKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlcyRFZGl0b3IgZ2V0RWRpdG9yKCkKLQotIGphdmEubGFuZy5TdHJpbmdCdWlsZGVyIGdldEZpbHRlcmFibGVTdHJpbmdCdWlsZGVyKCkKLQotIGxvbmcgZ2V0SWQoKQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LkludGVudCBnZXRJbnRlbnQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRLZXkoKQotCi1wdWJsaWMgaW50IGdldExheW91dFJlc291cmNlKCkKLQotcHVibGljIGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlJE9uUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyIGdldE9uUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKCkKLQotcHVibGljIGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlJE9uUHJlZmVyZW5jZUNsaWNrTGlzdGVuZXIgZ2V0T25QcmVmZXJlbmNlQ2xpY2tMaXN0ZW5lcigpCi0KLXB1YmxpYyBpbnQgZ2V0T3JkZXIoKQotCi1wcm90ZWN0ZWQgYm9vbGVhbiBnZXRQZXJzaXN0ZWRCb29sZWFuKAotYm9vbGVhbikKLQotcHJvdGVjdGVkIGZsb2F0IGdldFBlcnNpc3RlZEZsb2F0KAotZmxvYXQpCi0KLXByb3RlY3RlZCBpbnQgZ2V0UGVyc2lzdGVkSW50KAotaW50KQotCi1wcm90ZWN0ZWQgbG9uZyBnZXRQZXJzaXN0ZWRMb25nKAotbG9uZykKLQotcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgZ2V0UGVyc2lzdGVkU3RyaW5nKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlTWFuYWdlciBnZXRQcmVmZXJlbmNlTWFuYWdlcigpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXMgZ2V0U2hhcmVkUHJlZmVyZW5jZXMoKQotCi1wdWJsaWMgYm9vbGVhbiBnZXRTaG91bGREaXNhYmxlVmlldygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIGdldFN1bW1hcnkoKQotCi1wdWJsaWMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBnZXRUaXRsZSgpCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuVmlldyBnZXRWaWV3KAotYW5kcm9pZC52aWV3LlZpZXcKLWFuZHJvaWQudmlldy5WaWV3R3JvdXApCi0KLXB1YmxpYyBpbnQgZ2V0V2lkZ2V0TGF5b3V0UmVzb3VyY2UoKQotCi1wdWJsaWMgYm9vbGVhbiBoYXNLZXkoKQotCi0gYm9vbGVhbiBoYXNTcGVjaWZpZWRMYXlvdXQoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKQotCi1wdWJsaWMgYm9vbGVhbiBpc1BlcnNpc3RlbnQoKQotCi1wdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGFibGUoKQotCi1wcm90ZWN0ZWQgdm9pZCBub3RpZnlDaGFuZ2VkKCkKLQotcHVibGljIHZvaWQgbm90aWZ5RGVwZW5kZW5jeUNoYW5nZSgKLWJvb2xlYW4pCi0KLXByb3RlY3RlZCB2b2lkIG5vdGlmeUhpZXJhcmNoeUNoYW5nZWQoKQotCi1wcm90ZWN0ZWQgdm9pZCBvbkF0dGFjaGVkVG9BY3Rpdml0eSgpCi0KLXByb3RlY3RlZCB2b2lkIG9uQXR0YWNoZWRUb0hpZXJhcmNoeSgKLWFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlTWFuYWdlcikKLQotcHJvdGVjdGVkIHZvaWQgb25CaW5kVmlldygKLWFuZHJvaWQudmlldy5WaWV3KQotCi1wcm90ZWN0ZWQgdm9pZCBvbkNsaWNrKCkKLQotcHJvdGVjdGVkIGFuZHJvaWQudmlldy5WaWV3IG9uQ3JlYXRlVmlldygKLWFuZHJvaWQudmlldy5WaWV3R3JvdXApCi0KLXB1YmxpYyB2b2lkIG9uRGVwZW5kZW5jeUNoYW5nZWQoCi1hbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZQotYm9vbGVhbikKLQotcHJvdGVjdGVkIGphdmEubGFuZy5PYmplY3Qgb25HZXREZWZhdWx0VmFsdWUoCi1hbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXkKLWludCkKLQotcHJvdGVjdGVkIHZvaWQgb25QcmVwYXJlRm9yUmVtb3ZhbCgpCi0KLXByb3RlY3RlZCB2b2lkIG9uUmVzdG9yZUluc3RhbmNlU3RhdGUoCi1hbmRyb2lkLm9zLlBhcmNlbGFibGUpCi0KLXByb3RlY3RlZCBhbmRyb2lkLm9zLlBhcmNlbGFibGUgb25TYXZlSW5zdGFuY2VTdGF0ZSgpCi0KLXByb3RlY3RlZCB2b2lkIG9uU2V0SW5pdGlhbFZhbHVlKAotYm9vbGVhbgotamF2YS5sYW5nLk9iamVjdCkKLQotIHZvaWQgcGVyZm9ybUNsaWNrKAotYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VTY3JlZW4pCi0KLXByb3RlY3RlZCBib29sZWFuIHBlcnNpc3RCb29sZWFuKAotYm9vbGVhbikKLQotcHJvdGVjdGVkIGJvb2xlYW4gcGVyc2lzdEZsb2F0KAotZmxvYXQpCi0KLXByb3RlY3RlZCBib29sZWFuIHBlcnNpc3RJbnQoCi1pbnQpCi0KLXByb3RlY3RlZCBib29sZWFuIHBlcnNpc3RMb25nKAotbG9uZykKLQotcHJvdGVjdGVkIGJvb2xlYW4gcGVyc2lzdFN0cmluZygKLWphdmEubGFuZy5TdHJpbmcpCi0KLSB2b2lkIHJlcXVpcmVLZXkoKQotCi1wdWJsaWMgdm9pZCByZXN0b3JlSGllcmFyY2h5U3RhdGUoCi1hbmRyb2lkLm9zLkJ1bmRsZSkKLQotcHVibGljIHZvaWQgc2F2ZUhpZXJhcmNoeVN0YXRlKAotYW5kcm9pZC5vcy5CdW5kbGUpCi0KLXB1YmxpYyB2b2lkIHNldERlZmF1bHRWYWx1ZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2lkIHNldERlcGVuZGVuY3koCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRFbmFibGVkKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0SW50ZW50KAotYW5kcm9pZC5jb250ZW50LkludGVudCkKLQotcHVibGljIHZvaWQgc2V0S2V5KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0TGF5b3V0UmVzb3VyY2UoCi1pbnQpCi0KLWZpbmFsIHZvaWQgc2V0T25QcmVmZXJlbmNlQ2hhbmdlSW50ZXJuYWxMaXN0ZW5lcigKLWFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlJE9uUHJlZmVyZW5jZUNoYW5nZUludGVybmFsTGlzdGVuZXIpCi0KLXB1YmxpYyB2b2lkIHNldE9uUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKAotYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2UkT25QcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIpCi0KLXB1YmxpYyB2b2lkIHNldE9uUHJlZmVyZW5jZUNsaWNrTGlzdGVuZXIoCi1hbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZSRPblByZWZlcmVuY2VDbGlja0xpc3RlbmVyKQotCi1wdWJsaWMgdm9pZCBzZXRPcmRlcigKLWludCkKLQotcHVibGljIHZvaWQgc2V0UGVyc2lzdGVudCgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldFNlbGVjdGFibGUoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRTaG91bGREaXNhYmxlVmlldygKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldFN1bW1hcnkoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldFN1bW1hcnkoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotCi1wdWJsaWMgdm9pZCBzZXRUaXRsZSgKLWludCkKLQotcHVibGljIHZvaWQgc2V0VGl0bGUoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotCi1wdWJsaWMgdm9pZCBzZXRXaWRnZXRMYXlvdXRSZXNvdXJjZSgKLWludCkKLQotcHVibGljIGJvb2xlYW4gc2hvdWxkQ29tbWl0KCkKLQotcHVibGljIGJvb2xlYW4gc2hvdWxkRGlzYWJsZURlcGVuZGVudHMoKQotCi1wcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRQZXJzaXN0KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvcHJlZmVyZW5jZS9DaGVja0JveFByZWZlcmVuY2UkU2F2ZWRTdGF0ZTsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQucHJlZmVyZW5jZS5DaGVja0JveFByZWZlcmVuY2UgZXh0ZW5kcyBhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGJvb2xlYW4gbUNoZWNrZWQKLQotcHJpdmF0ZSBib29sZWFuIG1EaXNhYmxlRGVwZW5kZW50c1N0YXRlCi0KLXByaXZhdGUgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBtU3VtbWFyeU9mZgotCi1wcml2YXRlIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgbVN1bW1hcnlPbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQKLWludCkKLQotcHVibGljIGJvb2xlYW4gZ2V0RGlzYWJsZURlcGVuZGVudHNTdGF0ZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIGdldFN1bW1hcnlPZmYoKQotCi1wdWJsaWMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBnZXRTdW1tYXJ5T24oKQotCi1wdWJsaWMgYm9vbGVhbiBpc0NoZWNrZWQoKQotCi1wcm90ZWN0ZWQgdm9pZCBvbkJpbmRWaWV3KAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXByb3RlY3RlZCB2b2lkIG9uQ2xpY2soKQotCi1wcm90ZWN0ZWQgamF2YS5sYW5nLk9iamVjdCBvbkdldERlZmF1bHRWYWx1ZSgKLWFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheQotaW50KQotCi1wcm90ZWN0ZWQgdm9pZCBvblJlc3RvcmVJbnN0YW5jZVN0YXRlKAotYW5kcm9pZC5vcy5QYXJjZWxhYmxlKQotCi1wcm90ZWN0ZWQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlIG9uU2F2ZUluc3RhbmNlU3RhdGUoKQotCi1wcm90ZWN0ZWQgdm9pZCBvblNldEluaXRpYWxWYWx1ZSgKLWJvb2xlYW4KLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2lkIHNldENoZWNrZWQoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXREaXNhYmxlRGVwZW5kZW50c1N0YXRlKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0U3VtbWFyeU9mZigKLWludCkKLQotcHVibGljIHZvaWQgc2V0U3VtbWFyeU9mZigKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi0KLXB1YmxpYyB2b2lkIHNldFN1bW1hcnlPbigKLWludCkKLQotcHVibGljIHZvaWQgc2V0U3VtbWFyeU9uKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotcHVibGljIGJvb2xlYW4gc2hvdWxkRGlzYWJsZURlcGVuZGVudHMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I8TGFuZHJvaWQvcHJlZmVyZW5jZS9EaWFsb2dQcmVmZXJlbmNlJFNhdmVkU3RhdGU7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJlZmVyZW5jZS9EaWFsb2dQcmVmZXJlbmNlJFNhdmVkU3RhdGU7ICkKLWZpbmFsIGNsYXNzIGFuZHJvaWQucHJlZmVyZW5jZS5EaWFsb2dQcmVmZXJlbmNlJFNhdmVkU3RhdGUkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBhbmRyb2lkLnByZWZlcmVuY2UuRGlhbG9nUHJlZmVyZW5jZSRTYXZlZFN0YXRlIGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgYW5kcm9pZC5wcmVmZXJlbmNlLkRpYWxvZ1ByZWZlcmVuY2UkU2F2ZWRTdGF0ZVtdIG5ld0FycmF5KAotaW50KQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdFtdIG5ld0FycmF5KAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9U2F2ZWRTdGF0ZSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcmVmZXJlbmNlL0RpYWxvZ1ByZWZlcmVuY2U7ICkKLSBjbGFzcyBhbmRyb2lkLnByZWZlcmVuY2UuRGlhbG9nUHJlZmVyZW5jZSRTYXZlZFN0YXRlIGV4dGVuZHMgYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2UkQmFzZVNhdmVkU3RhdGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I8TGFuZHJvaWQvcHJlZmVyZW5jZS9EaWFsb2dQcmVmZXJlbmNlJFNhdmVkU3RhdGU7PjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvciBDUkVBVE9SCi0KLSBhbmRyb2lkLm9zLkJ1bmRsZSBkaWFsb2dCdW5kbGUKLQotIGJvb2xlYW4gaXNEaWFsb2dTaG93aW5nCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5QYXJjZWxhYmxlKQotCi1wdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9T25BY3Rpdml0eURlc3Ryb3lMaXN0ZW5lciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VNYW5hZ2VyOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlTWFuYWdlciRPbkFjdGl2aXR5RGVzdHJveUxpc3RlbmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uQWN0aXZpdHlEZXN0cm95KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3ByZWZlcmVuY2UvRGlhbG9nUHJlZmVyZW5jZSRTYXZlZFN0YXRlOyApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC5wcmVmZXJlbmNlLkRpYWxvZ1ByZWZlcmVuY2UgZXh0ZW5kcyBhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZSBpbXBsZW1lbnRzIGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UkT25DbGlja0xpc3RlbmVyLCBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlJE9uRGlzbWlzc0xpc3RlbmVyLCBhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZU1hbmFnZXIkT25BY3Rpdml0eURlc3Ryb3lMaXN0ZW5lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nJEJ1aWxkZXIgbUJ1aWxkZXIKLQotcHJpdmF0ZSBhbmRyb2lkLmFwcC5EaWFsb2cgbURpYWxvZwotCi1wcml2YXRlIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgbURpYWxvZ0ljb24KLQotcHJpdmF0ZSBpbnQgbURpYWxvZ0xheW91dFJlc0lkCi0KLXByaXZhdGUgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBtRGlhbG9nTWVzc2FnZQotCi1wcml2YXRlIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgbURpYWxvZ1RpdGxlCi0KLXByaXZhdGUgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBtTmVnYXRpdmVCdXR0b25UZXh0Ci0KLXByaXZhdGUgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBtUG9zaXRpdmVCdXR0b25UZXh0Ci0KLXByaXZhdGUgaW50IG1XaGljaEJ1dHRvbkNsaWNrZWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQKLWludCkKLQotcHVibGljIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgZ2V0RGlhbG9nSWNvbigpCi0KLXB1YmxpYyBpbnQgZ2V0RGlhbG9nTGF5b3V0UmVzb3VyY2UoKQotCi1wdWJsaWMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBnZXREaWFsb2dNZXNzYWdlKCkKLQotcHVibGljIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgZ2V0RGlhbG9nVGl0bGUoKQotCi1wdWJsaWMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBnZXROZWdhdGl2ZUJ1dHRvblRleHQoKQotCi1wdWJsaWMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBnZXRQb3NpdGl2ZUJ1dHRvblRleHQoKQotCi1wdWJsaWMgdm9pZCBvbkFjdGl2aXR5RGVzdHJveSgpCi0KLXByb3RlY3RlZCB2b2lkIG9uQmluZERpYWxvZ1ZpZXcoCi1hbmRyb2lkLnZpZXcuVmlldykKLQotcHJvdGVjdGVkIHZvaWQgb25DbGljaygpCi0KLXB1YmxpYyB2b2lkIG9uQ2xpY2soCi1hbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlCi1pbnQpCi0KLXByb3RlY3RlZCBhbmRyb2lkLnZpZXcuVmlldyBvbkNyZWF0ZURpYWxvZ1ZpZXcoKQotCi1wcm90ZWN0ZWQgdm9pZCBvbkRpYWxvZ0Nsb3NlZCgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIG9uRGlzbWlzcygKLWFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UpCi0KLXByb3RlY3RlZCB2b2lkIG9uUHJlcGFyZURpYWxvZ0J1aWxkZXIoCi1hbmRyb2lkLmFwcC5BbGVydERpYWxvZyRCdWlsZGVyKQotCi1wcm90ZWN0ZWQgdm9pZCBvblJlc3RvcmVJbnN0YW5jZVN0YXRlKAotYW5kcm9pZC5vcy5QYXJjZWxhYmxlKQotCi1wcm90ZWN0ZWQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlIG9uU2F2ZUluc3RhbmNlU3RhdGUoKQotCi1wdWJsaWMgdm9pZCBzZXREaWFsb2dJY29uKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXREaWFsb2dJY29uKAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSkKLQotcHVibGljIHZvaWQgc2V0RGlhbG9nTGF5b3V0UmVzb3VyY2UoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldERpYWxvZ01lc3NhZ2UoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldERpYWxvZ01lc3NhZ2UoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotCi1wdWJsaWMgdm9pZCBzZXREaWFsb2dUaXRsZSgKLWludCkKLQotcHVibGljIHZvaWQgc2V0RGlhbG9nVGl0bGUoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotCi1wdWJsaWMgdm9pZCBzZXROZWdhdGl2ZUJ1dHRvblRleHQoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldE5lZ2F0aXZlQnV0dG9uVGV4dCgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi0KLXB1YmxpYyB2b2lkIHNldFBvc2l0aXZlQnV0dG9uVGV4dCgKLWludCkKLQotcHVibGljIHZvaWQgc2V0UG9zaXRpdmVCdXR0b25UZXh0KAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotcHJvdGVjdGVkIHZvaWQgc2hvd0RpYWxvZygKLWFuZHJvaWQub3MuQnVuZGxlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3ByZWZlcmVuY2UvRWRpdFRleHRQcmVmZXJlbmNlJFNhdmVkU3RhdGU7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I8TGFuZHJvaWQvcHJlZmVyZW5jZS9FZGl0VGV4dFByZWZlcmVuY2UkU2F2ZWRTdGF0ZTs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1maW5hbCBjbGFzcyBhbmRyb2lkLnByZWZlcmVuY2UuRWRpdFRleHRQcmVmZXJlbmNlJFNhdmVkU3RhdGUkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBhbmRyb2lkLnByZWZlcmVuY2UuRWRpdFRleHRQcmVmZXJlbmNlJFNhdmVkU3RhdGUgY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyBhbmRyb2lkLnByZWZlcmVuY2UuRWRpdFRleHRQcmVmZXJlbmNlJFNhdmVkU3RhdGVbXSBuZXdBcnJheSgKLWludCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3RbXSBuZXdBcnJheSgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPVNhdmVkU3RhdGUgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJlZmVyZW5jZS9FZGl0VGV4dFByZWZlcmVuY2U7ICkKLSBjbGFzcyBhbmRyb2lkLnByZWZlcmVuY2UuRWRpdFRleHRQcmVmZXJlbmNlJFNhdmVkU3RhdGUgZXh0ZW5kcyBhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZSRCYXNlU2F2ZWRTdGF0ZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC9wcmVmZXJlbmNlL0VkaXRUZXh0UHJlZmVyZW5jZSRTYXZlZFN0YXRlOz47ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IgQ1JFQVRPUgotCi0gamF2YS5sYW5nLlN0cmluZyB0ZXh0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5QYXJjZWxhYmxlKQotCi1wdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3ByZWZlcmVuY2UvRWRpdFRleHRQcmVmZXJlbmNlJFNhdmVkU3RhdGU7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnByZWZlcmVuY2UuRWRpdFRleHRQcmVmZXJlbmNlIGV4dGVuZHMgYW5kcm9pZC5wcmVmZXJlbmNlLkRpYWxvZ1ByZWZlcmVuY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLndpZGdldC5FZGl0VGV4dCBtRWRpdFRleHQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1UZXh0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldAotaW50KQotCi1wdWJsaWMgYW5kcm9pZC53aWRnZXQuRWRpdFRleHQgZ2V0RWRpdFRleHQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRUZXh0KCkKLQotcHJvdGVjdGVkIHZvaWQgb25BZGRFZGl0VGV4dFRvRGlhbG9nVmlldygKLWFuZHJvaWQudmlldy5WaWV3Ci1hbmRyb2lkLndpZGdldC5FZGl0VGV4dCkKLQotcHJvdGVjdGVkIHZvaWQgb25CaW5kRGlhbG9nVmlldygKLWFuZHJvaWQudmlldy5WaWV3KQotCi1wcm90ZWN0ZWQgdm9pZCBvbkRpYWxvZ0Nsb3NlZCgKLWJvb2xlYW4pCi0KLXByb3RlY3RlZCBqYXZhLmxhbmcuT2JqZWN0IG9uR2V0RGVmYXVsdFZhbHVlKAotYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5Ci1pbnQpCi0KLXByb3RlY3RlZCB2b2lkIG9uUmVzdG9yZUluc3RhbmNlU3RhdGUoCi1hbmRyb2lkLm9zLlBhcmNlbGFibGUpCi0KLXByb3RlY3RlZCBhbmRyb2lkLm9zLlBhcmNlbGFibGUgb25TYXZlSW5zdGFuY2VTdGF0ZSgpCi0KLXByb3RlY3RlZCB2b2lkIG9uU2V0SW5pdGlhbFZhbHVlKAotYm9vbGVhbgotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHZvaWQgc2V0VGV4dCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBib29sZWFuIHNob3VsZERpc2FibGVEZXBlbmRlbnRzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9RmFjdG9yeSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcmVmZXJlbmNlL0dlbmVyaWNJbmZsYXRlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS9sYW5nL09iamVjdDsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLnByZWZlcmVuY2UuR2VuZXJpY0luZmxhdGVyJEZhY3RvcnkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9TdHJpbmc7TGFuZHJvaWQvY29udGVudC9Db250ZXh0O0xhbmRyb2lkL3V0aWwvQXR0cmlidXRlU2V0OylUVDsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5PYmplY3Qgb25DcmVhdGVJdGVtKAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1GYWN0b3J5TWVyZ2VyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvbGFuZy9PYmplY3Q7TGFuZHJvaWQvcHJlZmVyZW5jZS9HZW5lcmljSW5mbGF0ZXIkRmFjdG9yeTxUVDs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcmVmZXJlbmNlL0dlbmVyaWNJbmZsYXRlcjsgKQotIGNsYXNzIGFuZHJvaWQucHJlZmVyZW5jZS5HZW5lcmljSW5mbGF0ZXIkRmFjdG9yeU1lcmdlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnByZWZlcmVuY2UuR2VuZXJpY0luZmxhdGVyJEZhY3RvcnkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MYW5kcm9pZC9wcmVmZXJlbmNlL0dlbmVyaWNJbmZsYXRlciRGYWN0b3J5PFRUOz47ICkKLXByaXZhdGUgZmluYWwgYW5kcm9pZC5wcmVmZXJlbmNlLkdlbmVyaWNJbmZsYXRlciRGYWN0b3J5IG1GMQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxhbmRyb2lkL3ByZWZlcmVuY2UvR2VuZXJpY0luZmxhdGVyJEZhY3Rvcnk8VFQ7PjsgKQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLnByZWZlcmVuY2UuR2VuZXJpY0luZmxhdGVyJEZhY3RvcnkgbUYyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGFuZHJvaWQvcHJlZmVyZW5jZS9HZW5lcmljSW5mbGF0ZXIkRmFjdG9yeTxUVDs+O0xhbmRyb2lkL3ByZWZlcmVuY2UvR2VuZXJpY0luZmxhdGVyJEZhY3Rvcnk8VFQ7PjspViApCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLnByZWZlcmVuY2UuR2VuZXJpY0luZmxhdGVyJEZhY3RvcnkKLWFuZHJvaWQucHJlZmVyZW5jZS5HZW5lcmljSW5mbGF0ZXIkRmFjdG9yeSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9TdHJpbmc7TGFuZHJvaWQvY29udGVudC9Db250ZXh0O0xhbmRyb2lkL3V0aWwvQXR0cmlidXRlU2V0OylUVDsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3Qgb25DcmVhdGVJdGVtKAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS9sYW5nL09iamVjdDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJlZmVyZW5jZS9HZW5lcmljSW5mbGF0ZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1QYXJlbnQgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLnByZWZlcmVuY2UuR2VuZXJpY0luZmxhdGVyJFBhcmVudCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUVDspViApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBhZGRJdGVtRnJvbUluZmxhdGVyKAotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3ByZWZlcmVuY2UvR2VuZXJpY0luZmxhdGVyJEZhY3RvcnlNZXJnZXI7TGFuZHJvaWQvcHJlZmVyZW5jZS9HZW5lcmljSW5mbGF0ZXIkRmFjdG9yeTtMYW5kcm9pZC9wcmVmZXJlbmNlL0dlbmVyaWNJbmZsYXRlciRQYXJlbnQ7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDtQOjpMYW5kcm9pZC9wcmVmZXJlbmNlL0dlbmVyaWNJbmZsYXRlciRQYXJlbnQ7PkxqYXZhL2xhbmcvT2JqZWN0OyApCi1hYnN0cmFjdCBjbGFzcyBhbmRyb2lkLnByZWZlcmVuY2UuR2VuZXJpY0luZmxhdGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQ2xhc3NbXSBtQ29uc3RydWN0b3JTaWduYXR1cmUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS51dGlsLkhhc2hNYXAgc0NvbnN0cnVjdG9yTWFwCi0KLXByaXZhdGUgZmluYWwgYm9vbGVhbiBERUJVRwotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5PYmplY3RbXSBtQ29uc3RydWN0b3JBcmdzCi0KLXByb3RlY3RlZCBmaW5hbCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBtQ29udGV4dAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbURlZmF1bHRQYWNrYWdlCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGFuZHJvaWQvcHJlZmVyZW5jZS9HZW5lcmljSW5mbGF0ZXIkRmFjdG9yeTxUVDs+OyApCi1wcml2YXRlIGFuZHJvaWQucHJlZmVyZW5jZS5HZW5lcmljSW5mbGF0ZXIkRmFjdG9yeSBtRmFjdG9yeQotCi1wcml2YXRlIGJvb2xlYW4gbUZhY3RvcnlTZXQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMYW5kcm9pZC9wcmVmZXJlbmNlL0dlbmVyaWNJbmZsYXRlcjxUVDtUUDs+O0xhbmRyb2lkL2NvbnRlbnQvQ29udGV4dDspViApCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLnByZWZlcmVuY2UuR2VuZXJpY0luZmxhdGVyCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXI7TGphdmEvbGFuZy9TdHJpbmc7TGFuZHJvaWQvdXRpbC9BdHRyaWJ1dGVTZXQ7KVRUOyApCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5PYmplY3QgY3JlYXRlSXRlbUZyb21UYWcoCi1vcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlcjtUVDtMYW5kcm9pZC91dGlsL0F0dHJpYnV0ZVNldDspViApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCBySW5mbGF0ZSgKLW9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXIKLWphdmEubGFuZy5PYmplY3QKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLnByZWZlcmVuY2UuR2VuZXJpY0luZmxhdGVyIGNsb25lSW5Db250ZXh0KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nO0xhbmRyb2lkL3V0aWwvQXR0cmlidXRlU2V0OylUVDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjtMYW5kcm9pZC92aWV3L0luZmxhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBqYXZhLmxhbmcuT2JqZWN0IGNyZWF0ZUl0ZW0oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0KQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgZ2V0Q29udGV4dCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldERlZmF1bHRQYWNrYWdlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxhbmRyb2lkL3ByZWZlcmVuY2UvR2VuZXJpY0luZmxhdGVyJEZhY3Rvcnk8VFQ7PjsgKQotcHVibGljIGZpbmFsIGFuZHJvaWQucHJlZmVyZW5jZS5HZW5lcmljSW5mbGF0ZXIkRmFjdG9yeSBnZXRGYWN0b3J5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSVRQOylUVDsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgaW5mbGF0ZSgKLWludAotYW5kcm9pZC5wcmVmZXJlbmNlLkdlbmVyaWNJbmZsYXRlciRQYXJlbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KElUUDtaKVRUOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBpbmZsYXRlKAotaW50Ci1hbmRyb2lkLnByZWZlcmVuY2UuR2VuZXJpY0luZmxhdGVyJFBhcmVudAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXI7VFA7KVRUOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBpbmZsYXRlKAotb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcgotYW5kcm9pZC5wcmVmZXJlbmNlLkdlbmVyaWNJbmZsYXRlciRQYXJlbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyO1RQO1opVFQ7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGluZmxhdGUoCi1vcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyCi1hbmRyb2lkLnByZWZlcmVuY2UuR2VuZXJpY0luZmxhdGVyJFBhcmVudAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlcjtUVDtMYW5kcm9pZC91dGlsL0F0dHJpYnV0ZVNldDspWiApCi1wcm90ZWN0ZWQgYm9vbGVhbiBvbkNyZWF0ZUN1c3RvbUZyb21UYWcoCi1vcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyCi1qYXZhLmxhbmcuT2JqZWN0Ci1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1N0cmluZztMYW5kcm9pZC91dGlsL0F0dHJpYnV0ZVNldDspVFQ7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0NsYXNzTm90Rm91bmRFeGNlcHRpb247ICkKLXByb3RlY3RlZCBqYXZhLmxhbmcuT2JqZWN0IG9uQ3JlYXRlSXRlbSgKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRQO1pUUDspVFA7ICkKLXByb3RlY3RlZCBhbmRyb2lkLnByZWZlcmVuY2UuR2VuZXJpY0luZmxhdGVyJFBhcmVudCBvbk1lcmdlUm9vdHMoCi1hbmRyb2lkLnByZWZlcmVuY2UuR2VuZXJpY0luZmxhdGVyJFBhcmVudAotYm9vbGVhbgotYW5kcm9pZC5wcmVmZXJlbmNlLkdlbmVyaWNJbmZsYXRlciRQYXJlbnQpCi0KLXB1YmxpYyB2b2lkIHNldERlZmF1bHRQYWNrYWdlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGFuZHJvaWQvcHJlZmVyZW5jZS9HZW5lcmljSW5mbGF0ZXIkRmFjdG9yeTxUVDs+OylWICkKLXB1YmxpYyB2b2lkIHNldEZhY3RvcnkoCi1hbmRyb2lkLnByZWZlcmVuY2UuR2VuZXJpY0luZmxhdGVyJEZhY3RvcnkpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotIGNsYXNzIGFuZHJvaWQucHJlZmVyZW5jZS5MaXN0UHJlZmVyZW5jZSQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UkT25DbGlja0xpc3RlbmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQucHJlZmVyZW5jZS5MaXN0UHJlZmVyZW5jZSB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLnByZWZlcmVuY2UuTGlzdFByZWZlcmVuY2UpCi0KLXB1YmxpYyB2b2lkIG9uQ2xpY2soCi1hbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJlZmVyZW5jZS9MaXN0UHJlZmVyZW5jZSRTYXZlZFN0YXRlOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExhbmRyb2lkL3ByZWZlcmVuY2UvTGlzdFByZWZlcmVuY2UkU2F2ZWRTdGF0ZTs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1maW5hbCBjbGFzcyBhbmRyb2lkLnByZWZlcmVuY2UuTGlzdFByZWZlcmVuY2UkU2F2ZWRTdGF0ZSQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGFuZHJvaWQucHJlZmVyZW5jZS5MaXN0UHJlZmVyZW5jZSRTYXZlZFN0YXRlIGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgYW5kcm9pZC5wcmVmZXJlbmNlLkxpc3RQcmVmZXJlbmNlJFNhdmVkU3RhdGVbXSBuZXdBcnJheSgKLWludCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3RbXSBuZXdBcnJheSgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcmVmZXJlbmNlL0xpc3RQcmVmZXJlbmNlOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPVNhdmVkU3RhdGUgKQotIGNsYXNzIGFuZHJvaWQucHJlZmVyZW5jZS5MaXN0UHJlZmVyZW5jZSRTYXZlZFN0YXRlIGV4dGVuZHMgYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2UkQmFzZVNhdmVkU3RhdGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I8TGFuZHJvaWQvcHJlZmVyZW5jZS9MaXN0UHJlZmVyZW5jZSRTYXZlZFN0YXRlOz47ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IgQ1JFQVRPUgotCi0gamF2YS5sYW5nLlN0cmluZyB2YWx1ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuUGFyY2VsYWJsZSkKLQotcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9wcmVmZXJlbmNlL0xpc3RQcmVmZXJlbmNlJFNhdmVkU3RhdGU7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnByZWZlcmVuY2UuTGlzdFByZWZlcmVuY2UgZXh0ZW5kcyBhbmRyb2lkLnByZWZlcmVuY2UuRGlhbG9nUHJlZmVyZW5jZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGludCBtQ2xpY2tlZERpYWxvZ0VudHJ5SW5kZXgKLQotcHJpdmF0ZSBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlW10gbUVudHJpZXMKLQotcHJpdmF0ZSBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlW10gbUVudHJ5VmFsdWVzCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtVmFsdWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDAwMigKLWFuZHJvaWQucHJlZmVyZW5jZS5MaXN0UHJlZmVyZW5jZQotaW50KQotCi1wcml2YXRlIGludCBnZXRWYWx1ZUluZGV4KCkKLQotcHVibGljIGludCBmaW5kSW5kZXhPZlZhbHVlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5DaGFyU2VxdWVuY2VbXSBnZXRFbnRyaWVzKCkKLQotcHVibGljIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgZ2V0RW50cnkoKQotCi1wdWJsaWMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZVtdIGdldEVudHJ5VmFsdWVzKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VmFsdWUoKQotCi1wcm90ZWN0ZWQgdm9pZCBvbkRpYWxvZ0Nsb3NlZCgKLWJvb2xlYW4pCi0KLXByb3RlY3RlZCBqYXZhLmxhbmcuT2JqZWN0IG9uR2V0RGVmYXVsdFZhbHVlKAotYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5Ci1pbnQpCi0KLXByb3RlY3RlZCB2b2lkIG9uUHJlcGFyZURpYWxvZ0J1aWxkZXIoCi1hbmRyb2lkLmFwcC5BbGVydERpYWxvZyRCdWlsZGVyKQotCi1wcm90ZWN0ZWQgdm9pZCBvblJlc3RvcmVJbnN0YW5jZVN0YXRlKAotYW5kcm9pZC5vcy5QYXJjZWxhYmxlKQotCi1wcm90ZWN0ZWQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlIG9uU2F2ZUluc3RhbmNlU3RhdGUoKQotCi1wcm90ZWN0ZWQgdm9pZCBvblNldEluaXRpYWxWYWx1ZSgKLWJvb2xlYW4KLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2lkIHNldEVudHJpZXMoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldEVudHJpZXMoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlW10pCi0KLXB1YmxpYyB2b2lkIHNldEVudHJ5VmFsdWVzKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRFbnRyeVZhbHVlcygKLWphdmEubGFuZy5DaGFyU2VxdWVuY2VbXSkKLQotcHVibGljIHZvaWQgc2V0VmFsdWUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRWYWx1ZUluZGV4KAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZSRCYXNlU2F2ZWRTdGF0ZTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2UkQmFzZVNhdmVkU3RhdGU7PjsgKQotZmluYWwgY2xhc3MgYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2UkQmFzZVNhdmVkU3RhdGUkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZSRCYXNlU2F2ZWRTdGF0ZSBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlJEJhc2VTYXZlZFN0YXRlW10gbmV3QXJyYXkoCi1pbnQpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0W10gbmV3QXJyYXkoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ0IG5hbWUgPU9uUHJlZmVyZW5jZUNoYW5nZUludGVybmFsTGlzdGVuZXIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlOyApCi1hYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2UkT25QcmVmZXJlbmNlQ2hhbmdlSW50ZXJuYWxMaXN0ZW5lciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvblByZWZlcmVuY2VDaGFuZ2UoCi1hbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgb25QcmVmZXJlbmNlSGllcmFyY2h5Q2hhbmdlKAotYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2UpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPU9uUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZTsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZSRPblByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBvblByZWZlcmVuY2VDaGFuZ2UoCi1hbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZQotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9T25QcmVmZXJlbmNlQ2xpY2tMaXN0ZW5lciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2U7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2UkT25QcmVmZXJlbmNlQ2xpY2tMaXN0ZW5lciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBvblByZWZlcmVuY2VDbGljaygKLWFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZUFjdGl2aXR5OyApCi0gY2xhc3MgYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VBY3Rpdml0eSQxIGV4dGVuZHMgYW5kcm9pZC5vcy5IYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlQWN0aXZpdHkgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VBY3Rpdml0eSkKLQotcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZSgKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDQgbmFtZSA9T25QcmVmZXJlbmNlVHJlZUNsaWNrTGlzdGVuZXIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlTWFuYWdlcjsgKQotYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlTWFuYWdlciRPblByZWZlcmVuY2VUcmVlQ2xpY2tMaXN0ZW5lciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBvblByZWZlcmVuY2VUcmVlQ2xpY2soCi1hbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZVNjcmVlbgotYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2UpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VBY3Rpdml0eSBleHRlbmRzIGFuZHJvaWQuYXBwLkxpc3RBY3Rpdml0eSBpbXBsZW1lbnRzIGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlTWFuYWdlciRPblByZWZlcmVuY2VUcmVlQ2xpY2tMaXN0ZW5lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRklSU1RfUkVRVUVTVF9DT0RFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfQklORF9QUkVGRVJFTkNFUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBSRUZFUkVOQ0VTX1RBRwotCi1wcml2YXRlIGFuZHJvaWQub3MuSGFuZGxlciBtSGFuZGxlcgotCi1wcml2YXRlIGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlTWFuYWdlciBtUHJlZmVyZW5jZU1hbmFnZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMDAwKAotYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VBY3Rpdml0eSkKLQotcHJpdmF0ZSB2b2lkIGJpbmRQcmVmZXJlbmNlcygpCi0KLXByaXZhdGUgYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VNYW5hZ2VyIG9uQ3JlYXRlUHJlZmVyZW5jZU1hbmFnZXIoKQotCi1wcml2YXRlIHZvaWQgcG9zdEJpbmRQcmVmZXJlbmNlcygpCi0KLXByaXZhdGUgdm9pZCByZXF1aXJlUHJlZmVyZW5jZU1hbmFnZXIoKQotCi1wdWJsaWMgdm9pZCBhZGRQcmVmZXJlbmNlc0Zyb21JbnRlbnQoCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50KQotCi1wdWJsaWMgdm9pZCBhZGRQcmVmZXJlbmNlc0Zyb21SZXNvdXJjZSgKLWludCkKLQotcHVibGljIGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlIGZpbmRQcmVmZXJlbmNlKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotcHVibGljIGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlTWFuYWdlciBnZXRQcmVmZXJlbmNlTWFuYWdlcigpCi0KLXB1YmxpYyBhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZVNjcmVlbiBnZXRQcmVmZXJlbmNlU2NyZWVuKCkKLQotcHJvdGVjdGVkIHZvaWQgb25BY3Rpdml0eVJlc3VsdCgKLWludAotaW50Ci1hbmRyb2lkLmNvbnRlbnQuSW50ZW50KQotCi1wdWJsaWMgdm9pZCBvbkNvbnRlbnRDaGFuZ2VkKCkKLQotcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoCi1hbmRyb2lkLm9zLkJ1bmRsZSkKLQotcHJvdGVjdGVkIHZvaWQgb25EZXN0cm95KCkKLQotcHJvdGVjdGVkIHZvaWQgb25OZXdJbnRlbnQoCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50KQotCi1wdWJsaWMgYm9vbGVhbiBvblByZWZlcmVuY2VUcmVlQ2xpY2soCi1hbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZVNjcmVlbgotYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2UpCi0KLXByb3RlY3RlZCB2b2lkIG9uUmVzdG9yZUluc3RhbmNlU3RhdGUoCi1hbmRyb2lkLm9zLkJ1bmRsZSkKLQotcHJvdGVjdGVkIHZvaWQgb25TYXZlSW5zdGFuY2VTdGF0ZSgKLWFuZHJvaWQub3MuQnVuZGxlKQotCi1wcm90ZWN0ZWQgdm9pZCBvblN0b3AoKQotCi1wdWJsaWMgdm9pZCBzZXRQcmVmZXJlbmNlU2NyZWVuKAotYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VTY3JlZW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxhbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZTtMYW5kcm9pZC9wcmVmZXJlbmNlL0dlbmVyaWNJbmZsYXRlciRQYXJlbnQ8TGFuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlOz47ICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUdyb3VwIGV4dGVuZHMgYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2UgaW1wbGVtZW50cyBhbmRyb2lkLnByZWZlcmVuY2UuR2VuZXJpY0luZmxhdGVyJFBhcmVudAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGJvb2xlYW4gbUF0dGFjaGVkVG9BY3Rpdml0eQotCi1wcml2YXRlIGludCBtQ3VycmVudFByZWZlcmVuY2VPcmRlcgotCi1wcml2YXRlIGJvb2xlYW4gbU9yZGVyaW5nQXNBZGRlZAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2U7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdCBtUHJlZmVyZW5jZUxpc3QKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQKLWludCkKLQotcHJpdmF0ZSBib29sZWFuIHJlbW92ZVByZWZlcmVuY2VJbnQoCi1hbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZSkKLQotcHVibGljIHZvaWQgYWRkSXRlbUZyb21JbmZsYXRlcigKLWFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlKQotCi1wdWJsaWMgdm9sYXRpbGUgdm9pZCBhZGRJdGVtRnJvbUluZmxhdGVyKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGJvb2xlYW4gYWRkUHJlZmVyZW5jZSgKLWFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlKQotCi1wcm90ZWN0ZWQgdm9pZCBkaXNwYXRjaFJlc3RvcmVJbnN0YW5jZVN0YXRlKAotYW5kcm9pZC5vcy5CdW5kbGUpCi0KLXByb3RlY3RlZCB2b2lkIGRpc3BhdGNoU2F2ZUluc3RhbmNlU3RhdGUoCi1hbmRyb2lkLm9zLkJ1bmRsZSkKLQotcHVibGljIGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlIGZpbmRQcmVmZXJlbmNlKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotcHVibGljIGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlIGdldFByZWZlcmVuY2UoCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0UHJlZmVyZW5jZUNvdW50KCkKLQotcHJvdGVjdGVkIGJvb2xlYW4gaXNPblNhbWVTY3JlZW5Bc0NoaWxkcmVuKCkKLQotcHVibGljIGJvb2xlYW4gaXNPcmRlcmluZ0FzQWRkZWQoKQotCi1wcm90ZWN0ZWQgdm9pZCBvbkF0dGFjaGVkVG9BY3Rpdml0eSgpCi0KLXByb3RlY3RlZCBib29sZWFuIG9uUHJlcGFyZUFkZFByZWZlcmVuY2UoCi1hbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZSkKLQotcHJvdGVjdGVkIHZvaWQgb25QcmVwYXJlRm9yUmVtb3ZhbCgpCi0KLXB1YmxpYyB2b2lkIHJlbW92ZUFsbCgpCi0KLXB1YmxpYyBib29sZWFuIHJlbW92ZVByZWZlcmVuY2UoCi1hbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZSkKLQotcHVibGljIHZvaWQgc2V0RW5hYmxlZCgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldE9yZGVyaW5nQXNBZGRlZCgKLWJvb2xlYW4pCi0KLSB2b2lkIHNvcnRQcmVmZXJlbmNlcygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VDYXRlZ29yeSBleHRlbmRzIGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlR3JvdXAKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ci1pbnQpCi0KLXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpCi0KLXByb3RlY3RlZCBib29sZWFuIG9uUHJlcGFyZUFkZFByZWZlcmVuY2UoCi1hbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VHcm91cEFkYXB0ZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLSBjbGFzcyBhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUdyb3VwQWRhcHRlciQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5SdW5uYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUdyb3VwQWRhcHRlciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUdyb3VwQWRhcHRlcikKLQotcHVibGljIHZvaWQgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLSBjbGFzcyBhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUdyb3VwQWRhcHRlciBleHRlbmRzIGFuZHJvaWQud2lkZ2V0LkJhc2VBZGFwdGVyIGltcGxlbWVudHMgYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2UkT25QcmVmZXJlbmNlQ2hhbmdlSW50ZXJuYWxMaXN0ZW5lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRBRwotCi1wcml2YXRlIGFuZHJvaWQub3MuSGFuZGxlciBtSGFuZGxlcgotCi1wcml2YXRlIGJvb2xlYW4gbUhhc1JldHVybmVkVmlld1R5cGVDb3VudAotCi1wcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gbUlzU3luY2luZwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvTGlzdDxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wcml2YXRlIGphdmEudXRpbC5MaXN0IG1QcmVmZXJlbmNlQ2xhc3NOYW1lcwotCi1wcml2YXRlIGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlR3JvdXAgbVByZWZlcmVuY2VHcm91cAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2U7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdCBtUHJlZmVyZW5jZUxpc3QKLQotcHJpdmF0ZSBqYXZhLmxhbmcuUnVubmFibGUgbVN5bmNSdW5uYWJsZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlR3JvdXApCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQwMDAoCi1hbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUdyb3VwQWRhcHRlcikKLQotcHJpdmF0ZSB2b2lkIGFkZFByZWZlcmVuY2VDbGFzc05hbWUoCi1hbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZTs+O0xhbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZUdyb3VwOylWICkKLXByaXZhdGUgdm9pZCBmbGF0dGVuUHJlZmVyZW5jZUdyb3VwKAotamF2YS51dGlsLkxpc3QKLWFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlR3JvdXApCi0KLXByaXZhdGUgdm9pZCBzeW5jTXlQcmVmZXJlbmNlcygpCi0KLXB1YmxpYyBib29sZWFuIGFyZUFsbEl0ZW1zRW5hYmxlZCgpCi0KLXB1YmxpYyBpbnQgZ2V0Q291bnQoKQotCi1wdWJsaWMgYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2UgZ2V0SXRlbSgKLWludCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgZ2V0SXRlbSgKLWludCkKLQotcHVibGljIGxvbmcgZ2V0SXRlbUlkKAotaW50KQotCi1wdWJsaWMgaW50IGdldEl0ZW1WaWV3VHlwZSgKLWludCkKLQotcHVibGljIGFuZHJvaWQudmlldy5WaWV3IGdldFZpZXcoCi1pbnQKLWFuZHJvaWQudmlldy5WaWV3Ci1hbmRyb2lkLnZpZXcuVmlld0dyb3VwKQotCi1wdWJsaWMgaW50IGdldFZpZXdUeXBlQ291bnQoKQotCi1wdWJsaWMgYm9vbGVhbiBoYXNTdGFibGVJZHMoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIG9uUHJlZmVyZW5jZUNoYW5nZSgKLWFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlKQotCi1wdWJsaWMgdm9pZCBvblByZWZlcmVuY2VIaWVyYXJjaHlDaGFuZ2UoCi1hbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGFuZHJvaWQvcHJlZmVyZW5jZS9HZW5lcmljSW5mbGF0ZXI8TGFuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlO0xhbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZUdyb3VwOz47ICkKLSBjbGFzcyBhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUluZmxhdGVyIGV4dGVuZHMgYW5kcm9pZC5wcmVmZXJlbmNlLkdlbmVyaWNJbmZsYXRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIElOVEVOVF9UQUdfTkFNRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRBRwotCi1wcml2YXRlIGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlTWFuYWdlciBtUHJlZmVyZW5jZU1hbmFnZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VNYW5hZ2VyKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMYW5kcm9pZC9wcmVmZXJlbmNlL0dlbmVyaWNJbmZsYXRlcjxMYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2U7TGFuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlR3JvdXA7PjtMYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VNYW5hZ2VyO0xhbmRyb2lkL2NvbnRlbnQvQ29udGV4dDspViApCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLnByZWZlcmVuY2UuR2VuZXJpY0luZmxhdGVyCi1hbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZU1hbmFnZXIKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wcml2YXRlIHZvaWQgaW5pdCgKLWFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlTWFuYWdlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGFuZHJvaWQvY29udGVudC9Db250ZXh0OylMYW5kcm9pZC9wcmVmZXJlbmNlL0dlbmVyaWNJbmZsYXRlcjxMYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2U7TGFuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlR3JvdXA7PjsgKQotcHVibGljIGFuZHJvaWQucHJlZmVyZW5jZS5HZW5lcmljSW5mbGF0ZXIgY2xvbmVJbkNvbnRleHQoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGJvb2xlYW4gb25DcmVhdGVDdXN0b21Gcm9tVGFnKAotb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcgotYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2UKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2xhdGlsZSBib29sZWFuIG9uQ3JlYXRlQ3VzdG9tRnJvbVRhZygKLW9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXIKLWphdmEubGFuZy5PYmplY3QKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi0KLXByb3RlY3RlZCB2b2xhdGlsZSBhbmRyb2lkLnByZWZlcmVuY2UuR2VuZXJpY0luZmxhdGVyJFBhcmVudCBvbk1lcmdlUm9vdHMoCi1hbmRyb2lkLnByZWZlcmVuY2UuR2VuZXJpY0luZmxhdGVyJFBhcmVudAotYm9vbGVhbgotYW5kcm9pZC5wcmVmZXJlbmNlLkdlbmVyaWNJbmZsYXRlciRQYXJlbnQpCi0KLXByb3RlY3RlZCBhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUdyb3VwIG9uTWVyZ2VSb290cygKLWFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlR3JvdXAKLWJvb2xlYW4KLWFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlR3JvdXApCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPU9uQWN0aXZpdHlSZXN1bHRMaXN0ZW5lciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VNYW5hZ2VyOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlTWFuYWdlciRPbkFjdGl2aXR5UmVzdWx0TGlzdGVuZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gb25BY3Rpdml0eVJlc3VsdCgKLWludAotaW50Ci1hbmRyb2lkLmNvbnRlbnQuSW50ZW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZU1hbmFnZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1PbkFjdGl2aXR5U3RvcExpc3RlbmVyICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VNYW5hZ2VyJE9uQWN0aXZpdHlTdG9wTGlzdGVuZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgb25BY3Rpdml0eVN0b3AoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlTWFuYWdlciRPbkFjdGl2aXR5RGVzdHJveUxpc3RlbmVyO0xhbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZU1hbmFnZXIkT25BY3Rpdml0eVN0b3BMaXN0ZW5lcjtMYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VNYW5hZ2VyJE9uQWN0aXZpdHlSZXN1bHRMaXN0ZW5lcjtMYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VNYW5hZ2VyJE9uUHJlZmVyZW5jZVRyZWVDbGlja0xpc3RlbmVyOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VNYW5hZ2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgS0VZX0hBU19TRVRfREVGQVVMVF9WQUxVRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1FVEFEQVRBX0tFWV9QUkVGRVJFTkNFUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRBRwotCi1wcml2YXRlIGFuZHJvaWQuYXBwLkFjdGl2aXR5IG1BY3Rpdml0eQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VNYW5hZ2VyJE9uQWN0aXZpdHlEZXN0cm95TGlzdGVuZXI7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdCBtQWN0aXZpdHlEZXN0cm95TGlzdGVuZXJzCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZU1hbmFnZXIkT25BY3Rpdml0eVJlc3VsdExpc3RlbmVyOz47ICkKLXByaXZhdGUgamF2YS51dGlsLkxpc3QgbUFjdGl2aXR5UmVzdWx0TGlzdGVuZXJzCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZU1hbmFnZXIkT25BY3Rpdml0eVN0b3BMaXN0ZW5lcjs+OyApCi1wcml2YXRlIGphdmEudXRpbC5MaXN0IG1BY3Rpdml0eVN0b3BMaXN0ZW5lcnMKLQotcHJpdmF0ZSBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBtQ29udGV4dAotCi1wcml2YXRlIGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlcyRFZGl0b3IgbUVkaXRvcgotCi1wcml2YXRlIGxvbmcgbU5leHRJZAotCi1wcml2YXRlIGludCBtTmV4dFJlcXVlc3RDb2RlCi0KLXByaXZhdGUgYm9vbGVhbiBtTm9Db21taXQKLQotcHJpdmF0ZSBhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZU1hbmFnZXIkT25QcmVmZXJlbmNlVHJlZUNsaWNrTGlzdGVuZXIgbU9uUHJlZmVyZW5jZVRyZWVDbGlja0xpc3RlbmVyCi0KLXByaXZhdGUgYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VTY3JlZW4gbVByZWZlcmVuY2VTY3JlZW4KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0xpc3Q8TGFuZHJvaWQvY29udGVudC9EaWFsb2dJbnRlcmZhY2U7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdCBtUHJlZmVyZW5jZXNTY3JlZW5zCi0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzIG1TaGFyZWRQcmVmZXJlbmNlcwotCi1wcml2YXRlIGludCBtU2hhcmVkUHJlZmVyZW5jZXNNb2RlCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtU2hhcmVkUHJlZmVyZW5jZXNOYW1lCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5hcHAuQWN0aXZpdHkKLWludCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlcyBnZXREZWZhdWx0U2hhcmVkUHJlZmVyZW5jZXMoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotcHJpdmF0ZSBzdGF0aWMgaW50IGdldERlZmF1bHRTaGFyZWRQcmVmZXJlbmNlc01vZGUoKQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldERlZmF1bHRTaGFyZWRQcmVmZXJlbmNlc05hbWUoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotcHJpdmF0ZSB2b2lkIGluaXQoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGFuZHJvaWQvY29udGVudC9JbnRlbnQ7KUxqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9jb250ZW50L3BtL1Jlc29sdmVJbmZvOz47ICkKLXByaXZhdGUgamF2YS51dGlsLkxpc3QgcXVlcnlJbnRlbnRBY3Rpdml0aWVzKAotYW5kcm9pZC5jb250ZW50LkludGVudCkKLQotcHVibGljIHN0YXRpYyB2b2lkIHNldERlZmF1bHRWYWx1ZXMoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotaW50Ci1ib29sZWFuKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVmYXVsdFZhbHVlcygKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludAotYm9vbGVhbikKLQotcHJpdmF0ZSB2b2lkIHNldE5vQ29tbWl0KAotYm9vbGVhbikKLQotIHZvaWQgYWRkUHJlZmVyZW5jZXNTY3JlZW4oCi1hbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlKQotCi1wdWJsaWMgYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VTY3JlZW4gY3JlYXRlUHJlZmVyZW5jZVNjcmVlbigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi0gdm9pZCBkaXNwYXRjaEFjdGl2aXR5RGVzdHJveSgpCi0KLSB2b2lkIGRpc3BhdGNoQWN0aXZpdHlSZXN1bHQoCi1pbnQKLWludAotYW5kcm9pZC5jb250ZW50LkludGVudCkKLQotIHZvaWQgZGlzcGF0Y2hBY3Rpdml0eVN0b3AoKQotCi0gdm9pZCBkaXNwYXRjaE5ld0ludGVudCgKLWFuZHJvaWQuY29udGVudC5JbnRlbnQpCi0KLXB1YmxpYyBhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZSBmaW5kUHJlZmVyZW5jZSgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi0KLSBhbmRyb2lkLmFwcC5BY3Rpdml0eSBnZXRBY3Rpdml0eSgpCi0KLSBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBnZXRDb250ZXh0KCkKLQotIGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlcyRFZGl0b3IgZ2V0RWRpdG9yKCkKLQotIGxvbmcgZ2V0TmV4dElkKCkKLQotIGludCBnZXROZXh0UmVxdWVzdENvZGUoKQotCi0gYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VNYW5hZ2VyJE9uUHJlZmVyZW5jZVRyZWVDbGlja0xpc3RlbmVyIGdldE9uUHJlZmVyZW5jZVRyZWVDbGlja0xpc3RlbmVyKCkKLQotIGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlU2NyZWVuIGdldFByZWZlcmVuY2VTY3JlZW4oKQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzIGdldFNoYXJlZFByZWZlcmVuY2VzKCkKLQotcHVibGljIGludCBnZXRTaGFyZWRQcmVmZXJlbmNlc01vZGUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTaGFyZWRQcmVmZXJlbmNlc05hbWUoKQotCi0gYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VTY3JlZW4gaW5mbGF0ZUZyb21JbnRlbnQoCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50Ci1hbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZVNjcmVlbikKLQotIGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlU2NyZWVuIGluZmxhdGVGcm9tUmVzb3VyY2UoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotaW50Ci1hbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZVNjcmVlbikKLQotIHZvaWQgcmVnaXN0ZXJPbkFjdGl2aXR5RGVzdHJveUxpc3RlbmVyKAotYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VNYW5hZ2VyJE9uQWN0aXZpdHlEZXN0cm95TGlzdGVuZXIpCi0KLSB2b2lkIHJlZ2lzdGVyT25BY3Rpdml0eVJlc3VsdExpc3RlbmVyKAotYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VNYW5hZ2VyJE9uQWN0aXZpdHlSZXN1bHRMaXN0ZW5lcikKLQotIHZvaWQgcmVnaXN0ZXJPbkFjdGl2aXR5U3RvcExpc3RlbmVyKAotYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VNYW5hZ2VyJE9uQWN0aXZpdHlTdG9wTGlzdGVuZXIpCi0KLSB2b2lkIHJlbW92ZVByZWZlcmVuY2VzU2NyZWVuKAotYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZSkKLQotIHZvaWQgc2V0T25QcmVmZXJlbmNlVHJlZUNsaWNrTGlzdGVuZXIoCi1hbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZU1hbmFnZXIkT25QcmVmZXJlbmNlVHJlZUNsaWNrTGlzdGVuZXIpCi0KLSBib29sZWFuIHNldFByZWZlcmVuY2VzKAotYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VTY3JlZW4pCi0KLXB1YmxpYyB2b2lkIHNldFNoYXJlZFByZWZlcmVuY2VzTW9kZSgKLWludCkKLQotcHVibGljIHZvaWQgc2V0U2hhcmVkUHJlZmVyZW5jZXNOYW1lKAotamF2YS5sYW5nLlN0cmluZykKLQotIGJvb2xlYW4gc2hvdWxkQ29tbWl0KCkKLQotIHZvaWQgdW5yZWdpc3Rlck9uQWN0aXZpdHlEZXN0cm95TGlzdGVuZXIoCi1hbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZU1hbmFnZXIkT25BY3Rpdml0eURlc3Ryb3lMaXN0ZW5lcikKLQotIHZvaWQgdW5yZWdpc3Rlck9uQWN0aXZpdHlSZXN1bHRMaXN0ZW5lcigKLWFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlTWFuYWdlciRPbkFjdGl2aXR5UmVzdWx0TGlzdGVuZXIpCi0KLSB2b2lkIHVucmVnaXN0ZXJPbkFjdGl2aXR5U3RvcExpc3RlbmVyKAotYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VNYW5hZ2VyJE9uQWN0aXZpdHlTdG9wTGlzdGVuZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlU2NyZWVuJFNhdmVkU3RhdGU7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I8TGFuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlU2NyZWVuJFNhdmVkU3RhdGU7PjsgKQotZmluYWwgY2xhc3MgYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VTY3JlZW4kU2F2ZWRTdGF0ZSQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlU2NyZWVuJFNhdmVkU3RhdGUgY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyBhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZVNjcmVlbiRTYXZlZFN0YXRlW10gbmV3QXJyYXkoCi1pbnQpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0W10gbmV3QXJyYXkoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlU2NyZWVuOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPVNhdmVkU3RhdGUgKQotIGNsYXNzIGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlU2NyZWVuJFNhdmVkU3RhdGUgZXh0ZW5kcyBhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZSRCYXNlU2F2ZWRTdGF0ZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VTY3JlZW4kU2F2ZWRTdGF0ZTs+OyApCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yIENSRUFUT1IKLQotIGFuZHJvaWQub3MuQnVuZGxlIGRpYWxvZ0J1bmRsZQotCi0gYm9vbGVhbiBpc0RpYWxvZ1Nob3dpbmcKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLlBhcmNlbGFibGUpCi0KLXB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlU2NyZWVuJFNhdmVkU3RhdGU7ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZVNjcmVlbiBleHRlbmRzIGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlR3JvdXAgaW1wbGVtZW50cyBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldyRPbkl0ZW1DbGlja0xpc3RlbmVyLCBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlJE9uRGlzbWlzc0xpc3RlbmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYW5kcm9pZC5hcHAuRGlhbG9nIG1EaWFsb2cKLQotcHJpdmF0ZSBhbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlciBtUm9vdEFkYXB0ZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHJpdmF0ZSB2b2lkIHNob3dEaWFsb2coCi1hbmRyb2lkLm9zLkJ1bmRsZSkKLQotcHVibGljIHZvaWQgYmluZCgKLWFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3KQotCi1wdWJsaWMgYW5kcm9pZC5hcHAuRGlhbG9nIGdldERpYWxvZygpCi0KLXB1YmxpYyBhbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlciBnZXRSb290QWRhcHRlcigpCi0KLXByb3RlY3RlZCBib29sZWFuIGlzT25TYW1lU2NyZWVuQXNDaGlsZHJlbigpCi0KLXByb3RlY3RlZCB2b2lkIG9uQ2xpY2soKQotCi1wcm90ZWN0ZWQgYW5kcm9pZC53aWRnZXQuTGlzdEFkYXB0ZXIgb25DcmVhdGVSb290QWRhcHRlcigpCi0KLXB1YmxpYyB2b2lkIG9uRGlzbWlzcygKLWFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UpCi0KLXB1YmxpYyB2b2lkIG9uSXRlbUNsaWNrKAotYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXcKLWFuZHJvaWQudmlldy5WaWV3Ci1pbnQKLWxvbmcpCi0KLXByb3RlY3RlZCB2b2lkIG9uUmVzdG9yZUluc3RhbmNlU3RhdGUoCi1hbmRyb2lkLm9zLlBhcmNlbGFibGUpCi0KLXByb3RlY3RlZCBhbmRyb2lkLm9zLlBhcmNlbGFibGUgb25TYXZlSW5zdGFuY2VTdGF0ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5wcmVmZXJlbmNlLlJpbmd0b25lUHJlZmVyZW5jZSBleHRlbmRzIGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlIGltcGxlbWVudHMgYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VNYW5hZ2VyJE9uQWN0aXZpdHlSZXN1bHRMaXN0ZW5lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRBRwotCi1wcml2YXRlIGludCBtUmVxdWVzdENvZGUKLQotcHJpdmF0ZSBpbnQgbVJpbmd0b25lVHlwZQotCi1wcml2YXRlIGJvb2xlYW4gbVNob3dEZWZhdWx0Ci0KLXByaXZhdGUgYm9vbGVhbiBtU2hvd1NpbGVudAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQKLWludCkKLQotcHVibGljIGludCBnZXRSaW5ndG9uZVR5cGUoKQotCi1wdWJsaWMgYm9vbGVhbiBnZXRTaG93RGVmYXVsdCgpCi0KLXB1YmxpYyBib29sZWFuIGdldFNob3dTaWxlbnQoKQotCi1wdWJsaWMgYm9vbGVhbiBvbkFjdGl2aXR5UmVzdWx0KAotaW50Ci1pbnQKLWFuZHJvaWQuY29udGVudC5JbnRlbnQpCi0KLXByb3RlY3RlZCB2b2lkIG9uQXR0YWNoZWRUb0hpZXJhcmNoeSgKLWFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlTWFuYWdlcikKLQotcHJvdGVjdGVkIHZvaWQgb25DbGljaygpCi0KLXByb3RlY3RlZCBqYXZhLmxhbmcuT2JqZWN0IG9uR2V0RGVmYXVsdFZhbHVlKAotYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5Ci1pbnQpCi0KLXByb3RlY3RlZCB2b2lkIG9uUHJlcGFyZVJpbmd0b25lUGlja2VySW50ZW50KAotYW5kcm9pZC5jb250ZW50LkludGVudCkKLQotcHJvdGVjdGVkIGFuZHJvaWQubmV0LlVyaSBvblJlc3RvcmVSaW5ndG9uZSgpCi0KLXByb3RlY3RlZCB2b2lkIG9uU2F2ZVJpbmd0b25lKAotYW5kcm9pZC5uZXQuVXJpKQotCi1wcm90ZWN0ZWQgdm9pZCBvblNldEluaXRpYWxWYWx1ZSgKLWJvb2xlYW4KLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2lkIHNldFJpbmd0b25lVHlwZSgKLWludCkKLQotcHVibGljIHZvaWQgc2V0U2hvd0RlZmF1bHQoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRTaG93U2lsZW50KAotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnByZWZlcmVuY2UuU2Vla0JhclByZWZlcmVuY2UgZXh0ZW5kcyBhbmRyb2lkLnByZWZlcmVuY2UuRGlhbG9nUHJlZmVyZW5jZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRBRwotCi1wcml2YXRlIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgbU15SWNvbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0KQotCi1wcm90ZWN0ZWQgc3RhdGljIGFuZHJvaWQud2lkZ2V0LlNlZWtCYXIgZ2V0U2Vla0JhcigKLWFuZHJvaWQudmlldy5WaWV3KQotCi1wcm90ZWN0ZWQgdm9pZCBvbkJpbmREaWFsb2dWaWV3KAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJlZmVyZW5jZS9Wb2x1bWVQcmVmZXJlbmNlOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi0gY2xhc3MgYW5kcm9pZC5wcmVmZXJlbmNlLlZvbHVtZVByZWZlcmVuY2UkMSBleHRlbmRzIGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQucHJlZmVyZW5jZS5Wb2x1bWVQcmVmZXJlbmNlIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQucHJlZmVyZW5jZS5Wb2x1bWVQcmVmZXJlbmNlCi1hbmRyb2lkLm9zLkhhbmRsZXIpCi0KLXB1YmxpYyB2b2lkIG9uQ2hhbmdlKAotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9T25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L1NlZWtCYXI7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC53aWRnZXQuU2Vla0JhciRPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvblByb2dyZXNzQ2hhbmdlZCgKLWFuZHJvaWQud2lkZ2V0LlNlZWtCYXIKLWludAotYm9vbGVhbikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgb25TdGFydFRyYWNraW5nVG91Y2goCi1hbmRyb2lkLndpZGdldC5TZWVrQmFyKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvblN0b3BUcmFja2luZ1RvdWNoKAotYW5kcm9pZC53aWRnZXQuU2Vla0JhcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnByZWZlcmVuY2UuVm9sdW1lUHJlZmVyZW5jZSBleHRlbmRzIGFuZHJvaWQucHJlZmVyZW5jZS5TZWVrQmFyUHJlZmVyZW5jZSBpbXBsZW1lbnRzIGFuZHJvaWQud2lkZ2V0LlNlZWtCYXIkT25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIsIGphdmEubGFuZy5SdW5uYWJsZSwgYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VNYW5hZ2VyJE9uQWN0aXZpdHlTdG9wTGlzdGVuZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLQotcHJpdmF0ZSBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyIG1Db250ZW50UmVzb2x2ZXIKLQotcHJpdmF0ZSBhbmRyb2lkLm9zLkhhbmRsZXIgbUhhbmRsZXIKLQotcHJpdmF0ZSBpbnQgbUxhc3RQcm9ncmVzcwotCi1wcml2YXRlIGludCBtT3JpZ2luYWxTdHJlYW1Wb2x1bWUKLQotcHJpdmF0ZSBhbmRyb2lkLm1lZGlhLlJpbmd0b25lIG1SaW5ndG9uZQotCi1wcml2YXRlIGFuZHJvaWQud2lkZ2V0LlNlZWtCYXIgbVNlZWtCYXIKLQotcHJpdmF0ZSBpbnQgbVN0cmVhbVR5cGUKLQotcHJpdmF0ZSBhbmRyb2lkLm1lZGlhLkF1ZGlvTWFuYWdlciBtVm9sdW1lCi0KLXByaXZhdGUgYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXIgbVZvbHVtZU9ic2VydmVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi0KLXN0YXRpYyBhbmRyb2lkLndpZGdldC5TZWVrQmFyIGFjY2VzcyQwMDAoCi1hbmRyb2lkLnByZWZlcmVuY2UuVm9sdW1lUHJlZmVyZW5jZSkKLQotc3RhdGljIGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIgYWNjZXNzJDEwMCgKLWFuZHJvaWQucHJlZmVyZW5jZS5Wb2x1bWVQcmVmZXJlbmNlKQotCi1zdGF0aWMgaW50IGFjY2VzcyQyMDAoCi1hbmRyb2lkLnByZWZlcmVuY2UuVm9sdW1lUHJlZmVyZW5jZSkKLQotcHJpdmF0ZSB2b2lkIGNsZWFudXAoKQotCi1wcml2YXRlIHZvaWQgcG9zdFNldFZvbHVtZSgKLWludCkKLQotcHJpdmF0ZSB2b2lkIHNhbXBsZSgpCi0KLXByaXZhdGUgdm9pZCBzdG9wU2FtcGxlKCkKLQotcHVibGljIHZvaWQgb25BY3Rpdml0eVN0b3AoKQotCi1wcm90ZWN0ZWQgdm9pZCBvbkJpbmREaWFsb2dWaWV3KAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXByb3RlY3RlZCB2b2lkIG9uRGlhbG9nQ2xvc2VkKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgb25Qcm9ncmVzc0NoYW5nZWQoCi1hbmRyb2lkLndpZGdldC5TZWVrQmFyCi1pbnQKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIG9uU3RhcnRUcmFja2luZ1RvdWNoKAotYW5kcm9pZC53aWRnZXQuU2Vla0JhcikKLQotcHVibGljIHZvaWQgb25TdG9wVHJhY2tpbmdUb3VjaCgKLWFuZHJvaWQud2lkZ2V0LlNlZWtCYXIpCi0KLXB1YmxpYyB2b2lkIHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuQmFzZUNvbHVtbnMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBfQ09VTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIF9JRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPUJvb2ttYXJrQ29sdW1ucyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9Ccm93c2VyOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5Ccm93c2VyJEJvb2ttYXJrQ29sdW1ucyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBCT09LTUFSSwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ1JFQVRFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREFURQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRkFWSUNPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVElUTEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFVSTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVklTSVRTCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9Ccm93c2VyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9U2VhcmNoQ29sdW1ucyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5Ccm93c2VyJFNlYXJjaENvbHVtbnMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5wcm92aWRlci5CYXNlQ29sdW1ucwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREFURQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0VBUkNICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBVUkwKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvQnJvd3NlciRTZWFyY2hDb2x1bW5zO0xhbmRyb2lkL3Byb3ZpZGVyL0Jyb3dzZXIkQm9va21hcmtDb2x1bW5zOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5Ccm93c2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBCT09LTUFSS1NfVVJJCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZ1tdIEhJU1RPUllfUFJPSkVDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBISVNUT1JZX1BST0pFQ1RJT05fQk9PS01BUktfSU5ERVgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSElTVE9SWV9QUk9KRUNUSU9OX0RBVEVfSU5ERVgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSElTVE9SWV9QUk9KRUNUSU9OX0ZBVklDT05fSU5ERVgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSElTVE9SWV9QUk9KRUNUSU9OX0lEX0lOREVYCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhJU1RPUllfUFJPSkVDVElPTl9USVRMRV9JTkRFWAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBISVNUT1JZX1BST0pFQ1RJT05fVVJMX0lOREVYCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhJU1RPUllfUFJPSkVDVElPTl9WSVNJVFNfSU5ERVgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIElOSVRJQUxfWk9PTV9MRVZFTAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIExPR1RBRwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0hJU1RPUllfQ09VTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gU0VBUkNIRVNfUFJPSkVDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRUFSQ0hFU19QUk9KRUNUSU9OX0RBVEVfSU5ERVgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VBUkNIRVNfUFJPSkVDVElPTl9TRUFSQ0hfSU5ERVgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmkgU0VBUkNIRVNfVVJJCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0VBUkNIRVNfV0hFUkVfQ0xBVVNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZ1tdIFRSVU5DQVRFX0hJU1RPUllfUFJPSkVDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUUlVOQ0FURV9ISVNUT1JZX1BST0pFQ1RJT05fSURfSU5ERVgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFJVTkNBVEVfTl9PTERFU1QKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBhZGRTZWFyY2hVcmwoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gY2FuQ2xlYXJIaXN0b3J5KAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcikKLQotcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIGNsZWFySGlzdG9yeSgKLWFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBjbGVhclNlYXJjaGVzKAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcikKLQotcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIGRlbGV0ZUZyb21IaXN0b3J5KAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcgotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIGRlbGV0ZUhpc3RvcnlUaW1lRnJhbWUoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1sb25nCi1sb25nKQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCB2b2lkIGRlbGV0ZUhpc3RvcnlXaGVyZSgKLWFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IgZ2V0QWxsQm9va21hcmtzKAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciBnZXRBbGxWaXNpdGVkVXJscygKLWFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCByZXF1ZXN0QWxsSWNvbnMoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLndlYmtpdC5XZWJJY29uRGF0YWJhc2UkSWNvbkxpc3RlbmVyKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgc2F2ZUJvb2ttYXJrKAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBzZW5kU3RyaW5nKAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCB0cnVuY2F0ZUhpc3RvcnkoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgdXBkYXRlVmlzaXRlZEhpc3RvcnkoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1BdHRlbmRlZXNDb2x1bW5zICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL0NhbGVuZGFyOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuQ2FsZW5kYXIkQXR0ZW5kZWVzQ29sdW1ucyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFUVEVOREVFX0VNQUlMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBVFRFTkRFRV9OQU1FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBVFRFTkRFRV9SRUxBVElPTlNISVAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFUVEVOREVFX1NUQVRVUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRFTkRFRV9TVEFUVVNfQUNDRVBURUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRURU5ERUVfU1RBVFVTX0RFQ0xJTkVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVEVOREVFX1NUQVRVU19JTlZJVEVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVEVOREVFX1NUQVRVU19OT05FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVEVOREVFX1NUQVRVU19URU5UQVRJVkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFUVEVOREVFX1RZUEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEVWRU5UX0lECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTEFUSU9OU0hJUF9BVFRFTkRFRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUxBVElPTlNISVBfTk9ORQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUxBVElPTlNISVBfT1JHQU5JWkVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTEFUSU9OU0hJUF9QRVJGT1JNRVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVMQVRJT05TSElQX1NQRUFLRVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9OT05FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfT1BUSU9OQUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9SRVFVSVJFRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPUV2ZW50c0NvbHVtbnMgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvQ2FsZW5kYXI7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5DYWxlbmRhciRFdmVudHNDb2x1bW5zIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUxMX0RBWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ0FMRU5EQVJfSUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENPTU1FTlRTX1VSSQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVTQ1JJUFRJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERURU5ECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBEVFNUQVJUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBEVVJBVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRVZFTlRfTE9DQVRJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEVWRU5UX1RJTUVaT05FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBFWERBVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEVYUlVMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSEFTX0FMQVJNCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBIQVNfRVhURU5ERURfUFJPUEVSVElFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSFRNTF9VUkkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIExBU1RfREFURQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgT1JJR0lOQUxfRVZFTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE9SSUdJTkFMX0lOU1RBTkNFX1RJTUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFJEQVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSUlVMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0VMRl9BVFRFTkRFRV9TVEFUVVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNUQVRVUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfQ0FOQ0VMRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0NPTkZJUk1FRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfVEVOVEFUSVZFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUSVRMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVFJBTlNQQVJFTkNZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSQU5TUEFSRU5DWV9PUEFRVUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNQQVJFTkNZX1RSQU5TUEFSRU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBWSVNJQklMSVRZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU0lCSUxJVFlfQ09ORklERU5USUFMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU0lCSUxJVFlfREVGQVVMVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNJQklMSVRZX1BSSVZBVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTSUJJTElUWV9QVUJMSUMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjUgbmFtZSA9QXR0ZW5kZWVzICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL0NhbGVuZGFyOyApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5DYWxlbmRhciRBdHRlbmRlZXMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5wcm92aWRlci5CYXNlQ29sdW1ucywgYW5kcm9pZC5wcm92aWRlci5DYWxlbmRhciRBdHRlbmRlZXNDb2x1bW5zLCBhbmRyb2lkLnByb3ZpZGVyLkNhbGVuZGFyJEV2ZW50c0NvbHVtbnMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmkgQ09OVEVOVF9VUkkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvQ2FsZW5kYXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1CdXN5Qml0c0NvbHVtbnMgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLkNhbGVuZGFyJEJ1c3lCaXRzQ29sdW1ucyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFMTF9EQVlfQ09VTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEJVU1lCSVRTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBEQVkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL0NhbGVuZGFyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI1IG5hbWUgPUJ1c3lCaXRzICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLkNhbGVuZGFyJEJ1c3lCaXRzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQucHJvdmlkZXIuQ2FsZW5kYXIkQnVzeUJpdHNDb2x1bW5zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIENPTlRFTlRfVVJJCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSVkFMU19QRVJfREFZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JTlVURVNfUEVSX0JVU1lfSU5URVJWQUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gUFJPSkVDVElPTgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciBxdWVyeSgKLWFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIKLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL0NhbGVuZGFyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9Q2FsZW5kYXJBbGVydHNDb2x1bW5zICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5DYWxlbmRhciRDYWxlbmRhckFsZXJ0c0NvbHVtbnMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBTEFSTV9USU1FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBCRUdJTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVGQVVMVF9TT1JUX09SREVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU01JU1NFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRU5ECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBFVkVOVF9JRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSVJFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTUlOVVRFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ0hFRFVMRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNUQVRFCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9DYWxlbmRhcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPUNhbGVuZGFyc0NvbHVtbnMgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLkNhbGVuZGFyJENhbGVuZGFyc0NvbHVtbnMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBQ0NFU1NfTEVWRUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENPTE9SCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRSSUJVVE9SX0FDQ0VTUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFRElUT1JfQUNDRVNTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZSRUVCVVNZX0FDQ0VTUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT19BQ0NFU1MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1ZFUlJJREVfQUNDRVNTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9XTkVSX0FDQ0VTUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUFEX0FDQ0VTUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05EX0FDQ0VTUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBST09UX0FDQ0VTUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0VMRUNURUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNZTkNfRVZFTlRTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUSU1FWk9ORQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvQ2FsZW5kYXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjUgbmFtZSA9Q2FsZW5kYXJBbGVydHMgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuQ2FsZW5kYXIkQ2FsZW5kYXJBbGVydHMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5wcm92aWRlci5CYXNlQ29sdW1ucywgYW5kcm9pZC5wcm92aWRlci5DYWxlbmRhciRDYWxlbmRhckFsZXJ0c0NvbHVtbnMsIGFuZHJvaWQucHJvdmlkZXIuQ2FsZW5kYXIkRXZlbnRzQ29sdW1ucywgYW5kcm9pZC5wcm92aWRlci5DYWxlbmRhciRDYWxlbmRhcnNDb2x1bW5zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIENPTlRFTlRfVVJJCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIENPTlRFTlRfVVJJX0JZX0lOU1RBTkNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUJMRV9OQU1FCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gYWxhcm1FeGlzdHMoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1sb25nCi1sb25nCi1sb25nKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgZmluZE5leHRBbGFybVRpbWUoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1sb25nKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBpbnNlcnQoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1sb25nCi1sb25nCi1sb25nCi1sb25nCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IgcXVlcnkoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1qYXZhLmxhbmcuU3RyaW5nW10KLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHJlc2NoZWR1bGVNaXNzZWRBbGFybXMoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC5hcHAuQWxhcm1NYW5hZ2VyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL0NhbGVuZGFyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9Q2FsZW5kYXJNZXRhRGF0YUNvbHVtbnMgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLkNhbGVuZGFyJENhbGVuZGFyTWV0YURhdGFDb2x1bW5zIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTE9DQUxfVElNRVpPTkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1BWF9CVVNZQklUUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTUFYX0lOU1RBTkNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBNSU5fQlVTWUJJVFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1JTl9JTlNUQU5DRQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvQ2FsZW5kYXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjUgbmFtZSA9Q2FsZW5kYXJNZXRhRGF0YSApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5DYWxlbmRhciRDYWxlbmRhck1ldGFEYXRhIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQucHJvdmlkZXIuQ2FsZW5kYXIkQ2FsZW5kYXJNZXRhRGF0YUNvbHVtbnMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLlN5bmNDb25zdFZhbHVlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTk9OX1NZTkNBQkxFX0FDQ09VTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIF9TWU5DX0FDQ09VTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIF9TWU5DX0RJUlRZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBfU1lOQ19JRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgX1NZTkNfTE9DQUxfSUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIF9TWU5DX01BUksKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIF9TWU5DX1RJTUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIF9TWU5DX1ZFUlNJT04KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1DYWxlbmRhcnMgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvQ2FsZW5kYXI7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLkNhbGVuZGFyJENhbGVuZGFycyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zLCBhbmRyb2lkLnByb3ZpZGVyLlN5bmNDb25zdFZhbHVlLCBhbmRyb2lkLnByb3ZpZGVyLkNhbGVuZGFyJENhbGVuZGFyc0NvbHVtbnMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmkgQ09OVEVOVF9VUkkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFRkFVTFRfU09SVF9PUkRFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRElTUExBWV9OQU1FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBISURERU4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmkgTElWRV9DT05URU5UX1VSSQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTE9DQVRJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE5BTUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFVSTAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBpbnQgZGVsZXRlKAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcgotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZ1tdKQotCi1wdWJsaWMgc3RhdGljIGludCBkZWxldGVDYWxlbmRhcnNGb3JBY2NvdW50KAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcgotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciBxdWVyeSgKLWFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIKLWphdmEubGFuZy5TdHJpbmdbXQotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI1IG5hbWUgPUV2ZW50cyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9DYWxlbmRhcjsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuQ2FsZW5kYXIkRXZlbnRzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQucHJvdmlkZXIuQmFzZUNvbHVtbnMsIGFuZHJvaWQucHJvdmlkZXIuU3luY0NvbnN0VmFsdWUsIGFuZHJvaWQucHJvdmlkZXIuQ2FsZW5kYXIkRXZlbnRzQ29sdW1ucywgYW5kcm9pZC5wcm92aWRlci5DYWxlbmRhciRDYWxlbmRhcnNDb2x1bW5zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmdbXSBBVFRFTkRFRVNfQ09MVU1OUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBDT05URU5UX1VSSQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVGQVVMVF9TT1JUX09SREVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIERFTEVURURfQ09OVEVOVF9VUkkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZ1tdIEZFVENIX0VOVFJZX0NPTFVNTlMKLQotcHJpdmF0ZSBzdGF0aWMgY29tLmdvb2dsZS53aXJlbGVzcy5nZGF0YS5jYWxlbmRhci5jbGllbnQuQ2FsZW5kYXJDbGllbnQgc0NhbGVuZGFyQ2xpZW50Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMY29tL2dvb2dsZS93aXJlbGVzcy9nZGF0YS9jYWxlbmRhci9kYXRhL0V2ZW50RW50cnk7TGphdmEvdXRpbC9BcnJheUxpc3Q8TGphdmEvdXRpbC9BcnJheUxpc3Q7PjspViApCi1wcml2YXRlIHN0YXRpYyBmaW5hbCB2b2lkIGV4dHJhY3RBdHRlbmRlZXNJbnRvQXJyYXlMaXN0KAotY29tLmdvb2dsZS53aXJlbGVzcy5nZGF0YS5jYWxlbmRhci5kYXRhLkV2ZW50RW50cnkKLWphdmEudXRpbC5BcnJheUxpc3QpCi0KLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZXh0cmFjdFZhbHVlKAotYW5kcm9pZC5waW0uSUNhbGVuZGFyJENvbXBvbmVudAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMY29tL2dvb2dsZS93aXJlbGVzcy9nZGF0YS9wYXJzZXIvUGFyc2VFeGNlcHRpb247ICkKLXByaXZhdGUgc3RhdGljIGZpbmFsIGNvbS5nb29nbGUud2lyZWxlc3MuZ2RhdGEuY2FsZW5kYXIuZGF0YS5FdmVudEVudHJ5IGZldGNoRW50cnkoCi1jb20uZ29vZ2xlLmFuZHJvaWQuZ29vZ2xlYXBwcy5Hb29nbGVMb2dpblNlcnZpY2VCbG9ja2luZ0hlbHBlcgotY29tLmdvb2dsZS53aXJlbGVzcy5nZGF0YS5jYWxlbmRhci5jbGllbnQuQ2FsZW5kYXJDbGllbnQKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgc3RhdGljIGNvbS5nb29nbGUud2lyZWxlc3MuZ2RhdGEuY2FsZW5kYXIuY2xpZW50LkNhbGVuZGFyQ2xpZW50IGdldENhbGVuZGFyQ2xpZW50KAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcikKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmkgaW5zZXJ0VkV2ZW50KAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcgotYW5kcm9pZC5waW0uSUNhbGVuZGFyJENvbXBvbmVudAotbG9uZwotaW50Ci1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlcykKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciBxdWVyeSgKLWFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciBxdWVyeSgKLWFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIKLWphdmEubGFuZy5TdHJpbmdbXQotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciBxdWVyeUF0dGVuZGVlcygKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1sb25nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1FeHRlbmRlZFByb3BlcnRpZXNDb2x1bW5zICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL0NhbGVuZGFyOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuQ2FsZW5kYXIkRXh0ZW5kZWRQcm9wZXJ0aWVzQ29sdW1ucyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEVWRU5UX0lECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBOQU1FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBWQUxVRQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvQ2FsZW5kYXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjUgbmFtZSA9RXh0ZW5kZWRQcm9wZXJ0aWVzICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLkNhbGVuZGFyJEV4dGVuZGVkUHJvcGVydGllcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zLCBhbmRyb2lkLnByb3ZpZGVyLkNhbGVuZGFyJEV4dGVuZGVkUHJvcGVydGllc0NvbHVtbnMsIGFuZHJvaWQucHJvdmlkZXIuQ2FsZW5kYXIkRXZlbnRzQ29sdW1ucwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBDT05URU5UX1VSSQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI1IG5hbWUgPUluc3RhbmNlcyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9DYWxlbmRhcjsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuQ2FsZW5kYXIkSW5zdGFuY2VzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQucHJvdmlkZXIuQmFzZUNvbHVtbnMsIGFuZHJvaWQucHJvdmlkZXIuQ2FsZW5kYXIkRXZlbnRzQ29sdW1ucywgYW5kcm9pZC5wcm92aWRlci5DYWxlbmRhciRDYWxlbmRhcnNDb2x1bW5zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBCRUdJTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBDT05URU5UX1VSSQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVGQVVMVF9TT1JUX09SREVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBFTkQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEVORF9EQVkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEVORF9NSU5VVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEVWRU5UX0lECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTT1JUX0NBTEVOREFSX1ZJRVcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNUQVJUX0RBWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU1RBUlRfTUlOVVRFCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIHF1ZXJ5KAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcgotamF2YS5sYW5nLlN0cmluZ1tdCi1sb25nCi1sb25nKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIHF1ZXJ5KAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcgotamF2YS5sYW5nLlN0cmluZ1tdCi1sb25nCi1sb25nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL0NhbGVuZGFyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9UmVtaW5kZXJzQ29sdW1ucyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuQ2FsZW5kYXIkUmVtaW5kZXJzQ29sdW1ucyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEVWRU5UX0lECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBNRVRIT0QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVUSE9EX0FMRVJUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FVEhPRF9ERUZBVUxUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FVEhPRF9FTUFJTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVRIT0RfU01TCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBNSU5VVEVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JTlVURVNfREVGQVVMVAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNSBuYW1lID1SZW1pbmRlcnMgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvQ2FsZW5kYXI7ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLkNhbGVuZGFyJFJlbWluZGVycyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zLCBhbmRyb2lkLnByb3ZpZGVyLkNhbGVuZGFyJFJlbWluZGVyc0NvbHVtbnMsIGFuZHJvaWQucHJvdmlkZXIuQ2FsZW5kYXIkRXZlbnRzQ29sdW1ucwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBDT05URU5UX1VSSQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEFCTEVfTkFNRQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL0NhbGVuZGFyJEV4dGVuZGVkUHJvcGVydGllcztMYW5kcm9pZC9wcm92aWRlci9DYWxlbmRhciRFeHRlbmRlZFByb3BlcnRpZXNDb2x1bW5zO0xhbmRyb2lkL3Byb3ZpZGVyL0NhbGVuZGFyJENhbGVuZGFyQWxlcnRzO0xhbmRyb2lkL3Byb3ZpZGVyL0NhbGVuZGFyJENhbGVuZGFyQWxlcnRzQ29sdW1ucztMYW5kcm9pZC9wcm92aWRlci9DYWxlbmRhciRSZW1pbmRlcnM7TGFuZHJvaWQvcHJvdmlkZXIvQ2FsZW5kYXIkUmVtaW5kZXJzQ29sdW1ucztMYW5kcm9pZC9wcm92aWRlci9DYWxlbmRhciRCdXN5Qml0cztMYW5kcm9pZC9wcm92aWRlci9DYWxlbmRhciRCdXN5Qml0c0NvbHVtbnM7TGFuZHJvaWQvcHJvdmlkZXIvQ2FsZW5kYXIkQ2FsZW5kYXJNZXRhRGF0YTtMYW5kcm9pZC9wcm92aWRlci9DYWxlbmRhciRDYWxlbmRhck1ldGFEYXRhQ29sdW1ucztMYW5kcm9pZC9wcm92aWRlci9DYWxlbmRhciRJbnN0YW5jZXM7TGFuZHJvaWQvcHJvdmlkZXIvQ2FsZW5kYXIkRXZlbnRzO0xhbmRyb2lkL3Byb3ZpZGVyL0NhbGVuZGFyJEV2ZW50c0NvbHVtbnM7TGFuZHJvaWQvcHJvdmlkZXIvQ2FsZW5kYXIkQXR0ZW5kZWVzO0xhbmRyb2lkL3Byb3ZpZGVyL0NhbGVuZGFyJEF0dGVuZGVlc0NvbHVtbnM7TGFuZHJvaWQvcHJvdmlkZXIvQ2FsZW5kYXIkQ2FsZW5kYXJzO0xhbmRyb2lkL3Byb3ZpZGVyL0NhbGVuZGFyJENhbGVuZGFyc0NvbHVtbnM7ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLkNhbGVuZGFyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQVVUSE9SSVRZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIENPTlRFTlRfVVJJCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBFVkVOVF9CRUdJTl9USU1FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBFVkVOVF9FTkRfVElNRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRVZFTlRfUkVNSU5ERVJfQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvQ2FsbExvZzsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPUNhbGxzICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLkNhbGxMb2ckQ2FsbHMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5wcm92aWRlci5CYXNlQ29sdW1ucwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ0FDSEVEX05BTUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENBQ0hFRF9OVU1CRVJfTEFCRUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENBQ0hFRF9OVU1CRVJfVFlQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBDT05URU5UX0ZJTFRFUl9VUkkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENPTlRFTlRfSVRFTV9UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDT05URU5UX1RZUEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmkgQ09OVEVOVF9VUkkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERBVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFRkFVTFRfU09SVF9PUkRFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRFVSQVRJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5DT01JTkdfVFlQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSVNTRURfVFlQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTkVXCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBOVU1CRVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1VUR09JTkdfVFlQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVFlQRQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLm5ldC5VcmkgYWRkQ2FsbCgKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5DYWxsZXJJbmZvCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbgotaW50Ci1sb25nCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgcmVtb3ZlRXhwaXJlZEVudHJpZXMoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL0NhbGxMb2ckQ2FsbHM7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLkNhbGxMb2cgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBVVRIT1JJVFkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmkgQ09OVEVOVF9VUkkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPUNyYXNoZXMgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvQ2hlY2tpbjsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLkNoZWNraW4kQ3Jhc2hlcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIENPTlRFTlRfVVJJCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBEQVRBCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMT0dTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUJMRV9OQU1FCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL0NoZWNraW4kRXZlbnRzOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE2NDA5IG5hbWUgPVRhZyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9FbnVtPExhbmRyb2lkL3Byb3ZpZGVyL0NoZWNraW4kRXZlbnRzJFRhZzs+OyApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5DaGVja2luJEV2ZW50cyRUYWcgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnByb3ZpZGVyLkNoZWNraW4kRXZlbnRzJFRhZ1tdICRWQUxVRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnByb3ZpZGVyLkNoZWNraW4kRXZlbnRzJFRhZyBCUk9XU0VSX0JVR19SRVBPUlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnByb3ZpZGVyLkNoZWNraW4kRXZlbnRzJFRhZyBDQVJSSUVSX0JVR19SRVBPUlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnByb3ZpZGVyLkNoZWNraW4kRXZlbnRzJFRhZyBDSEVDS0lOX0ZBSUxVUkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnByb3ZpZGVyLkNoZWNraW4kRXZlbnRzJFRhZyBDSEVDS0lOX1NVQ0NFU1MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnByb3ZpZGVyLkNoZWNraW4kRXZlbnRzJFRhZyBGT1RBX0JFR0lOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5wcm92aWRlci5DaGVja2luJEV2ZW50cyRUYWcgRk9UQV9GQUlMVVJFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5wcm92aWRlci5DaGVja2luJEV2ZW50cyRUYWcgRk9UQV9JTlNUQUxMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5wcm92aWRlci5DaGVja2luJEV2ZW50cyRUYWcgRk9UQV9QUk9NUFQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnByb3ZpZGVyLkNoZWNraW4kRXZlbnRzJFRhZyBGT1RBX1BST01QVF9BQ0NFUFQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnByb3ZpZGVyLkNoZWNraW4kRXZlbnRzJFRhZyBGT1RBX1BST01QVF9SRUpFQ1QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnByb3ZpZGVyLkNoZWNraW4kRXZlbnRzJFRhZyBGT1RBX1BST01QVF9TS0lQUEVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5wcm92aWRlci5DaGVja2luJEV2ZW50cyRUYWcgR1NFUlZJQ0VTX0VSUk9SCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5wcm92aWRlci5DaGVja2luJEV2ZW50cyRUYWcgR1NFUlZJQ0VTX1VQREFURQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucHJvdmlkZXIuQ2hlY2tpbiRFdmVudHMkVGFnIExPR0lOX1NFUlZJQ0VfQUNDT1VOVF9TQVZFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucHJvdmlkZXIuQ2hlY2tpbiRFdmVudHMkVGFnIExPR0lOX1NFUlZJQ0VfQUNDT1VOVF9UUklFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucHJvdmlkZXIuQ2hlY2tpbiRFdmVudHMkVGFnIExPR0lOX1NFUlZJQ0VfQVVUSEVOVElDQVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5wcm92aWRlci5DaGVja2luJEV2ZW50cyRUYWcgTE9HSU5fU0VSVklDRV9DQVBUQ0hBX0FOU1dFUkVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5wcm92aWRlci5DaGVja2luJEV2ZW50cyRUYWcgTE9HSU5fU0VSVklDRV9DQVBUQ0hBX1NIT1dOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5wcm92aWRlci5DaGVja2luJEV2ZW50cyRUYWcgTE9HSU5fU0VSVklDRV9QQVNTV09SRF9FTlRFUkVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5wcm92aWRlci5DaGVja2luJEV2ZW50cyRUYWcgTE9HSU5fU0VSVklDRV9TV0lUQ0hfR09PR0xFX01BSUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnByb3ZpZGVyLkNoZWNraW4kRXZlbnRzJFRhZyBORVRXT1JLX0RPV04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnByb3ZpZGVyLkNoZWNraW4kRXZlbnRzJFRhZyBORVRXT1JLX1VQCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5wcm92aWRlci5DaGVja2luJEV2ZW50cyRUYWcgUEhPTkVfVUkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnByb3ZpZGVyLkNoZWNraW4kRXZlbnRzJFRhZyBSQURJT19CVUdfUkVQT1JUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5wcm92aWRlci5DaGVja2luJEV2ZW50cyRUYWcgU0VUVVBfQ09NUExFVEVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5wcm92aWRlci5DaGVja2luJEV2ZW50cyRUYWcgU0VUVVBfSU5JVElBVEVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5wcm92aWRlci5DaGVja2luJEV2ZW50cyRUYWcgU0VUVVBfSU9fRVJST1IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnByb3ZpZGVyLkNoZWNraW4kRXZlbnRzJFRhZyBTRVRVUF9ORVRXT1JLX0VSUk9SCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5wcm92aWRlci5DaGVja2luJEV2ZW50cyRUYWcgU0VUVVBfUkVRVUlSRURfQ0FQVENIQQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucHJvdmlkZXIuQ2hlY2tpbiRFdmVudHMkVGFnIFNFVFVQX1JFVFJJRVNfRVhIQVVTVEVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5wcm92aWRlci5DaGVja2luJEV2ZW50cyRUYWcgU0VUVVBfU0VSVkVSX0VSUk9SCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5wcm92aWRlci5DaGVja2luJEV2ZW50cyRUYWcgU0VUVVBfU0VSVkVSX1RJTUVPVVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnByb3ZpZGVyLkNoZWNraW4kRXZlbnRzJFRhZyBTWVNURU1fQVBQX05PVF9SRVNQT05ESU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5wcm92aWRlci5DaGVja2luJEV2ZW50cyRUYWcgU1lTVEVNX0JPT1QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnByb3ZpZGVyLkNoZWNraW4kRXZlbnRzJFRhZyBTWVNURU1fTEFTVF9LTVNHCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5wcm92aWRlci5DaGVja2luJEV2ZW50cyRUYWcgU1lTVEVNX1JFQ09WRVJZX0xPRwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucHJvdmlkZXIuQ2hlY2tpbiRFdmVudHMkVGFnIFNZU1RFTV9SRVNUQVJUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5wcm92aWRlci5DaGVja2luJEV2ZW50cyRUYWcgU1lTVEVNX1NFUlZJQ0VfTE9PUElORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucHJvdmlkZXIuQ2hlY2tpbiRFdmVudHMkVGFnIFNZU1RFTV9UT01CU1RPTkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnByb3ZpZGVyLkNoZWNraW4kRXZlbnRzJFRhZyBURVNUCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpViApCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQucHJvdmlkZXIuQ2hlY2tpbiRFdmVudHMkVGFnIHZhbHVlT2YoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQucHJvdmlkZXIuQ2hlY2tpbiRFdmVudHMkVGFnW10gdmFsdWVzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9RXZlbnRzICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL0NoZWNraW47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvQ2hlY2tpbiRFdmVudHMkVGFnOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuQ2hlY2tpbiRFdmVudHMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5wcm92aWRlci5CYXNlQ29sdW1ucwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBDT05URU5UX1VSSQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREFURQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEFCTEVfTkFNRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEFHCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBWQUxVRQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9FbnVtPExhbmRyb2lkL3Byb3ZpZGVyL0NoZWNraW4kUHJvcGVydGllcyRUYWc7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNjQwOSBuYW1lID1UYWcgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvQ2hlY2tpbiRQcm9wZXJ0aWVzOyApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5DaGVja2luJFByb3BlcnRpZXMkVGFnIGV4dGVuZHMgamF2YS5sYW5nLkVudW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYW5kcm9pZC5wcm92aWRlci5DaGVja2luJFByb3BlcnRpZXMkVGFnW10gJFZBTFVFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucHJvdmlkZXIuQ2hlY2tpbiRQcm9wZXJ0aWVzJFRhZyBERVNJUkVEX0JVSUxECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5wcm92aWRlci5DaGVja2luJFByb3BlcnRpZXMkVGFnIE1BUktFVF9DSEVDS0lOCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpViApCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQucHJvdmlkZXIuQ2hlY2tpbiRQcm9wZXJ0aWVzJFRhZyB2YWx1ZU9mKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLnByb3ZpZGVyLkNoZWNraW4kUHJvcGVydGllcyRUYWdbXSB2YWx1ZXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvQ2hlY2tpbiRQcm9wZXJ0aWVzJFRhZzsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPVByb3BlcnRpZXMgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvQ2hlY2tpbjsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLkNoZWNraW4kUHJvcGVydGllcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIENPTlRFTlRfVVJJCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUJMRV9OQU1FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFZBTFVFCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTY0MDkgbmFtZSA9VGFnICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL0VudW08TGFuZHJvaWQvcHJvdmlkZXIvQ2hlY2tpbiRTdGF0cyRUYWc7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvQ2hlY2tpbiRTdGF0czsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuQ2hlY2tpbiRTdGF0cyRUYWcgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnByb3ZpZGVyLkNoZWNraW4kU3RhdHMkVGFnW10gJFZBTFVFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucHJvdmlkZXIuQ2hlY2tpbiRTdGF0cyRUYWcgQ1JBU0hFU19SRVBPUlRFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucHJvdmlkZXIuQ2hlY2tpbiRTdGF0cyRUYWcgQ1JBU0hFU19UUlVOQ0FURUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnByb3ZpZGVyLkNoZWNraW4kU3RhdHMkVGFnIEVMQVBTRURfUkVBTFRJTUVfU0VDCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5wcm92aWRlci5DaGVja2luJFN0YXRzJFRhZyBFTEFQU0VEX1VQVElNRV9TRUMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnByb3ZpZGVyLkNoZWNraW4kU3RhdHMkVGFnIEhUVFBfU1RBVFVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5wcm92aWRlci5DaGVja2luJFN0YXRzJFRhZyBQSE9ORV9HUFJTX0FUVEVNUFRFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucHJvdmlkZXIuQ2hlY2tpbiRTdGF0cyRUYWcgUEhPTkVfR1BSU19DT05ORUNURUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnByb3ZpZGVyLkNoZWNraW4kU3RhdHMkVGFnIFBIT05FX0dTTV9SRUdJU1RFUkVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5wcm92aWRlci5DaGVja2luJFN0YXRzJFRhZyBQSE9ORV9SQURJT19SRVNFVFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnByb3ZpZGVyLkNoZWNraW4kU3RhdHMkVGFnIFRFU1QKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClWICkKLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5wcm92aWRlci5DaGVja2luJFN0YXRzJFRhZyB2YWx1ZU9mKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLnByb3ZpZGVyLkNoZWNraW4kU3RhdHMkVGFnW10gdmFsdWVzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9DaGVja2luOyApCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL0NoZWNraW4kU3RhdHMkVGFnOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9U3RhdHMgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLkNoZWNraW4kU3RhdHMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5wcm92aWRlci5CYXNlQ29sdW1ucwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBDT05URU5UX1VSSQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ09VTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNVTQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEFCTEVfTkFNRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEFHCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL0NoZWNraW47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1UcmlnZ2VySW50ZW50ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5DaGVja2luJFRyaWdnZXJJbnRlbnQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENBVEVHT1JZCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL0NoZWNraW4kVHJpZ2dlckludGVudDtMYW5kcm9pZC9wcm92aWRlci9DaGVja2luJENyYXNoZXM7TGFuZHJvaWQvcHJvdmlkZXIvQ2hlY2tpbiRQcm9wZXJ0aWVzO0xhbmRyb2lkL3Byb3ZpZGVyL0NoZWNraW4kU3RhdHM7TGFuZHJvaWQvcHJvdmlkZXIvQ2hlY2tpbiRFdmVudHM7ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLkNoZWNraW4gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBVVRIT1JJVFkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBNSU5fQ1JBU0hfRkFJTFVSRV9SRVRSWQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRBRwotCi1wcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBsb25nIHNMYXN0Q3Jhc2hGYWlsdXJlUmVhbHRpbWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5uZXQuVXJpIGxvZ0V2ZW50KAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcgotYW5kcm9pZC5wcm92aWRlci5DaGVja2luJEV2ZW50cyRUYWcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5uZXQuVXJpIHJlcG9ydENyYXNoKAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcgotYW5kcm9pZC5zZXJ2ZXIuZGF0YS5DcmFzaERhdGEpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5uZXQuVXJpIHJlcG9ydENyYXNoKAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcgotYnl0ZVtdKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQubmV0LlVyaSB1cGRhdGVTdGF0cygKLWFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIKLWFuZHJvaWQucHJvdmlkZXIuQ2hlY2tpbiRTdGF0cyRUYWcKLWludAotZG91YmxlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL0NvbnRhY3RzOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9Q29udGFjdE1ldGhvZHNDb2x1bW5zICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5Db250YWN0cyRDb250YWN0TWV0aG9kc0NvbHVtbnMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBVVhfREFUQQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREFUQQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSVNQUklNQVJZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBLSU5ECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMQUJFTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVFlQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0NVU1RPTQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0hPTUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9PVEhFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1dPUksKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL0NvbnRhY3RzOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9UGVvcGxlQ29sdW1ucyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHMkUGVvcGxlQ29sdW1ucyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENVU1RPTV9SSU5HVE9ORQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRElTUExBWV9OQU1FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMQVNUX1RJTUVfQ09OVEFDVEVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBOQU1FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBOT1RFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUEhPVE9fVkVSU0lPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0VORF9UT19WT0lDRU1BSUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNUQVJSRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRJTUVTX0NPTlRBQ1RFRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvQ29udGFjdHM7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjUgbmFtZSA9Q29udGFjdE1ldGhvZHMgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHMkQ29udGFjdE1ldGhvZHMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5wcm92aWRlci5CYXNlQ29sdW1ucywgYW5kcm9pZC5wcm92aWRlci5Db250YWN0cyRDb250YWN0TWV0aG9kc0NvbHVtbnMsIGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHMkUGVvcGxlQ29sdW1ucwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ09OVEVOVF9FTUFJTF9JVEVNX1RZUEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENPTlRFTlRfRU1BSUxfVFlQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBDT05URU5UX0VNQUlMX1VSSQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ09OVEVOVF9JTV9JVEVNX1RZUEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENPTlRFTlRfUE9TVEFMX0lURU1fVFlQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ09OVEVOVF9QT1NUQUxfVFlQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ09OVEVOVF9UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIENPTlRFTlRfVVJJCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERUZBVUxUX1NPUlRfT1JERVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBFUlNPTl9JRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUE9TVEFMX0xPQ0FUSU9OX0xBVElUVURFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQT1NUQUxfTE9DQVRJT05fTE9OR0lUVURFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1RPQ09MX0FJTQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9UT0NPTF9HT09HTEVfVEFMSwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9UT0NPTF9JQ1EKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPVE9DT0xfSkFCQkVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1RPQ09MX01TTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9UT0NPTF9RUQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9UT0NPTF9TS1lQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9UT0NPTF9ZQUhPTwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLk9iamVjdCBkZWNvZGVJbVByb3RvY29sKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGVuY29kZUN1c3RvbUltUHJvdG9jb2woCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZW5jb2RlUHJlZGVmaW5lZEltUHJvdG9jb2woCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBnZXREaXNwbGF5TGFiZWwoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotaW50Ci1pbnQKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBsb29rdXBQcm92aWRlckNhdGVnb3J5RnJvbUlkKAotaW50KQotCi1wdWJsaWMgdm9pZCBhZGRQb3N0YWxMb2NhdGlvbigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1sb25nCi1kb3VibGUKLWRvdWJsZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9Db250YWN0czsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPUV4dGVuc2lvbnNDb2x1bW5zICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5Db250YWN0cyRFeHRlbnNpb25zQ29sdW1ucyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE5BTUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFZBTFVFCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9Db250YWN0czsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNSBuYW1lID1FeHRlbnNpb25zICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzJEV4dGVuc2lvbnMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5wcm92aWRlci5CYXNlQ29sdW1ucywgYW5kcm9pZC5wcm92aWRlci5Db250YWN0cyRFeHRlbnNpb25zQ29sdW1ucwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ09OVEVOVF9JVEVNX1RZUEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENPTlRFTlRfVFlQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBDT05URU5UX1VSSQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVGQVVMVF9TT1JUX09SREVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQRVJTT05fSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1Hcm91cHNDb2x1bW5zICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL0NvbnRhY3RzOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHMkR3JvdXBzQ29sdW1ucyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE5BTUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE5PVEVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTSE9VTERfU1lOQwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU1lTVEVNX0lECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9Db250YWN0czsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNSBuYW1lID1Hcm91cE1lbWJlcnNoaXAgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHMkR3JvdXBNZW1iZXJzaGlwIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQucHJvdmlkZXIuQmFzZUNvbHVtbnMsIGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHMkR3JvdXBzQ29sdW1ucwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ09OVEVOVF9ESVJFQ1RPUlkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENPTlRFTlRfSVRFTV9UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDT05URU5UX1RZUEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmkgQ09OVEVOVF9VUkkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFRkFVTFRfU09SVF9PUkRFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgR1JPVVBfSUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEdST1VQX1NZTkNfQUNDT1VOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgR1JPVVBfU1lOQ19JRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUEVSU09OX0lECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIFJBV19DT05URU5UX1VSSQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNSBuYW1lID1Hcm91cHMgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvQ29udGFjdHM7ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzJEdyb3VwcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zLCBhbmRyb2lkLnByb3ZpZGVyLlN5bmNDb25zdFZhbHVlLCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzJEdyb3Vwc0NvbHVtbnMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENPTlRFTlRfSVRFTV9UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDT05URU5UX1RZUEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmkgQ09OVEVOVF9VUkkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFRkFVTFRfU09SVF9PUkRFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBERUxFVEVEX0NPTlRFTlRfVVJJCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBHUk9VUF9BTkRST0lEX1NUQVJSRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEdST1VQX01ZX0NPTlRBQ1RTCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI1IG5hbWUgPUluc2VydCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9Db250YWN0cyRJbnRlbnRzOyApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5Db250YWN0cyRJbnRlbnRzJEluc2VydCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ09NUEFOWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRU1BSUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEVNQUlMX0lTUFJJTUFSWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRU1BSUxfVFlQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRlVMTF9NT0RFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBJTV9IQU5ETEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIElNX0lTUFJJTUFSWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSU1fUFJPVE9DT0wKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEpPQl9USVRMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTkFNRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTk9URVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBIT05FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQSE9ORV9JU1BSSU1BUlkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBIT05FX1RZUEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBPU1RBTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUE9TVEFMX0lTUFJJTUFSWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUE9TVEFMX1RZUEUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjUgbmFtZSA9VUkgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvQ29udGFjdHMkSW50ZW50czsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHMkSW50ZW50cyRVSSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEZJTFRFUl9DT05UQUNUU19BQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEZJTFRFUl9URVhUX0VYVFJBX0tFWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgR1JPVVBfTkFNRV9FWFRSQV9LRVkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIExJU1RfQUxMX0NPTlRBQ1RTX0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTElTVF9DT05UQUNUU19XSVRIX1BIT05FU19BQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIExJU1RfREVGQVVMVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTElTVF9GUkVRVUVOVF9BQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIExJU1RfR1JPVVBfQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMSVNUX1NUQVJSRURfQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMSVNUX1NUUkVRVUVOVF9BQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRJVExFX0VYVFJBX0tFWQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9Db250YWN0cyRJbnRlbnRzJEluc2VydDtMYW5kcm9pZC9wcm92aWRlci9Db250YWN0cyRJbnRlbnRzJFVJOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI1IG5hbWUgPUludGVudHMgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvQ29udGFjdHM7ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzJEludGVudHMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBVFRBQ0hfSU1BR0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNFQVJDSF9TVUdHRVNUSU9OX0NMSUNLRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNFQVJDSF9TVUdHRVNUSU9OX0NSRUFURV9DT05UQUNUX0NMSUNLRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNFQVJDSF9TVUdHRVNUSU9OX0RJQUxfTlVNQkVSX0NMSUNLRUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL0NvbnRhY3RzOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9T3JnYW5pemF0aW9uQ29sdW1ucyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHMkT3JnYW5pemF0aW9uQ29sdW1ucyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENPTVBBTlkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIElTUFJJTUFSWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTEFCRUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBFUlNPTl9JRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVElUTEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRZUEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9DVVNUT00KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9PVEhFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1dPUksKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL0NvbnRhY3RzOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI1IG5hbWUgPU9yZ2FuaXphdGlvbnMgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHMkT3JnYW5pemF0aW9ucyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zLCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzJE9yZ2FuaXphdGlvbkNvbHVtbnMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENPTlRFTlRfRElSRUNUT1JZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIENPTlRFTlRfVVJJCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERUZBVUxUX1NPUlRfT1JERVIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgZ2V0RGlzcGxheUxhYmVsKAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWludAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9Db250YWN0cyRQZW9wbGU7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjUgbmFtZSA9Q29udGFjdE1ldGhvZHMgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHMkUGVvcGxlJENvbnRhY3RNZXRob2RzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQucHJvdmlkZXIuQmFzZUNvbHVtbnMsIGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHMkQ29udGFjdE1ldGhvZHNDb2x1bW5zLCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzJFBlb3BsZUNvbHVtbnMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENPTlRFTlRfRElSRUNUT1JZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERUZBVUxUX1NPUlRfT1JERVIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9RXh0ZW5zaW9ucyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9Db250YWN0cyRQZW9wbGU7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzJFBlb3BsZSRFeHRlbnNpb25zIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQucHJvdmlkZXIuQmFzZUNvbHVtbnMsIGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHMkRXh0ZW5zaW9uc0NvbHVtbnMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENPTlRFTlRfRElSRUNUT1JZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERUZBVUxUX1NPUlRfT1JERVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBFUlNPTl9JRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1QaG9uZXNDb2x1bW5zICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL0NvbnRhY3RzOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHMkUGhvbmVzQ29sdW1ucyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIElTUFJJTUFSWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTEFCRUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE5VTUJFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTlVNQkVSX0tFWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVFlQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0NVU1RPTQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0ZBWF9IT01FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfRkFYX1dPUksKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9IT01FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfTU9CSUxFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfT1RIRVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9QQUdFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1dPUksKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjUgbmFtZSA9UGhvbmVzICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL0NvbnRhY3RzJFBlb3BsZTsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHMkUGVvcGxlJFBob25lcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zLCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzJFBob25lc0NvbHVtbnMsIGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHMkUGVvcGxlQ29sdW1ucwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ09OVEVOVF9ESVJFQ1RPUlkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFRkFVTFRfU09SVF9PUkRFUgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL0ltOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDQgbmFtZSA9Q29tbW9uUHJlc2VuY2VDb2x1bW5zICkKLWFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLkltJENvbW1vblByZXNlbmNlQ29sdW1ucyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVZBSUxBQkxFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFXQVkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRE9fTk9UX0RJU1RVUkIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlZJU0lCTEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0ZGTElORQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUFJFU0VOQ0VfQ1VTVE9NX1NUQVRVUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUFJFU0VOQ0VfU1RBVFVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQUklPUklUWQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvQ29udGFjdHM7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1QcmVzZW5jZUNvbHVtbnMgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzJFByZXNlbmNlQ29sdW1ucyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnByb3ZpZGVyLkltJENvbW1vblByZXNlbmNlQ29sdW1ucwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSU1fQUNDT1VOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSU1fSEFORExFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBJTV9QUk9UT0NPTAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9Db250YWN0cyRQZW9wbGUkRXh0ZW5zaW9ucztMYW5kcm9pZC9wcm92aWRlci9Db250YWN0cyRQZW9wbGUkQ29udGFjdE1ldGhvZHM7TGFuZHJvaWQvcHJvdmlkZXIvQ29udGFjdHMkUGVvcGxlJFBob25lczsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNSBuYW1lID1QZW9wbGUgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvQ29udGFjdHM7ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzJFBlb3BsZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zLCBhbmRyb2lkLnByb3ZpZGVyLlN5bmNDb25zdFZhbHVlLCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzJFBlb3BsZUNvbHVtbnMsIGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHMkUGhvbmVzQ29sdW1ucywgYW5kcm9pZC5wcm92aWRlci5Db250YWN0cyRQcmVzZW5jZUNvbHVtbnMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmkgQ09OVEVOVF9GSUxURVJfVVJJCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDT05URU5UX0lURU1fVFlQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ09OVEVOVF9UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIENPTlRFTlRfVVJJCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERUZBVUxUX1NPUlRfT1JERVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmkgREVMRVRFRF9DT05URU5UX1VSSQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gR1JPVVBTX1BST0pFQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBSSU1BUllfRU1BSUxfSUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBSSU1BUllfT1JHQU5JWkFUSU9OX0lECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQUklNQVJZX1BIT05FX0lECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLm5ldC5VcmkgYWRkVG9Hcm91cCgKLWFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIKLWxvbmcKLWxvbmcpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5uZXQuVXJpIGFkZFRvR3JvdXAoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1sb25nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQubmV0LlVyaSBhZGRUb015Q29udGFjdHNHcm91cCgKLWFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIKLWxvbmcpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5uZXQuVXJpIGNyZWF0ZVBlcnNvbkluTXlDb250YWN0c0dyb3VwKAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcgotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXMpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAgbG9hZENvbnRhY3RQaG90bygKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLm5ldC5VcmkKLWludAotYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5JE9wdGlvbnMpCi0KLXByaXZhdGUgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwIGxvYWRQbGFjZWhvbGRlclBob3RvKAotaW50Ci1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5JE9wdGlvbnMpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYXJrQXNDb250YWN0ZWQoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1sb25nKQotCi1wdWJsaWMgc3RhdGljIGphdmEuaW8uSW5wdXRTdHJlYW0gb3BlbkNvbnRhY3RQaG90b0lucHV0U3RyZWFtKAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcgotYW5kcm9pZC5uZXQuVXJpKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIHF1ZXJ5R3JvdXBzKAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcgotbG9uZykKLQotcHVibGljIHN0YXRpYyB2b2lkIHNldFBob3RvRGF0YSgKLWFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIKLWFuZHJvaWQubmV0LlVyaQotYnl0ZVtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL0NvbnRhY3RzOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI1IG5hbWUgPVBob25lcyApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5Db250YWN0cyRQaG9uZXMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5wcm92aWRlci5CYXNlQ29sdW1ucywgYW5kcm9pZC5wcm92aWRlci5Db250YWN0cyRQaG9uZXNDb2x1bW5zLCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzJFBlb3BsZUNvbHVtbnMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmkgQ09OVEVOVF9GSUxURVJfVVJMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDT05URU5UX0lURU1fVFlQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ09OVEVOVF9UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIENPTlRFTlRfVVJJCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERUZBVUxUX1NPUlRfT1JERVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBFUlNPTl9JRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBnZXREaXNwbGF5TGFiZWwoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotaW50Ci1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgZ2V0RGlzcGxheUxhYmVsKAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWludAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZVtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL0NvbnRhY3RzOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9UGhvdG9zQ29sdW1ucyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHMkUGhvdG9zQ29sdW1ucyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERBVEEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERPV05MT0FEX1JFUVVJUkVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBFWElTVFNfT05fU0VSVkVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMT0NBTF9WRVJTSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQRVJTT05fSUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNZTkNfRVJST1IKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL0NvbnRhY3RzOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI1IG5hbWUgPVBob3RvcyApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5Db250YWN0cyRQaG90b3MgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5wcm92aWRlci5CYXNlQ29sdW1ucywgYW5kcm9pZC5wcm92aWRlci5Db250YWN0cyRQaG90b3NDb2x1bW5zLCBhbmRyb2lkLnByb3ZpZGVyLlN5bmNDb25zdFZhbHVlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDT05URU5UX0RJUkVDVE9SWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBDT05URU5UX1VSSQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVGQVVMVF9TT1JUX09SREVSCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9Db250YWN0czsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNSBuYW1lID1QcmVzZW5jZSApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5Db250YWN0cyRQcmVzZW5jZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zLCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzJFByZXNlbmNlQ29sdW1ucywgYW5kcm9pZC5wcm92aWRlci5Db250YWN0cyRQZW9wbGVDb2x1bW5zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIENPTlRFTlRfVVJJCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQRVJTT05fSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGdldFByZXNlbmNlSWNvblJlc291cmNlSWQoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBzZXRQcmVzZW5jZUljb24oCi1hbmRyb2lkLndpZGdldC5JbWFnZVZpZXcKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9U2V0dGluZ3NDb2x1bW5zICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL0NvbnRhY3RzOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHMkU2V0dGluZ3NDb2x1bW5zIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgS0VZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBWQUxVRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgX1NZTkNfQUNDT1VOVAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvQ29udGFjdHM7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjUgbmFtZSA9U2V0dGluZ3MgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHMkU2V0dGluZ3MgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5wcm92aWRlci5CYXNlQ29sdW1ucywgYW5kcm9pZC5wcm92aWRlci5Db250YWN0cyRTZXR0aW5nc0NvbHVtbnMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENPTlRFTlRfRElSRUNUT1JZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIENPTlRFTlRfVVJJCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERUZBVUxUX1NPUlRfT1JERVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNZTkNfRVZFUllUSElORwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRTZXR0aW5nKAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcgotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyB2b2lkIHNldFNldHRpbmcoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvQ29udGFjdHMkSW50ZW50cztMYW5kcm9pZC9wcm92aWRlci9Db250YWN0cyRFeHRlbnNpb25zO0xhbmRyb2lkL3Byb3ZpZGVyL0NvbnRhY3RzJEV4dGVuc2lvbnNDb2x1bW5zO0xhbmRyb2lkL3Byb3ZpZGVyL0NvbnRhY3RzJFBob3RvcztMYW5kcm9pZC9wcm92aWRlci9Db250YWN0cyRQaG90b3NDb2x1bW5zO0xhbmRyb2lkL3Byb3ZpZGVyL0NvbnRhY3RzJE9yZ2FuaXphdGlvbnM7TGFuZHJvaWQvcHJvdmlkZXIvQ29udGFjdHMkT3JnYW5pemF0aW9uQ29sdW1ucztMYW5kcm9pZC9wcm92aWRlci9Db250YWN0cyRQcmVzZW5jZTtMYW5kcm9pZC9wcm92aWRlci9Db250YWN0cyRQcmVzZW5jZUNvbHVtbnM7TGFuZHJvaWQvcHJvdmlkZXIvQ29udGFjdHMkQ29udGFjdE1ldGhvZHM7TGFuZHJvaWQvcHJvdmlkZXIvQ29udGFjdHMkQ29udGFjdE1ldGhvZHNDb2x1bW5zO0xhbmRyb2lkL3Byb3ZpZGVyL0NvbnRhY3RzJEdyb3VwTWVtYmVyc2hpcDtMYW5kcm9pZC9wcm92aWRlci9Db250YWN0cyRQaG9uZXM7TGFuZHJvaWQvcHJvdmlkZXIvQ29udGFjdHMkUGhvbmVzQ29sdW1ucztMYW5kcm9pZC9wcm92aWRlci9Db250YWN0cyRHcm91cHM7TGFuZHJvaWQvcHJvdmlkZXIvQ29udGFjdHMkR3JvdXBzQ29sdW1ucztMYW5kcm9pZC9wcm92aWRlci9Db250YWN0cyRQZW9wbGU7TGFuZHJvaWQvcHJvdmlkZXIvQ29udGFjdHMkUGVvcGxlQ29sdW1ucztMYW5kcm9pZC9wcm92aWRlci9Db250YWN0cyRTZXR0aW5ncztMYW5kcm9pZC9wcm92aWRlci9Db250YWN0cyRTZXR0aW5nc0NvbHVtbnM7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQVVUSE9SSVRZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIENPTlRFTlRfVVJJCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtJTkRfRU1BSUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0lORF9JTQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLSU5EX09SR0FOSVpBVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLSU5EX1BIT05FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtJTkRfUE9TVEFMCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEFHCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLkRvd25sb2FkcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIENPTlRFTlRfVVJJCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDT05UUk9MCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRST0xfUEFVU0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OVFJPTF9SVU4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OVFJPTF9TVE9QCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDT09LSUVfREFUQQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ1VSUkVOVF9CWVRFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVTQ1JJUFRJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFU1RJTkFUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFU1RJTkFUSU9OX0NBQ0hFX1BBUlRJVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVNUSU5BVElPTl9DQUNIRV9QQVJUSVRJT05fUFVSR0VBQkxFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFU1RJTkFUSU9OX0RBVEFfQ0FDSEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVTVElOQVRJT05fRVhURVJOQUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERPV05MT0FEX0NPTVBMRVRFRF9BQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEVOVElUWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRVRBRwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRkFJTEVEX0NPTk5FQ1RJT05TCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBGSUxFTkFNRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRklMRU5BTUVfSElOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTEFTVF9NT0RJRklDQVRJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1FRElBX1NDQU5ORUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1FVEhPRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVRIT0RfR0VUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FVEhPRF9QT1NUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBNSU1FVFlQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTk9USUZJQ0FUSU9OX0NMQVNTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBOT1RJRklDQVRJT05fQ0xJQ0tFRF9BQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE5PVElGSUNBVElPTl9FWFRSQVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE5PVElGSUNBVElPTl9QQUNLQUdFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBOT19JTlRFR1JJVFkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE5PX1NZU1RFTV9GSUxFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgT1RBX1VQREFURQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgT1RIRVJfVUlECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSRUZFUkVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTVEFUVVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0JBRF9SRVFVRVNUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19DQU5DRUxFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfQ0FOQ0VMTEVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19FUlJPUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfRklMRV9FUlJPUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfSFRUUF9EQVRBX0VSUk9SCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19IVFRQX0VYQ0VQVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfTEVOR1RIX1JFUVVJUkVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19OT1RfQUNDRVBUQUJMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfTk9UX0FVVEhPUklaRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX1BFTkRJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX1BFTkRJTkdfUEFVU0VECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19QUkVDT05ESVRJT05fRkFJTEVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19SVU5OSU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19SVU5OSU5HX1BBVVNFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfU1VDQ0VTUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfVU5IQU5ETEVEX0hUVFBfQ09ERQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfVU5IQU5ETEVEX1JFRElSRUNUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19VTktOT1dOX0VSUk9SCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUSVRMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVE9UQUxfQllURVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFVJRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVVJJCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBVU0VSX0FHRU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBWSVNJQklMSVRZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU0lCSUxJVFlfSElEREVOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU0lCSUxJVFlfVklTSUJMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNJQklMSVRZX1ZJU0lCTEVfTk9USUZZX0NPTVBMRVRFRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1N0YXR1c0NsaWVudEVycm9yKAotaW50KQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTdGF0dXNDb21wbGV0ZWQoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1N0YXR1c0Vycm9yKAotaW50KQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTdGF0dXNJbmZvcm1hdGlvbmFsKAotaW50KQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTdGF0dXNTZXJ2ZXJFcnJvcigKLWludCkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzU3RhdHVzU3VjY2VzcygKLWludCkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzU3RhdHVzU3VzcGVuZGVkKAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL0RybVN0b3JlOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9Q29sdW1ucyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuRHJtU3RvcmUkQ29sdW1ucyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBEQVRBCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBNSU1FX1RZUEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNJWkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRJVExFCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9QXVkaW8gKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvRHJtU3RvcmU7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5Ecm1TdG9yZSRBdWRpbyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnByb3ZpZGVyLkRybVN0b3JlJENvbHVtbnMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmkgQ09OVEVOVF9VUkkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPUltYWdlcyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9Ecm1TdG9yZTsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLkRybVN0b3JlJEltYWdlcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnByb3ZpZGVyLkRybVN0b3JlJENvbHVtbnMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmkgQ09OVEVOVF9VUkkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9Ecm1TdG9yZSRBdWRpbztMYW5kcm9pZC9wcm92aWRlci9Ecm1TdG9yZSRJbWFnZXM7TGFuZHJvaWQvcHJvdmlkZXIvRHJtU3RvcmUkQ29sdW1uczsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuRHJtU3RvcmUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUNDRVNTX0RSTV9QRVJNSVNTSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBVVRIT1JJVFkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuY29udGVudC5JbnRlbnQgYWRkRHJtRmlsZSgKLWFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIKLWphdmEuaW8uRmlsZQotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyB2b2lkIGVuZm9yY2VBY2Nlc3NEcm1QZXJtaXNzaW9uKAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvR21haWw7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9NDEwNCBuYW1lID1udWxsICkKLSBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLkdtYWlsJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI1IG5hbWUgPUF0dGFjaG1lbnQgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvR21haWw7ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLkdtYWlsJEF0dGFjaG1lbnQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnRUeXBlCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIG5hbWUKLQotcHVibGljIGFuZHJvaWQucHJvdmlkZXIuR21haWwkQXR0YWNobWVudE9yaWdpbiBvcmlnaW4KLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgb3JpZ2luRXh0cmFzCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHBhcnRJZAotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBzaW1wbGVDb250ZW50VHlwZQotCi1wdWJsaWMgaW50IHNpemUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQucHJvdmlkZXIuR21haWwkQXR0YWNobWVudCBwYXJzZUpvaW5lZFN0cmluZygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvSm9pbmVkU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI1IG5hbWUgPUF0dGFjaG1lbnRDb2x1bW5zICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL0dtYWlsOyApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5HbWFpbCRBdHRhY2htZW50Q29sdW1ucyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBGSUxFTkFNRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU1RBVFVTCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE2NDA5IG5hbWUgPUF0dGFjaG1lbnRPcmlnaW4gKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvR21haWw7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL0VudW08TGFuZHJvaWQvcHJvdmlkZXIvR21haWwkQXR0YWNobWVudE9yaWdpbjs+OyApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5HbWFpbCRBdHRhY2htZW50T3JpZ2luIGV4dGVuZHMgamF2YS5sYW5nLkVudW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYW5kcm9pZC5wcm92aWRlci5HbWFpbCRBdHRhY2htZW50T3JpZ2luW10gJFZBTFVFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucHJvdmlkZXIuR21haWwkQXR0YWNobWVudE9yaWdpbiBMT0NBTF9GSUxFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5wcm92aWRlci5HbWFpbCRBdHRhY2htZW50T3JpZ2luIFNFUlZFUl9BVFRBQ0hNRU5UCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0VSVkVSX0VYVFJBU19TRVBBUkFUT1IKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClWICkKLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBsb2NhbEZpbGVFeHRyYXMoCi1hbmRyb2lkLm5ldC5VcmkpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBzZXJ2ZXJFeHRyYXMoCi1sb25nCi1sb25nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmdbXSBzcGxpdFNlcnZlckV4dHJhcygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5wcm92aWRlci5HbWFpbCRBdHRhY2htZW50T3JpZ2luIHZhbHVlT2YoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQucHJvdmlkZXIuR21haWwkQXR0YWNobWVudE9yaWdpbltdIHZhbHVlcygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvR21haWw7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL0VudW08TGFuZHJvaWQvcHJvdmlkZXIvR21haWwkQXR0YWNobWVudFJlbmRpdGlvbjs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE2NDA5IG5hbWUgPUF0dGFjaG1lbnRSZW5kaXRpb24gKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuR21haWwkQXR0YWNobWVudFJlbmRpdGlvbiBleHRlbmRzIGphdmEubGFuZy5FbnVtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGFuZHJvaWQucHJvdmlkZXIuR21haWwkQXR0YWNobWVudFJlbmRpdGlvbltdICRWQUxVRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnByb3ZpZGVyLkdtYWlsJEF0dGFjaG1lbnRSZW5kaXRpb24gQkVTVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucHJvdmlkZXIuR21haWwkQXR0YWNobWVudFJlbmRpdGlvbiBTSU1QTEUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClWICkKLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5wcm92aWRlci5HbWFpbCRBdHRhY2htZW50UmVuZGl0aW9uIHZhbHVlT2YoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQucHJvdmlkZXIuR21haWwkQXR0YWNobWVudFJlbmRpdGlvbltdIHZhbHVlcygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdGV4dC9UZXh0VXRpbHM7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL0l0ZXJhYmxlPExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1TdHJpbmdTcGxpdHRlciApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQudGV4dC5UZXh0VXRpbHMkU3RyaW5nU3BsaXR0ZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5sYW5nLkl0ZXJhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0U3RyaW5nKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9U2ltcGxlU3RyaW5nU3BsaXR0ZXIgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xhbmRyb2lkL3RleHQvVGV4dFV0aWxzJFN0cmluZ1NwbGl0dGVyO0xqYXZhL3V0aWwvSXRlcmF0b3I8TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdGV4dC9UZXh0VXRpbHM7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnRleHQuVGV4dFV0aWxzJFNpbXBsZVN0cmluZ1NwbGl0dGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQudGV4dC5UZXh0VXRpbHMkU3RyaW5nU3BsaXR0ZXIsIGphdmEudXRpbC5JdGVyYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGNoYXIgbURlbGltaXRlcgotCi1wcml2YXRlIGludCBtTGVuZ3RoCi0KLXByaXZhdGUgaW50IG1Qb3NpdGlvbgotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbVN0cmluZwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWNoYXIpCi0KLXB1YmxpYyBib29sZWFuIGhhc05leHQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9JdGVyYXRvcjxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wdWJsaWMgamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXJhdG9yKCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgbmV4dCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIG5leHQoKQotCi1wdWJsaWMgdm9pZCByZW1vdmUoKQotCi1wdWJsaWMgdm9pZCBzZXRTdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9Q29tbWFTdHJpbmdTcGxpdHRlciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9HbWFpbDsgKQotIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuR21haWwkQ29tbWFTdHJpbmdTcGxpdHRlciBleHRlbmRzIGFuZHJvaWQudGV4dC5UZXh0VXRpbHMkU2ltcGxlU3RyaW5nU3BsaXR0ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCBzZXRTdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjUgbmFtZSA9Q29udmVyc2F0aW9uQ29sdW1ucyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9HbWFpbDsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuR21haWwkQ29udmVyc2F0aW9uQ29sdW1ucyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERBVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEZPUkNFX0FMTF9VTlJFQUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEZST00KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEhBU19BVFRBQ0hNRU5UUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSEFTX01FU1NBR0VTX1dJVEhfRVJST1JTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBJRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTEFCRUxfSURTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBNQVhfTUVTU0FHRV9JRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTlVNX01FU1NBR0VTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQRVJTT05BTF9MRVZFTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU05JUFBFVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU1VCSkVDVAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1NYWlsQ3Vyc29yICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL0dtYWlsOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5HbWFpbCRNYWlsQ3Vyc29yIGV4dGVuZHMgYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgbUFjY291bnQKLQotcHJvdGVjdGVkIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIG1DdXJzb3IKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL1NldDxMYW5kcm9pZC9wcm92aWRlci9HbWFpbCRNYWlsQ3Vyc29yT2JzZXJ2ZXI7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuU2V0IG1PYnNlcnZlcnMKLQotcHJpdmF0ZSBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlcyBtVXBkYXRlVmFsdWVzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IpCi0KLXByb3RlY3RlZCB2b2lkIGNoZWNrQ3Vyc29yKCkKLQotcHJvdGVjdGVkIHZvaWQgY2hlY2tUaHJlYWQoKQotCi1wdWJsaWMgZmluYWwgaW50IGNvdW50KCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gZGVsaXZlclNlbGZOb3RpZmljYXRpb25zKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QWNjb3VudCgpCi0KLXB1YmxpYyBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciBnZXRDdXJzb3IoKQotCi1wcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBnZXRTdHJpbmdJbkNvbHVtbigKLWludCkKLQotcHJvdGVjdGVkIGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzIGdldFVwZGF0ZVZhbHVlcygpCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIG1vdmVUbygKLWludCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gbmV4dCgpCi0KLXB1YmxpYyB2b2lkIG9uQ2hhbmdlKAotYm9vbGVhbikKLQotcHJvdGVjdGVkIHZvaWQgb25DdXJzb3JQb3NpdGlvbkNoYW5nZWQoKQotCi1wdWJsaWMgZmluYWwgaW50IHBvc2l0aW9uKCkKLQotcHVibGljIGZpbmFsIHZvaWQgcmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoCi1hbmRyb2lkLmRhdGFiYXNlLkNvbnRlbnRPYnNlcnZlcikKLQotcHVibGljIGZpbmFsIHZvaWQgcmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIoCi1hbmRyb2lkLmRhdGFiYXNlLkRhdGFTZXRPYnNlcnZlcikKLQotcHVibGljIGZpbmFsIHZvaWQgcmVnaXN0ZXJPYnNlcnZlcigKLWFuZHJvaWQucHJvdmlkZXIuR21haWwkTWFpbEN1cnNvck9ic2VydmVyKQotCi1wdWJsaWMgZmluYWwgdm9pZCByZWxlYXNlKCkKLQotcHVibGljIGZpbmFsIHZvaWQgdW5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcigKLWFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyKQotCi1wdWJsaWMgZmluYWwgdm9pZCB1bnJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKAotYW5kcm9pZC5kYXRhYmFzZS5EYXRhU2V0T2JzZXJ2ZXIpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHVucmVnaXN0ZXJPYnNlcnZlcigKLWFuZHJvaWQucHJvdmlkZXIuR21haWwkTWFpbEN1cnNvck9ic2VydmVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjUgbmFtZSA9Q29udmVyc2F0aW9uQ3Vyc29yICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL0dtYWlsOyApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5HbWFpbCRDb252ZXJzYXRpb25DdXJzb3IgZXh0ZW5kcyBhbmRyb2lkLnByb3ZpZGVyLkdtYWlsJE1haWxDdXJzb3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIGJvb2xlYW4gJGFzc2VydGlvbnNEaXNhYmxlZAotCi1wcml2YXRlIGludCBtQ29udmVyc2F0aW9uSWRJbmRleAotCi1wcml2YXRlIGludCBtRGF0ZUluZGV4Ci0KLXByaXZhdGUgaW50IG1Gb3JjZUFsbFVucmVhZEluZGV4Ci0KLXByaXZhdGUgaW50IG1Gcm9tSW5kZXgKLQotcHJpdmF0ZSBpbnQgbUhhc0F0dGFjaG1lbnRzSW5kZXgKLQotcHJpdmF0ZSBpbnQgbUhhc01lc3NhZ2VzV2l0aEVycm9yc0luZGV4Ci0KLXByaXZhdGUgaW50IG1MYWJlbElkc0luZGV4Ci0KLXByaXZhdGUgYW5kcm9pZC50ZXh0LlRleHRVdGlscyRTdHJpbmdTcGxpdHRlciBtTGFiZWxJZHNTcGxpdHRlcgotCi1wcml2YXRlIGFuZHJvaWQucHJvdmlkZXIuR21haWwkTGFiZWxNYXAgbUxhYmVsTWFwCi0KLXByaXZhdGUgaW50IG1NYXhNZXNzYWdlSWRJbmRleAotCi1wcml2YXRlIGludCBtTnVtTWVzc2FnZXNJbmRleAotCi1wcml2YXRlIGludCBtUGVyc29uYWxMZXZlbEluZGV4Ci0KLXByaXZhdGUgaW50IG1TbmlwcGV0SW5kZXgKLQotcHJpdmF0ZSBpbnQgbVN1YmplY3RJbmRleAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQucHJvdmlkZXIuR21haWwKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLnByb3ZpZGVyLkdtYWlsCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLmRhdGFiYXNlLkN1cnNvcgotYW5kcm9pZC5wcm92aWRlci5HbWFpbCQxKQotCi1wdWJsaWMgdm9pZCBiZWNvbWVBY3RpdmVOZXR3b3JrQ3Vyc29yKCkKLQotcHVibGljIGxvbmcgZ2V0Q29udmVyc2F0aW9uSWQoKQotCi1wdWJsaWMgbG9uZyBnZXREYXRlTXMoKQotCi1wdWJsaWMgYm9vbGVhbiBnZXRGb3JjZUFsbFVucmVhZCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEZyb21TbmlwcGV0SW5zdHJ1Y3Rpb25zKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvU2V0PExqYXZhL2xhbmcvTG9uZzs+OyApCi1wdWJsaWMgamF2YS51dGlsLlNldCBnZXRMYWJlbElkcygpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL1NldDxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wdWJsaWMgamF2YS51dGlsLlNldCBnZXRMYWJlbHMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1N0cmluZztMYW5kcm9pZC9wcm92aWRlci9HbWFpbCRMYWJlbE1hcDspTGphdmEvdXRpbC9TZXQ8TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHVibGljIGphdmEudXRpbC5TZXQgZ2V0TGFiZWxzKAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5wcm92aWRlci5HbWFpbCRMYWJlbE1hcCkKLQotcHVibGljIGxvbmcgZ2V0TWF4TWVzc2FnZUlkKCkKLQotcHVibGljIGludCBnZXROdW1NZXNzYWdlcygpCi0KLXB1YmxpYyBhbmRyb2lkLnByb3ZpZGVyLkdtYWlsJFBlcnNvbmFsTGV2ZWwgZ2V0UGVyc29uYWxMZXZlbCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFJhd0xhYmVsSWRzKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U25pcHBldCgpCi0KLXB1YmxpYyBhbmRyb2lkLnByb3ZpZGVyLkdtYWlsJEN1cnNvclN0YXR1cyBnZXRTdGF0dXMoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdWJqZWN0KCkKLQotcHVibGljIGJvb2xlYW4gaGFzQXR0YWNobWVudHMoKQotCi1wdWJsaWMgYm9vbGVhbiBoYXNNZXNzYWdlc1dpdGhFcnJvcnMoKQotCi1wcm90ZWN0ZWQgdm9pZCBvbkN1cnNvclBvc2l0aW9uQ2hhbmdlZCgpCi0KLXB1YmxpYyB2b2lkIHJldHJ5KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9FbnVtPExhbmRyb2lkL3Byb3ZpZGVyL0dtYWlsJEN1cnNvclN0YXR1czs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9HbWFpbDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNjQwOSBuYW1lID1DdXJzb3JTdGF0dXMgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuR21haWwkQ3Vyc29yU3RhdHVzIGV4dGVuZHMgamF2YS5sYW5nLkVudW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYW5kcm9pZC5wcm92aWRlci5HbWFpbCRDdXJzb3JTdGF0dXNbXSAkVkFMVUVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5wcm92aWRlci5HbWFpbCRDdXJzb3JTdGF0dXMgRVJST1IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnByb3ZpZGVyLkdtYWlsJEN1cnNvclN0YXR1cyBMT0FERUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnByb3ZpZGVyLkdtYWlsJEN1cnNvclN0YXR1cyBMT0FESU5HCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpViApCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQucHJvdmlkZXIuR21haWwkQ3Vyc29yU3RhdHVzIHZhbHVlT2YoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQucHJvdmlkZXIuR21haWwkQ3Vyc29yU3RhdHVzW10gdmFsdWVzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI1IG5hbWUgPUxhYmVsQ29sdW1ucyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9HbWFpbDsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuR21haWwkTGFiZWxDb2x1bW5zIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ0FOT05JQ0FMX05BTUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE5BTUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE5VTV9DT05WRVJTQVRJT05TCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBOVU1fVU5SRUFEX0NPTlZFUlNBVElPTlMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9HbWFpbDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNyBuYW1lID1MYWJlbEN1cnNvciApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5HbWFpbCRMYWJlbEN1cnNvciBleHRlbmRzIGFuZHJvaWQucHJvdmlkZXIuR21haWwkTWFpbEN1cnNvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGludCBtTmFtZUluZGV4Ci0KLXByaXZhdGUgaW50IG1OdW1Db252ZXJzYXRpb25zSW5kZXgKLQotcHJpdmF0ZSBpbnQgbU51bVVucmVhZENvbnZlcnNhdGlvbnNJbmRleAotCi1maW5hbCBhbmRyb2lkLnByb3ZpZGVyLkdtYWlsIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLnByb3ZpZGVyLkdtYWlsCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLmRhdGFiYXNlLkN1cnNvcikKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TmFtZSgpCi0KLXB1YmxpYyBpbnQgZ2V0TnVtQ29udmVyc2F0aW9ucygpCi0KLXB1YmxpYyBpbnQgZ2V0TnVtVW5yZWFkQ29udmVyc2F0aW9ucygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuR21haWwkTGFiZWxNYXAkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuT2JzZXJ2ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC5wcm92aWRlci5HbWFpbCRMYWJlbE1hcCB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLnByb3ZpZGVyLkdtYWlsJExhYmVsTWFwKQotCi1wdWJsaWMgdm9pZCB1cGRhdGUoCi1qYXZhLnV0aWwuT2JzZXJ2YWJsZQotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9HbWFpbDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNSBuYW1lID1MYWJlbE1hcCApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5HbWFpbCRMYWJlbE1hcCBleHRlbmRzIGphdmEudXRpbC5PYnNlcnZhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzIEVNUFRZX0NPTlRFTlRfVkFMVUVTCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9TZXQ8TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS51dGlsLlNldCBGT1JDRURfSU5DTFVERURfTEFCRUxTCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9TZXQ8TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS51dGlsLlNldCBGT1JDRURfSU5DTFVERURfT1JfUEFSVElBTF9MQUJFTFMKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL1NldDxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuU2V0IEZPUkNFRF9VTlNZTkNFRF9MQUJFTFMKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0xpc3Q8TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS51dGlsLkxpc3QgU09SVEVEX1VTRVJfTUVBTklOR0ZVTF9TWVNURU1fTEFCRUxTCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9Mb25nOz47ICkKLXByaXZhdGUgamF2YS51dGlsLk1hcCBtQ2Fub25pY2FsTmFtZVRvSWQKLQotcHJpdmF0ZSBsb25nIG1MYWJlbElkQ2FjaGVkCi0KLXByaXZhdGUgbG9uZyBtTGFiZWxJZENoYXQKLQotcHJpdmF0ZSBsb25nIG1MYWJlbElkRHJhZnQKLQotcHJpdmF0ZSBsb25nIG1MYWJlbElkSW5ib3gKLQotcHJpdmF0ZSBsb25nIG1MYWJlbElkT3V0Ym94Ci0KLXByaXZhdGUgbG9uZyBtTGFiZWxJZFNlbnQKLQotcHJpdmF0ZSBsb25nIG1MYWJlbElkU3BhbQotCi1wcml2YXRlIGxvbmcgbUxhYmVsSWRTdGFycmVkCi0KLXByaXZhdGUgbG9uZyBtTGFiZWxJZFRyYXNoCi0KLXByaXZhdGUgbG9uZyBtTGFiZWxJZFVucmVhZAotCi1wcml2YXRlIGxvbmcgbUxhYmVsSWRWb2ljZW1haWwKLQotcHJpdmF0ZSBsb25nIG1MYWJlbElkVm9pY2VtYWlsSW5ib3gKLQotcHJpdmF0ZSBib29sZWFuIG1MYWJlbHNTeW5jZWQKLQotcHJpdmF0ZSBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFF1ZXJ5TWFwIG1RdWVyeU1hcAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvU29ydGVkU2V0PExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXByaXZhdGUgamF2YS51dGlsLlNvcnRlZFNldCBtU29ydGVkVXNlckxhYmVscwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcgotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IKLWJvb2xlYW4pCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQ0MDAoCi1hbmRyb2lkLnByb3ZpZGVyLkdtYWlsJExhYmVsTWFwKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkNTAwKAotYW5kcm9pZC5wcm92aWRlci5HbWFpbCRMYWJlbE1hcCkKLQotcHJpdmF0ZSB2b2lkIGNoZWNrTGFiZWxzU3luY2VkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvU2V0PExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlNldCBnZXRGb3JjZWRJbmNsdWRlZExhYmVscygpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL1NldDxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5TZXQgZ2V0Rm9yY2VkSW5jbHVkZWRPclBhcnRpYWxMYWJlbHMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9TZXQ8TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuU2V0IGdldEZvcmNlZFVuc3luY2VkTGFiZWxzKCkKLQotcHJpdmF0ZSBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlcyBnZXRMYWJlbElkVmFsdWVzKAotbG9uZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvTGlzdDxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5MaXN0IGdldFNvcnRlZFVzZXJNZWFuaW5nZnVsU3lzdGVtTGFiZWxzKCkKLQotcHJpdmF0ZSB2b2lkIGluaXQoCi1hbmRyb2lkLmRhdGFiYXNlLkN1cnNvcgotYm9vbGVhbikKLQotcHJpdmF0ZSB2b2lkIHVwZGF0ZURhdGFTdHJ1Y3R1cmVzKCkKLQotcHVibGljIHZvaWQgY2xvc2UoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRDYW5vbmljYWxOYW1lKAotbG9uZykKLQotcHVibGljIGxvbmcgZ2V0TGFiZWxJZCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBsb25nIGdldExhYmVsSWRDYWNoZWQoKQotCi1wdWJsaWMgbG9uZyBnZXRMYWJlbElkQ2hhdCgpCi0KLXB1YmxpYyBsb25nIGdldExhYmVsSWREcmFmdCgpCi0KLXB1YmxpYyBsb25nIGdldExhYmVsSWRJbmJveCgpCi0KLXB1YmxpYyBsb25nIGdldExhYmVsSWRPdXRib3goKQotCi1wdWJsaWMgbG9uZyBnZXRMYWJlbElkU2VudCgpCi0KLXB1YmxpYyBsb25nIGdldExhYmVsSWRTcGFtKCkKLQotcHVibGljIGxvbmcgZ2V0TGFiZWxJZFN0YXJyZWQoKQotCi1wdWJsaWMgbG9uZyBnZXRMYWJlbElkVHJhc2goKQotCi1wdWJsaWMgbG9uZyBnZXRMYWJlbElkVW5yZWFkKCkKLQotcHVibGljIGxvbmcgZ2V0TGFiZWxJZFZvaWNlbWFpbCgpCi0KLXB1YmxpYyBsb25nIGdldExhYmVsSWRWb2ljZW1haWxJbmJveCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE5hbWUoCi1sb25nKQotCi1wdWJsaWMgaW50IGdldE51bUNvbnZlcnNhdGlvbnMoCi1sb25nKQotCi1wdWJsaWMgaW50IGdldE51bUNvbnZlcnNhdGlvbnMoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgaW50IGdldE51bVVucmVhZENvbnZlcnNhdGlvbnMoCi1sb25nKQotCi1wdWJsaWMgaW50IGdldE51bVVucmVhZENvbnZlcnNhdGlvbnMoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9Tb3J0ZWRTZXQ8TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHVibGljIGphdmEudXRpbC5Tb3J0ZWRTZXQgZ2V0U29ydGVkVXNlckxhYmVscygpCi0KLXB1YmxpYyBib29sZWFuIGhhc0xhYmVsKAotbG9uZykKLQotcHVibGljIGJvb2xlYW4gbGFiZWxzU3luY2VkKCkKLQotcHVibGljIHZvaWQgcmVxdWVyeSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPU1haWxDdXJzb3JPYnNlcnZlciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9HbWFpbDsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLkdtYWlsJE1haWxDdXJzb3JPYnNlcnZlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvbkN1cnNvckNoYW5nZWQoCi1hbmRyb2lkLnByb3ZpZGVyLkdtYWlsJE1haWxDdXJzb3IpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNSBuYW1lID1NZXNzYWdlQ29sdW1ucyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9HbWFpbDsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuR21haWwkTWVzc2FnZUNvbHVtbnMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBCQ0MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEJPRFkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENDCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDT05WRVJTQVRJT05fSUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERBVEVfUkVDRUlWRURfTVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERBVEVfU0VOVF9NUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRU1CRURTX0VYVEVSTkFMX1JFU09VUkNFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRVJST1IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEZBS0VfUkVGX01FU1NBR0VfSUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEZBS0VfU0FWRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRlJPTQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEpPSU5FRF9BVFRBQ0hNRU5UX0lORk9TCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMQUJFTF9JRFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIExJU1RfSU5GTwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTUVTU0FHRV9JRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUEVSU09OQUxfTEVWRUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFJFUExZX1RPCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTTklQUEVUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTVUJKRUNUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUTwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL0dtYWlsOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI1IG5hbWUgPU1lc3NhZ2VDdXJzb3IgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuR21haWwkTWVzc2FnZUN1cnNvciBleHRlbmRzIGFuZHJvaWQucHJvdmlkZXIuR21haWwkTWFpbEN1cnNvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgYm9vbGVhbiAkYXNzZXJ0aW9uc0Rpc2FibGVkCi0KLXByaXZhdGUgaW50IG1CY2NJbmRleAotCi1wcml2YXRlIGludCBtQm9keUVtYmVkc0V4dGVybmFsUmVzb3VyY2VzSW5kZXgKLQotcHJpdmF0ZSBpbnQgbUJvZHlJbmRleAotCi1wcml2YXRlIGludCBtQ2NJbmRleAotCi1wcml2YXRlIGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIgbUNvbnRlbnRSZXNvbHZlcgotCi1wcml2YXRlIGludCBtQ29udmVyc2F0aW9uSWRJbmRleAotCi1wcml2YXRlIGludCBtRGF0ZVJlY2VpdmVkTXNJbmRleAotCi1wcml2YXRlIGludCBtRGF0ZVNlbnRNc0luZGV4Ci0KLXByaXZhdGUgaW50IG1FcnJvckluZGV4Ci0KLXByaXZhdGUgaW50IG1Gcm9tSW5kZXgKLQotcHJpdmF0ZSBpbnQgbUlkSW5kZXgKLQotIGxvbmcgbUluUmVwbHlUb0xvY2FsTWVzc2FnZUlkCi0KLXByaXZhdGUgaW50IG1Kb2luZWRBdHRhY2htZW50SW5mb3NJbmRleAotCi1wcml2YXRlIGludCBtTGFiZWxJZHNJbmRleAotCi1wcml2YXRlIGFuZHJvaWQudGV4dC5UZXh0VXRpbHMkU3RyaW5nU3BsaXR0ZXIgbUxhYmVsSWRzU3BsaXR0ZXIKLQotcHJpdmF0ZSBhbmRyb2lkLnByb3ZpZGVyLkdtYWlsJExhYmVsTWFwIG1MYWJlbE1hcAotCi1wcml2YXRlIGludCBtTGlzdEluZm9JbmRleAotCi1wcml2YXRlIGludCBtUGVyc29uYWxMZXZlbEluZGV4Ci0KLSBib29sZWFuIG1QcmVzZXJ2ZUF0dGFjaG1lbnRzCi0KLXByaXZhdGUgaW50IG1SZXBseVRvSW5kZXgKLQotcHJpdmF0ZSBpbnQgbVNuaXBwZXRJbmRleAotCi1wcml2YXRlIGludCBtU3ViamVjdEluZGV4Ci0KLXByaXZhdGUgaW50IG1Ub0luZGV4Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1qYXZhLmxhbmcuU3RyaW5nCi1sb25nCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLnByb3ZpZGVyLkdtYWlsCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLmRhdGFiYXNlLkN1cnNvcikKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0QWRkcmVzc2VzKAotamF2YS5sYW5nLlN0cmluZwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL0dtYWlsJE5vbmV4aXN0ZW50TGFiZWxFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGFkZE9yUmVtb3ZlTGFiZWwoCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9BcnJheUxpc3Q8TGFuZHJvaWQvcHJvdmlkZXIvR21haWwkQXR0YWNobWVudDs+OyApCi1wdWJsaWMgamF2YS51dGlsLkFycmF5TGlzdCBnZXRBdHRhY2htZW50SW5mb3MoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIGdldEJjY0FkZHJlc3NlcygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEJvZHkoKQotCi1wdWJsaWMgYm9vbGVhbiBnZXRCb2R5RW1iZWRzRXh0ZXJuYWxSZXNvdXJjZXMoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIGdldENjQWRkcmVzc2VzKCkKLQotcHVibGljIGxvbmcgZ2V0Q29udmVyc2F0aW9uSWQoKQotCi1wdWJsaWMgbG9uZyBnZXREYXRlUmVjZWl2ZWRNcygpCi0KLXB1YmxpYyBsb25nIGdldERhdGVTZW50TXMoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRFcnJvclRleHQoKQotCi1wdWJsaWMgYm9vbGVhbiBnZXRFeHBhbmRlZCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEZyb21BZGRyZXNzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvU2V0PExqYXZhL2xhbmcvTG9uZzs+OyApCi1wdWJsaWMgamF2YS51dGlsLlNldCBnZXRMYWJlbElkcygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldExpc3RJbmZvKCkKLQotcHVibGljIGxvbmcgZ2V0TWVzc2FnZUlkKCkKLQotcHVibGljIGFuZHJvaWQucHJvdmlkZXIuR21haWwkUGVyc29uYWxMZXZlbCBnZXRQZXJzb25hbExldmVsKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UmF3TGFiZWxJZHMoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIGdldFJlcGx5VG9BZGRyZXNzKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U25pcHBldCgpCi0KLXB1YmxpYyBhbmRyb2lkLnByb3ZpZGVyLkdtYWlsJEN1cnNvclN0YXR1cyBnZXRTdGF0dXMoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdWJqZWN0KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBnZXRUb0FkZHJlc3NlcygpCi0KLXByb3RlY3RlZCB2b2lkIG9uQ3Vyc29yUG9zaXRpb25DaGFuZ2VkKCkKLQotcHVibGljIHZvaWQgcmV0cnkoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1NZXNzYWdlTW9kaWZpY2F0aW9uICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL0dtYWlsOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5HbWFpbCRNZXNzYWdlTW9kaWZpY2F0aW9uIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9wcm92aWRlci9HbWFpbCRBdHRhY2htZW50Oz47KUxqYXZhL2xhbmcvU3RyaW5nOyApCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgam9pbmVkQXR0YWNobWVudHNTdHJpbmcoCi1qYXZhLnV0aWwuTGlzdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGFuZHJvaWQvY29udGVudC9Db250ZW50VmFsdWVzO0xqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9wcm92aWRlci9HbWFpbCRBdHRhY2htZW50Oz47KVYgKQotcHVibGljIHN0YXRpYyB2b2lkIHB1dEF0dGFjaG1lbnRzKAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXMKLWphdmEudXRpbC5MaXN0KQotCi1wdWJsaWMgc3RhdGljIHZvaWQgcHV0QmNjQWRkcmVzc2VzKAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXMKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotcHVibGljIHN0YXRpYyB2b2lkIHB1dEJvZHkoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlcwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyB2b2lkIHB1dENjQWRkcmVzc2VzKAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXMKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotcHVibGljIHN0YXRpYyB2b2lkIHB1dFN1YmplY3QoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlcwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyB2b2lkIHB1dFRvQWRkcmVzc2VzKAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXMKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotcHVibGljIHN0YXRpYyB2b2lkIHNlbmRPclNhdmVFeGlzdGluZ01lc3NhZ2UoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1qYXZhLmxhbmcuU3RyaW5nCi1sb25nCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlcwotYm9vbGVhbikKLQotcHVibGljIHN0YXRpYyBsb25nIHNlbmRPclNhdmVOZXdNZXNzYWdlKAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcgotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXMKLWxvbmcKLWJvb2xlYW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPU5vbmV4aXN0ZW50TGFiZWxFeGNlcHRpb24gKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvR21haWw7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLkdtYWlsJE5vbmV4aXN0ZW50TGFiZWxFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE2NDA5IG5hbWUgPVBlcnNvbmFsTGV2ZWwgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvRW51bTxMYW5kcm9pZC9wcm92aWRlci9HbWFpbCRQZXJzb25hbExldmVsOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL0dtYWlsOyApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5HbWFpbCRQZXJzb25hbExldmVsIGV4dGVuZHMgamF2YS5sYW5nLkVudW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYW5kcm9pZC5wcm92aWRlci5HbWFpbCRQZXJzb25hbExldmVsW10gJFZBTFVFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucHJvdmlkZXIuR21haWwkUGVyc29uYWxMZXZlbCBOT1RfVE9fTUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnByb3ZpZGVyLkdtYWlsJFBlcnNvbmFsTGV2ZWwgT05MWV9UT19NRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucHJvdmlkZXIuR21haWwkUGVyc29uYWxMZXZlbCBUT19NRV9BTkRfT1RIRVJTCi0KLXByaXZhdGUgaW50IG1MZXZlbAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSSlWICkKLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLnByb3ZpZGVyLkdtYWlsJFBlcnNvbmFsTGV2ZWwgZnJvbUludCgKLWludCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLnByb3ZpZGVyLkdtYWlsJFBlcnNvbmFsTGV2ZWwgdmFsdWVPZigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5wcm92aWRlci5HbWFpbCRQZXJzb25hbExldmVsW10gdmFsdWVzKCkKLQotcHVibGljIGludCB0b0ludCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPVNldHRpbmdzICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL0dtYWlsOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5HbWFpbCRTZXR0aW5ncyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGxvbmcgY29udmVyc2F0aW9uQWdlRGF5cwotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIGxhYmVsc0luY2x1ZGVkCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gbGFiZWxzUGFydGlhbAotCi1wdWJsaWMgbG9uZyBtYXhBdHRhY2htZW50U2l6ZU1iCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9HbWFpbDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNSBuYW1lID1TZXR0aW5nc0NvbHVtbnMgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuR21haWwkU2V0dGluZ3NDb2x1bW5zIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ09OVkVSU0FUSU9OX0FHRV9EQVlTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMQUJFTFNfSU5DTFVERUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIExBQkVMU19QQVJUSUFMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBNQVhfQVRUQUNITUVORVRfU0laRV9NQgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9HbWFpbCQxO0xhbmRyb2lkL3Byb3ZpZGVyL0dtYWlsJENvbnZlcnNhdGlvbkN1cnNvcjtMYW5kcm9pZC9wcm92aWRlci9HbWFpbCRNZXNzYWdlTW9kaWZpY2F0aW9uO0xhbmRyb2lkL3Byb3ZpZGVyL0dtYWlsJE1lc3NhZ2VDdXJzb3I7TGFuZHJvaWQvcHJvdmlkZXIvR21haWwkQ3Vyc29yU3RhdHVzO0xhbmRyb2lkL3Byb3ZpZGVyL0dtYWlsJEF0dGFjaG1lbnQ7TGFuZHJvaWQvcHJvdmlkZXIvR21haWwkQXR0YWNobWVudE9yaWdpbjtMYW5kcm9pZC9wcm92aWRlci9HbWFpbCRBdHRhY2htZW50Q29sdW1ucztMYW5kcm9pZC9wcm92aWRlci9HbWFpbCRBdHRhY2htZW50UmVuZGl0aW9uO0xhbmRyb2lkL3Byb3ZpZGVyL0dtYWlsJFBlcnNvbmFsTGV2ZWw7TGFuZHJvaWQvcHJvdmlkZXIvR21haWwkTGFiZWxNYXA7TGFuZHJvaWQvcHJvdmlkZXIvR21haWwkTGFiZWxDdXJzb3I7TGFuZHJvaWQvcHJvdmlkZXIvR21haWwkTm9uZXhpc3RlbnRMYWJlbEV4Y2VwdGlvbjtMYW5kcm9pZC9wcm92aWRlci9HbWFpbCRNYWlsQ3Vyc29yT2JzZXJ2ZXI7TGFuZHJvaWQvcHJvdmlkZXIvR21haWwkTWFpbEN1cnNvcjtMYW5kcm9pZC9wcm92aWRlci9HbWFpbCRTZXR0aW5ncztMYW5kcm9pZC9wcm92aWRlci9HbWFpbCRTZXR0aW5nc0NvbHVtbnM7TGFuZHJvaWQvcHJvdmlkZXIvR21haWwkTGFiZWxDb2x1bW5zO0xhbmRyb2lkL3Byb3ZpZGVyL0dtYWlsJE1lc3NhZ2VDb2x1bW5zO0xhbmRyb2lkL3Byb3ZpZGVyL0dtYWlsJENvbnZlcnNhdGlvbkNvbHVtbnM7TGFuZHJvaWQvcHJvdmlkZXIvR21haWwkQ29tbWFTdHJpbmdTcGxpdHRlcjsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuR21haWwgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBmaW5hbCBib29sZWFuICRhc3NlcnRpb25zRGlzYWJsZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFUVEFDSE1FTlRfSU5GT19TRVBBUkFUT1IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwucmVnZXguUGF0dGVybiBBVFRBQ0hNRU5UX0lORk9fU0VQQVJBVE9SX1BBVFRFUk4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFVVEhPUklUWQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFVVEhPUklUWV9QTFVTX0NPTlZFUlNBVElPTlMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBVVRIT1JJVFlfUExVU19MQUJFTFMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBVVRIT1JJVFlfUExVU19NRVNTQUdFUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFVVEhPUklUWV9QTFVTX1NFVFRJTkdTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIEJBU0VfVVJJCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDT01NQU5EX0FDVElWQVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDT01NQU5EX1JFU1BPTlNFX09LCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDT01NQU5EX1JFU1BPTlNFX1VOS05PV04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENPTU1BTkRfUkVUUlkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBDT01NQV9TRVBBUkFUT1IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwucmVnZXguUGF0dGVybiBDT01NQV9TRVBBUkFUT1JfUEFUVEVSTgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmkgQ09OVkVSU0FUSU9OU19VUkkKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZ1tdIENPTlZFUlNBVElPTl9QUk9KRUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBFTUFJTF9TRVBBUkFUT1IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwucmVnZXguUGF0dGVybiBFTUFJTF9TRVBBUkFUT1JfUEFUVEVSTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRVhUUkFfU1RBVFVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBHTUFJTF9BVVRIX1NFUlZJQ0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIElOU0VSVF9QQVJBTV9BVFRBQ0hNRU5UX09SSUdJTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSU5TRVJUX1BBUkFNX0FUVEFDSE1FTlRfT1JJR0lOX0VYVFJBUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmkgTEFCRUxTX1VSSQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTEFCRUxfQUxMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMQUJFTF9DQUNIRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIExBQkVMX0NIQVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIExBQkVMX0RSQUZUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMQUJFTF9JTkJPWAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTEFCRUxfT1VUQk9YCi0KLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmdbXSBMQUJFTF9QUk9KRUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMQUJFTF9TRU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMQUJFTF9TUEFNCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMQUJFTF9TVEFSUkVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMQUJFTF9UUkFTSAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTEFCRUxfVU5SRUFECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMQUJFTF9WT0lDRU1BSUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIExBQkVMX1ZPSUNFTUFJTF9JTkJPWAotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nW10gTUVTU0FHRV9QUk9KRUNUSU9OCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEudXRpbC5yZWdleC5QYXR0ZXJuIE5BTUVfQUREUkVTU19QQVRURVJOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQUk9WSURFUl9DSEFOR0VEX0VYVFJBX0FDQ09VTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBST1ZJREVSX0NIQU5HRURfRVhUUkFfQ09VTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBST1ZJREVSX0NIQU5HRURfRVhUUkFfR0VUX0FUVEVOVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUFJPVklERVJfQ0hBTkdFRF9FWFRSQV9UQUdfTEFCRUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFJFU1BPTkRfSU5QVVRfQ09NTUFORAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUkVTUE9ORF9PVVRQVVRfQ09NTUFORF9SRVNQT05TRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXIgU0VOREVSX0xJU1RfU0VQQVJBVE9SCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTRU5ERVJfTElTVF9UT0tFTl9FTElERUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNFTkRFUl9MSVNUX1RPS0VOX0xJVEVSQUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNFTkRFUl9MSVNUX1RPS0VOX05VTV9EUkFGVFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNFTkRFUl9MSVNUX1RPS0VOX05VTV9NRVNTQUdFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0VOREVSX0xJU1RfVE9LRU5fU0VORElORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0VOREVSX0xJU1RfVE9LRU5fU0VORF9GQUlMRUQKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZ1tdIFNFVFRJTkdTX1BST0pFQ1RJT04KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIFNFVFRJTkdTX1VSSQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFNQQUNFX1NFUEFSQVRPUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudXRpbC5yZWdleC5QYXR0ZXJuIFNQQUNFX1NFUEFSQVRPUl9QQVRURVJOCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEFHCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEudXRpbC5yZWdleC5QYXR0ZXJuIFVOTkFNRURfQUREUkVTU19QQVRURVJOCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9TZXQ8TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS51dGlsLlNldCBVU0VSX1NFVFRBQkxFX0JVSUxUSU5fTEFCRUxTCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9JbnRlZ2VyO0xqYXZhL2xhbmcvSW50ZWdlcjs+OyApCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuTWFwIHNQcmlvcml0eVRvTGVuZ3RoCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZ1tdIHNTZW5kZXJGcmFnbWVudHMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzJFNpbXBsZVN0cmluZ1NwbGl0dGVyIHNTZW5kZXJMaXN0U3BsaXR0ZXIKLQotcHJpdmF0ZSBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyIG1Db250ZW50UmVzb2x2ZXIKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMYW5kcm9pZC9wcm92aWRlci9HbWFpbCRMYWJlbE1hcDs+OyApCi1wcml2YXRlIGphdmEudXRpbC5NYXAgbUxhYmVsTWFwcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcikKLQotc3RhdGljIGphdmEubGFuZy5TdHJpbmcgYWNjZXNzJDEwMCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXN0YXRpYyBhbmRyb2lkLm5ldC5VcmkgYWNjZXNzJDIwMCgpCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nW10gYWNjZXNzJDMwMCgpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRPclJlbW92ZUxhYmVsT25NZXNzYWdlKAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcgotamF2YS5sYW5nLlN0cmluZwotbG9uZwotbG9uZwotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLm5ldC5VcmkgZ2V0QXR0YWNobWVudERvd25sb2FkVXJpKAotYW5kcm9pZC5uZXQuVXJpKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQubmV0LlVyaSBnZXRBdHRhY2htZW50VXJpKAotamF2YS5sYW5nLlN0cmluZwotbG9uZwotYW5kcm9pZC5wcm92aWRlci5HbWFpbCRBdHRhY2htZW50Ci1hbmRyb2lkLnByb3ZpZGVyLkdtYWlsJEF0dGFjaG1lbnRSZW5kaXRpb24KLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExhbmRyb2lkL3Byb3ZpZGVyL0dtYWlsJExhYmVsTWFwO0xhbmRyb2lkL3RleHQvVGV4dFV0aWxzJFN0cmluZ1NwbGl0dGVyOylMamF2YS91dGlsL1NldDxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5TZXQgZ2V0Q2Fub25pY2FsTmFtZXNGcm9tTGFiZWxJZHNTdHJpbmcoCi1hbmRyb2lkLnByb3ZpZGVyLkdtYWlsJExhYmVsTWFwCi1hbmRyb2lkLnRleHQuVGV4dFV0aWxzJFN0cmluZ1NwbGl0dGVyKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RW1haWxGcm9tQWRkcmVzc1N0cmluZygKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExhbmRyb2lkL3RleHQvVGV4dFV0aWxzJFN0cmluZ1NwbGl0dGVyOylMamF2YS91dGlsL1NldDxMamF2YS9sYW5nL0xvbmc7PjsgKQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuU2V0IGdldExhYmVsSWRzRnJvbUxhYmVsSWRzU3RyaW5nKAotYW5kcm9pZC50ZXh0LlRleHRVdGlscyRTdHJpbmdTcGxpdHRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9TZXQ8TGphdmEvbGFuZy9Mb25nOz47KUxqYXZhL2xhbmcvU3RyaW5nOyApCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TGFiZWxJZHNTdHJpbmdGcm9tTGFiZWxJZHMoCi1qYXZhLnV0aWwuU2V0KQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TmFtZUZyb21BZGRyZXNzU3RyaW5nKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyB2b2lkIGdldFNlbmRlclNuaXBwZXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcgotaW50Ci1hbmRyb2lkLnRleHQuc3R5bGUuQ2hhcmFjdGVyU3R5bGUKLWFuZHJvaWQudGV4dC5zdHlsZS5DaGFyYWN0ZXJTdHlsZQotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotYm9vbGVhbgotYm9vbGVhbikKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzTGFiZWxVc2VyRGVmaW5lZCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0xhYmVsVXNlclNldHRhYmxlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLnRleHQuVGV4dFV0aWxzJFN0cmluZ1NwbGl0dGVyIG5ld0NvbnZlcnNhdGlvbkxhYmVsSWRzU3BsaXR0ZXIoKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQudGV4dC5UZXh0VXRpbHMkU3RyaW5nU3BsaXR0ZXIgbmV3TWVzc2FnZUxhYmVsSWRzU3BsaXR0ZXIoKQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIHRvTm9ubnVsbFN0cmluZygKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvR21haWwkTm9uZXhpc3RlbnRMYWJlbEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgYWRkT3JSZW1vdmVMYWJlbE9uQ29udmVyc2F0aW9uKAotamF2YS5sYW5nLlN0cmluZwotbG9uZwotbG9uZwotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotcHVibGljIHZvaWQgZXhwdW5nZU1lc3NhZ2UoCi1qYXZhLmxhbmcuU3RyaW5nCi1sb25nKQotCi1wdWJsaWMgYW5kcm9pZC5wcm92aWRlci5HbWFpbCRDb252ZXJzYXRpb25DdXJzb3IgZ2V0Q29udmVyc2F0aW9uQ3Vyc29yRm9yQ3Vyc29yKAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IpCi0KLXB1YmxpYyBhbmRyb2lkLnByb3ZpZGVyLkdtYWlsJENvbnZlcnNhdGlvbkN1cnNvciBnZXRDb252ZXJzYXRpb25DdXJzb3JGb3JRdWVyeSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhbmRyb2lkLnByb3ZpZGVyLkdtYWlsJExhYmVsTWFwIGdldExhYmVsTWFwKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFuZHJvaWQucHJvdmlkZXIuR21haWwkTWVzc2FnZUN1cnNvciBnZXRMb2NhbE1lc3NhZ2VDdXJzb3JGb3JRdWVyeSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhbmRyb2lkLnByb3ZpZGVyLkdtYWlsJE1lc3NhZ2VDdXJzb3IgZ2V0TWVzc2FnZUN1cnNvckZvckNvbnZlcnNhdGlvbklkKAotamF2YS5sYW5nLlN0cmluZwotbG9uZykKLQotcHVibGljIGFuZHJvaWQucHJvdmlkZXIuR21haWwkTWVzc2FnZUN1cnNvciBnZXRNZXNzYWdlQ3Vyc29yRm9yTWVzc2FnZUlkKAotamF2YS5sYW5nLlN0cmluZwotbG9uZykKLQotcHVibGljIGFuZHJvaWQucHJvdmlkZXIuR21haWwkU2V0dGluZ3MgZ2V0U2V0dGluZ3MoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBydW5RdWVyeUZvckNvbnZlcnNhdGlvbnMoCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLmNvbnRlbnQuQXN5bmNRdWVyeUhhbmRsZXIKLWludAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0U2V0dGluZ3MoCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLnByb3ZpZGVyLkdtYWlsJFNldHRpbmdzKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL0ltOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9QWNjb3VudENvbHVtbnMgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLkltJEFjY291bnRDb2x1bW5zIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUNUSVZFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBLRUVQX1NJR05FRF9JTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTEFTVF9MT0dJTl9TVEFURQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTE9DS0VECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBOQU1FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQQVNTV09SRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUFJPVklERVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFVTRVJOQU1FCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI1IG5hbWUgPUFjY291bnQgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvSW07ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLkltJEFjY291bnQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5wcm92aWRlci5CYXNlQ29sdW1ucywgYW5kcm9pZC5wcm92aWRlci5JbSRBY2NvdW50Q29sdW1ucwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ09OVEVOVF9JVEVNX1RZUEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENPTlRFTlRfVFlQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBDT05URU5UX1VSSQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVGQVVMVF9TT1JUX09SREVSCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUk9WSURFUl9DT0xVTU4KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZ1tdIFBST1ZJREVSX1BST0pFQ1RJT04KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgZ2V0UHJvdmlkZXJJZEZvckFjY291bnQoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1sb25nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL0ltOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9QXZhdGFyc0NvbHVtbnMgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLkltJEF2YXRhcnNDb2x1bW5zIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUNDT1VOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ09OVEFDVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREFUQQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSEFTSAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUFJPVklERVIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjUgbmFtZSA9QXZhdGFycyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9JbTsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuSW0kQXZhdGFycyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zLCBhbmRyb2lkLnByb3ZpZGVyLkltJEF2YXRhcnNDb2x1bW5zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDT05URU5UX0lURU1fVFlQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ09OVEVOVF9UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIENPTlRFTlRfVVJJCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIENPTlRFTlRfVVJJX0FWQVRBUlNfQlkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFRkFVTFRfU09SVF9PUkRFUgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvSW07ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1CYXNlTWVzc2FnZUNvbHVtbnMgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLkltJEJhc2VNZXNzYWdlQ29sdW1ucyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEJPRFkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENPTlRBQ1QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERBVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEVSUk9SX0NPREUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEVSUk9SX01FU1NBR0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBBQ0tFVF9JRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVFlQRQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvSW07ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1CbG9ja2VkTGlzdENvbHVtbnMgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLkltJEJsb2NrZWRMaXN0Q29sdW1ucyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDQ09VTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE5JQ0tOQU1FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQUk9WSURFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVVNFUk5BTUUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjUgbmFtZSA9QmxvY2tlZExpc3QgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvSW07ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLkltJEJsb2NrZWRMaXN0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQucHJvdmlkZXIuQmFzZUNvbHVtbnMsIGFuZHJvaWQucHJvdmlkZXIuSW0kQmxvY2tlZExpc3RDb2x1bW5zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBQ0NPVU5UX05BTUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFWQVRBUl9EQVRBCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDT05URU5UX0lURU1fVFlQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ09OVEVOVF9UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIENPTlRFTlRfVVJJCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERUZBVUxUX1NPUlRfT1JERVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBST1ZJREVSX05BTUUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1DaGF0c0NvbHVtbnMgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvSW07ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5JbSRDaGF0c0NvbHVtbnMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDT05UQUNUX0lECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBHUk9VUF9DSEFUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBKSURfUkVTT1VSQ0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIExBU1RfTUVTU0FHRV9EQVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMQVNUX1VOUkVBRF9NRVNTQUdFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBVTlNFTlRfQ09NUE9TRURfTUVTU0FHRQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNSBuYW1lID1DaGF0cyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9JbTsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuSW0kQ2hhdHMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5wcm92aWRlci5CYXNlQ29sdW1ucywgYW5kcm9pZC5wcm92aWRlci5JbSRDaGF0c0NvbHVtbnMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENPTlRFTlRfSVRFTV9UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDT05URU5UX1RZUEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmkgQ09OVEVOVF9VUkkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmkgQ09OVEVOVF9VUklfQllfQUNDT1VOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVGQVVMVF9TT1JUX09SREVSCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9Q29udGFjdExpc3RDb2x1bW5zICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL0ltOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuSW0kQ29udGFjdExpc3RDb2x1bW5zIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUNDT1VOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTkFNRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUFJPVklERVIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL0ltOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI1IG5hbWUgPUNvbnRhY3RMaXN0ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLkltJENvbnRhY3RMaXN0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQucHJvdmlkZXIuQmFzZUNvbHVtbnMsIGFuZHJvaWQucHJvdmlkZXIuSW0kQ29udGFjdExpc3RDb2x1bW5zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBQ0NPVU5UX05BTUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENPTlRFTlRfSVRFTV9UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDT05URU5UX1RZUEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmkgQ09OVEVOVF9VUkkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFRkFVTFRfU09SVF9PUkRFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUFJPVklERVJfTkFNRQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvSW07ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1Db250YWN0c0NvbHVtbnMgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLkltJENvbnRhY3RzQ29sdW1ucyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDQ09VTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENPTlRBQ1RMSVNUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBOSUNLTkFNRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUFJPVklERVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFFVSUNLX0NPTlRBQ1QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFJFSkVDVEVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTVUJTQ1JJUFRJT05fU1RBVFVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNVQlNDUklQVElPTl9TVEFUVVNfTk9ORQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVUJTQ1JJUFRJT05fU1RBVFVTX1NVQlNDUklCRV9QRU5ESU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNVQlNDUklQVElPTl9TVEFUVVNfVU5TVUJTQ1JJQkVfUEVORElORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU1VCU0NSSVBUSU9OX1RZUEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1VCU0NSSVBUSU9OX1RZUEVfQk9USAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVUJTQ1JJUFRJT05fVFlQRV9GUk9NCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNVQlNDUklQVElPTl9UWVBFX0lOVklUQVRJT05TCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNVQlNDUklQVElPTl9UWVBFX05PTkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1VCU0NSSVBUSU9OX1RZUEVfUkVNT1ZFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNVQlNDUklQVElPTl9UWVBFX1RPCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfQkxPQ0tFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0dST1VQCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfSElEREVOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfTk9STUFMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfUElOTkVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfVEVNUE9SQVJZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBVU0VSTkFNRQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPVByZXNlbmNlQ29sdW1ucyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9JbTsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLkltJFByZXNlbmNlQ29sdW1ucyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnByb3ZpZGVyLkltJENvbW1vblByZXNlbmNlQ29sdW1ucwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ0xJRU5UX1RZUEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX1RZUEVfQU5EUk9JRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfVFlQRV9ERUZBVUxUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9UWVBFX01PQklMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ09OVEFDVF9JRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSklEX1JFU09VUkNFCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI1IG5hbWUgPUNvbnRhY3RzICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL0ltOyApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5JbSRDb250YWN0cyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zLCBhbmRyb2lkLnByb3ZpZGVyLkltJENvbnRhY3RzQ29sdW1ucywgYW5kcm9pZC5wcm92aWRlci5JbSRQcmVzZW5jZUNvbHVtbnMsIGFuZHJvaWQucHJvdmlkZXIuSW0kQ2hhdHNDb2x1bW5zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBVkFUQVJfREFUQQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQVZBVEFSX0hBU0gKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmkgQlVMS19DT05URU5UX1VSSQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ0hBVFNfQ09OVEFDVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ09OVEVOVF9JVEVNX1RZUEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENPTlRFTlRfVFlQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBDT05URU5UX1VSSQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBDT05URU5UX1VSSV9CTE9DS0VEX0NPTlRBQ1RTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIENPTlRFTlRfVVJJX0NIQVRfQ09OVEFDVFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmkgQ09OVEVOVF9VUklfQ0hBVF9DT05UQUNUU19CWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBDT05URU5UX1VSSV9DT05UQUNUU19CQVJFQk9ORQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBDT05URU5UX1VSSV9DT05UQUNUU19CWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBDT05URU5UX1VSSV9PRkZMSU5FX0NPTlRBQ1RTX0JZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIENPTlRFTlRfVVJJX09OTElORV9DT05UQUNUU19CWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBDT05URU5UX1VSSV9XSVRIX1BSRVNFTkNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERUZBVUxUX1NPUlRfT1JERVIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1Db250YWN0c0V0YWdDb2x1bW5zICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL0ltOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuSW0kQ29udGFjdHNFdGFnQ29sdW1ucyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDQ09VTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEVUQUcKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL0ltOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI1IG5hbWUgPUNvbnRhY3RzRXRhZyApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5JbSRDb250YWN0c0V0YWcgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5wcm92aWRlci5CYXNlQ29sdW1ucywgYW5kcm9pZC5wcm92aWRlci5JbSRDb250YWN0c0V0YWdDb2x1bW5zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGludCBDT0xVTU5fRVRBRwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gQ09OVEFDVF9FVEFHX1BST0pFQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENPTlRFTlRfSVRFTV9UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDT05URU5UX1RZUEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmkgQ09OVEVOVF9VUkkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgZ2V0Um9zdGVyRXRhZygKLWFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIKLWxvbmcpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IgcXVlcnkoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IgcXVlcnkoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1qYXZhLmxhbmcuU3RyaW5nW10KLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvSW07ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1DcmVkZW50aWFsU2V0dGluZ3NDb2x1bW5zICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5JbSRDcmVkZW50aWFsU2V0dGluZ3NDb2x1bW5zIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTkFNRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUFJPVklERVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFZBTFVFCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9JbTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNSBuYW1lID1DcmVkZW50aWFsU2V0dGluZ3MgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuSW0kQ3JlZGVudGlhbFNldHRpbmdzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQucHJvdmlkZXIuQmFzZUNvbHVtbnMsIGFuZHJvaWQucHJvdmlkZXIuSW0kQ3JlZGVudGlhbFNldHRpbmdzQ29sdW1ucwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ0xJRU5UX0lECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDT05URU5UX1RZUEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmkgQ09OVEVOVF9VUkkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBSSVZBVEVfQ0xJRU5UX0tFWTEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBSSVZBVEVfQ0xJRU5UX0tFWTIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPUdyb3VwTWVtYmVyQ29sdW1ucyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9JbTsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLkltJEdyb3VwTWVtYmVyQ29sdW1ucyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEdST1VQCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBOSUNLTkFNRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVVNFUk5BTUUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL0ltOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI1IG5hbWUgPUdyb3VwTWVtYmVycyApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5JbSRHcm91cE1lbWJlcnMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5wcm92aWRlci5JbSRHcm91cE1lbWJlckNvbHVtbnMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENPTlRFTlRfSVRFTV9UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDT05URU5UX1RZUEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmkgQ09OVEVOVF9VUkkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1Hcm91cE1lc3NhZ2VDb2x1bW5zICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL0ltOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuSW0kR3JvdXBNZXNzYWdlQ29sdW1ucyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnByb3ZpZGVyLkltJEJhc2VNZXNzYWdlQ29sdW1ucwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgR1JPVVAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL0ltOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI1IG5hbWUgPUdyb3VwTWVzc2FnZXMgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuSW0kR3JvdXBNZXNzYWdlcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zLCBhbmRyb2lkLnByb3ZpZGVyLkltJEdyb3VwTWVzc2FnZUNvbHVtbnMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENPTlRFTlRfSVRFTV9UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDT05URU5UX1RZUEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmkgQ09OVEVOVF9VUkkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmkgQ09OVEVOVF9VUklfR1JPVVBfTUVTU0FHRVNfQlkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFRkFVTFRfU09SVF9PUkRFUgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIGdldENvbnRlbnRVcmlCeUdyb3VwKAotbG9uZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9JbTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPUludml0YXRpb25Db2x1bW5zICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5JbSRJbnZpdGF0aW9uQ29sdW1ucyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDQ09VTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEdST1VQX05BTUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIElOVklURV9JRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTk9URQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUFJPVklERVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNFTkRFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU1RBVFVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19BQ0NFUFRFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfUEVORElORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfUkVKRUNURUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjUgbmFtZSA9SW52aXRhdGlvbiApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9JbTsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuSW0kSW52aXRhdGlvbiBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnByb3ZpZGVyLkltJEludml0YXRpb25Db2x1bW5zLCBhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDT05URU5UX0lURU1fVFlQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ09OVEVOVF9UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIENPTlRFTlRfVVJJCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9TGFzdFJtcUlkQ29sdW1ucyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9JbTsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLkltJExhc3RSbXFJZENvbHVtbnMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSTVFfSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL0ltOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI1IG5hbWUgPUxhc3RSbXFJZCApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5JbSRMYXN0Um1xSWQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5wcm92aWRlci5CYXNlQ29sdW1ucywgYW5kcm9pZC5wcm92aWRlci5JbSRMYXN0Um1xSWRDb2x1bW5zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIENPTlRFTlRfVVJJCi0KLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmdbXSBQUk9KRUNUSU9OCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgcXVlcnlMYXN0Um1xSWQoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgc2F2ZUxhc3RSbXFJZCgKLWFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIKLWxvbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvSW07ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1NZXNzYWdlVHlwZSApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuSW0kTWVzc2FnZVR5cGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlZFUlRfVE9fR1JPVVBDSEFUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOQ09NSU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9VVEdPSU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPU1RQT05FRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUkVTRU5DRV9BVkFJTEFCTEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJFU0VOQ0VfQVdBWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUkVTRU5DRV9ETkQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJFU0VOQ0VfVU5BVkFJTEFCTEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9JbTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPU1lc3NhZ2VzQ29sdW1ucyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuSW0kTWVzc2FnZXNDb2x1bW5zIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQucHJvdmlkZXIuSW0kQmFzZU1lc3NhZ2VDb2x1bW5zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBQ0NPVU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQUk9WSURFUgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNSBuYW1lID1NZXNzYWdlcyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9JbTsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuSW0kTWVzc2FnZXMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5wcm92aWRlci5CYXNlQ29sdW1ucywgYW5kcm9pZC5wcm92aWRlci5JbSRNZXNzYWdlc0NvbHVtbnMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENPTlRFTlRfSVRFTV9UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDT05URU5UX1RZUEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmkgQ09OVEVOVF9VUkkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmkgQ09OVEVOVF9VUklfTUVTU0FHRVNfQlkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFRkFVTFRfU09SVF9PUkRFUgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIGdldENvbnRlbnRVcmlCeUNvbnRhY3QoCi1sb25nCi1sb25nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1PdXRnb2luZ1JtcUNvbHVtbnMgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvSW07ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5JbSRPdXRnb2luZ1JtcUNvbHVtbnMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBEQVRBCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSTVFfSUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRJTUVTVEFNUAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVFlQRQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNSBuYW1lID1PdXRnb2luZ1JtcSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9JbTsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuSW0kT3V0Z29pbmdSbXEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5wcm92aWRlci5CYXNlQ29sdW1ucywgYW5kcm9pZC5wcm92aWRlci5JbSRPdXRnb2luZ1JtcUNvbHVtbnMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmkgQ09OVEVOVF9VUkkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmkgQ09OVEVOVF9VUklfRk9SX0hJR0hFU1RfUk1RX0lECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERUZBVUxUX1NPUlRfT1JERVIKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZ1tdIFJNUV9JRF9QUk9KRUNUSU9OCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgcXVlcnlIaWdoZXN0Um1xSWQoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjUgbmFtZSA9UHJlc2VuY2UgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvSW07ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLkltJFByZXNlbmNlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQucHJvdmlkZXIuQmFzZUNvbHVtbnMsIGFuZHJvaWQucHJvdmlkZXIuSW0kUHJlc2VuY2VDb2x1bW5zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIEJVTEtfQ09OVEVOVF9VUkkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENPTlRFTlRfVFlQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBDT05URU5UX1VSSQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBDT05URU5UX1VSSV9CWV9BQ0NPVU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERUZBVUxUX1NPUlRfT1JERVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmkgU0VFRF9QUkVTRU5DRV9CWV9BQ0NPVU5UX0NPTlRFTlRfVVJJCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1Qcm92aWRlckNvbHVtbnMgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvSW07ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5JbSRQcm92aWRlckNvbHVtbnMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBGVUxMTkFNRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTkFNRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0lHTlVQX1VSTAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvSW07ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjUgbmFtZSA9UHJvdmlkZXIgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuSW0kUHJvdmlkZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5wcm92aWRlci5CYXNlQ29sdW1ucywgYW5kcm9pZC5wcm92aWRlci5JbSRQcm92aWRlckNvbHVtbnMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDVElWRV9BQ0NPVU5UX0lECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBQ1RJVkVfQUNDT1VOVF9QVwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUNUSVZFX0FDQ09VTlRfVVNFUk5BTUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENPTlRFTlRfVFlQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBDT05URU5UX1VSSQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBDT05URU5UX1VSSV9XSVRIX0FDQ09VTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFRkFVTFRfU09SVF9PUkRFUgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gUFJPVklERVJfUFJPSkVDVElPTgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRQcm92aWRlckNhdGVnb3J5RnJvbU5hbWUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgZ2V0UHJvdmlkZXJJZEZvck5hbWUoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UHJvdmlkZXJOYW1lRm9yQ2F0ZWdvcnkoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgZ2V0UHJvdmlkZXJOYW1lRm9ySWQoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1sb25nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1Qcm92aWRlckNhdGVnb3JpZXMgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvSW07ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5JbSRQcm92aWRlckNhdGVnb3JpZXMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBSU0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEdUQUxLCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBJQ1EKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1TTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgWUFIT08KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL0ltOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9UHJvdmlkZXJOYW1lcyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuSW0kUHJvdmlkZXJOYW1lcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFJTQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgR1RBTEsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIElDUQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTVNOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBZQUhPTwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvSW0kUHJvdmlkZXJTZXR0aW5nczsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPVF1ZXJ5TWFwICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLkltJFByb3ZpZGVyU2V0dGluZ3MkUXVlcnlNYXAgZXh0ZW5kcyBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFF1ZXJ5TWFwCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlciBtQ29udGVudFJlc29sdmVyCi0KLXByaXZhdGUgbG9uZyBtUHJvdmlkZXJJZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIKLWxvbmcKLWJvb2xlYW4KLWFuZHJvaWQub3MuSGFuZGxlcikKLQotcHJpdmF0ZSBib29sZWFuIGdldEJvb2xlYW4oCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuKQotCi1wcml2YXRlIGludCBnZXRJbnRlZ2VyKAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJvb2xlYW4gZ2V0QXV0b21hdGljYWxseUNvbm5lY3RUb0dUYWxrU2VydmVyKCkKLQotcHVibGljIGJvb2xlYW4gZ2V0RW5hYmxlTm90aWZpY2F0aW9uKCkKLQotcHVibGljIGJvb2xlYW4gZ2V0SGlkZU9mZmxpbmVDb250YWN0cygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFJpbmd0b25lVVJJKCkKLQotcHVibGljIGJvb2xlYW4gZ2V0U2hvd01vYmlsZUluZGljYXRvcigpCi0KLXB1YmxpYyBib29sZWFuIGdldFZpYnJhdGUoKQotCi1wdWJsaWMgdm9pZCBzZXRBdXRvbWF0aWNhbGx5Q29ubmVjdFRvR1RhbGtTZXJ2ZXIoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRFbmFibGVOb3RpZmljYXRpb24oCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRIaWRlT2ZmbGluZUNvbnRhY3RzKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0UmluZ3RvbmVVUkkoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRTaG93TW9iaWxlSW5kaWNhdG9yKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0VmlicmF0ZSgKLWJvb2xlYW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPVByb3ZpZGVyU2V0dGluZ3NDb2x1bW5zICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL0ltOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuSW0kUHJvdmlkZXJTZXR0aW5nc0NvbHVtbnMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBOQU1FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQUk9WSURFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVkFMVUUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1Qcm92aWRlclNldHRpbmdzICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvSW0kUHJvdmlkZXJTZXR0aW5ncyRRdWVyeU1hcDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvSW07ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLkltJFByb3ZpZGVyU2V0dGluZ3MgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5wcm92aWRlci5JbSRQcm92aWRlclNldHRpbmdzQ29sdW1ucwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ09OVEVOVF9UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIENPTlRFTlRfVVJJCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERUZBVUxUX0FDQ09VTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFRlVBTFRfRE9NQUlOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBJTVBTX0JBU0lDX1BBX09OTFlfUFJFRgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSU1QU19DSVJfQ0hBTk5FTF9QUkVGCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBJTVBTX0RBVEFfQ0hBTk5FTF9QUkVGCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBJTVBTX0RBVEFfRU5DT0RJTkdfUFJFRgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSU1QU19IT1NUX1BSRUYKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIElNUFNfTVNJU0ROX1BSRUYKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIElNUFNfUEFTU1dPUkRfRElHRVNUX0NMQVNTX1BSRUYKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIElNUFNfUFJFU0VOQ0VfTUFQUElOR19DTEFTU19QUkVGCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBJTVBTX1NFQ1VSRV9MT0dJTl9QUkVGCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMQVNUX1JNUV9SRUNFSVZFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0VUVElOR19BVVRPTUFUSUNBTExZX0NPTk5FQ1RfR1RBTEsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNFVFRJTkdfQVVUT01BVElDQUxMWV9TVEFSVF9TRVJWSUNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTRVRUSU5HX0VOQUJMRV9OT1RJRklDQVRJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNFVFRJTkdfSElERV9PRkZMSU5FX0NPTlRBQ1RTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTRVRUSU5HX1JJTkdUT05FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTRVRUSU5HX1JJTkdUT05FX0RFRkFVTFQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNFVFRJTkdfU0hPV19NT0JJTEVfSU5ESUNBVE9SCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTRVRUSU5HX1ZJQlJBVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNIT1dfT0ZGTElORV9DT05UQUNUUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0lHTlVQX1VSTAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRCb29sZWFuVmFsdWUoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1sb25nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciBnZXRTZXR0aW5nVmFsdWUoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1sb25nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nVmFsdWUoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1sb25nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgcHV0Qm9vbGVhblZhbHVlKAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcgotbG9uZwotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotcHVibGljIHN0YXRpYyB2b2lkIHB1dExvbmdWYWx1ZSgKLWFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIKLWxvbmcKLWphdmEubGFuZy5TdHJpbmcKLWxvbmcpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBwdXRTdHJpbmdWYWx1ZSgKLWFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIKLWxvbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExhbmRyb2lkL2NvbnRlbnQvQ29udGVudFJlc29sdmVyO0opTGphdmEvdXRpbC9IYXNoTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLkhhc2hNYXAgcXVlcnlQcm92aWRlclNldHRpbmdzKAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcgotbG9uZykKLQotcHVibGljIHN0YXRpYyB2b2lkIHNldEF1dG9tYXRpY2FsbHlDb25uZWN0R1RhbGsoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1sb25nCi1ib29sZWFuKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgc2V0RW5hYmxlTm90aWZpY2F0aW9uKAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcgotbG9uZwotYm9vbGVhbikKLQotcHVibGljIHN0YXRpYyB2b2lkIHNldEhpZGVPZmZsaW5lQ29udGFjdHMoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1sb25nCi1ib29sZWFuKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgc2V0UmluZ3RvbmVVUkkoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1sb25nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgc2V0U2hvd01vYmlsZUluZGljYXRvcigKLWFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIKLWxvbmcKLWJvb2xlYW4pCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRWaWJyYXRlKAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcgotbG9uZwotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9U2Vzc2lvbkNvb2tpZXNDb2x1bW5zICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL0ltOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuSW0kU2Vzc2lvbkNvb2tpZXNDb2x1bW5zIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUNDT1VOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTkFNRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUFJPVklERVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFZBTFVFCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9JbTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPVNlc3Npb25Db29raWVzICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLkltJFNlc3Npb25Db29raWVzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQucHJvdmlkZXIuSW0kU2Vzc2lvbkNvb2tpZXNDb2x1bW5zLCBhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDT05URU5UX1RZUEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmkgQ09OVEVOVF9VUkkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmkgQ09OVEVOVF9VUklfU0VTU0lPTl9DT09LSUVTX0JZCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL0ltJENyZWRlbnRpYWxTZXR0aW5ncztMYW5kcm9pZC9wcm92aWRlci9JbSRDcmVkZW50aWFsU2V0dGluZ3NDb2x1bW5zO0xhbmRyb2lkL3Byb3ZpZGVyL0ltJExhc3RSbXFJZDtMYW5kcm9pZC9wcm92aWRlci9JbSRMYXN0Um1xSWRDb2x1bW5zO0xhbmRyb2lkL3Byb3ZpZGVyL0ltJE91dGdvaW5nUm1xO0xhbmRyb2lkL3Byb3ZpZGVyL0ltJE91dGdvaW5nUm1xQ29sdW1ucztMYW5kcm9pZC9wcm92aWRlci9JbSRQcm92aWRlclNldHRpbmdzO0xhbmRyb2lkL3Byb3ZpZGVyL0ltJFByb3ZpZGVyU2V0dGluZ3NDb2x1bW5zO0xhbmRyb2lkL3Byb3ZpZGVyL0ltJFNlc3Npb25Db29raWVzO0xhbmRyb2lkL3Byb3ZpZGVyL0ltJFNlc3Npb25Db29raWVzQ29sdW1ucztMYW5kcm9pZC9wcm92aWRlci9JbSRDaGF0cztMYW5kcm9pZC9wcm92aWRlci9JbSRDaGF0c0NvbHVtbnM7TGFuZHJvaWQvcHJvdmlkZXIvSW0kUHJlc2VuY2U7TGFuZHJvaWQvcHJvdmlkZXIvSW0kUHJlc2VuY2VDb2x1bW5zO0xhbmRyb2lkL3Byb3ZpZGVyL0ltJENvbW1vblByZXNlbmNlQ29sdW1ucztMYW5kcm9pZC9wcm92aWRlci9JbSRBdmF0YXJzO0xhbmRyb2lkL3Byb3ZpZGVyL0ltJEF2YXRhcnNDb2x1bW5zO0xhbmRyb2lkL3Byb3ZpZGVyL0ltJEdyb3VwTWVzc2FnZXM7TGFuZHJvaWQvcHJvdmlkZXIvSW0kR3JvdXBNZXNzYWdlQ29sdW1ucztMYW5kcm9pZC9wcm92aWRlci9JbSRJbnZpdGF0aW9uO0xhbmRyb2lkL3Byb3ZpZGVyL0ltJEludml0YXRpb25Db2x1bW5zO0xhbmRyb2lkL3Byb3ZpZGVyL0ltJEdyb3VwTWVtYmVycztMYW5kcm9pZC9wcm92aWRlci9JbSRHcm91cE1lbWJlckNvbHVtbnM7TGFuZHJvaWQvcHJvdmlkZXIvSW0kTWVzc2FnZXM7TGFuZHJvaWQvcHJvdmlkZXIvSW0kTWVzc2FnZXNDb2x1bW5zO0xhbmRyb2lkL3Byb3ZpZGVyL0ltJEJhc2VNZXNzYWdlQ29sdW1ucztMYW5kcm9pZC9wcm92aWRlci9JbSRNZXNzYWdlVHlwZTtMYW5kcm9pZC9wcm92aWRlci9JbSRDb250YWN0c0V0YWc7TGFuZHJvaWQvcHJvdmlkZXIvSW0kQ29udGFjdHNFdGFnQ29sdW1ucztMYW5kcm9pZC9wcm92aWRlci9JbSRCbG9ja2VkTGlzdDtMYW5kcm9pZC9wcm92aWRlci9JbSRCbG9ja2VkTGlzdENvbHVtbnM7TGFuZHJvaWQvcHJvdmlkZXIvSW0kQ29udGFjdExpc3Q7TGFuZHJvaWQvcHJvdmlkZXIvSW0kQ29udGFjdExpc3RDb2x1bW5zO0xhbmRyb2lkL3Byb3ZpZGVyL0ltJENvbnRhY3RzO0xhbmRyb2lkL3Byb3ZpZGVyL0ltJENvbnRhY3RzQ29sdW1ucztMYW5kcm9pZC9wcm92aWRlci9JbSRBY2NvdW50O0xhbmRyb2lkL3Byb3ZpZGVyL0ltJEFjY291bnRDb2x1bW5zO0xhbmRyb2lkL3Byb3ZpZGVyL0ltJFByb3ZpZGVyO0xhbmRyb2lkL3Byb3ZpZGVyL0ltJFByb3ZpZGVyQ2F0ZWdvcmllcztMYW5kcm9pZC9wcm92aWRlci9JbSRQcm92aWRlck5hbWVzO0xhbmRyb2lkL3Byb3ZpZGVyL0ltJFByb3ZpZGVyQ29sdW1uczsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuSW0gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPUFsYnVtQ29sdW1ucyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9NZWRpYVN0b3JlJEF1ZGlvOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuTWVkaWFTdG9yZSRBdWRpbyRBbGJ1bUNvbHVtbnMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBTEJVTQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUxCVU1fQVJUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBTEJVTV9JRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUxCVU1fS0VZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBUlRJU1QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEZJUlNUX1lFQVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIExBU1RfWUVBUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTlVNQkVSX09GX1NPTkdTCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI1IG5hbWUgPUFsYnVtcyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9NZWRpYVN0b3JlJEF1ZGlvOyApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5NZWRpYVN0b3JlJEF1ZGlvJEFsYnVtcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zLCBhbmRyb2lkLnByb3ZpZGVyLk1lZGlhU3RvcmUkQXVkaW8kQWxidW1Db2x1bW5zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDT05URU5UX1RZUEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFRkFVTFRfU09SVF9PUkRFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRU5UUllfQ09OVEVOVF9UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIEVYVEVSTkFMX0NPTlRFTlRfVVJJCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIElOVEVSTkFMX0NPTlRFTlRfVVJJCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQubmV0LlVyaSBnZXRDb250ZW50VXJpKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9NZWRpYVN0b3JlJEF1ZGlvOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9QXJ0aXN0Q29sdW1ucyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuTWVkaWFTdG9yZSRBdWRpbyRBcnRpc3RDb2x1bW5zIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQVJUSVNUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBUlRJU1RfS0VZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBOVU1CRVJfT0ZfQUxCVU1TCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBOVU1CRVJfT0ZfVFJBQ0tTCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9NZWRpYVN0b3JlJEF1ZGlvJEFydGlzdHM7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjUgbmFtZSA9QWxidW1zICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLk1lZGlhU3RvcmUkQXVkaW8kQXJ0aXN0cyRBbGJ1bXMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5wcm92aWRlci5NZWRpYVN0b3JlJEF1ZGlvJEFsYnVtQ29sdW1ucwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIGdldENvbnRlbnRVcmkoCi1qYXZhLmxhbmcuU3RyaW5nCi1sb25nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvTWVkaWFTdG9yZSRBdWRpbyRBcnRpc3RzJEFsYnVtczsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNSBuYW1lID1BcnRpc3RzICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL01lZGlhU3RvcmUkQXVkaW87ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLk1lZGlhU3RvcmUkQXVkaW8kQXJ0aXN0cyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zLCBhbmRyb2lkLnByb3ZpZGVyLk1lZGlhU3RvcmUkQXVkaW8kQXJ0aXN0Q29sdW1ucwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ09OVEVOVF9UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERUZBVUxUX1NPUlRfT1JERVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEVOVFJZX0NPTlRFTlRfVFlQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBFWFRFUk5BTF9DT05URU5UX1VSSQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBJTlRFUk5BTF9DT05URU5UX1VSSQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLm5ldC5VcmkgZ2V0Q29udGVudFVyaSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPU1lZGlhQ29sdW1ucyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9NZWRpYVN0b3JlOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuTWVkaWFTdG9yZSRNZWRpYUNvbHVtbnMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5wcm92aWRlci5CYXNlQ29sdW1ucwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREFUQQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREFURV9BRERFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREFURV9NT0RJRklFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRElTUExBWV9OQU1FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBNSU1FX1RZUEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNJWkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRJVExFCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9QXVkaW9Db2x1bW5zICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL01lZGlhU3RvcmUkQXVkaW87ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5NZWRpYVN0b3JlJEF1ZGlvJEF1ZGlvQ29sdW1ucyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnByb3ZpZGVyLk1lZGlhU3RvcmUkTWVkaWFDb2x1bW5zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBTEJVTQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUxCVU1fQVJUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBTEJVTV9JRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUxCVU1fS0VZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBUlRJU1QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFSVElTVF9JRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQVJUSVNUX0tFWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ09NUE9TRVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERVUkFUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBJU19BTEFSTQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSVNfTVVTSUMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIElTX05PVElGSUNBVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSVNfUklOR1RPTkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRJVExFX0tFWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVFJBQ0sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFlFQVIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL01lZGlhU3RvcmUkQXVkaW8kR2VucmVzOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI1IG5hbWUgPU1lbWJlcnMgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuTWVkaWFTdG9yZSRBdWRpbyRHZW5yZXMkTWVtYmVycyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnByb3ZpZGVyLk1lZGlhU3RvcmUkQXVkaW8kQXVkaW9Db2x1bW5zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBVURJT19JRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ09OVEVOVF9ESVJFQ1RPUlkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFRkFVTFRfU09SVF9PUkRFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgR0VOUkVfSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBnZXRDb250ZW50VXJpKAotamF2YS5sYW5nLlN0cmluZwotbG9uZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9R2VucmVzQ29sdW1ucyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9NZWRpYVN0b3JlJEF1ZGlvOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuTWVkaWFTdG9yZSRBdWRpbyRHZW5yZXNDb2x1bW5zIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTkFNRQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNSBuYW1lID1HZW5yZXMgKQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9NZWRpYVN0b3JlJEF1ZGlvJEdlbnJlcyRNZW1iZXJzOyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9NZWRpYVN0b3JlJEF1ZGlvOyApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5NZWRpYVN0b3JlJEF1ZGlvJEdlbnJlcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zLCBhbmRyb2lkLnByb3ZpZGVyLk1lZGlhU3RvcmUkQXVkaW8kR2VucmVzQ29sdW1ucwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ09OVEVOVF9UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERUZBVUxUX1NPUlRfT1JERVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEVOVFJZX0NPTlRFTlRfVFlQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBFWFRFUk5BTF9DT05URU5UX1VSSQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBJTlRFUk5BTF9DT05URU5UX1VSSQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLm5ldC5VcmkgZ2V0Q29udGVudFVyaSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNSBuYW1lID1NZWRpYSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9NZWRpYVN0b3JlJEF1ZGlvOyApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5NZWRpYVN0b3JlJEF1ZGlvJE1lZGlhIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQucHJvdmlkZXIuTWVkaWFTdG9yZSRBdWRpbyRBdWRpb0NvbHVtbnMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENPTlRFTlRfVFlQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVGQVVMVF9TT1JUX09SREVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIEVYVEVSTkFMX0NPTlRFTlRfVVJJCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIElOVEVSTkFMX0NPTlRFTlRfVVJJCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSRUNPUkRfU09VTkRfQUNUSU9OCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQubmV0LlVyaSBnZXRDb250ZW50VXJpKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLm5ldC5VcmkgZ2V0Q29udGVudFVyaUZvclBhdGgoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjUgbmFtZSA9TWVtYmVycyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9NZWRpYVN0b3JlJEF1ZGlvJFBsYXlsaXN0czsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuTWVkaWFTdG9yZSRBdWRpbyRQbGF5bGlzdHMkTWVtYmVycyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnByb3ZpZGVyLk1lZGlhU3RvcmUkQXVkaW8kQXVkaW9Db2x1bW5zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBVURJT19JRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ09OVEVOVF9ESVJFQ1RPUlkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFRkFVTFRfU09SVF9PUkRFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUExBWUxJU1RfSUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBMQVlfT1JERVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIF9JRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIGdldENvbnRlbnRVcmkoCi1qYXZhLmxhbmcuU3RyaW5nCi1sb25nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL01lZGlhU3RvcmUkQXVkaW87ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1QbGF5bGlzdHNDb2x1bW5zICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5NZWRpYVN0b3JlJEF1ZGlvJFBsYXlsaXN0c0NvbHVtbnMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBEQVRBCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBEQVRFX0FEREVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBEQVRFX01PRElGSUVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBOQU1FCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI1IG5hbWUgPVBsYXlsaXN0cyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9NZWRpYVN0b3JlJEF1ZGlvOyApCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL01lZGlhU3RvcmUkQXVkaW8kUGxheWxpc3RzJE1lbWJlcnM7ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLk1lZGlhU3RvcmUkQXVkaW8kUGxheWxpc3RzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQucHJvdmlkZXIuQmFzZUNvbHVtbnMsIGFuZHJvaWQucHJvdmlkZXIuTWVkaWFTdG9yZSRBdWRpbyRQbGF5bGlzdHNDb2x1bW5zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDT05URU5UX1RZUEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFRkFVTFRfU09SVF9PUkRFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRU5UUllfQ09OVEVOVF9UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIEVYVEVSTkFMX0NPTlRFTlRfVVJJCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIElOVEVSTkFMX0NPTlRFTlRfVVJJCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQubmV0LlVyaSBnZXRDb250ZW50VXJpKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL01lZGlhU3RvcmUkQXVkaW8kQWxidW1zO0xhbmRyb2lkL3Byb3ZpZGVyL01lZGlhU3RvcmUkQXVkaW8kQWxidW1Db2x1bW5zO0xhbmRyb2lkL3Byb3ZpZGVyL01lZGlhU3RvcmUkQXVkaW8kQXJ0aXN0cztMYW5kcm9pZC9wcm92aWRlci9NZWRpYVN0b3JlJEF1ZGlvJEFydGlzdENvbHVtbnM7TGFuZHJvaWQvcHJvdmlkZXIvTWVkaWFTdG9yZSRBdWRpbyRQbGF5bGlzdHM7TGFuZHJvaWQvcHJvdmlkZXIvTWVkaWFTdG9yZSRBdWRpbyRQbGF5bGlzdHNDb2x1bW5zO0xhbmRyb2lkL3Byb3ZpZGVyL01lZGlhU3RvcmUkQXVkaW8kR2VucmVzO0xhbmRyb2lkL3Byb3ZpZGVyL01lZGlhU3RvcmUkQXVkaW8kR2VucmVzQ29sdW1ucztMYW5kcm9pZC9wcm92aWRlci9NZWRpYVN0b3JlJEF1ZGlvJE1lZGlhO0xhbmRyb2lkL3Byb3ZpZGVyL01lZGlhU3RvcmUkQXVkaW8kQXVkaW9Db2x1bW5zOyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9NZWRpYVN0b3JlOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI1IG5hbWUgPUF1ZGlvICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLk1lZGlhU3RvcmUkQXVkaW8gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGtleUZvcigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvTWVkaWFTdG9yZSRJbWFnZXM7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1JbWFnZUNvbHVtbnMgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLk1lZGlhU3RvcmUkSW1hZ2VzJEltYWdlQ29sdW1ucyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnByb3ZpZGVyLk1lZGlhU3RvcmUkTWVkaWFDb2x1bW5zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBCVUNLRVRfRElTUExBWV9OQU1FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBCVUNLRVRfSUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERBVEVfVEFLRU4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFU0NSSVBUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBJU19QUklWQVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMQVRJVFVERQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTE9OR0lUVURFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBNSU5JX1RIVU1CX01BR0lDCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBPUklFTlRBVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUElDQVNBX0lECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9NZWRpYVN0b3JlJEltYWdlczsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNSBuYW1lID1NZWRpYSApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5NZWRpYVN0b3JlJEltYWdlcyRNZWRpYSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnByb3ZpZGVyLk1lZGlhU3RvcmUkSW1hZ2VzJEltYWdlQ29sdW1ucwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ09OVEVOVF9UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERUZBVUxUX1NPUlRfT1JERVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmkgRVhURVJOQUxfQ09OVEVOVF9VUkkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmkgSU5URVJOQUxfQ09OVEVOVF9VUkkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwIFN0b3JlVGh1bWJuYWlsKAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcgotYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAKLWxvbmcKLWZsb2F0Ci1mbG9hdAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0ZpbGVOb3RGb3VuZEV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCBnZXRCaXRtYXAoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1hbmRyb2lkLm5ldC5VcmkpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5uZXQuVXJpIGdldENvbnRlbnRVcmkoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgaW5zZXJ0SW1hZ2UoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1hbmRyb2lkLmdyYXBoaWNzLkJpdG1hcAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9GaWxlTm90Rm91bmRFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBpbnNlcnRJbWFnZSgKLWFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IgcXVlcnkoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1hbmRyb2lkLm5ldC5VcmkKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciBxdWVyeSgKLWFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIKLWFuZHJvaWQubmV0LlVyaQotamF2YS5sYW5nLlN0cmluZ1tdCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIHF1ZXJ5KAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcgotYW5kcm9pZC5uZXQuVXJpCi1qYXZhLmxhbmcuU3RyaW5nW10KLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmdbXQotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9VGh1bWJuYWlscyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9NZWRpYVN0b3JlJEltYWdlczsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuTWVkaWFTdG9yZSRJbWFnZXMkVGh1bWJuYWlscyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBEQVRBCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERUZBVUxUX1NPUlRfT1JERVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmkgRVhURVJOQUxfQ09OVEVOVF9VUkkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRlVMTF9TQ1JFRU5fS0lORAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSEVJR0hUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBJTUFHRV9JRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBJTlRFUk5BTF9DT05URU5UX1VSSQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgS0lORAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSUNST19LSU5ECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JTklfS0lORAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgV0lEVEgKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5uZXQuVXJpIGdldENvbnRlbnRVcmkoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIHF1ZXJ5KAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcgotYW5kcm9pZC5uZXQuVXJpCi1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IgcXVlcnlNaW5pVGh1bWJuYWlsKAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcgotbG9uZwotaW50Ci1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IgcXVlcnlNaW5pVGh1bWJuYWlscygKLWFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIKLWFuZHJvaWQubmV0LlVyaQotaW50Ci1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9NZWRpYVN0b3JlJEltYWdlcyRUaHVtYm5haWxzO0xhbmRyb2lkL3Byb3ZpZGVyL01lZGlhU3RvcmUkSW1hZ2VzJE1lZGlhO0xhbmRyb2lkL3Byb3ZpZGVyL01lZGlhU3RvcmUkSW1hZ2VzJEltYWdlQ29sdW1uczsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNSBuYW1lID1JbWFnZXMgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvTWVkaWFTdG9yZTsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuTWVkaWFTdG9yZSRJbWFnZXMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9VmlkZW9Db2x1bW5zICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL01lZGlhU3RvcmUkVmlkZW87ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5NZWRpYVN0b3JlJFZpZGVvJFZpZGVvQ29sdW1ucyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnByb3ZpZGVyLk1lZGlhU3RvcmUkTWVkaWFDb2x1bW5zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBTEJVTQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQVJUSVNUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDQVRFR09SWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREFURV9UQUtFTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVTQ1JJUFRJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERVUkFUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBJU19QUklWQVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMQU5HVUFHRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTEFUSVRVREUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIExPTkdJVFVERQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTUlOSV9USFVNQl9NQUdJQwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUkVTT0xVVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEFHUwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNSBuYW1lID1NZWRpYSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9NZWRpYVN0b3JlJFZpZGVvOyApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5NZWRpYVN0b3JlJFZpZGVvJE1lZGlhIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQucHJvdmlkZXIuTWVkaWFTdG9yZSRWaWRlbyRWaWRlb0NvbHVtbnMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENPTlRFTlRfVFlQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVGQVVMVF9TT1JUX09SREVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIEVYVEVSTkFMX0NPTlRFTlRfVVJJCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIElOVEVSTkFMX0NPTlRFTlRfVVJJCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQubmV0LlVyaSBnZXRDb250ZW50VXJpKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL01lZGlhU3RvcmUkVmlkZW8kTWVkaWE7TGFuZHJvaWQvcHJvdmlkZXIvTWVkaWFTdG9yZSRWaWRlbyRWaWRlb0NvbHVtbnM7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjUgbmFtZSA9VmlkZW8gKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvTWVkaWFTdG9yZTsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuTWVkaWFTdG9yZSRWaWRlbyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFRkFVTFRfU09SVF9PUkRFUgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IgcXVlcnkoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1hbmRyb2lkLm5ldC5VcmkKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL01lZGlhU3RvcmUkVmlkZW87TGFuZHJvaWQvcHJvdmlkZXIvTWVkaWFTdG9yZSRBdWRpbztMYW5kcm9pZC9wcm92aWRlci9NZWRpYVN0b3JlJEltYWdlcztMYW5kcm9pZC9wcm92aWRlci9NZWRpYVN0b3JlJE1lZGlhQ29sdW1uczsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuTWVkaWFTdG9yZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDVElPTl9JTUFHRV9DQVBUVVJFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBVVRIT1JJVFkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDT05URU5UX0FVVEhPUklUWV9TTEFTSAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRklMRV9VUklfUFJFRklYCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBNRURJQV9TQ0FOTkVSX1ZPTFVNRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRBRwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5uZXQuVXJpIGdldE1lZGlhU2Nhbm5lclVyaSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuT3BlbmFibGVDb2x1bW5zIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRElTUExBWV9OQU1FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTSVpFCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9TZWFyY2hSZWNlbnRTdWdnZXN0aW9uczsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1TdWdnZXN0aW9uQ29sdW1ucyApCi0gY2xhc3MgYW5kcm9pZC5wcm92aWRlci5TZWFyY2hSZWNlbnRTdWdnZXN0aW9ucyRTdWdnZXN0aW9uQ29sdW1ucyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBEQVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBESVNQTEFZMQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRElTUExBWTIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFFVRVJZCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9TZWFyY2hSZWNlbnRTdWdnZXN0aW9ucyRTdWdnZXN0aW9uQ29sdW1uczsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuU2VhcmNoUmVjZW50U3VnZ2VzdGlvbnMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEQkdfU1VHR0VTVElPTl9USU1FU1RBTVBTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTE9HX1RBRwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0hJU1RPUllfQ09VTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gUVVFUklFU19QUk9KRUNUSU9OXzFMSU5FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZ1tdIFFVRVJJRVNfUFJPSkVDVElPTl8yTElORQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBRVUVSSUVTX1BST0pFQ1RJT05fREFURV9JTkRFWAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBRVUVSSUVTX1BST0pFQ1RJT05fRElTUExBWTFfSU5ERVgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUVVFUklFU19QUk9KRUNUSU9OX0RJU1BMQVkyX0lOREVYCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFFVRVJJRVNfUFJPSkVDVElPTl9RVUVSWV9JTkRFWAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gVFJVTkNBVEVfSElTVE9SWV9QUk9KRUNUSU9OCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtQXV0aG9yaXR5Ci0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgbUNvbnRleHQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nW10gbVF1ZXJpZXNQcm9qZWN0aW9uCi0KLXByaXZhdGUgYW5kcm9pZC5uZXQuVXJpIG1TdWdnZXN0aW9uc1VyaQotCi1wcml2YXRlIGJvb2xlYW4gbVR3b0xpbmVEaXNwbGF5Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgdm9pZCBjbGVhckhpc3RvcnkoKQotCi1wdWJsaWMgdm9pZCBzYXZlUmVjZW50UXVlcnkoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcm90ZWN0ZWQgdm9pZCB0cnVuY2F0ZUhpc3RvcnkoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3M7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjUgbmFtZSA9Qm9va21hcmtzICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzJEJvb2ttYXJrcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIENPTlRFTlRfVVJJCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBGT0xERVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIElECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBJTlRFTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE9SREVSSU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTSE9SVENVVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRBRwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVElUTEUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZ1tdIHNJbnRlbnRQcm9qZWN0aW9uCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmdbXSBzU2hvcnRjdXRQcm9qZWN0aW9uCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgc1Nob3J0Y3V0U2VsZWN0aW9uCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQubmV0LlVyaSBhZGQoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1jaGFyCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5jb250ZW50LkludGVudCBnZXRJbnRlbnRGb3JTaG9ydGN1dCgKLWFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIKLWNoYXIpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBsYWJlbEZvckZvbGRlcigKLWFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzJEdzZXJ2aWNlczsgKQotQGphdmEubGFuZy5EZXByZWNhdGVkCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9UXVlcnlNYXAgKQotcHVibGljIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MkR3NlcnZpY2VzJFF1ZXJ5TWFwIGV4dGVuZHMgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRRdWVyeU1hcAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIKLWFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yCi1ib29sZWFuCi1hbmRyb2lkLm9zLkhhbmRsZXIpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIKLWJvb2xlYW4KLWFuZHJvaWQub3MuSGFuZGxlcikKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9TmFtZVZhbHVlVGFibGUgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3M7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzJE5hbWVWYWx1ZVRhYmxlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQucHJvdmlkZXIuQmFzZUNvbHVtbnMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE5BTUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFZBTFVFCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLm5ldC5VcmkgZ2V0VXJpRm9yKAotYW5kcm9pZC5uZXQuVXJpCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gcHV0U3RyaW5nKAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcgotYW5kcm9pZC5uZXQuVXJpCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3MkR3NlcnZpY2VzJFF1ZXJ5TWFwOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI1IG5hbWUgPUdzZXJ2aWNlcyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9TZXR0aW5nczsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MkR3NlcnZpY2VzIGV4dGVuZHMgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncyROYW1lVmFsdWVUYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ0hFQ0tJTl9FVkVOVFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENIRUNLSU5fSU5URVJWQUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmkgQ09OVEVOVF9VUkkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERJU0tfRlJFRV9DSEFOR0VfUkVQT1JUSU5HX1RIUkVTSE9MRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgR0xTX1BVQkxJQ19LRVkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEdNQUlMX0NPTkZJR19JTkZPX01JTl9TRVJWRVJfVkVSU0lPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgR01BSUxfRElTQUxMT1dfSU1BR0VfUFJFVklFV1MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEdNQUlMX1RJTUVPVVRfTVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEdPT0dMRV9MT0dJTl9HRU5FUklDX0FVVEhfU0VSVklDRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgR09PR0xFX1NFUlZJQ0VTX1BSRUZJWAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgR1RBTEtfREFUQV9NRVNTQUdFX1dBS0VMT0NLX01TCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBHVEFMS19TRVJWSUNFX0FDVElWRV9IRUFSVEJFQVRfSU5URVJWQUxfTVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEdUQUxLX1NFUlZJQ0VfQVdBWV9IRUFSVEJFQVRfSU5URVJWQUxfTVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEdUQUxLX1NFUlZJQ0VfQ09OTkVDVF9PTl9BVVRPX1NZTkMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEdUQUxLX1NFUlZJQ0VfSEVBUlRCRUFUX0FDS19USU1FT1VUX01TCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBHVEFMS19TRVJWSUNFX0hPU1ROQU1FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBHVEFMS19TRVJWSUNFX0lETEVfVElNRU9VVF9NUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgR1RBTEtfU0VSVklDRV9NQVhfUkVDT05ORUNUX0RFTEFZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBHVEFMS19TRVJWSUNFX01JTl9SRUNPTk5FQ1RfREVMQVlfTE9ORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgR1RBTEtfU0VSVklDRV9NSU5fUkVDT05ORUNUX0RFTEFZX1NIT1JUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBHVEFMS19TRVJWSUNFX05PU1lOQ19IRUFSVEJFQVRfSU5URVJWQUxfTVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEdUQUxLX1NFUlZJQ0VfUkVDT05ORUNUX1ZBUklBTlRfTE9ORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgR1RBTEtfU0VSVklDRV9SRUNPTk5FQ1RfVkFSSUFOVF9TSE9SVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgR1RBTEtfU0VSVklDRV9STVFfQUNLX0lOVEVSVkFMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBHVEFMS19TRVJWSUNFX1NFQ1VSRV9QT1JUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBHVEFMS19TRVJWSUNFX1NIT1JUX05FVFdPUktfRE9XTlRJTUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEdUQUxLX1NFUlZJQ0VfU1lOQ19IRUFSVEJFQVRfSU5URVJWQUxfTVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEdUQUxLX1NTTF9IQU5EU0hBS0VfVElNRU9VVF9NUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTUVNQ0hFQ0tfRVhFQ19FTkRfVElNRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTUVNQ0hFQ0tfRVhFQ19TVEFSVF9USU1FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBNRU1DSEVDS19JTlRFUlZBTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTUVNQ0hFQ0tfTE9HX1JFQUxUSU1FX0lOVEVSVkFMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBNRU1DSEVDS19NSU5fQUxBUk0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1FTUNIRUNLX01JTl9TQ1JFRU5fT0ZGCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBNRU1DSEVDS19QSE9ORV9FTkFCTEVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBNRU1DSEVDS19QSE9ORV9IQVJEX1RIUkVTSE9MRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTUVNQ0hFQ0tfUEhPTkVfU09GVF9USFJFU0hPTEQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1FTUNIRUNLX1JFQ0hFQ0tfSU5URVJWQUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1FTUNIRUNLX1NZU1RFTV9FTkFCTEVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBNRU1DSEVDS19TWVNURU1fSEFSRF9USFJFU0hPTEQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1FTUNIRUNLX1NZU1RFTV9TT0ZUX1RIUkVTSE9MRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTU1TX1hfV0FQX1BST0ZJTEVfVVJMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQQVJFTlRBTF9DT05UUk9MX0NIRUNLX0VOQUJMRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBBUkVOVEFMX0NPTlRST0xfRVhQRUNURURfUkVTUE9OU0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBBUkVOVEFMX0NPTlRST0xfUkVESVJFQ1RfUkVHRVgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBBUkVOVEFMX0NPTlRST0xfVElNRU9VVF9JTl9NUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUFJPVklTSU9OSU5HX0RJR0VTVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUFJPVklTSU9OSU5HX09WRVJSSURFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSRUJPT1RfSU5URVJWQUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFJFQk9PVF9TVEFSVF9USU1FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSRUJPT1RfV0lORE9XCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTRVRUSU5HU19DT05UUklCVVRPUlNfUFJFVFRZX1VSTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0VUVElOR1NfQ09OVFJJQlVUT1JTX1VSTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0VUVElOR1NfVE9TX1BSRVRUWV9VUkwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNFVFRJTkdTX1RPU19VUkwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNZTkNfTUFYX1JFVFJZX0RFTEFZX0lOX1NFQ09ORFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNZTkNfTUlOX0daSVBfQllURVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNZU19GUkVFX1NUT1JBR0VfTE9HX0lOVEVSVkFMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTWVNfUFJPUF9TRVRUSU5HX1ZFUlNJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNZU19TVE9SQUdFX1RIUkVTSE9MRF9QRVJDRU5UQUdFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBVU0VfTVNJU0ROX1RPS0VOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBWRU5ESU5HX1JFUVVJUkVfU0lNX0ZPUl9QVVJDSEFTRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVkVORElOR19TVVBQT1JUX1VSTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVkVORElOR19TWU5DX0ZSRVFVRU5DWV9NUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVkVORElOR19UT1NfVVJMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBWRU5ESU5HX1RPU19WRVJTSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBWRU5ESU5HX1VTRV9DSEVDS09VVF9RQV9TRVJWSUNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBZT1VUVUJFX0JZX0FVVEhPUl9VUkwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFlPVVRVQkVfQ0FURUdPUllfTElTVF9VUkwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFlPVVRVQkVfQ0FURUdPUllfU0VBUkNIX1VSTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgWU9VVFVCRV9JTkRJVklEVUFMX1ZJREVPX1VSTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgWU9VVFVCRV9NT0JJTEVfVklERU9TX1VSTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgWU9VVFVCRV9NT1NUX0RJU0NVU1NFRF9VUkwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFlPVVRVQkVfTU9TVF9MSU5LRURfVVJMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBZT1VUVUJFX01PU1RfUkVDRU5UX1VSTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgWU9VVFVCRV9NT1NUX1JFU1BPTkRFRF9VUkwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFlPVVRVQkVfTU9TVF9WSUVXRURfVVJMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBZT1VUVUJFX01ZX0ZBVk9SSVRFU19VUkwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFlPVVRVQkVfTVlfUExBWUxJU1RTX1VSTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgWU9VVFVCRV9NWV9TVUJTQ1JJUFRJT05TX1VSTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgWU9VVFVCRV9NWV9WSURFT1NfVVJMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBZT1VUVUJFX1JFQ0VOVExZX0ZFQVRVUkVEX1VSTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgWU9VVFVCRV9SRUdJU1RFUl9ERVZJQ0VfVVJMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBZT1VUVUJFX1JFTEFURURfVklERU9TX1VSTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgWU9VVFVCRV9TQVZFX1RPX0ZBVk9SSVRFU19VUkwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFlPVVRVQkVfU0VBUkNIX1VSTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgWU9VVFVCRV9UT1BfRkFWT1JJVEVTX1VSTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgWU9VVFVCRV9UT1BfUkFURURfVVJMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBZT1VUVUJFX1VTRV9QUk9YWQotCi1wcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzJE5hbWVWYWx1ZUNhY2hlIG1OYW1lVmFsdWVDYWNoZQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuT2JqZWN0IG1OYW1lVmFsdWVDYWNoZUxvY2sKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgaW50IGdldEludCgKLWFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIHN0YXRpYyBsb25nIGdldExvbmcoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1qYXZhLmxhbmcuU3RyaW5nCi1sb25nKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nKAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcgotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLm5ldC5VcmkgZ2V0VXJpRm9yKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBib29sZWFuIHB1dFN0cmluZygKLWFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3M7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9TmFtZVZhbHVlQ2FjaGUgKQotIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MkTmFtZVZhbHVlQ2FjaGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5uZXQuVXJpIG1VcmkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0hhc2hNYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHJpdmF0ZSBmaW5hbCBqYXZhLnV0aWwuSGFzaE1hcCBtVmFsdWVzCi0KLXByaXZhdGUgbG9uZyBtVmFsdWVzVmVyc2lvbgotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgbVZlcnNpb25TeXN0ZW1Qcm9wZXJ0eQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQubmV0LlVyaSkKLQotIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nKAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcgotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9TZXR0aW5nczsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPVNldHRpbmdOb3RGb3VuZEV4Y2VwdGlvbiApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncyRTZXR0aW5nTm90Rm91bmRFeGNlcHRpb24gZXh0ZW5kcyBhbmRyb2lkLnV0aWwuQW5kcm9pZEV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNSBuYW1lID1TeXN0ZW0gKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3M7ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzJFN5c3RlbSBleHRlbmRzIGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MkTmFtZVZhbHVlVGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFEQl9FTkFCTEVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBSVJQTEFORV9NT0RFX09OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBSVJQTEFORV9NT0RFX1JBRElPUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUxXQVlTX0ZJTklTSF9BQ1RJVklUSUVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBTkRST0lEX0lECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBUFBFTkRfRk9SX0xBU1RfQVVESUJMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQVVUT19USU1FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBCTFVFVE9PVEhfRElTQ09WRVJBQklMSVRZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBCTFVFVE9PVEhfRElTQ09WRVJBQklMSVRZX1RJTUVPVVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEJMVUVUT09USF9PTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBDT05URU5UX1VSSQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREFUQV9ST0FNSU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBEQVRFX0ZPUk1BVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVCVUdfQVBQCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIERFRkFVTFRfTk9USUZJQ0FUSU9OX1VSSQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBERUZBVUxUX1JJTkdUT05FX1VSSQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVWSUNFX1BST1ZJU0lPTkVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBESU1fU0NSRUVOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBEVE1GX1RPTkVfV0hFTl9ESUFMSU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBFTkRfQlVUVE9OX0JFSEFWSU9SCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBGT05UX1NDQUxFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBIVFRQX1BST1hZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBJTlNUQUxMX05PTl9NQVJLRVRfQVBQUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIExPQ0tfUEFUVEVSTl9FTkFCTEVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMT0NLX1BBVFRFUk5fVklTSUJMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTE9HR0lOR19JRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTU9ERV9SSU5HRVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1PREVfUklOR0VSX1NUUkVBTVNfQUZGRUNURUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1VVEVfU1RSRUFNU19BRkZFQ1RFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTkVUV09SS19QUkVGRVJFTkNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBORVhUX0FMQVJNX0ZPUk1BVFRFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTk9USUZJQ0FUSU9OX1NPVU5ECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQQVJFTlRBTF9DT05UUk9MX0VOQUJMRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBBUkVOVEFMX0NPTlRST0xfTEFTVF9VUERBVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBBUkVOVEFMX0NPTlRST0xfUkVESVJFQ1RfVVJMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSQURJT19CTFVFVE9PVEgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFJBRElPX0NFTEwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFJBRElPX1dJRkkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFJJTkdUT05FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTQ1JFRU5fQlJJR0hUTkVTUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0NSRUVOX09GRl9USU1FT1VUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTRVRUSU5HU19DTEFTU05BTUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNFVFVQX1dJWkFSRF9IQVNfUlVOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTSE9XX0dUQUxLX1NFUlZJQ0VfU1RBVFVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTSE9XX1BST0NFU1NFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU09VTkRfRUZGRUNUU19FTkFCTEVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTVEFZX09OX1dISUxFX1BMVUdHRURfSU4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNZU19QUk9QX1NFVFRJTkdfVkVSU0lPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEVYVF9BVVRPX0NBUFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRFWFRfQVVUT19QVU5DVFVBVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRFWFRfQVVUT19SRVBMQUNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBURVhUX1NIT1dfUEFTU1dPUkQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRJTUVfMTJfMjQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRSQU5TSVRJT05fQU5JTUFUSU9OX1NDQUxFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBVU0JfTUFTU19TVE9SQUdFX0VOQUJMRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFVTRV9HT09HTEVfTUFJTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVklCUkFURV9PTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVk9MVU1FX0FMQVJNCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBWT0xVTUVfTVVTSUMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFZPTFVNRV9SSU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZ1tdIFZPTFVNRV9TRVRUSU5HUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVk9MVU1FX1NZU1RFTQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVk9MVU1FX1ZPSUNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBXQUlUX0ZPUl9ERUJVR0dFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgV0FMTFBBUEVSX0FDVElWSVRZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBXSUZJX05FVFdPUktTX0FWQUlMQUJMRV9OT1RJRklDQVRJT05fT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFdJRklfTkVUV09SS1NfQVZBSUxBQkxFX1JFUEVBVF9ERUxBWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgV0lGSV9OVU1fT1BFTl9ORVRXT1JLU19LRVBUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBXSUZJX09OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBXSUZJX1NUQVRJQ19ETlMxCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBXSUZJX1NUQVRJQ19ETlMyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBXSUZJX1NUQVRJQ19HQVRFV0FZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBXSUZJX1NUQVRJQ19JUAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgV0lGSV9TVEFUSUNfTkVUTUFTSwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgV0lGSV9VU0VfU1RBVElDX0lQCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBXSUZJX1dBVENIRE9HX0FDQ0VQVEFCTEVfUEFDS0VUX0xPU1NfUEVSQ0VOVEFHRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgV0lGSV9XQVRDSERPR19BUF9DT1VOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgV0lGSV9XQVRDSERPR19CQUNLR1JPVU5EX0NIRUNLX0RFTEFZX01TCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBXSUZJX1dBVENIRE9HX0JBQ0tHUk9VTkRfQ0hFQ0tfRU5BQkxFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgV0lGSV9XQVRDSERPR19CQUNLR1JPVU5EX0NIRUNLX1RJTUVPVVRfTVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFdJRklfV0FUQ0hET0dfSU5JVElBTF9JR05PUkVEX1BJTkdfQ09VTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFdJRklfV0FUQ0hET0dfTUFYX0FQX0NIRUNLUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgV0lGSV9XQVRDSERPR19PTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgV0lGSV9XQVRDSERPR19QSU5HX0NPVU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBXSUZJX1dBVENIRE9HX1BJTkdfREVMQVlfTVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFdJRklfV0FUQ0hET0dfUElOR19USU1FT1VUX01TCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBXSU5ET1dfQU5JTUFUSU9OX1NDQUxFCi0KLXByaXZhdGUgc3RhdGljIHZvbGF0aWxlIGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MkTmFtZVZhbHVlQ2FjaGUgbU5hbWVWYWx1ZUNhY2hlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgZ2V0Q29uZmlndXJhdGlvbigKLWFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIKLWFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9TZXR0aW5ncyRTZXR0aW5nTm90Rm91bmRFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgZmxvYXQgZ2V0RmxvYXQoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGZsb2F0IGdldEZsb2F0KAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcgotamF2YS5sYW5nLlN0cmluZwotZmxvYXQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3MkU2V0dGluZ05vdEZvdW5kRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGludCBnZXRJbnQoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGludCBnZXRJbnQoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRTaG93R1RhbGtTZXJ2aWNlU3RhdHVzKAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcikKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygKLWFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5uZXQuVXJpIGdldFVyaUZvcigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwdXRDb25maWd1cmF0aW9uKAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcgotYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uKQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gcHV0RmxvYXQoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1qYXZhLmxhbmcuU3RyaW5nCi1mbG9hdCkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIHB1dEludCgKLWFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIHB1dFN0cmluZygKLWFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTaG93R1RhbGtTZXJ2aWNlU3RhdHVzKAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcgotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzJEJvb2ttYXJrcztMYW5kcm9pZC9wcm92aWRlci9TZXR0aW5ncyRHc2VydmljZXM7TGFuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3MkU3lzdGVtO0xhbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzJE5hbWVWYWx1ZUNhY2hlO0xhbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzJE5hbWVWYWx1ZVRhYmxlO0xhbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzJFNldHRpbmdOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBQ1RJT05fQVBOX1NFVFRJTkdTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBQ1RJT05fQVBQTElDQVRJT05fU0VUVElOR1MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDVElPTl9CTFVFVE9PVEhfU0VUVElOR1MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDVElPTl9EQVRFX1NFVFRJTkdTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBQ1RJT05fRElTUExBWV9TRVRUSU5HUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUNUSU9OX0xPQ0FMRV9TRVRUSU5HUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUNUSU9OX0xPQ0FUSU9OX1NPVVJDRV9TRVRUSU5HUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUNUSU9OX1NFQ1VSSVRZX1NFVFRJTkdTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBQ1RJT05fU0VUVElOR1MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDVElPTl9TT1VORF9TRVRUSU5HUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUNUSU9OX1dJRklfU0VUVElOR1MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDVElPTl9XSVJFTEVTU19TRVRUSU5HUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQVVUSE9SSVRZCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSklEX1JFU09VUkNFX1BSRUZJWAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRBRwotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIHNKaWRSZXNvdXJjZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEdUYWxrRGV2aWNlSWQoCi1sb25nKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SmlkUmVzb3VyY2UoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1BY2NvdW50Q29sdW1ucyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9TdWJzY3JpYmVkRmVlZHM7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5TdWJzY3JpYmVkRmVlZHMkQWNjb3VudENvbHVtbnMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBfU1lOQ19BQ0NPVU5UCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI1IG5hbWUgPUFjY291bnRzICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL1N1YnNjcmliZWRGZWVkczsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuU3Vic2NyaWJlZEZlZWRzJEFjY291bnRzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQucHJvdmlkZXIuQmFzZUNvbHVtbnMsIGFuZHJvaWQucHJvdmlkZXIuU3Vic2NyaWJlZEZlZWRzJEFjY291bnRDb2x1bW5zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDT05URU5UX0lURU1fVFlQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ09OVEVOVF9UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIENPTlRFTlRfVVJJCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERUZBVUxUX1NPUlRfT1JERVIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIHF1ZXJ5KAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcgotamF2YS5sYW5nLlN0cmluZ1tdKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIHF1ZXJ5KAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcgotamF2YS5sYW5nLlN0cmluZ1tdCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL1N1YnNjcmliZWRGZWVkczsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPUZlZWRDb2x1bW5zICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5TdWJzY3JpYmVkRmVlZHMkRmVlZENvbHVtbnMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBVVRIT1JJVFkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEZFRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNFUlZJQ0UKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjUgbmFtZSA9RmVlZHMgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvU3Vic2NyaWJlZEZlZWRzOyApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5TdWJzY3JpYmVkRmVlZHMkRmVlZHMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5wcm92aWRlci5CYXNlQ29sdW1ucywgYW5kcm9pZC5wcm92aWRlci5TeW5jQ29uc3RWYWx1ZSwgYW5kcm9pZC5wcm92aWRlci5TdWJzY3JpYmVkRmVlZHMkRmVlZENvbHVtbnMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENPTlRFTlRfSVRFTV9UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDT05URU5UX1RZUEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmkgQ09OVEVOVF9VUkkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFRkFVTFRfU09SVF9PUkRFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBERUxFVEVEX0NPTlRFTlRfVVJJCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciBxdWVyeSgKLWFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciBxdWVyeSgKLWFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIKLWphdmEubGFuZy5TdHJpbmdbXQotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZ1tdCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvU3Vic2NyaWJlZEZlZWRzJEFjY291bnRzO0xhbmRyb2lkL3Byb3ZpZGVyL1N1YnNjcmliZWRGZWVkcyRBY2NvdW50Q29sdW1ucztMYW5kcm9pZC9wcm92aWRlci9TdWJzY3JpYmVkRmVlZHMkRmVlZHM7TGFuZHJvaWQvcHJvdmlkZXIvU3Vic2NyaWJlZEZlZWRzJEZlZWRDb2x1bW5zOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5TdWJzY3JpYmVkRmVlZHMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5uZXQuVXJpIGFkZEZlZWQoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGludCBkZWxldGVGZWVkKAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcgotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBpbnQgZGVsZXRlRmVlZHMoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ3RhbGtTZXJ2aWNlUm91dGluZ0luZm9Gcm9tQWNjb3VudEFuZFJlc291cmNlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTQxMDQgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9TeW5jOyApCi0gY2xhc3MgYW5kcm9pZC5wcm92aWRlci5TeW5jJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9UXVlcnlNYXAgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvU3luYyRBY3RpdmU7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLlN5bmMkQWN0aXZlJFF1ZXJ5TWFwIGV4dGVuZHMgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRRdWVyeU1hcAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIKLWJvb2xlYW4KLWFuZHJvaWQub3MuSGFuZGxlcikKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzIGdldEFjdGl2ZVN5bmNJbmZvKCkKLQotcHVibGljIGxvbmcgZ2V0U3luY1N0YXJ0VGltZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN5bmNpbmdBY2NvdW50KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3luY2luZ0F1dGhvcml0eSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPVN0YXRzQ29sdW1ucyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9TeW5jOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuU3luYyRTdGF0c0NvbHVtbnMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBQ0NPVU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBVVRIT1JJVFkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL1N5bmM7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1BY3RpdmVDb2x1bW5zICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5TeW5jJEFjdGl2ZUNvbHVtbnMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTVEFSVF9USU1FCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI1IG5hbWUgPUFjdGl2ZSApCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL1N5bmMkQWN0aXZlJFF1ZXJ5TWFwOyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9TeW5jOyApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5TeW5jJEFjdGl2ZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zLCBhbmRyb2lkLnByb3ZpZGVyLlN5bmMkU3RhdHNDb2x1bW5zLCBhbmRyb2lkLnByb3ZpZGVyLlN5bmMkQWN0aXZlQ29sdW1ucwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBDT05URU5UX1VSSQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvU3luYzsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPUhpc3RvcnlDb2x1bW5zICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5TeW5jJEhpc3RvcnlDb2x1bW5zIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRE9XTlNUUkVBTV9BQ1RJVklUWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRUxBUFNFRF9USU1FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBFVkVOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRVZFTlRfVElNRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTUVTRwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU09VUkNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTVEFUU19JRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVVBTVFJFQU1fQUNUSVZJVFkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL1N5bmM7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1IaXN0b3J5ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLlN5bmMkSGlzdG9yeSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zLCBhbmRyb2lkLnByb3ZpZGVyLlN5bmMkU3RhdHNDb2x1bW5zLCBhbmRyb2lkLnByb3ZpZGVyLlN5bmMkSGlzdG9yeUNvbHVtbnMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmkgQ09OVEVOVF9VUkkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfQVVUSEVOVElDQVRJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfQ09ORkxJQ1QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfSU8KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfUEFSU0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfU1lOQ19BTFJFQURZX0lOX1BST0dSRVNTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX1RPT19NQU5ZX0RFTEVUSU9OUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9UT09fTUFOWV9SRVRSSUVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZ1tdIEVWRU5UUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9TVEFSVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9TVE9QCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRklOSVNIRURfU0lOQ0VfV0hFUkVfQ0xBVVNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBNRVNHX0NBTkNFTEVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBNRVNHX1NVQ0NFU1MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gU09VUkNFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTT1VSQ0VfTE9DQUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU09VUkNFX1BPTEwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU09VUkNFX1NFUlZFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTT1VSQ0VfVVNFUgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQucHJvdmlkZXIuU3luYyQxKQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzTmV3ZXJTeW5jRmluaXNoZWQoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1sb25nKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgbWVzZ1RvU3RyaW5nKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciBxdWVyeSgKLWFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvU3luYyRQZW5kaW5nOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9UXVlcnlNYXAgKQotcHVibGljIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuU3luYyRQZW5kaW5nJFF1ZXJ5TWFwIGV4dGVuZHMgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRRdWVyeU1hcAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIKLWJvb2xlYW4KLWFuZHJvaWQub3MuSGFuZGxlcikKLQotcHVibGljIGJvb2xlYW4gaXNQZW5kaW5nKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI1IG5hbWUgPVBlbmRpbmcgKQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9TeW5jJFBlbmRpbmckUXVlcnlNYXA7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL1N5bmM7ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLlN5bmMkUGVuZGluZyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zLCBhbmRyb2lkLnByb3ZpZGVyLlN5bmMkU3RhdHNDb2x1bW5zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIENPTlRFTlRfVVJJCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9UXVlcnlNYXAgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvU3luYyRTZXR0aW5nczsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuU3luYyRTZXR0aW5ncyRRdWVyeU1hcCBleHRlbmRzIGFuZHJvaWQuY29udGVudC5Db250ZW50UXVlcnlNYXAKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyIG1Db250ZW50UmVzb2x2ZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1ib29sZWFuCi1hbmRyb2lkLm9zLkhhbmRsZXIpCi0KLXByaXZhdGUgYm9vbGVhbiBnZXRCb29sZWFuKAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotcHVibGljIGJvb2xlYW4gZ2V0TGlzdGVuRm9yTmV0d29ya1RpY2tsZXMoKQotCi1wdWJsaWMgYm9vbGVhbiBnZXRTeW5jUHJvdmlkZXJBdXRvbWF0aWNhbGx5KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0TGlzdGVuRm9yTmV0d29ya1RpY2tsZXMoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRTeW5jUHJvdmlkZXJBdXRvbWF0aWNhbGx5KAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9U2V0dGluZ3NDb2x1bW5zICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL1N5bmM7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5TeW5jJFNldHRpbmdzQ29sdW1ucyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEtFWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVkFMVUUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvU3luYyRTZXR0aW5ncyRRdWVyeU1hcDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNSBuYW1lID1TZXR0aW5ncyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9TeW5jOyApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5TeW5jJFNldHRpbmdzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQucHJvdmlkZXIuQmFzZUNvbHVtbnMsIGFuZHJvaWQucHJvdmlkZXIuU3luYyRTZXR0aW5nc0NvbHVtbnMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmkgQ09OVEVOVF9VUkkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNFVFRJTkdfTElTVEVOX0ZPUl9USUNLTEVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTRVRUSU5HX1NZTkNfUFJPVklERVJfUFJFRklYCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIHN0YXRpYyB2b2lkIHB1dEJvb2xlYW4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgc2V0TGlzdGVuRm9yTmV0d29ya1RpY2tsZXMoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1ib29sZWFuKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgc2V0U3luY1Byb3ZpZGVyQXV0b21hdGljYWxseSgKLWFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNSBuYW1lID1TdGF0cyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9TeW5jOyApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5TeW5jJFN0YXRzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQucHJvdmlkZXIuQmFzZUNvbHVtbnMsIGFuZHJvaWQucHJvdmlkZXIuU3luYyRTdGF0c0NvbHVtbnMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmkgQ09OVEVOVF9VUkkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gU1lOQ19TVEFUU19QUk9KRUNUSU9OCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9UXVlcnlNYXAgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvU3luYyRTdGF0dXM7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLlN5bmMkU3RhdHVzJFF1ZXJ5TWFwIGV4dGVuZHMgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRRdWVyeU1hcAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIKLWJvb2xlYW4KLWFuZHJvaWQub3MuSGFuZGxlcikKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzIGdldCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvU3luYzsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPVN0YXR1c0NvbHVtbnMgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLlN5bmMkU3RhdHVzQ29sdW1ucyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIExBU1RfRkFJTFVSRV9NRVNHCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMQVNUX0ZBSUxVUkVfU09VUkNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMQVNUX0ZBSUxVUkVfVElNRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTEFTVF9TVUNDRVNTX1NPVVJDRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTEFTVF9TVUNDRVNTX1RJTUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE5VTV9TT1VSQ0VfTE9DQUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE5VTV9TT1VSQ0VfUE9MTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTlVNX1NPVVJDRV9TRVJWRVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE5VTV9TT1VSQ0VfVVNFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTlVNX1NZTkNTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQRU5ESU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUT1RBTF9FTEFQU0VEX1RJTUUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvU3luYyRTdGF0dXMkUXVlcnlNYXA7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1TdGF0dXMgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvU3luYzsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuU3luYyRTdGF0dXMgZXh0ZW5kcyBhbmRyb2lkLnByb3ZpZGVyLlN5bmMkSGlzdG9yeSBpbXBsZW1lbnRzIGFuZHJvaWQucHJvdmlkZXIuU3luYyRTdGF0dXNDb2x1bW5zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIENPTlRFTlRfVVJJCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciBxdWVyeSgKLWFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9TeW5jJDE7TGFuZHJvaWQvcHJvdmlkZXIvU3luYyRTZXR0aW5ncztMYW5kcm9pZC9wcm92aWRlci9TeW5jJFNldHRpbmdzQ29sdW1ucztMYW5kcm9pZC9wcm92aWRlci9TeW5jJEFjdGl2ZTtMYW5kcm9pZC9wcm92aWRlci9TeW5jJEFjdGl2ZUNvbHVtbnM7TGFuZHJvaWQvcHJvdmlkZXIvU3luYyRQZW5kaW5nO0xhbmRyb2lkL3Byb3ZpZGVyL1N5bmMkU3RhdHVzO0xhbmRyb2lkL3Byb3ZpZGVyL1N5bmMkSGlzdG9yeTtMYW5kcm9pZC9wcm92aWRlci9TeW5jJFN0YXR1c0NvbHVtbnM7TGFuZHJvaWQvcHJvdmlkZXIvU3luYyRIaXN0b3J5Q29sdW1ucztMYW5kcm9pZC9wcm92aWRlci9TeW5jJFN0YXRzO0xhbmRyb2lkL3Byb3ZpZGVyL1N5bmMkU3RhdHNDb2x1bW5zOyApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5TeW5jIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBDT05URU5UX1VSSQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvVGVsZXBob255OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9QmFzZU1tc0NvbHVtbnMgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLlRlbGVwaG9ueSRCYXNlTW1zQ29sdW1ucyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBREFQVEFUSU9OX0FMTE9XRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFQUExJQ19JRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQVVYX0FQUExJQ19JRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQkNDCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDQU5DRUxfSUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENBTkNFTF9TVEFUVVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENDCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDT05URU5UX0NMQVNTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDT05URU5UX0xPQ0FUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDT05URU5UX1RZUEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERBVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFTElWRVJZX1JFUE9SVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVMSVZFUllfVElNRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVMSVZFUllfVElNRV9UT0tFTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRElTVFJJQlVUSU9OX0lORElDQVRPUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRFJNX0NPTlRFTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEVMRU1FTlRfREVTQ1JJUFRPUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRVhQSVJZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBGUk9NCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMSU1JVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTUJPWF9RVU9UQVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1CT1hfUVVPVEFTX1RPS0VOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBNQk9YX1RPVEFMUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTUJPWF9UT1RBTFNfVE9LRU4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1FU1NBR0VfQk9YCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfQk9YX0FMTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX0JPWF9EUkFGVFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9CT1hfSU5CT1gKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9CT1hfT1VUQk9YCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfQk9YX1NFTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1FU1NBR0VfQ0xBU1MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1FU1NBR0VfQ09VTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1FU1NBR0VfSUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1FU1NBR0VfU0laRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTUVTU0FHRV9UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBNTVNfVkVSU0lPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTU1fRkxBR1MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1NX0ZMQUdTX1RPS0VOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBNTV9TVEFURQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUFJFVklPVVNMWV9TRU5UX0JZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQUkVWSU9VU0xZX1NFTlRfREFURQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUFJJT1JJVFkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFFVT1RBUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUkVBRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUkVBRF9SRVBPUlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFJFQURfU1RBVFVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSRUNPTU1FTkRFRF9SRVRSSUVWQUxfTU9ERQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUkVDT01NRU5ERURfUkVUUklFVkFMX01PREVfVEVYVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUkVQTEFDRV9JRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUkVQTFlfQVBQTElDX0lECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSRVBMWV9DSEFSR0lORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUkVQTFlfQ0hBUkdJTkdfREVBRExJTkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFJFUExZX0NIQVJHSU5HX0RFQURMSU5FX1RPS0VOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSRVBMWV9DSEFSR0lOR19JRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUkVQTFlfQ0hBUkdJTkdfU0laRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUkVQT1JUX0FMTE9XRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFJFU1BPTlNFX1NUQVRVUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUkVTUE9OU0VfVEVYVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUkVUUklFVkVfU1RBVFVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSRVRSSUVWRV9URVhUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSRVRSSUVWRV9URVhUX0NIQVJTRVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNFTkRFUl9WSVNJQklMSVRZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTVEFSVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU1RBVFVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTVEFUVVNfVEVYVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU1RPUkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNUT1JFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU1RPUkVfU1RBVFVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTVE9SRV9TVEFUVVNfVEVYVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU1VCSkVDVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU1VCSkVDVF9DSEFSU0VUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUSFJFQURfSUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRPCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUT1RBTFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRSQU5TQUNUSU9OX0lECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9UZWxlcGhvbnk7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1DYW5vbmljYWxBZGRyZXNzZXNDb2x1bW5zICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5UZWxlcGhvbnkkQ2Fub25pY2FsQWRkcmVzc2VzQ29sdW1ucyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBRERSRVNTCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI1IG5hbWUgPUNhcnJpZXJzICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL1RlbGVwaG9ueTsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuVGVsZXBob255JENhcnJpZXJzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQucHJvdmlkZXIuQmFzZUNvbHVtbnMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFQTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBDT05URU5UX1VSSQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVGQVVMVF9TT1JUX09SREVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBNQ0MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1NU0MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1NU1BPUlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1NU1BST1hZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBNTkMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE5BTUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE5VTUVSSUMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBBU1NXT1JECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQT1JUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQUk9YWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0VSVkVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBVU0VSCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjUgbmFtZSA9SW50ZW50cyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9UZWxlcGhvbnk7ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLlRlbGVwaG9ueSRJbnRlbnRzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRVhUUkFfUExNTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRVhUUkFfU0hPV19QTE1OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBFWFRSQV9TSE9XX1NQTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRVhUUkFfU1BOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTRUNSRVRfQ09ERV9BQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNQTl9TVFJJTkdTX1VQREFURURfQUNUSU9OCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNSBuYW1lID1BZGRyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL1RlbGVwaG9ueSRNbXM7ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLlRlbGVwaG9ueSRNbXMkQWRkciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBRERSRVNTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDSEFSU0VUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDT05UQUNUX0lECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBNU0dfSUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRZUEUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjUgbmFtZSA9RHJhZnQgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvVGVsZXBob255JE1tczsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuVGVsZXBob255JE1tcyREcmFmdCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnByb3ZpZGVyLlRlbGVwaG9ueSRCYXNlTW1zQ29sdW1ucwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBDT05URU5UX1VSSQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVGQVVMVF9TT1JUX09SREVSCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL1RlbGVwaG9ueSRNbXM7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjUgbmFtZSA9SW5ib3ggKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuVGVsZXBob255JE1tcyRJbmJveCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnByb3ZpZGVyLlRlbGVwaG9ueSRCYXNlTW1zQ29sdW1ucwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBDT05URU5UX1VSSQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVGQVVMVF9TT1JUX09SREVSCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjUgbmFtZSA9SW50ZW50cyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9UZWxlcGhvbnkkTW1zOyApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5UZWxlcGhvbnkkTW1zJEludGVudHMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDT05URU5UX0NIQU5HRURfQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERUxFVEVEX0NPTlRFTlRTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBFWFRSQV9CQ0MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEVYVFJBX0NDCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBFWFRSQV9DT05URU5UUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRVhUUkFfU1VCSkVDVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRVhUUkFfVFlQRVMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9UZWxlcGhvbnkkTW1zOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI1IG5hbWUgPU91dGJveCApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5UZWxlcGhvbnkkTW1zJE91dGJveCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnByb3ZpZGVyLlRlbGVwaG9ueSRCYXNlTW1zQ29sdW1ucwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBDT05URU5UX1VSSQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVGQVVMVF9TT1JUX09SREVSCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjUgbmFtZSA9UGFydCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9UZWxlcGhvbnkkTW1zOyApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5UZWxlcGhvbnkkTW1zJFBhcnQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5wcm92aWRlci5CYXNlQ29sdW1ucwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ0hBUlNFVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ09OVEVOVF9ESVNQT1NJVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ09OVEVOVF9JRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ09OVEVOVF9MT0NBVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ09OVEVOVF9UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDVF9TVEFSVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ1RfVFlQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRklMRU5BTUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1TR19JRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTkFNRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0VRCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBfREFUQQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvVGVsZXBob255JE1tczsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNSBuYW1lID1SYXRlICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLlRlbGVwaG9ueSRNbXMkUmF0ZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmkgQ09OVEVOVF9VUkkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNFTlRfVElNRQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9UZWxlcGhvbnkkTW1zOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI1IG5hbWUgPVNlbnQgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuVGVsZXBob255JE1tcyRTZW50IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQucHJvdmlkZXIuVGVsZXBob255JEJhc2VNbXNDb2x1bW5zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIENPTlRFTlRfVVJJCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERUZBVUxUX1NPUlRfT1JERVIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9UZWxlcGhvbnkkTW1zJEludGVudHM7TGFuZHJvaWQvcHJvdmlkZXIvVGVsZXBob255JE1tcyRSYXRlO0xhbmRyb2lkL3Byb3ZpZGVyL1RlbGVwaG9ueSRNbXMkUGFydDtMYW5kcm9pZC9wcm92aWRlci9UZWxlcGhvbnkkTW1zJEFkZHI7TGFuZHJvaWQvcHJvdmlkZXIvVGVsZXBob255JE1tcyRPdXRib3g7TGFuZHJvaWQvcHJvdmlkZXIvVGVsZXBob255JE1tcyREcmFmdDtMYW5kcm9pZC9wcm92aWRlci9UZWxlcGhvbnkkTW1zJFNlbnQ7TGFuZHJvaWQvcHJvdmlkZXIvVGVsZXBob255JE1tcyRJbmJveDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvVGVsZXBob255OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI1IG5hbWUgPU1tcyApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5UZWxlcGhvbnkkTW1zIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQucHJvdmlkZXIuVGVsZXBob255JEJhc2VNbXNDb2x1bW5zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIENPTlRFTlRfVVJJCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERUZBVUxUX1NPUlRfT1JERVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwucmVnZXguUGF0dGVybiBOQU1FX0FERFJfRU1BSUxfUEFUVEVSTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudXRpbC5yZWdleC5QYXR0ZXJuIFFVT1RFRF9TVFJJTkdfUEFUVEVSTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBSRVBPUlRfUkVRVUVTVF9VUkkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmkgUkVQT1JUX1NUQVRVU19VUkkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBleHRyYWN0QWRkclNwZWMoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgZ2V0TWVzc2FnZUJveE5hbWUoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0VtYWlsQWRkcmVzcygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IgcXVlcnkoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IgcXVlcnkoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1qYXZhLmxhbmcuU3RyaW5nW10KLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvVGVsZXBob255JE1tc1NtczsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNSBuYW1lID1QZW5kaW5nTWVzc2FnZXMgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuVGVsZXBob255JE1tc1NtcyRQZW5kaW5nTWVzc2FnZXMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5wcm92aWRlci5CYXNlQ29sdW1ucwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBDT05URU5UX1VSSQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRFVFX1RJTUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEVSUk9SX0NPREUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEVSUk9SX1RZUEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIExBU1RfVFJZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBNU0dfSUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1TR19UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQUk9UT19UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSRVRSWV9JTkRFWAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL1RlbGVwaG9ueSRNbXNTbXMkUGVuZGluZ01lc3NhZ2VzOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI1IG5hbWUgPU1tc1NtcyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9UZWxlcGhvbnk7ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLlRlbGVwaG9ueSRNbXNTbXMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5wcm92aWRlci5CYXNlQ29sdW1ucwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBDT05URU5UX0NPTlZFUlNBVElPTlNfVVJJCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIENPTlRFTlRfRFJBRlRfVVJJCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIENPTlRFTlRfRklMVEVSX0JZUEhPTkVfVVJJCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIENPTlRFTlRfVU5ERUxJVkVSRURfVVJJCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIENPTlRFTlRfVVJJCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUl9UWVBFX0dFTkVSSUMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJSX1RZUEVfR0VORVJJQ19QRVJNQU5FTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJSX1RZUEVfTU1TX1BST1RPX1BFUk1BTkVOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJfVFlQRV9NTVNfUFJPVE9fVFJBTlNJRU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUl9UWVBFX1NNU19QUk9UT19QRVJNQU5FTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJSX1RZUEVfU01TX1BST1RPX1RSQU5TSUVOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJfVFlQRV9UUkFOU1BPUlRfRkFJTFVSRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNTVNfUFJPVE8KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9fRVJST1IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU01TX1BST1RPCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUWVBFX0RJU0NSSU1JTkFUT1JfQ09MVU1OCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL1RlbGVwaG9ueTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPVRleHRCYXNlZFNtc0NvbHVtbnMgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLlRlbGVwaG9ueSRUZXh0QmFzZWRTbXNDb2x1bW5zIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUREUkVTUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQk9EWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREFURQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1RZUEVfQUxMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfVFlQRV9EUkFGVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1RZUEVfRkFJTEVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfVFlQRV9JTkJPWAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1RZUEVfT1VUQk9YCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfVFlQRV9RVUVVRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9UWVBFX1NFTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBFUlNPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUEVSU09OX0lECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQUk9UT0NPTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUkVBRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUkVQTFlfUEFUSF9QUkVTRU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTRVJWSUNFX0NFTlRFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU1RBVFVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19DT01QTEVURQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfRkFJTEVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19OT05FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19QRU5ESU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTVUJKRUNUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUSFJFQURfSUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRZUEUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjUgbmFtZSA9Q29udmVyc2F0aW9ucyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9UZWxlcGhvbnkkU21zOyApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5UZWxlcGhvbnkkU21zJENvbnZlcnNhdGlvbnMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5wcm92aWRlci5CYXNlQ29sdW1ucywgYW5kcm9pZC5wcm92aWRlci5UZWxlcGhvbnkkVGV4dEJhc2VkU21zQ29sdW1ucwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBDT05URU5UX1VSSQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVGQVVMVF9TT1JUX09SREVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBNRVNTQUdFX0NPVU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTTklQUEVUCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjUgbmFtZSA9RHJhZnQgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvVGVsZXBob255JFNtczsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuVGVsZXBob255JFNtcyREcmFmdCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zLCBhbmRyb2lkLnByb3ZpZGVyLlRlbGVwaG9ueSRUZXh0QmFzZWRTbXNDb2x1bW5zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIENPTlRFTlRfVVJJCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERUZBVUxUX1NPUlRfT1JERVIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5uZXQuVXJpIGFkZE1lc3NhZ2UoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuTG9uZykKLQotcHVibGljIHN0YXRpYyBib29sZWFuIHNhdmVNZXNzYWdlKAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcgotYW5kcm9pZC5uZXQuVXJpCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjUgbmFtZSA9SW5ib3ggKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvVGVsZXBob255JFNtczsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuVGVsZXBob255JFNtcyRJbmJveCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zLCBhbmRyb2lkLnByb3ZpZGVyLlRlbGVwaG9ueSRUZXh0QmFzZWRTbXNDb2x1bW5zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIENPTlRFTlRfVVJJCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERUZBVUxUX1NPUlRfT1JERVIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5uZXQuVXJpIGFkZE1lc3NhZ2UoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuTG9uZwotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9UZWxlcGhvbnkkU21zOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI1IG5hbWUgPUludGVudHMgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuVGVsZXBob255JFNtcyRJbnRlbnRzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREFUQV9TTVNfUkVDRUlWRURfQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTSU1fRlVMTF9BQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNNU19SRUNFSVZFRF9BQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFdBUF9QVVNIX1JFQ0VJVkVEX0FDVElPTgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC50ZWxlcGhvbnkuZ3NtLlNtc01lc3NhZ2VbXSBnZXRNZXNzYWdlc0Zyb21JbnRlbnQoCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL1RlbGVwaG9ueSRTbXM7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjUgbmFtZSA9T3V0Ym94ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLlRlbGVwaG9ueSRTbXMkT3V0Ym94IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQucHJvdmlkZXIuQmFzZUNvbHVtbnMsIGFuZHJvaWQucHJvdmlkZXIuVGVsZXBob255JFRleHRCYXNlZFNtc0NvbHVtbnMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmkgQ09OVEVOVF9VUkkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFRkFVTFRfU09SVF9PUkRFUgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLm5ldC5VcmkgYWRkTWVzc2FnZSgKLWFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5Mb25nCi1ib29sZWFuCi1sb25nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjUgbmFtZSA9U2VudCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9UZWxlcGhvbnkkU21zOyApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC5wcm92aWRlci5UZWxlcGhvbnkkU21zJFNlbnQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5wcm92aWRlci5CYXNlQ29sdW1ucywgYW5kcm9pZC5wcm92aWRlci5UZWxlcGhvbnkkVGV4dEJhc2VkU21zQ29sdW1ucwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBDT05URU5UX1VSSQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVGQVVMVF9TT1JUX09SREVSCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQubmV0LlVyaSBhZGRNZXNzYWdlKAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcgotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLkxvbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9UZWxlcGhvbnkkU21zJEludGVudHM7TGFuZHJvaWQvcHJvdmlkZXIvVGVsZXBob255JFNtcyRDb252ZXJzYXRpb25zO0xhbmRyb2lkL3Byb3ZpZGVyL1RlbGVwaG9ueSRTbXMkT3V0Ym94O0xhbmRyb2lkL3Byb3ZpZGVyL1RlbGVwaG9ueSRTbXMkRHJhZnQ7TGFuZHJvaWQvcHJvdmlkZXIvVGVsZXBob255JFNtcyRTZW50O0xhbmRyb2lkL3Byb3ZpZGVyL1RlbGVwaG9ueSRTbXMkSW5ib3g7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjUgbmFtZSA9U21zICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL1RlbGVwaG9ueTsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuVGVsZXBob255JFNtcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zLCBhbmRyb2lkLnByb3ZpZGVyLlRlbGVwaG9ueSRUZXh0QmFzZWRTbXNDb2x1bW5zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIENPTlRFTlRfVVJJCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERUZBVUxUX1NPUlRfT1JERVIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5uZXQuVXJpIGFkZE1lc3NhZ2VUb1VyaSgKLWFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIKLWFuZHJvaWQubmV0LlVyaQotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLkxvbmcKLWJvb2xlYW4KLWJvb2xlYW4pCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5uZXQuVXJpIGFkZE1lc3NhZ2VUb1VyaSgKLWFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIKLWFuZHJvaWQubmV0LlVyaQotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLkxvbmcKLWJvb2xlYW4KLWJvb2xlYW4KLWxvbmcpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc091dGdvaW5nRm9sZGVyKAotaW50KQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gbW92ZU1lc3NhZ2VUb0ZvbGRlcigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLm5ldC5VcmkKLWludCkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciBxdWVyeSgKLWFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciBxdWVyeSgKLWFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIKLWphdmEubGFuZy5TdHJpbmdbXQotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9wcm92aWRlci9UZWxlcGhvbnk7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1UaHJlYWRzQ29sdW1ucyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQucHJvdmlkZXIuVGVsZXBob255JFRocmVhZHNDb2x1bW5zIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQucHJvdmlkZXIuQmFzZUNvbHVtbnMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERBVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEVSUk9SCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBNRVNTQUdFX0NPVU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSRUFECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSRUNJUElFTlRfSURTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTTklQUEVUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTTklQUEVUX0NIQVJTRVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRZUEUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3Byb3ZpZGVyL1RlbGVwaG9ueTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNSBuYW1lID1UaHJlYWRzICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLlRlbGVwaG9ueSRUaHJlYWRzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQucHJvdmlkZXIuVGVsZXBob255JFRocmVhZHNDb2x1bW5zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJST0FEQ0FTVF9USFJFQUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NTU9OX1RIUkVBRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBDT05URU5UX1VSSQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gSURfUFJPSkVDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBPQlNPTEVURV9USFJFQURTX1VSSQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNUQU5EQVJEX0VOQ09ESU5HCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBUSFJFQURfSURfQ09OVEVOVF9VUkkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGxvbmcgZ2V0T3JDcmVhdGVUaHJlYWRJZCgKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMYW5kcm9pZC9jb250ZW50L0NvbnRleHQ7TGphdmEvdXRpbC9TZXQ8TGphdmEvbGFuZy9TdHJpbmc7PjspSiApCi1wdWJsaWMgc3RhdGljIGxvbmcgZ2V0T3JDcmVhdGVUaHJlYWRJZCgKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1qYXZhLnV0aWwuU2V0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvcHJvdmlkZXIvVGVsZXBob255JEludGVudHM7TGFuZHJvaWQvcHJvdmlkZXIvVGVsZXBob255JENhcnJpZXJzO0xhbmRyb2lkL3Byb3ZpZGVyL1RlbGVwaG9ueSRNbXNTbXM7TGFuZHJvaWQvcHJvdmlkZXIvVGVsZXBob255JE1tcztMYW5kcm9pZC9wcm92aWRlci9UZWxlcGhvbnkkVGhyZWFkcztMYW5kcm9pZC9wcm92aWRlci9UZWxlcGhvbnkkVGhyZWFkc0NvbHVtbnM7TGFuZHJvaWQvcHJvdmlkZXIvVGVsZXBob255JENhbm9uaWNhbEFkZHJlc3Nlc0NvbHVtbnM7TGFuZHJvaWQvcHJvdmlkZXIvVGVsZXBob255JEJhc2VNbXNDb2x1bW5zO0xhbmRyb2lkL3Byb3ZpZGVyL1RlbGVwaG9ueSRTbXM7TGFuZHJvaWQvcHJvdmlkZXIvVGVsZXBob255JFRleHRCYXNlZFNtc0NvbHVtbnM7ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLnByb3ZpZGVyLlRlbGVwaG9ueSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIExPQ0FMX0xPR1YKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotIGNsYXNzIGFuZHJvaWQuc2F4LkJhZFhtbEV4Y2VwdGlvbiBleHRlbmRzIG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotb3JnLnhtbC5zYXguTG9jYXRvcikKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TWVzc2FnZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5zYXguRWxlbWVudCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGFuZHJvaWQuc2F4LkNoaWxkcmVuIGNoaWxkcmVuCi0KLWZpbmFsIGludCBkZXB0aAotCi0gYW5kcm9pZC5zYXguRW5kRWxlbWVudExpc3RlbmVyIGVuZEVsZW1lbnRMaXN0ZW5lcgotCi0gYW5kcm9pZC5zYXguRW5kVGV4dEVsZW1lbnRMaXN0ZW5lciBlbmRUZXh0RWxlbWVudExpc3RlbmVyCi0KLWZpbmFsIGphdmEubGFuZy5TdHJpbmcgbG9jYWxOYW1lCi0KLWZpbmFsIGFuZHJvaWQuc2F4LkVsZW1lbnQgcGFyZW50Ci1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9BcnJheUxpc3Q8TGFuZHJvaWQvc2F4L0VsZW1lbnQ7PjsgKQotIGphdmEudXRpbC5BcnJheUxpc3QgcmVxdWlyZWRDaGlsZGVuCi0KLSBhbmRyb2lkLnNheC5TdGFydEVsZW1lbnRMaXN0ZW5lciBzdGFydEVsZW1lbnRMaXN0ZW5lcgotCi1maW5hbCBqYXZhLmxhbmcuU3RyaW5nIHVyaQotCi0gYm9vbGVhbiB2aXNpdGVkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5zYXguRWxlbWVudAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1zdGF0aWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWFBhcnNlRXhjZXB0aW9uOyApCi0gdm9pZCBjaGVja1JlcXVpcmVkQ2hpbGRyZW4oCi1vcmcueG1sLnNheC5Mb2NhdG9yKQotCi1wdWJsaWMgYW5kcm9pZC5zYXguRWxlbWVudCBnZXRDaGlsZCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhbmRyb2lkLnNheC5FbGVtZW50IGdldENoaWxkKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFuZHJvaWQuc2F4LkVsZW1lbnQgcmVxdWlyZUNoaWxkKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFuZHJvaWQuc2F4LkVsZW1lbnQgcmVxdWlyZUNoaWxkKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotIHZvaWQgcmVzZXRSZXF1aXJlZENoaWxkcmVuKCkKLQotcHVibGljIHZvaWQgc2V0RWxlbWVudExpc3RlbmVyKAotYW5kcm9pZC5zYXguRWxlbWVudExpc3RlbmVyKQotCi1wdWJsaWMgdm9pZCBzZXRFbmRFbGVtZW50TGlzdGVuZXIoCi1hbmRyb2lkLnNheC5FbmRFbGVtZW50TGlzdGVuZXIpCi0KLXB1YmxpYyB2b2lkIHNldEVuZFRleHRFbGVtZW50TGlzdGVuZXIoCi1hbmRyb2lkLnNheC5FbmRUZXh0RWxlbWVudExpc3RlbmVyKQotCi1wdWJsaWMgdm9pZCBzZXRTdGFydEVsZW1lbnRMaXN0ZW5lcigKLWFuZHJvaWQuc2F4LlN0YXJ0RWxlbWVudExpc3RlbmVyKQotCi1wdWJsaWMgdm9pZCBzZXRUZXh0RWxlbWVudExpc3RlbmVyKAotYW5kcm9pZC5zYXguVGV4dEVsZW1lbnRMaXN0ZW5lcikKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1DaGlsZCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9zYXgvQ2hpbGRyZW47ICkKLSBjbGFzcyBhbmRyb2lkLnNheC5DaGlsZHJlbiRDaGlsZCBleHRlbmRzIGFuZHJvaWQuc2F4LkVsZW1lbnQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgaW50IGhhc2gKLQotIGFuZHJvaWQuc2F4LkNoaWxkcmVuJENoaWxkIG5leHQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLnNheC5FbGVtZW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3NheC9DaGlsZHJlbiRDaGlsZDsgKQotIGNsYXNzIGFuZHJvaWQuc2F4LkNoaWxkcmVuIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gYW5kcm9pZC5zYXguQ2hpbGRyZW4kQ2hpbGRbXSBjaGlsZHJlbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLSBhbmRyb2lkLnNheC5FbGVtZW50IGdldCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLSBhbmRyb2lkLnNheC5FbGVtZW50IGdldE9yQ3JlYXRlKAotYW5kcm9pZC5zYXguRWxlbWVudAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5zYXguRW5kVGV4dEVsZW1lbnRMaXN0ZW5lciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBlbmQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1IYW5kbGVyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3NheC9Sb290RWxlbWVudDsgKQotIGNsYXNzIGFuZHJvaWQuc2F4LlJvb3RFbGVtZW50JEhhbmRsZXIgZXh0ZW5kcyBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlciBib2R5QnVpbGRlcgotCi0gYW5kcm9pZC5zYXguRWxlbWVudCBjdXJyZW50Ci0KLSBpbnQgZGVwdGgKLQotIG9yZy54bWwuc2F4LkxvY2F0b3IgbG9jYXRvcgotCi1maW5hbCBhbmRyb2lkLnNheC5Sb290RWxlbWVudCB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLnNheC5Sb290RWxlbWVudCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKAotY2hhcltdCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBlbmRFbGVtZW50KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0RG9jdW1lbnRMb2NhdG9yKAotb3JnLnhtbC5zYXguTG9jYXRvcikKLQotIHZvaWQgc3RhcnQoCi1hbmRyb2lkLnNheC5FbGVtZW50Ci1vcmcueG1sLnNheC5BdHRyaWJ1dGVzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLW9yZy54bWwuc2F4LkF0dHJpYnV0ZXMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotIHZvaWQgc3RhcnRSb290KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotb3JnLnhtbC5zYXguQXR0cmlidXRlcykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3NheC9Sb290RWxlbWVudCRIYW5kbGVyOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5zYXguUm9vdEVsZW1lbnQgZXh0ZW5kcyBhbmRyb2lkLnNheC5FbGVtZW50Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQuc2F4LlJvb3RFbGVtZW50JEhhbmRsZXIgaGFuZGxlcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciBnZXRDb250ZW50SGFuZGxlcigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQuc2F4LlRleHRFbGVtZW50TGlzdGVuZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5zYXguU3RhcnRFbGVtZW50TGlzdGVuZXIsIGFuZHJvaWQuc2F4LkVuZFRleHRFbGVtZW50TGlzdGVuZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGFuZHJvaWQuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBhbmRyb2lkLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3QgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYWJzdHJhY3QgYnl0ZVtdIGRpZ2VzdCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBieXRlW10gZGlnZXN0KAotYnl0ZVtdKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB1cGRhdGUoCi1ieXRlW10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5zZWN1cml0eS5NZDVNZXNzYWdlRGlnZXN0IGV4dGVuZHMgYW5kcm9pZC5zZWN1cml0eS5NZXNzYWdlRGlnZXN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgaW50IG1OYXRpdmVNZDVDb250ZXh0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBpbml0KCkKLQotcHVibGljIG5hdGl2ZSBieXRlW10gZGlnZXN0KCkKLQotcHVibGljIGJ5dGVbXSBkaWdlc3QoCi1ieXRlW10pCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCByZXNldCgpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCB1cGRhdGUoCi1ieXRlW10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5zZWN1cml0eS5TaGExTWVzc2FnZURpZ2VzdCBleHRlbmRzIGFuZHJvaWQuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGludCBtTmF0aXZlU2hhMUNvbnRleHQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIGluaXQoKQotCi1wdWJsaWMgbmF0aXZlIGJ5dGVbXSBkaWdlc3QoKQotCi1wdWJsaWMgYnl0ZVtdIGRpZ2VzdCgKLWJ5dGVbXSkKLQotcHVibGljIG5hdGl2ZSB2b2lkIHJlc2V0KCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIHVwZGF0ZSgKLWJ5dGVbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9zZXJ2ZXIvQmx1ZXRvb3RoRGV2aWNlU2VydmljZTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotIGNsYXNzIGFuZHJvaWQuc2VydmVyLkJsdWV0b290aERldmljZVNlcnZpY2UkMSBleHRlbmRzIGFuZHJvaWQub3MuSGFuZGxlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLnNlcnZlci5CbHVldG9vdGhEZXZpY2VTZXJ2aWNlIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQuc2VydmVyLkJsdWV0b290aERldmljZVNlcnZpY2UpCi0KLXB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvc2VydmVyL0JsdWV0b290aERldmljZVNlcnZpY2U7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLSBjbGFzcyBhbmRyb2lkLnNlcnZlci5CbHVldG9vdGhEZXZpY2VTZXJ2aWNlJDIgZXh0ZW5kcyBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC5zZXJ2ZXIuQmx1ZXRvb3RoRGV2aWNlU2VydmljZSB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLnNlcnZlci5CbHVldG9vdGhEZXZpY2VTZXJ2aWNlKQotCi1wdWJsaWMgdm9pZCBvblJlY2VpdmUoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC5jb250ZW50LkludGVudCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTIgbmFtZSA9RW5hYmxlVGhyZWFkICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3NlcnZlci9CbHVldG9vdGhEZXZpY2VTZXJ2aWNlOyApCi0gY2xhc3MgYW5kcm9pZC5zZXJ2ZXIuQmx1ZXRvb3RoRGV2aWNlU2VydmljZSRFbmFibGVUaHJlYWQgZXh0ZW5kcyBqYXZhLmxhbmcuVGhyZWFkCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5ibHVldG9vdGguSUJsdWV0b290aERldmljZUNhbGxiYWNrIG1FbmFibGVDYWxsYmFjawotCi1maW5hbCBhbmRyb2lkLnNlcnZlci5CbHVldG9vdGhEZXZpY2VTZXJ2aWNlIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuc2VydmVyLkJsdWV0b290aERldmljZVNlcnZpY2UKLWFuZHJvaWQuYmx1ZXRvb3RoLklCbHVldG9vdGhEZXZpY2VDYWxsYmFjaykKLQotcHVibGljIHZvaWQgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3NlcnZlci9CbHVldG9vdGhEZXZpY2VTZXJ2aWNlJEVuYWJsZVRocmVhZDsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQuc2VydmVyLkJsdWV0b290aERldmljZVNlcnZpY2UgZXh0ZW5kcyBhbmRyb2lkLmJsdWV0b290aC5JQmx1ZXRvb3RoRGV2aWNlJFN0dWIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBCTFVFVE9PVEgKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBCTFVFVE9PVEhfQURNSU4KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBESVNBQkxFX0VTQ09fUEFUSAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX09VVFNUQU5ESU5HX0FTWU5DCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRUdJU1RFUl9TRFBfUkVDT1JEUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRBRwotCi1wcml2YXRlIGFuZHJvaWQuY29udGVudC5Db250ZXh0IG1Db250ZXh0Ci0KLXByaXZhdGUgYW5kcm9pZC5zZXJ2ZXIuQmx1ZXRvb3RoRGV2aWNlU2VydmljZSRFbmFibGVUaHJlYWQgbUVuYWJsZVRocmVhZAotCi1wcml2YXRlIGFuZHJvaWQuc2VydmVyLkJsdWV0b290aEV2ZW50TG9vcCBtRXZlbnRMb29wCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5vcy5IYW5kbGVyIG1IYW5kbGVyCi0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlciBtSW50ZW50RmlsdGVyCi0KLXByaXZhdGUgYm9vbGVhbiBtSXNBaXJwbGFuZVNlbnNpdGl2ZQotCi1wcml2YXRlIGJvb2xlYW4gbUlzRGlzY292ZXJpbmcKLQotcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIG1Jc0VuYWJsZWQKLQotcHJpdmF0ZSBpbnQgbU5hdGl2ZURhdGEKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXIgbVJlY2VpdmVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotc3RhdGljIGludCBhY2Nlc3MkMDAwKAotYW5kcm9pZC5zZXJ2ZXIuQmx1ZXRvb3RoRGV2aWNlU2VydmljZSkKLQotc3RhdGljIGFuZHJvaWQuc2VydmVyLkJsdWV0b290aEV2ZW50TG9vcCBhY2Nlc3MkMTAwKAotYW5kcm9pZC5zZXJ2ZXIuQmx1ZXRvb3RoRGV2aWNlU2VydmljZSkKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDIwMigKLWFuZHJvaWQuc2VydmVyLkJsdWV0b290aERldmljZVNlcnZpY2UKLWJvb2xlYW4pCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQzMDIoCi1hbmRyb2lkLnNlcnZlci5CbHVldG9vdGhEZXZpY2VTZXJ2aWNlCi1ib29sZWFuKQotCi1zdGF0aWMgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgYWNjZXNzJDQwMCgKLWFuZHJvaWQuc2VydmVyLkJsdWV0b290aERldmljZVNlcnZpY2UpCi0KLXN0YXRpYyBhbmRyb2lkLm9zLkhhbmRsZXIgYWNjZXNzJDUwMCgKLWFuZHJvaWQuc2VydmVyLkJsdWV0b290aERldmljZVNlcnZpY2UpCi0KLXN0YXRpYyBhbmRyb2lkLnNlcnZlci5CbHVldG9vdGhEZXZpY2VTZXJ2aWNlJEVuYWJsZVRocmVhZCBhY2Nlc3MkNjAyKAotYW5kcm9pZC5zZXJ2ZXIuQmx1ZXRvb3RoRGV2aWNlU2VydmljZQotYW5kcm9pZC5zZXJ2ZXIuQmx1ZXRvb3RoRGV2aWNlU2VydmljZSRFbmFibGVUaHJlYWQpCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQ3MDAoCi1hbmRyb2lkLnNlcnZlci5CbHVldG9vdGhEZXZpY2VTZXJ2aWNlKQotCi1wcml2YXRlIG5hdGl2ZSBib29sZWFuIGNhbmNlbEJvbmRpbmdQcm9jZXNzTmF0aXZlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBjYW5jZWxEaXNjb3ZlcnlOYXRpdmUoKQotCi1wcml2YXRlIG5hdGl2ZSBib29sZWFuIGNhbmNlbFBpbk5hdGl2ZSgKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHJpdmF0ZSB2b2lkIGNoZWNrUGVybWlzc2lvbkJsdWV0b290aCgpCi0KLXByaXZhdGUgdm9pZCBjaGVja1Blcm1pc3Npb25CbHVldG9vdGhBZG1pbigpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIGNsYXNzSW5pdE5hdGl2ZSgpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgY2xlYW51cE5hdGl2ZURhdGFOYXRpdmUoKQotCi1wcml2YXRlIG5hdGl2ZSBib29sZWFuIGNsZWFyUmVtb3RlQWxpYXNOYXRpdmUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIG5hdGl2ZSBib29sZWFuIGNyZWF0ZUJvbmRpbmdOYXRpdmUoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgZGlzYWJsZUVzY28oKQotCi1wcml2YXRlIG5hdGl2ZSBpbnQgZGlzYWJsZU5hdGl2ZSgpCi0KLXByaXZhdGUgbmF0aXZlIGJvb2xlYW4gZGlzY29ubmVjdFJlbW90ZURldmljZU5hdGl2ZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgbmF0aXZlIGludCBlbmFibGVOYXRpdmUoKQotCi1wcml2YXRlIG5hdGl2ZSBqYXZhLmxhbmcuU3RyaW5nIGdldEFkZHJlc3NOYXRpdmUoKQotCi1wcml2YXRlIG5hdGl2ZSBqYXZhLmxhbmcuU3RyaW5nIGdldENvbXBhbnlOYXRpdmUoKQotCi1wcml2YXRlIG5hdGl2ZSBpbnQgZ2V0RGlzY292ZXJhYmxlVGltZW91dE5hdGl2ZSgpCi0KLXByaXZhdGUgbmF0aXZlIGphdmEubGFuZy5TdHJpbmcgZ2V0TWFqb3JDbGFzc05hdGl2ZSgpCi0KLXByaXZhdGUgbmF0aXZlIGphdmEubGFuZy5TdHJpbmcgZ2V0TWFudWZhY3R1cmVyTmF0aXZlKCkKLQotcHJpdmF0ZSBuYXRpdmUgamF2YS5sYW5nLlN0cmluZyBnZXRNaW5vckNsYXNzTmF0aXZlKCkKLQotcHJpdmF0ZSBuYXRpdmUgamF2YS5sYW5nLlN0cmluZyBnZXRNb2RlTmF0aXZlKCkKLQotcHJpdmF0ZSBuYXRpdmUgamF2YS5sYW5nLlN0cmluZyBnZXROYW1lTmF0aXZlKCkKLQotcHJpdmF0ZSBuYXRpdmUgamF2YS5sYW5nLlN0cmluZyBnZXRSZW1vdGVBbGlhc05hdGl2ZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgbmF0aXZlIGludCBnZXRSZW1vdGVDbGFzc05hdGl2ZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgbmF0aXZlIGphdmEubGFuZy5TdHJpbmcgZ2V0UmVtb3RlQ29tcGFueU5hdGl2ZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgbmF0aXZlIGJ5dGVbXSBnZXRSZW1vdGVGZWF0dXJlc05hdGl2ZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgbmF0aXZlIGphdmEubGFuZy5TdHJpbmcgZ2V0UmVtb3RlTWFqb3JDbGFzc05hdGl2ZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgbmF0aXZlIGphdmEubGFuZy5TdHJpbmcgZ2V0UmVtb3RlTWFudWZhY3R1cmVyTmF0aXZlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBuYXRpdmUgamF2YS5sYW5nLlN0cmluZyBnZXRSZW1vdGVNaW5vckNsYXNzTmF0aXZlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBuYXRpdmUgamF2YS5sYW5nLlN0cmluZyBnZXRSZW1vdGVOYW1lTmF0aXZlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBuYXRpdmUgamF2YS5sYW5nLlN0cmluZyBnZXRSZW1vdGVSZXZpc2lvbk5hdGl2ZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgbmF0aXZlIGJvb2xlYW4gZ2V0UmVtb3RlU2VydmljZUNoYW5uZWxOYXRpdmUoCi1qYXZhLmxhbmcuU3RyaW5nCi1zaG9ydCkKLQotcHJpdmF0ZSBuYXRpdmUgamF2YS5sYW5nLlN0cmluZ1tdIGdldFJlbW90ZVNlcnZpY2VDbGFzc2VzTmF0aXZlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBuYXRpdmUgaW50W10gZ2V0UmVtb3RlU2VydmljZUhhbmRsZXNOYXRpdmUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIG5hdGl2ZSBieXRlW10gZ2V0UmVtb3RlU2VydmljZVJlY29yZE5hdGl2ZSgKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHJpdmF0ZSBuYXRpdmUgamF2YS5sYW5nLlN0cmluZyBnZXRSZW1vdGVWZXJzaW9uTmF0aXZlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBuYXRpdmUgamF2YS5sYW5nLlN0cmluZyBnZXRSZXZpc2lvbk5hdGl2ZSgpCi0KLXByaXZhdGUgbmF0aXZlIGphdmEubGFuZy5TdHJpbmcgZ2V0VmVyc2lvbk5hdGl2ZSgpCi0KLXByaXZhdGUgbmF0aXZlIGJvb2xlYW4gaGFzQm9uZGluZ05hdGl2ZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgaW5pdGlhbGl6ZU5hdGl2ZURhdGFOYXRpdmUoKQotCi1wcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNBaXJwbGFuZU1vZGVPbigpCi0KLXByaXZhdGUgbmF0aXZlIGJvb2xlYW4gaXNDb25uZWN0YWJsZU5hdGl2ZSgpCi0KLXByaXZhdGUgbmF0aXZlIGJvb2xlYW4gaXNDb25uZWN0ZWROYXRpdmUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIG5hdGl2ZSBib29sZWFuIGlzRGlzY292ZXJhYmxlTmF0aXZlKCkKLQotcHJpdmF0ZSBuYXRpdmUgaW50IGlzRW5hYmxlZE5hdGl2ZSgpCi0KLXByaXZhdGUgbmF0aXZlIGJvb2xlYW4gaXNQZXJpb2RpY0Rpc2NvdmVyeU5hdGl2ZSgpCi0KLXByaXZhdGUgbmF0aXZlIGphdmEubGFuZy5TdHJpbmcgbGFzdFNlZW5OYXRpdmUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIG5hdGl2ZSBqYXZhLmxhbmcuU3RyaW5nIGxhc3RVc2VkTmF0aXZlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBuYXRpdmUgamF2YS5sYW5nLlN0cmluZ1tdIGxpc3RCb25kaW5nc05hdGl2ZSgpCi0KLXByaXZhdGUgbmF0aXZlIGphdmEubGFuZy5TdHJpbmdbXSBsaXN0Q29ubmVjdGlvbnNOYXRpdmUoKQotCi1wcml2YXRlIG5hdGl2ZSBqYXZhLmxhbmcuU3RyaW5nW10gbGlzdFJlbW90ZURldmljZXNOYXRpdmUoKQotCi1wcml2YXRlIHZvaWQgcmVnaXN0ZXJGb3JBaXJwbGFuZU1vZGUoKQotCi1wcml2YXRlIG5hdGl2ZSBib29sZWFuIHJlbW92ZUJvbmRpbmdOYXRpdmUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIG5hdGl2ZSBib29sZWFuIHNldERpc2NvdmVyYWJsZVRpbWVvdXROYXRpdmUoCi1pbnQpCi0KLXByaXZhdGUgbmF0aXZlIGJvb2xlYW4gc2V0TW9kZU5hdGl2ZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgbmF0aXZlIGJvb2xlYW4gc2V0TmFtZU5hdGl2ZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgbmF0aXZlIGJvb2xlYW4gc2V0UGluTmF0aXZlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wcml2YXRlIG5hdGl2ZSBib29sZWFuIHNldFJlbW90ZUFsaWFzTmF0aXZlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBzdGFydERpc2NvdmVyeU5hdGl2ZSgKLWJvb2xlYW4pCi0KLXByaXZhdGUgbmF0aXZlIGJvb2xlYW4gc3RhcnRQZXJpb2RpY0Rpc2NvdmVyeU5hdGl2ZSgpCi0KLXByaXZhdGUgbmF0aXZlIGJvb2xlYW4gc3RvcFBlcmlvZGljRGlzY292ZXJ5TmF0aXZlKCkKLQotcHVibGljIGJvb2xlYW4gY2FuY2VsQm9uZGluZ1Byb2Nlc3MoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYm9vbGVhbiBjYW5jZWxEaXNjb3ZlcnkoKQotCi1wdWJsaWMgYm9vbGVhbiBjYW5jZWxQaW4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYm9vbGVhbiBjbGVhclJlbW90ZUFsaWFzKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJvb2xlYW4gY3JlYXRlQm9uZGluZygKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQuYmx1ZXRvb3RoLklCbHVldG9vdGhEZXZpY2VDYWxsYmFjaykKLQotcHVibGljIGJvb2xlYW4gZGlzYWJsZSgpCi0KLXB1YmxpYyBib29sZWFuIGRpc2Nvbm5lY3RSZW1vdGVEZXZpY2VBY2woCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcm90ZWN0ZWQgdm9pZCBkdW1wKAotamF2YS5pby5GaWxlRGVzY3JpcHRvcgotamF2YS5pby5QcmludFdyaXRlcgotamF2YS5sYW5nLlN0cmluZ1tdKQotCi1wdWJsaWMgYm9vbGVhbiBlbmFibGUoCi1hbmRyb2lkLmJsdWV0b290aC5JQmx1ZXRvb3RoRGV2aWNlQ2FsbGJhY2spCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9UaHJvd2FibGU7ICkKLXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkKLQotbmF0aXZlIGphdmEubGFuZy5TdHJpbmcgZ2V0QWRhcHRlclBhdGhOYXRpdmUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRBZGRyZXNzKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Q29tcGFueSgpCi0KLXB1YmxpYyBpbnQgZ2V0RGlzY292ZXJhYmxlVGltZW91dCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE1ham9yQ2xhc3MoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRNYW51ZmFjdHVyZXIoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRNaW5vckNsYXNzKCkKLQotcHVibGljIGludCBnZXRNb2RlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TmFtZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFJlbW90ZUFsaWFzKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGludCBnZXRSZW1vdGVDbGFzcygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFJlbW90ZUNvbXBhbnkoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYnl0ZVtdIGdldFJlbW90ZUZlYXR1cmVzKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UmVtb3RlTWFqb3JDbGFzcygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFJlbW90ZU1hbnVmYWN0dXJlcigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFJlbW90ZU1pbm9yQ2xhc3MoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRSZW1vdGVOYW1lKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UmVtb3RlUmV2aXNpb24oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYm9vbGVhbiBnZXRSZW1vdGVTZXJ2aWNlQ2hhbm5lbCgKLWphdmEubGFuZy5TdHJpbmcKLWludAotYW5kcm9pZC5ibHVldG9vdGguSUJsdWV0b290aERldmljZUNhbGxiYWNrKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIGdldFJlbW90ZVNlcnZpY2VDbGFzc2VzKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGludFtdIGdldFJlbW90ZVNlcnZpY2VIYW5kbGVzKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJ5dGVbXSBnZXRSZW1vdGVTZXJ2aWNlUmVjb3JkKAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRSZW1vdGVWZXJzaW9uKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UmV2aXNpb24oKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRWZXJzaW9uKCkKLQotcHVibGljIGJvb2xlYW4gaGFzQm9uZGluZygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIGluaXQoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0FjbENvbm5lY3RlZCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGFibGUoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0Rpc2NvdmVyYWJsZSgpCi0KLXB1YmxpYyBib29sZWFuIGlzRGlzY292ZXJpbmcoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKQotCi1wdWJsaWMgYm9vbGVhbiBpc1BlcmlvZGljRGlzY292ZXJ5KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgbGFzdFNlZW4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBsYXN0VXNlZCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gbGlzdEFjbENvbm5lY3Rpb25zKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBsaXN0Qm9uZGluZ3MoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIGxpc3RSZW1vdGVEZXZpY2VzKCkKLQotcHVibGljIGJvb2xlYW4gcmVtb3ZlQm9uZGluZygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBib29sZWFuIHNldERpc2NvdmVyYWJsZVRpbWVvdXQoCi1pbnQpCi0KLSB2b2lkIHNldElzRGlzY292ZXJpbmcoCi1ib29sZWFuKQotCi1wdWJsaWMgYm9vbGVhbiBzZXRNb2RlKAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBzZXROYW1lKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJvb2xlYW4gc2V0UGluKAotamF2YS5sYW5nLlN0cmluZwotYnl0ZVtdKQotCi1wdWJsaWMgYm9vbGVhbiBzZXRSZW1vdGVBbGlhcygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBib29sZWFuIHN0YXJ0RGlzY292ZXJ5KAotYm9vbGVhbikKLQotcHVibGljIGJvb2xlYW4gc3RhcnRQZXJpb2RpY0Rpc2NvdmVyeSgpCi0KLXB1YmxpYyBib29sZWFuIHN0b3BQZXJpb2RpY0Rpc2NvdmVyeSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotIGNsYXNzIGFuZHJvaWQuc2VydmVyLkJsdWV0b290aEV2ZW50TG9vcCQxIGV4dGVuZHMgamF2YS5sYW5nLlRocmVhZAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLnNlcnZlci5CbHVldG9vdGhFdmVudExvb3AgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5zZXJ2ZXIuQmx1ZXRvb3RoRXZlbnRMb29wCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotIGNsYXNzIGFuZHJvaWQuc2VydmVyLkJsdWV0b290aEV2ZW50TG9vcCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLQotcHJpdmF0ZSBhbmRyb2lkLnNlcnZlci5CbHVldG9vdGhEZXZpY2VTZXJ2aWNlIG1CbHVldG9vdGhTZXJ2aWNlCi0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgbUNvbnRleHQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0hhc2hNYXA8TGphdmEvbGFuZy9TdHJpbmc7TGFuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhEZXZpY2VDYWxsYmFjazs+OyApCi1wcml2YXRlIGphdmEudXRpbC5IYXNoTWFwIG1DcmVhdGVCb25kaW5nQ2FsbGJhY2tzCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNoTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xhbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoRGV2aWNlQ2FsbGJhY2s7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuSGFzaE1hcCBtR2V0UmVtb3RlU2VydmljZUNoYW5uZWxDYWxsYmFja3MKLQotcHJpdmF0ZSBib29sZWFuIG1JbnRlcnJ1cHRlZAotCi1wcml2YXRlIGludCBtTmF0aXZlRGF0YQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaE1hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL0ludGVnZXI7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuSGFzaE1hcCBtUGFzc2tleUFnZW50UmVxdWVzdERhdGEKLQotcHJpdmF0ZSBqYXZhLmxhbmcuVGhyZWFkIG1UaHJlYWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLnNlcnZlci5CbHVldG9vdGhEZXZpY2VTZXJ2aWNlKQotCi1zdGF0aWMgYm9vbGVhbiBhY2Nlc3MkMDAwKAotYW5kcm9pZC5zZXJ2ZXIuQmx1ZXRvb3RoRXZlbnRMb29wKQotCi1zdGF0aWMgYm9vbGVhbiBhY2Nlc3MkMTAwKAotYW5kcm9pZC5zZXJ2ZXIuQmx1ZXRvb3RoRXZlbnRMb29wKQotCi1zdGF0aWMgYm9vbGVhbiBhY2Nlc3MkMjAwKAotYW5kcm9pZC5zZXJ2ZXIuQmx1ZXRvb3RoRXZlbnRMb29wCi1pbnQpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQzMDAoCi1hbmRyb2lkLnNlcnZlci5CbHVldG9vdGhFdmVudExvb3ApCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIGNsYXNzSW5pdE5hdGl2ZSgpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgY2xlYW51cE5hdGl2ZURhdGFOYXRpdmUoKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIGluaXRpYWxpemVOYXRpdmVEYXRhTmF0aXZlKCkKLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2coCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHZvaWQgb25DcmVhdGVCb25kaW5nUmVzdWx0KAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotcHJpdmF0ZSB2b2lkIG9uR2V0UmVtb3RlU2VydmljZUNoYW5uZWxSZXN1bHQoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXByaXZhdGUgbmF0aXZlIGJvb2xlYW4gc2V0VXBFdmVudExvb3BOYXRpdmUoKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIHRlYXJEb3duRXZlbnRMb29wTmF0aXZlKCkKLQotcHJpdmF0ZSBib29sZWFuIHdhaXRGb3JBbmREaXNwYXRjaEV2ZW50KAotaW50KQotCi1wcml2YXRlIG5hdGl2ZSBib29sZWFuIHdhaXRGb3JBbmREaXNwYXRjaEV2ZW50TmF0aXZlKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvVGhyb3dhYmxlOyApCi1wcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0hhc2hNYXA8TGphdmEvbGFuZy9TdHJpbmc7TGFuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhEZXZpY2VDYWxsYmFjazs+OyApCi0gamF2YS51dGlsLkhhc2hNYXAgZ2V0Q3JlYXRlQm9uZGluZ0NhbGxiYWNrcygpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0hhc2hNYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9JbnRlZ2VyOz47ICkKLSBqYXZhLnV0aWwuSGFzaE1hcCBnZXRQYXNza2V5QWdlbnRSZXF1ZXN0RGF0YSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0hhc2hNYXA8TGphdmEvbGFuZy9TdHJpbmc7TGFuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhEZXZpY2VDYWxsYmFjazs+OyApCi0gamF2YS51dGlsLkhhc2hNYXAgZ2V0UmVtb3RlU2VydmljZUNoYW5uZWxDYWxsYmFja3MoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0V2ZW50TG9vcFJ1bm5pbmcoKQotCi1wdWJsaWMgdm9pZCBvbkJvbmRpbmdDcmVhdGVkKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgb25Cb25kaW5nUmVtb3ZlZCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIG9uRGlzY292ZXJ5Q29tcGxldGVkKCkKLQotcHVibGljIHZvaWQgb25EaXNjb3ZlcnlTdGFydGVkKCkKLQotcHVibGljIHZvaWQgb25Nb2RlQ2hhbmdlZCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIG9uTmFtZUNoYW5nZWQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBvblBhaXJpbmdDYW5jZWwoKQotCi1wdWJsaWMgdm9pZCBvblBhaXJpbmdSZXF1ZXN0KCkKLQotcHVibGljIHZvaWQgb25QYXNza2V5QWdlbnRDYW5jZWwoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBvblBhc3NrZXlBZ2VudFJlcXVlc3QoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyB2b2lkIG9uUmVtb3RlQWxpYXNDaGFuZ2VkKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgb25SZW1vdGVBbGlhc0NsZWFyZWQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBvblJlbW90ZUNsYXNzVXBkYXRlZCgKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIHZvaWQgb25SZW1vdGVEZXZpY2VDb25uZWN0ZWQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBvblJlbW90ZURldmljZURpc2FwcGVhcmVkKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgb25SZW1vdGVEZXZpY2VEaXNjb25uZWN0UmVxdWVzdGVkKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgb25SZW1vdGVEZXZpY2VEaXNjb25uZWN0ZWQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBvblJlbW90ZURldmljZUZvdW5kKAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1zaG9ydCkKLQotcHVibGljIHZvaWQgb25SZW1vdGVOYW1lQ2hhbmdlZCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIG9uUmVtb3RlTmFtZUZhaWxlZCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIG9uUmVtb3RlTmFtZVVwZGF0ZWQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi0gdm9pZCBzdGFydCgpCi0KLXB1YmxpYyB2b2lkIHN0b3AoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9NDEwNCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3NlcnZlci9jaGVja2luL0NoZWNraW5Qcm90b2NvbDsgKQotIGNsYXNzIGFuZHJvaWQuc2VydmVyLmNoZWNraW4uQ2hlY2tpblByb3RvY29sJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBmaW5hbCBpbnRbXSAkU3dpdGNoTWFwJGFuZHJvaWQkcHJvdmlkZXIkQ2hlY2tpbiRQcm9wZXJ0aWVzJFRhZwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3NlcnZlci9jaGVja2luL0NoZWNraW5Qcm90b2NvbCQxOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5zZXJ2ZXIuY2hlY2tpbi5DaGVja2luUHJvdG9jb2wgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2pzb24vSlNPTkV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBvcmcuanNvbi5KU09OT2JqZWN0IGZvcm1hdFJlcXVlc3QoCi1sb25nCi1sb25nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnV0aWwuTG9jYWxlCi1hbmRyb2lkLmRhdGFiYXNlLkN1cnNvcgotYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IKLWFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2pzb24vSlNPTkV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50W10gZ2V0UmVwbHlJbnRlbnRzKAotb3JnLmpzb24uSlNPTk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2pzb24vSlNPTkV4Y2VwdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMb3JnL2pzb24vSlNPTk9iamVjdDspTGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuTWFwIGdldFJlcGx5U2V0dGluZ3MoCi1vcmcuanNvbi5KU09OT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvanNvbi9KU09ORXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGxvbmcgZ2V0UmVwbHlUaW1lKAotb3JnLmpzb24uSlNPTk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2pzb24vSlNPTkV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzTWFya2V0UmVwbHlPaygKLW9yZy5qc29uLkpTT05PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9qc29uL0pTT05FeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlcGx5T2soCi1vcmcuanNvbi5KU09OT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIGxvbmcgc2VudEV2ZW50RGF0ZSgKLW9yZy5qc29uLkpTT05PYmplY3QpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXNbXSBzZW50U3RhdHMoCi1vcmcuanNvbi5KU09OT2JqZWN0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9T3BlbkhlbHBlciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9zZXJ2ZXIvY2hlY2tpbi9DaGVja2luUHJvdmlkZXI7ICkKLSBjbGFzcyBhbmRyb2lkLnNlcnZlci5jaGVja2luLkNoZWNraW5Qcm92aWRlciRPcGVuSGVscGVyIGV4dGVuZHMgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlT3BlbkhlbHBlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wdWJsaWMgdm9pZCBvbkNyZWF0ZSgKLWFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlKQotCi1wdWJsaWMgdm9pZCBvblVwZ3JhZGUoCi1hbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZQotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC9zZXJ2ZXIvY2hlY2tpbi9DaGVja2luUHJvdmlkZXIkT3BlbkhlbHBlcjsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQuc2VydmVyLmNoZWNraW4uQ2hlY2tpblByb3ZpZGVyIGV4dGVuZHMgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ1JBU0hfTElNSVQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENSQVNIX1NJWkUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBEQVRBQkFTRV9GSUxFTkFNRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREFUQUJBU0VfVkVSU0lPTgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfTElNSVQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1NJWkUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQUk9QRVJUSUVTX1BFUk1JU1NJT04KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLQotcHJpdmF0ZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVPcGVuSGVscGVyIG1PcGVuSGVscGVyCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLk9iamVjdCBtU3RhdHNMb2NrCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIGNoZWNrUGVybWlzc2lvbnMoCi1hbmRyb2lkLm5ldC5VcmkpCi0KLXByaXZhdGUgbG9uZyBpbnNlcnRDcmFzaCgKLWFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzKQotCi1wcml2YXRlIGxvbmcgaW5zZXJ0RXZlbnQoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlcykKLQotcHJpdmF0ZSBsb25nIGluc2VydFN0YXRzKAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXMpCi0KLXB1YmxpYyBpbnQgZGVsZXRlKAotYW5kcm9pZC5uZXQuVXJpCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFR5cGUoCi1hbmRyb2lkLm5ldC5VcmkpCi0KLXB1YmxpYyBhbmRyb2lkLm5ldC5VcmkgaW5zZXJ0KAotYW5kcm9pZC5uZXQuVXJpCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlcykKLQotcHVibGljIGJvb2xlYW4gb25DcmVhdGUoKQotCi1wdWJsaWMgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IgcXVlcnkoCi1hbmRyb2lkLm5ldC5VcmkKLWphdmEubGFuZy5TdHJpbmdbXQotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZ1tdCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgaW50IHVwZGF0ZSgKLWFuZHJvaWQubmV0LlVyaQotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXMKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi0gY2xhc3MgYW5kcm9pZC5zZXJ2ZXIuY2hlY2tpbi5DaGVja2luU2VydmljZSQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5SdW5uYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLnNlcnZlci5jaGVja2luLkNoZWNraW5TZXJ2aWNlIHRoaXMkMAotCi1maW5hbCBieXRlW10gdmFsJGRhdGEKLQotZmluYWwgaW50IHZhbCR1aWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLnNlcnZlci5jaGVja2luLkNoZWNraW5TZXJ2aWNlCi1pbnQKLWJ5dGVbXSkKLQotcHVibGljIHZvaWQgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9zZXJ2ZXIvY2hlY2tpbi9DaGVja2luU2VydmljZTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPUNoZWNraW5SZWNlaXZlciApCi0gY2xhc3MgYW5kcm9pZC5zZXJ2ZXIuY2hlY2tpbi5DaGVja2luU2VydmljZSRDaGVja2luUmVjZWl2ZXIgZXh0ZW5kcyBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXIgaW1wbGVtZW50cyBqYXZhLmxhbmcuUnVubmFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC5zZXJ2ZXIuY2hlY2tpbi5DaGVja2luU2VydmljZSB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5zZXJ2ZXIuY2hlY2tpbi5DaGVja2luU2VydmljZSkKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5zZXJ2ZXIuY2hlY2tpbi5DaGVja2luU2VydmljZQotYW5kcm9pZC5zZXJ2ZXIuY2hlY2tpbi5DaGVja2luU2VydmljZSQxKQotCi1wdWJsaWMgdm9pZCBvblJlY2VpdmUoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC5jb250ZW50LkludGVudCkKLQotcHVibGljIHZvaWQgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9zZXJ2ZXIvY2hlY2tpbi9DaGVja2luU2VydmljZTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPUNvbm5lY3Rpdml0eVJlY2VpdmVyICkKLSBjbGFzcyBhbmRyb2lkLnNlcnZlci5jaGVja2luLkNoZWNraW5TZXJ2aWNlJENvbm5lY3Rpdml0eVJlY2VpdmVyIGV4dGVuZHMgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQuc2VydmVyLmNoZWNraW4uQ2hlY2tpblNlcnZpY2UgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQuc2VydmVyLmNoZWNraW4uQ2hlY2tpblNlcnZpY2UpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQuc2VydmVyLmNoZWNraW4uQ2hlY2tpblNlcnZpY2UKLWFuZHJvaWQuc2VydmVyLmNoZWNraW4uQ2hlY2tpblNlcnZpY2UkMSkKLQotcHVibGljIHZvaWQgb25SZWNlaXZlKAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQuY29udGVudC5JbnRlbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPVBhcmVudGFsQ29udHJvbFJ1bm5hYmxlICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3NlcnZlci9jaGVja2luL0NoZWNraW5TZXJ2aWNlOyApCi0gY2xhc3MgYW5kcm9pZC5zZXJ2ZXIuY2hlY2tpbi5DaGVja2luU2VydmljZSRQYXJlbnRhbENvbnRyb2xSdW5uYWJsZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmxhbmcuUnVubmFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLm9zLklQYXJlbnRhbENvbnRyb2xDYWxsYmFjayBtQ2FsbGJhY2sKLQotZmluYWwgYW5kcm9pZC5zZXJ2ZXIuY2hlY2tpbi5DaGVja2luU2VydmljZSB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLnNlcnZlci5jaGVja2luLkNoZWNraW5TZXJ2aWNlCi1hbmRyb2lkLm9zLklQYXJlbnRhbENvbnRyb2xDYWxsYmFjaykKLQotcHVibGljIHZvaWQgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9zZXJ2ZXIvY2hlY2tpbi9DaGVja2luU2VydmljZTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPVRpbWVDaGFuZ2VkUmVjZWl2ZXIgKQotIGNsYXNzIGFuZHJvaWQuc2VydmVyLmNoZWNraW4uQ2hlY2tpblNlcnZpY2UkVGltZUNoYW5nZWRSZWNlaXZlciBleHRlbmRzIGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLnNlcnZlci5jaGVja2luLkNoZWNraW5TZXJ2aWNlIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLnNlcnZlci5jaGVja2luLkNoZWNraW5TZXJ2aWNlKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLnNlcnZlci5jaGVja2luLkNoZWNraW5TZXJ2aWNlCi1hbmRyb2lkLnNlcnZlci5jaGVja2luLkNoZWNraW5TZXJ2aWNlJDEpCi0KLXB1YmxpYyB2b2lkIG9uUmVjZWl2ZSgKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLmNvbnRlbnQuSW50ZW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvc2VydmVyL2NoZWNraW4vQ2hlY2tpblNlcnZpY2UkQ29ubmVjdGl2aXR5UmVjZWl2ZXI7TGFuZHJvaWQvc2VydmVyL2NoZWNraW4vQ2hlY2tpblNlcnZpY2UkVGltZUNoYW5nZWRSZWNlaXZlcjtMYW5kcm9pZC9zZXJ2ZXIvY2hlY2tpbi9DaGVja2luU2VydmljZSRDaGVja2luUmVjZWl2ZXI7TGFuZHJvaWQvc2VydmVyL2NoZWNraW4vQ2hlY2tpblNlcnZpY2UkUGFyZW50YWxDb250cm9sUnVubmFibGU7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnNlcnZlci5jaGVja2luLkNoZWNraW5TZXJ2aWNlIGV4dGVuZHMgYW5kcm9pZC5vcy5JQ2hlY2tpblNlcnZpY2UkU3R1YgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIENIRUNLSU5fSU5URVJWQUwKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBDSEVDS0lOX0lOVEVSVkFMX01BWAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENIRUNLSU5fVVJMCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ1JBU0hfVVJMCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9MT0dfU0VOVElORUwKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZ1tdIEdTRVJWSUNFU19RVUVSWV9QUk9KRUNUSU9OCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBLRVJORUxfVkVSU0lPTl9NQVgKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5pby5GaWxlIEtFUk5FTF9WRVJTSU9OX1BBVEgKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExBU1RfS01TR19NQVhfTEVOR1RICi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEuaW8uRmlsZSBMQVNUX0tNU0dfUEFUSAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIExPQ0FMX0xPR1YKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9FVkVOVERBVEEKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9FVkVOVFMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9SRVFVRVNUUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIE1JTl9USU1FX0RJRkYKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBNSU5fVElNRV9TRVQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSVU5USU1FX1NUQVJURURfUFJPUEVSVFkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUSU1FX0ZFVENIX1VSTAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVE9NQlNUT05FU19NQVhfTEVOR1RICi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEuaW8uRmlsZSBUT01CU1RPTkVTX1BBVEgKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBVU0VSX0FHRU5UCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5hcHAuQWxhcm1NYW5hZ2VyIG1BbGFybU1hbmFnZXIKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyIG1Db250ZW50UmVzb2x2ZXIKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBtQ29udGV4dAotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQudXRpbC5FdmVudExvZ1RhZ3MgbUV2ZW50VGFncwotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQub3MuSGFuZGxlciBtSGFuZGxlcgotCi1wcml2YXRlIGZpbmFsIGNvbS5nb29nbGUuYW5kcm9pZC5uZXQuR29vZ2xlSHR0cENsaWVudCBtSHR0cENsaWVudAotCi1wcml2YXRlIGxvbmcgbUxhc3RSZWFsdGltZQotCi1wcml2YXRlIGxvbmcgbUxhc3RVcHRpbWUKLQotcHJpdmF0ZSBib29sZWFuIG1OZXR3b3JrQ29ubmVjdGVkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotc3RhdGljIHZvaWQgYWNjZXNzJDEwMDAoCi1hbmRyb2lkLnNlcnZlci5jaGVja2luLkNoZWNraW5TZXJ2aWNlKQotCi1zdGF0aWMgYm9vbGVhbiBhY2Nlc3MkMTEwMCgKLWFuZHJvaWQuc2VydmVyLmNoZWNraW4uQ2hlY2tpblNlcnZpY2UpCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQxMTAyKAotYW5kcm9pZC5zZXJ2ZXIuY2hlY2tpbi5DaGVja2luU2VydmljZQotYm9vbGVhbikKLQotc3RhdGljIHZvaWQgYWNjZXNzJDMwMCgKLWFuZHJvaWQuc2VydmVyLmNoZWNraW4uQ2hlY2tpblNlcnZpY2UKLWludAotYnl0ZVtdKQotCi1zdGF0aWMgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlciBhY2Nlc3MkNDAwKAotYW5kcm9pZC5zZXJ2ZXIuY2hlY2tpbi5DaGVja2luU2VydmljZSkKLQotc3RhdGljIHZvaWQgYWNjZXNzJDUwMCgKLWFuZHJvaWQuc2VydmVyLmNoZWNraW4uQ2hlY2tpblNlcnZpY2UpCi0KLXN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBhY2Nlc3MkNjAwKAotYW5kcm9pZC5zZXJ2ZXIuY2hlY2tpbi5DaGVja2luU2VydmljZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMb3JnL2pzb24vSlNPTkV4Y2VwdGlvbjsgKQotc3RhdGljIHZvaWQgYWNjZXNzJDcwMCgKLWFuZHJvaWQuc2VydmVyLmNoZWNraW4uQ2hlY2tpblNlcnZpY2UpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQ4MDAoCi1hbmRyb2lkLnNlcnZlci5jaGVja2luLkNoZWNraW5TZXJ2aWNlCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xvcmcvYXBhY2hlL2h0dHAvSHR0cEV4Y2VwdGlvbjsgKQotc3RhdGljIHZvaWQgYWNjZXNzJDkwMCgKLWFuZHJvaWQuc2VydmVyLmNoZWNraW4uQ2hlY2tpblNlcnZpY2UpCi0KLXByaXZhdGUgdm9pZCBhZGRCb290RXZlbnRzKCkKLQotcHJpdmF0ZSB2b2lkIGFkZEtlcm5lbEV2ZW50cygpCi0KLXByaXZhdGUgdm9pZCBhZGRUb21ic3RvbmVFdmVudHMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xvcmcvanNvbi9KU09ORXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgZG9DaGVja2luKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMb3JnL2pzb24vSlNPTkV4Y2VwdGlvbjsgKQotcHJpdmF0ZSBib29sZWFuIGRvRmV0Y2hUaW1lKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2pzb24vSlNPTkV4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIGZvcm1hdEtlcm5lbEV2ZW50KAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIpCi0KLXByaXZhdGUgbG9uZyBnZXRBbmRyb2lkSWQoKQotCi1wcml2YXRlIGxvbmcgZ2V0TGFzdFN1Y2Nlc3NUaW1lKCkKLQotcHJpdmF0ZSBsb25nIGdldExvZ2dpbmdJZCgpCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBnZXRQcm92aXNpb25pbmdEaWdlc3QoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvanNvbi9KU09ORXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgaGFuZGxlUmVwbHkoCi1vcmcuanNvbi5KU09OT2JqZWN0Ci1vcmcuanNvbi5KU09OT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvanNvbi9KU09ORXhjZXB0aW9uOyApCi1wcml2YXRlIG9yZy5qc29uLkpTT05PYmplY3QgbWFrZVJlcXVlc3QoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvanNvbi9KU09ORXhjZXB0aW9uOyApCi1wcml2YXRlIGJvb2xlYW4gbWF5YmVTZXRUaW1lKAotb3JnLmpzb24uSlNPTk9iamVjdCkKLQotcHJpdmF0ZSB2b2lkIHJlcG9ydENyYXNoSW50ZXJuYWwoCi1pbnQKLWJ5dGVbXSkKLQotcHJpdmF0ZSB2b2lkIHJlcG9ydEZhaWx1cmUoCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1wcml2YXRlIHZvaWQgc2NoZWR1bGVDaGVja2luKCkKLQotcHJpdmF0ZSB2b2lkIHVwZGF0ZUNsb2NrU3RhdHMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzs+OylWICkKLXByaXZhdGUgdm9pZCB1cGRhdGVHc2VydmljZXMoCi1qYXZhLnV0aWwuTWFwKQotCi1wcml2YXRlIHZvaWQgdXBkYXRlUGFyZW50YWxDb250cm9sU3RhdHVzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMb3JnL2FwYWNoZS9odHRwL0h0dHBFeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCB1cGxvYWRDcmFzaGVzKCkKLQotcHJvdGVjdGVkIHZvaWQgZHVtcCgKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IKLWphdmEuaW8uUHJpbnRXcml0ZXIKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotcHVibGljIHZvaWQgZ2V0UGFyZW50YWxDb250cm9sU3RhdGUoCi1hbmRyb2lkLm9zLklQYXJlbnRhbENvbnRyb2xDYWxsYmFjaykKLQotcHVibGljIHZvaWQgbWFzdGVyQ2xlYXIoKQotCi1wdWJsaWMgdm9pZCByZXBvcnRDcmFzaEFzeW5jKAotYnl0ZVtdKQotCi1wdWJsaWMgdm9pZCByZXBvcnRDcmFzaFN5bmMoCi1ieXRlW10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvc2VydmVyL2NoZWNraW4vRHVtcFN0YXRlUmVjZWl2ZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9Q3Jhc2hSZXBvcnRPYnNlcnZlciApCi0gY2xhc3MgYW5kcm9pZC5zZXJ2ZXIuY2hlY2tpbi5EdW1wU3RhdGVSZWNlaXZlciRDcmFzaFJlcG9ydE9ic2VydmVyIGV4dGVuZHMgYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXIgaW1wbGVtZW50cyBqYXZhLmxhbmcuUnVubmFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyIG1Db250ZW50UmVzb2x2ZXIKLQotcHJpdmF0ZSBsb25nIG1IaWdoZXN0SWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotcHVibGljIHZvaWQgb25DaGFuZ2UoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvc2VydmVyL2NoZWNraW4vRHVtcFN0YXRlUmVjZWl2ZXIkQ3Jhc2hSZXBvcnRPYnNlcnZlcjsgKQotIGNsYXNzIGFuZHJvaWQuc2VydmVyLmNoZWNraW4uRHVtcFN0YXRlUmVjZWl2ZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRFVNUENSQVNICi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRFVNUFNUQVRFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEFHCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgdm9pZCBkdW1wU3RhdGVUbygKLWphdmEuaW8uT3V0cHV0U3RyZWFtCi1ib29sZWFuKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuc2VydmVyLmNoZWNraW4uUmVjb3ZlcnlTeXN0ZW0gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGphdmEuaW8uRmlsZSBDT01NQU5EX0ZJTEUKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5pby5GaWxlIElOVEVOVF9GSUxFCi0KLXByaXZhdGUgc3RhdGljIGludCBJTlRFTlRfRklMRV9NQVhfTEVOR1RICi0KLXByaXZhdGUgc3RhdGljIGphdmEuaW8uRmlsZSBMT0dfRklMRQotCi1wcml2YXRlIHN0YXRpYyBpbnQgTE9HX0ZJTEVfTUFYX0xFTkdUSAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUkVDT1ZFUllfQ09NUExFVEVEX0FDVElPTgotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmlvLkZpbGUgUkVDT1ZFUllfRElSCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEFHCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOz47KVYgKQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBib290Q29tbWFuZCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudXRpbC5NYXApCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBoYW5kbGVBZnRlcm1hdGgoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9pby9GaWxlO0xqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOz47KVYgKQotcHVibGljIHN0YXRpYyB2b2lkIHJlYm9vdEFuZFVwZGF0ZSgKLWphdmEuaW8uRmlsZQotamF2YS51dGlsLk1hcCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7PjspViApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgdm9pZCByZWJvb3RBbmRXaXBlKAotamF2YS51dGlsLk1hcCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnNlcnZlci5jaGVja2luLlNlY3JldENvZGVSZWNlaXZlciBleHRlbmRzIGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRBRwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgc2V0RGVzaXJlZEJ1aWxkKAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIG9uUmVjZWl2ZSgKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLmNvbnRlbnQuSW50ZW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3NlcnZlci9jaGVja2luL1VwZGF0ZVJlY2VpdmVyOyApCi0gY2xhc3MgYW5kcm9pZC5zZXJ2ZXIuY2hlY2tpbi5VcGRhdGVSZWNlaXZlciQxIGV4dGVuZHMgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQuc2VydmVyLmNoZWNraW4uVXBkYXRlUmVjZWl2ZXIgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5zZXJ2ZXIuY2hlY2tpbi5VcGRhdGVSZWNlaXZlcikKLQotcHVibGljIHZvaWQgb25SZWNlaXZlKAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQuY29udGVudC5JbnRlbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvc2VydmVyL2NoZWNraW4vVXBkYXRlUmVjZWl2ZXI7ICkKLSBjbGFzcyBhbmRyb2lkLnNlcnZlci5jaGVja2luLlVwZGF0ZVJlY2VpdmVyJDIgZXh0ZW5kcyBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC5zZXJ2ZXIuY2hlY2tpbi5VcGRhdGVSZWNlaXZlciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLnNlcnZlci5jaGVja2luLlVwZGF0ZVJlY2VpdmVyKQotCi1wdWJsaWMgdm9pZCBvblJlY2VpdmUoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC5jb250ZW50LkludGVudCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9zZXJ2ZXIvY2hlY2tpbi9VcGRhdGVSZWNlaXZlcjsgKQotIGNsYXNzIGFuZHJvaWQuc2VydmVyLmNoZWNraW4uVXBkYXRlUmVjZWl2ZXIkMyBleHRlbmRzIGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLnNlcnZlci5jaGVja2luLlVwZGF0ZVJlY2VpdmVyIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQuc2VydmVyLmNoZWNraW4uVXBkYXRlUmVjZWl2ZXIpCi0KLXB1YmxpYyB2b2lkIG9uUmVjZWl2ZSgKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLmNvbnRlbnQuSW50ZW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1Eb3dubG9hZENvbXBsZXRlZEJyb2FkY2FzdFJlY2VpdmVyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3NlcnZlci9jaGVja2luL1VwZGF0ZVJlY2VpdmVyOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5zZXJ2ZXIuY2hlY2tpbi5VcGRhdGVSZWNlaXZlciREb3dubG9hZENvbXBsZXRlZEJyb2FkY2FzdFJlY2VpdmVyIGV4dGVuZHMgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgb25SZWNlaXZlKAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQuY29udGVudC5JbnRlbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvc2VydmVyL2NoZWNraW4vVXBkYXRlUmVjZWl2ZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9VmVyaWZpZXJSdW5uZXIgKQotIGNsYXNzIGFuZHJvaWQuc2VydmVyLmNoZWNraW4uVXBkYXRlUmVjZWl2ZXIkVmVyaWZpZXJSdW5uZXIgZXh0ZW5kcyBqYXZhLmxhbmcuVGhyZWFkCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgbUNvbnRleHQKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50IG1JbnRlbnQKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmlvLkZpbGUgbVVwZGF0ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLmNvbnRlbnQuSW50ZW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvc2VydmVyL2NoZWNraW4vVXBkYXRlUmVjZWl2ZXIkVmVyaWZpZXJSdW5uZXI7TGFuZHJvaWQvc2VydmVyL2NoZWNraW4vVXBkYXRlUmVjZWl2ZXIkRG93bmxvYWRDb21wbGV0ZWRCcm9hZGNhc3RSZWNlaXZlcjsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQuc2VydmVyLmNoZWNraW4uVXBkYXRlUmVjZWl2ZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDQU5DRUxfQUNUSU9OCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRE1fTk9USUZJQ0FUSU9OX0NMQVNTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRE1fTk9USUZJQ0FUSU9OX1BBQ0tBR0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIElOU1RBTExfQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQRVJNSVNTSU9OCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmdbXSBRVUVSWV9QUk9KRUNUSU9OCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmdbXSBRVUVSWV9XSEVSRV9BUkdTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUVVFUllfV0hFUkVfQ0xBVVNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSRUFEWV9BQ1RJT04KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBSRURPV05MT0FEX01TRUMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBSRVZFUklGWV9NU0VDCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0VUVElOR1NfUEFDS0FHRV9OQU1FCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEFHCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBVUERBVEVfQUNUSU9OCi0KLXByaXZhdGUgc3RhdGljIGFuZHJvaWQuY29udGVudC5JbnRlbnQgbVVwZGF0ZUludGVudAotCi1wcml2YXRlIHN0YXRpYyBsb25nIG1WZXJpZmljYXRpb25TdGFydGVkCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5hcHAuQWxhcm1NYW5hZ2VyIG1BbGFybU1hbmFnZXIKLQotcHJpdmF0ZSBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXIgbUNhbmNlbFJlY2VpdmVyCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgbUNvbnRleHQKLQotcHJpdmF0ZSBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXIgbUluc3RhbGxSZWNlaXZlcgotCi1wcml2YXRlIGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlciBtVXBkYXRlUmVjZWl2ZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1zdGF0aWMgYW5kcm9pZC5jb250ZW50LkludGVudCBhY2Nlc3MkMDAwKCkKLQotc3RhdGljIGFuZHJvaWQuY29udGVudC5JbnRlbnQgYWNjZXNzJDAwMigKLWFuZHJvaWQuY29udGVudC5JbnRlbnQpCi0KLXN0YXRpYyBsb25nIGFjY2VzcyQxMDAoKQotCi1zdGF0aWMgbG9uZyBhY2Nlc3MkMTAyKAotbG9uZykKLQotc3RhdGljIGphdmEubGFuZy5TdHJpbmdbXSBhY2Nlc3MkMjAwKCkKLQotc3RhdGljIGFuZHJvaWQuY29udGVudC5Db250ZXh0IGFjY2VzcyQzMDAoCi1hbmRyb2lkLnNlcnZlci5jaGVja2luLlVwZGF0ZVJlY2VpdmVyKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkNDAwKAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGFjY2VzcyQ1MDAoKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkNjAwKAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWphdmEuaW8uRmlsZSkKLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbnN0YWxsVXBkYXRlKAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWphdmEuaW8uRmlsZSkKLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVBbGxEb3dubG9hZHMoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnNlcnZlci5jaGVja2luLlVwZGF0ZVZlcmlmaWVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmlvLkZpbGUgS0VZU1RPUkUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvc2VjdXJpdHkvR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIHZvaWQgdmVyaWZ5UGFja2FnZSgKLWphdmEuaW8uRmlsZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnNlcnZlci5kYXRhLkJ1aWxkRGF0YSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZFUlNJT04KLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGZpbmdlcnByaW50Ci0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBpbmNyZW1lbnRhbFZlcnNpb24KLQotcHJpdmF0ZSBmaW5hbCBsb25nIHRpbWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi0gdm9pZCA8aW5pdD4oCi1qYXZhLmlvLkRhdGFJbnB1dCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotbG9uZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RmluZ2VycHJpbnQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJbmNyZW1lbnRhbFZlcnNpb24oKQotCi1wdWJsaWMgbG9uZyBnZXRUaW1lKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotIHZvaWQgd3JpdGUoCi1qYXZhLmlvLkRhdGFPdXRwdXQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5zZXJ2ZXIuZGF0YS5DcmFzaERhdGEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGphdmEubGFuZy5TdHJpbmcgYWN0aXZpdHkKLQotZmluYWwgYW5kcm9pZC5zZXJ2ZXIuZGF0YS5CdWlsZERhdGEgYnVpbGREYXRhCi0KLWZpbmFsIGphdmEubGFuZy5TdHJpbmcgaWQKLQotZmluYWwgYnl0ZVtdIHN0YXRlCi0KLWZpbmFsIGFuZHJvaWQuc2VydmVyLmRhdGEuVGhyb3dhYmxlRGF0YSB0aHJvd2FibGVEYXRhCi0KLWZpbmFsIGxvbmcgdGltZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uRGF0YUlucHV0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLnNlcnZlci5kYXRhLkJ1aWxkRGF0YQotYW5kcm9pZC5zZXJ2ZXIuZGF0YS5UaHJvd2FibGVEYXRhKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLnNlcnZlci5kYXRhLkJ1aWxkRGF0YQotYW5kcm9pZC5zZXJ2ZXIuZGF0YS5UaHJvd2FibGVEYXRhCi1ieXRlW10pCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEFjdGl2aXR5KCkKLQotcHVibGljIGFuZHJvaWQuc2VydmVyLmRhdGEuQnVpbGREYXRhIGdldEJ1aWxkRGF0YSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldElkKCkKLQotcHVibGljIGJ5dGVbXSBnZXRTdGF0ZSgpCi0KLXB1YmxpYyBhbmRyb2lkLnNlcnZlci5kYXRhLlRocm93YWJsZURhdGEgZ2V0VGhyb3dhYmxlRGF0YSgpCi0KLXB1YmxpYyBsb25nIGdldFRpbWUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHdyaXRlKAotamF2YS5pby5EYXRhT3V0cHV0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuc2VydmVyLmRhdGEuU3RhY2tUcmFjZUVsZW1lbnREYXRhIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBqYXZhLmxhbmcuU3RyaW5nIGNsYXNzTmFtZQotCi1maW5hbCBqYXZhLmxhbmcuU3RyaW5nIGZpbGVOYW1lCi0KLWZpbmFsIGludCBsaW5lTnVtYmVyCi0KLWZpbmFsIGphdmEubGFuZy5TdHJpbmcgbWV0aG9kTmFtZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uRGF0YUlucHV0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RhY2tUcmFjZUVsZW1lbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldENsYXNzTmFtZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEZpbGVOYW1lKCkKLQotcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TWV0aG9kTmFtZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLSB2b2lkIHdyaXRlKAotamF2YS5pby5EYXRhT3V0cHV0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuc2VydmVyLmRhdGEuVGhyb3dhYmxlRGF0YSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC5zZXJ2ZXIuZGF0YS5UaHJvd2FibGVEYXRhIGNhdXNlCi0KLWZpbmFsIGphdmEubGFuZy5TdHJpbmcgbWVzc2FnZQotCi1maW5hbCBhbmRyb2lkLnNlcnZlci5kYXRhLlN0YWNrVHJhY2VFbGVtZW50RGF0YVtdIHN0YWNrVHJhY2UKLQotZmluYWwgamF2YS5sYW5nLlN0cmluZyB0eXBlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5EYXRhSW5wdXQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgYXBwZW5kKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIKLWFuZHJvaWQuc2VydmVyLmRhdGEuVGhyb3dhYmxlRGF0YSkKLQotcHVibGljIGFuZHJvaWQuc2VydmVyLmRhdGEuVGhyb3dhYmxlRGF0YSBnZXRDYXVzZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE1lc3NhZ2UoKQotCi1wdWJsaWMgYW5kcm9pZC5zZXJ2ZXIuZGF0YS5TdGFja1RyYWNlRWxlbWVudERhdGFbXSBnZXRTdGFja1RyYWNlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VHlwZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB3cml0ZSgKLWphdmEuaW8uRGF0YU91dHB1dCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9zZXJ2ZXIvc2VhcmNoL1NlYXJjaE1hbmFnZXJTZXJ2aWNlOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi0gY2xhc3MgYW5kcm9pZC5zZXJ2ZXIuc2VhcmNoLlNlYXJjaE1hbmFnZXJTZXJ2aWNlJDEgZXh0ZW5kcyBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC5zZXJ2ZXIuc2VhcmNoLlNlYXJjaE1hbmFnZXJTZXJ2aWNlIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQuc2VydmVyLnNlYXJjaC5TZWFyY2hNYW5hZ2VyU2VydmljZSkKLQotcHVibGljIHZvaWQgb25SZWNlaXZlKAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQuY29udGVudC5JbnRlbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvc2VydmVyL3NlYXJjaC9TZWFyY2hNYW5hZ2VyU2VydmljZTsgKQotIGNsYXNzIGFuZHJvaWQuc2VydmVyLnNlYXJjaC5TZWFyY2hNYW5hZ2VyU2VydmljZSQyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5SdW5uYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLnNlcnZlci5zZWFyY2guU2VhcmNoTWFuYWdlclNlcnZpY2UgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5zZXJ2ZXIuc2VhcmNoLlNlYXJjaE1hbmFnZXJTZXJ2aWNlKQotCi1wdWJsaWMgdm9pZCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuc2VydmVyLnNlYXJjaC5TZWFyY2hNYW5hZ2VyU2VydmljZSBleHRlbmRzIGFuZHJvaWQuYXBwLklTZWFyY2hNYW5hZ2VyJFN0dWIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIElNTUVESUFURV9TRUFSQ0hBQkxFU19VUERBVEUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBsb2NhbExPR1YKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBtQ29udGV4dAotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQub3MuSGFuZGxlciBtSGFuZGxlcgotCi1wcml2YXRlIGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlciBtSW50ZW50UmVjZWl2ZXIKLQotcHJpdmF0ZSBqYXZhLmxhbmcuUnVubmFibGUgbVJ1blVwZGF0ZVNlYXJjaGFibGUKLQotcHJpdmF0ZSBib29sZWFuIG1TZWFyY2hhYmxlc0RpcnR5Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQwMDAoCi1hbmRyb2lkLnNlcnZlci5zZWFyY2guU2VhcmNoTWFuYWdlclNlcnZpY2UpCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQwMDIoCi1hbmRyb2lkLnNlcnZlci5zZWFyY2guU2VhcmNoTWFuYWdlclNlcnZpY2UKLWJvb2xlYW4pCi0KLXN0YXRpYyBqYXZhLmxhbmcuUnVubmFibGUgYWNjZXNzJDEwMCgKLWFuZHJvaWQuc2VydmVyLnNlYXJjaC5TZWFyY2hNYW5hZ2VyU2VydmljZSkKLQotc3RhdGljIGFuZHJvaWQub3MuSGFuZGxlciBhY2Nlc3MkMjAwKAotYW5kcm9pZC5zZXJ2ZXIuc2VhcmNoLlNlYXJjaE1hbmFnZXJTZXJ2aWNlKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMzAwKAotYW5kcm9pZC5zZXJ2ZXIuc2VhcmNoLlNlYXJjaE1hbmFnZXJTZXJ2aWNlKQotCi1wcml2YXRlIHZvaWQgdXBkYXRlU2VhcmNoYWJsZXMoKQotCi1wdWJsaWMgYW5kcm9pZC5zZXJ2ZXIuc2VhcmNoLlNlYXJjaGFibGVJbmZvIGdldFNlYXJjaGFibGVJbmZvKAotYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUKLWJvb2xlYW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvc2VydmVyL3NlYXJjaC9TZWFyY2hhYmxlSW5mbzsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC9zZXJ2ZXIvc2VhcmNoL1NlYXJjaGFibGVJbmZvOz47ICkKLWZpbmFsIGNsYXNzIGFuZHJvaWQuc2VydmVyLnNlYXJjaC5TZWFyY2hhYmxlSW5mbyQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGFuZHJvaWQuc2VydmVyLnNlYXJjaC5TZWFyY2hhYmxlSW5mbyBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIGFuZHJvaWQuc2VydmVyLnNlYXJjaC5TZWFyY2hhYmxlSW5mb1tdIG5ld0FycmF5KAotaW50KQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdFtdIG5ld0FycmF5KAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MSBuYW1lID1BY3Rpb25LZXlJbmZvICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3NlcnZlci9zZWFyY2gvU2VhcmNoYWJsZUluZm87ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnNlcnZlci5zZWFyY2guU2VhcmNoYWJsZUluZm8kQWN0aW9uS2V5SW5mbyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGludCBtS2V5Q29kZQotCi1wcml2YXRlIGFuZHJvaWQuc2VydmVyLnNlYXJjaC5TZWFyY2hhYmxlSW5mbyRBY3Rpb25LZXlJbmZvIG1OZXh0Ci0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIG1RdWVyeUFjdGlvbk1zZwotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBtU3VnZ2VzdEFjdGlvbk1zZwotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBtU3VnZ2VzdEFjdGlvbk1zZ0NvbHVtbgotCi1maW5hbCBhbmRyb2lkLnNlcnZlci5zZWFyY2guU2VhcmNoYWJsZUluZm8gdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5zZXJ2ZXIuc2VhcmNoLlNlYXJjaGFibGVJbmZvCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldAotYW5kcm9pZC5zZXJ2ZXIuc2VhcmNoLlNlYXJjaGFibGVJbmZvJEFjdGlvbktleUluZm8pCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuc2VydmVyLnNlYXJjaC5TZWFyY2hhYmxlSW5mbwotYW5kcm9pZC5vcy5QYXJjZWwKLWFuZHJvaWQuc2VydmVyLnNlYXJjaC5TZWFyY2hhYmxlSW5mbyRBY3Rpb25LZXlJbmZvKQotCi1zdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuc2VhcmNoLlNlYXJjaGFibGVJbmZvJEFjdGlvbktleUluZm8gYWNjZXNzJDEwMCgKLWFuZHJvaWQuc2VydmVyLnNlYXJjaC5TZWFyY2hhYmxlSW5mbyRBY3Rpb25LZXlJbmZvKQotCi1wdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKQotCi1wdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3NlcnZlci9zZWFyY2gvU2VhcmNoYWJsZUluZm8kQWN0aW9uS2V5SW5mbzsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQuc2VydmVyLnNlYXJjaC5TZWFyY2hhYmxlSW5mbyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I8TGFuZHJvaWQvc2VydmVyL3NlYXJjaC9TZWFyY2hhYmxlSW5mbzs+OyApCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yIENSRUFUT1IKLQotc3RhdGljIGZpbmFsIGludCBEQkdfSU5ISUJJVF9TVUdHRVNUSU9OUwotCi1zdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMT0dfVEFHCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTURfTEFCRUxfREVGQVVMVF9TRUFSQ0hBQkxFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTURfTEFCRUxfU0VBUkNIQUJMRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1EX1NFQVJDSEFCTEVfU1lTVEVNX1NFQVJDSAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1EX1hNTF9FTEVNRU5UX1NFQVJDSEFCTEUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBNRF9YTUxfRUxFTUVOVF9TRUFSQ0hBQkxFX0FDVElPTl9LRVkKLQotcHJpdmF0ZSBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuc2VhcmNoLlNlYXJjaGFibGVJbmZvIHNEZWZhdWx0U2VhcmNoYWJsZQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQXJyYXlMaXN0PExhbmRyb2lkL3NlcnZlci9zZWFyY2gvU2VhcmNoYWJsZUluZm87PjsgKQotcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLkFycmF5TGlzdCBzU2VhcmNoYWJsZXNMaXN0Ci1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNoTWFwPExhbmRyb2lkL2NvbnRlbnQvQ29tcG9uZW50TmFtZTtMYW5kcm9pZC9zZXJ2ZXIvc2VhcmNoL1NlYXJjaGFibGVJbmZvOz47ICkKLXByaXZhdGUgc3RhdGljIGphdmEudXRpbC5IYXNoTWFwIHNTZWFyY2hhYmxlc01hcAotCi1wcml2YXRlIGFuZHJvaWQuc2VydmVyLnNlYXJjaC5TZWFyY2hhYmxlSW5mbyRBY3Rpb25LZXlJbmZvIG1BY3Rpb25LZXlMaXN0Ci0KLXB1YmxpYyBib29sZWFuIG1CYWRnZUljb24KLQotcHVibGljIGJvb2xlYW4gbUJhZGdlTGFiZWwKLQotcHJpdmF0ZSBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBtQ2FjaGVBY3Rpdml0eUNvbnRleHQKLQotcHJpdmF0ZSBpbnQgbUhpbnRJZAotCi1wcml2YXRlIGludCBtSWNvbklkCi0KLXByaXZhdGUgaW50IG1MYWJlbElkCi0KLXB1YmxpYyBib29sZWFuIG1RdWVyeVJld3JpdGVGcm9tRGF0YQotCi1wdWJsaWMgYm9vbGVhbiBtUXVlcnlSZXdyaXRlRnJvbVRleHQKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIG1TZWFyY2hBY3Rpdml0eQotCi1wcml2YXRlIGludCBtU2VhcmNoQnV0dG9uVGV4dAotCi1wcml2YXRlIGludCBtU2VhcmNoTW9kZQotCi1wdWJsaWMgYm9vbGVhbiBtU2VhcmNoYWJsZQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbVN1Z2dlc3RBdXRob3JpdHkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1TdWdnZXN0SW50ZW50QWN0aW9uCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtU3VnZ2VzdEludGVudERhdGEKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1TdWdnZXN0UGF0aAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbVN1Z2dlc3RQcm92aWRlclBhY2thZ2UKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1TdWdnZXN0U2VsZWN0aW9uCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQKLWFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotc3RhdGljIGFuZHJvaWQuY29udGVudC5Db250ZXh0IGFjY2VzcyQwMDAoCi1hbmRyb2lkLnNlcnZlci5zZWFyY2guU2VhcmNoYWJsZUluZm8pCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBidWlsZFNlYXJjaGFibGVMaXN0KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXByaXZhdGUgc3RhdGljIGFuZHJvaWQuc2VydmVyLnNlYXJjaC5TZWFyY2hhYmxlSW5mbyBnZXRBY3Rpdml0eU1ldGFEYXRhKAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLW9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXIKLWFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuc2VydmVyLnNlYXJjaC5TZWFyY2hhYmxlSW5mbyBnZXREZWZhdWx0U2VhcmNoYWJsZSgpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuc2VhcmNoLlNlYXJjaGFibGVJbmZvIGdldFNlYXJjaGFibGVJbmZvKAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9BcnJheUxpc3Q8TGFuZHJvaWQvc2VydmVyL3NlYXJjaC9TZWFyY2hhYmxlSW5mbzs+OyApCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5BcnJheUxpc3QgZ2V0U2VhcmNoYWJsZXNMaXN0KCkKLQotcHVibGljIHN0YXRpYyB2b2lkIHNldERlZmF1bHRTZWFyY2hhYmxlKAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lKQotCi1wcml2YXRlIHZvaWQgc2V0U2VhcmNoTW9kZUZsYWdzKCkKLQotcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkKLQotcHVibGljIGFuZHJvaWQuc2VydmVyLnNlYXJjaC5TZWFyY2hhYmxlSW5mbyRBY3Rpb25LZXlJbmZvIGZpbmRBY3Rpb25LZXkoCi1pbnQpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBnZXRBY3Rpdml0eUNvbnRleHQoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotcHVibGljIGludCBnZXRIaW50SWQoKQotCi1wdWJsaWMgaW50IGdldEljb25JZCgpCi0KLXB1YmxpYyBpbnQgZ2V0TGFiZWxJZCgpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBnZXRQcm92aWRlckNvbnRleHQoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXB1YmxpYyBpbnQgZ2V0U2VhcmNoQnV0dG9uVGV4dCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN1Z2dlc3RBdXRob3JpdHkoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdWdnZXN0SW50ZW50QWN0aW9uKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3VnZ2VzdEludGVudERhdGEoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdWdnZXN0UGF0aCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN1Z2dlc3RTZWxlY3Rpb24oKQotCi1wdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uR3JhbW1hckxpc3RlbmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uRXJyb3IoCi1qYXZhLmxhbmcuRXhjZXB0aW9uKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvbkxvYWRlZCgpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uVW5sb2FkZWQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5FbWJlZGRlZEdyYW1tYXJMaXN0ZW5lciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5HcmFtbWFyTGlzdGVuZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvbkNvbXBpbGVBbGxTbG90cygpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uRXJyb3IoCi1qYXZhLmxhbmcuRXhjZXB0aW9uKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvblJlc2V0QWxsU2xvdHMoKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvblNhdmVkKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5BYnN0cmFjdEVtYmVkZGVkR3JhbW1hckxpc3RlbmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLkVtYmVkZGVkR3JhbW1hckxpc3RlbmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgb25Db21waWxlQWxsU2xvdHMoKQotCi1wdWJsaWMgdm9pZCBvbkVycm9yKAotamF2YS5sYW5nLkV4Y2VwdGlvbikKLQotcHVibGljIHZvaWQgb25Mb2FkZWQoKQotCi1wdWJsaWMgdm9pZCBvblJlc2V0QWxsU2xvdHMoKQotCi1wdWJsaWMgdm9pZCBvblNhdmVkKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgb25VbmxvYWRlZCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uQWJzdHJhY3RHcmFtbWFyTGlzdGVuZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uR3JhbW1hckxpc3RlbmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgb25FcnJvcigKLWphdmEubGFuZy5FeGNlcHRpb24pCi0KLXB1YmxpYyB2b2lkIG9uTG9hZGVkKCkKLQotcHVibGljIHZvaWQgb25VbmxvYWRlZCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLlBhcmFtZXRlcnNMaXN0ZW5lciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0hhc2h0YWJsZTxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzs+OylWICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uUGFyYW1ldGVyc0dldCgKLWphdmEudXRpbC5IYXNodGFibGUpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvVmVjdG9yPExqYXZhL2xhbmcvU3RyaW5nOz47TGphdmEvbGFuZy9FeGNlcHRpb247KVYgKQotcHVibGljIGFic3RyYWN0IHZvaWQgb25QYXJhbWV0ZXJzR2V0RXJyb3IoCi1qYXZhLnV0aWwuVmVjdG9yCi1qYXZhLmxhbmcuRXhjZXB0aW9uKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0hhc2h0YWJsZTxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzs+OylWICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uUGFyYW1ldGVyc1NldCgKLWphdmEudXRpbC5IYXNodGFibGUpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvSGFzaHRhYmxlPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOz47TGphdmEvbGFuZy9FeGNlcHRpb247KVYgKQotcHVibGljIGFic3RyYWN0IHZvaWQgb25QYXJhbWV0ZXJzU2V0RXJyb3IoCi1qYXZhLnV0aWwuSGFzaHRhYmxlCi1qYXZhLmxhbmcuRXhjZXB0aW9uKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvc3BlZWNoL3JlY29nbml0aW9uL1JlY29nbml6ZXJMaXN0ZW5lciRGYWlsdXJlUmVhc29uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLlJlY29nbml6ZXJMaXN0ZW5lciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5QYXJhbWV0ZXJzTGlzdGVuZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvbkFjb3VzdGljU3RhdGVSZXNldCgpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uQmVnaW5uaW5nT2ZTcGVlY2goKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvbkVuZE9mU3BlZWNoKCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgb25FcnJvcigKLWphdmEubGFuZy5FeGNlcHRpb24pCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uUmVjb2duaXRpb25GYWlsdXJlKAotYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uUmVjb2duaXplckxpc3RlbmVyJEZhaWx1cmVSZWFzb24pCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uUmVjb2duaXRpb25TdWNjZXNzKAotYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uUmVjb2duaXRpb25SZXN1bHQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uU3RhcnRPZlNwZWVjaFRpbWVvdXQoKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvblN0YXJ0ZWQoKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvblN0b3BwZWQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLkFic3RyYWN0UmVjb2duaXplckxpc3RlbmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLlJlY29nbml6ZXJMaXN0ZW5lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIG9uQWNvdXN0aWNTdGF0ZVJlc2V0KCkKLQotcHVibGljIHZvaWQgb25CZWdpbm5pbmdPZlNwZWVjaCgpCi0KLXB1YmxpYyB2b2lkIG9uRW5kT2ZTcGVlY2goKQotCi1wdWJsaWMgdm9pZCBvbkVycm9yKAotamF2YS5sYW5nLkV4Y2VwdGlvbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9IYXNodGFibGU8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7PjspViApCi1wdWJsaWMgdm9pZCBvblBhcmFtZXRlcnNHZXQoCi1qYXZhLnV0aWwuSGFzaHRhYmxlKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL1ZlY3RvcjxMamF2YS9sYW5nL1N0cmluZzs+O0xqYXZhL2xhbmcvRXhjZXB0aW9uOylWICkKLXB1YmxpYyB2b2lkIG9uUGFyYW1ldGVyc0dldEVycm9yKAotamF2YS51dGlsLlZlY3RvcgotamF2YS5sYW5nLkV4Y2VwdGlvbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9IYXNodGFibGU8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7PjspViApCi1wdWJsaWMgdm9pZCBvblBhcmFtZXRlcnNTZXQoCi1qYXZhLnV0aWwuSGFzaHRhYmxlKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0hhc2h0YWJsZTxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzs+O0xqYXZhL2xhbmcvRXhjZXB0aW9uOylWICkKLXB1YmxpYyB2b2lkIG9uUGFyYW1ldGVyc1NldEVycm9yKAotamF2YS51dGlsLkhhc2h0YWJsZQotamF2YS5sYW5nLkV4Y2VwdGlvbikKLQotcHVibGljIHZvaWQgb25SZWNvZ25pdGlvbkZhaWx1cmUoCi1hbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5SZWNvZ25pemVyTGlzdGVuZXIkRmFpbHVyZVJlYXNvbikKLQotcHVibGljIHZvaWQgb25SZWNvZ25pdGlvblN1Y2Nlc3MoCi1hbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5SZWNvZ25pdGlvblJlc3VsdCkKLQotcHVibGljIHZvaWQgb25TdGFydE9mU3BlZWNoVGltZW91dCgpCi0KLXB1YmxpYyB2b2lkIG9uU3RhcnRlZCgpCi0KLXB1YmxpYyB2b2lkIG9uU3RvcHBlZCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLlNyZWNHcmFtbWFyTGlzdGVuZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uRW1iZWRkZWRHcmFtbWFyTGlzdGVuZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvbkFkZEl0ZW1MaXN0KCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgb25BZGRJdGVtTGlzdEZhaWx1cmUoCi1pbnQKLWphdmEubGFuZy5FeGNlcHRpb24pCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uRXJyb3IoCi1qYXZhLmxhbmcuRXhjZXB0aW9uKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLkFic3RyYWN0U3JlY0dyYW1tYXJMaXN0ZW5lciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5TcmVjR3JhbW1hckxpc3RlbmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgb25BZGRJdGVtTGlzdCgpCi0KLXB1YmxpYyB2b2lkIG9uQWRkSXRlbUxpc3RGYWlsdXJlKAotaW50Ci1qYXZhLmxhbmcuRXhjZXB0aW9uKQotCi1wdWJsaWMgdm9pZCBvbkNvbXBpbGVBbGxTbG90cygpCi0KLXB1YmxpYyB2b2lkIG9uRXJyb3IoCi1qYXZhLmxhbmcuRXhjZXB0aW9uKQotCi1wdWJsaWMgdm9pZCBvbkxvYWRlZCgpCi0KLXB1YmxpYyB2b2lkIG9uUmVzZXRBbGxTbG90cygpCi0KLXB1YmxpYyB2b2lkIG9uU2F2ZWQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBvblVubG9hZGVkKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5BdWRpb0FscmVhZHlJblVzZUV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5BdWRpb0RyaXZlckVycm9yRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLkV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5BdWRpb1NvdXJjZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uQXVkaW9TdHJlYW0gY3JlYXRlQXVkaW8oKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdGFydCgpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHN0b3AoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5BdWRpb1NvdXJjZUxpc3RlbmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uRXJyb3IoCi1qYXZhLmxhbmcuRXhjZXB0aW9uKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvblN0YXJ0ZWQoKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvblN0b3BwZWQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5BdWRpb1N0cmVhbSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGphdmEubGFuZy5EZXByZWNhdGVkCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBkaXNwb3NlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5Db2RlYyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5Db2RlYyBQQ01fMTZCSVRfMTFLCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uQ29kZWMgUENNXzE2QklUXzIySwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLkNvZGVjIFBDTV8xNkJJVF84SwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLkNvZGVjIFVMQVdfOEJJVF84SwotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgbWVzc2FnZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLkNvZGVjJDEpCi0KLXB1YmxpYyBhYnN0cmFjdCBieXRlIGdldEJpdHNQZXJTYW1wbGUoKQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldFNhbXBsZVJhdGUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvc3BlZWNoL3JlY29nbml0aW9uL0NvZGVjOyApCi1maW5hbCBjbGFzcyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5Db2RlYyQxIGV4dGVuZHMgYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uQ29kZWMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYnl0ZSBnZXRCaXRzUGVyU2FtcGxlKCkKLQotcHVibGljIGludCBnZXRTYW1wbGVSYXRlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9zcGVlY2gvcmVjb2duaXRpb24vQ29kZWM7ICkKLWZpbmFsIGNsYXNzIGFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLkNvZGVjJDIgZXh0ZW5kcyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5Db2RlYwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBieXRlIGdldEJpdHNQZXJTYW1wbGUoKQotCi1wdWJsaWMgaW50IGdldFNhbXBsZVJhdGUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3NwZWVjaC9yZWNvZ25pdGlvbi9Db2RlYzsgKQotZmluYWwgY2xhc3MgYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uQ29kZWMkMyBleHRlbmRzIGFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLkNvZGVjCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJ5dGUgZ2V0Qml0c1BlclNhbXBsZSgpCi0KLXB1YmxpYyBpbnQgZ2V0U2FtcGxlUmF0ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvc3BlZWNoL3JlY29nbml0aW9uL0NvZGVjOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1maW5hbCBjbGFzcyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5Db2RlYyQ0IGV4dGVuZHMgYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uQ29kZWMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYnl0ZSBnZXRCaXRzUGVyU2FtcGxlKCkKLQotcHVibGljIGludCBnZXRTYW1wbGVSYXRlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5EZXZpY2VTcGVha2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5EZXZpY2VTcGVha2VyIGluc3RhbmNlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5EZXZpY2VTcGVha2VyIGdldEluc3RhbmNlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbjtMamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0Q29kZWMoCi1hbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5Db2RlYykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0TGlzdGVuZXIoCi1hbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5EZXZpY2VTcGVha2VyTGlzdGVuZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHN0YXJ0KAotYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uQXVkaW9TdHJlYW0pCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHN0b3AoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5EZXZpY2VTcGVha2VyTGlzdGVuZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgb25FcnJvcigKLWphdmEubGFuZy5FeGNlcHRpb24pCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uU3RhcnRlZCgpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uU3RvcHBlZCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLkdyYW1tYXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgZGlzcG9zZSgpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGxvYWQoKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB1bmxvYWQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5FbWJlZGRlZEdyYW1tYXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uR3JhbW1hcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGNvbXBpbGVBbGxTbG90cygpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlc2V0QWxsU2xvdHMoKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzYXZlKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uUmVjb2duaXplciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uR3JhbW1hciBjcmVhdGVHcmFtbWFyKAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uR3JhbW1hckxpc3RlbmVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL1ZlY3RvcjxMamF2YS9sYW5nL1N0cmluZzs+OylWICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdldFBhcmFtZXRlcnMoCi1qYXZhLnV0aWwuVmVjdG9yKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCByZWNvZ25pemUoCi1hbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5BdWRpb1N0cmVhbQotYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uR3JhbW1hcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbjtMamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjtMamF2YS9sYW5nL1Vuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExhbmRyb2lkL3NwZWVjaC9yZWNvZ25pdGlvbi9BdWRpb1N0cmVhbTtMamF2YS91dGlsL1ZlY3RvcjxMYW5kcm9pZC9zcGVlY2gvcmVjb2duaXRpb24vR3JhbW1hcjs+OylWICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlY29nbml6ZSgKLWFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLkF1ZGlvU3RyZWFtCi1qYXZhLnV0aWwuVmVjdG9yKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRMaXN0ZW5lcigKLWFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLlJlY29nbml6ZXJMaXN0ZW5lcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9IYXNodGFibGU8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7PjspViApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRQYXJhbWV0ZXJzKAotamF2YS51dGlsLkhhc2h0YWJsZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc3RvcCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uRW1iZWRkZWRSZWNvZ25pemVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLlJlY29nbml6ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uRW1iZWRkZWRSZWNvZ25pemVyIGluc3RhbmNlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5FbWJlZGRlZFJlY29nbml6ZXIgZ2V0SW5zdGFuY2UoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uO0xqYXZhL2lvL0ZpbGVOb3RGb3VuZEV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9sYW5nL1Vuc2F0aXNmaWVkTGlua0Vycm9yO0xqYXZhL2xhbmcvQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgY29uZmlndXJlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgcmVzZXRBY291c3RpY1N0YXRlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5HcmFtbWFyRXJyb3JFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uR3JhbW1hck92ZXJmbG93RXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLkV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLkludmFsaWRVUkxFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPUxvZ0xldmVsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3NwZWVjaC9yZWNvZ25pdGlvbi9Mb2dnZXI7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5Mb2dnZXIkTG9nTGV2ZWwgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uTG9nZ2VyJExvZ0xldmVsIExFVkVMX0VSUk9SCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uTG9nZ2VyJExvZ0xldmVsIExFVkVMX0lORk8KLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5Mb2dnZXIkTG9nTGV2ZWwgTEVWRUxfTk9ORQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLkxvZ2dlciRMb2dMZXZlbCBMRVZFTF9UUkFDRQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLkxvZ2dlciRMb2dMZXZlbCBMRVZFTF9XQVJOCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtZXNzYWdlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvc3BlZWNoL3JlY29nbml0aW9uL0xvZ2dlciRMb2dMZXZlbDsgKQotcHVibGljIGFic3RyYWN0IGNsYXNzIGFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLkxvZ2dlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLkxvZ2dlciBnZXRJbnN0YW5jZSgpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGVycm9yKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IHZvaWQgaW5mbygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldExvZ2dpbmdMZXZlbCgKLWFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLkxvZ2dlciRMb2dMZXZlbCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0UGF0aCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHRyYWNlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IHZvaWQgd2FybigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPU1vZGUgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvc3BlZWNoL3JlY29nbml0aW9uL01lZGlhRmlsZVJlYWRlcjsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLk1lZGlhRmlsZVJlYWRlciRNb2RlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLk1lZGlhRmlsZVJlYWRlciRNb2RlIEFMTF9BVF9PTkNFCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uTWVkaWFGaWxlUmVhZGVyJE1vZGUgUkVBTF9USU1FCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtZXNzYWdlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3NwZWVjaC9yZWNvZ25pdGlvbi9NZWRpYUZpbGVSZWFkZXIkTW9kZTsgKQotcHVibGljIGFic3RyYWN0IGNsYXNzIGFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLk1lZGlhRmlsZVJlYWRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5BdWRpb1NvdXJjZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uTWVkaWFGaWxlUmVhZGVyIGNyZWF0ZSgKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLkF1ZGlvU291cmNlTGlzdGVuZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5BdWRpb1N0cmVhbSBjcmVhdGVBdWRpbygpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldE1vZGUoCi1hbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5NZWRpYUZpbGVSZWFkZXIkTW9kZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc3RhcnQoKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdG9wKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uTWVkaWFGaWxlUmVhZGVyTGlzdGVuZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uQXVkaW9Tb3VyY2VMaXN0ZW5lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uTWVkaWFGaWxlV3JpdGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uTWVkaWFGaWxlV3JpdGVyIGNyZWF0ZSgKLWFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLk1lZGlhRmlsZVdyaXRlckxpc3RlbmVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzYXZlKAotYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uQXVkaW9TdHJlYW0KLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLk1lZGlhRmlsZVdyaXRlckxpc3RlbmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uRXJyb3IoCi1qYXZhLmxhbmcuRXhjZXB0aW9uKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvblN0b3BwZWQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLk1pY3JvcGhvbmUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uQXVkaW9Tb3VyY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uTWljcm9waG9uZSBpbnN0YW5jZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uTWljcm9waG9uZSBnZXRJbnN0YW5jZSgpCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5BdWRpb1N0cmVhbSBjcmVhdGVBdWRpbygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldENvZGVjKAotYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uQ29kZWMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldExpc3RlbmVyKAotYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uQXVkaW9Tb3VyY2VMaXN0ZW5lcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc3RhcnQoKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdG9wKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uTWljcm9waG9uZUxpc3RlbmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLkF1ZGlvU291cmNlTGlzdGVuZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3NwZWVjaC9yZWNvZ25pdGlvbi9OQmVzdFJlY29nbml0aW9uUmVzdWx0OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9RW50cnkgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5OQmVzdFJlY29nbml0aW9uUmVzdWx0JEVudHJ5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldCgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBieXRlIGdldENvbmZpZGVuY2VTY29yZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldExpdGVyYWxNZWFuaW5nKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0U2VtYW50aWNNZWFuaW5nKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEudXRpbC5FbnVtZXJhdGlvbiBrZXlzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uUmVjb2duaXRpb25SZXN1bHQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3NwZWVjaC9yZWNvZ25pdGlvbi9OQmVzdFJlY29nbml0aW9uUmVzdWx0JEVudHJ5OyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLk5CZXN0UmVjb2duaXRpb25SZXN1bHQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uUmVjb2duaXRpb25SZXN1bHQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uVm9pY2V0YWdJdGVtIGNyZWF0ZVZvaWNldGFnSXRlbSgKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLlZvaWNldGFnSXRlbUxpc3RlbmVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uTkJlc3RSZWNvZ25pdGlvblJlc3VsdCRFbnRyeSBnZXRFbnRyeSgKLWludCkKLQotcHVibGljIGFic3RyYWN0IGludCBnZXRTaXplKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5QYXJhbWV0ZXJFcnJvckV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5FeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5QYXJzZUVycm9yRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLkV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1GYWlsdXJlUmVhc29uICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3NwZWVjaC9yZWNvZ25pdGlvbi9SZWNvZ25pemVyTGlzdGVuZXI7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5SZWNvZ25pemVyTGlzdGVuZXIkRmFpbHVyZVJlYXNvbiBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5SZWNvZ25pemVyTGlzdGVuZXIkRmFpbHVyZVJlYXNvbiBCRUdJTk5JTkdfT0ZfU1BFRUNIX1RJTUVPVVQKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5SZWNvZ25pemVyTGlzdGVuZXIkRmFpbHVyZVJlYXNvbiBOT19NQVRDSAotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLlJlY29nbml6ZXJMaXN0ZW5lciRGYWlsdXJlUmVhc29uIFJFQ09HTklUSU9OX1RJTUVPVVQKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5SZWNvZ25pemVyTGlzdGVuZXIkRmFpbHVyZVJlYXNvbiBTUE9LRV9UT09fU09PTgotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLlJlY29nbml6ZXJMaXN0ZW5lciRGYWlsdXJlUmVhc29uIFRPT19NVUNIX1NQRUVDSAotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLlJlY29nbml6ZXJMaXN0ZW5lciRGYWlsdXJlUmVhc29uIFVOS05PV04KLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIG1lc3NhZ2UKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLlNsb3RJdGVtIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPUl0ZW0gKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvc3BlZWNoL3JlY29nbml0aW9uL1NyZWNHcmFtbWFyOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uU3JlY0dyYW1tYXIkSXRlbSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLlNsb3RJdGVtIF9pdGVtCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIF9zZW1hbnRpY01lYW5pbmcKLQotcHVibGljIGludCBfd2VpZ2h0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uU2xvdEl0ZW0KLWludAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3NwZWVjaC9yZWNvZ25pdGlvbi9TcmVjR3JhbW1hciRJdGVtOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLlNyZWNHcmFtbWFyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLkVtYmVkZGVkR3JhbW1hcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGFkZEl0ZW0oCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5TbG90SXRlbQotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1N0cmluZztMamF2YS91dGlsL1ZlY3RvcjxMYW5kcm9pZC9zcGVlY2gvcmVjb2duaXRpb24vU3JlY0dyYW1tYXIkSXRlbTs+OylWICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgYWRkSXRlbUxpc3QoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnV0aWwuVmVjdG9yKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLlZvaWNldGFnSXRlbSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5TbG90SXRlbQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247TGphdmEvaW8vRmlsZU5vdEZvdW5kRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLlZvaWNldGFnSXRlbSBjcmVhdGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5Wb2ljZXRhZ0l0ZW1MaXN0ZW5lcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJ5dGVbXSBnZXRBdWRpbygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGxvYWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzYXZlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjtMamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0QXVkaW8oCi1ieXRlW10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLlZvaWNldGFnSXRlbUxpc3RlbmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uRXJyb3IoCi1qYXZhLmxhbmcuRXhjZXB0aW9uKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvbkxvYWRlZCgpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uU2F2ZWQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLldvcmRJdGVtIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLlNsb3RJdGVtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5Xb3JkSXRlbSB2YWx1ZU9mKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5Xb3JkSXRlbSB2YWx1ZU9mKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZ1tdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLmltcGwuQXVkaW9TdHJlYW1JbXBsIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLkF1ZGlvU3RyZWFtLCBqYXZhLmxhbmcuUnVubmFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBsb25nIG5hdGl2ZU9iamVjdAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWxvbmcpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgZGVsZXRlTmF0aXZlT2JqZWN0KAotbG9uZykKLQotcHVibGljIHZvaWQgZGlzcG9zZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9UaHJvd2FibGU7ICkKLXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkKLQotcHVibGljIGxvbmcgZ2V0TmF0aXZlT2JqZWN0KCkKLQotcHVibGljIHZvaWQgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5pbXBsLkRldmljZVNwZWFrZXJJbXBsIGV4dGVuZHMgYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uRGV2aWNlU3BlYWtlciBpbXBsZW1lbnRzIGphdmEubGFuZy5SdW5uYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5pbXBsLkRldmljZVNwZWFrZXJJbXBsIGluc3RhbmNlCi0KLXByaXZhdGUgYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uRGV2aWNlU3BlYWtlckxpc3RlbmVyIGxvY2FsbGlzdGVuZXIKLQotcHJpdmF0ZSBsb25nIG5hdGl2ZU9iamVjdAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIGRlbGV0ZU5hdGl2ZU9iamVjdCgKLWxvbmcpCi0KLXByaXZhdGUgdm9pZCBkaXNwb3NlKCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5pbXBsLkRldmljZVNwZWFrZXJJbXBsIGdldEluc3RhbmNlKCkKLQotcHJpdmF0ZSBuYXRpdmUgbG9uZyBpbml0TmF0aXZlT2JqZWN0KCkKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBzZXRDb2RlY1Byb3h5KAotbG9uZwotYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uQ29kZWMpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgc2V0TGlzdGVuZXJQcm94eSgKLWxvbmcKLWFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLkRldmljZVNwZWFrZXJMaXN0ZW5lcikKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBzdGFydFByb3h5KAotbG9uZwotbG9uZykKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBzdG9wUHJveHkoCi1sb25nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvVGhyb3dhYmxlOyApCi1wcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpCi0KLXB1YmxpYyB2b2lkIHJ1bigpCi0KLXB1YmxpYyB2b2lkIHNldENvZGVjKAotYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uQ29kZWMpCi0KLXB1YmxpYyB2b2lkIHNldExpc3RlbmVyKAotYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uRGV2aWNlU3BlYWtlckxpc3RlbmVyKQotCi1wdWJsaWMgdm9pZCBzdGFydCgKLWFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLkF1ZGlvU3RyZWFtKQotCi1wdWJsaWMgdm9pZCBzdG9wKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5pbXBsLkdyYW1tYXJJbXBsIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLkdyYW1tYXIsIGphdmEubGFuZy5SdW5uYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgbG9uZyBuYXRpdmVPYmplY3QKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1sb25nKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIGRlbGV0ZU5hdGl2ZU9iamVjdCgKLWxvbmcpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgbG9hZFByb3h5KAotbG9uZykKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCB1bmxvYWRQcm94eSgKLWxvbmcpCi0KLXB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvVGhyb3dhYmxlOyApCi1wcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpCi0KLXB1YmxpYyBsb25nIGdldE5hdGl2ZU9iamVjdCgpCi0KLXB1YmxpYyB2b2lkIGxvYWQoKQotCi1wdWJsaWMgdm9pZCBydW4oKQotCi1wdWJsaWMgdm9pZCB1bmxvYWQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLmltcGwuRW1iZWRkZWRHcmFtbWFySW1wbCBleHRlbmRzIGFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLmltcGwuR3JhbW1hckltcGwgaW1wbGVtZW50cyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5FbWJlZGRlZEdyYW1tYXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1sb25nKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIGNvbXBpbGVBbGxTbG90c1Byb3h5KAotbG9uZykKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCByZXNldEFsbFNsb3RzUHJveHkoCi1sb25nKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIHNhdmVQcm94eSgKLWxvbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIGNvbXBpbGVBbGxTbG90cygpCi0KLXB1YmxpYyB2b2lkIHJlc2V0QWxsU2xvdHMoKQotCi1wdWJsaWMgdm9pZCBzYXZlKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5pbXBsLkVtYmVkZGVkUmVjb2duaXplckltcGwgZXh0ZW5kcyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5FbWJlZGRlZFJlY29nbml6ZXIgaW1wbGVtZW50cyBqYXZhLmxhbmcuUnVubmFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uaW1wbC5FbWJlZGRlZFJlY29nbml6ZXJJbXBsIGluc3RhbmNlCi0KLXByaXZhdGUgbG9uZyBuYXRpdmVPYmplY3QKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uO0xqYXZhL2lvL0ZpbGVOb3RGb3VuZEV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9sYW5nL1Vuc2F0aXNmaWVkTGlua0Vycm9yO0xqYXZhL2xhbmcvQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBjb25maWd1cmVQcm94eSgKLWxvbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgbmF0aXZlIGxvbmcgY3JlYXRlRW1iZWRkZWRHcmFtbWFyUHJveHkoCi1sb25nCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5HcmFtbWFyTGlzdGVuZXIpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgZGVsZXRlTmF0aXZlT2JqZWN0KAotbG9uZykKLQotcHJpdmF0ZSB2b2lkIGRpc3Bvc2UoKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLmltcGwuRW1iZWRkZWRSZWNvZ25pemVySW1wbCBnZXRJbnN0YW5jZSgpCi0KLXByaXZhdGUgbmF0aXZlIGxvbmcgZ2V0SW5zdGFuY2VQcm94eSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KEpMamF2YS91dGlsL1ZlY3RvcjxMamF2YS9sYW5nL1N0cmluZzs+OylWICkKLXByaXZhdGUgbmF0aXZlIHZvaWQgZ2V0UGFyYW1ldGVyc1Byb3h5KAotbG9uZwotamF2YS51dGlsLlZlY3RvcikKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCByZWNvZ25pemVQcm94eSgKLWxvbmcKLWxvbmcKLWxvbmdbXSkKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCByZXNldEFjb3VzdGljU3RhdGVQcm94eSgKLWxvbmcpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgc2V0TGlzdGVuZXJQcm94eSgKLWxvbmcKLWFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLlJlY29nbml6ZXJMaXN0ZW5lcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSkxqYXZhL3V0aWwvSGFzaHRhYmxlPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOz47KVYgKQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBzZXRQYXJhbWV0ZXJzUHJveHkoCi1sb25nCi1qYXZhLnV0aWwuSGFzaHRhYmxlKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIHN0b3BQcm94eSgKLWxvbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247TGphdmEvaW8vRmlsZU5vdEZvdW5kRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL2xhbmcvVW5zYXRpc2ZpZWRMaW5rRXJyb3I7TGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjb25maWd1cmUoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOyApCi1wdWJsaWMgYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uR3JhbW1hciBjcmVhdGVHcmFtbWFyKAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uR3JhbW1hckxpc3RlbmVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL1ZlY3RvcjxMamF2YS9sYW5nL1N0cmluZzs+OylWICkKLXB1YmxpYyB2b2lkIGdldFBhcmFtZXRlcnMoCi1qYXZhLnV0aWwuVmVjdG9yKQotCi1wdWJsaWMgdm9pZCByZWNvZ25pemUoCi1hbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5BdWRpb1N0cmVhbQotYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uR3JhbW1hcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGFuZHJvaWQvc3BlZWNoL3JlY29nbml0aW9uL0F1ZGlvU3RyZWFtO0xqYXZhL3V0aWwvVmVjdG9yPExhbmRyb2lkL3NwZWVjaC9yZWNvZ25pdGlvbi9HcmFtbWFyOz47KVYgKQotcHVibGljIHZvaWQgcmVjb2duaXplKAotYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uQXVkaW9TdHJlYW0KLWphdmEudXRpbC5WZWN0b3IpCi0KLXB1YmxpYyB2b2lkIHJlc2V0QWNvdXN0aWNTdGF0ZSgpCi0KLXB1YmxpYyB2b2lkIHJ1bigpCi0KLXB1YmxpYyB2b2lkIHNldExpc3RlbmVyKAotYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uUmVjb2duaXplckxpc3RlbmVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0hhc2h0YWJsZTxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzs+OylWICkKLXB1YmxpYyB2b2lkIHNldFBhcmFtZXRlcnMoCi1qYXZhLnV0aWwuSGFzaHRhYmxlKQotCi1wdWJsaWMgdm9pZCBzdG9wKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi0gY2xhc3MgYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uaW1wbC5FbnRyeUltcGwkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuRW51bWVyYXRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBpbnQgaW5kZXhPZk5leHRSZWFkCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZ1tdIGtleXMKLQotZmluYWwgYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uaW1wbC5FbnRyeUltcGwgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uaW1wbC5FbnRyeUltcGwpCi0KLXB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IG5leHRFbGVtZW50KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5pbXBsLkVudHJ5SW1wbCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5OQmVzdFJlY29nbml0aW9uUmVzdWx0JEVudHJ5LCBqYXZhLmxhbmcuUnVubmFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBsb25nIG5hdGl2ZU9iamVjdAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWxvbmcpCi0KLXN0YXRpYyBsb25nIGFjY2VzcyQwMDAoCi1hbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5pbXBsLkVudHJ5SW1wbCkKLQotc3RhdGljIGphdmEubGFuZy5TdHJpbmdbXSBhY2Nlc3MkMTAwKAotYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uaW1wbC5FbnRyeUltcGwKLWxvbmcpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgZGVsZXRlTmF0aXZlT2JqZWN0KAotbG9uZykKLQotcHJpdmF0ZSB2b2lkIGRpc3Bvc2UoKQotCi1wcml2YXRlIG5hdGl2ZSBieXRlIGdldENvbmZpZGVuY2VTY29yZVByb3h5KAotbG9uZykKLQotcHJpdmF0ZSBuYXRpdmUgamF2YS5sYW5nLlN0cmluZyBnZXRMaXRlcmFsTWVhbmluZ1Byb3h5KAotbG9uZykKLQotcHJpdmF0ZSBuYXRpdmUgamF2YS5sYW5nLlN0cmluZyBnZXRQcm94eSgKLWxvbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgbmF0aXZlIGphdmEubGFuZy5TdHJpbmcgZ2V0U2VtYW50aWNNZWFuaW5nUHJveHkoCi1sb25nKQotCi1wcml2YXRlIG5hdGl2ZSBqYXZhLmxhbmcuU3RyaW5nW10ga2V5c1Byb3h5KAotbG9uZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL1Rocm93YWJsZTsgKQotcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXQoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgYnl0ZSBnZXRDb25maWRlbmNlU2NvcmUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRMaXRlcmFsTWVhbmluZygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFNlbWFudGljTWVhbmluZygpCi0KLXB1YmxpYyBqYXZhLnV0aWwuRW51bWVyYXRpb24ga2V5cygpCi0KLXB1YmxpYyB2b2lkIHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uaW1wbC5Mb2dnZXJJbXBsIGV4dGVuZHMgYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uTG9nZ2VyIGltcGxlbWVudHMgamF2YS5sYW5nLlJ1bm5hYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLmltcGwuTG9nZ2VySW1wbCBpbnN0YW5jZQotCi1wcml2YXRlIGxvbmcgbmF0aXZlT2JqZWN0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgZGVsZXRlTmF0aXZlT2JqZWN0KAotbG9uZykKLQotcHJpdmF0ZSB2b2lkIGRpc3Bvc2UoKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIGVycm9yUHJveHkoCi1sb25nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLmltcGwuTG9nZ2VySW1wbCBnZXRJbnN0YW5jZSgpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgaW5mb1Byb3h5KAotbG9uZwotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBuYXRpdmUgbG9uZyBpbml0TmF0aXZlT2JqZWN0KCkKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBzZXRMb2dnaW5nTGV2ZWxQcm94eSgKLWxvbmcKLWFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLkxvZ2dlciRMb2dMZXZlbCkKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBzZXRQYXRoUHJveHkoCi1sb25nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIHRyYWNlUHJveHkoCi1sb25nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIHdhcm5Qcm94eSgKLWxvbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIGVycm9yKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL1Rocm93YWJsZTsgKQotcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKQotCi1wdWJsaWMgdm9pZCBpbmZvKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgcnVuKCkKLQotcHVibGljIHZvaWQgc2V0TG9nZ2luZ0xldmVsKAotYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uTG9nZ2VyJExvZ0xldmVsKQotCi1wdWJsaWMgdm9pZCBzZXRQYXRoKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgdHJhY2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCB3YXJuKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5pbXBsLk1lZGlhRmlsZVJlYWRlckltcGwgZXh0ZW5kcyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5NZWRpYUZpbGVSZWFkZXIgaW1wbGVtZW50cyBqYXZhLmxhbmcuUnVubmFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBsb25nIG5hdGl2ZU9iamVjdAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLkF1ZGlvU291cmNlTGlzdGVuZXIpCi0KLXByaXZhdGUgbmF0aXZlIGxvbmcgY3JlYXRlQXVkaW9Qcm94eSgKLWxvbmcpCi0KLXByaXZhdGUgbmF0aXZlIGxvbmcgY3JlYXRlTWVkaWFGaWxlUmVhZGVyUHJveHkoCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5BdWRpb1NvdXJjZUxpc3RlbmVyKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIGRlbGV0ZU5hdGl2ZU9iamVjdCgKLWxvbmcpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgc2V0TW9kZVByb3h5KAotbG9uZwotYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uTWVkaWFGaWxlUmVhZGVyJE1vZGUpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgc3RhcnRQcm94eSgKLWxvbmcpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgc3RvcFByb3h5KAotbG9uZykKLQotcHVibGljIGFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLkF1ZGlvU3RyZWFtIGNyZWF0ZUF1ZGlvKCkKLQotcHVibGljIHZvaWQgZGlzcG9zZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9UaHJvd2FibGU7ICkKLXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkKLQotcHVibGljIHZvaWQgcnVuKCkKLQotcHVibGljIHZvaWQgc2V0TW9kZSgKLWFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLk1lZGlhRmlsZVJlYWRlciRNb2RlKQotCi1wdWJsaWMgdm9pZCBzdGFydCgpCi0KLXB1YmxpYyB2b2lkIHN0b3AoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLmltcGwuTWVkaWFGaWxlV3JpdGVySW1wbCBleHRlbmRzIGFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLk1lZGlhRmlsZVdyaXRlciBpbXBsZW1lbnRzIGphdmEubGFuZy5SdW5uYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGxvbmcgbmF0aXZlT2JqZWN0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uTWVkaWFGaWxlV3JpdGVyTGlzdGVuZXIpCi0KLXByaXZhdGUgbmF0aXZlIGxvbmcgY3JlYXRlTWVkaWFGaWxlV3JpdGVyUHJveHkoCi1hbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5NZWRpYUZpbGVXcml0ZXJMaXN0ZW5lcikKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBkZWxldGVOYXRpdmVPYmplY3QoCi1sb25nKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIHNhdmVQcm94eSgKLWxvbmcKLWxvbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvVGhyb3dhYmxlOyApCi1wcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpCi0KLXB1YmxpYyB2b2lkIHJ1bigpCi0KLXB1YmxpYyB2b2lkIHNhdmUoCi1hbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5BdWRpb1N0cmVhbQotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5pbXBsLk1pY3JvcGhvbmVJbXBsIGV4dGVuZHMgYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uTWljcm9waG9uZSBpbXBsZW1lbnRzIGphdmEubGFuZy5SdW5uYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5pbXBsLk1pY3JvcGhvbmVJbXBsIGluc3RhbmNlCi0KLXByaXZhdGUgbG9uZyBuYXRpdmVPYmplY3QKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSBuYXRpdmUgbG9uZyBjcmVhdGVBdWRpb1Byb3h5KAotbG9uZykKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBkZWxldGVOYXRpdmVPYmplY3QoCi1sb25nKQotCi1wcml2YXRlIHZvaWQgZGlzcG9zZSgpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uaW1wbC5NaWNyb3Bob25lSW1wbCBnZXRJbnN0YW5jZSgpCi0KLXByaXZhdGUgbmF0aXZlIGxvbmcgaW5pdE5hdGl2ZU9iamVjdCgpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgc2V0Q29kZWNQcm94eSgKLWxvbmcKLWFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLkNvZGVjKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIHNldExpc3RlbmVyUHJveHkoCi1sb25nCi1hbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5BdWRpb1NvdXJjZUxpc3RlbmVyKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIHN0YXJ0UHJveHkoCi1sb25nKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIHN0b3BQcm94eSgKLWxvbmcpCi0KLXB1YmxpYyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5BdWRpb1N0cmVhbSBjcmVhdGVBdWRpbygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9UaHJvd2FibGU7ICkKLXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkKLQotcHVibGljIHZvaWQgcnVuKCkKLQotcHVibGljIHZvaWQgc2V0Q29kZWMoCi1hbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5Db2RlYykKLQotcHVibGljIHZvaWQgc2V0TGlzdGVuZXIoCi1hbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5BdWRpb1NvdXJjZUxpc3RlbmVyKQotCi1wdWJsaWMgdm9pZCBzdGFydCgpCi0KLXB1YmxpYyB2b2lkIHN0b3AoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLmltcGwuTkJlc3RSZWNvZ25pdGlvblJlc3VsdEltcGwgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uTkJlc3RSZWNvZ25pdGlvblJlc3VsdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGxvbmcgbmF0aXZlT2JqZWN0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotbG9uZykKLQotcHJpdmF0ZSBuYXRpdmUgbG9uZyBjcmVhdGVWb2ljZXRhZ0l0ZW1Qcm94eSgKLWxvbmcKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLlZvaWNldGFnSXRlbUxpc3RlbmVyKQotCi1wcml2YXRlIHZvaWQgZGlzcG9zZSgpCi0KLXByaXZhdGUgbmF0aXZlIGxvbmcgZ2V0RW50cnlQcm94eSgKLWxvbmcKLWludCkKLQotcHJpdmF0ZSBuYXRpdmUgaW50IGdldFNpemVQcm94eSgKLWxvbmcpCi0KLXB1YmxpYyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5Wb2ljZXRhZ0l0ZW0gY3JlYXRlVm9pY2V0YWdJdGVtKAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uVm9pY2V0YWdJdGVtTGlzdGVuZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9UaHJvd2FibGU7ICkKLXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkKLQotcHVibGljIGFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLk5CZXN0UmVjb2duaXRpb25SZXN1bHQkRW50cnkgZ2V0RW50cnkoCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0U2l6ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uaW1wbC5TcmVjR3JhbW1hckltcGwgZXh0ZW5kcyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5pbXBsLkVtYmVkZGVkR3JhbW1hckltcGwgaW1wbGVtZW50cyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5TcmVjR3JhbW1hcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWxvbmcpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgYWRkSXRlbUxpc3RQcm94eSgKLWxvbmcKLWphdmEubGFuZy5TdHJpbmcKLWxvbmdbXQotaW50W10KLWphdmEubGFuZy5TdHJpbmdbXSkKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBhZGRJdGVtUHJveHkoCi1sb25nCi1qYXZhLmxhbmcuU3RyaW5nCi1sb25nCi1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIGFkZEl0ZW0oCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5TbG90SXRlbQotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1N0cmluZztMamF2YS91dGlsL1ZlY3RvcjxMYW5kcm9pZC9zcGVlY2gvcmVjb2duaXRpb24vU3JlY0dyYW1tYXIkSXRlbTs+OylWICkKLXB1YmxpYyB2b2lkIGFkZEl0ZW1MaXN0KAotamF2YS5sYW5nLlN0cmluZwotamF2YS51dGlsLlZlY3RvcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi0gY2xhc3MgYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uaW1wbC5TeXN0ZW0kMSBleHRlbmRzIGphdmEubGFuZy5UaHJlYWQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uaW1wbC5TeXN0ZW0gdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uaW1wbC5TeXN0ZW0pCi0KLXB1YmxpYyB2b2lkIHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uaW1wbC5TeXN0ZW0gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLmltcGwuU3lzdGVtIGluc3RhbmNlCi0KLXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbGlicmFyeUxvYWRlZAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvV2Vha0hhc2hNYXA8TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9yZWYvV2Vha1JlZmVyZW5jZTs+OyApCi1wcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuV2Vha0hhc2hNYXAgcmVnaXN0ZXJNYXAKLQotcHJpdmF0ZSBsb25nIG5hdGl2ZU9iamVjdAotCi1wcml2YXRlIGJvb2xlYW4gc2h1dGRvd25SZXF1ZXN0ZWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgZGlzcG9zZVByb3h5KCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgamF2YS5sYW5nLlN0cmluZyBnZXRBUElWZXJzaW9uKCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5pbXBsLlN5c3RlbSBnZXRJbnN0YW5jZSgpCi0KLXByaXZhdGUgdm9pZCBpbml0TGlicmFyeSgpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBsb25nIGluaXROYXRpdmVPYmplY3QoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3V0aWwvY29uY3VycmVudC9UaW1lb3V0RXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbFRocmVhZFN0YXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBkaXNwb3NlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL1Rocm93YWJsZTsgKQotcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCByZWdpc3RlcigKLWphdmEubGFuZy5SdW5uYWJsZSkKLQotcHVibGljIHZvaWQgdW5yZWdpc3RlcigKLWphdmEubGFuZy5SdW5uYWJsZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5pbXBsLlZvaWNldGFnSXRlbUltcGwgZXh0ZW5kcyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5Wb2ljZXRhZ0l0ZW0gaW1wbGVtZW50cyBqYXZhLmxhbmcuUnVubmFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBsb25nIG5hdGl2ZU9iamVjdAotCi1wcml2YXRlIGJvb2xlYW4gbmVlZFRvQmVMb2FkZWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1sb25nCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uO0xqYXZhL2lvL0ZpbGVOb3RGb3VuZEV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5Wb2ljZXRhZ0l0ZW0gY3JlYXRlKAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uVm9pY2V0YWdJdGVtTGlzdGVuZXIpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBsb25nIGNyZWF0ZVZvaWNldGFnUHJveHkoCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5Wb2ljZXRhZ0l0ZW1MaXN0ZW5lcikKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBkZWxldGVOYXRpdmVPYmplY3QoCi1sb25nKQotCi1wcml2YXRlIHZvaWQgZGlzcG9zZSgpCi0KLXByaXZhdGUgbmF0aXZlIGJ5dGVbXSBnZXRBdWRpb1Byb3h5KAotbG9uZykKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBsb2FkVm9pY2V0YWdQcm94eSgKLWxvbmcpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgc2F2ZVZvaWNldGFnUHJveHkoCi1sb25nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIHNldEF1ZGlvUHJveHkoCi1sb25nCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9UaHJvd2FibGU7ICkKLXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJ5dGVbXSBnZXRBdWRpbygpCi0KLXB1YmxpYyBsb25nIGdldE5hdGl2ZU9iamVjdCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGxvYWQoKQotCi1wdWJsaWMgdm9pZCBydW4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzYXZlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjtMamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0QXVkaW8oCi1ieXRlW10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5zcGVlY2gucmVjb2duaXRpb24uaW1wbC5Xb3JkSXRlbUltcGwgZXh0ZW5kcyBhbmRyb2lkLnNwZWVjaC5yZWNvZ25pdGlvbi5Xb3JkSXRlbSBpbXBsZW1lbnRzIGphdmEubGFuZy5SdW5uYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gZ3Vlc3NQcm9udW5jaWF0aW9ucwotCi1wcml2YXRlIGxvbmcgbmF0aXZlT2JqZWN0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZ1tdKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIGRlbGV0ZU5hdGl2ZU9iamVjdCgKLWxvbmcpCi0KLXByaXZhdGUgdm9pZCBkaXNwb3NlKCkKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBpbml0TmF0aXZlT2JqZWN0KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZ1tdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLmltcGwuV29yZEl0ZW1JbXBsIHZhbHVlT2YoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQuc3BlZWNoLnJlY29nbml0aW9uLmltcGwuV29yZEl0ZW1JbXBsIHZhbHVlT2YoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9UaHJvd2FibGU7ICkKLXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkKLQotcHVibGljIGxvbmcgZ2V0TmF0aXZlT2JqZWN0KCkKLQotcHVibGljIHZvaWQgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC9zcGVlY2gvc3JlYy9TcmVjOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEgbmFtZSA9R3JhbW1hciApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5zcGVlY2guc3JlYy5TcmVjJEdyYW1tYXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgaW50IG1JZAotCi1maW5hbCBhbmRyb2lkLnNwZWVjaC5zcmVjLlNyZWMgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5zcGVlY2guc3JlYy5TcmVjKQotCi1wdWJsaWMgdm9pZCBhZGRUb1Nsb3QoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIGNvbXBpbGVTbG90cygpCi0KLXB1YmxpYyB2b2lkIHJlc2V0QWxsU2xvdHMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzYXZlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgdW5sb2FkKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3NwZWVjaC9zcmVjL1NyZWMkR3JhbW1hcjsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQuc3BlZWNoLnNyZWMuU3JlYyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBpbnQgbU5hdGl2ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotCi1wcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFJlc3VsdCgKLWludAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGludCBnZXRSZXN1bHRDb3VudCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0UmVzdWx0S2V5cygKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFuZHJvaWQuc3BlZWNoLnNyZWMuU3JlYyRHcmFtbWFyIGxvYWRHcmFtbWFyKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJvb2xlYW4gcHJvY2VzcygpCi0KLXB1YmxpYyB2b2lkIHJlc2V0KCkKLQotcHVibGljIHZvaWQgc3RhcnQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuc3luY21sLnBpbS5Qcm9wZXJ0eU5vZGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlcyBwYXJhTWFwCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9BcnJheUxpc3Q8TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHVibGljIGphdmEudXRpbC5BcnJheUxpc3QgcGFyYU1hcF9UWVBFCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHByb3BOYW1lCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHByb3BWYWx1ZQotCi1wdWJsaWMgYnl0ZVtdIHByb3BWYWx1ZV9ieXRzCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9Db2xsZWN0aW9uPExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuQ29sbGVjdGlvbiBwcm9wVmFsdWVfdmVjdG9yCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC5zeW5jbWwucGltLlZCdWlsZGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGVuZCgpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGVuZFByb3BlcnR5KCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZW5kUmVjb3JkKCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgcHJvcGVydHlOYW1lKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IHZvaWQgcHJvcGVydHlQYXJhbVR5cGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBwcm9wZXJ0eVBhcmFtVmFsdWUoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0NvbGxlY3Rpb248TGphdmEvbGFuZy9TdHJpbmc7PjspViApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBwcm9wZXJ0eVZhbHVlcygKLWphdmEudXRpbC5Db2xsZWN0aW9uKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdGFydCgpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHN0YXJ0UHJvcGVydHkoKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdGFydFJlY29yZCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5zeW5jbWwucGltLlZEYXRhQnVpbGRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnN5bmNtbC5waW0uVkJ1aWxkZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGphdmEubGFuZy5TdHJpbmcgY3VyUGFyYW1UeXBlCi0KLSBhbmRyb2lkLnN5bmNtbC5waW0uUHJvcGVydHlOb2RlIGN1clByb3BOb2RlCi0KLSBhbmRyb2lkLnN5bmNtbC5waW0uVk5vZGUgY3VyVk5vZGUKLQotIGludCBub2RlTGlzdFBvcwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQXJyYXlMaXN0PExhbmRyb2lkL3N5bmNtbC9waW0vVk5vZGU7PjsgKQotcHVibGljIGphdmEudXRpbC5BcnJheUxpc3Qgdk5vZGVMaXN0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9Db2xsZWN0aW9uPExqYXZhL2xhbmcvU3RyaW5nOz47KUxqYXZhL2xhbmcvU3RyaW5nOyApCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbGlzdFRvU3RyaW5nKAotamF2YS51dGlsLkNvbGxlY3Rpb24pCi0KLXB1YmxpYyB2b2lkIGVuZCgpCi0KLXB1YmxpYyB2b2lkIGVuZFByb3BlcnR5KCkKLQotcHVibGljIHZvaWQgZW5kUmVjb3JkKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UmVzdWx0KCkKLQotcHVibGljIHZvaWQgcHJvcGVydHlOYW1lKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgcHJvcGVydHlQYXJhbVR5cGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBwcm9wZXJ0eVBhcmFtVmFsdWUoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0NvbGxlY3Rpb248TGphdmEvbGFuZy9TdHJpbmc7PjspViApCi1wdWJsaWMgdm9pZCBwcm9wZXJ0eVZhbHVlcygKLWphdmEudXRpbC5Db2xsZWN0aW9uKQotCi1wdWJsaWMgdm9pZCBzdGFydCgpCi0KLXB1YmxpYyB2b2lkIHN0YXJ0UHJvcGVydHkoKQotCi1wdWJsaWMgdm9pZCBzdGFydFJlY29yZCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5zeW5jbWwucGltLlZOb2RlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBWTmFtZQotCi1wdWJsaWMgaW50IHBhcnNlU3RhdHVzCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9BcnJheUxpc3Q8TGFuZHJvaWQvc3luY21sL3BpbS9Qcm9wZXJ0eU5vZGU7PjsgKQotcHVibGljIGphdmEudXRpbC5BcnJheUxpc3QgcHJvcExpc3QKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGFuZHJvaWQuc3luY21sLnBpbS5WUGFyc2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgZmluYWwgaW50IFBBUlNFX0VSUk9SCi0KLXByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIG1CdWZmZXIKLQotcHJvdGVjdGVkIGFuZHJvaWQuc3luY21sLnBpbS5WQnVpbGRlciBtQnVpbGRlcgotCi1wcm90ZWN0ZWQgZmluYWwgamF2YS5sYW5nLlN0cmluZyBtRGVmYXVsdEVuY29kaW5nCi0KLXByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIG1FbmNvZGluZwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIGdldFdvcmQoCi1pbnQpCi0KLXByb3RlY3RlZCBib29sZWFuIGlzTGV0dGVyKAotY2hhcikKLQotcHJvdGVjdGVkIGJvb2xlYW4gaXNMZXR0ZXJPckRpZ2l0KAotY2hhcikKLQotcHJvdGVjdGVkIGJvb2xlYW4gaXNQcmludGFibGUoCi1jaGFyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBwYXJzZSgKLWphdmEuaW8uSW5wdXRTdHJlYW0KLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQuc3luY21sLnBpbS5WQnVpbGRlcikKLQotcHJvdGVjdGVkIGludCBwYXJzZThiaXQoCi1pbnQpCi0KLXByb3RlY3RlZCBpbnQgcGFyc2VCYXNlNjQoCi1pbnQpCi0KLXByb3RlY3RlZCBpbnQgcGFyc2VDaGFyc2V0VmFsKAotaW50KQotCi1wcm90ZWN0ZWQgaW50IHBhcnNlQ3JsZigKLWludCkKLQotcHJvdGVjdGVkIGludCBwYXJzZUxhbmdWYWwoCi1pbnQpCi0KLXByb3RlY3RlZCBpbnQgcGFyc2VPY3RldCgKLWludCkKLQotcHJvdGVjdGVkIGludCBwYXJzZVBFbmNvZGluZ1ZhbCgKLWludCkKLQotcHJvdGVjdGVkIGludCBwYXJzZVBWYWx1ZVZhbCgKLWludCkKLQotcHJvdGVjdGVkIGludCBwYXJzZVB0ZXh0KAotaW50KQotCi1wcm90ZWN0ZWQgaW50IHBhcnNlUXVvdGVkUHJpbnRhYmxlKAotaW50KQotCi1wcm90ZWN0ZWQgaW50IHBhcnNlU3RyaW5nKAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuKQotCi1wcm90ZWN0ZWQgaW50IHBhcnNlVGFnKAotaW50KQotCi1wcm90ZWN0ZWQgYWJzdHJhY3QgaW50IHBhcnNlVkZpbGUoCi1pbnQpCi0KLXByb3RlY3RlZCBpbnQgcGFyc2VWYWx1ZSgKLWludCkKLQotcHJvdGVjdGVkIGludCBwYXJzZVdvcmQoCi1pbnQpCi0KLXByb3RlY3RlZCBpbnQgcGFyc2VXc2xzKAotaW50KQotCi1wcm90ZWN0ZWQgaW50IHBhcnNlWFdvcmQoCi1pbnQpCi0KLXByb3RlY3RlZCBpbnQgcmVtb3ZlV3MoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgc2V0SW5wdXRTdHJlYW0oCi1qYXZhLmlvLklucHV0U3RyZWFtCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3N5bmNtbC9waW0vdmNhbGVuZGFyL0NhbGVuZGFyU3RydWN0OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9RXZlbnRTdHJ1Y3QgKQotcHVibGljIGNsYXNzIGFuZHJvaWQuc3luY21sLnBpbS52Y2FsZW5kYXIuQ2FsZW5kYXJTdHJ1Y3QkRXZlbnRTdHJ1Y3QgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGRlc2NyaXB0aW9uCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGR0ZW5kCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGR0c3RhcnQKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZHVyYXRpb24KLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZXZlbnRfbG9jYXRpb24KLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgaGFzX2FsYXJtCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGxhc3RfZGF0ZQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvTGlzdDxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wdWJsaWMgamF2YS51dGlsLkxpc3QgcmVtaW5kZXJMaXN0Ci0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHJydWxlCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHN0YXR1cwotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0aXRsZQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB1aWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCBhZGRSZW1pbmRlckxpc3QoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvc3luY21sL3BpbS92Y2FsZW5kYXIvQ2FsZW5kYXJTdHJ1Y3QkRXZlbnRTdHJ1Y3Q7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnN5bmNtbC5waW0udmNhbGVuZGFyLkNhbGVuZGFyU3RydWN0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9zeW5jbWwvcGltL3ZjYWxlbmRhci9DYWxlbmRhclN0cnVjdCRFdmVudFN0cnVjdDs+OyApCi1wdWJsaWMgamF2YS51dGlsLkxpc3QgZXZlbnRMaXN0Ci0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRpbWV6b25lCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgYWRkRXZlbnRMaXN0KAotYW5kcm9pZC5zeW5jbWwucGltLnZjYWxlbmRhci5DYWxlbmRhclN0cnVjdCRFdmVudFN0cnVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnN5bmNtbC5waW0udmNhbGVuZGFyLlZDYWxDb21wb3NlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkVSU0lPTl9WQ0FMMTBfSU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fVkNBTDIwX0lOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVkVSU0lPTl9WQ0FMRU5EQVIxMAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVkVSU0lPTl9WQ0FMRU5EQVIyMAotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIG1OZXdMaW5lCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtVmVyc2lvbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGJ1aWxkRXZlbnRTdHIoCi1hbmRyb2lkLnN5bmNtbC5waW0udmNhbGVuZGFyLkNhbGVuZGFyU3RydWN0JEV2ZW50U3RydWN0KQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZm9sZGluZ1N0cmluZygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgYm9vbGVhbiBpc051bGwoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL3N5bmNtbC9waW0vdmNhbGVuZGFyL1ZDYWxFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGNyZWF0ZVZDYWwoCi1hbmRyb2lkLnN5bmNtbC5waW0udmNhbGVuZGFyLkNhbGVuZGFyU3RydWN0Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5zeW5jbWwucGltLnZjYWxlbmRhci5WQ2FsRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLkV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5zeW5jbWwucGltLnZjYWxlbmRhci5WQ2FsUGFyc2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRBRwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVkVSU0lPTl9WQ0FMRU5EQVIxMAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVkVSU0lPTl9WQ0FMRU5EQVIyMAotCi1wcml2YXRlIGFuZHJvaWQuc3luY21sLnBpbS5WUGFyc2VyIG1QYXJzZXIKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1WZXJzaW9uCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIGp1ZGdlVmVyc2lvbigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyB2ZXJpZnlWQ2FsKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9zeW5jbWwvcGltL3ZjYWxlbmRhci9WQ2FsRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBwYXJzZSgKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQuc3luY21sLnBpbS5WRGF0YUJ1aWxkZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5zeW5jbWwucGltLnZjYWxlbmRhci5WQ2FsUGFyc2VyX1YxMCBleHRlbmRzIGFuZHJvaWQuc3luY21sLnBpbS5WUGFyc2VyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNoU2V0PExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEudXRpbC5IYXNoU2V0IG1Fc2NBbGxvd2VkUHJvcHMKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0hhc2hTZXQ8TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS51dGlsLkhhc2hTZXQgbUV2dFByb3BOYW1lR3JvdXAxCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNoU2V0PExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEudXRpbC5IYXNoU2V0IG1FdnRQcm9wTmFtZUdyb3VwMgotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaE1hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS91dGlsL0hhc2hTZXQ8TGphdmEvbGFuZy9TdHJpbmc7Pjs+OyApCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuSGFzaE1hcCBtU3BlY2lhbFZhbHVlU2V0TWFwCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNoU2V0PExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEudXRpbC5IYXNoU2V0IG1WYWx1ZUNBVAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaFNldDxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuSGFzaFNldCBtVmFsdWVDTEFTUwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaFNldDxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuSGFzaFNldCBtVmFsdWVSRVMKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0hhc2hTZXQ8TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS51dGlsLkhhc2hTZXQgbVZhbHVlU1RBVAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGV4cG9ydEVudHByb3BWYWx1ZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgaW50IHBhcnNlQ2FsZW50aXRpZXMoCi1pbnQpCi0KLXByaXZhdGUgaW50IHBhcnNlQ2FsZW50aXR5KAotaW50KQotCi1wcml2YXRlIGludCBwYXJzZUNhbHByb3AoCi1pbnQpCi0KLXByaXZhdGUgaW50IHBhcnNlQ2FscHJvcDAoCi1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgaW50IHBhcnNlQ2FscHJvcDEoCi1pbnQpCi0KLXByaXZhdGUgaW50IHBhcnNlQ2FscHJvcHMoCi1pbnQpCi0KLXByaXZhdGUgaW50IHBhcnNlRW50cHJvcCgKLWludCkKLQotcHJpdmF0ZSBpbnQgcGFyc2VFbnRwcm9wMCgKLWludCkKLQotcHJpdmF0ZSBpbnQgcGFyc2VFbnRwcm9wMSgKLWludCkKLQotcHJpdmF0ZSBpbnQgcGFyc2VFbnRwcm9wcygKLWludCkKLQotcHJpdmF0ZSBpbnQgcGFyc2VFdmVudGVudGl0eSgKLWludCkKLQotcHJpdmF0ZSBpbnQgcGFyc2VLbm93blR5cGUoCi1pbnQpCi0KLXByaXZhdGUgaW50IHBhcnNlUGFyYW0oCi1pbnQpCi0KLXByaXZhdGUgaW50IHBhcnNlUGFyYW0wKAotaW50KQotCi1wcml2YXRlIGludCBwYXJzZVBhcmFtMSgKLWludCkKLQotcHJpdmF0ZSBpbnQgcGFyc2VQYXJhbTIoCi1pbnQpCi0KLXByaXZhdGUgaW50IHBhcnNlUGFyYW0zKAotaW50KQotCi1wcml2YXRlIGludCBwYXJzZVBhcmFtNCgKLWludCkKLQotcHJpdmF0ZSBpbnQgcGFyc2VQYXJhbTUoCi1pbnQpCi0KLXByaXZhdGUgaW50IHBhcnNlUGFyYW02KAotaW50KQotCi1wcml2YXRlIGludCBwYXJzZVBhcmFtNygKLWludCkKLQotcHJpdmF0ZSBpbnQgcGFyc2VQYXJhbWxpc3QoCi1pbnQpCi0KLXByaXZhdGUgaW50IHBhcnNlUGFyYW1zKAotaW50KQotCi1wcml2YXRlIGludCBwYXJzZVB0eXBldmFsKAotaW50KQotCi1wcml2YXRlIGludCBwYXJzZVJvbGVWYWwoCi1pbnQpCi0KLXByaXZhdGUgaW50IHBhcnNlU3RhdHVWYWwoCi1pbnQpCi0KLXByaXZhdGUgaW50IHBhcnNlVG9kb2VudGl0eSgKLWludCkKLQotcHJpdmF0ZSBpbnQgcGFyc2VWQ2FsKAotaW50KQotCi1wcml2YXRlIGludCBwYXJzZVZDYWxGaWxlKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1N0cmluZztMamF2YS91dGlsL0FycmF5TGlzdDxMamF2YS9sYW5nL1N0cmluZzs+OylJICkKLXByaXZhdGUgaW50IHZhbHVlRmlsdGVyKAotamF2YS5sYW5nLlN0cmluZwotamF2YS51dGlsLkFycmF5TGlzdCkKLQotcHJvdGVjdGVkIGludCBwYXJzZVZGaWxlKAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuc3luY21sLnBpbS52Y2FsZW5kYXIuVkNhbFBhcnNlcl9WMjAgZXh0ZW5kcyBhbmRyb2lkLnN5bmNtbC5waW0udmNhbGVuZGFyLlZDYWxQYXJzZXJfVjEwCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVjEwTElORUJSRUFLRVIKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0hhc2hTZXQ8TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS51dGlsLkhhc2hTZXQgYWNjZXB0YWJsZUNvbXBvbmVudHMKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0hhc2hTZXQ8TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS51dGlsLkhhc2hTZXQgYWNjZXB0YWJsZVYyMFByb3BzCi0KLXByaXZhdGUgYm9vbGVhbiBoYXNUWgotCi1wcml2YXRlIGludCBpbmRleAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmdbXSBsaW5lcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSBib29sZWFuIHBhcnNlVjIwQ2FsYm9keSgKLWphdmEubGFuZy5TdHJpbmdbXQotamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb247ICkKLXByaXZhdGUgYm9vbGVhbiBwYXJzZVYyMENvbXBvbmVudCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmdCdWlsZGVyKQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmdbXSBzcGxpdFByb3BlcnR5KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gcGFyc2UoCi1qYXZhLmlvLklucHV0U3RyZWFtCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLnN5bmNtbC5waW0uVkJ1aWxkZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPUNvbnRhY3RNZXRob2QgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvc3luY21sL3BpbS92Y2FyZC9Db250YWN0U3RydWN0OyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5zeW5jbWwucGltLnZjYXJkLkNvbnRhY3RTdHJ1Y3QkQ29udGFjdE1ldGhvZCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZGF0YQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBraW5kCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGxhYmVsCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHR5cGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3N5bmNtbC9waW0vdmNhcmQvQ29udGFjdFN0cnVjdDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPVBob25lRGF0YSApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5zeW5jbWwucGltLnZjYXJkLkNvbnRhY3RTdHJ1Y3QkUGhvbmVEYXRhIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBkYXRhCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGxhYmVsCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHR5cGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvc3luY21sL3BpbS92Y2FyZC9Db250YWN0U3RydWN0JENvbnRhY3RNZXRob2Q7TGFuZHJvaWQvc3luY21sL3BpbS92Y2FyZC9Db250YWN0U3RydWN0JFBob25lRGF0YTsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQuc3luY21sLnBpbS52Y2FyZC5Db250YWN0U3RydWN0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBjb21wYW55Ci1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL3N5bmNtbC9waW0vdmNhcmQvQ29udGFjdFN0cnVjdCRDb250YWN0TWV0aG9kOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBjb250YWN0bWV0aG9kTGlzdAotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBuYW1lCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIG5vdGVzCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL3N5bmNtbC9waW0vdmNhcmQvQ29udGFjdFN0cnVjdCRQaG9uZURhdGE7PjsgKQotcHVibGljIGphdmEudXRpbC5MaXN0IHBob25lTGlzdAotCi1wdWJsaWMgYnl0ZVtdIHBob3RvQnl0ZXMKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgcGhvdG9UeXBlCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRpdGxlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgYWRkQ29udGFjdG1ldGhvZCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIGFkZFBob25lKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnN5bmNtbC5waW0udmNhcmQuVkNhcmRDb21wb3NlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkVSU0lPTl9WQ0FSRDIxX0lOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWRVJTSU9OX1ZDQVJEMzBfSU5UCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNoTWFwPExqYXZhL2xhbmcvSW50ZWdlcjtMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuSGFzaE1hcCBlbWFpbFR5cGVNYXAKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0hhc2hTZXQ8TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS51dGlsLkhhc2hTZXQgZW1haWxUeXBlcwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaE1hcDxMamF2YS9sYW5nL0ludGVnZXI7TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS51dGlsLkhhc2hNYXAgcGhvbmVUeXBlTWFwCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNoU2V0PExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEudXRpbC5IYXNoU2V0IHBob25lVHlwZXMKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1OZXdsaW5lCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIgbVJlc3VsdAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL3N5bmNtbC9waW0vdmNhcmQvQ29udGFjdFN0cnVjdCRDb250YWN0TWV0aG9kOz47SSlWICkKLXByaXZhdGUgdm9pZCBhcHBlbmRDb250YWN0TWV0aG9kU3RyKAotamF2YS51dGlsLkxpc3QKLWludCkKLQotcHJpdmF0ZSB2b2lkIGFwcGVuZE5hbWVTdHIoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0xpc3Q8TGFuZHJvaWQvc3luY21sL3BpbS92Y2FyZC9Db250YWN0U3RydWN0JFBob25lRGF0YTs+O0kpViApCi1wcml2YXRlIHZvaWQgYXBwZW5kUGhvbmVTdHIoCi1qYXZhLnV0aWwuTGlzdAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL3N5bmNtbC9waW0vdmNhcmQvVkNhcmRFeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCBhcHBlbmRQaG90b1N0cigKLWJ5dGVbXQotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZm9sZGluZ1N0cmluZygKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGdldFBob25lVHlwZVN0cigKLWFuZHJvaWQuc3luY21sLnBpbS52Y2FyZC5Db250YWN0U3RydWN0JFBob25lRGF0YSkKLQotcHJpdmF0ZSBib29sZWFuIGlzTnVsbCgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvc3luY21sL3BpbS92Y2FyZC9WQ2FyZEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgY3JlYXRlVkNhcmQoCi1hbmRyb2lkLnN5bmNtbC5waW0udmNhcmQuQ29udGFjdFN0cnVjdAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuc3luY21sLnBpbS52Y2FyZC5WQ2FyZEV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5FeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuc3luY21sLnBpbS52Y2FyZC5WQ2FyZFBhcnNlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFZFUlNJT05fVkNBUkQyMQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWRVJTSU9OX1ZDQVJEMjFfSU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBWRVJTSU9OX1ZDQVJEMzAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkVSU0lPTl9WQ0FSRDMwX0lOVAotCi0gYW5kcm9pZC5zeW5jbWwucGltLlZQYXJzZXIgbVBhcnNlcgotCi0gamF2YS5sYW5nLlN0cmluZyBtVmVyc2lvbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgdm9pZCBqdWRnZVZlcnNpb24oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHZvaWQgc2V0VmVyc2lvbigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyB2ZXJpZnlWQ2FyZCgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvc3luY21sL3BpbS92Y2FyZC9WQ2FyZEV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gcGFyc2UoCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLnN5bmNtbC5waW0uVkRhdGFCdWlsZGVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQuc3luY21sLnBpbS52Y2FyZC5WQ2FyZFBhcnNlcl9WMjEgZXh0ZW5kcyBhbmRyb2lkLnN5bmNtbC5waW0uVlBhcnNlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaFNldDxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuSGFzaFNldCBtS25vd25UeXBlU2V0Ci1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNoU2V0PExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEudXRpbC5IYXNoU2V0IG1OYW1lCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZXNjYXBlVHJhbnNsYXRvcigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgaW50IHBhcnNlR3JvdXBzKAotaW50KQotCi1wcml2YXRlIGludCBwYXJzZUdyb3Vwc1dpdGhEb3QoCi1pbnQpCi0KLXByaXZhdGUgaW50IHBhcnNlSXRlbSgKLWludCkKLQotcHJpdmF0ZSBpbnQgcGFyc2VJdGVtMCgKLWludCkKLQotcHJpdmF0ZSBpbnQgcGFyc2VJdGVtMSgKLWludCkKLQotcHJpdmF0ZSBpbnQgcGFyc2VJdGVtMigKLWludCkKLQotcHJpdmF0ZSBpbnQgcGFyc2VJdGVtcygKLWludCkKLQotcHJpdmF0ZSBpbnQgcGFyc2VLbm93blR5cGUoCi1pbnQpCi0KLXByaXZhdGUgaW50IHBhcnNlTmFtZSgKLWludCkKLQotcHJpdmF0ZSBpbnQgcGFyc2VQVHlwZVZhbCgKLWludCkKLQotcHJpdmF0ZSBpbnQgcGFyc2VQYXJhbSgKLWludCkKLQotcHJpdmF0ZSBpbnQgcGFyc2VQYXJhbTAoCi1pbnQpCi0KLXByaXZhdGUgaW50IHBhcnNlUGFyYW0xKAotaW50KQotCi1wcml2YXRlIGludCBwYXJzZVBhcmFtMigKLWludCkKLQotcHJpdmF0ZSBpbnQgcGFyc2VQYXJhbTMoCi1pbnQpCi0KLXByaXZhdGUgaW50IHBhcnNlUGFyYW00KAotaW50KQotCi1wcml2YXRlIGludCBwYXJzZVBhcmFtNSgKLWludCkKLQotcHJpdmF0ZSBpbnQgcGFyc2VQYXJhbUxpc3QoCi1pbnQpCi0KLXByaXZhdGUgaW50IHBhcnNlUGFyYW1zKAotaW50KQotCi1wcml2YXRlIGludCBwYXJzZVZDYXJkKAotaW50KQotCi0gaW50IHBhcnNlVkNhcmRGaWxlKAotaW50KQotCi1wcm90ZWN0ZWQgaW50IHBhcnNlVkZpbGUoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC5zeW5jbWwucGltLnZjYXJkLlZDYXJkUGFyc2VyX1YzMCBleHRlbmRzIGFuZHJvaWQuc3luY21sLnBpbS52Y2FyZC5WQ2FyZFBhcnNlcl9WMjEKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBWMjFMSU5FQlJFQUtFUgotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaFNldDxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuSGFzaFNldCBhY2NlcHRhYmxlUHJvcHNXaXRoUGFyYW0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0hhc2hTZXQ8TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS51dGlsLkhhc2hTZXQgYWNjZXB0YWJsZVByb3BzV2l0aG91dFBhcmFtCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNoTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEudXRpbC5IYXNoTWFwIHByb3BWMzBUb1YyMU1hcAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1hcENvbnRlbnRsaW5lVjMwVG9WMjEoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmdbXSBzcGxpdFByb3BlcnR5KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gcGFyc2UoCi1qYXZhLmlvLklucHV0U3RyZWFtCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLnN5bmNtbC5waW0uVkJ1aWxkZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC50ZWxlcGhvbnkuQ2VsbExvY2F0aW9uIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC50ZWxlcGhvbnkuQ2VsbExvY2F0aW9uIGdldEVtcHR5KCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLnRlbGVwaG9ueS5DZWxsTG9jYXRpb24gbmV3RnJvbUJ1bmRsZSgKLWFuZHJvaWQub3MuQnVuZGxlKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgcmVxdWVzdExvY2F0aW9uVXBkYXRlKCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZmlsbEluTm90aWZpZXJCdW5kbGUoCi1hbmRyb2lkLm9zLkJ1bmRsZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnRlbGVwaG9ueS5QaG9uZU51bWJlckZvcm1hdHRpbmdUZXh0V2F0Y2hlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnRleHQuVGV4dFdhdGNoZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLkxvY2FsZSBzQ2FjaGVkTG9jYWxlCi0KLXByaXZhdGUgc3RhdGljIGludCBzRm9ybWF0VHlwZQotCi1wcml2YXRlIGJvb2xlYW4gbURlbGV0aW5nQmFja3dhcmQKLQotcHJpdmF0ZSBib29sZWFuIG1EZWxldGluZ0h5cGhlbgotCi1wcml2YXRlIGJvb2xlYW4gbUZvcm1hdHRpbmcKLQotcHJpdmF0ZSBpbnQgbUh5cGhlblN0YXJ0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgYWZ0ZXJUZXh0Q2hhbmdlZCgKLWFuZHJvaWQudGV4dC5FZGl0YWJsZSkKLQotcHVibGljIHZvaWQgYmVmb3JlVGV4dENoYW5nZWQoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBvblRleHRDaGFuZ2VkKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotaW50Ci1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnRlbGVwaG9ueS5QaG9uZU51bWJlclV0aWxzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfTkFOUAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfVU5LTk9XTgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwucmVnZXguUGF0dGVybiBHTE9CQUxfUEhPTkVfTlVNQkVSX1BBVFRFUk4KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYW5kcm9pZC51dGlsLlNwYXJzZUludEFycmF5IEtFWVBBRF9NQVAKLQotc3RhdGljIGZpbmFsIGludCBNSU5fTUFUQ0gKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZ1tdIE5BTlBfQ09VTlRSSUVTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOQU5QX1NUQVRFX0RBU0gKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5BTlBfU1RBVEVfRElHSVQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5BTlBfU1RBVEVfT05FCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOQU5QX1NUQVRFX1BMVVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFBBVVNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPQV9JbnRlcm5hdGlvbmFsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPQV9Vbmtub3duCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBXQUlUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBXSUxECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIHN0YXRpYyBjaGFyIGJjZFRvQ2hhcigKLWJ5dGUpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBjYWxsZWRQYXJ0eUJDREZyYWdtZW50VG9TdHJpbmcoCi1ieXRlW10KLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgY2FsbGVkUGFydHlCQ0RUb1N0cmluZygKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLXByaXZhdGUgc3RhdGljIGludCBjaGFyVG9CQ0QoCi1jaGFyKQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gY29tcGFyZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBjb252ZXJ0S2V5cGFkTGV0dGVyc1RvRGlnaXRzKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGV4dHJhY3ROZXR3b3JrUG9ydGlvbigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBleHRyYWN0UG9zdERpYWxQb3J0aW9uKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyB2b2lkIGZvcm1hdE5hbnBOdW1iZXIoCi1hbmRyb2lkLnRleHQuRWRpdGFibGUpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBmb3JtYXROdW1iZXIoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgZm9ybWF0TnVtYmVyKAotYW5kcm9pZC50ZXh0LkVkaXRhYmxlCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgaW50IGdldEZvcm1hdFR5cGVGb3JMb2NhbGUoCi1qYXZhLnV0aWwuTG9jYWxlKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TnVtYmVyRnJvbUludGVudCgKLWFuZHJvaWQuY29udGVudC5JbnRlbnQKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaXBwZWRSZXZlcnNlZCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgc3RhdGljIGludCBpbmRleE9mTGFzdE5ldHdvcmtDaGFyKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbnRlcm5hbENhbGxlZFBhcnR5QkNERnJhZ21lbnRUb1N0cmluZygKLWphdmEubGFuZy5TdHJpbmdCdWlsZGVyCi1ieXRlW10KLWludAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGludGVybmFsR2V0U3RyaXBwZWRSZXZlcnNlZCgKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzMTJLZXkoCi1jaGFyKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNEaWFsYWJsZSgKLWNoYXIpCi0KLXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNEaWFsYWJsZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0VtZXJnZW5jeU51bWJlcigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0dsb2JhbFBob25lTnVtYmVyKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzSVNPRGlnaXQoCi1jaGFyKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNOb25TZXBhcmF0b3IoCi1jaGFyKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNSZWFsbHlEaWFsYWJsZSgKLWNoYXIpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1N0YXJ0c1Bvc3REaWFsKAotY2hhcikKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzV2VsbEZvcm1lZFNtc0FkZHJlc3MoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHN0YXRpYyBib29sZWFuIG1hdGNoSW50bFByZWZpeCgKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtYXRjaEludGxQcmVmaXhBbmRDQygKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtYXRjaFRydW5rUHJlZml4KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wcml2YXRlIHN0YXRpYyBpbnQgbWluUG9zaXRpdmUoCi1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBieXRlW10gbmV0d29ya1BvcnRpb25Ub0NhbGxlZFBhcnR5QkNEKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBieXRlW10gbmV0d29ya1BvcnRpb25Ub0NhbGxlZFBhcnR5QkNEV2l0aExlbmd0aCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgYnl0ZVtdIG51bWJlclRvQ2FsbGVkUGFydHlCQ0QoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHN0YXRpYyBieXRlW10gbnVtYmVyVG9DYWxsZWRQYXJ0eUJDREhlbHBlcigKLWJ5dGVbXQotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHN0YXRpYyBieXRlW10gbnVtYmVyVG9DYWxsZWRQYXJ0eUJDRFdpdGhMZW5ndGgoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgc3RyaW5nRnJvbVN0cmluZ0FuZFRPQSgKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIHN0cmlwU2VwYXJhdG9ycygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyB0b0NhbGxlcklETWluTWF0Y2goCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGludCB0b2FGcm9tU3RyaW5nKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSVBob25lU3RhdGVMaXN0ZW5lciRTdHViOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JUGhvbmVTdGF0ZUxpc3RlbmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuSUludGVyZmFjZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvbkNhbGxGb3J3YXJkaW5nSW5kaWNhdG9yQ2hhbmdlZCgKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvbkNhbGxTdGF0ZUNoYW5nZWQoCi1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvbkNlbGxMb2NhdGlvbkNoYW5nZWQoCi1hbmRyb2lkLm9zLkJ1bmRsZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uRGF0YUFjdGl2aXR5KAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgb25EYXRhQ29ubmVjdGlvblN0YXRlQ2hhbmdlZCgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uTWVzc2FnZVdhaXRpbmdJbmRpY2F0b3JDaGFuZ2VkKAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uU2VydmljZVN0YXRlQ2hhbmdlZCgKLWFuZHJvaWQudGVsZXBob255LlNlcnZpY2VTdGF0ZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uU2lnbmFsU3RyZW5ndGhDaGFuZ2VkKAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAzMyBuYW1lID1TdHViICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSVBob25lU3RhdGVMaXN0ZW5lcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0lQaG9uZVN0YXRlTGlzdGVuZXIkU3R1YiRQcm94eTsgKQotcHVibGljIGFic3RyYWN0IGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JUGhvbmVTdGF0ZUxpc3RlbmVyJFN0dWIgZXh0ZW5kcyBhbmRyb2lkLm9zLkJpbmRlciBpbXBsZW1lbnRzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JUGhvbmVTdGF0ZUxpc3RlbmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVTQ1JJUFRPUgotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX29uQ2FsbEZvcndhcmRpbmdJbmRpY2F0b3JDaGFuZ2VkCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fb25DYWxsU3RhdGVDaGFuZ2VkCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fb25DZWxsTG9jYXRpb25DaGFuZ2VkCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fb25EYXRhQWN0aXZpdHkKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9vbkRhdGFDb25uZWN0aW9uU3RhdGVDaGFuZ2VkCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fb25NZXNzYWdlV2FpdGluZ0luZGljYXRvckNoYW5nZWQKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9vblNlcnZpY2VTdGF0ZUNoYW5nZWQKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9vblNpZ25hbFN0cmVuZ3RoQ2hhbmdlZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LklQaG9uZVN0YXRlTGlzdGVuZXIgYXNJbnRlcmZhY2UoCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gb25UcmFuc2FjdCgKLWludAotYW5kcm9pZC5vcy5QYXJjZWwKLWFuZHJvaWQub3MuUGFyY2VsCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdGVsZXBob255L1Bob25lU3RhdGVMaXN0ZW5lcjsgKQotIGNsYXNzIGFuZHJvaWQudGVsZXBob255LlBob25lU3RhdGVMaXN0ZW5lciQxIGV4dGVuZHMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LklQaG9uZVN0YXRlTGlzdGVuZXIkU3R1YgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLnRlbGVwaG9ueS5QaG9uZVN0YXRlTGlzdGVuZXIgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC50ZWxlcGhvbnkuUGhvbmVTdGF0ZUxpc3RlbmVyKQotCi1wdWJsaWMgdm9pZCBvbkNhbGxGb3J3YXJkaW5nSW5kaWNhdG9yQ2hhbmdlZCgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIG9uQ2FsbFN0YXRlQ2hhbmdlZCgKLWludAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgb25DZWxsTG9jYXRpb25DaGFuZ2VkKAotYW5kcm9pZC5vcy5CdW5kbGUpCi0KLXB1YmxpYyB2b2lkIG9uRGF0YUFjdGl2aXR5KAotaW50KQotCi1wdWJsaWMgdm9pZCBvbkRhdGFDb25uZWN0aW9uU3RhdGVDaGFuZ2VkKAotaW50KQotCi1wdWJsaWMgdm9pZCBvbk1lc3NhZ2VXYWl0aW5nSW5kaWNhdG9yQ2hhbmdlZCgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIG9uU2VydmljZVN0YXRlQ2hhbmdlZCgKLWFuZHJvaWQudGVsZXBob255LlNlcnZpY2VTdGF0ZSkKLQotcHVibGljIHZvaWQgb25TaWduYWxTdHJlbmd0aENoYW5nZWQoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdGVsZXBob255L1Bob25lU3RhdGVMaXN0ZW5lcjsgKQotIGNsYXNzIGFuZHJvaWQudGVsZXBob255LlBob25lU3RhdGVMaXN0ZW5lciQyIGV4dGVuZHMgYW5kcm9pZC5vcy5IYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQudGVsZXBob255LlBob25lU3RhdGVMaXN0ZW5lciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLnRlbGVwaG9ueS5QaG9uZVN0YXRlTGlzdGVuZXIpCi0KLXB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC50ZWxlcGhvbnkuUGhvbmVTdGF0ZUxpc3RlbmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMSVNURU5fQ0FMTF9GT1JXQVJESU5HX0lORElDQVRPUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMSVNURU5fQ0FMTF9TVEFURQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMSVNURU5fQ0VMTF9MT0NBVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMSVNURU5fREFUQV9BQ1RJVklUWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMSVNURU5fREFUQV9DT05ORUNUSU9OX1NUQVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExJU1RFTl9NRVNTQUdFX1dBSVRJTkdfSU5ESUNBVE9SCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExJU1RFTl9OT05FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExJU1RFTl9TRVJWSUNFX1NUQVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExJU1RFTl9TSUdOQUxfU1RSRU5HVEgKLQotIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JUGhvbmVTdGF0ZUxpc3RlbmVyIGNhbGxiYWNrCi0KLSBhbmRyb2lkLm9zLkhhbmRsZXIgbUhhbmRsZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCBvbkNhbGxGb3J3YXJkaW5nSW5kaWNhdG9yQ2hhbmdlZCgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIG9uQ2FsbFN0YXRlQ2hhbmdlZCgKLWludAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgb25DZWxsTG9jYXRpb25DaGFuZ2VkKAotYW5kcm9pZC50ZWxlcGhvbnkuQ2VsbExvY2F0aW9uKQotCi1wdWJsaWMgdm9pZCBvbkRhdGFBY3Rpdml0eSgKLWludCkKLQotcHVibGljIHZvaWQgb25EYXRhQ29ubmVjdGlvblN0YXRlQ2hhbmdlZCgKLWludCkKLQotcHVibGljIHZvaWQgb25NZXNzYWdlV2FpdGluZ0luZGljYXRvckNoYW5nZWQoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBvblNlcnZpY2VTdGF0ZUNoYW5nZWQoCi1hbmRyb2lkLnRlbGVwaG9ueS5TZXJ2aWNlU3RhdGUpCi0KLXB1YmxpYyB2b2lkIG9uU2lnbmFsU3RyZW5ndGhDaGFuZ2VkKAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3RlbGVwaG9ueS9TZXJ2aWNlU3RhdGU7ICkKLWZpbmFsIGNsYXNzIGFuZHJvaWQudGVsZXBob255LlNlcnZpY2VTdGF0ZSQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGFuZHJvaWQudGVsZXBob255LlNlcnZpY2VTdGF0ZSBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIGFuZHJvaWQudGVsZXBob255LlNlcnZpY2VTdGF0ZVtdIG5ld0FycmF5KAotaW50KQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdFtdIG5ld0FycmF5KAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQudGVsZXBob255LlNlcnZpY2VTdGF0ZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I8TGFuZHJvaWQvdGVsZXBob255L1NlcnZpY2VTdGF0ZTs+OyApCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yIENSRUFUT1IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfRU1FUkdFTkNZX09OTFkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfSU5fU0VSVklDRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9PVVRfT0ZfU0VSVklDRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9QT1dFUl9PRkYKLQotcHJpdmF0ZSBib29sZWFuIG1Jc01hbnVhbE5ldHdvcmtTZWxlY3Rpb24KLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1PcGVyYXRvckFscGhhTG9uZwotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbU9wZXJhdG9yQWxwaGFTaG9ydAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbU9wZXJhdG9yTnVtZXJpYwotCi1wcml2YXRlIGJvb2xlYW4gbVJvYW1pbmcKLQotcHJpdmF0ZSBpbnQgbVN0YXRlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC50ZWxlcGhvbnkuU2VydmljZVN0YXRlKQotCi1wcml2YXRlIHN0YXRpYyBib29sZWFuIGVxdWFsc0hhbmRsZXNOdWxscygKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC50ZWxlcGhvbnkuU2VydmljZVN0YXRlIG5ld0Zyb21CdW5kbGUoCi1hbmRyb2lkLm9zLkJ1bmRsZSkKLQotcHJpdmF0ZSB2b2lkIHNldEZyb21Ob3RpZmllckJ1bmRsZSgKLWFuZHJvaWQub3MuQnVuZGxlKQotCi1wcm90ZWN0ZWQgdm9pZCBjb3B5RnJvbSgKLWFuZHJvaWQudGVsZXBob255LlNlcnZpY2VTdGF0ZSkKLQotcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHZvaWQgZmlsbEluTm90aWZpZXJCdW5kbGUoCi1hbmRyb2lkLm9zLkJ1bmRsZSkKLQotcHVibGljIGJvb2xlYW4gZ2V0SXNNYW51YWxTZWxlY3Rpb24oKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRPcGVyYXRvckFscGhhTG9uZygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE9wZXJhdG9yQWxwaGFTaG9ydCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE9wZXJhdG9yTnVtZXJpYygpCi0KLXB1YmxpYyBib29sZWFuIGdldFJvYW1pbmcoKQotCi1wdWJsaWMgaW50IGdldFN0YXRlKCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLXB1YmxpYyB2b2lkIHNldElzTWFudWFsU2VsZWN0aW9uKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0T3BlcmF0b3JOYW1lKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0Um9hbWluZygKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldFN0YXRlKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRTdGF0ZU9mZigpCi0KLXB1YmxpYyB2b2lkIHNldFN0YXRlT3V0T2ZTZXJ2aWNlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1wdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnRlbGVwaG9ueS5UZWxlcGhvbnlNYW5hZ2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQUxMX1NUQVRFX0lETEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FMTF9TVEFURV9PRkZIT09LCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBTExfU1RBVEVfUklOR0lORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBEQVRBX0FDVElWSVRZX0lOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERBVEFfQUNUSVZJVFlfSU5PVVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREFUQV9BQ1RJVklUWV9OT05FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERBVEFfQUNUSVZJVFlfT1VUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERBVEFfQ09OTkVDVEVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERBVEFfQ09OTkVDVElORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBEQVRBX0RJU0NPTk5FQ1RFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBEQVRBX1NVU1BFTkRFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBORVRXT1JLX1RZUEVfRURHRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBORVRXT1JLX1RZUEVfR1BSUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBORVRXT1JLX1RZUEVfVU1UUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBORVRXT1JLX1RZUEVfVU5LTk9XTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQSE9ORV9UWVBFX0dTTQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQSE9ORV9UWVBFX05PTkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0lNX1NUQVRFX0FCU0VOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSU1fU1RBVEVfTkVUV09SS19MT0NLRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0lNX1NUQVRFX1BJTl9SRVFVSVJFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSU1fU1RBVEVfUFVLX1JFUVVJUkVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJTV9TVEFURV9SRUFEWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSU1fU1RBVEVfVU5LTk9XTgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRBRwotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLnRlbGVwaG9ueS5UZWxlcGhvbnlNYW5hZ2VyIHNJbnN0YW5jZQotCi1wcml2YXRlIGFuZHJvaWQuY29udGVudC5Db250ZXh0IG1Db250ZXh0Ci0KLXByaXZhdGUgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LklUZWxlcGhvbnlSZWdpc3RyeSBtUmVnaXN0cnkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLnRlbGVwaG9ueS5UZWxlcGhvbnlNYW5hZ2VyIGdldERlZmF1bHQoKQotCi1wcml2YXRlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JVGVsZXBob255IGdldElUZWxlcGhvbnkoKQotCi1wcml2YXRlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JUGhvbmVTdWJJbmZvIGdldFN1YnNjcmliZXJJbmZvKCkKLQotcHVibGljIHZvaWQgZGlzYWJsZUxvY2F0aW9uVXBkYXRlcygpCi0KLXB1YmxpYyB2b2lkIGVuYWJsZUxvY2F0aW9uVXBkYXRlcygpCi0KLXB1YmxpYyBpbnQgZ2V0Q2FsbFN0YXRlKCkKLQotcHVibGljIGFuZHJvaWQudGVsZXBob255LkNlbGxMb2NhdGlvbiBnZXRDZWxsTG9jYXRpb24oKQotCi1wdWJsaWMgaW50IGdldERhdGFBY3Rpdml0eSgpCi0KLXB1YmxpYyBpbnQgZ2V0RGF0YVN0YXRlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RGV2aWNlSWQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXREZXZpY2VTb2Z0d2FyZVZlcnNpb24oKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRMaW5lMUFscGhhVGFnKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TGluZTFOdW1iZXIoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXROZXR3b3JrQ291bnRyeUlzbygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE5ldHdvcmtPcGVyYXRvcigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE5ldHdvcmtPcGVyYXRvck5hbWUoKQotCi1wdWJsaWMgaW50IGdldE5ldHdvcmtUeXBlKCkKLQotcHVibGljIGludCBnZXRQaG9uZVR5cGUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTaW1Db3VudHJ5SXNvKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U2ltT3BlcmF0b3IoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTaW1PcGVyYXRvck5hbWUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTaW1TZXJpYWxOdW1iZXIoKQotCi1wdWJsaWMgaW50IGdldFNpbVN0YXRlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3Vic2NyaWJlcklkKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Vm9pY2VNYWlsQWxwaGFUYWcoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRWb2ljZU1haWxOdW1iZXIoKQotCi1wdWJsaWMgYm9vbGVhbiBpc05ldHdvcmtSb2FtaW5nKCkKLQotcHVibGljIHZvaWQgbGlzdGVuKAotYW5kcm9pZC50ZWxlcGhvbnkuUGhvbmVTdGF0ZUxpc3RlbmVyCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC50ZWxlcGhvbnkuZ3NtLkdzbUNlbGxMb2NhdGlvbiBleHRlbmRzIGFuZHJvaWQudGVsZXBob255LkNlbGxMb2NhdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGludCBtQ2lkCi0KLXByaXZhdGUgaW50IG1MYWMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLkJ1bmRsZSkKLQotcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlcXVhbHNIYW5kbGVzTnVsbHMoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgdm9pZCBmaWxsSW5Ob3RpZmllckJ1bmRsZSgKLWFuZHJvaWQub3MuQnVuZGxlKQotCi1wdWJsaWMgaW50IGdldENpZCgpCi0KLXB1YmxpYyBpbnQgZ2V0TGFjKCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLXB1YmxpYyB2b2lkIHNldExhY0FuZENpZCgKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRTdGF0ZUludmFsaWQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi0gY2xhc3MgYW5kcm9pZC50ZWxlcGhvbnkuZ3NtLlNtc0FkZHJlc3MgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBmaW5hbCBpbnQgT0ZGU0VUX0FERFJFU1NfTEVOR1RICi0KLXN0YXRpYyBmaW5hbCBpbnQgT0ZGU0VUX0FERFJFU1NfVkFMVUUKLQotc3RhdGljIGZpbmFsIGludCBPRkZTRVRfVE9BCi0KLXN0YXRpYyBmaW5hbCBpbnQgVE9OX0FMUEhBTlVNRVJJQwotCi1zdGF0aWMgZmluYWwgaW50IFRPTl9BUFBSRVZJQVRFRAotCi1zdGF0aWMgZmluYWwgaW50IFRPTl9JTlRFUk5BVElPTkFMCi0KLXN0YXRpYyBmaW5hbCBpbnQgVE9OX05BVElPTkFMCi0KLXN0YXRpYyBmaW5hbCBpbnQgVE9OX05FVFdPUksKLQotc3RhdGljIGZpbmFsIGludCBUT05fU1VCU0NSSUJFUgotCi1zdGF0aWMgZmluYWwgaW50IFRPTl9VTktOT1dOCi0KLSBqYXZhLmxhbmcuU3RyaW5nIGFkZHJlc3MKLQotIGJ5dGVbXSBvcmlnQnl0ZXMKLQotIGludCB0b24KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1ieXRlW10KLWludAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBjb3VsZEJlRW1haWxHYXRld2F5KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QWRkcmVzc1N0cmluZygpCi0KLXB1YmxpYyBib29sZWFuIGlzQWxwaGFudW1lcmljKCkKLQotcHVibGljIGJvb2xlYW4gaXNDcGhzVm9pY2VNZXNzYWdlQ2xlYXIoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0NwaHNWb2ljZU1lc3NhZ2VJbmRpY2F0b3JBZGRyZXNzKCkKLQotcHVibGljIGJvb2xlYW4gaXNDcGhzVm9pY2VNZXNzYWdlU2V0KCkKLQotcHVibGljIGJvb2xlYW4gaXNOZXR3b3JrU3BlY2lmaWMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQudGVsZXBob255LmdzbS5TbXNNYW5hZ2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNVTFRfRVJST1JfR0VORVJJQ19GQUlMVVJFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1VMVF9FUlJPUl9OT19TRVJWSUNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1VMVF9FUlJPUl9OVUxMX1BEVQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNVTFRfRVJST1JfUkFESU9fT0ZGCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19PTl9TSU1fRlJFRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfT05fU0lNX1JFQUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX09OX1NJTV9TRU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19PTl9TSU1fVU5SRUFECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19PTl9TSU1fVU5TRU5UCi0KLXByaXZhdGUgc3RhdGljIGFuZHJvaWQudGVsZXBob255LmdzbS5TbXNNYW5hZ2VyIHNJbnN0YW5jZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0xpc3Q7KUxqYXZhL3V0aWwvQXJyYXlMaXN0PExhbmRyb2lkL3RlbGVwaG9ueS9nc20vU21zTWVzc2FnZTs+OyApCi1wcml2YXRlIGphdmEudXRpbC5BcnJheUxpc3QgY3JlYXRlTWVzc2FnZUxpc3RGcm9tUmF3UmVjb3JkcygKLWphdmEudXRpbC5MaXN0KQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQudGVsZXBob255LmdzbS5TbXNNYW5hZ2VyIGdldERlZmF1bHQoKQotCi1wcml2YXRlIHZvaWQgc2VuZFJhd1BkdSgKLWJ5dGVbXQotYnl0ZVtdCi1hbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50Ci1hbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50KQotCi1wdWJsaWMgYm9vbGVhbiBjb3B5TWVzc2FnZVRvU2ltKAotYnl0ZVtdCi1ieXRlW10KLWludCkKLQotcHVibGljIGJvb2xlYW4gZGVsZXRlTWVzc2FnZUZyb21TaW0oCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS91dGlsL0FycmF5TGlzdDxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wdWJsaWMgamF2YS51dGlsLkFycmF5TGlzdCBkaXZpZGVNZXNzYWdlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvQXJyYXlMaXN0PExhbmRyb2lkL3RlbGVwaG9ueS9nc20vU21zTWVzc2FnZTs+OyApCi1wdWJsaWMgamF2YS51dGlsLkFycmF5TGlzdCBnZXRBbGxNZXNzYWdlc0Zyb21TaW0oKQotCi1wdWJsaWMgdm9pZCBzZW5kRGF0YU1lc3NhZ2UoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1zaG9ydAotYnl0ZVtdCi1hbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50Ci1hbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZztMamF2YS91dGlsL0FycmF5TGlzdDxMamF2YS9sYW5nL1N0cmluZzs+O0xqYXZhL3V0aWwvQXJyYXlMaXN0PExhbmRyb2lkL2FwcC9QZW5kaW5nSW50ZW50Oz47TGphdmEvdXRpbC9BcnJheUxpc3Q8TGFuZHJvaWQvYXBwL1BlbmRpbmdJbnRlbnQ7PjspViApCi1wdWJsaWMgdm9pZCBzZW5kTXVsdGlwYXJ0VGV4dE1lc3NhZ2UoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnV0aWwuQXJyYXlMaXN0Ci1qYXZhLnV0aWwuQXJyYXlMaXN0Ci1qYXZhLnV0aWwuQXJyYXlMaXN0KQotCi1wdWJsaWMgdm9pZCBzZW5kVGV4dE1lc3NhZ2UoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50Ci1hbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50KQotCi1wdWJsaWMgYm9vbGVhbiB1cGRhdGVNZXNzYWdlT25TaW0oCi1pbnQKLWludAotYnl0ZVtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3RlbGVwaG9ueS9nc20vU21zTWVzc2FnZTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNjQwOSBuYW1lID1NZXNzYWdlQ2xhc3MgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvRW51bTxMYW5kcm9pZC90ZWxlcGhvbnkvZ3NtL1Ntc01lc3NhZ2UkTWVzc2FnZUNsYXNzOz47ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLnRlbGVwaG9ueS5nc20uU21zTWVzc2FnZSRNZXNzYWdlQ2xhc3MgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnRlbGVwaG9ueS5nc20uU21zTWVzc2FnZSRNZXNzYWdlQ2xhc3NbXSAkVkFMVUVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC50ZWxlcGhvbnkuZ3NtLlNtc01lc3NhZ2UkTWVzc2FnZUNsYXNzIENMQVNTXzAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnRlbGVwaG9ueS5nc20uU21zTWVzc2FnZSRNZXNzYWdlQ2xhc3MgQ0xBU1NfMQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudGVsZXBob255LmdzbS5TbXNNZXNzYWdlJE1lc3NhZ2VDbGFzcyBDTEFTU18yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC50ZWxlcGhvbnkuZ3NtLlNtc01lc3NhZ2UkTWVzc2FnZUNsYXNzIENMQVNTXzMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnRlbGVwaG9ueS5nc20uU21zTWVzc2FnZSRNZXNzYWdlQ2xhc3MgVU5LTk9XTgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVYgKQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLnRlbGVwaG9ueS5nc20uU21zTWVzc2FnZSRNZXNzYWdlQ2xhc3MgdmFsdWVPZigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC50ZWxlcGhvbnkuZ3NtLlNtc01lc3NhZ2UkTWVzc2FnZUNsYXNzW10gdmFsdWVzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9UGR1UGFyc2VyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3RlbGVwaG9ueS9nc20vU21zTWVzc2FnZTsgKQotIGNsYXNzIGFuZHJvaWQudGVsZXBob255LmdzbS5TbXNNZXNzYWdlJFBkdVBhcnNlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGludCBjdXIKLQotIGludCBtVXNlckRhdGFTZXB0ZXRQYWRkaW5nCi0KLSBpbnQgbVVzZXJEYXRhU2l6ZQotCi0gYnl0ZVtdIHBkdQotCi0gYnl0ZVtdIHVzZXJEYXRhCi0KLSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlNtc0hlYWRlciB1c2VyRGF0YUhlYWRlcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLSB2b2lkIDxpbml0PigKLWJ5dGVbXSkKLQotIGludCBjb25zdHJ1Y3RVc2VyRGF0YSgKLWJvb2xlYW4KLWJvb2xlYW4pCi0KLSBhbmRyb2lkLnRlbGVwaG9ueS5nc20uU21zQWRkcmVzcyBnZXRBZGRyZXNzKCkKLQotIGludCBnZXRCeXRlKCkKLQotIGphdmEubGFuZy5TdHJpbmcgZ2V0U0NBZGRyZXNzKCkKLQotIGxvbmcgZ2V0U0NUaW1lc3RhbXBNaWxsaXMoKQotCi0gYnl0ZVtdIGdldFVzZXJEYXRhKCkKLQotIGphdmEubGFuZy5TdHJpbmcgZ2V0VXNlckRhdGFHU003Qml0KAotaW50KQotCi0gY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5TbXNIZWFkZXIgZ2V0VXNlckRhdGFIZWFkZXIoKQotCi0gaW50IGdldFVzZXJEYXRhU2VwdGV0UGFkZGluZygpCi0KLSBqYXZhLmxhbmcuU3RyaW5nIGdldFVzZXJEYXRhVUNTMigKLWludCkKLQotIGJvb2xlYW4gbW9yZURhdGFQcmVzZW50KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC90ZWxlcGhvbnkvZ3NtL1Ntc01lc3NhZ2U7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1TdWJtaXRQZHUgKQotcHVibGljIGNsYXNzIGFuZHJvaWQudGVsZXBob255LmdzbS5TbXNNZXNzYWdlJFN1Ym1pdFBkdSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGJ5dGVbXSBlbmNvZGVkTWVzc2FnZQotCi1wdWJsaWMgYnl0ZVtdIGVuY29kZWRTY0FkZHJlc3MKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC90ZWxlcGhvbnkvZ3NtL1Ntc01lc3NhZ2UkUGR1UGFyc2VyO0xhbmRyb2lkL3RlbGVwaG9ueS9nc20vU21zTWVzc2FnZSRTdWJtaXRQZHU7TGFuZHJvaWQvdGVsZXBob255L2dzbS9TbXNNZXNzYWdlJE1lc3NhZ2VDbGFzczsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQudGVsZXBob255LmdzbS5TbXNNZXNzYWdlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkNPRElOR18xNkJJVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkNPRElOR183QklUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOQ09ESU5HXzhCSVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5DT0RJTkdfVU5LTk9XTgotCi1zdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMT0dfVEFHCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9VU0VSX0RBVEFfQllURVMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9VU0VSX0RBVEFfQllURVNfV0lUSF9IRUFERVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1VTRVJfREFUQV9TRVBURVRTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9VU0VSX0RBVEFfU0VQVEVUU19XSVRIX0hFQURFUgotCi0gYm9vbGVhbiBhdXRvbWF0aWNEZWxldGlvbgotCi0gaW50IGRhdGFDb2RpbmdTY2hlbWUKLQotIGxvbmcgZGlzY2hhcmdlVGltZU1pbGxpcwotCi0gamF2YS5sYW5nLlN0cmluZyBlbWFpbEJvZHkKLQotIGphdmEubGFuZy5TdHJpbmcgZW1haWxGcm9tCi0KLSBib29sZWFuIGZvclN1Ym1pdAotCi0gaW50IGluZGV4T25TaW0KLQotIGJvb2xlYW4gaXNFbWFpbAotCi1wcml2YXRlIGJvb2xlYW4gaXNNd2kKLQotIGJvb2xlYW4gaXNTdGF0dXNSZXBvcnRNZXNzYWdlCi0KLSBieXRlW10gbVBkdQotCi0gamF2YS5sYW5nLlN0cmluZyBtZXNzYWdlQm9keQotCi0gYW5kcm9pZC50ZWxlcGhvbnkuZ3NtLlNtc01lc3NhZ2UkTWVzc2FnZUNsYXNzIG1lc3NhZ2VDbGFzcwotCi1wdWJsaWMgaW50IG1lc3NhZ2VSZWYKLQotIGludCBtdGkKLQotcHJpdmF0ZSBib29sZWFuIG13aURvbnRTdG9yZQotCi1wcml2YXRlIGJvb2xlYW4gbXdpU2Vuc2UKLQotIGFuZHJvaWQudGVsZXBob255LmdzbS5TbXNBZGRyZXNzIG9yaWdpbmF0aW5nQWRkcmVzcwotCi0gaW50IHByb3RvY29sSWRlbnRpZmllcgotCi0gamF2YS5sYW5nLlN0cmluZyBwc2V1ZG9TdWJqZWN0Ci0KLSBhbmRyb2lkLnRlbGVwaG9ueS5nc20uU21zQWRkcmVzcyByZWNpcGllbnRBZGRyZXNzCi0KLSBib29sZWFuIHJlcGx5UGF0aFByZXNlbnQKLQotIGphdmEubGFuZy5TdHJpbmcgc2NBZGRyZXNzCi0KLSBsb25nIHNjVGltZU1pbGxpcwotCi0gaW50IHN0YXR1cwotCi0gaW50IHN0YXR1c09uU2ltCi0KLSBieXRlW10gdXNlckRhdGEKLQotIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uU21zSGVhZGVyIHVzZXJEYXRhSGVhZGVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBpbnRbXSBjYWxjdWxhdGVMZW5ndGgoCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQudGVsZXBob255LmdzbS5TbXNNZXNzYWdlIGNyZWF0ZUZyb21FZlJlY29yZCgKLWludAotYnl0ZVtdKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQudGVsZXBob255LmdzbS5TbXNNZXNzYWdlIGNyZWF0ZUZyb21QZHUoCi1ieXRlW10pCi0KLXByaXZhdGUgdm9pZCBleHRyYWN0RW1haWxBZGRyZXNzRnJvbU1lc3NhZ2VCb2R5KCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLnRlbGVwaG9ueS5nc20uU21zTWVzc2FnZSRTdWJtaXRQZHUgZ2V0U3VibWl0UGR1KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLnRlbGVwaG9ueS5nc20uU21zTWVzc2FnZSRTdWJtaXRQZHUgZ2V0U3VibWl0UGR1KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbgotYnl0ZVtdKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQudGVsZXBob255LmdzbS5TbXNNZXNzYWdlJFN1Ym1pdFBkdSBnZXRTdWJtaXRQZHUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1zaG9ydAotYnl0ZVtdCi1ib29sZWFuKQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSBnZXRTdWJtaXRQZHVIZWFkKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotYnl0ZQotYm9vbGVhbgotYW5kcm9pZC50ZWxlcGhvbnkuZ3NtLlNtc01lc3NhZ2UkU3VibWl0UGR1KQotCi1wdWJsaWMgc3RhdGljIGludCBnZXRUUExheWVyTGVuZ3RoRm9yUERVKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLnRlbGVwaG9ueS5nc20uU21zTWVzc2FnZSBuZXdGcm9tQ0RTKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLnRlbGVwaG9ueS5nc20uU21zTWVzc2FnZSBuZXdGcm9tQ01UKAotamF2YS5sYW5nLlN0cmluZ1tdKQotCi1zdGF0aWMgYW5kcm9pZC50ZWxlcGhvbnkuZ3NtLlNtc01lc3NhZ2UgbmV3RnJvbUNNVEkoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHZvaWQgcGFyc2VNZXNzYWdlQm9keSgpCi0KLXByaXZhdGUgdm9pZCBwYXJzZVBkdSgKLWJ5dGVbXSkKLQotcHJpdmF0ZSB2b2lkIHBhcnNlU21zRGVsaXZlcigKLWFuZHJvaWQudGVsZXBob255LmdzbS5TbXNNZXNzYWdlJFBkdVBhcnNlcgotaW50KQotCi1wcml2YXRlIHZvaWQgcGFyc2VTbXNTdGF0dXNSZXBvcnQoCi1hbmRyb2lkLnRlbGVwaG9ueS5nc20uU21zTWVzc2FnZSRQZHVQYXJzZXIKLWludCkKLQotcHJpdmF0ZSB2b2lkIHBhcnNlVXNlckRhdGEoCi1hbmRyb2lkLnRlbGVwaG9ueS5nc20uU21zTWVzc2FnZSRQZHVQYXJzZXIKLWJvb2xlYW4pCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldERpc3BsYXlNZXNzYWdlQm9keSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldERpc3BsYXlPcmlnaW5hdGluZ0FkZHJlc3MoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRFbWFpbEJvZHkoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRFbWFpbEZyb20oKQotCi1wdWJsaWMgaW50IGdldEluZGV4T25TaW0oKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRNZXNzYWdlQm9keSgpCi0KLXB1YmxpYyBhbmRyb2lkLnRlbGVwaG9ueS5nc20uU21zTWVzc2FnZSRNZXNzYWdlQ2xhc3MgZ2V0TWVzc2FnZUNsYXNzKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0T3JpZ2luYXRpbmdBZGRyZXNzKCkKLQotcHVibGljIGJ5dGVbXSBnZXRQZHUoKQotCi1wdWJsaWMgaW50IGdldFByb3RvY29sSWRlbnRpZmllcigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFBzZXVkb1N1YmplY3QoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTZXJ2aWNlQ2VudGVyQWRkcmVzcygpCi0KLXB1YmxpYyBpbnQgZ2V0U3RhdHVzKCkKLQotcHVibGljIGludCBnZXRTdGF0dXNPblNpbSgpCi0KLXB1YmxpYyBsb25nIGdldFRpbWVzdGFtcE1pbGxpcygpCi0KLXB1YmxpYyBieXRlW10gZ2V0VXNlckRhdGEoKQotCi1wdWJsaWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5TbXNIZWFkZXIgZ2V0VXNlckRhdGFIZWFkZXIoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0NwaHNNd2lNZXNzYWdlKCkKLQotcHVibGljIGJvb2xlYW4gaXNFbWFpbCgpCi0KLXB1YmxpYyBib29sZWFuIGlzTVdJQ2xlYXJNZXNzYWdlKCkKLQotcHVibGljIGJvb2xlYW4gaXNNV0lTZXRNZXNzYWdlKCkKLQotcHVibGljIGJvb2xlYW4gaXNNd2lEb250U3RvcmUoKQotCi1wdWJsaWMgYm9vbGVhbiBpc1JlcGxhY2UoKQotCi1wdWJsaWMgYm9vbGVhbiBpc1JlcGx5UGF0aFByZXNlbnQoKQotCi1wdWJsaWMgYm9vbGVhbiBpc1N0YXR1c1JlcG9ydE1lc3NhZ2UoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2UgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIGFuZHJvaWQuY29udGVudC5Db250ZXh0IG1Db250ZXh0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5Db250ZXh0IGdldENvbnRleHQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL0NsYXNzPCo+OylWICkKLXByb3RlY3RlZCB2b2lkIHNjcnViQ2xhc3MoCi1qYXZhLmxhbmcuQ2xhc3MpCi0KLXB1YmxpYyB2b2lkIHNldENvbnRleHQoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpCi0KLXB1YmxpYyB2b2lkIHRlc3RBbmRyb2lkVGVzdENhc2VTZXR1cFByb3Blcmx5KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0ICh2YWx1ZSA9TGphdmEvbGFuZy9hbm5vdGF0aW9uL0VsZW1lbnRUeXBlOyFNRVRIT0QgKQotQGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbiAodmFsdWUgPUxqYXZhL2xhbmcvYW5ub3RhdGlvbi9SZXRlbnRpb25Qb2xpY3k7IVJVTlRJTUUgKQotQGRhbHZpay5hbm5vdGF0aW9uLkFubm90YXRpb25EZWZhdWx0ICh2YWx1ZSA9TGFuZHJvaWQvdGVzdC9GbGFreVRlc3Q7Olt0b2xlcmFuY2UgPTFdICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC50ZXN0LkZsYWt5VGVzdCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IGludCB0b2xlcmFuY2UoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLSBjbGFzcyBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdENhc2UkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmxhbmcuUnVubmFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RDYXNlIHRoaXMkMAotCi1maW5hbCBqYXZhLmxhbmcuVGhyb3dhYmxlW10gdmFsJGV4Y2VwdGlvbnMKLQotZmluYWwgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIHZhbCR0ZXN0TWV0aG9kCi0KLWZpbmFsIGludCB2YWwkdG9sZXJhbmNlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RDYXNlCi1qYXZhLmxhbmcucmVmbGVjdC5NZXRob2QKLWludAotamF2YS5sYW5nLlRocm93YWJsZVtdKQotCi1wdWJsaWMgdm9pZCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0Q2FzZSBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbiBtSW5zdHJ1bWVudGF0aW9uCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL1Rocm93YWJsZTsgKQotc3RhdGljIHZvaWQgYWNjZXNzJDAwMCgKLWFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0Q2FzZQotamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9UaHJvd2FibGU7ICkKLXByaXZhdGUgdm9pZCBydW5NZXRob2QoCi1qYXZhLmxhbmcucmVmbGVjdC5NZXRob2QKLWludCkKLQotcHVibGljIGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbiBnZXRJbnN0cnVtZW50YXRpb24oKQotCi1wdWJsaWMgdm9pZCBpbmplY3RJbnNydW1lbnRhdGlvbigKLWFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMYW5kcm9pZC9hcHAvQWN0aXZpdHk7PihMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL0NsYXNzPFRUOz47TGFuZHJvaWQvb3MvQnVuZGxlOylUVDsgKQotcHVibGljIGZpbmFsIGFuZHJvaWQuYXBwLkFjdGl2aXR5IGxhdW5jaEFjdGl2aXR5KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLkNsYXNzCi1hbmRyb2lkLm9zLkJ1bmRsZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL1Rocm93YWJsZTsgKQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpCi0KLXB1YmxpYyB2b2lkIHNlbmRLZXlzKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHRyYW5zaWVudCB2b2lkIHNlbmRLZXlzKAotaW50W10pCi0KLXB1YmxpYyB0cmFuc2llbnQgdm9pZCBzZW5kUmVwZWF0ZWRLZXlzKAotaW50W10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9FeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFN1aXRlIGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbiBtSW5zdHJ1bWVudGF0aW9uCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuQ2xhc3MKLWFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbikKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uKQotCi1wdWJsaWMgdm9pZCBhZGRUZXN0U3VpdGUoCi1qYXZhLmxhbmcuQ2xhc3MpCi0KLXB1YmxpYyB2b2lkIHJ1blRlc3QoCi1qdW5pdC5mcmFtZXdvcmsuVGVzdAotanVuaXQuZnJhbWV3b3JrLlRlc3RSZXN1bHQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdGVzdC9QZXJmb3JtYW5jZVRlc3RDYXNlOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9SW50ZXJtZWRpYXRlcyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQudGVzdC5QZXJmb3JtYW5jZVRlc3RDYXNlJEludGVybWVkaWF0ZXMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgYWRkSW50ZXJtZWRpYXRlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IHZvaWQgYWRkSW50ZXJtZWRpYXRlKAotamF2YS5sYW5nLlN0cmluZwotbG9uZykKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZmluaXNoVGltaW5nKAotYm9vbGVhbikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0SW50ZXJuYWxJdGVyYXRpb25zKAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdGFydFRpbWluZygKLWJvb2xlYW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC90ZXN0L1BlcmZvcm1hbmNlVGVzdENhc2UkSW50ZXJtZWRpYXRlczsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLnRlc3QuUGVyZm9ybWFuY2VUZXN0Q2FzZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1BlcmZvcm1hbmNlT25seSgpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgc3RhcnRQZXJmb3JtYW5jZSgKLWFuZHJvaWQudGVzdC5QZXJmb3JtYW5jZVRlc3RDYXNlJEludGVybWVkaWF0ZXMpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbiAodmFsdWUgPUxqYXZhL2xhbmcvYW5ub3RhdGlvbi9SZXRlbnRpb25Qb2xpY3k7IVJVTlRJTUUgKQotQGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldCAodmFsdWUgPUxqYXZhL2xhbmcvYW5ub3RhdGlvbi9FbGVtZW50VHlwZTshTUVUSE9EICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC50ZXN0LlVpVGhyZWFkVGVzdCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uICh2YWx1ZSA9TGphdmEvbGFuZy9hbm5vdGF0aW9uL1JldGVudGlvblBvbGljeTshUlVOVElNRSApCi1AamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0ICh2YWx1ZSA9TGphdmEvbGFuZy9hbm5vdGF0aW9uL0VsZW1lbnRUeXBlOyFNRVRIT0RMamF2YS9sYW5nL2Fubm90YXRpb24vRWxlbWVudFR5cGU7IVRZUEUgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21va2UgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldCAodmFsdWUgPUxqYXZhL2xhbmcvYW5ub3RhdGlvbi9FbGVtZW50VHlwZTshTUVUSE9ETGphdmEvbGFuZy9hbm5vdGF0aW9uL0VsZW1lbnRUeXBlOyFUWVBFICkKLUBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb24gKHZhbHVlID1MamF2YS9sYW5nL2Fubm90YXRpb24vUmV0ZW50aW9uUG9saWN5OyFSVU5USU1FICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlN1cHByZXNzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9NDEwNCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3RleHQvQWx0ZXJlZENoYXJTZXF1ZW5jZTsgKQotIGNsYXNzIGFuZHJvaWQudGV4dC5BbHRlcmVkQ2hhclNlcXVlbmNlJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC50ZXh0LkdldENoYXJzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5DaGFyU2VxdWVuY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnZXRDaGFycygKLWludAotaW50Ci1jaGFyW10KLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3RleHQvQWx0ZXJlZENoYXJTZXF1ZW5jZSQxO0xhbmRyb2lkL3RleHQvQWx0ZXJlZENoYXJTZXF1ZW5jZSRBbHRlcmVkU3Bhbm5lZDsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQudGV4dC5BbHRlcmVkQ2hhclNlcXVlbmNlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5DaGFyU2VxdWVuY2UsIGFuZHJvaWQudGV4dC5HZXRDaGFycwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGNoYXJbXSBtQ2hhcnMKLQotcHJpdmF0ZSBpbnQgbUVuZAotCi1wcml2YXRlIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgbVNvdXJjZQotCi1wcml2YXRlIGludCBtU3RhcnQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotY2hhcltdCi1pbnQKLWludCkKLQotIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotY2hhcltdCi1pbnQKLWludAotYW5kcm9pZC50ZXh0LkFsdGVyZWRDaGFyU2VxdWVuY2UkMSkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLnRleHQuQWx0ZXJlZENoYXJTZXF1ZW5jZSBtYWtlKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotY2hhcltdCi1pbnQKLWludCkKLQotcHVibGljIGNoYXIgY2hhckF0KAotaW50KQotCi1wdWJsaWMgdm9pZCBnZXRDaGFycygKLWludAotaW50Ci1jaGFyW10KLWludCkKLQotcHVibGljIGludCBsZW5ndGgoKQotCi1wdWJsaWMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBzdWJTZXF1ZW5jZSgKLWludAotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLSB2b2lkIHVwZGF0ZSgKLWNoYXJbXQotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQudGV4dC5TcGFubmVkIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5DaGFyU2VxdWVuY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1BBTl9FWENMVVNJVkVfRVhDTFVTSVZFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNQQU5fRVhDTFVTSVZFX0lOQ0xVU0lWRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUEFOX0lOQ0xVU0lWRV9FWENMVVNJVkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1BBTl9JTkNMVVNJVkVfSU5DTFVTSVZFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNQQU5fTUFSS19NQVJLCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNQQU5fTUFSS19QT0lOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUEFOX1BBUkFHUkFQSAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUEFOX1BPSU5UX01BUksKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1BBTl9QT0lOVF9QT0lOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUEFOX1BSSU9SSVRZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNQQU5fUFJJT1JJVFlfU0hJRlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1BBTl9VU0VSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNQQU5fVVNFUl9TSElGVAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0U3BhbkVuZCgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0U3BhbkZsYWdzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGFic3RyYWN0IGludCBnZXRTcGFuU3RhcnQoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz4oSUlMamF2YS9sYW5nL0NsYXNzPFRUOz47KVtUVDsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5PYmplY3RbXSBnZXRTcGFucygKLWludAotaW50Ci1qYXZhLmxhbmcuQ2xhc3MpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgbmV4dFNwYW5UcmFuc2l0aW9uKAotaW50Ci1pbnQKLWphdmEubGFuZy5DbGFzcykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPUFsdGVyZWRTcGFubmVkICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3RleHQvQWx0ZXJlZENoYXJTZXF1ZW5jZTsgKQotIGNsYXNzIGFuZHJvaWQudGV4dC5BbHRlcmVkQ2hhclNlcXVlbmNlJEFsdGVyZWRTcGFubmVkIGV4dGVuZHMgYW5kcm9pZC50ZXh0LkFsdGVyZWRDaGFyU2VxdWVuY2UgaW1wbGVtZW50cyBhbmRyb2lkLnRleHQuU3Bhbm5lZAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGFuZHJvaWQudGV4dC5TcGFubmVkIG1TcGFubmVkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWNoYXJbXQotaW50Ci1pbnQpCi0KLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWNoYXJbXQotaW50Ci1pbnQKLWFuZHJvaWQudGV4dC5BbHRlcmVkQ2hhclNlcXVlbmNlJDEpCi0KLXB1YmxpYyBpbnQgZ2V0U3BhbkVuZCgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBpbnQgZ2V0U3BhbkZsYWdzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGludCBnZXRTcGFuU3RhcnQoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz4oSUlMamF2YS9sYW5nL0NsYXNzPFRUOz47KVtUVDsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3RbXSBnZXRTcGFucygKLWludAotaW50Ci1qYXZhLmxhbmcuQ2xhc3MpCi0KLXB1YmxpYyBpbnQgbmV4dFNwYW5UcmFuc2l0aW9uKAotaW50Ci1pbnQKLWphdmEubGFuZy5DbGFzcykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnRleHQuQW5kcm9pZENoYXJhY3RlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIGdldERpcmVjdGlvbmFsaXRpZXMoCi1jaGFyW10KLWJ5dGVbXQotaW50KQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBjaGFyIGdldE1pcnJvcigKLWNoYXIpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gbWlycm9yKAotY2hhcltdCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnRleHQuQW5ub3RhdGlvbiBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1LZXkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1WYWx1ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEtleSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFZhbHVlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnRleHQuQXV0b1RleHQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTkNSRU1FTlQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJJR0hUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUUklFX0MKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRSSUVfQ0hJTEQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRSSUVfTkVYVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFRSSUVfTlVMTAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFJJRV9PRkYKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRSSUVfUk9PVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFJJRV9TSVpFT0YKLQotcHJpdmF0ZSBzdGF0aWMgYW5kcm9pZC50ZXh0LkF1dG9UZXh0IHNJbnN0YW5jZQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuT2JqZWN0IHNMb2NrCi0KLXByaXZhdGUgamF2YS51dGlsLkxvY2FsZSBtTG9jYWxlCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtVGV4dAotCi1wcml2YXRlIGNoYXJbXSBtVHJpZQotCi1wcml2YXRlIGNoYXIgbVRyaWVVc2VkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMpCi0KLXByaXZhdGUgdm9pZCBhZGQoCi1qYXZhLmxhbmcuU3RyaW5nCi1jaGFyKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0KAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotaW50Ci1pbnQKLWFuZHJvaWQudmlldy5WaWV3KQotCi1wcml2YXRlIHZvaWQgaW5pdCgKLWFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzKQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbG9va3VwKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotaW50Ci1pbnQpCi0KLXByaXZhdGUgY2hhciBuZXdUcmllTm9kZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdGV4dC9Cb3JpbmdMYXlvdXQ7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1NZXRyaWNzICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnRleHQuQm9yaW5nTGF5b3V0JE1ldHJpY3MgZXh0ZW5kcyBhbmRyb2lkLmdyYXBoaWNzLlBhaW50JEZvbnRNZXRyaWNzSW50Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBpbnQgd2lkdGgKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC90ZXh0L0xheW91dCRBbGlnbm1lbnQ7TGFuZHJvaWQvdGV4dC9MYXlvdXQkU3Bhbm5lZEVsbGlwc2l6ZXI7TGFuZHJvaWQvdGV4dC9MYXlvdXQkRWxsaXBzaXplcjtMYW5kcm9pZC90ZXh0L0xheW91dCREaXJlY3Rpb25zOyApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC50ZXh0LkxheW91dCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIGFuZHJvaWQudGV4dC5MYXlvdXQkRGlyZWN0aW9ucyBESVJTX0FMTF9MRUZUX1RPX1JJR0hUCi0KLXN0YXRpYyBmaW5hbCBhbmRyb2lkLnRleHQuTGF5b3V0JERpcmVjdGlvbnMgRElSU19BTExfUklHSFRfVE9fTEVGVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVJfTEVGVF9UT19SSUdIVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVJfUklHSFRfVE9fTEVGVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEFCX0lOQ1JFTUVOVAotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLmdyYXBoaWNzLlJlY3Qgc1RlbXBSZWN0Ci0KLXByaXZhdGUgYW5kcm9pZC50ZXh0LkxheW91dCRBbGlnbm1lbnQgbUFsaWdubWVudAotCi1wcml2YXRlIGFuZHJvaWQudGV4dC5UZXh0UGFpbnQgbVBhaW50Ci0KLXByaXZhdGUgZmxvYXQgbVNwYWNpbmdBZGQKLQotcHJpdmF0ZSBmbG9hdCBtU3BhY2luZ011bHQKLQotcHJpdmF0ZSBib29sZWFuIG1TcGFubmVkVGV4dAotCi1wcml2YXRlIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgbVRleHQKLQotcHJpdmF0ZSBpbnQgbVdpZHRoCi0KLSBhbmRyb2lkLnRleHQuVGV4dFBhaW50IG1Xb3JrUGFpbnQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWFuZHJvaWQudGV4dC5UZXh0UGFpbnQKLWludAotYW5kcm9pZC50ZXh0LkxheW91dCRBbGlnbm1lbnQKLWZsb2F0Ci1mbG9hdCkKLQotc3RhdGljIHZvaWQgYWNjZXNzJDEwMCgKLWFuZHJvaWQudGV4dC5MYXlvdXQKLWludAotaW50Ci1pbnQKLWNoYXJbXQotaW50KQotCi1wcml2YXRlIHZvaWQgYWRkU2VsZWN0aW9uKAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWFuZHJvaWQuZ3JhcGhpY3MuUGF0aCkKLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBkcmF3VGV4dCgKLWFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludAotaW50Ci1hbmRyb2lkLnRleHQuTGF5b3V0JERpcmVjdGlvbnMKLWZsb2F0Ci1pbnQKLWludAotaW50Ci1hbmRyb2lkLnRleHQuVGV4dFBhaW50Ci1hbmRyb2lkLnRleHQuVGV4dFBhaW50Ci1ib29sZWFuCi1qYXZhLmxhbmcuT2JqZWN0W10pCi0KLXByaXZhdGUgdm9pZCBlbGxpcHNpemUoCi1pbnQKLWludAotaW50Ci1jaGFyW10KLWludCkKLQotcHVibGljIHN0YXRpYyBmbG9hdCBnZXREZXNpcmVkV2lkdGgoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludAotYW5kcm9pZC50ZXh0LlRleHRQYWludCkKLQotcHVibGljIHN0YXRpYyBmbG9hdCBnZXREZXNpcmVkV2lkdGgoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1hbmRyb2lkLnRleHQuVGV4dFBhaW50KQotCi1wcml2YXRlIGZsb2F0IGdldEhvcml6b250YWwoCi1pbnQKLWJvb2xlYW4KLWJvb2xlYW4pCi0KLXByaXZhdGUgZmxvYXQgZ2V0SG9yaXpvbnRhbCgKLWludAotYm9vbGVhbgotYm9vbGVhbgotaW50KQotCi1wcml2YXRlIGZsb2F0IGdldExpbmVNYXgoCi1pbnQKLWphdmEubGFuZy5PYmplY3RbXQotYm9vbGVhbikKLQotcHJpdmF0ZSBpbnQgZ2V0TGluZVZpc2libGVFbmQoCi1pbnQKLWludAotaW50KQotCi1wcml2YXRlIGludCBnZXRPZmZzZXRBdFN0YXJ0T2YoCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIGZsb2F0IG1lYXN1cmVUZXh0KAotYW5kcm9pZC50ZXh0LlRleHRQYWludAotYW5kcm9pZC50ZXh0LlRleHRQYWludAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotaW50Ci1pbnQKLWludAotaW50Ci1hbmRyb2lkLnRleHQuTGF5b3V0JERpcmVjdGlvbnMKLWJvb2xlYW4KLWJvb2xlYW4KLWJvb2xlYW4KLWphdmEubGFuZy5PYmplY3RbXSkKLQotc3RhdGljIGZsb2F0IG1lYXN1cmVUZXh0KAotYW5kcm9pZC50ZXh0LlRleHRQYWludAotYW5kcm9pZC50ZXh0LlRleHRQYWludAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotaW50Ci1pbnQKLWFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQkRm9udE1ldHJpY3NJbnQKLWJvb2xlYW4KLWphdmEubGFuZy5PYmplY3RbXSkKLQotc3RhdGljIGZsb2F0IG5leHRUYWIoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludAotZmxvYXQKLWphdmEubGFuZy5PYmplY3RbXSkKLQotcHVibGljIHZvaWQgZHJhdygKLWFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzKQotCi1wdWJsaWMgdm9pZCBkcmF3KAotYW5kcm9pZC5ncmFwaGljcy5DYW52YXMKLWFuZHJvaWQuZ3JhcGhpY3MuUGF0aAotYW5kcm9pZC5ncmFwaGljcy5QYWludAotaW50KQotCi1wdWJsaWMgZmluYWwgYW5kcm9pZC50ZXh0LkxheW91dCRBbGlnbm1lbnQgZ2V0QWxpZ25tZW50KCkKLQotcHVibGljIGFic3RyYWN0IGludCBnZXRCb3R0b21QYWRkaW5nKCkKLQotcHVibGljIHZvaWQgZ2V0Q3Vyc29yUGF0aCgKLWludAotYW5kcm9pZC5ncmFwaGljcy5QYXRoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldEVsbGlwc2lzQ291bnQoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0RWxsaXBzaXNTdGFydCgKLWludCkKLQotcHVibGljIGludCBnZXRFbGxpcHNpemVkV2lkdGgoKQotCi1wdWJsaWMgaW50IGdldEhlaWdodCgpCi0KLXB1YmxpYyBmaW5hbCBpbnQgZ2V0TGluZUFzY2VudCgKLWludCkKLQotcHVibGljIGZpbmFsIGludCBnZXRMaW5lQmFzZWxpbmUoCi1pbnQpCi0KLXB1YmxpYyBmaW5hbCBpbnQgZ2V0TGluZUJvdHRvbSgKLWludCkKLQotcHVibGljIGludCBnZXRMaW5lQm91bmRzKAotaW50Ci1hbmRyb2lkLmdyYXBoaWNzLlJlY3QpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGdldExpbmVDb250YWluc1RhYigKLWludCkKLQotcHVibGljIGFic3RyYWN0IGludCBnZXRMaW5lQ291bnQoKQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldExpbmVEZXNjZW50KAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC50ZXh0LkxheW91dCREaXJlY3Rpb25zIGdldExpbmVEaXJlY3Rpb25zKAotaW50KQotCi1wdWJsaWMgZmluYWwgaW50IGdldExpbmVFbmQoCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0TGluZUZvck9mZnNldCgKLWludCkKLQotcHVibGljIGludCBnZXRMaW5lRm9yVmVydGljYWwoCi1pbnQpCi0KLXB1YmxpYyBmbG9hdCBnZXRMaW5lTGVmdCgKLWludCkKLQotcHVibGljIGZsb2F0IGdldExpbmVNYXgoCi1pbnQpCi0KLXB1YmxpYyBmbG9hdCBnZXRMaW5lUmlnaHQoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0TGluZVN0YXJ0KAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldExpbmVUb3AoCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0TGluZVZpc2libGVFbmQoCi1pbnQpCi0KLXB1YmxpYyBmbG9hdCBnZXRMaW5lV2lkdGgoCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0T2Zmc2V0Rm9ySG9yaXpvbnRhbCgKLWludAotZmxvYXQpCi0KLXB1YmxpYyBpbnQgZ2V0T2Zmc2V0VG9MZWZ0T2YoCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0T2Zmc2V0VG9SaWdodE9mKAotaW50KQotCi1wdWJsaWMgZmluYWwgYW5kcm9pZC50ZXh0LlRleHRQYWludCBnZXRQYWludCgpCi0KLXB1YmxpYyBmaW5hbCBhbmRyb2lkLnRleHQuTGF5b3V0JEFsaWdubWVudCBnZXRQYXJhZ3JhcGhBbGlnbm1lbnQoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKAotaW50KQotCi1wdWJsaWMgZmluYWwgaW50IGdldFBhcmFncmFwaExlZnQoCi1pbnQpCi0KLXB1YmxpYyBmaW5hbCBpbnQgZ2V0UGFyYWdyYXBoUmlnaHQoCi1pbnQpCi0KLXB1YmxpYyBmbG9hdCBnZXRQcmltYXJ5SG9yaXpvbnRhbCgKLWludCkKLQotcHVibGljIGZsb2F0IGdldFNlY29uZGFyeUhvcml6b250YWwoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdldFNlbGVjdGlvblBhdGgoCi1pbnQKLWludAotYW5kcm9pZC5ncmFwaGljcy5QYXRoKQotCi1wdWJsaWMgZmluYWwgZmxvYXQgZ2V0U3BhY2luZ0FkZCgpCi0KLXB1YmxpYyBmaW5hbCBmbG9hdCBnZXRTcGFjaW5nTXVsdGlwbGllcigpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIGdldFRleHQoKQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldFRvcFBhZGRpbmcoKQotCi1wdWJsaWMgZmluYWwgaW50IGdldFdpZHRoKCkKLQotcHVibGljIGZpbmFsIHZvaWQgaW5jcmVhc2VXaWR0aFRvKAotaW50KQotCi1wcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBpc1NwYW5uZWQoKQotCi0gdm9pZCByZXBsYWNlV2l0aCgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWFuZHJvaWQudGV4dC5UZXh0UGFpbnQKLWludAotYW5kcm9pZC50ZXh0LkxheW91dCRBbGlnbm1lbnQKLWZsb2F0Ci1mbG9hdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC90ZXh0L1RleHRVdGlsczsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPUVsbGlwc2l6ZUNhbGxiYWNrICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC50ZXh0LlRleHRVdGlscyRFbGxpcHNpemVDYWxsYmFjayBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBlbGxpcHNpemVkKAotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC90ZXh0L0JvcmluZ0xheW91dCRNZXRyaWNzOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC50ZXh0LkJvcmluZ0xheW91dCBleHRlbmRzIGFuZHJvaWQudGV4dC5MYXlvdXQgaW1wbGVtZW50cyBhbmRyb2lkLnRleHQuVGV4dFV0aWxzJEVsbGlwc2l6ZUNhbGxiYWNrCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgRklSU1RfUklHSFRfVE9fTEVGVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnRleHQuVGV4dFBhaW50IHNUZW1wCi0KLSBpbnQgbUJvdHRvbQotCi1wcml2YXRlIGludCBtQm90dG9tUGFkZGluZwotCi0gaW50IG1EZXNjCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtRGlyZWN0Ci0KLXByaXZhdGUgaW50IG1FbGxpcHNpemVkQ291bnQKLQotcHJpdmF0ZSBpbnQgbUVsbGlwc2l6ZWRTdGFydAotCi1wcml2YXRlIGludCBtRWxsaXBzaXplZFdpZHRoCi0KLXByaXZhdGUgZmxvYXQgbU1heAotCi1wcml2YXRlIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQgbVBhaW50Ci0KLXByaXZhdGUgaW50IG1Ub3BQYWRkaW5nCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1hbmRyb2lkLnRleHQuVGV4dFBhaW50Ci1pbnQKLWFuZHJvaWQudGV4dC5MYXlvdXQkQWxpZ25tZW50Ci1mbG9hdAotZmxvYXQKLWFuZHJvaWQudGV4dC5Cb3JpbmdMYXlvdXQkTWV0cmljcwotYm9vbGVhbikKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotYW5kcm9pZC50ZXh0LlRleHRQYWludAotaW50Ci1hbmRyb2lkLnRleHQuTGF5b3V0JEFsaWdubWVudAotZmxvYXQKLWZsb2F0Ci1hbmRyb2lkLnRleHQuQm9yaW5nTGF5b3V0JE1ldHJpY3MKLWJvb2xlYW4KLWFuZHJvaWQudGV4dC5UZXh0VXRpbHMkVHJ1bmNhdGVBdAotaW50KQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQudGV4dC5Cb3JpbmdMYXlvdXQkTWV0cmljcyBpc0JvcmluZygKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWFuZHJvaWQudGV4dC5UZXh0UGFpbnQpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC50ZXh0LkJvcmluZ0xheW91dCRNZXRyaWNzIGlzQm9yaW5nKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotYW5kcm9pZC50ZXh0LlRleHRQYWludAotYW5kcm9pZC50ZXh0LkJvcmluZ0xheW91dCRNZXRyaWNzKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQudGV4dC5Cb3JpbmdMYXlvdXQgbWFrZSgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWFuZHJvaWQudGV4dC5UZXh0UGFpbnQKLWludAotYW5kcm9pZC50ZXh0LkxheW91dCRBbGlnbm1lbnQKLWZsb2F0Ci1mbG9hdAotYW5kcm9pZC50ZXh0LkJvcmluZ0xheW91dCRNZXRyaWNzCi1ib29sZWFuKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQudGV4dC5Cb3JpbmdMYXlvdXQgbWFrZSgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWFuZHJvaWQudGV4dC5UZXh0UGFpbnQKLWludAotYW5kcm9pZC50ZXh0LkxheW91dCRBbGlnbm1lbnQKLWZsb2F0Ci1mbG9hdAotYW5kcm9pZC50ZXh0LkJvcmluZ0xheW91dCRNZXRyaWNzCi1ib29sZWFuCi1hbmRyb2lkLnRleHQuVGV4dFV0aWxzJFRydW5jYXRlQXQKLWludCkKLQotcHVibGljIHZvaWQgZHJhdygKLWFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzCi1hbmRyb2lkLmdyYXBoaWNzLlBhdGgKLWFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQKLWludCkKLQotcHVibGljIHZvaWQgZWxsaXBzaXplZCgKLWludAotaW50KQotCi1wdWJsaWMgaW50IGdldEJvdHRvbVBhZGRpbmcoKQotCi1wdWJsaWMgaW50IGdldEVsbGlwc2lzQ291bnQoCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0RWxsaXBzaXNTdGFydCgKLWludCkKLQotcHVibGljIGludCBnZXRFbGxpcHNpemVkV2lkdGgoKQotCi1wdWJsaWMgaW50IGdldEhlaWdodCgpCi0KLXB1YmxpYyBib29sZWFuIGdldExpbmVDb250YWluc1RhYigKLWludCkKLQotcHVibGljIGludCBnZXRMaW5lQ291bnQoKQotCi1wdWJsaWMgaW50IGdldExpbmVEZXNjZW50KAotaW50KQotCi1wdWJsaWMgZmluYWwgYW5kcm9pZC50ZXh0LkxheW91dCREaXJlY3Rpb25zIGdldExpbmVEaXJlY3Rpb25zKAotaW50KQotCi1wdWJsaWMgZmxvYXQgZ2V0TGluZU1heCgKLWludCkKLQotcHVibGljIGludCBnZXRMaW5lU3RhcnQoCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0TGluZVRvcCgKLWludCkKLQotcHVibGljIGludCBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24oCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0VG9wUGFkZGluZygpCi0KLSB2b2lkIGluaXQoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1hbmRyb2lkLnRleHQuVGV4dFBhaW50Ci1pbnQKLWFuZHJvaWQudGV4dC5MYXlvdXQkQWxpZ25tZW50Ci1mbG9hdAotZmxvYXQKLWFuZHJvaWQudGV4dC5Cb3JpbmdMYXlvdXQkTWV0cmljcwotYm9vbGVhbgotYm9vbGVhbikKLQotcHVibGljIGFuZHJvaWQudGV4dC5Cb3JpbmdMYXlvdXQgcmVwbGFjZU9yTWFrZSgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWFuZHJvaWQudGV4dC5UZXh0UGFpbnQKLWludAotYW5kcm9pZC50ZXh0LkxheW91dCRBbGlnbm1lbnQKLWZsb2F0Ci1mbG9hdAotYW5kcm9pZC50ZXh0LkJvcmluZ0xheW91dCRNZXRyaWNzCi1ib29sZWFuKQotCi1wdWJsaWMgYW5kcm9pZC50ZXh0LkJvcmluZ0xheW91dCByZXBsYWNlT3JNYWtlKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotYW5kcm9pZC50ZXh0LlRleHRQYWludAotaW50Ci1hbmRyb2lkLnRleHQuTGF5b3V0JEFsaWdubWVudAotZmxvYXQKLWZsb2F0Ci1hbmRyb2lkLnRleHQuQm9yaW5nTGF5b3V0JE1ldHJpY3MKLWJvb2xlYW4KLWFuZHJvaWQudGV4dC5UZXh0VXRpbHMkVHJ1bmNhdGVBdAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQudGV4dC5DbGlwYm9hcmRNYW5hZ2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLnRleHQuSUNsaXBib2FyZCBzU2VydmljZQotCi1wcml2YXRlIGFuZHJvaWQuY29udGVudC5Db250ZXh0IG1Db250ZXh0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQub3MuSGFuZGxlcikKLQotcHJpdmF0ZSBzdGF0aWMgYW5kcm9pZC50ZXh0LklDbGlwYm9hcmQgZ2V0U2VydmljZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIGdldFRleHQoKQotCi1wdWJsaWMgYm9vbGVhbiBoYXNUZXh0KCkKLQotcHVibGljIHZvaWQgc2V0VGV4dCgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQudGV4dC5TcGFuV2F0Y2hlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvblNwYW5BZGRlZCgKLWFuZHJvaWQudGV4dC5TcGFubmFibGUKLWphdmEubGFuZy5PYmplY3QKLWludAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvblNwYW5DaGFuZ2VkKAotYW5kcm9pZC50ZXh0LlNwYW5uYWJsZQotamF2YS5sYW5nLk9iamVjdAotaW50Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvblNwYW5SZW1vdmVkKAotYW5kcm9pZC50ZXh0LlNwYW5uYWJsZQotamF2YS5sYW5nLk9iamVjdAotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdGV4dC9EeW5hbWljTGF5b3V0OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPUNoYW5nZVdhdGNoZXIgKQotIGNsYXNzIGFuZHJvaWQudGV4dC5EeW5hbWljTGF5b3V0JENoYW5nZVdhdGNoZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC50ZXh0LlRleHRXYXRjaGVyLCBhbmRyb2lkLnRleHQuU3BhbldhdGNoZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2UgbUxheW91dAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQudGV4dC5EeW5hbWljTGF5b3V0KQotCi1wcml2YXRlIHZvaWQgcmVmbG93KAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgYWZ0ZXJUZXh0Q2hhbmdlZCgKLWFuZHJvaWQudGV4dC5FZGl0YWJsZSkKLQotcHVibGljIHZvaWQgYmVmb3JlVGV4dENoYW5nZWQoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBvblNwYW5BZGRlZCgKLWFuZHJvaWQudGV4dC5TcGFubmFibGUKLWphdmEubGFuZy5PYmplY3QKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBvblNwYW5DaGFuZ2VkKAotYW5kcm9pZC50ZXh0LlNwYW5uYWJsZQotamF2YS5sYW5nLk9iamVjdAotaW50Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBvblNwYW5SZW1vdmVkKAotYW5kcm9pZC50ZXh0LlNwYW5uYWJsZQotamF2YS5sYW5nLk9iamVjdAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIG9uVGV4dENoYW5nZWQoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvdGV4dC9EeW5hbWljTGF5b3V0JENoYW5nZVdhdGNoZXI7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnRleHQuRHluYW1pY0xheW91dCBleHRlbmRzIGFuZHJvaWQudGV4dC5MYXlvdXQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTFVNTlNfRUxMSVBTSVpFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT0xVTU5TX05PUk1BTAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVTQ0VOVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElSCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBESVJfTUFTSwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElSX1NISUZUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTExJUFNJU19DT1VOVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRUxMSVBTSVNfU1RBUlQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVMTElQU0lTX1VOREVGSU5FRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFJJT1JJVFkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVJUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFSVF9NQVNLCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUQUIKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRBQl9NQVNLCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT1AKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLk9iamVjdCBzTG9jawotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLnRleHQuU3RhdGljTGF5b3V0IHNTdGF0aWNMYXlvdXQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIG1CYXNlCi0KLXByaXZhdGUgaW50IG1Cb3R0b21QYWRkaW5nCi0KLXByaXZhdGUgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBtRGlzcGxheQotCi1wcml2YXRlIGJvb2xlYW4gbUVsbGlwc2l6ZQotCi1wcml2YXRlIGFuZHJvaWQudGV4dC5UZXh0VXRpbHMkVHJ1bmNhdGVBdCBtRWxsaXBzaXplQXQKLQotcHJpdmF0ZSBpbnQgbUVsbGlwc2l6ZWRXaWR0aAotCi1wcml2YXRlIGJvb2xlYW4gbUluY2x1ZGVQYWQKLQotcHJpdmF0ZSBhbmRyb2lkLnRleHQuUGFja2VkSW50VmVjdG9yIG1JbnRzCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGFuZHJvaWQvdGV4dC9QYWNrZWRPYmplY3RWZWN0b3I8TGFuZHJvaWQvdGV4dC9MYXlvdXQkRGlyZWN0aW9uczs+OyApCi1wcml2YXRlIGFuZHJvaWQudGV4dC5QYWNrZWRPYmplY3RWZWN0b3IgbU9iamVjdHMKLQotcHJpdmF0ZSBpbnQgbVRvcFBhZGRpbmcKLQotcHJpdmF0ZSBhbmRyb2lkLnRleHQuRHluYW1pY0xheW91dCRDaGFuZ2VXYXRjaGVyIG1XYXRjaGVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1hbmRyb2lkLnRleHQuVGV4dFBhaW50Ci1pbnQKLWFuZHJvaWQudGV4dC5MYXlvdXQkQWxpZ25tZW50Ci1mbG9hdAotZmxvYXQKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWFuZHJvaWQudGV4dC5UZXh0UGFpbnQKLWludAotYW5kcm9pZC50ZXh0LkxheW91dCRBbGlnbm1lbnQKLWZsb2F0Ci1mbG9hdAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotYW5kcm9pZC50ZXh0LlRleHRQYWludAotaW50Ci1hbmRyb2lkLnRleHQuTGF5b3V0JEFsaWdubWVudAotZmxvYXQKLWZsb2F0Ci1ib29sZWFuCi1hbmRyb2lkLnRleHQuVGV4dFV0aWxzJFRydW5jYXRlQXQKLWludCkKLQotc3RhdGljIHZvaWQgYWNjZXNzJDAwMCgKLWFuZHJvaWQudGV4dC5EeW5hbWljTGF5b3V0Ci1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludAotaW50KQotCi1wcml2YXRlIHZvaWQgZHVtcCgKLWJvb2xlYW4pCi0KLXByaXZhdGUgdm9pZCByZWZsb3coCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgaW50IGdldEJvdHRvbVBhZGRpbmcoKQotCi1wdWJsaWMgaW50IGdldEVsbGlwc2lzQ291bnQoCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0RWxsaXBzaXNTdGFydCgKLWludCkKLQotcHVibGljIGludCBnZXRFbGxpcHNpemVkV2lkdGgoKQotCi1wdWJsaWMgYm9vbGVhbiBnZXRMaW5lQ29udGFpbnNUYWIoCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0TGluZUNvdW50KCkKLQotcHVibGljIGludCBnZXRMaW5lRGVzY2VudCgKLWludCkKLQotcHVibGljIGZpbmFsIGFuZHJvaWQudGV4dC5MYXlvdXQkRGlyZWN0aW9ucyBnZXRMaW5lRGlyZWN0aW9ucygKLWludCkKLQotcHVibGljIGludCBnZXRMaW5lU3RhcnQoCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0TGluZVRvcCgKLWludCkKLQotcHVibGljIGludCBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24oCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0VG9wUGFkZGluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPUZhY3RvcnkgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdGV4dC9FZGl0YWJsZTsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQudGV4dC5FZGl0YWJsZSRGYWN0b3J5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLnRleHQuRWRpdGFibGUkRmFjdG9yeSBzSW5zdGFuY2UKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC50ZXh0LkVkaXRhYmxlJEZhY3RvcnkgZ2V0SW5zdGFuY2UoKQotCi1wdWJsaWMgYW5kcm9pZC50ZXh0LkVkaXRhYmxlIG5ld0VkaXRhYmxlKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3RleHQvU3Bhbm5hYmxlJEZhY3Rvcnk7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnRleHQuU3Bhbm5lZAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlbW92ZVNwYW4oCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRTcGFuKAotamF2YS5sYW5nLk9iamVjdAotaW50Ci1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3RleHQvRWRpdGFibGUkRmFjdG9yeTsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLnRleHQuRWRpdGFibGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSwgYW5kcm9pZC50ZXh0LkdldENoYXJzLCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlLCBqYXZhLmxhbmcuQXBwZW5kYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLnRleHQuRWRpdGFibGUgYXBwZW5kKAotY2hhcikKLQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQudGV4dC5FZGl0YWJsZSBhcHBlbmQoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC50ZXh0LkVkaXRhYmxlIGFwcGVuZCgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWludAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBjbGVhcigpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGNsZWFyU3BhbnMoKQotCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC50ZXh0LkVkaXRhYmxlIGRlbGV0ZSgKLWludAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC50ZXh0LklucHV0RmlsdGVyW10gZ2V0RmlsdGVycygpCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLnRleHQuRWRpdGFibGUgaW5zZXJ0KAotaW50Ci1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC50ZXh0LkVkaXRhYmxlIGluc2VydCgKLWludAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotaW50Ci1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLnRleHQuRWRpdGFibGUgcmVwbGFjZSgKLWludAotaW50Ci1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC50ZXh0LkVkaXRhYmxlIHJlcGxhY2UoCi1pbnQKLWludAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotaW50Ci1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEZpbHRlcnMoCi1hbmRyb2lkLnRleHQuSW5wdXRGaWx0ZXJbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC50ZXh0LkdyYXBoaWNzT3BlcmF0aW9ucyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgZHJhd1RleHQoCi1hbmRyb2lkLmdyYXBoaWNzLkNhbnZhcwotaW50Ci1pbnQKLWZsb2F0Ci1mbG9hdAotYW5kcm9pZC5ncmFwaGljcy5QYWludCkKLQotcHVibGljIGFic3RyYWN0IGludCBnZXRUZXh0V2lkdGhzKAotaW50Ci1pbnQKLWZsb2F0W10KLWFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBmbG9hdCBtZWFzdXJlVGV4dCgKLWludAotaW50Ci1hbmRyb2lkLmdyYXBoaWNzLlBhaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9SHRtbFBhcnNlciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC90ZXh0L0h0bWw7ICkKLSBjbGFzcyBhbmRyb2lkLnRleHQuSHRtbCRIdG1sUGFyc2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuY2NpbC5jb3dhbi50YWdzb3VwLkhUTUxTY2hlbWEgc2NoZW1hCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotc3RhdGljIG9yZy5jY2lsLmNvd2FuLnRhZ3NvdXAuSFRNTFNjaGVtYSBhY2Nlc3MkMDAwKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC90ZXh0L0h0bWw7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1JbWFnZUdldHRlciApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQudGV4dC5IdG1sJEltYWdlR2V0dGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIGdldERyYXdhYmxlKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC90ZXh0L0h0bWw7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1UYWdIYW5kbGVyICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC50ZXh0Lkh0bWwkVGFnSGFuZGxlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBoYW5kbGVUYWcoCi1ib29sZWFuCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLnRleHQuRWRpdGFibGUKLW9yZy54bWwuc2F4LlhNTFJlYWRlcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3RleHQvSHRtbCRIdG1sUGFyc2VyO0xhbmRyb2lkL3RleHQvSHRtbCRUYWdIYW5kbGVyO0xhbmRyb2lkL3RleHQvSHRtbCRJbWFnZUdldHRlcjsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQudGV4dC5IdG1sIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQudGV4dC5TcGFubmVkIGZyb21IdG1sKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLnRleHQuU3Bhbm5lZCBmcm9tSHRtbCgKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQudGV4dC5IdG1sJEltYWdlR2V0dGVyCi1hbmRyb2lkLnRleHQuSHRtbCRUYWdIYW5kbGVyKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgdG9IdG1sKAotYW5kcm9pZC50ZXh0LlNwYW5uZWQpCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgd2l0aGluQmxvY2txdW90ZSgKLWphdmEubGFuZy5TdHJpbmdCdWlsZGVyCi1hbmRyb2lkLnRleHQuU3Bhbm5lZAotaW50Ci1pbnQpCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgd2l0aGluUGFyYWdyYXBoKAotamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIKLWFuZHJvaWQudGV4dC5TcGFubmVkCi1pbnQKLWludAotaW50Ci1ib29sZWFuKQotCi1wcml2YXRlIHN0YXRpYyB2b2lkIHdpdGhpblN0eWxlKAotamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIKLWFuZHJvaWQudGV4dC5TcGFubmVkCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC90ZXh0L0h0bWxUb1NwYW5uZWRDb252ZXJ0ZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9NDEwNCBuYW1lID1udWxsICkKLSBjbGFzcyBhbmRyb2lkLnRleHQuSHRtbFRvU3Bhbm5lZENvbnZlcnRlciQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdGV4dC9IdG1sVG9TcGFubmVkQ29udmVydGVyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPUJpZyApCi0gY2xhc3MgYW5kcm9pZC50ZXh0Lkh0bWxUb1NwYW5uZWRDb252ZXJ0ZXIkQmlnIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLnRleHQuSHRtbFRvU3Bhbm5lZENvbnZlcnRlciQxKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3RleHQvSHRtbFRvU3Bhbm5lZENvbnZlcnRlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1CbG9ja3F1b3RlICkKLSBjbGFzcyBhbmRyb2lkLnRleHQuSHRtbFRvU3Bhbm5lZENvbnZlcnRlciRCbG9ja3F1b3RlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLnRleHQuSHRtbFRvU3Bhbm5lZENvbnZlcnRlciQxKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3RleHQvSHRtbFRvU3Bhbm5lZENvbnZlcnRlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1Cb2xkICkKLSBjbGFzcyBhbmRyb2lkLnRleHQuSHRtbFRvU3Bhbm5lZENvbnZlcnRlciRCb2xkIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLnRleHQuSHRtbFRvU3Bhbm5lZENvbnZlcnRlciQxKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9Rm9udCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC90ZXh0L0h0bWxUb1NwYW5uZWRDb252ZXJ0ZXI7ICkKLSBjbGFzcyBhbmRyb2lkLnRleHQuSHRtbFRvU3Bhbm5lZENvbnZlcnRlciRGb250IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBtQ29sb3IKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgbUZhY2UKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3RleHQvSHRtbFRvU3Bhbm5lZENvbnZlcnRlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1IZWFkZXIgKQotIGNsYXNzIGFuZHJvaWQudGV4dC5IdG1sVG9TcGFubmVkQ29udmVydGVyJEhlYWRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBpbnQgbUxldmVsCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50KQotCi1zdGF0aWMgaW50IGFjY2VzcyQ5MDAoCi1hbmRyb2lkLnRleHQuSHRtbFRvU3Bhbm5lZENvbnZlcnRlciRIZWFkZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdGV4dC9IdG1sVG9TcGFubmVkQ29udmVydGVyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPUhyZWYgKQotIGNsYXNzIGFuZHJvaWQudGV4dC5IdG1sVG9TcGFubmVkQ29udmVydGVyJEhyZWYgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIG1IcmVmCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC90ZXh0L0h0bWxUb1NwYW5uZWRDb252ZXJ0ZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9SXRhbGljICkKLSBjbGFzcyBhbmRyb2lkLnRleHQuSHRtbFRvU3Bhbm5lZENvbnZlcnRlciRJdGFsaWMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQudGV4dC5IdG1sVG9TcGFubmVkQ29udmVydGVyJDEpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdGV4dC9IdG1sVG9TcGFubmVkQ29udmVydGVyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPU1vbm9zcGFjZSApCi0gY2xhc3MgYW5kcm9pZC50ZXh0Lkh0bWxUb1NwYW5uZWRDb252ZXJ0ZXIkTW9ub3NwYWNlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLnRleHQuSHRtbFRvU3Bhbm5lZENvbnZlcnRlciQxKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9U21hbGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdGV4dC9IdG1sVG9TcGFubmVkQ29udmVydGVyOyApCi0gY2xhc3MgYW5kcm9pZC50ZXh0Lkh0bWxUb1NwYW5uZWRDb252ZXJ0ZXIkU21hbGwgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQudGV4dC5IdG1sVG9TcGFubmVkQ29udmVydGVyJDEpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1TdWIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdGV4dC9IdG1sVG9TcGFubmVkQ29udmVydGVyOyApCi0gY2xhc3MgYW5kcm9pZC50ZXh0Lkh0bWxUb1NwYW5uZWRDb252ZXJ0ZXIkU3ViIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLnRleHQuSHRtbFRvU3Bhbm5lZENvbnZlcnRlciQxKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3RleHQvSHRtbFRvU3Bhbm5lZENvbnZlcnRlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1TdXBlciApCi0gY2xhc3MgYW5kcm9pZC50ZXh0Lkh0bWxUb1NwYW5uZWRDb252ZXJ0ZXIkU3VwZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQudGV4dC5IdG1sVG9TcGFubmVkQ29udmVydGVyJDEpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1VbmRlcmxpbmUgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdGV4dC9IdG1sVG9TcGFubmVkQ29udmVydGVyOyApCi0gY2xhc3MgYW5kcm9pZC50ZXh0Lkh0bWxUb1NwYW5uZWRDb252ZXJ0ZXIkVW5kZXJsaW5lIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLnRleHQuSHRtbFRvU3Bhbm5lZENvbnZlcnRlciQxKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvdGV4dC9IdG1sVG9TcGFubmVkQ29udmVydGVyJDE7TGFuZHJvaWQvdGV4dC9IdG1sVG9TcGFubmVkQ29udmVydGVyJEhlYWRlcjtMYW5kcm9pZC90ZXh0L0h0bWxUb1NwYW5uZWRDb252ZXJ0ZXIkSHJlZjtMYW5kcm9pZC90ZXh0L0h0bWxUb1NwYW5uZWRDb252ZXJ0ZXIkRm9udDtMYW5kcm9pZC90ZXh0L0h0bWxUb1NwYW5uZWRDb252ZXJ0ZXIkU3ViO0xhbmRyb2lkL3RleHQvSHRtbFRvU3Bhbm5lZENvbnZlcnRlciRTdXBlcjtMYW5kcm9pZC90ZXh0L0h0bWxUb1NwYW5uZWRDb252ZXJ0ZXIkQmxvY2txdW90ZTtMYW5kcm9pZC90ZXh0L0h0bWxUb1NwYW5uZWRDb252ZXJ0ZXIkTW9ub3NwYWNlO0xhbmRyb2lkL3RleHQvSHRtbFRvU3Bhbm5lZENvbnZlcnRlciRTbWFsbDtMYW5kcm9pZC90ZXh0L0h0bWxUb1NwYW5uZWRDb252ZXJ0ZXIkQmlnO0xhbmRyb2lkL3RleHQvSHRtbFRvU3Bhbm5lZENvbnZlcnRlciRVbmRlcmxpbmU7TGFuZHJvaWQvdGV4dC9IdG1sVG9TcGFubmVkQ29udmVydGVyJEl0YWxpYztMYW5kcm9pZC90ZXh0L0h0bWxUb1NwYW5uZWRDb252ZXJ0ZXIkQm9sZDsgKQotIGNsYXNzIGFuZHJvaWQudGV4dC5IdG1sVG9TcGFubmVkQ29udmVydGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0W10gSEVBREVSX1NJWkVTCi0KLXByaXZhdGUgYW5kcm9pZC50ZXh0Lkh0bWwkSW1hZ2VHZXR0ZXIgbUltYWdlR2V0dGVyCi0KLXByaXZhdGUgb3JnLnhtbC5zYXguWE1MUmVhZGVyIG1SZWFkZXIKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1Tb3VyY2UKLQotcHJpdmF0ZSBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBtU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcgotCi1wcml2YXRlIGFuZHJvaWQudGV4dC5IdG1sJFRhZ0hhbmRsZXIgbVRhZ0hhbmRsZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQudGV4dC5IdG1sJEltYWdlR2V0dGVyCi1hbmRyb2lkLnRleHQuSHRtbCRUYWdIYW5kbGVyCi1vcmcuY2NpbC5jb3dhbi50YWdzb3VwLlBhcnNlcikKLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBlbmQoCi1hbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcgotamF2YS5sYW5nLkNsYXNzCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wcml2YXRlIHN0YXRpYyB2b2lkIGVuZEEoCi1hbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcikKLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBlbmRGb250KAotYW5kcm9pZC50ZXh0LlNwYW5uYWJsZVN0cmluZ0J1aWxkZXIpCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgZW5kSGVhZGVyKAotYW5kcm9pZC50ZXh0LlNwYW5uYWJsZVN0cmluZ0J1aWxkZXIpCi0KLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5PYmplY3QgZ2V0TGFzdCgKLWFuZHJvaWQudGV4dC5TcGFubmVkCi1qYXZhLmxhbmcuQ2xhc3MpCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgaGFuZGxlQnIoCi1hbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcikKLQotcHJpdmF0ZSB2b2lkIGhhbmRsZUVuZFRhZygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgaGFuZGxlUCgKLWFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmdCdWlsZGVyKQotCi1wcml2YXRlIHZvaWQgaGFuZGxlU3RhcnRUYWcoCi1qYXZhLmxhbmcuU3RyaW5nCi1vcmcueG1sLnNheC5BdHRyaWJ1dGVzKQotCi1wcml2YXRlIHN0YXRpYyB2b2lkIHN0YXJ0KAotYW5kcm9pZC50ZXh0LlNwYW5uYWJsZVN0cmluZ0J1aWxkZXIKLWphdmEubGFuZy5PYmplY3QpCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgc3RhcnRBKAotYW5kcm9pZC50ZXh0LlNwYW5uYWJsZVN0cmluZ0J1aWxkZXIKLW9yZy54bWwuc2F4LkF0dHJpYnV0ZXMpCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgc3RhcnRGb250KAotYW5kcm9pZC50ZXh0LlNwYW5uYWJsZVN0cmluZ0J1aWxkZXIKLW9yZy54bWwuc2F4LkF0dHJpYnV0ZXMpCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgc3RhcnRJbWcoCi1hbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcgotb3JnLnhtbC5zYXguQXR0cmlidXRlcwotYW5kcm9pZC50ZXh0Lkh0bWwkSW1hZ2VHZXR0ZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY2hhcmFjdGVycygKLWNoYXJbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyBhbmRyb2lkLnRleHQuU3Bhbm5lZCBjb252ZXJ0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBlbmREb2N1bWVudCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgZW5kRWxlbWVudCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgZW5kUHJlZml4TWFwcGluZygKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgaWdub3JhYmxlV2hpdGVzcGFjZSgKLWNoYXJbXQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcHJvY2Vzc2luZ0luc3RydWN0aW9uKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0RG9jdW1lbnRMb2NhdG9yKAotb3JnLnhtbC5zYXguTG9jYXRvcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBza2lwcGVkRW50aXR5KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzdGFydERvY3VtZW50KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1vcmcueG1sLnNheC5BdHRyaWJ1dGVzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHN0YXJ0UHJlZml4TWFwcGluZygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC90ZXh0L0lDbGlwYm9hcmQkU3R1YjsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLnRleHQuSUNsaXBib2FyZCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLklJbnRlcmZhY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5DaGFyU2VxdWVuY2UgZ2V0Q2xpcGJvYXJkVGV4dCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBoYXNDbGlwYm9hcmRUZXh0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldENsaXBib2FyZFRleHQoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3RleHQvSUNsaXBib2FyZCRTdHViOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPVByb3h5ICkKLSBjbGFzcyBhbmRyb2lkLnRleHQuSUNsaXBib2FyZCRTdHViJFByb3h5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQudGV4dC5JQ2xpcGJvYXJkCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5JQmluZGVyIG1SZW1vdGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgZ2V0Q2xpcGJvYXJkVGV4dCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEludGVyZmFjZURlc2NyaXB0b3IoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gaGFzQ2xpcGJvYXJkVGV4dCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRDbGlwYm9hcmRUZXh0KAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3RleHQvSUNsaXBib2FyZCRTdHViJFByb3h5OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC90ZXh0L0lDbGlwYm9hcmQ7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAzMyBuYW1lID1TdHViICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBhbmRyb2lkLnRleHQuSUNsaXBib2FyZCRTdHViIGV4dGVuZHMgYW5kcm9pZC5vcy5CaW5kZXIgaW1wbGVtZW50cyBhbmRyb2lkLnRleHQuSUNsaXBib2FyZAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFU0NSSVBUT1IKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9nZXRDbGlwYm9hcmRUZXh0Ci0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05faGFzQ2xpcGJvYXJkVGV4dAotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3NldENsaXBib2FyZFRleHQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQudGV4dC5JQ2xpcGJvYXJkIGFzSW50ZXJmYWNlKAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIG9uVHJhbnNhY3QoCi1pbnQKLWFuZHJvaWQub3MuUGFyY2VsCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvdGV4dC9JbnB1dEZpbHRlciRMZW5ndGhGaWx0ZXI7TGFuZHJvaWQvdGV4dC9JbnB1dEZpbHRlciRBbGxDYXBzOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQudGV4dC5JbnB1dEZpbHRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBmaWx0ZXIoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludAotYW5kcm9pZC50ZXh0LlNwYW5uZWQKLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3RleHQvSW5wdXRGaWx0ZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1BbGxDYXBzICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnRleHQuSW5wdXRGaWx0ZXIkQWxsQ2FwcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnRleHQuSW5wdXRGaWx0ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBmaWx0ZXIoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludAotYW5kcm9pZC50ZXh0LlNwYW5uZWQKLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1MZW5ndGhGaWx0ZXIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdGV4dC9JbnB1dEZpbHRlcjsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQudGV4dC5JbnB1dEZpbHRlciRMZW5ndGhGaWx0ZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC50ZXh0LklucHV0RmlsdGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgaW50IG1NYXgKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIGZpbHRlcigKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWludAotaW50Ci1hbmRyb2lkLnRleHQuU3Bhbm5lZAotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvRW51bTxMYW5kcm9pZC90ZXh0L0xheW91dCRBbGlnbm1lbnQ7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNjQwOSBuYW1lID1BbGlnbm1lbnQgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdGV4dC9MYXlvdXQ7ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLnRleHQuTGF5b3V0JEFsaWdubWVudCBleHRlbmRzIGphdmEubGFuZy5FbnVtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGFuZHJvaWQudGV4dC5MYXlvdXQkQWxpZ25tZW50W10gJFZBTFVFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudGV4dC5MYXlvdXQkQWxpZ25tZW50IEFMSUdOX0NFTlRFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudGV4dC5MYXlvdXQkQWxpZ25tZW50IEFMSUdOX05PUk1BTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudGV4dC5MYXlvdXQkQWxpZ25tZW50IEFMSUdOX09QUE9TSVRFCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpViApCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQudGV4dC5MYXlvdXQkQWxpZ25tZW50IHZhbHVlT2YoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQudGV4dC5MYXlvdXQkQWxpZ25tZW50W10gdmFsdWVzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9RGlyZWN0aW9ucyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC90ZXh0L0xheW91dDsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQudGV4dC5MYXlvdXQkRGlyZWN0aW9ucyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzaG9ydFtdIG1EaXJlY3Rpb25zCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotc2hvcnRbXSkKLQotc3RhdGljIHNob3J0W10gYWNjZXNzJDAwMCgKLWFuZHJvaWQudGV4dC5MYXlvdXQkRGlyZWN0aW9ucykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC90ZXh0L0xheW91dDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPUVsbGlwc2l6ZXIgKQotIGNsYXNzIGFuZHJvaWQudGV4dC5MYXlvdXQkRWxsaXBzaXplciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlLCBhbmRyb2lkLnRleHQuR2V0Q2hhcnMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGFuZHJvaWQudGV4dC5MYXlvdXQgbUxheW91dAotCi0gYW5kcm9pZC50ZXh0LlRleHRVdGlscyRUcnVuY2F0ZUF0IG1NZXRob2QKLQotIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgbVRleHQKLQotIGludCBtV2lkdGgKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotCi1wdWJsaWMgY2hhciBjaGFyQXQoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdldENoYXJzKAotaW50Ci1pbnQKLWNoYXJbXQotaW50KQotCi1wdWJsaWMgaW50IGxlbmd0aCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIHN1YlNlcXVlbmNlKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC90ZXh0L0xheW91dDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPVNwYW5uZWRFbGxpcHNpemVyICkKLSBjbGFzcyBhbmRyb2lkLnRleHQuTGF5b3V0JFNwYW5uZWRFbGxpcHNpemVyIGV4dGVuZHMgYW5kcm9pZC50ZXh0LkxheW91dCRFbGxpcHNpemVyIGltcGxlbWVudHMgYW5kcm9pZC50ZXh0LlNwYW5uZWQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLnRleHQuU3Bhbm5lZCBtU3Bhbm5lZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi0KLXB1YmxpYyBpbnQgZ2V0U3BhbkVuZCgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBpbnQgZ2V0U3BhbkZsYWdzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGludCBnZXRTcGFuU3RhcnQoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz4oSUlMamF2YS9sYW5nL0NsYXNzPFRUOz47KVtUVDsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3RbXSBnZXRTcGFucygKLWludAotaW50Ci1qYXZhLmxhbmcuQ2xhc3MpCi0KLXB1YmxpYyBpbnQgbmV4dFNwYW5UcmFuc2l0aW9uKAotaW50Ci1pbnQKLWphdmEubGFuZy5DbGFzcykKLQotcHVibGljIGphdmEubGFuZy5DaGFyU2VxdWVuY2Ugc3ViU2VxdWVuY2UoCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3RleHQvTG9naW5GaWx0ZXIkUGFzc3dvcmRGaWx0ZXJHTWFpbDtMYW5kcm9pZC90ZXh0L0xvZ2luRmlsdGVyJFVzZXJuYW1lRmlsdGVyR2VuZXJpYztMYW5kcm9pZC90ZXh0L0xvZ2luRmlsdGVyJFVzZXJuYW1lRmlsdGVyR01haWw7ICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBhbmRyb2lkLnRleHQuTG9naW5GaWx0ZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC50ZXh0LklucHV0RmlsdGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYm9vbGVhbiBtQXBwZW5kSW52YWxpZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLSB2b2lkIDxpbml0PigKLWJvb2xlYW4pCi0KLXB1YmxpYyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIGZpbHRlcigKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWludAotaW50Ci1hbmRyb2lkLnRleHQuU3Bhbm5lZAotaW50Ci1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzQWxsb3dlZCgKLWNoYXIpCi0KLXB1YmxpYyB2b2lkIG9uSW52YWxpZENoYXJhY3RlcigKLWNoYXIpCi0KLXB1YmxpYyB2b2lkIG9uU3RhcnQoKQotCi1wdWJsaWMgdm9pZCBvblN0b3AoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3RleHQvTG9naW5GaWx0ZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1QYXNzd29yZEZpbHRlckdNYWlsICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnRleHQuTG9naW5GaWx0ZXIkUGFzc3dvcmRGaWx0ZXJHTWFpbCBleHRlbmRzIGFuZHJvaWQudGV4dC5Mb2dpbkZpbHRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWJvb2xlYW4pCi0KLXB1YmxpYyBib29sZWFuIGlzQWxsb3dlZCgKLWNoYXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPVVzZXJuYW1lRmlsdGVyR01haWwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdGV4dC9Mb2dpbkZpbHRlcjsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQudGV4dC5Mb2dpbkZpbHRlciRVc2VybmFtZUZpbHRlckdNYWlsIGV4dGVuZHMgYW5kcm9pZC50ZXh0LkxvZ2luRmlsdGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYm9vbGVhbikKLQotcHVibGljIGJvb2xlYW4gaXNBbGxvd2VkKAotY2hhcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9VXNlcm5hbWVGaWx0ZXJHZW5lcmljICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3RleHQvTG9naW5GaWx0ZXI7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnRleHQuTG9naW5GaWx0ZXIkVXNlcm5hbWVGaWx0ZXJHZW5lcmljIGV4dGVuZHMgYW5kcm9pZC50ZXh0LkxvZ2luRmlsdGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgbUFsbG93ZWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ib29sZWFuKQotCi1wdWJsaWMgYm9vbGVhbiBpc0FsbG93ZWQoCi1jaGFyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotIGNsYXNzIGFuZHJvaWQudGV4dC5QYWNrZWRJbnRWZWN0b3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgaW50IG1Db2x1bW5zCi0KLXByaXZhdGUgaW50IG1Sb3dHYXBMZW5ndGgKLQotcHJpdmF0ZSBpbnQgbVJvd0dhcFN0YXJ0Ci0KLXByaXZhdGUgaW50IG1Sb3dzCi0KLXByaXZhdGUgaW50W10gbVZhbHVlR2FwCi0KLXByaXZhdGUgaW50W10gbVZhbHVlcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludCkKLQotcHJpdmF0ZSBmaW5hbCB2b2lkIGdyb3dCdWZmZXIoKQotCi1wcml2YXRlIGZpbmFsIHZvaWQgbW92ZVJvd0dhcFRvKAotaW50KQotCi1wcml2YXRlIGZpbmFsIHZvaWQgbW92ZVZhbHVlR2FwVG8oCi1pbnQKLWludCkKLQotcHJpdmF0ZSB2b2lkIHNldFZhbHVlSW50ZXJuYWwoCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBhZGp1c3RWYWx1ZXNCZWxvdygKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIGRlbGV0ZUF0KAotaW50Ci1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0VmFsdWUoCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgaW5zZXJ0QXQoCi1pbnQKLWludFtdKQotCi1wdWJsaWMgdm9pZCBzZXRWYWx1ZSgKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBpbnQgc2l6ZSgpCi0KLXB1YmxpYyBpbnQgd2lkdGgoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08RTpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvbGFuZy9PYmplY3Q7ICkKLSBjbGFzcyBhbmRyb2lkLnRleHQuUGFja2VkT2JqZWN0VmVjdG9yIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGludCBtQ29sdW1ucwotCi1wcml2YXRlIGludCBtUm93R2FwTGVuZ3RoCi0KLXByaXZhdGUgaW50IG1Sb3dHYXBTdGFydAotCi1wcml2YXRlIGludCBtUm93cwotCi1wcml2YXRlIGphdmEubGFuZy5PYmplY3RbXSBtVmFsdWVzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50KQotCi1wcml2YXRlIHZvaWQgZ3Jvd0J1ZmZlcigpCi0KLXByaXZhdGUgdm9pZCBtb3ZlUm93R2FwVG8oCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGRlbGV0ZUF0KAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIGR1bXAoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJSSlURTsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0VmFsdWUoCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSVtURTspViApCi1wdWJsaWMgdm9pZCBpbnNlcnRBdCgKLWludAotamF2YS5sYW5nLk9iamVjdFtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJSVRFOylWICkKLXB1YmxpYyB2b2lkIHNldFZhbHVlKAotaW50Ci1pbnQKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBpbnQgc2l6ZSgpCi0KLXB1YmxpYyBpbnQgd2lkdGgoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQudGV4dC5TZWxlY3Rpb24gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLk9iamVjdCBTRUxFQ1RJT05fRU5ECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLk9iamVjdCBTRUxFQ1RJT05fU1RBUlQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIHN0YXRpYyBpbnQgY2hvb3NlSG9yaXpvbnRhbCgKLWFuZHJvaWQudGV4dC5MYXlvdXQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBleHRlbmREb3duKAotYW5kcm9pZC50ZXh0LlNwYW5uYWJsZQotYW5kcm9pZC50ZXh0LkxheW91dCkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGV4dGVuZExlZnQoCi1hbmRyb2lkLnRleHQuU3Bhbm5hYmxlCi1hbmRyb2lkLnRleHQuTGF5b3V0KQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gZXh0ZW5kUmlnaHQoCi1hbmRyb2lkLnRleHQuU3Bhbm5hYmxlCi1hbmRyb2lkLnRleHQuTGF5b3V0KQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgZXh0ZW5kU2VsZWN0aW9uKAotYW5kcm9pZC50ZXh0LlNwYW5uYWJsZQotaW50KQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gZXh0ZW5kVG9MZWZ0RWRnZSgKLWFuZHJvaWQudGV4dC5TcGFubmFibGUKLWFuZHJvaWQudGV4dC5MYXlvdXQpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBleHRlbmRUb1JpZ2h0RWRnZSgKLWFuZHJvaWQudGV4dC5TcGFubmFibGUKLWFuZHJvaWQudGV4dC5MYXlvdXQpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBleHRlbmRVcCgKLWFuZHJvaWQudGV4dC5TcGFubmFibGUKLWFuZHJvaWQudGV4dC5MYXlvdXQpCi0KLXByaXZhdGUgc3RhdGljIGludCBmaW5kRWRnZSgKLWFuZHJvaWQudGV4dC5TcGFubmFibGUKLWFuZHJvaWQudGV4dC5MYXlvdXQKLWludCkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZ2V0U2VsZWN0aW9uRW5kKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZ2V0U2VsZWN0aW9uU3RhcnQoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gbW92ZURvd24oCi1hbmRyb2lkLnRleHQuU3Bhbm5hYmxlCi1hbmRyb2lkLnRleHQuTGF5b3V0KQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gbW92ZUxlZnQoCi1hbmRyb2lkLnRleHQuU3Bhbm5hYmxlCi1hbmRyb2lkLnRleHQuTGF5b3V0KQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gbW92ZVJpZ2h0KAotYW5kcm9pZC50ZXh0LlNwYW5uYWJsZQotYW5kcm9pZC50ZXh0LkxheW91dCkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIG1vdmVUb0xlZnRFZGdlKAotYW5kcm9pZC50ZXh0LlNwYW5uYWJsZQotYW5kcm9pZC50ZXh0LkxheW91dCkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIG1vdmVUb1JpZ2h0RWRnZSgKLWFuZHJvaWQudGV4dC5TcGFubmFibGUKLWFuZHJvaWQudGV4dC5MYXlvdXQpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBtb3ZlVXAoCi1hbmRyb2lkLnRleHQuU3Bhbm5hYmxlCi1hbmRyb2lkLnRleHQuTGF5b3V0KQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgcmVtb3ZlU2VsZWN0aW9uKAotYW5kcm9pZC50ZXh0LlNwYW5uYWJsZSkKLQotcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHNlbGVjdEFsbCgKLWFuZHJvaWQudGV4dC5TcGFubmFibGUpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBzZXRTZWxlY3Rpb24oCi1hbmRyb2lkLnRleHQuU3Bhbm5hYmxlCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTZWxlY3Rpb24oCi1hbmRyb2lkLnRleHQuU3Bhbm5hYmxlCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9RmFjdG9yeSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC90ZXh0L1NwYW5uYWJsZTsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQudGV4dC5TcGFubmFibGUkRmFjdG9yeSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZSRGYWN0b3J5IHNJbnN0YW5jZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlJEZhY3RvcnkgZ2V0SW5zdGFuY2UoKQotCi1wdWJsaWMgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZSBuZXdTcGFubmFibGUoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZVN0cmluZ0ludGVybmFsIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OUwotCi1zdGF0aWMgZmluYWwgamF2YS5sYW5nLk9iamVjdFtdIEVNUFRZCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTkQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFSVAotCi1wcml2YXRlIGludCBtU3BhbkNvdW50Ci0KLXByaXZhdGUgaW50W10gbVNwYW5EYXRhCi0KLXByaXZhdGUgamF2YS5sYW5nLk9iamVjdFtdIG1TcGFucwotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbVRleHQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWludAotaW50KQotCi1wcml2YXRlIHZvaWQgY2hlY2tSYW5nZSgKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lvbigKLWludAotaW50KQotCi1wcml2YXRlIHZvaWQgc2VuZFNwYW5BZGRlZCgKLWphdmEubGFuZy5PYmplY3QKLWludAotaW50KQotCi1wcml2YXRlIHZvaWQgc2VuZFNwYW5DaGFuZ2VkKAotamF2YS5sYW5nLk9iamVjdAotaW50Ci1pbnQKLWludAotaW50KQotCi1wcml2YXRlIHZvaWQgc2VuZFNwYW5SZW1vdmVkKAotamF2YS5sYW5nLk9iamVjdAotaW50Ci1pbnQpCi0KLXB1YmxpYyBmaW5hbCBjaGFyIGNoYXJBdCgKLWludCkKLQotcHVibGljIGZpbmFsIHZvaWQgZ2V0Q2hhcnMoCi1pbnQKLWludAotY2hhcltdCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0U3BhbkVuZCgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBpbnQgZ2V0U3BhbkZsYWdzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGludCBnZXRTcGFuU3RhcnQoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz4oSUlMamF2YS9sYW5nL0NsYXNzPFRUOz47KVtUVDsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3RbXSBnZXRTcGFucygKLWludAotaW50Ci1qYXZhLmxhbmcuQ2xhc3MpCi0KLXB1YmxpYyBmaW5hbCBpbnQgbGVuZ3RoKCkKLQotcHVibGljIGludCBuZXh0U3BhblRyYW5zaXRpb24oCi1pbnQKLWludAotamF2YS5sYW5nLkNsYXNzKQotCi0gdm9pZCByZW1vdmVTcGFuKAotamF2YS5sYW5nLk9iamVjdCkKLQotIHZvaWQgc2V0U3BhbigKLWphdmEubGFuZy5PYmplY3QKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nIGV4dGVuZHMgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZVN0cmluZ0ludGVybmFsIGltcGxlbWVudHMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSwgYW5kcm9pZC50ZXh0LkdldENoYXJzLCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmcgdmFsdWVPZigKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi0KLXB1YmxpYyB2b2xhdGlsZSBpbnQgZ2V0U3BhbkVuZCgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2xhdGlsZSBpbnQgZ2V0U3BhbkZsYWdzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHZvbGF0aWxlIGludCBnZXRTcGFuU3RhcnQoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdFtdIGdldFNwYW5zKAotaW50Ci1pbnQKLWphdmEubGFuZy5DbGFzcykKLQotcHVibGljIHZvbGF0aWxlIGludCBuZXh0U3BhblRyYW5zaXRpb24oCi1pbnQKLWludAotamF2YS5sYW5nLkNsYXNzKQotCi1wdWJsaWMgdm9pZCByZW1vdmVTcGFuKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHZvaWQgc2V0U3BhbigKLWphdmEubGFuZy5PYmplY3QKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIHN1YlNlcXVlbmNlKAotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSwgYW5kcm9pZC50ZXh0LkdldENoYXJzLCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlLCBhbmRyb2lkLnRleHQuRWRpdGFibGUsIGphdmEubGFuZy5BcHBlbmRhYmxlLCBhbmRyb2lkLnRleHQuR3JhcGhpY3NPcGVyYXRpb25zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTkRfTUFTSwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFSSwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnRleHQuSW5wdXRGaWx0ZXJbXSBOT19GSUxURVJTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQQVJBR1JBUEgKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBPSU5UCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFSVF9NQVNLCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFSVF9TSElGVAotCi1wcml2YXRlIGFuZHJvaWQudGV4dC5JbnB1dEZpbHRlcltdIG1GaWx0ZXJzCi0KLXByaXZhdGUgaW50IG1HYXBMZW5ndGgKLQotcHJpdmF0ZSBpbnQgbUdhcFN0YXJ0Ci0KLXByaXZhdGUgaW50IG1TcGFuQ291bnQKLQotcHJpdmF0ZSBpbnRbXSBtU3BhbkVuZHMKLQotcHJpdmF0ZSBpbnRbXSBtU3BhbkZsYWdzCi0KLXByaXZhdGUgaW50W10gbVNwYW5TdGFydHMKLQotcHJpdmF0ZSBqYXZhLmxhbmcuT2JqZWN0W10gbVNwYW5zCi0KLXByaXZhdGUgY2hhcltdIG1UZXh0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludCkKLQotcHJpdmF0ZSBpbnQgY2hhbmdlKAotaW50Ci1pbnQKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWludAotaW50KQotCi1wcml2YXRlIGludCBjaGFuZ2UoCi1ib29sZWFuCi1pbnQKLWludAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotaW50Ci1pbnQpCi0KLXByaXZhdGUgdm9pZCBjaGVja1JhbmdlKAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQpCi0KLXByaXZhdGUgYm9vbGVhbiBpc3ByaW50KAotY2hhcikKLQotcHJpdmF0ZSB2b2lkIG1vdmVHYXBUbygKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyByZWdpb24oCi1pbnQKLWludCkKLQotcHJpdmF0ZSB2b2lkIHJlc2l6ZUZvcigKLWludCkKLQotcHJpdmF0ZSB2b2lkIHNlbmRTcGFuQWRkZWQoCi1qYXZhLmxhbmcuT2JqZWN0Ci1pbnQKLWludCkKLQotcHJpdmF0ZSB2b2lkIHNlbmRTcGFuQ2hhbmdlZCgKLWphdmEubGFuZy5PYmplY3QKLWludAotaW50Ci1pbnQKLWludCkKLQotcHJpdmF0ZSB2b2lkIHNlbmRTcGFuUmVtb3ZlZCgKLWphdmEubGFuZy5PYmplY3QKLWludAotaW50KQotCi1wcml2YXRlIHZvaWQgc2VuZFRleHRDaGFuZ2UoCi1hbmRyb2lkLnRleHQuVGV4dFdhdGNoZXJbXQotaW50Ci1pbnQKLWludCkKLQotcHJpdmF0ZSB2b2lkIHNlbmRUZXh0SGFzQ2hhbmdlZCgKLWFuZHJvaWQudGV4dC5UZXh0V2F0Y2hlcltdKQotCi1wcml2YXRlIGFuZHJvaWQudGV4dC5UZXh0V2F0Y2hlcltdIHNlbmRUZXh0V2lsbENoYW5nZSgKLWludAotaW50Ci1pbnQpCi0KLXByaXZhdGUgdm9pZCBzZXRTcGFuKAotYm9vbGVhbgotamF2YS5sYW5nLk9iamVjdAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciB2YWx1ZU9mKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotcHVibGljIHZvbGF0aWxlIGFuZHJvaWQudGV4dC5FZGl0YWJsZSBhcHBlbmQoCi1jaGFyKQotCi1wdWJsaWMgdm9sYXRpbGUgYW5kcm9pZC50ZXh0LkVkaXRhYmxlIGFwcGVuZCgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi0KLXB1YmxpYyB2b2xhdGlsZSBhbmRyb2lkLnRleHQuRWRpdGFibGUgYXBwZW5kKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotaW50Ci1pbnQpCi0KLXB1YmxpYyBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBhcHBlbmQoCi1jaGFyKQotCi1wdWJsaWMgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgYXBwZW5kKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotcHVibGljIGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmdCdWlsZGVyIGFwcGVuZCgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLkFwcGVuZGFibGUgYXBwZW5kKAotY2hhcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5BcHBlbmRhYmxlIGFwcGVuZCgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuQXBwZW5kYWJsZSBhcHBlbmQoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludCkKLQotcHVibGljIGNoYXIgY2hhckF0KAotaW50KQotCi1wdWJsaWMgdm9pZCBjbGVhcigpCi0KLXB1YmxpYyB2b2lkIGNsZWFyU3BhbnMoKQotCi1wdWJsaWMgdm9sYXRpbGUgYW5kcm9pZC50ZXh0LkVkaXRhYmxlIGRlbGV0ZSgKLWludAotaW50KQotCi1wdWJsaWMgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgZGVsZXRlKAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIGRyYXdUZXh0KAotYW5kcm9pZC5ncmFwaGljcy5DYW52YXMKLWludAotaW50Ci1mbG9hdAotZmxvYXQKLWFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQpCi0KLXB1YmxpYyB2b2lkIGdldENoYXJzKAotaW50Ci1pbnQKLWNoYXJbXQotaW50KQotCi1wdWJsaWMgYW5kcm9pZC50ZXh0LklucHV0RmlsdGVyW10gZ2V0RmlsdGVycygpCi0KLXB1YmxpYyBpbnQgZ2V0U3BhbkVuZCgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBpbnQgZ2V0U3BhbkZsYWdzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGludCBnZXRTcGFuU3RhcnQoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz4oSUlMamF2YS9sYW5nL0NsYXNzPFRUOz47KVtUVDsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3RbXSBnZXRTcGFucygKLWludAotaW50Ci1qYXZhLmxhbmcuQ2xhc3MpCi0KLXB1YmxpYyBpbnQgZ2V0VGV4dFdpZHRocygKLWludAotaW50Ci1mbG9hdFtdCi1hbmRyb2lkLmdyYXBoaWNzLlBhaW50KQotCi1wdWJsaWMgdm9sYXRpbGUgYW5kcm9pZC50ZXh0LkVkaXRhYmxlIGluc2VydCgKLWludAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotcHVibGljIHZvbGF0aWxlIGFuZHJvaWQudGV4dC5FZGl0YWJsZSBpbnNlcnQoCi1pbnQKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWludAotaW50KQotCi1wdWJsaWMgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgaW5zZXJ0KAotaW50Ci1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotCi1wdWJsaWMgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgaW5zZXJ0KAotaW50Ci1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludCkKLQotcHVibGljIGludCBsZW5ndGgoKQotCi1wdWJsaWMgZmxvYXQgbWVhc3VyZVRleHQoCi1pbnQKLWludAotYW5kcm9pZC5ncmFwaGljcy5QYWludCkKLQotcHVibGljIGludCBuZXh0U3BhblRyYW5zaXRpb24oCi1pbnQKLWludAotamF2YS5sYW5nLkNsYXNzKQotCi1wdWJsaWMgdm9pZCByZW1vdmVTcGFuKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHZvbGF0aWxlIGFuZHJvaWQudGV4dC5FZGl0YWJsZSByZXBsYWNlKAotaW50Ci1pbnQKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi0KLXB1YmxpYyB2b2xhdGlsZSBhbmRyb2lkLnRleHQuRWRpdGFibGUgcmVwbGFjZSgKLWludAotaW50Ci1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludCkKLQotcHVibGljIGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmdCdWlsZGVyIHJlcGxhY2UoCi1pbnQKLWludAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotcHVibGljIGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmdCdWlsZGVyIHJlcGxhY2UoCi1pbnQKLWludAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldEZpbHRlcnMoCi1hbmRyb2lkLnRleHQuSW5wdXRGaWx0ZXJbXSkKLQotcHVibGljIHZvaWQgc2V0U3BhbigKLWphdmEubGFuZy5PYmplY3QKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIHN1YlNlcXVlbmNlKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLnRleHQuU3Bhbm5lZFN0cmluZyBleHRlbmRzIGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmdJbnRlcm5hbCBpbXBsZW1lbnRzIGphdmEubGFuZy5DaGFyU2VxdWVuY2UsIGFuZHJvaWQudGV4dC5HZXRDaGFycywgYW5kcm9pZC50ZXh0LlNwYW5uZWQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotaW50Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC50ZXh0LlNwYW5uZWRTdHJpbmcgdmFsdWVPZigKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi0KLXB1YmxpYyB2b2xhdGlsZSBpbnQgZ2V0U3BhbkVuZCgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2xhdGlsZSBpbnQgZ2V0U3BhbkZsYWdzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHZvbGF0aWxlIGludCBnZXRTcGFuU3RhcnQoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdFtdIGdldFNwYW5zKAotaW50Ci1pbnQKLWphdmEubGFuZy5DbGFzcykKLQotcHVibGljIHZvbGF0aWxlIGludCBuZXh0U3BhblRyYW5zaXRpb24oCi1pbnQKLWludAotamF2YS5sYW5nLkNsYXNzKQotCi1wdWJsaWMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBzdWJTZXF1ZW5jZSgKLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQudGV4dC5TdGF0aWNMYXlvdXQgZXh0ZW5kcyBhbmRyb2lkLnRleHQuTGF5b3V0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT0xVTU5TX0VMTElQU0laRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OU19OT1JNQUwKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFU0NFTlQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJUgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElSX01BU0sKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJUl9TSElGVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRUxMSVBTSVNfQ09VTlQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVMTElQU0lTX1NUQVJUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgRklSU1RfUklHSFRfVE9fTEVGVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBUlQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVJUX01BU0sKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRBQgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEFCX01BU0sKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPUAotCi1wcml2YXRlIGludCBtQm90dG9tUGFkZGluZwotCi1wcml2YXRlIGJ5dGVbXSBtQ2hkaXJzCi0KLXByaXZhdGUgY2hhcltdIG1DaHMKLQotcHJpdmF0ZSBpbnQgbUNvbHVtbnMKLQotcHJpdmF0ZSBpbnQgbUVsbGlwc2l6ZWRXaWR0aAotCi1wcml2YXRlIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQkRm9udE1ldHJpY3NJbnQgbUZvbnRNZXRyaWNzSW50Ci0KLXByaXZhdGUgaW50IG1MaW5lQ291bnQKLQotcHJpdmF0ZSBhbmRyb2lkLnRleHQuTGF5b3V0JERpcmVjdGlvbnNbXSBtTGluZURpcmVjdGlvbnMKLQotcHJpdmF0ZSBpbnRbXSBtTGluZXMKLQotcHJpdmF0ZSBpbnQgbVRvcFBhZGRpbmcKLQotcHJpdmF0ZSBmbG9hdFtdIG1XaWR0aHMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludAotYW5kcm9pZC50ZXh0LlRleHRQYWludAotaW50Ci1hbmRyb2lkLnRleHQuTGF5b3V0JEFsaWdubWVudAotZmxvYXQKLWZsb2F0Ci1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludAotYW5kcm9pZC50ZXh0LlRleHRQYWludAotaW50Ci1hbmRyb2lkLnRleHQuTGF5b3V0JEFsaWdubWVudAotZmxvYXQKLWZsb2F0Ci1ib29sZWFuCi1hbmRyb2lkLnRleHQuVGV4dFV0aWxzJFRydW5jYXRlQXQKLWludCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotYW5kcm9pZC50ZXh0LlRleHRQYWludAotaW50Ci1hbmRyb2lkLnRleHQuTGF5b3V0JEFsaWdubWVudAotZmxvYXQKLWZsb2F0Ci1ib29sZWFuKQotCi0gdm9pZCA8aW5pdD4oCi1ib29sZWFuKQotCi1wcml2YXRlIHZvaWQgY2FsY3VsYXRlRWxsaXBzaXMoCi1pbnQKLWludAotZmxvYXRbXQotaW50Ci1pbnQKLWZsb2F0Ci1hbmRyb2lkLnRleHQuVGV4dFV0aWxzJFRydW5jYXRlQXQKLWludAotZmxvYXQKLWFuZHJvaWQudGV4dC5UZXh0UGFpbnQpCi0KLXByaXZhdGUgc3RhdGljIGludCBnZXRGaXQoCi1hbmRyb2lkLnRleHQuVGV4dFBhaW50Ci1hbmRyb2lkLnRleHQuVGV4dFBhaW50Ci1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludAotZmxvYXQpCi0KLXByaXZhdGUgaW50IG91dCgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludAotZmxvYXQKLWZsb2F0Ci1hbmRyb2lkLnRleHQuc3R5bGUuTGluZUhlaWdodFNwYW5bXQotaW50W10KLWFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQkRm9udE1ldHJpY3NJbnQKLWJvb2xlYW4KLWJvb2xlYW4KLWludAotYnl0ZVtdCi1pbnQKLWJvb2xlYW4KLWJvb2xlYW4KLWJvb2xlYW4KLWJvb2xlYW4KLWZsb2F0W10KLWludAotaW50Ci1hbmRyb2lkLnRleHQuVGV4dFV0aWxzJFRydW5jYXRlQXQKLWZsb2F0Ci1mbG9hdAotYW5kcm9pZC50ZXh0LlRleHRQYWludCkKLQotIHZvaWQgZ2VuZXJhdGUoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludAotYW5kcm9pZC50ZXh0LlRleHRQYWludAotaW50Ci1hbmRyb2lkLnRleHQuTGF5b3V0JEFsaWdubWVudAotZmxvYXQKLWZsb2F0Ci1ib29sZWFuCi1ib29sZWFuCi1ib29sZWFuCi1mbG9hdAotYW5kcm9pZC50ZXh0LlRleHRVdGlscyRUcnVuY2F0ZUF0KQotCi1wdWJsaWMgaW50IGdldEJvdHRvbVBhZGRpbmcoKQotCi1wdWJsaWMgaW50IGdldEVsbGlwc2lzQ291bnQoCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0RWxsaXBzaXNTdGFydCgKLWludCkKLQotcHVibGljIGludCBnZXRFbGxpcHNpemVkV2lkdGgoKQotCi1wdWJsaWMgYm9vbGVhbiBnZXRMaW5lQ29udGFpbnNUYWIoCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0TGluZUNvdW50KCkKLQotcHVibGljIGludCBnZXRMaW5lRGVzY2VudCgKLWludCkKLQotcHVibGljIGZpbmFsIGFuZHJvaWQudGV4dC5MYXlvdXQkRGlyZWN0aW9ucyBnZXRMaW5lRGlyZWN0aW9ucygKLWludCkKLQotcHVibGljIGludCBnZXRMaW5lRm9yVmVydGljYWwoCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0TGluZVN0YXJ0KAotaW50KQotCi1wdWJsaWMgaW50IGdldExpbmVUb3AoCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKAotaW50KQotCi1wdWJsaWMgaW50IGdldFRvcFBhZGRpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotIGNsYXNzIGFuZHJvaWQudGV4dC5TdHlsZWQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBmbG9hdCBkcmF3VGV4dCgKLWFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludAotaW50Ci1ib29sZWFuCi1mbG9hdAotaW50Ci1pbnQKLWludAotYW5kcm9pZC50ZXh0LlRleHRQYWludAotYW5kcm9pZC50ZXh0LlRleHRQYWludAotYm9vbGVhbikKLQotcHJpdmF0ZSBzdGF0aWMgZmxvYXQgZWFjaCgKLWFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzCi1hbmRyb2lkLnRleHQuU3Bhbm5lZAotaW50Ci1pbnQKLWludAotYm9vbGVhbgotZmxvYXQKLWludAotaW50Ci1pbnQKLWFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQkRm9udE1ldHJpY3NJbnQKLWFuZHJvaWQudGV4dC5UZXh0UGFpbnQKLWFuZHJvaWQudGV4dC5UZXh0UGFpbnQKLWJvb2xlYW4pCi0KLXByaXZhdGUgc3RhdGljIGZsb2F0IGZvcmVhY2goCi1hbmRyb2lkLmdyYXBoaWNzLkNhbnZhcwotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotaW50Ci1pbnQKLWludAotYm9vbGVhbgotZmxvYXQKLWludAotaW50Ci1pbnQKLWFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQkRm9udE1ldHJpY3NJbnQKLWFuZHJvaWQudGV4dC5UZXh0UGFpbnQKLWFuZHJvaWQudGV4dC5UZXh0UGFpbnQKLWJvb2xlYW4pCi0KLXB1YmxpYyBzdGF0aWMgaW50IGdldFRleHRXaWR0aHMoCi1hbmRyb2lkLnRleHQuVGV4dFBhaW50Ci1hbmRyb2lkLnRleHQuVGV4dFBhaW50Ci1hbmRyb2lkLnRleHQuU3Bhbm5lZAotaW50Ci1pbnQKLWZsb2F0W10KLWFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQkRm9udE1ldHJpY3NJbnQpCi0KLXB1YmxpYyBzdGF0aWMgZmxvYXQgbWVhc3VyZVRleHQoCi1hbmRyb2lkLnRleHQuVGV4dFBhaW50Ci1hbmRyb2lkLnRleHQuVGV4dFBhaW50Ci1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludAotYW5kcm9pZC5ncmFwaGljcy5QYWludCRGb250TWV0cmljc0ludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnRleHQuVGV4dFBhaW50IGV4dGVuZHMgYW5kcm9pZC5ncmFwaGljcy5QYWludAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgaW50IGJhc2VsaW5lU2hpZnQKLQotcHVibGljIGludCBiZ0NvbG9yCi0KLXB1YmxpYyBpbnRbXSBkcmF3YWJsZVN0YXRlCi0KLXB1YmxpYyBpbnQgbGlua0NvbG9yCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmdyYXBoaWNzLlBhaW50KQotCi1wdWJsaWMgdm9pZCBzZXQoCi1hbmRyb2lkLnRleHQuVGV4dFBhaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3RleHQvVGV4dFV0aWxzOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExqYXZhL2xhbmcvQ2hhclNlcXVlbmNlOz47ICkKLWZpbmFsIGNsYXNzIGFuZHJvaWQudGV4dC5UZXh0VXRpbHMkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZVtdIG5ld0FycmF5KAotaW50KQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdFtdIG5ld0FycmF5KAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9UmV2ZXJzZXIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdGV4dC9UZXh0VXRpbHM7ICkKLSBjbGFzcyBhbmRyb2lkLnRleHQuVGV4dFV0aWxzJFJldmVyc2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5DaGFyU2VxdWVuY2UsIGFuZHJvaWQudGV4dC5HZXRDaGFycwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGludCBtRW5kCi0KLXByaXZhdGUgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBtU291cmNlCi0KLXByaXZhdGUgaW50IG1TdGFydAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWludAotaW50KQotCi1wdWJsaWMgY2hhciBjaGFyQXQoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdldENoYXJzKAotaW50Ci1pbnQKLWNoYXJbXQotaW50KQotCi1wdWJsaWMgaW50IGxlbmd0aCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIHN1YlNlcXVlbmNlKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC90ZXh0L1RleHRVdGlsczsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNjQwOSBuYW1lID1UcnVuY2F0ZUF0ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL0VudW08TGFuZHJvaWQvdGV4dC9UZXh0VXRpbHMkVHJ1bmNhdGVBdDs+OyApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC50ZXh0LlRleHRVdGlscyRUcnVuY2F0ZUF0IGV4dGVuZHMgamF2YS5sYW5nLkVudW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYW5kcm9pZC50ZXh0LlRleHRVdGlscyRUcnVuY2F0ZUF0W10gJFZBTFVFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudGV4dC5UZXh0VXRpbHMkVHJ1bmNhdGVBdCBFTkQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzJFRydW5jYXRlQXQgTUlERExFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC50ZXh0LlRleHRVdGlscyRUcnVuY2F0ZUF0IFNUQVJUCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpViApCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQudGV4dC5UZXh0VXRpbHMkVHJ1bmNhdGVBdCB2YWx1ZU9mKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLnRleHQuVGV4dFV0aWxzJFRydW5jYXRlQXRbXSB2YWx1ZXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvdGV4dC9UZXh0VXRpbHMkRWxsaXBzaXplQ2FsbGJhY2s7TGFuZHJvaWQvdGV4dC9UZXh0VXRpbHMkVHJ1bmNhdGVBdDtMYW5kcm9pZC90ZXh0L1RleHRVdGlscyRSZXZlcnNlcjtMYW5kcm9pZC90ZXh0L1RleHRVdGlscyRTaW1wbGVTdHJpbmdTcGxpdHRlcjtMYW5kcm9pZC90ZXh0L1RleHRVdGlscyRTdHJpbmdTcGxpdHRlcjsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQudGV4dC5UZXh0VXRpbHMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBQlNPTFVURV9TSVpFX1NQQU4KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFMSUdOTUVOVF9TUEFOCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBTk5PVEFUSU9OCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCQUNLR1JPVU5EX0NPTE9SX1NQQU4KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVTExFVF9TUEFOCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExqYXZhL2xhbmcvQ2hhclNlcXVlbmNlOz47ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IgQ0hBUl9TRVFVRU5DRV9DUkVBVE9SCi0KLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmdbXSBFTVBUWV9TVFJJTkdfQVJSQVkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZPUkVHUk9VTkRfQ09MT1JfU1BBTgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTEVBRElOR19NQVJHSU5fU1BBTgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUVVPVEVfU1BBTgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVMQVRJVkVfU0laRV9TUEFOCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTQ0FMRV9YX1NQQU4KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUUklLRVRIUk9VR0hfU1BBTgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RZTEVfU1BBTgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1VCU0NSSVBUX1NQQU4KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNVUEVSU0NSSVBUX1NQQU4KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRFWFRfQVBQRUFSQU5DRV9TUEFOCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUWVBFRkFDRV9TUEFOCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVTkRFUkxJTkVfU1BBTgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVVJMX1NQQU4KLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBzRWxsaXBzaXMKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLk9iamVjdCBzTG9jawotCi1wcml2YXRlIHN0YXRpYyBjaGFyW10gc1RlbXAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMDAwKAotYW5kcm9pZC5vcy5QYXJjZWwKLWFuZHJvaWQudGV4dC5TcGFubmFibGUKLWphdmEubGFuZy5PYmplY3QpCi0KLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgYmxhbmsoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIGNvbW1hRWxsaXBzaXplKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotYW5kcm9pZC50ZXh0LlRleHRQYWludAotZmxvYXQKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgdHJhbnNpZW50IGphdmEubGFuZy5DaGFyU2VxdWVuY2UgY29uY2F0KAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZVtdKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgY29weVNwYW5zRnJvbSgKLWFuZHJvaWQudGV4dC5TcGFubmVkCi1pbnQKLWludAotamF2YS5sYW5nLkNsYXNzCi1hbmRyb2lkLnRleHQuU3Bhbm5hYmxlCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBlbGxpcHNpemUoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1hbmRyb2lkLnRleHQuVGV4dFBhaW50Ci1mbG9hdAotYW5kcm9pZC50ZXh0LlRleHRVdGlscyRUcnVuY2F0ZUF0KQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgZWxsaXBzaXplKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotYW5kcm9pZC50ZXh0LlRleHRQYWludAotZmxvYXQKLWFuZHJvaWQudGV4dC5UZXh0VXRpbHMkVHJ1bmNhdGVBdAotYm9vbGVhbgotYW5kcm9pZC50ZXh0LlRleHRVdGlscyRFbGxpcHNpemVDYWxsYmFjaykKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi0KLXB1YmxpYyBzdGF0aWMgdHJhbnNpZW50IGphdmEubGFuZy5DaGFyU2VxdWVuY2UgZXhwYW5kVGVtcGxhdGUoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlW10pCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRDaGFycygKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWludAotaW50Ci1jaGFyW10KLWludCkKLQotcHVibGljIHN0YXRpYyBpbnQgZ2V0T2Zmc2V0QWZ0ZXIoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgaW50IGdldE9mZnNldEJlZm9yZSgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWludCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIGdldFJldmVyc2UoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBpbnQgZ2V0VHJpbW1lZExlbmd0aCgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBodG1sRW5jb2RlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBpbnQgaW5kZXhPZigKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWNoYXIpCi0KLXB1YmxpYyBzdGF0aWMgaW50IGluZGV4T2YoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1jaGFyCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgaW50IGluZGV4T2YoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1jaGFyCi1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBpbnQgaW5kZXhPZigKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi0KLXB1YmxpYyBzdGF0aWMgaW50IGluZGV4T2YoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgaW50IGluZGV4T2YoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGlnaXRzT25seSgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0VtcHR5KAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzR3JhcGhpYygKLWNoYXIpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0dyYXBoaWMoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgam9pbigKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWphdmEubGFuZy5JdGVyYWJsZSkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGpvaW4oCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1qYXZhLmxhbmcuT2JqZWN0W10pCi0KLXB1YmxpYyBzdGF0aWMgaW50IGxhc3RJbmRleE9mKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotY2hhcikKLQotcHVibGljIHN0YXRpYyBpbnQgbGFzdEluZGV4T2YoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1jaGFyCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgaW50IGxhc3RJbmRleE9mKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotY2hhcgotaW50Ci1pbnQpCi0KLXN0YXRpYyBjaGFyW10gb2J0YWluKAotaW50KQotCi1wcml2YXRlIHN0YXRpYyB2b2lkIHJlYWRTcGFuKAotYW5kcm9pZC5vcy5QYXJjZWwKLWFuZHJvaWQudGV4dC5TcGFubmFibGUKLWphdmEubGFuZy5PYmplY3QpCi0KLXN0YXRpYyB2b2lkIHJlY3ljbGUoCi1jaGFyW10pCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZWdpb25NYXRjaGVzKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotaW50Ci1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIHJlcGxhY2UoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1qYXZhLmxhbmcuU3RyaW5nW10KLWphdmEubGFuZy5DaGFyU2VxdWVuY2VbXSkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nW10gc3BsaXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmdbXSBzcGxpdCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudXRpbC5yZWdleC5QYXR0ZXJuKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5DaGFyU2VxdWVuY2Ugc3RyaW5nT3JTcGFubmVkU3RyaW5nKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIHN1YnN0cmluZygKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVUb1BhcmNlbCgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWFuZHJvaWQub3MuUGFyY2VsCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVXaGVyZSgKLWFuZHJvaWQub3MuUGFyY2VsCi1hbmRyb2lkLnRleHQuU3Bhbm5lZAotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC50ZXh0Lm1ldGhvZC5Nb3ZlbWVudE1ldGhvZCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBjYW5TZWxlY3RBcmJpdHJhcmlseSgpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGluaXRpYWxpemUoCi1hbmRyb2lkLndpZGdldC5UZXh0VmlldwotYW5kcm9pZC50ZXh0LlNwYW5uYWJsZSkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gb25LZXlEb3duKAotYW5kcm9pZC53aWRnZXQuVGV4dFZpZXcKLWFuZHJvaWQudGV4dC5TcGFubmFibGUKLWludAotYW5kcm9pZC52aWV3LktleUV2ZW50KQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBvbktleVVwKAotYW5kcm9pZC53aWRnZXQuVGV4dFZpZXcKLWFuZHJvaWQudGV4dC5TcGFubmFibGUKLWludAotYW5kcm9pZC52aWV3LktleUV2ZW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvblRha2VGb2N1cygKLWFuZHJvaWQud2lkZ2V0LlRleHRWaWV3Ci1hbmRyb2lkLnRleHQuU3Bhbm5hYmxlCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIG9uVG91Y2hFdmVudCgKLWFuZHJvaWQud2lkZ2V0LlRleHRWaWV3Ci1hbmRyb2lkLnRleHQuU3Bhbm5hYmxlCi1hbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIG9uVHJhY2tiYWxsRXZlbnQoCi1hbmRyb2lkLndpZGdldC5UZXh0VmlldwotYW5kcm9pZC50ZXh0LlNwYW5uYWJsZQotYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQudGV4dC5tZXRob2QuQXJyb3dLZXlNb3ZlbWVudE1ldGhvZCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnRleHQubWV0aG9kLk1vdmVtZW50TWV0aG9kCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGFuZHJvaWQudGV4dC5tZXRob2QuQXJyb3dLZXlNb3ZlbWVudE1ldGhvZCBzSW5zdGFuY2UKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIGJvb2xlYW4gZG93bigKLWFuZHJvaWQud2lkZ2V0LlRleHRWaWV3Ci1hbmRyb2lkLnRleHQuU3Bhbm5hYmxlKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQudGV4dC5tZXRob2QuTW92ZW1lbnRNZXRob2QgZ2V0SW5zdGFuY2UoKQotCi1wcml2YXRlIGJvb2xlYW4gbGVmdCgKLWFuZHJvaWQud2lkZ2V0LlRleHRWaWV3Ci1hbmRyb2lkLnRleHQuU3Bhbm5hYmxlKQotCi1wcml2YXRlIGJvb2xlYW4gcmlnaHQoCi1hbmRyb2lkLndpZGdldC5UZXh0VmlldwotYW5kcm9pZC50ZXh0LlNwYW5uYWJsZSkKLQotcHJpdmF0ZSBib29sZWFuIHVwKAotYW5kcm9pZC53aWRnZXQuVGV4dFZpZXcKLWFuZHJvaWQudGV4dC5TcGFubmFibGUpCi0KLXB1YmxpYyBib29sZWFuIGNhblNlbGVjdEFyYml0cmFyaWx5KCkKLQotcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgKLWFuZHJvaWQud2lkZ2V0LlRleHRWaWV3Ci1hbmRyb2lkLnRleHQuU3Bhbm5hYmxlKQotCi1wdWJsaWMgYm9vbGVhbiBvbktleURvd24oCi1hbmRyb2lkLndpZGdldC5UZXh0VmlldwotYW5kcm9pZC50ZXh0LlNwYW5uYWJsZQotaW50Ci1hbmRyb2lkLnZpZXcuS2V5RXZlbnQpCi0KLXB1YmxpYyBib29sZWFuIG9uS2V5VXAoCi1hbmRyb2lkLndpZGdldC5UZXh0VmlldwotYW5kcm9pZC50ZXh0LlNwYW5uYWJsZQotaW50Ci1hbmRyb2lkLnZpZXcuS2V5RXZlbnQpCi0KLXB1YmxpYyB2b2lkIG9uVGFrZUZvY3VzKAotYW5kcm9pZC53aWRnZXQuVGV4dFZpZXcKLWFuZHJvaWQudGV4dC5TcGFubmFibGUKLWludCkKLQotcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KAotYW5kcm9pZC53aWRnZXQuVGV4dFZpZXcKLWFuZHJvaWQudGV4dC5TcGFubmFibGUKLWFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCkKLQotcHVibGljIGJvb2xlYW4gb25UcmFja2JhbGxFdmVudCgKLWFuZHJvaWQud2lkZ2V0LlRleHRWaWV3Ci1hbmRyb2lkLnRleHQuU3Bhbm5hYmxlCi1hbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC50ZXh0Lm1ldGhvZC5NZXRhS2V5S2V5TGlzdGVuZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5PYmplY3QgQUxUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5PYmplY3QgQ0FQCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMT0NLRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVUQV9BTFRfTE9DS0VECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FVEFfQUxUX09OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FVEFfQ0FQX0xPQ0tFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVRBX1NISUZUX09OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FVEFfU1lNX0xPQ0tFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVRBX1NZTV9PTgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFJFU1NFRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVMRUFTRUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLk9iamVjdCBTWU0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVTRUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgYWRqdXN0KAotYW5kcm9pZC50ZXh0LlNwYW5uYWJsZQotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHN0YXRpYyB2b2lkIGFkanVzdE1ldGFBZnRlcktleXByZXNzKAotYW5kcm9pZC50ZXh0LlNwYW5uYWJsZSkKLQotcHJpdmF0ZSBzdGF0aWMgaW50IGdldEFjdGl2ZSgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWphdmEubGFuZy5PYmplY3QKLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBnZXRNZXRhU3RhdGUoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBnZXRNZXRhU3RhdGUoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc01ldGFUcmFja2VyKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotamF2YS5sYW5nLk9iamVjdCkKLQotcHJpdmF0ZSB2b2lkIHByZXNzKAotYW5kcm9pZC50ZXh0LkVkaXRhYmxlCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wcml2YXRlIHZvaWQgcmVsZWFzZSgKLWFuZHJvaWQudGV4dC5FZGl0YWJsZQotamF2YS5sYW5nLk9iamVjdCkKLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCByZXNldExvY2soCi1hbmRyb2lkLnRleHQuU3Bhbm5hYmxlCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wcm90ZWN0ZWQgc3RhdGljIHZvaWQgcmVzZXRMb2NrZWRNZXRhKAotYW5kcm9pZC50ZXh0LlNwYW5uYWJsZSkKLQotcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0TWV0YVN0YXRlKAotYW5kcm9pZC50ZXh0LlNwYW5uYWJsZSkKLQotcHVibGljIGJvb2xlYW4gb25LZXlEb3duKAotYW5kcm9pZC52aWV3LlZpZXcKLWFuZHJvaWQudGV4dC5FZGl0YWJsZQotaW50Ci1hbmRyb2lkLnZpZXcuS2V5RXZlbnQpCi0KLXB1YmxpYyBib29sZWFuIG9uS2V5VXAoCi1hbmRyb2lkLnZpZXcuVmlldwotYW5kcm9pZC50ZXh0LkVkaXRhYmxlCi1pbnQKLWFuZHJvaWQudmlldy5LZXlFdmVudCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC50ZXh0Lm1ldGhvZC5LZXlMaXN0ZW5lciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBvbktleURvd24oCi1hbmRyb2lkLnZpZXcuVmlldwotYW5kcm9pZC50ZXh0LkVkaXRhYmxlCi1pbnQKLWFuZHJvaWQudmlldy5LZXlFdmVudCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gb25LZXlVcCgKLWFuZHJvaWQudmlldy5WaWV3Ci1hbmRyb2lkLnRleHQuRWRpdGFibGUKLWludAotYW5kcm9pZC52aWV3LktleUV2ZW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGFuZHJvaWQudGV4dC5tZXRob2QuQmFzZUtleUxpc3RlbmVyIGV4dGVuZHMgYW5kcm9pZC50ZXh0Lm1ldGhvZC5NZXRhS2V5S2V5TGlzdGVuZXIgaW1wbGVtZW50cyBhbmRyb2lkLnRleHQubWV0aG9kLktleUxpc3RlbmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuT2JqZWN0IE9MRF9TRUxfU1RBUlQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgYm9vbGVhbiBhbHRCYWNrc3BhY2UoCi1hbmRyb2lkLnZpZXcuVmlldwotYW5kcm9pZC50ZXh0LkVkaXRhYmxlCi1pbnQKLWFuZHJvaWQudmlldy5LZXlFdmVudCkKLQotcHVibGljIGJvb2xlYW4gYmFja3NwYWNlKAotYW5kcm9pZC52aWV3LlZpZXcKLWFuZHJvaWQudGV4dC5FZGl0YWJsZQotaW50Ci1hbmRyb2lkLnZpZXcuS2V5RXZlbnQpCi0KLXB1YmxpYyBib29sZWFuIG9uS2V5RG93bigKLWFuZHJvaWQudmlldy5WaWV3Ci1hbmRyb2lkLnRleHQuRWRpdGFibGUKLWludAotYW5kcm9pZC52aWV3LktleUV2ZW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3RleHQvbWV0aG9kL0NoYXJhY3RlclBpY2tlckRpYWxvZzsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPU9wdGlvbnNBZGFwdGVyICkKLSBjbGFzcyBhbmRyb2lkLnRleHQubWV0aG9kLkNoYXJhY3RlclBpY2tlckRpYWxvZyRPcHRpb25zQWRhcHRlciBleHRlbmRzIGFuZHJvaWQud2lkZ2V0LkJhc2VBZGFwdGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgbUNvbnRleHQKLQotZmluYWwgYW5kcm9pZC50ZXh0Lm1ldGhvZC5DaGFyYWN0ZXJQaWNrZXJEaWFsb2cgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC50ZXh0Lm1ldGhvZC5DaGFyYWN0ZXJQaWNrZXJEaWFsb2cKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wdWJsaWMgZmluYWwgaW50IGdldENvdW50KCkKLQotcHVibGljIGZpbmFsIGphdmEubGFuZy5PYmplY3QgZ2V0SXRlbSgKLWludCkKLQotcHVibGljIGZpbmFsIGxvbmcgZ2V0SXRlbUlkKAotaW50KQotCi1wdWJsaWMgYW5kcm9pZC52aWV3LlZpZXcgZ2V0VmlldygKLWludAotYW5kcm9pZC52aWV3LlZpZXcKLWFuZHJvaWQudmlldy5WaWV3R3JvdXApCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC90ZXh0L21ldGhvZC9DaGFyYWN0ZXJQaWNrZXJEaWFsb2ckT3B0aW9uc0FkYXB0ZXI7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnRleHQubWV0aG9kLkNoYXJhY3RlclBpY2tlckRpYWxvZyBleHRlbmRzIGFuZHJvaWQuYXBwLkRpYWxvZyBpbXBsZW1lbnRzIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3JE9uSXRlbUNsaWNrTGlzdGVuZXIsIGFuZHJvaWQudmlldy5WaWV3JE9uQ2xpY2tMaXN0ZW5lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlciBtSW5mbGF0ZXIKLQotcHJpdmF0ZSBib29sZWFuIG1JbnNlcnQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1PcHRpb25zCi0KLXByaXZhdGUgYW5kcm9pZC50ZXh0LkVkaXRhYmxlIG1UZXh0Ci0KLXByaXZhdGUgYW5kcm9pZC52aWV3LlZpZXcgbVZpZXcKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC52aWV3LlZpZXcKLWFuZHJvaWQudGV4dC5FZGl0YWJsZQotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotc3RhdGljIGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlciBhY2Nlc3MkMDAwKAotYW5kcm9pZC50ZXh0Lm1ldGhvZC5DaGFyYWN0ZXJQaWNrZXJEaWFsb2cpCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGFjY2VzcyQxMDAoCi1hbmRyb2lkLnRleHQubWV0aG9kLkNoYXJhY3RlclBpY2tlckRpYWxvZykKLQotcHVibGljIHZvaWQgb25DbGljaygKLWFuZHJvaWQudmlldy5WaWV3KQotCi1wcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZSgKLWFuZHJvaWQub3MuQnVuZGxlKQotCi1wdWJsaWMgdm9pZCBvbkl0ZW1DbGljaygKLWFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3Ci1hbmRyb2lkLnZpZXcuVmlldwotaW50Ci1sb25nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGFuZHJvaWQudGV4dC5tZXRob2QuTnVtYmVyS2V5TGlzdGVuZXIgZXh0ZW5kcyBhbmRyb2lkLnRleHQubWV0aG9kLkJhc2VLZXlMaXN0ZW5lciBpbXBsZW1lbnRzIGFuZHJvaWQudGV4dC5JbnB1dEZpbHRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBvaygKLWNoYXJbXQotY2hhcikKLQotcHVibGljIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgZmlsdGVyKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotaW50Ci1pbnQKLWFuZHJvaWQudGV4dC5TcGFubmVkCi1pbnQKLWludCkKLQotcHJvdGVjdGVkIGFic3RyYWN0IGNoYXJbXSBnZXRBY2NlcHRlZENoYXJzKCkKLQotcHJvdGVjdGVkIGludCBsb29rdXAoCi1hbmRyb2lkLnZpZXcuS2V5RXZlbnQKLWFuZHJvaWQudGV4dC5TcGFubmFibGUpCi0KLXB1YmxpYyBib29sZWFuIG9uS2V5RG93bigKLWFuZHJvaWQudmlldy5WaWV3Ci1hbmRyb2lkLnRleHQuRWRpdGFibGUKLWludAotYW5kcm9pZC52aWV3LktleUV2ZW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQudGV4dC5tZXRob2QuRGF0ZUtleUxpc3RlbmVyIGV4dGVuZHMgYW5kcm9pZC50ZXh0Lm1ldGhvZC5OdW1iZXJLZXlMaXN0ZW5lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBDSEFSQUNURVJTCi0KLXByaXZhdGUgc3RhdGljIGFuZHJvaWQudGV4dC5tZXRob2QuRGF0ZUtleUxpc3RlbmVyIHNJbnN0YW5jZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLnRleHQubWV0aG9kLkRhdGVLZXlMaXN0ZW5lciBnZXRJbnN0YW5jZSgpCi0KLXByb3RlY3RlZCBjaGFyW10gZ2V0QWNjZXB0ZWRDaGFycygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC50ZXh0Lm1ldGhvZC5EYXRlVGltZUtleUxpc3RlbmVyIGV4dGVuZHMgYW5kcm9pZC50ZXh0Lm1ldGhvZC5OdW1iZXJLZXlMaXN0ZW5lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBDSEFSQUNURVJTCi0KLXByaXZhdGUgc3RhdGljIGFuZHJvaWQudGV4dC5tZXRob2QuRGF0ZVRpbWVLZXlMaXN0ZW5lciBzSW5zdGFuY2UKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC50ZXh0Lm1ldGhvZC5EYXRlVGltZUtleUxpc3RlbmVyIGdldEluc3RhbmNlKCkKLQotcHJvdGVjdGVkIGNoYXJbXSBnZXRBY2NlcHRlZENoYXJzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnRleHQubWV0aG9kLkRpYWxlcktleUxpc3RlbmVyIGV4dGVuZHMgYW5kcm9pZC50ZXh0Lm1ldGhvZC5OdW1iZXJLZXlMaXN0ZW5lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBDSEFSQUNURVJTCi0KLXByaXZhdGUgc3RhdGljIGFuZHJvaWQudGV4dC5tZXRob2QuRGlhbGVyS2V5TGlzdGVuZXIgc0luc3RhbmNlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQudGV4dC5tZXRob2QuRGlhbGVyS2V5TGlzdGVuZXIgZ2V0SW5zdGFuY2UoKQotCi1wcm90ZWN0ZWQgY2hhcltdIGdldEFjY2VwdGVkQ2hhcnMoKQotCi1wcm90ZWN0ZWQgaW50IGxvb2t1cCgKLWFuZHJvaWQudmlldy5LZXlFdmVudAotYW5kcm9pZC50ZXh0LlNwYW5uYWJsZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnRleHQubWV0aG9kLkRpZ2l0c0tleUxpc3RlbmVyIGV4dGVuZHMgYW5kcm9pZC50ZXh0Lm1ldGhvZC5OdW1iZXJLZXlMaXN0ZW5lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW11bXSBDSEFSQUNURVJTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUNJTUFMCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSUdOCi0KLXByaXZhdGUgc3RhdGljIGFuZHJvaWQudGV4dC5tZXRob2QuRGlnaXRzS2V5TGlzdGVuZXJbXSBzSW5zdGFuY2UKLQotcHJpdmF0ZSBjaGFyW10gbUFjY2VwdGVkCi0KLXByaXZhdGUgYm9vbGVhbiBtRGVjaW1hbAotCi1wcml2YXRlIGJvb2xlYW4gbVNpZ24KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWJvb2xlYW4KLWJvb2xlYW4pCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC50ZXh0Lm1ldGhvZC5EaWdpdHNLZXlMaXN0ZW5lciBnZXRJbnN0YW5jZSgpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC50ZXh0Lm1ldGhvZC5EaWdpdHNLZXlMaXN0ZW5lciBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC50ZXh0Lm1ldGhvZC5EaWdpdHNLZXlMaXN0ZW5lciBnZXRJbnN0YW5jZSgKLWJvb2xlYW4KLWJvb2xlYW4pCi0KLXB1YmxpYyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIGZpbHRlcigKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWludAotaW50Ci1hbmRyb2lkLnRleHQuU3Bhbm5lZAotaW50Ci1pbnQpCi0KLXByb3RlY3RlZCBjaGFyW10gZ2V0QWNjZXB0ZWRDaGFycygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQudGV4dC5tZXRob2QuVHJhbnNmb3JtYXRpb25NZXRob2QgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5DaGFyU2VxdWVuY2UgZ2V0VHJhbnNmb3JtYXRpb24oCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1hbmRyb2lkLnZpZXcuVmlldykKLQotcHVibGljIGFic3RyYWN0IHZvaWQgb25Gb2N1c0NoYW5nZWQoCi1hbmRyb2lkLnZpZXcuVmlldwotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotYm9vbGVhbgotaW50Ci1hbmRyb2lkLmdyYXBoaWNzLlJlY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC90ZXh0L21ldGhvZC9SZXBsYWNlbWVudFRyYW5zZm9ybWF0aW9uTWV0aG9kJFNwYW5uZWRSZXBsYWNlbWVudENoYXJTZXF1ZW5jZTtMYW5kcm9pZC90ZXh0L21ldGhvZC9SZXBsYWNlbWVudFRyYW5zZm9ybWF0aW9uTWV0aG9kJFJlcGxhY2VtZW50Q2hhclNlcXVlbmNlOyApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC50ZXh0Lm1ldGhvZC5SZXBsYWNlbWVudFRyYW5zZm9ybWF0aW9uTWV0aG9kIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQudGV4dC5tZXRob2QuVHJhbnNmb3JtYXRpb25NZXRob2QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcm90ZWN0ZWQgYWJzdHJhY3QgY2hhcltdIGdldE9yaWdpbmFsKCkKLQotcHJvdGVjdGVkIGFic3RyYWN0IGNoYXJbXSBnZXRSZXBsYWNlbWVudCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIGdldFRyYW5zZm9ybWF0aW9uKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXB1YmxpYyB2b2lkIG9uRm9jdXNDaGFuZ2VkKAotYW5kcm9pZC52aWV3LlZpZXcKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWJvb2xlYW4KLWludAotYW5kcm9pZC5ncmFwaGljcy5SZWN0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQudGV4dC5tZXRob2QuSGlkZVJldHVybnNUcmFuc2Zvcm1hdGlvbk1ldGhvZCBleHRlbmRzIGFuZHJvaWQudGV4dC5tZXRob2QuUmVwbGFjZW1lbnRUcmFuc2Zvcm1hdGlvbk1ldGhvZAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBjaGFyW10gT1JJR0lOQUwKLQotcHJpdmF0ZSBzdGF0aWMgY2hhcltdIFJFUExBQ0VNRU5UCi0KLXByaXZhdGUgc3RhdGljIGFuZHJvaWQudGV4dC5tZXRob2QuSGlkZVJldHVybnNUcmFuc2Zvcm1hdGlvbk1ldGhvZCBzSW5zdGFuY2UKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC50ZXh0Lm1ldGhvZC5IaWRlUmV0dXJuc1RyYW5zZm9ybWF0aW9uTWV0aG9kIGdldEluc3RhbmNlKCkKLQotcHJvdGVjdGVkIGNoYXJbXSBnZXRPcmlnaW5hbCgpCi0KLXByb3RlY3RlZCBjaGFyW10gZ2V0UmVwbGFjZW1lbnQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQudGV4dC5tZXRob2QuU2Nyb2xsaW5nTW92ZW1lbnRNZXRob2QgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC50ZXh0Lm1ldGhvZC5Nb3ZlbWVudE1ldGhvZAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLnRleHQubWV0aG9kLlNjcm9sbGluZ01vdmVtZW50TWV0aG9kIHNJbnN0YW5jZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC50ZXh0Lm1ldGhvZC5Nb3ZlbWVudE1ldGhvZCBnZXRJbnN0YW5jZSgpCi0KLXB1YmxpYyBib29sZWFuIGNhblNlbGVjdEFyYml0cmFyaWx5KCkKLQotcHJvdGVjdGVkIGJvb2xlYW4gZG93bigKLWFuZHJvaWQud2lkZ2V0LlRleHRWaWV3Ci1hbmRyb2lkLnRleHQuU3Bhbm5hYmxlKQotCi1wdWJsaWMgdm9pZCBpbml0aWFsaXplKAotYW5kcm9pZC53aWRnZXQuVGV4dFZpZXcKLWFuZHJvaWQudGV4dC5TcGFubmFibGUpCi0KLXByb3RlY3RlZCBib29sZWFuIGxlZnQoCi1hbmRyb2lkLndpZGdldC5UZXh0VmlldwotYW5kcm9pZC50ZXh0LlNwYW5uYWJsZSkKLQotcHVibGljIGJvb2xlYW4gb25LZXlEb3duKAotYW5kcm9pZC53aWRnZXQuVGV4dFZpZXcKLWFuZHJvaWQudGV4dC5TcGFubmFibGUKLWludAotYW5kcm9pZC52aWV3LktleUV2ZW50KQotCi1wdWJsaWMgYm9vbGVhbiBvbktleVVwKAotYW5kcm9pZC53aWRnZXQuVGV4dFZpZXcKLWFuZHJvaWQudGV4dC5TcGFubmFibGUKLWludAotYW5kcm9pZC52aWV3LktleUV2ZW50KQotCi1wdWJsaWMgdm9pZCBvblRha2VGb2N1cygKLWFuZHJvaWQud2lkZ2V0LlRleHRWaWV3Ci1hbmRyb2lkLnRleHQuU3Bhbm5hYmxlCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudCgKLWFuZHJvaWQud2lkZ2V0LlRleHRWaWV3Ci1hbmRyb2lkLnRleHQuU3Bhbm5hYmxlCi1hbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQpCi0KLXB1YmxpYyBib29sZWFuIG9uVHJhY2tiYWxsRXZlbnQoCi1hbmRyb2lkLndpZGdldC5UZXh0VmlldwotYW5kcm9pZC50ZXh0LlNwYW5uYWJsZQotYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50KQotCi1wcm90ZWN0ZWQgYm9vbGVhbiByaWdodCgKLWFuZHJvaWQud2lkZ2V0LlRleHRWaWV3Ci1hbmRyb2lkLnRleHQuU3Bhbm5hYmxlKQotCi1wcm90ZWN0ZWQgYm9vbGVhbiB1cCgKLWFuZHJvaWQud2lkZ2V0LlRleHRWaWV3Ci1hbmRyb2lkLnRleHQuU3Bhbm5hYmxlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQudGV4dC5tZXRob2QuTGlua01vdmVtZW50TWV0aG9kIGV4dGVuZHMgYW5kcm9pZC50ZXh0Lm1ldGhvZC5TY3JvbGxpbmdNb3ZlbWVudE1ldGhvZAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0xJQ0sKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERPV04KLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLk9iamVjdCBGUk9NX0JFTE9XCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVUAotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLnRleHQubWV0aG9kLkxpbmtNb3ZlbWVudE1ldGhvZCBzSW5zdGFuY2UKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgYm9vbGVhbiBhY3Rpb24oCi1pbnQKLWFuZHJvaWQud2lkZ2V0LlRleHRWaWV3Ci1hbmRyb2lkLnRleHQuU3Bhbm5hYmxlKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQudGV4dC5tZXRob2QuTW92ZW1lbnRNZXRob2QgZ2V0SW5zdGFuY2UoKQotCi1wcm90ZWN0ZWQgYm9vbGVhbiBkb3duKAotYW5kcm9pZC53aWRnZXQuVGV4dFZpZXcKLWFuZHJvaWQudGV4dC5TcGFubmFibGUpCi0KLXB1YmxpYyB2b2lkIGluaXRpYWxpemUoCi1hbmRyb2lkLndpZGdldC5UZXh0VmlldwotYW5kcm9pZC50ZXh0LlNwYW5uYWJsZSkKLQotcHJvdGVjdGVkIGJvb2xlYW4gbGVmdCgKLWFuZHJvaWQud2lkZ2V0LlRleHRWaWV3Ci1hbmRyb2lkLnRleHQuU3Bhbm5hYmxlKQotCi1wdWJsaWMgYm9vbGVhbiBvbktleURvd24oCi1hbmRyb2lkLndpZGdldC5UZXh0VmlldwotYW5kcm9pZC50ZXh0LlNwYW5uYWJsZQotaW50Ci1hbmRyb2lkLnZpZXcuS2V5RXZlbnQpCi0KLXB1YmxpYyBib29sZWFuIG9uS2V5VXAoCi1hbmRyb2lkLndpZGdldC5UZXh0VmlldwotYW5kcm9pZC50ZXh0LlNwYW5uYWJsZQotaW50Ci1hbmRyb2lkLnZpZXcuS2V5RXZlbnQpCi0KLXB1YmxpYyB2b2lkIG9uVGFrZUZvY3VzKAotYW5kcm9pZC53aWRnZXQuVGV4dFZpZXcKLWFuZHJvaWQudGV4dC5TcGFubmFibGUKLWludCkKLQotcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KAotYW5kcm9pZC53aWRnZXQuVGV4dFZpZXcKLWFuZHJvaWQudGV4dC5TcGFubmFibGUKLWFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCkKLQotcHJvdGVjdGVkIGJvb2xlYW4gcmlnaHQoCi1hbmRyb2lkLndpZGdldC5UZXh0VmlldwotYW5kcm9pZC50ZXh0LlNwYW5uYWJsZSkKLQotcHJvdGVjdGVkIGJvb2xlYW4gdXAoCi1hbmRyb2lkLndpZGdldC5UZXh0VmlldwotYW5kcm9pZC50ZXh0LlNwYW5uYWJsZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTIgbmFtZSA9VGltZW91dCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC90ZXh0L21ldGhvZC9NdWx0aVRhcEtleUxpc3RlbmVyOyApCi0gY2xhc3MgYW5kcm9pZC50ZXh0Lm1ldGhvZC5NdWx0aVRhcEtleUxpc3RlbmVyJFRpbWVvdXQgZXh0ZW5kcyBhbmRyb2lkLm9zLkhhbmRsZXIgaW1wbGVtZW50cyBqYXZhLmxhbmcuUnVubmFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLnRleHQuRWRpdGFibGUgbUJ1ZmZlcgotCi1maW5hbCBhbmRyb2lkLnRleHQubWV0aG9kLk11bHRpVGFwS2V5TGlzdGVuZXIgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC50ZXh0Lm1ldGhvZC5NdWx0aVRhcEtleUxpc3RlbmVyCi1hbmRyb2lkLnRleHQuRWRpdGFibGUpCi0KLXN0YXRpYyBhbmRyb2lkLnRleHQuRWRpdGFibGUgYWNjZXNzJDAwMigKLWFuZHJvaWQudGV4dC5tZXRob2QuTXVsdGlUYXBLZXlMaXN0ZW5lciRUaW1lb3V0Ci1hbmRyb2lkLnRleHQuRWRpdGFibGUpCi0KLXB1YmxpYyB2b2lkIHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC90ZXh0L21ldGhvZC9NdWx0aVRhcEtleUxpc3RlbmVyJFRpbWVvdXQ7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnRleHQubWV0aG9kLk11bHRpVGFwS2V5TGlzdGVuZXIgZXh0ZW5kcyBhbmRyb2lkLnRleHQubWV0aG9kLkJhc2VLZXlMaXN0ZW5lciBpbXBsZW1lbnRzIGFuZHJvaWQudGV4dC5TcGFuV2F0Y2hlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLnRleHQubWV0aG9kLk11bHRpVGFwS2V5TGlzdGVuZXJbXSBzSW5zdGFuY2UKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MYW5kcm9pZC91dGlsL1NwYXJzZUFycmF5PExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXByaXZhdGUgc3RhdGljIGZpbmFsIGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheSBzUmVjcwotCi1wcml2YXRlIGJvb2xlYW4gbUF1dG9UZXh0Ci0KLXByaXZhdGUgYW5kcm9pZC50ZXh0Lm1ldGhvZC5UZXh0S2V5TGlzdGVuZXIkQ2FwaXRhbGl6ZSBtQ2FwaXRhbGl6ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC50ZXh0Lm1ldGhvZC5UZXh0S2V5TGlzdGVuZXIkQ2FwaXRhbGl6ZQotYm9vbGVhbikKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLnRleHQubWV0aG9kLk11bHRpVGFwS2V5TGlzdGVuZXIgZ2V0SW5zdGFuY2UoCi1ib29sZWFuCi1hbmRyb2lkLnRleHQubWV0aG9kLlRleHRLZXlMaXN0ZW5lciRDYXBpdGFsaXplKQotCi1wcml2YXRlIHN0YXRpYyB2b2lkIHJlbW92ZVRpbWVvdXRzKAotYW5kcm9pZC50ZXh0LlNwYW5uYWJsZSkKLQotcHVibGljIGJvb2xlYW4gb25LZXlEb3duKAotYW5kcm9pZC52aWV3LlZpZXcKLWFuZHJvaWQudGV4dC5FZGl0YWJsZQotaW50Ci1hbmRyb2lkLnZpZXcuS2V5RXZlbnQpCi0KLXB1YmxpYyB2b2lkIG9uU3BhbkFkZGVkKAotYW5kcm9pZC50ZXh0LlNwYW5uYWJsZQotamF2YS5sYW5nLk9iamVjdAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIG9uU3BhbkNoYW5nZWQoCi1hbmRyb2lkLnRleHQuU3Bhbm5hYmxlCi1qYXZhLmxhbmcuT2JqZWN0Ci1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIG9uU3BhblJlbW92ZWQoCi1hbmRyb2lkLnRleHQuU3Bhbm5hYmxlCi1qYXZhLmxhbmcuT2JqZWN0Ci1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPVBhc3N3b3JkQ2hhclNlcXVlbmNlICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3RleHQvbWV0aG9kL1Bhc3N3b3JkVHJhbnNmb3JtYXRpb25NZXRob2Q7ICkKLSBjbGFzcyBhbmRyb2lkLnRleHQubWV0aG9kLlBhc3N3b3JkVHJhbnNmb3JtYXRpb25NZXRob2QkUGFzc3dvcmRDaGFyU2VxdWVuY2UgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSwgYW5kcm9pZC50ZXh0LkdldENoYXJzCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBtU291cmNlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotcHVibGljIGNoYXIgY2hhckF0KAotaW50KQotCi1wdWJsaWMgdm9pZCBnZXRDaGFycygKLWludAotaW50Ci1jaGFyW10KLWludCkKLQotcHVibGljIGludCBsZW5ndGgoKQotCi1wdWJsaWMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBzdWJTZXF1ZW5jZSgKLWludAotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1WaWV3UmVmZXJlbmNlICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3RleHQvbWV0aG9kL1Bhc3N3b3JkVHJhbnNmb3JtYXRpb25NZXRob2Q7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL3JlZi9XZWFrUmVmZXJlbmNlPExhbmRyb2lkL3ZpZXcvVmlldzs+OyApCi0gY2xhc3MgYW5kcm9pZC50ZXh0Lm1ldGhvZC5QYXNzd29yZFRyYW5zZm9ybWF0aW9uTWV0aG9kJFZpZXdSZWZlcmVuY2UgZXh0ZW5kcyBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLnZpZXcuVmlldykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC50ZXh0LnN0eWxlLlVwZGF0ZUxheW91dCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9VmlzaWJsZSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC90ZXh0L21ldGhvZC9QYXNzd29yZFRyYW5zZm9ybWF0aW9uTWV0aG9kOyApCi0gY2xhc3MgYW5kcm9pZC50ZXh0Lm1ldGhvZC5QYXNzd29yZFRyYW5zZm9ybWF0aW9uTWV0aG9kJFZpc2libGUgZXh0ZW5kcyBhbmRyb2lkLm9zLkhhbmRsZXIgaW1wbGVtZW50cyBhbmRyb2lkLnRleHQuc3R5bGUuVXBkYXRlTGF5b3V0LCBqYXZhLmxhbmcuUnVubmFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlIG1UZXh0Ci0KLXByaXZhdGUgYW5kcm9pZC50ZXh0Lm1ldGhvZC5QYXNzd29yZFRyYW5zZm9ybWF0aW9uTWV0aG9kIG1UcmFuc2Zvcm1lcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQudGV4dC5TcGFubmFibGUKLWFuZHJvaWQudGV4dC5tZXRob2QuUGFzc3dvcmRUcmFuc2Zvcm1hdGlvbk1ldGhvZCkKLQotc3RhdGljIGFuZHJvaWQudGV4dC5tZXRob2QuUGFzc3dvcmRUcmFuc2Zvcm1hdGlvbk1ldGhvZCBhY2Nlc3MkMDAwKAotYW5kcm9pZC50ZXh0Lm1ldGhvZC5QYXNzd29yZFRyYW5zZm9ybWF0aW9uTWV0aG9kJFZpc2libGUpCi0KLXB1YmxpYyB2b2lkIHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC90ZXh0L21ldGhvZC9QYXNzd29yZFRyYW5zZm9ybWF0aW9uTWV0aG9kJFZpZXdSZWZlcmVuY2U7TGFuZHJvaWQvdGV4dC9tZXRob2QvUGFzc3dvcmRUcmFuc2Zvcm1hdGlvbk1ldGhvZCRWaXNpYmxlO0xhbmRyb2lkL3RleHQvbWV0aG9kL1Bhc3N3b3JkVHJhbnNmb3JtYXRpb25NZXRob2QkUGFzc3dvcmRDaGFyU2VxdWVuY2U7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnRleHQubWV0aG9kLlBhc3N3b3JkVHJhbnNmb3JtYXRpb25NZXRob2QgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC50ZXh0Lm1ldGhvZC5UcmFuc2Zvcm1hdGlvbk1ldGhvZCwgYW5kcm9pZC50ZXh0LlRleHRXYXRjaGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGNoYXIgRE9UCi0KLXByaXZhdGUgc3RhdGljIGFuZHJvaWQudGV4dC5tZXRob2QuUGFzc3dvcmRUcmFuc2Zvcm1hdGlvbk1ldGhvZCBzSW5zdGFuY2UKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXN0YXRpYyBjaGFyIGFjY2VzcyQxMDAoKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQudGV4dC5tZXRob2QuUGFzc3dvcmRUcmFuc2Zvcm1hdGlvbk1ldGhvZCBnZXRJbnN0YW5jZSgpCi0KLXB1YmxpYyB2b2lkIGFmdGVyVGV4dENoYW5nZWQoCi1hbmRyb2lkLnRleHQuRWRpdGFibGUpCi0KLXB1YmxpYyB2b2lkIGJlZm9yZVRleHRDaGFuZ2VkKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotaW50Ci1pbnQKLWludCkKLQotcHVibGljIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgZ2V0VHJhbnNmb3JtYXRpb24oCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1hbmRyb2lkLnZpZXcuVmlldykKLQotcHVibGljIHZvaWQgb25Gb2N1c0NoYW5nZWQoCi1hbmRyb2lkLnZpZXcuVmlldwotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotYm9vbGVhbgotaW50Ci1hbmRyb2lkLmdyYXBoaWNzLlJlY3QpCi0KLXB1YmxpYyB2b2lkIG9uVGV4dENoYW5nZWQoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1SZXBsYWNlZCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC90ZXh0L21ldGhvZC9Rd2VydHlLZXlMaXN0ZW5lcjsgKQotIGNsYXNzIGFuZHJvaWQudGV4dC5tZXRob2QuUXdlcnR5S2V5TGlzdGVuZXIkUmVwbGFjZWQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgY2hhcltdIG1UZXh0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotY2hhcltdKQotCi1zdGF0aWMgY2hhcltdIGFjY2VzcyQwMDAoCi1hbmRyb2lkLnRleHQubWV0aG9kLlF3ZXJ0eUtleUxpc3RlbmVyJFJlcGxhY2VkKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvdGV4dC9tZXRob2QvUXdlcnR5S2V5TGlzdGVuZXIkUmVwbGFjZWQ7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnRleHQubWV0aG9kLlF3ZXJ0eUtleUxpc3RlbmVyIGV4dGVuZHMgYW5kcm9pZC50ZXh0Lm1ldGhvZC5CYXNlS2V5TGlzdGVuZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MYW5kcm9pZC91dGlsL1NwYXJzZUFycmF5PExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXByaXZhdGUgc3RhdGljIGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheSBQSUNLRVJfU0VUUwotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLnRleHQubWV0aG9kLlF3ZXJ0eUtleUxpc3RlbmVyW10gc0luc3RhbmNlCi0KLXByaXZhdGUgYW5kcm9pZC50ZXh0Lm1ldGhvZC5UZXh0S2V5TGlzdGVuZXIkQ2FwaXRhbGl6ZSBtQXV0b0NhcAotCi1wcml2YXRlIGJvb2xlYW4gbUF1dG9UZXh0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLnRleHQubWV0aG9kLlRleHRLZXlMaXN0ZW5lciRDYXBpdGFsaXplCi1ib29sZWFuKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQudGV4dC5tZXRob2QuUXdlcnR5S2V5TGlzdGVuZXIgZ2V0SW5zdGFuY2UoCi1ib29sZWFuCi1hbmRyb2lkLnRleHQubWV0aG9kLlRleHRLZXlMaXN0ZW5lciRDYXBpdGFsaXplKQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZ2V0UmVwbGFjZW1lbnQoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYXJrQXNSZXBsYWNlZCgKLWFuZHJvaWQudGV4dC5TcGFubmFibGUKLWludAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIGJvb2xlYW4gc2hvd0NoYXJhY3RlclBpY2tlcigKLWFuZHJvaWQudmlldy5WaWV3Ci1hbmRyb2lkLnRleHQuRWRpdGFibGUKLWNoYXIKLWJvb2xlYW4KLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyB0b1RpdGxlQ2FzZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBib29sZWFuIG9uS2V5RG93bigKLWFuZHJvaWQudmlldy5WaWV3Ci1hbmRyb2lkLnRleHQuRWRpdGFibGUKLWludAotYW5kcm9pZC52aWV3LktleUV2ZW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3RleHQvbWV0aG9kL1JlcGxhY2VtZW50VHJhbnNmb3JtYXRpb25NZXRob2Q7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9UmVwbGFjZW1lbnRDaGFyU2VxdWVuY2UgKQotIGNsYXNzIGFuZHJvaWQudGV4dC5tZXRob2QuUmVwbGFjZW1lbnRUcmFuc2Zvcm1hdGlvbk1ldGhvZCRSZXBsYWNlbWVudENoYXJTZXF1ZW5jZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlLCBhbmRyb2lkLnRleHQuR2V0Q2hhcnMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBjaGFyW10gbU9yaWdpbmFsCi0KLXByaXZhdGUgY2hhcltdIG1SZXBsYWNlbWVudAotCi1wcml2YXRlIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgbVNvdXJjZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWNoYXJbXQotY2hhcltdKQotCi1wdWJsaWMgY2hhciBjaGFyQXQoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdldENoYXJzKAotaW50Ci1pbnQKLWNoYXJbXQotaW50KQotCi1wdWJsaWMgaW50IGxlbmd0aCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIHN1YlNlcXVlbmNlKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC90ZXh0L21ldGhvZC9SZXBsYWNlbWVudFRyYW5zZm9ybWF0aW9uTWV0aG9kOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPVNwYW5uZWRSZXBsYWNlbWVudENoYXJTZXF1ZW5jZSApCi0gY2xhc3MgYW5kcm9pZC50ZXh0Lm1ldGhvZC5SZXBsYWNlbWVudFRyYW5zZm9ybWF0aW9uTWV0aG9kJFNwYW5uZWRSZXBsYWNlbWVudENoYXJTZXF1ZW5jZSBleHRlbmRzIGFuZHJvaWQudGV4dC5tZXRob2QuUmVwbGFjZW1lbnRUcmFuc2Zvcm1hdGlvbk1ldGhvZCRSZXBsYWNlbWVudENoYXJTZXF1ZW5jZSBpbXBsZW1lbnRzIGFuZHJvaWQudGV4dC5TcGFubmVkCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYW5kcm9pZC50ZXh0LlNwYW5uZWQgbVNwYW5uZWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLnRleHQuU3Bhbm5lZAotY2hhcltdCi1jaGFyW10pCi0KLXB1YmxpYyBpbnQgZ2V0U3BhbkVuZCgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBpbnQgZ2V0U3BhbkZsYWdzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGludCBnZXRTcGFuU3RhcnQoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz4oSUlMamF2YS9sYW5nL0NsYXNzPFRUOz47KVtUVDsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3RbXSBnZXRTcGFucygKLWludAotaW50Ci1qYXZhLmxhbmcuQ2xhc3MpCi0KLXB1YmxpYyBpbnQgbmV4dFNwYW5UcmFuc2l0aW9uKAotaW50Ci1pbnQKLWphdmEubGFuZy5DbGFzcykKLQotcHVibGljIGphdmEubGFuZy5DaGFyU2VxdWVuY2Ugc3ViU2VxdWVuY2UoCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnRleHQubWV0aG9kLlNpbmdsZUxpbmVUcmFuc2Zvcm1hdGlvbk1ldGhvZCBleHRlbmRzIGFuZHJvaWQudGV4dC5tZXRob2QuUmVwbGFjZW1lbnRUcmFuc2Zvcm1hdGlvbk1ldGhvZAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBjaGFyW10gT1JJR0lOQUwKLQotcHJpdmF0ZSBzdGF0aWMgY2hhcltdIFJFUExBQ0VNRU5UCi0KLXByaXZhdGUgc3RhdGljIGFuZHJvaWQudGV4dC5tZXRob2QuU2luZ2xlTGluZVRyYW5zZm9ybWF0aW9uTWV0aG9kIHNJbnN0YW5jZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLnRleHQubWV0aG9kLlNpbmdsZUxpbmVUcmFuc2Zvcm1hdGlvbk1ldGhvZCBnZXRJbnN0YW5jZSgpCi0KLXByb3RlY3RlZCBjaGFyW10gZ2V0T3JpZ2luYWwoKQotCi1wcm90ZWN0ZWQgY2hhcltdIGdldFJlcGxhY2VtZW50KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9FbnVtPExhbmRyb2lkL3RleHQvbWV0aG9kL1RleHRLZXlMaXN0ZW5lciRDYXBpdGFsaXplOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTY0MDkgbmFtZSA9Q2FwaXRhbGl6ZSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC90ZXh0L21ldGhvZC9UZXh0S2V5TGlzdGVuZXI7ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLnRleHQubWV0aG9kLlRleHRLZXlMaXN0ZW5lciRDYXBpdGFsaXplIGV4dGVuZHMgamF2YS5sYW5nLkVudW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYW5kcm9pZC50ZXh0Lm1ldGhvZC5UZXh0S2V5TGlzdGVuZXIkQ2FwaXRhbGl6ZVtdICRWQUxVRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnRleHQubWV0aG9kLlRleHRLZXlMaXN0ZW5lciRDYXBpdGFsaXplIENIQVJBQ1RFUlMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnRleHQubWV0aG9kLlRleHRLZXlMaXN0ZW5lciRDYXBpdGFsaXplIE5PTkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnRleHQubWV0aG9kLlRleHRLZXlMaXN0ZW5lciRDYXBpdGFsaXplIFNFTlRFTkNFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudGV4dC5tZXRob2QuVGV4dEtleUxpc3RlbmVyJENhcGl0YWxpemUgV09SRFMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClWICkKLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC50ZXh0Lm1ldGhvZC5UZXh0S2V5TGlzdGVuZXIkQ2FwaXRhbGl6ZSB2YWx1ZU9mKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLnRleHQubWV0aG9kLlRleHRLZXlMaXN0ZW5lciRDYXBpdGFsaXplW10gdmFsdWVzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC90ZXh0L21ldGhvZC9UZXh0S2V5TGlzdGVuZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9TnVsbEtleUxpc3RlbmVyICkKLSBjbGFzcyBhbmRyb2lkLnRleHQubWV0aG9kLlRleHRLZXlMaXN0ZW5lciROdWxsS2V5TGlzdGVuZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC50ZXh0Lm1ldGhvZC5LZXlMaXN0ZW5lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLnRleHQubWV0aG9kLlRleHRLZXlMaXN0ZW5lciROdWxsS2V5TGlzdGVuZXIgc0luc3RhbmNlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC50ZXh0Lm1ldGhvZC5UZXh0S2V5TGlzdGVuZXIkTnVsbEtleUxpc3RlbmVyIGdldEluc3RhbmNlKCkKLQotcHVibGljIGJvb2xlYW4gb25LZXlEb3duKAotYW5kcm9pZC52aWV3LlZpZXcKLWFuZHJvaWQudGV4dC5FZGl0YWJsZQotaW50Ci1hbmRyb2lkLnZpZXcuS2V5RXZlbnQpCi0KLXB1YmxpYyBib29sZWFuIG9uS2V5VXAoCi1hbmRyb2lkLnZpZXcuVmlldwotYW5kcm9pZC50ZXh0LkVkaXRhYmxlCi1pbnQKLWFuZHJvaWQudmlldy5LZXlFdmVudCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTIgbmFtZSA9U2V0dGluZ3NPYnNlcnZlciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC90ZXh0L21ldGhvZC9UZXh0S2V5TGlzdGVuZXI7ICkKLSBjbGFzcyBhbmRyb2lkLnRleHQubWV0aG9kLlRleHRLZXlMaXN0ZW5lciRTZXR0aW5nc09ic2VydmVyIGV4dGVuZHMgYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC50ZXh0Lm1ldGhvZC5UZXh0S2V5TGlzdGVuZXIgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC50ZXh0Lm1ldGhvZC5UZXh0S2V5TGlzdGVuZXIpCi0KLXB1YmxpYyB2b2lkIG9uQ2hhbmdlKAotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3RleHQvbWV0aG9kL1RleHRLZXlMaXN0ZW5lciRTZXR0aW5nc09ic2VydmVyO0xhbmRyb2lkL3RleHQvbWV0aG9kL1RleHRLZXlMaXN0ZW5lciROdWxsS2V5TGlzdGVuZXI7TGFuZHJvaWQvdGV4dC9tZXRob2QvVGV4dEtleUxpc3RlbmVyJENhcGl0YWxpemU7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnRleHQubWV0aG9kLlRleHRLZXlMaXN0ZW5lciBleHRlbmRzIGFuZHJvaWQudGV4dC5tZXRob2QuQmFzZUtleUxpc3RlbmVyIGltcGxlbWVudHMgYW5kcm9pZC50ZXh0LlNwYW5XYXRjaGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuT2JqZWN0IEFDVElWRQotCi1zdGF0aWMgZmluYWwgaW50IEFVVE9fQ0FQCi0KLXN0YXRpYyBmaW5hbCBpbnQgQVVUT19QRVJJT0QKLQotc3RhdGljIGZpbmFsIGludCBBVVRPX1RFWFQKLQotc3RhdGljIGZpbmFsIGphdmEubGFuZy5PYmplY3QgQ0FQUEVECi0KLXN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuT2JqZWN0IElOSElCSVRfUkVQTEFDRU1FTlQKLQotc3RhdGljIGZpbmFsIGphdmEubGFuZy5PYmplY3QgTEFTVF9UWVBFRAotCi1zdGF0aWMgZmluYWwgaW50IFNIT1dfUEFTU1dPUkQKLQotcHJpdmF0ZSBzdGF0aWMgYW5kcm9pZC50ZXh0Lm1ldGhvZC5UZXh0S2V5TGlzdGVuZXJbXSBzSW5zdGFuY2UKLQotcHJpdmF0ZSBhbmRyb2lkLnRleHQubWV0aG9kLlRleHRLZXlMaXN0ZW5lciRDYXBpdGFsaXplIG1BdXRvQ2FwCi0KLXByaXZhdGUgYm9vbGVhbiBtQXV0b1RleHQKLQotcHJpdmF0ZSBhbmRyb2lkLnRleHQubWV0aG9kLlRleHRLZXlMaXN0ZW5lciRTZXR0aW5nc09ic2VydmVyIG1PYnNlcnZlcgotCi1wcml2YXRlIGludCBtUHJlZnMKLQotcHJpdmF0ZSBib29sZWFuIG1QcmVmc0luaXRlZAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvcmVmL1dlYWtSZWZlcmVuY2U8TGFuZHJvaWQvY29udGVudC9Db250ZW50UmVzb2x2ZXI7PjsgKQotcHJpdmF0ZSBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2UgbVJlc29sdmVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLnRleHQubWV0aG9kLlRleHRLZXlMaXN0ZW5lciRDYXBpdGFsaXplCi1ib29sZWFuKQotCi1zdGF0aWMgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlIGFjY2VzcyQwMDAoCi1hbmRyb2lkLnRleHQubWV0aG9kLlRleHRLZXlMaXN0ZW5lcikKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDEwMigKLWFuZHJvaWQudGV4dC5tZXRob2QuVGV4dEtleUxpc3RlbmVyCi1ib29sZWFuKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMjAwKAotYW5kcm9pZC50ZXh0Lm1ldGhvZC5UZXh0S2V5TGlzdGVuZXIKLWFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhcigKLWFuZHJvaWQudGV4dC5FZGl0YWJsZSkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLnRleHQubWV0aG9kLlRleHRLZXlMaXN0ZW5lciBnZXRJbnN0YW5jZSgpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC50ZXh0Lm1ldGhvZC5UZXh0S2V5TGlzdGVuZXIgZ2V0SW5zdGFuY2UoCi1ib29sZWFuCi1hbmRyb2lkLnRleHQubWV0aG9kLlRleHRLZXlMaXN0ZW5lciRDYXBpdGFsaXplKQotCi1wcml2YXRlIGFuZHJvaWQudGV4dC5tZXRob2QuS2V5TGlzdGVuZXIgZ2V0S2V5TGlzdGVuZXIoCi1hbmRyb2lkLnZpZXcuS2V5RXZlbnQpCi0KLXByaXZhdGUgdm9pZCBpbml0UHJlZnMoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIHNob3VsZENhcCgKLWFuZHJvaWQudGV4dC5tZXRob2QuVGV4dEtleUxpc3RlbmVyJENhcGl0YWxpemUKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWludCkKLQotcHJpdmF0ZSB2b2lkIHVwZGF0ZVByZWZzKAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcikKLQotIGludCBnZXRQcmVmcygKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wdWJsaWMgYm9vbGVhbiBvbktleURvd24oCi1hbmRyb2lkLnZpZXcuVmlldwotYW5kcm9pZC50ZXh0LkVkaXRhYmxlCi1pbnQKLWFuZHJvaWQudmlldy5LZXlFdmVudCkKLQotcHVibGljIGJvb2xlYW4gb25LZXlVcCgKLWFuZHJvaWQudmlldy5WaWV3Ci1hbmRyb2lkLnRleHQuRWRpdGFibGUKLWludAotYW5kcm9pZC52aWV3LktleUV2ZW50KQotCi1wdWJsaWMgdm9pZCBvblNwYW5BZGRlZCgKLWFuZHJvaWQudGV4dC5TcGFubmFibGUKLWphdmEubGFuZy5PYmplY3QKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBvblNwYW5DaGFuZ2VkKAotYW5kcm9pZC50ZXh0LlNwYW5uYWJsZQotamF2YS5sYW5nLk9iamVjdAotaW50Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBvblNwYW5SZW1vdmVkKAotYW5kcm9pZC50ZXh0LlNwYW5uYWJsZQotamF2YS5sYW5nLk9iamVjdAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIHJlbGVhc2UoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQudGV4dC5tZXRob2QuVGltZUtleUxpc3RlbmVyIGV4dGVuZHMgYW5kcm9pZC50ZXh0Lm1ldGhvZC5OdW1iZXJLZXlMaXN0ZW5lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBDSEFSQUNURVJTCi0KLXByaXZhdGUgc3RhdGljIGFuZHJvaWQudGV4dC5tZXRob2QuVGltZUtleUxpc3RlbmVyIHNJbnN0YW5jZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLnRleHQubWV0aG9kLlRpbWVLZXlMaXN0ZW5lciBnZXRJbnN0YW5jZSgpCi0KLXByb3RlY3RlZCBjaGFyW10gZ2V0QWNjZXB0ZWRDaGFycygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1EcmFnU3RhdGUgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdGV4dC9tZXRob2QvVG91Y2g7ICkKLSBjbGFzcyBhbmRyb2lkLnRleHQubWV0aG9kLlRvdWNoJERyYWdTdGF0ZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGJvb2xlYW4gbUZhckVub3VnaAotCi1wdWJsaWMgYm9vbGVhbiBtVXNlZAotCi1wdWJsaWMgZmxvYXQgbVgKLQotcHVibGljIGZsb2F0IG1ZCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotZmxvYXQKLWZsb2F0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvdGV4dC9tZXRob2QvVG91Y2gkRHJhZ1N0YXRlOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC50ZXh0Lm1ldGhvZC5Ub3VjaCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIG9uVG91Y2hFdmVudCgKLWFuZHJvaWQud2lkZ2V0LlRleHRWaWV3Ci1hbmRyb2lkLnRleHQuU3Bhbm5hYmxlCi1hbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBzY3JvbGxUbygKLWFuZHJvaWQud2lkZ2V0LlRleHRWaWV3Ci1hbmRyb2lkLnRleHQuTGF5b3V0Ci1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3RleHQvc3R5bGUvQ2hhcmFjdGVyU3R5bGUkUGFzc3Rocm91Z2g7ICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBhbmRyb2lkLnRleHQuc3R5bGUuQ2hhcmFjdGVyU3R5bGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLnRleHQuc3R5bGUuQ2hhcmFjdGVyU3R5bGUgd3JhcCgKLWFuZHJvaWQudGV4dC5zdHlsZS5DaGFyYWN0ZXJTdHlsZSkKLQotcHVibGljIGFuZHJvaWQudGV4dC5zdHlsZS5DaGFyYWN0ZXJTdHlsZSBnZXRVbmRlcmx5aW5nKCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgdXBkYXRlRHJhd1N0YXRlKAotYW5kcm9pZC50ZXh0LlRleHRQYWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3RleHQvc3R5bGUvTWV0cmljQWZmZWN0aW5nU3BhbiRQYXNzdGhyb3VnaDsgKQotcHVibGljIGFic3RyYWN0IGNsYXNzIGFuZHJvaWQudGV4dC5zdHlsZS5NZXRyaWNBZmZlY3RpbmdTcGFuIGV4dGVuZHMgYW5kcm9pZC50ZXh0LnN0eWxlLkNoYXJhY3RlclN0eWxlIGltcGxlbWVudHMgYW5kcm9pZC50ZXh0LnN0eWxlLlVwZGF0ZUxheW91dAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2xhdGlsZSBhbmRyb2lkLnRleHQuc3R5bGUuQ2hhcmFjdGVyU3R5bGUgZ2V0VW5kZXJseWluZygpCi0KLXB1YmxpYyBhbmRyb2lkLnRleHQuc3R5bGUuTWV0cmljQWZmZWN0aW5nU3BhbiBnZXRVbmRlcmx5aW5nKCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgdXBkYXRlTWVhc3VyZVN0YXRlKAotYW5kcm9pZC50ZXh0LlRleHRQYWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnRleHQuc3R5bGUuQWJzb2x1dGVTaXplU3BhbiBleHRlbmRzIGFuZHJvaWQudGV4dC5zdHlsZS5NZXRyaWNBZmZlY3RpbmdTcGFuCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgaW50IG1TaXplCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50KQotCi1wdWJsaWMgaW50IGdldFNpemUoKQotCi1wdWJsaWMgdm9pZCB1cGRhdGVEcmF3U3RhdGUoCi1hbmRyb2lkLnRleHQuVGV4dFBhaW50KQotCi1wdWJsaWMgdm9pZCB1cGRhdGVNZWFzdXJlU3RhdGUoCi1hbmRyb2lkLnRleHQuVGV4dFBhaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvdGV4dC9zdHlsZS9BbGlnbm1lbnRTcGFuJFN0YW5kYXJkOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQudGV4dC5zdHlsZS5BbGlnbm1lbnRTcGFuIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQudGV4dC5zdHlsZS5QYXJhZ3JhcGhTdHlsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLnRleHQuTGF5b3V0JEFsaWdubWVudCBnZXRBbGlnbm1lbnQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1TdGFuZGFyZCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC90ZXh0L3N0eWxlL0FsaWdubWVudFNwYW47ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnRleHQuc3R5bGUuQWxpZ25tZW50U3BhbiRTdGFuZGFyZCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnRleHQuc3R5bGUuQWxpZ25tZW50U3BhbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGFuZHJvaWQudGV4dC5MYXlvdXQkQWxpZ25tZW50IG1BbGlnbm1lbnQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLnRleHQuTGF5b3V0JEFsaWdubWVudCkKLQotcHVibGljIGFuZHJvaWQudGV4dC5MYXlvdXQkQWxpZ25tZW50IGdldEFsaWdubWVudCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC50ZXh0LnN0eWxlLkJhY2tncm91bmRDb2xvclNwYW4gZXh0ZW5kcyBhbmRyb2lkLnRleHQuc3R5bGUuQ2hhcmFjdGVyU3R5bGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBpbnQgbUNvbG9yCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50KQotCi1wdWJsaWMgaW50IGdldEJhY2tncm91bmRDb2xvcigpCi0KLXB1YmxpYyB2b2lkIHVwZGF0ZURyYXdTdGF0ZSgKLWFuZHJvaWQudGV4dC5UZXh0UGFpbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC90ZXh0L3N0eWxlL0xlYWRpbmdNYXJnaW5TcGFuJFN0YW5kYXJkOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQudGV4dC5zdHlsZS5MZWFkaW5nTWFyZ2luU3BhbiBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnRleHQuc3R5bGUuUGFyYWdyYXBoU3R5bGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBkcmF3TGVhZGluZ01hcmdpbigKLWFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzCi1hbmRyb2lkLmdyYXBoaWNzLlBhaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotaW50Ci1pbnQKLWJvb2xlYW4KLWFuZHJvaWQudGV4dC5MYXlvdXQpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0TGVhZGluZ01hcmdpbigKLWJvb2xlYW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC50ZXh0LnN0eWxlLkJ1bGxldFNwYW4gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC50ZXh0LnN0eWxlLkxlYWRpbmdNYXJnaW5TcGFuCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVUxMRVRfUkFESVVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQU5EQVJEX0dBUF9XSURUSAotCi1wcml2YXRlIGludCBtQ29sb3IKLQotcHJpdmF0ZSBpbnQgbUdhcFdpZHRoCi0KLXByaXZhdGUgYm9vbGVhbiBtV2FudENvbG9yCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgZHJhd0xlYWRpbmdNYXJnaW4oCi1hbmRyb2lkLmdyYXBoaWNzLkNhbnZhcwotYW5kcm9pZC5ncmFwaGljcy5QYWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWludAotaW50Ci1ib29sZWFuCi1hbmRyb2lkLnRleHQuTGF5b3V0KQotCi1wdWJsaWMgaW50IGdldExlYWRpbmdNYXJnaW4oCi1ib29sZWFuKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3RleHQvc3R5bGUvQ2hhcmFjdGVyU3R5bGU7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9UGFzc3Rocm91Z2ggKQotIGNsYXNzIGFuZHJvaWQudGV4dC5zdHlsZS5DaGFyYWN0ZXJTdHlsZSRQYXNzdGhyb3VnaCBleHRlbmRzIGFuZHJvaWQudGV4dC5zdHlsZS5DaGFyYWN0ZXJTdHlsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGFuZHJvaWQudGV4dC5zdHlsZS5DaGFyYWN0ZXJTdHlsZSBtU3R5bGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLnRleHQuc3R5bGUuQ2hhcmFjdGVyU3R5bGUpCi0KLXB1YmxpYyBhbmRyb2lkLnRleHQuc3R5bGUuQ2hhcmFjdGVyU3R5bGUgZ2V0VW5kZXJseWluZygpCi0KLXB1YmxpYyB2b2lkIHVwZGF0ZURyYXdTdGF0ZSgKLWFuZHJvaWQudGV4dC5UZXh0UGFpbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC50ZXh0LnN0eWxlLkNsaWNrYWJsZVNwYW4gZXh0ZW5kcyBhbmRyb2lkLnRleHQuc3R5bGUuQ2hhcmFjdGVyU3R5bGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvbkNsaWNrKAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXB1YmxpYyB2b2lkIHVwZGF0ZURyYXdTdGF0ZSgKLWFuZHJvaWQudGV4dC5UZXh0UGFpbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC50ZXh0LnN0eWxlLkRyYXdhYmxlTWFyZ2luU3BhbiBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnRleHQuc3R5bGUuTGVhZGluZ01hcmdpblNwYW4sIGFuZHJvaWQudGV4dC5zdHlsZS5MaW5lSGVpZ2h0U3BhbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgbURyYXdhYmxlCi0KLXByaXZhdGUgaW50IG1QYWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGNob29zZUhlaWdodCgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWludAotaW50Ci1pbnQKLWludAotYW5kcm9pZC5ncmFwaGljcy5QYWludCRGb250TWV0cmljc0ludCkKLQotcHVibGljIHZvaWQgZHJhd0xlYWRpbmdNYXJnaW4oCi1hbmRyb2lkLmdyYXBoaWNzLkNhbnZhcwotYW5kcm9pZC5ncmFwaGljcy5QYWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWludAotaW50Ci1ib29sZWFuCi1hbmRyb2lkLnRleHQuTGF5b3V0KQotCi1wdWJsaWMgaW50IGdldExlYWRpbmdNYXJnaW4oCi1ib29sZWFuKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGFuZHJvaWQudGV4dC5zdHlsZS5SZXBsYWNlbWVudFNwYW4gZXh0ZW5kcyBhbmRyb2lkLnRleHQuc3R5bGUuTWV0cmljQWZmZWN0aW5nU3BhbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGRyYXcoCi1hbmRyb2lkLmdyYXBoaWNzLkNhbnZhcwotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotaW50Ci1pbnQKLWZsb2F0Ci1pbnQKLWludAotaW50Ci1hbmRyb2lkLmdyYXBoaWNzLlBhaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldFNpemUoCi1hbmRyb2lkLmdyYXBoaWNzLlBhaW50Ci1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludAotYW5kcm9pZC5ncmFwaGljcy5QYWludCRGb250TWV0cmljc0ludCkKLQotcHVibGljIHZvaWQgdXBkYXRlRHJhd1N0YXRlKAotYW5kcm9pZC50ZXh0LlRleHRQYWludCkKLQotcHVibGljIHZvaWQgdXBkYXRlTWVhc3VyZVN0YXRlKAotYW5kcm9pZC50ZXh0LlRleHRQYWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBhbmRyb2lkLnRleHQuc3R5bGUuRHluYW1pY0RyYXdhYmxlU3BhbiBleHRlbmRzIGFuZHJvaWQudGV4dC5zdHlsZS5SZXBsYWNlbWVudFNwYW4KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2UgbURyYXdhYmxlUmVmCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIGdldENhY2hlZERyYXdhYmxlKCkKLQotcHVibGljIHZvaWQgZHJhdygKLWFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludAotZmxvYXQKLWludAotaW50Ci1pbnQKLWFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIGdldERyYXdhYmxlKCkKLQotcHVibGljIGludCBnZXRTaXplKAotYW5kcm9pZC5ncmFwaGljcy5QYWludAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotaW50Ci1pbnQKLWFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQkRm9udE1ldHJpY3NJbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC50ZXh0LnN0eWxlLkZvcmVncm91bmRDb2xvclNwYW4gZXh0ZW5kcyBhbmRyb2lkLnRleHQuc3R5bGUuQ2hhcmFjdGVyU3R5bGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBpbnQgbUNvbG9yCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50KQotCi1wdWJsaWMgaW50IGdldEZvcmVncm91bmRDb2xvcigpCi0KLXB1YmxpYyB2b2lkIHVwZGF0ZURyYXdTdGF0ZSgKLWFuZHJvaWQudGV4dC5UZXh0UGFpbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC50ZXh0LnN0eWxlLkljb25NYXJnaW5TcGFuIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQudGV4dC5zdHlsZS5MZWFkaW5nTWFyZ2luU3BhbiwgYW5kcm9pZC50ZXh0LnN0eWxlLkxpbmVIZWlnaHRTcGFuCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAgbUJpdG1hcAotCi1wcml2YXRlIGludCBtUGFkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5ncmFwaGljcy5CaXRtYXApCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGNob29zZUhlaWdodCgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWludAotaW50Ci1pbnQKLWludAotYW5kcm9pZC5ncmFwaGljcy5QYWludCRGb250TWV0cmljc0ludCkKLQotcHVibGljIHZvaWQgZHJhd0xlYWRpbmdNYXJnaW4oCi1hbmRyb2lkLmdyYXBoaWNzLkNhbnZhcwotYW5kcm9pZC5ncmFwaGljcy5QYWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWludAotaW50Ci1ib29sZWFuCi1hbmRyb2lkLnRleHQuTGF5b3V0KQotCi1wdWJsaWMgaW50IGdldExlYWRpbmdNYXJnaW4oCi1ib29sZWFuKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQudGV4dC5zdHlsZS5JbWFnZVNwYW4gZXh0ZW5kcyBhbmRyb2lkLnRleHQuc3R5bGUuRHluYW1pY0RyYXdhYmxlU3BhbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGFuZHJvaWQubmV0LlVyaSBtQ29udGVudFVyaQotCi1wcml2YXRlIGFuZHJvaWQuY29udGVudC5Db250ZXh0IG1Db250ZXh0Ci0KLXByaXZhdGUgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSBtRHJhd2FibGUKLQotcHJpdmF0ZSBpbnQgbVJlc291cmNlSWQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1Tb3VyY2UKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC5uZXQuVXJpKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZQotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgZ2V0RHJhd2FibGUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTb3VyY2UoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1TdGFuZGFyZCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC90ZXh0L3N0eWxlL0xlYWRpbmdNYXJnaW5TcGFuOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC50ZXh0LnN0eWxlLkxlYWRpbmdNYXJnaW5TcGFuJFN0YW5kYXJkIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQudGV4dC5zdHlsZS5MZWFkaW5nTWFyZ2luU3BhbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGludCBtRmlyc3QKLQotcHJpdmF0ZSBpbnQgbVJlc3QKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBkcmF3TGVhZGluZ01hcmdpbigKLWFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzCi1hbmRyb2lkLmdyYXBoaWNzLlBhaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotaW50Ci1pbnQKLWJvb2xlYW4KLWFuZHJvaWQudGV4dC5MYXlvdXQpCi0KLXB1YmxpYyBpbnQgZ2V0TGVhZGluZ01hcmdpbigKLWJvb2xlYW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQudGV4dC5zdHlsZS5MaW5lQmFja2dyb3VuZFNwYW4gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC50ZXh0LnN0eWxlLlBhcmFncmFwaFN0eWxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgZHJhd0JhY2tncm91bmQoCi1hbmRyb2lkLmdyYXBoaWNzLkNhbnZhcwotYW5kcm9pZC5ncmFwaGljcy5QYWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWludAotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC50ZXh0LnN0eWxlLk1hc2tGaWx0ZXJTcGFuIGV4dGVuZHMgYW5kcm9pZC50ZXh0LnN0eWxlLkNoYXJhY3RlclN0eWxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYW5kcm9pZC5ncmFwaGljcy5NYXNrRmlsdGVyIG1GaWx0ZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmdyYXBoaWNzLk1hc2tGaWx0ZXIpCi0KLXB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLk1hc2tGaWx0ZXIgZ2V0TWFza0ZpbHRlcigpCi0KLXB1YmxpYyB2b2lkIHVwZGF0ZURyYXdTdGF0ZSgKLWFuZHJvaWQudGV4dC5UZXh0UGFpbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPVBhc3N0aHJvdWdoICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3RleHQvc3R5bGUvTWV0cmljQWZmZWN0aW5nU3BhbjsgKQotIGNsYXNzIGFuZHJvaWQudGV4dC5zdHlsZS5NZXRyaWNBZmZlY3RpbmdTcGFuJFBhc3N0aHJvdWdoIGV4dGVuZHMgYW5kcm9pZC50ZXh0LnN0eWxlLk1ldHJpY0FmZmVjdGluZ1NwYW4KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLnRleHQuc3R5bGUuTWV0cmljQWZmZWN0aW5nU3BhbiBtU3R5bGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLnRleHQuc3R5bGUuTWV0cmljQWZmZWN0aW5nU3BhbikKLQotcHVibGljIHZvbGF0aWxlIGFuZHJvaWQudGV4dC5zdHlsZS5DaGFyYWN0ZXJTdHlsZSBnZXRVbmRlcmx5aW5nKCkKLQotcHVibGljIGFuZHJvaWQudGV4dC5zdHlsZS5NZXRyaWNBZmZlY3RpbmdTcGFuIGdldFVuZGVybHlpbmcoKQotCi1wdWJsaWMgdm9pZCB1cGRhdGVEcmF3U3RhdGUoCi1hbmRyb2lkLnRleHQuVGV4dFBhaW50KQotCi1wdWJsaWMgdm9pZCB1cGRhdGVNZWFzdXJlU3RhdGUoCi1hbmRyb2lkLnRleHQuVGV4dFBhaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQudGV4dC5zdHlsZS5RdW90ZVNwYW4gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC50ZXh0LnN0eWxlLkxlYWRpbmdNYXJnaW5TcGFuCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHQVBfV0lEVEgKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUUklQRV9XSURUSAotCi1wcml2YXRlIGludCBtQ29sb3IKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGRyYXdMZWFkaW5nTWFyZ2luKAotYW5kcm9pZC5ncmFwaGljcy5DYW52YXMKLWFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludAotYm9vbGVhbgotYW5kcm9pZC50ZXh0LkxheW91dCkKLQotcHVibGljIGludCBnZXRDb2xvcigpCi0KLXB1YmxpYyBpbnQgZ2V0TGVhZGluZ01hcmdpbigKLWJvb2xlYW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC50ZXh0LnN0eWxlLlJhc3Rlcml6ZXJTcGFuIGV4dGVuZHMgYW5kcm9pZC50ZXh0LnN0eWxlLkNoYXJhY3RlclN0eWxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYW5kcm9pZC5ncmFwaGljcy5SYXN0ZXJpemVyIG1SYXN0ZXJpemVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5ncmFwaGljcy5SYXN0ZXJpemVyKQotCi1wdWJsaWMgYW5kcm9pZC5ncmFwaGljcy5SYXN0ZXJpemVyIGdldFJhc3Rlcml6ZXIoKQotCi1wdWJsaWMgdm9pZCB1cGRhdGVEcmF3U3RhdGUoCi1hbmRyb2lkLnRleHQuVGV4dFBhaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQudGV4dC5zdHlsZS5SZWxhdGl2ZVNpemVTcGFuIGV4dGVuZHMgYW5kcm9pZC50ZXh0LnN0eWxlLk1ldHJpY0FmZmVjdGluZ1NwYW4KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmbG9hdCBtUHJvcG9ydGlvbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWZsb2F0KQotCi1wdWJsaWMgZmxvYXQgZ2V0U2l6ZUNoYW5nZSgpCi0KLXB1YmxpYyB2b2lkIHVwZGF0ZURyYXdTdGF0ZSgKLWFuZHJvaWQudGV4dC5UZXh0UGFpbnQpCi0KLXB1YmxpYyB2b2lkIHVwZGF0ZU1lYXN1cmVTdGF0ZSgKLWFuZHJvaWQudGV4dC5UZXh0UGFpbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC50ZXh0LnN0eWxlLlNjYWxlWFNwYW4gZXh0ZW5kcyBhbmRyb2lkLnRleHQuc3R5bGUuTWV0cmljQWZmZWN0aW5nU3BhbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZsb2F0IG1Qcm9wb3J0aW9uCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotZmxvYXQpCi0KLXB1YmxpYyBmbG9hdCBnZXRTY2FsZVgoKQotCi1wdWJsaWMgdm9pZCB1cGRhdGVEcmF3U3RhdGUoCi1hbmRyb2lkLnRleHQuVGV4dFBhaW50KQotCi1wdWJsaWMgdm9pZCB1cGRhdGVNZWFzdXJlU3RhdGUoCi1hbmRyb2lkLnRleHQuVGV4dFBhaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQudGV4dC5zdHlsZS5TdHJpa2V0aHJvdWdoU3BhbiBleHRlbmRzIGFuZHJvaWQudGV4dC5zdHlsZS5DaGFyYWN0ZXJTdHlsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIHVwZGF0ZURyYXdTdGF0ZSgKLWFuZHJvaWQudGV4dC5UZXh0UGFpbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC50ZXh0LnN0eWxlLlN0eWxlU3BhbiBleHRlbmRzIGFuZHJvaWQudGV4dC5zdHlsZS5NZXRyaWNBZmZlY3RpbmdTcGFuCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgaW50IG1TdHlsZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBhcHBseSgKLWFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQKLWludCkKLQotcHVibGljIGludCBnZXRTdHlsZSgpCi0KLXB1YmxpYyB2b2lkIHVwZGF0ZURyYXdTdGF0ZSgKLWFuZHJvaWQudGV4dC5UZXh0UGFpbnQpCi0KLXB1YmxpYyB2b2lkIHVwZGF0ZU1lYXN1cmVTdGF0ZSgKLWFuZHJvaWQudGV4dC5UZXh0UGFpbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC50ZXh0LnN0eWxlLlN1YnNjcmlwdFNwYW4gZXh0ZW5kcyBhbmRyb2lkLnRleHQuc3R5bGUuTWV0cmljQWZmZWN0aW5nU3BhbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIHVwZGF0ZURyYXdTdGF0ZSgKLWFuZHJvaWQudGV4dC5UZXh0UGFpbnQpCi0KLXB1YmxpYyB2b2lkIHVwZGF0ZU1lYXN1cmVTdGF0ZSgKLWFuZHJvaWQudGV4dC5UZXh0UGFpbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC50ZXh0LnN0eWxlLlN1cGVyc2NyaXB0U3BhbiBleHRlbmRzIGFuZHJvaWQudGV4dC5zdHlsZS5NZXRyaWNBZmZlY3RpbmdTcGFuCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgdXBkYXRlRHJhd1N0YXRlKAotYW5kcm9pZC50ZXh0LlRleHRQYWludCkKLQotcHVibGljIHZvaWQgdXBkYXRlTWVhc3VyZVN0YXRlKAotYW5kcm9pZC50ZXh0LlRleHRQYWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3RleHQvc3R5bGUvVGFiU3RvcFNwYW4kU3RhbmRhcmQ7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC50ZXh0LnN0eWxlLlRhYlN0b3BTcGFuIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQudGV4dC5zdHlsZS5QYXJhZ3JhcGhTdHlsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0VGFiU3RvcCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPVN0YW5kYXJkICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3RleHQvc3R5bGUvVGFiU3RvcFNwYW47ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnRleHQuc3R5bGUuVGFiU3RvcFNwYW4kU3RhbmRhcmQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC50ZXh0LnN0eWxlLlRhYlN0b3BTcGFuCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgaW50IG1UYWIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0VGFiU3RvcCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC50ZXh0LnN0eWxlLlRleHRBcHBlYXJhbmNlU3BhbiBleHRlbmRzIGFuZHJvaWQudGV4dC5zdHlsZS5NZXRyaWNBZmZlY3RpbmdTcGFuCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgaW50IG1TdHlsZQotCi1wcml2YXRlIGFuZHJvaWQuY29udGVudC5yZXMuQ29sb3JTdGF0ZUxpc3QgbVRleHRDb2xvcgotCi1wcml2YXRlIGFuZHJvaWQuY29udGVudC5yZXMuQ29sb3JTdGF0ZUxpc3QgbVRleHRDb2xvckxpbmsKLQotcHJpdmF0ZSBpbnQgbVRleHRTaXplCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtVHlwZWZhY2UKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50Ci1hbmRyb2lkLmNvbnRlbnQucmVzLkNvbG9yU3RhdGVMaXN0Ci1hbmRyb2lkLmNvbnRlbnQucmVzLkNvbG9yU3RhdGVMaXN0KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRGYW1pbHkoKQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LnJlcy5Db2xvclN0YXRlTGlzdCBnZXRMaW5rVGV4dENvbG9yKCkKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5yZXMuQ29sb3JTdGF0ZUxpc3QgZ2V0VGV4dENvbG9yKCkKLQotcHVibGljIGludCBnZXRUZXh0U2l6ZSgpCi0KLXB1YmxpYyBpbnQgZ2V0VGV4dFN0eWxlKCkKLQotcHVibGljIHZvaWQgdXBkYXRlRHJhd1N0YXRlKAotYW5kcm9pZC50ZXh0LlRleHRQYWludCkKLQotcHVibGljIHZvaWQgdXBkYXRlTWVhc3VyZVN0YXRlKAotYW5kcm9pZC50ZXh0LlRleHRQYWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnRleHQuc3R5bGUuVHlwZWZhY2VTcGFuIGV4dGVuZHMgYW5kcm9pZC50ZXh0LnN0eWxlLk1ldHJpY0FmZmVjdGluZ1NwYW4KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1GYW1pbHkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHN0YXRpYyB2b2lkIGFwcGx5KAotYW5kcm9pZC5ncmFwaGljcy5QYWludAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RmFtaWx5KCkKLQotcHVibGljIHZvaWQgdXBkYXRlRHJhd1N0YXRlKAotYW5kcm9pZC50ZXh0LlRleHRQYWludCkKLQotcHVibGljIHZvaWQgdXBkYXRlTWVhc3VyZVN0YXRlKAotYW5kcm9pZC50ZXh0LlRleHRQYWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnRleHQuc3R5bGUuVVJMU3BhbiBleHRlbmRzIGFuZHJvaWQudGV4dC5zdHlsZS5DbGlja2FibGVTcGFuCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtVVJMCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VVJMKCkKLQotcHVibGljIHZvaWQgb25DbGljaygKLWFuZHJvaWQudmlldy5WaWV3KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQudGV4dC5zdHlsZS5VbmRlcmxpbmVTcGFuIGV4dGVuZHMgYW5kcm9pZC50ZXh0LnN0eWxlLkNoYXJhY3RlclN0eWxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgdXBkYXRlRHJhd1N0YXRlKAotYW5kcm9pZC50ZXh0LlRleHRQYWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLSBjbGFzcyBhbmRyb2lkLnRleHQudXRpbC5MaW5rU3BlYyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGludCBlbmQKLQotIGludCBzdGFydAotCi0gamF2YS5sYW5nLlN0cmluZyB1cmwKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3RleHQvdXRpbC9MaW5raWZ5OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9TWF0Y2hGaWx0ZXIgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLnRleHQudXRpbC5MaW5raWZ5JE1hdGNoRmlsdGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGFjY2VwdE1hdGNoKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdGV4dC91dGlsL0xpbmtpZnk7ICkKLWZpbmFsIGNsYXNzIGFuZHJvaWQudGV4dC51dGlsLkxpbmtpZnkkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnRleHQudXRpbC5MaW5raWZ5JE1hdGNoRmlsdGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gYWNjZXB0TWF0Y2goCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC90ZXh0L3V0aWwvTGlua2lmeTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotZmluYWwgY2xhc3MgYW5kcm9pZC50ZXh0LnV0aWwuTGlua2lmeSQyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQudGV4dC51dGlsLkxpbmtpZnkkTWF0Y2hGaWx0ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBhY2NlcHRNYXRjaCgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1UcmFuc2Zvcm1GaWx0ZXIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdGV4dC91dGlsL0xpbmtpZnk7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC50ZXh0LnV0aWwuTGlua2lmeSRUcmFuc2Zvcm1GaWx0ZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgdHJhbnNmb3JtVXJsKAotamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXIKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdGV4dC91dGlsL0xpbmtpZnk7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLWZpbmFsIGNsYXNzIGFuZHJvaWQudGV4dC51dGlsLkxpbmtpZnkkMyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnRleHQudXRpbC5MaW5raWZ5JFRyYW5zZm9ybUZpbHRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIHRyYW5zZm9ybVVybCgKLWphdmEudXRpbC5yZWdleC5NYXRjaGVyCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS91dGlsL0NvbXBhcmF0b3I8TGFuZHJvaWQvdGV4dC91dGlsL0xpbmtTcGVjOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLWZpbmFsIGNsYXNzIGFuZHJvaWQudGV4dC51dGlsLkxpbmtpZnkkNCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuQ29tcGFyYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBmaW5hbCBpbnQgY29tcGFyZSgKLWFuZHJvaWQudGV4dC51dGlsLkxpbmtTcGVjCi1hbmRyb2lkLnRleHQudXRpbC5MaW5rU3BlYykKLQotcHVibGljIHZvbGF0aWxlIGludCBjb21wYXJlKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3RleHQvdXRpbC9MaW5raWZ5JFRyYW5zZm9ybUZpbHRlcjtMYW5kcm9pZC90ZXh0L3V0aWwvTGlua2lmeSRNYXRjaEZpbHRlcjsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQudGV4dC51dGlsLkxpbmtpZnkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFMTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTUFJTF9BRERSRVNTRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFQX0FERFJFU1NFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQSE9ORV9OVU1CRVJTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQSE9ORV9OVU1CRVJfTUlOSU1VTV9ESUdJVFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0VCX1VSTFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnRleHQudXRpbC5MaW5raWZ5JE1hdGNoRmlsdGVyIHNQaG9uZU51bWJlck1hdGNoRmlsdGVyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC50ZXh0LnV0aWwuTGlua2lmeSRUcmFuc2Zvcm1GaWx0ZXIgc1Bob25lTnVtYmVyVHJhbnNmb3JtRmlsdGVyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC50ZXh0LnV0aWwuTGlua2lmeSRNYXRjaEZpbHRlciBzVXJsTWF0Y2hGaWx0ZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIHZvaWQgYWRkTGlua01vdmVtZW50TWV0aG9kKAotYW5kcm9pZC53aWRnZXQuVGV4dFZpZXcpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBhZGRMaW5rcygKLWFuZHJvaWQud2lkZ2V0LlRleHRWaWV3Ci1qYXZhLnV0aWwucmVnZXguUGF0dGVybgotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIGFkZExpbmtzKAotYW5kcm9pZC53aWRnZXQuVGV4dFZpZXcKLWphdmEudXRpbC5yZWdleC5QYXR0ZXJuCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLnRleHQudXRpbC5MaW5raWZ5JE1hdGNoRmlsdGVyCi1hbmRyb2lkLnRleHQudXRpbC5MaW5raWZ5JFRyYW5zZm9ybUZpbHRlcikKLQotcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGFkZExpbmtzKAotYW5kcm9pZC50ZXh0LlNwYW5uYWJsZQotaW50KQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gYWRkTGlua3MoCi1hbmRyb2lkLnRleHQuU3Bhbm5hYmxlCi1qYXZhLnV0aWwucmVnZXguUGF0dGVybgotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGFkZExpbmtzKAotYW5kcm9pZC50ZXh0LlNwYW5uYWJsZQotamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4KLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQudGV4dC51dGlsLkxpbmtpZnkkTWF0Y2hGaWx0ZXIKLWFuZHJvaWQudGV4dC51dGlsLkxpbmtpZnkkVHJhbnNmb3JtRmlsdGVyKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gYWRkTGlua3MoCi1hbmRyb2lkLndpZGdldC5UZXh0VmlldwotaW50KQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCB2b2lkIGFwcGx5TGluaygKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50Ci1hbmRyb2lkLnRleHQuU3Bhbm5hYmxlKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0FycmF5TGlzdDxMYW5kcm9pZC90ZXh0L3V0aWwvTGlua1NwZWM7PjtMYW5kcm9pZC90ZXh0L1NwYW5uYWJsZTtMamF2YS91dGlsL3JlZ2V4L1BhdHRlcm47W0xqYXZhL2xhbmcvU3RyaW5nO0xhbmRyb2lkL3RleHQvdXRpbC9MaW5raWZ5JE1hdGNoRmlsdGVyO0xhbmRyb2lkL3RleHQvdXRpbC9MaW5raWZ5JFRyYW5zZm9ybUZpbHRlcjspViApCi1wcml2YXRlIHN0YXRpYyBmaW5hbCB2b2lkIGdhdGhlckxpbmtzKAotamF2YS51dGlsLkFycmF5TGlzdAotYW5kcm9pZC50ZXh0LlNwYW5uYWJsZQotamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4KLWphdmEubGFuZy5TdHJpbmdbXQotYW5kcm9pZC50ZXh0LnV0aWwuTGlua2lmeSRNYXRjaEZpbHRlcgotYW5kcm9pZC50ZXh0LnV0aWwuTGlua2lmeSRUcmFuc2Zvcm1GaWx0ZXIpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvQXJyYXlMaXN0PExhbmRyb2lkL3RleHQvdXRpbC9MaW5rU3BlYzs+O0xhbmRyb2lkL3RleHQvU3Bhbm5hYmxlOylWICkKLXByaXZhdGUgc3RhdGljIGZpbmFsIHZvaWQgZ2F0aGVyTWFwTGlua3MoCi1qYXZhLnV0aWwuQXJyYXlMaXN0Ci1hbmRyb2lkLnRleHQuU3Bhbm5hYmxlKQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIG1ha2VVcmwoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nW10KLWphdmEudXRpbC5yZWdleC5NYXRjaGVyCi1hbmRyb2lkLnRleHQudXRpbC5MaW5raWZ5JFRyYW5zZm9ybUZpbHRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9BcnJheUxpc3Q8TGFuZHJvaWQvdGV4dC91dGlsL0xpbmtTcGVjOz47KVYgKQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgdm9pZCBwcnVuZU92ZXJsYXBzKAotamF2YS51dGlsLkFycmF5TGlzdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnRleHQudXRpbC5SZWdleCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwucmVnZXguUGF0dGVybiBET01BSU5fTkFNRV9QQVRURVJOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4gRU1BSUxfQUREUkVTU19QQVRURVJOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4gSVBfQUREUkVTU19QQVRURVJOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4gUEhPTkVfUEFUVEVSTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudXRpbC5yZWdleC5QYXR0ZXJuIFRPUF9MRVZFTF9ET01BSU5fUEFUVEVSTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudXRpbC5yZWdleC5QYXR0ZXJuIFdFQl9VUkxfUEFUVEVSTgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGNvbmNhdEdyb3VwcygKLWphdmEudXRpbC5yZWdleC5NYXRjaGVyKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgZGlnaXRzQW5kUGx1c09ubHkoCi1qYXZhLnV0aWwucmVnZXguTWF0Y2hlcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnRleHQudXRpbC5SZmM4MjJUb2tlbiBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1BZGRyZXNzCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtQ29tbWVudAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbU5hbWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgcXVvdGVDb21tZW50KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIHF1b3RlTmFtZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBxdW90ZU5hbWVJZk5lY2Vzc2FyeSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEFkZHJlc3MoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRDb21tZW50KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TmFtZSgpCi0KLXB1YmxpYyB2b2lkIHNldEFkZHJlc3MoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRDb21tZW50KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0TmFtZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9VG9rZW5pemVyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9NdWx0aUF1dG9Db21wbGV0ZVRleHRWaWV3OyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQud2lkZ2V0Lk11bHRpQXV0b0NvbXBsZXRlVGV4dFZpZXckVG9rZW5pemVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZmluZFRva2VuRW5kKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGZpbmRUb2tlblN0YXJ0KAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSB0ZXJtaW5hdGVUb2tlbigKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC50ZXh0LnV0aWwuUmZjODIyVG9rZW5pemVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQud2lkZ2V0Lk11bHRpQXV0b0NvbXBsZXRlVGV4dFZpZXckVG9rZW5pemVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBjcnVuY2goCi1qYXZhLmxhbmcuU3RyaW5nQnVpbGRlcikKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLnRleHQudXRpbC5SZmM4MjJUb2tlbltdIHRva2VuaXplKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotcHVibGljIGludCBmaW5kVG9rZW5FbmQoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQpCi0KLXB1YmxpYyBpbnQgZmluZFRva2VuU3RhcnQoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIHRlcm1pbmF0ZVRva2VuKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvQXV0b0NvbXBsZXRlVGV4dFZpZXc7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1WYWxpZGF0b3IgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLndpZGdldC5BdXRvQ29tcGxldGVUZXh0VmlldyRWYWxpZGF0b3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5DaGFyU2VxdWVuY2UgZml4VGV4dCgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzVmFsaWQoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQudGV4dC51dGlsLlJmYzgyMlZhbGlkYXRvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLndpZGdldC5BdXRvQ29tcGxldGVUZXh0VmlldyRWYWxpZGF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4gRU1BSUxfQUREUkVTU19QQVRURVJOCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtRG9tYWluCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVtb3ZlSWxsZWdhbENoYXJhY3RlcnMoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBmaXhUZXh0KAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotcHVibGljIGJvb2xlYW4gaXNWYWxpZCgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC51dGlsLkNvbmZpZyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0dECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0dWCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBQUk9GSUxFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBSRUxFQVNFCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnV0aWwuTW9udGhEaXNwbGF5SGVscGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEudXRpbC5DYWxlbmRhciBtQ2FsZW5kYXIKLQotcHJpdmF0ZSBpbnQgbU51bURheXNJbk1vbnRoCi0KLXByaXZhdGUgaW50IG1OdW1EYXlzSW5QcmV2TW9udGgKLQotcHJpdmF0ZSBpbnQgbU9mZnNldAotCi1wcml2YXRlIGZpbmFsIGludCBtV2Vla1N0YXJ0RGF5Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotaW50Ci1pbnQpCi0KLXByaXZhdGUgdm9pZCByZWNhbGN1bGF0ZSgpCi0KLXB1YmxpYyBpbnQgZ2V0Q29sdW1uT2YoCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0RGF5QXQoCi1pbnQKLWludCkKLQotcHVibGljIGludFtdIGdldERpZ2l0c0ZvclJvdygKLWludCkKLQotcHVibGljIGludCBnZXRGaXJzdERheU9mTW9udGgoKQotCi1wdWJsaWMgaW50IGdldE1vbnRoKCkKLQotcHVibGljIGludCBnZXROdW1iZXJPZkRheXNJbk1vbnRoKCkKLQotcHVibGljIGludCBnZXRPZmZzZXQoKQotCi1wdWJsaWMgaW50IGdldFJvd09mKAotaW50KQotCi1wdWJsaWMgaW50IGdldFdlZWtTdGFydERheSgpCi0KLXB1YmxpYyBpbnQgZ2V0WWVhcigpCi0KLXB1YmxpYyBib29sZWFuIGlzV2l0aGluQ3VycmVudE1vbnRoKAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIG5leHRNb250aCgpCi0KLXB1YmxpYyB2b2lkIHByZXZpb3VzTW9udGgoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQudXRpbC5EYXlPZk1vbnRoQ3Vyc29yIGV4dGVuZHMgYW5kcm9pZC51dGlsLk1vbnRoRGlzcGxheUhlbHBlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGludCBtQ29sdW1uCi0KLXByaXZhdGUgaW50IG1Sb3cKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBib29sZWFuIGRvd24oKQotCi1wdWJsaWMgaW50IGdldFNlbGVjdGVkQ29sdW1uKCkKLQotcHVibGljIGludCBnZXRTZWxlY3RlZERheU9mTW9udGgoKQotCi1wdWJsaWMgaW50IGdldFNlbGVjdGVkUm93KCkKLQotcHVibGljIGJvb2xlYW4gaXNTZWxlY3RlZCgKLWludAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBsZWZ0KCkKLQotcHVibGljIGJvb2xlYW4gcmlnaHQoKQotCi1wdWJsaWMgdm9pZCBzZXRTZWxlY3RlZERheU9mTW9udGgoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkUm93Q29sdW1uKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBib29sZWFuIHVwKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnV0aWwuRGVidWdVdGlscyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNPYmplY3RTZWxlY3RlZCgKLWphdmEubGFuZy5PYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgZmxvYXQgZGVuc2l0eQotCi1wdWJsaWMgaW50IGhlaWdodFBpeGVscwotCi1wdWJsaWMgZmxvYXQgc2NhbGVkRGVuc2l0eQotCi1wdWJsaWMgaW50IHdpZHRoUGl4ZWxzCi0KLXB1YmxpYyBmbG9hdCB4ZHBpCi0KLXB1YmxpYyBmbG9hdCB5ZHBpCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgc2V0VG8oCi1hbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3MpCi0KLXB1YmxpYyB2b2lkIHNldFRvRGVmYXVsdHMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3V0aWwvRXZlbnRMb2c7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjUgbmFtZSA9RXZlbnQgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQudXRpbC5FdmVudExvZyRFdmVudCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERBVEFfU1RBUlQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExFTkdUSF9PRkZTRVQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5BTk9TRUNPTkRTX09GRlNFVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEFZTE9BRF9TVEFSVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFJPQ0VTU19PRkZTRVQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFQ09ORFNfT0ZGU0VUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUQUdfT0ZGU0VUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUSFJFQURfT0ZGU0VUCi0KLXByaXZhdGUgZmluYWwgamF2YS5uaW8uQnl0ZUJ1ZmZlciBtQnVmZmVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYnl0ZVtdKQotCi1wcml2YXRlIGphdmEubGFuZy5PYmplY3QgZGVjb2RlT2JqZWN0KCkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0RGF0YSgpCi0KLXB1YmxpYyBpbnQgZ2V0UHJvY2Vzc0lkKCkKLQotcHVibGljIGludCBnZXRUYWcoKQotCi1wdWJsaWMgaW50IGdldFRocmVhZElkKCkKLQotcHVibGljIGxvbmcgZ2V0VGltZU5hbm9zKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI1IG5hbWUgPUxpc3QgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdXRpbC9FdmVudExvZzsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQudXRpbC5FdmVudExvZyRMaXN0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEubGFuZy5PYmplY3RbXSBtSXRlbXMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOyApCi1wdWJsaWMgdHJhbnNpZW50IHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLk9iamVjdFtdKQotCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLk9iamVjdCBnZXRJdGVtKAotaW50KQotCi1wdWJsaWMgZmluYWwgYnl0ZSBnZXROdW1JdGVtcygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC91dGlsL0V2ZW50TG9nJEV2ZW50O0xhbmRyb2lkL3V0aWwvRXZlbnRMb2ckTGlzdDsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQudXRpbC5FdmVudExvZyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIElOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgTElTVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgTE9ORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgU1RSSU5HCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oW0lMamF2YS91dGlsL0NvbGxlY3Rpb248TGFuZHJvaWQvdXRpbC9FdmVudExvZyRFdmVudDs+OylWICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCByZWFkRXZlbnRzKAotaW50W10KLWphdmEudXRpbC5Db2xsZWN0aW9uKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgd3JpdGVFdmVudCgKLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgd3JpdGVFdmVudCgKLWludAotbG9uZykKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IHdyaXRlRXZlbnQoCi1pbnQKLWFuZHJvaWQudXRpbC5FdmVudExvZyRMaXN0KQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgd3JpdGVFdmVudCgKLWludAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyB0cmFuc2llbnQgaW50IHdyaXRlRXZlbnQoCi1pbnQKLWphdmEubGFuZy5PYmplY3RbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC91dGlsL0V2ZW50TG9nVGFnczsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPURlc2NyaXB0aW9uICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnV0aWwuRXZlbnRMb2dUYWdzJERlc2NyaXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBtTmFtZQotCi1wdWJsaWMgZmluYWwgaW50IG1UYWcKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC91dGlsL0V2ZW50TG9nVGFncyREZXNjcmlwdGlvbjsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQudXRpbC5FdmVudExvZ1RhZ3MgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEudXRpbC5yZWdleC5QYXR0ZXJuIENPTU1FTlRfUEFUVEVSTgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRBRwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRBR1NfRklMRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwucmVnZXguUGF0dGVybiBUQUdfUEFUVEVSTgotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaE1hcDxMamF2YS9sYW5nL1N0cmluZztMYW5kcm9pZC91dGlsL0V2ZW50TG9nVGFncyREZXNjcmlwdGlvbjs+OyApCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5IYXNoTWFwIG1OYW1lTWFwCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNoTWFwPExqYXZhL2xhbmcvSW50ZWdlcjtMYW5kcm9pZC91dGlsL0V2ZW50TG9nVGFncyREZXNjcmlwdGlvbjs+OyApCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5IYXNoTWFwIG1UYWdNYXAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uQnVmZmVyZWRSZWFkZXIpCi0KLXB1YmxpYyBhbmRyb2lkLnV0aWwuRXZlbnRMb2dUYWdzJERlc2NyaXB0aW9uIGdldCgKLWludCkKLQotcHVibGljIGFuZHJvaWQudXRpbC5FdmVudExvZ1RhZ3MkRGVzY3JpcHRpb24gZ2V0KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnV0aWwuRmxvYXRNYXRoIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBmbG9hdCBjZWlsKAotZmxvYXQpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGZsb2F0IGNvcygKLWZsb2F0KQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBmbG9hdCBmbG9vcigKLWZsb2F0KQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBmbG9hdCBzaW4oCi1mbG9hdCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgZmxvYXQgc3FydCgKLWZsb2F0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQudXRpbC5Mb2cgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFTU0VSVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUJVRwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZFUkJPU0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGludCBkKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBpbnQgZCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLXB1YmxpYyBzdGF0aWMgaW50IGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGludCBlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlRocm93YWJsZSkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0YWNrVHJhY2VTdHJpbmcoCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1wdWJsaWMgc3RhdGljIGludCBpKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBpbnQgaSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gaXNMb2dnYWJsZSgKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IHByaW50bG4oCi1pbnQKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgaW50IHYoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGludCB2KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlRocm93YWJsZSkKLQotcHVibGljIHN0YXRpYyBpbnQgdygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgaW50IHcoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1wdWJsaWMgc3RhdGljIGludCB3KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlRocm93YWJsZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC51dGlsLlByaW50ZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgcHJpbnRsbigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC51dGlsLkxvZ1ByaW50ZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC51dGlsLlByaW50ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBpbnQgbVByaW9yaXR5Ci0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBtVGFnCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBwcmludGxuKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnV0aWwuUHJpbnRXcml0ZXJQcmludGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQudXRpbC5QcmludGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgamF2YS5pby5QcmludFdyaXRlciBtUFcKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmlvLlByaW50V3JpdGVyKQotCi1wdWJsaWMgdm9pZCBwcmludGxuKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEU6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL2xhbmcvT2JqZWN0OyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuT2JqZWN0IERFTEVURUQKLQotcHJpdmF0ZSBib29sZWFuIG1HYXJiYWdlCi0KLXByaXZhdGUgaW50W10gbUtleXMKLQotcHJpdmF0ZSBpbnQgbVNpemUKLQotcHJpdmF0ZSBqYXZhLmxhbmcuT2JqZWN0W10gbVZhbHVlcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBpbnQgYmluYXJ5U2VhcmNoKAotaW50W10KLWludAotaW50Ci1pbnQpCi0KLXByaXZhdGUgdm9pZCBjaGVja0ludGVncml0eSgpCi0KLXByaXZhdGUgdm9pZCBnYygpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KElURTspViApCi1wdWJsaWMgdm9pZCBhcHBlbmQoCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2lkIGNsZWFyKCkKLQotcHVibGljIHZvaWQgZGVsZXRlKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJKVRFOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXQoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KElURTspVEU7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldCgKLWludAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGludCBpbmRleE9mS2V5KAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShURTspSSApCi1wdWJsaWMgaW50IGluZGV4T2ZWYWx1ZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBpbnQga2V5QXQoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KElURTspViApCi1wdWJsaWMgdm9pZCBwdXQoCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2lkIHJlbW92ZSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSVRFOylWICkKLXB1YmxpYyB2b2lkIHNldFZhbHVlQXQoCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBpbnQgc2l6ZSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KEkpVEU7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHZhbHVlQXQoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC51dGlsLlNwYXJzZUJvb2xlYW5BcnJheSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBpbnRbXSBtS2V5cwotCi1wcml2YXRlIGludCBtU2l6ZQotCi1wcml2YXRlIGJvb2xlYW5bXSBtVmFsdWVzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBpbnQgYmluYXJ5U2VhcmNoKAotaW50W10KLWludAotaW50Ci1pbnQpCi0KLXByaXZhdGUgdm9pZCBjaGVja0ludGVncml0eSgpCi0KLXB1YmxpYyB2b2lkIGFwcGVuZCgKLWludAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgY2xlYXIoKQotCi1wdWJsaWMgdm9pZCBkZWxldGUoCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIGdldCgKLWludCkKLQotcHVibGljIGJvb2xlYW4gZ2V0KAotaW50Ci1ib29sZWFuKQotCi1wdWJsaWMgaW50IGluZGV4T2ZLZXkoCi1pbnQpCi0KLXB1YmxpYyBpbnQgaW5kZXhPZlZhbHVlKAotYm9vbGVhbikKLQotcHVibGljIGludCBrZXlBdCgKLWludCkKLQotcHVibGljIHZvaWQgcHV0KAotaW50Ci1ib29sZWFuKQotCi1wdWJsaWMgaW50IHNpemUoKQotCi1wdWJsaWMgYm9vbGVhbiB2YWx1ZUF0KAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQudXRpbC5TcGFyc2VJbnRBcnJheSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBpbnRbXSBtS2V5cwotCi1wcml2YXRlIGludCBtU2l6ZQotCi1wcml2YXRlIGludFtdIG1WYWx1ZXMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIGludCBiaW5hcnlTZWFyY2goCi1pbnRbXQotaW50Ci1pbnQKLWludCkKLQotcHJpdmF0ZSB2b2lkIGNoZWNrSW50ZWdyaXR5KCkKLQotcHVibGljIHZvaWQgYXBwZW5kKAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIGNsZWFyKCkKLQotcHVibGljIHZvaWQgZGVsZXRlKAotaW50KQotCi1wdWJsaWMgaW50IGdldCgKLWludCkKLQotcHVibGljIGludCBnZXQoCi1pbnQKLWludCkKLQotcHVibGljIGludCBpbmRleE9mS2V5KAotaW50KQotCi1wdWJsaWMgaW50IGluZGV4T2ZWYWx1ZSgKLWludCkKLQotcHVibGljIGludCBrZXlBdCgKLWludCkKLQotcHVibGljIHZvaWQgcHV0KAotaW50Ci1pbnQpCi0KLXB1YmxpYyBpbnQgc2l6ZSgpCi0KLXB1YmxpYyBpbnQgdmFsdWVBdCgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnV0aWwuU3RhdGVTZXQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gV0lMRF9DQVJECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZHVtcCgKLWludFtdKQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNXaWxkQ2FyZCgKLWludFtdKQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RhdGVTZXRNYXRjaGVzKAotaW50W10KLWludCkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIHN0YXRlU2V0TWF0Y2hlcygKLWludFtdCi1pbnRbXSkKLQotcHVibGljIHN0YXRpYyBpbnRbXSB0cmltU3RhdGVTZXQoCi1pbnRbXQotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQudXRpbC5TdHJpbmdCdWlsZGVyUHJpbnRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnV0aWwuUHJpbnRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmdCdWlsZGVyIG1CdWlsZGVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIpCi0KLXB1YmxpYyB2b2lkIHByaW50bG4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQudXRpbC5UaW1lRm9ybWF0RXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQudXRpbC5UaW1lVXRpbHMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVGltZVpvbmUgZ2V0VGltZVpvbmUoCi1pbnQKLWJvb2xlYW4KLWxvbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC51dGlsLlRpbWluZ0xvZ2dlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBib29sZWFuIG1EaXNhYmxlZAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbUxhYmVsCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9BcnJheUxpc3Q8TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotIGphdmEudXRpbC5BcnJheUxpc3QgbVNwbGl0TGFiZWxzCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9BcnJheUxpc3Q8TGphdmEvbGFuZy9Mb25nOz47ICkKLSBqYXZhLnV0aWwuQXJyYXlMaXN0IG1TcGxpdHMKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1UYWcKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBhZGRTcGxpdCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIGR1bXBUb0xvZygpCi0KLXB1YmxpYyB2b2lkIHJlc2V0KCkKLQotcHVibGljIHZvaWQgcmVzZXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQudXRpbC5UeXBlZFZhbHVlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01QTEVYX01BTlRJU1NBX01BU0sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NUExFWF9NQU5USVNTQV9TSElGVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01QTEVYX1JBRElYXzBwMjMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NUExFWF9SQURJWF8xNnA3Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTVBMRVhfUkFESVhfMjNwMAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01QTEVYX1JBRElYXzhwMTUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NUExFWF9SQURJWF9NQVNLCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTVBMRVhfUkFESVhfU0hJRlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NUExFWF9VTklUX0RJUAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01QTEVYX1VOSVRfRlJBQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NUExFWF9VTklUX0ZSQUNUSU9OX1BBUkVOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01QTEVYX1VOSVRfSU4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NUExFWF9VTklUX01BU0sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NUExFWF9VTklUX01NCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTVBMRVhfVU5JVF9QVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01QTEVYX1VOSVRfUFgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NUExFWF9VTklUX1NISUZUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTVBMRVhfVU5JVF9TUAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gRElNRU5TSU9OX1VOSVRfU1RSUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gRlJBQ1RJT05fVU5JVF9TVFJTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IE1BTlRJU1NBX01VTFQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXRbXSBSQURJWF9NVUxUUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0FUVFJJQlVURQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0RJTUVOU0lPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0ZJUlNUX0NPTE9SX0lOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0ZJUlNUX0lOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0ZMT0FUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfRlJBQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9JTlRfQk9PTEVBTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0lOVF9DT0xPUl9BUkdCNAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0lOVF9DT0xPUl9BUkdCOAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0lOVF9DT0xPUl9SR0I0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfSU5UX0NPTE9SX1JHQjgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9JTlRfREVDCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfSU5UX0hFWAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0xBU1RfQ09MT1JfSU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfTEFTVF9JTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9OVUxMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfUkVGRVJFTkNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfU1RSSU5HCi0KLXB1YmxpYyBpbnQgYXNzZXRDb29raWUKLQotcHVibGljIGludCBjaGFuZ2luZ0NvbmZpZ3VyYXRpb25zCi0KLXB1YmxpYyBpbnQgZGF0YQotCi1wdWJsaWMgaW50IHJlc291cmNlSWQKLQotcHVibGljIGphdmEubGFuZy5DaGFyU2VxdWVuY2Ugc3RyaW5nCi0KLXB1YmxpYyBpbnQgdHlwZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBmbG9hdCBhcHBseURpbWVuc2lvbigKLWludAotZmxvYXQKLWFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljcykKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGNvZXJjZVRvU3RyaW5nKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgZmxvYXQgY29tcGxleFRvRGltZW5zaW9uKAotaW50Ci1hbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3MpCi0KLXB1YmxpYyBzdGF0aWMgZmxvYXQgY29tcGxleFRvRGltZW5zaW9uTm9pc3koCi1pbnQKLWFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljcykKLQotcHVibGljIHN0YXRpYyBpbnQgY29tcGxleFRvRGltZW5zaW9uUGl4ZWxPZmZzZXQoCi1pbnQKLWFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljcykKLQotcHVibGljIHN0YXRpYyBpbnQgY29tcGxleFRvRGltZW5zaW9uUGl4ZWxTaXplKAotaW50Ci1hbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3MpCi0KLXB1YmxpYyBzdGF0aWMgZmxvYXQgY29tcGxleFRvRmxvYXQoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgZmxvYXQgY29tcGxleFRvRnJhY3Rpb24oCi1pbnQKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIGZpbmFsIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgY29lcmNlVG9TdHJpbmcoKQotCi1wdWJsaWMgZmxvYXQgZ2V0RGltZW5zaW9uKAotYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzKQotCi1wdWJsaWMgZmluYWwgZmxvYXQgZ2V0RmxvYXQoKQotCi1wdWJsaWMgZmxvYXQgZ2V0RnJhY3Rpb24oCi1mbG9hdAotZmxvYXQpCi0KLXB1YmxpYyB2b2lkIHNldFRvKAotYW5kcm9pZC51dGlsLlR5cGVkVmFsdWUpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC91dGlsL1htbDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvRW51bTxMYW5kcm9pZC91dGlsL1htbCRFbmNvZGluZzs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE2NDA5IG5hbWUgPUVuY29kaW5nICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLnV0aWwuWG1sJEVuY29kaW5nIGV4dGVuZHMgamF2YS5sYW5nLkVudW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYW5kcm9pZC51dGlsLlhtbCRFbmNvZGluZ1tdICRWQUxVRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnV0aWwuWG1sJEVuY29kaW5nIElTT184ODU5XzEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnV0aWwuWG1sJEVuY29kaW5nIFVTX0FTQ0lJCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC51dGlsLlhtbCRFbmNvZGluZyBVVEZfMTYKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnV0aWwuWG1sJEVuY29kaW5nIFVURl84Ci0KLWZpbmFsIGphdmEubGFuZy5TdHJpbmcgZXhwYXROYW1lCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1N0cmluZzspViApCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQudXRpbC5YbWwkRW5jb2RpbmcgdmFsdWVPZigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC51dGlsLlhtbCRFbmNvZGluZ1tdIHZhbHVlcygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdXRpbC9YbWw7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1YbWxTZXJpYWxpemVyRmFjdG9yeSApCi0gY2xhc3MgYW5kcm9pZC51dGlsLlhtbCRYbWxTZXJpYWxpemVyRmFjdG9yeSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVFlQRQotCi1zdGF0aWMgZmluYWwgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckZhY3RvcnkgaW5zdGFuY2UKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLSB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC91dGlsL1htbCRFbmNvZGluZztMYW5kcm9pZC91dGlsL1htbCRYbWxTZXJpYWxpemVyRmFjdG9yeTsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQudXRpbC5YbWwgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBGRUFUVVJFX1JFTEFYRUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCBhc0F0dHJpYnV0ZVNldCgKLW9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBhbmRyb2lkLnV0aWwuWG1sJEVuY29kaW5nIGZpbmRFbmNvZGluZ0J5TmFtZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlciBuZXdQdWxsUGFyc2VyKCkKLQotcHVibGljIHN0YXRpYyBvcmcueG1scHVsbC52MS5YbWxTZXJpYWxpemVyIG5ld1NlcmlhbGl6ZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xvcmcveG1sL3NheC9TQVhFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgdm9pZCBwYXJzZSgKLWphdmEuaW8uSW5wdXRTdHJlYW0KLWFuZHJvaWQudXRpbC5YbWwkRW5jb2RpbmcKLW9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xvcmcveG1sL3NheC9TQVhFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgdm9pZCBwYXJzZSgKLWphdmEuaW8uUmVhZGVyCi1vcmcueG1sLnNheC5Db250ZW50SGFuZGxlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIHZvaWQgcGFyc2UoCi1qYXZhLmxhbmcuU3RyaW5nCi1vcmcueG1sLnNheC5Db250ZW50SGFuZGxlcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLSBjbGFzcyBhbmRyb2lkLnV0aWwuWG1sUHVsbEF0dHJpYnV0ZXMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXIgbVBhcnNlcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXIpCi0KLXB1YmxpYyBib29sZWFuIGdldEF0dHJpYnV0ZUJvb2xlYW5WYWx1ZSgKLWludAotYm9vbGVhbikKLQotcHVibGljIGJvb2xlYW4gZ2V0QXR0cmlidXRlQm9vbGVhblZhbHVlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotcHVibGljIGludCBnZXRBdHRyaWJ1dGVDb3VudCgpCi0KLXB1YmxpYyBmbG9hdCBnZXRBdHRyaWJ1dGVGbG9hdFZhbHVlKAotaW50Ci1mbG9hdCkKLQotcHVibGljIGZsb2F0IGdldEF0dHJpYnV0ZUZsb2F0VmFsdWUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1mbG9hdCkKLQotcHVibGljIGludCBnZXRBdHRyaWJ1dGVJbnRWYWx1ZSgKLWludAotaW50KQotCi1wdWJsaWMgaW50IGdldEF0dHJpYnV0ZUludFZhbHVlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgaW50IGdldEF0dHJpYnV0ZUxpc3RWYWx1ZSgKLWludAotamF2YS5sYW5nLlN0cmluZ1tdCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0QXR0cmlidXRlTGlzdFZhbHVlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZ1tdCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0QXR0cmlidXRlTmFtZVJlc291cmNlKAotaW50KQotCi1wdWJsaWMgaW50IGdldEF0dHJpYnV0ZVJlc291cmNlVmFsdWUoCi1pbnQKLWludCkKLQotcHVibGljIGludCBnZXRBdHRyaWJ1dGVSZXNvdXJjZVZhbHVlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgaW50IGdldEF0dHJpYnV0ZVVuc2lnbmVkSW50VmFsdWUoCi1pbnQKLWludCkKLQotcHVibGljIGludCBnZXRBdHRyaWJ1dGVVbnNpZ25lZEludFZhbHVlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZSgKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRDbGFzc0F0dHJpYnV0ZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldElkQXR0cmlidXRlKCkKLQotcHVibGljIGludCBnZXRJZEF0dHJpYnV0ZVJlc291cmNlVmFsdWUoCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFBvc2l0aW9uRGVzY3JpcHRpb24oKQotCi1wdWJsaWMgaW50IGdldFN0eWxlQXR0cmlidXRlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC92aWV3L0Fic1NhdmVkU3RhdGU7ICkKLWZpbmFsIGNsYXNzIGFuZHJvaWQudmlldy5BYnNTYXZlZFN0YXRlJDEgZXh0ZW5kcyBhbmRyb2lkLnZpZXcuQWJzU2F2ZWRTdGF0ZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9BYnNTYXZlZFN0YXRlOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExhbmRyb2lkL3ZpZXcvQWJzU2F2ZWRTdGF0ZTs+OyApCi1maW5hbCBjbGFzcyBhbmRyb2lkLnZpZXcuQWJzU2F2ZWRTdGF0ZSQyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGFuZHJvaWQudmlldy5BYnNTYXZlZFN0YXRlIGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgYW5kcm9pZC52aWV3LkFic1NhdmVkU3RhdGVbXSBuZXdBcnJheSgKLWludCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3RbXSBuZXdBcnJheSgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC92aWV3L0NvbnRleHRNZW51OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9Q29udGV4dE1lbnVJbmZvICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51JENvbnRleHRNZW51SW5mbyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLnZpZXcuTWVudSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FURUdPUllfQUxURVJOQVRJVkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FURUdPUllfQ09OVEFJTkVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBVEVHT1JZX01BU0sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FURUdPUllfU0VDT05EQVJZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBVEVHT1JZX1NISUZUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBVEVHT1JZX1NZU1RFTQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSVJTVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX0FMV0FZU19QRVJGT1JNX0NMT1NFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfQVBQRU5EX1RPX0dST1VQCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfUEVSRk9STV9OT19DTE9TRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT05FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVTRVJfTUFTSwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBVU0VSX1NISUZUCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQudmlldy5NZW51SXRlbSBhZGQoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLnZpZXcuTWVudUl0ZW0gYWRkKAotaW50Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC52aWV3Lk1lbnVJdGVtIGFkZCgKLWludAotaW50Ci1pbnQKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLnZpZXcuTWVudUl0ZW0gYWRkKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotcHVibGljIGFic3RyYWN0IGludCBhZGRJbnRlbnRPcHRpb25zKAotaW50Ci1pbnQKLWludAotYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUKLWFuZHJvaWQuY29udGVudC5JbnRlbnRbXQotYW5kcm9pZC5jb250ZW50LkludGVudAotaW50Ci1hbmRyb2lkLnZpZXcuTWVudUl0ZW1bXSkKLQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQudmlldy5TdWJNZW51IGFkZFN1Yk1lbnUoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLnZpZXcuU3ViTWVudSBhZGRTdWJNZW51KAotaW50Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC52aWV3LlN1Yk1lbnUgYWRkU3ViTWVudSgKLWludAotaW50Ci1pbnQKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLnZpZXcuU3ViTWVudSBhZGRTdWJNZW51KAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgY2xlYXIoKQotCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC52aWV3Lk1lbnVJdGVtIGZpbmRJdGVtKAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBoYXNWaXNpYmxlSXRlbXMoKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1Nob3J0Y3V0S2V5KAotaW50Ci1hbmRyb2lkLnZpZXcuS2V5RXZlbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHBlcmZvcm1JZGVudGlmaWVyQWN0aW9uKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHBlcmZvcm1TaG9ydGN1dCgKLWludAotYW5kcm9pZC52aWV3LktleUV2ZW50Ci1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlbW92ZUdyb3VwKAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCByZW1vdmVJdGVtKAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRHcm91cENoZWNrYWJsZSgKLWludAotYm9vbGVhbgotYm9vbGVhbikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0R3JvdXBFbmFibGVkKAotaW50Ci1ib29sZWFuKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRHcm91cFZpc2libGUoCi1pbnQKLWJvb2xlYW4pCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFF3ZXJ0eU1vZGUoCi1ib29sZWFuKQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IHNpemUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9Db250ZXh0TWVudSRDb250ZXh0TWVudUluZm87ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQudmlldy5NZW51Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgY2xlYXJIZWFkZXIoKQotCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51IHNldEhlYWRlckljb24oCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnUgc2V0SGVhZGVySWNvbigKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUpCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnUgc2V0SGVhZGVyVGl0bGUoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnUgc2V0SGVhZGVyVGl0bGUoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51IHNldEhlYWRlclZpZXcoCi1hbmRyb2lkLnZpZXcuVmlldykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnZpZXcuRGlzcGxheSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9ESVNQTEFZCi0KLXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbUluaXRpYWxpemVkCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5PYmplY3QgbVN0YXRpY0luaXQKLQotcHJpdmF0ZSBmbG9hdCBtRGVuc2l0eQotCi1wcml2YXRlIGludCBtRGlzcGxheQotCi1wcml2YXRlIGZsb2F0IG1EcGlYCi0KLXByaXZhdGUgZmxvYXQgbURwaVkKLQotcHJpdmF0ZSBpbnQgbVBpeGVsRm9ybWF0Ci0KLXByaXZhdGUgZmxvYXQgbVJlZnJlc2hSYXRlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi0gdm9pZCA8aW5pdD4oCi1pbnQpCi0KLXN0YXRpYyBuYXRpdmUgaW50IGdldERpc3BsYXlDb3VudCgpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgaW5pdCgKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlQ2xhc3NJbml0KCkKLQotcHVibGljIGludCBnZXREaXNwbGF5SWQoKQotCi1wdWJsaWMgbmF0aXZlIGludCBnZXRIZWlnaHQoKQotCi1wdWJsaWMgdm9pZCBnZXRNZXRyaWNzKAotYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzKQotCi1wdWJsaWMgbmF0aXZlIGludCBnZXRPcmllbnRhdGlvbigpCi0KLXB1YmxpYyBpbnQgZ2V0UGl4ZWxGb3JtYXQoKQotCi1wdWJsaWMgZmxvYXQgZ2V0UmVmcmVzaFJhdGUoKQotCi1wdWJsaWMgbmF0aXZlIGludCBnZXRXaWR0aCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvVGhyZWFkTG9jYWw8TGFuZHJvaWQvdmlldy9Gb2N1c0ZpbmRlcjs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC92aWV3L0ZvY3VzRmluZGVyOyApCi1maW5hbCBjbGFzcyBhbmRyb2lkLnZpZXcuRm9jdXNGaW5kZXIkMSBleHRlbmRzIGphdmEubGFuZy5UaHJlYWRMb2NhbAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXByb3RlY3RlZCBhbmRyb2lkLnZpZXcuRm9jdXNGaW5kZXIgaW5pdGlhbFZhbHVlKCkKLQotcHJvdGVjdGVkIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgaW5pdGlhbFZhbHVlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnZpZXcuRm9jdXNGaW5kZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9UaHJlYWRMb2NhbDxMYW5kcm9pZC92aWV3L0ZvY3VzRmluZGVyOz47ICkKLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5UaHJlYWRMb2NhbCB0bEZvY3VzRmluZGVyCi0KLSBhbmRyb2lkLmdyYXBoaWNzLlJlY3QgbUJlc3RDYW5kaWRhdGVSZWN0Ci0KLSBhbmRyb2lkLmdyYXBoaWNzLlJlY3QgbUZvY3VzZWRSZWN0Ci0KLSBhbmRyb2lkLmdyYXBoaWNzLlJlY3QgbU90aGVyUmVjdAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQudmlldy5Gb2N1c0ZpbmRlciQxKQotCi1wcml2YXRlIGFuZHJvaWQudmlldy5WaWV3IGZpbmROZXh0Rm9jdXMoCi1hbmRyb2lkLnZpZXcuVmlld0dyb3VwCi1hbmRyb2lkLnZpZXcuVmlldwotYW5kcm9pZC5ncmFwaGljcy5SZWN0Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC52aWV3LkZvY3VzRmluZGVyIGdldEluc3RhbmNlKCkKLQotcHJpdmF0ZSBib29sZWFuIGlzVG91Y2hDYW5kaWRhdGUoCi1pbnQKLWludAotYW5kcm9pZC5ncmFwaGljcy5SZWN0Ci1pbnQpCi0KLXN0YXRpYyBpbnQgbWFqb3JBeGlzRGlzdGFuY2UoCi1pbnQKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdAotYW5kcm9pZC5ncmFwaGljcy5SZWN0KQotCi1zdGF0aWMgaW50IG1ham9yQXhpc0Rpc3RhbmNlUmF3KAotaW50Ci1hbmRyb2lkLmdyYXBoaWNzLlJlY3QKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdCkKLQotc3RhdGljIGludCBtYWpvckF4aXNEaXN0YW5jZVRvRmFyRWRnZSgKLWludAotYW5kcm9pZC5ncmFwaGljcy5SZWN0Ci1hbmRyb2lkLmdyYXBoaWNzLlJlY3QpCi0KLXN0YXRpYyBpbnQgbWFqb3JBeGlzRGlzdGFuY2VUb0ZhckVkZ2VSYXcoCi1pbnQKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdAotYW5kcm9pZC5ncmFwaGljcy5SZWN0KQotCi1zdGF0aWMgaW50IG1pbm9yQXhpc0Rpc3RhbmNlKAotaW50Ci1hbmRyb2lkLmdyYXBoaWNzLlJlY3QKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdCkKLQotIGJvb2xlYW4gYmVhbUJlYXRzKAotaW50Ci1hbmRyb2lkLmdyYXBoaWNzLlJlY3QKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdAotYW5kcm9pZC5ncmFwaGljcy5SZWN0KQotCi0gYm9vbGVhbiBiZWFtc092ZXJsYXAoCi1pbnQKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdAotYW5kcm9pZC5ncmFwaGljcy5SZWN0KQotCi1wdWJsaWMgYW5kcm9pZC52aWV3LlZpZXcgZmluZE5lYXJlc3RUb3VjaGFibGUoCi1hbmRyb2lkLnZpZXcuVmlld0dyb3VwCi1pbnQKLWludAotaW50Ci1pbnRbXSkKLQotcHVibGljIGZpbmFsIGFuZHJvaWQudmlldy5WaWV3IGZpbmROZXh0Rm9jdXMoCi1hbmRyb2lkLnZpZXcuVmlld0dyb3VwCi1hbmRyb2lkLnZpZXcuVmlldwotaW50KQotCi1wdWJsaWMgYW5kcm9pZC52aWV3LlZpZXcgZmluZE5leHRGb2N1c0Zyb21SZWN0KAotYW5kcm9pZC52aWV3LlZpZXdHcm91cAotYW5kcm9pZC5ncmFwaGljcy5SZWN0Ci1pbnQpCi0KLSBpbnQgZ2V0V2VpZ2h0ZWREaXN0YW5jZUZvcigKLWludAotaW50KQotCi0gYm9vbGVhbiBpc0JldHRlckNhbmRpZGF0ZSgKLWludAotYW5kcm9pZC5ncmFwaGljcy5SZWN0Ci1hbmRyb2lkLmdyYXBoaWNzLlJlY3QKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdCkKLQotIGJvb2xlYW4gaXNDYW5kaWRhdGUoCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3QKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdAotaW50KQotCi0gYm9vbGVhbiBpc1RvRGlyZWN0aW9uT2YoCi1pbnQKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdAotYW5kcm9pZC5ncmFwaGljcy5SZWN0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQudmlldy5Gb2N1c0ZpbmRlckhlbHBlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLnZpZXcuRm9jdXNGaW5kZXIgbUZvY3VzRmluZGVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC52aWV3LkZvY3VzRmluZGVyKQotCi1wdWJsaWMgc3RhdGljIGludCBtYWpvckF4aXNEaXN0YW5jZSgKLWludAotYW5kcm9pZC5ncmFwaGljcy5SZWN0Ci1hbmRyb2lkLmdyYXBoaWNzLlJlY3QpCi0KLXB1YmxpYyBzdGF0aWMgaW50IG1ham9yQXhpc0Rpc3RhbmNlVG9GYXJFZGdlKAotaW50Ci1hbmRyb2lkLmdyYXBoaWNzLlJlY3QKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdCkKLQotcHVibGljIGJvb2xlYW4gYmVhbUJlYXRzKAotaW50Ci1hbmRyb2lkLmdyYXBoaWNzLlJlY3QKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdAotYW5kcm9pZC5ncmFwaGljcy5SZWN0KQotCi1wdWJsaWMgYm9vbGVhbiBiZWFtc092ZXJsYXAoCi1pbnQKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdAotYW5kcm9pZC5ncmFwaGljcy5SZWN0KQotCi1wdWJsaWMgYm9vbGVhbiBpc0JldHRlckNhbmRpZGF0ZSgKLWludAotYW5kcm9pZC5ncmFwaGljcy5SZWN0Ci1hbmRyb2lkLmdyYXBoaWNzLlJlY3QKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdCkKLQotcHVibGljIGJvb2xlYW4gaXNDYW5kaWRhdGUoCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3QKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MiBuYW1lID1HZXN0dXJlSGFuZGxlciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC92aWV3L0dlc3R1cmVEZXRlY3RvcjsgKQotIGNsYXNzIGFuZHJvaWQudmlldy5HZXN0dXJlRGV0ZWN0b3IkR2VzdHVyZUhhbmRsZXIgZXh0ZW5kcyBhbmRyb2lkLm9zLkhhbmRsZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC52aWV3Lkdlc3R1cmVEZXRlY3RvciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLnZpZXcuR2VzdHVyZURldGVjdG9yKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLnZpZXcuR2VzdHVyZURldGVjdG9yCi1hbmRyb2lkLm9zLkhhbmRsZXIpCi0KLXB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9HZXN0dXJlRGV0ZWN0b3I7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1Pbkdlc3R1cmVMaXN0ZW5lciApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQudmlldy5HZXN0dXJlRGV0ZWN0b3IkT25HZXN0dXJlTGlzdGVuZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gb25Eb3duKAotYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50KQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBvbkZsaW5nKAotYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50Ci1hbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgb25Mb25nUHJlc3MoCi1hbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIG9uU2Nyb2xsKAotYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50Ci1hbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgb25TaG93UHJlc3MoCi1hbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIG9uU2luZ2xlVGFwVXAoCi1hbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPVNpbXBsZU9uR2VzdHVyZUxpc3RlbmVyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3ZpZXcvR2VzdHVyZURldGVjdG9yOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC52aWV3Lkdlc3R1cmVEZXRlY3RvciRTaW1wbGVPbkdlc3R1cmVMaXN0ZW5lciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnZpZXcuR2VzdHVyZURldGVjdG9yJE9uR2VzdHVyZUxpc3RlbmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGJvb2xlYW4gb25Eb3duKAotYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50KQotCi1wdWJsaWMgYm9vbGVhbiBvbkZsaW5nKAotYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50Ci1hbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIHZvaWQgb25Mb25nUHJlc3MoCi1hbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQpCi0KLXB1YmxpYyBib29sZWFuIG9uU2Nyb2xsKAotYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50Ci1hbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIHZvaWQgb25TaG93UHJlc3MoCi1hbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQpCi0KLXB1YmxpYyBib29sZWFuIG9uU2luZ2xlVGFwVXAoCi1hbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC92aWV3L0dlc3R1cmVEZXRlY3RvciRHZXN0dXJlSGFuZGxlcjtMYW5kcm9pZC92aWV3L0dlc3R1cmVEZXRlY3RvciRTaW1wbGVPbkdlc3R1cmVMaXN0ZW5lcjtMYW5kcm9pZC92aWV3L0dlc3R1cmVEZXRlY3RvciRPbkdlc3R1cmVMaXN0ZW5lcjsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQudmlldy5HZXN0dXJlRGV0ZWN0b3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMT05HX1BSRVNTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSE9XX1BSRVNTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT1VDSF9TTE9QX1NRVUFSRQotCi1wcml2YXRlIGJvb2xlYW4gbUFsd2F5c0luVGFwUmVnaW9uCi0KLXByaXZhdGUgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50IG1DdXJyZW50RG93bkV2ZW50Ci0KLXByaXZhdGUgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50IG1DdXJyZW50VXBFdmVudAotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQub3MuSGFuZGxlciBtSGFuZGxlcgotCi1wcml2YXRlIGJvb2xlYW4gbUluTG9uZ1ByZXNzCi0KLXByaXZhdGUgYm9vbGVhbiBtSXNMb25ncHJlc3NFbmFibGVkCi0KLXByaXZhdGUgZmxvYXQgbUxhc3RNb3Rpb25YCi0KLXByaXZhdGUgZmxvYXQgbUxhc3RNb3Rpb25ZCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC52aWV3Lkdlc3R1cmVEZXRlY3RvciRPbkdlc3R1cmVMaXN0ZW5lciBtTGlzdGVuZXIKLQotcHJpdmF0ZSBhbmRyb2lkLnZpZXcuVmVsb2NpdHlUcmFja2VyIG1WZWxvY2l0eVRyYWNrZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQudmlldy5HZXN0dXJlRGV0ZWN0b3IkT25HZXN0dXJlTGlzdGVuZXIpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQudmlldy5HZXN0dXJlRGV0ZWN0b3IkT25HZXN0dXJlTGlzdGVuZXIKLWFuZHJvaWQub3MuSGFuZGxlcikKLQotc3RhdGljIGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCBhY2Nlc3MkMDAwKAotYW5kcm9pZC52aWV3Lkdlc3R1cmVEZXRlY3RvcikKLQotc3RhdGljIGFuZHJvaWQudmlldy5HZXN0dXJlRGV0ZWN0b3IkT25HZXN0dXJlTGlzdGVuZXIgYWNjZXNzJDEwMCgKLWFuZHJvaWQudmlldy5HZXN0dXJlRGV0ZWN0b3IpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQyMDAoCi1hbmRyb2lkLnZpZXcuR2VzdHVyZURldGVjdG9yKQotCi1wcml2YXRlIHZvaWQgZGlzcGF0Y2hMb25nUHJlc3MoKQotCi1wcml2YXRlIHZvaWQgaW5pdCgpCi0KLXB1YmxpYyBib29sZWFuIGlzTG9uZ3ByZXNzRW5hYmxlZCgpCi0KLXB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudCgKLWFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCkKLQotcHVibGljIHZvaWQgc2V0SXNMb25ncHJlc3NFbmFibGVkKAotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnZpZXcuR3Jhdml0eSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVhJU19QVUxMX0FGVEVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFYSVNfUFVMTF9CRUZPUkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVhJU19TUEVDSUZJRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVhJU19YX1NISUZUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFYSVNfWV9TSElGVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCT1RUT00KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0VOVEVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENFTlRFUl9IT1JJWk9OVEFMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENFTlRFUl9WRVJUSUNBTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTExfSE9SSVpPTlRBTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxMX1ZFUlRJQ0FMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhPUklaT05UQUxfR1JBVklUWV9NQVNLCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFRlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9fR1JBVklUWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUdIVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUT1AKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkVSVElDQUxfR1JBVklUWV9NQVNLCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyB2b2lkIGFwcGx5KAotaW50Ci1pbnQKLWludAotYW5kcm9pZC5ncmFwaGljcy5SZWN0Ci1pbnQKLWludAotYW5kcm9pZC5ncmFwaGljcy5SZWN0KQotCi1wdWJsaWMgc3RhdGljIHZvaWQgYXBwbHkoCi1pbnQKLWludAotaW50Ci1hbmRyb2lkLmdyYXBoaWNzLlJlY3QKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdCkKLQotcHJpdmF0ZSBzdGF0aWMgaW50IGFwcGx5TW92ZW1lbnQoCi1pbnQKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzSG9yaXpvbnRhbCgKLWludCkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmVydGljYWwoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC92aWV3L0lBcHBsaWNhdGlvblRva2VuJFN0dWI7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC52aWV3LklBcHBsaWNhdGlvblRva2VuIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuSUludGVyZmFjZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgbG9uZyBnZXRLZXlEaXNwYXRjaGluZ1RpbWVvdXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4ga2V5RGlzcGF0Y2hpbmdUaW1lZE91dCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB3aW5kb3dzR29uZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB3aW5kb3dzVmlzaWJsZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1Qcm94eSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC92aWV3L0lBcHBsaWNhdGlvblRva2VuJFN0dWI7ICkKLSBjbGFzcyBhbmRyb2lkLnZpZXcuSUFwcGxpY2F0aW9uVG9rZW4kU3R1YiRQcm94eSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnZpZXcuSUFwcGxpY2F0aW9uVG9rZW4KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLm9zLklCaW5kZXIgbVJlbW90ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuSUJpbmRlcikKLQotcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEludGVyZmFjZURlc2NyaXB0b3IoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGxvbmcgZ2V0S2V5RGlzcGF0Y2hpbmdUaW1lb3V0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIGtleURpc3BhdGNoaW5nVGltZWRPdXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgd2luZG93c0dvbmUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgd2luZG93c1Zpc2libGUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9JQXBwbGljYXRpb25Ub2tlbiRTdHViJFByb3h5OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwMzMgbmFtZSA9U3R1YiApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC92aWV3L0lBcHBsaWNhdGlvblRva2VuOyApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC52aWV3LklBcHBsaWNhdGlvblRva2VuJFN0dWIgZXh0ZW5kcyBhbmRyb2lkLm9zLkJpbmRlciBpbXBsZW1lbnRzIGFuZHJvaWQudmlldy5JQXBwbGljYXRpb25Ub2tlbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFU0NSSVBUT1IKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9nZXRLZXlEaXNwYXRjaGluZ1RpbWVvdXQKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9rZXlEaXNwYXRjaGluZ1RpbWVkT3V0Ci0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fd2luZG93c0dvbmUKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl93aW5kb3dzVmlzaWJsZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC52aWV3LklBcHBsaWNhdGlvblRva2VuIGFzSW50ZXJmYWNlKAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIG9uVHJhbnNhY3QoCi1pbnQKLWFuZHJvaWQub3MuUGFyY2VsCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9UHJveHkgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9JT25LZXlndWFyZEV4aXRSZXN1bHQkU3R1YjsgKQotIGNsYXNzIGFuZHJvaWQudmlldy5JT25LZXlndWFyZEV4aXRSZXN1bHQkU3R1YiRQcm94eSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnZpZXcuSU9uS2V5Z3VhcmRFeGl0UmVzdWx0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5JQmluZGVyIG1SZW1vdGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIG9uS2V5Z3VhcmRFeGl0UmVzdWx0KAotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC92aWV3L0lSb3RhdGlvbldhdGNoZXIkU3R1YjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1Qcm94eSApCi0gY2xhc3MgYW5kcm9pZC52aWV3LklSb3RhdGlvbldhdGNoZXIkU3R1YiRQcm94eSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnZpZXcuSVJvdGF0aW9uV2F0Y2hlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGFuZHJvaWQub3MuSUJpbmRlciBtUmVtb3RlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBvblJvdGF0aW9uQ2hhbmdlZCgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3ZpZXcvSVdpbmRvdyRTdHViOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQudmlldy5JV2luZG93IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuSUludGVyZmFjZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBkaXNwYXRjaEFwcFZpc2liaWxpdHkoCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgZGlzcGF0Y2hHZXROZXdTdXJmYWNlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGRpc3BhdGNoS2V5KAotYW5kcm9pZC52aWV3LktleUV2ZW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgZGlzcGF0Y2hQb2ludGVyKAotYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50Ci1sb25nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgZGlzcGF0Y2hUcmFja2JhbGwoCi1hbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQKLWxvbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBleGVjdXRlQ29tbWFuZCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCByZXNpemVkKAotaW50Ci1pbnQKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB3aW5kb3dGb2N1c0NoYW5nZWQoCi1ib29sZWFuCi1ib29sZWFuKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9UHJveHkgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9JV2luZG93JFN0dWI7ICkKLSBjbGFzcyBhbmRyb2lkLnZpZXcuSVdpbmRvdyRTdHViJFByb3h5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQudmlldy5JV2luZG93Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5JQmluZGVyIG1SZW1vdGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgZGlzcGF0Y2hBcHBWaXNpYmlsaXR5KAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGRpc3BhdGNoR2V0TmV3U3VyZmFjZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBkaXNwYXRjaEtleSgKLWFuZHJvaWQudmlldy5LZXlFdmVudCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGRpc3BhdGNoUG9pbnRlcigKLWFuZHJvaWQudmlldy5Nb3Rpb25FdmVudAotbG9uZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGRpc3BhdGNoVHJhY2tiYWxsKAotYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50Ci1sb25nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgZXhlY3V0ZUNvbW1hbmQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHJlc2l6ZWQoCi1pbnQKLWludAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHdpbmRvd0ZvY3VzQ2hhbmdlZCgKLWJvb2xlYW4KLWJvb2xlYW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMDMzIG5hbWUgPVN0dWIgKQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC92aWV3L0lXaW5kb3ckU3R1YiRQcm94eTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9JV2luZG93OyApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC52aWV3LklXaW5kb3ckU3R1YiBleHRlbmRzIGFuZHJvaWQub3MuQmluZGVyIGltcGxlbWVudHMgYW5kcm9pZC52aWV3LklXaW5kb3cKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERVNDUklQVE9SCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZGlzcGF0Y2hBcHBWaXNpYmlsaXR5Ci0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZGlzcGF0Y2hHZXROZXdTdXJmYWNlCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZGlzcGF0Y2hLZXkKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9kaXNwYXRjaFBvaW50ZXIKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9kaXNwYXRjaFRyYWNrYmFsbAotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2V4ZWN1dGVDb21tYW5kCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fcmVzaXplZAotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3dpbmRvd0ZvY3VzQ2hhbmdlZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC52aWV3LklXaW5kb3cgYXNJbnRlcmZhY2UoCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gb25UcmFuc2FjdCgKLWludAotYW5kcm9pZC5vcy5QYXJjZWwKLWFuZHJvaWQub3MuUGFyY2VsCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC92aWV3L0lXaW5kb3dNYW5hZ2VyJFN0dWI7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC52aWV3LklXaW5kb3dNYW5hZ2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuSUludGVyZmFjZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBhZGRBcHBUb2tlbigKLWludAotYW5kcm9pZC52aWV3LklBcHBsaWNhdGlvblRva2VuCi1pbnQKLWludAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGRpc2FibGVLZXlndWFyZCgKLWFuZHJvaWQub3MuSUJpbmRlcgotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGV4ZWN1dGVBcHBUcmFuc2l0aW9uKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGV4aXRLZXlndWFyZFNlY3VyZWx5KAotYW5kcm9pZC52aWV3LklPbktleWd1YXJkRXhpdFJlc3VsdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBmbG9hdCBnZXRBbmltYXRpb25TY2FsZSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBmbG9hdFtdIGdldEFuaW1hdGlvblNjYWxlcygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldEFwcE9yaWVudGF0aW9uKAotYW5kcm9pZC52aWV3LklBcHBsaWNhdGlvblRva2VuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCBnZXRLZXljb2RlU3RhdGUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldEtleWNvZGVTdGF0ZUZvckRldmljZSgKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCBnZXRSb3RhdGlvbigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldFNjYW5jb2RlU3RhdGUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldFNjYW5jb2RlU3RhdGVGb3JEZXZpY2UoCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0U3dpdGNoU3RhdGUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldFN3aXRjaFN0YXRlRm9yRGV2aWNlKAotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpbktleWd1YXJkUmVzdHJpY3RlZElucHV0TW9kZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpbmplY3RLZXlFdmVudCgKLWFuZHJvaWQudmlldy5LZXlFdmVudAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGluamVjdFBvaW50ZXJFdmVudCgKLWFuZHJvaWQudmlldy5Nb3Rpb25FdmVudAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGluamVjdFRyYWNrYmFsbEV2ZW50KAotYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50Ci1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNWaWV3U2VydmVyUnVubmluZygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBtb3ZlQXBwVG9rZW4oCi1pbnQKLWFuZHJvaWQub3MuSUJpbmRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL29zL0lCaW5kZXI7PjspViApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBtb3ZlQXBwVG9rZW5zVG9Cb3R0b20oCi1qYXZhLnV0aWwuTGlzdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL29zL0lCaW5kZXI7PjspViApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBtb3ZlQXBwVG9rZW5zVG9Ub3AoCi1qYXZhLnV0aWwuTGlzdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLnZpZXcuSVdpbmRvd1Nlc3Npb24gb3BlblNlc3Npb24oCi1hbmRyb2lkLm9zLklCaW5kZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBwYXVzZUtleURpc3BhdGNoaW5nKAotYW5kcm9pZC5vcy5JQmluZGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgcHJlcGFyZUFwcFRyYW5zaXRpb24oCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCByZWVuYWJsZUtleWd1YXJkKAotYW5kcm9pZC5vcy5JQmluZGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgcmVtb3ZlQXBwVG9rZW4oCi1hbmRyb2lkLm9zLklCaW5kZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCByZXN1bWVLZXlEaXNwYXRjaGluZygKLWFuZHJvaWQub3MuSUJpbmRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEFuaW1hdGlvblNjYWxlKAotaW50Ci1mbG9hdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEFuaW1hdGlvblNjYWxlcygKLWZsb2F0W10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRBcHBHcm91cElkKAotYW5kcm9pZC5vcy5JQmluZGVyCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRBcHBPcmllbnRhdGlvbigKLWFuZHJvaWQudmlldy5JQXBwbGljYXRpb25Ub2tlbgotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0QXBwU3RhcnRpbmdXaW5kb3coCi1hbmRyb2lkLm9zLklCaW5kZXIKLWphdmEubGFuZy5TdHJpbmcKLWludAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotaW50Ci1pbnQKLWFuZHJvaWQub3MuSUJpbmRlcgotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEFwcFZpc2liaWxpdHkoCi1hbmRyb2lkLm9zLklCaW5kZXIKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRBcHBXaWxsQmVIaWRkZW4oCi1hbmRyb2lkLm9zLklCaW5kZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRFdmVudERpc3BhdGNoaW5nKAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEZvY3VzZWRBcHAoCi1hbmRyb2lkLm9zLklCaW5kZXIKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRJblRvdWNoTW9kZSgKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRSb3RhdGlvbigKLWludAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHN0YXJ0QXBwRnJlZXppbmdTY3JlZW4oCi1hbmRyb2lkLm9zLklCaW5kZXIKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHN0YXJ0Vmlld1NlcnZlcigKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHN0b3BBcHBGcmVlemluZ1NjcmVlbigKLWFuZHJvaWQub3MuSUJpbmRlcgotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHN0b3BWaWV3U2VydmVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb24gdXBkYXRlT3JpZW50YXRpb25Gcm9tQXBwVG9rZW5zKAotYW5kcm9pZC5vcy5JQmluZGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCB3YXRjaFJvdGF0aW9uKAotYW5kcm9pZC52aWV3LklSb3RhdGlvbldhdGNoZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1Qcm94eSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC92aWV3L0lXaW5kb3dNYW5hZ2VyJFN0dWI7ICkKLSBjbGFzcyBhbmRyb2lkLnZpZXcuSVdpbmRvd01hbmFnZXIkU3R1YiRQcm94eSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnZpZXcuSVdpbmRvd01hbmFnZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLm9zLklCaW5kZXIgbVJlbW90ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuSUJpbmRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGFkZEFwcFRva2VuKAotaW50Ci1hbmRyb2lkLnZpZXcuSUFwcGxpY2F0aW9uVG9rZW4KLWludAotaW50Ci1ib29sZWFuKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGRpc2FibGVLZXlndWFyZCgKLWFuZHJvaWQub3MuSUJpbmRlcgotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGV4ZWN1dGVBcHBUcmFuc2l0aW9uKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGV4aXRLZXlndWFyZFNlY3VyZWx5KAotYW5kcm9pZC52aWV3LklPbktleWd1YXJkRXhpdFJlc3VsdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBmbG9hdCBnZXRBbmltYXRpb25TY2FsZSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBmbG9hdFtdIGdldEFuaW1hdGlvblNjYWxlcygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGdldEFwcE9yaWVudGF0aW9uKAotYW5kcm9pZC52aWV3LklBcHBsaWNhdGlvblRva2VuKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgZ2V0S2V5Y29kZVN0YXRlKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXRLZXljb2RlU3RhdGVGb3JEZXZpY2UoCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgZ2V0Um90YXRpb24oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXRTY2FuY29kZVN0YXRlKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXRTY2FuY29kZVN0YXRlRm9yRGV2aWNlKAotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGdldFN3aXRjaFN0YXRlKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXRTd2l0Y2hTdGF0ZUZvckRldmljZSgKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gaW5LZXlndWFyZFJlc3RyaWN0ZWRJbnB1dE1vZGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gaW5qZWN0S2V5RXZlbnQoCi1hbmRyb2lkLnZpZXcuS2V5RXZlbnQKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBpbmplY3RQb2ludGVyRXZlbnQoCi1hbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBpbmplY3RUcmFja2JhbGxFdmVudCgKLWFuZHJvaWQudmlldy5Nb3Rpb25FdmVudAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIGlzVmlld1NlcnZlclJ1bm5pbmcoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgbW92ZUFwcFRva2VuKAotaW50Ci1hbmRyb2lkLm9zLklCaW5kZXIpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9vcy9JQmluZGVyOz47KVYgKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgbW92ZUFwcFRva2Vuc1RvQm90dG9tKAotamF2YS51dGlsLkxpc3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9vcy9JQmluZGVyOz47KVYgKQotcHVibGljIHZvaWQgbW92ZUFwcFRva2Vuc1RvVG9wKAotamF2YS51dGlsLkxpc3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYW5kcm9pZC52aWV3LklXaW5kb3dTZXNzaW9uIG9wZW5TZXNzaW9uKAotYW5kcm9pZC5vcy5JQmluZGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcGF1c2VLZXlEaXNwYXRjaGluZygKLWFuZHJvaWQub3MuSUJpbmRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHByZXBhcmVBcHBUcmFuc2l0aW9uKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcmVlbmFibGVLZXlndWFyZCgKLWFuZHJvaWQub3MuSUJpbmRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHJlbW92ZUFwcFRva2VuKAotYW5kcm9pZC5vcy5JQmluZGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcmVzdW1lS2V5RGlzcGF0Y2hpbmcoCi1hbmRyb2lkLm9zLklCaW5kZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRBbmltYXRpb25TY2FsZSgKLWludAotZmxvYXQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRBbmltYXRpb25TY2FsZXMoCi1mbG9hdFtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0QXBwR3JvdXBJZCgKLWFuZHJvaWQub3MuSUJpbmRlcgotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0QXBwT3JpZW50YXRpb24oCi1hbmRyb2lkLnZpZXcuSUFwcGxpY2F0aW9uVG9rZW4KLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldEFwcFN0YXJ0aW5nV2luZG93KAotYW5kcm9pZC5vcy5JQmluZGVyCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWludAotaW50Ci1hbmRyb2lkLm9zLklCaW5kZXIKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRBcHBWaXNpYmlsaXR5KAotYW5kcm9pZC5vcy5JQmluZGVyCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0QXBwV2lsbEJlSGlkZGVuKAotYW5kcm9pZC5vcy5JQmluZGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0RXZlbnREaXNwYXRjaGluZygKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRGb2N1c2VkQXBwKAotYW5kcm9pZC5vcy5JQmluZGVyCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0SW5Ub3VjaE1vZGUoCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0Um90YXRpb24oCi1pbnQKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzdGFydEFwcEZyZWV6aW5nU2NyZWVuKAotYW5kcm9pZC5vcy5JQmluZGVyCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBzdGFydFZpZXdTZXJ2ZXIoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzdG9wQXBwRnJlZXppbmdTY3JlZW4oCi1hbmRyb2lkLm9zLklCaW5kZXIKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBzdG9wVmlld1NlcnZlcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uIHVwZGF0ZU9yaWVudGF0aW9uRnJvbUFwcFRva2VucygKLWFuZHJvaWQub3MuSUJpbmRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgd2F0Y2hSb3RhdGlvbigKLWFuZHJvaWQudmlldy5JUm90YXRpb25XYXRjaGVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9JV2luZG93TWFuYWdlciRTdHViJFByb3h5OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC92aWV3L0lXaW5kb3dNYW5hZ2VyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwMzMgbmFtZSA9U3R1YiApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC52aWV3LklXaW5kb3dNYW5hZ2VyJFN0dWIgZXh0ZW5kcyBhbmRyb2lkLm9zLkJpbmRlciBpbXBsZW1lbnRzIGFuZHJvaWQudmlldy5JV2luZG93TWFuYWdlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFU0NSSVBUT1IKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9hZGRBcHBUb2tlbgotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2Rpc2FibGVLZXlndWFyZAotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2V4ZWN1dGVBcHBUcmFuc2l0aW9uCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZXhpdEtleWd1YXJkU2VjdXJlbHkKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9nZXRBbmltYXRpb25TY2FsZQotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2dldEFuaW1hdGlvblNjYWxlcwotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2dldEFwcE9yaWVudGF0aW9uCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZ2V0S2V5Y29kZVN0YXRlCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZ2V0S2V5Y29kZVN0YXRlRm9yRGV2aWNlCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZ2V0Um90YXRpb24KLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9nZXRTY2FuY29kZVN0YXRlCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZ2V0U2NhbmNvZGVTdGF0ZUZvckRldmljZQotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2dldFN3aXRjaFN0YXRlCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZ2V0U3dpdGNoU3RhdGVGb3JEZXZpY2UKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9pbktleWd1YXJkUmVzdHJpY3RlZElucHV0TW9kZQotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2luamVjdEtleUV2ZW50Ci0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05faW5qZWN0UG9pbnRlckV2ZW50Ci0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05faW5qZWN0VHJhY2tiYWxsRXZlbnQKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9pc1ZpZXdTZXJ2ZXJSdW5uaW5nCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fbW92ZUFwcFRva2VuCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fbW92ZUFwcFRva2Vuc1RvQm90dG9tCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fbW92ZUFwcFRva2Vuc1RvVG9wCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fb3BlblNlc3Npb24KLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9wYXVzZUtleURpc3BhdGNoaW5nCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fcHJlcGFyZUFwcFRyYW5zaXRpb24KLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9yZWVuYWJsZUtleWd1YXJkCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fcmVtb3ZlQXBwVG9rZW4KLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9yZXN1bWVLZXlEaXNwYXRjaGluZwotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3NldEFuaW1hdGlvblNjYWxlCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fc2V0QW5pbWF0aW9uU2NhbGVzCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fc2V0QXBwR3JvdXBJZAotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3NldEFwcE9yaWVudGF0aW9uCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fc2V0QXBwU3RhcnRpbmdXaW5kb3cKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9zZXRBcHBWaXNpYmlsaXR5Ci0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fc2V0QXBwV2lsbEJlSGlkZGVuCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fc2V0RXZlbnREaXNwYXRjaGluZwotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3NldEZvY3VzZWRBcHAKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9zZXRJblRvdWNoTW9kZQotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3NldFJvdGF0aW9uCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fc3RhcnRBcHBGcmVlemluZ1NjcmVlbgotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3N0YXJ0Vmlld1NlcnZlcgotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3N0b3BBcHBGcmVlemluZ1NjcmVlbgotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3N0b3BWaWV3U2VydmVyCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fdXBkYXRlT3JpZW50YXRpb25Gcm9tQXBwVG9rZW5zCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fd2F0Y2hSb3RhdGlvbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC52aWV3LklXaW5kb3dNYW5hZ2VyIGFzSW50ZXJmYWNlKAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIG9uVHJhbnNhY3QoCi1pbnQKLWFuZHJvaWQub3MuUGFyY2VsCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9JV2luZG93U2Vzc2lvbiRTdHViOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQudmlldy5JV2luZG93U2Vzc2lvbiBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLklJbnRlcmZhY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCBhZGQoCi1hbmRyb2lkLnZpZXcuSVdpbmRvdwotYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIkTGF5b3V0UGFyYW1zCi1pbnQKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGZpbmlzaERyYXdpbmcoCi1hbmRyb2lkLnZpZXcuSVdpbmRvdykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGZpbmlzaEtleSgKLWFuZHJvaWQudmlldy5JV2luZG93KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZ2V0SW5Ub3VjaE1vZGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCBnZXRQZW5kaW5nUG9pbnRlck1vdmUoCi1hbmRyb2lkLnZpZXcuSVdpbmRvdykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQgZ2V0UGVuZGluZ1RyYWNrYmFsbE1vdmUoCi1hbmRyb2lkLnZpZXcuSVdpbmRvdykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgcmVsYXlvdXQoCi1hbmRyb2lkLnZpZXcuSVdpbmRvdwotYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIkTGF5b3V0UGFyYW1zCi1pbnQKLWludAotaW50Ci1hbmRyb2lkLmdyYXBoaWNzLlJlY3QKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdAotYW5kcm9pZC52aWV3LlN1cmZhY2UpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCByZW1vdmUoCi1hbmRyb2lkLnZpZXcuSVdpbmRvdykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEluVG91Y2hNb2RlKAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFRyYW5zcGFyZW50UmVnaW9uKAotYW5kcm9pZC52aWV3LklXaW5kb3cKLWFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9UHJveHkgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9JV2luZG93U2Vzc2lvbiRTdHViOyApCi0gY2xhc3MgYW5kcm9pZC52aWV3LklXaW5kb3dTZXNzaW9uJFN0dWIkUHJveHkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC52aWV3LklXaW5kb3dTZXNzaW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5JQmluZGVyIG1SZW1vdGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLklCaW5kZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGFkZCgKLWFuZHJvaWQudmlldy5JV2luZG93Ci1hbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlciRMYXlvdXRQYXJhbXMKLWludAotYW5kcm9pZC5ncmFwaGljcy5SZWN0KQotCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGZpbmlzaERyYXdpbmcoCi1hbmRyb2lkLnZpZXcuSVdpbmRvdykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGZpbmlzaEtleSgKLWFuZHJvaWQudmlldy5JV2luZG93KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gZ2V0SW5Ub3VjaE1vZGUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQgZ2V0UGVuZGluZ1BvaW50ZXJNb3ZlKAotYW5kcm9pZC52aWV3LklXaW5kb3cpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50IGdldFBlbmRpbmdUcmFja2JhbGxNb3ZlKAotYW5kcm9pZC52aWV3LklXaW5kb3cpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlbGF5b3V0KAotYW5kcm9pZC52aWV3LklXaW5kb3cKLWFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyJExheW91dFBhcmFtcwotaW50Ci1pbnQKLWludAotYW5kcm9pZC5ncmFwaGljcy5SZWN0Ci1hbmRyb2lkLmdyYXBoaWNzLlJlY3QKLWFuZHJvaWQudmlldy5TdXJmYWNlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcmVtb3ZlKAotYW5kcm9pZC52aWV3LklXaW5kb3cpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRJblRvdWNoTW9kZSgKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRUcmFuc3BhcmVudFJlZ2lvbigKLWFuZHJvaWQudmlldy5JV2luZG93Ci1hbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwMzMgbmFtZSA9U3R1YiApCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3ZpZXcvSVdpbmRvd1Nlc3Npb24kU3R1YiRQcm94eTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9JV2luZG93U2Vzc2lvbjsgKQotcHVibGljIGFic3RyYWN0IGNsYXNzIGFuZHJvaWQudmlldy5JV2luZG93U2Vzc2lvbiRTdHViIGV4dGVuZHMgYW5kcm9pZC5vcy5CaW5kZXIgaW1wbGVtZW50cyBhbmRyb2lkLnZpZXcuSVdpbmRvd1Nlc3Npb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERVNDUklQVE9SCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fYWRkCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZmluaXNoRHJhd2luZwotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2ZpbmlzaEtleQotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2dldEluVG91Y2hNb2RlCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZ2V0UGVuZGluZ1BvaW50ZXJNb3ZlCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZ2V0UGVuZGluZ1RyYWNrYmFsbE1vdmUKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9yZWxheW91dAotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3JlbW92ZQotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3NldEluVG91Y2hNb2RlCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fc2V0VHJhbnNwYXJlbnRSZWdpb24KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQudmlldy5JV2luZG93U2Vzc2lvbiBhc0ludGVyZmFjZSgKLWFuZHJvaWQub3MuSUJpbmRlcikKLQotcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBvblRyYW5zYWN0KAotaW50Ci1hbmRyb2lkLm9zLlBhcmNlbAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnZpZXcuSW5mbGF0ZUV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlRocm93YWJsZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlRocm93YWJsZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC92aWV3L0tleUNoYXJhY3Rlck1hcDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPUtleURhdGEgKQotcHVibGljIGNsYXNzIGFuZHJvaWQudmlldy5LZXlDaGFyYWN0ZXJNYXAkS2V5RGF0YSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVUQV9MRU5HVEgKLQotcHVibGljIGNoYXIgZGlzcGxheUxhYmVsCi0KLXB1YmxpYyBjaGFyW10gbWV0YQotCi1wdWJsaWMgY2hhciBudW1iZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9LZXlDaGFyYWN0ZXJNYXAkS2V5RGF0YTsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQudmlldy5LZXlDaGFyYWN0ZXJNYXAgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBQ1VURQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTFBIQQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVUlMVF9JTl9LRVlCT0FSRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0lSQ1VNRkxFWAotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLnV0aWwuU3BhcnNlSW50QXJyYXkgQ09NQklOSU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTUJJTklOR19BQ0NFTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NQklOSU5HX0FDQ0VOVF9NQVNLCi0KLXByaXZhdGUgc3RhdGljIGFuZHJvaWQudXRpbC5TcGFyc2VJbnRBcnJheSBERUFECi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHUkFWRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgSEVYX0lOUFVUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5VTUVSSUMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFBJQ0tFUl9ESUFMT0dfSU5QVVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJFRElDVElWRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVElMREUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVNTEFVVAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxhbmRyb2lkL3V0aWwvU3BhcnNlQXJyYXk8TGphdmEvbGFuZy9yZWYvV2Vha1JlZmVyZW5jZTxMYW5kcm9pZC92aWV3L0tleUNoYXJhY3Rlck1hcDs+Oz47ICkKLXByaXZhdGUgc3RhdGljIGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheSBzSW5zdGFuY2VzCi0KLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5PYmplY3Qgc0xvY2sKLQotcHJpdmF0ZSBpbnQgbUtleWJvYXJkRGV2aWNlCi0KLXByaXZhdGUgaW50IG1Qb2ludGVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IGN0b3JfbmF0aXZlKAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBkdG9yX25hdGl2ZSgKLWludCkKLQotcHVibGljIHN0YXRpYyBpbnQgZ2V0RGVhZENoYXIoCi1pbnQKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGNoYXIgZ2V0RGlzcGxheUxhYmVsX25hdGl2ZSgKLWludAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgbG9uZ1tdIGdldEV2ZW50c19uYXRpdmUoCi1pbnQKLWNoYXJbXSkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gZ2V0S2V5RGF0YV9uYXRpdmUoCi1pbnQKLWludAotYW5kcm9pZC52aWV3LktleUNoYXJhY3Rlck1hcCRLZXlEYXRhKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IGdldEtleWJvYXJkVHlwZV9uYXRpdmUoCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBjaGFyIGdldE1hdGNoX25hdGl2ZSgKLWludAotaW50Ci1jaGFyW10KLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGNoYXIgZ2V0TnVtYmVyX25hdGl2ZSgKLWludAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgY2hhciBnZXRfbmF0aXZlKAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLnZpZXcuS2V5Q2hhcmFjdGVyTWFwIGxvYWQoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9UaHJvd2FibGU7ICkKLXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkKLQotcHVibGljIGludCBnZXQoCi1pbnQKLWludCkKLQotcHVibGljIGNoYXIgZ2V0RGlzcGxheUxhYmVsKAotaW50KQotCi1wdWJsaWMgYW5kcm9pZC52aWV3LktleUV2ZW50W10gZ2V0RXZlbnRzKAotY2hhcltdKQotCi1wdWJsaWMgYm9vbGVhbiBnZXRLZXlEYXRhKAotaW50Ci1hbmRyb2lkLnZpZXcuS2V5Q2hhcmFjdGVyTWFwJEtleURhdGEpCi0KLXB1YmxpYyBpbnQgZ2V0S2V5Ym9hcmRUeXBlKCkKLQotcHVibGljIGNoYXIgZ2V0TWF0Y2goCi1pbnQKLWNoYXJbXSkKLQotcHVibGljIGNoYXIgZ2V0TWF0Y2goCi1pbnQKLWNoYXJbXQotaW50KQotCi1wdWJsaWMgY2hhciBnZXROdW1iZXIoCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIGlzUHJpbnRpbmdLZXkoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC92aWV3L0tleUV2ZW50Oz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3ZpZXcvS2V5RXZlbnQ7ICkKLWZpbmFsIGNsYXNzIGFuZHJvaWQudmlldy5LZXlFdmVudCQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGFuZHJvaWQudmlldy5LZXlFdmVudCBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIGFuZHJvaWQudmlldy5LZXlFdmVudFtdIG5ld0FycmF5KAotaW50KQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdFtdIG5ld0FycmF5KAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9LZXlFdmVudCRDYWxsYmFjazsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQudmlldy5LZXlFdmVudCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX0RPV04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX01VTFRJUExFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDVElPTl9VUAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC92aWV3L0tleUV2ZW50Oz47ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IgQ1JFQVRPUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1dPS0VfSEVSRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFXzAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV8xCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfMgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFXzMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV80Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfNQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFXzYKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV83Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfOAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFXzkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9BCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfQUxUX0xFRlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9BTFRfUklHSFQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9BUE9TVFJPUEhFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfQVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9CCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfQkFDSwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFX0JBQ0tTTEFTSAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFX0MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9DQUxMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfQ0FNRVJBCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfQ0xFQVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9DT01NQQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFX0QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9ERUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9EUEFEX0NFTlRFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFX0RQQURfRE9XTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFX0RQQURfTEVGVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFX0RQQURfUklHSFQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9EUEFEX1VQCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFX0VORENBTEwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9FTlRFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFX0VOVkVMT1BFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfRVFVQUxTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfRVhQTE9SRVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9GCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfRk9DVVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfR1JBVkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9ICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfSEVBRFNFVEhPT0sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9IT01FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfSQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFX0oKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9LCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFX0xFRlRfQlJBQ0tFVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFX00KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9NRU5VCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfTUlOVVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfTk9USUZJQ0FUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfTlVNCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfTwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFX1AKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9QRVJJT0QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9QTFVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfUE9VTkQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9QT1dFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFX1EKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9SCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfUklHSFRfQlJBQ0tFVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFX1MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9TRUFSQ0gKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9TRU1JQ09MT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9TSElGVF9MRUZUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfU0hJRlRfUklHSFQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9TTEFTSAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFX1NPRlRfTEVGVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFX1NPRlRfUklHSFQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9TUEFDRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFX1NUQVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9TWU0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfVEFCCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfVQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFX1VOS05PV04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9WCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfVk9MVU1FX0RPV04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9WT0xVTUVfVVAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9XCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfWAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFX1kKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9aCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9LRVlDT0RFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FVEFfQUxUX0xFRlRfT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVUQV9BTFRfT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVUQV9BTFRfUklHSFRfT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVUQV9TSElGVF9MRUZUX09OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FVEFfU0hJRlRfT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVUQV9TSElGVF9SSUdIVF9PTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVRBX1NZTV9PTgotCi1wcml2YXRlIGludCBtQWN0aW9uCi0KLXByaXZhdGUgaW50IG1EZXZpY2VJZAotCi1wcml2YXRlIGxvbmcgbURvd25UaW1lCi0KLXByaXZhdGUgbG9uZyBtRXZlbnRUaW1lCi0KLXByaXZhdGUgaW50IG1GbGFncwotCi1wcml2YXRlIGludCBtS2V5Q29kZQotCi1wcml2YXRlIGludCBtTWV0YVN0YXRlCi0KLXByaXZhdGUgaW50IG1SZXBlYXRDb3VudAotCi1wcml2YXRlIGludCBtU2NhbmNvZGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1sb25nCi1sb25nCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1sb25nCi1sb25nCi1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWxvbmcKLWxvbmcKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWxvbmcKLWxvbmcKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuUGFyY2VsKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLlBhcmNlbAotYW5kcm9pZC52aWV3LktleUV2ZW50JDEpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQudmlldy5LZXlFdmVudAotbG9uZwotaW50KQotCi1wdWJsaWMgc3RhdGljIGludCBnZXREZWFkQ2hhcigKLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNNb2RpZmllcktleSgKLWludCkKLQotcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gZGlzcGF0Y2goCi1hbmRyb2lkLnZpZXcuS2V5RXZlbnQkQ2FsbGJhY2spCi0KLXB1YmxpYyBmaW5hbCBpbnQgZ2V0QWN0aW9uKCkKLQotcHVibGljIGZpbmFsIGludCBnZXREZXZpY2VJZCgpCi0KLXB1YmxpYyBjaGFyIGdldERpc3BsYXlMYWJlbCgpCi0KLXB1YmxpYyBmaW5hbCBsb25nIGdldERvd25UaW1lKCkKLQotcHVibGljIGZpbmFsIGxvbmcgZ2V0RXZlbnRUaW1lKCkKLQotcHVibGljIGZpbmFsIGludCBnZXRGbGFncygpCi0KLXB1YmxpYyBmaW5hbCBpbnQgZ2V0S2V5Q29kZSgpCi0KLXB1YmxpYyBib29sZWFuIGdldEtleURhdGEoCi1hbmRyb2lkLnZpZXcuS2V5Q2hhcmFjdGVyTWFwJEtleURhdGEpCi0KLXB1YmxpYyBmaW5hbCBpbnQgZ2V0S2V5Ym9hcmREZXZpY2UoKQotCi1wdWJsaWMgY2hhciBnZXRNYXRjaCgKLWNoYXJbXSkKLQotcHVibGljIGNoYXIgZ2V0TWF0Y2goCi1jaGFyW10KLWludCkKLQotcHVibGljIGZpbmFsIGludCBnZXRNZXRhU3RhdGUoKQotCi1wdWJsaWMgY2hhciBnZXROdW1iZXIoKQotCi1wdWJsaWMgZmluYWwgaW50IGdldFJlcGVhdENvdW50KCkKLQotcHVibGljIGZpbmFsIGludCBnZXRTY2FuQ29kZSgpCi0KLXB1YmxpYyBpbnQgZ2V0VW5pY29kZUNoYXIoKQotCi1wdWJsaWMgaW50IGdldFVuaWNvZGVDaGFyKAotaW50KQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBpc0FsdFByZXNzZWQoKQotQGphdmEubGFuZy5EZXByZWNhdGVkCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBpc0Rvd24oKQotCi1wdWJsaWMgYm9vbGVhbiBpc1ByaW50aW5nS2V5KCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gaXNTaGlmdFByZXNzZWQoKQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBpc1N5bVByZXNzZWQoKQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBpc1N5c3RlbSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1GYWN0b3J5TWVyZ2VyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3ZpZXcvTGF5b3V0SW5mbGF0ZXI7ICkKLSBjbGFzcyBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXIkRmFjdG9yeU1lcmdlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXIkRmFjdG9yeQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlciRGYWN0b3J5IG1GMQotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlciRGYWN0b3J5IG1GMgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlciRGYWN0b3J5Ci1hbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXIkRmFjdG9yeSkKLQotcHVibGljIGFuZHJvaWQudmlldy5WaWV3IG9uQ3JlYXRlVmlldygKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3ZpZXcvTGF5b3V0SW5mbGF0ZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1GaWx0ZXIgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXIkRmlsdGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIG9uTG9hZENsYXNzKAotamF2YS5sYW5nLkNsYXNzKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9MYXlvdXRJbmZsYXRlciRGYWN0b3J5TWVyZ2VyO0xhbmRyb2lkL3ZpZXcvTGF5b3V0SW5mbGF0ZXIkRmFjdG9yeTtMYW5kcm9pZC92aWV3L0xheW91dEluZmxhdGVyJEZpbHRlcjsgKQotcHVibGljIGFic3RyYWN0IGNsYXNzIGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUdfSU5DTFVERQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRBR19NRVJHRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRBR19SRVFVRVNUX0ZPQ1VTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DbGFzc1tdIG1Db25zdHJ1Y3RvclNpZ25hdHVyZQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaE1hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL3JlZmxlY3QvQ29uc3RydWN0b3I7PjsgKQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS51dGlsLkhhc2hNYXAgc0NvbnN0cnVjdG9yTWFwCi0KLXByaXZhdGUgZmluYWwgYm9vbGVhbiBERUJVRwotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5PYmplY3RbXSBtQ29uc3RydWN0b3JBcmdzCi0KLXByb3RlY3RlZCBmaW5hbCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBtQ29udGV4dAotCi1wcml2YXRlIGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlciRGYWN0b3J5IG1GYWN0b3J5Ci0KLXByaXZhdGUgYm9vbGVhbiBtRmFjdG9yeVNldAotCi1wcml2YXRlIGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlciRGaWx0ZXIgbUZpbHRlcgotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaE1hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL0Jvb2xlYW47PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuSGFzaE1hcCBtRmlsdGVyTWFwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotcHJpdmF0ZSB2b2lkIGZhaWxOb3RBbGxvd2VkKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXIgZnJvbSgKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgcGFyc2VJbmNsdWRlKAotb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcgotYW5kcm9pZC52aWV3LlZpZXcKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCBwYXJzZVJlcXVlc3RGb2N1cygKLW9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXIKLWFuZHJvaWQudmlldy5WaWV3KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgckluZmxhdGUoCi1vcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyCi1hbmRyb2lkLnZpZXcuVmlldwotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlciBjbG9uZUluQ29udGV4dCgKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjtMYW5kcm9pZC92aWV3L0luZmxhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBhbmRyb2lkLnZpZXcuVmlldyBjcmVhdGVWaWV3KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotIGFuZHJvaWQudmlldy5WaWV3IGNyZWF0ZVZpZXdGcm9tVGFnKAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5Db250ZXh0IGdldENvbnRleHQoKQotCi1wdWJsaWMgZmluYWwgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyJEZhY3RvcnkgZ2V0RmFjdG9yeSgpCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXIkRmlsdGVyIGdldEZpbHRlcigpCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuVmlldyBpbmZsYXRlKAotaW50Ci1hbmRyb2lkLnZpZXcuVmlld0dyb3VwKQotCi1wdWJsaWMgYW5kcm9pZC52aWV3LlZpZXcgaW5mbGF0ZSgKLWludAotYW5kcm9pZC52aWV3LlZpZXdHcm91cAotYm9vbGVhbikKLQotcHVibGljIGFuZHJvaWQudmlldy5WaWV3IGluZmxhdGUoCi1vcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyCi1hbmRyb2lkLnZpZXcuVmlld0dyb3VwKQotCi1wdWJsaWMgYW5kcm9pZC52aWV3LlZpZXcgaW5mbGF0ZSgKLW9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXIKLWFuZHJvaWQudmlldy5WaWV3R3JvdXAKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgYW5kcm9pZC52aWV3LlZpZXcgb25DcmVhdGVWaWV3KAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHVibGljIHZvaWQgc2V0RmFjdG9yeSgKLWFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlciRGYWN0b3J5KQotCi1wdWJsaWMgdm9pZCBzZXRGaWx0ZXIoCi1hbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXIkRmlsdGVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3ZpZXcvTWVudUluZmxhdGVyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTIgbmFtZSA9TWVudVN0YXRlICkKLSBjbGFzcyBhbmRyb2lkLnZpZXcuTWVudUluZmxhdGVyJE1lbnVTdGF0ZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGRlZmF1bHRHcm91cElkCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBkZWZhdWx0SXRlbUNhdGVnb3J5Ci0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBkZWZhdWx0SXRlbUNoZWNrYWJsZQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlZmF1bHRJdGVtQ2hlY2tlZAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlZmF1bHRJdGVtRW5hYmxlZAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgZGVmYXVsdEl0ZW1JZAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgZGVmYXVsdEl0ZW1PcmRlcgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlZmF1bHRJdGVtVmlzaWJsZQotCi1wcml2YXRlIGludCBncm91cENhdGVnb3J5Ci0KLXByaXZhdGUgaW50IGdyb3VwQ2hlY2thYmxlCi0KLXByaXZhdGUgYm9vbGVhbiBncm91cEVuYWJsZWQKLQotcHJpdmF0ZSBpbnQgZ3JvdXBJZAotCi1wcml2YXRlIGludCBncm91cE9yZGVyCi0KLXByaXZhdGUgYm9vbGVhbiBncm91cFZpc2libGUKLQotcHJpdmF0ZSBib29sZWFuIGl0ZW1BZGRlZAotCi1wcml2YXRlIGNoYXIgaXRlbUFscGhhYmV0aWNTaG9ydGN1dAotCi1wcml2YXRlIGludCBpdGVtQ2F0ZWdvcnlPcmRlcgotCi1wcml2YXRlIGludCBpdGVtQ2hlY2thYmxlCi0KLXByaXZhdGUgYm9vbGVhbiBpdGVtQ2hlY2tlZAotCi1wcml2YXRlIGJvb2xlYW4gaXRlbUVuYWJsZWQKLQotcHJpdmF0ZSBpbnQgaXRlbUljb25SZXNJZAotCi1wcml2YXRlIGludCBpdGVtSWQKLQotcHJpdmF0ZSBjaGFyIGl0ZW1OdW1lcmljU2hvcnRjdXQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGl0ZW1UaXRsZQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgaXRlbVRpdGxlQ29uZGVuc2VkCi0KLXByaXZhdGUgYm9vbGVhbiBpdGVtVmlzaWJsZQotCi1wcml2YXRlIGFuZHJvaWQudmlldy5NZW51IG1lbnUKLQotZmluYWwgYW5kcm9pZC52aWV3Lk1lbnVJbmZsYXRlciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLnZpZXcuTWVudUluZmxhdGVyCi1hbmRyb2lkLnZpZXcuTWVudSkKLQotcHJpdmF0ZSBjaGFyIGdldFNob3J0Y3V0KAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSB2b2lkIHNldEl0ZW0oCi1hbmRyb2lkLnZpZXcuTWVudUl0ZW0pCi0KLXB1YmxpYyB2b2lkIGFkZEl0ZW0oKQotCi1wdWJsaWMgYW5kcm9pZC52aWV3LlN1Yk1lbnUgYWRkU3ViTWVudUl0ZW0oKQotCi1wdWJsaWMgYm9vbGVhbiBoYXNBZGRlZEl0ZW0oKQotCi1wdWJsaWMgdm9pZCByZWFkR3JvdXAoCi1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0KQotCi1wdWJsaWMgdm9pZCByZWFkSXRlbSgKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi0KLXB1YmxpYyB2b2lkIHJlc2V0R3JvdXAoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9NZW51SW5mbGF0ZXIkTWVudVN0YXRlOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC52aWV3Lk1lbnVJbmZsYXRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PX0lECi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgWE1MX0dST1VQCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgWE1MX0lURU0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBYTUxfTUVOVQotCi1wcml2YXRlIGFuZHJvaWQuY29udGVudC5Db250ZXh0IG1Db250ZXh0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBhY2Nlc3MkMDAwKAotYW5kcm9pZC52aWV3Lk1lbnVJbmZsYXRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHBhcnNlTWVudSgKLW9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXIKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQKLWFuZHJvaWQudmlldy5NZW51KQotCi1wdWJsaWMgdm9pZCBpbmZsYXRlKAotaW50Ci1hbmRyb2lkLnZpZXcuTWVudSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9T25NZW51SXRlbUNsaWNrTGlzdGVuZXIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9NZW51SXRlbTsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLnZpZXcuTWVudUl0ZW0kT25NZW51SXRlbUNsaWNrTGlzdGVuZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gb25NZW51SXRlbUNsaWNrKAotYW5kcm9pZC52aWV3Lk1lbnVJdGVtKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9NZW51SXRlbSRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcjsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLnZpZXcuTWVudUl0ZW0gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IGNoYXIgZ2V0QWxwaGFiZXRpY1Nob3J0Y3V0KCkKLQotcHVibGljIGFic3RyYWN0IGludCBnZXRHcm91cElkKCkKLQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgZ2V0SWNvbigpCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50IGdldEludGVudCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0SXRlbUlkKCkKLQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudSRDb250ZXh0TWVudUluZm8gZ2V0TWVudUluZm8oKQotCi1wdWJsaWMgYWJzdHJhY3QgY2hhciBnZXROdW1lcmljU2hvcnRjdXQoKQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldE9yZGVyKCkKLQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQudmlldy5TdWJNZW51IGdldFN1Yk1lbnUoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBnZXRUaXRsZSgpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIGdldFRpdGxlQ29uZGVuc2VkKCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaGFzU3ViTWVudSgpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzQ2hlY2thYmxlKCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNDaGVja2VkKCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNFbmFibGVkKCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNWaXNpYmxlKCkKLQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQudmlldy5NZW51SXRlbSBzZXRBbHBoYWJldGljU2hvcnRjdXQoCi1jaGFyKQotCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC52aWV3Lk1lbnVJdGVtIHNldENoZWNrYWJsZSgKLWJvb2xlYW4pCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLnZpZXcuTWVudUl0ZW0gc2V0Q2hlY2tlZCgKLWJvb2xlYW4pCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLnZpZXcuTWVudUl0ZW0gc2V0RW5hYmxlZCgKLWJvb2xlYW4pCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLnZpZXcuTWVudUl0ZW0gc2V0SWNvbigKLWludCkKLQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQudmlldy5NZW51SXRlbSBzZXRJY29uKAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSkKLQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQudmlldy5NZW51SXRlbSBzZXRJbnRlbnQoCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50KQotCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC52aWV3Lk1lbnVJdGVtIHNldE51bWVyaWNTaG9ydGN1dCgKLWNoYXIpCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLnZpZXcuTWVudUl0ZW0gc2V0T25NZW51SXRlbUNsaWNrTGlzdGVuZXIoCi1hbmRyb2lkLnZpZXcuTWVudUl0ZW0kT25NZW51SXRlbUNsaWNrTGlzdGVuZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLnZpZXcuTWVudUl0ZW0gc2V0U2hvcnRjdXQoCi1jaGFyCi1jaGFyKQotCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC52aWV3Lk1lbnVJdGVtIHNldFRpdGxlKAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC52aWV3Lk1lbnVJdGVtIHNldFRpdGxlKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQudmlldy5NZW51SXRlbSBzZXRUaXRsZUNvbmRlbnNlZCgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLnZpZXcuTWVudUl0ZW0gc2V0VmlzaWJsZSgKLWJvb2xlYW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9Nb3Rpb25FdmVudDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC92aWV3L01vdGlvbkV2ZW50Oz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLWZpbmFsIGNsYXNzIGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudFtdIG5ld0FycmF5KAotaW50KQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdFtdIG5ld0FycmF5KAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX0NBTkNFTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ1RJT05fRE9XTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ1RJT05fTU9WRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ1RJT05fVVAKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I8TGFuZHJvaWQvdmlldy9Nb3Rpb25FdmVudDs+OyApCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yIENSRUFUT1IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRURHRV9CT1RUT00KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRURHRV9MRUZUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVER0VfUklHSFQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRURHRV9UT1AKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9SRUNZQ0xFRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFRSQUNLX1JFQ1lDTEVEX0xPQ0FUSU9OCi0KLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5PYmplY3QgZ1JlY3ljbGVyTG9jawotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQgZ1JlY3ljbGVyVG9wCi0KLXByaXZhdGUgc3RhdGljIGludCBnUmVjeWNsZXJVc2VkCi0KLXByaXZhdGUgaW50IG1BY3Rpb24KLQotcHJpdmF0ZSBpbnQgbURldmljZUlkCi0KLXByaXZhdGUgbG9uZyBtRG93blRpbWUKLQotcHJpdmF0ZSBpbnQgbUVkZ2VGbGFncwotCi1wcml2YXRlIGxvbmcgbUV2ZW50VGltZQotCi1wcml2YXRlIGZsb2F0W10gbUhpc3RvcnkKLQotcHJpdmF0ZSBsb25nW10gbUhpc3RvcnlUaW1lcwotCi1wcml2YXRlIGludCBtTWV0YVN0YXRlCi0KLXByaXZhdGUgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50IG1OZXh0Ci0KLXByaXZhdGUgaW50IG1OdW1IaXN0b3J5Ci0KLXByaXZhdGUgZmxvYXQgbVByZXNzdXJlCi0KLXByaXZhdGUgZmxvYXQgbVJhd1gKLQotcHJpdmF0ZSBmbG9hdCBtUmF3WQotCi1wcml2YXRlIGJvb2xlYW4gbVJlY3ljbGVkCi0KLXByaXZhdGUgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24gbVJlY3ljbGVkTG9jYXRpb24KLQotcHJpdmF0ZSBmbG9hdCBtU2l6ZQotCi1wcml2YXRlIGZsb2F0IG1YCi0KLXByaXZhdGUgZmxvYXQgbVhQcmVjaXNpb24KLQotcHJpdmF0ZSBmbG9hdCBtWQotCi1wcml2YXRlIGZsb2F0IG1ZUHJlY2lzaW9uCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotc3RhdGljIGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCBhY2Nlc3MkMDAwKCkKLQotc3RhdGljIHZvaWQgYWNjZXNzJDEwMCgKLWFuZHJvaWQudmlldy5Nb3Rpb25FdmVudAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXByaXZhdGUgc3RhdGljIGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCBvYnRhaW4oKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCBvYnRhaW4oCi1sb25nCi1sb25nCi1pbnQKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWZsb2F0Ci1pbnQKLWZsb2F0Ci1mbG9hdAotaW50Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50IG9idGFpbigKLWxvbmcKLWxvbmcKLWludAotZmxvYXQKLWZsb2F0Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50IG9idGFpbigKLWFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCkKLQotcHJpdmF0ZSB2b2lkIHJlYWRGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIGFkZEJhdGNoKAotbG9uZwotZmxvYXQKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWludCkKLQotcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkKLQotcHVibGljIGZpbmFsIGludCBnZXRBY3Rpb24oKQotCi1wdWJsaWMgZmluYWwgaW50IGdldERldmljZUlkKCkKLQotcHVibGljIGZpbmFsIGxvbmcgZ2V0RG93blRpbWUoKQotCi1wdWJsaWMgZmluYWwgaW50IGdldEVkZ2VGbGFncygpCi0KLXB1YmxpYyBmaW5hbCBsb25nIGdldEV2ZW50VGltZSgpCi0KLXB1YmxpYyBmaW5hbCBsb25nIGdldEhpc3RvcmljYWxFdmVudFRpbWUoCi1pbnQpCi0KLXB1YmxpYyBmaW5hbCBmbG9hdCBnZXRIaXN0b3JpY2FsUHJlc3N1cmUoCi1pbnQpCi0KLXB1YmxpYyBmaW5hbCBmbG9hdCBnZXRIaXN0b3JpY2FsU2l6ZSgKLWludCkKLQotcHVibGljIGZpbmFsIGZsb2F0IGdldEhpc3RvcmljYWxYKAotaW50KQotCi1wdWJsaWMgZmluYWwgZmxvYXQgZ2V0SGlzdG9yaWNhbFkoCi1pbnQpCi0KLXB1YmxpYyBmaW5hbCBpbnQgZ2V0SGlzdG9yeVNpemUoKQotCi1wdWJsaWMgZmluYWwgaW50IGdldE1ldGFTdGF0ZSgpCi0KLXB1YmxpYyBmaW5hbCBmbG9hdCBnZXRQcmVzc3VyZSgpCi0KLXB1YmxpYyBmaW5hbCBmbG9hdCBnZXRSYXdYKCkKLQotcHVibGljIGZpbmFsIGZsb2F0IGdldFJhd1koKQotCi1wdWJsaWMgZmluYWwgZmxvYXQgZ2V0U2l6ZSgpCi0KLXB1YmxpYyBmaW5hbCBmbG9hdCBnZXRYKCkKLQotcHVibGljIGZpbmFsIGZsb2F0IGdldFhQcmVjaXNpb24oKQotCi1wdWJsaWMgZmluYWwgZmxvYXQgZ2V0WSgpCi0KLXB1YmxpYyBmaW5hbCBmbG9hdCBnZXRZUHJlY2lzaW9uKCkKLQotcHVibGljIGZpbmFsIHZvaWQgb2Zmc2V0TG9jYXRpb24oCi1mbG9hdAotZmxvYXQpCi0KLXB1YmxpYyB2b2lkIHJlY3ljbGUoKQotCi1wdWJsaWMgZmluYWwgdm9pZCBzZXRBY3Rpb24oCi1pbnQpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHNldEVkZ2VGbGFncygKLWludCkKLQotcHVibGljIGZpbmFsIHZvaWQgc2V0TG9jYXRpb24oCi1mbG9hdAotZmxvYXQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC52aWV3Lk9yaWVudGF0aW9uTGlzdGVuZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3JMaXN0ZW5lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9SSUVOVEFUSU9OX1VOS05PV04KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBsb2NhbExPR1YKLQotcHJpdmF0ZSBib29sZWFuIG1FbmFibGVkCi0KLXByaXZhdGUgaW50IG1PcmllbnRhdGlvbgotCi1wcml2YXRlIGFuZHJvaWQuaGFyZHdhcmUuU2Vuc29yTWFuYWdlciBtU2Vuc29yTWFuYWdlcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wdWJsaWMgdm9pZCBkaXNhYmxlKCkKLQotcHVibGljIHZvaWQgZW5hYmxlKCkKLQotcHVibGljIHZvaWQgb25BY2N1cmFjeUNoYW5nZWQoCi1pbnQKLWludCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgb25PcmllbnRhdGlvbkNoYW5nZWQoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIG9uU2Vuc29yQ2hhbmdlZCgKLWludAotZmxvYXRbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnZpZXcuUmF3SW5wdXRFdmVudCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTX0JSQUtFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU19ESVNUQU5DRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNfR0FTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU19IQVQwWAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNfSEFUMFkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTX0hBVDFYCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU19IQVQxWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNfSEFUMlgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTX0hBVDJZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU19IQVQzWAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNfSEFUM1kKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTX01BWAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNfTUlTQwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNfUFJFU1NVUkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTX1JVRERFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNfUlgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTX1JZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU19SWgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNfVEhST1RUTEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTX1RJTFRfWAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNfVElMVF9ZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU19UT09MX1dJRFRICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU19WT0xVTUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTX1dIRUVMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU19YCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU19ZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU19aCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl8wCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl8xCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl8yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl8zCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl80Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl81Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl82Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl83Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl84Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl85Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl9BCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl9CCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl9CQUNLCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl9CQVNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl9CQVNFMgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVE5fQkFTRTMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlROX0JBU0U0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl9CQVNFNQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVE5fQkFTRTYKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlROX0MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlROX0RFQUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlROX0RJR0kKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlROX0VYVFJBCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl9GSVJTVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVE5fRk9SV0FSRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVE5fR0FNRVBBRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVE5fR0VBUl9ET1dOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl9HRUFSX1VQCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl9KT1lTVElDSwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVE5fTEFTVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVE5fTEVGVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVE5fTUlERExFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl9NSVNDCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl9NT0RFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl9NT1VTRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVE5fUElOS0lFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl9SSUdIVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVE5fU0VMRUNUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl9TSURFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl9TVEFSVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVE5fU1RZTFVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl9TVFlMVVMyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl9UQVNLCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl9USFVNQgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVE5fVEhVTUIyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl9USFVNQkwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlROX1RIVU1CUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVE5fVEwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlROX1RMMgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVE5fVE9PTF9BSVJCUlVTSAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVE5fVE9PTF9CUlVTSAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVE5fVE9PTF9ET1VCTEVUQVAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlROX1RPT0xfRklOR0VSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl9UT09MX0xFTlMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlROX1RPT0xfTU9VU0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlROX1RPT0xfUEVOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl9UT09MX1BFTkNJTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVE5fVE9PTF9SVUJCRVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlROX1RPT0xfVFJJUExFVEFQCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl9UT1AKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlROX1RPUDIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlROX1RPVUNICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl9UUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVE5fVFIyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl9UUklHR0VSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl9XSEVFTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVE5fWAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVE5fWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVE5fWgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTEFTU19DT05GSUdVUkFUSU9OX0NIQU5HRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xBU1NfS0VZQk9BUkQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xBU1NfVE9VQ0hTQ1JFRU4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xBU1NfVFJBQ0tCQUxMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWX0FCUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVl9ERVZJQ0VfQURERUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZfREVWSUNFX1JFTU9WRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZfRkYKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZfRkZfU1RBVFVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWX0tFWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVl9MRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZfTVNDCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWX1BXUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVl9SRUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZfUkVQCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWX1NORAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVl9TVwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVl9TWU4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVMX0RJQUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVMX0hXSEVFTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUxfTUFYCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTF9NSVNDCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTF9SWAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUxfUlkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVMX1JaCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTF9XSEVFTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUxfWAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUxfWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUxfWgotCi1wdWJsaWMgaW50IGRldmljZUlkCi0KLXB1YmxpYyBpbnQgZmxhZ3MKLQotcHVibGljIGludCBrZXljb2RlCi0KLXB1YmxpYyBpbnQgc2NhbmNvZGUKLQotcHVibGljIGludCB0eXBlCi0KLXB1YmxpYyBpbnQgdmFsdWUKLQotcHVibGljIGxvbmcgd2hlbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC52aWV3LlNvdW5kRWZmZWN0Q29uc3RhbnRzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElDSwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBOQVZJR0FUSU9OX0RPV04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFWSUdBVElPTl9MRUZUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5BVklHQVRJT05fUklHSFQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFWSUdBVElPTl9VUAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGludCBnZXRDb250YW50Rm9yRm9jdXNEaXJlY3Rpb24oCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQudmlldy5TdWJNZW51IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQudmlldy5NZW51Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgY2xlYXJIZWFkZXIoKQotCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC52aWV3Lk1lbnVJdGVtIGdldEl0ZW0oKQotCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC52aWV3LlN1Yk1lbnUgc2V0SGVhZGVySWNvbigKLWludCkKLQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQudmlldy5TdWJNZW51IHNldEhlYWRlckljb24oCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlKQotCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC52aWV3LlN1Yk1lbnUgc2V0SGVhZGVyVGl0bGUoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLnZpZXcuU3ViTWVudSBzZXRIZWFkZXJUaXRsZSgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLnZpZXcuU3ViTWVudSBzZXRIZWFkZXJWaWV3KAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLnZpZXcuU3ViTWVudSBzZXRJY29uKAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC52aWV3LlN1Yk1lbnUgc2V0SWNvbigKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9TdXJmYWNlOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExhbmRyb2lkL3ZpZXcvU3VyZmFjZTs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1maW5hbCBjbGFzcyBhbmRyb2lkLnZpZXcuU3VyZmFjZSQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGFuZHJvaWQudmlldy5TdXJmYWNlIGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgYW5kcm9pZC52aWV3LlN1cmZhY2VbXSBuZXdBcnJheSgKLWludCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3RbXSBuZXdBcnJheSgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9T3V0T2ZSZXNvdXJjZXNFeGNlcHRpb24gKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9TdXJmYWNlOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC52aWV3LlN1cmZhY2UkT3V0T2ZSZXNvdXJjZXNFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3ZpZXcvU3VyZmFjZSRPdXRPZlJlc291cmNlc0V4Y2VwdGlvbjsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQudmlldy5TdXJmYWNlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC92aWV3L1N1cmZhY2U7PjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvciBDUkVBVE9SCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZYX1NVUkZBQ0VfQkxVUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGWF9TVVJGQUNFX0RJTQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGWF9TVVJGQUNFX01BU0sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRlhfU1VSRkFDRV9OT1JNQUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR1BVCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhBUkRXQVJFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhJRERFTgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIExPR19UQUcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9OX1BSRU1VTFRJUExJRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFVTSF9CVUZGRVJTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJPVEFUSU9OXzAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUk9UQVRJT05fMTgwCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJPVEFUSU9OXzI3MAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBST1RBVElPTl85MAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRUNVUkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1VSQUNFX0ZST1pFTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVVJGQUNFX0JMVVJfRlJFRVpFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNVUkZBQ0VfRElUSEVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNVUkZBQ0VfSElEREVOCi0KLXByaXZhdGUgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMgbUNhbnZhcwotCi1wcml2YXRlIGludCBtU2F2ZUNvdW50Ci0KLXByaXZhdGUgaW50IG1TdXJmYWNlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL3ZpZXcvU3VyZmFjZSRPdXRPZlJlc291cmNlc0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuUGFyY2VsKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL3ZpZXcvU3VyZmFjZSRPdXRPZlJlc291cmNlc0V4Y2VwdGlvbjsgKQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5QYXJjZWwKLWFuZHJvaWQudmlldy5TdXJmYWNlJDEpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9TdXJmYWNlJE91dE9mUmVzb3VyY2VzRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLnZpZXcuU3VyZmFjZVNlc3Npb24KLWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgY2xvc2VUcmFuc2FjdGlvbigpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgZnJlZXplRGlzcGxheSgKLWludCkKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBpbml0KAotYW5kcm9pZC5vcy5QYXJjZWwpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9TdXJmYWNlJE91dE9mUmVzb3VyY2VzRXhjZXB0aW9uOyApCi1wcml2YXRlIG5hdGl2ZSB2b2lkIGluaXQoCi1hbmRyb2lkLnZpZXcuU3VyZmFjZVNlc3Npb24KLWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQpCi0KLXByaXZhdGUgbmF0aXZlIGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzIGxvY2tDYW52YXNOYXRpdmUoCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3QpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZUNsYXNzSW5pdCgpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgb3BlblRyYW5zYWN0aW9uKCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBzZXRPcmllbnRhdGlvbigKLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHVuZnJlZXplRGlzcGxheSgKLWludCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGNsZWFyKCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGNvcHlGcm9tKAotYW5kcm9pZC52aWV3LlN1cmZhY2UpCi0KLXB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9UaHJvd2FibGU7ICkKLXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGZyZWV6ZSgpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBoaWRlKCkKLQotcHVibGljIG5hdGl2ZSBib29sZWFuIGlzVmFsaWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL3ZpZXcvU3VyZmFjZSRPdXRPZlJlc291cmNlc0V4Y2VwdGlvbjsgKQotcHVibGljIGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzIGxvY2tDYW52YXMoCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3QpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCByZWFkRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgc2V0QWxwaGEoCi1mbG9hdCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIHNldEZsYWdzKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBzZXRGcmVlemVUaW50KAotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgc2V0TGF5ZXIoCi1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBzZXRNYXRyaXgoCi1mbG9hdAotZmxvYXQKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIHNldFBvc2l0aW9uKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBzZXRTaXplKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBzZXRUcmFuc3BhcmVudFJlZ2lvbkhpbnQoCi1hbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbikKLQotcHVibGljIG5hdGl2ZSB2b2lkIHNob3coKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCB1bmZyZWV6ZSgpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCB1bmxvY2tDYW52YXMoCi1hbmRyb2lkLmdyYXBoaWNzLkNhbnZhcykKLQotcHVibGljIG5hdGl2ZSB2b2lkIHVubG9ja0NhbnZhc0FuZFBvc3QoCi1hbmRyb2lkLmdyYXBoaWNzLkNhbnZhcykKLQotcHVibGljIG5hdGl2ZSB2b2lkIHdyaXRlVG9QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1CYWRTdXJmYWNlVHlwZUV4Y2VwdGlvbiApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC92aWV3L1N1cmZhY2VIb2xkZXI7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlciRCYWRTdXJmYWNlVHlwZUV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9Q2FsbGJhY2sgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9TdXJmYWNlSG9sZGVyOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyJENhbGxiYWNrIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHN1cmZhY2VDaGFuZ2VkKAotYW5kcm9pZC52aWV3LlN1cmZhY2VIb2xkZXIKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHN1cmZhY2VDcmVhdGVkKAotYW5kcm9pZC52aWV3LlN1cmZhY2VIb2xkZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHN1cmZhY2VEZXN0cm95ZWQoCi1hbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3ZpZXcvU3VyZmFjZUhvbGRlciRDYWxsYmFjaztMYW5kcm9pZC92aWV3L1N1cmZhY2VIb2xkZXIkQmFkU3VyZmFjZVR5cGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC52aWV3LlN1cmZhY2VIb2xkZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNVUkZBQ0VfVFlQRV9HUFUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1VSRkFDRV9UWVBFX0hBUkRXQVJFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNVUkZBQ0VfVFlQRV9OT1JNQUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1VSRkFDRV9UWVBFX1BVU0hfQlVGRkVSUwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGFkZENhbGxiYWNrKAotYW5kcm9pZC52aWV3LlN1cmZhY2VIb2xkZXIkQ2FsbGJhY2spCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLnZpZXcuU3VyZmFjZSBnZXRTdXJmYWNlKCkKLQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdCBnZXRTdXJmYWNlRnJhbWUoKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0NyZWF0aW5nKCkKLQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzIGxvY2tDYW52YXMoKQotCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMgbG9ja0NhbnZhcygKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgcmVtb3ZlQ2FsbGJhY2soCi1hbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlciRDYWxsYmFjaykKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0Rml4ZWRTaXplKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEZvcm1hdCgKLWludCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0S2VlcFNjcmVlbk9uKAotYm9vbGVhbikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0U2l6ZUZyb21MYXlvdXQoKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRUeXBlKAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB1bmxvY2tDYW52YXNBbmRQb3N0KAotYW5kcm9pZC5ncmFwaGljcy5DYW52YXMpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC52aWV3LlN1cmZhY2VTZXNzaW9uIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGludCBtQ2xpZW50Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBkZXN0cm95KCkKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBpbml0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL1Rocm93YWJsZTsgKQotcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKQotCi1wdWJsaWMgbmF0aXZlIHZvaWQga2lsbCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9TdXJmYWNlVmlldzsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotIGNsYXNzIGFuZHJvaWQudmlldy5TdXJmYWNlVmlldyQxIGV4dGVuZHMgYW5kcm9pZC5vcy5IYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQudmlldy5TdXJmYWNlVmlldyB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLnZpZXcuU3VyZmFjZVZpZXcpCi0KLXB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9TdXJmYWNlVmlldzsgKQotIGNsYXNzIGFuZHJvaWQudmlldy5TdXJmYWNlVmlldyQyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTE9HX1RBRwotCi1maW5hbCBhbmRyb2lkLnZpZXcuU3VyZmFjZVZpZXcgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC52aWV3LlN1cmZhY2VWaWV3KQotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzIGludGVybmFsTG9ja0NhbnZhcygKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdCkKLQotcHVibGljIHZvaWQgYWRkQ2FsbGJhY2soCi1hbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlciRDYWxsYmFjaykKLQotcHVibGljIGFuZHJvaWQudmlldy5TdXJmYWNlIGdldFN1cmZhY2UoKQotCi1wdWJsaWMgYW5kcm9pZC5ncmFwaGljcy5SZWN0IGdldFN1cmZhY2VGcmFtZSgpCi0KLXB1YmxpYyBib29sZWFuIGlzQ3JlYXRpbmcoKQotCi1wdWJsaWMgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMgbG9ja0NhbnZhcygpCi0KLXB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhcyBsb2NrQ2FudmFzKAotYW5kcm9pZC5ncmFwaGljcy5SZWN0KQotCi1wdWJsaWMgdm9pZCByZW1vdmVDYWxsYmFjaygKLWFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyJENhbGxiYWNrKQotCi1wdWJsaWMgdm9pZCBzZXRGaXhlZFNpemUoCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgc2V0Rm9ybWF0KAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRLZWVwU2NyZWVuT24oCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRTaXplRnJvbUxheW91dCgpCi0KLXB1YmxpYyB2b2lkIHNldFR5cGUoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHVubG9ja0NhbnZhc0FuZFBvc3QoCi1hbmRyb2lkLmdyYXBoaWNzLkNhbnZhcykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTIgbmFtZSA9TXlXaW5kb3cgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9TdXJmYWNlVmlldzsgKQotIGNsYXNzIGFuZHJvaWQudmlldy5TdXJmYWNlVmlldyRNeVdpbmRvdyBleHRlbmRzIGFuZHJvaWQudmlldy5JV2luZG93JFN0dWIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGludCBtQ3VySGVpZ2h0Ci0KLSBpbnQgbUN1cldpZHRoCi0KLWZpbmFsIGFuZHJvaWQudmlldy5TdXJmYWNlVmlldyB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotYW5kcm9pZC52aWV3LlN1cmZhY2VWaWV3KQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLnZpZXcuU3VyZmFjZVZpZXcKLWFuZHJvaWQudmlldy5TdXJmYWNlVmlldyQxKQotCi1wdWJsaWMgdm9pZCBkaXNwYXRjaEFwcFZpc2liaWxpdHkoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBkaXNwYXRjaEdldE5ld1N1cmZhY2UoKQotCi1wdWJsaWMgdm9pZCBkaXNwYXRjaEtleSgKLWFuZHJvaWQudmlldy5LZXlFdmVudCkKLQotcHVibGljIHZvaWQgZGlzcGF0Y2hQb2ludGVyKAotYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50Ci1sb25nKQotCi1wdWJsaWMgdm9pZCBkaXNwYXRjaFRyYWNrYmFsbCgKLWFuZHJvaWQudmlldy5Nb3Rpb25FdmVudAotbG9uZykKLQotcHVibGljIHZvaWQgZXhlY3V0ZUNvbW1hbmQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yKQotCi1wdWJsaWMgdm9pZCByZXNpemVkKAotaW50Ci1pbnQKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHdpbmRvd0ZvY3VzQ2hhbmdlZCgKLWJvb2xlYW4KLWJvb2xlYW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC92aWV3L1ZpZXckMTtMYW5kcm9pZC92aWV3L1ZpZXckU2Nyb2xsYWJpbGl0eUNhY2hlO0xhbmRyb2lkL3ZpZXcvVmlldyRBdHRhY2hJbmZvO0xhbmRyb2lkL3ZpZXcvVmlldyRCYXNlU2F2ZWRTdGF0ZTtMYW5kcm9pZC92aWV3L1ZpZXckVW5zZXRQcmVzc2VkU3RhdGU7TGFuZHJvaWQvdmlldy9WaWV3JE9uQ3JlYXRlQ29udGV4dE1lbnVMaXN0ZW5lcjtMYW5kcm9pZC92aWV3L1ZpZXckT25DbGlja0xpc3RlbmVyO0xhbmRyb2lkL3ZpZXcvVmlldyRPbkZvY3VzQ2hhbmdlTGlzdGVuZXI7TGFuZHJvaWQvdmlldy9WaWV3JE9uTG9uZ0NsaWNrTGlzdGVuZXI7TGFuZHJvaWQvdmlldy9WaWV3JE9uVG91Y2hMaXN0ZW5lcjtMYW5kcm9pZC92aWV3L1ZpZXckT25LZXlMaXN0ZW5lcjtMYW5kcm9pZC92aWV3L1ZpZXckQ2hlY2tGb3JMb25nUHJlc3M7TGFuZHJvaWQvdmlldy9WaWV3JE1lYXN1cmVTcGVjOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC52aWV3LlZpZXcgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSRDYWxsYmFjaywgYW5kcm9pZC52aWV3LktleUV2ZW50JENhbGxiYWNrCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBmaW5hbCBib29sZWFuICRhc3NlcnRpb25zRGlzYWJsZWQKLQotc3RhdGljIGZpbmFsIGludCBBTFBIQV9TRVQKLQotc3RhdGljIGZpbmFsIGludCBBTklNQVRJT05fU1RBUlRFRAotCi1zdGF0aWMgZmluYWwgaW50IENMSUNLQUJMRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRwotCi1zdGF0aWMgZmluYWwgaW50IERJU0FCTEVECi0KLXN0YXRpYyBmaW5hbCBpbnQgRFJBV0FCTEVfU1RBVEVfRElSVFkKLQotc3RhdGljIGZpbmFsIGludCBEUkFXSU5HX0NBQ0hFX0VOQUJMRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRFJBV0lOR19DQUNIRV9RVUFMSVRZX0FVVE8KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gRFJBV0lOR19DQUNIRV9RVUFMSVRZX0ZMQUdTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERSQVdJTkdfQ0FDSEVfUVVBTElUWV9ISUdICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERSQVdJTkdfQ0FDSEVfUVVBTElUWV9MT1cKLQotc3RhdGljIGZpbmFsIGludCBEUkFXSU5HX0NBQ0hFX1FVQUxJVFlfTUFTSwotCi1zdGF0aWMgZmluYWwgaW50IERSQVdJTkdfQ0FDSEVfVkFMSUQKLQotc3RhdGljIGZpbmFsIGludCBEUkFXTgotCi1zdGF0aWMgZmluYWwgaW50IERSQVdfTUFTSwotCi1zdGF0aWMgZmluYWwgaW50IERVUExJQ0FURV9QQVJFTlRfU1RBVEUKLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBFTVBUWV9TVEFURV9TRVQKLQotc3RhdGljIGZpbmFsIGludCBFTkFCTEVECi0KLXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gRU5BQkxFRF9GT0NVU0VEX1NFTEVDVEVEX1NUQVRFX1NFVAotCi1wcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIEVOQUJMRURfRk9DVVNFRF9TRUxFQ1RFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQKLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBFTkFCTEVEX0ZPQ1VTRURfU1RBVEVfU0VUCi0KLXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gRU5BQkxFRF9GT0NVU0VEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVAotCi1zdGF0aWMgZmluYWwgaW50IEVOQUJMRURfTUFTSwotCi1wcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIEVOQUJMRURfU0VMRUNURURfU1RBVEVfU0VUCi0KLXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gRU5BQkxFRF9TRUxFQ1RFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQKLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBFTkFCTEVEX1NUQVRFX1NFVAotCi1wcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIEVOQUJMRURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUCi0KLXN0YXRpYyBmaW5hbCBpbnQgRkFESU5HX0VER0VfSE9SSVpPTlRBTAotCi1zdGF0aWMgZmluYWwgaW50IEZBRElOR19FREdFX01BU0sKLQotc3RhdGljIGZpbmFsIGludCBGQURJTkdfRURHRV9OT05FCi0KLXN0YXRpYyBmaW5hbCBpbnQgRkFESU5HX0VER0VfVkVSVElDQUwKLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBGSVJTVF9TVEFURV9TRVQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZJVFNfU1lTVEVNX1dJTkRPV1MKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZPQ1VTQUJMRQotCi1zdGF0aWMgZmluYWwgaW50IEZPQ1VTQUJMRV9JTl9UT1VDSF9NT0RFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGT0NVU0FCTEVfTUFTSwotCi1zdGF0aWMgZmluYWwgaW50IEZPQ1VTRUQKLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBGT0NVU0VEX1NFTEVDVEVEX1NUQVRFX1NFVAotCi1wcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIEZPQ1VTRURfU0VMRUNURURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUCi0KLXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gRk9DVVNFRF9TVEFURV9TRVQKLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBGT0NVU0VEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT0NVU19CQUNLV0FSRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT0NVU19ET1dOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPQ1VTX0ZPUldBUkQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9DVVNfTEVGVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT0NVU19SSUdIVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT0NVU19VUAotCi1zdGF0aWMgZmluYWwgaW50IEZPUkNFX0xBWU9VVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHT05FCi0KLXN0YXRpYyBmaW5hbCBpbnQgSEFTX0JPVU5EUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlZJU0lCTEUKLQotc3RhdGljIGZpbmFsIGludCBJU19ST09UX05BTUVTUEFDRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRUVQX1NDUkVFTl9PTgotCi1wcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIExBU1RfU1RBVEVfU0VUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMQVlPVVRfUkVRVUlSRUQKLQotc3RhdGljIGZpbmFsIGludCBMT05HX0NMSUNLQUJMRQotCi1zdGF0aWMgZmluYWwgaW50IE1FQVNVUkVEX0RJTUVOU0lPTl9TRVQKLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBNSURETEVfU1RBVEVfU0VUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOT1RfRk9DVVNBQkxFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PX0lECi0KLXN0YXRpYyBmaW5hbCBpbnQgT05MWV9EUkFXU19CQUNLR1JPVU5ECi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUkVTU0VECi0KLXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gUFJFU1NFRF9FTkFCTEVEX0ZPQ1VTRURfU0VMRUNURURfU1RBVEVfU0VUCi0KLXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gUFJFU1NFRF9FTkFCTEVEX0ZPQ1VTRURfU0VMRUNURURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUCi0KLXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gUFJFU1NFRF9FTkFCTEVEX0ZPQ1VTRURfU1RBVEVfU0VUCi0KLXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gUFJFU1NFRF9FTkFCTEVEX0ZPQ1VTRURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUCi0KLXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gUFJFU1NFRF9FTkFCTEVEX1NFTEVDVEVEX1NUQVRFX1NFVAotCi1wcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIFBSRVNTRURfRU5BQkxFRF9TRUxFQ1RFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQKLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBQUkVTU0VEX0VOQUJMRURfU1RBVEVfU0VUCi0KLXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gUFJFU1NFRF9FTkFCTEVEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVAotCi1wcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIFBSRVNTRURfRklSU1RfU1RBVEVfU0VUCi0KLXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gUFJFU1NFRF9GT0NVU0VEX1NFTEVDVEVEX1NUQVRFX1NFVAotCi1wcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIFBSRVNTRURfRk9DVVNFRF9TRUxFQ1RFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQKLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBQUkVTU0VEX0ZPQ1VTRURfU1RBVEVfU0VUCi0KLXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gUFJFU1NFRF9GT0NVU0VEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVAotCi1wcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIFBSRVNTRURfTEFTVF9TVEFURV9TRVQKLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBQUkVTU0VEX01JRERMRV9TVEFURV9TRVQKLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBQUkVTU0VEX1NFTEVDVEVEX1NUQVRFX1NFVAotCi1wcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIFBSRVNTRURfU0VMRUNURURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUCi0KLXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gUFJFU1NFRF9TSU5HTEVfU1RBVEVfU0VUCi0KLXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gUFJFU1NFRF9TVEFURV9TRVQKLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBQUkVTU0VEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVAotCi1zdGF0aWMgZmluYWwgaW50IFJFUVVFU1RfVFJBTlNQQVJFTlRfUkVHSU9OUwotCi1zdGF0aWMgZmluYWwgaW50IFNBVkVfRElTQUJMRUQKLQotc3RhdGljIGZpbmFsIGludCBTQVZFX0RJU0FCTEVEX01BU0sKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNBVkVfU1RBVEVfQ0FMTEVECi0KLXN0YXRpYyBmaW5hbCBpbnQgU0NST0xMQkFSU19IT1JJWk9OVEFMCi0KLXN0YXRpYyBmaW5hbCBpbnQgU0NST0xMQkFSU19JTlNFVF9NQVNLCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDUk9MTEJBUlNfSU5TSURFX0lOU0VUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDUk9MTEJBUlNfSU5TSURFX09WRVJMQVkKLQotc3RhdGljIGZpbmFsIGludCBTQ1JPTExCQVJTX01BU0sKLQotc3RhdGljIGZpbmFsIGludCBTQ1JPTExCQVJTX05PTkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NST0xMQkFSU19PVVRTSURFX0lOU0VUCi0KLXN0YXRpYyBmaW5hbCBpbnQgU0NST0xMQkFSU19PVVRTSURFX01BU0sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NST0xMQkFSU19PVVRTSURFX09WRVJMQVkKLQotc3RhdGljIGZpbmFsIGludCBTQ1JPTExCQVJTX1NUWUxFX01BU0sKLQotc3RhdGljIGZpbmFsIGludCBTQ1JPTExCQVJTX1ZFUlRJQ0FMCi0KLXN0YXRpYyBmaW5hbCBpbnQgU0VMRUNURUQKLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBTRUxFQ1RFRF9TVEFURV9TRVQKLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBTRUxFQ1RFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQKLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBTSU5HTEVfU1RBVEVfU0VUCi0KLXN0YXRpYyBmaW5hbCBpbnQgU0tJUF9EUkFXCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNPVU5EX0VGRkVDVFNfRU5BQkxFRAotCi1wcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVklFV19MT0dfVEFHCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdW10gVklFV19TVEFURV9TRVRTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIFZJU0lCSUxJVFlfRkxBR1MKLQotc3RhdGljIGZpbmFsIGludCBWSVNJQklMSVRZX01BU0sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTSUJMRQotCi1zdGF0aWMgZmluYWwgaW50IFdBTlRTX0ZPQ1VTCi0KLXN0YXRpYyBmaW5hbCBpbnQgV0lMTF9OT1RfQ0FDSEVfRFJBV0lORwotCi1zdGF0aWMgZmluYWwgaW50IFdJTExfTk9UX0RSQVcKLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBXSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQKLQotc3RhdGljIGxvbmcgc0luc3RhbmNlQ291bnQKLQotIGFuZHJvaWQudmlldy5WaWV3JEF0dGFjaEluZm8gbUF0dGFjaEluZm8KLQotcHJpdmF0ZSBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIG1CR0RyYXdhYmxlCi0KLXByaXZhdGUgaW50IG1CYWNrZ3JvdW5kUmVzb3VyY2UKLQotcHJpdmF0ZSBib29sZWFuIG1CYWNrZ3JvdW5kU2l6ZUNoYW5nZWQKLUBhbmRyb2lkLnZpZXcuVmlld0RlYnVnJEV4cG9ydGVkUHJvcGVydHkKLXByb3RlY3RlZCBpbnQgbUJvdHRvbQotCi1wcm90ZWN0ZWQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgbUNvbnRleHQKLQotcHJvdGVjdGVkIGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uIG1DdXJyZW50QW5pbWF0aW9uCi0KLXByaXZhdGUgaW50W10gbURyYXdhYmxlU3RhdGUKLQotcHJpdmF0ZSBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCBtRHJhd2luZ0NhY2hlCi0KLXByaXZhdGUgaW50IG1EcmF3aW5nQ2FjaGVCYWNrZ3JvdW5kQ29sb3IKLQotcHJpdmF0ZSBhbmRyb2lkLnZpZXcuVmlld1RyZWVPYnNlcnZlciBtRmxvYXRpbmdUcmVlT2JzZXJ2ZXIKLQotcHJpdmF0ZSBib29sZWFuIG1IYXNQZXJmb3JtZWRMb25nUHJlc3MKLUBhbmRyb2lkLnZpZXcuVmlld0RlYnVnJEV4cG9ydGVkUHJvcGVydHkgKHJlc29sdmVJZCA9dHJ1ZSApCi0gaW50IG1JRAotCi1wcm90ZWN0ZWQgYW5kcm9pZC52aWV3LlZpZXdHcm91cCRMYXlvdXRQYXJhbXMgbUxheW91dFBhcmFtcwotQGFuZHJvaWQudmlldy5WaWV3RGVidWckRXhwb3J0ZWRQcm9wZXJ0eQotcHJvdGVjdGVkIGludCBtTGVmdAotCi1wcm90ZWN0ZWQgZmluYWwgaW50W10gbUxvY2F0aW9uCi1AYW5kcm9pZC52aWV3LlZpZXdEZWJ1ZyRFeHBvcnRlZFByb3BlcnR5Ci1wcm90ZWN0ZWQgaW50IG1NZWFzdXJlZEhlaWdodAotQGFuZHJvaWQudmlldy5WaWV3RGVidWckRXhwb3J0ZWRQcm9wZXJ0eQotcHJvdGVjdGVkIGludCBtTWVhc3VyZWRXaWR0aAotCi1wcml2YXRlIGludCBtTWluSGVpZ2h0Ci0KLXByaXZhdGUgaW50IG1NaW5XaWR0aAotCi1wcml2YXRlIGludCBtTmV4dEZvY3VzRG93bklkCi0KLXByaXZhdGUgaW50IG1OZXh0Rm9jdXNMZWZ0SWQKLQotcHJpdmF0ZSBpbnQgbU5leHRGb2N1c1JpZ2h0SWQKLQotcHJpdmF0ZSBpbnQgbU5leHRGb2N1c1VwSWQKLQotcHJpdmF0ZSBpbnQgbU9sZEhlaWdodE1lYXN1cmVTcGVjCi0KLXByaXZhdGUgaW50IG1PbGRXaWR0aE1lYXN1cmVTcGVjCi0KLXByb3RlY3RlZCBhbmRyb2lkLnZpZXcuVmlldyRPbkNsaWNrTGlzdGVuZXIgbU9uQ2xpY2tMaXN0ZW5lcgotCi1wcm90ZWN0ZWQgYW5kcm9pZC52aWV3LlZpZXckT25DcmVhdGVDb250ZXh0TWVudUxpc3RlbmVyIG1PbkNyZWF0ZUNvbnRleHRNZW51TGlzdGVuZXIKLQotcHJvdGVjdGVkIGFuZHJvaWQudmlldy5WaWV3JE9uRm9jdXNDaGFuZ2VMaXN0ZW5lciBtT25Gb2N1c0NoYW5nZUxpc3RlbmVyCi0KLXByaXZhdGUgYW5kcm9pZC52aWV3LlZpZXckT25LZXlMaXN0ZW5lciBtT25LZXlMaXN0ZW5lcgotCi1wcm90ZWN0ZWQgYW5kcm9pZC52aWV3LlZpZXckT25Mb25nQ2xpY2tMaXN0ZW5lciBtT25Mb25nQ2xpY2tMaXN0ZW5lcgotCi1wcml2YXRlIGFuZHJvaWQudmlldy5WaWV3JE9uVG91Y2hMaXN0ZW5lciBtT25Ub3VjaExpc3RlbmVyCi1AYW5kcm9pZC52aWV3LlZpZXdEZWJ1ZyRFeHBvcnRlZFByb3BlcnR5Ci1wcm90ZWN0ZWQgaW50IG1QYWRkaW5nQm90dG9tCi1AYW5kcm9pZC52aWV3LlZpZXdEZWJ1ZyRFeHBvcnRlZFByb3BlcnR5Ci1wcm90ZWN0ZWQgaW50IG1QYWRkaW5nTGVmdAotQGFuZHJvaWQudmlldy5WaWV3RGVidWckRXhwb3J0ZWRQcm9wZXJ0eQotcHJvdGVjdGVkIGludCBtUGFkZGluZ1JpZ2h0Ci1AYW5kcm9pZC52aWV3LlZpZXdEZWJ1ZyRFeHBvcnRlZFByb3BlcnR5Ci1wcm90ZWN0ZWQgaW50IG1QYWRkaW5nVG9wCi0KLXByb3RlY3RlZCBhbmRyb2lkLnZpZXcuVmlld1BhcmVudCBtUGFyZW50Ci0KLXByaXZhdGUgYW5kcm9pZC52aWV3LlZpZXckQ2hlY2tGb3JMb25nUHJlc3MgbVBlbmRpbmdDaGVja0ZvckxvbmdQcmVzcwotCi0gaW50IG1Qcml2YXRlRmxhZ3MKLQotcHJpdmF0ZSBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcyBtUmVzb3VyY2VzCi1AYW5kcm9pZC52aWV3LlZpZXdEZWJ1ZyRFeHBvcnRlZFByb3BlcnR5Ci1wcm90ZWN0ZWQgaW50IG1SaWdodAotCi1wcml2YXRlIGFuZHJvaWQudmlldy5WaWV3JFNjcm9sbGFiaWxpdHlDYWNoZSBtU2Nyb2xsQ2FjaGUKLUBhbmRyb2lkLnZpZXcuVmlld0RlYnVnJEV4cG9ydGVkUHJvcGVydHkKLXByb3RlY3RlZCBpbnQgbVNjcm9sbFgKLUBhbmRyb2lkLnZpZXcuVmlld0RlYnVnJEV4cG9ydGVkUHJvcGVydHkKLXByb3RlY3RlZCBpbnQgbVNjcm9sbFkKLQotcHJvdGVjdGVkIGphdmEubGFuZy5PYmplY3QgbVRhZwotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUmVjdCBtVGVtcFJlY3QKLUBhbmRyb2lkLnZpZXcuVmlld0RlYnVnJEV4cG9ydGVkUHJvcGVydHkKLXByb3RlY3RlZCBpbnQgbVRvcAotCi1wcml2YXRlIGFuZHJvaWQudmlldy5Ub3VjaERlbGVnYXRlIG1Ub3VjaERlbGVnYXRlCi1AYW5kcm9pZC52aWV3LlZpZXdEZWJ1ZyRFeHBvcnRlZFByb3BlcnR5Ci1wcm90ZWN0ZWQgaW50IG1Vc2VyUGFkZGluZ0JvdHRvbQotQGFuZHJvaWQudmlldy5WaWV3RGVidWckRXhwb3J0ZWRQcm9wZXJ0eQotcHJvdGVjdGVkIGludCBtVXNlclBhZGRpbmdSaWdodAotCi0gaW50IG1WaWV3RmxhZ3MKLQotIGludCBtV2luZG93QXR0YWNoQ291bnQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQKLWludCkKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDEwMigKLWFuZHJvaWQudmlldy5WaWV3Ci1ib29sZWFuKQotCi1wcml2YXRlIHN0YXRpYyB2b2lkIGNhcHR1cmVWaWV3SW5mbygKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQudmlldy5WaWV3KQotCi1wcm90ZWN0ZWQgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZGVidWdJbmRlbnQoCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIGFuZHJvaWQudmlldy5WaWV3IGZpbmRWaWV3U2hvdWxkRXhpc3QoCi1hbmRyb2lkLnZpZXcuVmlldwotaW50KQotCi1wdWJsaWMgc3RhdGljIGludCBnZXREZWZhdWx0U2l6ZSgKLWludAotaW50KQotCi1wcml2YXRlIGludCBnZXRTY3JvbGxCYXJQYWRkaW5nQm90dG9tKCkKLQotcHJpdmF0ZSBpbnQgZ2V0U2Nyb2xsQmFyUGFkZGluZ0xlZnQoKQotCi1wcml2YXRlIGludCBnZXRTY3JvbGxCYXJQYWRkaW5nUmlnaHQoKQotCi1wcml2YXRlIGJvb2xlYW4gaGFzQW5jZXN0b3JUaGF0QmxvY2tzRGVzY2VuZGFudEZvY3VzKCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLnZpZXcuVmlldyBpbmZsYXRlKAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWludAotYW5kcm9pZC52aWV3LlZpZXdHcm91cCkKLQotcHJpdmF0ZSB2b2lkIGluaXRTY3JvbGxDYWNoZSgpCi0KLXByb3RlY3RlZCBzdGF0aWMgaW50W10gbWVyZ2VEcmF3YWJsZVN0YXRlcygKLWludFtdCi1pbnRbXSkKLQotcHJpdmF0ZSB2b2lkIG9uRHJhd0hvcml6b250YWxTY3JvbGxCYXIoCi1hbmRyb2lkLmdyYXBoaWNzLkNhbnZhcwotYW5kcm9pZC53aWRnZXQuU2Nyb2xsQmFyRHJhd2FibGUKLWludAotaW50Ci1pbnQpCi0KLXByaXZhdGUgdm9pZCBvbkRyYXdTY3JvbGxCYXJzKAotYW5kcm9pZC5ncmFwaGljcy5DYW52YXMpCi0KLXByaXZhdGUgdm9pZCBvbkRyYXdWZXJ0aWNhbFNjcm9sbEJhcigKLWFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzCi1hbmRyb2lkLndpZGdldC5TY3JvbGxCYXJEcmF3YWJsZQotaW50Ci1pbnQKLWludCkKLQotcHJpdmF0ZSB2b2lkIHBvc3RDaGVja0ZvckxvbmdDbGljaygpCi0KLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgcHJpbnRGbGFncygKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBwcmludFByaXZhdGVGbGFncygKLWludCkKLQotcHJpdmF0ZSB2b2lkIHJlY29tcHV0ZVBhZGRpbmcoKQotCi1wdWJsaWMgc3RhdGljIGludCByZXNvbHZlU2l6ZSgKLWludAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBpbnRbXSBzdGF0ZVNldFVuaW9uKAotaW50W10KLWludFtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0FycmF5TGlzdDxMYW5kcm9pZC92aWV3L1ZpZXc7PjtJKVYgKQotcHVibGljIHZvaWQgYWRkRm9jdXNhYmxlcygKLWphdmEudXRpbC5BcnJheUxpc3QKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9BcnJheUxpc3Q8TGFuZHJvaWQvdmlldy9WaWV3Oz47KVYgKQotcHVibGljIHZvaWQgYWRkVG91Y2hhYmxlcygKLWphdmEudXRpbC5BcnJheUxpc3QpCi0KLXB1YmxpYyB2b2lkIGFwcGx5RHJhd2FibGVUb1RyYW5zcGFyZW50UmVnaW9uKAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZQotYW5kcm9pZC5ncmFwaGljcy5SZWdpb24pCi0KLSB2b2lkIGFzc2lnblBhcmVudCgKLWFuZHJvaWQudmlldy5WaWV3UGFyZW50KQotCi1wdWJsaWMgdm9pZCBicmluZ1RvRnJvbnQoKQotCi1wdWJsaWMgdm9pZCBidWlsZERyYXdpbmdDYWNoZSgpCi0KLXB1YmxpYyB2b2lkIGNhbmNlbExvbmdQcmVzcygpCi0KLXB1YmxpYyB2b2lkIGNsZWFyQW5pbWF0aW9uKCkKLQotcHVibGljIHZvaWQgY2xlYXJGb2N1cygpCi0KLSB2b2lkIGNsZWFyRm9jdXNGb3JSZW1vdmFsKCkKLQotcHJvdGVjdGVkIGludCBjb21wdXRlSG9yaXpvbnRhbFNjcm9sbEV4dGVudCgpCi0KLXByb3RlY3RlZCBpbnQgY29tcHV0ZUhvcml6b250YWxTY3JvbGxPZmZzZXQoKQotCi1wcm90ZWN0ZWQgaW50IGNvbXB1dGVIb3Jpem9udGFsU2Nyb2xsUmFuZ2UoKQotCi1wdWJsaWMgdm9pZCBjb21wdXRlU2Nyb2xsKCkKLQotcHJvdGVjdGVkIGludCBjb21wdXRlVmVydGljYWxTY3JvbGxFeHRlbnQoKQotCi1wcm90ZWN0ZWQgaW50IGNvbXB1dGVWZXJ0aWNhbFNjcm9sbE9mZnNldCgpCi0KLXByb3RlY3RlZCBpbnQgY29tcHV0ZVZlcnRpY2FsU2Nyb2xsUmFuZ2UoKQotCi1wdWJsaWMgdm9pZCBjcmVhdGVDb250ZXh0TWVudSgKLWFuZHJvaWQudmlldy5Db250ZXh0TWVudSkKLQotcHVibGljIHZvaWQgZGVidWcoKQotCi1wcm90ZWN0ZWQgdm9pZCBkZWJ1ZygKLWludCkKLQotcHVibGljIHZvaWQgZGVzdHJveURyYXdpbmdDYWNoZSgpCi0KLSB2b2lkIGRpc3BhdGNoQXR0YWNoZWRUb1dpbmRvdygKLWFuZHJvaWQudmlldy5WaWV3JEF0dGFjaEluZm8KLWludCkKLQotIHZvaWQgZGlzcGF0Y2hDb2xsZWN0Vmlld0F0dHJpYnV0ZXMoCi1pbnQpCi0KLSB2b2lkIGRpc3BhdGNoRGV0YWNoZWRGcm9tV2luZG93KCkKLQotcHJvdGVjdGVkIHZvaWQgZGlzcGF0Y2hEcmF3KAotYW5kcm9pZC5ncmFwaGljcy5DYW52YXMpCi0KLXB1YmxpYyBib29sZWFuIGRpc3BhdGNoS2V5RXZlbnQoCi1hbmRyb2lkLnZpZXcuS2V5RXZlbnQpCi0KLXB1YmxpYyBib29sZWFuIGRpc3BhdGNoS2V5U2hvcnRjdXRFdmVudCgKLWFuZHJvaWQudmlldy5LZXlFdmVudCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGFuZHJvaWQvdXRpbC9TcGFyc2VBcnJheTxMYW5kcm9pZC9vcy9QYXJjZWxhYmxlOz47KVYgKQotcHJvdGVjdGVkIHZvaWQgZGlzcGF0Y2hSZXN0b3JlSW5zdGFuY2VTdGF0ZSgKLWFuZHJvaWQudXRpbC5TcGFyc2VBcnJheSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGFuZHJvaWQvdXRpbC9TcGFyc2VBcnJheTxMYW5kcm9pZC9vcy9QYXJjZWxhYmxlOz47KVYgKQotcHJvdGVjdGVkIHZvaWQgZGlzcGF0Y2hTYXZlSW5zdGFuY2VTdGF0ZSgKLWFuZHJvaWQudXRpbC5TcGFyc2VBcnJheSkKLQotcHJvdGVjdGVkIHZvaWQgZGlzcGF0Y2hTZXRQcmVzc2VkKAotYm9vbGVhbikKLQotcHJvdGVjdGVkIHZvaWQgZGlzcGF0Y2hTZXRTZWxlY3RlZCgKLWJvb2xlYW4pCi0KLXB1YmxpYyBib29sZWFuIGRpc3BhdGNoVG91Y2hFdmVudCgKLWFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCkKLQotcHVibGljIGJvb2xlYW4gZGlzcGF0Y2hUcmFja2JhbGxFdmVudCgKLWFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCkKLQotcHVibGljIGJvb2xlYW4gZGlzcGF0Y2hVbmhhbmRsZWRNb3ZlKAotYW5kcm9pZC52aWV3LlZpZXcKLWludCkKLQotcHVibGljIHZvaWQgZGlzcGF0Y2hXaW5kb3dGb2N1c0NoYW5nZWQoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBkaXNwYXRjaFdpbmRvd1Zpc2liaWxpdHlDaGFuZ2VkKAotaW50KQotCi1wdWJsaWMgdm9pZCBkcmF3KAotYW5kcm9pZC5ncmFwaGljcy5DYW52YXMpCi0KLXByb3RlY3RlZCB2b2lkIGRyYXdhYmxlU3RhdGVDaGFuZ2VkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL1Rocm93YWJsZTsgKQotcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKQotCi1wdWJsaWMgYW5kcm9pZC52aWV3LlZpZXcgZmluZEZvY3VzKCkKLQotIGFuZHJvaWQudmlldy5WaWV3IGZpbmRVc2VyU2V0TmV4dEZvY3VzKAotYW5kcm9pZC52aWV3LlZpZXcKLWludCkKLQotcHVibGljIGZpbmFsIGFuZHJvaWQudmlldy5WaWV3IGZpbmRWaWV3QnlJZCgKLWludCkKLQotcHJvdGVjdGVkIGFuZHJvaWQudmlldy5WaWV3IGZpbmRWaWV3VHJhdmVyc2FsKAotaW50KQotCi1wdWJsaWMgZmluYWwgYW5kcm9pZC52aWV3LlZpZXcgZmluZFZpZXdXaXRoVGFnKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHJvdGVjdGVkIGFuZHJvaWQudmlldy5WaWV3IGZpbmRWaWV3V2l0aFRhZ1RyYXZlcnNhbCgKLWphdmEubGFuZy5PYmplY3QpCi0KLXByb3RlY3RlZCBib29sZWFuIGZpdFN5c3RlbVdpbmRvd3MoCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3QpCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuVmlldyBmb2N1c1NlYXJjaCgKLWludCkKLQotcHVibGljIHZvaWQgZm9yY2VMYXlvdXQoKQotCi1wdWJsaWMgYm9vbGVhbiBnYXRoZXJUcmFuc3BhcmVudFJlZ2lvbigKLWFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uKQotCi1wdWJsaWMgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb24gZ2V0QW5pbWF0aW9uKCkKLQotcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBnZXRBcHBsaWNhdGlvbldpbmRvd1Rva2VuKCkKLQotcHVibGljIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgZ2V0QmFja2dyb3VuZCgpCi1AYW5kcm9pZC52aWV3LlZpZXdEZWJ1ZyRFeHBvcnRlZFByb3BlcnR5Ci1wdWJsaWMgaW50IGdldEJhc2VsaW5lKCkKLUBhbmRyb2lkLnZpZXcuVmlld0RlYnVnJENhcHR1cmVkVmlld1Byb3BlcnR5Ci1wdWJsaWMgZmluYWwgaW50IGdldEJvdHRvbSgpCi0KLXByb3RlY3RlZCBmbG9hdCBnZXRCb3R0b21GYWRpbmdFZGdlU3RyZW5ndGgoKQotQGFuZHJvaWQudmlldy5WaWV3RGVidWckQ2FwdHVyZWRWaWV3UHJvcGVydHkKLXB1YmxpYyBmaW5hbCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBnZXRDb250ZXh0KCkKLQotcHJvdGVjdGVkIGFuZHJvaWQudmlldy5Db250ZXh0TWVudSRDb250ZXh0TWVudUluZm8gZ2V0Q29udGV4dE1lbnVJbmZvKCkKLQotcHVibGljIGZpbmFsIGludFtdIGdldERyYXdhYmxlU3RhdGUoKQotCi1wdWJsaWMgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAgZ2V0RHJhd2luZ0NhY2hlKCkKLQotcHVibGljIGludCBnZXREcmF3aW5nQ2FjaGVCYWNrZ3JvdW5kQ29sb3IoKQotCi1wdWJsaWMgaW50IGdldERyYXdpbmdDYWNoZVF1YWxpdHkoKQotCi1wdWJsaWMgdm9pZCBnZXREcmF3aW5nUmVjdCgKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdCkKLQotcHVibGljIGxvbmcgZ2V0RHJhd2luZ1RpbWUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJKUxqYXZhL3V0aWwvQXJyYXlMaXN0PExhbmRyb2lkL3ZpZXcvVmlldzs+OyApCi1wdWJsaWMgamF2YS51dGlsLkFycmF5TGlzdCBnZXRGb2N1c2FibGVzKAotaW50KQotCi1wdWJsaWMgdm9pZCBnZXRGb2N1c2VkUmVjdCgKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gZ2V0R2xvYmFsVmlzaWJsZVJlY3QoCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3QpCi0KLXB1YmxpYyBib29sZWFuIGdldEdsb2JhbFZpc2libGVSZWN0KAotYW5kcm9pZC5ncmFwaGljcy5SZWN0Ci1hbmRyb2lkLmdyYXBoaWNzLlBvaW50KQotCi1wcm90ZWN0ZWQgYW5kcm9pZC5vcy5IYW5kbGVyIGdldEhhbmRsZXIoKQotQGFuZHJvaWQudmlldy5WaWV3RGVidWckRXhwb3J0ZWRQcm9wZXJ0eQotcHVibGljIGZpbmFsIGludCBnZXRIZWlnaHQoKQotCi1wdWJsaWMgdm9pZCBnZXRIaXRSZWN0KAotYW5kcm9pZC5ncmFwaGljcy5SZWN0KQotCi1wdWJsaWMgaW50IGdldEhvcml6b250YWxGYWRpbmdFZGdlTGVuZ3RoKCkKLQotcHJvdGVjdGVkIGludCBnZXRIb3Jpem9udGFsU2Nyb2xsYmFySGVpZ2h0KCkKLUBhbmRyb2lkLnZpZXcuVmlld0RlYnVnJENhcHR1cmVkVmlld1Byb3BlcnR5Ci1wdWJsaWMgaW50IGdldElkKCkKLQotcHVibGljIGJvb2xlYW4gZ2V0S2VlcFNjcmVlbk9uKCkKLUBhbmRyb2lkLnZpZXcuVmlld0RlYnVnJEV4cG9ydGVkUHJvcGVydHkgKGRlZXBFeHBvcnQgPXRydWUgcHJlZml4ID1sYXlvdXRfICkKLXB1YmxpYyBhbmRyb2lkLnZpZXcuVmlld0dyb3VwJExheW91dFBhcmFtcyBnZXRMYXlvdXRQYXJhbXMoKQotQGFuZHJvaWQudmlldy5WaWV3RGVidWckQ2FwdHVyZWRWaWV3UHJvcGVydHkKLXB1YmxpYyBmaW5hbCBpbnQgZ2V0TGVmdCgpCi0KLXByb3RlY3RlZCBmbG9hdCBnZXRMZWZ0RmFkaW5nRWRnZVN0cmVuZ3RoKCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gZ2V0TG9jYWxWaXNpYmxlUmVjdCgKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdCkKLQotcHVibGljIHZvaWQgZ2V0TG9jYXRpb25JbldpbmRvdygKLWludFtdKQotCi1wdWJsaWMgdm9pZCBnZXRMb2NhdGlvbk9uU2NyZWVuKAotaW50W10pCi0KLXB1YmxpYyBmaW5hbCBpbnQgZ2V0TWVhc3VyZWRIZWlnaHQoKQotCi1wdWJsaWMgZmluYWwgaW50IGdldE1lYXN1cmVkV2lkdGgoKQotCi1wdWJsaWMgaW50IGdldE5leHRGb2N1c0Rvd25JZCgpCi0KLXB1YmxpYyBpbnQgZ2V0TmV4dEZvY3VzTGVmdElkKCkKLQotcHVibGljIGludCBnZXROZXh0Rm9jdXNSaWdodElkKCkKLQotcHVibGljIGludCBnZXROZXh0Rm9jdXNVcElkKCkKLQotcHVibGljIGFuZHJvaWQudmlldy5WaWV3JE9uRm9jdXNDaGFuZ2VMaXN0ZW5lciBnZXRPbkZvY3VzQ2hhbmdlTGlzdGVuZXIoKQotCi1wdWJsaWMgaW50IGdldFBhZGRpbmdCb3R0b20oKQotCi1wdWJsaWMgaW50IGdldFBhZGRpbmdMZWZ0KCkKLQotcHVibGljIGludCBnZXRQYWRkaW5nUmlnaHQoKQotCi1wdWJsaWMgaW50IGdldFBhZGRpbmdUb3AoKQotCi1wdWJsaWMgZmluYWwgYW5kcm9pZC52aWV3LlZpZXdQYXJlbnQgZ2V0UGFyZW50KCkKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzIGdldFJlc291cmNlcygpCi1AYW5kcm9pZC52aWV3LlZpZXdEZWJ1ZyRDYXB0dXJlZFZpZXdQcm9wZXJ0eQotcHVibGljIGZpbmFsIGludCBnZXRSaWdodCgpCi0KLXByb3RlY3RlZCBmbG9hdCBnZXRSaWdodEZhZGluZ0VkZ2VTdHJlbmd0aCgpCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuVmlldyBnZXRSb290VmlldygpCi0KLXB1YmxpYyBpbnQgZ2V0U2Nyb2xsQmFyU3R5bGUoKQotCi1wdWJsaWMgZmluYWwgaW50IGdldFNjcm9sbFgoKQotCi1wdWJsaWMgZmluYWwgaW50IGdldFNjcm9sbFkoKQotCi1wdWJsaWMgaW50IGdldFNvbGlkQ29sb3IoKQotCi1wcm90ZWN0ZWQgaW50IGdldFN1Z2dlc3RlZE1pbmltdW1IZWlnaHQoKQotCi1wcm90ZWN0ZWQgaW50IGdldFN1Z2dlc3RlZE1pbmltdW1XaWR0aCgpCi1AYW5kcm9pZC52aWV3LlZpZXdEZWJ1ZyRFeHBvcnRlZFByb3BlcnR5Ci1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRUYWcoKQotQGFuZHJvaWQudmlldy5WaWV3RGVidWckQ2FwdHVyZWRWaWV3UHJvcGVydHkKLXB1YmxpYyBmaW5hbCBpbnQgZ2V0VG9wKCkKLQotcHJvdGVjdGVkIGZsb2F0IGdldFRvcEZhZGluZ0VkZ2VTdHJlbmd0aCgpCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuVG91Y2hEZWxlZ2F0ZSBnZXRUb3VjaERlbGVnYXRlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvQXJyYXlMaXN0PExhbmRyb2lkL3ZpZXcvVmlldzs+OyApCi1wdWJsaWMgamF2YS51dGlsLkFycmF5TGlzdCBnZXRUb3VjaGFibGVzKCkKLQotcHVibGljIGludCBnZXRWZXJ0aWNhbEZhZGluZ0VkZ2VMZW5ndGgoKQotCi1wdWJsaWMgaW50IGdldFZlcnRpY2FsU2Nyb2xsYmFyV2lkdGgoKQotCi1wdWJsaWMgYW5kcm9pZC52aWV3LlZpZXdUcmVlT2JzZXJ2ZXIgZ2V0Vmlld1RyZWVPYnNlcnZlcigpCi1AYW5kcm9pZC52aWV3LlZpZXdEZWJ1ZyRFeHBvcnRlZFByb3BlcnR5IChtYXBwaW5nID1MYW5kcm9pZC92aWV3L1ZpZXdEZWJ1ZyRJbnRUb1N0cmluZzs6W2Zyb20gPTAsIHRvID1WSVNJQkxFXUxhbmRyb2lkL3ZpZXcvVmlld0RlYnVnJEludFRvU3RyaW5nOzpbZnJvbSA9NCwgdG8gPUlOVklTSUJMRV1MYW5kcm9pZC92aWV3L1ZpZXdEZWJ1ZyRJbnRUb1N0cmluZzs6W2Zyb20gPTgsIHRvID1HT05FXSApCi1wdWJsaWMgaW50IGdldFZpc2liaWxpdHkoKQotQGFuZHJvaWQudmlldy5WaWV3RGVidWckRXhwb3J0ZWRQcm9wZXJ0eQotcHVibGljIGZpbmFsIGludCBnZXRXaWR0aCgpCi0KLXByb3RlY3RlZCBpbnQgZ2V0V2luZG93QXR0YWNoQ291bnQoKQotCi0gYW5kcm9pZC52aWV3LklXaW5kb3dTZXNzaW9uIGdldFdpbmRvd1Nlc3Npb24oKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGdldFdpbmRvd1Rva2VuKCkKLQotcHVibGljIGludCBnZXRXaW5kb3dWaXNpYmlsaXR5KCkKLQotIHZvaWQgaGFuZGxlRm9jdXNHYWluSW50ZXJuYWwoCi1pbnQKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdCkKLUBhbmRyb2lkLnZpZXcuVmlld0RlYnVnJEV4cG9ydGVkUHJvcGVydHkKLXB1YmxpYyBib29sZWFuIGhhc0ZvY3VzKCkKLQotcHVibGljIGJvb2xlYW4gaGFzRm9jdXNhYmxlKCkKLQotcHVibGljIGJvb2xlYW4gaGFzV2luZG93Rm9jdXMoKQotCi1wcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRmFkaW5nRWRnZSgKLWFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheSkKLQotcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVNjcm9sbGJhcnMoCi1hbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXkpCi0KLXB1YmxpYyB2b2lkIGludmFsaWRhdGUoKQotCi1wdWJsaWMgdm9pZCBpbnZhbGlkYXRlKAotaW50Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBpbnZhbGlkYXRlKAotYW5kcm9pZC5ncmFwaGljcy5SZWN0KQotCi1wdWJsaWMgdm9pZCBpbnZhbGlkYXRlRHJhd2FibGUoCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlKQotQGFuZHJvaWQudmlldy5WaWV3RGVidWckRXhwb3J0ZWRQcm9wZXJ0eQotcHVibGljIGJvb2xlYW4gaXNDbGlja2FibGUoKQotQGFuZHJvaWQudmlldy5WaWV3RGVidWckRXhwb3J0ZWRQcm9wZXJ0eQotcHVibGljIGJvb2xlYW4gaXNEcmF3aW5nQ2FjaGVFbmFibGVkKCkKLQotcHVibGljIGJvb2xlYW4gaXNEdXBsaWNhdGVQYXJlbnRTdGF0ZUVuYWJsZWQoKQotQGFuZHJvaWQudmlldy5WaWV3RGVidWckRXhwb3J0ZWRQcm9wZXJ0eQotcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkKLUBhbmRyb2lkLnZpZXcuVmlld0RlYnVnJEV4cG9ydGVkUHJvcGVydHkKLXB1YmxpYyBmaW5hbCBib29sZWFuIGlzRm9jdXNhYmxlKCkKLUBhbmRyb2lkLnZpZXcuVmlld0RlYnVnJEV4cG9ydGVkUHJvcGVydHkKLXB1YmxpYyBmaW5hbCBib29sZWFuIGlzRm9jdXNhYmxlSW5Ub3VjaE1vZGUoKQotQGFuZHJvaWQudmlldy5WaWV3RGVidWckRXhwb3J0ZWRQcm9wZXJ0eQotcHVibGljIGJvb2xlYW4gaXNGb2N1c2VkKCkKLQotcHVibGljIGJvb2xlYW4gaXNIb3Jpem9udGFsRmFkaW5nRWRnZUVuYWJsZWQoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0hvcml6b250YWxTY3JvbGxCYXJFbmFibGVkKCkKLUBhbmRyb2lkLnZpZXcuVmlld0RlYnVnJEV4cG9ydGVkUHJvcGVydHkKLXB1YmxpYyBib29sZWFuIGlzSW5Ub3VjaE1vZGUoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0xheW91dFJlcXVlc3RlZCgpCi0KLXB1YmxpYyBib29sZWFuIGlzTG9uZ0NsaWNrYWJsZSgpCi0KLXB1YmxpYyBib29sZWFuIGlzUHJlc3NlZCgpCi0KLXB1YmxpYyBib29sZWFuIGlzUm9vdE5hbWVzcGFjZSgpCi0KLXB1YmxpYyBib29sZWFuIGlzU2F2ZUVuYWJsZWQoKQotQGFuZHJvaWQudmlldy5WaWV3RGVidWckRXhwb3J0ZWRQcm9wZXJ0eQotcHVibGljIGJvb2xlYW4gaXNTZWxlY3RlZCgpCi0KLXB1YmxpYyBib29sZWFuIGlzU2hvd24oKQotQGFuZHJvaWQudmlldy5WaWV3RGVidWckRXhwb3J0ZWRQcm9wZXJ0eQotcHVibGljIGJvb2xlYW4gaXNTb3VuZEVmZmVjdHNFbmFibGVkKCkKLQotcHVibGljIGJvb2xlYW4gaXNWZXJ0aWNhbEZhZGluZ0VkZ2VFbmFibGVkKCkKLQotcHVibGljIGJvb2xlYW4gaXNWZXJ0aWNhbFNjcm9sbEJhckVuYWJsZWQoKQotCi1wdWJsaWMgZmluYWwgdm9pZCBsYXlvdXQoCi1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIG1lYXN1cmUoCi1pbnQKLWludCkKLQotIHZvaWQgbmVlZEdsb2JhbEF0dHJpYnV0ZXNVcGRhdGUoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBvZmZzZXRMZWZ0QW5kUmlnaHQoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIG9mZnNldFRvcEFuZEJvdHRvbSgKLWludCkKLQotcHJvdGVjdGVkIHZvaWQgb25BbmltYXRpb25FbmQoKQotCi1wcm90ZWN0ZWQgdm9pZCBvbkFuaW1hdGlvblN0YXJ0KCkKLQotcHJvdGVjdGVkIHZvaWQgb25BdHRhY2hlZFRvV2luZG93KCkKLQotcHJvdGVjdGVkIHZvaWQgb25DcmVhdGVDb250ZXh0TWVudSgKLWFuZHJvaWQudmlldy5Db250ZXh0TWVudSkKLQotcHJvdGVjdGVkIGludFtdIG9uQ3JlYXRlRHJhd2FibGVTdGF0ZSgKLWludCkKLQotcHJvdGVjdGVkIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3coKQotCi1wcm90ZWN0ZWQgdm9pZCBvbkRyYXcoCi1hbmRyb2lkLmdyYXBoaWNzLkNhbnZhcykKLQotcHJvdGVjdGVkIHZvaWQgb25GaW5pc2hJbmZsYXRlKCkKLQotcHJvdGVjdGVkIHZvaWQgb25Gb2N1c0NoYW5nZWQoCi1ib29sZWFuCi1pbnQKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdCkKLQotcHVibGljIGJvb2xlYW4gb25LZXlEb3duKAotaW50Ci1hbmRyb2lkLnZpZXcuS2V5RXZlbnQpCi0KLXB1YmxpYyBib29sZWFuIG9uS2V5TXVsdGlwbGUoCi1pbnQKLWludAotYW5kcm9pZC52aWV3LktleUV2ZW50KQotCi1wdWJsaWMgYm9vbGVhbiBvbktleVNob3J0Y3V0KAotaW50Ci1hbmRyb2lkLnZpZXcuS2V5RXZlbnQpCi0KLXB1YmxpYyBib29sZWFuIG9uS2V5VXAoCi1pbnQKLWFuZHJvaWQudmlldy5LZXlFdmVudCkKLQotcHJvdGVjdGVkIHZvaWQgb25MYXlvdXQoCi1ib29sZWFuCi1pbnQKLWludAotaW50Ci1pbnQpCi0KLXByb3RlY3RlZCB2b2lkIG9uTWVhc3VyZSgKLWludAotaW50KQotCi1wcm90ZWN0ZWQgdm9pZCBvblJlc3RvcmVJbnN0YW5jZVN0YXRlKAotYW5kcm9pZC5vcy5QYXJjZWxhYmxlKQotCi1wcm90ZWN0ZWQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlIG9uU2F2ZUluc3RhbmNlU3RhdGUoKQotCi1wcm90ZWN0ZWQgdm9pZCBvblNjcm9sbENoYW5nZWQoCi1pbnQKLWludAotaW50Ci1pbnQpCi0KLXByb3RlY3RlZCBib29sZWFuIG9uU2V0QWxwaGEoCi1pbnQpCi0KLXByb3RlY3RlZCB2b2lkIG9uU2l6ZUNoYW5nZWQoCi1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudCgKLWFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCkKLQotcHVibGljIGJvb2xlYW4gb25UcmFja2JhbGxFdmVudCgKLWFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCkKLQotcHVibGljIHZvaWQgb25XaW5kb3dGb2N1c0NoYW5nZWQoCi1ib29sZWFuKQotCi1wcm90ZWN0ZWQgdm9pZCBvbldpbmRvd1Zpc2liaWxpdHlDaGFuZ2VkKAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBwZXJmb3JtQ2xpY2soKQotCi0gdm9pZCBwZXJmb3JtQ29sbGVjdFZpZXdBdHRyaWJ1dGVzKAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBwZXJmb3JtTG9uZ0NsaWNrKCkKLQotcHJvdGVjdGVkIHZvaWQgcGxheVNvdW5kRWZmZWN0KAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBwb3N0KAotamF2YS5sYW5nLlJ1bm5hYmxlKQotCi1wdWJsaWMgYm9vbGVhbiBwb3N0RGVsYXllZCgKLWphdmEubGFuZy5SdW5uYWJsZQotbG9uZykKLQotcHVibGljIHZvaWQgcG9zdEludmFsaWRhdGUoKQotCi1wdWJsaWMgdm9pZCBwb3N0SW52YWxpZGF0ZSgKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgcG9zdEludmFsaWRhdGVEZWxheWVkKAotbG9uZykKLQotcHVibGljIHZvaWQgcG9zdEludmFsaWRhdGVEZWxheWVkKAotbG9uZwotaW50Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCByZWZyZXNoRHJhd2FibGVTdGF0ZSgpCi0KLXB1YmxpYyBib29sZWFuIHJlbW92ZUNhbGxiYWNrcygKLWphdmEubGFuZy5SdW5uYWJsZSkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gcmVxdWVzdEZvY3VzKCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gcmVxdWVzdEZvY3VzKAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiByZXF1ZXN0Rm9jdXMoCi1pbnQKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gcmVxdWVzdEZvY3VzRnJvbVRvdWNoKCkKLQotcHVibGljIHZvaWQgcmVxdWVzdExheW91dCgpCi0KLXB1YmxpYyBib29sZWFuIHJlcXVlc3RSZWN0YW5nbGVPblNjcmVlbigKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdCkKLQotcHVibGljIGJvb2xlYW4gcmVxdWVzdFJlY3RhbmdsZU9uU2NyZWVuKAotYW5kcm9pZC5ncmFwaGljcy5SZWN0Ci1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMYW5kcm9pZC91dGlsL1NwYXJzZUFycmF5PExhbmRyb2lkL29zL1BhcmNlbGFibGU7PjspViApCi1wdWJsaWMgdm9pZCByZXN0b3JlSGllcmFyY2h5U3RhdGUoCi1hbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXkpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExhbmRyb2lkL3V0aWwvU3BhcnNlQXJyYXk8TGFuZHJvaWQvb3MvUGFyY2VsYWJsZTs+OylWICkKLXB1YmxpYyB2b2lkIHNhdmVIaWVyYXJjaHlTdGF0ZSgKLWFuZHJvaWQudXRpbC5TcGFyc2VBcnJheSkKLQotcHVibGljIHZvaWQgc2NoZWR1bGVEcmF3YWJsZSgKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUKLWphdmEubGFuZy5SdW5uYWJsZQotbG9uZykKLQotcHVibGljIHZvaWQgc2Nyb2xsQnkoCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgc2Nyb2xsVG8oCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgc2V0QW5pbWF0aW9uKAotYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb24pCi0KLXB1YmxpYyB2b2lkIHNldEJhY2tncm91bmRDb2xvcigKLWludCkKLQotcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZERyYXdhYmxlKAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSkKLQotcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZFJlc291cmNlKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRDbGlja2FibGUoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXREcmF3aW5nQ2FjaGVCYWNrZ3JvdW5kQ29sb3IoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldERyYXdpbmdDYWNoZUVuYWJsZWQoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXREcmF3aW5nQ2FjaGVRdWFsaXR5KAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXREdXBsaWNhdGVQYXJlbnRTdGF0ZUVuYWJsZWQoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRFbmFibGVkKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0RmFkaW5nRWRnZUxlbmd0aCgKLWludCkKLQotIHZvaWQgc2V0RmxhZ3MoCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgc2V0Rm9jdXNhYmxlKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0Rm9jdXNhYmxlSW5Ub3VjaE1vZGUoCi1ib29sZWFuKQotCi1wcm90ZWN0ZWQgYm9vbGVhbiBzZXRGcmFtZSgKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgc2V0SG9yaXpvbnRhbEZhZGluZ0VkZ2VFbmFibGVkKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0SG9yaXpvbnRhbFNjcm9sbEJhckVuYWJsZWQoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRJZCgKLWludCkKLQotcHVibGljIHZvaWQgc2V0SXNSb290TmFtZXNwYWNlKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0S2VlcFNjcmVlbk9uKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0TGF5b3V0UGFyYW1zKAotYW5kcm9pZC52aWV3LlZpZXdHcm91cCRMYXlvdXRQYXJhbXMpCi0KLXB1YmxpYyB2b2lkIHNldExvbmdDbGlja2FibGUoCi1ib29sZWFuKQotCi1wcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRNZWFzdXJlZERpbWVuc2lvbigKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRNaW5pbXVtSGVpZ2h0KAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRNaW5pbXVtV2lkdGgoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldE5leHRGb2N1c0Rvd25JZCgKLWludCkKLQotcHVibGljIHZvaWQgc2V0TmV4dEZvY3VzTGVmdElkKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXROZXh0Rm9jdXNSaWdodElkKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXROZXh0Rm9jdXNVcElkKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRPbkNsaWNrTGlzdGVuZXIoCi1hbmRyb2lkLnZpZXcuVmlldyRPbkNsaWNrTGlzdGVuZXIpCi0KLXB1YmxpYyB2b2lkIHNldE9uQ3JlYXRlQ29udGV4dE1lbnVMaXN0ZW5lcigKLWFuZHJvaWQudmlldy5WaWV3JE9uQ3JlYXRlQ29udGV4dE1lbnVMaXN0ZW5lcikKLQotcHVibGljIHZvaWQgc2V0T25Gb2N1c0NoYW5nZUxpc3RlbmVyKAotYW5kcm9pZC52aWV3LlZpZXckT25Gb2N1c0NoYW5nZUxpc3RlbmVyKQotCi1wdWJsaWMgdm9pZCBzZXRPbktleUxpc3RlbmVyKAotYW5kcm9pZC52aWV3LlZpZXckT25LZXlMaXN0ZW5lcikKLQotcHVibGljIHZvaWQgc2V0T25Mb25nQ2xpY2tMaXN0ZW5lcigKLWFuZHJvaWQudmlldy5WaWV3JE9uTG9uZ0NsaWNrTGlzdGVuZXIpCi0KLXB1YmxpYyB2b2lkIHNldE9uVG91Y2hMaXN0ZW5lcigKLWFuZHJvaWQudmlldy5WaWV3JE9uVG91Y2hMaXN0ZW5lcikKLQotcHVibGljIHZvaWQgc2V0UGFkZGluZygKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgc2V0UHJlc3NlZCgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldFNhdmVFbmFibGVkKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0U2Nyb2xsQmFyU3R5bGUoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0U291bmRFZmZlY3RzRW5hYmxlZCgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldFRhZygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2lkIHNldFRvdWNoRGVsZWdhdGUoCi1hbmRyb2lkLnZpZXcuVG91Y2hEZWxlZ2F0ZSkKLQotcHVibGljIHZvaWQgc2V0VmVydGljYWxGYWRpbmdFZGdlRW5hYmxlZCgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldFZlcnRpY2FsU2Nyb2xsQmFyRW5hYmxlZCgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldFZpc2liaWxpdHkoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldFdpbGxOb3RDYWNoZURyYXdpbmcoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRXaWxsTm90RHJhdygKLWJvb2xlYW4pCi0KLXB1YmxpYyBib29sZWFuIHNob3dDb250ZXh0TWVudSgpCi0KLXB1YmxpYyB2b2lkIHN0YXJ0QW5pbWF0aW9uKAotYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb24pCi0KLSB2b2lkIHVuRm9jdXMoKQotCi1wdWJsaWMgdm9pZCB1bnNjaGVkdWxlRHJhd2FibGUoCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlKQotCi1wdWJsaWMgdm9pZCB1bnNjaGVkdWxlRHJhd2FibGUoCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlCi1qYXZhLmxhbmcuUnVubmFibGUpCi0KLXByb3RlY3RlZCBib29sZWFuIHZlcmlmeURyYXdhYmxlKAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSkKLUBhbmRyb2lkLnZpZXcuVmlld0RlYnVnJEV4cG9ydGVkUHJvcGVydHkKLXB1YmxpYyBib29sZWFuIHdpbGxOb3RDYWNoZURyYXdpbmcoKQotQGFuZHJvaWQudmlldy5WaWV3RGVidWckRXhwb3J0ZWRQcm9wZXJ0eQotcHVibGljIGJvb2xlYW4gd2lsbE5vdERyYXcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9TdXJmYWNlVmlldyRNeVdpbmRvdzsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQudmlldy5TdXJmYWNlVmlldyBleHRlbmRzIGFuZHJvaWQudmlldy5WaWV3Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcKLQotc3RhdGljIGZpbmFsIGludCBHRVRfTkVXX1NVUkZBQ0VfTVNHCi0KLXN0YXRpYyBmaW5hbCBpbnQgS0VFUF9TQ1JFRU5fT05fTVNHCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEFHCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gbG9jYWxMT0dWCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9BcnJheUxpc3Q8TGFuZHJvaWQvdmlldy9TdXJmYWNlSG9sZGVyJENhbGxiYWNrOz47ICkKLWZpbmFsIGphdmEudXRpbC5BcnJheUxpc3QgbUNhbGxiYWNrcwotCi1maW5hbCBhbmRyb2lkLmdyYXBoaWNzLlJlY3QgbUNvdmVyZWRJbnNldHMKLQotIGJvb2xlYW4gbURlc3Ryb3lSZXBvcnROZWVkZWQKLQotIGJvb2xlYW4gbURyYXdpbmdTdG9wcGVkCi0KLSBpbnQgbUZvcm1hdAotCi1maW5hbCBhbmRyb2lkLm9zLkhhbmRsZXIgbUhhbmRsZXIKLQotIGJvb2xlYW4gbUhhdmVGcmFtZQotCi0gaW50IG1IZWlnaHQKLQotIGJvb2xlYW4gbUlzQ3JlYXRpbmcKLQotIGxvbmcgbUxhc3RMb2NrVGltZQotCi1maW5hbCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlciRMYXlvdXRQYXJhbXMgbUxheW91dAotCi0gaW50IG1MZWZ0Ci0KLSBib29sZWFuIG1OZXdTdXJmYWNlTmVlZGVkCi0KLSBpbnQgbVJlcXVlc3RlZEZvcm1hdAotCi0gaW50IG1SZXF1ZXN0ZWRIZWlnaHQKLQotIGludCBtUmVxdWVzdGVkVHlwZQotCi0gYm9vbGVhbiBtUmVxdWVzdGVkVmlzaWJsZQotCi0gaW50IG1SZXF1ZXN0ZWRXaWR0aAotCi0gYW5kcm9pZC52aWV3LklXaW5kb3dTZXNzaW9uIG1TZXNzaW9uCi0KLWZpbmFsIGFuZHJvaWQudmlldy5TdXJmYWNlIG1TdXJmYWNlCi0KLWZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUmVjdCBtU3VyZmFjZUZyYW1lCi0KLXByaXZhdGUgYW5kcm9pZC52aWV3LlN1cmZhY2VIb2xkZXIgbVN1cmZhY2VIb2xkZXIKLQotZmluYWwgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50TG9jayBtU3VyZmFjZUxvY2sKLQotIGludCBtVG9wCi0KLSBpbnQgbVR5cGUKLQotIGJvb2xlYW4gbVZpc2libGUKLQotIGludCBtV2lkdGgKLQotZmluYWwgYW5kcm9pZC5ncmFwaGljcy5SZWN0IG1XaW5GcmFtZQotCi0gYW5kcm9pZC52aWV3LlN1cmZhY2VWaWV3JE15V2luZG93IG1XaW5kb3cKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ci1pbnQpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQxMDAoCi1hbmRyb2lkLnZpZXcuU3VyZmFjZVZpZXcKLWJvb2xlYW4pCi0KLXByaXZhdGUgdm9pZCByZXBvcnRTdXJmYWNlRGVzdHJveWVkKCkKLQotcHJpdmF0ZSB2b2lkIHVwZGF0ZVdpbmRvdygKLWJvb2xlYW4pCi0KLXByb3RlY3RlZCB2b2lkIGRpc3BhdGNoRHJhdygKLWFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzKQotCi1wdWJsaWMgdm9pZCBkcmF3KAotYW5kcm9pZC5ncmFwaGljcy5DYW52YXMpCi0KLXB1YmxpYyBib29sZWFuIGdhdGhlclRyYW5zcGFyZW50UmVnaW9uKAotYW5kcm9pZC5ncmFwaGljcy5SZWdpb24pCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlciBnZXRIb2xkZXIoKQotCi0gdm9pZCBoYW5kbGVHZXROZXdTdXJmYWNlKCkKLQotcHJvdGVjdGVkIHZvaWQgb25BdHRhY2hlZFRvV2luZG93KCkKLQotcHJvdGVjdGVkIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3coKQotCi1wcm90ZWN0ZWQgdm9pZCBvbk1lYXN1cmUoCi1pbnQKLWludCkKLQotcHJvdGVjdGVkIHZvaWQgb25TY3JvbGxDaGFuZ2VkKAotaW50Ci1pbnQKLWludAotaW50KQotCi1wcm90ZWN0ZWQgdm9pZCBvblNpemVDaGFuZ2VkKAotaW50Ci1pbnQKLWludAotaW50KQotCi1wcm90ZWN0ZWQgdm9pZCBvbldpbmRvd1Zpc2liaWxpdHlDaGFuZ2VkKAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQudmlldy5Ub3VjaERlbGVnYXRlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQk9WRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCRUxPVwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUT19MRUZUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPX1JJR0hUCi0KLXByaXZhdGUgYW5kcm9pZC5ncmFwaGljcy5SZWN0IG1Cb3VuZHMKLQotcHJpdmF0ZSBib29sZWFuIG1EZWxlZ2F0ZVRhcmdldGVkCi0KLXByaXZhdGUgYW5kcm9pZC52aWV3LlZpZXcgbURlbGVnYXRlVmlldwotCi1wcml2YXRlIGFuZHJvaWQuZ3JhcGhpY3MuUmVjdCBtU2xvcEJvdW5kcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudCgKLWFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLnZpZXcuVmVsb2NpdHlUcmFja2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRwotCi1zdGF0aWMgZmluYWwgaW50IExPTkdFU1RfUEFTVF9USU1FCi0KLXN0YXRpYyBmaW5hbCBpbnQgTlVNX1BBU1QKLQotc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEFHCi0KLXN0YXRpYyBmaW5hbCBib29sZWFuIGxvY2FsTE9HVgotCi1zdGF0aWMgZmluYWwgYW5kcm9pZC52aWV3LlZlbG9jaXR5VHJhY2tlcltdIG1Qb29sCi0KLWZpbmFsIGxvbmdbXSBtUGFzdFRpbWUKLQotZmluYWwgZmxvYXRbXSBtUGFzdFgKLQotZmluYWwgZmxvYXRbXSBtUGFzdFkKLQotIGZsb2F0IG1YVmVsb2NpdHkKLQotIGZsb2F0IG1ZVmVsb2NpdHkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIHZvaWQgYWRkUG9pbnQoCi1mbG9hdAotZmxvYXQKLWxvbmcpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC52aWV3LlZlbG9jaXR5VHJhY2tlciBvYnRhaW4oKQotCi1wdWJsaWMgdm9pZCBhZGRNb3ZlbWVudCgKLWFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCkKLQotcHVibGljIHZvaWQgY2xlYXIoKQotCi1wdWJsaWMgdm9pZCBjb21wdXRlQ3VycmVudFZlbG9jaXR5KAotaW50KQotCi1wdWJsaWMgZmxvYXQgZ2V0WFZlbG9jaXR5KCkKLQotcHVibGljIGZsb2F0IGdldFlWZWxvY2l0eSgpCi0KLXB1YmxpYyB2b2lkIHJlY3ljbGUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9NDEwNCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3ZpZXcvVmlldzsgKQotIGNsYXNzIGFuZHJvaWQudmlldy5WaWV3JDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDQgbmFtZSA9U291bmRFZmZlY3RQbGF5ZXIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9WaWV3JEF0dGFjaEluZm87ICkKLWFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLnZpZXcuVmlldyRBdHRhY2hJbmZvJFNvdW5kRWZmZWN0UGxheWVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHBsYXlTb3VuZEVmZmVjdCgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9QXR0YWNoSW5mbyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC92aWV3L1ZpZXc7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9WaWV3JEF0dGFjaEluZm8kU291bmRFZmZlY3RQbGF5ZXI7ICkKLSBjbGFzcyBhbmRyb2lkLnZpZXcuVmlldyRBdHRhY2hJbmZvIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgaW50IElOVkFMSURBVEVfTVNHCi0KLXN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJREFURV9SRUNUX01TRwotCi0gYm9vbGVhbiBtQXR0cmlidXRlc0NoYW5nZWQKLQotIGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzIG1DYW52YXMKLQotIGxvbmcgbURyYXdpbmdUaW1lCi0KLWZpbmFsIGFuZHJvaWQub3MuSGFuZGxlciBtSGFuZGxlcgotCi0gYm9vbGVhbiBtSGFzV2luZG93Rm9jdXMKLQotIGJvb2xlYW4gbUluVG91Y2hNb2RlCi0KLSBib29sZWFuIG1LZWVwU2NyZWVuT24KLQotIGFuZHJvaWQub3MuSUJpbmRlciBtUGFuZWxQYXJlbnRXaW5kb3dUb2tlbgotCi0gYm9vbGVhbiBtUmVjb21wdXRlR2xvYmFsQXR0cmlidXRlcwotCi0gYW5kcm9pZC52aWV3LklXaW5kb3dTZXNzaW9uIG1TZXNzaW9uCi0KLSBhbmRyb2lkLnZpZXcuVmlldyRBdHRhY2hJbmZvJFNvdW5kRWZmZWN0UGxheWVyIG1Tb3VuZEVmZmVjdFBsYXllcgotCi0gYW5kcm9pZC52aWV3LlN1cmZhY2UgbVN1cmZhY2UKLQotZmluYWwgYW5kcm9pZC52aWV3LlZpZXdUcmVlT2JzZXJ2ZXIgbVRyZWVPYnNlcnZlcgotCi0gaW50IG1XaW5kb3dMZWZ0Ci0KLSBhbmRyb2lkLm9zLklCaW5kZXIgbVdpbmRvd1Rva2VuCi0KLSBpbnQgbVdpbmRvd1RvcAotCi0gaW50IG1XaW5kb3dWaXNpYmlsaXR5Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5IYW5kbGVyKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLkhhbmRsZXIKLWFuZHJvaWQudmlldy5WaWV3JEF0dGFjaEluZm8kU291bmRFZmZlY3RQbGF5ZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC92aWV3L1ZpZXckQmFzZVNhdmVkU3RhdGU7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9WaWV3JEJhc2VTYXZlZFN0YXRlOyApCi1maW5hbCBjbGFzcyBhbmRyb2lkLnZpZXcuVmlldyRCYXNlU2F2ZWRTdGF0ZSQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGFuZHJvaWQudmlldy5WaWV3JEJhc2VTYXZlZFN0YXRlIGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgYW5kcm9pZC52aWV3LlZpZXckQmFzZVNhdmVkU3RhdGVbXSBuZXdBcnJheSgKLWludCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3RbXSBuZXdBcnJheSgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC92aWV3L1ZpZXc7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1CYXNlU2F2ZWRTdGF0ZSApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC52aWV3LlZpZXckQmFzZVNhdmVkU3RhdGUgZXh0ZW5kcyBhbmRyb2lkLnZpZXcuQWJzU2F2ZWRTdGF0ZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC92aWV3L1ZpZXckQmFzZVNhdmVkU3RhdGU7PjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvciBDUkVBVE9SCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5QYXJjZWxhYmxlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1DaGVja0ZvckxvbmdQcmVzcyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC92aWV3L1ZpZXc7ICkKLSBjbGFzcyBhbmRyb2lkLnZpZXcuVmlldyRDaGVja0ZvckxvbmdQcmVzcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmxhbmcuUnVubmFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBpbnQgbU9yaWdpbmFsV2luZG93QXR0YWNoQ291bnQKLQotZmluYWwgYW5kcm9pZC52aWV3LlZpZXcgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXB1YmxpYyB2b2lkIHJlbWVtYmVyV2luZG93QXR0YWNoQ291bnQoKQotCi1wdWJsaWMgdm9pZCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1NZWFzdXJlU3BlYyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC92aWV3L1ZpZXc7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnZpZXcuVmlldyRNZWFzdXJlU3BlYyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRfTU9TVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWEFDVExZCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNT0RFX01BU0sKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PREVfU0hJRlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5TUEVDSUZJRUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGludCBnZXRNb2RlKAotaW50KQotCi1wdWJsaWMgc3RhdGljIGludCBnZXRTaXplKAotaW50KQotCi1wdWJsaWMgc3RhdGljIGludCBtYWtlTWVhc3VyZVNwZWMoCi1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3ZpZXcvVmlldzsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPU9uTG9uZ0NsaWNrTGlzdGVuZXIgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLnZpZXcuVmlldyRPbkxvbmdDbGlja0xpc3RlbmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIG9uTG9uZ0NsaWNrKAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPU9uVG91Y2hMaXN0ZW5lciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC92aWV3L1ZpZXc7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC52aWV3LlZpZXckT25Ub3VjaExpc3RlbmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIG9uVG91Y2goCi1hbmRyb2lkLnZpZXcuVmlldwotYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3ZpZXcvVmlldzsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1TY3JvbGxhYmlsaXR5Q2FjaGUgKQotIGNsYXNzIGFuZHJvaWQudmlldy5WaWV3JFNjcm9sbGFiaWxpdHlDYWNoZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGludCBmYWRpbmdFZGdlTGVuZ3RoCi0KLXByaXZhdGUgaW50IG1MYXN0Q29sb3IKLQotcHVibGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4IG1hdHJpeAotCi1wdWJsaWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYWludCBwYWludAotCi1wdWJsaWMgYW5kcm9pZC53aWRnZXQuU2Nyb2xsQmFyRHJhd2FibGUgc2Nyb2xsQmFyCi0KLXB1YmxpYyBpbnQgc2Nyb2xsQmFyU2l6ZQotCi1wdWJsaWMgYW5kcm9pZC5ncmFwaGljcy5TaGFkZXIgc2hhZGVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgc2V0RmFkZUNvbG9yKAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3ZpZXcvVmlldzsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xOCBuYW1lID1VbnNldFByZXNzZWRTdGF0ZSApCi1maW5hbCBjbGFzcyBhbmRyb2lkLnZpZXcuVmlldyRVbnNldFByZXNzZWRTdGF0ZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmxhbmcuUnVubmFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC52aWV3LlZpZXcgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQudmlldy5WaWV3KQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLnZpZXcuVmlldwotYW5kcm9pZC52aWV3LlZpZXckMSkKLQotcHVibGljIHZvaWQgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnZpZXcuVmlld0NvbmZpZ3VyYXRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFREdFX1NMT1AKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZBRElOR19FREdFX0xFTkdUSAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR0xPQkFMX0FDVElPTlNfS0VZX1RJTUVPVVQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEpVTVBfVEFQX1RJTUVPVVQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExPTkdfUFJFU1NfVElNRU9VVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYSU1VTV9EUkFXSU5HX0NBQ0hFX1NJWkUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1JTklNVU1fRkxJTkdfVkVMT0NJVFkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBSRVNTRURfU1RBVEVfRFVSQVRJT04KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNDUk9MTF9CQVJfU0laRQotCi1wcml2YXRlIHN0YXRpYyBmbG9hdCBTQ1JPTExfRlJJQ1RJT04KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRBUF9USU1FT1VUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT1VDSF9TTE9QCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXSU5ET1dfVE9VQ0hfU0xPUAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWk9PTV9DT05UUk9MU19USU1FT1VUCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGludCBnZXRFZGdlU2xvcCgpCi0KLXB1YmxpYyBzdGF0aWMgaW50IGdldEZhZGluZ0VkZ2VMZW5ndGgoKQotCi1wdWJsaWMgc3RhdGljIGxvbmcgZ2V0R2xvYmFsQWN0aW9uS2V5VGltZW91dCgpCi0KLXB1YmxpYyBzdGF0aWMgaW50IGdldEp1bXBUYXBUaW1lb3V0KCkKLQotcHVibGljIHN0YXRpYyBpbnQgZ2V0TG9uZ1ByZXNzVGltZW91dCgpCi0KLXB1YmxpYyBzdGF0aWMgaW50IGdldE1heGltdW1EcmF3aW5nQ2FjaGVTaXplKCkKLQotcHVibGljIHN0YXRpYyBpbnQgZ2V0TWluaW11bUZsaW5nVmVsb2NpdHkoKQotCi1wdWJsaWMgc3RhdGljIGludCBnZXRQcmVzc2VkU3RhdGVEdXJhdGlvbigpCi0KLXB1YmxpYyBzdGF0aWMgaW50IGdldFNjcm9sbEJhclNpemUoKQotCi1wdWJsaWMgc3RhdGljIGZsb2F0IGdldFNjcm9sbEZyaWN0aW9uKCkKLQotcHVibGljIHN0YXRpYyBpbnQgZ2V0VGFwVGltZW91dCgpCi0KLXB1YmxpYyBzdGF0aWMgaW50IGdldFRvdWNoU2xvcCgpCi0KLXB1YmxpYyBzdGF0aWMgaW50IGdldFdpbmRvd1RvdWNoU2xvcCgpCi0KLXB1YmxpYyBzdGF0aWMgbG9uZyBnZXRab29tQ29udHJvbHNUaW1lb3V0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1maW5hbCBjbGFzcyBhbmRyb2lkLnZpZXcuVmlld0RlYnVnJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5sYW5nLlJ1bm5hYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQudmlldy5WaWV3IHZhbCR2aWV3Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXB1YmxpYyB2b2lkIHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotZmluYWwgY2xhc3MgYW5kcm9pZC52aWV3LlZpZXdEZWJ1ZyQyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5SdW5uYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcFtdIHZhbCRjYWNoZQotCi1maW5hbCBhbmRyb2lkLnZpZXcuVmlldyB2YWwkY2FwdHVyZVZpZXcKLQotZmluYWwgYm9vbGVhbiB2YWwkaGFzQ2FjaGUKLQotZmluYWwgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2ggdmFsJGxhdGNoCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYm9vbGVhbgotYW5kcm9pZC52aWV3LlZpZXcKLWFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwW10KLWphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoKQotCi1wdWJsaWMgdm9pZCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb24gKHZhbHVlID1MamF2YS9sYW5nL2Fubm90YXRpb24vUmV0ZW50aW9uUG9saWN5OyFSVU5USU1FICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OTczNyBuYW1lID1DYXB0dXJlZFZpZXdQcm9wZXJ0eSApCi1AZGFsdmlrLmFubm90YXRpb24uQW5ub3RhdGlvbkRlZmF1bHQgKHZhbHVlID1MYW5kcm9pZC92aWV3L1ZpZXdEZWJ1ZyRDYXB0dXJlZFZpZXdQcm9wZXJ0eTs6W3JldHJpZXZlUmV0dXJuID1mYWxzZV0gKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9WaWV3RGVidWc7ICkKLUBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQgKHZhbHVlID1MamF2YS9sYW5nL2Fubm90YXRpb24vRWxlbWVudFR5cGU7IUZJRUxETGphdmEvbGFuZy9hbm5vdGF0aW9uL0VsZW1lbnRUeXBlOyFNRVRIT0QgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLnZpZXcuVmlld0RlYnVnJENhcHR1cmVkVmlld1Byb3BlcnR5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiByZXRyaWV2ZVJldHVybigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbiAodmFsdWUgPUxqYXZhL2xhbmcvYW5ub3RhdGlvbi9SZXRlbnRpb25Qb2xpY3k7IVJVTlRJTUUgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9WaWV3RGVidWc7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRGVmYXVsdCAodmFsdWUgPUxhbmRyb2lkL3ZpZXcvVmlld0RlYnVnJEV4cG9ydGVkUHJvcGVydHk7OltkZWVwRXhwb3J0ID1mYWxzZSwgbWFwcGluZyA9LCBwcmVmaXggPSwgcmVzb2x2ZUlkID1mYWxzZV0gKQotQGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldCAodmFsdWUgPUxqYXZhL2xhbmcvYW5ub3RhdGlvbi9FbGVtZW50VHlwZTshRklFTERMamF2YS9sYW5nL2Fubm90YXRpb24vRWxlbWVudFR5cGU7IU1FVEhPRCApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTk3MzcgbmFtZSA9RXhwb3J0ZWRQcm9wZXJ0eSApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQudmlldy5WaWV3RGVidWckRXhwb3J0ZWRQcm9wZXJ0eSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZGVlcEV4cG9ydCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLnZpZXcuVmlld0RlYnVnJEludFRvU3RyaW5nW10gbWFwcGluZygpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHJlc29sdmVJZCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvRW51bTxMYW5kcm9pZC92aWV3L1ZpZXdEZWJ1ZyRIaWVyYXJjaHlUcmFjZVR5cGU7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9WaWV3RGVidWc7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTY0MDkgbmFtZSA9SGllcmFyY2h5VHJhY2VUeXBlICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLnZpZXcuVmlld0RlYnVnJEhpZXJhcmNoeVRyYWNlVHlwZSBleHRlbmRzIGphdmEubGFuZy5FbnVtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGFuZHJvaWQudmlldy5WaWV3RGVidWckSGllcmFyY2h5VHJhY2VUeXBlW10gJFZBTFVFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudmlldy5WaWV3RGVidWckSGllcmFyY2h5VHJhY2VUeXBlIEJVSUxEX0NBQ0hFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC52aWV3LlZpZXdEZWJ1ZyRIaWVyYXJjaHlUcmFjZVR5cGUgRFJBVwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudmlldy5WaWV3RGVidWckSGllcmFyY2h5VHJhY2VUeXBlIElOVkFMSURBVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnZpZXcuVmlld0RlYnVnJEhpZXJhcmNoeVRyYWNlVHlwZSBJTlZBTElEQVRFX0NISUxECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC52aWV3LlZpZXdEZWJ1ZyRIaWVyYXJjaHlUcmFjZVR5cGUgSU5WQUxJREFURV9DSElMRF9JTl9QQVJFTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnZpZXcuVmlld0RlYnVnJEhpZXJhcmNoeVRyYWNlVHlwZSBPTl9MQVlPVVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnZpZXcuVmlld0RlYnVnJEhpZXJhcmNoeVRyYWNlVHlwZSBPTl9NRUFTVVJFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC52aWV3LlZpZXdEZWJ1ZyRIaWVyYXJjaHlUcmFjZVR5cGUgUkVRVUVTVF9MQVlPVVQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClWICkKLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC52aWV3LlZpZXdEZWJ1ZyRIaWVyYXJjaHlUcmFjZVR5cGUgdmFsdWVPZigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC52aWV3LlZpZXdEZWJ1ZyRIaWVyYXJjaHlUcmFjZVR5cGVbXSB2YWx1ZXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb24gKHZhbHVlID1MamF2YS9sYW5nL2Fubm90YXRpb24vUmV0ZW50aW9uUG9saWN5OyFSVU5USU1FICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OTczNyBuYW1lID1JbnRUb1N0cmluZyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC92aWV3L1ZpZXdEZWJ1ZzsgKQotQGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldCAodmFsdWUgPUxqYXZhL2xhbmcvYW5ub3RhdGlvbi9FbGVtZW50VHlwZTshVFlQRSApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQudmlldy5WaWV3RGVidWckSW50VG9TdHJpbmcgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZnJvbSgpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIHRvKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPVJlY3ljbGVyVHJhY2UgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9WaWV3RGVidWc7ICkKLSBjbGFzcyBhbmRyb2lkLnZpZXcuVmlld0RlYnVnJFJlY3ljbGVyVHJhY2UgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBpbnQgaW5kZXhPblNjcmVlbgotCi1wdWJsaWMgaW50IHBvc2l0aW9uCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuVmlld0RlYnVnJFJlY3ljbGVyVHJhY2VUeXBlIHR5cGUKLQotcHVibGljIGludCB2aWV3Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQudmlldy5WaWV3RGVidWckMSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9FbnVtPExhbmRyb2lkL3ZpZXcvVmlld0RlYnVnJFJlY3ljbGVyVHJhY2VUeXBlOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTY0MDkgbmFtZSA9UmVjeWNsZXJUcmFjZVR5cGUgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9WaWV3RGVidWc7ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLnZpZXcuVmlld0RlYnVnJFJlY3ljbGVyVHJhY2VUeXBlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYW5kcm9pZC52aWV3LlZpZXdEZWJ1ZyRSZWN5Y2xlclRyYWNlVHlwZVtdICRWQUxVRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnZpZXcuVmlld0RlYnVnJFJlY3ljbGVyVHJhY2VUeXBlIEJJTkRfVklFVwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudmlldy5WaWV3RGVidWckUmVjeWNsZXJUcmFjZVR5cGUgTU9WRV9GUk9NX0FDVElWRV9UT19TQ1JBUF9IRUFQCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC52aWV3LlZpZXdEZWJ1ZyRSZWN5Y2xlclRyYWNlVHlwZSBNT1ZFX1RPX0FDVElWRV9IRUFQCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC52aWV3LlZpZXdEZWJ1ZyRSZWN5Y2xlclRyYWNlVHlwZSBNT1ZFX1RPX1NDUkFQX0hFQVAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnZpZXcuVmlld0RlYnVnJFJlY3ljbGVyVHJhY2VUeXBlIE5FV19WSUVXCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC52aWV3LlZpZXdEZWJ1ZyRSZWN5Y2xlclRyYWNlVHlwZSBSRUNZQ0xFX0ZST01fQUNUSVZFX0hFQVAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnZpZXcuVmlld0RlYnVnJFJlY3ljbGVyVHJhY2VUeXBlIFJFQ1lDTEVfRlJPTV9TQ1JBUF9IRUFQCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpViApCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQudmlldy5WaWV3RGVidWckUmVjeWNsZXJUcmFjZVR5cGUgdmFsdWVPZigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC52aWV3LlZpZXdEZWJ1ZyRSZWN5Y2xlclRyYWNlVHlwZVtdIHZhbHVlcygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC92aWV3L1ZpZXdEZWJ1ZyRSZWN5Y2xlclRyYWNlO0xhbmRyb2lkL3ZpZXcvVmlld0RlYnVnJFJlY3ljbGVyVHJhY2VUeXBlO0xhbmRyb2lkL3ZpZXcvVmlld0RlYnVnJEhpZXJhcmNoeVRyYWNlVHlwZTtMYW5kcm9pZC92aWV3L1ZpZXdEZWJ1ZyRDYXB0dXJlZFZpZXdQcm9wZXJ0eTtMYW5kcm9pZC92aWV3L1ZpZXdEZWJ1ZyRJbnRUb1N0cmluZztMYW5kcm9pZC92aWV3L1ZpZXdEZWJ1ZyRFeHBvcnRlZFByb3BlcnR5OyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC52aWV3LlZpZXdEZWJ1ZyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENBUFRVUkVfVElNRU9VVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFJFTU9URV9DT01NQU5EX0NBUFRVUkUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSRU1PVEVfQ09NTUFORF9EVU1QCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUkVNT1RFX0NPTU1BTkRfSU5WQUxJREFURQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFJFTU9URV9DT01NQU5EX1JFUVVFU1RfTEFZT1VUCi0KLXN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNZU1RFTV9QUk9QRVJUWV9DQVBUVVJFX0VWRU5UCi0KLXN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNZU1RFTV9QUk9QRVJUWV9DQVBUVVJFX1ZJRVcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIFRSQUNFX0hJRVJBUkNIWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gVFJBQ0VfUkVDWUNMRVIKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0hhc2hNYXA8TGphdmEvbGFuZy9DbGFzczwqPjtbTGphdmEvbGFuZy9yZWZsZWN0L0ZpZWxkOz47ICkKLXByaXZhdGUgc3RhdGljIGphdmEudXRpbC5IYXNoTWFwIG1DYXB0dXJlZFZpZXdGaWVsZHNGb3JDbGFzc2VzCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNoTWFwPExqYXZhL2xhbmcvQ2xhc3M8Kj47W0xqYXZhL2xhbmcvcmVmbGVjdC9NZXRob2Q7PjsgKQotcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLkhhc2hNYXAgbUNhcHR1cmVkVmlld01ldGhvZHNGb3JDbGFzc2VzCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNoTWFwPExqYXZhL2xhbmcvQ2xhc3M8Kj47W0xqYXZhL2xhbmcvcmVmbGVjdC9GaWVsZDs+OyApCi1wcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuSGFzaE1hcCBzRmllbGRzRm9yQ2xhc3NlcwotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIHNIaWVyYXJjaHlUcmFjZVByZWZpeAotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyIHNIaWVyYXJjaHlUcmFjZXMKLQotcHJpdmF0ZSBzdGF0aWMgYW5kcm9pZC52aWV3LlZpZXdSb290IHNIaWVyYXJoY3lSb290Ci1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNoTWFwPExqYXZhL2xhbmcvQ2xhc3M8Kj47W0xqYXZhL2xhbmcvcmVmbGVjdC9NZXRob2Q7PjsgKQotcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLkhhc2hNYXAgc01ldGhvZHNGb3JDbGFzc2VzCi0KLXByaXZhdGUgc3RhdGljIGFuZHJvaWQudmlldy5WaWV3IHNSZWN5Y2xlck93bmVyVmlldwotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIHNSZWN5Y2xlclRyYWNlUHJlZml4Ci1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL3ZpZXcvVmlld0RlYnVnJFJlY3ljbGVyVHJhY2U7PjsgKQotcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLkxpc3Qgc1JlY3ljbGVyVHJhY2VzCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL3ZpZXcvVmlldzs+OyApCi1wcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuTGlzdCBzUmVjeWNsZXJWaWV3cwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBjYXB0dXJlKAotYW5kcm9pZC52aWV3LlZpZXcKLWphdmEuaW8uT3V0cHV0U3RyZWFtCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL0NsYXNzPCo+O0xqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZzsgKQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBjYXB0dXJlZFZpZXdFeHBvcnRGaWVsZHMoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuQ2xhc3MKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcvQ2xhc3M8Kj47TGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOyApCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGNhcHR1cmVkVmlld0V4cG9ydE1ldGhvZHMoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuQ2xhc3MKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvQ2xhc3M8Kj47KVtMamF2YS9sYW5nL3JlZmxlY3QvRmllbGQ7ICkKLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkW10gY2FwdHVyZWRWaWV3R2V0UHJvcGVydHlGaWVsZHMoCi1qYXZhLmxhbmcuQ2xhc3MpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvQ2xhc3M8Kj47KVtMamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kOyApCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2RbXSBjYXB0dXJlZFZpZXdHZXRQcm9wZXJ0eU1ldGhvZHMoCi1qYXZhLmxhbmcuQ2xhc3MpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXN0YXRpYyB2b2lkIGRpc3BhdGNoQ29tbWFuZCgKLWFuZHJvaWQudmlldy5WaWV3Ci1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmlvLk91dHB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBkdW1wKAotYW5kcm9pZC52aWV3LlZpZXcKLWphdmEuaW8uT3V0cHV0U3RyZWFtKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgZHVtcENhcHR1cmVkVmlldygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3QpCi0KLXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZHVtcFZpZXcoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgZHVtcFZpZXdIaWVyYXJjaHkoCi1hbmRyb2lkLnZpZXcuVmlld0dyb3VwCi1qYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgZHVtcFZpZXdIaWVyYXJjaHlXaXRoUHJvcGVydGllcygKLWFuZHJvaWQudmlldy5WaWV3R3JvdXAKLWphdmEuaW8uQnVmZmVyZWRXcml0ZXIKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBkdW1wVmlld1Byb3BlcnRpZXMoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHN0YXRpYyB2b2lkIGR1bXBWaWV3UHJvcGVydGllcygKLWphdmEubGFuZy5PYmplY3QKLWphdmEuaW8uQnVmZmVyZWRXcml0ZXIKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZHVtcFZpZXdXaXRoUHJvcGVydGllcygKLWFuZHJvaWQudmlldy5WaWV3Ci1qYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2lvL0J1ZmZlcmVkV3JpdGVyO0xqYXZhL2xhbmcvQ2xhc3M8Kj47TGphdmEvbGFuZy9TdHJpbmc7KVYgKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHN0YXRpYyB2b2lkIGV4cG9ydEZpZWxkcygKLWphdmEubGFuZy5PYmplY3QKLWphdmEuaW8uQnVmZmVyZWRXcml0ZXIKLWphdmEubGFuZy5DbGFzcwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL09iamVjdDtMamF2YS9pby9CdWZmZXJlZFdyaXRlcjtMamF2YS9sYW5nL0NsYXNzPCo+O0xqYXZhL2xhbmcvU3RyaW5nOylWICkKLXByaXZhdGUgc3RhdGljIHZvaWQgZXhwb3J0TWV0aG9kcygKLWphdmEubGFuZy5PYmplY3QKLWphdmEuaW8uQnVmZmVyZWRXcml0ZXIKLWphdmEubGFuZy5DbGFzcwotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBzdGF0aWMgYW5kcm9pZC52aWV3LlZpZXcgZmluZFZpZXcoCi1hbmRyb2lkLnZpZXcuVmlld0dyb3VwCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIGFuZHJvaWQudmlldy5WaWV3IGZpbmRWaWV3QnlIYXNoQ29kZSgKLWFuZHJvaWQudmlldy5WaWV3Ci1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL0NsYXNzPCo+OylbTGphdmEvbGFuZy9yZWZsZWN0L0ZpZWxkOyApCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZFtdIGdldEV4cG9ydGVkUHJvcGVydHlGaWVsZHMoCi1qYXZhLmxhbmcuQ2xhc3MpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvQ2xhc3M8Kj47KVtMamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kOyApCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2RbXSBnZXRFeHBvcnRlZFByb3BlcnR5TWV0aG9kcygKLWphdmEubGFuZy5DbGFzcykKLQotcHVibGljIHN0YXRpYyBsb25nIGdldFZpZXdJbnN0YW5jZUNvdW50KCkKLQotcHVibGljIHN0YXRpYyBsb25nIGdldFZpZXdSb290SW5zdGFuY2VDb3VudCgpCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgaW52YWxpZGF0ZSgKLWFuZHJvaWQudmlldy5WaWV3Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHN0YXRpYyBib29sZWFuIGlzUmVxdWVzdGVkVmlldygKLWFuZHJvaWQudmlldy5WaWV3Ci1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgcmVxdWVzdExheW91dCgKLWFuZHJvaWQudmlldy5WaWV3Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgc3RhcnRIaWVyYXJjaHlUcmFjaW5nKAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBzdGFydFJlY3ljbGVyVHJhY2luZygKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQudmlldy5WaWV3KQotCi1wdWJsaWMgc3RhdGljIHZvaWQgc3RvcEhpZXJhcmNoeVRyYWNpbmcoKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgc3RvcFJlY3ljbGVyVHJhY2luZygpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZSgKLWFuZHJvaWQudmlldy5WaWV3Ci1hbmRyb2lkLnZpZXcuVmlld0RlYnVnJEhpZXJhcmNoeVRyYWNlVHlwZSkKLQotcHVibGljIHN0YXRpYyB0cmFuc2llbnQgdm9pZCB0cmFjZSgKLWFuZHJvaWQudmlldy5WaWV3Ci1hbmRyb2lkLnZpZXcuVmlld0RlYnVnJFJlY3ljbGVyVHJhY2VUeXBlCi1pbnRbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi0gY2xhc3MgYW5kcm9pZC52aWV3LlZpZXdHcm91cCQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5SdW5uYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQudmlldy5WaWV3R3JvdXApCi0KLXB1YmxpYyB2b2lkIHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotIGNsYXNzIGFuZHJvaWQudmlldy5WaWV3R3JvdXAkMiBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmxhbmcuUnVubmFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC52aWV3LlZpZXdHcm91cCB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLnZpZXcuVmlld0dyb3VwKQotCi1wdWJsaWMgdm9pZCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1MYXlvdXRQYXJhbXMgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9WaWV3R3JvdXA7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnZpZXcuVmlld0dyb3VwJExheW91dFBhcmFtcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMTF9QQVJFTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV1JBUF9DT05URU5UCi1AYW5kcm9pZC52aWV3LlZpZXdEZWJ1ZyRFeHBvcnRlZFByb3BlcnR5IChtYXBwaW5nID1MYW5kcm9pZC92aWV3L1ZpZXdEZWJ1ZyRJbnRUb1N0cmluZzs6W2Zyb20gPTI1NSwgdG8gPUZJTExfUEFSRU5UXUxhbmRyb2lkL3ZpZXcvVmlld0RlYnVnJEludFRvU3RyaW5nOzpbZnJvbSA9MjU0LCB0byA9V1JBUF9DT05URU5UXSApCi1wdWJsaWMgaW50IGhlaWdodAotCi1wdWJsaWMgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5MYXlvdXRBbmltYXRpb25Db250cm9sbGVyJEFuaW1hdGlvblBhcmFtZXRlcnMgbGF5b3V0QW5pbWF0aW9uUGFyYW1ldGVycwotQGFuZHJvaWQudmlldy5WaWV3RGVidWckRXhwb3J0ZWRQcm9wZXJ0eSAobWFwcGluZyA9TGFuZHJvaWQvdmlldy9WaWV3RGVidWckSW50VG9TdHJpbmc7Oltmcm9tID0yNTUsIHRvID1GSUxMX1BBUkVOVF1MYW5kcm9pZC92aWV3L1ZpZXdEZWJ1ZyRJbnRUb1N0cmluZzs6W2Zyb20gPTI1NCwgdG8gPVdSQVBfQ09OVEVOVF0gKQotcHVibGljIGludCB3aWR0aAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC52aWV3LlZpZXdHcm91cCRMYXlvdXRQYXJhbXMpCi0KLXByb3RlY3RlZCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBzaXplVG9TdHJpbmcoCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGRlYnVnKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJvdGVjdGVkIHZvaWQgc2V0QmFzZUF0dHJpYnV0ZXMoCi1hbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXkKLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3ZpZXcvVmlld0dyb3VwOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9TWFyZ2luTGF5b3V0UGFyYW1zICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnZpZXcuVmlld0dyb3VwJE1hcmdpbkxheW91dFBhcmFtcyBleHRlbmRzIGFuZHJvaWQudmlldy5WaWV3R3JvdXAkTGF5b3V0UGFyYW1zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AYW5kcm9pZC52aWV3LlZpZXdEZWJ1ZyRFeHBvcnRlZFByb3BlcnR5Ci1wdWJsaWMgaW50IGJvdHRvbU1hcmdpbgotQGFuZHJvaWQudmlldy5WaWV3RGVidWckRXhwb3J0ZWRQcm9wZXJ0eQotcHVibGljIGludCBsZWZ0TWFyZ2luCi1AYW5kcm9pZC52aWV3LlZpZXdEZWJ1ZyRFeHBvcnRlZFByb3BlcnR5Ci1wdWJsaWMgaW50IHJpZ2h0TWFyZ2luCi1AYW5kcm9pZC52aWV3LlZpZXdEZWJ1ZyRFeHBvcnRlZFByb3BlcnR5Ci1wdWJsaWMgaW50IHRvcE1hcmdpbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC52aWV3LlZpZXdHcm91cCRMYXlvdXRQYXJhbXMpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQudmlldy5WaWV3R3JvdXAkTWFyZ2luTGF5b3V0UGFyYW1zKQotCi1wdWJsaWMgdm9pZCBzZXRNYXJnaW5zKAotaW50Ci1pbnQKLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3ZpZXcvVmlld0dyb3VwOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9T25IaWVyYXJjaHlDaGFuZ2VMaXN0ZW5lciApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQudmlldy5WaWV3R3JvdXAkT25IaWVyYXJjaHlDaGFuZ2VMaXN0ZW5lciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvbkNoaWxkVmlld0FkZGVkKAotYW5kcm9pZC52aWV3LlZpZXcKLWFuZHJvaWQudmlldy5WaWV3KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvbkNoaWxkVmlld1JlbW92ZWQoCi1hbmRyb2lkLnZpZXcuVmlldwotYW5kcm9pZC52aWV3LlZpZXcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQudmlldy5WaWV3UGFyZW50IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGJyaW5nQ2hpbGRUb0Zyb250KAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGNoaWxkRHJhd2FibGVTdGF0ZUNoYW5nZWQoCi1hbmRyb2lkLnZpZXcuVmlldykKLQotcHVibGljIGFic3RyYWN0IHZvaWQgY2xlYXJDaGlsZEZvY3VzKAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGNyZWF0ZUNvbnRleHRNZW51KAotYW5kcm9pZC52aWV3LkNvbnRleHRNZW51KQotCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC52aWV3LlZpZXcgZm9jdXNTZWFyY2goCi1hbmRyb2lkLnZpZXcuVmlldwotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBmb2N1c2FibGVWaWV3QXZhaWxhYmxlKAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGdldENoaWxkVmlzaWJsZVJlY3QoCi1hbmRyb2lkLnZpZXcuVmlldwotYW5kcm9pZC5ncmFwaGljcy5SZWN0Ci1hbmRyb2lkLmdyYXBoaWNzLlBvaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC52aWV3LlZpZXdQYXJlbnQgZ2V0UGFyZW50KCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgaW52YWxpZGF0ZUNoaWxkKAotYW5kcm9pZC52aWV3LlZpZXcKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdCkKLQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQudmlldy5WaWV3UGFyZW50IGludmFsaWRhdGVDaGlsZEluUGFyZW50KAotaW50W10KLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNMYXlvdXRSZXF1ZXN0ZWQoKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCByZWNvbXB1dGVWaWV3QXR0cmlidXRlcygKLWFuZHJvaWQudmlldy5WaWV3KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCByZXF1ZXN0Q2hpbGRGb2N1cygKLWFuZHJvaWQudmlldy5WaWV3Ci1hbmRyb2lkLnZpZXcuVmlldykKLQotcHVibGljIGFic3RyYWN0IHZvaWQgcmVxdWVzdERpc2FsbG93SW50ZXJjZXB0VG91Y2hFdmVudCgKLWJvb2xlYW4pCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlcXVlc3RMYXlvdXQoKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCByZXF1ZXN0VHJhbnNwYXJlbnRSZWdpb24oCi1hbmRyb2lkLnZpZXcuVmlldykKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gc2hvd0NvbnRleHRNZW51Rm9yQ2hpbGQoCi1hbmRyb2lkLnZpZXcuVmlldykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC52aWV3LlZpZXdNYW5hZ2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGFkZFZpZXcoCi1hbmRyb2lkLnZpZXcuVmlldwotYW5kcm9pZC52aWV3LlZpZXdHcm91cCRMYXlvdXRQYXJhbXMpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlbW92ZVZpZXcoCi1hbmRyb2lkLnZpZXcuVmlldykKLQotcHVibGljIGFic3RyYWN0IHZvaWQgdXBkYXRlVmlld0xheW91dCgKLWFuZHJvaWQudmlldy5WaWV3Ci1hbmRyb2lkLnZpZXcuVmlld0dyb3VwJExheW91dFBhcmFtcykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3ZpZXcvVmlld0dyb3VwJE1hcmdpbkxheW91dFBhcmFtcztMYW5kcm9pZC92aWV3L1ZpZXdHcm91cCRMYXlvdXRQYXJhbXM7TGFuZHJvaWQvdmlldy9WaWV3R3JvdXAkT25IaWVyYXJjaHlDaGFuZ2VMaXN0ZW5lcjsgKQotcHVibGljIGFic3RyYWN0IGNsYXNzIGFuZHJvaWQudmlldy5WaWV3R3JvdXAgZXh0ZW5kcyBhbmRyb2lkLnZpZXcuVmlldyBpbXBsZW1lbnRzIGFuZHJvaWQudmlldy5WaWV3UGFyZW50LCBhbmRyb2lkLnZpZXcuVmlld01hbmFnZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFSUkFZX0NBUEFDSVRZX0lOQ1JFTUVOVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVJSQVlfSU5JVElBTF9DQVBBQ0lUWQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0hJTERfTEVGVF9JTkRFWAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0hJTERfVE9QX0lOREVYCi0KLXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IENMSVBfVE9fUEFERElOR19NQVNLCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIERFU0NFTkRBTlRfRk9DVVNBQklMSVRZX0ZMQUdTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTEFHX0FERF9TVEFURVNfRlJPTV9DSElMRFJFTgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19BTFBIQV9MT1dFUl9USEFOX09ORQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19BTFdBWVNfRFJBV05fV0lUSF9DQUNIRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19BTklNQVRJT05fQ0FDSEUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfQU5JTUFUSU9OX0RPTkUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfQ0hJTERSRU5fRFJBV05fV0lUSF9DQUNIRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19DTEVBUl9UUkFOU0ZPUk1BVElPTgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19DTElQX0NISUxEUkVOCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTEFHX0NMSVBfVE9fUEFERElORwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19ESVNBTExPV19JTlRFUkNFUFQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfSU5WQUxJREFURV9SRVFVSVJFRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19NQVNLX0ZPQ1VTQUJJTElUWQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19OT1RJRllfQU5JTUFUSU9OX0xJU1RFTkVSCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTEFHX05PVElGWV9DSElMRFJFTl9PTl9EUkFXQUJMRV9TVEFURV9DSEFOR0UKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfT1BUSU1JWkVfSU5WQUxJREFURQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19QQURESU5HX05PVF9OVUxMCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTEFHX1JVTl9BTklNQVRJT04KLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19TVVBQT1JUX1NUQVRJQ19UUkFOU0ZPUk1BVElPTlMKLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19VU0VfQ0hJTERfRFJBV0lOR19PUkRFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT0NVU19BRlRFUl9ERVNDRU5EQU5UUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT0NVU19CRUZPUkVfREVTQ0VOREFOVFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9DVVNfQkxPQ0tfREVTQ0VOREFOVFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEVSU0lTVEVOVF9BTExfQ0FDSEVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBFUlNJU1RFTlRfQU5JTUFUSU9OX0NBQ0hFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBFUlNJU1RFTlRfTk9fQ0FDSEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEVSU0lTVEVOVF9TQ1JPTExJTkdfQ0FDSEUKLQotcHJpdmF0ZSBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvbiRBbmltYXRpb25MaXN0ZW5lciBtQW5pbWF0aW9uTGlzdGVuZXIKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50IG1DYWNoZVBhaW50Ci0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5UcmFuc2Zvcm1hdGlvbiBtQ2hpbGRUcmFuc2Zvcm1hdGlvbgotCi1wcml2YXRlIGFuZHJvaWQudmlldy5WaWV3W10gbUNoaWxkcmVuCi0KLXByaXZhdGUgaW50IG1DaGlsZHJlbkNvdW50Ci1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9BcnJheUxpc3Q8TGFuZHJvaWQvdmlldy9WaWV3Oz47ICkKLXByb3RlY3RlZCBqYXZhLnV0aWwuQXJyYXlMaXN0IG1EaXNhcHBlYXJpbmdDaGlsZHJlbgotCi1wcml2YXRlIGFuZHJvaWQudmlldy5WaWV3IG1Gb2N1c2VkCi0KLXByb3RlY3RlZCBpbnQgbUdyb3VwRmxhZ3MKLQotcHJpdmF0ZSBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkxheW91dEFuaW1hdGlvbkNvbnRyb2xsZXIgbUxheW91dEFuaW1hdGlvbkNvbnRyb2xsZXIKLQotcHJpdmF0ZSBhbmRyb2lkLnZpZXcuVmlldyBtTW90aW9uVGFyZ2V0Ci0KLXByb3RlY3RlZCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwJE9uSGllcmFyY2h5Q2hhbmdlTGlzdGVuZXIgbU9uSGllcmFyY2h5Q2hhbmdlTGlzdGVuZXIKLQotcHJvdGVjdGVkIGludCBtUGVyc2lzdGVudERyYXdpbmdDYWNoZQotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUmVjdCBtVGVtcFJlY3QKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQKLWludCkKLQotc3RhdGljIHZvaWQgYWNjZXNzJDAwMCgKLWFuZHJvaWQudmlldy5WaWV3R3JvdXApCi0KLXN0YXRpYyBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkxheW91dEFuaW1hdGlvbkNvbnRyb2xsZXIgYWNjZXNzJDEwMCgKLWFuZHJvaWQudmlldy5WaWV3R3JvdXApCi0KLXN0YXRpYyBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvbiRBbmltYXRpb25MaXN0ZW5lciBhY2Nlc3MkMjAwKAotYW5kcm9pZC52aWV3LlZpZXdHcm91cCkKLQotcHJpdmF0ZSB2b2lkIGFkZERpc2FwcGVhcmluZ1ZpZXcoCi1hbmRyb2lkLnZpZXcuVmlldykKLQotcHJpdmF0ZSB2b2lkIGFkZEluQXJyYXkoCi1hbmRyb2lkLnZpZXcuVmlldwotaW50KQotCi1wcml2YXRlIHZvaWQgYWRkVmlld0lubmVyKAotYW5kcm9pZC52aWV3LlZpZXcKLWludAotYW5kcm9pZC52aWV3LlZpZXdHcm91cCRMYXlvdXRQYXJhbXMKLWJvb2xlYW4pCi0KLXByaXZhdGUgdm9pZCBiaW5kTGF5b3V0QW5pbWF0aW9uKAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXByaXZhdGUgdm9pZCBmaW5pc2hBbmltYXRpbmdWaWV3KAotYW5kcm9pZC52aWV3LlZpZXcKLWFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uKQotCi1wdWJsaWMgc3RhdGljIGludCBnZXRDaGlsZE1lYXN1cmVTcGVjKAotaW50Ci1pbnQKLWludCkKLQotcHJpdmF0ZSB2b2lkIGluaXRGcm9tQXR0cmlidXRlcygKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0KQotCi1wcml2YXRlIHZvaWQgaW5pdFZpZXdHcm91cCgpCi0KLXByaXZhdGUgdm9pZCBub3RpZnlBbmltYXRpb25MaXN0ZW5lcigpCi0KLXByaXZhdGUgdm9pZCByZW1vdmVGcm9tQXJyYXkoCi1pbnQpCi0KLXByaXZhdGUgdm9pZCByZW1vdmVGcm9tQXJyYXkoCi1pbnQKLWludCkKLQotcHJpdmF0ZSB2b2lkIHJlbW92ZVZpZXdJbnRlcm5hbCgKLWludAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXByaXZhdGUgdm9pZCByZW1vdmVWaWV3SW50ZXJuYWwoCi1hbmRyb2lkLnZpZXcuVmlldykKLQotcHJpdmF0ZSB2b2lkIHJlbW92ZVZpZXdzSW50ZXJuYWwoCi1pbnQKLWludCkKLQotcHJpdmF0ZSB2b2lkIHNldEJvb2xlYW5GbGFnKAotaW50Ci1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0FycmF5TGlzdDxMYW5kcm9pZC92aWV3L1ZpZXc7PjtJKVYgKQotcHVibGljIHZvaWQgYWRkRm9jdXNhYmxlcygKLWphdmEudXRpbC5BcnJheUxpc3QKLWludCkKLQotcHVibGljIGJvb2xlYW4gYWRkU3RhdGVzRnJvbUNoaWxkcmVuKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9BcnJheUxpc3Q8TGFuZHJvaWQvdmlldy9WaWV3Oz47KVYgKQotcHVibGljIHZvaWQgYWRkVG91Y2hhYmxlcygKLWphdmEudXRpbC5BcnJheUxpc3QpCi0KLXB1YmxpYyB2b2lkIGFkZFZpZXcoCi1hbmRyb2lkLnZpZXcuVmlldykKLQotcHVibGljIHZvaWQgYWRkVmlldygKLWFuZHJvaWQudmlldy5WaWV3Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIGFkZFZpZXcoCi1hbmRyb2lkLnZpZXcuVmlldwotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIGFkZFZpZXcoCi1hbmRyb2lkLnZpZXcuVmlldwotaW50Ci1hbmRyb2lkLnZpZXcuVmlld0dyb3VwJExheW91dFBhcmFtcykKLQotcHVibGljIHZvaWQgYWRkVmlldygKLWFuZHJvaWQudmlldy5WaWV3Ci1hbmRyb2lkLnZpZXcuVmlld0dyb3VwJExheW91dFBhcmFtcykKLQotcHJvdGVjdGVkIGJvb2xlYW4gYWRkVmlld0luTGF5b3V0KAotYW5kcm9pZC52aWV3LlZpZXcKLWludAotYW5kcm9pZC52aWV3LlZpZXdHcm91cCRMYXlvdXRQYXJhbXMpCi0KLXByb3RlY3RlZCBib29sZWFuIGFkZFZpZXdJbkxheW91dCgKLWFuZHJvaWQudmlldy5WaWV3Ci1pbnQKLWFuZHJvaWQudmlldy5WaWV3R3JvdXAkTGF5b3V0UGFyYW1zCi1ib29sZWFuKQotCi1wcm90ZWN0ZWQgdm9pZCBhdHRhY2hMYXlvdXRBbmltYXRpb25QYXJhbWV0ZXJzKAotYW5kcm9pZC52aWV3LlZpZXcKLWFuZHJvaWQudmlldy5WaWV3R3JvdXAkTGF5b3V0UGFyYW1zCi1pbnQKLWludCkKLQotcHJvdGVjdGVkIHZvaWQgYXR0YWNoVmlld1RvUGFyZW50KAotYW5kcm9pZC52aWV3LlZpZXcKLWludAotYW5kcm9pZC52aWV3LlZpZXdHcm91cCRMYXlvdXRQYXJhbXMpCi0KLXB1YmxpYyB2b2lkIGJyaW5nQ2hpbGRUb0Zyb250KAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXByb3RlY3RlZCBib29sZWFuIGNhbkFuaW1hdGUoKQotCi1wcm90ZWN0ZWQgYm9vbGVhbiBjaGVja0xheW91dFBhcmFtcygKLWFuZHJvaWQudmlldy5WaWV3R3JvdXAkTGF5b3V0UGFyYW1zKQotCi1wdWJsaWMgdm9pZCBjaGlsZERyYXdhYmxlU3RhdGVDaGFuZ2VkKAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXByb3RlY3RlZCB2b2lkIGNsZWFudXBMYXlvdXRTdGF0ZSgKLWFuZHJvaWQudmlldy5WaWV3KQotCi1wdWJsaWMgdm9pZCBjbGVhckNoaWxkRm9jdXMoCi1hbmRyb2lkLnZpZXcuVmlldykKLQotcHVibGljIHZvaWQgY2xlYXJEaXNhcHBlYXJpbmdDaGlsZHJlbigpCi0KLXB1YmxpYyB2b2lkIGNsZWFyRm9jdXMoKQotCi1wcm90ZWN0ZWQgdm9pZCBkZWJ1ZygKLWludCkKLQotcHJvdGVjdGVkIHZvaWQgZGV0YWNoQWxsVmlld3NGcm9tUGFyZW50KCkKLQotcHJvdGVjdGVkIHZvaWQgZGV0YWNoVmlld0Zyb21QYXJlbnQoCi1pbnQpCi0KLXByb3RlY3RlZCB2b2lkIGRldGFjaFZpZXdGcm9tUGFyZW50KAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXByb3RlY3RlZCB2b2lkIGRldGFjaFZpZXdzRnJvbVBhcmVudCgKLWludAotaW50KQotCi0gdm9pZCBkaXNwYXRjaEF0dGFjaGVkVG9XaW5kb3coCi1hbmRyb2lkLnZpZXcuVmlldyRBdHRhY2hJbmZvCi1pbnQpCi0KLSB2b2lkIGRpc3BhdGNoQ29sbGVjdFZpZXdBdHRyaWJ1dGVzKAotaW50KQotCi0gdm9pZCBkaXNwYXRjaERldGFjaGVkRnJvbVdpbmRvdygpCi0KLXByb3RlY3RlZCB2b2lkIGRpc3BhdGNoRHJhdygKLWFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMYW5kcm9pZC91dGlsL1NwYXJzZUFycmF5PExhbmRyb2lkL29zL1BhcmNlbGFibGU7PjspViApCi1wcm90ZWN0ZWQgdm9pZCBkaXNwYXRjaEZyZWV6ZVNlbGZPbmx5KAotYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5KQotCi1wdWJsaWMgYm9vbGVhbiBkaXNwYXRjaEtleUV2ZW50KAotYW5kcm9pZC52aWV3LktleUV2ZW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMYW5kcm9pZC91dGlsL1NwYXJzZUFycmF5PExhbmRyb2lkL29zL1BhcmNlbGFibGU7PjspViApCi1wcm90ZWN0ZWQgdm9pZCBkaXNwYXRjaFJlc3RvcmVJbnN0YW5jZVN0YXRlKAotYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMYW5kcm9pZC91dGlsL1NwYXJzZUFycmF5PExhbmRyb2lkL29zL1BhcmNlbGFibGU7PjspViApCi1wcm90ZWN0ZWQgdm9pZCBkaXNwYXRjaFNhdmVJbnN0YW5jZVN0YXRlKAotYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5KQotCi1wcm90ZWN0ZWQgdm9pZCBkaXNwYXRjaFNldFByZXNzZWQoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBkaXNwYXRjaFNldFNlbGVjdGVkKAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGFuZHJvaWQvdXRpbC9TcGFyc2VBcnJheTxMYW5kcm9pZC9vcy9QYXJjZWxhYmxlOz47KVYgKQotcHJvdGVjdGVkIHZvaWQgZGlzcGF0Y2hUaGF3U2VsZk9ubHkoCi1hbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXkpCi0KLXB1YmxpYyBib29sZWFuIGRpc3BhdGNoVG91Y2hFdmVudCgKLWFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCkKLQotcHVibGljIGJvb2xlYW4gZGlzcGF0Y2hUcmFja2JhbGxFdmVudCgKLWFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCkKLQotcHVibGljIGJvb2xlYW4gZGlzcGF0Y2hVbmhhbmRsZWRNb3ZlKAotYW5kcm9pZC52aWV3LlZpZXcKLWludCkKLQotcHVibGljIHZvaWQgZGlzcGF0Y2hXaW5kb3dGb2N1c0NoYW5nZWQoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBkaXNwYXRjaFdpbmRvd1Zpc2liaWxpdHlDaGFuZ2VkKAotaW50KQotCi1wcm90ZWN0ZWQgYm9vbGVhbiBkcmF3Q2hpbGQoCi1hbmRyb2lkLmdyYXBoaWNzLkNhbnZhcwotYW5kcm9pZC52aWV3LlZpZXcKLWxvbmcpCi0KLXByb3RlY3RlZCB2b2lkIGRyYXdhYmxlU3RhdGVDaGFuZ2VkKCkKLQotcHVibGljIGFuZHJvaWQudmlldy5WaWV3IGZpbmRGb2N1cygpCi0KLXByb3RlY3RlZCBhbmRyb2lkLnZpZXcuVmlldyBmaW5kVmlld1RyYXZlcnNhbCgKLWludCkKLQotcHJvdGVjdGVkIGFuZHJvaWQudmlldy5WaWV3IGZpbmRWaWV3V2l0aFRhZ1RyYXZlcnNhbCgKLWphdmEubGFuZy5PYmplY3QpCi0KLXByb3RlY3RlZCBib29sZWFuIGZpdFN5c3RlbVdpbmRvd3MoCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3QpCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuVmlldyBmb2N1c1NlYXJjaCgKLWFuZHJvaWQudmlldy5WaWV3Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIGZvY3VzYWJsZVZpZXdBdmFpbGFibGUoCi1hbmRyb2lkLnZpZXcuVmlldykKLQotcHVibGljIGJvb2xlYW4gZ2F0aGVyVHJhbnNwYXJlbnRSZWdpb24oCi1hbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbikKLQotcHJvdGVjdGVkIGFuZHJvaWQudmlldy5WaWV3R3JvdXAkTGF5b3V0UGFyYW1zIGdlbmVyYXRlRGVmYXVsdExheW91dFBhcmFtcygpCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuVmlld0dyb3VwJExheW91dFBhcmFtcyBnZW5lcmF0ZUxheW91dFBhcmFtcygKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi0KLXByb3RlY3RlZCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwJExheW91dFBhcmFtcyBnZW5lcmF0ZUxheW91dFBhcmFtcygKLWFuZHJvaWQudmlldy5WaWV3R3JvdXAkTGF5b3V0UGFyYW1zKQotCi1wdWJsaWMgYW5kcm9pZC52aWV3LlZpZXcgZ2V0Q2hpbGRBdCgKLWludCkKLQotcHVibGljIGludCBnZXRDaGlsZENvdW50KCkKLQotcHJvdGVjdGVkIGludCBnZXRDaGlsZERyYXdpbmdPcmRlcigKLWludAotaW50KQotCi1wcm90ZWN0ZWQgYm9vbGVhbiBnZXRDaGlsZFN0YXRpY1RyYW5zZm9ybWF0aW9uKAotYW5kcm9pZC52aWV3LlZpZXcKLWFuZHJvaWQudmlldy5hbmltYXRpb24uVHJhbnNmb3JtYXRpb24pCi0KLXB1YmxpYyBib29sZWFuIGdldENoaWxkVmlzaWJsZVJlY3QoCi1hbmRyb2lkLnZpZXcuVmlldwotYW5kcm9pZC5ncmFwaGljcy5SZWN0Ci1hbmRyb2lkLmdyYXBoaWNzLlBvaW50KQotQGFuZHJvaWQudmlldy5WaWV3RGVidWckRXhwb3J0ZWRQcm9wZXJ0eSAobWFwcGluZyA9TGFuZHJvaWQvdmlldy9WaWV3RGVidWckSW50VG9TdHJpbmc7Oltmcm9tID0xMzEwNzIsIHRvID1GT0NVU19CRUZPUkVfREVTQ0VOREFOVFNdTGFuZHJvaWQvdmlldy9WaWV3RGVidWckSW50VG9TdHJpbmc7Oltmcm9tID0yNjIxNDQsIHRvID1GT0NVU19BRlRFUl9ERVNDRU5EQU5UU11MYW5kcm9pZC92aWV3L1ZpZXdEZWJ1ZyRJbnRUb1N0cmluZzs6W2Zyb20gPTM5MzIxNiwgdG8gPUZPQ1VTX0JMT0NLX0RFU0NFTkRBTlRTXSApCi1wdWJsaWMgaW50IGdldERlc2NlbmRhbnRGb2N1c2FiaWxpdHkoKQotCi1wdWJsaWMgYW5kcm9pZC52aWV3LlZpZXcgZ2V0Rm9jdXNlZENoaWxkKCkKLQotcHVibGljIGFuZHJvaWQudmlldy5hbmltYXRpb24uTGF5b3V0QW5pbWF0aW9uQ29udHJvbGxlciBnZXRMYXlvdXRBbmltYXRpb24oKQotCi1wdWJsaWMgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb24kQW5pbWF0aW9uTGlzdGVuZXIgZ2V0TGF5b3V0QW5pbWF0aW9uTGlzdGVuZXIoKQotQGFuZHJvaWQudmlldy5WaWV3RGVidWckRXhwb3J0ZWRQcm9wZXJ0eSAobWFwcGluZyA9TGFuZHJvaWQvdmlldy9WaWV3RGVidWckSW50VG9TdHJpbmc7Oltmcm9tID0wLCB0byA9Tk9ORV1MYW5kcm9pZC92aWV3L1ZpZXdEZWJ1ZyRJbnRUb1N0cmluZzs6W2Zyb20gPTMsIHRvID1BTklNQVRJT05dTGFuZHJvaWQvdmlldy9WaWV3RGVidWckSW50VG9TdHJpbmc7Oltmcm9tID0yLCB0byA9U0NST0xMSU5HXUxhbmRyb2lkL3ZpZXcvVmlld0RlYnVnJEludFRvU3RyaW5nOzpbZnJvbSA9MywgdG8gPUFMTF0gKQotcHVibGljIGludCBnZXRQZXJzaXN0ZW50RHJhd2luZ0NhY2hlKCkKLQotIHZvaWQgaGFuZGxlRm9jdXNHYWluSW50ZXJuYWwoCi1pbnQKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdCkKLQotcHVibGljIGJvb2xlYW4gaGFzRm9jdXMoKQotCi1wdWJsaWMgYm9vbGVhbiBoYXNGb2N1c2FibGUoKQotCi1wdWJsaWMgaW50IGluZGV4T2ZDaGlsZCgKLWFuZHJvaWQudmlldy5WaWV3KQotCi1wdWJsaWMgZmluYWwgdm9pZCBpbnZhbGlkYXRlQ2hpbGQoCi1hbmRyb2lkLnZpZXcuVmlldwotYW5kcm9pZC5ncmFwaGljcy5SZWN0KQotCi1wdWJsaWMgYW5kcm9pZC52aWV3LlZpZXdQYXJlbnQgaW52YWxpZGF0ZUNoaWxkSW5QYXJlbnQoCi1pbnRbXQotYW5kcm9pZC5ncmFwaGljcy5SZWN0KQotQGFuZHJvaWQudmlldy5WaWV3RGVidWckRXhwb3J0ZWRQcm9wZXJ0eQotcHVibGljIGJvb2xlYW4gaXNBbHdheXNEcmF3bldpdGhDYWNoZUVuYWJsZWQoKQotQGFuZHJvaWQudmlldy5WaWV3RGVidWckRXhwb3J0ZWRQcm9wZXJ0eQotcHVibGljIGJvb2xlYW4gaXNBbmltYXRpb25DYWNoZUVuYWJsZWQoKQotQGFuZHJvaWQudmlldy5WaWV3RGVidWckRXhwb3J0ZWRQcm9wZXJ0eQotcHJvdGVjdGVkIGJvb2xlYW4gaXNDaGlsZHJlbkRyYXduV2l0aENhY2hlRW5hYmxlZCgpCi0KLXByb3RlY3RlZCB2b2lkIG1lYXN1cmVDaGlsZCgKLWFuZHJvaWQudmlldy5WaWV3Ci1pbnQKLWludCkKLQotcHJvdGVjdGVkIHZvaWQgbWVhc3VyZUNoaWxkV2l0aE1hcmdpbnMoCi1hbmRyb2lkLnZpZXcuVmlldwotaW50Ci1pbnQKLWludAotaW50KQotCi1wcm90ZWN0ZWQgdm9pZCBtZWFzdXJlQ2hpbGRyZW4oCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgb2Zmc2V0Q2hpbGRyZW5Ub3BBbmRCb3R0b20oCi1pbnQpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIG9mZnNldERlc2NlbmRhbnRSZWN0VG9NeUNvb3JkcygKLWFuZHJvaWQudmlldy5WaWV3Ci1hbmRyb2lkLmdyYXBoaWNzLlJlY3QpCi0KLSB2b2lkIG9mZnNldFJlY3RCZXR3ZWVuUGFyZW50QW5kQ2hpbGQoCi1hbmRyb2lkLnZpZXcuVmlldwotYW5kcm9pZC5ncmFwaGljcy5SZWN0Ci1ib29sZWFuCi1ib29sZWFuKQotCi1wdWJsaWMgZmluYWwgdm9pZCBvZmZzZXRSZWN0SW50b0Rlc2NlbmRhbnRDb29yZHMoCi1hbmRyb2lkLnZpZXcuVmlldwotYW5kcm9pZC5ncmFwaGljcy5SZWN0KQotCi1wcm90ZWN0ZWQgdm9pZCBvbkFuaW1hdGlvbkVuZCgpCi0KLXByb3RlY3RlZCB2b2lkIG9uQW5pbWF0aW9uU3RhcnQoKQotCi1wcm90ZWN0ZWQgaW50W10gb25DcmVhdGVEcmF3YWJsZVN0YXRlKAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBvbkludGVyY2VwdFRvdWNoRXZlbnQoCi1hbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQpCi0KLXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIG9uTGF5b3V0KAotYm9vbGVhbgotaW50Ci1pbnQKLWludAotaW50KQotCi1wcm90ZWN0ZWQgYm9vbGVhbiBvblJlcXVlc3RGb2N1c0luRGVzY2VuZGFudHMoCi1pbnQKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdCkKLQotcHVibGljIHZvaWQgcmVjb21wdXRlVmlld0F0dHJpYnV0ZXMoCi1hbmRyb2lkLnZpZXcuVmlldykKLQotcHVibGljIHZvaWQgcmVtb3ZlQWxsVmlld3MoKQotCi1wdWJsaWMgdm9pZCByZW1vdmVBbGxWaWV3c0luTGF5b3V0KCkKLQotcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRGV0YWNoZWRWaWV3KAotYW5kcm9pZC52aWV3LlZpZXcKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHJlbW92ZVZpZXcoCi1hbmRyb2lkLnZpZXcuVmlldykKLQotcHVibGljIHZvaWQgcmVtb3ZlVmlld0F0KAotaW50KQotCi1wdWJsaWMgdm9pZCByZW1vdmVWaWV3SW5MYXlvdXQoCi1hbmRyb2lkLnZpZXcuVmlldykKLQotcHVibGljIHZvaWQgcmVtb3ZlVmlld3MoCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgcmVtb3ZlVmlld3NJbkxheW91dCgKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCByZXF1ZXN0Q2hpbGRGb2N1cygKLWFuZHJvaWQudmlldy5WaWV3Ci1hbmRyb2lkLnZpZXcuVmlldykKLQotcHVibGljIGJvb2xlYW4gcmVxdWVzdENoaWxkUmVjdGFuZ2xlT25TY3JlZW4oCi1hbmRyb2lkLnZpZXcuVmlldwotYW5kcm9pZC5ncmFwaGljcy5SZWN0Ci1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCByZXF1ZXN0RGlzYWxsb3dJbnRlcmNlcHRUb3VjaEV2ZW50KAotYm9vbGVhbikKLQotcHVibGljIGJvb2xlYW4gcmVxdWVzdEZvY3VzKAotaW50Ci1hbmRyb2lkLmdyYXBoaWNzLlJlY3QpCi0KLXB1YmxpYyB2b2lkIHJlcXVlc3RUcmFuc3BhcmVudFJlZ2lvbigKLWFuZHJvaWQudmlldy5WaWV3KQotCi1wdWJsaWMgdm9pZCBzY2hlZHVsZUxheW91dEFuaW1hdGlvbigpCi0KLXB1YmxpYyB2b2lkIHNldEFkZFN0YXRlc0Zyb21DaGlsZHJlbigKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldEFsd2F5c0RyYXduV2l0aENhY2hlRW5hYmxlZCgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldEFuaW1hdGlvbkNhY2hlRW5hYmxlZCgKLWJvb2xlYW4pCi0KLXByb3RlY3RlZCB2b2lkIHNldENoaWxkcmVuRHJhd2luZ0NhY2hlRW5hYmxlZCgKLWJvb2xlYW4pCi0KLXByb3RlY3RlZCB2b2lkIHNldENoaWxkcmVuRHJhd25XaXRoQ2FjaGVFbmFibGVkKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0Q2xpcENoaWxkcmVuKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0Q2xpcFRvUGFkZGluZygKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldERlc2NlbmRhbnRGb2N1c2FiaWxpdHkoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldExheW91dEFuaW1hdGlvbigKLWFuZHJvaWQudmlldy5hbmltYXRpb24uTGF5b3V0QW5pbWF0aW9uQ29udHJvbGxlcikKLQotcHVibGljIHZvaWQgc2V0TGF5b3V0QW5pbWF0aW9uTGlzdGVuZXIoCi1hbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvbiRBbmltYXRpb25MaXN0ZW5lcikKLQotcHVibGljIHZvaWQgc2V0T25IaWVyYXJjaHlDaGFuZ2VMaXN0ZW5lcigKLWFuZHJvaWQudmlldy5WaWV3R3JvdXAkT25IaWVyYXJjaHlDaGFuZ2VMaXN0ZW5lcikKLQotcHVibGljIHZvaWQgc2V0UGFkZGluZygKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgc2V0UGVyc2lzdGVudERyYXdpbmdDYWNoZSgKLWludCkKLQotcHVibGljIGJvb2xlYW4gc2hvd0NvbnRleHRNZW51Rm9yQ2hpbGQoCi1hbmRyb2lkLnZpZXcuVmlldykKLQotcHVibGljIHZvaWQgc3RhcnRMYXlvdXRBbmltYXRpb24oKQotCi0gdm9pZCB1bkZvY3VzKCkKLQotcHVibGljIHZvaWQgdXBkYXRlVmlld0xheW91dCgKLWFuZHJvaWQudmlldy5WaWV3Ci1hbmRyb2lkLnZpZXcuVmlld0dyb3VwJExheW91dFBhcmFtcykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC92aWV3L1ZpZXdSb290OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi0gY2xhc3MgYW5kcm9pZC52aWV3LlZpZXdSb290JDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC52aWV3LlN1cmZhY2VIb2xkZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC52aWV3LlZpZXdSb290IHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQudmlldy5WaWV3Um9vdCkKLQotcHVibGljIHZvaWQgYWRkQ2FsbGJhY2soCi1hbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlciRDYWxsYmFjaykKLQotcHVibGljIGFuZHJvaWQudmlldy5TdXJmYWNlIGdldFN1cmZhY2UoKQotCi1wdWJsaWMgYW5kcm9pZC5ncmFwaGljcy5SZWN0IGdldFN1cmZhY2VGcmFtZSgpCi0KLXB1YmxpYyBib29sZWFuIGlzQ3JlYXRpbmcoKQotCi1wdWJsaWMgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMgbG9ja0NhbnZhcygpCi0KLXB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhcyBsb2NrQ2FudmFzKAotYW5kcm9pZC5ncmFwaGljcy5SZWN0KQotCi1wdWJsaWMgdm9pZCByZW1vdmVDYWxsYmFjaygKLWFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyJENhbGxiYWNrKQotCi1wdWJsaWMgdm9pZCBzZXRGaXhlZFNpemUoCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgc2V0Rm9ybWF0KAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRLZWVwU2NyZWVuT24oCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRTaXplRnJvbUxheW91dCgpCi0KLXB1YmxpYyB2b2lkIHNldFR5cGUoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHVubG9ja0NhbnZhc0FuZFBvc3QoCi1hbmRyb2lkLmdyYXBoaWNzLkNhbnZhcykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC92aWV3L1ZpZXdSb290OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI1IG5hbWUgPUNhbGxlZEZyb21Xcm9uZ1RocmVhZEV4Y2VwdGlvbiApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC52aWV3LlZpZXdSb290JENhbGxlZEZyb21Xcm9uZ1RocmVhZEV4Y2VwdGlvbiBleHRlbmRzIGFuZHJvaWQudXRpbC5BbmRyb2lkUnVudGltZUV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9WaWV3Um9vdDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNiBuYW1lID1Sb290SGFuZGxlciApCi1maW5hbCBjbGFzcyBhbmRyb2lkLnZpZXcuVmlld1Jvb3QkUm9vdEhhbmRsZXIgZXh0ZW5kcyBhbmRyb2lkLm9zLkhhbmRsZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC52aWV3LlZpZXdSb290JDEpCi0KLXB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1IYW5kbGVyQWN0aW9uICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3ZpZXcvVmlld1Jvb3QkUnVuUXVldWU7ICkKLSBjbGFzcyBhbmRyb2lkLnZpZXcuVmlld1Jvb3QkUnVuUXVldWUkSGFuZGxlckFjdGlvbiBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGphdmEubGFuZy5SdW5uYWJsZSBhY3Rpb24KLQotIGxvbmcgZGVsYXkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC52aWV3LlZpZXdSb290JDEpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9WaWV3Um9vdDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC92aWV3L1ZpZXdSb290JFJ1blF1ZXVlJEhhbmRsZXJBY3Rpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjQgbmFtZSA9UnVuUXVldWUgKQotZmluYWwgY2xhc3MgYW5kcm9pZC52aWV3LlZpZXdSb290JFJ1blF1ZXVlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQXJyYXlMaXN0PExhbmRyb2lkL3ZpZXcvVmlld1Jvb3QkUnVuUXVldWUkSGFuZGxlckFjdGlvbjs+OyApCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5BcnJheUxpc3QgbUFjdGlvbnMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi0gdm9pZCBleGVjdXRlQWN0aW9ucygKLWFuZHJvaWQub3MuSGFuZGxlcikKLQotIHZvaWQgcG9zdCgKLWphdmEubGFuZy5SdW5uYWJsZSkKLQotIHZvaWQgcG9zdERlbGF5ZWQoCi1qYXZhLmxhbmcuUnVubmFibGUKLWxvbmcpCi0KLSB2b2lkIHJlbW92ZUNhbGxiYWNrcygKLWphdmEubGFuZy5SdW5uYWJsZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC92aWV3L1ZpZXdSb290OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI0IG5hbWUgPVRyYWNrYmFsbEF4aXMgKQotZmluYWwgY2xhc3MgYW5kcm9pZC52aWV3LlZpZXdSb290JFRyYWNrYmFsbEF4aXMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBmbG9hdCBhYnNQb3NpdGlvbgotCi0gZmxvYXQgYWNjZWxlcmF0aW9uCi0KLSBpbnQgZGlyCi0KLSBpbnQgbm9uQWNjZWxNb3ZlbWVudAotCi0gZmxvYXQgcG9zaXRpb24KLQotIGludCBzdGVwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotIGZsb2F0IGNvbGxlY3QoCi1mbG9hdAotamF2YS5sYW5nLlN0cmluZykKLQotIGludCBnZW5lcmF0ZSgKLWZsb2F0KQotCi0gdm9pZCByZXNldCgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9VyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC92aWV3L1ZpZXdSb290OyApCi0gY2xhc3MgYW5kcm9pZC52aWV3LlZpZXdSb290JFcgZXh0ZW5kcyBhbmRyb2lkLnZpZXcuSVdpbmRvdyRTdHViCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9yZWYvV2Vha1JlZmVyZW5jZTxMYW5kcm9pZC92aWV3L1ZpZXdSb290Oz47ICkKLXByaXZhdGUgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlIG1WaWV3Um9vdAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQudmlldy5WaWV3Um9vdCkKLQotcHJpdmF0ZSBzdGF0aWMgaW50IGNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBkaXNwYXRjaEFwcFZpc2liaWxpdHkoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBkaXNwYXRjaEdldE5ld1N1cmZhY2UoKQotCi1wdWJsaWMgdm9pZCBkaXNwYXRjaEtleSgKLWFuZHJvaWQudmlldy5LZXlFdmVudCkKLQotcHVibGljIHZvaWQgZGlzcGF0Y2hQb2ludGVyKAotYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50Ci1sb25nKQotCi1wdWJsaWMgdm9pZCBkaXNwYXRjaFRyYWNrYmFsbCgKLWFuZHJvaWQudmlldy5Nb3Rpb25FdmVudAotbG9uZykKLQotcHVibGljIHZvaWQgZXhlY3V0ZUNvbW1hbmQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yKQotCi1wdWJsaWMgdm9pZCByZXNpemVkKAotaW50Ci1pbnQKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHdpbmRvd0ZvY3VzQ2hhbmdlZCgKLWJvb2xlYW4KLWJvb2xlYW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC92aWV3L1ZpZXdSb290JFJ1blF1ZXVlO0xhbmRyb2lkL3ZpZXcvVmlld1Jvb3QkUm9vdEhhbmRsZXI7TGFuZHJvaWQvdmlldy9WaWV3Um9vdCRDYWxsZWRGcm9tV3JvbmdUaHJlYWRFeGNlcHRpb247TGFuZHJvaWQvdmlldy9WaWV3Um9vdCRUcmFja2JhbGxBeGlzO0xhbmRyb2lkL3ZpZXcvVmlld1Jvb3QkVzsgKQotZmluYWwgY2xhc3MgYW5kcm9pZC52aWV3LlZpZXdSb290IGV4dGVuZHMgYW5kcm9pZC5vcy5IYW5kbGVyIGltcGxlbWVudHMgYW5kcm9pZC52aWV3LlZpZXdQYXJlbnQsIGFuZHJvaWQudmlldy5WaWV3JEF0dGFjaEluZm8kU291bmRFZmZlY3RQbGF5ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19EUkFXCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfT1JJRU5UQVRJT04KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19UUkFDS0JBTEwKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElTUEFUQ0hfQVBQX1ZJU0lCSUxJVFkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJU1BBVENIX0dFVF9ORVdfU1VSRkFDRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElTUEFUQ0hfS0VZCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBESVNQQVRDSF9QT0lOVEVSCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBESVNQQVRDSF9UUkFDS0JBTEwKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERPX1RSQVZFUlNBTAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIExPQ0FMX0xPR1YKLQotc3RhdGljIGZpbmFsIGludCBNQVhfVFJBQ0tCQUxMX0RFTEFZCi0KLXN0YXRpYyBmaW5hbCBib29sZWFuIFBST0ZJTEVfRFJBV0lORwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFBST0ZJTEVfTEFZT1VUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVNJWkVECi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVNJWkVEX1JFUE9SVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFNIT1dfRlBTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEFHCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gV0FUQ0hfUE9JTlRFUgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0lORE9XX0ZPQ1VTX0NIQU5HRUQKLQotcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtSW5pdGlhbGl6ZWQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLk9iamVjdCBtU3RhdGljSW5pdAotCi1wcml2YXRlIHN0YXRpYyBpbnQgc0RyYXdUaW1lCi0KLXByaXZhdGUgc3RhdGljIGxvbmcgc0luc3RhbmNlQ291bnQKLQotc3RhdGljIGZpbmFsIGFuZHJvaWQudmlldy5WaWV3Um9vdCRSdW5RdWV1ZSBzUnVuUXVldWUKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL1RocmVhZExvY2FsPExhbmRyb2lkL29zL0hhbmRsZXI7PjsgKQotc3RhdGljIGZpbmFsIGphdmEubGFuZy5UaHJlYWRMb2NhbCBzVWlUaHJlYWRzCi0KLXByaXZhdGUgc3RhdGljIGFuZHJvaWQudmlldy5JV2luZG93U2Vzc2lvbiBzV2luZG93U2Vzc2lvbgotCi0gaW50IG1BZGROZXN0aW5nCi0KLXByaXZhdGUgYm9vbGVhbiBtQWRkZWQKLQotcHJpdmF0ZSBib29sZWFuIG1BZGRlZFRvdWNoTW9kZQotCi1wcml2YXRlIGJvb2xlYW4gbUFwcFZpc2libGUKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLnZpZXcuVmlldyRBdHRhY2hJbmZvIG1BdHRhY2hJbmZvCi0KLXByaXZhdGUgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXIgbUF1ZGlvTWFuYWdlcgotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUmVjdCBtQ292ZXJlZEluc2V0cwotCi1wcml2YXRlIGFuZHJvaWQuZ3JhcGhpY3MuUmVjdCBtRGlydHkKLQotcHJpdmF0ZSBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMMTAgbUVnbAotCi1wcml2YXRlIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb250ZXh0IG1FZ2xDb250ZXh0Ci0KLXByaXZhdGUgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTERpc3BsYXkgbUVnbERpc3BsYXkKLQotcHJpdmF0ZSBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMU3VyZmFjZSBtRWdsU3VyZmFjZQotCi1wcml2YXRlIGJvb2xlYW4gbUZpcnN0Ci0KLXByaXZhdGUgYW5kcm9pZC52aWV3LlZpZXcgbUZvY3VzZWRWaWV3Ci0KLXByaXZhdGUgYm9vbGVhbiBtRnVsbFJlZHJhd05lZWRlZAotCi1wcml2YXRlIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTEgbUdMCi0KLXByaXZhdGUgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMgbUdsQ2FudmFzCi0KLXByaXZhdGUgYm9vbGVhbiBtR2xXYW50ZWQKLQotcHJpdmF0ZSBpbnQgbUhlaWdodAotCi1wcml2YXRlIGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyIG1Ib2xkZXIKLQotcHJpdmF0ZSBsb25nIG1MYXN0VHJhY2tiYWxsVGltZQotCi1wcml2YXRlIGJvb2xlYW4gbUxheW91dFJlcXVlc3RlZAotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQudmlldy5XaW5kb3dMZWFrZWQgbUxvY2F0aW9uCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5SZWN0IG1OZXdDb3ZlcmVkSW5zZXRzCi0KLXByaXZhdGUgYm9vbGVhbiBtTmV3U3VyZmFjZU5lZWRlZAotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uIG1QcmV2aW91c1RyYW5zcGFyZW50UmVnaW9uCi0KLXByaXZhdGUgYm9vbGVhbiBtUHJvZmlsZQotCi1wcml2YXRlIGJvb2xlYW4gbVJlcG9ydE5leHREcmF3Ci0KLXByaXZhdGUgYW5kcm9pZC52aWV3LlN1cmZhY2UgbVN1cmZhY2UKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlJlY3QgbVRlbXBSZWN0Ci0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlRocmVhZCBtVGhyZWFkCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC52aWV3LlZpZXdSb290JFRyYWNrYmFsbEF4aXMgbVRyYWNrYmFsbEF4aXNYCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC52aWV3LlZpZXdSb290JFRyYWNrYmFsbEF4aXMgbVRyYWNrYmFsbEF4aXNZCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5SZWdpb24gbVRyYW5zcGFyZW50UmVnaW9uCi0KLXByaXZhdGUgYm9vbGVhbiBtVHJhdmVyc2FsU2NoZWR1bGVkCi0KLXByaXZhdGUgYm9vbGVhbiBtVXNlR0wKLQotcHJpdmF0ZSBhbmRyb2lkLnZpZXcuVmlldyBtVmlldwotCi1wcml2YXRlIGludCBtVmlld1Zpc2liaWxpdHkKLQotcHJpdmF0ZSBpbnQgbVdpZHRoCi0KLXByaXZhdGUgYm9vbGVhbiBtV2lsbERyYXdTb29uCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5SZWN0IG1XaW5GcmFtZQotCi1maW5hbCBhbmRyb2lkLnZpZXcuVmlld1Jvb3QkVyBtV2luZG93Ci0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIkTGF5b3V0UGFyYW1zIG1XaW5kb3dBdHRyaWJ1dGVzCi0KLXByaXZhdGUgYm9vbGVhbiBtV2luZG93QXR0cmlidXRlc0NoYW5nZWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXN0YXRpYyBhbmRyb2lkLnZpZXcuVmlldyBhY2Nlc3MkMTAwKAotYW5kcm9pZC52aWV3LlZpZXdSb290KQotCi1zdGF0aWMgYW5kcm9pZC52aWV3LlN1cmZhY2UgYWNjZXNzJDIwMCgKLWFuZHJvaWQudmlldy5WaWV3Um9vdCkKLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBjYXB0dXJlS2V5TG9nKAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC52aWV3LktleUV2ZW50KQotCi1wcml2YXRlIHN0YXRpYyB2b2lkIGNhcHR1cmVNb3Rpb25Mb2coCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQpCi0KLXByaXZhdGUgdm9pZCBjaGVja0VnbEVycm9ycygpCi0KLXByaXZhdGUgYm9vbGVhbiBjaGVja0ZvckxlYXZpbmdUb3VjaE1vZGVBbmRDb25zdW1lKAotYW5kcm9pZC52aWV3LktleUV2ZW50KQotCi1wcml2YXRlIHZvaWQgZGVsaXZlcktleUV2ZW50KAotYW5kcm9pZC52aWV3LktleUV2ZW50Ci1ib29sZWFuKQotCi1wcml2YXRlIHZvaWQgZGVsaXZlclRyYWNrYmFsbEV2ZW50KAotYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50KQotCi1wcml2YXRlIHZvaWQgZGVzdHJveUdMKCkKLQotcHJpdmF0ZSB2b2lkIGRyYXcoCi1ib29sZWFuKQotCi1wcml2YXRlIGJvb2xlYW4gZW5zdXJlVG91Y2hNb2RlTG9jYWxseSgKLWJvb2xlYW4pCi0KLXByaXZhdGUgYm9vbGVhbiBlbnRlclRvdWNoTW9kZSgpCi0KLXByaXZhdGUgYW5kcm9pZC52aWV3LlZpZXdHcm91cCBmaW5kQW5jZXN0b3JUb1Rha2VGb2N1c0luVG91Y2hNb2RlKAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXByaXZhdGUgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXIgZ2V0QXVkaW9NYW5hZ2VyKCkKLQotcHVibGljIHN0YXRpYyBsb25nIGdldEluc3RhbmNlQ291bnQoKQotCi1wcml2YXRlIGludCBnZXRSb290TWVhc3VyZVNwZWMoCi1pbnQKLWludCkKLQotcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVHTCgpCi0KLXByaXZhdGUgdm9pZCBpbml0aWFsaXplR0xJbm5lcigpCi0KLXN0YXRpYyBib29sZWFuIGlzRGlyZWN0aW9uYWwoCi1pbnQpCi0KLXN0YXRpYyBib29sZWFuIGlzSW5Ub3VjaE1vZGUoKQotCi1wcml2YXRlIHN0YXRpYyBib29sZWFuIGlzS2V5Ym9hcmRLZXkoCi1hbmRyb2lkLnZpZXcuS2V5RXZlbnQpCi0KLXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNWaWV3RGVzY2VuZGFudE9mKAotYW5kcm9pZC52aWV3LlZpZXcKLWFuZHJvaWQudmlldy5WaWV3KQotCi1wcml2YXRlIGJvb2xlYW4gbGVhdmVUb3VjaE1vZGUoKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVBYmFuZG9uR2xDYWNoZXMoKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVTaG93RlBTKAotYW5kcm9pZC5ncmFwaGljcy5DYW52YXMKLWludCkKLQotcHJpdmF0ZSB2b2lkIHBlcmZvcm1UcmF2ZXJzYWxzKCkKLQotcHVibGljIHZvaWQgYnJpbmdDaGlsZFRvRnJvbnQoCi1hbmRyb2lkLnZpZXcuVmlldykKLQotIHZvaWQgY2hlY2tUaHJlYWQoKQotCi1wdWJsaWMgdm9pZCBjaGlsZERyYXdhYmxlU3RhdGVDaGFuZ2VkKAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXB1YmxpYyB2b2lkIGNsZWFyQ2hpbGRGb2N1cygKLWFuZHJvaWQudmlldy5WaWV3KQotCi1wdWJsaWMgdm9pZCBjcmVhdGVDb250ZXh0TWVudSgKLWFuZHJvaWQudmlldy5Db250ZXh0TWVudSkKLQotcHVibGljIHZvaWQgZGVidWcoKQotCi1wdWJsaWMgdm9pZCBkaWUoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBkaXNwYXRjaEFwcFZpc2liaWxpdHkoCi1ib29sZWFuKQotCi0gdm9pZCBkaXNwYXRjaERldGFjaGVkRnJvbVdpbmRvdygpCi0KLXB1YmxpYyB2b2lkIGRpc3BhdGNoR2V0TmV3U3VyZmFjZSgpCi0KLXB1YmxpYyB2b2lkIGRpc3BhdGNoS2V5KAotYW5kcm9pZC52aWV3LktleUV2ZW50KQotCi1wdWJsaWMgdm9pZCBkaXNwYXRjaFBvaW50ZXIoCi1hbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQKLWxvbmcpCi0KLXB1YmxpYyB2b2lkIGRpc3BhdGNoUmVzaXplZCgKLWludAotaW50Ci1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBkaXNwYXRjaFRyYWNrYmFsbCgKLWFuZHJvaWQudmlldy5Nb3Rpb25FdmVudAotbG9uZykKLQotIGJvb2xlYW4gZW5zdXJlVG91Y2hNb2RlKAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL1Rocm93YWJsZTsgKQotcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKQotCi1wdWJsaWMgYW5kcm9pZC52aWV3LlZpZXcgZm9jdXNTZWFyY2goCi1hbmRyb2lkLnZpZXcuVmlldwotaW50KQotCi1wdWJsaWMgdm9pZCBmb2N1c2FibGVWaWV3QXZhaWxhYmxlKAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXB1YmxpYyBib29sZWFuIGdldENoaWxkVmlzaWJsZVJlY3QoCi1hbmRyb2lkLnZpZXcuVmlldwotYW5kcm9pZC5ncmFwaGljcy5SZWN0Ci1hbmRyb2lkLmdyYXBoaWNzLlBvaW50KQotCi0gaW50IGdldEhvc3RWaXNpYmlsaXR5KCkKLQotZmluYWwgYW5kcm9pZC52aWV3LldpbmRvd0xlYWtlZCBnZXRMb2NhdGlvbigpCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuVmlld1BhcmVudCBnZXRQYXJlbnQoKQotCi1wdWJsaWMgYW5kcm9pZC52aWV3LlZpZXcgZ2V0VmlldygpCi0KLXByb3RlY3RlZCBhbmRyb2lkLmdyYXBoaWNzLlJlY3QgZ2V0V2luZG93RnJhbWUoKQotCi0gdm9pZCBoYW5kbGVBcHBWaXNpYmlsaXR5KAotYm9vbGVhbikKLQotIHZvaWQgaGFuZGxlR2V0TmV3U3VyZmFjZSgpCi0KLXB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIGludmFsaWRhdGVDaGlsZCgKLWFuZHJvaWQudmlldy5WaWV3Ci1hbmRyb2lkLmdyYXBoaWNzLlJlY3QpCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuVmlld1BhcmVudCBpbnZhbGlkYXRlQ2hpbGRJblBhcmVudCgKLWludFtdCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3QpCi0KLXB1YmxpYyBib29sZWFuIGlzTGF5b3V0UmVxdWVzdGVkKCkKLQotcHVibGljIHZvaWQgcGxheVNvdW5kRWZmZWN0KAotaW50KQotCi1wdWJsaWMgdm9pZCBwcm9maWxlKCkKLQotcHVibGljIHZvaWQgcmVjb21wdXRlVmlld0F0dHJpYnV0ZXMoCi1hbmRyb2lkLnZpZXcuVmlldykKLQotcHVibGljIHZvaWQgcmVxdWVzdENoaWxkRm9jdXMoCi1hbmRyb2lkLnZpZXcuVmlldwotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXB1YmxpYyB2b2lkIHJlcXVlc3REaXNhbGxvd0ludGVyY2VwdFRvdWNoRXZlbnQoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCByZXF1ZXN0TGF5b3V0KCkKLQotcHVibGljIHZvaWQgcmVxdWVzdFRyYW5zcGFyZW50UmVnaW9uKAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXB1YmxpYyB2b2lkIHNjaGVkdWxlVHJhdmVyc2FscygpCi0KLXB1YmxpYyB2b2lkIHNldExheW91dFBhcmFtcygKLWFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyJExheW91dFBhcmFtcykKLQotcHVibGljIHZvaWQgc2V0VmlldygKLWFuZHJvaWQudmlldy5WaWV3Ci1hbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlciRMYXlvdXRQYXJhbXMKLWFuZHJvaWQudmlldy5WaWV3KQotCi1wdWJsaWMgYm9vbGVhbiBzaG93Q29udGV4dE1lbnVGb3JDaGlsZCgKLWFuZHJvaWQudmlldy5WaWV3KQotCi1wdWJsaWMgdm9pZCB1bnNjaGVkdWxlVHJhdmVyc2FscygpCi0KLXB1YmxpYyB2b2lkIHdpbmRvd0ZvY3VzQ2hhbmdlZCgKLWJvb2xlYW4KLWJvb2xlYW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9WaWV3U3R1YjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPU9uSW5mbGF0ZUxpc3RlbmVyICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC52aWV3LlZpZXdTdHViJE9uSW5mbGF0ZUxpc3RlbmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uSW5mbGF0ZSgKLWFuZHJvaWQudmlldy5WaWV3U3R1YgotYW5kcm9pZC52aWV3LlZpZXcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC92aWV3L1ZpZXdTdHViJE9uSW5mbGF0ZUxpc3RlbmVyOyApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC52aWV3LlZpZXdTdHViIGV4dGVuZHMgYW5kcm9pZC52aWV3LlZpZXcKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLnZpZXcuVmlld1N0dWIkT25JbmZsYXRlTGlzdGVuZXIgbUluZmxhdGVMaXN0ZW5lcgotCi1wcml2YXRlIGludCBtSW5mbGF0ZWRJZAotCi1wcml2YXRlIGludCBtTGF5b3V0UmVzb3VyY2UKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWludCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ci1pbnQpCi0KLXByaXZhdGUgdm9pZCBpbml0aWFsaXplKAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXByb3RlY3RlZCB2b2lkIGRpc3BhdGNoRHJhdygKLWFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzKQotCi1wdWJsaWMgdm9pZCBkcmF3KAotYW5kcm9pZC5ncmFwaGljcy5DYW52YXMpCi0KLXB1YmxpYyBpbnQgZ2V0SW5mbGF0ZWRJZCgpCi0KLXB1YmxpYyBpbnQgZ2V0TGF5b3V0UmVzb3VyY2UoKQotCi1wdWJsaWMgYW5kcm9pZC52aWV3LlZpZXcgaW5mbGF0ZSgpCi0KLXByb3RlY3RlZCB2b2lkIG9uTWVhc3VyZSgKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRJbmZsYXRlZElkKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRMYXlvdXRSZXNvdXJjZSgKLWludCkKLQotcHVibGljIHZvaWQgc2V0T25JbmZsYXRlTGlzdGVuZXIoCi1hbmRyb2lkLnZpZXcuVmlld1N0dWIkT25JbmZsYXRlTGlzdGVuZXIpCi0KLXB1YmxpYyB2b2lkIHNldFZpc2liaWxpdHkoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9WaWV3VHJlZU9ic2VydmVyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9T25HbG9iYWxGb2N1c0NoYW5nZUxpc3RlbmVyICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC52aWV3LlZpZXdUcmVlT2JzZXJ2ZXIkT25HbG9iYWxGb2N1c0NoYW5nZUxpc3RlbmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uR2xvYmFsRm9jdXNDaGFuZ2VkKAotYW5kcm9pZC52aWV3LlZpZXcKLWFuZHJvaWQudmlldy5WaWV3KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1PblByZURyYXdMaXN0ZW5lciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC92aWV3L1ZpZXdUcmVlT2JzZXJ2ZXI7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC52aWV3LlZpZXdUcmVlT2JzZXJ2ZXIkT25QcmVEcmF3TGlzdGVuZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gb25QcmVEcmF3KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC92aWV3L1ZpZXdUcmVlT2JzZXJ2ZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1PblRvdWNoTW9kZUNoYW5nZUxpc3RlbmVyICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC52aWV3LlZpZXdUcmVlT2JzZXJ2ZXIkT25Ub3VjaE1vZGVDaGFuZ2VMaXN0ZW5lciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvblRvdWNoTW9kZUNoYW5nZWQoCi1ib29sZWFuKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9WaWV3VHJlZU9ic2VydmVyJE9uVG91Y2hNb2RlQ2hhbmdlTGlzdGVuZXI7TGFuZHJvaWQvdmlldy9WaWV3VHJlZU9ic2VydmVyJE9uUHJlRHJhd0xpc3RlbmVyO0xhbmRyb2lkL3ZpZXcvVmlld1RyZWVPYnNlcnZlciRPbkdsb2JhbExheW91dExpc3RlbmVyO0xhbmRyb2lkL3ZpZXcvVmlld1RyZWVPYnNlcnZlciRPbkdsb2JhbEZvY3VzQ2hhbmdlTGlzdGVuZXI7ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLnZpZXcuVmlld1RyZWVPYnNlcnZlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBib29sZWFuIG1BbGl2ZQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQXJyYXlMaXN0PExhbmRyb2lkL3ZpZXcvVmlld1RyZWVPYnNlcnZlciRPbkdsb2JhbEZvY3VzQ2hhbmdlTGlzdGVuZXI7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuQXJyYXlMaXN0IG1Pbkdsb2JhbEZvY3VzTGlzdGVuZXJzCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9BcnJheUxpc3Q8TGFuZHJvaWQvdmlldy9WaWV3VHJlZU9ic2VydmVyJE9uR2xvYmFsTGF5b3V0TGlzdGVuZXI7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuQXJyYXlMaXN0IG1Pbkdsb2JhbExheW91dExpc3RlbmVycwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQXJyYXlMaXN0PExhbmRyb2lkL3ZpZXcvVmlld1RyZWVPYnNlcnZlciRPblByZURyYXdMaXN0ZW5lcjs+OyApCi1wcml2YXRlIGphdmEudXRpbC5BcnJheUxpc3QgbU9uUHJlRHJhd0xpc3RlbmVycwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQXJyYXlMaXN0PExhbmRyb2lkL3ZpZXcvVmlld1RyZWVPYnNlcnZlciRPblRvdWNoTW9kZUNoYW5nZUxpc3RlbmVyOz47ICkKLXByaXZhdGUgamF2YS51dGlsLkFycmF5TGlzdCBtT25Ub3VjaE1vZGVDaGFuZ2VMaXN0ZW5lcnMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIHZvaWQgY2hlY2tJc0FsaXZlKCkKLQotcHJpdmF0ZSB2b2lkIGtpbGwoKQotCi1wdWJsaWMgdm9pZCBhZGRPbkdsb2JhbEZvY3VzQ2hhbmdlTGlzdGVuZXIoCi1hbmRyb2lkLnZpZXcuVmlld1RyZWVPYnNlcnZlciRPbkdsb2JhbEZvY3VzQ2hhbmdlTGlzdGVuZXIpCi0KLXB1YmxpYyB2b2lkIGFkZE9uR2xvYmFsTGF5b3V0TGlzdGVuZXIoCi1hbmRyb2lkLnZpZXcuVmlld1RyZWVPYnNlcnZlciRPbkdsb2JhbExheW91dExpc3RlbmVyKQotCi1wdWJsaWMgdm9pZCBhZGRPblByZURyYXdMaXN0ZW5lcigKLWFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyJE9uUHJlRHJhd0xpc3RlbmVyKQotCi1wdWJsaWMgdm9pZCBhZGRPblRvdWNoTW9kZUNoYW5nZUxpc3RlbmVyKAotYW5kcm9pZC52aWV3LlZpZXdUcmVlT2JzZXJ2ZXIkT25Ub3VjaE1vZGVDaGFuZ2VMaXN0ZW5lcikKLQotZmluYWwgdm9pZCBkaXNwYXRjaE9uR2xvYmFsRm9jdXNDaGFuZ2UoCi1hbmRyb2lkLnZpZXcuVmlldwotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIGRpc3BhdGNoT25HbG9iYWxMYXlvdXQoKQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBkaXNwYXRjaE9uUHJlRHJhdygpCi0KLWZpbmFsIHZvaWQgZGlzcGF0Y2hPblRvdWNoTW9kZUNoYW5nZWQoCi1ib29sZWFuKQotCi1wdWJsaWMgYm9vbGVhbiBpc0FsaXZlKCkKLQotIHZvaWQgbWVyZ2UoCi1hbmRyb2lkLnZpZXcuVmlld1RyZWVPYnNlcnZlcikKLQotcHVibGljIHZvaWQgcmVtb3ZlR2xvYmFsT25MYXlvdXRMaXN0ZW5lcigKLWFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyJE9uR2xvYmFsTGF5b3V0TGlzdGVuZXIpCi0KLXB1YmxpYyB2b2lkIHJlbW92ZU9uR2xvYmFsRm9jdXNDaGFuZ2VMaXN0ZW5lcigKLWFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyJE9uR2xvYmFsRm9jdXNDaGFuZ2VMaXN0ZW5lcikKLQotcHVibGljIHZvaWQgcmVtb3ZlT25QcmVEcmF3TGlzdGVuZXIoCi1hbmRyb2lkLnZpZXcuVmlld1RyZWVPYnNlcnZlciRPblByZURyYXdMaXN0ZW5lcikKLQotcHVibGljIHZvaWQgcmVtb3ZlT25Ub3VjaE1vZGVDaGFuZ2VMaXN0ZW5lcigKLWFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyJE9uVG91Y2hNb2RlQ2hhbmdlTGlzdGVuZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC52aWV3LlZvbHVtZVBhbmVsIGV4dGVuZHMgYW5kcm9pZC5vcy5IYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCRUVQX0RVUkFUSU9OCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGUkVFX0RFTEFZCi0KLXByaXZhdGUgc3RhdGljIGJvb2xlYW4gTE9HRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1ZPTFVNRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0ZSRUVfUkVTT1VSQ0VTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfUExBWV9TT1VORAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1NUT1BfU09VTkRTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfVklCUkFURQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1ZPTFVNRV9DSEFOR0VECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMQVlfU09VTkRfREVMQVkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklCUkFURV9ERUxBWQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVklCUkFURV9EVVJBVElPTgotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUxBUk1fVk9MVU1FX1RFWFQKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIElOQ0FMTF9WT0xVTUVfVEVYVAotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTVVTSUNfVk9MVU1FX1RFWFQKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFJJTkdUT05FX1ZPTFVNRV9URVhUCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBVTktOT1dOX1ZPTFVNRV9URVhUCi0KLXByb3RlY3RlZCBhbmRyb2lkLm1lZGlhLkF1ZGlvU2VydmljZSBtQXVkaW9TZXJ2aWNlCi0KLXByb3RlY3RlZCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBtQ29udGV4dAotCi1wcml2YXRlIGFuZHJvaWQud2lkZ2V0LlByb2dyZXNzQmFyIG1MZXZlbAotCi1wcml2YXRlIGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3IG1NZXNzYWdlCi0KLXByaXZhdGUgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3IG1PdGhlclN0cmVhbUljb24KLQotcHJpdmF0ZSBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXcgbVJpbmdlclN0cmVhbUljb24KLQotcHJpdmF0ZSBhbmRyb2lkLndpZGdldC5Ub2FzdCBtVG9hc3QKLQotcHJpdmF0ZSBhbmRyb2lkLm1lZGlhLlRvbmVHZW5lcmF0b3JbXSBtVG9uZUdlbmVyYXRvcnMKLQotcHJpdmF0ZSBhbmRyb2lkLm9zLlZpYnJhdG9yIG1WaWJyYXRvcgotCi1wcml2YXRlIGFuZHJvaWQudmlldy5WaWV3IG1WaWV3Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC5tZWRpYS5BdWRpb1NlcnZpY2UpCi0KLXByaXZhdGUgYW5kcm9pZC5tZWRpYS5Ub25lR2VuZXJhdG9yIGdldE9yQ3JlYXRlVG9uZUdlbmVyYXRvcigKLWludCkKLQotcHJpdmF0ZSB2b2lkIHNldE90aGVySWNvbigKLWludCkKLQotcHJpdmF0ZSB2b2lkIHNldFJpbmdlckljb24oCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXByb3RlY3RlZCB2b2lkIG9uRnJlZVJlc291cmNlcygpCi0KLXByb3RlY3RlZCB2b2lkIG9uUGxheVNvdW5kKAotaW50Ci1pbnQpCi0KLXByb3RlY3RlZCB2b2lkIG9uU2hvd1ZvbHVtZUNoYW5nZWQoCi1pbnQKLWludCkKLQotcHJvdGVjdGVkIHZvaWQgb25TdG9wU291bmRzKCkKLQotcHJvdGVjdGVkIHZvaWQgb25WaWJyYXRlKCkKLQotcHJvdGVjdGVkIHZvaWQgb25Wb2x1bWVDaGFuZ2VkKAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIHBvc3RWb2x1bWVDaGFuZ2VkKAotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC92aWV3L1dpbmRvd01hbmFnZXIkTGF5b3V0UGFyYW1zO0xhbmRyb2lkL3ZpZXcvV2luZG93TWFuYWdlciRCYWRUb2tlbkV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnZpZXcuVmlld01hbmFnZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC52aWV3LkRpc3BsYXkgZ2V0RGVmYXVsdERpc3BsYXkoKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCByZW1vdmVWaWV3SW1tZWRpYXRlKAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9XaW5kb3c7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MiBuYW1lID1Mb2NhbFdpbmRvd01hbmFnZXIgKQotIGNsYXNzIGFuZHJvaWQudmlldy5XaW5kb3ckTG9jYWxXaW5kb3dNYW5hZ2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlciBtV2luZG93TWFuYWdlcgotCi1maW5hbCBhbmRyb2lkLnZpZXcuV2luZG93IHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQudmlldy5XaW5kb3cKLWFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyKQotCi1wdWJsaWMgZmluYWwgdm9pZCBhZGRWaWV3KAotYW5kcm9pZC52aWV3LlZpZXcKLWFuZHJvaWQudmlldy5WaWV3R3JvdXAkTGF5b3V0UGFyYW1zKQotCi1wdWJsaWMgYW5kcm9pZC52aWV3LkRpc3BsYXkgZ2V0RGVmYXVsdERpc3BsYXkoKQotCi1wdWJsaWMgZmluYWwgdm9pZCByZW1vdmVWaWV3KAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZVZpZXdJbW1lZGlhdGUoCi1hbmRyb2lkLnZpZXcuVmlldykKLQotcHVibGljIHZvaWQgdXBkYXRlVmlld0xheW91dCgKLWFuZHJvaWQudmlldy5WaWV3Ci1hbmRyb2lkLnZpZXcuVmlld0dyb3VwJExheW91dFBhcmFtcykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3ZpZXcvV2luZG93JExvY2FsV2luZG93TWFuYWdlcjtMYW5kcm9pZC92aWV3L1dpbmRvdyRDYWxsYmFjazsgKQotcHVibGljIGFic3RyYWN0IGNsYXNzIGFuZHJvaWQudmlldy5XaW5kb3cgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfRkVBVFVSRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkVBVFVSRV9DT05URVhUX01FTlUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkVBVFVSRV9DVVNUT01fVElUTEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkVBVFVSRV9JTkRFVEVSTUlOQVRFX1BST0dSRVNTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZFQVRVUkVfTEVGVF9JQ09OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZFQVRVUkVfTk9fVElUTEUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZFQVRVUkVfT1BFTkdMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZFQVRVUkVfT1BUSU9OU19QQU5FTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGRUFUVVJFX1BST0dSRVNTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZFQVRVUkVfUklHSFRfSUNPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BTkRST0lEX0NPTlRFTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPR1JFU1NfRU5ECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST0dSRVNTX0lOREVURVJNSU5BVEVfT0ZGCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST0dSRVNTX0lOREVURVJNSU5BVEVfT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPR1JFU1NfU0VDT05EQVJZX0VORAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9HUkVTU19TRUNPTkRBUllfU1RBUlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPR1JFU1NfU1RBUlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPR1JFU1NfVklTSUJJTElUWV9PRkYKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPR1JFU1NfVklTSUJJTElUWV9PTgotCi1wcml2YXRlIGFuZHJvaWQudmlldy5XaW5kb3cgbUFjdGl2ZUNoaWxkCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtQXBwTmFtZQotCi1wcml2YXRlIGFuZHJvaWQub3MuSUJpbmRlciBtQXBwVG9rZW4KLQotcHJpdmF0ZSBhbmRyb2lkLnZpZXcuV2luZG93JENhbGxiYWNrIG1DYWxsYmFjawotCi1wcml2YXRlIGFuZHJvaWQudmlldy5XaW5kb3cgbUNvbnRhaW5lcgotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQuY29udGVudC5Db250ZXh0IG1Db250ZXh0Ci0KLXByaXZhdGUgaW50IG1EZWZhdWx0V2luZG93Rm9ybWF0Ci0KLXByaXZhdGUgaW50IG1GZWF0dXJlcwotCi1wcml2YXRlIGludCBtRm9yY2VkV2luZG93RmxhZ3MKLQotcHJpdmF0ZSBib29sZWFuIG1IYXNDaGlsZHJlbgotCi1wcml2YXRlIGJvb2xlYW4gbUhhdmVXaW5kb3dGb3JtYXQKLQotcHJpdmF0ZSBib29sZWFuIG1Jc0FjdGl2ZQotCi1wcml2YXRlIGludCBtTG9jYWxGZWF0dXJlcwotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyJExheW91dFBhcmFtcyBtV2luZG93QXR0cmlidXRlcwotCi1wcml2YXRlIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyIG1XaW5kb3dNYW5hZ2VyCi0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5IG1XaW5kb3dTdHlsZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1zdGF0aWMgamF2YS5sYW5nLlN0cmluZyBhY2Nlc3MkMDAwKAotYW5kcm9pZC52aWV3LldpbmRvdykKLQotc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3cgYWNjZXNzJDEwMCgKLWFuZHJvaWQudmlldy5XaW5kb3cpCi0KLXN0YXRpYyBhbmRyb2lkLm9zLklCaW5kZXIgYWNjZXNzJDIwMCgKLWFuZHJvaWQudmlldy5XaW5kb3cpCi0KLXN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBhY2Nlc3MkMzAwKAotYW5kcm9pZC52aWV3LldpbmRvdykKLQotcHVibGljIGFic3RyYWN0IHZvaWQgYWRkQ29udGVudFZpZXcoCi1hbmRyb2lkLnZpZXcuVmlldwotYW5kcm9pZC52aWV3LlZpZXdHcm91cCRMYXlvdXRQYXJhbXMpCi0KLXB1YmxpYyB2b2lkIGFkZEZsYWdzKAotaW50KQotCi1wdWJsaWMgdm9pZCBjbGVhckZsYWdzKAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBjbG9zZUFsbFBhbmVscygpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGNsb3NlUGFuZWwoCi1pbnQpCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuVmlldyBmaW5kVmlld0J5SWQoCi1pbnQpCi0KLXB1YmxpYyBmaW5hbCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlciRMYXlvdXRQYXJhbXMgZ2V0QXR0cmlidXRlcygpCi0KLXB1YmxpYyBmaW5hbCBhbmRyb2lkLnZpZXcuV2luZG93JENhbGxiYWNrIGdldENhbGxiYWNrKCkKLQotcHVibGljIGZpbmFsIGFuZHJvaWQudmlldy5XaW5kb3cgZ2V0Q29udGFpbmVyKCkKLQotcHVibGljIGZpbmFsIGFuZHJvaWQuY29udGVudC5Db250ZXh0IGdldENvbnRleHQoKQotCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC52aWV3LlZpZXcgZ2V0Q3VycmVudEZvY3VzKCkKLQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQudmlldy5WaWV3IGdldERlY29yVmlldygpCi0KLXByb3RlY3RlZCBmaW5hbCBpbnQgZ2V0RmVhdHVyZXMoKQotCi1wcm90ZWN0ZWQgZmluYWwgaW50IGdldEZvcmNlZFdpbmRvd0ZsYWdzKCkKLQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlciBnZXRMYXlvdXRJbmZsYXRlcigpCi0KLXByb3RlY3RlZCBmaW5hbCBpbnQgZ2V0TG9jYWxGZWF0dXJlcygpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0Vm9sdW1lQ29udHJvbFN0cmVhbSgpCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlciBnZXRXaW5kb3dNYW5hZ2VyKCkKLQotcHVibGljIGZpbmFsIGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheSBnZXRXaW5kb3dTdHlsZSgpCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGhhc0NoaWxkcmVuKCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gaXNBY3RpdmUoKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0Zsb2F0aW5nKCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNTaG9ydGN1dEtleSgKLWludAotYW5kcm9pZC52aWV3LktleUV2ZW50KQotCi1wdWJsaWMgZmluYWwgdm9pZCBtYWtlQWN0aXZlKCkKLQotcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgb25BY3RpdmUoKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKAotYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvcGVuUGFuZWwoCi1pbnQKLWFuZHJvaWQudmlldy5LZXlFdmVudCkKLQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQudmlldy5WaWV3IHBlZWtEZWNvclZpZXcoKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBwZXJmb3JtQ29udGV4dE1lbnVJZGVudGlmaWVyQWN0aW9uKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHBlcmZvcm1QYW5lbElkZW50aWZpZXJBY3Rpb24oCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBwZXJmb3JtUGFuZWxTaG9ydGN1dCgKLWludAotaW50Ci1hbmRyb2lkLnZpZXcuS2V5RXZlbnQKLWludCkKLQotcHVibGljIGJvb2xlYW4gcmVxdWVzdEZlYXR1cmUoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlc3RvcmVIaWVyYXJjaHlTdGF0ZSgKLWFuZHJvaWQub3MuQnVuZGxlKQotCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC5vcy5CdW5kbGUgc2F2ZUhpZXJhcmNoeVN0YXRlKCkKLQotcHVibGljIHZvaWQgc2V0QXR0cmlidXRlcygKLWFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyJExheW91dFBhcmFtcykKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0QmFja2dyb3VuZERyYXdhYmxlKAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSkKLQotcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZERyYXdhYmxlUmVzb3VyY2UoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldENhbGxiYWNrKAotYW5kcm9pZC52aWV3LldpbmRvdyRDYWxsYmFjaykKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0Q2hpbGREcmF3YWJsZSgKLWludAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0Q2hpbGRJbnQoCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgc2V0Q29udGFpbmVyKAotYW5kcm9pZC52aWV3LldpbmRvdykKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0Q29udGVudFZpZXcoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldENvbnRlbnRWaWV3KAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldENvbnRlbnRWaWV3KAotYW5kcm9pZC52aWV3LlZpZXcKLWFuZHJvaWQudmlldy5WaWV3R3JvdXAkTGF5b3V0UGFyYW1zKQotCi1wcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0V2luZG93Rm9ybWF0KAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRGZWF0dXJlRHJhd2FibGUoCi1pbnQKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEZlYXR1cmVEcmF3YWJsZUFscGhhKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEZlYXR1cmVEcmF3YWJsZVJlc291cmNlKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEZlYXR1cmVEcmF3YWJsZVVyaSgKLWludAotYW5kcm9pZC5uZXQuVXJpKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRGZWF0dXJlSW50KAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldEZsYWdzKAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldEZvcm1hdCgKLWludCkKLQotcHVibGljIHZvaWQgc2V0R3Jhdml0eSgKLWludCkKLQotcHVibGljIHZvaWQgc2V0TGF5b3V0KAotaW50Ci1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFRpdGxlKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0VGl0bGVDb2xvcigKLWludCkKLQotcHVibGljIHZvaWQgc2V0VHlwZSgKLWludCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0Vm9sdW1lQ29udHJvbFN0cmVhbSgKLWludCkKLQotcHVibGljIHZvaWQgc2V0V2luZG93TWFuYWdlcigKLWFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyCi1hbmRyb2lkLm9zLklCaW5kZXIKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHN1cGVyRGlzcGF0Y2hLZXlFdmVudCgKLWFuZHJvaWQudmlldy5LZXlFdmVudCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gc3VwZXJEaXNwYXRjaFRvdWNoRXZlbnQoCi1hbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHN1cGVyRGlzcGF0Y2hUcmFja2JhbGxFdmVudCgKLWFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgdGFrZUtleUV2ZW50cygKLWJvb2xlYW4pCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHRvZ2dsZVBhbmVsKAotaW50Ci1hbmRyb2lkLnZpZXcuS2V5RXZlbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1maW5hbCBjbGFzcyBhbmRyb2lkLnZpZXcuV2luZG93TGVha2VkIGV4dGVuZHMgYW5kcm9pZC51dGlsLkFuZHJvaWRSdW50aW1lRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9QmFkVG9rZW5FeGNlcHRpb24gKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9XaW5kb3dNYW5hZ2VyOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIkQmFkVG9rZW5FeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9XaW5kb3dNYW5hZ2VyJExheW91dFBhcmFtczsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC92aWV3L1dpbmRvd01hbmFnZXIkTGF5b3V0UGFyYW1zOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLWZpbmFsIGNsYXNzIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyJExheW91dFBhcmFtcyQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyJExheW91dFBhcmFtcyBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyJExheW91dFBhcmFtc1tdIG5ld0FycmF5KAotaW50KQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdFtdIG5ld0FycmF5KAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3ZpZXcvV2luZG93TWFuYWdlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPUxheW91dFBhcmFtcyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIkTGF5b3V0UGFyYW1zIGV4dGVuZHMgYW5kcm9pZC52aWV3LlZpZXdHcm91cCRMYXlvdXRQYXJhbXMgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUxQSEFfQ0hBTkdFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTklNQVRJT05fQ0hBTkdFRAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC92aWV3L1dpbmRvd01hbmFnZXIkTGF5b3V0UGFyYW1zOz47ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IgQ1JFQVRPUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBESU1fQU1PVU5UX0NIQU5HRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklSU1RfQVBQTElDQVRJT05fV0lORE9XCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJUlNUX1NVQl9XSU5ET1cKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklSU1RfU1lTVEVNX1dJTkRPVwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHU19DSEFOR0VECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfQkxVUl9CRUhJTkQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19ESU1fQkVISU5ECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfRElUSEVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfRk9SQ0VfTk9UX0ZVTExTQ1JFRU4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19GVUxMU0NSRUVOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfSUdOT1JFX0NIRUVLX1BSRVNTRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19LRUVQX1NDUkVFTl9PTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX0xBWU9VVF9JTlNFVF9ERUNPUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX0xBWU9VVF9JTl9TQ1JFRU4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19MQVlPVVRfTk9fTElNSVRTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfTk9UX0ZPQ1VTQUJMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX05PVF9UT1VDSEFCTEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19OT1RfVE9VQ0hfTU9EQUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19TQ0FMRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19TRUNVUkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19TWVNURU1fRVJST1IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19UT1VDSEFCTEVfV0hFTl9XQUtJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0NIQU5HRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEFTVF9BUFBMSUNBVElPTl9XSU5ET1cKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEFTVF9TVUJfV0lORE9XCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExBU1RfU1lTVEVNX1dJTkRPVwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMQVlPVVRfQ0hBTkdFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRU1PUllfVFlQRV9DSEFOR0VECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FTU9SWV9UWVBFX0dQVQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRU1PUllfVFlQRV9IQVJEV0FSRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRU1PUllfVFlQRV9OT1JNQUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVNT1JZX1RZUEVfUFVTSF9CVUZGRVJTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRJVExFX0NIQU5HRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9BUFBMSUNBVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0FQUExJQ0FUSU9OX01FRElBCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfQVBQTElDQVRJT05fUEFORUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9BUFBMSUNBVElPTl9TVEFSVElORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0FQUExJQ0FUSU9OX1NVQl9QQU5FTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0JBU0VfQVBQTElDQVRJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9DSEFOR0VECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfS0VZR1VBUkQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9LRVlHVUFSRF9ESUFMT0cKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9QSE9ORQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1BSSU9SSVRZX1BIT05FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfU0VBUkNIX0JBUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1NUQVRVU19CQVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9TVEFUVVNfQkFSX1BBTkVMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfU1lTVEVNX0FMRVJUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfU1lTVEVNX0RJQUxPRwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1NZU1RFTV9FUlJPUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1NZU1RFTV9PVkVSTEFZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfVE9BU1QKLQotcHVibGljIGZsb2F0IGFscGhhCi0KLXB1YmxpYyBmbG9hdCBkaW1BbW91bnQKLQotcHVibGljIGludCBmbGFncwotCi1wdWJsaWMgaW50IGZvcm1hdAotCi1wdWJsaWMgaW50IGdyYXZpdHkKLQotcHVibGljIGZsb2F0IGhvcml6b250YWxNYXJnaW4KLQotcHVibGljIGZsb2F0IGhvcml6b250YWxXZWlnaHQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIG1UaXRsZQotCi1wdWJsaWMgaW50IG1lbW9yeVR5cGUKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgcGFja2FnZU5hbWUKLQotcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciB0b2tlbgotCi1wdWJsaWMgaW50IHR5cGUKLQotcHVibGljIGZsb2F0IHZlcnRpY2FsTWFyZ2luCi0KLXB1YmxpYyBmbG9hdCB2ZXJ0aWNhbFdlaWdodAotCi1wdWJsaWMgaW50IHdpbmRvd0FuaW1hdGlvbnMKLQotcHVibGljIGludCB4Ci0KLXB1YmxpYyBpbnQgeQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyBmaW5hbCBpbnQgY29weUZyb20oCi1hbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlciRMYXlvdXRQYXJhbXMpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGRlYnVnKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkKLQotcHVibGljIGZpbmFsIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgZ2V0VGl0bGUoKQotCi1wdWJsaWMgZmluYWwgdm9pZCBzZXRUaXRsZSgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXJJbXBsIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFERF9BUFBfRVhJVElORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRERfQkFEX0FQUF9UT0tFTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRERfQkFEX1NVQldJTkRPV19UT0tFTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRERfRFVQTElDQVRFX0FERAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRERfRkxBR19BUFBfVklTSUJMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRERfRkxBR19JTl9UT1VDSF9NT0RFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFERF9NVUxUSVBMRV9TSU5HTEVUT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUREX05PVF9BUFBfVE9LRU4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUREX09LQVkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUREX1BFUk1JU1NJT05fREVOSUVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFERF9TVEFSVElOR19OT1RfTkVFREVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTEFZT1VUX0ZJUlNUX1RJTUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVMQVlPVVRfSU5fVE9VQ0hfTU9ERQotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlckltcGwgbVdpbmRvd01hbmFnZXIKLQotcHJpdmF0ZSBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlciRMYXlvdXRQYXJhbXNbXSBtUGFyYW1zCi0KLXByaXZhdGUgYW5kcm9pZC52aWV3LlZpZXdSb290W10gbVJvb3RzCi0KLXByaXZhdGUgYW5kcm9pZC52aWV3LlZpZXdbXSBtVmlld3MKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgdm9pZCBhZGRWaWV3KAotYW5kcm9pZC52aWV3LlZpZXcKLWFuZHJvaWQudmlldy5WaWV3R3JvdXAkTGF5b3V0UGFyYW1zCi1ib29sZWFuKQotCi1wcml2YXRlIGludCBmaW5kVmlld0xvY2tlZCgKLWFuZHJvaWQudmlldy5WaWV3Ci1ib29sZWFuKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VySW1wbCBnZXREZWZhdWx0KCkKLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVJdGVtKAotamF2YS5sYW5nLk9iamVjdFtdCi1qYXZhLmxhbmcuT2JqZWN0W10KLWludCkKLQotcHVibGljIHZvaWQgYWRkVmlldygKLWFuZHJvaWQudmlldy5WaWV3KQotCi1wdWJsaWMgdm9pZCBhZGRWaWV3KAotYW5kcm9pZC52aWV3LlZpZXcKLWFuZHJvaWQudmlldy5WaWV3R3JvdXAkTGF5b3V0UGFyYW1zKQotCi1wdWJsaWMgdm9pZCBhZGRWaWV3TmVzdGluZygKLWFuZHJvaWQudmlldy5WaWV3Ci1hbmRyb2lkLnZpZXcuVmlld0dyb3VwJExheW91dFBhcmFtcykKLQotcHVibGljIHZvaWQgY2xvc2VBbGwoKQotCi1wdWJsaWMgdm9pZCBjbG9zZUFsbCgKLWFuZHJvaWQub3MuSUJpbmRlcgotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotIHZvaWQgZmluaXNoUmVtb3ZlVmlld0xvY2tlZCgKLWFuZHJvaWQudmlldy5WaWV3Ci1pbnQpCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuRGlzcGxheSBnZXREZWZhdWx0RGlzcGxheSgpCi0KLXB1YmxpYyB2b2lkIHJlbW92ZVZpZXcoCi1hbmRyb2lkLnZpZXcuVmlldykKLQotcHVibGljIHZvaWQgcmVtb3ZlVmlld0ltbWVkaWF0ZSgKLWFuZHJvaWQudmlldy5WaWV3KQotCi0gYW5kcm9pZC52aWV3LlZpZXcgcmVtb3ZlVmlld0xvY2tlZCgKLWludCkKLQotcHVibGljIHZvaWQgdXBkYXRlVmlld0xheW91dCgKLWFuZHJvaWQudmlldy5WaWV3Ci1hbmRyb2lkLnZpZXcuVmlld0dyb3VwJExheW91dFBhcmFtcykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC92aWV3L1dpbmRvd01hbmFnZXJQb2xpY3k7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1PbktleWd1YXJkRXhpdFJlc3VsdCApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyUG9saWN5JE9uS2V5Z3VhcmRFeGl0UmVzdWx0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uS2V5Z3VhcmRFeGl0UmVzdWx0KAotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9V2luZG93U3RhdGUgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9XaW5kb3dNYW5hZ2VyUG9saWN5OyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyUG9saWN5JFdpbmRvd1N0YXRlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGNvbXB1dGVGcmFtZUx3KAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGZpbGxzU2NyZWVuTHcoCi1pbnQKLWludAotYm9vbGVhbikKLQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyUG9saWN5JFdpbmRvd1N0YXRlIGdldEFwcFN0YXJ0aW5nV2luZG93KCkKLQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQudmlldy5JQXBwbGljYXRpb25Ub2tlbiBnZXRBcHBUb2tlbigpCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlciRMYXlvdXRQYXJhbXMgZ2V0QXR0cnMoKQotCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC5ncmFwaGljcy5SZWN0IGdldEZyYW1lTHcoKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBoYXNBcHBTaG93bldpbmRvd3MoKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBoYXNBcHBTdGFydGluZ0ljb24oKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBoYXNEcmF3bkx3KCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgaGlkZUx3KCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNEaXNwbGF5ZWRMdygpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldENvdmVyZWRJbnNldHNMdygKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RnJhbWVMdygKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2hvd0x3KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3ZpZXcvV2luZG93TWFuYWdlclBvbGljeSRPbktleWd1YXJkRXhpdFJlc3VsdDtMYW5kcm9pZC92aWV3L1dpbmRvd01hbmFnZXJQb2xpY3kkV2luZG93U3RhdGU7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXJQb2xpY3kgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDVElPTl9HT19UT19TTEVFUAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ1RJT05fUEFTU19UT19VU0VSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDVElPTl9QT0tFX1VTRVJfQUNUSVZJVFkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19BTFQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19BTFRfR1IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19CUklHSFRfSEVSRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX0NBUFNfTE9DSwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX0xBVU5DSEVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfTUVOVQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1NISUZUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfV0FLRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1dBS0VfRFJPUFBFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1dPS0VfSEVSRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPRkZfQkVDQVVTRV9PRl9USU1FT1VUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9GRl9CRUNBVVNFX09GX1VTRVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNJVF9BQ1RJVklUWV9DTE9TRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUUkFOU0lUX0FDVElWSVRZX09QRU4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNJVF9FTlRFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUUkFOU0lUX0VYSVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNJVF9ISURFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSQU5TSVRfTk9ORQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUUkFOU0lUX1BSRVZJRVdfRE9ORQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUUkFOU0lUX1NIT1cKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNJVF9UQVNLX0NMT1NFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSQU5TSVRfVEFTS19PUEVOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSQU5TSVRfVEFTS19UT19CQUNLCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSQU5TSVRfVEFTS19UT19GUk9OVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBVU0VfTEFTVF9ST1RBVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gV0FUQ0hfUE9JTlRFUgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLnZpZXcuVmlldyBhZGRTdGFydGluZ1dpbmRvdygKLWFuZHJvaWQub3MuSUJpbmRlcgotamF2YS5sYW5nLlN0cmluZwotaW50Ci1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgYWRqdXN0Q29uZmlndXJhdGlvbkx3KAotYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBhZGp1c3RXaW5kb3dQYXJhbXNMdygKLWFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyJExheW91dFBhcmFtcykKLQotcHVibGljIGFic3RyYWN0IHZvaWQgYW5pbWF0aW5nV2luZG93THcoCi1hbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlclBvbGljeSRXaW5kb3dTdGF0ZQotYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIkTGF5b3V0UGFyYW1zKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBiZWdpbkFuaW1hdGlvbkx3KAotaW50Ci1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGJlZ2luTGF5b3V0THcoCi1pbnQKLWludCkKLQotcHVibGljIGFic3RyYWN0IGludCBjaGVja0FkZFBlcm1pc3Npb24oCi1hbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlciRMYXlvdXRQYXJhbXMpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGVuYWJsZUtleWd1YXJkKAotYm9vbGVhbikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZW5hYmxlU2NyZWVuQWZ0ZXJCb290KCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZXhpdEtleWd1YXJkU2VjdXJlbHkoCi1hbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlclBvbGljeSRPbktleWd1YXJkRXhpdFJlc3VsdCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZmluaXNoQW5pbWF0aW9uTHcoKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBmaW5pc2hMYXlvdXRMdygpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdldENvdmVyZWRJbnNldEhpbnRMdygKLWFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyJExheW91dFBhcmFtcwotYW5kcm9pZC5ncmFwaGljcy5SZWN0KQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpbktleWd1YXJkUmVzdHJpY3RlZEtleUlucHV0TW9kZSgpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGluaXQoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC52aWV3LklXaW5kb3dNYW5hZ2VyCi1hbmRyb2lkLm9zLkxvY2FsUG93ZXJNYW5hZ2VyKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpbnRlcmNlcHRLZXlUaSgKLWFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyUG9saWN5JFdpbmRvd1N0YXRlCi1pbnQKLWludAotYm9vbGVhbgotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGludGVyY2VwdEtleVRxKAotYW5kcm9pZC52aWV3LlJhd0lucHV0RXZlbnQKLWJvb2xlYW4pCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzQXBwU3dpdGNoS2V5VHFUaUx3TGkoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzQ2hlZWtQcmVzc2VkQWdhaW5zdFNjcmVlbigKLWFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNNb3ZlbWVudEtleVRpKAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1dha2VBYnNNb3ZlbWVudFRxKAotaW50Ci1pbnQKLWFuZHJvaWQudmlldy5SYXdJbnB1dEV2ZW50KQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1dha2VSZWxNb3ZlbWVudFRxKAotaW50Ci1pbnQKLWFuZHJvaWQudmlldy5SYXdJbnB1dEV2ZW50KQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBrZXlndWFyZElzU2hvd2luZ1RxKCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgbGF5b3V0V2luZG93THcoCi1hbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlclBvbGljeSRXaW5kb3dTdGF0ZQotYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIkTGF5b3V0UGFyYW1zCi1hbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlclBvbGljeSRXaW5kb3dTdGF0ZSkKLQotcHVibGljIGFic3RyYWN0IGludCBwcmVwYXJlQWRkV2luZG93THcoCi1hbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlclBvbGljeSRXaW5kb3dTdGF0ZQotYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIkTGF5b3V0UGFyYW1zKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBwcmVwcm9jZXNzSW5wdXRFdmVudFRxKAotYW5kcm9pZC52aWV3LlJhd0lucHV0RXZlbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlbW92ZVN0YXJ0aW5nV2luZG93KAotYW5kcm9pZC5vcy5JQmluZGVyCi1hbmRyb2lkLnZpZXcuVmlldykKLQotcHVibGljIGFic3RyYWN0IHZvaWQgcmVtb3ZlV2luZG93THcoCi1hbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlclBvbGljeSRXaW5kb3dTdGF0ZSkKLQotcHVibGljIGFic3RyYWN0IGludCByb3RhdGlvbkZvck9yaWVudGF0aW9uKAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzY3JlZW5UdXJuZWRPZmYoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNjcmVlblR1cm5lZE9uKCkKLQotcHVibGljIGFic3RyYWN0IGludCBzZWxlY3RBbmltYXRpb25MdygKLWFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyUG9saWN5JFdpbmRvd1N0YXRlCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEN1cnJlbnRPcmllbnRhdGlvbigKLWludCkKLQotcHVibGljIGFic3RyYWN0IGludCBzdWJXaW5kb3dUeXBlVG9MYXllckx3KAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzeXN0ZW1SZWFkeSgpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgd2luZG93VHlwZVRvTGF5ZXJMdygKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IGZsb2F0IGdldEludGVycG9sYXRpb24oCi1mbG9hdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFjY2VsZXJhdGVEZWNlbGVyYXRlSW50ZXJwb2xhdG9yIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQudmlldy5hbmltYXRpb24uSW50ZXJwb2xhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi0KLXB1YmxpYyBmbG9hdCBnZXRJbnRlcnBvbGF0aW9uKAotZmxvYXQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BY2NlbGVyYXRlSW50ZXJwb2xhdG9yIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQudmlldy5hbmltYXRpb24uSW50ZXJwb2xhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmxvYXQgbUZhY3RvcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWZsb2F0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHVibGljIGZsb2F0IGdldEludGVycG9sYXRpb24oCi1mbG9hdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL0FuaW1hdGlvbiRBbmltYXRpb25MaXN0ZW5lcjtMYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9BbmltYXRpb24kRGVzY3JpcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvbiBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTT0xVVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GSU5JVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVMQVRJVkVfVE9fUEFSRU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTEFUSVZFX1RPX1NFTEYKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTVEFSVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVZFUlNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVJUX09OX0ZJUlNUX0ZSQU1FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFpPUkRFUl9CT1RUT00KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWk9SREVSX05PUk1BTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBaT1JERVJfVE9QCi0KLSBib29sZWFuIG1DeWNsZUZsaXAKLQotIGxvbmcgbUR1cmF0aW9uCi0KLSBib29sZWFuIG1FbmRlZAotCi0gYm9vbGVhbiBtRmlsbEFmdGVyCi0KLSBib29sZWFuIG1GaWxsQmVmb3JlCi0KLSBib29sZWFuIG1Jbml0aWFsaXplZAotCi0gYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3IgbUludGVycG9sYXRvcgotCi0gYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb24kQW5pbWF0aW9uTGlzdGVuZXIgbUxpc3RlbmVyCi0KLXByaXZhdGUgYm9vbGVhbiBtTW9yZQotCi0gaW50IG1SZXBlYXRDb3VudAotCi0gaW50IG1SZXBlYXRNb2RlCi0KLSBpbnQgbVJlcGVhdGVkCi0KLSBsb25nIG1TdGFydE9mZnNldAotCi0gbG9uZyBtU3RhcnRUaW1lCi0KLSBib29sZWFuIG1TdGFydGVkCi0KLXByaXZhdGUgaW50IG1aQWRqdXN0bWVudAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0KQotCi1wcm90ZWN0ZWQgdm9pZCBhcHBseVRyYW5zZm9ybWF0aW9uKAotZmxvYXQKLWFuZHJvaWQudmlldy5hbmltYXRpb24uVHJhbnNmb3JtYXRpb24pCi0KLXByb3RlY3RlZCB2b2lkIGVuc3VyZUludGVycG9sYXRvcigpCi0KLXB1YmxpYyBsb25nIGdldER1cmF0aW9uKCkKLQotcHVibGljIGJvb2xlYW4gZ2V0RmlsbEFmdGVyKCkKLQotcHVibGljIGJvb2xlYW4gZ2V0RmlsbEJlZm9yZSgpCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvciBnZXRJbnRlcnBvbGF0b3IoKQotCi1wdWJsaWMgaW50IGdldFJlcGVhdENvdW50KCkKLQotcHVibGljIGludCBnZXRSZXBlYXRNb2RlKCkKLQotcHVibGljIGxvbmcgZ2V0U3RhcnRPZmZzZXQoKQotCi1wdWJsaWMgbG9uZyBnZXRTdGFydFRpbWUoKQotCi1wdWJsaWMgYm9vbGVhbiBnZXRUcmFuc2Zvcm1hdGlvbigKLWxvbmcKLWFuZHJvaWQudmlldy5hbmltYXRpb24uVHJhbnNmb3JtYXRpb24pCi0KLXB1YmxpYyBpbnQgZ2V0WkFkanVzdG1lbnQoKQotCi1wdWJsaWMgYm9vbGVhbiBoYXNFbmRlZCgpCi0KLXB1YmxpYyBib29sZWFuIGhhc1N0YXJ0ZWQoKQotCi1wdWJsaWMgdm9pZCBpbml0aWFsaXplKAotaW50Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBpc0luaXRpYWxpemVkKCkKLQotcHVibGljIHZvaWQgcmVzZXQoKQotCi1wcm90ZWN0ZWQgZmxvYXQgcmVzb2x2ZVNpemUoCi1pbnQKLWZsb2F0Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgcmVzdHJpY3REdXJhdGlvbigKLWxvbmcpCi0KLXB1YmxpYyB2b2lkIHNjYWxlQ3VycmVudER1cmF0aW9uKAotZmxvYXQpCi0KLXB1YmxpYyB2b2lkIHNldEFuaW1hdGlvbkxpc3RlbmVyKAotYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb24kQW5pbWF0aW9uTGlzdGVuZXIpCi0KLXB1YmxpYyB2b2lkIHNldER1cmF0aW9uKAotbG9uZykKLQotcHVibGljIHZvaWQgc2V0RmlsbEFmdGVyKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0RmlsbEJlZm9yZSgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldEludGVycG9sYXRvcigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldEludGVycG9sYXRvcigKLWFuZHJvaWQudmlldy5hbmltYXRpb24uSW50ZXJwb2xhdG9yKQotCi1wdWJsaWMgdm9pZCBzZXRSZXBlYXRDb3VudCgKLWludCkKLQotcHVibGljIHZvaWQgc2V0UmVwZWF0TW9kZSgKLWludCkKLQotcHVibGljIHZvaWQgc2V0U3RhcnRPZmZzZXQoCi1sb25nKQotCi1wdWJsaWMgdm9pZCBzZXRTdGFydFRpbWUoCi1sb25nKQotCi1wdWJsaWMgdm9pZCBzZXRaQWRqdXN0bWVudCgKLWludCkKLQotcHVibGljIHZvaWQgc3RhcnQoKQotCi1wdWJsaWMgdm9pZCBzdGFydE5vdygpCi0KLXB1YmxpYyBib29sZWFuIHdpbGxDaGFuZ2VCb3VuZHMoKQotCi1wdWJsaWMgYm9vbGVhbiB3aWxsQ2hhbmdlVHJhbnNmb3JtYXRpb25NYXRyaXgoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQudmlldy5hbmltYXRpb24uQWxwaGFBbmltYXRpb24gZXh0ZW5kcyBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZsb2F0IG1Gcm9tQWxwaGEKLQotcHJpdmF0ZSBmbG9hdCBtVG9BbHBoYQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi0KLXByb3RlY3RlZCB2b2lkIGFwcGx5VHJhbnNmb3JtYXRpb24oCi1mbG9hdAotYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5UcmFuc2Zvcm1hdGlvbikKLQotcHVibGljIGJvb2xlYW4gd2lsbENoYW5nZUJvdW5kcygpCi0KLXB1YmxpYyBib29sZWFuIHdpbGxDaGFuZ2VUcmFuc2Zvcm1hdGlvbk1hdHJpeCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPUFuaW1hdGlvbkxpc3RlbmVyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL0FuaW1hdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvbiRBbmltYXRpb25MaXN0ZW5lciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvbkFuaW1hdGlvbkVuZCgKLWFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvbkFuaW1hdGlvblJlcGVhdCgKLWFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvbkFuaW1hdGlvblN0YXJ0KAotYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb24pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMiBuYW1lID1EZXNjcmlwdGlvbiApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9BbmltYXRpb247ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvbiREZXNjcmlwdGlvbiBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGludCB0eXBlCi0KLXB1YmxpYyBmbG9hdCB2YWx1ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigpCi0KLXN0YXRpYyBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvbiREZXNjcmlwdGlvbiBwYXJzZVZhbHVlKAotYW5kcm9pZC51dGlsLlR5cGVkVmFsdWUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb25TZXQgZXh0ZW5kcyBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfRFVSQVRJT05fTUFTSwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfRklMTF9BRlRFUl9NQVNLCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9GSUxMX0JFRk9SRV9NQVNLCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9NT1JQSF9NQVRSSVhfTUFTSwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUkVQRUFUX01PREVfTUFTSwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfU0hBUkVfSU5URVJQT0xBVE9SX01BU0sKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1NUQVJUX09GRlNFVF9NQVNLCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9BcnJheUxpc3Q8TGFuZHJvaWQvdmlldy9hbmltYXRpb24vQW5pbWF0aW9uOz47ICkKLXByaXZhdGUgamF2YS51dGlsLkFycmF5TGlzdCBtQW5pbWF0aW9ucwotCi1wcml2YXRlIGludCBtRmxhZ3MKLQotcHJpdmF0ZSBsb25nIG1MYXN0RW5kCi0KLXByaXZhdGUgbG9uZ1tdIG1TdG9yZWRPZmZzZXRzCi0KLXByaXZhdGUgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5UcmFuc2Zvcm1hdGlvbiBtVGVtcFRyYW5zZm9ybWF0aW9uCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWJvb2xlYW4pCi0KLXByaXZhdGUgdm9pZCBpbml0KCkKLQotcHJpdmF0ZSB2b2lkIHNldEZsYWcoCi1pbnQKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIGFkZEFuaW1hdGlvbigKLWFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL0FuaW1hdGlvbjs+OyApCi1wdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0QW5pbWF0aW9ucygpCi0KLXB1YmxpYyBsb25nIGdldER1cmF0aW9uKCkKLQotcHVibGljIGxvbmcgZ2V0U3RhcnRUaW1lKCkKLQotcHVibGljIGJvb2xlYW4gZ2V0VHJhbnNmb3JtYXRpb24oCi1sb25nCi1hbmRyb2lkLnZpZXcuYW5pbWF0aW9uLlRyYW5zZm9ybWF0aW9uKQotCi1wdWJsaWMgdm9pZCBpbml0aWFsaXplKAotaW50Ci1pbnQKLWludAotaW50KQotCi0gdm9pZCByZXN0b3JlQ2hpbGRyZW5TdGFydE9mZnNldCgpCi0KLXB1YmxpYyB2b2lkIHJlc3RyaWN0RHVyYXRpb24oCi1sb25nKQotCi0gdm9pZCBzYXZlQ2hpbGRyZW5TdGFydE9mZnNldCgKLWxvbmcpCi0KLXB1YmxpYyB2b2lkIHNjYWxlQ3VycmVudER1cmF0aW9uKAotZmxvYXQpCi0KLXB1YmxpYyB2b2lkIHNldER1cmF0aW9uKAotbG9uZykKLQotcHVibGljIHZvaWQgc2V0RmlsbEFmdGVyKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0RmlsbEJlZm9yZSgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldFJlcGVhdE1vZGUoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldFN0YXJ0T2Zmc2V0KAotbG9uZykKLQotcHVibGljIHZvaWQgc2V0U3RhcnRUaW1lKAotbG9uZykKLQotcHVibGljIGJvb2xlYW4gd2lsbENoYW5nZVRyYW5zZm9ybWF0aW9uTWF0cml4KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvblV0aWxzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgc3RhdGljIGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uIGNyZWF0ZUFuaW1hdGlvbkZyb21YbWwoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBzdGF0aWMgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb24gY3JlYXRlQW5pbWF0aW9uRnJvbVhtbCgKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1vcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyCi1hbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvblNldAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBzdGF0aWMgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3IgY3JlYXRlSW50ZXJwb2xhdG9yRnJvbVhtbCgKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1vcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkxheW91dEFuaW1hdGlvbkNvbnRyb2xsZXIgY3JlYXRlTGF5b3V0QW5pbWF0aW9uRnJvbVhtbCgKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1vcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkxheW91dEFuaW1hdGlvbkNvbnRyb2xsZXIgY3JlYXRlTGF5b3V0QW5pbWF0aW9uRnJvbVhtbCgKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1vcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyCi1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0KQotCi1wdWJsaWMgc3RhdGljIGxvbmcgY3VycmVudEFuaW1hdGlvblRpbWVNaWxsaXMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL2NvbnRlbnQvcmVzL1Jlc291cmNlcyROb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvbiBsb2FkQW5pbWF0aW9uKAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3Jlcy9SZXNvdXJjZXMkTm90Rm91bmRFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3IgbG9hZEludGVycG9sYXRvcigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvY29udGVudC9yZXMvUmVzb3VyY2VzJE5vdEZvdW5kRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQudmlldy5hbmltYXRpb24uTGF5b3V0QW5pbWF0aW9uQ29udHJvbGxlciBsb2FkTGF5b3V0QW5pbWF0aW9uKAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWludCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvbiBtYWtlSW5BbmltYXRpb24oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYm9vbGVhbikKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvbiBtYWtlSW5DaGlsZEJvdHRvbUFuaW1hdGlvbigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uIG1ha2VPdXRBbmltYXRpb24oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkN5Y2xlSW50ZXJwb2xhdG9yIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQudmlldy5hbmltYXRpb24uSW50ZXJwb2xhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmxvYXQgbUN5Y2xlcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWZsb2F0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHVibGljIGZsb2F0IGdldEludGVycG9sYXRpb24oCi1mbG9hdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkRlY2VsZXJhdGVJbnRlcnBvbGF0b3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmbG9hdCBtRmFjdG9yCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotZmxvYXQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0KQotCi1wdWJsaWMgZmxvYXQgZ2V0SW50ZXJwb2xhdGlvbigKLWZsb2F0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL0xheW91dEFuaW1hdGlvbkNvbnRyb2xsZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1BbmltYXRpb25QYXJhbWV0ZXJzICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkxheW91dEFuaW1hdGlvbkNvbnRyb2xsZXIkQW5pbWF0aW9uUGFyYW1ldGVycyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGludCBjb3VudAotCi1wdWJsaWMgaW50IGluZGV4Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9HcmlkTGF5b3V0QW5pbWF0aW9uQ29udHJvbGxlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPUFuaW1hdGlvblBhcmFtZXRlcnMgKQotcHVibGljIGNsYXNzIGFuZHJvaWQudmlldy5hbmltYXRpb24uR3JpZExheW91dEFuaW1hdGlvbkNvbnRyb2xsZXIkQW5pbWF0aW9uUGFyYW1ldGVycyBleHRlbmRzIGFuZHJvaWQudmlldy5hbmltYXRpb24uTGF5b3V0QW5pbWF0aW9uQ29udHJvbGxlciRBbmltYXRpb25QYXJhbWV0ZXJzCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBpbnQgY29sdW1uCi0KLXB1YmxpYyBpbnQgY29sdW1uc0NvdW50Ci0KLXB1YmxpYyBpbnQgcm93Ci0KLXB1YmxpYyBpbnQgcm93c0NvdW50Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL0xheW91dEFuaW1hdGlvbkNvbnRyb2xsZXIkMTtMYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9MYXlvdXRBbmltYXRpb25Db250cm9sbGVyJERlbGF5ZWRBbmltYXRpb247TGFuZHJvaWQvdmlldy9hbmltYXRpb24vTGF5b3V0QW5pbWF0aW9uQ29udHJvbGxlciRBbmltYXRpb25QYXJhbWV0ZXJzOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5MYXlvdXRBbmltYXRpb25Db250cm9sbGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUkRFUl9OT1JNQUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1JERVJfUkFORE9NCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9SREVSX1JFVkVSU0UKLQotcHJvdGVjdGVkIGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uIG1BbmltYXRpb24KLQotcHJpdmF0ZSBmbG9hdCBtRGVsYXkKLQotcHJpdmF0ZSBsb25nIG1EdXJhdGlvbgotCi1wcm90ZWN0ZWQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3IgbUludGVycG9sYXRvcgotCi1wcml2YXRlIGxvbmcgbU1heERlbGF5Ci0KLXByaXZhdGUgaW50IG1PcmRlcgotCi1wcm90ZWN0ZWQgamF2YS51dGlsLlJhbmRvbSBtUmFuZG9taXplcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvbikKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb24KLWZsb2F0KQotCi1wdWJsaWMgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb24gZ2V0QW5pbWF0aW9uKCkKLQotcHVibGljIGZpbmFsIGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uIGdldEFuaW1hdGlvbkZvclZpZXcoCi1hbmRyb2lkLnZpZXcuVmlldykKLQotcHVibGljIGZsb2F0IGdldERlbGF5KCkKLQotcHJvdGVjdGVkIGxvbmcgZ2V0RGVsYXlGb3JWaWV3KAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvciBnZXRJbnRlcnBvbGF0b3IoKQotCi1wdWJsaWMgaW50IGdldE9yZGVyKCkKLQotcHJvdGVjdGVkIGludCBnZXRUcmFuc2Zvcm1lZEluZGV4KAotYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5MYXlvdXRBbmltYXRpb25Db250cm9sbGVyJEFuaW1hdGlvblBhcmFtZXRlcnMpCi0KLXB1YmxpYyBib29sZWFuIGlzRG9uZSgpCi0KLXB1YmxpYyB2b2lkIHNldEFuaW1hdGlvbigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldEFuaW1hdGlvbigKLWFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uKQotCi1wdWJsaWMgdm9pZCBzZXREZWxheSgKLWZsb2F0KQotCi1wdWJsaWMgdm9pZCBzZXRJbnRlcnBvbGF0b3IoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRJbnRlcnBvbGF0b3IoCi1hbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvcikKLQotcHVibGljIHZvaWQgc2V0T3JkZXIoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHN0YXJ0KCkKLQotcHVibGljIGJvb2xlYW4gd2lsbE92ZXJsYXAoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9hbmltYXRpb24vR3JpZExheW91dEFuaW1hdGlvbkNvbnRyb2xsZXIkQW5pbWF0aW9uUGFyYW1ldGVyczsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQudmlldy5hbmltYXRpb24uR3JpZExheW91dEFuaW1hdGlvbkNvbnRyb2xsZXIgZXh0ZW5kcyBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkxheW91dEFuaW1hdGlvbkNvbnRyb2xsZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElSRUNUSU9OX0JPVFRPTV9UT19UT1AKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElSRUNUSU9OX0hPUklaT05UQUxfTUFTSwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVJFQ1RJT05fTEVGVF9UT19SSUdIVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVJFQ1RJT05fUklHSFRfVE9fTEVGVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVJFQ1RJT05fVE9QX1RPX0JPVFRPTQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVJFQ1RJT05fVkVSVElDQUxfTUFTSwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklPUklUWV9DT0xVTU4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJT1JJVFlfTk9ORQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklPUklUWV9ST1cKLQotcHJpdmF0ZSBmbG9hdCBtQ29sdW1uRGVsYXkKLQotcHJpdmF0ZSBpbnQgbURpcmVjdGlvbgotCi1wcml2YXRlIGludCBtRGlyZWN0aW9uUHJpb3JpdHkKLQotcHJpdmF0ZSBmbG9hdCBtUm93RGVsYXkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb24pCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uCi1mbG9hdAotZmxvYXQpCi0KLXByaXZhdGUgaW50IGdldFRyYW5zZm9ybWVkQ29sdW1uSW5kZXgoCi1hbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkdyaWRMYXlvdXRBbmltYXRpb25Db250cm9sbGVyJEFuaW1hdGlvblBhcmFtZXRlcnMpCi0KLXByaXZhdGUgaW50IGdldFRyYW5zZm9ybWVkUm93SW5kZXgoCi1hbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkdyaWRMYXlvdXRBbmltYXRpb25Db250cm9sbGVyJEFuaW1hdGlvblBhcmFtZXRlcnMpCi0KLXB1YmxpYyBmbG9hdCBnZXRDb2x1bW5EZWxheSgpCi0KLXByb3RlY3RlZCBsb25nIGdldERlbGF5Rm9yVmlldygKLWFuZHJvaWQudmlldy5WaWV3KQotCi1wdWJsaWMgaW50IGdldERpcmVjdGlvbigpCi0KLXB1YmxpYyBpbnQgZ2V0RGlyZWN0aW9uUHJpb3JpdHkoKQotCi1wdWJsaWMgZmxvYXQgZ2V0Um93RGVsYXkoKQotCi1wdWJsaWMgdm9pZCBzZXRDb2x1bW5EZWxheSgKLWZsb2F0KQotCi1wdWJsaWMgdm9pZCBzZXREaXJlY3Rpb24oCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldERpcmVjdGlvblByaW9yaXR5KAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRSb3dEZWxheSgKLWZsb2F0KQotCi1wdWJsaWMgYm9vbGVhbiB3aWxsT3ZlcmxhcCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9hbmltYXRpb24vTGF5b3V0QW5pbWF0aW9uQ29udHJvbGxlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID00MTA0IG5hbWUgPW51bGwgKQotIGNsYXNzIGFuZHJvaWQudmlldy5hbmltYXRpb24uTGF5b3V0QW5pbWF0aW9uQ29udHJvbGxlciQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvdmlldy9hbmltYXRpb24vTGF5b3V0QW5pbWF0aW9uQ29udHJvbGxlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1EZWxheWVkQW5pbWF0aW9uICkKLSBjbGFzcyBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkxheW91dEFuaW1hdGlvbkNvbnRyb2xsZXIkRGVsYXllZEFuaW1hdGlvbiBleHRlbmRzIGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb24gbUFuaW1hdGlvbgotCi1wcml2YXRlIGZpbmFsIGxvbmcgbURlbGF5Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWxvbmcKLWFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uKQotCi0gdm9pZCA8aW5pdD4oCi1sb25nCi1hbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvbgotYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5MYXlvdXRBbmltYXRpb25Db250cm9sbGVyJDEpCi0KLXB1YmxpYyBsb25nIGdldER1cmF0aW9uKCkKLQotcHVibGljIGJvb2xlYW4gZ2V0RmlsbEFmdGVyKCkKLQotcHVibGljIGJvb2xlYW4gZ2V0RmlsbEJlZm9yZSgpCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvciBnZXRJbnRlcnBvbGF0b3IoKQotCi1wdWJsaWMgaW50IGdldFJlcGVhdE1vZGUoKQotCi1wdWJsaWMgbG9uZyBnZXRTdGFydE9mZnNldCgpCi0KLXB1YmxpYyBsb25nIGdldFN0YXJ0VGltZSgpCi0KLXB1YmxpYyBib29sZWFuIGdldFRyYW5zZm9ybWF0aW9uKAotbG9uZwotYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5UcmFuc2Zvcm1hdGlvbikKLQotcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpCi0KLXB1YmxpYyB2b2lkIHJlc2V0KCkKLQotcHVibGljIHZvaWQgc2NhbGVDdXJyZW50RHVyYXRpb24oCi1mbG9hdCkKLQotcHVibGljIHZvaWQgc2V0RHVyYXRpb24oCi1sb25nKQotCi1wdWJsaWMgdm9pZCBzZXRGaWxsQWZ0ZXIoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRGaWxsQmVmb3JlKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0SW50ZXJwb2xhdG9yKAotYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3IpCi0KLXB1YmxpYyB2b2lkIHNldFJlcGVhdE1vZGUoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldFN0YXJ0T2Zmc2V0KAotbG9uZykKLQotcHVibGljIHZvaWQgc2V0U3RhcnRUaW1lKAotbG9uZykKLQotcHVibGljIGJvb2xlYW4gd2lsbENoYW5nZUJvdW5kcygpCi0KLXB1YmxpYyBib29sZWFuIHdpbGxDaGFuZ2VUcmFuc2Zvcm1hdGlvbk1hdHJpeCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5MaW5lYXJJbnRlcnBvbGF0b3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHVibGljIGZsb2F0IGdldEludGVycG9sYXRpb24oCi1mbG9hdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLlJvdGF0ZUFuaW1hdGlvbiBleHRlbmRzIGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmxvYXQgbUZyb21EZWdyZWVzCi0KLXByaXZhdGUgZmxvYXQgbVBpdm90WAotCi1wcml2YXRlIGludCBtUGl2b3RYVHlwZQotCi1wcml2YXRlIGZsb2F0IG1QaXZvdFhWYWx1ZQotCi1wcml2YXRlIGZsb2F0IG1QaXZvdFkKLQotcHJpdmF0ZSBpbnQgbVBpdm90WVR5cGUKLQotcHJpdmF0ZSBmbG9hdCBtUGl2b3RZVmFsdWUKLQotcHJpdmF0ZSBmbG9hdCBtVG9EZWdyZWVzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotZmxvYXQKLWZsb2F0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1mbG9hdAotZmxvYXQKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotZmxvYXQKLWZsb2F0Ci1pbnQKLWZsb2F0Ci1pbnQKLWZsb2F0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHJvdGVjdGVkIHZvaWQgYXBwbHlUcmFuc2Zvcm1hdGlvbigKLWZsb2F0Ci1hbmRyb2lkLnZpZXcuYW5pbWF0aW9uLlRyYW5zZm9ybWF0aW9uKQotCi1wdWJsaWMgdm9pZCBpbml0aWFsaXplKAotaW50Ci1pbnQKLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQudmlldy5hbmltYXRpb24uU2NhbGVBbmltYXRpb24gZXh0ZW5kcyBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZsb2F0IG1Gcm9tWAotCi1wcml2YXRlIGZsb2F0IG1Gcm9tWQotCi1wcml2YXRlIGZsb2F0IG1QaXZvdFgKLQotcHJpdmF0ZSBpbnQgbVBpdm90WFR5cGUKLQotcHJpdmF0ZSBmbG9hdCBtUGl2b3RYVmFsdWUKLQotcHJpdmF0ZSBmbG9hdCBtUGl2b3RZCi0KLXByaXZhdGUgaW50IG1QaXZvdFlUeXBlCi0KLXByaXZhdGUgZmxvYXQgbVBpdm90WVZhbHVlCi0KLXByaXZhdGUgZmxvYXQgbVRvWAotCi1wcml2YXRlIGZsb2F0IG1Ub1kKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1mbG9hdAotZmxvYXQKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotZmxvYXQKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotZmxvYXQKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWludAotZmxvYXQKLWludAotZmxvYXQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0KQotCi1wcm90ZWN0ZWQgdm9pZCBhcHBseVRyYW5zZm9ybWF0aW9uKAotZmxvYXQKLWFuZHJvaWQudmlldy5hbmltYXRpb24uVHJhbnNmb3JtYXRpb24pCi0KLXB1YmxpYyB2b2lkIGluaXRpYWxpemUoCi1pbnQKLWludAotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5UcmFuc2Zvcm1hdGlvbiBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBpbnQgVFlQRV9BTFBIQQotCi1wdWJsaWMgc3RhdGljIGludCBUWVBFX0JPVEgKLQotcHVibGljIHN0YXRpYyBpbnQgVFlQRV9JREVOVElUWQotCi1wdWJsaWMgc3RhdGljIGludCBUWVBFX01BVFJJWAotCi1wcm90ZWN0ZWQgZmxvYXQgbUFscGhhCi0KLXByb3RlY3RlZCBhbmRyb2lkLmdyYXBoaWNzLk1hdHJpeCBtTWF0cml4Ci0KLXByb3RlY3RlZCBpbnQgbVRyYW5zZm9ybWF0aW9uVHlwZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgY2xlYXIoKQotCi1wdWJsaWMgdm9pZCBjb21wb3NlKAotYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5UcmFuc2Zvcm1hdGlvbikKLQotcHVibGljIGZsb2F0IGdldEFscGhhKCkKLQotcHVibGljIGFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4IGdldE1hdHJpeCgpCi0KLXB1YmxpYyBpbnQgZ2V0VHJhbnNmb3JtYXRpb25UeXBlKCkKLQotcHVibGljIHZvaWQgc2V0KAotYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5UcmFuc2Zvcm1hdGlvbikKLQotcHVibGljIHZvaWQgc2V0QWxwaGEoCi1mbG9hdCkKLQotcHVibGljIHZvaWQgc2V0VHJhbnNmb3JtYXRpb25UeXBlKAotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5UcmFuc2xhdGVBbmltYXRpb24gZXh0ZW5kcyBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZsb2F0IG1Gcm9tWERlbHRhCi0KLXByaXZhdGUgaW50IG1Gcm9tWFR5cGUKLQotcHJpdmF0ZSBmbG9hdCBtRnJvbVhWYWx1ZQotCi1wcml2YXRlIGZsb2F0IG1Gcm9tWURlbHRhCi0KLXByaXZhdGUgaW50IG1Gcm9tWVR5cGUKLQotcHJpdmF0ZSBmbG9hdCBtRnJvbVlWYWx1ZQotCi1wcml2YXRlIGZsb2F0IG1Ub1hEZWx0YQotCi1wcml2YXRlIGludCBtVG9YVHlwZQotCi1wcml2YXRlIGZsb2F0IG1Ub1hWYWx1ZQotCi1wcml2YXRlIGZsb2F0IG1Ub1lEZWx0YQotCi1wcml2YXRlIGludCBtVG9ZVHlwZQotCi1wcml2YXRlIGZsb2F0IG1Ub1lWYWx1ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWZsb2F0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWZsb2F0Ci1pbnQKLWZsb2F0Ci1pbnQKLWZsb2F0Ci1pbnQKLWZsb2F0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHJvdGVjdGVkIHZvaWQgYXBwbHlUcmFuc2Zvcm1hdGlvbigKLWZsb2F0Ci1hbmRyb2lkLnZpZXcuYW5pbWF0aW9uLlRyYW5zZm9ybWF0aW9uKQotCi1wdWJsaWMgdm9pZCBpbml0aWFsaXplKAotaW50Ci1pbnQKLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotIGNsYXNzIGFuZHJvaWQud2Via2l0LkJyb3dzZXJGcmFtZSBleHRlbmRzIGFuZHJvaWQub3MuSGFuZGxlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgaW50IEZSQU1FX0NPTVBMRVRFRAotCi1zdGF0aWMgZmluYWwgaW50IEZSQU1FX0xPQURUWVBFX0JBQ0sKLQotc3RhdGljIGZpbmFsIGludCBGUkFNRV9MT0FEVFlQRV9GT1JXQVJECi0KLXN0YXRpYyBmaW5hbCBpbnQgRlJBTUVfTE9BRFRZUEVfSU5ERVhFREJBQ0tGT1JXQVJECi0KLXN0YXRpYyBmaW5hbCBpbnQgRlJBTUVfTE9BRFRZUEVfUkVESVJFQ1QKLQotc3RhdGljIGZpbmFsIGludCBGUkFNRV9MT0FEVFlQRV9SRUxPQUQKLQotc3RhdGljIGZpbmFsIGludCBGUkFNRV9MT0FEVFlQRV9SRUxPQURBTExPV0lOR1NUQUxFREFUQQotCi1zdGF0aWMgZmluYWwgaW50IEZSQU1FX0xPQURUWVBFX1JFUExBQ0UKLQotc3RhdGljIGZpbmFsIGludCBGUkFNRV9MT0FEVFlQRV9TQU1FCi0KLXN0YXRpYyBmaW5hbCBpbnQgRlJBTUVfTE9BRFRZUEVfU1RBTkRBUkQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMT0dUQUcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9PVVRTVEFORElOR19SRVFVRVNUUwotCi1zdGF0aWMgZmluYWwgaW50IFBPTElDWV9GVU5DVElPTgotCi1zdGF0aWMgZmluYWwgaW50IFBPTElDWV9JR05PUkUKLQotc3RhdGljIGZpbmFsIGludCBQT0xJQ1lfVVNFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUUkFOU0lUSU9OX1NXSVRDSF9USFJFU0hPTEQKLQotc3RhdGljIGFuZHJvaWQud2Via2l0LkpXZWJDb3JlSmF2YUJyaWRnZSBzSmF2YUJyaWRnZQotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQud2Via2l0LkNhbGxiYWNrUHJveHkgbUNhbGxiYWNrUHJveHkKLQotcHJpdmF0ZSBib29sZWFuIG1Db21taXR0ZWQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1Db21wbGV0ZWRVcmwKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBtQ29udGV4dAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbUN1cnJlbnRVcmwKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLndlYmtpdC5XZWJWaWV3RGF0YWJhc2UgbURhdGFiYXNlCi0KLXByaXZhdGUgYm9vbGVhbiBtRmlyc3RMYXlvdXREb25lCi0KLXByaXZhdGUgYm9vbGVhbiBtSXNNYWluRnJhbWUKLQotcHJpdmF0ZSBqYXZhLnV0aWwuSGFzaE1hcCBtSlNJbnRlcmZhY2VNYXAKLQotcHJpdmF0ZSBib29sZWFuIG1Mb2FkSW5pdEZyb21KYXZhCi0KLXByaXZhdGUgaW50IG1Mb2FkVHlwZQotCi0gaW50IG1OYXRpdmVGcmFtZQotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzIG1TZXR0aW5ncwotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQud2Via2l0LldlYlZpZXdDb3JlIG1XZWJWaWV3Q29yZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLndlYmtpdC5XZWJWaWV3Q29yZQotYW5kcm9pZC53ZWJraXQuQ2FsbGJhY2tQcm94eQotYW5kcm9pZC53ZWJraXQuV2ViU2V0dGluZ3MpCi0KLXByaXZhdGUgdm9pZCBjbG9zZVdpbmRvdygKLWFuZHJvaWQud2Via2l0LldlYlZpZXdDb3JlKQotCi1wcml2YXRlIGFuZHJvaWQud2Via2l0LkJyb3dzZXJGcmFtZSBjcmVhdGVXaW5kb3coCi1ib29sZWFuCi1ib29sZWFuKQotCi1wcml2YXRlIHZvaWQgZGVjaWRlUG9saWN5Rm9yRm9ybVJlc3VibWlzc2lvbigKLWludCkKLQotcHJpdmF0ZSB2b2lkIGRpZFJlY2VpdmVJY29uKAotYW5kcm9pZC5ncmFwaGljcy5CaXRtYXApCi0KLXByaXZhdGUgbmF0aXZlIGphdmEubGFuZy5TdHJpbmcgZG9jdW1lbnRBc1RleHQoKQotCi1wcml2YXRlIG5hdGl2ZSBqYXZhLmxhbmcuU3RyaW5nIGV4dGVybmFsUmVwcmVzZW50YXRpb24oKQotCi1wcml2YXRlIG5hdGl2ZSBqYXZhLnV0aWwuSGFzaE1hcCBnZXRGb3JtVGV4dERhdGEoKQotCi1wcml2YXRlIG5hdGl2ZSBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0VXNlcm5hbWVQYXNzd29yZCgpCi0KLXByaXZhdGUgbmF0aXZlIGJvb2xlYW4gaGFzUGFzc3dvcmRGaWVsZCgpCi0KLXByaXZhdGUgdm9pZCBsb2FkRmluaXNoZWQoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWJvb2xlYW4pCi0KLXByaXZhdGUgdm9pZCBsb2FkU3RhcnRlZCgKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwCi1pbnQKLWJvb2xlYW4pCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlQWRkSmF2YXNjcmlwdEludGVyZmFjZSgKLWludAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVDYWxsUG9saWN5RnVuY3Rpb24oCi1pbnQKLWludCkKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVDcmVhdGVGcmFtZSgKLWFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRNYW5hZ2VyCi1hbmRyb2lkLndlYmtpdC5XZWJCYWNrRm9yd2FyZExpc3QpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlQ3JlYXRlVmlldygKLWFuZHJvaWQud2Via2l0LldlYlZpZXdDb3JlKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZURldGFjaFZpZXcoKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZUxvYWREYXRhKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVMb2FkVXJsKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSB2b2lkIHJlcG9ydEVycm9yKAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHZvaWQgcmVxdWVzdEZvY3VzKCkKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBzZXRDYWNoZURpc2FibGVkKAotYm9vbGVhbikKLQotcHJpdmF0ZSB2b2lkIHNldFByb2dyZXNzKAotaW50KQotCi1wcml2YXRlIHZvaWQgc2V0VGl0bGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIHNldFVzZXJuYW1lUGFzc3dvcmQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIGFuZHJvaWQud2Via2l0LkxvYWRMaXN0ZW5lciBzdGFydExvYWRpbmdSZXNvdXJjZSgKLWludAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS51dGlsLkhhc2hNYXAKLWphdmEubGFuZy5TdHJpbmcKLWludAotYm9vbGVhbgotYm9vbGVhbikKLQotcHJpdmF0ZSB2b2lkIHRyYW5zaXRpb25Ub0NvbW1pdHRlZCgKLWludAotYm9vbGVhbikKLQotcHJpdmF0ZSB2b2lkIHVwZGF0ZVZpc2l0ZWRIaXN0b3J5KAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotcHJpdmF0ZSB2b2lkIHdpbmRvd09iamVjdENsZWFyZWQoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGFkZEphdmFzY3JpcHRJbnRlcmZhY2UoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgbmF0aXZlIGJvb2xlYW4gY2FjaGVEaXNhYmxlZCgpCi0KLSB2b2lkIGNlcnRpZmljYXRlKAotYW5kcm9pZC5uZXQuaHR0cC5Tc2xDZXJ0aWZpY2F0ZSkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGNsZWFyQ2FjaGUoKQotCi0gYm9vbGVhbiBjb21taXR0ZWQoKQotCi0gamF2YS5sYW5nLlN0cmluZyBjdXJyZW50VXJsKCkKLQotcHVibGljIHZvaWQgZGVzdHJveSgpCi0KLSB2b2lkIGRpZEZpcnN0TGF5b3V0KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgZG9jdW1lbnRBc1RleHQoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyBuYXRpdmUgYm9vbGVhbiBkb2N1bWVudEhhc0ltYWdlcygpCi0KLXB1YmxpYyB2b2lkIGV4dGVybmFsUmVwcmVzZW50YXRpb24oCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLSBib29sZWFuIGZpcnN0TGF5b3V0RG9uZSgpCi0KLSBhbmRyb2lkLndlYmtpdC5DYWxsYmFja1Byb3h5IGdldENhbGxiYWNrUHJveHkoKQotCi0gamF2YS5sYW5nLlN0cmluZyBnZXRVc2VyQWdlbnRTdHJpbmcoKQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ29CYWNrT3JGb3J3YXJkKAotaW50KQotCi1wdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgYm9vbGVhbiBoYW5kbGVVcmwoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBsb2FkRGF0YSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLSBpbnQgbG9hZFR5cGUoKQotCi1wdWJsaWMgdm9pZCBsb2FkVXJsKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIG5hdGl2ZSB2b2lkIG5hdGl2ZURlc3Ryb3lGcmFtZSgpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCByZWxvYWQoCi1ib29sZWFuKQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgc3RvcExvYWRpbmcoKQotCi1wdWJsaWMgbmF0aXZlIGphdmEubGFuZy5TdHJpbmcgc3RyaW5nQnlFdmFsdWF0aW5nSmF2YVNjcmlwdEZyb21TdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1DaHVuayApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93ZWJraXQvQnl0ZUFycmF5QnVpbGRlcjsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQud2Via2l0LkJ5dGVBcnJheUJ1aWxkZXIkQ2h1bmsgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBieXRlW10gbUFycmF5Ci0KLXB1YmxpYyBpbnQgbUxlbmd0aAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3dlYmtpdC9CeXRlQXJyYXlCdWlsZGVyJENodW5rOyApCi0gY2xhc3MgYW5kcm9pZC53ZWJraXQuQnl0ZUFycmF5QnVpbGRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQ0FQQUNJVFkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0xpbmtlZExpc3Q8TGFuZHJvaWQvd2Via2l0L0J5dGVBcnJheUJ1aWxkZXIkQ2h1bms7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuTGlua2VkTGlzdCBtQ2h1bmtzCi0KLXByaXZhdGUgaW50IG1NaW5DYXBhY2l0eQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvTGlua2VkTGlzdDxMYW5kcm9pZC93ZWJraXQvQnl0ZUFycmF5QnVpbGRlciRDaHVuazs+OyApCi1wcml2YXRlIGphdmEudXRpbC5MaW5rZWRMaXN0IG1Qb29sCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50KQotCi1wcml2YXRlIGFuZHJvaWQud2Via2l0LkJ5dGVBcnJheUJ1aWxkZXIkQ2h1bmsgYXBwZW5kQ2h1bmsoCi1pbnQpCi0KLXByaXZhdGUgdm9pZCBpbml0KAotaW50KQotCi1wcml2YXRlIGFuZHJvaWQud2Via2l0LkJ5dGVBcnJheUJ1aWxkZXIkQ2h1bmsgb2J0YWluQ2h1bmsoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGFwcGVuZCgKLWJ5dGVbXSkKLQotcHVibGljIHZvaWQgYXBwZW5kKAotYnl0ZVtdCi1pbnQKLWludCkKLQotcHVibGljIGFuZHJvaWQud2Via2l0LkJ5dGVBcnJheUJ1aWxkZXIkQ2h1bmsgZ2V0Rmlyc3RDaHVuaygpCi0KLXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKQotCi1wdWJsaWMgdm9pZCByZWxlYXNlQ2h1bmsoCi1hbmRyb2lkLndlYmtpdC5CeXRlQXJyYXlCdWlsZGVyJENodW5rKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC53ZWJraXQuU3RyZWFtTG9hZGVyIGV4dGVuZHMgYW5kcm9pZC5vcy5IYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfREFUQQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0VORAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0hFQURFUlMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19TVEFUVVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE5PX1NUT1JFCi0KLXByb3RlY3RlZCBsb25nIG1Db250ZW50TGVuZ3RoCi0KLXByaXZhdGUgYnl0ZVtdIG1EYXRhCi0KLXByb3RlY3RlZCBqYXZhLmlvLklucHV0U3RyZWFtIG1EYXRhU3RyZWFtCi0KLXByb3RlY3RlZCBhbmRyb2lkLndlYmtpdC5Mb2FkTGlzdGVuZXIgbUhhbmRsZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLndlYmtpdC5Mb2FkTGlzdGVuZXIpCi0KLXByaXZhdGUgdm9pZCBjbG9zZVN0cmVhbUFuZFNlbmRFbmREYXRhKCkKLQotcHJpdmF0ZSBib29sZWFuIHNlbmREYXRhKCkKLQotcHJpdmF0ZSB2b2lkIHNlbmRIZWFkZXJzKCkKLQotcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYnVpbGRIZWFkZXJzKAotYW5kcm9pZC5uZXQuaHR0cC5IZWFkZXJzKQotCi1wdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBsb2FkKCkKLQotcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gc2V0dXBTdHJlYW1BbmRTZW5kU3RhdHVzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLSBjbGFzcyBhbmRyb2lkLndlYmtpdC5DYWNoZUxvYWRlciBleHRlbmRzIGFuZHJvaWQud2Via2l0LlN0cmVhbUxvYWRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gYW5kcm9pZC53ZWJraXQuQ2FjaGVNYW5hZ2VyJENhY2hlUmVzdWx0IG1DYWNoZVJlc3VsdAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQud2Via2l0LkxvYWRMaXN0ZW5lcgotYW5kcm9pZC53ZWJraXQuQ2FjaGVNYW5hZ2VyJENhY2hlUmVzdWx0KQotCi1wcm90ZWN0ZWQgdm9pZCBidWlsZEhlYWRlcnMoCi1hbmRyb2lkLm5ldC5odHRwLkhlYWRlcnMpCi0KLXByb3RlY3RlZCBib29sZWFuIHNldHVwU3RyZWFtQW5kU2VuZFN0YXR1cygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotZmluYWwgY2xhc3MgYW5kcm9pZC53ZWJraXQuQ2FjaGVNYW5hZ2VyJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5sYW5nLlJ1bm5hYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9Q2FjaGVSZXN1bHQgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2Via2l0L0NhY2hlTWFuYWdlcjsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQud2Via2l0LkNhY2hlTWFuYWdlciRDYWNoZVJlc3VsdCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGxvbmcgY29udGVudExlbmd0aAotCi0gamF2YS5sYW5nLlN0cmluZyBlbmNvZGluZwotCi0gamF2YS5sYW5nLlN0cmluZyBldGFnCi0KLSBsb25nIGV4cGlyZXMKLQotIGludCBodHRwU3RhdHVzQ29kZQotCi0gamF2YS5pby5JbnB1dFN0cmVhbSBpblN0cmVhbQotCi0gamF2YS5sYW5nLlN0cmluZyBsYXN0TW9kaWZpZWQKLQotIGphdmEubGFuZy5TdHJpbmcgbG9jYWxQYXRoCi0KLSBqYXZhLmxhbmcuU3RyaW5nIGxvY2F0aW9uCi0KLSBqYXZhLmxhbmcuU3RyaW5nIG1pbWVUeXBlCi0KLSBqYXZhLmlvLkZpbGUgb3V0RmlsZQotCi0gamF2YS5pby5PdXRwdXRTdHJlYW0gb3V0U3RyZWFtCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGxvbmcgZ2V0Q29udGVudExlbmd0aCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEVUYWcoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRFbmNvZGluZygpCi0KLXB1YmxpYyBsb25nIGdldEV4cGlyZXMoKQotCi1wdWJsaWMgaW50IGdldEh0dHBTdGF0dXNDb2RlKCkKLQotcHVibGljIGphdmEuaW8uSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRMYXN0TW9kaWZpZWQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRMb2NhbFBhdGgoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRMb2NhdGlvbigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE1pbWVUeXBlKCkKLQotcHVibGljIGphdmEuaW8uT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpCi0KLXB1YmxpYyB2b2lkIHNldEVuY29kaW5nKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0SW5wdXRTdHJlYW0oCi1qYXZhLmlvLklucHV0U3RyZWFtKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvd2Via2l0L0NhY2hlTWFuYWdlciRDYWNoZVJlc3VsdDsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQud2Via2l0LkNhY2hlTWFuYWdlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgbG9uZyBDQUNIRV9USFJFU0hPTEQKLQotcHJpdmF0ZSBzdGF0aWMgbG9uZyBDQUNIRV9UUklNX0FNT1VOVAotCi1zdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBIRUFERVJfS0VZX0lGTU9ESUZJRURTSU5DRQotCi1zdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBIRUFERVJfS0VZX0lGTk9ORU1BVENICi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTE9HVEFHCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTUFYX0FHRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE5PX0NBQ0hFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTk9fU1RPUkUKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5pby5GaWxlIG1CYXNlRGlyCi0KLXByaXZhdGUgc3RhdGljIGFuZHJvaWQud2Via2l0LldlYlZpZXdEYXRhYmFzZSBtRGF0YUJhc2UKLQotcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtRGlzYWJsZWQKLQotcHJpdmF0ZSBzdGF0aWMgaW50IG1SZWZDb3VudAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotc3RhdGljIGphdmEuaW8uRmlsZSBhY2Nlc3MkMDAwKCkKLQotc3RhdGljIGFuZHJvaWQud2Via2l0LldlYlZpZXdEYXRhYmFzZSBhY2Nlc3MkMTAwKCkKLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBhcHBlbmRBc0hleCgKLWludAotamF2YS5sYW5nLlN0cmluZ0J1ZmZlcikKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGNhY2hlRGlzYWJsZWQoKQotCi1zdGF0aWMgYm9vbGVhbiBjYWNoZUVtcHR5KCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLndlYmtpdC5DYWNoZU1hbmFnZXIkQ2FjaGVSZXN1bHQgY3JlYXRlQ2FjaGVGaWxlKAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1hbmRyb2lkLm5ldC5odHRwLkhlYWRlcnMKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4pCi0KLXN0YXRpYyBib29sZWFuIGRpc2FibGVUcmFuc2FjdGlvbigpCi0KLXN0YXRpYyBib29sZWFuIGVuYWJsZVRyYW5zYWN0aW9uKCkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGVuZENhY2hlVHJhbnNhY3Rpb24oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1N0cmluZztMamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzs+OylMYW5kcm9pZC93ZWJraXQvQ2FjaGVNYW5hZ2VyJENhY2hlUmVzdWx0OyApCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQud2Via2l0LkNhY2hlTWFuYWdlciRDYWNoZVJlc3VsdCBnZXRDYWNoZUZpbGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnV0aWwuTWFwKQotCi1wdWJsaWMgc3RhdGljIGphdmEuaW8uRmlsZSBnZXRDYWNoZUZpbGVCYXNlRGlyKCkKLQotc3RhdGljIHZvaWQgaW5pdCgKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLndlYmtpdC5DYWNoZU1hbmFnZXIkQ2FjaGVSZXN1bHQgcGFyc2VIZWFkZXJzKAotaW50Ci1hbmRyb2lkLm5ldC5odHRwLkhlYWRlcnMKLWphdmEubGFuZy5TdHJpbmcpCi0KLXN0YXRpYyBib29sZWFuIHJlbW92ZUFsbENhY2hlRmlsZXMoKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgc2F2ZUNhY2hlRmlsZSgKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQud2Via2l0LkNhY2hlTWFuYWdlciRDYWNoZVJlc3VsdCkKLQotc3RhdGljIHZvaWQgc2V0Q2FjaGVEaXNhYmxlZCgKLWJvb2xlYW4pCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgc2V0dXBGaWxlcygKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQud2Via2l0LkNhY2hlTWFuYWdlciRDYWNoZVJlc3VsdCkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIHN0YXJ0Q2FjaGVUcmFuc2FjdGlvbigpCi0KLXN0YXRpYyB2b2lkIHRyaW1DYWNoZUlmTmVlZGVkKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93ZWJraXQvQ2FsbGJhY2tQcm94eTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID00MTA0IG5hbWUgPW51bGwgKQotIGNsYXNzIGFuZHJvaWQud2Via2l0LkNhbGxiYWNrUHJveHkkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dlYmtpdC9DYWxsYmFja1Byb3h5OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTIgbmFtZSA9UmVzdWx0VHJhbnNwb3J0ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08RTpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvbGFuZy9PYmplY3Q7ICkKLSBjbGFzcyBhbmRyb2lkLndlYmtpdC5DYWxsYmFja1Byb3h5JFJlc3VsdFRyYW5zcG9ydCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1URTsgKQotcHJpdmF0ZSBqYXZhLmxhbmcuT2JqZWN0IG1SZXN1bHQKLQotZmluYWwgYW5kcm9pZC53ZWJraXQuQ2FsbGJhY2tQcm94eSB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53ZWJraXQuQ2FsbGJhY2tQcm94eSkKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53ZWJraXQuQ2FsbGJhY2tQcm94eQotYW5kcm9pZC53ZWJraXQuQ2FsbGJhY2tQcm94eSQxKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVEU7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldFJlc3VsdCgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRFOylWICkKLXB1YmxpYyB2b2lkIHNldFJlc3VsdCgKLWphdmEubGFuZy5PYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC93ZWJraXQvQ2FsbGJhY2tQcm94eSQxO0xhbmRyb2lkL3dlYmtpdC9DYWxsYmFja1Byb3h5JFJlc3VsdFRyYW5zcG9ydDsgKQotIGNsYXNzIGFuZHJvaWQud2Via2l0LkNhbGxiYWNrUHJveHkgZXh0ZW5kcyBhbmRyb2lkLm9zLkhhbmRsZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFTWU5DX0tFWUVWRU5UUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVVUSF9SRVFVRVNUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTE9TRV9XSU5ET1cKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENSRUFURV9XSU5ET1cKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERPV05MT0FEX0ZJTEUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEpTX0FMRVJUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBKU19DT05GSVJNCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBKU19QUk9NUFQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEpTX1VOTE9BRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTE9BRF9SRVNPVVJDRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIExPR1RBRwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9USUZZCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPVkVSUklERV9VUkwKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBR0VfRklOSVNIRUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBR0VfU1RBUlRFRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFJPR1JFU1MKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFQ0VJVkVEX0NFUlRJRklDQVRFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRUNFSVZFRF9JQ09OCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRUNFSVZFRF9USVRMRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVQT1JUX0VSUk9SCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVFVRVNUX0ZPQ1VTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVNFTkRfUE9TVF9EQVRBCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTQVZFX1BBU1NXT1JECi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTQ0FMRV9DSEFOR0VECi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTU0xfRVJST1IKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNXSVRDSF9PVVRfSElTVE9SWQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVE9PX01BTllfUkVESVJFQ1RTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVUERBVEVfVklTSVRFRAotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQud2Via2l0LldlYkJhY2tGb3J3YXJkTGlzdCBtQmFja0ZvcndhcmRMaXN0Ci0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgbUNvbnRleHQKLQotcHJpdmF0ZSB2b2xhdGlsZSBhbmRyb2lkLndlYmtpdC5Eb3dubG9hZExpc3RlbmVyIG1Eb3dubG9hZExpc3RlbmVyCi0KLXByaXZhdGUgdm9sYXRpbGUgaW50IG1MYXRlc3RQcm9ncmVzcwotCi1wcml2YXRlIGJvb2xlYW4gbVByb2dyZXNzVXBkYXRlUGVuZGluZwotCi1wcml2YXRlIHZvbGF0aWxlIGFuZHJvaWQud2Via2l0LldlYkNocm9tZUNsaWVudCBtV2ViQ2hyb21lQ2xpZW50Ci0KLXByaXZhdGUgbG9uZyBtV2ViQ29yZVRocmVhZFRpbWUKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLndlYmtpdC5XZWJWaWV3IG1XZWJWaWV3Ci0KLXByaXZhdGUgdm9sYXRpbGUgYW5kcm9pZC53ZWJraXQuV2ViVmlld0NsaWVudCBtV2ViVmlld0NsaWVudAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLndlYmtpdC5XZWJWaWV3KQotCi1wdWJsaWMgYW5kcm9pZC53ZWJraXQuV2ViVmlldyBjcmVhdGVXaW5kb3coCi1ib29sZWFuCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBkb1VwZGF0ZVZpc2l0ZWRIaXN0b3J5KAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotcHVibGljIGFuZHJvaWQud2Via2l0LldlYkJhY2tGb3J3YXJkTGlzdCBnZXRCYWNrRm9yd2FyZExpc3QoKQotCi1wdWJsaWMgaW50IGdldFByb2dyZXNzKCkKLQotcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZSgKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgb25DbG9zZVdpbmRvdygKLWFuZHJvaWQud2Via2l0LldlYlZpZXcpCi0KLXB1YmxpYyBib29sZWFuIG9uRG93bmxvYWRTdGFydCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWxvbmcpCi0KLXB1YmxpYyB2b2lkIG9uRm9ybVJlc3VibWlzc2lvbigKLWFuZHJvaWQub3MuTWVzc2FnZQotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBvbkpzQWxlcnQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYm9vbGVhbiBvbkpzQmVmb3JlVW5sb2FkKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJvb2xlYW4gb25Kc0NvbmZpcm0oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBvbkpzUHJvbXB0KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgb25Mb2FkUmVzb3VyY2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBvblBhZ2VGaW5pc2hlZCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIG9uUGFnZVN0YXJ0ZWQoCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCkKLQotcHVibGljIHZvaWQgb25Qcm9ncmVzc0NoYW5nZWQoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIG9uUmVjZWl2ZWRDZXJ0aWZpY2F0ZSgKLWFuZHJvaWQubmV0Lmh0dHAuU3NsQ2VydGlmaWNhdGUpCi0KLXB1YmxpYyB2b2lkIG9uUmVjZWl2ZWRFcnJvcigKLWludAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgb25SZWNlaXZlZEh0dHBBdXRoUmVxdWVzdCgKLWFuZHJvaWQud2Via2l0Lkh0dHBBdXRoSGFuZGxlcgotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgb25SZWNlaXZlZEljb24oCi1hbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCkKLQotcHVibGljIHZvaWQgb25SZWNlaXZlZFNzbEVycm9yKAotYW5kcm9pZC53ZWJraXQuU3NsRXJyb3JIYW5kbGVyCi1hbmRyb2lkLm5ldC5odHRwLlNzbEVycm9yKQotCi1wdWJsaWMgdm9pZCBvblJlY2VpdmVkVGl0bGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBvblJlcXVlc3RGb2N1cygpCi0KLXB1YmxpYyBib29sZWFuIG9uU2F2ZVBhc3N3b3JkKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBvblNjYWxlQ2hhbmdlZCgKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIHZvaWQgb25Ub29NYW55UmVkaXJlY3RzKAotYW5kcm9pZC5vcy5NZXNzYWdlCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIG9uVW5oYW5kbGVkS2V5RXZlbnQoCi1hbmRyb2lkLnZpZXcuS2V5RXZlbnQpCi0KLXB1YmxpYyB2b2lkIHNldERvd25sb2FkTGlzdGVuZXIoCi1hbmRyb2lkLndlYmtpdC5Eb3dubG9hZExpc3RlbmVyKQotCi1wdWJsaWMgdm9pZCBzZXRXZWJDaHJvbWVDbGllbnQoCi1hbmRyb2lkLndlYmtpdC5XZWJDaHJvbWVDbGllbnQpCi0KLXB1YmxpYyB2b2lkIHNldFdlYlZpZXdDbGllbnQoCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3Q2xpZW50KQotCi1wdWJsaWMgYm9vbGVhbiBzaG91bGRPdmVycmlkZVVybExvYWRpbmcoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi0gdm9pZCBzd2l0Y2hPdXREcmF3SGlzdG9yeSgpCi0KLXB1YmxpYyBib29sZWFuIHVpT3ZlcnJpZGVLZXlFdmVudCgKLWFuZHJvaWQudmlldy5LZXlFdmVudCkKLQotcHVibGljIGJvb2xlYW4gdWlPdmVycmlkZVVybExvYWRpbmcoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotIGNsYXNzIGFuZHJvaWQud2Via2l0LkNvbnRlbnRMb2FkZXIgZXh0ZW5kcyBhbmRyb2lkLndlYmtpdC5TdHJlYW1Mb2FkZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1Db250ZW50VHlwZQotCi1wcml2YXRlIGFuZHJvaWQuY29udGVudC5Db250ZXh0IG1Db250ZXh0Ci0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtVXJsCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC53ZWJraXQuTG9hZExpc3RlbmVyCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotcHVibGljIHN0YXRpYyB2b2lkIHJlcXVlc3RVcmwoCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLndlYmtpdC5Mb2FkTGlzdGVuZXIKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wcm90ZWN0ZWQgdm9pZCBidWlsZEhlYWRlcnMoCi1hbmRyb2lkLm5ldC5odHRwLkhlYWRlcnMpCi0KLXByb3RlY3RlZCBib29sZWFuIHNldHVwU3RyZWFtQW5kU2VuZFN0YXR1cygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2Via2l0L0Nvb2tpZU1hbmFnZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1Db29raWUgKQotIGNsYXNzIGFuZHJvaWQud2Via2l0LkNvb2tpZU1hbmFnZXIkQ29va2llIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgYnl0ZSBNT0RFX0RFTEVURUQKLQotc3RhdGljIGZpbmFsIGJ5dGUgTU9ERV9ORVcKLQotc3RhdGljIGZpbmFsIGJ5dGUgTU9ERV9OT1JNQUwKLQotc3RhdGljIGZpbmFsIGJ5dGUgTU9ERV9SRVBMQUNFRAotCi0gamF2YS5sYW5nLlN0cmluZyBkb21haW4KLQotIGxvbmcgZXhwaXJlcwotCi0gbG9uZyBsYXN0QWNlc3NUaW1lCi0KLSBsb25nIGxhc3RVcGRhdGVUaW1lCi0KLSBieXRlIG1vZGUKLQotIGphdmEubGFuZy5TdHJpbmcgbmFtZQotCi0gamF2YS5sYW5nLlN0cmluZyBwYXRoCi0KLSBib29sZWFuIHNlY3VyZQotCi0gamF2YS5sYW5nLlN0cmluZyB2YWx1ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLSBib29sZWFuIGRvbWFpbk1hdGNoKAotamF2YS5sYW5nLlN0cmluZykKLQotIGJvb2xlYW4gZXhhY3RNYXRjaCgKLWFuZHJvaWQud2Via2l0LkNvb2tpZU1hbmFnZXIkQ29va2llKQotCi0gYm9vbGVhbiBwYXRoTWF0Y2goCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC93ZWJraXQvQ29va2llTWFuYWdlciRDb29raWU7ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLndlYmtpdC5Db29raWVNYW5hZ2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gQkFEX0NPVU5UUllfMkxEUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIENPTU1BCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRE9NQUlOCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgRVFVQUwKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBFWFBJUkVTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSFRUUFMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBIVFRQX09OTFkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhUVFBfT05MWV9MRU5HVEgKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMT0dUQUcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBNQVhfQUdFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfQ09PS0lFX0NPVU5UX1BFUl9CQVNFX0RPTUFJTgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0NPT0tJRV9MRU5HVEgKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9ET01BSU5fQ09VTlQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9SQU1fQ09PS0lFU19DT1VOVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1JBTV9ET01BSU5fQ09VTlQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQQVRICi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgUEFUSF9ERUxJTQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFBFUklPRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFFVRVNUSU9OX01BUksKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBRVU9UQVRJT04KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTRUNVUkUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFQ1VSRV9MRU5HVEgKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBTRU1JQ09MT04KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBXSElURV9TUEFDRQotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLndlYmtpdC5Db29raWVNYW5hZ2VyIHNSZWYKLQotcHJpdmF0ZSBib29sZWFuIG1BY2NlcHRDb29raWUKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS91dGlsL0FycmF5TGlzdDxMYW5kcm9pZC93ZWJraXQvQ29va2llTWFuYWdlciRDb29raWU7Pjs+OyApCi1wcml2YXRlIGphdmEudXRpbC5NYXAgbUNvb2tpZU1hcAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBnZXRCYXNlRG9tYWluKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0SG9zdEFuZFBhdGgoCi1hbmRyb2lkLm5ldC5XZWJBZGRyZXNzKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQud2Via2l0LkNvb2tpZU1hbmFnZXIgZ2V0SW5zdGFuY2UoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspTGphdmEvdXRpbC9BcnJheUxpc3Q8TGFuZHJvaWQvd2Via2l0L0Nvb2tpZU1hbmFnZXIkQ29va2llOz47ICkKLXByaXZhdGUgamF2YS51dGlsLkFycmF5TGlzdCBwYXJzZUNvb2tpZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBib29sZWFuIGFjY2VwdENvb2tpZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9DbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGphdmEubGFuZy5PYmplY3QgY2xvbmUoKQotCi0gdm9pZCBkZWxldGVBQ29va2llKAotYW5kcm9pZC53ZWJraXQuQ29va2llTWFuYWdlciRDb29raWUpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0FycmF5TGlzdDxMYW5kcm9pZC93ZWJraXQvQ29va2llTWFuYWdlciRDb29raWU7PjsgKQotIGphdmEudXRpbC5BcnJheUxpc3QgZGVsZXRlTFJVRG9tYWluKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Q29va2llKAotYW5kcm9pZC5uZXQuV2ViQWRkcmVzcykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Q29va2llKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSilMamF2YS91dGlsL0FycmF5TGlzdDxMYW5kcm9pZC93ZWJraXQvQ29va2llTWFuYWdlciRDb29raWU7PjsgKQotIGphdmEudXRpbC5BcnJheUxpc3QgZ2V0VXBkYXRlZENvb2tpZXNTaW5jZSgKLWxvbmcpCi0KLXB1YmxpYyBib29sZWFuIGhhc0Nvb2tpZXMoKQotCi1wdWJsaWMgdm9pZCByZW1vdmVBbGxDb29raWUoKQotCi1wdWJsaWMgdm9pZCByZW1vdmVFeHBpcmVkQ29va2llKCkKLQotcHVibGljIHZvaWQgcmVtb3ZlU2Vzc2lvbkNvb2tpZSgpCi0KLXB1YmxpYyB2b2lkIHNldEFjY2VwdENvb2tpZSgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldENvb2tpZSgKLWFuZHJvaWQubmV0LldlYkFkZHJlc3MKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHNldENvb2tpZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLSB2b2lkIHN5bmNlZEFDb29raWUoCi1hbmRyb2lkLndlYmtpdC5Db29raWVNYW5hZ2VyJENvb2tpZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3dlYmtpdC9XZWJTeW5jTWFuYWdlciQxO0xhbmRyb2lkL3dlYmtpdC9XZWJTeW5jTWFuYWdlciRTeW5jSGFuZGxlcjsgKQotYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC53ZWJraXQuV2ViU3luY01hbmFnZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5sYW5nLlJ1bm5hYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMT0dUQUcKLQotcHJpdmF0ZSBzdGF0aWMgaW50IFNZTkNfTEFURVJfSU5URVJWQUwKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNZTkNfTUVTU0FHRQotCi1wcml2YXRlIHN0YXRpYyBpbnQgU1lOQ19OT1dfSU5URVJWQUwKLQotcHJvdGVjdGVkIGFuZHJvaWQud2Via2l0LldlYlZpZXdEYXRhYmFzZSBtRGF0YUJhc2UKLQotcHJvdGVjdGVkIGFuZHJvaWQub3MuSGFuZGxlciBtSGFuZGxlcgotCi1wcml2YXRlIGludCBtU3RhcnRTeW5jUmVmQ291bnQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuVGhyZWFkIG1TeW5jVGhyZWFkCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtVGhyZWFkTmFtZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWphdmEubGFuZy5TdHJpbmcpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDAwMCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9DbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGphdmEubGFuZy5PYmplY3QgY2xvbmUoKQotCi1wcm90ZWN0ZWQgdm9pZCBvblN5bmNJbml0KCkKLQotcHVibGljIHZvaWQgcmVzZXRTeW5jKCkKLQotcHVibGljIHZvaWQgcnVuKCkKLQotcHVibGljIHZvaWQgc3RhcnRTeW5jKCkKLQotcHVibGljIHZvaWQgc3RvcFN5bmMoKQotCi1wdWJsaWMgdm9pZCBzeW5jKCkKLQotYWJzdHJhY3Qgdm9pZCBzeW5jRnJvbVJhbVRvRmxhc2goKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQud2Via2l0LkNvb2tpZVN5bmNNYW5hZ2VyIGV4dGVuZHMgYW5kcm9pZC53ZWJraXQuV2ViU3luY01hbmFnZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgYW5kcm9pZC53ZWJraXQuQ29va2llU3luY01hbmFnZXIgc1JlZgotCi1wcml2YXRlIGxvbmcgbUxhc3RVcGRhdGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC53ZWJraXQuQ29va2llU3luY01hbmFnZXIgY3JlYXRlSW5zdGFuY2UoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLndlYmtpdC5Db29raWVTeW5jTWFuYWdlciBnZXRJbnN0YW5jZSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvQXJyYXlMaXN0PExhbmRyb2lkL3dlYmtpdC9Db29raWVNYW5hZ2VyJENvb2tpZTs+OylWICkKLXByaXZhdGUgdm9pZCBzeW5jRnJvbVJhbVRvRmxhc2goCi1qYXZhLnV0aWwuQXJyYXlMaXN0KQotCi0gdm9pZCBjbGVhckFsbENvb2tpZXMoKQotCi0gdm9pZCBjbGVhckV4cGlyZWRDb29raWVzKAotbG9uZykKLQotIHZvaWQgY2xlYXJTZXNzaW9uQ29va2llcygpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS91dGlsL0FycmF5TGlzdDxMYW5kcm9pZC93ZWJraXQvQ29va2llTWFuYWdlciRDb29raWU7PjsgKQotIGphdmEudXRpbC5BcnJheUxpc3QgZ2V0Q29va2llc0ZvckRvbWFpbigKLWphdmEubGFuZy5TdHJpbmcpCi0KLSBib29sZWFuIGhhc0Nvb2tpZXMoKQotCi1wdWJsaWMgdm9sYXRpbGUgdm9pZCByZXNldFN5bmMoKQotCi1wdWJsaWMgdm9sYXRpbGUgdm9pZCBydW4oKQotCi1wdWJsaWMgdm9sYXRpbGUgdm9pZCBzdGFydFN5bmMoKQotCi1wdWJsaWMgdm9sYXRpbGUgdm9pZCBzdG9wU3luYygpCi0KLXB1YmxpYyB2b2xhdGlsZSB2b2lkIHN5bmMoKQotCi1wcm90ZWN0ZWQgdm9pZCBzeW5jRnJvbVJhbVRvRmxhc2goKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotIGNsYXNzIGFuZHJvaWQud2Via2l0LkRhdGFMb2FkZXIgZXh0ZW5kcyBhbmRyb2lkLndlYmtpdC5TdHJlYW1Mb2FkZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1Db250ZW50VHlwZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQud2Via2l0LkxvYWRMaXN0ZW5lcikKLQotcHVibGljIHN0YXRpYyB2b2lkIHJlcXVlc3RVcmwoCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLndlYmtpdC5Mb2FkTGlzdGVuZXIpCi0KLXByb3RlY3RlZCB2b2lkIGJ1aWxkSGVhZGVycygKLWFuZHJvaWQubmV0Lmh0dHAuSGVhZGVycykKLQotcHJvdGVjdGVkIGJvb2xlYW4gc2V0dXBTdHJlYW1BbmRTZW5kU3RhdHVzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLndlYmtpdC5EYXRlU29ydGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBEQVlfQ09VTlQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMT0dUQUcKLQotcHJpdmF0ZSBsb25nW10gbUJpbnMKLQotIGphdmEudXRpbC5DYWxlbmRhciBtQ2FsCi0KLSBqYXZhLnV0aWwuRGF0ZSBtRGF0ZQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmdbXSBtTGFiZWxzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXByaXZhdGUgamF2YS51dGlsLkNhbGVuZGFyIGJlZ2lubmluZ09mRGF5KAotamF2YS51dGlsLkNhbGVuZGFyKQotCi1wdWJsaWMgbG9uZyBnZXRCb3VuZGFyeSgKLWludCkKLQotcHVibGljIGludCBnZXRJbmRleCgKLWxvbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldExhYmVsKAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLndlYmtpdC5Eb3dubG9hZExpc3RlbmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uRG93bmxvYWRTdGFydCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWxvbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi0gY2xhc3MgYW5kcm9pZC53ZWJraXQuRmlsZUxvYWRlciBleHRlbmRzIGFuZHJvaWQud2Via2l0LlN0cmVhbUxvYWRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGFuZHJvaWQuY29udGVudC5Db250ZXh0IG1Db250ZXh0Ci0KLXByaXZhdGUgYm9vbGVhbiBtSXNBc3NldAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbVBhdGgKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLndlYmtpdC5Mb2FkTGlzdGVuZXIKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1ib29sZWFuKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgcmVxdWVzdFVybCgKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQud2Via2l0LkxvYWRMaXN0ZW5lcgotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWJvb2xlYW4pCi0KLXByb3RlY3RlZCB2b2lkIGJ1aWxkSGVhZGVycygKLWFuZHJvaWQubmV0Lmh0dHAuSGVhZGVycykKLQotcHJvdGVjdGVkIGJvb2xlYW4gc2V0dXBTdHJlYW1BbmRTZW5kU3RhdHVzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLSBjbGFzcyBhbmRyb2lkLndlYmtpdC5GcmFtZUxvYWRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBBQ0NFUFRfTEFOR1VBR0UKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDT05URU5UX1RZUEUKLQotc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSEVBREVSX1NUUgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIExPR1RBRwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVVJJX1BST1RPQ09MCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgbUFib3V0QmxhbmsKLQotcHJvdGVjdGVkIGludCBtQ2FjaGVNb2RlCi0KLXByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIG1Db250ZW50VHlwZQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXByb3RlY3RlZCBqYXZhLnV0aWwuTWFwIG1IZWFkZXJzCi0KLXByb3RlY3RlZCBib29sZWFuIG1Jc0hpZ2hQcmlvcml0eQotCi1wcm90ZWN0ZWQgYW5kcm9pZC53ZWJraXQuTG9hZExpc3RlbmVyIG1MaXN0ZW5lcgotCi1wcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBtTWV0aG9kCi0KLXByb3RlY3RlZCBhbmRyb2lkLndlYmtpdC5OZXR3b3JrIG1OZXR3b3JrCi0KLXByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIG1Qb3N0RGF0YQotCi1wcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBtUmVmZXJyZXIKLQotcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgbVVzZXJBZ2VudAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53ZWJraXQuTG9hZExpc3RlbmVyCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuKQotCi1zdGF0aWMgYm9vbGVhbiBoYW5kbGVMb2NhbEZpbGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLndlYmtpdC5Mb2FkTGlzdGVuZXIpCi0KLXByaXZhdGUgdm9pZCBwb3B1bGF0ZUhlYWRlcnMoKQotCi1wcml2YXRlIHZvaWQgcG9wdWxhdGVTdGF0aWNIZWFkZXJzKCkKLQotcHVibGljIGJvb2xlYW4gZXhlY3V0ZUxvYWQoKQotCi1wdWJsaWMgYW5kcm9pZC53ZWJraXQuTG9hZExpc3RlbmVyIGdldExvYWRMaXN0ZW5lcigpCi0KLXByb3RlY3RlZCBib29sZWFuIGhhbmRsZUNhY2hlKCkKLQotcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlSFRUUExvYWQoCi1ib29sZWFuKQotCi1wcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVVcmxJbnRlcmNlcHQoKQotCi1wdWJsaWMgdm9pZCBzZXRDYWNoZU1vZGUoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldENvbnRlbnRUeXBlRm9yUG9zdCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHNldEhlYWRlcnMoCi1qYXZhLnV0aWwuSGFzaE1hcCkKLQotcHVibGljIHZvaWQgc2V0UG9zdERhdGEoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRSZWZlcnJlcigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByb3RlY3RlZCB2b2lkIHN0YXJ0Q2FjaGVMb2FkKAotYW5kcm9pZC53ZWJraXQuQ2FjaGVNYW5hZ2VyJENhY2hlUmVzdWx0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQud2Via2l0Lkh0dHBBdXRoSGFuZGxlciBleHRlbmRzIGFuZHJvaWQub3MuSGFuZGxlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIExPR1RBRwotCi1wcml2YXRlIGZpbmFsIGludCBBVVRIX0NBTkNFTAotCi1wcml2YXRlIGZpbmFsIGludCBBVVRIX1BST0NFRUQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0xpbmtlZExpc3Q8TGFuZHJvaWQvd2Via2l0L0xvYWRMaXN0ZW5lcjs+OyApCi1wcml2YXRlIGphdmEudXRpbC5MaW5rZWRMaXN0IG1Mb2FkZXJRdWV1ZQotCi1wcml2YXRlIGFuZHJvaWQud2Via2l0Lk5ldHdvcmsgbU5ldHdvcmsKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLndlYmtpdC5OZXR3b3JrKQotCi1wcml2YXRlIHZvaWQgcHJvY2Vzc05leHRMb2FkZXIoKQotCi1wdWJsaWMgdm9pZCBjYW5jZWwoKQotCi0gdm9pZCBoYW5kbGVBdXRoUmVxdWVzdCgKLWFuZHJvaWQud2Via2l0LkxvYWRMaXN0ZW5lcikKLQotcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZSgKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgcHJvY2VlZCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLSB2b2lkIHJlc2V0KAotYW5kcm9pZC53ZWJraXQuQnJvd3NlckZyYW1lKQotCi1wdWJsaWMgYm9vbGVhbiB1c2VIdHRwQXV0aFVzZXJuYW1lUGFzc3dvcmQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9NDEwNCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dlYmtpdC9IdHRwRGF0ZVRpbWU7ICkKLSBjbGFzcyBhbmRyb2lkLndlYmtpdC5IdHRwRGF0ZVRpbWUkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dlYmtpdC9IdHRwRGF0ZVRpbWU7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9VGltZU9mRGF5ICkKLSBjbGFzcyBhbmRyb2lkLndlYmtpdC5IdHRwRGF0ZVRpbWUkVGltZU9mRGF5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gaW50IGhvdXIKLQotIGludCBtaW51dGUKLQotIGludCBzZWNvbmQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53ZWJraXQuSHR0cERhdGVUaW1lJDEpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC93ZWJraXQvSHR0cERhdGVUaW1lJDE7TGFuZHJvaWQvd2Via2l0L0h0dHBEYXRlVGltZSRUaW1lT2ZEYXk7ICkKLSBjbGFzcyBhbmRyb2lkLndlYmtpdC5IdHRwRGF0ZVRpbWUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEudXRpbC5yZWdleC5QYXR0ZXJuIEhUVFBfREFURV9BTlNJQ19QQVRURVJOCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSFRUUF9EQVRFX0FOU0lDX1JFR0VYUAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwucmVnZXguUGF0dGVybiBIVFRQX0RBVEVfUkZDX1BBVFRFUk4KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBIVFRQX0RBVEVfUkZDX1JFR0VYUAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSBzdGF0aWMgaW50IGdldERhdGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHN0YXRpYyBpbnQgZ2V0TW9udGgoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLndlYmtpdC5IdHRwRGF0ZVRpbWUkVGltZU9mRGF5IGdldFRpbWUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHN0YXRpYyBpbnQgZ2V0WWVhcigKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLkxvbmcgcGFyc2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotZmluYWwgY2xhc3MgYW5kcm9pZC53ZWJraXQuSldlYkNvcmVKYXZhQnJpZGdlIGV4dGVuZHMgYW5kcm9pZC5vcy5IYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGVU5DUFRSX01FU1NBR0UKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMT0dUQUcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRJTUVSX01FU1NBR0UKLQotcHJpdmF0ZSBib29sZWFuIG1IYXNJbnN0YW50VGltZXIKLQotcHJpdmF0ZSBpbnQgbU5hdGl2ZUJyaWRnZQotCi1wcml2YXRlIGludCBtUGF1c2VUaW1lclJlZkNvdW50Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGNvb2tpZXMoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIGJvb2xlYW4gY29va2llc0VuYWJsZWQoKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZUNvbnN0cnVjdG9yKCkKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVGaW5hbGl6ZSgpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlU2VydmljZUZ1bmNQdHJRdWV1ZSgpCi0KLXByaXZhdGUgdm9pZCBzZXRDb29raWVzKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBzZXREZWZlcnJpbmdUaW1lcnMoCi1ib29sZWFuKQotCi1wcml2YXRlIHZvaWQgc2V0U2hhcmVkVGltZXIoCi1sb25nKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIHNoYXJlZFRpbWVyRmlyZWQoKQotCi1wcml2YXRlIHZvaWQgc2lnbmFsU2VydmljZUZ1bmNQdHJRdWV1ZSgpCi0KLXByaXZhdGUgdm9pZCBzdG9wU2hhcmVkVGltZXIoKQotCi1wcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpCi0KLXB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIHBhdXNlKCkKLQotcHVibGljIHZvaWQgcmVzdW1lKCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIHNldENhY2hlU2l6ZSgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLndlYmtpdC5Kc1Jlc3VsdCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1EZWZhdWx0VmFsdWUKLQotcHJvdGVjdGVkIGZpbmFsIGFuZHJvaWQud2Via2l0LkNhbGxiYWNrUHJveHkgbVByb3h5Ci0KLXByaXZhdGUgYm9vbGVhbiBtUmVhZHkKLQotcHJvdGVjdGVkIGJvb2xlYW4gbVJlc3VsdAotCi1wcml2YXRlIGJvb2xlYW4gbVRyaWVkVG9Ob3RpZnlCZWZvcmVSZWFkeQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQud2Via2l0LkNhbGxiYWNrUHJveHkKLWJvb2xlYW4pCi0KLXB1YmxpYyBmaW5hbCB2b2lkIGNhbmNlbCgpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIGNvbmZpcm0oKQotCi1maW5hbCBib29sZWFuIGdldFJlc3VsdCgpCi0KLSB2b2lkIGhhbmRsZURlZmF1bHQoKQotCi1maW5hbCB2b2lkIHNldFJlYWR5KCkKLQotcHJvdGVjdGVkIGZpbmFsIHZvaWQgd2FrZVVwKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLndlYmtpdC5Kc1Byb21wdFJlc3VsdCBleHRlbmRzIGFuZHJvaWQud2Via2l0LkpzUmVzdWx0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtU3RyaW5nUmVzdWx0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53ZWJraXQuQ2FsbGJhY2tQcm94eSkKLQotcHVibGljIHZvaWQgY29uZmlybSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLSBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZ1Jlc3VsdCgpCi0KLSB2b2lkIGhhbmRsZURlZmF1bHQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotIGNsYXNzIGFuZHJvaWQud2Via2l0LkxvYWRMaXN0ZW5lciBleHRlbmRzIGFuZHJvaWQub3MuSGFuZGxlciBpbXBsZW1lbnRzIGFuZHJvaWQubmV0Lmh0dHAuRXZlbnRIYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEudXRpbC5yZWdleC5QYXR0ZXJuIENPTlRFTlRfVFlQRV9QQVRURVJOCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIVFRQX0FVVEgKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhUVFBfRk9VTkQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhUVFBfTU9WRURfUEVSTUFORU5UTFkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhUVFBfTk9UX0ZPVU5ECi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIVFRQX05PVF9NT0RJRklFRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSFRUUF9PSwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSFRUUF9QUk9YWV9BVVRICi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIVFRQX1NFRV9PVEhFUgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSFRUUF9URU1QT1JBUllfUkVESVJFQ1QKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMT0dUQUcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19DT05URU5UX0RBVEEKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19DT05URU5UX0VSUk9SCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfQ09OVEVOVF9GSU5JU0hFRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0NPTlRFTlRfSEVBREVSUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0xPQ0FUSU9OX0NIQU5HRUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19MT0NBVElPTl9DSEFOR0VEX1JFUVVFU1QKLQotcHJpdmF0ZSBzdGF0aWMgaW50IHNOYXRpdmVMb2FkZXJDb3VudAotCi1wcml2YXRlIGJvb2xlYW4gbUF1dGhGYWlsZWQKLQotcHJpdmF0ZSBhbmRyb2lkLm5ldC5odHRwLkh0dHBBdXRoSGVhZGVyIG1BdXRoSGVhZGVyCi0KLXByaXZhdGUgYW5kcm9pZC53ZWJraXQuQnJvd3NlckZyYW1lIG1Ccm93c2VyRnJhbWUKLQotcHJpdmF0ZSBhbmRyb2lkLndlYmtpdC5DYWNoZUxvYWRlciBtQ2FjaGVMb2FkZXIKLQotcHJpdmF0ZSBhbmRyb2lkLndlYmtpdC5DYWNoZU1hbmFnZXIkQ2FjaGVSZXN1bHQgbUNhY2hlUmVzdWx0Ci0KLXByaXZhdGUgYm9vbGVhbiBtQ2FuY2VsbGVkCi0KLXB1YmxpYyBsb25nIG1Db250ZW50TGVuZ3RoCi0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgbUNvbnRleHQKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLndlYmtpdC5CeXRlQXJyYXlCdWlsZGVyIG1EYXRhQnVpbGRlcgotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbUVuY29kaW5nCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtRXJyb3JEZXNjcmlwdGlvbgotCi1wcml2YXRlIGludCBtRXJyb3JJRAotCi1wcml2YXRlIGFuZHJvaWQubmV0Lmh0dHAuSGVhZGVycyBtSGVhZGVycwotCi1wcml2YXRlIGJvb2xlYW4gbUlzSGlnaFByaW9yaXR5Ci0KLXByaXZhdGUgYm9vbGVhbiBtSXNNYWluUGFnZUxvYWRlcgotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvVmVjdG9yPExhbmRyb2lkL29zL01lc3NhZ2U7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuVmVjdG9yIG1NZXNzYWdlUXVldWUKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1NZXRob2QKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1NaW1lVHlwZQotCi1wcml2YXRlIGludCBtTmF0aXZlTG9hZGVyCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtT3JpZ2luYWxVcmwKLQotcHJpdmF0ZSBib29sZWFuIG1QZXJtYW5lbnQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1Qb3N0RGF0YQotCi1wcml2YXRlIGFuZHJvaWQubmV0Lmh0dHAuUmVxdWVzdEhhbmRsZSBtUmVxdWVzdEhhbmRsZQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXByaXZhdGUgamF2YS51dGlsLk1hcCBtUmVxdWVzdEhlYWRlcnMKLQotcHJpdmF0ZSBhbmRyb2lkLm5ldC5odHRwLlNzbEVycm9yIG1Tc2xFcnJvcgotCi1wcml2YXRlIGludCBtU3RhdHVzQ29kZQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbVN0YXR1c1RleHQKLQotcHJpdmF0ZSBib29sZWFuIG1TeW5jaHJvbm91cwotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbVRyYW5zZmVyRW5jb2RpbmcKLQotcHJpdmF0ZSBhbmRyb2lkLm5ldC5XZWJBZGRyZXNzIG1VcmkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1VcmwKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLndlYmtpdC5Ccm93c2VyRnJhbWUKLWphdmEubGFuZy5TdHJpbmcKLWludAotYm9vbGVhbgotYm9vbGVhbikKLQotcHJpdmF0ZSB2b2lkIGNsZWFyTmF0aXZlTG9hZGVyKCkKLQotcHJpdmF0ZSB2b2lkIGNvbW1pdEhlYWRlcnMoKQotCi1wcml2YXRlIHZvaWQgY29tbWl0TG9hZCgpCi0KLXByaXZhdGUgaW50IGNyZWF0ZU5hdGl2ZVJlc3BvbnNlKCkKLQotcHJpdmF0ZSB2b2lkIGRvUmVkaXJlY3QoKQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZ2V0RXJyb3JEZXNjcmlwdGlvbigpCi0KLXByaXZhdGUgaW50IGdldEVycm9ySUQoKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQud2Via2l0LkxvYWRMaXN0ZW5lciBnZXRMb2FkTGlzdGVuZXIoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC53ZWJraXQuQnJvd3NlckZyYW1lCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWJvb2xlYW4KLWJvb2xlYW4pCi0KLXB1YmxpYyBzdGF0aWMgaW50IGdldE5hdGl2ZUxvYWRlckNvdW50KCkKLQotcHJpdmF0ZSB2b2lkIGd1ZXNzTWltZVR5cGUoKQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZ3Vlc3NNaW1lVHlwZUZyb21FeHRlbnNpb24oKQotCi1wcml2YXRlIGJvb2xlYW4gaWdub3JlQ2FsbGJhY2tzKCkKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVBZGREYXRhKAotYnl0ZVtdCi1pbnQpCi0KLXByaXZhdGUgbmF0aXZlIGludCBuYXRpdmVDcmVhdGVSZXNwb25zZSgKLWphdmEubGFuZy5TdHJpbmcKLWludAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotbG9uZwotamF2YS5sYW5nLlN0cmluZwotbG9uZykKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVFcnJvcigKLWludAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVGaW5pc2hlZCgpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlUmVjZWl2ZWRSZXNwb25zZSgKLWludCkKLQotcHJpdmF0ZSBuYXRpdmUgamF2YS5sYW5nLlN0cmluZyBuYXRpdmVSZWRpcmVjdGVkVG9VcmwoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlU2V0UmVzcG9uc2VIZWFkZXIoCi1pbnQKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgYW5kcm9pZC5uZXQuaHR0cC5IdHRwQXV0aEhlYWRlciBwYXJzZUF1dGhIZWFkZXIoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHZvaWQgcGFyc2VDb250ZW50VHlwZUhlYWRlcigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgdm9pZCBzZW5kTWVzc2FnZUludGVybmFsKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1zdGF0aWMgYm9vbGVhbiB3aWxsTG9hZEZyb21DYWNoZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLSB2b2lkIGF0dGFjaFJlcXVlc3RIYW5kbGUoCi1hbmRyb2lkLm5ldC5odHRwLlJlcXVlc3RIYW5kbGUpCi0KLSBib29sZWFuIGF1dGhDcmVkZW50aWFsc0ludmFsaWQoKQotCi1wdWJsaWMgdm9pZCBjYW5jZWwoKQotCi1wdWJsaWMgYm9vbGVhbiBjYW5jZWxsZWQoKQotCi1wdWJsaWMgdm9pZCBjZXJ0aWZpY2F0ZSgKLWFuZHJvaWQubmV0Lmh0dHAuU3NsQ2VydGlmaWNhdGUpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOz47KVogKQotIGJvb2xlYW4gY2hlY2tDYWNoZSgKLWphdmEudXRpbC5NYXApCi0KLSBsb25nIGNvbnRlbnRMZW5ndGgoKQotCi1wdWJsaWMgdm9pZCBkYXRhKAotYnl0ZVtdCi1pbnQpCi0KLSB2b2lkIGRldGFjaFJlcXVlc3RIYW5kbGUoKQotCi0gdm9pZCBkb3dubG9hZEZpbGUoKQotCi1wdWJsaWMgdm9pZCBlbmREYXRhKCkKLQotcHVibGljIHZvaWQgZXJyb3IoCi1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi0KLSBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBnZXRDb250ZXh0KCkKLQotIGFuZHJvaWQud2Via2l0LkJyb3dzZXJGcmFtZSBnZXRGcmFtZSgpCi0KLSBhbmRyb2lkLm5ldC5XZWJBZGRyZXNzIGdldFdlYkFkZHJlc3MoKQotCi0gdm9pZCBoYW5kbGVBdXRoUmVzcG9uc2UoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBoYW5kbGVTc2xFcnJvclJlcXVlc3QoCi1hbmRyb2lkLm5ldC5odHRwLlNzbEVycm9yKQotCi0gdm9pZCBoYW5kbGVTc2xFcnJvclJlc3BvbnNlKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgaGVhZGVycygKLWFuZHJvaWQubmV0Lmh0dHAuSGVhZGVycykKLQotIGphdmEubGFuZy5TdHJpbmcgaG9zdCgpCi0KLSBib29sZWFuIGlzU3luY2hyb25vdXMoKQotCi0gdm9pZCBsb2FkU3luY2hyb25vdXNNZXNzYWdlcygpCi0KLSBqYXZhLmxhbmcuU3RyaW5nIG1pbWVUeXBlKCkKLQotIHZvaWQgbm90aWZ5RXJyb3IoKQotCi0gamF2YS5sYW5nLlN0cmluZyBvcmlnaW5hbFVybCgpCi0KLSBib29sZWFuIHByb3h5QXV0aGVudGljYXRlKCkKLQotIGphdmEubGFuZy5TdHJpbmcgcmVhbG0oKQotCi0gdm9pZCByZXNldENhbmNlbCgpCi0KLSB2b2lkIHNldENhY2hlTG9hZGVyKAotYW5kcm9pZC53ZWJraXQuQ2FjaGVMb2FkZXIpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOz47TGphdmEvbGFuZy9TdHJpbmc7WilWICkKLSB2b2lkIHNldFJlcXVlc3REYXRhKAotamF2YS5sYW5nLlN0cmluZwotamF2YS51dGlsLk1hcAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotIHZvaWQgc2V0VXJsKAotamF2YS5sYW5nLlN0cmluZykKLQotIGFuZHJvaWQubmV0Lmh0dHAuU3NsRXJyb3Igc3NsRXJyb3IoKQotCi1wdWJsaWMgdm9pZCBzdGF0dXMoCi1pbnQKLWludAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi0gdm9pZCB0ZWFyRG93bigpCi0KLSBqYXZhLmxhbmcuU3RyaW5nIHVybCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC53ZWJraXQuTWltZVR5cGVNYXAgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGFuZHJvaWQud2Via2l0Lk1pbWVUeXBlTWFwIHNNaW1lVHlwZU1hcAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaE1hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wcml2YXRlIGphdmEudXRpbC5IYXNoTWFwIG1FeHRlbnNpb25Ub01pbWVUeXBlTWFwCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNoTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXByaXZhdGUgamF2YS51dGlsLkhhc2hNYXAgbU1pbWVUeXBlVG9FeHRlbnNpb25NYXAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEZpbGVFeHRlbnNpb25Gcm9tVXJsKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLndlYmtpdC5NaW1lVHlwZU1hcCBnZXRTaW5nbGV0b24oKQotCi1wcml2YXRlIHZvaWQgbG9hZEVudHJ5KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RXh0ZW5zaW9uRnJvbU1pbWVUeXBlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TWltZVR5cGVGcm9tRXh0ZW5zaW9uKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJvb2xlYW4gaGFzRXh0ZW5zaW9uKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJvb2xlYW4gaGFzTWltZVR5cGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotIGNsYXNzIGFuZHJvaWQud2Via2l0Lk5ldHdvcmsgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTE9HVEFHCi0KLXByaXZhdGUgc3RhdGljIGFuZHJvaWQud2Via2l0Lk5ldHdvcmsgc05ldHdvcmsKLQotcHJpdmF0ZSBzdGF0aWMgaW50IHNQbGF0Zm9ybU5vdGlmaWNhdGlvbkVuYWJsZVJlZkNvdW50Ci0KLXByaXZhdGUgc3RhdGljIGJvb2xlYW4gc1BsYXRmb3JtTm90aWZpY2F0aW9ucwotCi1wcml2YXRlIGFuZHJvaWQud2Via2l0Lkh0dHBBdXRoSGFuZGxlciBtSHR0cEF1dGhIYW5kbGVyCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtUHJveHlQYXNzd29yZAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbVByb3h5VXNlcm5hbWUKLQotcHJpdmF0ZSBhbmRyb2lkLm5ldC5odHRwLlJlcXVlc3RRdWV1ZSBtUmVxdWVzdFF1ZXVlCi0KLXByaXZhdGUgYW5kcm9pZC53ZWJraXQuU3NsRXJyb3JIYW5kbGVyIG1Tc2xFcnJvckhhbmRsZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBkaXNhYmxlUGxhdGZvcm1Ob3RpZmljYXRpb25zKCkKLQotcHVibGljIHN0YXRpYyB2b2lkIGVuYWJsZVBsYXRmb3JtTm90aWZpY2F0aW9ucygpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC53ZWJraXQuTmV0d29yayBnZXRJbnN0YW5jZSgKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wdWJsaWMgdm9pZCBjbGVhclVzZXJTc2xQcmVmVGFibGUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRQcm94eUhvc3RuYW1lKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UHJveHlQYXNzd29yZCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFByb3h5VXNlcm5hbWUoKQotCi1wdWJsaWMgdm9pZCBoYW5kbGVBdXRoUmVxdWVzdCgKLWFuZHJvaWQud2Via2l0LkxvYWRMaXN0ZW5lcikKLQotcHVibGljIHZvaWQgaGFuZGxlU3NsRXJyb3JSZXF1ZXN0KAotYW5kcm9pZC53ZWJraXQuTG9hZExpc3RlbmVyKQotCi1wdWJsaWMgYm9vbGVhbiBpc1ZhbGlkUHJveHlTZXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1N0cmluZztMamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzs+O0xqYXZhL2xhbmcvU3RyaW5nO0xhbmRyb2lkL3dlYmtpdC9Mb2FkTGlzdGVuZXI7WilaICkKLXB1YmxpYyBib29sZWFuIHJlcXVlc3RVUkwoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnV0aWwuTWFwCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLndlYmtpdC5Mb2FkTGlzdGVuZXIKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHJlc2V0SGFuZGxlcnNBbmRTdG9wTG9hZGluZygKLWFuZHJvaWQud2Via2l0LkJyb3dzZXJGcmFtZSkKLQotcHVibGljIGJvb2xlYW4gcmVzdG9yZVN0YXRlKAotYW5kcm9pZC5vcy5CdW5kbGUpCi0KLXB1YmxpYyBib29sZWFuIHNhdmVTdGF0ZSgKLWFuZHJvaWQub3MuQnVuZGxlKQotCi1wdWJsaWMgdm9pZCBzZXRQcm94eVBhc3N3b3JkKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0UHJveHlVc2VybmFtZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHN0YXJ0VGltaW5nKCkKLQotcHVibGljIHZvaWQgc3RvcFRpbWluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi0gY2xhc3MgYW5kcm9pZC53ZWJraXQuUGVyZkNoZWNrZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgbVJlc3BvbnNlVGhyZXNob2xkCi0KLXByaXZhdGUgbG9uZyBtVGltZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIHJlc3BvbnNlQWxlcnQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dlYmtpdC9QbHVnaW47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9NDEwNCBuYW1lID1udWxsICkKLSBjbGFzcyBhbmRyb2lkLndlYmtpdC5QbHVnaW4kMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1QcmVmZXJlbmNlc0NsaWNrSGFuZGxlciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93ZWJraXQvUGx1Z2luOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQud2Via2l0LlBsdWdpbiRQcmVmZXJlbmNlc0NsaWNrSGFuZGxlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBoYW5kbGVDbGlja0V2ZW50KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2Via2l0L1BsdWdpbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPURlZmF1bHRDbGlja0hhbmRsZXIgKQotIGNsYXNzIGFuZHJvaWQud2Via2l0LlBsdWdpbiREZWZhdWx0Q2xpY2tIYW5kbGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQud2Via2l0LlBsdWdpbiRQcmVmZXJlbmNlc0NsaWNrSGFuZGxlciwgYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZSRPbkNsaWNrTGlzdGVuZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLmFwcC5BbGVydERpYWxvZyBtRGlhbG9nCi0KLWZpbmFsIGFuZHJvaWQud2Via2l0LlBsdWdpbiB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53ZWJraXQuUGx1Z2luKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLndlYmtpdC5QbHVnaW4KLWFuZHJvaWQud2Via2l0LlBsdWdpbiQxKQotCi1wdWJsaWMgdm9pZCBoYW5kbGVDbGlja0V2ZW50KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXB1YmxpYyB2b2lkIG9uQ2xpY2soCi1hbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC93ZWJraXQvUGx1Z2luJDE7TGFuZHJvaWQvd2Via2l0L1BsdWdpbiREZWZhdWx0Q2xpY2tIYW5kbGVyO0xhbmRyb2lkL3dlYmtpdC9QbHVnaW4kUHJlZmVyZW5jZXNDbGlja0hhbmRsZXI7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLndlYmtpdC5QbHVnaW4gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtRGVzY3JpcHRpb24KLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1GaWxlTmFtZQotCi1wcml2YXRlIGFuZHJvaWQud2Via2l0LlBsdWdpbiRQcmVmZXJlbmNlc0NsaWNrSGFuZGxlciBtSGFuZGxlcgotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbU5hbWUKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1QYXRoCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotc3RhdGljIGphdmEubGFuZy5TdHJpbmcgYWNjZXNzJDEwMCgKLWFuZHJvaWQud2Via2l0LlBsdWdpbikKLQotc3RhdGljIGphdmEubGFuZy5TdHJpbmcgYWNjZXNzJDIwMCgKLWFuZHJvaWQud2Via2l0LlBsdWdpbikKLQotcHVibGljIHZvaWQgZGlzcGF0Y2hDbGlja0V2ZW50KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldERlc2NyaXB0aW9uKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RmlsZU5hbWUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXROYW1lKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UGF0aCgpCi0KLXB1YmxpYyB2b2lkIHNldENsaWNrSGFuZGxlcigKLWFuZHJvaWQud2Via2l0LlBsdWdpbiRQcmVmZXJlbmNlc0NsaWNrSGFuZGxlcikKLQotcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRGaWxlTmFtZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHNldE5hbWUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRQYXRoKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQud2Via2l0LlBsdWdpbkxpc3QgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9BcnJheUxpc3Q8TGFuZHJvaWQvd2Via2l0L1BsdWdpbjs+OyApCi1wcml2YXRlIGphdmEudXRpbC5BcnJheUxpc3QgbVBsdWdpbnMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCBhZGRQbHVnaW4oCi1hbmRyb2lkLndlYmtpdC5QbHVnaW4pCi0KLXB1YmxpYyB2b2lkIGNsZWFyKCkKLQotcHVibGljIGphdmEudXRpbC5MaXN0IGdldExpc3QoKQotCi1wdWJsaWMgdm9pZCBwbHVnaW5DbGlja2VkKAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWludCkKLQotcHVibGljIHZvaWQgcmVtb3ZlUGx1Z2luKAotYW5kcm9pZC53ZWJraXQuUGx1Z2luKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQud2Via2l0LlNzbEVycm9ySGFuZGxlciBleHRlbmRzIGFuZHJvaWQub3MuSGFuZGxlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIExPR1RBRwotCi1wcml2YXRlIGZpbmFsIGludCBIQU5ETEVfUkVTUE9OU0UKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0xpbmtlZExpc3Q8TGFuZHJvaWQvd2Via2l0L0xvYWRMaXN0ZW5lcjs+OyApCi1wcml2YXRlIGphdmEudXRpbC5MaW5rZWRMaXN0IG1Mb2FkZXJRdWV1ZQotCi1wcml2YXRlIGFuZHJvaWQud2Via2l0Lk5ldHdvcmsgbU5ldHdvcmsKLQotcHJpdmF0ZSBhbmRyb2lkLm9zLkJ1bmRsZSBtU3NsUHJlZlRhYmxlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53ZWJraXQuTmV0d29yaykKLQotcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NOZXh0TG9hZGVyKCkKLQotcHVibGljIHZvaWQgY2FuY2VsKCkKLQotIHZvaWQgY2xlYXIoKQotCi0gdm9pZCBmYXN0UHJvY2Vzc1F1ZXVlZFNzbEVycm9ycygpCi0KLXB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLSB2b2lkIGhhbmRsZVNzbEVycm9yUmVxdWVzdCgKLWFuZHJvaWQud2Via2l0LkxvYWRMaXN0ZW5lcikKLQotIHZvaWQgaGFuZGxlU3NsRXJyb3JSZXNwb25zZSgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHByb2NlZWQoKQotCi0gdm9pZCByZXNldCgKLWFuZHJvaWQud2Via2l0LkJyb3dzZXJGcmFtZSkKLQotIGJvb2xlYW4gcmVzdG9yZVN0YXRlKAotYW5kcm9pZC5vcy5CdW5kbGUpCi0KLSBib29sZWFuIHNhdmVTdGF0ZSgKLWFuZHJvaWQub3MuQnVuZGxlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dlYmtpdC9UZXh0RGlhbG9nOyApCi0gY2xhc3MgYW5kcm9pZC53ZWJraXQuVGV4dERpYWxvZyQxIGV4dGVuZHMgYW5kcm9pZC5vcy5IYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQud2Via2l0LlRleHREaWFsb2cgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53ZWJraXQuVGV4dERpYWxvZykKLQotcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZSgKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9UZXh0VmlldyQxO0xhbmRyb2lkL3dpZGdldC9UZXh0VmlldyRNZW51SGFuZGxlcjtMYW5kcm9pZC93aWRnZXQvVGV4dFZpZXckQnVmZmVyVHlwZTtMYW5kcm9pZC93aWRnZXQvVGV4dFZpZXckQmxpbms7TGFuZHJvaWQvd2lkZ2V0L1RleHRWaWV3JENoYW5nZVdhdGNoZXI7TGFuZHJvaWQvd2lkZ2V0L1RleHRWaWV3JENoYXJXcmFwcGVyO0xhbmRyb2lkL3dpZGdldC9UZXh0VmlldyRTYXZlZFN0YXRlOyApCi1AYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MkUmVtb3RlVmlldwotcHVibGljIGNsYXNzIGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3IGV4dGVuZHMgYW5kcm9pZC52aWV3LlZpZXcgaW1wbGVtZW50cyBhbmRyb2lkLnZpZXcuVmlld1RyZWVPYnNlcnZlciRPblByZURyYXdMaXN0ZW5lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQU5JTUFURURfU0NST0xMX0dBUAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQkxJTksKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFQ0lNQUwKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYW5kcm9pZC50ZXh0LlNwYW5uZWQgRU1QVFlfU1BBTk5FRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRU1TCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJRF9DT1BZCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJRF9DT1BZX1VSTAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSURfQ1VUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJRF9QQVNURQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSURfU0VMRUNUX0FMTAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTElORVMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PTk9TUEFDRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnRleHQuSW5wdXRGaWx0ZXJbXSBOT19GSUxURVJTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQSVhFTFMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBSRURSQVdfRE9ORQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFJFRFJBV19OT1RfUkVHSVNURVJFRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFJFRFJBV19QRU5ESU5HCi0KLXByaXZhdGUgc3RhdGljIGludCBQUklPUklUWQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0FOUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VSSUYKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJR05FRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnRleHQuQm9yaW5nTGF5b3V0JE1ldHJpY3MgVU5LTk9XTl9CT1JJTkcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZFUllfV0lERQotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLmdyYXBoaWNzLlJlY3RGIHNUZW1wUmVjdAotCi1wcml2YXRlIGludCBtQXV0b0xpbmtNYXNrCi0KLXByaXZhdGUgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXckQmxpbmsgbUJsaW5rCi0KLXByaXZhdGUgYW5kcm9pZC50ZXh0LkJvcmluZ0xheW91dCRNZXRyaWNzIG1Cb3JpbmcKLQotcHJpdmF0ZSBhbmRyb2lkLndpZGdldC5UZXh0VmlldyRCdWZmZXJUeXBlIG1CdWZmZXJUeXBlCi0KLXByaXZhdGUgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXckQ2hhbmdlV2F0Y2hlciBtQ2hhbmdlV2F0Y2hlcgotCi1wcml2YXRlIGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3JENoYXJXcmFwcGVyIG1DaGFyV3JhcHBlcgotCi1wcml2YXRlIGFuZHJvaWQuZ3JhcGhpY3MuUmVjdCBtQ29tcG91bmRSZWN0Ci0KLXByaXZhdGUgaW50IG1DdXJIaW50VGV4dENvbG9yCi0KLXByaXZhdGUgaW50IG1DdXJUZXh0Q29sb3IKLQotcHJpdmF0ZSBib29sZWFuIG1DdXJzb3JWaXNpYmxlCi0KLXByaXZhdGUgaW50IG1EZXNpcmVkSGVpZ2h0QXRNZWFzdXJlCi0KLXByaXZhdGUgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSBtRHJhd2FibGVCb3R0b20KLQotcHJpdmF0ZSBpbnQgbURyYXdhYmxlSGVpZ2h0TGVmdAotCi1wcml2YXRlIGludCBtRHJhd2FibGVIZWlnaHRSaWdodAotCi1wcml2YXRlIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgbURyYXdhYmxlTGVmdAotCi1wcml2YXRlIGludCBtRHJhd2FibGVQYWRkaW5nCi0KLXByaXZhdGUgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSBtRHJhd2FibGVSaWdodAotCi1wcml2YXRlIGludCBtRHJhd2FibGVTaXplQm90dG9tCi0KLXByaXZhdGUgaW50IG1EcmF3YWJsZVNpemVMZWZ0Ci0KLXByaXZhdGUgaW50IG1EcmF3YWJsZVNpemVSaWdodAotCi1wcml2YXRlIGludCBtRHJhd2FibGVTaXplVG9wCi0KLXByaXZhdGUgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSBtRHJhd2FibGVUb3AKLQotcHJpdmF0ZSBpbnQgbURyYXdhYmxlV2lkdGhCb3R0b20KLQotcHJpdmF0ZSBpbnQgbURyYXdhYmxlV2lkdGhUb3AKLQotcHJpdmF0ZSBib29sZWFuIG1EcmF3YWJsZXMKLQotcHJpdmF0ZSBib29sZWFuIG1FYXRUb3VjaFJlbGVhc2UKLQotcHJpdmF0ZSBhbmRyb2lkLnRleHQuRWRpdGFibGUkRmFjdG9yeSBtRWRpdGFibGVGYWN0b3J5Ci0KLXByaXZhdGUgYW5kcm9pZC50ZXh0LlRleHRVdGlscyRUcnVuY2F0ZUF0IG1FbGxpcHNpemUKLQotcHJpdmF0ZSBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIG1FcnJvcgotCi1wcml2YXRlIGJvb2xlYW4gbUVycm9yV2FzQ2hhbmdlZAotCi1wcml2YXRlIGFuZHJvaWQudGV4dC5JbnB1dEZpbHRlcltdIG1GaWx0ZXJzCi0KLXByaXZhdGUgYm9vbGVhbiBtRnJlZXplc1RleHQKLQotcHJpdmF0ZSBib29sZWFuIG1Gcm96ZW5XaXRoRm9jdXMKLQotcHJpdmF0ZSBpbnQgbUdyYXZpdHkKLQotcHJpdmF0ZSBpbnQgbUhpZ2hsaWdodENvbG9yCi0KLXByaXZhdGUgYW5kcm9pZC5ncmFwaGljcy5QYWludCBtSGlnaGxpZ2h0UGFpbnQKLQotcHJpdmF0ZSBhbmRyb2lkLmdyYXBoaWNzLlBhdGggbUhpZ2hsaWdodFBhdGgKLQotcHJpdmF0ZSBib29sZWFuIG1IaWdobGlnaHRQYXRoQm9ndXMKLQotcHJpdmF0ZSBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIG1IaW50Ci0KLXByaXZhdGUgYW5kcm9pZC50ZXh0LkJvcmluZ0xheW91dCRNZXRyaWNzIG1IaW50Qm9yaW5nCi0KLXByaXZhdGUgYW5kcm9pZC50ZXh0LkxheW91dCBtSGludExheW91dAotCi1wcml2YXRlIGFuZHJvaWQuY29udGVudC5yZXMuQ29sb3JTdGF0ZUxpc3QgbUhpbnRUZXh0Q29sb3IKLQotcHJpdmF0ZSBib29sZWFuIG1Ib3Jpem9udGFsbHlTY3JvbGxpbmcKLQotcHJpdmF0ZSBib29sZWFuIG1JbmNsdWRlUGFkCi0KLXByaXZhdGUgYW5kcm9pZC50ZXh0Lm1ldGhvZC5LZXlMaXN0ZW5lciBtSW5wdXQKLQotcHJpdmF0ZSBsb25nIG1MYXN0U2Nyb2xsCi0KLXByaXZhdGUgYW5kcm9pZC50ZXh0LkxheW91dCBtTGF5b3V0Ci0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LnJlcy5Db2xvclN0YXRlTGlzdCBtTGlua1RleHRDb2xvcgotCi1wcml2YXRlIGJvb2xlYW4gbUxpbmtzQ2xpY2thYmxlCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9BcnJheUxpc3Q8TGFuZHJvaWQvdGV4dC9UZXh0V2F0Y2hlcjs+OyApCi1wcml2YXRlIGphdmEudXRpbC5BcnJheUxpc3QgbUxpc3RlbmVycwotCi1wcml2YXRlIGludCBtTWF4TW9kZQotCi1wcml2YXRlIGludCBtTWF4V2lkdGgKLQotcHJpdmF0ZSBpbnQgbU1heFdpZHRoTW9kZQotCi1wcml2YXRlIGludCBtTWF4aW11bQotCi1wcml2YXRlIGludCBtTWluTW9kZQotCi1wcml2YXRlIGludCBtTWluV2lkdGgKLQotcHJpdmF0ZSBpbnQgbU1pbldpZHRoTW9kZQotCi1wcml2YXRlIGludCBtTWluaW11bQotCi1wcml2YXRlIGFuZHJvaWQudGV4dC5tZXRob2QuTW92ZW1lbnRNZXRob2QgbU1vdmVtZW50Ci0KLXByaXZhdGUgYW5kcm9pZC53aWRnZXQuUG9wdXBXaW5kb3cgbVBvcHVwCi0KLXByaXZhdGUgaW50IG1QcmVEcmF3U3RhdGUKLQotcHJpdmF0ZSBhbmRyb2lkLnRleHQuQm9yaW5nTGF5b3V0IG1TYXZlZEhpbnRMYXlvdXQKLQotcHJpdmF0ZSBhbmRyb2lkLnRleHQuQm9yaW5nTGF5b3V0IG1TYXZlZExheW91dAotCi1wcml2YXRlIGFuZHJvaWQud2lkZ2V0LlNjcm9sbGVyIG1TY3JvbGxlcgotCi1wcml2YXRlIGJvb2xlYW4gbVNlbGVjdEFsbE9uRm9jdXMKLQotcHJpdmF0ZSBib29sZWFuIG1TZWxlY3Rpb25Nb3ZlZAotCi1wcml2YXRlIGZsb2F0IG1TaGFkb3dEeAotCi1wcml2YXRlIGZsb2F0IG1TaGFkb3dEeQotCi1wcml2YXRlIGZsb2F0IG1TaGFkb3dSYWRpdXMKLQotcHJpdmF0ZSBsb25nIG1TaG93Q3Vyc29yCi0KLXByaXZhdGUgYm9vbGVhbiBtU2luZ2xlTGluZQotCi1wcml2YXRlIGZsb2F0IG1TcGFjaW5nQWRkCi0KLXByaXZhdGUgZmxvYXQgbVNwYWNpbmdNdWx0Ci0KLXByaXZhdGUgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZSRGYWN0b3J5IG1TcGFubmFibGVGYWN0b3J5Ci1AYW5kcm9pZC52aWV3LlZpZXdEZWJ1ZyRFeHBvcnRlZFByb3BlcnR5Ci1wcml2YXRlIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgbVRleHQKLQotcHJpdmF0ZSBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbG9yU3RhdGVMaXN0IG1UZXh0Q29sb3IKLQotcHJpdmF0ZSBhbmRyb2lkLnRleHQuVGV4dFBhaW50IG1UZXh0UGFpbnQKLQotcHJpdmF0ZSBhbmRyb2lkLnRleHQubWV0aG9kLlRyYW5zZm9ybWF0aW9uTWV0aG9kIG1UcmFuc2Zvcm1hdGlvbgotCi1wcml2YXRlIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgbVRyYW5zZm9ybWVkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ci1pbnQpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQxMDAwKAotYW5kcm9pZC53aWRnZXQuVGV4dFZpZXcKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWludAotaW50Ci1pbnQpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQxMTAwKAotYW5kcm9pZC53aWRnZXQuVGV4dFZpZXcKLWFuZHJvaWQudGV4dC5FZGl0YWJsZSkKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDEyMDIoCi1hbmRyb2lkLndpZGdldC5UZXh0VmlldwotYm9vbGVhbikKLQotc3RhdGljIHZvaWQgYWNjZXNzJDEzMDAoCi1hbmRyb2lkLndpZGdldC5UZXh0VmlldwotaW50Ci1pbnQKLWludCkKLQotc3RhdGljIHZvaWQgYWNjZXNzJDE0MDAoCi1hbmRyb2lkLndpZGdldC5UZXh0VmlldykKLQotc3RhdGljIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgYWNjZXNzJDE1MDAoCi1hbmRyb2lkLndpZGdldC5UZXh0VmlldykKLQotc3RhdGljIGFuZHJvaWQudGV4dC5MYXlvdXQgYWNjZXNzJDE2MDAoCi1hbmRyb2lkLndpZGdldC5UZXh0VmlldykKLQotc3RhdGljIHZvaWQgYWNjZXNzJDE3MDAoCi1hbmRyb2lkLndpZGdldC5UZXh0VmlldykKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDE5MDAoCi1hbmRyb2lkLndpZGdldC5UZXh0VmlldwotaW50KQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMzAwKAotYW5kcm9pZC53aWRnZXQuVGV4dFZpZXcKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWludAotaW50Ci1pbnQpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDQwMCgKLWFuZHJvaWQud2lkZ2V0LlRleHRWaWV3KQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkNTAwKAotYW5kcm9pZC53aWRnZXQuVGV4dFZpZXcpCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQ2MDIoCi1hbmRyb2lkLndpZGdldC5UZXh0VmlldwotYm9vbGVhbikKLQotc3RhdGljIGxvbmcgYWNjZXNzJDcwMigKLWFuZHJvaWQud2lkZ2V0LlRleHRWaWV3Ci1sb25nKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkODAwKAotYW5kcm9pZC53aWRnZXQuVGV4dFZpZXcpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQ5MDAoCi1hbmRyb2lkLndpZGdldC5UZXh0VmlldykKLQotcHJpdmF0ZSB2b2lkIGFzc3VtZUxheW91dCgpCi0KLXByaXZhdGUgYm9vbGVhbiBicmluZ1BvaW50SW50b1ZpZXcoCi1pbnQpCi0KLXByaXZhdGUgYm9vbGVhbiBicmluZ1RleHRJbnRvVmlldygpCi0KLXByaXZhdGUgYm9vbGVhbiBjYW5Db3B5KCkKLQotcHJpdmF0ZSBib29sZWFuIGNhbkN1dCgpCi0KLXByaXZhdGUgYm9vbGVhbiBjYW5QYXN0ZSgpCi0KLXByaXZhdGUgYm9vbGVhbiBjYW5TZWxlY3RBbGwoKQotCi1wcml2YXRlIHZvaWQgY2hlY2tGb3JSZWxheW91dCgpCi0KLXByaXZhdGUgdm9pZCBjaGVja0ZvclJlc2l6ZSgpCi0KLXByaXZhdGUgdm9pZCBjaG9vc2VTaXplKAotYW5kcm9pZC53aWRnZXQuUG9wdXBXaW5kb3cKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWFuZHJvaWQud2lkZ2V0LlRleHRWaWV3KQotCi1wcml2YXRlIHN0YXRpYyBpbnQgZGVzaXJlZCgKLWFuZHJvaWQudGV4dC5MYXlvdXQpCi0KLXByaXZhdGUgdm9pZCBmaXhGb2N1c2FibGVBbmRDbGlja2FibGVTZXR0aW5ncygpCi0KLXByaXZhdGUgaW50IGdldEJvdHRvbVZlcnRpY2FsT2Zmc2V0KAotYm9vbGVhbikKLQotcHJpdmF0ZSBpbnQgZ2V0RGVzaXJlZEhlaWdodCgpCi0KLXByaXZhdGUgaW50IGdldERlc2lyZWRIZWlnaHQoCi1hbmRyb2lkLnRleHQuTGF5b3V0Ci1ib29sZWFuKQotCi1wcml2YXRlIGludCBnZXRFcnJvclgoKQotCi1wcml2YXRlIGludCBnZXRFcnJvclkoKQotCi1wcml2YXRlIHZvaWQgZ2V0SW50ZXJlc3RpbmdSZWN0KAotYW5kcm9pZC5ncmFwaGljcy5SZWN0Ci1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgaW50IGdldFRleHRDb2xvcigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXkKLWludCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbG9yU3RhdGVMaXN0IGdldFRleHRDb2xvcnMoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5KQotCi1wcml2YXRlIGludCBnZXRWZXJ0aWNhbE9mZnNldCgKLWJvb2xlYW4pCi0KLXByaXZhdGUgdm9pZCBoaWRlRXJyb3IoKQotCi1wcml2YXRlIHZvaWQgaW52YWxpZGF0ZUN1cnNvcigpCi0KLXByaXZhdGUgdm9pZCBpbnZhbGlkYXRlQ3Vyc29yKAotaW50Ci1pbnQKLWludCkKLQotcHJpdmF0ZSB2b2lkIGludmFsaWRhdGVDdXJzb3JQYXRoKCkKLQotcHJpdmF0ZSB2b2lkIG1ha2VCbGluaygpCi0KLXByaXZhdGUgdm9pZCBudWxsTGF5b3V0cygpCi0KLXByaXZhdGUgYm9vbGVhbiBvbk1lbnUoCi1pbnQpCi0KLXByaXZhdGUgdm9pZCByZWdpc3RlckZvclByZURyYXcoKQotCi1wcml2YXRlIHZvaWQgc2VuZEFmdGVyVGV4dENoYW5nZWQoCi1hbmRyb2lkLnRleHQuRWRpdGFibGUpCi0KLXByaXZhdGUgdm9pZCBzZW5kQmVmb3JlVGV4dENoYW5nZWQoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludAotaW50KQotCi1wcml2YXRlIHZvaWQgc2VuZE9uVGV4dENoYW5nZWQoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludAotaW50KQotCi1wcml2YXRlIHZvaWQgc2V0RmlsdGVycygKLWFuZHJvaWQudGV4dC5FZGl0YWJsZQotYW5kcm9pZC50ZXh0LklucHV0RmlsdGVyW10pCi0KLXByaXZhdGUgdm9pZCBzZXRSYXdUZXh0U2l6ZSgKLWZsb2F0KQotCi1wcml2YXRlIHZvaWQgc2V0VGV4dCgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWFuZHJvaWQud2lkZ2V0LlRleHRWaWV3JEJ1ZmZlclR5cGUKLWJvb2xlYW4KLWludCkKLQotcHJpdmF0ZSB2b2lkIHNldFR5cGVmYWNlQnlJbmRleCgKLWludAotaW50KQotCi1wcml2YXRlIHZvaWQgc2hvd0Vycm9yKCkKLQotcHJpdmF0ZSB2b2lkIHVwZGF0ZVRleHRDb2xvcnMoKQotCi1wdWJsaWMgdm9pZCBhZGRUZXh0Q2hhbmdlZExpc3RlbmVyKAotYW5kcm9pZC50ZXh0LlRleHRXYXRjaGVyKQotCi1wdWJsaWMgZmluYWwgdm9pZCBhcHBlbmQoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotCi1wdWJsaWMgdm9pZCBhcHBlbmQoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludCkKLQotcHJvdGVjdGVkIGludCBjb21wdXRlSG9yaXpvbnRhbFNjcm9sbFJhbmdlKCkKLQotcHVibGljIHZvaWQgY29tcHV0ZVNjcm9sbCgpCi0KLXByb3RlY3RlZCBpbnQgY29tcHV0ZVZlcnRpY2FsU2Nyb2xsUmFuZ2UoKQotCi1wdWJsaWMgdm9pZCBkZWJ1ZygKLWludCkKLQotcHJvdGVjdGVkIHZvaWQgZHJhd2FibGVTdGF0ZUNoYW5nZWQoKQotCi1wdWJsaWMgZmluYWwgaW50IGdldEF1dG9MaW5rTWFzaygpCi0KLXB1YmxpYyBpbnQgZ2V0QmFzZWxpbmUoKQotCi1wdWJsaWMgaW50IGdldENvbXBvdW5kRHJhd2FibGVQYWRkaW5nKCkKLQotcHVibGljIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGVbXSBnZXRDb21wb3VuZERyYXdhYmxlcygpCi0KLXB1YmxpYyBpbnQgZ2V0Q29tcG91bmRQYWRkaW5nQm90dG9tKCkKLQotcHVibGljIGludCBnZXRDb21wb3VuZFBhZGRpbmdMZWZ0KCkKLQotcHVibGljIGludCBnZXRDb21wb3VuZFBhZGRpbmdSaWdodCgpCi0KLXB1YmxpYyBpbnQgZ2V0Q29tcG91bmRQYWRkaW5nVG9wKCkKLQotcHVibGljIGZpbmFsIGludCBnZXRDdXJyZW50SGludFRleHRDb2xvcigpCi0KLXB1YmxpYyBmaW5hbCBpbnQgZ2V0Q3VycmVudFRleHRDb2xvcigpCi0KLXByb3RlY3RlZCBib29sZWFuIGdldERlZmF1bHRFZGl0YWJsZSgpCi0KLXByb3RlY3RlZCBhbmRyb2lkLnRleHQubWV0aG9kLk1vdmVtZW50TWV0aG9kIGdldERlZmF1bHRNb3ZlbWVudE1ldGhvZCgpCi0KLXB1YmxpYyBhbmRyb2lkLnRleHQuVGV4dFV0aWxzJFRydW5jYXRlQXQgZ2V0RWxsaXBzaXplKCkKLQotcHVibGljIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgZ2V0RXJyb3IoKQotCi1wdWJsaWMgaW50IGdldEV4dGVuZGVkUGFkZGluZ0JvdHRvbSgpCi0KLXB1YmxpYyBpbnQgZ2V0RXh0ZW5kZWRQYWRkaW5nVG9wKCkKLQotcHVibGljIGFuZHJvaWQudGV4dC5JbnB1dEZpbHRlcltdIGdldEZpbHRlcnMoKQotCi1wdWJsaWMgdm9pZCBnZXRGb2N1c2VkUmVjdCgKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdCkKLQotcHVibGljIGJvb2xlYW4gZ2V0RnJlZXplc1RleHQoKQotCi1wdWJsaWMgaW50IGdldEdyYXZpdHkoKQotQGFuZHJvaWQudmlldy5WaWV3RGVidWckQ2FwdHVyZWRWaWV3UHJvcGVydHkKLXB1YmxpYyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIGdldEhpbnQoKQotCi1wdWJsaWMgZmluYWwgYW5kcm9pZC5jb250ZW50LnJlcy5Db2xvclN0YXRlTGlzdCBnZXRIaW50VGV4dENvbG9ycygpCi0KLXB1YmxpYyBmaW5hbCBhbmRyb2lkLnRleHQubWV0aG9kLktleUxpc3RlbmVyIGdldEtleUxpc3RlbmVyKCkKLQotcHVibGljIGZpbmFsIGFuZHJvaWQudGV4dC5MYXlvdXQgZ2V0TGF5b3V0KCkKLQotcHVibGljIGludCBnZXRMaW5lQm91bmRzKAotaW50Ci1hbmRyb2lkLmdyYXBoaWNzLlJlY3QpCi0KLXB1YmxpYyBpbnQgZ2V0TGluZUNvdW50KCkKLQotcHVibGljIGludCBnZXRMaW5lSGVpZ2h0KCkKLQotcHVibGljIGZpbmFsIGFuZHJvaWQuY29udGVudC5yZXMuQ29sb3JTdGF0ZUxpc3QgZ2V0TGlua1RleHRDb2xvcnMoKQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBnZXRMaW5rc0NsaWNrYWJsZSgpCi0KLXB1YmxpYyBmaW5hbCBhbmRyb2lkLnRleHQubWV0aG9kLk1vdmVtZW50TWV0aG9kIGdldE1vdmVtZW50TWV0aG9kKCkKLQotcHVibGljIGFuZHJvaWQudGV4dC5UZXh0UGFpbnQgZ2V0UGFpbnQoKQotCi1wdWJsaWMgaW50IGdldFBhaW50RmxhZ3MoKQotCi1wdWJsaWMgaW50IGdldFNlbGVjdGlvbkVuZCgpCi0KLXB1YmxpYyBpbnQgZ2V0U2VsZWN0aW9uU3RhcnQoKQotQGFuZHJvaWQudmlldy5WaWV3RGVidWckQ2FwdHVyZWRWaWV3UHJvcGVydHkKLXB1YmxpYyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIGdldFRleHQoKQotCi1wdWJsaWMgZmluYWwgYW5kcm9pZC5jb250ZW50LnJlcy5Db2xvclN0YXRlTGlzdCBnZXRUZXh0Q29sb3JzKCkKLQotcHVibGljIGZsb2F0IGdldFRleHRTY2FsZVgoKQotCi1wdWJsaWMgZmxvYXQgZ2V0VGV4dFNpemUoKQotCi1wdWJsaWMgaW50IGdldFRvdGFsUGFkZGluZ0JvdHRvbSgpCi0KLXB1YmxpYyBpbnQgZ2V0VG90YWxQYWRkaW5nTGVmdCgpCi0KLXB1YmxpYyBpbnQgZ2V0VG90YWxQYWRkaW5nUmlnaHQoKQotCi1wdWJsaWMgaW50IGdldFRvdGFsUGFkZGluZ1RvcCgpCi0KLXB1YmxpYyBmaW5hbCBhbmRyb2lkLnRleHQubWV0aG9kLlRyYW5zZm9ybWF0aW9uTWV0aG9kIGdldFRyYW5zZm9ybWF0aW9uTWV0aG9kKCkKLQotcHVibGljIGFuZHJvaWQuZ3JhcGhpY3MuVHlwZWZhY2UgZ2V0VHlwZWZhY2UoKQotCi1wdWJsaWMgYW5kcm9pZC50ZXh0LnN0eWxlLlVSTFNwYW5bXSBnZXRVcmxzKCkKLQotcHVibGljIGJvb2xlYW4gaGFzU2VsZWN0aW9uKCkKLQotcHVibGljIGludCBsZW5ndGgoKQotCi1wcm90ZWN0ZWQgdm9pZCBtYWtlTmV3TGF5b3V0KAotaW50Ci1pbnQKLWFuZHJvaWQudGV4dC5Cb3JpbmdMYXlvdXQkTWV0cmljcwotYW5kcm9pZC50ZXh0LkJvcmluZ0xheW91dCRNZXRyaWNzCi1pbnQKLWJvb2xlYW4pCi0KLXByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlQ29udGV4dE1lbnUoCi1hbmRyb2lkLnZpZXcuQ29udGV4dE1lbnUpCi0KLXByb3RlY3RlZCB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkKLQotcHJvdGVjdGVkIHZvaWQgb25EcmF3KAotYW5kcm9pZC5ncmFwaGljcy5DYW52YXMpCi0KLXByb3RlY3RlZCB2b2lkIG9uRm9jdXNDaGFuZ2VkKAotYm9vbGVhbgotaW50Ci1hbmRyb2lkLmdyYXBoaWNzLlJlY3QpCi0KLXB1YmxpYyBib29sZWFuIG9uS2V5RG93bigKLWludAotYW5kcm9pZC52aWV3LktleUV2ZW50KQotCi1wdWJsaWMgYm9vbGVhbiBvbktleVNob3J0Y3V0KAotaW50Ci1hbmRyb2lkLnZpZXcuS2V5RXZlbnQpCi0KLXB1YmxpYyBib29sZWFuIG9uS2V5VXAoCi1pbnQKLWFuZHJvaWQudmlldy5LZXlFdmVudCkKLQotcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBib29sZWFuIG9uUHJlRHJhdygpCi0KLXB1YmxpYyB2b2lkIG9uUmVzdG9yZUluc3RhbmNlU3RhdGUoCi1hbmRyb2lkLm9zLlBhcmNlbGFibGUpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLlBhcmNlbGFibGUgb25TYXZlSW5zdGFuY2VTdGF0ZSgpCi0KLXByb3RlY3RlZCB2b2lkIG9uVGV4dENoYW5nZWQoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnQoCi1hbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQpCi0KLXB1YmxpYyBib29sZWFuIG9uVHJhY2tiYWxsRXZlbnQoCi1hbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQpCi0KLXB1YmxpYyB2b2lkIG9uV2luZG93Rm9jdXNDaGFuZ2VkKAotYm9vbGVhbikKLQotcHVibGljIGJvb2xlYW4gcGVyZm9ybUxvbmdDbGljaygpCi0KLXB1YmxpYyB2b2lkIHJlbW92ZVRleHRDaGFuZ2VkTGlzdGVuZXIoCi1hbmRyb2lkLnRleHQuVGV4dFdhdGNoZXIpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHNldEF1dG9MaW5rTWFzaygKLWludCkKLQotcHVibGljIHZvaWQgc2V0Q29tcG91bmREcmF3YWJsZVBhZGRpbmcoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldENvbXBvdW5kRHJhd2FibGVzKAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZQotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZQotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZQotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSkKLQotcHVibGljIHZvaWQgc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZQotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZQotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZQotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSkKLQotcHVibGljIHZvaWQgc2V0Q3Vyc29yVmlzaWJsZSgKLWJvb2xlYW4pCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHNldEVkaXRhYmxlRmFjdG9yeSgKLWFuZHJvaWQudGV4dC5FZGl0YWJsZSRGYWN0b3J5KQotCi1wdWJsaWMgdm9pZCBzZXRFbGxpcHNpemUoCi1hbmRyb2lkLnRleHQuVGV4dFV0aWxzJFRydW5jYXRlQXQpCi0KLXB1YmxpYyB2b2lkIHNldEVtcygKLWludCkKLQotcHVibGljIHZvaWQgc2V0RXJyb3IoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotCi1wdWJsaWMgdm9pZCBzZXRFcnJvcigKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUpCi0KLXB1YmxpYyB2b2lkIHNldEZpbHRlcnMoCi1hbmRyb2lkLnRleHQuSW5wdXRGaWx0ZXJbXSkKLQotcHJvdGVjdGVkIGJvb2xlYW4gc2V0RnJhbWUoCi1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldEZyZWV6ZXNUZXh0KAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0R3Jhdml0eSgKLWludCkKLQotcHVibGljIHZvaWQgc2V0SGVpZ2h0KAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRIaWdobGlnaHRDb2xvcigKLWludCkKLQotcHVibGljIGZpbmFsIHZvaWQgc2V0SGludCgKLWludCkKLQotcHVibGljIGZpbmFsIHZvaWQgc2V0SGludCgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHNldEhpbnRUZXh0Q29sb3IoCi1pbnQpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHNldEhpbnRUZXh0Q29sb3IoCi1hbmRyb2lkLmNvbnRlbnQucmVzLkNvbG9yU3RhdGVMaXN0KQotCi1wdWJsaWMgdm9pZCBzZXRIb3Jpem9udGFsbHlTY3JvbGxpbmcoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRJbmNsdWRlRm9udFBhZGRpbmcoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRLZXlMaXN0ZW5lcigKLWFuZHJvaWQudGV4dC5tZXRob2QuS2V5TGlzdGVuZXIpCi0KLXB1YmxpYyB2b2lkIHNldExpbmVTcGFjaW5nKAotZmxvYXQKLWZsb2F0KQotCi1wdWJsaWMgdm9pZCBzZXRMaW5lcygKLWludCkKLQotcHVibGljIGZpbmFsIHZvaWQgc2V0TGlua1RleHRDb2xvcigKLWludCkKLQotcHVibGljIGZpbmFsIHZvaWQgc2V0TGlua1RleHRDb2xvcigKLWFuZHJvaWQuY29udGVudC5yZXMuQ29sb3JTdGF0ZUxpc3QpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHNldExpbmtzQ2xpY2thYmxlKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0TWF4RW1zKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRNYXhIZWlnaHQoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldE1heExpbmVzKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRNYXhXaWR0aCgKLWludCkKLQotcHVibGljIHZvaWQgc2V0TWluRW1zKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRNaW5IZWlnaHQoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldE1pbkxpbmVzKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRNaW5XaWR0aCgKLWludCkKLQotcHVibGljIGZpbmFsIHZvaWQgc2V0TW92ZW1lbnRNZXRob2QoCi1hbmRyb2lkLnRleHQubWV0aG9kLk1vdmVtZW50TWV0aG9kKQotCi1wdWJsaWMgdm9pZCBzZXRQYWRkaW5nKAotaW50Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRQYWludEZsYWdzKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRTY3JvbGxlcigKLWFuZHJvaWQud2lkZ2V0LlNjcm9sbGVyKQotCi1wdWJsaWMgdm9pZCBzZXRTZWxlY3RBbGxPbkZvY3VzKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0U2hhZG93TGF5ZXIoCi1mbG9hdAotZmxvYXQKLWZsb2F0Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldFNpbmdsZUxpbmUoKQotCi1wdWJsaWMgdm9pZCBzZXRTaW5nbGVMaW5lKAotYm9vbGVhbikKLQotcHVibGljIGZpbmFsIHZvaWQgc2V0U3Bhbm5hYmxlRmFjdG9yeSgKLWFuZHJvaWQudGV4dC5TcGFubmFibGUkRmFjdG9yeSkKLQotcHVibGljIGZpbmFsIHZvaWQgc2V0VGV4dCgKLWludCkKLQotcHVibGljIGZpbmFsIHZvaWQgc2V0VGV4dCgKLWludAotYW5kcm9pZC53aWRnZXQuVGV4dFZpZXckQnVmZmVyVHlwZSkKLQotcHVibGljIGZpbmFsIHZvaWQgc2V0VGV4dCgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi0KLXB1YmxpYyB2b2lkIHNldFRleHQoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1hbmRyb2lkLndpZGdldC5UZXh0VmlldyRCdWZmZXJUeXBlKQotCi1wdWJsaWMgZmluYWwgdm9pZCBzZXRUZXh0KAotY2hhcltdCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgc2V0VGV4dEFwcGVhcmFuY2UoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRUZXh0Q29sb3IoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldFRleHRDb2xvcigKLWFuZHJvaWQuY29udGVudC5yZXMuQ29sb3JTdGF0ZUxpc3QpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHNldFRleHRLZWVwU3RhdGUoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotCi1wdWJsaWMgZmluYWwgdm9pZCBzZXRUZXh0S2VlcFN0YXRlKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotYW5kcm9pZC53aWRnZXQuVGV4dFZpZXckQnVmZmVyVHlwZSkKLQotcHVibGljIHZvaWQgc2V0VGV4dFNjYWxlWCgKLWZsb2F0KQotCi1wdWJsaWMgdm9pZCBzZXRUZXh0U2l6ZSgKLWZsb2F0KQotCi1wdWJsaWMgdm9pZCBzZXRUZXh0U2l6ZSgKLWludAotZmxvYXQpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHNldFRyYW5zZm9ybWF0aW9uTWV0aG9kKAotYW5kcm9pZC50ZXh0Lm1ldGhvZC5UcmFuc2Zvcm1hdGlvbk1ldGhvZCkKLQotcHVibGljIHZvaWQgc2V0VHlwZWZhY2UoCi1hbmRyb2lkLmdyYXBoaWNzLlR5cGVmYWNlKQotCi1wdWJsaWMgdm9pZCBzZXRUeXBlZmFjZSgKLWFuZHJvaWQuZ3JhcGhpY3MuVHlwZWZhY2UKLWludCkKLQotcHVibGljIHZvaWQgc2V0V2lkdGgoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC53aWRnZXQuRWRpdFRleHQgZXh0ZW5kcyBhbmRyb2lkLndpZGdldC5UZXh0VmlldwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQKLWludCkKLQotcHVibGljIHZvaWQgZXh0ZW5kU2VsZWN0aW9uKAotaW50KQotCi1wcm90ZWN0ZWQgYm9vbGVhbiBnZXREZWZhdWx0RWRpdGFibGUoKQotCi1wcm90ZWN0ZWQgYW5kcm9pZC50ZXh0Lm1ldGhvZC5Nb3ZlbWVudE1ldGhvZCBnZXREZWZhdWx0TW92ZW1lbnRNZXRob2QoKQotCi1wdWJsaWMgYW5kcm9pZC50ZXh0LkVkaXRhYmxlIGdldFRleHQoKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBnZXRUZXh0KCkKLQotcHVibGljIHZvaWQgc2VsZWN0QWxsKCkKLQotcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgc2V0VGV4dCgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWFuZHJvaWQud2lkZ2V0LlRleHRWaWV3JEJ1ZmZlclR5cGUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L0ZpbHRlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPUZpbHRlckxpc3RlbmVyICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC53aWRnZXQuRmlsdGVyJEZpbHRlckxpc3RlbmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uRmlsdGVyQ29tcGxldGUoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvQXV0b0NvbXBsZXRlVGV4dFZpZXckMTtMYW5kcm9pZC93aWRnZXQvQXV0b0NvbXBsZXRlVGV4dFZpZXckVmFsaWRhdG9yO0xhbmRyb2lkL3dpZGdldC9BdXRvQ29tcGxldGVUZXh0VmlldyREcm9wRG93bkxpc3RWaWV3O0xhbmRyb2lkL3dpZGdldC9BdXRvQ29tcGxldGVUZXh0VmlldyREcm9wRG93bkl0ZW1DbGlja0xpc3RlbmVyOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC53aWRnZXQuQXV0b0NvbXBsZXRlVGV4dFZpZXcgZXh0ZW5kcyBhbmRyb2lkLndpZGdldC5FZGl0VGV4dCBpbXBsZW1lbnRzIGFuZHJvaWQud2lkZ2V0LkZpbHRlciRGaWx0ZXJMaXN0ZW5lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSElOVF9WSUVXX0lECi0KLXByaXZhdGUgYW5kcm9pZC53aWRnZXQuTGlzdEFkYXB0ZXIgbUFkYXB0ZXIKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLndpZGdldC5BdXRvQ29tcGxldGVUZXh0VmlldyREcm9wRG93bkl0ZW1DbGlja0xpc3RlbmVyIG1Ecm9wRG93bkl0ZW1DbGlja0xpc3RlbmVyCi0KLXByaXZhdGUgYW5kcm9pZC53aWRnZXQuQXV0b0NvbXBsZXRlVGV4dFZpZXckRHJvcERvd25MaXN0VmlldyBtRHJvcERvd25MaXN0Ci0KLXByaXZhdGUgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSBtRHJvcERvd25MaXN0SGlnaGxpZ2h0Ci0KLXByaXZhdGUgYW5kcm9pZC53aWRnZXQuRmlsdGVyIG1GaWx0ZXIKLQotcHJpdmF0ZSBpbnQgbUhpbnRSZXNvdXJjZQotCi1wcml2YXRlIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgbUhpbnRUZXh0Ci0KLXByaXZhdGUgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXckT25JdGVtQ2xpY2tMaXN0ZW5lciBtSXRlbUNsaWNrTGlzdGVuZXIKLQotcHJpdmF0ZSBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldyRPbkl0ZW1TZWxlY3RlZExpc3RlbmVyIG1JdGVtU2VsZWN0ZWRMaXN0ZW5lcgotCi1wcml2YXRlIGFuZHJvaWQud2lkZ2V0LlBvcHVwV2luZG93IG1Qb3B1cAotCi1wcml2YXRlIGJvb2xlYW4gbVRleHRDaGFuZ2VkCi0KLXByaXZhdGUgaW50IG1UaHJlc2hvbGQKLQotcHJpdmF0ZSBhbmRyb2lkLndpZGdldC5BdXRvQ29tcGxldGVUZXh0VmlldyRWYWxpZGF0b3IgbVZhbGlkYXRvcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQKLWludCkKLQotc3RhdGljIHZvaWQgYWNjZXNzJDEwMCgKLWFuZHJvaWQud2lkZ2V0LkF1dG9Db21wbGV0ZVRleHRWaWV3Ci1hbmRyb2lkLnZpZXcuVmlldwotaW50Ci1sb25nKQotCi1wcml2YXRlIGludCBidWlsZERyb3BEb3duKCkKLQotcHJpdmF0ZSBhbmRyb2lkLnZpZXcuVmlldyBnZXRIaW50VmlldygKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wcml2YXRlIHZvaWQgcGVyZm9ybUNvbXBsZXRpb24oCi1hbmRyb2lkLnZpZXcuVmlldwotaW50Ci1sb25nKQotCi1wcm90ZWN0ZWQgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBjb252ZXJ0U2VsZWN0aW9uVG9TdHJpbmcoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgdm9pZCBkaXNtaXNzRHJvcERvd24oKQotCi1wdWJsaWMgYm9vbGVhbiBlbm91Z2hUb0ZpbHRlcigpCi0KLSB2b2lkIGZpbmlzaEluaXQoKQotCi1wdWJsaWMgYW5kcm9pZC53aWRnZXQuTGlzdEFkYXB0ZXIgZ2V0QWRhcHRlcigpCi0KLXByb3RlY3RlZCBhbmRyb2lkLndpZGdldC5GaWx0ZXIgZ2V0RmlsdGVyKCkKLQotcHVibGljIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3JE9uSXRlbUNsaWNrTGlzdGVuZXIgZ2V0SXRlbUNsaWNrTGlzdGVuZXIoKQotCi1wdWJsaWMgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXckT25JdGVtU2VsZWN0ZWRMaXN0ZW5lciBnZXRJdGVtU2VsZWN0ZWRMaXN0ZW5lcigpCi0KLXB1YmxpYyBpbnQgZ2V0VGhyZXNob2xkKCkKLQotcHVibGljIGFuZHJvaWQud2lkZ2V0LkF1dG9Db21wbGV0ZVRleHRWaWV3JFZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKQotCi1wdWJsaWMgYm9vbGVhbiBpc1BvcHVwU2hvd2luZygpCi0KLXB1YmxpYyB2b2lkIG9uRmlsdGVyQ29tcGxldGUoCi1pbnQpCi0KLXByb3RlY3RlZCB2b2lkIG9uRm9jdXNDaGFuZ2VkKAotYm9vbGVhbgotaW50Ci1hbmRyb2lkLmdyYXBoaWNzLlJlY3QpCi0KLXB1YmxpYyBib29sZWFuIG9uS2V5RG93bigKLWludAotYW5kcm9pZC52aWV3LktleUV2ZW50KQotCi1wdWJsaWMgYm9vbGVhbiBvbktleVVwKAotaW50Ci1hbmRyb2lkLnZpZXcuS2V5RXZlbnQpCi0KLXByb3RlY3RlZCB2b2lkIG9uVGV4dENoYW5nZWQoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBvbldpbmRvd0ZvY3VzQ2hhbmdlZCgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHBlcmZvcm1Db21wbGV0aW9uKCkKLQotcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUZpbHRlcmluZygKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWludCkKLQotcHVibGljIHZvaWQgcGVyZm9ybVZhbGlkYXRpb24oKQotCi1wcm90ZWN0ZWQgdm9pZCByZXBsYWNlVGV4dCgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFQ6OkxhbmRyb2lkL3dpZGdldC9MaXN0QWRhcHRlcjs6TGFuZHJvaWQvd2lkZ2V0L0ZpbHRlcmFibGU7PihUVDspViApCi1wdWJsaWMgdm9pZCBzZXRBZGFwdGVyKAotYW5kcm9pZC53aWRnZXQuTGlzdEFkYXB0ZXIpCi0KLXB1YmxpYyB2b2lkIHNldENvbXBsZXRpb25IaW50KAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotcHJvdGVjdGVkIGJvb2xlYW4gc2V0RnJhbWUoCi1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldE9uSXRlbUNsaWNrTGlzdGVuZXIoCi1hbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldyRPbkl0ZW1DbGlja0xpc3RlbmVyKQotCi1wdWJsaWMgdm9pZCBzZXRPbkl0ZW1TZWxlY3RlZExpc3RlbmVyKAotYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXckT25JdGVtU2VsZWN0ZWRMaXN0ZW5lcikKLQotcHVibGljIHZvaWQgc2V0VGhyZXNob2xkKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRWYWxpZGF0b3IoCi1hbmRyb2lkLndpZGdldC5BdXRvQ29tcGxldGVUZXh0VmlldyRWYWxpZGF0b3IpCi0KLXB1YmxpYyB2b2lkIHNob3dEcm9wRG93bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi0gY2xhc3MgYW5kcm9pZC53ZWJraXQuVGV4dERpYWxvZyBleHRlbmRzIGFuZHJvaWQud2lkZ2V0LkF1dG9Db21wbGV0ZVRleHRWaWV3Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGludCBMT05HUFJFU1MKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYW5kcm9pZC50ZXh0LklucHV0RmlsdGVyW10gTk9fRklMVEVSUwotCi1wcml2YXRlIGNoYXJbXSBtQ2hhcmFjdGVyCi0KLXByaXZhdGUgbG9uZyBtRG93blRpbWUKLQotcHJpdmF0ZSBib29sZWFuIG1Hb3RFbnRlckRvd24KLQotcHJpdmF0ZSBhbmRyb2lkLm9zLkhhbmRsZXIgbUhhbmRsZXIKLQotcHJpdmF0ZSBpbnQgbUhlaWdodFNwZWMKLQotcHJpdmF0ZSBpbnQgbU1heExlbmd0aAotCi1wcml2YXRlIGludCBtTm9kZVBvaW50ZXIKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1QcmVDaGFuZ2UKLQotcHJpdmF0ZSBib29sZWFuIG1TY3JvbGxUb0FjY29tbW9kYXRlQ3Vyc29yCi0KLXByaXZhdGUgYm9vbGVhbiBtU2luZ2xlCi0KLXByaXZhdGUgYm9vbGVhbiBtVHJhY2tiYWxsRG93bgotCi1wcml2YXRlIGFuZHJvaWQud2Via2l0LldlYlZpZXcgbVdlYlZpZXcKLQotcHJpdmF0ZSBpbnQgbVdpZHRoU3BlYwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQud2Via2l0LldlYlZpZXcpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDAwMCgpCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQxMDAoCi1hbmRyb2lkLndlYmtpdC5UZXh0RGlhbG9nKQotCi1zdGF0aWMgYm9vbGVhbiBhY2Nlc3MkMTAyKAotYW5kcm9pZC53ZWJraXQuVGV4dERpYWxvZwotYm9vbGVhbikKLQotcHJpdmF0ZSB2b2lkIHNlbmREb21FdmVudCgKLWFuZHJvaWQudmlldy5LZXlFdmVudCkKLQotcHVibGljIGJvb2xlYW4gZGlzcGF0Y2hLZXlFdmVudCgKLWFuZHJvaWQudmlldy5LZXlFdmVudCkKLQotIGJvb2xlYW4gaXNTYW1lVGV4dEZpZWxkKAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBvblByZURyYXcoKQotCi1wcm90ZWN0ZWQgdm9pZCBvblRleHRDaGFuZ2VkKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotaW50Ci1pbnQKLWludCkKLQotcHVibGljIGJvb2xlYW4gb25UcmFja2JhbGxFdmVudCgKLWFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCkKLQotIHZvaWQgcmVtb3ZlKCkKLQotcHVibGljIGJvb2xlYW4gcmVxdWVzdFJlY3RhbmdsZU9uU2NyZWVuKAotYW5kcm9pZC5ncmFwaGljcy5SZWN0KQotCi0gdm9pZCBzZXRJblBhc3N3b3JkKAotYm9vbGVhbikKLQotIHZvaWQgc2V0TWF4TGVuZ3RoKAotaW50KQotCi0gdm9pZCBzZXROb2RlUG9pbnRlcigKLWludCkKLQotIHZvaWQgc2V0UmVjdCgKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgc2V0U2luZ2xlTGluZSgKLWJvb2xlYW4pCi0KLSB2b2lkIHNldFRleHQoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludCkKLQotIHZvaWQgc2V0VGV4dEFuZEtlZXBTZWxlY3Rpb24oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi0gdm9pZCB1cGRhdGVDYWNoZWRUZXh0ZmllbGQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQud2Via2l0LlVSTFV0aWwgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFTU0VUX0JBU0UKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4gQ09OVEVOVF9ESVNQT1NJVElPTl9QQVRURVJOCi0KLXN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEZJTEVfQkFTRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIExPR1RBRwotCi1zdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQUk9YWV9CQVNFCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgY29tcG9zZVNlYXJjaFVybCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGRlY29kZSgKLWJ5dGVbXSkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGd1ZXNzRmlsZU5hbWUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ3Vlc3NVcmwoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBYm91dFVybCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Fzc2V0VXJsKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ29udGVudFVybCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Nvb2tpZWxlc3NQcm94eVVybCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RhdGFVcmwoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNGaWxlVXJsKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzSHR0cFVybCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0h0dHBzVXJsKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzSmF2YVNjcmlwdFVybCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc05ldHdvcmtVcmwoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZFVybCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgcGFyc2VDb250ZW50RGlzcG9zaXRpb24oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHN0YXRpYyBpbnQgcGFyc2VIZXgoCi1ieXRlKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgc3RyaXBBbmNob3IoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLndlYmtpdC5VcmxJbnRlcmNlcHRIYW5kbGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOz47KUxhbmRyb2lkL3dlYmtpdC9DYWNoZU1hbmFnZXIkQ2FjaGVSZXN1bHQ7ICkKLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLndlYmtpdC5DYWNoZU1hbmFnZXIkQ2FjaGVSZXN1bHQgc2VydmljZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudXRpbC5NYXApCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC53ZWJraXQuVXJsSW50ZXJjZXB0UmVnaXN0cnkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTE9HVEFHCi0KLXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbURpc2FibGVkCi0KLXByaXZhdGUgc3RhdGljIGphdmEudXRpbC5MaW5rZWRMaXN0IG1IYW5kbGVyTGlzdAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLkxpbmtlZExpc3QgZ2V0SGFuZGxlcnMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1N0cmluZztMamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzs+OylMYW5kcm9pZC93ZWJraXQvQ2FjaGVNYW5hZ2VyJENhY2hlUmVzdWx0OyApCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQud2Via2l0LkNhY2hlTWFuYWdlciRDYWNoZVJlc3VsdCBnZXRTdXJyb2dhdGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnV0aWwuTWFwKQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVnaXN0ZXJIYW5kbGVyKAotYW5kcm9pZC53ZWJraXQuVXJsSW50ZXJjZXB0SGFuZGxlcikKLQotcHVibGljIHN0YXRpYyB2b2lkIHNldFVybEludGVyY2VwdERpc2FibGVkKAotYm9vbGVhbikKLQotcHVibGljIHN0YXRpYyBib29sZWFuIHVucmVnaXN0ZXJIYW5kbGVyKAotYW5kcm9pZC53ZWJraXQuVXJsSW50ZXJjZXB0SGFuZGxlcikKLQotcHVibGljIHN0YXRpYyBib29sZWFuIHVybEludGVyY2VwdERpc2FibGVkKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLndlYmtpdC5XZWJCYWNrRm9yd2FyZExpc3QgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5sYW5nLkNsb25lYWJsZSwgamF2YS5pby5TZXJpYWxpemFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0FycmF5TGlzdDxMYW5kcm9pZC93ZWJraXQvV2ViSGlzdG9yeUl0ZW07PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuQXJyYXlMaXN0IG1BcnJheQotCi1wcml2YXRlIGJvb2xlYW4gbUNsZWFyUGVuZGluZwotCi1wcml2YXRlIGludCBtQ3VycmVudEluZGV4Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlQ2xvc2UoCi1pbnQpCi0KLXByaXZhdGUgdm9pZCByZW1vdmVIaXN0b3J5SXRlbSgKLWludCkKLQotc3RhdGljIHN5bmNocm9uaXplZCBuYXRpdmUgdm9pZCByZXN0b3JlSW5kZXgoCi1pbnQKLWludCkKLQotIHZvaWQgYWRkSGlzdG9yeUl0ZW0oCi1hbmRyb2lkLndlYmtpdC5XZWJIaXN0b3J5SXRlbSkKLQotcHJvdGVjdGVkIGFuZHJvaWQud2Via2l0LldlYkJhY2tGb3J3YXJkTGlzdCBjbG9uZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9DbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgY2xvbmUoKQotCi0gdm9pZCBjbG9zZSgKLWludCkKLQotIGJvb2xlYW4gZ2V0Q2xlYXJQZW5kaW5nKCkKLQotcHVibGljIGludCBnZXRDdXJyZW50SW5kZXgoKQotCi1wdWJsaWMgYW5kcm9pZC53ZWJraXQuV2ViSGlzdG9yeUl0ZW0gZ2V0Q3VycmVudEl0ZW0oKQotCi1wdWJsaWMgYW5kcm9pZC53ZWJraXQuV2ViSGlzdG9yeUl0ZW0gZ2V0SXRlbUF0SW5kZXgoCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0U2l6ZSgpCi0KLSB2b2lkIHNldENsZWFyUGVuZGluZygpCi0KLSB2b2lkIHNldEN1cnJlbnRJbmRleCgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLndlYmtpdC5XZWJDaHJvbWVDbGllbnQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgb25DbG9zZVdpbmRvdygKLWFuZHJvaWQud2Via2l0LldlYlZpZXcpCi0KLXB1YmxpYyBib29sZWFuIG9uQ3JlYXRlV2luZG93KAotYW5kcm9pZC53ZWJraXQuV2ViVmlldwotYm9vbGVhbgotYm9vbGVhbgotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgYm9vbGVhbiBvbkpzQWxlcnQoCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3Ci1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLndlYmtpdC5Kc1Jlc3VsdCkKLQotcHVibGljIGJvb2xlYW4gb25Kc0JlZm9yZVVubG9hZCgKLWFuZHJvaWQud2Via2l0LldlYlZpZXcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQud2Via2l0LkpzUmVzdWx0KQotCi1wdWJsaWMgYm9vbGVhbiBvbkpzQ29uZmlybSgKLWFuZHJvaWQud2Via2l0LldlYlZpZXcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQud2Via2l0LkpzUmVzdWx0KQotCi1wdWJsaWMgYm9vbGVhbiBvbkpzUHJvbXB0KAotYW5kcm9pZC53ZWJraXQuV2ViVmlldwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC53ZWJraXQuSnNQcm9tcHRSZXN1bHQpCi0KLXB1YmxpYyB2b2lkIG9uUHJvZ3Jlc3NDaGFuZ2VkKAotYW5kcm9pZC53ZWJraXQuV2ViVmlldwotaW50KQotCi1wdWJsaWMgdm9pZCBvblJlY2VpdmVkSWNvbigKLWFuZHJvaWQud2Via2l0LldlYlZpZXcKLWFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwKQotCi1wdWJsaWMgdm9pZCBvblJlY2VpdmVkVGl0bGUoCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBvblJlcXVlc3RGb2N1cygKLWFuZHJvaWQud2Via2l0LldlYlZpZXcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC53ZWJraXQuV2ViSGlzdG9yeUl0ZW0gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5sYW5nLkNsb25lYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBpbnQgc05leHRJZAotCi1wcml2YXRlIGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwIG1GYXZpY29uCi0KLXByaXZhdGUgYnl0ZVtdIG1GbGF0dGVuZWREYXRhCi0KLXByaXZhdGUgZmluYWwgaW50IG1JZAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbU9yaWdpbmFsVXJsCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtVGl0bGUKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1VcmwKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53ZWJraXQuV2ViSGlzdG9yeUl0ZW0pCi0KLSB2b2lkIDxpbml0PigKLWJ5dGVbXSkKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBpbmZsYXRlKAotaW50Ci1ieXRlW10pCi0KLXByaXZhdGUgdm9pZCB1cGRhdGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLmdyYXBoaWNzLkJpdG1hcAotYnl0ZVtdKQotCi1wcm90ZWN0ZWQgYW5kcm9pZC53ZWJraXQuV2ViSGlzdG9yeUl0ZW0gY2xvbmUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IGNsb25lKCkKLQotcHVibGljIGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwIGdldEZhdmljb24oKQotCi0gYnl0ZVtdIGdldEZsYXR0ZW5lZERhdGEoKQotCi1wdWJsaWMgaW50IGdldElkKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0T3JpZ2luYWxVcmwoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRUaXRsZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFVybCgpCi0KLSB2b2lkIGluZmxhdGUoCi1pbnQpCi0KLSB2b2lkIHNldEZhdmljb24oCi1hbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93ZWJraXQvV2ViSWNvbkRhdGFiYXNlOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTQxMDQgbmFtZSA9bnVsbCApCi0gY2xhc3MgYW5kcm9pZC53ZWJraXQuV2ViSWNvbkRhdGFiYXNlJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi0gY2xhc3MgYW5kcm9pZC53ZWJraXQuV2ViSWNvbkRhdGFiYXNlJEV2ZW50SGFuZGxlciQxIGV4dGVuZHMgYW5kcm9pZC5vcy5IYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQud2Via2l0LldlYkljb25EYXRhYmFzZSRFdmVudEhhbmRsZXIgdGhpcyQxCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53ZWJraXQuV2ViSWNvbkRhdGFiYXNlJEV2ZW50SGFuZGxlcikKLQotcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZSgKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93ZWJraXQvV2ViSWNvbkRhdGFiYXNlJEV2ZW50SGFuZGxlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPUljb25SZXN1bHQgKQotIGNsYXNzIGFuZHJvaWQud2Via2l0LldlYkljb25EYXRhYmFzZSRFdmVudEhhbmRsZXIkSWNvblJlc3VsdCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCBtSWNvbgotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQud2Via2l0LldlYkljb25EYXRhYmFzZSRJY29uTGlzdGVuZXIgbUxpc3RlbmVyCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBtVXJsCi0KLWZpbmFsIGFuZHJvaWQud2Via2l0LldlYkljb25EYXRhYmFzZSRFdmVudEhhbmRsZXIgdGhpcyQxCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53ZWJraXQuV2ViSWNvbkRhdGFiYXNlJEV2ZW50SGFuZGxlcgotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAKLWFuZHJvaWQud2Via2l0LldlYkljb25EYXRhYmFzZSRJY29uTGlzdGVuZXIpCi0KLSB2b2lkIGRpc3BhdGNoKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTIgbmFtZSA9RXZlbnRIYW5kbGVyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dlYmtpdC9XZWJJY29uRGF0YWJhc2U7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvd2Via2l0L1dlYkljb25EYXRhYmFzZSRFdmVudEhhbmRsZXIkSWNvblJlc3VsdDsgKQotIGNsYXNzIGFuZHJvaWQud2Via2l0LldlYkljb25EYXRhYmFzZSRFdmVudEhhbmRsZXIgZXh0ZW5kcyBhbmRyb2lkLm9zLkhhbmRsZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIGludCBDTE9TRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSUNPTl9SRVNVTFQKLQotc3RhdGljIGZpbmFsIGludCBPUEVOCi0KLXN0YXRpYyBmaW5hbCBpbnQgUkVMRUFTRV9JQ09OCi0KLXN0YXRpYyBmaW5hbCBpbnQgUkVNT1ZFX0FMTAotCi1zdGF0aWMgZmluYWwgaW50IFJFUVVFU1RfSUNPTgotCi1zdGF0aWMgZmluYWwgaW50IFJFVEFJTl9JQ09OCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5IYW5kbGVyIG1IYW5kbGVyCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9WZWN0b3I8TGFuZHJvaWQvb3MvTWVzc2FnZTs+OyApCi1wcml2YXRlIGphdmEudXRpbC5WZWN0b3IgbU1lc3NhZ2VzCi0KLWZpbmFsIGFuZHJvaWQud2Via2l0LldlYkljb25EYXRhYmFzZSB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53ZWJraXQuV2ViSWNvbkRhdGFiYXNlKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLndlYmtpdC5XZWJJY29uRGF0YWJhc2UKLWFuZHJvaWQud2Via2l0LldlYkljb25EYXRhYmFzZSQxKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkNzAwKAotYW5kcm9pZC53ZWJraXQuV2ViSWNvbkRhdGFiYXNlJEV2ZW50SGFuZGxlcgotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkODAwKAotYW5kcm9pZC53ZWJraXQuV2ViSWNvbkRhdGFiYXNlJEV2ZW50SGFuZGxlcikKLQotcHJpdmF0ZSB2b2lkIGNyZWF0ZUhhbmRsZXIoKQotCi1wcml2YXRlIHZvaWQgcG9zdE1lc3NhZ2UoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPUljb25MaXN0ZW5lciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93ZWJraXQvV2ViSWNvbkRhdGFiYXNlOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQud2Via2l0LldlYkljb25EYXRhYmFzZSRJY29uTGlzdGVuZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgb25SZWNlaXZlZEljb24oCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3dlYmtpdC9XZWJJY29uRGF0YWJhc2UkMTtMYW5kcm9pZC93ZWJraXQvV2ViSWNvbkRhdGFiYXNlJEljb25MaXN0ZW5lcjtMYW5kcm9pZC93ZWJraXQvV2ViSWNvbkRhdGFiYXNlJEV2ZW50SGFuZGxlcjsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQud2Via2l0LldlYkljb25EYXRhYmFzZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgYW5kcm9pZC53ZWJraXQuV2ViSWNvbkRhdGFiYXNlIHNJY29uRGF0YWJhc2UKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLndlYmtpdC5XZWJJY29uRGF0YWJhc2UkRXZlbnRIYW5kbGVyIG1FdmVudEhhbmRsZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotc3RhdGljIHZvaWQgYWNjZXNzJDEwMCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQyMDAoKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMzAwKCkKLQotc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwIGFjY2VzcyQ0MDAoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkNTAwKAotamF2YS5sYW5nLlN0cmluZykKLQotc3RhdGljIHZvaWQgYWNjZXNzJDYwMCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC53ZWJraXQuV2ViSWNvbkRhdGFiYXNlIGdldEluc3RhbmNlKCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlQ2xvc2UoKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAgbmF0aXZlSWNvbkZvclBhZ2VVcmwoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVPcGVuKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlUmVsZWFzZUljb25Gb3JQYWdlVXJsKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlUmVtb3ZlQWxsSWNvbnMoKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVSZXRhaW5JY29uRm9yUGFnZVVybCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIGNsb3NlKCkKLQotIHZvaWQgY3JlYXRlSGFuZGxlcigpCi0KLXB1YmxpYyB2b2lkIG9wZW4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCByZWxlYXNlSWNvbkZvclBhZ2VVcmwoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCByZW1vdmVBbGxJY29ucygpCi0KLXB1YmxpYyB2b2lkIHJlcXVlc3RJY29uRm9yUGFnZVVybCgKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQud2Via2l0LldlYkljb25EYXRhYmFzZSRJY29uTGlzdGVuZXIpCi0KLXB1YmxpYyB2b2lkIHJldGFpbkljb25Gb3JQYWdlVXJsKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTQxMDQgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93ZWJraXQvV2ViU2V0dGluZ3M7ICkKLSBjbGFzcyBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncyQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotIGNsYXNzIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzJEV2ZW50SGFuZGxlciQxIGV4dGVuZHMgYW5kcm9pZC5vcy5IYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzJEV2ZW50SGFuZGxlciB0aGlzJDEKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncyRFdmVudEhhbmRsZXIpCi0KLXB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2Via2l0L1dlYlNldHRpbmdzOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTIgbmFtZSA9RXZlbnRIYW5kbGVyICkKLSBjbGFzcyBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncyRFdmVudEhhbmRsZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBmaW5hbCBpbnQgUFJJT1JJVFkKLQotc3RhdGljIGZpbmFsIGludCBTWU5DCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5IYW5kbGVyIG1IYW5kbGVyCi0KLWZpbmFsIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncykKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53ZWJraXQuV2ViU2V0dGluZ3MKLWFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzJDEpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQzMDAoCi1hbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncyRFdmVudEhhbmRsZXIpCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQ2MDAoCi1hbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncyRFdmVudEhhbmRsZXIKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotc3RhdGljIHZvaWQgYWNjZXNzJDcwMCgKLWFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzJEV2ZW50SGFuZGxlcikKLQotcHJpdmF0ZSB2b2lkIGNyZWF0ZUhhbmRsZXIoKQotCi1wcml2YXRlIGJvb2xlYW4gc2VuZE1lc3NhZ2UoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXByaXZhdGUgdm9pZCBzZXRSZW5kZXJQcmlvcml0eSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvRW51bTxMYW5kcm9pZC93ZWJraXQvV2ViU2V0dGluZ3MkTGF5b3V0QWxnb3JpdGhtOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTY0MDkgbmFtZSA9TGF5b3V0QWxnb3JpdGhtICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dlYmtpdC9XZWJTZXR0aW5nczsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzJExheW91dEFsZ29yaXRobSBleHRlbmRzIGphdmEubGFuZy5FbnVtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzJExheW91dEFsZ29yaXRobVtdICRWQUxVRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncyRMYXlvdXRBbGdvcml0aG0gTkFSUk9XX0NPTFVNTlMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncyRMYXlvdXRBbGdvcml0aG0gTk9STUFMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53ZWJraXQuV2ViU2V0dGluZ3MkTGF5b3V0QWxnb3JpdGhtIFNJTkdMRV9DT0xVTU4KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClWICkKLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC53ZWJraXQuV2ViU2V0dGluZ3MkTGF5b3V0QWxnb3JpdGhtIHZhbHVlT2YoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzJExheW91dEFsZ29yaXRobVtdIHZhbHVlcygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2Via2l0L1dlYlNldHRpbmdzOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9FbnVtPExhbmRyb2lkL3dlYmtpdC9XZWJTZXR0aW5ncyRSZW5kZXJQcmlvcml0eTs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE2NDA5IG5hbWUgPVJlbmRlclByaW9yaXR5ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncyRSZW5kZXJQcmlvcml0eSBleHRlbmRzIGphdmEubGFuZy5FbnVtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzJFJlbmRlclByaW9yaXR5W10gJFZBTFVFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzJFJlbmRlclByaW9yaXR5IEhJR0gKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncyRSZW5kZXJQcmlvcml0eSBMT1cKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncyRSZW5kZXJQcmlvcml0eSBOT1JNQUwKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClWICkKLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC53ZWJraXQuV2ViU2V0dGluZ3MkUmVuZGVyUHJpb3JpdHkgdmFsdWVPZigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC53ZWJraXQuV2ViU2V0dGluZ3MkUmVuZGVyUHJpb3JpdHlbXSB2YWx1ZXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL0VudW08TGFuZHJvaWQvd2Via2l0L1dlYlNldHRpbmdzJFRleHRTaXplOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTY0MDkgbmFtZSA9VGV4dFNpemUgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2Via2l0L1dlYlNldHRpbmdzOyApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC53ZWJraXQuV2ViU2V0dGluZ3MkVGV4dFNpemUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncyRUZXh0U2l6ZVtdICRWQUxVRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncyRUZXh0U2l6ZSBMQVJHRVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncyRUZXh0U2l6ZSBMQVJHRVNUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53ZWJraXQuV2ViU2V0dGluZ3MkVGV4dFNpemUgTk9STUFMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53ZWJraXQuV2ViU2V0dGluZ3MkVGV4dFNpemUgU01BTExFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzJFRleHRTaXplIFNNQUxMRVNUCi0KLSBpbnQgdmFsdWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KEkpViApCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC53ZWJraXQuV2ViU2V0dGluZ3MkVGV4dFNpemUgdmFsdWVPZigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC53ZWJraXQuV2ViU2V0dGluZ3MkVGV4dFNpemVbXSB2YWx1ZXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvd2Via2l0L1dlYlNldHRpbmdzJDE7TGFuZHJvaWQvd2Via2l0L1dlYlNldHRpbmdzJEV2ZW50SGFuZGxlcjtMYW5kcm9pZC93ZWJraXQvV2ViU2V0dGluZ3MkUmVuZGVyUHJpb3JpdHk7TGFuZHJvaWQvd2Via2l0L1dlYlNldHRpbmdzJFRleHRTaXplO0xhbmRyb2lkL3dlYmtpdC9XZWJTZXR0aW5ncyRMYXlvdXRBbGdvcml0aG07ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBBTkRST0lEX1VTRVJBR0VOVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFU0tUT1BfVVNFUkFHRU5UCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSVBIT05FX1VTRVJBR0VOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0FEX0NBQ0hFX0VMU0VfTkVUV09SSwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0FEX0NBQ0hFX09OTFkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9BRF9ERUZBVUxUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQURfTk9STUFMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQURfTk9fQ0FDSEUKLQotcHJpdmF0ZSBib29sZWFuIG1CbG9ja05ldHdvcmtJbWFnZQotCi1wcml2YXRlIGFuZHJvaWQud2Via2l0LkJyb3dzZXJGcmFtZSBtQnJvd3NlckZyYW1lCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtQ3Vyc2l2ZUZvbnRGYW1pbHkKLQotcHJpdmF0ZSBpbnQgbURlZmF1bHRGaXhlZEZvbnRTaXplCi0KLXByaXZhdGUgaW50IG1EZWZhdWx0Rm9udFNpemUKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1EZWZhdWx0VGV4dEVuY29kaW5nCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC53ZWJraXQuV2ViU2V0dGluZ3MkRXZlbnRIYW5kbGVyIG1FdmVudEhhbmRsZXIKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1GYW50YXN5Rm9udEZhbWlseQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbUZpeGVkRm9udEZhbWlseQotCi1wcml2YXRlIGJvb2xlYW4gbUphdmFTY3JpcHRDYW5PcGVuV2luZG93c0F1dG9tYXRpY2FsbHkKLQotcHJpdmF0ZSBib29sZWFuIG1KYXZhU2NyaXB0RW5hYmxlZAotCi1wcml2YXRlIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzJExheW91dEFsZ29yaXRobSBtTGF5b3V0QWxnb3JpdGhtCi0KLXByaXZhdGUgYm9vbGVhbiBtTGlnaHRUb3VjaEVuYWJsZWQKLQotcHJpdmF0ZSBib29sZWFuIG1Mb2Fkc0ltYWdlc0F1dG9tYXRpY2FsbHkKLQotcHJpdmF0ZSBpbnQgbU1pbmltdW1Gb250U2l6ZQotCi1wcml2YXRlIGludCBtTWluaW11bUxvZ2ljYWxGb250U2l6ZQotCi1wcml2YXRlIGJvb2xlYW4gbU5hdkR1bXAKLQotcHJpdmF0ZSBib29sZWFuIG1OZWVkSW5pdGlhbEZvY3VzCi0KLXByaXZhdGUgaW50IG1PdmVycmlkZUNhY2hlTW9kZQotCi1wcml2YXRlIGJvb2xlYW4gbVBsdWdpbnNFbmFibGVkCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtUGx1Z2luc1BhdGgKLQotcHJpdmF0ZSBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncyRSZW5kZXJQcmlvcml0eSBtUmVuZGVyUHJpb3JpdHkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1TYW5zU2VyaWZGb250RmFtaWx5Ci0KLXByaXZhdGUgYm9vbGVhbiBtU2F2ZUZvcm1EYXRhCi0KLXByaXZhdGUgYm9vbGVhbiBtU2F2ZVBhc3N3b3JkCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtU2VyaWZGb250RmFtaWx5Ci0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtU3RhbmRhcmRGb250RmFtaWx5Ci0KLXByaXZhdGUgYm9vbGVhbiBtU3VwcG9ydE11bHRpcGxlV2luZG93cwotCi1wcml2YXRlIGJvb2xlYW4gbVN1cHBvcnRab29tCi0KLXByaXZhdGUgYm9vbGVhbiBtU3luY1BlbmRpbmcKLQotcHJpdmF0ZSBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncyRUZXh0U2l6ZSBtVGV4dFNpemUKLQotcHJpdmF0ZSBib29sZWFuIG1Vc2VEb3VibGVUcmVlCi0KLXByaXZhdGUgYm9vbGVhbiBtVXNlV2lkZVZpZXdwb3J0Ci0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtVXNlckFnZW50Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXN0YXRpYyBhbmRyb2lkLndlYmtpdC5Ccm93c2VyRnJhbWUgYWNjZXNzJDAwMCgKLWFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMTAwKAotYW5kcm9pZC53ZWJraXQuV2ViU2V0dGluZ3MKLWludCkKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDIwMigKLWFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzCi1ib29sZWFuKQotCi1zdGF0aWMgYW5kcm9pZC53ZWJraXQuV2ViU2V0dGluZ3MkUmVuZGVyUHJpb3JpdHkgYWNjZXNzJDQwMCgKLWFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZVN5bmMoCi1pbnQpCi0KLXByaXZhdGUgaW50IHBpbigKLWludCkKLQotcHJpdmF0ZSB2b2lkIHBvc3RTeW5jKCkKLQotcHVibGljIGJvb2xlYW4gZ2V0QmxvY2tOZXR3b3JrSW1hZ2UoKQotCi1wdWJsaWMgaW50IGdldENhY2hlTW9kZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEN1cnNpdmVGb250RmFtaWx5KCkKLQotcHVibGljIGludCBnZXREZWZhdWx0Rml4ZWRGb250U2l6ZSgpCi0KLXB1YmxpYyBpbnQgZ2V0RGVmYXVsdEZvbnRTaXplKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RGVmYXVsdFRleHRFbmNvZGluZ05hbWUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRGYW50YXN5Rm9udEZhbWlseSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEZpeGVkRm9udEZhbWlseSgpCi0KLXB1YmxpYyBib29sZWFuIGdldEphdmFTY3JpcHRDYW5PcGVuV2luZG93c0F1dG9tYXRpY2FsbHkoKQotCi1wdWJsaWMgYm9vbGVhbiBnZXRKYXZhU2NyaXB0RW5hYmxlZCgpCi0KLXB1YmxpYyBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncyRMYXlvdXRBbGdvcml0aG0gZ2V0TGF5b3V0QWxnb3JpdGhtKCkKLQotcHVibGljIGJvb2xlYW4gZ2V0TGlnaHRUb3VjaEVuYWJsZWQoKQotCi1wdWJsaWMgYm9vbGVhbiBnZXRMb2Fkc0ltYWdlc0F1dG9tYXRpY2FsbHkoKQotCi1wdWJsaWMgaW50IGdldE1pbmltdW1Gb250U2l6ZSgpCi0KLXB1YmxpYyBpbnQgZ2V0TWluaW11bUxvZ2ljYWxGb250U2l6ZSgpCi0KLXB1YmxpYyBib29sZWFuIGdldE5hdkR1bXAoKQotCi0gYm9vbGVhbiBnZXROZWVkSW5pdGlhbEZvY3VzKCkKLQotcHVibGljIGJvb2xlYW4gZ2V0UGx1Z2luc0VuYWJsZWQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRQbHVnaW5zUGF0aCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFNhbnNTZXJpZkZvbnRGYW1pbHkoKQotCi1wdWJsaWMgYm9vbGVhbiBnZXRTYXZlRm9ybURhdGEoKQotCi1wdWJsaWMgYm9vbGVhbiBnZXRTYXZlUGFzc3dvcmQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTZXJpZkZvbnRGYW1pbHkoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdGFuZGFyZEZvbnRGYW1pbHkoKQotCi1wdWJsaWMgYW5kcm9pZC53ZWJraXQuV2ViU2V0dGluZ3MkVGV4dFNpemUgZ2V0VGV4dFNpemUoKQotCi1wdWJsaWMgYm9vbGVhbiBnZXRVc2VEb3VibGVUcmVlKCkKLQotcHVibGljIGJvb2xlYW4gZ2V0VXNlV2lkZVZpZXdQb3J0KCkKLQotcHVibGljIGludCBnZXRVc2VyQWdlbnQoKQotCi0gamF2YS5sYW5nLlN0cmluZyBnZXRVc2VyQWdlbnRTdHJpbmcoKQotCi1wdWJsaWMgdm9pZCBzZXRCbG9ja05ldHdvcmtJbWFnZSgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldENhY2hlTW9kZSgKLWludCkKLQotcHVibGljIHZvaWQgc2V0Q3Vyc2l2ZUZvbnRGYW1pbHkoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXREZWZhdWx0Rml4ZWRGb250U2l6ZSgKLWludCkKLQotcHVibGljIHZvaWQgc2V0RGVmYXVsdEZvbnRTaXplKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXREZWZhdWx0VGV4dEVuY29kaW5nTmFtZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHNldEZhbnRhc3lGb250RmFtaWx5KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0Rml4ZWRGb250RmFtaWx5KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0SmF2YVNjcmlwdENhbk9wZW5XaW5kb3dzQXV0b21hdGljYWxseSgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldEphdmFTY3JpcHRFbmFibGVkKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0TGF5b3V0QWxnb3JpdGhtKAotYW5kcm9pZC53ZWJraXQuV2ViU2V0dGluZ3MkTGF5b3V0QWxnb3JpdGhtKQotCi1wdWJsaWMgdm9pZCBzZXRMaWdodFRvdWNoRW5hYmxlZCgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldExvYWRzSW1hZ2VzQXV0b21hdGljYWxseSgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldE1pbmltdW1Gb250U2l6ZSgKLWludCkKLQotcHVibGljIHZvaWQgc2V0TWluaW11bUxvZ2ljYWxGb250U2l6ZSgKLWludCkKLQotcHVibGljIHZvaWQgc2V0TmF2RHVtcCgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldE5lZWRJbml0aWFsRm9jdXMoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRQbHVnaW5zRW5hYmxlZCgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldFBsdWdpbnNQYXRoKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0UmVuZGVyUHJpb3JpdHkoCi1hbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncyRSZW5kZXJQcmlvcml0eSkKLQotcHVibGljIHZvaWQgc2V0U2Fuc1NlcmlmRm9udEZhbWlseSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHNldFNhdmVGb3JtRGF0YSgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldFNhdmVQYXNzd29yZCgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldFNlcmlmRm9udEZhbWlseSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHNldFN0YW5kYXJkRm9udEZhbWlseSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHNldFN1cHBvcnRNdWx0aXBsZVdpbmRvd3MoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRTdXBwb3J0Wm9vbSgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldFRleHRTaXplKAotYW5kcm9pZC53ZWJraXQuV2ViU2V0dGluZ3MkVGV4dFNpemUpCi0KLXB1YmxpYyB2b2lkIHNldFVzZURvdWJsZVRyZWUoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRVc2VXaWRlVmlld1BvcnQoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRVc2VyQWdlbnQoCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIHN1cHBvcnRNdWx0aXBsZVdpbmRvd3MoKQotCi1wdWJsaWMgYm9vbGVhbiBzdXBwb3J0Wm9vbSgpCi0KLSB2b2lkIHN5bmNTZXR0aW5nc0FuZENyZWF0ZUhhbmRsZXIoCi1hbmRyb2lkLndlYmtpdC5Ccm93c2VyRnJhbWUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID00MTA0IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2Via2l0L1dlYlN5bmNNYW5hZ2VyOyApCi0gY2xhc3MgYW5kcm9pZC53ZWJraXQuV2ViU3luY01hbmFnZXIkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dlYmtpdC9XZWJTeW5jTWFuYWdlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPVN5bmNIYW5kbGVyICkKLSBjbGFzcyBhbmRyb2lkLndlYmtpdC5XZWJTeW5jTWFuYWdlciRTeW5jSGFuZGxlciBleHRlbmRzIGFuZHJvaWQub3MuSGFuZGxlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLndlYmtpdC5XZWJTeW5jTWFuYWdlciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53ZWJraXQuV2ViU3luY01hbmFnZXIpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQud2Via2l0LldlYlN5bmNNYW5hZ2VyCi1hbmRyb2lkLndlYmtpdC5XZWJTeW5jTWFuYWdlciQxKQotCi1wdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLSBjbGFzcyBhbmRyb2lkLndlYmtpdC5XZWJWaWV3JDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZSRPbkNhbmNlbExpc3RlbmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQud2Via2l0LldlYlZpZXcgdGhpcyQwCi0KLWZpbmFsIGFuZHJvaWQub3MuTWVzc2FnZSB2YWwkcmVzdW1lTXNnCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53ZWJraXQuV2ViVmlldwotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBvbkNhbmNlbCgKLWFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotIGNsYXNzIGFuZHJvaWQud2Via2l0LldlYlZpZXckMiBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlJE9uQ2xpY2tMaXN0ZW5lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLndlYmtpdC5XZWJWaWV3IHRoaXMkMAotCi1maW5hbCBhbmRyb2lkLm9zLk1lc3NhZ2UgdmFsJG5ldmVyUmVtZW1iZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3Ci1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIG9uQ2xpY2soCi1hbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotIGNsYXNzIGFuZHJvaWQud2Via2l0LldlYlZpZXckMyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlJE9uQ2xpY2tMaXN0ZW5lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLndlYmtpdC5XZWJWaWV3IHRoaXMkMAotCi1maW5hbCBhbmRyb2lkLm9zLk1lc3NhZ2UgdmFsJHJlbWVtYmVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53ZWJraXQuV2ViVmlldwotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBvbkNsaWNrKAotYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZQotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLSBjbGFzcyBhbmRyb2lkLndlYmtpdC5XZWJWaWV3JDQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZSRPbkNsaWNrTGlzdGVuZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC53ZWJraXQuV2ViVmlldyB0aGlzJDAKLQotZmluYWwgYW5kcm9pZC5vcy5NZXNzYWdlIHZhbCRyZXN1bWVNc2cKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3Ci1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIG9uQ2xpY2soCi1hbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotIGNsYXNzIGFuZHJvaWQud2Via2l0LldlYlZpZXckNSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmxhbmcuUnVubmFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC53ZWJraXQuV2ViVmlldyB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3KQotCi1wdWJsaWMgdm9pZCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLSBjbGFzcyBhbmRyb2lkLndlYmtpdC5XZWJWaWV3JDYgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC52aWV3LlZpZXckT25DbGlja0xpc3RlbmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQud2Via2l0LldlYlZpZXcgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53ZWJraXQuV2ViVmlldykKLQotcHVibGljIHZvaWQgb25DbGljaygKLWFuZHJvaWQudmlldy5WaWV3KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLSBjbGFzcyBhbmRyb2lkLndlYmtpdC5XZWJWaWV3JDcgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC52aWV3LlZpZXckT25DbGlja0xpc3RlbmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQud2Via2l0LldlYlZpZXcgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53ZWJraXQuV2ViVmlldykKLQotcHVibGljIHZvaWQgb25DbGljaygKLWFuZHJvaWQudmlldy5WaWV3KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLSBjbGFzcyBhbmRyb2lkLndlYmtpdC5XZWJWaWV3JDggZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC52aWV3LlZpZXckT25DbGlja0xpc3RlbmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQud2Via2l0LldlYlZpZXcgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53ZWJraXQuV2ViVmlldykKLQotcHVibGljIHZvaWQgb25DbGljaygKLWFuZHJvaWQudmlldy5WaWV3KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L1JlbGF0aXZlTGF5b3V0JExheW91dFBhcmFtczsgKQotQGFuZHJvaWQud2lkZ2V0LlJlbW90ZVZpZXdzJFJlbW90ZVZpZXcKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLndpZGdldC5SZWxhdGl2ZUxheW91dCBleHRlbmRzIGFuZHJvaWQudmlldy5WaWV3R3JvdXAKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJPVkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUxJR05fQkFTRUxJTkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUxJR05fQk9UVE9NCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFMSUdOX0xFRlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUxJR05fUEFSRU5UX0JPVFRPTQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTElHTl9QQVJFTlRfTEVGVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTElHTl9QQVJFTlRfUklHSFQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUxJR05fUEFSRU5UX1RPUAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTElHTl9SSUdIVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTElHTl9UT1AKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkVMT1cKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0VOVEVSX0hPUklaT05UQUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0VOVEVSX0lOX1BBUkVOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDRU5URVJfVkVSVElDQUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVGVF9PRgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUdIVF9PRgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUUlVFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWRVJCX0NPVU5UCi0KLXByaXZhdGUgYW5kcm9pZC52aWV3LlZpZXcgbUJhc2VsaW5lVmlldwotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUmVjdCBtQ29udGVudEJvdW5kcwotCi1wcml2YXRlIGludCBtR3Jhdml0eQotCi1wcml2YXRlIGJvb2xlYW4gbUhhc0Jhc2VsaW5lQWxpZ25lZENoaWxkCi0KLXByaXZhdGUgaW50IG1JZ25vcmVHcmF2aXR5Ci0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5SZWN0IG1TZWxmQm91bmRzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldAotaW50KQotCi1wcml2YXRlIHZvaWQgYWxpZ25CYXNlbGluZSgKLWFuZHJvaWQudmlldy5WaWV3Ci1hbmRyb2lkLndpZGdldC5SZWxhdGl2ZUxheW91dCRMYXlvdXRQYXJhbXMpCi0KLXByaXZhdGUgdm9pZCBhcHBseVNpemVSdWxlcygKLWFuZHJvaWQud2lkZ2V0LlJlbGF0aXZlTGF5b3V0JExheW91dFBhcmFtcwotaW50Ci1pbnQpCi0KLXByaXZhdGUgdm9pZCBjZW50ZXJIb3Jpem9udGFsKAotYW5kcm9pZC52aWV3LlZpZXcKLWFuZHJvaWQud2lkZ2V0LlJlbGF0aXZlTGF5b3V0JExheW91dFBhcmFtcwotaW50KQotCi1wcml2YXRlIHZvaWQgY2VudGVyVmVydGljYWwoCi1hbmRyb2lkLnZpZXcuVmlldwotYW5kcm9pZC53aWRnZXQuUmVsYXRpdmVMYXlvdXQkTGF5b3V0UGFyYW1zCi1pbnQpCi0KLXByaXZhdGUgaW50IGdldENoaWxkTWVhc3VyZVNwZWMoCi1pbnQKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludCkKLQotcHJpdmF0ZSBhbmRyb2lkLnZpZXcuVmlldyBnZXRSZWxhdGVkVmlldygKLWludFtdCi1pbnQpCi0KLXByaXZhdGUgaW50IGdldFJlbGF0ZWRWaWV3QmFzZWxpbmUoCi1pbnRbXQotaW50KQotCi1wcml2YXRlIGFuZHJvaWQud2lkZ2V0LlJlbGF0aXZlTGF5b3V0JExheW91dFBhcmFtcyBnZXRSZWxhdGVkVmlld1BhcmFtcygKLWludFtdCi1pbnQpCi0KLXByaXZhdGUgdm9pZCBpbml0RnJvbUF0dHJpYnV0ZXMoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHJpdmF0ZSB2b2lkIG1lYXN1cmVDaGlsZCgKLWFuZHJvaWQudmlldy5WaWV3Ci1hbmRyb2lkLndpZGdldC5SZWxhdGl2ZUxheW91dCRMYXlvdXRQYXJhbXMKLWludAotaW50KQotCi1wcml2YXRlIHZvaWQgcG9zaXRpb25DaGlsZCgKLWFuZHJvaWQudmlldy5WaWV3Ci1hbmRyb2lkLndpZGdldC5SZWxhdGl2ZUxheW91dCRMYXlvdXRQYXJhbXMKLWludAotaW50KQotCi1wcm90ZWN0ZWQgYm9vbGVhbiBjaGVja0xheW91dFBhcmFtcygKLWFuZHJvaWQudmlldy5WaWV3R3JvdXAkTGF5b3V0UGFyYW1zKQotCi1wcm90ZWN0ZWQgYW5kcm9pZC52aWV3LlZpZXdHcm91cCRMYXlvdXRQYXJhbXMgZ2VuZXJhdGVEZWZhdWx0TGF5b3V0UGFyYW1zKCkKLQotcHVibGljIHZvbGF0aWxlIGFuZHJvaWQudmlldy5WaWV3R3JvdXAkTGF5b3V0UGFyYW1zIGdlbmVyYXRlTGF5b3V0UGFyYW1zKAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHJvdGVjdGVkIGFuZHJvaWQudmlldy5WaWV3R3JvdXAkTGF5b3V0UGFyYW1zIGdlbmVyYXRlTGF5b3V0UGFyYW1zKAotYW5kcm9pZC52aWV3LlZpZXdHcm91cCRMYXlvdXRQYXJhbXMpCi0KLXB1YmxpYyBhbmRyb2lkLndpZGdldC5SZWxhdGl2ZUxheW91dCRMYXlvdXRQYXJhbXMgZ2VuZXJhdGVMYXlvdXRQYXJhbXMoCi1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0KQotCi1wdWJsaWMgaW50IGdldEJhc2VsaW5lKCkKLQotcHJvdGVjdGVkIHZvaWQgb25MYXlvdXQoCi1ib29sZWFuCi1pbnQKLWludAotaW50Ci1pbnQpCi0KLXByb3RlY3RlZCB2b2lkIG9uTWVhc3VyZSgKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRHcmF2aXR5KAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRIb3Jpem9udGFsR3Jhdml0eSgKLWludCkKLQotcHVibGljIHZvaWQgc2V0SWdub3JlR3Jhdml0eSgKLWludCkKLQotcHVibGljIHZvaWQgc2V0VmVydGljYWxHcmF2aXR5KAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MiBuYW1lID1FeHRlbmRlZFpvb21Db250cm9scyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93ZWJraXQvV2ViVmlldzsgKQotIGNsYXNzIGFuZHJvaWQud2Via2l0LldlYlZpZXckRXh0ZW5kZWRab29tQ29udHJvbHMgZXh0ZW5kcyBhbmRyb2lkLndpZGdldC5SZWxhdGl2ZUxheW91dAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gYW5kcm9pZC53aWRnZXQuWm9vbUNvbnRyb2xzIG1ab29tQ29udHJvbHMKLQotIGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldyBtWm9vbU1hZ25pZnkKLQotZmluYWwgYW5kcm9pZC53ZWJraXQuV2ViVmlldyB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3Ci1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHJpdmF0ZSB2b2lkIGZhZGUoCi1pbnQKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIGJvb2xlYW4gaGFzRm9jdXMoKQotCi1wdWJsaWMgdm9pZCBoaWRlKCkKLQotcHVibGljIHZvaWQgc2V0SXNab29tTWFnbmlmeUVuYWJsZWQoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRPblpvb21JbkNsaWNrTGlzdGVuZXIoCi1hbmRyb2lkLnZpZXcuVmlldyRPbkNsaWNrTGlzdGVuZXIpCi0KLXB1YmxpYyB2b2lkIHNldE9uWm9vbU1hZ25pZnlDbGlja0xpc3RlbmVyKAotYW5kcm9pZC52aWV3LlZpZXckT25DbGlja0xpc3RlbmVyKQotCi1wdWJsaWMgdm9pZCBzZXRPblpvb21PdXRDbGlja0xpc3RlbmVyKAotYW5kcm9pZC52aWV3LlZpZXckT25DbGlja0xpc3RlbmVyKQotCi1wdWJsaWMgdm9pZCBzaG93KAotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93ZWJraXQvV2ViVmlldzsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPUZvY3VzTm9kZSApCi0gY2xhc3MgYW5kcm9pZC53ZWJraXQuV2ViVmlldyRGb2N1c05vZGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLlJlY3QgbUJvdW5kcwotCi1wdWJsaWMgaW50IG1GcmFtZVBvaW50ZXIKLQotcHVibGljIGJvb2xlYW4gbUlzQW5jaG9yCi0KLXB1YmxpYyBib29sZWFuIG1Jc1Bhc3N3b3JkCi0KLXB1YmxpYyBib29sZWFuIG1Jc1J0bFRleHQKLQotcHVibGljIGJvb2xlYW4gbUlzVGV4dEFyZWEKLQotcHVibGljIGJvb2xlYW4gbUlzVGV4dEZpZWxkCi0KLXB1YmxpYyBpbnQgbU1heExlbmd0aAotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBtTmFtZQotCi1wdWJsaWMgaW50IG1Ob2RlUG9pbnRlcgotCi1wdWJsaWMgaW50IG1Sb290VGV4dEdlbmVyYXRpb24KLQotcHVibGljIGludCBtU2VsZWN0aW9uRW5kCi0KLXB1YmxpYyBpbnQgbVNlbGVjdGlvblN0YXJ0Ci0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIG1UZXh0Ci0KLXB1YmxpYyBpbnQgbVRleHRTaXplCi0KLWZpbmFsIGFuZHJvaWQud2Via2l0LldlYlZpZXcgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53ZWJraXQuV2ViVmlldykKLQotcHJpdmF0ZSB2b2lkIHNldEFsbCgKLWJvb2xlYW4KLWJvb2xlYW4KLWJvb2xlYW4KLWJvb2xlYW4KLWJvb2xlYW4KLWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2Via2l0L1dlYlZpZXc7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MSBuYW1lID1IaXRUZXN0UmVzdWx0ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLndlYmtpdC5XZWJWaWV3JEhpdFRlc3RSZXN1bHQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFOQ0hPUl9UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVESVRfVEVYVF9UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVNQUlMX1RZUEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0VPX1RZUEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU1BR0VfQU5DSE9SX1RZUEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU1BR0VfVFlQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQSE9ORV9UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNSQ19BTkNIT1JfVFlQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUkNfSU1BR0VfQU5DSE9SX1RZUEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5LTk9XTl9UWVBFCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtRXh0cmEKLQotcHJpdmF0ZSBpbnQgbVR5cGUKLQotZmluYWwgYW5kcm9pZC53ZWJraXQuV2ViVmlldyB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3KQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMDAwKAotYW5kcm9pZC53ZWJraXQuV2ViVmlldyRIaXRUZXN0UmVzdWx0Ci1pbnQpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQxMDAoCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3JEhpdFRlc3RSZXN1bHQKLWphdmEubGFuZy5TdHJpbmcpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDIwMCgKLWFuZHJvaWQud2Via2l0LldlYlZpZXckSGl0VGVzdFJlc3VsdCkKLQotcHJpdmF0ZSB2b2lkIHNldEV4dHJhKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSB2b2lkIHNldFR5cGUoCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEV4dHJhKCkKLQotcHVibGljIGludCBnZXRUeXBlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi0gY2xhc3MgYW5kcm9pZC53ZWJraXQuV2ViVmlldyRJbnZva2VMaXN0Qm94JDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZSRPbkNsaWNrTGlzdGVuZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC53ZWJraXQuV2ViVmlldyRJbnZva2VMaXN0Qm94IHRoaXMkMQotCi1maW5hbCBhbmRyb2lkLndlYmtpdC5XZWJWaWV3JEludm9rZUxpc3RCb3gkTXlBcnJheUxpc3RBZGFwdGVyIHZhbCRhZGFwdGVyCi0KLWZpbmFsIGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3IHZhbCRsaXN0VmlldwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQud2Via2l0LldlYlZpZXckSW52b2tlTGlzdEJveAotYW5kcm9pZC53ZWJraXQuV2ViVmlldyRJbnZva2VMaXN0Qm94JE15QXJyYXlMaXN0QWRhcHRlcgotYW5kcm9pZC53aWRnZXQuTGlzdFZpZXcpCi0KLXB1YmxpYyB2b2lkIG9uQ2xpY2soCi1hbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotIGNsYXNzIGFuZHJvaWQud2Via2l0LldlYlZpZXckSW52b2tlTGlzdEJveCQyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3JE9uSXRlbUNsaWNrTGlzdGVuZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC53ZWJraXQuV2ViVmlldyRJbnZva2VMaXN0Qm94IHRoaXMkMQotCi1maW5hbCBhbmRyb2lkLmFwcC5BbGVydERpYWxvZyB2YWwkZGlhbG9nCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53ZWJraXQuV2ViVmlldyRJbnZva2VMaXN0Qm94Ci1hbmRyb2lkLmFwcC5BbGVydERpYWxvZykKLQotcHVibGljIHZvaWQgb25JdGVtQ2xpY2soCi1hbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldwotYW5kcm9pZC52aWV3LlZpZXcKLWludAotbG9uZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTIgbmFtZSA9Q29udGFpbmVyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dlYmtpdC9XZWJWaWV3JEludm9rZUxpc3RCb3g7ICkKLSBjbGFzcyBhbmRyb2lkLndlYmtpdC5XZWJWaWV3JEludm9rZUxpc3RCb3gkQ29udGFpbmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gYm9vbGVhbiBtRW5hYmxlZAotCi0gaW50IG1JZAotCi0gamF2YS5sYW5nLlN0cmluZyBtU3RyaW5nCi0KLWZpbmFsIGFuZHJvaWQud2Via2l0LldlYlZpZXckSW52b2tlTGlzdEJveCB0aGlzJDEKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53ZWJraXQuV2ViVmlldyRJbnZva2VMaXN0Qm94KQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3JEludm9rZUxpc3RCb3gKLWFuZHJvaWQud2Via2l0LldlYlZpZXckMSkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+TGFuZHJvaWQvd2lkZ2V0L0Jhc2VBZGFwdGVyO0xhbmRyb2lkL3dpZGdldC9GaWx0ZXJhYmxlOyApCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9BcnJheUFkYXB0ZXIkMTtMYW5kcm9pZC93aWRnZXQvQXJyYXlBZGFwdGVyJEFycmF5RmlsdGVyOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyIGV4dGVuZHMgYW5kcm9pZC53aWRnZXQuQmFzZUFkYXB0ZXIgaW1wbGVtZW50cyBhbmRyb2lkLndpZGdldC5GaWx0ZXJhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgbUNvbnRleHQKLQotcHJpdmF0ZSBpbnQgbURyb3BEb3duUmVzb3VyY2UKLQotcHJpdmF0ZSBpbnQgbUZpZWxkSWQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvQXJyYXlBZGFwdGVyPFRUOz4uQXJyYXlGaWx0ZXI7ICkKLXByaXZhdGUgYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyJEFycmF5RmlsdGVyIG1GaWx0ZXIKLQotcHJpdmF0ZSBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXIgbUluZmxhdGVyCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLk9iamVjdCBtTG9jawotCi1wcml2YXRlIGJvb2xlYW4gbU5vdGlmeU9uQ2hhbmdlCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9MaXN0PFRUOz47ICkKLXByaXZhdGUgamF2YS51dGlsLkxpc3QgbU9iamVjdHMKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0FycmF5TGlzdDxUVDs+OyApCi1wcml2YXRlIGphdmEudXRpbC5BcnJheUxpc3QgbU9yaWdpbmFsVmFsdWVzCi0KLXByaXZhdGUgaW50IG1SZXNvdXJjZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGFuZHJvaWQvY29udGVudC9Db250ZXh0O0lJTGphdmEvdXRpbC9MaXN0PFRUOz47KVYgKQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWludAotaW50Ci1qYXZhLnV0aWwuTGlzdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGFuZHJvaWQvY29udGVudC9Db250ZXh0O0lJW1RUOylWICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1pbnQKLWludAotamF2YS5sYW5nLk9iamVjdFtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMYW5kcm9pZC9jb250ZW50L0NvbnRleHQ7SUxqYXZhL3V0aWwvTGlzdDxUVDs+OylWICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1pbnQKLWphdmEudXRpbC5MaXN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMYW5kcm9pZC9jb250ZW50L0NvbnRleHQ7SVtUVDspViApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotaW50Ci1qYXZhLmxhbmcuT2JqZWN0W10pCi0KLXN0YXRpYyBqYXZhLnV0aWwuQXJyYXlMaXN0IGFjY2VzcyQxMDAoCi1hbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXIpCi0KLXN0YXRpYyBqYXZhLnV0aWwuQXJyYXlMaXN0IGFjY2VzcyQxMDIoCi1hbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXIKLWphdmEudXRpbC5BcnJheUxpc3QpCi0KLXN0YXRpYyBqYXZhLmxhbmcuT2JqZWN0IGFjY2VzcyQyMDAoCi1hbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXIpCi0KLXN0YXRpYyBqYXZhLnV0aWwuTGlzdCBhY2Nlc3MkMzAwKAotYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyKQotCi1zdGF0aWMgamF2YS51dGlsLkxpc3QgYWNjZXNzJDMwMigKLWFuZHJvaWQud2lkZ2V0LkFycmF5QWRhcHRlcgotamF2YS51dGlsLkxpc3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExhbmRyb2lkL2NvbnRlbnQvQ29udGV4dDtJSSlMYW5kcm9pZC93aWRnZXQvQXJyYXlBZGFwdGVyPExqYXZhL2xhbmcvQ2hhclNlcXVlbmNlOz47ICkKLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyIGNyZWF0ZUZyb21SZXNvdXJjZSgKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1pbnQKLWludCkKLQotcHJpdmF0ZSBhbmRyb2lkLnZpZXcuVmlldyBjcmVhdGVWaWV3RnJvbVJlc291cmNlKAotaW50Ci1hbmRyb2lkLnZpZXcuVmlldwotYW5kcm9pZC52aWV3LlZpZXdHcm91cAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMYW5kcm9pZC9jb250ZW50L0NvbnRleHQ7SUlMamF2YS91dGlsL0xpc3Q8VFQ7PjspViApCi1wcml2YXRlIHZvaWQgaW5pdCgKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1pbnQKLWludAotamF2YS51dGlsLkxpc3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRUOylWICkKLXB1YmxpYyB2b2lkIGFkZCgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2lkIGNsZWFyKCkKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5Db250ZXh0IGdldENvbnRleHQoKQotCi1wdWJsaWMgaW50IGdldENvdW50KCkKLQotcHVibGljIGFuZHJvaWQudmlldy5WaWV3IGdldERyb3BEb3duVmlldygKLWludAotYW5kcm9pZC52aWV3LlZpZXcKLWFuZHJvaWQudmlldy5WaWV3R3JvdXApCi0KLXB1YmxpYyBhbmRyb2lkLndpZGdldC5GaWx0ZXIgZ2V0RmlsdGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSSlUVDsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0SXRlbSgKLWludCkKLQotcHVibGljIGxvbmcgZ2V0SXRlbUlkKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUVDspSSApCi1wdWJsaWMgaW50IGdldFBvc2l0aW9uKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGFuZHJvaWQudmlldy5WaWV3IGdldFZpZXcoCi1pbnQKLWFuZHJvaWQudmlldy5WaWV3Ci1hbmRyb2lkLnZpZXcuVmlld0dyb3VwKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUVDtJKVYgKQotcHVibGljIHZvaWQgaW5zZXJ0KAotamF2YS5sYW5nLk9iamVjdAotaW50KQotCi1wdWJsaWMgdm9pZCBub3RpZnlEYXRhU2V0Q2hhbmdlZCgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRUOylWICkKLXB1YmxpYyB2b2lkIHJlbW92ZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2lkIHNldERyb3BEb3duVmlld1Jlc291cmNlKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXROb3RpZnlPbkNoYW5nZSgKLWJvb2xlYW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPU15QXJyYXlMaXN0QWRhcHRlciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93ZWJraXQvV2ViVmlldyRJbnZva2VMaXN0Qm94OyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L0FycmF5QWRhcHRlcjxMYW5kcm9pZC93ZWJraXQvV2ViVmlldyRJbnZva2VMaXN0Qm94JENvbnRhaW5lcjs+OyApCi0gY2xhc3MgYW5kcm9pZC53ZWJraXQuV2ViVmlldyRJbnZva2VMaXN0Qm94JE15QXJyYXlMaXN0QWRhcHRlciBleHRlbmRzIGFuZHJvaWQud2lkZ2V0LkFycmF5QWRhcHRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLndlYmtpdC5XZWJWaWV3JEludm9rZUxpc3RCb3ggdGhpcyQxCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53ZWJraXQuV2ViVmlldyRJbnZva2VMaXN0Qm94Ci1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC53ZWJraXQuV2ViVmlldyRJbnZva2VMaXN0Qm94JENvbnRhaW5lcltdCi1ib29sZWFuKQotCi1wcml2YXRlIGFuZHJvaWQud2Via2l0LldlYlZpZXckSW52b2tlTGlzdEJveCRDb250YWluZXIgaXRlbSgKLWludCkKLQotcHVibGljIGJvb2xlYW4gYXJlQWxsSXRlbXNFbmFibGVkKCkKLQotcHVibGljIGxvbmcgZ2V0SXRlbUlkKAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBoYXNTdGFibGVJZHMoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPUludm9rZUxpc3RCb3ggKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2Via2l0L1dlYlZpZXc7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvd2Via2l0L1dlYlZpZXckSW52b2tlTGlzdEJveCRNeUFycmF5TGlzdEFkYXB0ZXI7TGFuZHJvaWQvd2Via2l0L1dlYlZpZXckSW52b2tlTGlzdEJveCRDb250YWluZXI7ICkKLSBjbGFzcyBhbmRyb2lkLndlYmtpdC5XZWJWaWV3JEludm9rZUxpc3RCb3ggZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5sYW5nLlJ1bm5hYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZ1tdIG1BcnJheQotCi1wcml2YXRlIGFuZHJvaWQud2Via2l0LldlYlZpZXckSW52b2tlTGlzdEJveCRDb250YWluZXJbXSBtQ29udGFpbmVycwotCi1wcml2YXRlIGJvb2xlYW5bXSBtRW5hYmxlQXJyYXkKLQotcHJpdmF0ZSBib29sZWFuIG1NdWx0aXBsZQotCi1wcml2YXRlIGludFtdIG1TZWxlY3RlZEFycmF5Ci0KLXByaXZhdGUgaW50IG1TZWxlY3Rpb24KLQotZmluYWwgYW5kcm9pZC53ZWJraXQuV2ViVmlldyB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53ZWJraXQuV2ViVmlldwotamF2YS5sYW5nLlN0cmluZ1tdCi1ib29sZWFuW10KLWludCkKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53ZWJraXQuV2ViVmlldwotamF2YS5sYW5nLlN0cmluZ1tdCi1ib29sZWFuW10KLWludAotYW5kcm9pZC53ZWJraXQuV2ViVmlldyQxKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53ZWJraXQuV2ViVmlldwotamF2YS5sYW5nLlN0cmluZ1tdCi1ib29sZWFuW10KLWludFtdKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3Ci1qYXZhLmxhbmcuU3RyaW5nW10KLWJvb2xlYW5bXQotaW50W10KLWFuZHJvaWQud2Via2l0LldlYlZpZXckMSkKLQotcHVibGljIHZvaWQgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93ZWJraXQvV2ViVmlldzsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPVBpY3R1cmVMaXN0ZW5lciApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQud2Via2l0LldlYlZpZXckUGljdHVyZUxpc3RlbmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uTmV3UGljdHVyZSgKLWFuZHJvaWQud2Via2l0LldlYlZpZXcKLWFuZHJvaWQuZ3JhcGhpY3MuUGljdHVyZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93ZWJraXQvV2ViVmlldzsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPVByaXZhdGVIYW5kbGVyICkKLSBjbGFzcyBhbmRyb2lkLndlYmtpdC5XZWJWaWV3JFByaXZhdGVIYW5kbGVyIGV4dGVuZHMgYW5kcm9pZC5vcy5IYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQud2Via2l0LldlYlZpZXcgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53ZWJraXQuV2ViVmlldykKLQotcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZSgKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93ZWJraXQvV2ViVmlldzsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPVVwZGF0ZVRleHRFbnRyeUFkYXB0ZXIgKQotIGNsYXNzIGFuZHJvaWQud2Via2l0LldlYlZpZXckVXBkYXRlVGV4dEVudHJ5QWRhcHRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmxhbmcuUnVubmFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1OYW1lCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5NZXNzYWdlIG1VcGRhdGVNZXNzYWdlCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtVXJsCi0KLWZpbmFsIGFuZHJvaWQud2Via2l0LldlYlZpZXcgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53ZWJraXQuV2ViVmlldwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MSBuYW1lID1XZWJWaWV3VHJhbnNwb3J0ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dlYmtpdC9XZWJWaWV3OyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC53ZWJraXQuV2ViVmlldyRXZWJWaWV3VHJhbnNwb3J0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGFuZHJvaWQud2Via2l0LldlYlZpZXcgbVdlYnZpZXcKLQotZmluYWwgYW5kcm9pZC53ZWJraXQuV2ViVmlldyB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3KQotCi1wdWJsaWMgYW5kcm9pZC53ZWJraXQuV2ViVmlldyBnZXRXZWJWaWV3KCkKLQotcHVibGljIHZvaWQgc2V0V2ViVmlldygKLWFuZHJvaWQud2Via2l0LldlYlZpZXcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvQWJzb2x1dGVMYXlvdXQkTGF5b3V0UGFyYW1zOyApCi1AYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MkUmVtb3RlVmlldwotcHVibGljIGNsYXNzIGFuZHJvaWQud2lkZ2V0LkFic29sdXRlTGF5b3V0IGV4dGVuZHMgYW5kcm9pZC52aWV3LlZpZXdHcm91cAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQKLWludCkKLQotcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tMYXlvdXRQYXJhbXMoCi1hbmRyb2lkLnZpZXcuVmlld0dyb3VwJExheW91dFBhcmFtcykKLQotcHJvdGVjdGVkIGFuZHJvaWQudmlldy5WaWV3R3JvdXAkTGF5b3V0UGFyYW1zIGdlbmVyYXRlRGVmYXVsdExheW91dFBhcmFtcygpCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuVmlld0dyb3VwJExheW91dFBhcmFtcyBnZW5lcmF0ZUxheW91dFBhcmFtcygKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi0KLXByb3RlY3RlZCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwJExheW91dFBhcmFtcyBnZW5lcmF0ZUxheW91dFBhcmFtcygKLWFuZHJvaWQudmlldy5WaWV3R3JvdXAkTGF5b3V0UGFyYW1zKQotCi1wcm90ZWN0ZWQgdm9pZCBvbkxheW91dCgKLWJvb2xlYW4KLWludAotaW50Ci1pbnQKLWludCkKLQotcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKAotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC93ZWJraXQvV2ViVmlldyRJbnZva2VMaXN0Qm94O0xhbmRyb2lkL3dlYmtpdC9XZWJWaWV3JFByaXZhdGVIYW5kbGVyO0xhbmRyb2lkL3dlYmtpdC9XZWJWaWV3JFVwZGF0ZVRleHRFbnRyeUFkYXB0ZXI7TGFuZHJvaWQvd2Via2l0L1dlYlZpZXckRm9jdXNOb2RlO0xhbmRyb2lkL3dlYmtpdC9XZWJWaWV3JEhpdFRlc3RSZXN1bHQ7TGFuZHJvaWQvd2Via2l0L1dlYlZpZXckUGljdHVyZUxpc3RlbmVyO0xhbmRyb2lkL3dlYmtpdC9XZWJWaWV3JFdlYlZpZXdUcmFuc3BvcnQ7TGFuZHJvaWQvd2Via2l0L1dlYlZpZXckRXh0ZW5kZWRab29tQ29udHJvbHM7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLndlYmtpdC5XZWJWaWV3IGV4dGVuZHMgYW5kcm9pZC53aWRnZXQuQWJzb2x1dGVMYXlvdXQgaW1wbGVtZW50cyBhbmRyb2lkLnZpZXcuVmlld1RyZWVPYnNlcnZlciRPbkdsb2JhbEZvY3VzQ2hhbmdlTGlzdGVuZXIsIGFuZHJvaWQudmlldy5WaWV3R3JvdXAkT25IaWVyYXJjaHlDaGFuZ2VMaXN0ZW5lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBERUZBVUxUX01BWF9aT09NX1NDQUxFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IERFRkFVTFRfTUlOX1pPT01fU0NBTEUKLQotc3RhdGljIGZpbmFsIGludCBESURfRklSU1RfTEFZT1VUX01TR19JRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRE9VQkxFX1RBUF9USU1FT1VUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gRU5BQkxFX0NPUFlfUEFTVEUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZJUlNUX1NDUk9MTF9aT09NCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMQVNUX1NDUk9MTF9aT09NCi0KLXN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIExPR1RBRwotCi1zdGF0aWMgZmluYWwgYm9vbGVhbiBMT0dWX0VOQUJMRUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExPTkdfUFJFU1NfVElNRU9VVAotCi1zdGF0aWMgZmluYWwgaW50IExPTkdfUFJFU1NfVFJBQ0tCQUxMCi0KLXN0YXRpYyBmaW5hbCBpbnQgTUFSS19OT0RFX0lOVkFMSURfSUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9EVVJBVElPTgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBNQVhfU0xPUEVfRk9SX0RJQUcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1JTl9CUkVBS19TTkFQX0NST1NTX0RJU1RBTkNFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNSU5fRkxJTkdfVElNRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUlOX0xPQ0tfU05BUF9SRVZFUlNFX0RJU1RBTkNFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBORVZFUl9SRU1FTUJFUl9QQVNTV09SRAotCi1zdGF0aWMgZmluYWwgaW50IE5FV19QSUNUVVJFX01TR19JRAotCi1zdGF0aWMgZmluYWwgaW50IE5PVElGWV9GT0NVU19TRVRfTVNHX0lECi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQQUdFX1NDUk9MTF9PVkVSTEFQCi0KLXN0YXRpYyBmaW5hbCBpbnQgUkVDT01QVVRFX0ZPQ1VTX01TR19JRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVMRUFTRV9TSU5HTEVfVEFQCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRU1FTUJFUl9QQVNTV09SRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVTVU1FX1dFQkNPUkVfVVBEQVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTQ0hFTUVfR0VPCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTQ0hFTUVfTUFJTFRPCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTQ0hFTUVfVEVMCi0KLXN0YXRpYyBmaW5hbCBpbnQgU0NST0xMX0JZX01TR19JRAotCi1zdGF0aWMgZmluYWwgaW50IFNDUk9MTF9UT19NU0dfSUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNDUk9MTF9aT09NX0FOSU1BVElPTl9JTgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0NST0xMX1pPT01fQU5JTUFUSU9OX09VVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0NST0xMX1pPT01fRFVSQVRJT04KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNDUk9MTF9aT09NX0ZJTkdFUl9CVUZGRVIKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNDUk9MTF9aT09NX0dSSUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNDUk9MTF9aT09NX09VVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VMRUNUX0NVUlNPUl9PRkZTRVQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBTRVRfS0lUX0ZPQ1VTX0RFTEFZCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTTkFQX05PTkUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNOQVBfWAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU05BUF9YX0xPQ0sKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNOQVBfWQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU05BUF9ZX0xPQ0sKLQotc3RhdGljIGZpbmFsIGludCBTUEFXTl9TQ1JPTExfVE9fTVNHX0lECi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVERfU1BFRUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNXSVRDSF9UT19FTlRFUgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1dJVENIX1RPX0xPTkdQUkVTUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1dJVENIX1RPX1NIT1JUUFJFU1MKLQotc3RhdGljIGZpbmFsIGludCBTWU5DX1NDUk9MTF9UT19NU0dfSUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRBUF9USU1FT1VUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT1VDSF9ET05FX01PREUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPVUNIX0RPVUJMRUNMSUNLX01PREUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPVUNIX0RSQUdfTU9ERQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVE9VQ0hfRFJBR19TVEFSVF9NT0RFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT1VDSF9JTklUX01PREUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPVUNIX1NIT1JUUFJFU1NfTU9ERQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVE9VQ0hfU0hPUlRQUkVTU19TVEFSVF9NT0RFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT1VDSF9TTE9QX1NRVUFSRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFJBQ0tCQUxMX0tFWV9USU1FT1VUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUUkFDS0JBTExfTVVMVElQTElFUgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFJBQ0tCQUxMX1NDQUxFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUUkFDS0JBTExfU0NST0xMX0NPVU5UCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUUkFDS0JBTExfVElNRU9VVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFJBQ0tCQUxMX1dBSVQKLQotc3RhdGljIGZpbmFsIGludCBVUERBVEVfQ0xJUEJPQVJECi0KLXN0YXRpYyBmaW5hbCBpbnQgVVBEQVRFX1RFWFRGSUVMRF9URVhUX01TR19JRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVVBEQVRFX1RFWFRfRU5UUllfQURBUFRFUgotCi1zdGF0aWMgZmluYWwgaW50IFVQREFURV9URVhUX0VOVFJZX01TR19JRAotCi1zdGF0aWMgZmluYWwgaW50IFdFQkNPUkVfSU5JVElBTElaRURfTVNHX0lECi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaT09NX0FOSU1BVElPTl9MRU5HVEgKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBaT09NX0NPTlRST0xTX1RJTUVPVVQKLQotc3RhdGljIGZpbmFsIGludCBaT09NX09VVF9XSURUSAotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLndlYmtpdC5QbHVnaW5MaXN0IHNQbHVnaW5MaXN0Ci0KLXByaXZhdGUgZmxvYXQgbUFjdHVhbFNjYWxlCi0KLXByaXZhdGUgYm9vbGVhbiBtQWx0SXNQcmVzc2VkCi0KLXByaXZhdGUgaW50IG1CYWNrZ3JvdW5kQ29sb3IKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLndlYmtpdC5DYWxsYmFja1Byb3h5IG1DYWxsYmFja1Byb3h5Ci0KLXByaXZhdGUgYW5kcm9pZC5uZXQuaHR0cC5Tc2xDZXJ0aWZpY2F0ZSBtQ2VydGlmaWNhdGUKLQotcHJpdmF0ZSBpbnQgbUNvbnRlbnRIZWlnaHQKLQotcHJpdmF0ZSBpbnQgbUNvbnRlbnRXaWR0aAotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQud2Via2l0LldlYlZpZXdEYXRhYmFzZSBtRGF0YWJhc2UKLQotcHJpdmF0ZSBsb25nIG1Eb3duVGltZQotCi1wcml2YXRlIGJvb2xlYW4gbURyYXdGb2N1c1JpbmcKLQotcHJpdmF0ZSBib29sZWFuIG1EcmF3SGlzdG9yeQotCi1wcml2YXRlIGJvb2xlYW4gbUV4dGVuZFNlbGVjdGlvbgotCi1wcml2YXRlIGFuZHJvaWQud2Via2l0LldlYlZpZXdDb3JlJEZvY3VzRGF0YSBtRm9jdXNEYXRhCi0KLXByaXZhdGUgYW5kcm9pZC53ZWJraXQuV2ViVmlldyRGb2N1c05vZGUgbUZvY3VzTm9kZQotCi1wcml2YXRlIGJvb2xlYW4gbUdsb2JhbEZvY3VzQ2hhbmdlTGlzdGVuZXJBZGRlZAotCi1wcml2YXRlIGJvb2xlYW4gbUdvdERvd24KLQotcHJpdmF0ZSBib29sZWFuIG1Hb3RLZXlEb3duCi0KLSBib29sZWFuIG1IZWlnaHRDYW5NZWFzdXJlCi0KLXByaXZhdGUgaW50IG1IaXN0b3J5SGVpZ2h0Ci0KLXByaXZhdGUgYW5kcm9pZC5ncmFwaGljcy5QaWN0dXJlIG1IaXN0b3J5UGljdHVyZQotCi1wcml2YXRlIGludCBtSGlzdG9yeVdpZHRoCi0KLXByaXZhdGUgaW50IG1Jbml0aWFsU2NhbGUKLQotcHJpdmF0ZSBmbG9hdCBtSW52QWN0dWFsU2NhbGUKLQotcHJpdmF0ZSBmbG9hdCBtSW52RmluYWxab29tU2NhbGUKLQotcHJpdmF0ZSBmbG9hdCBtSW52SW5pdGlhbFpvb21TY2FsZQotCi1wcml2YXRlIGFuZHJvaWQuZ3JhcGhpY3MuUmVjdCBtTGFzdEZvY3VzQm91bmRzCi0KLXByaXZhdGUgbG9uZyBtTGFzdEZvY3VzVGltZQotCi0gaW50IG1MYXN0SGVpZ2h0U2VudAotCi1wcml2YXRlIGludCBtTGFzdFNjcm9sbFgKLQotcHJpdmF0ZSBpbnQgbUxhc3RTY3JvbGxZCi0KLXByaXZhdGUgbG9uZyBtTGFzdFRvdWNoVGltZQotCi1wcml2YXRlIGZsb2F0IG1MYXN0VG91Y2hYCi0KLXByaXZhdGUgZmxvYXQgbUxhc3RUb3VjaFkKLQotcHJpdmF0ZSBhbmRyb2lkLmdyYXBoaWNzLlJlY3QgbUxhc3RWaXNpYmxlUmVjdFNlbnQKLQotIGludCBtTGFzdFdpZHRoU2VudAotCi1wcml2YXRlIGZsb2F0IG1MYXN0Wm9vbVNjcm9sbFJhd1gKLQotcHJpdmF0ZSBmbG9hdCBtTGFzdFpvb21TY3JvbGxSYXdZCi0KLXByaXZhdGUgYm9vbGVhbiBtTWFwVHJhY2tiYWxsVG9BcnJvd0tleXMKLQotcHJpdmF0ZSBmbG9hdCBtTWF4Wm9vbVNjYWxlCi0KLXByaXZhdGUgZmxvYXQgbU1pblpvb21TY2FsZQotCi1wcml2YXRlIGludCBtTmF0aXZlQ2xhc3MKLQotcHJpdmF0ZSBib29sZWFuIG1OZWVkc1VwZGF0ZVRleHRFbnRyeQotCi1wcml2YXRlIGJvb2xlYW4gbU92ZXJsYXlIb3Jpem9udGFsU2Nyb2xsYmFyCi0KLXByaXZhdGUgYm9vbGVhbiBtT3ZlcmxheVZlcnRpY2FsU2Nyb2xsYmFyCi0KLXByaXZhdGUgYW5kcm9pZC53ZWJraXQuV2ViVmlldyRQaWN0dXJlTGlzdGVuZXIgbVBpY3R1cmVMaXN0ZW5lcgotCi1maW5hbCBhbmRyb2lkLm9zLkhhbmRsZXIgbVByaXZhdGVIYW5kbGVyCi0KLXByaXZhdGUgYW5kcm9pZC53aWRnZXQuU2Nyb2xsZXIgbVNjcm9sbGVyCi0KLXByaXZhdGUgaW50IG1TZWxlY3RYCi0KLXByaXZhdGUgaW50IG1TZWxlY3RZCi0KLXByaXZhdGUgYm9vbGVhbiBtU2hpZnRJc1ByZXNzZWQKLQotcHJpdmF0ZSBib29sZWFuIG1TbmFwUG9zaXRpdmUKLQotcHJpdmF0ZSBpbnQgbVNuYXBTY3JvbGxNb2RlCi0KLXByaXZhdGUgYW5kcm9pZC53ZWJraXQuVGV4dERpYWxvZyBtVGV4dEVudHJ5Ci0KLXByaXZhdGUgaW50IG1UZXh0R2VuZXJhdGlvbgotCi1wcml2YXRlIGludCBtVG91Y2hNb2RlCi0KLXByaXZhdGUgYm9vbGVhbiBtVHJhY2tUcmFja2JhbGwKLQotcHJpdmF0ZSBib29sZWFuIG1UcmFja2JhbGxEb3duCi0KLXByaXZhdGUgbG9uZyBtVHJhY2tiYWxsRmlyc3RUaW1lCi0KLXByaXZhdGUgbG9uZyBtVHJhY2tiYWxsTGFzdFRpbWUKLQotcHJpdmF0ZSBmbG9hdCBtVHJhY2tiYWxsUmVtYWluc1gKLQotcHJpdmF0ZSBmbG9hdCBtVHJhY2tiYWxsUmVtYWluc1kKLQotcHJpdmF0ZSBsb25nIG1UcmFja2JhbGxVcFRpbWUKLQotcHJpdmF0ZSBpbnQgbVRyYWNrYmFsbFhNb3ZlCi0KLXByaXZhdGUgaW50IG1UcmFja2JhbGxZTW92ZQotCi1wcml2YXRlIGJvb2xlYW4gbVVzZXJTY3JvbGwKLQotIGFuZHJvaWQudmlldy5WZWxvY2l0eVRyYWNrZXIgbVZlbG9jaXR5VHJhY2tlcgotCi1wcml2YXRlIGFuZHJvaWQud2Via2l0LldlYlZpZXdDb3JlIG1XZWJWaWV3Q29yZQotCi0gYm9vbGVhbiBtV2lkdGhDYW5NZWFzdXJlCi0KLXByaXZhdGUgYm9vbGVhbiBtV3JhcENvbnRlbnQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuUnVubmFibGUgbVpvb21Db250cm9sUnVubmFibGUKLQotcHJpdmF0ZSBhbmRyb2lkLndlYmtpdC5XZWJWaWV3JEV4dGVuZGVkWm9vbUNvbnRyb2xzIG1ab29tQ29udHJvbHMKLQotcHJpdmF0ZSBmbG9hdCBtWm9vbVNjYWxlCi0KLXByaXZhdGUgZmxvYXQgbVpvb21TY3JvbGxJbnZMaW1pdAotCi1wcml2YXRlIGZsb2F0IG1ab29tU2Nyb2xsTGltaXQKLQotcHJpdmF0ZSBsb25nIG1ab29tU2Nyb2xsU3RhcnQKLQotcHJpdmF0ZSBpbnQgbVpvb21TY3JvbGxYCi0KLXByaXZhdGUgaW50IG1ab29tU2Nyb2xsWQotCi1wcml2YXRlIGxvbmcgbVpvb21TdGFydAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldAotaW50KQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMTAwMCgKLWFuZHJvaWQud2Via2l0LldlYlZpZXcpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQxMTAwKAotYW5kcm9pZC53ZWJraXQuV2ViVmlldykKLQotc3RhdGljIHZvaWQgYWNjZXNzJDEyMDAoCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3KQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMTMwMCgKLWFuZHJvaWQud2Via2l0LldlYlZpZXcKLWludAotaW50KQotCi1zdGF0aWMgYm9vbGVhbiBhY2Nlc3MkMTQwMCgKLWFuZHJvaWQud2Via2l0LldlYlZpZXcpCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQxNDAyKAotYW5kcm9pZC53ZWJraXQuV2ViVmlldwotYm9vbGVhbikKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDE1MDAoCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3Ci1pbnQKLWludCkKLQotc3RhdGljIGFuZHJvaWQud2Via2l0LldlYlZpZXdDb3JlIGFjY2VzcyQxNjAwKAotYW5kcm9pZC53ZWJraXQuV2ViVmlldykKLQotc3RhdGljIHZvaWQgYWNjZXNzJDE3MDAoCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3Ci1pbnQKLWludCkKLQotc3RhdGljIGZsb2F0IGFjY2VzcyQxODAwKAotYW5kcm9pZC53ZWJraXQuV2ViVmlldykKLQotc3RhdGljIGZsb2F0IGFjY2VzcyQxODAyKAotYW5kcm9pZC53ZWJraXQuV2ViVmlldwotZmxvYXQpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDE5MDAoCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3KQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMjAwMCgKLWFuZHJvaWQud2Via2l0LldlYlZpZXcKLWludAotaW50Ci1ib29sZWFuKQotCi1zdGF0aWMgYW5kcm9pZC53ZWJraXQuV2ViVmlldyRQaWN0dXJlTGlzdGVuZXIgYWNjZXNzJDIxMDAoCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3KQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMjIwMCgKLWFuZHJvaWQud2Via2l0LldlYlZpZXcKLWludCkKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDIzMDAoCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3KQotCi1zdGF0aWMgYW5kcm9pZC53ZWJraXQuVGV4dERpYWxvZyBhY2Nlc3MkMjQwMCgKLWFuZHJvaWQud2Via2l0LldlYlZpZXcpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDI1MDAoCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3KQotCi1zdGF0aWMgaW50IGFjY2VzcyQyNjAwKAotYW5kcm9pZC53ZWJraXQuV2ViVmlldykKLQotc3RhdGljIGZsb2F0IGFjY2VzcyQyNzAyKAotYW5kcm9pZC53ZWJraXQuV2ViVmlldwotZmxvYXQpCi0KLXN0YXRpYyBmbG9hdCBhY2Nlc3MkMjgwMigKLWFuZHJvaWQud2Via2l0LldlYlZpZXcKLWZsb2F0KQotCi1zdGF0aWMgYm9vbGVhbiBhY2Nlc3MkMjkwMCgKLWFuZHJvaWQud2Via2l0LldlYlZpZXcpCi0KLXN0YXRpYyBhbmRyb2lkLndlYmtpdC5XZWJWaWV3RGF0YWJhc2UgYWNjZXNzJDMwMCgKLWFuZHJvaWQud2Via2l0LldlYlZpZXcpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDMwMDAoCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3KQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMzEwMCgKLWFuZHJvaWQud2Via2l0LldlYlZpZXcKLWZsb2F0Ci1ib29sZWFuKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMzIwMCgKLWFuZHJvaWQud2Via2l0LldlYlZpZXcKLWludCkKLQotc3RhdGljIHZvaWQgYWNjZXNzJDMzMDAoCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3Ci1ib29sZWFuKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMzQwMCgKLWFuZHJvaWQud2Via2l0LldlYlZpZXcpCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQzNTAyKAotYW5kcm9pZC53ZWJraXQuV2ViVmlldwotYm9vbGVhbikKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDM2MDIoCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3Ci1ib29sZWFuKQotCi1zdGF0aWMgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgYWNjZXNzJDM4MDAoCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3KQotCi1zdGF0aWMgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgYWNjZXNzJDM5MDAoCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3KQotCi1zdGF0aWMgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgYWNjZXNzJDQwMCgKLWFuZHJvaWQud2Via2l0LldlYlZpZXcpCi0KLXN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBhY2Nlc3MkNDAwMCgKLWFuZHJvaWQud2Via2l0LldlYlZpZXcpCi0KLXN0YXRpYyBhbmRyb2lkLndlYmtpdC5XZWJWaWV3JEV4dGVuZGVkWm9vbUNvbnRyb2xzIGFjY2VzcyQ1MDAoCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3KQotCi1zdGF0aWMgamF2YS5sYW5nLlJ1bm5hYmxlIGFjY2VzcyQ2MDAoCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3KQotCi1zdGF0aWMgbG9uZyBhY2Nlc3MkNzAwKCkKLQotc3RhdGljIHZvaWQgYWNjZXNzJDgwMCgKLWFuZHJvaWQud2Via2l0LldlYlZpZXcpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDkwMCgKLWFuZHJvaWQud2Via2l0LldlYlZpZXcpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDkwMigKLWFuZHJvaWQud2Via2l0LldlYlZpZXcKLWludCkKLQotcHJpdmF0ZSB2b2lkIGNhbGNPdXJDb250ZW50VmlzaWJsZVJlY3QoCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3QpCi0KLXByaXZhdGUgdm9pZCBjYWxjT3VyVmlzaWJsZVJlY3QoCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3QpCi0KLXByaXZhdGUgYm9vbGVhbiBjYW5ab29tU2Nyb2xsT3V0KCkKLQotcHJpdmF0ZSB2b2lkIGNsZWFyTWF0Y2hlcygpCi0KLXByaXZhdGUgdm9pZCBjbGVhclRleHRFbnRyeSgpCi0KLXByaXZhdGUgc3RhdGljIGludCBjb21wdXRlRHVyYXRpb24oCi1pbnQKLWludCkKLQotcHJpdmF0ZSB2b2lkIGNvbnRlbnRTaXplQ2hhbmdlZCgKLWJvb2xlYW4pCi0KLXByaXZhdGUgaW50IGNvbnRlbnRUb1ZpZXcoCi1pbnQpCi0KLXByaXZhdGUgYW5kcm9pZC53ZWJraXQuV2ViVmlldyRFeHRlbmRlZFpvb21Db250cm9scyBjcmVhdGVab29tQ29udHJvbHMoKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgZGlzYWJsZVBsYXRmb3JtTm90aWZpY2F0aW9ucygpCi0KLXByaXZhdGUgdm9pZCBkb0ZsaW5nKCkKLQotcHJpdmF0ZSB2b2lkIGRvU2hvcnRQcmVzcygpCi0KLXByaXZhdGUgdm9pZCBkb1RyYWNrYmFsbCgKLWxvbmcpCi0KLXByaXZhdGUgdm9pZCBkcmF3Q29yZUFuZEZvY3VzUmluZygKLWFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzCi1pbnQKLWJvb2xlYW4pCi0KLXByaXZhdGUgdm9pZCBkcmF3TWFnbmlmeUZyYW1lKAotYW5kcm9pZC5ncmFwaGljcy5DYW52YXMKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdAotYW5kcm9pZC5ncmFwaGljcy5QYWludCkKLQotcHVibGljIHN0YXRpYyB2b2lkIGVuYWJsZVBsYXRmb3JtTm90aWZpY2F0aW9ucygpCi0KLXByaXZhdGUgYm9vbGVhbiBleHRlbmRTY3JvbGwoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBmaW5kQWRkcmVzcygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgdm9pZCBmaW5kQWxsKAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wcml2YXRlIHZvaWQgZmluZEZpcnN0KAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wcml2YXRlIHZvaWQgZmluZE5leHQoCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXByaXZhdGUgdm9pZCBmaW5kUHJldmlvdXMoCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC53ZWJraXQuUGx1Z2luTGlzdCBnZXRQbHVnaW5MaXN0KCkKLQotcHJpdmF0ZSBpbnQgZ2V0U2NhbGVkTWF4WFNjcm9sbCgpCi0KLXByaXZhdGUgaW50IGdldFNjYWxlZE1heFlTY3JvbGwoKQotCi1wcml2YXRlIGludCBnZXRWaWV3SGVpZ2h0KCkKLQotcHJpdmF0ZSBpbnQgZ2V0Vmlld1dpZHRoKCkKLQotcHJpdmF0ZSB2b2lkIGdvQmFja09yRm9yd2FyZCgKLWludAotYm9vbGVhbikKLQotcHJpdmF0ZSBib29sZWFuIGluRWRpdGluZ01vZGUoKQotCi1wcml2YXRlIHZvaWQgaW5pdCgpCi0KLXByaXZhdGUgaW50IGtleUNvZGVUb1NvdW5kc0VmZmVjdCgKLWludCkKLQotcHJpdmF0ZSB2b2lkIG1vdmVab29tU2Nyb2xsV2luZG93KAotZmxvYXQKLWZsb2F0KQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZUNsZWFyRm9jdXMoCi1pbnQKLWludCkKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVDcmVhdGUoCi1pbnQpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlRGVidWdEdW1wKCkKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVEZXN0cm95KCkKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVEcmF3Rm9jdXNSaW5nKAotYW5kcm9pZC5ncmFwaGljcy5DYW52YXMpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlRHJhd1NlbGVjdGlvbigKLWFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzCi1pbnQKLWludAotYm9vbGVhbikKLQotcHJpdmF0ZSBuYXRpdmUgYW5kcm9pZC5ncmFwaGljcy5SZWN0IG5hdGl2ZUdldEZvY3VzUmluZ0JvdW5kcygpCi0KLXByaXZhdGUgbmF0aXZlIGFuZHJvaWQuZ3JhcGhpY3MuUmVjdCBuYXRpdmVHZXROYXZCb3VuZHMoKQotCi1wcml2YXRlIG5hdGl2ZSBhbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbiBuYXRpdmVHZXRTZWxlY3Rpb24oKQotCi1wcml2YXRlIG5hdGl2ZSBib29sZWFuIG5hdGl2ZUhhc1NyY1VybCgpCi0KLXByaXZhdGUgbmF0aXZlIGJvb2xlYW4gbmF0aXZlSXNJbWFnZSgKLWludAotaW50KQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZU1hcmtOb2RlSW52YWxpZCgKLWludCkKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVNb3Rpb25VcCgKLWludAotaW50Ci1pbnQKLWJvb2xlYW4pCi0KLXByaXZhdGUgbmF0aXZlIGJvb2xlYW4gbmF0aXZlTW92ZUZvY3VzKAotaW50Ci1pbnQKLWJvb2xlYW4pCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlTW92ZVNlbGVjdGlvbigKLWludAotaW50Ci1ib29sZWFuKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZU5vdGlmeUZvY3VzU2V0KAotYm9vbGVhbikKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVSZWNvbXB1dGVGb2N1cygpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlUmVjb3JkQnV0dG9ucygpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlUmVzZXRGb2N1cygpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlUmVzZXROYXZDbGlwQm91bmRzKCkKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVTZWxlY3RCZXN0QXQoCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3QpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlU2V0Rm9sbG93ZWRMaW5rKAotYm9vbGVhbikKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVTZXRIZWlnaHRDYW5NZWFzdXJlKAotYm9vbGVhbikKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVTZXROYXZCb3VuZHMoCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3QpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlU2V0TmF2Q2xpcEJvdW5kcygKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdCkKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVVcGRhdGVDYWNoZWRUZXh0ZmllbGQoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXByaXZhdGUgbmF0aXZlIGJvb2xlYW4gbmF0aXZlVXBkYXRlRm9jdXNOb2RlKCkKLQotcHJpdmF0ZSBib29sZWFuIG5hdkhhbmRsZWRLZXkoCi1pbnQKLWludAotYm9vbGVhbgotbG9uZykKLQotcHJpdmF0ZSBzdGF0aWMgaW50IHBpbkxvYygKLWludAotaW50Ci1pbnQpCi0KLXByaXZhdGUgaW50IHBpbkxvY1goCi1pbnQpCi0KLXByaXZhdGUgaW50IHBpbkxvY1koCi1pbnQpCi0KLXByaXZhdGUgYm9vbGVhbiBwaW5TY3JvbGxCeSgKLWludAotaW50Ci1ib29sZWFuKQotCi1wcml2YXRlIGJvb2xlYW4gcGluU2Nyb2xsVG8oCi1pbnQKLWludAotYm9vbGVhbikKLQotcHJpdmF0ZSB2b2lkIHJlY29yZE5ld0NvbnRlbnRTaXplKAotaW50Ci1pbnQKLWJvb2xlYW4pCi0KLXByaXZhdGUgaW50IHNjYWxlVHJhY2tiYWxsWCgKLWZsb2F0Ci1pbnQpCi0KLXByaXZhdGUgaW50IHNjYWxlVHJhY2tiYWxsWSgKLWZsb2F0Ci1pbnQpCi0KLXByaXZhdGUgdm9pZCBzY3JvbGxab29tRHJhdygKLWFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzKQotCi1wcml2YXRlIGFuZHJvaWQuZ3JhcGhpY3MuUmVjdCBzY3JvbGxab29tRnJhbWUoCi1pbnQKLWludAotZmxvYXQpCi0KLXByaXZhdGUgZmxvYXQgc2Nyb2xsWm9vbUdyaWRTY2FsZSgKLWZsb2F0KQotCi1wcml2YXRlIGZsb2F0IHNjcm9sbFpvb21NYWdTY2FsZSgKLWZsb2F0KQotCi1wcml2YXRlIGZsb2F0IHNjcm9sbFpvb21YKAotZmxvYXQpCi0KLXByaXZhdGUgZmxvYXQgc2Nyb2xsWm9vbVkoCi1mbG9hdCkKLQotcHJpdmF0ZSB2b2lkIHNlbmRGaW5hbEZvY3VzKAotaW50Ci1pbnQKLWludAotaW50KQotCi1wcml2YXRlIHZvaWQgc2VuZEtpdEZvY3VzKCkKLQotcHJpdmF0ZSB2b2lkIHNlbmRNb3Rpb25VcCgKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludAotYm9vbGVhbgotYm9vbGVhbikKLQotcHJpdmF0ZSBhbmRyb2lkLmdyYXBoaWNzLlJlY3Qgc2VuZE91clZpc2libGVSZWN0KCkKLQotcHJpdmF0ZSBib29sZWFuIHNlbmRWaWV3U2l6ZVpvb20oKQotCi1wcml2YXRlIHZvaWQgc2V0Q29udGVudFNjcm9sbEJ5KAotaW50Ci1pbnQpCi0KLXByaXZhdGUgYm9vbGVhbiBzZXRDb250ZW50U2Nyb2xsVG8oCi1pbnQKLWludCkKLQotcHJpdmF0ZSB2b2lkIHNldEZvY3VzRGF0YSgKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWJvb2xlYW4pCi0KLXByaXZhdGUgdm9pZCBzZXROZXdab29tU2NhbGUoCi1mbG9hdAotYm9vbGVhbikKLQotcHJpdmF0ZSB2b2lkIHNldFRleHRFbnRyeVJlY3QoCi1pbnQKLWludAotaW50Ci1pbnQpCi0KLXByaXZhdGUgdm9pZCBzZXRab29tU2Nyb2xsSW4oKQotCi1wcml2YXRlIHZvaWQgc3Bhd25Db250ZW50U2Nyb2xsVG8oCi1pbnQKLWludCkKLQotcHJpdmF0ZSB2b2lkIHN0YXJ0Wm9vbVNjcm9sbE91dCgpCi0KLXByaXZhdGUgdm9pZCB1cGRhdGVTZWxlY3Rpb24oKQotCi1wcml2YXRlIHZvaWQgdXBkYXRlVGV4dEVudHJ5KCkKLQotcHJpdmF0ZSB2b2lkIHZpZXdJbnZhbGlkYXRlKCkKLQotcHJpdmF0ZSB2b2lkIHpvb21TY3JvbGxPdXQoKQotCi1wcml2YXRlIHZvaWQgem9vbVNjcm9sbFRhcCgKLWZsb2F0Ci1mbG9hdCkKLQotcHJpdmF0ZSBib29sZWFuIHpvb21XaXRoUHJldmlldygKLWZsb2F0KQotCi1wdWJsaWMgdm9pZCBhZGRKYXZhc2NyaXB0SW50ZXJmYWNlKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJvb2xlYW4gY2FuR29CYWNrKCkKLQotcHVibGljIGJvb2xlYW4gY2FuR29CYWNrT3JGb3J3YXJkKAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBjYW5Hb0ZvcndhcmQoKQotCi1wdWJsaWMgYW5kcm9pZC5ncmFwaGljcy5QaWN0dXJlIGNhcHR1cmVQaWN0dXJlKCkKLQotcHVibGljIHZvaWQgY2xlYXJDYWNoZSgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIGNsZWFyRm9ybURhdGEoKQotCi1wdWJsaWMgdm9pZCBjbGVhckhpc3RvcnkoKQotCi1wdWJsaWMgdm9pZCBjbGVhclNzbFByZWZlcmVuY2VzKCkKLQotcHVibGljIHZvaWQgY2xlYXJWaWV3KCkKLQotcHJvdGVjdGVkIGludCBjb21wdXRlSG9yaXpvbnRhbFNjcm9sbFJhbmdlKCkKLQotcHVibGljIHZvaWQgY29tcHV0ZVNjcm9sbCgpCi0KLXByb3RlY3RlZCBpbnQgY29tcHV0ZVZlcnRpY2FsU2Nyb2xsUmFuZ2UoKQotCi1wdWJsaWMgYW5kcm9pZC53ZWJraXQuV2ViQmFja0ZvcndhcmRMaXN0IGNvcHlCYWNrRm9yd2FyZExpc3QoKQotCi1wdWJsaWMgdm9pZCBkZWJ1Z0R1bXAoKQotCi0gdm9pZCBkZWxldGVTZWxlY3Rpb24oCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgZGVzdHJveSgpCi0KLXB1YmxpYyBib29sZWFuIGRpc3BhdGNoS2V5RXZlbnQoCi1hbmRyb2lkLnZpZXcuS2V5RXZlbnQpCi0KLXB1YmxpYyB2b2lkIGRvY3VtZW50QXNUZXh0KAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBkb2N1bWVudEhhc0ltYWdlcygKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotIGJvb2xlYW4gZHJhd0hpc3RvcnkoKQotCi1wdWJsaWMgdm9pZCBleHRlcm5hbFJlcHJlc2VudGF0aW9uKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvVGhyb3dhYmxlOyApCi1wcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpCi0KLXB1YmxpYyB2b2lkIGZsaW5nU2Nyb2xsKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBhbmRyb2lkLm5ldC5odHRwLlNzbENlcnRpZmljYXRlIGdldENlcnRpZmljYXRlKCkKLQotcHVibGljIGludCBnZXRDb250ZW50SGVpZ2h0KCkKLQotcHVibGljIGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwIGdldEZhdmljb24oKQotCi1wdWJsaWMgYW5kcm9pZC53ZWJraXQuV2ViVmlldyRIaXRUZXN0UmVzdWx0IGdldEhpdFRlc3RSZXN1bHQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIGdldEh0dHBBdXRoVXNlcm5hbWVQYXNzd29yZCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE9yaWdpbmFsVXJsKCkKLQotcHVibGljIGludCBnZXRQcm9ncmVzcygpCi0KLXB1YmxpYyBmbG9hdCBnZXRTY2FsZSgpCi0KLXB1YmxpYyBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncyBnZXRTZXR0aW5ncygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFRpdGxlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VXJsKCkKLQotIGFuZHJvaWQud2Via2l0LldlYlZpZXdDb3JlIGdldFdlYlZpZXdDb3JlKCkKLQotcHVibGljIGFuZHJvaWQudmlldy5WaWV3IGdldFpvb21Db250cm9scygpCi0KLXB1YmxpYyB2b2lkIGdvQmFjaygpCi0KLXB1YmxpYyB2b2lkIGdvQmFja09yRm9yd2FyZCgKLWludCkKLQotcHVibGljIHZvaWQgZ29Gb3J3YXJkKCkKLQotcHVibGljIHZvaWQgaW52b2tlWm9vbVBpY2tlcigpCi0KLXB1YmxpYyB2b2lkIGxvYWREYXRhKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgbG9hZERhdGFXaXRoQmFzZVVSTCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIGxvYWRVcmwoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi0gdm9pZCBtb3ZlU2VsZWN0aW9uKAotZmxvYXQKLWZsb2F0KQotCi1wcm90ZWN0ZWQgdm9pZCBvbkF0dGFjaGVkVG9XaW5kb3coKQotCi1wdWJsaWMgdm9pZCBvbkNoaWxkVmlld0FkZGVkKAotYW5kcm9pZC52aWV3LlZpZXcKLWFuZHJvaWQudmlldy5WaWV3KQotCi1wdWJsaWMgdm9pZCBvbkNoaWxkVmlld1JlbW92ZWQoCi1hbmRyb2lkLnZpZXcuVmlldwotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXByb3RlY3RlZCB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkKLQotcHJvdGVjdGVkIHZvaWQgb25EcmF3KAotYW5kcm9pZC5ncmFwaGljcy5DYW52YXMpCi0KLXByb3RlY3RlZCB2b2lkIG9uRm9jdXNDaGFuZ2VkKAotYm9vbGVhbgotaW50Ci1hbmRyb2lkLmdyYXBoaWNzLlJlY3QpCi0KLXB1YmxpYyB2b2lkIG9uR2xvYmFsRm9jdXNDaGFuZ2VkKAotYW5kcm9pZC52aWV3LlZpZXcKLWFuZHJvaWQudmlldy5WaWV3KQotCi1wdWJsaWMgYm9vbGVhbiBvbktleURvd24oCi1pbnQKLWFuZHJvaWQudmlldy5LZXlFdmVudCkKLQotcHVibGljIGJvb2xlYW4gb25LZXlVcCgKLWludAotYW5kcm9pZC52aWV3LktleUV2ZW50KQotCi1wcm90ZWN0ZWQgdm9pZCBvbk1lYXN1cmUoCi1pbnQKLWludCkKLQotIGJvb2xlYW4gb25TYXZlUGFzc3dvcmQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXByb3RlY3RlZCB2b2lkIG9uU2Nyb2xsQ2hhbmdlZCgKLWludAotaW50Ci1pbnQKLWludCkKLQotcHJvdGVjdGVkIHZvaWQgb25TaXplQ2hhbmdlZCgKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KAotYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50KQotCi1wdWJsaWMgYm9vbGVhbiBvblRyYWNrYmFsbEV2ZW50KAotYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50KQotCi1wdWJsaWMgdm9pZCBvbldpbmRvd0ZvY3VzQ2hhbmdlZCgKLWJvb2xlYW4pCi0KLXB1YmxpYyBib29sZWFuIG92ZXJsYXlIb3Jpem9udGFsU2Nyb2xsYmFyKCkKLQotcHVibGljIGJvb2xlYW4gb3ZlcmxheVZlcnRpY2FsU2Nyb2xsYmFyKCkKLQotcHVibGljIGJvb2xlYW4gcGFnZURvd24oCi1ib29sZWFuKQotCi1wdWJsaWMgYm9vbGVhbiBwYWdlVXAoCi1ib29sZWFuKQotCi0gdm9pZCBwYXNzVG9KYXZhU2NyaXB0KAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC52aWV3LktleUV2ZW50KQotCi1wdWJsaWMgdm9pZCBwYXVzZVRpbWVycygpCi0KLXB1YmxpYyBib29sZWFuIHBlcmZvcm1Mb25nQ2xpY2soKQotCi1wdWJsaWMgdm9pZCByZWZyZXNoUGx1Z2lucygKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHJlbG9hZCgpCi0KLSB2b2lkIHJlcGxhY2VUZXh0ZmllbGRUZXh0KAotaW50Ci1pbnQKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiByZXF1ZXN0Q2hpbGRSZWN0YW5nbGVPblNjcmVlbigKLWFuZHJvaWQudmlldy5WaWV3Ci1hbmRyb2lkLmdyYXBoaWNzLlJlY3QKLWJvb2xlYW4pCi0KLXB1YmxpYyBib29sZWFuIHJlcXVlc3RGb2N1cygKLWludAotYW5kcm9pZC5ncmFwaGljcy5SZWN0KQotCi1wdWJsaWMgdm9pZCByZXF1ZXN0Rm9jdXNOb2RlSHJlZigKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgcmVxdWVzdEltYWdlUmVmKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi0gdm9pZCByZXF1ZXN0TGlzdEJveCgKLWphdmEubGFuZy5TdHJpbmdbXQotYm9vbGVhbltdCi1pbnQpCi0KLSB2b2lkIHJlcXVlc3RMaXN0Qm94KAotamF2YS5sYW5nLlN0cmluZ1tdCi1ib29sZWFuW10KLWludFtdKQotCi0gdm9pZCByZXNldFRyYWNrYmFsbFRpbWUoKQotCi1wdWJsaWMgYW5kcm9pZC53ZWJraXQuV2ViQmFja0ZvcndhcmRMaXN0IHJlc3RvcmVTdGF0ZSgKLWFuZHJvaWQub3MuQnVuZGxlKQotCi1wdWJsaWMgdm9pZCByZXN1bWVUaW1lcnMoKQotCi1wdWJsaWMgdm9pZCBzYXZlUGFzc3dvcmQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYW5kcm9pZC53ZWJraXQuV2ViQmFja0ZvcndhcmRMaXN0IHNhdmVTdGF0ZSgKLWFuZHJvaWQub3MuQnVuZGxlKQotCi1wdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kQ29sb3IoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldENlcnRpZmljYXRlKAotYW5kcm9pZC5uZXQuaHR0cC5Tc2xDZXJ0aWZpY2F0ZSkKLQotcHVibGljIHZvaWQgc2V0RG93bmxvYWRMaXN0ZW5lcigKLWFuZHJvaWQud2Via2l0LkRvd25sb2FkTGlzdGVuZXIpCi0KLXB1YmxpYyB2b2lkIHNldEhvcml6b250YWxTY3JvbGxiYXJPdmVybGF5KAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0SHR0cEF1dGhVc2VybmFtZVBhc3N3b3JkKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0SW5pdGlhbFNjYWxlKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRMYXlvdXRQYXJhbXMoCi1hbmRyb2lkLnZpZXcuVmlld0dyb3VwJExheW91dFBhcmFtcykKLQotcHVibGljIHZvaWQgc2V0TWFwVHJhY2tiYWxsVG9BcnJvd0tleXMoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRQaWN0dXJlTGlzdGVuZXIoCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3JFBpY3R1cmVMaXN0ZW5lcikKLQotcHVibGljIHZvaWQgc2V0U2Nyb2xsQmFyU3R5bGUoCi1pbnQpCi0KLSB2b2lkIHNldFNlbGVjdGlvbigKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRWZXJ0aWNhbFNjcm9sbGJhck92ZXJsYXkoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRXZWJDaHJvbWVDbGllbnQoCi1hbmRyb2lkLndlYmtpdC5XZWJDaHJvbWVDbGllbnQpCi0KLXB1YmxpYyB2b2lkIHNldFdlYlZpZXdDbGllbnQoCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3Q2xpZW50KQotCi0gdm9pZCBzaG9ydFByZXNzT25UZXh0RmllbGQoKQotCi1wdWJsaWMgdm9pZCBzdG9wTG9hZGluZygpCi0KLSB2b2lkIHN3aXRjaE91dERyYXdIaXN0b3J5KCkKLQotIHZvaWQgdXBkYXRlQ2FjaGVkVGV4dGZpZWxkKAotamF2YS5sYW5nLlN0cmluZykKLQotIGludCB2aWV3VG9Db250ZW50KAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiB6b29tSW4oKQotCi1wdWJsaWMgYm9vbGVhbiB6b29tT3V0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLndlYmtpdC5XZWJWaWV3Q2xpZW50IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIGRvVXBkYXRlVmlzaXRlZEhpc3RvcnkoCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3Ci1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBvbkZvcm1SZXN1Ym1pc3Npb24oCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3Ci1hbmRyb2lkLm9zLk1lc3NhZ2UKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgb25Mb2FkUmVzb3VyY2UoCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBvblBhZ2VGaW5pc2hlZCgKLWFuZHJvaWQud2Via2l0LldlYlZpZXcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIG9uUGFnZVN0YXJ0ZWQoCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3Ci1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCkKLQotcHVibGljIHZvaWQgb25SZWNlaXZlZEVycm9yKAotYW5kcm9pZC53ZWJraXQuV2ViVmlldwotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBvblJlY2VpdmVkSHR0cEF1dGhSZXF1ZXN0KAotYW5kcm9pZC53ZWJraXQuV2ViVmlldwotYW5kcm9pZC53ZWJraXQuSHR0cEF1dGhIYW5kbGVyCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBvblJlY2VpdmVkU3NsRXJyb3IoCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3Ci1hbmRyb2lkLndlYmtpdC5Tc2xFcnJvckhhbmRsZXIKLWFuZHJvaWQubmV0Lmh0dHAuU3NsRXJyb3IpCi0KLXB1YmxpYyB2b2lkIG9uU2NhbGVDaGFuZ2VkKAotYW5kcm9pZC53ZWJraXQuV2ViVmlldwotZmxvYXQKLWZsb2F0KQotCi1wdWJsaWMgdm9pZCBvblRvb01hbnlSZWRpcmVjdHMoCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3Ci1hbmRyb2lkLm9zLk1lc3NhZ2UKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgb25VbmhhbmRsZWRLZXlFdmVudCgKLWFuZHJvaWQud2Via2l0LldlYlZpZXcKLWFuZHJvaWQudmlldy5LZXlFdmVudCkKLQotcHVibGljIGJvb2xlYW4gc2hvdWxkT3ZlcnJpZGVLZXlFdmVudCgKLWFuZHJvaWQud2Via2l0LldlYlZpZXcKLWFuZHJvaWQudmlldy5LZXlFdmVudCkKLQotcHVibGljIGJvb2xlYW4gc2hvdWxkT3ZlcnJpZGVVcmxMb2FkaW5nKAotYW5kcm9pZC53ZWJraXQuV2ViVmlldwotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTQxMDQgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93ZWJraXQvV2ViVmlld0NvcmU7ICkKLSBjbGFzcyBhbmRyb2lkLndlYmtpdC5XZWJWaWV3Q29yZSQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotIGNsYXNzIGFuZHJvaWQud2Via2l0LldlYlZpZXdDb3JlJEV2ZW50SHViJDEgZXh0ZW5kcyBhbmRyb2lkLm9zLkhhbmRsZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC53ZWJraXQuV2ViVmlld0NvcmUkRXZlbnRIdWIgdGhpcyQxCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53ZWJraXQuV2ViVmlld0NvcmUkRXZlbnRIdWIpCi0KLXB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2Via2l0L1dlYlZpZXdDb3JlOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9RXZlbnRIdWIgKQotIGNsYXNzIGFuZHJvaWQud2Via2l0LldlYlZpZXdDb3JlJEV2ZW50SHViIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgaW50IEFERF9KU19JTlRFUkZBQ0UKLQotc3RhdGljIGZpbmFsIGludCBCTE9DS19GT0NVU19DSEFOR0VfVU5USUxfS0VZX1VQCi0KLXN0YXRpYyBmaW5hbCBpbnQgQ0xFQVJfQ0FDSEUKLQotc3RhdGljIGZpbmFsIGludCBDTEVBUl9ISVNUT1JZCi0KLXN0YXRpYyBmaW5hbCBpbnQgQ0xFQVJfTUFUQ0hFUwotCi1zdGF0aWMgZmluYWwgaW50IENMRUFSX1NTTF9QUkVGX1RBQkxFCi0KLXN0YXRpYyBmaW5hbCBpbnQgREVMRVRFX1NFTEVDVElPTgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVTVFJPWQotCi1zdGF0aWMgZmluYWwgaW50IERPQ19IQVNfSU1BR0VTCi0KLXN0YXRpYyBmaW5hbCBpbnQgRFVNUF9XRUJLSVQKLQotc3RhdGljIGZpbmFsIGludCBGSU5ECi0KLXN0YXRpYyBmaW5hbCBpbnQgRklORF9BTEwKLQotc3RhdGljIGZpbmFsIGludCBHRVRfU0VMRUNUSU9OCi0KLXN0YXRpYyBmaW5hbCBpbnQgR09fQkFDS19GT1JXQVJECi0KLXN0YXRpYyBmaW5hbCBpbnQgS0VZX0RPV04KLQotc3RhdGljIGZpbmFsIGludCBLRVlfVVAKLQotc3RhdGljIGZpbmFsIGludCBMSVNUQk9YX0NIT0lDRVMKLQotc3RhdGljIGZpbmFsIGludCBMT0FEX0RBVEEKLQotc3RhdGljIGZpbmFsIGludCBMT0FEX1VSTAotCi1zdGF0aWMgZmluYWwgaW50IE5PX0ZPQ1VTX0NIQU5HRV9CTE9DSwotCi1zdGF0aWMgZmluYWwgaW50IFBBU1NfVE9fSlMKLQotc3RhdGljIGZpbmFsIGludCBQQVVTRV9USU1FUlMKLQotc3RhdGljIGZpbmFsIGludCBSRUZSRVNIX1BMVUdJTlMKLQotc3RhdGljIGZpbmFsIGludCBSRUxPQUQKLQotc3RhdGljIGZpbmFsIGludCBSRVBMQUNFX1RFWFQKLQotc3RhdGljIGZpbmFsIGludCBSRVFVRVNUX0RPQ19BU19URVhUCi0KLXN0YXRpYyBmaW5hbCBpbnQgUkVRVUVTVF9FWFRfUkVQUkVTRU5UQVRJT04KLQotc3RhdGljIGZpbmFsIGludCBSRVFVRVNUX0ZPQ1VTX0hSRUYKLQotc3RhdGljIGZpbmFsIGludCBSRVFVRVNUX0lNQUdFX0hSRUYKLQotc3RhdGljIGZpbmFsIGludCBSRVNUT1JFX1NUQVRFCi0KLXN0YXRpYyBmaW5hbCBpbnQgUkVTVU1FX1RJTUVSUwotCi1zdGF0aWMgZmluYWwgaW50IFNBVkVfRE9DVU1FTlRfU1RBVEUKLQotc3RhdGljIGZpbmFsIGludCBTRVRfQkFDS0dST1VORF9DT0xPUgotCi1zdGF0aWMgZmluYWwgaW50IFNFVF9GSU5BTF9GT0NVUwotCi1zdGF0aWMgZmluYWwgaW50IFNFVF9LSVRfRk9DVVMKLQotc3RhdGljIGZpbmFsIGludCBTRVRfU0VMRUNUSU9OCi0KLXN0YXRpYyBmaW5hbCBpbnQgU0VUX1NOQVBfQU5DSE9SCi0KLXN0YXRpYyBmaW5hbCBpbnQgU0VUX1ZJU0lCTEVfUkVDVAotCi1zdGF0aWMgZmluYWwgaW50IFNJTkdMRV9MSVNUQk9YX0NIT0lDRQotCi1zdGF0aWMgZmluYWwgaW50IFNUT1BfTE9BRElORwotCi1zdGF0aWMgZmluYWwgaW50IFNZTkNfU0NST0xMCi0KLXN0YXRpYyBmaW5hbCBpbnQgVE9VQ0hfVVAKLQotc3RhdGljIGZpbmFsIGludCBVTkJMT0NLX0ZPQ1VTCi0KLXN0YXRpYyBmaW5hbCBpbnQgVVBEQVRFX0NBQ0hFX0FORF9URVhUX0VOVFJZCi0KLXN0YXRpYyBmaW5hbCBpbnQgVklFV19TSVpFX0NIQU5HRUQKLQotc3RhdGljIGZpbmFsIGludCBXRUJLSVRfRFJBVwotCi1wcml2YXRlIGJvb2xlYW4gbUJsb2NrTWVzc2FnZXMKLQotcHJpdmF0ZSBhbmRyb2lkLm9zLkhhbmRsZXIgbUhhbmRsZXIKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0FycmF5TGlzdDxMYW5kcm9pZC9vcy9NZXNzYWdlOz47ICkKLXByaXZhdGUgamF2YS51dGlsLkFycmF5TGlzdCBtTWVzc2FnZXMKLQotcHJpdmF0ZSBpbnQgbVNhdmVkUHJpb3JpdHkKLQotcHJpdmF0ZSBpbnQgbVRpZAotCi1maW5hbCBhbmRyb2lkLndlYmtpdC5XZWJWaWV3Q29yZSB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53ZWJraXQuV2ViVmlld0NvcmUpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQud2Via2l0LldlYlZpZXdDb3JlCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3Q29yZSQxKQotCi1zdGF0aWMgaW50IGFjY2VzcyQxNTAwKAotYW5kcm9pZC53ZWJraXQuV2ViVmlld0NvcmUkRXZlbnRIdWIpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDE1MDIoCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3Q29yZSRFdmVudEh1YgotaW50KQotCi1zdGF0aWMgaW50IGFjY2VzcyQxNjAwKAotYW5kcm9pZC53ZWJraXQuV2ViVmlld0NvcmUkRXZlbnRIdWIpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQyMDAoCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3Q29yZSRFdmVudEh1YikKLQotc3RhdGljIHZvaWQgYWNjZXNzJDQ3MDAoCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3Q29yZSRFdmVudEh1YgotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkNDgwMCgKLWFuZHJvaWQud2Via2l0LldlYlZpZXdDb3JlJEV2ZW50SHViCi1hbmRyb2lkLm9zLk1lc3NhZ2UKLWxvbmcpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQ0OTAwKAotYW5kcm9pZC53ZWJraXQuV2ViVmlld0NvcmUkRXZlbnRIdWIKLWludCkKLQotc3RhdGljIHZvaWQgYWNjZXNzJDUwMDAoCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3Q29yZSRFdmVudEh1YikKLQotc3RhdGljIHZvaWQgYWNjZXNzJDUxMDAoCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3Q29yZSRFdmVudEh1YgotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkNTIwMCgKLWFuZHJvaWQud2Via2l0LldlYlZpZXdDb3JlJEV2ZW50SHViKQotCi1wcml2YXRlIHZvaWQgYmxvY2tNZXNzYWdlcygpCi0KLXByaXZhdGUgdm9pZCByZW1vdmVNZXNzYWdlcygpCi0KLXByaXZhdGUgdm9pZCByZW1vdmVNZXNzYWdlcygKLWludCkKLQotcHJpdmF0ZSB2b2lkIHNlbmRNZXNzYWdlKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wcml2YXRlIHZvaWQgc2VuZE1lc3NhZ2VBdEZyb250T2ZRdWV1ZSgKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHJpdmF0ZSB2b2lkIHNlbmRNZXNzYWdlRGVsYXllZCgKLWFuZHJvaWQub3MuTWVzc2FnZQotbG9uZykKLQotcHJpdmF0ZSB2b2lkIHRyYW5zZmVyTWVzc2FnZXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1Gb2N1c0RhdGEgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2Via2l0L1dlYlZpZXdDb3JlOyApCi0gY2xhc3MgYW5kcm9pZC53ZWJraXQuV2ViVmlld0NvcmUkRm9jdXNEYXRhIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gaW50IG1CdWlsZEdlbmVyYXRpb24KLQotIGludCBtRnJhbWUKLQotIGJvb2xlYW4gbUlnbm9yZU51bGxGb2N1cwotCi0gaW50IG1Nb3ZlR2VuZXJhdGlvbgotCi0gaW50IG1Ob2RlCi0KLSBpbnQgbVgKLQotIGludCBtWQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQud2Via2l0LldlYlZpZXdDb3JlJEZvY3VzRGF0YSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93ZWJraXQvV2ViVmlld0NvcmU7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1Ub3VjaFVwRGF0YSApCi0gY2xhc3MgYW5kcm9pZC53ZWJraXQuV2ViVmlld0NvcmUkVG91Y2hVcERhdGEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBpbnQgbUJ1aWxkR2VuZXJhdGlvbgotCi0gaW50IG1GcmFtZQotCi0gYm9vbGVhbiBtSXNDbGljawotCi0gaW50IG1Nb3ZlR2VuZXJhdGlvbgotCi0gaW50IG1Ob2RlCi0KLSBib29sZWFuIG1SZXRyeQotCi0gaW50IG1TaXplCi0KLSBpbnQgbVgKLQotIGludCBtWQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotIGNsYXNzIGFuZHJvaWQud2Via2l0LldlYlZpZXdDb3JlJFdlYkNvcmVUaHJlYWQkMSBleHRlbmRzIGFuZHJvaWQub3MuSGFuZGxlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLndlYmtpdC5XZWJWaWV3Q29yZSRXZWJDb3JlVGhyZWFkIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQud2Via2l0LldlYlZpZXdDb3JlJFdlYkNvcmVUaHJlYWQpCi0KLXB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2Via2l0L1dlYlZpZXdDb3JlOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPVdlYkNvcmVUaHJlYWQgKQotIGNsYXNzIGFuZHJvaWQud2Via2l0LldlYlZpZXdDb3JlJFdlYkNvcmVUaHJlYWQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5sYW5nLlJ1bm5hYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCTE9DS19DQUNIRV9USUNLRVIKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENBQ0hFX1RJQ0tFUgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0FDSEVfVElDS0VSX0lOVEVSVkFMCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTklUSUFMSVpFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRURVQ0VfUFJJT1JJVFkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFU1VNRV9DQUNIRV9USUNLRVIKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFU1VNRV9QUklPUklUWQotCi1wcml2YXRlIHN0YXRpYyBib29sZWFuIG1DYWNoZVRpY2tlcnNCbG9ja2VkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53ZWJraXQuV2ViVmlld0NvcmUkMSkKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDUwMCgpCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQ1MDIoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvd2Via2l0L1dlYlZpZXdDb3JlJDE7TGFuZHJvaWQvd2Via2l0L1dlYlZpZXdDb3JlJEV2ZW50SHViO0xhbmRyb2lkL3dlYmtpdC9XZWJWaWV3Q29yZSRUb3VjaFVwRGF0YTtMYW5kcm9pZC93ZWJraXQvV2ViVmlld0NvcmUkRm9jdXNEYXRhO0xhbmRyb2lkL3dlYmtpdC9XZWJWaWV3Q29yZSRXZWJDb3JlVGhyZWFkOyApCi1maW5hbCBjbGFzcyBhbmRyb2lkLndlYmtpdC5XZWJWaWV3Q29yZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMT0dUQUcKLQotc3RhdGljIGZpbmFsIGJvb2xlYW4gTE9HVl9FTkFCTEVECi0KLXN0YXRpYyBmaW5hbCBpbnQgU0NST0xMX0JJVFMKLQotc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEhSRUFEX05BTUUKLQotc3RhdGljIGZpbmFsIGludCBaT09NX0JJVFMKLQotcHJpdmF0ZSBzdGF0aWMgYW5kcm9pZC5vcy5IYW5kbGVyIHNXZWJDb3JlSGFuZGxlcgotCi1wcml2YXRlIGFuZHJvaWQud2Via2l0LkJyb3dzZXJGcmFtZSBtQnJvd3NlckZyYW1lCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC53ZWJraXQuQ2FsbGJhY2tQcm94eSBtQ2FsbGJhY2tQcm94eQotCi1wcml2YXRlIGFuZHJvaWQuZ3JhcGhpY3MuUGljdHVyZSBtQ29udGVudFBpY3R1cmVBCi0KLXByaXZhdGUgYW5kcm9pZC5ncmFwaGljcy5QaWN0dXJlIG1Db250ZW50UGljdHVyZUIKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBtQ29udGV4dAotCi1wcml2YXRlIGludCBtQ3VycmVudFZpZXdIZWlnaHQKLQotcHJpdmF0ZSBpbnQgbUN1cnJlbnRWaWV3V2lkdGgKLQotcHJpdmF0ZSBib29sZWFuIG1EcmF3SXNTY2hlZHVsZWQKLQotIGJvb2xlYW4gbUVuZFNjYWxlWm9vbQotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQud2Via2l0LldlYlZpZXdDb3JlJEV2ZW50SHViIG1FdmVudEh1YgotCi1wcml2YXRlIGludCBtTmF0aXZlQ2xhc3MKLQotcHJpdmF0ZSBqYXZhLmxhbmcuT2JqZWN0IG1QaWN0dXJlU3luYwotCi1wcml2YXRlIGludCBtUmVzdG9yZWRTY2FsZQotCi1wcml2YXRlIGludCBtUmVzdG9yZWRYCi0KLXByaXZhdGUgaW50IG1SZXN0b3JlZFkKLQotZmluYWwgYW5kcm9pZC5ncmFwaGljcy5EcmF3RmlsdGVyIG1TY3JvbGxGaWx0ZXIKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncyBtU2V0dGluZ3MKLQotcHJpdmF0ZSBpbnQgbVZpZXdwb3J0SGVpZ2h0Ci0KLXByaXZhdGUgaW50IG1WaWV3cG9ydEluaXRpYWxTY2FsZQotCi1wcml2YXRlIGludCBtVmlld3BvcnRNYXhpbXVtU2NhbGUKLQotcHJpdmF0ZSBpbnQgbVZpZXdwb3J0TWluaW11bVNjYWxlCi0KLXByaXZhdGUgYm9vbGVhbiBtVmlld3BvcnRVc2VyU2NhbGFibGUKLQotcHJpdmF0ZSBpbnQgbVZpZXdwb3J0V2lkdGgKLQotcHJpdmF0ZSBhbmRyb2lkLndlYmtpdC5XZWJWaWV3IG1XZWJWaWV3Ci0KLXByaXZhdGUgaW50IG1XZWJraXRTY3JvbGxYCi0KLXByaXZhdGUgaW50IG1XZWJraXRTY3JvbGxZCi0KLWZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuRHJhd0ZpbHRlciBtWm9vbUZpbHRlcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQud2Via2l0LldlYlZpZXcKLWFuZHJvaWQud2Via2l0LkNhbGxiYWNrUHJveHkpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQxMDAwKAotYW5kcm9pZC53ZWJraXQuV2ViVmlld0NvcmUKLWludAotYW5kcm9pZC52aWV3LktleUV2ZW50KQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMTEwMCgKLWFuZHJvaWQud2Via2l0LldlYlZpZXdDb3JlCi1pbnQKLWFuZHJvaWQudmlldy5LZXlFdmVudCkKLQotc3RhdGljIHZvaWQgYWNjZXNzJDEyMDAoCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3Q29yZQotaW50Ci1pbnQKLWZsb2F0KQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMTMwMCgKLWFuZHJvaWQud2Via2l0LldlYlZpZXdDb3JlCi1pbnQKLWludAotaW50Ci1pbnQpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQxNDAwKAotYW5kcm9pZC53ZWJraXQuV2ViVmlld0NvcmUKLWludCkKLQotc3RhdGljIGFuZHJvaWQud2Via2l0LkNhbGxiYWNrUHJveHkgYWNjZXNzJDE3MDAoCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3Q29yZSkKLQotc3RhdGljIHZvaWQgYWNjZXNzJDE4MDAoCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3Q29yZQotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQxOTAwKAotYW5kcm9pZC53ZWJraXQuV2ViVmlld0NvcmUKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludAotYm9vbGVhbgotYm9vbGVhbgotYm9vbGVhbgotYm9vbGVhbikKLQotc3RhdGljIHZvaWQgYWNjZXNzJDIwMDAoCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3Q29yZQotaW50Ci1pbnQKLWludAotaW50KQotCi1zdGF0aWMgYm9vbGVhbiBhY2Nlc3MkMjEwMCgKLWFuZHJvaWQud2Via2l0LldlYlZpZXdDb3JlCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuCi1ib29sZWFuKQotCi1zdGF0aWMgaW50IGFjY2VzcyQyMjAwKAotYW5kcm9pZC53ZWJraXQuV2ViVmlld0NvcmUKLWphdmEubGFuZy5TdHJpbmcpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQyMzAwKAotYW5kcm9pZC53ZWJraXQuV2ViVmlld0NvcmUpCi0KLXN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBhY2Nlc3MkMjQwMCgKLWFuZHJvaWQud2Via2l0LldlYlZpZXdDb3JlKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMjUwMCgKLWFuZHJvaWQud2Via2l0LldlYlZpZXdDb3JlCi1pbnQKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWJvb2xlYW4KLWJvb2xlYW4pCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQyNjAwKAotYW5kcm9pZC53ZWJraXQuV2ViVmlld0NvcmUKLWludAotaW50Ci1pbnQKLWludAotYm9vbGVhbikKLQotc3RhdGljIHZvaWQgYWNjZXNzJDI3MDAoCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3Q29yZSkKLQotc3RhdGljIHZvaWQgYWNjZXNzJDI4MDAoCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3Q29yZQotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludAotYm9vbGVhbikKLQotc3RhdGljIGphdmEubGFuZy5TdHJpbmcgYWNjZXNzJDI5MDAoCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3Q29yZQotaW50Ci1pbnQpCi0KLXN0YXRpYyBhbmRyb2lkLm9zLkhhbmRsZXIgYWNjZXNzJDMwMCgpCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGFjY2VzcyQzMDAwKAotYW5kcm9pZC53ZWJraXQuV2ViVmlld0NvcmUKLWludAotaW50KQotCi1zdGF0aWMgYW5kcm9pZC5vcy5IYW5kbGVyIGFjY2VzcyQzMDIoCi1hbmRyb2lkLm9zLkhhbmRsZXIpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQzMTAwKAotYW5kcm9pZC53ZWJraXQuV2ViVmlld0NvcmUpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQzMjAwKAotYW5kcm9pZC53ZWJraXQuV2ViVmlld0NvcmUpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQzMzAwKAotYW5kcm9pZC53ZWJraXQuV2ViVmlld0NvcmUpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQzNDAwKAotYW5kcm9pZC53ZWJraXQuV2ViVmlld0NvcmUKLWludAotaW50KQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMzUwMCgKLWFuZHJvaWQud2Via2l0LldlYlZpZXdDb3JlCi1pbnQKLWludAotaW50Ci1pbnQKLWludAotaW50KQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMzYwMCgKLWFuZHJvaWQud2Via2l0LldlYlZpZXdDb3JlCi1pbnQKLWludAotaW50Ci1pbnQKLWludAotaW50KQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMzcwMCgKLWFuZHJvaWQud2Via2l0LldlYlZpZXdDb3JlCi1ib29sZWFuW10KLWludCkKLQotc3RhdGljIHZvaWQgYWNjZXNzJDM4MDAoCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3Q29yZQotaW50KQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMzkwMCgKLWFuZHJvaWQud2Via2l0LldlYlZpZXdDb3JlCi1pbnQpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQ0MDAoCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3Q29yZSkKLQotc3RhdGljIGphdmEubGFuZy5TdHJpbmcgYWNjZXNzJDQwMDAoCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3Q29yZQotYW5kcm9pZC5ncmFwaGljcy5SZWdpb24pCi0KLXN0YXRpYyBhbmRyb2lkLndlYmtpdC5XZWJWaWV3IGFjY2VzcyQ0MTAwKAotYW5kcm9pZC53ZWJraXQuV2ViVmlld0NvcmUpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQ0MjAwKAotYW5kcm9pZC53ZWJraXQuV2ViVmlld0NvcmUpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDQzMDIoCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3Q29yZQotaW50KQotCi1zdGF0aWMgaW50IGFjY2VzcyQ0NDAyKAotYW5kcm9pZC53ZWJraXQuV2ViVmlld0NvcmUKLWludCkKLQotc3RhdGljIHZvaWQgYWNjZXNzJDQ1MDAoCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3Q29yZQotYm9vbGVhbikKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDQ2MDIoCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3Q29yZQotYm9vbGVhbikKLQotc3RhdGljIHZvaWQgYWNjZXNzJDYwMCgKLWFuZHJvaWQud2Via2l0LldlYlZpZXdDb3JlKQotCi1zdGF0aWMgYW5kcm9pZC53ZWJraXQuQnJvd3NlckZyYW1lIGFjY2VzcyQ3MDAoCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3Q29yZSkKLQotc3RhdGljIGFuZHJvaWQud2Via2l0LkJyb3dzZXJGcmFtZSBhY2Nlc3MkNzAyKAotYW5kcm9pZC53ZWJraXQuV2ViVmlld0NvcmUKLWFuZHJvaWQud2Via2l0LkJyb3dzZXJGcmFtZSkKLQotc3RhdGljIGludCBhY2Nlc3MkODAyKAotYW5kcm9pZC53ZWJraXQuV2ViVmlld0NvcmUKLWludCkKLQotc3RhdGljIHZvaWQgYWNjZXNzJDkwMCgKLWFuZHJvaWQud2Via2l0LldlYlZpZXdDb3JlCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHZvaWQgY29udGVudFNjcm9sbEJ5KAotaW50Ci1pbnQpCi0KLXByaXZhdGUgdm9pZCBjb250ZW50U2Nyb2xsVG8oCi1pbnQKLWludCkKLQotcHJpdmF0ZSB2b2lkIGNvbnRlbnRTcGF3blNjcm9sbFRvKAotaW50Ci1pbnQpCi0KLXByaXZhdGUgdm9pZCBkaWRGaXJzdExheW91dCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXN0YXRpYyB2b2lkIGVuZENhY2hlVHJhbnNhY3Rpb24oKQotCi1wcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpCi0KLXByaXZhdGUgdm9pZCBrZXlEb3duKAotaW50Ci1hbmRyb2lkLnZpZXcuS2V5RXZlbnQpCi0KLXByaXZhdGUgdm9pZCBrZXlVcCgKLWludAotYW5kcm9pZC52aWV3LktleUV2ZW50KQotCi1wcml2YXRlIHZvaWQgbG9hZFVybCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlQ2xlYXJNYXRjaGVzKCkKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVEZWxldGVTZWxlY3Rpb24oCi1pbnQKLWludAotaW50Ci1pbnQKLWludAotaW50KQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZURyYXcoCi1hbmRyb2lkLmdyYXBoaWNzLlBpY3R1cmUpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlRHVtcCgpCi0KLXByaXZhdGUgbmF0aXZlIGJvb2xlYW4gbmF0aXZlRmluZCgKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4KLWJvb2xlYW4pCi0KLXN0YXRpYyBuYXRpdmUgamF2YS5sYW5nLlN0cmluZyBuYXRpdmVGaW5kQWRkcmVzcygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgbmF0aXZlIGludCBuYXRpdmVGaW5kQWxsKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBuYXRpdmUgaW50IG5hdGl2ZUdldENvbnRlbnRNaW5QcmVmV2lkdGgoKQotCi1wcml2YXRlIG5hdGl2ZSBqYXZhLmxhbmcuU3RyaW5nIG5hdGl2ZUdldFNlbGVjdGlvbigKLWFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uKQotCi1wcml2YXRlIG5hdGl2ZSBib29sZWFuIG5hdGl2ZUtleVVwKAotaW50Ci1pbnQpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlUmVmcmVzaFBsdWdpbnMoCi1ib29sZWFuKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZVJlcGxhY2VUZXh0ZmllbGRUZXh0KAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQpCi0KLXByaXZhdGUgbmF0aXZlIGphdmEubGFuZy5TdHJpbmcgbmF0aXZlUmV0cmlldmVIcmVmKAotaW50Ci1pbnQpCi0KLXByaXZhdGUgbmF0aXZlIGphdmEubGFuZy5TdHJpbmcgbmF0aXZlUmV0cmlldmVJbWFnZVJlZigKLWludAotaW50KQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZVNhdmVEb2N1bWVudFN0YXRlKAotaW50Ci1pbnQKLWludAotaW50KQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZVNlbmRMaXN0Qm94Q2hvaWNlKAotaW50KQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZVNlbmRMaXN0Qm94Q2hvaWNlcygKLWJvb2xlYW5bXQotaW50KQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZVNldEJhY2tncm91bmRDb2xvcigKLWludCkKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVTZXRGaW5hbEZvY3VzKAotaW50Ci1pbnQKLWludAotaW50Ci1ib29sZWFuKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZVNldEtpdEZvY3VzKAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludAotYm9vbGVhbikKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVTZXRTZWxlY3Rpb24oCi1pbnQKLWludAotaW50Ci1pbnQKLWludAotaW50KQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZVNldFNpemUoCi1pbnQKLWludAotaW50Ci1mbG9hdCkKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVTZXRTbmFwQW5jaG9yKAotaW50Ci1pbnQpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlU2V0VmlzaWJsZVJlY3QoCi1pbnQKLWludAotaW50Ci1pbnQpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlU25hcFRvQW5jaG9yKCkKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVUb3VjaFVwKAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1ib29sZWFuCi1ib29sZWFuKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZVVuYmxvY2tGb2N1cygpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlVXBkYXRlRnJhbWVDYWNoZSgpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgcGFzc1RvSnMoCi1pbnQKLWludAotaW50Ci1pbnQKLWludAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQKLWJvb2xlYW4KLWJvb2xlYW4KLWJvb2xlYW4KLWJvb2xlYW4pCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBwYXVzZVRpbWVycygpCi0KLXN0YXRpYyB2b2lkIHBhdXNlVXBkYXRlKAotYW5kcm9pZC53ZWJraXQuV2ViVmlld0NvcmUpCi0KLXByaXZhdGUgdm9pZCByZXF1ZXN0TGlzdEJveCgKLWphdmEubGFuZy5TdHJpbmdbXQotYm9vbGVhbltdCi1pbnQpCi0KLXByaXZhdGUgdm9pZCByZXF1ZXN0TGlzdEJveCgKLWphdmEubGFuZy5TdHJpbmdbXQotYm9vbGVhbltdCi1pbnRbXSkKLQotcHJpdmF0ZSB2b2lkIHJlc3RvcmVTY2FsZSgKLWludCkKLQotcHJpdmF0ZSB2b2lkIHJlc3RvcmVTdGF0ZSgKLWludCkKLQotcHVibGljIHN0YXRpYyB2b2lkIHJlc3VtZVRpbWVycygpCi0KLXN0YXRpYyB2b2lkIHJlc3VtZVVwZGF0ZSgKLWFuZHJvaWQud2Via2l0LldlYlZpZXdDb3JlKQotCi1wcml2YXRlIHZvaWQgc2VuZE1hcmtOb2RlSW52YWxpZCgKLWludCkKLQotcHJpdmF0ZSB2b2lkIHNlbmROb3RpZnlGb2N1c1NldCgpCi0KLXByaXZhdGUgdm9pZCBzZW5kTm90aWZ5UHJvZ3Jlc3NGaW5pc2hlZCgpCi0KLXByaXZhdGUgdm9pZCBzZW5kUmVjb21wdXRlRm9jdXMoKQotCi1wcml2YXRlIHZvaWQgc2VuZFVwZGF0ZVRleHRFbnRyeSgpCi0KLXByaXZhdGUgdm9pZCBzZW5kVmlld0ludmFsaWRhdGUoKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIHNldFZpZXdwb3J0U2V0dGluZ3NGcm9tTmF0aXZlKCkKLQotc3RhdGljIHZvaWQgc3RhcnRDYWNoZVRyYW5zYWN0aW9uKCkKLQotcHJpdmF0ZSB2b2lkIHVwZGF0ZVRleHRmaWVsZCgKLWludAotYm9vbGVhbgotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wcml2YXRlIHZvaWQgdmlld1NpemVDaGFuZ2VkKAotaW50Ci1pbnQKLWZsb2F0KQotCi1wcml2YXRlIHZvaWQgd2Via2l0RHJhdygpCi0KLSB2b2lkIGNsZWFyQ29udGVudFBpY3R1cmUoKQotCi0gdm9pZCBjb250ZW50SW52YWxpZGF0ZSgpCi0KLSBhbmRyb2lkLmdyYXBoaWNzLlBpY3R1cmUgY29weUNvbnRlbnRQaWN0dXJlKCkKLQotIHZvaWQgZGVzdHJveSgpCi0KLSB2b2lkIGRyYXdDb250ZW50UGljdHVyZSgKLWFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzCi1pbnQKLWJvb2xlYW4KLWJvb2xlYW4pCi0KLSBhbmRyb2lkLndlYmtpdC5Ccm93c2VyRnJhbWUgZ2V0QnJvd3NlckZyYW1lKCkKLQotcHVibGljIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzIGdldFNldHRpbmdzKCkKLQotIGFuZHJvaWQud2Via2l0LldlYlZpZXcgZ2V0V2ViVmlldygpCi0KLSB2b2lkIGluaXRpYWxpemVTdWJ3aW5kb3coKQotCi1wcm90ZWN0ZWQgdm9pZCBqc0FsZXJ0KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHJvdGVjdGVkIGJvb2xlYW4ganNDb25maXJtKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcganNQcm9tcHQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcm90ZWN0ZWQgYm9vbGVhbiBqc1VubG9hZCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLSB2b2lkIHJlbW92ZU1lc3NhZ2VzKCkKLQotIHZvaWQgcmVtb3ZlTWVzc2FnZXMoCi1pbnQpCi0KLSB2b2lkIHNlbmRNZXNzYWdlKAotaW50KQotCi0gdm9pZCBzZW5kTWVzc2FnZSgKLWludAotaW50KQotCi0gdm9pZCBzZW5kTWVzc2FnZSgKLWludAotaW50Ci1pbnQpCi0KLSB2b2lkIHNlbmRNZXNzYWdlKAotaW50Ci1pbnQKLWludAotamF2YS5sYW5nLk9iamVjdCkKLQotIHZvaWQgc2VuZE1lc3NhZ2UoCi1pbnQKLWludAotamF2YS5sYW5nLk9iamVjdCkKLQotIHZvaWQgc2VuZE1lc3NhZ2UoCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi0KLSB2b2lkIHNlbmRNZXNzYWdlKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi0gdm9pZCBzZW5kTWVzc2FnZURlbGF5ZWQoCi1pbnQKLWphdmEubGFuZy5PYmplY3QKLWxvbmcpCi0KLSB2b2lkIHN0b3BMb2FkaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLndlYmtpdC5XZWJWaWV3RGF0YWJhc2UgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ0FDSEVfQ09OVEVOVExFTkdUSF9DT0wKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDQUNIRV9EQVRBQkFTRV9GSUxFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDQUNIRV9EQVRBQkFTRV9WRVJTSU9OCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ0FDSEVfRU5DT0RJTkdfQ09MCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ0FDSEVfRVRBR19DT0wKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDQUNIRV9FWFBJUkVTX0NPTAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENBQ0hFX0ZJTEVfUEFUSF9DT0wKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDQUNIRV9IVFRQX1NUQVRVU19DT0wKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDQUNIRV9MQVNUX01PRElGWV9DT0wKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDQUNIRV9MT0NBVElPTl9DT0wKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDQUNIRV9NSU1FVFlQRV9DT0wKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDQUNIRV9VUkxfQ09MCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ09PS0lFU19ET01BSU5fQ09MCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ09PS0lFU19FWFBJUkVTX0NPTAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENPT0tJRVNfTkFNRV9DT0wKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDT09LSUVTX1BBVEhfQ09MCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ09PS0lFU19TRUNVUkVfQ09MCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ09PS0lFU19WQUxVRV9DT0wKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBEQVRBQkFTRV9GSUxFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEQVRBQkFTRV9WRVJTSU9OCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRk9STURBVEFfTkFNRV9DT0wKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBGT1JNREFUQV9VUkxJRF9DT0wKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBGT1JNREFUQV9WQUxVRV9DT0wKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBGT1JNVVJMX1VSTF9DT0wKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBIVFRQQVVUSF9IT1NUX0NPTAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEhUVFBBVVRIX1BBU1NXT1JEX0NPTAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEhUVFBBVVRIX1JFQUxNX0NPTAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEhUVFBBVVRIX1VTRVJOQU1FX0NPTAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIElEX0NPTAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gSURfUFJPSkVDVElPTgotCi1wcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTE9HVEFHCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUEFTU1dPUkRfSE9TVF9DT0wKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQQVNTV09SRF9QQVNTV09SRF9DT0wKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQQVNTV09SRF9VU0VSTkFNRV9DT0wKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRBQkxFX0NPT0tJRVNfSUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRBQkxFX0ZPUk1EQVRBX0lECi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUQUJMRV9GT1JNVVJMX0lECi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUQUJMRV9IVFRQQVVUSF9JRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEFCTEVfUEFTU1dPUkRfSUQKLQotcHJpdmF0ZSBzdGF0aWMgaW50IG1DYWNoZUNvbnRlbnRMZW5ndGhDb2xJbmRleAotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSBtQ2FjaGVEYXRhYmFzZQotCi1wcml2YXRlIHN0YXRpYyBpbnQgbUNhY2hlRVRhZ0NvbEluZGV4Ci0KLXByaXZhdGUgc3RhdGljIGludCBtQ2FjaGVFbmNvZGluZ0NvbEluZGV4Ci0KLXByaXZhdGUgc3RhdGljIGludCBtQ2FjaGVFeHBpcmVzQ29sSW5kZXgKLQotcHJpdmF0ZSBzdGF0aWMgaW50IG1DYWNoZUZpbGVQYXRoQ29sSW5kZXgKLQotcHJpdmF0ZSBzdGF0aWMgaW50IG1DYWNoZUh0dHBTdGF0dXNDb2xJbmRleAotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlVXRpbHMkSW5zZXJ0SGVscGVyIG1DYWNoZUluc2VydGVyCi0KLXByaXZhdGUgc3RhdGljIGludCBtQ2FjaGVMYXN0TW9kaWZ5Q29sSW5kZXgKLQotcHJpdmF0ZSBzdGF0aWMgaW50IG1DYWNoZUxvY2F0aW9uQ29sSW5kZXgKLQotcHJpdmF0ZSBzdGF0aWMgaW50IG1DYWNoZU1pbWVUeXBlQ29sSW5kZXgKLQotcHJpdmF0ZSBzdGF0aWMgaW50IG1DYWNoZVRyYW5zYWN0aW9uUmVmY291bnQKLQotcHJpdmF0ZSBzdGF0aWMgaW50IG1DYWNoZVVybENvbEluZGV4Ci0KLXByaXZhdGUgc3RhdGljIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlIG1EYXRhYmFzZQotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLndlYmtpdC5XZWJWaWV3RGF0YWJhc2UgbUluc3RhbmNlCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmdbXSBtVGFibGVOYW1lcwotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5PYmplY3QgbUNvb2tpZUxvY2sKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuT2JqZWN0IG1Gb3JtTG9jawotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5PYmplY3QgbUh0dHBBdXRoTG9jawotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5PYmplY3QgbVBhc3N3b3JkTG9jawotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgYm9vdHN0cmFwQ2FjaGVEYXRhYmFzZSgpCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgYm9vdHN0cmFwRGF0YWJhc2UoKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQud2Via2l0LldlYlZpZXdEYXRhYmFzZSBnZXRJbnN0YW5jZSgKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wcml2YXRlIGJvb2xlYW4gaGFzRW50cmllcygKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCB1cGdyYWRlQ2FjaGVEYXRhYmFzZSgpCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgdXBncmFkZURhdGFiYXNlKCkKLQotIHZvaWQgYWRkQ2FjaGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLndlYmtpdC5DYWNoZU1hbmFnZXIkQ2FjaGVSZXN1bHQpCi0KLSB2b2lkIGFkZENvb2tpZSgKLWFuZHJvaWQud2Via2l0LkNvb2tpZU1hbmFnZXIkQ29va2llKQotCi0gdm9pZCBjbGVhckNhY2hlKCkKLQotIHZvaWQgY2xlYXJDb29raWVzKCkKLQotIHZvaWQgY2xlYXJFeHBpcmVkQ29va2llcygKLWxvbmcpCi0KLXB1YmxpYyB2b2lkIGNsZWFyRm9ybURhdGEoKQotCi1wdWJsaWMgdm9pZCBjbGVhckh0dHBBdXRoVXNlcm5hbWVQYXNzd29yZCgpCi0KLSB2b2lkIGNsZWFyU2Vzc2lvbkNvb2tpZXMoKQotCi1wdWJsaWMgdm9pZCBjbGVhclVzZXJuYW1lUGFzc3dvcmQoKQotCi0gdm9pZCBkZWxldGVDb29raWVzKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotIGJvb2xlYW4gZW5kQ2FjaGVUcmFuc2FjdGlvbigpCi0KLSBhbmRyb2lkLndlYmtpdC5DYWNoZU1hbmFnZXIkQ2FjaGVSZXN1bHQgZ2V0Q2FjaGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi0gbG9uZyBnZXRDYWNoZVRvdGFsU2l6ZSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS91dGlsL0FycmF5TGlzdDxMYW5kcm9pZC93ZWJraXQvQ29va2llTWFuYWdlciRDb29raWU7PjsgKQotIGphdmEudXRpbC5BcnJheUxpc3QgZ2V0Q29va2llc0ZvckRvbWFpbigKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylMamF2YS91dGlsL0FycmF5TGlzdDxMamF2YS9sYW5nL1N0cmluZzs+OyApCi0gamF2YS51dGlsLkFycmF5TGlzdCBnZXRGb3JtRGF0YSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLSBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0SHR0cEF1dGhVc2VybmFtZVBhc3N3b3JkKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotIGphdmEubGFuZy5TdHJpbmdbXSBnZXRVc2VybmFtZVBhc3N3b3JkKAotamF2YS5sYW5nLlN0cmluZykKLQotIGJvb2xlYW4gaGFzQ2FjaGUoKQotCi0gYm9vbGVhbiBoYXNDb29raWVzKCkKLQotcHVibGljIGJvb2xlYW4gaGFzRm9ybURhdGEoKQotCi1wdWJsaWMgYm9vbGVhbiBoYXNIdHRwQXV0aFVzZXJuYW1lUGFzc3dvcmQoKQotCi1wdWJsaWMgYm9vbGVhbiBoYXNVc2VybmFtZVBhc3N3b3JkKCkKLQotIHZvaWQgcmVtb3ZlQ2FjaGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1N0cmluZztMamF2YS91dGlsL0hhc2hNYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7PjspViApCi0gdm9pZCBzZXRGb3JtRGF0YSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudXRpbC5IYXNoTWFwKQotCi0gdm9pZCBzZXRIdHRwQXV0aFVzZXJuYW1lUGFzc3dvcmQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi0gdm9pZCBzZXRVc2VybmFtZVBhc3N3b3JkKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotIGJvb2xlYW4gc3RhcnRDYWNoZVRyYW5zYWN0aW9uKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSilMamF2YS91dGlsL0FycmF5TGlzdDxMamF2YS9sYW5nL1N0cmluZzs+OyApCi0gamF2YS51dGlsLkFycmF5TGlzdCB0cmltQ2FjaGUoCi1sb25nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQud2Via2l0LmdlYXJzLkFuZHJvaWRHcHNMb2NhdGlvblByb3ZpZGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQubG9jYXRpb24uTG9jYXRpb25MaXN0ZW5lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRBRwotCi1wcml2YXRlIGFuZHJvaWQubG9jYXRpb24uTG9jYXRpb25NYW5hZ2VyIGxvY2F0aW9uTWFuYWdlcgotCi1wcml2YXRlIGxvbmcgbmF0aXZlT2JqZWN0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53ZWJraXQuV2ViVmlldwotbG9uZykKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVMb2NhdGlvbkNoYW5nZWQoCi1hbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uCi1sb25nKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZVByb3ZpZGVyRXJyb3IoCi1ib29sZWFuCi1sb25nKQotCi1wdWJsaWMgdm9pZCBvbkxvY2F0aW9uQ2hhbmdlZCgKLWFuZHJvaWQubG9jYXRpb24uTG9jYXRpb24pCi0KLXB1YmxpYyB2b2lkIG9uUHJvdmlkZXJEaXNhYmxlZCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIG9uUHJvdmlkZXJFbmFibGVkKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgb25TdGF0dXNDaGFuZ2VkKAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1hbmRyb2lkLm9zLkJ1bmRsZSkKLQotcHVibGljIHZvaWQgc2h1dGRvd24oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjUgbmFtZSA9UmFkaW9EYXRhICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dlYmtpdC9nZWFycy9BbmRyb2lkUmFkaW9EYXRhUHJvdmlkZXI7ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLndlYmtpdC5nZWFycy5BbmRyb2lkUmFkaW9EYXRhUHJvdmlkZXIkUmFkaW9EYXRhIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBjYXJyaWVyTmFtZQotCi1wdWJsaWMgaW50IGNlbGxJZAotCi1wdWJsaWMgaW50IGhvbWVNb2JpbGVDb3VudHJ5Q29kZQotCi1wdWJsaWMgaW50IGhvbWVNb2JpbGVOZXR3b3JrQ29kZQotCi1wdWJsaWMgaW50IGxvY2F0aW9uQXJlYUNvZGUKLQotcHVibGljIGludCBtb2JpbGVDb3VudHJ5Q29kZQotCi1wdWJsaWMgaW50IG1vYmlsZU5ldHdvcmtDb2RlCi0KLXB1YmxpYyBpbnQgcmFkaW9UeXBlCi0KLXB1YmxpYyBpbnQgc2lnbmFsU3RyZW5ndGgKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLndlYmtpdC5nZWFycy5BbmRyb2lkUmFkaW9EYXRhUHJvdmlkZXIkUmFkaW9EYXRhIGdldEluc3RhbmNlKAotYW5kcm9pZC50ZWxlcGhvbnkuVGVsZXBob255TWFuYWdlcgotYW5kcm9pZC50ZWxlcGhvbnkuQ2VsbExvY2F0aW9uCi1pbnQKLWFuZHJvaWQudGVsZXBob255LlNlcnZpY2VTdGF0ZSkKLQotcHJpdmF0ZSB2b2lkIHNldE1vYmlsZUNvZGVzKAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3dlYmtpdC9nZWFycy9BbmRyb2lkUmFkaW9EYXRhUHJvdmlkZXIkUmFkaW9EYXRhOyApCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC53ZWJraXQuZ2VhcnMuQW5kcm9pZFJhZGlvRGF0YVByb3ZpZGVyIGV4dGVuZHMgYW5kcm9pZC50ZWxlcGhvbnkuUGhvbmVTdGF0ZUxpc3RlbmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSQURJT19UWVBFX0dTTQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkFESU9fVFlQRV9VTktOT1dOCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSQURJT19UWVBFX1dDRE1BCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEFHCi0KLXByaXZhdGUgYW5kcm9pZC50ZWxlcGhvbnkuQ2VsbExvY2F0aW9uIGNlbGxMb2NhdGlvbgotCi1wcml2YXRlIGxvbmcgbmF0aXZlT2JqZWN0Ci0KLXByaXZhdGUgYW5kcm9pZC50ZWxlcGhvbnkuU2VydmljZVN0YXRlIHNlcnZpY2VTdGF0ZQotCi1wcml2YXRlIGludCBzaWduYWxTdHJlbmd0aAotCi1wcml2YXRlIGFuZHJvaWQudGVsZXBob255LlRlbGVwaG9ueU1hbmFnZXIgdGVsZXBob255TWFuYWdlcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQud2Via2l0LldlYlZpZXcKLWxvbmcpCi0KLXByaXZhdGUgdm9pZCBub3RpZnlMaXN0ZW5lcnMoKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBvblVwZGF0ZUF2YWlsYWJsZSgKLWFuZHJvaWQud2Via2l0LmdlYXJzLkFuZHJvaWRSYWRpb0RhdGFQcm92aWRlciRSYWRpb0RhdGEKLWxvbmcpCi0KLXB1YmxpYyB2b2lkIG9uQ2VsbExvY2F0aW9uQ2hhbmdlZCgKLWFuZHJvaWQudGVsZXBob255LkNlbGxMb2NhdGlvbikKLQotcHVibGljIHZvaWQgb25TZXJ2aWNlU3RhdGVDaGFuZ2VkKAotYW5kcm9pZC50ZWxlcGhvbnkuU2VydmljZVN0YXRlKQotCi1wdWJsaWMgdm9pZCBvblNpZ25hbFN0cmVuZ3RoQ2hhbmdlZCgKLWludCkKLQotcHVibGljIHZvaWQgc2h1dGRvd24oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQud2Via2l0LmdlYXJzLkRlc2t0b3BBbmRyb2lkIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDVElPTl9JTlNUQUxMX1NIT1JUQ1VUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQlJPV1NFUgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEJST1dTRVJfQUNUSVZJVFkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBFWFRSQV9TSE9SVENVVF9EVVBMSUNBVEUKLQotcHJpdmF0ZSBzdGF0aWMgaW50IE1BWF9IRUlHSFQKLQotcHJpdmF0ZSBzdGF0aWMgaW50IE1BWF9XSURUSAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRBRwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAgZ2V0Qml0bWFwKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyB2b2lkIHNldFNob3J0Y3V0KAotYW5kcm9pZC53ZWJraXQuV2ViVmlldwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93ZWJraXQvZ2VhcnMvR2VhcnNQbHVnaW5TZXR0aW5nczsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotIGNsYXNzIGFuZHJvaWQud2Via2l0LmdlYXJzLkdlYXJzUGx1Z2luU2V0dGluZ3MkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLmNvbnRlbnQuU2VydmljZUNvbm5lY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC53ZWJraXQuZ2VhcnMuR2VhcnNQbHVnaW5TZXR0aW5ncyB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLndlYmtpdC5nZWFycy5HZWFyc1BsdWdpblNldHRpbmdzKQotCi1wdWJsaWMgdm9pZCBvblNlcnZpY2VDb25uZWN0ZWQoCi1hbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZQotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgdm9pZCBvblNlcnZpY2VEaXNjb25uZWN0ZWQoCi1hbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93ZWJraXQvZ2VhcnMvR2VhcnNQbHVnaW5TZXR0aW5nczsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPUNsaWNrSGFuZGxlciApCi0gY2xhc3MgYW5kcm9pZC53ZWJraXQuZ2VhcnMuR2VhcnNQbHVnaW5TZXR0aW5ncyRDbGlja0hhbmRsZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC53ZWJraXQuUGx1Z2luJFByZWZlcmVuY2VzQ2xpY2tIYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQud2Via2l0LmdlYXJzLkdlYXJzUGx1Z2luU2V0dGluZ3MgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQud2Via2l0LmdlYXJzLkdlYXJzUGx1Z2luU2V0dGluZ3MpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQud2Via2l0LmdlYXJzLkdlYXJzUGx1Z2luU2V0dGluZ3MKLWFuZHJvaWQud2Via2l0LmdlYXJzLkdlYXJzUGx1Z2luU2V0dGluZ3MkMSkKLQotcHVibGljIHZvaWQgaGFuZGxlQ2xpY2tFdmVudCgKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MiBuYW1lID1TdGFydFNlcnZpY2UgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2Via2l0L2dlYXJzL0dlYXJzUGx1Z2luU2V0dGluZ3M7ICkKLSBjbGFzcyBhbmRyb2lkLndlYmtpdC5nZWFycy5HZWFyc1BsdWdpblNldHRpbmdzJFN0YXJ0U2VydmljZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmxhbmcuUnVubmFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC53ZWJraXQuZ2VhcnMuR2VhcnNQbHVnaW5TZXR0aW5ncyB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53ZWJraXQuZ2VhcnMuR2VhcnNQbHVnaW5TZXR0aW5ncykKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53ZWJraXQuZ2VhcnMuR2VhcnNQbHVnaW5TZXR0aW5ncwotYW5kcm9pZC53ZWJraXQuZ2VhcnMuR2VhcnNQbHVnaW5TZXR0aW5ncyQxKQotCi1wdWJsaWMgdm9pZCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvd2Via2l0L2dlYXJzL0dlYXJzUGx1Z2luU2V0dGluZ3MkU3RhcnRTZXJ2aWNlO0xhbmRyb2lkL3dlYmtpdC9nZWFycy9HZWFyc1BsdWdpblNldHRpbmdzJENsaWNrSGFuZGxlcjsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQud2Via2l0LmdlYXJzLkdlYXJzUGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEFHCi0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgY29udGV4dAotCi1wcml2YXRlIGFuZHJvaWQuY29udGVudC5TZXJ2aWNlQ29ubmVjdGlvbiBzZXJ2aWNlQ29ubmVjdGlvbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQud2Via2l0LlBsdWdpbikKLQotc3RhdGljIGFuZHJvaWQuY29udGVudC5Db250ZXh0IGFjY2VzcyQxMDAoCi1hbmRyb2lkLndlYmtpdC5nZWFycy5HZWFyc1BsdWdpblNldHRpbmdzKQotCi1zdGF0aWMgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgYWNjZXNzJDEwMigKLWFuZHJvaWQud2Via2l0LmdlYXJzLkdlYXJzUGx1Z2luU2V0dGluZ3MKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1zdGF0aWMgYW5kcm9pZC5jb250ZW50LlNlcnZpY2VDb25uZWN0aW9uIGFjY2VzcyQzMDAoCi1hbmRyb2lkLndlYmtpdC5nZWFycy5HZWFyc1BsdWdpblNldHRpbmdzKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkNDAwKAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIHJ1blNldHRpbmdzRGlhbG9nKAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2Via2l0L2dlYXJzL0h0bWxEaWFsb2dBbmRyb2lkOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi0gY2xhc3MgYW5kcm9pZC53ZWJraXQuZ2VhcnMuSHRtbERpYWxvZ0FuZHJvaWQkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLmNvbnRlbnQuU2VydmljZUNvbm5lY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC53ZWJraXQuZ2VhcnMuSHRtbERpYWxvZ0FuZHJvaWQgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53ZWJraXQuZ2VhcnMuSHRtbERpYWxvZ0FuZHJvaWQpCi0KLXB1YmxpYyB2b2lkIG9uU2VydmljZUNvbm5lY3RlZCgKLWFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXB1YmxpYyB2b2lkIG9uU2VydmljZURpc2Nvbm5lY3RlZCgKLWFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQud2Via2l0LmdlYXJzLkh0bWxEaWFsb2dBbmRyb2lkIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERJQUxPR19JTlRFUkZBQ0UKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBESUFMT0dfUEFDS0FHRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERJQUxPR19TRVJWSUNFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEFHCi0KLXByaXZhdGUgc3RhdGljIGFuZHJvaWQud2Via2l0LmdlYXJzLklHZWFyc0RpYWxvZ1NlcnZpY2UgZ2VhcnNEaWFsb2dTZXJ2aWNlCi0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LlNlcnZpY2VDb25uZWN0aW9uIGRlZmF1bHRTZXJ2aWNlQ29ubmVjdGlvbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuU2VydmljZUNvbm5lY3Rpb24gYWNjZXNzJDAwMCgKLWFuZHJvaWQud2Via2l0LmdlYXJzLkh0bWxEaWFsb2dBbmRyb2lkKQotCi1zdGF0aWMgYW5kcm9pZC53ZWJraXQuZ2VhcnMuSUdlYXJzRGlhbG9nU2VydmljZSBhY2Nlc3MkMTAyKAotYW5kcm9pZC53ZWJraXQuZ2VhcnMuSUdlYXJzRGlhbG9nU2VydmljZSkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGJpbmRUb1NlcnZpY2UoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC5jb250ZW50LlNlcnZpY2VDb25uZWN0aW9uKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgc2V0R2VhcnNEaWFsb2dTZXJ2aWNlKAotYW5kcm9pZC53ZWJraXQuZ2VhcnMuSUdlYXJzRGlhbG9nU2VydmljZSkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgcmVhZEhUTUwoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBzaG93RGlhbG9nKAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHN5bmNocm9ub3VzQmluZFRvU2VydmljZSgKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQud2Via2l0LmdlYXJzLkh0dHBSZXF1ZXN0QW5kcm9pZCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9TSVpFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVGQVVMVF9NSU1FX1RZUEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSEVBREVSU19NQVBfSU5ERVhfS0VZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhFQURFUlNfTUFQX0lOREVYX1ZBTFVFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSFRUUF9MSU5FX0VORElORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgS0VZX0NPTlRFTlRfTEVOR1RICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBLRVlfQ09OVEVOVF9UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBLRVlfRVRBRwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgS0VZX0VYUElSRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEtFWV9MQVNUX01PRElGSUVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBLRVlfTE9DQVRJT04KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMT0dfVEFHCi0KLXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbG9nRW5hYmxlZAotCi1wcml2YXRlIGJvb2xlYW4gYWJvcnRSZWNlaXZlZAotCi1wcml2YXRlIGFuZHJvaWQud2Via2l0LkNhY2hlTWFuYWdlciRDYWNoZVJlc3VsdCBjYWNoZVJlc3VsdAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgY2FjaGVSZXN1bHRVcmwKLQotcHJpdmF0ZSBqYXZhLmxhbmcuVGhyZWFkIGNoaWxkVGhyZWFkCi0KLXByaXZhdGUgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb24gY29ubmVjdGlvbgotCi1wcml2YXRlIGJvb2xlYW4gaW5CbG9ja2luZ09wZXJhdGlvbgotCi1wcml2YXRlIGphdmEuaW8uSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztbTGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuTWFwIHJlcXVlc3RIZWFkZXJzCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7W0xqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXByaXZhdGUgamF2YS51dGlsLk1hcCByZXNwb25zZUhlYWRlcnMKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlc3BvbnNlTGluZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIGFwcGx5UmVxdWVzdEhlYWRlcnNUb0Nvbm5lY3Rpb24oKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgZW5hYmxlTG9nZ2luZygKLWJvb2xlYW4pCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRDb29raWVGb3JVcmwoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHN0YXRpYyB2b2lkIGxvZygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDb29raWVGb3JVcmwoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHZvaWQgc2V0UmVzcG9uc2VIZWFkZXIoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHZvaWQgc3ludGhlc2l6ZUhlYWRlcnNGcm9tQ2FjaGVSZXN1bHQoCi1hbmRyb2lkLndlYmtpdC5DYWNoZU1hbmFnZXIkQ2FjaGVSZXN1bHQpCi0KLXB1YmxpYyBib29sZWFuIGFwcGVuZENhY2hlUmVzdWx0KAotYnl0ZVtdCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIGNvbm5lY3RUb1JlbW90ZSgpCi0KLXB1YmxpYyBib29sZWFuIGNyZWF0ZUNhY2hlUmVzdWx0KAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRBbGxSZXNwb25zZUhlYWRlcnMoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRSZXF1ZXN0SGVhZGVyKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UmVzcG9uc2VIZWFkZXIoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRSZXNwb25zZUxpbmUoKQotCi1wdWJsaWMgdm9pZCBpbml0Q2hpbGRUaHJlYWQoKQotCi1wdWJsaWMgdm9pZCBpbnRlcnJ1cHQoKQotCi1wdWJsaWMgYm9vbGVhbiBvcGVuKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJvb2xlYW4gcGFyc2VIZWFkZXJzKCkKLQotcHVibGljIGludCByZWNlaXZlKAotYnl0ZVtdKQotCi1wdWJsaWMgYm9vbGVhbiBzYXZlQ2FjaGVSZXN1bHQoKQotCi1wdWJsaWMgYm9vbGVhbiBzZW5kUG9zdERhdGEoCi1ieXRlW10KLWludCkKLQotcHVibGljIHZvaWQgc2V0UmVxdWVzdEhlYWRlcigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBib29sZWFuIHVzZUNhY2hlUmVzdWx0KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJvb2xlYW4gdXNlTG9jYWxTZXJ2ZXJSZXN1bHQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvd2Via2l0L2dlYXJzL0lHZWFyc0RpYWxvZ1NlcnZpY2UkU3R1YjsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLndlYmtpdC5nZWFycy5JR2VhcnNEaWFsb2dTZXJ2aWNlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuSUludGVyZmFjZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBzaG93RGlhbG9nKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93ZWJraXQvZ2VhcnMvSUdlYXJzRGlhbG9nU2VydmljZSRTdHViOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPVByb3h5ICkKLSBjbGFzcyBhbmRyb2lkLndlYmtpdC5nZWFycy5JR2VhcnNEaWFsb2dTZXJ2aWNlJFN0dWIkUHJveHkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC53ZWJraXQuZ2VhcnMuSUdlYXJzRGlhbG9nU2VydmljZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGFuZHJvaWQub3MuSUJpbmRlciBtUmVtb3RlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBzaG93RGlhbG9nKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93ZWJraXQvZ2VhcnMvSUdlYXJzRGlhbG9nU2VydmljZTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC93ZWJraXQvZ2VhcnMvSUdlYXJzRGlhbG9nU2VydmljZSRTdHViJFByb3h5OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwMzMgbmFtZSA9U3R1YiApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC53ZWJraXQuZ2VhcnMuSUdlYXJzRGlhbG9nU2VydmljZSRTdHViIGV4dGVuZHMgYW5kcm9pZC5vcy5CaW5kZXIgaW1wbGVtZW50cyBhbmRyb2lkLndlYmtpdC5nZWFycy5JR2VhcnNEaWFsb2dTZXJ2aWNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVTQ1JJUFRPUgotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3Nob3dEaWFsb2cKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQud2Via2l0LmdlYXJzLklHZWFyc0RpYWxvZ1NlcnZpY2UgYXNJbnRlcmZhY2UoCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gb25UcmFuc2FjdCgKLWludAotYW5kcm9pZC5vcy5QYXJjZWwKLWFuZHJvaWQub3MuUGFyY2VsCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPVNlcnZpY2VSZXF1ZXN0ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dlYmtpdC9nZWFycy9VcmxJbnRlcmNlcHRIYW5kbGVyR2VhcnM7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLndlYmtpdC5nZWFycy5VcmxJbnRlcmNlcHRIYW5kbGVyR2VhcnMkU2VydmljZVJlcXVlc3QgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7W0xqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXByaXZhdGUgamF2YS51dGlsLk1hcCByZXF1ZXN0SGVhZGVycwotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgdXJsCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7W0xqYXZhL2xhbmcvU3RyaW5nOz47KVYgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotamF2YS51dGlsLk1hcCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UmVxdWVzdEhlYWRlcigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFVybCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xIG5hbWUgPVNlcnZpY2VSZXNwb25zZSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93ZWJraXQvZ2VhcnMvVXJsSW50ZXJjZXB0SGFuZGxlckdlYXJzOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC53ZWJraXQuZ2VhcnMuVXJsSW50ZXJjZXB0SGFuZGxlckdlYXJzJFNlcnZpY2VSZXNwb25zZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGVuY29kaW5nCi0KLXByaXZhdGUgamF2YS5pby5JbnB1dFN0cmVhbSBpbnB1dFN0cmVhbQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbWltZVR5cGUKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztbTGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuTWFwIHJlc3BvbnNlSGVhZGVycwotCi1wcml2YXRlIGludCBzdGF0dXNDb2RlCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBzdGF0dXNMaW5lCi0KLWZpbmFsIGFuZHJvaWQud2Via2l0LmdlYXJzLlVybEludGVyY2VwdEhhbmRsZXJHZWFycyB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLndlYmtpdC5nZWFycy5VcmxJbnRlcmNlcHRIYW5kbGVyR2VhcnMpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldENvbnRlbnRUeXBlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RW5jb2RpbmcoKQotCi1wdWJsaWMgamF2YS5pby5JbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE1pbWVUeXBlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcvU3RyaW5nO1tMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wdWJsaWMgamF2YS51dGlsLk1hcCBnZXRSZXNwb25zZUhlYWRlcnMoKQotCi1wdWJsaWMgaW50IGdldFN0YXR1c0NvZGUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdGF0dXNMaW5lKCkKLQotcHVibGljIHZvaWQgc2V0UmVzcG9uc2VIZWFkZXIoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi0gdm9pZCBzZXRSZXN1bHRBcnJheSgKLWludAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotYnl0ZVtdKQotCi0gYm9vbGVhbiBzZXRSZXN1bHRGaWxlKAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvd2Via2l0L2dlYXJzL1VybEludGVyY2VwdEhhbmRsZXJHZWFycyRTZXJ2aWNlUmVzcG9uc2U7TGFuZHJvaWQvd2Via2l0L2dlYXJzL1VybEludGVyY2VwdEhhbmRsZXJHZWFycyRTZXJ2aWNlUmVxdWVzdDsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQud2Via2l0LmdlYXJzLlVybEludGVyY2VwdEhhbmRsZXJHZWFycyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLndlYmtpdC5VcmxJbnRlcmNlcHRIYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVUZGRVJfU0laRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0FDSEVfRVhQSVJZX01TCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhFQURFUlNfTUFQX0lOREVYX0tFWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBIRUFERVJTX01BUF9JTkRFWF9WQUxVRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIExPR19UQUcKLQotcHJpdmF0ZSBzdGF0aWMgYW5kcm9pZC53ZWJraXQuZ2VhcnMuVXJsSW50ZXJjZXB0SGFuZGxlckdlYXJzIGluc3RhbmNlCi0KLXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbG9nRW5hYmxlZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotc3RhdGljIHZvaWQgYWNjZXNzJDAwMCgKLWFuZHJvaWQud2Via2l0LmdlYXJzLlVybEludGVyY2VwdEhhbmRsZXJHZWFycwotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBib29sZWFuIGNvcHlTdHJlYW0oCi1qYXZhLmlvLklucHV0U3RyZWFtCi1qYXZhLmlvLk91dHB1dFN0cmVhbSkKLQotcHVibGljIHN0YXRpYyB2b2lkIGVuYWJsZUxvZ2dpbmcoCi1ib29sZWFuKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQud2Via2l0LmdlYXJzLlVybEludGVyY2VwdEhhbmRsZXJHZWFycyBnZXRJbnN0YW5jZSgpCi0KLXByaXZhdGUgdm9pZCBsb2coCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgYW5kcm9pZC53ZWJraXQuZ2VhcnMuVXJsSW50ZXJjZXB0SGFuZGxlckdlYXJzJFNlcnZpY2VSZXNwb25zZSBuYXRpdmVTZXJ2aWNlKAotYW5kcm9pZC53ZWJraXQuZ2VhcnMuVXJsSW50ZXJjZXB0SGFuZGxlckdlYXJzJFNlcnZpY2VSZXF1ZXN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1N0cmluZztMamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztbTGphdmEvbGFuZy9TdHJpbmc7PjspTGFuZHJvaWQvd2Via2l0L2dlYXJzL1VybEludGVyY2VwdEhhbmRsZXJHZWFycyRTZXJ2aWNlUmVzcG9uc2U7ICkKLXB1YmxpYyBhbmRyb2lkLndlYmtpdC5nZWFycy5VcmxJbnRlcmNlcHRIYW5kbGVyR2VhcnMkU2VydmljZVJlc3BvbnNlIGdldFNlcnZpY2VSZXNwb25zZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudXRpbC5NYXApCi0KLXB1YmxpYyB2b2lkIHJlZ2lzdGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7PjspTGFuZHJvaWQvd2Via2l0L0NhY2hlTWFuYWdlciRDYWNoZVJlc3VsdDsgKQotcHVibGljIGFuZHJvaWQud2Via2l0LkNhY2hlTWFuYWdlciRDYWNoZVJlc3VsdCBzZXJ2aWNlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS51dGlsLk1hcCkKLQotcHVibGljIHZvaWQgdW5yZWdpc3RlcigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgYW5kcm9pZC53ZWJraXQuZ2VhcnMuVmVyc2lvbkV4dHJhY3RvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBVUkwKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBWRVJTSU9OCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGV4dHJhY3QoCi1qYXZhLmxhbmcuU3RyaW5nCi1sb25nKQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGV4dHJhY3RUZXh0KAotb3JnLnczYy5kb20uRG9jdW1lbnQKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIHNldFZlcnNpb25BbmRVcmwoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1sb25nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQud2Via2l0LmdlYXJzLlppcEluZmxhdGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVGRkVSX1NJWkVfQllURVMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBEQVRBX1BBUlRJVElPTl9ST09UCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUEFUSF9OQVZJR0FUSU9OX0NPTVBPTkVOVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFNJWkVfTVVMVElQTElFUgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRBRwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBmcmVlU3BhY2UoKQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaW5mbGF0ZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotIGNsYXNzIGFuZHJvaWQud2lkZ2V0LkFic0xpc3RWaWV3JDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5sYW5nLlJ1bm5hYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQud2lkZ2V0LkFic0xpc3RWaWV3IHRoaXMkMAotCi1maW5hbCBhbmRyb2lkLnZpZXcuVmlldyB2YWwkY2hpbGQKLQotZmluYWwgYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXckUGVyZm9ybUNsaWNrIHZhbCRwZXJmb3JtQ2xpY2sKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLndpZGdldC5BYnNMaXN0VmlldwotYW5kcm9pZC52aWV3LlZpZXcKLWFuZHJvaWQud2lkZ2V0LkFic0xpc3RWaWV3JFBlcmZvcm1DbGljaykKLQotcHVibGljIHZvaWQgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvQWJzTGlzdFZpZXc7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MiBuYW1lID1XaW5kb3dSdW5ubmFibGUgKQotIGNsYXNzIGFuZHJvaWQud2lkZ2V0LkFic0xpc3RWaWV3JFdpbmRvd1J1bm5uYWJsZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBpbnQgbU9yaWdpbmFsQXR0YWNoQ291bnQKLQotZmluYWwgYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXcgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQud2lkZ2V0LkFic0xpc3RWaWV3KQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLndpZGdldC5BYnNMaXN0VmlldwotYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXckMSkKLQotcHVibGljIHZvaWQgcmVtZW1iZXJXaW5kb3dBdHRhY2hDb3VudCgpCi0KLXB1YmxpYyBib29sZWFuIHNhbWVXaW5kb3coKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9BYnNMaXN0VmlldzsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPUNoZWNrRm9yS2V5TG9uZ1ByZXNzICkKLSBjbGFzcyBhbmRyb2lkLndpZGdldC5BYnNMaXN0VmlldyRDaGVja0ZvcktleUxvbmdQcmVzcyBleHRlbmRzIGFuZHJvaWQud2lkZ2V0LkFic0xpc3RWaWV3JFdpbmRvd1J1bm5uYWJsZSBpbXBsZW1lbnRzIGphdmEubGFuZy5SdW5uYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLndpZGdldC5BYnNMaXN0VmlldyB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXcpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQud2lkZ2V0LkFic0xpc3RWaWV3Ci1hbmRyb2lkLndpZGdldC5BYnNMaXN0VmlldyQxKQotCi1wdWJsaWMgdm9pZCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9BYnNMaXN0VmlldzsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPUNoZWNrRm9yTG9uZ1ByZXNzICkKLSBjbGFzcyBhbmRyb2lkLndpZGdldC5BYnNMaXN0VmlldyRDaGVja0ZvckxvbmdQcmVzcyBleHRlbmRzIGFuZHJvaWQud2lkZ2V0LkFic0xpc3RWaWV3JFdpbmRvd1J1bm5uYWJsZSBpbXBsZW1lbnRzIGphdmEubGFuZy5SdW5uYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLndpZGdldC5BYnNMaXN0VmlldyB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXcpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQud2lkZ2V0LkFic0xpc3RWaWV3Ci1hbmRyb2lkLndpZGdldC5BYnNMaXN0VmlldyQxKQotCi1wdWJsaWMgdm9pZCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9BYnNMaXN0VmlldzsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNiBuYW1lID1DaGVja0ZvclRhcCApCi1maW5hbCBjbGFzcyBhbmRyb2lkLndpZGdldC5BYnNMaXN0VmlldyRDaGVja0ZvclRhcCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmxhbmcuUnVubmFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXcgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXcpCi0KLXB1YmxpYyB2b2lkIHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPUZsaW5nUnVubmFibGUgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L0Fic0xpc3RWaWV3OyApCi0gY2xhc3MgYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXckRmxpbmdSdW5uYWJsZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmxhbmcuUnVubmFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBpbnQgbUxhc3RGbGluZ1kKLQotcHJpdmF0ZSBhbmRyb2lkLndpZGdldC5TY3JvbGxlciBtU2Nyb2xsZXIKLQotZmluYWwgYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXcgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXcpCi0KLXByaXZhdGUgdm9pZCBlbmRGbGluZygpCi0KLXB1YmxpYyB2b2lkIHJ1bigpCi0KLXB1YmxpYyB2b2lkIHN0YXJ0KAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1MYXlvdXRQYXJhbXMgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L0Fic0xpc3RWaWV3OyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXckTGF5b3V0UGFyYW1zIGV4dGVuZHMgYW5kcm9pZC52aWV3LlZpZXdHcm91cCRMYXlvdXRQYXJhbXMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGludCB2aWV3VHlwZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC52aWV3LlZpZXdHcm91cCRMYXlvdXRQYXJhbXMpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L0Fic0xpc3RWaWV3OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9T25TY3JvbGxMaXN0ZW5lciApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQud2lkZ2V0LkFic0xpc3RWaWV3JE9uU2Nyb2xsTGlzdGVuZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDUk9MTF9TVEFURV9GTElORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ1JPTExfU1RBVEVfSURMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ1JPTExfU1RBVEVfVE9VQ0hfU0NST0xMCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgb25TY3JvbGwoCi1hbmRyb2lkLndpZGdldC5BYnNMaXN0VmlldwotaW50Ci1pbnQKLWludCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgb25TY3JvbGxTdGF0ZUNoYW5nZWQoCi1hbmRyb2lkLndpZGdldC5BYnNMaXN0VmlldwotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MiBuYW1lID1QZXJmb3JtQ2xpY2sgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L0Fic0xpc3RWaWV3OyApCi0gY2xhc3MgYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXckUGVyZm9ybUNsaWNrIGV4dGVuZHMgYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXckV2luZG93UnVubm5hYmxlIGltcGxlbWVudHMgamF2YS5sYW5nLlJ1bm5hYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBhbmRyb2lkLnZpZXcuVmlldyBtQ2hpbGQKLQotIGludCBtQ2xpY2tNb3Rpb25Qb3NpdGlvbgotCi1maW5hbCBhbmRyb2lkLndpZGdldC5BYnNMaXN0VmlldyB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXcpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQud2lkZ2V0LkFic0xpc3RWaWV3Ci1hbmRyb2lkLndpZGdldC5BYnNMaXN0VmlldyQxKQotCi1wdWJsaWMgdm9pZCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1SZWN5Y2xlQmluICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9BYnNMaXN0VmlldzsgKQotIGNsYXNzIGFuZHJvaWQud2lkZ2V0LkFic0xpc3RWaWV3JFJlY3ljbGVCaW4gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYW5kcm9pZC52aWV3LlZpZXdbXSBtQWN0aXZlVmlld3MKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0FycmF5TGlzdDxMYW5kcm9pZC92aWV3L1ZpZXc7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuQXJyYXlMaXN0IG1DdXJyZW50U2NyYXAKLQotcHJpdmF0ZSBpbnQgbUZpcnN0QWN0aXZlUG9zaXRpb24KLQotcHJpdmF0ZSBhbmRyb2lkLndpZGdldC5BYnNMaXN0VmlldyRSZWN5Y2xlckxpc3RlbmVyIG1SZWN5Y2xlckxpc3RlbmVyCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9W0xqYXZhL3V0aWwvQXJyYXlMaXN0PExhbmRyb2lkL3ZpZXcvVmlldzs+OyApCi1wcml2YXRlIGphdmEudXRpbC5BcnJheUxpc3RbXSBtU2NyYXBWaWV3cwotCi1wcml2YXRlIGludCBtVmlld1R5cGVDb3VudAotCi1maW5hbCBhbmRyb2lkLndpZGdldC5BYnNMaXN0VmlldyB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLndpZGdldC5BYnNMaXN0VmlldykKLQotc3RhdGljIGFuZHJvaWQud2lkZ2V0LkFic0xpc3RWaWV3JFJlY3ljbGVyTGlzdGVuZXIgYWNjZXNzJDE1MDAoCi1hbmRyb2lkLndpZGdldC5BYnNMaXN0VmlldyRSZWN5Y2xlQmluKQotCi1zdGF0aWMgYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXckUmVjeWNsZXJMaXN0ZW5lciBhY2Nlc3MkMTUwMigKLWFuZHJvaWQud2lkZ2V0LkFic0xpc3RWaWV3JFJlY3ljbGVCaW4KLWFuZHJvaWQud2lkZ2V0LkFic0xpc3RWaWV3JFJlY3ljbGVyTGlzdGVuZXIpCi0KLXByaXZhdGUgdm9pZCBwcnVuZVNjcmFwVmlld3MoKQotCi0gdm9pZCBhZGRTY3JhcFZpZXcoCi1hbmRyb2lkLnZpZXcuVmlldykKLQotIHZvaWQgY2xlYXIoKQotCi0gdm9pZCBmaWxsQWN0aXZlVmlld3MoCi1pbnQKLWludCkKLQotIGFuZHJvaWQudmlldy5WaWV3IGdldEFjdGl2ZVZpZXcoCi1pbnQpCi0KLSBhbmRyb2lkLnZpZXcuVmlldyBnZXRTY3JhcFZpZXcoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC92aWV3L1ZpZXc7PjspViApCi0gdm9pZCByZWNsYWltU2NyYXBWaWV3cygKLWphdmEudXRpbC5MaXN0KQotCi0gdm9pZCBzY3JhcEFjdGl2ZVZpZXdzKCkKLQotcHVibGljIHZvaWQgc2V0Vmlld1R5cGVDb3VudCgKLWludCkKLQotcHVibGljIGJvb2xlYW4gc2hvdWxkUmVjeWNsZVZpZXdUeXBlKAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1SZWN5Y2xlckxpc3RlbmVyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9BYnNMaXN0VmlldzsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLndpZGdldC5BYnNMaXN0VmlldyRSZWN5Y2xlckxpc3RlbmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uTW92ZWRUb1NjcmFwSGVhcCgKLWFuZHJvaWQudmlldy5WaWV3KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I8TGFuZHJvaWQvd2lkZ2V0L0Fic0xpc3RWaWV3JFNhdmVkU3RhdGU7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L0Fic0xpc3RWaWV3JFNhdmVkU3RhdGU7ICkKLWZpbmFsIGNsYXNzIGFuZHJvaWQud2lkZ2V0LkFic0xpc3RWaWV3JFNhdmVkU3RhdGUkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBhbmRyb2lkLndpZGdldC5BYnNMaXN0VmlldyRTYXZlZFN0YXRlIGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXckU2F2ZWRTdGF0ZVtdIG5ld0FycmF5KAotaW50KQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdFtdIG5ld0FycmF5KAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1TYXZlZFN0YXRlICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9BYnNMaXN0VmlldzsgKQotIGNsYXNzIGFuZHJvaWQud2lkZ2V0LkFic0xpc3RWaWV3JFNhdmVkU3RhdGUgZXh0ZW5kcyBhbmRyb2lkLnZpZXcuVmlldyRCYXNlU2F2ZWRTdGF0ZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC93aWRnZXQvQWJzTGlzdFZpZXckU2F2ZWRTdGF0ZTs+OyApCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yIENSRUFUT1IKLQotIGphdmEubGFuZy5TdHJpbmcgZmlsdGVyCi0KLSBsb25nIGZpcnN0SWQKLQotIGludCBoZWlnaHQKLQotIGludCBwb3NpdGlvbgotCi0gbG9uZyBzZWxlY3RlZElkCi0KLSBpbnQgdmlld1RvcAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuUGFyY2VsKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLlBhcmNlbAotYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXckMSkKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5QYXJjZWxhYmxlKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLXB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L0FkYXB0ZXJWaWV3JDE7TGFuZHJvaWQvd2lkZ2V0L0FkYXB0ZXJWaWV3JFNlbGVjdGlvbk5vdGlmaWVyO0xhbmRyb2lkL3dpZGdldC9BZGFwdGVyVmlldyRBZGFwdGVyRGF0YVNldE9ic2VydmVyO0xhbmRyb2lkL3dpZGdldC9BZGFwdGVyVmlldyRBZGFwdGVyQ29udGV4dE1lbnVJbmZvO0xhbmRyb2lkL3dpZGdldC9BZGFwdGVyVmlldyRPbkl0ZW1TZWxlY3RlZExpc3RlbmVyO0xhbmRyb2lkL3dpZGdldC9BZGFwdGVyVmlldyRPbkl0ZW1Mb25nQ2xpY2tMaXN0ZW5lcjtMYW5kcm9pZC93aWRnZXQvQWRhcHRlclZpZXckT25JdGVtQ2xpY2tMaXN0ZW5lcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOjpMYW5kcm9pZC93aWRnZXQvQWRhcHRlcjs+TGFuZHJvaWQvdmlldy9WaWV3R3JvdXA7ICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldyBleHRlbmRzIGFuZHJvaWQudmlldy5WaWV3R3JvdXAKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBpbnQgSU5WQUxJRF9QT1NJVElPTgotCi1wdWJsaWMgc3RhdGljIGxvbmcgSU5WQUxJRF9ST1dfSUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSVRFTV9WSUVXX1RZUEVfSEVBREVSX09SX0ZPT1RFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJVEVNX1ZJRVdfVFlQRV9JR05PUkUKLQotc3RhdGljIGZpbmFsIGludCBTWU5DX0ZJUlNUX1BPU0lUSU9OCi0KLXN0YXRpYyBmaW5hbCBpbnQgU1lOQ19NQVhfRFVSQVRJT05fTUlMTElTCi0KLXN0YXRpYyBmaW5hbCBpbnQgU1lOQ19TRUxFQ1RFRF9QT1NJVElPTgotCi0gYm9vbGVhbiBtQmxvY2tMYXlvdXRSZXF1ZXN0cwotCi0gYm9vbGVhbiBtRGF0YUNoYW5nZWQKLQotcHJpdmF0ZSBib29sZWFuIG1EZXNpcmVkRm9jdXNhYmxlSW5Ub3VjaE1vZGVTdGF0ZQotCi1wcml2YXRlIGJvb2xlYW4gbURlc2lyZWRGb2N1c2FibGVTdGF0ZQotCi0gYW5kcm9pZC52aWV3LlZpZXcgbUVtcHR5VmlldwotQGFuZHJvaWQudmlldy5WaWV3RGVidWckRXhwb3J0ZWRQcm9wZXJ0eQotIGludCBtRmlyc3RQb3NpdGlvbgotCi0gYm9vbGVhbiBtSW5MYXlvdXQKLUBhbmRyb2lkLnZpZXcuVmlld0RlYnVnJEV4cG9ydGVkUHJvcGVydHkKLSBpbnQgbUl0ZW1Db3VudAotCi1wcml2YXRlIGludCBtTGF5b3V0SGVpZ2h0Ci0KLSBib29sZWFuIG1OZWVkU3luYwotQGFuZHJvaWQudmlldy5WaWV3RGVidWckRXhwb3J0ZWRQcm9wZXJ0eQotIGludCBtTmV4dFNlbGVjdGVkUG9zaXRpb24KLQotIGxvbmcgbU5leHRTZWxlY3RlZFJvd0lkCi0KLSBpbnQgbU9sZEl0ZW1Db3VudAotCi0gaW50IG1PbGRTZWxlY3RlZFBvc2l0aW9uCi0KLSBsb25nIG1PbGRTZWxlY3RlZFJvd0lkCi0KLSBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldyRPbkl0ZW1DbGlja0xpc3RlbmVyIG1Pbkl0ZW1DbGlja0xpc3RlbmVyCi0KLSBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldyRPbkl0ZW1Mb25nQ2xpY2tMaXN0ZW5lciBtT25JdGVtTG9uZ0NsaWNrTGlzdGVuZXIKLQotIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3JE9uSXRlbVNlbGVjdGVkTGlzdGVuZXIgbU9uSXRlbVNlbGVjdGVkTGlzdGVuZXIKLUBhbmRyb2lkLnZpZXcuVmlld0RlYnVnJEV4cG9ydGVkUHJvcGVydHkKLSBpbnQgbVNlbGVjdGVkUG9zaXRpb24KLQotIGxvbmcgbVNlbGVjdGVkUm93SWQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvQWRhcHRlclZpZXc8VFQ7Pi5TZWxlY3Rpb25Ob3RpZmllcjsgKQotcHJpdmF0ZSBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldyRTZWxlY3Rpb25Ob3RpZmllciBtU2VsZWN0aW9uTm90aWZpZXIKLQotIGludCBtU3BlY2lmaWNUb3AKLQotIGxvbmcgbVN5bmNIZWlnaHQKLQotIGludCBtU3luY01vZGUKLQotIGludCBtU3luY1Bvc2l0aW9uCi0KLSBsb25nIG1TeW5jUm93SWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQKLWludCkKLQotc3RhdGljIHZvaWQgYWNjZXNzJDAwMCgKLWFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3Ci1hbmRyb2lkLm9zLlBhcmNlbGFibGUpCi0KLXN0YXRpYyBhbmRyb2lkLm9zLlBhcmNlbGFibGUgYWNjZXNzJDEwMCgKLWFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3KQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMjAwKAotYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXcpCi0KLXByaXZhdGUgdm9pZCBmaXJlT25TZWxlY3RlZCgpCi0KLXByaXZhdGUgdm9pZCB1cGRhdGVFbXB0eVN0YXR1cygKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIGFkZFZpZXcoCi1hbmRyb2lkLnZpZXcuVmlldykKLQotcHVibGljIHZvaWQgYWRkVmlldygKLWFuZHJvaWQudmlldy5WaWV3Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIGFkZFZpZXcoCi1hbmRyb2lkLnZpZXcuVmlldwotaW50Ci1hbmRyb2lkLnZpZXcuVmlld0dyb3VwJExheW91dFBhcmFtcykKLQotcHVibGljIHZvaWQgYWRkVmlldygKLWFuZHJvaWQudmlldy5WaWV3Ci1hbmRyb2lkLnZpZXcuVmlld0dyb3VwJExheW91dFBhcmFtcykKLQotcHJvdGVjdGVkIGJvb2xlYW4gY2FuQW5pbWF0ZSgpCi0KLSB2b2lkIGNoZWNrRm9jdXMoKQotCi0gdm9pZCBjaGVja1NlbGVjdGlvbkNoYW5nZWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMYW5kcm9pZC91dGlsL1NwYXJzZUFycmF5PExhbmRyb2lkL29zL1BhcmNlbGFibGU7PjspViApCi1wcm90ZWN0ZWQgdm9pZCBkaXNwYXRjaFJlc3RvcmVJbnN0YW5jZVN0YXRlKAotYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMYW5kcm9pZC91dGlsL1NwYXJzZUFycmF5PExhbmRyb2lkL29zL1BhcmNlbGFibGU7PjspViApCi1wcm90ZWN0ZWQgdm9pZCBkaXNwYXRjaFNhdmVJbnN0YW5jZVN0YXRlKAotYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5KQotCi0gaW50IGZpbmRTeW5jUG9zaXRpb24oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVFQ7ICkKLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLndpZGdldC5BZGFwdGVyIGdldEFkYXB0ZXIoKQotQGFuZHJvaWQudmlldy5WaWV3RGVidWckQ2FwdHVyZWRWaWV3UHJvcGVydHkKLXB1YmxpYyBpbnQgZ2V0Q291bnQoKQotCi1wdWJsaWMgYW5kcm9pZC52aWV3LlZpZXcgZ2V0RW1wdHlWaWV3KCkKLQotcHVibGljIGludCBnZXRGaXJzdFZpc2libGVQb3NpdGlvbigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldEl0ZW1BdFBvc2l0aW9uKAotaW50KQotCi1wdWJsaWMgbG9uZyBnZXRJdGVtSWRBdFBvc2l0aW9uKAotaW50KQotCi1wdWJsaWMgaW50IGdldExhc3RWaXNpYmxlUG9zaXRpb24oKQotCi1wdWJsaWMgZmluYWwgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXckT25JdGVtQ2xpY2tMaXN0ZW5lciBnZXRPbkl0ZW1DbGlja0xpc3RlbmVyKCkKLQotcHVibGljIGZpbmFsIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3JE9uSXRlbUxvbmdDbGlja0xpc3RlbmVyIGdldE9uSXRlbUxvbmdDbGlja0xpc3RlbmVyKCkKLQotcHVibGljIGZpbmFsIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3JE9uSXRlbVNlbGVjdGVkTGlzdGVuZXIgZ2V0T25JdGVtU2VsZWN0ZWRMaXN0ZW5lcigpCi0KLXB1YmxpYyBpbnQgZ2V0UG9zaXRpb25Gb3JWaWV3KAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldFNlbGVjdGVkSXRlbSgpCi1AYW5kcm9pZC52aWV3LlZpZXdEZWJ1ZyRDYXB0dXJlZFZpZXdQcm9wZXJ0eQotcHVibGljIGxvbmcgZ2V0U2VsZWN0ZWRJdGVtSWQoKQotQGFuZHJvaWQudmlldy5WaWV3RGVidWckQ2FwdHVyZWRWaWV3UHJvcGVydHkKLXB1YmxpYyBpbnQgZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKQotCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC52aWV3LlZpZXcgZ2V0U2VsZWN0ZWRWaWV3KCkKLQotIHZvaWQgaGFuZGxlRGF0YUNoYW5nZWQoKQotCi0gYm9vbGVhbiBpc0luRmlsdGVyTW9kZSgpCi0KLSBpbnQgbG9va0ZvclNlbGVjdGFibGVQb3NpdGlvbigKLWludAotYm9vbGVhbikKLQotcHJvdGVjdGVkIHZvaWQgb25MYXlvdXQoCi1ib29sZWFuCi1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBib29sZWFuIHBlcmZvcm1JdGVtQ2xpY2soCi1hbmRyb2lkLnZpZXcuVmlldwotaW50Ci1sb25nKQotCi0gdm9pZCByZW1lbWJlclN5bmNTdGF0ZSgpCi0KLXB1YmxpYyB2b2lkIHJlbW92ZUFsbFZpZXdzKCkKLQotcHVibGljIHZvaWQgcmVtb3ZlVmlldygKLWFuZHJvaWQudmlldy5WaWV3KQotCi1wdWJsaWMgdm9pZCByZW1vdmVWaWV3QXQoCi1pbnQpCi0KLSB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUVDspViApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRBZGFwdGVyKAotYW5kcm9pZC53aWRnZXQuQWRhcHRlcikKLQotcHVibGljIHZvaWQgc2V0RW1wdHlWaWV3KAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXB1YmxpYyB2b2lkIHNldEZvY3VzYWJsZSgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldEZvY3VzYWJsZUluVG91Y2hNb2RlKAotYm9vbGVhbikKLQotIHZvaWQgc2V0TmV4dFNlbGVjdGVkUG9zaXRpb25JbnQoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldE9uQ2xpY2tMaXN0ZW5lcigKLWFuZHJvaWQudmlldy5WaWV3JE9uQ2xpY2tMaXN0ZW5lcikKLQotcHVibGljIHZvaWQgc2V0T25JdGVtQ2xpY2tMaXN0ZW5lcigKLWFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3JE9uSXRlbUNsaWNrTGlzdGVuZXIpCi0KLXB1YmxpYyB2b2lkIHNldE9uSXRlbUxvbmdDbGlja0xpc3RlbmVyKAotYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXckT25JdGVtTG9uZ0NsaWNrTGlzdGVuZXIpCi0KLXB1YmxpYyB2b2lkIHNldE9uSXRlbVNlbGVjdGVkTGlzdGVuZXIoCi1hbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldyRPbkl0ZW1TZWxlY3RlZExpc3RlbmVyKQotCi0gdm9pZCBzZXRTZWxlY3RlZFBvc2l0aW9uSW50KAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRTZWxlY3Rpb24oCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9BZGFwdGVyVmlldzxMYW5kcm9pZC93aWRnZXQvTGlzdEFkYXB0ZXI7PjtMYW5kcm9pZC90ZXh0L1RleHRXYXRjaGVyO0xhbmRyb2lkL3ZpZXcvVmlld1RyZWVPYnNlcnZlciRPbkdsb2JhbExheW91dExpc3RlbmVyO0xhbmRyb2lkL3dpZGdldC9GaWx0ZXIkRmlsdGVyTGlzdGVuZXI7TGFuZHJvaWQvdmlldy9WaWV3VHJlZU9ic2VydmVyJE9uVG91Y2hNb2RlQ2hhbmdlTGlzdGVuZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L0Fic0xpc3RWaWV3JFJlY3ljbGVCaW47TGFuZHJvaWQvd2lkZ2V0L0Fic0xpc3RWaWV3JFJlY3ljbGVyTGlzdGVuZXI7TGFuZHJvaWQvd2lkZ2V0L0Fic0xpc3RWaWV3JExheW91dFBhcmFtcztMYW5kcm9pZC93aWRnZXQvQWJzTGlzdFZpZXckRmxpbmdSdW5uYWJsZTtMYW5kcm9pZC93aWRnZXQvQWJzTGlzdFZpZXckQ2hlY2tGb3JUYXA7TGFuZHJvaWQvd2lkZ2V0L0Fic0xpc3RWaWV3JENoZWNrRm9yS2V5TG9uZ1ByZXNzO0xhbmRyb2lkL3dpZGdldC9BYnNMaXN0VmlldyRDaGVja0ZvckxvbmdQcmVzcztMYW5kcm9pZC93aWRnZXQvQWJzTGlzdFZpZXckUGVyZm9ybUNsaWNrO0xhbmRyb2lkL3dpZGdldC9BYnNMaXN0VmlldyRXaW5kb3dSdW5ubmFibGU7TGFuZHJvaWQvd2lkZ2V0L0Fic0xpc3RWaWV3JFNhdmVkU3RhdGU7TGFuZHJvaWQvd2lkZ2V0L0Fic0xpc3RWaWV3JE9uU2Nyb2xsTGlzdGVuZXI7ICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBhbmRyb2lkLndpZGdldC5BYnNMaXN0VmlldyBleHRlbmRzIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3IGltcGxlbWVudHMgYW5kcm9pZC50ZXh0LlRleHRXYXRjaGVyLCBhbmRyb2lkLnZpZXcuVmlld1RyZWVPYnNlcnZlciRPbkdsb2JhbExheW91dExpc3RlbmVyLCBhbmRyb2lkLndpZGdldC5GaWx0ZXIkRmlsdGVyTGlzdGVuZXIsIGFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyJE9uVG91Y2hNb2RlQ2hhbmdlTGlzdGVuZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIGludCBMQVlPVVRfRk9SQ0VfQk9UVE9NCi0KLXN0YXRpYyBmaW5hbCBpbnQgTEFZT1VUX0ZPUkNFX1RPUAotCi1zdGF0aWMgZmluYWwgaW50IExBWU9VVF9NT1ZFX1NFTEVDVElPTgotCi1zdGF0aWMgZmluYWwgaW50IExBWU9VVF9OT1JNQUwKLQotc3RhdGljIGZpbmFsIGludCBMQVlPVVRfU0VUX1NFTEVDVElPTgotCi1zdGF0aWMgZmluYWwgaW50IExBWU9VVF9TUEVDSUZJQwotCi1zdGF0aWMgZmluYWwgaW50IExBWU9VVF9TWU5DCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gUFJPRklMRV9GTElOR0lORwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFBST0ZJTEVfU0NST0xMSU5HCi0KLXN0YXRpYyBmaW5hbCBpbnQgVE9VQ0hfTU9ERV9ET05FX1dBSVRJTkcKLQotc3RhdGljIGZpbmFsIGludCBUT1VDSF9NT0RFX0RPV04KLQotc3RhdGljIGZpbmFsIGludCBUT1VDSF9NT0RFX0ZMSU5HCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT1VDSF9NT0RFX09GRgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVE9VQ0hfTU9ERV9PTgotCi1zdGF0aWMgZmluYWwgaW50IFRPVUNIX01PREVfUkVTVAotCi1zdGF0aWMgZmluYWwgaW50IFRPVUNIX01PREVfU0NST0xMCi0KLXN0YXRpYyBmaW5hbCBpbnQgVE9VQ0hfTU9ERV9UQVAKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPVUNIX01PREVfVU5LTk9XTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUUkFOU0NSSVBUX01PREVfQUxXQVlTX1NDUk9MTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUUkFOU0NSSVBUX01PREVfRElTQUJMRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNDUklQVF9NT0RFX05PUk1BTAotCi0gYW5kcm9pZC53aWRnZXQuTGlzdEFkYXB0ZXIgbUFkYXB0ZXIKLQotcHJpdmF0ZSBpbnQgbUNhY2hlQ29sb3JIaW50Ci0KLSBib29sZWFuIG1DYWNoaW5nU3RhcnRlZAotCi1wcml2YXRlIGFuZHJvaWQudmlldy5Db250ZXh0TWVudSRDb250ZXh0TWVudUluZm8gbUNvbnRleHRNZW51SW5mbwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9BZGFwdGVyVmlldzxMYW5kcm9pZC93aWRnZXQvTGlzdEFkYXB0ZXI7Pi5BZGFwdGVyRGF0YVNldE9ic2VydmVyOyApCi0gYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXckQWRhcHRlckRhdGFTZXRPYnNlcnZlciBtRGF0YVNldE9ic2VydmVyCi0KLSBib29sZWFuIG1EcmF3U2VsZWN0b3JPblRvcAotCi1wcml2YXRlIGJvb2xlYW4gbUZpbHRlcmVkCi0KLXByaXZhdGUgYm9vbGVhbiBtRmxpbmdQcm9maWxpbmdTdGFydGVkCi0KLXByaXZhdGUgYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXckRmxpbmdSdW5uYWJsZSBtRmxpbmdSdW5uYWJsZQotCi1wcml2YXRlIGJvb2xlYW4gbUlzQ2hpbGRWaWV3RW5hYmxlZAotCi1wcml2YXRlIGludCBtTGFzdFNjcm9sbFN0YXRlCi0KLXByaXZhdGUgaW50IG1MYXN0VG91Y2hNb2RlCi0KLSBpbnQgbUxhc3RZCi0KLSBpbnQgbUxheW91dE1vZGUKLQotIGFuZHJvaWQuZ3JhcGhpY3MuUmVjdCBtTGlzdFBhZGRpbmcKLQotIGludCBtTW90aW9uQ29ycmVjdGlvbgotCi0gaW50IG1Nb3Rpb25Qb3NpdGlvbgotCi0gaW50IG1Nb3Rpb25WaWV3TmV3VG9wCi0KLSBpbnQgbU1vdGlvblZpZXdPcmlnaW5hbFRvcAotCi0gaW50IG1Nb3Rpb25YCi0KLSBpbnQgbU1vdGlvblkKLQotcHJpdmF0ZSBhbmRyb2lkLndpZGdldC5BYnNMaXN0VmlldyRPblNjcm9sbExpc3RlbmVyIG1PblNjcm9sbExpc3RlbmVyCi0KLXByaXZhdGUgYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXckQ2hlY2tGb3JLZXlMb25nUHJlc3MgbVBlbmRpbmdDaGVja0ZvcktleUxvbmdQcmVzcwotCi1wcml2YXRlIGFuZHJvaWQud2lkZ2V0LkFic0xpc3RWaWV3JENoZWNrRm9yTG9uZ1ByZXNzIG1QZW5kaW5nQ2hlY2tGb3JMb25nUHJlc3MKLQotcHJpdmF0ZSBqYXZhLmxhbmcuUnVubmFibGUgbVBlbmRpbmdDaGVja0ZvclRhcAotCi1wcml2YXRlIGFuZHJvaWQud2lkZ2V0LkFic0xpc3RWaWV3JFBlcmZvcm1DbGljayBtUGVyZm9ybUNsaWNrCi0KLSBhbmRyb2lkLndpZGdldC5Qb3B1cFdpbmRvdyBtUG9wdXAKLQotZmluYWwgYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXckUmVjeWNsZUJpbiBtUmVjeWNsZXIKLQotIGludCBtUmVzdXJyZWN0VG9Qb3NpdGlvbgotCi0gYW5kcm9pZC52aWV3LlZpZXcgbVNjcm9sbERvd24KLQotcHJpdmF0ZSBib29sZWFuIG1TY3JvbGxQcm9maWxpbmdTdGFydGVkCi0KLSBhbmRyb2lkLnZpZXcuVmlldyBtU2Nyb2xsVXAKLQotIGJvb2xlYW4gbVNjcm9sbGluZ0NhY2hlRW5hYmxlZAotCi0gaW50IG1TZWxlY3RlZFRvcAotCi0gaW50IG1TZWxlY3Rpb25Cb3R0b21QYWRkaW5nCi0KLSBpbnQgbVNlbGVjdGlvbkxlZnRQYWRkaW5nCi0KLSBpbnQgbVNlbGVjdGlvblJpZ2h0UGFkZGluZwotCi0gaW50IG1TZWxlY3Rpb25Ub3BQYWRkaW5nCi0KLSBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIG1TZWxlY3RvcgotCi0gYW5kcm9pZC5ncmFwaGljcy5SZWN0IG1TZWxlY3RvclJlY3QKLQotIGJvb2xlYW4gbVN0YWNrRnJvbUJvdHRvbQotCi0gYW5kcm9pZC53aWRnZXQuRWRpdFRleHQgbVRleHRGaWx0ZXIKLQotcHJpdmF0ZSBib29sZWFuIG1UZXh0RmlsdGVyRW5hYmxlZAotCi1wcml2YXRlIGFuZHJvaWQuZ3JhcGhpY3MuUmVjdCBtVG91Y2hGcmFtZQotCi0gaW50IG1Ub3VjaE1vZGUKLQotcHJpdmF0ZSBpbnQgbVRyYW5zY3JpcHRNb2RlCi0KLXByaXZhdGUgYW5kcm9pZC52aWV3LlZlbG9jaXR5VHJhY2tlciBtVmVsb2NpdHlUcmFja2VyCi0KLSBpbnQgbVdpZHRoTWVhc3VyZVNwZWMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ci1pbnQpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQxMDAwKAotYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXcpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDExMDAoCi1hbmRyb2lkLndpZGdldC5BYnNMaXN0VmlldykKLQotc3RhdGljIGludCBhY2Nlc3MkMTIwMCgKLWFuZHJvaWQud2lkZ2V0LkFic0xpc3RWaWV3KQotCi1zdGF0aWMgaW50IGFjY2VzcyQxMzAwKAotYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXcpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDE0MDAoCi1hbmRyb2lkLndpZGdldC5BYnNMaXN0VmlldykKLQotc3RhdGljIHZvaWQgYWNjZXNzJDE2MDAoCi1hbmRyb2lkLndpZGdldC5BYnNMaXN0VmlldwotYW5kcm9pZC52aWV3LlZpZXcKLWJvb2xlYW4pCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQxNzAwKAotYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXcKLWFuZHJvaWQudmlldy5WaWV3Ci1ib29sZWFuKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMTgwMCgKLWFuZHJvaWQud2lkZ2V0LkFic0xpc3RWaWV3Ci1hbmRyb2lkLnZpZXcuVmlldwotYm9vbGVhbikKLQotc3RhdGljIGludCBhY2Nlc3MkMjAwKAotYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXcpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDMwMCgKLWFuZHJvaWQud2lkZ2V0LkFic0xpc3RWaWV3KQotCi1zdGF0aWMgYm9vbGVhbiBhY2Nlc3MkNTAwKAotYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXcKLWFuZHJvaWQudmlldy5WaWV3Ci1pbnQKLWxvbmcpCi0KLXN0YXRpYyBhbmRyb2lkLndpZGdldC5BYnNMaXN0VmlldyRDaGVja0ZvckxvbmdQcmVzcyBhY2Nlc3MkNjAwKAotYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXcpCi0KLXN0YXRpYyBhbmRyb2lkLndpZGdldC5BYnNMaXN0VmlldyRDaGVja0ZvckxvbmdQcmVzcyBhY2Nlc3MkNjAyKAotYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXcKLWFuZHJvaWQud2lkZ2V0LkFic0xpc3RWaWV3JENoZWNrRm9yTG9uZ1ByZXNzKQotCi1zdGF0aWMgYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXckT25TY3JvbGxMaXN0ZW5lciBhY2Nlc3MkOTAwKAotYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXcpCi0KLXByaXZhdGUgdm9pZCBjbGVhclNjcm9sbGluZ0NhY2hlKCkKLQotcHJpdmF0ZSB2b2lkIGNyZWF0ZVNjcm9sbGluZ0NhY2hlKCkKLQotcHJpdmF0ZSB2b2lkIGNyZWF0ZVRleHRGaWx0ZXIoCi1ib29sZWFuKQotCi1wcml2YXRlIHZvaWQgZHJhd1NlbGVjdG9yKAotYW5kcm9pZC5ncmFwaGljcy5DYW52YXMpCi0KLXN0YXRpYyBpbnQgZ2V0RGlzdGFuY2UoCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3QKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdAotaW50KQotCi1wcml2YXRlIHZvaWQgaW5pdEFic0xpc3RWaWV3KCkKLQotcHJpdmF0ZSBib29sZWFuIHBlcmZvcm1Mb25nUHJlc3MoCi1hbmRyb2lkLnZpZXcuVmlldwotaW50Ci1sb25nKQotCi1wcml2YXRlIHZvaWQgcG9zaXRpb25TZWxlY3RvcigKLWludAotaW50Ci1pbnQKLWludCkKLQotcHJpdmF0ZSB2b2lkIHJlcG9ydFNjcm9sbFN0YXRlQ2hhbmdlKAotaW50KQotCi1wcml2YXRlIHZvaWQgc2hvd1BvcHVwKCkKLQotcHJpdmF0ZSBib29sZWFuIHN0YXJ0U2Nyb2xsSWZOZWVkZWQoCi1pbnQpCi0KLXByaXZhdGUgdm9pZCB1c2VEZWZhdWx0U2VsZWN0b3IoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0FycmF5TGlzdDxMYW5kcm9pZC92aWV3L1ZpZXc7PjspViApCi1wdWJsaWMgdm9pZCBhZGRUb3VjaGFibGVzKAotamF2YS51dGlsLkFycmF5TGlzdCkKLQotcHVibGljIHZvaWQgYWZ0ZXJUZXh0Q2hhbmdlZCgKLWFuZHJvaWQudGV4dC5FZGl0YWJsZSkKLQotcHVibGljIHZvaWQgYmVmb3JlVGV4dENoYW5nZWQoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludAotaW50KQotCi1wcm90ZWN0ZWQgYm9vbGVhbiBjaGVja0xheW91dFBhcmFtcygKLWFuZHJvaWQudmlldy5WaWV3R3JvdXAkTGF5b3V0UGFyYW1zKQotCi1wdWJsaWMgdm9pZCBjbGVhclRleHRGaWx0ZXIoKQotCi1wcm90ZWN0ZWQgaW50IGNvbXB1dGVWZXJ0aWNhbFNjcm9sbEV4dGVudCgpCi0KLXByb3RlY3RlZCBpbnQgY29tcHV0ZVZlcnRpY2FsU2Nyb2xsT2Zmc2V0KCkKLQotcHJvdGVjdGVkIGludCBjb21wdXRlVmVydGljYWxTY3JvbGxSYW5nZSgpCi0KLSBhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnUkQ29udGV4dE1lbnVJbmZvIGNyZWF0ZUNvbnRleHRNZW51SW5mbygKLWFuZHJvaWQudmlldy5WaWV3Ci1pbnQKLWxvbmcpCi0KLSB2b2lkIGRpc21pc3NQb3B1cCgpCi0KLXByb3RlY3RlZCB2b2lkIGRpc3BhdGNoRHJhdygKLWFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzKQotCi1wcm90ZWN0ZWQgdm9pZCBkaXNwYXRjaFNldFByZXNzZWQoCi1ib29sZWFuKQotCi1wcm90ZWN0ZWQgdm9pZCBkcmF3YWJsZVN0YXRlQ2hhbmdlZCgpCi0KLWFic3RyYWN0IHZvaWQgZmlsbEdhcCgKLWJvb2xlYW4pCi0KLWFic3RyYWN0IGludCBmaW5kTW90aW9uUm93KAotaW50KQotCi1wdWJsaWMgdm9sYXRpbGUgYW5kcm9pZC52aWV3LlZpZXdHcm91cCRMYXlvdXRQYXJhbXMgZ2VuZXJhdGVMYXlvdXRQYXJhbXMoCi1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0KQotCi1wcm90ZWN0ZWQgYW5kcm9pZC52aWV3LlZpZXdHcm91cCRMYXlvdXRQYXJhbXMgZ2VuZXJhdGVMYXlvdXRQYXJhbXMoCi1hbmRyb2lkLnZpZXcuVmlld0dyb3VwJExheW91dFBhcmFtcykKLQotcHVibGljIGFuZHJvaWQud2lkZ2V0LkFic0xpc3RWaWV3JExheW91dFBhcmFtcyBnZW5lcmF0ZUxheW91dFBhcmFtcygKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi0KLXByb3RlY3RlZCBmbG9hdCBnZXRCb3R0b21GYWRpbmdFZGdlU3RyZW5ndGgoKQotCi1wdWJsaWMgaW50IGdldENhY2hlQ29sb3JIaW50KCkKLQotcHJvdGVjdGVkIGFuZHJvaWQudmlldy5Db250ZXh0TWVudSRDb250ZXh0TWVudUluZm8gZ2V0Q29udGV4dE1lbnVJbmZvKCkKLQotcHVibGljIHZvaWQgZ2V0Rm9jdXNlZFJlY3QoCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3QpCi0KLSBpbnQgZ2V0Rm9vdGVyVmlld3NDb3VudCgpCi0KLSBpbnQgZ2V0SGVhZGVyVmlld3NDb3VudCgpCi0KLXB1YmxpYyBpbnQgZ2V0TGlzdFBhZGRpbmdCb3R0b20oKQotCi1wdWJsaWMgaW50IGdldExpc3RQYWRkaW5nTGVmdCgpCi0KLXB1YmxpYyBpbnQgZ2V0TGlzdFBhZGRpbmdSaWdodCgpCi0KLXB1YmxpYyBpbnQgZ2V0TGlzdFBhZGRpbmdUb3AoKQotQGFuZHJvaWQudmlldy5WaWV3RGVidWckRXhwb3J0ZWRQcm9wZXJ0eQotcHVibGljIGFuZHJvaWQudmlldy5WaWV3IGdldFNlbGVjdGVkVmlldygpCi0KLXB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIGdldFNlbGVjdG9yKCkKLQotcHVibGljIGludCBnZXRTb2xpZENvbG9yKCkKLQotcHJvdGVjdGVkIGZsb2F0IGdldFRvcEZhZGluZ0VkZ2VTdHJlbmd0aCgpCi0KLXB1YmxpYyBpbnQgZ2V0VHJhbnNjcmlwdE1vZGUoKQotCi1wcm90ZWN0ZWQgdm9pZCBoYW5kbGVEYXRhQ2hhbmdlZCgpCi0KLXB1YmxpYyBib29sZWFuIGhhc1RleHRGaWx0ZXIoKQotCi0gdm9pZCBoaWRlU2VsZWN0b3IoKQotCi1wdWJsaWMgdm9pZCBpbnZhbGlkYXRlVmlld3MoKQotCi0gdm9pZCBpbnZva2VPbkl0ZW1TY3JvbGxMaXN0ZW5lcigpCi0KLXByb3RlY3RlZCBib29sZWFuIGlzSW5GaWx0ZXJNb2RlKCkKLQotcHVibGljIGJvb2xlYW4gaXNTY3JvbGxpbmdDYWNoZUVuYWJsZWQoKQotCi1wdWJsaWMgYm9vbGVhbiBpc1N0YWNrRnJvbUJvdHRvbSgpCi0KLXB1YmxpYyBib29sZWFuIGlzVGV4dEZpbHRlckVuYWJsZWQoKQotCi0gdm9pZCBrZXlQcmVzc2VkKCkKLQotcHJvdGVjdGVkIHZvaWQgbGF5b3V0Q2hpbGRyZW4oKQotCi0gYW5kcm9pZC52aWV3LlZpZXcgb2J0YWluVmlldygKLWludCkKLQotcHJvdGVjdGVkIHZvaWQgb25BdHRhY2hlZFRvV2luZG93KCkKLQotcHJvdGVjdGVkIGludFtdIG9uQ3JlYXRlRHJhd2FibGVTdGF0ZSgKLWludCkKLQotcHJvdGVjdGVkIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3coKQotCi1wdWJsaWMgdm9pZCBvbkZpbHRlckNvbXBsZXRlKAotaW50KQotCi1wcm90ZWN0ZWQgdm9pZCBvbkZvY3VzQ2hhbmdlZCgKLWJvb2xlYW4KLWludAotYW5kcm9pZC5ncmFwaGljcy5SZWN0KQotCi1wdWJsaWMgdm9pZCBvbkdsb2JhbExheW91dCgpCi0KLXB1YmxpYyBib29sZWFuIG9uSW50ZXJjZXB0VG91Y2hFdmVudCgKLWFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCkKLQotcHVibGljIGJvb2xlYW4gb25LZXlVcCgKLWludAotYW5kcm9pZC52aWV3LktleUV2ZW50KQotCi1wcm90ZWN0ZWQgdm9pZCBvbkxheW91dCgKLWJvb2xlYW4KLWludAotaW50Ci1pbnQKLWludCkKLQotcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIG9uUmVzdG9yZUluc3RhbmNlU3RhdGUoCi1hbmRyb2lkLm9zLlBhcmNlbGFibGUpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLlBhcmNlbGFibGUgb25TYXZlSW5zdGFuY2VTdGF0ZSgpCi0KLXByb3RlY3RlZCB2b2lkIG9uU2l6ZUNoYW5nZWQoCi1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIG9uVGV4dENoYW5nZWQoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnQoCi1hbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQpCi0KLXB1YmxpYyB2b2lkIG9uVG91Y2hNb2RlQ2hhbmdlZCgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIG9uV2luZG93Rm9jdXNDaGFuZ2VkKAotYm9vbGVhbikKLQotcHVibGljIGludCBwb2ludFRvUG9zaXRpb24oCi1pbnQKLWludCkKLQotcHVibGljIGxvbmcgcG9pbnRUb1Jvd0lkKAotaW50Ci1pbnQpCi0KLSB2b2lkIHBvc2l0aW9uU2VsZWN0b3IoCi1hbmRyb2lkLnZpZXcuVmlldykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL3ZpZXcvVmlldzs+OylWICkKLXB1YmxpYyB2b2lkIHJlY2xhaW1WaWV3cygKLWphdmEudXRpbC5MaXN0KQotCi0gaW50IHJlY29uY2lsZVNlbGVjdGVkUG9zaXRpb24oKQotCi1wdWJsaWMgdm9pZCByZXF1ZXN0TGF5b3V0KCkKLQotIHZvaWQgcmVxdWVzdExheW91dElmTmVjZXNzYXJ5KCkKLQotIHZvaWQgcmVzZXRMaXN0KCkKLQotIGJvb2xlYW4gcmVzdXJyZWN0U2VsZWN0aW9uKCkKLQotIGJvb2xlYW4gc2VuZFRvVGV4dEZpbHRlcigKLWludAotaW50Ci1hbmRyb2lkLnZpZXcuS2V5RXZlbnQpCi0KLXB1YmxpYyB2b2lkIHNldENhY2hlQ29sb3JIaW50KAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXREcmF3U2VsZWN0b3JPblRvcCgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldEZpbHRlclRleHQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRPblNjcm9sbExpc3RlbmVyKAotYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXckT25TY3JvbGxMaXN0ZW5lcikKLQotcHVibGljIHZvaWQgc2V0UmVjeWNsZXJMaXN0ZW5lcigKLWFuZHJvaWQud2lkZ2V0LkFic0xpc3RWaWV3JFJlY3ljbGVyTGlzdGVuZXIpCi0KLXB1YmxpYyB2b2lkIHNldFNjcm9sbEluZGljYXRvcnMoCi1hbmRyb2lkLnZpZXcuVmlldwotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXB1YmxpYyB2b2lkIHNldFNjcm9sbGluZ0NhY2hlRW5hYmxlZCgKLWJvb2xlYW4pCi0KLWFic3RyYWN0IHZvaWQgc2V0U2VsZWN0aW9uSW50KAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRTZWxlY3RvcigKLWludCkKLQotcHVibGljIHZvaWQgc2V0U2VsZWN0b3IoCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlKQotCi1wdWJsaWMgdm9pZCBzZXRTdGFja0Zyb21Cb3R0b20oCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRUZXh0RmlsdGVyRW5hYmxlZCgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldFRyYW5zY3JpcHRNb2RlKAotaW50KQotCi0gYm9vbGVhbiBzaG91bGRTaG93U2VsZWN0b3IoKQotCi1wdWJsaWMgYm9vbGVhbiBzaG93Q29udGV4dE1lbnVGb3JDaGlsZCgKLWFuZHJvaWQudmlldy5WaWV3KQotCi0gYm9vbGVhbiB0b3VjaE1vZGVEcmF3c0luUHJlc3NlZFN0YXRlKCkKLQotIHZvaWQgdHJhY2tNb3Rpb25TY3JvbGwoCi1pbnQKLWludCkKLQotIHZvaWQgdXBkYXRlU2Nyb2xsSW5kaWNhdG9ycygpCi0KLXB1YmxpYyBib29sZWFuIHZlcmlmeURyYXdhYmxlKAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MkUmVtb3RlVmlldwotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvUHJvZ3Jlc3NCYXIkUmVmcmVzaFByb2dyZXNzUnVubmFibGU7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLndpZGdldC5Qcm9ncmVzc0JhciBleHRlbmRzIGFuZHJvaWQudmlldy5WaWV3Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBTklNQVRJT05fUkVTT0xVVElPTgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0xFVkVMCi0KLXByaXZhdGUgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbHBoYUFuaW1hdGlvbiBtQW5pbWF0aW9uCi0KLXByaXZhdGUgaW50IG1CZWhhdmlvcgotCi1wcml2YXRlIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgbUN1cnJlbnREcmF3YWJsZQotCi1wcml2YXRlIGludCBtRHVyYXRpb24KLQotcHJpdmF0ZSBib29sZWFuIG1JbkRyYXdpbmcKLQotcHJpdmF0ZSBib29sZWFuIG1JbmRldGVybWluYXRlCi0KLXByaXZhdGUgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSBtSW5kZXRlcm1pbmF0ZURyYXdhYmxlCi0KLXByaXZhdGUgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3IgbUludGVycG9sYXRvcgotCi1wcml2YXRlIGxvbmcgbUxhc3REcmF3VGltZQotCi1wcml2YXRlIGludCBtTWF4Ci0KLSBpbnQgbU1heEhlaWdodAotCi0gaW50IG1NYXhXaWR0aAotCi0gaW50IG1NaW5IZWlnaHQKLQotIGludCBtTWluV2lkdGgKLQotcHJpdmF0ZSBib29sZWFuIG1Ob0ludmFsaWRhdGUKLQotcHJpdmF0ZSBib29sZWFuIG1Pbmx5SW5kZXRlcm1pbmF0ZQotCi1wcml2YXRlIGludCBtUHJvZ3Jlc3MKLQotcHJpdmF0ZSBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIG1Qcm9ncmVzc0RyYXdhYmxlCi0KLXByaXZhdGUgYW5kcm9pZC53aWRnZXQuUHJvZ3Jlc3NCYXIkUmVmcmVzaFByb2dyZXNzUnVubmFibGUgbVJlZnJlc2hQcm9ncmVzc1J1bm5hYmxlCi0KLSBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCBtU2FtcGxlVGlsZQotCi1wcml2YXRlIGludCBtU2Vjb25kYXJ5UHJvZ3Jlc3MKLQotcHJpdmF0ZSBib29sZWFuIG1TaG91bGRTdGFydEFuaW1hdGlvbkRyYXdhYmxlCi0KLXByaXZhdGUgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5UcmFuc2Zvcm1hdGlvbiBtVHJhbnNmb3JtYXRpb24KLQotcHJpdmF0ZSBsb25nIG1VaVRocmVhZElkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldAotaW50KQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMDAwKAotYW5kcm9pZC53aWRnZXQuUHJvZ3Jlc3NCYXIKLWludAotaW50Ci1ib29sZWFuKQotCi1zdGF0aWMgYW5kcm9pZC53aWRnZXQuUHJvZ3Jlc3NCYXIkUmVmcmVzaFByb2dyZXNzUnVubmFibGUgYWNjZXNzJDEwMigKLWFuZHJvaWQud2lkZ2V0LlByb2dyZXNzQmFyCi1hbmRyb2lkLndpZGdldC5Qcm9ncmVzc0JhciRSZWZyZXNoUHJvZ3Jlc3NSdW5uYWJsZSkKLQotcHJpdmF0ZSBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIGNyZWF0ZURyYXdhYmxlRm9yVGlsZSgKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUKLWJvb2xlYW4pCi0KLXByaXZhdGUgdm9pZCBkb1JlZnJlc2hQcm9ncmVzcygKLWludAotaW50Ci1ib29sZWFuKQotCi1wcml2YXRlIHZvaWQgaW5pdFByb2dyZXNzQmFyKCkKLQotcHJpdmF0ZSB2b2lkIHJlZnJlc2hQcm9ncmVzcygKLWludAotaW50Ci1ib29sZWFuKQotCi1wcml2YXRlIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgdGlsZWlmeSgKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUpCi0KLXByaXZhdGUgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSB0aWxlaWZ5SW5kZXRlcm1pbmF0ZSgKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUpCi0KLSBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIGdldEN1cnJlbnREcmF3YWJsZSgpCi0KLSBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLnNoYXBlcy5TaGFwZSBnZXREcmF3YWJsZVNoYXBlKCkKLQotcHVibGljIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgZ2V0SW5kZXRlcm1pbmF0ZURyYXdhYmxlKCkKLQotcHVibGljIGFuZHJvaWQudmlldy5hbmltYXRpb24uSW50ZXJwb2xhdG9yIGdldEludGVycG9sYXRvcigpCi0KLXB1YmxpYyBpbnQgZ2V0TWF4KCkKLQotcHVibGljIGludCBnZXRQcm9ncmVzcygpCi0KLXB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIGdldFByb2dyZXNzRHJhd2FibGUoKQotCi1wdWJsaWMgaW50IGdldFNlY29uZGFyeVByb2dyZXNzKCkKLQotcHVibGljIGZpbmFsIHZvaWQgaW5jcmVtZW50UHJvZ3Jlc3NCeSgKLWludCkKLQotcHVibGljIGZpbmFsIHZvaWQgaW5jcmVtZW50U2Vjb25kYXJ5UHJvZ3Jlc3NCeSgKLWludCkKLQotcHVibGljIHZvaWQgaW52YWxpZGF0ZURyYXdhYmxlKAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSkKLQotcHVibGljIGJvb2xlYW4gaXNJbmRldGVybWluYXRlKCkKLQotcHJvdGVjdGVkIHZvaWQgb25EcmF3KAotYW5kcm9pZC5ncmFwaGljcy5DYW52YXMpCi0KLXByb3RlY3RlZCB2b2lkIG9uTWVhc3VyZSgKLWludAotaW50KQotCi0gdm9pZCBvblByb2dyZXNzUmVmcmVzaCgKLWZsb2F0Ci1ib29sZWFuKQotCi1wcm90ZWN0ZWQgdm9pZCBvblNpemVDaGFuZ2VkKAotaW50Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBwb3N0SW52YWxpZGF0ZSgpCi0KLXB1YmxpYyB2b2lkIHNldEluZGV0ZXJtaW5hdGUoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRJbmRldGVybWluYXRlRHJhd2FibGUoCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlKQotCi1wdWJsaWMgdm9pZCBzZXRJbnRlcnBvbGF0b3IoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRJbnRlcnBvbGF0b3IoCi1hbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvcikKLQotcHVibGljIHZvaWQgc2V0TWF4KAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRQcm9ncmVzcygKLWludCkKLQotIHZvaWQgc2V0UHJvZ3Jlc3MoCi1pbnQKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldFByb2dyZXNzRHJhd2FibGUoCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlKQotCi1wdWJsaWMgdm9pZCBzZXRTZWNvbmRhcnlQcm9ncmVzcygKLWludCkKLQotcHVibGljIHZvaWQgc2V0VmlzaWJpbGl0eSgKLWludCkKLQotIHZvaWQgc3RhcnRBbmltYXRpb24oKQotCi0gdm9pZCBzdG9wQW5pbWF0aW9uKCkKLQotcHJvdGVjdGVkIGJvb2xlYW4gdmVyaWZ5RHJhd2FibGUoCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGFuZHJvaWQud2lkZ2V0LkFic1NlZWtCYXIgZXh0ZW5kcyBhbmRyb2lkLndpZGdldC5Qcm9ncmVzc0JhcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9fQUxQSEEKLQotIGZsb2F0IG1EaXNhYmxlZEFscGhhCi0KLSBib29sZWFuIG1Jc1VzZXJTZWVrYWJsZQotCi1wcml2YXRlIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgbVRodW1iCi0KLXByaXZhdGUgaW50IG1UaHVtYk9mZnNldAotCi0gZmxvYXQgbVRvdWNoUHJvZ3Jlc3NPZmZzZXQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ci1pbnQpCi0KLXByaXZhdGUgdm9pZCBzZXRUaHVtYlBvcygKLWludAotaW50Ci1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlCi1mbG9hdAotaW50KQotCi1wcml2YXRlIHZvaWQgdHJhY2tUb3VjaEV2ZW50KAotYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50KQotCi1wcm90ZWN0ZWQgdm9pZCBkcmF3YWJsZVN0YXRlQ2hhbmdlZCgpCi0KLXB1YmxpYyBpbnQgZ2V0VGh1bWJPZmZzZXQoKQotCi1wcm90ZWN0ZWQgdm9pZCBvbkRyYXcoCi1hbmRyb2lkLmdyYXBoaWNzLkNhbnZhcykKLQotcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKAotaW50Ci1pbnQpCi0KLSB2b2lkIG9uUHJvZ3Jlc3NSZWZyZXNoKAotZmxvYXQKLWJvb2xlYW4pCi0KLXByb3RlY3RlZCB2b2lkIG9uU2l6ZUNoYW5nZWQoCi1pbnQKLWludAotaW50Ci1pbnQpCi0KLSB2b2lkIG9uU3RhcnRUcmFja2luZ1RvdWNoKCkKLQotIHZvaWQgb25TdG9wVHJhY2tpbmdUb3VjaCgpCi0KLXB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudCgKLWFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCkKLQotcHVibGljIHZvaWQgc2V0VGh1bWIoCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlKQotCi1wdWJsaWMgdm9pZCBzZXRUaHVtYk9mZnNldCgKLWludCkKLQotcHJvdGVjdGVkIGJvb2xlYW4gdmVyaWZ5RHJhd2FibGUoCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9BYnNTcGlubmVyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTQxMDQgbmFtZSA9bnVsbCApCi0gY2xhc3MgYW5kcm9pZC53aWRnZXQuQWJzU3Bpbm5lciQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L0Fic1NwaW5uZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1SZWN5Y2xlQmluICkKLSBjbGFzcyBhbmRyb2lkLndpZGdldC5BYnNTcGlubmVyJFJlY3ljbGVCaW4gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGFuZHJvaWQvdXRpbC9TcGFyc2VBcnJheTxMYW5kcm9pZC92aWV3L1ZpZXc7PjsgKQotcHJpdmF0ZSBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXkgbVNjcmFwSGVhcAotCi1maW5hbCBhbmRyb2lkLndpZGdldC5BYnNTcGlubmVyIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQud2lkZ2V0LkFic1NwaW5uZXIpCi0KLSB2b2lkIGNsZWFyKCkKLQotIGFuZHJvaWQudmlldy5WaWV3IGdldCgKLWludCkKLQotIGFuZHJvaWQudmlldy5WaWV3IHBlZWsoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHB1dCgKLWludAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L0Fic1NwaW5uZXIkU2F2ZWRTdGF0ZTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC93aWRnZXQvQWJzU3Bpbm5lciRTYXZlZFN0YXRlOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLWZpbmFsIGNsYXNzIGFuZHJvaWQud2lkZ2V0LkFic1NwaW5uZXIkU2F2ZWRTdGF0ZSQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGFuZHJvaWQud2lkZ2V0LkFic1NwaW5uZXIkU2F2ZWRTdGF0ZSBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIGFuZHJvaWQud2lkZ2V0LkFic1NwaW5uZXIkU2F2ZWRTdGF0ZVtdIG5ld0FycmF5KAotaW50KQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdFtdIG5ld0FycmF5KAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1TYXZlZFN0YXRlICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9BYnNTcGlubmVyOyApCi0gY2xhc3MgYW5kcm9pZC53aWRnZXQuQWJzU3Bpbm5lciRTYXZlZFN0YXRlIGV4dGVuZHMgYW5kcm9pZC52aWV3LlZpZXckQmFzZVNhdmVkU3RhdGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I8TGFuZHJvaWQvd2lkZ2V0L0Fic1NwaW5uZXIkU2F2ZWRTdGF0ZTs+OyApCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yIENSRUFUT1IKLQotIGludCBwb3NpdGlvbgotCi0gbG9uZyBzZWxlY3RlZElkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuUGFyY2VsCi1hbmRyb2lkLndpZGdldC5BYnNTcGlubmVyJDEpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuUGFyY2VsYWJsZSkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1wdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9BYnNTcGlubmVyJDE7TGFuZHJvaWQvd2lkZ2V0L0Fic1NwaW5uZXIkUmVjeWNsZUJpbjtMYW5kcm9pZC93aWRnZXQvQWJzU3Bpbm5lciRTYXZlZFN0YXRlOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L0FkYXB0ZXJWaWV3PExhbmRyb2lkL3dpZGdldC9TcGlubmVyQWRhcHRlcjs+OyApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC53aWRnZXQuQWJzU3Bpbm5lciBleHRlbmRzIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBhbmRyb2lkLndpZGdldC5TcGlubmVyQWRhcHRlciBtQWRhcHRlcgotCi0gYm9vbGVhbiBtQmxvY2tMYXlvdXRSZXF1ZXN0cwotCi1wcml2YXRlIGFuZHJvaWQuZGF0YWJhc2UuRGF0YVNldE9ic2VydmVyIG1EYXRhU2V0T2JzZXJ2ZXIKLQotIGludCBtSGVpZ2h0TWVhc3VyZVNwZWMKLQotIGFuZHJvaWQudmlldy5hbmltYXRpb24uSW50ZXJwb2xhdG9yIG1JbnRlcnBvbGF0b3IKLQotIGFuZHJvaWQud2lkZ2V0LkFic1NwaW5uZXIkUmVjeWNsZUJpbiBtUmVjeWNsZXIKLQotIGFuZHJvaWQudmlldy5WaWV3IG1TZWxlY3RlZFZpZXcKLQotIGludCBtU2VsZWN0aW9uQm90dG9tUGFkZGluZwotCi0gaW50IG1TZWxlY3Rpb25MZWZ0UGFkZGluZwotCi0gaW50IG1TZWxlY3Rpb25SaWdodFBhZGRpbmcKLQotIGludCBtU2VsZWN0aW9uVG9wUGFkZGluZwotCi0gYW5kcm9pZC5ncmFwaGljcy5SZWN0IG1TcGlubmVyUGFkZGluZwotCi1wcml2YXRlIGFuZHJvaWQuZ3JhcGhpY3MuUmVjdCBtVG91Y2hGcmFtZQotCi0gaW50IG1XaWR0aE1lYXN1cmVTcGVjCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldAotaW50KQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMTAwKAotYW5kcm9pZC53aWRnZXQuQWJzU3Bpbm5lcgotYW5kcm9pZC52aWV3LlZpZXcKLWJvb2xlYW4pCi0KLXByaXZhdGUgdm9pZCBpbml0QWJzU3Bpbm5lcigpCi0KLXByb3RlY3RlZCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwJExheW91dFBhcmFtcyBnZW5lcmF0ZURlZmF1bHRMYXlvdXRQYXJhbXMoKQotCi1wdWJsaWMgdm9sYXRpbGUgYW5kcm9pZC53aWRnZXQuQWRhcHRlciBnZXRBZGFwdGVyKCkKLQotcHVibGljIGFuZHJvaWQud2lkZ2V0LlNwaW5uZXJBZGFwdGVyIGdldEFkYXB0ZXIoKQotCi0gaW50IGdldENoaWxkSGVpZ2h0KAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLSBpbnQgZ2V0Q2hpbGRXaWR0aCgKLWFuZHJvaWQudmlldy5WaWV3KQotCi1wdWJsaWMgaW50IGdldENvdW50KCkKLQotcHVibGljIGFuZHJvaWQudmlldy5WaWV3IGdldFNlbGVjdGVkVmlldygpCi0KLSB2b2lkIGhhbmRsZURhdGFDaGFuZ2VkKCkKLQotYWJzdHJhY3Qgdm9pZCBsYXlvdXQoCi1pbnQKLWJvb2xlYW4pCi0KLXByb3RlY3RlZCB2b2lkIG9uTWVhc3VyZSgKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBvblJlc3RvcmVJbnN0YW5jZVN0YXRlKAotYW5kcm9pZC5vcy5QYXJjZWxhYmxlKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlIG9uU2F2ZUluc3RhbmNlU3RhdGUoKQotCi1wdWJsaWMgaW50IHBvaW50VG9Qb3NpdGlvbigKLWludAotaW50KQotCi0gdm9pZCByZWN5Y2xlQWxsVmlld3MoKQotCi1wdWJsaWMgdm9pZCByZXF1ZXN0TGF5b3V0KCkKLQotIHZvaWQgcmVzZXRMaXN0KCkKLQotcHVibGljIHZvbGF0aWxlIHZvaWQgc2V0QWRhcHRlcigKLWFuZHJvaWQud2lkZ2V0LkFkYXB0ZXIpCi0KLXB1YmxpYyB2b2lkIHNldEFkYXB0ZXIoCi1hbmRyb2lkLndpZGdldC5TcGlubmVyQWRhcHRlcikKLQotcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oCi1pbnQKLWJvb2xlYW4pCi0KLSB2b2lkIHNldFNlbGVjdGlvbkludCgKLWludAotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvQWJzb2x1dGVMYXlvdXQ7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1MYXlvdXRQYXJhbXMgKQotcHVibGljIGNsYXNzIGFuZHJvaWQud2lkZ2V0LkFic29sdXRlTGF5b3V0JExheW91dFBhcmFtcyBleHRlbmRzIGFuZHJvaWQudmlldy5WaWV3R3JvdXAkTGF5b3V0UGFyYW1zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBpbnQgeAotCi1wdWJsaWMgaW50IHkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLnZpZXcuVmlld0dyb3VwJExheW91dFBhcmFtcykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZGVidWcoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9BZGFwdGVyVmlldzsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID00MTA0IG5hbWUgPW51bGwgKQotIGNsYXNzIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3JDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvQWRhcHRlclZpZXc7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1BZGFwdGVyQ29udGV4dE1lbnVJbmZvICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldyRBZGFwdGVyQ29udGV4dE1lbnVJbmZvIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQudmlldy5Db250ZXh0TWVudSRDb250ZXh0TWVudUluZm8KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGxvbmcgaWQKLQotcHVibGljIGludCBwb3NpdGlvbgotCi1wdWJsaWMgYW5kcm9pZC52aWV3LlZpZXcgdGFyZ2V0VmlldwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQudmlldy5WaWV3Ci1pbnQKLWxvbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L0FkYXB0ZXJWaWV3OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9QWRhcHRlckRhdGFTZXRPYnNlcnZlciApCi0gY2xhc3MgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXckQWRhcHRlckRhdGFTZXRPYnNlcnZlciBleHRlbmRzIGFuZHJvaWQuZGF0YWJhc2UuRGF0YVNldE9ic2VydmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5QYXJjZWxhYmxlIG1JbnN0YW5jZVN0YXRlCi0KLWZpbmFsIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3IHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3KQotCi1wdWJsaWMgdm9pZCBjbGVhclNhdmVkU3RhdGUoKQotCi1wdWJsaWMgdm9pZCBvbkNoYW5nZWQoKQotCi1wdWJsaWMgdm9pZCBvbkludmFsaWRhdGVkKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9T25JdGVtTG9uZ0NsaWNrTGlzdGVuZXIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L0FkYXB0ZXJWaWV3OyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3JE9uSXRlbUxvbmdDbGlja0xpc3RlbmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExhbmRyb2lkL3dpZGdldC9BZGFwdGVyVmlldzwqPjtMYW5kcm9pZC92aWV3L1ZpZXc7SUopWiApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBvbkl0ZW1Mb25nQ2xpY2soCi1hbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldwotYW5kcm9pZC52aWV3LlZpZXcKLWludAotbG9uZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvQWRhcHRlclZpZXc7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MiBuYW1lID1TZWxlY3Rpb25Ob3RpZmllciApCi0gY2xhc3MgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXckU2VsZWN0aW9uTm90aWZpZXIgZXh0ZW5kcyBhbmRyb2lkLm9zLkhhbmRsZXIgaW1wbGVtZW50cyBqYXZhLmxhbmcuUnVubmFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXcgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3KQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldwotYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXckMSkKLQotcHVibGljIHZvaWQgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvQW5hbG9nQ2xvY2s7ICkKLSBjbGFzcyBhbmRyb2lkLndpZGdldC5BbmFsb2dDbG9jayQxIGV4dGVuZHMgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQud2lkZ2V0LkFuYWxvZ0Nsb2NrIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQud2lkZ2V0LkFuYWxvZ0Nsb2NrKQotCi1wdWJsaWMgdm9pZCBvblJlY2VpdmUoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC5jb250ZW50LkludGVudCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLndpZGdldC5BbmFsb2dDbG9jayBleHRlbmRzIGFuZHJvaWQudmlldy5WaWV3Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYm9vbGVhbiBtQXR0YWNoZWQKLQotcHJpdmF0ZSBhbmRyb2lkLnBpbS5UaW1lIG1DYWxlbmRhcgotCi1wcml2YXRlIGJvb2xlYW4gbUNoYW5nZWQKLQotcHJpdmF0ZSBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIG1EaWFsCi0KLXByaXZhdGUgaW50IG1EaWFsSGVpZ2h0Ci0KLXByaXZhdGUgaW50IG1EaWFsV2lkdGgKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLm9zLkhhbmRsZXIgbUhhbmRsZXIKLQotcHJpdmF0ZSBmbG9hdCBtSG91cgotCi1wcml2YXRlIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgbUhvdXJIYW5kCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyIG1JbnRlbnRSZWNlaXZlcgotCi1wcml2YXRlIGxvbmcgbUxhc3RUaW1lCi0KLXByaXZhdGUgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSBtTWludXRlSGFuZAotCi1wcml2YXRlIGZsb2F0IG1NaW51dGVzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldAotaW50KQotCi1zdGF0aWMgYW5kcm9pZC5waW0uVGltZSBhY2Nlc3MkMDAyKAotYW5kcm9pZC53aWRnZXQuQW5hbG9nQ2xvY2sKLWFuZHJvaWQucGltLlRpbWUpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQxMDAoCi1hbmRyb2lkLndpZGdldC5BbmFsb2dDbG9jaykKLQotcHJpdmF0ZSB2b2lkIG9uVGltZUNoYW5nZWQoKQotCi1wcm90ZWN0ZWQgdm9pZCBvbkF0dGFjaGVkVG9XaW5kb3coKQotCi1wcm90ZWN0ZWQgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpCi0KLXByb3RlY3RlZCB2b2lkIG9uRHJhdygKLWFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzKQotCi1wcm90ZWN0ZWQgdm9pZCBvbk1lYXN1cmUoCi1pbnQKLWludCkKLQotcHJvdGVjdGVkIHZvaWQgb25TaXplQ2hhbmdlZCgKLWludAotaW50Ci1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvQXBwU2VjdXJpdHlQZXJtaXNzaW9uczsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID00MTA0IG5hbWUgPW51bGwgKQotIGNsYXNzIGFuZHJvaWQud2lkZ2V0LkFwcFNlY3VyaXR5UGVybWlzc2lvbnMkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIGludFtdICRTd2l0Y2hNYXAkYW5kcm9pZCR3aWRnZXQkQXBwU2VjdXJpdHlQZXJtaXNzaW9ucyRTdGF0ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9FbnVtPExhbmRyb2lkL3dpZGdldC9BcHBTZWN1cml0eVBlcm1pc3Npb25zJFN0YXRlOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTY0MTAgbmFtZSA9U3RhdGUgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L0FwcFNlY3VyaXR5UGVybWlzc2lvbnM7ICkKLWZpbmFsIGNsYXNzIGFuZHJvaWQud2lkZ2V0LkFwcFNlY3VyaXR5UGVybWlzc2lvbnMkU3RhdGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndpZGdldC5BcHBTZWN1cml0eVBlcm1pc3Npb25zJFN0YXRlW10gJFZBTFVFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2lkZ2V0LkFwcFNlY3VyaXR5UGVybWlzc2lvbnMkU3RhdGUgQk9USAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2lkZ2V0LkFwcFNlY3VyaXR5UGVybWlzc2lvbnMkU3RhdGUgREFOR0VST1VTX09OTFkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndpZGdldC5BcHBTZWN1cml0eVBlcm1pc3Npb25zJFN0YXRlIE5PUk1BTF9PTkxZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53aWRnZXQuQXBwU2VjdXJpdHlQZXJtaXNzaW9ucyRTdGF0ZSBOT19QRVJNUwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVYgKQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLndpZGdldC5BcHBTZWN1cml0eVBlcm1pc3Npb25zJFN0YXRlIHZhbHVlT2YoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQud2lkZ2V0LkFwcFNlY3VyaXR5UGVybWlzc2lvbnMkU3RhdGVbXSB2YWx1ZXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L0FwcFNlY3VyaXR5UGVybWlzc2lvbnMkMTtMYW5kcm9pZC93aWRnZXQvQXBwU2VjdXJpdHlQZXJtaXNzaW9ucyRTdGF0ZTsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQud2lkZ2V0LkFwcFNlY3VyaXR5UGVybWlzc2lvbnMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC52aWV3LlZpZXckT25DbGlja0xpc3RlbmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLQotcHJpdmF0ZSBib29sZWFuIGxvY2FsTE9HVgotCi1wcml2YXRlIGFuZHJvaWQuY29udGVudC5Db250ZXh0IG1Db250ZXh0Ci0KLXByaXZhdGUgYW5kcm9pZC53aWRnZXQuQXBwU2VjdXJpdHlQZXJtaXNzaW9ucyRTdGF0ZSBtQ3VycmVudFN0YXRlCi0KLXByaXZhdGUgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSBtRGFuZ2Vyb3VzSWNvbgotCi1wcml2YXRlIGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dCBtRGFuZ2Vyb3VzTGlzdAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaE1hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wcml2YXRlIGphdmEudXRpbC5IYXNoTWFwIG1EYW5nZXJvdXNNYXAKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1EZWZhdWx0R3JwTGFiZWwKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1EZWZhdWx0R3JwTmFtZQotCi1wcml2YXRlIGJvb2xlYW4gbUV4cGFuZGVkCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNoTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXByaXZhdGUgamF2YS51dGlsLkhhc2hNYXAgbUdyb3VwTGFiZWxDYWNoZQotCi1wcml2YXRlIGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlciBtSW5mbGF0ZXIKLQotcHJpdmF0ZSBhbmRyb2lkLnZpZXcuVmlldyBtTm9QZXJtc1ZpZXcKLQotcHJpdmF0ZSBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQgbU5vbkRhbmdlcm91c0xpc3QKLQotcHJpdmF0ZSBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIG1Ob3JtYWxJY29uCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNoTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXByaXZhdGUgamF2YS51dGlsLkhhc2hNYXAgbU5vcm1hbE1hcAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbVBlcm1Gb3JtYXQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0FycmF5TGlzdDxMYW5kcm9pZC9jb250ZW50L3BtL1Blcm1pc3Npb25JbmZvOz47ICkKLXByaXZhdGUgamF2YS51dGlsLkFycmF5TGlzdCBtUGVybXNMaXN0Ci0KLXByaXZhdGUgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0IG1QZXJtc1ZpZXcKLQotcHJpdmF0ZSBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIgbVBtCi0KLXByaXZhdGUgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSBtU2hvd01heEljb24KLQotcHJpdmF0ZSBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIG1TaG93TWluSWNvbgotCi1wcml2YXRlIGFuZHJvaWQudmlldy5WaWV3IG1TaG93TW9yZQotCi1wcml2YXRlIGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldyBtU2hvd01vcmVJY29uCi0KLXByaXZhdGUgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXcgbVNob3dNb3JlVGV4dAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMYW5kcm9pZC9jb250ZW50L0NvbnRleHQ7TGphdmEvdXRpbC9BcnJheUxpc3Q8TGFuZHJvaWQvY29udGVudC9wbS9QZXJtaXNzaW9uSW5mbzs+OylWICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1qYXZhLnV0aWwuQXJyYXlMaXN0KQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgY2Fub25pY2FsaXplR3JvdXBEZXNjKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSB2b2lkIGRpc3BsYXlOb1Blcm1pc3Npb25zKCkKLQotcHJpdmF0ZSB2b2lkIGRpc3BsYXlQZXJtaXNzaW9ucygKLWJvb2xlYW4pCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBmb3JtYXRQZXJtaXNzaW9ucygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBmb3JtYXRQZXJtaXNzaW9ucygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvQXJyYXlMaXN0PExhbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZVBhcnNlciRQZXJtaXNzaW9uOz47TGphdmEvdXRpbC9BcnJheUxpc3Q8TGphdmEvbGFuZy9TdHJpbmc7PjspTGphdmEvdXRpbC9BcnJheUxpc3Q8TGFuZHJvaWQvY29udGVudC9wbS9QZXJtaXNzaW9uSW5mbzs+OyApCi1wcml2YXRlIGphdmEudXRpbC5BcnJheUxpc3QgZ2VuZXJhdGVQZXJtaXNzaW9uc0luZm8oCi1qYXZhLnV0aWwuQXJyYXlMaXN0Ci1qYXZhLnV0aWwuQXJyYXlMaXN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShbTGFuZHJvaWQvY29udGVudC9wbS9QZXJtaXNzaW9uSW5mbztbTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL3V0aWwvQXJyYXlMaXN0PExhbmRyb2lkL2NvbnRlbnQvcG0vUGVybWlzc2lvbkluZm87PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuQXJyYXlMaXN0IGdlbmVyYXRlUGVybWlzc2lvbnNJbmZvKAotYW5kcm9pZC5jb250ZW50LnBtLlBlcm1pc3Npb25JbmZvW10KLWphdmEubGFuZy5TdHJpbmdbXSkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGdldEdyb3VwTGFiZWwoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIGFuZHJvaWQudmlldy5WaWV3IGdldFBlcm1pc3Npb25JdGVtVmlldygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4pCi0KLXByaXZhdGUgYm9vbGVhbiBpc0Rpc3BsYXlhYmxlUGVybWlzc2lvbigKLWFuZHJvaWQuY29udGVudC5wbS5QZXJtaXNzaW9uSW5mbykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9BcnJheUxpc3Q8TGFuZHJvaWQvY29udGVudC9wbS9QZXJtaXNzaW9uSW5mbzs+OylWICkKLXByaXZhdGUgdm9pZCBzZXRQZXJtaXNzaW9ucygKLWphdmEudXRpbC5BcnJheUxpc3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvQXJyYXlMaXN0PExhbmRyb2lkL2NvbnRlbnQvcG0vUGVybWlzc2lvbkluZm87PjtMYW5kcm9pZC9jb250ZW50L3BtL0FwcGxpY2F0aW9uSW5mbzspViApCi1wcml2YXRlIHZvaWQgc2V0UGVybWlzc2lvbnMoCi1qYXZhLnV0aWwuQXJyYXlMaXN0Ci1hbmRyb2lkLmNvbnRlbnQucG0uQXBwbGljYXRpb25JbmZvKQotCi1wcml2YXRlIHZvaWQgc2hvd1Blcm1pc3Npb25zKCkKLQotcHVibGljIGFuZHJvaWQudmlldy5WaWV3IGdldFBlcm1pc3Npb25zVmlldygpCi0KLXB1YmxpYyB2b2lkIG9uQ2xpY2soCi1hbmRyb2lkLnZpZXcuVmlldykKLQotcHVibGljIHZvaWQgc2V0U2VjdXJpdHlQZXJtaXNzaW9uc1ZpZXcoKQotCi1wdWJsaWMgdm9pZCBzZXRTZWN1cml0eVBlcm1pc3Npb25zVmlldygKLWFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlSW5mbykKLQotcHVibGljIHZvaWQgc2V0U2VjdXJpdHlQZXJtaXNzaW9uc1ZpZXcoCi1hbmRyb2lkLm5ldC5VcmkpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID00MTA0IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L0FycmF5QWRhcHRlcjsgKQotIGNsYXNzIGFuZHJvaWQud2lkZ2V0LkFycmF5QWRhcHRlciQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPUFycmF5RmlsdGVyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9BcnJheUFkYXB0ZXI7ICkKLSBjbGFzcyBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXIkQXJyYXlGaWx0ZXIgZXh0ZW5kcyBhbmRyb2lkLndpZGdldC5GaWx0ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXIpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQud2lkZ2V0LkFycmF5QWRhcHRlcgotYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyJDEpCi0KLXByb3RlY3RlZCBhbmRyb2lkLndpZGdldC5GaWx0ZXIkRmlsdGVyUmVzdWx0cyBwZXJmb3JtRmlsdGVyaW5nKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotcHJvdGVjdGVkIHZvaWQgcHVibGlzaFJlc3VsdHMoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1hbmRyb2lkLndpZGdldC5GaWx0ZXIkRmlsdGVyUmVzdWx0cykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTQxMDQgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvQXV0b0NvbXBsZXRlVGV4dFZpZXc7ICkKLSBjbGFzcyBhbmRyb2lkLndpZGdldC5BdXRvQ29tcGxldGVUZXh0VmlldyQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPURyb3BEb3duSXRlbUNsaWNrTGlzdGVuZXIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L0F1dG9Db21wbGV0ZVRleHRWaWV3OyApCi0gY2xhc3MgYW5kcm9pZC53aWRnZXQuQXV0b0NvbXBsZXRlVGV4dFZpZXckRHJvcERvd25JdGVtQ2xpY2tMaXN0ZW5lciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldyRPbkl0ZW1DbGlja0xpc3RlbmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQud2lkZ2V0LkF1dG9Db21wbGV0ZVRleHRWaWV3IHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLndpZGdldC5BdXRvQ29tcGxldGVUZXh0VmlldykKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53aWRnZXQuQXV0b0NvbXBsZXRlVGV4dFZpZXcKLWFuZHJvaWQud2lkZ2V0LkF1dG9Db21wbGV0ZVRleHRWaWV3JDEpCi0KLXB1YmxpYyB2b2lkIG9uSXRlbUNsaWNrKAotYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXcKLWFuZHJvaWQudmlldy5WaWV3Ci1pbnQKLWxvbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvTGlzdFZpZXckMTtMYW5kcm9pZC93aWRnZXQvTGlzdFZpZXckU2F2ZWRTdGF0ZTtMYW5kcm9pZC93aWRnZXQvTGlzdFZpZXckQXJyb3dTY3JvbGxGb2N1c1Jlc3VsdDtMYW5kcm9pZC93aWRnZXQvTGlzdFZpZXckRml4ZWRWaWV3SW5mbzsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3IGV4dGVuZHMgYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXcKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hPSUNFX01PREVfTVVMVElQTEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hPSUNFX01PREVfTk9ORQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSE9JQ0VfTU9ERV9TSU5HTEUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgTUFYX1NDUk9MTF9GQUNUT1IKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1JTl9TQ1JPTExfUFJFVklFV19QSVhFTFMKLQotc3RhdGljIGZpbmFsIGludCBOT19QT1NJVElPTgotCi1wcml2YXRlIGJvb2xlYW4gbUFyZUFsbEl0ZW1zU2VsZWN0YWJsZQotCi1wcml2YXRlIGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3JEFycm93U2Nyb2xsRm9jdXNSZXN1bHQgbUFycm93U2Nyb2xsRm9jdXNSZXN1bHQKLQotcHJpdmF0ZSBhbmRyb2lkLnV0aWwuU3BhcnNlQm9vbGVhbkFycmF5IG1DaGVja1N0YXRlcwotCi1wcml2YXRlIGludCBtQ2hvaWNlTW9kZQotCi0gYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSBtRGl2aWRlcgotCi0gaW50IG1EaXZpZGVySGVpZ2h0Ci1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9BcnJheUxpc3Q8TGFuZHJvaWQvd2lkZ2V0L0xpc3RWaWV3JEZpeGVkVmlld0luZm87PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuQXJyYXlMaXN0IG1Gb290ZXJWaWV3SW5mb3MKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0FycmF5TGlzdDxMYW5kcm9pZC93aWRnZXQvTGlzdFZpZXckRml4ZWRWaWV3SW5mbzs+OyApCi1wcml2YXRlIGphdmEudXRpbC5BcnJheUxpc3QgbUhlYWRlclZpZXdJbmZvcwotCi1wcml2YXRlIGJvb2xlYW4gbUl0ZW1zQ2FuRm9jdXMKLQotcHJpdmF0ZSBhbmRyb2lkLmdyYXBoaWNzLlJlY3QgbVRlbXBSZWN0Ci1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGFuZHJvaWQvdXRpbC9TcGFyc2VBcnJheTxMYW5kcm9pZC9vcy9QYXJjZWxhYmxlOz47ICkKLXByaXZhdGUgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5IG1mb2N1c1Jlc3RvcmVDaGlsZFN0YXRlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldAotaW50KQotCi1wcml2YXRlIGFuZHJvaWQudmlldy5WaWV3IGFkZFZpZXdBYm92ZSgKLWFuZHJvaWQudmlldy5WaWV3Ci1pbnQpCi0KLXByaXZhdGUgYW5kcm9pZC52aWV3LlZpZXcgYWRkVmlld0JlbG93KAotYW5kcm9pZC52aWV3LlZpZXcKLWludCkKLQotcHJpdmF0ZSB2b2lkIGFkanVzdFZpZXdzVXBPckRvd24oKQotCi1wcml2YXRlIGludCBhbW91bnRUb1Njcm9sbCgKLWludAotaW50KQotCi1wcml2YXRlIGludCBhbW91bnRUb1Njcm9sbFRvTmV3Rm9jdXMoCi1pbnQKLWFuZHJvaWQudmlldy5WaWV3Ci1pbnQpCi0KLXByaXZhdGUgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXckQXJyb3dTY3JvbGxGb2N1c1Jlc3VsdCBhcnJvd1Njcm9sbEZvY3VzZWQoCi1pbnQpCi0KLXByaXZhdGUgYm9vbGVhbiBhcnJvd1Njcm9sbEltcGwoCi1pbnQpCi0KLXByaXZhdGUgYm9vbGVhbiBjb21tb25LZXkoCi1pbnQKLWludAotYW5kcm9pZC52aWV3LktleUV2ZW50KQotCi1wcml2YXRlIHZvaWQgY29ycmVjdFRvb0hpZ2goCi1pbnQpCi0KLXByaXZhdGUgdm9pZCBjb3JyZWN0VG9vTG93KAotaW50KQotCi1wcml2YXRlIGludCBkaXN0YW5jZVRvVmlldygKLWFuZHJvaWQudmlldy5WaWV3KQotCi1wcml2YXRlIHZvaWQgZmlsbEFib3ZlQW5kQmVsb3coCi1hbmRyb2lkLnZpZXcuVmlldwotaW50KQotCi1wcml2YXRlIGFuZHJvaWQudmlldy5WaWV3IGZpbGxEb3duKAotaW50Ci1pbnQpCi0KLXByaXZhdGUgYW5kcm9pZC52aWV3LlZpZXcgZmlsbEZyb21NaWRkbGUoCi1pbnQKLWludCkKLQotcHJpdmF0ZSBhbmRyb2lkLnZpZXcuVmlldyBmaWxsRnJvbVNlbGVjdGlvbigKLWludAotaW50Ci1pbnQpCi0KLXByaXZhdGUgYW5kcm9pZC52aWV3LlZpZXcgZmlsbEZyb21Ub3AoCi1pbnQpCi0KLXByaXZhdGUgYW5kcm9pZC52aWV3LlZpZXcgZmlsbFNwZWNpZmljKAotaW50Ci1pbnQpCi0KLXByaXZhdGUgYW5kcm9pZC52aWV3LlZpZXcgZmlsbFVwKAotaW50Ci1pbnQpCi0KLXByaXZhdGUgaW50IGdldEFycm93U2Nyb2xsUHJldmlld0xlbmd0aCgpCi0KLXByaXZhdGUgaW50IGdldEJvdHRvbVNlbGVjdGlvblBpeGVsKAotaW50Ci1pbnQKLWludCkKLQotcHJpdmF0ZSBpbnQgZ2V0VG9wU2VsZWN0aW9uUGl4ZWwoCi1pbnQKLWludAotaW50KQotCi1wcml2YXRlIGJvb2xlYW4gaGFuZGxlSG9yaXpvbnRhbEZvY3VzV2l0aGluTGlzdEl0ZW0oCi1pbnQpCi0KLXByaXZhdGUgdm9pZCBoYW5kbGVOZXdTZWxlY3Rpb25DaGFuZ2UoCi1hbmRyb2lkLnZpZXcuVmlldwotaW50Ci1pbnQKLWJvb2xlYW4pCi0KLXByaXZhdGUgYm9vbGVhbiBpc0RpcmVjdENoaWxkSGVhZGVyT3JGb290ZXIoCi1hbmRyb2lkLnZpZXcuVmlldykKLQotcHJpdmF0ZSBib29sZWFuIGlzVmlld0FuY2VzdG9yT2YoCi1hbmRyb2lkLnZpZXcuVmlldwotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXByaXZhdGUgaW50IGxvb2tGb3JTZWxlY3RhYmxlUG9zaXRpb25PblNjcmVlbigKLWludCkKLQotcHJpdmF0ZSBhbmRyb2lkLnZpZXcuVmlldyBtYWtlQW5kQWRkVmlldygKLWludAotaW50Ci1ib29sZWFuCi1pbnQKLWJvb2xlYW4pCi0KLXByaXZhdGUgdm9pZCBtZWFzdXJlQW5kQWRqdXN0RG93bigKLWFuZHJvaWQudmlldy5WaWV3Ci1pbnQKLWludCkKLQotcHJpdmF0ZSB2b2lkIG1lYXN1cmVJdGVtKAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXByaXZhdGUgYW5kcm9pZC52aWV3LlZpZXcgbW92ZVNlbGVjdGlvbigKLWFuZHJvaWQudmlldy5WaWV3Ci1hbmRyb2lkLnZpZXcuVmlldwotaW50Ci1pbnQKLWludCkKLQotcHJpdmF0ZSBpbnQgcG9zaXRpb25PZk5ld0ZvY3VzKAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXByaXZhdGUgdm9pZCByZWxheW91dE1lYXN1cmVkSXRlbSgKLWFuZHJvaWQudmlldy5WaWV3KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMYW5kcm9pZC92aWV3L1ZpZXc7TGphdmEvdXRpbC9BcnJheUxpc3Q8TGFuZHJvaWQvd2lkZ2V0L0xpc3RWaWV3JEZpeGVkVmlld0luZm87PjspViApCi1wcml2YXRlIHZvaWQgcmVtb3ZlRml4ZWRWaWV3SW5mbygKLWFuZHJvaWQudmlldy5WaWV3Ci1qYXZhLnV0aWwuQXJyYXlMaXN0KQotCi1wcml2YXRlIHZvaWQgc2Nyb2xsTGlzdEl0ZW1zQnkoCi1pbnQpCi0KLXByaXZhdGUgdm9pZCBzZXR1cENoaWxkKAotYW5kcm9pZC52aWV3LlZpZXcKLWludAotaW50Ci1ib29sZWFuCi1pbnQKLWJvb2xlYW4KLWJvb2xlYW4pCi0KLXByaXZhdGUgYm9vbGVhbiBzaG93aW5nQm90dG9tRmFkaW5nRWRnZSgpCi0KLXByaXZhdGUgYm9vbGVhbiBzaG93aW5nVG9wRmFkaW5nRWRnZSgpCi0KLXB1YmxpYyB2b2lkIGFkZEZvb3RlclZpZXcoCi1hbmRyb2lkLnZpZXcuVmlldykKLQotcHVibGljIHZvaWQgYWRkRm9vdGVyVmlldygKLWFuZHJvaWQudmlldy5WaWV3Ci1qYXZhLmxhbmcuT2JqZWN0Ci1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBhZGRIZWFkZXJWaWV3KAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXB1YmxpYyB2b2lkIGFkZEhlYWRlclZpZXcoCi1hbmRyb2lkLnZpZXcuVmlldwotamF2YS5sYW5nLk9iamVjdAotYm9vbGVhbikKLQotIGJvb2xlYW4gYXJyb3dTY3JvbGwoCi1pbnQpCi0KLXByb3RlY3RlZCBib29sZWFuIGNhbkFuaW1hdGUoKQotCi1wdWJsaWMgdm9pZCBjbGVhckNob2ljZXMoKQotCi1wcm90ZWN0ZWQgdm9pZCBkaXNwYXRjaERyYXcoCi1hbmRyb2lkLmdyYXBoaWNzLkNhbnZhcykKLQotcHVibGljIGJvb2xlYW4gZGlzcGF0Y2hLZXlFdmVudCgKLWFuZHJvaWQudmlldy5LZXlFdmVudCkKLQotIHZvaWQgZHJhd0RpdmlkZXIoCi1hbmRyb2lkLmdyYXBoaWNzLkNhbnZhcwotYW5kcm9pZC5ncmFwaGljcy5SZWN0Ci1pbnQpCi0KLSB2b2lkIGZpbGxHYXAoCi1ib29sZWFuKQotCi0gaW50IGZpbmRNb3Rpb25Sb3coCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvQXJyYXlMaXN0PExhbmRyb2lkL3dpZGdldC9MaXN0VmlldyRGaXhlZFZpZXdJbmZvOz47SSlMYW5kcm9pZC92aWV3L1ZpZXc7ICkKLSBhbmRyb2lkLnZpZXcuVmlldyBmaW5kVmlld0luSGVhZGVyc09yRm9vdGVycygKLWphdmEudXRpbC5BcnJheUxpc3QKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9BcnJheUxpc3Q8TGFuZHJvaWQvd2lkZ2V0L0xpc3RWaWV3JEZpeGVkVmlld0luZm87PjtMamF2YS9sYW5nL09iamVjdDspTGFuZHJvaWQvdmlldy9WaWV3OyApCi0gYW5kcm9pZC52aWV3LlZpZXcgZmluZFZpZXdUYWdJbkhlYWRlcnNPckZvb3RlcnMoCi1qYXZhLnV0aWwuQXJyYXlMaXN0Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wcm90ZWN0ZWQgYW5kcm9pZC52aWV3LlZpZXcgZmluZFZpZXdUcmF2ZXJzYWwoCi1pbnQpCi0KLXByb3RlY3RlZCBhbmRyb2lkLnZpZXcuVmlldyBmaW5kVmlld1dpdGhUYWdUcmF2ZXJzYWwoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi0gYm9vbGVhbiBmdWxsU2Nyb2xsKAotaW50KQotCi1wdWJsaWMgdm9sYXRpbGUgYW5kcm9pZC53aWRnZXQuQWRhcHRlciBnZXRBZGFwdGVyKCkKLQotcHVibGljIGFuZHJvaWQud2lkZ2V0Lkxpc3RBZGFwdGVyIGdldEFkYXB0ZXIoKQotCi1wdWJsaWMgaW50IGdldENoZWNrZWRJdGVtUG9zaXRpb24oKQotCi1wdWJsaWMgYW5kcm9pZC51dGlsLlNwYXJzZUJvb2xlYW5BcnJheSBnZXRDaGVja2VkSXRlbVBvc2l0aW9ucygpCi0KLXB1YmxpYyBpbnQgZ2V0Q2hvaWNlTW9kZSgpCi0KLXB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIGdldERpdmlkZXIoKQotCi1wdWJsaWMgaW50IGdldERpdmlkZXJIZWlnaHQoKQotCi1wdWJsaWMgaW50IGdldEZvb3RlclZpZXdzQ291bnQoKQotCi1wdWJsaWMgaW50IGdldEhlYWRlclZpZXdzQ291bnQoKQotCi1wdWJsaWMgYm9vbGVhbiBnZXRJdGVtc0NhbkZvY3VzKCkKLQotcHVibGljIGludCBnZXRNYXhTY3JvbGxBbW91bnQoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0l0ZW1DaGVja2VkKAotaW50KQotCi1wcm90ZWN0ZWQgdm9pZCBsYXlvdXRDaGlsZHJlbigpCi0KLSBpbnQgbG9va0ZvclNlbGVjdGFibGVQb3NpdGlvbigKLWludAotYm9vbGVhbikKLQotZmluYWwgaW50IG1lYXN1cmVIZWlnaHRPZkNoaWxkcmVuKAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQpCi0KLXByb3RlY3RlZCB2b2lkIG9uRmluaXNoSW5mbGF0ZSgpCi0KLXByb3RlY3RlZCB2b2lkIG9uRm9jdXNDaGFuZ2VkKAotYm9vbGVhbgotaW50Ci1hbmRyb2lkLmdyYXBoaWNzLlJlY3QpCi0KLXB1YmxpYyBib29sZWFuIG9uS2V5RG93bigKLWludAotYW5kcm9pZC52aWV3LktleUV2ZW50KQotCi1wdWJsaWMgYm9vbGVhbiBvbktleU11bHRpcGxlKAotaW50Ci1pbnQKLWFuZHJvaWQudmlldy5LZXlFdmVudCkKLQotcHVibGljIGJvb2xlYW4gb25LZXlVcCgKLWludAotYW5kcm9pZC52aWV3LktleUV2ZW50KQotCi1wcm90ZWN0ZWQgdm9pZCBvbk1lYXN1cmUoCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgb25SZXN0b3JlSW5zdGFuY2VTdGF0ZSgKLWFuZHJvaWQub3MuUGFyY2VsYWJsZSkKLQotcHVibGljIGFuZHJvaWQub3MuUGFyY2VsYWJsZSBvblNhdmVJbnN0YW5jZVN0YXRlKCkKLQotcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KAotYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50KQotCi0gYm9vbGVhbiBwYWdlU2Nyb2xsKAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBwZXJmb3JtSXRlbUNsaWNrKAotYW5kcm9pZC52aWV3LlZpZXcKLWludAotbG9uZykKLQotcHVibGljIGJvb2xlYW4gcmVtb3ZlRm9vdGVyVmlldygKLWFuZHJvaWQudmlldy5WaWV3KQotCi1wdWJsaWMgYm9vbGVhbiByZW1vdmVIZWFkZXJWaWV3KAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXB1YmxpYyBib29sZWFuIHJlcXVlc3RDaGlsZFJlY3RhbmdsZU9uU2NyZWVuKAotYW5kcm9pZC52aWV3LlZpZXcKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdAotYm9vbGVhbikKLQotIHZvaWQgcmVzZXRMaXN0KCkKLQotcHVibGljIHZvbGF0aWxlIHZvaWQgc2V0QWRhcHRlcigKLWFuZHJvaWQud2lkZ2V0LkFkYXB0ZXIpCi0KLXB1YmxpYyB2b2lkIHNldEFkYXB0ZXIoCi1hbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlcikKLQotcHVibGljIHZvaWQgc2V0Q2hvaWNlTW9kZSgKLWludCkKLQotcHVibGljIHZvaWQgc2V0RGl2aWRlcigKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUpCi0KLXB1YmxpYyB2b2lkIHNldERpdmlkZXJIZWlnaHQoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldEl0ZW1DaGVja2VkKAotaW50Ci1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRJdGVtc0NhbkZvY3VzKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25BZnRlckhlYWRlclZpZXcoKQotCi1wdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25Gcm9tVG9wKAotaW50Ci1pbnQpCi0KLSB2b2lkIHNldFNlbGVjdGlvbkludCgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvQXV0b0NvbXBsZXRlVGV4dFZpZXc7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9RHJvcERvd25MaXN0VmlldyApCi0gY2xhc3MgYW5kcm9pZC53aWRnZXQuQXV0b0NvbXBsZXRlVGV4dFZpZXckRHJvcERvd25MaXN0VmlldyBleHRlbmRzIGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXB1YmxpYyBpbnQgZ2V0U2VsZWN0aW9uUGFkZGluZ0JvdHRvbSgpCi0KLXB1YmxpYyBpbnQgZ2V0U2VsZWN0aW9uUGFkZGluZ1RvcCgpCi0KLXB1YmxpYyBib29sZWFuIGhhc0ZvY3VzKCkKLQotcHVibGljIGJvb2xlYW4gaGFzV2luZG93Rm9jdXMoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0ZvY3VzZWQoKQotCi1wcm90ZWN0ZWQgYW5kcm9pZC52aWV3LlZpZXcgb2J0YWluVmlldygKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RBZGFwdGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGFyZUFsbEl0ZW1zRW5hYmxlZCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuT2JqZWN0IGdldENoaWxkKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBsb25nIGdldENoaWxkSWQoCi1pbnQKLWludCkKLQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQudmlldy5WaWV3IGdldENoaWxkVmlldygKLWludAotaW50Ci1ib29sZWFuCi1hbmRyb2lkLnZpZXcuVmlldwotYW5kcm9pZC52aWV3LlZpZXdHcm91cCkKLQotcHVibGljIGFic3RyYWN0IGludCBnZXRDaGlsZHJlbkNvdW50KAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgbG9uZyBnZXRDb21iaW5lZENoaWxkSWQoCi1sb25nCi1sb25nKQotCi1wdWJsaWMgYWJzdHJhY3QgbG9uZyBnZXRDb21iaW5lZEdyb3VwSWQoCi1sb25nKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLk9iamVjdCBnZXRHcm91cCgKLWludCkKLQotcHVibGljIGFic3RyYWN0IGludCBnZXRHcm91cENvdW50KCkKLQotcHVibGljIGFic3RyYWN0IGxvbmcgZ2V0R3JvdXBJZCgKLWludCkKLQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQudmlldy5WaWV3IGdldEdyb3VwVmlldygKLWludAotYm9vbGVhbgotYW5kcm9pZC52aWV3LlZpZXcKLWFuZHJvaWQudmlldy5WaWV3R3JvdXApCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGhhc1N0YWJsZUlkcygpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzQ2hpbGRTZWxlY3RhYmxlKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzRW1wdHkoKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvbkdyb3VwQ29sbGFwc2VkKAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvbkdyb3VwRXhwYW5kZWQoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKAotYW5kcm9pZC5kYXRhYmFzZS5EYXRhU2V0T2JzZXJ2ZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHVucmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIoCi1hbmRyb2lkLmRhdGFiYXNlLkRhdGFTZXRPYnNlcnZlcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBhbmRyb2lkLndpZGdldC5CYXNlRXhwYW5kYWJsZUxpc3RBZGFwdGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0QWRhcHRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQuZGF0YWJhc2UuRGF0YVNldE9ic2VydmFibGUgbURhdGFTZXRPYnNlcnZhYmxlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGJvb2xlYW4gYXJlQWxsSXRlbXNFbmFibGVkKCkKLQotcHVibGljIGxvbmcgZ2V0Q29tYmluZWRDaGlsZElkKAotbG9uZwotbG9uZykKLQotcHVibGljIGxvbmcgZ2V0Q29tYmluZWRHcm91cElkKAotbG9uZykKLQotcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpCi0KLXB1YmxpYyB2b2lkIG5vdGlmeURhdGFTZXRDaGFuZ2VkKCkKLQotcHVibGljIHZvaWQgbm90aWZ5RGF0YVNldEludmFsaWRhdGVkKCkKLQotcHVibGljIHZvaWQgb25Hcm91cENvbGxhcHNlZCgKLWludCkKLQotcHVibGljIHZvaWQgb25Hcm91cEV4cGFuZGVkKAotaW50KQotCi1wdWJsaWMgdm9pZCByZWdpc3RlckRhdGFTZXRPYnNlcnZlcigKLWFuZHJvaWQuZGF0YWJhc2UuRGF0YVNldE9ic2VydmVyKQotCi1wdWJsaWMgdm9pZCB1bnJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKAotYW5kcm9pZC5kYXRhYmFzZS5EYXRhU2V0T2JzZXJ2ZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC53aWRnZXQuQnV0dG9uIGV4dGVuZHMgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXcKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQud2lkZ2V0LkNoZWNrYWJsZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0NoZWNrZWQoKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRDaGVja2VkKAotYm9vbGVhbikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgdG9nZ2xlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9Db21wb3VuZEJ1dHRvbiQxO0xhbmRyb2lkL3dpZGdldC9Db21wb3VuZEJ1dHRvbiRTYXZlZFN0YXRlO0xhbmRyb2lkL3dpZGdldC9Db21wb3VuZEJ1dHRvbiRPbkNoZWNrZWRDaGFuZ2VMaXN0ZW5lcjsgKQotcHVibGljIGFic3RyYWN0IGNsYXNzIGFuZHJvaWQud2lkZ2V0LkNvbXBvdW5kQnV0dG9uIGV4dGVuZHMgYW5kcm9pZC53aWRnZXQuQnV0dG9uIGltcGxlbWVudHMgYW5kcm9pZC53aWRnZXQuQ2hlY2thYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIENIRUNLRURfU1RBVEVfU0VUCi0KLXByaXZhdGUgYm9vbGVhbiBtQnJvYWRjYXN0aW5nCi0KLXByaXZhdGUgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSBtQnV0dG9uRHJhd2FibGUKLQotcHJpdmF0ZSBpbnQgbUJ1dHRvblJlc291cmNlCi0KLXByaXZhdGUgYm9vbGVhbiBtQ2hlY2tlZAotCi1wcml2YXRlIGFuZHJvaWQud2lkZ2V0LkNvbXBvdW5kQnV0dG9uJE9uQ2hlY2tlZENoYW5nZUxpc3RlbmVyIG1PbkNoZWNrZWRDaGFuZ2VMaXN0ZW5lcgotCi1wcml2YXRlIGFuZHJvaWQud2lkZ2V0LkNvbXBvdW5kQnV0dG9uJE9uQ2hlY2tlZENoYW5nZUxpc3RlbmVyIG1PbkNoZWNrZWRDaGFuZ2VXaWRnZXRMaXN0ZW5lcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldAotaW50KQotCi1wcm90ZWN0ZWQgdm9pZCBkcmF3YWJsZVN0YXRlQ2hhbmdlZCgpCi0KLXB1YmxpYyBib29sZWFuIGlzQ2hlY2tlZCgpCi0KLXByb3RlY3RlZCBpbnRbXSBvbkNyZWF0ZURyYXdhYmxlU3RhdGUoCi1pbnQpCi0KLXByb3RlY3RlZCB2b2lkIG9uRHJhdygKLWFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzKQotCi1wdWJsaWMgdm9pZCBvblJlc3RvcmVJbnN0YW5jZVN0YXRlKAotYW5kcm9pZC5vcy5QYXJjZWxhYmxlKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlIG9uU2F2ZUluc3RhbmNlU3RhdGUoKQotCi1wdWJsaWMgYm9vbGVhbiBwZXJmb3JtQ2xpY2soKQotCi1wdWJsaWMgdm9pZCBzZXRCdXR0b25EcmF3YWJsZSgKLWludCkKLQotcHVibGljIHZvaWQgc2V0QnV0dG9uRHJhd2FibGUoCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlKQotCi1wdWJsaWMgdm9pZCBzZXRDaGVja2VkKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0T25DaGVja2VkQ2hhbmdlTGlzdGVuZXIoCi1hbmRyb2lkLndpZGdldC5Db21wb3VuZEJ1dHRvbiRPbkNoZWNrZWRDaGFuZ2VMaXN0ZW5lcikKLQotIHZvaWQgc2V0T25DaGVja2VkQ2hhbmdlV2lkZ2V0TGlzdGVuZXIoCi1hbmRyb2lkLndpZGdldC5Db21wb3VuZEJ1dHRvbiRPbkNoZWNrZWRDaGFuZ2VMaXN0ZW5lcikKLQotcHVibGljIHZvaWQgdG9nZ2xlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLndpZGdldC5DaGVja0JveCBleHRlbmRzIGFuZHJvaWQud2lkZ2V0LkNvbXBvdW5kQnV0dG9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGFuZHJvaWQud2lkZ2V0LkNoZWNrZWRUZXh0VmlldyBleHRlbmRzIGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3IGltcGxlbWVudHMgYW5kcm9pZC53aWRnZXQuQ2hlY2thYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIENIRUNLRURfU1RBVEVfU0VUCi0KLXByaXZhdGUgaW50IG1CYXNlUGFkZGluZ1JpZ2h0Ci0KLXByaXZhdGUgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSBtQ2hlY2tNYXJrRHJhd2FibGUKLQotcHJpdmF0ZSBpbnQgbUNoZWNrTWFya1Jlc291cmNlCi0KLXByaXZhdGUgaW50IG1DaGVja01hcmtXaWR0aAotCi1wcml2YXRlIGJvb2xlYW4gbUNoZWNrZWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQKLWludCkKLQotcHJvdGVjdGVkIHZvaWQgZHJhd2FibGVTdGF0ZUNoYW5nZWQoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0NoZWNrZWQoKQotCi1wcm90ZWN0ZWQgaW50W10gb25DcmVhdGVEcmF3YWJsZVN0YXRlKAotaW50KQotCi1wcm90ZWN0ZWQgdm9pZCBvbkRyYXcoCi1hbmRyb2lkLmdyYXBoaWNzLkNhbnZhcykKLQotcHVibGljIHZvaWQgc2V0Q2hlY2tNYXJrRHJhd2FibGUoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldENoZWNrTWFya0RyYXdhYmxlKAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSkKLQotcHVibGljIHZvaWQgc2V0Q2hlY2tlZCgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldFBhZGRpbmcoCi1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIHRvZ2dsZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L0Nocm9ub21ldGVyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi0gY2xhc3MgYW5kcm9pZC53aWRnZXQuQ2hyb25vbWV0ZXIkMSBleHRlbmRzIGFuZHJvaWQub3MuSGFuZGxlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLndpZGdldC5DaHJvbm9tZXRlciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLndpZGdldC5DaHJvbm9tZXRlcikKLQotcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZSgKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MkUmVtb3RlVmlldwotcHVibGljIGNsYXNzIGFuZHJvaWQud2lkZ2V0LkNocm9ub21ldGVyIGV4dGVuZHMgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXcKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLQotcHJpdmF0ZSBsb25nIG1CYXNlCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtRm9ybWF0Ci0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIgbUZvcm1hdEJ1aWxkZXIKLQotcHJpdmF0ZSBqYXZhLnV0aWwuRm9ybWF0dGVyIG1Gb3JtYXR0ZXIKLQotcHJpdmF0ZSBqYXZhLmxhbmcuT2JqZWN0W10gbUZvcm1hdHRlckFyZ3MKLQotcHJpdmF0ZSBqYXZhLnV0aWwuTG9jYWxlIG1Gb3JtYXR0ZXJMb2NhbGUKLQotcHJpdmF0ZSBhbmRyb2lkLm9zLkhhbmRsZXIgbUhhbmRsZXIKLQotcHJpdmF0ZSBib29sZWFuIG1Mb2dnZWQKLQotcHJpdmF0ZSBib29sZWFuIG1SdW5uaW5nCi0KLXByaXZhdGUgYm9vbGVhbiBtU3RhcnRlZAotCi1wcml2YXRlIGJvb2xlYW4gbVZpc2libGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ci1pbnQpCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQwMDAoCi1hbmRyb2lkLndpZGdldC5DaHJvbm9tZXRlcikKLQotc3RhdGljIHZvaWQgYWNjZXNzJDEwMCgKLWFuZHJvaWQud2lkZ2V0LkNocm9ub21ldGVyCi1sb25nKQotCi1wcml2YXRlIHZvaWQgaW5pdCgpCi0KLXByaXZhdGUgdm9pZCB1cGRhdGVSdW5uaW5nKCkKLQotcHJpdmF0ZSB2b2lkIHVwZGF0ZVRleHQoCi1sb25nKQotCi1wdWJsaWMgbG9uZyBnZXRCYXNlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Rm9ybWF0KCkKLQotcHJvdGVjdGVkIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3coKQotCi1wcm90ZWN0ZWQgdm9pZCBvbldpbmRvd1Zpc2liaWxpdHlDaGFuZ2VkKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRCYXNlKAotbG9uZykKLQotcHVibGljIHZvaWQgc2V0Rm9ybWF0KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc3RhcnQoKQotCi1wdWJsaWMgdm9pZCBzdG9wKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvQ29tcG91bmRCdXR0b247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9NDEwNCBuYW1lID1udWxsICkKLSBjbGFzcyBhbmRyb2lkLndpZGdldC5Db21wb3VuZEJ1dHRvbiQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPU9uQ2hlY2tlZENoYW5nZUxpc3RlbmVyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9Db21wb3VuZEJ1dHRvbjsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLndpZGdldC5Db21wb3VuZEJ1dHRvbiRPbkNoZWNrZWRDaGFuZ2VMaXN0ZW5lciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvbkNoZWNrZWRDaGFuZ2VkKAotYW5kcm9pZC53aWRnZXQuQ29tcG91bmRCdXR0b24KLWJvb2xlYW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L0NvbXBvdW5kQnV0dG9uJFNhdmVkU3RhdGU7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I8TGFuZHJvaWQvd2lkZ2V0L0NvbXBvdW5kQnV0dG9uJFNhdmVkU3RhdGU7PjsgKQotZmluYWwgY2xhc3MgYW5kcm9pZC53aWRnZXQuQ29tcG91bmRCdXR0b24kU2F2ZWRTdGF0ZSQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGFuZHJvaWQud2lkZ2V0LkNvbXBvdW5kQnV0dG9uJFNhdmVkU3RhdGUgY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyBhbmRyb2lkLndpZGdldC5Db21wb3VuZEJ1dHRvbiRTYXZlZFN0YXRlW10gbmV3QXJyYXkoCi1pbnQpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0W10gbmV3QXJyYXkoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPVNhdmVkU3RhdGUgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L0NvbXBvdW5kQnV0dG9uOyApCi0gY2xhc3MgYW5kcm9pZC53aWRnZXQuQ29tcG91bmRCdXR0b24kU2F2ZWRTdGF0ZSBleHRlbmRzIGFuZHJvaWQudmlldy5WaWV3JEJhc2VTYXZlZFN0YXRlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExhbmRyb2lkL3dpZGdldC9Db21wb3VuZEJ1dHRvbiRTYXZlZFN0YXRlOz47ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IgQ1JFQVRPUgotCi0gYm9vbGVhbiBjaGVja2VkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuUGFyY2VsCi1hbmRyb2lkLndpZGdldC5Db21wb3VuZEJ1dHRvbiQxKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLlBhcmNlbGFibGUpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID00MTA0IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L0N1cnNvckFkYXB0ZXI7ICkKLSBjbGFzcyBhbmRyb2lkLndpZGdldC5DdXJzb3JBZGFwdGVyJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTIgbmFtZSA9Q2hhbmdlT2JzZXJ2ZXIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L0N1cnNvckFkYXB0ZXI7ICkKLSBjbGFzcyBhbmRyb2lkLndpZGdldC5DdXJzb3JBZGFwdGVyJENoYW5nZU9ic2VydmVyIGV4dGVuZHMgYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC53aWRnZXQuQ3Vyc29yQWRhcHRlciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLndpZGdldC5DdXJzb3JBZGFwdGVyKQotCi1wdWJsaWMgYm9vbGVhbiBkZWxpdmVyU2VsZk5vdGlmaWNhdGlvbnMoKQotCi1wdWJsaWMgdm9pZCBvbkNoYW5nZSgKLWJvb2xlYW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L0N1cnNvckFkYXB0ZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MiBuYW1lID1NeURhdGFTZXRPYnNlcnZlciApCi0gY2xhc3MgYW5kcm9pZC53aWRnZXQuQ3Vyc29yQWRhcHRlciRNeURhdGFTZXRPYnNlcnZlciBleHRlbmRzIGFuZHJvaWQuZGF0YWJhc2UuRGF0YVNldE9ic2VydmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXIgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXIpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXIKLWFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXIkMSkKLQotcHVibGljIHZvaWQgb25DaGFuZ2VkKCkKLQotcHVibGljIHZvaWQgb25JbnZhbGlkYXRlZCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvQ3Vyc29yRmlsdGVyJEN1cnNvckZpbHRlckNsaWVudDsgKQotIGNsYXNzIGFuZHJvaWQud2lkZ2V0LkN1cnNvckZpbHRlciBleHRlbmRzIGFuZHJvaWQud2lkZ2V0LkZpbHRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gYW5kcm9pZC53aWRnZXQuQ3Vyc29yRmlsdGVyJEN1cnNvckZpbHRlckNsaWVudCBtQ2xpZW50Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53aWRnZXQuQ3Vyc29yRmlsdGVyJEN1cnNvckZpbHRlckNsaWVudCkKLQotcHVibGljIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgY29udmVydFJlc3VsdFRvU3RyaW5nKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHJvdGVjdGVkIGFuZHJvaWQud2lkZ2V0LkZpbHRlciRGaWx0ZXJSZXN1bHRzIHBlcmZvcm1GaWx0ZXJpbmcoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotCi1wcm90ZWN0ZWQgdm9pZCBwdWJsaXNoUmVzdWx0cygKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWFuZHJvaWQud2lkZ2V0LkZpbHRlciRGaWx0ZXJSZXN1bHRzKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9NDEwNCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9DdXJzb3JUcmVlQWRhcHRlcjsgKQotIGNsYXNzIGFuZHJvaWQud2lkZ2V0LkN1cnNvclRyZWVBZGFwdGVyJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvQ3Vyc29yVHJlZUFkYXB0ZXIkTXlDdXJzb3JIZWxwZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MiBuYW1lID1NeUNvbnRlbnRPYnNlcnZlciApCi0gY2xhc3MgYW5kcm9pZC53aWRnZXQuQ3Vyc29yVHJlZUFkYXB0ZXIkTXlDdXJzb3JIZWxwZXIkTXlDb250ZW50T2JzZXJ2ZXIgZXh0ZW5kcyBhbmRyb2lkLmRhdGFiYXNlLkNvbnRlbnRPYnNlcnZlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLndpZGdldC5DdXJzb3JUcmVlQWRhcHRlciRNeUN1cnNvckhlbHBlciB0aGlzJDEKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLndpZGdldC5DdXJzb3JUcmVlQWRhcHRlciRNeUN1cnNvckhlbHBlcikKLQotcHVibGljIGJvb2xlYW4gZGVsaXZlclNlbGZOb3RpZmljYXRpb25zKCkKLQotcHVibGljIHZvaWQgb25DaGFuZ2UoCi1ib29sZWFuKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MiBuYW1lID1NeURhdGFTZXRPYnNlcnZlciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvQ3Vyc29yVHJlZUFkYXB0ZXIkTXlDdXJzb3JIZWxwZXI7ICkKLSBjbGFzcyBhbmRyb2lkLndpZGdldC5DdXJzb3JUcmVlQWRhcHRlciRNeUN1cnNvckhlbHBlciRNeURhdGFTZXRPYnNlcnZlciBleHRlbmRzIGFuZHJvaWQuZGF0YWJhc2UuRGF0YVNldE9ic2VydmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQud2lkZ2V0LkN1cnNvclRyZWVBZGFwdGVyJE15Q3Vyc29ySGVscGVyIHRoaXMkMQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLndpZGdldC5DdXJzb3JUcmVlQWRhcHRlciRNeUN1cnNvckhlbHBlcikKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53aWRnZXQuQ3Vyc29yVHJlZUFkYXB0ZXIkTXlDdXJzb3JIZWxwZXIKLWFuZHJvaWQud2lkZ2V0LkN1cnNvclRyZWVBZGFwdGVyJDEpCi0KLXB1YmxpYyB2b2lkIG9uQ2hhbmdlZCgpCi0KLXB1YmxpYyB2b2lkIG9uSW52YWxpZGF0ZWQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9DdXJzb3JUcmVlQWRhcHRlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvQ3Vyc29yVHJlZUFkYXB0ZXIkTXlDdXJzb3JIZWxwZXIkTXlEYXRhU2V0T2JzZXJ2ZXI7TGFuZHJvaWQvd2lkZ2V0L0N1cnNvclRyZWVBZGFwdGVyJE15Q3Vyc29ySGVscGVyJE15Q29udGVudE9ic2VydmVyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9TXlDdXJzb3JIZWxwZXIgKQotIGNsYXNzIGFuZHJvaWQud2lkZ2V0LkN1cnNvclRyZWVBZGFwdGVyJE15Q3Vyc29ySGVscGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGFuZHJvaWQud2lkZ2V0LkN1cnNvclRyZWVBZGFwdGVyJE15Q3Vyc29ySGVscGVyJE15Q29udGVudE9ic2VydmVyIG1Db250ZW50T2JzZXJ2ZXIKLQotcHJpdmF0ZSBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciBtQ3Vyc29yCi0KLXByaXZhdGUgYW5kcm9pZC53aWRnZXQuQ3Vyc29yVHJlZUFkYXB0ZXIkTXlDdXJzb3JIZWxwZXIkTXlEYXRhU2V0T2JzZXJ2ZXIgbURhdGFTZXRPYnNlcnZlcgotCi1wcml2YXRlIGJvb2xlYW4gbURhdGFWYWxpZAotCi1wcml2YXRlIGludCBtUm93SURDb2x1bW4KLQotZmluYWwgYW5kcm9pZC53aWRnZXQuQ3Vyc29yVHJlZUFkYXB0ZXIgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53aWRnZXQuQ3Vyc29yVHJlZUFkYXB0ZXIKLWFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yKQotCi1zdGF0aWMgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IgYWNjZXNzJDMwMCgKLWFuZHJvaWQud2lkZ2V0LkN1cnNvclRyZWVBZGFwdGVyJE15Q3Vyc29ySGVscGVyKQotCi1zdGF0aWMgYm9vbGVhbiBhY2Nlc3MkNDAyKAotYW5kcm9pZC53aWRnZXQuQ3Vyc29yVHJlZUFkYXB0ZXIkTXlDdXJzb3JIZWxwZXIKLWJvb2xlYW4pCi0KLSB2b2lkIGNoYW5nZUN1cnNvcigKLWFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yCi1ib29sZWFuKQotCi0gdm9pZCBkZWFjdGl2YXRlKCkKLQotIGludCBnZXRDb3VudCgpCi0KLSBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciBnZXRDdXJzb3IoKQotCi0gbG9uZyBnZXRJZCgKLWludCkKLQotIGJvb2xlYW4gaXNWYWxpZCgpCi0KLSBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciBtb3ZlVG8oCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvQ3Vyc29yVHJlZUFkYXB0ZXIkMTtMYW5kcm9pZC93aWRnZXQvQ3Vyc29yVHJlZUFkYXB0ZXIkTXlDdXJzb3JIZWxwZXI7ICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBhbmRyb2lkLndpZGdldC5DdXJzb3JUcmVlQWRhcHRlciBleHRlbmRzIGFuZHJvaWQud2lkZ2V0LkJhc2VFeHBhbmRhYmxlTGlzdEFkYXB0ZXIgaW1wbGVtZW50cyBhbmRyb2lkLndpZGdldC5GaWx0ZXJhYmxlLCBhbmRyb2lkLndpZGdldC5DdXJzb3JGaWx0ZXIkQ3Vyc29yRmlsdGVyQ2xpZW50Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYm9vbGVhbiBtQXV0b1JlcXVlcnkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MYW5kcm9pZC91dGlsL1NwYXJzZUFycmF5PExhbmRyb2lkL3dpZGdldC9DdXJzb3JUcmVlQWRhcHRlciRNeUN1cnNvckhlbHBlcjs+OyApCi0gYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5IG1DaGlsZHJlbkN1cnNvckhlbHBlcnMKLQotcHJpdmF0ZSBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBtQ29udGV4dAotCi0gYW5kcm9pZC53aWRnZXQuQ3Vyc29yRmlsdGVyIG1DdXJzb3JGaWx0ZXIKLQotIGFuZHJvaWQud2lkZ2V0LkZpbHRlclF1ZXJ5UHJvdmlkZXIgbUZpbHRlclF1ZXJ5UHJvdmlkZXIKLQotIGFuZHJvaWQud2lkZ2V0LkN1cnNvclRyZWVBZGFwdGVyJE15Q3Vyc29ySGVscGVyIG1Hcm91cEN1cnNvckhlbHBlcgotCi1wcml2YXRlIGFuZHJvaWQub3MuSGFuZGxlciBtSGFuZGxlcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1ib29sZWFuKQotCi1zdGF0aWMgYW5kcm9pZC5vcy5IYW5kbGVyIGFjY2VzcyQxMDAoCi1hbmRyb2lkLndpZGdldC5DdXJzb3JUcmVlQWRhcHRlcikKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDIwMCgKLWFuZHJvaWQud2lkZ2V0LkN1cnNvclRyZWVBZGFwdGVyKQotCi1wcml2YXRlIHZvaWQgaW5pdCgKLWFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYm9vbGVhbikKLQotcHJpdmF0ZSB2b2lkIHJlbGVhc2VDdXJzb3JIZWxwZXJzKCkKLQotcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYmluZENoaWxkVmlldygKLWFuZHJvaWQudmlldy5WaWV3Ci1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IKLWJvb2xlYW4pCi0KLXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGJpbmRHcm91cFZpZXcoCi1hbmRyb2lkLnZpZXcuVmlldwotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBjaGFuZ2VDdXJzb3IoCi1hbmRyb2lkLmRhdGFiYXNlLkN1cnNvcikKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgY29udmVydFRvU3RyaW5nKAotYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGNvbnZlcnRUb1N0cmluZygKLWFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yKQotCi0gdm9pZCBkZWFjdGl2YXRlQ2hpbGRyZW5DdXJzb3JIZWxwZXIoCi1pbnQpCi0KLXB1YmxpYyBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciBnZXRDaGlsZCgKLWludAotaW50KQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBnZXRDaGlsZCgKLWludAotaW50KQotCi1wdWJsaWMgbG9uZyBnZXRDaGlsZElkKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuVmlldyBnZXRDaGlsZFZpZXcoCi1pbnQKLWludAotYm9vbGVhbgotYW5kcm9pZC52aWV3LlZpZXcKLWFuZHJvaWQudmlldy5WaWV3R3JvdXApCi0KLXB1YmxpYyBpbnQgZ2V0Q2hpbGRyZW5Db3VudCgKLWludCkKLQotcHJvdGVjdGVkIGFic3RyYWN0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIGdldENoaWxkcmVuQ3Vyc29yKAotYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IpCi0KLSBhbmRyb2lkLndpZGdldC5DdXJzb3JUcmVlQWRhcHRlciRNeUN1cnNvckhlbHBlciBnZXRDaGlsZHJlbkN1cnNvckhlbHBlcigKLWludAotYm9vbGVhbikKLQotcHVibGljIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIGdldEN1cnNvcigpCi0KLXB1YmxpYyBhbmRyb2lkLndpZGdldC5GaWx0ZXIgZ2V0RmlsdGVyKCkKLQotcHVibGljIGFuZHJvaWQud2lkZ2V0LkZpbHRlclF1ZXJ5UHJvdmlkZXIgZ2V0RmlsdGVyUXVlcnlQcm92aWRlcigpCi0KLXB1YmxpYyBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciBnZXRHcm91cCgKLWludCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgZ2V0R3JvdXAoCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0R3JvdXBDb3VudCgpCi0KLXB1YmxpYyBsb25nIGdldEdyb3VwSWQoCi1pbnQpCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuVmlldyBnZXRHcm91cFZpZXcoCi1pbnQKLWJvb2xlYW4KLWFuZHJvaWQudmlldy5WaWV3Ci1hbmRyb2lkLnZpZXcuVmlld0dyb3VwKQotCi1wdWJsaWMgYm9vbGVhbiBoYXNTdGFibGVJZHMoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0NoaWxkU2VsZWN0YWJsZSgKLWludAotaW50KQotCi1wcm90ZWN0ZWQgYWJzdHJhY3QgYW5kcm9pZC52aWV3LlZpZXcgbmV3Q2hpbGRWaWV3KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yCi1ib29sZWFuCi1hbmRyb2lkLnZpZXcuVmlld0dyb3VwKQotCi1wcm90ZWN0ZWQgYWJzdHJhY3QgYW5kcm9pZC52aWV3LlZpZXcgbmV3R3JvdXBWaWV3KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yCi1ib29sZWFuCi1hbmRyb2lkLnZpZXcuVmlld0dyb3VwKQotCi1wdWJsaWMgdm9pZCBub3RpZnlEYXRhU2V0Q2hhbmdlZCgpCi0KLXB1YmxpYyB2b2lkIG5vdGlmeURhdGFTZXRDaGFuZ2VkKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgbm90aWZ5RGF0YVNldEludmFsaWRhdGVkKCkKLQotcHVibGljIHZvaWQgb25Hcm91cENvbGxhcHNlZCgKLWludCkKLQotcHVibGljIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIHJ1blF1ZXJ5T25CYWNrZ3JvdW5kVGhyZWFkKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotcHVibGljIHZvaWQgc2V0Q2hpbGRyZW5DdXJzb3IoCi1pbnQKLWFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yKQotCi1wdWJsaWMgdm9pZCBzZXRGaWx0ZXJRdWVyeVByb3ZpZGVyKAotYW5kcm9pZC53aWRnZXQuRmlsdGVyUXVlcnlQcm92aWRlcikKLQotcHVibGljIHZvaWQgc2V0R3JvdXBDdXJzb3IoCi1hbmRyb2lkLmRhdGFiYXNlLkN1cnNvcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9T25DaGFuZ2VkTGlzdGVuZXIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9OdW1iZXJQaWNrZXI7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0Lk51bWJlclBpY2tlciRPbkNoYW5nZWRMaXN0ZW5lciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvbkNoYW5nZWQoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTnVtYmVyUGlja2VyCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi0gY2xhc3MgYW5kcm9pZC53aWRnZXQuRGF0ZVBpY2tlciQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5OdW1iZXJQaWNrZXIkT25DaGFuZ2VkTGlzdGVuZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC53aWRnZXQuRGF0ZVBpY2tlciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLndpZGdldC5EYXRlUGlja2VyKQotCi1wdWJsaWMgdm9pZCBvbkNoYW5nZWQoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTnVtYmVyUGlja2VyCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi0gY2xhc3MgYW5kcm9pZC53aWRnZXQuRGF0ZVBpY2tlciQyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5OdW1iZXJQaWNrZXIkT25DaGFuZ2VkTGlzdGVuZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC53aWRnZXQuRGF0ZVBpY2tlciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLndpZGdldC5EYXRlUGlja2VyKQotCi1wdWJsaWMgdm9pZCBvbkNoYW5nZWQoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTnVtYmVyUGlja2VyCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi0gY2xhc3MgYW5kcm9pZC53aWRnZXQuRGF0ZVBpY2tlciQzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5OdW1iZXJQaWNrZXIkT25DaGFuZ2VkTGlzdGVuZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC53aWRnZXQuRGF0ZVBpY2tlciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLndpZGdldC5EYXRlUGlja2VyKQotCi1wdWJsaWMgdm9pZCBvbkNoYW5nZWQoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTnVtYmVyUGlja2VyCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExhbmRyb2lkL3dpZGdldC9EYXRlUGlja2VyJFNhdmVkU3RhdGU7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L0RhdGVQaWNrZXIkU2F2ZWRTdGF0ZTsgKQotZmluYWwgY2xhc3MgYW5kcm9pZC53aWRnZXQuRGF0ZVBpY2tlciRTYXZlZFN0YXRlJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgYW5kcm9pZC53aWRnZXQuRGF0ZVBpY2tlciRTYXZlZFN0YXRlIGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgYW5kcm9pZC53aWRnZXQuRGF0ZVBpY2tlciRTYXZlZFN0YXRlW10gbmV3QXJyYXkoCi1pbnQpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0W10gbmV3QXJyYXkoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L0RhdGVQaWNrZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9U2F2ZWRTdGF0ZSApCi0gY2xhc3MgYW5kcm9pZC53aWRnZXQuRGF0ZVBpY2tlciRTYXZlZFN0YXRlIGV4dGVuZHMgYW5kcm9pZC52aWV3LlZpZXckQmFzZVNhdmVkU3RhdGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I8TGFuZHJvaWQvd2lkZ2V0L0RhdGVQaWNrZXIkU2F2ZWRTdGF0ZTs+OyApCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yIENSRUFUT1IKLQotcHJpdmF0ZSBmaW5hbCBpbnQgbURheQotCi1wcml2YXRlIGZpbmFsIGludCBtTW9udGgKLQotcHJpdmF0ZSBmaW5hbCBpbnQgbVllYXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5QYXJjZWwKLWFuZHJvaWQud2lkZ2V0LkRhdGVQaWNrZXIkMSkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuUGFyY2VsYWJsZQotaW50Ci1pbnQKLWludCkKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5QYXJjZWxhYmxlCi1pbnQKLWludAotaW50Ci1hbmRyb2lkLndpZGdldC5EYXRlUGlja2VyJDEpCi0KLXB1YmxpYyBpbnQgZ2V0RGF5KCkKLQotcHVibGljIGludCBnZXRNb250aCgpCi0KLXB1YmxpYyBpbnQgZ2V0WWVhcigpCi0KLXB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3cyRSZW1vdGVWaWV3Ci1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9GcmFtZUxheW91dCRMYXlvdXRQYXJhbXM7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dCBleHRlbmRzIGFuZHJvaWQudmlldy5WaWV3R3JvdXAKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIG1Gb3JlZ3JvdW5kCi0KLXByaXZhdGUgaW50IG1Gb3JlZ3JvdW5kR3Jhdml0eQotCi1wcml2YXRlIGludCBtRm9yZWdyb3VuZFBhZGRpbmdCb3R0b20KLQotcHJpdmF0ZSBpbnQgbUZvcmVncm91bmRQYWRkaW5nTGVmdAotCi1wcml2YXRlIGludCBtRm9yZWdyb3VuZFBhZGRpbmdSaWdodAotCi1wcml2YXRlIGludCBtRm9yZWdyb3VuZFBhZGRpbmdUb3AKLQotIGJvb2xlYW4gbU1lYXN1cmVBbGxDaGlsZHJlbgotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUmVjdCBtT3ZlcmxheUJvdW5kcwotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUmVjdCBtU2VsZkJvdW5kcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQKLWludCkKLQotcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tMYXlvdXRQYXJhbXMoCi1hbmRyb2lkLnZpZXcuVmlld0dyb3VwJExheW91dFBhcmFtcykKLQotcHVibGljIHZvaWQgZHJhdygKLWFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzKQotCi1wcm90ZWN0ZWQgdm9pZCBkcmF3YWJsZVN0YXRlQ2hhbmdlZCgpCi0KLXB1YmxpYyBib29sZWFuIGdhdGhlclRyYW5zcGFyZW50UmVnaW9uKAotYW5kcm9pZC5ncmFwaGljcy5SZWdpb24pCi0KLXByb3RlY3RlZCB2b2xhdGlsZSBhbmRyb2lkLnZpZXcuVmlld0dyb3VwJExheW91dFBhcmFtcyBnZW5lcmF0ZURlZmF1bHRMYXlvdXRQYXJhbXMoKQotCi1wcm90ZWN0ZWQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQkTGF5b3V0UGFyYW1zIGdlbmVyYXRlRGVmYXVsdExheW91dFBhcmFtcygpCi0KLXB1YmxpYyB2b2xhdGlsZSBhbmRyb2lkLnZpZXcuVmlld0dyb3VwJExheW91dFBhcmFtcyBnZW5lcmF0ZUxheW91dFBhcmFtcygKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi0KLXByb3RlY3RlZCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwJExheW91dFBhcmFtcyBnZW5lcmF0ZUxheW91dFBhcmFtcygKLWFuZHJvaWQudmlldy5WaWV3R3JvdXAkTGF5b3V0UGFyYW1zKQotCi1wdWJsaWMgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQkTGF5b3V0UGFyYW1zIGdlbmVyYXRlTGF5b3V0UGFyYW1zKAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHVibGljIGJvb2xlYW4gZ2V0Q29uc2lkZXJHb25lQ2hpbGRyZW5XaGVuTWVhc3VyaW5nKCkKLQotcHVibGljIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgZ2V0Rm9yZWdyb3VuZCgpCi0KLXByb3RlY3RlZCB2b2lkIG9uTGF5b3V0KAotYm9vbGVhbgotaW50Ci1pbnQKLWludAotaW50KQotCi1wcm90ZWN0ZWQgdm9pZCBvbk1lYXN1cmUoCi1pbnQKLWludCkKLQotcHJvdGVjdGVkIHZvaWQgb25TaXplQ2hhbmdlZCgKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgc2V0Rm9yZWdyb3VuZCgKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUpCi0KLXB1YmxpYyB2b2lkIHNldEZvcmVncm91bmRHcmF2aXR5KAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRNZWFzdXJlQWxsQ2hpbGRyZW4oCi1ib29sZWFuKQotCi1wcm90ZWN0ZWQgYm9vbGVhbiB2ZXJpZnlEcmF3YWJsZSgKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvRGF0ZVBpY2tlciRTYXZlZFN0YXRlO0xhbmRyb2lkL3dpZGdldC9EYXRlUGlja2VyJE9uRGF0ZUNoYW5nZWRMaXN0ZW5lcjsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQud2lkZ2V0LkRhdGVQaWNrZXIgZXh0ZW5kcyBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9FTkRfWUVBUgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9TVEFSVF9ZRUFSCi0KLXByaXZhdGUgaW50IG1EYXkKLQotcHJpdmF0ZSBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTnVtYmVyUGlja2VyIG1EYXlQaWNrZXIKLQotcHJpdmF0ZSBmaW5hbCBpbnQgbUVuZFllYXIKLQotcHJpdmF0ZSBpbnQgbU1vbnRoCi0KLXByaXZhdGUgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0Lk51bWJlclBpY2tlciBtTW9udGhQaWNrZXIKLQotcHJpdmF0ZSBhbmRyb2lkLndpZGdldC5EYXRlUGlja2VyJE9uRGF0ZUNoYW5nZWRMaXN0ZW5lciBtT25EYXRlQ2hhbmdlZExpc3RlbmVyCi0KLXByaXZhdGUgZmluYWwgaW50IG1TdGFydFllYXIKLQotcHJpdmF0ZSBpbnQgbVllYXIKLQotcHJpdmF0ZSBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTnVtYmVyUGlja2VyIG1ZZWFyUGlja2VyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldAotaW50KQotCi1zdGF0aWMgaW50IGFjY2VzcyQwMDAoCi1hbmRyb2lkLndpZGdldC5EYXRlUGlja2VyKQotCi1zdGF0aWMgaW50IGFjY2VzcyQwMDIoCi1hbmRyb2lkLndpZGdldC5EYXRlUGlja2VyCi1pbnQpCi0KLXN0YXRpYyBhbmRyb2lkLndpZGdldC5EYXRlUGlja2VyJE9uRGF0ZUNoYW5nZWRMaXN0ZW5lciBhY2Nlc3MkMTAwKAotYW5kcm9pZC53aWRnZXQuRGF0ZVBpY2tlcikKLQotc3RhdGljIGludCBhY2Nlc3MkMjAwKAotYW5kcm9pZC53aWRnZXQuRGF0ZVBpY2tlcikKLQotc3RhdGljIGludCBhY2Nlc3MkMjAyKAotYW5kcm9pZC53aWRnZXQuRGF0ZVBpY2tlcgotaW50KQotCi1zdGF0aWMgaW50IGFjY2VzcyQzMDAoCi1hbmRyb2lkLndpZGdldC5EYXRlUGlja2VyKQotCi1zdGF0aWMgaW50IGFjY2VzcyQzMDIoCi1hbmRyb2lkLndpZGdldC5EYXRlUGlja2VyCi1pbnQpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQ0MDAoCi1hbmRyb2lkLndpZGdldC5EYXRlUGlja2VyKQotCi1wcml2YXRlIHZvaWQgcmVvcmRlclBpY2tlcnMoKQotCi1wcml2YXRlIHZvaWQgdXBkYXRlRGF5U3Bpbm5lcigpCi0KLXByaXZhdGUgdm9pZCB1cGRhdGVTcGlubmVycygpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExhbmRyb2lkL3V0aWwvU3BhcnNlQXJyYXk8TGFuZHJvaWQvb3MvUGFyY2VsYWJsZTs+OylWICkKLXByb3RlY3RlZCB2b2lkIGRpc3BhdGNoUmVzdG9yZUluc3RhbmNlU3RhdGUoCi1hbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXkpCi0KLXB1YmxpYyBpbnQgZ2V0RGF5T2ZNb250aCgpCi0KLXB1YmxpYyBpbnQgZ2V0TW9udGgoKQotCi1wdWJsaWMgaW50IGdldFllYXIoKQotCi1wdWJsaWMgdm9pZCBpbml0KAotaW50Ci1pbnQKLWludAotYW5kcm9pZC53aWRnZXQuRGF0ZVBpY2tlciRPbkRhdGVDaGFuZ2VkTGlzdGVuZXIpCi0KLXByb3RlY3RlZCB2b2lkIG9uUmVzdG9yZUluc3RhbmNlU3RhdGUoCi1hbmRyb2lkLm9zLlBhcmNlbGFibGUpCi0KLXByb3RlY3RlZCBhbmRyb2lkLm9zLlBhcmNlbGFibGUgb25TYXZlSW5zdGFuY2VTdGF0ZSgpCi0KLXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCB1cGRhdGVEYXRlKAotaW50Ci1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLndpZGdldC5EaWFsZXJGaWx0ZXIgZXh0ZW5kcyBhbmRyb2lkLndpZGdldC5SZWxhdGl2ZUxheW91dAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBESUdJVFNfQU5EX0xFVFRFUlMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElHSVRTX0FORF9MRVRURVJTX05PX0RJR0lUUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBESUdJVFNfQU5EX0xFVFRFUlNfTk9fTEVUVEVSUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBESUdJVFNfT05MWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRVRURVJTX09OTFkKLQotIGFuZHJvaWQud2lkZ2V0LkVkaXRUZXh0IG1EaWdpdHMKLQotIGFuZHJvaWQud2lkZ2V0LkVkaXRUZXh0IG1IaW50Ci0KLSBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXcgbUljb24KLQotIGFuZHJvaWQudGV4dC5JbnB1dEZpbHRlcltdIG1JbnB1dEZpbHRlcnMKLQotcHJpdmF0ZSBib29sZWFuIG1Jc1F3ZXJ0eQotCi0gYW5kcm9pZC53aWRnZXQuRWRpdFRleHQgbUxldHRlcnMKLQotIGludCBtTW9kZQotCi0gYW5kcm9pZC53aWRnZXQuRWRpdFRleHQgbVByaW1hcnkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi0KLXByaXZhdGUgdm9pZCBtYWtlRGlnaXRzUHJpbWFyeSgpCi0KLXByaXZhdGUgdm9pZCBtYWtlTGV0dGVyc1ByaW1hcnkoKQotCi1wcml2YXRlIHZvaWQgc3dhcFByaW1hcnlBbmRIaW50KAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgYXBwZW5kKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgY2xlYXJUZXh0KCkKLQotcHVibGljIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgZ2V0RGlnaXRzKCkKLQotcHVibGljIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgZ2V0RmlsdGVyVGV4dCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIGdldExldHRlcnMoKQotCi1wdWJsaWMgaW50IGdldE1vZGUoKQotCi1wdWJsaWMgYm9vbGVhbiBpc1F3ZXJ0eUtleWJvYXJkKCkKLQotcHJvdGVjdGVkIHZvaWQgb25GaW5pc2hJbmZsYXRlKCkKLQotcHJvdGVjdGVkIHZvaWQgb25Gb2N1c0NoYW5nZWQoCi1ib29sZWFuCi1pbnQKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdCkKLQotcHVibGljIGJvb2xlYW4gb25LZXlEb3duKAotaW50Ci1hbmRyb2lkLnZpZXcuS2V5RXZlbnQpCi0KLXB1YmxpYyBib29sZWFuIG9uS2V5VXAoCi1pbnQKLWFuZHJvaWQudmlldy5LZXlFdmVudCkKLQotcHJvdGVjdGVkIHZvaWQgb25Nb2RlQ2hhbmdlKAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIHJlbW92ZUZpbHRlcldhdGNoZXIoCi1hbmRyb2lkLnRleHQuVGV4dFdhdGNoZXIpCi0KLXB1YmxpYyB2b2lkIHNldERpZ2l0c1dhdGNoZXIoCi1hbmRyb2lkLnRleHQuVGV4dFdhdGNoZXIpCi0KLXB1YmxpYyB2b2lkIHNldEZpbHRlcldhdGNoZXIoCi1hbmRyb2lkLnRleHQuVGV4dFdhdGNoZXIpCi0KLXB1YmxpYyB2b2lkIHNldExldHRlcnNXYXRjaGVyKAotYW5kcm9pZC50ZXh0LlRleHRXYXRjaGVyKQotCi1wdWJsaWMgdm9pZCBzZXRNb2RlKAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLSBjbGFzcyBhbmRyb2lkLndpZGdldC5EaWdpdGFsQ2xvY2skMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmxhbmcuUnVubmFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC53aWRnZXQuRGlnaXRhbENsb2NrIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQud2lkZ2V0LkRpZ2l0YWxDbG9jaykKLQotcHVibGljIHZvaWQgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvRGlnaXRhbENsb2NrOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTIgbmFtZSA9Rm9ybWF0Q2hhbmdlT2JzZXJ2ZXIgKQotIGNsYXNzIGFuZHJvaWQud2lkZ2V0LkRpZ2l0YWxDbG9jayRGb3JtYXRDaGFuZ2VPYnNlcnZlciBleHRlbmRzIGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQud2lkZ2V0LkRpZ2l0YWxDbG9jayB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLndpZGdldC5EaWdpdGFsQ2xvY2spCi0KLXB1YmxpYyB2b2lkIG9uQ2hhbmdlKAotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9EaWdpdGFsQ2xvY2skRm9ybWF0Q2hhbmdlT2JzZXJ2ZXI7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLndpZGdldC5EaWdpdGFsQ2xvY2sgZXh0ZW5kcyBhbmRyb2lkLndpZGdldC5UZXh0VmlldwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIG0xMgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIG0yNAotCi0gamF2YS51dGlsLkNhbGVuZGFyIG1DYWxlbmRhcgotCi0gamF2YS5sYW5nLlN0cmluZyBtRm9ybWF0Ci0KLXByaXZhdGUgYW5kcm9pZC53aWRnZXQuRGlnaXRhbENsb2NrJEZvcm1hdENoYW5nZU9ic2VydmVyIG1Gb3JtYXRDaGFuZ2VPYnNlcnZlcgotCi1wcml2YXRlIGFuZHJvaWQub3MuSGFuZGxlciBtSGFuZGxlcgotCi1wcml2YXRlIGphdmEubGFuZy5SdW5uYWJsZSBtVGlja2VyCi0KLXByaXZhdGUgYm9vbGVhbiBtVGlja2VyU3RvcHBlZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDAwMCgKLWFuZHJvaWQud2lkZ2V0LkRpZ2l0YWxDbG9jaykKLQotc3RhdGljIGphdmEubGFuZy5SdW5uYWJsZSBhY2Nlc3MkMTAwKAotYW5kcm9pZC53aWRnZXQuRGlnaXRhbENsb2NrKQotCi1zdGF0aWMgYW5kcm9pZC5vcy5IYW5kbGVyIGFjY2VzcyQyMDAoCi1hbmRyb2lkLndpZGdldC5EaWdpdGFsQ2xvY2spCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQzMDAoCi1hbmRyb2lkLndpZGdldC5EaWdpdGFsQ2xvY2spCi0KLXByaXZhdGUgYm9vbGVhbiBnZXQyNEhvdXJNb2RlKCkKLQotcHJpdmF0ZSB2b2lkIGluaXRDbG9jaygKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wcml2YXRlIHZvaWQgc2V0Rm9ybWF0KCkKLQotcHJvdGVjdGVkIHZvaWQgb25BdHRhY2hlZFRvV2luZG93KCkKLQotcHJvdGVjdGVkIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3coKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLSBjbGFzcyBhbmRyb2lkLndpZGdldC5Eb3VibGVEaWdpdE1hbmFnZXIkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmxhbmcuUnVubmFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC53aWRnZXQuRG91YmxlRGlnaXRNYW5hZ2VyIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQud2lkZ2V0LkRvdWJsZURpZ2l0TWFuYWdlcikKLQotcHVibGljIHZvaWQgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDQgbmFtZSA9Q2FsbEJhY2sgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L0RvdWJsZURpZ2l0TWFuYWdlcjsgKQotYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQud2lkZ2V0LkRvdWJsZURpZ2l0TWFuYWdlciRDYWxsQmFjayBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzaW5nbGVEaWdpdEZpbmFsKAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzaW5nbGVEaWdpdEludGVybWVkaWF0ZSgKLWludCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gdHdvRGlnaXRzRmluYWwoCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9Eb3VibGVEaWdpdE1hbmFnZXIkQ2FsbEJhY2s7ICkKLSBjbGFzcyBhbmRyb2lkLndpZGdldC5Eb3VibGVEaWdpdE1hbmFnZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS5sYW5nLkludGVnZXIgaW50ZXJtZWRpYXRlRGlnaXQKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLndpZGdldC5Eb3VibGVEaWdpdE1hbmFnZXIkQ2FsbEJhY2sgbUNhbGxCYWNrCi0KLXByaXZhdGUgZmluYWwgbG9uZyB0aW1lb3V0SW5NaWxsaXMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1sb25nCi1hbmRyb2lkLndpZGdldC5Eb3VibGVEaWdpdE1hbmFnZXIkQ2FsbEJhY2spCi0KLXN0YXRpYyBqYXZhLmxhbmcuSW50ZWdlciBhY2Nlc3MkMDAwKAotYW5kcm9pZC53aWRnZXQuRG91YmxlRGlnaXRNYW5hZ2VyKQotCi1zdGF0aWMgamF2YS5sYW5nLkludGVnZXIgYWNjZXNzJDAwMigKLWFuZHJvaWQud2lkZ2V0LkRvdWJsZURpZ2l0TWFuYWdlcgotamF2YS5sYW5nLkludGVnZXIpCi0KLXN0YXRpYyBhbmRyb2lkLndpZGdldC5Eb3VibGVEaWdpdE1hbmFnZXIkQ2FsbEJhY2sgYWNjZXNzJDEwMCgKLWFuZHJvaWQud2lkZ2V0LkRvdWJsZURpZ2l0TWFuYWdlcikKLQotcHVibGljIHZvaWQgcmVwb3J0RGlnaXQoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC93aWRnZXQvRXhwYW5kYWJsZUxpc3RDb25uZWN0b3IkR3JvdXBNZXRhZGF0YTs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvRXhwYW5kYWJsZUxpc3RDb25uZWN0b3IkR3JvdXBNZXRhZGF0YTsgKQotZmluYWwgY2xhc3MgYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RDb25uZWN0b3IkR3JvdXBNZXRhZGF0YSQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0Q29ubmVjdG9yJEdyb3VwTWV0YWRhdGEgY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyBhbmRyb2lkLndpZGdldC5FeHBhbmRhYmxlTGlzdENvbm5lY3RvciRHcm91cE1ldGFkYXRhW10gbmV3QXJyYXkoCi1pbnQpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0W10gbmV3QXJyYXkoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPUdyb3VwTWV0YWRhdGEgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L0V4cGFuZGFibGVMaXN0Q29ubmVjdG9yOyApCi0gY2xhc3MgYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RDb25uZWN0b3IkR3JvdXBNZXRhZGF0YSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I8TGFuZHJvaWQvd2lkZ2V0L0V4cGFuZGFibGVMaXN0Q29ubmVjdG9yJEdyb3VwTWV0YWRhdGE7PjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvciBDUkVBVE9SCi0KLXN0YXRpYyBmaW5hbCBpbnQgUkVGUkVTSAotCi0gaW50IGZsUG9zCi0KLSBpbnQgZ1BvcwotCi0gaW50IGxhc3RDaGlsZEZsUG9zCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi0gdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKQotCi1wdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTQgbmFtZSA9TXlEYXRhU2V0T2JzZXJ2ZXIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L0V4cGFuZGFibGVMaXN0Q29ubmVjdG9yOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RDb25uZWN0b3IkTXlEYXRhU2V0T2JzZXJ2ZXIgZXh0ZW5kcyBhbmRyb2lkLmRhdGFiYXNlLkRhdGFTZXRPYnNlcnZlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLndpZGdldC5FeHBhbmRhYmxlTGlzdENvbm5lY3RvciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLndpZGdldC5FeHBhbmRhYmxlTGlzdENvbm5lY3RvcikKLQotcHVibGljIHZvaWQgb25DaGFuZ2VkKCkKLQotcHVibGljIHZvaWQgb25JbnZhbGlkYXRlZCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L0V4cGFuZGFibGVMaXN0Q29ubmVjdG9yOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9UG9zaXRpb25NZXRhZGF0YSApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RDb25uZWN0b3IkUG9zaXRpb25NZXRhZGF0YSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGludCBncm91cEluc2VydEluZGV4Ci0KLXB1YmxpYyBhbmRyb2lkLndpZGdldC5FeHBhbmRhYmxlTGlzdENvbm5lY3RvciRHcm91cE1ldGFkYXRhIGdyb3VwTWV0YWRhdGEKLQotcHVibGljIGFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0UG9zaXRpb24gcG9zaXRpb24KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWludAotaW50Ci1pbnQpCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLWludAotaW50Ci1pbnQKLWludAotYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RDb25uZWN0b3IkR3JvdXBNZXRhZGF0YQotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBpc0V4cGFuZGVkKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9FeHBhbmRhYmxlTGlzdENvbm5lY3RvciRQb3NpdGlvbk1ldGFkYXRhO0xhbmRyb2lkL3dpZGdldC9FeHBhbmRhYmxlTGlzdENvbm5lY3RvciRHcm91cE1ldGFkYXRhO0xhbmRyb2lkL3dpZGdldC9FeHBhbmRhYmxlTGlzdENvbm5lY3RvciRNeURhdGFTZXRPYnNlcnZlcjsgKQotIGNsYXNzIGFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0Q29ubmVjdG9yIGV4dGVuZHMgYW5kcm9pZC53aWRnZXQuQmFzZUFkYXB0ZXIgaW1wbGVtZW50cyBhbmRyb2lkLndpZGdldC5GaWx0ZXJhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYW5kcm9pZC5kYXRhYmFzZS5EYXRhU2V0T2JzZXJ2ZXIgbURhdGFTZXRPYnNlcnZlcgotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQXJyYXlMaXN0PExhbmRyb2lkL3dpZGdldC9FeHBhbmRhYmxlTGlzdENvbm5lY3RvciRHcm91cE1ldGFkYXRhOz47ICkKLXByaXZhdGUgamF2YS51dGlsLkFycmF5TGlzdCBtRXhwR3JvdXBNZXRhZGF0YUxpc3QKLQotcHJpdmF0ZSBhbmRyb2lkLndpZGdldC5FeHBhbmRhYmxlTGlzdEFkYXB0ZXIgbUV4cGFuZGFibGVMaXN0QWRhcHRlcgotCi1wcml2YXRlIGludCBtTWF4RXhwR3JvdXBDb3VudAotCi1wcml2YXRlIGludCBtVG90YWxFeHBDaGlsZHJlbkNvdW50Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RBZGFwdGVyKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMDAwKAotYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RDb25uZWN0b3IKLWJvb2xlYW4pCi0KLXByaXZhdGUgdm9pZCByZWZyZXNoRXhwR3JvdXBNZXRhZGF0YUxpc3QoCi1ib29sZWFuKQotCi1wdWJsaWMgYm9vbGVhbiBhcmVBbGxJdGVtc0VuYWJsZWQoKQotCi0gYm9vbGVhbiBjb2xsYXBzZUdyb3VwKAotaW50KQotCi0gYm9vbGVhbiBjb2xsYXBzZUdyb3VwKAotYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RDb25uZWN0b3IkUG9zaXRpb25NZXRhZGF0YSkKLQotIGJvb2xlYW4gZXhwYW5kR3JvdXAoCi1pbnQpCi0KLSBib29sZWFuIGV4cGFuZEdyb3VwKAotYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RDb25uZWN0b3IkUG9zaXRpb25NZXRhZGF0YSkKLQotIGFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0QWRhcHRlciBnZXRBZGFwdGVyKCkKLQotcHVibGljIGludCBnZXRDb3VudCgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0FycmF5TGlzdDxMYW5kcm9pZC93aWRnZXQvRXhwYW5kYWJsZUxpc3RDb25uZWN0b3IkR3JvdXBNZXRhZGF0YTs+OyApCi0gamF2YS51dGlsLkFycmF5TGlzdCBnZXRFeHBhbmRlZEdyb3VwTWV0YWRhdGFMaXN0KCkKLQotcHVibGljIGFuZHJvaWQud2lkZ2V0LkZpbHRlciBnZXRGaWx0ZXIoKQotCi0gYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RDb25uZWN0b3IkUG9zaXRpb25NZXRhZGF0YSBnZXRGbGF0dGVuZWRQb3MoCi1hbmRyb2lkLndpZGdldC5FeHBhbmRhYmxlTGlzdFBvc2l0aW9uKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRJdGVtKAotaW50KQotCi1wdWJsaWMgbG9uZyBnZXRJdGVtSWQoCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0SXRlbVZpZXdUeXBlKAotaW50KQotCi0gYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RDb25uZWN0b3IkUG9zaXRpb25NZXRhZGF0YSBnZXRVbmZsYXR0ZW5lZFBvcygKLWludCkKLQotcHVibGljIGFuZHJvaWQudmlldy5WaWV3IGdldFZpZXcoCi1pbnQKLWFuZHJvaWQudmlldy5WaWV3Ci1hbmRyb2lkLnZpZXcuVmlld0dyb3VwKQotCi1wdWJsaWMgaW50IGdldFZpZXdUeXBlQ291bnQoKQotCi1wdWJsaWMgYm9vbGVhbiBoYXNTdGFibGVJZHMoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkKLQotcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBpc0dyb3VwRXhwYW5kZWQoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldEV4cGFuZGFibGVMaXN0QWRhcHRlcigKLWFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0QWRhcHRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9BcnJheUxpc3Q8TGFuZHJvaWQvd2lkZ2V0L0V4cGFuZGFibGVMaXN0Q29ubmVjdG9yJEdyb3VwTWV0YWRhdGE7PjspViApCi0gdm9pZCBzZXRFeHBhbmRlZEdyb3VwTWV0YWRhdGFMaXN0KAotamF2YS51dGlsLkFycmF5TGlzdCkKLQotcHVibGljIHZvaWQgc2V0TWF4RXhwR3JvdXBDb3VudCgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLSBjbGFzcyBhbmRyb2lkLndpZGdldC5FeHBhbmRhYmxlTGlzdFBvc2l0aW9uIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSElMRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHUk9VUAotCi1wdWJsaWMgaW50IGNoaWxkUG9zCi0KLSBpbnQgZmxhdExpc3RQb3MKLQotcHVibGljIGludCBncm91cFBvcwotCi1wdWJsaWMgaW50IHR5cGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotaW50Ci1pbnQKLWludCkKLQotIHZvaWQgPGluaXQ+KAotaW50Ci1pbnQKLWludAotaW50KQotCi1zdGF0aWMgYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RQb3NpdGlvbiBvYnRhaW5DaGlsZFBvc2l0aW9uKAotaW50Ci1pbnQpCi0KLXN0YXRpYyBhbmRyb2lkLndpZGdldC5FeHBhbmRhYmxlTGlzdFBvc2l0aW9uIG9idGFpbkdyb3VwUG9zaXRpb24oCi1pbnQpCi0KLXN0YXRpYyBhbmRyb2lkLndpZGdldC5FeHBhbmRhYmxlTGlzdFBvc2l0aW9uIG9idGFpblBvc2l0aW9uKAotbG9uZykKLQotIGxvbmcgZ2V0UGFja2VkUG9zaXRpb24oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9FeHBhbmRhYmxlTGlzdFZpZXc7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9NDEwNCBuYW1lID1udWxsICkKLSBjbGFzcyBhbmRyb2lkLndpZGdldC5FeHBhbmRhYmxlTGlzdFZpZXckMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9FeHBhbmRhYmxlTGlzdFZpZXc7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1FeHBhbmRhYmxlTGlzdENvbnRleHRNZW51SW5mbyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RWaWV3JEV4cGFuZGFibGVMaXN0Q29udGV4dE1lbnVJbmZvIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQudmlldy5Db250ZXh0TWVudSRDb250ZXh0TWVudUluZm8KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGxvbmcgaWQKLQotcHVibGljIGxvbmcgcGFja2VkUG9zaXRpb24KLQotcHVibGljIGFuZHJvaWQudmlldy5WaWV3IHRhcmdldFZpZXcKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLnZpZXcuVmlldwotbG9uZwotbG9uZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvRXhwYW5kYWJsZUxpc3RWaWV3OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9T25Hcm91cENsaWNrTGlzdGVuZXIgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLndpZGdldC5FeHBhbmRhYmxlTGlzdFZpZXckT25Hcm91cENsaWNrTGlzdGVuZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gb25Hcm91cENsaWNrKAotYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RWaWV3Ci1hbmRyb2lkLnZpZXcuVmlldwotaW50Ci1sb25nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9FeHBhbmRhYmxlTGlzdFZpZXckU2F2ZWRTdGF0ZTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC93aWRnZXQvRXhwYW5kYWJsZUxpc3RWaWV3JFNhdmVkU3RhdGU7PjsgKQotZmluYWwgY2xhc3MgYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RWaWV3JFNhdmVkU3RhdGUkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBhbmRyb2lkLndpZGdldC5FeHBhbmRhYmxlTGlzdFZpZXckU2F2ZWRTdGF0ZSBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIGFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0VmlldyRTYXZlZFN0YXRlW10gbmV3QXJyYXkoCi1pbnQpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0W10gbmV3QXJyYXkoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPVNhdmVkU3RhdGUgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L0V4cGFuZGFibGVMaXN0VmlldzsgKQotIGNsYXNzIGFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0VmlldyRTYXZlZFN0YXRlIGV4dGVuZHMgYW5kcm9pZC52aWV3LlZpZXckQmFzZVNhdmVkU3RhdGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I8TGFuZHJvaWQvd2lkZ2V0L0V4cGFuZGFibGVMaXN0VmlldyRTYXZlZFN0YXRlOz47ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IgQ1JFQVRPUgotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQXJyYXlMaXN0PExhbmRyb2lkL3dpZGdldC9FeHBhbmRhYmxlTGlzdENvbm5lY3RvciRHcm91cE1ldGFkYXRhOz47ICkKLSBqYXZhLnV0aWwuQXJyYXlMaXN0IGV4cGFuZGVkR3JvdXBNZXRhZGF0YUxpc3QKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5QYXJjZWwKLWFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0VmlldyQxKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMYW5kcm9pZC9vcy9QYXJjZWxhYmxlO0xqYXZhL3V0aWwvQXJyYXlMaXN0PExhbmRyb2lkL3dpZGdldC9FeHBhbmRhYmxlTGlzdENvbm5lY3RvciRHcm91cE1ldGFkYXRhOz47KVYgKQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5QYXJjZWxhYmxlCi1qYXZhLnV0aWwuQXJyYXlMaXN0KQotCi1wdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9FeHBhbmRhYmxlTGlzdFZpZXckMTtMYW5kcm9pZC93aWRnZXQvRXhwYW5kYWJsZUxpc3RWaWV3JFNhdmVkU3RhdGU7TGFuZHJvaWQvd2lkZ2V0L0V4cGFuZGFibGVMaXN0VmlldyRFeHBhbmRhYmxlTGlzdENvbnRleHRNZW51SW5mbztMYW5kcm9pZC93aWRnZXQvRXhwYW5kYWJsZUxpc3RWaWV3JE9uQ2hpbGRDbGlja0xpc3RlbmVyO0xhbmRyb2lkL3dpZGdldC9FeHBhbmRhYmxlTGlzdFZpZXckT25Hcm91cENsaWNrTGlzdGVuZXI7TGFuZHJvaWQvd2lkZ2V0L0V4cGFuZGFibGVMaXN0VmlldyRPbkdyb3VwRXhwYW5kTGlzdGVuZXI7TGFuZHJvaWQvd2lkZ2V0L0V4cGFuZGFibGVMaXN0VmlldyRPbkdyb3VwQ29sbGFwc2VMaXN0ZW5lcjsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0VmlldyBleHRlbmRzIGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENISUxEX0lORElDQVRPUl9JTkhFUklUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIENISUxEX0xBU1RfU1RBVEVfU0VUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIEVNUFRZX1NUQVRFX1NFVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBHUk9VUF9FTVBUWV9TVEFURV9TRVQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gR1JPVVBfRVhQQU5ERURfRU1QVFlfU1RBVEVfU0VUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIEdST1VQX0VYUEFOREVEX1NUQVRFX1NFVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXVtdIEdST1VQX1NUQVRFX1NFVFMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBQQUNLRURfUE9TSVRJT05fSU5UX01BU0tfQ0hJTEQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBQQUNLRURfUE9TSVRJT05fSU5UX01BU0tfR1JPVVAKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBQQUNLRURfUE9TSVRJT05fTUFTS19DSElMRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFBBQ0tFRF9QT1NJVElPTl9NQVNLX0dST1VQCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgUEFDS0VEX1BPU0lUSU9OX01BU0tfVFlQRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFBBQ0tFRF9QT1NJVElPTl9TSElGVF9HUk9VUAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFBBQ0tFRF9QT1NJVElPTl9TSElGVF9UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBQ0tFRF9QT1NJVElPTl9UWVBFX0NISUxECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBQ0tFRF9QT1NJVElPTl9UWVBFX0dST1VQCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBQ0tFRF9QT1NJVElPTl9UWVBFX05VTEwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIFBBQ0tFRF9QT1NJVElPTl9WQUxVRV9OVUxMCi0KLXByaXZhdGUgYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RBZGFwdGVyIG1BZGFwdGVyCi0KLXByaXZhdGUgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSBtQ2hpbGREaXZpZGVyCi0KLXByaXZhdGUgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSBtQ2hpbGRJbmRpY2F0b3IKLQotcHJpdmF0ZSBpbnQgbUNoaWxkSW5kaWNhdG9yTGVmdAotCi1wcml2YXRlIGludCBtQ2hpbGRJbmRpY2F0b3JSaWdodAotCi1wcml2YXRlIGFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0Q29ubmVjdG9yIG1Db25uZWN0b3IKLQotcHJpdmF0ZSBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIG1Hcm91cEluZGljYXRvcgotCi1wcml2YXRlIGludCBtSW5kaWNhdG9yTGVmdAotCi1wcml2YXRlIGludCBtSW5kaWNhdG9yUmlnaHQKLQotcHJpdmF0ZSBhbmRyb2lkLndpZGdldC5FeHBhbmRhYmxlTGlzdFZpZXckT25DaGlsZENsaWNrTGlzdGVuZXIgbU9uQ2hpbGRDbGlja0xpc3RlbmVyCi0KLXByaXZhdGUgYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RWaWV3JE9uR3JvdXBDbGlja0xpc3RlbmVyIG1Pbkdyb3VwQ2xpY2tMaXN0ZW5lcgotCi1wcml2YXRlIGFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0VmlldyRPbkdyb3VwQ29sbGFwc2VMaXN0ZW5lciBtT25Hcm91cENvbGxhcHNlTGlzdGVuZXIKLQotcHJpdmF0ZSBhbmRyb2lkLndpZGdldC5FeHBhbmRhYmxlTGlzdFZpZXckT25Hcm91cEV4cGFuZExpc3RlbmVyIG1Pbkdyb3VwRXhwYW5kTGlzdGVuZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQKLWludCkKLQotcHJpdmF0ZSBsb25nIGdldENoaWxkT3JHcm91cElkKAotYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RQb3NpdGlvbikKLQotcHJpdmF0ZSBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIGdldEluZGljYXRvcigKLWFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0Q29ubmVjdG9yJFBvc2l0aW9uTWV0YWRhdGEpCi0KLXB1YmxpYyBzdGF0aWMgaW50IGdldFBhY2tlZFBvc2l0aW9uQ2hpbGQoCi1sb25nKQotCi1wdWJsaWMgc3RhdGljIGxvbmcgZ2V0UGFja2VkUG9zaXRpb25Gb3JDaGlsZCgKLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIGxvbmcgZ2V0UGFja2VkUG9zaXRpb25Gb3JHcm91cCgKLWludCkKLQotcHVibGljIHN0YXRpYyBpbnQgZ2V0UGFja2VkUG9zaXRpb25Hcm91cCgKLWxvbmcpCi0KLXB1YmxpYyBzdGF0aWMgaW50IGdldFBhY2tlZFBvc2l0aW9uVHlwZSgKLWxvbmcpCi0KLXB1YmxpYyBib29sZWFuIGNvbGxhcHNlR3JvdXAoCi1pbnQpCi0KLSBhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnUkQ29udGV4dE1lbnVJbmZvIGNyZWF0ZUNvbnRleHRNZW51SW5mbygKLWFuZHJvaWQudmlldy5WaWV3Ci1pbnQKLWxvbmcpCi0KLXByb3RlY3RlZCB2b2lkIGRpc3BhdGNoRHJhdygKLWFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzKQotCi0gdm9pZCBkcmF3RGl2aWRlcigKLWFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3QKLWludCkKLQotcHVibGljIGJvb2xlYW4gZXhwYW5kR3JvdXAoCi1pbnQpCi0KLXB1YmxpYyB2b2xhdGlsZSBhbmRyb2lkLndpZGdldC5BZGFwdGVyIGdldEFkYXB0ZXIoKQotCi1wdWJsaWMgYW5kcm9pZC53aWRnZXQuTGlzdEFkYXB0ZXIgZ2V0QWRhcHRlcigpCi0KLXB1YmxpYyBhbmRyb2lkLndpZGdldC5FeHBhbmRhYmxlTGlzdEFkYXB0ZXIgZ2V0RXhwYW5kYWJsZUxpc3RBZGFwdGVyKCkKLQotcHVibGljIGxvbmcgZ2V0RXhwYW5kYWJsZUxpc3RQb3NpdGlvbigKLWludCkKLQotcHVibGljIGludCBnZXRGbGF0TGlzdFBvc2l0aW9uKAotbG9uZykKLQotcHVibGljIGxvbmcgZ2V0U2VsZWN0ZWRJZCgpCi0KLXB1YmxpYyBsb25nIGdldFNlbGVjdGVkUG9zaXRpb24oKQotCi0gYm9vbGVhbiBoYW5kbGVJdGVtQ2xpY2soCi1hbmRyb2lkLnZpZXcuVmlldwotaW50Ci1sb25nKQotCi1wdWJsaWMgYm9vbGVhbiBpc0dyb3VwRXhwYW5kZWQoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIG9uUmVzdG9yZUluc3RhbmNlU3RhdGUoCi1hbmRyb2lkLm9zLlBhcmNlbGFibGUpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLlBhcmNlbGFibGUgb25TYXZlSW5zdGFuY2VTdGF0ZSgpCi0KLXB1YmxpYyBib29sZWFuIHBlcmZvcm1JdGVtQ2xpY2soCi1hbmRyb2lkLnZpZXcuVmlldwotaW50Ci1sb25nKQotCi1wdWJsaWMgdm9sYXRpbGUgdm9pZCBzZXRBZGFwdGVyKAotYW5kcm9pZC53aWRnZXQuQWRhcHRlcikKLQotcHVibGljIHZvaWQgc2V0QWRhcHRlcigKLWFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0QWRhcHRlcikKLQotcHVibGljIHZvaWQgc2V0QWRhcHRlcigKLWFuZHJvaWQud2lkZ2V0Lkxpc3RBZGFwdGVyKQotCi1wdWJsaWMgdm9pZCBzZXRDaGlsZERpdmlkZXIoCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlKQotCi1wdWJsaWMgdm9pZCBzZXRDaGlsZEluZGljYXRvcigKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUpCi0KLXB1YmxpYyB2b2lkIHNldENoaWxkSW5kaWNhdG9yQm91bmRzKAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldEdyb3VwSW5kaWNhdG9yKAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSkKLQotcHVibGljIHZvaWQgc2V0SW5kaWNhdG9yQm91bmRzKAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldE9uQ2hpbGRDbGlja0xpc3RlbmVyKAotYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RWaWV3JE9uQ2hpbGRDbGlja0xpc3RlbmVyKQotCi1wdWJsaWMgdm9pZCBzZXRPbkdyb3VwQ2xpY2tMaXN0ZW5lcigKLWFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0VmlldyRPbkdyb3VwQ2xpY2tMaXN0ZW5lcikKLQotcHVibGljIHZvaWQgc2V0T25Hcm91cENvbGxhcHNlTGlzdGVuZXIoCi1hbmRyb2lkLndpZGdldC5FeHBhbmRhYmxlTGlzdFZpZXckT25Hcm91cENvbGxhcHNlTGlzdGVuZXIpCi0KLXB1YmxpYyB2b2lkIHNldE9uR3JvdXBFeHBhbmRMaXN0ZW5lcigKLWFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0VmlldyRPbkdyb3VwRXhwYW5kTGlzdGVuZXIpCi0KLXB1YmxpYyB2b2lkIHNldE9uSXRlbUNsaWNrTGlzdGVuZXIoCi1hbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldyRPbkl0ZW1DbGlja0xpc3RlbmVyKQotCi1wdWJsaWMgYm9vbGVhbiBzZXRTZWxlY3RlZENoaWxkKAotaW50Ci1pbnQKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkR3JvdXAoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID00MTA0IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L0ZpbHRlcjsgKQotIGNsYXNzIGFuZHJvaWQud2lkZ2V0LkZpbHRlciQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L0ZpbHRlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMiBuYW1lID1GaWx0ZXJSZXN1bHRzICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLndpZGdldC5GaWx0ZXIkRmlsdGVyUmVzdWx0cyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGludCBjb3VudAotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCB2YWx1ZXMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9GaWx0ZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9UmVxdWVzdEFyZ3VtZW50cyApCi0gY2xhc3MgYW5kcm9pZC53aWRnZXQuRmlsdGVyJFJlcXVlc3RBcmd1bWVudHMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIGNvbnN0cmFpbnQKLQotIGFuZHJvaWQud2lkZ2V0LkZpbHRlciRGaWx0ZXJMaXN0ZW5lciBsaXN0ZW5lcgotCi0gYW5kcm9pZC53aWRnZXQuRmlsdGVyJEZpbHRlclJlc3VsdHMgcmVzdWx0cwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLndpZGdldC5GaWx0ZXIkMSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTIgbmFtZSA9UmVxdWVzdEhhbmRsZXIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L0ZpbHRlcjsgKQotIGNsYXNzIGFuZHJvaWQud2lkZ2V0LkZpbHRlciRSZXF1ZXN0SGFuZGxlciBleHRlbmRzIGFuZHJvaWQub3MuSGFuZGxlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLndpZGdldC5GaWx0ZXIgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53aWRnZXQuRmlsdGVyCi1hbmRyb2lkLm9zLkxvb3BlcikKLQotcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZSgKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvRmlsdGVyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTIgbmFtZSA9UmVzdWx0c0hhbmRsZXIgKQotIGNsYXNzIGFuZHJvaWQud2lkZ2V0LkZpbHRlciRSZXN1bHRzSGFuZGxlciBleHRlbmRzIGFuZHJvaWQub3MuSGFuZGxlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLndpZGdldC5GaWx0ZXIgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQud2lkZ2V0LkZpbHRlcikKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53aWRnZXQuRmlsdGVyCi1hbmRyb2lkLndpZGdldC5GaWx0ZXIkMSkKLQotcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZSgKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC53aWRnZXQuRmlsdGVyUXVlcnlQcm92aWRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IgcnVuUXVlcnkoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9GcmFtZUxheW91dDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPUxheW91dFBhcmFtcyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQkTGF5b3V0UGFyYW1zIGV4dGVuZHMgYW5kcm9pZC52aWV3LlZpZXdHcm91cCRNYXJnaW5MYXlvdXRQYXJhbXMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGludCBncmF2aXR5Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLnZpZXcuVmlld0dyb3VwJExheW91dFBhcmFtcykKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC52aWV3LlZpZXdHcm91cCRNYXJnaW5MYXlvdXRQYXJhbXMpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotIGNsYXNzIGFuZHJvaWQud2lkZ2V0LkdhbGxlcnkkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmxhbmcuUnVubmFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC53aWRnZXQuR2FsbGVyeSB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLndpZGdldC5HYWxsZXJ5KQotCi1wdWJsaWMgdm9pZCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9HYWxsZXJ5OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTIgbmFtZSA9RmxpbmdSdW5uYWJsZSApCi0gY2xhc3MgYW5kcm9pZC53aWRnZXQuR2FsbGVyeSRGbGluZ1J1bm5hYmxlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5SdW5uYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGludCBtTGFzdEZsaW5nWAotCi1wcml2YXRlIGFuZHJvaWQud2lkZ2V0LlNjcm9sbGVyIG1TY3JvbGxlcgotCi1maW5hbCBhbmRyb2lkLndpZGdldC5HYWxsZXJ5IHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQud2lkZ2V0LkdhbGxlcnkpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQwMDAoCi1hbmRyb2lkLndpZGdldC5HYWxsZXJ5JEZsaW5nUnVubmFibGUKLWJvb2xlYW4pCi0KLXN0YXRpYyBhbmRyb2lkLndpZGdldC5TY3JvbGxlciBhY2Nlc3MkMTAwKAotYW5kcm9pZC53aWRnZXQuR2FsbGVyeSRGbGluZ1J1bm5hYmxlKQotCi1wcml2YXRlIHZvaWQgZW5kRmxpbmcoCi1ib29sZWFuKQotCi1wcml2YXRlIHZvaWQgc3RhcnRDb21tb24oKQotCi1wdWJsaWMgdm9pZCBydW4oKQotCi1wdWJsaWMgdm9pZCBzdGFydFVzaW5nRGlzdGFuY2UoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHN0YXJ0VXNpbmdWZWxvY2l0eSgKLWludCkKLQotcHVibGljIHZvaWQgc3RvcCgKLWJvb2xlYW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPUxheW91dFBhcmFtcyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvR2FsbGVyeTsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQud2lkZ2V0LkdhbGxlcnkkTGF5b3V0UGFyYW1zIGV4dGVuZHMgYW5kcm9pZC52aWV3LlZpZXdHcm91cCRMYXlvdXRQYXJhbXMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQudmlldy5WaWV3R3JvdXAkTGF5b3V0UGFyYW1zKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L0dhbGxlcnkkTGF5b3V0UGFyYW1zO0xhbmRyb2lkL3dpZGdldC9HYWxsZXJ5JEZsaW5nUnVubmFibGU7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLndpZGdldC5HYWxsZXJ5IGV4dGVuZHMgYW5kcm9pZC53aWRnZXQuQWJzU3Bpbm5lciBpbXBsZW1lbnRzIGFuZHJvaWQudmlldy5HZXN0dXJlRGV0ZWN0b3IkT25HZXN0dXJlTGlzdGVuZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBsb2NhbExPR1YKLQotcHJpdmF0ZSBpbnQgbUFuaW1hdGlvbkR1cmF0aW9uCi0KLXByaXZhdGUgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXckQWRhcHRlckNvbnRleHRNZW51SW5mbyBtQ29udGV4dE1lbnVJbmZvCi0KLXByaXZhdGUgaW50IG1Eb3duVG91Y2hQb3NpdGlvbgotCi1wcml2YXRlIGFuZHJvaWQudmlldy5WaWV3IG1Eb3duVG91Y2hWaWV3Ci0KLXByaXZhdGUgYW5kcm9pZC53aWRnZXQuR2FsbGVyeSRGbGluZ1J1bm5hYmxlIG1GbGluZ1J1bm5hYmxlCi0KLXByaXZhdGUgYW5kcm9pZC52aWV3Lkdlc3R1cmVEZXRlY3RvciBtR2VzdHVyZURldGVjdG9yCi0KLXByaXZhdGUgaW50IG1HcmF2aXR5Ci0KLXByaXZhdGUgaW50IG1MZWZ0TW9zdAotCi1wcml2YXRlIGludCBtUmlnaHRNb3N0Ci0KLXByaXZhdGUgYW5kcm9pZC52aWV3LlZpZXcgbVNlbGVjdGVkQ2hpbGQKLQotcHJpdmF0ZSBib29sZWFuIG1TaG91bGRDYWxsYmFja0R1cmluZ0ZsaW5nCi0KLXByaXZhdGUgYm9vbGVhbiBtU2hvdWxkQ2FsbGJhY2tPblVuc2VsZWN0ZWRJdGVtQ2xpY2sKLQotcHJpdmF0ZSBib29sZWFuIG1TaG91bGRTdG9wRmxpbmcKLQotcHJpdmF0ZSBpbnQgbVNwYWNpbmcKLQotcHJpdmF0ZSBib29sZWFuIG1TdXBwcmVzc1NlbGVjdGlvbkNoYW5nZWQKLQotcHJpdmF0ZSBmbG9hdCBtVW5zZWxlY3RlZEFscGhhCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldAotaW50KQotCi1zdGF0aWMgaW50IGFjY2VzcyQxMDAwKAotYW5kcm9pZC53aWRnZXQuR2FsbGVyeSkKLQotc3RhdGljIHZvaWQgYWNjZXNzJDIwMCgKLWFuZHJvaWQud2lkZ2V0LkdhbGxlcnkpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDMwMCgKLWFuZHJvaWQud2lkZ2V0LkdhbGxlcnkpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQ0MDAoCi1hbmRyb2lkLndpZGdldC5HYWxsZXJ5KQotCi1zdGF0aWMgYm9vbGVhbiBhY2Nlc3MkNTAwKAotYW5kcm9pZC53aWRnZXQuR2FsbGVyeSkKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDUwMigKLWFuZHJvaWQud2lkZ2V0LkdhbGxlcnkKLWJvb2xlYW4pCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDYwMigKLWFuZHJvaWQud2lkZ2V0LkdhbGxlcnkKLWludCkKLQotc3RhdGljIGludCBhY2Nlc3MkNzAwKAotYW5kcm9pZC53aWRnZXQuR2FsbGVyeSkKLQotc3RhdGljIGludCBhY2Nlc3MkODAwKAotYW5kcm9pZC53aWRnZXQuR2FsbGVyeSkKLQotc3RhdGljIGludCBhY2Nlc3MkOTAwKAotYW5kcm9pZC53aWRnZXQuR2FsbGVyeSkKLQotcHJpdmF0ZSBpbnQgY2FsY3VsYXRlVG9wKAotYW5kcm9pZC52aWV3LlZpZXcKLWFuZHJvaWQud2lkZ2V0LkdhbGxlcnkkTGF5b3V0UGFyYW1zCi1ib29sZWFuKQotCi1wcml2YXRlIHZvaWQgZGV0YWNoT2ZmU2NyZWVuQ2hpbGRyZW4oCi1ib29sZWFuKQotCi1wcml2YXRlIGJvb2xlYW4gZGlzcGF0Y2hMb25nUHJlc3MoCi1hbmRyb2lkLnZpZXcuVmlldwotaW50Ci1sb25nKQotCi1wcml2YXRlIHZvaWQgZGlzcGF0Y2hQcmVzcygKLWFuZHJvaWQudmlldy5WaWV3KQotCi1wcml2YXRlIHZvaWQgZGlzcGF0Y2hVbnByZXNzKCkKLQotcHJpdmF0ZSB2b2lkIGZpbGxUb0dhbGxlcnlMZWZ0KCkKLQotcHJpdmF0ZSB2b2lkIGZpbGxUb0dhbGxlcnlSaWdodCgpCi0KLXByaXZhdGUgaW50IGdldENlbnRlck9mR2FsbGVyeSgpCi0KLXByaXZhdGUgc3RhdGljIGludCBnZXRDZW50ZXJPZlZpZXcoCi1hbmRyb2lkLnZpZXcuVmlldykKLQotcHJpdmF0ZSBhbmRyb2lkLnZpZXcuVmlldyBtYWtlQW5kQWRkVmlldygKLWludAotaW50Ci1pbnQKLWJvb2xlYW4pCi0KLXByaXZhdGUgdm9pZCBvZmZzZXRDaGlsZHJlbkxlZnRBbmRSaWdodCgKLWludCkKLQotcHJpdmF0ZSB2b2lkIG9uRmluaXNoZWRNb3ZlbWVudCgpCi0KLXByaXZhdGUgdm9pZCBzY3JvbGxJbnRvU2xvdHMoKQotCi1wcml2YXRlIGJvb2xlYW4gc2Nyb2xsVG9DaGlsZCgKLWludCkKLQotcHJpdmF0ZSB2b2lkIHNldFNlbGVjdGlvblRvQ2VudGVyQ2hpbGQoKQotCi1wcml2YXRlIHZvaWQgc2V0VXBDaGlsZCgKLWFuZHJvaWQudmlldy5WaWV3Ci1pbnQKLWludAotYm9vbGVhbikKLQotcHJpdmF0ZSB2b2lkIHVwZGF0ZVNlbGVjdGVkSXRlbU1ldGFkYXRhKCkKLQotcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tMYXlvdXRQYXJhbXMoCi1hbmRyb2lkLnZpZXcuVmlld0dyb3VwJExheW91dFBhcmFtcykKLQotcHJvdGVjdGVkIGludCBjb21wdXRlSG9yaXpvbnRhbFNjcm9sbEV4dGVudCgpCi0KLXByb3RlY3RlZCBpbnQgY29tcHV0ZUhvcml6b250YWxTY3JvbGxPZmZzZXQoKQotCi1wcm90ZWN0ZWQgaW50IGNvbXB1dGVIb3Jpem9udGFsU2Nyb2xsUmFuZ2UoKQotCi1wdWJsaWMgYm9vbGVhbiBkaXNwYXRjaEtleUV2ZW50KAotYW5kcm9pZC52aWV3LktleUV2ZW50KQotCi1wcm90ZWN0ZWQgdm9pZCBkaXNwYXRjaFNldFByZXNzZWQoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBkaXNwYXRjaFNldFNlbGVjdGVkKAotYm9vbGVhbikKLQotcHJvdGVjdGVkIGFuZHJvaWQudmlldy5WaWV3R3JvdXAkTGF5b3V0UGFyYW1zIGdlbmVyYXRlRGVmYXVsdExheW91dFBhcmFtcygpCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuVmlld0dyb3VwJExheW91dFBhcmFtcyBnZW5lcmF0ZUxheW91dFBhcmFtcygKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi0KLXByb3RlY3RlZCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwJExheW91dFBhcmFtcyBnZW5lcmF0ZUxheW91dFBhcmFtcygKLWFuZHJvaWQudmlldy5WaWV3R3JvdXAkTGF5b3V0UGFyYW1zKQotCi1wcm90ZWN0ZWQgaW50IGdldENoaWxkRHJhd2luZ09yZGVyKAotaW50Ci1pbnQpCi0KLSBpbnQgZ2V0Q2hpbGRIZWlnaHQoCi1hbmRyb2lkLnZpZXcuVmlldykKLQotcHJvdGVjdGVkIGJvb2xlYW4gZ2V0Q2hpbGRTdGF0aWNUcmFuc2Zvcm1hdGlvbigKLWFuZHJvaWQudmlldy5WaWV3Ci1hbmRyb2lkLnZpZXcuYW5pbWF0aW9uLlRyYW5zZm9ybWF0aW9uKQotCi1wcm90ZWN0ZWQgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51JENvbnRleHRNZW51SW5mbyBnZXRDb250ZXh0TWVudUluZm8oKQotCi0gaW50IGdldExpbWl0ZWRNb3Rpb25TY3JvbGxBbW91bnQoCi1ib29sZWFuCi1pbnQpCi0KLSB2b2lkIGxheW91dCgKLWludAotYm9vbGVhbikKLQotIGJvb2xlYW4gbW92ZU5leHQoKQotCi0gYm9vbGVhbiBtb3ZlUHJldmlvdXMoKQotCi0gdm9pZCBvbkNhbmNlbCgpCi0KLXB1YmxpYyBib29sZWFuIG9uRG93bigKLWFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCkKLQotcHVibGljIGJvb2xlYW4gb25GbGluZygKLWFuZHJvaWQudmlldy5Nb3Rpb25FdmVudAotYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50Ci1mbG9hdAotZmxvYXQpCi0KLXByb3RlY3RlZCB2b2lkIG9uRm9jdXNDaGFuZ2VkKAotYm9vbGVhbgotaW50Ci1hbmRyb2lkLmdyYXBoaWNzLlJlY3QpCi0KLXB1YmxpYyBib29sZWFuIG9uS2V5RG93bigKLWludAotYW5kcm9pZC52aWV3LktleUV2ZW50KQotCi1wdWJsaWMgYm9vbGVhbiBvbktleVVwKAotaW50Ci1hbmRyb2lkLnZpZXcuS2V5RXZlbnQpCi0KLXByb3RlY3RlZCB2b2lkIG9uTGF5b3V0KAotYm9vbGVhbgotaW50Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBvbkxvbmdQcmVzcygKLWFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCkKLQotcHVibGljIGJvb2xlYW4gb25TY3JvbGwoCi1hbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQKLWFuZHJvaWQudmlldy5Nb3Rpb25FdmVudAotZmxvYXQKLWZsb2F0KQotCi1wdWJsaWMgdm9pZCBvblNob3dQcmVzcygKLWFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCkKLQotcHVibGljIGJvb2xlYW4gb25TaW5nbGVUYXBVcCgKLWFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCkKLQotcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KAotYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50KQotCi0gdm9pZCBvblVwKCkKLQotIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZCgpCi0KLXB1YmxpYyB2b2lkIHNldEFuaW1hdGlvbkR1cmF0aW9uKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRDYWxsYmFja0R1cmluZ0ZsaW5nKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0Q2FsbGJhY2tPblVuc2VsZWN0ZWRJdGVtQ2xpY2soCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRHcmF2aXR5KAotaW50KQotCi0gdm9pZCBzZXRTZWxlY3RlZFBvc2l0aW9uSW50KAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRTcGFjaW5nKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRVbnNlbGVjdGVkQWxwaGEoCi1mbG9hdCkKLQotcHVibGljIGJvb2xlYW4gc2hvd0NvbnRleHRNZW51KCkKLQotcHVibGljIGJvb2xlYW4gc2hvd0NvbnRleHRNZW51Rm9yQ2hpbGQoCi1hbmRyb2lkLnZpZXcuVmlldykKLQotIHZvaWQgdHJhY2tNb3Rpb25TY3JvbGwoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC53aWRnZXQuR3JpZFZpZXcgZXh0ZW5kcyBhbmRyb2lkLndpZGdldC5BYnNMaXN0VmlldwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVVRPX0ZJVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT19TVFJFVENICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUUkVUQ0hfQ09MVU1OX1dJRFRICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUUkVUQ0hfU1BBQ0lORwotCi1wcml2YXRlIGludCBtQ29sdW1uV2lkdGgKLQotcHJpdmF0ZSBpbnQgbUdyYXZpdHkKLQotcHJpdmF0ZSBpbnQgbUhvcml6b250YWxTcGFjaW5nCi0KLXByaXZhdGUgaW50IG1OdW1Db2x1bW5zCi0KLXByaXZhdGUgYW5kcm9pZC52aWV3LlZpZXcgbVJlZmVyZW5jZVZpZXcKLQotcHJpdmF0ZSBhbmRyb2lkLnZpZXcuVmlldyBtUmVmZXJlbmNlVmlld0luU2VsZWN0ZWRSb3cKLQotcHJpdmF0ZSBpbnQgbVJlcXVlc3RlZENvbHVtbldpZHRoCi0KLXByaXZhdGUgaW50IG1SZXF1ZXN0ZWRIb3Jpem9udGFsU3BhY2luZwotCi1wcml2YXRlIGludCBtUmVxdWVzdGVkTnVtQ29sdW1ucwotCi1wcml2YXRlIGludCBtU3RyZXRjaE1vZGUKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlJlY3QgbVRlbXBSZWN0Ci0KLXByaXZhdGUgaW50IG1WZXJ0aWNhbFNwYWNpbmcKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ci1pbnQpCi0KLXByaXZhdGUgdm9pZCBhZGp1c3RGb3JCb3R0b21GYWRpbmdFZGdlKAotYW5kcm9pZC52aWV3LlZpZXcKLWludAotaW50KQotCi1wcml2YXRlIHZvaWQgYWRqdXN0Rm9yVG9wRmFkaW5nRWRnZSgKLWFuZHJvaWQudmlldy5WaWV3Ci1pbnQKLWludCkKLQotcHJpdmF0ZSB2b2lkIGFkanVzdFZpZXdzVXBPckRvd24oKQotCi1wcml2YXRlIGJvb2xlYW4gY29tbW9uS2V5KAotaW50Ci1pbnQKLWFuZHJvaWQudmlldy5LZXlFdmVudCkKLQotcHJpdmF0ZSB2b2lkIGNvcnJlY3RUb29IaWdoKAotaW50Ci1pbnQKLWludCkKLQotcHJpdmF0ZSB2b2lkIGNvcnJlY3RUb29Mb3coCi1pbnQKLWludAotaW50KQotCi1wcml2YXRlIHZvaWQgZGV0ZXJtaW5lQ29sdW1ucygKLWludCkKLQotcHJpdmF0ZSBhbmRyb2lkLnZpZXcuVmlldyBmaWxsRG93bigKLWludAotaW50KQotCi1wcml2YXRlIGFuZHJvaWQudmlldy5WaWV3IGZpbGxGcm9tQm90dG9tKAotaW50Ci1pbnQpCi0KLXByaXZhdGUgYW5kcm9pZC52aWV3LlZpZXcgZmlsbEZyb21TZWxlY3Rpb24oCi1pbnQKLWludAotaW50KQotCi1wcml2YXRlIGFuZHJvaWQudmlldy5WaWV3IGZpbGxGcm9tVG9wKAotaW50KQotCi1wcml2YXRlIGFuZHJvaWQudmlldy5WaWV3IGZpbGxTZWxlY3Rpb24oCi1pbnQKLWludCkKLQotcHJpdmF0ZSBhbmRyb2lkLnZpZXcuVmlldyBmaWxsU3BlY2lmaWMoCi1pbnQKLWludCkKLQotcHJpdmF0ZSBhbmRyb2lkLnZpZXcuVmlldyBmaWxsVXAoCi1pbnQKLWludCkKLQotcHJpdmF0ZSBpbnQgZ2V0Qm90dG9tU2VsZWN0aW9uUGl4ZWwoCi1pbnQKLWludAotaW50Ci1pbnQpCi0KLXByaXZhdGUgaW50IGdldFRvcFNlbGVjdGlvblBpeGVsKAotaW50Ci1pbnQKLWludCkKLQotcHJpdmF0ZSBib29sZWFuIGlzQ2FuZGlkYXRlU2VsZWN0aW9uKAotaW50Ci1pbnQpCi0KLXByaXZhdGUgYW5kcm9pZC52aWV3LlZpZXcgbWFrZUFuZEFkZFZpZXcoCi1pbnQKLWludAotYm9vbGVhbgotaW50Ci1ib29sZWFuCi1pbnQpCi0KLXByaXZhdGUgYW5kcm9pZC52aWV3LlZpZXcgbWFrZVJvdygKLWludAotaW50Ci1ib29sZWFuKQotCi1wcml2YXRlIGFuZHJvaWQudmlldy5WaWV3IG1vdmVTZWxlY3Rpb24oCi1pbnQKLWludAotaW50KQotCi1wcml2YXRlIHZvaWQgcGluVG9Cb3R0b20oCi1pbnQpCi0KLXByaXZhdGUgdm9pZCBwaW5Ub1RvcCgKLWludCkKLQotcHJpdmF0ZSB2b2lkIHNldHVwQ2hpbGQoCi1hbmRyb2lkLnZpZXcuVmlldwotaW50Ci1pbnQKLWJvb2xlYW4KLWludAotYm9vbGVhbgotYm9vbGVhbgotaW50KQotCi0gYm9vbGVhbiBhcnJvd1Njcm9sbCgKLWludCkKLQotcHJvdGVjdGVkIHZvaWQgYXR0YWNoTGF5b3V0QW5pbWF0aW9uUGFyYW1ldGVycygKLWFuZHJvaWQudmlldy5WaWV3Ci1hbmRyb2lkLnZpZXcuVmlld0dyb3VwJExheW91dFBhcmFtcwotaW50Ci1pbnQpCi0KLXByb3RlY3RlZCBpbnQgY29tcHV0ZVZlcnRpY2FsU2Nyb2xsRXh0ZW50KCkKLQotcHJvdGVjdGVkIGludCBjb21wdXRlVmVydGljYWxTY3JvbGxPZmZzZXQoKQotCi1wcm90ZWN0ZWQgaW50IGNvbXB1dGVWZXJ0aWNhbFNjcm9sbFJhbmdlKCkKLQotIHZvaWQgZmlsbEdhcCgKLWJvb2xlYW4pCi0KLSBpbnQgZmluZE1vdGlvblJvdygKLWludCkKLQotIGJvb2xlYW4gZnVsbFNjcm9sbCgKLWludCkKLQotcHVibGljIHZvbGF0aWxlIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXIgZ2V0QWRhcHRlcigpCi0KLXB1YmxpYyBhbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlciBnZXRBZGFwdGVyKCkKLQotcHVibGljIGludCBnZXRTdHJldGNoTW9kZSgpCi0KLXByb3RlY3RlZCB2b2lkIGxheW91dENoaWxkcmVuKCkKLQotIGludCBsb29rRm9yU2VsZWN0YWJsZVBvc2l0aW9uKAotaW50Ci1ib29sZWFuKQotCi1wcm90ZWN0ZWQgdm9pZCBvbkZvY3VzQ2hhbmdlZCgKLWJvb2xlYW4KLWludAotYW5kcm9pZC5ncmFwaGljcy5SZWN0KQotCi1wdWJsaWMgYm9vbGVhbiBvbktleURvd24oCi1pbnQKLWFuZHJvaWQudmlldy5LZXlFdmVudCkKLQotcHVibGljIGJvb2xlYW4gb25LZXlNdWx0aXBsZSgKLWludAotaW50Ci1hbmRyb2lkLnZpZXcuS2V5RXZlbnQpCi0KLXB1YmxpYyBib29sZWFuIG9uS2V5VXAoCi1pbnQKLWFuZHJvaWQudmlldy5LZXlFdmVudCkKLQotcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKAotaW50Ci1pbnQpCi0KLSBib29sZWFuIHBhZ2VTY3JvbGwoCi1pbnQpCi0KLXB1YmxpYyB2b2xhdGlsZSB2b2lkIHNldEFkYXB0ZXIoCi1hbmRyb2lkLndpZGdldC5BZGFwdGVyKQotCi1wdWJsaWMgdm9pZCBzZXRBZGFwdGVyKAotYW5kcm9pZC53aWRnZXQuTGlzdEFkYXB0ZXIpCi0KLXB1YmxpYyB2b2lkIHNldENvbHVtbldpZHRoKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRHcmF2aXR5KAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRIb3Jpem9udGFsU3BhY2luZygKLWludCkKLQotcHVibGljIHZvaWQgc2V0TnVtQ29sdW1ucygKLWludCkKLQotcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKAotaW50KQotCi0gdm9pZCBzZXRTZWxlY3Rpb25JbnQoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldFN0cmV0Y2hNb2RlKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRWZXJ0aWNhbFNwYWNpbmcoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQud2lkZ2V0LldyYXBwZXJMaXN0QWRhcHRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlciBnZXRXcmFwcGVkQWRhcHRlcigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC53aWRnZXQuSGVhZGVyVmlld0xpc3RBZGFwdGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQud2lkZ2V0LldyYXBwZXJMaXN0QWRhcHRlciwgYW5kcm9pZC53aWRnZXQuRmlsdGVyYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGFuZHJvaWQud2lkZ2V0Lkxpc3RBZGFwdGVyIG1BZGFwdGVyCi0KLSBib29sZWFuIG1BcmVBbGxGaXhlZFZpZXdzU2VsZWN0YWJsZQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQXJyYXlMaXN0PExhbmRyb2lkL3dpZGdldC9MaXN0VmlldyRGaXhlZFZpZXdJbmZvOz47ICkKLSBqYXZhLnV0aWwuQXJyYXlMaXN0IG1Gb290ZXJWaWV3SW5mb3MKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0FycmF5TGlzdDxMYW5kcm9pZC93aWRnZXQvTGlzdFZpZXckRml4ZWRWaWV3SW5mbzs+OyApCi0gamF2YS51dGlsLkFycmF5TGlzdCBtSGVhZGVyVmlld0luZm9zCi0KLXByaXZhdGUgYm9vbGVhbiBtSXNGaWx0ZXJhYmxlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9BcnJheUxpc3Q8TGFuZHJvaWQvd2lkZ2V0L0xpc3RWaWV3JEZpeGVkVmlld0luZm87PjtMamF2YS91dGlsL0FycmF5TGlzdDxMYW5kcm9pZC93aWRnZXQvTGlzdFZpZXckRml4ZWRWaWV3SW5mbzs+O0xhbmRyb2lkL3dpZGdldC9MaXN0QWRhcHRlcjspViApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuQXJyYXlMaXN0Ci1qYXZhLnV0aWwuQXJyYXlMaXN0Ci1hbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9BcnJheUxpc3Q8TGFuZHJvaWQvd2lkZ2V0L0xpc3RWaWV3JEZpeGVkVmlld0luZm87PjspWiApCi1wcml2YXRlIGJvb2xlYW4gYXJlQWxsTGlzdEluZm9zU2VsZWN0YWJsZSgKLWphdmEudXRpbC5BcnJheUxpc3QpCi0KLXB1YmxpYyBib29sZWFuIGFyZUFsbEl0ZW1zRW5hYmxlZCgpCi0KLXB1YmxpYyBpbnQgZ2V0Q291bnQoKQotCi1wdWJsaWMgYW5kcm9pZC53aWRnZXQuRmlsdGVyIGdldEZpbHRlcigpCi0KLXB1YmxpYyBpbnQgZ2V0Rm9vdGVyc0NvdW50KCkKLQotcHVibGljIGludCBnZXRIZWFkZXJzQ291bnQoKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRJdGVtKAotaW50KQotCi1wdWJsaWMgbG9uZyBnZXRJdGVtSWQoCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0SXRlbVZpZXdUeXBlKAotaW50KQotCi1wdWJsaWMgYW5kcm9pZC52aWV3LlZpZXcgZ2V0VmlldygKLWludAotYW5kcm9pZC52aWV3LlZpZXcKLWFuZHJvaWQudmlldy5WaWV3R3JvdXApCi0KLXB1YmxpYyBpbnQgZ2V0Vmlld1R5cGVDb3VudCgpCi0KLXB1YmxpYyBhbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlciBnZXRXcmFwcGVkQWRhcHRlcigpCi0KLXB1YmxpYyBib29sZWFuIGhhc1N0YWJsZUlkcygpCi0KLXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKAotYW5kcm9pZC5kYXRhYmFzZS5EYXRhU2V0T2JzZXJ2ZXIpCi0KLXB1YmxpYyBib29sZWFuIHJlbW92ZUZvb3RlcigKLWFuZHJvaWQudmlldy5WaWV3KQotCi1wdWJsaWMgYm9vbGVhbiByZW1vdmVIZWFkZXIoCi1hbmRyb2lkLnZpZXcuVmlldykKLQotcHVibGljIHZvaWQgdW5yZWdpc3RlckRhdGFTZXRPYnNlcnZlcigKLWFuZHJvaWQuZGF0YWJhc2UuRGF0YVNldE9ic2VydmVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3cyRSZW1vdGVWaWV3Ci1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9JbWFnZVZpZXckU2NhbGVUeXBlOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3IGV4dGVuZHMgYW5kcm9pZC52aWV3LlZpZXcKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5NYXRyaXgkU2NhbGVUb0ZpdFtdIHNTMkZBcnJheQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXckU2NhbGVUeXBlW10gc1NjYWxlVHlwZUFycmF5Ci0KLXByaXZhdGUgYm9vbGVhbiBtQWRqdXN0Vmlld0JvdW5kcwotCi1wcml2YXRlIGludCBtQWxwaGEKLQotcHJpdmF0ZSBib29sZWFuIG1CYXNlbGluZUFsaWduZWQKLQotcHJpdmF0ZSBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yRmlsdGVyIG1Db2xvckZpbHRlcgotCi1wcml2YXRlIGJvb2xlYW4gbUNyb3BUb1BhZGRpbmcKLQotcHJpdmF0ZSBhbmRyb2lkLmdyYXBoaWNzLk1hdHJpeCBtRHJhd01hdHJpeAotCi1wcml2YXRlIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgbURyYXdhYmxlCi0KLXByaXZhdGUgaW50IG1EcmF3YWJsZUhlaWdodAotCi1wcml2YXRlIGludCBtRHJhd2FibGVXaWR0aAotCi1wcml2YXRlIGJvb2xlYW4gbUhhdmVGcmFtZQotCi1wcml2YXRlIGludCBtTGV2ZWwKLQotcHJpdmF0ZSBhbmRyb2lkLmdyYXBoaWNzLk1hdHJpeCBtTWF0cml4Ci0KLXByaXZhdGUgaW50IG1NYXhIZWlnaHQKLQotcHJpdmF0ZSBpbnQgbU1heFdpZHRoCi0KLXByaXZhdGUgYm9vbGVhbiBtTWVyZ2VTdGF0ZQotCi1wcml2YXRlIGludCBtUmVzb3VyY2UKLQotcHJpdmF0ZSBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXckU2NhbGVUeXBlIG1TY2FsZVR5cGUKLQotcHJpdmF0ZSBpbnRbXSBtU3RhdGUKLQotcHJpdmF0ZSBhbmRyb2lkLmdyYXBoaWNzLlJlY3RGIG1UZW1wRHN0Ci0KLXByaXZhdGUgYW5kcm9pZC5ncmFwaGljcy5SZWN0RiBtVGVtcFNyYwotCi1wcml2YXRlIGFuZHJvaWQubmV0LlVyaSBtVXJpCi0KLXByaXZhdGUgaW50IG1WaWV3QWxwaGFTY2FsZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldAotaW50KQotCi1wcml2YXRlIHZvaWQgYXBwbHlDb2xvck1vZCgpCi0KLXByaXZhdGUgdm9pZCBjb25maWd1cmVCb3VuZHMoKQotCi1wcml2YXRlIHZvaWQgaW5pdEltYWdlVmlldygpCi0KLXByaXZhdGUgdm9pZCByZXNpemVGcm9tRHJhd2FibGUoKQotCi1wcml2YXRlIGludCByZXNvbHZlQWRqdXN0ZWRTaXplKAotaW50Ci1pbnQKLWludCkKLQotcHJpdmF0ZSB2b2lkIHJlc29sdmVVcmkoKQotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLmdyYXBoaWNzLk1hdHJpeCRTY2FsZVRvRml0IHNjYWxlVHlwZVRvU2NhbGVUb0ZpdCgKLWFuZHJvaWQud2lkZ2V0LkltYWdlVmlldyRTY2FsZVR5cGUpCi0KLXByaXZhdGUgdm9pZCB1cGRhdGVEcmF3YWJsZSgKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIGNsZWFyQ29sb3JGaWx0ZXIoKQotCi1wcm90ZWN0ZWQgdm9pZCBkcmF3YWJsZVN0YXRlQ2hhbmdlZCgpCi0KLXB1YmxpYyBpbnQgZ2V0QmFzZWxpbmUoKQotCi1wdWJsaWMgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSBnZXREcmF3YWJsZSgpCi0KLXB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLk1hdHJpeCBnZXRJbWFnZU1hdHJpeCgpCi0KLXB1YmxpYyBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXckU2NhbGVUeXBlIGdldFNjYWxlVHlwZSgpCi0KLXB1YmxpYyB2b2lkIGludmFsaWRhdGVEcmF3YWJsZSgKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUpCi0KLXB1YmxpYyBpbnRbXSBvbkNyZWF0ZURyYXdhYmxlU3RhdGUoCi1pbnQpCi0KLXByb3RlY3RlZCB2b2lkIG9uRHJhdygKLWFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzKQotCi1wcm90ZWN0ZWQgdm9pZCBvbk1lYXN1cmUoCi1pbnQKLWludCkKLQotcHJvdGVjdGVkIGJvb2xlYW4gb25TZXRBbHBoYSgKLWludCkKLQotcHVibGljIHZvaWQgc2V0QWRqdXN0Vmlld0JvdW5kcygKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldEFscGhhKAotaW50KQotCi1wdWJsaWMgZmluYWwgdm9pZCBzZXRDb2xvckZpbHRlcigKLWludAotYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmJE1vZGUpCi0KLXB1YmxpYyB2b2lkIHNldENvbG9yRmlsdGVyKAotYW5kcm9pZC5ncmFwaGljcy5Db2xvckZpbHRlcikKLQotcHJvdGVjdGVkIGJvb2xlYW4gc2V0RnJhbWUoCi1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldEltYWdlQml0bWFwKAotYW5kcm9pZC5ncmFwaGljcy5CaXRtYXApCi0KLXB1YmxpYyB2b2lkIHNldEltYWdlRHJhd2FibGUoCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlKQotCi1wdWJsaWMgdm9pZCBzZXRJbWFnZUxldmVsKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRJbWFnZU1hdHJpeCgKLWFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4KQotCi1wdWJsaWMgdm9pZCBzZXRJbWFnZVJlc291cmNlKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRJbWFnZVN0YXRlKAotaW50W10KLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldEltYWdlVVJJKAotYW5kcm9pZC5uZXQuVXJpKQotCi1wdWJsaWMgdm9pZCBzZXRNYXhIZWlnaHQoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldE1heFdpZHRoKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRTY2FsZVR5cGUoCi1hbmRyb2lkLndpZGdldC5JbWFnZVZpZXckU2NhbGVUeXBlKQotCi1wdWJsaWMgdm9pZCBzZXRTZWxlY3RlZCgKLWJvb2xlYW4pCi0KLXByb3RlY3RlZCBib29sZWFuIHZlcmlmeURyYXdhYmxlKAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLndpZGdldC5JbWFnZUJ1dHRvbiBleHRlbmRzIGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQKLWludCkKLQotcHJvdGVjdGVkIGJvb2xlYW4gb25TZXRBbHBoYSgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLndpZGdldC5WaWV3QW5pbWF0b3IgZXh0ZW5kcyBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gYm9vbGVhbiBtQW5pbWF0ZUZpcnN0VGltZQotCi0gYm9vbGVhbiBtRmlyc3RUaW1lCi0KLSBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvbiBtSW5BbmltYXRpb24KLQotIGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uIG1PdXRBbmltYXRpb24KLQotIGludCBtV2hpY2hDaGlsZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHJpdmF0ZSB2b2lkIGluaXRWaWV3QW5pbWF0b3IoKQotCi1wdWJsaWMgdm9pZCBhZGRWaWV3KAotYW5kcm9pZC52aWV3LlZpZXcKLWludAotYW5kcm9pZC52aWV3LlZpZXdHcm91cCRMYXlvdXRQYXJhbXMpCi0KLXB1YmxpYyBpbnQgZ2V0QmFzZWxpbmUoKQotCi1wdWJsaWMgYW5kcm9pZC52aWV3LlZpZXcgZ2V0Q3VycmVudFZpZXcoKQotCi1wdWJsaWMgaW50IGdldERpc3BsYXllZENoaWxkKCkKLQotcHVibGljIGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uIGdldEluQW5pbWF0aW9uKCkKLQotcHVibGljIGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uIGdldE91dEFuaW1hdGlvbigpCi0KLXB1YmxpYyB2b2lkIHNldEFuaW1hdGVGaXJzdFZpZXcoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXREaXNwbGF5ZWRDaGlsZCgKLWludCkKLQotcHVibGljIHZvaWQgc2V0SW5BbmltYXRpb24oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRJbkFuaW1hdGlvbigKLWFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uKQotCi1wdWJsaWMgdm9pZCBzZXRPdXRBbmltYXRpb24oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRPdXRBbmltYXRpb24oCi1hbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvbikKLQotcHVibGljIHZvaWQgc2hvd05leHQoKQotCi0gdm9pZCBzaG93T25seSgKLWludCkKLQotcHVibGljIHZvaWQgc2hvd1ByZXZpb3VzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9WaWV3U3dpdGNoZXIkVmlld0ZhY3Rvcnk7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLndpZGdldC5WaWV3U3dpdGNoZXIgZXh0ZW5kcyBhbmRyb2lkLndpZGdldC5WaWV3QW5pbWF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGFuZHJvaWQud2lkZ2V0LlZpZXdTd2l0Y2hlciRWaWV3RmFjdG9yeSBtRmFjdG9yeQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHJpdmF0ZSBhbmRyb2lkLnZpZXcuVmlldyBvYnRhaW5WaWV3KCkKLQotcHVibGljIHZvaWQgYWRkVmlldygKLWFuZHJvaWQudmlldy5WaWV3Ci1pbnQKLWFuZHJvaWQudmlldy5WaWV3R3JvdXAkTGF5b3V0UGFyYW1zKQotCi1wdWJsaWMgYW5kcm9pZC52aWV3LlZpZXcgZ2V0TmV4dFZpZXcoKQotCi1wdWJsaWMgdm9pZCByZXNldCgpCi0KLXB1YmxpYyB2b2lkIHNldEZhY3RvcnkoCi1hbmRyb2lkLndpZGdldC5WaWV3U3dpdGNoZXIkVmlld0ZhY3RvcnkpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC53aWRnZXQuSW1hZ2VTd2l0Y2hlciBleHRlbmRzIGFuZHJvaWQud2lkZ2V0LlZpZXdTd2l0Y2hlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHVibGljIHZvaWQgc2V0SW1hZ2VEcmF3YWJsZSgKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUpCi0KLXB1YmxpYyB2b2lkIHNldEltYWdlUmVzb3VyY2UoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldEltYWdlVVJJKAotYW5kcm9pZC5uZXQuVXJpKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTY0MDkgbmFtZSA9U2NhbGVUeXBlICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL0VudW08TGFuZHJvaWQvd2lkZ2V0L0ltYWdlVmlldyRTY2FsZVR5cGU7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L0ltYWdlVmlldzsgKQotcHVibGljIGZpbmFsIGNsYXNzIGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldyRTY2FsZVR5cGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXckU2NhbGVUeXBlW10gJFZBTFVFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldyRTY2FsZVR5cGUgQ0VOVEVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3JFNjYWxlVHlwZSBDRU5URVJfQ1JPUAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldyRTY2FsZVR5cGUgQ0VOVEVSX0lOU0lERQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldyRTY2FsZVR5cGUgRklUX0NFTlRFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldyRTY2FsZVR5cGUgRklUX0VORAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldyRTY2FsZVR5cGUgRklUX1NUQVJUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3JFNjYWxlVHlwZSBGSVRfWFkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXckU2NhbGVUeXBlIE1BVFJJWAotCi1maW5hbCBpbnQgbmF0aXZlSW50Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJKVYgKQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldyRTY2FsZVR5cGUgdmFsdWVPZigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3JFNjYWxlVHlwZVtdIHZhbHVlcygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPUxheW91dFBhcmFtcyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvTGluZWFyTGF5b3V0OyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0JExheW91dFBhcmFtcyBleHRlbmRzIGFuZHJvaWQudmlldy5WaWV3R3JvdXAkTWFyZ2luTGF5b3V0UGFyYW1zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AYW5kcm9pZC52aWV3LlZpZXdEZWJ1ZyRFeHBvcnRlZFByb3BlcnR5IChtYXBwaW5nID1MYW5kcm9pZC92aWV3L1ZpZXdEZWJ1ZyRJbnRUb1N0cmluZzs6W2Zyb20gPTI1NSwgdG8gPU5PTkVdTGFuZHJvaWQvdmlldy9WaWV3RGVidWckSW50VG9TdHJpbmc7Oltmcm9tID0wLCB0byA9Tk9ORV1MYW5kcm9pZC92aWV3L1ZpZXdEZWJ1ZyRJbnRUb1N0cmluZzs6W2Zyb20gPTQ4LCB0byA9VE9QXUxhbmRyb2lkL3ZpZXcvVmlld0RlYnVnJEludFRvU3RyaW5nOzpbZnJvbSA9ODAsIHRvID1CT1RUT01dTGFuZHJvaWQvdmlldy9WaWV3RGVidWckSW50VG9TdHJpbmc7Oltmcm9tID0zLCB0byA9TEVGVF1MYW5kcm9pZC92aWV3L1ZpZXdEZWJ1ZyRJbnRUb1N0cmluZzs6W2Zyb20gPTUsIHRvID1SSUdIVF1MYW5kcm9pZC92aWV3L1ZpZXdEZWJ1ZyRJbnRUb1N0cmluZzs6W2Zyb20gPTE2LCB0byA9Q0VOVEVSX1ZFUlRJQ0FMXUxhbmRyb2lkL3ZpZXcvVmlld0RlYnVnJEludFRvU3RyaW5nOzpbZnJvbSA9MTEyLCB0byA9RklMTF9WRVJUSUNBTF1MYW5kcm9pZC92aWV3L1ZpZXdEZWJ1ZyRJbnRUb1N0cmluZzs6W2Zyb20gPTEsIHRvID1DRU5URVJfSE9SSVpPTlRBTF1MYW5kcm9pZC92aWV3L1ZpZXdEZWJ1ZyRJbnRUb1N0cmluZzs6W2Zyb20gPTcsIHRvID1GSUxMX0hPUklaT05UQUxdTGFuZHJvaWQvdmlldy9WaWV3RGVidWckSW50VG9TdHJpbmc7Oltmcm9tID0xNywgdG8gPUNFTlRFUl1MYW5kcm9pZC92aWV3L1ZpZXdEZWJ1ZyRJbnRUb1N0cmluZzs6W2Zyb20gPTExOSwgdG8gPUZJTExdICkKLXB1YmxpYyBpbnQgZ3Jhdml0eQotQGFuZHJvaWQudmlldy5WaWV3RGVidWckRXhwb3J0ZWRQcm9wZXJ0eQotcHVibGljIGZsb2F0IHdlaWdodAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWludAotZmxvYXQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLnZpZXcuVmlld0dyb3VwJExheW91dFBhcmFtcykKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC52aWV3LlZpZXdHcm91cCRNYXJnaW5MYXlvdXRQYXJhbXMpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGRlYnVnKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9MaW5lYXJMYXlvdXQkTGF5b3V0UGFyYW1zOyApCi1AYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MkUmVtb3RlVmlldwotcHVibGljIGNsYXNzIGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dCBleHRlbmRzIGFuZHJvaWQudmlldy5WaWV3R3JvdXAKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSE9SSVpPTlRBTAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5ERVhfQk9UVE9NCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTkRFWF9DRU5URVJfVkVSVElDQUwKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOREVYX0ZJTEwKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOREVYX1RPUAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWRVJUSUNBTAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVkVSVElDQUxfR1JBVklUWV9DT1VOVAotCi1wcml2YXRlIGJvb2xlYW4gbUJhc2VsaW5lQWxpZ25lZAotCi1wcml2YXRlIGludCBtQmFzZWxpbmVBbGlnbmVkQ2hpbGRJbmRleAotCi1wcml2YXRlIGludCBtQmFzZWxpbmVDaGlsZFRvcAotCi1wcml2YXRlIGludCBtR3Jhdml0eQotCi1wcml2YXRlIGludFtdIG1NYXhBc2NlbnQKLQotcHJpdmF0ZSBpbnRbXSBtTWF4RGVzY2VudAotCi1wcml2YXRlIGludCBtT3JpZW50YXRpb24KLQotcHJpdmF0ZSBpbnQgbVRvdGFsTGVuZ3RoCi0KLXByaXZhdGUgZmxvYXQgbVdlaWdodFN1bQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHJpdmF0ZSB2b2lkIGZvcmNlVW5pZm9ybUhlaWdodCgKLWludAotaW50KQotCi1wcml2YXRlIHZvaWQgZm9yY2VVbmlmb3JtV2lkdGgoCi1pbnQKLWludCkKLQotcHJpdmF0ZSB2b2lkIHNldENoaWxkRnJhbWUoCi1hbmRyb2lkLnZpZXcuVmlldwotaW50Ci1pbnQKLWludAotaW50KQotCi1wcm90ZWN0ZWQgYm9vbGVhbiBjaGVja0xheW91dFBhcmFtcygKLWFuZHJvaWQudmlldy5WaWV3R3JvdXAkTGF5b3V0UGFyYW1zKQotCi1wcm90ZWN0ZWQgdm9sYXRpbGUgYW5kcm9pZC52aWV3LlZpZXdHcm91cCRMYXlvdXRQYXJhbXMgZ2VuZXJhdGVEZWZhdWx0TGF5b3V0UGFyYW1zKCkKLQotcHJvdGVjdGVkIGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dCRMYXlvdXRQYXJhbXMgZ2VuZXJhdGVEZWZhdWx0TGF5b3V0UGFyYW1zKCkKLQotcHVibGljIHZvbGF0aWxlIGFuZHJvaWQudmlldy5WaWV3R3JvdXAkTGF5b3V0UGFyYW1zIGdlbmVyYXRlTGF5b3V0UGFyYW1zKAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHJvdGVjdGVkIHZvbGF0aWxlIGFuZHJvaWQudmlldy5WaWV3R3JvdXAkTGF5b3V0UGFyYW1zIGdlbmVyYXRlTGF5b3V0UGFyYW1zKAotYW5kcm9pZC52aWV3LlZpZXdHcm91cCRMYXlvdXRQYXJhbXMpCi0KLXB1YmxpYyBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQkTGF5b3V0UGFyYW1zIGdlbmVyYXRlTGF5b3V0UGFyYW1zKAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHJvdGVjdGVkIGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dCRMYXlvdXRQYXJhbXMgZ2VuZXJhdGVMYXlvdXRQYXJhbXMoCi1hbmRyb2lkLnZpZXcuVmlld0dyb3VwJExheW91dFBhcmFtcykKLQotcHVibGljIGludCBnZXRCYXNlbGluZSgpCi0KLXB1YmxpYyBpbnQgZ2V0QmFzZWxpbmVBbGlnbmVkQ2hpbGRJbmRleCgpCi0KLSBpbnQgZ2V0Q2hpbGRyZW5Ta2lwQ291bnQoCi1hbmRyb2lkLnZpZXcuVmlldwotaW50KQotCi0gaW50IGdldExvY2F0aW9uT2Zmc2V0KAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLSBpbnQgZ2V0TmV4dExvY2F0aW9uT2Zmc2V0KAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXB1YmxpYyBpbnQgZ2V0T3JpZW50YXRpb24oKQotCi0gYW5kcm9pZC52aWV3LlZpZXcgZ2V0VmlydHVhbENoaWxkQXQoCi1pbnQpCi0KLSBpbnQgZ2V0VmlydHVhbENoaWxkQ291bnQoKQotCi1wdWJsaWMgZmxvYXQgZ2V0V2VpZ2h0U3VtKCkKLQotcHVibGljIGJvb2xlYW4gaXNCYXNlbGluZUFsaWduZWQoKQotCi0gdm9pZCBsYXlvdXRIb3Jpem9udGFsKCkKLQotIHZvaWQgbGF5b3V0VmVydGljYWwoKQotCi0gdm9pZCBtZWFzdXJlQ2hpbGRCZWZvcmVMYXlvdXQoCi1hbmRyb2lkLnZpZXcuVmlldwotaW50Ci1pbnQKLWludAotaW50Ci1pbnQpCi0KLSB2b2lkIG1lYXN1cmVIb3Jpem9udGFsKAotaW50Ci1pbnQpCi0KLSBpbnQgbWVhc3VyZU51bGxDaGlsZCgKLWludCkKLQotIHZvaWQgbWVhc3VyZVZlcnRpY2FsKAotaW50Ci1pbnQpCi0KLXByb3RlY3RlZCB2b2lkIG9uTGF5b3V0KAotYm9vbGVhbgotaW50Ci1pbnQKLWludAotaW50KQotCi1wcm90ZWN0ZWQgdm9pZCBvbk1lYXN1cmUoCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgc2V0QmFzZWxpbmVBbGlnbmVkKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0QmFzZWxpbmVBbGlnbmVkQ2hpbGRJbmRleCgKLWludCkKLQotcHVibGljIHZvaWQgc2V0R3Jhdml0eSgKLWludCkKLQotcHVibGljIHZvaWQgc2V0SG9yaXpvbnRhbEdyYXZpdHkoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldE9yaWVudGF0aW9uKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRWZXJ0aWNhbEdyYXZpdHkoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldFdlaWdodFN1bSgKLWZsb2F0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9MaXN0VmlldzsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID00MTA0IG5hbWUgPW51bGwgKQotIGNsYXNzIGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3JDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvTGlzdFZpZXc7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9QXJyb3dTY3JvbGxGb2N1c1Jlc3VsdCApCi0gY2xhc3MgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXckQXJyb3dTY3JvbGxGb2N1c1Jlc3VsdCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBpbnQgbUFtb3VudFRvU2Nyb2xsCi0KLXByaXZhdGUgaW50IG1TZWxlY3RlZFBvc2l0aW9uCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3JDEpCi0KLXB1YmxpYyBpbnQgZ2V0QW1vdW50VG9TY3JvbGwoKQotCi1wdWJsaWMgaW50IGdldFNlbGVjdGVkUG9zaXRpb24oKQotCi0gdm9pZCBwb3B1bGF0ZSgKLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1GaXhlZFZpZXdJbmZvICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9MaXN0VmlldzsgKQotIGNsYXNzIGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3JEZpeGVkVmlld0luZm8gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGRhdGEKLQotcHVibGljIGJvb2xlYW4gaXNTZWxlY3RhYmxlCi0KLWZpbmFsIGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3IHRoaXMkMAotCi1wdWJsaWMgYW5kcm9pZC52aWV3LlZpZXcgdmlldwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I8TGFuZHJvaWQvd2lkZ2V0L0xpc3RWaWV3JFNhdmVkU3RhdGU7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L0xpc3RWaWV3JFNhdmVkU3RhdGU7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLWZpbmFsIGNsYXNzIGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3JFNhdmVkU3RhdGUkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBhbmRyb2lkLndpZGdldC5MaXN0VmlldyRTYXZlZFN0YXRlIGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXckU2F2ZWRTdGF0ZVtdIG5ld0FycmF5KAotaW50KQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdFtdIG5ld0FycmF5KAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1TYXZlZFN0YXRlICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9MaXN0VmlldzsgKQotIGNsYXNzIGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3JFNhdmVkU3RhdGUgZXh0ZW5kcyBhbmRyb2lkLnZpZXcuVmlldyRCYXNlU2F2ZWRTdGF0ZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC93aWRnZXQvTGlzdFZpZXckU2F2ZWRTdGF0ZTs+OyApCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yIENSRUFUT1IKLQotIGFuZHJvaWQudXRpbC5TcGFyc2VCb29sZWFuQXJyYXkgY2hlY2tTdGF0ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuUGFyY2VsKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLlBhcmNlbAotYW5kcm9pZC53aWRnZXQuTGlzdFZpZXckMSkKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5QYXJjZWxhYmxlCi1hbmRyb2lkLnV0aWwuU3BhcnNlQm9vbGVhbkFycmF5KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLXB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9NZWRpYUNvbnRyb2xsZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLSBjbGFzcyBhbmRyb2lkLndpZGdldC5NZWRpYUNvbnRyb2xsZXIkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnZpZXcuVmlldyRPblRvdWNoTGlzdGVuZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC53aWRnZXQuTWVkaWFDb250cm9sbGVyIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQud2lkZ2V0Lk1lZGlhQ29udHJvbGxlcikKLQotcHVibGljIGJvb2xlYW4gb25Ub3VjaCgKLWFuZHJvaWQudmlldy5WaWV3Ci1hbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L01lZGlhQ29udHJvbGxlcjsgKQotIGNsYXNzIGFuZHJvaWQud2lkZ2V0Lk1lZGlhQ29udHJvbGxlciQyIGV4dGVuZHMgYW5kcm9pZC5vcy5IYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQud2lkZ2V0Lk1lZGlhQ29udHJvbGxlciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLndpZGdldC5NZWRpYUNvbnRyb2xsZXIpCi0KLXB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L01lZGlhQ29udHJvbGxlcjsgKQotIGNsYXNzIGFuZHJvaWQud2lkZ2V0Lk1lZGlhQ29udHJvbGxlciQzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQudmlldy5WaWV3JE9uQ2xpY2tMaXN0ZW5lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLndpZGdldC5NZWRpYUNvbnRyb2xsZXIgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53aWRnZXQuTWVkaWFDb250cm9sbGVyKQotCi1wdWJsaWMgdm9pZCBvbkNsaWNrKAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L01lZGlhQ29udHJvbGxlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotIGNsYXNzIGFuZHJvaWQud2lkZ2V0Lk1lZGlhQ29udHJvbGxlciQ0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQud2lkZ2V0LlNlZWtCYXIkT25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGxvbmcgZHVyYXRpb24KLQotZmluYWwgYW5kcm9pZC53aWRnZXQuTWVkaWFDb250cm9sbGVyIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQud2lkZ2V0Lk1lZGlhQ29udHJvbGxlcikKLQotcHVibGljIHZvaWQgb25Qcm9ncmVzc0NoYW5nZWQoCi1hbmRyb2lkLndpZGdldC5TZWVrQmFyCi1pbnQKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIG9uU3RhcnRUcmFja2luZ1RvdWNoKAotYW5kcm9pZC53aWRnZXQuU2Vla0JhcikKLQotcHVibGljIHZvaWQgb25TdG9wVHJhY2tpbmdUb3VjaCgKLWFuZHJvaWQud2lkZ2V0LlNlZWtCYXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L01lZGlhQ29udHJvbGxlcjsgKQotIGNsYXNzIGFuZHJvaWQud2lkZ2V0Lk1lZGlhQ29udHJvbGxlciQ1IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQudmlldy5WaWV3JE9uQ2xpY2tMaXN0ZW5lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLndpZGdldC5NZWRpYUNvbnRyb2xsZXIgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53aWRnZXQuTWVkaWFDb250cm9sbGVyKQotCi1wdWJsaWMgdm9pZCBvbkNsaWNrKAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L01lZGlhQ29udHJvbGxlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotIGNsYXNzIGFuZHJvaWQud2lkZ2V0Lk1lZGlhQ29udHJvbGxlciQ2IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQudmlldy5WaWV3JE9uQ2xpY2tMaXN0ZW5lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLndpZGdldC5NZWRpYUNvbnRyb2xsZXIgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53aWRnZXQuTWVkaWFDb250cm9sbGVyKQotCi1wdWJsaWMgdm9pZCBvbkNsaWNrKAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPU1lZGlhUGxheWVyQ29udHJvbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvTWVkaWFDb250cm9sbGVyOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQud2lkZ2V0Lk1lZGlhQ29udHJvbGxlciRNZWRpYVBsYXllckNvbnRyb2wgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IGludCBnZXRCdWZmZXJQZXJjZW50YWdlKCkKLQotcHVibGljIGFic3RyYWN0IGludCBnZXRDdXJyZW50UG9zaXRpb24oKQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldER1cmF0aW9uKCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNQbGF5aW5nKCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgcGF1c2UoKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZWVrVG8oCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHN0YXJ0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9NZWRpYUNvbnRyb2xsZXIkTWVkaWFQbGF5ZXJDb250cm9sOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC53aWRnZXQuTWVkaWFDb250cm9sbGVyIGV4dGVuZHMgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZBREVfT1VUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSE9XX1BST0dSRVNTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBzRGVmYXVsdFRpbWVvdXQKLQotcHJpdmF0ZSBhbmRyb2lkLnZpZXcuVmlldyBtQW5jaG9yCi0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgbUNvbnRleHQKLQotcHJpdmF0ZSBhbmRyb2lkLndpZGdldC5UZXh0VmlldyBtQ3VycmVudFRpbWUKLQotcHJpdmF0ZSBhbmRyb2lkLnZpZXcuVmlldyBtRGVjb3IKLQotcHJpdmF0ZSBib29sZWFuIG1EcmFnZ2luZwotCi1wcml2YXRlIGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3IG1FbmRUaW1lCi0KLXByaXZhdGUgYW5kcm9pZC53aWRnZXQuSW1hZ2VCdXR0b24gbUZmd2RCdXR0b24KLQotcHJpdmF0ZSBhbmRyb2lkLnZpZXcuVmlldyRPbkNsaWNrTGlzdGVuZXIgbUZmd2RMaXN0ZW5lcgotCi0gamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIgbUZvcm1hdEJ1aWxkZXIKLQotIGphdmEudXRpbC5Gb3JtYXR0ZXIgbUZvcm1hdHRlcgotCi1wcml2YXRlIGJvb2xlYW4gbUZyb21YbWwKLQotcHJpdmF0ZSBhbmRyb2lkLm9zLkhhbmRsZXIgbUhhbmRsZXIKLQotcHJpdmF0ZSBib29sZWFuIG1MaXN0ZW5lcnNTZXQKLQotcHJpdmF0ZSBhbmRyb2lkLndpZGdldC5JbWFnZUJ1dHRvbiBtTmV4dEJ1dHRvbgotCi1wcml2YXRlIGFuZHJvaWQudmlldy5WaWV3JE9uQ2xpY2tMaXN0ZW5lciBtTmV4dExpc3RlbmVyCi0KLXByaXZhdGUgYW5kcm9pZC53aWRnZXQuSW1hZ2VCdXR0b24gbVBhdXNlQnV0dG9uCi0KLXByaXZhdGUgYW5kcm9pZC52aWV3LlZpZXckT25DbGlja0xpc3RlbmVyIG1QYXVzZUxpc3RlbmVyCi0KLXByaXZhdGUgYW5kcm9pZC53aWRnZXQuTWVkaWFDb250cm9sbGVyJE1lZGlhUGxheWVyQ29udHJvbCBtUGxheWVyCi0KLXByaXZhdGUgYW5kcm9pZC53aWRnZXQuSW1hZ2VCdXR0b24gbVByZXZCdXR0b24KLQotcHJpdmF0ZSBhbmRyb2lkLnZpZXcuVmlldyRPbkNsaWNrTGlzdGVuZXIgbVByZXZMaXN0ZW5lcgotCi1wcml2YXRlIGFuZHJvaWQud2lkZ2V0LlByb2dyZXNzQmFyIG1Qcm9ncmVzcwotCi1wcml2YXRlIGFuZHJvaWQud2lkZ2V0LkltYWdlQnV0dG9uIG1SZXdCdXR0b24KLQotcHJpdmF0ZSBhbmRyb2lkLnZpZXcuVmlldyRPbkNsaWNrTGlzdGVuZXIgbVJld0xpc3RlbmVyCi0KLXByaXZhdGUgYW5kcm9pZC52aWV3LlZpZXcgbVJvb3QKLQotcHJpdmF0ZSBhbmRyb2lkLndpZGdldC5TZWVrQmFyJE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyIG1TZWVrTGlzdGVuZXIKLQotcHJpdmF0ZSBib29sZWFuIG1TaG93aW5nCi0KLXByaXZhdGUgYW5kcm9pZC52aWV3LlZpZXckT25Ub3VjaExpc3RlbmVyIG1Ub3VjaExpc3RlbmVyCi0KLXByaXZhdGUgYm9vbGVhbiBtVXNlRmFzdEZvcndhcmQKLQotcHJpdmF0ZSBhbmRyb2lkLnZpZXcuV2luZG93IG1XaW5kb3cKLQotcHJpdmF0ZSBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlciBtV2luZG93TWFuYWdlcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWJvb2xlYW4pCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQwMDAoCi1hbmRyb2lkLndpZGdldC5NZWRpYUNvbnRyb2xsZXIpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDEwMCgKLWFuZHJvaWQud2lkZ2V0Lk1lZGlhQ29udHJvbGxlcikKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDIwMCgKLWFuZHJvaWQud2lkZ2V0Lk1lZGlhQ29udHJvbGxlcikKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDIwMigKLWFuZHJvaWQud2lkZ2V0Lk1lZGlhQ29udHJvbGxlcgotYm9vbGVhbikKLQotc3RhdGljIGFuZHJvaWQud2lkZ2V0Lk1lZGlhQ29udHJvbGxlciRNZWRpYVBsYXllckNvbnRyb2wgYWNjZXNzJDMwMCgKLWFuZHJvaWQud2lkZ2V0Lk1lZGlhQ29udHJvbGxlcikKLQotc3RhdGljIHZvaWQgYWNjZXNzJDQwMCgKLWFuZHJvaWQud2lkZ2V0Lk1lZGlhQ29udHJvbGxlcikKLQotc3RhdGljIGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3IGFjY2VzcyQ1MDAoCi1hbmRyb2lkLndpZGdldC5NZWRpYUNvbnRyb2xsZXIpCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGFjY2VzcyQ2MDAoCi1hbmRyb2lkLndpZGdldC5NZWRpYUNvbnRyb2xsZXIKLWludCkKLQotc3RhdGljIHZvaWQgYWNjZXNzJDcwMCgKLWFuZHJvaWQud2lkZ2V0Lk1lZGlhQ29udHJvbGxlcikKLQotcHJpdmF0ZSB2b2lkIGRvUGF1c2VSZXN1bWUoKQotCi1wcml2YXRlIHZvaWQgaW5pdENvbnRyb2xsZXJWaWV3KAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXByaXZhdGUgdm9pZCBpbml0RmxvYXRpbmdXaW5kb3coKQotCi1wcml2YXRlIHZvaWQgaW5zdGFsbFByZXZOZXh0TGlzdGVuZXJzKCkKLQotcHJpdmF0ZSBpbnQgc2V0UHJvZ3Jlc3MoKQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgc3RyaW5nRm9yVGltZSgKLWludCkKLQotcHJpdmF0ZSB2b2lkIHVwZGF0ZVBhdXNlUGxheSgpCi0KLXB1YmxpYyBib29sZWFuIGRpc3BhdGNoS2V5RXZlbnQoCi1hbmRyb2lkLnZpZXcuS2V5RXZlbnQpCi0KLXB1YmxpYyB2b2lkIGhpZGUoKQotCi1wdWJsaWMgYm9vbGVhbiBpc1Nob3dpbmcoKQotCi1wcm90ZWN0ZWQgYW5kcm9pZC52aWV3LlZpZXcgbWFrZUNvbnRyb2xsZXJWaWV3KCkKLQotcHVibGljIHZvaWQgb25GaW5pc2hJbmZsYXRlKCkKLQotcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KAotYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50KQotCi1wdWJsaWMgYm9vbGVhbiBvblRyYWNrYmFsbEV2ZW50KAotYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50KQotCi1wdWJsaWMgdm9pZCBzZXRBbmNob3JWaWV3KAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRNZWRpYVBsYXllcigKLWFuZHJvaWQud2lkZ2V0Lk1lZGlhQ29udHJvbGxlciRNZWRpYVBsYXllckNvbnRyb2wpCi0KLXB1YmxpYyB2b2lkIHNldFByZXZOZXh0TGlzdGVuZXJzKAotYW5kcm9pZC52aWV3LlZpZXckT25DbGlja0xpc3RlbmVyCi1hbmRyb2lkLnZpZXcuVmlldyRPbkNsaWNrTGlzdGVuZXIpCi0KLXB1YmxpYyB2b2lkIHNob3coKQotCi1wdWJsaWMgdm9pZCBzaG93KAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1Db21tYVRva2VuaXplciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvTXVsdGlBdXRvQ29tcGxldGVUZXh0VmlldzsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQud2lkZ2V0Lk11bHRpQXV0b0NvbXBsZXRlVGV4dFZpZXckQ29tbWFUb2tlbml6ZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC53aWRnZXQuTXVsdGlBdXRvQ29tcGxldGVUZXh0VmlldyRUb2tlbml6ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgaW50IGZpbmRUb2tlbkVuZCgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWludCkKLQotcHVibGljIGludCBmaW5kVG9rZW5TdGFydCgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWludCkKLQotcHVibGljIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgdGVybWluYXRlVG9rZW4oCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L011bHRpQXV0b0NvbXBsZXRlVGV4dFZpZXckQ29tbWFUb2tlbml6ZXI7TGFuZHJvaWQvd2lkZ2V0L011bHRpQXV0b0NvbXBsZXRlVGV4dFZpZXckVG9rZW5pemVyOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC53aWRnZXQuTXVsdGlBdXRvQ29tcGxldGVUZXh0VmlldyBleHRlbmRzIGFuZHJvaWQud2lkZ2V0LkF1dG9Db21wbGV0ZVRleHRWaWV3Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYW5kcm9pZC53aWRnZXQuTXVsdGlBdXRvQ29tcGxldGVUZXh0VmlldyRUb2tlbml6ZXIgbVRva2VuaXplcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQKLWludCkKLQotcHVibGljIGJvb2xlYW4gZW5vdWdoVG9GaWx0ZXIoKQotCi0gdm9pZCBmaW5pc2hJbml0KCkKLQotcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUZpbHRlcmluZygKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWludCkKLQotcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUZpbHRlcmluZygKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIHBlcmZvcm1WYWxpZGF0aW9uKCkKLQotcHJvdGVjdGVkIHZvaWQgcmVwbGFjZVRleHQoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotCi1wdWJsaWMgdm9pZCBzZXRUb2tlbml6ZXIoCi1hbmRyb2lkLndpZGdldC5NdWx0aUF1dG9Db21wbGV0ZVRleHRWaWV3JFRva2VuaXplcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvUG9wdXBXaW5kb3c7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NCBuYW1lID1PbkRpc21pc3NMaXN0ZW5lciApCi1hYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC53aWRnZXQuUG9wdXBXaW5kb3ckT25EaXNtaXNzTGlzdGVuZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgb25EaXNtaXNzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvUG9wdXBXaW5kb3c7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MiBuYW1lID1Qb3B1cFZpZXdDb250YWluZXIgKQotIGNsYXNzIGFuZHJvaWQud2lkZ2V0LlBvcHVwV2luZG93JFBvcHVwVmlld0NvbnRhaW5lciBleHRlbmRzIGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQud2lkZ2V0LlBvcHVwV2luZG93IHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQud2lkZ2V0LlBvcHVwV2luZG93Ci1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotcHVibGljIGJvb2xlYW4gZGlzcGF0Y2hLZXlFdmVudCgKLWFuZHJvaWQudmlldy5LZXlFdmVudCkKLQotcHJvdGVjdGVkIGludFtdIG9uQ3JlYXRlRHJhd2FibGVTdGF0ZSgKLWludCkKLQotcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KAotYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L1BvcHVwV2luZG93JFBvcHVwVmlld0NvbnRhaW5lcjtMYW5kcm9pZC93aWRnZXQvUG9wdXBXaW5kb3ckT25EaXNtaXNzTGlzdGVuZXI7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLndpZGdldC5Qb3B1cFdpbmRvdyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gQUJPVkVfQU5DSE9SX1NUQVRFX1NFVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0JBUl9IRUlHSFQKLQotcHJpdmF0ZSBib29sZWFuIG1BYm92ZUFuY2hvcgotCi1wcml2YXRlIGludCBtQW5pbWF0aW9uU3R5bGUKLQotcHJpdmF0ZSBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIG1CYWNrZ3JvdW5kCi0KLXByaXZhdGUgYW5kcm9pZC52aWV3LlZpZXcgbUNvbnRlbnRWaWV3Ci0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgbUNvbnRleHQKLQotcHJpdmF0ZSBpbnRbXSBtRHJhd2luZ0xvY2F0aW9uCi0KLXByaXZhdGUgYm9vbGVhbiBtRm9jdXNhYmxlCi0KLXByaXZhdGUgaW50IG1IZWlnaHQKLQotcHJpdmF0ZSBib29sZWFuIG1JZ25vcmVDaGVla1ByZXNzCi0KLXByaXZhdGUgYm9vbGVhbiBtSXNTaG93aW5nCi0KLXByaXZhdGUgYW5kcm9pZC53aWRnZXQuUG9wdXBXaW5kb3ckT25EaXNtaXNzTGlzdGVuZXIgbU9uRGlzbWlzc0xpc3RlbmVyCi0KLXByaXZhdGUgYW5kcm9pZC52aWV3LlZpZXcgbVBvcHVwVmlldwotCi1wcml2YXRlIGludFtdIG1Sb290TG9jYXRpb24KLQotcHJpdmF0ZSBhbmRyb2lkLmdyYXBoaWNzLlJlY3QgbVRlbXBSZWN0Ci0KLXByaXZhdGUgaW50IG1XaWR0aAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQKLWludCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQudmlldy5WaWV3Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC52aWV3LlZpZXcKLWludAotaW50Ci1ib29sZWFuKQotCi1zdGF0aWMgYm9vbGVhbiBhY2Nlc3MkMDAwKAotYW5kcm9pZC53aWRnZXQuUG9wdXBXaW5kb3cpCi0KLXN0YXRpYyBpbnRbXSBhY2Nlc3MkMTAwKCkKLQotcHJpdmF0ZSBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlciRMYXlvdXRQYXJhbXMgY3JlYXRlUG9wdXBMYXlvdXQoCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXByaXZhdGUgYm9vbGVhbiBmaW5kRHJvcERvd25Qb3NpdGlvbigKLWFuZHJvaWQudmlldy5WaWV3Ci1hbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlciRMYXlvdXRQYXJhbXMKLWludAotaW50KQotCi1wcml2YXRlIHZvaWQgaW52b2tlUG9wdXAoCi1hbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlciRMYXlvdXRQYXJhbXMpCi0KLXByaXZhdGUgdm9pZCBwcmVwYXJlUG9wdXAoCi1hbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlciRMYXlvdXRQYXJhbXMpCi0KLXB1YmxpYyB2b2lkIGRpc21pc3MoKQotCi1wdWJsaWMgaW50IGdldEFuaW1hdGlvblN0eWxlKCkKLQotcHVibGljIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgZ2V0QmFja2dyb3VuZCgpCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuVmlldyBnZXRDb250ZW50VmlldygpCi0KLXB1YmxpYyBpbnQgZ2V0SGVpZ2h0KCkKLQotcHVibGljIGludCBnZXRNYXhBdmFpbGFibGVIZWlnaHQoCi1hbmRyb2lkLnZpZXcuVmlldykKLQotcHVibGljIGludCBnZXRXaWR0aCgpCi0KLXB1YmxpYyBib29sZWFuIGlzRm9jdXNhYmxlKCkKLQotcHVibGljIGJvb2xlYW4gaXNTaG93aW5nKCkKLQotcHVibGljIHZvaWQgc2V0QW5pbWF0aW9uU3R5bGUoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldEJhY2tncm91bmREcmF3YWJsZSgKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUpCi0KLXB1YmxpYyB2b2lkIHNldENvbnRlbnRWaWV3KAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXB1YmxpYyB2b2lkIHNldEZvY3VzYWJsZSgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldEhlaWdodCgKLWludCkKLQotcHVibGljIHZvaWQgc2V0SWdub3JlQ2hlZWtQcmVzcygpCi0KLXB1YmxpYyB2b2lkIHNldE9uRGlzbWlzc0xpc3RlbmVyKAotYW5kcm9pZC53aWRnZXQuUG9wdXBXaW5kb3ckT25EaXNtaXNzTGlzdGVuZXIpCi0KLXB1YmxpYyB2b2lkIHNldFdpZHRoKAotaW50KQotCi1wdWJsaWMgdm9pZCBzaG93QXNEcm9wRG93bigKLWFuZHJvaWQudmlldy5WaWV3KQotCi1wdWJsaWMgdm9pZCBzaG93QXNEcm9wRG93bigKLWFuZHJvaWQudmlldy5WaWV3Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgc2hvd0F0TG9jYXRpb24oCi1hbmRyb2lkLnZpZXcuVmlldwotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgdXBkYXRlKAotaW50Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCB1cGRhdGUoCi1hbmRyb2lkLnZpZXcuVmlldwotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIHVwZGF0ZSgKLWFuZHJvaWQudmlldy5WaWV3Ci1pbnQKLWludAotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPVJlZnJlc2hQcm9ncmVzc1J1bm5hYmxlICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9Qcm9ncmVzc0JhcjsgKQotIGNsYXNzIGFuZHJvaWQud2lkZ2V0LlByb2dyZXNzQmFyJFJlZnJlc2hQcm9ncmVzc1J1bm5hYmxlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5SdW5uYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGJvb2xlYW4gbUZyb21Ub3VjaAotCi1wcml2YXRlIGludCBtSWQKLQotcHJpdmF0ZSBpbnQgbVByb2dyZXNzCi0KLWZpbmFsIGFuZHJvaWQud2lkZ2V0LlByb2dyZXNzQmFyIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQud2lkZ2V0LlByb2dyZXNzQmFyCi1pbnQKLWludAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgcnVuKCkKLQotcHVibGljIHZvaWQgc2V0dXAoCi1pbnQKLWludAotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLndpZGdldC5SYWRpb0J1dHRvbiBleHRlbmRzIGFuZHJvaWQud2lkZ2V0LkNvbXBvdW5kQnV0dG9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldAotaW50KQotCi1wdWJsaWMgdm9pZCB0b2dnbGUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9NDEwNCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9SYWRpb0dyb3VwOyApCi0gY2xhc3MgYW5kcm9pZC53aWRnZXQuUmFkaW9Hcm91cCQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L1JhZGlvR3JvdXA7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MiBuYW1lID1DaGVja2VkU3RhdGVUcmFja2VyICkKLSBjbGFzcyBhbmRyb2lkLndpZGdldC5SYWRpb0dyb3VwJENoZWNrZWRTdGF0ZVRyYWNrZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC53aWRnZXQuQ29tcG91bmRCdXR0b24kT25DaGVja2VkQ2hhbmdlTGlzdGVuZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC53aWRnZXQuUmFkaW9Hcm91cCB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53aWRnZXQuUmFkaW9Hcm91cCkKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53aWRnZXQuUmFkaW9Hcm91cAotYW5kcm9pZC53aWRnZXQuUmFkaW9Hcm91cCQxKQotCi1wdWJsaWMgdm9pZCBvbkNoZWNrZWRDaGFuZ2VkKAotYW5kcm9pZC53aWRnZXQuQ29tcG91bmRCdXR0b24KLWJvb2xlYW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPUxheW91dFBhcmFtcyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvUmFkaW9Hcm91cDsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQud2lkZ2V0LlJhZGlvR3JvdXAkTGF5b3V0UGFyYW1zIGV4dGVuZHMgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0JExheW91dFBhcmFtcwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWludAotZmxvYXQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLnZpZXcuVmlld0dyb3VwJExheW91dFBhcmFtcykKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC52aWV3LlZpZXdHcm91cCRNYXJnaW5MYXlvdXRQYXJhbXMpCi0KLXByb3RlY3RlZCB2b2lkIHNldEJhc2VBdHRyaWJ1dGVzKAotYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5Ci1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9T25DaGVja2VkQ2hhbmdlTGlzdGVuZXIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L1JhZGlvR3JvdXA7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC53aWRnZXQuUmFkaW9Hcm91cCRPbkNoZWNrZWRDaGFuZ2VMaXN0ZW5lciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvbkNoZWNrZWRDaGFuZ2VkKAotYW5kcm9pZC53aWRnZXQuUmFkaW9Hcm91cAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9SYWRpb0dyb3VwOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTIgbmFtZSA9UGFzc1Rocm91Z2hIaWVyYXJjaHlDaGFuZ2VMaXN0ZW5lciApCi0gY2xhc3MgYW5kcm9pZC53aWRnZXQuUmFkaW9Hcm91cCRQYXNzVGhyb3VnaEhpZXJhcmNoeUNoYW5nZUxpc3RlbmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQudmlldy5WaWV3R3JvdXAkT25IaWVyYXJjaHlDaGFuZ2VMaXN0ZW5lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGFuZHJvaWQudmlldy5WaWV3R3JvdXAkT25IaWVyYXJjaHlDaGFuZ2VMaXN0ZW5lciBtT25IaWVyYXJjaHlDaGFuZ2VMaXN0ZW5lcgotCi1maW5hbCBhbmRyb2lkLndpZGdldC5SYWRpb0dyb3VwIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLndpZGdldC5SYWRpb0dyb3VwKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLndpZGdldC5SYWRpb0dyb3VwCi1hbmRyb2lkLndpZGdldC5SYWRpb0dyb3VwJDEpCi0KLXN0YXRpYyBhbmRyb2lkLnZpZXcuVmlld0dyb3VwJE9uSGllcmFyY2h5Q2hhbmdlTGlzdGVuZXIgYWNjZXNzJDIwMigKLWFuZHJvaWQud2lkZ2V0LlJhZGlvR3JvdXAkUGFzc1Rocm91Z2hIaWVyYXJjaHlDaGFuZ2VMaXN0ZW5lcgotYW5kcm9pZC52aWV3LlZpZXdHcm91cCRPbkhpZXJhcmNoeUNoYW5nZUxpc3RlbmVyKQotCi1wdWJsaWMgdm9pZCBvbkNoaWxkVmlld0FkZGVkKAotYW5kcm9pZC52aWV3LlZpZXcKLWFuZHJvaWQudmlldy5WaWV3KQotCi1wdWJsaWMgdm9pZCBvbkNoaWxkVmlld1JlbW92ZWQoCi1hbmRyb2lkLnZpZXcuVmlldwotYW5kcm9pZC52aWV3LlZpZXcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvUmFkaW9Hcm91cCQxO0xhbmRyb2lkL3dpZGdldC9SYWRpb0dyb3VwJFBhc3NUaHJvdWdoSGllcmFyY2h5Q2hhbmdlTGlzdGVuZXI7TGFuZHJvaWQvd2lkZ2V0L1JhZGlvR3JvdXAkQ2hlY2tlZFN0YXRlVHJhY2tlcjtMYW5kcm9pZC93aWRnZXQvUmFkaW9Hcm91cCRPbkNoZWNrZWRDaGFuZ2VMaXN0ZW5lcjtMYW5kcm9pZC93aWRnZXQvUmFkaW9Hcm91cCRMYXlvdXRQYXJhbXM7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLndpZGdldC5SYWRpb0dyb3VwIGV4dGVuZHMgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgaW50IG1DaGVja2VkSWQKLQotcHJpdmF0ZSBhbmRyb2lkLndpZGdldC5Db21wb3VuZEJ1dHRvbiRPbkNoZWNrZWRDaGFuZ2VMaXN0ZW5lciBtQ2hpbGRPbkNoZWNrZWRDaGFuZ2VMaXN0ZW5lcgotCi1wcml2YXRlIGFuZHJvaWQud2lkZ2V0LlJhZGlvR3JvdXAkT25DaGVja2VkQ2hhbmdlTGlzdGVuZXIgbU9uQ2hlY2tlZENoYW5nZUxpc3RlbmVyCi0KLXByaXZhdGUgYW5kcm9pZC53aWRnZXQuUmFkaW9Hcm91cCRQYXNzVGhyb3VnaEhpZXJhcmNoeUNoYW5nZUxpc3RlbmVyIG1QYXNzVGhyb3VnaExpc3RlbmVyCi0KLXByaXZhdGUgYm9vbGVhbiBtUHJvdGVjdEZyb21DaGVja2VkQ2hhbmdlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0KQotCi1zdGF0aWMgYm9vbGVhbiBhY2Nlc3MkMzAwKAotYW5kcm9pZC53aWRnZXQuUmFkaW9Hcm91cCkKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDMwMigKLWFuZHJvaWQud2lkZ2V0LlJhZGlvR3JvdXAKLWJvb2xlYW4pCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDQwMCgKLWFuZHJvaWQud2lkZ2V0LlJhZGlvR3JvdXApCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQ1MDAoCi1hbmRyb2lkLndpZGdldC5SYWRpb0dyb3VwCi1pbnQKLWJvb2xlYW4pCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQ2MDAoCi1hbmRyb2lkLndpZGdldC5SYWRpb0dyb3VwCi1pbnQpCi0KLXN0YXRpYyBhbmRyb2lkLndpZGdldC5Db21wb3VuZEJ1dHRvbiRPbkNoZWNrZWRDaGFuZ2VMaXN0ZW5lciBhY2Nlc3MkNzAwKAotYW5kcm9pZC53aWRnZXQuUmFkaW9Hcm91cCkKLQotcHJpdmF0ZSB2b2lkIGluaXQoKQotCi1wcml2YXRlIHZvaWQgc2V0Q2hlY2tlZElkKAotaW50KQotCi1wcml2YXRlIHZvaWQgc2V0Q2hlY2tlZFN0YXRlRm9yVmlldygKLWludAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgY2hlY2soCi1pbnQpCi0KLXByb3RlY3RlZCBib29sZWFuIGNoZWNrTGF5b3V0UGFyYW1zKAotYW5kcm9pZC52aWV3LlZpZXdHcm91cCRMYXlvdXRQYXJhbXMpCi0KLXB1YmxpYyB2b2lkIGNsZWFyQ2hlY2soKQotCi1wcm90ZWN0ZWQgdm9sYXRpbGUgYW5kcm9pZC52aWV3LlZpZXdHcm91cCRMYXlvdXRQYXJhbXMgZ2VuZXJhdGVEZWZhdWx0TGF5b3V0UGFyYW1zKCkKLQotcHJvdGVjdGVkIGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dCRMYXlvdXRQYXJhbXMgZ2VuZXJhdGVEZWZhdWx0TGF5b3V0UGFyYW1zKCkKLQotcHVibGljIHZvbGF0aWxlIGFuZHJvaWQudmlldy5WaWV3R3JvdXAkTGF5b3V0UGFyYW1zIGdlbmVyYXRlTGF5b3V0UGFyYW1zKAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHVibGljIHZvbGF0aWxlIGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dCRMYXlvdXRQYXJhbXMgZ2VuZXJhdGVMYXlvdXRQYXJhbXMoCi1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0KQotCi1wdWJsaWMgYW5kcm9pZC53aWRnZXQuUmFkaW9Hcm91cCRMYXlvdXRQYXJhbXMgZ2VuZXJhdGVMYXlvdXRQYXJhbXMoCi1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0KQotCi1wdWJsaWMgaW50IGdldENoZWNrZWRSYWRpb0J1dHRvbklkKCkKLQotcHJvdGVjdGVkIHZvaWQgb25GaW5pc2hJbmZsYXRlKCkKLQotcHVibGljIHZvaWQgc2V0T25DaGVja2VkQ2hhbmdlTGlzdGVuZXIoCi1hbmRyb2lkLndpZGdldC5SYWRpb0dyb3VwJE9uQ2hlY2tlZENoYW5nZUxpc3RlbmVyKQotCi1wdWJsaWMgdm9pZCBzZXRPbkhpZXJhcmNoeUNoYW5nZUxpc3RlbmVyKAotYW5kcm9pZC52aWV3LlZpZXdHcm91cCRPbkhpZXJhcmNoeUNoYW5nZUxpc3RlbmVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1PblJhdGluZ0JhckNoYW5nZUxpc3RlbmVyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9SYXRpbmdCYXI7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC53aWRnZXQuUmF0aW5nQmFyJE9uUmF0aW5nQmFyQ2hhbmdlTGlzdGVuZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgb25SYXRpbmdDaGFuZ2VkKAotYW5kcm9pZC53aWRnZXQuUmF0aW5nQmFyCi1mbG9hdAotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9SYXRpbmdCYXIkT25SYXRpbmdCYXJDaGFuZ2VMaXN0ZW5lcjsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQud2lkZ2V0LlJhdGluZ0JhciBleHRlbmRzIGFuZHJvaWQud2lkZ2V0LkFic1NlZWtCYXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBpbnQgbU51bVN0YXJzCi0KLXByaXZhdGUgYW5kcm9pZC53aWRnZXQuUmF0aW5nQmFyJE9uUmF0aW5nQmFyQ2hhbmdlTGlzdGVuZXIgbU9uUmF0aW5nQmFyQ2hhbmdlTGlzdGVuZXIKLQotcHJpdmF0ZSBpbnQgbVByb2dyZXNzT25TdGFydFRyYWNraW5nCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldAotaW50KQotCi1wcml2YXRlIGZsb2F0IGdldFByb2dyZXNzUGVyU3RhcigpCi0KLXByaXZhdGUgdm9pZCB1cGRhdGVTZWNvbmRhcnlQcm9ncmVzcygKLWludCkKLQotIHZvaWQgZGlzcGF0Y2hSYXRpbmdDaGFuZ2UoCi1ib29sZWFuKQotCi0gYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5zaGFwZXMuU2hhcGUgZ2V0RHJhd2FibGVTaGFwZSgpCi0KLXB1YmxpYyBpbnQgZ2V0TnVtU3RhcnMoKQotCi1wdWJsaWMgYW5kcm9pZC53aWRnZXQuUmF0aW5nQmFyJE9uUmF0aW5nQmFyQ2hhbmdlTGlzdGVuZXIgZ2V0T25SYXRpbmdCYXJDaGFuZ2VMaXN0ZW5lcigpCi0KLXB1YmxpYyBmbG9hdCBnZXRSYXRpbmcoKQotCi1wdWJsaWMgZmxvYXQgZ2V0U3RlcFNpemUoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0luZGljYXRvcigpCi0KLXByb3RlY3RlZCB2b2lkIG9uTWVhc3VyZSgKLWludAotaW50KQotCi0gdm9pZCBvblByb2dyZXNzUmVmcmVzaCgKLWZsb2F0Ci1ib29sZWFuKQotCi0gdm9pZCBvblN0YXJ0VHJhY2tpbmdUb3VjaCgpCi0KLSB2b2lkIG9uU3RvcFRyYWNraW5nVG91Y2goKQotCi1wdWJsaWMgdm9pZCBzZXRJc0luZGljYXRvcigKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldE1heCgKLWludCkKLQotcHVibGljIHZvaWQgc2V0TnVtU3RhcnMoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldE9uUmF0aW5nQmFyQ2hhbmdlTGlzdGVuZXIoCi1hbmRyb2lkLndpZGdldC5SYXRpbmdCYXIkT25SYXRpbmdCYXJDaGFuZ2VMaXN0ZW5lcikKLQotcHVibGljIHZvaWQgc2V0UmF0aW5nKAotZmxvYXQpCi0KLXB1YmxpYyB2b2lkIHNldFN0ZXBTaXplKAotZmxvYXQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L1JlbGF0aXZlTGF5b3V0OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9TGF5b3V0UGFyYW1zICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLndpZGdldC5SZWxhdGl2ZUxheW91dCRMYXlvdXRQYXJhbXMgZXh0ZW5kcyBhbmRyb2lkLnZpZXcuVmlld0dyb3VwJE1hcmdpbkxheW91dFBhcmFtcwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYm9vbGVhbiBhbGlnbldpdGhQYXJlbnQKLQotcHJpdmF0ZSBpbnQgbUJvdHRvbQotCi1wcml2YXRlIGludCBtTGVmdAotCi1wcml2YXRlIGludCBtUmlnaHQKLQotcHJpdmF0ZSBpbnRbXSBtUnVsZXMKLQotcHJpdmF0ZSBpbnQgbVRvcAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC52aWV3LlZpZXdHcm91cCRMYXlvdXRQYXJhbXMpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQudmlldy5WaWV3R3JvdXAkTWFyZ2luTGF5b3V0UGFyYW1zKQotCi1zdGF0aWMgaW50IGFjY2VzcyQwMDAoCi1hbmRyb2lkLndpZGdldC5SZWxhdGl2ZUxheW91dCRMYXlvdXRQYXJhbXMpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDAwMigKLWFuZHJvaWQud2lkZ2V0LlJlbGF0aXZlTGF5b3V0JExheW91dFBhcmFtcwotaW50KQotCi1zdGF0aWMgaW50IGFjY2VzcyQwMTIoCi1hbmRyb2lkLndpZGdldC5SZWxhdGl2ZUxheW91dCRMYXlvdXRQYXJhbXMKLWludCkKLQotc3RhdGljIGludCBhY2Nlc3MkMTAwKAotYW5kcm9pZC53aWRnZXQuUmVsYXRpdmVMYXlvdXQkTGF5b3V0UGFyYW1zKQotCi1zdGF0aWMgaW50IGFjY2VzcyQxMDIoCi1hbmRyb2lkLndpZGdldC5SZWxhdGl2ZUxheW91dCRMYXlvdXRQYXJhbXMKLWludCkKLQotc3RhdGljIGludCBhY2Nlc3MkMTEyKAotYW5kcm9pZC53aWRnZXQuUmVsYXRpdmVMYXlvdXQkTGF5b3V0UGFyYW1zCi1pbnQpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDIwMCgKLWFuZHJvaWQud2lkZ2V0LlJlbGF0aXZlTGF5b3V0JExheW91dFBhcmFtcykKLQotc3RhdGljIGludCBhY2Nlc3MkMjAyKAotYW5kcm9pZC53aWRnZXQuUmVsYXRpdmVMYXlvdXQkTGF5b3V0UGFyYW1zCi1pbnQpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDIxMigKLWFuZHJvaWQud2lkZ2V0LlJlbGF0aXZlTGF5b3V0JExheW91dFBhcmFtcwotaW50KQotCi1zdGF0aWMgaW50IGFjY2VzcyQzMDAoCi1hbmRyb2lkLndpZGdldC5SZWxhdGl2ZUxheW91dCRMYXlvdXRQYXJhbXMpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDMwMigKLWFuZHJvaWQud2lkZ2V0LlJlbGF0aXZlTGF5b3V0JExheW91dFBhcmFtcwotaW50KQotCi1zdGF0aWMgaW50IGFjY2VzcyQzMTIoCi1hbmRyb2lkLndpZGdldC5SZWxhdGl2ZUxheW91dCRMYXlvdXRQYXJhbXMKLWludCkKLQotcHVibGljIHZvaWQgYWRkUnVsZSgKLWludCkKLQotcHVibGljIHZvaWQgYWRkUnVsZSgKLWludAotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBkZWJ1ZygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBpbnRbXSBnZXRSdWxlcygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L1JlbW90ZVZpZXdzOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExhbmRyb2lkL3dpZGdldC9SZW1vdGVWaWV3czs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1maW5hbCBjbGFzcyBhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3cyQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGFuZHJvaWQud2lkZ2V0LlJlbW90ZVZpZXdzIGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3NbXSBuZXdBcnJheSgKLWludCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3RbXSBuZXdBcnJheSgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwMzQgbmFtZSA9QWN0aW9uICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9SZW1vdGVWaWV3czsgKQotYWJzdHJhY3QgY2xhc3MgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MkQWN0aW9uIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3cyQxKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9SZW1vdGVWaWV3cyRBY3Rpb25FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGFwcGx5KAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPUFjdGlvbkV4Y2VwdGlvbiApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvUmVtb3RlVmlld3M7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3cyRBY3Rpb25FeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbiAodmFsdWUgPUxqYXZhL2xhbmcvYW5ub3RhdGlvbi9SZXRlbnRpb25Qb2xpY3k7IVJVTlRJTUUgKQotQGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldCAodmFsdWUgPUxqYXZhL2xhbmcvYW5ub3RhdGlvbi9FbGVtZW50VHlwZTshVFlQRSApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTk3MzcgbmFtZSA9UmVtb3RlVmlldyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvUmVtb3RlVmlld3M7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MkUmVtb3RlVmlldyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTIgbmFtZSA9U2V0Q2hyb25vbWV0ZXIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L1JlbW90ZVZpZXdzOyApCi0gY2xhc3MgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MkU2V0Q2hyb25vbWV0ZXIgZXh0ZW5kcyBhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3cyRBY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHCi0KLSBsb25nIGJhc2UKLQotIGphdmEubGFuZy5TdHJpbmcgZm9ybWF0Ci0KLSBib29sZWFuIHJ1bm5pbmcKLQotZmluYWwgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MgdGhpcyQwCi0KLSBpbnQgdmlld0lkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MKLWludAotbG9uZwotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgdm9pZCBhcHBseSgKLWFuZHJvaWQudmlldy5WaWV3KQotCi1wdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvUmVtb3RlVmlld3M7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MiBuYW1lID1TZXRJbWFnZVZpZXdSZXNvdXJjZSApCi0gY2xhc3MgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MkU2V0SW1hZ2VWaWV3UmVzb3VyY2UgZXh0ZW5kcyBhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3cyRBY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHCi0KLSBpbnQgc3JjSWQKLQotZmluYWwgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MgdGhpcyQwCi0KLSBpbnQgdmlld0lkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3cwotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyB2b2lkIGFwcGx5KAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MiBuYW1lID1TZXRJbWFnZVZpZXdVcmkgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L1JlbW90ZVZpZXdzOyApCi0gY2xhc3MgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MkU2V0SW1hZ2VWaWV3VXJpIGV4dGVuZHMgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MkQWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBRwotCi1maW5hbCBhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3cyB0aGlzJDAKLQotIGFuZHJvaWQubmV0LlVyaSB1cmkKLQotIGludCB2aWV3SWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3cwotaW50Ci1hbmRyb2lkLm5ldC5VcmkpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQud2lkZ2V0LlJlbW90ZVZpZXdzCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIHZvaWQgYXBwbHkoCi1hbmRyb2lkLnZpZXcuVmlldykKLQotcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPVNldFByb2dyZXNzQmFyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9SZW1vdGVWaWV3czsgKQotIGNsYXNzIGFuZHJvaWQud2lkZ2V0LlJlbW90ZVZpZXdzJFNldFByb2dyZXNzQmFyIGV4dGVuZHMgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MkQWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBRwotCi0gYm9vbGVhbiBpbmRldGVybWluYXRlCi0KLSBpbnQgbWF4Ci0KLSBpbnQgcHJvZ3Jlc3MKLQotZmluYWwgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MgdGhpcyQwCi0KLSBpbnQgdmlld0lkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MKLWludAotaW50Ci1pbnQKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQud2lkZ2V0LlJlbW90ZVZpZXdzCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIHZvaWQgYXBwbHkoCi1hbmRyb2lkLnZpZXcuVmlldykKLQotcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPVNldFRleHRWaWV3VGV4dCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvUmVtb3RlVmlld3M7ICkKLSBjbGFzcyBhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3cyRTZXRUZXh0Vmlld1RleHQgZXh0ZW5kcyBhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3cyRBY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHCi0KLSBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIHRleHQKLQotZmluYWwgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MgdGhpcyQwCi0KLSBpbnQgdmlld0lkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MKLWludAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgdm9pZCBhcHBseSgKLWFuZHJvaWQudmlldy5WaWV3KQotCi1wdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvUmVtb3RlVmlld3M7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MiBuYW1lID1TZXRWaWV3VmlzaWJpbGl0eSApCi0gY2xhc3MgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MkU2V0Vmlld1Zpc2liaWxpdHkgZXh0ZW5kcyBhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3cyRBY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHCi0KLWZpbmFsIGFuZHJvaWQud2lkZ2V0LlJlbW90ZVZpZXdzIHRoaXMkMAotCi1wcml2YXRlIGludCB2aWV3SWQKLQotcHJpdmF0ZSBpbnQgdmlzaWJpbGl0eQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQud2lkZ2V0LlJlbW90ZVZpZXdzCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgdm9pZCBhcHBseSgKLWFuZHJvaWQudmlldy5WaWV3KQotCi1wdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9SZW1vdGVWaWV3cyRTZXRQcm9ncmVzc0JhcjtMYW5kcm9pZC93aWRnZXQvUmVtb3RlVmlld3MkU2V0Q2hyb25vbWV0ZXI7TGFuZHJvaWQvd2lkZ2V0L1JlbW90ZVZpZXdzJFNldEltYWdlVmlld1VyaTtMYW5kcm9pZC93aWRnZXQvUmVtb3RlVmlld3MkU2V0SW1hZ2VWaWV3UmVzb3VyY2U7TGFuZHJvaWQvd2lkZ2V0L1JlbW90ZVZpZXdzJFNldFRleHRWaWV3VGV4dDtMYW5kcm9pZC93aWRnZXQvUmVtb3RlVmlld3MkU2V0Vmlld1Zpc2liaWxpdHk7TGFuZHJvaWQvd2lkZ2V0L1JlbW90ZVZpZXdzJEFjdGlvbjtMYW5kcm9pZC93aWRnZXQvUmVtb3RlVmlld3MkQWN0aW9uRXhjZXB0aW9uO0xhbmRyb2lkL3dpZGdldC9SZW1vdGVWaWV3cyRSZW1vdGVWaWV3OyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXIkRmlsdGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExhbmRyb2lkL3dpZGdldC9SZW1vdGVWaWV3czs+OyApCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yIENSRUFUT1IKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMT0dfVEFHCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9BcnJheUxpc3Q8TGFuZHJvaWQvd2lkZ2V0L1JlbW90ZVZpZXdzJEFjdGlvbjs+OyApCi1wcml2YXRlIGphdmEudXRpbC5BcnJheUxpc3QgbUFjdGlvbnMKLQotcHJpdmF0ZSBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBtQ29udGV4dAotCi1wcml2YXRlIGludCBtTGF5b3V0SWQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1QYWNrYWdlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1zdGF0aWMgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgYWNjZXNzJDEwMCgKLWFuZHJvaWQud2lkZ2V0LlJlbW90ZVZpZXdzKQotCi1wcml2YXRlIHZvaWQgYWRkQWN0aW9uKAotYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MkQWN0aW9uKQotCi1wcml2YXRlIHZvaWQgcGVyZm9ybUFwcGx5KAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgcHJlcGFyZUNvbnRleHQoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotcHVibGljIGFuZHJvaWQudmlldy5WaWV3IGFwcGx5KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudmlldy5WaWV3R3JvdXApCi0KLXB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpCi0KLXB1YmxpYyBpbnQgZ2V0TGF5b3V0SWQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRQYWNrYWdlKCkKLQotcHVibGljIGJvb2xlYW4gb25Mb2FkQ2xhc3MoCi1qYXZhLmxhbmcuQ2xhc3MpCi0KLXB1YmxpYyB2b2lkIHJlYXBwbHkoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXB1YmxpYyB2b2lkIHNldENocm9ub21ldGVyKAotaW50Ci1sb25nCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRJbWFnZVZpZXdSZXNvdXJjZSgKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRJbWFnZVZpZXdVcmkoCi1pbnQKLWFuZHJvaWQubmV0LlVyaSkKLQotcHVibGljIHZvaWQgc2V0UHJvZ3Jlc3NCYXIoCi1pbnQKLWludAotaW50Ci1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRUZXh0Vmlld1RleHQoCi1pbnQKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi0KLXB1YmxpYyB2b2lkIHNldFZpZXdWaXNpYmlsaXR5KAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGFuZHJvaWQud2lkZ2V0LlJlc291cmNlQ3Vyc29yVHJlZUFkYXB0ZXIgZXh0ZW5kcyBhbmRyb2lkLndpZGdldC5DdXJzb3JUcmVlQWRhcHRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGludCBtQ2hpbGRMYXlvdXQKLQotcHJpdmF0ZSBpbnQgbUNvbGxhcHNlZEdyb3VwTGF5b3V0Ci0KLXByaXZhdGUgaW50IG1FeHBhbmRlZEdyb3VwTGF5b3V0Ci0KLXByaXZhdGUgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyIG1JbmZsYXRlcgotCi1wcml2YXRlIGludCBtTGFzdENoaWxkTGF5b3V0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIGFuZHJvaWQudmlldy5WaWV3IG5ld0NoaWxkVmlldygKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLmRhdGFiYXNlLkN1cnNvcgotYm9vbGVhbgotYW5kcm9pZC52aWV3LlZpZXdHcm91cCkKLQotcHVibGljIGFuZHJvaWQudmlldy5WaWV3IG5ld0dyb3VwVmlldygKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLmRhdGFiYXNlLkN1cnNvcgotYm9vbGVhbgotYW5kcm9pZC52aWV3LlZpZXdHcm91cCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLndpZGdldC5TY3JvbGxCYXJEcmF3YWJsZSBleHRlbmRzIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBib29sZWFuIG1BbHdheXNEcmF3SG9yaXpvbnRhbFRyYWNrCi0KLXByaXZhdGUgYm9vbGVhbiBtQWx3YXlzRHJhd1ZlcnRpY2FsVHJhY2sKLQotcHJpdmF0ZSBib29sZWFuIG1DaGFuZ2VkCi0KLXByaXZhdGUgaW50IG1FeHRlbnQKLQotcHJpdmF0ZSBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIG1Ib3Jpem9udGFsVGh1bWIKLQotcHJpdmF0ZSBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIG1Ib3Jpem9udGFsVHJhY2sKLQotcHJpdmF0ZSBpbnQgbU9mZnNldAotCi1wcml2YXRlIGludCBtUmFuZ2UKLQotcHJpdmF0ZSBib29sZWFuIG1SYW5nZUNoYW5nZWQKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlJlY3QgbVRlbXBCb3VuZHMKLQotcHJpdmF0ZSBib29sZWFuIG1WZXJ0aWNhbAotCi1wcml2YXRlIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgbVZlcnRpY2FsVGh1bWIKLQotcHJpdmF0ZSBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIG1WZXJ0aWNhbFRyYWNrCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgZHJhdygKLWFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzKQotCi1wcm90ZWN0ZWQgdm9pZCBkcmF3VGh1bWIoCi1hbmRyb2lkLmdyYXBoaWNzLkNhbnZhcwotYW5kcm9pZC5ncmFwaGljcy5SZWN0Ci1pbnQKLWludAotYm9vbGVhbikKLQotcHJvdGVjdGVkIHZvaWQgZHJhd1RyYWNrKAotYW5kcm9pZC5ncmFwaGljcy5DYW52YXMKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdAotYm9vbGVhbikKLQotcHVibGljIGJvb2xlYW4gZ2V0QWx3YXlzRHJhd0hvcml6b250YWxUcmFjaygpCi0KLXB1YmxpYyBib29sZWFuIGdldEFsd2F5c0RyYXdWZXJ0aWNhbFRyYWNrKCkKLQotcHVibGljIGludCBnZXRPcGFjaXR5KCkKLQotcHVibGljIGludCBnZXRTaXplKAotYm9vbGVhbikKLQotcHJvdGVjdGVkIHZvaWQgb25Cb3VuZHNDaGFuZ2UoCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3QpCi0KLXB1YmxpYyB2b2lkIHNldEFscGhhKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRBbHdheXNEcmF3SG9yaXpvbnRhbFRyYWNrKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0QWx3YXlzRHJhd1ZlcnRpY2FsVHJhY2soCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRDb2xvckZpbHRlcigKLWFuZHJvaWQuZ3JhcGhpY3MuQ29sb3JGaWx0ZXIpCi0KLXB1YmxpYyB2b2lkIHNldEhvcml6b250YWxUaHVtYkRyYXdhYmxlKAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSkKLQotcHVibGljIHZvaWQgc2V0SG9yaXpvbnRhbFRyYWNrRHJhd2FibGUoCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlKQotCi1wdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJzKAotaW50Ci1pbnQKLWludAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0VmVydGljYWxUaHVtYkRyYXdhYmxlKAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSkKLQotcHVibGljIHZvaWQgc2V0VmVydGljYWxUcmFja0RyYXdhYmxlKAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQud2lkZ2V0LlNjcm9sbFZpZXcgZXh0ZW5kcyBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQU5JTUFURURfU0NST0xMX0dBUAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBNQVhfU0NST0xMX0ZBQ1RPUgotCi1wcml2YXRlIGFuZHJvaWQudmlldy5WaWV3IG1DaGlsZFRvU2Nyb2xsVG8KLQotcHJpdmF0ZSBib29sZWFuIG1GaWxsVmlld3BvcnQKLQotcHJpdmF0ZSBib29sZWFuIG1Jc0JlaW5nRHJhZ2dlZAotCi1wcml2YXRlIGJvb2xlYW4gbUlzTGF5b3V0RGlydHkKLQotcHJpdmF0ZSBmbG9hdCBtTGFzdE1vdGlvblkKLQotcHJpdmF0ZSBsb25nIG1MYXN0U2Nyb2xsCi0KLXByaXZhdGUgYm9vbGVhbiBtU2Nyb2xsVmlld01vdmVkRm9jdXMKLQotcHJpdmF0ZSBhbmRyb2lkLndpZGdldC5TY3JvbGxlciBtU2Nyb2xsZXIKLQotcHJpdmF0ZSBib29sZWFuIG1TbW9vdGhTY3JvbGxpbmdFbmFibGVkCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5SZWN0IG1UZW1wUmVjdAotCi1wcml2YXRlIGFuZHJvaWQudmlldy5WZWxvY2l0eVRyYWNrZXIgbVZlbG9jaXR5VHJhY2tlcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQKLWludCkKLQotcHJpdmF0ZSBib29sZWFuIGNhblNjcm9sbCgpCi0KLXByaXZhdGUgaW50IGNsYW1wKAotaW50Ci1pbnQKLWludCkKLQotcHJpdmF0ZSB2b2lkIGRvU2Nyb2xsWSgKLWludCkKLQotcHJpdmF0ZSBhbmRyb2lkLnZpZXcuVmlldyBmaW5kRm9jdXNhYmxlVmlld0luQm91bmRzKAotYm9vbGVhbgotaW50Ci1pbnQpCi0KLXByaXZhdGUgYW5kcm9pZC52aWV3LlZpZXcgZmluZEZvY3VzYWJsZVZpZXdJbk15Qm91bmRzKAotYm9vbGVhbgotaW50Ci1hbmRyb2lkLnZpZXcuVmlldykKLQotcHJpdmF0ZSB2b2lkIGluaXRTY3JvbGxWaWV3KCkKLQotcHJpdmF0ZSBib29sZWFuIGlzT2ZmU2NyZWVuKAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXByaXZhdGUgYm9vbGVhbiBpc1ZpZXdEZXNjZW5kYW50T2YoCi1hbmRyb2lkLnZpZXcuVmlldwotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXByaXZhdGUgYm9vbGVhbiBpc1dpdGhpbkRlbHRhT2ZTY3JlZW4oCi1hbmRyb2lkLnZpZXcuVmlldwotaW50KQotCi1wcml2YXRlIGJvb2xlYW4gc2Nyb2xsQW5kRm9jdXMoCi1pbnQKLWludAotaW50KQotCi1wcml2YXRlIHZvaWQgc2Nyb2xsVG9DaGlsZCgKLWFuZHJvaWQudmlldy5WaWV3KQotCi1wcml2YXRlIGJvb2xlYW4gc2Nyb2xsVG9DaGlsZFJlY3QoCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3QKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIGFkZFZpZXcoCi1hbmRyb2lkLnZpZXcuVmlldykKLQotcHVibGljIHZvaWQgYWRkVmlldygKLWFuZHJvaWQudmlldy5WaWV3Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIGFkZFZpZXcoCi1hbmRyb2lkLnZpZXcuVmlldwotaW50Ci1hbmRyb2lkLnZpZXcuVmlld0dyb3VwJExheW91dFBhcmFtcykKLQotcHVibGljIHZvaWQgYWRkVmlldygKLWFuZHJvaWQudmlldy5WaWV3Ci1hbmRyb2lkLnZpZXcuVmlld0dyb3VwJExheW91dFBhcmFtcykKLQotcHVibGljIGJvb2xlYW4gYXJyb3dTY3JvbGwoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGNvbXB1dGVTY3JvbGwoKQotCi1wcm90ZWN0ZWQgaW50IGNvbXB1dGVTY3JvbGxEZWx0YVRvR2V0Q2hpbGRSZWN0T25TY3JlZW4oCi1hbmRyb2lkLmdyYXBoaWNzLlJlY3QpCi0KLXByb3RlY3RlZCBpbnQgY29tcHV0ZVZlcnRpY2FsU2Nyb2xsUmFuZ2UoKQotCi1wdWJsaWMgYm9vbGVhbiBkaXNwYXRjaEtleUV2ZW50KAotYW5kcm9pZC52aWV3LktleUV2ZW50KQotCi1wdWJsaWMgYm9vbGVhbiBleGVjdXRlS2V5RXZlbnQoCi1hbmRyb2lkLnZpZXcuS2V5RXZlbnQpCi0KLXB1YmxpYyB2b2lkIGZsaW5nKAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBmdWxsU2Nyb2xsKAotaW50KQotCi1wcm90ZWN0ZWQgZmxvYXQgZ2V0Qm90dG9tRmFkaW5nRWRnZVN0cmVuZ3RoKCkKLQotcHVibGljIGludCBnZXRNYXhTY3JvbGxBbW91bnQoKQotCi1wcm90ZWN0ZWQgZmxvYXQgZ2V0VG9wRmFkaW5nRWRnZVN0cmVuZ3RoKCkKLQotcHVibGljIGJvb2xlYW4gaXNGaWxsVmlld3BvcnQoKQotCi1wdWJsaWMgYm9vbGVhbiBpc1Ntb290aFNjcm9sbGluZ0VuYWJsZWQoKQotCi1wcm90ZWN0ZWQgdm9pZCBtZWFzdXJlQ2hpbGQoCi1hbmRyb2lkLnZpZXcuVmlldwotaW50Ci1pbnQpCi0KLXByb3RlY3RlZCB2b2lkIG1lYXN1cmVDaGlsZFdpdGhNYXJnaW5zKAotYW5kcm9pZC52aWV3LlZpZXcKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIGJvb2xlYW4gb25JbnRlcmNlcHRUb3VjaEV2ZW50KAotYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50KQotCi1wcm90ZWN0ZWQgdm9pZCBvbkxheW91dCgKLWJvb2xlYW4KLWludAotaW50Ci1pbnQKLWludCkKLQotcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKAotaW50Ci1pbnQpCi0KLXByb3RlY3RlZCBib29sZWFuIG9uUmVxdWVzdEZvY3VzSW5EZXNjZW5kYW50cygKLWludAotYW5kcm9pZC5ncmFwaGljcy5SZWN0KQotCi1wdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnQoCi1hbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQpCi0KLXB1YmxpYyBib29sZWFuIHBhZ2VTY3JvbGwoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHJlcXVlc3RDaGlsZEZvY3VzKAotYW5kcm9pZC52aWV3LlZpZXcKLWFuZHJvaWQudmlldy5WaWV3KQotCi1wdWJsaWMgYm9vbGVhbiByZXF1ZXN0Q2hpbGRSZWN0YW5nbGVPblNjcmVlbigKLWFuZHJvaWQudmlldy5WaWV3Ci1hbmRyb2lkLmdyYXBoaWNzLlJlY3QKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHJlcXVlc3RMYXlvdXQoKQotCi1wdWJsaWMgdm9pZCBzY3JvbGxUbygKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRGaWxsVmlld3BvcnQoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRTbW9vdGhTY3JvbGxpbmdFbmFibGVkKAotYm9vbGVhbikKLQotcHVibGljIGZpbmFsIHZvaWQgc21vb3RoU2Nyb2xsQnkoCi1pbnQKLWludCkKLQotcHVibGljIGZpbmFsIHZvaWQgc21vb3RoU2Nyb2xsVG8oCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLndpZGdldC5TY3JvbGxlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfRFVSQVRJT04KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMSU5HX01PREUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNDUk9MTF9NT0RFCi0KLXByaXZhdGUgZmxvYXQgbUNvZWZmWAotCi1wcml2YXRlIGZsb2F0IG1Db2VmZlkKLQotcHJpdmF0ZSBpbnQgbUN1cnJYCi0KLXByaXZhdGUgaW50IG1DdXJyWQotCi1wcml2YXRlIGZpbmFsIGZsb2F0IG1EZWNlbGVyYXRpb24KLQotcHJpdmF0ZSBmbG9hdCBtRGVsdGFYCi0KLXByaXZhdGUgZmxvYXQgbURlbHRhWQotCi1wcml2YXRlIGludCBtRHVyYXRpb24KLQotcHJpdmF0ZSBmbG9hdCBtRHVyYXRpb25SZWNpcHJvY2FsCi0KLXByaXZhdGUgaW50IG1GaW5hbFgKLQotcHJpdmF0ZSBpbnQgbUZpbmFsWQotCi1wcml2YXRlIGJvb2xlYW4gbUZpbmlzaGVkCi0KLXByaXZhdGUgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3IgbUludGVycG9sYXRvcgotCi1wcml2YXRlIGludCBtTWF4WAotCi1wcml2YXRlIGludCBtTWF4WQotCi1wcml2YXRlIGludCBtTWluWAotCi1wcml2YXRlIGludCBtTWluWQotCi1wcml2YXRlIGludCBtTW9kZQotCi1wcml2YXRlIGxvbmcgbVN0YXJ0VGltZQotCi1wcml2YXRlIGludCBtU3RhcnRYCi0KLXByaXZhdGUgaW50IG1TdGFydFkKLQotcHJpdmF0ZSBmbG9hdCBtVmVsb2NpdHkKLQotcHJpdmF0ZSBmbG9hdCBtVmlzY291c0ZsdWlkTm9ybWFsaXplCi0KLXByaXZhdGUgZmxvYXQgbVZpc2NvdXNGbHVpZFNjYWxlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvcikKLQotcHJpdmF0ZSBmbG9hdCB2aXNjb3VzRmx1aWQoCi1mbG9hdCkKLQotcHVibGljIHZvaWQgYWJvcnRBbmltYXRpb24oKQotCi1wdWJsaWMgYm9vbGVhbiBjb21wdXRlU2Nyb2xsT2Zmc2V0KCkKLQotcHVibGljIHZvaWQgZXh0ZW5kRHVyYXRpb24oCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGZsaW5nKAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIGZvcmNlRmluaXNoZWQoCi1ib29sZWFuKQotCi1wdWJsaWMgZmluYWwgaW50IGdldEN1cnJYKCkKLQotcHVibGljIGZpbmFsIGludCBnZXRDdXJyWSgpCi0KLXB1YmxpYyBmaW5hbCBpbnQgZ2V0RHVyYXRpb24oKQotCi1wdWJsaWMgZmluYWwgaW50IGdldEZpbmFsWCgpCi0KLXB1YmxpYyBmaW5hbCBpbnQgZ2V0RmluYWxZKCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gaXNGaW5pc2hlZCgpCi0KLXB1YmxpYyB2b2lkIHNldEZpbmFsWCgKLWludCkKLQotcHVibGljIHZvaWQgc2V0RmluYWxZKAotaW50KQotCi1wdWJsaWMgdm9pZCBzdGFydFNjcm9sbCgKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgc3RhcnRTY3JvbGwoCi1pbnQKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIGludCB0aW1lUGFzc2VkKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9TZWVrQmFyJE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC53aWRnZXQuU2Vla0JhciBleHRlbmRzIGFuZHJvaWQud2lkZ2V0LkFic1NlZWtCYXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLndpZGdldC5TZWVrQmFyJE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyIG1PblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQKLWludCkKLQotIHZvaWQgb25Qcm9ncmVzc1JlZnJlc2goCi1mbG9hdAotYm9vbGVhbikKLQotIHZvaWQgb25TdGFydFRyYWNraW5nVG91Y2goKQotCi0gdm9pZCBvblN0b3BUcmFja2luZ1RvdWNoKCkKLQotcHVibGljIHZvaWQgc2V0T25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIoCi1hbmRyb2lkLndpZGdldC5TZWVrQmFyJE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9NDEwNCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9TaW1wbGVBZGFwdGVyOyApCi0gY2xhc3MgYW5kcm9pZC53aWRnZXQuU2ltcGxlQWRhcHRlciQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L1NpbXBsZUFkYXB0ZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MiBuYW1lID1TaW1wbGVGaWx0ZXIgKQotIGNsYXNzIGFuZHJvaWQud2lkZ2V0LlNpbXBsZUFkYXB0ZXIkU2ltcGxlRmlsdGVyIGV4dGVuZHMgYW5kcm9pZC53aWRnZXQuRmlsdGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQud2lkZ2V0LlNpbXBsZUFkYXB0ZXIgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQud2lkZ2V0LlNpbXBsZUFkYXB0ZXIpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQud2lkZ2V0LlNpbXBsZUFkYXB0ZXIKLWFuZHJvaWQud2lkZ2V0LlNpbXBsZUFkYXB0ZXIkMSkKLQotcHJvdGVjdGVkIGFuZHJvaWQud2lkZ2V0LkZpbHRlciRGaWx0ZXJSZXN1bHRzIHBlcmZvcm1GaWx0ZXJpbmcoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotCi1wcm90ZWN0ZWQgdm9pZCBwdWJsaXNoUmVzdWx0cygKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWFuZHJvaWQud2lkZ2V0LkZpbHRlciRGaWx0ZXJSZXN1bHRzKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9TaW1wbGVBZGFwdGVyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9Vmlld0JpbmRlciApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQud2lkZ2V0LlNpbXBsZUFkYXB0ZXIkVmlld0JpbmRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzZXRWaWV3VmFsdWUoCi1hbmRyb2lkLnZpZXcuVmlldwotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9TaW1wbGVBZGFwdGVyJDE7TGFuZHJvaWQvd2lkZ2V0L1NpbXBsZUFkYXB0ZXIkU2ltcGxlRmlsdGVyO0xhbmRyb2lkL3dpZGdldC9TaW1wbGVBZGFwdGVyJFZpZXdCaW5kZXI7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLndpZGdldC5TaW1wbGVBZGFwdGVyIGV4dGVuZHMgYW5kcm9pZC53aWRnZXQuQmFzZUFkYXB0ZXIgaW1wbGVtZW50cyBhbmRyb2lkLndpZGdldC5GaWx0ZXJhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9MaXN0PCtMamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZzsqPjs+OyApCi1wcml2YXRlIGphdmEudXRpbC5MaXN0IG1EYXRhCi0KLXByaXZhdGUgaW50IG1Ecm9wRG93blJlc291cmNlCi0KLXByaXZhdGUgYW5kcm9pZC53aWRnZXQuU2ltcGxlQWRhcHRlciRTaW1wbGVGaWx0ZXIgbUZpbHRlcgotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmdbXSBtRnJvbQotCi1wcml2YXRlIGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlciBtSW5mbGF0ZXIKLQotcHJpdmF0ZSBpbnQgbVJlc291cmNlCi0KLXByaXZhdGUgaW50W10gbVRvCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9BcnJheUxpc3Q8TGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7Kj47PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuQXJyYXlMaXN0IG1VbmZpbHRlcmVkRGF0YQotCi1wcml2YXRlIGFuZHJvaWQud2lkZ2V0LlNpbXBsZUFkYXB0ZXIkVmlld0JpbmRlciBtVmlld0JpbmRlcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExhbmRyb2lkL2NvbnRlbnQvQ29udGV4dDtMamF2YS91dGlsL0xpc3Q8K0xqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcvU3RyaW5nOyo+Oz47SVtMamF2YS9sYW5nL1N0cmluZztbSSlWICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1qYXZhLnV0aWwuTGlzdAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nW10KLWludFtdKQotCi1zdGF0aWMgamF2YS51dGlsLkFycmF5TGlzdCBhY2Nlc3MkMTAwKAotYW5kcm9pZC53aWRnZXQuU2ltcGxlQWRhcHRlcikKLQotc3RhdGljIGphdmEudXRpbC5BcnJheUxpc3QgYWNjZXNzJDEwMigKLWFuZHJvaWQud2lkZ2V0LlNpbXBsZUFkYXB0ZXIKLWphdmEudXRpbC5BcnJheUxpc3QpCi0KLXN0YXRpYyBqYXZhLnV0aWwuTGlzdCBhY2Nlc3MkMjAwKAotYW5kcm9pZC53aWRnZXQuU2ltcGxlQWRhcHRlcikKLQotc3RhdGljIGphdmEudXRpbC5MaXN0IGFjY2VzcyQyMDIoCi1hbmRyb2lkLndpZGdldC5TaW1wbGVBZGFwdGVyCi1qYXZhLnV0aWwuTGlzdCkKLQotc3RhdGljIGludFtdIGFjY2VzcyQzMDAoCi1hbmRyb2lkLndpZGdldC5TaW1wbGVBZGFwdGVyKQotCi1zdGF0aWMgamF2YS5sYW5nLlN0cmluZ1tdIGFjY2VzcyQ0MDAoCi1hbmRyb2lkLndpZGdldC5TaW1wbGVBZGFwdGVyKQotCi1wcml2YXRlIHZvaWQgYmluZFZpZXcoCi1pbnQKLWFuZHJvaWQudmlldy5WaWV3KQotCi1wcml2YXRlIGFuZHJvaWQudmlldy5WaWV3IGNyZWF0ZVZpZXdGcm9tUmVzb3VyY2UoCi1pbnQKLWFuZHJvaWQudmlldy5WaWV3Ci1hbmRyb2lkLnZpZXcuVmlld0dyb3VwCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0Q291bnQoKQotCi1wdWJsaWMgYW5kcm9pZC52aWV3LlZpZXcgZ2V0RHJvcERvd25WaWV3KAotaW50Ci1hbmRyb2lkLnZpZXcuVmlldwotYW5kcm9pZC52aWV3LlZpZXdHcm91cCkKLQotcHVibGljIGFuZHJvaWQud2lkZ2V0LkZpbHRlciBnZXRGaWx0ZXIoKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRJdGVtKAotaW50KQotCi1wdWJsaWMgbG9uZyBnZXRJdGVtSWQoCi1pbnQpCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuVmlldyBnZXRWaWV3KAotaW50Ci1hbmRyb2lkLnZpZXcuVmlldwotYW5kcm9pZC52aWV3LlZpZXdHcm91cCkKLQotcHVibGljIGFuZHJvaWQud2lkZ2V0LlNpbXBsZUFkYXB0ZXIkVmlld0JpbmRlciBnZXRWaWV3QmluZGVyKCkKLQotcHVibGljIHZvaWQgc2V0RHJvcERvd25WaWV3UmVzb3VyY2UoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldFZpZXdCaW5kZXIoCi1hbmRyb2lkLndpZGdldC5TaW1wbGVBZGFwdGVyJFZpZXdCaW5kZXIpCi0KLXB1YmxpYyB2b2lkIHNldFZpZXdJbWFnZSgKLWFuZHJvaWQud2lkZ2V0LkltYWdlVmlldwotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRWaWV3SW1hZ2UoCi1hbmRyb2lkLndpZGdldC5JbWFnZVZpZXcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHNldFZpZXdUZXh0KAotYW5kcm9pZC53aWRnZXQuVGV4dFZpZXcKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPUN1cnNvclRvU3RyaW5nQ29udmVydGVyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9TaW1wbGVDdXJzb3JBZGFwdGVyOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGFuZHJvaWQud2lkZ2V0LlNpbXBsZUN1cnNvckFkYXB0ZXIkQ3Vyc29yVG9TdHJpbmdDb252ZXJ0ZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5DaGFyU2VxdWVuY2UgY29udmVydFRvU3RyaW5nKAotYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L1NpbXBsZUN1cnNvckFkYXB0ZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1WaWV3QmluZGVyICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC53aWRnZXQuU2ltcGxlQ3Vyc29yQWRhcHRlciRWaWV3QmluZGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHNldFZpZXdWYWx1ZSgKLWFuZHJvaWQudmlldy5WaWV3Ci1hbmRyb2lkLmRhdGFiYXNlLkN1cnNvcgotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGFuZHJvaWQud2lkZ2V0LlNpbXBsZUN1cnNvclRyZWVBZGFwdGVyIGV4dGVuZHMgYW5kcm9pZC53aWRnZXQuUmVzb3VyY2VDdXJzb3JUcmVlQWRhcHRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGludFtdIG1DaGlsZEZyb20KLQotcHJpdmF0ZSBpbnRbXSBtQ2hpbGRUbwotCi1wcml2YXRlIGludFtdIG1Hcm91cEZyb20KLQotcHJpdmF0ZSBpbnRbXSBtR3JvdXBUbwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLmRhdGFiYXNlLkN1cnNvcgotaW50Ci1pbnQKLWphdmEubGFuZy5TdHJpbmdbXQotaW50W10KLWludAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nW10KLWludFtdKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IKLWludAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nW10KLWludFtdCi1pbnQKLWphdmEubGFuZy5TdHJpbmdbXQotaW50W10pCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLmRhdGFiYXNlLkN1cnNvcgotaW50Ci1qYXZhLmxhbmcuU3RyaW5nW10KLWludFtdCi1pbnQKLWphdmEubGFuZy5TdHJpbmdbXQotaW50W10pCi0KLXByaXZhdGUgdm9pZCBiaW5kVmlldygKLWFuZHJvaWQudmlldy5WaWV3Ci1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IKLWludFtdCi1pbnRbXSkKLQotcHJpdmF0ZSB2b2lkIGluaXQoCi1qYXZhLmxhbmcuU3RyaW5nW10KLWludFtdCi1qYXZhLmxhbmcuU3RyaW5nW10KLWludFtdKQotCi1wcml2YXRlIHZvaWQgaW5pdENoaWxkcmVuRnJvbUNvbHVtbnMoCi1qYXZhLmxhbmcuU3RyaW5nW10KLWFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yKQotCi1wcml2YXRlIHZvaWQgaW5pdEZyb21Db2x1bW5zKAotYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IKLWphdmEubGFuZy5TdHJpbmdbXQotaW50W10pCi0KLXByaXZhdGUgdm9pZCBpbml0R3JvdXBGcm9tQ29sdW1ucygKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotcHJvdGVjdGVkIHZvaWQgYmluZENoaWxkVmlldygKLWFuZHJvaWQudmlldy5WaWV3Ci1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IKLWJvb2xlYW4pCi0KLXByb3RlY3RlZCB2b2lkIGJpbmRHcm91cFZpZXcoCi1hbmRyb2lkLnZpZXcuVmlldwotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yCi1ib29sZWFuKQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRWaWV3SW1hZ2UoCi1hbmRyb2lkLndpZGdldC5JbWFnZVZpZXcKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC53aWRnZXQuU2ltcGxlRXhwYW5kYWJsZUxpc3RBZGFwdGVyIGV4dGVuZHMgYW5kcm9pZC53aWRnZXQuQmFzZUV4cGFuZGFibGVMaXN0QWRhcHRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvTGlzdDwrTGphdmEvdXRpbC9MaXN0PCtMamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZzsqPjs+Oz47ICkKLXByaXZhdGUgamF2YS51dGlsLkxpc3QgbUNoaWxkRGF0YQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmdbXSBtQ2hpbGRGcm9tCi0KLXByaXZhdGUgaW50IG1DaGlsZExheW91dAotCi1wcml2YXRlIGludFtdIG1DaGlsZFRvCi0KLXByaXZhdGUgaW50IG1Db2xsYXBzZWRHcm91cExheW91dAotCi1wcml2YXRlIGludCBtRXhwYW5kZWRHcm91cExheW91dAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvTGlzdDwrTGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7Kj47PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdCBtR3JvdXBEYXRhCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZ1tdIG1Hcm91cEZyb20KLQotcHJpdmF0ZSBpbnRbXSBtR3JvdXBUbwotCi1wcml2YXRlIGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlciBtSW5mbGF0ZXIKLQotcHJpdmF0ZSBpbnQgbUxhc3RDaGlsZExheW91dAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExhbmRyb2lkL2NvbnRlbnQvQ29udGV4dDtMamF2YS91dGlsL0xpc3Q8K0xqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcvU3RyaW5nOyo+Oz47SUlbTGphdmEvbGFuZy9TdHJpbmc7W0lMamF2YS91dGlsL0xpc3Q8K0xqYXZhL3V0aWwvTGlzdDwrTGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7Kj47Pjs+O0lJW0xqYXZhL2xhbmcvU3RyaW5nO1tJKVYgKQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWphdmEudXRpbC5MaXN0Ci1pbnQKLWludAotamF2YS5sYW5nLlN0cmluZ1tdCi1pbnRbXQotamF2YS51dGlsLkxpc3QKLWludAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nW10KLWludFtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMYW5kcm9pZC9jb250ZW50L0NvbnRleHQ7TGphdmEvdXRpbC9MaXN0PCtMamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZzsqPjs+O0lJW0xqYXZhL2xhbmcvU3RyaW5nO1tJTGphdmEvdXRpbC9MaXN0PCtMamF2YS91dGlsL0xpc3Q8K0xqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcvU3RyaW5nOyo+Oz47PjtJW0xqYXZhL2xhbmcvU3RyaW5nO1tJKVYgKQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWphdmEudXRpbC5MaXN0Ci1pbnQKLWludAotamF2YS5sYW5nLlN0cmluZ1tdCi1pbnRbXQotamF2YS51dGlsLkxpc3QKLWludAotamF2YS5sYW5nLlN0cmluZ1tdCi1pbnRbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGFuZHJvaWQvY29udGVudC9Db250ZXh0O0xqYXZhL3V0aWwvTGlzdDwrTGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7Kj47PjtJW0xqYXZhL2xhbmcvU3RyaW5nO1tJTGphdmEvdXRpbC9MaXN0PCtMamF2YS91dGlsL0xpc3Q8K0xqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcvU3RyaW5nOyo+Oz47PjtJW0xqYXZhL2xhbmcvU3RyaW5nO1tJKVYgKQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWphdmEudXRpbC5MaXN0Ci1pbnQKLWphdmEubGFuZy5TdHJpbmdbXQotaW50W10KLWphdmEudXRpbC5MaXN0Ci1pbnQKLWphdmEubGFuZy5TdHJpbmdbXQotaW50W10pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExhbmRyb2lkL3ZpZXcvVmlldztMamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZzsqPjtbTGphdmEvbGFuZy9TdHJpbmc7W0kpViApCi1wcml2YXRlIHZvaWQgYmluZFZpZXcoCi1hbmRyb2lkLnZpZXcuVmlldwotamF2YS51dGlsLk1hcAotamF2YS5sYW5nLlN0cmluZ1tdCi1pbnRbXSkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0Q2hpbGQoCi1pbnQKLWludCkKLQotcHVibGljIGxvbmcgZ2V0Q2hpbGRJZCgKLWludAotaW50KQotCi1wdWJsaWMgYW5kcm9pZC52aWV3LlZpZXcgZ2V0Q2hpbGRWaWV3KAotaW50Ci1pbnQKLWJvb2xlYW4KLWFuZHJvaWQudmlldy5WaWV3Ci1hbmRyb2lkLnZpZXcuVmlld0dyb3VwKQotCi1wdWJsaWMgaW50IGdldENoaWxkcmVuQ291bnQoCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldEdyb3VwKAotaW50KQotCi1wdWJsaWMgaW50IGdldEdyb3VwQ291bnQoKQotCi1wdWJsaWMgbG9uZyBnZXRHcm91cElkKAotaW50KQotCi1wdWJsaWMgYW5kcm9pZC52aWV3LlZpZXcgZ2V0R3JvdXBWaWV3KAotaW50Ci1ib29sZWFuCi1hbmRyb2lkLnZpZXcuVmlldwotYW5kcm9pZC52aWV3LlZpZXdHcm91cCkKLQotcHVibGljIGJvb2xlYW4gaGFzU3RhYmxlSWRzKCkKLQotcHVibGljIGJvb2xlYW4gaXNDaGlsZFNlbGVjdGFibGUoCi1pbnQKLWludCkKLQotcHVibGljIGFuZHJvaWQudmlldy5WaWV3IG5ld0NoaWxkVmlldygKLWJvb2xlYW4KLWFuZHJvaWQudmlldy5WaWV3R3JvdXApCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuVmlldyBuZXdHcm91cFZpZXcoCi1ib29sZWFuCi1hbmRyb2lkLnZpZXcuVmlld0dyb3VwKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9TcGlubmVyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPURyb3BEb3duQWRhcHRlciApCi0gY2xhc3MgYW5kcm9pZC53aWRnZXQuU3Bpbm5lciREcm9wRG93bkFkYXB0ZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC53aWRnZXQuTGlzdEFkYXB0ZXIsIGFuZHJvaWQud2lkZ2V0LlNwaW5uZXJBZGFwdGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYW5kcm9pZC53aWRnZXQuU3Bpbm5lckFkYXB0ZXIgbUFkYXB0ZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLndpZGdldC5TcGlubmVyQWRhcHRlcikKLQotcHVibGljIGJvb2xlYW4gYXJlQWxsSXRlbXNFbmFibGVkKCkKLQotcHVibGljIGludCBnZXRDb3VudCgpCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuVmlldyBnZXREcm9wRG93blZpZXcoCi1pbnQKLWFuZHJvaWQudmlldy5WaWV3Ci1hbmRyb2lkLnZpZXcuVmlld0dyb3VwKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRJdGVtKAotaW50KQotCi1wdWJsaWMgbG9uZyBnZXRJdGVtSWQoCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0SXRlbVZpZXdUeXBlKAotaW50KQotCi1wdWJsaWMgYW5kcm9pZC52aWV3LlZpZXcgZ2V0VmlldygKLWludAotYW5kcm9pZC52aWV3LlZpZXcKLWFuZHJvaWQudmlldy5WaWV3R3JvdXApCi0KLXB1YmxpYyBpbnQgZ2V0Vmlld1R5cGVDb3VudCgpCi0KLXB1YmxpYyBib29sZWFuIGhhc1N0YWJsZUlkcygpCi0KLXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKAotYW5kcm9pZC5kYXRhYmFzZS5EYXRhU2V0T2JzZXJ2ZXIpCi0KLXB1YmxpYyB2b2lkIHVucmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIoCi1hbmRyb2lkLmRhdGFiYXNlLkRhdGFTZXRPYnNlcnZlcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9TcGlubmVyJERyb3BEb3duQWRhcHRlcjsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQud2lkZ2V0LlNwaW5uZXIgZXh0ZW5kcyBhbmRyb2lkLndpZGdldC5BYnNTcGlubmVyIGltcGxlbWVudHMgYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZSRPbkNsaWNrTGlzdGVuZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIG1Qcm9tcHQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ci1pbnQpCi0KLXByaXZhdGUgYW5kcm9pZC52aWV3LlZpZXcgbWFrZUFuZEFkZFZpZXcoCi1pbnQpCi0KLXByaXZhdGUgdm9pZCBzZXRVcENoaWxkKAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXB1YmxpYyBpbnQgZ2V0QmFzZWxpbmUoKQotCi1wdWJsaWMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBnZXRQcm9tcHQoKQotCi0gdm9pZCBsYXlvdXQoCi1pbnQKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIG9uQ2xpY2soCi1hbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlCi1pbnQpCi0KLXByb3RlY3RlZCB2b2lkIG9uTGF5b3V0KAotYm9vbGVhbgotaW50Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBwZXJmb3JtQ2xpY2soKQotCi1wdWJsaWMgdm9pZCBzZXRPbkl0ZW1DbGlja0xpc3RlbmVyKAotYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXckT25JdGVtQ2xpY2tMaXN0ZW5lcikKLQotcHVibGljIHZvaWQgc2V0UHJvbXB0KAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotcHVibGljIHZvaWQgc2V0UHJvbXB0SWQoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotIGNsYXNzIGFuZHJvaWQud2lkZ2V0LlRhYkhvc3QkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnZpZXcuVmlldyRPbktleUxpc3RlbmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQud2lkZ2V0LlRhYkhvc3QgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53aWRnZXQuVGFiSG9zdCkKLQotcHVibGljIGJvb2xlYW4gb25LZXkoCi1hbmRyb2lkLnZpZXcuVmlldwotaW50Ci1hbmRyb2lkLnZpZXcuS2V5RXZlbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L1RhYldpZGdldDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ0IG5hbWUgPU9uVGFiU2VsZWN0aW9uQ2hhbmdlZCApCi1hYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC53aWRnZXQuVGFiV2lkZ2V0JE9uVGFiU2VsZWN0aW9uQ2hhbmdlZCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvblRhYlNlbGVjdGlvbkNoYW5nZWQoCi1pbnQKLWJvb2xlYW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotIGNsYXNzIGFuZHJvaWQud2lkZ2V0LlRhYkhvc3QkMiBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLndpZGdldC5UYWJXaWRnZXQkT25UYWJTZWxlY3Rpb25DaGFuZ2VkCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQud2lkZ2V0LlRhYkhvc3QgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53aWRnZXQuVGFiSG9zdCkKLQotcHVibGljIHZvaWQgb25UYWJTZWxlY3Rpb25DaGFuZ2VkKAotaW50Ci1ib29sZWFuKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9UYWJIb3N0OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDYgbmFtZSA9Q29udGVudFN0cmF0ZWd5ICkKLWFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLndpZGdldC5UYWJIb3N0JENvbnRlbnRTdHJhdGVneSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC52aWV3LlZpZXcgZ2V0Q29udGVudFZpZXcoKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB0YWJDbG9zZWQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MiBuYW1lID1GYWN0b3J5Q29udGVudFN0cmF0ZWd5ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9UYWJIb3N0OyApCi0gY2xhc3MgYW5kcm9pZC53aWRnZXQuVGFiSG9zdCRGYWN0b3J5Q29udGVudFN0cmF0ZWd5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQud2lkZ2V0LlRhYkhvc3QkQ29udGVudFN0cmF0ZWd5Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYW5kcm9pZC53aWRnZXQuVGFiSG9zdCRUYWJDb250ZW50RmFjdG9yeSBtRmFjdG9yeQotCi1wcml2YXRlIGFuZHJvaWQudmlldy5WaWV3IG1UYWJDb250ZW50Ci0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBtVGFnCi0KLWZpbmFsIGFuZHJvaWQud2lkZ2V0LlRhYkhvc3QgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53aWRnZXQuVGFiSG9zdAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotYW5kcm9pZC53aWRnZXQuVGFiSG9zdCRUYWJDb250ZW50RmFjdG9yeSkKLQotcHVibGljIGFuZHJvaWQudmlldy5WaWV3IGdldENvbnRlbnRWaWV3KCkKLQotcHVibGljIHZvaWQgdGFiQ2xvc2VkKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvVGFiSG9zdDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ2IG5hbWUgPUluZGljYXRvclN0cmF0ZWd5ICkKLWFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLndpZGdldC5UYWJIb3N0JEluZGljYXRvclN0cmF0ZWd5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLnZpZXcuVmlldyBjcmVhdGVJbmRpY2F0b3JWaWV3KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvVGFiSG9zdDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPUludGVudENvbnRlbnRTdHJhdGVneSApCi0gY2xhc3MgYW5kcm9pZC53aWRnZXQuVGFiSG9zdCRJbnRlbnRDb250ZW50U3RyYXRlZ3kgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC53aWRnZXQuVGFiSG9zdCRDb250ZW50U3RyYXRlZ3kKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50IG1JbnRlbnQKLQotcHJpdmF0ZSBhbmRyb2lkLnZpZXcuVmlldyBtTGF1bmNoZWRWaWV3Ci0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBtVGFnCi0KLWZpbmFsIGFuZHJvaWQud2lkZ2V0LlRhYkhvc3QgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQud2lkZ2V0LlRhYkhvc3QKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQuY29udGVudC5JbnRlbnQpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQud2lkZ2V0LlRhYkhvc3QKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQuY29udGVudC5JbnRlbnQKLWFuZHJvaWQud2lkZ2V0LlRhYkhvc3QkMSkKLQotcHVibGljIGFuZHJvaWQudmlldy5WaWV3IGdldENvbnRlbnRWaWV3KCkKLQotcHVibGljIHZvaWQgdGFiQ2xvc2VkKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTIgbmFtZSA9TGFiZWxBbmRJY29uSW5kaWNhdG9yU3RhdGVneSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvVGFiSG9zdDsgKQotIGNsYXNzIGFuZHJvaWQud2lkZ2V0LlRhYkhvc3QkTGFiZWxBbmRJY29uSW5kaWNhdG9yU3RhdGVneSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLndpZGdldC5UYWJIb3N0JEluZGljYXRvclN0cmF0ZWd5Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSBtSWNvbgotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgbUxhYmVsCi0KLWZpbmFsIGFuZHJvaWQud2lkZ2V0LlRhYkhvc3QgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQud2lkZ2V0LlRhYkhvc3QKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQud2lkZ2V0LlRhYkhvc3QKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUKLWFuZHJvaWQud2lkZ2V0LlRhYkhvc3QkMSkKLQotcHVibGljIGFuZHJvaWQudmlldy5WaWV3IGNyZWF0ZUluZGljYXRvclZpZXcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9UYWJIb3N0OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTIgbmFtZSA9TGFiZWxJbmRpY2F0b3JTdHJhdGVneSApCi0gY2xhc3MgYW5kcm9pZC53aWRnZXQuVGFiSG9zdCRMYWJlbEluZGljYXRvclN0cmF0ZWd5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQud2lkZ2V0LlRhYkhvc3QkSW5kaWNhdG9yU3RyYXRlZ3kKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIG1MYWJlbAotCi1maW5hbCBhbmRyb2lkLndpZGdldC5UYWJIb3N0IHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLndpZGdldC5UYWJIb3N0Ci1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLndpZGdldC5UYWJIb3N0Ci1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1hbmRyb2lkLndpZGdldC5UYWJIb3N0JDEpCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuVmlldyBjcmVhdGVJbmRpY2F0b3JWaWV3KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvVGFiSG9zdDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPU9uVGFiQ2hhbmdlTGlzdGVuZXIgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBhbmRyb2lkLndpZGdldC5UYWJIb3N0JE9uVGFiQ2hhbmdlTGlzdGVuZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgb25UYWJDaGFuZ2VkKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvVGFiSG9zdDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPVRhYkNvbnRlbnRGYWN0b3J5ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC53aWRnZXQuVGFiSG9zdCRUYWJDb250ZW50RmFjdG9yeSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC52aWV3LlZpZXcgY3JlYXRlVGFiQ29udGVudCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xIG5hbWUgPVRhYlNwZWMgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L1RhYkhvc3Q7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLndpZGdldC5UYWJIb3N0JFRhYlNwZWMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYW5kcm9pZC53aWRnZXQuVGFiSG9zdCRDb250ZW50U3RyYXRlZ3kgbUNvbnRlbnRTdHJhdGVneQotCi1wcml2YXRlIGFuZHJvaWQud2lkZ2V0LlRhYkhvc3QkSW5kaWNhdG9yU3RyYXRlZ3kgbUluZGljYXRvclN0cmF0ZWd5Ci0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtVGFnCi0KLWZpbmFsIGFuZHJvaWQud2lkZ2V0LlRhYkhvc3QgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQud2lkZ2V0LlRhYkhvc3QKLWphdmEubGFuZy5TdHJpbmcpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQud2lkZ2V0LlRhYkhvc3QKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQud2lkZ2V0LlRhYkhvc3QkMSkKLQotc3RhdGljIGFuZHJvaWQud2lkZ2V0LlRhYkhvc3QkSW5kaWNhdG9yU3RyYXRlZ3kgYWNjZXNzJDIwMCgKLWFuZHJvaWQud2lkZ2V0LlRhYkhvc3QkVGFiU3BlYykKLQotc3RhdGljIGFuZHJvaWQud2lkZ2V0LlRhYkhvc3QkQ29udGVudFN0cmF0ZWd5IGFjY2VzcyQzMDAoCi1hbmRyb2lkLndpZGdldC5UYWJIb3N0JFRhYlNwZWMpCi0KLSBqYXZhLmxhbmcuU3RyaW5nIGdldFRhZygpCi0KLXB1YmxpYyBhbmRyb2lkLndpZGdldC5UYWJIb3N0JFRhYlNwZWMgc2V0Q29udGVudCgKLWludCkKLQotcHVibGljIGFuZHJvaWQud2lkZ2V0LlRhYkhvc3QkVGFiU3BlYyBzZXRDb250ZW50KAotYW5kcm9pZC5jb250ZW50LkludGVudCkKLQotcHVibGljIGFuZHJvaWQud2lkZ2V0LlRhYkhvc3QkVGFiU3BlYyBzZXRDb250ZW50KAotYW5kcm9pZC53aWRnZXQuVGFiSG9zdCRUYWJDb250ZW50RmFjdG9yeSkKLQotcHVibGljIGFuZHJvaWQud2lkZ2V0LlRhYkhvc3QkVGFiU3BlYyBzZXRJbmRpY2F0b3IoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotCi1wdWJsaWMgYW5kcm9pZC53aWRnZXQuVGFiSG9zdCRUYWJTcGVjIHNldEluZGljYXRvcigKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L1RhYkhvc3Q7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MiBuYW1lID1WaWV3SWRDb250ZW50U3RyYXRlZ3kgKQotIGNsYXNzIGFuZHJvaWQud2lkZ2V0LlRhYkhvc3QkVmlld0lkQ29udGVudFN0cmF0ZWd5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQud2lkZ2V0LlRhYkhvc3QkQ29udGVudFN0cmF0ZWd5Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC52aWV3LlZpZXcgbVZpZXcKLQotZmluYWwgYW5kcm9pZC53aWRnZXQuVGFiSG9zdCB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53aWRnZXQuVGFiSG9zdAotaW50KQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLndpZGdldC5UYWJIb3N0Ci1pbnQKLWFuZHJvaWQud2lkZ2V0LlRhYkhvc3QkMSkKLQotcHVibGljIGFuZHJvaWQudmlldy5WaWV3IGdldENvbnRlbnRWaWV3KCkKLQotcHVibGljIHZvaWQgdGFiQ2xvc2VkKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9UYWJIb3N0JEludGVudENvbnRlbnRTdHJhdGVneTtMYW5kcm9pZC93aWRnZXQvVGFiSG9zdCRGYWN0b3J5Q29udGVudFN0cmF0ZWd5O0xhbmRyb2lkL3dpZGdldC9UYWJIb3N0JFZpZXdJZENvbnRlbnRTdHJhdGVneTtMYW5kcm9pZC93aWRnZXQvVGFiSG9zdCRMYWJlbEFuZEljb25JbmRpY2F0b3JTdGF0ZWd5O0xhbmRyb2lkL3dpZGdldC9UYWJIb3N0JExhYmVsSW5kaWNhdG9yU3RyYXRlZ3k7TGFuZHJvaWQvd2lkZ2V0L1RhYkhvc3QkQ29udGVudFN0cmF0ZWd5O0xhbmRyb2lkL3dpZGdldC9UYWJIb3N0JEluZGljYXRvclN0cmF0ZWd5O0xhbmRyb2lkL3dpZGdldC9UYWJIb3N0JFRhYlNwZWM7TGFuZHJvaWQvd2lkZ2V0L1RhYkhvc3QkVGFiQ29udGVudEZhY3Rvcnk7TGFuZHJvaWQvd2lkZ2V0L1RhYkhvc3QkT25UYWJDaGFuZ2VMaXN0ZW5lcjsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQud2lkZ2V0LlRhYkhvc3QgZXh0ZW5kcyBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dCBpbXBsZW1lbnRzIGFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyJE9uVG91Y2hNb2RlQ2hhbmdlTGlzdGVuZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIGludCBtQ3VycmVudFRhYgotCi1wcml2YXRlIGFuZHJvaWQudmlldy5WaWV3IG1DdXJyZW50VmlldwotCi1wcm90ZWN0ZWQgYW5kcm9pZC5hcHAuTG9jYWxBY3Rpdml0eU1hbmFnZXIgbUxvY2FsQWN0aXZpdHlNYW5hZ2VyCi0KLXByaXZhdGUgYW5kcm9pZC53aWRnZXQuVGFiSG9zdCRPblRhYkNoYW5nZUxpc3RlbmVyIG1PblRhYkNoYW5nZUxpc3RlbmVyCi0KLXByaXZhdGUgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQgbVRhYkNvbnRlbnQKLQotcHJpdmF0ZSBhbmRyb2lkLnZpZXcuVmlldyRPbktleUxpc3RlbmVyIG1UYWJLZXlMaXN0ZW5lcgotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC93aWRnZXQvVGFiSG9zdCRUYWJTcGVjOz47ICkKLXByaXZhdGUgamF2YS51dGlsLkxpc3QgbVRhYlNwZWNzCi0KLXByaXZhdGUgYW5kcm9pZC53aWRnZXQuVGFiV2lkZ2V0IG1UYWJXaWRnZXQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi0KLXN0YXRpYyBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dCBhY2Nlc3MkMTAwKAotYW5kcm9pZC53aWRnZXQuVGFiSG9zdCkKLQotc3RhdGljIGFuZHJvaWQud2lkZ2V0LlRhYldpZGdldCBhY2Nlc3MkODAwKAotYW5kcm9pZC53aWRnZXQuVGFiSG9zdCkKLQotcHJpdmF0ZSBmaW5hbCB2b2lkIGluaXRUYWJIb3N0KCkKLQotcHJpdmF0ZSB2b2lkIGludm9rZU9uVGFiQ2hhbmdlTGlzdGVuZXIoKQotCi1wdWJsaWMgdm9pZCBhZGRUYWIoCi1hbmRyb2lkLndpZGdldC5UYWJIb3N0JFRhYlNwZWMpCi0KLXB1YmxpYyB2b2lkIGNsZWFyQWxsVGFicygpCi0KLXB1YmxpYyBib29sZWFuIGRpc3BhdGNoS2V5RXZlbnQoCi1hbmRyb2lkLnZpZXcuS2V5RXZlbnQpCi0KLXB1YmxpYyB2b2lkIGRpc3BhdGNoV2luZG93Rm9jdXNDaGFuZ2VkKAotYm9vbGVhbikKLQotcHVibGljIGludCBnZXRDdXJyZW50VGFiKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Q3VycmVudFRhYlRhZygpCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuVmlldyBnZXRDdXJyZW50VGFiVmlldygpCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuVmlldyBnZXRDdXJyZW50VmlldygpCi0KLXB1YmxpYyBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dCBnZXRUYWJDb250ZW50VmlldygpCi0KLXB1YmxpYyBhbmRyb2lkLndpZGdldC5UYWJXaWRnZXQgZ2V0VGFiV2lkZ2V0KCkKLQotcHVibGljIGFuZHJvaWQud2lkZ2V0LlRhYkhvc3QkVGFiU3BlYyBuZXdUYWJTcGVjKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJvdGVjdGVkIHZvaWQgb25BdHRhY2hlZFRvV2luZG93KCkKLQotcHJvdGVjdGVkIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3coKQotCi1wdWJsaWMgdm9pZCBvblRvdWNoTW9kZUNoYW5nZWQoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRDdXJyZW50VGFiKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRDdXJyZW50VGFiQnlUYWcoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRPblRhYkNoYW5nZWRMaXN0ZW5lcigKLWFuZHJvaWQud2lkZ2V0LlRhYkhvc3QkT25UYWJDaGFuZ2VMaXN0ZW5lcikKLQotcHVibGljIHZvaWQgc2V0dXAoKQotCi1wdWJsaWMgdm9pZCBzZXR1cCgKLWFuZHJvaWQuYXBwLkxvY2FsQWN0aXZpdHlNYW5hZ2VyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9NDEwNCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9UYWJXaWRnZXQ7ICkKLSBjbGFzcyBhbmRyb2lkLndpZGdldC5UYWJXaWRnZXQkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9UYWJXaWRnZXQ7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MiBuYW1lID1UYWJDbGlja0xpc3RlbmVyICkKLSBjbGFzcyBhbmRyb2lkLndpZGdldC5UYWJXaWRnZXQkVGFiQ2xpY2tMaXN0ZW5lciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnZpZXcuVmlldyRPbkNsaWNrTGlzdGVuZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBpbnQgbVRhYkluZGV4Ci0KLWZpbmFsIGFuZHJvaWQud2lkZ2V0LlRhYldpZGdldCB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53aWRnZXQuVGFiV2lkZ2V0Ci1pbnQpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQud2lkZ2V0LlRhYldpZGdldAotaW50Ci1hbmRyb2lkLndpZGdldC5UYWJXaWRnZXQkMSkKLQotcHVibGljIHZvaWQgb25DbGljaygKLWFuZHJvaWQudmlldy5WaWV3KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L1RhYldpZGdldCQxO0xhbmRyb2lkL3dpZGdldC9UYWJXaWRnZXQkT25UYWJTZWxlY3Rpb25DaGFuZ2VkO0xhbmRyb2lkL3dpZGdldC9UYWJXaWRnZXQkVGFiQ2xpY2tMaXN0ZW5lcjsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQud2lkZ2V0LlRhYldpZGdldCBleHRlbmRzIGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dCBpbXBsZW1lbnRzIGFuZHJvaWQudmlldy5WaWV3JE9uRm9jdXNDaGFuZ2VMaXN0ZW5lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgbUJvdHRvbUxlZnRTdHJpcAotCi1wcml2YXRlIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgbUJvdHRvbVJpZ2h0U3RyaXAKLQotcHJpdmF0ZSBpbnQgbVNlbGVjdGVkVGFiCi0KLXByaXZhdGUgYW5kcm9pZC53aWRnZXQuVGFiV2lkZ2V0JE9uVGFiU2VsZWN0aW9uQ2hhbmdlZCBtU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyCi0KLXByaXZhdGUgYm9vbGVhbiBtU3RyaXBNb3ZlZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQKLWludCkKLQotc3RhdGljIGFuZHJvaWQud2lkZ2V0LlRhYldpZGdldCRPblRhYlNlbGVjdGlvbkNoYW5nZWQgYWNjZXNzJDEwMCgKLWFuZHJvaWQud2lkZ2V0LlRhYldpZGdldCkKLQotcHJpdmF0ZSB2b2lkIGluaXRUYWJXaWRnZXQoKQotCi1wdWJsaWMgdm9pZCBhZGRWaWV3KAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXB1YmxpYyB2b2lkIGNoaWxkRHJhd2FibGVTdGF0ZUNoYW5nZWQoCi1hbmRyb2lkLnZpZXcuVmlldykKLQotcHVibGljIHZvaWQgZGlzcGF0Y2hEcmF3KAotYW5kcm9pZC5ncmFwaGljcy5DYW52YXMpCi0KLXB1YmxpYyB2b2lkIGZvY3VzQ3VycmVudFRhYigKLWludCkKLQotcHVibGljIHZvaWQgb25Gb2N1c0NoYW5nZSgKLWFuZHJvaWQudmlldy5WaWV3Ci1ib29sZWFuKQotCi1wcm90ZWN0ZWQgdm9pZCBvblNpemVDaGFuZ2VkKAotaW50Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRDdXJyZW50VGFiKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRFbmFibGVkKAotYm9vbGVhbikKLQotIHZvaWQgc2V0VGFiU2VsZWN0aW9uTGlzdGVuZXIoCi1hbmRyb2lkLndpZGdldC5UYWJXaWRnZXQkT25UYWJTZWxlY3Rpb25DaGFuZ2VkKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9NDEwNCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9UYWJsZUxheW91dDsgKQotIGNsYXNzIGFuZHJvaWQud2lkZ2V0LlRhYmxlTGF5b3V0JDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9TGF5b3V0UGFyYW1zICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9UYWJsZUxheW91dDsgKQotcHVibGljIGNsYXNzIGFuZHJvaWQud2lkZ2V0LlRhYmxlTGF5b3V0JExheW91dFBhcmFtcyBleHRlbmRzIGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dCRMYXlvdXRQYXJhbXMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50Ci1pbnQKLWZsb2F0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC52aWV3LlZpZXdHcm91cCRMYXlvdXRQYXJhbXMpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQudmlldy5WaWV3R3JvdXAkTWFyZ2luTGF5b3V0UGFyYW1zKQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRCYXNlQXR0cmlidXRlcygKLWFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheQotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPVBhc3NUaHJvdWdoSGllcmFyY2h5Q2hhbmdlTGlzdGVuZXIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L1RhYmxlTGF5b3V0OyApCi0gY2xhc3MgYW5kcm9pZC53aWRnZXQuVGFibGVMYXlvdXQkUGFzc1Rocm91Z2hIaWVyYXJjaHlDaGFuZ2VMaXN0ZW5lciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnZpZXcuVmlld0dyb3VwJE9uSGllcmFyY2h5Q2hhbmdlTGlzdGVuZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLnZpZXcuVmlld0dyb3VwJE9uSGllcmFyY2h5Q2hhbmdlTGlzdGVuZXIgbU9uSGllcmFyY2h5Q2hhbmdlTGlzdGVuZXIKLQotZmluYWwgYW5kcm9pZC53aWRnZXQuVGFibGVMYXlvdXQgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQud2lkZ2V0LlRhYmxlTGF5b3V0KQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLndpZGdldC5UYWJsZUxheW91dAotYW5kcm9pZC53aWRnZXQuVGFibGVMYXlvdXQkMSkKLQotc3RhdGljIGFuZHJvaWQudmlldy5WaWV3R3JvdXAkT25IaWVyYXJjaHlDaGFuZ2VMaXN0ZW5lciBhY2Nlc3MkMTAyKAotYW5kcm9pZC53aWRnZXQuVGFibGVMYXlvdXQkUGFzc1Rocm91Z2hIaWVyYXJjaHlDaGFuZ2VMaXN0ZW5lcgotYW5kcm9pZC52aWV3LlZpZXdHcm91cCRPbkhpZXJhcmNoeUNoYW5nZUxpc3RlbmVyKQotCi1wdWJsaWMgdm9pZCBvbkNoaWxkVmlld0FkZGVkKAotYW5kcm9pZC52aWV3LlZpZXcKLWFuZHJvaWQudmlldy5WaWV3KQotCi1wdWJsaWMgdm9pZCBvbkNoaWxkVmlld1JlbW92ZWQoCi1hbmRyb2lkLnZpZXcuVmlldwotYW5kcm9pZC52aWV3LlZpZXcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvVGFibGVMYXlvdXQkMTtMYW5kcm9pZC93aWRnZXQvVGFibGVMYXlvdXQkUGFzc1Rocm91Z2hIaWVyYXJjaHlDaGFuZ2VMaXN0ZW5lcjtMYW5kcm9pZC93aWRnZXQvVGFibGVMYXlvdXQkTGF5b3V0UGFyYW1zOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC53aWRnZXQuVGFibGVMYXlvdXQgZXh0ZW5kcyBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLnV0aWwuU3BhcnNlQm9vbGVhbkFycmF5IG1Db2xsYXBzZWRDb2x1bW5zCi0KLXByaXZhdGUgYm9vbGVhbiBtSW5pdGlhbGl6ZWQKLQotcHJpdmF0ZSBpbnRbXSBtTWF4V2lkdGhzCi0KLXByaXZhdGUgYW5kcm9pZC53aWRnZXQuVGFibGVMYXlvdXQkUGFzc1Rocm91Z2hIaWVyYXJjaHlDaGFuZ2VMaXN0ZW5lciBtUGFzc1Rocm91Z2hMaXN0ZW5lcgotCi1wcml2YXRlIGJvb2xlYW4gbVNocmlua0FsbENvbHVtbnMKLQotcHJpdmF0ZSBhbmRyb2lkLnV0aWwuU3BhcnNlQm9vbGVhbkFycmF5IG1TaHJpbmthYmxlQ29sdW1ucwotCi1wcml2YXRlIGJvb2xlYW4gbVN0cmV0Y2hBbGxDb2x1bW5zCi0KLXByaXZhdGUgYW5kcm9pZC51dGlsLlNwYXJzZUJvb2xlYW5BcnJheSBtU3RyZXRjaGFibGVDb2x1bW5zCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0KQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMjAwKAotYW5kcm9pZC53aWRnZXQuVGFibGVMYXlvdXQKLWFuZHJvaWQudmlldy5WaWV3KQotCi1wcml2YXRlIHZvaWQgZmluZExhcmdlc3RDZWxscygKLWludCkKLQotcHJpdmF0ZSB2b2lkIGluaXRUYWJsZUxheW91dCgpCi0KLXByaXZhdGUgdm9pZCBtdXRhdGVDb2x1bW5zV2lkdGgoCi1hbmRyb2lkLnV0aWwuU3BhcnNlQm9vbGVhbkFycmF5Ci1ib29sZWFuCi1pbnQKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgYW5kcm9pZC51dGlsLlNwYXJzZUJvb2xlYW5BcnJheSBwYXJzZUNvbHVtbnMoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHZvaWQgcmVxdWVzdFJvd3NMYXlvdXQoKQotCi1wcml2YXRlIHZvaWQgc2hyaW5rQW5kU3RyZXRjaENvbHVtbnMoCi1pbnQpCi0KLXByaXZhdGUgdm9pZCB0cmFja0NvbGxhcHNlZENvbHVtbnMoCi1hbmRyb2lkLnZpZXcuVmlldykKLQotcHVibGljIHZvaWQgYWRkVmlldygKLWFuZHJvaWQudmlldy5WaWV3KQotCi1wdWJsaWMgdm9pZCBhZGRWaWV3KAotYW5kcm9pZC52aWV3LlZpZXcKLWludCkKLQotcHVibGljIHZvaWQgYWRkVmlldygKLWFuZHJvaWQudmlldy5WaWV3Ci1pbnQKLWFuZHJvaWQudmlldy5WaWV3R3JvdXAkTGF5b3V0UGFyYW1zKQotCi1wdWJsaWMgdm9pZCBhZGRWaWV3KAotYW5kcm9pZC52aWV3LlZpZXcKLWFuZHJvaWQudmlldy5WaWV3R3JvdXAkTGF5b3V0UGFyYW1zKQotCi1wcm90ZWN0ZWQgYm9vbGVhbiBjaGVja0xheW91dFBhcmFtcygKLWFuZHJvaWQudmlldy5WaWV3R3JvdXAkTGF5b3V0UGFyYW1zKQotCi1wcm90ZWN0ZWQgdm9sYXRpbGUgYW5kcm9pZC52aWV3LlZpZXdHcm91cCRMYXlvdXRQYXJhbXMgZ2VuZXJhdGVEZWZhdWx0TGF5b3V0UGFyYW1zKCkKLQotcHJvdGVjdGVkIGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dCRMYXlvdXRQYXJhbXMgZ2VuZXJhdGVEZWZhdWx0TGF5b3V0UGFyYW1zKCkKLQotcHVibGljIHZvbGF0aWxlIGFuZHJvaWQudmlldy5WaWV3R3JvdXAkTGF5b3V0UGFyYW1zIGdlbmVyYXRlTGF5b3V0UGFyYW1zKAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHJvdGVjdGVkIHZvbGF0aWxlIGFuZHJvaWQudmlldy5WaWV3R3JvdXAkTGF5b3V0UGFyYW1zIGdlbmVyYXRlTGF5b3V0UGFyYW1zKAotYW5kcm9pZC52aWV3LlZpZXdHcm91cCRMYXlvdXRQYXJhbXMpCi0KLXB1YmxpYyB2b2xhdGlsZSBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQkTGF5b3V0UGFyYW1zIGdlbmVyYXRlTGF5b3V0UGFyYW1zKAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHJvdGVjdGVkIGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dCRMYXlvdXRQYXJhbXMgZ2VuZXJhdGVMYXlvdXRQYXJhbXMoCi1hbmRyb2lkLnZpZXcuVmlld0dyb3VwJExheW91dFBhcmFtcykKLQotcHVibGljIGFuZHJvaWQud2lkZ2V0LlRhYmxlTGF5b3V0JExheW91dFBhcmFtcyBnZW5lcmF0ZUxheW91dFBhcmFtcygKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi0KLXB1YmxpYyBib29sZWFuIGlzQ29sdW1uQ29sbGFwc2VkKAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBpc0NvbHVtblNocmlua2FibGUoCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIGlzQ29sdW1uU3RyZXRjaGFibGUoCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIGlzU2hyaW5rQWxsQ29sdW1ucygpCi0KLXB1YmxpYyBib29sZWFuIGlzU3RyZXRjaEFsbENvbHVtbnMoKQotCi0gdm9pZCBtZWFzdXJlQ2hpbGRCZWZvcmVMYXlvdXQoCi1hbmRyb2lkLnZpZXcuVmlldwotaW50Ci1pbnQKLWludAotaW50Ci1pbnQpCi0KLSB2b2lkIG1lYXN1cmVWZXJ0aWNhbCgKLWludAotaW50KQotCi1wcm90ZWN0ZWQgdm9pZCBvbkxheW91dCgKLWJvb2xlYW4KLWludAotaW50Ci1pbnQKLWludCkKLQotcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIHJlcXVlc3RMYXlvdXQoKQotCi1wdWJsaWMgdm9pZCBzZXRDb2x1bW5Db2xsYXBzZWQoCi1pbnQKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldENvbHVtblNocmlua2FibGUoCi1pbnQKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldENvbHVtblN0cmV0Y2hhYmxlKAotaW50Ci1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRPbkhpZXJhcmNoeUNoYW5nZUxpc3RlbmVyKAotYW5kcm9pZC52aWV3LlZpZXdHcm91cCRPbkhpZXJhcmNoeUNoYW5nZUxpc3RlbmVyKQotCi1wdWJsaWMgdm9pZCBzZXRTaHJpbmtBbGxDb2x1bW5zKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0U3RyZXRjaEFsbENvbHVtbnMoCi1ib29sZWFuKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9NDEwNCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9UYWJsZVJvdzsgKQotIGNsYXNzIGFuZHJvaWQud2lkZ2V0LlRhYmxlUm93JDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvVGFibGVSb3c7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MiBuYW1lID1DaGlsZHJlblRyYWNrZXIgKQotIGNsYXNzIGFuZHJvaWQud2lkZ2V0LlRhYmxlUm93JENoaWxkcmVuVHJhY2tlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnZpZXcuVmlld0dyb3VwJE9uSGllcmFyY2h5Q2hhbmdlTGlzdGVuZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLnZpZXcuVmlld0dyb3VwJE9uSGllcmFyY2h5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIKLQotZmluYWwgYW5kcm9pZC53aWRnZXQuVGFibGVSb3cgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQud2lkZ2V0LlRhYmxlUm93KQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLndpZGdldC5UYWJsZVJvdwotYW5kcm9pZC53aWRnZXQuVGFibGVSb3ckMSkKLQotc3RhdGljIHZvaWQgYWNjZXNzJDEwMCgKLWFuZHJvaWQud2lkZ2V0LlRhYmxlUm93JENoaWxkcmVuVHJhY2tlcgotYW5kcm9pZC52aWV3LlZpZXdHcm91cCRPbkhpZXJhcmNoeUNoYW5nZUxpc3RlbmVyKQotCi1wcml2YXRlIHZvaWQgc2V0T25IaWVyYXJjaHlDaGFuZ2VMaXN0ZW5lcigKLWFuZHJvaWQudmlldy5WaWV3R3JvdXAkT25IaWVyYXJjaHlDaGFuZ2VMaXN0ZW5lcikKLQotcHVibGljIHZvaWQgb25DaGlsZFZpZXdBZGRlZCgKLWFuZHJvaWQudmlldy5WaWV3Ci1hbmRyb2lkLnZpZXcuVmlldykKLQotcHVibGljIHZvaWQgb25DaGlsZFZpZXdSZW1vdmVkKAotYW5kcm9pZC52aWV3LlZpZXcKLWFuZHJvaWQudmlldy5WaWV3KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9UYWJsZVJvdzsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPUxheW91dFBhcmFtcyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC53aWRnZXQuVGFibGVSb3ckTGF5b3V0UGFyYW1zIGV4dGVuZHMgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0JExheW91dFBhcmFtcwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTE9DQVRJT04KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExPQ0FUSU9OX05FWFQKLUBhbmRyb2lkLnZpZXcuVmlld0RlYnVnJEV4cG9ydGVkUHJvcGVydHkKLXB1YmxpYyBpbnQgY29sdW1uCi0KLXByaXZhdGUgaW50W10gbU9mZnNldAotQGFuZHJvaWQudmlldy5WaWV3RGVidWckRXhwb3J0ZWRQcm9wZXJ0eQotcHVibGljIGludCBzcGFuCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50Ci1pbnQKLWZsb2F0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC52aWV3LlZpZXdHcm91cCRMYXlvdXRQYXJhbXMpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQudmlldy5WaWV3R3JvdXAkTWFyZ2luTGF5b3V0UGFyYW1zKQotCi1zdGF0aWMgaW50W10gYWNjZXNzJDIwMCgKLWFuZHJvaWQud2lkZ2V0LlRhYmxlUm93JExheW91dFBhcmFtcykKLQotcHJvdGVjdGVkIHZvaWQgc2V0QmFzZUF0dHJpYnV0ZXMoCi1hbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXkKLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L1RhYmxlUm93JDE7TGFuZHJvaWQvd2lkZ2V0L1RhYmxlUm93JENoaWxkcmVuVHJhY2tlcjtMYW5kcm9pZC93aWRnZXQvVGFibGVSb3ckTGF5b3V0UGFyYW1zOyApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC53aWRnZXQuVGFibGVSb3cgZXh0ZW5kcyBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLndpZGdldC5UYWJsZVJvdyRDaGlsZHJlblRyYWNrZXIgbUNoaWxkcmVuVHJhY2tlcgotCi1wcml2YXRlIGFuZHJvaWQudXRpbC5TcGFyc2VJbnRBcnJheSBtQ29sdW1uVG9DaGlsZEluZGV4Ci0KLXByaXZhdGUgaW50W10gbUNvbHVtbldpZHRocwotCi1wcml2YXRlIGludFtdIG1Db25zdHJhaW5lZENvbHVtbldpZHRocwotCi1wcml2YXRlIGludCBtTnVtQ29sdW1ucwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotc3RhdGljIGFuZHJvaWQudXRpbC5TcGFyc2VJbnRBcnJheSBhY2Nlc3MkMzAyKAotYW5kcm9pZC53aWRnZXQuVGFibGVSb3cKLWFuZHJvaWQudXRpbC5TcGFyc2VJbnRBcnJheSkKLQotcHJpdmF0ZSB2b2lkIGluaXRUYWJsZVJvdygpCi0KLXByaXZhdGUgdm9pZCBtYXBJbmRleEFuZENvbHVtbnMoKQotCi1wcm90ZWN0ZWQgYm9vbGVhbiBjaGVja0xheW91dFBhcmFtcygKLWFuZHJvaWQudmlldy5WaWV3R3JvdXAkTGF5b3V0UGFyYW1zKQotCi1wcm90ZWN0ZWQgdm9sYXRpbGUgYW5kcm9pZC52aWV3LlZpZXdHcm91cCRMYXlvdXRQYXJhbXMgZ2VuZXJhdGVEZWZhdWx0TGF5b3V0UGFyYW1zKCkKLQotcHJvdGVjdGVkIGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dCRMYXlvdXRQYXJhbXMgZ2VuZXJhdGVEZWZhdWx0TGF5b3V0UGFyYW1zKCkKLQotcHVibGljIHZvbGF0aWxlIGFuZHJvaWQudmlldy5WaWV3R3JvdXAkTGF5b3V0UGFyYW1zIGdlbmVyYXRlTGF5b3V0UGFyYW1zKAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHJvdGVjdGVkIHZvbGF0aWxlIGFuZHJvaWQudmlldy5WaWV3R3JvdXAkTGF5b3V0UGFyYW1zIGdlbmVyYXRlTGF5b3V0UGFyYW1zKAotYW5kcm9pZC52aWV3LlZpZXdHcm91cCRMYXlvdXRQYXJhbXMpCi0KLXB1YmxpYyB2b2xhdGlsZSBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQkTGF5b3V0UGFyYW1zIGdlbmVyYXRlTGF5b3V0UGFyYW1zKAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHJvdGVjdGVkIGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dCRMYXlvdXRQYXJhbXMgZ2VuZXJhdGVMYXlvdXRQYXJhbXMoCi1hbmRyb2lkLnZpZXcuVmlld0dyb3VwJExheW91dFBhcmFtcykKLQotcHVibGljIGFuZHJvaWQud2lkZ2V0LlRhYmxlUm93JExheW91dFBhcmFtcyBnZW5lcmF0ZUxheW91dFBhcmFtcygKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi0KLSBpbnQgZ2V0Q2hpbGRyZW5Ta2lwQ291bnQoCi1hbmRyb2lkLnZpZXcuVmlldwotaW50KQotCi0gaW50W10gZ2V0Q29sdW1uc1dpZHRocygKLWludCkKLQotIGludCBnZXRMb2NhdGlvbk9mZnNldCgKLWFuZHJvaWQudmlldy5WaWV3KQotCi0gaW50IGdldE5leHRMb2NhdGlvbk9mZnNldCgKLWFuZHJvaWQudmlldy5WaWV3KQotCi1wdWJsaWMgYW5kcm9pZC52aWV3LlZpZXcgZ2V0VmlydHVhbENoaWxkQXQoCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0VmlydHVhbENoaWxkQ291bnQoKQotCi0gdm9pZCBtZWFzdXJlQ2hpbGRCZWZvcmVMYXlvdXQoCi1hbmRyb2lkLnZpZXcuVmlldwotaW50Ci1pbnQKLWludAotaW50Ci1pbnQpCi0KLSBpbnQgbWVhc3VyZU51bGxDaGlsZCgKLWludCkKLQotcHJvdGVjdGVkIHZvaWQgb25MYXlvdXQoCi1ib29sZWFuCi1pbnQKLWludAotaW50Ci1pbnQpCi0KLXByb3RlY3RlZCB2b2lkIG9uTWVhc3VyZSgKLWludAotaW50KQotCi0gdm9pZCBzZXRDb2x1bW5Db2xsYXBzZWQoCi1pbnQKLWJvb2xlYW4pCi0KLSB2b2lkIHNldENvbHVtbnNXaWR0aENvbnN0cmFpbnRzKAotaW50W10pCi0KLXB1YmxpYyB2b2lkIHNldE9uSGllcmFyY2h5Q2hhbmdlTGlzdGVuZXIoCi1hbmRyb2lkLnZpZXcuVmlld0dyb3VwJE9uSGllcmFyY2h5Q2hhbmdlTGlzdGVuZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC53aWRnZXQuVGV4dFN3aXRjaGVyIGV4dGVuZHMgYW5kcm9pZC53aWRnZXQuVmlld1N3aXRjaGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0KQotCi1wdWJsaWMgdm9pZCBhZGRWaWV3KAotYW5kcm9pZC52aWV3LlZpZXcKLWludAotYW5kcm9pZC52aWV3LlZpZXdHcm91cCRMYXlvdXRQYXJhbXMpCi0KLXB1YmxpYyB2b2lkIHNldEN1cnJlbnRUZXh0KAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotcHVibGljIHZvaWQgc2V0VGV4dCgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L1RleHRWaWV3OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTQxMDQgbmFtZSA9bnVsbCApCi0gY2xhc3MgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXckMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIGludFtdICRTd2l0Y2hNYXAkYW5kcm9pZCR0ZXh0JExheW91dCRBbGlnbm1lbnQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L1RleHRWaWV3OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPUJsaW5rICkKLSBjbGFzcyBhbmRyb2lkLndpZGdldC5UZXh0VmlldyRCbGluayBleHRlbmRzIGFuZHJvaWQub3MuSGFuZGxlciBpbXBsZW1lbnRzIGphdmEubGFuZy5SdW5uYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGJvb2xlYW4gbUNhbmNlbGxlZAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvcmVmL1dlYWtSZWZlcmVuY2U8TGFuZHJvaWQvd2lkZ2V0L1RleHRWaWV3Oz47ICkKLXByaXZhdGUgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlIG1WaWV3Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53aWRnZXQuVGV4dFZpZXcpCi0KLSB2b2lkIGNhbmNlbCgpCi0KLXB1YmxpYyB2b2lkIHJ1bigpCi0KLSB2b2lkIHVuY2FuY2VsKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9FbnVtPExhbmRyb2lkL3dpZGdldC9UZXh0VmlldyRCdWZmZXJUeXBlOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTY0MDkgbmFtZSA9QnVmZmVyVHlwZSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvVGV4dFZpZXc7ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBhbmRyb2lkLndpZGdldC5UZXh0VmlldyRCdWZmZXJUeXBlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXckQnVmZmVyVHlwZVtdICRWQUxVRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndpZGdldC5UZXh0VmlldyRCdWZmZXJUeXBlIEVESVRBQkxFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXckQnVmZmVyVHlwZSBOT1JNQUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndpZGdldC5UZXh0VmlldyRCdWZmZXJUeXBlIFNQQU5OQUJMRQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVYgKQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLndpZGdldC5UZXh0VmlldyRCdWZmZXJUeXBlIHZhbHVlT2YoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3JEJ1ZmZlclR5cGVbXSB2YWx1ZXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9UZXh0VmlldzsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPUNoYW5nZVdhdGNoZXIgKQotIGNsYXNzIGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3JENoYW5nZVdhdGNoZXIgZXh0ZW5kcyBhbmRyb2lkLm9zLkhhbmRsZXIgaW1wbGVtZW50cyBhbmRyb2lkLnRleHQuVGV4dFdhdGNoZXIsIGFuZHJvaWQudGV4dC5TcGFuV2F0Y2hlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLndpZGdldC5UZXh0VmlldyB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53aWRnZXQuVGV4dFZpZXcpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQud2lkZ2V0LlRleHRWaWV3Ci1hbmRyb2lkLndpZGdldC5UZXh0VmlldyQxKQotCi1wcml2YXRlIHZvaWQgc3BhbkNoYW5nZSgKLWFuZHJvaWQudGV4dC5TcGFubmVkCi1qYXZhLmxhbmcuT2JqZWN0Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgYWZ0ZXJUZXh0Q2hhbmdlZCgKLWFuZHJvaWQudGV4dC5FZGl0YWJsZSkKLQotcHVibGljIHZvaWQgYmVmb3JlVGV4dENoYW5nZWQoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBvblNwYW5BZGRlZCgKLWFuZHJvaWQudGV4dC5TcGFubmFibGUKLWphdmEubGFuZy5PYmplY3QKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBvblNwYW5DaGFuZ2VkKAotYW5kcm9pZC50ZXh0LlNwYW5uYWJsZQotamF2YS5sYW5nLk9iamVjdAotaW50Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBvblNwYW5SZW1vdmVkKAotYW5kcm9pZC50ZXh0LlNwYW5uYWJsZQotamF2YS5sYW5nLk9iamVjdAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIG9uVGV4dENoYW5nZWQoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9Q2hhcldyYXBwZXIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L1RleHRWaWV3OyApCi0gY2xhc3MgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXckQ2hhcldyYXBwZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSwgYW5kcm9pZC50ZXh0LkdldENoYXJzLCBhbmRyb2lkLnRleHQuR3JhcGhpY3NPcGVyYXRpb25zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgY2hhcltdIG1DaGFycwotCi1wcml2YXRlIGludCBtTGVuZ3RoCi0KLXByaXZhdGUgaW50IG1TdGFydAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWNoYXJbXQotaW50Ci1pbnQpCi0KLXN0YXRpYyBjaGFyW10gYWNjZXNzJDEwMigKLWFuZHJvaWQud2lkZ2V0LlRleHRWaWV3JENoYXJXcmFwcGVyCi1jaGFyW10pCi0KLXB1YmxpYyBjaGFyIGNoYXJBdCgKLWludCkKLQotcHVibGljIHZvaWQgZHJhd1RleHQoCi1hbmRyb2lkLmdyYXBoaWNzLkNhbnZhcwotaW50Ci1pbnQKLWZsb2F0Ci1mbG9hdAotYW5kcm9pZC5ncmFwaGljcy5QYWludCkKLQotcHVibGljIHZvaWQgZ2V0Q2hhcnMoCi1pbnQKLWludAotY2hhcltdCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0VGV4dFdpZHRocygKLWludAotaW50Ci1mbG9hdFtdCi1hbmRyb2lkLmdyYXBoaWNzLlBhaW50KQotCi1wdWJsaWMgaW50IGxlbmd0aCgpCi0KLXB1YmxpYyBmbG9hdCBtZWFzdXJlVGV4dCgKLWludAotaW50Ci1hbmRyb2lkLmdyYXBoaWNzLlBhaW50KQotCi0gdm9pZCBzZXQoCi1jaGFyW10KLWludAotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBzdWJTZXF1ZW5jZSgKLWludAotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPU1lbnVIYW5kbGVyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9UZXh0VmlldzsgKQotIGNsYXNzIGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3JE1lbnVIYW5kbGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQudmlldy5NZW51SXRlbSRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLndpZGdldC5UZXh0VmlldyB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53aWRnZXQuVGV4dFZpZXcpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQud2lkZ2V0LlRleHRWaWV3Ci1hbmRyb2lkLndpZGdldC5UZXh0VmlldyQxKQotCi1wdWJsaWMgYm9vbGVhbiBvbk1lbnVJdGVtQ2xpY2soCi1hbmRyb2lkLnZpZXcuTWVudUl0ZW0pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMYW5kcm9pZC93aWRnZXQvVGV4dFZpZXckU2F2ZWRTdGF0ZTs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvVGV4dFZpZXckU2F2ZWRTdGF0ZTsgKQotZmluYWwgY2xhc3MgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXckU2F2ZWRTdGF0ZSQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3JFNhdmVkU3RhdGUgY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyBhbmRyb2lkLndpZGdldC5UZXh0VmlldyRTYXZlZFN0YXRlW10gbmV3QXJyYXkoCi1pbnQpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0W10gbmV3QXJyYXkoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L1RleHRWaWV3OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9U2F2ZWRTdGF0ZSApCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXckU2F2ZWRTdGF0ZSBleHRlbmRzIGFuZHJvaWQudmlldy5WaWV3JEJhc2VTYXZlZFN0YXRlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExhbmRyb2lkL3dpZGdldC9UZXh0VmlldyRTYXZlZFN0YXRlOz47ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IgQ1JFQVRPUgotCi0gYm9vbGVhbiBmcm96ZW5XaXRoRm9jdXMKLQotIGludCBzZWxFbmQKLQotIGludCBzZWxTdGFydAotCi0gamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSB0ZXh0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuUGFyY2VsCi1hbmRyb2lkLndpZGdldC5UZXh0VmlldyQxKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLlBhcmNlbGFibGUpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L1RpbWVQaWNrZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLWZpbmFsIGNsYXNzIGFuZHJvaWQud2lkZ2V0LlRpbWVQaWNrZXIkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLndpZGdldC5UaW1lUGlja2VyJE9uVGltZUNoYW5nZWRMaXN0ZW5lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIG9uVGltZUNoYW5nZWQoCi1hbmRyb2lkLndpZGdldC5UaW1lUGlja2VyCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi0gY2xhc3MgYW5kcm9pZC53aWRnZXQuVGltZVBpY2tlciQyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5OdW1iZXJQaWNrZXIkT25DaGFuZ2VkTGlzdGVuZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC53aWRnZXQuVGltZVBpY2tlciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLndpZGdldC5UaW1lUGlja2VyKQotCi1wdWJsaWMgdm9pZCBvbkNoYW5nZWQoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTnVtYmVyUGlja2VyCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi0gY2xhc3MgYW5kcm9pZC53aWRnZXQuVGltZVBpY2tlciQzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5OdW1iZXJQaWNrZXIkT25DaGFuZ2VkTGlzdGVuZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC53aWRnZXQuVGltZVBpY2tlciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLndpZGdldC5UaW1lUGlja2VyKQotCi1wdWJsaWMgdm9pZCBvbkNoYW5nZWQoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTnVtYmVyUGlja2VyCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi0gY2xhc3MgYW5kcm9pZC53aWRnZXQuVGltZVBpY2tlciQ0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQudmlldy5WaWV3JE9uQ2xpY2tMaXN0ZW5lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLndpZGdldC5UaW1lUGlja2VyIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQud2lkZ2V0LlRpbWVQaWNrZXIpCi0KLXB1YmxpYyB2b2lkIG9uQ2xpY2soCi1hbmRyb2lkLnZpZXcuVmlldykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvVGltZVBpY2tlciRTYXZlZFN0YXRlOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExhbmRyb2lkL3dpZGdldC9UaW1lUGlja2VyJFNhdmVkU3RhdGU7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotZmluYWwgY2xhc3MgYW5kcm9pZC53aWRnZXQuVGltZVBpY2tlciRTYXZlZFN0YXRlJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgYW5kcm9pZC53aWRnZXQuVGltZVBpY2tlciRTYXZlZFN0YXRlIGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgYW5kcm9pZC53aWRnZXQuVGltZVBpY2tlciRTYXZlZFN0YXRlW10gbmV3QXJyYXkoCi1pbnQpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0W10gbmV3QXJyYXkoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1TYXZlZFN0YXRlICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9UaW1lUGlja2VyOyApCi0gY2xhc3MgYW5kcm9pZC53aWRnZXQuVGltZVBpY2tlciRTYXZlZFN0YXRlIGV4dGVuZHMgYW5kcm9pZC52aWV3LlZpZXckQmFzZVNhdmVkU3RhdGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I8TGFuZHJvaWQvd2lkZ2V0L1RpbWVQaWNrZXIkU2F2ZWRTdGF0ZTs+OyApCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yIENSRUFUT1IKLQotcHJpdmF0ZSBmaW5hbCBpbnQgbUhvdXIKLQotcHJpdmF0ZSBmaW5hbCBpbnQgbU1pbnV0ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuUGFyY2VsKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLlBhcmNlbAotYW5kcm9pZC53aWRnZXQuVGltZVBpY2tlciQxKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5QYXJjZWxhYmxlCi1pbnQKLWludCkKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5QYXJjZWxhYmxlCi1pbnQKLWludAotYW5kcm9pZC53aWRnZXQuVGltZVBpY2tlciQxKQotCi1wdWJsaWMgaW50IGdldEhvdXIoKQotCi1wdWJsaWMgaW50IGdldE1pbnV0ZSgpCi0KLXB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L1RpbWVQaWNrZXIkU2F2ZWRTdGF0ZTtMYW5kcm9pZC93aWRnZXQvVGltZVBpY2tlciRPblRpbWVDaGFuZ2VkTGlzdGVuZXI7ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLndpZGdldC5UaW1lUGlja2VyIGV4dGVuZHMgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYW5kcm9pZC53aWRnZXQuVGltZVBpY2tlciRPblRpbWVDaGFuZ2VkTGlzdGVuZXIgTk9fT1BfQ0hBTkdFX0xJU1RFTkVSCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC53aWRnZXQuQnV0dG9uIG1BbVBtQnV0dG9uCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBtQW1UZXh0Ci0KLXByaXZhdGUgaW50IG1DdXJyZW50SG91cgotCi1wcml2YXRlIGludCBtQ3VycmVudE1pbnV0ZQotCi1wcml2YXRlIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5OdW1iZXJQaWNrZXIgbUhvdXJQaWNrZXIKLQotcHJpdmF0ZSBqYXZhLmxhbmcuQm9vbGVhbiBtSXMyNEhvdXJWaWV3Ci0KLXByaXZhdGUgYm9vbGVhbiBtSXNBbQotCi1wcml2YXRlIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5OdW1iZXJQaWNrZXIgbU1pbnV0ZVBpY2tlcgotCi1wcml2YXRlIGFuZHJvaWQud2lkZ2V0LlRpbWVQaWNrZXIkT25UaW1lQ2hhbmdlZExpc3RlbmVyIG1PblRpbWVDaGFuZ2VkTGlzdGVuZXIKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIG1QbVRleHQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQKLWludCkKLQotc3RhdGljIGludCBhY2Nlc3MkMDAwKAotYW5kcm9pZC53aWRnZXQuVGltZVBpY2tlcikKLQotc3RhdGljIGludCBhY2Nlc3MkMDAyKAotYW5kcm9pZC53aWRnZXQuVGltZVBpY2tlcgotaW50KQotCi1zdGF0aWMgaW50IGFjY2VzcyQwMTIoCi1hbmRyb2lkLndpZGdldC5UaW1lUGlja2VyCi1pbnQpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDAyMCgKLWFuZHJvaWQud2lkZ2V0LlRpbWVQaWNrZXIKLWludCkKLQotc3RhdGljIGphdmEubGFuZy5Cb29sZWFuIGFjY2VzcyQxMDAoCi1hbmRyb2lkLndpZGdldC5UaW1lUGlja2VyKQotCi1zdGF0aWMgYm9vbGVhbiBhY2Nlc3MkMjAwKAotYW5kcm9pZC53aWRnZXQuVGltZVBpY2tlcikKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDIwMigKLWFuZHJvaWQud2lkZ2V0LlRpbWVQaWNrZXIKLWJvb2xlYW4pCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQzMDAoCi1hbmRyb2lkLndpZGdldC5UaW1lUGlja2VyKQotCi1zdGF0aWMgaW50IGFjY2VzcyQ0MDIoCi1hbmRyb2lkLndpZGdldC5UaW1lUGlja2VyCi1pbnQpCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGFjY2VzcyQ1MDAoCi1hbmRyb2lkLndpZGdldC5UaW1lUGlja2VyKQotCi1zdGF0aWMgamF2YS5sYW5nLlN0cmluZyBhY2Nlc3MkNjAwKAotYW5kcm9pZC53aWRnZXQuVGltZVBpY2tlcikKLQotc3RhdGljIGFuZHJvaWQud2lkZ2V0LkJ1dHRvbiBhY2Nlc3MkNzAwKAotYW5kcm9pZC53aWRnZXQuVGltZVBpY2tlcikKLQotcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZVBpY2tlclJhbmdlcygpCi0KLXByaXZhdGUgdm9pZCBvblRpbWVDaGFuZ2VkKCkKLQotcHJpdmF0ZSB2b2lkIHVwZGF0ZUhvdXJEaXNwbGF5KCkKLQotcHJpdmF0ZSB2b2lkIHVwZGF0ZU1pbnV0ZURpc3BsYXkoKQotCi1wdWJsaWMgaW50IGdldEJhc2VsaW5lKCkKLQotcHVibGljIGphdmEubGFuZy5JbnRlZ2VyIGdldEN1cnJlbnRIb3VyKCkKLQotcHVibGljIGphdmEubGFuZy5JbnRlZ2VyIGdldEN1cnJlbnRNaW51dGUoKQotCi1wdWJsaWMgYm9vbGVhbiBpczI0SG91clZpZXcoKQotCi1wcm90ZWN0ZWQgdm9pZCBvblJlc3RvcmVJbnN0YW5jZVN0YXRlKAotYW5kcm9pZC5vcy5QYXJjZWxhYmxlKQotCi1wcm90ZWN0ZWQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlIG9uU2F2ZUluc3RhbmNlU3RhdGUoKQotCi1wdWJsaWMgdm9pZCBzZXRDdXJyZW50SG91cigKLWphdmEubGFuZy5JbnRlZ2VyKQotCi1wdWJsaWMgdm9pZCBzZXRDdXJyZW50TWludXRlKAotamF2YS5sYW5nLkludGVnZXIpCi0KLXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRJczI0SG91clZpZXcoCi1qYXZhLmxhbmcuQm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0T25UaW1lQ2hhbmdlZExpc3RlbmVyKAotYW5kcm9pZC53aWRnZXQuVGltZVBpY2tlciRPblRpbWVDaGFuZ2VkTGlzdGVuZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L1RvYXN0JFROOyApCi0gY2xhc3MgYW5kcm9pZC53aWRnZXQuVG9hc3QkVE4kMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmxhbmcuUnVubmFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC53aWRnZXQuVG9hc3QkVE4gdGhpcyQxCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53aWRnZXQuVG9hc3QkVE4pCi0KLXB1YmxpYyB2b2lkIHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L1RvYXN0JFROOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi0gY2xhc3MgYW5kcm9pZC53aWRnZXQuVG9hc3QkVE4kMiBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmxhbmcuUnVubmFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC53aWRnZXQuVG9hc3QkVE4gdGhpcyQxCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53aWRnZXQuVG9hc3QkVE4pCi0KLXB1YmxpYyB2b2lkIHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L1RvYXN0OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTIgbmFtZSA9VE4gKQotIGNsYXNzIGFuZHJvaWQud2lkZ2V0LlRvYXN0JFROIGV4dGVuZHMgYW5kcm9pZC5hcHAuSVRyYW5zaWVudE5vdGlmaWNhdGlvbiRTdHViCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBqYXZhLmxhbmcuUnVubmFibGUgbUhpZGUKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlciRMYXlvdXRQYXJhbXMgbVBhcmFtcwotCi0gamF2YS5sYW5nLlJ1bm5hYmxlIG1TaG93Ci0KLSBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlckltcGwgbVdNCi0KLWZpbmFsIGFuZHJvaWQud2lkZ2V0LlRvYXN0IHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQud2lkZ2V0LlRvYXN0Ci1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotcHVibGljIHZvaWQgaGFuZGxlSGlkZSgpCi0KLXB1YmxpYyB2b2lkIGhhbmRsZVNob3coKQotCi1wdWJsaWMgdm9pZCBoaWRlKCkKLQotcHVibGljIHZvaWQgc2hvdygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvVG9hc3QkVE47ICkKLXB1YmxpYyBjbGFzcyBhbmRyb2lkLndpZGdldC5Ub2FzdCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVOR1RIX0xPTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVOR1RIX1NIT1JUCi0KLXN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRBRwotCi1zdGF0aWMgZmluYWwgYm9vbGVhbiBsb2NhbExPR1YKLQotcHJpdmF0ZSBzdGF0aWMgYW5kcm9pZC5hcHAuSU5vdGlmaWNhdGlvbk1hbmFnZXIgc1NlcnZpY2UKLQotZmluYWwgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgbUNvbnRleHQKLQotIGludCBtRHVyYXRpb24KLQotIGludCBtR3Jhdml0eQotCi1maW5hbCBhbmRyb2lkLm9zLkhhbmRsZXIgbUhhbmRsZXIKLQotIGZsb2F0IG1Ib3Jpem9udGFsTWFyZ2luCi0KLSBhbmRyb2lkLnZpZXcuVmlldyBtTmV4dFZpZXcKLQotZmluYWwgYW5kcm9pZC53aWRnZXQuVG9hc3QkVE4gbVROCi0KLSBmbG9hdCBtVmVydGljYWxNYXJnaW4KLQotIGFuZHJvaWQudmlldy5WaWV3IG1WaWV3Ci0KLSBpbnQgbVgKLQotIGludCBtWQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLmFwcC5JTm90aWZpY2F0aW9uTWFuYWdlciBnZXRTZXJ2aWNlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9jb250ZW50L3Jlcy9SZXNvdXJjZXMkTm90Rm91bmRFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC53aWRnZXQuVG9hc3QgbWFrZVRleHQoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotaW50Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC53aWRnZXQuVG9hc3QgbWFrZVRleHQoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotaW50KQotCi1wdWJsaWMgdm9pZCBjYW5jZWwoKQotCi1wdWJsaWMgaW50IGdldER1cmF0aW9uKCkKLQotcHVibGljIGludCBnZXRHcmF2aXR5KCkKLQotcHVibGljIGZsb2F0IGdldEhvcml6b250YWxNYXJnaW4oKQotCi1wdWJsaWMgZmxvYXQgZ2V0VmVydGljYWxNYXJnaW4oKQotCi1wdWJsaWMgYW5kcm9pZC52aWV3LlZpZXcgZ2V0VmlldygpCi0KLXB1YmxpYyBpbnQgZ2V0WE9mZnNldCgpCi0KLXB1YmxpYyBpbnQgZ2V0WU9mZnNldCgpCi0KLXB1YmxpYyB2b2lkIHNldER1cmF0aW9uKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRHcmF2aXR5KAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgc2V0TWFyZ2luKAotZmxvYXQKLWZsb2F0KQotCi1wdWJsaWMgdm9pZCBzZXRUZXh0KAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRUZXh0KAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotcHVibGljIHZvaWQgc2V0VmlldygKLWFuZHJvaWQudmlldy5WaWV3KQotCi1wdWJsaWMgdm9pZCBzaG93KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLndpZGdldC5Ub2dnbGVCdXR0b24gZXh0ZW5kcyBhbmRyb2lkLndpZGdldC5Db21wb3VuZEJ1dHRvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9fQUxQSEEKLQotcHJpdmF0ZSBmbG9hdCBtRGlzYWJsZWRBbHBoYQotCi1wcml2YXRlIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgbUluZGljYXRvckRyYXdhYmxlCi0KLXByaXZhdGUgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBtVGV4dE9mZgotCi1wcml2YXRlIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgbVRleHRPbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQKLWludCkKLQotcHJpdmF0ZSB2b2lkIHN5bmNUZXh0U3RhdGUoKQotCi1wcml2YXRlIHZvaWQgdXBkYXRlUmVmZXJlbmNlVG9JbmRpY2F0b3JEcmF3YWJsZSgKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUpCi0KLXByb3RlY3RlZCB2b2lkIGRyYXdhYmxlU3RhdGVDaGFuZ2VkKCkKLQotcHVibGljIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgZ2V0VGV4dE9mZigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIGdldFRleHRPbigpCi0KLXByb3RlY3RlZCB2b2lkIG9uRmluaXNoSW5mbGF0ZSgpCi0KLXB1YmxpYyB2b2lkIHNldEJhY2tncm91bmREcmF3YWJsZSgKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUpCi0KLXB1YmxpYyB2b2lkIHNldENoZWNrZWQoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRUZXh0T2ZmKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotcHVibGljIHZvaWQgc2V0VGV4dE9uKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLndpZGdldC5Ud29MaW5lTGlzdEl0ZW0gZXh0ZW5kcyBhbmRyb2lkLndpZGdldC5SZWxhdGl2ZUxheW91dAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3IG1UZXh0MQotCi1wcml2YXRlIGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3IG1UZXh0MgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQKLWludCkKLQotcHVibGljIGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3IGdldFRleHQxKCkKLQotcHVibGljIGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3IGdldFRleHQyKCkKLQotcHJvdGVjdGVkIHZvaWQgb25GaW5pc2hJbmZsYXRlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvVmlkZW9WaWV3OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi0gY2xhc3MgYW5kcm9pZC53aWRnZXQuVmlkZW9WaWV3JDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllciRPblByZXBhcmVkTGlzdGVuZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC53aWRnZXQuVmlkZW9WaWV3IHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQud2lkZ2V0LlZpZGVvVmlldykKLQotcHVibGljIHZvaWQgb25QcmVwYXJlZCgKLWFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L1ZpZGVvVmlldzsgKQotIGNsYXNzIGFuZHJvaWQud2lkZ2V0LlZpZGVvVmlldyQyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIkT25Db21wbGV0aW9uTGlzdGVuZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC53aWRnZXQuVmlkZW9WaWV3IHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQud2lkZ2V0LlZpZGVvVmlldykKLQotcHVibGljIHZvaWQgb25Db21wbGV0aW9uKAotYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi0gY2xhc3MgYW5kcm9pZC53aWRnZXQuVmlkZW9WaWV3JDMkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlJE9uQ2xpY2tMaXN0ZW5lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLndpZGdldC5WaWRlb1ZpZXckMyB0aGlzJDEKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLndpZGdldC5WaWRlb1ZpZXckMykKLQotcHVibGljIHZvaWQgb25DbGljaygKLWFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MYW5kcm9pZC93aWRnZXQvVmlkZW9WaWV3OyApCi0gY2xhc3MgYW5kcm9pZC53aWRnZXQuVmlkZW9WaWV3JDMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllciRPbkVycm9yTGlzdGVuZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC53aWRnZXQuVmlkZW9WaWV3IHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQud2lkZ2V0LlZpZGVvVmlldykKLQotcHVibGljIGJvb2xlYW4gb25FcnJvcigKLWFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIKLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9WaWRlb1ZpZXc7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLSBjbGFzcyBhbmRyb2lkLndpZGdldC5WaWRlb1ZpZXckNCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyJE9uQnVmZmVyaW5nVXBkYXRlTGlzdGVuZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC53aWRnZXQuVmlkZW9WaWV3IHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQud2lkZ2V0LlZpZGVvVmlldykKLQotcHVibGljIHZvaWQgb25CdWZmZXJpbmdVcGRhdGUoCi1hbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L1ZpZGVvVmlldzsgKQotIGNsYXNzIGFuZHJvaWQud2lkZ2V0LlZpZGVvVmlldyQ1IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyJENhbGxiYWNrCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQud2lkZ2V0LlZpZGVvVmlldyB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLndpZGdldC5WaWRlb1ZpZXcpCi0KLXB1YmxpYyB2b2lkIHN1cmZhY2VDaGFuZ2VkKAotYW5kcm9pZC52aWV3LlN1cmZhY2VIb2xkZXIKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIHN1cmZhY2VDcmVhdGVkKAotYW5kcm9pZC52aWV3LlN1cmZhY2VIb2xkZXIpCi0KLXB1YmxpYyB2b2lkIHN1cmZhY2VEZXN0cm95ZWQoCi1hbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBhbmRyb2lkLndpZGdldC5WaWRlb1ZpZXcgZXh0ZW5kcyBhbmRyb2lkLnZpZXcuU3VyZmFjZVZpZXcgaW1wbGVtZW50cyBhbmRyb2lkLndpZGdldC5NZWRpYUNvbnRyb2xsZXIkTWVkaWFQbGF5ZXJDb250cm9sCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllciRPbkJ1ZmZlcmluZ1VwZGF0ZUxpc3RlbmVyIG1CdWZmZXJpbmdVcGRhdGVMaXN0ZW5lcgotCi1wcml2YXRlIGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIkT25Db21wbGV0aW9uTGlzdGVuZXIgbUNvbXBsZXRpb25MaXN0ZW5lcgotCi1wcml2YXRlIGludCBtQ3VycmVudEJ1ZmZlclBlcmNlbnRhZ2UKLQotcHJpdmF0ZSBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyJE9uRXJyb3JMaXN0ZW5lciBtRXJyb3JMaXN0ZW5lcgotCi1wcml2YXRlIGJvb2xlYW4gbUlzUHJlcGFyZWQKLQotcHJpdmF0ZSBhbmRyb2lkLndpZGdldC5NZWRpYUNvbnRyb2xsZXIgbU1lZGlhQ29udHJvbGxlcgotCi1wcml2YXRlIGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIgbU1lZGlhUGxheWVyCi0KLXByaXZhdGUgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllciRPbkNvbXBsZXRpb25MaXN0ZW5lciBtT25Db21wbGV0aW9uTGlzdGVuZXIKLQotcHJpdmF0ZSBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyJE9uRXJyb3JMaXN0ZW5lciBtT25FcnJvckxpc3RlbmVyCi0KLXByaXZhdGUgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllciRPblByZXBhcmVkTGlzdGVuZXIgbU9uUHJlcGFyZWRMaXN0ZW5lcgotCi0gYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllciRPblByZXBhcmVkTGlzdGVuZXIgbVByZXBhcmVkTGlzdGVuZXIKLQotIGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyJENhbGxiYWNrIG1TSENhbGxiYWNrCi0KLXByaXZhdGUgaW50IG1TZWVrV2hlblByZXBhcmVkCi0KLXByaXZhdGUgYm9vbGVhbiBtU3RhcnRXaGVuUHJlcGFyZWQKLQotcHJpdmF0ZSBpbnQgbVN1cmZhY2VIZWlnaHQKLQotcHJpdmF0ZSBhbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlciBtU3VyZmFjZUhvbGRlcgotCi1wcml2YXRlIGludCBtU3VyZmFjZVdpZHRoCi0KLXByaXZhdGUgYW5kcm9pZC5uZXQuVXJpIG1VcmkKLQotcHJpdmF0ZSBpbnQgbVZpZGVvSGVpZ2h0Ci0KLXByaXZhdGUgaW50IG1WaWRlb1dpZHRoCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldAotaW50KQotCi1zdGF0aWMgYm9vbGVhbiBhY2Nlc3MkMDAwKAotYW5kcm9pZC53aWRnZXQuVmlkZW9WaWV3KQotCi1zdGF0aWMgYm9vbGVhbiBhY2Nlc3MkMDAyKAotYW5kcm9pZC53aWRnZXQuVmlkZW9WaWV3Ci1ib29sZWFuKQotCi1zdGF0aWMgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllciRPblByZXBhcmVkTGlzdGVuZXIgYWNjZXNzJDEwMCgKLWFuZHJvaWQud2lkZ2V0LlZpZGVvVmlldykKLQotc3RhdGljIGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIkT25Db21wbGV0aW9uTGlzdGVuZXIgYWNjZXNzJDEwMDAoCi1hbmRyb2lkLndpZGdldC5WaWRlb1ZpZXcpCi0KLXN0YXRpYyBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyJE9uRXJyb3JMaXN0ZW5lciBhY2Nlc3MkMTEwMCgKLWFuZHJvaWQud2lkZ2V0LlZpZGVvVmlldykKLQotc3RhdGljIGFuZHJvaWQuY29udGVudC5Db250ZXh0IGFjY2VzcyQxMjAwKAotYW5kcm9pZC53aWRnZXQuVmlkZW9WaWV3KQotCi1zdGF0aWMgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgYWNjZXNzJDEzMDAoCi1hbmRyb2lkLndpZGdldC5WaWRlb1ZpZXcpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDE0MDIoCi1hbmRyb2lkLndpZGdldC5WaWRlb1ZpZXcKLWludCkKLQotc3RhdGljIGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyIGFjY2VzcyQxNTAyKAotYW5kcm9pZC53aWRnZXQuVmlkZW9WaWV3Ci1hbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlcikKLQotc3RhdGljIHZvaWQgYWNjZXNzJDE2MDAoCi1hbmRyb2lkLndpZGdldC5WaWRlb1ZpZXcpCi0KLXN0YXRpYyBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyIGFjY2VzcyQyMDAoCi1hbmRyb2lkLndpZGdldC5WaWRlb1ZpZXcpCi0KLXN0YXRpYyBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyIGFjY2VzcyQyMDIoCi1hbmRyb2lkLndpZGdldC5WaWRlb1ZpZXcKLWFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIpCi0KLXN0YXRpYyBhbmRyb2lkLndpZGdldC5NZWRpYUNvbnRyb2xsZXIgYWNjZXNzJDMwMCgKLWFuZHJvaWQud2lkZ2V0LlZpZGVvVmlldykKLQotc3RhdGljIGludCBhY2Nlc3MkNDAwKAotYW5kcm9pZC53aWRnZXQuVmlkZW9WaWV3KQotCi1zdGF0aWMgaW50IGFjY2VzcyQ0MDIoCi1hbmRyb2lkLndpZGdldC5WaWRlb1ZpZXcKLWludCkKLQotc3RhdGljIGludCBhY2Nlc3MkNTAwKAotYW5kcm9pZC53aWRnZXQuVmlkZW9WaWV3KQotCi1zdGF0aWMgaW50IGFjY2VzcyQ1MDIoCi1hbmRyb2lkLndpZGdldC5WaWRlb1ZpZXcKLWludCkKLQotc3RhdGljIGludCBhY2Nlc3MkNjAwKAotYW5kcm9pZC53aWRnZXQuVmlkZW9WaWV3KQotCi1zdGF0aWMgaW50IGFjY2VzcyQ2MDIoCi1hbmRyb2lkLndpZGdldC5WaWRlb1ZpZXcKLWludCkKLQotc3RhdGljIGludCBhY2Nlc3MkNzAwKAotYW5kcm9pZC53aWRnZXQuVmlkZW9WaWV3KQotCi1zdGF0aWMgaW50IGFjY2VzcyQ3MDIoCi1hbmRyb2lkLndpZGdldC5WaWRlb1ZpZXcKLWludCkKLQotc3RhdGljIGludCBhY2Nlc3MkODAwKAotYW5kcm9pZC53aWRnZXQuVmlkZW9WaWV3KQotCi1zdGF0aWMgYm9vbGVhbiBhY2Nlc3MkOTAwKAotYW5kcm9pZC53aWRnZXQuVmlkZW9WaWV3KQotCi1wcml2YXRlIHZvaWQgYXR0YWNoTWVkaWFDb250cm9sbGVyKCkKLQotcHJpdmF0ZSB2b2lkIGluaXRWaWRlb1ZpZXcoKQotCi1wcml2YXRlIHZvaWQgb3BlblZpZGVvKCkKLQotcHJpdmF0ZSB2b2lkIHRvZ2dsZU1lZGlhQ29udHJvbHNWaXNpYmxpdHkoKQotCi1wdWJsaWMgaW50IGdldEJ1ZmZlclBlcmNlbnRhZ2UoKQotCi1wdWJsaWMgaW50IGdldEN1cnJlbnRQb3NpdGlvbigpCi0KLXB1YmxpYyBpbnQgZ2V0RHVyYXRpb24oKQotCi1wdWJsaWMgYm9vbGVhbiBpc1BsYXlpbmcoKQotCi1wdWJsaWMgYm9vbGVhbiBvbktleURvd24oCi1pbnQKLWFuZHJvaWQudmlldy5LZXlFdmVudCkKLQotcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudCgKLWFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCkKLQotcHVibGljIGJvb2xlYW4gb25UcmFja2JhbGxFdmVudCgKLWFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCkKLQotcHVibGljIHZvaWQgcGF1c2UoKQotCi1wdWJsaWMgaW50IHJlc29sdmVBZGp1c3RlZFNpemUoCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgc2Vla1RvKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRNZWRpYUNvbnRyb2xsZXIoCi1hbmRyb2lkLndpZGdldC5NZWRpYUNvbnRyb2xsZXIpCi0KLXB1YmxpYyB2b2lkIHNldE9uQ29tcGxldGlvbkxpc3RlbmVyKAotYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllciRPbkNvbXBsZXRpb25MaXN0ZW5lcikKLQotcHVibGljIHZvaWQgc2V0T25FcnJvckxpc3RlbmVyKAotYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllciRPbkVycm9yTGlzdGVuZXIpCi0KLXB1YmxpYyB2b2lkIHNldE9uUHJlcGFyZWRMaXN0ZW5lcigKLWFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIkT25QcmVwYXJlZExpc3RlbmVyKQotCi1wdWJsaWMgdm9pZCBzZXRWaWRlb1BhdGgoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRWaWRlb1VSSSgKLWFuZHJvaWQubmV0LlVyaSkKLQotcHVibGljIHZvaWQgc3RhcnQoKQotCi1wdWJsaWMgdm9pZCBzdG9wUGxheWJhY2soKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9WaWV3RmxpcHBlcjsgKQotIGNsYXNzIGFuZHJvaWQud2lkZ2V0LlZpZXdGbGlwcGVyJDEgZXh0ZW5kcyBhbmRyb2lkLm9zLkhhbmRsZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC53aWRnZXQuVmlld0ZsaXBwZXIgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53aWRnZXQuVmlld0ZsaXBwZXIpCi0KLXB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC53aWRnZXQuVmlld0ZsaXBwZXIgZXh0ZW5kcyBhbmRyb2lkLndpZGdldC5WaWV3QW5pbWF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBpbnQgRkxJUF9NU0cKLQotcHJpdmF0ZSBpbnQgbUZsaXBJbnRlcnZhbAotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQub3MuSGFuZGxlciBtSGFuZGxlcgotCi1wcml2YXRlIGJvb2xlYW4gbUtlZXBGbGlwcGluZwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDAwMCgKLWFuZHJvaWQud2lkZ2V0LlZpZXdGbGlwcGVyKQotCi1zdGF0aWMgaW50IGFjY2VzcyQxMDAoCi1hbmRyb2lkLndpZGdldC5WaWV3RmxpcHBlcikKLQotcHVibGljIGJvb2xlYW4gaXNGbGlwcGluZygpCi0KLXB1YmxpYyB2b2lkIHNldEZsaXBJbnRlcnZhbCgKLWludCkKLQotcHVibGljIHZvaWQgc3RhcnRGbGlwcGluZygpCi0KLXB1YmxpYyB2b2lkIHN0b3BGbGlwcGluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L1ZpZXdTd2l0Y2hlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPVZpZXdGYWN0b3J5ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgYW5kcm9pZC53aWRnZXQuVmlld1N3aXRjaGVyJFZpZXdGYWN0b3J5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLnZpZXcuVmlldyBtYWtlVmlldygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGFuZHJvaWQvd2lkZ2V0L1pvb21CdXR0b247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLSBjbGFzcyBhbmRyb2lkLndpZGdldC5ab29tQnV0dG9uJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5sYW5nLlJ1bm5hYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGFuZHJvaWQud2lkZ2V0Llpvb21CdXR0b24gdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC53aWRnZXQuWm9vbUJ1dHRvbikKLQotcHVibGljIHZvaWQgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi0gY2xhc3MgYW5kcm9pZC53aWRnZXQuWm9vbUJ1dHRvbiQyIGV4dGVuZHMgYW5kcm9pZC52aWV3Lkdlc3R1cmVEZXRlY3RvciRTaW1wbGVPbkdlc3R1cmVMaXN0ZW5lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLndpZGdldC5ab29tQnV0dG9uIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQud2lkZ2V0Llpvb21CdXR0b24pCi0KLXB1YmxpYyB2b2lkIG9uTG9uZ1ByZXNzKAotYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGFuZHJvaWQud2lkZ2V0Llpvb21CdXR0b24gZXh0ZW5kcyBhbmRyb2lkLndpZGdldC5JbWFnZUJ1dHRvbiBpbXBsZW1lbnRzIGFuZHJvaWQudmlldy5WaWV3JE9uTG9uZ0NsaWNrTGlzdGVuZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLnZpZXcuR2VzdHVyZURldGVjdG9yIG1HZXN0dXJlRGV0ZWN0b3IKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLm9zLkhhbmRsZXIgbUhhbmRsZXIKLQotcHJpdmF0ZSBib29sZWFuIG1Jc0luTG9uZ3ByZXNzCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlJ1bm5hYmxlIG1SdW5uYWJsZQotCi1wcml2YXRlIGxvbmcgbVpvb21TcGVlZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQKLWludCkKLQotc3RhdGljIGFuZHJvaWQudmlldy5WaWV3JE9uQ2xpY2tMaXN0ZW5lciBhY2Nlc3MkMDAwKAotYW5kcm9pZC53aWRnZXQuWm9vbUJ1dHRvbikKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDEwMCgKLWFuZHJvaWQud2lkZ2V0Llpvb21CdXR0b24pCi0KLXN0YXRpYyBhbmRyb2lkLnZpZXcuVmlldyRPbkNsaWNrTGlzdGVuZXIgYWNjZXNzJDIwMCgKLWFuZHJvaWQud2lkZ2V0Llpvb21CdXR0b24pCi0KLXN0YXRpYyBsb25nIGFjY2VzcyQzMDAoCi1hbmRyb2lkLndpZGdldC5ab29tQnV0dG9uKQotCi1zdGF0aWMgYW5kcm9pZC5vcy5IYW5kbGVyIGFjY2VzcyQ0MDAoCi1hbmRyb2lkLndpZGdldC5ab29tQnV0dG9uKQotCi1wdWJsaWMgYm9vbGVhbiBkaXNwYXRjaFVuaGFuZGxlZE1vdmUoCi1hbmRyb2lkLnZpZXcuVmlldwotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBvbktleVVwKAotaW50Ci1hbmRyb2lkLnZpZXcuS2V5RXZlbnQpCi0KLXB1YmxpYyBib29sZWFuIG9uTG9uZ0NsaWNrKAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLXB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudCgKLWFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCkKLQotcHVibGljIHZvaWQgc2V0RW5hYmxlZCgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldFpvb21TcGVlZCgKLWxvbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgYW5kcm9pZC53aWRnZXQuWm9vbUNvbnRyb2xzIGV4dGVuZHMgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC53aWRnZXQuWm9vbUJ1dHRvbiBtWm9vbUluCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC53aWRnZXQuWm9vbUJ1dHRvbiBtWm9vbU91dAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHJpdmF0ZSB2b2lkIGZhZGUoCi1pbnQKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIGJvb2xlYW4gaGFzRm9jdXMoKQotCi1wdWJsaWMgdm9pZCBoaWRlKCkKLQotcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KAotYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50KQotCi1wdWJsaWMgdm9pZCBzZXRJc1pvb21JbkVuYWJsZWQoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRJc1pvb21PdXRFbmFibGVkKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0T25ab29tSW5DbGlja0xpc3RlbmVyKAotYW5kcm9pZC52aWV3LlZpZXckT25DbGlja0xpc3RlbmVyKQotCi1wdWJsaWMgdm9pZCBzZXRPblpvb21PdXRDbGlja0xpc3RlbmVyKAotYW5kcm9pZC52aWV3LlZpZXckT25DbGlja0xpc3RlbmVyKQotCi1wdWJsaWMgdm9pZCBzZXRab29tU3BlZWQoCi1sb25nKQotCi1wdWJsaWMgdm9pZCBzaG93KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI1IG5hbWUgPWFuaW0gKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL1I7ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5SJGFuaW0gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGFjY2VsZXJhdGVfZGVjZWxlcmF0ZV9pbnRlcnBvbGF0b3IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYWNjZWxlcmF0ZV9pbnRlcnBvbGF0b3IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYXBwX3N0YXJ0aW5nX2V4aXQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGVjZWxlcmF0ZV9pbnRlcnBvbGF0b3IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZmFkZV9pbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBmYWRlX291dAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBncm93X2ZhZGVfaW4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZ3Jvd19mYWRlX2luX2NlbnRlcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBncm93X2ZhZGVfaW5fZnJvbV9ib3R0b20KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGluZWFyX2ludGVycG9sYXRvcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBvcHRpb25zX3BhbmVsX2VudGVyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG9wdGlvbnNfcGFuZWxfZXhpdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwdXNoX2Rvd25faW4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHVzaF9kb3duX291dAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwdXNoX3VwX2luCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHB1c2hfdXBfb3V0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNocmlua19mYWRlX291dAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzaHJpbmtfZmFkZV9vdXRfY2VudGVyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNocmlua19mYWRlX291dF9mcm9tX2JvdHRvbQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzbGlkZV9pbl9ib3R0b20KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2xpZGVfaW5fY2hpbGRfYm90dG9tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNsaWRlX2luX2xlZnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2xpZGVfaW5fcmlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2xpZGVfaW5fdG9wCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNsaWRlX291dF9ib3R0b20KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2xpZGVfb3V0X2xlZnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2xpZGVfb3V0X3JpZ2h0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNsaWRlX291dF90b3AKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3VibWVudV9lbnRlcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdWJtZW51X2V4aXQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGFza19jbG9zZV9lbnRlcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0YXNrX2Nsb3NlX2V4aXQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGFza19vcGVuX2VudGVyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRhc2tfb3Blbl9leGl0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRvYXN0X2VudGVyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRvYXN0X2V4aXQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjUgbmFtZSA9YXJyYXkgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL1I7ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5SJGFycmF5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkYXlfbGFiZWxzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGVtYWlsQWRkcmVzc1R5cGVzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGltQWRkcmVzc1R5cGVzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGltUHJvdG9jb2xzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1hcHNfc3RhcnRpbmdfbGF0X2xuZwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBtYXBzX3N0YXJ0aW5nX3pvb20KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgb3JnYW5pemF0aW9uVHlwZXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGhvbmVUeXBlcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwb3N0YWxBZGRyZXNzVHlwZXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJlbG9hZGVkX2RyYXdhYmxlcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0dXNfYmFyX2ljb25fb3JkZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC9SOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI1IG5hbWUgPWF0dHIgKQotcHVibGljIGZpbmFsIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLlIkYXR0ciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYWJzTGlzdFZpZXdTdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBhY3Rpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYWN0aXZpdHlDbG9zZUVudGVyQW5pbWF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGFjdGl2aXR5Q2xvc2VFeGl0QW5pbWF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGFjdGl2aXR5T3BlbkVudGVyQW5pbWF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGFjdGl2aXR5T3BlbkV4aXRBbmltYXRpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYWRkU3RhdGVzRnJvbUNoaWxkcmVuCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGFkanVzdFZpZXdCb3VuZHMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYWxlcnREaWFsb2dTdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBhbGxvd0NsZWFyVXNlckRhdGEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYWxsb3dUYXNrUmVwYXJlbnRpbmcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYWxwaGFiZXRpY1Nob3J0Y3V0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGFsd2F5c0RyYXduV2l0aENhY2hlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGFsd2F5c1JldGFpblRhc2tTdGF0ZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBhbmdsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBhbmltYXRlT25DbGljawotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBhbmltYXRpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYW5pbWF0aW9uQ2FjaGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYW5pbWF0aW9uRHVyYXRpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYW5pbWF0aW9uT3JkZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYW50aWFsaWFzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGFwaUtleQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBhdXRob3JpdGllcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBhdXRvQ29tcGxldGVUZXh0Vmlld1N0eWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGF1dG9MaW5rCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGF1dG9UZXh0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJhY2tncm91bmQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYmFja2dyb3VuZERpbUFtb3VudAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBiYXNlbGluZUFsaWduQm90dG9tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJhc2VsaW5lQWxpZ25lZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBiYXNlbGluZUFsaWduZWRDaGlsZEluZGV4Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJvdHRvbQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBib3R0b21CcmlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYm90dG9tRGFyawotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBib3R0b21MZWZ0UmFkaXVzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJvdHRvbU1lZGl1bQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBib3R0b21PZmZzZXQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYm90dG9tUmlnaHRSYWRpdXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYnVmZmVyVHlwZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBidXR0b24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYnV0dG9uU3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYnV0dG9uU3R5bGVJbnNldAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBidXR0b25TdHlsZVNtYWxsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ1dHRvblN0eWxlVG9nZ2xlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNhY2hlQ29sb3JIaW50Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNhcGl0YWxpemUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY2VudGVyQnJpZ2h0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNlbnRlckNvbG9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNlbnRlckRhcmsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY2VudGVyTWVkaXVtCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNlbnRlclgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY2VudGVyWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjaGVja0JveFByZWZlcmVuY2VTdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjaGVja01hcmsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY2hlY2thYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNoZWNrYWJsZUJlaGF2aW9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNoZWNrYm94U3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY2hlY2tlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjaGVja2VkQnV0dG9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNoaWxkRGl2aWRlcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjaGlsZEluZGljYXRvcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjaGlsZEluZGljYXRvckxlZnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY2hpbGRJbmRpY2F0b3JSaWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjaG9pY2VNb2RlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNsZWFyVGFza09uTGF1bmNoCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNsaWNrYWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjbGlwQ2hpbGRyZW4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY2xpcE9yaWVudGF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNsaXBUb1BhZGRpbmcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY29sbGFwc2VDb2x1bW5zCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNvbG9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNvbG9yQmFja2dyb3VuZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb2xvckZvcmVncm91bmQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY29sb3JGb3JlZ3JvdW5kSW52ZXJzZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb2x1bW5EZWxheQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb2x1bW5XaWR0aAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb21wbGV0aW9uSGludAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb21wbGV0aW9uSGludFZpZXcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY29tcGxldGlvblRocmVzaG9sZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb25maWdDaGFuZ2VzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNvbnN0YW50U2l6ZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb250ZW50Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNyb3BUb1BhZGRpbmcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY3Vyc29yVmlzaWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjeWNsZXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGFzaEdhcAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkYXNoV2lkdGgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGF0YQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkZWJ1Z2dhYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGRlZmF1bHRWYWx1ZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkZWxheQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkZXBlbmRlbmN5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGRlc2NlbmRhbnRGb2N1c2FiaWxpdHkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGVzY3JpcHRpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGlhbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkaWFsb2dJY29uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGRpYWxvZ0xheW91dAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkaWFsb2dNZXNzYWdlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGRpYWxvZ1ByZWZlcmVuY2VTdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkaWFsb2dUaXRsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkaWdpdHMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGlyZWN0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGRpcmVjdGlvblByaW9yaXR5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGRpc2FibGVEZXBlbmRlbnRzU3RhdGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGlzYWJsZWRBbHBoYQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkaXRoZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGl2aWRlcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkaXZpZGVySGVpZ2h0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGRyYXdTZWxlY3Rvck9uVG9wCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGRyYXdhYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGRyYXdhYmxlQm90dG9tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGRyYXdhYmxlTGVmdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkcmF3YWJsZVBhZGRpbmcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZHJhd2FibGVSaWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkcmF3YWJsZVRvcAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkcmF3aW5nQ2FjaGVRdWFsaXR5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGRyb3BEb3duSGludEFwcGVhcmFuY2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZHJvcERvd25JdGVtU3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZHJvcERvd25MaXN0Vmlld1N0eWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGRyb3BEb3duU2VsZWN0b3IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZHVwbGljYXRlUGFyZW50U3RhdGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZHVyYXRpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZWRpdFRleHRQcmVmZXJlbmNlU3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZWRpdFRleHRTdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBlZGl0YWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBlbGxpcHNpemUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZW1zCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGVuYWJsZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZW5kQ29sb3IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZW5kWWVhcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBlbnRyaWVzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGVudHJ5VmFsdWVzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGV4Y2x1ZGVGcm9tUmVjZW50cwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBleHBhbmRhYmxlTGlzdFByZWZlcnJlZENoaWxkSW5kaWNhdG9yTGVmdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBleHBhbmRhYmxlTGlzdFByZWZlcnJlZENoaWxkSW5kaWNhdG9yUmlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZXhwYW5kYWJsZUxpc3RQcmVmZXJyZWRDaGlsZFBhZGRpbmdMZWZ0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGV4cGFuZGFibGVMaXN0UHJlZmVycmVkSXRlbUluZGljYXRvckxlZnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZXhwYW5kYWJsZUxpc3RQcmVmZXJyZWRJdGVtSW5kaWNhdG9yUmlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZXhwYW5kYWJsZUxpc3RQcmVmZXJyZWRJdGVtUGFkZGluZ0xlZnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZXhwYW5kYWJsZUxpc3RWaWV3U3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZXhwb3J0ZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZmFjdG9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGZhZGluZ0VkZ2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZmFkaW5nRWRnZUxlbmd0aAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBmaWxsQWZ0ZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZmlsbEJlZm9yZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBmaWxsVmlld3BvcnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZmlsdGVyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGZpbmlzaE9uVGFza0xhdW5jaAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBmaXRzU3lzdGVtV2luZG93cwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBmbGlwSW50ZXJ2YWwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZm9jdXNhYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGZvY3VzYWJsZUluVG91Y2hNb2RlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGZvcmVncm91bmQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZm9yZWdyb3VuZEdyYXZpdHkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZm9ybWF0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGZyZWV6ZXNUZXh0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGZyb21BbHBoYQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBmcm9tRGVncmVlcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBmcm9tWERlbHRhCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGZyb21YU2NhbGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZnJvbVlEZWx0YQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBmcm9tWVNjYWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGZ1bGxCcmlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZnVsbERhcmsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZnVuY3Rpb25hbFRlc3QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZ2FsbGVyeUl0ZW1CYWNrZ3JvdW5kCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGdhbGxlcnlTdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBncmFkaWVudFJhZGl1cwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBncmFudFVyaVBlcm1pc3Npb25zCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGdyYXZpdHkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZ3JpZFZpZXdTdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBncm91cEluZGljYXRvcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBoYW5kX2hvdXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaGFuZF9taW51dGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaGFuZGxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGhhbmRsZVByb2ZpbGluZwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBoYXNDb2RlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGhlYWRlckJhY2tncm91bmQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaGVpZ2h0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGhpbnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaG9yaXpvbnRhbERpdmlkZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaG9yaXpvbnRhbFNwYWNpbmcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaG9zdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY29uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGlkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGlnbm9yZUdyYXZpdHkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaW1hZ2VCdXR0b25TdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpbWFnZVdlbGxTdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpbkFuaW1hdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpbmNsdWRlRm9udFBhZGRpbmcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaW5kZXRlcm1pbmF0ZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpbmRldGVybWluYXRlQmVoYXZpb3IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaW5kZXRlcm1pbmF0ZURyYXdhYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGluZGV0ZXJtaW5hdGVEdXJhdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpbmRldGVybWluYXRlT25seQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpbmRpY2F0b3JMZWZ0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGluZGljYXRvclJpZ2h0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGluZmxhdGVkSWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaW5pdE9yZGVyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGlubmVyUmFkaXVzUmF0aW8KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaW5wdXRNZXRob2QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaW5zZXRCb3R0b20KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaW5zZXRMZWZ0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGluc2V0UmlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaW5zZXRUb3AKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaW50ZXJwb2xhdG9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGlzSW5kaWNhdG9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGl0ZW1CYWNrZ3JvdW5kCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGl0ZW1JY29uRGlzYWJsZWRBbHBoYQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpdGVtVGV4dEFwcGVhcmFuY2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQga2VlcFNjcmVlbk9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGtleQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBrZXljb2RlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxhYmVsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxhdW5jaE1vZGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGF5b3V0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxheW91dEFuaW1hdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBsYXlvdXRfYWJvdmUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGF5b3V0X2FsaWduQmFzZWxpbmUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGF5b3V0X2FsaWduQm90dG9tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxheW91dF9hbGlnbkxlZnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGF5b3V0X2FsaWduUGFyZW50Qm90dG9tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxheW91dF9hbGlnblBhcmVudExlZnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGF5b3V0X2FsaWduUGFyZW50UmlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGF5b3V0X2FsaWduUGFyZW50VG9wCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxheW91dF9hbGlnblJpZ2h0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxheW91dF9hbGlnblRvcAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBsYXlvdXRfYWxpZ25XaXRoUGFyZW50SWZNaXNzaW5nCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxheW91dF9iZWxvdwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBsYXlvdXRfY2VudGVySG9yaXpvbnRhbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBsYXlvdXRfY2VudGVySW5QYXJlbnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGF5b3V0X2NlbnRlclZlcnRpY2FsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxheW91dF9jb2x1bW4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGF5b3V0X2dyYXZpdHkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGF5b3V0X2hlaWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBsYXlvdXRfbWFyZ2luCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxheW91dF9tYXJnaW5Cb3R0b20KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGF5b3V0X21hcmdpbkxlZnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGF5b3V0X21hcmdpblJpZ2h0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxheW91dF9tYXJnaW5Ub3AKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGF5b3V0X3NjYWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxheW91dF9zcGFuCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxheW91dF90b0xlZnRPZgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBsYXlvdXRfdG9SaWdodE9mCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxheW91dF93ZWlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGF5b3V0X3dpZHRoCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxheW91dF94Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxheW91dF95Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxlZnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGluZVNwYWNpbmdFeHRyYQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBsaW5lU3BhY2luZ011bHRpcGxpZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGluZXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGlua3NDbGlja2FibGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGlzdENob2ljZUluZGljYXRvck11bHRpcGxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxpc3RDaG9pY2VJbmRpY2F0b3JTaW5nbGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGlzdERpdmlkZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGlzdFByZWZlcnJlZEl0ZW1IZWlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGlzdFNlbGVjdG9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxpc3RTZXBhcmF0b3JUZXh0Vmlld1N0eWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxpc3RWaWV3U3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGlzdFZpZXdXaGl0ZVN0eWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxvbmdDbGlja2FibGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbWFuYWdlU3BhY2VBY3Rpdml0eQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBtYXBWaWV3U3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbWF4Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1heEVtcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBtYXhIZWlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbWF4SXRlbXNQZXJSb3cKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbWF4TGVuZ3RoCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1heExldmVsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1heExpbmVzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1heFJvd3MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbWF4V2lkdGgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbWVhc3VyZUFsbENoaWxkcmVuCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1lbnVDYXRlZ29yeQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBtaW1lVHlwZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBtaW5FbXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbWluSGVpZ2h0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1pbkxldmVsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1pbkxpbmVzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1pblNka1ZlcnNpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbWluV2lkdGgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbW9kZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBtb3JlSWNvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBtdWx0aXByb2Nlc3MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbmFtZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBuZWdhdGl2ZUJ1dHRvblRleHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbmV4dEZvY3VzRG93bgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBuZXh0Rm9jdXNMZWZ0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG5leHRGb2N1c1JpZ2h0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG5leHRGb2N1c1VwCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG51bUNvbHVtbnMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbnVtU3RhcnMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbnVtZXJpYwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBudW1lcmljU2hvcnRjdXQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgb25lc2hvdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBvcmRlcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBvcmRlckluQ2F0ZWdvcnkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgb3JkZXJpbmdGcm9tWG1sCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG9yaWVudGF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG91dEFuaW1hdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwYWRkaW5nCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBhZGRpbmdCb3R0b20KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGFkZGluZ0xlZnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGFkZGluZ1JpZ2h0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBhZGRpbmdUb3AKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGFuZWxCYWNrZ3JvdW5kCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBhbmVsQ29sb3JCYWNrZ3JvdW5kCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBhbmVsQ29sb3JGb3JlZ3JvdW5kCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBhbmVsRnVsbEJhY2tncm91bmQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGFuZWxUZXh0QXBwZWFyYW5jZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwYXNzd29yZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwYXRoCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBhdGhQYXR0ZXJuCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBhdGhQcmVmaXgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWlzc2lvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtaXNzaW9uR3JvdXAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVyc2lzdGVudAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJzaXN0ZW50RHJhd2luZ0NhY2hlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBob25lTnVtYmVyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBpdm90WAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwaXZvdFkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcG9wdXBCYWNrZ3JvdW5kCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBvcHVwV2luZG93U3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcG9ydAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwb3NpdGl2ZUJ1dHRvblRleHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJlZmVyZW5jZUNhdGVnb3J5U3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJlZmVyZW5jZUluZm9ybWF0aW9uU3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJlZmVyZW5jZUxheW91dENoaWxkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByZWZlcmVuY2VTY3JlZW5TdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcmVmZXJlbmNlU3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJpb3JpdHkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJvY2VzcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcm9ncmVzcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcm9ncmVzc0JhclN0eWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByb2dyZXNzQmFyU3R5bGVIb3Jpem9udGFsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByb2dyZXNzQmFyU3R5bGVMYXJnZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcm9ncmVzc0JhclN0eWxlU21hbGwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJvZ3Jlc3NCYXJTdHlsZVNtYWxsVGl0bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJvZ3Jlc3NEcmF3YWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcm9tcHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJvdGVjdGlvbkxldmVsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHF1ZXJ5QWN0aW9uTXNnCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHJhZGlvQnV0dG9uU3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcmFkaXVzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHJhdGluZwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCByYXRpbmdCYXJTdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCByYXRpbmdCYXJTdHlsZUluZGljYXRvcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCByYXRpbmdCYXJTdHlsZVNtYWxsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHJlYWRQZXJtaXNzaW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHJlcGVhdENvdW50Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHJlcGVhdE1vZGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcmVzb3VyY2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcmlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcmluZ3RvbmVQcmVmZXJlbmNlU3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcmluZ3RvbmVUeXBlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHJvd0RlbGF5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHJvd0hlaWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzYXZlRW5hYmxlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzY2FsZUdyYXZpdHkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2NhbGVIZWlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2NhbGVUeXBlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNjYWxlV2lkdGgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2NoZW1lCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNjcmVlbk9yaWVudGF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNjcm9sbEhvcml6b250YWxseQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzY3JvbGxWaWV3U3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2Nyb2xsWAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzY3JvbGxZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNjcm9sbGJhckFsd2F5c0RyYXdIb3Jpem9udGFsVHJhY2sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2Nyb2xsYmFyQWx3YXlzRHJhd1ZlcnRpY2FsVHJhY2sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2Nyb2xsYmFyU2l6ZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzY3JvbGxiYXJTdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzY3JvbGxiYXJUaHVtYkhvcml6b250YWwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2Nyb2xsYmFyVGh1bWJWZXJ0aWNhbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzY3JvbGxiYXJUcmFja0hvcml6b250YWwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2Nyb2xsYmFyVHJhY2tWZXJ0aWNhbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzY3JvbGxiYXJzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNjcm9sbGluZ0NhY2hlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNlYXJjaEJ1dHRvblRleHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2VhcmNoTW9kZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzZWFyY2hTdWdnZXN0QXV0aG9yaXR5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNlYXJjaFN1Z2dlc3RJbnRlbnRBY3Rpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2VhcmNoU3VnZ2VzdEludGVudERhdGEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2VhcmNoU3VnZ2VzdFBhdGgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2VhcmNoU3VnZ2VzdFNlbGVjdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzZWNvbmRhcnlQcm9ncmVzcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzZWVrQmFyU3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2VsZWN0QWxsT25Gb2N1cwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzZWxlY3RhYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNoYWRvd0NvbG9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNoYWRvd0R4Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNoYWRvd0R5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNoYWRvd1JhZGl1cwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzaGFwZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzaGFyZUludGVycG9sYXRvcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzaGFyZWRVc2VySWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2hvdWxkRGlzYWJsZVZpZXcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2hvd0RlZmF1bHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2hvd1NpbGVudAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzaHJpbmtDb2x1bW5zCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNpbmdsZUxpbmUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc291bmRFZmZlY3RzRW5hYmxlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzcGFjaW5nCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNwaW5uZXJEcm9wRG93bkl0ZW1TdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzcGlubmVySXRlbVN0eWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNwaW5uZXJTdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzcmMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhY2tGcm9tQm90dG9tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXJTdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGFydENvbG9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXJ0T2Zmc2V0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXJ0WWVhcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0ZU5vdE5lZWRlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0ZV9hYm92ZV9hbmNob3IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdGVfYWN0aXZlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXRlX2NoZWNrYWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0ZV9jaGVja2VkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXRlX2VtcHR5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXRlX2VuYWJsZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdGVfZXhwYW5kZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdGVfZmlyc3QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdGVfZm9jdXNlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0ZV9sYXN0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXRlX21pZGRsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0ZV9wcmVzc2VkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXRlX3NlbGVjdGVkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXRlX3NpbmdsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0ZV93aW5kb3dfZm9jdXNlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGVwU2l6ZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdHJlYW1UeXBlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0cmV0Y2hDb2x1bW5zCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0cmV0Y2hNb2RlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN1Z2dlc3RBY3Rpb25Nc2cKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3VnZ2VzdEFjdGlvbk1zZ0NvbHVtbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdW1tYXJ5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN1bW1hcnlPZmYKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3VtbWFyeU9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN5bmNhYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRhYldpZGdldFN0eWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRhZwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0YXJnZXRBY3Rpdml0eQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0YXJnZXRDbGFzcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0YXJnZXRQYWNrYWdlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRhc2tBZmZpbml0eQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0YXNrQ2xvc2VFbnRlckFuaW1hdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0YXNrQ2xvc2VFeGl0QW5pbWF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRhc2tPcGVuRW50ZXJBbmltYXRpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGFza09wZW5FeGl0QW5pbWF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRhc2tUb0JhY2tFbnRlckFuaW1hdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0YXNrVG9CYWNrRXhpdEFuaW1hdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0YXNrVG9Gcm9udEVudGVyQW5pbWF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRhc2tUb0Zyb250RXhpdEFuaW1hdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0ZXh0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRleHRBcHBlYXJhbmNlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRleHRBcHBlYXJhbmNlQnV0dG9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRleHRBcHBlYXJhbmNlSW52ZXJzZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0ZXh0QXBwZWFyYW5jZUxhcmdlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRleHRBcHBlYXJhbmNlTGFyZ2VJbnZlcnNlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRleHRBcHBlYXJhbmNlTWVkaXVtCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRleHRBcHBlYXJhbmNlTWVkaXVtSW52ZXJzZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0ZXh0QXBwZWFyYW5jZVNtYWxsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRleHRBcHBlYXJhbmNlU21hbGxJbnZlcnNlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRleHRDaGVja01hcmsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGV4dENoZWNrTWFya0ludmVyc2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGV4dENvbG9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRleHRDb2xvckhpZ2hsaWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0ZXh0Q29sb3JIaW50Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRleHRDb2xvckhpbnRJbnZlcnNlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRleHRDb2xvckxpbmsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGV4dENvbG9yUHJpbWFyeQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0ZXh0Q29sb3JQcmltYXJ5RGlzYWJsZU9ubHkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGV4dENvbG9yUHJpbWFyeUludmVyc2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGV4dENvbG9yUHJpbWFyeUludmVyc2VOb0Rpc2FibGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGV4dENvbG9yUHJpbWFyeU5vRGlzYWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0ZXh0Q29sb3JTZWNvbmRhcnkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGV4dENvbG9yU2Vjb25kYXJ5SW52ZXJzZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0ZXh0Q29sb3JTZWNvbmRhcnlJbnZlcnNlTm9EaXNhYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRleHRDb2xvclNlY29uZGFyeU5vRGlzYWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0ZXh0Q29sb3JUZXJ0aWFyeQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0ZXh0Q29sb3JUZXJ0aWFyeUludmVyc2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGV4dEZpbHRlckVuYWJsZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGV4dE9mZgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0ZXh0T24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGV4dFNjYWxlWAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0ZXh0U2l6ZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0ZXh0U3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGV4dFZpZXdTdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0aGVtZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0aGlja25lc3NSYXRpbwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0aHVtYgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0aHVtYk9mZnNldAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0aWxlTW9kZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0aW50Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRpdGxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRpdGxlQ29uZGVuc2VkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRvQWxwaGEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdG9EZWdyZWVzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRvWERlbHRhCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRvWFNjYWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRvWURlbHRhCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRvWVNjYWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRvcAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0b3BCcmlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdG9wRGFyawotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0b3BMZWZ0UmFkaXVzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRvcE9mZnNldAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0b3BSaWdodFJhZGl1cwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0cmFuc2NyaXB0TW9kZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0eXBlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHR5cGVmYWNlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHVuc2VsZWN0ZWRBbHBoYQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB1c2VMZXZlbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB2YWx1ZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB2YXJpYWJsZVBhZGRpbmcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdmVyc2lvbkNvZGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdmVyc2lvbk5hbWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdmVydGljYWxEaXZpZGVyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHZlcnRpY2FsU3BhY2luZwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB2aXNpYmlsaXR5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHZpc2libGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgd2ViVmlld1N0eWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHdlaWdodFN1bQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB3aWRnZXRMYXlvdXQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgd2lkdGgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgd2luZG93QW5pbWF0aW9uU3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgd2luZG93QmFja2dyb3VuZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB3aW5kb3dDb250ZW50T3ZlcmxheQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB3aW5kb3dFbnRlckFuaW1hdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB3aW5kb3dFeGl0QW5pbWF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHdpbmRvd0ZyYW1lCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHdpbmRvd0Z1bGxzY3JlZW4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgd2luZG93SGlkZUFuaW1hdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB3aW5kb3dJc0Zsb2F0aW5nCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHdpbmRvd0lzVHJhbnNsdWNlbnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgd2luZG93Tm9UaXRsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB3aW5kb3dTaG93QW5pbWF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHdpbmRvd1RpdGxlQmFja2dyb3VuZFN0eWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHdpbmRvd1RpdGxlU2l6ZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB3aW5kb3dUaXRsZVN0eWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHdyaXRlUGVybWlzc2lvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB4Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgeWVzTm9QcmVmZXJlbmNlU3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgekFkanVzdG1lbnQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC9SOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI1IG5hbWUgPWNvbG9yICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5SJGNvbG9yIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBiYWNrZ3JvdW5kX2RhcmsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYmFja2dyb3VuZF9saWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBibGFjawotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBicmlnaHRfZm9yZWdyb3VuZF9kYXJrCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJyaWdodF9mb3JlZ3JvdW5kX2RhcmtfZGlzYWJsZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYnJpZ2h0X2ZvcmVncm91bmRfZGFya19pbnZlcnNlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJyaWdodF9mb3JlZ3JvdW5kX2xpZ2h0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJyaWdodF9mb3JlZ3JvdW5kX2xpZ2h0X2Rpc2FibGVkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJyaWdodF9mb3JlZ3JvdW5kX2xpZ2h0X2ludmVyc2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGFya2VyX2dyYXkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGltX2ZvcmVncm91bmRfZGFyawotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkaW1fZm9yZWdyb3VuZF9kYXJrX2Rpc2FibGVkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGRpbV9mb3JlZ3JvdW5kX2RhcmtfaW52ZXJzZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkaW1fZm9yZWdyb3VuZF9kYXJrX2ludmVyc2VfZGlzYWJsZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGltX2ZvcmVncm91bmRfbGlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGltX2ZvcmVncm91bmRfbGlnaHRfZGlzYWJsZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGltX2ZvcmVncm91bmRfbGlnaHRfaW52ZXJzZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkaW1fZm9yZWdyb3VuZF9saWdodF9pbnZlcnNlX2Rpc2FibGVkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGhpbnRfZm9yZWdyb3VuZF9kYXJrCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGhpbnRfZm9yZWdyb3VuZF9saWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBsaWdodGVyX2dyYXkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybXNfZGFuZ2Vyb3VzX2dycF9jb2xvcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtc19kYW5nZXJvdXNfcGVybV9jb2xvcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtc19ub3JtYWxfZ3JwX2NvbG9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1zX25vcm1hbF9wZXJtX2NvbG9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByaW1hcnlfdGV4dF9kYXJrCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByaW1hcnlfdGV4dF9kYXJrX2Rpc2FibGVfb25seQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcmltYXJ5X3RleHRfZGFya19mb2N1c2VkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByaW1hcnlfdGV4dF9kYXJrX25vZGlzYWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcmltYXJ5X3RleHRfbGlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJpbWFyeV90ZXh0X2xpZ2h0X2Rpc2FibGVfb25seQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcmltYXJ5X3RleHRfbGlnaHRfbm9kaXNhYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNhZmVfbW9kZV90ZXh0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNlY29uZGFyeV90ZXh0X2RhcmsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2Vjb25kYXJ5X3RleHRfZGFya19ub2Rpc2FibGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2Vjb25kYXJ5X3RleHRfbGlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2Vjb25kYXJ5X3RleHRfbGlnaHRfbm9kaXNhYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRhYl9pbmRpY2F0b3JfdGV4dAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0ZXJ0aWFyeV90ZXh0X2RhcmsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGVydGlhcnlfdGV4dF9saWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0aGVtZV9wYW5lbF90ZXh0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRyYW5zcGFyZW50Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHdoaXRlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHdpZGdldF9hdXRvY29tcGxldGV0ZXh0dmlld19kYXJrCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHdpZGdldF9idXR0b24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgd2lkZ2V0X2VkaXR0ZXh0X2RhcmsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgd2lkZ2V0X2VkaXR0ZXh0X2RhcmtfaGludAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB3aWRnZXRfcGFuZWx0YWJ3aWRnZXQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgd2lkZ2V0X3RleHR2aWV3X2JpZ3NwaW5uZXJpdGVtX2RhcmsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgd2lkZ2V0X3RleHR2aWV3X3NwaW5uZXJpdGVtX2RhcmsKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjUgbmFtZSA9ZGltZW4gKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL1I7ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5SJGRpbWVuIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBhcHBfaWNvbl9zaXplCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRodW1ibmFpbF9oZWlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGh1bWJuYWlsX3dpZHRoCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRvYXN0X3lfb2Zmc2V0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvUjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNSBuYW1lID1kcmF3YWJsZSApCi1wdWJsaWMgZmluYWwgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwuUiRkcmF3YWJsZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYWxlcnRfZGFya19mcmFtZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBhbGVydF9saWdodF9mcmFtZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBhcHBfaWNvbl9iYWNrZ3JvdW5kCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGFycm93X2Rvd25fZmxvYXQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYXJyb3dfdXBfZmxvYXQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYmF0dGVyeV9jaGFyZ2VfYmFja2dyb3VuZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBiYXR0ZXJ5X2NoYXJnZV9maWxsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJhdHRlcnlfY2hhcmdlX2ZpbGxfZW1wdHkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYmF0dGVyeV9jaGFyZ2VfZmlsbF9mdWxsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJhdHRlcnlfY2hhcmdlX2ZpbGxfd2FybmluZwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBiYXR0ZXJ5X2xvd19iYXR0ZXJ5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJsYW5rX3RpbGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYm9vdF9yb2JvdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBib3R0b21fYmFyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJvdHRvbWJhcl81NjUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYm94Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ0bl9hcHBsaWNhdGlvbl9zZWxlY3RvcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBidG5fY2hlY2sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYnRuX2NoZWNrX2xhYmVsX2JhY2tncm91bmQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYnRuX2NoZWNrX29mZgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBidG5fY2hlY2tfb2ZmX2Rpc2FibGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYnRuX2NoZWNrX29mZl9kaXNhYmxlX2ZvY3VzZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYnRuX2NoZWNrX29mZl9sb25ncHJlc3MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYnRuX2NoZWNrX29mZl9wcmVzc2VkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ0bl9jaGVja19vZmZfc2VsZWN0ZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYnRuX2NoZWNrX29uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ0bl9jaGVja19vbl9kaXNhYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ0bl9jaGVja19vbl9kaXNhYmxlX2ZvY3VzZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYnRuX2NoZWNrX29uX2xvbmdwcmVzcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBidG5fY2hlY2tfb25fcHJlc3NlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBidG5fY2hlY2tfb25fc2VsZWN0ZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYnRuX2NvZGVfbG9ja19kZWZhdWx0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ0bl9jb2RlX2xvY2tfZGVmYXVsdF90cmFja2JhbGxfcHJlc3NlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBidG5fY29kZV9sb2NrX2RlZmF1bHRfdHJhY2tiYWxsX3NlbGVjdGVkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ0bl9jb2RlX2xvY2tfdG91Y2hlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBidG5fZGVmYXVsdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBidG5fZGVmYXVsdF9sb25ncHJlc3MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYnRuX2RlZmF1bHRfbm9ybWFsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ0bl9kZWZhdWx0X25vcm1hbF9kaXNhYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ0bl9kZWZhdWx0X25vcm1hbF9kaXNhYmxlX2ZvY3VzZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYnRuX2RlZmF1bHRfcHJlc3NlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBidG5fZGVmYXVsdF9zZWxlY3RlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBidG5fZGVmYXVsdF9zbWFsbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBidG5fZGVmYXVsdF9zbWFsbF9sb25ncHJlc3MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYnRuX2RlZmF1bHRfc21hbGxfbm9ybWFsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ0bl9kZWZhdWx0X3NtYWxsX25vcm1hbF9kaXNhYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ0bl9kZWZhdWx0X3NtYWxsX25vcm1hbF9kaXNhYmxlX2ZvY3VzZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYnRuX2RlZmF1bHRfc21hbGxfcHJlc3NlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBidG5fZGVmYXVsdF9zbWFsbF9zZWxlY3RlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBidG5fZGlhbG9nCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ0bl9kaWFsb2dfZGlzYWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBidG5fZGlhbG9nX2Rpc2FibGVfZm9jdXNlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBidG5fZGlhbG9nX25vcm1hbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBidG5fZGlhbG9nX3ByZXNzZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYnRuX2RpYWxvZ19zZWxlY3RlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBidG5fZHJvcGRvd24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYnRuX2Ryb3Bkb3duX2Rpc2FibGVkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ0bl9kcm9wZG93bl9kb3duCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ0bl9kcm9wZG93bl9ub3JtYWwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYnRuX2Ryb3Bkb3duX3ByZXNzZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYnRuX2Ryb3Bkb3duX3NlbGVjdGVkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ0bl9lcmFzZV9kZWZhdWx0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ0bl9lcmFzZV9wcmVzc2VkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ0bl9lcmFzZV9zZWxlY3RlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBidG5fZmxpY2tlcl9taW51cwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBidG5fZmxpY2tlcl9wbHVzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ0bl9tZWRpYV9wbGF5ZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYnRuX21lZGlhX3BsYXllcl9kaXNhYmxlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBidG5fbWVkaWFfcGxheWVyX2Rpc2FibGVkX3NlbGVjdGVkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ0bl9tZWRpYV9wbGF5ZXJfcHJlc3NlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBidG5fbWVkaWFfcGxheWVyX3NlbGVjdGVkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ0bl9taW51cwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBidG5fbWludXNfZGVmYXVsdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBidG5fbWludXNfZGlzYWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBidG5fbWludXNfZGlzYWJsZV9mb2N1c2VkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ0bl9taW51c19wcmVzc2VkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ0bl9taW51c19zZWxlY3RlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBidG5fcGx1cwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBidG5fcGx1c19kZWZhdWx0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ0bl9wbHVzX2Rpc2FibGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYnRuX3BsdXNfZGlzYWJsZV9mb2N1c2VkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ0bl9wbHVzX3ByZXNzZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYnRuX3BsdXNfc2VsZWN0ZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYnRuX3JhZGlvCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ0bl9yYWRpb19sYWJlbF9iYWNrZ3JvdW5kCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ0bl9yYWRpb19vZmYKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYnRuX3JhZGlvX29mZl9kaXNhYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ0bl9yYWRpb19vZmZfZGlzYWJsZV9mb2N1c2VkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ0bl9yYWRpb19vZmZfbG9uZ3ByZXNzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ0bl9yYWRpb19vZmZfcHJlc3NlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBidG5fcmFkaW9fb2ZmX3NlbGVjdGVkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ0bl9yYWRpb19vbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBidG5fcmFkaW9fb25fZGlzYWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBidG5fcmFkaW9fb25fZGlzYWJsZV9mb2N1c2VkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ0bl9yYWRpb19vbl9sb25ncHJlc3MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYnRuX3JhZGlvX29uX3ByZXNzZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYnRuX3JhZGlvX29uX3NlbGVjdGVkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ0bl9yYXRpbmdfc3Rhcl9vZmZfbm9ybWFsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ0bl9yYXRpbmdfc3Rhcl9vZmZfcHJlc3NlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBidG5fcmF0aW5nX3N0YXJfb2ZmX3NlbGVjdGVkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ0bl9yYXRpbmdfc3Rhcl9vbl9ub3JtYWwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYnRuX3JhdGluZ19zdGFyX29uX3ByZXNzZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYnRuX3JhdGluZ19zdGFyX29uX3NlbGVjdGVkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ0bl9zdGFyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ0bl9zdGFyX2JpZ19vZmYKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYnRuX3N0YXJfYmlnX29mZl9kaXNhYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ0bl9zdGFyX2JpZ19vZmZfZGlzYWJsZV9mb2N1c2VkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ0bl9zdGFyX2JpZ19vZmZfbG9uZ3ByZXNzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ0bl9zdGFyX2JpZ19vZmZfcHJlc3NlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBidG5fc3Rhcl9iaWdfb2ZmX3NlbGVjdGVkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ0bl9zdGFyX2JpZ19vbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBidG5fc3Rhcl9iaWdfb25fZGlzYWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBidG5fc3Rhcl9iaWdfb25fZGlzYWJsZV9mb2N1c2VkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ0bl9zdGFyX2JpZ19vbl9sb25ncHJlc3MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYnRuX3N0YXJfYmlnX29uX3ByZXNzZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYnRuX3N0YXJfYmlnX29uX3NlbGVjdGVkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ0bl9zdGFyX2xhYmVsX2JhY2tncm91bmQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYnRuX3RvZ2dsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBidG5fdG9nZ2xlX2JnCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ0bl90b2dnbGVfb2ZmCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ0bl90b2dnbGVfb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYnRuX3doaXRlX2xvbmdwcmVzcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBidG5fem9vbV9wYWdlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ0bl96b29tX3BhZ2Vfbm9ybWFsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ0bl96b29tX3BhZ2VfcHJlc3MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYnV0dG9uX2luc2V0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ1dHRvbl9vbm9mZl9pbmRpY2F0b3Jfb2ZmCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ1dHRvbl9vbm9mZl9pbmRpY2F0b3Jfb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY2hlY2tib3gKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY2hlY2tib3hfYmFja2dyb3VuZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjaGVja2JveF9sYWJlbF9iYWNrZ3JvdW5kCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNoZWNrYm94X29mZl9iYWNrZ3JvdW5kCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNoZWNrYm94X29mZl9iYWNrZ3JvdW5kX2ZvY3VzX3llbGxvdwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjaGVja2JveF9vbl9iYWNrZ3JvdW5kCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNoZWNrYm94X29uX2JhY2tncm91bmRfZm9jdXNfeWVsbG93Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNsb2NrX2RpYWwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY2xvY2tfaGFuZF9ob3VyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNsb2NrX2hhbmRfbWludXRlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNvZGVfbG9ja19ib3R0b20KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY29kZV9sb2NrX2xlZnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY29kZV9sb2NrX3RvcAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb21wYXNzX2Fycm93Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNvbXBhc3NfYmFzZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb250ZXh0dWFsX21lbnVfYm90dG9tX2JyaWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb250ZXh0dWFsX21lbnVfdG9wX2RhcmsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGVmYXVsdF93YWxscGFwZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGlhbG9nX2RpdmlkZXJfaG9yaXpvbnRhbF9saWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkaWFsb2dfZnJhbWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGl2aWRlcl9ob3Jpem9udGFsX2JyaWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkaXZpZGVyX2hvcml6b250YWxfZGFyawotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkaXZpZGVyX2hvcml6b250YWxfZGltX2RhcmsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGl2aWRlcl9ob3Jpem9udGFsX3RleHRmaWVsZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkaXZpZGVyX3ZlcnRpY2FsX2JyaWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBlZGl0X3RleHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZWRpdGJveF9iYWNrZ3JvdW5kCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGVkaXRib3hfYmFja2dyb3VuZF9mb2N1c195ZWxsb3cKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZWRpdGJveF9iYWNrZ3JvdW5kX25vcm1hbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBlZGl0Ym94X2Ryb3Bkb3duX2Fycm93ZG93bgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBlZGl0Ym94X2Ryb3Bkb3duX2Fycm93dXAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZWRpdGJveF9kcm9wZG93bl9iYWNrZ3JvdW5kCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGVkaXRib3hfZHJvcGRvd25fYmFja2dyb3VuZF9kYXJrCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGVkaXRib3hfZHJvcGRvd25fZGFya19mcmFtZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBlZGl0Ym94X2Ryb3Bkb3duX2xpZ2h0X2ZyYW1lCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGV4cGFuZGVyX2dyb3VwCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGV4cGFuZGVyX2ljX21heGltaXplZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBleHBhbmRlcl9pY19taW5pbWl6ZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZm9jdXNlZF9hcHBsaWNhdGlvbl9iYWNrZ3JvdW5kX3N0YXRpYwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBmcmFtZV9nYWxsZXJ5X3RodW1iCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGZyYW1lX2dhbGxlcnlfdGh1bWJfcHJlc3NlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBmcmFtZV9nYWxsZXJ5X3RodW1iX3NlbGVjdGVkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGdhbGxlcnlfaXRlbV9iYWNrZ3JvdW5kCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGdhbGxlcnlfc2VsZWN0ZWRfZGVmYXVsdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBnYWxsZXJ5X3NlbGVjdGVkX2ZvY3VzZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZ2FsbGVyeV9zZWxlY3RlZF9wcmVzc2VkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGdhbGxlcnlfdGh1bWIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZ2FsbGVyeV91bnNlbGVjdGVkX2RlZmF1bHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZ2FsbGVyeV91bnNlbGVjdGVkX3ByZXNzZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZ3JleV9saXN0X3NlcGFyYXRvcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBncmlkX3NlbGVjdG9yX2JhY2tncm91bmQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZ3JpZF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGdyaWRfc2VsZWN0b3JfYmFja2dyb3VuZF9wcmVzc2VkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGhpZ2hsaWdodF9kaXNhYmxlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBoaWdobGlnaHRfZGlzYWJsZWRfcHJlc3NlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBoaWdobGlnaHRfcHJlc3NlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBoaWdobGlnaHRfcHJlc3NlZF9kaW1tZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaGlnaGxpZ2h0X3NlbGVjdGVkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX2J1bGxldF9rZXlfcGVybWlzc2lvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19jaGVja19tYXJrX2RhcmsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfY2hlY2tfbWFya19saWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19kZWxldGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfZGlhbG9nX2FsZXJ0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX2RpYWxvZ19kaWFsZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfZGlhbG9nX2VtYWlsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX2RpYWxvZ19pbmZvCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX2RpYWxvZ19tYXAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfZGlhbG9nX21lbnVfZ2VuZXJpYwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19kaWFsb2dfdGltZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19lbWVyZ2VuY3kKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfaW5wdXRfYWRkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX2lucHV0X2RlbGV0ZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19pbnB1dF9nZXQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfbGF1bmNoZXJfYW5kcm9pZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19sb2NrX2lkbGVfYWxhcm0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfbG9ja19pZGxlX2NoYXJnaW5nCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX2xvY2tfaWRsZV9sb2NrCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX2xvY2tfaWRsZV9sb3dfYmF0dGVyeQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19sb2NrX2xvY2sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfbG9ja19wb3dlcl9vZmYKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfbG9ja19zaWxlbnRfbW9kZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19sb2NrX3NpbGVudF9tb2RlX29mZgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19tYXBzX2luZGljYXRvcl9jdXJyZW50X3Bvc2l0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX21hcHNfaW5kaWNhdG9yX2N1cnJlbnRfcG9zaXRpb25fYW5pbQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19tYXBzX2luZGljYXRvcl9jdXJyZW50X3Bvc2l0aW9uX2FuaW0xCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX21hcHNfaW5kaWNhdG9yX2N1cnJlbnRfcG9zaXRpb25fYW5pbTIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfbWFwc19pbmRpY2F0b3JfY3VycmVudF9wb3NpdGlvbl9hbmltMwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19tZWRpYV9mZgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19tZWRpYV9uZXh0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX21lZGlhX3BhdXNlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX21lZGlhX3BsYXkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfbWVkaWFfcHJldmlvdXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfbWVkaWFfcmV3Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX21lbnVfYWRkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX21lbnVfYWdlbmRhCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX21lbnVfYWx3YXlzX2xhbmRzY2FwZV9wb3J0cmFpdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19tZW51X2NhbGwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfbWVudV9jYW1lcmEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfbWVudV9jbG9zZV9jbGVhcl9jYW5jZWwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfbWVudV9jb21wYXNzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX21lbnVfY3JvcAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19tZW51X2RheQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19tZW51X2RlbGV0ZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19tZW51X2RpcmVjdGlvbnMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfbWVudV9lZGl0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX21lbnVfZ2FsbGVyeQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19tZW51X2hlbHAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfbWVudV9pbmZvX2RldGFpbHMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfbWVudV9tYW5hZ2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfbWVudV9tYXBtb2RlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX21lbnVfbW9udGgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfbWVudV9tb3JlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX21lbnVfbXlfY2FsZW5kYXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfbWVudV9teWxvY2F0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX21lbnVfbXlwbGFjZXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfbWVudV9wcmVmZXJlbmNlcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19tZW51X3JlY2VudF9oaXN0b3J5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX21lbnVfcmVwb3J0X2ltYWdlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX21lbnVfcmV2ZXJ0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX21lbnVfcm90YXRlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX21lbnVfc2F2ZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19tZW51X3NlYXJjaAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19tZW51X3NlbmQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfbWVudV9zZXRfYXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfbWVudV9zaGFyZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19tZW51X3NsaWRlc2hvdwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19tZW51X3NvcnRfYWxwaGFiZXRpY2FsbHkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfbWVudV9zb3J0X2J5X3NpemUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfbWVudV90b2RheQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19tZW51X3VwbG9hZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19tZW51X3VwbG9hZF95b3VfdHViZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19tZW51X3ZpZXcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfbWVudV93ZWVrCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX21lbnVfem9vbQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19ub3RpZmljYXRpb25fY2xlYXJfYWxsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX25vdGlmaWNhdGlvbl9vdmVybGF5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX3BhcnRpYWxfc2VjdXJlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX3BvcHVwX2Rpc2tfZnVsbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19wb3B1cF9yZW1pbmRlcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19wb3B1cF9zeW5jCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX3BvcHVwX3N5bmNfMQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19wb3B1cF9zeW5jXzIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfcG9wdXBfc3luY18zCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX3BvcHVwX3N5bmNfNAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19wb3B1cF9zeW5jXzUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfcG9wdXBfc3luY182Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX3Bvd2VyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX3NlYXJjaF9jYXRlZ29yeV9kZWZhdWx0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX3NlY3VyZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY19zZXR0aW5nc19pbmRpY2F0b3JfbmV4dF9wYWdlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX3RleHRfZG90Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX3ZpYnJhdGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfdm9sdW1lCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljX3ZvbHVtZV9vZmYKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNfdm9sdW1lX29mZl9zbWFsbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY192b2x1bWVfc21hbGwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNvbl9oaWdobGlnaHRfcmVjdGFuZ2xlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljb25faGlnaGxpZ2h0X3NxdWFyZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpbmRpY2F0b3JfY2hlY2tfbWFya19kYXJrCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGluZGljYXRvcl9jaGVja19tYXJrX2xpZ2h0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGluZGljYXRvcl9jb2RlX2xvY2tfZHJhZ19kaXJlY3Rpb25fZ3JlZW5fdXAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaW5kaWNhdG9yX2NvZGVfbG9ja19kcmFnX2RpcmVjdGlvbl9yZWRfdXAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaW5kaWNhdG9yX2NvZGVfbG9ja19wb2ludF9hcmVhX2RlZmF1bHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaW5kaWNhdG9yX2NvZGVfbG9ja19wb2ludF9hcmVhX2dyZWVuCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGluZGljYXRvcl9jb2RlX2xvY2tfcG9pbnRfYXJlYV9yZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaW5kaWNhdG9yX2lucHV0X2Vycm9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGluZGljYXRvcl9zaG93X2N1cnJlbnRfc2VsZWN0ZWRfZGFyawotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBsaXN0X2hpZ2hsaWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBsaXN0X2hpZ2hsaWdodF9hY3RpdmUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGlzdF9oaWdobGlnaHRfaW5hY3RpdmUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kaXNhYmxlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBsaXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2xvbmdwcmVzcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBsaXN0X3NlbGVjdG9yX2JhY2tncm91bmRfcHJlc3NlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBsaXN0X3NlbGVjdG9yX2JhY2tncm91bmRfdHJhbnNpdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBsb2FkX2F2ZXJhZ2VfYmFja2dyb3VuZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBsb2FkaW5nX3RpbGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbG9ja19hc3NldAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBtYXBzX2dvb2dsZV9sb2dvCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1lZGlhX2J1dHRvbl9iYWNrZ3JvdW5kCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1lbnVfYmFja2dyb3VuZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBtZW51X2JhY2tncm91bmRfZmlsbF9wYXJlbnRfd2lkdGgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbWVudV9mcmFtZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBtZW51X2Z1bGxfZnJhbWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbWVudV9zZWxlY3RvcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBtZW51X3NlcGFyYXRvcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBtZW51X3N1Ym1lbnVfYmFja2dyb3VuZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBtZW51aXRlbV9iYWNrZ3JvdW5kCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1lbnVpdGVtX2JhY2tncm91bmRfZm9jdXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbWVudWl0ZW1fYmFja2dyb3VuZF9wcmVzc2VkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1lbnVpdGVtX2JhY2tncm91bmRfc29saWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbWVudWl0ZW1fYmFja2dyb3VuZF9zb2xpZF9mb2N1c2VkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1lbnVpdGVtX2JhY2tncm91bmRfc29saWRfcHJlc3NlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBtZW51aXRlbV9jaGVja2JveAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBtZW51aXRlbV9jaGVja2JveF9vbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBub190aWxlXzEyOAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwYWRsb2NrCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBhbmVsX2JhY2tncm91bmQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGFuZWxfcGljdHVyZV9mcmFtZV9iYWNrZ3JvdW5kCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBhbmVsX3BpY3R1cmVfZnJhbWVfYmdfZGlzYWJsZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGFuZWxfcGljdHVyZV9mcmFtZV9iZ19mb2N1c19ibHVlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBhbmVsX3BpY3R1cmVfZnJhbWVfYmdfbm9ybWFsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBhbmVsX3BpY3R1cmVfZnJhbWVfYmdfcHJlc3NlZF9ibHVlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBhbmVsX3NlcGFyYXRvcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwaWNrZXJib3gKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGlja2VyYm94X2JhY2tncm91bmQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGlja2VyYm94X2RpdmlkZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGlja2VyYm94X3NlbGVjdGVkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBpY2tlcmJveF91bnNlbGVjdGVkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBpY3R1cmVfZW1lcmdlbmN5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBpY3R1cmVfZnJhbWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcG9wdXBfYm90dG9tX2JyaWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwb3B1cF9ib3R0b21fZGFyawotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwb3B1cF9ib3R0b21fbWVkaXVtCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBvcHVwX2NlbnRlcl9icmlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcG9wdXBfY2VudGVyX2RhcmsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcG9wdXBfY2VudGVyX21lZGl1bQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwb3B1cF9kaXZpZGVyX2hvcml6b250YWxfZGFyawotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwb3B1cF9mdWxsX2JyaWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwb3B1cF9mdWxsX2RhcmsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcG9wdXBfaW5saW5lX2Vycm9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBvcHVwX3RvcF9icmlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcG9wdXBfdG9wX2RhcmsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJlc2VuY2VfYXdheQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcmVzZW5jZV9idXN5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByZXNlbmNlX2ludmlzaWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcmVzZW5jZV9vZmZsaW5lCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByZXNlbmNlX29ubGluZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcmVzc2VkX2FwcGxpY2F0aW9uX2JhY2tncm91bmRfc3RhdGljCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByb2dyZXNzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByb2dyZXNzX2NpcmN1bGFyX2JhY2tncm91bmQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJvZ3Jlc3NfY2lyY3VsYXJfYmFja2dyb3VuZF9zbWFsbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcm9ncmVzc19jaXJjdWxhcl9pbmRldGVybWluYXRlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByb2dyZXNzX2NpcmN1bGFyX2luZGV0ZXJtaW5hdGVfc21hbGwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJvZ3Jlc3NfZnJhbWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJvZ3Jlc3NfaG9yaXpvbnRhbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcm9ncmVzc19pbmRldGVybWluYXRlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByb2dyZXNzX2luZGV0ZXJtaW5hdGVfaG9yaXpvbnRhbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcm9ncmVzc19pbmRldGVybWluYXRlX3NtYWxsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByb2dyZXNzX2lubmVyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByb2dyZXNzX2xhcmdlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByb2dyZXNzX21lZGl1bQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcm9ncmVzc19wYXJ0aWNsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcm9ncmVzc19wYXJ0aWNsZV9zbWFsbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcm9ncmVzc19zbWFsbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcm9ncmVzc19zbWFsbF90aXRsZWJhcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcm9ncmVzc2Jhcl9pbmRldGVybWluYXRlMQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcm9ncmVzc2Jhcl9pbmRldGVybWluYXRlMgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcm9ncmVzc2Jhcl9pbmRldGVybWluYXRlMwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCByYWRpb2J1dHRvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCByYWRpb2J1dHRvbl9iYWNrZ3JvdW5kCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHJhZGlvYnV0dG9uX2xhYmVsX2JhY2tncm91bmQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcmFkaW9idXR0b25fb2ZmX2JhY2tncm91bmQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcmFkaW9idXR0b25fb2ZmX2JhY2tncm91bmRfZm9jdXNfeWVsbG93Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHJhZGlvYnV0dG9uX29uX2JhY2tncm91bmQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcmFkaW9idXR0b25fb25fYmFja2dyb3VuZF9mb2N1c195ZWxsb3cKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcmF0ZV9zdGFyX2JpZ19oYWxmCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHJhdGVfc3Rhcl9iaWdfb2ZmCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHJhdGVfc3Rhcl9iaWdfb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcmF0ZV9zdGFyX3NtYWxsX2hhbGYKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcmF0ZV9zdGFyX3NtYWxsX29mZgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCByYXRlX3N0YXJfc21hbGxfb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcmF0aW5nYmFyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHJhdGluZ2Jhcl9mdWxsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHJhdGluZ2Jhcl9zbWFsbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCByZXRpY2xlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNhZmVfbW9kZV9iYWNrZ3JvdW5kCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNjcmVlbl9iYWNrZ3JvdW5kX2RhcmsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2NyZWVuX2JhY2tncm91bmRfbGlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2NyZWVuX3Byb2dyZXNzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNjcmVlbl9wcm9ncmVzc19mcmFtZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzY3JlZW5fcHJvZ3Jlc3NfaW5uZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2NyZWVuX3RpdGxlX2JhY2tncm91bmQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2Nyb2xsX3RodW1iX2hvcnoKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2Nyb2xsX3RodW1iX3ZlcnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2Nyb2xsYmFyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNjcm9sbGJhcl9oYW5kbGVfYWNjZWxlcmF0ZWRfYW5pbTIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2Nyb2xsYmFyX2hhbmRsZV9ob3Jpem9udGFsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNjcm9sbGJhcl9oYW5kbGVfdmVydGljYWwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2Nyb2xsYmFyX2hvcml6b250YWwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2Nyb2xsYmFyX3ZlcnRpY2FsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNlYXJjaF9iYXJfZGVmYXVsdF9jb2xvcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzZWFyY2hfcGxhdGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2Vla190aHVtYgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzZWxlY3RlZF9kYXlfYmFja2dyb3VuZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzZXR0aW5nc19oZWFkZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2V0dGluZ3NfaGVhZGVyX3JhdwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzcGlubmVyX2JhY2tncm91bmQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3Bpbm5lcl9kcm9wZG93bl9iYWNrZ3JvdW5kCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNwaW5uZXJfZHJvcGRvd25fYmFja2dyb3VuZF9kb3duCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNwaW5uZXJfZHJvcGRvd25fYmFja2dyb3VuZF91cAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzcGlubmVyX25vcm1hbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzcGlubmVyX3ByZXNzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNwaW5uZXJfc2VsZWN0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNwaW5uZXJib3hfYXJyb3dfZmlyc3QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3Bpbm5lcmJveF9hcnJvd19sYXN0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNwaW5uZXJib3hfYXJyb3dfbWlkZGxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNwaW5uZXJib3hfYXJyb3dfc2luZ2xlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNwaW5uZXJib3hfYXJyb3dzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNwaW5uZXJib3hfYmFja2dyb3VuZF9mb2N1c195ZWxsb3cKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3Bpbm5lcmJveF9iYWNrZ3JvdW5kX25vcm1hbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzcGlubmVyYm94X2JhY2tncm91bmRfcHJlc3NlZF95ZWxsb3cKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3Rhcl9iaWdfb2ZmCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXJfYmlnX29uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXJfb2ZmCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXJfb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhcnRpbmdfZnJhbWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdF9ub3RpZnlfYWxhcm0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdF9ub3RpZnlfYnJvd3NlcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0X25vdGlmeV9jYWxpYnJhdGVfY29tcGFzcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0X25vdGlmeV9jYWxsX211dGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdF9ub3RpZnlfY2hhdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0X25vdGlmeV9kaXNrX2Z1bGwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdF9ub3RpZnlfZXJyb3IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdF9ub3RpZnlfbWlzc2VkX2NhbGwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdF9ub3RpZnlfbW9yZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0X25vdGlmeV9zZGNhcmQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdF9ub3RpZnlfc2RjYXJkX3VzYgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0X25vdGlmeV9zeW5jCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXRfbm90aWZ5X3N5bmNfYW5pbTAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdF9ub3RpZnlfc3luY19lcnJvcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0X25vdGlmeV9zeW5jX25vYW5pbQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0X25vdGlmeV92b2ljZW1haWwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdF9ub3RpZnlfd2lmaV9pbl9yYW5nZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0X25vdGlmeV94bXBwCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXRfc3lzX2JhdHRlcnkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdF9zeXNfYmF0dGVyeV8wCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXRfc3lzX2JhdHRlcnlfMTAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdF9zeXNfYmF0dGVyeV8xMDAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdF9zeXNfYmF0dGVyeV8yMAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0X3N5c19iYXR0ZXJ5XzQwCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXRfc3lzX2JhdHRlcnlfNjAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdF9zeXNfYmF0dGVyeV84MAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0X3N5c19iYXR0ZXJ5X2NoYXJnZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0X3N5c19iYXR0ZXJ5X2NoYXJnZV9hbmltMAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0X3N5c19iYXR0ZXJ5X2NoYXJnZV9hbmltMQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0X3N5c19iYXR0ZXJ5X2NoYXJnZV9hbmltMgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0X3N5c19iYXR0ZXJ5X2NoYXJnZV9hbmltMwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0X3N5c19iYXR0ZXJ5X2NoYXJnZV9hbmltNAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0X3N5c19iYXR0ZXJ5X2NoYXJnZV9hbmltNQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0X3N5c19iYXR0ZXJ5X3Vua25vd24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdF9zeXNfZGF0YV9ibHVldG9vdGgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdF9zeXNfZGF0YV9ibHVldG9vdGhfY29ubmVjdGVkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXRfc3lzX2RhdGFfY29ubmVjdGVkXzNnCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfZwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0X3N5c19kYXRhX2luXzNnCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXRfc3lzX2RhdGFfaW5fZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0X3N5c19kYXRhX2luX2cKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdF9zeXNfZGF0YV9pbmFuZG91dF8zZwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0X3N5c19kYXRhX2luYW5kb3V0X2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdF9zeXNfZGF0YV9pbmFuZG91dF9nCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXRfc3lzX2RhdGFfb3V0XzNnCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXRfc3lzX2RhdGFfb3V0X2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdF9zeXNfZGF0YV9vdXRfZwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0X3N5c19kb3dubG9hZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0X3N5c19kb3dubG9hZF9hbmltMAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0X3N5c19kb3dubG9hZF9hbmltMQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0X3N5c19kb3dubG9hZF9hbmltMgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0X3N5c19kb3dubG9hZF9hbmltMwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0X3N5c19kb3dubG9hZF9hbmltNAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0X3N5c19kb3dubG9hZF9hbmltNQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0X3N5c19kb3dubG9hZF9kb25lCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXRfc3lzX2dwc19hY3F1aXJpbmcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdF9zeXNfZ3BzX2FjcXVpcmluZ19hbmltCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXRfc3lzX2dwc19vbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0X3N5c19oZWFkc2V0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXRfc3lzX25vX3NpbQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0X3N5c19waG9uZV9jYWxsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXRfc3lzX3Bob25lX2NhbGxfZm9yd2FyZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0X3N5c19waG9uZV9jYWxsX29uX2hvbGQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdF9zeXNfcl9zaWduYWxfMAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0X3N5c19yX3NpZ25hbF8xCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXRfc3lzX3Jfc2lnbmFsXzIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdF9zeXNfcl9zaWduYWxfMwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0X3N5c19yX3NpZ25hbF80Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXRfc3lzX3Jpbmdlcl9zaWxlbnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdF9zeXNfcmluZ2VyX3ZpYnJhdGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdF9zeXNfc2lnbmFsXzAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdF9zeXNfc2lnbmFsXzEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdF9zeXNfc2lnbmFsXzIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdF9zeXNfc2lnbmFsXzMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdF9zeXNfc2lnbmFsXzQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdF9zeXNfc2lnbmFsX2ZsaWdodG1vZGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdF9zeXNfc2lnbmFsX251bGwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdF9zeXNfc3BlYWtlcnBob25lCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXRfc3lzX3VwbG9hZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0X3N5c191cGxvYWRfYW5pbTAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdF9zeXNfdXBsb2FkX2FuaW0xCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXRfc3lzX3VwbG9hZF9hbmltMgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0X3N5c191cGxvYWRfYW5pbTMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdF9zeXNfdXBsb2FkX2FuaW00Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXRfc3lzX3VwbG9hZF9hbmltNQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0X3N5c191cGxvYWRfZG9uZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0X3N5c193YXJuaW5nCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXRfc3lzX3dpZmlfc2lnbmFsXzAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdF9zeXNfd2lmaV9zaWduYWxfMQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0X3N5c193aWZpX3NpZ25hbF8yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXRfc3lzX3dpZmlfc2lnbmFsXzMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdF9zeXNfd2lmaV9zaWduYWxfNAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0dXNfYmFyX2JhY2tncm91bmQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdHVzX2Jhcl9jbG9zZV9vbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0dXNfYmFyX2Nsb3NlZF9kZWZhdWx0X2JhY2tncm91bmQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdHVzX2Jhcl9kaXZpZGVyX3NoYWRvdwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0dXNfYmFyX2l0ZW1fYXBwX2JhY2tncm91bmQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdHVzX2Jhcl9pdGVtX2FwcF9iYWNrZ3JvdW5kX25vcm1hbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0dXNfYmFyX2l0ZW1fYmFja2dyb3VuZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0dXNfYmFyX2l0ZW1fYmFja2dyb3VuZF9mb2N1cwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0dXNfYmFyX2l0ZW1fYmFja2dyb3VuZF9ub3JtYWwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdHVzX2Jhcl9pdGVtX2JhY2tncm91bmRfcHJlc3NlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0dXNfYmFyX2l0ZW1fY2xlYXJfYmFja2dyb3VuZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0dXNfYmFyX29wZW5lZF9kZWZhdWx0X2JhY2tncm91bmQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdHVzX2Jhcl9zaGFkb3dfYmFyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXR1c19pY29uX2JhY2tncm91bmQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdHVzYmFyX2JhY2tncm91bmQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3ViX21lbnVfYm90dG9tX2JyaWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdWJfbWVudV90b3BfZGFyawotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdWJtZW51X2Fycm93Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN1Ym1lbnVfYXJyb3dfYmFjawotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdWJtZW51X2Fycm93X2ZvY3VzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN1Ym1lbnVfYXJyb3dfbm9mb2N1cwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzeW1fYWN0aW9uX2NhbGwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3ltX2FjdGlvbl9jaGF0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN5bV9hY3Rpb25fZW1haWwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3ltX2FjdGlvbl9tYXAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3ltX2FjdGlvbl9zbXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3ltX2JhdHRlcnlfd2hpdGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3ltX2NhbGxfaW5jb21pbmcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3ltX2NhbGxfbWlzc2VkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN5bV9jYWxsX291dGdvaW5nCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN5bV9jb250YWN0X2NhcmQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3ltX2RlZl9hcHBfaWNvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzeW1fZGVmYXVsdF9udW1iZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGFiX2JvdHRvbV9sZWZ0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRhYl9ib3R0b21fcmlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGFiX2JvdHRvbV9zaGFkb3cKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGFiX2ZvY3VzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRhYl9mb2N1c19iYXJfbGVmdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0YWJfZm9jdXNfYmFyX3JpZ2h0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRhYl9pbmRpY2F0b3IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGFiX3ByZXNzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRhYl9wcmVzc19iYXJfbGVmdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0YWJfcHJlc3NfYmFyX3JpZ2h0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRhYl9zZWxlY3RlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0YWJfc2VsZWN0ZWRfYmFyX2xlZnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGFiX3NlbGVjdGVkX2Jhcl9yaWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0YWJfc2VsZWN0ZWRfaGlnaGxpZ2h0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRhYl91bnNlbGVjdGVkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRhYl91bnNlbGVjdGVkX2xvbmdwcmVzcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0YWJfdW5zZWxlY3RlZF9wcmVzc2VkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRhYl91bnNlbGVjdGVkX3NlbGVjdGVkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRleHRmaWVsZF9kZWZhdWx0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRleHRmaWVsZF9kaXNhYmxlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0ZXh0ZmllbGRfZGlzYWJsZWRfc2VsZWN0ZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGV4dGZpZWxkX2V4cGFuZGVkX2JvdHRvbV9zZWxlY3RlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0ZXh0ZmllbGRfZXhwYW5kZWRfYm90dG9tX3Vuc2VsZWN0ZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGV4dGZpZWxkX2V4cGFuZGVkX2NlbnRlcl9zZWxlY3RlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0ZXh0ZmllbGRfZXhwYW5kZWRfY2VudGVyX3Vuc2VsZWN0ZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGV4dGZpZWxkX2V4cGFuZGVkX3RvcF9zZWxlY3RlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0ZXh0ZmllbGRfZXhwYW5kZWRfdG9wX3Vuc2VsZWN0ZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGV4dGZpZWxkX3ByZXNzZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGV4dGZpZWxkX3NlbGVjdGVkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRpbWVwaWNrZXJfZG93bl9idG4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGltZXBpY2tlcl9kb3duX2Rpc2FibGVkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRpbWVwaWNrZXJfZG93bl9kaXNhYmxlZF9mb2N1c2VkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRpbWVwaWNrZXJfZG93bl9ub3JtYWwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGltZXBpY2tlcl9kb3duX3ByZXNzZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGltZXBpY2tlcl9kb3duX3NlbGVjdGVkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRpbWVwaWNrZXJfaW5wdXQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGltZXBpY2tlcl9pbnB1dF9kaXNhYmxlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0aW1lcGlja2VyX2lucHV0X25vcm1hbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0aW1lcGlja2VyX2lucHV0X3ByZXNzZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGltZXBpY2tlcl9pbnB1dF9zZWxlY3RlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0aW1lcGlja2VyX3VwX2J0bgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0aW1lcGlja2VyX3VwX2Rpc2FibGVkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRpbWVwaWNrZXJfdXBfZGlzYWJsZWRfZm9jdXNlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0aW1lcGlja2VyX3VwX25vcm1hbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0aW1lcGlja2VyX3VwX3ByZXNzZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGltZXBpY2tlcl91cF9zZWxlY3RlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0aXRsZV9iYXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGl0bGVfYmFyX3NoYWRvdwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0b2FzdF9mcmFtZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB1bmtub3duX2ltYWdlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHpvb21faW4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgem9vbV9pbl9wcmVzc2VkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHpvb21faW5kaWNhdG9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHpvb21faW5kaWNhdG9yX3NlbGVjdGVkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHpvb21fb3V0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHpvb21fb3V0X3ByZXNzZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgem9vbV9wbGF0ZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB6b29tX3RyYWNrCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvUjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNSBuYW1lID1pZCApCi1wdWJsaWMgZmluYWwgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwuUiRpZCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV8wCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfMQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFXzIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV8zCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfNAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFXzUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV82Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfNwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFXzgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV85Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfQQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFX0FMVF9MRUZUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfQUxUX1JJR0hUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfQVBPU1RST1BIRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFX0FUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfQgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFX0JBQ0sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9CQUNLU0xBU0gKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9DCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfQ0FMTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFX0NBTUVSQQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFX0NMRUFSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfQ09NTUEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9ECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfREVMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfRFBBRF9DRU5URVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9EUEFEX0RPV04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9EUEFEX0xFRlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9EUEFEX1JJR0hUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfRFBBRF9VUAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFX0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9FTkRDQUxMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfRU5URVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9FTlZFTE9QRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFX0VRVUFMUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFX0VYUExPUkVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfRgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFX0ZPQ1VTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfRwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFX0dSQVZFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfSAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFX0hFQURTRVRIT09LCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfSE9NRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFX0kKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9KCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfSwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFX0wKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9MRUZUX0JSQUNLRVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9NCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfTUVOVQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFX01JTlVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFX05PVElGSUNBVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFX05VTQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFX08KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9QCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfUEVSSU9ECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfUExVUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFX1BPVU5ECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfUE9XRVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9RCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFX1JJR0hUX0JSQUNLRVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9TCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfU0VBUkNICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfU0VNSUNPTE9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfU0hJRlRfTEVGVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFX1NISUZUX1JJR0hUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfU0xBU0gKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9TT0ZUX0xFRlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9TT0ZUX1JJR0hUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfU1BBQ0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9TVEFSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfU1lNCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFX1RBQgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFX1UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9VTktOT1dOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfVgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFX1ZPTFVNRV9ET1dOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfVk9MVU1FX1VQCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfVwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFX1gKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9ZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfWgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBhZnRlckRlc2NlbmRhbnRzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGFsYXJtCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGFsZXJ0VGl0bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYWxsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGFsdGVybmF0aXZlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGFsd2F5c1Njcm9sbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBhbHdheXNVc2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYW1QbQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBhbmltYXRpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYXJyb3cKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYXV0bwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBhdXRvX2ZpdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBiYWNrZ3JvdW5kCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJhY2tzcGFjZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBiYXR0ZXJ5SW5mbwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBiYXR0ZXJ5SW5mb0ljb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYmF0dGVyeUluZm9TcGFjZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYmF0dGVyeUluZm9UZXh0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJlZm9yZURlc2NlbmRhbnRzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJlaGluZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBibG9ja3NEZXNjZW5kYW50cwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBib2R5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJvbGQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYm90dG9tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJvdHRvbV90b190b3AKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYnV0dG9uMQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBidXR0b24yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ1dHRvbjMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYnV0dG9uNAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBidXR0b241Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJ1dHRvbjYKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYnV0dG9uUGFuZWwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY2FuY2VsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNhdGVnb3J5X2Rlc2NyaXB0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNhdGVnb3J5X25hbWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY2VudGVyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNlbnRlckNyb3AKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY2VudGVySW5zaWRlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNlbnRlcl9ob3Jpem9udGFsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNlbnRlcl92ZXJ0aWNhbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjaGFyYWN0ZXJQaWNrZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY2hhcmFjdGVycwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjaGVjawotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjaGVja2JveAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjbGFtcAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjbGVhckRlZmF1bHRIaW50Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNsZWFyX2FsbF9idXR0b24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY2xvc2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY29sbGFwc2luZwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb2x1bW4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY29sdW1uV2lkdGgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY29udGFpbmVyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNvbnRlbnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY29udGVudFBhbmVsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGN1c3RvbQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjdXN0b21QYW5lbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjeWNsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkYW5nZXJvdXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGFuZ2Vyb3VzX3Blcm1zX2xpc3QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGF0ZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkYXRlUGlja2VyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGRheQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkZWNpbWFsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGRlY3JlbWVudAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkaXNhYmxlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBlZGl0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGVkaXRhYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGVkaXR0ZXh0X2NvbnRhaW5lcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBlaWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBlbWFpbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBlbWVyZ2VuY3lDYWxsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGVtZXJnZW5jeUNhbGxBbG9uZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBlbWVyZ2VuY3lDYWxsQnV0dG9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGVtZXJnZW5jeUNhbGxUb2dldGhlcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBlbXB0eQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBlbmQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZXhwYW5kZWRfbWVudQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBmZndkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGZpbGwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZmlsbF9ob3Jpem9udGFsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGZpbGxfcGFyZW50Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGZpbGxfdmVydGljYWwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZml0Q2VudGVyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGZpdEVuZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBmaXRTdGFydAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBmaXRYWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBmaXZlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGZvbnRTY2FsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBmb290ZXJGb3Jnb3RQYXR0ZXJuCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGZvb3Rlck5vcm1hbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBmb3Jnb3RQYXR0ZXJuCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGZvdXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZnJhbWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZ29uZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBoZWFkZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaGVhZGVyU2ltQmFkMQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBoZWFkZXJTaW1CYWQyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGhlYWRlclNpbU9rMQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBoZWFkZXJTaW1PazIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaGVhZGVyVGV4dAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBoaWdoCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGhpbnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaG9yaXpvbnRhbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBob3VyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNvbjEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNvbjIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNvbl9tZW51Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljb25zCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGltYWdlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGluY3JlbWVudAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpbmRleAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpbmZpbml0ZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpbnB1dAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpbnNpZGVJbnNldAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpbnNpZGVPdmVybGF5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGluc3RydWN0aW9ucwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpbnRlZ2VyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGludmlzaWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpdGFsaWMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQga2V5Ym9hcmQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQga2V5Ym9hcmRIaWRkZW4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQga2V5Z3VhcmQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGFiZWwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGFuZHNjYXBlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxhdGVzdEl0ZW1zCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxhdGVzdFRpdGxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxlZnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGVmdFNwYWNlcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBsZWZ0X2ljb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGVmdF90b19yaWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBsZXZlbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBsZXZlbF9wZXJjZW50Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxpbmUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGluZWFyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxpc3QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGlzdHZpZXcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbG9jYWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxvY2tJbnN0cnVjdGlvbnMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbG9ja1BhdHRlcm4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbG9ja19zY3JlZW4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbG9naW4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbG93Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1hcAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBtYXRyaXgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbWNjCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1lZGlhY29udHJvbGxlcl9wcm9ncmVzcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBtZW51Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1lc3NhZ2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbWV0ZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbWlkZGxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1pbnV0ZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBtaXJyb3IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbW5jCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1vbm9zcGFjZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBtb250aAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBtdWx0aXBsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBtdWx0aXBsZUNob2ljZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBtdXNpYwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBuYXZpZ2F0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG5leHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbmV4dEFsYXJtSW5mbwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBuZXh0QWxhcm1TcGFjZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbmV4dEFsYXJtVGV4dAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBuaW5lCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG5vTm90aWZpY2F0aW9uc1RpdGxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG5vX2FwcGxpY2F0aW9uc19tZXNzYWdlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG5vX3Blcm1pc3Npb25zCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG5vbl9kYW5nZXJvdXNfcGVybXNfbGlzdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBub25lCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG5vcm1hbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBub3NlbnNvcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBub3RpZmljYXRpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbm90aWZpY2F0aW9uSWNvbnMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbm90aWZpY2F0aW9uTGluZWFyTGF5b3V0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG51bWJlcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBvZmYKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgb2sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgb25lCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG9uZUxpbmUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgb25nb2luZ0l0ZW1zCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG9uZ29pbmdUaXRsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBvcmllbnRhdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBvdGhlcl9zdHJlYW1faWNvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBvdXRzaWRlSW5zZXQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgb3V0c2lkZU92ZXJsYXkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgb3ZhbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwYWRkaW5nCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBhcmVudAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwYXJlbnRQYW5lbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwYXNzd29yZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwYXVzZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtX2ljb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWlzc2lvbl9ncm91cAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtaXNzaW9uX2xpc3QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGhvbmUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGluRGlzcGxheQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwaW5EaXNwbGF5R3JvdXAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGxtbkxhYmVsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBvcnRyYWl0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByZXYKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJpbWFyeQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcm9ncmVzcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcm9ncmVzc19jaXJjdWxhcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcm9ncmVzc19ob3Jpem9udGFsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByb2dyZXNzX251bWJlcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcm9ncmVzc19wZXJjZW50Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHF1ZXJ5UmV3cml0ZUZyb21EYXRhCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHF1ZXJ5UmV3cml0ZUZyb21UZXh0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHJhZGlhbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCByYWRpbwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCByYWRpb19wb3dlcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCByYW5kb20KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcmVjdGFuZ2xlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHJlcGVhdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCByZXN0YXJ0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHJldmVyc2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcmV3Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHJpZ2h0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHJpZ2h0U3BhY2VyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHJpZ2h0X2NvbnRhaW5lcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCByaWdodF9pY29uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHJpZ2h0X3RvX2xlZnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcmluZwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCByaW5nZXJfc3RyZWFtX2ljb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcmluZ3RvbmUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcm93Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNhbnMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2NyZWVuTG9ja2VkSW5mbwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzY3JvbGwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2Nyb2xsVmlldwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzY3JvbGxpbmcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2VhcmNoX2FwcF9pY29uMQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzZWFyY2hfYXBwX3RleHQxCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNlYXJjaF9iYWRnZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzZWFyY2hfYmFyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNlYXJjaF9lZGl0X2ZyYW1lCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNlYXJjaF9nb19idG4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2VhcmNoX3NyY190ZXh0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNlYXJjaF9zdWdnZXN0X2xpc3QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2Vjb25kYXJ5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNlY29uZGFyeVByb2dyZXNzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNlZWtiYXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2VsZWN0X2RpYWxvZ19saXN0dmlldwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzZWxlY3RlZEljb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2Vuc29yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNlbnRlbmNlcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzZXBhcmF0b3IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2VyaWYKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2V0dGluZ19uYW1lCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNldHRpbmdfdmFsdWVfbGF5b3V0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNldHRpbmdfdmFsdWVfdGV4dAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzZXZlbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzaG9ydGN1dAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzaG93U2VhcmNoSWNvbkFzQmFkZ2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2hvd1NlYXJjaExhYmVsQXNCYWRnZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzaG93X21vcmUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2hvd19tb3JlX2ljb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2hvd19tb3JlX3RleHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2lnbmF0dXJlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNpZ25hdHVyZU9yU3lzdGVtCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNpZ25lZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzaWxlbnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2luZ2xlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNpbmdsZUNob2ljZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzaW5nbGVJbnN0YW5jZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzaW5nbGVUYXNrCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNpbmdsZVRvcAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzaXgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3BhY2VyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNwYWNlclRvcAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzcGFjaW5nV2lkdGgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3Bhbm5hYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNwbkxhYmVsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXJ0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXR1cwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0dXNJY29ucwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdWJ0aXRsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdW1tYXJ5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN3ZWVwCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN5c3RlbQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0YWJjb250ZW50Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRhYmhvc3QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGFicwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0ZXh0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRleHQxCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRleHQyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRocmVlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRpY2tlcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0aWNrZXJJY29uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRpY2tlclRleHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGltZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0aW1lUGlja2VyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRpbWVfY3VycmVudAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0aW1lcGlja2VyX2lucHV0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRpdGxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRpdGxlRGl2aWRlcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0aXRsZV9jb250YWluZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGl0bGVfdGVtcGxhdGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdG9nZ2xlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRvcAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0b3BIZWFkZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdG9wUGFuZWwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdG9wX3RvX2JvdHRvbQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0b3VjaHNjcmVlbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0d28KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdHdvTGluZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB1bmxvY2tMb2NrSWNvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB1bnNwZWNpZmllZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB1c2VEZWZhdWx0VGV4dAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB1c2VyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHZlcnRpY2FsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHZpc2libGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdm9pY2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgd2ViCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHdpZGdldF9mcmFtZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB3b3JkcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB3cmFwX2NvbnRlbnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgeWVhcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB6ZXJvCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHpvb21Db250cm9scwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB6b29tSW4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgem9vbU1hZ25pZnkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgem9vbU91dAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNSBuYW1lID1sYXlvdXQgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL1I7ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5SJGxheW91dCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYWN0aXZpdHlfbGlzdF9pdGVtCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGFsZXJ0X2RpYWxvZwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBhbGVydF9kaWFsb2dfcHJvZ3Jlc3MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYWx3YXlzX3VzZV9jaGVja2JveAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBhcHBfcGVybWlzc2lvbl9pdGVtCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGFwcF9wZXJtc19zdW1tYXJ5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGF1dG9fY29tcGxldGVfbGlzdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBiYXR0ZXJ5X2xvdwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBiYXR0ZXJ5X3N0YXR1cwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBicm93c2VyX2xpbmtfY29udGV4dF9oZWFkZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY2hhcmFjdGVyX3BpY2tlcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjaGFyYWN0ZXJfcGlja2VyX2J1dHRvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkYXRlX3BpY2tlcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkYXRlX3BpY2tlcl9kaWFsb2cKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGlhbG9nX2N1c3RvbV90aXRsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkaWFsb2dfdGl0bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGlhbG9nX3RpdGxlX2ljb25zCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGV4cGFuZGFibGVfbGlzdF9jb250ZW50Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGV4cGFuZGVkX21lbnVfbGF5b3V0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGdsb2JhbF9hY3Rpb25zX2l0ZW0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZ29vZ2xlX3dlYl9jb250ZW50X2hlbHBlcl9sYXlvdXQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNvbl9tZW51X2l0ZW1fbGF5b3V0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljb25fbWVudV9sYXlvdXQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQga2V5Z3VhcmQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQga2V5Z3VhcmRfc2NyZWVuX2dsb2dpbl91bmxvY2sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQga2V5Z3VhcmRfc2NyZWVuX2xvY2sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQga2V5Z3VhcmRfc2NyZWVuX3NpbV9waW5fbGFuZHNjYXBlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGtleWd1YXJkX3NjcmVlbl9zaW1fcGluX3BvcnRyYWl0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGtleWd1YXJkX3NjcmVlbl91bmxvY2tfbGFuZHNjYXBlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGtleWd1YXJkX3NjcmVlbl91bmxvY2tfcG9ydHJhaXQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGlzdF9jb250ZW50Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxpc3RfbWVudV9pdGVtX2NoZWNrYm94Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxpc3RfbWVudV9pdGVtX2ljb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGlzdF9tZW51X2l0ZW1fbGF5b3V0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxpc3RfbWVudV9pdGVtX3JhZGlvCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1lZGlhX2NvbnRyb2xsZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbWVudV9pdGVtCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1lbnVfaXRlbV9kaXZpZGVyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG51bWJlcl9waWNrZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbnVtYmVyX3BpY2tlcl9lZGl0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBvcHVwX21lbnVfbGF5b3V0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBvd2VyX2RpYWxvZwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcmVmZXJlbmNlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByZWZlcmVuY2VfY2F0ZWdvcnkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJlZmVyZW5jZV9jaGlsZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcmVmZXJlbmNlX2RpYWxvZ19lZGl0dGV4dAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcmVmZXJlbmNlX2luZm9ybWF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByZWZlcmVuY2VfbGlzdF9jb250ZW50Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByZWZlcmVuY2Vfd2lkZ2V0X2NoZWNrYm94Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByZWZlcmVuY2VzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByb2dyZXNzX2RpYWxvZwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCByZWNlbnRfYXBwc19kaWFsb2cKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcmVjZW50X2FwcHNfaWNvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCByZXNvbHZlX2xpc3RfaXRlbQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzYWZlX21vZGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2NyZWVuCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNjcmVlbl9jdXN0b21fdGl0bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2NyZWVuX3Byb2dyZXNzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNjcmVlbl9zaW1wbGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2NyZWVuX3RpdGxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNjcmVlbl90aXRsZV9pY29ucwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzZWFyY2hfYmFyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNlYXJjaF9kcm9wZG93bl9hcHBfc2VsZWN0b3IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2VhcmNoX2Ryb3Bkb3duX2l0ZW1fMWxpbmUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2VhcmNoX2Ryb3Bkb3duX2l0ZW1fMmxpbmUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2VhcmNoX2Ryb3Bkb3duX2l0ZW1faWNvbnNfMWxpbmUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2VhcmNoX2Ryb3Bkb3duX2l0ZW1faWNvbnNfMmxpbmUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2Vla2Jhcl9kaWFsb2cKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2VsZWN0X2RpYWxvZwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzZWxlY3RfZGlhbG9nX2l0ZW0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2VsZWN0X2RpYWxvZ19tdWx0aWNob2ljZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzZWxlY3RfZGlhbG9nX3NpbmdsZWNob2ljZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzZXR0aW5nX2xpc3RfY2F0ZWdvcnkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2V0dGluZ19saXN0X2V4cGFuZGVkX2NhdGVnb3J5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNldHRpbmdfbGlzdF9zZXR0aW5nCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNldHRpbmdfbGlzdF9zZXR0aW5nX3ZhbHVlX3RleHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2ltcGxlX2Ryb3Bkb3duX2hpbnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2ltcGxlX2Ryb3Bkb3duX2l0ZW1fMWxpbmUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2ltcGxlX2Ryb3Bkb3duX2l0ZW1fMmxpbmUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2ltcGxlX2V4cGFuZGFibGVfbGlzdF9pdGVtXzEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2ltcGxlX2V4cGFuZGFibGVfbGlzdF9pdGVtXzIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2ltcGxlX2dhbGxlcnlfaXRlbQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzaW1wbGVfbGlzdF9pdGVtXzEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2ltcGxlX2xpc3RfaXRlbV8yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNpbXBsZV9saXN0X2l0ZW1fY2hlY2tlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzaW1wbGVfbGlzdF9pdGVtX211bHRpcGxlX2Nob2ljZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzaW1wbGVfbGlzdF9pdGVtX3NpbmdsZV9jaG9pY2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2ltcGxlX3NwaW5uZXJfZHJvcGRvd25faXRlbQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzaW1wbGVfc3Bpbm5lcl9pdGVtCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXR1c19iYXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdHVzX2Jhcl9leHBhbmRlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0dXNfYmFyX2ljb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdHVzX2Jhcl9sYXRlc3RfZXZlbnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdHVzX2Jhcl9sYXRlc3RfZXZlbnRfY29udGVudAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0dXNfYmFyX3RyYWNraW5nCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN1Ym1lbnVfaXRlbQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0YWJfY29udGVudAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0YWJfaW5kaWNhdG9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRlc3RfbGlzdF9pdGVtCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRleHR2aWV3X2hpbnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGltZV9waWNrZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGltZV9waWNrZXJfZGlhbG9nCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRpbWVfcGlja2VyX3RleHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdHJhbnNpZW50X25vdGlmaWNhdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0d29fbGluZV9saXN0X2l0ZW0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdHlwaW5nX2ZpbHRlcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB2b2x1bWVfYWRqdXN0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHpvb21fY29udHJvbHMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgem9vbV9tYWduaWZ5Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvUjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNSBuYW1lID1wbHVyYWxzICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5SJHBsdXJhbHMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHdpZmlfYXZhaWxhYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHdpZmlfYXZhaWxhYmxlX2RldGFpbGVkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvUjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNSBuYW1lID1yYXcgKQotcHVibGljIGZpbmFsIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLlIkcmF3IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBmYWxsYmFja3JpbmcKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjUgbmFtZSA9c3RyaW5nICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC9SOyApCi1wdWJsaWMgZmluYWwgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwuUiRzdHJpbmcgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJhTW1pCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSVJEZWZhdWx0T2ZmTmV4dENhbGxPZmYKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJUkRlZmF1bHRPZmZOZXh0Q2FsbE9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSVJEZWZhdWx0T25OZXh0Q2FsbE9mZgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElSRGVmYXVsdE9uTmV4dENhbGxPbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElSUGVybWFuZW50Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENmTW1pCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENsaXBNbWkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ2xpck1taQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDd01taQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNaWRuaWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBOb29uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBpbk1taQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQd2RNbWkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVmlkZW9WaWV3X2Vycm9yX2J1dHRvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWaWRlb1ZpZXdfZXJyb3JfdGV4dF91bmtub3duCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZpZGVvVmlld19lcnJvcl90aXRsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBhYmJyZXZfbW9udGgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYWJicmV2X21vbnRoX2RheQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBhYmJyZXZfbW9udGhfZGF5X3llYXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYWJicmV2X21vbnRoX3llYXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYWN0aXZhdGVfa2V5Z3VhcmQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYWVycl9hcHBsaWNhdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBhZXJyX3Byb2Nlc3MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYWVycl90aXRsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBhZ28KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYWx3YXlzVXNlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGFtCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGFucl9hY3Rpdml0eV9hcHBsaWNhdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBhbnJfYWN0aXZpdHlfcHJvY2VzcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBhbnJfYXBwbGljYXRpb25fcHJvY2VzcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBhbnJfcHJvY2VzcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBhbnJfdGl0bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYmFkUGluCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJhZFB1awotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBiYXR0ZXJ5X2xvd19wZXJjZW50X2Zvcm1hdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBiYXR0ZXJ5X2xvd19zdWJ0aXRsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBiYXR0ZXJ5X2xvd190aXRsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBiYXR0ZXJ5X3N0YXR1c19jaGFyZ2luZwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBiYXR0ZXJ5X3N0YXR1c190ZXh0X3BlcmNlbnRfZm9ybWF0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJlZm9yZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBicm93c2VyU2F2ZWRGb3JtRGF0YQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBieXRlU2hvcnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY2FuY2VsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNhcGl0YWxfb2ZmCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNhcGl0YWxfb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY2ZSZWFzb25CdXN5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNmUmVhc29uTlIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY2ZSZWFzb25OUnkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY2ZSZWFzb25VbmNvbmRpdGlvbmFsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNmVGVtcGxhdGVGb3J3YXJkZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY2ZUZW1wbGF0ZUZvcndhcmRlZFRpbWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY2ZUZW1wbGF0ZU5vdEZvcndhcmRlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjZlRlbXBsYXRlUmVnaXN0ZXJlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjZlRlbXBsYXRlUmVnaXN0ZXJlZFRpbWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY2hvb3NlQWN0aXZpdHkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY2xlYXJEZWZhdWx0SGludE1zZwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb21wYXNzX2FjY3VyYWN5X2Jhbm5lcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb21wYXNzX2FjY3VyYWN5X25vdGlmaWNhY3Rpb25fYm9keQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb21wYXNzX2FjY3VyYWN5X25vdGlmaWNhY3Rpb25fdGl0bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY29udGVudFNlcnZpY2VTeW5jCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNvbnRlbnRTZXJ2aWNlU3luY0Vycm9yTm90aWZpY2F0aW9uRGVzYwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb250ZW50U2VydmljZVN5bmNOb3RpZmljYXRpb25EZXNjCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNvbnRlbnRTZXJ2aWNlU3luY05vdGlmaWNhdGlvblRpdGxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNvbnRlbnRTZXJ2aWNlVG9vTWFueURlbGV0ZXNOb3RpZmljYXRpb25EZXNjCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNvbnRlbnRTZXJ2aWNlWG1wcEF2YWlsYWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb3B5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNvcHlBbGwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY29weVVybAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjdXQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY3V0QWxsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGRhaWx5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGRhaWx5X2Zvcm1hdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkYXRlMV9kYXRlMgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkYXRlMV90aW1lMV9kYXRlMl90aW1lMgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkYXRlX3BpY2tlcl9tb250aAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkYXRlX3BpY2tlcl9zZXQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGF0ZV9yYW5nZV9zZXBhcmF0b3IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGF0ZV90aW1lX3NldAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkYXkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGF5X29mX3dlZWtfbG9uZ19mcmlkYXkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGF5X29mX3dlZWtfbG9uZ19tb25kYXkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGF5X29mX3dlZWtfbG9uZ19zYXR1cmRheQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkYXlfb2Zfd2Vla19sb25nX3N1bmRheQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkYXlfb2Zfd2Vla19sb25nX3RodXJzZGF5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGRheV9vZl93ZWVrX2xvbmdfdHVlc2RheQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkYXlfb2Zfd2Vla19sb25nX3dlZG5lc2RheQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkYXlfb2Zfd2Vla19tZWRpdW1fZnJpZGF5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGRheV9vZl93ZWVrX21lZGl1bV9tb25kYXkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGF5X29mX3dlZWtfbWVkaXVtX3NhdHVyZGF5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGRheV9vZl93ZWVrX21lZGl1bV9zdW5kYXkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGF5X29mX3dlZWtfbWVkaXVtX3RodXJzZGF5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGRheV9vZl93ZWVrX21lZGl1bV90dWVzZGF5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGRheV9vZl93ZWVrX21lZGl1bV93ZWRuZXNkYXkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGF5X29mX3dlZWtfc2hvcnRfZnJpZGF5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGRheV9vZl93ZWVrX3Nob3J0X21vbmRheQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkYXlfb2Zfd2Vla19zaG9ydF9zYXR1cmRheQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkYXlfb2Zfd2Vla19zaG9ydF9zdW5kYXkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGF5X29mX3dlZWtfc2hvcnRfdGh1cnNkYXkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGF5X29mX3dlZWtfc2hvcnRfdHVlc2RheQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkYXlfb2Zfd2Vla19zaG9ydF93ZWRuZXNkYXkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGF5X29mX3dlZWtfc2hvcnRlcl9mcmlkYXkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGF5X29mX3dlZWtfc2hvcnRlcl9tb25kYXkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGF5X29mX3dlZWtfc2hvcnRlcl9zYXR1cmRheQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkYXlfb2Zfd2Vla19zaG9ydGVyX3N1bmRheQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkYXlfb2Zfd2Vla19zaG9ydGVyX3RodXJzZGF5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGRheV9vZl93ZWVrX3Nob3J0ZXJfdHVlc2RheQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkYXlfb2Zfd2Vla19zaG9ydGVyX3dlZG5lc2RheQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkYXlfb2Zfd2Vla19zaG9ydGVzdF9mcmlkYXkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGF5X29mX3dlZWtfc2hvcnRlc3RfbW9uZGF5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGRheV9vZl93ZWVrX3Nob3J0ZXN0X3NhdHVyZGF5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGRheV9vZl93ZWVrX3Nob3J0ZXN0X3N1bmRheQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkYXlfb2Zfd2Vla19zaG9ydGVzdF90aHVyc2RheQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkYXlfb2Zfd2Vla19zaG9ydGVzdF90dWVzZGF5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGRheV9vZl93ZWVrX3Nob3J0ZXN0X3dlZG5lc2RheQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkYXlzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGRheXNEdXJhdGlvbkZ1dHVyZVBsdXJhbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkYXlzRHVyYXRpb25QYXN0UGx1cmFsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGRlYnVnCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGRlZmF1bHRNc2lzZG5BbHBoYVRhZwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkZWZhdWx0Vm9pY2VNYWlsQWxwaGFUYWcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGVmYXVsdF9wZXJtaXNzaW9uX2dyb3VwCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X21tX3NzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGVsbGlwc2lzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGVtZXJnZW5jeV9jYWxsX2RpYWxvZ19jYWxsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGVtZXJnZW5jeV9jYWxsX2RpYWxvZ19jYW5jZWwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZW1lcmdlbmN5X2NhbGxfZGlhbG9nX251bWJlcl9mb3JfZGlzcGxheQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBlbWVyZ2VuY3lfY2FsbF9kaWFsb2dfdGV4dAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBlbWVyZ2VuY3lfY2FsbF9udW1iZXJfdXJpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGVtcHR5UGhvbmVOdW1iZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZXZlcnlfd2Vla2RheQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBmYWN0b3J5dGVzdF9mYWlsZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZmFjdG9yeXRlc3Rfbm9fYWN0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGZhY3Rvcnl0ZXN0X25vdF9zeXN0ZW0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZmFjdG9yeXRlc3RfcmVib290Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGZvcmNlX2Nsb3NlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGZyaWRheQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBnaWdhYnl0ZVNob3J0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGdsb2JhbF9hY3Rpb25fbG9jawotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBnbG9iYWxfYWN0aW9uX3Bvd2VyX29mZgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBnbG9iYWxfYWN0aW9uX3NpbGVudF9tb2RlX29mZl9zdGF0dXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZ2xvYmFsX2FjdGlvbl9zaWxlbnRfbW9kZV9vbl9zdGF0dXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZ2xvYmFsX2FjdGlvbl90b2dnbGVfc2lsZW50X21vZGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZ2xvYmFsX2FjdGlvbnMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZ29vZ2xld2ViY29udGVudGhlbHBlcl9sb2FkaW5nCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGhvdXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaG91cnMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaHR0cEVycm9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGh0dHBFcnJvckF1dGgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaHR0cEVycm9yQmFkVXJsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGh0dHBFcnJvckNvbm5lY3QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaHR0cEVycm9yRmFpbGVkU3NsSGFuZHNoYWtlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGh0dHBFcnJvckZpbGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaHR0cEVycm9yRmlsZU5vdEZvdW5kCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGh0dHBFcnJvcklPCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGh0dHBFcnJvckxvb2t1cAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBodHRwRXJyb3JPawotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBodHRwRXJyb3JQcm94eUF1dGgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaHR0cEVycm9yUmVkaXJlY3RMb29wCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGh0dHBFcnJvclRpbWVvdXQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaHR0cEVycm9yVG9vTWFueVJlcXVlc3RzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGh0dHBFcnJvclVuc3VwcG9ydGVkQXV0aFNjaGVtZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBodHRwRXJyb3JVbnN1cHBvcnRlZFNjaGVtZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpbnZhbGlkUGluCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGtleWd1YXJkX2xhYmVsX3RleHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQga2V5Z3VhcmRfcGFzc3dvcmRfZW1lcmdlbmN5X2luc3RydWN0aW9ucwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBrZXlndWFyZF9wYXNzd29yZF9pbnN0cnVjdGlvbnMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQga2V5Z3VhcmRfcGFzc3dvcmRfd3JvbmdfcGluX2NvZGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQga2lsb2J5dGVTaG9ydAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBsb2Nrc2NyZWVuX2NhcnJpZXJfZGVmYXVsdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBsb2Nrc2NyZWVuX2NhcnJpZXJfa2V5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxvY2tzY3JlZW5fZW1lcmdlbmN5X2NhbGwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBsb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxvY2tzY3JlZW5fZ2xvZ2luX2luc3RydWN0aW9ucwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBsb2Nrc2NyZWVuX2dsb2dpbl9pbnZhbGlkX2lucHV0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxvY2tzY3JlZW5fZ2xvZ2luX3Bhc3N3b3JkX2hpbnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbG9ja3NjcmVlbl9nbG9naW5fc3VibWl0X2J1dHRvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBsb2Nrc2NyZWVuX2dsb2dpbl90b29fbWFueV9hdHRlbXB0cwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBsb2Nrc2NyZWVuX2dsb2dpbl91c2VybmFtZV9oaW50Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxvY2tzY3JlZW5faW5zdHJ1Y3Rpb25zX3doZW5fcGF0dGVybl9kaXNhYmxlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBsb2Nrc2NyZWVuX2luc3RydWN0aW9uc193aGVuX3BhdHRlcm5fZW5hYmxlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBsb2Nrc2NyZWVuX2xvd19iYXR0ZXJ5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxvY2tzY3JlZW5fbWlzc2luZ19zaW1faW5zdHJ1Y3Rpb25zCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxvY2tzY3JlZW5fbWlzc2luZ19zaW1fbWVzc2FnZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBsb2Nrc2NyZWVuX21pc3Npbmdfc2ltX21lc3NhZ2Vfc2hvcnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbG9ja3NjcmVlbl9uZXR3b3JrX2xvY2tlZF9tZXNzYWdlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxvY2tzY3JlZW5fcGF0dGVybl9jb3JyZWN0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxvY2tzY3JlZW5fcGF0dGVybl9pbnN0cnVjdGlvbnMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxvY2tzY3JlZW5fcGx1Z2dlZF9pbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBsb2Nrc2NyZWVuX3NjcmVlbl9sb2NrZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbG9ja3NjcmVlbl9zaW1fcHVrX2xvY2tlZF9pbnN0cnVjdGlvbnMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbG9ja3NjcmVlbl9zaW1fcHVrX2xvY2tlZF9tZXNzYWdlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxvY2tzY3JlZW5fc2ltX3VubG9ja19wcm9ncmVzc19kaWFsb2dfbWVzc2FnZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19jb3VudGRvd24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX3RpdGxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxvd19pbnRlcm5hbF9zdG9yYWdlX3RleHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190ZXh0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGl0bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbG93X21lbW9yeQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBtZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBtZWdhYnl0ZVNob3J0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1lbnVfZGVsZXRlX3Nob3J0Y3V0X2xhYmVsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1lbnVfZW50ZXJfc2hvcnRjdXRfbGFiZWwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbWVudV9zcGFjZV9zaG9ydGN1dF9sYWJlbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBtaWRuaWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBtaW51dGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbWludXRlcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBtaXNtYXRjaFBpbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBtbWlDb21wbGV0ZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBtbWlFcnJvcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBtb25kYXkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbW9udGgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbW9udGhfZGF5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1vbnRoX2RheV95ZWFyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1vbnRoX2xvbmdfYXByaWwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbW9udGhfbG9uZ19hdWd1c3QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbW9udGhfbG9uZ19kZWNlbWJlcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBtb250aF9sb25nX2ZlYnJ1YXJ5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1vbnRoX2xvbmdfamFudWFyeQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBtb250aF9sb25nX2p1bHkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbW9udGhfbG9uZ19qdW5lCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1vbnRoX2xvbmdfbWFyY2gKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbW9udGhfbG9uZ19tYXkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbW9udGhfbG9uZ19ub3ZlbWJlcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBtb250aF9sb25nX29jdG9iZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbW9udGhfbG9uZ19zZXB0ZW1iZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbW9udGhfbWVkaXVtX2FwcmlsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1vbnRoX21lZGl1bV9hdWd1c3QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbW9udGhfbWVkaXVtX2RlY2VtYmVyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1vbnRoX21lZGl1bV9mZWJydWFyeQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBtb250aF9tZWRpdW1famFudWFyeQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBtb250aF9tZWRpdW1fanVseQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBtb250aF9tZWRpdW1fanVuZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBtb250aF9tZWRpdW1fbWFyY2gKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbW9udGhfbWVkaXVtX21heQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBtb250aF9tZWRpdW1fbm92ZW1iZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbW9udGhfbWVkaXVtX29jdG9iZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbW9udGhfbWVkaXVtX3NlcHRlbWJlcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBtb250aF9zaG9ydGVzdF9hcHJpbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBtb250aF9zaG9ydGVzdF9hdWd1c3QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbW9udGhfc2hvcnRlc3RfZGVjZW1iZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbW9udGhfc2hvcnRlc3RfZmVicnVhcnkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbW9udGhfc2hvcnRlc3RfamFudWFyeQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBtb250aF9zaG9ydGVzdF9qdWx5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1vbnRoX3Nob3J0ZXN0X2p1bmUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbW9udGhfc2hvcnRlc3RfbWFyY2gKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbW9udGhfc2hvcnRlc3RfbWF5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1vbnRoX3Nob3J0ZXN0X25vdmVtYmVyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1vbnRoX3Nob3J0ZXN0X29jdG9iZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbW9udGhfc2hvcnRlc3Rfc2VwdGVtYmVyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1vbnRoX3llYXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbW9udGhseQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBtb250aGx5X2Zvcm1hdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBtb3JlX2l0ZW1fbGFiZWwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbmVlZFB1azIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbm8KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbm9BcHBsaWNhdGlvbnMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbm9fcGVybWlzc2lvbnMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbm9fcmVjZW50X3Rhc2tzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG5vb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbnVtZXJpY19kYXRlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG51bWVyaWNfZGF0ZV9ub3RhdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBudW1lcmljX21kMV9tZDIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbnVtZXJpY19tZDFfdGltZTFfbWQyX3RpbWUyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG51bWVyaWNfbWR5MV9tZHkyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG51bWVyaWNfbWR5MV90aW1lMV9tZHkyX3RpbWUyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG51bWVyaWNfd2RheTFfbWQxX3RpbWUxX3dkYXkyX21kMl90aW1lMgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBudW1lcmljX3dkYXkxX21kMV93ZGF5Ml9tZDIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbnVtZXJpY193ZGF5MV9tZHkxX3RpbWUxX3dkYXkyX21keTJfdGltZTIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbnVtZXJpY193ZGF5MV9tZHkxX3dkYXkyX21keTIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgb2sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgb25lTW9udGhEdXJhdGlvblBhc3QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgb3Blbl9wZXJtaXNzaW9uX2RlbnkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGFzc3dvcmRJbmNvcnJlY3QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGFzdGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWRlc2NfYWNjZXNzQ29hcnNlTG9jYXRpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWRlc2NfYWNjZXNzRmluZUxvY2F0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1kZXNjX2FjY2Vzc0xvY2F0aW9uRXh0cmFDb21tYW5kcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtZGVzY19hY2Nlc3NNb2NrTG9jYXRpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWRlc2NfYWNjZXNzTmV0d29ya1N0YXRlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1kZXNjX2FjY2Vzc1Bob25lSW50ZXJmYWNlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1kZXNjX2FjY2Vzc1N1cmZhY2VGbGluZ2VyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1kZXNjX2FjY2Vzc1dpZmlTdGF0ZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtZGVzY19hZGRTeXN0ZW1TZXJ2aWNlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1kZXNjX2JhdHRlcnlTdGF0cwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtZGVzY19ibHVldG9vdGgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWRlc2NfYmx1ZXRvb3RoQWRtaW4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWRlc2NfYnJpY2sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWRlc2NfYnJvYWRjYXN0UGFja2FnZVJlbW92ZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWRlc2NfYnJvYWRjYXN0U3RpY2t5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1kZXNjX2NhbGxQaG9uZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtZGVzY19jYWxsUHJpdmlsZWdlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtZGVzY19jYW1lcmEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWRlc2NfY2hhbmdlQ29tcG9uZW50U3RhdGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWRlc2NfY2hhbmdlQ29uZmlndXJhdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtZGVzY19jaGFuZ2VOZXR3b3JrU3RhdGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWRlc2NfY2hhbmdlV2lmaVN0YXRlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1kZXNjX2NoZWNraW5Qcm9wZXJ0aWVzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1kZXNjX2NsZWFyQXBwQ2FjaGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWRlc2NfY2xlYXJBcHBVc2VyRGF0YQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtZGVzY19jcmVhdGVOZXR3b3JrU29ja2V0cwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtZGVzY19kZWxldGVDYWNoZUZpbGVzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1kZXNjX2RlbGV0ZVBhY2thZ2VzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1kZXNjX2RldmljZVBvd2VyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1kZXNjX2RpYWdub3N0aWMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWRlc2NfZGlzYWJsZUtleWd1YXJkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1kZXNjX2R1bXAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWRlc2NfZXhwYW5kU3RhdHVzQmFyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1kZXNjX2ZhY3RvcnlUZXN0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1kZXNjX2ZsYXNobGlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWRlc2NfZm9yY2VCYWNrCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1kZXNjX2ZvdGFVcGRhdGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWRlc2NfZ2V0QWNjb3VudHMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWRlc2NfZ2V0UGFja2FnZVNpemUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWRlc2NfZ2V0VGFza3MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWRlc2NfaGFyZHdhcmVfdGVzdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtZGVzY19pbmplY3RFdmVudHMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWRlc2NfaW5zdGFsbFBhY2thZ2VzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1kZXNjX2ludGVybmFsU3lzdGVtV2luZG93Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1kZXNjX2xvY2F0aW9uVXBkYXRlcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtZGVzY19tYW5hZ2VBcHBUb2tlbnMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWRlc2NfbWFzdGVyQ2xlYXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWRlc2NfbW9kaWZ5QXVkaW9TZXR0aW5ncwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtZGVzY19tb2RpZnlQaG9uZVN0YXRlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1kZXNjX21vdW50X3VubW91bnRfZmlsZXN5c3RlbXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWRlc2NfcGVyc2lzdGVudEFjdGl2aXR5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1kZXNjX3Byb2Nlc3NPdXRnb2luZ0NhbGxzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1kZXNjX3JhaXNlZFRocmVhZFByaW9yaXR5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1kZXNjX3JlYWRDYWxlbmRhcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtZGVzY19yZWFkQ29udGFjdHMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWRlc2NfcmVhZEZyYW1lQnVmZmVyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1kZXNjX3JlYWRJbnB1dFN0YXRlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1kZXNjX3JlYWRMb2dzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1kZXNjX3JlYWRPd25lckRhdGEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWRlc2NfcmVhZFBob25lU3RhdGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWRlc2NfcmVhZFNtcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtZGVzY19yZWFkU3luY1NldHRpbmdzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1kZXNjX3JlYWRTeW5jU3RhdHMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWRlc2NfcmVib290Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1kZXNjX3JlY2VpdmVCb290Q29tcGxldGVkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1kZXNjX3JlY2VpdmVNbXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWRlc2NfcmVjZWl2ZVNtcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtZGVzY19yZWNlaXZlV2FwUHVzaAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtZGVzY19yZWNvcmRBdWRpbwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtZGVzY19yZW9yZGVyVGFza3MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWRlc2NfcmVzdGFydFBhY2thZ2VzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1kZXNjX3J1bkluc3RydW1lbnRhdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtZGVzY19ydW5TZXRBY3Rpdml0eVdhdGNoZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWRlc2Nfc2VuZFNtcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtZGVzY19zZXRBbHdheXNGaW5pc2gKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWRlc2Nfc2V0QW5pbWF0aW9uU2NhbGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWRlc2Nfc2V0RGVidWdBcHAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWRlc2Nfc2V0T3JpZW50YXRpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWRlc2Nfc2V0UHJlZmVycmVkQXBwbGljYXRpb25zCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1kZXNjX3NldFByb2Nlc3NGb3JlZ3JvdW5kCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1kZXNjX3NldFByb2Nlc3NMaW1pdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtZGVzY19zZXRUaW1lWm9uZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtZGVzY19zZXRXYWxscGFwZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWRlc2Nfc2V0V2FsbHBhcGVySGludHMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWRlc2Nfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtZGVzY19zdGF0dXNCYXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWRlc2Nfc3Vic2NyaWJlZEZlZWRzUmVhZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtZGVzY19zdWJzY3JpYmVkRmVlZHNXcml0ZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtZGVzY19zeXN0ZW1BbGVydFdpbmRvdwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtZGVzY192aWJyYXRlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1kZXNjX3dha2VMb2NrCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1kZXNjX3dyaXRlQXBuU2V0dGluZ3MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWRlc2Nfd3JpdGVDYWxlbmRhcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtZGVzY193cml0ZUNvbnRhY3RzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1kZXNjX3dyaXRlR3NlcnZpY2VzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1kZXNjX3dyaXRlT3duZXJEYXRhCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1kZXNjX3dyaXRlU2V0dGluZ3MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWRlc2Nfd3JpdGVTbXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWRlc2Nfd3JpdGVTeW5jU2V0dGluZ3MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWdyb3VwZGVzY19hY2NvdW50cwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtZ3JvdXBkZXNjX2Nvc3RNb25leQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtZ3JvdXBkZXNjX2RldmVsb3BtZW50VG9vbHMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWdyb3VwZGVzY19oYXJkd2FyZUNvbnRyb2xzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1ncm91cGRlc2NfbG9jYXRpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWdyb3VwZGVzY19tZXNzYWdlcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtZ3JvdXBkZXNjX25ldHdvcmsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWdyb3VwZGVzY19wZXJzb25hbEluZm8KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWdyb3VwZGVzY19waG9uZUNhbGxzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1ncm91cGRlc2Nfc3lzdGVtVG9vbHMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWdyb3VwbGFiX2FjY291bnRzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1ncm91cGxhYl9jb3N0TW9uZXkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWdyb3VwbGFiX2RldmVsb3BtZW50VG9vbHMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWdyb3VwbGFiX2hhcmR3YXJlQ29udHJvbHMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWdyb3VwbGFiX2xvY2F0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1ncm91cGxhYl9tZXNzYWdlcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtZ3JvdXBsYWJfbmV0d29yawotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtZ3JvdXBsYWJfcGVyc29uYWxJbmZvCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1ncm91cGxhYl9waG9uZUNhbGxzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1ncm91cGxhYl9zeXN0ZW1Ub29scwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtaXNzaW9uc19mb3JtYXQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWxhYl9hY2Nlc3NDb2Fyc2VMb2NhdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtbGFiX2FjY2Vzc0ZpbmVMb2NhdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtbGFiX2FjY2Vzc0xvY2F0aW9uRXh0cmFDb21tYW5kcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtbGFiX2FjY2Vzc01vY2tMb2NhdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtbGFiX2FjY2Vzc05ldHdvcmtTdGF0ZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtbGFiX2FjY2Vzc1Bob25lSW50ZXJmYWNlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1sYWJfYWNjZXNzU3VyZmFjZUZsaW5nZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWxhYl9hY2Nlc3NXaWZpU3RhdGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWxhYl9hZGRTeXN0ZW1TZXJ2aWNlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1sYWJfYmF0dGVyeVN0YXRzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1sYWJfYmx1ZXRvb3RoCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1sYWJfYmx1ZXRvb3RoQWRtaW4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWxhYl9icmljawotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtbGFiX2Jyb2FkY2FzdFBhY2thZ2VSZW1vdmVkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1sYWJfYnJvYWRjYXN0U3RpY2t5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1sYWJfY2FsbFBob25lCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1sYWJfY2FsbFByaXZpbGVnZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWxhYl9jYW1lcmEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWxhYl9jaGFuZ2VDb21wb25lbnRTdGF0ZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtbGFiX2NoYW5nZUNvbmZpZ3VyYXRpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWxhYl9jaGFuZ2VOZXR3b3JrU3RhdGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWxhYl9jaGFuZ2VXaWZpU3RhdGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWxhYl9jaGVja2luUHJvcGVydGllcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtbGFiX2NsZWFyQXBwQ2FjaGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWxhYl9jbGVhckFwcFVzZXJEYXRhCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1sYWJfY3JlYXRlTmV0d29ya1NvY2tldHMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWxhYl9kZWxldGVDYWNoZUZpbGVzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1sYWJfZGVsZXRlUGFja2FnZXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWxhYl9kZXZpY2VQb3dlcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtbGFiX2RpYWdub3N0aWMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWxhYl9kaXNhYmxlS2V5Z3VhcmQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWxhYl9kdW1wCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1sYWJfZXhwYW5kU3RhdHVzQmFyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1sYWJfZmFjdG9yeVRlc3QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWxhYl9mbGFzaGxpZ2h0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1sYWJfZm9yY2VCYWNrCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1sYWJfZm90YVVwZGF0ZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtbGFiX2dldEFjY291bnRzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1sYWJfZ2V0UGFja2FnZVNpemUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWxhYl9nZXRUYXNrcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtbGFiX2hhcmR3YXJlX3Rlc3QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWxhYl9pbmplY3RFdmVudHMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWxhYl9pbnN0YWxsUGFja2FnZXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWxhYl9pbnRlcm5hbFN5c3RlbVdpbmRvdwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtbGFiX2xvY2F0aW9uVXBkYXRlcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtbGFiX21hbmFnZUFwcFRva2VucwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtbGFiX21hc3RlckNsZWFyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1sYWJfbW9kaWZ5QXVkaW9TZXR0aW5ncwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtbGFiX21vZGlmeVBob25lU3RhdGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWxhYl9tb3VudF91bm1vdW50X2ZpbGVzeXN0ZW1zCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1sYWJfcGVyc2lzdGVudEFjdGl2aXR5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1sYWJfcHJvY2Vzc091dGdvaW5nQ2FsbHMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWxhYl9yYWlzZWRUaHJlYWRQcmlvcml0eQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtbGFiX3JlYWRDYWxlbmRhcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtbGFiX3JlYWRDb250YWN0cwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtbGFiX3JlYWRGcmFtZUJ1ZmZlcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtbGFiX3JlYWRJbnB1dFN0YXRlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1sYWJfcmVhZExvZ3MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWxhYl9yZWFkT3duZXJEYXRhCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1sYWJfcmVhZFBob25lU3RhdGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWxhYl9yZWFkU21zCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1sYWJfcmVhZFN5bmNTZXR0aW5ncwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtbGFiX3JlYWRTeW5jU3RhdHMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWxhYl9yZWJvb3QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWxhYl9yZWNlaXZlQm9vdENvbXBsZXRlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtbGFiX3JlY2VpdmVNbXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWxhYl9yZWNlaXZlU21zCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1sYWJfcmVjZWl2ZVdhcFB1c2gKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWxhYl9yZWNvcmRBdWRpbwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtbGFiX3Jlb3JkZXJUYXNrcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtbGFiX3Jlc3RhcnRQYWNrYWdlcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtbGFiX3J1bkluc3RydW1lbnRhdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtbGFiX3J1blNldEFjdGl2aXR5V2F0Y2hlcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtbGFiX3NlbmRTbXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWxhYl9zZXRBbHdheXNGaW5pc2gKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWxhYl9zZXRBbmltYXRpb25TY2FsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtbGFiX3NldERlYnVnQXBwCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1sYWJfc2V0T3JpZW50YXRpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWxhYl9zZXRQcmVmZXJyZWRBcHBsaWNhdGlvbnMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWxhYl9zZXRQcm9jZXNzRm9yZWdyb3VuZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtbGFiX3NldFByb2Nlc3NMaW1pdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtbGFiX3NldFRpbWVab25lCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1sYWJfc2V0V2FsbHBhcGVyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1sYWJfc2V0V2FsbHBhcGVySGludHMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWxhYl9zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1sYWJfc3RhdHVzQmFyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1sYWJfc3Vic2NyaWJlZEZlZWRzUmVhZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtbGFiX3N1YnNjcmliZWRGZWVkc1dyaXRlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1sYWJfc3lzdGVtQWxlcnRXaW5kb3cKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWxhYl92aWJyYXRlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1sYWJfd2FrZUxvY2sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWxhYl93cml0ZUFwblNldHRpbmdzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1sYWJfd3JpdGVDYWxlbmRhcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtbGFiX3dyaXRlQ29udGFjdHMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybWxhYl93cml0ZUdzZXJ2aWNlcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtbGFiX3dyaXRlT3duZXJEYXRhCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1sYWJfd3JpdGVTZXR0aW5ncwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtbGFiX3dyaXRlU21zCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBlcm1sYWJfd3JpdGVTeW5jU2V0dGluZ3MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGVybXNfaGlkZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXJtc19zaG93X2FsbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwZXRhYnl0ZVNob3J0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBtCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBvd2VyX2RpYWxvZwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwb3dlcl9vZmYKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJlcGVuZF9zaG9ydGN1dF9sYWJlbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcmVwb3NpdGlvbl9mb3JfZGF0ZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcmVwb3NpdGlvbl9mb3JfdGltZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcmVwb3NpdGlvbl9mb3JfeWVhcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcmltYXJ5RW1haWxBZGRyZXNzTGFiZWwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcmluZ3RvbmVfZGVmYXVsdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCByaW5ndG9uZV9kZWZhdWx0X3dpdGhfYWN0dWFsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHJpbmd0b25lX3BpY2tlcl90aXRsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCByaW5ndG9uZV9zaWxlbnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcmluZ3RvbmVfdW5rbm93bgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzYWZlTW9kZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzYW1lX21vbnRoX21kMV9tZDIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2FtZV9tb250aF9tZDFfdGltZTFfbWQyX3RpbWUyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNhbWVfbW9udGhfbWR5MV9tZHkyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNhbWVfbW9udGhfbWR5MV90aW1lMV9tZHkyX3RpbWUyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNhbWVfbW9udGhfd2RheTFfbWQxX3RpbWUxX3dkYXkyX21kMl90aW1lMgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzYW1lX21vbnRoX3dkYXkxX21kMV93ZGF5Ml9tZDIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2FtZV9tb250aF93ZGF5MV9tZHkxX3RpbWUxX3dkYXkyX21keTJfdGltZTIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2FtZV9tb250aF93ZGF5MV9tZHkxX3dkYXkyX21keTIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2FtZV95ZWFyX21kMV9tZDIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2FtZV95ZWFyX21kMV90aW1lMV9tZDJfdGltZTIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2FtZV95ZWFyX21keTFfbWR5MgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzYW1lX3llYXJfbWR5MV90aW1lMV9tZHkyX3RpbWUyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNhbWVfeWVhcl93ZGF5MV9tZDFfdGltZTFfd2RheTJfbWQyX3RpbWUyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNhbWVfeWVhcl93ZGF5MV9tZDFfd2RheTJfbWQyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNhbWVfeWVhcl93ZGF5MV9tZHkxX3RpbWUxX3dkYXkyX21keTJfdGltZTIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2FtZV95ZWFyX3dkYXkxX21keTFfd2RheTJfbWR5MgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzYXR1cmRheQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzYXZlX3Bhc3N3b3JkX2xhYmVsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNhdmVfcGFzc3dvcmRfbWVzc2FnZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzYXZlX3Bhc3N3b3JkX25ldmVyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNhdmVfcGFzc3dvcmRfbm90bm93Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNhdmVfcGFzc3dvcmRfcmVtZW1iZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2NyZWVuX2xvY2sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2NyZWVuX3Byb2dyZXNzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNlYXJjaF9nbwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzZWFyY2hfaGludF9wbGFjZWhvbGRlcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzZWNvbmQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2Vjb25kcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzZWxlY3RBbGwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2VsZWN0TWVudUxhYmVsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNlbGVjdF9jaGFyYWN0ZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2VuZFRleHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2VydmljZUNsYXNzRGF0YQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzZXJ2aWNlQ2xhc3NEYXRhQXN5bmMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2VydmljZUNsYXNzRGF0YVN5bmMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2VydmljZUNsYXNzRkFYCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNlcnZpY2VDbGFzc1BBRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzZXJ2aWNlQ2xhc3NQYWNrZXQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2VydmljZUNsYXNzU01TCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNlcnZpY2VDbGFzc1ZvaWNlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNlcnZpY2VEaXNhYmxlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzZXJ2aWNlRW5hYmxlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzZXJ2aWNlRW5hYmxlZEZvcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzZXJ2aWNlRXJhc2VkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNlcnZpY2VOb3RQcm92aXNpb25lZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzZXJ2aWNlUmVnaXN0ZXJlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzaHV0ZG93bl9jb25maXJtCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNodXRkb3duX3Byb2dyZXNzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNpbGVudF9tb2RlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNpbUFic2VudExhYmVsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNpbU5ldHdvcmtQZXJzb25hbGl6YXRpb25MYWJlbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzaW1QSU5MYWJlbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzaW1QVUtMYWJlbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzbXNfY29udHJvbF9kZWZhdWx0X2FwcF9uYW1lCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNtc19jb250cm9sX21lc3NhZ2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc21zX2NvbnRyb2xfbm8KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc21zX2NvbnRyb2xfdGl0bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc21zX2NvbnRyb2xfeWVzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXR1c19iYXJfYXBwbGljYXRpb25zX2xhYmVsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXR1c19iYXJfYXBwbGljYXRpb25zX3RpdGxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXR1c19iYXJfY2xlYXJfYWxsX2J1dHRvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0dXNfYmFyX2Nsb3NlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXR1c19iYXJfZGF0ZV9mb3JtYXQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdHVzX2Jhcl9sYXRlc3RfZXZlbnRzX2xhYmVsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXR1c19iYXJfbGF0ZXN0X2V2ZW50c190aXRsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0dXNfYmFyX25vX25vdGlmaWNhdGlvbnMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdHVzX2Jhcl9ub19ub3RpZmljYXRpb25zX3RpdGxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXR1c19iYXJfb25nb2luZ19ldmVudHNfbGFiZWwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdHVzX2Jhcl9vbmdvaW5nX2V2ZW50c190aXRsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0dXNfYmFyX3RpbWVfZm9ybWF0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN1bmRheQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0ZXJhYnl0ZVNob3J0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRleHRfY29waWVkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRodXJzZGF5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRpbWUxX3RpbWUyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRpbWVfZGF0ZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0aW1lX3BpY2tlcl9Db2xvbkJldHdlZW5Ib3VyQW5kTWludXRlX3RleHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGltZV9waWNrZXJfc2V0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRpbWVfcGlja2VyX3NldEJ1dHRvbl90ZXh0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRpbWVfd2RheQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0aW1lX3dkYXlfZGF0ZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0b2RheQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0b21vcnJvdwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0dWVzZGF5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHR1cm5fb2ZmX3JhZGlvCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHR1cm5fb25fcmFkaW8KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdW5rbm93bk5hbWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdW50aXRsZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdm9sdW1lX2FsYXJtCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHZvbHVtZV9jYWxsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHZvbHVtZV9tdXNpYwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB2b2x1bWVfcmluZ3RvbmUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdm9sdW1lX3Vua25vd24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgd2FpdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB3ZGF5MV9kYXRlMV90aW1lMV93ZGF5Ml9kYXRlMl90aW1lMgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB3ZGF5MV9kYXRlMV93ZGF5Ml9kYXRlMgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB3ZGF5X2RhdGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgd2ViX3VzZXJfYWdlbnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgd2VkbmVzZGF5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHdlZWsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgd2Vla2x5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHdlZWtseV9mb3JtYXQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgd2Vla3MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgd2hpY2hBcHBsaWNhdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB5ZWFyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHllYXJseQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB5ZWFybHlfZm9ybWF0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHllYXJzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHllcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB5ZXN0ZXJkYXkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC9SOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI1IG5hbWUgPXN0eWxlICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5SJHN0eWxlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbGVydERpYWxvZwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmltYXRpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5pbWF0aW9uX0FjdGl2aXR5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuaW1hdGlvbl9EaWFsb2cKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5pbWF0aW9uX0Ryb3BEb3duRG93bgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmltYXRpb25fRHJvcERvd25VcAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmltYXRpb25fT3B0aW9uc1BhbmVsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuaW1hdGlvbl9TdWJNZW51UGFuZWwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5pbWF0aW9uX1RvYXN0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuaW1hdGlvbl9UcmFuc2x1Y2VudAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmltYXRpb25fVHlwaW5nRmlsdGVyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuaW1hdGlvbl9UeXBpbmdGaWx0ZXJSZXN0b3JlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERpYWxvZ1dpbmRvd1RpdGxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1lZGlhQnV0dG9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1lZGlhQnV0dG9uX0Zmd2QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTWVkaWFCdXR0b25fTmV4dAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNZWRpYUJ1dHRvbl9QYXVzZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNZWRpYUJ1dHRvbl9QbGF5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1lZGlhQnV0dG9uX1ByZXZpb3VzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1lZGlhQnV0dG9uX1JldwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQcmVmZXJlbmNlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFByZWZlcmVuY2VfQ2F0ZWdvcnkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUHJlZmVyZW5jZV9DaGVja0JveFByZWZlcmVuY2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUHJlZmVyZW5jZV9EaWFsb2dQcmVmZXJlbmNlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFByZWZlcmVuY2VfRGlhbG9nUHJlZmVyZW5jZV9FZGl0VGV4dFByZWZlcmVuY2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUHJlZmVyZW5jZV9EaWFsb2dQcmVmZXJlbmNlX1llc05vUHJlZmVyZW5jZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQcmVmZXJlbmNlX0luZm9ybWF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFByZWZlcmVuY2VfUHJlZmVyZW5jZVNjcmVlbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQcmVmZXJlbmNlX1Jpbmd0b25lUHJlZmVyZW5jZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0QXBwZWFyYW5jZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0QXBwZWFyYW5jZV9EaWFsb2dXaW5kb3dUaXRsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0QXBwZWFyYW5jZV9JbnZlcnNlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRBcHBlYXJhbmNlX0xhcmdlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRBcHBlYXJhbmNlX0xhcmdlX0ludmVyc2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dEFwcGVhcmFuY2VfTWVkaXVtCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRBcHBlYXJhbmNlX01lZGl1bV9JbnZlcnNlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRBcHBlYXJhbmNlX1NtYWxsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRBcHBlYXJhbmNlX1NtYWxsX0ludmVyc2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dEFwcGVhcmFuY2VfU3RhdHVzQmFyVGl0bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dEFwcGVhcmFuY2VfVGhlbWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dEFwcGVhcmFuY2VfVGhlbWVfRGlhbG9nCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRBcHBlYXJhbmNlX1RoZW1lX0RpYWxvZ19BcHBFcnJvcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0QXBwZWFyYW5jZV9XaWRnZXQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dEFwcGVhcmFuY2VfV2lkZ2V0X0J1dHRvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0QXBwZWFyYW5jZV9XaWRnZXRfRHJvcERvd25IaW50Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRBcHBlYXJhbmNlX1dpZGdldF9Ecm9wRG93bkl0ZW0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dEFwcGVhcmFuY2VfV2lkZ2V0X0VkaXRUZXh0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRBcHBlYXJhbmNlX1dpZGdldF9JY29uTWVudV9JdGVtCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRBcHBlYXJhbmNlX1dpZGdldF9UYWJXaWRnZXQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dEFwcGVhcmFuY2VfV2lkZ2V0X1RleHRWaWV3Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRBcHBlYXJhbmNlX1dpZGdldF9UZXh0Vmlld19Qb3B1cE1lbnUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dEFwcGVhcmFuY2VfV2lkZ2V0X1RleHRWaWV3X1NwaW5uZXJJdGVtCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRBcHBlYXJhbmNlX1dpbmRvd1RpdGxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX0JsYWNrCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX0JsYWNrX05vVGl0bGVCYXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfQmxhY2tfTm9UaXRsZUJhcl9GdWxsc2NyZWVuCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX0RpYWxvZwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9EaWFsb2dfQWxlcnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfRGlhbG9nX0FwcEVycm9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX0V4cGFuZGVkTWVudQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9JY29uTWVudQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9MaWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9MaWdodF9Ob1RpdGxlQmFyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX0xpZ2h0X05vVGl0bGVCYXJfRnVsbHNjcmVlbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9Ob1RpdGxlQmFyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX05vVGl0bGVCYXJfRnVsbHNjcmVlbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9UcmFuc2x1Y2VudAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9UcmFuc2x1Y2VudF9Ob1RpdGxlQmFyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX1RyYW5zbHVjZW50X05vVGl0bGVCYXJfRnVsbHNjcmVlbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaWRnZXQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2lkZ2V0X0Fic0xpc3RWaWV3Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpZGdldF9BdXRvQ29tcGxldGVUZXh0VmlldwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaWRnZXRfQnV0dG9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpZGdldF9CdXR0b25fSW5zZXQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2lkZ2V0X0J1dHRvbl9TbWFsbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaWRnZXRfQnV0dG9uX1RvZ2dsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaWRnZXRfQ29tcG91bmRCdXR0b24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2lkZ2V0X0NvbXBvdW5kQnV0dG9uX0NoZWNrQm94Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpZGdldF9Db21wb3VuZEJ1dHRvbl9SYWRpb0J1dHRvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaWRnZXRfQ29tcG91bmRCdXR0b25fU3RhcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaWRnZXRfRHJvcERvd25JdGVtCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpZGdldF9Ecm9wRG93bkl0ZW1fU3Bpbm5lcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaWRnZXRfRWRpdFRleHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2lkZ2V0X0V4cGFuZGFibGVMaXN0VmlldwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaWRnZXRfR2FsbGVyeQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaWRnZXRfR3JpZFZpZXcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2lkZ2V0X0ltYWdlQnV0dG9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpZGdldF9JbWFnZVdlbGwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2lkZ2V0X0xpc3RWaWV3Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpZGdldF9MaXN0Vmlld19Ecm9wRG93bgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaWRnZXRfTGlzdFZpZXdfTWVudQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaWRnZXRfTGlzdFZpZXdfV2hpdGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2lkZ2V0X1BvcHVwV2luZG93Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpZGdldF9Qcm9ncmVzc0JhcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaWRnZXRfUHJvZ3Jlc3NCYXJfSG9yaXpvbnRhbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaWRnZXRfUHJvZ3Jlc3NCYXJfTGFyZ2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2lkZ2V0X1Byb2dyZXNzQmFyX1NtYWxsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpZGdldF9Qcm9ncmVzc0Jhcl9TbWFsbF9UaXRsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaWRnZXRfUmF0aW5nQmFyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpZGdldF9SYXRpbmdCYXJfSW5kaWNhdG9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpZGdldF9SYXRpbmdCYXJfU21hbGwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2lkZ2V0X1Njcm9sbFZpZXcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2lkZ2V0X1NlZWtCYXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2lkZ2V0X1NwaW5uZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2lkZ2V0X1RhYldpZGdldAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaWRnZXRfVGV4dFZpZXcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2lkZ2V0X1RleHRWaWV3X0xpc3RTZXBhcmF0b3IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2lkZ2V0X1RleHRWaWV3X1BvcHVwTWVudQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaWRnZXRfVGV4dFZpZXdfU3Bpbm5lckl0ZW0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2lkZ2V0X1dlYlZpZXcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2luZG93VGl0bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2luZG93VGl0bGVCYWNrZ3JvdW5kCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvUjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNSBuYW1lID1zdHlsZWFibGUgKQotcHVibGljIGZpbmFsIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLlIkc3R5bGVhYmxlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEFic0xpc3RWaWV3Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFic0xpc3RWaWV3X2NhY2hlQ29sb3JIaW50Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFic0xpc3RWaWV3X2RyYXdTZWxlY3Rvck9uVG9wCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFic0xpc3RWaWV3X2xpc3RTZWxlY3RvcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBYnNMaXN0Vmlld19zY3JvbGxpbmdDYWNoZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBYnNMaXN0Vmlld19zdGFja0Zyb21Cb3R0b20KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQWJzTGlzdFZpZXdfdGV4dEZpbHRlckVuYWJsZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQWJzTGlzdFZpZXdfdHJhbnNjcmlwdE1vZGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBBYnNTcGlubmVyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFic1NwaW5uZXJfZW50cmllcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEFic29sdXRlTGF5b3V0X0xheW91dAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBYnNvbHV0ZUxheW91dF9MYXlvdXRfbGF5b3V0X3gKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQWJzb2x1dGVMYXlvdXRfTGF5b3V0X2xheW91dF95Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gQWNjZWxlcmF0ZUludGVycG9sYXRvcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBY2NlbGVyYXRlSW50ZXJwb2xhdG9yX2ZhY3RvcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEFsZXJ0RGlhbG9nCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFsZXJ0RGlhbG9nX2JvdHRvbUJyaWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbGVydERpYWxvZ19ib3R0b21EYXJrCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFsZXJ0RGlhbG9nX2JvdHRvbU1lZGl1bQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbGVydERpYWxvZ19jZW50ZXJCcmlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQWxlcnREaWFsb2dfY2VudGVyRGFyawotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbGVydERpYWxvZ19jZW50ZXJNZWRpdW0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQWxlcnREaWFsb2dfZnVsbEJyaWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbGVydERpYWxvZ19mdWxsRGFyawotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbGVydERpYWxvZ190b3BCcmlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQWxlcnREaWFsb2dfdG9wRGFyawotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEFscGhhQW5pbWF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFscGhhQW5pbWF0aW9uX2Zyb21BbHBoYQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbHBoYUFuaW1hdGlvbl90b0FscGhhCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gQW5hbG9nQ2xvY2sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5hbG9nQ2xvY2tfZGlhbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmFsb2dDbG9ja19oYW5kX2hvdXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5hbG9nQ2xvY2tfaGFuZF9taW51dGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBBbmRyb2lkTWFuaWZlc3QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBBbmRyb2lkTWFuaWZlc3RBY3Rpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0QWN0aW9uX25hbWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBBbmRyb2lkTWFuaWZlc3RBY3Rpdml0eQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEFuZHJvaWRNYW5pZmVzdEFjdGl2aXR5QWxpYXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0QWN0aXZpdHlBbGlhc19lbmFibGVkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdEFjdGl2aXR5QWxpYXNfZXhwb3J0ZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0QWN0aXZpdHlBbGlhc19pY29uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdEFjdGl2aXR5QWxpYXNfbGFiZWwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0QWN0aXZpdHlBbGlhc19uYW1lCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdEFjdGl2aXR5QWxpYXNfcGVybWlzc2lvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RBY3Rpdml0eUFsaWFzX3RhcmdldEFjdGl2aXR5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdEFjdGl2aXR5X2FsbG93VGFza1JlcGFyZW50aW5nCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdEFjdGl2aXR5X2Fsd2F5c1JldGFpblRhc2tTdGF0ZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RBY3Rpdml0eV9jbGVhclRhc2tPbkxhdW5jaAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RBY3Rpdml0eV9jb25maWdDaGFuZ2VzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdEFjdGl2aXR5X2VuYWJsZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0QWN0aXZpdHlfZXhjbHVkZUZyb21SZWNlbnRzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdEFjdGl2aXR5X2V4cG9ydGVkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdEFjdGl2aXR5X2ZpbmlzaE9uVGFza0xhdW5jaAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RBY3Rpdml0eV9pY29uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdEFjdGl2aXR5X2xhYmVsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdEFjdGl2aXR5X2xhdW5jaE1vZGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0QWN0aXZpdHlfbXVsdGlwcm9jZXNzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdEFjdGl2aXR5X25hbWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0QWN0aXZpdHlfcGVybWlzc2lvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RBY3Rpdml0eV9wcm9jZXNzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdEFjdGl2aXR5X3NjcmVlbk9yaWVudGF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdEFjdGl2aXR5X3N0YXRlTm90TmVlZGVkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdEFjdGl2aXR5X3Rhc2tBZmZpbml0eQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RBY3Rpdml0eV90aGVtZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEFuZHJvaWRNYW5pZmVzdEFwcGxpY2F0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdEFwcGxpY2F0aW9uX2FsbG93Q2xlYXJVc2VyRGF0YQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RBcHBsaWNhdGlvbl9hbGxvd1Rhc2tSZXBhcmVudGluZwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RBcHBsaWNhdGlvbl9kZWJ1Z2dhYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdEFwcGxpY2F0aW9uX2Rlc2NyaXB0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdEFwcGxpY2F0aW9uX2VuYWJsZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0QXBwbGljYXRpb25faGFzQ29kZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RBcHBsaWNhdGlvbl9pY29uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdEFwcGxpY2F0aW9uX2xhYmVsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdEFwcGxpY2F0aW9uX21hbmFnZVNwYWNlQWN0aXZpdHkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0QXBwbGljYXRpb25fbmFtZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RBcHBsaWNhdGlvbl9wZXJtaXNzaW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdEFwcGxpY2F0aW9uX3BlcnNpc3RlbnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0QXBwbGljYXRpb25fcHJvY2VzcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RBcHBsaWNhdGlvbl90YXNrQWZmaW5pdHkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0QXBwbGljYXRpb25fdGhlbWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBBbmRyb2lkTWFuaWZlc3RDYXRlZ29yeQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RDYXRlZ29yeV9uYW1lCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gQW5kcm9pZE1hbmlmZXN0RGF0YQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3REYXRhX2hvc3QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0RGF0YV9taW1lVHlwZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3REYXRhX3BhdGgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0RGF0YV9wYXRoUGF0dGVybgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3REYXRhX3BhdGhQcmVmaXgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0RGF0YV9wb3J0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdERhdGFfc2NoZW1lCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gQW5kcm9pZE1hbmlmZXN0R3JhbnRVcmlQZXJtaXNzaW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdEdyYW50VXJpUGVybWlzc2lvbl9wYXRoCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdEdyYW50VXJpUGVybWlzc2lvbl9wYXRoUGF0dGVybgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RHcmFudFVyaVBlcm1pc3Npb25fcGF0aFByZWZpeAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEFuZHJvaWRNYW5pZmVzdEluc3RydW1lbnRhdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RJbnN0cnVtZW50YXRpb25fZnVuY3Rpb25hbFRlc3QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0SW5zdHJ1bWVudGF0aW9uX2hhbmRsZVByb2ZpbGluZwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RJbnN0cnVtZW50YXRpb25faWNvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RJbnN0cnVtZW50YXRpb25fbGFiZWwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0SW5zdHJ1bWVudGF0aW9uX25hbWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0SW5zdHJ1bWVudGF0aW9uX3RhcmdldFBhY2thZ2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBBbmRyb2lkTWFuaWZlc3RJbnRlbnRGaWx0ZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0SW50ZW50RmlsdGVyX2ljb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0SW50ZW50RmlsdGVyX2xhYmVsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdEludGVudEZpbHRlcl9wcmlvcml0eQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEFuZHJvaWRNYW5pZmVzdE1ldGFEYXRhCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdE1ldGFEYXRhX25hbWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0TWV0YURhdGFfcmVzb3VyY2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0TWV0YURhdGFfdmFsdWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBBbmRyb2lkTWFuaWZlc3RQZXJtaXNzaW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gQW5kcm9pZE1hbmlmZXN0UGVybWlzc2lvbkdyb3VwCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdFBlcm1pc3Npb25Hcm91cF9kZXNjcmlwdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RQZXJtaXNzaW9uR3JvdXBfaWNvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RQZXJtaXNzaW9uR3JvdXBfbGFiZWwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0UGVybWlzc2lvbkdyb3VwX25hbWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBBbmRyb2lkTWFuaWZlc3RQZXJtaXNzaW9uVHJlZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RQZXJtaXNzaW9uVHJlZV9pY29uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdFBlcm1pc3Npb25UcmVlX2xhYmVsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdFBlcm1pc3Npb25UcmVlX25hbWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0UGVybWlzc2lvbl9kZXNjcmlwdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RQZXJtaXNzaW9uX2ljb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0UGVybWlzc2lvbl9sYWJlbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RQZXJtaXNzaW9uX25hbWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0UGVybWlzc2lvbl9wZXJtaXNzaW9uR3JvdXAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0UGVybWlzc2lvbl9wcm90ZWN0aW9uTGV2ZWwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBBbmRyb2lkTWFuaWZlc3RQcm92aWRlcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RQcm92aWRlcl9hdXRob3JpdGllcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RQcm92aWRlcl9lbmFibGVkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdFByb3ZpZGVyX2V4cG9ydGVkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdFByb3ZpZGVyX2dyYW50VXJpUGVybWlzc2lvbnMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0UHJvdmlkZXJfaWNvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RQcm92aWRlcl9pbml0T3JkZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0UHJvdmlkZXJfbGFiZWwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0UHJvdmlkZXJfbXVsdGlwcm9jZXNzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdFByb3ZpZGVyX25hbWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0UHJvdmlkZXJfcGVybWlzc2lvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RQcm92aWRlcl9wcm9jZXNzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdFByb3ZpZGVyX3JlYWRQZXJtaXNzaW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdFByb3ZpZGVyX3N5bmNhYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdFByb3ZpZGVyX3dyaXRlUGVybWlzc2lvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEFuZHJvaWRNYW5pZmVzdFJlY2VpdmVyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdFJlY2VpdmVyX2VuYWJsZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0UmVjZWl2ZXJfZXhwb3J0ZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0UmVjZWl2ZXJfaWNvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RSZWNlaXZlcl9sYWJlbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RSZWNlaXZlcl9uYW1lCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdFJlY2VpdmVyX3Blcm1pc3Npb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0UmVjZWl2ZXJfcHJvY2VzcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEFuZHJvaWRNYW5pZmVzdFNlcnZpY2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0U2VydmljZV9lbmFibGVkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdFNlcnZpY2VfZXhwb3J0ZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0U2VydmljZV9pY29uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdFNlcnZpY2VfbGFiZWwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0U2VydmljZV9uYW1lCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdFNlcnZpY2VfcGVybWlzc2lvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RTZXJ2aWNlX3Byb2Nlc3MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBBbmRyb2lkTWFuaWZlc3RVc2VzTGlicmFyeQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmRyb2lkTWFuaWZlc3RVc2VzTGlicmFyeV9uYW1lCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gQW5kcm9pZE1hbmlmZXN0VXNlc1Blcm1pc3Npb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0VXNlc1Blcm1pc3Npb25fbmFtZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEFuZHJvaWRNYW5pZmVzdFVzZXNTZGsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0VXNlc1Nka19taW5TZGtWZXJzaW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdF9zaGFyZWRVc2VySWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5kcm9pZE1hbmlmZXN0X3ZlcnNpb25Db2RlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuZHJvaWRNYW5pZmVzdF92ZXJzaW9uTmFtZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEFuaW1hdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEFuaW1hdGlvbkRyYXdhYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gQW5pbWF0aW9uRHJhd2FibGVJdGVtCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuaW1hdGlvbkRyYXdhYmxlSXRlbV9kcmF3YWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmltYXRpb25EcmF3YWJsZUl0ZW1fZHVyYXRpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5pbWF0aW9uRHJhd2FibGVfb25lc2hvdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmltYXRpb25EcmF3YWJsZV92YXJpYWJsZVBhZGRpbmcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5pbWF0aW9uRHJhd2FibGVfdmlzaWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEFuaW1hdGlvblNldAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmltYXRpb25TZXRfc2hhcmVJbnRlcnBvbGF0b3IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5pbWF0aW9uX2R1cmF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuaW1hdGlvbl9maWxsQWZ0ZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5pbWF0aW9uX2ZpbGxCZWZvcmUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5pbWF0aW9uX2ludGVycG9sYXRvcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBbmltYXRpb25fcmVwZWF0Q291bnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5pbWF0aW9uX3JlcGVhdE1vZGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQW5pbWF0aW9uX3N0YXJ0T2Zmc2V0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFuaW1hdGlvbl96QWRqdXN0bWVudAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEF1dG9Db21wbGV0ZVRleHRWaWV3Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEF1dG9Db21wbGV0ZVRleHRWaWV3X2NvbXBsZXRpb25IaW50Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEF1dG9Db21wbGV0ZVRleHRWaWV3X2NvbXBsZXRpb25IaW50VmlldwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBdXRvQ29tcGxldGVUZXh0Vmlld19jb21wbGV0aW9uVGhyZXNob2xkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEF1dG9Db21wbGV0ZVRleHRWaWV3X2Ryb3BEb3duU2VsZWN0b3IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBCaXRtYXBEcmF3YWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCaXRtYXBEcmF3YWJsZV9hbnRpYWxpYXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQml0bWFwRHJhd2FibGVfZGl0aGVyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJpdG1hcERyYXdhYmxlX2ZpbHRlcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCaXRtYXBEcmF3YWJsZV9ncmF2aXR5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJpdG1hcERyYXdhYmxlX3NyYwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCaXRtYXBEcmF3YWJsZV90aWxlTW9kZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEJ1dHRvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIENoZWNrQm94UHJlZmVyZW5jZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDaGVja0JveFByZWZlcmVuY2VfZGlzYWJsZURlcGVuZGVudHNTdGF0ZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDaGVja0JveFByZWZlcmVuY2Vfc3VtbWFyeU9mZgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDaGVja0JveFByZWZlcmVuY2Vfc3VtbWFyeU9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gQ2hlY2tlZFRleHRWaWV3Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENoZWNrZWRUZXh0Vmlld19jaGVja01hcmsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ2hlY2tlZFRleHRWaWV3X2NoZWNrZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBDaHJvbm9tZXRlcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDaHJvbm9tZXRlcl9mb3JtYXQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBDbGlwRHJhd2FibGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ2xpcERyYXdhYmxlX2NsaXBPcmllbnRhdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDbGlwRHJhd2FibGVfZHJhd2FibGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ2xpcERyYXdhYmxlX2dyYXZpdHkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBDb2xvckRyYXdhYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENvbG9yRHJhd2FibGVfY29sb3IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBDb21wb3VuZEJ1dHRvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDb21wb3VuZEJ1dHRvbl9idXR0b24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ29tcG91bmRCdXR0b25fY2hlY2tlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEN5Y2xlSW50ZXJwb2xhdG9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEN5Y2xlSW50ZXJwb2xhdG9yX2N5Y2xlcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIERhdGVQaWNrZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRGF0ZVBpY2tlcl9lbmRZZWFyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERhdGVQaWNrZXJfc3RhcnRZZWFyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gRGVjZWxlcmF0ZUludGVycG9sYXRvcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBEZWNlbGVyYXRlSW50ZXJwb2xhdG9yX2ZhY3RvcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIERpYWxvZ1ByZWZlcmVuY2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRGlhbG9nUHJlZmVyZW5jZV9kaWFsb2dJY29uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERpYWxvZ1ByZWZlcmVuY2VfZGlhbG9nTGF5b3V0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERpYWxvZ1ByZWZlcmVuY2VfZGlhbG9nTWVzc2FnZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBEaWFsb2dQcmVmZXJlbmNlX2RpYWxvZ1RpdGxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERpYWxvZ1ByZWZlcmVuY2VfbmVnYXRpdmVCdXR0b25UZXh0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERpYWxvZ1ByZWZlcmVuY2VfcG9zaXRpdmVCdXR0b25UZXh0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gRHJhd2FibGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBEcmF3YWJsZUNvcm5lcnMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRHJhd2FibGVDb3JuZXJzX2JvdHRvbUxlZnRSYWRpdXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRHJhd2FibGVDb3JuZXJzX2JvdHRvbVJpZ2h0UmFkaXVzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERyYXdhYmxlQ29ybmVyc19yYWRpdXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRHJhd2FibGVDb3JuZXJzX3RvcExlZnRSYWRpdXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRHJhd2FibGVDb3JuZXJzX3RvcFJpZ2h0UmFkaXVzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gRHJhd2FibGVTdGF0ZXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRHJhd2FibGVTdGF0ZXNfc3RhdGVfYWN0aXZlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERyYXdhYmxlU3RhdGVzX3N0YXRlX2NoZWNrYWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBEcmF3YWJsZVN0YXRlc19zdGF0ZV9jaGVja2VkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERyYXdhYmxlU3RhdGVzX3N0YXRlX2VuYWJsZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRHJhd2FibGVTdGF0ZXNfc3RhdGVfZmlyc3QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRHJhd2FibGVTdGF0ZXNfc3RhdGVfZm9jdXNlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBEcmF3YWJsZVN0YXRlc19zdGF0ZV9sYXN0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERyYXdhYmxlU3RhdGVzX3N0YXRlX21pZGRsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBEcmF3YWJsZVN0YXRlc19zdGF0ZV9wcmVzc2VkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERyYXdhYmxlU3RhdGVzX3N0YXRlX3NlbGVjdGVkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERyYXdhYmxlU3RhdGVzX3N0YXRlX3NpbmdsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBEcmF3YWJsZVN0YXRlc19zdGF0ZV93aW5kb3dfZm9jdXNlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBEcmF3YWJsZV92aXNpYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gRWRpdFRleHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBFeHBhbmRhYmxlTGlzdENoaWxkSW5kaWNhdG9yU3RhdGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRXhwYW5kYWJsZUxpc3RDaGlsZEluZGljYXRvclN0YXRlX3N0YXRlX2xhc3QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBFeHBhbmRhYmxlTGlzdEdyb3VwSW5kaWNhdG9yU3RhdGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRXhwYW5kYWJsZUxpc3RHcm91cEluZGljYXRvclN0YXRlX3N0YXRlX2VtcHR5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEV4cGFuZGFibGVMaXN0R3JvdXBJbmRpY2F0b3JTdGF0ZV9zdGF0ZV9leHBhbmRlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEV4cGFuZGFibGVMaXN0VmlldwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFeHBhbmRhYmxlTGlzdFZpZXdfY2hpbGREaXZpZGVyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEV4cGFuZGFibGVMaXN0Vmlld19jaGlsZEluZGljYXRvcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFeHBhbmRhYmxlTGlzdFZpZXdfY2hpbGRJbmRpY2F0b3JMZWZ0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEV4cGFuZGFibGVMaXN0Vmlld19jaGlsZEluZGljYXRvclJpZ2h0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEV4cGFuZGFibGVMaXN0Vmlld19ncm91cEluZGljYXRvcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFeHBhbmRhYmxlTGlzdFZpZXdfaW5kaWNhdG9yTGVmdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFeHBhbmRhYmxlTGlzdFZpZXdfaW5kaWNhdG9yUmlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBGcmFtZUxheW91dAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEZyYW1lTGF5b3V0X0xheW91dAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGcmFtZUxheW91dF9MYXlvdXRfbGF5b3V0X2dyYXZpdHkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRnJhbWVMYXlvdXRfZm9yZWdyb3VuZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGcmFtZUxheW91dF9mb3JlZ3JvdW5kR3Jhdml0eQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGcmFtZUxheW91dF9tZWFzdXJlQWxsQ2hpbGRyZW4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBHYWxsZXJ5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdhbGxlcnlfYW5pbWF0aW9uRHVyYXRpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR2FsbGVyeV9ncmF2aXR5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdhbGxlcnlfc3BhY2luZwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHYWxsZXJ5X3Vuc2VsZWN0ZWRBbHBoYQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEdyYWRpZW50RHJhd2FibGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBHcmFkaWVudERyYXdhYmxlR3JhZGllbnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR3JhZGllbnREcmF3YWJsZUdyYWRpZW50X2FuZ2xlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdyYWRpZW50RHJhd2FibGVHcmFkaWVudF9jZW50ZXJDb2xvcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHcmFkaWVudERyYXdhYmxlR3JhZGllbnRfY2VudGVyWAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHcmFkaWVudERyYXdhYmxlR3JhZGllbnRfY2VudGVyWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHcmFkaWVudERyYXdhYmxlR3JhZGllbnRfZW5kQ29sb3IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR3JhZGllbnREcmF3YWJsZUdyYWRpZW50X2dyYWRpZW50UmFkaXVzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdyYWRpZW50RHJhd2FibGVHcmFkaWVudF9zdGFydENvbG9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdyYWRpZW50RHJhd2FibGVHcmFkaWVudF90eXBlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdyYWRpZW50RHJhd2FibGVHcmFkaWVudF91c2VMZXZlbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEdyYWRpZW50RHJhd2FibGVQYWRkaW5nCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdyYWRpZW50RHJhd2FibGVQYWRkaW5nX2JvdHRvbQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHcmFkaWVudERyYXdhYmxlUGFkZGluZ19sZWZ0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdyYWRpZW50RHJhd2FibGVQYWRkaW5nX3JpZ2h0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdyYWRpZW50RHJhd2FibGVQYWRkaW5nX3RvcAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEdyYWRpZW50RHJhd2FibGVTaXplCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdyYWRpZW50RHJhd2FibGVTaXplX2hlaWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHcmFkaWVudERyYXdhYmxlU2l6ZV93aWR0aAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEdyYWRpZW50RHJhd2FibGVTb2xpZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHcmFkaWVudERyYXdhYmxlU29saWRfY29sb3IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBHcmFkaWVudERyYXdhYmxlU3Ryb2tlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdyYWRpZW50RHJhd2FibGVTdHJva2VfY29sb3IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR3JhZGllbnREcmF3YWJsZVN0cm9rZV9kYXNoR2FwCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdyYWRpZW50RHJhd2FibGVTdHJva2VfZGFzaFdpZHRoCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdyYWRpZW50RHJhd2FibGVTdHJva2Vfd2lkdGgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR3JhZGllbnREcmF3YWJsZV9pbm5lclJhZGl1c1JhdGlvCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdyYWRpZW50RHJhd2FibGVfc2hhcGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR3JhZGllbnREcmF3YWJsZV90aGlja25lc3NSYXRpbwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHcmFkaWVudERyYXdhYmxlX3VzZUxldmVsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdyYWRpZW50RHJhd2FibGVfdmlzaWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEdyaWRMYXlvdXRBbmltYXRpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR3JpZExheW91dEFuaW1hdGlvbl9jb2x1bW5EZWxheQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHcmlkTGF5b3V0QW5pbWF0aW9uX2RpcmVjdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHcmlkTGF5b3V0QW5pbWF0aW9uX2RpcmVjdGlvblByaW9yaXR5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdyaWRMYXlvdXRBbmltYXRpb25fcm93RGVsYXkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBHcmlkVmlldwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHcmlkVmlld19jb2x1bW5XaWR0aAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHcmlkVmlld19ncmF2aXR5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdyaWRWaWV3X2hvcml6b250YWxTcGFjaW5nCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdyaWRWaWV3X251bUNvbHVtbnMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR3JpZFZpZXdfc3RyZXRjaE1vZGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR3JpZFZpZXdfdmVydGljYWxTcGFjaW5nCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gSWNvbk1lbnVWaWV3Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEljb25NZW51Vmlld19tYXhJdGVtc1BlclJvdwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJY29uTWVudVZpZXdfbWF4Um93cwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJY29uTWVudVZpZXdfbW9yZUljb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSWNvbk1lbnVWaWV3X3Jvd0hlaWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEltYWdlU3dpdGNoZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBJbWFnZVZpZXcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSW1hZ2VWaWV3X2FkanVzdFZpZXdCb3VuZHMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSW1hZ2VWaWV3X2Jhc2VsaW5lQWxpZ25Cb3R0b20KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSW1hZ2VWaWV3X2Nyb3BUb1BhZGRpbmcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSW1hZ2VWaWV3X21heEhlaWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJbWFnZVZpZXdfbWF4V2lkdGgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSW1hZ2VWaWV3X3NjYWxlVHlwZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJbWFnZVZpZXdfc3JjCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEltYWdlVmlld190aW50Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gSW5zZXREcmF3YWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJbnNldERyYXdhYmxlX2RyYXdhYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEluc2V0RHJhd2FibGVfaW5zZXRCb3R0b20KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSW5zZXREcmF3YWJsZV9pbnNldExlZnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSW5zZXREcmF3YWJsZV9pbnNldFJpZ2h0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEluc2V0RHJhd2FibGVfaW5zZXRUb3AKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSW5zZXREcmF3YWJsZV92aXNpYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gSW50ZW50Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gSW50ZW50Q2F0ZWdvcnkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSW50ZW50Q2F0ZWdvcnlfbmFtZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEludGVudEV4dHJhCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEludGVudEV4dHJhX25hbWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSW50ZW50RXh0cmFfdmFsdWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSW50ZW50X2FjdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJbnRlbnRfZGF0YQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJbnRlbnRfbWltZVR5cGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSW50ZW50X3RhcmdldENsYXNzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEludGVudF90YXJnZXRQYWNrYWdlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gTGF5ZXJEcmF3YWJsZUl0ZW0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTGF5ZXJEcmF3YWJsZUl0ZW1fYm90dG9tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExheWVyRHJhd2FibGVJdGVtX2RyYXdhYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExheWVyRHJhd2FibGVJdGVtX2lkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExheWVyRHJhd2FibGVJdGVtX2xlZnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTGF5ZXJEcmF3YWJsZUl0ZW1fcmlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTGF5ZXJEcmF3YWJsZUl0ZW1fdG9wCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gTGF5b3V0QW5pbWF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExheW91dEFuaW1hdGlvbl9hbmltYXRpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTGF5b3V0QW5pbWF0aW9uX2FuaW1hdGlvbk9yZGVyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExheW91dEFuaW1hdGlvbl9kZWxheQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMYXlvdXRBbmltYXRpb25faW50ZXJwb2xhdG9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gTGV2ZWxMaXN0RHJhd2FibGVJdGVtCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExldmVsTGlzdERyYXdhYmxlSXRlbV9kcmF3YWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMZXZlbExpc3REcmF3YWJsZUl0ZW1fbWF4TGV2ZWwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTGV2ZWxMaXN0RHJhd2FibGVJdGVtX21pbkxldmVsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gTGluZWFyTGF5b3V0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gTGluZWFyTGF5b3V0X0xheW91dAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMaW5lYXJMYXlvdXRfTGF5b3V0X2xheW91dF9ncmF2aXR5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExpbmVhckxheW91dF9MYXlvdXRfbGF5b3V0X2hlaWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMaW5lYXJMYXlvdXRfTGF5b3V0X2xheW91dF93ZWlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTGluZWFyTGF5b3V0X0xheW91dF9sYXlvdXRfd2lkdGgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTGluZWFyTGF5b3V0X2Jhc2VsaW5lQWxpZ25lZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMaW5lYXJMYXlvdXRfYmFzZWxpbmVBbGlnbmVkQ2hpbGRJbmRleAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMaW5lYXJMYXlvdXRfZ3Jhdml0eQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMaW5lYXJMYXlvdXRfb3JpZW50YXRpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTGluZWFyTGF5b3V0X3dlaWdodFN1bQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIExpc3RQcmVmZXJlbmNlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExpc3RQcmVmZXJlbmNlX2VudHJpZXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTGlzdFByZWZlcmVuY2VfZW50cnlWYWx1ZXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBMaXN0VmlldwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMaXN0Vmlld19jaG9pY2VNb2RlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExpc3RWaWV3X2RpdmlkZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTGlzdFZpZXdfZGl2aWRlckhlaWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMaXN0Vmlld19lbnRyaWVzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gTWFwVmlldwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNYXBWaWV3X2FwaUtleQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIE1lbnUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBNZW51R3JvdXAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTWVudUdyb3VwX2NoZWNrYWJsZUJlaGF2aW9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1lbnVHcm91cF9lbmFibGVkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1lbnVHcm91cF9pZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNZW51R3JvdXBfbWVudUNhdGVnb3J5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1lbnVHcm91cF9vcmRlckluQ2F0ZWdvcnkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTWVudUdyb3VwX3Zpc2libGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBNZW51SXRlbQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIE1lbnVJdGVtQ2hlY2tlZEZvY3VzZWRTdGF0ZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNZW51SXRlbUNoZWNrZWRGb2N1c2VkU3RhdGVfc3RhdGVfY2hlY2thYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1lbnVJdGVtQ2hlY2tlZEZvY3VzZWRTdGF0ZV9zdGF0ZV9jaGVja2VkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1lbnVJdGVtQ2hlY2tlZEZvY3VzZWRTdGF0ZV9zdGF0ZV9mb2N1c2VkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gTWVudUl0ZW1DaGVja2VkU3RhdGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTWVudUl0ZW1DaGVja2VkU3RhdGVfc3RhdGVfY2hlY2thYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1lbnVJdGVtQ2hlY2tlZFN0YXRlX3N0YXRlX2NoZWNrZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBNZW51SXRlbVVuY2hlY2tlZEZvY3VzZWRTdGF0ZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNZW51SXRlbVVuY2hlY2tlZEZvY3VzZWRTdGF0ZV9zdGF0ZV9jaGVja2FibGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTWVudUl0ZW1VbmNoZWNrZWRGb2N1c2VkU3RhdGVfc3RhdGVfZm9jdXNlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIE1lbnVJdGVtVW5jaGVja2VkU3RhdGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTWVudUl0ZW1VbmNoZWNrZWRTdGF0ZV9zdGF0ZV9jaGVja2FibGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTWVudUl0ZW1fYWxwaGFiZXRpY1Nob3J0Y3V0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1lbnVJdGVtX2NoZWNrYWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNZW51SXRlbV9jaGVja2VkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1lbnVJdGVtX2VuYWJsZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTWVudUl0ZW1faWNvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNZW51SXRlbV9pZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNZW51SXRlbV9tZW51Q2F0ZWdvcnkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTWVudUl0ZW1fbnVtZXJpY1Nob3J0Y3V0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1lbnVJdGVtX29yZGVySW5DYXRlZ29yeQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNZW51SXRlbV90aXRsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNZW51SXRlbV90aXRsZUNvbmRlbnNlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNZW51SXRlbV92aXNpYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gTWVudVZpZXcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTWVudVZpZXdfaGVhZGVyQmFja2dyb3VuZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNZW51Vmlld19ob3Jpem9udGFsRGl2aWRlcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNZW51Vmlld19pdGVtQmFja2dyb3VuZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNZW51Vmlld19pdGVtSWNvbkRpc2FibGVkQWxwaGEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTWVudVZpZXdfaXRlbVRleHRBcHBlYXJhbmNlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1lbnVWaWV3X3ZlcnRpY2FsRGl2aWRlcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNZW51Vmlld193aW5kb3dBbmltYXRpb25TdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIFBvcHVwV2luZG93Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gUG9wdXBXaW5kb3dCYWNrZ3JvdW5kU3RhdGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUG9wdXBXaW5kb3dCYWNrZ3JvdW5kU3RhdGVfc3RhdGVfYWJvdmVfYW5jaG9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBvcHVwV2luZG93X3BvcHVwQmFja2dyb3VuZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIFByZWZlcmVuY2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBQcmVmZXJlbmNlR3JvdXAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUHJlZmVyZW5jZUdyb3VwX29yZGVyaW5nRnJvbVhtbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQcmVmZXJlbmNlX2RlZmF1bHRWYWx1ZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQcmVmZXJlbmNlX2RlcGVuZGVuY3kKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUHJlZmVyZW5jZV9lbmFibGVkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFByZWZlcmVuY2Vfa2V5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFByZWZlcmVuY2VfbGF5b3V0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFByZWZlcmVuY2Vfb3JkZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUHJlZmVyZW5jZV9wZXJzaXN0ZW50Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFByZWZlcmVuY2Vfc2VsZWN0YWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQcmVmZXJlbmNlX3Nob3VsZERpc2FibGVWaWV3Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFByZWZlcmVuY2Vfc3VtbWFyeQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQcmVmZXJlbmNlX3RpdGxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFByZWZlcmVuY2Vfd2lkZ2V0TGF5b3V0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gUHJvZ3Jlc3NCYXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUHJvZ3Jlc3NCYXJfaW5kZXRlcm1pbmF0ZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQcm9ncmVzc0Jhcl9pbmRldGVybWluYXRlQmVoYXZpb3IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUHJvZ3Jlc3NCYXJfaW5kZXRlcm1pbmF0ZURyYXdhYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFByb2dyZXNzQmFyX2luZGV0ZXJtaW5hdGVEdXJhdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQcm9ncmVzc0Jhcl9pbmRldGVybWluYXRlT25seQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQcm9ncmVzc0Jhcl9pbnRlcnBvbGF0b3IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUHJvZ3Jlc3NCYXJfbWF4Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFByb2dyZXNzQmFyX21heEhlaWdodAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQcm9ncmVzc0Jhcl9tYXhXaWR0aAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQcm9ncmVzc0Jhcl9taW5IZWlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUHJvZ3Jlc3NCYXJfbWluV2lkdGgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUHJvZ3Jlc3NCYXJfcHJvZ3Jlc3MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUHJvZ3Jlc3NCYXJfcHJvZ3Jlc3NEcmF3YWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQcm9ncmVzc0Jhcl9zZWNvbmRhcnlQcm9ncmVzcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIFJhZGlvR3JvdXAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUmFkaW9Hcm91cF9jaGVja2VkQnV0dG9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJhZGlvR3JvdXBfb3JpZW50YXRpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBSYXRpbmdCYXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUmF0aW5nQmFyX2lzSW5kaWNhdG9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJhdGluZ0Jhcl9udW1TdGFycwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSYXRpbmdCYXJfcmF0aW5nCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJhdGluZ0Jhcl9zdGVwU2l6ZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIFJlbGF0aXZlTGF5b3V0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gUmVsYXRpdmVMYXlvdXRfTGF5b3V0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJlbGF0aXZlTGF5b3V0X0xheW91dF9sYXlvdXRfYWJvdmUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUmVsYXRpdmVMYXlvdXRfTGF5b3V0X2xheW91dF9hbGlnbkJhc2VsaW5lCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJlbGF0aXZlTGF5b3V0X0xheW91dF9sYXlvdXRfYWxpZ25Cb3R0b20KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUmVsYXRpdmVMYXlvdXRfTGF5b3V0X2xheW91dF9hbGlnbkxlZnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUmVsYXRpdmVMYXlvdXRfTGF5b3V0X2xheW91dF9hbGlnblBhcmVudEJvdHRvbQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSZWxhdGl2ZUxheW91dF9MYXlvdXRfbGF5b3V0X2FsaWduUGFyZW50TGVmdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSZWxhdGl2ZUxheW91dF9MYXlvdXRfbGF5b3V0X2FsaWduUGFyZW50UmlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUmVsYXRpdmVMYXlvdXRfTGF5b3V0X2xheW91dF9hbGlnblBhcmVudFRvcAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSZWxhdGl2ZUxheW91dF9MYXlvdXRfbGF5b3V0X2FsaWduUmlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUmVsYXRpdmVMYXlvdXRfTGF5b3V0X2xheW91dF9hbGlnblRvcAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSZWxhdGl2ZUxheW91dF9MYXlvdXRfbGF5b3V0X2FsaWduV2l0aFBhcmVudElmTWlzc2luZwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSZWxhdGl2ZUxheW91dF9MYXlvdXRfbGF5b3V0X2JlbG93Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJlbGF0aXZlTGF5b3V0X0xheW91dF9sYXlvdXRfY2VudGVySG9yaXpvbnRhbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSZWxhdGl2ZUxheW91dF9MYXlvdXRfbGF5b3V0X2NlbnRlckluUGFyZW50Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJlbGF0aXZlTGF5b3V0X0xheW91dF9sYXlvdXRfY2VudGVyVmVydGljYWwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUmVsYXRpdmVMYXlvdXRfTGF5b3V0X2xheW91dF90b0xlZnRPZgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSZWxhdGl2ZUxheW91dF9MYXlvdXRfbGF5b3V0X3RvUmlnaHRPZgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSZWxhdGl2ZUxheW91dF9ncmF2aXR5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJlbGF0aXZlTGF5b3V0X2lnbm9yZUdyYXZpdHkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBSaW5ndG9uZVByZWZlcmVuY2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUmluZ3RvbmVQcmVmZXJlbmNlX3Jpbmd0b25lVHlwZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSaW5ndG9uZVByZWZlcmVuY2Vfc2hvd0RlZmF1bHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUmluZ3RvbmVQcmVmZXJlbmNlX3Nob3dTaWxlbnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBSb3RhdGVBbmltYXRpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUm90YXRlQW5pbWF0aW9uX2Zyb21EZWdyZWVzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJvdGF0ZUFuaW1hdGlvbl9waXZvdFgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUm90YXRlQW5pbWF0aW9uX3Bpdm90WQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSb3RhdGVBbmltYXRpb25fdG9EZWdyZWVzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gUm90YXRlRHJhd2FibGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUm90YXRlRHJhd2FibGVfZHJhd2FibGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUm90YXRlRHJhd2FibGVfZnJvbURlZ3JlZXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUm90YXRlRHJhd2FibGVfcGl2b3RYCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJvdGF0ZURyYXdhYmxlX3Bpdm90WQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSb3RhdGVEcmF3YWJsZV90b0RlZ3JlZXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUm90YXRlRHJhd2FibGVfdmlzaWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIFNjYWxlQW5pbWF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNjYWxlQW5pbWF0aW9uX2Zyb21YU2NhbGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU2NhbGVBbmltYXRpb25fZnJvbVlTY2FsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTY2FsZUFuaW1hdGlvbl9waXZvdFgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU2NhbGVBbmltYXRpb25fcGl2b3RZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNjYWxlQW5pbWF0aW9uX3RvWFNjYWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNjYWxlQW5pbWF0aW9uX3RvWVNjYWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gU2NhbGVEcmF3YWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTY2FsZURyYXdhYmxlX2RyYXdhYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNjYWxlRHJhd2FibGVfc2NhbGVHcmF2aXR5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNjYWxlRHJhd2FibGVfc2NhbGVIZWlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU2NhbGVEcmF3YWJsZV9zY2FsZVdpZHRoCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gU2Nyb2xsVmlldwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTY3JvbGxWaWV3X2ZpbGxWaWV3cG9ydAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIFNlYXJjaGFibGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBTZWFyY2hhYmxlQWN0aW9uS2V5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNlYXJjaGFibGVBY3Rpb25LZXlfa2V5Y29kZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTZWFyY2hhYmxlQWN0aW9uS2V5X3F1ZXJ5QWN0aW9uTXNnCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNlYXJjaGFibGVBY3Rpb25LZXlfc3VnZ2VzdEFjdGlvbk1zZwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTZWFyY2hhYmxlQWN0aW9uS2V5X3N1Z2dlc3RBY3Rpb25Nc2dDb2x1bW4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU2VhcmNoYWJsZV9oaW50Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNlYXJjaGFibGVfaWNvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTZWFyY2hhYmxlX2xhYmVsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNlYXJjaGFibGVfc2VhcmNoQnV0dG9uVGV4dAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTZWFyY2hhYmxlX3NlYXJjaE1vZGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU2VhcmNoYWJsZV9zZWFyY2hTdWdnZXN0QXV0aG9yaXR5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNlYXJjaGFibGVfc2VhcmNoU3VnZ2VzdEludGVudEFjdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTZWFyY2hhYmxlX3NlYXJjaFN1Z2dlc3RJbnRlbnREYXRhCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNlYXJjaGFibGVfc2VhcmNoU3VnZ2VzdFBhdGgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU2VhcmNoYWJsZV9zZWFyY2hTdWdnZXN0U2VsZWN0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gU2Vla0JhcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTZWVrQmFyX3RodW1iCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNlZWtCYXJfdGh1bWJPZmZzZXQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBTaGFwZURyYXdhYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gU2hhcGVEcmF3YWJsZVBhZGRpbmcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU2hhcGVEcmF3YWJsZVBhZGRpbmdfYm90dG9tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNoYXBlRHJhd2FibGVQYWRkaW5nX2xlZnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU2hhcGVEcmF3YWJsZVBhZGRpbmdfcmlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU2hhcGVEcmF3YWJsZVBhZGRpbmdfdG9wCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNoYXBlRHJhd2FibGVfY29sb3IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU2hhcGVEcmF3YWJsZV9oZWlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU2hhcGVEcmF3YWJsZV93aWR0aAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIFNsaWRpbmdEcmF3ZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU2xpZGluZ0RyYXdlcl9hbmltYXRlT25DbGljawotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTbGlkaW5nRHJhd2VyX2JvdHRvbU9mZnNldAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTbGlkaW5nRHJhd2VyX2NvbnRlbnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU2xpZGluZ0RyYXdlcl9oYW5kbGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU2xpZGluZ0RyYXdlcl9vcmllbnRhdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTbGlkaW5nRHJhd2VyX3RvcE9mZnNldAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIFNwaW5uZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU3Bpbm5lcl9wcm9tcHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBTdGF0ZUxpc3REcmF3YWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTdGF0ZUxpc3REcmF3YWJsZV9jb25zdGFudFNpemUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU3RhdGVMaXN0RHJhd2FibGVfdmFyaWFibGVQYWRkaW5nCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFN0YXRlTGlzdERyYXdhYmxlX3Zpc2libGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBUYWJXaWRnZXQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBUYWJsZUxheW91dAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUYWJsZUxheW91dF9jb2xsYXBzZUNvbHVtbnMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGFibGVMYXlvdXRfc2hyaW5rQ29sdW1ucwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUYWJsZUxheW91dF9zdHJldGNoQ29sdW1ucwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIFRhYmxlUm93Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gVGFibGVSb3dfQ2VsbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUYWJsZVJvd19DZWxsX2xheW91dF9jb2x1bW4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGFibGVSb3dfQ2VsbF9sYXlvdXRfc3BhbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIFRleHRBcHBlYXJhbmNlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRBcHBlYXJhbmNlX3RleHRDb2xvcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0QXBwZWFyYW5jZV90ZXh0Q29sb3JIaWdobGlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dEFwcGVhcmFuY2VfdGV4dENvbG9ySGludAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0QXBwZWFyYW5jZV90ZXh0Q29sb3JMaW5rCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRBcHBlYXJhbmNlX3RleHRTaXplCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRBcHBlYXJhbmNlX3RleHRTdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0QXBwZWFyYW5jZV90eXBlZmFjZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIFRleHRTd2l0Y2hlcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIFRleHRWaWV3Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRWaWV3X2F1dG9MaW5rCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRWaWV3X2F1dG9UZXh0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRWaWV3X2J1ZmZlclR5cGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dFZpZXdfY2FwaXRhbGl6ZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0Vmlld19jdXJzb3JWaXNpYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRWaWV3X2RpZ2l0cwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0Vmlld19kcmF3YWJsZUJvdHRvbQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0Vmlld19kcmF3YWJsZUxlZnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dFZpZXdfZHJhd2FibGVQYWRkaW5nCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRWaWV3X2RyYXdhYmxlUmlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dFZpZXdfZHJhd2FibGVUb3AKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dFZpZXdfZWRpdGFibGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dFZpZXdfZWxsaXBzaXplCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRWaWV3X2VtcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0Vmlld19lbmFibGVkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRWaWV3X2ZyZWV6ZXNUZXh0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRWaWV3X2dyYXZpdHkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dFZpZXdfaGVpZ2h0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRWaWV3X2hpbnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dFZpZXdfaW5jbHVkZUZvbnRQYWRkaW5nCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRWaWV3X2lucHV0TWV0aG9kCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRWaWV3X2xpbmVTcGFjaW5nRXh0cmEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dFZpZXdfbGluZVNwYWNpbmdNdWx0aXBsaWVyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRWaWV3X2xpbmVzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRWaWV3X2xpbmtzQ2xpY2thYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRWaWV3X21heEVtcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0Vmlld19tYXhIZWlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dFZpZXdfbWF4TGVuZ3RoCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRWaWV3X21heExpbmVzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRWaWV3X21heFdpZHRoCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRWaWV3X21pbkVtcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0Vmlld19taW5IZWlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dFZpZXdfbWluTGluZXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dFZpZXdfbWluV2lkdGgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dFZpZXdfbnVtZXJpYwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0Vmlld19wYXNzd29yZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0Vmlld19waG9uZU51bWJlcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0Vmlld19zY3JvbGxIb3Jpem9udGFsbHkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dFZpZXdfc2VsZWN0QWxsT25Gb2N1cwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0Vmlld19zaGFkb3dDb2xvcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0Vmlld19zaGFkb3dEeAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0Vmlld19zaGFkb3dEeQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0Vmlld19zaGFkb3dSYWRpdXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dFZpZXdfc2luZ2xlTGluZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0Vmlld190ZXh0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRWaWV3X3RleHRBcHBlYXJhbmNlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRWaWV3X3RleHRDb2xvcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0Vmlld190ZXh0Q29sb3JIaWdobGlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dFZpZXdfdGV4dENvbG9ySGludAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0Vmlld190ZXh0Q29sb3JMaW5rCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRWaWV3X3RleHRTY2FsZVgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dFZpZXdfdGV4dFNpemUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dFZpZXdfdGV4dFN0eWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRWaWV3X3R5cGVmYWNlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRWaWV3X3dpZHRoCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gVGhlbWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfYWJzTGlzdFZpZXdTdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9hbGVydERpYWxvZ1N0eWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX2F1dG9Db21wbGV0ZVRleHRWaWV3U3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfYmFja2dyb3VuZERpbUFtb3VudAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9idXR0b25TdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9idXR0b25TdHlsZUluc2V0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX2J1dHRvblN0eWxlU21hbGwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfYnV0dG9uU3R5bGVUb2dnbGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfY2hlY2tCb3hQcmVmZXJlbmNlU3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfY2hlY2tib3hTdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9jb2xvckJhY2tncm91bmQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfY29sb3JGb3JlZ3JvdW5kCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX2NvbG9yRm9yZWdyb3VuZEludmVyc2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfZGlhbG9nUHJlZmVyZW5jZVN0eWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX2Rpc2FibGVkQWxwaGEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfZHJvcERvd25IaW50QXBwZWFyYW5jZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9kcm9wRG93bkl0ZW1TdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9kcm9wRG93bkxpc3RWaWV3U3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfZWRpdFRleHRQcmVmZXJlbmNlU3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfZWRpdFRleHRTdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9leHBhbmRhYmxlTGlzdFByZWZlcnJlZENoaWxkSW5kaWNhdG9yTGVmdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9leHBhbmRhYmxlTGlzdFByZWZlcnJlZENoaWxkSW5kaWNhdG9yUmlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfZXhwYW5kYWJsZUxpc3RQcmVmZXJyZWRDaGlsZFBhZGRpbmdMZWZ0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX2V4cGFuZGFibGVMaXN0UHJlZmVycmVkSXRlbUluZGljYXRvckxlZnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfZXhwYW5kYWJsZUxpc3RQcmVmZXJyZWRJdGVtSW5kaWNhdG9yUmlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfZXhwYW5kYWJsZUxpc3RQcmVmZXJyZWRJdGVtUGFkZGluZ0xlZnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfZXhwYW5kYWJsZUxpc3RWaWV3U3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfZ2FsbGVyeUl0ZW1CYWNrZ3JvdW5kCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX2dhbGxlcnlTdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9ncmlkVmlld1N0eWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX2ltYWdlQnV0dG9uU3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfaW1hZ2VXZWxsU3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfbGlzdENob2ljZUluZGljYXRvck11bHRpcGxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX2xpc3RDaG9pY2VJbmRpY2F0b3JTaW5nbGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfbGlzdERpdmlkZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfbGlzdFByZWZlcnJlZEl0ZW1IZWlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfbGlzdFNlcGFyYXRvclRleHRWaWV3U3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfbGlzdFZpZXdTdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9saXN0Vmlld1doaXRlU3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfbWFwVmlld1N0eWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX3BhbmVsQmFja2dyb3VuZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9wYW5lbENvbG9yQmFja2dyb3VuZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9wYW5lbENvbG9yRm9yZWdyb3VuZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9wYW5lbEZ1bGxCYWNrZ3JvdW5kCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX3BhbmVsVGV4dEFwcGVhcmFuY2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfcG9wdXBXaW5kb3dTdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9wcmVmZXJlbmNlQ2F0ZWdvcnlTdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9wcmVmZXJlbmNlSW5mb3JtYXRpb25TdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9wcmVmZXJlbmNlTGF5b3V0Q2hpbGQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfcHJlZmVyZW5jZVNjcmVlblN0eWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX3ByZWZlcmVuY2VTdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9wcm9ncmVzc0JhclN0eWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX3Byb2dyZXNzQmFyU3R5bGVIb3Jpem9udGFsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX3Byb2dyZXNzQmFyU3R5bGVMYXJnZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9wcm9ncmVzc0JhclN0eWxlU21hbGwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfcHJvZ3Jlc3NCYXJTdHlsZVNtYWxsVGl0bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfcmFkaW9CdXR0b25TdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9yYXRpbmdCYXJTdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9yYXRpbmdCYXJTdHlsZUluZGljYXRvcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9yYXRpbmdCYXJTdHlsZVNtYWxsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX3Jpbmd0b25lUHJlZmVyZW5jZVN0eWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX3Njcm9sbFZpZXdTdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9zZWVrQmFyU3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfc3Bpbm5lckRyb3BEb3duSXRlbVN0eWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX3NwaW5uZXJJdGVtU3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfc3Bpbm5lclN0eWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX3N0YXJTdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV90YWJXaWRnZXRTdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV90ZXh0QXBwZWFyYW5jZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV90ZXh0QXBwZWFyYW5jZUJ1dHRvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV90ZXh0QXBwZWFyYW5jZUludmVyc2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfdGV4dEFwcGVhcmFuY2VMYXJnZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV90ZXh0QXBwZWFyYW5jZUxhcmdlSW52ZXJzZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV90ZXh0QXBwZWFyYW5jZU1lZGl1bQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV90ZXh0QXBwZWFyYW5jZU1lZGl1bUludmVyc2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfdGV4dEFwcGVhcmFuY2VTbWFsbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV90ZXh0QXBwZWFyYW5jZVNtYWxsSW52ZXJzZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV90ZXh0Q2hlY2tNYXJrCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX3RleHRDaGVja01hcmtJbnZlcnNlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX3RleHRDb2xvckhpbnRJbnZlcnNlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX3RleHRDb2xvclByaW1hcnkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfdGV4dENvbG9yUHJpbWFyeURpc2FibGVPbmx5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX3RleHRDb2xvclByaW1hcnlJbnZlcnNlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX3RleHRDb2xvclByaW1hcnlJbnZlcnNlTm9EaXNhYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX3RleHRDb2xvclByaW1hcnlOb0Rpc2FibGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfdGV4dENvbG9yU2Vjb25kYXJ5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX3RleHRDb2xvclNlY29uZGFyeUludmVyc2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfdGV4dENvbG9yU2Vjb25kYXJ5SW52ZXJzZU5vRGlzYWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV90ZXh0Q29sb3JTZWNvbmRhcnlOb0Rpc2FibGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfdGV4dENvbG9yVGVydGlhcnkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfdGV4dENvbG9yVGVydGlhcnlJbnZlcnNlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX3RleHRWaWV3U3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfd2ViVmlld1N0eWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX3dpbmRvd0FuaW1hdGlvblN0eWxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX3dpbmRvd0JhY2tncm91bmQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfd2luZG93Q29udGVudE92ZXJsYXkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfd2luZG93RnJhbWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfd2luZG93RnVsbHNjcmVlbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV93aW5kb3dJc0Zsb2F0aW5nCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX3dpbmRvd0lzVHJhbnNsdWNlbnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfd2luZG93Tm9UaXRsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV93aW5kb3dUaXRsZUJhY2tncm91bmRTdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV93aW5kb3dUaXRsZVNpemUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfd2luZG93VGl0bGVTdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV95ZXNOb1ByZWZlcmVuY2VTdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIFRvZ2dsZUJ1dHRvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUb2dnbGVCdXR0b25fZGlzYWJsZWRBbHBoYQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUb2dnbGVCdXR0b25fdGV4dE9mZgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUb2dnbGVCdXR0b25fdGV4dE9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gVHJhbnNsYXRlQW5pbWF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRyYW5zbGF0ZUFuaW1hdGlvbl9mcm9tWERlbHRhCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRyYW5zbGF0ZUFuaW1hdGlvbl9mcm9tWURlbHRhCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRyYW5zbGF0ZUFuaW1hdGlvbl90b1hEZWx0YQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUcmFuc2xhdGVBbmltYXRpb25fdG9ZRGVsdGEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBUd29MaW5lTGlzdEl0ZW0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVHdvTGluZUxpc3RJdGVtX21vZGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBWZXJ0aWNhbFNsaWRlcl9MYXlvdXQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVmVydGljYWxTbGlkZXJfTGF5b3V0X2xheW91dF9zY2FsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIFZpZXcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBWaWV3QW5pbWF0b3IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVmlld0FuaW1hdG9yX2luQW5pbWF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZpZXdBbmltYXRvcl9vdXRBbmltYXRpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBWaWV3RHJhd2FibGVTdGF0ZXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVmlld0RyYXdhYmxlU3RhdGVzX3N0YXRlX2VuYWJsZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVmlld0RyYXdhYmxlU3RhdGVzX3N0YXRlX2ZvY3VzZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVmlld0RyYXdhYmxlU3RhdGVzX3N0YXRlX3ByZXNzZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVmlld0RyYXdhYmxlU3RhdGVzX3N0YXRlX3NlbGVjdGVkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZpZXdEcmF3YWJsZVN0YXRlc19zdGF0ZV93aW5kb3dfZm9jdXNlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIFZpZXdGbGlwcGVyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZpZXdGbGlwcGVyX2ZsaXBJbnRlcnZhbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIFZpZXdHcm91cAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIFZpZXdHcm91cF9MYXlvdXQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVmlld0dyb3VwX0xheW91dF9sYXlvdXRfaGVpZ2h0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZpZXdHcm91cF9MYXlvdXRfbGF5b3V0X3dpZHRoCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gVmlld0dyb3VwX01hcmdpbkxheW91dAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWaWV3R3JvdXBfTWFyZ2luTGF5b3V0X2xheW91dF9oZWlnaHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVmlld0dyb3VwX01hcmdpbkxheW91dF9sYXlvdXRfbWFyZ2luCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZpZXdHcm91cF9NYXJnaW5MYXlvdXRfbGF5b3V0X21hcmdpbkJvdHRvbQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWaWV3R3JvdXBfTWFyZ2luTGF5b3V0X2xheW91dF9tYXJnaW5MZWZ0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZpZXdHcm91cF9NYXJnaW5MYXlvdXRfbGF5b3V0X21hcmdpblJpZ2h0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZpZXdHcm91cF9NYXJnaW5MYXlvdXRfbGF5b3V0X21hcmdpblRvcAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWaWV3R3JvdXBfTWFyZ2luTGF5b3V0X2xheW91dF93aWR0aAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWaWV3R3JvdXBfYWRkU3RhdGVzRnJvbUNoaWxkcmVuCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZpZXdHcm91cF9hbHdheXNEcmF3bldpdGhDYWNoZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWaWV3R3JvdXBfYW5pbWF0aW9uQ2FjaGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVmlld0dyb3VwX2NsaXBDaGlsZHJlbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWaWV3R3JvdXBfY2xpcFRvUGFkZGluZwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWaWV3R3JvdXBfZGVzY2VuZGFudEZvY3VzYWJpbGl0eQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWaWV3R3JvdXBfbGF5b3V0QW5pbWF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZpZXdHcm91cF9wZXJzaXN0ZW50RHJhd2luZ0NhY2hlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gVmlld1N0dWIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVmlld1N0dWJfaW5mbGF0ZWRJZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWaWV3U3R1Yl9sYXlvdXQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBWaWV3U3dpdGNoZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVmlld19iYWNrZ3JvdW5kCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZpZXdfY2xpY2thYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZpZXdfZHJhd2luZ0NhY2hlUXVhbGl0eQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWaWV3X2R1cGxpY2F0ZVBhcmVudFN0YXRlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZpZXdfZmFkaW5nRWRnZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWaWV3X2ZhZGluZ0VkZ2VMZW5ndGgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVmlld19maXRzU3lzdGVtV2luZG93cwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWaWV3X2ZvY3VzYWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWaWV3X2ZvY3VzYWJsZUluVG91Y2hNb2RlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZpZXdfaWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVmlld19rZWVwU2NyZWVuT24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVmlld19sb25nQ2xpY2thYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZpZXdfbWluSGVpZ2h0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZpZXdfbWluV2lkdGgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVmlld19uZXh0Rm9jdXNEb3duCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZpZXdfbmV4dEZvY3VzTGVmdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWaWV3X25leHRGb2N1c1JpZ2h0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZpZXdfbmV4dEZvY3VzVXAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVmlld19wYWRkaW5nCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZpZXdfcGFkZGluZ0JvdHRvbQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWaWV3X3BhZGRpbmdMZWZ0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZpZXdfcGFkZGluZ1JpZ2h0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZpZXdfcGFkZGluZ1RvcAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWaWV3X3NhdmVFbmFibGVkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZpZXdfc2Nyb2xsWAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWaWV3X3Njcm9sbFkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVmlld19zY3JvbGxiYXJBbHdheXNEcmF3SG9yaXpvbnRhbFRyYWNrCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZpZXdfc2Nyb2xsYmFyQWx3YXlzRHJhd1ZlcnRpY2FsVHJhY2sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVmlld19zY3JvbGxiYXJTaXplCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZpZXdfc2Nyb2xsYmFyU3R5bGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVmlld19zY3JvbGxiYXJUaHVtYkhvcml6b250YWwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVmlld19zY3JvbGxiYXJUaHVtYlZlcnRpY2FsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZpZXdfc2Nyb2xsYmFyVHJhY2tIb3Jpem9udGFsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZpZXdfc2Nyb2xsYmFyVHJhY2tWZXJ0aWNhbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWaWV3X3Njcm9sbGJhcnMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVmlld19zb3VuZEVmZmVjdHNFbmFibGVkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZpZXdfdGFnCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZpZXdfdmlzaWJpbGl0eQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIFZvbHVtZVByZWZlcmVuY2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVm9sdW1lUHJlZmVyZW5jZV9zdHJlYW1UeXBlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gV2luZG93Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gV2luZG93QW5pbWF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpbmRvd0FuaW1hdGlvbl9hY3Rpdml0eUNsb3NlRW50ZXJBbmltYXRpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2luZG93QW5pbWF0aW9uX2FjdGl2aXR5Q2xvc2VFeGl0QW5pbWF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpbmRvd0FuaW1hdGlvbl9hY3Rpdml0eU9wZW5FbnRlckFuaW1hdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaW5kb3dBbmltYXRpb25fYWN0aXZpdHlPcGVuRXhpdEFuaW1hdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaW5kb3dBbmltYXRpb25fdGFza0Nsb3NlRW50ZXJBbmltYXRpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2luZG93QW5pbWF0aW9uX3Rhc2tDbG9zZUV4aXRBbmltYXRpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2luZG93QW5pbWF0aW9uX3Rhc2tPcGVuRW50ZXJBbmltYXRpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2luZG93QW5pbWF0aW9uX3Rhc2tPcGVuRXhpdEFuaW1hdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaW5kb3dBbmltYXRpb25fdGFza1RvQmFja0VudGVyQW5pbWF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpbmRvd0FuaW1hdGlvbl90YXNrVG9CYWNrRXhpdEFuaW1hdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaW5kb3dBbmltYXRpb25fdGFza1RvRnJvbnRFbnRlckFuaW1hdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaW5kb3dBbmltYXRpb25fdGFza1RvRnJvbnRFeGl0QW5pbWF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpbmRvd0FuaW1hdGlvbl93aW5kb3dFbnRlckFuaW1hdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaW5kb3dBbmltYXRpb25fd2luZG93RXhpdEFuaW1hdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaW5kb3dBbmltYXRpb25fd2luZG93SGlkZUFuaW1hdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaW5kb3dBbmltYXRpb25fd2luZG93U2hvd0FuaW1hdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaW5kb3dfdGV4dENvbG9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpbmRvd193aW5kb3dBbmltYXRpb25TdHlsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaW5kb3dfd2luZG93QmFja2dyb3VuZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaW5kb3dfd2luZG93Q29udGVudE92ZXJsYXkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2luZG93X3dpbmRvd0ZyYW1lCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpbmRvd193aW5kb3dGdWxsc2NyZWVuCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpbmRvd193aW5kb3dJc0Zsb2F0aW5nCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpbmRvd193aW5kb3dJc1RyYW5zbHVjZW50Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpbmRvd193aW5kb3dOb1RpdGxlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjUgbmFtZSA9eG1sICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC9SOyApCi1wdWJsaWMgZmluYWwgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwuUiR4bWwgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGFwbnMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYXV0b3RleHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJlZmVycmVkX3RpbWVfem9uZXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGltZV96b25lc19ieV9jb3VudHJ5Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC9SJHN0eWxlYWJsZTtMY29tL2FuZHJvaWQvaW50ZXJuYWwvUiR4bWw7TGNvbS9hbmRyb2lkL2ludGVybmFsL1Ikc3R5bGU7TGNvbS9hbmRyb2lkL2ludGVybmFsL1Ikc3RyaW5nO0xjb20vYW5kcm9pZC9pbnRlcm5hbC9SJHJhdztMY29tL2FuZHJvaWQvaW50ZXJuYWwvUiRwbHVyYWxzO0xjb20vYW5kcm9pZC9pbnRlcm5hbC9SJGxheW91dDtMY29tL2FuZHJvaWQvaW50ZXJuYWwvUiRpZDtMY29tL2FuZHJvaWQvaW50ZXJuYWwvUiRkcmF3YWJsZTtMY29tL2FuZHJvaWQvaW50ZXJuYWwvUiRkaW1lbjtMY29tL2FuZHJvaWQvaW50ZXJuYWwvUiRjb2xvcjtMY29tL2FuZHJvaWQvaW50ZXJuYWwvUiRhdHRyO0xjb20vYW5kcm9pZC9pbnRlcm5hbC9SJGFycmF5O0xjb20vYW5kcm9pZC9pbnRlcm5hbC9SJGFuaW07ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5SIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLkFsZXJ0QWN0aXZpdHkgZXh0ZW5kcyBhbmRyb2lkLmFwcC5BY3Rpdml0eSBpbXBsZW1lbnRzIGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIGNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5BbGVydENvbnRyb2xsZXIgbUFsZXJ0Ci0KLXByb3RlY3RlZCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuQWxlcnRDb250cm9sbGVyJEFsZXJ0UGFyYW1zIG1BbGVydFBhcmFtcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIGNhbmNlbCgpCi0KLXB1YmxpYyB2b2lkIGRpc21pc3MoKQotCi1wcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZSgKLWFuZHJvaWQub3MuQnVuZGxlKQotCi1wdWJsaWMgYm9vbGVhbiBvbktleURvd24oCi1pbnQKLWFuZHJvaWQudmlldy5LZXlFdmVudCkKLQotcHVibGljIGJvb2xlYW4gb25LZXlVcCgKLWludAotYW5kcm9pZC52aWV3LktleUV2ZW50KQotCi1wcm90ZWN0ZWQgdm9pZCBzZXR1cEFsZXJ0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL0FsZXJ0Q29udHJvbGxlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5BbGVydENvbnRyb2xsZXIkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnZpZXcuVmlldyRPbkNsaWNrTGlzdGVuZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLkFsZXJ0Q29udHJvbGxlciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1jb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuQWxlcnRDb250cm9sbGVyKQotCi1wdWJsaWMgdm9pZCBvbkNsaWNrKAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxhbmRyb2lkL3dpZGdldC9BcnJheUFkYXB0ZXI8TGphdmEvbGFuZy9DaGFyU2VxdWVuY2U7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5BbGVydENvbnRyb2xsZXIkQWxlcnRQYXJhbXMkMSBleHRlbmRzIGFuZHJvaWQud2lkZ2V0LkFycmF5QWRhcHRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuQWxlcnRDb250cm9sbGVyJEFsZXJ0UGFyYW1zIHRoaXMkMAotCi1maW5hbCBhbmRyb2lkLndpZGdldC5MaXN0VmlldyB2YWwkbGlzdFZpZXcKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1jb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuQWxlcnRDb250cm9sbGVyJEFsZXJ0UGFyYW1zCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotaW50Ci1pbnQKLWphdmEubGFuZy5DaGFyU2VxdWVuY2VbXQotYW5kcm9pZC53aWRnZXQuTGlzdFZpZXcpCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuVmlldyBnZXRWaWV3KAotaW50Ci1hbmRyb2lkLnZpZXcuVmlldwotYW5kcm9pZC52aWV3LlZpZXdHcm91cCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi0gY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLkFsZXJ0Q29udHJvbGxlciRBbGVydFBhcmFtcyQyIGV4dGVuZHMgYW5kcm9pZC53aWRnZXQuQ3Vyc29yQWRhcHRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuQWxlcnRDb250cm9sbGVyJEFsZXJ0UGFyYW1zIHRoaXMkMAotCi1maW5hbCBhbmRyb2lkLndpZGdldC5MaXN0VmlldyB2YWwkbGlzdFZpZXcKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1jb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuQWxlcnRDb250cm9sbGVyJEFsZXJ0UGFyYW1zCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IKLWJvb2xlYW4KLWFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3KQotCi1wdWJsaWMgdm9pZCBiaW5kVmlldygKLWFuZHJvaWQudmlldy5WaWV3Ci1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IpCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuVmlldyBuZXdWaWV3KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yCi1hbmRyb2lkLnZpZXcuVmlld0dyb3VwKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLSBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuQWxlcnRDb250cm9sbGVyJEFsZXJ0UGFyYW1zJDMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXckT25JdGVtQ2xpY2tMaXN0ZW5lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuQWxlcnRDb250cm9sbGVyJEFsZXJ0UGFyYW1zIHRoaXMkMAotCi1maW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuQWxlcnRDb250cm9sbGVyIHZhbCRkaWFsb2cKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1jb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuQWxlcnRDb250cm9sbGVyJEFsZXJ0UGFyYW1zCi1jb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuQWxlcnRDb250cm9sbGVyKQotCi1wdWJsaWMgdm9pZCBvbkl0ZW1DbGljaygKLWFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3Ci1hbmRyb2lkLnZpZXcuVmlldwotaW50Ci1sb25nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLSBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuQWxlcnRDb250cm9sbGVyJEFsZXJ0UGFyYW1zJDQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXckT25JdGVtQ2xpY2tMaXN0ZW5lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuQWxlcnRDb250cm9sbGVyJEFsZXJ0UGFyYW1zIHRoaXMkMAotCi1maW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuQWxlcnRDb250cm9sbGVyIHZhbCRkaWFsb2cKLQotZmluYWwgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXcgdmFsJGxpc3RWaWV3Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLkFsZXJ0Q29udHJvbGxlciRBbGVydFBhcmFtcwotYW5kcm9pZC53aWRnZXQuTGlzdFZpZXcKLWNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5BbGVydENvbnRyb2xsZXIpCi0KLXB1YmxpYyB2b2lkIG9uSXRlbUNsaWNrKAotYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXcKLWFuZHJvaWQudmlldy5WaWV3Ci1pbnQKLWxvbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9BbGVydENvbnRyb2xsZXIkQWxlcnRQYXJhbXM7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1PblByZXBhcmVMaXN0Vmlld0xpc3RlbmVyICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLkFsZXJ0Q29udHJvbGxlciRBbGVydFBhcmFtcyRPblByZXBhcmVMaXN0Vmlld0xpc3RlbmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uUHJlcGFyZUxpc3RWaWV3KAotYW5kcm9pZC53aWRnZXQuTGlzdFZpZXcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPUFsZXJ0UGFyYW1zICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvQWxlcnRDb250cm9sbGVyOyApCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvQWxlcnRDb250cm9sbGVyJEFsZXJ0UGFyYW1zJE9uUHJlcGFyZUxpc3RWaWV3TGlzdGVuZXI7ICkKLXB1YmxpYyBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuQWxlcnRDb250cm9sbGVyJEFsZXJ0UGFyYW1zIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYW5kcm9pZC53aWRnZXQuTGlzdEFkYXB0ZXIgbUFkYXB0ZXIKLQotcHVibGljIGJvb2xlYW4gbUNhbmNlbGFibGUKLQotcHVibGljIGludCBtQ2hlY2tlZEl0ZW0KLQotcHVibGljIGJvb2xlYW5bXSBtQ2hlY2tlZEl0ZW1zCi0KLXB1YmxpYyBmaW5hbCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBtQ29udGV4dAotCi1wdWJsaWMgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IgbUN1cnNvcgotCi1wdWJsaWMgYW5kcm9pZC52aWV3LlZpZXcgbUN1c3RvbVRpdGxlVmlldwotCi1wdWJsaWMgYm9vbGVhbiBtRm9yY2VJbnZlcnNlQmFja2dyb3VuZAotCi1wdWJsaWMgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSBtSWNvbgotCi1wdWJsaWMgaW50IG1JY29uSWQKLQotcHVibGljIGZpbmFsIGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlciBtSW5mbGF0ZXIKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgbUlzQ2hlY2tlZENvbHVtbgotCi1wdWJsaWMgYm9vbGVhbiBtSXNNdWx0aUNob2ljZQotCi1wdWJsaWMgYm9vbGVhbiBtSXNTaW5nbGVDaG9pY2UKLQotcHVibGljIGphdmEubGFuZy5DaGFyU2VxdWVuY2VbXSBtSXRlbXMKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgbUxhYmVsQ29sdW1uCi0KLXB1YmxpYyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIG1NZXNzYWdlCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlJE9uQ2xpY2tMaXN0ZW5lciBtTmVnYXRpdmVCdXR0b25MaXN0ZW5lcgotCi1wdWJsaWMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBtTmVnYXRpdmVCdXR0b25UZXh0Ci0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlJE9uQ2xpY2tMaXN0ZW5lciBtTmV1dHJhbEJ1dHRvbkxpc3RlbmVyCi0KLXB1YmxpYyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIG1OZXV0cmFsQnV0dG9uVGV4dAotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZSRPbkNhbmNlbExpc3RlbmVyIG1PbkNhbmNlbExpc3RlbmVyCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlJE9uTXVsdGlDaG9pY2VDbGlja0xpc3RlbmVyIG1PbkNoZWNrYm94Q2xpY2tMaXN0ZW5lcgotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZSRPbkNsaWNrTGlzdGVuZXIgbU9uQ2xpY2tMaXN0ZW5lcgotCi1wdWJsaWMgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXckT25JdGVtU2VsZWN0ZWRMaXN0ZW5lciBtT25JdGVtU2VsZWN0ZWRMaXN0ZW5lcgotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZSRPbktleUxpc3RlbmVyIG1PbktleUxpc3RlbmVyCi0KLXB1YmxpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuQWxlcnRDb250cm9sbGVyJEFsZXJ0UGFyYW1zJE9uUHJlcGFyZUxpc3RWaWV3TGlzdGVuZXIgbU9uUHJlcGFyZUxpc3RWaWV3TGlzdGVuZXIKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UkT25DbGlja0xpc3RlbmVyIG1Qb3NpdGl2ZUJ1dHRvbkxpc3RlbmVyCi0KLXB1YmxpYyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIG1Qb3NpdGl2ZUJ1dHRvblRleHQKLQotcHVibGljIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgbVRpdGxlCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuVmlldyBtVmlldwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wcml2YXRlIHZvaWQgY3JlYXRlTGlzdFZpZXcoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuQWxlcnRDb250cm9sbGVyKQotCi1wdWJsaWMgdm9pZCBhcHBseSgKLWNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5BbGVydENvbnRyb2xsZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9BbGVydENvbnRyb2xsZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjYgbmFtZSA9QnV0dG9uSGFuZGxlciApCi1maW5hbCBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuQWxlcnRDb250cm9sbGVyJEJ1dHRvbkhhbmRsZXIgZXh0ZW5kcyBhbmRyb2lkLm9zLkhhbmRsZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19ESVNNSVNTX0RJQUxPRwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvcmVmL1dlYWtSZWZlcmVuY2U8TGFuZHJvaWQvY29udGVudC9EaWFsb2dJbnRlcmZhY2U7PjsgKQotcHJpdmF0ZSBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2UgbURpYWxvZwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UpCi0KLXB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL0FsZXJ0Q29udHJvbGxlciRBbGVydFBhcmFtcztMY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL0FsZXJ0Q29udHJvbGxlciRCdXR0b25IYW5kbGVyOyApCi1wdWJsaWMgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLkFsZXJ0Q29udHJvbGxlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlciBtQWRhcHRlcgotCi1wcml2YXRlIGFuZHJvaWQud2lkZ2V0LkJ1dHRvbiBtQnV0dG9uMQotCi1wcml2YXRlIGFuZHJvaWQub3MuTWVzc2FnZSBtQnV0dG9uMU1lc3NhZ2UKLQotcHJpdmF0ZSBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIG1CdXR0b24xVGV4dAotCi1wcml2YXRlIGFuZHJvaWQud2lkZ2V0LkJ1dHRvbiBtQnV0dG9uMgotCi1wcml2YXRlIGFuZHJvaWQub3MuTWVzc2FnZSBtQnV0dG9uMk1lc3NhZ2UKLQotcHJpdmF0ZSBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIG1CdXR0b24yVGV4dAotCi1wcml2YXRlIGFuZHJvaWQud2lkZ2V0LkJ1dHRvbiBtQnV0dG9uMwotCi1wcml2YXRlIGFuZHJvaWQub3MuTWVzc2FnZSBtQnV0dG9uM01lc3NhZ2UKLQotcHJpdmF0ZSBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIG1CdXR0b24zVGV4dAotCi0gYW5kcm9pZC52aWV3LlZpZXckT25DbGlja0xpc3RlbmVyIG1CdXR0b25IYW5kbGVyCi0KLXByaXZhdGUgaW50IG1DaGVja2VkSXRlbQotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQuY29udGVudC5Db250ZXh0IG1Db250ZXh0Ci0KLXByaXZhdGUgYW5kcm9pZC52aWV3LlZpZXcgbUN1c3RvbVRpdGxlVmlldwotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UgbURpYWxvZ0ludGVyZmFjZQotCi1wcml2YXRlIGJvb2xlYW4gbUZvcmNlSW52ZXJzZUJhY2tncm91bmQKLQotcHJpdmF0ZSBhbmRyb2lkLm9zLkhhbmRsZXIgbUhhbmRsZXIKLQotcHJpdmF0ZSBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIG1JY29uCi0KLXByaXZhdGUgaW50IG1JY29uSWQKLQotcHJpdmF0ZSBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXcgbUljb25WaWV3Ci0KLXByaXZhdGUgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXcgbUxpc3RWaWV3Ci0KLXByaXZhdGUgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBtTWVzc2FnZQotCi1wcml2YXRlIGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3IG1NZXNzYWdlVmlldwotCi1wcml2YXRlIGFuZHJvaWQud2lkZ2V0LlNjcm9sbFZpZXcgbVNjcm9sbFZpZXcKLQotcHJpdmF0ZSBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIG1UaXRsZQotCi1wcml2YXRlIGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3IG1UaXRsZVZpZXcKLQotcHJpdmF0ZSBhbmRyb2lkLnZpZXcuVmlldyBtVmlldwotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQudmlldy5XaW5kb3cgbVdpbmRvdwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlCi1hbmRyb2lkLnZpZXcuV2luZG93KQotCi1zdGF0aWMgYW5kcm9pZC53aWRnZXQuQnV0dG9uIGFjY2VzcyQwMDAoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuQWxlcnRDb250cm9sbGVyKQotCi1zdGF0aWMgYW5kcm9pZC5vcy5NZXNzYWdlIGFjY2VzcyQxMDAoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuQWxlcnRDb250cm9sbGVyKQotCi1zdGF0aWMgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXcgYWNjZXNzJDEwMDIoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuQWxlcnRDb250cm9sbGVyCi1hbmRyb2lkLndpZGdldC5MaXN0VmlldykKLQotc3RhdGljIGFuZHJvaWQud2lkZ2V0LkJ1dHRvbiBhY2Nlc3MkMjAwKAotY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLkFsZXJ0Q29udHJvbGxlcikKLQotc3RhdGljIGFuZHJvaWQub3MuTWVzc2FnZSBhY2Nlc3MkMzAwKAotY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLkFsZXJ0Q29udHJvbGxlcikKLQotc3RhdGljIGFuZHJvaWQud2lkZ2V0LkJ1dHRvbiBhY2Nlc3MkNDAwKAotY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLkFsZXJ0Q29udHJvbGxlcikKLQotc3RhdGljIGFuZHJvaWQub3MuTWVzc2FnZSBhY2Nlc3MkNTAwKAotY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLkFsZXJ0Q29udHJvbGxlcikKLQotc3RhdGljIGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UgYWNjZXNzJDYwMCgKLWNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5BbGVydENvbnRyb2xsZXIpCi0KLXN0YXRpYyBhbmRyb2lkLm9zLkhhbmRsZXIgYWNjZXNzJDcwMCgKLWNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5BbGVydENvbnRyb2xsZXIpCi0KLXN0YXRpYyBhbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlciBhY2Nlc3MkODAyKAotY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLkFsZXJ0Q29udHJvbGxlcgotYW5kcm9pZC53aWRnZXQuTGlzdEFkYXB0ZXIpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDkwMigKLWNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5BbGVydENvbnRyb2xsZXIKLWludCkKLQotcHJpdmF0ZSB2b2lkIGNlbnRlckJ1dHRvbigKLWFuZHJvaWQud2lkZ2V0LkJ1dHRvbikKLQotcHJpdmF0ZSBpbnQgZ2V0TGFyZ2VUZXh0U2l6ZSgpCi0KLXByaXZhdGUgdm9pZCBzZXRCYWNrZ3JvdW5kKAotYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0Ci1hbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQKLWFuZHJvaWQudmlldy5WaWV3Ci1ib29sZWFuCi1hbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXkKLWJvb2xlYW4KLWFuZHJvaWQudmlldy5WaWV3KQotCi1wcml2YXRlIGJvb2xlYW4gc2V0dXBCdXR0b25zKCkKLQotcHJpdmF0ZSB2b2lkIHNldHVwQ29udGVudCgKLWFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dCkKLQotcHJpdmF0ZSBib29sZWFuIHNldHVwVGl0bGUoCi1hbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQKLWJvb2xlYW4pCi0KLXByaXZhdGUgdm9pZCBzZXR1cFZpZXcoKQotCi1wdWJsaWMgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXcgZ2V0TGlzdFZpZXcoKQotCi1wdWJsaWMgdm9pZCBpbnN0YWxsQ29udGVudCgpCi0KLXB1YmxpYyBib29sZWFuIG9uS2V5RG93bigKLWludAotYW5kcm9pZC52aWV3LktleUV2ZW50KQotCi1wdWJsaWMgYm9vbGVhbiBvbktleVVwKAotaW50Ci1hbmRyb2lkLnZpZXcuS2V5RXZlbnQpCi0KLXB1YmxpYyB2b2lkIHNldEJ1dHRvbigKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UkT25DbGlja0xpc3RlbmVyKQotCi1wdWJsaWMgdm9pZCBzZXRCdXR0b24oCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIHNldEJ1dHRvbjIoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1hbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlJE9uQ2xpY2tMaXN0ZW5lcikKLQotcHVibGljIHZvaWQgc2V0QnV0dG9uMigKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgc2V0QnV0dG9uMygKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UkT25DbGlja0xpc3RlbmVyKQotCi1wdWJsaWMgdm9pZCBzZXRCdXR0b24zKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBzZXRDdXN0b21UaXRsZSgKLWFuZHJvaWQudmlldy5WaWV3KQotCi1wdWJsaWMgdm9pZCBzZXRJY29uKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRJY29uKAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSkKLQotcHVibGljIHZvaWQgc2V0SW52ZXJzZUJhY2tncm91bmRGb3JjZWQoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRNZXNzYWdlKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotcHVibGljIHZvaWQgc2V0VGl0bGUoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotCi1wdWJsaWMgdm9pZCBzZXRWaWV3KAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL1Jlc29sdmVyQWN0aXZpdHkkUmVzb2x2ZUxpc3RBZGFwdGVyOyApCi1wdWJsaWMgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLlJlc29sdmVyQWN0aXZpdHkgZXh0ZW5kcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuQWxlcnRBY3Rpdml0eSBpbXBsZW1lbnRzIGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UkT25DbGlja0xpc3RlbmVyLCBhbmRyb2lkLndpZGdldC5Db21wb3VuZEJ1dHRvbiRPbkNoZWNrZWRDaGFuZ2VMaXN0ZW5lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5SZXNvbHZlckFjdGl2aXR5JFJlc29sdmVMaXN0QWRhcHRlciBtQWRhcHRlcgotCi1wcml2YXRlIGFuZHJvaWQud2lkZ2V0LkNoZWNrQm94IG1BbHdheXNDaGVjawotCi1wcml2YXRlIGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3IG1DbGVhckRlZmF1bHRIaW50Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotc3RhdGljIGFuZHJvaWQud2lkZ2V0LkNoZWNrQm94IGFjY2VzcyQxMDAoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuUmVzb2x2ZXJBY3Rpdml0eSkKLQotcHVibGljIHZvaWQgb25DaGVja2VkQ2hhbmdlZCgKLWFuZHJvaWQud2lkZ2V0LkNvbXBvdW5kQnV0dG9uCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBvbkNsaWNrKAotYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZQotaW50KQotCi1wcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZSgKLWFuZHJvaWQub3MuQnVuZGxlKQotCi1wcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZSgKLWFuZHJvaWQub3MuQnVuZGxlCi1hbmRyb2lkLmNvbnRlbnQuSW50ZW50Ci1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1ib29sZWFuKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5DaG9vc2VyQWN0aXZpdHkgZXh0ZW5kcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuUmVzb2x2ZXJBY3Rpdml0eQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKAotYW5kcm9pZC5vcy5CdW5kbGUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL0lCYXR0ZXJ5U3RhdHMkU3R1YjsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuSUJhdHRlcnlTdGF0cyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLklJbnRlcmZhY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGxvbmcgZ2V0QXdha2VUaW1lQmF0dGVyeSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgbG9uZyBnZXRBd2FrZVRpbWVQbHVnZ2VkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG5vdGVTdGFydFdha2Vsb2NrKAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBub3RlU3RvcFdha2Vsb2NrKAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRPbkJhdHRlcnkoCi1ib29sZWFuKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvSUJhdHRlcnlTdGF0cyRTdHViOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPVByb3h5ICkKLSBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuSUJhdHRlcnlTdGF0cyRTdHViJFByb3h5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5JQmF0dGVyeVN0YXRzCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5JQmluZGVyIG1SZW1vdGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGxvbmcgZ2V0QXdha2VUaW1lQmF0dGVyeSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgbG9uZyBnZXRBd2FrZVRpbWVQbHVnZ2VkKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBub3RlU3RhcnRXYWtlbG9jaygKLWludAotamF2YS5sYW5nLlN0cmluZwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgbm90ZVN0b3BXYWtlbG9jaygKLWludAotamF2YS5sYW5nLlN0cmluZwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0T25CYXR0ZXJ5KAotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvSUJhdHRlcnlTdGF0cyRTdHViJFByb3h5OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwMzMgbmFtZSA9U3R1YiApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL0lCYXR0ZXJ5U3RhdHM7ICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuSUJhdHRlcnlTdGF0cyRTdHViIGV4dGVuZHMgYW5kcm9pZC5vcy5CaW5kZXIgaW1wbGVtZW50cyBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuSUJhdHRlcnlTdGF0cwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFU0NSSVBUT1IKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9nZXRBd2FrZVRpbWVCYXR0ZXJ5Ci0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZ2V0QXdha2VUaW1lUGx1Z2dlZAotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX25vdGVTdGFydFdha2Vsb2NrCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fbm90ZVN0b3BXYWtlbG9jawotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3NldE9uQmF0dGVyeQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLklCYXR0ZXJ5U3RhdHMgYXNJbnRlcmZhY2UoCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gb25UcmFuc2FjdCgKLWludAotYW5kcm9pZC5vcy5QYXJjZWwKLWFuZHJvaWQub3MuUGFyY2VsCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9SZXNvbHZlckFjdGl2aXR5OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE4IG5hbWUgPVJlc29sdmVMaXN0QWRhcHRlciApCi1maW5hbCBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuUmVzb2x2ZXJBY3Rpdml0eSRSZXNvbHZlTGlzdEFkYXB0ZXIgZXh0ZW5kcyBhbmRyb2lkLndpZGdldC5CYXNlQWRhcHRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlciBtSW5mbGF0ZXIKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50IG1JbnRlbnQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0xpc3Q8TGFuZHJvaWQvY29udGVudC9wbS9SZXNvbHZlSW5mbzs+OyApCi1wcml2YXRlIGphdmEudXRpbC5MaXN0IG1MaXN0Ci0KLWZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5SZXNvbHZlckFjdGl2aXR5IHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5SZXNvbHZlckFjdGl2aXR5Ci1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC5jb250ZW50LkludGVudCkKLQotc3RhdGljIGphdmEudXRpbC5MaXN0IGFjY2VzcyQwMDAoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuUmVzb2x2ZXJBY3Rpdml0eSRSZXNvbHZlTGlzdEFkYXB0ZXIpCi0KLXByaXZhdGUgZmluYWwgdm9pZCBiaW5kVmlldygKLWFuZHJvaWQudmlldy5WaWV3Ci1hbmRyb2lkLmNvbnRlbnQucG0uUmVzb2x2ZUluZm8pCi0KLXB1YmxpYyBpbnQgZ2V0Q291bnQoKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRJdGVtKAotaW50KQotCi1wdWJsaWMgbG9uZyBnZXRJdGVtSWQoCi1pbnQpCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuVmlldyBnZXRWaWV3KAotaW50Ci1hbmRyb2lkLnZpZXcuVmlldwotYW5kcm9pZC52aWV3LlZpZXdHcm91cCkKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5JbnRlbnQgaW50ZW50Rm9yUG9zaXRpb24oCi1pbnQpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQucG0uUmVzb2x2ZUluZm8gcmVzb2x2ZUluZm9Gb3JQb3NpdGlvbigKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL1Jpbmd0b25lUGlja2VyQWN0aXZpdHk7ICkKLSBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuUmluZ3RvbmVQaWNrZXJBY3Rpdml0eSQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UkT25DbGlja0xpc3RlbmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5SaW5ndG9uZVBpY2tlckFjdGl2aXR5IHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5SaW5ndG9uZVBpY2tlckFjdGl2aXR5KQotCi1wdWJsaWMgdm9pZCBvbkNsaWNrKAotYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZQotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5SaW5ndG9uZVBpY2tlckFjdGl2aXR5IGV4dGVuZHMgY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLkFsZXJ0QWN0aXZpdHkgaW1wbGVtZW50cyBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldyRPbkl0ZW1TZWxlY3RlZExpc3RlbmVyLCBqYXZhLmxhbmcuUnVubmFibGUsIGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UkT25DbGlja0xpc3RlbmVyLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuQWxlcnRDb250cm9sbGVyJEFsZXJ0UGFyYW1zJE9uUHJlcGFyZUxpc3RWaWV3TGlzdGVuZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFTEFZX01TX1NFTEVDVElPTl9QTEFZRUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLQotcHJpdmF0ZSBpbnQgbUNsaWNrZWRQb3MKLQotcHJpdmF0ZSBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciBtQ3Vyc29yCi0KLXByaXZhdGUgYW5kcm9pZC5tZWRpYS5SaW5ndG9uZSBtRGVmYXVsdFJpbmd0b25lCi0KLXByaXZhdGUgaW50IG1EZWZhdWx0UmluZ3RvbmVQb3MKLQotcHJpdmF0ZSBhbmRyb2lkLm5ldC5VcmkgbUV4aXN0aW5nVXJpCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5IYW5kbGVyIG1IYW5kbGVyCi0KLXByaXZhdGUgYm9vbGVhbiBtSGFzRGVmYXVsdEl0ZW0KLQotcHJpdmF0ZSBib29sZWFuIG1IYXNTaWxlbnRJdGVtCi0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZSRPbkNsaWNrTGlzdGVuZXIgbVJpbmd0b25lQ2xpY2tMaXN0ZW5lcgotCi1wcml2YXRlIGFuZHJvaWQubWVkaWEuUmluZ3RvbmVNYW5hZ2VyIG1SaW5ndG9uZU1hbmFnZXIKLQotcHJpdmF0ZSBpbnQgbVNhbXBsZVJpbmd0b25lUG9zCi0KLXByaXZhdGUgaW50IG1TaWxlbnRQb3MKLQotcHJpdmF0ZSBpbnQgbVN0YXRpY0l0ZW1Db3VudAotCi1wcml2YXRlIGFuZHJvaWQubmV0LlVyaSBtVXJpRm9yRGVmYXVsdEl0ZW0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1zdGF0aWMgaW50IGFjY2VzcyQwMDIoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuUmluZ3RvbmVQaWNrZXJBY3Rpdml0eQotaW50KQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMTAwKAotY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLlJpbmd0b25lUGlja2VyQWN0aXZpdHkKLWludAotaW50KQotCi1wcml2YXRlIGludCBhZGREZWZhdWx0UmluZ3RvbmVJdGVtKAotYW5kcm9pZC53aWRnZXQuTGlzdFZpZXcpCi0KLXByaXZhdGUgaW50IGFkZFNpbGVudEl0ZW0oCi1hbmRyb2lkLndpZGdldC5MaXN0VmlldykKLQotcHJpdmF0ZSBpbnQgYWRkU3RhdGljSXRlbSgKLWFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3Ci1pbnQpCi0KLXByaXZhdGUgaW50IGdldExpc3RQb3NpdGlvbigKLWludCkKLQotcHJpdmF0ZSBpbnQgZ2V0UmluZ3RvbmVNYW5hZ2VyUG9zaXRpb24oCi1pbnQpCi0KLXByaXZhdGUgdm9pZCBwbGF5UmluZ3RvbmUoCi1pbnQKLWludCkKLQotcHJpdmF0ZSB2b2lkIHN0b3BBbnlQbGF5aW5nUmluZ3RvbmUoKQotCi1wdWJsaWMgdm9pZCBvbkNsaWNrKAotYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZQotaW50KQotCi1wcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZSgKLWFuZHJvaWQub3MuQnVuZGxlKQotCi1wdWJsaWMgdm9pZCBvbkl0ZW1TZWxlY3RlZCgKLWFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3Ci1hbmRyb2lkLnZpZXcuVmlldwotaW50Ci1sb25nKQotCi1wdWJsaWMgdm9pZCBvbk5vdGhpbmdTZWxlY3RlZCgKLWFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3KQotCi1wcm90ZWN0ZWQgdm9pZCBvblBhdXNlKCkKLQotcHVibGljIHZvaWQgb25QcmVwYXJlTGlzdFZpZXcoCi1hbmRyb2lkLndpZGdldC5MaXN0VmlldykKLQotcHJvdGVjdGVkIHZvaWQgb25TdG9wKCkKLQotcHVibGljIHZvaWQgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5kYXRhYmFzZS5BcnJheUxpc3RDdXJzb3IgZXh0ZW5kcyBhbmRyb2lkLmRhdGFiYXNlLkFic3RyYWN0Q3Vyc29yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZ1tdIG1Db2x1bW5OYW1lcwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPVtMamF2YS91dGlsL0FycmF5TGlzdDxMamF2YS9sYW5nL09iamVjdDs+OyApCi1wcml2YXRlIGphdmEudXRpbC5BcnJheUxpc3RbXSBtUm93cwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFtMamF2YS9sYW5nL1N0cmluZztMamF2YS91dGlsL0FycmF5TGlzdDxMamF2YS91dGlsL0FycmF5TGlzdDs+OylWICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmdbXQotamF2YS51dGlsLkFycmF5TGlzdCkKLQotcHVibGljIGJvb2xlYW4gZGVsZXRlUm93KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBnZXRDb2x1bW5OYW1lcygpCi0KLXB1YmxpYyBpbnQgZ2V0Q291bnQoKQotCi1wdWJsaWMgZG91YmxlIGdldERvdWJsZSgKLWludCkKLQotcHVibGljIGZsb2F0IGdldEZsb2F0KAotaW50KQotCi1wdWJsaWMgaW50IGdldEludCgKLWludCkKLQotcHVibGljIGxvbmcgZ2V0TG9uZygKLWludCkKLQotcHVibGljIHNob3J0IGdldFNob3J0KAotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdHJpbmcoCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIGlzTnVsbCgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvZGF0YWJhc2UvU29ydEN1cnNvcjsgKQotIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLmRhdGFiYXNlLlNvcnRDdXJzb3IkMSBleHRlbmRzIGFuZHJvaWQuZGF0YWJhc2UuRGF0YVNldE9ic2VydmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLmRhdGFiYXNlLlNvcnRDdXJzb3IgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotY29tLmFuZHJvaWQuaW50ZXJuYWwuZGF0YWJhc2UuU29ydEN1cnNvcikKLQotcHVibGljIHZvaWQgb25DaGFuZ2VkKCkKLQotcHVibGljIHZvaWQgb25JbnZhbGlkYXRlZCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwuZGF0YWJhc2UuU29ydEN1cnNvciBleHRlbmRzIGFuZHJvaWQuZGF0YWJhc2UuQWJzdHJhY3RDdXJzb3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLQotcHJpdmF0ZSBmaW5hbCBpbnQgUk9XQ0FDSEVTSVpFCi0KLXByaXZhdGUgaW50W11bXSBtQ3VyUm93TnVtQ2FjaGUKLQotcHJpdmF0ZSBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciBtQ3Vyc29yCi0KLXByaXZhdGUgaW50W10gbUN1cnNvckNhY2hlCi0KLXByaXZhdGUgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3JbXSBtQ3Vyc29ycwotCi1wcml2YXRlIGludCBtTGFzdENhY2hlSGl0Ci0KLXByaXZhdGUgYW5kcm9pZC5kYXRhYmFzZS5EYXRhU2V0T2JzZXJ2ZXIgbU9ic2VydmVyCi0KLXByaXZhdGUgaW50W10gbVJvd051bUNhY2hlCi0KLXByaXZhdGUgaW50W10gbVNvcnRDb2x1bW5zCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3JbXQotamF2YS5sYW5nLlN0cmluZykKLQotc3RhdGljIGludCBhY2Nlc3MkMDAyKAotY29tLmFuZHJvaWQuaW50ZXJuYWwuZGF0YWJhc2UuU29ydEN1cnNvcgotaW50KQotCi1zdGF0aWMgaW50IGFjY2VzcyQxMDIoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC5kYXRhYmFzZS5Tb3J0Q3Vyc29yCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGNsb3NlKCkKLQotcHVibGljIGJvb2xlYW4gY29tbWl0VXBkYXRlcygpCi0KLXB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKQotCi1wdWJsaWMgYm9vbGVhbiBkZWxldGVSb3coKQotCi1wdWJsaWMgYnl0ZVtdIGdldEJsb2IoCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0Q29sdW1uTmFtZXMoKQotCi1wdWJsaWMgaW50IGdldENvdW50KCkKLQotcHVibGljIGRvdWJsZSBnZXREb3VibGUoCi1pbnQpCi0KLXB1YmxpYyBmbG9hdCBnZXRGbG9hdCgKLWludCkKLQotcHVibGljIGludCBnZXRJbnQoCi1pbnQpCi0KLXB1YmxpYyBsb25nIGdldExvbmcoCi1pbnQpCi0KLXB1YmxpYyBzaG9ydCBnZXRTaG9ydCgKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nKAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBpc051bGwoCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIG9uTW92ZSgKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCByZWdpc3RlckRhdGFTZXRPYnNlcnZlcigKLWFuZHJvaWQuZGF0YWJhc2UuRGF0YVNldE9ic2VydmVyKQotCi1wdWJsaWMgYm9vbGVhbiByZXF1ZXJ5KCkKLQotcHVibGljIHZvaWQgdW5yZWdpc3RlckRhdGFTZXRPYnNlcnZlcigKLWFuZHJvaWQuZGF0YWJhc2UuRGF0YVNldE9ic2VydmVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLmdyYXBoaWNzLk5hdGl2ZVV0aWxzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIG5hdGl2ZVNjcm9sbFJlY3QoCi1hbmRyb2lkLmdyYXBoaWNzLkNhbnZhcwotYW5kcm9pZC5ncmFwaGljcy5SZWN0Ci1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwuaHR0cC5tdWx0aXBhcnQuUGFydFNvdXJjZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5pby5JbnB1dFN0cmVhbSBjcmVhdGVJbnB1dFN0cmVhbSgpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldEZpbGVOYW1lKCkKLQotcHVibGljIGFic3RyYWN0IGxvbmcgZ2V0TGVuZ3RoKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5odHRwLm11bHRpcGFydC5CeXRlQXJyYXlQYXJ0U291cmNlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGNvbS5hbmRyb2lkLmludGVybmFsLmh0dHAubXVsdGlwYXJ0LlBhcnRTb3VyY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBieXRlW10gYnl0ZXMKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGZpbGVOYW1lCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotYnl0ZVtdKQotCi1wdWJsaWMgamF2YS5pby5JbnB1dFN0cmVhbSBjcmVhdGVJbnB1dFN0cmVhbSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEZpbGVOYW1lKCkKLQotcHVibGljIGxvbmcgZ2V0TGVuZ3RoKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5odHRwLm11bHRpcGFydC5QYXJ0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQk9VTkRBUlkKLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBieXRlW10gQk9VTkRBUllfQllURVMKLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENIQVJTRVQKLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBieXRlW10gQ0hBUlNFVF9CWVRFUwotCi1wcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ09OVEVOVF9ESVNQT1NJVElPTgotCi1wcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJ5dGVbXSBDT05URU5UX0RJU1BPU0lUSU9OX0JZVEVTCi0KLXByb3RlY3RlZCBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDT05URU5UX1RSQU5TRkVSX0VOQ09ESU5HCi0KLXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYnl0ZVtdIENPTlRFTlRfVFJBTlNGRVJfRU5DT0RJTkdfQllURVMKLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENPTlRFTlRfVFlQRQotCi1wcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJ5dGVbXSBDT05URU5UX1RZUEVfQllURVMKLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENSTEYKLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBieXRlW10gQ1JMRl9CWVRFUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gREVGQVVMVF9CT1VOREFSWV9CWVRFUwotCi1wcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRVhUUkEKLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBieXRlW10gRVhUUkFfQllURVMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIExPRwotCi1wcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUVVPVEUKLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBieXRlW10gUVVPVEVfQllURVMKLQotcHJpdmF0ZSBieXRlW10gYm91bmRhcnlCeXRlcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEJvdW5kYXJ5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBsb25nIGdldExlbmd0aE9mUGFydHMoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC5odHRwLm11bHRpcGFydC5QYXJ0W10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgbG9uZyBnZXRMZW5ndGhPZlBhcnRzKAotY29tLmFuZHJvaWQuaW50ZXJuYWwuaHR0cC5tdWx0aXBhcnQuUGFydFtdCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgdm9pZCBzZW5kUGFydHMoCi1qYXZhLmlvLk91dHB1dFN0cmVhbQotY29tLmFuZHJvaWQuaW50ZXJuYWwuaHR0cC5tdWx0aXBhcnQuUGFydFtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIHZvaWQgc2VuZFBhcnRzKAotamF2YS5pby5PdXRwdXRTdHJlYW0KLWNvbS5hbmRyb2lkLmludGVybmFsLmh0dHAubXVsdGlwYXJ0LlBhcnRbXQotYnl0ZVtdKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRDaGFyU2V0KCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0Q29udGVudFR5cGUoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXROYW1lKCkKLQotcHJvdGVjdGVkIGJ5dGVbXSBnZXRQYXJ0Qm91bmRhcnkoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRUcmFuc2ZlckVuY29kaW5nKCkKLQotcHVibGljIGJvb2xlYW4gaXNSZXBlYXRhYmxlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGxvbmcgbGVuZ3RoKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGFic3RyYWN0IGxvbmcgbGVuZ3RoT2ZEYXRhKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2VuZCgKLWphdmEuaW8uT3V0cHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBzZW5kQ29udGVudFR5cGVIZWFkZXIoCi1qYXZhLmlvLk91dHB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc2VuZERhdGEoCi1qYXZhLmlvLk91dHB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgc2VuZERpc3Bvc2l0aW9uSGVhZGVyKAotamF2YS5pby5PdXRwdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIHNlbmRFbmQoCi1qYXZhLmlvLk91dHB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgc2VuZEVuZE9mSGVhZGVyKAotamF2YS5pby5PdXRwdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIHNlbmRTdGFydCgKLWphdmEuaW8uT3V0cHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBzZW5kVHJhbnNmZXJFbmNvZGluZ0hlYWRlcigKLWphdmEuaW8uT3V0cHV0U3RyZWFtKQotCi0gdm9pZCBzZXRQYXJ0Qm91bmRhcnkoCi1ieXRlW10pCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5odHRwLm11bHRpcGFydC5QYXJ0QmFzZSBleHRlbmRzIGNvbS5hbmRyb2lkLmludGVybmFsLmh0dHAubXVsdGlwYXJ0LlBhcnQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGNoYXJTZXQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnRUeXBlCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBuYW1lCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyB0cmFuc2ZlckVuY29kaW5nCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Q2hhclNldCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldENvbnRlbnRUeXBlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TmFtZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFRyYW5zZmVyRW5jb2RpbmcoKQotCi1wdWJsaWMgdm9pZCBzZXRDaGFyU2V0KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0Q29udGVudFR5cGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXROYW1lKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0VHJhbnNmZXJFbmNvZGluZygKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwuaHR0cC5tdWx0aXBhcnQuRmlsZVBhcnQgZXh0ZW5kcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5odHRwLm11bHRpcGFydC5QYXJ0QmFzZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVGQVVMVF9DSEFSU0VUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERUZBVUxUX0NPTlRFTlRfVFlQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVGQVVMVF9UUkFOU0ZFUl9FTkNPRElORwotCi1wcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRklMRV9OQU1FCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBGSUxFX05BTUVfQllURVMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIExPRwotCi1wcml2YXRlIGNvbS5hbmRyb2lkLmludGVybmFsLmh0dHAubXVsdGlwYXJ0LlBhcnRTb3VyY2Ugc291cmNlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1jb20uYW5kcm9pZC5pbnRlcm5hbC5odHRwLm11bHRpcGFydC5QYXJ0U291cmNlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1jb20uYW5kcm9pZC5pbnRlcm5hbC5odHRwLm11bHRpcGFydC5QYXJ0U291cmNlCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0ZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5pby5GaWxlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0ZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5pby5GaWxlCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0ZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5pby5GaWxlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0ZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5pby5GaWxlCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcm90ZWN0ZWQgY29tLmFuZHJvaWQuaW50ZXJuYWwuaHR0cC5tdWx0aXBhcnQuUGFydFNvdXJjZSBnZXRTb3VyY2UoKQotCi1wcm90ZWN0ZWQgbG9uZyBsZW5ndGhPZkRhdGEoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBzZW5kRGF0YSgKLWphdmEuaW8uT3V0cHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBzZW5kRGlzcG9zaXRpb25IZWFkZXIoCi1qYXZhLmlvLk91dHB1dFN0cmVhbSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5odHRwLm11bHRpcGFydC5GaWxlUGFydFNvdXJjZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBjb20uYW5kcm9pZC5pbnRlcm5hbC5odHRwLm11bHRpcGFydC5QYXJ0U291cmNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS5pby5GaWxlIGZpbGUKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGZpbGVOYW1lCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9GaWxlTm90Rm91bmRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uRmlsZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9GaWxlTm90Rm91bmRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEuaW8uRmlsZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuaW8uSW5wdXRTdHJlYW0gY3JlYXRlSW5wdXRTdHJlYW0oKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRGaWxlTmFtZSgpCi0KLXB1YmxpYyBsb25nIGdldExlbmd0aCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5IdHRwRW50aXR5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGNvbnN1bWVDb250ZW50KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEuaW8uSW5wdXRTdHJlYW0gZ2V0Q29udGVudCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBvcmcuYXBhY2hlLmh0dHAuSGVhZGVyIGdldENvbnRlbnRFbmNvZGluZygpCi0KLXB1YmxpYyBhYnN0cmFjdCBsb25nIGdldENvbnRlbnRMZW5ndGgoKQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLmFwYWNoZS5odHRwLkhlYWRlciBnZXRDb250ZW50VHlwZSgpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzQ2h1bmtlZCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzUmVwZWF0YWJsZSgpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzU3RyZWFtaW5nKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVUbygKLWphdmEuaW8uT3V0cHV0U3RyZWFtKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5lbnRpdHkuQWJzdHJhY3RIdHRwRW50aXR5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaHR0cC5IdHRwRW50aXR5Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCBib29sZWFuIGNodW5rZWQKLQotcHJvdGVjdGVkIG9yZy5hcGFjaGUuaHR0cC5IZWFkZXIgY29udGVudEVuY29kaW5nCi0KLXByb3RlY3RlZCBvcmcuYXBhY2hlLmh0dHAuSGVhZGVyIGNvbnRlbnRUeXBlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9sYW5nL1Vuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjb25zdW1lQ29udGVudCgpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAuSGVhZGVyIGdldENvbnRlbnRFbmNvZGluZygpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAuSGVhZGVyIGdldENvbnRlbnRUeXBlKCkKLQotcHVibGljIGJvb2xlYW4gaXNDaHVua2VkKCkKLQotcHVibGljIHZvaWQgc2V0Q2h1bmtlZCgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldENvbnRlbnRFbmNvZGluZygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHNldENvbnRlbnRFbmNvZGluZygKLW9yZy5hcGFjaGUuaHR0cC5IZWFkZXIpCi0KLXB1YmxpYyB2b2lkIHNldENvbnRlbnRUeXBlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0Q29udGVudFR5cGUoCi1vcmcuYXBhY2hlLmh0dHAuSGVhZGVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLmh0dHAubXVsdGlwYXJ0Lk11bHRpcGFydEVudGl0eSBleHRlbmRzIG9yZy5hcGFjaGUuaHR0cC5lbnRpdHkuQWJzdHJhY3RIdHRwRW50aXR5Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBNVUxUSVBBUlRfQk9VTkRBUlkKLQotcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIE1VTFRJUEFSVF9DSEFSUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1VTFRJUEFSVF9GT1JNX0NPTlRFTlRfVFlQRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgbG9nCi0KLXByaXZhdGUgYm9vbGVhbiBjb250ZW50Q29uc3VtZWQKLQotcHJpdmF0ZSBieXRlW10gbXVsdGlwYXJ0Qm91bmRhcnkKLQotcHJpdmF0ZSBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMgcGFyYW1zCi0KLXByb3RlY3RlZCBjb20uYW5kcm9pZC5pbnRlcm5hbC5odHRwLm11bHRpcGFydC5QYXJ0W10gcGFydHMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWNvbS5hbmRyb2lkLmludGVybmFsLmh0dHAubXVsdGlwYXJ0LlBhcnRbXSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotY29tLmFuZHJvaWQuaW50ZXJuYWwuaHR0cC5tdWx0aXBhcnQuUGFydFtdCi1vcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMpCi0KLXByaXZhdGUgc3RhdGljIGJ5dGVbXSBnZW5lcmF0ZU11bHRpcGFydEJvdW5kYXJ5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuaW8uSW5wdXRTdHJlYW0gZ2V0Q29udGVudCgpCi0KLXB1YmxpYyBsb25nIGdldENvbnRlbnRMZW5ndGgoKQotCi1wdWJsaWMgb3JnLmFwYWNoZS5odHRwLkhlYWRlciBnZXRDb250ZW50VHlwZSgpCi0KLXByb3RlY3RlZCBieXRlW10gZ2V0TXVsdGlwYXJ0Qm91bmRhcnkoKQotCi1wdWJsaWMgYm9vbGVhbiBpc1JlcGVhdGFibGUoKQotCi1wdWJsaWMgYm9vbGVhbiBpc1N0cmVhbWluZygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHdyaXRlVG8oCi1qYXZhLmlvLk91dHB1dFN0cmVhbSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5odHRwLm11bHRpcGFydC5TdHJpbmdQYXJ0IGV4dGVuZHMgY29tLmFuZHJvaWQuaW50ZXJuYWwuaHR0cC5tdWx0aXBhcnQuUGFydEJhc2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFRkFVTFRfQ0hBUlNFVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVGQVVMVF9DT05URU5UX1RZUEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFRkFVTFRfVFJBTlNGRVJfRU5DT0RJTkcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIExPRwotCi1wcml2YXRlIGJ5dGVbXSBjb250ZW50Ci0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyB2YWx1ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBieXRlW10gZ2V0Q29udGVudCgpCi0KLXByb3RlY3RlZCBsb25nIGxlbmd0aE9mRGF0YSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIHNlbmREYXRhKAotamF2YS5pby5PdXRwdXRTdHJlYW0pCi0KLXB1YmxpYyB2b2lkIHNldENoYXJTZXQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLmxvY2F0aW9uLkNlbGxTdGF0ZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBpbnQgUkFESU9fVFlQRV9DRE1BCi0KLXB1YmxpYyBzdGF0aWMgaW50IFJBRElPX1RZUEVfR1BSUwotCi1wdWJsaWMgc3RhdGljIGludCBSQURJT19UWVBFX1dDRE1BCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBUQUcKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1DYXJyaWVyCi0KLXByaXZhdGUgaW50IG1DaWQKLQotcHJpdmF0ZSBpbnQgbUhvbWVNY2MKLQotcHJpdmF0ZSBpbnQgbUhvbWVNbmMKLQotcHJpdmF0ZSBpbnQgbUxhYwotCi1wcml2YXRlIGludCBtTWNjCi0KLXByaXZhdGUgaW50IG1NbmMKLQotcHJpdmF0ZSBpbnQgbVJhZGlvVHlwZQotCi1wcml2YXRlIGxvbmcgbVRpbWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQudGVsZXBob255LlNlcnZpY2VTdGF0ZQotYW5kcm9pZC50ZWxlcGhvbnkuQ2VsbExvY2F0aW9uKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC5sb2NhdGlvbi5DZWxsU3RhdGUpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldENhcnJpZXIoKQotCi1wdWJsaWMgaW50IGdldENpZCgpCi0KLXB1YmxpYyBpbnQgZ2V0SG9tZU1jYygpCi0KLXB1YmxpYyBpbnQgZ2V0SG9tZU1uYygpCi0KLXB1YmxpYyBpbnQgZ2V0TGFjKCkKLQotcHVibGljIGludCBnZXRNY2MoKQotCi1wdWJsaWMgaW50IGdldE1uYygpCi0KLXB1YmxpYyBpbnQgZ2V0UmFkaW9UeXBlKCkKLQotcHVibGljIGxvbmcgZ2V0VGltZSgpCi0KLXB1YmxpYyBib29sZWFuIGlzVmFsaWQoKQotCi1wdWJsaWMgdm9pZCBzZXRDYXJyaWVyKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0SG9tZU1jYygKLWludCkKLQotcHVibGljIHZvaWQgc2V0SG9tZU1uYygKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTIgbmFtZSA9R3BzRXZlbnRUaHJlYWQgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL2xvY2F0aW9uL0dwc0xvY2F0aW9uUHJvdmlkZXI7ICkKLSBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5sb2NhdGlvbi5HcHNMb2NhdGlvblByb3ZpZGVyJEdwc0V2ZW50VGhyZWFkIGV4dGVuZHMgamF2YS5sYW5nLlRocmVhZAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC5sb2NhdGlvbi5HcHNMb2NhdGlvblByb3ZpZGVyIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWNvbS5hbmRyb2lkLmludGVybmFsLmxvY2F0aW9uLkdwc0xvY2F0aW9uUHJvdmlkZXIpCi0KLXB1YmxpYyB2b2lkIHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL2xvY2F0aW9uL0dwc0xvY2F0aW9uUHJvdmlkZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MiBuYW1lID1HcHNOZXR3b3JrVGhyZWFkICkKLSBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5sb2NhdGlvbi5HcHNMb2NhdGlvblByb3ZpZGVyJEdwc05ldHdvcmtUaHJlYWQgZXh0ZW5kcyBqYXZhLmxhbmcuVGhyZWFkCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgbG9uZyBtTmV4dE50cFRpbWUKLQotcHJpdmF0ZSBsb25nIG1OZXh0WHRyYVRpbWUKLQotcHJpdmF0ZSBib29sZWFuIG1YdHJhRG93bmxvYWRSZXF1ZXN0ZWQKLQotZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwubG9jYXRpb24uR3BzTG9jYXRpb25Qcm92aWRlciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1jb20uYW5kcm9pZC5pbnRlcm5hbC5sb2NhdGlvbi5HcHNMb2NhdGlvblByb3ZpZGVyKQotCi1wcml2YXRlIGxvbmcgZ2V0V2FpdFRpbWUoKQotCi1wdWJsaWMgdm9pZCBydW4oKQotCi0gdm9pZCBzaWduYWwoKQotCi0gdm9pZCB4dHJhRG93bmxvYWRSZXF1ZXN0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE4IG5hbWUgPUxpc3RlbmVyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC9sb2NhdGlvbi9HcHNMb2NhdGlvblByb3ZpZGVyOyApCi1maW5hbCBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5sb2NhdGlvbi5HcHNMb2NhdGlvblByb3ZpZGVyJExpc3RlbmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuSUJpbmRlciREZWF0aFJlY2lwaWVudAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLmxvY2F0aW9uLklHcHNTdGF0dXNMaXN0ZW5lciBtTGlzdGVuZXIKLQotIGludCBtU2Vuc29ycwotCi1maW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC5sb2NhdGlvbi5HcHNMb2NhdGlvblByb3ZpZGVyIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWNvbS5hbmRyb2lkLmludGVybmFsLmxvY2F0aW9uLkdwc0xvY2F0aW9uUHJvdmlkZXIKLWFuZHJvaWQubG9jYXRpb24uSUdwc1N0YXR1c0xpc3RlbmVyKQotCi1wdWJsaWMgdm9pZCBiaW5kZXJEaWVkKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC9sb2NhdGlvbi9HcHNMb2NhdGlvblByb3ZpZGVyJEdwc05ldHdvcmtUaHJlYWQ7TGNvbS9hbmRyb2lkL2ludGVybmFsL2xvY2F0aW9uL0dwc0xvY2F0aW9uUHJvdmlkZXIkR3BzRXZlbnRUaHJlYWQ7TGNvbS9hbmRyb2lkL2ludGVybmFsL2xvY2F0aW9uL0dwc0xvY2F0aW9uUHJvdmlkZXIkTGlzdGVuZXI7ICkKLXB1YmxpYyBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5sb2NhdGlvbi5HcHNMb2NhdGlvblByb3ZpZGVyIGV4dGVuZHMgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvblByb3ZpZGVySW1wbAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUxNQU5BQ19NQVNLCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFUEhFTUVSSVNfTUFTSwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRVhUUkFfRU5BQkxFRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR1BTX0RFTEVURV9BTEwKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdQU19ERUxFVEVfQUxNQU5BQwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR1BTX0RFTEVURV9DRUxMREJfSU5GTwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR1BTX0RFTEVURV9FUEhFTUVSSVMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdQU19ERUxFVEVfSEVBTFRICi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHUFNfREVMRVRFX0lPTk8KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdQU19ERUxFVEVfUE9TSVRJT04KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdQU19ERUxFVEVfUlRJCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHUFNfREVMRVRFX1NBREFUQQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR1BTX0RFTEVURV9TVkRJUgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR1BTX0RFTEVURV9TVlNURUVSCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHUFNfREVMRVRFX1RJTUUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdQU19ERUxFVEVfVVRDCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBHUFNfRU5BQkxFRF9DSEFOR0VfQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBHUFNfRklYX0NIQU5HRV9BQ1RJT04KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdQU19TVEFUVVNfRU5HSU5FX09GRgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR1BTX1NUQVRVU19FTkdJTkVfT04KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdQU19TVEFUVVNfTk9ORQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR1BTX1NUQVRVU19TRVNTSU9OX0JFR0lOCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHUFNfU1RBVFVTX1NFU1NJT05fRU5ECi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMT0NBVElPTl9IQVNfQUNDVVJBQ1kKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExPQ0FUSU9OX0hBU19BTFRJVFVERQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTE9DQVRJT05fSEFTX0JFQVJJTkcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExPQ0FUSU9OX0hBU19MQVRfTE9ORwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTE9DQVRJT05fSEFTX1NQRUVECi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMT0NBVElPTl9JTlZBTElECi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfU1ZTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgTlRQX0lOVEVSVkFMCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUFJPUEVSVElFU19GSUxFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgUkVDRU5UX0ZJWF9USU1FT1VUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgUkVUUllfSU5URVJWQUwKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVTRURfRk9SX0ZJWF9NQVNLCi0KLXByaXZhdGUgY29tLmFuZHJvaWQuaW50ZXJuYWwubG9jYXRpb24uTG9jYXRpb25Db2xsZWN0b3IgbUNvbGxlY3RvcgotCi1wcml2YXRlIGFuZHJvaWQuY29udGVudC5Db250ZXh0IG1Db250ZXh0Ci0KLXByaXZhdGUgYm9vbGVhbiBtRW5hYmxlZAotCi1wcml2YXRlIGNvbS5hbmRyb2lkLmludGVybmFsLmxvY2F0aW9uLkdwc0xvY2F0aW9uUHJvdmlkZXIkR3BzRXZlbnRUaHJlYWQgbUV2ZW50VGhyZWFkCi0KLXByaXZhdGUgaW50IG1GaXhJbnRlcnZhbAotCi1wcml2YXRlIGxvbmcgbUZpeFJlcXVlc3RUaW1lCi0KLXByaXZhdGUgbG9uZyBtTGFzdEZpeFRpbWUKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0FycmF5TGlzdDxMY29tL2FuZHJvaWQvaW50ZXJuYWwvbG9jYXRpb24vR3BzTG9jYXRpb25Qcm92aWRlciRMaXN0ZW5lcjs+OyApCi1wcml2YXRlIGphdmEudXRpbC5BcnJheUxpc3QgbUxpc3RlbmVycwotCi1wcml2YXRlIGFuZHJvaWQubG9jYXRpb24uTG9jYXRpb24gbUxvY2F0aW9uCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5CdW5kbGUgbUxvY2F0aW9uRXh0cmFzCi0KLXByaXZhdGUgaW50IG1Mb2NhdGlvbkZsYWdzCi0KLXByaXZhdGUgYm9vbGVhbiBtTG9jYXRpb25UcmFja2luZwotCi1wcml2YXRlIGJvb2xlYW4gbU5hdmlnYXRpbmcKLQotcHJpdmF0ZSBib29sZWFuIG1OZXR3b3JrQXZhaWxhYmxlCi0KLXByaXZhdGUgY29tLmFuZHJvaWQuaW50ZXJuYWwubG9jYXRpb24uR3BzTG9jYXRpb25Qcm92aWRlciRHcHNOZXR3b3JrVGhyZWFkIG1OZXR3b3JrVGhyZWFkCi0KLXByaXZhdGUgamF2YS51dGlsLlByb3BlcnRpZXMgbVByb3BlcnRpZXMKLQotcHJpdmF0ZSBmbG9hdFtdIG1TbnJzCi0KLXByaXZhdGUgYm9vbGVhbiBtU3RhcnRlZAotCi1wcml2YXRlIGludCBtU3RhdHVzCi0KLXByaXZhdGUgbG9uZyBtU3RhdHVzVXBkYXRlVGltZQotCi1wcml2YXRlIGZsb2F0W10gbVN2QXppbXV0aHMKLQotcHJpdmF0ZSBpbnQgbVN2Q291bnQKLQotcHJpdmF0ZSBmbG9hdFtdIG1TdkVsZXZhdGlvbnMKLQotcHJpdmF0ZSBpbnRbXSBtU3ZNYXNrcwotCi1wcml2YXRlIGludFtdIG1TdnMKLQotcHJpdmF0ZSBpbnQgbVRURkYKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1jb20uYW5kcm9pZC5pbnRlcm5hbC5sb2NhdGlvbi5Mb2NhdGlvbkNvbGxlY3RvcikKLQotc3RhdGljIGphdmEudXRpbC5BcnJheUxpc3QgYWNjZXNzJDAwMCgKLWNvbS5hbmRyb2lkLmludGVybmFsLmxvY2F0aW9uLkdwc0xvY2F0aW9uUHJvdmlkZXIpCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQxMDAoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC5sb2NhdGlvbi5HcHNMb2NhdGlvblByb3ZpZGVyKQotCi1zdGF0aWMgYm9vbGVhbiBhY2Nlc3MkMjAwKAotY29tLmFuZHJvaWQuaW50ZXJuYWwubG9jYXRpb24uR3BzTG9jYXRpb25Qcm92aWRlcikKLQotc3RhdGljIHZvaWQgYWNjZXNzJDMwMCgKLWNvbS5hbmRyb2lkLmludGVybmFsLmxvY2F0aW9uLkdwc0xvY2F0aW9uUHJvdmlkZXIpCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQ0MDAoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC5sb2NhdGlvbi5HcHNMb2NhdGlvblByb3ZpZGVyKQotCi1zdGF0aWMgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgYWNjZXNzJDUwMCgKLWNvbS5hbmRyb2lkLmludGVybmFsLmxvY2F0aW9uLkdwc0xvY2F0aW9uUHJvdmlkZXIpCi0KLXN0YXRpYyBqYXZhLnV0aWwuUHJvcGVydGllcyBhY2Nlc3MkNjAwKAotY29tLmFuZHJvaWQuaW50ZXJuYWwubG9jYXRpb24uR3BzTG9jYXRpb25Qcm92aWRlcikKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDcwMCgKLWNvbS5hbmRyb2lkLmludGVybmFsLmxvY2F0aW9uLkdwc0xvY2F0aW9uUHJvdmlkZXIpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQ4MDAoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC5sb2NhdGlvbi5HcHNMb2NhdGlvblByb3ZpZGVyCi1sb25nCi1sb25nCi1pbnQpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQ5MDAoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC5sb2NhdGlvbi5HcHNMb2NhdGlvblByb3ZpZGVyCi1ieXRlW10KLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgY2xhc3NfaW5pdF9uYXRpdmUoKQotCi1wcml2YXRlIGJvb2xlYW4gZGVsZXRlQWlkaW5nRGF0YSgKLWFuZHJvaWQub3MuQnVuZGxlKQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTdXBwb3J0ZWQoKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZV9jbGVhbnVwKCkKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVfZGVsZXRlX2FpZGluZ19kYXRhKAotaW50KQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZV9kaXNhYmxlKCkKLQotcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBuYXRpdmVfaW5pdCgpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlX2luamVjdF90aW1lKAotbG9uZwotbG9uZwotaW50KQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZV9pbmplY3RfeHRyYV9kYXRhKAotYnl0ZVtdCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBib29sZWFuIG5hdGl2ZV9pc19zdXBwb3J0ZWQoKQotCi1wcml2YXRlIG5hdGl2ZSBpbnQgbmF0aXZlX3JlYWRfc3Zfc3RhdHVzKAotaW50W10KLWZsb2F0W10KLWZsb2F0W10KLWZsb2F0W10KLWludFtdKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZV9zZXRfZml4X2ZyZXF1ZW5jeSgKLWludCkKLQotcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBuYXRpdmVfc3RhcnQoCi1ib29sZWFuCi1pbnQpCi0KLXByaXZhdGUgbmF0aXZlIGJvb2xlYW4gbmF0aXZlX3N0b3AoKQotCi1wcml2YXRlIG5hdGl2ZSBib29sZWFuIG5hdGl2ZV9zdXBwb3J0c194dHJhKCkKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVfd2FpdF9mb3JfZXZlbnQoKQotCi1wcml2YXRlIHZvaWQgcmVwb3J0TG9jYXRpb24oCi1pbnQKLWRvdWJsZQotZG91YmxlCi1kb3VibGUKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWxvbmcpCi0KLXByaXZhdGUgdm9pZCByZXBvcnRTdGF0dXMoCi1pbnQpCi0KLXByaXZhdGUgdm9pZCByZXBvcnRTdlN0YXR1cygpCi0KLXByaXZhdGUgdm9pZCB1cGRhdGVTdGF0dXMoCi1pbnQKLWludCkKLQotcHJpdmF0ZSB2b2lkIHh0cmFEb3dubG9hZFJlcXVlc3QoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgYWRkR3BzU3RhdHVzTGlzdGVuZXIoCi1hbmRyb2lkLmxvY2F0aW9uLklHcHNTdGF0dXNMaXN0ZW5lcikKLQotcHVibGljIHZvaWQgZGlzYWJsZSgpCi0KLXB1YmxpYyB2b2lkIGVuYWJsZSgpCi0KLXB1YmxpYyB2b2lkIGVuYWJsZUxvY2F0aW9uVHJhY2tpbmcoCi1ib29sZWFuKQotCi1wdWJsaWMgaW50IGdldEFjY3VyYWN5KCkKLQotcHVibGljIGJvb2xlYW4gZ2V0TG9jYXRpb24oCi1hbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uKQotCi1wdWJsaWMgaW50IGdldFBvd2VyUmVxdWlyZW1lbnQoKQotCi1wdWJsaWMgaW50IGdldFN0YXR1cygKLWFuZHJvaWQub3MuQnVuZGxlKQotCi1wdWJsaWMgbG9uZyBnZXRTdGF0dXNVcGRhdGVUaW1lKCkKLQotcHVibGljIGJvb2xlYW4gaGFzTW9uZXRhcnlDb3N0KCkKLQotcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkKLQotcHVibGljIGJvb2xlYW4gaXNMb2NhdGlvblRyYWNraW5nKCkKLQotcHVibGljIHZvaWQgcmVtb3ZlR3BzU3RhdHVzTGlzdGVuZXIoCi1hbmRyb2lkLmxvY2F0aW9uLklHcHNTdGF0dXNMaXN0ZW5lcikKLQotcHVibGljIGJvb2xlYW4gcmVxdWlyZXNDZWxsKCkKLQotcHVibGljIGJvb2xlYW4gcmVxdWlyZXNOZXR3b3JrKCkKLQotcHVibGljIGJvb2xlYW4gcmVxdWlyZXNTYXRlbGxpdGUoKQotCi1wdWJsaWMgYm9vbGVhbiBzZW5kRXh0cmFDb21tYW5kKAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5vcy5CdW5kbGUpCi0KLXB1YmxpYyB2b2lkIHNldE1pblRpbWUoCi1sb25nKQotCi1wdWJsaWMgdm9pZCBzdGFydE5hdmlnYXRpbmcoKQotCi1wdWJsaWMgdm9pZCBzdG9wTmF2aWdhdGluZygpCi0KLXB1YmxpYyBib29sZWFuIHN1cHBvcnRzQWx0aXR1ZGUoKQotCi1wdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0JlYXJpbmcoKQotCi1wdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1NwZWVkKCkKLQotcHVibGljIHZvaWQgdXBkYXRlTmV0d29ya1N0YXRlKAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLmxvY2F0aW9uLkdwc1h0cmFEb3dubG9hZGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRBRwotCi1wcml2YXRlIGFuZHJvaWQuY29udGVudC5Db250ZXh0IG1Db250ZXh0Ci0KLXByaXZhdGUgaW50IG1OZXh0U2VydmVySW5kZXgKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nW10gbVh0cmFTZXJ2ZXJzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWphdmEudXRpbC5Qcm9wZXJ0aWVzKQotCi1wcm90ZWN0ZWQgc3RhdGljIGJ5dGVbXSBkb0Rvd25sb2FkKAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbgotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi0gYnl0ZVtdIGRvd25sb2FkWHRyYURhdGEoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MSBuYW1lID1DYWNoZSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvbG9jYXRpb24vTG9jYXRpb25DYWNoZTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS91dGlsL0xpbmtlZEhhc2hNYXA7ICkKLXB1YmxpYyBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5sb2NhdGlvbi5Mb2NhdGlvbkNhY2hlJENhY2hlIGV4dGVuZHMgamF2YS51dGlsLkxpbmtlZEhhc2hNYXAKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBpbnQgbUNhcGFjaXR5Ci0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBtRGlyCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBtRmlsZQotCi1wcml2YXRlIGxvbmcgbUxhc3RTYXZlVGltZQotCi1wcml2YXRlIGZpbmFsIGxvbmcgbU1heEFnZQotCi1maW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC5sb2NhdGlvbi5Mb2NhdGlvbkNhY2hlIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWNvbS5hbmRyb2lkLmludGVybmFsLmxvY2F0aW9uLkxvY2F0aW9uQ2FjaGUKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWludAotbG9uZykKLQotc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLmxvY2F0aW9uLkxvY2F0aW9uQ2FjaGUkUmVjb3JkIGFjY2VzcyQwMDAoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC5sb2NhdGlvbi5Mb2NhdGlvbkNhY2hlJENhY2hlCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMTAwKAotY29tLmFuZHJvaWQuaW50ZXJuYWwubG9jYXRpb24uTG9jYXRpb25DYWNoZSRDYWNoZSkKLQotc3RhdGljIHZvaWQgYWNjZXNzJDIwMCgKLWNvbS5hbmRyb2lkLmludGVybmFsLmxvY2F0aW9uLkxvY2F0aW9uQ2FjaGUkQ2FjaGUKLWphdmEubGFuZy5TdHJpbmcKLWNvbS5hbmRyb2lkLmludGVybmFsLmxvY2F0aW9uLkxvY2F0aW9uQ2FjaGUkUmVjb3JkKQotCi1wcml2YXRlIHZvaWQgaW5zZXJ0KAotamF2YS5sYW5nLlN0cmluZwotY29tLmFuZHJvaWQuaW50ZXJuYWwubG9jYXRpb24uTG9jYXRpb25DYWNoZSRSZWNvcmQpCi0KLXByaXZhdGUgdm9pZCBsb2FkKCkKLQotcHJpdmF0ZSBjb20uYW5kcm9pZC5pbnRlcm5hbC5sb2NhdGlvbi5Mb2NhdGlvbkNhY2hlJFJlY29yZCBsb29rdXAoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHZvaWQgc2F2ZSgpCi0KLXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUVsZGVzdEVudHJ5KAotamF2YS51dGlsLk1hcCRFbnRyeSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEgbmFtZSA9TG9jYXRpb25DZW50cm9pZCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvbG9jYXRpb24vTG9jYXRpb25DYWNoZTsgKQotcHVibGljIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLmxvY2F0aW9uLkxvY2F0aW9uQ2FjaGUkTG9jYXRpb25DZW50cm9pZCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIGludCBNQVhfU0laRQotCi0gZG91YmxlIG1DZW50cm9pZExhdAotCi0gZG91YmxlIG1DZW50cm9pZExuZwotCi0gaW50IG1Db25maWRlbmNlU3VtCi0KLSBkb3VibGUgbUxhdFN1bQotCi0gZG91YmxlW10gbUxhdHMKLQotIGRvdWJsZSBtTG5nU3VtCi0KLSBkb3VibGVbXSBtTG5ncwotCi0gaW50IG1OdW1iZXIKLQotIGludFtdIG1SYWRpaQotCi1maW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC5sb2NhdGlvbi5Mb2NhdGlvbkNhY2hlIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWNvbS5hbmRyb2lkLmludGVybmFsLmxvY2F0aW9uLkxvY2F0aW9uQ2FjaGUpCi0KLXB1YmxpYyB2b2lkIGFkZExvY2F0aW9uKAotZG91YmxlCi1kb3VibGUKLWludAotaW50KQotCi1wdWJsaWMgaW50IGdldEFjY3VyYWN5KCkKLQotcHVibGljIGRvdWJsZSBnZXRDZW50cm9pZExhdCgpCi0KLXB1YmxpYyBkb3VibGUgZ2V0Q2VudHJvaWRMbmcoKQotCi1wdWJsaWMgaW50IGdldENvbmZpZGVuY2UoKQotCi1wdWJsaWMgaW50IGdldE51bWJlcigpCi0KLXB1YmxpYyB2b2lkIHJlc2V0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9UmVjb3JkICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC9sb2NhdGlvbi9Mb2NhdGlvbkNhY2hlOyApCi1wdWJsaWMgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwubG9jYXRpb24uTG9jYXRpb25DYWNoZSRSZWNvcmQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgaW50IGFjY3VyYWN5Ci0KLXByaXZhdGUgZmluYWwgaW50IGNvbmZpZGVuY2UKLQotcHJpdmF0ZSBmaW5hbCBkb3VibGUgbGF0Ci0KLXByaXZhdGUgZmluYWwgZG91YmxlIGxuZwotCi1wcml2YXRlIGZpbmFsIGxvbmcgb3JpZ2luVGltZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotaW50Ci1kb3VibGUKLWRvdWJsZQotbG9uZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC5sb2NhdGlvbi5Mb2NhdGlvbkNhY2hlJFJlY29yZCByZWFkKAotamF2YS5pby5EYXRhSW5wdXQpCi0KLXB1YmxpYyBpbnQgZ2V0QWNjdXJhY3koKQotCi1wdWJsaWMgaW50IGdldENvbmZpZGVuY2UoKQotCi1wdWJsaWMgZG91YmxlIGdldExhdCgpCi0KLXB1YmxpYyBkb3VibGUgZ2V0TG5nKCkKLQotcHVibGljIGxvbmcgZ2V0VGltZSgpCi0KLXB1YmxpYyBib29sZWFuIGlzVmFsaWQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHdyaXRlKAotamF2YS5pby5EYXRhT3V0cHV0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL2xvY2F0aW9uL0xvY2F0aW9uQ2FjaGUkTG9jYXRpb25DZW50cm9pZDtMY29tL2FuZHJvaWQvaW50ZXJuYWwvbG9jYXRpb24vTG9jYXRpb25DYWNoZSRDYWNoZTtMY29tL2FuZHJvaWQvaW50ZXJuYWwvbG9jYXRpb24vTG9jYXRpb25DYWNoZSRSZWNvcmQ7ICkKLXB1YmxpYyBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5sb2NhdGlvbi5Mb2NhdGlvbkNhY2hlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0FDSEVfREJfVkVSU0lPTgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIENFTExfU01PT1RISU5HX1dJTkRPVwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0FDQ1VSQUNZX0FMTE9XRUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9DRUxMX1JFQ09SRFMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBNQVhfQ0VMTF9SRUZSRVNIX1JFQ09SRF9BR0UKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9XSUZJX1JFQ09SRFMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBNQVhfV0lGSV9SRUZSRVNIX1JFQ09SRF9BR0UKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBTQVZFX0ZSRVFVRU5DWQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRBRwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0lGSV9NQVhfTUlTU19BTExPV0VECi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXSUZJX01JTl9BUF9SRVFVSVJFRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIG1DZWxsQ2FjaGVGaWxlCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgbVdpZmlDYWNoZUZpbGUKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEVYVFJBX0tFWV9MT0NBVElPTl9UWVBFCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBFWFRSQV9WQUxVRV9MT0NBVElPTl9UWVBFX0NFTEwKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEVYVFJBX1ZBTFVFX0xPQ0FUSU9OX1RZUEVfV0lGSQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC9sb2NhdGlvbi9Mb2NhdGlvbkNhY2hlJENhY2hlPExjb20vYW5kcm9pZC9pbnRlcm5hbC9sb2NhdGlvbi9Mb2NhdGlvbkNhY2hlJFJlY29yZDs+OyApCi1wcml2YXRlIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLmxvY2F0aW9uLkxvY2F0aW9uQ2FjaGUkQ2FjaGUgbUNlbGxDYWNoZQotCi1wcml2YXRlIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLmxvY2F0aW9uLkxvY2F0aW9uQ2FjaGUkTG9jYXRpb25DZW50cm9pZCBtQ2VsbENlbnRyb2lkCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL2xvY2F0aW9uL0xvY2F0aW9uQ2FjaGUkQ2FjaGU8TGNvbS9hbmRyb2lkL2ludGVybmFsL2xvY2F0aW9uL0xvY2F0aW9uQ2FjaGUkUmVjb3JkOz47ICkKLXByaXZhdGUgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwubG9jYXRpb24uTG9jYXRpb25DYWNoZSRDYWNoZSBtV2lmaUNhY2hlCi0KLXByaXZhdGUgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwubG9jYXRpb24uTG9jYXRpb25DYWNoZSRMb2NhdGlvbkNlbnRyb2lkIG1XaWZpQ2VudHJvaWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZ2V0Q2VsbENhY2hlS2V5KAotaW50Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBpbnNlcnQoCi1pbnQKLWludAotaW50Ci1pbnQKLWRvdWJsZQotZG91YmxlCi1pbnQKLWludAotbG9uZykKLQotcHVibGljIHZvaWQgaW5zZXJ0KAotamF2YS5sYW5nLlN0cmluZwotZG91YmxlCi1kb3VibGUKLWludAotaW50Ci1sb25nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMY29tL2FuZHJvaWQvaW50ZXJuYWwvbG9jYXRpb24vQ2VsbFN0YXRlO0xqYXZhL3V0aWwvTGlzdDxMY29tL2FuZHJvaWQvaW50ZXJuYWwvbG9jYXRpb24vQ2VsbFN0YXRlOz47TGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL25ldC93aWZpL1NjYW5SZXN1bHQ7PjtMYW5kcm9pZC9sb2NhdGlvbi9Mb2NhdGlvbjspWiApCi1wdWJsaWMgYm9vbGVhbiBsb29rdXAoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC5sb2NhdGlvbi5DZWxsU3RhdGUKLWphdmEudXRpbC5MaXN0Ci1qYXZhLnV0aWwuTGlzdAotYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbikKLQotcHVibGljIHZvaWQgc2F2ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID00MTA0IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL2xvY2F0aW9uL0xvY2F0aW9uQ29sbGVjdG9yOyApCi0gY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwubG9jYXRpb24uTG9jYXRpb25Db2xsZWN0b3IkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC9sb2NhdGlvbi9Mb2NhdGlvbkNvbGxlY3RvcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPUNlbGxVcGxvYWRzICkKLSBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5sb2NhdGlvbi5Mb2NhdGlvbkNvbGxlY3RvciRDZWxsVXBsb2FkcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBpbnQgTUlOX0RJU1RBTkNFCi0KLXByaXZhdGUgZmluYWwgaW50IFNJWkUKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gY2VsbHMKLQotcHJpdmF0ZSBmaW5hbCBmbG9hdFtdIGRpc3RhbmNlCi0KLXByaXZhdGUgaW50IGluZGV4Ci0KLXByaXZhdGUgZmluYWwgZG91YmxlW10gbGF0aXR1ZGVzCi0KLXByaXZhdGUgZmluYWwgZG91YmxlW10gbG9uZ2l0dWRlcwotCi1maW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC5sb2NhdGlvbi5Mb2NhdGlvbkNvbGxlY3RvciB0aGlzJDAKLQotcHJpdmF0ZSBmaW5hbCBib29sZWFuW10gdmFsaWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotY29tLmFuZHJvaWQuaW50ZXJuYWwubG9jYXRpb24uTG9jYXRpb25Db2xsZWN0b3IpCi0KLSB2b2lkIDxpbml0PigKLWNvbS5hbmRyb2lkLmludGVybmFsLmxvY2F0aW9uLkxvY2F0aW9uQ29sbGVjdG9yCi1jb20uYW5kcm9pZC5pbnRlcm5hbC5sb2NhdGlvbi5Mb2NhdGlvbkNvbGxlY3RvciQxKQotCi1zdGF0aWMgYm9vbGVhbiBhY2Nlc3MkMTAwKAotY29tLmFuZHJvaWQuaW50ZXJuYWwubG9jYXRpb24uTG9jYXRpb25Db2xsZWN0b3IkQ2VsbFVwbG9hZHMKLWNvbS5hbmRyb2lkLmludGVybmFsLmxvY2F0aW9uLkNlbGxTdGF0ZQotYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbikKLQotcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zKAotY29tLmFuZHJvaWQuaW50ZXJuYWwubG9jYXRpb24uQ2VsbFN0YXRlCi1hbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL2xvY2F0aW9uL0xvY2F0aW9uQ29sbGVjdG9yJDE7TGNvbS9hbmRyb2lkL2ludGVybmFsL2xvY2F0aW9uL0xvY2F0aW9uQ29sbGVjdG9yJENlbGxVcGxvYWRzOyApCi1wdWJsaWMgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwubG9jYXRpb24uTG9jYXRpb25Db2xsZWN0b3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVVJTVF9NRUFTVVJFTUVOVF9JTlRFUlZBTAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVSU1RfTlVNX1NBTVBMRVMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBCVVJTVF9SRVNUX1RJTUVfT05fQkFUVEVSWQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEJVUlNUX1JFU1RfVElNRV9QTFVHR0VECi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZSBDSEFSR0VEX0JBVFRFUllfTEVWRUwKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9CVVJTVFNfRlJPTV9TQU1FX0xPQ0FUSU9OCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZSBNSU5fQkFUVEVSWV9MRVZFTAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUlOX0NIQU5HRURfV0lGSV9QT0lOVFMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1JTl9ESVNUQU5DRV9CRVRXRUVOX0JVUlNUUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUlOX0RJU1RBTkNFX0JFVFdFRU5fUkVQT1JUUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIE1JTl9USU1FX0JFVFdFRU5fV0lGSV9SRVBPUlRTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgTUlOX1ZBTElEX0xPQ0FUSU9OX1RJTUUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLQotcHJpdmF0ZSBib29sZWFuIG1CYXR0ZXJ5Q2hhcmdlZEFuZFBsdWdnZWQKLQotcHJpdmF0ZSBib29sZWFuIG1CYXR0ZXJ5TGV2ZWxJc0hlYWx0aHkKLQotcHJpdmF0ZSBjb20uYW5kcm9pZC5pbnRlcm5hbC5sb2NhdGlvbi5DZWxsU3RhdGUgbUNlbGxTdGF0ZQotCi1wcml2YXRlIGNvbS5hbmRyb2lkLmludGVybmFsLmxvY2F0aW9uLkxvY2F0aW9uQ29sbGVjdG9yJENlbGxVcGxvYWRzIG1DZWxsVXBsb2FkcwotCi1wcml2YXRlIGludCBtQ3VycmVudEJ1cnN0TnVtU2FtcGxlcwotCi1wcml2YXRlIGxvbmcgbUN1cnJlbnRCdXJzdFN0YXJ0VGltZQotCi1wcml2YXRlIGxvbmcgbUxhc3RCdXJzdEVuZFRpbWUKLQotcHJpdmF0ZSBhbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uIG1MYXN0QnVyc3RMb2NhdGlvbgotCi1wcml2YXRlIGFuZHJvaWQubG9jYXRpb24uTG9jYXRpb24gbUxhc3RLbm93bkxvY2F0aW9uCi0KLXByaXZhdGUgbG9uZyBtTGFzdEtub3duTG9jYXRpb25UaW1lCi0KLXByaXZhdGUgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbiBtTGFzdFVwbG9hZGVkTG9jYXRpb24KLQotcHJpdmF0ZSBsb25nIG1MYXN0VXBsb2FkZWRMb2NhdGlvblRpbWUKLQotcHJpdmF0ZSBsb25nIG1MYXN0V2lmaVNjYW5FbGFwc2VkVGltZQotCi1wcml2YXRlIGxvbmcgbUxhc3RXaWZpU2NhblJlYWxUaW1lCi0KLXByaXZhdGUgY29tLmFuZHJvaWQuaW50ZXJuYWwubG9jYXRpb24uTG9jYXRpb25NYXNmQ2xpZW50IG1NYXNmQ2xpZW50Ci0KLXByaXZhdGUgYm9vbGVhbiBtTmV0d29ya1Byb3ZpZGVySXNFbmFibGVkCi0KLXByaXZhdGUgaW50IG1OdW1CdXJzdHNGcm9tTGFzdExvY2F0aW9uCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL25ldC93aWZpL1NjYW5SZXN1bHQ7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdCBtV2lmaUN1cnJlbnRTY2FuUmVzdWx0cwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9uZXQvd2lmaS9TY2FuUmVzdWx0Oz47ICkKLXByaXZhdGUgamF2YS51dGlsLkxpc3QgbVdpZmlMYXN0U2NhblJlc3VsdHMKLQotcHJpdmF0ZSBib29sZWFuIG1XaWZpVXBsb2FkZWRXaXRob3V0TG9jYXRpb24KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1jb20uYW5kcm9pZC5pbnRlcm5hbC5sb2NhdGlvbi5Mb2NhdGlvbk1hc2ZDbGllbnQpCi0KLXByaXZhdGUgdm9pZCBhZGRUb1F1ZXVlKAotaW50KQotCi1wcml2YXRlIGJvb2xlYW4gaXNDb2xsZWN0aW9uRW5hYmxlZCgpCi0KLXByaXZhdGUgdm9pZCBsb2coCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCB1cGRhdGVCYXR0ZXJ5U3RhdGUoCi1pbnQKLWludAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgdXBkYXRlQ2VsbFN0YXRlKAotY29tLmFuZHJvaWQuaW50ZXJuYWwubG9jYXRpb24uQ2VsbFN0YXRlKQotCi1wdWJsaWMgdm9pZCB1cGRhdGVMb2NhdGlvbigKLWFuZHJvaWQubG9jYXRpb24uTG9jYXRpb24pCi0KLXB1YmxpYyB2b2lkIHVwZGF0ZU5ldHdvcmtQcm92aWRlclN0YXR1cygKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9uZXQvd2lmaS9TY2FuUmVzdWx0Oz47KVYgKQotcHVibGljIHZvaWQgdXBkYXRlV2lmaVNjYW5SZXN1bHRzKAotamF2YS51dGlsLkxpc3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLmxvY2F0aW9uLkxvY2F0aW9uTWFzZkNsaWVudCQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGNvbS5nb29nbGUubWFzZi5TZXJ2aWNlQ2FsbGJhY2sKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwubG9jYXRpb24uTG9jYXRpb25NYXNmQ2xpZW50IHRoaXMkMAotCi1maW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC5sb2NhdGlvbi5OZXR3b3JrTG9jYXRpb25Qcm92aWRlciRDYWxsYmFjayB2YWwkZmluYWxDYWxsYmFjawotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWNvbS5hbmRyb2lkLmludGVybmFsLmxvY2F0aW9uLkxvY2F0aW9uTWFzZkNsaWVudAotY29tLmFuZHJvaWQuaW50ZXJuYWwubG9jYXRpb24uTmV0d29ya0xvY2F0aW9uUHJvdmlkZXIkQ2FsbGJhY2spCi0KLXB1YmxpYyB2b2lkIG9uUmVxdWVzdENvbXBsZXRlKAotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi0gY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwubG9jYXRpb24uTG9jYXRpb25NYXNmQ2xpZW50JDIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgY29tLmdvb2dsZS5tYXNmLlNlcnZpY2VDYWxsYmFjawotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC5sb2NhdGlvbi5Mb2NhdGlvbk1hc2ZDbGllbnQgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotY29tLmFuZHJvaWQuaW50ZXJuYWwubG9jYXRpb24uTG9jYXRpb25NYXNmQ2xpZW50KQotCi1wdWJsaWMgdm9pZCBvblJlcXVlc3RDb21wbGV0ZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwubG9jYXRpb24uTG9jYXRpb25NYXNmQ2xpZW50IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFQUExJQ0FUSU9OX05BTUUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBUFBMSUNBVElPTl9WRVJTSU9OCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT0xMRUNUSU9OX0VWRU5UX0xPR19UQUcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBESVNUUklCVVRJT05fQ0hBTk5FTAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUgRTcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBFWFRSQV9LRVlfTE9DQVRJT05fU09VUkNFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRVhUUkFfVkFMVUVfTE9DQVRJT05fU09VUkNFX0NBQ0hFRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEVYVFJBX1ZBTFVFX0xPQ0FUSU9OX1NPVVJDRV9TRVJWRVIKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBNQVNGX1NFUlZFUl9BRERSRVNTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfV0lGSV9UT19JTkNMVURFCi0KLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgUExBVEZPUk1fQlVJTEQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQTEFURk9STV9JRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBMQVRGT1JNX0tFWV9GSUxFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUkVRVUVTVF9RVUVSWV9MT0MKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBSRVFVRVNUX1RJTUVPVVQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSRVFVRVNUX1VQTE9BRF9MT0MKLQotc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEFHCi0KLXByaXZhdGUgZmluYWwgaW50IE1BWF9DT0xMRUNUSU9OX0JVRkZFUl9TSVpFCi0KLXByaXZhdGUgZmluYWwgbG9uZyBNSU5fQ09MTEVDVElPTl9JTlRFUlZBTAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvTGlzdDxMY29tL2FuZHJvaWQvaW50ZXJuYWwvbG9jYXRpb24vQ2VsbFN0YXRlOz47ICkKLXByaXZhdGUgamF2YS51dGlsLkxpc3QgbUNlbGxIaXN0b3J5Ci0KLXByaXZhdGUgY29tLmFuZHJvaWQuaW50ZXJuYWwubG9jYXRpb24uQ2VsbFN0YXRlIG1DZWxsU3RhdGUKLQotcHJpdmF0ZSBjb20uZ29vZ2xlLmNvbW1vbi5pby5wcm90b2NvbC5Qcm90b0J1ZiBtQ2VsbHVsYXJQbGF0Zm9ybVByb2ZpbGUKLQotcHJpdmF0ZSBjb20uZ29vZ2xlLmNvbW1vbi5pby5wcm90b2NvbC5Qcm90b0J1ZiBtQ3VycmVudENvbGxlY3Rpb25SZXF1ZXN0Ci0KLXByaXZhdGUgbG9uZyBtTGFzdENvbGxlY3Rpb25VcGxvYWRUaW1lCi0KLXByaXZhdGUgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbiBtTG9jYXRpb24KLQotcHJpdmF0ZSBjb20uYW5kcm9pZC5pbnRlcm5hbC5sb2NhdGlvbi5Mb2NhdGlvbkNhY2hlIG1Mb2NhdGlvbkNhY2hlCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtUGxhdGZvcm1LZXkKLQotcHJpdmF0ZSBjb20uZ29vZ2xlLmNvbW1vbi5pby5wcm90b2NvbC5Qcm90b0J1ZiBtUGxhdGZvcm1Qcm9maWxlCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL25ldC93aWZpL1NjYW5SZXN1bHQ7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdCBtV2lmaVNjYW5SZXN1bHRzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDAwMCgKLWNvbS5hbmRyb2lkLmludGVybmFsLmxvY2F0aW9uLkxvY2F0aW9uTWFzZkNsaWVudAotY29tLmdvb2dsZS5jb21tb24uaW8ucHJvdG9jb2wuUHJvdG9CdWYpCi0KLXN0YXRpYyBhbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uIGFjY2VzcyQxMDAoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC5sb2NhdGlvbi5Mb2NhdGlvbk1hc2ZDbGllbnQpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQyMDAoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC5sb2NhdGlvbi5Mb2NhdGlvbk1hc2ZDbGllbnQKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgY29tLmdvb2dsZS5jb21tb24uaW8ucHJvdG9jb2wuUHJvdG9CdWYgY3JlYXRlQ2VsbHVsYXJQbGF0Zm9ybVByb2ZpbGUoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC5sb2NhdGlvbi5DZWxsU3RhdGUpCi0KLXByaXZhdGUgY29tLmdvb2dsZS5jb21tb24uaW8ucHJvdG9jb2wuUHJvdG9CdWYgY3JlYXRlUGxhdGZvcm1Qcm9maWxlKCkKLQotcHJpdmF0ZSBjb20uZ29vZ2xlLmNvbW1vbi5pby5wcm90b2NvbC5Qcm90b0J1ZiBjcmVhdGVQbGF0Zm9ybVByb2ZpbGUoCi1qYXZhLnV0aWwuTG9jYWxlKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMY29tL2dvb2dsZS9jb21tb24vaW8vcHJvdG9jb2wvUHJvdG9CdWY7TGphdmEvdXRpbC9Mb2NhbGU7TGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL2xvY2F0aW9uL0FkZHJlc3M7PjspViApCi1wcml2YXRlIHZvaWQgZ2V0QWRkcmVzc0Zyb21Qcm90b0J1ZigKLWNvbS5nb29nbGUuY29tbW9uLmlvLnByb3RvY29sLlByb3RvQnVmCi1qYXZhLnV0aWwuTG9jYWxlCi1qYXZhLnV0aWwuTGlzdCkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGdldFBsYXRmb3JtS2V5KCkKLQotcHJpdmF0ZSBib29sZWFuIHBhcnNlTmV0d29ya0xvY2F0aW9uUmVwbHkoCi1jb20uZ29vZ2xlLmNvbW1vbi5pby5wcm90b2NvbC5Qcm90b0J1ZikKLQotcHJpdmF0ZSB2b2lkIHNldFBsYXRmb3JtS2V5KAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSB2b2lkIHVwbG9hZENvbGxlY3Rpb25SZXBvcnQoCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTG9jYWxlO0xqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nO0RERERJTGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL2xvY2F0aW9uL0FkZHJlc3M7PjspViApCi1wdWJsaWMgdm9pZCBmb3J3YXJkR2VvY29kZSgKLWphdmEudXRpbC5Mb2NhbGUKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWRvdWJsZQotZG91YmxlCi1kb3VibGUKLWRvdWJsZQotaW50Ci1qYXZhLnV0aWwuTGlzdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9Db2xsZWN0aW9uPExqYXZhL2xhbmcvU3RyaW5nOz47SUxjb20vYW5kcm9pZC9pbnRlcm5hbC9sb2NhdGlvbi9DZWxsU3RhdGU7TGphdmEvdXRpbC9MaXN0PExjb20vYW5kcm9pZC9pbnRlcm5hbC9sb2NhdGlvbi9DZWxsU3RhdGU7PjtMamF2YS91dGlsL0xpc3Q8TGFuZHJvaWQvbmV0L3dpZmkvU2NhblJlc3VsdDs+O0pMY29tL2FuZHJvaWQvaW50ZXJuYWwvbG9jYXRpb24vTmV0d29ya0xvY2F0aW9uUHJvdmlkZXIkQ2FsbGJhY2s7KVYgKQotcHVibGljIHZvaWQgZ2V0TmV0d29ya0xvY2F0aW9uKAotamF2YS51dGlsLkNvbGxlY3Rpb24KLWludAotY29tLmFuZHJvaWQuaW50ZXJuYWwubG9jYXRpb24uQ2VsbFN0YXRlCi1qYXZhLnV0aWwuTGlzdAotamF2YS51dGlsLkxpc3QKLWxvbmcKLWNvbS5hbmRyb2lkLmludGVybmFsLmxvY2F0aW9uLk5ldHdvcmtMb2NhdGlvblByb3ZpZGVyJENhbGxiYWNrKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJTGFuZHJvaWQvbG9jYXRpb24vTG9jYXRpb247TGNvbS9hbmRyb2lkL2ludGVybmFsL2xvY2F0aW9uL0NlbGxTdGF0ZTtMamF2YS91dGlsL0xpc3Q8TGFuZHJvaWQvbmV0L3dpZmkvU2NhblJlc3VsdDs+O0paKVYgKQotcHVibGljIHZvaWQgcXVldWVDb2xsZWN0aW9uUmVwb3J0KAotaW50Ci1hbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uCi1jb20uYW5kcm9pZC5pbnRlcm5hbC5sb2NhdGlvbi5DZWxsU3RhdGUKLWphdmEudXRpbC5MaXN0Ci1sb25nCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTG9jYWxlO0xqYXZhL2xhbmcvU3RyaW5nO0RESUxqYXZhL3V0aWwvTGlzdDxMYW5kcm9pZC9sb2NhdGlvbi9BZGRyZXNzOz47KVYgKQotcHVibGljIHZvaWQgcmV2ZXJzZUdlb2NvZGUoCi1qYXZhLnV0aWwuTG9jYWxlCi1qYXZhLmxhbmcuU3RyaW5nCi1kb3VibGUKLWRvdWJsZQotaW50Ci1qYXZhLnV0aWwuTGlzdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9Q2FsbGJhY2sgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL2xvY2F0aW9uL05ldHdvcmtMb2NhdGlvblByb3ZpZGVyOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLmxvY2F0aW9uLk5ldHdvcmtMb2NhdGlvblByb3ZpZGVyJENhbGxiYWNrIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGxvY2F0aW9uUmVjZWl2ZWQoCi1hbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uCi1ib29sZWFuKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLSBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5sb2NhdGlvbi5OZXR3b3JrTG9jYXRpb25Qcm92aWRlciQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGNvbS5hbmRyb2lkLmludGVybmFsLmxvY2F0aW9uLk5ldHdvcmtMb2NhdGlvblByb3ZpZGVyJENhbGxiYWNrCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLmxvY2F0aW9uLk5ldHdvcmtMb2NhdGlvblByb3ZpZGVyIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWNvbS5hbmRyb2lkLmludGVybmFsLmxvY2F0aW9uLk5ldHdvcmtMb2NhdGlvblByb3ZpZGVyKQotCi1wdWJsaWMgdm9pZCBsb2NhdGlvblJlY2VpdmVkKAotYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbgotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC9sb2NhdGlvbi9OZXR3b3JrTG9jYXRpb25Qcm92aWRlciRDYWxsYmFjazsgKQotcHVibGljIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLmxvY2F0aW9uLk5ldHdvcmtMb2NhdGlvblByb3ZpZGVyIGV4dGVuZHMgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvblByb3ZpZGVySW1wbAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0NFTExfSElTVE9SWV9UT19LRUVQCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgTUFYX1RJTUVfVE9fV0FJVF9GT1JfUkFESU8KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1JTl9ORVRXT1JLX1JFVFJZX01JTExJUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIE1JTl9USU1FX0JFVFdFRU5fV0lGSV9SRVBPUlRTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEFHCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNoU2V0PExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXByaXZhdGUgamF2YS51dGlsLkhhc2hTZXQgbUFwcGxpY2F0aW9ucwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvTGlua2VkTGlzdDxMY29tL2FuZHJvaWQvaW50ZXJuYWwvbG9jYXRpb24vQ2VsbFN0YXRlOz47ICkKLXByaXZhdGUgamF2YS51dGlsLkxpbmtlZExpc3QgbUNlbGxIaXN0b3J5Ci0KLXByaXZhdGUgY29tLmFuZHJvaWQuaW50ZXJuYWwubG9jYXRpb24uQ2VsbFN0YXRlIG1DZWxsU3RhdGUKLQotcHJpdmF0ZSBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBtQ29udGV4dAotCi1wcml2YXRlIGJvb2xlYW4gbUVuYWJsZWQKLQotcHJpdmF0ZSBsb25nIG1MYXN0Q2VsbExvY2tUaW1lCi0KLXByaXZhdGUgbG9uZyBtTGFzdENlbGxTdGF0ZUNoYW5nZVRpbWUKLQotcHJpdmF0ZSBsb25nIG1MYXN0TmV0d29ya1F1ZXJ5VGltZQotCi1wcml2YXRlIGxvbmcgbUxhc3RTdWNjZXNzZnVsTmV0d29ya1F1ZXJ5VGltZQotCi1wcml2YXRlIGxvbmcgbUxhc3RXaWZpU2NhbkVsYXBzZWRUaW1lCi0KLXByaXZhdGUgbG9uZyBtTGFzdFdpZmlTY2FuUmVhbFRpbWUKLQotcHJpdmF0ZSBsb25nIG1MYXN0V2lmaVNjYW5UcmlnZ2VyVGltZQotCi1wcml2YXRlIGFuZHJvaWQubG9jYXRpb24uTG9jYXRpb24gbUxvY2F0aW9uCi0KLXByaXZhdGUgY29tLmFuZHJvaWQuaW50ZXJuYWwubG9jYXRpb24uTG9jYXRpb25NYXNmQ2xpZW50IG1NYXNmQ2xpZW50Ci0KLXByaXZhdGUgaW50IG1OZXR3b3JrU3RhdGUKLQotcHJpdmF0ZSBpbnQgbVN0YXR1cwotCi1wcml2YXRlIGxvbmcgbVN0YXR1c1VwZGF0ZVRpbWUKLQotcHJpdmF0ZSBib29sZWFuIG1UcmFja2luZwotCi1wcml2YXRlIGJvb2xlYW4gbVdpZmlFbmFibGVkCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL25ldC93aWZpL1NjYW5SZXN1bHQ7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdCBtV2lmaUxhc3RTY2FuUmVzdWx0cwotCi1wcml2YXRlIGxvbmcgbVdpZmlTY2FuRnJlcXVlbmN5Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWNvbS5hbmRyb2lkLmludGVybmFsLmxvY2F0aW9uLkxvY2F0aW9uTWFzZkNsaWVudCkKLQotc3RhdGljIGFuZHJvaWQubG9jYXRpb24uTG9jYXRpb24gYWNjZXNzJDAwMCgKLWNvbS5hbmRyb2lkLmludGVybmFsLmxvY2F0aW9uLk5ldHdvcmtMb2NhdGlvblByb3ZpZGVyKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMTAwKAotY29tLmFuZHJvaWQuaW50ZXJuYWwubG9jYXRpb24uTmV0d29ya0xvY2F0aW9uUHJvdmlkZXIKLWludCkKLQotc3RhdGljIHZvaWQgYWNjZXNzJDIwMCgKLWNvbS5hbmRyb2lkLmludGVybmFsLmxvY2F0aW9uLk5ldHdvcmtMb2NhdGlvblByb3ZpZGVyKQotCi1zdGF0aWMgbG9uZyBhY2Nlc3MkMzAyKAotY29tLmFuZHJvaWQuaW50ZXJuYWwubG9jYXRpb24uTmV0d29ya0xvY2F0aW9uUHJvdmlkZXIKLWxvbmcpCi0KLXByaXZhdGUgdm9pZCBjbGVhckxvY2F0aW9uKCkKLQotcHJpdmF0ZSB2b2lkIGZvcmNlTG9jYXRpb24oKQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTdXBwb3J0ZWQoKQotCi1wcml2YXRlIHZvaWQgbG9nKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSB2b2lkIHVwZGF0ZUxvY2F0aW9uKCkKLQotcHJpdmF0ZSB2b2lkIHVwZGF0ZVN0YXR1cygKLWludCkKLQotcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoCi1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLXB1YmxpYyB2b2lkIGRpc2FibGUoKQotCi1wdWJsaWMgdm9pZCBlbmFibGUoKQotCi1wdWJsaWMgdm9pZCBlbmFibGVMb2NhdGlvblRyYWNraW5nKAotYm9vbGVhbikKLQotcHVibGljIGludCBnZXRBY2N1cmFjeSgpCi0KLXB1YmxpYyBib29sZWFuIGdldExvY2F0aW9uKAotYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbikKLQotcHVibGljIGludCBnZXRQb3dlclJlcXVpcmVtZW50KCkKLQotcHVibGljIGludCBnZXRTdGF0dXMoCi1hbmRyb2lkLm9zLkJ1bmRsZSkKLQotcHVibGljIGxvbmcgZ2V0U3RhdHVzVXBkYXRlVGltZSgpCi0KLXB1YmxpYyBib29sZWFuIGhhc01vbmV0YXJ5Q29zdCgpCi0KLXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpCi0KLXB1YmxpYyBib29sZWFuIGlzTG9jYXRpb25UcmFja2luZygpCi0KLXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKAotamF2YS5sYW5nLlN0cmluZ1tdKQotCi1wdWJsaWMgYm9vbGVhbiByZXF1aXJlc0NlbGwoKQotCi1wdWJsaWMgYm9vbGVhbiByZXF1aXJlc05ldHdvcmsoKQotCi1wdWJsaWMgYm9vbGVhbiByZXF1aXJlc1NhdGVsbGl0ZSgpCi0KLXB1YmxpYyB2b2lkIHNldE1pblRpbWUoCi1sb25nKQotCi1wdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0FsdGl0dWRlKCkKLQotcHVibGljIGJvb2xlYW4gc3VwcG9ydHNCZWFyaW5nKCkKLQotcHVibGljIGJvb2xlYW4gc3VwcG9ydHNTcGVlZCgpCi0KLXB1YmxpYyB2b2lkIHVwZGF0ZUNlbGxMb2NrU3RhdHVzKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgdXBkYXRlQ2VsbFN0YXRlKAotY29tLmFuZHJvaWQuaW50ZXJuYWwubG9jYXRpb24uQ2VsbFN0YXRlKQotCi1wdWJsaWMgdm9pZCB1cGRhdGVOZXR3b3JrU3RhdGUoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHVwZGF0ZVdpZmlFbmFibGVkU3RhdGUoCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0xpc3Q8TGFuZHJvaWQvbmV0L3dpZmkvU2NhblJlc3VsdDs+OylWICkKLXB1YmxpYyB2b2lkIHVwZGF0ZVdpZmlTY2FuUmVzdWx0cygKLWphdmEudXRpbC5MaXN0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLmxvY2F0aW9uLk5tZWFQYXJzZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IEtOT1RTX1RPX01FVEVSU19QRVJfU0VDT05ECi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEFHCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEudXRpbC5UaW1lWm9uZSBzVXRjVGltZVpvbmUKLQotcHJpdmF0ZSBkb3VibGUgbUFsdGl0dWRlCi0KLXByaXZhdGUgbG9uZyBtQmFzZVRpbWUKLQotcHJpdmF0ZSBmbG9hdCBtQmVhcmluZwotCi1wcml2YXRlIGludCBtRGF5Ci0KLXByaXZhdGUgYW5kcm9pZC5vcy5CdW5kbGUgbUV4dHJhcwotCi1wcml2YXRlIGJvb2xlYW4gbUhhc0FsdGl0dWRlCi0KLXByaXZhdGUgYm9vbGVhbiBtSGFzQmVhcmluZwotCi1wcml2YXRlIGJvb2xlYW4gbUhhc1NwZWVkCi0KLXByaXZhdGUgZG91YmxlIG1MYXRpdHVkZQotCi1wcml2YXRlIGFuZHJvaWQubG9jYXRpb24uTG9jYXRpb24gbUxvY2F0aW9uCi0KLXByaXZhdGUgZG91YmxlIG1Mb25naXR1ZGUKLQotcHJpdmF0ZSBpbnQgbU1vbnRoCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBtTmFtZQotCi1wcml2YXRlIGJvb2xlYW4gbU5ld1dheXBvaW50Ci0KLXByaXZhdGUgZmxvYXQgbVNwZWVkCi0KLXByaXZhdGUgbG9uZyBtVGltZQotCi1wcml2YXRlIGludCBtWWVhcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBkb3VibGUgY29udmVydEZyb21ISE1NKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBib29sZWFuIHVwZGF0ZUFsdGl0dWRlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBib29sZWFuIHVwZGF0ZUJlYXJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIGJvb2xlYW4gdXBkYXRlRGF0ZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgYm9vbGVhbiB1cGRhdGVEb3VibGVFeHRyYSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgYm9vbGVhbiB1cGRhdGVGbG9hdEV4dHJhKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBib29sZWFuIHVwZGF0ZUludEV4dHJhKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBib29sZWFuIHVwZGF0ZUxhdExvbigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgYm9vbGVhbiB1cGRhdGVTcGVlZCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgYm9vbGVhbiB1cGRhdGVUaW1lKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBib29sZWFuIHVwZGF0ZVRpbWUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbiBnZXRMb2NhdGlvbigpCi0KLXB1YmxpYyBib29sZWFuIHBhcnNlU2VudGVuY2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLmxvY2F0aW9uLlByb3RvUmVxdWVzdExpc3RlbmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGNvbS5nb29nbGUubWFzZi5wcm90b2NvbC5SZXF1ZXN0JExpc3RlbmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEFHCi0KLXByaXZhdGUgY29tLmdvb2dsZS5jb21tb24uaW8ucHJvdG9jb2wuUHJvdG9CdWYgcHJvdG9SZXNwb25zZQotCi1wcml2YXRlIGNvbS5nb29nbGUubWFzZi5zZXJ2aWNlcy5Bc3luY1Jlc3VsdCByZXN1bHQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1jb20uZ29vZ2xlLmNvbW1vbi5pby5wcm90b2NvbC5Qcm90b0J1ZgotY29tLmdvb2dsZS5tYXNmLlNlcnZpY2VDYWxsYmFjaykKLQotcHVibGljIGNvbS5nb29nbGUubWFzZi5zZXJ2aWNlcy5Bc3luY1Jlc3VsdCBnZXRBc3luY1Jlc3VsdCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIHJlcXVlc3RDb21wbGV0ZSgKLWNvbS5nb29nbGUubWFzZi5wcm90b2NvbC5SZXF1ZXN0Ci1jb20uZ29vZ2xlLm1hc2YucHJvdG9jb2wuUmVzcG9uc2UpCi0KLXB1YmxpYyB2b2lkIHJlcXVlc3RFeGNlcHRpb24oCi1jb20uZ29vZ2xlLm1hc2YucHJvdG9jb2wuUmVxdWVzdAotamF2YS5sYW5nLkV4Y2VwdGlvbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5sb2NhdGlvbi5UcmFja1Byb3ZpZGVyIGV4dGVuZHMgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvblByb3ZpZGVySW1wbAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIElOVEVSVkFMCi0KLXN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIExPR19UQUcKLQotcHJpdmF0ZSBpbnQgbUFjY3VyYWN5Ci0KLXByaXZhdGUgZG91YmxlIG1BbHRpdHVkZQotCi1wcml2YXRlIGxvbmcgbUJhc2VUaW1lCi0KLXByaXZhdGUgZmxvYXQgbUJlYXJpbmcKLQotcHJpdmF0ZSBib29sZWFuIG1FbmFibGVkCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5CdW5kbGUgbUV4dHJhcwotCi1wcml2YXRlIGJvb2xlYW4gbUhhc0FsdGl0dWRlCi0KLXByaXZhdGUgYm9vbGVhbiBtSGFzQmVhcmluZwotCi1wcml2YXRlIGJvb2xlYW4gbUhhc01vbmV0YXJ5Q29zdAotCi1wcml2YXRlIGJvb2xlYW4gbUhhc1NwZWVkCi0KLXByaXZhdGUgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbiBtSW5pdGlhbExvY2F0aW9uCi0KLXByaXZhdGUgbG9uZyBtTGFzdFRpbWUKLQotcHJpdmF0ZSBkb3VibGUgbUxhdGl0dWRlCi0KLXByaXZhdGUgZG91YmxlIG1Mb25naXR1ZGUKLQotcHJpdmF0ZSBsb25nIG1NYXhUaW1lCi0KLXByaXZhdGUgbG9uZyBtTWluVGltZQotCi1wcml2YXRlIGludCBtUG93ZXJSZXF1aXJlbWVudAotCi1wcml2YXRlIGJvb2xlYW4gbVJlcGVhdAotCi1wcml2YXRlIGJvb2xlYW4gbVJlcXVpcmVzQ2VsbAotCi1wcml2YXRlIGJvb2xlYW4gbVJlcXVpcmVzTmV0d29yawotCi1wcml2YXRlIGJvb2xlYW4gbVJlcXVpcmVzU2F0ZWxsaXRlCi0KLXByaXZhdGUgZmxvYXQgbVNwZWVkCi0KLXByaXZhdGUgYm9vbGVhbiBtU3VwcG9ydHNBbHRpdHVkZQotCi1wcml2YXRlIGJvb2xlYW4gbVN1cHBvcnRzQmVhcmluZwotCi1wcml2YXRlIGJvb2xlYW4gbVN1cHBvcnRzU3BlZWQKLQotcHJpdmF0ZSBsb25nIG1UaW1lCi0KLXByaXZhdGUgZmxvYXQgbVRyYWNrU3BlZWQKLQotcHJpdmF0ZSBpbnQgbVdheXBvaW50SW5kZXgKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0xpc3Q8TGNvbS9hbmRyb2lkL2ludGVybmFsL2xvY2F0aW9uL1dheXBvaW50Oz47ICkKLXByaXZhdGUgamF2YS51dGlsLkxpc3QgbVdheXBvaW50cwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEuaW8uRmlsZSkKLQotcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBib29sZWFuVmFsKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSB2b2lkIGNsb3NlKAotamF2YS5pby5SZWFkZXIpCi0KLXByaXZhdGUgc3RhdGljIGZsb2F0IGZsb2F0VmFsKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBzdGF0aWMgaW50IGludFZhbCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgZG91YmxlIGludGVycCgKLWRvdWJsZQotZG91YmxlCi1mbG9hdCkKLQotcHJpdmF0ZSB2b2lkIHNldFRpbWVzKCkKLQotcHJpdmF0ZSB2b2lkIHVwZGF0ZSgpCi0KLXB1YmxpYyB2b2lkIGRpc2FibGUoKQotCi1wdWJsaWMgdm9pZCBlbmFibGUoKQotCi1wdWJsaWMgaW50IGdldEFjY3VyYWN5KCkKLQotcHVibGljIGFuZHJvaWQubG9jYXRpb24uTG9jYXRpb24gZ2V0SW5pdGlhbExvY2F0aW9uKCkKLQotcHVibGljIGJvb2xlYW4gZ2V0TG9jYXRpb24oCi1hbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uKQotCi1wdWJsaWMgaW50IGdldFBvd2VyUmVxdWlyZW1lbnQoKQotCi1wdWJsaWMgaW50IGdldFN0YXR1cygKLWFuZHJvaWQub3MuQnVuZGxlKQotCi1wdWJsaWMgYm9vbGVhbiBoYXNNb25ldGFyeUNvc3QoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKQotCi1wdWJsaWMgdm9pZCByZWFkS21sKAotamF2YS5pby5GaWxlKQotCi1wdWJsaWMgdm9pZCByZWFkTm1lYSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEuaW8uRmlsZSkKLQotcHVibGljIHZvaWQgcmVhZFByb3BlcnRpZXMoCi1qYXZhLmlvLkZpbGUpCi0KLXB1YmxpYyB2b2lkIHJlYWRUcmFjaygKLWphdmEuaW8uRmlsZSkKLQotcHVibGljIGJvb2xlYW4gcmVxdWlyZXNDZWxsKCkKLQotcHVibGljIGJvb2xlYW4gcmVxdWlyZXNOZXR3b3JrKCkKLQotcHVibGljIGJvb2xlYW4gcmVxdWlyZXNTYXRlbGxpdGUoKQotCi1wdWJsaWMgdm9pZCBzZXRBY2N1cmFjeSgKLWludCkKLQotcHVibGljIHZvaWQgc2V0SGFzTW9uZXRhcnlDb3N0KAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0UG93ZXJSZXF1aXJlbWVudCgKLWludCkKLQotcHVibGljIHZvaWQgc2V0UmVwZWF0KAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0UmVxdWlyZXNDZWxsKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0UmVxdWlyZXNOZXR3b3JrKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0UmVxdWlyZXNTYXRlbGxpdGUoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRTdXBwb3J0c0FsdGl0dWRlKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0U3VwcG9ydHNCZWFyaW5nKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0U3VwcG9ydHNTcGVlZCgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldFRyYWNrU3BlZWQoCi1mbG9hdCkKLQotcHVibGljIGJvb2xlYW4gc3VwcG9ydHNBbHRpdHVkZSgpCi0KLXB1YmxpYyBib29sZWFuIHN1cHBvcnRzQmVhcmluZygpCi0KLXB1YmxpYyBib29sZWFuIHN1cHBvcnRzU3BlZWQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLmxvY2F0aW9uLldheXBvaW50IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbiBtTG9jYXRpb24KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1sb25nCi1kb3VibGUKLWRvdWJsZQotZG91YmxlKQotCi1wdWJsaWMgZG91YmxlIGdldEFsdGl0dWRlKCkKLQotcHVibGljIGZsb2F0IGdldEJlYXJpbmcoKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5CdW5kbGUgZ2V0RXh0cmFzKCkKLQotcHVibGljIGRvdWJsZSBnZXRMYXRpdHVkZSgpCi0KLXB1YmxpYyBhbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uIGdldExvY2F0aW9uKCkKLQotcHVibGljIGRvdWJsZSBnZXRMb25naXR1ZGUoKQotCi1wdWJsaWMgZmxvYXQgZ2V0U3BlZWQoKQotCi1wdWJsaWMgbG9uZyBnZXRUaW1lKCkKLQotcHVibGljIGJvb2xlYW4gaGFzQWx0aXR1ZGUoKQotCi1wdWJsaWMgYm9vbGVhbiBoYXNCZWFyaW5nKCkKLQotcHVibGljIGJvb2xlYW4gaGFzU3BlZWQoKQotCi1wdWJsaWMgdm9pZCBzZXRCZWFyaW5nKAotZmxvYXQpCi0KLXB1YmxpYyB2b2lkIHNldFNwZWVkKAotZmxvYXQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwubG9jYXRpb24ucHJvdG9jb2wuR0FkZHJlc3MgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTVBPTkVOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRURURfQUREUkVTU19MSU5FCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwubG9jYXRpb24ucHJvdG9jb2wuR0FkZHJlc3NDb21wb25lbnQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZFQVRVUkVfVFlQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBOQU1FCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwubG9jYXRpb24ucHJvdG9jb2wuR0FwcFByb2ZpbGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFQUF9LRVkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVBQX05BTUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVRVUVTVF9UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFQVJDSF9URVJNCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFQVJDSF9UWVBFCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwubG9jYXRpb24ucHJvdG9jb2wuR0NlbGwgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFHRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDRUxMSUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEFDCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1DQwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNTkMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJTUFSWV9TQ1JBTUJMSU5HX0NPREUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlNTSQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUSU1JTkdfQURWQU5DRQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLmxvY2F0aW9uLnByb3RvY29sLkdDZWxsdWxhclBsYXRmb3JtUHJvZmlsZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FSUklFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBIT01FX01DQwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBIT01FX01OQwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJUAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSQURJT19UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJBRElPX1RZUEVfQ0RNQQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSQURJT19UWVBFX0dQUlMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkFESU9fVFlQRV9XQ0RNQQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLmxvY2F0aW9uLnByb3RvY29sLkdDZWxsdWxhclByb2ZpbGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhJU1RPUklDQUxfQ0VMTFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkVJR0hCT1JTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRUZFVENIX01PREUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJTUFSWV9DRUxMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRJTUVTVEFNUAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLmxvY2F0aW9uLnByb3RvY29sLkdEZWJ1Z1Byb2ZpbGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDVFVBTF9SRVFVRVNUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBQ0hFX0xPQ0FUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSSUdHRVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFJJR0dFUl9DRUxMX0FORF9XSUZJX0NIQU5HRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUUklHR0VSX0NFTExfQ0hBTkdFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSSUdHRVJfQ09MTEVDVElPTl9DT05USU5VRV9CVVJTVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUUklHR0VSX0NPTExFQ1RJT05fRU5EX0JVUlNUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSSUdHRVJfQ09MTEVDVElPTl9FTkRfQlVSU1RfQVRfU0FNRV9MT0NBVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUUklHR0VSX0NPTExFQ1RJT05fTU9WRURfRElTVEFOQ0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFJJR0dFUl9DT0xMRUNUSU9OX1JFU1RBUlRfQlVSU1QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFJJR0dFUl9DT0xMRUNUSU9OX1NUQVJUX0JVUlNUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSSUdHRVJfR1BTX0NIQU5HRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUUklHR0VSX09USEVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSSUdHRVJfV0lGSV9DSEFOR0UKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5sb2NhdGlvbi5wcm90b2NvbC5HRGV2aWNlTG9jYXRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENFTEwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9DQVRJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lGSV9ERVZJQ0UKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5sb2NhdGlvbi5wcm90b2NvbC5HRmVhdHVyZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUREUkVTUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCT1VORFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0VOVEVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZFQVRVUkVfVFlQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGRUFUVVJFX1RZUEVfQURNSU5JU1RSQVRJVkVfQVJFQQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGRUFUVVJFX1RZUEVfQ09VTlRSWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGRUFUVVJFX1RZUEVfQ09VTlRSWV9DT0RFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZFQVRVUkVfVFlQRV9MT0NBTElUWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGRUFUVVJFX1RZUEVfUE9TVF9DT0RFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZFQVRVUkVfVFlQRV9QUkVNSVNFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGRUFUVVJFX1RZUEVfU1VCX0FETUlOSVNUUkFUSVZFX0FSRUEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkVBVFVSRV9UWVBFX1NVQl9MT0NBTElUWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGRUFUVVJFX1RZUEVfU1VCX1RIT1JPVUdIRkFSRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGRUFUVVJFX1RZUEVfVEhPUk9VR0hGQVJFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZFQVRVUkVfVFlQRV9VTktOT1dOX1RZUEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFNRQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLmxvY2F0aW9uLnByb3RvY29sLkdHZW9jb2RlUmVxdWVzdCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQk9VTkRJTkdfQk9YCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOQ0xVREVfQk9VTkRJTkdfQk9YRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTlVNX0ZFQVRVUkVfTElNSVQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5sb2NhdGlvbi5wcm90b2NvbC5HR3BzUHJvZmlsZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklYX1FVQUxJVFlfREdQU19GSVgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklYX1FVQUxJVFlfR1BTX0ZJWAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSVhfUVVBTElUWV9JTlZBTElECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdQU19GSVhfVFlQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBIRE9QCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBET1AKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkRPUAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLmxvY2F0aW9uLnByb3RvY29sLkdMYXRMbmcgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExBVF9FNwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMTkdfRTcKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5sb2NhdGlvbi5wcm90b2NvbC5HTG9jUmVwbHkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMQVRGT1JNX0tFWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVBMWV9FTEVNRU5UUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5sb2NhdGlvbi5wcm90b2NvbC5HTG9jUmVwbHlFbGVtZW50IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfTE9DQVRJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9DQVRJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwubG9jYXRpb24ucHJvdG9jb2wuR0xvY1JlcXVlc3QgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFQUF9QUk9GSUxFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVNGX0NMSUVOVF9JTkZPCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMQVRGT1JNX1BST0ZJTEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVRVUVTVF9FTEVNRU5UUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBVU0VSX1BST0ZJTEUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5sb2NhdGlvbi5wcm90b2NvbC5HTG9jUmVxdWVzdEVsZW1lbnQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENFTExVTEFSX1BST0ZJTEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVCVUdfUFJPRklMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHRU9DT0RFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQ0FUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdJRklfUFJPRklMRQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLmxvY2F0aW9uLnByb3RvY29sLkdMb2NhdGlvbiBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNDVVJBQ1kKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUxUSVRVREUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09ORklERU5DRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGRUFUVVJFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdQU19QUk9GSUxFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhFQURJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEFUX0xORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0NBVElPTl9TVFJJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9DVFlQRV9DRU5UUk9JRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0NUWVBFX0dQUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0NUWVBFX01BUENFTlRFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0NUWVBFX1RPV0VSX0xPQ0FUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQ19UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JU0MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0JTT0xFVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU09VUkNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRJTUVTVEFNUAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWRUxPQ0lUWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWRVJUSUNBTF9BQ0NVUkFDWQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLmxvY2F0aW9uLnByb3RvY29sLkdQbGF0Zm9ybVByb2ZpbGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENFTExVTEFSX1BMQVRGT1JNX1BST0ZJTEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTVFJJQlVUSU9OX0NIQU5ORUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9DQUxFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMQVRGT1JNCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMQVRGT1JNX0tFWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWRVJTSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdJRklfUExBVEZPUk1fUFJPRklMRQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLmxvY2F0aW9uLnByb3RvY29sLkdQcmVmZXRjaE1vZGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRUZFVENIX01PREVfTU9SRV9ORUlHSEJPUlMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJFRkVUQ0hfTU9ERV9OT19QUkVGRVRDSAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUkVGRVRDSF9NT0RFX1JFUVVFU1RFRF9ORUlHSEJPUlNfT05MWQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLmxvY2F0aW9uLnByb3RvY29sLkdSZWN0YW5nbGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPV0VSX0xFRlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVBQRVJfUklHSFQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5sb2NhdGlvbi5wcm90b2NvbC5HVXNlclByb2ZpbGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFVVEhfVE9LRU4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVNFUl9OQU1FCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwubG9jYXRpb24ucHJvdG9jb2wuR1dpZmlEZXZpY2UgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIQU5ORUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFDCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PSVNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJTU0kKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1NJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLmxvY2F0aW9uLnByb3RvY29sLkdXaWZpUGxhdGZvcm1Qcm9maWxlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSQURJT19UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJBRElPX1RZUEVfV0lGSTgwMl8xMV9BCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJBRElPX1RZUEVfV0lGSTgwMl8xMV9CCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJBRElPX1RZUEVfV0lGSTgwMl8xMV9HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJBRElPX1RZUEVfV0lGSTgwMl8xMV9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDQU5ORVJfSVAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NBTk5FUl9NQUMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5sb2NhdGlvbi5wcm90b2NvbC5HV2lmaVByb2ZpbGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRUZFVENIX01PREUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVElNRVNUQU1QCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdJRklfREVWSUNFUwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwubG9jYXRpb24ucHJvdG9jb2wuR2FkZHJlc3NNZXNzYWdlVHlwZXMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmdvb2dsZS5jb21tb24uaW8ucHJvdG9jb2wuUHJvdG9CdWZUeXBlIEdBRERSRVNTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmdvb2dsZS5jb21tb24uaW8ucHJvdG9jb2wuUHJvdG9CdWZUeXBlIEdBRERSRVNTX0NPTVBPTkVOVAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5sb2NhdGlvbi5wcm90b2NvbC5HY2VsbHVsYXJNZXNzYWdlVHlwZXMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmdvb2dsZS5jb21tb24uaW8ucHJvdG9jb2wuUHJvdG9CdWZUeXBlIEdDRUxMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmdvb2dsZS5jb21tb24uaW8ucHJvdG9jb2wuUHJvdG9CdWZUeXBlIEdDRUxMVUxBUl9QUk9GSUxFCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLmxvY2F0aW9uLnByb3RvY29sLkdkZWJ1Z3Byb2ZpbGVNZXNzYWdlVHlwZXMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmdvb2dsZS5jb21tb24uaW8ucHJvdG9jb2wuUHJvdG9CdWZUeXBlIEdERUJVR19QUk9GSUxFCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLmxvY2F0aW9uLnByb3RvY29sLkdmZWF0dXJlTWVzc2FnZVR5cGVzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5nb29nbGUuY29tbW9uLmlvLnByb3RvY29sLlByb3RvQnVmVHlwZSBHRkVBVFVSRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5nb29nbGUuY29tbW9uLmlvLnByb3RvY29sLlByb3RvQnVmVHlwZSBHRkVBVFVSRV9UWVBFCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLmxvY2F0aW9uLnByb3RvY29sLkdsYXRsbmdNZXNzYWdlVHlwZXMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmdvb2dsZS5jb21tb24uaW8ucHJvdG9jb2wuUHJvdG9CdWZUeXBlIEdMQVRfTE5HCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLmxvY2F0aW9uLnByb3RvY29sLkdsb2NhdGlvbk1lc3NhZ2VUeXBlcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uZ29vZ2xlLmNvbW1vbi5pby5wcm90b2NvbC5Qcm90b0J1ZlR5cGUgR0FQUF9QUk9GSUxFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmdvb2dsZS5jb21tb24uaW8ucHJvdG9jb2wuUHJvdG9CdWZUeXBlIEdDRUxMVUxBUl9QTEFURk9STV9QUk9GSUxFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmdvb2dsZS5jb21tb24uaW8ucHJvdG9jb2wuUHJvdG9CdWZUeXBlIEdERVZJQ0VfTE9DQVRJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uZ29vZ2xlLmNvbW1vbi5pby5wcm90b2NvbC5Qcm90b0J1ZlR5cGUgR0dQU19QUk9GSUxFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmdvb2dsZS5jb21tb24uaW8ucHJvdG9jb2wuUHJvdG9CdWZUeXBlIEdMT0NBVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5nb29nbGUuY29tbW9uLmlvLnByb3RvY29sLlByb3RvQnVmVHlwZSBHUExBVEZPUk1fUFJPRklMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5nb29nbGUuY29tbW9uLmlvLnByb3RvY29sLlByb3RvQnVmVHlwZSBHUFJFRkVUQ0hfTU9ERQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5nb29nbGUuY29tbW9uLmlvLnByb3RvY29sLlByb3RvQnVmVHlwZSBHVVNFUl9QUk9GSUxFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmdvb2dsZS5jb21tb24uaW8ucHJvdG9jb2wuUHJvdG9CdWZUeXBlIEdXSUZJX1BMQVRGT1JNX1BST0ZJTEUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwubG9jYXRpb24ucHJvdG9jb2wuR3JlY3RhbmdsZU1lc3NhZ2VUeXBlcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uZ29vZ2xlLmNvbW1vbi5pby5wcm90b2NvbC5Qcm90b0J1ZlR5cGUgR1JFQ1RBTkdMRQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5sb2NhdGlvbi5wcm90b2NvbC5Hd2lmaU1lc3NhZ2VUeXBlcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uZ29vZ2xlLmNvbW1vbi5pby5wcm90b2NvbC5Qcm90b0J1ZlR5cGUgR1dJRklfREVWSUNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmdvb2dsZS5jb21tb24uaW8ucHJvdG9jb2wuUHJvdG9CdWZUeXBlIEdXSUZJX1BST0ZJTEUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwubG9jYXRpb24ucHJvdG9jb2wuTG9jc2VydmVyTWVzc2FnZVR5cGVzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5nb29nbGUuY29tbW9uLmlvLnByb3RvY29sLlByb3RvQnVmVHlwZSBHR0VPQ09ERV9SRVFVRVNUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmdvb2dsZS5jb21tb24uaW8ucHJvdG9jb2wuUHJvdG9CdWZUeXBlIEdMT0NfUkVQTFkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uZ29vZ2xlLmNvbW1vbi5pby5wcm90b2NvbC5Qcm90b0J1ZlR5cGUgR0xPQ19SRVBMWV9FTEVNRU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmdvb2dsZS5jb21tb24uaW8ucHJvdG9jb2wuUHJvdG9CdWZUeXBlIEdMT0NfUkVRVUVTVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5nb29nbGUuY29tbW9uLmlvLnByb3RvY29sLlByb3RvQnVmVHlwZSBHTE9DX1JFUVVFU1RfRUxFTUVOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5nb29nbGUuY29tbW9uLmlvLnByb3RvY29sLlByb3RvQnVmVHlwZSBSRVNQT05TRV9DT0RFUwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwubG9jYXRpb24ucHJvdG9jb2wuUmVzcG9uc2VDb2RlcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0FVVEhPUklaQVRJT05fUkVKRUNURUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0JMQUNLTElTVEVEX0lQX0NFTExJRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfQkxBQ0tMSVNURURfSVBfV0lGSQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfSU5WQUxJRF9DRUxMSURfU1RSSU5HX0ZPUk1BVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfSU5WQUxJRF9NQUNfU1RSSU5HX0ZPUk1BVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfSU5WQUxJRF9OVU1fUkVRVUVTVFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0lOVkFMSURfT1BFUkFUSU9OX0NPREUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0lOVkFMSURfUkVRVUVTVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfSU5WQUxJRF9VU0VSTE9DQVRJT05fRk9STUFUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19OT05fRVhJU1RFTlRfQVAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX05PTl9FWElTVEVOVF9DRUxMSUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX05PTl9TVVBQT1JURURfT1BFUkFUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19OT05fU1VQUE9SVEVEX09QRVJBVElPTl9JTl9VUERBVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX05PX0NFTExJRERBVEFfRk9SX1VQREFURQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfTk9fU09VUkNFX0VYSVNUUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfTk9fU1RPUkVfRVhJU1RTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19QTEFURk9STV9LRVlfRVhQSVJFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfU0lHTkFMX1RPT19XRUFLCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19TVEFUVVNfRkFJTEVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19TVEFUVVNfRkFJTEVEX05PX0dFT0NPREUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX1NUQVRVU19GQUlMRURfTk9fU0FWRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfU1RBVFVTX0ZBSUxFRF9OT19TT1VSQ0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX1NUQVRVU19TVUNDRVNTCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5sb2dnaW5nLkFuZHJvaWRDb25maWcgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5sb2dnaW5nLkFuZHJvaWRIYW5kbGVyIGV4dGVuZHMgamF2YS51dGlsLmxvZ2dpbmcuSGFuZGxlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwubG9nZ2luZy5Gb3JtYXR0ZXIgVEhFX0ZPUk1BVFRFUgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotc3RhdGljIGludCBnZXRBbmRyb2lkTGV2ZWwoCi1qYXZhLnV0aWwubG9nZ2luZy5MZXZlbCkKLQotcHVibGljIHZvaWQgY2xvc2UoKQotCi1wdWJsaWMgdm9pZCBmbHVzaCgpCi0KLXB1YmxpYyB2b2lkIHB1Ymxpc2goCi1qYXZhLnV0aWwubG9nZ2luZy5Mb2dSZWNvcmQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1hYnN0cmFjdCBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5vcy5Mb2dnaW5nUHJpbnRTdHJlYW0gZXh0ZW5kcyBqYXZhLmlvLlByaW50U3RyZWFtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIgYnVpbGRlcgotCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5Gb3JtYXR0ZXIgZm9ybWF0dGVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIGZsdXNoKAotYm9vbGVhbikKLQotcHVibGljIGphdmEuaW8uUHJpbnRTdHJlYW0gYXBwZW5kKAotY2hhcikKLQotcHVibGljIGphdmEuaW8uUHJpbnRTdHJlYW0gYXBwZW5kKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotcHVibGljIGphdmEuaW8uUHJpbnRTdHJlYW0gYXBwZW5kKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuQXBwZW5kYWJsZSBhcHBlbmQoCi1jaGFyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLkFwcGVuZGFibGUgYXBwZW5kKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5BcHBlbmRhYmxlIGFwcGVuZCgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWludAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBjaGVja0Vycm9yKCkKLQotcHVibGljIHZvaWQgY2xvc2UoKQotCi1wdWJsaWMgdm9pZCBmbHVzaCgpCi0KLXB1YmxpYyB0cmFuc2llbnQgamF2YS5pby5QcmludFN0cmVhbSBmb3JtYXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0W10pCi0KLXB1YmxpYyB0cmFuc2llbnQgamF2YS5pby5QcmludFN0cmVhbSBmb3JtYXQoCi1qYXZhLnV0aWwuTG9jYWxlCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0W10pCi0KLXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGxvZygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHByaW50KAotY2hhcikKLQotcHVibGljIHZvaWQgcHJpbnQoCi1kb3VibGUpCi0KLXB1YmxpYyB2b2lkIHByaW50KAotZmxvYXQpCi0KLXB1YmxpYyB2b2lkIHByaW50KAotaW50KQotCi1wdWJsaWMgdm9pZCBwcmludCgKLWxvbmcpCi0KLXB1YmxpYyB2b2lkIHByaW50KAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHZvaWQgcHJpbnQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBwcmludCgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHByaW50KAotY2hhcltdKQotCi1wdWJsaWMgdHJhbnNpZW50IGphdmEuaW8uUHJpbnRTdHJlYW0gcHJpbnRmKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLk9iamVjdFtdKQotCi1wdWJsaWMgdHJhbnNpZW50IGphdmEuaW8uUHJpbnRTdHJlYW0gcHJpbnRmKAotamF2YS51dGlsLkxvY2FsZQotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLk9iamVjdFtdKQotCi1wdWJsaWMgdm9pZCBwcmludGxuKCkKLQotcHVibGljIHZvaWQgcHJpbnRsbigKLWNoYXIpCi0KLXB1YmxpYyB2b2lkIHByaW50bG4oCi1kb3VibGUpCi0KLXB1YmxpYyB2b2lkIHByaW50bG4oCi1mbG9hdCkKLQotcHVibGljIHZvaWQgcHJpbnRsbigKLWludCkKLQotcHVibGljIHZvaWQgcHJpbnRsbigKLWxvbmcpCi0KLXB1YmxpYyB2b2lkIHByaW50bG4oCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgdm9pZCBwcmludGxuKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgcHJpbnRsbigKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHByaW50bG4oCi1jaGFyW10pCi0KLXByb3RlY3RlZCB2b2lkIHNldEVycm9yKCkKLQotcHVibGljIHZvaWQgd3JpdGUoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHdyaXRlKAotYnl0ZVtdKQotCi1wdWJsaWMgdm9pZCB3cml0ZSgKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi0gY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuQW5kcm9pZFByaW50U3RyZWFtIGV4dGVuZHMgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuTG9nZ2luZ1ByaW50U3RyZWFtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgaW50IHByaW9yaXR5Ci0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyB0YWcKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByb3RlY3RlZCB2b2lkIGxvZygKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNCBuYW1lID1HY1dhdGNoZXIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL29zL0JpbmRlckludGVybmFsOyApCi1maW5hbCBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5vcy5CaW5kZXJJbnRlcm5hbCRHY1dhdGNoZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL1Rocm93YWJsZTsgKQotcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL29zL0JpbmRlckludGVybmFsJEdjV2F0Y2hlcjsgKQotcHVibGljIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLm9zLkJpbmRlckludGVybmFsIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvcmVmL1dlYWtSZWZlcmVuY2U8TGNvbS9hbmRyb2lkL2ludGVybmFsL29zL0JpbmRlckludGVybmFsJEdjV2F0Y2hlcjs+OyApCi1zdGF0aWMgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlIG1HY1dhdGNoZXIKLQotc3RhdGljIGxvbmcgbUxhc3RHY1RpbWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXN0YXRpYyB2b2lkIGZvcmNlQmluZGVyR2MoKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgZm9yY2VHYygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGFuZHJvaWQub3MuSUJpbmRlciBnZXRDb250ZXh0T2JqZWN0KCkKLQotcHVibGljIHN0YXRpYyBsb25nIGdldExhc3RHY1RpbWUoKQotCi1zdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgaGFuZGxlR2MoKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGpvaW5UaHJlYWRQb29sKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5vcy5IYW5kbGVySGVscGVyIGV4dGVuZHMgYW5kcm9pZC5vcy5IYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5IYW5kbGVySW50ZXJmYWNlIG1UYXJnZXQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLkhhbmRsZXJJbnRlcmZhY2UpCi0KLXB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuSGFuZGxlclRocmVhZCBleHRlbmRzIGphdmEubGFuZy5UaHJlYWQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgamF2YS5sYW5nLk9iamVjdCBtTW9uaXRvcgotCi0gamF2YS5sYW5nLlJ1bm5hYmxlIG1TZXR1cAotCi0gYW5kcm9pZC5vcy5IYW5kbGVyIG1oCi0KLSBhbmRyb2lkLm9zLkhhbmRsZXJJbnRlcmZhY2UgbWhpCi0KLSBqYXZhLmxhbmcuVGhyb3dhYmxlIG10cgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuSGFuZGxlckludGVyZmFjZQotamF2YS5sYW5nLlJ1bm5hYmxlCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5IYW5kbGVyIGdldEhhbmRsZXIoKQotCi1wdWJsaWMgdm9pZCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLSBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5vcy5Mb2dnaW5nUHJpbnRTdHJlYW0kMSBleHRlbmRzIGphdmEuaW8uT3V0cHV0U3RyZWFtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgd3JpdGUoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotZmluYWwgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuUnVudGltZUluaXQkMSBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmludGVybmFsLnV0aWwuVGltZXpvbmVHZXR0ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJZCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1VbmNhdWdodEhhbmRsZXIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL29zL1J1bnRpbWVJbml0OyApCi0gY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuUnVudGltZUluaXQkVW5jYXVnaHRIYW5kbGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5UaHJlYWQkVW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLSB2b2lkIDxpbml0PigKLWNvbS5hbmRyb2lkLmludGVybmFsLm9zLlJ1bnRpbWVJbml0JDEpCi0KLXB1YmxpYyB2b2lkIHVuY2F1Z2h0RXhjZXB0aW9uKAotamF2YS5sYW5nLlRocmVhZAotamF2YS5sYW5nLlRocm93YWJsZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9SdW50aW1lSW5pdCRVbmNhdWdodEhhbmRsZXI7ICkKLXB1YmxpYyBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5vcy5SdW50aW1lSW5pdCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLQotcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpbml0aWFsaXplZAotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLm9zLklCaW5kZXIgbUFwcGxpY2F0aW9uT2JqZWN0Ci0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyIHNJblJlcG9ydEV4Y2VwdGlvbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgdm9pZCBjb21tb25Jbml0KCkKLQotcHVibGljIHN0YXRpYyB2b2lkIGNyYXNoKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlRocm93YWJsZSkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBmaW5pc2hJbml0KCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGdldFF3ZXJ0eUtleWJvYXJkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvWnlnb3RlSW5pdCRNZXRob2RBbmRBcmdzQ2FsbGVyOyApCi1wcml2YXRlIHN0YXRpYyB2b2lkIGludm9rZVN0YXRpY01haW4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBpc0NvbXB1dGVyT24oKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgbWFpbigKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIG1hcnNoYWxsRXhjZXB0aW9uKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlRocm93YWJsZSkKLQotcHVibGljIHN0YXRpYyB2b2lkIHJlcG9ydEV4Y2VwdGlvbigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5UaHJvd2FibGUKLWJvb2xlYW4pCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBzZXRBcHBsaWNhdGlvbk9iamVjdCgKLWFuZHJvaWQub3MuSUJpbmRlcikKLQotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCB0dXJuQ29tcHV0ZXJPbigpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5zZXJ2ZXIuZGF0YS5DcmFzaERhdGEgdW5tYXJzaGFsbEV4Y2VwdGlvbigKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvWnlnb3RlSW5pdCRNZXRob2RBbmRBcmdzQ2FsbGVyOyApCi1wdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgenlnb3RlSW5pdCgKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCB6eWdvdGVJbml0TmF0aXZlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvWnlnb3RlQ29ubmVjdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPUFyZ3VtZW50cyApCi0gY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuWnlnb3RlQ29ubmVjdGlvbiRBcmd1bWVudHMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBib29sZWFuIGNhcGFiaWxpdGllc1NwZWNpZmllZAotCi0gamF2YS5sYW5nLlN0cmluZyBjbGFzc3BhdGgKLQotIGxvbmcgZWZmZWN0aXZlQ2FwYWJpbGl0aWVzCi0KLSBib29sZWFuIGVuYWJsZURlYnVnZ2VyCi0KLSBpbnQgZ2lkCi0KLSBib29sZWFuIGdpZFNwZWNpZmllZAotCi0gaW50W10gZ2lkcwotCi0gYm9vbGVhbiBwZWVyV2FpdAotCi0gbG9uZyBwZXJtaXR0ZWRDYXBhYmlsaXRpZXMKLQotIGphdmEubGFuZy5TdHJpbmdbXSByZW1haW5pbmdBcmdzCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9BcnJheUxpc3Q8W0k+OyApCi0gamF2YS51dGlsLkFycmF5TGlzdCBybGltaXRzCi0KLSBib29sZWFuIHJ1bnRpbWVJbml0Ci0KLSBpbnQgdWlkCi0KLSBib29sZWFuIHVpZFNwZWNpZmllZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247ICkKLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmdbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHBhcnNlQXJncygKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9aeWdvdGVDb25uZWN0aW9uJEFyZ3VtZW50czsgKQotIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLm9zLlp5Z290ZUNvbm5lY3Rpb24gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT05ORUNUSU9OX1RJTUVPVVRfTUlMTElTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfWllHT1RFX0FSR0MKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W11bXSBpbnRBcnJheTJkCi0KLXByaXZhdGUgc3RhdGljIGFuZHJvaWQubmV0LkxvY2FsU29ja2V0IHNQZWVyV2FpdFNvY2tldAotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQubmV0LkxvY2FsU29ja2V0IG1Tb2NrZXQKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW0gbVNvY2tldE91dFN0cmVhbQotCi1wcml2YXRlIGZpbmFsIGphdmEuaW8uQnVmZmVyZWRSZWFkZXIgbVNvY2tldFJlYWRlcgotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQubmV0LkNyZWRlbnRpYWxzIHBlZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLSB2b2lkIDxpbml0PigKLWFuZHJvaWQubmV0LkxvY2FsU29ja2V0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9aeWdvdGVTZWN1cml0eUV4Y2VwdGlvbjsgKQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBhcHBseUNhcGFiaWxpdGllc1NlY3VyaXR5UG9saWN5KAotY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuWnlnb3RlQ29ubmVjdGlvbiRBcmd1bWVudHMKLWFuZHJvaWQubmV0LkNyZWRlbnRpYWxzKQotCi1wcml2YXRlIHN0YXRpYyB2b2lkIGFwcGx5RGVidWdnZXJTZWN1cml0eVBvbGljeSgKLWNvbS5hbmRyb2lkLmludGVybmFsLm9zLlp5Z290ZUNvbm5lY3Rpb24kQXJndW1lbnRzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9aeWdvdGVTZWN1cml0eUV4Y2VwdGlvbjsgKQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBhcHBseVJsaW1pdFNlY3VyaXR5UG9saWN5KAotY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuWnlnb3RlQ29ubmVjdGlvbiRBcmd1bWVudHMKLWFuZHJvaWQubmV0LkNyZWRlbnRpYWxzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9aeWdvdGVTZWN1cml0eUV4Y2VwdGlvbjsgKQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBhcHBseVVpZFNlY3VyaXR5UG9saWN5KAotY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuWnlnb3RlQ29ubmVjdGlvbiRBcmd1bWVudHMKLWFuZHJvaWQubmV0LkNyZWRlbnRpYWxzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9aeWdvdGVJbml0JE1ldGhvZEFuZEFyZ3NDYWxsZXI7ICkKLXByaXZhdGUgdm9pZCBoYW5kbGVDaGlsZFByb2MoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC5vcy5aeWdvdGVDb25uZWN0aW9uJEFyZ3VtZW50cwotamF2YS5pby5GaWxlRGVzY3JpcHRvcltdCi1qYXZhLmlvLlByaW50U3RyZWFtKQotCi1wcml2YXRlIGJvb2xlYW4gaGFuZGxlUGFyZW50UHJvYygKLWludAotamF2YS5pby5GaWxlRGVzY3JpcHRvcltdCi1jb20uYW5kcm9pZC5pbnRlcm5hbC5vcy5aeWdvdGVDb25uZWN0aW9uJEFyZ3VtZW50cykKLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2dBbmRQcmludEVycm9yKAotamF2YS5pby5QcmludFN0cmVhbQotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlRocm93YWJsZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nW10gcmVhZEFyZ3VtZW50TGlzdCgpCi0KLSB2b2lkIGNsb3NlU29ja2V0KCkKLQotIGphdmEuaW8uRmlsZURlc2NyaXB0b3IgZ2V0RmlsZURlc2NpcHRvcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL29zL1p5Z290ZUluaXQkTWV0aG9kQW5kQXJnc0NhbGxlcjsgKQotIHZvaWQgcnVuKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvWnlnb3RlSW5pdCRNZXRob2RBbmRBcmdzQ2FsbGVyOyApCi0gYm9vbGVhbiBydW5PbmNlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9TWV0aG9kQW5kQXJnc0NhbGxlciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvWnlnb3RlSW5pdDsgKQotcHVibGljIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLm9zLlp5Z290ZUluaXQkTWV0aG9kQW5kQXJnc0NhbGxlciBleHRlbmRzIGphdmEubGFuZy5FeGNlcHRpb24gaW1wbGVtZW50cyBqYXZhLmxhbmcuUnVubmFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gbUFyZ3MKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgbU1ldGhvZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZAotamF2YS5sYW5nLlN0cmluZ1tdKQotCi1wdWJsaWMgdm9pZCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL29zL1p5Z290ZUluaXQkTWV0aG9kQW5kQXJnc0NhbGxlcjsgKQotcHVibGljIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLm9zLlp5Z290ZUluaXQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQU5EUk9JRF9TT0NLRVRfRU5WCi0KLXN0YXRpYyBmaW5hbCBpbnQgR0NfTE9PUF9DT1VOVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTE9HX0JPT1RfUFJPR1JFU1NfUFJFTE9BRF9FTkQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExPR19CT09UX1BST0dSRVNTX1BSRUxPQURfU1RBUlQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQUkVMT0FERURfQ0xBU1NFUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFJFTE9BRF9HQ19USFJFU0hPTEQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBQUkVMT0FEX1JFU09VUkNFUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUk9PVF9HSUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJPT1RfVUlECi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEFHCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVTlBSSVZJTEVHRURfR0lECi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVTlBSSVZJTEVHRURfVUlECi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gWllHT1RFX0ZPUktfTU9ERQotCi1wcml2YXRlIHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcyBtUmVzb3VyY2VzCi0KLXByaXZhdGUgc3RhdGljIGFuZHJvaWQubmV0LkxvY2FsU2VydmVyU29ja2V0IHNTZXJ2ZXJTb2NrZXQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuWnlnb3RlQ29ubmVjdGlvbiBhY2NlcHRDb21tYW5kUGVlcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXN0YXRpYyBuYXRpdmUgbG9uZyBjYXBnZXRQZXJtaXR0ZWQoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXN0YXRpYyBuYXRpdmUgdm9pZCBjbG9zZURlc2NyaXB0b3IoCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yKQotCi1zdGF0aWMgdm9pZCBjbG9zZVNlcnZlclNvY2tldCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXN0YXRpYyBuYXRpdmUgamF2YS5pby5GaWxlRGVzY3JpcHRvciBjcmVhdGVGaWxlRGVzY3JpcHRvcigKLWludCkKLQotc3RhdGljIHZvaWQgZ2MoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1zdGF0aWMgbmF0aXZlIGludCBnZXRwZ2lkKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9aeWdvdGVJbml0JE1ldGhvZEFuZEFyZ3NDYWxsZXI7ICkKLXByaXZhdGUgc3RhdGljIHZvaWQgaGFuZGxlU3lzdGVtU2VydmVyUHJvY2VzcygKLWNvbS5hbmRyb2lkLmludGVybmFsLm9zLlp5Z290ZUNvbm5lY3Rpb24kQXJndW1lbnRzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9aeWdvdGVJbml0JE1ldGhvZEFuZEFyZ3NDYWxsZXI7ICkKLXN0YXRpYyB2b2lkIGludm9rZVN0YXRpY01haW4oCi1qYXZhLmxhbmcuQ2xhc3NMb2FkZXIKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oCi1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgcHJlbG9hZENsYXNzZXMoKQotCi1wcml2YXRlIHN0YXRpYyB2b2lkIHByZWxvYWRSZXNvdXJjZXMoKQotCi1wcml2YXRlIHN0YXRpYyB2b2lkIHJlZ2lzdGVyWnlnb3RlU29ja2V0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotc3RhdGljIG5hdGl2ZSB2b2lkIHJlb3BlblN0ZGlvKAotamF2YS5pby5GaWxlRGVzY3JpcHRvcgotamF2YS5pby5GaWxlRGVzY3JpcHRvcgotamF2YS5pby5GaWxlRGVzY3JpcHRvcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvWnlnb3RlSW5pdCRNZXRob2RBbmRBcmdzQ2FsbGVyOyApCi1wcml2YXRlIHN0YXRpYyB2b2lkIHJ1bkZvcmtNb2RlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvWnlnb3RlSW5pdCRNZXRob2RBbmRBcmdzQ2FsbGVyOyApCi1wcml2YXRlIHN0YXRpYyB2b2lkIHJ1blNlbGVjdExvb3BNb2RlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotc3RhdGljIG5hdGl2ZSBpbnQgc2VsZWN0UmVhZGFibGUoCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXN0YXRpYyBuYXRpdmUgdm9pZCBzZXRDYXBhYmlsaXRpZXMoCi1sb25nCi1sb25nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1zdGF0aWMgbmF0aXZlIHZvaWQgc2V0Q2xvc2VPbkV4ZWMoCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1ib29sZWFuKQotCi1wcml2YXRlIHN0YXRpYyB2b2lkIHNldEVmZmVjdGl2ZUdyb3VwKAotaW50KQotCi1wcml2YXRlIHN0YXRpYyB2b2lkIHNldEVmZmVjdGl2ZVVzZXIoCi1pbnQpCi0KLXN0YXRpYyBuYXRpdmUgaW50IHNldHBnaWQoCi1pbnQKLWludCkKLQotc3RhdGljIG5hdGl2ZSBpbnQgc2V0cmVnaWQoCi1pbnQKLWludCkKLQotc3RhdGljIG5hdGl2ZSBpbnQgc2V0cmV1aWQoCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvWnlnb3RlSW5pdCRNZXRob2RBbmRBcmdzQ2FsbGVyO0xqYXZhL2xhbmcvUnVudGltZUV4Y2VwdGlvbjsgKQotcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzdGFydFN5c3RlbVNlcnZlcigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi0gY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuWnlnb3RlU2VjdXJpdHlFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnBvbGljeS5JUG9saWN5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXIgbWFrZU5ld0xheW91dEluZmxhdGVyKAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLnZpZXcuV2luZG93IG1ha2VOZXdXaW5kb3coCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyUG9saWN5IG1ha2VOZXdXaW5kb3dNYW5hZ2VyKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5wb2xpY3kuUG9saWN5TWFuYWdlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQT0xJQ1lfSU1QTF9DTEFTU19OQU1FCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnBvbGljeS5JUG9saWN5IHNQb2xpY3kKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlciBtYWtlTmV3TGF5b3V0SW5mbGF0ZXIoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93IG1ha2VOZXdXaW5kb3coCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlclBvbGljeSBtYWtlTmV3V2luZG93TWFuYWdlcigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMY29tL2FuZHJvaWQvaW50ZXJuYWwvcHJlZmVyZW5jZS9ZZXNOb1ByZWZlcmVuY2UkU2F2ZWRTdGF0ZTs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvcHJlZmVyZW5jZS9ZZXNOb1ByZWZlcmVuY2UkU2F2ZWRTdGF0ZTsgKQotZmluYWwgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwucHJlZmVyZW5jZS5ZZXNOb1ByZWZlcmVuY2UkU2F2ZWRTdGF0ZSQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGNvbS5hbmRyb2lkLmludGVybmFsLnByZWZlcmVuY2UuWWVzTm9QcmVmZXJlbmNlJFNhdmVkU3RhdGUgY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC5wcmVmZXJlbmNlLlllc05vUHJlZmVyZW5jZSRTYXZlZFN0YXRlW10gbmV3QXJyYXkoCi1pbnQpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0W10gbmV3QXJyYXkoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1TYXZlZFN0YXRlICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC9wcmVmZXJlbmNlL1llc05vUHJlZmVyZW5jZTsgKQotIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnByZWZlcmVuY2UuWWVzTm9QcmVmZXJlbmNlJFNhdmVkU3RhdGUgZXh0ZW5kcyBhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZSRCYXNlU2F2ZWRTdGF0ZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMY29tL2FuZHJvaWQvaW50ZXJuYWwvcHJlZmVyZW5jZS9ZZXNOb1ByZWZlcmVuY2UkU2F2ZWRTdGF0ZTs+OyApCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yIENSRUFUT1IKLQotIGJvb2xlYW4gd2FzUG9zaXRpdmVSZXN1bHQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLlBhcmNlbGFibGUpCi0KLXB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3ByZWZlcmVuY2UvWWVzTm9QcmVmZXJlbmNlJFNhdmVkU3RhdGU7ICkKLXB1YmxpYyBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5wcmVmZXJlbmNlLlllc05vUHJlZmVyZW5jZSBleHRlbmRzIGFuZHJvaWQucHJlZmVyZW5jZS5EaWFsb2dQcmVmZXJlbmNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYm9vbGVhbiBtV2FzUG9zaXRpdmVSZXN1bHQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ci1pbnQpCi0KLXB1YmxpYyBib29sZWFuIGdldFZhbHVlKCkKLQotcHJvdGVjdGVkIHZvaWQgb25EaWFsb2dDbG9zZWQoCi1ib29sZWFuKQotCi1wcm90ZWN0ZWQgamF2YS5sYW5nLk9iamVjdCBvbkdldERlZmF1bHRWYWx1ZSgKLWFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheQotaW50KQotCi1wcm90ZWN0ZWQgdm9pZCBvblJlc3RvcmVJbnN0YW5jZVN0YXRlKAotYW5kcm9pZC5vcy5QYXJjZWxhYmxlKQotCi1wcm90ZWN0ZWQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlIG9uU2F2ZUluc3RhbmNlU3RhdGUoKQotCi1wcm90ZWN0ZWQgdm9pZCBvblNldEluaXRpYWxWYWx1ZSgKLWJvb2xlYW4KLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2lkIHNldFZhbHVlKAotYm9vbGVhbikKLQotcHVibGljIGJvb2xlYW4gc2hvdWxkRGlzYWJsZURlcGVuZGVudHMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjUgbmFtZSA9RmF2b3JpdGVzICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC9wcm92aWRlci9TZXR0aW5nczsgKQotcHVibGljIGZpbmFsIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnByb3ZpZGVyLlNldHRpbmdzJEZhdm9yaXRlcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDRUxMWAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ0VMTFkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENPTlRBSU5FUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05UQUlORVJfREVTS1RPUAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBDT05URU5UX1VSSQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBDT05URU5UX1VSSV9OT19OT1RJRklDQVRJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIElDT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIElDT05fUEFDS0FHRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSUNPTl9SRVNPVVJDRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSUNPTl9UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElDT05fVFlQRV9CSVRNQVAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUNPTl9UWVBFX1JFU09VUkNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBJRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSU5URU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBJU19TSE9SVENVVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSVRFTV9UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElURU1fVFlQRV9BUFBMSUNBVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJVEVNX1RZUEVfU0hPUlRDVVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSVRFTV9UWVBFX1VTRVJfRk9MREVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElURU1fVFlQRV9XSURHRVRfQ0xPQ0sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSVRFTV9UWVBFX1dJREdFVF9QSE9UT19GUkFNRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJVEVNX1RZUEVfV0lER0VUX1NFQVJDSAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0NSRUVOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTUEFOWAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU1BBTlkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRJVExFCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGFuZHJvaWQubmV0LlVyaSBnZXRDb250ZW50VXJpKAotbG9uZwotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC9wcm92aWRlci9TZXR0aW5ncyRGYXZvcml0ZXM7ICkKLXB1YmxpYyBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC5wcm92aWRlci5TZXR0aW5ncyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5BVFBhcnNlRXggZXh0ZW5kcyBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkFUUmVzcG9uc2VQYXJzZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBsaW5lCi0KLXByaXZhdGUgaW50IG5leHQKLQotcHJpdmF0ZSBpbnQgdG9rRW5kCi0KLXByaXZhdGUgaW50IHRva1N0YXJ0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSB2b2lkIG5leHRUb2soKQotCi1wcml2YXRlIHZvaWQgc2tpcFByZWZpeCgpCi0KLXByaXZhdGUgY2hhciBza2lwV2hpdGVTcGFjZSgKLWNoYXIpCi0KLXB1YmxpYyBib29sZWFuIGhhc01vcmUoKQotCi1wdWJsaWMgYm9vbGVhbiBuZXh0Qm9vbGVhbigpCi0KLXB1YmxpYyBpbnQgbmV4dEludCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIG5leHRTdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQ2FsbDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvRW51bTxMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0NhbGwkU3RhdGU7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNjQwOSBuYW1lID1TdGF0ZSApCi1wdWJsaWMgZmluYWwgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNhbGwkU3RhdGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ2FsbCRTdGF0ZVtdICRWQUxVRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ2FsbCRTdGF0ZSBBQ1RJVkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ2FsbCRTdGF0ZSBBTEVSVElORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5DYWxsJFN0YXRlIERJQUxJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ2FsbCRTdGF0ZSBESVNDT05ORUNURUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ2FsbCRTdGF0ZSBIT0xESU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNhbGwkU3RhdGUgSURMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5DYWxsJFN0YXRlIElOQ09NSU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNhbGwkU3RhdGUgV0FJVElORwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVYgKQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ2FsbCRTdGF0ZSB2YWx1ZU9mKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ2FsbCRTdGF0ZVtdIHZhbHVlcygpCi0KLXB1YmxpYyBib29sZWFuIGlzQWxpdmUoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0RpYWxpbmcoKQotCi1wdWJsaWMgYm9vbGVhbiBpc1JpbmdpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9DYWxsJFN0YXRlOyApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNhbGwgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvTGlzdDxMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0Nvbm5lY3Rpb247PjsgKQotcHVibGljIGFic3RyYWN0IGphdmEudXRpbC5MaXN0IGdldENvbm5lY3Rpb25zKCkKLQotcHVibGljIGxvbmcgZ2V0RWFybGllc3RDb25uZWN0VGltZSgpCi0KLXB1YmxpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ29ubmVjdGlvbiBnZXRFYXJsaWVzdENvbm5lY3Rpb24oKQotCi1wdWJsaWMgbG9uZyBnZXRFYXJsaWVzdENyZWF0ZVRpbWUoKQotCi1wdWJsaWMgYWJzdHJhY3QgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lIGdldFBob25lKCkKLQotcHVibGljIGFic3RyYWN0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5DYWxsJFN0YXRlIGdldFN0YXRlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0NhbGxTdGF0ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgaGFuZ3VwKCkKLQotcHVibGljIGJvb2xlYW4gaGFzQ29ubmVjdGlvbigKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Db25uZWN0aW9uKQotCi1wdWJsaWMgYm9vbGVhbiBoYXNDb25uZWN0aW9ucygpCi0KLXB1YmxpYyBib29sZWFuIGlzRGlhbGluZ09yQWxlcnRpbmcoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0lkbGUoKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc011bHRpcGFydHkoKQotCi1wdWJsaWMgYm9vbGVhbiBpc1JpbmdpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5DYWxsU3RhdGVFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ2FsbGVySW5mbyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBSSVZBVEVfTlVNQkVSCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEFHCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBVTktOT1dOX05VTUJFUgotCi1wcml2YXRlIHN0YXRpYyBib29sZWFuIHNTa2lwVm1DaGVjawotCi1wdWJsaWMgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSBjYWNoZWRQaG90bwotCi1wdWJsaWMgYW5kcm9pZC5uZXQuVXJpIGNvbnRhY3RSZWZVcmkKLQotcHVibGljIGFuZHJvaWQubmV0LlVyaSBjb250YWN0UmluZ3RvbmVVcmkKLQotcHVibGljIGJvb2xlYW4gaXNDYWNoZWRQaG90b0N1cnJlbnQKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgbmFtZQotCi1wdWJsaWMgYm9vbGVhbiBuZWVkVXBkYXRlCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIG51bWJlckxhYmVsCi0KLXB1YmxpYyBpbnQgbnVtYmVyVHlwZQotCi1wdWJsaWMgbG9uZyBwZXJzb25faWQKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgcGhvbmVMYWJlbAotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBwaG9uZU51bWJlcgotCi1wdWJsaWMgaW50IHBob3RvUmVzb3VyY2UKLQotcHVibGljIGJvb2xlYW4gc2hvdWxkU2VuZFRvVm9pY2VtYWlsCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Q2FsbGVySWQoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ2FsbGVySW5mbyBnZXRDYWxsZXJJbmZvKAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQubmV0LlVyaSkKLQotcHVibGljIHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ2FsbGVySW5mbyBnZXRDYWxsZXJJbmZvKAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQubmV0LlVyaQotYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IpCi0KLXB1YmxpYyBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNhbGxlckluZm8gZ2V0Q2FsbGVySW5mbygKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIG5vcm1hbGl6ZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9DYWxsZXJJbmZvQXN5bmNRdWVyeTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID00MTA0IG5hbWUgPW51bGwgKQotIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5DYWxsZXJJbmZvQXN5bmNRdWVyeSQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID00IG5hbWUgPUNhbGxlckluZm9Xb3JrZXJIYW5kbGVyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQ2FsbGVySW5mb0FzeW5jUXVlcnkkQ2FsbGVySW5mb0FzeW5jUXVlcnlIYW5kbGVyOyApCi1wdWJsaWMgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNhbGxlckluZm9Bc3luY1F1ZXJ5JENhbGxlckluZm9Bc3luY1F1ZXJ5SGFuZGxlciRDYWxsZXJJbmZvV29ya2VySGFuZGxlciBleHRlbmRzIGFuZHJvaWQuY29udGVudC5Bc3luY1F1ZXJ5SGFuZGxlciRXb3JrZXJIYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5DYWxsZXJJbmZvQXN5bmNRdWVyeSRDYWxsZXJJbmZvQXN5bmNRdWVyeUhhbmRsZXIgdGhpcyQxCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNhbGxlckluZm9Bc3luY1F1ZXJ5JENhbGxlckluZm9Bc3luY1F1ZXJ5SGFuZGxlcgotYW5kcm9pZC5vcy5Mb29wZXIpCi0KLXB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPUNhbGxlckluZm9Bc3luY1F1ZXJ5SGFuZGxlciApCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQ2FsbGVySW5mb0FzeW5jUXVlcnkkQ2FsbGVySW5mb0FzeW5jUXVlcnlIYW5kbGVyJENhbGxlckluZm9Xb3JrZXJIYW5kbGVyOyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0NhbGxlckluZm9Bc3luY1F1ZXJ5OyApCi0gY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNhbGxlckluZm9Bc3luY1F1ZXJ5JENhbGxlckluZm9Bc3luY1F1ZXJ5SGFuZGxlciBleHRlbmRzIGFuZHJvaWQuY29udGVudC5Bc3luY1F1ZXJ5SGFuZGxlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5DYWxsZXJJbmZvIG1DYWxsZXJJbmZvCi0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgbVF1ZXJ5Q29udGV4dAotCi1wcml2YXRlIGFuZHJvaWQubmV0LlVyaSBtUXVlcnlVcmkKLQotZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNhbGxlckluZm9Bc3luY1F1ZXJ5IHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ2FsbGVySW5mb0FzeW5jUXVlcnkKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi0gdm9pZCA8aW5pdD4oCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ2FsbGVySW5mb0FzeW5jUXVlcnkKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ2FsbGVySW5mb0FzeW5jUXVlcnkkMSkKLQotc3RhdGljIGFuZHJvaWQuY29udGVudC5Db250ZXh0IGFjY2VzcyQzMDIoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ2FsbGVySW5mb0FzeW5jUXVlcnkkQ2FsbGVySW5mb0FzeW5jUXVlcnlIYW5kbGVyCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotc3RhdGljIGFuZHJvaWQubmV0LlVyaSBhY2Nlc3MkNDAyKAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNhbGxlckluZm9Bc3luY1F1ZXJ5JENhbGxlckluZm9Bc3luY1F1ZXJ5SGFuZGxlcgotYW5kcm9pZC5uZXQuVXJpKQotCi1zdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNhbGxlckluZm8gYWNjZXNzJDUwMigKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5DYWxsZXJJbmZvQXN5bmNRdWVyeSRDYWxsZXJJbmZvQXN5bmNRdWVyeUhhbmRsZXIKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5DYWxsZXJJbmZvKQotCi1wcm90ZWN0ZWQgYW5kcm9pZC5vcy5IYW5kbGVyIGNyZWF0ZUhhbmRsZXIoCi1hbmRyb2lkLm9zLkxvb3BlcikKLQotcHJvdGVjdGVkIHZvaWQgb25RdWVyeUNvbXBsZXRlKAotaW50Ci1qYXZhLmxhbmcuT2JqZWN0Ci1hbmRyb2lkLmRhdGFiYXNlLkN1cnNvcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI2IG5hbWUgPUNvb2tpZVdyYXBwZXIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9DYWxsZXJJbmZvQXN5bmNRdWVyeTsgKQotZmluYWwgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNhbGxlckluZm9Bc3luY1F1ZXJ5JENvb2tpZVdyYXBwZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGNvb2tpZQotCi1wdWJsaWMgaW50IGV2ZW50Ci0KLXB1YmxpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ2FsbGVySW5mb0FzeW5jUXVlcnkkT25RdWVyeUNvbXBsZXRlTGlzdGVuZXIgbGlzdGVuZXIKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgbnVtYmVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLSB2b2lkIDxpbml0PigKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5DYWxsZXJJbmZvQXN5bmNRdWVyeSQxKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1PblF1ZXJ5Q29tcGxldGVMaXN0ZW5lciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0NhbGxlckluZm9Bc3luY1F1ZXJ5OyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5DYWxsZXJJbmZvQXN5bmNRdWVyeSRPblF1ZXJ5Q29tcGxldGVMaXN0ZW5lciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvblF1ZXJ5Q29tcGxldGUoCi1pbnQKLWphdmEubGFuZy5PYmplY3QKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5DYWxsZXJJbmZvKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQ2FsbGVySW5mb0FzeW5jUXVlcnk7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1RdWVyeVBvb2xFeGNlcHRpb24gKQotcHVibGljIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5DYWxsZXJJbmZvQXN5bmNRdWVyeSRRdWVyeVBvb2xFeGNlcHRpb24gZXh0ZW5kcyBhbmRyb2lkLmRhdGFiYXNlLlNRTEV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0NhbGxlckluZm9Bc3luY1F1ZXJ5JDE7TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9DYWxsZXJJbmZvQXN5bmNRdWVyeSRDYWxsZXJJbmZvQXN5bmNRdWVyeUhhbmRsZXI7TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9DYWxsZXJJbmZvQXN5bmNRdWVyeSRRdWVyeVBvb2xFeGNlcHRpb247TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9DYWxsZXJJbmZvQXN5bmNRdWVyeSRDb29raWVXcmFwcGVyO0xjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQ2FsbGVySW5mb0FzeW5jUXVlcnkkT25RdWVyeUNvbXBsZXRlTGlzdGVuZXI7ICkKLXB1YmxpYyBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ2FsbGVySW5mb0FzeW5jUXVlcnkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9BRERfTElTVEVORVIKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0VNRVJHRU5DWV9OVU1CRVIKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0VORF9PRl9RVUVVRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfTkVXX1FVRVJZCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9WT0lDRU1BSUxfTlVNQkVSCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTE9HX1RBRwotCi1wcml2YXRlIHN0YXRpYyBib29sZWFuIHNTa2lwVm1DaGVjawotCi1wcml2YXRlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5DYWxsZXJJbmZvQXN5bmNRdWVyeSRDYWxsZXJJbmZvQXN5bmNRdWVyeUhhbmRsZXIgbUhhbmRsZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMDAwKAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNhbGxlckluZm9Bc3luY1F1ZXJ5KQotCi1wcml2YXRlIHZvaWQgYWxsb2NhdGUoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC5uZXQuVXJpKQotCi1wcml2YXRlIHN0YXRpYyB2b2lkIGxvZygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgdm9pZCByZWxlYXNlKCkKLQotcHVibGljIHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ2FsbGVySW5mb0FzeW5jUXVlcnkgc3RhcnRRdWVyeSgKLWludAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQubmV0LlVyaQotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNhbGxlckluZm9Bc3luY1F1ZXJ5JE9uUXVlcnlDb21wbGV0ZUxpc3RlbmVyCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5DYWxsZXJJbmZvQXN5bmNRdWVyeSBzdGFydFF1ZXJ5KAotaW50Ci1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotamF2YS5sYW5nLlN0cmluZwotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNhbGxlckluZm9Bc3luY1F1ZXJ5JE9uUXVlcnlDb21wbGV0ZUxpc3RlbmVyCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgdm9pZCBhZGRRdWVyeUxpc3RlbmVyKAotaW50Ci1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ2FsbGVySW5mb0FzeW5jUXVlcnkkT25RdWVyeUNvbXBsZXRlTGlzdGVuZXIKLWphdmEubGFuZy5PYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Db25uZWN0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9FbnVtPExjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQ29ubmVjdGlvbiREaXNjb25uZWN0Q2F1c2U7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNjQwOSBuYW1lID1EaXNjb25uZWN0Q2F1c2UgKQotcHVibGljIGZpbmFsIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Db25uZWN0aW9uJERpc2Nvbm5lY3RDYXVzZSBleHRlbmRzIGphdmEubGFuZy5FbnVtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Db25uZWN0aW9uJERpc2Nvbm5lY3RDYXVzZVtdICRWQUxVRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ29ubmVjdGlvbiREaXNjb25uZWN0Q2F1c2UgQlVTWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Db25uZWN0aW9uJERpc2Nvbm5lY3RDYXVzZSBDQUxMX0JBUlJFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Db25uZWN0aW9uJERpc2Nvbm5lY3RDYXVzZSBDT05HRVNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNvbm5lY3Rpb24kRGlzY29ubmVjdENhdXNlIEZETl9CTE9DS0VECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNvbm5lY3Rpb24kRGlzY29ubmVjdENhdXNlIElOQ09NSU5HX01JU1NFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Db25uZWN0aW9uJERpc2Nvbm5lY3RDYXVzZSBJTkNPTUlOR19SRUpFQ1RFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Db25uZWN0aW9uJERpc2Nvbm5lY3RDYXVzZSBJTlZBTElEX05VTUJFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Db25uZWN0aW9uJERpc2Nvbm5lY3RDYXVzZSBMSU1JVF9FWENFRURFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Db25uZWN0aW9uJERpc2Nvbm5lY3RDYXVzZSBMT0NBTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Db25uZWN0aW9uJERpc2Nvbm5lY3RDYXVzZSBMT1NUX1NJR05BTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Db25uZWN0aW9uJERpc2Nvbm5lY3RDYXVzZSBNTUkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ29ubmVjdGlvbiREaXNjb25uZWN0Q2F1c2UgTk9STUFMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNvbm5lY3Rpb24kRGlzY29ubmVjdENhdXNlIE5PVF9ESVNDT05ORUNURUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ29ubmVjdGlvbiREaXNjb25uZWN0Q2F1c2UgT1VUX09GX1NFUlZJQ0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ29ubmVjdGlvbiREaXNjb25uZWN0Q2F1c2UgUE9XRVJfT0ZGCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNvbm5lY3Rpb24kRGlzY29ubmVjdENhdXNlIFNJTV9FUlJPUgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVYgKQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ29ubmVjdGlvbiREaXNjb25uZWN0Q2F1c2UgdmFsdWVPZigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNvbm5lY3Rpb24kRGlzY29ubmVjdENhdXNlW10gdmFsdWVzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0Nvbm5lY3Rpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTY0MDkgbmFtZSA9UG9zdERpYWxTdGF0ZSApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9FbnVtPExjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQ29ubmVjdGlvbiRQb3N0RGlhbFN0YXRlOz47ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ29ubmVjdGlvbiRQb3N0RGlhbFN0YXRlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNvbm5lY3Rpb24kUG9zdERpYWxTdGF0ZVtdICRWQUxVRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ29ubmVjdGlvbiRQb3N0RGlhbFN0YXRlIENBTkNFTExFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Db25uZWN0aW9uJFBvc3REaWFsU3RhdGUgQ09NUExFVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ29ubmVjdGlvbiRQb3N0RGlhbFN0YXRlIE5PVF9TVEFSVEVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNvbm5lY3Rpb24kUG9zdERpYWxTdGF0ZSBTVEFSVEVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNvbm5lY3Rpb24kUG9zdERpYWxTdGF0ZSBXQUlUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNvbm5lY3Rpb24kUG9zdERpYWxTdGF0ZSBXSUxECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpViApCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Db25uZWN0aW9uJFBvc3REaWFsU3RhdGUgdmFsdWVPZigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNvbm5lY3Rpb24kUG9zdERpYWxTdGF0ZVtdIHZhbHVlcygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0Nvbm5lY3Rpb24kUG9zdERpYWxTdGF0ZTtMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0Nvbm5lY3Rpb24kRGlzY29ubmVjdENhdXNlOyApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNvbm5lY3Rpb24gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBqYXZhLmxhbmcuT2JqZWN0IHVzZXJEYXRhCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgY2FuY2VsUG9zdERpYWwoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRBZGRyZXNzKCkKLQotcHVibGljIGFic3RyYWN0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5DYWxsIGdldENhbGwoKQotCi1wdWJsaWMgYWJzdHJhY3QgbG9uZyBnZXRDb25uZWN0VGltZSgpCi0KLXB1YmxpYyBhYnN0cmFjdCBsb25nIGdldENyZWF0ZVRpbWUoKQotCi1wdWJsaWMgYWJzdHJhY3QgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNvbm5lY3Rpb24kRGlzY29ubmVjdENhdXNlIGdldERpc2Nvbm5lY3RDYXVzZSgpCi0KLXB1YmxpYyBhYnN0cmFjdCBsb25nIGdldERpc2Nvbm5lY3RUaW1lKCkKLQotcHVibGljIGFic3RyYWN0IGxvbmcgZ2V0RHVyYXRpb25NaWxsaXMoKQotCi1wdWJsaWMgYWJzdHJhY3QgbG9uZyBnZXRIb2xkRHVyYXRpb25NaWxsaXMoKQotCi1wdWJsaWMgYWJzdHJhY3QgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNvbm5lY3Rpb24kUG9zdERpYWxTdGF0ZSBnZXRQb3N0RGlhbFN0YXRlKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0UmVtYWluaW5nUG9zdERpYWxTdHJpbmcoKQotCi1wdWJsaWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNhbGwkU3RhdGUgZ2V0U3RhdGUoKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRVc2VyRGF0YSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9DYWxsU3RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGhhbmd1cCgpCi0KLXB1YmxpYyBib29sZWFuIGlzQWxpdmUoKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0luY29taW5nKCkKLQotcHVibGljIGJvb2xlYW4gaXNSaW5naW5nKCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgcHJvY2VlZEFmdGVyV2FpdENoYXIoKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBwcm9jZWVkQWZ0ZXJXaWxkQ2hhcigKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9DYWxsU3RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNlcGFyYXRlKCkKLQotcHVibGljIHZvaWQgc2V0VXNlckRhdGEoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvRGVmYXVsdFBob25lTm90aWZpZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9NDEwNCBuYW1lID1udWxsICkKLSBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuRGVmYXVsdFBob25lTm90aWZpZXIkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIGludFtdICRTd2l0Y2hNYXAkY29tJGFuZHJvaWQkaW50ZXJuYWwkdGVsZXBob255JFBob25lJERhdGFBY3Rpdml0eVN0YXRlCi0KLXN0YXRpYyBmaW5hbCBpbnRbXSAkU3dpdGNoTWFwJGNvbSRhbmRyb2lkJGludGVybmFsJHRlbGVwaG9ueSRQaG9uZSREYXRhU3RhdGUKLQotc3RhdGljIGZpbmFsIGludFtdICRTd2l0Y2hNYXAkY29tJGFuZHJvaWQkaW50ZXJuYWwkdGVsZXBob255JFBob25lJFN0YXRlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmVOb3RpZmllciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBub3RpZnlDYWxsRm9yd2FyZGluZ0NoYW5nZWQoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmUpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG5vdGlmeUNlbGxMb2NhdGlvbigKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgbm90aWZ5RGF0YUFjdGl2aXR5KAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbigKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZQotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmUKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG5vdGlmeU1lc3NhZ2VXYWl0aW5nQ2hhbmdlZCgKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgbm90aWZ5UGhvbmVTdGF0ZSgKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgbm90aWZ5U2VydmljZVN0YXRlKAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBub3RpZnlTaWduYWxTdHJlbmd0aCgKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvRGVmYXVsdFBob25lTm90aWZpZXIkMTsgKQotcHVibGljIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5EZWZhdWx0UGhvbmVOb3RpZmllciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmVOb3RpZmllcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRwotCi1zdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMT0dfVEFHCi0KLXByaXZhdGUgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LklUZWxlcGhvbnlSZWdpc3RyeSBtUmVnaXN0cnkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGludCBjb252ZXJ0Q2FsbFN0YXRlKAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lJFN0YXRlKQotCi1wdWJsaWMgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZSRTdGF0ZSBjb252ZXJ0Q2FsbFN0YXRlKAotaW50KQotCi1wdWJsaWMgc3RhdGljIGludCBjb252ZXJ0RGF0YUFjdGl2aXR5U3RhdGUoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmUkRGF0YUFjdGl2aXR5U3RhdGUpCi0KLXB1YmxpYyBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lJERhdGFBY3Rpdml0eVN0YXRlIGNvbnZlcnREYXRhQWN0aXZpdHlTdGF0ZSgKLWludCkKLQotcHVibGljIHN0YXRpYyBpbnQgY29udmVydERhdGFTdGF0ZSgKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZSREYXRhU3RhdGUpCi0KLXB1YmxpYyBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lJERhdGFTdGF0ZSBjb252ZXJ0RGF0YVN0YXRlKAotaW50KQotCi1wcml2YXRlIHZvaWQgbG9nKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgbm90aWZ5Q2FsbEZvcndhcmRpbmdDaGFuZ2VkKAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lKQotCi1wdWJsaWMgdm9pZCBub3RpZnlDZWxsTG9jYXRpb24oCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmUpCi0KLXB1YmxpYyB2b2lkIG5vdGlmeURhdGFBY3Rpdml0eSgKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZSkKLQotcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb24oCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmUKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBub3RpZnlNZXNzYWdlV2FpdGluZ0NoYW5nZWQoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmUpCi0KLXB1YmxpYyB2b2lkIG5vdGlmeVBob25lU3RhdGUoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmUpCi0KLXB1YmxpYyB2b2lkIG5vdGlmeVNlcnZpY2VTdGF0ZSgKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZSkKLQotcHVibGljIHZvaWQgbm90aWZ5U2lnbmFsU3RyZW5ndGgoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JUGhvbmVTdGF0ZUxpc3RlbmVyJFN0dWI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9UHJveHkgKQotIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JUGhvbmVTdGF0ZUxpc3RlbmVyJFN0dWIkUHJveHkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LklQaG9uZVN0YXRlTGlzdGVuZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLm9zLklCaW5kZXIgbVJlbW90ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuSUJpbmRlcikKLQotcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEludGVyZmFjZURlc2NyaXB0b3IoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgb25DYWxsRm9yd2FyZGluZ0luZGljYXRvckNoYW5nZWQoCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgb25DYWxsU3RhdGVDaGFuZ2VkKAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgb25DZWxsTG9jYXRpb25DaGFuZ2VkKAotYW5kcm9pZC5vcy5CdW5kbGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBvbkRhdGFBY3Rpdml0eSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIG9uRGF0YUNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBvbk1lc3NhZ2VXYWl0aW5nSW5kaWNhdG9yQ2hhbmdlZCgKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBvblNlcnZpY2VTdGF0ZUNoYW5nZWQoCi1hbmRyb2lkLnRlbGVwaG9ueS5TZXJ2aWNlU3RhdGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBvblNpZ25hbFN0cmVuZ3RoQ2hhbmdlZCgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSVBob25lU3ViSW5mbyRTdHViOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JUGhvbmVTdWJJbmZvIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuSUludGVyZmFjZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXREZXZpY2VJZCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXREZXZpY2VTdm4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0TGluZTFBbHBoYVRhZygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRMaW5lMU51bWJlcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRTaW1TZXJpYWxOdW1iZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0U3Vic2NyaWJlcklkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldFZvaWNlTWFpbEFscGhhVGFnKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldFZvaWNlTWFpbE51bWJlcigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JUGhvbmVTdWJJbmZvJFN0dWI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9UHJveHkgKQotIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JUGhvbmVTdWJJbmZvJFN0dWIkUHJveHkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LklQaG9uZVN1YkluZm8KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLm9zLklCaW5kZXIgbVJlbW90ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuSUJpbmRlcikKLQotcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXREZXZpY2VJZCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXREZXZpY2VTdm4oKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldExpbmUxQWxwaGFUYWcoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TGluZTFOdW1iZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U2ltU2VyaWFsTnVtYmVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN1YnNjcmliZXJJZCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRWb2ljZU1haWxBbHBoYVRhZygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRWb2ljZU1haWxOdW1iZXIoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSVBob25lU3ViSW5mbzsgKQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0lQaG9uZVN1YkluZm8kU3R1YiRQcm94eTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMDMzIG5hbWUgPVN0dWIgKQotcHVibGljIGFic3RyYWN0IGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JUGhvbmVTdWJJbmZvJFN0dWIgZXh0ZW5kcyBhbmRyb2lkLm9zLkJpbmRlciBpbXBsZW1lbnRzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JUGhvbmVTdWJJbmZvCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVTQ1JJUFRPUgotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2dldERldmljZUlkCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZ2V0RGV2aWNlU3ZuCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZ2V0TGluZTFBbHBoYVRhZwotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2dldExpbmUxTnVtYmVyCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZ2V0U2ltU2VyaWFsTnVtYmVyCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZ2V0U3Vic2NyaWJlcklkCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZ2V0Vm9pY2VNYWlsQWxwaGFUYWcKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9nZXRWb2ljZU1haWxOdW1iZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JUGhvbmVTdWJJbmZvIGFzSW50ZXJmYWNlKAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIG9uVHJhbnNhY3QoCi1pbnQKLWFuZHJvaWQub3MuUGFyY2VsCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JVGVsZXBob255JFN0dWI7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LklUZWxlcGhvbnkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5JSW50ZXJmYWNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGNhbGwoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgY2FuY2VsTWlzc2VkQ2FsbHNOb3RpZmljYXRpb24oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgZGlhbCgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGRpc2FibGVBcG5UeXBlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGRpc2FibGVEYXRhQ29ubmVjdGl2aXR5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGRpc2FibGVMb2NhdGlvblVwZGF0ZXMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCBlbmFibGVBcG5UeXBlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGVuYWJsZURhdGFDb25uZWN0aXZpdHkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgZW5hYmxlTG9jYXRpb25VcGRhdGVzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGVuZENhbGwoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCBnZXRDYWxsU3RhdGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGFuZHJvaWQub3MuQnVuZGxlIGdldENlbGxMb2NhdGlvbigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldERhdGFBY3Rpdml0eSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldERhdGFTdGF0ZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBoYW5kbGVQaW5NbWkoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNEYXRhQ29ubmVjdGl2aXR5UG9zc2libGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNJZGxlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzT2ZmaG9vaygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1JhZGlvT24oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNSaW5naW5nKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzU2ltUGluRW5hYmxlZCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzZXRSYWRpbygKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzdXBwbHlQaW4oCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgdG9nZ2xlUmFkaW9Pbk9mZigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB1cGRhdGVTZXJ2aWNlTG9jYXRpb24oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9UHJveHkgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JVGVsZXBob255JFN0dWI7ICkKLSBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSVRlbGVwaG9ueSRTdHViJFByb3h5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JVGVsZXBob255Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5JQmluZGVyIG1SZW1vdGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY2FsbCgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjYW5jZWxNaXNzZWRDYWxsc05vdGlmaWNhdGlvbigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBkaWFsKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgZGlzYWJsZUFwblR5cGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gZGlzYWJsZURhdGFDb25uZWN0aXZpdHkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgZGlzYWJsZUxvY2F0aW9uVXBkYXRlcygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGVuYWJsZUFwblR5cGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gZW5hYmxlRGF0YUNvbm5lY3Rpdml0eSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBlbmFibGVMb2NhdGlvblVwZGF0ZXMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gZW5kQ2FsbCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGdldENhbGxTdGF0ZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYW5kcm9pZC5vcy5CdW5kbGUgZ2V0Q2VsbExvY2F0aW9uKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgZ2V0RGF0YUFjdGl2aXR5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgZ2V0RGF0YVN0YXRlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBoYW5kbGVQaW5NbWkoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gaXNEYXRhQ29ubmVjdGl2aXR5UG9zc2libGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gaXNJZGxlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIGlzT2ZmaG9vaygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBpc1JhZGlvT24oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gaXNSaW5naW5nKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIGlzU2ltUGluRW5hYmxlZCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBzZXRSYWRpbygKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBzdXBwbHlQaW4oCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgdG9nZ2xlUmFkaW9Pbk9mZigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB1cGRhdGVTZXJ2aWNlTG9jYXRpb24oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JVGVsZXBob255JFN0dWIkUHJveHk7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAzMyBuYW1lID1TdHViICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSVRlbGVwaG9ueTsgKQotcHVibGljIGFic3RyYWN0IGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JVGVsZXBob255JFN0dWIgZXh0ZW5kcyBhbmRyb2lkLm9zLkJpbmRlciBpbXBsZW1lbnRzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JVGVsZXBob255Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVTQ1JJUFRPUgotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2NhbGwKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9jYW5jZWxNaXNzZWRDYWxsc05vdGlmaWNhdGlvbgotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2RpYWwKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9kaXNhYmxlQXBuVHlwZQotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2Rpc2FibGVEYXRhQ29ubmVjdGl2aXR5Ci0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZGlzYWJsZUxvY2F0aW9uVXBkYXRlcwotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2VuYWJsZUFwblR5cGUKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9lbmFibGVEYXRhQ29ubmVjdGl2aXR5Ci0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZW5hYmxlTG9jYXRpb25VcGRhdGVzCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZW5kQ2FsbAotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2dldENhbGxTdGF0ZQotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2dldENlbGxMb2NhdGlvbgotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2dldERhdGFBY3Rpdml0eQotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2dldERhdGFTdGF0ZQotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2hhbmRsZVBpbk1taQotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2lzRGF0YUNvbm5lY3Rpdml0eVBvc3NpYmxlCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05faXNJZGxlCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05faXNPZmZob29rCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05faXNSYWRpb09uCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05faXNSaW5naW5nCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05faXNTaW1QaW5FbmFibGVkCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fc2V0UmFkaW8KLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9zdXBwbHlQaW4KLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl90b2dnbGVSYWRpb09uT2ZmCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fdXBkYXRlU2VydmljZUxvY2F0aW9uCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSVRlbGVwaG9ueSBhc0ludGVyZmFjZSgKLWFuZHJvaWQub3MuSUJpbmRlcikKLQotcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBvblRyYW5zYWN0KAotaW50Ci1hbmRyb2lkLm9zLlBhcmNlbAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSVRlbGVwaG9ueVJlZ2lzdHJ5JFN0dWI7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LklUZWxlcGhvbnlSZWdpc3RyeSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLklJbnRlcmZhY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgbGlzdGVuKAotamF2YS5sYW5nLlN0cmluZwotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LklQaG9uZVN0YXRlTGlzdGVuZXIKLWludAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG5vdGlmeUNhbGxGb3J3YXJkaW5nQ2hhbmdlZCgKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBub3RpZnlDYWxsU3RhdGUoCi1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBub3RpZnlDZWxsTG9jYXRpb24oCi1hbmRyb2lkLm9zLkJ1bmRsZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG5vdGlmeURhdGFBY3Rpdml0eSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uKAotaW50Ci1ib29sZWFuCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgbm90aWZ5TWVzc2FnZVdhaXRpbmdDaGFuZ2VkKAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG5vdGlmeVNlcnZpY2VTdGF0ZSgKLWFuZHJvaWQudGVsZXBob255LlNlcnZpY2VTdGF0ZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG5vdGlmeVNpZ25hbFN0cmVuZ3RoKAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSVRlbGVwaG9ueVJlZ2lzdHJ5JFN0dWI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9UHJveHkgKQotIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JVGVsZXBob255UmVnaXN0cnkkU3R1YiRQcm94eSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSVRlbGVwaG9ueVJlZ2lzdHJ5Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5JQmluZGVyIG1SZW1vdGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGxpc3RlbigKLWphdmEubGFuZy5TdHJpbmcKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JUGhvbmVTdGF0ZUxpc3RlbmVyCi1pbnQKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBub3RpZnlDYWxsRm9yd2FyZGluZ0NoYW5nZWQoCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgbm90aWZ5Q2FsbFN0YXRlKAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgbm90aWZ5Q2VsbExvY2F0aW9uKAotYW5kcm9pZC5vcy5CdW5kbGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBub3RpZnlEYXRhQWN0aXZpdHkoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbigKLWludAotYm9vbGVhbgotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIG5vdGlmeU1lc3NhZ2VXYWl0aW5nQ2hhbmdlZCgKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBub3RpZnlTZXJ2aWNlU3RhdGUoCi1hbmRyb2lkLnRlbGVwaG9ueS5TZXJ2aWNlU3RhdGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBub3RpZnlTaWduYWxTdHJlbmd0aCgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSVRlbGVwaG9ueVJlZ2lzdHJ5JFN0dWIkUHJveHk7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAzMyBuYW1lID1TdHViICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSVRlbGVwaG9ueVJlZ2lzdHJ5OyApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LklUZWxlcGhvbnlSZWdpc3RyeSRTdHViIGV4dGVuZHMgYW5kcm9pZC5vcy5CaW5kZXIgaW1wbGVtZW50cyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSVRlbGVwaG9ueVJlZ2lzdHJ5Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVTQ1JJUFRPUgotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2xpc3RlbgotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX25vdGlmeUNhbGxGb3J3YXJkaW5nQ2hhbmdlZAotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX25vdGlmeUNhbGxTdGF0ZQotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX25vdGlmeUNlbGxMb2NhdGlvbgotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX25vdGlmeURhdGFBY3Rpdml0eQotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX25vdGlmeURhdGFDb25uZWN0aW9uCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fbm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9ub3RpZnlNZXNzYWdlV2FpdGluZ0NoYW5nZWQKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9ub3RpZnlTZXJ2aWNlU3RhdGUKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9ub3RpZnlTaWduYWxTdHJlbmd0aAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LklUZWxlcGhvbnlSZWdpc3RyeSBhc0ludGVyZmFjZSgKLWFuZHJvaWQub3MuSUJpbmRlcikKLQotcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBvblRyYW5zYWN0KAotaW50Ci1hbmRyb2lkLm9zLlBhcmNlbAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE2NDA5IG5hbWUgPVN0YXRlICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvTW1pQ29kZTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvRW51bTxMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L01taUNvZGUkU3RhdGU7PjsgKQotcHVibGljIGZpbmFsIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5NbWlDb2RlJFN0YXRlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255Lk1taUNvZGUkU3RhdGVbXSAkVkFMVUVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255Lk1taUNvZGUkU3RhdGUgQ0FOQ0VMTEVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255Lk1taUNvZGUkU3RhdGUgQ09NUExFVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuTW1pQ29kZSRTdGF0ZSBGQUlMRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuTW1pQ29kZSRTdGF0ZSBQRU5ESU5HCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpViApCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5NbWlDb2RlJFN0YXRlIHZhbHVlT2YoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5NbWlDb2RlJFN0YXRlW10gdmFsdWVzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvTW1pQ29kZSRTdGF0ZTsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuTW1pQ29kZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBjYW5jZWwoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBnZXRNZXNzYWdlKCkKLQotcHVibGljIGFic3RyYWN0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5NbWlDb2RlJFN0YXRlIGdldFN0YXRlKCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNDYW5jZWxhYmxlKCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNVc3NkUmVxdWVzdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvRW51bTxMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lJERhdGFBY3Rpdml0eVN0YXRlOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTY0MDkgbmFtZSA9RGF0YUFjdGl2aXR5U3RhdGUgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZTsgKQotcHVibGljIGZpbmFsIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZSREYXRhQWN0aXZpdHlTdGF0ZSBleHRlbmRzIGphdmEubGFuZy5FbnVtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZSREYXRhQWN0aXZpdHlTdGF0ZVtdICRWQUxVRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmUkRGF0YUFjdGl2aXR5U3RhdGUgREFUQUlOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lJERhdGFBY3Rpdml0eVN0YXRlIERBVEFJTkFORE9VVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZSREYXRhQWN0aXZpdHlTdGF0ZSBEQVRBT1VUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lJERhdGFBY3Rpdml0eVN0YXRlIE5PTkUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClWICkKLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lJERhdGFBY3Rpdml0eVN0YXRlIHZhbHVlT2YoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZSREYXRhQWN0aXZpdHlTdGF0ZVtdIHZhbHVlcygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNjQwOSBuYW1lID1EYXRhU3RhdGUgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvRW51bTxMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lJERhdGFTdGF0ZTs+OyApCi1wdWJsaWMgZmluYWwgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lJERhdGFTdGF0ZSBleHRlbmRzIGphdmEubGFuZy5FbnVtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZSREYXRhU3RhdGVbXSAkVkFMVUVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lJERhdGFTdGF0ZSBDT05ORUNURUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmUkRGF0YVN0YXRlIENPTk5FQ1RJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmUkRGF0YVN0YXRlIERJU0NPTk5FQ1RFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZSREYXRhU3RhdGUgU1VTUEVOREVECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpViApCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZSREYXRhU3RhdGUgdmFsdWVPZigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lJERhdGFTdGF0ZVtdIHZhbHVlcygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvRW51bTxMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lJFN0YXRlOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTY0MDkgbmFtZSA9U3RhdGUgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZTsgKQotcHVibGljIGZpbmFsIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZSRTdGF0ZSBleHRlbmRzIGphdmEubGFuZy5FbnVtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZSRTdGF0ZVtdICRWQUxVRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmUkU3RhdGUgSURMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZSRTdGF0ZSBPRkZIT09LCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lJFN0YXRlIFJJTkdJTkcKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClWICkKLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lJFN0YXRlIHZhbHVlT2YoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZSRTdGF0ZVtdIHZhbHVlcygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvRW51bTxMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lJFN1cHBTZXJ2aWNlOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmU7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTY0MDkgbmFtZSA9U3VwcFNlcnZpY2UgKQotcHVibGljIGZpbmFsIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZSRTdXBwU2VydmljZSBleHRlbmRzIGphdmEubGFuZy5FbnVtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZSRTdXBwU2VydmljZVtdICRWQUxVRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmUkU3VwcFNlcnZpY2UgQ09ORkVSRU5DRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZSRTdXBwU2VydmljZSBIQU5HVVAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmUkU3VwcFNlcnZpY2UgUkVKRUNUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lJFN1cHBTZXJ2aWNlIFNFUEFSQVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lJFN1cHBTZXJ2aWNlIFNXSVRDSAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZSRTdXBwU2VydmljZSBUUkFOU0ZFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZSRTdXBwU2VydmljZSBVTktOT1dOCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpViApCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZSRTdXBwU2VydmljZSB2YWx1ZU9mKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmUkU3VwcFNlcnZpY2VbXSB2YWx1ZXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZSRTdXBwU2VydmljZTtMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lJERhdGFBY3Rpdml0eVN0YXRlO0xjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmUkRGF0YVN0YXRlO0xjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmUkU3RhdGU7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUE5fQUxSRUFEWV9BQ1RJVkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVBOX1JFUVVFU1RfRkFJTEVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFQTl9SRVFVRVNUX1NUQVJURUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFQTl9UWVBFX0FMTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQVBOX1RZUEVfREVGQVVMVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQVBOX1RZUEVfTU1TCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFQTl9UWVBFX05PVF9BVkFJTEFCTEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQk1fQVVTMl9CQU5ECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJNX0FVU19CQU5ECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJNX0JPVU5EQVJZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJNX0VVUk9fQkFORAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCTV9KUE5fQkFORAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCTV9VTlNQRUNJRklFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCTV9VU19CQU5ECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBEQVRBX0FQTl9LRVkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERBVEFfQVBOX1RZUEVfS0VZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBEQVRBX0lGQUNFX05BTUVfS0VZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19QSE9ORQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRkFJTFVSRV9SRUFTT05fS0VZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBGRUFUVVJFX0VOQUJMRV9NTVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE5FVFdPUktfVU5BVkFJTEFCTEVfS0VZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5UX0FVVE9fVFlQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBOVF9HU01fVFlQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBOVF9XQ0RNQV9UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQSE9ORV9OQU1FX0tFWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUkVBU09OX0FQTl9DSEFOR0VECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSRUFTT05fQVBOX1NXSVRDSEVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSRUFTT05fREFUQV9ESVNBQkxFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUkVBU09OX0RBVEFfRU5BQkxFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUkVBU09OX0dQUlNfREVUQUNIRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFJFQVNPTl9SQURJT19UVVJORURfT0ZGCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSRUFTT05fUkVTVE9SRV9ERUZBVUxUX0FQTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUkVBU09OX1JPQU1JTkdfT0ZGCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSRUFTT05fUk9BTUlOR19PTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUkVBU09OX1ZPSUNFX0NBTExfRU5ERUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFJFQVNPTl9WT0lDRV9DQUxMX1NUQVJURUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNUQVRFX0NIQU5HRV9SRUFTT05fS0VZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTVEFURV9LRVkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQ2FsbFN0YXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBhY2NlcHRDYWxsKCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gY2FuQ29uZmVyZW5jZSgpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGNhblRyYW5zZmVyKCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgY2xlYXJEaXNjb25uZWN0ZWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQ2FsbFN0YXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBjb25mZXJlbmNlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0NhbGxTdGF0ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Db25uZWN0aW9uIGRpYWwoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGRpc2FibGVBcG5UeXBlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZGlzYWJsZURhdGFDb25uZWN0aXZpdHkoKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBkaXNhYmxlTG9jYXRpb25VcGRhdGVzKCkKLQotcHVibGljIGFic3RyYWN0IGludCBlbmFibGVBcG5UeXBlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZW5hYmxlRGF0YUNvbm5lY3Rpdml0eSgpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGVuYWJsZUxvY2F0aW9uVXBkYXRlcygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9DYWxsU3RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGV4cGxpY2l0Q2FsbFRyYW5zZmVyKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0QWN0aXZlQXBuKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmdbXSBnZXRBY3RpdmVBcG5UeXBlcygpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdldEF2YWlsYWJsZU5ldHdvcmtzKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgYWJzdHJhY3QgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNhbGwgZ2V0QmFja2dyb3VuZENhbGwoKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBnZXRDYWxsRm9yd2FyZGluZ0luZGljYXRvcigpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdldENhbGxGb3J3YXJkaW5nT3B0aW9uKAotaW50Ci1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdldENhbGxXYWl0aW5nKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC50ZWxlcGhvbnkuQ2VsbExvY2F0aW9uIGdldENlbGxMb2NhdGlvbigpCi0KLXB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBnZXRDb250ZXh0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvTGlzdDxMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9QZHBDb25uZWN0aW9uOz47ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnV0aWwuTGlzdCBnZXRDdXJyZW50UGRwTGlzdCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmUkRGF0YUFjdGl2aXR5U3RhdGUgZ2V0RGF0YUFjdGl2aXR5U3RhdGUoKQotCi1wdWJsaWMgYWJzdHJhY3QgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lJERhdGFTdGF0ZSBnZXREYXRhQ29ubmVjdGlvblN0YXRlKCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZ2V0RGF0YVJvYW1pbmdFbmFibGVkKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0RGV2aWNlSWQoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXREZXZpY2VTdm4oKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZ1tdIGdldERuc1NlcnZlcnMoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYWJzdHJhY3QgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNhbGwgZ2V0Rm9yZWdyb3VuZENhbGwoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRHYXRld2F5KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0SW50ZXJmYWNlTmFtZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldElwQWRkcmVzcygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldExpbmUxQWxwaGFUYWcoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRMaW5lMU51bWJlcigpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGdldE1lc3NhZ2VXYWl0aW5nSW5kaWNhdG9yKCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZ2V0TXV0ZSgpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdldE5laWdoYm9yaW5nQ2lkcygKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2V0T3V0Z29pbmdDYWxsZXJJZERpc3BsYXkoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdldFBkcENvbnRleHRMaXN0KAotYW5kcm9pZC5vcy5NZXNzYWdlKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9MaXN0PCtMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L01taUNvZGU7PjsgKQotcHVibGljIGFic3RyYWN0IGphdmEudXRpbC5MaXN0IGdldFBlbmRpbmdNbWlDb2RlcygpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldFBob25lTmFtZSgpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdldFByZWZlcnJlZE5ldHdvcmtUeXBlKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgYWJzdHJhY3QgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNhbGwgZ2V0UmluZ2luZ0NhbGwoKQotCi1wdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC50ZWxlcGhvbnkuU2VydmljZVN0YXRlIGdldFNlcnZpY2VTdGF0ZSgpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0U2lnbmFsU3RyZW5ndGhBU1UoKQotCi1wdWJsaWMgYWJzdHJhY3QgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlNpbUNhcmQgZ2V0U2ltQ2FyZCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGdldFNpbVJlY29yZHNMb2FkZWQoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRTaW1TZXJpYWxOdW1iZXIoKQotCi1wdWJsaWMgYWJzdHJhY3QgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnRlc3QuU2ltdWxhdGVkUmFkaW9Db250cm9sIGdldFNpbXVsYXRlZFJhZGlvQ29udHJvbCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmUkU3RhdGUgZ2V0U3RhdGUoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRTdWJzY3JpYmVySWQoKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBnZXRVbml0VGVzdE1vZGUoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRWb2ljZU1haWxBbHBoYVRhZygpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldFZvaWNlTWFpbE51bWJlcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9DYWxsU3RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGhhbmRsZUluQ2FsbE1taUNvbW1hbmRzKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaGFuZGxlUGluTW1pKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IHZvaWQgaW52b2tlT2VtUmlsUmVxdWVzdFJhdygKLWJ5dGVbXQotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBpbnZva2VPZW1SaWxSZXF1ZXN0U3RyaW5ncygKLWphdmEubGFuZy5TdHJpbmdbXQotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0RhdGFDb25uZWN0aXZpdHlQb3NzaWJsZSgpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHF1ZXJ5QXZhaWxhYmxlQmFuZE1vZGUoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlZ2lzdGVyRm9yRGlzY29ubmVjdCgKLWFuZHJvaWQub3MuSGFuZGxlcgotaW50Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCByZWdpc3RlckZvckluY29taW5nUmluZygKLWFuZHJvaWQub3MuSGFuZGxlcgotaW50Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCByZWdpc3RlckZvck1taUNvbXBsZXRlKAotYW5kcm9pZC5vcy5IYW5kbGVyCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlZ2lzdGVyRm9yTW1pSW5pdGlhdGUoCi1hbmRyb2lkLm9zLkhhbmRsZXIKLWludAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgcmVnaXN0ZXJGb3JOZXdSaW5naW5nQ29ubmVjdGlvbigKLWFuZHJvaWQub3MuSGFuZGxlcgotaW50Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCByZWdpc3RlckZvclBob25lU3RhdGVDaGFuZ2VkKAotYW5kcm9pZC5vcy5IYW5kbGVyCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlZ2lzdGVyRm9yU2VydmljZVN0YXRlQ2hhbmdlZCgKLWFuZHJvaWQub3MuSGFuZGxlcgotaW50Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCByZWdpc3RlckZvclN1cHBTZXJ2aWNlRmFpbGVkKAotYW5kcm9pZC5vcy5IYW5kbGVyCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlZ2lzdGVyRm9yU3VwcFNlcnZpY2VOb3RpZmljYXRpb24oCi1hbmRyb2lkLm9zLkhhbmRsZXIKLWludAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgcmVnaXN0ZXJGb3JVbmtub3duQ29ubmVjdGlvbigKLWFuZHJvaWQub3MuSGFuZGxlcgotaW50Ci1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQ2FsbFN0YXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCByZWplY3RDYWxsKCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2VsZWN0TmV0d29ya01hbnVhbGx5KAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5OZXR3b3JrSW5mbwotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZW5kRHRtZigKLWNoYXIpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNlbmRVc3NkUmVzcG9uc2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRCYW5kTW9kZSgKLWludAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRDYWxsRm9yd2FyZGluZ09wdGlvbigKLWludAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0Q2FsbFdhaXRpbmcoCi1ib29sZWFuCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldERhdGFSb2FtaW5nRW5hYmxlZCgKLWJvb2xlYW4pCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldExpbmUxTnVtYmVyKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRNdXRlKAotYm9vbGVhbikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0TmV0d29ya1NlbGVjdGlvbk1vZGVBdXRvbWF0aWMoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldE9uUG9zdERpYWxDaGFyYWN0ZXIoCi1hbmRyb2lkLm9zLkhhbmRsZXIKLWludAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0T3V0Z29pbmdDYWxsZXJJZERpc3BsYXkoCi1pbnQKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0UHJlZmVycmVkTmV0d29ya1R5cGUoCi1pbnQKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0UmFkaW9Qb3dlcigKLWJvb2xlYW4pCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFVuaXRUZXN0TW9kZSgKLWJvb2xlYW4pCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFZvaWNlTWFpbE51bWJlcigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc3RhcnREdG1mKAotY2hhcikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc3RvcER0bWYoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQ2FsbFN0YXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzd2l0Y2hIb2xkaW5nQW5kQWN0aXZlKCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgdW5yZWdpc3RlckZvckRpc2Nvbm5lY3QoCi1hbmRyb2lkLm9zLkhhbmRsZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHVucmVnaXN0ZXJGb3JJbmNvbWluZ1JpbmcoCi1hbmRyb2lkLm9zLkhhbmRsZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHVucmVnaXN0ZXJGb3JNbWlDb21wbGV0ZSgKLWFuZHJvaWQub3MuSGFuZGxlcikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgdW5yZWdpc3RlckZvck1taUluaXRpYXRlKAotYW5kcm9pZC5vcy5IYW5kbGVyKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB1bnJlZ2lzdGVyRm9yTmV3UmluZ2luZ0Nvbm5lY3Rpb24oCi1hbmRyb2lkLm9zLkhhbmRsZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHVucmVnaXN0ZXJGb3JQaG9uZVN0YXRlQ2hhbmdlZCgKLWFuZHJvaWQub3MuSGFuZGxlcikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgdW5yZWdpc3RlckZvclNlcnZpY2VTdGF0ZUNoYW5nZWQoCi1hbmRyb2lkLm9zLkhhbmRsZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHVucmVnaXN0ZXJGb3JTdXBwU2VydmljZUZhaWxlZCgKLWFuZHJvaWQub3MuSGFuZGxlcikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgdW5yZWdpc3RlckZvclN1cHBTZXJ2aWNlTm90aWZpY2F0aW9uKAotYW5kcm9pZC5vcy5IYW5kbGVyKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB1bnJlZ2lzdGVyRm9yVW5rbm93bkNvbm5lY3Rpb24oCi1hbmRyb2lkLm9zLkhhbmRsZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHVwZGF0ZVNlcnZpY2VMb2NhdGlvbigKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmVCYXNlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIExPR19UQUcKLQotcHJvdGVjdGVkIGFuZHJvaWQuY29udGVudC5Db250ZXh0IG1Db250ZXh0Ci0KLXByb3RlY3RlZCBmaW5hbCBhbmRyb2lkLm9zLlJlZ2lzdHJhbnRMaXN0IG1EaXNjb25uZWN0UmVnaXN0cmFudHMKLQotcHJvdGVjdGVkIGZpbmFsIGFuZHJvaWQub3MuUmVnaXN0cmFudExpc3QgbUluY29taW5nUmluZ1JlZ2lzdHJhbnRzCi0KLXByb3RlY3RlZCBhbmRyb2lkLm9zLkxvb3BlciBtTG9vcGVyCi0KLXByb3RlY3RlZCBmaW5hbCBhbmRyb2lkLm9zLlJlZ2lzdHJhbnRMaXN0IG1NbWlDb21wbGV0ZVJlZ2lzdHJhbnRzCi0KLXByb3RlY3RlZCBmaW5hbCBhbmRyb2lkLm9zLlJlZ2lzdHJhbnRMaXN0IG1NbWlSZWdpc3RyYW50cwotCi1wcm90ZWN0ZWQgZmluYWwgYW5kcm9pZC5vcy5SZWdpc3RyYW50TGlzdCBtTmV3UmluZ2luZ0Nvbm5lY3Rpb25SZWdpc3RyYW50cwotCi1wcm90ZWN0ZWQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lTm90aWZpZXIgbU5vdGlmaWVyCi0KLXByb3RlY3RlZCBmaW5hbCBhbmRyb2lkLm9zLlJlZ2lzdHJhbnRMaXN0IG1QaG9uZVN0YXRlUmVnaXN0cmFudHMKLQotcHJvdGVjdGVkIGZpbmFsIGFuZHJvaWQub3MuUmVnaXN0cmFudExpc3QgbVNlcnZpY2VTdGF0ZVJlZ2lzdHJhbnRzCi0KLXByb3RlY3RlZCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkudGVzdC5TaW11bGF0ZWRSYWRpb0NvbnRyb2wgbVNpbXVsYXRlZFJhZGlvQ29udHJvbAotCi1wcm90ZWN0ZWQgZmluYWwgYW5kcm9pZC5vcy5SZWdpc3RyYW50TGlzdCBtU3VwcFNlcnZpY2VGYWlsZWRSZWdpc3RyYW50cwotCi0gYm9vbGVhbiBtVW5pdFRlc3RNb2RlCi0KLXByb3RlY3RlZCBmaW5hbCBhbmRyb2lkLm9zLlJlZ2lzdHJhbnRMaXN0IG1Vbmtub3duQ29ubmVjdGlvblJlZ2lzdHJhbnRzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lTm90aWZpZXIKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmVOb3RpZmllcgotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWJvb2xlYW4pCi0KLXByaXZhdGUgdm9pZCBjaGVja0NvcnJlY3RUaHJlYWQoCi1hbmRyb2lkLm9zLkhhbmRsZXIpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBnZXRDb250ZXh0KCkKLQotcHVibGljIGFic3RyYWN0IGphdmEudXRpbC5MaXN0IGdldFBlbmRpbmdNbWlDb2RlcygpCi0KLXB1YmxpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkudGVzdC5TaW11bGF0ZWRSYWRpb0NvbnRyb2wgZ2V0U2ltdWxhdGVkUmFkaW9Db250cm9sKCkKLQotcHVibGljIGJvb2xlYW4gZ2V0VW5pdFRlc3RNb2RlKCkKLQotcHJvdGVjdGVkIHZvaWQgbm90aWZ5Q2FsbFN0YXRlQ2hhbmdlZFAoKQotCi1wcm90ZWN0ZWQgdm9pZCBub3RpZnlEaXNjb25uZWN0UCgKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Db25uZWN0aW9uKQotCi1wcm90ZWN0ZWQgdm9pZCBub3RpZnlOZXdSaW5naW5nQ29ubmVjdGlvblAoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ29ubmVjdGlvbikKLQotcHJvdGVjdGVkIHZvaWQgbm90aWZ5U2VydmljZVN0YXRlQ2hhbmdlZFAoCi1hbmRyb2lkLnRlbGVwaG9ueS5TZXJ2aWNlU3RhdGUpCi0KLXB1YmxpYyB2b2lkIHJlZ2lzdGVyRm9yRGlzY29ubmVjdCgKLWFuZHJvaWQub3MuSGFuZGxlcgotaW50Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgdm9pZCByZWdpc3RlckZvckluY29taW5nUmluZygKLWFuZHJvaWQub3MuSGFuZGxlcgotaW50Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgdm9pZCByZWdpc3RlckZvck1taUNvbXBsZXRlKAotYW5kcm9pZC5vcy5IYW5kbGVyCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2lkIHJlZ2lzdGVyRm9yTW1pSW5pdGlhdGUoCi1hbmRyb2lkLm9zLkhhbmRsZXIKLWludAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHZvaWQgcmVnaXN0ZXJGb3JOZXdSaW5naW5nQ29ubmVjdGlvbigKLWFuZHJvaWQub3MuSGFuZGxlcgotaW50Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgdm9pZCByZWdpc3RlckZvclBob25lU3RhdGVDaGFuZ2VkKAotYW5kcm9pZC5vcy5IYW5kbGVyCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2lkIHJlZ2lzdGVyRm9yU2VydmljZVN0YXRlQ2hhbmdlZCgKLWFuZHJvaWQub3MuSGFuZGxlcgotaW50Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgdm9pZCByZWdpc3RlckZvclN1cHBTZXJ2aWNlRmFpbGVkKAotYW5kcm9pZC5vcy5IYW5kbGVyCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2lkIHJlZ2lzdGVyRm9yVW5rbm93bkNvbm5lY3Rpb24oCi1hbmRyb2lkLm9zLkhhbmRsZXIKLWludAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHZvaWQgc2V0VW5pdFRlc3RNb2RlKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgdW5yZWdpc3RlckZvckRpc2Nvbm5lY3QoCi1hbmRyb2lkLm9zLkhhbmRsZXIpCi0KLXB1YmxpYyB2b2lkIHVucmVnaXN0ZXJGb3JJbmNvbWluZ1JpbmcoCi1hbmRyb2lkLm9zLkhhbmRsZXIpCi0KLXB1YmxpYyB2b2lkIHVucmVnaXN0ZXJGb3JNbWlDb21wbGV0ZSgKLWFuZHJvaWQub3MuSGFuZGxlcikKLQotcHVibGljIHZvaWQgdW5yZWdpc3RlckZvck1taUluaXRpYXRlKAotYW5kcm9pZC5vcy5IYW5kbGVyKQotCi1wdWJsaWMgdm9pZCB1bnJlZ2lzdGVyRm9yTmV3UmluZ2luZ0Nvbm5lY3Rpb24oCi1hbmRyb2lkLm9zLkhhbmRsZXIpCi0KLXB1YmxpYyB2b2lkIHVucmVnaXN0ZXJGb3JQaG9uZVN0YXRlQ2hhbmdlZCgKLWFuZHJvaWQub3MuSGFuZGxlcikKLQotcHVibGljIHZvaWQgdW5yZWdpc3RlckZvclNlcnZpY2VTdGF0ZUNoYW5nZWQoCi1hbmRyb2lkLm9zLkhhbmRsZXIpCi0KLXB1YmxpYyB2b2lkIHVucmVnaXN0ZXJGb3JTdXBwU2VydmljZUZhaWxlZCgKLWFuZHJvaWQub3MuSGFuZGxlcikKLQotcHVibGljIHZvaWQgdW5yZWdpc3RlckZvclVua25vd25Db25uZWN0aW9uKAotYW5kcm9pZC5vcy5IYW5kbGVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZUZhY3RvcnkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIExPR19UQUcKLQotc3RhdGljIGZpbmFsIGludCBTT0NLRVRfT1BFTl9NQVhfUkVUUlkKLQotc3RhdGljIGZpbmFsIGludCBTT0NLRVRfT1BFTl9SRVRSWV9NSUxMSVMKLQotcHJpdmF0ZSBzdGF0aWMgYW5kcm9pZC5vcy5Mb29wZXIgc0xvb3BlcgotCi1wcml2YXRlIHN0YXRpYyBib29sZWFuIHNNYWRlRGVmYXVsdHMKLQotcHJpdmF0ZSBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lTm90aWZpZXIgc1Bob25lTm90aWZpZXIKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0FycmF5TGlzdDxMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lOz47ICkKLXByaXZhdGUgc3RhdGljIGphdmEudXRpbC5BcnJheUxpc3Qgc1Bob25lcwotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuT2JqZWN0IHRlc3RNYWlsYm94Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZSBnZXREZWZhdWx0UGhvbmUoKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFrZURlZmF1bHRQaG9uZXMoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyUGhvbmUoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmUpCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgdXNlTmV3UklMKAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGphdmEubGFuZy5EZXByZWNhdGVkCi1wdWJsaWMgZmluYWwgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lU3RhdGVJbnRlbnRSZWNlaXZlciBleHRlbmRzIGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSU5URU5UX0tFWV9BU1UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIElOVEVOVF9LRVlfTlVNCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTE9HX1RBRwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9USUZfTUFYCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOT1RJRl9QSE9ORQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9USUZfU0VSVklDRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9USUZfU0lHTkFMCi0KLSBpbnQgbUFzdQotCi1wcml2YXRlIGludCBtQXN1RXZlbnRXaGF0Ci0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgbUNvbnRleHQKLQotcHJpdmF0ZSBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyIG1GaWx0ZXIKLQotIGphdmEubGFuZy5TdHJpbmcgbUluY29taW5nTnVtYmVyCi0KLXByaXZhdGUgaW50IG1Mb2NhdGlvbkV2ZW50V2hhdAotCi0gY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lJFN0YXRlIG1QaG9uZVN0YXRlCi0KLXByaXZhdGUgaW50IG1QaG9uZVN0YXRlRXZlbnRXaGF0Ci0KLSBhbmRyb2lkLnRlbGVwaG9ueS5TZXJ2aWNlU3RhdGUgbVNlcnZpY2VTdGF0ZQotCi1wcml2YXRlIGludCBtU2VydmljZVN0YXRlRXZlbnRXaGF0Ci0KLXByaXZhdGUgYW5kcm9pZC5vcy5IYW5kbGVyIG1UYXJnZXQKLQotcHJpdmF0ZSBpbnQgbVdhbnRzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQub3MuSGFuZGxlcikKLQotcHVibGljIGJvb2xlYW4gZ2V0Tm90aWZ5UGhvbmVDYWxsU3RhdGUoKQotCi1wdWJsaWMgYm9vbGVhbiBnZXROb3RpZnlTZXJ2aWNlU3RhdGUoKQotCi1wdWJsaWMgYm9vbGVhbiBnZXROb3RpZnlTaWduYWxTdHJlbmd0aCgpCi0KLXB1YmxpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmUkU3RhdGUgZ2V0UGhvbmVTdGF0ZSgpCi0KLXB1YmxpYyBhbmRyb2lkLnRlbGVwaG9ueS5TZXJ2aWNlU3RhdGUgZ2V0U2VydmljZVN0YXRlKCkKLQotcHVibGljIGludCBnZXRTaWduYWxTdHJlbmd0aCgpCi0KLXB1YmxpYyBpbnQgZ2V0U2lnbmFsU3RyZW5ndGhEYm0oKQotCi1wdWJsaWMgdm9pZCBub3RpZnlQaG9uZUNhbGxTdGF0ZSgKLWludCkKLQotcHVibGljIHZvaWQgbm90aWZ5U2VydmljZVN0YXRlKAotaW50KQotCi1wdWJsaWMgdm9pZCBub3RpZnlTaWduYWxTdHJlbmd0aCgKLWludCkKLQotcHVibGljIHZvaWQgb25SZWNlaXZlKAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQuY29udGVudC5JbnRlbnQpCi0KLXB1YmxpYyB2b2lkIHJlZ2lzdGVySW50ZW50KCkKLQotcHVibGljIHZvaWQgc2V0Q29udGV4dCgKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wdWJsaWMgdm9pZCBzZXRUYXJnZXQoCi1hbmRyb2lkLm9zLkhhbmRsZXIpCi0KLXB1YmxpYyB2b2lkIHVucmVnaXN0ZXJJbnRlbnQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZVN1YkluZm8gZXh0ZW5kcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSVBob25lU3ViSW5mbyRTdHViCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUkVBRF9QSE9ORV9TVEFURQotCi1wcml2YXRlIGFuZHJvaWQuY29udGVudC5Db250ZXh0IG1Db250ZXh0Ci0KLXByaXZhdGUgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lIG1QaG9uZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZSkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RGV2aWNlSWQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXREZXZpY2VTdm4oKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRMaW5lMUFscGhhVGFnKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TGluZTFOdW1iZXIoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTaW1TZXJpYWxOdW1iZXIoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdWJzY3JpYmVySWQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRWb2ljZU1haWxBbHBoYVRhZygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFZvaWNlTWFpbE51bWJlcigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TaW1DYXJkOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9FbnVtPExjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU2ltQ2FyZCRTdGF0ZTs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE2NDA5IG5hbWUgPVN0YXRlICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuU2ltQ2FyZCRTdGF0ZSBleHRlbmRzIGphdmEubGFuZy5FbnVtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TaW1DYXJkJFN0YXRlW10gJFZBTFVFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TaW1DYXJkJFN0YXRlIEFCU0VOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TaW1DYXJkJFN0YXRlIE5FVFdPUktfTE9DS0VECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlNpbUNhcmQkU3RhdGUgUElOX1JFUVVJUkVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlNpbUNhcmQkU3RhdGUgUFVLX1JFUVVJUkVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlNpbUNhcmQkU3RhdGUgUkVBRFkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuU2ltQ2FyZCRTdGF0ZSBVTktOT1dOCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpViApCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TaW1DYXJkJFN0YXRlIHZhbHVlT2YoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TaW1DYXJkJFN0YXRlW10gdmFsdWVzKCkKLQotcHVibGljIGJvb2xlYW4gaXNQaW5Mb2NrZWQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TaW1DYXJkJFN0YXRlOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TaW1DYXJkIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSU5URU5UX0tFWV9MT0NLRURfUkVBU09OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBJTlRFTlRfS0VZX1NJTV9TVEFURQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSU5URU5UX1ZBTFVFX0xPQ0tFRF9ORVRXT1JLCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBJTlRFTlRfVkFMVUVfTE9DS0VEX09OX1BJTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSU5URU5UX1ZBTFVFX0xPQ0tFRF9PTl9QVUsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIElOVEVOVF9WQUxVRV9TSU1fQUJTRU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBJTlRFTlRfVkFMVUVfU0lNX0lNU0kKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIElOVEVOVF9WQUxVRV9TSU1fTE9BREVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBJTlRFTlRfVkFMVUVfU0lNX0xPQ0tFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSU5URU5UX1ZBTFVFX1NJTV9OT1RfUkVBRFkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIElOVEVOVF9WQUxVRV9TSU1fUkVBRFkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBjaGFuZ2VTaW1GZG5QYXNzd29yZCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgY2hhbmdlU2ltTG9ja1Bhc3N3b3JkKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRTZXJ2aWNlUHJvdmlkZXJOYW1lKCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZ2V0U2ltRmRuRW5hYmxlZCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGdldFNpbUxvY2tFbmFibGVkKCkKLQotcHVibGljIGFic3RyYWN0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TaW1DYXJkJFN0YXRlIGdldFN0YXRlKCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgcmVnaXN0ZXJGb3JBYnNlbnQoCi1hbmRyb2lkLm9zLkhhbmRsZXIKLWludAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgcmVnaXN0ZXJGb3JMb2NrZWQoCi1hbmRyb2lkLm9zLkhhbmRsZXIKLWludAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgcmVnaXN0ZXJGb3JOZXR3b3JrTG9ja2VkKAotYW5kcm9pZC5vcy5IYW5kbGVyCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFNpbUZkbkVuYWJsZWQoCi1ib29sZWFuCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFNpbUxvY2tFbmFibGVkKAotYm9vbGVhbgotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdXBwbHlOZXR3b3JrRGVwZXJzb25hbGl6YXRpb24oCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHN1cHBseVBpbigKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc3VwcGx5UGluMigKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc3VwcGx5UHVrKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdXBwbHlQdWsyKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB1bnJlZ2lzdGVyRm9yQWJzZW50KAotYW5kcm9pZC5vcy5IYW5kbGVyKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB1bnJlZ2lzdGVyRm9yTG9ja2VkKAotYW5kcm9pZC5vcy5IYW5kbGVyKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB1bnJlZ2lzdGVyRm9yTmV0d29ya0xvY2tlZCgKLWFuZHJvaWQub3MuSGFuZGxlcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuVGVsZXBob255SW50ZW50cyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDVElPTl9BTllfREFUQV9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDVElPTl9EQVRBX0NPTk5FQ1RJT05fRkFJTEVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBQ1RJT05fTkVUV09SS19TRVRfVElNRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUNUSU9OX05FVFdPUktfU0VUX1RJTUVaT05FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBQ1RJT05fUEhPTkVfU1RBVEVfQ0hBTkdFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUNUSU9OX1NFUlZJQ0VfU1RBVEVfQ0hBTkdFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUNUSU9OX1NJR05BTF9TVFJFTkdUSF9DSEFOR0VECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBQ1RJT05fU0lNX1NUQVRFX0NIQU5HRUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuVGVsZXBob255UHJvcGVydGllcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBST1BFUlRZX0JBU0VCQU5EX1ZFUlNJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBST1BFUlRZX0RBVEFfTkVUV09SS19UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQUk9QRVJUWV9MSU5FMV9WT0lDRV9DQUxMX0ZPUldBUkRJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBST1BFUlRZX0xJTkUxX1ZPSUNFX01BSUxfV0FJVElORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUFJPUEVSVFlfT1BFUkFUT1JfQUxQSEEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBST1BFUlRZX09QRVJBVE9SX0lTTUFOVUFMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQUk9QRVJUWV9PUEVSQVRPUl9JU09fQ09VTlRSWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUFJPUEVSVFlfT1BFUkFUT1JfSVNST0FNSU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQUk9QRVJUWV9PUEVSQVRPUl9OVU1FUklDCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQUk9QRVJUWV9SSUxfSU1QTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUFJPUEVSVFlfU0lNX09QRVJBVE9SX0FMUEhBCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQUk9QRVJUWV9TSU1fT1BFUkFUT1JfSVNPX0NPVU5UUlkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBST1BFUlRZX1NJTV9PUEVSQVRPUl9OVU1FUklDCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQUk9QRVJUWV9TSU1fU1RBVEUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0FkblJlY29yZDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9BZG5SZWNvcmQ7PjsgKQotZmluYWwgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5BZG5SZWNvcmQkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkFkblJlY29yZCBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uQWRuUmVjb3JkW10gbmV3QXJyYXkoCi1pbnQpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0W10gbmV3QXJyYXkoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5BZG5SZWNvcmQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBmaW5hbCBpbnQgQUROX0JDRF9OVU1CRVJfTEVOR1RICi0KLXN0YXRpYyBmaW5hbCBpbnQgQUROX0NBUEFCSUxJVFlfSUQKLQotc3RhdGljIGZpbmFsIGludCBBRE5fREFJTElOR19OVU1CRVJfRU5ECi0KLXN0YXRpYyBmaW5hbCBpbnQgQUROX0RBSUxJTkdfTlVNQkVSX1NUQVJUCi0KLXN0YXRpYyBmaW5hbCBpbnQgQUROX0VYVEVOU0lPTl9JRAotCi1zdGF0aWMgZmluYWwgaW50IEFETl9UT05fQU5EX05QSQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9BZG5SZWNvcmQ7PjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvciBDUkVBVE9SCi0KLXN0YXRpYyBmaW5hbCBpbnQgRVhUX1JFQ09SRF9MRU5HVEhfQllURVMKLQotc3RhdGljIGZpbmFsIGludCBFWFRfUkVDT1JEX1RZUEVfQURESVRJT05BTF9EQVRBCi0KLXN0YXRpYyBmaW5hbCBpbnQgRVhUX1JFQ09SRF9UWVBFX01BU0sKLQotc3RhdGljIGZpbmFsIGludCBGT09URVJfU0laRV9CWVRFUwotCi1zdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMT0dfVEFHCi0KLXN0YXRpYyBmaW5hbCBpbnQgTUFYX0VYVF9DQUxMRURfUEFSVFlfTEVOR1RICi0KLXN0YXRpYyBmaW5hbCBpbnQgTUFYX05VTUJFUl9TSVpFX0JZVEVTCi0KLSBqYXZhLmxhbmcuU3RyaW5nIGFscGhhVGFnCi0KLSBpbnQgZWZpZAotCi0gaW50IGV4dFJlY29yZAotCi0gamF2YS5sYW5nLlN0cmluZyBudW1iZXIKLQotIGludCByZWNvcmROdW1iZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWludAotYnl0ZVtdKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ieXRlW10pCi0KLXByaXZhdGUgdm9pZCBwYXJzZVJlY29yZCgKLWJ5dGVbXSkKLQotcHVibGljIHZvaWQgYXBwZW5kRXh0UmVjb3JkKAotYnl0ZVtdKQotCi1wdWJsaWMgYnl0ZVtdIGJ1aWxkQWRuU3RyaW5nKAotaW50KQotCi1wdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRBbHBoYVRhZygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE51bWJlcigpCi0KLXB1YmxpYyBib29sZWFuIGhhc0V4dGVuZGVkUmVjb3JkKCkKLQotcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpCi0KLXB1YmxpYyBib29sZWFuIGlzRXF1YWwoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkFkblJlY29yZCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1wdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5TaW1Db25zdGFudHMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVGX0FECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVGX0FETgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFRl9DRkZfQ1BIUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFRl9DRklTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVGX0VYVDEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUZfRVhUMgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFRl9FWFQzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVGX0VYVDYKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUZfRkROCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVGX0lDQ0lECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVGX0lNRwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFRl9JTkZPX0NQSFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUZfTUFJTEJPWF9DUEhTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVGX01CRE4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUZfTUJJCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVGX01TSVNETgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFRl9NV0lTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVGX1BOTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFRl9TRE4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUZfU01TCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVGX1NQREkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUZfU1BOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVGX1NQTl9DUEhTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVGX1NQTl9TSE9SVF9DUEhTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVGX1NTVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFRl9WT0lDRV9NQUlMX0lORElDQVRPUl9DUEhTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNNU19SRUNPUkRfTEVOR1RICi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkFkblJlY29yZENhY2hlIGV4dGVuZHMgYW5kcm9pZC5vcy5IYW5kbGVyIGltcGxlbWVudHMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5TaW1Db25zdGFudHMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIGludCBFVkVOVF9MT0FEX0FMTF9BRE5fTElLRV9ET05FCi0KLXN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfVVBEQVRFX0FETl9ET05FCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGFuZHJvaWQvdXRpbC9TcGFyc2VBcnJheTxMamF2YS91dGlsL0FycmF5TGlzdDxMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9BZG5SZWNvcmQ7Pjs+OyApCi0gYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5IGFkbkxpa2VGaWxlcwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxhbmRyb2lkL3V0aWwvU3BhcnNlQXJyYXk8TGphdmEvdXRpbC9BcnJheUxpc3Q8TGFuZHJvaWQvb3MvTWVzc2FnZTs+Oz47ICkKLSBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXkgYWRuTGlrZVdhaXRlcnMKLQotIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uR1NNUGhvbmUgcGhvbmUKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MYW5kcm9pZC91dGlsL1NwYXJzZUFycmF5PExhbmRyb2lkL29zL01lc3NhZ2U7PjsgKQotIGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheSB1c2VyV3JpdGVSZXNwb25zZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uR1NNUGhvbmUpCi0KLXByaXZhdGUgdm9pZCBjbGVhclVzZXJXcml0ZXJzKCkKLQotcHJpdmF0ZSB2b2lkIGNsZWFyV2FpdGVycygpCi0KLXByaXZhdGUgaW50IGV4dGVuc2lvbkVmRm9yRWYoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvQXJyYXlMaXN0PExhbmRyb2lkL29zL01lc3NhZ2U7PjtMYW5kcm9pZC9vcy9Bc3luY1Jlc3VsdDspViApCi1wcml2YXRlIHZvaWQgbm90aWZ5V2FpdGVycygKLWphdmEudXRpbC5BcnJheUxpc3QKLWFuZHJvaWQub3MuQXN5bmNSZXN1bHQpCi0KLXByaXZhdGUgdm9pZCBzZW5kRXJyb3JSZXNwb25zZSgKLWFuZHJvaWQub3MuTWVzc2FnZQotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSSlMamF2YS91dGlsL0FycmF5TGlzdDxMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9BZG5SZWNvcmQ7PjsgKQotIGphdmEudXRpbC5BcnJheUxpc3QgZ2V0UmVjb3Jkc0lmTG9hZGVkKAotaW50KQotCi1wdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi0gdm9pZCByZXF1ZXN0TG9hZEFsbEFkbkxpa2UoCi1pbnQKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotIHZvaWQgcmVzZXQoKQotCi0gdm9pZCB1cGRhdGVBZG5CeUluZGV4KAotaW50Ci1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkFkblJlY29yZAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLSB2b2lkIHVwZGF0ZUFkbkJ5U2VhcmNoKAotaW50Ci1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkFkblJlY29yZAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5BZG5SZWNvcmQKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLSBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkFkblJlY29yZExvYWRlciBleHRlbmRzIGFuZHJvaWQub3MuSGFuZGxlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgaW50IEVWRU5UX0FETl9MT0FEX0FMTF9ET05FCi0KLXN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfQUROX0xPQURfRE9ORQotCi1zdGF0aWMgZmluYWwgaW50IEVWRU5UX0VGX0xJTkVBUl9SRUNPUkRfU0laRV9ET05FCi0KLXN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfRVhUX1JFQ09SRF9MT0FEX0RPTkUKLQotc3RhdGljIGZpbmFsIGludCBFVkVOVF9VUERBVEVfUkVDT1JEX0RPTkUKLQotc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTE9HX1RBRwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQXJyYXlMaXN0PExjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0FkblJlY29yZDs+OyApCi0gamF2YS51dGlsLkFycmF5TGlzdCBhZG5zCi0KLSBpbnQgZWYKLQotIGludCBleHRlbnNpb25FRgotCi0gaW50IHBlbmRpbmdFeHRMb2FkcwotCi0gY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5HU01QaG9uZSBwaG9uZQotCi0gamF2YS5sYW5nLlN0cmluZyBwaW4yCi0KLSBpbnQgcmVjb3JkTnVtYmVyCi0KLSBqYXZhLmxhbmcuT2JqZWN0IHJlc3VsdAotCi0gYW5kcm9pZC5vcy5NZXNzYWdlIHVzZXJSZXNwb25zZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uR1NNUGhvbmUpCi0KLXB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLSB2b2lkIGxvYWRBbGxGcm9tRUYoCi1pbnQKLWludAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi0gdm9pZCBsb2FkRnJvbUVGKAotaW50Ci1pbnQKLWludAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi0gdm9pZCB1cGRhdGVFRigKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uQWRuUmVjb3JkCi1pbnQKLWludAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5BcG5TZXR0aW5nIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gamF2YS5sYW5nLlN0cmluZyBhcG4KLQotIGphdmEubGFuZy5TdHJpbmcgY2FycmllcgotCi0gamF2YS5sYW5nLlN0cmluZyBtbXNQb3J0Ci0KLSBqYXZhLmxhbmcuU3RyaW5nIG1tc1Byb3h5Ci0KLSBqYXZhLmxhbmcuU3RyaW5nIG1tc2MKLQotIGphdmEubGFuZy5TdHJpbmcgcGFzc3dvcmQKLQotIGphdmEubGFuZy5TdHJpbmcgcG9ydAotCi0gamF2YS5sYW5nLlN0cmluZyBwcm94eQotCi0gamF2YS5sYW5nLlN0cmluZ1tdIHR5cGVzCi0KLSBqYXZhLmxhbmcuU3RyaW5nIHVzZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLSBib29sZWFuIGNhbkhhbmRsZVR5cGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Db21tYW5kc0ludGVyZmFjZSRTaW1TdGF0dXM7TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vQ29tbWFuZHNJbnRlcmZhY2UkUmFkaW9TdGF0ZTsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkNvbW1hbmRzSW50ZXJmYWNlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ0JfRkFDSUxJVFlfQkFJQwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ0JfRkFDSUxJVFlfQkFJQ3IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENCX0ZBQ0lMSVRZX0JBT0MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENCX0ZBQ0lMSVRZX0JBT0lDCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDQl9GQUNJTElUWV9CQU9JQ3hICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDQl9GQUNJTElUWV9CQV9BTEwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENCX0ZBQ0lMSVRZX0JBX0ZECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDQl9GQUNJTElUWV9CQV9NTwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ0JfRkFDSUxJVFlfQkFfTVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENCX0ZBQ0lMSVRZX0JBX1NJTQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDRl9BQ1RJT05fRElTQUJMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDRl9BQ1RJT05fRU5BQkxFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENGX0FDVElPTl9FUkFTVVJFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENGX0FDVElPTl9SRUdJU1RSQVRJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0ZfUkVBU09OX0FMTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDRl9SRUFTT05fQUxMX0NPTkRJVElPTkFMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENGX1JFQVNPTl9CVVNZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENGX1JFQVNPTl9OT1RfUkVBQ0hBQkxFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENGX1JFQVNPTl9OT19SRVBMWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDRl9SRUFTT05fVU5DT05ESVRJT05BTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElSX0RFRkFVTFQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJUl9JTlZPQ0FUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSVJfU1VQUFJFU1NJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9DTEFTU19EQVRBCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfQ0xBU1NfREFUQV9BU1lOQwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX0NMQVNTX0RBVEFfU1lOQwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX0NMQVNTX0ZBWAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX0NMQVNTX01BWAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX0NMQVNTX05PTkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9DTEFTU19QQUNLRVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9DTEFTU19QQUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9DTEFTU19TTVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9DTEFTU19WT0lDRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSU1fUkVGUkVTSF9GSUxFX1VQREFURUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0lNX1JFRlJFU0hfSU5JVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSU1fUkVGUkVTSF9SRVNFVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBVU1NEX01PREVfTk9USUZZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVTU0RfTU9ERV9SRVFVRVNUCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgYWNjZXB0Q2FsbCgKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgYWNrbm93bGVkZ2VMYXN0SW5jb21pbmdTTVMoCi1ib29sZWFuCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGNhbmNlbFBlbmRpbmdVc3NkKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBjaGFuZ2VCYXJyaW5nUGFzc3dvcmQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGNoYW5nZVNpbVBpbigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgY2hhbmdlU2ltUGluMigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgY29uZmVyZW5jZSgKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZGVhY3RpdmF0ZURlZmF1bHRQRFAoCi1pbnQKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZGVsZXRlU21zT25TaW0oCi1pbnQKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZGlhbCgKLWphdmEubGFuZy5TdHJpbmcKLWludAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBleHBsaWNpdENhbGxUcmFuc2ZlcigKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2V0QXZhaWxhYmxlTmV0d29ya3MoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdldEJhc2ViYW5kVmVyc2lvbigKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2V0Q0xJUigKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2V0Q3VycmVudENhbGxzKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnZXRHUFJTUmVnaXN0cmF0aW9uU3RhdGUoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdldElNRUkoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdldElNRUlTVigKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2V0SU1TSSgKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2V0TGFzdENhbGxGYWlsQ2F1c2UoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdldExhc3RQZHBGYWlsQ2F1c2UoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdldE11dGUoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdldE5laWdoYm9yaW5nQ2lkcygKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2V0TmV0d29ya1NlbGVjdGlvbk1vZGUoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdldE9wZXJhdG9yKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnZXRQRFBDb250ZXh0TGlzdCgKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2V0UHJlZmVycmVkTmV0d29ya1R5cGUoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyBhYnN0cmFjdCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkNvbW1hbmRzSW50ZXJmYWNlJFJhZGlvU3RhdGUgZ2V0UmFkaW9TdGF0ZSgpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdldFJlZ2lzdHJhdGlvblN0YXRlKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnZXRTaWduYWxTdHJlbmd0aCgKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2V0U2ltU3RhdHVzKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBoYW5kbGVDYWxsU2V0dXBSZXF1ZXN0RnJvbVNpbSgKLWJvb2xlYW4KLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgaGFuZ3VwQ29ubmVjdGlvbigKLWludAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBoYW5ndXBGb3JlZ3JvdW5kUmVzdW1lQmFja2dyb3VuZCgKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgaGFuZ3VwV2FpdGluZ09yQmFja2dyb3VuZCgKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgaW52b2tlT2VtUmlsUmVxdWVzdFJhdygKLWJ5dGVbXQotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBpbnZva2VPZW1SaWxSZXF1ZXN0U3RyaW5ncygKLWphdmEubGFuZy5TdHJpbmdbXQotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBxdWVyeUF2YWlsYWJsZUJhbmRNb2RlKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBxdWVyeUNMSVAoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHF1ZXJ5Q2FsbEZvcndhcmRTdGF0dXMoCi1pbnQKLWludAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBxdWVyeUNhbGxXYWl0aW5nKAotaW50Ci1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHF1ZXJ5RmFjaWxpdHlMb2NrKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotaW50Ci1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlZ2lzdGVyRm9yQXZhaWxhYmxlKAotYW5kcm9pZC5vcy5IYW5kbGVyCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlZ2lzdGVyRm9yQ2FsbFN0YXRlQ2hhbmdlZCgKLWFuZHJvaWQub3MuSGFuZGxlcgotaW50Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCByZWdpc3RlckZvck5ldHdvcmtTdGF0ZUNoYW5nZWQoCi1hbmRyb2lkLm9zLkhhbmRsZXIKLWludAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgcmVnaXN0ZXJGb3JOb3RBdmFpbGFibGUoCi1hbmRyb2lkLm9zLkhhbmRsZXIKLWludAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgcmVnaXN0ZXJGb3JPZmZPck5vdEF2YWlsYWJsZSgKLWFuZHJvaWQub3MuSGFuZGxlcgotaW50Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCByZWdpc3RlckZvck9uKAotYW5kcm9pZC5vcy5IYW5kbGVyCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlZ2lzdGVyRm9yUERQU3RhdGVDaGFuZ2VkKAotYW5kcm9pZC5vcy5IYW5kbGVyCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlZ2lzdGVyRm9yUmFkaW9TdGF0ZUNoYW5nZWQoCi1hbmRyb2lkLm9zLkhhbmRsZXIKLWludAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgcmVnaXN0ZXJGb3JTSU1Mb2NrZWRPckFic2VudCgKLWFuZHJvaWQub3MuSGFuZGxlcgotaW50Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCByZWdpc3RlckZvclNJTVJlYWR5KAotYW5kcm9pZC5vcy5IYW5kbGVyCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlamVjdENhbGwoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlc2V0UmFkaW8oCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNlbmREdG1mKAotY2hhcgotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZW5kRW52ZWxvcGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNlbmRTTVMoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNlbmRUZXJtaW5hbFJlc3BvbnNlKAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZW5kVVNTRCgKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2VwYXJhdGVDb25uZWN0aW9uKAotaW50Ci1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEJhbmRNb2RlKAotaW50Ci1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldENMSVIoCi1pbnQKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0Q2FsbEZvcndhcmQoCi1pbnQKLWludAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0Q2FsbFdhaXRpbmcoCi1ib29sZWFuCi1pbnQKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RmFjaWxpdHlMb2NrKAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbgotamF2YS5sYW5nLlN0cmluZwotaW50Ci1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldExvY2F0aW9uVXBkYXRlcygKLWJvb2xlYW4KLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0TXV0ZSgKLWJvb2xlYW4KLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0TmV0d29ya1NlbGVjdGlvbk1vZGVBdXRvbWF0aWMoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldE5ldHdvcmtTZWxlY3Rpb25Nb2RlTWFudWFsKAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRPbkNhbGxSaW5nKAotYW5kcm9pZC5vcy5IYW5kbGVyCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldE9uTklUWlRpbWUoCi1hbmRyb2lkLm9zLkhhbmRsZXIKLWludAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0T25OZXdTTVMoCi1hbmRyb2lkLm9zLkhhbmRsZXIKLWludAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0T25TaWduYWxTdHJlbmd0aFVwZGF0ZSgKLWFuZHJvaWQub3MuSGFuZGxlcgotaW50Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRPblNpbVJlZnJlc2goCi1hbmRyb2lkLm9zLkhhbmRsZXIKLWludAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0T25TaW1TbXNGdWxsKAotYW5kcm9pZC5vcy5IYW5kbGVyCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldE9uU21zT25TaW0oCi1hbmRyb2lkLm9zLkhhbmRsZXIKLWludAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0T25TbXNTdGF0dXMoCi1hbmRyb2lkLm9zLkhhbmRsZXIKLWludAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0T25TdGtDYWxsU2V0VXAoCi1hbmRyb2lkLm9zLkhhbmRsZXIKLWludAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0T25TdGtFdmVudCgKLWFuZHJvaWQub3MuSGFuZGxlcgotaW50Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRPblN0a1Byb2FjdGl2ZUNtZCgKLWFuZHJvaWQub3MuSGFuZGxlcgotaW50Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRPblN0a1Nlc3Npb25FbmQoCi1hbmRyb2lkLm9zLkhhbmRsZXIKLWludAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0T25TdXBwU2VydmljZU5vdGlmaWNhdGlvbigKLWFuZHJvaWQub3MuSGFuZGxlcgotaW50Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRPblVTU0QoCi1hbmRyb2lkLm9zLkhhbmRsZXIKLWludAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0UHJlZmVycmVkTmV0d29ya1R5cGUoCi1pbnQKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0UmFkaW9Qb3dlcigKLWJvb2xlYW4KLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0U3VwcFNlcnZpY2VOb3RpZmljYXRpb25zKAotYm9vbGVhbgotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXR1cERlZmF1bHRQRFAoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNpbUlPKAotaW50Ci1pbnQKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50Ci1pbnQKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc3RhcnREdG1mKAotY2hhcgotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdG9wRHRtZigKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc3VwcGx5TmV0d29ya0RlcGVyc29uYWxpemF0aW9uKAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdXBwbHlTaW1QaW4oCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHN1cHBseVNpbVBpbjIoCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHN1cHBseVNpbVB1aygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc3VwcGx5U2ltUHVrMigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc3dpdGNoV2FpdGluZ09ySG9sZGluZ0FuZEFjdGl2ZSgKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVTbXNUb1NpbSgKLWludAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uQmFzZUNvbW1hbmRzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uQ29tbWFuZHNJbnRlcmZhY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTE9HX1RBRwotCi1wcm90ZWN0ZWQgYW5kcm9pZC5vcy5SZWdpc3RyYW50TGlzdCBtQXZhaWxSZWdpc3RyYW50cwotCi1wcm90ZWN0ZWQgYW5kcm9pZC5vcy5SZWdpc3RyYW50TGlzdCBtQ2FsbFN0YXRlUmVnaXN0cmFudHMKLQotcHJvdGVjdGVkIGFuZHJvaWQuY29udGVudC5Db250ZXh0IG1Db250ZXh0Ci0KLXByb3RlY3RlZCBhbmRyb2lkLm9zLlJlZ2lzdHJhbnQgbU5JVFpUaW1lUmVnaXN0cmFudAotCi1wcm90ZWN0ZWQgYW5kcm9pZC5vcy5SZWdpc3RyYW50TGlzdCBtTmV0d29ya1N0YXRlUmVnaXN0cmFudHMKLQotcHJvdGVjdGVkIGFuZHJvaWQub3MuUmVnaXN0cmFudExpc3QgbU5vdEF2YWlsUmVnaXN0cmFudHMKLQotcHJvdGVjdGVkIGFuZHJvaWQub3MuUmVnaXN0cmFudExpc3QgbU9mZk9yTm90QXZhaWxSZWdpc3RyYW50cwotCi1wcm90ZWN0ZWQgYW5kcm9pZC5vcy5SZWdpc3RyYW50TGlzdCBtT25SZWdpc3RyYW50cwotCi1wcm90ZWN0ZWQgYW5kcm9pZC5vcy5SZWdpc3RyYW50TGlzdCBtUERQUmVnaXN0cmFudHMKLQotcHJvdGVjdGVkIGFuZHJvaWQub3MuUmVnaXN0cmFudExpc3QgbVJhZGlvU3RhdGVDaGFuZ2VkUmVnaXN0cmFudHMKLQotcHJvdGVjdGVkIGFuZHJvaWQub3MuUmVnaXN0cmFudCBtUmluZ1JlZ2lzdHJhbnQKLQotcHJvdGVjdGVkIGFuZHJvaWQub3MuUmVnaXN0cmFudExpc3QgbVNJTUxvY2tlZFJlZ2lzdHJhbnRzCi0KLXByb3RlY3RlZCBhbmRyb2lkLm9zLlJlZ2lzdHJhbnRMaXN0IG1TSU1SZWFkeVJlZ2lzdHJhbnRzCi0KLXByb3RlY3RlZCBhbmRyb2lkLm9zLlJlZ2lzdHJhbnQgbVNNU1JlZ2lzdHJhbnQKLQotcHJvdGVjdGVkIGFuZHJvaWQub3MuUmVnaXN0cmFudCBtU2lnbmFsU3RyZW5ndGhSZWdpc3RyYW50Ci0KLXByb3RlY3RlZCBhbmRyb2lkLm9zLlJlZ2lzdHJhbnQgbVNpbVJlZnJlc2hSZWdpc3RyYW50Ci0KLXByb3RlY3RlZCBhbmRyb2lkLm9zLlJlZ2lzdHJhbnQgbVNpbVNtc0Z1bGxSZWdpc3RyYW50Ci0KLXByb3RlY3RlZCBhbmRyb2lkLm9zLlJlZ2lzdHJhbnQgbVNtc09uU2ltUmVnaXN0cmFudAotCi1wcm90ZWN0ZWQgYW5kcm9pZC5vcy5SZWdpc3RyYW50IG1TbXNTdGF0dXNSZWdpc3RyYW50Ci0KLXByb3RlY3RlZCBhbmRyb2lkLm9zLlJlZ2lzdHJhbnQgbVNzblJlZ2lzdHJhbnQKLQotcHJvdGVjdGVkIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uQ29tbWFuZHNJbnRlcmZhY2UkUmFkaW9TdGF0ZSBtU3RhdGUKLQotcHJvdGVjdGVkIGphdmEubGFuZy5PYmplY3QgbVN0YXRlTW9uaXRvcgotCi1wcm90ZWN0ZWQgYW5kcm9pZC5vcy5SZWdpc3RyYW50IG1TdGtDYWxsU2V0VXBSZWdpc3RyYW50Ci0KLXByb3RlY3RlZCBhbmRyb2lkLm9zLlJlZ2lzdHJhbnQgbVN0a0V2ZW50UmVnaXN0cmFudAotCi1wcm90ZWN0ZWQgYW5kcm9pZC5vcy5SZWdpc3RyYW50IG1TdGtQcm9DbWRSZWdpc3RyYW50Ci0KLXByb3RlY3RlZCBhbmRyb2lkLm9zLlJlZ2lzdHJhbnQgbVN0a1Nlc3Npb25FbmRSZWdpc3RyYW50Ci0KLXByb3RlY3RlZCBhbmRyb2lkLm9zLlJlZ2lzdHJhbnQgbVVTU0RSZWdpc3RyYW50Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXB1YmxpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkNvbW1hbmRzSW50ZXJmYWNlJFJhZGlvU3RhdGUgZ2V0UmFkaW9TdGF0ZSgpCi0KLXByb3RlY3RlZCB2b2lkIG9uUmFkaW9BdmFpbGFibGUoKQotCi1wdWJsaWMgdm9pZCByZWdpc3RlckZvckF2YWlsYWJsZSgKLWFuZHJvaWQub3MuSGFuZGxlcgotaW50Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgdm9pZCByZWdpc3RlckZvckNhbGxTdGF0ZUNoYW5nZWQoCi1hbmRyb2lkLm9zLkhhbmRsZXIKLWludAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHZvaWQgcmVnaXN0ZXJGb3JOZXR3b3JrU3RhdGVDaGFuZ2VkKAotYW5kcm9pZC5vcy5IYW5kbGVyCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2lkIHJlZ2lzdGVyRm9yTm90QXZhaWxhYmxlKAotYW5kcm9pZC5vcy5IYW5kbGVyCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2lkIHJlZ2lzdGVyRm9yT2ZmT3JOb3RBdmFpbGFibGUoCi1hbmRyb2lkLm9zLkhhbmRsZXIKLWludAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHZvaWQgcmVnaXN0ZXJGb3JPbigKLWFuZHJvaWQub3MuSGFuZGxlcgotaW50Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgdm9pZCByZWdpc3RlckZvclBEUFN0YXRlQ2hhbmdlZCgKLWFuZHJvaWQub3MuSGFuZGxlcgotaW50Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgdm9pZCByZWdpc3RlckZvclJhZGlvU3RhdGVDaGFuZ2VkKAotYW5kcm9pZC5vcy5IYW5kbGVyCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2lkIHJlZ2lzdGVyRm9yU0lNTG9ja2VkT3JBYnNlbnQoCi1hbmRyb2lkLm9zLkhhbmRsZXIKLWludAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHZvaWQgcmVnaXN0ZXJGb3JTSU1SZWFkeSgKLWFuZHJvaWQub3MuSGFuZGxlcgotaW50Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgdm9pZCBzZXRPbkNhbGxSaW5nKAotYW5kcm9pZC5vcy5IYW5kbGVyCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2lkIHNldE9uTklUWlRpbWUoCi1hbmRyb2lkLm9zLkhhbmRsZXIKLWludAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHZvaWQgc2V0T25OZXdTTVMoCi1hbmRyb2lkLm9zLkhhbmRsZXIKLWludAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHZvaWQgc2V0T25TaWduYWxTdHJlbmd0aFVwZGF0ZSgKLWFuZHJvaWQub3MuSGFuZGxlcgotaW50Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgdm9pZCBzZXRPblNpbVJlZnJlc2goCi1hbmRyb2lkLm9zLkhhbmRsZXIKLWludAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHZvaWQgc2V0T25TaW1TbXNGdWxsKAotYW5kcm9pZC5vcy5IYW5kbGVyCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2lkIHNldE9uU21zT25TaW0oCi1hbmRyb2lkLm9zLkhhbmRsZXIKLWludAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHZvaWQgc2V0T25TbXNTdGF0dXMoCi1hbmRyb2lkLm9zLkhhbmRsZXIKLWludAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHZvaWQgc2V0T25TdGtDYWxsU2V0VXAoCi1hbmRyb2lkLm9zLkhhbmRsZXIKLWludAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHZvaWQgc2V0T25TdGtFdmVudCgKLWFuZHJvaWQub3MuSGFuZGxlcgotaW50Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgdm9pZCBzZXRPblN0a1Byb2FjdGl2ZUNtZCgKLWFuZHJvaWQub3MuSGFuZGxlcgotaW50Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgdm9pZCBzZXRPblN0a1Nlc3Npb25FbmQoCi1hbmRyb2lkLm9zLkhhbmRsZXIKLWludAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHZvaWQgc2V0T25TdXBwU2VydmljZU5vdGlmaWNhdGlvbigKLWFuZHJvaWQub3MuSGFuZGxlcgotaW50Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgdm9pZCBzZXRPblVTU0QoCi1hbmRyb2lkLm9zLkhhbmRsZXIKLWludAotamF2YS5sYW5nLk9iamVjdCkKLQotcHJvdGVjdGVkIHZvaWQgc2V0UmFkaW9TdGF0ZSgKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uQ29tbWFuZHNJbnRlcmZhY2UkUmFkaW9TdGF0ZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5DYWxsRmFpbENhdXNlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ01fTElNSVRfRVhDRUVERUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkVBUkVSX05PVF9BVkFJTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQUxMX0JBUlJFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSEFOTkVMX05PVF9BVkFJTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9VTlNQRUNJRklFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGRE5fQkxPQ0tFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1JNQUxfQ0xFQVJJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9STUFMX1VOU1BFQ0lGSUVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PX0NJUkNVSVRfQVZBSUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTlVNQkVSX0NIQU5HRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUU9TX05PVF9BVkFJTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfRU5RVUlSWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTV0lUQ0hJTkdfQ09OR0VTVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBURU1QT1JBUllfRkFJTFVSRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBVU0VSX0JVU1kKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uQ2FsbEZvcndhcmRJbmZvIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBudW1iZXIKLQotcHVibGljIGludCByZWFzb24KLQotcHVibGljIGludCBzZXJ2aWNlQ2xhc3MKLQotcHVibGljIGludCBzdGF0dXMKLQotcHVibGljIGludCB0aW1lU2Vjb25kcwotCi1wdWJsaWMgaW50IHRvYQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkNhbGxUcmFja2VyIGV4dGVuZHMgYW5kcm9pZC5vcy5IYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHX1BPTEwKLQotc3RhdGljIGZpbmFsIGludCBFVkVOVF9DQUxMX1NUQVRFX0NIQU5HRQotCi1zdGF0aWMgZmluYWwgaW50IEVWRU5UX0NPTkZFUkVOQ0VfUkVTVUxUCi0KLXN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfRUNUX1JFU1VMVAotCi1zdGF0aWMgZmluYWwgaW50IEVWRU5UX0dFVF9MQVNUX0NBTExfRkFJTF9DQVVTRQotCi1zdGF0aWMgZmluYWwgaW50IEVWRU5UX09QRVJBVElPTl9DT01QTEVURQotCi1zdGF0aWMgZmluYWwgaW50IEVWRU5UX1BPTExfQ0FMTFNfUkVTVUxUCi0KLXN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfUkFESU9fQVZBSUxBQkxFCi0KLXN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfUkFESU9fTk9UX0FWQUlMQUJMRQotCi1zdGF0aWMgZmluYWwgaW50IEVWRU5UX1JFUE9MTF9BRlRFUl9ERUxBWQotCi1zdGF0aWMgZmluYWwgaW50IEVWRU5UX1NFUEFSQVRFX1JFU1VMVAotCi1zdGF0aWMgZmluYWwgaW50IEVWRU5UX1NXSVRDSF9SRVNVTFQKLQotc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTE9HX1RBRwotCi1zdGF0aWMgZmluYWwgaW50IE1BWF9DT05ORUNUSU9OUwotCi1zdGF0aWMgZmluYWwgaW50IE1BWF9DT05ORUNUSU9OU19QRVJfQ0FMTAotCi1zdGF0aWMgZmluYWwgaW50IFBPTExfREVMQVlfTVNFQwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFJFUEVBVF9QT0xMSU5HCi0KLSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkdTTUNhbGwgYmFja2dyb3VuZENhbGwKLQotIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uQ29tbWFuZHNJbnRlcmZhY2UgY20KLQotIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uR1NNQ29ubmVjdGlvbltdIGNvbm5lY3Rpb25zCi0KLSBib29sZWFuIGRlc2lyZWRNdXRlCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9BcnJheUxpc3Q8TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR1NNQ29ubmVjdGlvbjs+OyApCi0gamF2YS51dGlsLkFycmF5TGlzdCBkcm9wcGVkRHVyaW5nUG9sbAotCi0gY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5HU01DYWxsIGZvcmVncm91bmRDYWxsCi0KLSBib29sZWFuIGhhbmd1cFBlbmRpbmdNTwotCi0gYW5kcm9pZC5vcy5NZXNzYWdlIGxhc3RSZWxldmFudFBvbGwKLQotIGJvb2xlYW4gbmVlZHNQb2xsCi0KLSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkdTTUNvbm5lY3Rpb24gcGVuZGluZ01PCi0KLSBpbnQgcGVuZGluZ09wZXJhdGlvbnMKLQotIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uR1NNUGhvbmUgcGhvbmUKLQotIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uR1NNQ2FsbCByaW5naW5nQ2FsbAotCi0gY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lJFN0YXRlIHN0YXRlCi0KLSBhbmRyb2lkLm9zLlJlZ2lzdHJhbnRMaXN0IHZvaWNlQ2FsbEVuZGVkUmVnaXN0cmFudHMKLQotIGFuZHJvaWQub3MuUmVnaXN0cmFudExpc3Qgdm9pY2VDYWxsU3RhcnRlZFJlZ2lzdHJhbnRzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5HU01QaG9uZSkKLQotcHJpdmF0ZSBib29sZWFuIGNoZWNrTm9PcGVyYXRpb25zUGVuZGluZygpCi0KLXByaXZhdGUgdm9pZCBkdW1wU3RhdGUoKQotCi1wcml2YXRlIHZvaWQgZmFrZUhvbGRGb3JlZ3JvdW5kQmVmb3JlRGlhbCgpCi0KLXByaXZhdGUgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lJFN1cHBTZXJ2aWNlIGdldEZhaWxlZFNlcnZpY2UoCi1pbnQpCi0KLXByaXZhdGUgdm9pZCBoYW5kbGVQb2xsQ2FsbHMoCi1hbmRyb2lkLm9zLkFzeW5jUmVzdWx0KQotCi1wcml2YXRlIHZvaWQgaGFuZGxlUmFkaW9BdmFpbGFibGUoKQotCi1wcml2YXRlIHZvaWQgaGFuZGxlUmFkaW9Ob3RBdmFpbGFibGUoKQotCi1wcml2YXRlIHZvaWQgaW50ZXJuYWxDbGVhckRpc2Nvbm5lY3RlZCgpCi0KLXByaXZhdGUgYm9vbGVhbiBpc0NvbW1hbmRFeGNlcHRpb25SYWRpb05vdEF2YWlsYWJsZSgKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLXByaXZhdGUgdm9pZCBsb2coCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIGFuZHJvaWQub3MuTWVzc2FnZSBvYnRhaW5Db21wbGV0ZU1lc3NhZ2UoKQotCi1wcml2YXRlIGFuZHJvaWQub3MuTWVzc2FnZSBvYnRhaW5Db21wbGV0ZU1lc3NhZ2UoCi1pbnQpCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5NZXNzYWdlIG9idGFpbk5vUG9sbENvbXBsZXRlTWVzc2FnZSgKLWludCkKLQotcHJpdmF0ZSB2b2lkIG9wZXJhdGlvbkNvbXBsZXRlKCkKLQotcHJpdmF0ZSB2b2lkIHBvbGxDYWxsc0FmdGVyRGVsYXkoKQotCi1wcml2YXRlIHZvaWQgcG9sbENhbGxzV2hlblNhZmUoKQotCi1wcml2YXRlIHZvaWQgdXBkYXRlUGhvbmVTdGF0ZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9DYWxsU3RhdGVFeGNlcHRpb247ICkKLSB2b2lkIGFjY2VwdENhbGwoKQotCi0gYm9vbGVhbiBjYW5Db25mZXJlbmNlKCkKLQotIGJvb2xlYW4gY2FuRGlhbCgpCi0KLSBib29sZWFuIGNhblRyYW5zZmVyKCkKLQotIHZvaWQgY2xlYXJEaXNjb25uZWN0ZWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQ2FsbFN0YXRlRXhjZXB0aW9uOyApCi0gdm9pZCBjb25mZXJlbmNlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0NhbGxTdGF0ZUV4Y2VwdGlvbjsgKQotIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Db25uZWN0aW9uIGRpYWwoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQ2FsbFN0YXRlRXhjZXB0aW9uOyApCi0gY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNvbm5lY3Rpb24gZGlhbCgKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0NhbGxTdGF0ZUV4Y2VwdGlvbjsgKQotIHZvaWQgZXhwbGljaXRDYWxsVHJhbnNmZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQ2FsbFN0YXRlRXhjZXB0aW9uOyApCi0gY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5HU01Db25uZWN0aW9uIGdldENvbm5lY3Rpb25CeUluZGV4KAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5HU01DYWxsCi1pbnQpCi0KLSBib29sZWFuIGdldE11dGUoKQotCi1wdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQ2FsbFN0YXRlRXhjZXB0aW9uOyApCi0gdm9pZCBoYW5ndXAoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkdTTUNhbGwpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9DYWxsU3RhdGVFeGNlcHRpb247ICkKLSB2b2lkIGhhbmd1cCgKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uR1NNQ29ubmVjdGlvbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0NhbGxTdGF0ZUV4Y2VwdGlvbjsgKQotIHZvaWQgaGFuZ3VwQWxsQ29ubmVjdGlvbnMoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkdTTUNhbGwpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9DYWxsU3RhdGVFeGNlcHRpb247ICkKLSB2b2lkIGhhbmd1cENvbm5lY3Rpb25CeUluZGV4KAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5HU01DYWxsCi1pbnQpCi0KLSB2b2lkIGhhbmd1cEZvcmVncm91bmRSZXN1bWVCYWNrZ3JvdW5kKCkKLQotIHZvaWQgaGFuZ3VwV2FpdGluZ09yQmFja2dyb3VuZCgpCi0KLXB1YmxpYyB2b2lkIHJlZ2lzdGVyRm9yVm9pY2VDYWxsRW5kZWQoCi1hbmRyb2lkLm9zLkhhbmRsZXIKLWludAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHZvaWQgcmVnaXN0ZXJGb3JWb2ljZUNhbGxTdGFydGVkKAotYW5kcm9pZC5vcy5IYW5kbGVyCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9DYWxsU3RhdGVFeGNlcHRpb247ICkKLSB2b2lkIHJlamVjdENhbGwoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQ2FsbFN0YXRlRXhjZXB0aW9uOyApCi0gdm9pZCBzZXBhcmF0ZSgKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uR1NNQ29ubmVjdGlvbikKLQotIHZvaWQgc2V0TXV0ZSgKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9DYWxsU3RhdGVFeGNlcHRpb247ICkKLSB2b2lkIHN3aXRjaFdhaXRpbmdPckhvbGRpbmdBbmRBY3RpdmUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0NvbW1hbmRFeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTY0MDkgbmFtZSA9RXJyb3IgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvRW51bTxMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Db21tYW5kRXhjZXB0aW9uJEVycm9yOz47ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkNvbW1hbmRFeGNlcHRpb24kRXJyb3IgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkNvbW1hbmRFeGNlcHRpb24kRXJyb3JbXSAkVkFMVUVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5Db21tYW5kRXhjZXB0aW9uJEVycm9yIEdFTkVSSUNfRkFJTFVSRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uQ29tbWFuZEV4Y2VwdGlvbiRFcnJvciBJTlZBTElEX1JFU1BPTlNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5Db21tYW5kRXhjZXB0aW9uJEVycm9yIE9QX05PVF9BTExPV0VEX0JFRk9SRV9SRUdfTlcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkNvbW1hbmRFeGNlcHRpb24kRXJyb3IgT1BfTk9UX0FMTE9XRURfRFVSSU5HX1ZPSUNFX0NBTEwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkNvbW1hbmRFeGNlcHRpb24kRXJyb3IgUEFTU1dPUkRfSU5DT1JSRUNUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5Db21tYW5kRXhjZXB0aW9uJEVycm9yIFJBRElPX05PVF9BVkFJTEFCTEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkNvbW1hbmRFeGNlcHRpb24kRXJyb3IgUkVRVUVTVF9OT1RfU1VQUE9SVEVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5Db21tYW5kRXhjZXB0aW9uJEVycm9yIFNJTV9QSU4yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5Db21tYW5kRXhjZXB0aW9uJEVycm9yIFNJTV9QVUsyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5Db21tYW5kRXhjZXB0aW9uJEVycm9yIFNNU19GQUlMX1JFVFJZCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpViApCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uQ29tbWFuZEV4Y2VwdGlvbiRFcnJvciB2YWx1ZU9mKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkNvbW1hbmRFeGNlcHRpb24kRXJyb3JbXSB2YWx1ZXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vQ29tbWFuZEV4Y2VwdGlvbiRFcnJvcjsgKQotcHVibGljIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uQ29tbWFuZEV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5Db21tYW5kRXhjZXB0aW9uJEVycm9yIGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkNvbW1hbmRFeGNlcHRpb24kRXJyb3IpCi0KLXB1YmxpYyBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5Db21tYW5kRXhjZXB0aW9uIGZyb21SaWxFcnJubygKLWludCkKLQotcHVibGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uQ29tbWFuZEV4Y2VwdGlvbiRFcnJvciBnZXRDb21tYW5kRXJyb3IoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0NvbW1hbmRzSW50ZXJmYWNlOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE2NDA5IG5hbWUgPVJhZGlvU3RhdGUgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvRW51bTxMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Db21tYW5kc0ludGVyZmFjZSRSYWRpb1N0YXRlOz47ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkNvbW1hbmRzSW50ZXJmYWNlJFJhZGlvU3RhdGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkNvbW1hbmRzSW50ZXJmYWNlJFJhZGlvU3RhdGVbXSAkVkFMVUVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5Db21tYW5kc0ludGVyZmFjZSRSYWRpb1N0YXRlIFJBRElPX09GRgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uQ29tbWFuZHNJbnRlcmZhY2UkUmFkaW9TdGF0ZSBSQURJT19VTkFWQUlMQUJMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uQ29tbWFuZHNJbnRlcmZhY2UkUmFkaW9TdGF0ZSBTSU1fTE9DS0VEX09SX0FCU0VOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uQ29tbWFuZHNJbnRlcmZhY2UkUmFkaW9TdGF0ZSBTSU1fTk9UX1JFQURZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5Db21tYW5kc0ludGVyZmFjZSRSYWRpb1N0YXRlIFNJTV9SRUFEWQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVYgKQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkNvbW1hbmRzSW50ZXJmYWNlJFJhZGlvU3RhdGUgdmFsdWVPZigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5Db21tYW5kc0ludGVyZmFjZSRSYWRpb1N0YXRlW10gdmFsdWVzKCkKLQotIGJvb2xlYW4gaXNBdmFpbGFibGUoKQotCi0gYm9vbGVhbiBpc09uKCkKLQotIGJvb2xlYW4gaXNTSU1SZWFkeSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vQ29tbWFuZHNJbnRlcmZhY2U7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTY0MDkgbmFtZSA9U2ltU3RhdHVzICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL0VudW08TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vQ29tbWFuZHNJbnRlcmZhY2UkU2ltU3RhdHVzOz47ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkNvbW1hbmRzSW50ZXJmYWNlJFNpbVN0YXR1cyBleHRlbmRzIGphdmEubGFuZy5FbnVtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uQ29tbWFuZHNJbnRlcmZhY2UkU2ltU3RhdHVzW10gJFZBTFVFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uQ29tbWFuZHNJbnRlcmZhY2UkU2ltU3RhdHVzIFNJTV9BQlNFTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkNvbW1hbmRzSW50ZXJmYWNlJFNpbVN0YXR1cyBTSU1fTkVUV09SS19QRVJTT05BTElaQVRJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkNvbW1hbmRzSW50ZXJmYWNlJFNpbVN0YXR1cyBTSU1fTk9UX1JFQURZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5Db21tYW5kc0ludGVyZmFjZSRTaW1TdGF0dXMgU0lNX1BJTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uQ29tbWFuZHNJbnRlcmZhY2UkU2ltU3RhdHVzIFNJTV9QVUsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkNvbW1hbmRzSW50ZXJmYWNlJFNpbVN0YXR1cyBTSU1fUkVBRFkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClWICkKLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5Db21tYW5kc0ludGVyZmFjZSRTaW1TdGF0dXMgdmFsdWVPZigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5Db21tYW5kc0ludGVyZmFjZSRTaW1TdGF0dXNbXSB2YWx1ZXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0RhdGFDb25uZWN0aW9uVHJhY2tlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uRGF0YUNvbm5lY3Rpb25UcmFja2VyJDEgZXh0ZW5kcyBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5EYXRhQ29ubmVjdGlvblRyYWNrZXIgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5EYXRhQ29ubmVjdGlvblRyYWNrZXIpCi0KLXB1YmxpYyB2b2lkIG9uUmVjZWl2ZSgKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLmNvbnRlbnQuSW50ZW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0RhdGFDb25uZWN0aW9uVHJhY2tlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uRGF0YUNvbm5lY3Rpb25UcmFja2VyJDIgZXh0ZW5kcyBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5EYXRhQ29ubmVjdGlvblRyYWNrZXIgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5EYXRhQ29ubmVjdGlvblRyYWNrZXIpCi0KLXB1YmxpYyB2b2lkIG9uUmVjZWl2ZSgKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLmNvbnRlbnQuSW50ZW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0RhdGFDb25uZWN0aW9uVHJhY2tlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uRGF0YUNvbm5lY3Rpb25UcmFja2VyJDMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5sYW5nLlJ1bm5hYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uRGF0YUNvbm5lY3Rpb25UcmFja2VyIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uRGF0YUNvbm5lY3Rpb25UcmFja2VyKQotCi1wdWJsaWMgdm9pZCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL0VudW08TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vRGF0YUNvbm5lY3Rpb25UcmFja2VyJEFjdGl2aXR5Oz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTY0MDggbmFtZSA9QWN0aXZpdHkgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vRGF0YUNvbm5lY3Rpb25UcmFja2VyOyApCi1maW5hbCBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkRhdGFDb25uZWN0aW9uVHJhY2tlciRBY3Rpdml0eSBleHRlbmRzIGphdmEubGFuZy5FbnVtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uRGF0YUNvbm5lY3Rpb25UcmFja2VyJEFjdGl2aXR5W10gJFZBTFVFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uRGF0YUNvbm5lY3Rpb25UcmFja2VyJEFjdGl2aXR5IERBVEFJTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uRGF0YUNvbm5lY3Rpb25UcmFja2VyJEFjdGl2aXR5IERBVEFJTkFORE9VVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uRGF0YUNvbm5lY3Rpb25UcmFja2VyJEFjdGl2aXR5IERBVEFPVVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkRhdGFDb25uZWN0aW9uVHJhY2tlciRBY3Rpdml0eSBOT05FCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpViApCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uRGF0YUNvbm5lY3Rpb25UcmFja2VyJEFjdGl2aXR5IHZhbHVlT2YoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uRGF0YUNvbm5lY3Rpb25UcmFja2VyJEFjdGl2aXR5W10gdmFsdWVzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTIgbmFtZSA9QXBuQ2hhbmdlT2JzZXJ2ZXIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vRGF0YUNvbm5lY3Rpb25UcmFja2VyOyApCi0gY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5EYXRhQ29ubmVjdGlvblRyYWNrZXIkQXBuQ2hhbmdlT2JzZXJ2ZXIgZXh0ZW5kcyBhbmRyb2lkLmRhdGFiYXNlLkNvbnRlbnRPYnNlcnZlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkRhdGFDb25uZWN0aW9uVHJhY2tlciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkRhdGFDb25uZWN0aW9uVHJhY2tlcikKLQotcHVibGljIHZvaWQgb25DaGFuZ2UoCi1ib29sZWFuKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0RhdGFDb25uZWN0aW9uVHJhY2tlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvRW51bTxMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9EYXRhQ29ubmVjdGlvblRyYWNrZXIkU3RhdGU7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNjQwOCBuYW1lID1TdGF0ZSApCi1maW5hbCBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkRhdGFDb25uZWN0aW9uVHJhY2tlciRTdGF0ZSBleHRlbmRzIGphdmEubGFuZy5FbnVtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uRGF0YUNvbm5lY3Rpb25UcmFja2VyJFN0YXRlW10gJFZBTFVFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uRGF0YUNvbm5lY3Rpb25UcmFja2VyJFN0YXRlIENPTk5FQ1RFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uRGF0YUNvbm5lY3Rpb25UcmFja2VyJFN0YXRlIENPTk5FQ1RJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkRhdGFDb25uZWN0aW9uVHJhY2tlciRTdGF0ZSBGQUlMRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkRhdGFDb25uZWN0aW9uVHJhY2tlciRTdGF0ZSBJRExFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5EYXRhQ29ubmVjdGlvblRyYWNrZXIkU3RhdGUgSU5JVElORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uRGF0YUNvbm5lY3Rpb25UcmFja2VyJFN0YXRlIFNDQU5OSU5HCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpViApCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uRGF0YUNvbm5lY3Rpb25UcmFja2VyJFN0YXRlIHZhbHVlT2YoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uRGF0YUNvbm5lY3Rpb25UcmFja2VyJFN0YXRlW10gdmFsdWVzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0RhdGFDb25uZWN0aW9uVHJhY2tlciRBcG5DaGFuZ2VPYnNlcnZlcjtMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9EYXRhQ29ubmVjdGlvblRyYWNrZXIkQWN0aXZpdHk7TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vRGF0YUNvbm5lY3Rpb25UcmFja2VyJFN0YXRlOyApCi1maW5hbCBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkRhdGFDb25uZWN0aW9uVHJhY2tlciBleHRlbmRzIGFuZHJvaWQub3MuSGFuZGxlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBpbnQgQVBOX0RFRkFVTFRfSUQKLQotcHJpdmF0ZSBzdGF0aWMgaW50IEFQTl9NTVNfSUQKLQotcHJpdmF0ZSBzdGF0aWMgaW50IEFQTl9OVU1fVFlQRVMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBUE5fUkVTVE9SRV9ERUxBWV9QUk9QX05BTUUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcKLQotc3RhdGljIGZpbmFsIGludCBFVkVOVF9EQVRBX1NFVFVQX0NPTVBMRVRFCi0KLXN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfRElTQ09OTkVDVF9ET05FCi0KLXN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfRU5BQkxFX05FV19BUE4KLQotc3RhdGljIGZpbmFsIGludCBFVkVOVF9HRVRfUERQX0xJU1RfQ09NUExFVEUKLQotc3RhdGljIGZpbmFsIGludCBFVkVOVF9HUFJTX0RFVEFDSEVECi0KLXN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfTElOS19TVEFURV9DSEFOR0VECi0KLXN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfUERQX1NUQVRFX0NIQU5HRUQKLQotc3RhdGljIGZpbmFsIGludCBFVkVOVF9QT0xMX1BEUAotCi1zdGF0aWMgZmluYWwgaW50IEVWRU5UX1JBRElPX0FWQUlMQUJMRQotCi1zdGF0aWMgZmluYWwgaW50IEVWRU5UX1JBRElPX09GRl9PUl9OT1RfQVZBSUxBQkxFCi0KLXN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfUkVDT1JEU19MT0FERUQKLQotc3RhdGljIGZpbmFsIGludCBFVkVOVF9SRVNUT1JFX0RFRkFVTFRfQVBOCi0KLXN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfUk9BTUlOR19PRkYKLQotc3RhdGljIGZpbmFsIGludCBFVkVOVF9ST0FNSU5HX09OCi0KLXN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfVFJZX1NFVFVQX0RBVEEKLQotc3RhdGljIGZpbmFsIGludCBFVkVOVF9WT0lDRV9DQUxMX0VOREVECi0KLXN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfVk9JQ0VfQ0FMTF9TVEFSVEVECi0KLXN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIElOVEVOVF9SRUNPTk5FQ1RfQUxBUk0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMT0dfVEFHCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOT19SRUNWX1BPTExfTElNSVQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5VTUJFUl9TRU5UX1BBQ0tFVFNfT0ZfSEFORwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUERQX0NPTk5FQ1RJT05fUE9PTF9TSVpFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQT0xMX0xPTkdFU1RfUlRUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQT0xMX05FVFNUQVRfTUlMTElTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQT0xMX05FVFNUQVRfU0xPV19NSUxMSVMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBPTExfUERQX01JTExJUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVDT05ORUNUX0RFTEFZX0lOSVRJQUxfTUlMTElTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVNUT1JFX0RFRkFVTFRfQVBOX0RFTEFZCi0KLSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkRhdGFDb25uZWN0aW9uVHJhY2tlciRBY3Rpdml0eSBhY3Rpdml0eQotCi0gYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyIGFsYXJtUmVjZWl2ZXIKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0FycmF5TGlzdDxMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9BcG5TZXR0aW5nOz47ICkKLXByaXZhdGUgamF2YS51dGlsLkFycmF5TGlzdCBhbGxBcG5zCi0KLXByaXZhdGUgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5EYXRhQ29ubmVjdGlvblRyYWNrZXIkQXBuQ2hhbmdlT2JzZXJ2ZXIgYXBuT2JzZXJ2ZXIKLQotIGludCBjaWRBY3RpdmUKLQotcHJpdmF0ZSBib29sZWFuW10gZGF0YUVuYWJsZWQKLQotIGJvb2xlYW4gZmFpbE5leHRDb25uZWN0Ci0KLXByaXZhdGUgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5BcG5TZXR0aW5nIG1BY3RpdmVBcG4KLQotcHJpdmF0ZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlBkcENvbm5lY3Rpb24gbUFjdGl2ZVBkcAotCi0gYW5kcm9pZC5vcy5IYW5kbGVyIG1EYXRhQ29ubmVjdGlvblRyYWNrZXIKLQotcHJpdmF0ZSBpbnQgbU5vUmVjdlBvbGxDb3VudAotCi0gamF2YS5sYW5nLlJ1bm5hYmxlIG1Qb2xsTmV0U3RhdAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbVJlcXVlc3RlZEFwblR5cGUKLQotIGJvb2xlYW4gbmV0U3RhdFBvbGxFbmFibGVkCi0KLSBpbnQgbmV0U3RhdFBvbGxQZXJpb2QKLQotIGFuZHJvaWQub3MuSU5ldFN0YXRTZXJ2aWNlIG5ldHN0YXQKLQotIGxvbmcgbmV4dFJlY29ubmVjdERlbGF5Ci0KLXByaXZhdGUgYm9vbGVhbiBub0F1dG9BdHRhY2gKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0FycmF5TGlzdDxMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9QZHBDb25uZWN0aW9uOz47ICkKLXByaXZhdGUgamF2YS51dGlsLkFycmF5TGlzdCBwZHBMaXN0Ci0KLSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkdTTVBob25lIHBob25lCi0KLSBpbnQgcnhQa3RzCi0KLSBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXIgc2NyZWVuT25PZmZSZWNlaXZlcgotCi0gaW50IHNlbnRTaW5jZUxhc3RSZWN2Ci0KLSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkRhdGFDb25uZWN0aW9uVHJhY2tlciRTdGF0ZSBzdGF0ZQotCi0gaW50IHR4UGt0cwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQXJyYXlMaXN0PExjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0FwblNldHRpbmc7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuQXJyYXlMaXN0IHdhaXRpbmdBcG5zCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi0gdm9pZCA8aW5pdD4oCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkdTTVBob25lKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMDAwKAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5EYXRhQ29ubmVjdGlvblRyYWNrZXIKLWJvb2xlYW4KLWphdmEubGFuZy5TdHJpbmcpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQxMDAoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkRhdGFDb25uZWN0aW9uVHJhY2tlcikKLQotc3RhdGljIHZvaWQgYWNjZXNzJDIwMCgKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uRGF0YUNvbm5lY3Rpb25UcmFja2VyKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMzAwKAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5EYXRhQ29ubmVjdGlvblRyYWNrZXIpCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQ0MDAoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkRhdGFDb25uZWN0aW9uVHJhY2tlcgotamF2YS5sYW5nLlN0cmluZykKLQotc3RhdGljIGludCBhY2Nlc3MkNTAwKAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5EYXRhQ29ubmVjdGlvblRyYWNrZXIpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDUwMigKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uRGF0YUNvbm5lY3Rpb25UcmFja2VyCi1pbnQpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDUwOCgKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uRGF0YUNvbm5lY3Rpb25UcmFja2VyKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkNjAwKAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5EYXRhQ29ubmVjdGlvblRyYWNrZXIKLWphdmEubGFuZy5TdHJpbmcpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQ3MDAoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkRhdGFDb25uZWN0aW9uVHJhY2tlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9BcnJheUxpc3Q8TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vQXBuU2V0dGluZzs+OylMamF2YS9sYW5nL1N0cmluZzsgKQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGFwbkxpc3RUb1N0cmluZygKLWphdmEudXRpbC5BcnJheUxpc3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0FycmF5TGlzdDxMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9BcG5TZXR0aW5nOz47ICkKLXByaXZhdGUgamF2YS51dGlsLkFycmF5TGlzdCBidWlsZFdhaXRpbmdBcG5zKCkKLQotcHJpdmF0ZSB2b2lkIGNsZWFuVXBDb25uZWN0aW9uKAotYm9vbGVhbgotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSB2b2lkIGNyZWF0ZUFsbEFwbkxpc3QoKQotCi1wcml2YXRlIHZvaWQgY3JlYXRlQWxsUGRwTGlzdCgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExhbmRyb2lkL2RhdGFiYXNlL0N1cnNvcjspTGphdmEvdXRpbC9BcnJheUxpc3Q8TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vQXBuU2V0dGluZzs+OyApCi1wcml2YXRlIGphdmEudXRpbC5BcnJheUxpc3QgY3JlYXRlQXBuTGlzdCgKLWFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yKQotCi1wcml2YXRlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uUGRwQ29ubmVjdGlvbiBmaW5kRnJlZVBkcCgpCi0KLXByaXZhdGUgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5BcG5TZXR0aW5nIGdldE5leHRBcG4oKQotCi1wcml2YXRlIGludCBnZXRSZXN0b3JlRGVmYXVsdEFwbkRlbGF5KCkKLQotcHJpdmF0ZSBib29sZWFuIGlzQXBuVHlwZUFjdGl2ZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgYm9vbGVhbiBpc0FwblR5cGVBdmFpbGFibGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIGJvb2xlYW4gaXNEYXRhQWxsb3dlZCgpCi0KLXByaXZhdGUgYm9vbGVhbiBpc0VuYWJsZWQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHZvaWQgbG9nKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSB2b2lkIG5vdGlmeURlZmF1bHREYXRhKCkKLQotcHJpdmF0ZSB2b2lkIG5vdGlmeU5vRGF0YSgKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uUGRwQ29ubmVjdGlvbiRQZHBGYWlsQ2F1c2UpCi0KLXByaXZhdGUgdm9pZCBvbkdwcnNEZXRhY2hlZCgpCi0KLXByaXZhdGUgdm9pZCBvblBkcFN0YXRlQ2hhbmdlZCgKLWFuZHJvaWQub3MuQXN5bmNSZXN1bHQKLWJvb2xlYW4pCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZ1tdIHBhcnNlVHlwZXMoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0FycmF5TGlzdDxMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9QRFBDb250ZXh0U3RhdGU7PjtJKVogKQotcHJpdmF0ZSBib29sZWFuIHBkcFN0YXRlc0hhc0FjdGl2ZUNJRCgKLWphdmEudXRpbC5BcnJheUxpc3QKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9BcnJheUxpc3Q8TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vUERQQ29udGV4dFN0YXRlOz47SSlaICkKLXByaXZhdGUgYm9vbGVhbiBwZHBTdGF0ZXNIYXNDSUQoCi1qYXZhLnV0aWwuQXJyYXlMaXN0Ci1pbnQpCi0KLXByaXZhdGUgdm9pZCByZWNvbm5lY3RBZnRlckZhaWwoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlBkcENvbm5lY3Rpb24kUGRwRmFpbENhdXNlKQotCi1wcml2YXRlIHZvaWQgcmVzZXRQb2xsU3RhdHMoKQotCi1wcml2YXRlIHZvaWQgcmVzdGFydFJhZGlvKCkKLQotcHJpdmF0ZSB2b2lkIHNldEVuYWJsZWQoCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuKQotCi1wcml2YXRlIGJvb2xlYW4gc2V0dXBEYXRhKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSB2b2lkIHNldHVwRG5zUHJvcGVydGllcygpCi0KLXByaXZhdGUgYm9vbGVhbiBzaG91bGRQb3N0Tm90aWZpY2F0aW9uKAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5QZHBDb25uZWN0aW9uJFBkcEZhaWxDYXVzZSkKLQotcHJpdmF0ZSB2b2lkIHN0YXJ0TmV0U3RhdFBvbGwoKQotCi1wcml2YXRlIHZvaWQgc3RhcnRQZXJpb2RpY1BkcFBvbGwoKQotCi1wcml2YXRlIHZvaWQgc3RvcE5ldFN0YXRQb2xsKCkKLQotcHJpdmF0ZSBib29sZWFuIHRyeU5leHRBcG4oCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlBkcENvbm5lY3Rpb24kUGRwRmFpbENhdXNlKQotCi1wcml2YXRlIGJvb2xlYW4gdHJ5U2V0dXBEYXRhKAotamF2YS5sYW5nLlN0cmluZykKLQotIGludCBkaXNhYmxlQXBuVHlwZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLSBpbnQgZW5hYmxlQXBuVHlwZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLSBqYXZhLmxhbmcuU3RyaW5nIGdldEFjdGl2ZUFwblN0cmluZygpCi0KLSBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0QWN0aXZlQXBuVHlwZXMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9BcnJheUxpc3Q8TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vUGRwQ29ubmVjdGlvbjs+OyApCi1wdWJsaWMgamF2YS51dGlsLkFycmF5TGlzdCBnZXRBbGxQZHBzKCkKLQotcHVibGljIGJvb2xlYW4gZ2V0QW55RGF0YUVuYWJsZWQoKQotCi1wdWJsaWMgYm9vbGVhbiBnZXREYXRhRW5hYmxlZCgpCi0KLXB1YmxpYyBib29sZWFuIGdldERhdGFPblJvYW1pbmdFbmFibGVkKCkKLQotIGphdmEubGFuZy5TdHJpbmdbXSBnZXREbnNTZXJ2ZXJzKAotamF2YS5sYW5nLlN0cmluZykKLQotIGphdmEubGFuZy5TdHJpbmcgZ2V0R2F0ZXdheSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLSBqYXZhLmxhbmcuU3RyaW5nIGdldEludGVyZmFjZU5hbWUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi0gamF2YS5sYW5nLlN0cmluZyBnZXRJcEFkZHJlc3MoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgYm9vbGVhbiBzZXREYXRhRW5hYmxlZCgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldERhdGFPblJvYW1pbmdFbmFibGVkKAotYm9vbGVhbikKLQotIHZvaWQgc2V0U3RhdGUoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkRhdGFDb25uZWN0aW9uVHJhY2tlciRTdGF0ZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0RhdGFMaW5rSW50ZXJmYWNlJExpbmtTdGF0ZTsgKQotYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uRGF0YUxpbmtJbnRlcmZhY2UgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYSVRfT0sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhJVF9PUEVOX0ZBSUxFRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGNvbm5lY3QoKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBkaXNjb25uZWN0KCkKLQotcHVibGljIGFic3RyYWN0IGludCBnZXRMYXN0TGlua0V4aXRDb2RlKCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0T25MaW5rQ2hhbmdlKAotYW5kcm9pZC5vcy5IYW5kbGVyCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFBhc3N3b3JkSW5mbygKLWFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotYWJzdHJhY3QgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5EYXRhTGluayBleHRlbmRzIGFuZHJvaWQub3MuSGFuZGxlciBpbXBsZW1lbnRzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uRGF0YUxpbmtJbnRlcmZhY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uRGF0YUNvbm5lY3Rpb25UcmFja2VyIGRhdGFDb25uZWN0aW9uCi0KLSBhbmRyb2lkLm9zLlJlZ2lzdHJhbnQgbUxpbmtDaGFuZ2VSZWdpc3RyYW50Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5EYXRhQ29ubmVjdGlvblRyYWNrZXIpCi0KLXB1YmxpYyB2b2lkIHNldE9uTGlua0NoYW5nZSgKLWFuZHJvaWQub3MuSGFuZGxlcgotaW50Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL0VudW08TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vRGF0YUxpbmtJbnRlcmZhY2UkTGlua1N0YXRlOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTY0MDkgbmFtZSA9TGlua1N0YXRlICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0RhdGFMaW5rSW50ZXJmYWNlOyApCi1wdWJsaWMgZmluYWwgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5EYXRhTGlua0ludGVyZmFjZSRMaW5rU3RhdGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkRhdGFMaW5rSW50ZXJmYWNlJExpbmtTdGF0ZVtdICRWQUxVRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkRhdGFMaW5rSW50ZXJmYWNlJExpbmtTdGF0ZSBMSU5LX0RPV04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkRhdGFMaW5rSW50ZXJmYWNlJExpbmtTdGF0ZSBMSU5LX0VYSVRFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uRGF0YUxpbmtJbnRlcmZhY2UkTGlua1N0YXRlIExJTktfVU5LTk9XTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uRGF0YUxpbmtJbnRlcmZhY2UkTGlua1N0YXRlIExJTktfVVAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClWICkKLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5EYXRhTGlua0ludGVyZmFjZSRMaW5rU3RhdGUgdmFsdWVPZigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5EYXRhTGlua0ludGVyZmFjZSRMaW5rU3RhdGVbXSB2YWx1ZXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0RyaXZlckNhbGw7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTY0MDkgbmFtZSA9U3RhdGUgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvRW51bTxMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Ecml2ZXJDYWxsJFN0YXRlOz47ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkRyaXZlckNhbGwkU3RhdGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkRyaXZlckNhbGwkU3RhdGVbXSAkVkFMVUVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5Ecml2ZXJDYWxsJFN0YXRlIEFDVElWRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uRHJpdmVyQ2FsbCRTdGF0ZSBBTEVSVElORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uRHJpdmVyQ2FsbCRTdGF0ZSBESUFMSU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5Ecml2ZXJDYWxsJFN0YXRlIEhPTERJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkRyaXZlckNhbGwkU3RhdGUgSU5DT01JTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkRyaXZlckNhbGwkU3RhdGUgV0FJVElORwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVYgKQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkRyaXZlckNhbGwkU3RhdGUgdmFsdWVPZigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5Ecml2ZXJDYWxsJFN0YXRlW10gdmFsdWVzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0RyaXZlckNhbGwkU3RhdGU7ICkKLXB1YmxpYyBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkRyaXZlckNhbGwgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5sYW5nLkNvbXBhcmFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTE9HX1RBRwotCi1wdWJsaWMgaW50IFRPQQotCi1wdWJsaWMgaW50IGFscwotCi1wdWJsaWMgaW50IGluZGV4Ci0KLXB1YmxpYyBib29sZWFuIGlzTVQKLQotcHVibGljIGJvb2xlYW4gaXNNcHR5Ci0KLXB1YmxpYyBib29sZWFuIGlzVm9pY2UKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgbnVtYmVyCi0KLXB1YmxpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkRyaXZlckNhbGwkU3RhdGUgc3RhdGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1zdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5Ecml2ZXJDYWxsIGZyb21DTENDTGluZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9BVFBhcnNlRXg7ICkKLXB1YmxpYyBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5Ecml2ZXJDYWxsJFN0YXRlIHN0YXRlRnJvbUNMQ0MoCi1pbnQpCi0KLXB1YmxpYyBpbnQgY29tcGFyZVRvKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uRW5jb2RlRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLkV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWNoYXIpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID00MTA0IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR1NNQ2FsbDsgKQotIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uR1NNQ2FsbCQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgaW50W10gJFN3aXRjaE1hcCRjb20kYW5kcm9pZCRpbnRlcm5hbCR0ZWxlcGhvbnkkZ3NtJERyaXZlckNhbGwkU3RhdGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9HU01DYWxsJDE7ICkKLSBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkdTTUNhbGwgZXh0ZW5kcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ2FsbAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQXJyYXlMaXN0PExjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQ29ubmVjdGlvbjs+OyApCi0gamF2YS51dGlsLkFycmF5TGlzdCBjb25uZWN0aW9ucwotCi0gY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5DYWxsVHJhY2tlciBvd25lcgotCi0gY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNhbGwkU3RhdGUgc3RhdGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkNhbGxUcmFja2VyKQotCi1zdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNhbGwkU3RhdGUgc3RhdGVGcm9tRENTdGF0ZSgKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uRHJpdmVyQ2FsbCRTdGF0ZSkKLQotIHZvaWQgYXR0YWNoKAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5HU01Db25uZWN0aW9uCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkRyaXZlckNhbGwpCi0KLSB2b2lkIGF0dGFjaEZha2UoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkdTTUNvbm5lY3Rpb24KLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5DYWxsJFN0YXRlKQotCi0gdm9pZCBjbGVhckRpc2Nvbm5lY3RlZCgpCi0KLSB2b2lkIGNvbm5lY3Rpb25EaXNjb25uZWN0ZWQoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkdTTUNvbm5lY3Rpb24pCi0KLSB2b2lkIGRldGFjaCgKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uR1NNQ29ubmVjdGlvbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvTGlzdDxMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0Nvbm5lY3Rpb247PjsgKQotcHVibGljIGphdmEudXRpbC5MaXN0IGdldENvbm5lY3Rpb25zKCkKLQotcHVibGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZSBnZXRQaG9uZSgpCi0KLXB1YmxpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ2FsbCRTdGF0ZSBnZXRTdGF0ZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9DYWxsU3RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGhhbmd1cCgpCi0KLSBib29sZWFuIGlzRnVsbCgpCi0KLXB1YmxpYyBib29sZWFuIGlzTXVsdGlwYXJ0eSgpCi0KLSB2b2lkIG9uSGFuZ3VwTG9jYWwoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLSBib29sZWFuIHVwZGF0ZSgKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uR1NNQ29ubmVjdGlvbgotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5Ecml2ZXJDYWxsKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dTTUNvbm5lY3Rpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9NDEwNCBuYW1lID1udWxsICkKLSBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkdTTUNvbm5lY3Rpb24kMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIGludFtdICRTd2l0Y2hNYXAkY29tJGFuZHJvaWQkaW50ZXJuYWwkdGVsZXBob255JGdzbSREcml2ZXJDYWxsJFN0YXRlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1NeUhhbmRsZXIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR1NNQ29ubmVjdGlvbjsgKQotIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uR1NNQ29ubmVjdGlvbiRNeUhhbmRsZXIgZXh0ZW5kcyBhbmRyb2lkLm9zLkhhbmRsZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5HU01Db25uZWN0aW9uIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uR1NNQ29ubmVjdGlvbgotYW5kcm9pZC5vcy5Mb29wZXIpCi0KLXB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9HU01Db25uZWN0aW9uJDE7TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR1NNQ29ubmVjdGlvbiRNeUhhbmRsZXI7ICkKLXB1YmxpYyBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkdTTUNvbm5lY3Rpb24gZXh0ZW5kcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ29ubmVjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgaW50IEVWRU5UX0RUTUZfRE9ORQotCi1zdGF0aWMgZmluYWwgaW50IEVWRU5UX05FWFRfUE9TVF9ESUFMCi0KLXN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfUEFVU0VfRE9ORQotCi1zdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMT0dfVEFHCi0KLXN0YXRpYyBmaW5hbCBpbnQgUEFVU0VfREVMQVlfRklSU1RfTUlMTElTCi0KLXN0YXRpYyBmaW5hbCBpbnQgUEFVU0VfREVMQVlfTUlMTElTCi0KLSBqYXZhLmxhbmcuU3RyaW5nIGFkZHJlc3MKLQotIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Db25uZWN0aW9uJERpc2Nvbm5lY3RDYXVzZSBjYXVzZQotCi0gbG9uZyBjb25uZWN0VGltZQotCi0gbG9uZyBjb25uZWN0VGltZVJlYWwKLQotIGxvbmcgY3JlYXRlVGltZQotCi0gamF2YS5sYW5nLlN0cmluZyBkaWFsU3RyaW5nCi0KLSBsb25nIGRpc2Nvbm5lY3RUaW1lCi0KLSBib29sZWFuIGRpc2Nvbm5lY3RlZAotCi0gbG9uZyBkdXJhdGlvbgotCi0gYW5kcm9pZC5vcy5IYW5kbGVyIGgKLQotIGxvbmcgaG9sZGluZ1N0YXJ0VGltZQotCi0gaW50IGluZGV4Ci0KLSBib29sZWFuIGlzSW5jb21pbmcKLQotIGludCBuZXh0UG9zdERpYWxDaGFyCi0KLSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkNhbGxUcmFja2VyIG93bmVyCi0KLSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkdTTUNhbGwgcGFyZW50Ci0KLSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ29ubmVjdGlvbiRQb3N0RGlhbFN0YXRlIHBvc3REaWFsU3RhdGUKLQotIGphdmEubGFuZy5TdHJpbmcgcG9zdERpYWxTdHJpbmcKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkRyaXZlckNhbGwKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uQ2FsbFRyYWNrZXIKLWludCkKLQotIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5DYWxsVHJhY2tlcgotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5HU01DYWxsKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMDAwKAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5HU01Db25uZWN0aW9uKQotCi1zdGF0aWMgYm9vbGVhbiBlcXVhbHNIYW5kbGVzTnVsbHMoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wcml2YXRlIGJvb2xlYW4gaXNDb25uZWN0aW5nSW5Pck91dCgpCi0KLXByaXZhdGUgdm9pZCBsb2coCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHZvaWQgb25TdGFydGVkSG9sZGluZygpCi0KLXByaXZhdGUgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5HU01DYWxsIHBhcmVudEZyb21EQ1N0YXRlKAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5Ecml2ZXJDYWxsJFN0YXRlKQotCi1wcml2YXRlIHZvaWQgcHJvY2Vzc05leHRQb3N0RGlhbENoYXIoKQotCi1wcml2YXRlIGJvb2xlYW4gcHJvY2Vzc1Bvc3REaWFsQ2hhcigKLWNoYXIpCi0KLXB1YmxpYyB2b2lkIGNhbmNlbFBvc3REaWFsKCkKLQotIGJvb2xlYW4gY29tcGFyZVRvKAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5Ecml2ZXJDYWxsKQotCi0gY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNvbm5lY3Rpb24kRGlzY29ubmVjdENhdXNlIGRpc2Nvbm5lY3RDYXVzZUZyb21Db2RlKAotaW50KQotCi0gdm9pZCBmYWtlSG9sZEJlZm9yZURpYWwoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRBZGRyZXNzKCkKLQotcHVibGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5DYWxsIGdldENhbGwoKQotCi1wdWJsaWMgbG9uZyBnZXRDb25uZWN0VGltZSgpCi0KLXB1YmxpYyBsb25nIGdldENyZWF0ZVRpbWUoKQotCi1wdWJsaWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNvbm5lY3Rpb24kRGlzY29ubmVjdENhdXNlIGdldERpc2Nvbm5lY3RDYXVzZSgpCi0KLXB1YmxpYyBsb25nIGdldERpc2Nvbm5lY3RUaW1lKCkKLQotcHVibGljIGxvbmcgZ2V0RHVyYXRpb25NaWxsaXMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQ2FsbFN0YXRlRXhjZXB0aW9uOyApCi0gaW50IGdldEdTTUluZGV4KCkKLQotcHVibGljIGxvbmcgZ2V0SG9sZER1cmF0aW9uTWlsbGlzKCkKLQotcHVibGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Db25uZWN0aW9uJFBvc3REaWFsU3RhdGUgZ2V0UG9zdERpYWxTdGF0ZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFJlbWFpbmluZ1Bvc3REaWFsU3RyaW5nKCkKLQotcHVibGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5DYWxsJFN0YXRlIGdldFN0YXRlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0NhbGxTdGF0ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgaGFuZ3VwKCkKLQotcHVibGljIGJvb2xlYW4gaXNJbmNvbWluZygpCi0KLSB2b2lkIG9uQ29ubmVjdGVkSW5Pck91dCgpCi0KLSB2b2lkIG9uRGlzY29ubmVjdCgKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Db25uZWN0aW9uJERpc2Nvbm5lY3RDYXVzZSkKLQotIHZvaWQgb25IYW5ndXBMb2NhbCgpCi0KLSB2b2lkIG9uUmVtb3RlRGlzY29ubmVjdCgKLWludCkKLQotcHVibGljIHZvaWQgcHJvY2VlZEFmdGVyV2FpdENoYXIoKQotCi1wdWJsaWMgdm9pZCBwcm9jZWVkQWZ0ZXJXaWxkQ2hhcigKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9DYWxsU3RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNlcGFyYXRlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi0gYm9vbGVhbiB1cGRhdGUoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkRyaXZlckNhbGwpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR1NNUGhvbmU7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9NDEwNCBuYW1lID1udWxsICkKLSBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkdTTVBob25lJDIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBmaW5hbCBpbnRbXSAkU3dpdGNoTWFwJGNvbSRhbmRyb2lkJGludGVybmFsJHRlbGVwaG9ueSRQaG9uZSREYXRhU3RhdGUKLQotc3RhdGljIGZpbmFsIGludFtdICRTd2l0Y2hNYXAkY29tJGFuZHJvaWQkaW50ZXJuYWwkdGVsZXBob255JGdzbSREYXRhQ29ubmVjdGlvblRyYWNrZXIkQWN0aXZpdHkKLQotc3RhdGljIGZpbmFsIGludFtdICRTd2l0Y2hNYXAkY29tJGFuZHJvaWQkaW50ZXJuYWwkdGVsZXBob255JGdzbSREYXRhQ29ubmVjdGlvblRyYWNrZXIkU3RhdGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPU15SGFuZGxlciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9HU01QaG9uZTsgKQotIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uR1NNUGhvbmUkTXlIYW5kbGVyIGV4dGVuZHMgYW5kcm9pZC5vcy5IYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uR1NNUGhvbmUgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5HU01QaG9uZSkKLQotIHZvaWQgPGluaXQ+KAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5HU01QaG9uZQotYW5kcm9pZC5vcy5Mb29wZXIpCi0KLXB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1OZXR3b3JrU2VsZWN0TWVzc2FnZSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9HU01QaG9uZTsgKQotIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uR1NNUGhvbmUkTmV0d29ya1NlbGVjdE1lc3NhZ2UgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhbmRyb2lkLm9zLk1lc3NhZ2UgbWVzc2FnZQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBvcGVyYXRvck51bWVyaWMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5HU01QaG9uZSQxKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR1NNUGhvbmUkMjtMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9HU01QaG9uZSRNeUhhbmRsZXI7TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR1NNUGhvbmUkTmV0d29ya1NlbGVjdE1lc3NhZ2U7ICkKLXB1YmxpYyBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkdTTVBob25lIGV4dGVuZHMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lQmFzZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ0lQSEVSSU5HX0tFWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ0xJUl9LRVkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERBVEFfRElTQUJMRURfT05fQk9PVF9LRVkKLQotc3RhdGljIGZpbmFsIGludCBFVkVOVF9DQUxMX1JJTkcKLQotc3RhdGljIGZpbmFsIGludCBFVkVOVF9HRVRfQkFTRUJBTkRfVkVSU0lPTl9ET05FCi0KLXN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfR0VUX0NBTExfRk9SV0FSRF9ET05FCi0KLXN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfR0VUX0lNRUlTVl9ET05FCi0KLXN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfR0VUX0lNRUlfRE9ORQotCi1zdGF0aWMgZmluYWwgaW50IEVWRU5UX0dFVF9TSU1fU1RBVFVTX0RPTkUKLQotc3RhdGljIGZpbmFsIGludCBFVkVOVF9NTUlfRE9ORQotCi1zdGF0aWMgZmluYWwgaW50IEVWRU5UX1JBRElPX0FWQUlMQUJMRQotCi1zdGF0aWMgZmluYWwgaW50IEVWRU5UX1JBRElPX09GRl9PUl9OT1RfQVZBSUxBQkxFCi0KLXN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfUkFESU9fT04KLQotc3RhdGljIGZpbmFsIGludCBFVkVOVF9SRUdJU1RFUkVEX1RPX05FVFdPUksKLQotc3RhdGljIGZpbmFsIGludCBFVkVOVF9TRVRfQ0FMTF9GT1JXQVJEX0RPTkUKLQotc3RhdGljIGZpbmFsIGludCBFVkVOVF9TRVRfQ0xJUl9DT01QTEVURQotCi1zdGF0aWMgZmluYWwgaW50IEVWRU5UX1NFVF9ORVRXT1JLX0FVVE9NQVRJQ19DT01QTEVURQotCi1zdGF0aWMgZmluYWwgaW50IEVWRU5UX1NFVF9ORVRXT1JLX01BTlVBTF9DT01QTEVURQotCi1zdGF0aWMgZmluYWwgaW50IEVWRU5UX1NJTV9SRUNPUkRTX0xPQURFRAotCi1zdGF0aWMgZmluYWwgaW50IEVWRU5UX1NTTgotCi1zdGF0aWMgZmluYWwgaW50IEVWRU5UX1VTU0QKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0NBTF9ERUJVRwotCi1zdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMT0dfVEFHCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBORVRXT1JLX1NFTEVDVElPTl9LRVkKLQotIGphdmEubGFuZy5UaHJlYWQgZGVidWdQb3J0VGhyZWFkCi0KLSBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQgZGVidWdTb2NrZXQKLQotIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uR1NNUGhvbmUkTXlIYW5kbGVyIGgKLQotIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uQ29tbWFuZHNJbnRlcmZhY2UgbUNNCi0KLSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkNhbGxUcmFja2VyIG1DVAotCi0gY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5EYXRhQ29ubmVjdGlvblRyYWNrZXIgbURhdGFDb25uZWN0aW9uCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtSW1laQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbUltZWlTdgotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQXJyYXlMaXN0PExjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbU1taUNvZGU7PjsgKQotIGphdmEudXRpbC5BcnJheUxpc3QgbVBlbmRpbmdNTUlzCi0KLSBhbmRyb2lkLm9zLlJlZ2lzdHJhbnQgbVBvc3REaWFsSGFuZGxlcgotCi1wcml2YXRlIGludCBtUmVwb3J0ZWRBdHRlbXB0ZWRDb25uZWN0cwotCi1wcml2YXRlIGludCBtUmVwb3J0ZWRSYWRpb1Jlc2V0cwotCi1wcml2YXRlIGludCBtUmVwb3J0ZWRTdWNjZXNzZnVsQ29ubmVjdHMKLQotIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uU0lNRmlsZUhhbmRsZXIgbVNJTUZpbGVIYW5kbGVyCi0KLSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlNJTVJlY29yZHMgbVNJTVJlY29yZHMKLQotIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uU01TRGlzcGF0Y2hlciBtU01TCi0KLSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlNlcnZpY2VTdGF0ZVRyYWNrZXIgbVNTVAotCi0gY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5Hc21TaW1DYXJkIG1TaW1DYXJkCi0KLSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlNpbVBob25lQm9va0ludGVyZmFjZU1hbmFnZXIgbVNpbVBob25lQm9va0ludE1hbmFnZXIKLQotIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uU2ltU21zSW50ZXJmYWNlTWFuYWdlciBtU2ltU21zSW50TWFuYWdlcgotCi0gYW5kcm9pZC5vcy5SZWdpc3RyYW50TGlzdCBtU3NuUmVnaXN0cmFudHMKLQotIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlNlcnZpY2UgbVN0a1NlcnZpY2UKLQotIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZVN1YkluZm8gbVN1YkluZm8KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5Db21tYW5kc0ludGVyZmFjZQotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lTm90aWZpZXIpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkNvbW1hbmRzSW50ZXJmYWNlCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmVOb3RpZmllcgotYm9vbGVhbikKLQotc3RhdGljIHZvaWQgYWNjZXNzJDEwMCgKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uR1NNUGhvbmUpCi0KLXN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBhY2Nlc3MkMjAwKAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5HU01QaG9uZSkKLQotc3RhdGljIGphdmEubGFuZy5TdHJpbmcgYWNjZXNzJDMwMigKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uR1NNUGhvbmUKLWphdmEubGFuZy5TdHJpbmcpCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGFjY2VzcyQ0MDIoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkdTTVBob25lCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkNTAwKAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5HU01QaG9uZQotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkNjAwKAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5HU01QaG9uZQotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5DYWxsRm9yd2FyZEluZm9bXSkKLQotc3RhdGljIHZvaWQgYWNjZXNzJDcwMCgKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uR1NNUGhvbmUKLWFuZHJvaWQub3MuQXN5bmNSZXN1bHQpCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBnZXRTYXZlZE5ldHdvcmtTZWxlY3Rpb24oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQ2FsbFN0YXRlRXhjZXB0aW9uOyApCi1wcml2YXRlIGJvb2xlYW4gaGFuZGxlQ2FsbERlZmxlY3Rpb25JbmNhbGxTdXBwbGVtZW50YXJ5U2VydmljZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9DYWxsU3RhdGVFeGNlcHRpb247ICkKLXByaXZhdGUgYm9vbGVhbiBoYW5kbGVDYWxsSG9sZEluY2FsbFN1cHBsZW1lbnRhcnlTZXJ2aWNlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0NhbGxTdGF0ZUV4Y2VwdGlvbjsgKQotcHJpdmF0ZSBib29sZWFuIGhhbmRsZUNhbGxXYWl0aW5nSW5jYWxsU3VwcGxlbWVudGFyeVNlcnZpY2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQ2FsbFN0YXRlRXhjZXB0aW9uOyApCi1wcml2YXRlIGJvb2xlYW4gaGFuZGxlQ2Nic0luY2FsbFN1cHBsZW1lbnRhcnlTZXJ2aWNlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSB2b2lkIGhhbmRsZUNmdVF1ZXJ5UmVzdWx0KAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5DYWxsRm9yd2FyZEluZm9bXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0NhbGxTdGF0ZUV4Y2VwdGlvbjsgKQotcHJpdmF0ZSBib29sZWFuIGhhbmRsZUVjdEluY2FsbFN1cHBsZW1lbnRhcnlTZXJ2aWNlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0NhbGxTdGF0ZUV4Y2VwdGlvbjsgKQotcHJpdmF0ZSBib29sZWFuIGhhbmRsZU11bHRpcGFydHlJbmNhbGxTdXBwbGVtZW50YXJ5U2VydmljZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgdm9pZCBoYW5kbGVTZXRTZWxlY3ROZXR3b3JrKAotYW5kcm9pZC5vcy5Bc3luY1Jlc3VsdCkKLQotcHJpdmF0ZSBib29sZWFuIGlzQ2ZFbmFibGUoCi1pbnQpCi0KLXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkQ29tbWFuZEludGVyZmFjZUNGQWN0aW9uKAotaW50KQotCi1wcml2YXRlIGJvb2xlYW4gaXNWYWxpZENvbW1hbmRJbnRlcmZhY2VDRlJlYXNvbigKLWludCkKLQotcHJpdmF0ZSB2b2lkIG9uSW5jb21pbmdVU1NEKAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHZvaWQgb25OZXR3b3JrSW5pdGlhdGVkVXNzZCgKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uR3NtTW1pQ29kZSkKLQotcHJpdmF0ZSB2b2lkIHN5bmNDbGlyU2V0dGluZygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9DYWxsU3RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGFjY2VwdENhbGwoKQotCi1wdWJsaWMgYm9vbGVhbiBjYW5Db25mZXJlbmNlKCkKLQotcHVibGljIGJvb2xlYW4gY2FuRGlhbCgpCi0KLXB1YmxpYyBib29sZWFuIGNhblRyYW5zZmVyKCkKLQotcHVibGljIHZvaWQgY2xlYXJEaXNjb25uZWN0ZWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQ2FsbFN0YXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjb25mZXJlbmNlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0NhbGxTdGF0ZUV4Y2VwdGlvbjsgKQotcHVibGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Db25uZWN0aW9uIGRpYWwoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgaW50IGRpc2FibGVBcG5UeXBlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJvb2xlYW4gZGlzYWJsZURhdGFDb25uZWN0aXZpdHkoKQotCi1wdWJsaWMgdm9pZCBkaXNhYmxlTG9jYXRpb25VcGRhdGVzKCkKLQotcHVibGljIGludCBlbmFibGVBcG5UeXBlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJvb2xlYW4gZW5hYmxlRGF0YUNvbm5lY3Rpdml0eSgpCi0KLXB1YmxpYyB2b2lkIGVuYWJsZUxvY2F0aW9uVXBkYXRlcygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9DYWxsU3RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGV4cGxpY2l0Q2FsbFRyYW5zZmVyKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QWN0aXZlQXBuKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBnZXRBY3RpdmVBcG5UeXBlcygpCi0KLXB1YmxpYyB2b2lkIGdldEF2YWlsYWJsZU5ldHdvcmtzKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNhbGwgZ2V0QmFja2dyb3VuZENhbGwoKQotCi1wdWJsaWMgYm9vbGVhbiBnZXRDYWxsRm9yd2FyZGluZ0luZGljYXRvcigpCi0KLXB1YmxpYyB2b2lkIGdldENhbGxGb3J3YXJkaW5nT3B0aW9uKAotaW50Ci1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIGdldENhbGxXYWl0aW5nKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgYW5kcm9pZC50ZWxlcGhvbnkuQ2VsbExvY2F0aW9uIGdldENlbGxMb2NhdGlvbigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0xpc3Q8TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vUGRwQ29ubmVjdGlvbjs+OyApCi1wdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0Q3VycmVudFBkcExpc3QoKQotCi1wdWJsaWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lJERhdGFBY3Rpdml0eVN0YXRlIGdldERhdGFBY3Rpdml0eVN0YXRlKCkKLQotcHVibGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZSREYXRhU3RhdGUgZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZSgpCi0KLXB1YmxpYyBib29sZWFuIGdldERhdGFSb2FtaW5nRW5hYmxlZCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldERldmljZUlkKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RGV2aWNlU3ZuKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBnZXREbnNTZXJ2ZXJzKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5DYWxsIGdldEZvcmVncm91bmRDYWxsKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0R2F0ZXdheSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEludGVyZmFjZU5hbWUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJcEFkZHJlc3MoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRMaW5lMUFscGhhVGFnKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TGluZTFOdW1iZXIoKQotCi1wdWJsaWMgYm9vbGVhbiBnZXRNZXNzYWdlV2FpdGluZ0luZGljYXRvcigpCi0KLXB1YmxpYyBib29sZWFuIGdldE11dGUoKQotCi1wdWJsaWMgdm9pZCBnZXROZWlnaGJvcmluZ0NpZHMoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIGdldE91dGdvaW5nQ2FsbGVySWREaXNwbGF5KAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBnZXRQZHBDb250ZXh0TGlzdCgKLWFuZHJvaWQub3MuTWVzc2FnZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvTGlzdDwrTGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9NbWlDb2RlOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRQZW5kaW5nTW1pQ29kZXMoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRQaG9uZU5hbWUoKQotCi1wdWJsaWMgdm9pZCBnZXRQcmVmZXJyZWROZXR3b3JrVHlwZSgKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5DYWxsIGdldFJpbmdpbmdDYWxsKCkKLQotcHVibGljIGFuZHJvaWQudGVsZXBob255LlNlcnZpY2VTdGF0ZSBnZXRTZXJ2aWNlU3RhdGUoKQotCi1wdWJsaWMgaW50IGdldFNpZ25hbFN0cmVuZ3RoQVNVKCkKLQotcHVibGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TaW1DYXJkIGdldFNpbUNhcmQoKQotCi1wdWJsaWMgYm9vbGVhbiBnZXRTaW1SZWNvcmRzTG9hZGVkKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U2ltU2VyaWFsTnVtYmVyKCkKLQotcHVibGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZSRTdGF0ZSBnZXRTdGF0ZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN1YnNjcmliZXJJZCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFZvaWNlTWFpbEFscGhhVGFnKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Vm9pY2VNYWlsTnVtYmVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0NhbGxTdGF0ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gaGFuZGxlSW5DYWxsTW1pQ29tbWFuZHMoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYm9vbGVhbiBoYW5kbGVQaW5NbWkoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBpbnZva2VPZW1SaWxSZXF1ZXN0UmF3KAotYnl0ZVtdCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIGludm9rZU9lbVJpbFJlcXVlc3RTdHJpbmdzKAotamF2YS5sYW5nLlN0cmluZ1tdCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyBib29sZWFuIGlzRGF0YUNvbm5lY3Rpdml0eVBvc3NpYmxlKCkKLQotIGJvb2xlYW4gaXNJbkNhbGwoKQotCi0gdm9pZCBub3RpZnlDYWxsRm9yd2FyZGluZ0luZGljYXRvcigpCi0KLSB2b2lkIG5vdGlmeUNhbGxTdGF0ZUNoYW5nZWQoKQotCi0gdm9pZCBub3RpZnlEYXRhQWN0aXZpdHkoKQotCi0gdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbigKLWphdmEubGFuZy5TdHJpbmcpCi0KLSB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKAotamF2YS5sYW5nLlN0cmluZykKLQotIHZvaWQgbm90aWZ5RGlzY29ubmVjdCgKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Db25uZWN0aW9uKQotCi0gdm9pZCBub3RpZnlJbmNvbWluZ1JpbmcoKQotCi0gdm9pZCBub3RpZnlMb2NhdGlvbkNoYW5nZWQoKQotCi0gdm9pZCBub3RpZnlNZXNzYWdlV2FpdGluZ0luZGljYXRvcigpCi0KLSB2b2lkIG5vdGlmeU5ld1JpbmdpbmdDb25uZWN0aW9uKAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNvbm5lY3Rpb24pCi0KLSB2b2lkIG5vdGlmeVBob25lU3RhdGVDaGFuZ2VkKCkKLQotIHZvaWQgbm90aWZ5U2VydmljZVN0YXRlQ2hhbmdlZCgKLWFuZHJvaWQudGVsZXBob255LlNlcnZpY2VTdGF0ZSkKLQotIHZvaWQgbm90aWZ5U2lnbmFsU3RyZW5ndGgoKQotCi0gdm9pZCBub3RpZnlTdXBwU2VydmljZUZhaWxlZCgKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZSRTdXBwU2VydmljZSkKLQotIHZvaWQgbm90aWZ5VW5rbm93bkNvbm5lY3Rpb24oKQotCi0gdm9pZCBvbk1NSURvbmUoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkdzbU1taUNvZGUpCi0KLXB1YmxpYyB2b2lkIHF1ZXJ5QXZhaWxhYmxlQmFuZE1vZGUoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIHJlZ2lzdGVyRm9yU3VwcFNlcnZpY2VOb3RpZmljYXRpb24oCi1hbmRyb2lkLm9zLkhhbmRsZXIKLWludAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0NhbGxTdGF0ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcmVqZWN0Q2FsbCgpCi0KLSB2b2lkIHJlc3RvcmVTYXZlZE5ldHdvcmtTZWxlY3Rpb24oCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLSB2b2lkIHNhdmVDbGlyU2V0dGluZygKLWludCkKLQotcHVibGljIHZvaWQgc2VsZWN0TmV0d29ya01hbnVhbGx5KAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5OZXR3b3JrSW5mbwotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBzZW5kRHRtZigKLWNoYXIpCi0KLXB1YmxpYyB2b2lkIHNlbmRVc3NkUmVzcG9uc2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRCYW5kTW9kZSgKLWludAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBzZXRDYWxsRm9yd2FyZGluZ09wdGlvbigKLWludAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgc2V0Q2FsbFdhaXRpbmcoCi1ib29sZWFuCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIHNldERhdGFSb2FtaW5nRW5hYmxlZCgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldExpbmUxTnVtYmVyKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBzZXRNdXRlKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0TmV0d29ya1NlbGVjdGlvbk1vZGVBdXRvbWF0aWMoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIHNldE9uUG9zdERpYWxDaGFyYWN0ZXIoCi1hbmRyb2lkLm9zLkhhbmRsZXIKLWludAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHZvaWQgc2V0T3V0Z29pbmdDYWxsZXJJZERpc3BsYXkoCi1pbnQKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgc2V0UHJlZmVycmVkTmV0d29ya1R5cGUoCi1pbnQKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgc2V0UmFkaW9Qb3dlcigKLWJvb2xlYW4pCi0KLSB2b2lkIHNldFN5c3RlbVByb3BlcnR5KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0Vm9pY2VNYWlsTnVtYmVyKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBzaW11bGF0ZURhdGFDb25uZWN0aW9uKAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lJERhdGFTdGF0ZSkKLQotcHVibGljIHZvaWQgc3RhcnREdG1mKAotY2hhcikKLQotcHVibGljIHZvaWQgc3RvcER0bWYoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQ2FsbFN0YXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzd2l0Y2hIb2xkaW5nQW5kQWN0aXZlKCkKLQotcHVibGljIHZvaWQgdW5yZWdpc3RlckZvclN1cHBTZXJ2aWNlTm90aWZpY2F0aW9uKAotYW5kcm9pZC5vcy5IYW5kbGVyKQotCi0gdm9pZCB1cGRhdGVNZXNzYWdlV2FpdGluZ0luZGljYXRvcigKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHVwZGF0ZVNlcnZpY2VMb2NhdGlvbigKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkdzbUFscGhhYmV0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgR1NNX0VYVEVOREVEX0VTQ0FQRQotCi1zdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMT0dfVEFHCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGFuZHJvaWQudXRpbC5TcGFyc2VJbnRBcnJheSBjaGFyVG9Hc20KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYW5kcm9pZC51dGlsLlNwYXJzZUludEFycmF5IGNoYXJUb0dzbUV4dGVuZGVkCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGFuZHJvaWQudXRpbC5TcGFyc2VJbnRBcnJheSBnc21FeHRlbmRlZFRvQ2hhcgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnV0aWwuU3BhcnNlSW50QXJyYXkgZ3NtVG9DaGFyCi0KLXByaXZhdGUgc3RhdGljIGludCBzR3NtU3BhY2VDaGFyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGludCBjaGFyVG9Hc20oCi1jaGFyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0VuY29kZUV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBpbnQgY2hhclRvR3NtKAotY2hhcgotYm9vbGVhbikKLQotcHVibGljIHN0YXRpYyBpbnQgY2hhclRvR3NtRXh0ZW5kZWQoCi1jaGFyKQotCi1wdWJsaWMgc3RhdGljIGludCBjb3VudEdzbVNlcHRldHMoCi1jaGFyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0VuY29kZUV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBpbnQgY291bnRHc21TZXB0ZXRzKAotY2hhcgotYm9vbGVhbikKLQotcHVibGljIHN0YXRpYyBpbnQgY291bnRHc21TZXB0ZXRzKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9FbmNvZGVFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgaW50IGNvdW50R3NtU2VwdGV0cygKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4pCi0KLXB1YmxpYyBzdGF0aWMgaW50IGZpbmRHc21TZXB0ZXRMaW1pdEluZGV4KAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnc203Qml0UGFja2VkVG9TdHJpbmcoCi1ieXRlW10KLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ3NtN0JpdFBhY2tlZFRvU3RyaW5nKAotYnl0ZVtdCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ3NtOEJpdFVucGFja2VkVG9TdHJpbmcoCi1ieXRlW10KLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIGNoYXIgZ3NtRXh0ZW5kZWRUb0NoYXIoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgY2hhciBnc21Ub0NoYXIoCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgcGFja1Ntc0NoYXIoCi1ieXRlW10KLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0VuY29kZUV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBieXRlW10gc3RyaW5nVG9Hc203Qml0UGFja2VkKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9FbmNvZGVFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgYnl0ZVtdIHN0cmluZ1RvR3NtN0JpdFBhY2tlZCgKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50Ci1pbnQKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vRW5jb2RlRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGJ5dGVbXSBzdHJpbmdUb0dzbTdCaXRQYWNrZWRXaXRoSGVhZGVyKAotamF2YS5sYW5nLlN0cmluZwotYnl0ZVtdKQotCi1wdWJsaWMgc3RhdGljIGJ5dGVbXSBzdHJpbmdUb0dzbThCaXRQYWNrZWQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgc3RyaW5nVG9Hc204Qml0VW5wYWNrZWRGaWVsZCgKLWphdmEubGFuZy5TdHJpbmcKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5Hc21NbWlDb2RlIGV4dGVuZHMgYW5kcm9pZC5vcy5IYW5kbGVyIGltcGxlbWVudHMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255Lk1taUNvZGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUNUSU9OX0FDVElWQVRFCi0KLXN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDVElPTl9ERUFDVElWQVRFCi0KLXN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDVElPTl9FUkFTVVJFCi0KLXN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDVElPTl9JTlRFUlJPR0FURQotCi1zdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBQ1RJT05fUkVHSVNURVIKLQotc3RhdGljIGZpbmFsIGludCBFVkVOVF9HRVRfQ0xJUl9DT01QTEVURQotCi1zdGF0aWMgZmluYWwgaW50IEVWRU5UX1FVRVJZX0NGX0NPTVBMRVRFCi0KLXN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfUVVFUllfQ09NUExFVEUKLQotc3RhdGljIGZpbmFsIGludCBFVkVOVF9TRVRfQ0ZGX0NPTVBMRVRFCi0KLXN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfU0VUX0NPTVBMRVRFCi0KLXN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfVVNTRF9DQU5DRUxfQ09NUExFVEUKLQotc3RhdGljIGZpbmFsIGludCBFVkVOVF9VU1NEX0NPTVBMRVRFCi0KLXN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIExPR19UQUcKLQotc3RhdGljIGZpbmFsIGludCBNQVRDSF9HUk9VUF9BQ1RJT04KLQotc3RhdGljIGZpbmFsIGludCBNQVRDSF9HUk9VUF9ESUFMSU5HX05VTUJFUgotCi1zdGF0aWMgZmluYWwgaW50IE1BVENIX0dST1VQX1BPVU5EX1NUUklORwotCi1zdGF0aWMgZmluYWwgaW50IE1BVENIX0dST1VQX1BXRF9DT05GSVJNCi0KLXN0YXRpYyBmaW5hbCBpbnQgTUFUQ0hfR1JPVVBfU0VSVklDRV9DT0RFCi0KLXN0YXRpYyBmaW5hbCBpbnQgTUFUQ0hfR1JPVVBfU0lBCi0KLXN0YXRpYyBmaW5hbCBpbnQgTUFUQ0hfR1JPVVBfU0lCCi0KLXN0YXRpYyBmaW5hbCBpbnQgTUFUQ0hfR1JPVVBfU0lDCi0KLXN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNDX0JBSUMKLQotc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0NfQkFJQ3IKLQotc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0NfQkFPQwotCi1zdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTQ19CQU9JQwotCi1zdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTQ19CQU9JQ3hICi0KLXN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNDX0JBX0FMTAotCi1zdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTQ19CQV9NTwotCi1zdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTQ19CQV9NVAotCi1zdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTQ19DRkIKLQotc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0NfQ0ZOUgotCi1zdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTQ19DRk5SeQotCi1zdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTQ19DRlUKLQotc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0NfQ0ZfQWxsCi0KLXN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNDX0NGX0FsbF9Db25kaXRpb25hbAotCi1zdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTQ19DTElQCi0KLXN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNDX0NMSVIKLQotc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0NfUElOCi0KLXN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNDX1BJTjIKLQotc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0NfUFVLCi0KLXN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNDX1BVSzIKLQotc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0NfUFdECi0KLXN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNDX1dBSVQKLQotc3RhdGljIGphdmEudXRpbC5yZWdleC5QYXR0ZXJuIHNQYXR0ZXJuU3VwcFNlcnZpY2UKLQotIGphdmEubGFuZy5TdHJpbmcgYWN0aW9uCi0KLSBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBjb250ZXh0Ci0KLSBqYXZhLmxhbmcuU3RyaW5nIGRpYWxpbmdOdW1iZXIKLQotcHJpdmF0ZSBib29sZWFuIGlzUGVuZGluZ1VTU0QKLQotcHJpdmF0ZSBib29sZWFuIGlzVXNzZFJlcXVlc3QKLQotIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgbWVzc2FnZQotCi0gY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5HU01QaG9uZSBwaG9uZQotCi0gamF2YS5sYW5nLlN0cmluZyBwb3VuZFN0cmluZwotCi0gamF2YS5sYW5nLlN0cmluZyBwd2QKLQotIGphdmEubGFuZy5TdHJpbmcgc2MKLQotIGphdmEubGFuZy5TdHJpbmcgc2lhCi0KLSBqYXZhLmxhbmcuU3RyaW5nIHNpYgotCi0gamF2YS5sYW5nLlN0cmluZyBzaWMKLQotIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5NbWlDb2RlJFN0YXRlIHN0YXRlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi0gdm9pZCA8aW5pdD4oCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkdTTVBob25lKQotCi1wcml2YXRlIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgY3JlYXRlUXVlcnlDYWxsV2FpdGluZ1Jlc3VsdE1lc3NhZ2UoCi1pbnQpCi0KLXByaXZhdGUgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBnZXRTY1N0cmluZygpCi0KLXByaXZhdGUgdm9pZCBoYW5kbGVQYXNzd29yZEVycm9yKAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRW1wdHlPck51bGwoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotCi1zdGF0aWMgYm9vbGVhbiBpc1NlcnZpY2VDb2RlQ2FsbEJhcnJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1zdGF0aWMgYm9vbGVhbiBpc1NlcnZpY2VDb2RlQ2FsbEZvcndhcmRpbmcoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU2hvcnRDb2RlKAotamF2YS5sYW5nLlN0cmluZwotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5HU01QaG9uZSkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIG1ha2VDRlF1ZXJ5UmVzdWx0TWVzc2FnZSgKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uQ2FsbEZvcndhcmRJbmZvCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgbWFrZUVtcHR5TnVsbCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkdzbU1taUNvZGUgbmV3RnJvbURpYWxTdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkdTTVBob25lKQotCi1zdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5Hc21NbWlDb2RlIG5ld0Zyb21Vc3NkVXNlcklucHV0KAotamF2YS5sYW5nLlN0cmluZwotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5HU01QaG9uZSkKLQotc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uR3NtTW1pQ29kZSBuZXdOZXR3b3JrSW5pdGlhdGVkVXNzZCgKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4KLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uR1NNUGhvbmUpCi0KLXByaXZhdGUgdm9pZCBvbkdldENsaXJDb21wbGV0ZSgKLWFuZHJvaWQub3MuQXN5bmNSZXN1bHQpCi0KLXByaXZhdGUgdm9pZCBvblF1ZXJ5Q2ZDb21wbGV0ZSgKLWFuZHJvaWQub3MuQXN5bmNSZXN1bHQpCi0KLXByaXZhdGUgdm9pZCBvblF1ZXJ5Q29tcGxldGUoCi1hbmRyb2lkLm9zLkFzeW5jUmVzdWx0KQotCi1wcml2YXRlIHZvaWQgb25TZXRDb21wbGV0ZSgKLWFuZHJvaWQub3MuQXN5bmNSZXN1bHQpCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIHNjVG9CYXJyaW5nRmFjaWxpdHkoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHN0YXRpYyBpbnQgc2NUb0NhbGxGb3J3YXJkUmVhc29uKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIHNlcnZpY2VDbGFzc1RvQ0ZTdHJpbmcoCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIGludCBzaVRvU2VydmljZUNsYXNzKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBzdGF0aWMgaW50IHNpVG9UaW1lKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgY2FuY2VsKCkKLQotIGludCBnZXRDTElSTW9kZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIGdldE1lc3NhZ2UoKQotCi1wdWJsaWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255Lk1taUNvZGUkU3RhdGUgZ2V0U3RhdGUoKQotCi1wdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi0gYm9vbGVhbiBpc0FjdGl2YXRlKCkKLQotcHVibGljIGJvb2xlYW4gaXNDYW5jZWxhYmxlKCkKLQotIGJvb2xlYW4gaXNEZWFjdGl2YXRlKCkKLQotIGJvb2xlYW4gaXNFcmFzdXJlKCkKLQotIGJvb2xlYW4gaXNJbnRlcnJvZ2F0ZSgpCi0KLSBib29sZWFuIGlzTU1JKCkKLQotcHVibGljIGJvb2xlYW4gaXNQZW5kaW5nVVNTRCgpCi0KLSBib29sZWFuIGlzUGluQ29tbWFuZCgpCi0KLSBib29sZWFuIGlzUmVnaXN0ZXIoKQotCi0gYm9vbGVhbiBpc1Nob3J0Q29kZSgpCi0KLSBib29sZWFuIGlzVGVtcG9yYXJ5TW9kZUNMSVIoKQotCi1wdWJsaWMgYm9vbGVhbiBpc1Vzc2RSZXF1ZXN0KCkKLQotIHZvaWQgb25Vc3NkRmluaXNoZWQoCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuKQotCi0gdm9pZCBvblVzc2RGaW5pc2hlZEVycm9yKCkKLQotIHZvaWQgcHJvY2Vzc0NvZGUoKQotCi0gdm9pZCBzZW5kVXNzZCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtU2ltQ2FyZDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID00MTA0IG5hbWUgPW51bGwgKQotIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uR3NtU2ltQ2FyZCQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgaW50W10gJFN3aXRjaE1hcCRjb20kYW5kcm9pZCRpbnRlcm5hbCR0ZWxlcGhvbnkkZ3NtJENvbW1hbmRzSW50ZXJmYWNlJFJhZGlvU3RhdGUKLQotc3RhdGljIGZpbmFsIGludFtdICRTd2l0Y2hNYXAkY29tJGFuZHJvaWQkaW50ZXJuYWwkdGVsZXBob255JGdzbSRDb21tYW5kc0ludGVyZmFjZSRTaW1TdGF0dXMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21TaW1DYXJkJDE7ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkdzbVNpbUNhcmQgZXh0ZW5kcyBhbmRyb2lkLm9zLkhhbmRsZXIgaW1wbGVtZW50cyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuU2ltQ2FyZAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRwotCi1zdGF0aWMgZmluYWwgaW50IEVWRU5UX0NIQU5HRV9GQUNJTElUWV9GRE5fRE9ORQotCi1zdGF0aWMgZmluYWwgaW50IEVWRU5UX0NIQU5HRV9GQUNJTElUWV9MT0NLX0RPTkUKLQotc3RhdGljIGZpbmFsIGludCBFVkVOVF9DSEFOR0VfU0lNX1BBU1NXT1JEX0RPTkUKLQotc3RhdGljIGZpbmFsIGludCBFVkVOVF9HRVRfU0lNX1NUQVRVU19ET05FCi0KLXN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfUElOUFVLX0RPTkUKLQotc3RhdGljIGZpbmFsIGludCBFVkVOVF9RVUVSWV9GQUNJTElUWV9GRE5fRE9ORQotCi1zdGF0aWMgZmluYWwgaW50IEVWRU5UX1FVRVJZX0ZBQ0lMSVRZX0xPQ0tfRE9ORQotCi1zdGF0aWMgZmluYWwgaW50IEVWRU5UX1JBRElPX09GRl9PUl9OT1RfQVZBSUxBQkxFCi0KLXN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfUkVQT0xMX1NUQVRVU19ET05FCi0KLXN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfU0lNX0xPQ0tFRF9PUl9BQlNFTlQKLQotc3RhdGljIGZpbmFsIGludCBFVkVOVF9TSU1fUkVBRFkKLQotc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTE9HX1RBRwotCi1zdGF0aWMgZmluYWwgaW50IE5PVElGSUNBVElPTl9JRF9TSU1fU1RBVFVTCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5SZWdpc3RyYW50TGlzdCBhYnNlbnRSZWdpc3RyYW50cwotCi1wcml2YXRlIGJvb2xlYW4gbURlc2lyZWRGZG5FbmFibGVkCi0KLXByaXZhdGUgYm9vbGVhbiBtRGVzaXJlZFBpbkxvY2tlZAotCi1wcml2YXRlIGJvb2xlYW4gbVNpbUZkbkVuYWJsZWQKLQotcHJpdmF0ZSBib29sZWFuIG1TaW1QaW5Mb2NrZWQKLQotcHJpdmF0ZSBhbmRyb2lkLm9zLlJlZ2lzdHJhbnRMaXN0IG5ldHdvcmtMb2NrZWRSZWdpc3RyYW50cwotCi1wcml2YXRlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uR1NNUGhvbmUgcGhvbmUKLQotcHJpdmF0ZSBhbmRyb2lkLm9zLlJlZ2lzdHJhbnRMaXN0IHBpbkxvY2tlZFJlZ2lzdHJhbnRzCi0KLXByaXZhdGUgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5Db21tYW5kc0ludGVyZmFjZSRTaW1TdGF0dXMgc3RhdHVzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5HU01QaG9uZSkKLQotcHJpdmF0ZSB2b2lkIGdldFNpbVN0YXR1c0RvbmUoCi1hbmRyb2lkLm9zLkFzeW5jUmVzdWx0KQotCi1wcml2YXRlIHZvaWQgaGFuZGxlU2ltU3RhdHVzKAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5Db21tYW5kc0ludGVyZmFjZSRTaW1TdGF0dXMpCi0KLXByaXZhdGUgdm9pZCBsb2coCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHZvaWQgb25RdWVyeUZhY2lsaXR5TG9jaygKLWFuZHJvaWQub3MuQXN5bmNSZXN1bHQpCi0KLXByaXZhdGUgdm9pZCBvblF1ZXJ5RmRuRW5hYmxlZCgKLWFuZHJvaWQub3MuQXN5bmNSZXN1bHQpCi0KLXByaXZhdGUgdm9pZCB1cGRhdGVTdGF0ZVByb3BlcnR5KCkKLQotcHVibGljIHZvaWQgYnJvYWRjYXN0U2ltU3RhdGVDaGFuZ2VkSW50ZW50KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgY2hhbmdlU2ltRmRuUGFzc3dvcmQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIGNoYW5nZVNpbUxvY2tQYXNzd29yZCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U2VydmljZVByb3ZpZGVyTmFtZSgpCi0KLXB1YmxpYyBib29sZWFuIGdldFNpbUZkbkVuYWJsZWQoKQotCi1wdWJsaWMgYm9vbGVhbiBnZXRTaW1Mb2NrRW5hYmxlZCgpCi0KLXB1YmxpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuU2ltQ2FyZCRTdGF0ZSBnZXRTdGF0ZSgpCi0KLXB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIHJlZ2lzdGVyRm9yQWJzZW50KAotYW5kcm9pZC5vcy5IYW5kbGVyCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2lkIHJlZ2lzdGVyRm9yTG9ja2VkKAotYW5kcm9pZC5vcy5IYW5kbGVyCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2lkIHJlZ2lzdGVyRm9yTmV0d29ya0xvY2tlZCgKLWFuZHJvaWQub3MuSGFuZGxlcgotaW50Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgdm9pZCBzZXRTaW1GZG5FbmFibGVkKAotYm9vbGVhbgotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBzZXRTaW1Mb2NrRW5hYmxlZCgKLWJvb2xlYW4KLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgc3VwcGx5TmV0d29ya0RlcGVyc29uYWxpemF0aW9uKAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBzdXBwbHlQaW4oCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIHN1cHBseVBpbjIoCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIHN1cHBseVB1aygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgc3VwcGx5UHVrMigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgdW5yZWdpc3RlckZvckFic2VudCgKLWFuZHJvaWQub3MuSGFuZGxlcikKLQotcHVibGljIHZvaWQgdW5yZWdpc3RlckZvckxvY2tlZCgKLWFuZHJvaWQub3MuSGFuZGxlcikKLQotcHVibGljIHZvaWQgdW5yZWdpc3RlckZvck5ldHdvcmtMb2NrZWQoCi1hbmRyb2lkLm9zLkhhbmRsZXIpCi0KLXB1YmxpYyB2b2lkIHVwZGF0ZUltc2lDb25maWd1cmF0aW9uKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0lTaW1QaG9uZUJvb2skU3R1YjsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLklTaW1QaG9uZUJvb2sgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5JSW50ZXJmYWNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSSlMamF2YS91dGlsL0xpc3Q8TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vQWRuUmVjb3JkOz47ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnV0aWwuTGlzdCBnZXRBZG5SZWNvcmRzSW5FZigKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRbXSBnZXRBZG5SZWNvcmRzU2l6ZSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHVwZGF0ZUFkblJlY29yZHNJbkVmQnlJbmRleCgKLWludAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gdXBkYXRlQWRuUmVjb3Jkc0luRWZCeVNlYXJjaCgKLWludAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9JU2ltUGhvbmVCb29rJFN0dWI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9UHJveHkgKQotIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uSVNpbVBob25lQm9vayRTdHViJFByb3h5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uSVNpbVBob25lQm9vawotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGFuZHJvaWQub3MuSUJpbmRlciBtUmVtb3RlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSSlMamF2YS91dGlsL0xpc3Q8TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vQWRuUmVjb3JkOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRBZG5SZWNvcmRzSW5FZigKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBpbnRbXSBnZXRBZG5SZWNvcmRzU2l6ZSgKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiB1cGRhdGVBZG5SZWNvcmRzSW5FZkJ5SW5kZXgoCi1pbnQKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWludAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIHVwZGF0ZUFkblJlY29yZHNJbkVmQnlTZWFyY2goCi1pbnQKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vSVNpbVBob25lQm9vazsgKQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9JU2ltUGhvbmVCb29rJFN0dWIkUHJveHk7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAzMyBuYW1lID1TdHViICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLklTaW1QaG9uZUJvb2skU3R1YiBleHRlbmRzIGFuZHJvaWQub3MuQmluZGVyIGltcGxlbWVudHMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5JU2ltUGhvbmVCb29rCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVTQ1JJUFRPUgotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2dldEFkblJlY29yZHNJbkVmCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZ2V0QWRuUmVjb3Jkc1NpemUKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl91cGRhdGVBZG5SZWNvcmRzSW5FZkJ5SW5kZXgKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl91cGRhdGVBZG5SZWNvcmRzSW5FZkJ5U2VhcmNoCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLklTaW1QaG9uZUJvb2sgYXNJbnRlcmZhY2UoCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gb25UcmFuc2FjdCgKLWludAotYW5kcm9pZC5vcy5QYXJjZWwKLWFuZHJvaWQub3MuUGFyY2VsCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9JU21zJFN0dWI7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5JU21zIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuSUludGVyZmFjZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBjb3B5TWVzc2FnZVRvU2ltRWYoCi1pbnQKLWJ5dGVbXQotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9MaXN0PExjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1Ntc1Jhd0RhdGE7PjsgKQotcHVibGljIGFic3RyYWN0IGphdmEudXRpbC5MaXN0IGdldEFsbE1lc3NhZ2VzRnJvbVNpbUVmKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvdXRpbC9MaXN0PExqYXZhL2xhbmcvU3RyaW5nOz47TGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL2FwcC9QZW5kaW5nSW50ZW50Oz47TGphdmEvdXRpbC9MaXN0PExhbmRyb2lkL2FwcC9QZW5kaW5nSW50ZW50Oz47KVYgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2VuZE11bHRpcGFydFRleHQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnV0aWwuTGlzdAotamF2YS51dGlsLkxpc3QKLWphdmEudXRpbC5MaXN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2VuZFJhd1BkdSgKLWJ5dGVbXQotYnl0ZVtdCi1hbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50Ci1hbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gdXBkYXRlTWVzc2FnZU9uU2ltRWYoCi1pbnQKLWludAotYnl0ZVtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9UHJveHkgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vSVNtcyRTdHViOyApCi0gY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5JU21zJFN0dWIkUHJveHkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5JU21zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5JQmluZGVyIG1SZW1vdGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gY29weU1lc3NhZ2VUb1NpbUVmKAotaW50Ci1ieXRlW10KLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvTGlzdDxMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9TbXNSYXdEYXRhOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRBbGxNZXNzYWdlc0Zyb21TaW1FZigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEludGVyZmFjZURlc2NyaXB0b3IoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZztMamF2YS91dGlsL0xpc3Q8TGphdmEvbGFuZy9TdHJpbmc7PjtMamF2YS91dGlsL0xpc3Q8TGFuZHJvaWQvYXBwL1BlbmRpbmdJbnRlbnQ7PjtMamF2YS91dGlsL0xpc3Q8TGFuZHJvaWQvYXBwL1BlbmRpbmdJbnRlbnQ7PjspViApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZW5kTXVsdGlwYXJ0VGV4dCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudXRpbC5MaXN0Ci1qYXZhLnV0aWwuTGlzdAotamF2YS51dGlsLkxpc3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZW5kUmF3UGR1KAotYnl0ZVtdCi1ieXRlW10KLWFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQKLWFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiB1cGRhdGVNZXNzYWdlT25TaW1FZigKLWludAotaW50Ci1ieXRlW10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9JU21zJFN0dWIkUHJveHk7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0lTbXM7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAzMyBuYW1lID1TdHViICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLklTbXMkU3R1YiBleHRlbmRzIGFuZHJvaWQub3MuQmluZGVyIGltcGxlbWVudHMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5JU21zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVTQ1JJUFRPUgotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2NvcHlNZXNzYWdlVG9TaW1FZgotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2dldEFsbE1lc3NhZ2VzRnJvbVNpbUVmCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fc2VuZE11bHRpcGFydFRleHQKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9zZW5kUmF3UGR1Ci0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fdXBkYXRlTWVzc2FnZU9uU2ltRWYKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uSVNtcyBhc0ludGVyZmFjZSgKLWFuZHJvaWQub3MuSUJpbmRlcikKLQotcHVibGljIGFuZHJvaWQub3MuSUJpbmRlciBhc0JpbmRlcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBvblRyYW5zYWN0KAotaW50Ci1hbmRyb2lkLm9zLlBhcmNlbAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9Db21wYXJhYmxlPExjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL01jY1RhYmxlJE1jY0VudHJ5Oz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1NY2NFbnRyeSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9NY2NUYWJsZTsgKQotIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uTWNjVGFibGUkTWNjRW50cnkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5sYW5nLkNvbXBhcmFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGphdmEubGFuZy5TdHJpbmcgaXNvCi0KLSBpbnQgbWNjCi0KLSBpbnQgc21hbGxlc3REaWdpdHNNbmMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1pbnQKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIGludCBjb21wYXJlVG8oCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLk1jY1RhYmxlJE1jY0VudHJ5KQotCi1wdWJsaWMgdm9sYXRpbGUgaW50IGNvbXBhcmVUbygKLWphdmEubGFuZy5PYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9NY2NUYWJsZSRNY2NFbnRyeTsgKQotcHVibGljIGZpbmFsIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uTWNjVGFibGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9BcnJheUxpc3Q8TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vTWNjVGFibGUkTWNjRW50cnk7PjsgKQotc3RhdGljIGphdmEudXRpbC5BcnJheUxpc3QgdGFibGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBjb3VudHJ5Q29kZUZvck1jYygKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5NY2NUYWJsZSRNY2NFbnRyeSBlbnRyeUZvck1jYygKLWludCkKLQotcHVibGljIHN0YXRpYyBpbnQgc21hbGxlc3REaWdpdHNNY2NGb3JNbmMoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vTmV0d29ya0luZm87ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I8TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vTmV0d29ya0luZm87PjsgKQotZmluYWwgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5OZXR3b3JrSW5mbyQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uTmV0d29ya0luZm8gY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLk5ldHdvcmtJbmZvW10gbmV3QXJyYXkoCi1pbnQpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0W10gbmV3QXJyYXkoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vTmV0d29ya0luZm87ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL0VudW08TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vTmV0d29ya0luZm8kU3RhdGU7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNjQwOSBuYW1lID1TdGF0ZSApCi1wdWJsaWMgZmluYWwgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5OZXR3b3JrSW5mbyRTdGF0ZSBleHRlbmRzIGphdmEubGFuZy5FbnVtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uTmV0d29ya0luZm8kU3RhdGVbXSAkVkFMVUVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5OZXR3b3JrSW5mbyRTdGF0ZSBBVkFJTEFCTEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLk5ldHdvcmtJbmZvJFN0YXRlIENVUlJFTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLk5ldHdvcmtJbmZvJFN0YXRlIEZPUkJJRERFTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uTmV0d29ya0luZm8kU3RhdGUgVU5LTk9XTgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVYgKQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLk5ldHdvcmtJbmZvJFN0YXRlIHZhbHVlT2YoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uTmV0d29ya0luZm8kU3RhdGVbXSB2YWx1ZXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vTmV0d29ya0luZm8kU3RhdGU7ICkKLXB1YmxpYyBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLk5ldHdvcmtJbmZvIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9OZXR3b3JrSW5mbzs+OyApCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yIENSRUFUT1IKLQotIGphdmEubGFuZy5TdHJpbmcgb3BlcmF0b3JBbHBoYUxvbmcKLQotIGphdmEubGFuZy5TdHJpbmcgb3BlcmF0b3JBbHBoYVNob3J0Ci0KLSBqYXZhLmxhbmcuU3RyaW5nIG9wZXJhdG9yTnVtZXJpYwotCi0gY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5OZXR3b3JrSW5mbyRTdGF0ZSBzdGF0ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5OZXR3b3JrSW5mbyRTdGF0ZSkKLQotIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5OZXR3b3JrSW5mbyRTdGF0ZSByaWxTdGF0ZVRvU3RhdGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRPcGVyYXRvckFscGhhTG9uZygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE9wZXJhdG9yQWxwaGFTaG9ydCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE9wZXJhdG9yTnVtZXJpYygpCi0KLXB1YmxpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLk5ldHdvcmtJbmZvJFN0YXRlIGdldFN0YXRlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1wdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlBEUENvbnRleHRTdGF0ZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGJvb2xlYW4gYWN0aXZlCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGFkZHJlc3MKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgYXBuCi0KLXB1YmxpYyBpbnQgY2lkCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHR5cGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vUGRwQ29ubmVjdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID00MTA0IG5hbWUgPW51bGwgKQotIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uUGRwQ29ubmVjdGlvbiQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgaW50W10gJFN3aXRjaE1hcCRjb20kYW5kcm9pZCRpbnRlcm5hbCR0ZWxlcGhvbnkkZ3NtJERhdGFMaW5rSW50ZXJmYWNlJExpbmtTdGF0ZQotCi1zdGF0aWMgZmluYWwgaW50W10gJFN3aXRjaE1hcCRjb20kYW5kcm9pZCRpbnRlcm5hbCR0ZWxlcGhvbnkkZ3NtJFBkcENvbm5lY3Rpb24kUGRwRmFpbENhdXNlCi0KLXN0YXRpYyBmaW5hbCBpbnRbXSAkU3dpdGNoTWFwJGNvbSRhbmRyb2lkJGludGVybmFsJHRlbGVwaG9ueSRnc20kUGRwQ29ubmVjdGlvbiRQZHBTdGF0ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9FbnVtPExjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1BkcENvbm5lY3Rpb24kUGRwRmFpbENhdXNlOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1BkcENvbm5lY3Rpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTY0MDkgbmFtZSA9UGRwRmFpbENhdXNlICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlBkcENvbm5lY3Rpb24kUGRwRmFpbENhdXNlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5QZHBDb25uZWN0aW9uJFBkcEZhaWxDYXVzZVtdICRWQUxVRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlBkcENvbm5lY3Rpb24kUGRwRmFpbENhdXNlIEJBRF9BUE4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlBkcENvbm5lY3Rpb24kUGRwRmFpbENhdXNlIEJBRF9QQVBfU0VDUkVUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5QZHBDb25uZWN0aW9uJFBkcEZhaWxDYXVzZSBCQVJSRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlBkcENvbm5lY3Rpb24kUGRwRmFpbENhdXNlIE5PTkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlBkcENvbm5lY3Rpb24kUGRwRmFpbENhdXNlIE5PX0RBVEFfUExBTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uUGRwQ29ubmVjdGlvbiRQZHBGYWlsQ2F1c2UgTk9fU0lHTkFMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5QZHBDb25uZWN0aW9uJFBkcEZhaWxDYXVzZSBSQURJT19FUlJPUl9SRVRSWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uUGRwQ29ubmVjdGlvbiRQZHBGYWlsQ2F1c2UgUkFESU9fTk9UX0FWSUFMQUJMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uUGRwQ29ubmVjdGlvbiRQZHBGYWlsQ2F1c2UgUkFESU9fT0ZGCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5QZHBDb25uZWN0aW9uJFBkcEZhaWxDYXVzZSBTRVJWSUNFX09QVElPTl9OT1RfU1VCU0NSSUJFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uUGRwQ29ubmVjdGlvbiRQZHBGYWlsQ2F1c2UgU0VSVklDRV9PUFRJT05fTk9UX1NVUFBPUlRFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uUGRwQ29ubmVjdGlvbiRQZHBGYWlsQ2F1c2UgU0lNX0xPQ0tFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uUGRwQ29ubmVjdGlvbiRQZHBGYWlsQ2F1c2UgU1VTUEVORURfVEVNUE9SQVJZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5QZHBDb25uZWN0aW9uJFBkcEZhaWxDYXVzZSBVTktOT1dOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5QZHBDb25uZWN0aW9uJFBkcEZhaWxDYXVzZSBVU0VSX0FVVEhFTlRJQ0FUSU9OCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpViApCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uUGRwQ29ubmVjdGlvbiRQZHBGYWlsQ2F1c2UgdmFsdWVPZigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5QZHBDb25uZWN0aW9uJFBkcEZhaWxDYXVzZVtdIHZhbHVlcygpCi0KLXB1YmxpYyBib29sZWFuIGlzUGVybWFuZW50RmFpbCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9FbnVtPExjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1BkcENvbm5lY3Rpb24kUGRwU3RhdGU7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vUGRwQ29ubmVjdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNjQwOSBuYW1lID1QZHBTdGF0ZSApCi1wdWJsaWMgZmluYWwgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5QZHBDb25uZWN0aW9uJFBkcFN0YXRlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5QZHBDb25uZWN0aW9uJFBkcFN0YXRlW10gJFZBTFVFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uUGRwQ29ubmVjdGlvbiRQZHBTdGF0ZSBBQ1RJVkFUSU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5QZHBDb25uZWN0aW9uJFBkcFN0YXRlIEFDVElWRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uUGRwQ29ubmVjdGlvbiRQZHBTdGF0ZSBJTkFDVElWRQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVYgKQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlBkcENvbm5lY3Rpb24kUGRwU3RhdGUgdmFsdWVPZigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5QZHBDb25uZWN0aW9uJFBkcFN0YXRlW10gdmFsdWVzKCkKLQotcHVibGljIGJvb2xlYW4gaXNBY3RpdmUoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0luYWN0aXZlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vUGRwQ29ubmVjdGlvbiQxO0xjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1BkcENvbm5lY3Rpb24kUGRwRmFpbENhdXNlO0xjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1BkcENvbm5lY3Rpb24kUGRwU3RhdGU7ICkKLXB1YmxpYyBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlBkcENvbm5lY3Rpb24gZXh0ZW5kcyBhbmRyb2lkLm9zLkhhbmRsZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0RFQUNUSVZBVEVfRE9ORQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfRk9SQ0VfUkVUUlkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0dFVF9MQVNUX0ZBSUxfRE9ORQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfTElOS19TVEFURV9DSEFOR0VECi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9MT0dfQkFEX0ROU19BRERSRVNTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9TRVRVUF9QRFBfRE9ORQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIEZBS0VfRkFJTAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIExPR19UQUcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBOVUxMX0lQCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQRFBfRkFJTF9SSUxfQkFEX0FQTgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUERQX0ZBSUxfUklMX0JBUlJFRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUERQX0ZBSUxfUklMX0VSUk9SX1VOU1BFQ0lGSUVECi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQRFBfRkFJTF9SSUxfU0VSVklDRV9PUFRJT05fTk9UX1NVQlNDUklCRUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBEUF9GQUlMX1JJTF9TRVJWSUNFX09QVElPTl9OT1RfU1VQUE9SVEVECi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQRFBfRkFJTF9SSUxfVVNFUl9BVVRIRU5USUNBVElPTgotCi1wcml2YXRlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uQXBuU2V0dGluZyBhcG4KLQotcHJpdmF0ZSBpbnQgY2lkCi0KLXByaXZhdGUgbG9uZyBjcmVhdGVUaW1lCi0KLSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkRhdGFMaW5rIGRhdGFMaW5rCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZ1tdIGRuc1NlcnZlcnMKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGdhdGV3YXlBZGRyZXNzCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBpbnRlcmZhY2VOYW1lCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBpcEFkZHJlc3MKLQotcHJpdmF0ZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlBkcENvbm5lY3Rpb24kUGRwRmFpbENhdXNlIGxhc3RGYWlsQ2F1c2UKLQotcHJpdmF0ZSBsb25nIGxhc3RGYWlsVGltZQotCi1wcml2YXRlIGFuZHJvaWQub3MuTWVzc2FnZSBvbkNvbm5lY3RDb21wbGV0ZWQKLQotcHJpdmF0ZSBhbmRyb2lkLm9zLk1lc3NhZ2Ugb25EaXNjb25uZWN0Ci0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBwZHBfbmFtZQotCi1wcml2YXRlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uR1NNUGhvbmUgcGhvbmUKLQotcHJpdmF0ZSBib29sZWFuIHJlY2VpdmVkRGlzY29ubmVjdFJlcQotCi1wcml2YXRlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uUGRwQ29ubmVjdGlvbiRQZHBTdGF0ZSBzdGF0ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uR1NNUGhvbmUpCi0KLXByaXZhdGUgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5QZHBDb25uZWN0aW9uJFBkcEZhaWxDYXVzZSBnZXRGYWlsQ2F1c2VGcm9tUmVxdWVzdCgKLWludCkKLQotcHJpdmF0ZSB2b2lkIGxvZygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgdm9pZCBub3RpZnlEaXNjb25uZWN0KAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wcml2YXRlIHZvaWQgbm90aWZ5RmFpbCgKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uUGRwQ29ubmVjdGlvbiRQZHBGYWlsQ2F1c2UKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHJpdmF0ZSB2b2lkIG5vdGlmeVN1Y2Nlc3MoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXByaXZhdGUgdm9pZCBvbkxpbmtTdGF0ZUNoYW5nZWQoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkRhdGFMaW5rSW50ZXJmYWNlJExpbmtTdGF0ZSkKLQotcHJpdmF0ZSB2b2lkIHNldEh0dHBQcm94eSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLSB2b2lkIGNsZWFyU2V0dGluZ3MoKQotCi0gdm9pZCBjb25uZWN0KAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5BcG5TZXR0aW5nCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLSB2b2lkIGRpc2Nvbm5lY3QoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkFwblNldHRpbmcgZ2V0QXBuKCkKLQotcHVibGljIGxvbmcgZ2V0Q29ubmVjdGlvblRpbWUoKQotCi0gamF2YS5sYW5nLlN0cmluZ1tdIGdldERuc1NlcnZlcnMoKQotCi0gamF2YS5sYW5nLlN0cmluZyBnZXRHYXRld2F5QWRkcmVzcygpCi0KLSBqYXZhLmxhbmcuU3RyaW5nIGdldEludGVyZmFjZSgpCi0KLSBqYXZhLmxhbmcuU3RyaW5nIGdldElwQWRkcmVzcygpCi0KLXB1YmxpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlBkcENvbm5lY3Rpb24kUGRwRmFpbENhdXNlIGdldExhc3RGYWlsQ2F1c2UoKQotCi1wdWJsaWMgbG9uZyBnZXRMYXN0RmFpbFRpbWUoKQotCi1wdWJsaWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5QZHBDb25uZWN0aW9uJFBkcFN0YXRlIGdldFN0YXRlKCkKLQotcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZSgKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotZmluYWwgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5QcHBMaW5rIGV4dGVuZHMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5EYXRhTGluayBpbXBsZW1lbnRzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uRGF0YUxpbmtJbnRlcmZhY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIGJ5dGVbXSBET1dOX0FTQ0lJX1NUUklORwotCi1zdGF0aWMgZmluYWwgaW50IEVWRU5UX1BPTExfREFUQV9DT05ORUNUSU9OCi0KLXN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfUFBQX09QRVJTVEFURV9DSEFOR0VECi0KLXN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfUFBQX1BJREZJTEVfQ0hBTkdFRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIExPR19UQUcKLQotc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUEFUSF9QUFBfT1BFUlNUQVRFCi0KLXN0YXRpYyBmaW5hbCBpbnQgUE9MTF9TWVNGU19NSUxMSVMKLQotc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUFJPUEVSVFlfUFBQRF9FWElUX0NPREUKLQotc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0VSVklDRV9QUFBEX0dQUlMKLQotc3RhdGljIGZpbmFsIGJ5dGVbXSBVTktOT1dOX0FTQ0lJX1NUUklORwotCi1zdGF0aWMgZmluYWwgYnl0ZVtdIFVQX0FTQ0lJX1NUUklORwotCi0gaW50IGxhc3RQcHBkRXhpdENvZGUKLQotcHJpdmF0ZSBmaW5hbCBieXRlW10gbUNoZWNrUFBQQnVmZmVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi0gdm9pZCA8aW5pdD4oCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkRhdGFDb25uZWN0aW9uVHJhY2tlcikKLQotcHJpdmF0ZSB2b2lkIGNoZWNrUFBQKCkKLQotcHVibGljIHZvaWQgY29ubmVjdCgpCi0KLXB1YmxpYyB2b2lkIGRpc2Nvbm5lY3QoKQotCi1wdWJsaWMgaW50IGdldExhc3RMaW5rRXhpdENvZGUoKQotCi1wdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBzZXRQYXNzd29yZEluZm8oCi1hbmRyb2lkLmRhdGFiYXNlLkN1cnNvcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9SSUw7ICkKLSBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlJJTCQxIGV4dGVuZHMgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uUklMIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uUklMKQotCi1wdWJsaWMgdm9pZCBvblJlY2VpdmUoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC5jb250ZW50LkludGVudCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9UklMUmVjZWl2ZXIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vUklMOyApCi0gY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5SSUwkUklMUmVjZWl2ZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5sYW5nLlJ1bm5hYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBieXRlW10gYnVmZmVyCi0KLWZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uUklMIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uUklMKQotCi1wdWJsaWMgdm9pZCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1SSUxTZW5kZXIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vUklMOyApCi0gY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5SSUwkUklMU2VuZGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuSGFuZGxlckludGVyZmFjZSwgamF2YS5sYW5nLlJ1bm5hYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBieXRlW10gZGF0YUxlbmd0aAotCi1maW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlJJTCB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlJJTCkKLQotcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZSgKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1JJTCRSSUxSZWNlaXZlcjtMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9SSUwkUklMU2VuZGVyOyApCi1wdWJsaWMgZmluYWwgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5SSUwgZXh0ZW5kcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkJhc2VDb21tYW5kcyBpbXBsZW1lbnRzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uQ29tbWFuZHNJbnRlcmZhY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcKLQotc3RhdGljIGZpbmFsIGludCBFVkVOVF9TRU5ECi0KLXN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfV0FLRV9MT0NLX1RJTUVPVVQKLQotc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTE9HX1RBRwotCi1zdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX1NPTElDSVRFRAotCi1zdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX1VOU09MSUNJVEVECi0KLXN0YXRpYyBmaW5hbCBib29sZWFuIFJJTEpfTE9HCi0KLXN0YXRpYyBmaW5hbCBpbnQgUklMX01BWF9DT01NQU5EX0JZVEVTCi0KLXN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNPQ0tFVF9OQU1FX1JJTAotCi1zdGF0aWMgZmluYWwgaW50IFNPQ0tFVF9PUEVOX1JFVFJZX01JTExJUwotCi1zdGF0aWMgaW50IFdBS0VfTE9DS19USU1FT1VUCi0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgbUNvbnRleHQKLQotcHJpdmF0ZSBib29sZWFuIG1Jbml0aWFsUmFkaW9TdGF0ZUNoYW5nZQotCi0gYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyIG1JbnRlbnRSZWNlaXZlcgotCi0gamF2YS5sYW5nLk9iamVjdCBtTGFzdE5JVFpUaW1lSW5mbwotCi0gY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5SSUwkUklMUmVjZWl2ZXIgbVJlY2VpdmVyCi0KLSBqYXZhLmxhbmcuVGhyZWFkIG1SZWNlaXZlclRocmVhZAotCi0gaW50IG1SZXF1ZXN0TWVzc2FnZXNQZW5kaW5nCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9BcnJheUxpc3Q8TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vUklMUmVxdWVzdDs+OyApCi0gamF2YS51dGlsLkFycmF5TGlzdCBtUmVxdWVzdHNMaXN0Ci0KLSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlJJTCRSSUxTZW5kZXIgbVNlbmRlcgotCi0gYW5kcm9pZC5vcy5IYW5kbGVyIG1TZW5kZXJICi0KLSBjb20uYW5kcm9pZC5pbnRlcm5hbC5vcy5IYW5kbGVyVGhyZWFkIG1TZW5kZXJUaHJlYWQKLQotIGFuZHJvaWQubmV0LkxvY2FsU29ja2V0IG1Tb2NrZXQKLQotIGFuZHJvaWQub3MuUG93ZXJNYW5hZ2VyJFdha2VMb2NrIG1XYWtlTG9jawotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQwMDAoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlJJTAotYm9vbGVhbikKLQotc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uUklMUmVxdWVzdCBhY2Nlc3MkMTAwKAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5SSUwKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotc3RhdGljIGludCBhY2Nlc3MkMjAwKAotamF2YS5pby5JbnB1dFN0cmVhbQotYnl0ZVtdKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMzAwKAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5SSUwKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wcml2YXRlIHZvaWQgYWNxdWlyZVdha2VMb2NrKCkKLQotcHJpdmF0ZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlJJTFJlcXVlc3QgZmluZEFuZFJlbW92ZVJlcXVlc3RGcm9tTGlzdCgKLWludCkKLQotcHJpdmF0ZSB2b2lkIHByb2Nlc3NSZXNwb25zZSgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wcml2YXRlIHZvaWQgcHJvY2Vzc1NvbGljaXRlZCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wcml2YXRlIHZvaWQgcHJvY2Vzc1Vuc29saWNpdGVkKAotYW5kcm9pZC5vcy5QYXJjZWwpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgc3RhdGljIGludCByZWFkUmlsTWVzc2FnZSgKLWphdmEuaW8uSW5wdXRTdHJlYW0KLWJ5dGVbXSkKLQotcHJpdmF0ZSB2b2lkIHJlbGVhc2VXYWtlTG9ja0lmRG9uZSgpCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIHJlcXVlc3RUb1N0cmluZygKLWludCkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuT2JqZWN0IHJlc3BvbnNlQ2FsbEZvcndhcmQoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuT2JqZWN0IHJlc3BvbnNlQ2FsbExpc3QoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuT2JqZWN0IHJlc3BvbnNlQ29udGV4dExpc3QoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuT2JqZWN0IHJlc3BvbnNlSW50cygKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wcml2YXRlIGphdmEubGFuZy5PYmplY3QgcmVzcG9uc2VOZXR3b3JrSW5mb3MoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuT2JqZWN0IHJlc3BvbnNlUmF3KAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXByaXZhdGUgamF2YS5sYW5nLk9iamVjdCByZXNwb25zZVNJTV9JTygKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wcml2YXRlIGphdmEubGFuZy5PYmplY3QgcmVzcG9uc2VTTVMoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuT2JqZWN0IHJlc3BvbnNlU2ltU3RhdHVzKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXByaXZhdGUgamF2YS5sYW5nLk9iamVjdCByZXNwb25zZVN0cmluZygKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wcml2YXRlIGphdmEubGFuZy5PYmplY3QgcmVzcG9uc2VTdHJpbmdzKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXByaXZhdGUgamF2YS5sYW5nLk9iamVjdCByZXNwb25zZVN1cHBTZXJ2aWNlTm90aWZpY2F0aW9uKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXByaXZhdGUgamF2YS5sYW5nLk9iamVjdCByZXNwb25zZVZvaWQoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJldFRvU3RyaW5nKAotaW50Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wcml2YXRlIHZvaWQgcmlsakxvZygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgdm9pZCBzZW5kKAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5SSUxSZXF1ZXN0KQotCi1wcml2YXRlIHZvaWQgc2VuZFNjcmVlblN0YXRlKAotYm9vbGVhbikKLQotcHJpdmF0ZSB2b2lkIHNldFJhZGlvU3RhdGVGcm9tUklMSW50KAotaW50KQotCi1wcml2YXRlIGludCB0cmFuc2xhdGVTdGF0dXMoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGFjY2VwdENhbGwoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIGFja25vd2xlZGdlTGFzdEluY29taW5nU01TKAotYm9vbGVhbgotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBjYW5jZWxQZW5kaW5nVXNzZCgKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgY2hhbmdlQmFycmluZ1Bhc3N3b3JkKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBjaGFuZ2VTaW1QaW4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIGNoYW5nZVNpbVBpbjIoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIGNvbmZlcmVuY2UoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIGRlYWN0aXZhdGVEZWZhdWx0UERQKAotaW50Ci1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIGRlbGV0ZVNtc09uU2ltKAotaW50Ci1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIGRpYWwoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgZXhwbGljaXRDYWxsVHJhbnNmZXIoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIGdldEF2YWlsYWJsZU5ldHdvcmtzKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBnZXRCYXNlYmFuZFZlcnNpb24oCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIGdldENMSVIoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIGdldEN1cnJlbnRDYWxscygKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgZ2V0R1BSU1JlZ2lzdHJhdGlvblN0YXRlKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBnZXRJTUVJKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBnZXRJTUVJU1YoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIGdldElNU0koCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIGdldExhc3RDYWxsRmFpbENhdXNlKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBnZXRMYXN0UGRwRmFpbENhdXNlKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBnZXRNdXRlKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBnZXROZWlnaGJvcmluZ0NpZHMoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIGdldE5ldHdvcmtTZWxlY3Rpb25Nb2RlKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBnZXRPcGVyYXRvcigKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgZ2V0UERQQ29udGV4dExpc3QoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIGdldFByZWZlcnJlZE5ldHdvcmtUeXBlKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBnZXRSZWdpc3RyYXRpb25TdGF0ZSgKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgZ2V0U2lnbmFsU3RyZW5ndGgoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIGdldFNpbVN0YXR1cygKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgaGFuZGxlQ2FsbFNldHVwUmVxdWVzdEZyb21TaW0oCi1ib29sZWFuCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIGhhbmd1cENvbm5lY3Rpb24oCi1pbnQKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgaGFuZ3VwRm9yZWdyb3VuZFJlc3VtZUJhY2tncm91bmQoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIGhhbmd1cFdhaXRpbmdPckJhY2tncm91bmQoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIGludm9rZU9lbVJpbFJlcXVlc3RSYXcoCi1ieXRlW10KLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgaW52b2tlT2VtUmlsUmVxdWVzdFN0cmluZ3MoCi1qYXZhLmxhbmcuU3RyaW5nW10KLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHJvdGVjdGVkIHZvaWQgb25SYWRpb0F2YWlsYWJsZSgpCi0KLXB1YmxpYyB2b2lkIHF1ZXJ5QXZhaWxhYmxlQmFuZE1vZGUoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIHF1ZXJ5Q0xJUCgKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgcXVlcnlDYWxsRm9yd2FyZFN0YXR1cygKLWludAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIHF1ZXJ5Q2FsbFdhaXRpbmcoCi1pbnQKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgcXVlcnlGYWNpbGl0eUxvY2soCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgcmVqZWN0Q2FsbCgKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgcmVzZXRSYWRpbygKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgc2VuZER0bWYoCi1jaGFyCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIHNlbmRFbnZlbG9wZSgKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgc2VuZFNNUygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgc2VuZFRlcm1pbmFsUmVzcG9uc2UoCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIHNlbmRVU1NEKAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBzZXBhcmF0ZUNvbm5lY3Rpb24oCi1pbnQKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgc2V0QmFuZE1vZGUoCi1pbnQKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgc2V0Q0xJUigKLWludAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBzZXRDYWxsRm9yd2FyZCgKLWludAotaW50Ci1pbnQKLWphdmEubGFuZy5TdHJpbmcKLWludAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBzZXRDYWxsV2FpdGluZygKLWJvb2xlYW4KLWludAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBzZXRGYWNpbGl0eUxvY2soCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgc2V0TG9jYXRpb25VcGRhdGVzKAotYm9vbGVhbgotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBzZXRNdXRlKAotYm9vbGVhbgotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBzZXROZXR3b3JrU2VsZWN0aW9uTW9kZUF1dG9tYXRpYygKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgc2V0TmV0d29ya1NlbGVjdGlvbk1vZGVNYW51YWwoCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIHNldE9uTklUWlRpbWUoCi1hbmRyb2lkLm9zLkhhbmRsZXIKLWludAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHZvaWQgc2V0UHJlZmVycmVkTmV0d29ya1R5cGUoCi1pbnQKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgc2V0UmFkaW9Qb3dlcigKLWJvb2xlYW4KLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgc2V0U3VwcFNlcnZpY2VOb3RpZmljYXRpb25zKAotYm9vbGVhbgotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBzZXR1cERlZmF1bHRQRFAoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIHNpbUlPKAotaW50Ci1pbnQKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50Ci1pbnQKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgc3RhcnREdG1mKAotY2hhcgotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBzdG9wRHRtZigKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgc3VwcGx5TmV0d29ya0RlcGVyc29uYWxpemF0aW9uKAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBzdXBwbHlTaW1QaW4oCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIHN1cHBseVNpbVBpbjIoCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIHN1cHBseVNpbVB1aygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgc3VwcGx5U2ltUHVrMigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgc3dpdGNoV2FpdGluZ09ySG9sZGluZ0FuZEFjdGl2ZSgKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgd3JpdGVTbXNUb1NpbSgKLWludAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uUklMQ29uc3RhbnRzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHRU5FUklDX0ZBSUxVUkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfTk9UX0FMTE9XRURfQkVGT1JFX1JFR19OVwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9OT1RfQUxMT1dFRF9EVVJJTkdfVk9JQ0VfQ0FMTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVNTV09SRF9JTkNPUlJFQ1QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkFESU9fTk9UX0FWQUlMQUJMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVFVRVNUX0NBTkNFTExFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVFVRVNUX05PVF9TVVBQT1JURUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklMX0VSUk5PX0lOVkFMSURfUkVTUE9OU0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklMX1JFUVVFU1RfQU5TV0VSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJTF9SRVFVRVNUX0JBU0VCQU5EX1ZFUlNJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklMX1JFUVVFU1RfQ0FOQ0VMX1VTU0QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklMX1JFUVVFU1RfQ0hBTkdFX0JBUlJJTkdfUEFTU1dPUkQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklMX1JFUVVFU1RfQ0hBTkdFX1NJTV9QSU4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklMX1JFUVVFU1RfQ0hBTkdFX1NJTV9QSU4yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJTF9SRVFVRVNUX0NPTkZFUkVOQ0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklMX1JFUVVFU1RfREVBQ1RJVkFURV9ERUZBVUxUX1BEUAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUxfUkVRVUVTVF9ERUxFVEVfU01TX09OX1NJTQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUxfUkVRVUVTVF9ESUFMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJTF9SRVFVRVNUX0RUTUYKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklMX1JFUVVFU1RfRFRNRl9TVEFSVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUxfUkVRVUVTVF9EVE1GX1NUT1AKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklMX1JFUVVFU1RfRU5URVJfTkVUV09SS19ERVBFUlNPTkFMSVpBVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUxfUkVRVUVTVF9FTlRFUl9TSU1fUElOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJTF9SRVFVRVNUX0VOVEVSX1NJTV9QSU4yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJTF9SRVFVRVNUX0VOVEVSX1NJTV9QVUsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklMX1JFUVVFU1RfRU5URVJfU0lNX1BVSzIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklMX1JFUVVFU1RfRVhQTElDSVRfQ0FMTF9UUkFOU0ZFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUxfUkVRVUVTVF9HRVRfQ0xJUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUxfUkVRVUVTVF9HRVRfQ1VSUkVOVF9DQUxMUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUxfUkVRVUVTVF9HRVRfSU1FSQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUxfUkVRVUVTVF9HRVRfSU1FSVNWCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJTF9SRVFVRVNUX0dFVF9JTVNJCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJTF9SRVFVRVNUX0dFVF9NVVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJTF9SRVFVRVNUX0dFVF9ORUlHSEJPUklOR19DRUxMX0lEUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUxfUkVRVUVTVF9HRVRfUFJFRkVSUkVEX05FVFdPUktfVFlQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUxfUkVRVUVTVF9HRVRfU0lNX1NUQVRVUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUxfUkVRVUVTVF9HUFJTX1JFR0lTVFJBVElPTl9TVEFURQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUxfUkVRVUVTVF9IQU5HVVAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklMX1JFUVVFU1RfSEFOR1VQX0ZPUkVHUk9VTkRfUkVTVU1FX0JBQ0tHUk9VTkQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklMX1JFUVVFU1RfSEFOR1VQX1dBSVRJTkdfT1JfQkFDS0dST1VORAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUxfUkVRVUVTVF9MQVNUX0NBTExfRkFJTF9DQVVTRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUxfUkVRVUVTVF9MQVNUX1BEUF9GQUlMX0NBVVNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJTF9SRVFVRVNUX09FTV9IT09LX1JBVwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUxfUkVRVUVTVF9PRU1fSE9PS19TVFJJTkdTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJTF9SRVFVRVNUX09QRVJBVE9SCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJTF9SRVFVRVNUX1BEUF9DT05URVhUX0xJU1QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklMX1JFUVVFU1RfUVVFUllfQVZBSUxBQkxFX0JBTkRfTU9ERQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUxfUkVRVUVTVF9RVUVSWV9BVkFJTEFCTEVfTkVUV09SS1MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklMX1JFUVVFU1RfUVVFUllfQ0FMTF9GT1JXQVJEX1NUQVRVUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUxfUkVRVUVTVF9RVUVSWV9DQUxMX1dBSVRJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklMX1JFUVVFU1RfUVVFUllfQ0xJUAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUxfUkVRVUVTVF9RVUVSWV9GQUNJTElUWV9MT0NLCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJTF9SRVFVRVNUX1FVRVJZX05FVFdPUktfU0VMRUNUSU9OX01PREUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklMX1JFUVVFU1RfUkFESU9fUE9XRVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklMX1JFUVVFU1RfUkVHSVNUUkFUSU9OX1NUQVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJTF9SRVFVRVNUX1JFU0VUX1JBRElPCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJTF9SRVFVRVNUX1NDUkVFTl9TVEFURQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUxfUkVRVUVTVF9TRU5EX1NNUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUxfUkVRVUVTVF9TRU5EX1NNU19FWFBFQ1RfTU9SRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUxfUkVRVUVTVF9TRU5EX1VTU0QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklMX1JFUVVFU1RfU0VQQVJBVEVfQ09OTkVDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUxfUkVRVUVTVF9TRVRVUF9ERUZBVUxUX1BEUAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUxfUkVRVUVTVF9TRVRfQkFORF9NT0RFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJTF9SRVFVRVNUX1NFVF9DQUxMX0ZPUldBUkQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklMX1JFUVVFU1RfU0VUX0NBTExfV0FJVElORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUxfUkVRVUVTVF9TRVRfQ0xJUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUxfUkVRVUVTVF9TRVRfRkFDSUxJVFlfTE9DSwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUxfUkVRVUVTVF9TRVRfTE9DQVRJT05fVVBEQVRFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUxfUkVRVUVTVF9TRVRfTVVURQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUxfUkVRVUVTVF9TRVRfTkVUV09SS19TRUxFQ1RJT05fQVVUT01BVElDCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJTF9SRVFVRVNUX1NFVF9ORVRXT1JLX1NFTEVDVElPTl9NQU5VQUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklMX1JFUVVFU1RfU0VUX1BSRUZFUlJFRF9ORVRXT1JLX1RZUEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklMX1JFUVVFU1RfU0VUX1NVUFBfU1ZDX05PVElGSUNBVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUxfUkVRVUVTVF9TSUdOQUxfU1RSRU5HVEgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklMX1JFUVVFU1RfU0lNX0lPCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJTF9SRVFVRVNUX1NNU19BQ0tOT1dMRURHRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUxfUkVRVUVTVF9TVEtfR0VUX1BST0ZJTEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklMX1JFUVVFU1RfU1RLX0hBTkRMRV9DQUxMX1NFVFVQX1JFUVVFU1RFRF9GUk9NX1NJTQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUxfUkVRVUVTVF9TVEtfU0VORF9FTlZFTE9QRV9DT01NQU5ECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJTF9SRVFVRVNUX1NUS19TRU5EX1RFUk1JTkFMX1JFU1BPTlNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJTF9SRVFVRVNUX1NUS19TRVRfUFJPRklMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUxfUkVRVUVTVF9TV0lUQ0hfV0FJVElOR19PUl9IT0xESU5HX0FORF9BQ1RJVkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklMX1JFUVVFU1RfVURVQgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUxfUkVRVUVTVF9XUklURV9TTVNfVE9fU0lNCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJTF9TSU1fQUJTRU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJTF9TSU1fTkVUV09SS19QRVJTT05BTElaQVRJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklMX1NJTV9OT1RfUkVBRFkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklMX1NJTV9QSU4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklMX1NJTV9QVUsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklMX1NJTV9SRUFEWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUxfVU5TT0xfQ0FMTF9SSU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJTF9VTlNPTF9OSVRaX1RJTUVfUkVDRUlWRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklMX1VOU09MX09OX1VTU0QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklMX1VOU09MX09OX1VTU0RfUkVRVUVTVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUxfVU5TT0xfUERQX0NPTlRFWFRfTElTVF9DSEFOR0VECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJTF9VTlNPTF9SRVNQT05TRV9CQVNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJTF9VTlNPTF9SRVNQT05TRV9DQUxMX1NUQVRFX0NIQU5HRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklMX1VOU09MX1JFU1BPTlNFX05FVFdPUktfU1RBVEVfQ0hBTkdFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUxfVU5TT0xfUkVTUE9OU0VfTkVXX1NNUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUxfVU5TT0xfUkVTUE9OU0VfTkVXX1NNU19PTl9TSU0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklMX1VOU09MX1JFU1BPTlNFX05FV19TTVNfU1RBVFVTX1JFUE9SVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUxfVU5TT0xfUkVTUE9OU0VfUkFESU9fU1RBVEVfQ0hBTkdFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUxfVU5TT0xfU0lHTkFMX1NUUkVOR1RICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJTF9VTlNPTF9TSU1fUkVGUkVTSAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUxfVU5TT0xfU0lNX1NNU19TVE9SQUdFX0ZVTEwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklMX1VOU09MX1NUS19DQUxMX1NFVFVQCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJTF9VTlNPTF9TVEtfRVZFTlRfTk9USUZZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJTF9VTlNPTF9TVEtfUFJPQUNUSVZFX0NPTU1BTkQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklMX1VOU09MX1NUS19TRVNTSU9OX0VORAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUxfVU5TT0xfU1VQUF9TVkNfTk9USUZJQ0FUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJTV9QSU4yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJTV9QVUsyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNNU19TRU5EX0ZBSUxfUkVUUlkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1VDQ0VTUwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi0gY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5SSUxSZXF1ZXN0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMT0dfVEFHCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfUE9PTF9TSVpFCi0KLXN0YXRpYyBpbnQgc05leHRTZXJpYWwKLQotcHJpdmF0ZSBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5SSUxSZXF1ZXN0IHNQb29sCi0KLXByaXZhdGUgc3RhdGljIGludCBzUG9vbFNpemUKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLk9iamVjdCBzUG9vbFN5bmMKLQotc3RhdGljIGphdmEubGFuZy5PYmplY3Qgc1NlcmlhbE1vbml0b3IKLQotIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uUklMUmVxdWVzdCBtTmV4dAotCi0gaW50IG1SZXF1ZXN0Ci0KLSBhbmRyb2lkLm9zLk1lc3NhZ2UgbVJlc3VsdAotCi0gaW50IG1TZXJpYWwKLQotIGFuZHJvaWQub3MuUGFyY2VsIG1wCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uUklMUmVxdWVzdCBvYnRhaW4oCi1pbnQKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotc3RhdGljIHZvaWQgcmVzZXRTZXJpYWwoKQotCi0gdm9pZCBvbkVycm9yKAotaW50KQotCi0gdm9pZCByZWxlYXNlKCkKLQotIGphdmEubGFuZy5TdHJpbmcgc2VyaWFsU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9TSU1GaWxlSGFuZGxlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPUxvYWRMaW5lYXJGaXhlZENvbnRleHQgKQotIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uU0lNRmlsZUhhbmRsZXIkTG9hZExpbmVhckZpeGVkQ29udGV4dCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGludCBjb3VudFJlY29yZHMKLQotIGludCBlZmlkCi0KLSBib29sZWFuIGxvYWRBbGwKLQotIGFuZHJvaWQub3MuTWVzc2FnZSBvbkxvYWRlZAotCi0gaW50IHJlY29yZE51bQotCi0gaW50IHJlY29yZFNpemUKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0FycmF5TGlzdDxbQj47ICkKLSBqYXZhLnV0aWwuQXJyYXlMaXN0IHJlc3VsdHMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1pbnQKLWludAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi0gdm9pZCA8aW5pdD4oCi1pbnQKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1NJTUZpbGVIYW5kbGVyJExvYWRMaW5lYXJGaXhlZENvbnRleHQ7ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlNJTUZpbGVIYW5kbGVyIGV4dGVuZHMgYW5kcm9pZC5vcy5IYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT01NQU5EX0dFVF9SRVNQT05TRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09NTUFORF9SRUFEX0JJTkFSWQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09NTUFORF9SRUFEX1JFQ09SRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09NTUFORF9TRUVLCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT01NQU5EX1VQREFURV9CSU5BUlkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTU1BTkRfVVBEQVRFX1JFQ09SRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRUZfVFlQRV9DWUNMSUMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVGX1RZUEVfTElORUFSX0ZJWEVECi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFRl9UWVBFX1RSQU5TUEFSRU5UCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9HRVRfQklOQVJZX1NJWkVfRE9ORQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfR0VUX0VGX0xJTkVBUl9SRUNPUkRfU0laRV9ET05FCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9HRVRfUkVDT1JEX1NJWkVfRE9ORQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfUkVBRF9CSU5BUllfRE9ORQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfUkVBRF9JQ09OX0RPTkUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1JFQURfSU1HX0RPTkUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1JFQURfUkVDT1JEX0RPTkUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdFVF9SRVNQT05TRV9FRl9JTUdfU0laRV9CWVRFUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR0VUX1JFU1BPTlNFX0VGX1NJWkVfQllURVMKLQotc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTE9HX1RBRwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVBRF9SRUNPUkRfTU9ERV9BQlNPTFVURQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfREFUQV9BQ0NFU1NfQ09ORElUSU9OXzEKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX0RBVEFfQUNDRVNTX0NPTkRJVElPTl8yCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9EQVRBX0FDQ0VTU19DT05ESVRJT05fMwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfREFUQV9GSUxFX0lEXzEKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX0RBVEFfRklMRV9JRF8yCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9EQVRBX0ZJTEVfU0laRV8xCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9EQVRBX0ZJTEVfU0laRV8yCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9EQVRBX0ZJTEVfU1RBVFVTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9EQVRBX0ZJTEVfVFlQRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfREFUQV9MRU5HVEgKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX0RBVEFfUkVDT1JEX0xFTkdUSAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfREFUQV9SRlVfMQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfREFUQV9SRlVfMgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfREFUQV9SRlVfMwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfREFUQV9TVFJVQ1RVUkUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRZUEVfREYKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRZUEVfRUYKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRZUEVfTUYKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRZUEVfUkZVCi0KLSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkdTTVBob25lIHBob25lCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5HU01QaG9uZSkKLQotcHJpdmF0ZSB2b2lkIHNlbmRSZXN1bHQoCi1hbmRyb2lkLm9zLk1lc3NhZ2UKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLSB2b2lkIGdldEVGTGluZWFyUmVjb3JkU2l6ZSgKLWludAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBsb2FkRUZJbWdMaW5lYXJGaXhlZCgKLWludAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBsb2FkRUZJbWdUcmFuc3BhcmVudCgKLWludAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi0gdm9pZCBsb2FkRUZMaW5lYXJGaXhlZCgKLWludAotaW50Ci1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLSB2b2lkIGxvYWRFRkxpbmVhckZpeGVkQWxsKAotaW50Ci1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLSB2b2lkIGxvYWRFRlRyYW5zcGFyZW50KAotaW50Ci1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLSB2b2lkIHVwZGF0ZUVGTGluZWFyRml4ZWQoCi1pbnQKLWludAotYnl0ZVtdCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLSB2b2lkIHVwZGF0ZUVGVHJhbnNwYXJlbnQoCi1pbnQKLWJ5dGVbXQotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1NJTVJlY29yZHM7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9NDEwNCBuYW1lID1udWxsICkKLSBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlNJTVJlY29yZHMkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIGludFtdICRTd2l0Y2hNYXAkY29tJGFuZHJvaWQkaW50ZXJuYWwkdGVsZXBob255JGdzbSRTSU1SZWNvcmRzJEdldF9TcG5fRnNtX1N0YXRlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1NJTVJlY29yZHM7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL0VudW08TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU0lNUmVjb3JkcyRHZXRfU3BuX0ZzbV9TdGF0ZTs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE2NDEwIG5hbWUgPUdldF9TcG5fRnNtX1N0YXRlICkKLWZpbmFsIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uU0lNUmVjb3JkcyRHZXRfU3BuX0ZzbV9TdGF0ZSBleHRlbmRzIGphdmEubGFuZy5FbnVtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uU0lNUmVjb3JkcyRHZXRfU3BuX0ZzbV9TdGF0ZVtdICRWQUxVRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlNJTVJlY29yZHMkR2V0X1Nwbl9Gc21fU3RhdGUgSURMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uU0lNUmVjb3JkcyRHZXRfU3BuX0ZzbV9TdGF0ZSBJTklUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5TSU1SZWNvcmRzJEdldF9TcG5fRnNtX1N0YXRlIFJFQURfU1BOXzNHUFAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlNJTVJlY29yZHMkR2V0X1Nwbl9Gc21fU3RhdGUgUkVBRF9TUE5fQ1BIUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uU0lNUmVjb3JkcyRHZXRfU3BuX0ZzbV9TdGF0ZSBSRUFEX1NQTl9TSE9SVF9DUEhTCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpViApCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uU0lNUmVjb3JkcyRHZXRfU3BuX0ZzbV9TdGF0ZSB2YWx1ZU9mKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlNJTVJlY29yZHMkR2V0X1Nwbl9Gc21fU3RhdGVbXSB2YWx1ZXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU0lNUmVjb3JkcyQxO0xjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1NJTVJlY29yZHMkR2V0X1Nwbl9Gc21fU3RhdGU7ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlNJTVJlY29yZHMgZXh0ZW5kcyBhbmRyb2lkLm9zLkhhbmRsZXIgaW1wbGVtZW50cyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlNpbUNvbnN0YW50cwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgaW50IENGRl9MSU5FMV9NQVNLCi0KLXN0YXRpYyBmaW5hbCBpbnQgQ0ZGX0xJTkUxX1JFU0VUCi0KLXN0YXRpYyBmaW5hbCBpbnQgQ0ZGX1VOQ09ORElUSU9OQUxfQUNUSVZFCi0KLXN0YXRpYyBmaW5hbCBpbnQgQ0ZGX1VOQ09ORElUSU9OQUxfREVBQ1RJVkUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENQSFNfU1NUX01CTl9FTkFCTEVECi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDUEhTX1NTVF9NQk5fTUFTSwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIENSQVNIX1JJTAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfR0VUX0FEX0RPTkUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0dFVF9BTExfU01TX0RPTkUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0dFVF9DRkZfRE9ORQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfR0VUX0NGSVNfRE9ORQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfR0VUX0NQSFNfTUFJTEJPWF9ET05FCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9HRVRfSUNDSURfRE9ORQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfR0VUX0lNU0lfRE9ORQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfR0VUX0lORk9fQ1BIU19ET05FCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9HRVRfTUJETl9ET05FCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9HRVRfTUJJX0RPTkUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0dFVF9NU0lTRE5fRE9ORQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfR0VUX01XSVNfRE9ORQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfR0VUX1BOTl9ET05FCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9HRVRfU01TX0RPTkUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0dFVF9TUERJX0RPTkUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0dFVF9TUE5fRE9ORQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfR0VUX1NTVF9ET05FCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9HRVRfVk9JQ0VfTUFJTF9JTkRJQ0FUT1JfQ1BIU19ET05FCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9NQVJLX1NNU19SRUFEX0RPTkUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1JBRElPX09GRl9PUl9OT1RfQVZBSUxBQkxFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9TRVRfQ1BIU19NQUlMQk9YX0RPTkUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1NFVF9NQkROX0RPTkUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1NFVF9NU0lTRE5fRE9ORQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfU0lNX1JFQURZCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9TSU1fUkVGUkVTSAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfU01TX09OX1NJTQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfVVBEQVRFX0RPTkUKLQotc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTE9HX1RBRwotCi1zdGF0aWMgZmluYWwgaW50IFNQTl9SVUxFX1NIT1dfUExNTgotCi1zdGF0aWMgZmluYWwgaW50IFNQTl9SVUxFX1NIT1dfU1BOCi0KLXN0YXRpYyBmaW5hbCBpbnQgVEFHX0ZVTExfTkVUV09SS19OQU1FCi0KLXN0YXRpYyBmaW5hbCBpbnQgVEFHX1NIT1JUX05FVFdPUktfTkFNRQotCi1zdGF0aWMgZmluYWwgaW50IFRBR19TUERJX1BMTU5fTElTVAotCi0gY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5BZG5SZWNvcmRDYWNoZSBhZG5DYWNoZQotCi0gYm9vbGVhbiBjYWxsRm9yd2FyZGluZ0VuYWJsZWQKLQotIGludCBjb3VudFZvaWNlTWVzc2FnZXMKLQotIGJ5dGVbXSBlZkNQSFNfTVdJCi0KLSBieXRlW10gZWZNV0lTCi0KLSBqYXZhLmxhbmcuU3RyaW5nIGljY2lkCi0KLSBqYXZhLmxhbmcuU3RyaW5nIGltc2kKLQotIGJvb2xlYW4gaXNWb2ljZU1haWxGaXhlZAotCi1wcml2YXRlIGJ5dGVbXSBtQ3Boc0luZm8KLQotIGJ5dGVbXSBtRWZDZmYKLQotIGJ5dGVbXSBtRWZDZmlzCi0KLSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlZvaWNlTWFpbENvbnN0YW50cyBtVm1Db25maWcKLQotIGludCBtYWlsYm94SW5kZXgKLQotIGludCBtbmNMZW5ndGgKLQotIGphdmEubGFuZy5TdHJpbmcgbXNpc2RuCi0KLSBqYXZhLmxhbmcuU3RyaW5nIG1zaXNkblRhZwotCi0gamF2YS5sYW5nLlN0cmluZyBuZXdWb2ljZU1haWxOdW0KLQotIGphdmEubGFuZy5TdHJpbmcgbmV3Vm9pY2VNYWlsVGFnCi0KLSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkdTTVBob25lIHBob25lCi0KLSBqYXZhLmxhbmcuU3RyaW5nIHBubkhvbWVOYW1lCi0KLSBhbmRyb2lkLm9zLlJlZ2lzdHJhbnRMaXN0IHJlY29yZHNMb2FkZWRSZWdpc3RyYW50cwotCi0gYm9vbGVhbiByZWNvcmRzUmVxdWVzdGVkCi0KLSBpbnQgcmVjb3Jkc1RvTG9hZAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQXJyYXlMaXN0PExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLSBqYXZhLnV0aWwuQXJyYXlMaXN0IHNwZGlOZXR3b3JrcwotCi0gamF2YS5sYW5nLlN0cmluZyBzcG4KLQotIGludCBzcG5EaXNwbGF5Q29uZGl0aW9uCi0KLXByaXZhdGUgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5TSU1SZWNvcmRzJEdldF9TcG5fRnNtX1N0YXRlIHNwblN0YXRlCi0KLSBqYXZhLmxhbmcuU3RyaW5nIHZvaWNlTWFpbE51bQotCi0gamF2YS5sYW5nLlN0cmluZyB2b2ljZU1haWxUYWcKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkdTTVBob25lKQotCi1wcml2YXRlIHZvaWQgZmV0Y2hTaW1SZWNvcmRzKCkKLQotcHJpdmF0ZSB2b2lkIGdldFNwbkZzbSgKLWJvb2xlYW4KLWFuZHJvaWQub3MuQXN5bmNSZXN1bHQpCi0KLXByaXZhdGUgdm9pZCBoYW5kbGVGaWxlVXBkYXRlKAotaW50KQotCi1wcml2YXRlIHZvaWQgaGFuZGxlU2ltUmVmcmVzaCgKLWludFtdKQotCi1wcml2YXRlIHZvaWQgaGFuZGxlU21zKAotYnl0ZVtdKQotCi1wcml2YXRlIHZvaWQgaGFuZGxlU21zZXMoCi1qYXZhLnV0aWwuQXJyYXlMaXN0KQotCi1wcml2YXRlIGJvb2xlYW4gaXNDcGhzTWFpbGJveEVuYWJsZWQoKQotCi1wcml2YXRlIGJvb2xlYW4gaXNPbk1hdGNoaW5nUGxtbigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgdm9pZCBsb2coCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHZvaWQgb25BbGxSZWNvcmRzTG9hZGVkKCkKLQotcHJpdmF0ZSB2b2lkIG9uUmFkaW9PZmZPck5vdEF2YWlsYWJsZSgpCi0KLXByaXZhdGUgdm9pZCBvblJlY29yZExvYWRlZCgpCi0KLXByaXZhdGUgdm9pZCBvblNpbVJlYWR5KCkKLQotcHJpdmF0ZSB2b2lkIHBhcnNlRWZTcGRpKAotYnl0ZVtdKQotCi1wcml2YXRlIHZvaWQgc2V0Vm9pY2VNYWlsQnlDb3VudHJ5KAotamF2YS5sYW5nLlN0cmluZykKLQotIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uQWRuUmVjb3JkQ2FjaGUgZ2V0QWRuQ2FjaGUoKQotCi1wdWJsaWMgaW50IGdldENvdW50Vm9pY2VNZXNzYWdlcygpCi0KLSBpbnQgZ2V0RGlzcGxheVJ1bGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJTVNJKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TXNpc2RuQWxwaGFUYWcoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRNc2lzZG5OdW1iZXIoKQotCi0gYm9vbGVhbiBnZXRSZWNvcmRzTG9hZGVkKCkKLQotIGphdmEubGFuZy5TdHJpbmcgZ2V0U0lNT3BlcmF0b3JOdW1lcmljKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U2VydmljZVByb3ZpZGVOYW1lKCkKLQotcHVibGljIGJvb2xlYW4gZ2V0Vm9pY2VDYWxsRm9yd2FyZGluZ0ZsYWcoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRWb2ljZU1haWxBbHBoYVRhZygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFZvaWNlTWFpbE51bWJlcigpCi0KLXB1YmxpYyBib29sZWFuIGdldFZvaWNlTWVzc2FnZVdhaXRpbmcoKQotCi1wdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBvblJlZnJlc2goCi1ib29sZWFuCi1pbnRbXSkKLQotcHVibGljIHZvaWQgcmVnaXN0ZXJGb3JSZWNvcmRzTG9hZGVkKAotYW5kcm9pZC5vcy5IYW5kbGVyCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2lkIHNldE1zaXNkbk51bWJlcigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgc2V0Vm9pY2VDYWxsRm9yd2FyZGluZ0ZsYWcoCi1pbnQKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldFZvaWNlTWFpbE51bWJlcigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgc2V0Vm9pY2VNZXNzYWdlV2FpdGluZygKLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1NNU0Rpc3BhdGNoZXI7ICkKLSBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlNNU0Rpc3BhdGNoZXIkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlJE9uQ2xpY2tMaXN0ZW5lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlNNU0Rpc3BhdGNoZXIgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5TTVNEaXNwYXRjaGVyKQotCi1wdWJsaWMgdm9pZCBvbkNsaWNrKAotYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZQotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1NNU0Rpc3BhdGNoZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MiBuYW1lID1TbXNDb3VudGVyICkKLSBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlNNU0Rpc3BhdGNoZXIkU21zQ291bnRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBpbnQgbUNoZWNrUGVyaW9kCi0KLXByaXZhdGUgaW50IG1NYXhBbGxvd2VkCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNoTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL3V0aWwvQXJyYXlMaXN0PExqYXZhL2xhbmcvTG9uZzs+Oz47ICkKLXByaXZhdGUgamF2YS51dGlsLkhhc2hNYXAgbVNtc1N0YW1wCi0KLWZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uU01TRGlzcGF0Y2hlciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlNNU0Rpc3BhdGNoZXIKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0FycmF5TGlzdDxMamF2YS9sYW5nL0xvbmc7PjspWiApCi1wcml2YXRlIGJvb2xlYW4gaXNVbmRlckxpbWl0KAotamF2YS51dGlsLkFycmF5TGlzdCkKLQotIGJvb2xlYW4gY2hlY2soCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1TbXNUcmFja2VyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1NNU0Rpc3BhdGNoZXI7ICkKLSBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlNNU0Rpc3BhdGNoZXIkU21zVHJhY2tlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGphdmEudXRpbC5IYXNoTWFwIG1EYXRhCi0KLSBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50IG1EZWxpdmVyeUludGVudAotCi0gaW50IG1NZXNzYWdlUmVmCi0KLSBpbnQgbVJldHJ5Q291bnQKLQotIGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQgbVNlbnRJbnRlbnQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuSGFzaE1hcAotYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudAotYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1NNU0Rpc3BhdGNoZXIkU21zVHJhY2tlcjtMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9TTVNEaXNwYXRjaGVyJFNtc0NvdW50ZXI7ICkKLWZpbmFsIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uU01TRGlzcGF0Y2hlciBleHRlbmRzIGFuZHJvaWQub3MuSGFuZGxlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9TTVNfQ0hFQ0tfUEVSSU9ECi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1NNU19NQVhfQUxMT1dFRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9TTVNfVElNT1VFT1VUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgRFJNX1JJR0hUU19XQlhNTAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERSTV9SSUdIVFNfV0JYTUxfTUlNRV9UWVBFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgRFJNX1JJR0hUU19YTUwKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBEUk1fUklHSFRTX1hNTF9NSU1FX1RZUEUKLQotc3RhdGljIGZpbmFsIGludCBFVkVOVF9BTEVSVF9USU1FT1VUCi0KLXN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfTkVXX1NNUwotCi1zdGF0aWMgZmluYWwgaW50IEVWRU5UX05FV19TTVNfU1RBVFVTX1JFUE9SVAotCi1zdGF0aWMgZmluYWwgaW50IEVWRU5UX1BPU1RfQUxFUlQKLQotc3RhdGljIGZpbmFsIGludCBFVkVOVF9TRU5EX0NPTkZJUk1FRF9TTVMKLQotc3RhdGljIGZpbmFsIGludCBFVkVOVF9TRU5EX1JFVFJZCi0KLXN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfU0VORF9TTVNfQ09NUExFVEUKLQotc3RhdGljIGZpbmFsIGludCBFVkVOVF9TSU1fRlVMTAotCi1zdGF0aWMgZmluYWwgaW50IE1BSUxfU0VORF9TTVMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9TRU5EX1JFVFJJRVMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBNTVNfTUlNRV9UWVBFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmdbXSBSQVdfUFJPSkVDVElPTgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VORF9SRVRSWV9ERUxBWQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRBRwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIFdBUF9DT19NSU1FX1BPUlQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBXQVBfQ09fTUlNRV9UWVBFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXQVBfUERVX0xFTkdUSF9RVU9URQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0FQX1BEVV9TSE9SVF9MRU5HVEhfTUFYCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXQVBfUERVX1RZUEVfQ09ORklSTUVEX1BVU0gKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdBUF9QRFVfVFlQRV9QVVNICi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgV0FQX1NJX01JTUVfUE9SVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFdBUF9TSV9NSU1FX1RZUEUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBXQVBfU0xfTUlNRV9QT1JUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgV0FQX1NMX01JTUVfVFlQRQotCi1wcml2YXRlIHN0YXRpYyBpbnQgc0NvbmNhdGVuYXRlZFJlZgotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQXJyYXlMaXN0PExjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1NNU0Rpc3BhdGNoZXIkU21zVHJhY2tlcjs+OyApCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5BcnJheUxpc3QgZGVsaXZlcnlQZW5kaW5nTGlzdAotCi1wcml2YXRlIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uQ29tbWFuZHNJbnRlcmZhY2UgbUNtCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgbUNvbnRleHQKLQotcHJpdmF0ZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlNNU0Rpc3BhdGNoZXIkU21zQ291bnRlciBtQ291bnRlcgotCi1wcml2YXRlIGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UkT25DbGlja0xpc3RlbmVyIG1MaXN0ZW5lcgotCi1wcml2YXRlIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uR1NNUGhvbmUgbVBob25lCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5uZXQuVXJpIG1SYXdVcmkKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyIG1SZXNvbHZlcgotCi1wcml2YXRlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uU01TRGlzcGF0Y2hlciRTbXNUcmFja2VyIG1TVHJhY2tlcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5HU01QaG9uZSkKLQotcHJpdmF0ZSB2b2lkIGRpc3BhdGNoUGR1cygKLWJ5dGVbXVtdKQotCi1wcml2YXRlIHZvaWQgZGlzcGF0Y2hQb3J0QWRkcmVzc2VkUGR1cygKLWJ5dGVbXVtdCi1pbnQpCi0KLXByaXZhdGUgdm9pZCBkaXNwYXRjaFdhcFBkdSgKLWJ5dGVbXSkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGdldEFwcE5hbWVCeUludGVudCgKLWFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQpCi0KLXByaXZhdGUgdm9pZCBoYW5kbGVOb3RJblNlcnZpY2UoCi1pbnQKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uU01TRGlzcGF0Y2hlciRTbXNUcmFja2VyKQotCi1wcml2YXRlIHZvaWQgaGFuZGxlUmVhY2hTZW50TGltaXQoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlNNU0Rpc3BhdGNoZXIkU21zVHJhY2tlcikKLQotcHJpdmF0ZSB2b2lkIGhhbmRsZVNlbmRDb21wbGV0ZSgKLWFuZHJvaWQub3MuQXN5bmNSZXN1bHQpCi0KLXByaXZhdGUgdm9pZCBoYW5kbGVTaW1GdWxsKCkKLQotcHJpdmF0ZSB2b2lkIGhhbmRsZVN0YXR1c1JlcG9ydCgKLWFuZHJvaWQub3MuQXN5bmNSZXN1bHQpCi0KLXByaXZhdGUgdm9pZCBwcm9jZXNzTWVzc2FnZVBhcnQoCi1hbmRyb2lkLnRlbGVwaG9ueS5nc20uU21zTWVzc2FnZQotaW50Ci1pbnQKLWludAotaW50KQotCi1wcml2YXRlIHZvaWQgc2VuZFNtcygKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uU01TRGlzcGF0Y2hlciRTbXNUcmFja2VyKQotCi0gdm9pZCBkaXNwYXRjaE1lc3NhZ2UoCi1hbmRyb2lkLnRlbGVwaG9ueS5nc20uU21zTWVzc2FnZSkKLQotcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZSgKLWFuZHJvaWQub3MuTWVzc2FnZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvdXRpbC9BcnJheUxpc3Q8TGphdmEvbGFuZy9TdHJpbmc7PjtMamF2YS91dGlsL0FycmF5TGlzdDxMYW5kcm9pZC9hcHAvUGVuZGluZ0ludGVudDs+O0xqYXZhL3V0aWwvQXJyYXlMaXN0PExhbmRyb2lkL2FwcC9QZW5kaW5nSW50ZW50Oz47KVYgKQotIHZvaWQgc2VuZE11bHRpcGFydFRleHQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnV0aWwuQXJyYXlMaXN0Ci1qYXZhLnV0aWwuQXJyYXlMaXN0Ci1qYXZhLnV0aWwuQXJyYXlMaXN0KQotCi0gdm9pZCBzZW5kUmF3UGR1KAotYnl0ZVtdCi1ieXRlW10KLWFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQKLWFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU2VydmljZVN0YXRlVHJhY2tlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uU2VydmljZVN0YXRlVHJhY2tlciQxIGV4dGVuZHMgYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5TZXJ2aWNlU3RhdGVUcmFja2VyIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uU2VydmljZVN0YXRlVHJhY2tlcgotYW5kcm9pZC5vcy5IYW5kbGVyKQotCi1wdWJsaWMgdm9pZCBvbkNoYW5nZSgKLWJvb2xlYW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID00MTA0IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU2VydmljZVN0YXRlVHJhY2tlcjsgKQotIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uU2VydmljZVN0YXRlVHJhY2tlciQyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgaW50W10gJFN3aXRjaE1hcCRjb20kYW5kcm9pZCRpbnRlcm5hbCR0ZWxlcGhvbnkkZ3NtJENvbW1hbmRzSW50ZXJmYWNlJFJhZGlvU3RhdGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9TZXJ2aWNlU3RhdGVUcmFja2VyJDI7ICkKLWZpbmFsIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uU2VydmljZVN0YXRlVHJhY2tlciBleHRlbmRzIGFuZHJvaWQub3MuSGFuZGxlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgaW50IERBVEFfQUNDRVNTX0VER0UKLQotc3RhdGljIGZpbmFsIGludCBEQVRBX0FDQ0VTU19HUFJTCi0KLXN0YXRpYyBmaW5hbCBpbnQgREFUQV9BQ0NFU1NfVU1UUwotCi1zdGF0aWMgZmluYWwgaW50IERBVEFfQUNDRVNTX1VOS05PV04KLQotc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHCi0KLXN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfR0VUX0xPQ19ET05FCi0KLXN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfR0VUX1NJR05BTF9TVFJFTkdUSAotCi1zdGF0aWMgZmluYWwgaW50IEVWRU5UX0xPQ0FUSU9OX1VQREFURVNfRU5BQkxFRAotCi1zdGF0aWMgZmluYWwgaW50IEVWRU5UX05FVFdPUktfU1RBVEVfQ0hBTkdFRAotCi1zdGF0aWMgZmluYWwgaW50IEVWRU5UX05JVFpfVElNRQotCi1zdGF0aWMgZmluYWwgaW50IEVWRU5UX1BPTExfU0lHTkFMX1NUUkVOR1RICi0KLXN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfUE9MTF9TVEFURV9HUFJTCi0KLXN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfUE9MTF9TVEFURV9ORVRXT1JLX1NFTEVDVElPTl9NT0RFCi0KLXN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfUE9MTF9TVEFURV9PUEVSQVRPUgotCi1zdGF0aWMgZmluYWwgaW50IEVWRU5UX1BPTExfU1RBVEVfUkVHSVNUUkFUSU9OCi0KLXN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfUkFESU9fQVZBSUxBQkxFCi0KLXN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfUkFESU9fU1RBVEVfQ0hBTkdFRAotCi1zdGF0aWMgZmluYWwgaW50IEVWRU5UX1NJR05BTF9TVFJFTkdUSF9VUERBVEUKLQotc3RhdGljIGZpbmFsIGludCBFVkVOVF9TSU1fUkVBRFkKLQotc3RhdGljIGZpbmFsIGludCBFVkVOVF9TSU1fUkVDT1JEU19MT0FERUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZ1tdIEdNVF9DT1VOVFJZX0NPREVTCi0KLXN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIExPR19UQUcKLQotc3RhdGljIGZpbmFsIGludCBQT0xMX1BFUklPRF9NSUxMSVMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUSU1FWk9ORV9QUk9QRVJUWQotCi1zdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUTVVLCi0KLSBhbmRyb2lkLnRlbGVwaG9ueS5nc20uR3NtQ2VsbExvY2F0aW9uIGNlbGxMb2MKLQotIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uQ29tbWFuZHNJbnRlcmZhY2UgY20KLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGN1clBsbW4KLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGN1clNwbgotCi1wcml2YXRlIGludCBjdXJTcG5SdWxlCi0KLSBib29sZWFuIGRvbnRQb2xsU2lnbmFsU3RyZW5ndGgKLQotcHJpdmF0ZSBhbmRyb2lkLm9zLlJlZ2lzdHJhbnRMaXN0IGdwcnNBdHRhY2hlZFJlZ2lzdHJhbnRzCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5SZWdpc3RyYW50TGlzdCBncHJzRGV0YWNoZWRSZWdpc3RyYW50cwotCi1wcml2YXRlIGludCBncHJzU3RhdGUKLQotcHJpdmF0ZSBhbmRyb2lkLmRhdGFiYXNlLkNvbnRlbnRPYnNlcnZlciBtQXV0b1RpbWVPYnNlcnZlcgotCi0gYm9vbGVhbiBtRGVzaXJlZFBvd2VyU3RhdGUKLQotcHJpdmF0ZSBib29sZWFuIG1Hb3RDb3VudHJ5Q29kZQotCi1wcml2YXRlIGJvb2xlYW4gbUdzbVJvYW1pbmcKLQotcHJpdmF0ZSBib29sZWFuIG1OZWVkRml4Wm9uZQotCi1wcml2YXRlIGJvb2xlYW4gbU5lZWRUb1JlZ0ZvclNpbUxvYWRlZAotCi0gbG9uZyBtU2F2ZWRBdFRpbWUKLQotIGxvbmcgbVNhdmVkVGltZQotCi0gamF2YS5sYW5nLlN0cmluZyBtU2F2ZWRUaW1lWm9uZQotCi1wcml2YXRlIGJvb2xlYW4gbVpvbmVEc3QKLQotcHJpdmF0ZSBpbnQgbVpvbmVPZmZzZXQKLQotcHJpdmF0ZSBsb25nIG1ab25lVGltZQotCi1wcml2YXRlIGFuZHJvaWQub3MuUmVnaXN0cmFudExpc3QgbmV0d29ya0F0dGFjaGVkUmVnaXN0cmFudHMKLQotcHJpdmF0ZSBpbnQgbmV0d29ya1R5cGUKLQotIGFuZHJvaWQudGVsZXBob255LmdzbS5Hc21DZWxsTG9jYXRpb24gbmV3Q2VsbExvYwotCi1wcml2YXRlIGludCBuZXdHUFJTU3RhdGUKLQotcHJpdmF0ZSBpbnQgbmV3TmV0d29ya1R5cGUKLQotIGFuZHJvaWQudGVsZXBob255LlNlcnZpY2VTdGF0ZSBuZXdTUwotCi0gY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5HU01QaG9uZSBwaG9uZQotCi0gaW50W10gcG9sbGluZ0NvbnRleHQKLQotcHJpdmF0ZSBhbmRyb2lkLm9zLlJlZ2lzdHJhbnRMaXN0IHJvYW1pbmdPZmZSZWdpc3RyYW50cwotCi1wcml2YXRlIGFuZHJvaWQub3MuUmVnaXN0cmFudExpc3Qgcm9hbWluZ09uUmVnaXN0cmFudHMKLQotIGludCByc3NpCi0KLSBhbmRyb2lkLnRlbGVwaG9ueS5TZXJ2aWNlU3RhdGUgc3MKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLSB2b2lkIDxpbml0PigKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uR1NNUGhvbmUpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQwMDAoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlNlcnZpY2VTdGF0ZVRyYWNrZXIpCi0KLXByaXZhdGUgdm9pZCBjYW5jZWxQb2xsU3RhdGUoKQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGRpc3BsYXlOYW1lRm9yKAotaW50KQotCi1wcml2YXRlIGphdmEudXRpbC5UaW1lWm9uZSBmaW5kVGltZVpvbmUoCi1pbnQKLWJvb2xlYW4KLWxvbmcpCi0KLXByaXZhdGUgYm9vbGVhbiBnZXRBdXRvVGltZSgpCi0KLXByaXZhdGUgamF2YS51dGlsLlRpbWVab25lIGdldE5pdHpUaW1lWm9uZSgKLWludAotYm9vbGVhbgotbG9uZykKLQotcHJpdmF0ZSB2b2lkIGhhbmRsZVBvbGxTdGF0ZVJlc3VsdCgKLWludAotYW5kcm9pZC5vcy5Bc3luY1Jlc3VsdCkKLQotcHJpdmF0ZSBib29sZWFuIGlzUm9hbWluZ0JldHdlZW5PcGVyYXRvcnMoCi1ib29sZWFuCi1hbmRyb2lkLnRlbGVwaG9ueS5TZXJ2aWNlU3RhdGUpCi0KLXByaXZhdGUgYm9vbGVhbiBpc1Rtb2JpbGVVa1JvYW1pbmdFbWVyZ2VuY3koKQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIG5ldHdvcmtUeXBlVG9TdHJpbmcoCi1pbnQpCi0KLXByaXZhdGUgdm9pZCBvblNpZ25hbFN0cmVuZ3RoUmVzdWx0KAotYW5kcm9pZC5vcy5Bc3luY1Jlc3VsdCkKLQotcHJpdmF0ZSB2b2lkIHBvbGxTdGF0ZSgpCi0KLXByaXZhdGUgdm9pZCBwb2xsU3RhdGVEb25lKCkKLQotcHJpdmF0ZSB2b2lkIHF1ZXVlTmV4dFNpZ25hbFN0cmVuZ3RoUG9sbCgpCi0KLXByaXZhdGUgYm9vbGVhbiByZWdDb2RlSXNSb2FtaW5nKAotaW50KQotCi1wcml2YXRlIGludCByZWdDb2RlVG9TZXJ2aWNlU3RhdGUoCi1pbnQpCi0KLXByaXZhdGUgdm9pZCByZXZlcnRUb05pdHooKQotCi1wcml2YXRlIHZvaWQgc2F2ZU5pdHpUaW1lKAotbG9uZykKLQotcHJpdmF0ZSB2b2lkIHNhdmVOaXR6VGltZVpvbmUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHZvaWQgc2V0UG93ZXJTdGF0ZVRvRGVzaXJlZCgpCi0KLXByaXZhdGUgdm9pZCBzZXRSc3NpRGVmYXVsdFZhbHVlcygpCi0KLXByaXZhdGUgdm9pZCBzZXRUaW1lRnJvbU5JVFpTdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIGludCB0d29EaWdpdHNBdCgKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHJpdmF0ZSB2b2lkIHVwZGF0ZVNwbkRpc3BsYXkoKQotCi0gdm9pZCBkaXNhYmxlTG9jYXRpb25VcGRhdGVzKCkKLQotIHZvaWQgZW5hYmxlTG9jYXRpb25VcGRhdGVzKCkKLQotIGludCBnZXRDdXJyZW50R3Byc1N0YXRlKCkKLQotcHVibGljIHZvaWQgZ2V0TGFjQW5kQ2lkKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi0gYm9vbGVhbiBpc0NvbmN1cnJlbnRWb2ljZUFuZERhdGEoKQotCi0gdm9pZCByZWdpc3RlckZvckdwcnNBdHRhY2hlZCgKLWFuZHJvaWQub3MuSGFuZGxlcgotaW50Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi0gdm9pZCByZWdpc3RlckZvckdwcnNEZXRhY2hlZCgKLWFuZHJvaWQub3MuSGFuZGxlcgotaW50Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi0gdm9pZCByZWdpc3RlckZvck5ldHdvcmtBdHRhY2goCi1hbmRyb2lkLm9zLkhhbmRsZXIKLWludAotamF2YS5sYW5nLk9iamVjdCkKLQotIHZvaWQgcmVnaXN0ZXJGb3JSb2FtaW5nT2ZmKAotYW5kcm9pZC5vcy5IYW5kbGVyCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi0KLSB2b2lkIHJlZ2lzdGVyRm9yUm9hbWluZ09uKAotYW5kcm9pZC5vcy5IYW5kbGVyCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2lkIHNldFJhZGlvUG93ZXIoCi1ib29sZWFuKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uU2ltRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLkV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5TaW1GaWxlTm90Rm91bmQgZXh0ZW5kcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlNpbUV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLSB2b2lkIDxpbml0PigKLWludCkKLQotIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlNpbUZpbGVUeXBlTWlzbWF0Y2ggZXh0ZW5kcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlNpbUV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5TaW1Jb1Jlc3VsdCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGJ5dGVbXSBwYXlsb2FkCi0KLSBpbnQgc3cxCi0KLSBpbnQgc3cyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50Ci1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotaW50Ci1ieXRlW10pCi0KLXB1YmxpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlNpbUV4Y2VwdGlvbiBnZXRFeGNlcHRpb24oKQotCi1wdWJsaWMgYm9vbGVhbiBzdWNjZXNzKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1NpbVBob25lQm9va0ludGVyZmFjZU1hbmFnZXI7ICkKLSBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlNpbVBob25lQm9va0ludGVyZmFjZU1hbmFnZXIkMSBleHRlbmRzIGFuZHJvaWQub3MuSGFuZGxlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlNpbVBob25lQm9va0ludGVyZmFjZU1hbmFnZXIgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5TaW1QaG9uZUJvb2tJbnRlcmZhY2VNYW5hZ2VyKQotCi1wdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uU2ltUGhvbmVCb29rSW50ZXJmYWNlTWFuYWdlciBleHRlbmRzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uSVNpbVBob25lQm9vayRTdHViCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gQUxMT1dfU0lNX09QX0lOX1VJX1RIUkVBRAotCi1zdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0dFVF9TSVpFX0RPTkUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0xPQURfRE9ORQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfVVBEQVRFX0RPTkUKLQotc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTE9HX1RBRwotCi1wcml2YXRlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uQWRuUmVjb3JkQ2FjaGUgYWRuQ2FjaGUKLQotIGFuZHJvaWQub3MuSGFuZGxlciBtSGFuZGxlcgotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5PYmplY3QgbUxvY2sKLQotcHJpdmF0ZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkdTTVBob25lIHBob25lCi0KLXByaXZhdGUgaW50W10gcmVjb3JkU2l6ZQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvTGlzdDxMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9BZG5SZWNvcmQ7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdCByZWNvcmRzCi0KLXByaXZhdGUgYm9vbGVhbiBzdWNjZXNzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5HU01QaG9uZSkKLQotc3RhdGljIGphdmEubGFuZy5PYmplY3QgYWNjZXNzJDAwMCgKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uU2ltUGhvbmVCb29rSW50ZXJmYWNlTWFuYWdlcikKLQotc3RhdGljIGludFtdIGFjY2VzcyQxMDAoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlNpbVBob25lQm9va0ludGVyZmFjZU1hbmFnZXIpCi0KLXN0YXRpYyBpbnRbXSBhY2Nlc3MkMTAyKAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5TaW1QaG9uZUJvb2tJbnRlcmZhY2VNYW5hZ2VyCi1pbnRbXSkKLQotc3RhdGljIHZvaWQgYWNjZXNzJDIwMCgKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uU2ltUGhvbmVCb29rSW50ZXJmYWNlTWFuYWdlcgotamF2YS5sYW5nLlN0cmluZykKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDMwMigKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uU2ltUGhvbmVCb29rSW50ZXJmYWNlTWFuYWdlcgotYm9vbGVhbikKLQotc3RhdGljIGphdmEudXRpbC5MaXN0IGFjY2VzcyQ0MDAoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlNpbVBob25lQm9va0ludGVyZmFjZU1hbmFnZXIpCi0KLXN0YXRpYyBqYXZhLnV0aWwuTGlzdCBhY2Nlc3MkNDAyKAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5TaW1QaG9uZUJvb2tJbnRlcmZhY2VNYW5hZ2VyCi1qYXZhLnV0aWwuTGlzdCkKLQotcHJpdmF0ZSB2b2lkIGNoZWNrVGhyZWFkKCkKLQotcHJpdmF0ZSB2b2lkIGxvZygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgdm9pZCBwdWJsaXNoKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSSlMamF2YS91dGlsL0xpc3Q8TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vQWRuUmVjb3JkOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRBZG5SZWNvcmRzSW5FZigKLWludCkKLQotcHVibGljIGludFtdIGdldEFkblJlY29yZHNTaXplKAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiB1cGRhdGVBZG5SZWNvcmRzSW5FZkJ5SW5kZXgoCi1pbnQKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWludAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJvb2xlYW4gdXBkYXRlQWRuUmVjb3Jkc0luRWZCeVNlYXJjaCgKLWludAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlNpbVByb3ZpZGVyIGV4dGVuZHMgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gQUREUkVTU19CT09LX0NPTFVNTl9OQU1FUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUROCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGRE4KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNETgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNUUl9OVU1CRVIKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTVFJfUElOMgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNUUl9UQUcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYW5kcm9pZC5jb250ZW50LlVyaU1hdGNoZXIgVVJMX01BVENIRVIKLQotcHJpdmF0ZSBib29sZWFuIG1TaW11bGF0b3IKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgYm9vbGVhbiBhZGRTaW1SZWNvcmRUb0VmKAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIGJvb2xlYW4gZGVsZXRlU2ltUmVjb3JkRnJvbUVmKAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJKUxqYXZhL3V0aWwvQXJyYXlMaXN0PExqYXZhL3V0aWwvQXJyYXlMaXN0Oz47ICkKLXByaXZhdGUgamF2YS51dGlsLkFycmF5TGlzdCBsb2FkRnJvbUVmKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9BZG5SZWNvcmQ7TGphdmEvdXRpbC9BcnJheUxpc3Q8TGphdmEvdXRpbC9BcnJheUxpc3Q7PjspViApCi1wcml2YXRlIHZvaWQgbG9hZFJlY29yZCgKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uQWRuUmVjb3JkCi1qYXZhLnV0aWwuQXJyYXlMaXN0KQotCi1wcml2YXRlIHZvaWQgbG9nKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG5vcm1hbGl6ZVZhbHVlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBib29sZWFuIHVwZGF0ZVNpbVJlY29yZEluRWYoCi1pbnQKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBpbnQgZGVsZXRlKAotYW5kcm9pZC5uZXQuVXJpCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFR5cGUoCi1hbmRyb2lkLm5ldC5VcmkpCi0KLXB1YmxpYyBhbmRyb2lkLm5ldC5VcmkgaW5zZXJ0KAotYW5kcm9pZC5uZXQuVXJpCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlcykKLQotcHVibGljIGJvb2xlYW4gb25DcmVhdGUoKQotCi1wdWJsaWMgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IgcXVlcnkoCi1hbmRyb2lkLm5ldC5VcmkKLWphdmEubGFuZy5TdHJpbmdbXQotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZ1tdCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgaW50IHVwZGF0ZSgKLWFuZHJvaWQubmV0LlVyaQotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXMKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9TaW1TbXNJbnRlcmZhY2VNYW5hZ2VyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi0gY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5TaW1TbXNJbnRlcmZhY2VNYW5hZ2VyJDEgZXh0ZW5kcyBhbmRyb2lkLm9zLkhhbmRsZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5TaW1TbXNJbnRlcmZhY2VNYW5hZ2VyIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uU2ltU21zSW50ZXJmYWNlTWFuYWdlcikKLQotcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZSgKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlNpbVNtc0ludGVyZmFjZU1hbmFnZXIgZXh0ZW5kcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLklTbXMkU3R1YgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0xPQURfRE9ORQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfVVBEQVRFX0RPTkUKLQotc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTE9HX1RBRwotCi0gYW5kcm9pZC5vcy5IYW5kbGVyIG1IYW5kbGVyCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLk9iamVjdCBtTG9jawotCi1wcml2YXRlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uR1NNUGhvbmUgbVBob25lCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9MaXN0PExjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1Ntc1Jhd0RhdGE7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdCBtU21zCi0KLXByaXZhdGUgYm9vbGVhbiBtU3VjY2VzcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uR1NNUGhvbmUpCi0KLXN0YXRpYyBqYXZhLmxhbmcuT2JqZWN0IGFjY2VzcyQwMDAoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlNpbVNtc0ludGVyZmFjZU1hbmFnZXIpCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQxMDIoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlNpbVNtc0ludGVyZmFjZU1hbmFnZXIKLWJvb2xlYW4pCi0KLXN0YXRpYyBqYXZhLnV0aWwuTGlzdCBhY2Nlc3MkMjAwKAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5TaW1TbXNJbnRlcmZhY2VNYW5hZ2VyKQotCi1zdGF0aWMgamF2YS51dGlsLkxpc3QgYWNjZXNzJDIwMigKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uU2ltU21zSW50ZXJmYWNlTWFuYWdlcgotamF2YS51dGlsLkxpc3QpCi0KLXN0YXRpYyBqYXZhLnV0aWwuQXJyYXlMaXN0IGFjY2VzcyQzMDAoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlNpbVNtc0ludGVyZmFjZU1hbmFnZXIKLWphdmEudXRpbC5BcnJheUxpc3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvQXJyYXlMaXN0PFtCPjspTGphdmEvdXRpbC9BcnJheUxpc3Q8TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU21zUmF3RGF0YTs+OyApCi1wcml2YXRlIGphdmEudXRpbC5BcnJheUxpc3QgYnVpbGRWYWxpZFJhd0RhdGEoCi1qYXZhLnV0aWwuQXJyYXlMaXN0KQotCi1wcml2YXRlIHZvaWQgZW5mb3JjZVJlY2VpdmVBbmRTZW5kKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSB2b2lkIGxvZygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgYnl0ZVtdIG1ha2VTbXNSZWNvcmREYXRhKAotaW50Ci1ieXRlW10pCi0KLXB1YmxpYyBib29sZWFuIGNvcHlNZXNzYWdlVG9TaW1FZigKLWludAotYnl0ZVtdCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0xpc3Q8TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU21zUmF3RGF0YTs+OyApCi1wdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0QWxsTWVzc2FnZXNGcm9tU2ltRWYoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZztMamF2YS91dGlsL0xpc3Q8TGphdmEvbGFuZy9TdHJpbmc7PjtMamF2YS91dGlsL0xpc3Q8TGFuZHJvaWQvYXBwL1BlbmRpbmdJbnRlbnQ7PjtMamF2YS91dGlsL0xpc3Q8TGFuZHJvaWQvYXBwL1BlbmRpbmdJbnRlbnQ7PjspViApCi1wdWJsaWMgdm9pZCBzZW5kTXVsdGlwYXJ0VGV4dCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudXRpbC5MaXN0Ci1qYXZhLnV0aWwuTGlzdAotamF2YS51dGlsLkxpc3QpCi0KLXB1YmxpYyB2b2lkIHNlbmRSYXdQZHUoCi1ieXRlW10KLWJ5dGVbXQotYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudAotYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudCkKLQotcHVibGljIGJvb2xlYW4gdXBkYXRlTWVzc2FnZU9uU2ltRWYoCi1pbnQKLWludAotYnl0ZVtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uU2ltVGx2IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gaW50IGN1ckRhdGFMZW5ndGgKLQotIGludCBjdXJEYXRhT2Zmc2V0Ci0KLSBpbnQgY3VyT2Zmc2V0Ci0KLSBib29sZWFuIGhhc1ZhbGlkVGx2T2JqZWN0Ci0KLSBieXRlW10gcmVjb3JkCi0KLSBpbnQgdGx2TGVuZ3RoCi0KLSBpbnQgdGx2T2Zmc2V0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYnl0ZVtdCi1pbnQKLWludCkKLQotcHJpdmF0ZSBib29sZWFuIHBhcnNlQ3VycmVudFRsdk9iamVjdCgpCi0KLXB1YmxpYyBieXRlW10gZ2V0RGF0YSgpCi0KLXB1YmxpYyBpbnQgZ2V0VGFnKCkKLQotcHVibGljIGJvb2xlYW4gaXNWYWxpZE9iamVjdCgpCi0KLXB1YmxpYyBib29sZWFuIG5leHRPYmplY3QoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uU2ltVXRpbHMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIExPR19UQUcKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgYWRuU3RyaW5nRmllbGRUb1N0cmluZygKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgaW50IGJjZEJ5dGVUb0ludCgKLWJ5dGUpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBiY2RUb1N0cmluZygKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLXByaXZhdGUgc3RhdGljIGludCBiaXRUb1JHQigKLWludCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGJ5dGVzVG9IZXhTdHJpbmcoCi1ieXRlW10pCi0KLXByaXZhdGUgc3RhdGljIGludFtdIGdldENMVVQoCi1ieXRlW10KLWludAotaW50KQotCi1zdGF0aWMgaW50IGhleENoYXJUb0ludCgKLWNoYXIpCi0KLXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGhleFN0cmluZ1RvQnl0ZXMoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHN0YXRpYyBpbnRbXSBtYXBUbzJPcmRlckJpdENvbG9yKAotYnl0ZVtdCi1pbnQKLWludAotaW50W10KLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgaW50W10gbWFwVG9Ob24yT3JkZXJCaXRDb2xvcigKLWJ5dGVbXQotaW50Ci1pbnQKLWludFtdCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBuZXR3b3JrTmFtZVRvU3RyaW5nKAotYnl0ZVtdCi1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCBwYXJzZVRvQm5XKAotYnl0ZVtdCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAgcGFyc2VUb1JHQigKLWJ5dGVbXQotaW50Ci1ib29sZWFuKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1FbGVtZW50ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1Ntc0hlYWRlcjsgKQotcHVibGljIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uU21zSGVhZGVyJEVsZW1lbnQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYnl0ZVtdIG1fZGF0YQotCi1wcml2YXRlIGludCBtX2lkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50Ci1ieXRlW10pCi0KLXB1YmxpYyBieXRlW10gZ2V0RGF0YSgpCi0KLXB1YmxpYyBpbnQgZ2V0SUQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU21zSGVhZGVyJEVsZW1lbnQ7ICkKLXB1YmxpYyBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlNtc0hlYWRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVBQTElDQVRJT05fUE9SVF9BRERSRVNTSU5HXzE2X0JJVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUFBMSUNBVElPTl9QT1JUX0FERFJFU1NJTkdfOF9CSVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OQ0FURU5BVEVEXzE2X0JJVF9SRUZFUkVOQ0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OQ0FURU5BVEVEXzhfQklUX1JFRkVSRU5DRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1JUX1dBUF9QVVNICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPUlRfV0FQX1dTUAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUEVDSUFMX1NNU19NRVNTQUdFX0lORElDQVRJT04KLQotcHJpdmF0ZSBieXRlW10gbV9kYXRhCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9BcnJheUxpc3Q8TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU21zSGVhZGVyJEVsZW1lbnQ7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuQXJyYXlMaXN0IG1fZWxlbWVudHMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIGludCBjYWxjU2l6ZSgpCi0KLXB1YmxpYyBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5TbXNIZWFkZXIgcGFyc2UoCi1ieXRlW10pCi0KLXB1YmxpYyB2b2lkIGFkZCgKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uU21zSGVhZGVyJEVsZW1lbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0FycmF5TGlzdDxMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9TbXNIZWFkZXIkRWxlbWVudDs+OyApCi1wdWJsaWMgamF2YS51dGlsLkFycmF5TGlzdCBnZXRFbGVtZW50cygpCi0KLXB1YmxpYyBieXRlW10gdG9CeXRlQXJyYXkoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9TbXNSYXdEYXRhOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1Ntc1Jhd0RhdGE7ICkKLWZpbmFsIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uU21zUmF3RGF0YSQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uU21zUmF3RGF0YSBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uU21zUmF3RGF0YVtdIG5ld0FycmF5KAotaW50KQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdFtdIG5ld0FycmF5KAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uU21zUmF3RGF0YSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I8TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU21zUmF3RGF0YTs+OyApCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yIENSRUFUT1IKLQotIGJ5dGVbXSBkYXRhCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ieXRlW10pCi0KLXB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpCi0KLXB1YmxpYyBieXRlW10gZ2V0Qnl0ZXMoKQotCi1wdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLSBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlNtc1Jlc3BvbnNlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gamF2YS5sYW5nLlN0cmluZyBhY2tQZHUKLQotIGludCBtZXNzYWdlUmVmCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uU3VwcFNlcnZpY2VOb3RpZmljYXRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PX0NPREVfQ0FMTF9ERUZMRUNURUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9fQ09ERV9DQUxMX0ZPUldBUkRFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT19DT0RFX0NBTExfSVNfV0FJVElORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT19DT0RFX0NMSVJfU1VQUFJFU1NJT05fUkVKRUNURUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9fQ09ERV9DVUdfQ0FMTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT19DT0RFX0lOQ09NSU5HX0NBTExTX0JBUlJFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT19DT0RFX09VVEdPSU5HX0NBTExTX0JBUlJFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT19DT0RFX1NPTUVfQ0ZfQUNUSVZFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PX0NPREVfVU5DT05ESVRJT05BTF9DRl9BQ1RJVkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVRfQ09ERV9BRERJVElPTkFMX0NBTExfRk9SV0FSREVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1UX0NPREVfQ0FMTF9DT05ORUNURURfRUNUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1UX0NPREVfQ0FMTF9DT05ORUNUSU5HX0VDVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNVF9DT0RFX0NBTExfT05fSE9MRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNVF9DT0RFX0NBTExfUkVUUklFVkVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1UX0NPREVfQ1VHX0NBTEwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVRfQ09ERV9ERUZMRUNURURfQ0FMTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNVF9DT0RFX0ZPUldBUkRFRF9DQUxMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1UX0NPREVfRk9SV0FSRF9DSEVDS19SRUNFSVZFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNVF9DT0RFX01VTFRJX1BBUlRZX0NBTEwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVRfQ09ERV9PTl9IT0xEX0NBTExfUkVMRUFTRUQKLQotcHVibGljIGludCBjb2RlCi0KLXB1YmxpYyBpbnQgaW5kZXgKLQotcHVibGljIGludCBub3RpZmljYXRpb25UeXBlCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIG51bWJlcgotCi1wdWJsaWMgaW50IHR5cGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi0gY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5Wb2ljZU1haWxDb25zdGFudHMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIExPR19UQUcKLQotc3RhdGljIGZpbmFsIGludCBOQU1FCi0KLXN0YXRpYyBmaW5hbCBpbnQgTlVNQkVSCi0KLXN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBBUlRORVJfVk9JQ0VNQUlMX1BBVEgKLQotc3RhdGljIGZpbmFsIGludCBTSVpFCi0KLXN0YXRpYyBmaW5hbCBpbnQgVEFHCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNoTWFwPExqYXZhL2xhbmcvU3RyaW5nO1tMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wcml2YXRlIGphdmEudXRpbC5IYXNoTWFwIENhcnJpZXJWbU1hcAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgdm9pZCBsb2FkVm9pY2VNYWlsKCkKLQotIGJvb2xlYW4gY29udGFpbnNDYXJyaWVyKAotamF2YS5sYW5nLlN0cmluZykKLQotIGphdmEubGFuZy5TdHJpbmcgZ2V0Q2Fycmllck5hbWUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi0gamF2YS5sYW5nLlN0cmluZyBnZXRWb2ljZU1haWxOdW1iZXIoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi0gamF2YS5sYW5nLlN0cmluZyBnZXRWb2ljZU1haWxUYWcoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL0VudW08TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL0FwcEludGVyZmFjZSRTdGF0ZTs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE2NDA5IG5hbWUgPVN0YXRlICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9BcHBJbnRlcmZhY2U7ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5BcHBJbnRlcmZhY2UkU3RhdGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5BcHBJbnRlcmZhY2UkU3RhdGVbXSAkVkFMVUVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuQXBwSW50ZXJmYWNlJFN0YXRlIENBTExfU0VUVVAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5BcHBJbnRlcmZhY2UkU3RhdGUgRElTUExBWV9URVhUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuQXBwSW50ZXJmYWNlJFN0YXRlIEdFVF9JTktFWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkFwcEludGVyZmFjZSRTdGF0ZSBHRVRfSU5QVVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5BcHBJbnRlcmZhY2UkU3RhdGUgSURMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkFwcEludGVyZmFjZSRTdGF0ZSBMQVVOQ0hfQlJPV1NFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkFwcEludGVyZmFjZSRTdGF0ZSBNQUlOX01FTlUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5BcHBJbnRlcmZhY2UkU3RhdGUgUExBWV9UT05FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuQXBwSW50ZXJmYWNlJFN0YXRlIFNFTEVDVF9JVEVNCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpViApCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkFwcEludGVyZmFjZSRTdGF0ZSB2YWx1ZU9mKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5BcHBJbnRlcmZhY2UkU3RhdGVbXSB2YWx1ZXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL0FwcEludGVyZmFjZSRTdGF0ZTsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5BcHBJbnRlcmZhY2UgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgYWNjZXB0T3JSZWplY3RDYWxsKAotYm9vbGVhbikKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gYmFja3dhcmRNb3ZlKCkKLQotcHVibGljIGFic3RyYWN0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLk1lbnUgZ2V0Q3VycmVudE1lbnUoKQotCi1wdWJsaWMgYWJzdHJhY3QgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuQXBwSW50ZXJmYWNlJFN0YXRlIGdldFN0YXRlKCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgbm90aWZ5QnJvd3NlclRlcm1pbmF0aW9uKAotYm9vbGVhbikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgbm90aWZ5RGlzcGxheVRleHRFbmRlZCgKLWJvb2xlYW4pCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG5vdGlmeUlkbGVTY3JlZW5BdmFpbGFibGUoKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBub3RpZnlJbmtleSgKLWNoYXIKLWJvb2xlYW4pCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG5vdGlmeUlua2V5KAotYm9vbGVhbgotYm9vbGVhbikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgbm90aWZ5SW5wdXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBub3RpZnlMYW5ndWFnZVNlbGVjdGlvbigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG5vdGlmeUxhdW5jaEJyb3dzZXIoCi1ib29sZWFuKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBub3RpZnlNZW51U2VsZWN0aW9uKAotaW50Ci1ib29sZWFuKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBub3RpZnlOb1Jlc3BvbnNlKCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgbm90aWZ5U2VsZWN0ZWRJdGVtKAotaW50Ci1ib29sZWFuKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBub3RpZnlUb25lRW5kZWQoKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBub3RpZnlVc2VyQWN0aXZpdHkoKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRDb21tYW5kTGlzdGVuZXIoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5Db21tYW5kTGlzdGVuZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHRlcm1pbmF0ZVNlc3Npb24oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkJlclRsdiBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkVSX0VWRU5UX0RPV05MT0FEX1RBRwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCRVJfTUVOVV9TRUxFQ1RJT05fVEFHCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJFUl9QUk9BQ1RJVkVfQ09NTUFORF9UQUcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkVSX1VOS05PV05fVEFHCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9MaXN0PExjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9Db21wcmVoZW5zaW9uVGx2Oz47ICkKLXByaXZhdGUgamF2YS51dGlsLkxpc3QgbUNvbXBUbHZzCi0KLXByaXZhdGUgaW50IG1UYWcKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJTGphdmEvdXRpbC9MaXN0PExjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9Db21wcmVoZW5zaW9uVGx2Oz47KVYgKQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWludAotamF2YS51dGlsLkxpc3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1Jlc3VsdEV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5CZXJUbHYgZGVjb2RlKAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9MaXN0PExjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9Db21wcmVoZW5zaW9uVGx2Oz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRDb21wcmVoZW5zaW9uVGx2cygpCi0KLXB1YmxpYyBpbnQgZ2V0VGFnKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuQ29tbWFuZExpc3RlbmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL3V0aWwvTGlzdDxMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvVGV4dEF0dHJpYnV0ZTs+O0xqYXZhL2xhbmcvU3RyaW5nOylWICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uQ2FsbFNldHVwKAotamF2YS5sYW5nLlN0cmluZwotamF2YS51dGlsLkxpc3QKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL3V0aWwvTGlzdDxMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvVGV4dEF0dHJpYnV0ZTs+O1paWilWICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uRGlzcGxheVRleHQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnV0aWwuTGlzdAotYm9vbGVhbgotYm9vbGVhbgotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvdXRpbC9MaXN0PExjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9UZXh0QXR0cmlidXRlOz47WlpaWlopViApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvbkdldElua2V5KAotamF2YS5sYW5nLlN0cmluZwotamF2YS51dGlsLkxpc3QKLWJvb2xlYW4KLWJvb2xlYW4KLWJvb2xlYW4KLWJvb2xlYW4KLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nO0lJWkxqYXZhL3V0aWwvTGlzdDxMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvVGV4dEF0dHJpYnV0ZTs+O1paWlopViApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvbkdldElucHV0KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQKLWJvb2xlYW4KLWphdmEudXRpbC5MaXN0Ci1ib29sZWFuCi1ib29sZWFuCi1ib29sZWFuCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZztMamF2YS91dGlsL0xpc3Q8TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1RleHRBdHRyaWJ1dGU7PjtMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvTGF1bmNoQnJvd3Nlck1vZGU7KVYgKQotcHVibGljIGFic3RyYWN0IHZvaWQgb25MYXVuY2hCcm93c2VyKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS51dGlsLkxpc3QKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkxhdW5jaEJyb3dzZXJNb2RlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9SZXN1bHRFeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1RvbmU7TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvdXRpbC9MaXN0PExjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9UZXh0QXR0cmlidXRlOz47TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL0R1cmF0aW9uOylWICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uUGxheVRvbmUoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5Ub25lCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnV0aWwuTGlzdAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuRHVyYXRpb24pCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uU2VsZWN0SXRlbSgKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLk1lbnUKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlByZXNlbnRhdGlvblR5cGUpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uU2Vzc2lvbkVuZCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1Jlc3VsdEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgb25TZXRVcEV2ZW50TGlzdCgKLWphdmEudXRpbC5CaXRTZXQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uU2V0VXBNZW51KAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuTWVudSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9FbnVtPExjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9Db21tYW5kVHlwZTs+OyApCi1maW5hbCBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5Db21tYW5kVHlwZSBleHRlbmRzIGphdmEubGFuZy5FbnVtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkNvbW1hbmRUeXBlW10gJFZBTFVFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkNvbW1hbmRUeXBlIERJU1BMQVlfVEVYVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkNvbW1hbmRUeXBlIEdFVF9JTktFWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkNvbW1hbmRUeXBlIEdFVF9JTlBVVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkNvbW1hbmRUeXBlIExBVU5DSF9CUk9XU0VSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuQ29tbWFuZFR5cGUgUExBWV9UT05FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuQ29tbWFuZFR5cGUgUkVGUkVTSAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkNvbW1hbmRUeXBlIFNFTEVDVF9JVEVNCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuQ29tbWFuZFR5cGUgU0VORF9EVE1GCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuQ29tbWFuZFR5cGUgU0VORF9TTVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5Db21tYW5kVHlwZSBTRU5EX1NTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuQ29tbWFuZFR5cGUgU0VORF9VU1NECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuQ29tbWFuZFR5cGUgU0VUX1VQX0NBTEwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5Db21tYW5kVHlwZSBTRVRfVVBfRVZFTlRfTElTVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkNvbW1hbmRUeXBlIFNFVF9VUF9JRExFX01PREVfVEVYVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkNvbW1hbmRUeXBlIFNFVF9VUF9NRU5VCi0KLXByaXZhdGUgaW50IG1WYWx1ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSSlWICkKLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5Db21tYW5kVHlwZSBmcm9tSW50KAotaW50KQotCi1wdWJsaWMgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkNvbW1hbmRUeXBlIHZhbHVlT2YoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkNvbW1hbmRUeXBlW10gdmFsdWVzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLSBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5Db21wcmVoZW5zaW9uVGx2IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGJvb2xlYW4gbUNyCi0KLXByaXZhdGUgaW50IG1MZW5ndGgKLQotcHJpdmF0ZSBieXRlW10gbVJhd1ZhbHVlCi0KLXByaXZhdGUgaW50IG1UYWcKLQotcHJpdmF0ZSBpbnQgbVZhbHVlSW5kZXgKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotaW50Ci1ib29sZWFuCi1pbnQKLWJ5dGVbXQotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9SZXN1bHRFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuQ29tcHJlaGVuc2lvblRsdiBkZWNvZGUoCi1ieXRlW10KLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvUmVzdWx0RXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFtCSSlMamF2YS91dGlsL0xpc3Q8TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL0NvbXByZWhlbnNpb25UbHY7PjsgKQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuTGlzdCBkZWNvZGVNYW55KAotYnl0ZVtdCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkKLQotcHVibGljIGJ5dGVbXSBnZXRSYXdWYWx1ZSgpCi0KLXB1YmxpYyBpbnQgZ2V0VGFnKCkKLQotcHVibGljIGludCBnZXRWYWx1ZUluZGV4KCkKLQotcHVibGljIGJvb2xlYW4gaXNDb21wcmVoZW5zaW9uUmVxdWlyZWQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL0VudW08TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL0NvbXByZWhlbnNpb25UbHZUYWc7PjsgKQotZmluYWwgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuQ29tcHJlaGVuc2lvblRsdlRhZyBleHRlbmRzIGphdmEubGFuZy5FbnVtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkNvbXByZWhlbnNpb25UbHZUYWdbXSAkVkFMVUVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuQ29tcHJlaGVuc2lvblRsdlRhZyBBTFBIQV9JRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkNvbXByZWhlbnNpb25UbHZUYWcgQlJPV1NFUl9URVJNSU5BVElPTl9DQVVTRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkNvbXByZWhlbnNpb25UbHZUYWcgQ09NTUFORF9ERVRBSUxTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuQ29tcHJlaGVuc2lvblRsdlRhZyBERUZBVUxUX1RFWFQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5Db21wcmVoZW5zaW9uVGx2VGFnIERFVklDRV9JREVOVElUSUVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuQ29tcHJlaGVuc2lvblRsdlRhZyBEVVJBVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkNvbXByZWhlbnNpb25UbHZUYWcgRVZFTlRfTElTVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkNvbXByZWhlbnNpb25UbHZUYWcgRklMRV9MSVNUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuQ29tcHJlaGVuc2lvblRsdlRhZyBIRUxQX1JFUVVFU1QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5Db21wcmVoZW5zaW9uVGx2VGFnIElDT05fSUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5Db21wcmVoZW5zaW9uVGx2VGFnIElNTUVESUFURV9SRVNQT05TRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkNvbXByZWhlbnNpb25UbHZUYWcgSVRFTQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkNvbXByZWhlbnNpb25UbHZUYWcgSVRFTV9JQ09OX0lEX0xJU1QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5Db21wcmVoZW5zaW9uVGx2VGFnIElURU1fSUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5Db21wcmVoZW5zaW9uVGx2VGFnIExBTkdVQUdFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuQ29tcHJlaGVuc2lvblRsdlRhZyBSRVNQT05TRV9MRU5HVEgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5Db21wcmVoZW5zaW9uVGx2VGFnIFJFU1VMVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkNvbXByZWhlbnNpb25UbHZUYWcgVEVYVF9BVFRSSUJVVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5Db21wcmVoZW5zaW9uVGx2VGFnIFRFWFRfU1RSSU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuQ29tcHJlaGVuc2lvblRsdlRhZyBUT05FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuQ29tcHJlaGVuc2lvblRsdlRhZyBVUkwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5Db21wcmVoZW5zaW9uVGx2VGFnIFVTU0RfU1RSSU5HCi0KLXByaXZhdGUgaW50IG1WYWx1ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSSlWICkKLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5Db21wcmVoZW5zaW9uVGx2VGFnIHZhbHVlT2YoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkNvbXByZWhlbnNpb25UbHZUYWdbXSB2YWx1ZXMoKQotCi1wdWJsaWMgaW50IHZhbHVlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5DdGx2Q29tbWFuZERldGFpbHMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBpbnQgY29tbWFuZE51bWJlcgotCi1wdWJsaWMgaW50IGNvbW1hbmRRdWFsaWZpZXIKLQotcHVibGljIGJvb2xlYW4gY29tcFJlcXVpcmVkCi0KLXB1YmxpYyBpbnQgdHlwZU9mQ29tbWFuZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL0R1cmF0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE2NDA5IG5hbWUgPVRpbWVVbml0ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL0VudW08TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL0R1cmF0aW9uJFRpbWVVbml0Oz47ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5EdXJhdGlvbiRUaW1lVW5pdCBleHRlbmRzIGphdmEubGFuZy5FbnVtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkR1cmF0aW9uJFRpbWVVbml0W10gJFZBTFVFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkR1cmF0aW9uJFRpbWVVbml0IE1JTlVURQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkR1cmF0aW9uJFRpbWVVbml0IFNFQ09ORAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkR1cmF0aW9uJFRpbWVVbml0IFRFTlRIX1NFQ09ORAotCi1wcml2YXRlIGludCBtVmFsdWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KEkpViApCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuRHVyYXRpb24kVGltZVVuaXQgdmFsdWVPZigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuRHVyYXRpb24kVGltZVVuaXRbXSB2YWx1ZXMoKQotCi1wdWJsaWMgaW50IHZhbHVlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9EdXJhdGlvbiRUaW1lVW5pdDsgKQotcHVibGljIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkR1cmF0aW9uIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgaW50IHRpbWVJbnRlcnZhbAotCi1wdWJsaWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuRHVyYXRpb24kVGltZVVuaXQgdGltZVVuaXQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkR1cmF0aW9uJFRpbWVVbml0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL0VudW08TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL0ZvbnRTaXplOz47ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5Gb250U2l6ZSBleHRlbmRzIGphdmEubGFuZy5FbnVtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkZvbnRTaXplW10gJFZBTFVFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkZvbnRTaXplIExBUkdFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuRm9udFNpemUgTk9STUFMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuRm9udFNpemUgU01BTEwKLQotcHJpdmF0ZSBpbnQgbVZhbHVlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJKVYgKQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkZvbnRTaXplIGZyb21JbnQoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuRm9udFNpemUgdmFsdWVPZigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuRm9udFNpemVbXSB2YWx1ZXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkltYWdlRGVzY3JpcHRvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIGludCBDT0RJTkdfU0NIRU1FX0JBU0lDCi0KLXN0YXRpYyBmaW5hbCBpbnQgQ09ESU5HX1NDSEVNRV9DT0xPVVIKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLQotIGludCBjb2RpbmdTY2hlbWUKLQotIGludCBoZWlnaHQKLQotIGludCBpbWFnZUlkCi0KLSBpbnQgbGVuZ3RoCi0KLSBpbnQgb2Zmc2V0Ci0KLSBpbnQgd2lkdGgKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1zdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuSW1hZ2VEZXNjcmlwdG9yIHBhcnNlKAotYnl0ZVtdCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL0l0ZW07ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I8TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL0l0ZW07PjsgKQotZmluYWwgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuSXRlbSQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkl0ZW0gY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5JdGVtW10gbmV3QXJyYXkoCi1pbnQpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0W10gbmV3QXJyYXkoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuSXRlbSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I8TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL0l0ZW07PjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvciBDUkVBVE9SCi0KLXB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCBpY29uCi0KLXB1YmxpYyBpbnQgaWQKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdGV4dAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1wdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9FbnVtPExjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9MYXVuY2hCcm93c2VyTW9kZTs+OyApCi1wdWJsaWMgZmluYWwgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuTGF1bmNoQnJvd3Nlck1vZGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5MYXVuY2hCcm93c2VyTW9kZVtdICRWQUxVRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5MYXVuY2hCcm93c2VyTW9kZSBMQVVOQ0hfSUZfTk9UX0FMUkVBRFlfTEFVTkNIRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5MYXVuY2hCcm93c2VyTW9kZSBMQVVOQ0hfTkVXX0JST1dTRVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5MYXVuY2hCcm93c2VyTW9kZSBVU0VfRVhJU1RJTkdfQlJPV1NFUgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVYgKQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5MYXVuY2hCcm93c2VyTW9kZSB2YWx1ZU9mKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5MYXVuY2hCcm93c2VyTW9kZVtdIHZhbHVlcygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL01lbnU7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I8TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL01lbnU7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotZmluYWwgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuTWVudSQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLk1lbnUgY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5NZW51W10gbmV3QXJyYXkoCi1pbnQpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0W10gbmV3QXJyYXkoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuTWVudSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I8TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL01lbnU7PjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvciBDUkVBVE9SCi0KLXB1YmxpYyBpbnQgZGVmYXVsdEl0ZW0KLQotcHVibGljIGJvb2xlYW4gaGVscEF2YWlsYWJsZQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvTGlzdDxMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvSXRlbTs+OyApCi1wdWJsaWMgamF2YS51dGlsLkxpc3QgaXRlbXMKLQotcHVibGljIGJvb2xlYW4gaXRlbXNJY29uU2VsZkV4cGxhbmF0b3J5Ci0KLXB1YmxpYyBib29sZWFuIHNvZnRLZXlQcmVmZXJyZWQKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdGl0bGUKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0xpc3Q8TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1RleHRBdHRyaWJ1dGU7PjsgKQotcHVibGljIGphdmEudXRpbC5MaXN0IHRpdGxlQXR0cnMKLQotcHVibGljIGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwIHRpdGxlSWNvbgotCi1wdWJsaWMgYm9vbGVhbiB0aXRsZUljb25TZWxmRXhwbGFuYXRvcnkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5QYXJjZWwKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLk1lbnUkMSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9MaXN0PExjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9JdGVtOz47TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvdXRpbC9MaXN0PExjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9UZXh0QXR0cmlidXRlOz47WlpJKVYgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkxpc3QKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudXRpbC5MaXN0Ci1ib29sZWFuCi1ib29sZWFuCi1pbnQpCi0KLXB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpCi0KLXB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL0VudW08TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1ByZXNlbnRhdGlvblR5cGU7PjsgKQotcHVibGljIGZpbmFsIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlByZXNlbnRhdGlvblR5cGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5QcmVzZW50YXRpb25UeXBlW10gJFZBTFVFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlByZXNlbnRhdGlvblR5cGUgREFUQV9WQUxVRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5QcmVzZW50YXRpb25UeXBlIE5BVklHQVRJT05fT1BUSU9OUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlByZXNlbnRhdGlvblR5cGUgTk9UX1NQRUNJRklFRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVYgKQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5QcmVzZW50YXRpb25UeXBlIHZhbHVlT2YoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlByZXNlbnRhdGlvblR5cGVbXSB2YWx1ZXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL0VudW08TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1Jlc3VsdENvZGU7PjsgKQotcHVibGljIGZpbmFsIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlJlc3VsdENvZGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5SZXN1bHRDb2RlW10gJFZBTFVFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlJlc3VsdENvZGUgQUNDRVNTX1RFQ0hfVU5BQkxFX1RPX1BST0NFU1MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5SZXN1bHRDb2RlIEJBQ0tXQVJEX01PVkVfQllfVVNFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlJlc3VsdENvZGUgQkVZT05EX1RFUk1JTkFMX0NBUEFCSUxJVFkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5SZXN1bHRDb2RlIEJJUF9FUlJPUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlJlc3VsdENvZGUgQ01EX0RBVEFfTk9UX1VOREVSU1RPT0QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5SZXN1bHRDb2RlIENNRF9OVU1fTk9UX0tOT1dOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuUmVzdWx0Q29kZSBDTURfVFlQRV9OT1RfVU5ERVJTVE9PRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlJlc3VsdENvZGUgQ09OVFJBRElDVElPTl9XSVRIX1RJTUVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuUmVzdWx0Q29kZSBGUkFNRVNfRVJST1IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5SZXN1bHRDb2RlIEhFTFBfSU5GT19SRVFVSVJFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlJlc3VsdENvZGUgTEFVTkNIX0JST1dTRVJfRVJST1IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5SZXN1bHRDb2RlIE1NU19FUlJPUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlJlc3VsdENvZGUgTU1TX1RFTVBPUkFSWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlJlc3VsdENvZGUgTVVMVElfQ0FSRFNfQ01EX0VSUk9SCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuUmVzdWx0Q29kZSBOQUFfQ0FMTF9DT05UUk9MX1RFTVBPUkFSWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlJlc3VsdENvZGUgTkVUV09SS19DUk5UTFlfVU5BQkxFX1RPX1BST0NFU1MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5SZXN1bHRDb2RlIE5PX1JFU1BPTlNFX0ZST01fVVNFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlJlc3VsdENvZGUgT0sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5SZXN1bHRDb2RlIFBSRlJNRF9JQ09OX05PVF9ESVNQTEFZRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5SZXN1bHRDb2RlIFBSRlJNRF9MSU1JVEVEX1NFUlZJQ0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5SZXN1bHRDb2RlIFBSRlJNRF9NT0RJRklFRF9CWV9OQUEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5SZXN1bHRDb2RlIFBSRlJNRF9OQUFfTk9UX0FDVElWRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlJlc3VsdENvZGUgUFJGUk1EX1RPTkVfTk9UX1BMQVlFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlJlc3VsdENvZGUgUFJGUk1EX1dJVEhfQURESVRJT05BTF9FRlNfUkVBRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlJlc3VsdENvZGUgUFJGUk1EX1dJVEhfTUlTU0lOR19JTkZPCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuUmVzdWx0Q29kZSBQUkZSTURfV0lUSF9NT0RJRklDQVRJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5SZXN1bHRDb2RlIFBSRlJNRF9XSVRIX1BBUlRJQUxfQ09NUFJFSEVOU0lPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlJlc3VsdENvZGUgUkVRVUlSRURfVkFMVUVTX01JU1NJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5SZXN1bHRDb2RlIFNNU19SUF9FUlJPUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlJlc3VsdENvZGUgU1NfUkVUVVJOX0VSUk9SCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuUmVzdWx0Q29kZSBURVJNSU5BTF9DUk5UTFlfVU5BQkxFX1RPX1BST0NFU1MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5SZXN1bHRDb2RlIFVJQ0NfU0VTU0lPTl9URVJNX0JZX1VTRVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5SZXN1bHRDb2RlIFVTRVJfQ0xFQVJfRE9XTl9DQUxMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuUmVzdWx0Q29kZSBVU0VSX05PVF9BQ0NFUFQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5SZXN1bHRDb2RlIFVTSU1fQ0FMTF9DT05UUk9MX1BFUk1BTkVOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlJlc3VsdENvZGUgVVNTRF9SRVRVUk5fRVJST1IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5SZXN1bHRDb2RlIFVTU0RfU1NfU0VTU0lPTl9URVJNX0JZX1VTRVIKLQotcHJpdmF0ZSBpbnQgbUNvZGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KEkpViApCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuUmVzdWx0Q29kZSB2YWx1ZU9mKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5SZXN1bHRDb2RlW10gdmFsdWVzKCkKLQotcHVibGljIGludCBjb2RlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvUmVzdWx0RXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTQxMDQgbmFtZSA9bnVsbCApCi0gY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuUmVzdWx0RXhjZXB0aW9uJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBmaW5hbCBpbnRbXSAkU3dpdGNoTWFwJGNvbSRhbmRyb2lkJGludGVybmFsJHRlbGVwaG9ueSRnc20kc3RrJFJlc3VsdENvZGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi0gY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuU3RrRXhjZXB0aW9uIGV4dGVuZHMgYW5kcm9pZC51dGlsLkFuZHJvaWRFeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1Jlc3VsdEV4Y2VwdGlvbiQxOyApCi1wdWJsaWMgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuUmVzdWx0RXhjZXB0aW9uIGV4dGVuZHMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuU3RrRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgaW50IG1BZGRpdGlvbmFsSW5mbwotCi1wcml2YXRlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlJlc3VsdENvZGUgbVJlc3VsdAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlJlc3VsdENvZGUpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlJlc3VsdENvZGUKLWludCkKLQotcHVibGljIGludCBhZGRpdGlvbmFsSW5mbygpCi0KLXB1YmxpYyBib29sZWFuIGhhc0FkZGl0aW9uYWxJbmZvKCkKLQotcHVibGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlJlc3VsdENvZGUgcmVzdWx0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTQxMDQgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvU2VydmljZTsgKQotIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlNlcnZpY2UkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIGludFtdICRTd2l0Y2hNYXAkY29tJGFuZHJvaWQkaW50ZXJuYWwkdGVsZXBob255JGdzbSRzdGskQXBwSW50ZXJmYWNlJFN0YXRlCi0KLXN0YXRpYyBmaW5hbCBpbnRbXSAkU3dpdGNoTWFwJGNvbSRhbmRyb2lkJGludGVybmFsJHRlbGVwaG9ueSRnc20kc3RrJENvbW1hbmRUeXBlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1DdGx2RGV2aWNlSWRlbnRpdGllcyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvU2VydmljZTsgKQotIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlNlcnZpY2UkQ3RsdkRldmljZUlkZW50aXRpZXMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBpbnQgZGVzdGluYXRpb25JZAotCi1wdWJsaWMgaW50IHNvdXJjZUlkCi0KLWZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlNlcnZpY2UgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuU2VydmljZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTIgbmFtZSA9UmVxdWVzdERhdGEgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1NlcnZpY2U7ICkKLSBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5TZXJ2aWNlJFJlcXVlc3REYXRhIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuQ3RsdkNvbW1hbmREZXRhaWxzIGNtZERldAotCi1maW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5TZXJ2aWNlIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlNlcnZpY2UKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkN0bHZDb21tYW5kRGV0YWlscykKLQotIGJvb2xlYW4gbG9hZE5leHRJY29uKCkKLQotIHZvaWQgc2V0SWNvbigKLWJ5dGVbXSkKLQotIHZvaWQgc2V0SWNvbkltZygKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkltYWdlRGVzY3JpcHRvcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTIgbmFtZSA9R2V0SW5rZXlEYXRhICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9TZXJ2aWNlOyApCi0gY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuU2VydmljZSRHZXRJbmtleURhdGEgZXh0ZW5kcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5TZXJ2aWNlJFJlcXVlc3REYXRhCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBib29sZWFuIGlzVWNzMgotCi1wdWJsaWMgYm9vbGVhbiBpc1llc05vCi0KLWZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlNlcnZpY2UgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuU2VydmljZQotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuQ3RsdkNvbW1hbmREZXRhaWxzCi1ib29sZWFuCi1ib29sZWFuKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9TZXJ2aWNlOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwMjQgbmFtZSA9UmVzcG9uc2VEYXRhICkKLWFic3RyYWN0IGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlNlcnZpY2UkUmVzcG9uc2VEYXRhIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5TZXJ2aWNlIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlNlcnZpY2UpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGZvcm1hdCgKLWphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1HZXRJbmtleUlucHV0UmVzcG9uc2VEYXRhICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9TZXJ2aWNlOyApCi0gY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuU2VydmljZSRHZXRJbmtleUlucHV0UmVzcG9uc2VEYXRhIGV4dGVuZHMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuU2VydmljZSRSZXNwb25zZURhdGEKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgbUluRGF0YQotCi1wcml2YXRlIGJvb2xlYW4gbUlzUGFja2VkCi0KLXByaXZhdGUgYm9vbGVhbiBtSXNVY3MyCi0KLXByaXZhdGUgYm9vbGVhbiBtSXNZZXNObwotCi1wcml2YXRlIGJvb2xlYW4gbVllc05vUmVzcG9uc2UKLQotZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuU2VydmljZSB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5TZXJ2aWNlCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5TZXJ2aWNlCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBmb3JtYXQoCi1qYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTIgbmFtZSA9R2V0SW5wdXREYXRhICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9TZXJ2aWNlOyApCi0gY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuU2VydmljZSRHZXRJbnB1dERhdGEgZXh0ZW5kcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5TZXJ2aWNlJFJlcXVlc3REYXRhCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBib29sZWFuIGlzUGFja2VkCi0KLXB1YmxpYyBib29sZWFuIGlzVWNzMgotCi1maW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5TZXJ2aWNlIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlNlcnZpY2UKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkN0bHZDb21tYW5kRGV0YWlscwotYm9vbGVhbgotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvU2VydmljZTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPUljb25JZCApCi0gY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuU2VydmljZSRJY29uSWQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBpbnQgcmVjb3JkTnVtYmVyCi0KLSBib29sZWFuIHNlbGZFeHBsYW5hdG9yeQotCi1maW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5TZXJ2aWNlIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlNlcnZpY2UpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1NlcnZpY2U7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1JdGVtc0ljb25JZCApCi0gY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuU2VydmljZSRJdGVtc0ljb25JZCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGludFtdIHJlY29yZE51bWJlcnMKLQotIGJvb2xlYW4gc2VsZkV4cGxhbmF0b3J5Ci0KLWZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlNlcnZpY2UgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuU2VydmljZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTIgbmFtZSA9U2VsZWN0SXRlbURhdGEgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1NlcnZpY2U7ICkKLSBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5TZXJ2aWNlJFNlbGVjdEl0ZW1EYXRhIGV4dGVuZHMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuU2VydmljZSRSZXF1ZXN0RGF0YQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTE9BRF9JQ09OX0RPTkUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExPQURfSUNPTl9JVEVNCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMT0FEX0lDT05fT0ZGCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMT0FEX0lDT05fVElUTEUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PX0lDT05fVE9fTE9BRAotCi1wcml2YXRlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkltYWdlRGVzY3JpcHRvciBjdXJyZW50SW1nRGVzCi0KLXByaXZhdGUgaW50IGN1cnJlbnRJdGVtc0ljb25Mb2FkZWQKLQotcHJpdmF0ZSBpbnQgaWNvbkxvYWRTdGF0ZQotCi0gY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuU2VydmljZSRJdGVtc0ljb25JZCBtSXRlbXNJY29uSWQKLQotIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLk1lbnUgbU1lbnUKLQotIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlByZXNlbnRhdGlvblR5cGUgbVByZXNlbnRhdGlvblR5cGUKLQotIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlNlcnZpY2UkSWNvbklkIG1UaXRsZUljb25JZAotCi1maW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5TZXJ2aWNlIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlNlcnZpY2UKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkN0bHZDb21tYW5kRGV0YWlscwotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuTWVudQotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuUHJlc2VudGF0aW9uVHlwZQotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuU2VydmljZSRJY29uSWQKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlNlcnZpY2UkSXRlbXNJY29uSWQpCi0KLXByaXZhdGUgaW50IGdldE5leHRSZWNvcmROdW1iZXIoKQotCi0gYm9vbGVhbiBsb2FkTmV4dEljb24oKQotCi0gdm9pZCBzZXRJY29uKAotYnl0ZVtdKQotCi0gdm9pZCBzZXRJY29uSW1nKAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuSW1hZ2VEZXNjcmlwdG9yKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1TZWxlY3RJdGVtUmVzcG9uc2VEYXRhICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9TZXJ2aWNlOyApCi0gY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuU2VydmljZSRTZWxlY3RJdGVtUmVzcG9uc2VEYXRhIGV4dGVuZHMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuU2VydmljZSRSZXNwb25zZURhdGEKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBpbnQgaWQKLQotZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuU2VydmljZSB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5TZXJ2aWNlCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGZvcm1hdCgKLWphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1NlcnZpY2UkMTtMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvU2VydmljZSRTZWxlY3RJdGVtUmVzcG9uc2VEYXRhO0xjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9TZXJ2aWNlJEdldElua2V5SW5wdXRSZXNwb25zZURhdGE7TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1NlcnZpY2UkUmVzcG9uc2VEYXRhO0xjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9TZXJ2aWNlJEN0bHZEZXZpY2VJZGVudGl0aWVzO0xjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9TZXJ2aWNlJFNlbGVjdEl0ZW1EYXRhO0xjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9TZXJ2aWNlJEdldElucHV0RGF0YTtMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvU2VydmljZSRHZXRJbmtleURhdGE7TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1NlcnZpY2UkUmVxdWVzdERhdGE7TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1NlcnZpY2UkSXRlbXNJY29uSWQ7TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1NlcnZpY2UkSWNvbklkOyApCi1wdWJsaWMgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuU2VydmljZSBleHRlbmRzIGFuZHJvaWQub3MuSGFuZGxlciBpbXBsZW1lbnRzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkFwcEludGVyZmFjZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgYm9vbGVhbiAkYXNzZXJ0aW9uc0Rpc2FibGVkCi0KLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgQVBQX0ZVTExfTkFNRQotCi1zdGF0aWMgZmluYWwgaW50IEFQUF9JTkRJQ0FUT1JfSU5TVEFMTEVEX05PUk1BTAotCi1zdGF0aWMgZmluYWwgaW50IEFQUF9JTkRJQ0FUT1JfSU5TVEFMTEVEX1NQRUNJQUwKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFQUF9JTkRJQ0FUT1JfTEFVTkNIRUQKLQotc3RhdGljIGZpbmFsIGludCBBUFBfSU5ESUNBVE9SX1BSRV9CT09UCi0KLXN0YXRpYyBmaW5hbCBpbnQgQVBQX0lORElDQVRPUl9VTklOU1RBTExFRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVBQX0lOU1RBTExfSU5ESUNBVE9SCi0KLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgQVBQX1BBQ0tBR0VfTkFNRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVWX0lEX0RJU1BMQVkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFVl9JRF9FQVJQSUVDRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVWX0lEX0tFWVBBRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVWX0lEX05FVFdPUksKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFVl9JRF9URVJNSU5BTAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVWX0lEX1VJQ0MKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0NBTExfU0VUVVAKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0VWRU5UX05PVElGWQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfUFJPQUNUSVZFX0NPTU1BTkQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1JFQURfRUZfSU1HX1JFQ09FRF9ET05FCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9SRUFEX0lDT05fRE9ORQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfU0VTU0lPTl9FTkQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1NJTV9BQlNFTlQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1NJTV9MT0FERUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBHRVRfSU5LRVlfTk8KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBHRVRfSU5LRVlfWUVTCi0KLXN0YXRpYyBmaW5hbCBpbnQgU1RLX05PVElGSUNBVElPTl9JRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRBRwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBVSUNDX0VWRU5UX0FDQ0VTU19URUNIX0NIQU5HRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBVSUNDX0VWRU5UX0JST1dTRVJfVEVSTUlOQVRJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVUlDQ19FVkVOVF9CUk9XU0lOR19TVEFUVVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVUlDQ19FVkVOVF9DQUxMX0NPTk5FQ1RFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBVSUNDX0VWRU5UX0NBTExfRElTQ09OTkVDVEVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVJQ0NfRVZFTlRfQ0FSRF9SRUFERVJfU1RBVFVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVJQ0NfRVZFTlRfQ0hBTk5FTF9TVEFUVVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVUlDQ19FVkVOVF9EQVRBX0FWQUlMQUJMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBVSUNDX0VWRU5UX0RJU1BMQVlfUEFSQU1TX0NIQU5HRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBVSUNDX0VWRU5UX0ZSQU1FU19JTkZPX0NIQU5HRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBVSUNDX0VWRU5UX0lETEVfU0NSRUVOX0FWQUlMQUJMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBVSUNDX0VWRU5UX0lfV0xBTl9BQ0VTU19TVEFUVVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVUlDQ19FVkVOVF9MQU5HVUFHRV9TRUxFQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVUlDQ19FVkVOVF9MT0NBTF9DT05ORUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVJQ0NfRVZFTlRfTE9DQVRJT05fU1RBVFVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVJQ0NfRVZFTlRfTVRfQ0FMTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBVSUNDX0VWRU5UX05FVFdPUktfU0VBUkNIX01PREVfQ0hBTkdFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVJQ0NfRVZFTlRfVVNFUl9BQ1RJVklUWQotCi1wcml2YXRlIHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5TZXJ2aWNlIHNJbnN0YW5jZQotCi1wcml2YXRlIGludCBtQXBwSW5kaWNhdG9yCi0KLXByaXZhdGUgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5Db21tYW5kc0ludGVyZmFjZSBtQ21kSWYKLQotcHJpdmF0ZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5Db21tYW5kTGlzdGVuZXIgbUNtZExpc3RlbmVyCi0KLXByaXZhdGUgamF2YS5sYW5nLk9iamVjdCBtQ21kTGlzdGVuZXJMb2NrCi0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgbUNvbnRleHQKLQotcHJpdmF0ZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5TZXJ2aWNlJFJlcXVlc3REYXRhIG1DdXJyZW50UmVxdWVzdAotCi1wcml2YXRlIGludCBtSW5zdGFsbEluZGljYXRvcgotCi1wcml2YXRlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLk1lbnUgbU1haW5NZW51Ci0KLXByaXZhdGUgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuU2VydmljZSRSZXF1ZXN0RGF0YSBtTmV4dFJlcXVlc3QKLQotcHJpdmF0ZSBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb25NYW5hZ2VyIG1ObQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbVNlcnZpY2VOYW1lCi0KLXByaXZhdGUgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5Hc21TaW1DYXJkIG1TaW1DYXJkCi0KLXByaXZhdGUgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5TSU1GaWxlSGFuZGxlciBtU2ltRkgKLQotcHJpdmF0ZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlNJTVJlY29yZHMgbVNpbVJlY29yZHMKLQotcHJpdmF0ZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5BcHBJbnRlcmZhY2UkU3RhdGUgbVN0YXRlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5Db21tYW5kc0ludGVyZmFjZQotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5TSU1SZWNvcmRzCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5TSU1GaWxlSGFuZGxlcgotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5Hc21TaW1DYXJkKQotCi1zdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5TSU1GaWxlSGFuZGxlciBhY2Nlc3MkMDAwKAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuU2VydmljZSkKLQotcHJpdmF0ZSB2b2lkIGV2ZW50RG93bmxvYWQoCi1pbnQKLWludAotaW50Ci1ieXRlW10KLWJvb2xlYW4pCi0KLXByaXZhdGUgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuQ3RsdkNvbW1hbmREZXRhaWxzIGdldEN1cnJlbnRDbWREZXQoKQotCi1wdWJsaWMgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlNlcnZpY2UgZ2V0SW5zdGFuY2UoKQotCi1wdWJsaWMgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlNlcnZpY2UgZ2V0SW5zdGFuY2UoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkNvbW1hbmRzSW50ZXJmYWNlCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlNJTVJlY29yZHMKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlNJTUZpbGVIYW5kbGVyCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkdzbVNpbUNhcmQpCi0KLXByaXZhdGUgdm9pZCBoYW5kbGVFdmVudE5vdGlmeSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgdm9pZCBoYW5kbGVJY29uRGF0YSgKLWJ5dGVbXSkKLQotcHJpdmF0ZSB2b2lkIGhhbmRsZUltYWdlRGVzY3JpcHRvcigKLWJ5dGVbXSkKLQotcHJpdmF0ZSB2b2lkIGhhbmRsZVByb2FjdGl2ZUNvbW1hbmQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHZvaWQgaGFuZGxlU2Vzc2lvbkVuZCgKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1Jlc3VsdEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSBpbnRbXSBwYXJzZUZpbGVMaXN0KAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuQ29tcHJlaGVuc2lvblRsdikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL0N0bHZDb21tYW5kRGV0YWlscztMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvU2VydmljZSRDdGx2RGV2aWNlSWRlbnRpdGllcztMamF2YS91dGlsL0xpc3Q8TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL0NvbXByZWhlbnNpb25UbHY7PjspWiApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1Jlc3VsdEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NEaXNwbGF5VGV4dCgKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkN0bHZDb21tYW5kRGV0YWlscwotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuU2VydmljZSRDdGx2RGV2aWNlSWRlbnRpdGllcwotamF2YS51dGlsLkxpc3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9DdGx2Q29tbWFuZERldGFpbHM7TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1NlcnZpY2UkQ3RsdkRldmljZUlkZW50aXRpZXM7TGphdmEvdXRpbC9MaXN0PExjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9Db21wcmVoZW5zaW9uVGx2Oz47KVYgKQotcHJpdmF0ZSB2b2lkIHByb2Nlc3NFdmVudE5vdGlmeSgKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkN0bHZDb21tYW5kRGV0YWlscwotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuU2VydmljZSRDdGx2RGV2aWNlSWRlbnRpdGllcwotamF2YS51dGlsLkxpc3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9DdGx2Q29tbWFuZERldGFpbHM7TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1NlcnZpY2UkQ3RsdkRldmljZUlkZW50aXRpZXM7TGphdmEvdXRpbC9MaXN0PExjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9Db21wcmVoZW5zaW9uVGx2Oz47KVogKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9SZXN1bHRFeGNlcHRpb247ICkKLXByaXZhdGUgYm9vbGVhbiBwcm9jZXNzR2V0SW5rZXkoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5DdGx2Q29tbWFuZERldGFpbHMKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlNlcnZpY2UkQ3RsdkRldmljZUlkZW50aXRpZXMKLWphdmEudXRpbC5MaXN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9SZXN1bHRFeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL0N0bHZDb21tYW5kRGV0YWlscztMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvU2VydmljZSRDdGx2RGV2aWNlSWRlbnRpdGllcztMamF2YS91dGlsL0xpc3Q8TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL0NvbXByZWhlbnNpb25UbHY7PjspWiApCi1wcml2YXRlIGJvb2xlYW4gcHJvY2Vzc0dldElucHV0KAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuQ3RsdkNvbW1hbmREZXRhaWxzCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5TZXJ2aWNlJEN0bHZEZXZpY2VJZGVudGl0aWVzCi1qYXZhLnV0aWwuTGlzdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvUmVzdWx0RXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9DdGx2Q29tbWFuZERldGFpbHM7TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1NlcnZpY2UkQ3RsdkRldmljZUlkZW50aXRpZXM7TGphdmEvdXRpbC9MaXN0PExjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9Db21wcmVoZW5zaW9uVGx2Oz47KVogKQotcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NMYXVuY2hCcm93c2VyKAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuQ3RsdkNvbW1hbmREZXRhaWxzCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5TZXJ2aWNlJEN0bHZEZXZpY2VJZGVudGl0aWVzCi1qYXZhLnV0aWwuTGlzdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL0N0bHZDb21tYW5kRGV0YWlscztMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvU2VydmljZSRDdGx2RGV2aWNlSWRlbnRpdGllcztMamF2YS91dGlsL0xpc3Q8TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL0NvbXByZWhlbnNpb25UbHY7PjspWiApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1Jlc3VsdEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NQbGF5VG9uZSgKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkN0bHZDb21tYW5kRGV0YWlscwotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuU2VydmljZSRDdGx2RGV2aWNlSWRlbnRpdGllcwotamF2YS51dGlsLkxpc3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1Jlc3VsdEV4Y2VwdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvQ3RsdkNvbW1hbmREZXRhaWxzO0xjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9TZXJ2aWNlJEN0bHZEZXZpY2VJZGVudGl0aWVzO0xqYXZhL3V0aWwvTGlzdDxMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvQ29tcHJlaGVuc2lvblRsdjs+OylaICkKLXByaXZhdGUgYm9vbGVhbiBwcm9jZXNzUmVmcmVzaCgKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkN0bHZDb21tYW5kRGV0YWlscwotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuU2VydmljZSRDdGx2RGV2aWNlSWRlbnRpdGllcwotamF2YS51dGlsLkxpc3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1Jlc3VsdEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NTZWxlY3RJdGVtKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvUmVzdWx0RXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9DdGx2Q29tbWFuZERldGFpbHM7TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1NlcnZpY2UkQ3RsdkRldmljZUlkZW50aXRpZXM7TGphdmEvdXRpbC9MaXN0PExjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9Db21wcmVoZW5zaW9uVGx2Oz47KVogKQotcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NTZWxlY3RJdGVtKAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuQ3RsdkNvbW1hbmREZXRhaWxzCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5TZXJ2aWNlJEN0bHZEZXZpY2VJZGVudGl0aWVzCi1qYXZhLnV0aWwuTGlzdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL0N0bHZDb21tYW5kRGV0YWlscztMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvU2VydmljZSRDdGx2RGV2aWNlSWRlbnRpdGllcztMamF2YS91dGlsL0xpc3Q8TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL0NvbXByZWhlbnNpb25UbHY7PjspViApCi1wcml2YXRlIHZvaWQgcHJvY2Vzc1NldFVwRXZlbnRMaXN0KAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuQ3RsdkNvbW1hbmREZXRhaWxzCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5TZXJ2aWNlJEN0bHZEZXZpY2VJZGVudGl0aWVzCi1qYXZhLnV0aWwuTGlzdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvUmVzdWx0RXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9DdGx2Q29tbWFuZERldGFpbHM7TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1NlcnZpY2UkQ3RsdkRldmljZUlkZW50aXRpZXM7TGphdmEvdXRpbC9MaXN0PExjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9Db21wcmVoZW5zaW9uVGx2Oz47KVogKQotcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NTZXRVcElkbGVNb2RlVGV4dCgKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkN0bHZDb21tYW5kRGV0YWlscwotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuU2VydmljZSRDdGx2RGV2aWNlSWRlbnRpdGllcwotamF2YS51dGlsLkxpc3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1Jlc3VsdEV4Y2VwdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvQ3RsdkNvbW1hbmREZXRhaWxzO0xjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9TZXJ2aWNlJEN0bHZEZXZpY2VJZGVudGl0aWVzO0xqYXZhL3V0aWwvTGlzdDxMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvQ29tcHJlaGVuc2lvblRsdjs+OylaICkKLXByaXZhdGUgYm9vbGVhbiBwcm9jZXNzU2V0VXBNZW51KAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuQ3RsdkNvbW1hbmREZXRhaWxzCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5TZXJ2aWNlJEN0bHZEZXZpY2VJZGVudGl0aWVzCi1qYXZhLnV0aWwuTGlzdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL0N0bHZDb21tYW5kRGV0YWlscztMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvU2VydmljZSRDdGx2RGV2aWNlSWRlbnRpdGllcztMamF2YS91dGlsL0xpc3Q8TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL0NvbXByZWhlbnNpb25UbHY7PjspViApCi1wcml2YXRlIHZvaWQgcHJvY2Vzc1NldHVwQ2FsbCgKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkN0bHZDb21tYW5kRGV0YWlscwotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuU2VydmljZSRDdGx2RGV2aWNlSWRlbnRpdGllcwotamF2YS51dGlsLkxpc3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1Jlc3VsdEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJldHJpZXZlQWxwaGFJZCgKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkNvbXByZWhlbnNpb25UbHYpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1Jlc3VsdEV4Y2VwdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0xpc3Q8TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL0NvbXByZWhlbnNpb25UbHY7PjspTGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL0N0bHZDb21tYW5kRGV0YWlsczsgKQotcHJpdmF0ZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5DdGx2Q29tbWFuZERldGFpbHMgcmV0cmlldmVDb21tYW5kRGV0YWlscygKLWphdmEudXRpbC5MaXN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0xpc3Q8TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL0NvbXByZWhlbnNpb25UbHY7PjspTGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1NlcnZpY2UkQ3RsdkRldmljZUlkZW50aXRpZXM7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvUmVzdWx0RXhjZXB0aW9uOyApCi1wcml2YXRlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlNlcnZpY2UkQ3RsdkRldmljZUlkZW50aXRpZXMgcmV0cmlldmVEZXZpY2VJZGVudGl0aWVzKAotamF2YS51dGlsLkxpc3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1Jlc3VsdEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5EdXJhdGlvbiByZXRyaWV2ZUR1cmF0aW9uKAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuQ29tcHJlaGVuc2lvblRsdikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvUmVzdWx0RXhjZXB0aW9uOyApCi1wcml2YXRlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlNlcnZpY2UkSWNvbklkIHJldHJpZXZlSWNvbklkKAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuQ29tcHJlaGVuc2lvblRsdikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvUmVzdWx0RXhjZXB0aW9uOyApCi1wcml2YXRlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkl0ZW0gcmV0cmlldmVJdGVtKAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuQ29tcHJlaGVuc2lvblRsdikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvUmVzdWx0RXhjZXB0aW9uOyApCi1wcml2YXRlIGludCByZXRyaWV2ZUl0ZW1JZCgKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkNvbXByZWhlbnNpb25UbHYpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1Jlc3VsdEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5TZXJ2aWNlJEl0ZW1zSWNvbklkIHJldHJpZXZlSXRlbXNJY29uSWQoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5Db21wcmVoZW5zaW9uVGx2KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvQ29tcHJlaGVuc2lvblRsdjspTGphdmEvdXRpbC9MaXN0PExjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9UZXh0QXR0cmlidXRlOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvUmVzdWx0RXhjZXB0aW9uOyApCi1wcml2YXRlIGphdmEudXRpbC5MaXN0IHJldHJpZXZlVGV4dEF0dHJpYnV0ZSgKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkNvbXByZWhlbnNpb25UbHYpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL1Jlc3VsdEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJldHJpZXZlVGV4dFN0cmluZygKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkNvbXByZWhlbnNpb25UbHYpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9Db21wcmVoZW5zaW9uVGx2VGFnO0xqYXZhL3V0aWwvSXRlcmF0b3I8TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL0NvbXByZWhlbnNpb25UbHY7PjspTGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL0NvbXByZWhlbnNpb25UbHY7ICkKLXByaXZhdGUgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuQ29tcHJlaGVuc2lvblRsdiBzZWFyY2hGb3JOZXh0VGFnKAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuQ29tcHJlaGVuc2lvblRsdlRhZwotamF2YS51dGlsLkl0ZXJhdG9yKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9zdGsvQ29tcHJlaGVuc2lvblRsdlRhZztMamF2YS91dGlsL0xpc3Q8TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL0NvbXByZWhlbnNpb25UbHY7PjspTGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vc3RrL0NvbXByZWhlbnNpb25UbHY7ICkKLXByaXZhdGUgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuQ29tcHJlaGVuc2lvblRsdiBzZWFyY2hGb3JUYWcoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5Db21wcmVoZW5zaW9uVGx2VGFnCi1qYXZhLnV0aWwuTGlzdCkKLQotcHJpdmF0ZSB2b2lkIHNlbmRUZXJtaW5hbFJlc3BvbnNlKAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuQ3RsdkNvbW1hbmREZXRhaWxzCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5SZXN1bHRDb2RlCi1ib29sZWFuCi1pbnQKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlNlcnZpY2UkUmVzcG9uc2VEYXRhKQotCi1wcml2YXRlIHZvaWQgc2V0QXBwU3RhdGUoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBhY2NlcHRPclJlamVjdENhbGwoCi1ib29sZWFuKQotCi1wdWJsaWMgYm9vbGVhbiBiYWNrd2FyZE1vdmUoKQotCi1wdWJsaWMgaW50IGdldEFwcEluZGljYXRpb24oKQotCi1wdWJsaWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuTWVudSBnZXRDdXJyZW50TWVudSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFNlcnZpY2VOYW1lKCkKLQotcHVibGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkFwcEludGVyZmFjZSRTdGF0ZSBnZXRTdGF0ZSgpCi0KLXB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyBib29sZWFuIGlzU3RrU3VwcG9ydGVkKCkKLQotcHVibGljIHZvaWQgbm90aWZ5QnJvd3NlclRlcm1pbmF0aW9uKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgbm90aWZ5RGlzcGxheVRleHRFbmRlZCgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIG5vdGlmeUlkbGVTY3JlZW5BdmFpbGFibGUoKQotCi1wdWJsaWMgdm9pZCBub3RpZnlJbmtleSgKLWNoYXIKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIG5vdGlmeUlua2V5KAotYm9vbGVhbgotYm9vbGVhbikKLQotcHVibGljIHZvaWQgbm90aWZ5SW5wdXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBub3RpZnlMYW5ndWFnZVNlbGVjdGlvbigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIG5vdGlmeUxhdW5jaEJyb3dzZXIoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBub3RpZnlNZW51U2VsZWN0aW9uKAotaW50Ci1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBub3RpZnlOb1Jlc3BvbnNlKCkKLQotcHVibGljIHZvaWQgbm90aWZ5U2VsZWN0ZWRJdGVtKAotaW50Ci1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBub3RpZnlUb25lRW5kZWQoKQotCi1wdWJsaWMgdm9pZCBub3RpZnlVc2VyQWN0aXZpdHkoKQotCi0gdm9pZCBzZXRBcHBJbmRpY2F0aW9uKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRDb21tYW5kTGlzdGVuZXIoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5Db21tYW5kTGlzdGVuZXIpCi0KLXB1YmxpYyBib29sZWFuIHRlcm1pbmF0ZVNlc3Npb24oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlN0a0FwcEluc3RhbGxlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU1RLX0FQUF9JTlNUQUxMX0FDVElPTgotCi1zdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTVEtfQVBQX1VOSU5TVEFMTF9BQ1RJT04KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgaW5zdGFsbEFwcCgKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wcml2YXRlIHN0YXRpYyB2b2lkIHNldEFwcFN0YXRlKAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWludCkKLQotcHVibGljIHN0YXRpYyB2b2lkIHVuSW5zdGFsbEFwcCgKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlN0a0FwcFN0YXRlUmVjZWl2ZXIgZXh0ZW5kcyBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCBvblJlY2VpdmUoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC5jb250ZW50LkludGVudCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9FbnVtPExjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9UZXh0QWxpZ25tZW50Oz47ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5UZXh0QWxpZ25tZW50IGV4dGVuZHMgamF2YS5sYW5nLkVudW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuVGV4dEFsaWdubWVudFtdICRWQUxVRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5UZXh0QWxpZ25tZW50IENFTlRFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlRleHRBbGlnbm1lbnQgREVGQVVMVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlRleHRBbGlnbm1lbnQgTEVGVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlRleHRBbGlnbm1lbnQgUklHSFQKLQotcHJpdmF0ZSBpbnQgbVZhbHVlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJKVYgKQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlRleHRBbGlnbm1lbnQgZnJvbUludCgKLWludCkKLQotcHVibGljIHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5UZXh0QWxpZ25tZW50IHZhbHVlT2YoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlRleHRBbGlnbm1lbnRbXSB2YWx1ZXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlRleHRBdHRyaWJ1dGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5UZXh0QWxpZ25tZW50IGFsaWduCi0KLXB1YmxpYyBib29sZWFuIGJvbGQKLQotcHVibGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlRleHRDb2xvciBjb2xvcgotCi1wdWJsaWMgYm9vbGVhbiBpdGFsaWMKLQotcHVibGljIGludCBsZW5ndGgKLQotcHVibGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLkZvbnRTaXplIHNpemUKLQotcHVibGljIGludCBzdGFydAotCi1wdWJsaWMgYm9vbGVhbiBzdHJpa2VUaHJvdWdoCi0KLXB1YmxpYyBib29sZWFuIHVuZGVybGluZWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWludAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuVGV4dEFsaWdubWVudAotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuRm9udFNpemUKLWJvb2xlYW4KLWJvb2xlYW4KLWJvb2xlYW4KLWJvb2xlYW4KLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlRleHRDb2xvcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9FbnVtPExjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9UZXh0Q29sb3I7PjsgKQotcHVibGljIGZpbmFsIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlRleHRDb2xvciBleHRlbmRzIGphdmEubGFuZy5FbnVtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlRleHRDb2xvcltdICRWQUxVRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5UZXh0Q29sb3IgQkxBQ0sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5UZXh0Q29sb3IgQlJJR0hUX0JMVUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5UZXh0Q29sb3IgQlJJR0hUX0NZQU4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5UZXh0Q29sb3IgQlJJR0hUX0dSRUVOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuVGV4dENvbG9yIEJSSUdIVF9NQUdFTlRBCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuVGV4dENvbG9yIEJSSUdIVF9SRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5UZXh0Q29sb3IgQlJJR0hUX1lFTExPVwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlRleHRDb2xvciBEQVJLX0JMVUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5UZXh0Q29sb3IgREFSS19DWUFOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuVGV4dENvbG9yIERBUktfR1JBWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlRleHRDb2xvciBEQVJLX0dSRUVOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuVGV4dENvbG9yIERBUktfTUFHRU5UQQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlRleHRDb2xvciBEQVJLX1JFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlRleHRDb2xvciBEQVJLX1lFTExPVwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlRleHRDb2xvciBHUkFZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuVGV4dENvbG9yIFdISVRFCi0KLXByaXZhdGUgaW50IG1WYWx1ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSSlWICkKLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5UZXh0Q29sb3IgZnJvbUludCgKLWludCkKLQotcHVibGljIHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5UZXh0Q29sb3IgdmFsdWVPZigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuVGV4dENvbG9yW10gdmFsdWVzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9FbnVtPExjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL3N0ay9Ub25lOz47ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5Ub25lIGV4dGVuZHMgamF2YS5sYW5nLkVudW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuVG9uZVtdICRWQUxVRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5Ub25lIEJVU1kKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5Ub25lIENBTExfV0FJVElORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlRvbmUgQ09OR0VTVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlRvbmUgQ1JJVElDQUxfQUxFUlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5Ub25lIERJQUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5Ub25lIEVSUk9SX1NQRUNJQUxfSU5GTwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlRvbmUgR0VORVJBTF9CRUVQCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuVG9uZSBIQVBQWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlRvbmUgSU5DT01JTkdfU01TCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuVG9uZSBJTkNPTUlOR19TUEVFQ0hfQ0FMTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlRvbmUgTUVMT0RZXzEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5Ub25lIE1FTE9EWV8yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuVG9uZSBNRUxPRFlfMwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlRvbmUgTUVMT0RZXzQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5Ub25lIE1FTE9EWV81Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuVG9uZSBNRUxPRFlfNgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlRvbmUgTUVMT0RZXzcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5Ub25lIE1FTE9EWV84Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuVG9uZSBNRVNTQUdFX1JFQ0VJVkVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuVG9uZSBORUdBVElWRV9BQ0sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5Ub25lIFBPU0lUSVZFX0FDSwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlRvbmUgUVVFU1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5Ub25lIFJBRElPX1BBVEhfQUNLCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuVG9uZSBSQURJT19QQVRIX05PVF9BVkFJTEFCTEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5Ub25lIFJJTkdJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5Ub25lIFNBRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlRvbmUgVVJHRU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5zdGsuVG9uZSBWSUJSQVRFX09OTFkKLQotcHJpdmF0ZSBpbnQgbVZhbHVlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJKVYgKQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlRvbmUgZnJvbUludCgKLWludCkKLQotcHVibGljIHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLnN0ay5Ub25lIHZhbHVlT2YoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uc3RrLlRvbmVbXSB2YWx1ZXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTY0MDggbmFtZSA9U3RhdGUgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS90ZXN0L0NhbGxJbmZvOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9FbnVtPExjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvdGVzdC9DYWxsSW5mbyRTdGF0ZTs+OyApCi1maW5hbCBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkudGVzdC5DYWxsSW5mbyRTdGF0ZSBleHRlbmRzIGphdmEubGFuZy5FbnVtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS50ZXN0LkNhbGxJbmZvJFN0YXRlW10gJFZBTFVFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS50ZXN0LkNhbGxJbmZvJFN0YXRlIEFDVElWRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS50ZXN0LkNhbGxJbmZvJFN0YXRlIEFMRVJUSU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnRlc3QuQ2FsbEluZm8kU3RhdGUgRElBTElORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS50ZXN0LkNhbGxJbmZvJFN0YXRlIEhPTERJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkudGVzdC5DYWxsSW5mbyRTdGF0ZSBJTkNPTUlORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS50ZXN0LkNhbGxJbmZvJFN0YXRlIFdBSVRJTkcKLQotcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KEkpViApCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnRlc3QuQ2FsbEluZm8kU3RhdGUgdmFsdWVPZigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnRlc3QuQ2FsbEluZm8kU3RhdGVbXSB2YWx1ZXMoKQotCi1wdWJsaWMgaW50IHZhbHVlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvdGVzdC9DYWxsSW5mbyRTdGF0ZTsgKQotIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS50ZXN0LkNhbGxJbmZvIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gaW50IFRPQQotCi0gYm9vbGVhbiBpc01UCi0KLSBib29sZWFuIGlzTXB0eQotCi0gamF2YS5sYW5nLlN0cmluZyBudW1iZXIKLQotIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS50ZXN0LkNhbGxJbmZvJFN0YXRlIHN0YXRlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYm9vbGVhbgotY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnRlc3QuQ2FsbEluZm8kU3RhdGUKLWJvb2xlYW4KLWphdmEubGFuZy5TdHJpbmcpCi0KLXN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkudGVzdC5DYWxsSW5mbyBjcmVhdGVJbmNvbWluZ0NhbGwoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1zdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnRlc3QuQ2FsbEluZm8gY3JlYXRlT3V0Z29pbmdDYWxsKAotamF2YS5sYW5nLlN0cmluZykKLQotIGJvb2xlYW4gaXNBY3RpdmVPckhlbGQoKQotCi0gYm9vbGVhbiBpc0Nvbm5lY3RpbmcoKQotCi0gYm9vbGVhbiBpc1JpbmdpbmcoKQotCi0gamF2YS5sYW5nLlN0cmluZyB0b0NMQ0NMaW5lKAotaW50KQotCi0gY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5Ecml2ZXJDYWxsIHRvRHJpdmVyQ2FsbCgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLSBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkudGVzdC5JbnRlcnByZXRlckV4IGV4dGVuZHMgamF2YS5sYW5nLkV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gamF2YS5sYW5nLlN0cmluZyByZXN1bHQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS50ZXN0LkludmFsaWRTdGF0ZUV4IGV4dGVuZHMgamF2YS5sYW5nLkV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi0gY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnRlc3QuTGluZVJlYWRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIGludCBCVUZGRVJfU0laRQotCi0gYnl0ZVtdIGJ1ZmZlcgotCi0gamF2YS5pby5JbnB1dFN0cmVhbSBpblN0cmVhbQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEuaW8uSW5wdXRTdHJlYW0pCi0KLSBqYXZhLmxhbmcuU3RyaW5nIGdldE5leHRMaW5lKCkKLQotIGphdmEubGFuZy5TdHJpbmcgZ2V0TmV4dExpbmUoCi1ib29sZWFuKQotCi0gamF2YS5sYW5nLlN0cmluZyBnZXROZXh0TGluZUN0cmxaKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi0gY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnRlc3QuTW9kZWxJbnRlcnByZXRlciQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5SdW5uYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkudGVzdC5Nb2RlbEludGVycHJldGVyIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS50ZXN0Lk1vZGVsSW50ZXJwcmV0ZXIpCi0KLXB1YmxpYyB2b2lkIHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS50ZXN0LlNpbXVsYXRlZFJhZGlvQ29udHJvbCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBwYXVzZVJlc3BvbnNlcygpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHByb2dyZXNzQ29ubmVjdGluZ0NhbGxTdGF0ZSgpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHByb2dyZXNzQ29ubmVjdGluZ1RvQWN0aXZlKCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgcmVzdW1lUmVzcG9uc2VzKCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0QXV0b1Byb2dyZXNzQ29ubmVjdGluZ0NhbGwoCi1ib29sZWFuKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXROZXh0Q2FsbEZhaWxDYXVzZSgKLWludCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0TmV4dERpYWxGYWlsSW1tZWRpYXRlbHkoCi1ib29sZWFuKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzaHV0ZG93bigpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHRyaWdnZXJIYW5ndXBBbGwoKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB0cmlnZ2VySGFuZ3VwQmFja2dyb3VuZCgpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHRyaWdnZXJIYW5ndXBGb3JlZ3JvdW5kKCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgdHJpZ2dlckluY29taW5nU01TKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IHZvaWQgdHJpZ2dlckluY29taW5nVXNzZCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHRyaWdnZXJSaW5nKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IHZvaWQgdHJpZ2dlclNzbigKLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS50ZXN0Lk1vZGVsSW50ZXJwcmV0ZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5sYW5nLlJ1bm5hYmxlLCBhbmRyb2lkLm9zLkhhbmRsZXJJbnRlcmZhY2UsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS50ZXN0LlNpbXVsYXRlZFJhZGlvQ29udHJvbAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgaW50IENPTk5FQ1RJTkdfUEFVU0VfTVNFQwotCi1zdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMT0dfVEFHCi0KLXN0YXRpYyBmaW5hbCBpbnQgTUFYX0NBTExTCi0KLXN0YXRpYyBmaW5hbCBpbnQgUFJPR1JFU1NfQ0FMTF9TVEFURQotCi1zdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZ1tdW10gc0RlZmF1bHRSZXNwb25zZXMKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGZpbmFsUmVzcG9uc2UKLQotIGNvbS5hbmRyb2lkLmludGVybmFsLm9zLkhhbmRsZXJUaHJlYWQgaGFuZGxlclRocmVhZAotCi0gamF2YS5pby5JbnB1dFN0cmVhbSBpbgotCi0gY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnRlc3QuTGluZVJlYWRlciBsaW5lUmVhZGVyCi0KLSBqYXZhLmlvLk91dHB1dFN0cmVhbSBvdXQKLQotIGludCBwYXVzZWRSZXNwb25zZUNvdW50Ci0KLSBqYXZhLmxhbmcuT2JqZWN0IHBhdXNlZFJlc3BvbnNlTW9uaXRvcgotCi0gY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnRlc3QuU2ltdWxhdGVkR3NtQ2FsbFN0YXRlIHNpbXVsYXRlZENhbGxTdGF0ZQotCi0gamF2YS5uZXQuU2VydmVyU29ja2V0IHNzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmlvLklucHV0U3RyZWFtCi1qYXZhLmlvLk91dHB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3MpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS90ZXN0L0ludGVycHJldGVyRXg7ICkKLXByaXZhdGUgdm9pZCBjb25mZXJlbmNlKCkKLQotcHJpdmF0ZSB2b2lkIGluaXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvdGVzdC9JbnRlcnByZXRlckV4OyApCi1wcml2YXRlIHZvaWQgb25BbnN3ZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvdGVzdC9JbnRlcnByZXRlckV4OyApCi1wcml2YXRlIHZvaWQgb25DSExEKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3Rlc3QvSW50ZXJwcmV0ZXJFeDsgKQotcHJpdmF0ZSB2b2lkIG9uQ0xDQygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS90ZXN0L0ludGVycHJldGVyRXg7ICkKLXByaXZhdGUgdm9pZCBvbkRpYWwoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvdGVzdC9JbnRlcnByZXRlckV4OyApCi1wcml2YXRlIHZvaWQgb25IYW5ndXAoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvdGVzdC9JbnRlcnByZXRlckV4OyApCi1wcml2YXRlIHZvaWQgb25TTVNTZW5kKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3Rlc3QvSW50ZXJwcmV0ZXJFeDsgKQotcHJpdmF0ZSB2b2lkIHJlbGVhc2VBY3RpdmVBY2NlcHRIZWxkT3JXYWl0aW5nKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3Rlc3QvSW50ZXJwcmV0ZXJFeDsgKQotcHJpdmF0ZSB2b2lkIHJlbGVhc2VIZWxkT3JVRFVCKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3Rlc3QvSW50ZXJwcmV0ZXJFeDsgKQotcHJpdmF0ZSB2b2lkIHNlcGFyYXRlQ2FsbCgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3Rlc3QvSW50ZXJwcmV0ZXJFeDsgKQotcHJpdmF0ZSB2b2lkIHN3aXRjaEFjdGl2ZUFuZEhlbGRPcldhaXRpbmcoKQotCi1wdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBwYXVzZVJlc3BvbnNlcygpCi0KLSB2b2lkIHByaW50KAotamF2YS5sYW5nLlN0cmluZykKLQotIHZvaWQgcHJpbnRsbigKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS90ZXN0L0ludGVycHJldGVyRXg7ICkKLSB2b2lkIHByb2Nlc3NMaW5lKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgcHJvZ3Jlc3NDb25uZWN0aW5nQ2FsbFN0YXRlKCkKLQotcHVibGljIHZvaWQgcHJvZ3Jlc3NDb25uZWN0aW5nVG9BY3RpdmUoKQotCi1wdWJsaWMgdm9pZCByZXN1bWVSZXNwb25zZXMoKQotCi1wdWJsaWMgdm9pZCBydW4oKQotCi1wdWJsaWMgdm9pZCBzZW5kVW5zb2xpY2l0ZWQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRBdXRvUHJvZ3Jlc3NDb25uZWN0aW5nQ2FsbCgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldE5leHRDYWxsRmFpbENhdXNlKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXROZXh0RGlhbEZhaWxJbW1lZGlhdGVseSgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNodXRkb3duKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3Rlc3QvSW50ZXJwcmV0ZXJFeDsgKQotIGphdmEubGFuZy5TdHJpbmdbXSBzcGxpdENvbW1hbmRzKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgdHJpZ2dlckhhbmd1cEFsbCgpCi0KLXB1YmxpYyB2b2lkIHRyaWdnZXJIYW5ndXBCYWNrZ3JvdW5kKCkKLQotcHVibGljIHZvaWQgdHJpZ2dlckhhbmd1cEZvcmVncm91bmQoKQotCi1wdWJsaWMgdm9pZCB0cmlnZ2VySW5jb21pbmdTTVMoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCB0cmlnZ2VySW5jb21pbmdVc3NkKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgdHJpZ2dlclJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCB0cmlnZ2VyU3NuKAotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS50ZXN0LlNpbXVsYXRlZENvbW1hbmRzJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5sYW5nLlJ1bm5hYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS50ZXN0LlNpbXVsYXRlZENvbW1hbmRzIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS50ZXN0LlNpbXVsYXRlZENvbW1hbmRzKQotCi1wdWJsaWMgdm9pZCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvdGVzdC9TaW11bGF0ZWRDb21tYW5kczsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID00MTA0IG5hbWUgPW51bGwgKQotIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS50ZXN0LlNpbXVsYXRlZENvbW1hbmRzJDIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBmaW5hbCBpbnRbXSAkU3dpdGNoTWFwJGNvbSRhbmRyb2lkJGludGVybmFsJHRlbGVwaG9ueSRnc20kQ29tbWFuZHNJbnRlcmZhY2UkUmFkaW9TdGF0ZQotCi1zdGF0aWMgZmluYWwgaW50W10gJFN3aXRjaE1hcCRjb20kYW5kcm9pZCRpbnRlcm5hbCR0ZWxlcGhvbnkkdGVzdCRTaW11bGF0ZWRDb21tYW5kcyRTaW1Mb2NrU3RhdGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNjQxMCBuYW1lID1TaW1GZG5TdGF0ZSApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9FbnVtPExjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvdGVzdC9TaW11bGF0ZWRDb21tYW5kcyRTaW1GZG5TdGF0ZTs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3Rlc3QvU2ltdWxhdGVkQ29tbWFuZHM7ICkKLWZpbmFsIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS50ZXN0LlNpbXVsYXRlZENvbW1hbmRzJFNpbUZkblN0YXRlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnRlc3QuU2ltdWxhdGVkQ29tbWFuZHMkU2ltRmRuU3RhdGVbXSAkVkFMVUVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnRlc3QuU2ltdWxhdGVkQ29tbWFuZHMkU2ltRmRuU3RhdGUgTk9ORQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS50ZXN0LlNpbXVsYXRlZENvbW1hbmRzJFNpbUZkblN0YXRlIFJFUVVJUkVfUElOMgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS50ZXN0LlNpbXVsYXRlZENvbW1hbmRzJFNpbUZkblN0YXRlIFJFUVVJUkVfUFVLMgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS50ZXN0LlNpbXVsYXRlZENvbW1hbmRzJFNpbUZkblN0YXRlIFNJTV9QRVJNX0xPQ0tFRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVYgKQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkudGVzdC5TaW11bGF0ZWRDb21tYW5kcyRTaW1GZG5TdGF0ZSB2YWx1ZU9mKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkudGVzdC5TaW11bGF0ZWRDb21tYW5kcyRTaW1GZG5TdGF0ZVtdIHZhbHVlcygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNjQxMCBuYW1lID1TaW1Mb2NrU3RhdGUgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvRW51bTxMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3Rlc3QvU2ltdWxhdGVkQ29tbWFuZHMkU2ltTG9ja1N0YXRlOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvdGVzdC9TaW11bGF0ZWRDb21tYW5kczsgKQotZmluYWwgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnRlc3QuU2ltdWxhdGVkQ29tbWFuZHMkU2ltTG9ja1N0YXRlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnRlc3QuU2ltdWxhdGVkQ29tbWFuZHMkU2ltTG9ja1N0YXRlW10gJFZBTFVFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS50ZXN0LlNpbXVsYXRlZENvbW1hbmRzJFNpbUxvY2tTdGF0ZSBOT05FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnRlc3QuU2ltdWxhdGVkQ29tbWFuZHMkU2ltTG9ja1N0YXRlIFJFUVVJUkVfUElOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnRlc3QuU2ltdWxhdGVkQ29tbWFuZHMkU2ltTG9ja1N0YXRlIFJFUVVJUkVfUFVLCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnRlc3QuU2ltdWxhdGVkQ29tbWFuZHMkU2ltTG9ja1N0YXRlIFNJTV9QRVJNX0xPQ0tFRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVYgKQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkudGVzdC5TaW11bGF0ZWRDb21tYW5kcyRTaW1Mb2NrU3RhdGUgdmFsdWVPZigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnRlc3QuU2ltdWxhdGVkQ29tbWFuZHMkU2ltTG9ja1N0YXRlW10gdmFsdWVzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvdGVzdC9TaW11bGF0ZWRDb21tYW5kcyQyO0xjb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvdGVzdC9TaW11bGF0ZWRDb21tYW5kcyRTaW1GZG5TdGF0ZTtMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3Rlc3QvU2ltdWxhdGVkQ29tbWFuZHMkU2ltTG9ja1N0YXRlOyApCi1wdWJsaWMgZmluYWwgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnRlc3QuU2ltdWxhdGVkQ29tbWFuZHMgZXh0ZW5kcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkJhc2VDb21tYW5kcyBpbXBsZW1lbnRzIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uQ29tbWFuZHNJbnRlcmZhY2UsIGFuZHJvaWQub3MuSGFuZGxlckludGVyZmFjZSwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnRlc3QuU2ltdWxhdGVkUmFkaW9Db250cm9sCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVGQVVMVF9TSU1fUElOMl9DT0RFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVGQVVMVF9TSU1fUElOX0NPREUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnRlc3QuU2ltdWxhdGVkQ29tbWFuZHMkU2ltRmRuU3RhdGUgSU5JVElBTF9GRE5fU1RBVEUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnRlc3QuU2ltdWxhdGVkQ29tbWFuZHMkU2ltTG9ja1N0YXRlIElOSVRJQUxfTE9DS19TVEFURQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIExPR19UQUcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTSU1fUFVLMl9DT0RFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0lNX1BVS19DT0RFCi0KLSBjb20uYW5kcm9pZC5pbnRlcm5hbC5vcy5IYW5kbGVyVGhyZWFkIGhhbmRsZXJUaHJlYWQKLQotIGludCBtTmV0d29ya1R5cGUKLQotIGphdmEubGFuZy5TdHJpbmcgbVBpbjJDb2RlCi0KLSBpbnQgbVBpbjJVbmxvY2tBdHRlbXB0cwotCi0gamF2YS5sYW5nLlN0cmluZyBtUGluQ29kZQotCi0gaW50IG1QaW5VbmxvY2tBdHRlbXB0cwotCi0gaW50IG1QdWsyVW5sb2NrQXR0ZW1wdHMKLQotIGludCBtUHVrVW5sb2NrQXR0ZW1wdHMKLQotIGJvb2xlYW4gbVNpbUZkbkVuYWJsZWQKLQotIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS50ZXN0LlNpbXVsYXRlZENvbW1hbmRzJFNpbUZkblN0YXRlIG1TaW1GZG5FbmFibGVkU3RhdGUKLQotIGJvb2xlYW4gbVNpbUxvY2tFbmFibGVkCi0KLSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkudGVzdC5TaW11bGF0ZWRDb21tYW5kcyRTaW1Mb2NrU3RhdGUgbVNpbUxvY2tlZFN0YXRlCi0KLSBib29sZWFuIG1Tc25Ob3RpZnlPbgotCi0gaW50IG5leHRDYWxsRmFpbENhdXNlCi0KLSBpbnQgcGF1c2VkUmVzcG9uc2VDb3VudAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQXJyYXlMaXN0PExhbmRyb2lkL29zL01lc3NhZ2U7PjsgKQotIGphdmEudXRpbC5BcnJheUxpc3QgcGF1c2VkUmVzcG9uc2VzCi0KLSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkudGVzdC5TaW11bGF0ZWRHc21DYWxsU3RhdGUgc2ltdWxhdGVkQ2FsbFN0YXRlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIGJvb2xlYW4gaXNTaW1Mb2NrZWQoKQotCi1wcml2YXRlIHZvaWQgcmVzdWx0RmFpbCgKLWFuZHJvaWQub3MuTWVzc2FnZQotamF2YS5sYW5nLlRocm93YWJsZSkKLQotcHJpdmF0ZSB2b2lkIHJlc3VsdFN1Y2Nlc3MoCi1hbmRyb2lkLm9zLk1lc3NhZ2UKLWphdmEubGFuZy5PYmplY3QpCi0KLXByaXZhdGUgdm9pZCByZXR1cm5TaW1Mb2NrZWRTdGF0dXMoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXByaXZhdGUgdm9pZCB1bmltcGxlbWVudGVkKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBhY2NlcHRDYWxsKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBhY2tub3dsZWRnZUxhc3RJbmNvbWluZ1NNUygKLWJvb2xlYW4KLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgY2FuY2VsUGVuZGluZ1Vzc2QoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIGNoYW5nZUJhcnJpbmdQYXNzd29yZCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgY2hhbmdlU2ltUGluKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBjaGFuZ2VTaW1QaW4yKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBjb25mZXJlbmNlKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBkZWFjdGl2YXRlRGVmYXVsdFBEUCgKLWludAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBkZWxldGVTbXNPblNpbSgKLWludAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBkaWFsKAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIGV4cGxpY2l0Q2FsbFRyYW5zZmVyKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBnZXRBdmFpbGFibGVOZXR3b3JrcygKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgZ2V0QmFzZWJhbmRWZXJzaW9uKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBnZXRDTElSKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBnZXRDdXJyZW50Q2FsbHMoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIGdldEdQUlNSZWdpc3RyYXRpb25TdGF0ZSgKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgZ2V0SU1FSSgKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgZ2V0SU1FSVNWKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBnZXRJTVNJKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBnZXRMYXN0Q2FsbEZhaWxDYXVzZSgKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgZ2V0TGFzdFBkcEZhaWxDYXVzZSgKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgZ2V0TXV0ZSgKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgZ2V0TmVpZ2hib3JpbmdDaWRzKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBnZXROZXR3b3JrU2VsZWN0aW9uTW9kZSgKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgZ2V0T3BlcmF0b3IoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIGdldFBEUENvbnRleHRMaXN0KAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBnZXRQcmVmZXJyZWROZXR3b3JrVHlwZSgKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgZ2V0UmVnaXN0cmF0aW9uU3RhdGUoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIGdldFNpZ25hbFN0cmVuZ3RoKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBnZXRTaW1TdGF0dXMoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIGhhbmRsZUNhbGxTZXR1cFJlcXVlc3RGcm9tU2ltKAotYm9vbGVhbgotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBoYW5ndXBDb25uZWN0aW9uKAotaW50Ci1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIGhhbmd1cEZvcmVncm91bmRSZXN1bWVCYWNrZ3JvdW5kKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBoYW5ndXBXYWl0aW5nT3JCYWNrZ3JvdW5kKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBpbnZva2VPZW1SaWxSZXF1ZXN0UmF3KAotYnl0ZVtdCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIGludm9rZU9lbVJpbFJlcXVlc3RTdHJpbmdzKAotamF2YS5sYW5nLlN0cmluZ1tdCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIHBhdXNlUmVzcG9uc2VzKCkKLQotcHVibGljIHZvaWQgcHJvZ3Jlc3NDb25uZWN0aW5nQ2FsbFN0YXRlKCkKLQotcHVibGljIHZvaWQgcHJvZ3Jlc3NDb25uZWN0aW5nVG9BY3RpdmUoKQotCi1wdWJsaWMgdm9pZCBxdWVyeUF2YWlsYWJsZUJhbmRNb2RlKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBxdWVyeUNMSVAoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIHF1ZXJ5Q2FsbEZvcndhcmRTdGF0dXMoCi1pbnQKLWludAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBxdWVyeUNhbGxXYWl0aW5nKAotaW50Ci1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIHF1ZXJ5RmFjaWxpdHlMb2NrKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotaW50Ci1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIHJlamVjdENhbGwoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIHJlc2V0UmFkaW8oCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIHJlc3VtZVJlc3BvbnNlcygpCi0KLXB1YmxpYyB2b2lkIHNlbmREdG1mKAotY2hhcgotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBzZW5kRW52ZWxvcGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIHNlbmRTTVMoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIHNlbmRUZXJtaW5hbFJlc3BvbnNlKAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBzZW5kVVNTRCgKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgc2VwYXJhdGVDb25uZWN0aW9uKAotaW50Ci1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIHNldEF1dG9Qcm9ncmVzc0Nvbm5lY3RpbmdDYWxsKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0QmFuZE1vZGUoCi1pbnQKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgc2V0Q0xJUigKLWludAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBzZXRDYWxsRm9yd2FyZCgKLWludAotaW50Ci1pbnQKLWphdmEubGFuZy5TdHJpbmcKLWludAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBzZXRDYWxsV2FpdGluZygKLWJvb2xlYW4KLWludAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBzZXRGYWNpbGl0eUxvY2soCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgc2V0TG9jYXRpb25VcGRhdGVzKAotYm9vbGVhbgotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBzZXRNdXRlKAotYm9vbGVhbgotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBzZXROZXR3b3JrU2VsZWN0aW9uTW9kZUF1dG9tYXRpYygKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgc2V0TmV0d29ya1NlbGVjdGlvbk1vZGVNYW51YWwoCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIHNldE5leHRDYWxsRmFpbENhdXNlKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXROZXh0RGlhbEZhaWxJbW1lZGlhdGVseSgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldFByZWZlcnJlZE5ldHdvcmtUeXBlKAotaW50Ci1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIHNldFJhZGlvUG93ZXIoCi1ib29sZWFuCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIHNldFN1cHBTZXJ2aWNlTm90aWZpY2F0aW9ucygKLWJvb2xlYW4KLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgc2V0dXBEZWZhdWx0UERQKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBzaHV0ZG93bigpCi0KLXB1YmxpYyB2b2lkIHNpbUlPKAotaW50Ci1pbnQKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50Ci1pbnQKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgc3RhcnREdG1mKAotY2hhcgotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBzdG9wRHRtZigKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgc3VwcGx5TmV0d29ya0RlcGVyc29uYWxpemF0aW9uKAotamF2YS5sYW5nLlN0cmluZwotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1wdWJsaWMgdm9pZCBzdXBwbHlTaW1QaW4oCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIHN1cHBseVNpbVBpbjIoCi1qYXZhLmxhbmcuU3RyaW5nCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyB2b2lkIHN1cHBseVNpbVB1aygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgc3VwcGx5U2ltUHVrMigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgc3dpdGNoV2FpdGluZ09ySG9sZGluZ0FuZEFjdGl2ZSgKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotcHVibGljIHZvaWQgdHJpZ2dlckhhbmd1cEFsbCgpCi0KLXB1YmxpYyB2b2lkIHRyaWdnZXJIYW5ndXBCYWNrZ3JvdW5kKCkKLQotcHVibGljIHZvaWQgdHJpZ2dlckhhbmd1cEZvcmVncm91bmQoKQotCi1wdWJsaWMgdm9pZCB0cmlnZ2VySW5jb21pbmdTTVMoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCB0cmlnZ2VySW5jb21pbmdVc3NkKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgdHJpZ2dlclJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCB0cmlnZ2VyU3NuKAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIHdyaXRlU21zVG9TaW0oCi1pbnQKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLSBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkudGVzdC5TaW11bGF0ZWRHc21DYWxsU3RhdGUgZXh0ZW5kcyBhbmRyb2lkLm9zLkhhbmRsZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIGludCBDT05ORUNUSU5HX1BBVVNFX01TRUMKLQotc3RhdGljIGZpbmFsIGludCBFVkVOVF9QUk9HUkVTU19DQUxMX1NUQVRFCi0KLXN0YXRpYyBmaW5hbCBpbnQgTUFYX0NBTExTCi0KLXByaXZhdGUgYm9vbGVhbiBhdXRvUHJvZ3Jlc3NDb25uZWN0aW5nCi0KLSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkudGVzdC5DYWxsSW5mb1tdIGNhbGxzCi0KLXByaXZhdGUgYm9vbGVhbiBuZXh0RGlhbEZhaWxJbW1lZGlhdGVseQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS90ZXN0L0ludmFsaWRTdGF0ZUV4OyApCi1wcml2YXRlIGludCBjb3VudEFjdGl2ZUxpbmVzKCkKLQotcHVibGljIGJvb2xlYW4gY29uZmVyZW5jZSgpCi0KLXB1YmxpYyBib29sZWFuIGV4cGxpY2l0Q2FsbFRyYW5zZmVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvTGlzdDxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0Q2xjY0xpbmVzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvTGlzdDxMY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Ecml2ZXJDYWxsOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXREcml2ZXJDYWxscygpCi0KLXB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoCi1hbmRyb2lkLm9zLk1lc3NhZ2UpCi0KLXB1YmxpYyBib29sZWFuIG9uQW5zd2VyKCkKLQotcHVibGljIGJvb2xlYW4gb25DaGxkKAotY2hhcgotY2hhcikKLQotcHVibGljIGJvb2xlYW4gb25EaWFsKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJvb2xlYW4gb25IYW5ndXAoKQotCi1wdWJsaWMgdm9pZCBwcm9ncmVzc0Nvbm5lY3RpbmdDYWxsU3RhdGUoKQotCi1wdWJsaWMgdm9pZCBwcm9ncmVzc0Nvbm5lY3RpbmdUb0FjdGl2ZSgpCi0KLXB1YmxpYyBib29sZWFuIHJlbGVhc2VBY3RpdmVBY2NlcHRIZWxkT3JXYWl0aW5nKCkKLQotcHVibGljIGJvb2xlYW4gcmVsZWFzZUhlbGRPclVEVUIoKQotCi1wdWJsaWMgYm9vbGVhbiBzZXBhcmF0ZUNhbGwoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldEF1dG9Qcm9ncmVzc0Nvbm5lY3RpbmdDYWxsKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0TmV4dERpYWxGYWlsSW1tZWRpYXRlbHkoCi1ib29sZWFuKQotCi1wdWJsaWMgYm9vbGVhbiBzd2l0Y2hBY3RpdmVBbmRIZWxkT3JXYWl0aW5nKCkKLQotcHVibGljIGJvb2xlYW4gdHJpZ2dlckhhbmd1cEFsbCgpCi0KLXB1YmxpYyBib29sZWFuIHRyaWdnZXJIYW5ndXBCYWNrZ3JvdW5kKCkKLQotcHVibGljIGJvb2xlYW4gdHJpZ2dlckhhbmd1cEZvcmVncm91bmQoKQotCi1wdWJsaWMgYm9vbGVhbiB0cmlnZ2VyUmluZygKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5BcnJheVV0aWxzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0FDSEVfU0laRQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuT2JqZWN0W10gRU1QVFkKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLk9iamVjdFtdIHNDYWNoZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFQ6TGphdmEvbGFuZy9PYmplY3Q7PihbVFQ7VFQ7KVogKQotcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zKAotamF2YS5sYW5nLk9iamVjdFtdCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz4oTGphdmEvbGFuZy9DbGFzczxUVDs+OylbVFQ7ICkKLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLk9iamVjdFtdIGVtcHR5QXJyYXkoCi1qYXZhLmxhbmcuQ2xhc3MpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbHMoCi1ieXRlW10KLWJ5dGVbXQotaW50KQotCi1wdWJsaWMgc3RhdGljIGludCBpZGVhbEJvb2xlYW5BcnJheVNpemUoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgaW50IGlkZWFsQnl0ZUFycmF5U2l6ZSgKLWludCkKLQotcHVibGljIHN0YXRpYyBpbnQgaWRlYWxDaGFyQXJyYXlTaXplKAotaW50KQotCi1wdWJsaWMgc3RhdGljIGludCBpZGVhbEZsb2F0QXJyYXlTaXplKAotaW50KQotCi1wdWJsaWMgc3RhdGljIGludCBpZGVhbEludEFycmF5U2l6ZSgKLWludCkKLQotcHVibGljIHN0YXRpYyBpbnQgaWRlYWxMb25nQXJyYXlTaXplKAotaW50KQotCi1wdWJsaWMgc3RhdGljIGludCBpZGVhbE9iamVjdEFycmF5U2l6ZSgKLWludCkKLQotcHVibGljIHN0YXRpYyBpbnQgaWRlYWxTaG9ydEFycmF5U2l6ZSgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1maW5hbCBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkNoYXJTZXF1ZW5jZXMkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGJ5dGVbXSB2YWwkYnl0ZXMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1ieXRlW10pCi0KLXB1YmxpYyBjaGFyIGNoYXJBdCgKLWludCkKLQotcHVibGljIGludCBsZW5ndGgoKQotCi1wdWJsaWMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBzdWJTZXF1ZW5jZSgKLWludAotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotZmluYWwgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5DaGFyU2VxdWVuY2VzJDIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBieXRlW10gdmFsJGJ5dGVzCi0KLWZpbmFsIGludCB2YWwkZW5kCi0KLWZpbmFsIGludCB2YWwkc3RhcnQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1ieXRlW10KLWludAotaW50KQotCi1wdWJsaWMgY2hhciBjaGFyQXQoCi1pbnQpCi0KLXB1YmxpYyBpbnQgbGVuZ3RoKCkKLQotcHVibGljIGphdmEubGFuZy5DaGFyU2VxdWVuY2Ugc3ViU2VxdWVuY2UoCi1pbnQKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuQ2hhclNlcXVlbmNlcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG9JZ25vcmVDYXNlKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBmb3JBc2NpaUJ5dGVzKAotYnl0ZVtdKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgZm9yQXNjaWlCeXRlcygKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLXN0YXRpYyB2b2lkIHZhbGlkYXRlKAotaW50Ci1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkZhc3RNYXRoIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgaW50IHJvdW5kKAotZmxvYXQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5GYXN0WG1sU2VyaWFsaXplciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcueG1scHVsbC52MS5YbWxTZXJpYWxpemVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVUZGRVJfTEVOCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmdbXSBFU0NBUEVfVEFCTEUKLQotcHJpdmF0ZSBqYXZhLm5pby5CeXRlQnVmZmVyIG1CeXRlcwotCi1wcml2YXRlIGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldEVuY29kZXIgbUNoYXJzZXQKLQotcHJpdmF0ZSBib29sZWFuIG1JblRhZwotCi1wcml2YXRlIGphdmEuaW8uT3V0cHV0U3RyZWFtIG1PdXRwdXRTdHJlYW0KLQotcHJpdmF0ZSBpbnQgbVBvcwotCi1wcml2YXRlIGZpbmFsIGNoYXJbXSBtVGV4dAotCi1wcml2YXRlIGphdmEuaW8uV3JpdGVyIG1Xcml0ZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCBhcHBlbmQoCi1jaGFyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgYXBwZW5kKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIGFwcGVuZCgKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgYXBwZW5kKAotY2hhcltdCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIGVzY2FwZUFuZEFwcGVuZFN0cmluZygKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCBlc2NhcGVBbmRBcHBlbmRTdHJpbmcoCi1jaGFyW10KLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgZmx1c2hCeXRlcygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBvcmcueG1scHVsbC52MS5YbWxTZXJpYWxpemVyIGF0dHJpYnV0ZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNkc2VjdCgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNvbW1lbnQoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBkb2NkZWNsKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjtMamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgZW5kRG9jdW1lbnQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgb3JnLnhtbHB1bGwudjEuWG1sU2VyaWFsaXplciBlbmRUYWcoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBlbnRpdHlSZWYoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBmbHVzaCgpCi0KLXB1YmxpYyBpbnQgZ2V0RGVwdGgoKQotCi1wdWJsaWMgYm9vbGVhbiBnZXRGZWF0dXJlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TmFtZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE5hbWVzcGFjZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFByZWZpeCgKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4pCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldFByb3BlcnR5KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjtMamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgaWdub3JhYmxlV2hpdGVzcGFjZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHByb2Nlc3NpbmdJbnN0cnVjdGlvbigKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldEZlYXR1cmUoCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRPdXRwdXQoCi1qYXZhLmlvLk91dHB1dFN0cmVhbQotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjtMamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0T3V0cHV0KAotamF2YS5pby5Xcml0ZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldFByZWZpeCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldFByb3BlcnR5KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjtMamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc3RhcnREb2N1bWVudCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5Cb29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgb3JnLnhtbHB1bGwudjEuWG1sU2VyaWFsaXplciBzdGFydFRhZygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBvcmcueG1scHVsbC52MS5YbWxTZXJpYWxpemVyIHRleHQoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgb3JnLnhtbHB1bGwudjEuWG1sU2VyaWFsaXplciB0ZXh0KAotY2hhcltdCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkhleER1bXAgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBIRVhfRElHSVRTCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZHVtcEhleFN0cmluZygKLWJ5dGVbXSkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGR1bXBIZXhTdHJpbmcoCi1ieXRlW10KLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIGJ5dGVbXSBoZXhTdHJpbmdUb0J5dGVBcnJheSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgc3RhdGljIGludCB0b0J5dGUoCi1jaGFyKQotCi1wdWJsaWMgc3RhdGljIGJ5dGVbXSB0b0J5dGVBcnJheSgKLWJ5dGUpCi0KLXB1YmxpYyBzdGF0aWMgYnl0ZVtdIHRvQnl0ZUFycmF5KAotaW50KQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgdG9IZXhTdHJpbmcoCi1ieXRlKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgdG9IZXhTdHJpbmcoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyB0b0hleFN0cmluZygKLWJ5dGVbXSkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIHRvSGV4U3RyaW5nKAotYnl0ZVtdCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLk9iamVjdHMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+KFRUOylUVDsgKQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuT2JqZWN0IG5vbk51bGwoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz4oVFQ7TGphdmEvbGFuZy9TdHJpbmc7KVRUOyApCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5PYmplY3Qgbm9uTnVsbCgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS9sYW5nL09iamVjdDsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLlByZWRpY2F0ZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUVDspWiApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBhcHBseSgKLWphdmEubGFuZy5PYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID00MTA0IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3V0aWwvUHJlZGljYXRlczsgKQotIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuUHJlZGljYXRlcyQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1BbmRQcmVkaWNhdGUgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3V0aWwvUHJlZGljYXRlczsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS9sYW5nL09iamVjdDtMY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9QcmVkaWNhdGU8VFQ7PjsgKQotIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuUHJlZGljYXRlcyRBbmRQcmVkaWNhdGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5QcmVkaWNhdGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL0l0ZXJhYmxlPCtMY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9QcmVkaWNhdGU8LVRUOz47PjsgKQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuSXRlcmFibGUgY29tcG9uZW50cwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvSXRlcmFibGU8K0xjb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL1ByZWRpY2F0ZTwtVFQ7Pjs+OylWICkKLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuSXRlcmFibGUpCi0KLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5JdGVyYWJsZQotY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5QcmVkaWNhdGVzJDEpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRUOylaICkKLXB1YmxpYyBib29sZWFuIGFwcGx5KAotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9QcmVkaWNhdGVzOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFQ6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL2xhbmcvT2JqZWN0O0xjb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL1ByZWRpY2F0ZTxUVDs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPU5vdFByZWRpY2F0ZSApCi0gY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5QcmVkaWNhdGVzJE5vdFByZWRpY2F0ZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLlByZWRpY2F0ZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL1ByZWRpY2F0ZTwtVFQ7PjsgKQotcHJpdmF0ZSBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLlByZWRpY2F0ZSBwcmVkaWNhdGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9QcmVkaWNhdGU8LVRUOz47KVYgKQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuUHJlZGljYXRlKQotCi0gdm9pZCA8aW5pdD4oCi1jb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLlByZWRpY2F0ZQotY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5QcmVkaWNhdGVzJDEpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRUOylaICkKLXB1YmxpYyBib29sZWFuIGFwcGx5KAotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9QcmVkaWNhdGVzOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPU9yUHJlZGljYXRlICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvbGFuZy9PYmplY3Q7TGNvbS9hbmRyb2lkL2ludGVybmFsL3V0aWwvUHJlZGljYXRlPFRUOz47ICkKLSBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLlByZWRpY2F0ZXMkT3JQcmVkaWNhdGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5QcmVkaWNhdGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL0l0ZXJhYmxlPCtMY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9QcmVkaWNhdGU8LVRUOz47PjsgKQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuSXRlcmFibGUgY29tcG9uZW50cwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvSXRlcmFibGU8K0xjb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL1ByZWRpY2F0ZTwtVFQ7Pjs+OylWICkKLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuSXRlcmFibGUpCi0KLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5JdGVyYWJsZQotY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5QcmVkaWNhdGVzJDEpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRUOylaICkKLXB1YmxpYyBib29sZWFuIGFwcGx5KAotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL1ByZWRpY2F0ZXMkMTtMY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9QcmVkaWNhdGVzJE5vdFByZWRpY2F0ZTtMY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9QcmVkaWNhdGVzJE9yUHJlZGljYXRlO0xjb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL1ByZWRpY2F0ZXMkQW5kUHJlZGljYXRlOyApCi1wdWJsaWMgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5QcmVkaWNhdGVzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz4oTGphdmEvbGFuZy9JdGVyYWJsZTwrTGNvbS9hbmRyb2lkL2ludGVybmFsL3V0aWwvUHJlZGljYXRlPC1UVDs+Oz47KUxjb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL1ByZWRpY2F0ZTxUVDs+OyApCi1wdWJsaWMgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuUHJlZGljYXRlIGFuZCgKLWphdmEubGFuZy5JdGVyYWJsZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+KFtMY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9QcmVkaWNhdGU8LVRUOz47KUxjb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL1ByZWRpY2F0ZTxUVDs+OyApCi1wdWJsaWMgc3RhdGljIHRyYW5zaWVudCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLlByZWRpY2F0ZSBhbmQoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLlByZWRpY2F0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz4oTGNvbS9hbmRyb2lkL2ludGVybmFsL3V0aWwvUHJlZGljYXRlPC1UVDs+OylMY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9QcmVkaWNhdGU8VFQ7PjsgKQotcHVibGljIHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLlByZWRpY2F0ZSBub3QoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLlByZWRpY2F0ZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+KExqYXZhL2xhbmcvSXRlcmFibGU8K0xjb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL1ByZWRpY2F0ZTwtVFQ7Pjs+OylMY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9QcmVkaWNhdGU8VFQ7PjsgKQotcHVibGljIHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLlByZWRpY2F0ZSBvcigKLWphdmEubGFuZy5JdGVyYWJsZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+KFtMY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9QcmVkaWNhdGU8LVRUOz47KUxjb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL1ByZWRpY2F0ZTxUVDs+OyApCi1wdWJsaWMgc3RhdGljIHRyYW5zaWVudCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLlByZWRpY2F0ZSBvcigKLWNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuUHJlZGljYXRlW10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi0gY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5XaXRoRnJhbWV3b3JrIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9FeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKAotamF2YS5sYW5nLlN0cmluZ1tdKQotCi1wcml2YXRlIHN0YXRpYyB2b2lkIHByaW50VXNhZ2UoKQotCi1zdGF0aWMgbmF0aXZlIGludCByZWdpc3Rlck5hdGl2ZXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuWG1sVXRpbHMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIGJlZ2luRG9jdW1lbnQoCi1vcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gY29udmVydFZhbHVlVG9Cb29sZWFuKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotYm9vbGVhbikKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY29udmVydFZhbHVlVG9JbnQoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNvbnZlcnRWYWx1ZVRvTGlzdCgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWphdmEubGFuZy5TdHJpbmdbXQotaW50KQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb252ZXJ0VmFsdWVUb1Vuc2lnbmVkSW50KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgbmV4dEVsZW1lbnQoCi1vcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwYXJzZVVuc2lnbmVkSW50QXR0cmlidXRlKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuQXJyYXlMaXN0IHJlYWRMaXN0WG1sKAotamF2YS5pby5JbnB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuSGFzaE1hcCByZWFkTWFwWG1sKAotamF2YS5pby5JbnB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSByZWFkVGhpc0ludEFycmF5WG1sKAotb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcgotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZ1tdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudXRpbC5BcnJheUxpc3QgcmVhZFRoaXNMaXN0WG1sKAotb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcgotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZ1tdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudXRpbC5IYXNoTWFwIHJlYWRUaGlzTWFwWG1sKAotb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcgotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZ1tdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuT2JqZWN0IHJlYWRUaGlzVmFsdWVYbWwoCi1vcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyCi1qYXZhLmxhbmcuU3RyaW5nW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLk9iamVjdCByZWFkVmFsdWVYbWwoCi1vcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyCi1qYXZhLmxhbmcuU3RyaW5nW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgdm9pZCBza2lwQ3VycmVudFRhZygKLW9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCB3cml0ZUJ5dGVBcnJheVhtbCgKLWJ5dGVbXQotamF2YS5sYW5nLlN0cmluZwotb3JnLnhtbHB1bGwudjEuWG1sU2VyaWFsaXplcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHdyaXRlSW50QXJyYXlYbWwoCi1pbnRbXQotamF2YS5sYW5nLlN0cmluZwotb3JnLnhtbHB1bGwudjEuWG1sU2VyaWFsaXplcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHdyaXRlTGlzdFhtbCgKLWphdmEudXRpbC5MaXN0Ci1qYXZhLmlvLk91dHB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHdyaXRlTGlzdFhtbCgKLWphdmEudXRpbC5MaXN0Ci1qYXZhLmxhbmcuU3RyaW5nCi1vcmcueG1scHVsbC52MS5YbWxTZXJpYWxpemVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgd3JpdGVNYXBYbWwoCi1qYXZhLnV0aWwuTWFwCi1qYXZhLmlvLk91dHB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHdyaXRlTWFwWG1sKAotamF2YS51dGlsLk1hcAotamF2YS5sYW5nLlN0cmluZwotb3JnLnhtbHB1bGwudjEuWG1sU2VyaWFsaXplcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHdyaXRlVmFsdWVYbWwoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuU3RyaW5nCi1vcmcueG1scHVsbC52MS5YbWxTZXJpYWxpemVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51QnVpbGRlciRNZW51QWRhcHRlcjtMY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L01lbnVCdWlsZGVyJEl0ZW1JbnZva2VyO0xjb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvTWVudUJ1aWxkZXIkQ2FsbGJhY2s7TGNvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51QnVpbGRlciRNZW51VHlwZTsgKQotcHVibGljIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51QnVpbGRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnZpZXcuTWVudQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgaW50W10gSVRFTV9MQVlPVVRfUkVTX0ZPUl9UWVBFCi0KLXN0YXRpYyBmaW5hbCBpbnRbXSBMQVlPVVRfUkVTX0ZPUl9UWVBFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTE9HVEFHCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5VTV9UWVBFUwotCi1zdGF0aWMgZmluYWwgaW50W10gVEhFTUVfUkVTX0ZPUl9UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfRElBTE9HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfRVhQQU5ERUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9JQ09OCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVklFV1NfVEFHCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIHNDYXRlZ29yeVRvT3JkZXIKLQotcHJpdmF0ZSBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUJ1aWxkZXIkQ2FsbGJhY2sgbUNhbGxiYWNrCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgbUNvbnRleHQKLQotcHJpdmF0ZSBhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnUkQ29udGV4dE1lbnVJbmZvIG1DdXJyZW50TWVudUluZm8KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MYW5kcm9pZC91dGlsL1NwYXJzZUFycmF5PExhbmRyb2lkL29zL1BhcmNlbGFibGU7PjsgKQotcHJpdmF0ZSBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXkgbUZyb3plblZpZXdTdGF0ZXMKLQotIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgbUhlYWRlckljb24KLQotIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgbUhlYWRlclRpdGxlCi0KLSBhbmRyb2lkLnZpZXcuVmlldyBtSGVhZGVyVmlldwotCi1wcml2YXRlIGJvb2xlYW4gbUlzVmlzaWJsZUl0ZW1zU3RhbGUKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0FycmF5TGlzdDxMY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L01lbnVJdGVtSW1wbDs+OyApCi1wcml2YXRlIGphdmEudXRpbC5BcnJheUxpc3QgbUl0ZW1zCi0KLXByaXZhdGUgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVCdWlsZGVyJE1lbnVUeXBlW10gbU1lbnVUeXBlcwotCi1wcml2YXRlIGJvb2xlYW4gbU9wdGlvbmFsSWNvbnNWaXNpYmxlCi0KLXByaXZhdGUgYm9vbGVhbiBtUHJldmVudERpc3BhdGNoaW5nSXRlbXNDaGFuZ2VkCi0KLXByaXZhdGUgYm9vbGVhbiBtUXdlcnR5TW9kZQotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzIG1SZXNvdXJjZXMKLQotcHJpdmF0ZSBib29sZWFuIG1TaG9ydGN1dHNWaXNpYmxlCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9BcnJheUxpc3Q8TGNvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51SXRlbUltcGw7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuQXJyYXlMaXN0IG1WaXNpYmxlSXRlbXMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1zdGF0aWMgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgYWNjZXNzJDAwMCgKLWNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51QnVpbGRlcikKLQotc3RhdGljIGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheSBhY2Nlc3MkMTAwKAotY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVCdWlsZGVyKQotCi1zdGF0aWMgaW50IGFjY2VzcyQzMDAoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUJ1aWxkZXIpCi0KLXByaXZhdGUgYW5kcm9pZC52aWV3Lk1lbnVJdGVtIGFkZEludGVybmFsKAotaW50Ci1pbnQKLWludAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9BcnJheUxpc3Q8TGNvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51SXRlbUltcGw7PjtJKUkgKQotcHJpdmF0ZSBzdGF0aWMgaW50IGZpbmRJbnNlcnRJbmRleCgKLWphdmEudXRpbC5BcnJheUxpc3QKLWludCkKLQotcHJpdmF0ZSBpbnQgZ2V0TnVtSWNvbk1lbnVJdGVtc1Nob3duKCkKLQotcHJpdmF0ZSBzdGF0aWMgaW50IGdldE9yZGVyaW5nKAotaW50KQotCi1wcml2YXRlIHZvaWQgb25JdGVtc0NoYW5nZWQoCi1ib29sZWFuKQotCi1wcml2YXRlIHZvaWQgcmVmcmVzaFNob3J0Y3V0cygKLWJvb2xlYW4KLWJvb2xlYW4pCi0KLXByaXZhdGUgdm9pZCByZW1vdmVJdGVtQXRJbnQoCi1pbnQKLWJvb2xlYW4pCi0KLXByaXZhdGUgdm9pZCBzZXRIZWFkZXJJbnRlcm5hbCgKLWludAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotaW50Ci1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlCi1hbmRyb2lkLnZpZXcuVmlldykKLQotcHVibGljIGFuZHJvaWQudmlldy5NZW51SXRlbSBhZGQoCi1pbnQpCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuTWVudUl0ZW0gYWRkKAotaW50Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgYW5kcm9pZC52aWV3Lk1lbnVJdGVtIGFkZCgKLWludAotaW50Ci1pbnQKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuTWVudUl0ZW0gYWRkKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotcHVibGljIGludCBhZGRJbnRlbnRPcHRpb25zKAotaW50Ci1pbnQKLWludAotYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUKLWFuZHJvaWQuY29udGVudC5JbnRlbnRbXQotYW5kcm9pZC5jb250ZW50LkludGVudAotaW50Ci1hbmRyb2lkLnZpZXcuTWVudUl0ZW1bXSkKLQotcHVibGljIGFuZHJvaWQudmlldy5TdWJNZW51IGFkZFN1Yk1lbnUoCi1pbnQpCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuU3ViTWVudSBhZGRTdWJNZW51KAotaW50Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgYW5kcm9pZC52aWV3LlN1Yk1lbnUgYWRkU3ViTWVudSgKLWludAotaW50Ci1pbnQKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuU3ViTWVudSBhZGRTdWJNZW51KAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotcHVibGljIHZvaWQgY2xlYXIoKQotCi1wdWJsaWMgdm9pZCBjbGVhckFsbCgpCi0KLXB1YmxpYyB2b2lkIGNsZWFySGVhZGVyKCkKLQotcHVibGljIHZvaWQgY2xlYXJNZW51Vmlld3MoKQotCi1wdWJsaWMgZmluYWwgdm9pZCBjbG9zZSgKLWJvb2xlYW4pCi0KLXB1YmxpYyBpbnQgZmluZEdyb3VwSW5kZXgoCi1pbnQpCi0KLXB1YmxpYyBpbnQgZmluZEdyb3VwSW5kZXgoCi1pbnQKLWludCkKLQotcHVibGljIGFuZHJvaWQudmlldy5NZW51SXRlbSBmaW5kSXRlbSgKLWludCkKLQotcHVibGljIGludCBmaW5kSXRlbUluZGV4KAotaW50KQotCi0gY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVJdGVtSW1wbCBmaW5kSXRlbVdpdGhTaG9ydGN1dEZvcktleSgKLWludAotYW5kcm9pZC52aWV3LktleUV2ZW50KQotCi1wdWJsaWMgYW5kcm9pZC52aWV3Lk1lbnVJdGVtIGdldCgKLWludCkKLQotcHVibGljIGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51QnVpbGRlciRDYWxsYmFjayBnZXRDYWxsYmFjaygpCi0KLXB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBnZXRDb250ZXh0KCkKLQotcHVibGljIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgZ2V0SGVhZGVySWNvbigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIGdldEhlYWRlclRpdGxlKCkKLQotcHVibGljIGFuZHJvaWQudmlldy5WaWV3IGdldEhlYWRlclZpZXcoKQotCi1wdWJsaWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVCdWlsZGVyJE1lbnVBZGFwdGVyIGdldE1lbnVBZGFwdGVyKAotaW50KQotCi0gY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVCdWlsZGVyJE1lbnVUeXBlIGdldE1lbnVUeXBlKAotaW50KQotCi1wdWJsaWMgYW5kcm9pZC52aWV3LlZpZXcgZ2V0TWVudVZpZXcoCi1pbnQKLWFuZHJvaWQudmlldy5WaWV3R3JvdXApCi0KLSBib29sZWFuIGdldE9wdGlvbmFsSWNvbnNWaXNpYmxlKCkKLQotIGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzIGdldFJlc291cmNlcygpCi0KLXB1YmxpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUJ1aWxkZXIgZ2V0Um9vdE1lbnUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9BcnJheUxpc3Q8TGNvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51SXRlbUltcGw7PjsgKQotIGphdmEudXRpbC5BcnJheUxpc3QgZ2V0VmlzaWJsZUl0ZW1zKCkKLQotcHVibGljIGJvb2xlYW4gaGFzVmlzaWJsZUl0ZW1zKCkKLQotIGJvb2xlYW4gaXNRd2VydHlNb2RlKCkKLQotcHVibGljIGJvb2xlYW4gaXNTaG9ydGN1dEtleSgKLWludAotYW5kcm9pZC52aWV3LktleUV2ZW50KQotCi1wdWJsaWMgYm9vbGVhbiBpc1Nob3J0Y3V0c1Zpc2libGUoKQotCi0gdm9pZCBvbkl0ZW1WaXNpYmxlQ2hhbmdlZCgKLWNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51SXRlbUltcGwpCi0KLXB1YmxpYyBib29sZWFuIHBlcmZvcm1JZGVudGlmaWVyQWN0aW9uKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBib29sZWFuIHBlcmZvcm1JdGVtQWN0aW9uKAotYW5kcm9pZC52aWV3Lk1lbnVJdGVtCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIHBlcmZvcm1TaG9ydGN1dCgKLWludAotYW5kcm9pZC52aWV3LktleUV2ZW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIHJlbW92ZUdyb3VwKAotaW50KQotCi1wdWJsaWMgdm9pZCByZW1vdmVJdGVtKAotaW50KQotCi1wdWJsaWMgdm9pZCByZW1vdmVJdGVtQXQoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHJlc3RvcmVIaWVyYXJjaHlTdGF0ZSgKLWFuZHJvaWQub3MuQnVuZGxlKQotCi1wdWJsaWMgdm9pZCBzYXZlSGllcmFyY2h5U3RhdGUoCi1hbmRyb2lkLm9zLkJ1bmRsZSkKLQotcHVibGljIHZvaWQgc2V0Q2FsbGJhY2soCi1jb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUJ1aWxkZXIkQ2FsbGJhY2spCi0KLXB1YmxpYyB2b2lkIHNldEN1cnJlbnRNZW51SW5mbygKLWFuZHJvaWQudmlldy5Db250ZXh0TWVudSRDb250ZXh0TWVudUluZm8pCi0KLSB2b2lkIHNldEV4Y2x1c2l2ZUl0ZW1DaGVja2VkKAotYW5kcm9pZC52aWV3Lk1lbnVJdGVtKQotCi1wdWJsaWMgdm9pZCBzZXRHcm91cENoZWNrYWJsZSgKLWludAotYm9vbGVhbgotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0R3JvdXBFbmFibGVkKAotaW50Ci1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRHcm91cFZpc2libGUoCi1pbnQKLWJvb2xlYW4pCi0KLXByb3RlY3RlZCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUJ1aWxkZXIgc2V0SGVhZGVySWNvbkludCgKLWludCkKLQotcHJvdGVjdGVkIGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51QnVpbGRlciBzZXRIZWFkZXJJY29uSW50KAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSkKLQotcHJvdGVjdGVkIGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51QnVpbGRlciBzZXRIZWFkZXJUaXRsZUludCgKLWludCkKLQotcHJvdGVjdGVkIGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51QnVpbGRlciBzZXRIZWFkZXJUaXRsZUludCgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi0KLXByb3RlY3RlZCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUJ1aWxkZXIgc2V0SGVhZGVyVmlld0ludCgKLWFuZHJvaWQudmlldy5WaWV3KQotCi0gdm9pZCBzZXRPcHRpb25hbEljb25zVmlzaWJsZSgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldFF3ZXJ0eU1vZGUoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRTaG9ydGN1dHNWaXNpYmxlKAotYm9vbGVhbikKLQotcHVibGljIGludCBzaXplKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuQ29udGV4dE1lbnVCdWlsZGVyIGV4dGVuZHMgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVCdWlsZGVyIGltcGxlbWVudHMgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQpCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnUgc2V0SGVhZGVySWNvbigKLWludCkKLQotcHVibGljIGFuZHJvaWQudmlldy5Db250ZXh0TWVudSBzZXRIZWFkZXJJY29uKAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSkKLQotcHVibGljIGFuZHJvaWQudmlldy5Db250ZXh0TWVudSBzZXRIZWFkZXJUaXRsZSgKLWludCkKLQotcHVibGljIGFuZHJvaWQudmlldy5Db250ZXh0TWVudSBzZXRIZWFkZXJUaXRsZSgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnUgc2V0SGVhZGVyVmlldygKLWFuZHJvaWQudmlldy5WaWV3KQotCi1wdWJsaWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVEaWFsb2dIZWxwZXIgc2hvdygKLWFuZHJvaWQudmlldy5WaWV3Ci1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPUl0ZW1JbnZva2VyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvTWVudUJ1aWxkZXI7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVCdWlsZGVyJEl0ZW1JbnZva2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGludm9rZUl0ZW0oCi1jb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUl0ZW1JbXBsKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51VmlldyRJdGVtVmlldzsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudVZpZXcgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IGludCBnZXRXaW5kb3dBbmltYXRpb25zKCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgaW5pdGlhbGl6ZSgKLWNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51QnVpbGRlcgotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB1cGRhdGVDaGlsZHJlbigKLWJvb2xlYW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51LkV4cGFuZGVkTWVudVZpZXcgZXh0ZW5kcyBhbmRyb2lkLndpZGdldC5MaXN0VmlldyBpbXBsZW1lbnRzIGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51QnVpbGRlciRJdGVtSW52b2tlciwgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVWaWV3LCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldyRPbkl0ZW1DbGlja0xpc3RlbmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgaW50IG1BbmltYXRpb25zCi0KLXByaXZhdGUgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVCdWlsZGVyIG1NZW51Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi0KLXB1YmxpYyBpbnQgZ2V0V2luZG93QW5pbWF0aW9ucygpCi0KLXB1YmxpYyB2b2lkIGluaXRpYWxpemUoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUJ1aWxkZXIKLWludCkKLQotcHVibGljIGJvb2xlYW4gaW52b2tlSXRlbSgKLWNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51SXRlbUltcGwpCi0KLXByb3RlY3RlZCB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkKLQotcHVibGljIHZvaWQgb25JdGVtQ2xpY2soCi1hbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldwotYW5kcm9pZC52aWV3LlZpZXcKLWludAotbG9uZykKLQotcHVibGljIHZvaWQgdXBkYXRlQ2hpbGRyZW4oCi1ib29sZWFuKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvTWVudVZpZXc7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1JdGVtVmlldyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51VmlldyRJdGVtVmlldyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVJdGVtSW1wbCBnZXRJdGVtRGF0YSgpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGluaXRpYWxpemUoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUl0ZW1JbXBsCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHByZWZlcnNDb25kZW5zZWRUaXRsZSgpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldENoZWNrYWJsZSgKLWJvb2xlYW4pCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldENoZWNrZWQoCi1ib29sZWFuKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRFbmFibGVkKAotYm9vbGVhbikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0SWNvbigKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFNob3J0Y3V0KAotYm9vbGVhbgotY2hhcikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0VGl0bGUoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzaG93c0ljb24oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5JY29uTWVudUl0ZW1WaWV3IGV4dGVuZHMgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXcgaW1wbGVtZW50cyBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudVZpZXckSXRlbVZpZXcKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PX0FMUEhBCi0KLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgc1ByZXBlbmRTaG9ydGN1dExhYmVsCi0KLXByaXZhdGUgZmxvYXQgbURpc2FibGVkQWxwaGEKLQotcHJpdmF0ZSBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIG1JY29uCi0KLXByaXZhdGUgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lkljb25NZW51VmlldyBtSWNvbk1lbnVWaWV3Ci0KLXByaXZhdGUgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVJdGVtSW1wbCBtSXRlbURhdGEKLQotcHJpdmF0ZSBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUJ1aWxkZXIkSXRlbUludm9rZXIgbUl0ZW1JbnZva2VyCi0KLXByaXZhdGUgYW5kcm9pZC5ncmFwaGljcy5SZWN0IG1Qb3NpdGlvbkljb25BdmFpbGFibGUKLQotcHJpdmF0ZSBhbmRyb2lkLmdyYXBoaWNzLlJlY3QgbVBvc2l0aW9uSWNvbk91dHB1dAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbVNob3J0Y3V0Q2FwdGlvbgotCi1wcml2YXRlIGJvb2xlYW4gbVNob3J0Y3V0Q2FwdGlvbk1vZGUKLQotcHJpdmF0ZSBpbnQgbVRleHRBcHBlYXJhbmNlCi0KLXByaXZhdGUgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgbVRleHRBcHBlYXJhbmNlQ29udGV4dAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldAotaW50KQotCi1wcml2YXRlIHZvaWQgcG9zaXRpb25JY29uKCkKLQotcHJvdGVjdGVkIHZvaWQgZHJhd2FibGVTdGF0ZUNoYW5nZWQoKQotQGFuZHJvaWQudmlldy5WaWV3RGVidWckQ2FwdHVyZWRWaWV3UHJvcGVydHkgKHJldHJpZXZlUmV0dXJuID10cnVlICkKLXB1YmxpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUl0ZW1JbXBsIGdldEl0ZW1EYXRhKCkKLQotcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgKLWNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51SXRlbUltcGwKLWludCkKLQotIHZvaWQgaW5pdGlhbGl6ZSgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUpCi0KLXByb3RlY3RlZCB2b2lkIG9uTGF5b3V0KAotYm9vbGVhbgotaW50Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBwZXJmb3JtQ2xpY2soKQotCi1wdWJsaWMgYm9vbGVhbiBwcmVmZXJzQ29uZGVuc2VkVGl0bGUoKQotCi0gdm9pZCBzZXRDYXB0aW9uTW9kZSgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldENoZWNrYWJsZSgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldENoZWNrZWQoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRJY29uKAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSkKLQotIHZvaWQgc2V0SWNvbk1lbnVWaWV3KAotY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lkljb25NZW51VmlldykKLQotcHVibGljIHZvaWQgc2V0SXRlbUludm9rZXIoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUJ1aWxkZXIkSXRlbUludm9rZXIpCi0KLXB1YmxpYyB2b2lkIHNldFNob3J0Y3V0KAotYm9vbGVhbgotY2hhcikKLQotcHVibGljIHZvaWQgc2V0VGl0bGUoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotCi1wdWJsaWMgdm9pZCBzZXRWaXNpYmlsaXR5KAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBzaG93c0ljb24oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLSBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuSWNvbk1lbnVWaWV3JDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC52aWV3LlZpZXckT25DbGlja0xpc3RlbmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5JY29uTWVudVZpZXcgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lkljb25NZW51VmlldykKLQotcHVibGljIHZvaWQgb25DbGljaygKLWFuZHJvaWQudmlldy5WaWV3KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1MYXlvdXRQYXJhbXMgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9JY29uTWVudVZpZXc7ICkKLXB1YmxpYyBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuSWNvbk1lbnVWaWV3JExheW91dFBhcmFtcyBleHRlbmRzIGFuZHJvaWQudmlldy5WaWV3R3JvdXAkTWFyZ2luTGF5b3V0UGFyYW1zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBpbnQgYm90dG9tCi0KLSBpbnQgbGVmdAotCi0gaW50IHJpZ2h0Ci0KLSBpbnQgdG9wCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvSWNvbk1lbnVWaWV3JFNhdmVkU3RhdGU7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I8TGNvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9JY29uTWVudVZpZXckU2F2ZWRTdGF0ZTs+OyApCi1maW5hbCBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuSWNvbk1lbnVWaWV3JFNhdmVkU3RhdGUkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuSWNvbk1lbnVWaWV3JFNhdmVkU3RhdGUgY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuSWNvbk1lbnVWaWV3JFNhdmVkU3RhdGVbXSBuZXdBcnJheSgKLWludCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3RbXSBuZXdBcnJheSgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPVNhdmVkU3RhdGUgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9JY29uTWVudVZpZXc7ICkKLSBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuSWNvbk1lbnVWaWV3JFNhdmVkU3RhdGUgZXh0ZW5kcyBhbmRyb2lkLnZpZXcuVmlldyRCYXNlU2F2ZWRTdGF0ZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0ljb25NZW51VmlldyRTYXZlZFN0YXRlOz47ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IgQ1JFQVRPUgotCi0gaW50IGZvY3VzZWRQb3NpdGlvbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuUGFyY2VsKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLlBhcmNlbAotY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lkljb25NZW51VmlldyQxKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLlBhcmNlbGFibGUKLWludCkKLQotcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0ljb25NZW51VmlldyRMYXlvdXRQYXJhbXM7TGNvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9JY29uTWVudVZpZXckU2F2ZWRTdGF0ZTsgKQotcHVibGljIGZpbmFsIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5JY29uTWVudVZpZXcgZXh0ZW5kcyBhbmRyb2lkLnZpZXcuVmlld0dyb3VwIGltcGxlbWVudHMgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVCdWlsZGVyJEl0ZW1JbnZva2VyLCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudVZpZXcsIGphdmEubGFuZy5SdW5uYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSVRFTV9DQVBUSU9OX0NZQ0xFX0RFTEFZCi0KLXByaXZhdGUgaW50IG1BbmltYXRpb25zCi0KLXByaXZhdGUgYm9vbGVhbiBtSGFzU3RhbGVDaGlsZHJlbgotCi1wcml2YXRlIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgbUhvcml6b250YWxEaXZpZGVyCi0KLXByaXZhdGUgaW50IG1Ib3Jpem9udGFsRGl2aWRlckhlaWdodAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQXJyYXlMaXN0PExhbmRyb2lkL2dyYXBoaWNzL1JlY3Q7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuQXJyYXlMaXN0IG1Ib3Jpem9udGFsRGl2aWRlclJlY3RzCi0KLXByaXZhdGUgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSBtSXRlbUJhY2tncm91bmQKLQotcHJpdmF0ZSBib29sZWFuIG1MYXN0Q2hpbGRyZW5DYXB0aW9uTW9kZQotCi1wcml2YXRlIGludCBtTWF4SXRlbXNQZXJSb3cKLQotcHJpdmF0ZSBpbnQgbU1heFJvd3MKLQotcHJpdmF0ZSBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUJ1aWxkZXIgbU1lbnUKLQotcHJpdmF0ZSBib29sZWFuIG1NZW51QmVpbmdMb25ncHJlc3NlZAotCi1wcml2YXRlIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgbU1vcmVJY29uCi0KLXByaXZhdGUgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lkljb25NZW51SXRlbVZpZXcgbU1vcmVJdGVtVmlldwotCi1wcml2YXRlIGludCBtTnVtQWN0dWFsSXRlbXNTaG93bgotCi1wcml2YXRlIGludCBtUm93SGVpZ2h0Ci0KLXByaXZhdGUgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSBtVmVydGljYWxEaXZpZGVyCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9BcnJheUxpc3Q8TGFuZHJvaWQvZ3JhcGhpY3MvUmVjdDs+OyApCi1wcml2YXRlIGphdmEudXRpbC5BcnJheUxpc3QgbVZlcnRpY2FsRGl2aWRlclJlY3RzCi0KLXByaXZhdGUgaW50IG1WZXJ0aWNhbERpdmlkZXJXaWR0aAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0KQotCi1zdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVCdWlsZGVyIGFjY2VzcyQwMDAoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuSWNvbk1lbnVWaWV3KQotCi1wcml2YXRlIHZvaWQgYWRkSXRlbVZpZXcoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuSWNvbk1lbnVJdGVtVmlldykKLQotcHJpdmF0ZSBpbnRbXSBjYWxjdWxhdGVOdW1iZXJPZkl0ZW1zUGVyUm93KAotaW50Ci1pbnQpCi0KLXByaXZhdGUgaW50IGNhbGN1bGF0ZU51bWJlck9mUm93cygpCi0KLXByaXZhdGUgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lkljb25NZW51SXRlbVZpZXcgY3JlYXRlTW9yZUl0ZW1WaWV3KCkKLQotcHJpdmF0ZSB2b2lkIHBvc2l0aW9uQ2hpbGRyZW4oCi1pbnQKLWludCkKLQotcHJpdmF0ZSB2b2lkIHNldENoaWxkcmVuQ2FwdGlvbk1vZGUoCi1ib29sZWFuKQotCi1wcml2YXRlIHZvaWQgc2V0Q3ljbGVTaG9ydGN1dENhcHRpb25Nb2RlKAotYm9vbGVhbikKLQotcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tMYXlvdXRQYXJhbXMoCi1hbmRyb2lkLnZpZXcuVmlld0dyb3VwJExheW91dFBhcmFtcykKLQotcHVibGljIGJvb2xlYW4gZGlzcGF0Y2hLZXlFdmVudCgKLWFuZHJvaWQudmlldy5LZXlFdmVudCkKLQotcHVibGljIHZvbGF0aWxlIGFuZHJvaWQudmlldy5WaWV3R3JvdXAkTGF5b3V0UGFyYW1zIGdlbmVyYXRlTGF5b3V0UGFyYW1zKAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHVibGljIGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5JY29uTWVudVZpZXckTGF5b3V0UGFyYW1zIGdlbmVyYXRlTGF5b3V0UGFyYW1zKAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotIGludCBnZXROdW1BY3R1YWxJdGVtc1Nob3duKCkKLQotcHVibGljIGludCBnZXRXaW5kb3dBbmltYXRpb25zKCkKLQotcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgKLWNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51QnVpbGRlcgotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBpbnZva2VJdGVtKAotY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVJdGVtSW1wbCkKLQotIHZvaWQgbWFya1N0YWxlQ2hpbGRyZW4oKQotCi1wcm90ZWN0ZWQgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpCi0KLXByb3RlY3RlZCB2b2lkIG9uRHJhdygKLWFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzKQotCi1wcm90ZWN0ZWQgdm9pZCBvbkxheW91dCgKLWJvb2xlYW4KLWludAotaW50Ci1pbnQKLWludCkKLQotcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKAotaW50Ci1pbnQpCi0KLXByb3RlY3RlZCB2b2lkIG9uUmVzdG9yZUluc3RhbmNlU3RhdGUoCi1hbmRyb2lkLm9zLlBhcmNlbGFibGUpCi0KLXByb3RlY3RlZCBhbmRyb2lkLm9zLlBhcmNlbGFibGUgb25TYXZlSW5zdGFuY2VTdGF0ZSgpCi0KLXB1YmxpYyB2b2lkIG9uV2luZG93Rm9jdXNDaGFuZ2VkKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgcnVuKCkKLQotcHVibGljIHZvaWQgdXBkYXRlQ2hpbGRyZW4oCi1ib29sZWFuKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5MaXN0TWVudUl0ZW1WaWV3IGV4dGVuZHMgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0IGltcGxlbWVudHMgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVWaWV3JEl0ZW1WaWV3Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSBtQmFja2dyb3VuZAotCi1wcml2YXRlIGFuZHJvaWQud2lkZ2V0LkNoZWNrQm94IG1DaGVja0JveAotCi1wcml2YXRlIGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldyBtSWNvblZpZXcKLQotcHJpdmF0ZSBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUl0ZW1JbXBsIG1JdGVtRGF0YQotCi1wcml2YXRlIGludCBtTWVudVR5cGUKLQotcHJpdmF0ZSBhbmRyb2lkLndpZGdldC5SYWRpb0J1dHRvbiBtUmFkaW9CdXR0b24KLQotcHJpdmF0ZSBhbmRyb2lkLndpZGdldC5UZXh0VmlldyBtU2hvcnRjdXRWaWV3Ci0KLXByaXZhdGUgaW50IG1UZXh0QXBwZWFyYW5jZQotCi1wcml2YXRlIGFuZHJvaWQuY29udGVudC5Db250ZXh0IG1UZXh0QXBwZWFyYW5jZUNvbnRleHQKLQotcHJpdmF0ZSBhbmRyb2lkLndpZGdldC5UZXh0VmlldyBtVGl0bGVWaWV3Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ci1pbnQpCi0KLXByaXZhdGUgdm9pZCBpbnNlcnRDaGVja0JveCgpCi0KLXByaXZhdGUgdm9pZCBpbnNlcnRJY29uVmlldygpCi0KLXByaXZhdGUgdm9pZCBpbnNlcnRSYWRpb0J1dHRvbigpCi0KLXB1YmxpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUl0ZW1JbXBsIGdldEl0ZW1EYXRhKCkKLQotcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgKLWNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51SXRlbUltcGwKLWludCkKLQotcHJvdGVjdGVkIHZvaWQgb25GaW5pc2hJbmZsYXRlKCkKLQotcHVibGljIGJvb2xlYW4gcHJlZmVyc0NvbmRlbnNlZFRpdGxlKCkKLQotcHVibGljIHZvaWQgc2V0Q2hlY2thYmxlKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0Q2hlY2tlZCgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldEljb24oCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlKQotCi1wdWJsaWMgdm9pZCBzZXRTaG9ydGN1dCgKLWJvb2xlYW4KLWNoYXIpCi0KLXB1YmxpYyB2b2lkIHNldFRpdGxlKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotcHVibGljIGJvb2xlYW4gc2hvd3NJY29uKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9Q2FsbGJhY2sgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51QnVpbGRlcjsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUJ1aWxkZXIkQ2FsbGJhY2sgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgb25DbG9zZU1lbnUoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUJ1aWxkZXIKLWJvb2xlYW4pCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uQ2xvc2VTdWJNZW51KAotY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51LlN1Yk1lbnVCdWlsZGVyKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBvbk1lbnVJdGVtU2VsZWN0ZWQoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUJ1aWxkZXIKLWFuZHJvaWQudmlldy5NZW51SXRlbSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgb25NZW51TW9kZUNoYW5nZSgKLWNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51QnVpbGRlcikKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gb25TdWJNZW51U2VsZWN0ZWQoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuU3ViTWVudUJ1aWxkZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xIG5hbWUgPU1lbnVBZGFwdGVyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvTWVudUJ1aWxkZXI7ICkKLXB1YmxpYyBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUJ1aWxkZXIkTWVudUFkYXB0ZXIgZXh0ZW5kcyBhbmRyb2lkLndpZGdldC5CYXNlQWRhcHRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGludCBtTWVudVR5cGUKLQotZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVCdWlsZGVyIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51QnVpbGRlcgotaW50KQotCi1wdWJsaWMgaW50IGdldENvdW50KCkKLQotcHVibGljIGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51SXRlbUltcGwgZ2V0SXRlbSgKLWludCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgZ2V0SXRlbSgKLWludCkKLQotcHVibGljIGxvbmcgZ2V0SXRlbUlkKAotaW50KQotCi1wdWJsaWMgaW50IGdldE9mZnNldCgpCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuVmlldyBnZXRWaWV3KAotaW50Ci1hbmRyb2lkLnZpZXcuVmlldwotYW5kcm9pZC52aWV3LlZpZXdHcm91cCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L01lbnVCdWlsZGVyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9TWVudVR5cGUgKQotIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51QnVpbGRlciRNZW51VHlwZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXIgbUluZmxhdGVyCi0KLXByaXZhdGUgaW50IG1NZW51VHlwZQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvcmVmL1dlYWtSZWZlcmVuY2U8TGNvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51Vmlldzs+OyApCi1wcml2YXRlIGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZSBtTWVudVZpZXcKLQotZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVCdWlsZGVyIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51QnVpbGRlcgotaW50KQotCi1zdGF0aWMgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlIGFjY2VzcyQyMDAoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUJ1aWxkZXIkTWVudVR5cGUpCi0KLXN0YXRpYyBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2UgYWNjZXNzJDIwMigKLWNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51QnVpbGRlciRNZW51VHlwZQotamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlKQotCi0gYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyIGdldEluZmxhdGVyKCkKLQotIGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51VmlldyBnZXRNZW51VmlldygKLWFuZHJvaWQudmlldy5WaWV3R3JvdXApCi0KLSBib29sZWFuIGhhc01lbnVWaWV3KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudURpYWxvZ0hlbHBlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlJE9uS2V5TGlzdGVuZXIsIGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UkT25DbGlja0xpc3RlbmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYW5kcm9pZC53aWRnZXQuTGlzdEFkYXB0ZXIgbUFkYXB0ZXIKLQotcHJpdmF0ZSBhbmRyb2lkLmFwcC5BbGVydERpYWxvZyBtRGlhbG9nCi0KLXByaXZhdGUgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVCdWlsZGVyIG1NZW51Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVCdWlsZGVyKQotCi1wdWJsaWMgdm9pZCBkaXNtaXNzKCkKLQotcHVibGljIHZvaWQgb25DbGljaygKLWFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UKLWludCkKLQotcHVibGljIGJvb2xlYW4gb25LZXkoCi1hbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlCi1pbnQKLWFuZHJvaWQudmlldy5LZXlFdmVudCkKLQotcHVibGljIHZvaWQgc2hvdygKLWFuZHJvaWQub3MuSUJpbmRlcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUl0ZW1JbXBsIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQudmlldy5NZW51SXRlbQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0hFQ0tBQkxFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDSEVDS0VECi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTkFCTEVECi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFWENMVVNJVkUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhJRERFTgotCi1zdGF0aWMgZmluYWwgaW50IE5PX0lDT04KLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBzRGVsZXRlU2hvcnRjdXRMYWJlbAotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIHNFbnRlclNob3J0Y3V0TGFiZWwKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBzUHJlcGVuZFNob3J0Y3V0TGFiZWwKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBzU3BhY2VTaG9ydGN1dExhYmVsCi0KLXByaXZhdGUgZmluYWwgaW50IG1DYXRlZ29yeU9yZGVyCi0KLXByaXZhdGUgYW5kcm9pZC52aWV3Lk1lbnVJdGVtJE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyIG1DbGlja0xpc3RlbmVyCi0KLXByaXZhdGUgaW50IG1GbGFncwotCi1wcml2YXRlIGZpbmFsIGludCBtR3JvdXAKLQotcHJpdmF0ZSBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIG1JY29uRHJhd2FibGUKLQotcHJpdmF0ZSBpbnQgbUljb25SZXNJZAotCi1wcml2YXRlIGZpbmFsIGludCBtSWQKLQotcHJpdmF0ZSBhbmRyb2lkLmNvbnRlbnQuSW50ZW50IG1JbnRlbnQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuUnVubmFibGUgbUl0ZW1DYWxsYmFjawotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPVtMamF2YS9sYW5nL3JlZi9XZWFrUmVmZXJlbmNlPExjb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvTWVudVZpZXckSXRlbVZpZXc7PjsgKQotcHJpdmF0ZSBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2VbXSBtSXRlbVZpZXdzCi0KLXByaXZhdGUgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVCdWlsZGVyIG1NZW51Ci0KLXByaXZhdGUgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51JENvbnRleHRNZW51SW5mbyBtTWVudUluZm8KLQotcHJpdmF0ZSBmaW5hbCBpbnQgbU9yZGVyaW5nCi0KLXByaXZhdGUgY2hhciBtU2hvcnRjdXRBbHBoYWJldGljQ2hhcgotCi1wcml2YXRlIGNoYXIgbVNob3J0Y3V0TnVtZXJpY0NoYXIKLQotcHJpdmF0ZSBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuU3ViTWVudUJ1aWxkZXIgbVN1Yk1lbnUKLQotcHJpdmF0ZSBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIG1UaXRsZQotCi1wcml2YXRlIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgbVRpdGxlQ29uZGVuc2VkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVCdWlsZGVyCi1pbnQKLWludAotaW50Ci1pbnQKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi0KLXByaXZhdGUgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVWaWV3JEl0ZW1WaWV3IGNyZWF0ZUl0ZW1WaWV3KAotaW50Ci1hbmRyb2lkLnZpZXcuVmlld0dyb3VwKQotCi1wcml2YXRlIGJvb2xlYW4gaGFzSXRlbVZpZXcoCi1pbnQpCi0KLXByaXZhdGUgYm9vbGVhbiBoYXZlQW55T3BlbmVkSWNvbkNhcGFibGVJdGVtVmlld3MoKQotCi1wcml2YXRlIHZvaWQgcmVmcmVzaFNob3J0Y3V0T25JdGVtVmlld3MoKQotCi1wcml2YXRlIHZvaWQgc2V0SWNvbk9uVmlld3MoCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlKQotCi0gdm9pZCBjbGVhckl0ZW1WaWV3cygpCi0KLXB1YmxpYyBjaGFyIGdldEFscGhhYmV0aWNTaG9ydGN1dCgpCi0KLSBqYXZhLmxhbmcuUnVubmFibGUgZ2V0Q2FsbGJhY2soKQotCi1wdWJsaWMgaW50IGdldEdyb3VwSWQoKQotCi1wdWJsaWMgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSBnZXRJY29uKCkKLQotcHVibGljIGFuZHJvaWQuY29udGVudC5JbnRlbnQgZ2V0SW50ZW50KCkKLUBhbmRyb2lkLnZpZXcuVmlld0RlYnVnJENhcHR1cmVkVmlld1Byb3BlcnR5Ci1wdWJsaWMgaW50IGdldEl0ZW1JZCgpCi0KLSBhbmRyb2lkLnZpZXcuVmlldyBnZXRJdGVtVmlldygKLWludAotYW5kcm9pZC52aWV3LlZpZXdHcm91cCkKLQotcHVibGljIGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlciBnZXRMYXlvdXRJbmZsYXRlcigKLWludCkKLQotcHVibGljIGFuZHJvaWQudmlldy5Db250ZXh0TWVudSRDb250ZXh0TWVudUluZm8gZ2V0TWVudUluZm8oKQotCi1wdWJsaWMgY2hhciBnZXROdW1lcmljU2hvcnRjdXQoKQotCi1wdWJsaWMgaW50IGdldE9yZGVyKCkKLQotcHVibGljIGludCBnZXRPcmRlcmluZygpCi0KLSBjaGFyIGdldFNob3J0Y3V0KCkKLQotIGphdmEubGFuZy5TdHJpbmcgZ2V0U2hvcnRjdXRMYWJlbCgpCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuU3ViTWVudSBnZXRTdWJNZW51KCkKLUBhbmRyb2lkLnZpZXcuVmlld0RlYnVnJENhcHR1cmVkVmlld1Byb3BlcnR5Ci1wdWJsaWMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBnZXRUaXRsZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIGdldFRpdGxlQ29uZGVuc2VkKCkKLQotIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgZ2V0VGl0bGVGb3JJdGVtVmlldygKLWNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51VmlldyRJdGVtVmlldykKLQotcHVibGljIGJvb2xlYW4gaGFzU3ViTWVudSgpCi0KLXB1YmxpYyBib29sZWFuIGludm9rZSgpCi0KLXB1YmxpYyBib29sZWFuIGlzQ2hlY2thYmxlKCkKLQotcHVibGljIGJvb2xlYW4gaXNDaGVja2VkKCkKLQotcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkKLQotcHVibGljIGJvb2xlYW4gaXNFeGNsdXNpdmVDaGVja2FibGUoKQotCi1wdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKQotCi0gdm9pZCByZWZyZXNoU2hvcnRjdXRPbkl0ZW1WaWV3cygKLWJvb2xlYW4KLWJvb2xlYW4pCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuTWVudUl0ZW0gc2V0QWxwaGFiZXRpY1Nob3J0Y3V0KAotY2hhcikKLQotcHVibGljIGFuZHJvaWQudmlldy5NZW51SXRlbSBzZXRDYWxsYmFjaygKLWphdmEubGFuZy5SdW5uYWJsZSkKLQotcHVibGljIGFuZHJvaWQudmlldy5NZW51SXRlbSBzZXRDaGVja2FibGUoCi1ib29sZWFuKQotCi1wdWJsaWMgYW5kcm9pZC52aWV3Lk1lbnVJdGVtIHNldENoZWNrZWQoCi1ib29sZWFuKQotCi0gdm9pZCBzZXRDaGVja2VkSW50KAotYm9vbGVhbikKLQotcHVibGljIGFuZHJvaWQudmlldy5NZW51SXRlbSBzZXRFbmFibGVkKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0RXhjbHVzaXZlQ2hlY2thYmxlKAotYm9vbGVhbikKLQotcHVibGljIGFuZHJvaWQudmlldy5NZW51SXRlbSBzZXRJY29uKAotaW50KQotCi1wdWJsaWMgYW5kcm9pZC52aWV3Lk1lbnVJdGVtIHNldEljb24oCi1hbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlKQotCi1wdWJsaWMgYW5kcm9pZC52aWV3Lk1lbnVJdGVtIHNldEludGVudCgKLWFuZHJvaWQuY29udGVudC5JbnRlbnQpCi0KLSB2b2lkIHNldE1lbnVJbmZvKAotYW5kcm9pZC52aWV3LkNvbnRleHRNZW51JENvbnRleHRNZW51SW5mbykKLQotcHVibGljIGFuZHJvaWQudmlldy5NZW51SXRlbSBzZXROdW1lcmljU2hvcnRjdXQoCi1jaGFyKQotCi1wdWJsaWMgYW5kcm9pZC52aWV3Lk1lbnVJdGVtIHNldE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKAotYW5kcm9pZC52aWV3Lk1lbnVJdGVtJE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKQotCi1wdWJsaWMgYW5kcm9pZC52aWV3Lk1lbnVJdGVtIHNldFNob3J0Y3V0KAotY2hhcgotY2hhcikKLQotIHZvaWQgc2V0U3ViTWVudSgKLWNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5TdWJNZW51QnVpbGRlcikKLQotcHVibGljIGFuZHJvaWQudmlldy5NZW51SXRlbSBzZXRUaXRsZSgKLWludCkKLQotcHVibGljIGFuZHJvaWQudmlldy5NZW51SXRlbSBzZXRUaXRsZSgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuTWVudUl0ZW0gc2V0VGl0bGVDb25kZW5zZWQoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotCi1wdWJsaWMgYW5kcm9pZC52aWV3Lk1lbnVJdGVtIHNldFZpc2libGUoCi1ib29sZWFuKQotCi0gYm9vbGVhbiBzZXRWaXNpYmxlSW50KAotYm9vbGVhbikKLQotcHVibGljIGJvb2xlYW4gc2hvdWxkU2hvd0ljb24oCi1pbnQpCi0KLSBib29sZWFuIHNob3VsZFNob3dTaG9ydGN1dCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuU3ViTWVudUJ1aWxkZXIgZXh0ZW5kcyBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUJ1aWxkZXIgaW1wbGVtZW50cyBhbmRyb2lkLnZpZXcuU3ViTWVudQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51SXRlbUltcGwgbUl0ZW0KLQotcHJpdmF0ZSBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUJ1aWxkZXIgbVBhcmVudE1lbnUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVCdWlsZGVyCi1jb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUl0ZW1JbXBsKQotCi1wdWJsaWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVCdWlsZGVyJENhbGxiYWNrIGdldENhbGxiYWNrKCkKLQotcHVibGljIGFuZHJvaWQudmlldy5NZW51SXRlbSBnZXRJdGVtKCkKLQotcHVibGljIGFuZHJvaWQudmlldy5NZW51IGdldFBhcmVudE1lbnUoKQotCi1wdWJsaWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVCdWlsZGVyIGdldFJvb3RNZW51KCkKLQotcHVibGljIGJvb2xlYW4gaXNRd2VydHlNb2RlKCkKLQotcHVibGljIGJvb2xlYW4gaXNTaG9ydGN1dHNWaXNpYmxlKCkKLQotcHVibGljIHZvaWQgc2V0Q2FsbGJhY2soCi1jb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUJ1aWxkZXIkQ2FsbGJhY2spCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuU3ViTWVudSBzZXRIZWFkZXJJY29uKAotaW50KQotCi1wdWJsaWMgYW5kcm9pZC52aWV3LlN1Yk1lbnUgc2V0SGVhZGVySWNvbigKLWFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUpCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuU3ViTWVudSBzZXRIZWFkZXJUaXRsZSgKLWludCkKLQotcHVibGljIGFuZHJvaWQudmlldy5TdWJNZW51IHNldEhlYWRlclRpdGxlKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotcHVibGljIGFuZHJvaWQudmlldy5TdWJNZW51IHNldEhlYWRlclZpZXcoCi1hbmRyb2lkLnZpZXcuVmlldykKLQotcHVibGljIGFuZHJvaWQudmlldy5TdWJNZW51IHNldEljb24oCi1pbnQpCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuU3ViTWVudSBzZXRJY29uKAotYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSkKLQotcHVibGljIHZvaWQgc2V0UXdlcnR5TW9kZSgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldFNob3J0Y3V0c1Zpc2libGUoCi1ib29sZWFuKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5MaW5lYXJMYXlvdXRXaXRoRGVmYXVsdFRvdWNoUmVjZXBpZW50IGV4dGVuZHMgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYW5kcm9pZC52aWV3LlZpZXcgbURlZmF1bHRUb3VjaFJlY2VwaWVudAotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUmVjdCBtVGVtcFJlY3QKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi0KLXB1YmxpYyBib29sZWFuIGRpc3BhdGNoVG91Y2hFdmVudCgKLWFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCkKLQotcHVibGljIHZvaWQgc2V0RGVmYXVsdFRvdWNoUmVjZXBpZW50KAotYW5kcm9pZC52aWV3LlZpZXcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkxvY2tQYXR0ZXJuVXRpbHMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZBSUxFRF9BVFRFTVBUU19CRUZPUkVfUkVTRVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkFJTEVEX0FUVEVNUFRTX0JFRk9SRV9USU1FT1VUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBGQUlMRURfQVRURU1QVF9DT1VOVERPV05fSU5URVJWQUxfTVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEZBSUxFRF9BVFRFTVBUX1RJTUVPVVRfTVMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMT0NLT1VUX1BFUk1BTkVOVF9LRVkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMT0NLX1BBVFRFUk5fRklMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSU5fTE9DS19QQVRURVJOX1NJWkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlOX1BBVFRFUk5fUkVHSVNURVJfRkFJTAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRBRwotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIHNMb2NrUGF0dGVybkZpbGVuYW1lCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlciBtQ29udGVudFJlc29sdmVyCi0KLXByaXZhdGUgbG9uZyBtTG9ja291dERlYWRsaW5lCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcikKLQotcHJpdmF0ZSBib29sZWFuIGdldEJvb2xlYW4oCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0xpc3Q8TGNvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9Mb2NrUGF0dGVyblZpZXckQ2VsbDs+OylbQiApCi1zdGF0aWMgYnl0ZVtdIHBhdHRlcm5Ub0hhc2goCi1qYXZhLnV0aWwuTGlzdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9MaXN0PExjb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvTG9ja1BhdHRlcm5WaWV3JENlbGw7PjspTGphdmEvbGFuZy9TdHJpbmc7ICkKLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBwYXR0ZXJuVG9TdHJpbmcoCi1qYXZhLnV0aWwuTGlzdCkKLQotcHJpdmF0ZSB2b2lkIHNldEJvb2xlYW4oCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvdXRpbC9MaXN0PExjb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvTG9ja1BhdHRlcm5WaWV3JENlbGw7PjsgKQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuTGlzdCBzdHJpbmdUb1BhdHRlcm4oCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0xpc3Q8TGNvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9Mb2NrUGF0dGVyblZpZXckQ2VsbDs+OylaICkKLXB1YmxpYyBib29sZWFuIGNoZWNrUGF0dGVybigKLWphdmEudXRpbC5MaXN0KQotCi1wdWJsaWMgbG9uZyBnZXRMb2Nrb3V0QXR0ZW1wdERlYWRsaW5lKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TmV4dEFsYXJtKCkKLQotcHVibGljIGJvb2xlYW4gaXNMb2NrUGF0dGVybkVuYWJsZWQoKQotCi1wdWJsaWMgYm9vbGVhbiBpc1Blcm1hbmVudGx5TG9ja2VkKCkKLQotcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlUGF0dGVybkVuYWJsZWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0xpc3Q8TGNvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9Mb2NrUGF0dGVyblZpZXckQ2VsbDs+OylWICkKLXB1YmxpYyB2b2lkIHNhdmVMb2NrUGF0dGVybigKLWphdmEudXRpbC5MaXN0KQotCi1wdWJsaWMgYm9vbGVhbiBzYXZlZFBhdHRlcm5FeGlzdHMoKQotCi1wdWJsaWMgdm9pZCBzZXRMb2NrUGF0dGVybkVuYWJsZWQoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRMb2Nrb3V0QXR0ZW1wdERlYWRsaW5lKAotbG9uZykKLQotcHVibGljIHZvaWQgc2V0UGVybWFuZW50bHlMb2NrZWQoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRWaXNpYmxlUGF0dGVybkVuYWJsZWQoCi1ib29sZWFuKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9NDEwNCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvTG9ja1BhdHRlcm5WaWV3OyApCi0gY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkxvY2tQYXR0ZXJuVmlldyQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9Mb2NrUGF0dGVyblZpZXc7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1DZWxsICkKLXB1YmxpYyBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTG9ja1BhdHRlcm5WaWV3JENlbGwgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTG9ja1BhdHRlcm5WaWV3JENlbGxbXVtdIHNDZWxscwotCi0gaW50IGNvbHVtbgotCi0gaW50IHJvdwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWludAotaW50KQotCi1wcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrUmFuZ2UoCi1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTG9ja1BhdHRlcm5WaWV3JENlbGwgb2YoCi1pbnQKLWludCkKLQotcHVibGljIGludCBnZXRDb2x1bW4oKQotCi1wdWJsaWMgaW50IGdldFJvdygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE2NDA5IG5hbWUgPURpc3BsYXlNb2RlICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvTG9ja1BhdHRlcm5WaWV3OyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9FbnVtPExjb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvTG9ja1BhdHRlcm5WaWV3JERpc3BsYXlNb2RlOz47ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTG9ja1BhdHRlcm5WaWV3JERpc3BsYXlNb2RlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkxvY2tQYXR0ZXJuVmlldyREaXNwbGF5TW9kZVtdICRWQUxVRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTG9ja1BhdHRlcm5WaWV3JERpc3BsYXlNb2RlIEFuaW1hdGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTG9ja1BhdHRlcm5WaWV3JERpc3BsYXlNb2RlIENvcnJlY3QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTG9ja1BhdHRlcm5WaWV3JERpc3BsYXlNb2RlIFdyb25nCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpViApCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5Mb2NrUGF0dGVyblZpZXckRGlzcGxheU1vZGUgdmFsdWVPZigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkxvY2tQYXR0ZXJuVmlldyREaXNwbGF5TW9kZVtdIHZhbHVlcygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9Mb2NrUGF0dGVyblZpZXc7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1PblBhdHRlcm5MaXN0ZW5lciApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5Mb2NrUGF0dGVyblZpZXckT25QYXR0ZXJuTGlzdGVuZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgb25QYXR0ZXJuQ2xlYXJlZCgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTGlzdDxMY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0xvY2tQYXR0ZXJuVmlldyRDZWxsOz47KVYgKQotcHVibGljIGFic3RyYWN0IHZvaWQgb25QYXR0ZXJuRGV0ZWN0ZWQoCi1qYXZhLnV0aWwuTGlzdCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgb25QYXR0ZXJuU3RhcnQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I8TGNvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9Mb2NrUGF0dGVyblZpZXckU2F2ZWRTdGF0ZTs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0xvY2tQYXR0ZXJuVmlldyRTYXZlZFN0YXRlOyApCi1maW5hbCBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTG9ja1BhdHRlcm5WaWV3JFNhdmVkU3RhdGUkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTG9ja1BhdHRlcm5WaWV3JFNhdmVkU3RhdGUgY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTG9ja1BhdHRlcm5WaWV3JFNhdmVkU3RhdGVbXSBuZXdBcnJheSgKLWludCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3RbXSBuZXdBcnJheSgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPVNhdmVkU3RhdGUgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9Mb2NrUGF0dGVyblZpZXc7ICkKLSBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTG9ja1BhdHRlcm5WaWV3JFNhdmVkU3RhdGUgZXh0ZW5kcyBhbmRyb2lkLnZpZXcuVmlldyRCYXNlU2F2ZWRTdGF0ZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0xvY2tQYXR0ZXJuVmlldyRTYXZlZFN0YXRlOz47ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IgQ1JFQVRPUgotCi1wcml2YXRlIGZpbmFsIGludCBtRGlzcGxheU1vZGUKLQotcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1JblN0ZWFsdGhNb2RlCi0KLXByaXZhdGUgZmluYWwgYm9vbGVhbiBtSW5wdXRFbmFibGVkCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBtU2VyaWFsaXplZFBhdHRlcm4KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5QYXJjZWwKLWNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5Mb2NrUGF0dGVyblZpZXckMSkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuUGFyY2VsYWJsZQotamF2YS5sYW5nLlN0cmluZwotaW50Ci1ib29sZWFuCi1ib29sZWFuKQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLlBhcmNlbGFibGUKLWphdmEubGFuZy5TdHJpbmcKLWludAotYm9vbGVhbgotYm9vbGVhbgotY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkxvY2tQYXR0ZXJuVmlldyQxKQotCi1wdWJsaWMgaW50IGdldERpc3BsYXlNb2RlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U2VyaWFsaXplZFBhdHRlcm4oKQotCi1wdWJsaWMgYm9vbGVhbiBpc0luU3RlYWx0aE1vZGUoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0lucHV0RW5hYmxlZCgpCi0KLXB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9Mb2NrUGF0dGVyblZpZXckMTtMY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0xvY2tQYXR0ZXJuVmlldyRTYXZlZFN0YXRlO0xjb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvTG9ja1BhdHRlcm5WaWV3JE9uUGF0dGVybkxpc3RlbmVyO0xjb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvTG9ja1BhdHRlcm5WaWV3JERpc3BsYXlNb2RlO0xjb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvTG9ja1BhdHRlcm5WaWV3JENlbGw7ICkKLXB1YmxpYyBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTG9ja1BhdHRlcm5WaWV3IGV4dGVuZHMgYW5kcm9pZC52aWV3LlZpZXcKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1JTExJU19QRVJfQ0lSQ0xFX0FOSU1BVElORwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFBST0ZJTEVfRFJBV0lORwotCi1zdGF0aWMgZmluYWwgaW50IFNUQVRVU19CQVJfSEVJR0hUCi0KLXByaXZhdGUgbG9uZyBtQW5pbWF0aW5nUGVyaW9kU3RhcnQKLQotcHJpdmF0ZSBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCBtQml0bWFwQXJyb3dHcmVlblVwCi0KLXByaXZhdGUgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAgbUJpdG1hcEFycm93UmVkVXAKLQotcHJpdmF0ZSBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCBtQml0bWFwQnRuRGVmYXVsdAotCi1wcml2YXRlIGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwIG1CaXRtYXBCdG5Ub3VjaGVkCi0KLXByaXZhdGUgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAgbUJpdG1hcENpcmNsZURlZmF1bHQKLQotcHJpdmF0ZSBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCBtQml0bWFwQ2lyY2xlR3JlZW4KLQotcHJpdmF0ZSBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCBtQml0bWFwQ2lyY2xlUmVkCi0KLXByaXZhdGUgaW50IG1CaXRtYXBIZWlnaHQKLQotcHJpdmF0ZSBpbnQgbUJpdG1hcFdpZHRoCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYXRoIG1DdXJyZW50UGF0aAotCi1wcml2YXRlIGZsb2F0IG1EaWFtZXRlckZhY3RvcgotCi1wcml2YXRlIGJvb2xlYW4gbURyYXdpbmdQcm9maWxpbmdTdGFydGVkCi0KLXByaXZhdGUgZmxvYXQgbUhpdEZhY3RvcgotCi1wcml2YXRlIGZsb2F0IG1JblByb2dyZXNzWAotCi1wcml2YXRlIGZsb2F0IG1JblByb2dyZXNzWQotCi1wcml2YXRlIGJvb2xlYW4gbUluU3RlYWx0aE1vZGUKLQotcHJpdmF0ZSBib29sZWFuIG1JbnB1dEVuYWJsZWQKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlJlY3QgbUludmFsaWRhdGUKLQotcHJpdmF0ZSBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTG9ja1BhdHRlcm5WaWV3JE9uUGF0dGVybkxpc3RlbmVyIG1PblBhdHRlcm5MaXN0ZW5lcgotCi1wcml2YXRlIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQgbVBhaW50Ci0KLXByaXZhdGUgYW5kcm9pZC5ncmFwaGljcy5QYWludCBtUGF0aFBhaW50Ci1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9BcnJheUxpc3Q8TGNvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9Mb2NrUGF0dGVyblZpZXckQ2VsbDs+OyApCi1wcml2YXRlIGphdmEudXRpbC5BcnJheUxpc3QgbVBhdHRlcm4KLQotcHJpdmF0ZSBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTG9ja1BhdHRlcm5WaWV3JERpc3BsYXlNb2RlIG1QYXR0ZXJuRGlzcGxheU1vZGUKLQotcHJpdmF0ZSBib29sZWFuW11bXSBtUGF0dGVybkRyYXdMb29rdXAKLQotcHJpdmF0ZSBib29sZWFuIG1QYXR0ZXJuSW5Qcm9ncmVzcwotCi1wcml2YXRlIGZsb2F0IG1TcXVhcmVIZWlnaHQKLQotcHJpdmF0ZSBmbG9hdCBtU3F1YXJlV2lkdGgKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi0KLXByaXZhdGUgdm9pZCBhZGRDZWxsVG9QYXR0ZXJuKAotY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkxvY2tQYXR0ZXJuVmlldyRDZWxsKQotCi1wcml2YXRlIGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5Mb2NrUGF0dGVyblZpZXckQ2VsbCBjaGVja0Zvck5ld0hpdCgKLWZsb2F0Ci1mbG9hdCkKLQotcHJpdmF0ZSB2b2lkIGNsZWFyUGF0dGVybkRyYXdMb29rdXAoKQotCi1wcml2YXRlIGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5Mb2NrUGF0dGVyblZpZXckQ2VsbCBkZXRlY3RBbmRBZGRIaXQoCi1mbG9hdAotZmxvYXQpCi0KLXByaXZhdGUgdm9pZCBkcmF3QXJyb3coCi1hbmRyb2lkLmdyYXBoaWNzLkNhbnZhcwotZmxvYXQKLWZsb2F0Ci1jb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTG9ja1BhdHRlcm5WaWV3JENlbGwKLWNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5Mb2NrUGF0dGVyblZpZXckQ2VsbCkKLQotcHJpdmF0ZSB2b2lkIGRyYXdDaXJjbGUoCi1hbmRyb2lkLmdyYXBoaWNzLkNhbnZhcwotaW50Ci1pbnQKLWJvb2xlYW4pCi0KLXByaXZhdGUgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAgZ2V0Qml0bWFwRm9yKAotaW50KQotCi1wcml2YXRlIGZsb2F0IGdldENlbnRlclhGb3JDb2x1bW4oCi1pbnQpCi0KLXByaXZhdGUgZmxvYXQgZ2V0Q2VudGVyWUZvclJvdygKLWludCkKLQotcHJpdmF0ZSBpbnQgZ2V0Q29sdW1uSGl0KAotZmxvYXQpCi0KLXByaXZhdGUgaW50IGdldFJvd0hpdCgKLWZsb2F0KQotCi1wcml2YXRlIHZvaWQgcmVzZXRQYXR0ZXJuKCkKLQotcHVibGljIHZvaWQgY2xlYXJQYXR0ZXJuKCkKLQotcHVibGljIHZvaWQgZGlzYWJsZUlucHV0KCkKLQotcHVibGljIHZvaWQgZW5hYmxlSW5wdXQoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0luU3RlYWx0aE1vZGUoKQotCi1wcm90ZWN0ZWQgdm9pZCBvbkRyYXcoCi1hbmRyb2lkLmdyYXBoaWNzLkNhbnZhcykKLQotcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKAotaW50Ci1pbnQpCi0KLXByb3RlY3RlZCB2b2lkIG9uUmVzdG9yZUluc3RhbmNlU3RhdGUoCi1hbmRyb2lkLm9zLlBhcmNlbGFibGUpCi0KLXByb3RlY3RlZCBhbmRyb2lkLm9zLlBhcmNlbGFibGUgb25TYXZlSW5zdGFuY2VTdGF0ZSgpCi0KLXByb3RlY3RlZCB2b2lkIG9uU2l6ZUNoYW5nZWQoCi1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudCgKLWFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCkKLQotcHVibGljIHZvaWQgc2V0RGlzcGxheU1vZGUoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTG9ja1BhdHRlcm5WaWV3JERpc3BsYXlNb2RlKQotCi1wdWJsaWMgdm9pZCBzZXRJblN0ZWFsdGhNb2RlKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0T25QYXR0ZXJuTGlzdGVuZXIoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTG9ja1BhdHRlcm5WaWV3JE9uUGF0dGVybkxpc3RlbmVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0xvY2tQYXR0ZXJuVmlldyREaXNwbGF5TW9kZTtMamF2YS91dGlsL0xpc3Q8TGNvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9Mb2NrUGF0dGVyblZpZXckQ2VsbDs+OylWICkKLXB1YmxpYyB2b2lkIHNldFBhdHRlcm4oCi1jb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTG9ja1BhdHRlcm5WaWV3JERpc3BsYXlNb2RlCi1qYXZhLnV0aWwuTGlzdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9Rm9ybWF0dGVyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvTnVtYmVyUGlja2VyOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5OdW1iZXJQaWNrZXIkRm9ybWF0dGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvTnVtYmVyUGlja2VyOyApCi1maW5hbCBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTnVtYmVyUGlja2VyJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0Lk51bWJlclBpY2tlciRGb3JtYXR0ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgamF2YS5sYW5nLk9iamVjdFtdIG1BcmdzCi0KLWZpbmFsIGphdmEubGFuZy5TdHJpbmdCdWlsZGVyIG1CdWlsZGVyCi0KLWZpbmFsIGphdmEudXRpbC5Gb3JtYXR0ZXIgbUZtdAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvTnVtYmVyUGlja2VyOyApCi0gY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0Lk51bWJlclBpY2tlciQyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5SdW5uYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTnVtYmVyUGlja2VyIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5OdW1iZXJQaWNrZXIpCi0KLXB1YmxpYyB2b2lkIHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPU51bWJlclBpY2tlcklucHV0RmlsdGVyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvTnVtYmVyUGlja2VyOyApCi0gY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0Lk51bWJlclBpY2tlciROdW1iZXJQaWNrZXJJbnB1dEZpbHRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLnRleHQuSW5wdXRGaWx0ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0Lk51bWJlclBpY2tlciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0Lk51bWJlclBpY2tlcikKLQotIHZvaWQgPGluaXQ+KAotY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0Lk51bWJlclBpY2tlcgotY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0Lk51bWJlclBpY2tlciQxKQotCi1wdWJsaWMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBmaWx0ZXIoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludAotYW5kcm9pZC50ZXh0LlNwYW5uZWQKLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MiBuYW1lID1OdW1iZXJSYW5nZUtleUxpc3RlbmVyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvTnVtYmVyUGlja2VyOyApCi0gY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0Lk51bWJlclBpY2tlciROdW1iZXJSYW5nZUtleUxpc3RlbmVyIGV4dGVuZHMgYW5kcm9pZC50ZXh0Lm1ldGhvZC5OdW1iZXJLZXlMaXN0ZW5lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTnVtYmVyUGlja2VyIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1jb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTnVtYmVyUGlja2VyKQotCi0gdm9pZCA8aW5pdD4oCi1jb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTnVtYmVyUGlja2VyCi1jb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTnVtYmVyUGlja2VyJDEpCi0KLXB1YmxpYyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIGZpbHRlcigKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWludAotaW50Ci1hbmRyb2lkLnRleHQuU3Bhbm5lZAotaW50Ci1pbnQpCi0KLXByb3RlY3RlZCBjaGFyW10gZ2V0QWNjZXB0ZWRDaGFycygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L051bWJlclBpY2tlciROdW1iZXJSYW5nZUtleUxpc3RlbmVyO0xjb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvTnVtYmVyUGlja2VyJE51bWJlclBpY2tlcklucHV0RmlsdGVyO0xjb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvTnVtYmVyUGlja2VyJEZvcm1hdHRlcjtMY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L051bWJlclBpY2tlciRPbkNoYW5nZWRMaXN0ZW5lcjsgKQotcHVibGljIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5OdW1iZXJQaWNrZXIgZXh0ZW5kcyBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQgaW1wbGVtZW50cyBhbmRyb2lkLnZpZXcuVmlldyRPbkNsaWNrTGlzdGVuZXIsIGFuZHJvaWQudmlldy5WaWV3JE9uRm9jdXNDaGFuZ2VMaXN0ZW5lciwgYW5kcm9pZC52aWV3LlZpZXckT25Mb25nQ2xpY2tMaXN0ZW5lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gRElHSVRfQ0hBUkFDVEVSUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5OdW1iZXJQaWNrZXIkRm9ybWF0dGVyIFRXT19ESUdJVF9GT1JNQVRURVIKLQotcHJpdmF0ZSBpbnQgbUN1cnJlbnQKLQotcHJpdmF0ZSBib29sZWFuIG1EZWNyZW1lbnQKLQotcHJpdmF0ZSBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTnVtYmVyUGlja2VyQnV0dG9uIG1EZWNyZW1lbnRCdXR0b24KLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nW10gbURpc3BsYXllZFZhbHVlcwotCi1wcml2YXRlIGludCBtRW5kCi0KLXByaXZhdGUgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0Lk51bWJlclBpY2tlciRGb3JtYXR0ZXIgbUZvcm1hdHRlcgotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQub3MuSGFuZGxlciBtSGFuZGxlcgotCi1wcml2YXRlIGJvb2xlYW4gbUluY3JlbWVudAotCi1wcml2YXRlIGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5OdW1iZXJQaWNrZXJCdXR0b24gbUluY3JlbWVudEJ1dHRvbgotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlciBtSW5mbGF0ZXIKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLnRleHQuSW5wdXRGaWx0ZXIgbUlucHV0RmlsdGVyCi0KLXByaXZhdGUgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0Lk51bWJlclBpY2tlciRPbkNoYW5nZWRMaXN0ZW5lciBtTGlzdGVuZXIKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLnRleHQuSW5wdXRGaWx0ZXIgbU51bWJlcklucHV0RmlsdGVyCi0KLXByaXZhdGUgaW50IG1QcmV2aW91cwotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5SdW5uYWJsZSBtUnVubmFibGUKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvbiBtU2xpZGVEb3duSW5BbmltYXRpb24KLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvbiBtU2xpZGVEb3duT3V0QW5pbWF0aW9uCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb24gbVNsaWRlVXBJbkFuaW1hdGlvbgotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uIG1TbGlkZVVwT3V0QW5pbWF0aW9uCi0KLXByaXZhdGUgbG9uZyBtU3BlZWQKLQotcHJpdmF0ZSBpbnQgbVN0YXJ0Ci0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXcgbVRleHQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQKLWludCkKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDAwMCgKLWNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5OdW1iZXJQaWNrZXIpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDEwMCgKLWNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5OdW1iZXJQaWNrZXIpCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nW10gYWNjZXNzJDEyMDAoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTnVtYmVyUGlja2VyKQotCi1zdGF0aWMgYW5kcm9pZC50ZXh0LklucHV0RmlsdGVyIGFjY2VzcyQxMzAwKAotY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0Lk51bWJlclBpY2tlcikKLQotc3RhdGljIGNoYXJbXSBhY2Nlc3MkMTQwMCgpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDE1MDAoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTnVtYmVyUGlja2VyCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1zdGF0aWMgaW50IGFjY2VzcyQxNjAwKAotY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0Lk51bWJlclBpY2tlcikKLQotc3RhdGljIGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uIGFjY2VzcyQyMDAoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTnVtYmVyUGlja2VyKQotCi1zdGF0aWMgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb24gYWNjZXNzJDMwMCgKLWNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5OdW1iZXJQaWNrZXIpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQ0MDAoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTnVtYmVyUGlja2VyCi1pbnQKLWFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uCi1hbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvbikKLQotc3RhdGljIGxvbmcgYWNjZXNzJDUwMCgKLWNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5OdW1iZXJQaWNrZXIpCi0KLXN0YXRpYyBhbmRyb2lkLm9zLkhhbmRsZXIgYWNjZXNzJDYwMCgKLWNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5OdW1iZXJQaWNrZXIpCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQ3MDAoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTnVtYmVyUGlja2VyKQotCi1zdGF0aWMgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb24gYWNjZXNzJDgwMCgKLWNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5OdW1iZXJQaWNrZXIpCi0KLXN0YXRpYyBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvbiBhY2Nlc3MkOTAwKAotY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0Lk51bWJlclBpY2tlcikKLQotcHJpdmF0ZSB2b2lkIGNoYW5nZUN1cnJlbnQoCi1pbnQKLWFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uCi1hbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvbikKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGZvcm1hdE51bWJlcigKLWludCkKLQotcHJpdmF0ZSBpbnQgZ2V0U2VsZWN0ZWRQb3MoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHZvaWQgbm90aWZ5Q2hhbmdlKCkKLQotcHJpdmF0ZSB2b2lkIHVwZGF0ZVZpZXcoKQotCi1wcml2YXRlIHZvaWQgdmFsaWRhdGVDdXJyZW50VmlldygKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi0KLXB1YmxpYyB2b2lkIGNhbmNlbERlY3JlbWVudCgpCi0KLXB1YmxpYyB2b2lkIGNhbmNlbEluY3JlbWVudCgpCi0KLXB1YmxpYyB2b2lkIG9uQ2xpY2soCi1hbmRyb2lkLnZpZXcuVmlldykKLQotcHVibGljIHZvaWQgb25Gb2N1c0NoYW5nZSgKLWFuZHJvaWQudmlldy5WaWV3Ci1ib29sZWFuKQotCi1wdWJsaWMgYm9vbGVhbiBvbkxvbmdDbGljaygKLWFuZHJvaWQudmlldy5WaWV3KQotCi1wdWJsaWMgdm9pZCBzZXRDdXJyZW50KAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRFbmFibGVkKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0Rm9ybWF0dGVyKAotY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0Lk51bWJlclBpY2tlciRGb3JtYXR0ZXIpCi0KLXB1YmxpYyB2b2lkIHNldE9uQ2hhbmdlTGlzdGVuZXIoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTnVtYmVyUGlja2VyJE9uQ2hhbmdlZExpc3RlbmVyKQotCi1wdWJsaWMgdm9pZCBzZXRSYW5nZSgKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRSYW5nZSgKLWludAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLXB1YmxpYyB2b2lkIHNldFNwZWVkKAotbG9uZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTnVtYmVyUGlja2VyQnV0dG9uIGV4dGVuZHMgYW5kcm9pZC53aWRnZXQuSW1hZ2VCdXR0b24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTnVtYmVyUGlja2VyIG1OdW1iZXJQaWNrZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ci1pbnQpCi0KLXByaXZhdGUgdm9pZCBjYW5jZWxMb25ncHJlc3MoKQotCi1wcml2YXRlIHZvaWQgY2FuY2VsTG9uZ3ByZXNzSWZSZXF1aXJlZCgKLWFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCkKLQotcHVibGljIGJvb2xlYW4gb25LZXlVcCgKLWludAotYW5kcm9pZC52aWV3LktleUV2ZW50KQotCi1wdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnQoCi1hbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQpCi0KLXB1YmxpYyBib29sZWFuIG9uVHJhY2tiYWxsRXZlbnQoCi1hbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQpCi0KLXB1YmxpYyB2b2lkIHNldE51bWJlclBpY2tlcigKLWNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5OdW1iZXJQaWNrZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID00MTA0IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9TbGlkaW5nRHJhd2VyOyApCi0gY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LlNsaWRpbmdEcmF3ZXIkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvU2xpZGluZ0RyYXdlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPURyYXdlclRvZ2dsZXIgKQotIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5TbGlkaW5nRHJhd2VyJERyYXdlclRvZ2dsZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC52aWV3LlZpZXckT25DbGlja0xpc3RlbmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5TbGlkaW5nRHJhd2VyIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1jb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuU2xpZGluZ0RyYXdlcikKLQotIHZvaWQgPGluaXQ+KAotY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LlNsaWRpbmdEcmF3ZXIKLWNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5TbGlkaW5nRHJhd2VyJDEpCi0KLXB1YmxpYyB2b2lkIG9uQ2xpY2soCi1hbmRyb2lkLnZpZXcuVmlldykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9T25EcmF3ZXJDbG9zZUxpc3RlbmVyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvU2xpZGluZ0RyYXdlcjsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuU2xpZGluZ0RyYXdlciRPbkRyYXdlckNsb3NlTGlzdGVuZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgb25EcmF3ZXJDbG9zZWQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1PbkRyYXdlck9wZW5MaXN0ZW5lciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L1NsaWRpbmdEcmF3ZXI7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LlNsaWRpbmdEcmF3ZXIkT25EcmF3ZXJPcGVuTGlzdGVuZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgb25EcmF3ZXJPcGVuZWQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1PbkRyYXdlclNjcm9sbExpc3RlbmVyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvU2xpZGluZ0RyYXdlcjsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuU2xpZGluZ0RyYXdlciRPbkRyYXdlclNjcm9sbExpc3RlbmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uU2Nyb2xsRW5kZWQoKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvblNjcm9sbFN0YXJ0ZWQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MiBuYW1lID1TbGlkaW5nSGFuZGxlciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L1NsaWRpbmdEcmF3ZXI7ICkKLSBjbGFzcyBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuU2xpZGluZ0RyYXdlciRTbGlkaW5nSGFuZGxlciBleHRlbmRzIGFuZHJvaWQub3MuSGFuZGxlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuU2xpZGluZ0RyYXdlciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LlNsaWRpbmdEcmF3ZXIpCi0KLSB2b2lkIDxpbml0PigKLWNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5TbGlkaW5nRHJhd2VyCi1jb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuU2xpZGluZ0RyYXdlciQxKQotCi1wdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKAotYW5kcm9pZC5vcy5NZXNzYWdlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9TbGlkaW5nRHJhd2VyJDE7TGNvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9TbGlkaW5nRHJhd2VyJFNsaWRpbmdIYW5kbGVyO0xjb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvU2xpZGluZ0RyYXdlciREcmF3ZXJUb2dnbGVyO0xjb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvU2xpZGluZ0RyYXdlciRPbkRyYXdlclNjcm9sbExpc3RlbmVyO0xjb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvU2xpZGluZ0RyYXdlciRPbkRyYXdlckNsb3NlTGlzdGVuZXI7TGNvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9TbGlkaW5nRHJhd2VyJE9uRHJhd2VyT3Blbkxpc3RlbmVyOyApCi1wdWJsaWMgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LlNsaWRpbmdEcmF3ZXIgZXh0ZW5kcyBhbmRyb2lkLnZpZXcuVmlld0dyb3VwCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBTklNQVRJT05fRlJBTUVfRFVSQVRJT04KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTExBUFNFRF9GVUxMX0NMT1NFRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVhQQU5ERURfRlVMTF9PUEVOCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IE1BWElNVU1fQUNDRUxFUkFUSU9OCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IE1BWElNVU1fTUFKT1JfVkVMT0NJVFkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgTUFYSU1VTV9NSU5PUl9WRUxPQ0lUWQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBNQVhJTVVNX1RBUF9WRUxPQ0lUWQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0FOSU1BVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1JJRU5UQVRJT05fSE9SSVpPTlRBTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUklFTlRBVElPTl9WRVJUSUNBTAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEFQX1RIUkVTSE9MRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVkVMT0NJVFlfVU5JVFMKLQotcHJpdmF0ZSBib29sZWFuIG1BbmltYXRlT25DbGljawotCi1wcml2YXRlIGZsb2F0IG1BbmltYXRlZEFjY2VsZXJhdGlvbgotCi1wcml2YXRlIGZsb2F0IG1BbmltYXRlZFZlbG9jaXR5Ci0KLXByaXZhdGUgYm9vbGVhbiBtQW5pbWF0aW5nCi0KLXByaXZhdGUgbG9uZyBtQW5pbWF0aW9uTGFzdFRpbWUKLQotcHJpdmF0ZSBmbG9hdCBtQW5pbWF0aW9uUG9zaXRpb24KLQotcHJpdmF0ZSBpbnQgbUJvdHRvbU9mZnNldAotCi1wcml2YXRlIGFuZHJvaWQudmlldy5WaWV3IG1Db250ZW50Ci0KLXByaXZhdGUgZmluYWwgaW50IG1Db250ZW50SWQKLQotcHJpdmF0ZSBsb25nIG1DdXJyZW50QW5pbWF0aW9uVGltZQotCi1wcml2YXRlIGJvb2xlYW4gbUV4cGFuZGVkCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5SZWN0IG1GcmFtZQotCi1wcml2YXRlIGFuZHJvaWQudmlldy5WaWV3IG1IYW5kbGUKLQotcHJpdmF0ZSBpbnQgbUhhbmRsZUhlaWdodAotCi1wcml2YXRlIGZpbmFsIGludCBtSGFuZGxlSWQKLQotcHJpdmF0ZSBpbnQgbUhhbmRsZVdpZHRoCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5vcy5IYW5kbGVyIG1IYW5kbGVyCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5SZWN0IG1JbnZhbGlkYXRlCi0KLXByaXZhdGUgYm9vbGVhbiBtTG9ja2VkCi0KLXByaXZhdGUgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LlNsaWRpbmdEcmF3ZXIkT25EcmF3ZXJDbG9zZUxpc3RlbmVyIG1PbkRyYXdlckNsb3NlTGlzdGVuZXIKLQotcHJpdmF0ZSBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuU2xpZGluZ0RyYXdlciRPbkRyYXdlck9wZW5MaXN0ZW5lciBtT25EcmF3ZXJPcGVuTGlzdGVuZXIKLQotcHJpdmF0ZSBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuU2xpZGluZ0RyYXdlciRPbkRyYXdlclNjcm9sbExpc3RlbmVyIG1PbkRyYXdlclNjcm9sbExpc3RlbmVyCi0KLXByaXZhdGUgaW50IG1Ub3BPZmZzZXQKLQotcHJpdmF0ZSBpbnQgbVRvdWNoRGVsdGEKLQotcHJpdmF0ZSBib29sZWFuIG1UcmFja2luZwotCi1wcml2YXRlIGFuZHJvaWQudmlldy5WZWxvY2l0eVRyYWNrZXIgbVZlbG9jaXR5VHJhY2tlcgotCi1wcml2YXRlIGJvb2xlYW4gbVZlcnRpY2FsCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ci1pbnQpCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQyMDAoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuU2xpZGluZ0RyYXdlcikKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDMwMCgKLWNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5TbGlkaW5nRHJhd2VyKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkNDAwKAotY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LlNsaWRpbmdEcmF3ZXIpCi0KLXByaXZhdGUgdm9pZCBhbmltYXRlQ2xvc2UoCi1pbnQpCi0KLXByaXZhdGUgdm9pZCBhbmltYXRlT3BlbigKLWludCkKLQotcHJpdmF0ZSB2b2lkIGNsb3NlRHJhd2VyKCkKLQotcHJpdmF0ZSB2b2lkIGRvQW5pbWF0aW9uKCkKLQotcHJpdmF0ZSB2b2lkIGluY3JlbWVudEFuaW1hdGlvbigpCi0KLXByaXZhdGUgdm9pZCBtb3ZlSGFuZGxlKAotaW50KQotCi1wcml2YXRlIHZvaWQgb3BlbkRyYXdlcigpCi0KLXByaXZhdGUgdm9pZCBwZXJmb3JtRmxpbmcoCi1pbnQKLWZsb2F0Ci1ib29sZWFuKQotCi1wcml2YXRlIHZvaWQgcHJlcGFyZUNvbnRlbnQoKQotCi1wcml2YXRlIHZvaWQgcHJlcGFyZVRyYWNraW5nKAotaW50KQotCi1wcml2YXRlIHZvaWQgc3RvcFRyYWNraW5nKCkKLQotcHVibGljIHZvaWQgYW5pbWF0ZUNsb3NlKCkKLQotcHVibGljIHZvaWQgYW5pbWF0ZU9wZW4oKQotCi1wdWJsaWMgdm9pZCBhbmltYXRlVG9nZ2xlKCkKLQotcHVibGljIHZvaWQgY2xvc2UoKQotCi1wcm90ZWN0ZWQgdm9pZCBkaXNwYXRjaERyYXcoCi1hbmRyb2lkLmdyYXBoaWNzLkNhbnZhcykKLQotcHVibGljIGFuZHJvaWQudmlldy5WaWV3IGdldENvbnRlbnQoKQotCi1wdWJsaWMgYW5kcm9pZC52aWV3LlZpZXcgZ2V0SGFuZGxlKCkKLQotcHVibGljIGJvb2xlYW4gaXNNb3ZpbmcoKQotCi1wdWJsaWMgYm9vbGVhbiBpc09wZW5lZCgpCi0KLXB1YmxpYyB2b2lkIGxvY2soKQotCi1wcm90ZWN0ZWQgdm9pZCBvbkZpbmlzaEluZmxhdGUoKQotCi1wdWJsaWMgYm9vbGVhbiBvbkludGVyY2VwdFRvdWNoRXZlbnQoCi1hbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQpCi0KLXByb3RlY3RlZCB2b2lkIG9uTGF5b3V0KAotYm9vbGVhbgotaW50Ci1pbnQKLWludAotaW50KQotCi1wcm90ZWN0ZWQgdm9pZCBvbk1lYXN1cmUoCi1pbnQKLWludCkKLQotcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KAotYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50KQotCi1wdWJsaWMgdm9pZCBvcGVuKCkKLQotcHVibGljIHZvaWQgc2V0T25EcmF3ZXJDbG9zZUxpc3RlbmVyKAotY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LlNsaWRpbmdEcmF3ZXIkT25EcmF3ZXJDbG9zZUxpc3RlbmVyKQotCi1wdWJsaWMgdm9pZCBzZXRPbkRyYXdlck9wZW5MaXN0ZW5lcigKLWNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5TbGlkaW5nRHJhd2VyJE9uRHJhd2VyT3Blbkxpc3RlbmVyKQotCi1wdWJsaWMgdm9pZCBzZXRPbkRyYXdlclNjcm9sbExpc3RlbmVyKAotY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LlNsaWRpbmdEcmF3ZXIkT25EcmF3ZXJTY3JvbGxMaXN0ZW5lcikKLQotcHVibGljIHZvaWQgdG9nZ2xlKCkKLQotcHVibGljIHZvaWQgdW5sb2NrKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L1ZlcnRpY2FsVGV4dFNwaW5uZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1PbkNoYW5nZWRMaXN0ZW5lciApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5WZXJ0aWNhbFRleHRTcGlubmVyJE9uQ2hhbmdlZExpc3RlbmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uQ2hhbmdlZCgKLWNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5WZXJ0aWNhbFRleHRTcGlubmVyCi1pbnQKLWludAotamF2YS5sYW5nLlN0cmluZ1tdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9WZXJ0aWNhbFRleHRTcGlubmVyJE9uQ2hhbmdlZExpc3RlbmVyOyApCi1wdWJsaWMgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LlZlcnRpY2FsVGV4dFNwaW5uZXIgZXh0ZW5kcyBhbmRyb2lkLnZpZXcuVmlldwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIERFRkFVTFRfU0NST0xMX0lOVEVSVkFMX01TCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNSU5fQU5JTUFUSU9OUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0NST0xMX0RJU1RBTkNFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTQ1JPTExfTU9ERV9ET1dOCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTQ1JPTExfTU9ERV9OT05FCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTQ1JPTExfTU9ERV9VUAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VMRUNUT1JfQVJST1dfSEVJR0hUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBURVhUMV9ZCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBURVhUMl9ZCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBURVhUM19ZCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBURVhUNF9ZCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBURVhUNV9ZCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBURVhUX01BUkdJTl9SSUdIVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEVYVF9TSVpFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBURVhUX1NQQUNJTkcKLQotcHJpdmF0ZSBib29sZWFuIGlzRHJhZ2dpbmdTZWxlY3RvcgotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgbUJhY2tncm91bmRGb2N1c2VkCi0KLXByaXZhdGUgaW50IG1DdXJyZW50U2VsZWN0ZWRQb3MKLQotcHJpdmF0ZSBsb25nIG1EZWxheUJldHdlZW5BbmltYXRpb25zCi0KLXByaXZhdGUgaW50IG1EaXN0YW5jZU9mRWFjaEFuaW1hdGlvbgotCi1wcml2YXRlIGludCBtRG93blkKLQotcHJpdmF0ZSBib29sZWFuIG1Jc0FuaW1hdGlvblJ1bm5pbmcKLQotcHJpdmF0ZSBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuVmVydGljYWxUZXh0U3Bpbm5lciRPbkNoYW5nZWRMaXN0ZW5lciBtTGlzdGVuZXIKLQotcHJpdmF0ZSBpbnQgbU51bWJlck9mQW5pbWF0aW9ucwotCi1wcml2YXRlIGxvbmcgbVNjcm9sbEludGVydmFsCi0KLXByaXZhdGUgaW50IG1TY3JvbGxNb2RlCi0KLXByaXZhdGUgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSBtU2VsZWN0b3IKLQotcHJpdmF0ZSBmaW5hbCBpbnQgbVNlbGVjdG9yRGVmYXVsdFkKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIG1TZWxlY3RvckZvY3VzZWQKLQotcHJpdmF0ZSBmaW5hbCBpbnQgbVNlbGVjdG9ySGVpZ2h0Ci0KLXByaXZhdGUgZmluYWwgaW50IG1TZWxlY3Rvck1heFkKLQotcHJpdmF0ZSBmaW5hbCBpbnQgbVNlbGVjdG9yTWluWQotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgbVNlbGVjdG9yTm9ybWFsCi0KLXByaXZhdGUgaW50IG1TZWxlY3RvclkKLQotcHJpdmF0ZSBib29sZWFuIG1TdG9wQW5pbWF0aW9uCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtVGV4dDEKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1UZXh0MgotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbVRleHQzCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtVGV4dDQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1UZXh0NQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmdbXSBtVGV4dExpc3QKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLnRleHQuVGV4dFBhaW50IG1UZXh0UGFpbnREYXJrCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC50ZXh0LlRleHRQYWludCBtVGV4dFBhaW50TGlnaHQKLQotcHJpdmF0ZSBpbnQgbVRvdGFsQW5pbWF0ZWREaXN0YW5jZQotCi1wcml2YXRlIGJvb2xlYW4gbVdyYXBBcm91bmQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ci1pbnQpCi0KLXByaXZhdGUgdm9pZCBjYWxjdWxhdGVBbmltYXRpb25WYWx1ZXMoKQotCi1wcml2YXRlIHZvaWQgY2FsY3VsYXRlVGV4dFBvc2l0aW9ucygpCi0KLXByaXZhdGUgYm9vbGVhbiBjYW5TY3JvbGxEb3duKCkKLQotcHJpdmF0ZSBib29sZWFuIGNhblNjcm9sbFVwKCkKLQotcHJpdmF0ZSB2b2lkIGRyYXdUZXh0KAotYW5kcm9pZC5ncmFwaGljcy5DYW52YXMKLWphdmEubGFuZy5TdHJpbmcKLWludAotYW5kcm9pZC50ZXh0LlRleHRQYWludCkKLQotcHJpdmF0ZSBpbnQgZ2V0TmV3SW5kZXgoCi1pbnQpCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBnZXRUZXh0VG9EcmF3KAotaW50KQotCi1wcml2YXRlIHZvaWQgc2Nyb2xsKCkKLQotcHVibGljIGludCBnZXRDdXJyZW50U2VsZWN0ZWRQb3MoKQotCi1wcm90ZWN0ZWQgdm9pZCBvbkRyYXcoCi1hbmRyb2lkLmdyYXBoaWNzLkNhbnZhcykKLQotcHJvdGVjdGVkIHZvaWQgb25Gb2N1c0NoYW5nZWQoCi1ib29sZWFuCi1pbnQKLWFuZHJvaWQuZ3JhcGhpY3MuUmVjdCkKLQotcHVibGljIGJvb2xlYW4gb25LZXlEb3duKAotaW50Ci1hbmRyb2lkLnZpZXcuS2V5RXZlbnQpCi0KLXB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudCgKLWFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCkKLQotcHVibGljIHZvaWQgc2V0SXRlbXMoCi1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLXB1YmxpYyB2b2lkIHNldE9uQ2hhbmdlTGlzdGVuZXIoCi1jb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuVmVydGljYWxUZXh0U3Bpbm5lciRPbkNoYW5nZWRMaXN0ZW5lcikKLQotcHVibGljIHZvaWQgc2V0U2Nyb2xsSW50ZXJ2YWwoCi1sb25nKQotCi1wdWJsaWMgdm9pZCBzZXRTZWxlY3RlZFBvcygKLWludCkKLQotcHVibGljIHZvaWQgc2V0V3JhcEFyb3VuZCgKLWJvb2xlYW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID00MTA0IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL3NlcnZlci9SZXNldHRhYmxlVGltZW91dDsgKQotIGNsYXNzIGNvbS5hbmRyb2lkLnNlcnZlci5SZXNldHRhYmxlVGltZW91dCQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPVQgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9hbmRyb2lkL3NlcnZlci9SZXNldHRhYmxlVGltZW91dDsgKQotIGNsYXNzIGNvbS5hbmRyb2lkLnNlcnZlci5SZXNldHRhYmxlVGltZW91dCRUIGV4dGVuZHMgamF2YS5sYW5nLlRocmVhZAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBjb20uYW5kcm9pZC5zZXJ2ZXIuUmVzZXR0YWJsZVRpbWVvdXQgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWNvbS5hbmRyb2lkLnNlcnZlci5SZXNldHRhYmxlVGltZW91dCkKLQotIHZvaWQgPGluaXQ+KAotY29tLmFuZHJvaWQuc2VydmVyLlJlc2V0dGFibGVUaW1lb3V0Ci1jb20uYW5kcm9pZC5zZXJ2ZXIuUmVzZXR0YWJsZVRpbWVvdXQkMSkKLQotcHVibGljIHZvaWQgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxjb20vYW5kcm9pZC9zZXJ2ZXIvUmVzZXR0YWJsZVRpbWVvdXQkMTtMY29tL2FuZHJvaWQvc2VydmVyL1Jlc2V0dGFibGVUaW1lb3V0JFQ7ICkKLWFic3RyYWN0IGNsYXNzIGNvbS5hbmRyb2lkLnNlcnZlci5SZXNldHRhYmxlVGltZW91dCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLm9zLkNvbmRpdGlvblZhcmlhYmxlIG1Mb2NrCi0KLXByaXZhdGUgdm9sYXRpbGUgbG9uZyBtT2ZmQXQKLQotcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIG1PZmZDYWxsZWQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuVGhyZWFkIG1UaHJlYWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1zdGF0aWMgYW5kcm9pZC5vcy5Db25kaXRpb25WYXJpYWJsZSBhY2Nlc3MkMTAwKAotY29tLmFuZHJvaWQuc2VydmVyLlJlc2V0dGFibGVUaW1lb3V0KQotCi1zdGF0aWMgbG9uZyBhY2Nlc3MkMjAwKAotY29tLmFuZHJvaWQuc2VydmVyLlJlc2V0dGFibGVUaW1lb3V0KQotCi1zdGF0aWMgYm9vbGVhbiBhY2Nlc3MkMzAyKAotY29tLmFuZHJvaWQuc2VydmVyLlJlc2V0dGFibGVUaW1lb3V0Ci1ib29sZWFuKQotCi1zdGF0aWMgamF2YS5sYW5nLlRocmVhZCBhY2Nlc3MkNDAyKAotY29tLmFuZHJvaWQuc2VydmVyLlJlc2V0dGFibGVUaW1lb3V0Ci1qYXZhLmxhbmcuVGhyZWFkKQotCi1wdWJsaWMgdm9pZCBjYW5jZWwoKQotCi1wdWJsaWMgdm9pZCBnbygKLWxvbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9mZigpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uKAotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBjb20uZ29vZ2xlLmFuZHJvaWQuY29sbGVjdC5MaXN0cyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxFOkxqYXZhL2xhbmcvT2JqZWN0Oz4oKUxqYXZhL3V0aWwvQXJyYXlMaXN0PFRFOz47ICkKLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLkFycmF5TGlzdCBuZXdBcnJheUxpc3QoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxFOkxqYXZhL2xhbmcvT2JqZWN0Oz4oW1RFOylMamF2YS91dGlsL0FycmF5TGlzdDxURTs+OyApCi1wdWJsaWMgc3RhdGljIHRyYW5zaWVudCBqYXZhLnV0aWwuQXJyYXlMaXN0IG5ld0FycmF5TGlzdCgKLWphdmEubGFuZy5PYmplY3RbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBjb20uZ29vZ2xlLmFuZHJvaWQuY29sbGVjdC5NYXBzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEs6TGphdmEvbGFuZy9PYmplY3Q7VjpMamF2YS9sYW5nL09iamVjdDs+KClMamF2YS91dGlsL0hhc2hNYXA8VEs7VFY7PjsgKQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuSGFzaE1hcCBuZXdIYXNoTWFwKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBjb20uZ29vZ2xlLmFuZHJvaWQuY29sbGVjdC5TZXRzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEs6TGphdmEvbGFuZy9PYmplY3Q7PigpTGphdmEvdXRpbC9IYXNoU2V0PFRLOz47ICkKLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLkhhc2hTZXQgbmV3SGFzaFNldCgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEU6TGphdmEvbGFuZy9PYmplY3Q7PihbVEU7KUxqYXZhL3V0aWwvSGFzaFNldDxURTs+OyApCi1wdWJsaWMgc3RhdGljIHRyYW5zaWVudCBqYXZhLnV0aWwuSGFzaFNldCBuZXdIYXNoU2V0KAotamF2YS5sYW5nLk9iamVjdFtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxFOkxqYXZhL2xhbmcvT2JqZWN0Oz4oW1RFOylMamF2YS91dGlsL1NvcnRlZFNldDxURTs+OyApCi1wdWJsaWMgc3RhdGljIHRyYW5zaWVudCBqYXZhLnV0aWwuU29ydGVkU2V0IG5ld1NvcnRlZFNldCgKLWphdmEubGFuZy5PYmplY3RbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2dvb2dsZS9hbmRyb2lkL2dkYXRhL2NsaWVudC9BbmRyb2lkR0RhdGFDbGllbnQ7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NiBuYW1lID1IdHRwUmVxdWVzdENyZWF0b3IgKQotYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGNvbS5nb29nbGUuYW5kcm9pZC5nZGF0YS5jbGllbnQuQW5kcm9pZEdEYXRhQ2xpZW50JEh0dHBSZXF1ZXN0Q3JlYXRvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5tZXRob2RzLkh0dHBVcmlSZXF1ZXN0IGNyZWF0ZVJlcXVlc3QoCi1qYXZhLm5ldC5VUkkpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1HZXRSZXF1ZXN0Q3JlYXRvciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2dvb2dsZS9hbmRyb2lkL2dkYXRhL2NsaWVudC9BbmRyb2lkR0RhdGFDbGllbnQ7ICkKLSBjbGFzcyBjb20uZ29vZ2xlLmFuZHJvaWQuZ2RhdGEuY2xpZW50LkFuZHJvaWRHRGF0YUNsaWVudCRHZXRSZXF1ZXN0Q3JlYXRvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBjb20uZ29vZ2xlLmFuZHJvaWQuZ2RhdGEuY2xpZW50LkFuZHJvaWRHRGF0YUNsaWVudCRIdHRwUmVxdWVzdENyZWF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5tZXRob2RzLkh0dHBVcmlSZXF1ZXN0IGNyZWF0ZVJlcXVlc3QoCi1qYXZhLm5ldC5VUkkpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1NZWRpYVB1dFJlcXVlc3RDcmVhdG9yICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vZ29vZ2xlL2FuZHJvaWQvZ2RhdGEvY2xpZW50L0FuZHJvaWRHRGF0YUNsaWVudDsgKQotIGNsYXNzIGNvbS5nb29nbGUuYW5kcm9pZC5nZGF0YS5jbGllbnQuQW5kcm9pZEdEYXRhQ2xpZW50JE1lZGlhUHV0UmVxdWVzdENyZWF0b3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgY29tLmdvb2dsZS5hbmRyb2lkLmdkYXRhLmNsaWVudC5BbmRyb2lkR0RhdGFDbGllbnQkSHR0cFJlcXVlc3RDcmVhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBtQ29udGVudFR5cGUKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmlvLklucHV0U3RyZWFtIG1NZWRpYUlucHV0U3RyZWFtCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5JbnB1dFN0cmVhbQotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcy5IdHRwVXJpUmVxdWVzdCBjcmVhdGVSZXF1ZXN0KAotamF2YS5uZXQuVVJJKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9UG9zdFJlcXVlc3RDcmVhdG9yICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vZ29vZ2xlL2FuZHJvaWQvZ2RhdGEvY2xpZW50L0FuZHJvaWRHRGF0YUNsaWVudDsgKQotIGNsYXNzIGNvbS5nb29nbGUuYW5kcm9pZC5nZGF0YS5jbGllbnQuQW5kcm9pZEdEYXRhQ2xpZW50JFBvc3RSZXF1ZXN0Q3JlYXRvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBjb20uZ29vZ2xlLmFuZHJvaWQuZ2RhdGEuY2xpZW50LkFuZHJvaWRHRGF0YUNsaWVudCRIdHRwUmVxdWVzdENyZWF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuSHR0cEVudGl0eSBtRW50aXR5Ci0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBtTWV0aG9kT3ZlcnJpZGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1vcmcuYXBhY2hlLmh0dHAuSHR0cEVudGl0eSkKLQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcy5IdHRwVXJpUmVxdWVzdCBjcmVhdGVSZXF1ZXN0KAotamF2YS5uZXQuVVJJKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGNvbS9nb29nbGUvYW5kcm9pZC9nZGF0YS9jbGllbnQvQW5kcm9pZEdEYXRhQ2xpZW50JE1lZGlhUHV0UmVxdWVzdENyZWF0b3I7TGNvbS9nb29nbGUvYW5kcm9pZC9nZGF0YS9jbGllbnQvQW5kcm9pZEdEYXRhQ2xpZW50JFBvc3RSZXF1ZXN0Q3JlYXRvcjtMY29tL2dvb2dsZS9hbmRyb2lkL2dkYXRhL2NsaWVudC9BbmRyb2lkR0RhdGFDbGllbnQkR2V0UmVxdWVzdENyZWF0b3I7TGNvbS9nb29nbGUvYW5kcm9pZC9nZGF0YS9jbGllbnQvQW5kcm9pZEdEYXRhQ2xpZW50JEh0dHBSZXF1ZXN0Q3JlYXRvcjsgKQotcHVibGljIGNsYXNzIGNvbS5nb29nbGUuYW5kcm9pZC5nZGF0YS5jbGllbnQuQW5kcm9pZEdEYXRhQ2xpZW50IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGNvbS5nb29nbGUud2lyZWxlc3MuZ2RhdGEuY2xpZW50LkdEYXRhQ2xpZW50Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0NBTF9MT0dWCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfUkVESVJFQ1RTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEFHCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVVNFUl9BR0VOVF9HWklQCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgWF9IVFRQX01FVEhPRF9PVkVSUklERQotCi1wcml2YXRlIGZpbmFsIGNvbS5nb29nbGUuYW5kcm9pZC5uZXQuR29vZ2xlSHR0cENsaWVudCBtSHR0cENsaWVudAotCi1wcml2YXRlIGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIgbVJlc29sdmVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxjb20vZ29vZ2xlL3dpcmVsZXNzL2dkYXRhL2NsaWVudC9IdHRwRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIGphdmEuaW8uSW5wdXRTdHJlYW0gY3JlYXRlQW5kRXhlY3V0ZU1ldGhvZCgKLWNvbS5nb29nbGUuYW5kcm9pZC5nZGF0YS5jbGllbnQuQW5kcm9pZEdEYXRhQ2xpZW50JEh0dHBSZXF1ZXN0Q3JlYXRvcgotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBvcmcuYXBhY2hlLmh0dHAuSHR0cEVudGl0eSBjcmVhdGVFbnRpdHlGb3JFbnRyeSgKLWNvbS5nb29nbGUud2lyZWxlc3MuZ2RhdGEuc2VyaWFsaXplci5HRGF0YVNlcmlhbGl6ZXIKLWludCkKLQotcHVibGljIHZvaWQgY2xvc2UoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxjb20vZ29vZ2xlL3dpcmVsZXNzL2dkYXRhL2NsaWVudC9IdHRwRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5pby5JbnB1dFN0cmVhbSBjcmVhdGVFbnRyeSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWNvbS5nb29nbGUud2lyZWxlc3MuZ2RhdGEuc2VyaWFsaXplci5HRGF0YVNlcmlhbGl6ZXIpCi0KLXB1YmxpYyBjb20uZ29vZ2xlLndpcmVsZXNzLmdkYXRhLmNsaWVudC5RdWVyeVBhcmFtcyBjcmVhdGVRdWVyeVBhcmFtcygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGNvbS9nb29nbGUvd2lyZWxlc3MvZ2RhdGEvY2xpZW50L0h0dHBFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGRlbGV0ZUVudHJ5KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZW5jb2RlVXJpKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MY29tL2dvb2dsZS93aXJlbGVzcy9nZGF0YS9jbGllbnQvSHR0cEV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuaW8uSW5wdXRTdHJlYW0gZ2V0RmVlZEFzU3RyZWFtKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MY29tL2dvb2dsZS93aXJlbGVzcy9nZGF0YS9jbGllbnQvSHR0cEV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuaW8uSW5wdXRTdHJlYW0gZ2V0TWVkaWFFbnRyeUFzU3RyZWFtKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MY29tL2dvb2dsZS93aXJlbGVzcy9nZGF0YS9jbGllbnQvSHR0cEV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuaW8uSW5wdXRTdHJlYW0gdXBkYXRlRW50cnkoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1jb20uZ29vZ2xlLndpcmVsZXNzLmdkYXRhLnNlcmlhbGl6ZXIuR0RhdGFTZXJpYWxpemVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxjb20vZ29vZ2xlL3dpcmVsZXNzL2dkYXRhL2NsaWVudC9IdHRwRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5pby5JbnB1dFN0cmVhbSB1cGRhdGVNZWRpYUVudHJ5KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5pby5JbnB1dFN0cmVhbQotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBjb20uZ29vZ2xlLmFuZHJvaWQuZ2RhdGEuY2xpZW50LkFuZHJvaWRYbWxQYXJzZXJGYWN0b3J5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGNvbS5nb29nbGUud2lyZWxlc3MuZ2RhdGEucGFyc2VyLnhtbC5YbWxQYXJzZXJGYWN0b3J5Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsgKQotcHVibGljIG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXIgY3JlYXRlUGFyc2VyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsgKQotcHVibGljIG9yZy54bWxwdWxsLnYxLlhtbFNlcmlhbGl6ZXIgY3JlYXRlU2VyaWFsaXplcigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgY29tLmdvb2dsZS5hbmRyb2lkLmdkYXRhLmNsaWVudC5RdWVyeVBhcmFtc0ltcGwgZXh0ZW5kcyBjb20uZ29vZ2xlLndpcmVsZXNzLmdkYXRhLmNsaWVudC5RdWVyeVBhcmFtcwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXByaXZhdGUgZmluYWwgamF2YS51dGlsLk1hcCBtUGFyYW1zCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgY2xlYXIoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVF1ZXJ5VXJsKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UGFyYW1WYWx1ZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHNldFBhcmFtVmFsdWUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I8TGNvbS9nb29nbGUvYW5kcm9pZC9nb29nbGVhcHBzL0dvb2dsZUxvZ2luQ3JlZGVudGlhbHNSZXN1bHQ7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9nb29nbGUvYW5kcm9pZC9nb29nbGVhcHBzL0dvb2dsZUxvZ2luQ3JlZGVudGlhbHNSZXN1bHQ7ICkKLWZpbmFsIGNsYXNzIGNvbS5nb29nbGUuYW5kcm9pZC5nb29nbGVhcHBzLkdvb2dsZUxvZ2luQ3JlZGVudGlhbHNSZXN1bHQkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBjb20uZ29vZ2xlLmFuZHJvaWQuZ29vZ2xlYXBwcy5Hb29nbGVMb2dpbkNyZWRlbnRpYWxzUmVzdWx0IGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgY29tLmdvb2dsZS5hbmRyb2lkLmdvb2dsZWFwcHMuR29vZ2xlTG9naW5DcmVkZW50aWFsc1Jlc3VsdFtdIG5ld0FycmF5KAotaW50KQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdFtdIG5ld0FycmF5KAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGNvbS5nb29nbGUuYW5kcm9pZC5nb29nbGVhcHBzLkdvb2dsZUxvZ2luQ3JlZGVudGlhbHNSZXN1bHQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExjb20vZ29vZ2xlL2FuZHJvaWQvZ29vZ2xlYXBwcy9Hb29nbGVMb2dpbkNyZWRlbnRpYWxzUmVzdWx0Oz47ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IgQ1JFQVRPUgotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbUFjY291bnQKLQotcHJpdmF0ZSBhbmRyb2lkLmNvbnRlbnQuSW50ZW50IG1DcmVkZW50aWFsc0ludGVudAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbUNyZWRlbnRpYWxzU3RyaW5nCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuUGFyY2VsCi1jb20uZ29vZ2xlLmFuZHJvaWQuZ29vZ2xlYXBwcy5Hb29nbGVMb2dpbkNyZWRlbnRpYWxzUmVzdWx0JDEpCi0KLXB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEFjY291bnQoKQotCi1wdWJsaWMgYW5kcm9pZC5jb250ZW50LkludGVudCBnZXRDcmVkZW50aWFsc0ludGVudCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldENyZWRlbnRpYWxzU3RyaW5nKCkKLQotcHVibGljIHZvaWQgcmVhZEZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIHZvaWQgc2V0QWNjb3VudCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHNldENyZWRlbnRpYWxzSW50ZW50KAotYW5kcm9pZC5jb250ZW50LkludGVudCkKLQotcHVibGljIHZvaWQgc2V0Q3JlZGVudGlhbHNTdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi0gY2xhc3MgY29tLmdvb2dsZS5hbmRyb2lkLmdvb2dsZWFwcHMuR29vZ2xlTG9naW5TZXJ2aWNlQmxvY2tpbmdIZWxwZXIkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLmNvbnRlbnQuU2VydmljZUNvbm5lY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgY29tLmdvb2dsZS5hbmRyb2lkLmdvb2dsZWFwcHMuR29vZ2xlTG9naW5TZXJ2aWNlQmxvY2tpbmdIZWxwZXIgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotY29tLmdvb2dsZS5hbmRyb2lkLmdvb2dsZWFwcHMuR29vZ2xlTG9naW5TZXJ2aWNlQmxvY2tpbmdIZWxwZXIpCi0KLXB1YmxpYyB2b2lkIG9uU2VydmljZUNvbm5lY3RlZCgKLWFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXB1YmxpYyB2b2lkIG9uU2VydmljZURpc2Nvbm5lY3RlZCgKLWFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MSBuYW1lID1BdXRoZW50aWNhdGlvbkV4Y2VwdGlvbiApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2dvb2dsZS9hbmRyb2lkL2dvb2dsZWFwcHMvR29vZ2xlTG9naW5TZXJ2aWNlQmxvY2tpbmdIZWxwZXI7ICkKLXB1YmxpYyBjbGFzcyBjb20uZ29vZ2xlLmFuZHJvaWQuZ29vZ2xlYXBwcy5Hb29nbGVMb2dpblNlcnZpY2VCbG9ja2luZ0hlbHBlciRBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5FeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgY29tLmdvb2dsZS5hbmRyb2lkLmdvb2dsZWFwcHMuR29vZ2xlTG9naW5TZXJ2aWNlQmxvY2tpbmdIZWxwZXIgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotY29tLmdvb2dsZS5hbmRyb2lkLmdvb2dsZWFwcHMuR29vZ2xlTG9naW5TZXJ2aWNlQmxvY2tpbmdIZWxwZXIpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWNvbS5nb29nbGUuYW5kcm9pZC5nb29nbGVhcHBzLkdvb2dsZUxvZ2luU2VydmljZUJsb2NraW5nSGVscGVyCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1jb20uZ29vZ2xlLmFuZHJvaWQuZ29vZ2xlYXBwcy5Hb29nbGVMb2dpblNlcnZpY2VCbG9ja2luZ0hlbHBlcgotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlRocm93YWJsZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotY29tLmdvb2dsZS5hbmRyb2lkLmdvb2dsZWFwcHMuR29vZ2xlTG9naW5TZXJ2aWNlQmxvY2tpbmdIZWxwZXIKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MY29tL2dvb2dsZS9hbmRyb2lkL2dvb2dsZWFwcHMvR29vZ2xlTG9naW5TZXJ2aWNlQmxvY2tpbmdIZWxwZXIkQXV0aGVudGljYXRpb25FeGNlcHRpb247ICkKLXB1YmxpYyBjbGFzcyBjb20uZ29vZ2xlLmFuZHJvaWQuZ29vZ2xlYXBwcy5Hb29nbGVMb2dpblNlcnZpY2VCbG9ja2luZ0hlbHBlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQUcKLQotcHJpdmF0ZSBmaW5hbCBkb3VibGUgbUJhY2tvZmZGYWN0b3IKLQotcHJpdmF0ZSBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5Db25kaXRpb24gbUJpbmRXYWl0Q29uZGl0aW9uCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgbUNvbnRleHQKLQotcHJpdmF0ZSBpbnQgbURlbGF5Ci0KLXByaXZhdGUgdm9sYXRpbGUgY29tLmdvb2dsZS5hbmRyb2lkLmdvb2dsZWFwcHMuSUdvb2dsZUxvZ2luU2VydmljZSBtR29vZ2xlTG9naW5TZXJ2aWNlCi0KLXByaXZhdGUgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuTG9jayBtR29vZ2xlTG9naW5TZXJ2aWNlTG9jawotCi1wcml2YXRlIGZpbmFsIGludCBtTWF4RGVsYXlTZWNzCi0KLXByaXZhdGUgZmluYWwgaW50IG1NaW5EZWxheVNlY3MKLQotcHJpdmF0ZSBhbmRyb2lkLmNvbnRlbnQuU2VydmljZUNvbm5lY3Rpb24gbVNlcnZpY2VDb25uZWN0aW9uCi0KLXByaXZhdGUgamF2YS5sYW5nLlRocmVhZCBtU2VydmljZVRocmVhZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1zdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuTG9jayBhY2Nlc3MkMDAwKAotY29tLmdvb2dsZS5hbmRyb2lkLmdvb2dsZWFwcHMuR29vZ2xlTG9naW5TZXJ2aWNlQmxvY2tpbmdIZWxwZXIpCi0KLXN0YXRpYyBqYXZhLmxhbmcuVGhyZWFkIGFjY2VzcyQxMDIoCi1jb20uZ29vZ2xlLmFuZHJvaWQuZ29vZ2xlYXBwcy5Hb29nbGVMb2dpblNlcnZpY2VCbG9ja2luZ0hlbHBlcgotamF2YS5sYW5nLlRocmVhZCkKLQotc3RhdGljIGNvbS5nb29nbGUuYW5kcm9pZC5nb29nbGVhcHBzLklHb29nbGVMb2dpblNlcnZpY2UgYWNjZXNzJDIwMigKLWNvbS5nb29nbGUuYW5kcm9pZC5nb29nbGVhcHBzLkdvb2dsZUxvZ2luU2VydmljZUJsb2NraW5nSGVscGVyCi1jb20uZ29vZ2xlLmFuZHJvaWQuZ29vZ2xlYXBwcy5JR29vZ2xlTG9naW5TZXJ2aWNlKQotCi1zdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuQ29uZGl0aW9uIGFjY2VzcyQzMDAoCi1jb20uZ29vZ2xlLmFuZHJvaWQuZ29vZ2xlYXBwcy5Hb29nbGVMb2dpblNlcnZpY2VCbG9ja2luZ0hlbHBlcikKLQotcHJpdmF0ZSB2b2lkIGRlbGF5KCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEFjY291bnQoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotYm9vbGVhbikKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0QWNjb3VudHMoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotcHVibGljIHN0YXRpYyBsb25nIGdldEFuZHJvaWRJZCgKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxjb20vZ29vZ2xlL2FuZHJvaWQvZ29vZ2xlYXBwcy9Hb29nbGVMb2dpblNlcnZpY2VCbG9ja2luZ0hlbHBlciRBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEF1dGhUb2tlbigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxjb20vZ29vZ2xlL2FuZHJvaWQvZ29vZ2xlYXBwcy9Hb29nbGVMb2dpblNlcnZpY2VCbG9ja2luZ0hlbHBlciRBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE9uZUF1dGhUb2tlbigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgaW52YWxpZGF0ZUF1dGhUb2tlbigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHZvaWQgcmVzZXREZWxheSgpCi0KLXB1YmxpYyB2b2lkIGNsb3NlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QWNjb3VudCgKLWJvb2xlYW4pCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0QWNjb3VudHMoKQotCi1wdWJsaWMgbG9uZyBnZXRBbmRyb2lkSWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxjb20vZ29vZ2xlL2FuZHJvaWQvZ29vZ2xlYXBwcy9Hb29nbGVMb2dpblNlcnZpY2VCbG9ja2luZ0hlbHBlciRBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QXV0aFRva2VuKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGNvbS5nb29nbGUuYW5kcm9pZC5nb29nbGVhcHBzLkdvb2dsZUxvZ2luQ3JlZGVudGlhbHNSZXN1bHQgZ2V0Q3JlZGVudGlhbHMoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuKQotCi1wdWJsaWMgY29tLmdvb2dsZS5hbmRyb2lkLmdvb2dsZWFwcHMuSUdvb2dsZUxvZ2luU2VydmljZSBnZXRMb2dpblNlcnZpY2UoKQotCi1wdWJsaWMgdm9pZCBpbnZhbGlkYXRlQXV0aFRva2VuKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgcGVla0NyZWRlbnRpYWxzKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBjb20uZ29vZ2xlLmFuZHJvaWQuZ29vZ2xlYXBwcy5Hb29nbGVMb2dpblNlcnZpY2VDb25zdGFudHMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBQ0NPVU5UU19LRVkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFVVEhUT0tFTl9LRVkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFVVEhfQUNDT1VOVF9LRVkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19HT09HTEVfQUNDT1VOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX0hPU1RFRF9BQ0NPVU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBQUkVGRVJfSE9TVEVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSRVFVRVNUX0VYVFJBUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gUkVRVUlSRV9HT09HTEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50IFNFUlZJQ0VfSU5URU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBZT1VUVUJFX1VTRVJfS0VZCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1maW5hbCBjbGFzcyBjb20uZ29vZ2xlLmFuZHJvaWQuZ29vZ2xlYXBwcy5Hb29nbGVMb2dpblNlcnZpY2VIZWxwZXIkMSBleHRlbmRzIGphdmEubGFuZy5UaHJlYWQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYW5kcm9pZC5hcHAuQWN0aXZpdHkgdmFsJGFjdGl2aXR5Ci0KLWZpbmFsIGFuZHJvaWQub3MuSGFuZGxlciB2YWwkaGFuZGxlcgotCi1maW5hbCBpbnQgdmFsJHJlcXVlc3RDb2RlCi0KLWZpbmFsIGJvb2xlYW4gdmFsJHJlcXVpcmVHb29nbGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmFwcC5BY3Rpdml0eQotYm9vbGVhbgotYW5kcm9pZC5vcy5IYW5kbGVyCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotIGNsYXNzIGNvbS5nb29nbGUuYW5kcm9pZC5nb29nbGVhcHBzLkdvb2dsZUxvZ2luU2VydmljZUhlbHBlciQyJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5sYW5nLlJ1bm5hYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGNvbS5nb29nbGUuYW5kcm9pZC5nb29nbGVhcHBzLkdvb2dsZUxvZ2luU2VydmljZUhlbHBlciQyIHRoaXMkMAotCi1maW5hbCBjb20uZ29vZ2xlLmFuZHJvaWQuZ29vZ2xlYXBwcy5Hb29nbGVMb2dpbkNyZWRlbnRpYWxzUmVzdWx0IHZhbCRjcmVkZW50aWFsc1Jlc3VsdAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWNvbS5nb29nbGUuYW5kcm9pZC5nb29nbGVhcHBzLkdvb2dsZUxvZ2luU2VydmljZUhlbHBlciQyCi1jb20uZ29vZ2xlLmFuZHJvaWQuZ29vZ2xlYXBwcy5Hb29nbGVMb2dpbkNyZWRlbnRpYWxzUmVzdWx0KQotCi1wdWJsaWMgdm9pZCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLWZpbmFsIGNsYXNzIGNvbS5nb29nbGUuYW5kcm9pZC5nb29nbGVhcHBzLkdvb2dsZUxvZ2luU2VydmljZUhlbHBlciQyIGV4dGVuZHMgamF2YS5sYW5nLlRocmVhZAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLmFwcC5BY3Rpdml0eSB2YWwkYWN0aXZpdHkKLQotZmluYWwgYW5kcm9pZC5vcy5IYW5kbGVyIHZhbCRoYW5kbGVyCi0KLWZpbmFsIGJvb2xlYW4gdmFsJHByb21wdFVzZXIKLQotZmluYWwgaW50IHZhbCRyZXF1ZXN0Q29kZQotCi1maW5hbCBhbmRyb2lkLm9zLkJ1bmRsZSB2YWwkcmVxdWVzdEV4dHJhcwotCi1maW5hbCBib29sZWFuIHZhbCRyZXF1aXJlR29vZ2xlCi0KLWZpbmFsIGphdmEubGFuZy5TdHJpbmcgdmFsJHNlcnZpY2UKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmFwcC5BY3Rpdml0eQotYm9vbGVhbgotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbgotYW5kcm9pZC5vcy5CdW5kbGUKLWFuZHJvaWQub3MuSGFuZGxlcgotaW50KQotCi1wdWJsaWMgdm9pZCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLWZpbmFsIGNsYXNzIGNvbS5nb29nbGUuYW5kcm9pZC5nb29nbGVhcHBzLkdvb2dsZUxvZ2luU2VydmljZUhlbHBlciQzIGV4dGVuZHMgamF2YS5sYW5nLlRocmVhZAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLmFwcC5BY3Rpdml0eSB2YWwkYWN0aXZpdHkKLQotZmluYWwgamF2YS5sYW5nLlN0cmluZyB2YWwkYXV0aFRva2VuCi0KLWZpbmFsIGFuZHJvaWQub3MuSGFuZGxlciB2YWwkaGFuZGxlcgotCi1maW5hbCBpbnQgdmFsJHJlcXVlc3RDb2RlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5hcHAuQWN0aXZpdHkKLWphdmEubGFuZy5TdHJpbmcKLWFuZHJvaWQub3MuSGFuZGxlcgotaW50KQotCi1wdWJsaWMgdm9pZCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLWZpbmFsIGNsYXNzIGNvbS5nb29nbGUuYW5kcm9pZC5nb29nbGVhcHBzLkdvb2dsZUxvZ2luU2VydmljZUhlbHBlciQ0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5SdW5uYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBhbmRyb2lkLmFwcC5BY3Rpdml0eSB2YWwkYWN0aXZpdHkKLQotZmluYWwgYW5kcm9pZC5vcy5CdW5kbGUgdmFsJGJ1bmRsZQotCi1maW5hbCBpbnQgdmFsJHJlcXVlc3RDb2RlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5hcHAuQWN0aXZpdHkKLWludAotYW5kcm9pZC5vcy5CdW5kbGUpCi0KLXB1YmxpYyB2b2lkIHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgY29tLmdvb2dsZS5hbmRyb2lkLmdvb2dsZWFwcHMuR29vZ2xlTG9naW5TZXJ2aWNlSGVscGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gTE9DQUxfTE9HVgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRBRwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMDAwKAotYW5kcm9pZC5vcy5IYW5kbGVyCi1hbmRyb2lkLmFwcC5BY3Rpdml0eQotaW50Ci1hbmRyb2lkLm9zLkJ1bmRsZSkKLQotc3RhdGljIHZvaWQgYWNjZXNzJDEwMCgKLWFuZHJvaWQuYXBwLkFjdGl2aXR5Ci1pbnQKLWFuZHJvaWQub3MuQnVuZGxlKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgZ2V0QWNjb3VudCgKLWFuZHJvaWQuYXBwLkFjdGl2aXR5Ci1pbnQKLWJvb2xlYW4pCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRDcmVkZW50aWFscygKLWFuZHJvaWQuYXBwLkFjdGl2aXR5Ci1pbnQKLWFuZHJvaWQub3MuQnVuZGxlCi1ib29sZWFuCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgaW52YWxpZGF0ZUF1dGhUb2tlbigKLWFuZHJvaWQuYXBwLkFjdGl2aXR5Ci1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgcG9zdEFjdGl2aXR5UmVzdWx0KAotYW5kcm9pZC5vcy5IYW5kbGVyCi1hbmRyb2lkLmFwcC5BY3Rpdml0eQotaW50Ci1hbmRyb2lkLm9zLkJ1bmRsZSkKLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZW5kQWN0aXZpdHlSZXN1bHQoCi1hbmRyb2lkLmFwcC5BY3Rpdml0eQotaW50Ci1hbmRyb2lkLm9zLkJ1bmRsZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxjb20vZ29vZ2xlL2FuZHJvaWQvZ29vZ2xlYXBwcy9JR29vZ2xlTG9naW5TZXJ2aWNlJFN0dWI7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgY29tLmdvb2dsZS5hbmRyb2lkLmdvb2dsZWFwcHMuSUdvb2dsZUxvZ2luU2VydmljZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLklJbnRlcmZhY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGNvbS5nb29nbGUuYW5kcm9pZC5nb29nbGVhcHBzLkdvb2dsZUxvZ2luQ3JlZGVudGlhbHNSZXN1bHQgYmxvY2tpbmdHZXRDcmVkZW50aWFscygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBkZWxldGVBbGxBY2NvdW50cygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBkZWxldGVPbmVBY2NvdW50KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldEFjY291bnQoCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmdbXSBnZXRBY2NvdW50cygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgbG9uZyBnZXRBbmRyb2lkSWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0UHJpbWFyeUFjY291bnQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgaW52YWxpZGF0ZUF1dGhUb2tlbigKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBwZWVrQ3JlZGVudGlhbHMoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2F2ZUF1dGhUb2tlbigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzYXZlTmV3QWNjb3VudCgKLWNvbS5nb29nbGUuYW5kcm9pZC5nb29nbGVhcHBzLkxvZ2luRGF0YSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNhdmVVc2VybmFtZUFuZFBhc3N3b3JkKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgdHJ5TmV3QWNjb3VudCgKLWNvbS5nb29nbGUuYW5kcm9pZC5nb29nbGVhcHBzLkxvZ2luRGF0YSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHVwZGF0ZVBhc3N3b3JkKAotY29tLmdvb2dsZS5hbmRyb2lkLmdvb2dsZWFwcHMuTG9naW5EYXRhKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gdmVyaWZ5U3RvcmVkUGFzc3dvcmQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9UHJveHkgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9nb29nbGUvYW5kcm9pZC9nb29nbGVhcHBzL0lHb29nbGVMb2dpblNlcnZpY2UkU3R1YjsgKQotIGNsYXNzIGNvbS5nb29nbGUuYW5kcm9pZC5nb29nbGVhcHBzLklHb29nbGVMb2dpblNlcnZpY2UkU3R1YiRQcm94eSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBjb20uZ29vZ2xlLmFuZHJvaWQuZ29vZ2xlYXBwcy5JR29vZ2xlTG9naW5TZXJ2aWNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYW5kcm9pZC5vcy5JQmluZGVyIG1SZW1vdGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1hbmRyb2lkLm9zLklCaW5kZXIpCi0KLXB1YmxpYyBhbmRyb2lkLm9zLklCaW5kZXIgYXNCaW5kZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGNvbS5nb29nbGUuYW5kcm9pZC5nb29nbGVhcHBzLkdvb2dsZUxvZ2luQ3JlZGVudGlhbHNSZXN1bHQgYmxvY2tpbmdHZXRDcmVkZW50aWFscygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBkZWxldGVBbGxBY2NvdW50cygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBkZWxldGVPbmVBY2NvdW50KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEFjY291bnQoCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBnZXRBY2NvdW50cygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgbG9uZyBnZXRBbmRyb2lkSWQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFByaW1hcnlBY2NvdW50KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGludmFsaWRhdGVBdXRoVG9rZW4oCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgcGVla0NyZWRlbnRpYWxzKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNhdmVBdXRoVG9rZW4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2F2ZU5ld0FjY291bnQoCi1jb20uZ29vZ2xlLmFuZHJvaWQuZ29vZ2xlYXBwcy5Mb2dpbkRhdGEpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzYXZlVXNlcm5hbWVBbmRQYXNzd29yZCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHRyeU5ld0FjY291bnQoCi1jb20uZ29vZ2xlLmFuZHJvaWQuZ29vZ2xlYXBwcy5Mb2dpbkRhdGEpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB1cGRhdGVQYXNzd29yZCgKLWNvbS5nb29nbGUuYW5kcm9pZC5nb29nbGVhcHBzLkxvZ2luRGF0YSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIHZlcmlmeVN0b3JlZFBhc3N3b3JkKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxjb20vZ29vZ2xlL2FuZHJvaWQvZ29vZ2xlYXBwcy9JR29vZ2xlTG9naW5TZXJ2aWNlJFN0dWIkUHJveHk7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vZ29vZ2xlL2FuZHJvaWQvZ29vZ2xlYXBwcy9JR29vZ2xlTG9naW5TZXJ2aWNlOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwMzMgbmFtZSA9U3R1YiApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgY29tLmdvb2dsZS5hbmRyb2lkLmdvb2dsZWFwcHMuSUdvb2dsZUxvZ2luU2VydmljZSRTdHViIGV4dGVuZHMgYW5kcm9pZC5vcy5CaW5kZXIgaW1wbGVtZW50cyBjb20uZ29vZ2xlLmFuZHJvaWQuZ29vZ2xlYXBwcy5JR29vZ2xlTG9naW5TZXJ2aWNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVTQ1JJUFRPUgotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2Jsb2NraW5nR2V0Q3JlZGVudGlhbHMKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9kZWxldGVBbGxBY2NvdW50cwotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2RlbGV0ZU9uZUFjY291bnQKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9nZXRBY2NvdW50Ci0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fZ2V0QWNjb3VudHMKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9nZXRBbmRyb2lkSWQKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9nZXRQcmltYXJ5QWNjb3VudAotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX2ludmFsaWRhdGVBdXRoVG9rZW4KLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9wZWVrQ3JlZGVudGlhbHMKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9zYXZlQXV0aFRva2VuCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fc2F2ZU5ld0FjY291bnQKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9zYXZlVXNlcm5hbWVBbmRQYXNzd29yZAotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3RyeU5ld0FjY291bnQKLQotc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl91cGRhdGVQYXNzd29yZAotCi1zdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX3ZlcmlmeVN0b3JlZFBhc3N3b3JkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBjb20uZ29vZ2xlLmFuZHJvaWQuZ29vZ2xlYXBwcy5JR29vZ2xlTG9naW5TZXJ2aWNlIGFzSW50ZXJmYWNlKAotYW5kcm9pZC5vcy5JQmluZGVyKQotCi1wdWJsaWMgYW5kcm9pZC5vcy5JQmluZGVyIGFzQmluZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIG9uVHJhbnNhY3QoCi1pbnQKLWFuZHJvaWQub3MuUGFyY2VsCi1hbmRyb2lkLm9zLlBhcmNlbAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I8TGNvbS9nb29nbGUvYW5kcm9pZC9nb29nbGVhcHBzL0xvZ2luRGF0YTs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2dvb2dsZS9hbmRyb2lkL2dvb2dsZWFwcHMvTG9naW5EYXRhOyApCi1maW5hbCBjbGFzcyBjb20uZ29vZ2xlLmFuZHJvaWQuZ29vZ2xlYXBwcy5Mb2dpbkRhdGEkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBjb20uZ29vZ2xlLmFuZHJvaWQuZ29vZ2xlYXBwcy5Mb2dpbkRhdGEgY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyBjb20uZ29vZ2xlLmFuZHJvaWQuZ29vZ2xlYXBwcy5Mb2dpbkRhdGFbXSBuZXdBcnJheSgKLWludCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3RbXSBuZXdBcnJheSgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2dvb2dsZS9hbmRyb2lkL2dvb2dsZWFwcHMvTG9naW5EYXRhOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE2NDA5IG5hbWUgPVN0YXR1cyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9FbnVtPExjb20vZ29vZ2xlL2FuZHJvaWQvZ29vZ2xlYXBwcy9Mb2dpbkRhdGEkU3RhdHVzOz47ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBjb20uZ29vZ2xlLmFuZHJvaWQuZ29vZ2xlYXBwcy5Mb2dpbkRhdGEkU3RhdHVzIGV4dGVuZHMgamF2YS5sYW5nLkVudW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgY29tLmdvb2dsZS5hbmRyb2lkLmdvb2dsZWFwcHMuTG9naW5EYXRhJFN0YXR1c1tdICRWQUxVRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uZ29vZ2xlLmFuZHJvaWQuZ29vZ2xlYXBwcy5Mb2dpbkRhdGEkU3RhdHVzIEFDQ09VTlRfRElTQUJMRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uZ29vZ2xlLmFuZHJvaWQuZ29vZ2xlYXBwcy5Mb2dpbkRhdGEkU3RhdHVzIEJBRF9SRVFVRVNUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmdvb2dsZS5hbmRyb2lkLmdvb2dsZWFwcHMuTG9naW5EYXRhJFN0YXR1cyBCQURfVVNFUk5BTUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uZ29vZ2xlLmFuZHJvaWQuZ29vZ2xlYXBwcy5Mb2dpbkRhdGEkU3RhdHVzIENBTkNFTExFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5nb29nbGUuYW5kcm9pZC5nb29nbGVhcHBzLkxvZ2luRGF0YSRTdGF0dXMgQ0FQVENIQQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5nb29nbGUuYW5kcm9pZC5nb29nbGVhcHBzLkxvZ2luRGF0YSRTdGF0dXMgTE9HSU5fRkFJTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5nb29nbGUuYW5kcm9pZC5nb29nbGVhcHBzLkxvZ2luRGF0YSRTdGF0dXMgTUlTU0lOR19BUFBTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmdvb2dsZS5hbmRyb2lkLmdvb2dsZWFwcHMuTG9naW5EYXRhJFN0YXR1cyBORVRXT1JLX0VSUk9SCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmdvb2dsZS5hbmRyb2lkLmdvb2dsZWFwcHMuTG9naW5EYXRhJFN0YXR1cyBOT19HTUFJTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5nb29nbGUuYW5kcm9pZC5nb29nbGVhcHBzLkxvZ2luRGF0YSRTdGF0dXMgU0VSVkVSX0VSUk9SCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmdvb2dsZS5hbmRyb2lkLmdvb2dsZWFwcHMuTG9naW5EYXRhJFN0YXR1cyBTVUNDRVNTCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpViApCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgc3RhdGljIGNvbS5nb29nbGUuYW5kcm9pZC5nb29nbGVhcHBzLkxvZ2luRGF0YSRTdGF0dXMgdmFsdWVPZigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgY29tLmdvb2dsZS5hbmRyb2lkLmdvb2dsZWFwcHMuTG9naW5EYXRhJFN0YXR1c1tdIHZhbHVlcygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MY29tL2dvb2dsZS9hbmRyb2lkL2dvb2dsZWFwcHMvTG9naW5EYXRhJFN0YXR1czsgKQotcHVibGljIGNsYXNzIGNvbS5nb29nbGUuYW5kcm9pZC5nb29nbGVhcHBzLkxvZ2luRGF0YSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I8TGNvbS9nb29nbGUvYW5kcm9pZC9nb29nbGVhcHBzL0xvZ2luRGF0YTs+OyApCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yIENSRUFUT1IKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgbUF1dGh0b2tlbgotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBtQ2FwdGNoYUFuc3dlcgotCi1wdWJsaWMgYnl0ZVtdIG1DYXB0Y2hhRGF0YQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBtQ2FwdGNoYU1pbWVUeXBlCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIG1DYXB0Y2hhVG9rZW4KLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgbUVuY3J5cHRlZFBhc3N3b3JkCi0KLXB1YmxpYyBpbnQgbUZsYWdzCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIG1Kc29uU3RyaW5nCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIG1QYXNzd29yZAotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBtU2VydmljZQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBtU2lkCi0KLXB1YmxpYyBjb20uZ29vZ2xlLmFuZHJvaWQuZ29vZ2xlYXBwcy5Mb2dpbkRhdGEkU3RhdHVzIG1TdGF0dXMKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgbVVzZXJuYW1lCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLSB2b2lkIDxpbml0PigKLWFuZHJvaWQub3MuUGFyY2VsCi1jb20uZ29vZ2xlLmFuZHJvaWQuZ29vZ2xlYXBwcy5Mb2dpbkRhdGEkMSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotY29tLmdvb2dsZS5hbmRyb2lkLmdvb2dsZWFwcHMuTG9naW5EYXRhKQotCi1wdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBkdW1wKCkKLQotcHVibGljIHZvaWQgcmVhZEZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgY29tLmdvb2dsZS5hbmRyb2lkLmdvb2dsZWFwcHMuTXNpc2RuVG9rZW5GZXRjaGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1RPS0VOX0xFTkdUSAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1TSVNETl9VUkwKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQVVJQT1NFX1BBUkFNCi0KLXByaXZhdGUgZmluYWwgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlciBtQ29udGVudFJlc29sdmVyCi0KLXByaXZhdGUgZmluYWwgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5IdHRwQ2xpZW50IG1IdHRwQ2xpZW50Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcgotb3JnLmFwYWNoZS5odHRwLmNsaWVudC5IdHRwQ2xpZW50KQotCi1wcml2YXRlIG9yZy5hcGFjaGUuaHR0cC5IdHRwSG9zdCBjcmVhdGVQcm94eSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TG9yZy9hcGFjaGUvaHR0cC9IdHRwRXhjZXB0aW9uOyApCi1wdWJsaWMgYnl0ZVtdIGdldFRva2VuKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMQ29uZmlnIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgY29tLmdvb2dsZS5hbmRyb2lkLmpzcjIzOS5FR0xDb25maWdJbXBsIGV4dGVuZHMgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbmZpZwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGludCBtRUdMQ29uZmlnCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotaW50KQotCi0gaW50IGdldCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbnRleHQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0wgRUdMX0lOU1RBTkNFCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0wgZ2V0RUdMKCkKLQotcHVibGljIGFic3RyYWN0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMIGdldEdMKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBjb20uZ29vZ2xlLmFuZHJvaWQuanNyMjM5LkVHTENvbnRleHRJbXBsIGV4dGVuZHMgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbnRleHQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGludCBtRUdMQ29udGV4dAotCi1wcml2YXRlIGNvbS5nb29nbGUuYW5kcm9pZC5qc3IyMzkuR0xJbXBsIG1HTENvbnRleHQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQpCi0KLXB1YmxpYyBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTCBnZXRHTCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTERpc3BsYXkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBjb20uZ29vZ2xlLmFuZHJvaWQuanNyMjM5LkVHTERpc3BsYXlJbXBsIGV4dGVuZHMgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTERpc3BsYXkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGludCBtRUdMRGlzcGxheQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBjb20uZ29vZ2xlLmFuZHJvaWQuanNyMjM5LkVHTEltcGwgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTDEwCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgY29tLmdvb2dsZS5hbmRyb2lkLmpzcjIzOS5FR0xDb250ZXh0SW1wbCBtQ29udGV4dAotCi1wcml2YXRlIGNvbS5nb29nbGUuYW5kcm9pZC5qc3IyMzkuRUdMRGlzcGxheUltcGwgbURpc3BsYXkKLQotcHJpdmF0ZSBjb20uZ29vZ2xlLmFuZHJvaWQuanNyMjM5LkVHTFN1cmZhY2VJbXBsIG1TdXJmYWNlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIG5hdGl2ZSBpbnQgX2VnbENyZWF0ZUNvbnRleHQoCi1qYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMRGlzcGxheQotamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbmZpZwotamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbnRleHQKLWludFtdKQotCi1wcml2YXRlIG5hdGl2ZSBpbnQgX2VnbENyZWF0ZVBidWZmZXJTdXJmYWNlKAotamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTERpc3BsYXkKLWphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb25maWcKLWludFtdKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIF9lZ2xDcmVhdGVQaXhtYXBTdXJmYWNlKAotamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTFN1cmZhY2UKLWphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xEaXNwbGF5Ci1qYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMQ29uZmlnCi1qYXZhLmxhbmcuT2JqZWN0Ci1pbnRbXSkKLQotcHJpdmF0ZSBuYXRpdmUgaW50IF9lZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKAotamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTERpc3BsYXkKLWphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb25maWcKLWphdmEubGFuZy5PYmplY3QKLWludFtdKQotCi1wcml2YXRlIG5hdGl2ZSBpbnQgX2VnbEdldEN1cnJlbnRDb250ZXh0KCkKLQotcHJpdmF0ZSBuYXRpdmUgaW50IF9lZ2xHZXRDdXJyZW50RGlzcGxheSgpCi0KLXByaXZhdGUgbmF0aXZlIGludCBfZWdsR2V0Q3VycmVudFN1cmZhY2UoCi1pbnQpCi0KLXByaXZhdGUgbmF0aXZlIGludCBfZWdsR2V0RGlzcGxheSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIF9uYXRpdmVDbGFzc0luaXQoKQotCi1wdWJsaWMgbmF0aXZlIGJvb2xlYW4gZWdsQ2hvb3NlQ29uZmlnKAotamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTERpc3BsYXkKLWludFtdCi1qYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMQ29uZmlnW10KLWludAotaW50W10pCi0KLXB1YmxpYyBuYXRpdmUgYm9vbGVhbiBlZ2xDb3B5QnVmZmVycygKLWphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xEaXNwbGF5Ci1qYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMU3VyZmFjZQotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb250ZXh0IGVnbENyZWF0ZUNvbnRleHQoCi1qYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMRGlzcGxheQotamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbmZpZwotamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbnRleHQKLWludFtdKQotCi1wdWJsaWMgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTFN1cmZhY2UgZWdsQ3JlYXRlUGJ1ZmZlclN1cmZhY2UoCi1qYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMRGlzcGxheQotamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbmZpZwotaW50W10pCi0KLXB1YmxpYyBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMU3VyZmFjZSBlZ2xDcmVhdGVQaXhtYXBTdXJmYWNlKAotamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTERpc3BsYXkKLWphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb25maWcKLWphdmEubGFuZy5PYmplY3QKLWludFtdKQotCi1wdWJsaWMgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTFN1cmZhY2UgZWdsQ3JlYXRlV2luZG93U3VyZmFjZSgKLWphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xEaXNwbGF5Ci1qYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMQ29uZmlnCi1qYXZhLmxhbmcuT2JqZWN0Ci1pbnRbXSkKLQotcHVibGljIG5hdGl2ZSBib29sZWFuIGVnbERlc3Ryb3lDb250ZXh0KAotamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTERpc3BsYXkKLWphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb250ZXh0KQotCi1wdWJsaWMgbmF0aXZlIGJvb2xlYW4gZWdsRGVzdHJveVN1cmZhY2UoCi1qYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMRGlzcGxheQotamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTFN1cmZhY2UpCi0KLXB1YmxpYyBuYXRpdmUgYm9vbGVhbiBlZ2xHZXRDb25maWdBdHRyaWIoCi1qYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMRGlzcGxheQotamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbmZpZwotaW50Ci1pbnRbXSkKLQotcHVibGljIG5hdGl2ZSBib29sZWFuIGVnbEdldENvbmZpZ3MoCi1qYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMRGlzcGxheQotamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbmZpZ1tdCi1pbnQKLWludFtdKQotCi1wdWJsaWMgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbnRleHQgZWdsR2V0Q3VycmVudENvbnRleHQoKQotCi1wdWJsaWMgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTERpc3BsYXkgZWdsR2V0Q3VycmVudERpc3BsYXkoKQotCi1wdWJsaWMgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTFN1cmZhY2UgZWdsR2V0Q3VycmVudFN1cmZhY2UoCi1pbnQpCi0KLXB1YmxpYyBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMRGlzcGxheSBlZ2xHZXREaXNwbGF5KAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIG5hdGl2ZSBpbnQgZWdsR2V0RXJyb3IoKQotCi1wdWJsaWMgbmF0aXZlIGJvb2xlYW4gZWdsSW5pdGlhbGl6ZSgKLWphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xEaXNwbGF5Ci1pbnRbXSkKLQotcHVibGljIG5hdGl2ZSBib29sZWFuIGVnbE1ha2VDdXJyZW50KAotamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTERpc3BsYXkKLWphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xTdXJmYWNlCi1qYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMU3VyZmFjZQotamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbnRleHQpCi0KLXB1YmxpYyBuYXRpdmUgYm9vbGVhbiBlZ2xRdWVyeUNvbnRleHQoCi1qYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMRGlzcGxheQotamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbnRleHQKLWludAotaW50W10pCi0KLXB1YmxpYyBuYXRpdmUgamF2YS5sYW5nLlN0cmluZyBlZ2xRdWVyeVN0cmluZygKLWphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xEaXNwbGF5Ci1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgYm9vbGVhbiBlZ2xRdWVyeVN1cmZhY2UoCi1qYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMRGlzcGxheQotamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTFN1cmZhY2UKLWludAotaW50W10pCi0KLXB1YmxpYyBuYXRpdmUgYm9vbGVhbiBlZ2xTd2FwQnVmZmVycygKLWphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xEaXNwbGF5Ci1qYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMU3VyZmFjZSkKLQotcHVibGljIG5hdGl2ZSBib29sZWFuIGVnbFRlcm1pbmF0ZSgKLWphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xEaXNwbGF5KQotCi1wdWJsaWMgbmF0aXZlIGJvb2xlYW4gZWdsV2FpdEdMKCkKLQotcHVibGljIG5hdGl2ZSBib29sZWFuIGVnbFdhaXROYXRpdmUoCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTFN1cmZhY2UgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBjb20uZ29vZ2xlLmFuZHJvaWQuanNyMjM5LkVHTFN1cmZhY2VJbXBsIGV4dGVuZHMgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTFN1cmZhY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGludCBtRUdMU3VyZmFjZQotCi1wcml2YXRlIGludCBtTmF0aXZlUGl4ZWxSZWYKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTFFeHRlbnNpb25QYWNrIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0JMRU5EX0RTVF9BTFBIQQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CTEVORF9EU1RfUkdCCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0JMRU5EX0VRVUFUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0JMRU5EX0VRVUFUSU9OX0FMUEhBCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0JMRU5EX0VRVUFUSU9OX1JHQgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CTEVORF9TUkNfQUxQSEEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQkxFTkRfU1JDX1JHQgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UMF9PRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDEwX09FUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UMTFfT0VTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQxMl9PRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDEzX09FUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UMTRfT0VTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQxNV9PRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDFfT0VTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQyX09FUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UM19PRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDRfT0VTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQ1X09FUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UNl9PRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDdfT0VTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQ4X09FUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UOV9PRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVDUl9XUkFQCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RFUFRIX0FUVEFDSE1FTlRfT0VTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RFUFRIX0NPTVBPTkVOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ERVBUSF9DT01QT05FTlQxNgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ERVBUSF9DT01QT05FTlQyNAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ERVBUSF9DT01QT05FTlQzMgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9OQU1FX09FUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9UWVBFX09FUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfQ1VCRV9NQVBfRkFDRV9PRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0xFVkVMX09FUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GUkFNRUJVRkZFUl9CSU5ESU5HX09FUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GUkFNRUJVRkZFUl9DT01QTEVURV9PRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9BVFRBQ0hNRU5UX09FUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0RJTUVOU0lPTlNfT0VTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRFJBV19CVUZGRVJfT0VTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRk9STUFUU19PRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NSVNTSU5HX0FUVEFDSE1FTlRfT0VTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfUkVBRF9CVUZGRVJfT0VTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZSQU1FQlVGRkVSX09FUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GUkFNRUJVRkZFUl9VTlNVUFBPUlRFRF9PRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRlVOQ19BREQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRlVOQ19SRVZFUlNFX1NVQlRSQUNUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZVTkNfU1VCVFJBQ1QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5DUl9XUkFQCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOVkFMSURfRlJBTUVCVUZGRVJfT1BFUkFUSU9OX09FUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVhfQ09MT1JfQVRUQUNITUVOVFNfT0VTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BWF9DVUJFX01BUF9URVhUVVJFX1NJWkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX1JFTkRFUkJVRkZFUl9TSVpFX09FUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NSVJST1JFRF9SRVBFQVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTk9STUFMX01BUAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SRUZMRUNUSU9OX01BUAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SRU5ERVJCVUZGRVJfQUxQSEFfU0laRV9PRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkVOREVSQlVGRkVSX0JJTkRJTkdfT0VTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JFTkRFUkJVRkZFUl9CTFVFX1NJWkVfT0VTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JFTkRFUkJVRkZFUl9ERVBUSF9TSVpFX09FUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SRU5ERVJCVUZGRVJfR1JFRU5fU0laRV9PRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkVOREVSQlVGRkVSX0hFSUdIVF9PRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkVOREVSQlVGRkVSX0lOVEVSTkFMX0ZPUk1BVF9PRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkVOREVSQlVGRkVSX09FUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SRU5ERVJCVUZGRVJfUkVEX1NJWkVfT0VTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JFTkRFUkJVRkZFUl9TVEVOQ0lMX1NJWkVfT0VTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JFTkRFUkJVRkZFUl9XSURUSF9PRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkdCNTY1X09FUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SR0I1X0ExCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JHQjgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkdCQTQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkdCQTgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RFTkNJTF9BVFRBQ0hNRU5UX09FUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX0lOREVYCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NURU5DSUxfSU5ERVgxX09FUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX0lOREVYNF9PRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RFTkNJTF9JTkRFWDhfT0VTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NUUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0JJTkRJTkdfQ1VCRV9NQVAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9DVUJFX01BUAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1gKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9ZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1gKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9ZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0dFTl9NT0RFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfR0VOX1NUUgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsQmluZEZyYW1lYnVmZmVyT0VTKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsQmluZFJlbmRlcmJ1ZmZlck9FUygKLWludAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbEJpbmRUZXh0dXJlKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsQmxlbmRFcXVhdGlvbigKLWludCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xCbGVuZEVxdWF0aW9uU2VwYXJhdGUoCi1pbnQKLWludCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xCbGVuZEZ1bmNTZXBhcmF0ZSgKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIGFic3RyYWN0IGludCBnbENoZWNrRnJhbWVidWZmZXJTdGF0dXNPRVMoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsQ29tcHJlc3NlZFRleEltYWdlMkQoCi1pbnQKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWphdmEubmlvLkJ1ZmZlcikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xDb3B5VGV4SW1hZ2UyRCgKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbERlbGV0ZUZyYW1lYnVmZmVyc09FUygKLWludAotamF2YS5uaW8uSW50QnVmZmVyKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbERlbGV0ZUZyYW1lYnVmZmVyc09FUygKLWludAotaW50W10KLWludCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xEZWxldGVSZW5kZXJidWZmZXJzT0VTKAotaW50Ci1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsRGVsZXRlUmVuZGVyYnVmZmVyc09FUygKLWludAotaW50W10KLWludCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xFbmFibGUoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXJPRVMoCi1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsRnJhbWVidWZmZXJUZXh0dXJlMkRPRVMoCi1pbnQKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xHZW5GcmFtZWJ1ZmZlcnNPRVMoCi1pbnQKLWphdmEubmlvLkludEJ1ZmZlcikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xHZW5GcmFtZWJ1ZmZlcnNPRVMoCi1pbnQKLWludFtdCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsR2VuUmVuZGVyYnVmZmVyc09FUygKLWludAotamF2YS5uaW8uSW50QnVmZmVyKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbEdlblJlbmRlcmJ1ZmZlcnNPRVMoCi1pbnQKLWludFtdCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsR2VuZXJhdGVNaXBtYXBPRVMoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXZPRVMoCi1pbnQKLWludAotaW50Ci1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXZPRVMoCi1pbnQKLWludAotaW50Ci1pbnRbXQotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbEdldEludGVnZXJ2KAotaW50Ci1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsR2V0SW50ZWdlcnYoCi1pbnQKLWludFtdCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsR2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXZPRVMoCi1pbnQKLWludAotamF2YS5uaW8uSW50QnVmZmVyKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2T0VTKAotaW50Ci1pbnQKLWludFtdCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsR2V0VGV4R2VuZnYoCi1pbnQKLWludAotamF2YS5uaW8uRmxvYXRCdWZmZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsR2V0VGV4R2VuZnYoCi1pbnQKLWludAotZmxvYXRbXQotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbEdldFRleEdlbml2KAotaW50Ci1pbnQKLWphdmEubmlvLkludEJ1ZmZlcikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xHZXRUZXhHZW5pdigKLWludAotaW50Ci1pbnRbXQotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbEdldFRleEdlbnh2KAotaW50Ci1pbnQKLWphdmEubmlvLkludEJ1ZmZlcikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xHZXRUZXhHZW54digKLWludAotaW50Ci1pbnRbXQotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBnbElzRnJhbWVidWZmZXJPRVMoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGdsSXNSZW5kZXJidWZmZXJPRVMoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsUmVuZGVyYnVmZmVyU3RvcmFnZU9FUygKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xTdGVuY2lsT3AoCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbFRleEVudmYoCi1pbnQKLWludAotZmxvYXQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsVGV4RW52ZnYoCi1pbnQKLWludAotamF2YS5uaW8uRmxvYXRCdWZmZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsVGV4RW52ZnYoCi1pbnQKLWludAotZmxvYXRbXQotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbFRleEVudngoCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbFRleEVudnh2KAotaW50Ci1pbnQKLWphdmEubmlvLkludEJ1ZmZlcikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xUZXhFbnZ4digKLWludAotaW50Ci1pbnRbXQotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbFRleEdlbmYoCi1pbnQKLWludAotZmxvYXQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsVGV4R2VuZnYoCi1pbnQKLWludAotamF2YS5uaW8uRmxvYXRCdWZmZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsVGV4R2VuZnYoCi1pbnQKLWludAotZmxvYXRbXQotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbFRleEdlbmkoCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbFRleEdlbml2KAotaW50Ci1pbnQKLWphdmEubmlvLkludEJ1ZmZlcikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xUZXhHZW5pdigKLWludAotaW50Ci1pbnRbXQotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbFRleEdlbngoCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbFRleEdlbnh2KAotaW50Ci1pbnQKLWphdmEubmlvLkludEJ1ZmZlcikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZ2xUZXhHZW54digKLWludAotaW50Ci1pbnRbXQotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbFRleFBhcmFtZXRlcmYoCi1pbnQKLWludAotZmxvYXQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgY29tLmdvb2dsZS5hbmRyb2lkLmpzcjIzOS5HTEltcGwgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMCwgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMEV4dCwgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMSwgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMUV4dCwgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMUV4dGVuc2lvblBhY2sKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGphdmEubmlvLkJ1ZmZlciBfY29sb3JQb2ludGVyCi0KLSBqYXZhLm5pby5CdWZmZXIgX25vcm1hbFBvaW50ZXIKLQotIGphdmEubmlvLkJ1ZmZlciBfdGV4Q29vcmRQb2ludGVyCi0KLSBqYXZhLm5pby5CdWZmZXIgX3ZlcnRleFBvaW50ZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIF9uYXRpdmVDbGFzc0luaXQoKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIGdsQ29sb3JQb2ludGVyQm91bmRzKAotaW50Ci1pbnQKLWludAotamF2YS5uaW8uQnVmZmVyCi1pbnQpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgZ2xOb3JtYWxQb2ludGVyQm91bmRzKAotaW50Ci1pbnQKLWphdmEubmlvLkJ1ZmZlcgotaW50KQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmRQb2ludGVyQm91bmRzKAotaW50Ci1pbnQKLWludAotamF2YS5uaW8uQnVmZmVyCi1pbnQpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgZ2xWZXJ0ZXhQb2ludGVyQm91bmRzKAotaW50Ci1pbnQKLWludAotamF2YS5uaW8uQnVmZmVyCi1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgamF2YS5sYW5nLlN0cmluZyBfZ2xHZXRTdHJpbmcoCi1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbEFjdGl2ZVRleHR1cmUoCi1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbEFscGhhRnVuYygKLWludAotZmxvYXQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbEFscGhhRnVuY3goCi1pbnQKLWludCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsQmluZEJ1ZmZlcigKLWludAotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xCaW5kRnJhbWVidWZmZXJPRVMoCi1pbnQKLWludCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsQmluZFJlbmRlcmJ1ZmZlck9FUygKLWludAotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xCaW5kVGV4dHVyZSgKLWludAotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xCbGVuZEVxdWF0aW9uKAotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xCbGVuZEVxdWF0aW9uU2VwYXJhdGUoCi1pbnQKLWludCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsQmxlbmRGdW5jKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbEJsZW5kRnVuY1NlcGFyYXRlKAotaW50Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xCdWZmZXJEYXRhKAotaW50Ci1pbnQKLWphdmEubmlvLkJ1ZmZlcgotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xCdWZmZXJTdWJEYXRhKAotaW50Ci1pbnQKLWludAotamF2YS5uaW8uQnVmZmVyKQotCi1wdWJsaWMgbmF0aXZlIGludCBnbENoZWNrRnJhbWVidWZmZXJTdGF0dXNPRVMoCi1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbENsZWFyKAotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xDbGVhckNvbG9yKAotZmxvYXQKLWZsb2F0Ci1mbG9hdAotZmxvYXQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbENsZWFyQ29sb3J4KAotaW50Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xDbGVhckRlcHRoZigKLWZsb2F0KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xDbGVhckRlcHRoeCgKLWludCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsQ2xlYXJTdGVuY2lsKAotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xDbGllbnRBY3RpdmVUZXh0dXJlKAotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xDbGlwUGxhbmVmKAotaW50Ci1qYXZhLm5pby5GbG9hdEJ1ZmZlcikKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsQ2xpcFBsYW5lZigKLWludAotZmxvYXRbXQotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xDbGlwUGxhbmV4KAotaW50Ci1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbENsaXBQbGFuZXgoCi1pbnQKLWludFtdCi1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbENvbG9yNGYoCi1mbG9hdAotZmxvYXQKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsQ29sb3I0dWIoCi1ieXRlCi1ieXRlCi1ieXRlCi1ieXRlKQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xDb2xvcjR4KAotaW50Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xDb2xvck1hc2soCi1ib29sZWFuCi1ib29sZWFuCi1ib29sZWFuCi1ib29sZWFuKQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xDb2xvclBvaW50ZXIoCi1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsQ29sb3JQb2ludGVyKAotaW50Ci1pbnQKLWludAotamF2YS5uaW8uQnVmZmVyKQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xDb21wcmVzc2VkVGV4SW1hZ2UyRCgKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludAotamF2YS5uaW8uQnVmZmVyKQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UyRCgKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1qYXZhLm5pby5CdWZmZXIpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbENvcHlUZXhJbWFnZTJEKAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbENvcHlUZXhTdWJJbWFnZTJEKAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbEN1bGxGYWNlKAotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xDdXJyZW50UGFsZXR0ZU1hdHJpeE9FUygKLWludCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsRGVsZXRlQnVmZmVycygKLWludAotamF2YS5uaW8uSW50QnVmZmVyKQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xEZWxldGVCdWZmZXJzKAotaW50Ci1pbnRbXQotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xEZWxldGVGcmFtZWJ1ZmZlcnNPRVMoCi1pbnQKLWphdmEubmlvLkludEJ1ZmZlcikKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsRGVsZXRlRnJhbWVidWZmZXJzT0VTKAotaW50Ci1pbnRbXQotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xEZWxldGVSZW5kZXJidWZmZXJzT0VTKAotaW50Ci1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbERlbGV0ZVJlbmRlcmJ1ZmZlcnNPRVMoCi1pbnQKLWludFtdCi1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbERlbGV0ZVRleHR1cmVzKAotaW50Ci1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbERlbGV0ZVRleHR1cmVzKAotaW50Ci1pbnRbXQotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xEZXB0aEZ1bmMoCi1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbERlcHRoTWFzaygKLWJvb2xlYW4pCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbERlcHRoUmFuZ2VmKAotZmxvYXQKLWZsb2F0KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xEZXB0aFJhbmdleCgKLWludAotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xEaXNhYmxlKAotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xEaXNhYmxlQ2xpZW50U3RhdGUoCi1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbERyYXdBcnJheXMoCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xEcmF3RWxlbWVudHMoCi1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbERyYXdFbGVtZW50cygKLWludAotaW50Ci1pbnQKLWphdmEubmlvLkJ1ZmZlcikKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsRHJhd1RleGZPRVMoCi1mbG9hdAotZmxvYXQKLWZsb2F0Ci1mbG9hdAotZmxvYXQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbERyYXdUZXhmdk9FUygKLWphdmEubmlvLkZsb2F0QnVmZmVyKQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xEcmF3VGV4ZnZPRVMoCi1mbG9hdFtdCi1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbERyYXdUZXhpT0VTKAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbERyYXdUZXhpdk9FUygKLWphdmEubmlvLkludEJ1ZmZlcikKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsRHJhd1RleGl2T0VTKAotaW50W10KLWludCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsRHJhd1RleHNPRVMoCi1zaG9ydAotc2hvcnQKLXNob3J0Ci1zaG9ydAotc2hvcnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbERyYXdUZXhzdk9FUygKLWphdmEubmlvLlNob3J0QnVmZmVyKQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xEcmF3VGV4c3ZPRVMoCi1zaG9ydFtdCi1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbERyYXdUZXh4T0VTKAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbERyYXdUZXh4dk9FUygKLWphdmEubmlvLkludEJ1ZmZlcikKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsRHJhd1RleHh2T0VTKAotaW50W10KLWludCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsRW5hYmxlKAotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xFbmFibGVDbGllbnRTdGF0ZSgKLWludCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsRmluaXNoKCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsRmx1c2goKQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xGb2dmKAotaW50Ci1mbG9hdCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsRm9nZnYoCi1pbnQKLWphdmEubmlvLkZsb2F0QnVmZmVyKQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xGb2dmdigKLWludAotZmxvYXRbXQotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xGb2d4KAotaW50Ci1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbEZvZ3h2KAotaW50Ci1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbEZvZ3h2KAotaW50Ci1pbnRbXQotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlck9FUygKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsRnJhbWVidWZmZXJUZXh0dXJlMkRPRVMoCi1pbnQKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsRnJvbnRGYWNlKAotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xGcnVzdHVtZigKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWZsb2F0Ci1mbG9hdAotZmxvYXQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbEZydXN0dW14KAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsR2VuQnVmZmVycygKLWludAotamF2YS5uaW8uSW50QnVmZmVyKQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xHZW5CdWZmZXJzKAotaW50Ci1pbnRbXQotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xHZW5GcmFtZWJ1ZmZlcnNPRVMoCi1pbnQKLWphdmEubmlvLkludEJ1ZmZlcikKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsR2VuRnJhbWVidWZmZXJzT0VTKAotaW50Ci1pbnRbXQotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xHZW5SZW5kZXJidWZmZXJzT0VTKAotaW50Ci1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbEdlblJlbmRlcmJ1ZmZlcnNPRVMoCi1pbnQKLWludFtdCi1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbEdlblRleHR1cmVzKAotaW50Ci1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbEdlblRleHR1cmVzKAotaW50Ci1pbnRbXQotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xHZW5lcmF0ZU1pcG1hcE9FUygKLWludCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsR2V0Qm9vbGVhbnYoCi1pbnQKLWphdmEubmlvLkludEJ1ZmZlcikKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsR2V0Qm9vbGVhbnYoCi1pbnQKLWJvb2xlYW5bXQotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xHZXRCdWZmZXJQYXJhbWV0ZXJpdigKLWludAotaW50Ci1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbEdldEJ1ZmZlclBhcmFtZXRlcml2KAotaW50Ci1pbnQKLWludFtdCi1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbEdldENsaXBQbGFuZWYoCi1pbnQKLWphdmEubmlvLkZsb2F0QnVmZmVyKQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xHZXRDbGlwUGxhbmVmKAotaW50Ci1mbG9hdFtdCi1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbEdldENsaXBQbGFuZXgoCi1pbnQKLWphdmEubmlvLkludEJ1ZmZlcikKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsR2V0Q2xpcFBsYW5leCgKLWludAotaW50W10KLWludCkKLQotcHVibGljIG5hdGl2ZSBpbnQgZ2xHZXRFcnJvcigpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbEdldEZpeGVkdigKLWludAotamF2YS5uaW8uSW50QnVmZmVyKQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xHZXRGaXhlZHYoCi1pbnQKLWludFtdCi1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbEdldEZsb2F0digKLWludAotamF2YS5uaW8uRmxvYXRCdWZmZXIpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbEdldEZsb2F0digKLWludAotZmxvYXRbXQotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdk9FUygKLWludAotaW50Ci1pbnQKLWphdmEubmlvLkludEJ1ZmZlcikKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXZPRVMoCi1pbnQKLWludAotaW50Ci1pbnRbXQotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xHZXRJbnRlZ2VydigKLWludAotamF2YS5uaW8uSW50QnVmZmVyKQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xHZXRJbnRlZ2VydigKLWludAotaW50W10KLWludCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsR2V0TGlnaHRmdigKLWludAotaW50Ci1qYXZhLm5pby5GbG9hdEJ1ZmZlcikKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsR2V0TGlnaHRmdigKLWludAotaW50Ci1mbG9hdFtdCi1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbEdldExpZ2h0eHYoCi1pbnQKLWludAotamF2YS5uaW8uSW50QnVmZmVyKQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xHZXRMaWdodHh2KAotaW50Ci1pbnQKLWludFtdCi1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbEdldE1hdGVyaWFsZnYoCi1pbnQKLWludAotamF2YS5uaW8uRmxvYXRCdWZmZXIpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbEdldE1hdGVyaWFsZnYoCi1pbnQKLWludAotZmxvYXRbXQotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xHZXRNYXRlcmlhbHh2KAotaW50Ci1pbnQKLWphdmEubmlvLkludEJ1ZmZlcikKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsR2V0TWF0ZXJpYWx4digKLWludAotaW50Ci1pbnRbXQotaW50KQotCi1wdWJsaWMgdm9pZCBnbEdldFBvaW50ZXJ2KAotaW50Ci1qYXZhLm5pby5CdWZmZXJbXSkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsR2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXZPRVMoCi1pbnQKLWludAotamF2YS5uaW8uSW50QnVmZmVyKQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdk9FUygKLWludAotaW50Ci1pbnRbXQotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnbEdldFN0cmluZygKLWludCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsR2V0VGV4RW52aXYoCi1pbnQKLWludAotamF2YS5uaW8uSW50QnVmZmVyKQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xHZXRUZXhFbnZpdigKLWludAotaW50Ci1pbnRbXQotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xHZXRUZXhFbnZ4digKLWludAotaW50Ci1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbEdldFRleEVudnh2KAotaW50Ci1pbnQKLWludFtdCi1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbEdldFRleEdlbmZ2KAotaW50Ci1pbnQKLWphdmEubmlvLkZsb2F0QnVmZmVyKQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xHZXRUZXhHZW5mdigKLWludAotaW50Ci1mbG9hdFtdCi1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbEdldFRleEdlbml2KAotaW50Ci1pbnQKLWphdmEubmlvLkludEJ1ZmZlcikKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsR2V0VGV4R2VuaXYoCi1pbnQKLWludAotaW50W10KLWludCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsR2V0VGV4R2VueHYoCi1pbnQKLWludAotamF2YS5uaW8uSW50QnVmZmVyKQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xHZXRUZXhHZW54digKLWludAotaW50Ci1pbnRbXQotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xHZXRUZXhQYXJhbWV0ZXJmdigKLWludAotaW50Ci1qYXZhLm5pby5GbG9hdEJ1ZmZlcikKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsR2V0VGV4UGFyYW1ldGVyZnYoCi1pbnQKLWludAotZmxvYXRbXQotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xHZXRUZXhQYXJhbWV0ZXJpdigKLWludAotaW50Ci1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbEdldFRleFBhcmFtZXRlcml2KAotaW50Ci1pbnQKLWludFtdCi1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbEdldFRleFBhcmFtZXRlcnh2KAotaW50Ci1pbnQKLWphdmEubmlvLkludEJ1ZmZlcikKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsR2V0VGV4UGFyYW1ldGVyeHYoCi1pbnQKLWludAotaW50W10KLWludCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsSGludCgKLWludAotaW50KQotCi1wdWJsaWMgbmF0aXZlIGJvb2xlYW4gZ2xJc0J1ZmZlcigKLWludCkKLQotcHVibGljIG5hdGl2ZSBib29sZWFuIGdsSXNFbmFibGVkKAotaW50KQotCi1wdWJsaWMgbmF0aXZlIGJvb2xlYW4gZ2xJc0ZyYW1lYnVmZmVyT0VTKAotaW50KQotCi1wdWJsaWMgbmF0aXZlIGJvb2xlYW4gZ2xJc1JlbmRlcmJ1ZmZlck9FUygKLWludCkKLQotcHVibGljIG5hdGl2ZSBib29sZWFuIGdsSXNUZXh0dXJlKAotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xMaWdodE1vZGVsZigKLWludAotZmxvYXQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbExpZ2h0TW9kZWxmdigKLWludAotamF2YS5uaW8uRmxvYXRCdWZmZXIpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbExpZ2h0TW9kZWxmdigKLWludAotZmxvYXRbXQotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xMaWdodE1vZGVseCgKLWludAotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xMaWdodE1vZGVseHYoCi1pbnQKLWphdmEubmlvLkludEJ1ZmZlcikKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsTGlnaHRNb2RlbHh2KAotaW50Ci1pbnRbXQotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xMaWdodGYoCi1pbnQKLWludAotZmxvYXQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbExpZ2h0ZnYoCi1pbnQKLWludAotamF2YS5uaW8uRmxvYXRCdWZmZXIpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbExpZ2h0ZnYoCi1pbnQKLWludAotZmxvYXRbXQotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xMaWdodHgoCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xMaWdodHh2KAotaW50Ci1pbnQKLWphdmEubmlvLkludEJ1ZmZlcikKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsTGlnaHR4digKLWludAotaW50Ci1pbnRbXQotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xMaW5lV2lkdGgoCi1mbG9hdCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsTGluZVdpZHRoeCgKLWludCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsTG9hZElkZW50aXR5KCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsTG9hZE1hdHJpeGYoCi1qYXZhLm5pby5GbG9hdEJ1ZmZlcikKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsTG9hZE1hdHJpeGYoCi1mbG9hdFtdCi1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbExvYWRNYXRyaXh4KAotamF2YS5uaW8uSW50QnVmZmVyKQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xMb2FkTWF0cml4eCgKLWludFtdCi1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbExvYWRQYWxldHRlRnJvbU1vZGVsVmlld01hdHJpeE9FUygpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbExvZ2ljT3AoCi1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbE1hdGVyaWFsZigKLWludAotaW50Ci1mbG9hdCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsTWF0ZXJpYWxmdigKLWludAotaW50Ci1qYXZhLm5pby5GbG9hdEJ1ZmZlcikKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsTWF0ZXJpYWxmdigKLWludAotaW50Ci1mbG9hdFtdCi1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbE1hdGVyaWFseCgKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbE1hdGVyaWFseHYoCi1pbnQKLWludAotamF2YS5uaW8uSW50QnVmZmVyKQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xNYXRlcmlhbHh2KAotaW50Ci1pbnQKLWludFtdCi1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbE1hdHJpeEluZGV4UG9pbnRlck9FUygKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsTWF0cml4SW5kZXhQb2ludGVyT0VTKAotaW50Ci1pbnQKLWludAotamF2YS5uaW8uQnVmZmVyKQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xNYXRyaXhNb2RlKAotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xNdWx0TWF0cml4ZigKLWphdmEubmlvLkZsb2F0QnVmZmVyKQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xNdWx0TWF0cml4ZigKLWZsb2F0W10KLWludCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsTXVsdE1hdHJpeHgoCi1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbE11bHRNYXRyaXh4KAotaW50W10KLWludCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsTXVsdGlUZXhDb29yZDRmKAotaW50Ci1mbG9hdAotZmxvYXQKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsTXVsdGlUZXhDb29yZDR4KAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbE5vcm1hbDNmKAotZmxvYXQKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsTm9ybWFsM3goCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xOb3JtYWxQb2ludGVyKAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgZ2xOb3JtYWxQb2ludGVyKAotaW50Ci1pbnQKLWphdmEubmlvLkJ1ZmZlcikKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsT3J0aG9mKAotZmxvYXQKLWZsb2F0Ci1mbG9hdAotZmxvYXQKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsT3J0aG94KAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsUGl4ZWxTdG9yZWkoCi1pbnQKLWludCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsUG9pbnRQYXJhbWV0ZXJmKAotaW50Ci1mbG9hdCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsUG9pbnRQYXJhbWV0ZXJmdigKLWludAotamF2YS5uaW8uRmxvYXRCdWZmZXIpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbFBvaW50UGFyYW1ldGVyZnYoCi1pbnQKLWZsb2F0W10KLWludCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsUG9pbnRQYXJhbWV0ZXJ4KAotaW50Ci1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbFBvaW50UGFyYW1ldGVyeHYoCi1pbnQKLWphdmEubmlvLkludEJ1ZmZlcikKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsUG9pbnRQYXJhbWV0ZXJ4digKLWludAotaW50W10KLWludCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsUG9pbnRTaXplKAotZmxvYXQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbFBvaW50U2l6ZVBvaW50ZXJPRVMoCi1pbnQKLWludAotamF2YS5uaW8uQnVmZmVyKQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xQb2ludFNpemV4KAotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xQb2x5Z29uT2Zmc2V0KAotZmxvYXQKLWZsb2F0KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xQb2x5Z29uT2Zmc2V0eCgKLWludAotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xQb3BNYXRyaXgoKQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xQdXNoTWF0cml4KCkKLQotcHVibGljIG5hdGl2ZSBpbnQgZ2xRdWVyeU1hdHJpeHhPRVMoCi1qYXZhLm5pby5JbnRCdWZmZXIKLWphdmEubmlvLkludEJ1ZmZlcikKLQotcHVibGljIG5hdGl2ZSBpbnQgZ2xRdWVyeU1hdHJpeHhPRVMoCi1pbnRbXQotaW50Ci1pbnRbXQotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xSZWFkUGl4ZWxzKAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludAotamF2YS5uaW8uQnVmZmVyKQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xSZW5kZXJidWZmZXJTdG9yYWdlT0VTKAotaW50Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xSb3RhdGVmKAotZmxvYXQKLWZsb2F0Ci1mbG9hdAotZmxvYXQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbFJvdGF0ZXgoCi1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbFNhbXBsZUNvdmVyYWdlKAotZmxvYXQKLWJvb2xlYW4pCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbFNhbXBsZUNvdmVyYWdleCgKLWludAotYm9vbGVhbikKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsU2NhbGVmKAotZmxvYXQKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsU2NhbGV4KAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsU2Npc3NvcigKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsU2hhZGVNb2RlbCgKLWludCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsU3RlbmNpbEZ1bmMoCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xTdGVuY2lsTWFzaygKLWludCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsU3RlbmNpbE9wKAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmRQb2ludGVyKAotaW50Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBnbFRleENvb3JkUG9pbnRlcigKLWludAotaW50Ci1pbnQKLWphdmEubmlvLkJ1ZmZlcikKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsVGV4RW52ZigKLWludAotaW50Ci1mbG9hdCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsVGV4RW52ZnYoCi1pbnQKLWludAotamF2YS5uaW8uRmxvYXRCdWZmZXIpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbFRleEVudmZ2KAotaW50Ci1pbnQKLWZsb2F0W10KLWludCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsVGV4RW52aSgKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbFRleEVudml2KAotaW50Ci1pbnQKLWphdmEubmlvLkludEJ1ZmZlcikKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsVGV4RW52aXYoCi1pbnQKLWludAotaW50W10KLWludCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsVGV4RW52eCgKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbFRleEVudnh2KAotaW50Ci1pbnQKLWphdmEubmlvLkludEJ1ZmZlcikKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsVGV4RW52eHYoCi1pbnQKLWludAotaW50W10KLWludCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsVGV4R2VuZigKLWludAotaW50Ci1mbG9hdCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsVGV4R2VuZnYoCi1pbnQKLWludAotamF2YS5uaW8uRmxvYXRCdWZmZXIpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbFRleEdlbmZ2KAotaW50Ci1pbnQKLWZsb2F0W10KLWludCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsVGV4R2VuaSgKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbFRleEdlbml2KAotaW50Ci1pbnQKLWphdmEubmlvLkludEJ1ZmZlcikKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsVGV4R2VuaXYoCi1pbnQKLWludAotaW50W10KLWludCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsVGV4R2VueCgKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbFRleEdlbnh2KAotaW50Ci1pbnQKLWphdmEubmlvLkludEJ1ZmZlcikKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsVGV4R2VueHYoCi1pbnQKLWludAotaW50W10KLWludCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsVGV4SW1hZ2UyRCgKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1qYXZhLm5pby5CdWZmZXIpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbFRleFBhcmFtZXRlcmYoCi1pbnQKLWludAotZmxvYXQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbFRleFBhcmFtZXRlcmZ2KAotaW50Ci1pbnQKLWphdmEubmlvLkZsb2F0QnVmZmVyKQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xUZXhQYXJhbWV0ZXJmdigKLWludAotaW50Ci1mbG9hdFtdCi1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbFRleFBhcmFtZXRlcmkoCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xUZXhQYXJhbWV0ZXJpdigKLWludAotaW50Ci1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbFRleFBhcmFtZXRlcml2KAotaW50Ci1pbnQKLWludFtdCi1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbFRleFBhcmFtZXRlcngoCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xUZXhQYXJhbWV0ZXJ4digKLWludAotaW50Ci1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbFRleFBhcmFtZXRlcnh2KAotaW50Ci1pbnQKLWludFtdCi1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbFRleFN1YkltYWdlMkQoCi1pbnQKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludAotamF2YS5uaW8uQnVmZmVyKQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2xUcmFuc2xhdGVmKAotZmxvYXQKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsVHJhbnNsYXRleCgKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbFZlcnRleFBvaW50ZXIoCi1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIGdsVmVydGV4UG9pbnRlcigKLWludAotaW50Ci1pbnQKLWphdmEubmlvLkJ1ZmZlcikKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdsVmlld3BvcnQoCi1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbFdlaWdodFBvaW50ZXJPRVMoCi1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBnbFdlaWdodFBvaW50ZXJPRVMoCi1pbnQKLWludAotaW50Ci1qYXZhLm5pby5CdWZmZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5Db250ZW50VHlwZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFQUF9EUk1fQ09OVEVOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQVBQX0RSTV9NRVNTQUdFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBUFBfU01JTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQVBQX1dBUF9YSFRNTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQVBQX1hIVE1MCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBVURJT18zR1BQCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBVURJT19BQUMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFVRElPX0FNUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQVVESU9fSU1FTE9EWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQVVESU9fTUlECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBVURJT19NSURJCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBVURJT19NUDMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFVRElPX01QNAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQVVESU9fTVBFRwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQVVESU9fTVBFRzMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFVRElPX01QRwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQVVESU9fT0dHCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBVURJT19VTlNQRUNJRklFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQVVESU9fWF9NSUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFVRElPX1hfTUlESQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQVVESU9fWF9NUDMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFVRElPX1hfTVBFRwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQVVESU9fWF9NUEVHMwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQVVESU9fWF9NUEcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIElNQUdFX0dJRgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSU1BR0VfSlBFRwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSU1BR0VfSlBHCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBJTUFHRV9QTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIElNQUdFX1VOU1BFQ0lGSUVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBJTUFHRV9XQk1QCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBNTVNfR0VORVJJQwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTU1TX01FU1NBR0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1VTFRJUEFSVF9NSVhFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTVVMVElQQVJUX1JFTEFURUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRFWFRfSFRNTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEVYVF9QTEFJTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEVYVF9WQ0FMRU5EQVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRFWFRfVkNBUkQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFZJREVPXzNHMgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVklERU9fM0dQUAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVklERU9fSDI2MwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVklERU9fTVA0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBWSURFT19VTlNQRUNJRklFRAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQXJyYXlMaXN0PExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEudXRpbC5BcnJheUxpc3Qgc1N1cHBvcnRlZEF1ZGlvVHlwZXMKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0FycmF5TGlzdDxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuQXJyYXlMaXN0IHNTdXBwb3J0ZWRDb250ZW50VHlwZXMKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0FycmF5TGlzdDxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuQXJyYXlMaXN0IHNTdXBwb3J0ZWRJbWFnZVR5cGVzCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9BcnJheUxpc3Q8TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS51dGlsLkFycmF5TGlzdCBzU3VwcG9ydGVkVmlkZW9UeXBlcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0FycmF5TGlzdDxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5BcnJheUxpc3QgZ2V0QXVkaW9UeXBlcygpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0FycmF5TGlzdDxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5BcnJheUxpc3QgZ2V0SW1hZ2VUeXBlcygpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0FycmF5TGlzdDxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5BcnJheUxpc3QgZ2V0U3VwcG9ydGVkVHlwZXMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9BcnJheUxpc3Q8TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuQXJyYXlMaXN0IGdldFZpZGVvVHlwZXMoKQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBdWRpb1R5cGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEcm1UeXBlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzSW1hZ2VUeXBlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzU3VwcG9ydGVkQXVkaW9UeXBlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzU3VwcG9ydGVkSW1hZ2VUeXBlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzU3VwcG9ydGVkVHlwZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1N1cHBvcnRlZFZpZGVvVHlwZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RleHRUeXBlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzVW5zcGVjaWZpZWQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWaWRlb1R5cGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGNvbS5nb29nbGUuYW5kcm9pZC5tbXMuTW1zRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLkV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGNvbS5nb29nbGUuYW5kcm9pZC5tbXMuSW52YWxpZEhlYWRlclZhbHVlRXhjZXB0aW9uIGV4dGVuZHMgY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5NbXNFeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBjb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5HZW5lcmljUGR1IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuUGR1SGVhZGVycyBtUGR1SGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLSB2b2lkIDxpbml0PigKLWNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LlBkdUhlYWRlcnMpCi0KLXB1YmxpYyBpbnQgZ2V0TWVzc2FnZVR5cGUoKQotCi1wdWJsaWMgaW50IGdldE1tc1ZlcnNpb24oKQotCi0gY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuUGR1SGVhZGVycyBnZXRQZHVIZWFkZXJzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MY29tL2dvb2dsZS9hbmRyb2lkL21tcy9JbnZhbGlkSGVhZGVyVmFsdWVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldE1lc3NhZ2VUeXBlKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxjb20vZ29vZ2xlL2FuZHJvaWQvbW1zL0ludmFsaWRIZWFkZXJWYWx1ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0TW1zVmVyc2lvbigKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBjb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5BY2tub3dsZWRnZUluZCBleHRlbmRzIGNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LkdlbmVyaWNQZHUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxjb20vZ29vZ2xlL2FuZHJvaWQvbW1zL0ludmFsaWRIZWFkZXJWYWx1ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50Ci1ieXRlW10pCi0KLSB2b2lkIDxpbml0PigKLWNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LlBkdUhlYWRlcnMpCi0KLXB1YmxpYyBpbnQgZ2V0UmVwb3J0QWxsb3dlZCgpCi0KLXB1YmxpYyBieXRlW10gZ2V0VHJhbnNhY3Rpb25JZCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGNvbS9nb29nbGUvYW5kcm9pZC9tbXMvSW52YWxpZEhlYWRlclZhbHVlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRSZXBvcnRBbGxvd2VkKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRUcmFuc2FjdGlvbklkKAotYnl0ZVtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LkJhc2U2NCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIGludCBCQVNFTEVOR1RICi0KLXN0YXRpYyBmaW5hbCBpbnQgRk9VUkJZVEUKLQotc3RhdGljIGZpbmFsIGJ5dGUgUEFECi0KLXByaXZhdGUgc3RhdGljIGJ5dGVbXSBiYXNlNjRBbHBoYWJldAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBieXRlW10gZGVjb2RlQmFzZTY0KAotYnl0ZVtdKQotCi1zdGF0aWMgYnl0ZVtdIGRpc2NhcmROb25CYXNlNjQoCi1ieXRlW10pCi0KLXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNCYXNlNjQoCi1ieXRlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LkNoYXJhY3RlclNldHMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBmaW5hbCBib29sZWFuICRhc3NlcnRpb25zRGlzYWJsZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQU5ZX0NIQVJTRVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklHNQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0NIQVJTRVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFRkFVTFRfQ0hBUlNFVF9OQU1FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElTT184ODU5XzEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSVNPXzg4NTlfMgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJU09fODg1OV8zCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElTT184ODU5XzQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSVNPXzg4NTlfNQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJU09fODg1OV82Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElTT184ODU5XzcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSVNPXzg4NTlfOAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJU09fODg1OV85Ci0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIE1JQkVOVU1fTlVNQkVSUwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaE1hcDxMamF2YS9sYW5nL0ludGVnZXI7TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS51dGlsLkhhc2hNYXAgTUlCRU5VTV9UT19OQU1FX01BUAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTUlNRU5BTUVfQU5ZX0NIQVJTRVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1JTUVOQU1FX0JJRzUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1JTUVOQU1FX0lTT184ODU5XzEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1JTUVOQU1FX0lTT184ODU5XzIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1JTUVOQU1FX0lTT184ODU5XzMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1JTUVOQU1FX0lTT184ODU5XzQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1JTUVOQU1FX0lTT184ODU5XzUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1JTUVOQU1FX0lTT184ODU5XzYKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1JTUVOQU1FX0lTT184ODU5XzcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1JTUVOQU1FX0lTT184ODU5XzgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1JTUVOQU1FX0lTT184ODU5XzkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1JTUVOQU1FX1NISUZUX0pJUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTUlNRU5BTUVfVUNTMgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTUlNRU5BTUVfVVNfQVNDSUkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1JTUVOQU1FX1VURl8xNgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTUlNRU5BTUVfVVRGXzgKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZ1tdIE1JTUVfTkFNRVMKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0hhc2hNYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9JbnRlZ2VyOz47ICkKLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEudXRpbC5IYXNoTWFwIE5BTUVfVE9fTUlCRU5VTV9NQVAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hJRlRfSklTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVDUzIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVNfQVNDSUkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVRGXzE2Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVURl84Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGludCBnZXRNaWJFbnVtVmFsdWUoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL1Vuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRNaW1lTmFtZSgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBjb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5EZWxpdmVyeUluZCBleHRlbmRzIGNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LkdlbmVyaWNQZHUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxjb20vZ29vZ2xlL2FuZHJvaWQvbW1zL0ludmFsaWRIZWFkZXJWYWx1ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KAotY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuUGR1SGVhZGVycykKLQotcHVibGljIGxvbmcgZ2V0RGF0ZSgpCi0KLXB1YmxpYyBieXRlW10gZ2V0TWVzc2FnZUlkKCkKLQotcHVibGljIGludCBnZXRTdGF0dXMoKQotCi1wdWJsaWMgY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuRW5jb2RlZFN0cmluZ1ZhbHVlW10gZ2V0VG8oKQotCi1wdWJsaWMgdm9pZCBzZXREYXRlKAotbG9uZykKLQotcHVibGljIHZvaWQgc2V0TWVzc2FnZUlkKAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxjb20vZ29vZ2xlL2FuZHJvaWQvbW1zL0ludmFsaWRIZWFkZXJWYWx1ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0U3RhdHVzKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRUbygKLWNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LkVuY29kZWRTdHJpbmdWYWx1ZVtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LkVuY29kZWRTdHJpbmdWYWx1ZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmxhbmcuQ2xvbmVhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0NBTF9MT0dWCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEFHCi0KLXByaXZhdGUgaW50IG1DaGFyYWN0ZXJTZXQKLQotcHJpdmF0ZSBieXRlW10gbURhdGEKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWJ5dGVbXSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYnl0ZVtdKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgY29uY2F0KAotY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuRW5jb2RlZFN0cmluZ1ZhbHVlW10pCi0KLXB1YmxpYyBzdGF0aWMgY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuRW5jb2RlZFN0cmluZ1ZhbHVlIGNvcHkoCi1jb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5FbmNvZGVkU3RyaW5nVmFsdWUpCi0KLXB1YmxpYyBzdGF0aWMgY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuRW5jb2RlZFN0cmluZ1ZhbHVlW10gZXh0cmFjdCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIGFwcGVuZFRleHRTdHJpbmcoCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9DbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgY2xvbmUoKQotCi1wdWJsaWMgaW50IGdldENoYXJhY3RlclNldCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygpCi0KLXB1YmxpYyBieXRlW10gZ2V0VGV4dFN0cmluZygpCi0KLXB1YmxpYyB2b2lkIHNldENoYXJhY3RlclNldCgKLWludCkKLQotcHVibGljIHZvaWQgc2V0VGV4dFN0cmluZygKLWJ5dGVbXSkKLQotcHVibGljIGNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LkVuY29kZWRTdHJpbmdWYWx1ZVtdIHNwbGl0KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBjb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5NdWx0aW1lZGlhTWVzc2FnZVBkdSBleHRlbmRzIGNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LkdlbmVyaWNQZHUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBjb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5QZHVCb2R5IG1NZXNzYWdlQm9keQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLSB2b2lkIDxpbml0PigKLWNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LlBkdUhlYWRlcnMpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LlBkdUhlYWRlcnMKLWNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LlBkdUJvZHkpCi0KLXB1YmxpYyB2b2lkIGFkZFRvKAotY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuRW5jb2RlZFN0cmluZ1ZhbHVlKQotCi1wdWJsaWMgY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuUGR1Qm9keSBnZXRCb2R5KCkKLQotcHVibGljIGxvbmcgZ2V0RGF0ZSgpCi0KLXB1YmxpYyBpbnQgZ2V0UHJpb3JpdHkoKQotCi1wdWJsaWMgY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuRW5jb2RlZFN0cmluZ1ZhbHVlIGdldFN1YmplY3QoKQotCi1wdWJsaWMgY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuRW5jb2RlZFN0cmluZ1ZhbHVlW10gZ2V0VG8oKQotCi1wdWJsaWMgdm9pZCBzZXRCb2R5KAotY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuUGR1Qm9keSkKLQotcHVibGljIHZvaWQgc2V0RGF0ZSgKLWxvbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGNvbS9nb29nbGUvYW5kcm9pZC9tbXMvSW52YWxpZEhlYWRlclZhbHVlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRQcmlvcml0eSgKLWludCkKLQotcHVibGljIHZvaWQgc2V0U3ViamVjdCgKLWNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LkVuY29kZWRTdHJpbmdWYWx1ZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBjb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5Ob3RpZmljYXRpb25JbmQgZXh0ZW5kcyBjb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5HZW5lcmljUGR1Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MY29tL2dvb2dsZS9hbmRyb2lkL21tcy9JbnZhbGlkSGVhZGVyVmFsdWVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLSB2b2lkIDxpbml0PigKLWNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LlBkdUhlYWRlcnMpCi0KLXB1YmxpYyBpbnQgZ2V0Q29udGVudENsYXNzKCkKLQotcHVibGljIGJ5dGVbXSBnZXRDb250ZW50TG9jYXRpb24oKQotCi1wdWJsaWMgaW50IGdldERlbGl2ZXJ5UmVwb3J0KCkKLQotcHVibGljIGxvbmcgZ2V0RXhwaXJ5KCkKLQotcHVibGljIGNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LkVuY29kZWRTdHJpbmdWYWx1ZSBnZXRGcm9tKCkKLQotcHVibGljIGJ5dGVbXSBnZXRNZXNzYWdlQ2xhc3MoKQotCi1wdWJsaWMgbG9uZyBnZXRNZXNzYWdlU2l6ZSgpCi0KLXB1YmxpYyBjb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5FbmNvZGVkU3RyaW5nVmFsdWUgZ2V0U3ViamVjdCgpCi0KLXB1YmxpYyBieXRlW10gZ2V0VHJhbnNhY3Rpb25JZCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGNvbS9nb29nbGUvYW5kcm9pZC9tbXMvSW52YWxpZEhlYWRlclZhbHVlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRDb250ZW50Q2xhc3MoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldENvbnRlbnRMb2NhdGlvbigKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MY29tL2dvb2dsZS9hbmRyb2lkL21tcy9JbnZhbGlkSGVhZGVyVmFsdWVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldERlbGl2ZXJ5UmVwb3J0KAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRFeHBpcnkoCi1sb25nKQotCi1wdWJsaWMgdm9pZCBzZXRGcm9tKAotY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuRW5jb2RlZFN0cmluZ1ZhbHVlKQotCi1wdWJsaWMgdm9pZCBzZXRNZXNzYWdlQ2xhc3MoCi1ieXRlW10pCi0KLXB1YmxpYyB2b2lkIHNldE1lc3NhZ2VTaXplKAotbG9uZykKLQotcHVibGljIHZvaWQgc2V0U3ViamVjdCgKLWNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LkVuY29kZWRTdHJpbmdWYWx1ZSkKLQotcHVibGljIHZvaWQgc2V0VHJhbnNhY3Rpb25JZCgKLWJ5dGVbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBjb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5Ob3RpZnlSZXNwSW5kIGV4dGVuZHMgY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuR2VuZXJpY1BkdQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGNvbS9nb29nbGUvYW5kcm9pZC9tbXMvSW52YWxpZEhlYWRlclZhbHVlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWJ5dGVbXQotaW50KQotCi0gdm9pZCA8aW5pdD4oCi1jb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5QZHVIZWFkZXJzKQotCi1wdWJsaWMgaW50IGdldFJlcG9ydEFsbG93ZWQoKQotCi1wdWJsaWMgaW50IGdldFN0YXR1cygpCi0KLXB1YmxpYyBieXRlW10gZ2V0VHJhbnNhY3Rpb25JZCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGNvbS9nb29nbGUvYW5kcm9pZC9tbXMvSW52YWxpZEhlYWRlclZhbHVlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRSZXBvcnRBbGxvd2VkKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxjb20vZ29vZ2xlL2FuZHJvaWQvbW1zL0ludmFsaWRIZWFkZXJWYWx1ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0U3RhdHVzKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRUcmFuc2FjdGlvbklkKAotYnl0ZVtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LlBkdUJvZHkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TGNvbS9nb29nbGUvYW5kcm9pZC9tbXMvcGR1L1BkdVBhcnQ7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuTWFwIG1QYXJ0TWFwQnlDb250ZW50SWQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMY29tL2dvb2dsZS9hbmRyb2lkL21tcy9wZHUvUGR1UGFydDs+OyApCi1wcml2YXRlIGphdmEudXRpbC5NYXAgbVBhcnRNYXBCeUNvbnRlbnRMb2NhdGlvbgotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xjb20vZ29vZ2xlL2FuZHJvaWQvbW1zL3BkdS9QZHVQYXJ0Oz47ICkKLXByaXZhdGUgamF2YS51dGlsLk1hcCBtUGFydE1hcEJ5RmlsZU5hbWUKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMY29tL2dvb2dsZS9hbmRyb2lkL21tcy9wZHUvUGR1UGFydDs+OyApCi1wcml2YXRlIGphdmEudXRpbC5NYXAgbVBhcnRNYXBCeU5hbWUKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL1ZlY3RvcjxMY29tL2dvb2dsZS9hbmRyb2lkL21tcy9wZHUvUGR1UGFydDs+OyApCi1wcml2YXRlIGphdmEudXRpbC5WZWN0b3IgbVBhcnRzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIHB1dFBhcnRUb01hcHMoCi1jb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5QZHVQYXJ0KQotCi1wdWJsaWMgdm9pZCBhZGRQYXJ0KAotaW50Ci1jb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5QZHVQYXJ0KQotCi1wdWJsaWMgYm9vbGVhbiBhZGRQYXJ0KAotY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuUGR1UGFydCkKLQotcHVibGljIGNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LlBkdVBhcnQgZ2V0UGFydCgKLWludCkKLQotcHVibGljIGNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LlBkdVBhcnQgZ2V0UGFydEJ5Q29udGVudElkKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LlBkdVBhcnQgZ2V0UGFydEJ5Q29udGVudExvY2F0aW9uKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LlBkdVBhcnQgZ2V0UGFydEJ5RmlsZU5hbWUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuUGR1UGFydCBnZXRQYXJ0QnlOYW1lKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGludCBnZXRQYXJ0SW5kZXgoCi1jb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5QZHVQYXJ0KQotCi1wdWJsaWMgaW50IGdldFBhcnRzTnVtKCkKLQotcHVibGljIHZvaWQgcmVtb3ZlQWxsKCkKLQotcHVibGljIGNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LlBkdVBhcnQgcmVtb3ZlUGFydCgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2dvb2dsZS9hbmRyb2lkL21tcy9wZHUvUGR1Q29tcG9zZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9NDEwNCBuYW1lID1udWxsICkKLSBjbGFzcyBjb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5QZHVDb21wb3NlciQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9nb29nbGUvYW5kcm9pZC9tbXMvcGR1L1BkdUNvbXBvc2VyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTIgbmFtZSA9QnVmZmVyU3RhY2sgKQotIGNsYXNzIGNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LlBkdUNvbXBvc2VyJEJ1ZmZlclN0YWNrIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LlBkdUNvbXBvc2VyJExlbmd0aFJlY29yZE5vZGUgc3RhY2sKLQotIGludCBzdGFja1NpemUKLQotZmluYWwgY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuUGR1Q29tcG9zZXIgdGhpcyQwCi0KLXByaXZhdGUgY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuUGR1Q29tcG9zZXIkTGVuZ3RoUmVjb3JkTm9kZSB0b0NvcHkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuUGR1Q29tcG9zZXIpCi0KLSB2b2lkIDxpbml0PigKLWNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LlBkdUNvbXBvc2VyCi1jb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5QZHVDb21wb3NlciQxKQotCi0gdm9pZCBjb3B5KCkKLQotIGNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LlBkdUNvbXBvc2VyJFBvc2l0aW9uTWFya2VyIG1hcmsoKQotCi0gdm9pZCBuZXdidWYoKQotCi0gdm9pZCBwb3AoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9TGVuZ3RoUmVjb3JkTm9kZSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2dvb2dsZS9hbmRyb2lkL21tcy9wZHUvUGR1Q29tcG9zZXI7ICkKLSBjbGFzcyBjb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5QZHVDb21wb3NlciRMZW5ndGhSZWNvcmROb2RlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0gY3VycmVudE1lc3NhZ2UKLQotcHVibGljIGludCBjdXJyZW50UG9zaXRpb24KLQotcHVibGljIGNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LlBkdUNvbXBvc2VyJExlbmd0aFJlY29yZE5vZGUgbmV4dAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi0gdm9pZCA8aW5pdD4oCi1jb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5QZHVDb21wb3NlciQxKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MiBuYW1lID1Qb3NpdGlvbk1hcmtlciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2dvb2dsZS9hbmRyb2lkL21tcy9wZHUvUGR1Q29tcG9zZXI7ICkKLSBjbGFzcyBjb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5QZHVDb21wb3NlciRQb3NpdGlvbk1hcmtlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBpbnQgY19wb3MKLQotcHJpdmF0ZSBpbnQgY3VycmVudFN0YWNrU2l6ZQotCi1maW5hbCBjb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5QZHVDb21wb3NlciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuUGR1Q29tcG9zZXIpCi0KLSB2b2lkIDxpbml0PigKLWNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LlBkdUNvbXBvc2VyCi1jb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5QZHVDb21wb3NlciQxKQotCi1zdGF0aWMgaW50IGFjY2VzcyQ0MDIoCi1jb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5QZHVDb21wb3NlciRQb3NpdGlvbk1hcmtlcgotaW50KQotCi1zdGF0aWMgaW50IGFjY2VzcyQ1MDIoCi1jb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5QZHVDb21wb3NlciRQb3NpdGlvbk1hcmtlcgotaW50KQotCi0gaW50IGdldExlbmd0aCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MY29tL2dvb2dsZS9hbmRyb2lkL21tcy9wZHUvUGR1Q29tcG9zZXIkMTtMY29tL2dvb2dsZS9hbmRyb2lkL21tcy9wZHUvUGR1Q29tcG9zZXIkQnVmZmVyU3RhY2s7TGNvbS9nb29nbGUvYW5kcm9pZC9tbXMvcGR1L1BkdUNvbXBvc2VyJFBvc2l0aW9uTWFya2VyO0xjb20vZ29vZ2xlL2FuZHJvaWQvbW1zL3BkdS9QZHVDb21wb3NlciRMZW5ndGhSZWNvcmROb2RlOyApCi1wdWJsaWMgY2xhc3MgY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuUGR1Q29tcG9zZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBmaW5hbCBib29sZWFuICRhc3NlcnRpb25zRGlzYWJsZWQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVORF9TVFJJTkdfRkxBRwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTEVOR1RIX1FVT1RFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMT05HX0lOVEVHRVJfTEVOR1RIX01BWAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUERVX0NPTVBPU0VSX0JMT0NLX1NJWkUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBEVV9DT01QT1NFX0NPTlRFTlRfRVJST1IKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBEVV9DT01QT1NFX0ZJRUxEX05PVF9TRVQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBEVV9DT01QT1NFX0ZJRUxEX05PVF9TVVBQT1JURUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBEVV9DT01QT1NFX1NVQ0NFU1MKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBEVV9FTUFJTF9BRERSRVNTX1RZUEUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBEVV9JUFY0X0FERFJFU1NfVFlQRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUERVX0lQVjZfQUREUkVTU19UWVBFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQRFVfUEhPTkVfTlVNQkVSX0FERFJFU1NfVFlQRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUERVX1VOS05PV05fQUREUkVTU19UWVBFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBRVU9URURfU1RSSU5HX0ZMQUcKLQotc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUkVHRVhQX0VNQUlMX0FERFJFU1NfVFlQRQotCi1zdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSRUdFWFBfSVBWNF9BRERSRVNTX1RZUEUKLQotc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUkVHRVhQX0lQVjZfQUREUkVTU19UWVBFCi0KLXN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFJFR0VYUF9QSE9ORV9OVU1CRVJfQUREUkVTU19UWVBFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSE9SVF9JTlRFR0VSX01BWAotCi1zdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTVFJJTkdfSVBWNF9BRERSRVNTX1RZUEUKLQotc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU1RSSU5HX0lQVjZfQUREUkVTU19UWVBFCi0KLXN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNUUklOR19QSE9ORV9OVU1CRVJfQUREUkVTU19UWVBFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBURVhUX01BWAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaE1hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL0ludGVnZXI7PjsgKQotcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLkhhc2hNYXAgbUNvbnRlbnRUeXBlTWFwCi0KLXByb3RlY3RlZCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSBtTWVzc2FnZQotCi1wcml2YXRlIGNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LkdlbmVyaWNQZHUgbVBkdQotCi1wcml2YXRlIGNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LlBkdUhlYWRlcnMgbVBkdUhlYWRlcgotCi1wcm90ZWN0ZWQgaW50IG1Qb3NpdGlvbgotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIgbVJlc29sdmVyCi0KLXByaXZhdGUgY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuUGR1Q29tcG9zZXIkQnVmZmVyU3RhY2sgbVN0YWNrCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dAotY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuR2VuZXJpY1BkdSkKLQotc3RhdGljIGNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LlBkdUNvbXBvc2VyJEJ1ZmZlclN0YWNrIGFjY2VzcyQxMDAoCi1jb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5QZHVDb21wb3NlcikKLQotcHJpdmF0ZSBpbnQgYXBwZW5kSGVhZGVyKAotaW50KQotCi1wcm90ZWN0ZWQgc3RhdGljIGludCBjaGVja0FkZHJlc3NUeXBlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBpbnQgbWFrZUFja0luZCgpCi0KLXByaXZhdGUgaW50IG1ha2VNZXNzYWdlQm9keSgpCi0KLXByaXZhdGUgaW50IG1ha2VOb3RpZnlSZXNwKCkKLQotcHJpdmF0ZSBpbnQgbWFrZVJlYWRSZWNJbmQoKQotCi1wcml2YXRlIGludCBtYWtlU2VuZFJlcVBkdSgpCi0KLXByb3RlY3RlZCB2b2lkIGFwcGVuZCgKLWludCkKLQotcHJvdGVjdGVkIHZvaWQgYXBwZW5kRGF0ZVZhbHVlKAotbG9uZykKLQotcHJvdGVjdGVkIHZvaWQgYXBwZW5kRW5jb2RlZFN0cmluZygKLWNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LkVuY29kZWRTdHJpbmdWYWx1ZSkKLQotcHJvdGVjdGVkIHZvaWQgYXBwZW5kTG9uZ0ludGVnZXIoCi1sb25nKQotCi1wcm90ZWN0ZWQgdm9pZCBhcHBlbmRPY3RldCgKLWludCkKLQotcHJvdGVjdGVkIHZvaWQgYXBwZW5kUXVvdGVkU3RyaW5nKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJvdGVjdGVkIHZvaWQgYXBwZW5kUXVvdGVkU3RyaW5nKAotYnl0ZVtdKQotCi1wcm90ZWN0ZWQgdm9pZCBhcHBlbmRTaG9ydEludGVnZXIoCi1pbnQpCi0KLXByb3RlY3RlZCB2b2lkIGFwcGVuZFNob3J0TGVuZ3RoKAotaW50KQotCi1wcm90ZWN0ZWQgdm9pZCBhcHBlbmRUZXh0U3RyaW5nKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJvdGVjdGVkIHZvaWQgYXBwZW5kVGV4dFN0cmluZygKLWJ5dGVbXSkKLQotcHJvdGVjdGVkIHZvaWQgYXBwZW5kVWludHZhckludGVnZXIoCi1sb25nKQotCi1wcm90ZWN0ZWQgdm9pZCBhcHBlbmRWYWx1ZUxlbmd0aCgKLWxvbmcpCi0KLXByb3RlY3RlZCB2b2lkIGFycmF5Y29weSgKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyBieXRlW10gbWFrZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuUGR1Q29udGVudFR5cGVzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZ1tdIGNvbnRlbnRUeXBlcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBjb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5QZHVIZWFkZXJzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBREFQVEFUSU9OX0FMTE9XRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQURESVRJT05BTF9IRUFERVJTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFQUExJQ19JRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFVWF9BUFBMSUNfSUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkNDCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBTkNFTF9JRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQU5DRUxfU1RBVFVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBTkNFTF9TVEFUVVNfUkVRVUVTVF9DT1JSVVBURUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FOQ0VMX1NUQVRVU19SRVFVRVNUX1NVQ0NFU1NGVUxMWV9SRUNFSVZFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05URU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRFTlRfQ0xBU1MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEVOVF9DTEFTU19DT05URU5UX0JBU0lDCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRFTlRfQ0xBU1NfQ09OVEVOVF9SSUNICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRFTlRfQ0xBU1NfSU1BR0VfQkFTSUMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEVOVF9DTEFTU19JTUFHRV9SSUNICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRFTlRfQ0xBU1NfTUVHQVBJWEVMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRFTlRfQ0xBU1NfVEVYVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05URU5UX0NMQVNTX1ZJREVPX0JBU0lDCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRFTlRfQ0xBU1NfVklERU9fUklDSAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05URU5UX0xPQ0FUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRFTlRfVFlQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBEQVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFTElWRVJZX1JFUE9SVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUxJVkVSWV9USU1FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU1RSSUJVVElPTl9JTkRJQ0FUT1IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRFJNX0NPTlRFTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUxFTUVOVF9ERVNDUklQVE9SCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYUElSWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGUk9NCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZST01fQUREUkVTU19QUkVTRU5UX1RPS0VOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBGUk9NX0FERFJFU1NfUFJFU0VOVF9UT0tFTl9TVFIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRlJPTV9JTlNFUlRfQUREUkVTU19UT0tFTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRlJPTV9JTlNFUlRfQUREUkVTU19UT0tFTl9TVFIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTElNSVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUJPWF9RVU9UQVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUJPWF9UT1RBTFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9DTEFTUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX0NMQVNTX0FEVkVSVElTRU1FTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1FU1NBR0VfQ0xBU1NfQURWRVJUSVNFTUVOVF9TVFIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9DTEFTU19BVVRPCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBNRVNTQUdFX0NMQVNTX0FVVE9fU1RSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfQ0xBU1NfSU5GT1JNQVRJT05BTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTUVTU0FHRV9DTEFTU19JTkZPUk1BVElPTkFMX1NUUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX0NMQVNTX1BFUlNPTkFMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBNRVNTQUdFX0NMQVNTX1BFUlNPTkFMX1NUUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX0NPVU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfSUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9TSVpFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfVFlQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1RZUEVfQUNLTk9XTEVER0VfSU5ECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfVFlQRV9DQU5DRUxfQ09ORgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1RZUEVfQ0FOQ0VMX1JFUQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1RZUEVfREVMRVRFX0NPTkYKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9UWVBFX0RFTEVURV9SRVEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9UWVBFX0RFTElWRVJZX0lORAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1RZUEVfRk9SV0FSRF9DT05GCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfVFlQRV9GT1JXQVJEX1JFUQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1RZUEVfTUJPWF9ERUxFVEVfQ09ORgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1RZUEVfTUJPWF9ERUxFVEVfUkVRCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfVFlQRV9NQk9YX0RFU0NSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfVFlQRV9NQk9YX1NUT1JFX0NPTkYKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9UWVBFX01CT1hfU1RPUkVfUkVRCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfVFlQRV9NQk9YX1VQTE9BRF9DT05GCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfVFlQRV9NQk9YX1VQTE9BRF9SRVEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9UWVBFX01CT1hfVklFV19DT05GCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfVFlQRV9NQk9YX1ZJRVdfUkVRCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfVFlQRV9OT1RJRklDQVRJT05fSU5ECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfVFlQRV9OT1RJRllSRVNQX0lORAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1RZUEVfUkVBRF9PUklHX0lORAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1RZUEVfUkVBRF9SRUNfSU5ECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfVFlQRV9SRVRSSUVWRV9DT05GCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfVFlQRV9TRU5EX0NPTkYKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9UWVBFX1NFTkRfUkVRCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1NU19WRVJTSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1NU19WRVJTSU9OXzFfMAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNTVNfVkVSU0lPTl8xXzEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU1TX1ZFUlNJT05fMV8yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1NU19WRVJTSU9OXzFfMwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNTV9GTEFHUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNTV9GTEFHU19BRERfVE9LRU4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU1fRkxBR1NfRklMVEVSX1RPS0VOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1NX0ZMQUdTX1JFTU9WRV9UT0tFTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNTV9TVEFURQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNTV9TVEFURV9EUkFGVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNTV9TVEFURV9GT1JXQVJERUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU1fU1RBVEVfTkVXCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1NX1NUQVRFX1JFVFJJRVZFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNTV9TVEFURV9TRU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRVZJT1VTTFlfU0VOVF9CWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUkVWSU9VU0xZX1NFTlRfREFURQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklPUklUWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklPUklUWV9ISUdICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSU9SSVRZX0xPVwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklPUklUWV9OT1JNQUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUVVPVEFTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFQURfUkVQTFkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVBRF9SRVBPUlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVBRF9TVEFUVVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVBRF9TVEFUVVNfUkVBRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUFEX1NUQVRVU19fREVMRVRFRF9XSVRIT1VUX0JFSU5HX1JFQUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVDT01NRU5ERURfUkVUUklFVkFMX01PREUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVDT01NRU5ERURfUkVUUklFVkFMX01PREVfTUFOVUFMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFQ09NTUVOREVEX1JFVFJJRVZBTF9NT0RFX1RFWFQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVQTEFDRV9JRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVBMWV9BUFBMSUNfSUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVQTFlfQ0hBUkdJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVQTFlfQ0hBUkdJTkdfQUNDRVBURUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVQTFlfQ0hBUkdJTkdfQUNDRVBURURfVEVYVF9PTkxZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUExZX0NIQVJHSU5HX0RFQURMSU5FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUExZX0NIQVJHSU5HX0lECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUExZX0NIQVJHSU5HX1JFUVVFU1RFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVBMWV9DSEFSR0lOR19SRVFVRVNURURfVEVYVF9PTkxZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUExZX0NIQVJHSU5HX1NJWkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVQT1JUX0FMTE9XRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfU1RBVFVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX1NUQVRVU19FUlJPUl9DT05URU5UX05PVF9BQ0NFUFRFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9TVEFUVVNfRVJST1JfTUVTU0FHRV9GT1JNQVRfQ09SUlVQVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9TVEFUVVNfRVJST1JfTUVTU0FHRV9OT1RfRk9VTkQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfU1RBVFVTX0VSUk9SX05FVFdPUktfUFJPQkxFTQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9TVEFUVVNfRVJST1JfUEVSTUFORU5UX0FERFJFU1NfSElESU5HX05PVF9TVVBQT1JURUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfU1RBVFVTX0VSUk9SX1BFUk1BTkVOVF9DT05URU5UX05PVF9BQ0NFUFRFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9TVEFUVVNfRVJST1JfUEVSTUFORU5UX0VORAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9TVEFUVVNfRVJST1JfUEVSTUFORU5UX0ZBSUxVUkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfU1RBVFVTX0VSUk9SX1BFUk1BTkVOVF9MQUNLX09GX1BSRVBBSUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfU1RBVFVTX0VSUk9SX1BFUk1BTkVOVF9NRVNTQUdFX0ZPUk1BVF9DT1JSVVBUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX1NUQVRVU19FUlJPUl9QRVJNQU5FTlRfTUVTU0FHRV9OT1RfRk9VTkQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfU1RBVFVTX0VSUk9SX1BFUk1BTkVOVF9SRVBMWV9DSEFSR0lOR19GT1JXQVJESU5HX0RFTklFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9TVEFUVVNfRVJST1JfUEVSTUFORU5UX1JFUExZX0NIQVJHSU5HX0xJTUlUQVRJT05TX05PVF9NRVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfU1RBVFVTX0VSUk9SX1BFUk1BTkVOVF9SRVBMWV9DSEFSR0lOR19OT1RfU1VQUE9SVEVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX1NUQVRVU19FUlJPUl9QRVJNQU5FTlRfUkVQTFlfQ0hBUkdJTkdfUkVRVUVTVF9OT1RfQUNDRVBURUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfU1RBVFVTX0VSUk9SX1BFUk1BTkVOVF9TRU5ESU5HX0FERFJFU1NfVU5SRVNPTFZFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9TVEFUVVNfRVJST1JfUEVSTUFORU5UX1NFUlZJQ0VfREVOSUVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX1NUQVRVU19FUlJPUl9TRU5ESU5HX0FERFJFU1NfVU5SRVNPTFZFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9TVEFUVVNfRVJST1JfU0VSVklDRV9ERU5JRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfU1RBVFVTX0VSUk9SX1RSQU5TSUVOVF9GQUlMVVJFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX1NUQVRVU19FUlJPUl9UUkFOU0lFTlRfTUVTU0FHRV9OT1RfRk9VTkQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfU1RBVFVTX0VSUk9SX1RSQU5TSUVOVF9ORVRXT1JLX1BST0JMRU0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfU1RBVFVTX0VSUk9SX1RSQU5TSUVOVF9QQVJUSUFMX1NVQ0NFU1MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfU1RBVFVTX0VSUk9SX1RSQU5TSUVOVF9TRU5ETkdfQUREUkVTU19VTlJFU09MVkVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX1NUQVRVU19FUlJPUl9VTlNQRUNJRklFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9TVEFUVVNfRVJST1JfVU5TVVBQT1JURURfTUVTU0FHRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9TVEFUVVNfT0sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfVEVYVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVRSSUVWRV9TVEFUVVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVUUklFVkVfU1RBVFVTX0VSUk9SX0VORAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVRSSUVWRV9TVEFUVVNfRVJST1JfUEVSTUFORU5UX0NPTlRFTlRfVU5TVVBQT1JURUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVUUklFVkVfU1RBVFVTX0VSUk9SX1BFUk1BTkVOVF9GQUlMVVJFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFVFJJRVZFX1NUQVRVU19FUlJPUl9QRVJNQU5FTlRfTUVTU0FHRV9OT1RfRk9VTkQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVUUklFVkVfU1RBVFVTX0VSUk9SX1BFUk1BTkVOVF9TRVJWSUNFX0RFTklFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVRSSUVWRV9TVEFUVVNfRVJST1JfVFJBTlNJRU5UX0ZBSUxVUkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVUUklFVkVfU1RBVFVTX0VSUk9SX1RSQU5TSUVOVF9NRVNTQUdFX05PVF9GT1VORAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVRSSUVWRV9TVEFUVVNfRVJST1JfVFJBTlNJRU5UX05FVFdPUktfUFJPQkxFTQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVRSSUVWRV9TVEFUVVNfT0sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVUUklFVkVfVEVYVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRU5ERVJfVklTSUJJTElUWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRU5ERVJfVklTSUJJTElUWV9ISURFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFTkRFUl9WSVNJQklMSVRZX1NIT1cKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBUlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19ERUZFUlJFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfRVhQSVJFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfRk9SV0FSREVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19JTkRFVEVSTUlOQVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19SRUpFQ1RFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfUkVUUklFVkVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19URVhUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19VTlJFQUNIQUJMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfVU5SRUNPR05JWkVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUT1JFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUT1JFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVE9SRV9TVEFUVVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RPUkVfU1RBVFVTX0VSUk9SX0VORAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVE9SRV9TVEFUVVNfRVJST1JfUEVSTUFORU5UX0ZBSUxVUkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RPUkVfU1RBVFVTX0VSUk9SX1BFUk1BTkVOVF9NRVNTQUdFX0ZPUk1BVF9DT1JSVVBUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUT1JFX1NUQVRVU19FUlJPUl9QRVJNQU5FTlRfTUVTU0FHRV9OT1RfRk9VTkQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RPUkVfU1RBVFVTX0VSUk9SX1BFUk1BTkVOVF9NTUJPWF9GVUxMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUT1JFX1NUQVRVU19FUlJPUl9QRVJNQU5FTlRfU0VSVklDRV9ERU5JRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RPUkVfU1RBVFVTX0VSUk9SX1RSQU5TSUVOVF9GQUlMVVJFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUT1JFX1NUQVRVU19FUlJPUl9UUkFOU0lFTlRfTkVUV09SS19QUk9CTEVNCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUT1JFX1NUQVRVU19TVUNDRVNTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUT1JFX1NUQVRVU19URVhUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNVQkpFQ1QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE8KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE9UQUxTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX0lECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZBTFVFX0FCU09MVVRFX1RPS0VOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZBTFVFX05PCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZBTFVFX1JFTEFUSVZFX1RPS0VOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZBTFVFX1lFUwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaE1hcDxMamF2YS9sYW5nL0ludGVnZXI7TGphdmEvbGFuZy9PYmplY3Q7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuSGFzaE1hcCBtSGVhZGVyTWFwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJvdGVjdGVkIHZvaWQgYXBwZW5kRW5jb2RlZFN0cmluZ1ZhbHVlKAotY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuRW5jb2RlZFN0cmluZ1ZhbHVlCi1pbnQpCi0KLXByb3RlY3RlZCBjb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5FbmNvZGVkU3RyaW5nVmFsdWUgZ2V0RW5jb2RlZFN0cmluZ1ZhbHVlKAotaW50KQotCi1wcm90ZWN0ZWQgY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuRW5jb2RlZFN0cmluZ1ZhbHVlW10gZ2V0RW5jb2RlZFN0cmluZ1ZhbHVlcygKLWludCkKLQotcHJvdGVjdGVkIGxvbmcgZ2V0TG9uZ0ludGVnZXIoCi1pbnQpCi0KLXByb3RlY3RlZCBpbnQgZ2V0T2N0ZXQoCi1pbnQpCi0KLXByb3RlY3RlZCBieXRlW10gZ2V0VGV4dFN0cmluZygKLWludCkKLQotcHJvdGVjdGVkIHZvaWQgc2V0RW5jb2RlZFN0cmluZ1ZhbHVlKAotY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuRW5jb2RlZFN0cmluZ1ZhbHVlCi1pbnQpCi0KLXByb3RlY3RlZCB2b2lkIHNldEVuY29kZWRTdHJpbmdWYWx1ZXMoCi1jb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5FbmNvZGVkU3RyaW5nVmFsdWVbXQotaW50KQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRMb25nSW50ZWdlcigKLWxvbmcKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MY29tL2dvb2dsZS9hbmRyb2lkL21tcy9JbnZhbGlkSGVhZGVyVmFsdWVFeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIHNldE9jdGV0KAotaW50Ci1pbnQpCi0KLXByb3RlY3RlZCB2b2lkIHNldFRleHRTdHJpbmcoCi1ieXRlW10KLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBjb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5QZHVQYXJzZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBmaW5hbCBib29sZWFuICRhc3NlcnRpb25zRGlzYWJsZWQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRU5EX1NUUklOR19GTEFHCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMRU5HVEhfUVVPVEUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0NBTF9MT0dWCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTE9HX1RBRwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTE9OR19JTlRFR0VSX0xFTkdUSF9NQVgKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFFVT1RFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBRVU9URURfU1RSSU5HX0ZMQUcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNIT1JUX0lOVEVHRVJfTUFYCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSE9SVF9MRU5HVEhfTUFYCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBURVhUX01BWAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEVYVF9NSU4KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRIRV9GSVJTVF9QQVJUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUSEVfTEFTVF9QQVJUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUWVBFX1FVT1RFRF9TVFJJTkcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRZUEVfVEVYVF9TVFJJTkcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRZUEVfVE9LRU5fU1RSSU5HCi0KLXByaXZhdGUgc3RhdGljIGJ5dGVbXSBtU3RhcnRQYXJhbQotCi1wcml2YXRlIHN0YXRpYyBieXRlW10gbVR5cGVQYXJhbQotCi1wcml2YXRlIGNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LlBkdUJvZHkgbUJvZHkKLQotcHJpdmF0ZSBjb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5QZHVIZWFkZXJzIG1IZWFkZXJzCi0KLXByaXZhdGUgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbSBtUGR1RGF0YVN0cmVhbQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYnl0ZVtdKQotCi1wcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gY2hlY2tNYW5kYXRvcnlIZWFkZXIoCi1jb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5QZHVIZWFkZXJzKQotCi1wcml2YXRlIHN0YXRpYyBpbnQgY2hlY2tQYXJ0UG9zaXRpb24oCi1jb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5QZHVQYXJ0KQotCi1wcm90ZWN0ZWQgc3RhdGljIGludCBleHRyYWN0Qnl0ZVZhbHVlKAotamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbSkKLQotcHJvdGVjdGVkIHN0YXRpYyBieXRlW10gZ2V0V2FwU3RyaW5nKAotamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbQotaW50KQotCi1wcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNUZXh0KAotaW50KQotCi1wcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNUb2tlbkNoYXJhY3RlcigKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2coCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9pby9CeXRlQXJyYXlJbnB1dFN0cmVhbTtMamF2YS91dGlsL0hhc2hNYXA8TGphdmEvbGFuZy9JbnRlZ2VyO0xqYXZhL2xhbmcvT2JqZWN0Oz47KVtCICkKLXByb3RlY3RlZCBzdGF0aWMgYnl0ZVtdIHBhcnNlQ29udGVudFR5cGUoCi1qYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtCi1qYXZhLnV0aWwuSGFzaE1hcCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvaW8vQnl0ZUFycmF5SW5wdXRTdHJlYW07TGphdmEvdXRpbC9IYXNoTWFwPExqYXZhL2xhbmcvSW50ZWdlcjtMamF2YS9sYW5nL09iamVjdDs+O0xqYXZhL2xhbmcvSW50ZWdlcjspViApCi1wcm90ZWN0ZWQgc3RhdGljIHZvaWQgcGFyc2VDb250ZW50VHlwZVBhcmFtcygKLWphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW0KLWphdmEudXRpbC5IYXNoTWFwCi1qYXZhLmxhbmcuSW50ZWdlcikKLQotcHJvdGVjdGVkIHN0YXRpYyBjb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5FbmNvZGVkU3RyaW5nVmFsdWUgcGFyc2VFbmNvZGVkU3RyaW5nVmFsdWUoCi1qYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtKQotCi1wcm90ZWN0ZWQgc3RhdGljIGxvbmcgcGFyc2VJbnRlZ2VyVmFsdWUoCi1qYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtKQotCi1wcm90ZWN0ZWQgc3RhdGljIGxvbmcgcGFyc2VMb25nSW50ZWdlcigKLWphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW0pCi0KLXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBwYXJzZVBhcnRIZWFkZXJzKAotamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbQotY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuUGR1UGFydAotaW50KQotCi1wcm90ZWN0ZWQgc3RhdGljIGNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LlBkdUJvZHkgcGFyc2VQYXJ0cygKLWphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW0pCi0KLXByb3RlY3RlZCBzdGF0aWMgaW50IHBhcnNlU2hvcnRJbnRlZ2VyKAotamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbSkKLQotcHJvdGVjdGVkIHN0YXRpYyBpbnQgcGFyc2VVbnNpZ25lZEludCgKLWphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW0pCi0KLXByb3RlY3RlZCBzdGF0aWMgaW50IHBhcnNlVmFsdWVMZW5ndGgoCi1qYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtKQotCi1wcm90ZWN0ZWQgc3RhdGljIGJ5dGVbXSBwYXJzZVdhcFN0cmluZygKLWphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW0KLWludCkKLQotcHJvdGVjdGVkIHN0YXRpYyBpbnQgc2tpcFdhcFZhbHVlKAotamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbQotaW50KQotCi1wdWJsaWMgY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuR2VuZXJpY1BkdSBwYXJzZSgpCi0KLXByb3RlY3RlZCBjb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5QZHVIZWFkZXJzIHBhcnNlSGVhZGVycygKLWphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW0pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuUGR1UGFydCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENPTlRFTlRfVFJBTlNGRVJfRU5DT0RJTkcKLQotc3RhdGljIGZpbmFsIGJ5dGVbXSBESVNQT1NJVElPTl9BVFRBQ0hNRU5UCi0KLXN0YXRpYyBmaW5hbCBieXRlW10gRElTUE9TSVRJT05fRlJPTV9EQVRBCi0KLXN0YXRpYyBmaW5hbCBieXRlW10gRElTUE9TSVRJT05fSU5MSU5FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQXzdCSVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBfOEJJVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUF9CQVNFNjQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBfQklOQVJZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBfQ0hBUlNFVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQX0NPTU1FTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUF9DT05URU5UX0RJU1BPU0lUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBfQ09OVEVOVF9JRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQX0NPTlRFTlRfTE9DQVRJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUF9DT05URU5UX1RSQU5TRkVSX0VOQ09ESU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBfQ09OVEVOVF9UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBfQ1JFQVRJT05fREFURQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQX0NUX01SX1RZUEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUF9ERVBfQ09NTUVOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQX0RFUF9DT05URU5UX0RJU1BPU0lUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBfREVQX0RPTUFJTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQX0RFUF9GSUxFTkFNRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQX0RFUF9OQU1FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBfREVQX1BBVEgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUF9ERVBfU1RBUlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUF9ERVBfU1RBUlRfSU5GTwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQX0RJRkZFUkVOQ0VTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBfRElTUE9TSVRJT05fQVRUQUNITUVOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQX0RJU1BPU0lUSU9OX0ZST01fREFUQQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQX0RJU1BPU0lUSU9OX0lOTElORQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQX0RPTUFJTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQX0ZJTEVOQU1FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBfTEVWRUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUF9NQUMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUF9NQVhfQUdFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBfTU9ESUZJQ0FUSU9OX0RBVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUF9OQU1FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBfUEFERElORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQX1BBVEgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUF9RCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQX1FVT1RFRF9QUklOVEFCTEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUF9SRUFEX0RBVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUF9TRUMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUF9TRUNVUkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUF9TSVpFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBfU1RBUlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUF9TVEFSVF9JTkZPCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBfVFlQRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRBRwotCi1wcml2YXRlIGJ5dGVbXSBtUGFydERhdGEKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL01hcDxMamF2YS9sYW5nL0ludGVnZXI7TGphdmEvbGFuZy9PYmplY3Q7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuTWFwIG1QYXJ0SGVhZGVyCi0KLXByaXZhdGUgYW5kcm9pZC5uZXQuVXJpIG1VcmkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlTG9jYXRpb24oKQotCi1wdWJsaWMgaW50IGdldENoYXJzZXQoKQotCi1wdWJsaWMgYnl0ZVtdIGdldENvbnRlbnREaXNwb3NpdGlvbigpCi0KLXB1YmxpYyBieXRlW10gZ2V0Q29udGVudElkKCkKLQotcHVibGljIGJ5dGVbXSBnZXRDb250ZW50TG9jYXRpb24oKQotCi1wdWJsaWMgYnl0ZVtdIGdldENvbnRlbnRUcmFuc2ZlckVuY29kaW5nKCkKLQotcHVibGljIGJ5dGVbXSBnZXRDb250ZW50VHlwZSgpCi0KLXB1YmxpYyBieXRlW10gZ2V0RGF0YSgpCi0KLXB1YmxpYyBhbmRyb2lkLm5ldC5VcmkgZ2V0RGF0YVVyaSgpCi0KLXB1YmxpYyBieXRlW10gZ2V0RmlsZW5hbWUoKQotCi1wdWJsaWMgYnl0ZVtdIGdldE5hbWUoKQotCi1wdWJsaWMgdm9pZCBzZXRDaGFyc2V0KAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRDb250ZW50RGlzcG9zaXRpb24oCi1ieXRlW10pCi0KLXB1YmxpYyB2b2lkIHNldENvbnRlbnRJZCgKLWJ5dGVbXSkKLQotcHVibGljIHZvaWQgc2V0Q29udGVudExvY2F0aW9uKAotYnl0ZVtdKQotCi1wdWJsaWMgdm9pZCBzZXRDb250ZW50VHJhbnNmZXJFbmNvZGluZygKLWJ5dGVbXSkKLQotcHVibGljIHZvaWQgc2V0Q29udGVudFR5cGUoCi1ieXRlW10pCi0KLXB1YmxpYyB2b2lkIHNldERhdGEoCi1ieXRlW10pCi0KLXB1YmxpYyB2b2lkIHNldERhdGFVcmkoCi1hbmRyb2lkLm5ldC5VcmkpCi0KLXB1YmxpYyB2b2lkIHNldEZpbGVuYW1lKAotYnl0ZVtdKQotCi1wdWJsaWMgdm9pZCBzZXROYW1lKAotYnl0ZVtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LlBkdVBlcnNpc3RlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gQUREUkVTU19GSUVMRFMKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0hhc2hNYXA8TGphdmEvbGFuZy9JbnRlZ2VyO0xqYXZhL2xhbmcvSW50ZWdlcjs+OyApCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuSGFzaE1hcCBDSEFSU0VUX0NPTFVNTl9JTkRFWF9NQVAKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0hhc2hNYXA8TGphdmEvbGFuZy9JbnRlZ2VyO0xqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEudXRpbC5IYXNoTWFwIENIQVJTRVRfQ09MVU1OX05BTUVfTUFQCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBEVU1NWV9USFJFQURfSUQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0hhc2hNYXA8TGphdmEvbGFuZy9JbnRlZ2VyO0xqYXZhL2xhbmcvSW50ZWdlcjs+OyApCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuSGFzaE1hcCBFTkNPREVEX1NUUklOR19DT0xVTU5fSU5ERVhfTUFQCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNoTWFwPExqYXZhL2xhbmcvSW50ZWdlcjtMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuSGFzaE1hcCBFTkNPREVEX1NUUklOR19DT0xVTU5fTkFNRV9NQVAKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0NBTF9MT0dWCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNoTWFwPExqYXZhL2xhbmcvSW50ZWdlcjtMamF2YS9sYW5nL0ludGVnZXI7PjsgKQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS51dGlsLkhhc2hNYXAgTE9OR19DT0xVTU5fSU5ERVhfTUFQCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNoTWFwPExqYXZhL2xhbmcvSW50ZWdlcjtMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuSGFzaE1hcCBMT05HX0NPTFVNTl9OQU1FX01BUAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaE1hcDxMYW5kcm9pZC9uZXQvVXJpO0xqYXZhL2xhbmcvSW50ZWdlcjs+OyApCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuSGFzaE1hcCBNRVNTQUdFX0JPWF9NQVAKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0hhc2hNYXA8TGphdmEvbGFuZy9JbnRlZ2VyO0xqYXZhL2xhbmcvSW50ZWdlcjs+OyApCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuSGFzaE1hcCBPQ1RFVF9DT0xVTU5fSU5ERVhfTUFQCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNoTWFwPExqYXZhL2xhbmcvSW50ZWdlcjtMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuSGFzaE1hcCBPQ1RFVF9DT0xVTU5fTkFNRV9NQVAKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBUlRfQ09MVU1OX0NIQVJTRVQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBUlRfQ09MVU1OX0NPTlRFTlRfRElTUE9TSVRJT04KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBUlRfQ09MVU1OX0NPTlRFTlRfSUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBUlRfQ09MVU1OX0NPTlRFTlRfTE9DQVRJT04KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBUlRfQ09MVU1OX0NPTlRFTlRfVFlQRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEFSVF9DT0xVTU5fRklMRU5BTUUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBUlRfQ09MVU1OX0lECi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQQVJUX0NPTFVNTl9OQU1FCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmdbXSBQQVJUX1BST0pFQ1RJT04KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgY29tLmdvb2dsZS5hbmRyb2lkLm1tcy51dGlsLlBkdUNhY2hlIFBEVV9DQUNIRV9JTlNUQU5DRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUERVX0NPTFVNTl9DT05URU5UX0NMQVNTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQRFVfQ09MVU1OX0NPTlRFTlRfTE9DQVRJT04KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBEVV9DT0xVTU5fQ09OVEVOVF9UWVBFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQRFVfQ09MVU1OX0RBVEUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBEVV9DT0xVTU5fREVMSVZFUllfUkVQT1JUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQRFVfQ09MVU1OX0RFTElWRVJZX1RJTUUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBEVV9DT0xVTU5fRVhQSVJZCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQRFVfQ09MVU1OX0lECi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQRFVfQ09MVU1OX01FU1NBR0VfQk9YCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQRFVfQ09MVU1OX01FU1NBR0VfQ0xBU1MKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBEVV9DT0xVTU5fTUVTU0FHRV9JRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUERVX0NPTFVNTl9NRVNTQUdFX1NJWkUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBEVV9DT0xVTU5fTUVTU0FHRV9UWVBFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQRFVfQ09MVU1OX01NU19WRVJTSU9OCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQRFVfQ09MVU1OX1BSSU9SSVRZCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQRFVfQ09MVU1OX1JFQURfUkVQT1JUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQRFVfQ09MVU1OX1JFQURfU1RBVFVTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQRFVfQ09MVU1OX1JFUE9SVF9BTExPV0VECi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQRFVfQ09MVU1OX1JFU1BPTlNFX1RFWFQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBEVV9DT0xVTU5fUkVUUklFVkVfU1RBVFVTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQRFVfQ09MVU1OX1JFVFJJRVZFX1RFWFQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBEVV9DT0xVTU5fUkVUUklFVkVfVEVYVF9DSEFSU0VUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQRFVfQ09MVU1OX1NUQVRVUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUERVX0NPTFVNTl9TVUJKRUNUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQRFVfQ09MVU1OX1NVQkpFQ1RfQ0hBUlNFVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUERVX0NPTFVNTl9USFJFQURfSUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBEVV9DT0xVTU5fVFJBTlNBQ1RJT05fSUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZ1tdIFBEVV9QUk9KRUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST0NfU1RBVFVTX0NPTVBMRVRFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9DX1NUQVRVU19QRVJNQU5FTlRMWV9GQUlMVVJFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST0NfU1RBVFVTX1RSQU5TSUVOVF9GQUlMVVJFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEFHCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBURU1QT1JBUllfRFJNX09CSkVDVF9VUkkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0hhc2hNYXA8TGphdmEvbGFuZy9JbnRlZ2VyO0xqYXZhL2xhbmcvSW50ZWdlcjs+OyApCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuSGFzaE1hcCBURVhUX1NUUklOR19DT0xVTU5fSU5ERVhfTUFQCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNoTWFwPExqYXZhL2xhbmcvSW50ZWdlcjtMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuSGFzaE1hcCBURVhUX1NUUklOR19DT0xVTU5fTkFNRV9NQVAKLQotcHJpdmF0ZSBzdGF0aWMgY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuUGR1UGVyc2lzdGVyIHNQZXJzaXN0ZXIKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyIG1Db250ZW50UmVzb2x2ZXIKLQotcHJpdmF0ZSBmaW5hbCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBtQ29udGV4dAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1wcml2YXRlIGJ5dGVbXSBnZXRCeXRlQXJyYXlGcm9tUGFydENvbHVtbigKLWFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGdldEJ5dGVzKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBqYXZhLmxhbmcuSW50ZWdlciBnZXRJbnRlZ2VyRnJvbVBhcnRDb2x1bW4oCi1hbmRyb2lkLmRhdGFiYXNlLkN1cnNvcgotaW50KQotCi1wdWJsaWMgc3RhdGljIGNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LlBkdVBlcnNpc3RlciBnZXRQZHVQZXJzaXN0ZXIoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotcHJpdmF0ZSB2b2lkIGxvYWRBZGRyZXNzKAotbG9uZwotY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuUGR1SGVhZGVycykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MY29tL2dvb2dsZS9hbmRyb2lkL21tcy9NbXNFeGNlcHRpb247ICkKLXByaXZhdGUgY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuUGR1UGFydFtdIGxvYWRQYXJ0cygKLWxvbmcpCi0KLXByaXZhdGUgdm9pZCBwZXJzaXN0QWRkcmVzcygKLWxvbmcKLWludAotY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuRW5jb2RlZFN0cmluZ1ZhbHVlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGNvbS9nb29nbGUvYW5kcm9pZC9tbXMvTW1zRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgcGVyc2lzdERhdGEoCi1jb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5QZHVQYXJ0Ci1hbmRyb2lkLm5ldC5VcmkKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgdm9pZCBzZXRFbmNvZGVkU3RyaW5nVmFsdWVUb0hlYWRlcnMoCi1hbmRyb2lkLmRhdGFiYXNlLkN1cnNvcgotaW50Ci1jb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5QZHVIZWFkZXJzCi1pbnQpCi0KLXByaXZhdGUgdm9pZCBzZXRMb25nVG9IZWFkZXJzKAotYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IKLWludAotY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuUGR1SGVhZGVycwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxjb20vZ29vZ2xlL2FuZHJvaWQvbW1zL0ludmFsaWRIZWFkZXJWYWx1ZUV4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHNldE9jdGV0VG9IZWFkZXJzKAotYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IKLWludAotY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuUGR1SGVhZGVycwotaW50KQotCi1wcml2YXRlIHZvaWQgc2V0VGV4dFN0cmluZ1RvSGVhZGVycygKLWFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yCi1pbnQKLWNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LlBkdUhlYWRlcnMKLWludCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIHRvSXNvU3RyaW5nKAotYnl0ZVtdKQotCi1wcml2YXRlIHZvaWQgdXBkYXRlQWRkcmVzcygKLWxvbmcKLWludAotY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuRW5jb2RlZFN0cmluZ1ZhbHVlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGNvbS9nb29nbGUvYW5kcm9pZC9tbXMvTW1zRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgdXBkYXRlUGFydCgKLWFuZHJvaWQubmV0LlVyaQotY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuUGR1UGFydCkKLQotcHVibGljIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIGdldFBlbmRpbmdNZXNzYWdlcygKLWxvbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGNvbS9nb29nbGUvYW5kcm9pZC9tbXMvTW1zRXhjZXB0aW9uOyApCi1wdWJsaWMgY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuR2VuZXJpY1BkdSBsb2FkKAotYW5kcm9pZC5uZXQuVXJpKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxjb20vZ29vZ2xlL2FuZHJvaWQvbW1zL01tc0V4Y2VwdGlvbjsgKQotcHVibGljIGFuZHJvaWQubmV0LlVyaSBtb3ZlKAotYW5kcm9pZC5uZXQuVXJpCi1hbmRyb2lkLm5ldC5VcmkpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGNvbS9nb29nbGUvYW5kcm9pZC9tbXMvTW1zRXhjZXB0aW9uOyApCi1wdWJsaWMgYW5kcm9pZC5uZXQuVXJpIHBlcnNpc3QoCi1jb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5HZW5lcmljUGR1Ci1hbmRyb2lkLm5ldC5VcmkpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGNvbS9nb29nbGUvYW5kcm9pZC9tbXMvTW1zRXhjZXB0aW9uOyApCi1wdWJsaWMgYW5kcm9pZC5uZXQuVXJpIHBlcnNpc3RQYXJ0KAotY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuUGR1UGFydAotbG9uZykKLQotcHVibGljIHZvaWQgcmVsZWFzZSgpCi0KLXB1YmxpYyB2b2lkIHVwZGF0ZUhlYWRlcnMoCi1hbmRyb2lkLm5ldC5VcmkKLWNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LlNlbmRSZXEpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGNvbS9nb29nbGUvYW5kcm9pZC9tbXMvTW1zRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB1cGRhdGVQYXJ0cygKLWFuZHJvaWQubmV0LlVyaQotY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuUGR1Qm9keSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBjb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5RdW90ZWRQcmludGFibGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGJ5dGUgRVNDQVBFX0NIQVIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIGRlY29kZVF1b3RlZFByaW50YWJsZSgKLWJ5dGVbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBjb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5SZWFkT3JpZ0luZCBleHRlbmRzIGNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LkdlbmVyaWNQZHUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxjb20vZ29vZ2xlL2FuZHJvaWQvbW1zL0ludmFsaWRIZWFkZXJWYWx1ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KAotY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuUGR1SGVhZGVycykKLQotcHVibGljIGxvbmcgZ2V0RGF0ZSgpCi0KLXB1YmxpYyBjb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5FbmNvZGVkU3RyaW5nVmFsdWUgZ2V0RnJvbSgpCi0KLXB1YmxpYyBieXRlW10gZ2V0TWVzc2FnZUlkKCkKLQotcHVibGljIGludCBnZXRSZWFkU3RhdHVzKCkKLQotcHVibGljIGNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LkVuY29kZWRTdHJpbmdWYWx1ZVtdIGdldFRvKCkKLQotcHVibGljIHZvaWQgc2V0RGF0ZSgKLWxvbmcpCi0KLXB1YmxpYyB2b2lkIHNldEZyb20oCi1jb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5FbmNvZGVkU3RyaW5nVmFsdWUpCi0KLXB1YmxpYyB2b2lkIHNldE1lc3NhZ2VJZCgKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MY29tL2dvb2dsZS9hbmRyb2lkL21tcy9JbnZhbGlkSGVhZGVyVmFsdWVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldFJlYWRTdGF0dXMoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldFRvKAotY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuRW5jb2RlZFN0cmluZ1ZhbHVlW10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuUmVhZFJlY0luZCBleHRlbmRzIGNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LkdlbmVyaWNQZHUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxjb20vZ29vZ2xlL2FuZHJvaWQvbW1zL0ludmFsaWRIZWFkZXJWYWx1ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuRW5jb2RlZFN0cmluZ1ZhbHVlCi1ieXRlW10KLWludAotaW50Ci1jb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5FbmNvZGVkU3RyaW5nVmFsdWVbXSkKLQotIHZvaWQgPGluaXQ+KAotY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuUGR1SGVhZGVycykKLQotcHVibGljIGxvbmcgZ2V0RGF0ZSgpCi0KLXB1YmxpYyBjb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5FbmNvZGVkU3RyaW5nVmFsdWUgZ2V0RnJvbSgpCi0KLXB1YmxpYyBieXRlW10gZ2V0TWVzc2FnZUlkKCkKLQotcHVibGljIGludCBnZXRSZWFkU3RhdHVzKCkKLQotcHVibGljIGNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LkVuY29kZWRTdHJpbmdWYWx1ZVtdIGdldFRvKCkKLQotcHVibGljIHZvaWQgc2V0RGF0ZSgKLWxvbmcpCi0KLXB1YmxpYyB2b2lkIHNldEZyb20oCi1jb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5FbmNvZGVkU3RyaW5nVmFsdWUpCi0KLXB1YmxpYyB2b2lkIHNldE1lc3NhZ2VJZCgKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MY29tL2dvb2dsZS9hbmRyb2lkL21tcy9JbnZhbGlkSGVhZGVyVmFsdWVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldFJlYWRTdGF0dXMoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldFRvKAotY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuRW5jb2RlZFN0cmluZ1ZhbHVlW10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuUmV0cmlldmVDb25mIGV4dGVuZHMgY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuTXVsdGltZWRpYU1lc3NhZ2VQZHUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxjb20vZ29vZ2xlL2FuZHJvaWQvbW1zL0ludmFsaWRIZWFkZXJWYWx1ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KAotY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuUGR1SGVhZGVycykKLQotIHZvaWQgPGluaXQ+KAotY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuUGR1SGVhZGVycwotY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuUGR1Qm9keSkKLQotcHVibGljIHZvaWQgYWRkQ2MoCi1jb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5FbmNvZGVkU3RyaW5nVmFsdWUpCi0KLXB1YmxpYyBjb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5FbmNvZGVkU3RyaW5nVmFsdWVbXSBnZXRDYygpCi0KLXB1YmxpYyBieXRlW10gZ2V0Q29udGVudFR5cGUoKQotCi1wdWJsaWMgaW50IGdldERlbGl2ZXJ5UmVwb3J0KCkKLQotcHVibGljIGNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LkVuY29kZWRTdHJpbmdWYWx1ZSBnZXRGcm9tKCkKLQotcHVibGljIGJ5dGVbXSBnZXRNZXNzYWdlQ2xhc3MoKQotCi1wdWJsaWMgYnl0ZVtdIGdldE1lc3NhZ2VJZCgpCi0KLXB1YmxpYyBpbnQgZ2V0UmVhZFJlcG9ydCgpCi0KLXB1YmxpYyBpbnQgZ2V0UmV0cmlldmVTdGF0dXMoKQotCi1wdWJsaWMgY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuRW5jb2RlZFN0cmluZ1ZhbHVlIGdldFJldHJpZXZlVGV4dCgpCi0KLXB1YmxpYyBieXRlW10gZ2V0VHJhbnNhY3Rpb25JZCgpCi0KLXB1YmxpYyB2b2lkIHNldENvbnRlbnRUeXBlKAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxjb20vZ29vZ2xlL2FuZHJvaWQvbW1zL0ludmFsaWRIZWFkZXJWYWx1ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0RGVsaXZlcnlSZXBvcnQoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldEZyb20oCi1jb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5FbmNvZGVkU3RyaW5nVmFsdWUpCi0KLXB1YmxpYyB2b2lkIHNldE1lc3NhZ2VDbGFzcygKLWJ5dGVbXSkKLQotcHVibGljIHZvaWQgc2V0TWVzc2FnZUlkKAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxjb20vZ29vZ2xlL2FuZHJvaWQvbW1zL0ludmFsaWRIZWFkZXJWYWx1ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0UmVhZFJlcG9ydCgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MY29tL2dvb2dsZS9hbmRyb2lkL21tcy9JbnZhbGlkSGVhZGVyVmFsdWVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldFJldHJpZXZlU3RhdHVzKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRSZXRyaWV2ZVRleHQoCi1jb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5FbmNvZGVkU3RyaW5nVmFsdWUpCi0KLXB1YmxpYyB2b2lkIHNldFRyYW5zYWN0aW9uSWQoCi1ieXRlW10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuU2VuZENvbmYgZXh0ZW5kcyBjb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5HZW5lcmljUGR1Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MY29tL2dvb2dsZS9hbmRyb2lkL21tcy9JbnZhbGlkSGVhZGVyVmFsdWVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLSB2b2lkIDxpbml0PigKLWNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LlBkdUhlYWRlcnMpCi0KLXB1YmxpYyBieXRlW10gZ2V0TWVzc2FnZUlkKCkKLQotcHVibGljIGludCBnZXRSZXNwb25zZVN0YXR1cygpCi0KLXB1YmxpYyBieXRlW10gZ2V0VHJhbnNhY3Rpb25JZCgpCi0KLXB1YmxpYyB2b2lkIHNldE1lc3NhZ2VJZCgKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MY29tL2dvb2dsZS9hbmRyb2lkL21tcy9JbnZhbGlkSGVhZGVyVmFsdWVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldFJlc3BvbnNlU3RhdHVzKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRUcmFuc2FjdGlvbklkKAotYnl0ZVtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LlNlbmRSZXEgZXh0ZW5kcyBjb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5NdWx0aW1lZGlhTWVzc2FnZVBkdQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRBRwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLSB2b2lkIDxpbml0PigKLWNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LlBkdUhlYWRlcnMpCi0KLSB2b2lkIDxpbml0PigKLWNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LlBkdUhlYWRlcnMKLWNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LlBkdUJvZHkpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGNvbS9nb29nbGUvYW5kcm9pZC9tbXMvSW52YWxpZEhlYWRlclZhbHVlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ieXRlW10KLWNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LkVuY29kZWRTdHJpbmdWYWx1ZQotaW50Ci1ieXRlW10pCi0KLXByaXZhdGUgYnl0ZVtdIGdlbmVyYXRlVHJhbnNhY3Rpb25JZCgpCi0KLXB1YmxpYyB2b2lkIGFkZEJjYygKLWNvbS5nb29nbGUuYW5kcm9pZC5tbXMucGR1LkVuY29kZWRTdHJpbmdWYWx1ZSkKLQotcHVibGljIHZvaWQgYWRkQ2MoCi1jb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5FbmNvZGVkU3RyaW5nVmFsdWUpCi0KLXB1YmxpYyBjb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5FbmNvZGVkU3RyaW5nVmFsdWVbXSBnZXRCY2MoKQotCi1wdWJsaWMgY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuRW5jb2RlZFN0cmluZ1ZhbHVlW10gZ2V0Q2MoKQotCi1wdWJsaWMgYnl0ZVtdIGdldENvbnRlbnRUeXBlKCkKLQotcHVibGljIGludCBnZXREZWxpdmVyeVJlcG9ydCgpCi0KLXB1YmxpYyBsb25nIGdldEV4cGlyeSgpCi0KLXB1YmxpYyBjb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5FbmNvZGVkU3RyaW5nVmFsdWUgZ2V0RnJvbSgpCi0KLXB1YmxpYyBieXRlW10gZ2V0TWVzc2FnZUNsYXNzKCkKLQotcHVibGljIGludCBnZXRSZWFkUmVwb3J0KCkKLQotcHVibGljIGJ5dGVbXSBnZXRUcmFuc2FjdGlvbklkKCkKLQotcHVibGljIHZvaWQgc2V0QmNjKAotY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuRW5jb2RlZFN0cmluZ1ZhbHVlW10pCi0KLXB1YmxpYyB2b2lkIHNldENjKAotY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuRW5jb2RlZFN0cmluZ1ZhbHVlW10pCi0KLXB1YmxpYyB2b2lkIHNldENvbnRlbnRUeXBlKAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxjb20vZ29vZ2xlL2FuZHJvaWQvbW1zL0ludmFsaWRIZWFkZXJWYWx1ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0RGVsaXZlcnlSZXBvcnQoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldEV4cGlyeSgKLWxvbmcpCi0KLXB1YmxpYyB2b2lkIHNldEZyb20oCi1jb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5FbmNvZGVkU3RyaW5nVmFsdWUpCi0KLXB1YmxpYyB2b2lkIHNldE1lc3NhZ2VDbGFzcygKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MY29tL2dvb2dsZS9hbmRyb2lkL21tcy9JbnZhbGlkSGVhZGVyVmFsdWVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldFJlYWRSZXBvcnQoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldFRvKAotY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuRW5jb2RlZFN0cmluZ1ZhbHVlW10pCi0KLXB1YmxpYyB2b2lkIHNldFRyYW5zYWN0aW9uSWQoCi1ieXRlW10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID00MTA0IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9nb29nbGUvYW5kcm9pZC9tbXMvdXRpbC9BYnN0cmFjdENhY2hlOyApCi0gY2xhc3MgY29tLmdvb2dsZS5hbmRyb2lkLm1tcy51dGlsLkFic3RyYWN0Q2FjaGUkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9Q2FjaGVFbnRyeSApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFY6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL2xhbmcvT2JqZWN0OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2dvb2dsZS9hbmRyb2lkL21tcy91dGlsL0Fic3RyYWN0Q2FjaGU7ICkKLSBjbGFzcyBjb20uZ29vZ2xlLmFuZHJvaWQubW1zLnV0aWwuQWJzdHJhY3RDYWNoZSRDYWNoZUVudHJ5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gaW50IGhpdAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPVRWOyApCi0gamF2YS5sYW5nLk9iamVjdCB2YWx1ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi0gdm9pZCA8aW5pdD4oCi1jb20uZ29vZ2xlLmFuZHJvaWQubW1zLnV0aWwuQWJzdHJhY3RDYWNoZSQxKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08SzpMamF2YS9sYW5nL09iamVjdDtWOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS9sYW5nL09iamVjdDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MY29tL2dvb2dsZS9hbmRyb2lkL21tcy91dGlsL0Fic3RyYWN0Q2FjaGUkMTtMY29tL2dvb2dsZS9hbmRyb2lkL21tcy91dGlsL0Fic3RyYWN0Q2FjaGUkQ2FjaGVFbnRyeTsgKQotcHVibGljIGFic3RyYWN0IGNsYXNzIGNvbS5nb29nbGUuYW5kcm9pZC5tbXMudXRpbC5BYnN0cmFjdENhY2hlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gTE9DQUxfTE9HVgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0NBQ0hFRF9JVEVNUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRBRwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaE1hcDxUSztMY29tL2dvb2dsZS9hbmRyb2lkL21tcy91dGlsL0Fic3RyYWN0Q2FjaGUkQ2FjaGVFbnRyeTxUVjs+Oz47ICkKLXByaXZhdGUgZmluYWwgamF2YS51dGlsLkhhc2hNYXAgbUNhY2hlTWFwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEs7KVRWOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXQoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUSzspVFY7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHB1cmdlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHZvaWQgcHVyZ2VBbGwoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUSztUVjspWiApCi1wdWJsaWMgYm9vbGVhbiBwdXQoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50IHNpemUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MY29tL2dvb2dsZS9hbmRyb2lkL21tcy91dGlsL0Fic3RyYWN0Q2FjaGU8TGFuZHJvaWQvbmV0L1VyaTtMY29tL2dvb2dsZS9hbmRyb2lkL21tcy91dGlsL1BkdUNhY2hlRW50cnk7PjsgKQotcHVibGljIGZpbmFsIGNsYXNzIGNvbS5nb29nbGUuYW5kcm9pZC5tbXMudXRpbC5QZHVDYWNoZSBleHRlbmRzIGNvbS5nb29nbGUuYW5kcm9pZC5tbXMudXRpbC5BYnN0cmFjdENhY2hlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0NBTF9MT0dWCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNoTWFwPExqYXZhL2xhbmcvSW50ZWdlcjtMamF2YS9sYW5nL0ludGVnZXI7PjsgKQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS51dGlsLkhhc2hNYXAgTUFUQ0hfVE9fTVNHQk9YX0lEX01BUAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU1TX0FMTAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU1TX0FMTF9JRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU1TX0NPTlZFUlNBVElPTgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU1TX0NPTlZFUlNBVElPTl9JRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU1TX0RSQUZUUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU1TX0RSQUZUU19JRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU1TX0lOQk9YCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNTVNfSU5CT1hfSUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1NU19PVVRCT1gKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1NU19PVVRCT1hfSUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1NU19TRU5UCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNTVNfU0VOVF9JRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRBRwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmNvbnRlbnQuVXJpTWF0Y2hlciBVUklfTUFUQ0hFUgotCi1wcml2YXRlIHN0YXRpYyBjb20uZ29vZ2xlLmFuZHJvaWQubW1zLnV0aWwuUGR1Q2FjaGUgc0luc3RhbmNlCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNoTWFwPExqYXZhL2xhbmcvSW50ZWdlcjtMamF2YS91dGlsL0hhc2hTZXQ8TGFuZHJvaWQvbmV0L1VyaTs+Oz47ICkKLXByaXZhdGUgZmluYWwgamF2YS51dGlsLkhhc2hNYXAgbU1lc3NhZ2VCb3hlcwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaE1hcDxMamF2YS9sYW5nL0xvbmc7TGphdmEvdXRpbC9IYXNoU2V0PExhbmRyb2lkL25ldC9Vcmk7Pjs+OyApCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5IYXNoTWFwIG1UaHJlYWRzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uZ29vZ2xlLmFuZHJvaWQubW1zLnV0aWwuUGR1Q2FjaGUgZ2V0SW5zdGFuY2UoKQotCi1wcml2YXRlIGFuZHJvaWQubmV0LlVyaSBub3JtYWxpemVLZXkoCi1hbmRyb2lkLm5ldC5VcmkpCi0KLXByaXZhdGUgdm9pZCBwdXJnZUJ5TWVzc2FnZUJveCgKLWphdmEubGFuZy5JbnRlZ2VyKQotCi1wcml2YXRlIHZvaWQgcHVyZ2VCeVRocmVhZElkKAotbG9uZykKLQotcHJpdmF0ZSBjb20uZ29vZ2xlLmFuZHJvaWQubW1zLnV0aWwuUGR1Q2FjaGVFbnRyeSBwdXJnZVNpbmdsZUVudHJ5KAotYW5kcm9pZC5uZXQuVXJpKQotCi1wcml2YXRlIHZvaWQgcmVtb3ZlRnJvbU1lc3NhZ2VCb3hlcygKLWFuZHJvaWQubmV0LlVyaQotY29tLmdvb2dsZS5hbmRyb2lkLm1tcy51dGlsLlBkdUNhY2hlRW50cnkpCi0KLXByaXZhdGUgdm9pZCByZW1vdmVGcm9tVGhyZWFkcygKLWFuZHJvaWQubmV0LlVyaQotY29tLmdvb2dsZS5hbmRyb2lkLm1tcy51dGlsLlBkdUNhY2hlRW50cnkpCi0KLXB1YmxpYyBjb20uZ29vZ2xlLmFuZHJvaWQubW1zLnV0aWwuUGR1Q2FjaGVFbnRyeSBwdXJnZSgKLWFuZHJvaWQubmV0LlVyaSkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgcHVyZ2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgdm9pZCBwdXJnZUFsbCgpCi0KLXB1YmxpYyBib29sZWFuIHB1dCgKLWFuZHJvaWQubmV0LlVyaQotY29tLmdvb2dsZS5hbmRyb2lkLm1tcy51dGlsLlBkdUNhY2hlRW50cnkpCi0KLXB1YmxpYyB2b2xhdGlsZSBib29sZWFuIHB1dCgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgY29tLmdvb2dsZS5hbmRyb2lkLm1tcy51dGlsLlBkdUNhY2hlRW50cnkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgaW50IG1NZXNzYWdlQm94Ci0KLXByaXZhdGUgZmluYWwgY29tLmdvb2dsZS5hbmRyb2lkLm1tcy5wZHUuR2VuZXJpY1BkdSBtUGR1Ci0KLXByaXZhdGUgZmluYWwgbG9uZyBtVGhyZWFkSWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1jb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5HZW5lcmljUGR1Ci1pbnQKLWxvbmcpCi0KLXB1YmxpYyBpbnQgZ2V0TWVzc2FnZUJveCgpCi0KLXB1YmxpYyBjb20uZ29vZ2xlLmFuZHJvaWQubW1zLnBkdS5HZW5lcmljUGR1IGdldFBkdSgpCi0KLXB1YmxpYyBsb25nIGdldFRocmVhZElkKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBjb20uZ29vZ2xlLmFuZHJvaWQubW1zLnV0aWwuU3FsaXRlV3JhcHBlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTUUxJVEVfRVhDRVBUSU9OX0RFVEFJTF9NRVNTQUdFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEFHCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja1NRTGl0ZUV4Y2VwdGlvbigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVFeGNlcHRpb24pCi0KLXB1YmxpYyBzdGF0aWMgaW50IGRlbGV0ZSgKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1hbmRyb2lkLm5ldC5VcmkKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLm5ldC5VcmkgaW5zZXJ0KAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIKLWFuZHJvaWQubmV0LlVyaQotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXMpCi0KLXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNMb3dNZW1vcnkoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0xvd01lbW9yeSgKLWFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUV4Y2VwdGlvbikKLQotcHVibGljIHN0YXRpYyBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciBxdWVyeSgKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyCi1hbmRyb2lkLm5ldC5VcmkKLWphdmEubGFuZy5TdHJpbmdbXQotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZ1tdCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVxdWVyeSgKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLmRhdGFiYXNlLkN1cnNvcikKLQotcHVibGljIHN0YXRpYyBpbnQgdXBkYXRlKAotYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLWFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIKLWFuZHJvaWQubmV0LlVyaQotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXMKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9QmxvY2tlZFJlcXVlc3RFeGNlcHRpb24gKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9nb29nbGUvYW5kcm9pZC9uZXQvR29vZ2xlSHR0cENsaWVudDsgKQotcHVibGljIGNsYXNzIGNvbS5nb29nbGUuYW5kcm9pZC5uZXQuR29vZ2xlSHR0cENsaWVudCRCbG9ja2VkUmVxdWVzdEV4Y2VwdGlvbiBleHRlbmRzIGphdmEuaW8uSU9FeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBjb20uZ29vZ2xlLmFuZHJvaWQubmV0LlVybFJ1bGVzJFJ1bGUgbVJ1bGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1jb20uZ29vZ2xlLmFuZHJvaWQubmV0LlVybFJ1bGVzJFJ1bGUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MY29tL2dvb2dsZS9hbmRyb2lkL25ldC9Hb29nbGVIdHRwQ2xpZW50JEJsb2NrZWRSZXF1ZXN0RXhjZXB0aW9uOyApCi1wdWJsaWMgY2xhc3MgY29tLmdvb2dsZS5hbmRyb2lkLm5ldC5Hb29nbGVIdHRwQ2xpZW50IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaHR0cC5jbGllbnQuSHR0cENsaWVudAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRBRwotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQubmV0Lmh0dHAuQW5kcm9pZEh0dHBDbGllbnQgbUNsaWVudAotCi1wcml2YXRlIGZpbmFsIGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIgbVJlc29sdmVyCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBtVXNlckFnZW50Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcgotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEd6aXBDYXBhYmxlVXNlckFnZW50KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBzdGF0aWMgb3JnLmFwYWNoZS5odHRwLmltcGwuY2xpZW50LlJlcXVlc3RXcmFwcGVyIHdyYXBSZXF1ZXN0KAotb3JnLmFwYWNoZS5odHRwLmNsaWVudC5tZXRob2RzLkh0dHBVcmlSZXF1ZXN0KQotCi1wdWJsaWMgdm9pZCBjbG9zZSgpCi0KLXB1YmxpYyB2b2lkIGRpc2FibGVDdXJsTG9nZ2luZygpCi0KLXB1YmxpYyB2b2lkIGVuYWJsZUN1cmxMb2dnaW5nKAotamF2YS5sYW5nLlN0cmluZwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz4oTG9yZy9hcGFjaGUvaHR0cC9IdHRwSG9zdDtMb3JnL2FwYWNoZS9odHRwL0h0dHBSZXF1ZXN0O0xvcmcvYXBhY2hlL2h0dHAvY2xpZW50L1Jlc3BvbnNlSGFuZGxlcjwrVFQ7PjspVFQ7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMb3JnL2FwYWNoZS9odHRwL2NsaWVudC9DbGllbnRQcm90b2NvbEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZXhlY3V0ZSgKLW9yZy5hcGFjaGUuaHR0cC5IdHRwSG9zdAotb3JnLmFwYWNoZS5odHRwLkh0dHBSZXF1ZXN0Ci1vcmcuYXBhY2hlLmh0dHAuY2xpZW50LlJlc3BvbnNlSGFuZGxlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMb3JnL2FwYWNoZS9odHRwL2NsaWVudC9DbGllbnRQcm90b2NvbEV4Y2VwdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz4oTG9yZy9hcGFjaGUvaHR0cC9IdHRwSG9zdDtMb3JnL2FwYWNoZS9odHRwL0h0dHBSZXF1ZXN0O0xvcmcvYXBhY2hlL2h0dHAvY2xpZW50L1Jlc3BvbnNlSGFuZGxlcjwrVFQ7PjtMb3JnL2FwYWNoZS9odHRwL3Byb3RvY29sL0h0dHBDb250ZXh0OylUVDsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZXhlY3V0ZSgKLW9yZy5hcGFjaGUuaHR0cC5IdHRwSG9zdAotb3JnLmFwYWNoZS5odHRwLkh0dHBSZXF1ZXN0Ci1vcmcuYXBhY2hlLmh0dHAuY2xpZW50LlJlc3BvbnNlSGFuZGxlcgotb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBDb250ZXh0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xvcmcvYXBhY2hlL2h0dHAvY2xpZW50L0NsaWVudFByb3RvY29sRXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFQ6TGphdmEvbGFuZy9PYmplY3Q7PihMb3JnL2FwYWNoZS9odHRwL2NsaWVudC9tZXRob2RzL0h0dHBVcmlSZXF1ZXN0O0xvcmcvYXBhY2hlL2h0dHAvY2xpZW50L1Jlc3BvbnNlSGFuZGxlcjwrVFQ7PjspVFQ7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGV4ZWN1dGUoCi1vcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuSHR0cFVyaVJlcXVlc3QKLW9yZy5hcGFjaGUuaHR0cC5jbGllbnQuUmVzcG9uc2VIYW5kbGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xvcmcvYXBhY2hlL2h0dHAvY2xpZW50L0NsaWVudFByb3RvY29sRXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFQ6TGphdmEvbGFuZy9PYmplY3Q7PihMb3JnL2FwYWNoZS9odHRwL2NsaWVudC9tZXRob2RzL0h0dHBVcmlSZXF1ZXN0O0xvcmcvYXBhY2hlL2h0dHAvY2xpZW50L1Jlc3BvbnNlSGFuZGxlcjwrVFQ7PjtMb3JnL2FwYWNoZS9odHRwL3Byb3RvY29sL0h0dHBDb250ZXh0OylUVDsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZXhlY3V0ZSgKLW9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcy5IdHRwVXJpUmVxdWVzdAotb3JnLmFwYWNoZS5odHRwLmNsaWVudC5SZXNwb25zZUhhbmRsZXIKLW9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwQ29udGV4dCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5IdHRwUmVzcG9uc2UgZXhlY3V0ZSgKLW9yZy5hcGFjaGUuaHR0cC5IdHRwSG9zdAotb3JnLmFwYWNoZS5odHRwLkh0dHBSZXF1ZXN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgb3JnLmFwYWNoZS5odHRwLkh0dHBSZXNwb25zZSBleGVjdXRlKAotb3JnLmFwYWNoZS5odHRwLkh0dHBIb3N0Ci1vcmcuYXBhY2hlLmh0dHAuSHR0cFJlcXVlc3QKLW9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwQ29udGV4dCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5IdHRwUmVzcG9uc2UgZXhlY3V0ZSgKLW9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcy5IdHRwVXJpUmVxdWVzdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5IdHRwUmVzcG9uc2UgZXhlY3V0ZSgKLW9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcy5IdHRwVXJpUmVxdWVzdAotb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBDb250ZXh0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgb3JnLmFwYWNoZS5odHRwLkh0dHBSZXNwb25zZSBleGVjdXRlV2l0aG91dFJld3JpdGluZygKLW9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcy5IdHRwVXJpUmVxdWVzdAotb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBDb250ZXh0KQotCi1wdWJsaWMgb3JnLmFwYWNoZS5odHRwLmNvbm4uQ2xpZW50Q29ubmVjdGlvbk1hbmFnZXIgZ2V0Q29ubmVjdGlvbk1hbmFnZXIoKQotCi1wdWJsaWMgb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zIGdldFBhcmFtcygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgY29tLmdvb2dsZS5hbmRyb2lkLm5ldC5OZXRTdGF0cyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBUQUcKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBzdGF0c0ZpbGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgbG9uZ1tdIGdldFN0YXRzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9Q2FsbGJhY2sgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9nb29nbGUvYW5kcm9pZC9uZXQvUGFyZW50YWxDb250cm9sOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGNvbS5nb29nbGUuYW5kcm9pZC5uZXQuUGFyZW50YWxDb250cm9sJENhbGxiYWNrIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uUmVzdWx0KAotY29tLmdvb2dsZS5hbmRyb2lkLm5ldC5QYXJlbnRhbENvbnRyb2xTdGF0ZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2dvb2dsZS9hbmRyb2lkL25ldC9QYXJlbnRhbENvbnRyb2w7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9UmVtb3RlQ2FsbGJhY2sgKQotIGNsYXNzIGNvbS5nb29nbGUuYW5kcm9pZC5uZXQuUGFyZW50YWxDb250cm9sJFJlbW90ZUNhbGxiYWNrIGV4dGVuZHMgYW5kcm9pZC5vcy5JUGFyZW50YWxDb250cm9sQ2FsbGJhY2skU3R1YgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGNvbS5nb29nbGUuYW5kcm9pZC5uZXQuUGFyZW50YWxDb250cm9sJENhbGxiYWNrIG1DYWxsYmFjawotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWNvbS5nb29nbGUuYW5kcm9pZC5uZXQuUGFyZW50YWxDb250cm9sJENhbGxiYWNrKQotCi1wdWJsaWMgdm9pZCBvblJlc3VsdCgKLWNvbS5nb29nbGUuYW5kcm9pZC5uZXQuUGFyZW50YWxDb250cm9sU3RhdGUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MY29tL2dvb2dsZS9hbmRyb2lkL25ldC9QYXJlbnRhbENvbnRyb2wkUmVtb3RlQ2FsbGJhY2s7TGNvbS9nb29nbGUvYW5kcm9pZC9uZXQvUGFyZW50YWxDb250cm9sJENhbGxiYWNrOyApCi1wdWJsaWMgY2xhc3MgY29tLmdvb2dsZS5hbmRyb2lkLm5ldC5QYXJlbnRhbENvbnRyb2wgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyB2b2lkIGdldFBhcmVudGFsQ29udHJvbFN0YXRlKAotY29tLmdvb2dsZS5hbmRyb2lkLm5ldC5QYXJlbnRhbENvbnRyb2wkQ2FsbGJhY2spCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMY29tL2dvb2dsZS9hbmRyb2lkL25ldC9QYXJlbnRhbENvbnRyb2xTdGF0ZTs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2dvb2dsZS9hbmRyb2lkL25ldC9QYXJlbnRhbENvbnRyb2xTdGF0ZTsgKQotZmluYWwgY2xhc3MgY29tLmdvb2dsZS5hbmRyb2lkLm5ldC5QYXJlbnRhbENvbnRyb2xTdGF0ZSQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGNvbS5nb29nbGUuYW5kcm9pZC5uZXQuUGFyZW50YWxDb250cm9sU3RhdGUgY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBjcmVhdGVGcm9tUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwpCi0KLXB1YmxpYyBjb20uZ29vZ2xlLmFuZHJvaWQubmV0LlBhcmVudGFsQ29udHJvbFN0YXRlW10gbmV3QXJyYXkoCi1pbnQpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0W10gbmV3QXJyYXkoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgY29tLmdvb2dsZS5hbmRyb2lkLm5ldC5QYXJlbnRhbENvbnRyb2xTdGF0ZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I8TGNvbS9nb29nbGUvYW5kcm9pZC9uZXQvUGFyZW50YWxDb250cm9sU3RhdGU7PjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvciBDUkVBVE9SCi0KLXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZAotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyByZWRpcmVjdFVybAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1wdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2dvb2dsZS9hbmRyb2lkL25ldC9VcmxSdWxlczsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPVJ1bGUgKQotcHVibGljIGNsYXNzIGNvbS5nb29nbGUuYW5kcm9pZC5uZXQuVXJsUnVsZXMkUnVsZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmxhbmcuQ29tcGFyYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5nb29nbGUuYW5kcm9pZC5uZXQuVXJsUnVsZXMkUnVsZSBERUZBVUxUCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIG1CbG9jawotCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBtTmFtZQotCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBtUHJlZml4Ci0KLXB1YmxpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIG1SZXdyaXRlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MY29tL2dvb2dsZS9hbmRyb2lkL25ldC9VcmxSdWxlcyRSdWxlRm9ybWF0RXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBhcHBseSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBpbnQgY29tcGFyZVRvKAotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2dvb2dsZS9hbmRyb2lkL25ldC9VcmxSdWxlczsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPVJ1bGVGb3JtYXRFeGNlcHRpb24gKQotcHVibGljIGNsYXNzIGNvbS5nb29nbGUuYW5kcm9pZC5uZXQuVXJsUnVsZXMkUnVsZUZvcm1hdEV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5FeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGNvbS9nb29nbGUvYW5kcm9pZC9uZXQvVXJsUnVsZXMkUnVsZTtMY29tL2dvb2dsZS9hbmRyb2lkL25ldC9VcmxSdWxlcyRSdWxlRm9ybWF0RXhjZXB0aW9uOyApCi1wdWJsaWMgY2xhc3MgY29tLmdvb2dsZS5hbmRyb2lkLm5ldC5VcmxSdWxlcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4gUEFUVEVSTl9TUEFDRV9QTFVTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEudXRpbC5yZWdleC5QYXR0ZXJuIFJVTEVfUEFUVEVSTgotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIHNDYWNoZWREaWdlc3QKLQotcHJpdmF0ZSBzdGF0aWMgY29tLmdvb2dsZS5hbmRyb2lkLm5ldC5VcmxSdWxlcyBzQ2FjaGVkUnVsZXMKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLnV0aWwucmVnZXguUGF0dGVybiBtUGF0dGVybgotCi1wcml2YXRlIGZpbmFsIGNvbS5nb29nbGUuYW5kcm9pZC5uZXQuVXJsUnVsZXMkUnVsZVtdIG1SdWxlcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotY29tLmdvb2dsZS5hbmRyb2lkLm5ldC5VcmxSdWxlcyRSdWxlW10pCi0KLXN0YXRpYyBqYXZhLnV0aWwucmVnZXguUGF0dGVybiBhY2Nlc3MkMDAwKCkKLQotcHVibGljIHN0YXRpYyBjb20uZ29vZ2xlLmFuZHJvaWQubmV0LlVybFJ1bGVzIGdldFJ1bGVzKAotYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcikKLQotcHVibGljIGNvbS5nb29nbGUuYW5kcm9pZC5uZXQuVXJsUnVsZXMkUnVsZSBtYXRjaFJ1bGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vZ29vZ2xlL2FuZHJvaWQvcHJvdmlkZXJzL0Fic3RyYWN0R0RhdGFTeW5jQWRhcHRlciRHRGF0YVN5bmNEYXRhOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExjb20vZ29vZ2xlL2FuZHJvaWQvcHJvdmlkZXJzL0Fic3RyYWN0R0RhdGFTeW5jQWRhcHRlciRHRGF0YVN5bmNEYXRhOz47ICkKLWZpbmFsIGNsYXNzIGNvbS5nb29nbGUuYW5kcm9pZC5wcm92aWRlcnMuQWJzdHJhY3RHRGF0YVN5bmNBZGFwdGVyJEdEYXRhU3luY0RhdGEkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBjb20uZ29vZ2xlLmFuZHJvaWQucHJvdmlkZXJzLkFic3RyYWN0R0RhdGFTeW5jQWRhcHRlciRHRGF0YVN5bmNEYXRhIGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgY29tLmdvb2dsZS5hbmRyb2lkLnByb3ZpZGVycy5BYnN0cmFjdEdEYXRhU3luY0FkYXB0ZXIkR0RhdGFTeW5jRGF0YVtdIG5ld0FycmF5KAotaW50KQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdFtdIG5ld0FycmF5KAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMYW5kcm9pZC9vcy9QYXJjZWxhYmxlJENyZWF0b3I8TGNvbS9nb29nbGUvYW5kcm9pZC9wcm92aWRlcnMvQWJzdHJhY3RHRGF0YVN5bmNBZGFwdGVyJEdEYXRhU3luY0RhdGEkRmVlZERhdGE7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9nb29nbGUvYW5kcm9pZC9wcm92aWRlcnMvQWJzdHJhY3RHRGF0YVN5bmNBZGFwdGVyJEdEYXRhU3luY0RhdGEkRmVlZERhdGE7ICkKLWZpbmFsIGNsYXNzIGNvbS5nb29nbGUuYW5kcm9pZC5wcm92aWRlcnMuQWJzdHJhY3RHRGF0YVN5bmNBZGFwdGVyJEdEYXRhU3luY0RhdGEkRmVlZERhdGEkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUkQ3JlYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBjb20uZ29vZ2xlLmFuZHJvaWQucHJvdmlkZXJzLkFic3RyYWN0R0RhdGFTeW5jQWRhcHRlciRHRGF0YVN5bmNEYXRhJEZlZWREYXRhIGNyZWF0ZUZyb21QYXJjZWwoCi1hbmRyb2lkLm9zLlBhcmNlbCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgY3JlYXRlRnJvbVBhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsKQotCi1wdWJsaWMgY29tLmdvb2dsZS5hbmRyb2lkLnByb3ZpZGVycy5BYnN0cmFjdEdEYXRhU3luY0FkYXB0ZXIkR0RhdGFTeW5jRGF0YSRGZWVkRGF0YVtdIG5ld0FycmF5KAotaW50KQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdFtdIG5ld0FycmF5KAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vZ29vZ2xlL2FuZHJvaWQvcHJvdmlkZXJzL0Fic3RyYWN0R0RhdGFTeW5jQWRhcHRlciRHRGF0YVN5bmNEYXRhOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9RmVlZERhdGEgKQotcHVibGljIGNsYXNzIGNvbS5nb29nbGUuYW5kcm9pZC5wcm92aWRlcnMuQWJzdHJhY3RHRGF0YVN5bmNBZGFwdGVyJEdEYXRhU3luY0RhdGEkRmVlZERhdGEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGFuZHJvaWQvb3MvUGFyY2VsYWJsZSRDcmVhdG9yPExjb20vZ29vZ2xlL2FuZHJvaWQvcHJvdmlkZXJzL0Fic3RyYWN0R0RhdGFTeW5jQWRhcHRlciRHRGF0YVN5bmNEYXRhJEZlZWREYXRhOz47ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlJENyZWF0b3IgQ1JFQVRPUgotCi1wdWJsaWMgaW50IGVuZEluZGV4Ci0KLXB1YmxpYyBib29sZWFuIGhhc01vcmVFbnRyaWVzVG9GZXRjaAotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBsYXN0SWQKLQotcHVibGljIGxvbmcgbGFzdFVwZGF0ZWRUaW1lCi0KLXB1YmxpYyBsb25nIG51bUVudHJpZXNGZXRjaGVkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1sb25nCi1sb25nCi1ib29sZWFuCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbCgKLWFuZHJvaWQub3MuUGFyY2VsCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPUdEYXRhU3luY0RhdGEgKQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MY29tL2dvb2dsZS9hbmRyb2lkL3Byb3ZpZGVycy9BYnN0cmFjdEdEYXRhU3luY0FkYXB0ZXIkR0RhdGFTeW5jRGF0YSRGZWVkRGF0YTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9nb29nbGUvYW5kcm9pZC9wcm92aWRlcnMvQWJzdHJhY3RHRGF0YVN5bmNBZGFwdGVyOyApCi1wdWJsaWMgY2xhc3MgY29tLmdvb2dsZS5hbmRyb2lkLnByb3ZpZGVycy5BYnN0cmFjdEdEYXRhU3luY0FkYXB0ZXIkR0RhdGFTeW5jRGF0YSBleHRlbmRzIGFuZHJvaWQuY29udGVudC5UZW1wUHJvdmlkZXJTeW5jQWRhcHRlciRTeW5jRGF0YQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxhbmRyb2lkL29zL1BhcmNlbGFibGUkQ3JlYXRvcjxMY29tL2dvb2dsZS9hbmRyb2lkL3Byb3ZpZGVycy9BYnN0cmFjdEdEYXRhU3luY0FkYXB0ZXIkR0RhdGFTeW5jRGF0YTs+OyApCi1wdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZSRDcmVhdG9yIENSRUFUT1IKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMY29tL2dvb2dsZS9hbmRyb2lkL3Byb3ZpZGVycy9BYnN0cmFjdEdEYXRhU3luY0FkYXB0ZXIkR0RhdGFTeW5jRGF0YSRGZWVkRGF0YTs+OyApCi1wdWJsaWMgZmluYWwgamF2YS51dGlsLk1hcCBmZWVkRGF0YQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1wdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKAotYW5kcm9pZC5vcy5QYXJjZWwKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxjb20vZ29vZ2xlL2FuZHJvaWQvcHJvdmlkZXJzL0Fic3RyYWN0R0RhdGFTeW5jQWRhcHRlciRHRGF0YVN5bmNEYXRhOyApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgY29tLmdvb2dsZS5hbmRyb2lkLnByb3ZpZGVycy5BYnN0cmFjdEdEYXRhU3luY0FkYXB0ZXIgZXh0ZW5kcyBhbmRyb2lkLmNvbnRlbnQuVGVtcFByb3ZpZGVyU3luY0FkYXB0ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5UUllfREVMRVRFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRSWV9JTlZBTElECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOVFJZX09LCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0NIRU1BX0hUVFAKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTQ0hFTUFfSFRUUFMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIFNZTkNfU1RBVEVfQ09OVEVOVF9VUkkKLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRBRwotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbUFjY291bnQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1BdXRoVG9rZW4KLQotcHJvdGVjdGVkIGludCBtU2VydmVyRW50cmllcwotCi1wcm90ZWN0ZWQgaW50IG1TZXJ2ZXJRdWVyaWVzCi0KLXByb3RlY3RlZCB2b2xhdGlsZSBib29sZWFuIG1TeW5jQ2FuY2VsZWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0Ci1hbmRyb2lkLmNvbnRlbnQuU3luY2FibGVDb250ZW50UHJvdmlkZXIpCi0KLXB1YmxpYyBzdGF0aWMgYnl0ZVtdIG5ld0J5dGVzRnJvbUdEYXRhU3luY0RhdGEoCi1jb20uZ29vZ2xlLmFuZHJvaWQucHJvdmlkZXJzLkFic3RyYWN0R0RhdGFTeW5jQWRhcHRlciRHRGF0YVN5bmNEYXRhKQotCi1wdWJsaWMgc3RhdGljIGNvbS5nb29nbGUuYW5kcm9pZC5wcm92aWRlcnMuQWJzdHJhY3RHRGF0YVN5bmNBZGFwdGVyJEdEYXRhU3luY0RhdGEgbmV3R0RhdGFTeW5jRGF0YUZyb21CeXRlcygKLWJ5dGVbXSkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIHJld3JpdGVVcmxmb3JBY2NvdW50KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MY29tL2dvb2dsZS93aXJlbGVzcy9nZGF0YS9wYXJzZXIvUGFyc2VFeGNlcHRpb247ICkKLXByb3RlY3RlZCBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGN1cnNvclRvRW50cnkoCi1hbmRyb2lkLmNvbnRlbnQuU3luY0NvbnRleHQKLWFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yCi1jb20uZ29vZ2xlLndpcmVsZXNzLmdkYXRhLmRhdGEuRW50cnkKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGNvbS9nb29nbGUvd2lyZWxlc3MvZ2RhdGEvcGFyc2VyL1BhcnNlRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkZWxldGVkQ3Vyc29yVG9FbnRyeSgKLWFuZHJvaWQuY29udGVudC5TeW5jQ29udGV4dAotYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IKLWNvbS5nb29nbGUud2lyZWxlc3MuZ2RhdGEuZGF0YS5FbnRyeSkKLQotcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgZ2V0QWNjb3VudCgpCi0KLXByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIGdldEF1dGhUb2tlbigpCi0KLXByb3RlY3RlZCBhYnN0cmFjdCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciBnZXRDdXJzb3JGb3JEZWxldGVkVGFibGUoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyCi1qYXZhLmxhbmcuQ2xhc3MpCi0KLXByb3RlY3RlZCBhYnN0cmFjdCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciBnZXRDdXJzb3JGb3JUYWJsZSgKLWFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXIKLWphdmEubGFuZy5DbGFzcykKLQotcHJvdGVjdGVkIGFic3RyYWN0IGphdmEubGFuZy5DbGFzcyBnZXRGZWVkRW50cnlDbGFzcygpCi0KLXByb3RlY3RlZCBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldEZlZWRVcmwoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcm90ZWN0ZWQgYWJzdHJhY3QgY29tLmdvb2dsZS53aXJlbGVzcy5nZGF0YS5jbGllbnQuR0RhdGFTZXJ2aWNlQ2xpZW50IGdldEdEYXRhU2VydmljZUNsaWVudCgpCi0KLXB1YmxpYyBpbnQgZ2V0TWF4RW50cmllc1BlclN5bmMoKQotCi1wdWJsaWMgdm9pZCBnZXRTZXJ2ZXJEaWZmcygKLWFuZHJvaWQuY29udGVudC5TeW5jQ29udGV4dAotYW5kcm9pZC5jb250ZW50LlRlbXBQcm92aWRlclN5bmNBZGFwdGVyJFN5bmNEYXRhCi1hbmRyb2lkLmNvbnRlbnQuU3luY2FibGVDb250ZW50UHJvdmlkZXIKLWFuZHJvaWQub3MuQnVuZGxlCi1qYXZhLmxhbmcuT2JqZWN0Ci1hbmRyb2lkLmNvbnRlbnQuU3luY1Jlc3VsdCkKLQotcHJvdGVjdGVkIHZvaWQgZ2V0U2VydmVyRGlmZnNJbXBsKAotYW5kcm9pZC5jb250ZW50LlN5bmNDb250ZXh0Ci1hbmRyb2lkLmNvbnRlbnQuU3luY2FibGVDb250ZW50UHJvdmlkZXIKLWphdmEubGFuZy5DbGFzcwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLk9iamVjdAotaW50Ci1jb20uZ29vZ2xlLmFuZHJvaWQucHJvdmlkZXJzLkFic3RyYWN0R0RhdGFTeW5jQWRhcHRlciRHRGF0YVN5bmNEYXRhCi1hbmRyb2lkLmNvbnRlbnQuU3luY1Jlc3VsdCkKLQotcHJvdGVjdGVkIHZvaWQgZ2V0U3RhdHNTdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nQnVmZmVyCi1hbmRyb2lkLmNvbnRlbnQuU3luY1Jlc3VsdCkKLQotcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaGFuZGxlQWxsRGVsZXRlZFVuYXZhaWxhYmxlKAotY29tLmdvb2dsZS5hbmRyb2lkLnByb3ZpZGVycy5BYnN0cmFjdEdEYXRhU3luY0FkYXB0ZXIkR0RhdGFTeW5jRGF0YQotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpCi0KLXByb3RlY3RlZCB2b2lkIGxvZ1N5bmNEZXRhaWxzKAotbG9uZwotbG9uZwotYW5kcm9pZC5jb250ZW50LlN5bmNSZXN1bHQpCi0KLXByb3RlY3RlZCBhYnN0cmFjdCBjb20uZ29vZ2xlLndpcmVsZXNzLmdkYXRhLmRhdGEuRW50cnkgbmV3RW50cnkoKQotCi1wdWJsaWMgdm9sYXRpbGUgYW5kcm9pZC5jb250ZW50LlRlbXBQcm92aWRlclN5bmNBZGFwdGVyJFN5bmNEYXRhIG5ld1N5bmNEYXRhKCkKLQotcHVibGljIGNvbS5nb29nbGUuYW5kcm9pZC5wcm92aWRlcnMuQWJzdHJhY3RHRGF0YVN5bmNBZGFwdGVyJEdEYXRhU3luY0RhdGEgbmV3U3luY0RhdGEoKQotCi1wdWJsaWMgdm9pZCBvblN5bmNDYW5jZWxlZCgpCi0KLXB1YmxpYyB2b2lkIG9uU3luY0VuZGluZygKLWFuZHJvaWQuY29udGVudC5TeW5jQ29udGV4dAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgb25TeW5jU3RhcnRpbmcoCi1hbmRyb2lkLmNvbnRlbnQuU3luY0NvbnRleHQKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4KLWFuZHJvaWQuY29udGVudC5TeW5jUmVzdWx0KQotCi1wdWJsaWMgdm9sYXRpbGUgYW5kcm9pZC5jb250ZW50LlRlbXBQcm92aWRlclN5bmNBZGFwdGVyJFN5bmNEYXRhIHJlYWRTeW5jRGF0YSgKLWFuZHJvaWQuY29udGVudC5TeW5jYWJsZUNvbnRlbnRQcm92aWRlcikKLQotcHVibGljIGNvbS5nb29nbGUuYW5kcm9pZC5wcm92aWRlcnMuQWJzdHJhY3RHRGF0YVN5bmNBZGFwdGVyJEdEYXRhU3luY0RhdGEgcmVhZFN5bmNEYXRhKAotYW5kcm9pZC5jb250ZW50LlN5bmNhYmxlQ29udGVudFByb3ZpZGVyKQotCi1wdWJsaWMgdm9pZCBzZW5kQ2xpZW50RGlmZnMoCi1hbmRyb2lkLmNvbnRlbnQuU3luY0NvbnRleHQKLWFuZHJvaWQuY29udGVudC5TeW5jYWJsZUNvbnRlbnRQcm92aWRlcgotYW5kcm9pZC5jb250ZW50LlN5bmNhYmxlQ29udGVudFByb3ZpZGVyCi1hbmRyb2lkLmNvbnRlbnQuU3luY1Jlc3VsdAotYm9vbGVhbikKLQotcHJvdGVjdGVkIHZvaWQgc2VuZENsaWVudERpZmZzSW1wbCgKLWFuZHJvaWQuY29udGVudC5TeW5jQ29udGV4dAotYW5kcm9pZC5jb250ZW50LlN5bmNhYmxlQ29udGVudFByb3ZpZGVyCi1jb20uZ29vZ2xlLndpcmVsZXNzLmdkYXRhLmRhdGEuRW50cnkKLWphdmEubGFuZy5PYmplY3QKLWFuZHJvaWQuY29udGVudC5TeW5jYWJsZUNvbnRlbnRQcm92aWRlcgotYW5kcm9pZC5jb250ZW50LlN5bmNSZXN1bHQKLWJvb2xlYW4pCi0KLXByb3RlY3RlZCB2b2lkIHNldEF1dGhUb2tlbigKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGNvbS9nb29nbGUvd2lyZWxlc3MvZ2RhdGEvcGFyc2VyL1BhcnNlRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB1cGRhdGVQcm92aWRlcigKLWNvbS5nb29nbGUud2lyZWxlc3MuZ2RhdGEuZGF0YS5GZWVkCi1sb25nCi1ib29sZWFuCi1jb20uZ29vZ2xlLndpcmVsZXNzLmdkYXRhLmRhdGEuRW50cnkKLWFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXIKLWphdmEubGFuZy5PYmplY3QpCi0KLXByb3RlY3RlZCB2b2lkIHVwZGF0ZVF1ZXJ5UGFyYW1ldGVycygKLWNvbS5nb29nbGUud2lyZWxlc3MuZ2RhdGEuY2xpZW50LlF1ZXJ5UGFyYW1zKQotCi1wdWJsaWMgdm9pZCB3cml0ZVN5bmNEYXRhKAotYW5kcm9pZC5jb250ZW50LlRlbXBQcm92aWRlclN5bmNBZGFwdGVyJFN5bmNEYXRhCi1hbmRyb2lkLmNvbnRlbnQuU3luY2FibGVDb250ZW50UHJvdmlkZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9nb29nbGUvYW5kcm9pZC91dGlsL0Fic3RyYWN0TWVzc2FnZVBhcnNlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID00MTA0IG5hbWUgPW51bGwgKQotIGNsYXNzIGNvbS5nb29nbGUuYW5kcm9pZC51dGlsLkFic3RyYWN0TWVzc2FnZVBhcnNlciQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgaW50W10gJFN3aXRjaE1hcCRjb20kZ29vZ2xlJGFuZHJvaWQkdXRpbCRBYnN0cmFjdE1lc3NhZ2VQYXJzZXIkVG9rZW4kVHlwZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxjb20vZ29vZ2xlL2FuZHJvaWQvdXRpbC9BYnN0cmFjdE1lc3NhZ2VQYXJzZXIkVG9rZW4kVHlwZTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMDMzIG5hbWUgPVRva2VuICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vZ29vZ2xlL2FuZHJvaWQvdXRpbC9BYnN0cmFjdE1lc3NhZ2VQYXJzZXI7ICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBjb20uZ29vZ2xlLmFuZHJvaWQudXRpbC5BYnN0cmFjdE1lc3NhZ2VQYXJzZXIkVG9rZW4gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIHRleHQKLQotcHJvdGVjdGVkIGNvbS5nb29nbGUuYW5kcm9pZC51dGlsLkFic3RyYWN0TWVzc2FnZVBhcnNlciRUb2tlbiRUeXBlIHR5cGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oCi1jb20uZ29vZ2xlLmFuZHJvaWQudXRpbC5BYnN0cmFjdE1lc3NhZ2VQYXJzZXIkVG9rZW4kVHlwZQotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJvb2xlYW4gY29udHJvbENhcHMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9MaXN0PExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRJbmZvKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UmF3VGV4dCgpCi0KLXB1YmxpYyBjb20uZ29vZ2xlLmFuZHJvaWQudXRpbC5BYnN0cmFjdE1lc3NhZ2VQYXJzZXIkVG9rZW4kVHlwZSBnZXRUeXBlKCkKLQotcHVibGljIGJvb2xlYW4gaXNBcnJheSgpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzSHRtbCgpCi0KLXB1YmxpYyBib29sZWFuIGlzTWVkaWEoKQotCi1wdWJsaWMgYm9vbGVhbiBzZXRDYXBzKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9IdG1sKAotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9QWNyb255bSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2dvb2dsZS9hbmRyb2lkL3V0aWwvQWJzdHJhY3RNZXNzYWdlUGFyc2VyOyApCi1wdWJsaWMgY2xhc3MgY29tLmdvb2dsZS5hbmRyb2lkLnV0aWwuQWJzdHJhY3RNZXNzYWdlUGFyc2VyJEFjcm9ueW0gZXh0ZW5kcyBjb20uZ29vZ2xlLmFuZHJvaWQudXRpbC5BYnN0cmFjdE1lc3NhZ2VQYXJzZXIkVG9rZW4KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHZhbHVlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvTGlzdDxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0SW5mbygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFZhbHVlKCkKLQotcHVibGljIGJvb2xlYW4gaXNIdG1sKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2dvb2dsZS9hbmRyb2lkL3V0aWwvQWJzdHJhY3RNZXNzYWdlUGFyc2VyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9RmxpY2tyUGhvdG8gKQotcHVibGljIGNsYXNzIGNvbS5nb29nbGUuYW5kcm9pZC51dGlsLkFic3RyYWN0TWVzc2FnZVBhcnNlciRGbGlja3JQaG90byBleHRlbmRzIGNvbS5nb29nbGUuYW5kcm9pZC51dGlsLkFic3RyYWN0TWVzc2FnZVBhcnNlciRUb2tlbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwucmVnZXguUGF0dGVybiBHUk9VUElOR19QQVRURVJOCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0VUUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRBR1MKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4gVVJMX1BBVFRFUk4KLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGdyb3VwaW5nCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBncm91cGluZ0lkCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBwaG90bwotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgdXNlcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFBob3RvVVJMKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFJzc1VybCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRUYWdzVVJMKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFVzZXJTZXRzVVJMKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFVzZXJUYWdzVVJMKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFVzZXJVUkwoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGNvbS5nb29nbGUuYW5kcm9pZC51dGlsLkFic3RyYWN0TWVzc2FnZVBhcnNlciRGbGlja3JQaG90byBtYXRjaFVSTCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEdyb3VwaW5nKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0R3JvdXBpbmdJZCgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0xpc3Q8TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHVibGljIGphdmEudXRpbC5MaXN0IGdldEluZm8oKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRQaG90bygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFVybCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFVzZXIoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0h0bWwoKQotCi1wdWJsaWMgYm9vbGVhbiBpc01lZGlhKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9Rm9ybWF0ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vZ29vZ2xlL2FuZHJvaWQvdXRpbC9BYnN0cmFjdE1lc3NhZ2VQYXJzZXI7ICkKLXB1YmxpYyBjbGFzcyBjb20uZ29vZ2xlLmFuZHJvaWQudXRpbC5BYnN0cmFjdE1lc3NhZ2VQYXJzZXIkRm9ybWF0IGV4dGVuZHMgY29tLmdvb2dsZS5hbmRyb2lkLnV0aWwuQWJzdHJhY3RNZXNzYWdlUGFyc2VyJFRva2VuCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgY2hhciBjaAotCi1wcml2YXRlIGJvb2xlYW4gbWF0Y2hlZAotCi1wcml2YXRlIGJvb2xlYW4gc3RhcnQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1jaGFyCi1ib29sZWFuKQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZ2V0Rm9ybWF0RW5kKAotY2hhcikKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGdldEZvcm1hdFN0YXJ0KAotY2hhcikKLQotcHVibGljIGJvb2xlYW4gY29udHJvbENhcHMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9MaXN0PExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRJbmZvKCkKLQotcHVibGljIGJvb2xlYW4gaXNIdG1sKCkKLQotcHVibGljIGJvb2xlYW4gc2V0Q2FwcygpCi0KLXB1YmxpYyB2b2lkIHNldE1hdGNoZWQoCi1ib29sZWFuKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b0h0bWwoCi1ib29sZWFuKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1IdG1sICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vZ29vZ2xlL2FuZHJvaWQvdXRpbC9BYnN0cmFjdE1lc3NhZ2VQYXJzZXI7ICkKLXB1YmxpYyBjbGFzcyBjb20uZ29vZ2xlLmFuZHJvaWQudXRpbC5BYnN0cmFjdE1lc3NhZ2VQYXJzZXIkSHRtbCBleHRlbmRzIGNvbS5nb29nbGUuYW5kcm9pZC51dGlsLkFic3RyYWN0TWVzc2FnZVBhcnNlciRUb2tlbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgaHRtbAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgdHJpbUxlYWRpbmdXaGl0ZXNwYWNlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIHRyaW1UcmFpbGluZ1doaXRlc3BhY2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9MaXN0PExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRJbmZvKCkKLQotcHVibGljIGJvb2xlYW4gaXNIdG1sKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9IdG1sKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgdHJpbUxlYWRpbmdXaGl0ZXNwYWNlKCkKLQotcHVibGljIHZvaWQgdHJpbVRyYWlsaW5nV2hpdGVzcGFjZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPUxpbmsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9nb29nbGUvYW5kcm9pZC91dGlsL0Fic3RyYWN0TWVzc2FnZVBhcnNlcjsgKQotcHVibGljIGNsYXNzIGNvbS5nb29nbGUuYW5kcm9pZC51dGlsLkFic3RyYWN0TWVzc2FnZVBhcnNlciRMaW5rIGV4dGVuZHMgY29tLmdvb2dsZS5hbmRyb2lkLnV0aWwuQWJzdHJhY3RNZXNzYWdlUGFyc2VyJFRva2VuCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyB1cmwKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9MaXN0PExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRJbmZvKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VVJMKCkKLQotcHVibGljIGJvb2xlYW4gaXNIdG1sKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2dvb2dsZS9hbmRyb2lkL3V0aWwvQWJzdHJhY3RNZXNzYWdlUGFyc2VyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9TXVzaWNUcmFjayApCi1wdWJsaWMgY2xhc3MgY29tLmdvb2dsZS5hbmRyb2lkLnV0aWwuQWJzdHJhY3RNZXNzYWdlUGFyc2VyJE11c2ljVHJhY2sgZXh0ZW5kcyBjb20uZ29vZ2xlLmFuZHJvaWQudXRpbC5BYnN0cmFjdE1lc3NhZ2VQYXJzZXIkVG9rZW4KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHRyYWNrCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvTGlzdDxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0SW5mbygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFRyYWNrKCkKLQotcHVibGljIGJvb2xlYW4gaXNIdG1sKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9UGFydCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2dvb2dsZS9hbmRyb2lkL3V0aWwvQWJzdHJhY3RNZXNzYWdlUGFyc2VyOyApCi1wdWJsaWMgY2xhc3MgY29tLmdvb2dsZS5hbmRyb2lkLnV0aWwuQWJzdHJhY3RNZXNzYWdlUGFyc2VyJFBhcnQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtZVRleHQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0FycmF5TGlzdDxMY29tL2dvb2dsZS9hbmRyb2lkL3V0aWwvQWJzdHJhY3RNZXNzYWdlUGFyc2VyJFRva2VuOz47ICkKLXByaXZhdGUgamF2YS51dGlsLkFycmF5TGlzdCB0b2tlbnMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZ2V0UGFydFR5cGUoKQotCi1wdWJsaWMgdm9pZCBhZGQoCi1jb20uZ29vZ2xlLmFuZHJvaWQudXRpbC5BYnN0cmFjdE1lc3NhZ2VQYXJzZXIkVG9rZW4pCi0KLXB1YmxpYyBjb20uZ29vZ2xlLmFuZHJvaWQudXRpbC5BYnN0cmFjdE1lc3NhZ2VQYXJzZXIkVG9rZW4gZ2V0TWVkaWFUb2tlbigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFJhd1RleHQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9BcnJheUxpc3Q8TGNvbS9nb29nbGUvYW5kcm9pZC91dGlsL0Fic3RyYWN0TWVzc2FnZVBhcnNlciRUb2tlbjs+OyApCi1wdWJsaWMgamF2YS51dGlsLkFycmF5TGlzdCBnZXRUb2tlbnMoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRUeXBlKAotYm9vbGVhbikKLQotcHVibGljIGJvb2xlYW4gaXNNZWRpYSgpCi0KLXB1YmxpYyB2b2lkIHNldE1lVGV4dCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPVBob3RvICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vZ29vZ2xlL2FuZHJvaWQvdXRpbC9BYnN0cmFjdE1lc3NhZ2VQYXJzZXI7ICkKLXB1YmxpYyBjbGFzcyBjb20uZ29vZ2xlLmFuZHJvaWQudXRpbC5BYnN0cmFjdE1lc3NhZ2VQYXJzZXIkUGhvdG8gZXh0ZW5kcyBjb20uZ29vZ2xlLmFuZHJvaWQudXRpbC5BYnN0cmFjdE1lc3NhZ2VQYXJzZXIkVG9rZW4KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4gVVJMX1BBVFRFUk4KLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGFsYnVtCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBwaG90bwotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgdXNlcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEFsYnVtVVJMKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFBob3RvVVJMKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFJzc1VybCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgY29tLmdvb2dsZS5hbmRyb2lkLnV0aWwuQWJzdHJhY3RNZXNzYWdlUGFyc2VyJFBob3RvIG1hdGNoVVJMKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QWxidW0oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9MaXN0PExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRJbmZvKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UGhvdG8oKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRVc2VyKCkKLQotcHVibGljIGJvb2xlYW4gaXNIdG1sKCkKLQotcHVibGljIGJvb2xlYW4gaXNNZWRpYSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9nb29nbGUvYW5kcm9pZC91dGlsL0Fic3RyYWN0TWVzc2FnZVBhcnNlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPVJlc291cmNlcyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGNvbS5nb29nbGUuYW5kcm9pZC51dGlsLkFic3RyYWN0TWVzc2FnZVBhcnNlciRSZXNvdXJjZXMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IGNvbS5nb29nbGUuYW5kcm9pZC51dGlsLkFic3RyYWN0TWVzc2FnZVBhcnNlciRUcmllTm9kZSBnZXRBY3JvbnltcygpCi0KLXB1YmxpYyBhYnN0cmFjdCBjb20uZ29vZ2xlLmFuZHJvaWQudXRpbC5BYnN0cmFjdE1lc3NhZ2VQYXJzZXIkVHJpZU5vZGUgZ2V0RG9tYWluU3VmZml4ZXMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9TZXQ8TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHVibGljIGFic3RyYWN0IGphdmEudXRpbC5TZXQgZ2V0U2NoZW1lcygpCi0KLXB1YmxpYyBhYnN0cmFjdCBjb20uZ29vZ2xlLmFuZHJvaWQudXRpbC5BYnN0cmFjdE1lc3NhZ2VQYXJzZXIkVHJpZU5vZGUgZ2V0U21pbGV5cygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPVNtaWxleSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2dvb2dsZS9hbmRyb2lkL3V0aWwvQWJzdHJhY3RNZXNzYWdlUGFyc2VyOyApCi1wdWJsaWMgY2xhc3MgY29tLmdvb2dsZS5hbmRyb2lkLnV0aWwuQWJzdHJhY3RNZXNzYWdlUGFyc2VyJFNtaWxleSBleHRlbmRzIGNvbS5nb29nbGUuYW5kcm9pZC51dGlsLkFic3RyYWN0TWVzc2FnZVBhcnNlciRUb2tlbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0xpc3Q8TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHVibGljIGphdmEudXRpbC5MaXN0IGdldEluZm8oKQotCi1wdWJsaWMgYm9vbGVhbiBpc0h0bWwoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vZ29vZ2xlL2FuZHJvaWQvdXRpbC9BYnN0cmFjdE1lc3NhZ2VQYXJzZXIkVG9rZW47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTY0MDkgbmFtZSA9VHlwZSApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9FbnVtPExjb20vZ29vZ2xlL2FuZHJvaWQvdXRpbC9BYnN0cmFjdE1lc3NhZ2VQYXJzZXIkVG9rZW4kVHlwZTs+OyApCi1wdWJsaWMgZmluYWwgY2xhc3MgY29tLmdvb2dsZS5hbmRyb2lkLnV0aWwuQWJzdHJhY3RNZXNzYWdlUGFyc2VyJFRva2VuJFR5cGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBjb20uZ29vZ2xlLmFuZHJvaWQudXRpbC5BYnN0cmFjdE1lc3NhZ2VQYXJzZXIkVG9rZW4kVHlwZVtdICRWQUxVRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uZ29vZ2xlLmFuZHJvaWQudXRpbC5BYnN0cmFjdE1lc3NhZ2VQYXJzZXIkVG9rZW4kVHlwZSBBQ1JPTllNCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmdvb2dsZS5hbmRyb2lkLnV0aWwuQWJzdHJhY3RNZXNzYWdlUGFyc2VyJFRva2VuJFR5cGUgRkxJQ0tSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmdvb2dsZS5hbmRyb2lkLnV0aWwuQWJzdHJhY3RNZXNzYWdlUGFyc2VyJFRva2VuJFR5cGUgRk9STUFUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmdvb2dsZS5hbmRyb2lkLnV0aWwuQWJzdHJhY3RNZXNzYWdlUGFyc2VyJFRva2VuJFR5cGUgR09PR0xFX1ZJREVPCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmdvb2dsZS5hbmRyb2lkLnV0aWwuQWJzdHJhY3RNZXNzYWdlUGFyc2VyJFRva2VuJFR5cGUgSFRNTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5nb29nbGUuYW5kcm9pZC51dGlsLkFic3RyYWN0TWVzc2FnZVBhcnNlciRUb2tlbiRUeXBlIExJTksKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uZ29vZ2xlLmFuZHJvaWQudXRpbC5BYnN0cmFjdE1lc3NhZ2VQYXJzZXIkVG9rZW4kVHlwZSBNVVNJQwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5nb29nbGUuYW5kcm9pZC51dGlsLkFic3RyYWN0TWVzc2FnZVBhcnNlciRUb2tlbiRUeXBlIFBIT1RPCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmdvb2dsZS5hbmRyb2lkLnV0aWwuQWJzdHJhY3RNZXNzYWdlUGFyc2VyJFRva2VuJFR5cGUgU01JTEVZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmdvb2dsZS5hbmRyb2lkLnV0aWwuQWJzdHJhY3RNZXNzYWdlUGFyc2VyJFRva2VuJFR5cGUgWU9VVFVCRV9WSURFTwotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgc3RyaW5nUmVwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1N0cmluZzspViApCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGNvbS5nb29nbGUuYW5kcm9pZC51dGlsLkFic3RyYWN0TWVzc2FnZVBhcnNlciRUb2tlbiRUeXBlIHZhbHVlT2YoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGNvbS5nb29nbGUuYW5kcm9pZC51dGlsLkFic3RyYWN0TWVzc2FnZVBhcnNlciRUb2tlbiRUeXBlW10gdmFsdWVzKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vZ29vZ2xlL2FuZHJvaWQvdXRpbC9BYnN0cmFjdE1lc3NhZ2VQYXJzZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1UcmllTm9kZSApCi1wdWJsaWMgY2xhc3MgY29tLmdvb2dsZS5hbmRyb2lkLnV0aWwuQWJzdHJhY3RNZXNzYWdlUGFyc2VyJFRyaWVOb2RlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaE1hcDxMamF2YS9sYW5nL0NoYXJhY3RlcjtMY29tL2dvb2dsZS9hbmRyb2lkL3V0aWwvQWJzdHJhY3RNZXNzYWdlUGFyc2VyJFRyaWVOb2RlOz47ICkKLXByaXZhdGUgZmluYWwgamF2YS51dGlsLkhhc2hNYXAgY2hpbGRyZW4KLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHRleHQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHZhbHVlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyB2b2lkIGFkZFRvVHJpZSgKLWNvbS5nb29nbGUuYW5kcm9pZC51dGlsLkFic3RyYWN0TWVzc2FnZVBhcnNlciRUcmllTm9kZQotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gZXhpc3RzKCkKLQotcHVibGljIGNvbS5nb29nbGUuYW5kcm9pZC51dGlsLkFic3RyYWN0TWVzc2FnZVBhcnNlciRUcmllTm9kZSBnZXRDaGlsZCgKLWNoYXIpCi0KLXB1YmxpYyBjb20uZ29vZ2xlLmFuZHJvaWQudXRpbC5BYnN0cmFjdE1lc3NhZ2VQYXJzZXIkVHJpZU5vZGUgZ2V0T3JDcmVhdGVDaGlsZCgKLWNoYXIpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGdldFRleHQoKQotCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBnZXRWYWx1ZSgpCi0KLXB1YmxpYyB2b2lkIHNldFZhbHVlKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2dvb2dsZS9hbmRyb2lkL3V0aWwvQWJzdHJhY3RNZXNzYWdlUGFyc2VyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9VmlkZW8gKQotcHVibGljIGNsYXNzIGNvbS5nb29nbGUuYW5kcm9pZC51dGlsLkFic3RyYWN0TWVzc2FnZVBhcnNlciRWaWRlbyBleHRlbmRzIGNvbS5nb29nbGUuYW5kcm9pZC51dGlsLkFic3RyYWN0TWVzc2FnZVBhcnNlciRUb2tlbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwucmVnZXguUGF0dGVybiBVUkxfUEFUVEVSTgotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZG9jaWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRSc3NVcmwoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VVJMKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFVSTCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgY29tLmdvb2dsZS5hbmRyb2lkLnV0aWwuQWJzdHJhY3RNZXNzYWdlUGFyc2VyJFZpZGVvIG1hdGNoVVJMKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RG9jSUQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9MaXN0PExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRJbmZvKCkKLQotcHVibGljIGJvb2xlYW4gaXNIdG1sKCkKLQotcHVibGljIGJvb2xlYW4gaXNNZWRpYSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPVlvdVR1YmVWaWRlbyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2dvb2dsZS9hbmRyb2lkL3V0aWwvQWJzdHJhY3RNZXNzYWdlUGFyc2VyOyApCi1wdWJsaWMgY2xhc3MgY29tLmdvb2dsZS5hbmRyb2lkLnV0aWwuQWJzdHJhY3RNZXNzYWdlUGFyc2VyJFlvdVR1YmVWaWRlbyBleHRlbmRzIGNvbS5nb29nbGUuYW5kcm9pZC51dGlsLkFic3RyYWN0TWVzc2FnZVBhcnNlciRUb2tlbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwucmVnZXguUGF0dGVybiBVUkxfUEFUVEVSTgotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZG9jaWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRQcmVmaXhlZFVSTCgKLWJvb2xlYW4KLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRSc3NVcmwoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VVJMKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFVSTCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgY29tLmdvb2dsZS5hbmRyb2lkLnV0aWwuQWJzdHJhY3RNZXNzYWdlUGFyc2VyJFlvdVR1YmVWaWRlbyBtYXRjaFVSTCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldERvY0lEKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvTGlzdDxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0SW5mbygpCi0KLXB1YmxpYyBib29sZWFuIGlzSHRtbCgpCi0KLXB1YmxpYyBib29sZWFuIGlzTWVkaWEoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGNvbS9nb29nbGUvYW5kcm9pZC91dGlsL0Fic3RyYWN0TWVzc2FnZVBhcnNlciQxO0xjb20vZ29vZ2xlL2FuZHJvaWQvdXRpbC9BYnN0cmFjdE1lc3NhZ2VQYXJzZXIkUGFydDtMY29tL2dvb2dsZS9hbmRyb2lkL3V0aWwvQWJzdHJhY3RNZXNzYWdlUGFyc2VyJFRyaWVOb2RlO0xjb20vZ29vZ2xlL2FuZHJvaWQvdXRpbC9BYnN0cmFjdE1lc3NhZ2VQYXJzZXIkRm9ybWF0O0xjb20vZ29vZ2xlL2FuZHJvaWQvdXRpbC9BYnN0cmFjdE1lc3NhZ2VQYXJzZXIkQWNyb255bTtMY29tL2dvb2dsZS9hbmRyb2lkL3V0aWwvQWJzdHJhY3RNZXNzYWdlUGFyc2VyJFNtaWxleTtMY29tL2dvb2dsZS9hbmRyb2lkL3V0aWwvQWJzdHJhY3RNZXNzYWdlUGFyc2VyJEZsaWNrclBob3RvO0xjb20vZ29vZ2xlL2FuZHJvaWQvdXRpbC9BYnN0cmFjdE1lc3NhZ2VQYXJzZXIkUGhvdG87TGNvbS9nb29nbGUvYW5kcm9pZC91dGlsL0Fic3RyYWN0TWVzc2FnZVBhcnNlciRZb3VUdWJlVmlkZW87TGNvbS9nb29nbGUvYW5kcm9pZC91dGlsL0Fic3RyYWN0TWVzc2FnZVBhcnNlciRWaWRlbztMY29tL2dvb2dsZS9hbmRyb2lkL3V0aWwvQWJzdHJhY3RNZXNzYWdlUGFyc2VyJExpbms7TGNvbS9nb29nbGUvYW5kcm9pZC91dGlsL0Fic3RyYWN0TWVzc2FnZVBhcnNlciRNdXNpY1RyYWNrO0xjb20vZ29vZ2xlL2FuZHJvaWQvdXRpbC9BYnN0cmFjdE1lc3NhZ2VQYXJzZXIkSHRtbDtMY29tL2dvb2dsZS9hbmRyb2lkL3V0aWwvQWJzdHJhY3RNZXNzYWdlUGFyc2VyJFRva2VuO0xjb20vZ29vZ2xlL2FuZHJvaWQvdXRpbC9BYnN0cmFjdE1lc3NhZ2VQYXJzZXIkUmVzb3VyY2VzOyApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgY29tLmdvb2dsZS5hbmRyb2lkLnV0aWwuQWJzdHJhY3RNZXNzYWdlUGFyc2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgbXVzaWNOb3RlCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNoTWFwPExqYXZhL2xhbmcvQ2hhcmFjdGVyO0xjb20vZ29vZ2xlL2FuZHJvaWQvdXRpbC9BYnN0cmFjdE1lc3NhZ2VQYXJzZXIkRm9ybWF0Oz47ICkKLXByaXZhdGUgamF2YS51dGlsLkhhc2hNYXAgZm9ybWF0U3RhcnQKLQotcHJpdmF0ZSBpbnQgbmV4dENoYXIKLQotcHJpdmF0ZSBpbnQgbmV4dENsYXNzCi0KLXByaXZhdGUgYm9vbGVhbiBwYXJzZUFjcm9ueW1zCi0KLXByaXZhdGUgYm9vbGVhbiBwYXJzZUZvcm1hdHRpbmcKLQotcHJpdmF0ZSBib29sZWFuIHBhcnNlTWVUZXh0Ci0KLXByaXZhdGUgYm9vbGVhbiBwYXJzZU11c2ljCi0KLXByaXZhdGUgYm9vbGVhbiBwYXJzZVNtaWxpZXMKLQotcHJpdmF0ZSBib29sZWFuIHBhcnNlVXJscwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQXJyYXlMaXN0PExjb20vZ29vZ2xlL2FuZHJvaWQvdXRpbC9BYnN0cmFjdE1lc3NhZ2VQYXJzZXIkUGFydDs+OyApCi1wcml2YXRlIGphdmEudXRpbC5BcnJheUxpc3QgcGFydHMKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHRleHQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0FycmF5TGlzdDxMY29tL2dvb2dsZS9hbmRyb2lkL3V0aWwvQWJzdHJhY3RNZXNzYWdlUGFyc2VyJFRva2VuOz47ICkKLXByaXZhdGUgamF2YS51dGlsLkFycmF5TGlzdCB0b2tlbnMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuCi1ib29sZWFuCi1ib29sZWFuCi1ib29sZWFuCi1ib29sZWFuCi1ib29sZWFuKQotCi1wcml2YXRlIHZvaWQgYWRkVG9rZW4oCi1jb20uZ29vZ2xlLmFuZHJvaWQudXRpbC5BYnN0cmFjdE1lc3NhZ2VQYXJzZXIkVG9rZW4pCi0KLXByaXZhdGUgdm9pZCBhZGRVUkxUb2tlbigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgdm9pZCBidWlsZFBhcnRzKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBpbnQgZ2V0Q2hhckNsYXNzKAotaW50KQotCi1wcml2YXRlIGJvb2xlYW4gaXNEb21haW5DaGFyKAotY2hhcikKLQotcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0Zvcm1hdENoYXIoCi1jaGFyKQotCi1wcml2YXRlIHN0YXRpYyBib29sZWFuIGlzUHVuY3R1YXRpb24oCi1jaGFyKQotCi1wcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU21pbGV5QnJlYWsoCi1jaGFyCi1jaGFyKQotCi1wcml2YXRlIGJvb2xlYW4gaXNTbWlsZXlCcmVhaygKLWludCkKLQotcHJpdmF0ZSBib29sZWFuIGlzVVJMQnJlYWsoCi1pbnQpCi0KLXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkRG9tYWluKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBib29sZWFuIGlzV29yZEJyZWFrKAotaW50KQotCi1wcml2YXRlIGNvbS5nb29nbGUuYW5kcm9pZC51dGlsLkFic3RyYWN0TWVzc2FnZVBhcnNlciRQYXJ0IGxhc3RQYXJ0KCkKLQotcHJpdmF0ZSBzdGF0aWMgY29tLmdvb2dsZS5hbmRyb2lkLnV0aWwuQWJzdHJhY3RNZXNzYWdlUGFyc2VyJFRyaWVOb2RlIGxvbmdlc3RNYXRjaCgKLWNvbS5nb29nbGUuYW5kcm9pZC51dGlsLkFic3RyYWN0TWVzc2FnZVBhcnNlciRUcmllTm9kZQotY29tLmdvb2dsZS5hbmRyb2lkLnV0aWwuQWJzdHJhY3RNZXNzYWdlUGFyc2VyCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIGNvbS5nb29nbGUuYW5kcm9pZC51dGlsLkFic3RyYWN0TWVzc2FnZVBhcnNlciRUcmllTm9kZSBsb25nZXN0TWF0Y2goCi1jb20uZ29vZ2xlLmFuZHJvaWQudXRpbC5BYnN0cmFjdE1lc3NhZ2VQYXJzZXIkVHJpZU5vZGUKLWNvbS5nb29nbGUuYW5kcm9pZC51dGlsLkFic3RyYWN0TWVzc2FnZVBhcnNlcgotaW50Ci1ib29sZWFuKQotCi1wcml2YXRlIHN0YXRpYyBib29sZWFuIG1hdGNoZXMoCi1jb20uZ29vZ2xlLmFuZHJvaWQudXRpbC5BYnN0cmFjdE1lc3NhZ2VQYXJzZXIkVHJpZU5vZGUKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgYm9vbGVhbiBwYXJzZUFjcm9ueW0oKQotCi1wcml2YXRlIGJvb2xlYW4gcGFyc2VGb3JtYXR0aW5nKCkKLQotcHJpdmF0ZSBib29sZWFuIHBhcnNlTXVzaWNUcmFjaygpCi0KLXByaXZhdGUgYm9vbGVhbiBwYXJzZVNtaWxleSgpCi0KLXByaXZhdGUgdm9pZCBwYXJzZVRleHQoKQotCi1wcml2YXRlIGJvb2xlYW4gcGFyc2VVUkwoKQotCi1wcm90ZWN0ZWQgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgcmV2ZXJzZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgY29tLmdvb2dsZS5hbmRyb2lkLnV0aWwuQWJzdHJhY3RNZXNzYWdlUGFyc2VyJFRva2VuIHRva2VuRm9yVXJsKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGZpbmFsIGNvbS5nb29nbGUuYW5kcm9pZC51dGlsLkFic3RyYWN0TWVzc2FnZVBhcnNlciRQYXJ0IGdldFBhcnQoCi1pbnQpCi0KLXB1YmxpYyBmaW5hbCBpbnQgZ2V0UGFydENvdW50KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvTGlzdDxMY29tL2dvb2dsZS9hbmRyb2lkL3V0aWwvQWJzdHJhY3RNZXNzYWdlUGFyc2VyJFBhcnQ7PjsgKQotcHVibGljIGZpbmFsIGphdmEudXRpbC5MaXN0IGdldFBhcnRzKCkKLQotcHVibGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgZ2V0UmF3VGV4dCgpCi0KLXByb3RlY3RlZCBhYnN0cmFjdCBjb20uZ29vZ2xlLmFuZHJvaWQudXRpbC5BYnN0cmFjdE1lc3NhZ2VQYXJzZXIkUmVzb3VyY2VzIGdldFJlc291cmNlcygpCi0KLXB1YmxpYyB2b2lkIHBhcnNlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9IdG1sKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2dvb2dsZS9hbmRyb2lkL3V0aWwvR29vZ2xlV2ViQ29udGVudEhlbHBlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID00MTA0IG5hbWUgPW51bGwgKQotIGNsYXNzIGNvbS5nb29nbGUuYW5kcm9pZC51dGlsLkdvb2dsZVdlYkNvbnRlbnRIZWxwZXIkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vZ29vZ2xlL2FuZHJvaWQvdXRpbC9Hb29nbGVXZWJDb250ZW50SGVscGVyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTIgbmFtZSA9TXlXZWJWaWV3Q2xpZW50ICkKLSBjbGFzcyBjb20uZ29vZ2xlLmFuZHJvaWQudXRpbC5Hb29nbGVXZWJDb250ZW50SGVscGVyJE15V2ViVmlld0NsaWVudCBleHRlbmRzIGFuZHJvaWQud2Via2l0LldlYlZpZXdDbGllbnQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgY29tLmdvb2dsZS5hbmRyb2lkLnV0aWwuR29vZ2xlV2ViQ29udGVudEhlbHBlciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotY29tLmdvb2dsZS5hbmRyb2lkLnV0aWwuR29vZ2xlV2ViQ29udGVudEhlbHBlcikKLQotIHZvaWQgPGluaXQ+KAotY29tLmdvb2dsZS5hbmRyb2lkLnV0aWwuR29vZ2xlV2ViQ29udGVudEhlbHBlcgotY29tLmdvb2dsZS5hbmRyb2lkLnV0aWwuR29vZ2xlV2ViQ29udGVudEhlbHBlciQxKQotCi1wdWJsaWMgdm9pZCBvblBhZ2VGaW5pc2hlZCgKLWFuZHJvaWQud2Via2l0LldlYlZpZXcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIG9uUmVjZWl2ZWRFcnJvcigKLWFuZHJvaWQud2Via2l0LldlYlZpZXcKLWludAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgb25SZWNlaXZlZEh0dHBBdXRoUmVxdWVzdCgKLWFuZHJvaWQud2Via2l0LldlYlZpZXcKLWFuZHJvaWQud2Via2l0Lkh0dHBBdXRoSGFuZGxlcgotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgb25SZWNlaXZlZFNzbEVycm9yKAotYW5kcm9pZC53ZWJraXQuV2ViVmlldwotYW5kcm9pZC53ZWJraXQuU3NsRXJyb3JIYW5kbGVyCi1hbmRyb2lkLm5ldC5odHRwLlNzbEVycm9yKQotCi1wdWJsaWMgdm9pZCBvblRvb01hbnlSZWRpcmVjdHMoCi1hbmRyb2lkLndlYmtpdC5XZWJWaWV3Ci1hbmRyb2lkLm9zLk1lc3NhZ2UKLWFuZHJvaWQub3MuTWVzc2FnZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxjb20vZ29vZ2xlL2FuZHJvaWQvdXRpbC9Hb29nbGVXZWJDb250ZW50SGVscGVyJDE7TGNvbS9nb29nbGUvYW5kcm9pZC91dGlsL0dvb2dsZVdlYkNvbnRlbnRIZWxwZXIkTXlXZWJWaWV3Q2xpZW50OyApCi1wdWJsaWMgY2xhc3MgY29tLmdvb2dsZS5hbmRyb2lkLnV0aWwuR29vZ2xlV2ViQ29udGVudEhlbHBlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBtQ29udGV4dAotCi1wcml2YXRlIGFuZHJvaWQudmlldy5WaWV3R3JvdXAgbUxheW91dAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbVByZXR0eVVybAotCi1wcml2YXRlIGFuZHJvaWQudmlldy5WaWV3IG1Qcm9ncmVzc0JhcgotCi1wcml2YXRlIGJvb2xlYW4gbVJlY2VpdmVkUmVzcG9uc2UKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1TZWN1cmVVcmwKLQotcHJpdmF0ZSBhbmRyb2lkLndpZGdldC5UZXh0VmlldyBtVGV4dFZpZXcKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1VbnN1Y2Nlc3NmdWxNZXNzYWdlCi0KLXByaXZhdGUgYW5kcm9pZC53ZWJraXQuV2ViVmlldyBtV2ViVmlldwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWFuZHJvaWQuY29udGVudC5Db250ZXh0KQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMTAwKAotY29tLmdvb2dsZS5hbmRyb2lkLnV0aWwuR29vZ2xlV2ViQ29udGVudEhlbHBlcgotYm9vbGVhbikKLQotcHJpdmF0ZSB2b2lkIGVuc3VyZVZpZXdzKCkKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBmaWxsVXJsKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSB2b2lkIGhhbmRsZVdlYlZpZXdDb21wbGV0aW9uKAotYm9vbGVhbikKLQotcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVWaWV3cygpCi0KLXB1YmxpYyBhbmRyb2lkLnZpZXcuVmlld0dyb3VwIGdldExheW91dCgpCi0KLXB1YmxpYyBjb20uZ29vZ2xlLmFuZHJvaWQudXRpbC5Hb29nbGVXZWJDb250ZW50SGVscGVyIGxvYWRVcmwoKQotCi1wdWJsaWMgY29tLmdvb2dsZS5hbmRyb2lkLnV0aWwuR29vZ2xlV2ViQ29udGVudEhlbHBlciBzZXRVbnN1Y2Nlc3NmdWxNZXNzYWdlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGNvbS5nb29nbGUuYW5kcm9pZC51dGlsLkdvb2dsZVdlYkNvbnRlbnRIZWxwZXIgc2V0VXJsc0Zyb21Hc2VydmljZXMoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvbGFuZy9PYmplY3Q7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgY29tLmdvb2dsZS5hbmRyb2lkLnV0aWwuUHJvY2VkdXJlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRUOylWICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGFwcGx5KAotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2dvb2dsZS9hbmRyb2lkL3V0aWwvU2ltcGxlUHVsbFBhcnNlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNSBuYW1lID1QYXJzZUV4Y2VwdGlvbiApCi1wdWJsaWMgZmluYWwgY2xhc3MgY29tLmdvb2dsZS5hbmRyb2lkLnV0aWwuU2ltcGxlUHVsbFBhcnNlciRQYXJzZUV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5FeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGNvbS9nb29nbGUvYW5kcm9pZC91dGlsL1NpbXBsZVB1bGxQYXJzZXIkUGFyc2VFeGNlcHRpb247ICkKLXB1YmxpYyBjbGFzcyBjb20uZ29vZ2xlLmFuZHJvaWQudXRpbC5TaW1wbGVQdWxsUGFyc2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEVYVF9UQUcKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1DdXJyZW50U3RhcnRUYWcKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG1Mb2dUYWcKLQotcHJpdmF0ZSBmaW5hbCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyIG1QYXJzZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxjb20vZ29vZ2xlL2FuZHJvaWQvdXRpbC9TaW1wbGVQdWxsUGFyc2VyJFBhcnNlRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmlvLklucHV0U3RyZWFtCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xjb20vZ29vZ2xlL2FuZHJvaWQvdXRpbC9TaW1wbGVQdWxsUGFyc2VyJFBhcnNlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmlvLlJlYWRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMY29tL2dvb2dsZS9hbmRyb2lkL3V0aWwvU2ltcGxlUHVsbFBhcnNlciRQYXJzZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBtb3ZlVG9TdGFydERvY3VtZW50KAotb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcikKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QXR0cmlidXRlTmFtZXNwYWNlKAotaW50KQotCi1wdWJsaWMgaW50IGdldERlcHRoKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MY29tL2dvb2dsZS9hbmRyb2lkL3V0aWwvU2ltcGxlUHVsbFBhcnNlciRQYXJzZUV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXRJbnRBdHRyaWJ1dGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxjb20vZ29vZ2xlL2FuZHJvaWQvdXRpbC9TaW1wbGVQdWxsUGFyc2VyJFBhcnNlRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGdldEludEF0dHJpYnV0ZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MY29tL2dvb2dsZS9hbmRyb2lkL3V0aWwvU2ltcGxlUHVsbFBhcnNlciRQYXJzZUV4Y2VwdGlvbjsgKQotcHVibGljIGxvbmcgZ2V0TG9uZ0F0dHJpYnV0ZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGNvbS9nb29nbGUvYW5kcm9pZC91dGlsL1NpbXBsZVB1bGxQYXJzZXIkUGFyc2VFeGNlcHRpb247ICkKLXB1YmxpYyBsb25nIGdldExvbmdBdHRyaWJ1dGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1sb25nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxjb20vZ29vZ2xlL2FuZHJvaWQvdXRpbC9TaW1wbGVQdWxsUGFyc2VyJFBhcnNlRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdHJpbmdBdHRyaWJ1dGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdHJpbmdBdHRyaWJ1dGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xjb20vZ29vZ2xlL2FuZHJvaWQvdXRpbC9TaW1wbGVQdWxsUGFyc2VyJFBhcnNlRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBuZXh0VGFnKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xjb20vZ29vZ2xlL2FuZHJvaWQvdXRpbC9TaW1wbGVQdWxsUGFyc2VyJFBhcnNlRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBuZXh0VGFnT3JUZXh0KAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nQnVpbGRlcikKLQotcHVibGljIGludCBudW1BdHRyaWJ1dGVzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMY29tL2dvb2dsZS9hbmRyb2lkL3V0aWwvU2ltcGxlUHVsbFBhcnNlciRQYXJzZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcmVhZFJlbWFpbmluZ1RleHQoCi1pbnQKLWphdmEubGFuZy5TdHJpbmdCdWlsZGVyKQotCi1wdWJsaWMgdm9pZCBzZXRMb2dUYWcoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGNvbS5nb29nbGUuYW5kcm9pZC51dGlsLlNtaWxleVBhcnNlciBleHRlbmRzIGNvbS5nb29nbGUuYW5kcm9pZC51dGlsLkFic3RyYWN0TWVzc2FnZVBhcnNlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGNvbS5nb29nbGUuYW5kcm9pZC51dGlsLlNtaWxleVJlc291cmNlcyBtUmVzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotY29tLmdvb2dsZS5hbmRyb2lkLnV0aWwuU21pbGV5UmVzb3VyY2VzKQotCi1wcm90ZWN0ZWQgY29tLmdvb2dsZS5hbmRyb2lkLnV0aWwuQWJzdHJhY3RNZXNzYWdlUGFyc2VyJFJlc291cmNlcyBnZXRSZXNvdXJjZXMoKQotCi1wdWJsaWMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBnZXRTcGFubmFibGVTdHJpbmcoCi1hbmRyb2lkLmNvbnRlbnQuQ29udGV4dCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBjb20uZ29vZ2xlLmFuZHJvaWQudXRpbC5TbWlsZXlSZXNvdXJjZXMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgY29tLmdvb2dsZS5hbmRyb2lkLnV0aWwuQWJzdHJhY3RNZXNzYWdlUGFyc2VyJFJlc291cmNlcwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaE1hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL0ludGVnZXI7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuSGFzaE1hcCBtU21pbGV5VG9SZXMKLQotcHJpdmF0ZSBmaW5hbCBjb20uZ29vZ2xlLmFuZHJvaWQudXRpbC5BYnN0cmFjdE1lc3NhZ2VQYXJzZXIkVHJpZU5vZGUgc21pbGV5cwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmdbXQotaW50W10pCi0KLXB1YmxpYyBjb20uZ29vZ2xlLmFuZHJvaWQudXRpbC5BYnN0cmFjdE1lc3NhZ2VQYXJzZXIkVHJpZU5vZGUgZ2V0QWNyb255bXMoKQotCi1wdWJsaWMgY29tLmdvb2dsZS5hbmRyb2lkLnV0aWwuQWJzdHJhY3RNZXNzYWdlUGFyc2VyJFRyaWVOb2RlIGdldERvbWFpblN1ZmZpeGVzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvU2V0PExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuU2V0IGdldFNjaGVtZXMoKQotCi1wdWJsaWMgaW50IGdldFNtaWxleVJlcygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBjb20uZ29vZ2xlLmFuZHJvaWQudXRpbC5BYnN0cmFjdE1lc3NhZ2VQYXJzZXIkVHJpZU5vZGUgZ2V0U21pbGV5cygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5EZWNvZGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvY29tbW9ucy9jb2RlYy9EZWNvZGVyRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLk9iamVjdCBkZWNvZGUoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMuQmluYXJ5RGVjb2RlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMuRGVjb2RlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvY29tbW9ucy9jb2RlYy9EZWNvZGVyRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYnl0ZVtdIGRlY29kZSgKLWJ5dGVbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLkVuY29kZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9jb21tb25zL2NvZGVjL0VuY29kZXJFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuT2JqZWN0IGVuY29kZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5CaW5hcnlFbmNvZGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5FbmNvZGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9jb21tb25zL2NvZGVjL0VuY29kZXJFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBieXRlW10gZW5jb2RlKAotYnl0ZVtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5EZWNvZGVyRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLkV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLkVuY29kZXJFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLlN0cmluZ0RlY29kZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLkRlY29kZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2NvbW1vbnMvY29kZWMvRGVjb2RlckV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZGVjb2RlKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLlN0cmluZ0VuY29kZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLkVuY29kZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2NvbW1vbnMvY29kZWMvRW5jb2RlckV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZW5jb2RlKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMuU3RyaW5nRW5jb2RlckNvbXBhcmF0b3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLkNvbXBhcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMuU3RyaW5nRW5jb2RlciBzdHJpbmdFbmNvZGVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLlN0cmluZ0VuY29kZXIpCi0KLXB1YmxpYyBpbnQgY29tcGFyZSgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLmJpbmFyeS5CYXNlNjQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLkJpbmFyeUVuY29kZXIsIG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5CaW5hcnlEZWNvZGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBmaW5hbCBpbnQgQkFTRUxFTkdUSAotCi1zdGF0aWMgZmluYWwgYnl0ZVtdIENIVU5LX1NFUEFSQVRPUgotCi1zdGF0aWMgZmluYWwgaW50IENIVU5LX1NJWkUKLQotc3RhdGljIGZpbmFsIGludCBFSUdIVEJJVAotCi1zdGF0aWMgZmluYWwgaW50IEZPVVJCWVRFCi0KLXN0YXRpYyBmaW5hbCBpbnQgTE9PS1VQTEVOR1RICi0KLXN0YXRpYyBmaW5hbCBieXRlIFBBRAotCi1zdGF0aWMgZmluYWwgaW50IFNJR04KLQotc3RhdGljIGZpbmFsIGludCBTSVhURUVOQklUCi0KLXN0YXRpYyBmaW5hbCBpbnQgVFdFTlRZRk9VUkJJVEdST1VQCi0KLXByaXZhdGUgc3RhdGljIGJ5dGVbXSBiYXNlNjRBbHBoYWJldAotCi1wcml2YXRlIHN0YXRpYyBieXRlW10gbG9va1VwQmFzZTY0QWxwaGFiZXQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGRlY29kZUJhc2U2NCgKLWJ5dGVbXSkKLQotc3RhdGljIGJ5dGVbXSBkaXNjYXJkTm9uQmFzZTY0KAotYnl0ZVtdKQotCi1zdGF0aWMgYnl0ZVtdIGRpc2NhcmRXaGl0ZXNwYWNlKAotYnl0ZVtdKQotCi1wdWJsaWMgc3RhdGljIGJ5dGVbXSBlbmNvZGVCYXNlNjQoCi1ieXRlW10pCi0KLXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGVuY29kZUJhc2U2NCgKLWJ5dGVbXQotYm9vbGVhbikKLQotcHVibGljIHN0YXRpYyBieXRlW10gZW5jb2RlQmFzZTY0Q2h1bmtlZCgKLWJ5dGVbXSkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzQXJyYXlCeXRlQmFzZTY0KAotYnl0ZVtdKQotCi1wcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQmFzZTY0KAotYnl0ZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9jb21tb25zL2NvZGVjL0RlY29kZXJFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGRlY29kZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBieXRlW10gZGVjb2RlKAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2NvbW1vbnMvY29kZWMvRW5jb2RlckV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZW5jb2RlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGJ5dGVbXSBlbmNvZGUoCi1ieXRlW10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLmJpbmFyeS5CaW5hcnlDb2RlYyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMuQmluYXJ5RGVjb2Rlciwgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLkJpbmFyeUVuY29kZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gQklUUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQklUXzAKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJJVF8xCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCSVRfMgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQklUXzMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJJVF80Ci0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCSVRfNQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQklUXzYKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJJVF83Ci0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBFTVBUWV9CWVRFX0FSUkFZCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBFTVBUWV9DSEFSX0FSUkFZCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGJ5dGVbXSBmcm9tQXNjaWkoCi1ieXRlW10pCi0KLXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGZyb21Bc2NpaSgKLWNoYXJbXSkKLQotcHVibGljIHN0YXRpYyBieXRlW10gdG9Bc2NpaUJ5dGVzKAotYnl0ZVtdKQotCi1wdWJsaWMgc3RhdGljIGNoYXJbXSB0b0FzY2lpQ2hhcnMoCi1ieXRlW10pCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyB0b0FzY2lpU3RyaW5nKAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2NvbW1vbnMvY29kZWMvRGVjb2RlckV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZGVjb2RlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGJ5dGVbXSBkZWNvZGUoCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvY29tbW9ucy9jb2RlYy9FbmNvZGVyRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBlbmNvZGUoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYnl0ZVtdIGVuY29kZSgKLWJ5dGVbXSkKLQotcHVibGljIGJ5dGVbXSB0b0J5dGVBcnJheSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLmJpbmFyeS5IZXggZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLkJpbmFyeUVuY29kZXIsIG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5CaW5hcnlEZWNvZGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBESUdJVFMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvY29tbW9ucy9jb2RlYy9EZWNvZGVyRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGJ5dGVbXSBkZWNvZGVIZXgoCi1jaGFyW10pCi0KLXB1YmxpYyBzdGF0aWMgY2hhcltdIGVuY29kZUhleCgKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9jb21tb25zL2NvZGVjL0RlY29kZXJFeGNlcHRpb247ICkKLXByb3RlY3RlZCBzdGF0aWMgaW50IHRvRGlnaXQoCi1jaGFyCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvY29tbW9ucy9jb2RlYy9EZWNvZGVyRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBkZWNvZGUoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2NvbW1vbnMvY29kZWMvRGVjb2RlckV4Y2VwdGlvbjsgKQotcHVibGljIGJ5dGVbXSBkZWNvZGUoCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvY29tbW9ucy9jb2RlYy9FbmNvZGVyRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBlbmNvZGUoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYnl0ZVtdIGVuY29kZSgKLWJ5dGVbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEgbmFtZSA9RG91YmxlTWV0YXBob25lUmVzdWx0ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYXBhY2hlL2NvbW1vbnMvY29kZWMvbGFuZ3VhZ2UvRG91YmxlTWV0YXBob25lOyApCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLmxhbmd1YWdlLkRvdWJsZU1ldGFwaG9uZSREb3VibGVNZXRhcGhvbmVSZXN1bHQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBhbHRlcm5hdGUKLQotcHJpdmF0ZSBpbnQgbWF4TGVuZ3RoCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBwcmltYXJ5Ci0KLWZpbmFsIG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5sYW5ndWFnZS5Eb3VibGVNZXRhcGhvbmUgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLmxhbmd1YWdlLkRvdWJsZU1ldGFwaG9uZQotaW50KQotCi1wdWJsaWMgdm9pZCBhcHBlbmQoCi1jaGFyKQotCi1wdWJsaWMgdm9pZCBhcHBlbmQoCi1jaGFyCi1jaGFyKQotCi1wdWJsaWMgdm9pZCBhcHBlbmQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBhcHBlbmQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBhcHBlbmRBbHRlcm5hdGUoCi1jaGFyKQotCi1wdWJsaWMgdm9pZCBhcHBlbmRBbHRlcm5hdGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBhcHBlbmRQcmltYXJ5KAotY2hhcikKLQotcHVibGljIHZvaWQgYXBwZW5kUHJpbWFyeSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEFsdGVybmF0ZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFByaW1hcnkoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxvcmcvYXBhY2hlL2NvbW1vbnMvY29kZWMvbGFuZ3VhZ2UvRG91YmxlTWV0YXBob25lJERvdWJsZU1ldGFwaG9uZVJlc3VsdDsgKQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5sYW5ndWFnZS5Eb3VibGVNZXRhcGhvbmUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLlN0cmluZ0VuY29kZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZ1tdIEVTX0VQX0VCX0VMX0VZX0lCX0lMX0lOX0lFX0VJX0VSCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmdbXSBMX1JfTl9NX0JfSF9GX1ZfV19TUEFDRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gTF9UX0tfU19OX01fQl9aCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmdbXSBTSUxFTlRfU1RBUlQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBWT1dFTFMKLQotcHJvdGVjdGVkIGludCBtYXhDb2RlTGVuCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgY2xlYW5JbnB1dCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgYm9vbGVhbiBjb25kaXRpb25DMCgKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHJpdmF0ZSBib29sZWFuIGNvbmRpdGlvbkNIMCgKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHJpdmF0ZSBib29sZWFuIGNvbmRpdGlvbkNIMSgKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHJpdmF0ZSBib29sZWFuIGNvbmRpdGlvbkwwKAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wcml2YXRlIGJvb2xlYW4gY29uZGl0aW9uTTAoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIGJvb2xlYW4gY29udGFpbnMoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb250YWlucygKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zKAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgc3RhdGljIGJvb2xlYW4gY29udGFpbnMoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb250YWlucygKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zKAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBjb250YWlucygKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLXByaXZhdGUgaW50IGhhbmRsZUFFSU9VWSgKLWphdmEubGFuZy5TdHJpbmcKLW9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5sYW5ndWFnZS5Eb3VibGVNZXRhcGhvbmUkRG91YmxlTWV0YXBob25lUmVzdWx0Ci1pbnQpCi0KLXByaXZhdGUgaW50IGhhbmRsZUMoCi1qYXZhLmxhbmcuU3RyaW5nCi1vcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMubGFuZ3VhZ2UuRG91YmxlTWV0YXBob25lJERvdWJsZU1ldGFwaG9uZVJlc3VsdAotaW50KQotCi1wcml2YXRlIGludCBoYW5kbGVDQygKLWphdmEubGFuZy5TdHJpbmcKLW9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5sYW5ndWFnZS5Eb3VibGVNZXRhcGhvbmUkRG91YmxlTWV0YXBob25lUmVzdWx0Ci1pbnQpCi0KLXByaXZhdGUgaW50IGhhbmRsZUNIKAotamF2YS5sYW5nLlN0cmluZwotb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLmxhbmd1YWdlLkRvdWJsZU1ldGFwaG9uZSREb3VibGVNZXRhcGhvbmVSZXN1bHQKLWludCkKLQotcHJpdmF0ZSBpbnQgaGFuZGxlRCgKLWphdmEubGFuZy5TdHJpbmcKLW9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5sYW5ndWFnZS5Eb3VibGVNZXRhcGhvbmUkRG91YmxlTWV0YXBob25lUmVzdWx0Ci1pbnQpCi0KLXByaXZhdGUgaW50IGhhbmRsZUcoCi1qYXZhLmxhbmcuU3RyaW5nCi1vcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMubGFuZ3VhZ2UuRG91YmxlTWV0YXBob25lJERvdWJsZU1ldGFwaG9uZVJlc3VsdAotaW50Ci1ib29sZWFuKQotCi1wcml2YXRlIGludCBoYW5kbGVHSCgKLWphdmEubGFuZy5TdHJpbmcKLW9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5sYW5ndWFnZS5Eb3VibGVNZXRhcGhvbmUkRG91YmxlTWV0YXBob25lUmVzdWx0Ci1pbnQpCi0KLXByaXZhdGUgaW50IGhhbmRsZUgoCi1qYXZhLmxhbmcuU3RyaW5nCi1vcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMubGFuZ3VhZ2UuRG91YmxlTWV0YXBob25lJERvdWJsZU1ldGFwaG9uZVJlc3VsdAotaW50KQotCi1wcml2YXRlIGludCBoYW5kbGVKKAotamF2YS5sYW5nLlN0cmluZwotb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLmxhbmd1YWdlLkRvdWJsZU1ldGFwaG9uZSREb3VibGVNZXRhcGhvbmVSZXN1bHQKLWludAotYm9vbGVhbikKLQotcHJpdmF0ZSBpbnQgaGFuZGxlTCgKLWphdmEubGFuZy5TdHJpbmcKLW9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5sYW5ndWFnZS5Eb3VibGVNZXRhcGhvbmUkRG91YmxlTWV0YXBob25lUmVzdWx0Ci1pbnQpCi0KLXByaXZhdGUgaW50IGhhbmRsZVAoCi1qYXZhLmxhbmcuU3RyaW5nCi1vcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMubGFuZ3VhZ2UuRG91YmxlTWV0YXBob25lJERvdWJsZU1ldGFwaG9uZVJlc3VsdAotaW50KQotCi1wcml2YXRlIGludCBoYW5kbGVSKAotamF2YS5sYW5nLlN0cmluZwotb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLmxhbmd1YWdlLkRvdWJsZU1ldGFwaG9uZSREb3VibGVNZXRhcGhvbmVSZXN1bHQKLWludAotYm9vbGVhbikKLQotcHJpdmF0ZSBpbnQgaGFuZGxlUygKLWphdmEubGFuZy5TdHJpbmcKLW9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5sYW5ndWFnZS5Eb3VibGVNZXRhcGhvbmUkRG91YmxlTWV0YXBob25lUmVzdWx0Ci1pbnQKLWJvb2xlYW4pCi0KLXByaXZhdGUgaW50IGhhbmRsZVNDKAotamF2YS5sYW5nLlN0cmluZwotb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLmxhbmd1YWdlLkRvdWJsZU1ldGFwaG9uZSREb3VibGVNZXRhcGhvbmVSZXN1bHQKLWludCkKLQotcHJpdmF0ZSBpbnQgaGFuZGxlVCgKLWphdmEubGFuZy5TdHJpbmcKLW9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5sYW5ndWFnZS5Eb3VibGVNZXRhcGhvbmUkRG91YmxlTWV0YXBob25lUmVzdWx0Ci1pbnQpCi0KLXByaXZhdGUgaW50IGhhbmRsZVcoCi1qYXZhLmxhbmcuU3RyaW5nCi1vcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMubGFuZ3VhZ2UuRG91YmxlTWV0YXBob25lJERvdWJsZU1ldGFwaG9uZVJlc3VsdAotaW50KQotCi1wcml2YXRlIGludCBoYW5kbGVYKAotamF2YS5sYW5nLlN0cmluZwotb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLmxhbmd1YWdlLkRvdWJsZU1ldGFwaG9uZSREb3VibGVNZXRhcGhvbmVSZXN1bHQKLWludCkKLQotcHJpdmF0ZSBpbnQgaGFuZGxlWigKLWphdmEubGFuZy5TdHJpbmcKLW9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5sYW5ndWFnZS5Eb3VibGVNZXRhcGhvbmUkRG91YmxlTWV0YXBob25lUmVzdWx0Ci1pbnQKLWJvb2xlYW4pCi0KLXByaXZhdGUgYm9vbGVhbiBpc1NpbGVudFN0YXJ0KAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBib29sZWFuIGlzU2xhdm9HZXJtYW5pYygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgYm9vbGVhbiBpc1Zvd2VsKAotY2hhcikKLQotcHJvdGVjdGVkIGNoYXIgY2hhckF0KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBkb3VibGVNZXRhcGhvbmUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBkb3VibGVNZXRhcGhvbmUoCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2NvbW1vbnMvY29kZWMvRW5jb2RlckV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZW5jb2RlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZW5jb2RlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGludCBnZXRNYXhDb2RlTGVuKCkKLQotcHVibGljIGJvb2xlYW4gaXNEb3VibGVNZXRhcGhvbmVFcXVhbCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBib29sZWFuIGlzRG91YmxlTWV0YXBob25lRXF1YWwoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRNYXhDb2RlTGVuKAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5sYW5ndWFnZS5NZXRhcGhvbmUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLlN0cmluZ0VuY29kZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGZyb250dgotCi1wcml2YXRlIGludCBtYXhDb2RlTGVuCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyB2YXJzb24KLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHZvd2VscwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgYm9vbGVhbiBpc0xhc3RDaGFyKAotaW50Ci1pbnQpCi0KLXByaXZhdGUgYm9vbGVhbiBpc05leHRDaGFyKAotamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgotaW50Ci1jaGFyKQotCi1wcml2YXRlIGJvb2xlYW4gaXNQcmV2aW91c0NoYXIoCi1qYXZhLmxhbmcuU3RyaW5nQnVmZmVyCi1pbnQKLWNoYXIpCi0KLXByaXZhdGUgYm9vbGVhbiBpc1Zvd2VsKAotamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgotaW50KQotCi1wcml2YXRlIGJvb2xlYW4gcmVnaW9uTWF0Y2goCi1qYXZhLmxhbmcuU3RyaW5nQnVmZmVyCi1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvY29tbW9ucy9jb2RlYy9FbmNvZGVyRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBlbmNvZGUoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBlbmNvZGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgaW50IGdldE1heENvZGVMZW4oKQotCi1wdWJsaWMgYm9vbGVhbiBpc01ldGFwaG9uZUVxdWFsKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgbWV0YXBob25lKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0TWF4Q29kZUxlbigKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMubGFuZ3VhZ2UuUmVmaW5lZFNvdW5kZXggZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLlN0cmluZ0VuY29kZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMubGFuZ3VhZ2UuUmVmaW5lZFNvdW5kZXggVVNfRU5HTElTSAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBVU19FTkdMSVNIX01BUFBJTkcKLQotcHJpdmF0ZSBjaGFyW10gc291bmRleE1hcHBpbmcKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWNoYXJbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9jb21tb25zL2NvZGVjL0VuY29kZXJFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgZGlmZmVyZW5jZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvY29tbW9ucy9jb2RlYy9FbmNvZGVyRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBlbmNvZGUoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBlbmNvZGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi0gY2hhciBnZXRNYXBwaW5nQ29kZSgKLWNoYXIpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHNvdW5kZXgoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5sYW5ndWFnZS5Tb3VuZGV4IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5TdHJpbmdFbmNvZGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLmxhbmd1YWdlLlNvdW5kZXggVVNfRU5HTElTSAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBVU19FTkdMSVNIX01BUFBJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFVTX0VOR0xJU0hfTUFQUElOR19TVFJJTkcKLQotcHJpdmF0ZSBpbnQgbWF4TGVuZ3RoCi0KLXByaXZhdGUgY2hhcltdIHNvdW5kZXhNYXBwaW5nCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1jaGFyW10pCi0KLXByaXZhdGUgY2hhciBnZXRNYXBwaW5nQ29kZSgKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHJpdmF0ZSBjaGFyW10gZ2V0U291bmRleE1hcHBpbmcoKQotCi1wcml2YXRlIGNoYXIgbWFwKAotY2hhcikKLQotcHJpdmF0ZSB2b2lkIHNldFNvdW5kZXhNYXBwaW5nKAotY2hhcltdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2NvbW1vbnMvY29kZWMvRW5jb2RlckV4Y2VwdGlvbjsgKQotcHVibGljIGludCBkaWZmZXJlbmNlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9jb21tb25zL2NvZGVjL0VuY29kZXJFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGVuY29kZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGVuY29kZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBpbnQgZ2V0TWF4TGVuZ3RoKCkKLQotcHVibGljIHZvaWQgc2V0TWF4TGVuZ3RoKAotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBzb3VuZGV4KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLWZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5sYW5ndWFnZS5Tb3VuZGV4VXRpbHMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotc3RhdGljIGphdmEubGFuZy5TdHJpbmcgY2xlYW4oCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2NvbW1vbnMvY29kZWMvRW5jb2RlckV4Y2VwdGlvbjsgKQotc3RhdGljIGludCBkaWZmZXJlbmNlKAotb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLlN0cmluZ0VuY29kZXIKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXN0YXRpYyBpbnQgZGlmZmVyZW5jZUVuY29kZWQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotYWJzdHJhY3QgY2xhc3Mgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLm5ldC5SRkMxNTIyQ29kZWMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9jb21tb25zL2NvZGVjL0RlY29kZXJFeGNlcHRpb247TGphdmEvaW8vVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgZGVjb2RlVGV4dCgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvY29tbW9ucy9jb2RlYy9EZWNvZGVyRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgYWJzdHJhY3QgYnl0ZVtdIGRvRGVjb2RpbmcoCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvY29tbW9ucy9jb2RlYy9FbmNvZGVyRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgYWJzdHJhY3QgYnl0ZVtdIGRvRW5jb2RpbmcoCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvY29tbW9ucy9jb2RlYy9FbmNvZGVyRXhjZXB0aW9uO0xqYXZhL2lvL1Vuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247ICkKLXByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIGVuY29kZVRleHQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcm90ZWN0ZWQgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRFbmNvZGluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLm5ldC5CQ29kZWMgZXh0ZW5kcyBvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMubmV0LlJGQzE1MjJDb2RlYyBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5TdHJpbmdFbmNvZGVyLCBvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMuU3RyaW5nRGVjb2RlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgY2hhcnNldAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvY29tbW9ucy9jb2RlYy9EZWNvZGVyRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBkZWNvZGUoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2NvbW1vbnMvY29kZWMvRGVjb2RlckV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZGVjb2RlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9jb21tb25zL2NvZGVjL0RlY29kZXJFeGNlcHRpb247ICkKLXByb3RlY3RlZCBieXRlW10gZG9EZWNvZGluZygKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9jb21tb25zL2NvZGVjL0VuY29kZXJFeGNlcHRpb247ICkKLXByb3RlY3RlZCBieXRlW10gZG9FbmNvZGluZygKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9jb21tb25zL2NvZGVjL0VuY29kZXJFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGVuY29kZSgKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvY29tbW9ucy9jb2RlYy9FbmNvZGVyRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBlbmNvZGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2NvbW1vbnMvY29kZWMvRW5jb2RlckV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZW5jb2RlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RGVmYXVsdENoYXJzZXQoKQotCi1wcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBnZXRFbmNvZGluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLm5ldC5RQ29kZWMgZXh0ZW5kcyBvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMubmV0LlJGQzE1MjJDb2RlYyBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5TdHJpbmdFbmNvZGVyLCBvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMuU3RyaW5nRGVjb2RlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBieXRlIEJMQU5LCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEudXRpbC5CaXRTZXQgUFJJTlRBQkxFX0NIQVJTCi0KLXByaXZhdGUgc3RhdGljIGJ5dGUgVU5ERVJTQ09SRQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgY2hhcnNldAotCi1wcml2YXRlIGJvb2xlYW4gZW5jb2RlQmxhbmtzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2NvbW1vbnMvY29kZWMvRGVjb2RlckV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZGVjb2RlKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9jb21tb25zL2NvZGVjL0RlY29kZXJFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGRlY29kZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvY29tbW9ucy9jb2RlYy9EZWNvZGVyRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgYnl0ZVtdIGRvRGVjb2RpbmcoCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvY29tbW9ucy9jb2RlYy9FbmNvZGVyRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgYnl0ZVtdIGRvRW5jb2RpbmcoCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvY29tbW9ucy9jb2RlYy9FbmNvZGVyRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBlbmNvZGUoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2NvbW1vbnMvY29kZWMvRW5jb2RlckV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZW5jb2RlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9jb21tb25zL2NvZGVjL0VuY29kZXJFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGVuY29kZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldERlZmF1bHRDaGFyc2V0KCkKLQotcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgZ2V0RW5jb2RpbmcoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0VuY29kZUJsYW5rcygpCi0KLXB1YmxpYyB2b2lkIHNldEVuY29kZUJsYW5rcygKLWJvb2xlYW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLm5ldC5RdW90ZWRQcmludGFibGVDb2RlYyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMuQmluYXJ5RW5jb2Rlciwgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLkJpbmFyeURlY29kZXIsIG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5TdHJpbmdFbmNvZGVyLCBvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMuU3RyaW5nRGVjb2RlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBieXRlIEVTQ0FQRV9DSEFSCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEudXRpbC5CaXRTZXQgUFJJTlRBQkxFX0NIQVJTCi0KLXByaXZhdGUgc3RhdGljIGJ5dGUgU1BBQ0UKLQotcHJpdmF0ZSBzdGF0aWMgYnl0ZSBUQUIKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGNoYXJzZXQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvY29tbW9ucy9jb2RlYy9EZWNvZGVyRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBkZWNvZGVRdW90ZWRQcmludGFibGUoCi1ieXRlW10pCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIHZvaWQgZW5jb2RlUXVvdGVkUHJpbnRhYmxlKAotaW50Ci1qYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKAotamF2YS51dGlsLkJpdFNldAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2NvbW1vbnMvY29kZWMvRGVjb2RlckV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZGVjb2RlKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9jb21tb25zL2NvZGVjL0RlY29kZXJFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGRlY29kZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvY29tbW9ucy9jb2RlYy9EZWNvZGVyRXhjZXB0aW9uO0xqYXZhL2lvL1Vuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGRlY29kZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvY29tbW9ucy9jb2RlYy9EZWNvZGVyRXhjZXB0aW9uOyApCi1wdWJsaWMgYnl0ZVtdIGRlY29kZSgKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9jb21tb25zL2NvZGVjL0VuY29kZXJFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGVuY29kZSgKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvY29tbW9ucy9jb2RlYy9FbmNvZGVyRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBlbmNvZGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL1Vuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGVuY29kZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBieXRlW10gZW5jb2RlKAotYnl0ZVtdKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXREZWZhdWx0Q2hhcnNldCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1hYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLm5ldC5TdHJpbmdFbmNvZGluZ3MgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBVU19BU0NJSQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVVRGOAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLm5ldC5VUkxDb2RlYyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMuQmluYXJ5RW5jb2Rlciwgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLkJpbmFyeURlY29kZXIsIG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5TdHJpbmdFbmNvZGVyLCBvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMuU3RyaW5nRGVjb2RlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgc3RhdGljIGJ5dGUgRVNDQVBFX0NIQVIKLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuQml0U2V0IFdXV19GT1JNX1VSTAotCi1wcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBjaGFyc2V0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2NvbW1vbnMvY29kZWMvRGVjb2RlckV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gZGVjb2RlVXJsKAotYnl0ZVtdKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBlbmNvZGVVcmwoCi1qYXZhLnV0aWwuQml0U2V0Ci1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvY29tbW9ucy9jb2RlYy9EZWNvZGVyRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBkZWNvZGUoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2NvbW1vbnMvY29kZWMvRGVjb2RlckV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZGVjb2RlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9jb21tb25zL2NvZGVjL0RlY29kZXJFeGNlcHRpb247TGphdmEvaW8vVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZGVjb2RlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9jb21tb25zL2NvZGVjL0RlY29kZXJFeGNlcHRpb247ICkKLXB1YmxpYyBieXRlW10gZGVjb2RlKAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2NvbW1vbnMvY29kZWMvRW5jb2RlckV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZW5jb2RlKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9jb21tb25zL2NvZGVjL0VuY29kZXJFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGVuY29kZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZW5jb2RlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJ5dGVbXSBlbmNvZGUoCi1ieXRlW10pCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldERlZmF1bHRDaGFyc2V0KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RW5jb2RpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgZGVidWcoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBkZWJ1ZygKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGVycm9yKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZXJyb3IoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBmYXRhbCgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGZhdGFsKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLlRocm93YWJsZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgaW5mbygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGluZm8oCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0RlYnVnRW5hYmxlZCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzRXJyb3JFbmFibGVkKCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNGYXRhbEVuYWJsZWQoKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0luZm9FbmFibGVkKCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNUcmFjZUVuYWJsZWQoKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1dhcm5FbmFibGVkKCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgdHJhY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB0cmFjZSgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHdhcm4oCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB3YXJuKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLlRocm93YWJsZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dDb25maWd1cmF0aW9uRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIGphdmEubGFuZy5UaHJvd2FibGUgY2F1c2UKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1wdWJsaWMgamF2YS5sYW5nLlRocm93YWJsZSBnZXRDYXVzZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotZmluYWwgY2xhc3Mgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeSQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotZmluYWwgY2xhc3Mgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeSQyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIgdmFsJGNsYXNzTG9hZGVyCi0KLWZpbmFsIGphdmEubGFuZy5TdHJpbmcgdmFsJGZhY3RvcnlDbGFzcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5DbGFzc0xvYWRlcikKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1maW5hbCBjbGFzcyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5JDMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGphdmEubGFuZy5DbGFzc0xvYWRlciB2YWwkbG9hZGVyCi0KLWZpbmFsIGphdmEubGFuZy5TdHJpbmcgdmFsJG5hbWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuQ2xhc3NMb2FkZXIKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotZmluYWwgY2xhc3Mgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeSQ0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIgdmFsJGxvYWRlcgotCi1maW5hbCBqYXZhLmxhbmcuU3RyaW5nIHZhbCRuYW1lCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLkNsYXNzTG9hZGVyCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLWZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkkNSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgamF2YS5uZXQuVVJMIHZhbCR1cmwKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLm5ldC5VUkwpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3Mgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERJQUdOT1NUSUNTX0RFU1RfUFJPUEVSVFkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEZBQ1RPUllfREVGQVVMVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRkFDVE9SWV9QUk9QRVJUSUVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBGQUNUT1JZX1BST1BFUlRZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBIQVNIVEFCTEVfSU1QTEVNRU5UQVRJT05fUFJPUEVSVFkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBSSU9SSVRZX0tFWQotCi1wcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0VSVklDRV9JRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVENDTF9LRVkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBXRUFLX0hBU0hUQUJMRV9DTEFTU05BTUUKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBkaWFnbm9zdGljUHJlZml4Ci0KLXByaXZhdGUgc3RhdGljIGphdmEuaW8uUHJpbnRTdHJlYW0gZGlhZ25vc3RpY3NTdHJlYW0KLQotcHJvdGVjdGVkIHN0YXRpYyBqYXZhLnV0aWwuSGFzaHRhYmxlIGZhY3RvcmllcwotCi1wcm90ZWN0ZWQgc3RhdGljIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkgbnVsbENsYXNzTG9hZGVyRmFjdG9yeQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIgdGhpc0NsYXNzTG9hZGVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMDAwKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBjYWNoZUZhY3RvcnkoCi1qYXZhLmxhbmcuQ2xhc3NMb2FkZXIKLW9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkpCi0KLXByb3RlY3RlZCBzdGF0aWMgamF2YS5sYW5nLk9iamVjdCBjcmVhdGVGYWN0b3J5KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLkNsYXNzTG9hZGVyKQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuSGFzaHRhYmxlIGNyZWF0ZUZhY3RvcnlTdG9yZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvY29tbW9ucy9sb2dnaW5nL0xvZ0NvbmZpZ3VyYXRpb25FeGNlcHRpb247ICkKLXByb3RlY3RlZCBzdGF0aWMgamF2YS5sYW5nLkNsYXNzTG9hZGVyIGRpcmVjdEdldENvbnRleHRDbGFzc0xvYWRlcigpCi0KLXByaXZhdGUgc3RhdGljIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkgZ2V0Q2FjaGVkRmFjdG9yeSgKLWphdmEubGFuZy5DbGFzc0xvYWRlcikKLQotcHJvdGVjdGVkIHN0YXRpYyBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXIoCi1qYXZhLmxhbmcuQ2xhc3MpCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEudXRpbC5Qcm9wZXJ0aWVzIGdldENvbmZpZ3VyYXRpb25GaWxlKAotamF2YS5sYW5nLkNsYXNzTG9hZGVyCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2NvbW1vbnMvbG9nZ2luZy9Mb2dDb25maWd1cmF0aW9uRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgc3RhdGljIGphdmEubGFuZy5DbGFzc0xvYWRlciBnZXRDb250ZXh0Q2xhc3NMb2FkZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2NvbW1vbnMvbG9nZ2luZy9Mb2dDb25maWd1cmF0aW9uRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkgZ2V0RmFjdG9yeSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvY29tbW9ucy9sb2dnaW5nL0xvZ0NvbmZpZ3VyYXRpb25FeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGdldExvZygKLWphdmEubGFuZy5DbGFzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9jb21tb25zL2xvZ2dpbmcvTG9nQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgZ2V0TG9nKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLlByb3BlcnRpZXMgZ2V0UHJvcGVydGllcygKLWphdmEubmV0LlVSTCkKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5pby5JbnB1dFN0cmVhbSBnZXRSZXNvdXJjZUFzU3RyZWFtKAotamF2YS5sYW5nLkNsYXNzTG9hZGVyCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuRW51bWVyYXRpb24gZ2V0UmVzb3VyY2VzKAotamF2YS5sYW5nLkNsYXNzTG9hZGVyCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHN0YXRpYyBib29sZWFuIGltcGxlbWVudHNMb2dGYWN0b3J5KAotamF2YS5sYW5nLkNsYXNzKQotCi1wcml2YXRlIHN0YXRpYyB2b2lkIGluaXREaWFnbm9zdGljcygpCi0KLXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc0RpYWdub3N0aWNzRW5hYmxlZCgpCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgbG9nQ2xhc3NMb2FkZXJFbnZpcm9ubWVudCgKLWphdmEubGFuZy5DbGFzcykKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgdm9pZCBsb2dEaWFnbm9zdGljKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2dIaWVyYXJjaHkoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuQ2xhc3NMb2FkZXIpCi0KLXByb3RlY3RlZCBzdGF0aWMgZmluYWwgdm9pZCBsb2dSYXdEaWFnbm9zdGljKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJvdGVjdGVkIHN0YXRpYyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5IG5ld0ZhY3RvcnkoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuQ2xhc3NMb2FkZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvY29tbW9ucy9sb2dnaW5nL0xvZ0NvbmZpZ3VyYXRpb25FeGNlcHRpb247ICkKLXByb3RlY3RlZCBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeSBuZXdGYWN0b3J5KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLkNsYXNzTG9hZGVyCi1qYXZhLmxhbmcuQ2xhc3NMb2FkZXIpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBvYmplY3RJZCgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCByZWxlYXNlKAotamF2YS5sYW5nLkNsYXNzTG9hZGVyKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgcmVsZWFzZUFsbCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuT2JqZWN0IGdldEF0dHJpYnV0ZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0QXR0cmlidXRlTmFtZXMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2NvbW1vbnMvbG9nZ2luZy9Mb2dDb25maWd1cmF0aW9uRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGdldEluc3RhbmNlKAotamF2YS5sYW5nLkNsYXNzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2NvbW1vbnMvbG9nZ2luZy9Mb2dDb25maWd1cmF0aW9uRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGdldEluc3RhbmNlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IHZvaWQgcmVsZWFzZSgpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlbW92ZUF0dHJpYnV0ZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEF0dHJpYnV0ZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nU291cmNlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gamRrMTRJc0F2YWlsYWJsZQotCi1wcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gbG9nNGpJc0F2YWlsYWJsZQotCi1wcm90ZWN0ZWQgc3RhdGljIGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yIGxvZ0ltcGxjdG9yCi0KLXByb3RlY3RlZCBzdGF0aWMgamF2YS51dGlsLkhhc2h0YWJsZSBsb2dzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuQ2xhc3MpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGdldEluc3RhbmNlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0TG9nTmFtZXMoKQotCi1wdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBtYWtlTmV3TG9nSW5zdGFuY2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvTGlua2FnZUVycm9yO0xqYXZhL2xhbmcvRXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yO0xqYXZhL2xhbmcvTm9TdWNoTWV0aG9kRXhjZXB0aW9uO0xqYXZhL2xhbmcvU2VjdXJpdHlFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRMb2dJbXBsZW1lbnRhdGlvbigKLWphdmEubGFuZy5DbGFzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0xpbmthZ2VFcnJvcjtMamF2YS9sYW5nL0V4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvcjtMamF2YS9sYW5nL05vU3VjaE1ldGhvZEV4Y2VwdGlvbjtMamF2YS9sYW5nL1NlY3VyaXR5RXhjZXB0aW9uO0xqYXZhL2xhbmcvQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyB2b2lkIHNldExvZ0ltcGxlbWVudGF0aW9uKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5pbXBsLkpkazE0TG9nZ2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZywgamF2YS5pby5TZXJpYWxpemFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbCBkdW1teUxldmVsCi0KLXByb3RlY3RlZCB0cmFuc2llbnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyIGxvZ2dlcgotCi1wcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBuYW1lCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHZvaWQgbG9nKAotamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLXB1YmxpYyB2b2lkIGRlYnVnKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHZvaWQgZGVidWcoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1wdWJsaWMgdm9pZCBlcnJvcigKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2lkIGVycm9yKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLlRocm93YWJsZSkKLQotcHVibGljIHZvaWQgZmF0YWwoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgdm9pZCBmYXRhbCgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLXB1YmxpYyBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXIgZ2V0TG9nZ2VyKCkKLQotcHVibGljIHZvaWQgaW5mbygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2lkIGluZm8oCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1wdWJsaWMgYm9vbGVhbiBpc0RlYnVnRW5hYmxlZCgpCi0KLXB1YmxpYyBib29sZWFuIGlzRXJyb3JFbmFibGVkKCkKLQotcHVibGljIGJvb2xlYW4gaXNGYXRhbEVuYWJsZWQoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0luZm9FbmFibGVkKCkKLQotcHVibGljIGJvb2xlYW4gaXNUcmFjZUVuYWJsZWQoKQotCi1wdWJsaWMgYm9vbGVhbiBpc1dhcm5FbmFibGVkKCkKLQotcHVibGljIHZvaWQgdHJhY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgdm9pZCB0cmFjZSgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLXB1YmxpYyB2b2lkIHdhcm4oCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgdm9pZCB3YXJuKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLlRocm93YWJsZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5pbXBsLkxvZ0ZhY3RvcnlJbXBsIGV4dGVuZHMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUxMT1dfRkxBV0VEX0NPTlRFWFRfUFJPUEVSVFkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFMTE9XX0ZMQVdFRF9ESVNDT1ZFUllfUFJPUEVSVFkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFMTE9XX0ZMQVdFRF9ISUVSQVJDSFlfUFJPUEVSVFkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMT0dHSU5HX0lNUExfSkRLMTRfTE9HR0VSCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTE9HR0lOR19JTVBMX0xPRzRKX0xPR0dFUgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIExPR0dJTkdfSU1QTF9MVU1CRVJKQUNLX0xPR0dFUgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIExPR0dJTkdfSU1QTF9TSU1QTEVfTE9HR0VSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMT0dfUFJPUEVSVFkKLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIExPR19QUk9QRVJUWV9PTEQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQS0dfSU1QTAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEtHX0xFTgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gY2xhc3Nlc1RvRGlzY292ZXIKLQotcHJpdmF0ZSBib29sZWFuIGFsbG93Rmxhd2VkQ29udGV4dAotCi1wcml2YXRlIGJvb2xlYW4gYWxsb3dGbGF3ZWREaXNjb3ZlcnkKLQotcHJpdmF0ZSBib29sZWFuIGFsbG93Rmxhd2VkSGllcmFyY2h5Ci0KLXByb3RlY3RlZCBqYXZhLnV0aWwuSGFzaHRhYmxlIGF0dHJpYnV0ZXMKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGRpYWdub3N0aWNQcmVmaXgKLQotcHJvdGVjdGVkIGphdmEudXRpbC5IYXNodGFibGUgaW5zdGFuY2VzCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBsb2dDbGFzc05hbWUKLQotcHJvdGVjdGVkIGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yIGxvZ0NvbnN0cnVjdG9yCi0KLXByb3RlY3RlZCBqYXZhLmxhbmcuQ2xhc3NbXSBsb2dDb25zdHJ1Y3RvclNpZ25hdHVyZQotCi1wcm90ZWN0ZWQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIGxvZ01ldGhvZAotCi1wcm90ZWN0ZWQgamF2YS5sYW5nLkNsYXNzW10gbG9nTWV0aG9kU2lnbmF0dXJlCi0KLXByaXZhdGUgYm9vbGVhbiB1c2VUQ0NMCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2NvbW1vbnMvbG9nZ2luZy9Mb2dDb25maWd1cmF0aW9uRXhjZXB0aW9uOyApCi1wcml2YXRlIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBjcmVhdGVMb2dGcm9tQ2xhc3MoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2NvbW1vbnMvbG9nZ2luZy9Mb2dDb25maWd1cmF0aW9uRXhjZXB0aW9uOyApCi1wcml2YXRlIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBkaXNjb3ZlckxvZ0ltcGxlbWVudGF0aW9uKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGZpbmRVc2VyU3BlY2lmaWVkTG9nQ2xhc3NOYW1lKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9jb21tb25zL2xvZ2dpbmcvTG9nQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsgKQotcHJpdmF0ZSBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIgZ2V0QmFzZUNsYXNzTG9hZGVyKCkKLQotcHJpdmF0ZSBib29sZWFuIGdldEJvb2xlYW5Db25maWd1cmF0aW9uKAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotcHJvdGVjdGVkIHN0YXRpYyBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXIoCi1qYXZhLmxhbmcuQ2xhc3MpCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBnZXRDb25maWd1cmF0aW9uVmFsdWUoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2NvbW1vbnMvbG9nZ2luZy9Mb2dDb25maWd1cmF0aW9uRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgc3RhdGljIGphdmEubGFuZy5DbGFzc0xvYWRlciBnZXRDb250ZXh0Q2xhc3NMb2FkZXIoKQotCi1wcml2YXRlIGphdmEubGFuZy5DbGFzc0xvYWRlciBnZXRMb3dlc3RDbGFzc0xvYWRlcigKLWphdmEubGFuZy5DbGFzc0xvYWRlcgotamF2YS5sYW5nLkNsYXNzTG9hZGVyKQotCi1wcml2YXRlIHZvaWQgaGFuZGxlRmxhd2VkRGlzY292ZXJ5KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLkNsYXNzTG9hZGVyCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2NvbW1vbnMvbG9nZ2luZy9Mb2dDb25maWd1cmF0aW9uRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgaGFuZGxlRmxhd2VkSGllcmFyY2h5KAotamF2YS5sYW5nLkNsYXNzTG9hZGVyCi1qYXZhLmxhbmcuQ2xhc3MpCi0KLXByaXZhdGUgdm9pZCBpbmZvcm1VcG9uU2ltaWxhck5hbWUoCi1qYXZhLmxhbmcuU3RyaW5nQnVmZmVyCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHZvaWQgaW5pdENvbmZpZ3VyYXRpb24oKQotCi1wcml2YXRlIHZvaWQgaW5pdERpYWdub3N0aWNzKCkKLQotcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzRGlhZ25vc3RpY3NFbmFibGVkKCkKLQotcHJpdmF0ZSBib29sZWFuIGlzTG9nTGlicmFyeUF2YWlsYWJsZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldEF0dHJpYnV0ZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0QXR0cmlidXRlTmFtZXMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2NvbW1vbnMvbG9nZ2luZy9Mb2dDb25maWd1cmF0aW9uRXhjZXB0aW9uOyApCi1wdWJsaWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGdldEluc3RhbmNlKAotamF2YS5sYW5nLkNsYXNzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2NvbW1vbnMvbG9nZ2luZy9Mb2dDb25maWd1cmF0aW9uRXhjZXB0aW9uOyApCi1wdWJsaWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGdldEluc3RhbmNlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgZ2V0TG9nQ2xhc3NOYW1lKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9jb21tb25zL2xvZ2dpbmcvTG9nQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yIGdldExvZ0NvbnN0cnVjdG9yKCkKLQotcHJvdGVjdGVkIGJvb2xlYW4gaXNKZGsxM0x1bWJlcmphY2tBdmFpbGFibGUoKQotCi1wcm90ZWN0ZWQgYm9vbGVhbiBpc0pkazE0QXZhaWxhYmxlKCkKLQotcHJvdGVjdGVkIGJvb2xlYW4gaXNMb2c0SkF2YWlsYWJsZSgpCi0KLXByb3RlY3RlZCB2b2lkIGxvZ0RpYWdub3N0aWMoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2NvbW1vbnMvbG9nZ2luZy9Mb2dDb25maWd1cmF0aW9uRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIG5ld0luc3RhbmNlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgcmVsZWFzZSgpCi0KLXB1YmxpYyB2b2lkIHJlbW92ZUF0dHJpYnV0ZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuaW1wbC5Ob09wTG9nIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZywgamF2YS5pby5TZXJpYWxpemFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBkZWJ1ZygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2lkIGRlYnVnKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLlRocm93YWJsZSkKLQotcHVibGljIHZvaWQgZXJyb3IoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgdm9pZCBlcnJvcigKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLXB1YmxpYyB2b2lkIGZhdGFsKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHZvaWQgZmF0YWwoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1wdWJsaWMgdm9pZCBpbmZvKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHZvaWQgaW5mbygKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGlzRGVidWdFbmFibGVkKCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gaXNFcnJvckVuYWJsZWQoKQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBpc0ZhdGFsRW5hYmxlZCgpCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGlzSW5mb0VuYWJsZWQoKQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBpc1RyYWNlRW5hYmxlZCgpCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGlzV2FybkVuYWJsZWQoKQotCi1wdWJsaWMgdm9pZCB0cmFjZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2lkIHRyYWNlKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLlRocm93YWJsZSkKLQotcHVibGljIHZvaWQgd2FybigKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2lkIHdhcm4oCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLWZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLmltcGwuU2ltcGxlTG9nJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGphdmEubGFuZy5TdHJpbmcgdmFsJG5hbWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLmltcGwuU2ltcGxlTG9nIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZywgamF2YS5pby5TZXJpYWxpemFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFRkFVTFRfREFURV9USU1FX0ZPUk1BVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0dfTEVWRUxfQUxMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPR19MRVZFTF9ERUJVRwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0dfTEVWRUxfRVJST1IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9HX0xFVkVMX0ZBVEFMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPR19MRVZFTF9JTkZPCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPR19MRVZFTF9PRkYKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9HX0xFVkVMX1RSQUNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPR19MRVZFTF9XQVJOCi0KLXByb3RlY3RlZCBzdGF0aWMgamF2YS50ZXh0LkRhdGVGb3JtYXQgZGF0ZUZvcm1hdHRlcgotCi1wcm90ZWN0ZWQgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZGF0ZVRpbWVGb3JtYXQKLQotcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIHNob3dEYXRlVGltZQotCi1wcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gc2hvd0xvZ05hbWUKLQotcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIHNob3dTaG9ydE5hbWUKLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuUHJvcGVydGllcyBzaW1wbGVMb2dQcm9wcwotCi1wcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgc3lzdGVtUHJlZml4Ci0KLXByb3RlY3RlZCBpbnQgY3VycmVudExvZ0xldmVsCi0KLXByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIGxvZ05hbWUKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHNob3J0TG9nTmFtZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotc3RhdGljIGphdmEubGFuZy5DbGFzc0xvYWRlciBhY2Nlc3MkMDAwKCkKLQotcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBnZXRCb29sZWFuUHJvcGVydHkoCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuKQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIgZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5pby5JbnB1dFN0cmVhbSBnZXRSZXNvdXJjZUFzU3RyZWFtKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdHJpbmdQcm9wZXJ0eSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nUHJvcGVydHkoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgZmluYWwgdm9pZCBkZWJ1ZygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIGRlYnVnKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLlRocm93YWJsZSkKLQotcHVibGljIGZpbmFsIHZvaWQgZXJyb3IoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgZmluYWwgdm9pZCBlcnJvcigKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIGZhdGFsKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGZpbmFsIHZvaWQgZmF0YWwoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1wdWJsaWMgaW50IGdldExldmVsKCkKLQotcHVibGljIGZpbmFsIHZvaWQgaW5mbygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIGluZm8oCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBpc0RlYnVnRW5hYmxlZCgpCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGlzRXJyb3JFbmFibGVkKCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gaXNGYXRhbEVuYWJsZWQoKQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBpc0luZm9FbmFibGVkKCkKLQotcHJvdGVjdGVkIGJvb2xlYW4gaXNMZXZlbEVuYWJsZWQoCi1pbnQpCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGlzVHJhY2VFbmFibGVkKCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gaXNXYXJuRW5hYmxlZCgpCi0KLXByb3RlY3RlZCB2b2lkIGxvZygKLWludAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLlRocm93YWJsZSkKLQotcHVibGljIHZvaWQgc2V0TGV2ZWwoCi1pbnQpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHRyYWNlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGZpbmFsIHZvaWQgdHJhY2UoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1wdWJsaWMgZmluYWwgdm9pZCB3YXJuKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGZpbmFsIHZvaWQgd2FybigKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLXByb3RlY3RlZCB2b2lkIHdyaXRlKAotamF2YS5sYW5nLlN0cmluZ0J1ZmZlcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi0gY2xhc3Mgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuaW1wbC5XZWFrSGFzaHRhYmxlJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLkVudW1lcmF0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLmltcGwuV2Vha0hhc2h0YWJsZSB0aGlzJDAKLQotZmluYWwgamF2YS51dGlsLkVudW1lcmF0aW9uIHZhbCRlbnVtZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5pbXBsLldlYWtIYXNodGFibGUKLWphdmEudXRpbC5FbnVtZXJhdGlvbikKLQotcHVibGljIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgbmV4dEVsZW1lbnQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjYgbmFtZSA9RW50cnkgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvY29tbW9ucy9sb2dnaW5nL2ltcGwvV2Vha0hhc2h0YWJsZTsgKQotZmluYWwgY2xhc3Mgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuaW1wbC5XZWFrSGFzaHRhYmxlJEVudHJ5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudXRpbC5NYXAkRW50cnkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuT2JqZWN0IGtleQotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5PYmplY3QgdmFsdWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdCkKLQotIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdAotb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuaW1wbC5XZWFrSGFzaHRhYmxlJDEpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldEtleSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldFZhbHVlKCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHNldFZhbHVlKAotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI2IG5hbWUgPVJlZmVyZW5jZWQgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvY29tbW9ucy9sb2dnaW5nL2ltcGwvV2Vha0hhc2h0YWJsZTsgKQotZmluYWwgY2xhc3Mgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuaW1wbC5XZWFrSGFzaHRhYmxlJFJlZmVyZW5jZWQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgaW50IGhhc2hDb2RlCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlIHJlZmVyZW5jZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLnJlZi5SZWZlcmVuY2VRdWV1ZSkKLQotIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLnJlZi5SZWZlcmVuY2VRdWV1ZQotb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuaW1wbC5XZWFrSGFzaHRhYmxlJDEpCi0KLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5PYmplY3QKLW9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLmltcGwuV2Vha0hhc2h0YWJsZSQxKQotCi1zdGF0aWMgamF2YS5sYW5nLk9iamVjdCBhY2Nlc3MkMTAwKAotb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuaW1wbC5XZWFrSGFzaHRhYmxlJFJlZmVyZW5jZWQpCi0KLXByaXZhdGUgamF2YS5sYW5nLk9iamVjdCBnZXRWYWx1ZSgpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjYgbmFtZSA9V2Vha0tleSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9jb21tb25zL2xvZ2dpbmcvaW1wbC9XZWFrSGFzaHRhYmxlOyApCi1maW5hbCBjbGFzcyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5pbXBsLldlYWtIYXNodGFibGUkV2Vha0tleSBleHRlbmRzIGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLmltcGwuV2Vha0hhc2h0YWJsZSRSZWZlcmVuY2VkIHJlZmVyZW5jZWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLnJlZi5SZWZlcmVuY2VRdWV1ZQotb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuaW1wbC5XZWFrSGFzaHRhYmxlJFJlZmVyZW5jZWQpCi0KLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5yZWYuUmVmZXJlbmNlUXVldWUKLW9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLmltcGwuV2Vha0hhc2h0YWJsZSRSZWZlcmVuY2VkCi1vcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5pbXBsLldlYWtIYXNodGFibGUkMSkKLQotc3RhdGljIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLmltcGwuV2Vha0hhc2h0YWJsZSRSZWZlcmVuY2VkIGFjY2VzcyQ0MDAoCi1vcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5pbXBsLldlYWtIYXNodGFibGUkV2Vha0tleSkKLQotcHJpdmF0ZSBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5pbXBsLldlYWtIYXNodGFibGUkUmVmZXJlbmNlZCBnZXRSZWZlcmVuY2VkKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxvcmcvYXBhY2hlL2NvbW1vbnMvbG9nZ2luZy9pbXBsL1dlYWtIYXNodGFibGUkV2Vha0tleTtMb3JnL2FwYWNoZS9jb21tb25zL2xvZ2dpbmcvaW1wbC9XZWFrSGFzaHRhYmxlJFJlZmVyZW5jZWQ7TG9yZy9hcGFjaGUvY29tbW9ucy9sb2dnaW5nL2ltcGwvV2Vha0hhc2h0YWJsZSRFbnRyeTsgKQotcHVibGljIGZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLmltcGwuV2Vha0hhc2h0YWJsZSBleHRlbmRzIGphdmEudXRpbC5IYXNodGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9DSEFOR0VTX0JFRk9SRV9QVVJHRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEFSVElBTF9QVVJHRV9DT1VOVAotCi1wcml2YXRlIGludCBjaGFuZ2VDb3VudAotCi1wcml2YXRlIGphdmEubGFuZy5yZWYuUmVmZXJlbmNlUXVldWUgcXVldWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIHZvaWQgcHVyZ2UoKQotCi1wcml2YXRlIHZvaWQgcHVyZ2VPbmUoKQotCi1wdWJsaWMgYm9vbGVhbiBjb250YWluc0tleSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBqYXZhLnV0aWwuRW51bWVyYXRpb24gZWxlbWVudHMoKQotCi1wdWJsaWMgamF2YS51dGlsLlNldCBlbnRyeVNldCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldCgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKQotCi1wdWJsaWMgamF2YS51dGlsLlNldCBrZXlTZXQoKQotCi1wdWJsaWMgamF2YS51dGlsLkVudW1lcmF0aW9uIGtleXMoKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBwdXQoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgdm9pZCBwdXRBbGwoCi1qYXZhLnV0aWwuTWFwKQotCi1wcm90ZWN0ZWQgdm9pZCByZWhhc2goKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCByZW1vdmUoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50IHNpemUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLXB1YmxpYyBqYXZhLnV0aWwuQ29sbGVjdGlvbiB2YWx1ZXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5Db25uZWN0aW9uQ2xvc2VkRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5pby5JT0V4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuQ29ubmVjdGlvblJldXNlU3RyYXRlZ3kgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4ga2VlcEFsaXZlKAotb3JnLmFwYWNoZS5odHRwLkh0dHBSZXNwb25zZQotb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBDb250ZXh0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuSGVhZGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9QYXJzZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IG9yZy5hcGFjaGUuaHR0cC5IZWFkZXJFbGVtZW50W10gZ2V0RWxlbWVudHMoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXROYW1lKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0VmFsdWUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuRm9ybWF0dGVkSGVhZGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaHR0cC5IZWFkZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLmFwYWNoZS5odHRwLnV0aWwuQ2hhckFycmF5QnVmZmVyIGdldEJ1ZmZlcigpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0VmFsdWVQb3MoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuSGVhZGVyRWxlbWVudCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXROYW1lKCkKLQotcHVibGljIGFic3RyYWN0IG9yZy5hcGFjaGUuaHR0cC5OYW1lVmFsdWVQYWlyIGdldFBhcmFtZXRlcigKLWludCkKLQotcHVibGljIGFic3RyYWN0IG9yZy5hcGFjaGUuaHR0cC5OYW1lVmFsdWVQYWlyIGdldFBhcmFtZXRlckJ5TmFtZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0UGFyYW1ldGVyQ291bnQoKQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLmFwYWNoZS5odHRwLk5hbWVWYWx1ZVBhaXJbXSBnZXRQYXJhbWV0ZXJzKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0VmFsdWUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuSGVhZGVyRWxlbWVudEl0ZXJhdG9yIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudXRpbC5JdGVyYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGhhc05leHQoKQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLmFwYWNoZS5odHRwLkhlYWRlckVsZW1lbnQgbmV4dEVsZW1lbnQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuSGVhZGVySXRlcmF0b3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLkl0ZXJhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaGFzTmV4dCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBvcmcuYXBhY2hlLmh0dHAuSGVhZGVyIG5leHRIZWFkZXIoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuSHR0cENsaWVudENvbm5lY3Rpb24gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmFwYWNoZS5odHRwLkh0dHBDb25uZWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgZmx1c2goKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1Jlc3BvbnNlQXZhaWxhYmxlKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvSHR0cEV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgcmVjZWl2ZVJlc3BvbnNlRW50aXR5KAotb3JnLmFwYWNoZS5odHRwLkh0dHBSZXNwb25zZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL0h0dHBFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlIHJlY2VpdmVSZXNwb25zZUhlYWRlcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9IdHRwRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZW5kUmVxdWVzdEVudGl0eSgKLW9yZy5hcGFjaGUuaHR0cC5IdHRwRW50aXR5RW5jbG9zaW5nUmVxdWVzdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL0h0dHBFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNlbmRSZXF1ZXN0SGVhZGVyKAotb3JnLmFwYWNoZS5odHRwLkh0dHBSZXF1ZXN0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuSHR0cENvbm5lY3Rpb25NZXRyaWNzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuT2JqZWN0IGdldE1ldHJpYygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCBsb25nIGdldFJlY2VpdmVkQnl0ZXNDb3VudCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBsb25nIGdldFJlcXVlc3RDb3VudCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBsb25nIGdldFJlc3BvbnNlQ291bnQoKQotCi1wdWJsaWMgYWJzdHJhY3QgbG9uZyBnZXRTZW50Qnl0ZXNDb3VudCgpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlc2V0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLkh0dHBNZXNzYWdlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGFkZEhlYWRlcigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGFkZEhlYWRlcigKLW9yZy5hcGFjaGUuaHR0cC5IZWFkZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGNvbnRhaW5zSGVhZGVyKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IG9yZy5hcGFjaGUuaHR0cC5IZWFkZXJbXSBnZXRBbGxIZWFkZXJzKCkKLQotcHVibGljIGFic3RyYWN0IG9yZy5hcGFjaGUuaHR0cC5IZWFkZXIgZ2V0Rmlyc3RIZWFkZXIoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLmFwYWNoZS5odHRwLkhlYWRlcltdIGdldEhlYWRlcnMoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLmFwYWNoZS5odHRwLkhlYWRlciBnZXRMYXN0SGVhZGVyKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IG9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcyBnZXRQYXJhbXMoKQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLmFwYWNoZS5odHRwLlByb3RvY29sVmVyc2lvbiBnZXRQcm90b2NvbFZlcnNpb24oKQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLmFwYWNoZS5odHRwLkhlYWRlckl0ZXJhdG9yIGhlYWRlckl0ZXJhdG9yKCkKLQotcHVibGljIGFic3RyYWN0IG9yZy5hcGFjaGUuaHR0cC5IZWFkZXJJdGVyYXRvciBoZWFkZXJJdGVyYXRvcigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlbW92ZUhlYWRlcigKLW9yZy5hcGFjaGUuaHR0cC5IZWFkZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlbW92ZUhlYWRlcnMoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRIZWFkZXIoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRIZWFkZXIoCi1vcmcuYXBhY2hlLmh0dHAuSGVhZGVyKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRIZWFkZXJzKAotb3JnLmFwYWNoZS5odHRwLkhlYWRlcltdKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRQYXJhbXMoCi1vcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5IdHRwUmVxdWVzdCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmh0dHAuSHR0cE1lc3NhZ2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLmFwYWNoZS5odHRwLlJlcXVlc3RMaW5lIGdldFJlcXVlc3RMaW5lKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLkh0dHBFbnRpdHlFbmNsb3NpbmdSZXF1ZXN0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaHR0cC5IdHRwUmVxdWVzdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGV4cGVjdENvbnRpbnVlKCkKLQotcHVibGljIGFic3RyYWN0IG9yZy5hcGFjaGUuaHR0cC5IdHRwRW50aXR5IGdldEVudGl0eSgpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEVudGl0eSgKLW9yZy5hcGFjaGUuaHR0cC5IdHRwRW50aXR5KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5IdHRwRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLkV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5IdHRwSG9zdCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmxhbmcuQ2xvbmVhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERUZBVUxUX1NDSEVNRV9OQU1FCi0KLXByb3RlY3RlZCBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGhvc3RuYW1lCi0KLXByb3RlY3RlZCBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGxjSG9zdG5hbWUKLQotcHJvdGVjdGVkIGZpbmFsIGludCBwb3J0Ci0KLXByb3RlY3RlZCBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIHNjaGVtZU5hbWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5odHRwLkh0dHBIb3N0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGNsb25lKCkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SG9zdE5hbWUoKQotCi1wdWJsaWMgaW50IGdldFBvcnQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTY2hlbWVOYW1lKCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvSG9zdFN0cmluZygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9VUkkoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlcXVlc3RGYWN0b3J5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9NZXRob2ROb3RTdXBwb3J0ZWRFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlcXVlc3QgbmV3SHR0cFJlcXVlc3QoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvTWV0aG9kTm90U3VwcG9ydGVkRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLmFwYWNoZS5odHRwLkh0dHBSZXF1ZXN0IG5ld0h0dHBSZXF1ZXN0KAotb3JnLmFwYWNoZS5odHRwLlJlcXVlc3RMaW5lKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaHR0cC5IdHRwTWVzc2FnZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBvcmcuYXBhY2hlLmh0dHAuSHR0cEVudGl0eSBnZXRFbnRpdHkoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLkxvY2FsZSBnZXRMb2NhbGUoKQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLmFwYWNoZS5odHRwLlN0YXR1c0xpbmUgZ2V0U3RhdHVzTGluZSgpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEVudGl0eSgKLW9yZy5hcGFjaGUuaHR0cC5IdHRwRW50aXR5KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRMb2NhbGUoCi1qYXZhLnV0aWwuTG9jYWxlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRSZWFzb25QaHJhc2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRTdGF0dXNDb2RlKAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRTdGF0dXNMaW5lKAotb3JnLmFwYWNoZS5odHRwLlByb3RvY29sVmVyc2lvbgotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRTdGF0dXNMaW5lKAotb3JnLmFwYWNoZS5odHRwLlByb3RvY29sVmVyc2lvbgotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRTdGF0dXNMaW5lKAotb3JnLmFwYWNoZS5odHRwLlN0YXR1c0xpbmUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5IdHRwUmVzcG9uc2VGYWN0b3J5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlIG5ld0h0dHBSZXNwb25zZSgKLW9yZy5hcGFjaGUuaHR0cC5Qcm90b2NvbFZlcnNpb24KLWludAotb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBDb250ZXh0KQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLmFwYWNoZS5odHRwLkh0dHBSZXNwb25zZSBuZXdIdHRwUmVzcG9uc2UoCi1vcmcuYXBhY2hlLmh0dHAuU3RhdHVzTGluZQotb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBDb250ZXh0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlSW50ZXJjZXB0b3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL0h0dHBFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHByb2Nlc3MoCi1vcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlCi1vcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cENvbnRleHQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5IdHRwU2VydmVyQ29ubmVjdGlvbiBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmh0dHAuSHR0cENvbm5lY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBmbHVzaCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9IdHRwRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCByZWNlaXZlUmVxdWVzdEVudGl0eSgKLW9yZy5hcGFjaGUuaHR0cC5IdHRwRW50aXR5RW5jbG9zaW5nUmVxdWVzdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL0h0dHBFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlcXVlc3QgcmVjZWl2ZVJlcXVlc3RIZWFkZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvSHR0cEV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2VuZFJlc3BvbnNlRW50aXR5KAotb3JnLmFwYWNoZS5odHRwLkh0dHBSZXNwb25zZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL0h0dHBFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNlbmRSZXNwb25zZUhlYWRlcigKLW9yZy5hcGFjaGUuaHR0cC5IdHRwUmVzcG9uc2UpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5IdHRwU3RhdHVzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19BQ0NFUFRFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19CQURfR0FURVdBWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19CQURfUkVRVUVTVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19DT05GTElDVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19DT05USU5VRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19DUkVBVEVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX0VYUEVDVEFUSU9OX0ZBSUxFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19GQUlMRURfREVQRU5ERU5DWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19GT1JCSURERU4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NfR0FURVdBWV9USU1FT1VUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX0dPTkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NfSFRUUF9WRVJTSU9OX05PVF9TVVBQT1JURUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NfSU5TVUZGSUNJRU5UX1NQQUNFX09OX1JFU09VUkNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX0lOU1VGRklDSUVOVF9TVE9SQUdFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19MRU5HVEhfUkVRVUlSRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NfTE9DS0VECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX01FVEhPRF9GQUlMVVJFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX01FVEhPRF9OT1RfQUxMT1dFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19NT1ZFRF9QRVJNQU5FTlRMWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19NT1ZFRF9URU1QT1JBUklMWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19NVUxUSVBMRV9DSE9JQ0VTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX01VTFRJX1NUQVRVUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19OT05fQVVUSE9SSVRBVElWRV9JTkZPUk1BVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19OT1RfQUNDRVBUQUJMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19OT1RfRk9VTkQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NfTk9UX0lNUExFTUVOVEVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX05PVF9NT0RJRklFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19OT19DT05URU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX09LCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX1BBUlRJQUxfQ09OVEVOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19QQVlNRU5UX1JFUVVJUkVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX1BSRUNPTkRJVElPTl9GQUlMRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NfUFJPQ0VTU0lORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19QUk9YWV9BVVRIRU5USUNBVElPTl9SRVFVSVJFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19SRVFVRVNURURfUkFOR0VfTk9UX1NBVElTRklBQkxFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX1JFUVVFU1RfVElNRU9VVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19SRVFVRVNUX1RPT19MT05HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX1JFUVVFU1RfVVJJX1RPT19MT05HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX1JFU0VUX0NPTlRFTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NfU0VFX09USEVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX1NFUlZJQ0VfVU5BVkFJTEFCTEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NfU1dJVENISU5HX1BST1RPQ09MUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19URU1QT1JBUllfUkVESVJFQ1QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NfVU5BVVRIT1JJWkVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX1VOUFJPQ0VTU0FCTEVfRU5USVRZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX1VOU1VQUE9SVEVEX01FRElBX1RZUEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NfVVNFX1BST1hZCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuUHJvdG9jb2xWZXJzaW9uIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlLCBqYXZhLmxhbmcuQ2xvbmVhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotCi1wcm90ZWN0ZWQgZmluYWwgaW50IG1ham9yCi0KLXByb3RlY3RlZCBmaW5hbCBpbnQgbWlub3IKLQotcHJvdGVjdGVkIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgcHJvdG9jb2wKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0Nsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBjbG9uZSgpCi0KLXB1YmxpYyBpbnQgY29tcGFyZVRvVmVyc2lvbigKLW9yZy5hcGFjaGUuaHR0cC5Qcm90b2NvbFZlcnNpb24pCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAuUHJvdG9jb2xWZXJzaW9uIGZvclZlcnNpb24oCi1pbnQKLWludCkKLQotcHVibGljIGZpbmFsIGludCBnZXRNYWpvcigpCi0KLXB1YmxpYyBmaW5hbCBpbnQgZ2V0TWlub3IoKQotCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBnZXRQcm90b2NvbCgpCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGdyZWF0ZXJFcXVhbHMoCi1vcmcuYXBhY2hlLmh0dHAuUHJvdG9jb2xWZXJzaW9uKQotCi1wdWJsaWMgZmluYWwgaW50IGhhc2hDb2RlKCkKLQotcHVibGljIGJvb2xlYW4gaXNDb21wYXJhYmxlKAotb3JnLmFwYWNoZS5odHRwLlByb3RvY29sVmVyc2lvbikKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gbGVzc0VxdWFscygKLW9yZy5hcGFjaGUuaHR0cC5Qcm90b2NvbFZlcnNpb24pCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuSHR0cFZlcnNpb24gZXh0ZW5kcyBvcmcuYXBhY2hlLmh0dHAuUHJvdG9jb2xWZXJzaW9uIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEhUVFAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuSHR0cFZlcnNpb24gSFRUUF8wXzkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuSHR0cFZlcnNpb24gSFRUUF8xXzAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuSHR0cFZlcnNpb24gSFRUUF8xXzEKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWludCkKLQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5Qcm90b2NvbFZlcnNpb24gZm9yVmVyc2lvbigKLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5NYWxmb3JtZWRDaHVua0NvZGluZ0V4Y2VwdGlvbiBleHRlbmRzIGphdmEuaW8uSU9FeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuTWV0aG9kTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4dGVuZHMgb3JnLmFwYWNoZS5odHRwLkh0dHBFeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlRocm93YWJsZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLk5hbWVWYWx1ZVBhaXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0TmFtZSgpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldFZhbHVlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuTm9IdHRwUmVzcG9uc2VFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmlvLklPRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLlBhcnNlRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuUHJvdG9jb2xFeGNlcHRpb24gZXh0ZW5kcyBvcmcuYXBhY2hlLmh0dHAuSHR0cEV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuUmVhc29uUGhyYXNlQ2F0YWxvZyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRSZWFzb24oCi1pbnQKLWphdmEudXRpbC5Mb2NhbGUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5SZXF1ZXN0TGluZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRNZXRob2QoKQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLmFwYWNoZS5odHRwLlByb3RvY29sVmVyc2lvbiBnZXRQcm90b2NvbFZlcnNpb24oKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRVcmkoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuU3RhdHVzTGluZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLmFwYWNoZS5odHRwLlByb3RvY29sVmVyc2lvbiBnZXRQcm90b2NvbFZlcnNpb24oKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRSZWFzb25QaHJhc2UoKQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldFN0YXR1c0NvZGUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuVG9rZW5JdGVyYXRvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuSXRlcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBoYXNOZXh0KCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgbmV4dFRva2VuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuVW5zdXBwb3J0ZWRIdHRwVmVyc2lvbkV4Y2VwdGlvbiBleHRlbmRzIG9yZy5hcGFjaGUuaHR0cC5Qcm90b2NvbEV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5hdXRoLkFVVEggZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQUk9YWV9BVVRICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQUk9YWV9BVVRIX1JFU1AKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFdXV19BVVRICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBXV1dfQVVUSF9SRVNQCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5hdXRoLkF1dGhTY2hlbWUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL2F1dGgvQXV0aGVudGljYXRpb25FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBvcmcuYXBhY2hlLmh0dHAuSGVhZGVyIGF1dGhlbnRpY2F0ZSgKLW9yZy5hcGFjaGUuaHR0cC5hdXRoLkNyZWRlbnRpYWxzCi1vcmcuYXBhY2hlLmh0dHAuSHR0cFJlcXVlc3QpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldFBhcmFtZXRlcigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldFJlYWxtKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0U2NoZW1lTmFtZSgpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzQ29tcGxldGUoKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0Nvbm5lY3Rpb25CYXNlZCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9hdXRoL01hbGZvcm1lZENoYWxsZW5nZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgcHJvY2Vzc0NoYWxsZW5nZSgKLW9yZy5hcGFjaGUuaHR0cC5IZWFkZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5hdXRoLkF1dGhTY2hlbWVGYWN0b3J5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBvcmcuYXBhY2hlLmh0dHAuYXV0aC5BdXRoU2NoZW1lIG5ld0luc3RhbmNlKAotb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5hdXRoLkF1dGhTY2hlbWVSZWdpc3RyeSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMb3JnL2FwYWNoZS9odHRwL2F1dGgvQXV0aFNjaGVtZUZhY3Rvcnk7PjsgKQotcHJpdmF0ZSBmaW5hbCBqYXZhLnV0aWwuTWFwIHJlZ2lzdGVyZWRTY2hlbWVzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsgKQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5hdXRoLkF1dGhTY2hlbWUgZ2V0QXV0aFNjaGVtZSgKLWphdmEubGFuZy5TdHJpbmcKLW9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvTGlzdDxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0U2NoZW1lTmFtZXMoKQotCi1wdWJsaWMgdm9pZCByZWdpc3RlcigKLWphdmEubGFuZy5TdHJpbmcKLW9yZy5hcGFjaGUuaHR0cC5hdXRoLkF1dGhTY2hlbWVGYWN0b3J5KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMb3JnL2FwYWNoZS9odHRwL2F1dGgvQXV0aFNjaGVtZUZhY3Rvcnk7PjspViApCi1wdWJsaWMgdm9pZCBzZXRJdGVtcygKLWphdmEudXRpbC5NYXApCi0KLXB1YmxpYyB2b2lkIHVucmVnaXN0ZXIoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5hdXRoLkF1dGhTY29wZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuYXV0aC5BdXRoU2NvcGUgQU5ZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBTllfSE9TVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTllfUE9SVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQU5ZX1JFQUxNCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBTllfU0NIRU1FCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBob3N0Ci0KLXByaXZhdGUgZmluYWwgaW50IHBvcnQKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIHJlYWxtCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBzY2hlbWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaHR0cC5hdXRoLkF1dGhTY29wZSkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SG9zdCgpCi0KLXB1YmxpYyBpbnQgZ2V0UG9ydCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFJlYWxtKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U2NoZW1lKCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLXB1YmxpYyBpbnQgbWF0Y2goCi1vcmcuYXBhY2hlLmh0dHAuYXV0aC5BdXRoU2NvcGUpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuYXV0aC5BdXRoU3RhdGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5odHRwLmF1dGguQXV0aFNjaGVtZSBhdXRoU2NoZW1lCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5odHRwLmF1dGguQXV0aFNjb3BlIGF1dGhTY29wZQotCi1wcml2YXRlIG9yZy5hcGFjaGUuaHR0cC5hdXRoLkNyZWRlbnRpYWxzIGNyZWRlbnRpYWxzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5hdXRoLkF1dGhTY2hlbWUgZ2V0QXV0aFNjaGVtZSgpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAuYXV0aC5BdXRoU2NvcGUgZ2V0QXV0aFNjb3BlKCkKLQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5hdXRoLkNyZWRlbnRpYWxzIGdldENyZWRlbnRpYWxzKCkKLQotcHVibGljIHZvaWQgaW52YWxpZGF0ZSgpCi0KLXB1YmxpYyBib29sZWFuIGlzVmFsaWQoKQotCi1wdWJsaWMgdm9pZCBzZXRBdXRoU2NoZW1lKAotb3JnLmFwYWNoZS5odHRwLmF1dGguQXV0aFNjaGVtZSkKLQotcHVibGljIHZvaWQgc2V0QXV0aFNjb3BlKAotb3JnLmFwYWNoZS5odHRwLmF1dGguQXV0aFNjb3BlKQotCi1wdWJsaWMgdm9pZCBzZXRDcmVkZW50aWFscygKLW9yZy5hcGFjaGUuaHR0cC5hdXRoLkNyZWRlbnRpYWxzKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmF1dGguQXV0aGVudGljYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBvcmcuYXBhY2hlLmh0dHAuUHJvdG9jb2xFeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlRocm93YWJsZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuYXV0aC5CYXNpY1VzZXJQcmluY2lwYWwgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5QcmluY2lwYWwKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIHVzZXJuYW1lCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TmFtZSgpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5hdXRoLkNyZWRlbnRpYWxzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldFBhc3N3b3JkKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsIGdldFVzZXJQcmluY2lwYWwoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5hdXRoLkludmFsaWRDcmVkZW50aWFsc0V4Y2VwdGlvbiBleHRlbmRzIG9yZy5hcGFjaGUuaHR0cC5hdXRoLkF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmF1dGguTWFsZm9ybWVkQ2hhbGxlbmdlRXhjZXB0aW9uIGV4dGVuZHMgb3JnLmFwYWNoZS5odHRwLlByb3RvY29sRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmF1dGguTlRDcmVkZW50aWFscyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmh0dHAuYXV0aC5DcmVkZW50aWFscwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgcGFzc3dvcmQKLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuYXV0aC5OVFVzZXJQcmluY2lwYWwgcHJpbmNpcGFsCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyB3b3Jrc3RhdGlvbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldERvbWFpbigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFBhc3N3b3JkKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VXNlck5hbWUoKQotCi1wdWJsaWMgamF2YS5zZWN1cml0eS5QcmluY2lwYWwgZ2V0VXNlclByaW5jaXBhbCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFdvcmtzdGF0aW9uKCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuYXV0aC5OVFVzZXJQcmluY2lwYWwgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5QcmluY2lwYWwKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGRvbWFpbgotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgbnRuYW1lCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyB1c2VybmFtZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldERvbWFpbigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE5hbWUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRVc2VybmFtZSgpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmF1dGguVXNlcm5hbWVQYXNzd29yZENyZWRlbnRpYWxzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaHR0cC5hdXRoLkNyZWRlbnRpYWxzCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBwYXNzd29yZAotCi1wcml2YXRlIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5hdXRoLkJhc2ljVXNlclByaW5jaXBhbCBwcmluY2lwYWwKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRQYXNzd29yZCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFVzZXJOYW1lKCkKLQotcHVibGljIGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsIGdldFVzZXJQcmluY2lwYWwoKQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuYXV0aC5wYXJhbXMuQXV0aFBOYW1lcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENSRURFTlRJQUxfQ0hBUlNFVAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwQWJzdHJhY3RQYXJhbUJlYW4gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCBmaW5hbCBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMgcGFyYW1zCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5hdXRoLnBhcmFtcy5BdXRoUGFyYW1CZWFuIGV4dGVuZHMgb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwQWJzdHJhY3RQYXJhbUJlYW4KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMpCi0KLXB1YmxpYyB2b2lkIHNldENyZWRlbnRpYWxDaGFyc2V0KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuYXV0aC5wYXJhbXMuQXV0aFBhcmFtcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldENyZWRlbnRpYWxDaGFyc2V0KAotb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgc2V0Q3JlZGVudGlhbENoYXJzZXQoCi1vcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5jbGllbnQuQXV0aGVudGljYXRpb25IYW5kbGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9hdXRoL01hbGZvcm1lZENoYWxsZW5nZUV4Y2VwdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMb3JnL2FwYWNoZS9odHRwL0h0dHBSZXNwb25zZTtMb3JnL2FwYWNoZS9odHRwL3Byb3RvY29sL0h0dHBDb250ZXh0OylMamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMb3JnL2FwYWNoZS9odHRwL0hlYWRlcjs+OyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLk1hcCBnZXRDaGFsbGVuZ2VzKAotb3JnLmFwYWNoZS5odHRwLkh0dHBSZXNwb25zZQotb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBDb250ZXh0KQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0F1dGhlbnRpY2F0aW9uUmVxdWVzdGVkKAotb3JnLmFwYWNoZS5odHRwLkh0dHBSZXNwb25zZQotb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBDb250ZXh0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvYXV0aC9BdXRoZW50aWNhdGlvbkV4Y2VwdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMb3JnL2FwYWNoZS9odHRwL0hlYWRlcjs+O0xvcmcvYXBhY2hlL2h0dHAvSHR0cFJlc3BvbnNlO0xvcmcvYXBhY2hlL2h0dHAvcHJvdG9jb2wvSHR0cENvbnRleHQ7KUxvcmcvYXBhY2hlL2h0dHAvYXV0aC9BdXRoU2NoZW1lOyApCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLmFwYWNoZS5odHRwLmF1dGguQXV0aFNjaGVtZSBzZWxlY3RTY2hlbWUoCi1qYXZhLnV0aWwuTWFwCi1vcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlCi1vcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cENvbnRleHQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5SZWRpcmVjdEV4Y2VwdGlvbiBleHRlbmRzIG9yZy5hcGFjaGUuaHR0cC5Qcm90b2NvbEV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5jbGllbnQuQ2lyY3VsYXJSZWRpcmVjdEV4Y2VwdGlvbiBleHRlbmRzIG9yZy5hcGFjaGUuaHR0cC5jbGllbnQuUmVkaXJlY3RFeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlRocm93YWJsZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuY2xpZW50LkNsaWVudFByb3RvY29sRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5pby5JT0V4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuY2xpZW50LkNvb2tpZVN0b3JlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGFkZENvb2tpZSgKLW9yZy5hcGFjaGUuaHR0cC5jb29raWUuQ29va2llKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBjbGVhcigpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGNsZWFyRXhwaXJlZCgKLWphdmEudXRpbC5EYXRlKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9MaXN0PExvcmcvYXBhY2hlL2h0dHAvY29va2llL0Nvb2tpZTs+OyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLkxpc3QgZ2V0Q29va2llcygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5jbGllbnQuQ3JlZGVudGlhbHNQcm92aWRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBjbGVhcigpCi0KLXB1YmxpYyBhYnN0cmFjdCBvcmcuYXBhY2hlLmh0dHAuYXV0aC5DcmVkZW50aWFscyBnZXRDcmVkZW50aWFscygKLW9yZy5hcGFjaGUuaHR0cC5hdXRoLkF1dGhTY29wZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0Q3JlZGVudGlhbHMoCi1vcmcuYXBhY2hlLmh0dHAuYXV0aC5BdXRoU2NvcGUKLW9yZy5hcGFjaGUuaHR0cC5hdXRoLkNyZWRlbnRpYWxzKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lkh0dHBSZXF1ZXN0UmV0cnlIYW5kbGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHJldHJ5UmVxdWVzdCgKLWphdmEuaW8uSU9FeGNlcHRpb24KLWludAotb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBDb250ZXh0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5jbGllbnQuSHR0cFJlc3BvbnNlRXhjZXB0aW9uIGV4dGVuZHMgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5DbGllbnRQcm90b2NvbEV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSBmaW5hbCBpbnQgc3RhdHVzQ29kZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGludCBnZXRTdGF0dXNDb2RlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lk5vblJlcGVhdGFibGVSZXF1ZXN0RXhjZXB0aW9uIGV4dGVuZHMgb3JnLmFwYWNoZS5odHRwLlByb3RvY29sRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5jbGllbnQuUmVkaXJlY3RIYW5kbGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9Qcm90b2NvbEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubmV0LlVSSSBnZXRMb2NhdGlvblVSSSgKLW9yZy5hcGFjaGUuaHR0cC5IdHRwUmVzcG9uc2UKLW9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwQ29udGV4dCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNSZWRpcmVjdFJlcXVlc3RlZCgKLW9yZy5hcGFjaGUuaHR0cC5IdHRwUmVzcG9uc2UKLW9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwQ29udGV4dCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5SZXF1ZXN0RGlyZWN0b3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL0h0dHBFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlIGV4ZWN1dGUoCi1vcmcuYXBhY2hlLmh0dHAuSHR0cEhvc3QKLW9yZy5hcGFjaGUuaHR0cC5IdHRwUmVxdWVzdAotb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBDb250ZXh0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvbGFuZy9PYmplY3Q7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5SZXNwb25zZUhhbmRsZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTG9yZy9hcGFjaGUvaHR0cC9IdHRwUmVzcG9uc2U7KVRUOyApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9jbGllbnQvQ2xpZW50UHJvdG9jb2xFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuT2JqZWN0IGhhbmRsZVJlc3BvbnNlKAotb3JnLmFwYWNoZS5odHRwLkh0dHBSZXNwb25zZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5Vc2VyVG9rZW5IYW5kbGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuT2JqZWN0IGdldFVzZXJUb2tlbigKLW9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwQ29udGV4dCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuZW50aXR5LlN0cmluZ0VudGl0eSBleHRlbmRzIG9yZy5hcGFjaGUuaHR0cC5lbnRpdHkuQWJzdHJhY3RIdHRwRW50aXR5IGltcGxlbWVudHMgamF2YS5sYW5nLkNsb25lYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgZmluYWwgYnl0ZVtdIGNvbnRlbnQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL1Vuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0Nsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBjbG9uZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmlvLklucHV0U3RyZWFtIGdldENvbnRlbnQoKQotCi1wdWJsaWMgbG9uZyBnZXRDb250ZW50TGVuZ3RoKCkKLQotcHVibGljIGJvb2xlYW4gaXNSZXBlYXRhYmxlKCkKLQotcHVibGljIGJvb2xlYW4gaXNTdHJlYW1pbmcoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB3cml0ZVRvKAotamF2YS5pby5PdXRwdXRTdHJlYW0pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5lbnRpdHkuVXJsRW5jb2RlZEZvcm1FbnRpdHkgZXh0ZW5kcyBvcmcuYXBhY2hlLmh0dHAuZW50aXR5LlN0cmluZ0VudGl0eQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0xpc3Q8K0xvcmcvYXBhY2hlL2h0dHAvTmFtZVZhbHVlUGFpcjs+OylWICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEudXRpbC5MaXN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0xpc3Q8K0xvcmcvYXBhY2hlL2h0dHAvTmFtZVZhbHVlUGFpcjs+O0xqYXZhL2xhbmcvU3RyaW5nOylWICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuTGlzdAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5tZXRob2RzLkFib3J0YWJsZUh0dHBSZXF1ZXN0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGFib3J0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0Q29ubmVjdGlvblJlcXVlc3QoCi1vcmcuYXBhY2hlLmh0dHAuY29ubi5DbGllbnRDb25uZWN0aW9uUmVxdWVzdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0UmVsZWFzZVRyaWdnZXIoCi1vcmcuYXBhY2hlLmh0dHAuY29ubi5Db25uZWN0aW9uUmVsZWFzZVRyaWdnZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLm1lc3NhZ2UuQWJzdHJhY3RIdHRwTWVzc2FnZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmh0dHAuSHR0cE1lc3NhZ2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIG9yZy5hcGFjaGUuaHR0cC5tZXNzYWdlLkhlYWRlckdyb3VwIGhlYWRlcmdyb3VwCi0KLXByb3RlY3RlZCBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMgcGFyYW1zCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KCkKLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zKQotCi1wdWJsaWMgdm9pZCBhZGRIZWFkZXIoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBhZGRIZWFkZXIoCi1vcmcuYXBhY2hlLmh0dHAuSGVhZGVyKQotCi1wdWJsaWMgYm9vbGVhbiBjb250YWluc0hlYWRlcigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAuSGVhZGVyW10gZ2V0QWxsSGVhZGVycygpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAuSGVhZGVyIGdldEZpcnN0SGVhZGVyKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5IZWFkZXJbXSBnZXRIZWFkZXJzKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5IZWFkZXIgZ2V0TGFzdEhlYWRlcigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMgZ2V0UGFyYW1zKCkKLQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5IZWFkZXJJdGVyYXRvciBoZWFkZXJJdGVyYXRvcigpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAuSGVhZGVySXRlcmF0b3IgaGVhZGVySXRlcmF0b3IoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCByZW1vdmVIZWFkZXIoCi1vcmcuYXBhY2hlLmh0dHAuSGVhZGVyKQotCi1wdWJsaWMgdm9pZCByZW1vdmVIZWFkZXJzKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0SGVhZGVyKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0SGVhZGVyKAotb3JnLmFwYWNoZS5odHRwLkhlYWRlcikKLQotcHVibGljIHZvaWQgc2V0SGVhZGVycygKLW9yZy5hcGFjaGUuaHR0cC5IZWFkZXJbXSkKLQotcHVibGljIHZvaWQgc2V0UGFyYW1zKAotb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuSHR0cFVyaVJlcXVlc3QgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmFwYWNoZS5odHRwLkh0dHBSZXF1ZXN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL1Vuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBhYm9ydCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldE1ldGhvZCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm5ldC5VUkkgZ2V0VVJJKCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNBYm9ydGVkKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuSHR0cFJlcXVlc3RCYXNlIGV4dGVuZHMgb3JnLmFwYWNoZS5odHRwLm1lc3NhZ2UuQWJzdHJhY3RIdHRwTWVzc2FnZSBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcy5IdHRwVXJpUmVxdWVzdCwgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5tZXRob2RzLkFib3J0YWJsZUh0dHBSZXF1ZXN0LCBqYXZhLmxhbmcuQ2xvbmVhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuTG9jayBhYm9ydExvY2sKLQotcHJpdmF0ZSBib29sZWFuIGFib3J0ZWQKLQotcHJpdmF0ZSBvcmcuYXBhY2hlLmh0dHAuY29ubi5DbGllbnRDb25uZWN0aW9uUmVxdWVzdCBjb25uUmVxdWVzdAotCi1wcml2YXRlIG9yZy5hcGFjaGUuaHR0cC5jb25uLkNvbm5lY3Rpb25SZWxlYXNlVHJpZ2dlciByZWxlYXNlVHJpZ2dlcgotCi1wcml2YXRlIGphdmEubmV0LlVSSSB1cmkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCBhYm9ydCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9DbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgY2xvbmUoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRNZXRob2QoKQotCi1wdWJsaWMgb3JnLmFwYWNoZS5odHRwLlByb3RvY29sVmVyc2lvbiBnZXRQcm90b2NvbFZlcnNpb24oKQotCi1wdWJsaWMgb3JnLmFwYWNoZS5odHRwLlJlcXVlc3RMaW5lIGdldFJlcXVlc3RMaW5lKCkKLQotcHVibGljIGphdmEubmV0LlVSSSBnZXRVUkkoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0Fib3J0ZWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uUmVxdWVzdCgKLW9yZy5hcGFjaGUuaHR0cC5jb25uLkNsaWVudENvbm5lY3Rpb25SZXF1ZXN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRSZWxlYXNlVHJpZ2dlcigKLW9yZy5hcGFjaGUuaHR0cC5jb25uLkNvbm5lY3Rpb25SZWxlYXNlVHJpZ2dlcikKLQotcHVibGljIHZvaWQgc2V0VVJJKAotamF2YS5uZXQuVVJJKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcy5IdHRwRGVsZXRlIGV4dGVuZHMgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5tZXRob2RzLkh0dHBSZXF1ZXN0QmFzZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTUVUSE9EX05BTUUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLm5ldC5VUkkpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE1ldGhvZCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5tZXRob2RzLkh0dHBFbnRpdHlFbmNsb3NpbmdSZXF1ZXN0QmFzZSBleHRlbmRzIG9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcy5IdHRwUmVxdWVzdEJhc2UgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmh0dHAuSHR0cEVudGl0eUVuY2xvc2luZ1JlcXVlc3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBvcmcuYXBhY2hlLmh0dHAuSHR0cEVudGl0eSBlbnRpdHkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGNsb25lKCkKLQotcHVibGljIGJvb2xlYW4gZXhwZWN0Q29udGludWUoKQotCi1wdWJsaWMgb3JnLmFwYWNoZS5odHRwLkh0dHBFbnRpdHkgZ2V0RW50aXR5KCkKLQotcHVibGljIHZvaWQgc2V0RW50aXR5KAotb3JnLmFwYWNoZS5odHRwLkh0dHBFbnRpdHkpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5tZXRob2RzLkh0dHBHZXQgZXh0ZW5kcyBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuSHR0cFJlcXVlc3RCYXNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBNRVRIT0RfTkFNRQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubmV0LlVSSSkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TWV0aG9kKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuSHR0cEhlYWQgZXh0ZW5kcyBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuSHR0cFJlcXVlc3RCYXNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBNRVRIT0RfTkFNRQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubmV0LlVSSSkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TWV0aG9kKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuSHR0cE9wdGlvbnMgZXh0ZW5kcyBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuSHR0cFJlcXVlc3RCYXNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBNRVRIT0RfTkFNRQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubmV0LlVSSSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTG9yZy9hcGFjaGUvaHR0cC9IdHRwUmVzcG9uc2U7KUxqYXZhL3V0aWwvU2V0PExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuU2V0IGdldEFsbG93ZWRNZXRob2RzKAotb3JnLmFwYWNoZS5odHRwLkh0dHBSZXNwb25zZSkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TWV0aG9kKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuSHR0cFBvc3QgZXh0ZW5kcyBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuSHR0cEVudGl0eUVuY2xvc2luZ1JlcXVlc3RCYXNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBNRVRIT0RfTkFNRQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubmV0LlVSSSkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TWV0aG9kKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuSHR0cFB1dCBleHRlbmRzIG9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcy5IdHRwRW50aXR5RW5jbG9zaW5nUmVxdWVzdEJhc2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1FVEhPRF9OQU1FCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5uZXQuVVJJKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRNZXRob2QoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcy5IdHRwVHJhY2UgZXh0ZW5kcyBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuSHR0cFJlcXVlc3RCYXNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBNRVRIT0RfTkFNRQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubmV0LlVSSSkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TWV0aG9kKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5Db3JlQ29ubmVjdGlvblBOYW1lcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENPTk5FQ1RJT05fVElNRU9VVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTUFYX0hFQURFUl9DT1VOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTUFYX0xJTkVfTEVOR1RICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTT0NLRVRfQlVGRkVSX1NJWkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNPX0xJTkdFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU09fVElNRU9VVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU1RBTEVfQ09OTkVDVElPTl9DSEVDSwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVENQX05PREVMQVkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkNvcmVQcm90b2NvbFBOYW1lcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEhUVFBfQ09OVEVOVF9DSEFSU0VUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBIVFRQX0VMRU1FTlRfQ0hBUlNFVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgT1JJR0lOX1NFUlZFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUFJPVE9DT0xfVkVSU0lPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU1RSSUNUX1RSQU5TRkVSX0VOQ09ESU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBVU0VSX0FHRU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBVU0VfRVhQRUNUX0NPTlRJTlVFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBXQUlUX0ZPUl9DT05USU5VRQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5jbGllbnQucGFyYW1zLkNsaWVudFBOYW1lcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFMTE9XX0NJUkNVTEFSX1JFRElSRUNUUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ09OTkVDVElPTl9NQU5BR0VSX0ZBQ1RPUlkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENPTk5FQ1RJT05fTUFOQUdFUl9GQUNUT1JZX0NMQVNTX05BTUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENPT0tJRV9QT0xJQ1kKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFRkFVTFRfSEVBREVSUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVGQVVMVF9IT1NUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBIQU5ETEVfQVVUSEVOVElDQVRJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEhBTkRMRV9SRURJUkVDVFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1BWF9SRURJUkVDVFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFJFSkVDVF9SRUxBVElWRV9SRURJUkVDVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVklSVFVBTF9IT1NUCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5wYXJhbXMuQ29va2llU3BlY1BOYW1lcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERBVEVfUEFUVEVSTlMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNJTkdMRV9DT09LSUVfSEVBREVSCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmNvbm4ucGFyYW1zLkNvbm5Db25uZWN0aW9uUE5hbWVzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTUFYX1NUQVRVU19MSU5FX0dBUkJBR0UKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuY29ubi5wYXJhbXMuQ29ubk1hbmFnZXJQTmFtZXMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBNQVhfQ09OTkVDVElPTlNfUEVSX1JPVVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBNQVhfVE9UQUxfQ09OTkVDVElPTlMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRJTUVPVVQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuY29ubi5wYXJhbXMuQ29ublJvdXRlUE5hbWVzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVGQVVMVF9QUk9YWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRk9SQ0VEX1JPVVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMT0NBTF9BRERSRVNTCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5wYXJhbXMuQWxsQ2xpZW50UE5hbWVzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuQ29yZUNvbm5lY3Rpb25QTmFtZXMsIG9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuQ29yZVByb3RvY29sUE5hbWVzLCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50LnBhcmFtcy5DbGllbnRQTmFtZXMsIG9yZy5hcGFjaGUuaHR0cC5hdXRoLnBhcmFtcy5BdXRoUE5hbWVzLCBvcmcuYXBhY2hlLmh0dHAuY29va2llLnBhcmFtcy5Db29raWVTcGVjUE5hbWVzLCBvcmcuYXBhY2hlLmh0dHAuY29ubi5wYXJhbXMuQ29ubkNvbm5lY3Rpb25QTmFtZXMsIG9yZy5hcGFjaGUuaHR0cC5jb25uLnBhcmFtcy5Db25uTWFuYWdlclBOYW1lcywgb3JnLmFwYWNoZS5odHRwLmNvbm4ucGFyYW1zLkNvbm5Sb3V0ZVBOYW1lcwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5wYXJhbXMuQXV0aFBvbGljeSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEJBU0lDCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBESUdFU1QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE5UTE0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuY2xpZW50LnBhcmFtcy5DbGllbnRQYXJhbUJlYW4gZXh0ZW5kcyBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBBYnN0cmFjdFBhcmFtQmVhbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcykKLQotcHVibGljIHZvaWQgc2V0QWxsb3dDaXJjdWxhclJlZGlyZWN0cygKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldENvbm5lY3Rpb25NYW5hZ2VyRmFjdG9yeSgKLW9yZy5hcGFjaGUuaHR0cC5jb25uLkNsaWVudENvbm5lY3Rpb25NYW5hZ2VyRmFjdG9yeSkKLQotcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvbk1hbmFnZXJGYWN0b3J5Q2xhc3NOYW1lKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0Q29va2llUG9saWN5KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9Db2xsZWN0aW9uPExvcmcvYXBhY2hlL2h0dHAvSGVhZGVyOz47KVYgKQotcHVibGljIHZvaWQgc2V0RGVmYXVsdEhlYWRlcnMoCi1qYXZhLnV0aWwuQ29sbGVjdGlvbikKLQotcHVibGljIHZvaWQgc2V0RGVmYXVsdEhvc3QoCi1vcmcuYXBhY2hlLmh0dHAuSHR0cEhvc3QpCi0KLXB1YmxpYyB2b2lkIHNldEhhbmRsZUF1dGhlbnRpY2F0aW9uKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0SGFuZGxlUmVkaXJlY3RzKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0TWF4UmVkaXJlY3RzKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRSZWplY3RSZWxhdGl2ZVJlZGlyZWN0KAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0VmlydHVhbEhvc3QoCi1vcmcuYXBhY2hlLmh0dHAuSHR0cEhvc3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5wYXJhbXMuQ29va2llUG9saWN5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQkVTVF9NQVRDSAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQlJPV1NFUl9DT01QQVRJQklMSVRZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBORVRTQ0FQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUkZDXzIxMDkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFJGQ18yOTY1Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5wYXJhbXMuSHR0cENsaWVudFBhcmFtcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldENvb2tpZVBvbGljeSgKLW9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcykKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzQXV0aGVudGljYXRpbmcoCi1vcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlZGlyZWN0aW5nKAotb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgc2V0QXV0aGVudGljYXRpbmcoCi1vcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMKLWJvb2xlYW4pCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDb29raWVQb2xpY3koCi1vcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRSZWRpcmVjdGluZygKLW9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcwotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5wcm90b2NvbC5DbGllbnRDb250ZXh0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQVVUSFNDSEVNRV9SRUdJU1RSWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQVVUSF9TQ0hFTUVfUFJFRgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ09PS0lFU1BFQ19SRUdJU1RSWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ09PS0lFX09SSUdJTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ09PS0lFX1NQRUMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENPT0tJRV9TVE9SRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ1JFRFNfUFJPVklERVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBST1hZX0FVVEhfU1RBVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRBUkdFVF9BVVRIX1NUQVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBVU0VSX1RPS0VOCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuY2xpZW50LnByb3RvY29sLkNsaWVudENvbnRleHRDb25maWd1cmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaHR0cC5jbGllbnQucHJvdG9jb2wuQ2xpZW50Q29udGV4dAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwQ29udGV4dCBjb250ZXh0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBDb250ZXh0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0xpc3Q8TGphdmEvbGFuZy9TdHJpbmc7PjspViApCi1wdWJsaWMgdm9pZCBzZXRBdXRoU2NoZW1lUHJlZigKLWphdmEudXRpbC5MaXN0KQotCi1wdWJsaWMgdm9pZCBzZXRBdXRoU2NoZW1lUmVnaXN0cnkoCi1vcmcuYXBhY2hlLmh0dHAuYXV0aC5BdXRoU2NoZW1lUmVnaXN0cnkpCi0KLXB1YmxpYyB2b2lkIHNldENvb2tpZVNwZWNSZWdpc3RyeSgKLW9yZy5hcGFjaGUuaHR0cC5jb29raWUuQ29va2llU3BlY1JlZ2lzdHJ5KQotCi1wdWJsaWMgdm9pZCBzZXRDb29raWVTdG9yZSgKLW9yZy5hcGFjaGUuaHR0cC5jbGllbnQuQ29va2llU3RvcmUpCi0KLXB1YmxpYyB2b2lkIHNldENyZWRlbnRpYWxzUHJvdmlkZXIoCi1vcmcuYXBhY2hlLmh0dHAuY2xpZW50LkNyZWRlbnRpYWxzUHJvdmlkZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5wcm90b2NvbC5SZXF1ZXN0QWRkQ29va2llcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlcXVlc3RJbnRlcmNlcHRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBsb2cKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvSHR0cEV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcHJvY2VzcygKLW9yZy5hcGFjaGUuaHR0cC5IdHRwUmVxdWVzdAotb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBDb250ZXh0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5jbGllbnQucHJvdG9jb2wuUmVxdWVzdERlZmF1bHRIZWFkZXJzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaHR0cC5IdHRwUmVxdWVzdEludGVyY2VwdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL0h0dHBFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHByb2Nlc3MoCi1vcmcuYXBhY2hlLmh0dHAuSHR0cFJlcXVlc3QKLW9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwQ29udGV4dCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuY2xpZW50LnByb3RvY29sLlJlcXVlc3RQcm94eUF1dGhlbnRpY2F0aW9uIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaHR0cC5IdHRwUmVxdWVzdEludGVyY2VwdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9IdHRwRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBwcm9jZXNzKAotb3JnLmFwYWNoZS5odHRwLkh0dHBSZXF1ZXN0Ci1vcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cENvbnRleHQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5wcm90b2NvbC5SZXF1ZXN0VGFyZ2V0QXV0aGVudGljYXRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmFwYWNoZS5odHRwLkh0dHBSZXF1ZXN0SW50ZXJjZXB0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgbG9nCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL0h0dHBFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHByb2Nlc3MoCi1vcmcuYXBhY2hlLmh0dHAuSHR0cFJlcXVlc3QKLW9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwQ29udGV4dCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuY2xpZW50LnByb3RvY29sLlJlc3BvbnNlUHJvY2Vzc0Nvb2tpZXMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmFwYWNoZS5odHRwLkh0dHBSZXNwb25zZUludGVyY2VwdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgdm9pZCBwcm9jZXNzQ29va2llcygKLW9yZy5hcGFjaGUuaHR0cC5IZWFkZXJJdGVyYXRvcgotb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5Db29raWVTcGVjCi1vcmcuYXBhY2hlLmh0dHAuY29va2llLkNvb2tpZU9yaWdpbgotb3JnLmFwYWNoZS5odHRwLmNsaWVudC5Db29raWVTdG9yZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL0h0dHBFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHByb2Nlc3MoCi1vcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlCi1vcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cENvbnRleHQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmNsaWVudC51dGlscy5DbG9uZVV0aWxzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLk9iamVjdCBjbG9uZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmNsaWVudC51dGlscy5VUklVdGlscyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvVVJJU3ludGF4RXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGphdmEubmV0LlVSSSBjcmVhdGVVUkkoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5uZXQuVVJJIHJlc29sdmUoCi1qYXZhLm5ldC5VUkkKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5uZXQuVVJJIHJlc29sdmUoCi1qYXZhLm5ldC5VUkkKLWphdmEubmV0LlVSSSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvVVJJU3ludGF4RXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGphdmEubmV0LlVSSSByZXdyaXRlVVJJKAotamF2YS5uZXQuVVJJCi1vcmcuYXBhY2hlLmh0dHAuSHR0cEhvc3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1VSSVN5bnRheEV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBqYXZhLm5ldC5VUkkgcmV3cml0ZVVSSSgKLWphdmEubmV0LlVSSQotb3JnLmFwYWNoZS5odHRwLkh0dHBIb3N0Ci1ib29sZWFuKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5jbGllbnQudXRpbHMuVVJMRW5jb2RlZFV0aWxzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ09OVEVOVF9UWVBFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTkFNRV9WQUxVRV9TRVBBUkFUT1IKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQQVJBTUVURVJfU0VQQVJBVE9SCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBkZWNvZGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGVuY29kZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTGlzdDwrTG9yZy9hcGFjaGUvaHR0cC9OYW1lVmFsdWVQYWlyOz47TGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOyApCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZm9ybWF0KAotamF2YS51dGlsLkxpc3QKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0VuY29kZWQoCi1vcmcuYXBhY2hlLmh0dHAuSHR0cEVudGl0eSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbmV0L1VSSTtMamF2YS9sYW5nL1N0cmluZzspTGphdmEvdXRpbC9MaXN0PExvcmcvYXBhY2hlL2h0dHAvTmFtZVZhbHVlUGFpcjs+OyApCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5MaXN0IHBhcnNlKAotamF2YS5uZXQuVVJJCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExvcmcvYXBhY2hlL2h0dHAvSHR0cEVudGl0eTspTGphdmEvdXRpbC9MaXN0PExvcmcvYXBhY2hlL2h0dHAvTmFtZVZhbHVlUGFpcjs+OyApCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5MaXN0IHBhcnNlKAotb3JnLmFwYWNoZS5odHRwLkh0dHBFbnRpdHkpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTGlzdDxMb3JnL2FwYWNoZS9odHRwL05hbWVWYWx1ZVBhaXI7PjtMamF2YS91dGlsL1NjYW5uZXI7TGphdmEvbGFuZy9TdHJpbmc7KVYgKQotcHVibGljIHN0YXRpYyB2b2lkIHBhcnNlKAotamF2YS51dGlsLkxpc3QKLWphdmEudXRpbC5TY2FubmVyCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuY29ubi5Fb2ZTZW5zb3JXYXRjaGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGVvZkRldGVjdGVkKAotamF2YS5pby5JbnB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gc3RyZWFtQWJvcnQoCi1qYXZhLmlvLklucHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzdHJlYW1DbG9zZWQoCi1qYXZhLmlvLklucHV0U3RyZWFtKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5jb25uLkJhc2ljRW9mU2Vuc29yV2F0Y2hlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmh0dHAuY29ubi5Fb2ZTZW5zb3JXYXRjaGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCBib29sZWFuIGF0dGVtcHRSZXVzZQotCi1wcm90ZWN0ZWQgb3JnLmFwYWNoZS5odHRwLmNvbm4uTWFuYWdlZENsaWVudENvbm5lY3Rpb24gbWFuYWdlZENvbm4KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmh0dHAuY29ubi5NYW5hZ2VkQ2xpZW50Q29ubmVjdGlvbgotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gZW9mRGV0ZWN0ZWQoCi1qYXZhLmlvLklucHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBzdHJlYW1BYm9ydCgKLWphdmEuaW8uSW5wdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIHN0cmVhbUNsb3NlZCgKLWphdmEuaW8uSW5wdXRTdHJlYW0pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmVudGl0eS5IdHRwRW50aXR5V3JhcHBlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmh0dHAuSHR0cEVudGl0eQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgb3JnLmFwYWNoZS5odHRwLkh0dHBFbnRpdHkgd3JhcHBlZEVudGl0eQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaHR0cC5IdHRwRW50aXR5KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjb25zdW1lQ29udGVudCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmlvLklucHV0U3RyZWFtIGdldENvbnRlbnQoKQotCi1wdWJsaWMgb3JnLmFwYWNoZS5odHRwLkhlYWRlciBnZXRDb250ZW50RW5jb2RpbmcoKQotCi1wdWJsaWMgbG9uZyBnZXRDb250ZW50TGVuZ3RoKCkKLQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5IZWFkZXIgZ2V0Q29udGVudFR5cGUoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0NodW5rZWQoKQotCi1wdWJsaWMgYm9vbGVhbiBpc1JlcGVhdGFibGUoKQotCi1wdWJsaWMgYm9vbGVhbiBpc1N0cmVhbWluZygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHdyaXRlVG8oCi1qYXZhLmlvLk91dHB1dFN0cmVhbSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmNvbm4uQ29ubmVjdGlvblJlbGVhc2VUcmlnZ2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGFib3J0Q29ubmVjdGlvbigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlbGVhc2VDb25uZWN0aW9uKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuY29ubi5CYXNpY01hbmFnZWRFbnRpdHkgZXh0ZW5kcyBvcmcuYXBhY2hlLmh0dHAuZW50aXR5Lkh0dHBFbnRpdHlXcmFwcGVyIGltcGxlbWVudHMgb3JnLmFwYWNoZS5odHRwLmNvbm4uQ29ubmVjdGlvblJlbGVhc2VUcmlnZ2VyLCBvcmcuYXBhY2hlLmh0dHAuY29ubi5Fb2ZTZW5zb3JXYXRjaGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGF0dGVtcHRSZXVzZQotCi1wcm90ZWN0ZWQgb3JnLmFwYWNoZS5odHRwLmNvbm4uTWFuYWdlZENsaWVudENvbm5lY3Rpb24gbWFuYWdlZENvbm4KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmh0dHAuSHR0cEVudGl0eQotb3JnLmFwYWNoZS5odHRwLmNvbm4uTWFuYWdlZENsaWVudENvbm5lY3Rpb24KLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGFib3J0Q29ubmVjdGlvbigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNvbnN1bWVDb250ZW50KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gZW9mRGV0ZWN0ZWQoCi1qYXZhLmlvLklucHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5pby5JbnB1dFN0cmVhbSBnZXRDb250ZW50KCkKLQotcHVibGljIGJvb2xlYW4gaXNSZXBlYXRhYmxlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcmVsZWFzZUNvbm5lY3Rpb24oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCByZWxlYXNlTWFuYWdlZENvbm5lY3Rpb24oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBzdHJlYW1BYm9ydCgKLWphdmEuaW8uSW5wdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIHN0cmVhbUNsb3NlZCgKLWphdmEuaW8uSW5wdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHdyaXRlVG8oCi1qYXZhLmlvLk91dHB1dFN0cmVhbSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmNvbm4uQ2xpZW50Q29ubmVjdGlvbk1hbmFnZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgY2xvc2VFeHBpcmVkQ29ubmVjdGlvbnMoKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBjbG9zZUlkbGVDb25uZWN0aW9ucygKLWxvbmcKLWphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0KQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLmFwYWNoZS5odHRwLmNvbm4uc2NoZW1lLlNjaGVtZVJlZ2lzdHJ5IGdldFNjaGVtZVJlZ2lzdHJ5KCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgcmVsZWFzZUNvbm5lY3Rpb24oCi1vcmcuYXBhY2hlLmh0dHAuY29ubi5NYW5hZ2VkQ2xpZW50Q29ubmVjdGlvbgotbG9uZwotamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQpCi0KLXB1YmxpYyBhYnN0cmFjdCBvcmcuYXBhY2hlLmh0dHAuY29ubi5DbGllbnRDb25uZWN0aW9uUmVxdWVzdCByZXF1ZXN0Q29ubmVjdGlvbigKLW9yZy5hcGFjaGUuaHR0cC5jb25uLnJvdXRpbmcuSHR0cFJvdXRlCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzaHV0ZG93bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5jb25uLkNsaWVudENvbm5lY3Rpb25NYW5hZ2VyRmFjdG9yeSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLmFwYWNoZS5odHRwLmNvbm4uQ2xpZW50Q29ubmVjdGlvbk1hbmFnZXIgbmV3SW5zdGFuY2UoCi1vcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMKLW9yZy5hcGFjaGUuaHR0cC5jb25uLnNjaGVtZS5TY2hlbWVSZWdpc3RyeSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmNvbm4uQ2xpZW50Q29ubmVjdGlvbk9wZXJhdG9yIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBvcmcuYXBhY2hlLmh0dHAuY29ubi5PcGVyYXRlZENsaWVudENvbm5lY3Rpb24gY3JlYXRlQ29ubmVjdGlvbigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9wZW5Db25uZWN0aW9uKAotb3JnLmFwYWNoZS5odHRwLmNvbm4uT3BlcmF0ZWRDbGllbnRDb25uZWN0aW9uCi1vcmcuYXBhY2hlLmh0dHAuSHR0cEhvc3QKLWphdmEubmV0LkluZXRBZGRyZXNzCi1vcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cENvbnRleHQKLW9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgdXBkYXRlU2VjdXJlQ29ubmVjdGlvbigKLW9yZy5hcGFjaGUuaHR0cC5jb25uLk9wZXJhdGVkQ2xpZW50Q29ubmVjdGlvbgotb3JnLmFwYWNoZS5odHRwLkh0dHBIb3N0Ci1vcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cENvbnRleHQKLW9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmNvbm4uQ2xpZW50Q29ubmVjdGlvblJlcXVlc3QgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgYWJvcnRSZXF1ZXN0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0ludGVycnVwdGVkRXhjZXB0aW9uO0xvcmcvYXBhY2hlL2h0dHAvY29ubi9Db25uZWN0aW9uUG9vbFRpbWVvdXRFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBvcmcuYXBhY2hlLmh0dHAuY29ubi5NYW5hZ2VkQ2xpZW50Q29ubmVjdGlvbiBnZXRDb25uZWN0aW9uKAotbG9uZwotamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmNvbm4uQ29ubmVjdFRpbWVvdXRFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmlvLkludGVycnVwdGVkSU9FeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmNvbm4uQ29ubmVjdGlvbktlZXBBbGl2ZVN0cmF0ZWd5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBsb25nIGdldEtlZXBBbGl2ZUR1cmF0aW9uKAotb3JnLmFwYWNoZS5odHRwLkh0dHBSZXNwb25zZQotb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBDb250ZXh0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5jb25uLkNvbm5lY3Rpb25Qb29sVGltZW91dEV4Y2VwdGlvbiBleHRlbmRzIG9yZy5hcGFjaGUuaHR0cC5jb25uLkNvbm5lY3RUaW1lb3V0RXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmNvbm4uRW9mU2Vuc29ySW5wdXRTdHJlYW0gZXh0ZW5kcyBqYXZhLmlvLklucHV0U3RyZWFtIGltcGxlbWVudHMgb3JnLmFwYWNoZS5odHRwLmNvbm4uQ29ubmVjdGlvblJlbGVhc2VUcmlnZ2VyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5odHRwLmNvbm4uRW9mU2Vuc29yV2F0Y2hlciBlb2ZXYXRjaGVyCi0KLXByaXZhdGUgYm9vbGVhbiBzZWxmQ2xvc2VkCi0KLXByb3RlY3RlZCBqYXZhLmlvLklucHV0U3RyZWFtIHdyYXBwZWRTdHJlYW0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmlvLklucHV0U3RyZWFtCi1vcmcuYXBhY2hlLmh0dHAuY29ubi5Fb2ZTZW5zb3JXYXRjaGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBhYm9ydENvbm5lY3Rpb24oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGF2YWlsYWJsZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIGNoZWNrQWJvcnQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBjaGVja0Nsb3NlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgY2hlY2tFT0YoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNsb3NlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGJvb2xlYW4gaXNSZWFkQWxsb3dlZCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcmVhZCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcmVhZCgKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCByZWFkKAotYnl0ZVtdCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcmVsZWFzZUNvbm5lY3Rpb24oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5jb25uLkh0dHBIb3N0Q29ubmVjdEV4Y2VwdGlvbiBleHRlbmRzIGphdmEubmV0LkNvbm5lY3RFeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0KLXByaXZhdGUgZmluYWwgb3JnLmFwYWNoZS5odHRwLkh0dHBIb3N0IGhvc3QKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmh0dHAuSHR0cEhvc3QKLWphdmEubmV0LkNvbm5lY3RFeGNlcHRpb24pCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAuSHR0cEhvc3QgZ2V0SG9zdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5jb25uLk1hbmFnZWRDbGllbnRDb25uZWN0aW9uIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaHR0cC5IdHRwQ2xpZW50Q29ubmVjdGlvbiwgb3JnLmFwYWNoZS5odHRwLkh0dHBJbmV0Q29ubmVjdGlvbiwgb3JnLmFwYWNoZS5odHRwLmNvbm4uQ29ubmVjdGlvblJlbGVhc2VUcmlnZ2VyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IG9yZy5hcGFjaGUuaHR0cC5jb25uLnJvdXRpbmcuSHR0cFJvdXRlIGdldFJvdXRlKCkKLQotcHVibGljIGFic3RyYWN0IGphdmF4Lm5ldC5zc2wuU1NMU2Vzc2lvbiBnZXRTU0xTZXNzaW9uKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5PYmplY3QgZ2V0U3RhdGUoKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc01hcmtlZFJldXNhYmxlKCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNTZWN1cmUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBsYXllclByb3RvY29sKAotb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBDb250ZXh0Ci1vcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG1hcmtSZXVzYWJsZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9wZW4oCi1vcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLkh0dHBSb3V0ZQotb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBDb250ZXh0Ci1vcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldElkbGVEdXJhdGlvbigKLWxvbmcKLWphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRTdGF0ZSgKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHR1bm5lbFByb3h5KAotb3JnLmFwYWNoZS5odHRwLkh0dHBIb3N0Ci1ib29sZWFuCi1vcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHR1bm5lbFRhcmdldCgKLWJvb2xlYW4KLW9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcykKLQotcHVibGljIGFic3RyYWN0IHZvaWQgdW5tYXJrUmV1c2FibGUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuY29ubi5zY2hlbWUuU29ja2V0RmFjdG9yeSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL25ldC9Vbmtub3duSG9zdEV4Y2VwdGlvbjtMb3JnL2FwYWNoZS9odHRwL2Nvbm4vQ29ubmVjdFRpbWVvdXRFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm5ldC5Tb2NrZXQgY29ubmVjdFNvY2tldCgKLWphdmEubmV0LlNvY2tldAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1qYXZhLm5ldC5JbmV0QWRkcmVzcwotaW50Ci1vcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm5ldC5Tb2NrZXQgY3JlYXRlU29ja2V0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNTZWN1cmUoCi1qYXZhLm5ldC5Tb2NrZXQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmNvbm4uTXVsdGlob21lUGxhaW5Tb2NrZXRGYWN0b3J5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaHR0cC5jb25uLnNjaGVtZS5Tb2NrZXRGYWN0b3J5Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5jb25uLk11bHRpaG9tZVBsYWluU29ja2V0RmFjdG9yeSBERUZBVUxUX0ZBQ1RPUlkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUuaHR0cC5jb25uLk11bHRpaG9tZVBsYWluU29ja2V0RmFjdG9yeSBnZXRTb2NrZXRGYWN0b3J5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubmV0LlNvY2tldCBjb25uZWN0U29ja2V0KAotamF2YS5uZXQuU29ja2V0Ci1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWphdmEubmV0LkluZXRBZGRyZXNzCi1pbnQKLW9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcykKLQotcHVibGljIGphdmEubmV0LlNvY2tldCBjcmVhdGVTb2NrZXQoKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIGJvb2xlYW4gaXNTZWN1cmUoCi1qYXZhLm5ldC5Tb2NrZXQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5jb25uLk9wZXJhdGVkQ2xpZW50Q29ubmVjdGlvbiBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmh0dHAuSHR0cENsaWVudENvbm5lY3Rpb24sIG9yZy5hcGFjaGUuaHR0cC5IdHRwSW5ldENvbm5lY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5uZXQuU29ja2V0IGdldFNvY2tldCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBvcmcuYXBhY2hlLmh0dHAuSHR0cEhvc3QgZ2V0VGFyZ2V0SG9zdCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzU2VjdXJlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgb3BlbkNvbXBsZXRlZCgKLWJvb2xlYW4KLW9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgb3BlbmluZygKLWphdmEubmV0LlNvY2tldAotb3JnLmFwYWNoZS5odHRwLkh0dHBIb3N0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB1cGRhdGUoCi1qYXZhLm5ldC5Tb2NrZXQKLW9yZy5hcGFjaGUuaHR0cC5IdHRwSG9zdAotYm9vbGVhbgotb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5jb25uLnBhcmFtcy5Db25uQ29ubmVjdGlvblBhcmFtQmVhbiBleHRlbmRzIG9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cEFic3RyYWN0UGFyYW1CZWFuCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zKQotCi1wdWJsaWMgdm9pZCBzZXRNYXhTdGF0dXNMaW5lR2FyYmFnZSgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuY29ubi5wYXJhbXMuQ29ubk1hbmFnZXJQYXJhbUJlYW4gZXh0ZW5kcyBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBBYnN0cmFjdFBhcmFtQmVhbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcykKLQotcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvbnNQZXJSb3V0ZSgKLW9yZy5hcGFjaGUuaHR0cC5jb25uLnBhcmFtcy5Db25uUGVyUm91dGVCZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRNYXhUb3RhbENvbm5lY3Rpb25zKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRUaW1lb3V0KAotbG9uZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmNvbm4ucGFyYW1zLkNvbm5QZXJSb3V0ZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldE1heEZvclJvdXRlKAotb3JnLmFwYWNoZS5odHRwLmNvbm4ucm91dGluZy5IdHRwUm91dGUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9jb25uL3BhcmFtcy9Db25uTWFuYWdlclBhcmFtczsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotZmluYWwgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmNvbm4ucGFyYW1zLkNvbm5NYW5hZ2VyUGFyYW1zJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmFwYWNoZS5odHRwLmNvbm4ucGFyYW1zLkNvbm5QZXJSb3V0ZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBpbnQgZ2V0TWF4Rm9yUm91dGUoCi1vcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLkh0dHBSb3V0ZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuY29ubi5wYXJhbXMuQ29ubk1hbmFnZXJQYXJhbXMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmFwYWNoZS5odHRwLmNvbm4ucGFyYW1zLkNvbm5NYW5hZ2VyUE5hbWVzCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5jb25uLnBhcmFtcy5Db25uUGVyUm91dGUgREVGQVVMVF9DT05OX1BFUl9ST1VURQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX01BWF9UT1RBTF9DT05ORUNUSU9OUwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLmh0dHAuY29ubi5wYXJhbXMuQ29ublBlclJvdXRlIGdldE1heENvbm5lY3Rpb25zUGVyUm91dGUoCi1vcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMpCi0KLXB1YmxpYyBzdGF0aWMgaW50IGdldE1heFRvdGFsQ29ubmVjdGlvbnMoCi1vcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMpCi0KLXB1YmxpYyBzdGF0aWMgbG9uZyBnZXRUaW1lb3V0KAotb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgc2V0TWF4Q29ubmVjdGlvbnNQZXJSb3V0ZSgKLW9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcwotb3JnLmFwYWNoZS5odHRwLmNvbm4ucGFyYW1zLkNvbm5QZXJSb3V0ZSkKLQotcHVibGljIHN0YXRpYyB2b2lkIHNldE1heFRvdGFsQ29ubmVjdGlvbnMoCi1vcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMKLWludCkKLQotcHVibGljIHN0YXRpYyB2b2lkIHNldFRpbWVvdXQoCi1vcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMKLWxvbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmNvbm4ucGFyYW1zLkNvbm5QZXJSb3V0ZUJlYW4gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmFwYWNoZS5odHRwLmNvbm4ucGFyYW1zLkNvbm5QZXJSb3V0ZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX01BWF9DT05ORUNUSU9OU19QRVJfUk9VVEUKLQotcHJpdmF0ZSBpbnQgZGVmYXVsdE1heAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvTWFwPExvcmcvYXBhY2hlL2h0dHAvY29ubi9yb3V0aW5nL0h0dHBSb3V0ZTtMamF2YS9sYW5nL0ludGVnZXI7PjsgKQotcHJpdmF0ZSBmaW5hbCBqYXZhLnV0aWwuTWFwIG1heFBlckhvc3RNYXAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0RGVmYXVsdE1heCgpCi0KLXB1YmxpYyBpbnQgZ2V0TWF4Rm9yUm91dGUoCi1vcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLkh0dHBSb3V0ZSkKLQotcHVibGljIHZvaWQgc2V0RGVmYXVsdE1heFBlclJvdXRlKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRNYXhGb3JSb3V0ZSgKLW9yZy5hcGFjaGUuaHR0cC5jb25uLnJvdXRpbmcuSHR0cFJvdXRlCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTWFwPExvcmcvYXBhY2hlL2h0dHAvY29ubi9yb3V0aW5nL0h0dHBSb3V0ZTtMamF2YS9sYW5nL0ludGVnZXI7PjspViApCi1wdWJsaWMgdm9pZCBzZXRNYXhGb3JSb3V0ZXMoCi1qYXZhLnV0aWwuTWFwKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5jb25uLnBhcmFtcy5Db25uUm91dGVQYXJhbUJlYW4gZXh0ZW5kcyBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBBYnN0cmFjdFBhcmFtQmVhbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcykKLQotcHVibGljIHZvaWQgc2V0RGVmYXVsdFByb3h5KAotb3JnLmFwYWNoZS5odHRwLkh0dHBIb3N0KQotCi1wdWJsaWMgdm9pZCBzZXRGb3JjZWRSb3V0ZSgKLW9yZy5hcGFjaGUuaHR0cC5jb25uLnJvdXRpbmcuSHR0cFJvdXRlKQotCi1wdWJsaWMgdm9pZCBzZXRMb2NhbEFkZHJlc3MoCi1qYXZhLm5ldC5JbmV0QWRkcmVzcykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuY29ubi5wYXJhbXMuQ29ublJvdXRlUGFyYW1zIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaHR0cC5jb25uLnBhcmFtcy5Db25uUm91dGVQTmFtZXMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuSHR0cEhvc3QgTk9fSE9TVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5jb25uLnJvdXRpbmcuSHR0cFJvdXRlIE5PX1JPVVRFCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLmh0dHAuSHR0cEhvc3QgZ2V0RGVmYXVsdFByb3h5KAotb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zKQotCi1wdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUuaHR0cC5jb25uLnJvdXRpbmcuSHR0cFJvdXRlIGdldEZvcmNlZFJvdXRlKAotb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zKQotCi1wdWJsaWMgc3RhdGljIGphdmEubmV0LkluZXRBZGRyZXNzIGdldExvY2FsQWRkcmVzcygKLW9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcykKLQotcHVibGljIHN0YXRpYyB2b2lkIHNldERlZmF1bHRQcm94eSgKLW9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcwotb3JnLmFwYWNoZS5odHRwLkh0dHBIb3N0KQotCi1wdWJsaWMgc3RhdGljIHZvaWQgc2V0Rm9yY2VkUm91dGUoCi1vcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMKLW9yZy5hcGFjaGUuaHR0cC5jb25uLnJvdXRpbmcuSHR0cFJvdXRlKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgc2V0TG9jYWxBZGRyZXNzKAotb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zCi1qYXZhLm5ldC5JbmV0QWRkcmVzcykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmNvbm4ucm91dGluZy5IdHRwUm91dGVEaXJlY3RvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NUExFVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVF9QUk9YWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ORUNUX1RBUkdFVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMQVlFUl9QUk9UT0NPTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUVU5ORUxfUFJPWFkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFVOTkVMX1RBUkdFVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTlJFQUNIQUJMRQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgbmV4dFN0ZXAoCi1vcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLlJvdXRlSW5mbwotb3JnLmFwYWNoZS5odHRwLmNvbm4ucm91dGluZy5Sb3V0ZUluZm8pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmNvbm4ucm91dGluZy5CYXNpY1JvdXRlRGlyZWN0b3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmFwYWNoZS5odHRwLmNvbm4ucm91dGluZy5IdHRwUm91dGVEaXJlY3RvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByb3RlY3RlZCBpbnQgZGlyZWN0U3RlcCgKLW9yZy5hcGFjaGUuaHR0cC5jb25uLnJvdXRpbmcuUm91dGVJbmZvCi1vcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLlJvdXRlSW5mbykKLQotcHJvdGVjdGVkIGludCBmaXJzdFN0ZXAoCi1vcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLlJvdXRlSW5mbykKLQotcHVibGljIGludCBuZXh0U3RlcCgKLW9yZy5hcGFjaGUuaHR0cC5jb25uLnJvdXRpbmcuUm91dGVJbmZvCi1vcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLlJvdXRlSW5mbykKLQotcHJvdGVjdGVkIGludCBwcm94aWVkU3RlcCgKLW9yZy5hcGFjaGUuaHR0cC5jb25uLnJvdXRpbmcuUm91dGVJbmZvCi1vcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLlJvdXRlSW5mbykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvY29ubi9yb3V0aW5nL1JvdXRlSW5mbyRMYXllclR5cGU7TG9yZy9hcGFjaGUvaHR0cC9jb25uL3JvdXRpbmcvUm91dGVJbmZvJFR1bm5lbFR5cGU7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmNvbm4ucm91dGluZy5Sb3V0ZUluZm8gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IGludCBnZXRIb3BDb3VudCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBvcmcuYXBhY2hlLmh0dHAuSHR0cEhvc3QgZ2V0SG9wVGFyZ2V0KAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLmFwYWNoZS5odHRwLmNvbm4ucm91dGluZy5Sb3V0ZUluZm8kTGF5ZXJUeXBlIGdldExheWVyVHlwZSgpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm5ldC5JbmV0QWRkcmVzcyBnZXRMb2NhbEFkZHJlc3MoKQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLmFwYWNoZS5odHRwLkh0dHBIb3N0IGdldFByb3h5SG9zdCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBvcmcuYXBhY2hlLmh0dHAuSHR0cEhvc3QgZ2V0VGFyZ2V0SG9zdCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBvcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLlJvdXRlSW5mbyRUdW5uZWxUeXBlIGdldFR1bm5lbFR5cGUoKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0xheWVyZWQoKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1NlY3VyZSgpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzVHVubmVsbGVkKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLkh0dHBSb3V0ZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLlJvdXRlSW5mbywgamF2YS5sYW5nLkNsb25lYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5jb25uLnJvdXRpbmcuUm91dGVJbmZvJExheWVyVHlwZSBsYXllcmVkCi0KLXByaXZhdGUgZmluYWwgamF2YS5uZXQuSW5ldEFkZHJlc3MgbG9jYWxBZGRyZXNzCi0KLXByaXZhdGUgZmluYWwgb3JnLmFwYWNoZS5odHRwLkh0dHBIb3N0W10gcHJveHlDaGFpbgotCi1wcml2YXRlIGZpbmFsIGJvb2xlYW4gc2VjdXJlCi0KLXByaXZhdGUgZmluYWwgb3JnLmFwYWNoZS5odHRwLkh0dHBIb3N0IHRhcmdldEhvc3QKLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLlJvdXRlSW5mbyRUdW5uZWxUeXBlIHR1bm5lbGxlZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLm5ldC5JbmV0QWRkcmVzcwotb3JnLmFwYWNoZS5odHRwLkh0dHBIb3N0Ci1vcmcuYXBhY2hlLmh0dHAuSHR0cEhvc3RbXQotYm9vbGVhbgotb3JnLmFwYWNoZS5odHRwLmNvbm4ucm91dGluZy5Sb3V0ZUluZm8kVHVubmVsVHlwZQotb3JnLmFwYWNoZS5odHRwLmNvbm4ucm91dGluZy5Sb3V0ZUluZm8kTGF5ZXJUeXBlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmh0dHAuSHR0cEhvc3QpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaHR0cC5IdHRwSG9zdAotamF2YS5uZXQuSW5ldEFkZHJlc3MKLW9yZy5hcGFjaGUuaHR0cC5IdHRwSG9zdAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5odHRwLkh0dHBIb3N0Ci1qYXZhLm5ldC5JbmV0QWRkcmVzcwotb3JnLmFwYWNoZS5odHRwLkh0dHBIb3N0Ci1ib29sZWFuCi1vcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLlJvdXRlSW5mbyRUdW5uZWxUeXBlCi1vcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLlJvdXRlSW5mbyRMYXllclR5cGUpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaHR0cC5IdHRwSG9zdAotamF2YS5uZXQuSW5ldEFkZHJlc3MKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaHR0cC5IdHRwSG9zdAotamF2YS5uZXQuSW5ldEFkZHJlc3MKLW9yZy5hcGFjaGUuaHR0cC5IdHRwSG9zdFtdCi1ib29sZWFuCi1vcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLlJvdXRlSW5mbyRUdW5uZWxUeXBlCi1vcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLlJvdXRlSW5mbyRMYXllclR5cGUpCi0KLXByaXZhdGUgc3RhdGljIG9yZy5hcGFjaGUuaHR0cC5IdHRwSG9zdFtdIHRvQ2hhaW4oCi1vcmcuYXBhY2hlLmh0dHAuSHR0cEhvc3QpCi0KLXByaXZhdGUgc3RhdGljIG9yZy5hcGFjaGUuaHR0cC5IdHRwSG9zdFtdIHRvQ2hhaW4oCi1vcmcuYXBhY2hlLmh0dHAuSHR0cEhvc3RbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0Nsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBjbG9uZSgpCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBmaW5hbCBpbnQgZ2V0SG9wQ291bnQoKQotCi1wdWJsaWMgZmluYWwgb3JnLmFwYWNoZS5odHRwLkh0dHBIb3N0IGdldEhvcFRhcmdldCgKLWludCkKLQotcHVibGljIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5jb25uLnJvdXRpbmcuUm91dGVJbmZvJExheWVyVHlwZSBnZXRMYXllclR5cGUoKQotCi1wdWJsaWMgZmluYWwgamF2YS5uZXQuSW5ldEFkZHJlc3MgZ2V0TG9jYWxBZGRyZXNzKCkKLQotcHVibGljIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5IdHRwSG9zdCBnZXRQcm94eUhvc3QoKQotCi1wdWJsaWMgZmluYWwgb3JnLmFwYWNoZS5odHRwLkh0dHBIb3N0IGdldFRhcmdldEhvc3QoKQotCi1wdWJsaWMgZmluYWwgb3JnLmFwYWNoZS5odHRwLmNvbm4ucm91dGluZy5Sb3V0ZUluZm8kVHVubmVsVHlwZSBnZXRUdW5uZWxUeXBlKCkKLQotcHVibGljIGZpbmFsIGludCBoYXNoQ29kZSgpCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGlzTGF5ZXJlZCgpCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGlzU2VjdXJlKCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gaXNUdW5uZWxsZWQoKQotCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5jb25uLnJvdXRpbmcuSHR0cFJvdXRlUGxhbm5lciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvSHR0cEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IG9yZy5hcGFjaGUuaHR0cC5jb25uLnJvdXRpbmcuSHR0cFJvdXRlIGRldGVybWluZVJvdXRlKAotb3JnLmFwYWNoZS5odHRwLkh0dHBIb3N0Ci1vcmcuYXBhY2hlLmh0dHAuSHR0cFJlcXVlc3QKLW9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwQ29udGV4dCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE2NDA5IG5hbWUgPUxheWVyVHlwZSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL2Nvbm4vcm91dGluZy9Sb3V0ZUluZm87ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL0VudW08TG9yZy9hcGFjaGUvaHR0cC9jb25uL3JvdXRpbmcvUm91dGVJbmZvJExheWVyVHlwZTs+OyApCi1wdWJsaWMgZmluYWwgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmNvbm4ucm91dGluZy5Sb3V0ZUluZm8kTGF5ZXJUeXBlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5odHRwLmNvbm4ucm91dGluZy5Sb3V0ZUluZm8kTGF5ZXJUeXBlW10gJFZBTFVFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5jb25uLnJvdXRpbmcuUm91dGVJbmZvJExheWVyVHlwZSBMQVlFUkVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5odHRwLmNvbm4ucm91dGluZy5Sb3V0ZUluZm8kTGF5ZXJUeXBlIFBMQUlOCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpViApCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUuaHR0cC5jb25uLnJvdXRpbmcuUm91dGVJbmZvJExheWVyVHlwZSB2YWx1ZU9mKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLlJvdXRlSW5mbyRMYXllclR5cGVbXSB2YWx1ZXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTY0MDkgbmFtZSA9VHVubmVsVHlwZSApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9FbnVtPExvcmcvYXBhY2hlL2h0dHAvY29ubi9yb3V0aW5nL1JvdXRlSW5mbyRUdW5uZWxUeXBlOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvY29ubi9yb3V0aW5nL1JvdXRlSW5mbzsgKQotcHVibGljIGZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5jb25uLnJvdXRpbmcuUm91dGVJbmZvJFR1bm5lbFR5cGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLlJvdXRlSW5mbyRUdW5uZWxUeXBlW10gJFZBTFVFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5jb25uLnJvdXRpbmcuUm91dGVJbmZvJFR1bm5lbFR5cGUgUExBSU4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLlJvdXRlSW5mbyRUdW5uZWxUeXBlIFRVTk5FTExFRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVYgKQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLlJvdXRlSW5mbyRUdW5uZWxUeXBlIHZhbHVlT2YoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUuaHR0cC5jb25uLnJvdXRpbmcuUm91dGVJbmZvJFR1bm5lbFR5cGVbXSB2YWx1ZXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5jb25uLnJvdXRpbmcuUm91dGVUcmFja2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaHR0cC5jb25uLnJvdXRpbmcuUm91dGVJbmZvLCBqYXZhLmxhbmcuQ2xvbmVhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYm9vbGVhbiBjb25uZWN0ZWQKLQotcHJpdmF0ZSBvcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLlJvdXRlSW5mbyRMYXllclR5cGUgbGF5ZXJlZAotCi1wcml2YXRlIGZpbmFsIGphdmEubmV0LkluZXRBZGRyZXNzIGxvY2FsQWRkcmVzcwotCi1wcml2YXRlIG9yZy5hcGFjaGUuaHR0cC5IdHRwSG9zdFtdIHByb3h5Q2hhaW4KLQotcHJpdmF0ZSBib29sZWFuIHNlY3VyZQotCi1wcml2YXRlIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5IdHRwSG9zdCB0YXJnZXRIb3N0Ci0KLXByaXZhdGUgb3JnLmFwYWNoZS5odHRwLmNvbm4ucm91dGluZy5Sb3V0ZUluZm8kVHVubmVsVHlwZSB0dW5uZWxsZWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmh0dHAuSHR0cEhvc3QKLWphdmEubmV0LkluZXRBZGRyZXNzKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLkh0dHBSb3V0ZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0Nsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBjbG9uZSgpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIGNvbm5lY3RQcm94eSgKLW9yZy5hcGFjaGUuaHR0cC5IdHRwSG9zdAotYm9vbGVhbikKLQotcHVibGljIGZpbmFsIHZvaWQgY29ubmVjdFRhcmdldCgKLWJvb2xlYW4pCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBmaW5hbCBpbnQgZ2V0SG9wQ291bnQoKQotCi1wdWJsaWMgZmluYWwgb3JnLmFwYWNoZS5odHRwLkh0dHBIb3N0IGdldEhvcFRhcmdldCgKLWludCkKLQotcHVibGljIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5jb25uLnJvdXRpbmcuUm91dGVJbmZvJExheWVyVHlwZSBnZXRMYXllclR5cGUoKQotCi1wdWJsaWMgZmluYWwgamF2YS5uZXQuSW5ldEFkZHJlc3MgZ2V0TG9jYWxBZGRyZXNzKCkKLQotcHVibGljIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5IdHRwSG9zdCBnZXRQcm94eUhvc3QoKQotCi1wdWJsaWMgZmluYWwgb3JnLmFwYWNoZS5odHRwLkh0dHBIb3N0IGdldFRhcmdldEhvc3QoKQotCi1wdWJsaWMgZmluYWwgb3JnLmFwYWNoZS5odHRwLmNvbm4ucm91dGluZy5Sb3V0ZUluZm8kVHVubmVsVHlwZSBnZXRUdW5uZWxUeXBlKCkKLQotcHVibGljIGZpbmFsIGludCBoYXNoQ29kZSgpCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGlzQ29ubmVjdGVkKCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gaXNMYXllcmVkKCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gaXNTZWN1cmUoKQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBpc1R1bm5lbGxlZCgpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIGxheWVyUHJvdG9jb2woCi1ib29sZWFuKQotCi1wdWJsaWMgZmluYWwgb3JnLmFwYWNoZS5odHRwLmNvbm4ucm91dGluZy5IdHRwUm91dGUgdG9Sb3V0ZSgpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotcHVibGljIGZpbmFsIHZvaWQgdHVubmVsUHJveHkoCi1vcmcuYXBhY2hlLmh0dHAuSHR0cEhvc3QKLWJvb2xlYW4pCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHR1bm5lbFRhcmdldCgKLWJvb2xlYW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5jb25uLnNjaGVtZS5Ib3N0TmFtZVJlc29sdmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm5ldC5JbmV0QWRkcmVzcyByZXNvbHZlKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmNvbm4uc2NoZW1lLkxheWVyZWRTb2NrZXRGYWN0b3J5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaHR0cC5jb25uLnNjaGVtZS5Tb2NrZXRGYWN0b3J5Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9uZXQvVW5rbm93bkhvc3RFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm5ldC5Tb2NrZXQgY3JlYXRlU29ja2V0KAotamF2YS5uZXQuU29ja2V0Ci1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWJvb2xlYW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmNvbm4uc2NoZW1lLlBsYWluU29ja2V0RmFjdG9yeSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmh0dHAuY29ubi5zY2hlbWUuU29ja2V0RmFjdG9yeQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuY29ubi5zY2hlbWUuUGxhaW5Tb2NrZXRGYWN0b3J5IERFRkFVTFRfRkFDVE9SWQotCi1wcml2YXRlIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5jb25uLnNjaGVtZS5Ib3N0TmFtZVJlc29sdmVyIG5hbWVSZXNvbHZlcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5odHRwLmNvbm4uc2NoZW1lLkhvc3ROYW1lUmVzb2x2ZXIpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5odHRwLmNvbm4uc2NoZW1lLlBsYWluU29ja2V0RmFjdG9yeSBnZXRTb2NrZXRGYWN0b3J5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubmV0LlNvY2tldCBjb25uZWN0U29ja2V0KAotamF2YS5uZXQuU29ja2V0Ci1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWphdmEubmV0LkluZXRBZGRyZXNzCi1pbnQKLW9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcykKLQotcHVibGljIGphdmEubmV0LlNvY2tldCBjcmVhdGVTb2NrZXQoKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIGJvb2xlYW4gaXNTZWN1cmUoCi1qYXZhLm5ldC5Tb2NrZXQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmNvbm4uc2NoZW1lLlNjaGVtZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBpbnQgZGVmYXVsdFBvcnQKLQotcHJpdmF0ZSBmaW5hbCBib29sZWFuIGxheWVyZWQKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIG5hbWUKLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuY29ubi5zY2hlbWUuU29ja2V0RmFjdG9yeSBzb2NrZXRGYWN0b3J5Ci0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBzdHJpbmdSZXAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1vcmcuYXBhY2hlLmh0dHAuY29ubi5zY2hlbWUuU29ja2V0RmFjdG9yeQotaW50KQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgZmluYWwgaW50IGdldERlZmF1bHRQb3J0KCkKLQotcHVibGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgZ2V0TmFtZSgpCi0KLXB1YmxpYyBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuY29ubi5zY2hlbWUuU29ja2V0RmFjdG9yeSBnZXRTb2NrZXRGYWN0b3J5KCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGlzTGF5ZXJlZCgpCi0KLXB1YmxpYyBmaW5hbCBpbnQgcmVzb2x2ZVBvcnQoCi1pbnQpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuY29ubi5zY2hlbWUuU2NoZW1lUmVnaXN0cnkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TG9yZy9hcGFjaGUvaHR0cC9jb25uL3NjaGVtZS9TY2hlbWU7PjsgKQotcHJpdmF0ZSBmaW5hbCBqYXZhLnV0aWwuTWFwIHJlZ2lzdGVyZWRTY2hlbWVzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5jb25uLnNjaGVtZS5TY2hlbWUgZ2V0KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5jb25uLnNjaGVtZS5TY2hlbWUgZ2V0U2NoZW1lKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5jb25uLnNjaGVtZS5TY2hlbWUgZ2V0U2NoZW1lKAotb3JnLmFwYWNoZS5odHRwLkh0dHBIb3N0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9MaXN0PExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXB1YmxpYyBmaW5hbCBqYXZhLnV0aWwuTGlzdCBnZXRTY2hlbWVOYW1lcygpCi0KLXB1YmxpYyBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuY29ubi5zY2hlbWUuU2NoZW1lIHJlZ2lzdGVyKAotb3JnLmFwYWNoZS5odHRwLmNvbm4uc2NoZW1lLlNjaGVtZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TG9yZy9hcGFjaGUvaHR0cC9jb25uL3NjaGVtZS9TY2hlbWU7PjspViApCi1wdWJsaWMgdm9pZCBzZXRJdGVtcygKLWphdmEudXRpbC5NYXApCi0KLXB1YmxpYyBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuY29ubi5zY2hlbWUuU2NoZW1lIHVucmVnaXN0ZXIoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuY29ubi5zc2wuWDUwOUhvc3RuYW1lVmVyaWZpZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YXgubmV0LnNzbC5Ib3N0bmFtZVZlcmlmaWVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YXgvbmV0L3NzbC9TU0xFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHZlcmlmeSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHZlcmlmeSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmF4Lm5ldC5zc2wuU1NMU29ja2V0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZheC9uZXQvc3NsL1NTTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgdmVyaWZ5KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZ1tdCi1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHZlcmlmeSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmF4Lm5ldC5zc2wuU1NMU2Vzc2lvbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuY29ubi5zc2wuQWJzdHJhY3RWZXJpZmllciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmh0dHAuY29ubi5zc2wuWDUwOUhvc3RuYW1lVmVyaWZpZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZ1tdIEJBRF9DT1VOVFJZXzJMRFMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhY2NlcHRhYmxlQ291bnRyeVdpbGRjYXJkKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBpbnQgY291bnREb3RzKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0Q05zKAotamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZSkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0RE5TU3ViamVjdEFsdHMoCi1qYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZheC9uZXQvc3NsL1NTTEV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIHZvaWQgdmVyaWZ5KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIHZvaWQgdmVyaWZ5KAotamF2YS5sYW5nLlN0cmluZwotamF2YXgubmV0LnNzbC5TU0xTb2NrZXQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmF4L25ldC9zc2wvU1NMRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgdm9pZCB2ZXJpZnkoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nW10KLWphdmEubGFuZy5TdHJpbmdbXQotYm9vbGVhbikKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gdmVyaWZ5KAotamF2YS5sYW5nLlN0cmluZwotamF2YXgubmV0LnNzbC5TU0xTZXNzaW9uKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5jb25uLnNzbC5BbGxvd0FsbEhvc3RuYW1lVmVyaWZpZXIgZXh0ZW5kcyBvcmcuYXBhY2hlLmh0dHAuY29ubi5zc2wuQWJzdHJhY3RWZXJpZmllcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotcHVibGljIGZpbmFsIHZvaWQgdmVyaWZ5KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZ1tdCi1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmNvbm4uc3NsLkJyb3dzZXJDb21wYXRIb3N0bmFtZVZlcmlmaWVyIGV4dGVuZHMgb3JnLmFwYWNoZS5odHRwLmNvbm4uc3NsLkFic3RyYWN0VmVyaWZpZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmF4L25ldC9zc2wvU1NMRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgdm9pZCB2ZXJpZnkoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nW10KLWphdmEubGFuZy5TdHJpbmdbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuY29ubi5zc2wuU1NMU29ja2V0RmFjdG9yeSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmh0dHAuY29ubi5zY2hlbWUuTGF5ZXJlZFNvY2tldEZhY3RvcnkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuY29ubi5zc2wuWDUwOUhvc3RuYW1lVmVyaWZpZXIgQUxMT1dfQUxMX0hPU1ROQU1FX1ZFUklGSUVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5odHRwLmNvbm4uc3NsLlg1MDlIb3N0bmFtZVZlcmlmaWVyIEJST1dTRVJfQ09NUEFUSUJMRV9IT1NUTkFNRV9WRVJJRklFUgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuY29ubi5zc2wuU1NMU29ja2V0RmFjdG9yeSBERUZBVUxUX0ZBQ1RPUlkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNTTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU1NMVjIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuY29ubi5zc2wuWDUwOUhvc3RuYW1lVmVyaWZpZXIgU1RSSUNUX0hPU1ROQU1FX1ZFUklGSUVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUTFMKLQotcHJpdmF0ZSBvcmcuYXBhY2hlLmh0dHAuY29ubi5zc2wuWDUwOUhvc3RuYW1lVmVyaWZpZXIgaG9zdG5hbWVWZXJpZmllcgotCi1wcml2YXRlIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5jb25uLnNjaGVtZS5Ib3N0TmFtZVJlc29sdmVyIG5hbWVSZXNvbHZlcgotCi1wcml2YXRlIGZpbmFsIGphdmF4Lm5ldC5zc2wuU1NMU29ja2V0RmFjdG9yeSBzb2NrZXRmYWN0b3J5Ci0KLXByaXZhdGUgZmluYWwgamF2YXgubmV0LnNzbC5TU0xDb250ZXh0IHNzbGNvbnRleHQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9LZXlNYW5hZ2VtZW50RXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L0tleVN0b3JlRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L1VucmVjb3ZlcmFibGVLZXlFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEuc2VjdXJpdHkuS2V5U3RvcmUKLWphdmEubGFuZy5TdHJpbmcKLWphdmEuc2VjdXJpdHkuS2V5U3RvcmUKLWphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tCi1vcmcuYXBhY2hlLmh0dHAuY29ubi5zY2hlbWUuSG9zdE5hbWVSZXNvbHZlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247TGphdmEvc2VjdXJpdHkvS2V5TWFuYWdlbWVudEV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9LZXlTdG9yZUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9VbnJlY292ZXJhYmxlS2V5RXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnNlY3VyaXR5LktleVN0b3JlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9LZXlNYW5hZ2VtZW50RXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L0tleVN0b3JlRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L1VucmVjb3ZlcmFibGVLZXlFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuc2VjdXJpdHkuS2V5U3RvcmUKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L0tleU1hbmFnZW1lbnRFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvS2V5U3RvcmVFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvVW5yZWNvdmVyYWJsZUtleUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5zZWN1cml0eS5LZXlTdG9yZQotamF2YS5sYW5nLlN0cmluZwotamF2YS5zZWN1cml0eS5LZXlTdG9yZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9LZXlTdG9yZUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247TGphdmEvc2VjdXJpdHkvVW5yZWNvdmVyYWJsZUtleUV4Y2VwdGlvbjsgKQotcHJpdmF0ZSBzdGF0aWMgamF2YXgubmV0LnNzbC5LZXlNYW5hZ2VyW10gY3JlYXRlS2V5TWFuYWdlcnMoCi1qYXZhLnNlY3VyaXR5LktleVN0b3JlCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0tleVN0b3JlRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsgKQotcHJpdmF0ZSBzdGF0aWMgamF2YXgubmV0LnNzbC5UcnVzdE1hbmFnZXJbXSBjcmVhdGVUcnVzdE1hbmFnZXJzKAotamF2YS5zZWN1cml0eS5LZXlTdG9yZSkKLQotcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLmh0dHAuY29ubi5zc2wuU1NMU29ja2V0RmFjdG9yeSBnZXRTb2NrZXRGYWN0b3J5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubmV0LlNvY2tldCBjb25uZWN0U29ja2V0KAotamF2YS5uZXQuU29ja2V0Ci1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWphdmEubmV0LkluZXRBZGRyZXNzCi1pbnQKLW9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubmV0LlNvY2tldCBjcmVhdGVTb2NrZXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL25ldC9Vbmtub3duSG9zdEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubmV0LlNvY2tldCBjcmVhdGVTb2NrZXQoCi1qYXZhLm5ldC5Tb2NrZXQKLWphdmEubGFuZy5TdHJpbmcKLWludAotYm9vbGVhbikKLQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5jb25uLnNzbC5YNTA5SG9zdG5hbWVWZXJpZmllciBnZXRIb3N0bmFtZVZlcmlmaWVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gaXNTZWN1cmUoCi1qYXZhLm5ldC5Tb2NrZXQpCi0KLXB1YmxpYyB2b2lkIHNldEhvc3RuYW1lVmVyaWZpZXIoCi1vcmcuYXBhY2hlLmh0dHAuY29ubi5zc2wuWDUwOUhvc3RuYW1lVmVyaWZpZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmNvbm4uc3NsLlN0cmljdEhvc3RuYW1lVmVyaWZpZXIgZXh0ZW5kcyBvcmcuYXBhY2hlLmh0dHAuY29ubi5zc2wuQWJzdHJhY3RWZXJpZmllcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YXgvbmV0L3NzbC9TU0xFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCB2b2lkIHZlcmlmeSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmdbXQotamF2YS5sYW5nLlN0cmluZ1tdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5jb25uLnV0aWwuSW5ldEFkZHJlc3NVdGlscyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4gSVBWNF9QQVRURVJOCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEudXRpbC5yZWdleC5QYXR0ZXJuIElQVjZfSEVYX0NPTVBSRVNTRURfUEFUVEVSTgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwucmVnZXguUGF0dGVybiBJUFY2X1NURF9QQVRURVJOCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzSVB2NEFkZHJlc3MoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNJUHY2QWRkcmVzcygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0lQdjZIZXhDb21wcmVzc2VkQWRkcmVzcygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0lQdjZTdGRBZGRyZXNzKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5Db29raWUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0Q29tbWVudCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldENvbW1lbnRVUkwoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXREb21haW4oKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLkRhdGUgZ2V0RXhwaXJ5RGF0ZSgpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldE5hbWUoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRQYXRoKCkKLQotcHVibGljIGFic3RyYWN0IGludFtdIGdldFBvcnRzKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0VmFsdWUoKQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldFZlcnNpb24oKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0V4cGlyZWQoCi1qYXZhLnV0aWwuRGF0ZSkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNQZXJzaXN0ZW50KCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNTZWN1cmUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuY29va2llLkNsaWVudENvb2tpZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmh0dHAuY29va2llLkNvb2tpZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ09NTUVOVFVSTF9BVFRSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDT01NRU5UX0FUVFIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERJU0NBUkRfQVRUUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRE9NQUlOX0FUVFIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEVYUElSRVNfQVRUUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTUFYX0FHRV9BVFRSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQQVRIX0FUVFIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBPUlRfQVRUUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0VDVVJFX0FUVFIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFZFUlNJT05fQVRUUgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGNvbnRhaW5zQXR0cmlidXRlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0QXR0cmlidXRlKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5Db29raWVBdHRyaWJ1dGVIYW5kbGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIG1hdGNoKAotb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5Db29raWUKLW9yZy5hcGFjaGUuaHR0cC5jb29raWUuQ29va2llT3JpZ2luKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvY29va2llL01hbGZvcm1lZENvb2tpZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgcGFyc2UoCi1vcmcuYXBhY2hlLmh0dHAuY29va2llLlNldENvb2tpZQotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL2Nvb2tpZS9NYWxmb3JtZWRDb29raWVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHZhbGlkYXRlKAotb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5Db29raWUKLW9yZy5hcGFjaGUuaHR0cC5jb29raWUuQ29va2llT3JpZ2luKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS9pby9TZXJpYWxpemFibGU7TGphdmEvdXRpbC9Db21wYXJhdG9yPExvcmcvYXBhY2hlL2h0dHAvY29va2llL0Nvb2tpZTs+OyApCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5Db29raWVJZGVudGl0eUNvbXBhcmF0b3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUsIGphdmEudXRpbC5Db21wYXJhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2xhdGlsZSBpbnQgY29tcGFyZSgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBpbnQgY29tcGFyZSgKLW9yZy5hcGFjaGUuaHR0cC5jb29raWUuQ29va2llCi1vcmcuYXBhY2hlLmh0dHAuY29va2llLkNvb2tpZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuY29va2llLkNvb2tpZU9yaWdpbiBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGhvc3QKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIHBhdGgKLQotcHJpdmF0ZSBmaW5hbCBpbnQgcG9ydAotCi1wcml2YXRlIGZpbmFsIGJvb2xlYW4gc2VjdXJlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRIb3N0KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UGF0aCgpCi0KLXB1YmxpYyBpbnQgZ2V0UG9ydCgpCi0KLXB1YmxpYyBib29sZWFuIGlzU2VjdXJlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS9pby9TZXJpYWxpemFibGU7TGphdmEvdXRpbC9Db21wYXJhdG9yPExvcmcvYXBhY2hlL2h0dHAvY29va2llL0Nvb2tpZTs+OyApCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5Db29raWVQYXRoQ29tcGFyYXRvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgamF2YS51dGlsLkNvbXBhcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG5vcm1hbGl6ZVBhdGgoCi1vcmcuYXBhY2hlLmh0dHAuY29va2llLkNvb2tpZSkKLQotcHVibGljIHZvbGF0aWxlIGludCBjb21wYXJlKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGludCBjb21wYXJlKAotb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5Db29raWUKLW9yZy5hcGFjaGUuaHR0cC5jb29raWUuQ29va2llKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuY29va2llLkNvb2tpZVNwZWMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9MaXN0PExvcmcvYXBhY2hlL2h0dHAvY29va2llL0Nvb2tpZTs+OylMamF2YS91dGlsL0xpc3Q8TG9yZy9hcGFjaGUvaHR0cC9IZWFkZXI7PjsgKQotcHVibGljIGFic3RyYWN0IGphdmEudXRpbC5MaXN0IGZvcm1hdENvb2tpZXMoCi1qYXZhLnV0aWwuTGlzdCkKLQotcHVibGljIGFic3RyYWN0IGludCBnZXRWZXJzaW9uKCkKLQotcHVibGljIGFic3RyYWN0IG9yZy5hcGFjaGUuaHR0cC5IZWFkZXIgZ2V0VmVyc2lvbkhlYWRlcigpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIG1hdGNoKAotb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5Db29raWUKLW9yZy5hcGFjaGUuaHR0cC5jb29raWUuQ29va2llT3JpZ2luKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMb3JnL2FwYWNoZS9odHRwL0hlYWRlcjtMb3JnL2FwYWNoZS9odHRwL2Nvb2tpZS9Db29raWVPcmlnaW47KUxqYXZhL3V0aWwvTGlzdDxMb3JnL2FwYWNoZS9odHRwL2Nvb2tpZS9Db29raWU7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvY29va2llL01hbGZvcm1lZENvb2tpZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEudXRpbC5MaXN0IHBhcnNlKAotb3JnLmFwYWNoZS5odHRwLkhlYWRlcgotb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5Db29raWVPcmlnaW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9jb29raWUvTWFsZm9ybWVkQ29va2llRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB2YWxpZGF0ZSgKLW9yZy5hcGFjaGUuaHR0cC5jb29raWUuQ29va2llCi1vcmcuYXBhY2hlLmh0dHAuY29va2llLkNvb2tpZU9yaWdpbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5Db29raWVTcGVjRmFjdG9yeSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5Db29raWVTcGVjIG5ld0luc3RhbmNlKAotb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5jb29raWUuQ29va2llU3BlY1JlZ2lzdHJ5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xvcmcvYXBhY2hlL2h0dHAvY29va2llL0Nvb2tpZVNwZWNGYWN0b3J5Oz47ICkKLXByaXZhdGUgZmluYWwgamF2YS51dGlsLk1hcCByZWdpc3RlcmVkU3BlY3MKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5Db29raWVTcGVjIGdldENvb2tpZVNwZWMoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5Db29raWVTcGVjIGdldENvb2tpZVNwZWMoCi1qYXZhLmxhbmcuU3RyaW5nCi1vcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0xpc3Q8TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHVibGljIGphdmEudXRpbC5MaXN0IGdldFNwZWNOYW1lcygpCi0KLXB1YmxpYyB2b2lkIHJlZ2lzdGVyKAotamF2YS5sYW5nLlN0cmluZwotb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5Db29raWVTcGVjRmFjdG9yeSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TG9yZy9hcGFjaGUvaHR0cC9jb29raWUvQ29va2llU3BlY0ZhY3Rvcnk7PjspViApCi1wdWJsaWMgdm9pZCBzZXRJdGVtcygKLWphdmEudXRpbC5NYXApCi0KLXB1YmxpYyB2b2lkIHVucmVnaXN0ZXIoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5jb29raWUuTWFsZm9ybWVkQ29va2llRXhjZXB0aW9uIGV4dGVuZHMgb3JnLmFwYWNoZS5odHRwLlByb3RvY29sRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5jb29raWUuU00gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDT09LSUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENPT0tJRTIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNFVF9DT09LSUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNFVF9DT09LSUUyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5TZXRDb29raWUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5Db29raWUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRDb21tZW50KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RG9tYWluKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RXhwaXJ5RGF0ZSgKLWphdmEudXRpbC5EYXRlKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRQYXRoKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0U2VjdXJlKAotYm9vbGVhbikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0VmFsdWUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRWZXJzaW9uKAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuY29va2llLlNldENvb2tpZTIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5TZXRDb29raWUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRDb21tZW50VVJMKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RGlzY2FyZCgKLWJvb2xlYW4pCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFBvcnRzKAotaW50W10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5wYXJhbXMuQ29va2llU3BlY1BhcmFtQmVhbiBleHRlbmRzIG9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cEFic3RyYWN0UGFyYW1CZWFuCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0NvbGxlY3Rpb248TGphdmEvbGFuZy9TdHJpbmc7PjspViApCi1wdWJsaWMgdm9pZCBzZXREYXRlUGF0dGVybnMoCi1qYXZhLnV0aWwuQ29sbGVjdGlvbikKLQotcHVibGljIHZvaWQgc2V0U2luZ2xlSGVhZGVyKAotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuZW50aXR5LkJhc2ljSHR0cEVudGl0eSBleHRlbmRzIG9yZy5hcGFjaGUuaHR0cC5lbnRpdHkuQWJzdHJhY3RIdHRwRW50aXR5Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS5pby5JbnB1dFN0cmVhbSBjb250ZW50Ci0KLXByaXZhdGUgYm9vbGVhbiBjb250ZW50T2J0YWluZWQKLQotcHJpdmF0ZSBsb25nIGxlbmd0aAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNvbnN1bWVDb250ZW50KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuaW8uSW5wdXRTdHJlYW0gZ2V0Q29udGVudCgpCi0KLXB1YmxpYyBsb25nIGdldENvbnRlbnRMZW5ndGgoKQotCi1wdWJsaWMgYm9vbGVhbiBpc1JlcGVhdGFibGUoKQotCi1wdWJsaWMgYm9vbGVhbiBpc1N0cmVhbWluZygpCi0KLXB1YmxpYyB2b2lkIHNldENvbnRlbnQoCi1qYXZhLmlvLklucHV0U3RyZWFtKQotCi1wdWJsaWMgdm9pZCBzZXRDb250ZW50TGVuZ3RoKAotbG9uZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgd3JpdGVUbygKLWphdmEuaW8uT3V0cHV0U3RyZWFtKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5lbnRpdHkuQnVmZmVyZWRIdHRwRW50aXR5IGV4dGVuZHMgb3JnLmFwYWNoZS5odHRwLmVudGl0eS5IdHRwRW50aXR5V3JhcHBlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGJ5dGVbXSBidWZmZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmh0dHAuSHR0cEVudGl0eSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuaW8uSW5wdXRTdHJlYW0gZ2V0Q29udGVudCgpCi0KLXB1YmxpYyBsb25nIGdldENvbnRlbnRMZW5ndGgoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0NodW5rZWQoKQotCi1wdWJsaWMgYm9vbGVhbiBpc1JlcGVhdGFibGUoKQotCi1wdWJsaWMgYm9vbGVhbiBpc1N0cmVhbWluZygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHdyaXRlVG8oCi1qYXZhLmlvLk91dHB1dFN0cmVhbSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuZW50aXR5LkJ5dGVBcnJheUVudGl0eSBleHRlbmRzIG9yZy5hcGFjaGUuaHR0cC5lbnRpdHkuQWJzdHJhY3RIdHRwRW50aXR5IGltcGxlbWVudHMgamF2YS5sYW5nLkNsb25lYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgZmluYWwgYnl0ZVtdIGNvbnRlbnQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9DbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgY2xvbmUoKQotCi1wdWJsaWMgamF2YS5pby5JbnB1dFN0cmVhbSBnZXRDb250ZW50KCkKLQotcHVibGljIGxvbmcgZ2V0Q29udGVudExlbmd0aCgpCi0KLXB1YmxpYyBib29sZWFuIGlzUmVwZWF0YWJsZSgpCi0KLXB1YmxpYyBib29sZWFuIGlzU3RyZWFtaW5nKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgd3JpdGVUbygKLWphdmEuaW8uT3V0cHV0U3RyZWFtKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuZW50aXR5LkNvbnRlbnRMZW5ndGhTdHJhdGVneSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hVTktFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJREVOVElUWQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9IdHRwRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgbG9uZyBkZXRlcm1pbmVMZW5ndGgoCi1vcmcuYXBhY2hlLmh0dHAuSHR0cE1lc3NhZ2UpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5lbnRpdHkuQ29udGVudFByb2R1Y2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlVG8oCi1qYXZhLmlvLk91dHB1dFN0cmVhbSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuZW50aXR5LkVudGl0eVRlbXBsYXRlIGV4dGVuZHMgb3JnLmFwYWNoZS5odHRwLmVudGl0eS5BYnN0cmFjdEh0dHBFbnRpdHkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuZW50aXR5LkNvbnRlbnRQcm9kdWNlciBjb250ZW50cHJvZHVjZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmh0dHAuZW50aXR5LkNvbnRlbnRQcm9kdWNlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY29uc3VtZUNvbnRlbnQoKQotCi1wdWJsaWMgamF2YS5pby5JbnB1dFN0cmVhbSBnZXRDb250ZW50KCkKLQotcHVibGljIGxvbmcgZ2V0Q29udGVudExlbmd0aCgpCi0KLXB1YmxpYyBib29sZWFuIGlzUmVwZWF0YWJsZSgpCi0KLXB1YmxpYyBib29sZWFuIGlzU3RyZWFtaW5nKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgd3JpdGVUbygKLWphdmEuaW8uT3V0cHV0U3RyZWFtKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5lbnRpdHkuRmlsZUVudGl0eSBleHRlbmRzIG9yZy5hcGFjaGUuaHR0cC5lbnRpdHkuQWJzdHJhY3RIdHRwRW50aXR5IGltcGxlbWVudHMgamF2YS5sYW5nLkNsb25lYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgZmluYWwgamF2YS5pby5GaWxlIGZpbGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmlvLkZpbGUKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9DbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgY2xvbmUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5pby5JbnB1dFN0cmVhbSBnZXRDb250ZW50KCkKLQotcHVibGljIGxvbmcgZ2V0Q29udGVudExlbmd0aCgpCi0KLXB1YmxpYyBib29sZWFuIGlzUmVwZWF0YWJsZSgpCi0KLXB1YmxpYyBib29sZWFuIGlzU3RyZWFtaW5nKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgd3JpdGVUbygKLWphdmEuaW8uT3V0cHV0U3RyZWFtKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5lbnRpdHkuSW5wdXRTdHJlYW1FbnRpdHkgZXh0ZW5kcyBvcmcuYXBhY2hlLmh0dHAuZW50aXR5LkFic3RyYWN0SHR0cEVudGl0eQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVGRkVSX1NJWkUKLQotcHJpdmF0ZSBib29sZWFuIGNvbnN1bWVkCi0KLXByaXZhdGUgZmluYWwgamF2YS5pby5JbnB1dFN0cmVhbSBjb250ZW50Ci0KLXByaXZhdGUgZmluYWwgbG9uZyBsZW5ndGgKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmlvLklucHV0U3RyZWFtCi1sb25nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjb25zdW1lQ29udGVudCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmlvLklucHV0U3RyZWFtIGdldENvbnRlbnQoKQotCi1wdWJsaWMgbG9uZyBnZXRDb250ZW50TGVuZ3RoKCkKLQotcHVibGljIGJvb2xlYW4gaXNSZXBlYXRhYmxlKCkKLQotcHVibGljIGJvb2xlYW4gaXNTdHJlYW1pbmcoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB3cml0ZVRvKAotamF2YS5pby5PdXRwdXRTdHJlYW0pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmVudGl0eS5TZXJpYWxpemFibGVFbnRpdHkgZXh0ZW5kcyBvcmcuYXBhY2hlLmh0dHAuZW50aXR5LkFic3RyYWN0SHR0cEVudGl0eQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEuaW8uU2VyaWFsaXphYmxlIG9ialJlZgotCi1wcml2YXRlIGJ5dGVbXSBvYmpTZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmlvLlNlcmlhbGl6YWJsZQotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIGNyZWF0ZUJ5dGVzKAotamF2YS5pby5TZXJpYWxpemFibGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmlvLklucHV0U3RyZWFtIGdldENvbnRlbnQoKQotCi1wdWJsaWMgbG9uZyBnZXRDb250ZW50TGVuZ3RoKCkKLQotcHVibGljIGJvb2xlYW4gaXNSZXBlYXRhYmxlKCkKLQotcHVibGljIGJvb2xlYW4gaXNTdHJlYW1pbmcoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB3cml0ZVRvKAotamF2YS5pby5PdXRwdXRTdHJlYW0pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmltcGwuQWJzdHJhY3RIdHRwQ2xpZW50Q29ubmVjdGlvbiBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmh0dHAuSHR0cENsaWVudENvbm5lY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5lbnRpdHkuRW50aXR5RGVzZXJpYWxpemVyIGVudGl0eWRlc2VyaWFsaXplcgotCi1wcml2YXRlIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmVudGl0eS5FbnRpdHlTZXJpYWxpemVyIGVudGl0eXNlcmlhbGl6ZXIKLQotcHJpdmF0ZSBvcmcuYXBhY2hlLmh0dHAuaW8uU2Vzc2lvbklucHV0QnVmZmVyIGluYnVmZmVyCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5odHRwLmltcGwuSHR0cENvbm5lY3Rpb25NZXRyaWNzSW1wbCBtZXRyaWNzCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5odHRwLmlvLlNlc3Npb25PdXRwdXRCdWZmZXIgb3V0YnVmZmVyCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5odHRwLmlvLkh0dHBNZXNzYWdlV3JpdGVyIHJlcXVlc3RXcml0ZXIKLQotcHJpdmF0ZSBvcmcuYXBhY2hlLmh0dHAuaW8uSHR0cE1lc3NhZ2VQYXJzZXIgcmVzcG9uc2VQYXJzZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhc3NlcnRPcGVuKCkKLQotcHJvdGVjdGVkIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmVudGl0eS5FbnRpdHlEZXNlcmlhbGl6ZXIgY3JlYXRlRW50aXR5RGVzZXJpYWxpemVyKCkKLQotcHJvdGVjdGVkIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmVudGl0eS5FbnRpdHlTZXJpYWxpemVyIGNyZWF0ZUVudGl0eVNlcmlhbGl6ZXIoKQotCi1wcm90ZWN0ZWQgb3JnLmFwYWNoZS5odHRwLkh0dHBSZXNwb25zZUZhY3RvcnkgY3JlYXRlSHR0cFJlc3BvbnNlRmFjdG9yeSgpCi0KLXByb3RlY3RlZCBvcmcuYXBhY2hlLmh0dHAuaW8uSHR0cE1lc3NhZ2VXcml0ZXIgY3JlYXRlUmVxdWVzdFdyaXRlcigKLW9yZy5hcGFjaGUuaHR0cC5pby5TZXNzaW9uT3V0cHV0QnVmZmVyCi1vcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMpCi0KLXByb3RlY3RlZCBvcmcuYXBhY2hlLmh0dHAuaW8uSHR0cE1lc3NhZ2VQYXJzZXIgY3JlYXRlUmVzcG9uc2VQYXJzZXIoCi1vcmcuYXBhY2hlLmh0dHAuaW8uU2Vzc2lvbklucHV0QnVmZmVyCi1vcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlRmFjdG9yeQotb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBkb0ZsdXNoKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgZmx1c2goKQotCi1wdWJsaWMgb3JnLmFwYWNoZS5odHRwLkh0dHBDb25uZWN0aW9uTWV0cmljcyBnZXRNZXRyaWNzKCkKLQotcHJvdGVjdGVkIHZvaWQgaW5pdCgKLW9yZy5hcGFjaGUuaHR0cC5pby5TZXNzaW9uSW5wdXRCdWZmZXIKLW9yZy5hcGFjaGUuaHR0cC5pby5TZXNzaW9uT3V0cHV0QnVmZmVyCi1vcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIGlzUmVzcG9uc2VBdmFpbGFibGUoCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIGlzU3RhbGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvSHR0cEV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcmVjZWl2ZVJlc3BvbnNlRW50aXR5KAotb3JnLmFwYWNoZS5odHRwLkh0dHBSZXNwb25zZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL0h0dHBFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlIHJlY2VpdmVSZXNwb25zZUhlYWRlcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9IdHRwRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZW5kUmVxdWVzdEVudGl0eSgKLW9yZy5hcGFjaGUuaHR0cC5IdHRwRW50aXR5RW5jbG9zaW5nUmVxdWVzdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL0h0dHBFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNlbmRSZXF1ZXN0SGVhZGVyKAotb3JnLmFwYWNoZS5odHRwLkh0dHBSZXF1ZXN0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5pbXBsLkFic3RyYWN0SHR0cFNlcnZlckNvbm5lY3Rpb24gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmFwYWNoZS5odHRwLkh0dHBTZXJ2ZXJDb25uZWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgb3JnLmFwYWNoZS5odHRwLmltcGwuZW50aXR5LkVudGl0eURlc2VyaWFsaXplciBlbnRpdHlkZXNlcmlhbGl6ZXIKLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5lbnRpdHkuRW50aXR5U2VyaWFsaXplciBlbnRpdHlzZXJpYWxpemVyCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5odHRwLmlvLlNlc3Npb25JbnB1dEJ1ZmZlciBpbmJ1ZmZlcgotCi1wcml2YXRlIG9yZy5hcGFjaGUuaHR0cC5pbXBsLkh0dHBDb25uZWN0aW9uTWV0cmljc0ltcGwgbWV0cmljcwotCi1wcml2YXRlIG9yZy5hcGFjaGUuaHR0cC5pby5TZXNzaW9uT3V0cHV0QnVmZmVyIG91dGJ1ZmZlcgotCi1wcml2YXRlIG9yZy5hcGFjaGUuaHR0cC5pby5IdHRwTWVzc2FnZVBhcnNlciByZXF1ZXN0UGFyc2VyCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5odHRwLmlvLkh0dHBNZXNzYWdlV3JpdGVyIHJlc3BvbnNlV3JpdGVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYXNzZXJ0T3BlbigpCi0KLXByb3RlY3RlZCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5lbnRpdHkuRW50aXR5RGVzZXJpYWxpemVyIGNyZWF0ZUVudGl0eURlc2VyaWFsaXplcigpCi0KLXByb3RlY3RlZCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5lbnRpdHkuRW50aXR5U2VyaWFsaXplciBjcmVhdGVFbnRpdHlTZXJpYWxpemVyKCkKLQotcHJvdGVjdGVkIG9yZy5hcGFjaGUuaHR0cC5IdHRwUmVxdWVzdEZhY3RvcnkgY3JlYXRlSHR0cFJlcXVlc3RGYWN0b3J5KCkKLQotcHJvdGVjdGVkIG9yZy5hcGFjaGUuaHR0cC5pby5IdHRwTWVzc2FnZVBhcnNlciBjcmVhdGVSZXF1ZXN0UGFyc2VyKAotb3JnLmFwYWNoZS5odHRwLmlvLlNlc3Npb25JbnB1dEJ1ZmZlcgotb3JnLmFwYWNoZS5odHRwLkh0dHBSZXF1ZXN0RmFjdG9yeQotb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zKQotCi1wcm90ZWN0ZWQgb3JnLmFwYWNoZS5odHRwLmlvLkh0dHBNZXNzYWdlV3JpdGVyIGNyZWF0ZVJlc3BvbnNlV3JpdGVyKAotb3JnLmFwYWNoZS5odHRwLmlvLlNlc3Npb25PdXRwdXRCdWZmZXIKLW9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgZG9GbHVzaCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGZsdXNoKCkKLQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5IdHRwQ29ubmVjdGlvbk1ldHJpY3MgZ2V0TWV0cmljcygpCi0KLXByb3RlY3RlZCB2b2lkIGluaXQoCi1vcmcuYXBhY2hlLmh0dHAuaW8uU2Vzc2lvbklucHV0QnVmZmVyCi1vcmcuYXBhY2hlLmh0dHAuaW8uU2Vzc2lvbk91dHB1dEJ1ZmZlcgotb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zKQotCi1wdWJsaWMgYm9vbGVhbiBpc1N0YWxlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL0h0dHBFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHJlY2VpdmVSZXF1ZXN0RW50aXR5KAotb3JnLmFwYWNoZS5odHRwLkh0dHBFbnRpdHlFbmNsb3NpbmdSZXF1ZXN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvSHR0cEV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5IdHRwUmVxdWVzdCByZWNlaXZlUmVxdWVzdEhlYWRlcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9IdHRwRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZW5kUmVzcG9uc2VFbnRpdHkoCi1vcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvSHR0cEV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2VuZFJlc3BvbnNlSGVhZGVyKAotb3JnLmFwYWNoZS5odHRwLkh0dHBSZXNwb25zZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5EZWZhdWx0Q29ubmVjdGlvblJldXNlU3RyYXRlZ3kgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmFwYWNoZS5odHRwLkNvbm5lY3Rpb25SZXVzZVN0cmF0ZWd5Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJvdGVjdGVkIG9yZy5hcGFjaGUuaHR0cC5Ub2tlbkl0ZXJhdG9yIGNyZWF0ZVRva2VuSXRlcmF0b3IoCi1vcmcuYXBhY2hlLmh0dHAuSGVhZGVySXRlcmF0b3IpCi0KLXB1YmxpYyBib29sZWFuIGtlZXBBbGl2ZSgKLW9yZy5hcGFjaGUuaHR0cC5IdHRwUmVzcG9uc2UKLW9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwQ29udGV4dCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5Tb2NrZXRIdHRwQ2xpZW50Q29ubmVjdGlvbiBleHRlbmRzIG9yZy5hcGFjaGUuaHR0cC5pbXBsLkFic3RyYWN0SHR0cENsaWVudENvbm5lY3Rpb24gaW1wbGVtZW50cyBvcmcuYXBhY2hlLmh0dHAuSHR0cEluZXRDb25uZWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBvcGVuCi0KLXByaXZhdGUgamF2YS5uZXQuU29ja2V0IHNvY2tldAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByb3RlY3RlZCB2b2lkIGFzc2VydE5vdE9wZW4oKQotCi1wcm90ZWN0ZWQgdm9pZCBhc3NlcnRPcGVuKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgYmluZCgKLWphdmEubmV0LlNvY2tldAotb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjbG9zZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCBvcmcuYXBhY2hlLmh0dHAuaW8uU2Vzc2lvbklucHV0QnVmZmVyIGNyZWF0ZVNlc3Npb25JbnB1dEJ1ZmZlcigKLWphdmEubmV0LlNvY2tldAotaW50Ci1vcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCBvcmcuYXBhY2hlLmh0dHAuaW8uU2Vzc2lvbk91dHB1dEJ1ZmZlciBjcmVhdGVTZXNzaW9uT3V0cHV0QnVmZmVyKAotamF2YS5uZXQuU29ja2V0Ci1pbnQKLW9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcykKLQotcHVibGljIGphdmEubmV0LkluZXRBZGRyZXNzIGdldExvY2FsQWRkcmVzcygpCi0KLXB1YmxpYyBpbnQgZ2V0TG9jYWxQb3J0KCkKLQotcHVibGljIGphdmEubmV0LkluZXRBZGRyZXNzIGdldFJlbW90ZUFkZHJlc3MoKQotCi1wdWJsaWMgaW50IGdldFJlbW90ZVBvcnQoKQotCi1wcm90ZWN0ZWQgamF2YS5uZXQuU29ja2V0IGdldFNvY2tldCgpCi0KLXB1YmxpYyBpbnQgZ2V0U29ja2V0VGltZW91dCgpCi0KLXB1YmxpYyBib29sZWFuIGlzT3BlbigpCi0KLXB1YmxpYyB2b2lkIHNldFNvY2tldFRpbWVvdXQoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNodXRkb3duKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5EZWZhdWx0SHR0cENsaWVudENvbm5lY3Rpb24gZXh0ZW5kcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5Tb2NrZXRIdHRwQ2xpZW50Q29ubmVjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGJpbmQoCi1qYXZhLm5ldC5Tb2NrZXQKLW9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5pbXBsLkRlZmF1bHRIdHRwUmVxdWVzdEZhY3RvcnkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmFwYWNoZS5odHRwLkh0dHBSZXF1ZXN0RmFjdG9yeQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gUkZDMjYxNl9DT01NT05fTUVUSE9EUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gUkZDMjYxNl9FTlRJVFlfRU5DX01FVEhPRFMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZ1tdIFJGQzI2MTZfU1BFQ0lBTF9NRVRIT0RTCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIHN0YXRpYyBib29sZWFuIGlzT25lT2YoCi1qYXZhLmxhbmcuU3RyaW5nW10KLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9NZXRob2ROb3RTdXBwb3J0ZWRFeGNlcHRpb247ICkKLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlcXVlc3QgbmV3SHR0cFJlcXVlc3QoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvTWV0aG9kTm90U3VwcG9ydGVkRXhjZXB0aW9uOyApCi1wdWJsaWMgb3JnLmFwYWNoZS5odHRwLkh0dHBSZXF1ZXN0IG5ld0h0dHBSZXF1ZXN0KAotb3JnLmFwYWNoZS5odHRwLlJlcXVlc3RMaW5lKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5pbXBsLkRlZmF1bHRIdHRwUmVzcG9uc2VGYWN0b3J5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaHR0cC5IdHRwUmVzcG9uc2VGYWN0b3J5Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuUmVhc29uUGhyYXNlQ2F0YWxvZyByZWFzb25DYXRhbG9nCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5odHRwLlJlYXNvblBocmFzZUNhdGFsb2cpCi0KLXByb3RlY3RlZCBqYXZhLnV0aWwuTG9jYWxlIGRldGVybWluZUxvY2FsZSgKLW9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwQ29udGV4dCkKLQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5IdHRwUmVzcG9uc2UgbmV3SHR0cFJlc3BvbnNlKAotb3JnLmFwYWNoZS5odHRwLlByb3RvY29sVmVyc2lvbgotaW50Ci1vcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cENvbnRleHQpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlIG5ld0h0dHBSZXNwb25zZSgKLW9yZy5hcGFjaGUuaHR0cC5TdGF0dXNMaW5lCi1vcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cENvbnRleHQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmltcGwuU29ja2V0SHR0cFNlcnZlckNvbm5lY3Rpb24gZXh0ZW5kcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5BYnN0cmFjdEh0dHBTZXJ2ZXJDb25uZWN0aW9uIGltcGxlbWVudHMgb3JnLmFwYWNoZS5odHRwLkh0dHBJbmV0Q29ubmVjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gb3BlbgotCi1wcml2YXRlIGphdmEubmV0LlNvY2tldCBzb2NrZXQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcm90ZWN0ZWQgdm9pZCBhc3NlcnROb3RPcGVuKCkKLQotcHJvdGVjdGVkIHZvaWQgYXNzZXJ0T3BlbigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIGJpbmQoCi1qYXZhLm5ldC5Tb2NrZXQKLW9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY2xvc2UoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgb3JnLmFwYWNoZS5odHRwLmlvLlNlc3Npb25JbnB1dEJ1ZmZlciBjcmVhdGVIdHRwRGF0YVJlY2VpdmVyKAotamF2YS5uZXQuU29ja2V0Ci1pbnQKLW9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIG9yZy5hcGFjaGUuaHR0cC5pby5TZXNzaW9uT3V0cHV0QnVmZmVyIGNyZWF0ZUh0dHBEYXRhVHJhbnNtaXR0ZXIoCi1qYXZhLm5ldC5Tb2NrZXQKLWludAotb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zKQotCi1wdWJsaWMgamF2YS5uZXQuSW5ldEFkZHJlc3MgZ2V0TG9jYWxBZGRyZXNzKCkKLQotcHVibGljIGludCBnZXRMb2NhbFBvcnQoKQotCi1wdWJsaWMgamF2YS5uZXQuSW5ldEFkZHJlc3MgZ2V0UmVtb3RlQWRkcmVzcygpCi0KLXB1YmxpYyBpbnQgZ2V0UmVtb3RlUG9ydCgpCi0KLXByb3RlY3RlZCBqYXZhLm5ldC5Tb2NrZXQgZ2V0U29ja2V0KCkKLQotcHVibGljIGludCBnZXRTb2NrZXRUaW1lb3V0KCkKLQotcHVibGljIGJvb2xlYW4gaXNPcGVuKCkKLQotcHVibGljIHZvaWQgc2V0U29ja2V0VGltZW91dCgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2h1dGRvd24oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5pbXBsLkRlZmF1bHRIdHRwU2VydmVyQ29ubmVjdGlvbiBleHRlbmRzIG9yZy5hcGFjaGUuaHR0cC5pbXBsLlNvY2tldEh0dHBTZXJ2ZXJDb25uZWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgYmluZCgKLWphdmEubmV0LlNvY2tldAotb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmltcGwuRW5nbGlzaFJlYXNvblBocmFzZUNhdGFsb2cgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmFwYWNoZS5odHRwLlJlYXNvblBocmFzZUNhdGFsb2cKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5FbmdsaXNoUmVhc29uUGhyYXNlQ2F0YWxvZyBJTlNUQU5DRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW11bXSBSRUFTT05fUEhSQVNFUwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRSZWFzb24oCi1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFJlYXNvbigKLWludAotamF2YS51dGlsLkxvY2FsZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5IdHRwQ29ubmVjdGlvbk1ldHJpY3NJbXBsIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaHR0cC5IdHRwQ29ubmVjdGlvbk1ldHJpY3MKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFJFQ0VJVkVEX0JZVEVTX0NPVU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSRVFVRVNUX0NPVU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSRVNQT05TRV9DT1VOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0VOVF9CWVRFU19DT1VOVAotCi1wcml2YXRlIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5pby5IdHRwVHJhbnNwb3J0TWV0cmljcyBpblRyYW5zcG9ydE1ldHJpYwotCi1wcml2YXRlIGphdmEudXRpbC5IYXNoTWFwIG1ldHJpY3NDYWNoZQotCi1wcml2YXRlIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5pby5IdHRwVHJhbnNwb3J0TWV0cmljcyBvdXRUcmFuc3BvcnRNZXRyaWMKLQotcHJpdmF0ZSBsb25nIHJlcXVlc3RDb3VudAotCi1wcml2YXRlIGxvbmcgcmVzcG9uc2VDb3VudAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaHR0cC5pby5IdHRwVHJhbnNwb3J0TWV0cmljcwotb3JnLmFwYWNoZS5odHRwLmlvLkh0dHBUcmFuc3BvcnRNZXRyaWNzKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRNZXRyaWMoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgbG9uZyBnZXRSZWNlaXZlZEJ5dGVzQ291bnQoKQotCi1wdWJsaWMgbG9uZyBnZXRSZXF1ZXN0Q291bnQoKQotCi1wdWJsaWMgbG9uZyBnZXRSZXNwb25zZUNvdW50KCkKLQotcHVibGljIGxvbmcgZ2V0U2VudEJ5dGVzQ291bnQoKQotCi1wdWJsaWMgdm9pZCBpbmNyZW1lbnRSZXF1ZXN0Q291bnQoKQotCi1wdWJsaWMgdm9pZCBpbmNyZW1lbnRSZXNwb25zZUNvdW50KCkKLQotcHVibGljIHZvaWQgcmVzZXQoKQotCi1wdWJsaWMgdm9pZCBzZXRNZXRyaWMoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5pbXBsLk5vQ29ubmVjdGlvblJldXNlU3RyYXRlZ3kgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmFwYWNoZS5odHRwLkNvbm5lY3Rpb25SZXVzZVN0cmF0ZWd5Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGJvb2xlYW4ga2VlcEFsaXZlKAotb3JnLmFwYWNoZS5odHRwLkh0dHBSZXNwb25zZQotb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBDb250ZXh0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmF1dGguQXV0aFNjaGVtZUJhc2UgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmFwYWNoZS5odHRwLmF1dGguQXV0aFNjaGVtZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGJvb2xlYW4gcHJveHkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgYm9vbGVhbiBpc1Byb3h5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL2F1dGgvTWFsZm9ybWVkQ2hhbGxlbmdlRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwYXJzZUNoYWxsZW5nZSgKLW9yZy5hcGFjaGUuaHR0cC51dGlsLkNoYXJBcnJheUJ1ZmZlcgotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9hdXRoL01hbGZvcm1lZENoYWxsZW5nZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcHJvY2Vzc0NoYWxsZW5nZSgKLW9yZy5hcGFjaGUuaHR0cC5IZWFkZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmltcGwuYXV0aC5SRkMyNjE3U2NoZW1lIGV4dGVuZHMgb3JnLmFwYWNoZS5odHRwLmltcGwuYXV0aC5BdXRoU2NoZW1lQmFzZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXByaXZhdGUgamF2YS51dGlsLk1hcCBwYXJhbXMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRQYXJhbWV0ZXIoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHJvdGVjdGVkIGphdmEudXRpbC5NYXAgZ2V0UGFyYW1ldGVycygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFJlYWxtKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL2F1dGgvTWFsZm9ybWVkQ2hhbGxlbmdlRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBwYXJzZUNoYWxsZW5nZSgKLW9yZy5hcGFjaGUuaHR0cC51dGlsLkNoYXJBcnJheUJ1ZmZlcgotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmltcGwuYXV0aC5CYXNpY1NjaGVtZSBleHRlbmRzIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmF1dGguUkZDMjYxN1NjaGVtZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGJvb2xlYW4gY29tcGxldGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUuaHR0cC5IZWFkZXIgYXV0aGVudGljYXRlKAotb3JnLmFwYWNoZS5odHRwLmF1dGguQ3JlZGVudGlhbHMKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9hdXRoL0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uOyApCi1wdWJsaWMgb3JnLmFwYWNoZS5odHRwLkhlYWRlciBhdXRoZW50aWNhdGUoCi1vcmcuYXBhY2hlLmh0dHAuYXV0aC5DcmVkZW50aWFscwotb3JnLmFwYWNoZS5odHRwLkh0dHBSZXF1ZXN0KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTY2hlbWVOYW1lKCkKLQotcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpCi0KLXB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGlvbkJhc2VkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL2F1dGgvTWFsZm9ybWVkQ2hhbGxlbmdlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBwcm9jZXNzQ2hhbGxlbmdlKAotb3JnLmFwYWNoZS5odHRwLkhlYWRlcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5hdXRoLkJhc2ljU2NoZW1lRmFjdG9yeSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmh0dHAuYXV0aC5BdXRoU2NoZW1lRmFjdG9yeQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAuYXV0aC5BdXRoU2NoZW1lIG5ld0luc3RhbmNlKAotb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmF1dGguRGlnZXN0U2NoZW1lIGV4dGVuZHMgb3JnLmFwYWNoZS5odHRwLmltcGwuYXV0aC5SRkMyNjE3U2NoZW1lCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBIRVhBREVDSU1BTAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE5DCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBRT1BfQVVUSAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUU9QX0FVVEhfSU5UCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBRT1BfTUlTU0lORwotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgY25vbmNlCi0KLXByaXZhdGUgYm9vbGVhbiBjb21wbGV0ZQotCi1wcml2YXRlIGludCBxb3BWYXJpYW50Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgY3JlYXRlQ25vbmNlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL2F1dGgvQXV0aGVudGljYXRpb25FeGNlcHRpb247ICkKLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBjcmVhdGVEaWdlc3QoCi1vcmcuYXBhY2hlLmh0dHAuYXV0aC5DcmVkZW50aWFscykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL2F1dGgvQXV0aGVudGljYXRpb25FeGNlcHRpb247ICkKLXByaXZhdGUgb3JnLmFwYWNoZS5odHRwLkhlYWRlciBjcmVhdGVEaWdlc3RIZWFkZXIoCi1vcmcuYXBhY2hlLmh0dHAuYXV0aC5DcmVkZW50aWFscwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL2ltcGwvYXV0aC9VbnN1cHBvcnRlZERpZ2VzdEFsZ29yaXRobUV4Y2VwdGlvbjsgKQotcHJpdmF0ZSBzdGF0aWMgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0IGNyZWF0ZU1lc3NhZ2VEaWdlc3QoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGVuY29kZSgKLWJ5dGVbXSkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGdldENub25jZSgpCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBnZXRRb3BWYXJpYW50U3RyaW5nKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL2F1dGgvQXV0aGVudGljYXRpb25FeGNlcHRpb247ICkKLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAuSGVhZGVyIGF1dGhlbnRpY2F0ZSgKLW9yZy5hcGFjaGUuaHR0cC5hdXRoLkNyZWRlbnRpYWxzCi1vcmcuYXBhY2hlLmh0dHAuSHR0cFJlcXVlc3QpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFNjaGVtZU5hbWUoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCkKLQotcHVibGljIGJvb2xlYW4gaXNDb25uZWN0aW9uQmFzZWQoKQotCi1wdWJsaWMgdm9pZCBvdmVycmlkZVBhcmFtdGVyKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL2F1dGgvTWFsZm9ybWVkQ2hhbGxlbmdlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBwcm9jZXNzQ2hhbGxlbmdlKAotb3JnLmFwYWNoZS5odHRwLkhlYWRlcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5hdXRoLkRpZ2VzdFNjaGVtZUZhY3RvcnkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmFwYWNoZS5odHRwLmF1dGguQXV0aFNjaGVtZUZhY3RvcnkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgb3JnLmFwYWNoZS5odHRwLmF1dGguQXV0aFNjaGVtZSBuZXdJbnN0YW5jZSgKLW9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmltcGwuYXV0aC5OVExNRW5naW5lIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9pbXBsL2F1dGgvTlRMTUVuZ2luZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVUeXBlMU1zZygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9pbXBsL2F1dGgvTlRMTUVuZ2luZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVUeXBlM01zZygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmltcGwuYXV0aC5OVExNRW5naW5lRXhjZXB0aW9uIGV4dGVuZHMgb3JnLmFwYWNoZS5odHRwLmF1dGguQXV0aGVudGljYXRpb25FeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlRocm93YWJsZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL2ltcGwvYXV0aC9OVExNU2NoZW1lOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9FbnVtPExvcmcvYXBhY2hlL2h0dHAvaW1wbC9hdXRoL05UTE1TY2hlbWUkU3RhdGU7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNjQwOCBuYW1lID1TdGF0ZSApCi1maW5hbCBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5hdXRoLk5UTE1TY2hlbWUkU3RhdGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5hdXRoLk5UTE1TY2hlbWUkU3RhdGVbXSAkVkFMVUVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5odHRwLmltcGwuYXV0aC5OVExNU2NoZW1lJFN0YXRlIENIQUxMRU5HRV9SRUNFSVZFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmF1dGguTlRMTVNjaGVtZSRTdGF0ZSBGQUlMRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5hdXRoLk5UTE1TY2hlbWUkU3RhdGUgTVNHX1RZUEUxX0dFTkVSQVRFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmF1dGguTlRMTVNjaGVtZSRTdGF0ZSBNU0dfVFlQRTJfUkVDRVZJRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5hdXRoLk5UTE1TY2hlbWUkU3RhdGUgTVNHX1RZUEUzX0dFTkVSQVRFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmF1dGguTlRMTVNjaGVtZSRTdGF0ZSBVTklOSVRJQVRFRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVYgKQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5hdXRoLk5UTE1TY2hlbWUkU3RhdGUgdmFsdWVPZigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5odHRwLmltcGwuYXV0aC5OVExNU2NoZW1lJFN0YXRlW10gdmFsdWVzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvaW1wbC9hdXRoL05UTE1TY2hlbWUkU3RhdGU7ICkKLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5hdXRoLk5UTE1TY2hlbWUgZXh0ZW5kcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5hdXRoLkF1dGhTY2hlbWVCYXNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBjaGFsbGVuZ2UKLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5hdXRoLk5UTE1FbmdpbmUgZW5naW5lCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5odHRwLmltcGwuYXV0aC5OVExNU2NoZW1lJFN0YXRlIHN0YXRlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5odHRwLmltcGwuYXV0aC5OVExNRW5naW5lKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvYXV0aC9BdXRoZW50aWNhdGlvbkV4Y2VwdGlvbjsgKQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5IZWFkZXIgYXV0aGVudGljYXRlKAotb3JnLmFwYWNoZS5odHRwLmF1dGguQ3JlZGVudGlhbHMKLW9yZy5hcGFjaGUuaHR0cC5IdHRwUmVxdWVzdCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UGFyYW1ldGVyKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UmVhbG0oKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTY2hlbWVOYW1lKCkKLQotcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpCi0KLXB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGlvbkJhc2VkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL2F1dGgvTWFsZm9ybWVkQ2hhbGxlbmdlRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBwYXJzZUNoYWxsZW5nZSgKLW9yZy5hcGFjaGUuaHR0cC51dGlsLkNoYXJBcnJheUJ1ZmZlcgotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmltcGwuYXV0aC5VbnN1cHBvcnRlZERpZ2VzdEFsZ29yaXRobUV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmltcGwuY2xpZW50LkFic3RyYWN0QXV0aGVudGljYXRpb25IYW5kbGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaHR0cC5jbGllbnQuQXV0aGVudGljYXRpb25IYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9MaXN0PExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEudXRpbC5MaXN0IERFRkFVTFRfU0NIRU1FX1BSSU9SSVRZCi0KLXByaXZhdGUgZmluYWwgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvTGlzdDxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wcm90ZWN0ZWQgamF2YS51dGlsLkxpc3QgZ2V0QXV0aFByZWZlcmVuY2VzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL2F1dGgvTWFsZm9ybWVkQ2hhbGxlbmdlRXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFtMb3JnL2FwYWNoZS9odHRwL0hlYWRlcjspTGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TG9yZy9hcGFjaGUvaHR0cC9IZWFkZXI7PjsgKQotcHJvdGVjdGVkIGphdmEudXRpbC5NYXAgcGFyc2VDaGFsbGVuZ2VzKAotb3JnLmFwYWNoZS5odHRwLkhlYWRlcltdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvYXV0aC9BdXRoZW50aWNhdGlvbkV4Y2VwdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMb3JnL2FwYWNoZS9odHRwL0hlYWRlcjs+O0xvcmcvYXBhY2hlL2h0dHAvSHR0cFJlc3BvbnNlO0xvcmcvYXBhY2hlL2h0dHAvcHJvdG9jb2wvSHR0cENvbnRleHQ7KUxvcmcvYXBhY2hlL2h0dHAvYXV0aC9BdXRoU2NoZW1lOyApCi1wdWJsaWMgb3JnLmFwYWNoZS5odHRwLmF1dGguQXV0aFNjaGVtZSBzZWxlY3RTY2hlbWUoCi1qYXZhLnV0aWwuTWFwCi1vcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlCi1vcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cENvbnRleHQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmltcGwuY2xpZW50LkJhc2ljQ29va2llU3RvcmUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5Db29raWVTdG9yZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQ29tcGFyYXRvcjxMb3JnL2FwYWNoZS9odHRwL2Nvb2tpZS9Db29raWU7PjsgKQotcHJpdmF0ZSBmaW5hbCBqYXZhLnV0aWwuQ29tcGFyYXRvciBjb29raWVDb21wYXJhdG9yCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9BcnJheUxpc3Q8TG9yZy9hcGFjaGUvaHR0cC9jb29raWUvQ29va2llOz47ICkKLXByaXZhdGUgZmluYWwgamF2YS51dGlsLkFycmF5TGlzdCBjb29raWVzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgYWRkQ29va2llKAotb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5Db29raWUpCi0KLXB1YmxpYyB2b2lkIGFkZENvb2tpZXMoCi1vcmcuYXBhY2hlLmh0dHAuY29va2llLkNvb2tpZVtdKQotCi1wdWJsaWMgdm9pZCBjbGVhcigpCi0KLXB1YmxpYyBib29sZWFuIGNsZWFyRXhwaXJlZCgKLWphdmEudXRpbC5EYXRlKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9MaXN0PExvcmcvYXBhY2hlL2h0dHAvY29va2llL0Nvb2tpZTs+OyApCi1wdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0Q29va2llcygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jbGllbnQuQmFzaWNDcmVkZW50aWFsc1Byb3ZpZGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaHR0cC5jbGllbnQuQ3JlZGVudGlhbHNQcm92aWRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaE1hcDxMb3JnL2FwYWNoZS9odHRwL2F1dGgvQXV0aFNjb3BlO0xvcmcvYXBhY2hlL2h0dHAvYXV0aC9DcmVkZW50aWFsczs+OyApCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5IYXNoTWFwIGNyZWRNYXAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0hhc2hNYXA8TG9yZy9hcGFjaGUvaHR0cC9hdXRoL0F1dGhTY29wZTtMb3JnL2FwYWNoZS9odHRwL2F1dGgvQ3JlZGVudGlhbHM7PjtMb3JnL2FwYWNoZS9odHRwL2F1dGgvQXV0aFNjb3BlOylMb3JnL2FwYWNoZS9odHRwL2F1dGgvQ3JlZGVudGlhbHM7ICkKLXByaXZhdGUgc3RhdGljIG9yZy5hcGFjaGUuaHR0cC5hdXRoLkNyZWRlbnRpYWxzIG1hdGNoQ3JlZGVudGlhbHMoCi1qYXZhLnV0aWwuSGFzaE1hcAotb3JnLmFwYWNoZS5odHRwLmF1dGguQXV0aFNjb3BlKQotCi1wdWJsaWMgdm9pZCBjbGVhcigpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAuYXV0aC5DcmVkZW50aWFscyBnZXRDcmVkZW50aWFscygKLW9yZy5hcGFjaGUuaHR0cC5hdXRoLkF1dGhTY29wZSkKLQotcHVibGljIHZvaWQgc2V0Q3JlZGVudGlhbHMoCi1vcmcuYXBhY2hlLmh0dHAuYXV0aC5BdXRoU2NvcGUKLW9yZy5hcGFjaGUuaHR0cC5hdXRoLkNyZWRlbnRpYWxzKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xvcmcvYXBhY2hlL2h0dHAvY2xpZW50L1Jlc3BvbnNlSGFuZGxlcjxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmltcGwuY2xpZW50LkJhc2ljUmVzcG9uc2VIYW5kbGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaHR0cC5jbGllbnQuUmVzcG9uc2VIYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL2NsaWVudC9DbGllbnRQcm90b2NvbEV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgaGFuZGxlUmVzcG9uc2UoCi1vcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvY2xpZW50L0h0dHBSZXNwb25zZUV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgaGFuZGxlUmVzcG9uc2UoCi1vcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IG9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcyBjb3B5KCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZ2V0Qm9vbGVhblBhcmFtZXRlcigKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4pCi0KLXB1YmxpYyBhYnN0cmFjdCBkb3VibGUgZ2V0RG91YmxlUGFyYW1ldGVyKAotamF2YS5sYW5nLlN0cmluZwotZG91YmxlKQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldEludFBhcmFtZXRlcigKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIGFic3RyYWN0IGxvbmcgZ2V0TG9uZ1BhcmFtZXRlcigKLWphdmEubGFuZy5TdHJpbmcKLWxvbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuT2JqZWN0IGdldFBhcmFtZXRlcigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzUGFyYW1ldGVyRmFsc2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1BhcmFtZXRlclRydWUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiByZW1vdmVQYXJhbWV0ZXIoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zIHNldEJvb2xlYW5QYXJhbWV0ZXIoCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuKQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zIHNldERvdWJsZVBhcmFtZXRlcigKLWphdmEubGFuZy5TdHJpbmcKLWRvdWJsZSkKLQotcHVibGljIGFic3RyYWN0IG9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcyBzZXRJbnRQYXJhbWV0ZXIoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMgc2V0TG9uZ1BhcmFtZXRlcigKLWphdmEubGFuZy5TdHJpbmcKLWxvbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMgc2V0UGFyYW1ldGVyKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkFic3RyYWN0SHR0cFBhcmFtcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuUGFyYW1ldGVyKAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotcHVibGljIGRvdWJsZSBnZXREb3VibGVQYXJhbWV0ZXIoCi1qYXZhLmxhbmcuU3RyaW5nCi1kb3VibGUpCi0KLXB1YmxpYyBpbnQgZ2V0SW50UGFyYW1ldGVyKAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgbG9uZyBnZXRMb25nUGFyYW1ldGVyKAotamF2YS5sYW5nLlN0cmluZwotbG9uZykKLQotcHVibGljIGJvb2xlYW4gaXNQYXJhbWV0ZXJGYWxzZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBib29sZWFuIGlzUGFyYW1ldGVyVHJ1ZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMgc2V0Qm9vbGVhblBhcmFtZXRlcigKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4pCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMgc2V0RG91YmxlUGFyYW1ldGVyKAotamF2YS5sYW5nLlN0cmluZwotZG91YmxlKQotCi1wdWJsaWMgb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zIHNldEludFBhcmFtZXRlcigKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcyBzZXRMb25nUGFyYW1ldGVyKAotamF2YS5sYW5nLlN0cmluZwotbG9uZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jbGllbnQuQ2xpZW50UGFyYW1zU3RhY2sgZXh0ZW5kcyBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkFic3RyYWN0SHR0cFBhcmFtcwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgZmluYWwgb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zIGFwcGxpY2F0aW9uUGFyYW1zCi0KLXByb3RlY3RlZCBmaW5hbCBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMgY2xpZW50UGFyYW1zCi0KLXByaXZhdGUgZmluYWwgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZwotCi1wcm90ZWN0ZWQgZmluYWwgb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zIG92ZXJyaWRlUGFyYW1zCi0KLXByb3RlY3RlZCBmaW5hbCBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMgcmVxdWVzdFBhcmFtcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaHR0cC5pbXBsLmNsaWVudC5DbGllbnRQYXJhbXNTdGFjaykKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5odHRwLmltcGwuY2xpZW50LkNsaWVudFBhcmFtc1N0YWNrCi1vcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMKLW9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcwotb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zCi1vcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcwotb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zCi1vcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMKLW9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcykKLQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcyBjb3B5KCkKLQotcHVibGljIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcyBnZXRBcHBsaWNhdGlvblBhcmFtcygpCi0KLXB1YmxpYyBmaW5hbCBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMgZ2V0Q2xpZW50UGFyYW1zKCkKLQotcHVibGljIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcyBnZXRPdmVycmlkZVBhcmFtcygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldFBhcmFtZXRlcigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBmaW5hbCBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMgZ2V0UmVxdWVzdFBhcmFtcygpCi0KLXB1YmxpYyBib29sZWFuIHJlbW92ZVBhcmFtZXRlcigKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbjsgKQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcyBzZXRQYXJhbWV0ZXIoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNsaWVudC5EZWZhdWx0Q29ubmVjdGlvbktlZXBBbGl2ZVN0cmF0ZWd5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaHR0cC5jb25uLkNvbm5lY3Rpb25LZWVwQWxpdmVTdHJhdGVneQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBsb25nIGdldEtlZXBBbGl2ZUR1cmF0aW9uKAotb3JnLmFwYWNoZS5odHRwLkh0dHBSZXNwb25zZQotb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBDb250ZXh0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNsaWVudC5EZWZhdWx0SHR0cFJlcXVlc3RSZXRyeUhhbmRsZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5IdHRwUmVxdWVzdFJldHJ5SGFuZGxlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGJvb2xlYW4gcmVxdWVzdFNlbnRSZXRyeUVuYWJsZWQKLQotcHJpdmF0ZSBmaW5hbCBpbnQgcmV0cnlDb3VudAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotYm9vbGVhbikKLQotcHVibGljIGludCBnZXRSZXRyeUNvdW50KCkKLQotcHVibGljIGJvb2xlYW4gaXNSZXF1ZXN0U2VudFJldHJ5RW5hYmxlZCgpCi0KLXB1YmxpYyBib29sZWFuIHJldHJ5UmVxdWVzdCgKLWphdmEuaW8uSU9FeGNlcHRpb24KLWludAotb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBDb250ZXh0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNsaWVudC5EZWZhdWx0UHJveHlBdXRoZW50aWNhdGlvbkhhbmRsZXIgZXh0ZW5kcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jbGllbnQuQWJzdHJhY3RBdXRoZW50aWNhdGlvbkhhbmRsZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvYXV0aC9NYWxmb3JtZWRDaGFsbGVuZ2VFeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTG9yZy9hcGFjaGUvaHR0cC9IdHRwUmVzcG9uc2U7TG9yZy9hcGFjaGUvaHR0cC9wcm90b2NvbC9IdHRwQ29udGV4dDspTGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TG9yZy9hcGFjaGUvaHR0cC9IZWFkZXI7PjsgKQotcHVibGljIGphdmEudXRpbC5NYXAgZ2V0Q2hhbGxlbmdlcygKLW9yZy5hcGFjaGUuaHR0cC5IdHRwUmVzcG9uc2UKLW9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwQ29udGV4dCkKLQotcHVibGljIGJvb2xlYW4gaXNBdXRoZW50aWNhdGlvblJlcXVlc3RlZCgKLW9yZy5hcGFjaGUuaHR0cC5IdHRwUmVzcG9uc2UKLW9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwQ29udGV4dCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jbGllbnQuRGVmYXVsdFJlZGlyZWN0SGFuZGxlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmh0dHAuY2xpZW50LlJlZGlyZWN0SGFuZGxlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFJFRElSRUNUX0xPQ0FUSU9OUwotCi1wcml2YXRlIGZpbmFsIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBsb2cKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvUHJvdG9jb2xFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLm5ldC5VUkkgZ2V0TG9jYXRpb25VUkkoCi1vcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlCi1vcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cENvbnRleHQpCi0KLXB1YmxpYyBib29sZWFuIGlzUmVkaXJlY3RSZXF1ZXN0ZWQoCi1vcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlCi1vcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cENvbnRleHQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmltcGwuY2xpZW50LkRlZmF1bHRSZXF1ZXN0RGlyZWN0b3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5SZXF1ZXN0RGlyZWN0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5jb25uLkNsaWVudENvbm5lY3Rpb25NYW5hZ2VyIGNvbm5NYW5hZ2VyCi0KLXByb3RlY3RlZCBmaW5hbCBvcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cFByb2Nlc3NvciBodHRwUHJvY2Vzc29yCi0KLXByb3RlY3RlZCBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuY29ubi5Db25uZWN0aW9uS2VlcEFsaXZlU3RyYXRlZ3kga2VlcEFsaXZlU3RyYXRlZ3kKLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgbG9nCi0KLXByb3RlY3RlZCBvcmcuYXBhY2hlLmh0dHAuY29ubi5NYW5hZ2VkQ2xpZW50Q29ubmVjdGlvbiBtYW5hZ2VkQ29ubgotCi1wcml2YXRlIGludCBtYXhSZWRpcmVjdHMKLQotcHJvdGVjdGVkIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcyBwYXJhbXMKLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50LkF1dGhlbnRpY2F0aW9uSGFuZGxlciBwcm94eUF1dGhIYW5kbGVyCi0KLXByaXZhdGUgZmluYWwgb3JnLmFwYWNoZS5odHRwLmF1dGguQXV0aFN0YXRlIHByb3h5QXV0aFN0YXRlCi0KLXByaXZhdGUgaW50IHJlZGlyZWN0Q291bnQKLQotcHJvdGVjdGVkIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5jbGllbnQuUmVkaXJlY3RIYW5kbGVyIHJlZGlyZWN0SGFuZGxlcgotCi1wcm90ZWN0ZWQgZmluYWwgb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBSZXF1ZXN0RXhlY3V0b3IgcmVxdWVzdEV4ZWMKLQotcHJvdGVjdGVkIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5jbGllbnQuSHR0cFJlcXVlc3RSZXRyeUhhbmRsZXIgcmV0cnlIYW5kbGVyCi0KLXByb3RlY3RlZCBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuQ29ubmVjdGlvblJldXNlU3RyYXRlZ3kgcmV1c2VTdHJhdGVneQotCi1wcm90ZWN0ZWQgZmluYWwgb3JnLmFwYWNoZS5odHRwLmNvbm4ucm91dGluZy5IdHRwUm91dGVQbGFubmVyIHJvdXRlUGxhbm5lcgotCi1wcml2YXRlIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5jbGllbnQuQXV0aGVudGljYXRpb25IYW5kbGVyIHRhcmdldEF1dGhIYW5kbGVyCi0KLXByaXZhdGUgZmluYWwgb3JnLmFwYWNoZS5odHRwLmF1dGguQXV0aFN0YXRlIHRhcmdldEF1dGhTdGF0ZQotCi1wcml2YXRlIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5jbGllbnQuVXNlclRva2VuSGFuZGxlciB1c2VyVG9rZW5IYW5kbGVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBSZXF1ZXN0RXhlY3V0b3IKLW9yZy5hcGFjaGUuaHR0cC5jb25uLkNsaWVudENvbm5lY3Rpb25NYW5hZ2VyCi1vcmcuYXBhY2hlLmh0dHAuQ29ubmVjdGlvblJldXNlU3RyYXRlZ3kKLW9yZy5hcGFjaGUuaHR0cC5jb25uLkNvbm5lY3Rpb25LZWVwQWxpdmVTdHJhdGVneQotb3JnLmFwYWNoZS5odHRwLmNvbm4ucm91dGluZy5IdHRwUm91dGVQbGFubmVyCi1vcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cFByb2Nlc3Nvcgotb3JnLmFwYWNoZS5odHRwLmNsaWVudC5IdHRwUmVxdWVzdFJldHJ5SGFuZGxlcgotb3JnLmFwYWNoZS5odHRwLmNsaWVudC5SZWRpcmVjdEhhbmRsZXIKLW9yZy5hcGFjaGUuaHR0cC5jbGllbnQuQXV0aGVudGljYXRpb25IYW5kbGVyCi1vcmcuYXBhY2hlLmh0dHAuY2xpZW50LkF1dGhlbnRpY2F0aW9uSGFuZGxlcgotb3JnLmFwYWNoZS5odHRwLmNsaWVudC5Vc2VyVG9rZW5IYW5kbGVyCi1vcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMpCi0KLXByaXZhdGUgdm9pZCBhYm9ydENvbm5lY3Rpb24oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMb3JnL2FwYWNoZS9odHRwL0hlYWRlcjs+O0xvcmcvYXBhY2hlL2h0dHAvYXV0aC9BdXRoU3RhdGU7TG9yZy9hcGFjaGUvaHR0cC9jbGllbnQvQXV0aGVudGljYXRpb25IYW5kbGVyO0xvcmcvYXBhY2hlL2h0dHAvSHR0cFJlc3BvbnNlO0xvcmcvYXBhY2hlL2h0dHAvcHJvdG9jb2wvSHR0cENvbnRleHQ7KVYgKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvYXV0aC9NYWxmb3JtZWRDaGFsbGVuZ2VFeGNlcHRpb247TG9yZy9hcGFjaGUvaHR0cC9hdXRoL0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgcHJvY2Vzc0NoYWxsZW5nZXMoCi1qYXZhLnV0aWwuTWFwCi1vcmcuYXBhY2hlLmh0dHAuYXV0aC5BdXRoU3RhdGUKLW9yZy5hcGFjaGUuaHR0cC5jbGllbnQuQXV0aGVudGljYXRpb25IYW5kbGVyCi1vcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlCi1vcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cENvbnRleHQpCi0KLXByaXZhdGUgdm9pZCB1cGRhdGVBdXRoU3RhdGUoCi1vcmcuYXBhY2hlLmh0dHAuYXV0aC5BdXRoU3RhdGUKLW9yZy5hcGFjaGUuaHR0cC5IdHRwSG9zdAotb3JnLmFwYWNoZS5odHRwLmNsaWVudC5DcmVkZW50aWFsc1Byb3ZpZGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvUHJvdG9jb2xFeGNlcHRpb247ICkKLXByaXZhdGUgb3JnLmFwYWNoZS5odHRwLmltcGwuY2xpZW50LlJlcXVlc3RXcmFwcGVyIHdyYXBSZXF1ZXN0KAotb3JnLmFwYWNoZS5odHRwLkh0dHBSZXF1ZXN0KQotCi1wcm90ZWN0ZWQgb3JnLmFwYWNoZS5odHRwLkh0dHBSZXF1ZXN0IGNyZWF0ZUNvbm5lY3RSZXF1ZXN0KAotb3JnLmFwYWNoZS5odHRwLmNvbm4ucm91dGluZy5IdHRwUm91dGUKLW9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwQ29udGV4dCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL0h0dHBFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCBib29sZWFuIGNyZWF0ZVR1bm5lbFRvUHJveHkoCi1vcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLkh0dHBSb3V0ZQotaW50Ci1vcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cENvbnRleHQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9IdHRwRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgYm9vbGVhbiBjcmVhdGVUdW5uZWxUb1RhcmdldCgKLW9yZy5hcGFjaGUuaHR0cC5jb25uLnJvdXRpbmcuSHR0cFJvdXRlCi1vcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cENvbnRleHQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9IdHRwRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgb3JnLmFwYWNoZS5odHRwLmNvbm4ucm91dGluZy5IdHRwUm91dGUgZGV0ZXJtaW5lUm91dGUoCi1vcmcuYXBhY2hlLmh0dHAuSHR0cEhvc3QKLW9yZy5hcGFjaGUuaHR0cC5IdHRwUmVxdWVzdAotb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBDb250ZXh0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvSHR0cEV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgZXN0YWJsaXNoUm91dGUoCi1vcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLkh0dHBSb3V0ZQotb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBDb250ZXh0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvSHR0cEV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5IdHRwUmVzcG9uc2UgZXhlY3V0ZSgKLW9yZy5hcGFjaGUuaHR0cC5IdHRwSG9zdAotb3JnLmFwYWNoZS5odHRwLkh0dHBSZXF1ZXN0Ci1vcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cENvbnRleHQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9IdHRwRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgb3JnLmFwYWNoZS5odHRwLmltcGwuY2xpZW50LlJvdXRlZFJlcXVlc3QgaGFuZGxlUmVzcG9uc2UoCi1vcmcuYXBhY2hlLmh0dHAuaW1wbC5jbGllbnQuUm91dGVkUmVxdWVzdAotb3JnLmFwYWNoZS5odHRwLkh0dHBSZXNwb25zZQotb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBDb250ZXh0KQotCi1wcm90ZWN0ZWQgdm9pZCByZWxlYXNlQ29ubmVjdGlvbigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9Qcm90b2NvbEV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgcmV3cml0ZVJlcXVlc3RVUkkoCi1vcmcuYXBhY2hlLmh0dHAuaW1wbC5jbGllbnQuUmVxdWVzdFdyYXBwZXIKLW9yZy5hcGFjaGUuaHR0cC5jb25uLnJvdXRpbmcuSHR0cFJvdXRlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNsaWVudC5EZWZhdWx0VGFyZ2V0QXV0aGVudGljYXRpb25IYW5kbGVyIGV4dGVuZHMgb3JnLmFwYWNoZS5odHRwLmltcGwuY2xpZW50LkFic3RyYWN0QXV0aGVudGljYXRpb25IYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTG9yZy9hcGFjaGUvaHR0cC9IdHRwUmVzcG9uc2U7TG9yZy9hcGFjaGUvaHR0cC9wcm90b2NvbC9IdHRwQ29udGV4dDspTGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TG9yZy9hcGFjaGUvaHR0cC9IZWFkZXI7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvYXV0aC9NYWxmb3JtZWRDaGFsbGVuZ2VFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnV0aWwuTWFwIGdldENoYWxsZW5nZXMoCi1vcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlCi1vcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cENvbnRleHQpCi0KLXB1YmxpYyBib29sZWFuIGlzQXV0aGVudGljYXRpb25SZXF1ZXN0ZWQoCi1vcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlCi1vcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cENvbnRleHQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmltcGwuY2xpZW50LkRlZmF1bHRVc2VyVG9rZW5IYW5kbGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaHR0cC5jbGllbnQuVXNlclRva2VuSGFuZGxlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgc3RhdGljIGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsIGdldEF1dGhQcmluY2lwYWwoCi1vcmcuYXBhY2hlLmh0dHAuYXV0aC5BdXRoU3RhdGUpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldFVzZXJUb2tlbigKLW9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwQ29udGV4dCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jbGllbnQuUmVxdWVzdFdyYXBwZXIgZXh0ZW5kcyBvcmcuYXBhY2hlLmh0dHAubWVzc2FnZS5BYnN0cmFjdEh0dHBNZXNzYWdlIGltcGxlbWVudHMgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5tZXRob2RzLkh0dHBVcmlSZXF1ZXN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgaW50IGV4ZWNDb3VudAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbWV0aG9kCi0KLXByaXZhdGUgZmluYWwgb3JnLmFwYWNoZS5odHRwLkh0dHBSZXF1ZXN0IG9yaWdpbmFsCi0KLXByaXZhdGUgamF2YS5uZXQuVVJJIHVyaQotCi1wcml2YXRlIG9yZy5hcGFjaGUuaHR0cC5Qcm90b2NvbFZlcnNpb24gdmVyc2lvbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9Qcm90b2NvbEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5odHRwLkh0dHBSZXF1ZXN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGFib3J0KCkKLQotcHVibGljIGludCBnZXRFeGVjQ291bnQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRNZXRob2QoKQotCi1wdWJsaWMgb3JnLmFwYWNoZS5odHRwLkh0dHBSZXF1ZXN0IGdldE9yaWdpbmFsKCkKLQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5Qcm90b2NvbFZlcnNpb24gZ2V0UHJvdG9jb2xWZXJzaW9uKCkKLQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5SZXF1ZXN0TGluZSBnZXRSZXF1ZXN0TGluZSgpCi0KLXB1YmxpYyBqYXZhLm5ldC5VUkkgZ2V0VVJJKCkKLQotcHVibGljIHZvaWQgaW5jcmVtZW50RXhlY0NvdW50KCkKLQotcHVibGljIGJvb2xlYW4gaXNBYm9ydGVkKCkKLQotcHVibGljIGJvb2xlYW4gaXNSZXBlYXRhYmxlKCkKLQotcHVibGljIHZvaWQgcmVzZXRIZWFkZXJzKCkKLQotcHVibGljIHZvaWQgc2V0TWV0aG9kKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0UHJvdG9jb2xWZXJzaW9uKAotb3JnLmFwYWNoZS5odHRwLlByb3RvY29sVmVyc2lvbikKLQotcHVibGljIHZvaWQgc2V0VVJJKAotamF2YS5uZXQuVVJJKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNsaWVudC5FbnRpdHlFbmNsb3NpbmdSZXF1ZXN0V3JhcHBlciBleHRlbmRzIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNsaWVudC5SZXF1ZXN0V3JhcHBlciBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaHR0cC5IdHRwRW50aXR5RW5jbG9zaW5nUmVxdWVzdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIG9yZy5hcGFjaGUuaHR0cC5IdHRwRW50aXR5IGVudGl0eQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9Qcm90b2NvbEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5odHRwLkh0dHBFbnRpdHlFbmNsb3NpbmdSZXF1ZXN0KQotCi1wdWJsaWMgYm9vbGVhbiBleHBlY3RDb250aW51ZSgpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAuSHR0cEVudGl0eSBnZXRFbnRpdHkoKQotCi1wdWJsaWMgYm9vbGVhbiBpc1JlcGVhdGFibGUoKQotCi1wdWJsaWMgdm9pZCBzZXRFbnRpdHkoCi1vcmcuYXBhY2hlLmh0dHAuSHR0cEVudGl0eSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jbGllbnQuUmVkaXJlY3RMb2NhdGlvbnMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9TZXQ8TGphdmEvbmV0L1VSSTs+OyApCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5TZXQgdXJpcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIGFkZCgKLWphdmEubmV0LlVSSSkKLQotcHVibGljIGJvb2xlYW4gY29udGFpbnMoCi1qYXZhLm5ldC5VUkkpCi0KLXB1YmxpYyBib29sZWFuIHJlbW92ZSgKLWphdmEubmV0LlVSSSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jbGllbnQuUm91dGVkUmVxdWVzdCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNsaWVudC5SZXF1ZXN0V3JhcHBlciByZXF1ZXN0Ci0KLXByb3RlY3RlZCBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLkh0dHBSb3V0ZSByb3V0ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaHR0cC5pbXBsLmNsaWVudC5SZXF1ZXN0V3JhcHBlcgotb3JnLmFwYWNoZS5odHRwLmNvbm4ucm91dGluZy5IdHRwUm91dGUpCi0KLXB1YmxpYyBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jbGllbnQuUmVxdWVzdFdyYXBwZXIgZ2V0UmVxdWVzdCgpCi0KLXB1YmxpYyBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLkh0dHBSb3V0ZSBnZXRSb3V0ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmltcGwuY2xpZW50LlR1bm5lbFJlZnVzZWRFeGNlcHRpb24gZXh0ZW5kcyBvcmcuYXBhY2hlLmh0dHAuSHR0cEV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlIHJlc3BvbnNlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotb3JnLmFwYWNoZS5odHRwLkh0dHBSZXNwb25zZSkKLQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5IdHRwUmVzcG9uc2UgZ2V0UmVzcG9uc2UoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvbm4uQWJzdHJhY3RDbGllbnRDb25uQWRhcHRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmh0dHAuY29ubi5NYW5hZ2VkQ2xpZW50Q29ubmVjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gYWJvcnRlZAotCi1wcml2YXRlIHZvbGF0aWxlIG9yZy5hcGFjaGUuaHR0cC5jb25uLkNsaWVudENvbm5lY3Rpb25NYW5hZ2VyIGNvbm5NYW5hZ2VyCi0KLXByaXZhdGUgdm9sYXRpbGUgbG9uZyBkdXJhdGlvbgotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5UaHJlYWQgZXhlY3V0aW9uVGhyZWFkCi0KLXByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBtYXJrZWRSZXVzYWJsZQotCi1wcml2YXRlIHZvbGF0aWxlIG9yZy5hcGFjaGUuaHR0cC5jb25uLk9wZXJhdGVkQ2xpZW50Q29ubmVjdGlvbiB3cmFwcGVkQ29ubmVjdGlvbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaHR0cC5jb25uLkNsaWVudENvbm5lY3Rpb25NYW5hZ2VyCi1vcmcuYXBhY2hlLmh0dHAuY29ubi5PcGVyYXRlZENsaWVudENvbm5lY3Rpb24pCi0KLXB1YmxpYyB2b2lkIGFib3J0Q29ubmVjdGlvbigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGZpbmFsIHZvaWQgYXNzZXJ0Tm90QWJvcnRlZCgpCi0KLXByb3RlY3RlZCBmaW5hbCB2b2lkIGFzc2VydFZhbGlkKAotb3JnLmFwYWNoZS5odHRwLmNvbm4uT3BlcmF0ZWRDbGllbnRDb25uZWN0aW9uKQotCi1wcm90ZWN0ZWQgdm9pZCBkZXRhY2goKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBmbHVzaCgpCi0KLXB1YmxpYyBqYXZhLm5ldC5JbmV0QWRkcmVzcyBnZXRMb2NhbEFkZHJlc3MoKQotCi1wdWJsaWMgaW50IGdldExvY2FsUG9ydCgpCi0KLXByb3RlY3RlZCBvcmcuYXBhY2hlLmh0dHAuY29ubi5DbGllbnRDb25uZWN0aW9uTWFuYWdlciBnZXRNYW5hZ2VyKCkKLQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5IdHRwQ29ubmVjdGlvbk1ldHJpY3MgZ2V0TWV0cmljcygpCi0KLXB1YmxpYyBqYXZhLm5ldC5JbmV0QWRkcmVzcyBnZXRSZW1vdGVBZGRyZXNzKCkKLQotcHVibGljIGludCBnZXRSZW1vdGVQb3J0KCkKLQotcHVibGljIGphdmF4Lm5ldC5zc2wuU1NMU2Vzc2lvbiBnZXRTU0xTZXNzaW9uKCkKLQotcHVibGljIGludCBnZXRTb2NrZXRUaW1lb3V0KCkKLQotcHJvdGVjdGVkIG9yZy5hcGFjaGUuaHR0cC5jb25uLk9wZXJhdGVkQ2xpZW50Q29ubmVjdGlvbiBnZXRXcmFwcGVkQ29ubmVjdGlvbigpCi0KLXB1YmxpYyBib29sZWFuIGlzTWFya2VkUmV1c2FibGUoKQotCi1wdWJsaWMgYm9vbGVhbiBpc09wZW4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBpc1Jlc3BvbnNlQXZhaWxhYmxlKAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBpc1NlY3VyZSgpCi0KLXB1YmxpYyBib29sZWFuIGlzU3RhbGUoKQotCi1wdWJsaWMgdm9pZCBtYXJrUmV1c2FibGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvSHR0cEV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcmVjZWl2ZVJlc3BvbnNlRW50aXR5KAotb3JnLmFwYWNoZS5odHRwLkh0dHBSZXNwb25zZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL0h0dHBFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlIHJlY2VpdmVSZXNwb25zZUhlYWRlcigpCi0KLXB1YmxpYyB2b2lkIHJlbGVhc2VDb25uZWN0aW9uKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL0h0dHBFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNlbmRSZXF1ZXN0RW50aXR5KAotb3JnLmFwYWNoZS5odHRwLkh0dHBFbnRpdHlFbmNsb3NpbmdSZXF1ZXN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvSHR0cEV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2VuZFJlcXVlc3RIZWFkZXIoCi1vcmcuYXBhY2hlLmh0dHAuSHR0cFJlcXVlc3QpCi0KLXB1YmxpYyB2b2lkIHNldElkbGVEdXJhdGlvbigKLWxvbmcKLWphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0KQotCi1wdWJsaWMgdm9pZCBzZXRTb2NrZXRUaW1lb3V0KAotaW50KQotCi1wdWJsaWMgdm9pZCB1bm1hcmtSZXVzYWJsZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmltcGwuY29ubi5BYnN0cmFjdFBvb2xFbnRyeSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5jb25uLkNsaWVudENvbm5lY3Rpb25PcGVyYXRvciBjb25uT3BlcmF0b3IKLQotcHJvdGVjdGVkIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5jb25uLk9wZXJhdGVkQ2xpZW50Q29ubmVjdGlvbiBjb25uZWN0aW9uCi0KLXByb3RlY3RlZCB2b2xhdGlsZSBvcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLkh0dHBSb3V0ZSByb3V0ZQotCi1wcm90ZWN0ZWQgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBzdGF0ZQotCi1wcm90ZWN0ZWQgdm9sYXRpbGUgb3JnLmFwYWNoZS5odHRwLmNvbm4ucm91dGluZy5Sb3V0ZVRyYWNrZXIgdHJhY2tlcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaHR0cC5jb25uLkNsaWVudENvbm5lY3Rpb25PcGVyYXRvcgotb3JnLmFwYWNoZS5odHRwLmNvbm4ucm91dGluZy5IdHRwUm91dGUpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldFN0YXRlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgbGF5ZXJQcm90b2NvbCgKLW9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwQ29udGV4dAotb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBvcGVuKAotb3JnLmFwYWNoZS5odHRwLmNvbm4ucm91dGluZy5IdHRwUm91dGUKLW9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwQ29udGV4dAotb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zKQotCi1wdWJsaWMgdm9pZCBzZXRTdGF0ZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXByb3RlY3RlZCB2b2lkIHNodXRkb3duRW50cnkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB0dW5uZWxQcm94eSgKLW9yZy5hcGFjaGUuaHR0cC5IdHRwSG9zdAotYm9vbGVhbgotb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB0dW5uZWxUYXJnZXQoCi1ib29sZWFuCi1vcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmltcGwuY29ubi5BYnN0cmFjdFBvb2xlZENvbm5BZGFwdGVyIGV4dGVuZHMgb3JnLmFwYWNoZS5odHRwLmltcGwuY29ubi5BYnN0cmFjdENsaWVudENvbm5BZGFwdGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCB2b2xhdGlsZSBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLkFic3RyYWN0UG9vbEVudHJ5IHBvb2xFbnRyeQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaHR0cC5jb25uLkNsaWVudENvbm5lY3Rpb25NYW5hZ2VyCi1vcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLkFic3RyYWN0UG9vbEVudHJ5KQotCi1wcm90ZWN0ZWQgZmluYWwgdm9pZCBhc3NlcnRBdHRhY2hlZCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNsb3NlKCkKLQotcHJvdGVjdGVkIHZvaWQgZGV0YWNoKCkKLQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5jb25uLnJvdXRpbmcuSHR0cFJvdXRlIGdldFJvdXRlKCkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0U3RhdGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBsYXllclByb3RvY29sKAotb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBDb250ZXh0Ci1vcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIG9wZW4oCi1vcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLkh0dHBSb3V0ZQotb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBDb250ZXh0Ci1vcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMpCi0KLXB1YmxpYyB2b2lkIHNldFN0YXRlKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2h1dGRvd24oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB0dW5uZWxQcm94eSgKLW9yZy5hcGFjaGUuaHR0cC5IdHRwSG9zdAotYm9vbGVhbgotb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB0dW5uZWxUYXJnZXQoCi1ib29sZWFuCi1vcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmltcGwuY29ubi5EZWZhdWx0Q2xpZW50Q29ubmVjdGlvbiBleHRlbmRzIG9yZy5hcGFjaGUuaHR0cC5pbXBsLlNvY2tldEh0dHBDbGllbnRDb25uZWN0aW9uIGltcGxlbWVudHMgb3JnLmFwYWNoZS5odHRwLmNvbm4uT3BlcmF0ZWRDbGllbnRDb25uZWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYm9vbGVhbiBjb25uU2VjdXJlCi0KLXByaXZhdGUgZmluYWwgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGhlYWRlckxvZwotCi1wcml2YXRlIGZpbmFsIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBsb2cKLQotcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIHNodXRkb3duCi0KLXByaXZhdGUgdm9sYXRpbGUgamF2YS5uZXQuU29ja2V0IHNvY2tldAotCi1wcml2YXRlIG9yZy5hcGFjaGUuaHR0cC5IdHRwSG9zdCB0YXJnZXRIb3N0Ci0KLXByaXZhdGUgZmluYWwgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIHdpcmVMb2cKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjbG9zZSgpCi0KLXByb3RlY3RlZCBvcmcuYXBhY2hlLmh0dHAuaW8uSHR0cE1lc3NhZ2VQYXJzZXIgY3JlYXRlUmVzcG9uc2VQYXJzZXIoCi1vcmcuYXBhY2hlLmh0dHAuaW8uU2Vzc2lvbklucHV0QnVmZmVyCi1vcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlRmFjdG9yeQotb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgb3JnLmFwYWNoZS5odHRwLmlvLlNlc3Npb25JbnB1dEJ1ZmZlciBjcmVhdGVTZXNzaW9uSW5wdXRCdWZmZXIoCi1qYXZhLm5ldC5Tb2NrZXQKLWludAotb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgb3JnLmFwYWNoZS5odHRwLmlvLlNlc3Npb25PdXRwdXRCdWZmZXIgY3JlYXRlU2Vzc2lvbk91dHB1dEJ1ZmZlcigKLWphdmEubmV0LlNvY2tldAotaW50Ci1vcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLm5ldC5Tb2NrZXQgZ2V0U29ja2V0KCkKLQotcHVibGljIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5IdHRwSG9zdCBnZXRUYXJnZXRIb3N0KCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gaXNTZWN1cmUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBvcGVuQ29tcGxldGVkKAotYm9vbGVhbgotb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBvcGVuaW5nKAotamF2YS5uZXQuU29ja2V0Ci1vcmcuYXBhY2hlLmh0dHAuSHR0cEhvc3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9IdHRwRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgb3JnLmFwYWNoZS5odHRwLkh0dHBSZXNwb25zZSByZWNlaXZlUmVzcG9uc2VIZWFkZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvSHR0cEV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2VuZFJlcXVlc3RIZWFkZXIoCi1vcmcuYXBhY2hlLmh0dHAuSHR0cFJlcXVlc3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNodXRkb3duKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgdXBkYXRlKAotamF2YS5uZXQuU29ja2V0Ci1vcmcuYXBhY2hlLmh0dHAuSHR0cEhvc3QKLWJvb2xlYW4KLW9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLkRlZmF1bHRDbGllbnRDb25uZWN0aW9uT3BlcmF0b3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmFwYWNoZS5odHRwLmNvbm4uQ2xpZW50Q29ubmVjdGlvbk9wZXJhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCBvcmcuYXBhY2hlLmh0dHAuY29ubi5zY2hlbWUuU2NoZW1lUmVnaXN0cnkgc2NoZW1lUmVnaXN0cnkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmh0dHAuY29ubi5zY2hlbWUuU2NoZW1lUmVnaXN0cnkpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAuY29ubi5PcGVyYXRlZENsaWVudENvbm5lY3Rpb24gY3JlYXRlQ29ubmVjdGlvbigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIG9wZW5Db25uZWN0aW9uKAotb3JnLmFwYWNoZS5odHRwLmNvbm4uT3BlcmF0ZWRDbGllbnRDb25uZWN0aW9uCi1vcmcuYXBhY2hlLmh0dHAuSHR0cEhvc3QKLWphdmEubmV0LkluZXRBZGRyZXNzCi1vcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cENvbnRleHQKLW9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgcHJlcGFyZVNvY2tldCgKLWphdmEubmV0LlNvY2tldAotb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBDb250ZXh0Ci1vcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHVwZGF0ZVNlY3VyZUNvbm5lY3Rpb24oCi1vcmcuYXBhY2hlLmh0dHAuY29ubi5PcGVyYXRlZENsaWVudENvbm5lY3Rpb24KLW9yZy5hcGFjaGUuaHR0cC5IdHRwSG9zdAotb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBDb250ZXh0Ci1vcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmltcGwuY29ubi5EZWZhdWx0SHR0cFJvdXRlUGxhbm5lciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLkh0dHBSb3V0ZVBsYW5uZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIG9yZy5hcGFjaGUuaHR0cC5jb25uLnNjaGVtZS5TY2hlbWVSZWdpc3RyeSBzY2hlbWVSZWdpc3RyeQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaHR0cC5jb25uLnNjaGVtZS5TY2hlbWVSZWdpc3RyeSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL0h0dHBFeGNlcHRpb247ICkKLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLkh0dHBSb3V0ZSBkZXRlcm1pbmVSb3V0ZSgKLW9yZy5hcGFjaGUuaHR0cC5IdHRwSG9zdAotb3JnLmFwYWNoZS5odHRwLkh0dHBSZXF1ZXN0Ci1vcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cENvbnRleHQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5pby5IdHRwTWVzc2FnZVBhcnNlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xvcmcvYXBhY2hlL2h0dHAvSHR0cEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IG9yZy5hcGFjaGUuaHR0cC5IdHRwTWVzc2FnZSBwYXJzZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmltcGwuaW8uQWJzdHJhY3RNZXNzYWdlUGFyc2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaHR0cC5pby5IdHRwTWVzc2FnZVBhcnNlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgZmluYWwgb3JnLmFwYWNoZS5odHRwLm1lc3NhZ2UuTGluZVBhcnNlciBsaW5lUGFyc2VyCi0KLXByaXZhdGUgZmluYWwgaW50IG1heEhlYWRlckNvdW50Ci0KLXByaXZhdGUgZmluYWwgaW50IG1heExpbmVMZW4KLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuaW8uU2Vzc2lvbklucHV0QnVmZmVyIHNlc3Npb25CdWZmZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmh0dHAuaW8uU2Vzc2lvbklucHV0QnVmZmVyCi1vcmcuYXBhY2hlLmh0dHAubWVzc2FnZS5MaW5lUGFyc2VyCi1vcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9IdHRwRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUuaHR0cC5IZWFkZXJbXSBwYXJzZUhlYWRlcnMoCi1vcmcuYXBhY2hlLmh0dHAuaW8uU2Vzc2lvbklucHV0QnVmZmVyCi1pbnQKLWludAotb3JnLmFwYWNoZS5odHRwLm1lc3NhZ2UuTGluZVBhcnNlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMb3JnL2FwYWNoZS9odHRwL0h0dHBFeGNlcHRpb247ICkKLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAuSHR0cE1lc3NhZ2UgcGFyc2UoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xvcmcvYXBhY2hlL2h0dHAvSHR0cEV4Y2VwdGlvbjtMb3JnL2FwYWNoZS9odHRwL1BhcnNlRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgYWJzdHJhY3Qgb3JnLmFwYWNoZS5odHRwLkh0dHBNZXNzYWdlIHBhcnNlSGVhZCgKLW9yZy5hcGFjaGUuaHR0cC5pby5TZXNzaW9uSW5wdXRCdWZmZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmltcGwuY29ubi5EZWZhdWx0UmVzcG9uc2VQYXJzZXIgZXh0ZW5kcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5pby5BYnN0cmFjdE1lc3NhZ2VQYXJzZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmh0dHAudXRpbC5DaGFyQXJyYXlCdWZmZXIgbGluZUJ1ZgotCi1wcml2YXRlIGZpbmFsIGludCBtYXhHYXJiYWdlTGluZXMKLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlRmFjdG9yeSByZXNwb25zZUZhY3RvcnkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmh0dHAuaW8uU2Vzc2lvbklucHV0QnVmZmVyCi1vcmcuYXBhY2hlLmh0dHAubWVzc2FnZS5MaW5lUGFyc2VyCi1vcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlRmFjdG9yeQotb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xvcmcvYXBhY2hlL2h0dHAvSHR0cEV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIG9yZy5hcGFjaGUuaHR0cC5IdHRwTWVzc2FnZSBwYXJzZUhlYWQoCi1vcmcuYXBhY2hlLmh0dHAuaW8uU2Vzc2lvbklucHV0QnVmZmVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvaW1wbC9jb25uL0lkbGVDb25uZWN0aW9uSGFuZGxlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1UaW1lVmFsdWVzICkKLSBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLklkbGVDb25uZWN0aW9uSGFuZGxlciRUaW1lVmFsdWVzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGxvbmcgdGltZUFkZGVkCi0KLXByaXZhdGUgZmluYWwgbG9uZyB0aW1lRXhwaXJlcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWxvbmcKLWxvbmcKLWphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0KQotCi1zdGF0aWMgbG9uZyBhY2Nlc3MkMDAwKAotb3JnLmFwYWNoZS5odHRwLmltcGwuY29ubi5JZGxlQ29ubmVjdGlvbkhhbmRsZXIkVGltZVZhbHVlcykKLQotc3RhdGljIGxvbmcgYWNjZXNzJDEwMCgKLW9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvbm4uSWRsZUNvbm5lY3Rpb25IYW5kbGVyJFRpbWVWYWx1ZXMpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL2ltcGwvY29ubi9JZGxlQ29ubmVjdGlvbkhhbmRsZXIkVGltZVZhbHVlczsgKQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvbm4uSWRsZUNvbm5lY3Rpb25IYW5kbGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvTWFwPExvcmcvYXBhY2hlL2h0dHAvSHR0cENvbm5lY3Rpb247TG9yZy9hcGFjaGUvaHR0cC9pbXBsL2Nvbm4vSWRsZUNvbm5lY3Rpb25IYW5kbGVyJFRpbWVWYWx1ZXM7PjsgKQotcHJpdmF0ZSBmaW5hbCBqYXZhLnV0aWwuTWFwIGNvbm5lY3Rpb25Ub1RpbWVzCi0KLXByaXZhdGUgZmluYWwgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIGFkZCgKLW9yZy5hcGFjaGUuaHR0cC5IdHRwQ29ubmVjdGlvbgotbG9uZwotamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQpCi0KLXB1YmxpYyB2b2lkIGNsb3NlRXhwaXJlZENvbm5lY3Rpb25zKCkKLQotcHVibGljIHZvaWQgY2xvc2VJZGxlQ29ubmVjdGlvbnMoCi1sb25nKQotCi1wdWJsaWMgYm9vbGVhbiByZW1vdmUoCi1vcmcuYXBhY2hlLmh0dHAuSHR0cENvbm5lY3Rpb24pCi0KLXB1YmxpYyB2b2lkIHJlbW92ZUFsbCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5pby5TZXNzaW9uSW5wdXRCdWZmZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IG9yZy5hcGFjaGUuaHR0cC5pby5IdHRwVHJhbnNwb3J0TWV0cmljcyBnZXRNZXRyaWNzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNEYXRhQXZhaWxhYmxlKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IHJlYWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IHJlYWQoCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgcmVhZCgKLWJ5dGVbXQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgcmVhZExpbmUoCi1vcmcuYXBhY2hlLmh0dHAudXRpbC5DaGFyQXJyYXlCdWZmZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIHJlYWRMaW5lKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLkxvZ2dpbmdTZXNzaW9uSW5wdXRCdWZmZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmFwYWNoZS5odHRwLmlvLlNlc3Npb25JbnB1dEJ1ZmZlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5pby5TZXNzaW9uSW5wdXRCdWZmZXIgaW4KLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLldpcmUgd2lyZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaHR0cC5pby5TZXNzaW9uSW5wdXRCdWZmZXIKLW9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvbm4uV2lyZSkKLQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5pby5IdHRwVHJhbnNwb3J0TWV0cmljcyBnZXRNZXRyaWNzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gaXNEYXRhQXZhaWxhYmxlKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcmVhZCgKLWJ5dGVbXQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcmVhZExpbmUoCi1vcmcuYXBhY2hlLmh0dHAudXRpbC5DaGFyQXJyYXlCdWZmZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHJlYWRMaW5lKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmlvLlNlc3Npb25PdXRwdXRCdWZmZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgZmx1c2goKQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLmFwYWNoZS5odHRwLmlvLkh0dHBUcmFuc3BvcnRNZXRyaWNzIGdldE1ldHJpY3MoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGUoCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlKAotYnl0ZVtdCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVMaW5lKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVMaW5lKAotb3JnLmFwYWNoZS5odHRwLnV0aWwuQ2hhckFycmF5QnVmZmVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvbm4uTG9nZ2luZ1Nlc3Npb25PdXRwdXRCdWZmZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmFwYWNoZS5odHRwLmlvLlNlc3Npb25PdXRwdXRCdWZmZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuaW8uU2Vzc2lvbk91dHB1dEJ1ZmZlciBvdXQKLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLldpcmUgd2lyZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaHR0cC5pby5TZXNzaW9uT3V0cHV0QnVmZmVyCi1vcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLldpcmUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGZsdXNoKCkKLQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5pby5IdHRwVHJhbnNwb3J0TWV0cmljcyBnZXRNZXRyaWNzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgd3JpdGUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHdyaXRlKAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB3cml0ZSgKLWJ5dGVbXQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHdyaXRlTGluZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHdyaXRlTGluZSgKLW9yZy5hcGFjaGUuaHR0cC51dGlsLkNoYXJBcnJheUJ1ZmZlcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTQxMDQgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL2ltcGwvY29ubi9Qcm94eVNlbGVjdG9yUm91dGVQbGFubmVyOyApCi0gY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmltcGwuY29ubi5Qcm94eVNlbGVjdG9yUm91dGVQbGFubmVyJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBmaW5hbCBpbnRbXSAkU3dpdGNoTWFwJGphdmEkbmV0JFByb3h5JFR5cGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL2ltcGwvY29ubi9Qcm94eVNlbGVjdG9yUm91dGVQbGFubmVyJDE7ICkKLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLlByb3h5U2VsZWN0b3JSb3V0ZVBsYW5uZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmFwYWNoZS5odHRwLmNvbm4ucm91dGluZy5IdHRwUm91dGVQbGFubmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCBqYXZhLm5ldC5Qcm94eVNlbGVjdG9yIHByb3h5U2VsZWN0b3IKLQotcHJvdGVjdGVkIG9yZy5hcGFjaGUuaHR0cC5jb25uLnNjaGVtZS5TY2hlbWVSZWdpc3RyeSBzY2hlbWVSZWdpc3RyeQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaHR0cC5jb25uLnNjaGVtZS5TY2hlbWVSZWdpc3RyeQotamF2YS5uZXQuUHJveHlTZWxlY3RvcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9MaXN0PExqYXZhL25ldC9Qcm94eTs+O0xvcmcvYXBhY2hlL2h0dHAvSHR0cEhvc3Q7TG9yZy9hcGFjaGUvaHR0cC9IdHRwUmVxdWVzdDtMb3JnL2FwYWNoZS9odHRwL3Byb3RvY29sL0h0dHBDb250ZXh0OylMamF2YS9uZXQvUHJveHk7ICkKLXByb3RlY3RlZCBqYXZhLm5ldC5Qcm94eSBjaG9vc2VQcm94eSgKLWphdmEudXRpbC5MaXN0Ci1vcmcuYXBhY2hlLmh0dHAuSHR0cEhvc3QKLW9yZy5hcGFjaGUuaHR0cC5IdHRwUmVxdWVzdAotb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBDb250ZXh0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvSHR0cEV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIG9yZy5hcGFjaGUuaHR0cC5IdHRwSG9zdCBkZXRlcm1pbmVQcm94eSgKLW9yZy5hcGFjaGUuaHR0cC5IdHRwSG9zdAotb3JnLmFwYWNoZS5odHRwLkh0dHBSZXF1ZXN0Ci1vcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cENvbnRleHQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9IdHRwRXhjZXB0aW9uOyApCi1wdWJsaWMgb3JnLmFwYWNoZS5odHRwLmNvbm4ucm91dGluZy5IdHRwUm91dGUgZGV0ZXJtaW5lUm91dGUoCi1vcmcuYXBhY2hlLmh0dHAuSHR0cEhvc3QKLW9yZy5hcGFjaGUuaHR0cC5IdHRwUmVxdWVzdAotb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBDb250ZXh0KQotCi1wcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBnZXRIb3N0KAotamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3MpCi0KLXB1YmxpYyBqYXZhLm5ldC5Qcm94eVNlbGVjdG9yIGdldFByb3h5U2VsZWN0b3IoKQotCi1wdWJsaWMgdm9pZCBzZXRQcm94eVNlbGVjdG9yKAotamF2YS5uZXQuUHJveHlTZWxlY3RvcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi0gY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmltcGwuY29ubi5TaW5nbGVDbGllbnRDb25uTWFuYWdlciQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaHR0cC5jb25uLkNsaWVudENvbm5lY3Rpb25SZXF1ZXN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvbm4uU2luZ2xlQ2xpZW50Q29ubk1hbmFnZXIgdGhpcyQwCi0KLWZpbmFsIG9yZy5hcGFjaGUuaHR0cC5jb25uLnJvdXRpbmcuSHR0cFJvdXRlIHZhbCRyb3V0ZQotCi1maW5hbCBqYXZhLmxhbmcuT2JqZWN0IHZhbCRzdGF0ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvbm4uU2luZ2xlQ2xpZW50Q29ubk1hbmFnZXIKLW9yZy5hcGFjaGUuaHR0cC5jb25uLnJvdXRpbmcuSHR0cFJvdXRlCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgdm9pZCBhYm9ydFJlcXVlc3QoKQotCi1wdWJsaWMgb3JnLmFwYWNoZS5odHRwLmNvbm4uTWFuYWdlZENsaWVudENvbm5lY3Rpb24gZ2V0Q29ubmVjdGlvbigKLWxvbmcKLWphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9NCBuYW1lID1Db25uQWRhcHRlciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL2ltcGwvY29ubi9TaW5nbGVDbGllbnRDb25uTWFuYWdlcjsgKQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvbm4uU2luZ2xlQ2xpZW50Q29ubk1hbmFnZXIkQ29ubkFkYXB0ZXIgZXh0ZW5kcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLkFic3RyYWN0UG9vbGVkQ29ubkFkYXB0ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgb3JnLmFwYWNoZS5odHRwLmltcGwuY29ubi5TaW5nbGVDbGllbnRDb25uTWFuYWdlciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLlNpbmdsZUNsaWVudENvbm5NYW5hZ2VyCi1vcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLlNpbmdsZUNsaWVudENvbm5NYW5hZ2VyJFBvb2xFbnRyeQotb3JnLmFwYWNoZS5odHRwLmNvbm4ucm91dGluZy5IdHRwUm91dGUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9pbXBsL2Nvbm4vU2luZ2xlQ2xpZW50Q29ubk1hbmFnZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9NCBuYW1lID1Qb29sRW50cnkgKQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvbm4uU2luZ2xlQ2xpZW50Q29ubk1hbmFnZXIkUG9vbEVudHJ5IGV4dGVuZHMgb3JnLmFwYWNoZS5odHRwLmltcGwuY29ubi5BYnN0cmFjdFBvb2xFbnRyeQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLlNpbmdsZUNsaWVudENvbm5NYW5hZ2VyIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvbm4uU2luZ2xlQ2xpZW50Q29ubk1hbmFnZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIGNsb3NlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgc2h1dGRvd24oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9pbXBsL2Nvbm4vU2luZ2xlQ2xpZW50Q29ubk1hbmFnZXIkQ29ubkFkYXB0ZXI7TG9yZy9hcGFjaGUvaHR0cC9pbXBsL2Nvbm4vU2luZ2xlQ2xpZW50Q29ubk1hbmFnZXIkUG9vbEVudHJ5OyApCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmltcGwuY29ubi5TaW5nbGVDbGllbnRDb25uTWFuYWdlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmh0dHAuY29ubi5DbGllbnRDb25uZWN0aW9uTWFuYWdlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTUlTVVNFX01FU1NBR0UKLQotcHJvdGVjdGVkIGJvb2xlYW4gYWx3YXlzU2h1dERvd24KLQotcHJvdGVjdGVkIG9yZy5hcGFjaGUuaHR0cC5jb25uLkNsaWVudENvbm5lY3Rpb25PcGVyYXRvciBjb25uT3BlcmF0b3IKLQotcHJvdGVjdGVkIGxvbmcgY29ubmVjdGlvbkV4cGlyZXNUaW1lCi0KLXByb3RlY3RlZCB2b2xhdGlsZSBib29sZWFuIGlzU2h1dERvd24KLQotcHJvdGVjdGVkIGxvbmcgbGFzdFJlbGVhc2VUaW1lCi0KLXByaXZhdGUgZmluYWwgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZwotCi1wcm90ZWN0ZWQgb3JnLmFwYWNoZS5odHRwLmltcGwuY29ubi5TaW5nbGVDbGllbnRDb25uTWFuYWdlciRDb25uQWRhcHRlciBtYW5hZ2VkQ29ubgotCi1wcm90ZWN0ZWQgb3JnLmFwYWNoZS5odHRwLmNvbm4uc2NoZW1lLlNjaGVtZVJlZ2lzdHJ5IHNjaGVtZVJlZ2lzdHJ5Ci0KLXByb3RlY3RlZCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLlNpbmdsZUNsaWVudENvbm5NYW5hZ2VyJFBvb2xFbnRyeSB1bmlxdWVQb29sRW50cnkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMKLW9yZy5hcGFjaGUuaHR0cC5jb25uLnNjaGVtZS5TY2hlbWVSZWdpc3RyeSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGZpbmFsIHZvaWQgYXNzZXJ0U3RpbGxVcCgpCi0KLXB1YmxpYyB2b2lkIGNsb3NlRXhwaXJlZENvbm5lY3Rpb25zKCkKLQotcHVibGljIHZvaWQgY2xvc2VJZGxlQ29ubmVjdGlvbnMoCi1sb25nCi1qYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdCkKLQotcHJvdGVjdGVkIG9yZy5hcGFjaGUuaHR0cC5jb25uLkNsaWVudENvbm5lY3Rpb25PcGVyYXRvciBjcmVhdGVDb25uZWN0aW9uT3BlcmF0b3IoCi1vcmcuYXBhY2hlLmh0dHAuY29ubi5zY2hlbWUuU2NoZW1lUmVnaXN0cnkpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9UaHJvd2FibGU7ICkKLXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkKLQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5jb25uLk1hbmFnZWRDbGllbnRDb25uZWN0aW9uIGdldENvbm5lY3Rpb24oCi1vcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLkh0dHBSb3V0ZQotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5jb25uLnNjaGVtZS5TY2hlbWVSZWdpc3RyeSBnZXRTY2hlbWVSZWdpc3RyeSgpCi0KLXB1YmxpYyB2b2lkIHJlbGVhc2VDb25uZWN0aW9uKAotb3JnLmFwYWNoZS5odHRwLmNvbm4uTWFuYWdlZENsaWVudENvbm5lY3Rpb24KLWxvbmcKLWphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0KQotCi1wdWJsaWMgZmluYWwgb3JnLmFwYWNoZS5odHRwLmNvbm4uQ2xpZW50Q29ubmVjdGlvblJlcXVlc3QgcmVxdWVzdENvbm5lY3Rpb24oCi1vcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLkh0dHBSb3V0ZQotamF2YS5sYW5nLk9iamVjdCkKLQotcHJvdGVjdGVkIHZvaWQgcmV2b2tlQ29ubmVjdGlvbigpCi0KLXB1YmxpYyB2b2lkIHNodXRkb3duKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLldpcmUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHdpcmUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmlvLklucHV0U3RyZWFtKQotCi1wdWJsaWMgYm9vbGVhbiBlbmFibGVkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgaW5wdXQoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGlucHV0KAotamF2YS5pby5JbnB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgaW5wdXQoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBpbnB1dCgKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgaW5wdXQoCi1ieXRlW10KLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBvdXRwdXQoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIG91dHB1dCgKLWphdmEuaW8uSW5wdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIG91dHB1dCgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIG91dHB1dCgKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgb3V0cHV0KAotYnl0ZVtdCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmltcGwuY29ubi50c2NjbS5SZWZRdWV1ZUhhbmRsZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9yZWYvUmVmZXJlbmNlPCo+OylWICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGhhbmRsZVJlZmVyZW5jZSgKLWphdmEubGFuZy5yZWYuUmVmZXJlbmNlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvbm4udHNjY20uQWJzdHJhY3RDb25uUG9vbCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLnRzY2NtLlJlZlF1ZXVlSGFuZGxlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgb3JnLmFwYWNoZS5odHRwLmltcGwuY29ubi5JZGxlQ29ubmVjdGlvbkhhbmRsZXIgaWRsZUNvbm5IYW5kbGVyCi0KLXByb3RlY3RlZCB2b2xhdGlsZSBib29sZWFuIGlzU2h1dERvd24KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL1NldDxMb3JnL2FwYWNoZS9odHRwL2ltcGwvY29ubi90c2NjbS9CYXNpY1Bvb2xFbnRyeVJlZjs+OyApCi1wcm90ZWN0ZWQgamF2YS51dGlsLlNldCBpc3N1ZWRDb25uZWN0aW9ucwotCi1wcml2YXRlIGZpbmFsIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBsb2cKLQotcHJvdGVjdGVkIGludCBudW1Db25uZWN0aW9ucwotCi1wcm90ZWN0ZWQgZmluYWwgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuTG9jayBwb29sTG9jawotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvcmVmL1JlZmVyZW5jZVF1ZXVlPExqYXZhL2xhbmcvT2JqZWN0Oz47ICkKLXByb3RlY3RlZCBqYXZhLmxhbmcucmVmLlJlZmVyZW5jZVF1ZXVlIHJlZlF1ZXVlCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5odHRwLmltcGwuY29ubi50c2NjbS5SZWZRdWV1ZVdvcmtlciByZWZXb3JrZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oKQotCi1wcm90ZWN0ZWQgdm9pZCBjbG9zZUNvbm5lY3Rpb24oCi1vcmcuYXBhY2hlLmh0dHAuY29ubi5PcGVyYXRlZENsaWVudENvbm5lY3Rpb24pCi0KLXB1YmxpYyB2b2lkIGNsb3NlRXhwaXJlZENvbm5lY3Rpb25zKCkKLQotcHVibGljIHZvaWQgY2xvc2VJZGxlQ29ubmVjdGlvbnMoCi1sb25nCi1qYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZGVsZXRlQ2xvc2VkQ29ubmVjdGlvbnMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBlbmFibGVDb25uZWN0aW9uR0MoKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBmcmVlRW50cnkoCi1vcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLnRzY2NtLkJhc2ljUG9vbEVudHJ5Ci1ib29sZWFuCi1sb25nCi1qYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL2Nvbm4vQ29ubmVjdGlvblBvb2xUaW1lb3V0RXhjZXB0aW9uO0xqYXZhL2xhbmcvSW50ZXJydXB0ZWRFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLnRzY2NtLkJhc2ljUG9vbEVudHJ5IGdldEVudHJ5KAotb3JnLmFwYWNoZS5odHRwLmNvbm4ucm91dGluZy5IdHRwUm91dGUKLWphdmEubGFuZy5PYmplY3QKLWxvbmcKLWphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0KQotCi1wcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBoYW5kbGVMb3N0RW50cnkoCi1vcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLkh0dHBSb3V0ZSkKLQotcHVibGljIHZvaWQgaGFuZGxlUmVmZXJlbmNlKAotamF2YS5sYW5nLnJlZi5SZWZlcmVuY2UpCi0KLXB1YmxpYyBhYnN0cmFjdCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLnRzY2NtLlBvb2xFbnRyeVJlcXVlc3QgcmVxdWVzdFBvb2xFbnRyeSgKLW9yZy5hcGFjaGUuaHR0cC5jb25uLnJvdXRpbmcuSHR0cFJvdXRlCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgdm9pZCBzaHV0ZG93bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmltcGwuY29ubi50c2NjbS5CYXNpY1Bvb2xFbnRyeSBleHRlbmRzIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvbm4uQWJzdHJhY3RQb29sRW50cnkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLnRzY2NtLkJhc2ljUG9vbEVudHJ5UmVmIHJlZmVyZW5jZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExvcmcvYXBhY2hlL2h0dHAvY29ubi9DbGllbnRDb25uZWN0aW9uT3BlcmF0b3I7TG9yZy9hcGFjaGUvaHR0cC9jb25uL3JvdXRpbmcvSHR0cFJvdXRlO0xqYXZhL2xhbmcvcmVmL1JlZmVyZW5jZVF1ZXVlPExqYXZhL2xhbmcvT2JqZWN0Oz47KVYgKQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5odHRwLmNvbm4uQ2xpZW50Q29ubmVjdGlvbk9wZXJhdG9yCi1vcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLkh0dHBSb3V0ZQotamF2YS5sYW5nLnJlZi5SZWZlcmVuY2VRdWV1ZSkKLQotcHJvdGVjdGVkIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5jb25uLk9wZXJhdGVkQ2xpZW50Q29ubmVjdGlvbiBnZXRDb25uZWN0aW9uKCkKLQotcHJvdGVjdGVkIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5jb25uLnJvdXRpbmcuSHR0cFJvdXRlIGdldFBsYW5uZWRSb3V0ZSgpCi0KLXByb3RlY3RlZCBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLnRzY2NtLkJhc2ljUG9vbEVudHJ5UmVmIGdldFdlYWtSZWYoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL3JlZi9XZWFrUmVmZXJlbmNlPExvcmcvYXBhY2hlL2h0dHAvaW1wbC9jb25uL3RzY2NtL0Jhc2ljUG9vbEVudHJ5Oz47ICkKLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLnRzY2NtLkJhc2ljUG9vbEVudHJ5UmVmIGV4dGVuZHMgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgb3JnLmFwYWNoZS5odHRwLmNvbm4ucm91dGluZy5IdHRwUm91dGUgcm91dGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMb3JnL2FwYWNoZS9odHRwL2ltcGwvY29ubi90c2NjbS9CYXNpY1Bvb2xFbnRyeTtMamF2YS9sYW5nL3JlZi9SZWZlcmVuY2VRdWV1ZTxMamF2YS9sYW5nL09iamVjdDs+OylWICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvbm4udHNjY20uQmFzaWNQb29sRW50cnkKLWphdmEubGFuZy5yZWYuUmVmZXJlbmNlUXVldWUpCi0KLXB1YmxpYyBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLkh0dHBSb3V0ZSBnZXRSb3V0ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmltcGwuY29ubi50c2NjbS5CYXNpY1Bvb2xlZENvbm5BZGFwdGVyIGV4dGVuZHMgb3JnLmFwYWNoZS5odHRwLmltcGwuY29ubi5BYnN0cmFjdFBvb2xlZENvbm5BZGFwdGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5odHRwLmltcGwuY29ubi50c2NjbS5UaHJlYWRTYWZlQ2xpZW50Q29ubk1hbmFnZXIKLW9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvbm4uQWJzdHJhY3RQb29sRW50cnkpCi0KLXByb3RlY3RlZCB2b2lkIGRldGFjaCgpCi0KLXByb3RlY3RlZCBvcmcuYXBhY2hlLmh0dHAuY29ubi5DbGllbnRDb25uZWN0aW9uTWFuYWdlciBnZXRNYW5hZ2VyKCkKLQotcHJvdGVjdGVkIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvbm4uQWJzdHJhY3RQb29sRW50cnkgZ2V0UG9vbEVudHJ5KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmltcGwuY29ubi50c2NjbS5Qb29sRW50cnlSZXF1ZXN0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGFib3J0UmVxdWVzdCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbnRlcnJ1cHRlZEV4Y2VwdGlvbjtMb3JnL2FwYWNoZS9odHRwL2Nvbm4vQ29ubmVjdGlvblBvb2xUaW1lb3V0RXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLmFwYWNoZS5odHRwLmltcGwuY29ubi50c2NjbS5CYXNpY1Bvb2xFbnRyeSBnZXRQb29sRW50cnkoCi1sb25nCi1qYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi0gY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmltcGwuY29ubi50c2NjbS5Db25uUG9vbEJ5Um91dGUkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLnRzY2NtLlBvb2xFbnRyeVJlcXVlc3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgb3JnLmFwYWNoZS5odHRwLmltcGwuY29ubi50c2NjbS5Db25uUG9vbEJ5Um91dGUgdGhpcyQwCi0KLWZpbmFsIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvbm4udHNjY20uV2FpdGluZ1RocmVhZEFib3J0ZXIgdmFsJGFib3J0ZXIKLQotZmluYWwgb3JnLmFwYWNoZS5odHRwLmNvbm4ucm91dGluZy5IdHRwUm91dGUgdmFsJHJvdXRlCi0KLWZpbmFsIGphdmEubGFuZy5PYmplY3QgdmFsJHN0YXRlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5odHRwLmltcGwuY29ubi50c2NjbS5Db25uUG9vbEJ5Um91dGUKLW9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvbm4udHNjY20uV2FpdGluZ1RocmVhZEFib3J0ZXIKLW9yZy5hcGFjaGUuaHR0cC5jb25uLnJvdXRpbmcuSHR0cFJvdXRlCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgdm9pZCBhYm9ydFJlcXVlc3QoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSW50ZXJydXB0ZWRFeGNlcHRpb247TG9yZy9hcGFjaGUvaHR0cC9jb25uL0Nvbm5lY3Rpb25Qb29sVGltZW91dEV4Y2VwdGlvbjsgKQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvbm4udHNjY20uQmFzaWNQb29sRW50cnkgZ2V0UG9vbEVudHJ5KAotbG9uZwotamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmltcGwuY29ubi50c2NjbS5Db25uUG9vbEJ5Um91dGUgZXh0ZW5kcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLnRzY2NtLkFic3RyYWN0Q29ublBvb2wKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuY29ubi5wYXJhbXMuQ29ublBlclJvdXRlIGNvbm5QZXJSb3V0ZQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvUXVldWU8TG9yZy9hcGFjaGUvaHR0cC9pbXBsL2Nvbm4vdHNjY20vQmFzaWNQb29sRW50cnk7PjsgKQotcHJvdGVjdGVkIGphdmEudXRpbC5RdWV1ZSBmcmVlQ29ubmVjdGlvbnMKLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgbG9nCi0KLXByb3RlY3RlZCBmaW5hbCBpbnQgbWF4VG90YWxDb25uZWN0aW9ucwotCi1wcm90ZWN0ZWQgZmluYWwgb3JnLmFwYWNoZS5odHRwLmNvbm4uQ2xpZW50Q29ubmVjdGlvbk9wZXJhdG9yIG9wZXJhdG9yCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9NYXA8TG9yZy9hcGFjaGUvaHR0cC9jb25uL3JvdXRpbmcvSHR0cFJvdXRlO0xvcmcvYXBhY2hlL2h0dHAvaW1wbC9jb25uL3RzY2NtL1JvdXRlU3BlY2lmaWNQb29sOz47ICkKLXByb3RlY3RlZCBmaW5hbCBqYXZhLnV0aWwuTWFwIHJvdXRlVG9Qb29sCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9RdWV1ZTxMb3JnL2FwYWNoZS9odHRwL2ltcGwvY29ubi90c2NjbS9XYWl0aW5nVGhyZWFkOz47ICkKLXByb3RlY3RlZCBqYXZhLnV0aWwuUXVldWUgd2FpdGluZ1RocmVhZHMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmh0dHAuY29ubi5DbGllbnRDb25uZWN0aW9uT3BlcmF0b3IKLW9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcykKLQotcHJvdGVjdGVkIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvbm4udHNjY20uQmFzaWNQb29sRW50cnkgY3JlYXRlRW50cnkoCi1vcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLnRzY2NtLlJvdXRlU3BlY2lmaWNQb29sCi1vcmcuYXBhY2hlLmh0dHAuY29ubi5DbGllbnRDb25uZWN0aW9uT3BlcmF0b3IpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL1F1ZXVlPExvcmcvYXBhY2hlL2h0dHAvaW1wbC9jb25uL3RzY2NtL0Jhc2ljUG9vbEVudHJ5Oz47ICkKLXByb3RlY3RlZCBqYXZhLnV0aWwuUXVldWUgY3JlYXRlRnJlZUNvbm5RdWV1ZSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL01hcDxMb3JnL2FwYWNoZS9odHRwL2Nvbm4vcm91dGluZy9IdHRwUm91dGU7TG9yZy9hcGFjaGUvaHR0cC9pbXBsL2Nvbm4vdHNjY20vUm91dGVTcGVjaWZpY1Bvb2w7PjsgKQotcHJvdGVjdGVkIGphdmEudXRpbC5NYXAgY3JlYXRlUm91dGVUb1Bvb2xNYXAoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9RdWV1ZTxMb3JnL2FwYWNoZS9odHRwL2ltcGwvY29ubi90c2NjbS9XYWl0aW5nVGhyZWFkOz47ICkKLXByb3RlY3RlZCBqYXZhLnV0aWwuUXVldWUgY3JlYXRlV2FpdGluZ1RocmVhZFF1ZXVlKCkKLQotcHVibGljIHZvaWQgZGVsZXRlQ2xvc2VkQ29ubmVjdGlvbnMoKQotCi1wcm90ZWN0ZWQgdm9pZCBkZWxldGVFbnRyeSgKLW9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvbm4udHNjY20uQmFzaWNQb29sRW50cnkpCi0KLXByb3RlY3RlZCB2b2lkIGRlbGV0ZUxlYXN0VXNlZEVudHJ5KCkKLQotcHVibGljIHZvaWQgZnJlZUVudHJ5KAotb3JnLmFwYWNoZS5odHRwLmltcGwuY29ubi50c2NjbS5CYXNpY1Bvb2xFbnRyeQotYm9vbGVhbgotbG9uZwotamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQpCi0KLXB1YmxpYyBpbnQgZ2V0Q29ubmVjdGlvbnNJblBvb2woCi1vcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLkh0dHBSb3V0ZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL2Nvbm4vQ29ubmVjdGlvblBvb2xUaW1lb3V0RXhjZXB0aW9uO0xqYXZhL2xhbmcvSW50ZXJydXB0ZWRFeGNlcHRpb247ICkKLXByb3RlY3RlZCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLnRzY2NtLkJhc2ljUG9vbEVudHJ5IGdldEVudHJ5QmxvY2tpbmcoCi1vcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLkh0dHBSb3V0ZQotamF2YS5sYW5nLk9iamVjdAotbG9uZwotamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQKLW9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvbm4udHNjY20uV2FpdGluZ1RocmVhZEFib3J0ZXIpCi0KLXByb3RlY3RlZCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLnRzY2NtLkJhc2ljUG9vbEVudHJ5IGdldEZyZWVFbnRyeSgKLW9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvbm4udHNjY20uUm91dGVTcGVjaWZpY1Bvb2wKLWphdmEubGFuZy5PYmplY3QpCi0KLXByb3RlY3RlZCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLnRzY2NtLlJvdXRlU3BlY2lmaWNQb29sIGdldFJvdXRlUG9vbCgKLW9yZy5hcGFjaGUuaHR0cC5jb25uLnJvdXRpbmcuSHR0cFJvdXRlCi1ib29sZWFuKQotCi1wcm90ZWN0ZWQgdm9pZCBoYW5kbGVMb3N0RW50cnkoCi1vcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLkh0dHBSb3V0ZSkKLQotcHJvdGVjdGVkIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvbm4udHNjY20uUm91dGVTcGVjaWZpY1Bvb2wgbmV3Um91dGVTcGVjaWZpY1Bvb2woCi1vcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLkh0dHBSb3V0ZSkKLQotcHJvdGVjdGVkIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvbm4udHNjY20uV2FpdGluZ1RocmVhZCBuZXdXYWl0aW5nVGhyZWFkKAotamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuQ29uZGl0aW9uCi1vcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLnRzY2NtLlJvdXRlU3BlY2lmaWNQb29sKQotCi1wcm90ZWN0ZWQgdm9pZCBub3RpZnlXYWl0aW5nVGhyZWFkKAotb3JnLmFwYWNoZS5odHRwLmltcGwuY29ubi50c2NjbS5Sb3V0ZVNwZWNpZmljUG9vbCkKLQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvbm4udHNjY20uUG9vbEVudHJ5UmVxdWVzdCByZXF1ZXN0UG9vbEVudHJ5KAotb3JnLmFwYWNoZS5odHRwLmNvbm4ucm91dGluZy5IdHRwUm91dGUKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2lkIHNodXRkb3duKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLnRzY2NtLlJlZlF1ZXVlV29ya2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5SdW5uYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBsb2cKLQotcHJvdGVjdGVkIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvbm4udHNjY20uUmVmUXVldWVIYW5kbGVyIHJlZkhhbmRsZXIKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL3JlZi9SZWZlcmVuY2VRdWV1ZTwqPjsgKQotcHJvdGVjdGVkIGZpbmFsIGphdmEubGFuZy5yZWYuUmVmZXJlbmNlUXVldWUgcmVmUXVldWUKLQotcHJvdGVjdGVkIHZvbGF0aWxlIGphdmEubGFuZy5UaHJlYWQgd29ya2VyVGhyZWFkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9yZWYvUmVmZXJlbmNlUXVldWU8Kj47TG9yZy9hcGFjaGUvaHR0cC9pbXBsL2Nvbm4vdHNjY20vUmVmUXVldWVIYW5kbGVyOylWICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5yZWYuUmVmZXJlbmNlUXVldWUKLW9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvbm4udHNjY20uUmVmUXVldWVIYW5kbGVyKQotCi1wdWJsaWMgdm9pZCBydW4oKQotCi1wdWJsaWMgdm9pZCBzaHV0ZG93bigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLnRzY2NtLlJvdXRlU3BlY2lmaWNQb29sIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvTGlua2VkTGlzdDxMb3JnL2FwYWNoZS9odHRwL2ltcGwvY29ubi90c2NjbS9CYXNpY1Bvb2xFbnRyeTs+OyApCi1wcm90ZWN0ZWQgZmluYWwgamF2YS51dGlsLkxpbmtlZExpc3QgZnJlZUVudHJpZXMKLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgbG9nCi0KLXByb3RlY3RlZCBmaW5hbCBpbnQgbWF4RW50cmllcwotCi1wcm90ZWN0ZWQgaW50IG51bUVudHJpZXMKLQotcHJvdGVjdGVkIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5jb25uLnJvdXRpbmcuSHR0cFJvdXRlIHJvdXRlCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9RdWV1ZTxMb3JnL2FwYWNoZS9odHRwL2ltcGwvY29ubi90c2NjbS9XYWl0aW5nVGhyZWFkOz47ICkKLXByb3RlY3RlZCBmaW5hbCBqYXZhLnV0aWwuUXVldWUgd2FpdGluZ1RocmVhZHMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLkh0dHBSb3V0ZQotaW50KQotCi1wdWJsaWMgb3JnLmFwYWNoZS5odHRwLmltcGwuY29ubi50c2NjbS5CYXNpY1Bvb2xFbnRyeSBhbGxvY0VudHJ5KAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHZvaWQgY3JlYXRlZEVudHJ5KAotb3JnLmFwYWNoZS5odHRwLmltcGwuY29ubi50c2NjbS5CYXNpY1Bvb2xFbnRyeSkKLQotcHVibGljIGJvb2xlYW4gZGVsZXRlRW50cnkoCi1vcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLnRzY2NtLkJhc2ljUG9vbEVudHJ5KQotCi1wdWJsaWMgdm9pZCBkcm9wRW50cnkoKQotCi1wdWJsaWMgdm9pZCBmcmVlRW50cnkoCi1vcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLnRzY2NtLkJhc2ljUG9vbEVudHJ5KQotCi1wdWJsaWMgaW50IGdldENhcGFjaXR5KCkKLQotcHVibGljIGZpbmFsIGludCBnZXRFbnRyeUNvdW50KCkKLQotcHVibGljIGZpbmFsIGludCBnZXRNYXhFbnRyaWVzKCkKLQotcHVibGljIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5jb25uLnJvdXRpbmcuSHR0cFJvdXRlIGdldFJvdXRlKCkKLQotcHVibGljIGJvb2xlYW4gaGFzVGhyZWFkKCkKLQotcHVibGljIGJvb2xlYW4gaXNVbnVzZWQoKQotCi1wdWJsaWMgb3JnLmFwYWNoZS5odHRwLmltcGwuY29ubi50c2NjbS5XYWl0aW5nVGhyZWFkIG5leHRUaHJlYWQoKQotCi1wdWJsaWMgdm9pZCBxdWV1ZVRocmVhZCgKLW9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvbm4udHNjY20uV2FpdGluZ1RocmVhZCkKLQotcHVibGljIHZvaWQgcmVtb3ZlVGhyZWFkKAotb3JnLmFwYWNoZS5odHRwLmltcGwuY29ubi50c2NjbS5XYWl0aW5nVGhyZWFkKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLSBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLnRzY2NtLlRocmVhZFNhZmVDbGllbnRDb25uTWFuYWdlciQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaHR0cC5jb25uLkNsaWVudENvbm5lY3Rpb25SZXF1ZXN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvbm4udHNjY20uVGhyZWFkU2FmZUNsaWVudENvbm5NYW5hZ2VyIHRoaXMkMAotCi1maW5hbCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLnRzY2NtLlBvb2xFbnRyeVJlcXVlc3QgdmFsJHBvb2xSZXF1ZXN0Ci0KLWZpbmFsIG9yZy5hcGFjaGUuaHR0cC5jb25uLnJvdXRpbmcuSHR0cFJvdXRlIHZhbCRyb3V0ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvbm4udHNjY20uVGhyZWFkU2FmZUNsaWVudENvbm5NYW5hZ2VyCi1vcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLnRzY2NtLlBvb2xFbnRyeVJlcXVlc3QKLW9yZy5hcGFjaGUuaHR0cC5jb25uLnJvdXRpbmcuSHR0cFJvdXRlKQotCi1wdWJsaWMgdm9pZCBhYm9ydFJlcXVlc3QoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSW50ZXJydXB0ZWRFeGNlcHRpb247TG9yZy9hcGFjaGUvaHR0cC9jb25uL0Nvbm5lY3Rpb25Qb29sVGltZW91dEV4Y2VwdGlvbjsgKQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5jb25uLk1hbmFnZWRDbGllbnRDb25uZWN0aW9uIGdldENvbm5lY3Rpb24oCi1sb25nCi1qYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLnRzY2NtLlRocmVhZFNhZmVDbGllbnRDb25uTWFuYWdlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmh0dHAuY29ubi5DbGllbnRDb25uZWN0aW9uTWFuYWdlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgb3JnLmFwYWNoZS5odHRwLmNvbm4uQ2xpZW50Q29ubmVjdGlvbk9wZXJhdG9yIGNvbm5PcGVyYXRvcgotCi1wcm90ZWN0ZWQgZmluYWwgb3JnLmFwYWNoZS5odHRwLmltcGwuY29ubi50c2NjbS5BYnN0cmFjdENvbm5Qb29sIGNvbm5lY3Rpb25Qb29sCi0KLXByaXZhdGUgZmluYWwgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZwotCi1wcm90ZWN0ZWQgb3JnLmFwYWNoZS5odHRwLmNvbm4uc2NoZW1lLlNjaGVtZVJlZ2lzdHJ5IHNjaGVtZVJlZ2lzdHJ5Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zCi1vcmcuYXBhY2hlLmh0dHAuY29ubi5zY2hlbWUuU2NoZW1lUmVnaXN0cnkpCi0KLXN0YXRpYyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgYWNjZXNzJDAwMCgKLW9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvbm4udHNjY20uVGhyZWFkU2FmZUNsaWVudENvbm5NYW5hZ2VyKQotCi1wdWJsaWMgdm9pZCBjbG9zZUV4cGlyZWRDb25uZWN0aW9ucygpCi0KLXB1YmxpYyB2b2lkIGNsb3NlSWRsZUNvbm5lY3Rpb25zKAotbG9uZwotamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQpCi0KLXByb3RlY3RlZCBvcmcuYXBhY2hlLmh0dHAuY29ubi5DbGllbnRDb25uZWN0aW9uT3BlcmF0b3IgY3JlYXRlQ29ubmVjdGlvbk9wZXJhdG9yKAotb3JnLmFwYWNoZS5odHRwLmNvbm4uc2NoZW1lLlNjaGVtZVJlZ2lzdHJ5KQotCi1wcm90ZWN0ZWQgb3JnLmFwYWNoZS5odHRwLmltcGwuY29ubi50c2NjbS5BYnN0cmFjdENvbm5Qb29sIGNyZWF0ZUNvbm5lY3Rpb25Qb29sKAotb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvVGhyb3dhYmxlOyApCi1wcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpCi0KLXB1YmxpYyBpbnQgZ2V0Q29ubmVjdGlvbnNJblBvb2woKQotCi1wdWJsaWMgaW50IGdldENvbm5lY3Rpb25zSW5Qb29sKAotb3JnLmFwYWNoZS5odHRwLmNvbm4ucm91dGluZy5IdHRwUm91dGUpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAuY29ubi5zY2hlbWUuU2NoZW1lUmVnaXN0cnkgZ2V0U2NoZW1lUmVnaXN0cnkoKQotCi1wdWJsaWMgdm9pZCByZWxlYXNlQ29ubmVjdGlvbigKLW9yZy5hcGFjaGUuaHR0cC5jb25uLk1hbmFnZWRDbGllbnRDb25uZWN0aW9uCi1sb25nCi1qYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdCkKLQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5jb25uLkNsaWVudENvbm5lY3Rpb25SZXF1ZXN0IHJlcXVlc3RDb25uZWN0aW9uKAotb3JnLmFwYWNoZS5odHRwLmNvbm4ucm91dGluZy5IdHRwUm91dGUKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2lkIHNodXRkb3duKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLnRzY2NtLldhaXRpbmdUaHJlYWQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYm9vbGVhbiBhYm9ydGVkCi0KLXByaXZhdGUgZmluYWwgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuQ29uZGl0aW9uIGNvbmQKLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLnRzY2NtLlJvdXRlU3BlY2lmaWNQb29sIHBvb2wKLQotcHJpdmF0ZSBqYXZhLmxhbmcuVGhyZWFkIHdhaXRlcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkNvbmRpdGlvbgotb3JnLmFwYWNoZS5odHRwLmltcGwuY29ubi50c2NjbS5Sb3V0ZVNwZWNpZmljUG9vbCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0ludGVycnVwdGVkRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBhd2FpdCgKLWphdmEudXRpbC5EYXRlKQotCi1wdWJsaWMgZmluYWwgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuQ29uZGl0aW9uIGdldENvbmRpdGlvbigpCi0KLXB1YmxpYyBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLnRzY2NtLlJvdXRlU3BlY2lmaWNQb29sIGdldFBvb2woKQotCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLlRocmVhZCBnZXRUaHJlYWQoKQotCi1wdWJsaWMgdm9pZCBpbnRlcnJ1cHQoKQotCi1wdWJsaWMgdm9pZCB3YWtldXAoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvbm4udHNjY20uV2FpdGluZ1RocmVhZEFib3J0ZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYm9vbGVhbiBhYm9ydGVkCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5odHRwLmltcGwuY29ubi50c2NjbS5XYWl0aW5nVGhyZWFkIHdhaXRpbmdUaHJlYWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCBhYm9ydCgpCi0KLXB1YmxpYyB2b2lkIHNldFdhaXRpbmdUaHJlYWQoCi1vcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLnRzY2NtLldhaXRpbmdUaHJlYWQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmltcGwuY29va2llLkFic3RyYWN0Q29va2llQXR0cmlidXRlSGFuZGxlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmh0dHAuY29va2llLkNvb2tpZUF0dHJpYnV0ZUhhbmRsZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgYm9vbGVhbiBtYXRjaCgKLW9yZy5hcGFjaGUuaHR0cC5jb29raWUuQ29va2llCi1vcmcuYXBhY2hlLmh0dHAuY29va2llLkNvb2tpZU9yaWdpbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL2Nvb2tpZS9NYWxmb3JtZWRDb29raWVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHZhbGlkYXRlKAotb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5Db29raWUKLW9yZy5hcGFjaGUuaHR0cC5jb29raWUuQ29va2llT3JpZ2luKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvb2tpZS5BYnN0cmFjdENvb2tpZVNwZWMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5Db29raWVTcGVjCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TG9yZy9hcGFjaGUvaHR0cC9jb29raWUvQ29va2llQXR0cmlidXRlSGFuZGxlcjs+OyApCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5NYXAgYXR0cmliSGFuZGxlck1hcAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByb3RlY3RlZCBvcmcuYXBhY2hlLmh0dHAuY29va2llLkNvb2tpZUF0dHJpYnV0ZUhhbmRsZXIgZmluZEF0dHJpYkhhbmRsZXIoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcm90ZWN0ZWQgb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5Db29raWVBdHRyaWJ1dGVIYW5kbGVyIGdldEF0dHJpYkhhbmRsZXIoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9Db2xsZWN0aW9uPExvcmcvYXBhY2hlL2h0dHAvY29va2llL0Nvb2tpZUF0dHJpYnV0ZUhhbmRsZXI7PjsgKQotcHJvdGVjdGVkIGphdmEudXRpbC5Db2xsZWN0aW9uIGdldEF0dHJpYkhhbmRsZXJzKCkKLQotcHVibGljIHZvaWQgcmVnaXN0ZXJBdHRyaWJIYW5kbGVyKAotamF2YS5sYW5nLlN0cmluZwotb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5Db29raWVBdHRyaWJ1dGVIYW5kbGVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvb2tpZS5CYXNpY0NsaWVudENvb2tpZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmh0dHAuY29va2llLlNldENvb2tpZSwgb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5DbGllbnRDb29raWUsIGphdmEubGFuZy5DbG9uZWFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wcml2YXRlIGphdmEudXRpbC5NYXAgYXR0cmlicwotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgY29va2llQ29tbWVudAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgY29va2llRG9tYWluCi0KLXByaXZhdGUgamF2YS51dGlsLkRhdGUgY29va2llRXhwaXJ5RGF0ZQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgY29va2llUGF0aAotCi1wcml2YXRlIGludCBjb29raWVWZXJzaW9uCi0KLXByaXZhdGUgYm9vbGVhbiBpc1NlY3VyZQotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgbmFtZQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgdmFsdWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGNsb25lKCkKLQotcHVibGljIGJvb2xlYW4gY29udGFpbnNBdHRyaWJ1dGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRBdHRyaWJ1dGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRDb21tZW50KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Q29tbWVudFVSTCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldERvbWFpbigpCi0KLXB1YmxpYyBqYXZhLnV0aWwuRGF0ZSBnZXRFeHBpcnlEYXRlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TmFtZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFBhdGgoKQotCi1wdWJsaWMgaW50W10gZ2V0UG9ydHMoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRWYWx1ZSgpCi0KLXB1YmxpYyBpbnQgZ2V0VmVyc2lvbigpCi0KLXB1YmxpYyBib29sZWFuIGlzRXhwaXJlZCgKLWphdmEudXRpbC5EYXRlKQotCi1wdWJsaWMgYm9vbGVhbiBpc1BlcnNpc3RlbnQoKQotCi1wdWJsaWMgYm9vbGVhbiBpc1NlY3VyZSgpCi0KLXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHNldENvbW1lbnQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXREb21haW4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRFeHBpcnlEYXRlKAotamF2YS51dGlsLkRhdGUpCi0KLXB1YmxpYyB2b2lkIHNldFBhdGgoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRTZWN1cmUoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRWYWx1ZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHNldFZlcnNpb24oCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb29raWUuQmFzaWNDbGllbnRDb29raWUyIGV4dGVuZHMgb3JnLmFwYWNoZS5odHRwLmltcGwuY29va2llLkJhc2ljQ2xpZW50Q29va2llIGltcGxlbWVudHMgb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5TZXRDb29raWUyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBjb21tZW50VVJMCi0KLXByaXZhdGUgYm9vbGVhbiBkaXNjYXJkCi0KLXByaXZhdGUgaW50W10gcG9ydHMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGNsb25lKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Q29tbWVudFVSTCgpCi0KLXB1YmxpYyBpbnRbXSBnZXRQb3J0cygpCi0KLXB1YmxpYyBib29sZWFuIGlzRXhwaXJlZCgKLWphdmEudXRpbC5EYXRlKQotCi1wdWJsaWMgYm9vbGVhbiBpc1BlcnNpc3RlbnQoKQotCi1wdWJsaWMgdm9pZCBzZXRDb21tZW50VVJMKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0RGlzY2FyZCgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldFBvcnRzKAotaW50W10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmltcGwuY29va2llLkJhc2ljQ29tbWVudEhhbmRsZXIgZXh0ZW5kcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb29raWUuQWJzdHJhY3RDb29raWVBdHRyaWJ1dGVIYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL2Nvb2tpZS9NYWxmb3JtZWRDb29raWVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHBhcnNlKAotb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5TZXRDb29raWUKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmltcGwuY29va2llLkJhc2ljRG9tYWluSGFuZGxlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmh0dHAuY29va2llLkNvb2tpZUF0dHJpYnV0ZUhhbmRsZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgYm9vbGVhbiBtYXRjaCgKLW9yZy5hcGFjaGUuaHR0cC5jb29raWUuQ29va2llCi1vcmcuYXBhY2hlLmh0dHAuY29va2llLkNvb2tpZU9yaWdpbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL2Nvb2tpZS9NYWxmb3JtZWRDb29raWVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHBhcnNlKAotb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5TZXRDb29raWUKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9jb29raWUvTWFsZm9ybWVkQ29va2llRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB2YWxpZGF0ZSgKLW9yZy5hcGFjaGUuaHR0cC5jb29raWUuQ29va2llCi1vcmcuYXBhY2hlLmh0dHAuY29va2llLkNvb2tpZU9yaWdpbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb29raWUuQmFzaWNFeHBpcmVzSGFuZGxlciBleHRlbmRzIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvb2tpZS5BYnN0cmFjdENvb2tpZUF0dHJpYnV0ZUhhbmRsZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gZGF0ZXBhdHRlcm5zCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZ1tdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvY29va2llL01hbGZvcm1lZENvb2tpZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcGFyc2UoCi1vcmcuYXBhY2hlLmh0dHAuY29va2llLlNldENvb2tpZQotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb29raWUuQmFzaWNNYXhBZ2VIYW5kbGVyIGV4dGVuZHMgb3JnLmFwYWNoZS5odHRwLmltcGwuY29va2llLkFic3RyYWN0Q29va2llQXR0cmlidXRlSGFuZGxlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9jb29raWUvTWFsZm9ybWVkQ29va2llRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBwYXJzZSgKLW9yZy5hcGFjaGUuaHR0cC5jb29raWUuU2V0Q29va2llCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvb2tpZS5CYXNpY1BhdGhIYW5kbGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaHR0cC5jb29raWUuQ29va2llQXR0cmlidXRlSGFuZGxlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBib29sZWFuIG1hdGNoKAotb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5Db29raWUKLW9yZy5hcGFjaGUuaHR0cC5jb29raWUuQ29va2llT3JpZ2luKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvY29va2llL01hbGZvcm1lZENvb2tpZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcGFyc2UoCi1vcmcuYXBhY2hlLmh0dHAuY29va2llLlNldENvb2tpZQotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL2Nvb2tpZS9NYWxmb3JtZWRDb29raWVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHZhbGlkYXRlKAotb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5Db29raWUKLW9yZy5hcGFjaGUuaHR0cC5jb29raWUuQ29va2llT3JpZ2luKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvb2tpZS5CYXNpY1NlY3VyZUhhbmRsZXIgZXh0ZW5kcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb29raWUuQWJzdHJhY3RDb29raWVBdHRyaWJ1dGVIYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGJvb2xlYW4gbWF0Y2goCi1vcmcuYXBhY2hlLmh0dHAuY29va2llLkNvb2tpZQotb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5Db29raWVPcmlnaW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9jb29raWUvTWFsZm9ybWVkQ29va2llRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBwYXJzZSgKLW9yZy5hcGFjaGUuaHR0cC5jb29raWUuU2V0Q29va2llCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvb2tpZS5CZXN0TWF0Y2hTcGVjIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaHR0cC5jb29raWUuQ29va2llU3BlYwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvb2tpZS5Ccm93c2VyQ29tcGF0U3BlYyBjb21wYXQKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gZGF0ZXBhdHRlcm5zCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5odHRwLmltcGwuY29va2llLk5ldHNjYXBlRHJhZnRTcGVjIG5ldHNjYXBlCi0KLXByaXZhdGUgZmluYWwgYm9vbGVhbiBvbmVIZWFkZXIKLQotcHJpdmF0ZSBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb29raWUuUkZDMjk2NVNwZWMgc3RyaWN0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZ1tdCi1ib29sZWFuKQotCi1wcml2YXRlIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvb2tpZS5Ccm93c2VyQ29tcGF0U3BlYyBnZXRDb21wYXQoKQotCi1wcml2YXRlIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvb2tpZS5OZXRzY2FwZURyYWZ0U3BlYyBnZXROZXRzY2FwZSgpCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5odHRwLmltcGwuY29va2llLlJGQzI5NjVTcGVjIGdldFN0cmljdCgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTGlzdDxMb3JnL2FwYWNoZS9odHRwL2Nvb2tpZS9Db29raWU7PjspTGphdmEvdXRpbC9MaXN0PExvcmcvYXBhY2hlL2h0dHAvSGVhZGVyOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBmb3JtYXRDb29raWVzKAotamF2YS51dGlsLkxpc3QpCi0KLXB1YmxpYyBpbnQgZ2V0VmVyc2lvbigpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAuSGVhZGVyIGdldFZlcnNpb25IZWFkZXIoKQotCi1wdWJsaWMgYm9vbGVhbiBtYXRjaCgKLW9yZy5hcGFjaGUuaHR0cC5jb29raWUuQ29va2llCi1vcmcuYXBhY2hlLmh0dHAuY29va2llLkNvb2tpZU9yaWdpbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL2Nvb2tpZS9NYWxmb3JtZWRDb29raWVFeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTG9yZy9hcGFjaGUvaHR0cC9IZWFkZXI7TG9yZy9hcGFjaGUvaHR0cC9jb29raWUvQ29va2llT3JpZ2luOylMamF2YS91dGlsL0xpc3Q8TG9yZy9hcGFjaGUvaHR0cC9jb29raWUvQ29va2llOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBwYXJzZSgKLW9yZy5hcGFjaGUuaHR0cC5IZWFkZXIKLW9yZy5hcGFjaGUuaHR0cC5jb29raWUuQ29va2llT3JpZ2luKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvY29va2llL01hbGZvcm1lZENvb2tpZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgdmFsaWRhdGUoCi1vcmcuYXBhY2hlLmh0dHAuY29va2llLkNvb2tpZQotb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5Db29raWVPcmlnaW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmltcGwuY29va2llLkJlc3RNYXRjaFNwZWNGYWN0b3J5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaHR0cC5jb29raWUuQ29va2llU3BlY0ZhY3RvcnkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5Db29raWVTcGVjIG5ld0luc3RhbmNlKAotb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvb2tpZS5Db29raWVTcGVjQmFzZSBleHRlbmRzIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvb2tpZS5BYnN0cmFjdENvb2tpZVNwZWMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcm90ZWN0ZWQgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RGVmYXVsdERvbWFpbigKLW9yZy5hcGFjaGUuaHR0cC5jb29raWUuQ29va2llT3JpZ2luKQotCi1wcm90ZWN0ZWQgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RGVmYXVsdFBhdGgoCi1vcmcuYXBhY2hlLmh0dHAuY29va2llLkNvb2tpZU9yaWdpbikKLQotcHVibGljIGJvb2xlYW4gbWF0Y2goCi1vcmcuYXBhY2hlLmh0dHAuY29va2llLkNvb2tpZQotb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5Db29raWVPcmlnaW4pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFtMb3JnL2FwYWNoZS9odHRwL0hlYWRlckVsZW1lbnQ7TG9yZy9hcGFjaGUvaHR0cC9jb29raWUvQ29va2llT3JpZ2luOylMamF2YS91dGlsL0xpc3Q8TG9yZy9hcGFjaGUvaHR0cC9jb29raWUvQ29va2llOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL2Nvb2tpZS9NYWxmb3JtZWRDb29raWVFeGNlcHRpb247ICkKLXByb3RlY3RlZCBqYXZhLnV0aWwuTGlzdCBwYXJzZSgKLW9yZy5hcGFjaGUuaHR0cC5IZWFkZXJFbGVtZW50W10KLW9yZy5hcGFjaGUuaHR0cC5jb29raWUuQ29va2llT3JpZ2luKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvY29va2llL01hbGZvcm1lZENvb2tpZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgdmFsaWRhdGUoCi1vcmcuYXBhY2hlLmh0dHAuY29va2llLkNvb2tpZQotb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5Db29raWVPcmlnaW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmltcGwuY29va2llLkJyb3dzZXJDb21wYXRTcGVjIGV4dGVuZHMgb3JnLmFwYWNoZS5odHRwLmltcGwuY29va2llLkNvb2tpZVNwZWNCYXNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZ1tdIERBVEVfUEFUVEVSTlMKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gZGF0ZXBhdHRlcm5zCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nW10pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTGlzdDxMb3JnL2FwYWNoZS9odHRwL2Nvb2tpZS9Db29raWU7PjspTGphdmEvdXRpbC9MaXN0PExvcmcvYXBhY2hlL2h0dHAvSGVhZGVyOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBmb3JtYXRDb29raWVzKAotamF2YS51dGlsLkxpc3QpCi0KLXB1YmxpYyBpbnQgZ2V0VmVyc2lvbigpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAuSGVhZGVyIGdldFZlcnNpb25IZWFkZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMb3JnL2FwYWNoZS9odHRwL0hlYWRlcjtMb3JnL2FwYWNoZS9odHRwL2Nvb2tpZS9Db29raWVPcmlnaW47KUxqYXZhL3V0aWwvTGlzdDxMb3JnL2FwYWNoZS9odHRwL2Nvb2tpZS9Db29raWU7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvY29va2llL01hbGZvcm1lZENvb2tpZUV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEudXRpbC5MaXN0IHBhcnNlKAotb3JnLmFwYWNoZS5odHRwLkhlYWRlcgotb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5Db29raWVPcmlnaW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmltcGwuY29va2llLkJyb3dzZXJDb21wYXRTcGVjRmFjdG9yeSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmh0dHAuY29va2llLkNvb2tpZVNwZWNGYWN0b3J5Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5jb29raWUuQ29va2llU3BlYyBuZXdJbnN0YW5jZSgKLW9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb29raWUuRGF0ZVBhcnNlRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLkV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL1RocmVhZExvY2FsPExqYXZhL2xhbmcvcmVmL1NvZnRSZWZlcmVuY2U8TGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvdGV4dC9TaW1wbGVEYXRlRm9ybWF0Oz47Pjs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL2ltcGwvY29va2llL0RhdGVVdGlscyREYXRlRm9ybWF0SG9sZGVyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1maW5hbCBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb29raWUuRGF0ZVV0aWxzJERhdGVGb3JtYXRIb2xkZXIkMSBleHRlbmRzIGphdmEubGFuZy5UaHJlYWRMb2NhbAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXByb3RlY3RlZCB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IGluaXRpYWxWYWx1ZSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS9sYW5nL3JlZi9Tb2Z0UmVmZXJlbmNlPExqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL3RleHQvU2ltcGxlRGF0ZUZvcm1hdDs+Oz47ICkKLXByb3RlY3RlZCBqYXZhLmxhbmcucmVmLlNvZnRSZWZlcmVuY2UgaW5pdGlhbFZhbHVlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI0IG5hbWUgPURhdGVGb3JtYXRIb2xkZXIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9pbXBsL2Nvb2tpZS9EYXRlVXRpbHM7ICkKLWZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvb2tpZS5EYXRlVXRpbHMkRGF0ZUZvcm1hdEhvbGRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL1RocmVhZExvY2FsPExqYXZhL2xhbmcvcmVmL1NvZnRSZWZlcmVuY2U8TGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvdGV4dC9TaW1wbGVEYXRlRm9ybWF0Oz47Pjs+OyApCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuVGhyZWFkTG9jYWwgVEhSRUFETE9DQUxfRk9STUFUUwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdCBmb3JtYXRGb3IoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9pbXBsL2Nvb2tpZS9EYXRlVXRpbHMkRGF0ZUZvcm1hdEhvbGRlcjsgKQotcHVibGljIGZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvb2tpZS5EYXRlVXRpbHMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmdbXSBERUZBVUxUX1BBVFRFUk5TCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEudXRpbC5EYXRlIERFRkFVTFRfVFdPX0RJR0lUX1lFQVJfU1RBUlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuVGltZVpvbmUgR01UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQQVRURVJOX0FTQ1RJTUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBBVFRFUk5fUkZDMTAzNgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUEFUVEVSTl9SRkMxMTIzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGZvcm1hdERhdGUoCi1qYXZhLnV0aWwuRGF0ZSkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGZvcm1hdERhdGUoCi1qYXZhLnV0aWwuRGF0ZQotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL2ltcGwvY29va2llL0RhdGVQYXJzZUV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuRGF0ZSBwYXJzZURhdGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvaW1wbC9jb29raWUvRGF0ZVBhcnNlRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5EYXRlIHBhcnNlRGF0ZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmdbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL2ltcGwvY29va2llL0RhdGVQYXJzZUV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuRGF0ZSBwYXJzZURhdGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nW10KLWphdmEudXRpbC5EYXRlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvb2tpZS5OZXRzY2FwZURvbWFpbkhhbmRsZXIgZXh0ZW5kcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb29raWUuQmFzaWNEb21haW5IYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1NwZWNpYWxEb21haW4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYm9vbGVhbiBtYXRjaCgKLW9yZy5hcGFjaGUuaHR0cC5jb29raWUuQ29va2llCi1vcmcuYXBhY2hlLmh0dHAuY29va2llLkNvb2tpZU9yaWdpbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL2Nvb2tpZS9NYWxmb3JtZWRDb29raWVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHZhbGlkYXRlKAotb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5Db29raWUKLW9yZy5hcGFjaGUuaHR0cC5jb29raWUuQ29va2llT3JpZ2luKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvb2tpZS5OZXRzY2FwZURyYWZ0SGVhZGVyUGFyc2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvb2tpZS5OZXRzY2FwZURyYWZ0SGVhZGVyUGFyc2VyIERFRkFVTFQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIERFTElNSVRFUlMKLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmh0dHAubWVzc2FnZS5CYXNpY0hlYWRlclZhbHVlUGFyc2VyIG52cFBhcnNlcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL1BhcnNlRXhjZXB0aW9uOyApCi1wdWJsaWMgb3JnLmFwYWNoZS5odHRwLkhlYWRlckVsZW1lbnQgcGFyc2VIZWFkZXIoCi1vcmcuYXBhY2hlLmh0dHAudXRpbC5DaGFyQXJyYXlCdWZmZXIKLW9yZy5hcGFjaGUuaHR0cC5tZXNzYWdlLlBhcnNlckN1cnNvcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb29raWUuTmV0c2NhcGVEcmFmdFNwZWMgZXh0ZW5kcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb29raWUuQ29va2llU3BlY0Jhc2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEVYUElSRVNfUEFUVEVSTgotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmdbXSBkYXRlcGF0dGVybnMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nW10pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTGlzdDxMb3JnL2FwYWNoZS9odHRwL2Nvb2tpZS9Db29raWU7PjspTGphdmEvdXRpbC9MaXN0PExvcmcvYXBhY2hlL2h0dHAvSGVhZGVyOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBmb3JtYXRDb29raWVzKAotamF2YS51dGlsLkxpc3QpCi0KLXB1YmxpYyBpbnQgZ2V0VmVyc2lvbigpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAuSGVhZGVyIGdldFZlcnNpb25IZWFkZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMb3JnL2FwYWNoZS9odHRwL0hlYWRlcjtMb3JnL2FwYWNoZS9odHRwL2Nvb2tpZS9Db29raWVPcmlnaW47KUxqYXZhL3V0aWwvTGlzdDxMb3JnL2FwYWNoZS9odHRwL2Nvb2tpZS9Db29raWU7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvY29va2llL01hbGZvcm1lZENvb2tpZUV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEudXRpbC5MaXN0IHBhcnNlKAotb3JnLmFwYWNoZS5odHRwLkhlYWRlcgotb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5Db29raWVPcmlnaW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmltcGwuY29va2llLk5ldHNjYXBlRHJhZnRTcGVjRmFjdG9yeSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmh0dHAuY29va2llLkNvb2tpZVNwZWNGYWN0b3J5Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5jb29raWUuQ29va2llU3BlYyBuZXdJbnN0YW5jZSgKLW9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb29raWUuUkZDMjEwOURvbWFpbkhhbmRsZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5Db29raWVBdHRyaWJ1dGVIYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGJvb2xlYW4gbWF0Y2goCi1vcmcuYXBhY2hlLmh0dHAuY29va2llLkNvb2tpZQotb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5Db29raWVPcmlnaW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9jb29raWUvTWFsZm9ybWVkQ29va2llRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBwYXJzZSgKLW9yZy5hcGFjaGUuaHR0cC5jb29raWUuU2V0Q29va2llCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvY29va2llL01hbGZvcm1lZENvb2tpZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgdmFsaWRhdGUoCi1vcmcuYXBhY2hlLmh0dHAuY29va2llLkNvb2tpZQotb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5Db29raWVPcmlnaW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmltcGwuY29va2llLlJGQzIxMDlTcGVjIGV4dGVuZHMgb3JnLmFwYWNoZS5odHRwLmltcGwuY29va2llLkNvb2tpZVNwZWNCYXNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmdbXSBEQVRFX1BBVFRFUk5TCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5jb29raWUuQ29va2llUGF0aENvbXBhcmF0b3IgUEFUSF9DT01QQVJBVE9SCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZ1tdIGRhdGVwYXR0ZXJucwotCi1wcml2YXRlIGZpbmFsIGJvb2xlYW4gb25lSGVhZGVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nW10KLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTGlzdDxMb3JnL2FwYWNoZS9odHRwL2Nvb2tpZS9Db29raWU7PjspTGphdmEvdXRpbC9MaXN0PExvcmcvYXBhY2hlL2h0dHAvSGVhZGVyOz47ICkKLXByaXZhdGUgamF2YS51dGlsLkxpc3QgZG9Gb3JtYXRNYW55SGVhZGVycygKLWphdmEudXRpbC5MaXN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0xpc3Q8TG9yZy9hcGFjaGUvaHR0cC9jb29raWUvQ29va2llOz47KUxqYXZhL3V0aWwvTGlzdDxMb3JnL2FwYWNoZS9odHRwL0hlYWRlcjs+OyApCi1wcml2YXRlIGphdmEudXRpbC5MaXN0IGRvRm9ybWF0T25lSGVhZGVyKAotamF2YS51dGlsLkxpc3QpCi0KLXByb3RlY3RlZCB2b2lkIGZvcm1hdENvb2tpZUFzVmVyKAotb3JnLmFwYWNoZS5odHRwLnV0aWwuQ2hhckFycmF5QnVmZmVyCi1vcmcuYXBhY2hlLmh0dHAuY29va2llLkNvb2tpZQotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0xpc3Q8TG9yZy9hcGFjaGUvaHR0cC9jb29raWUvQ29va2llOz47KUxqYXZhL3V0aWwvTGlzdDxMb3JnL2FwYWNoZS9odHRwL0hlYWRlcjs+OyApCi1wdWJsaWMgamF2YS51dGlsLkxpc3QgZm9ybWF0Q29va2llcygKLWphdmEudXRpbC5MaXN0KQotCi1wcm90ZWN0ZWQgdm9pZCBmb3JtYXRQYXJhbUFzVmVyKAotb3JnLmFwYWNoZS5odHRwLnV0aWwuQ2hhckFycmF5QnVmZmVyCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0VmVyc2lvbigpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAuSGVhZGVyIGdldFZlcnNpb25IZWFkZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMb3JnL2FwYWNoZS9odHRwL0hlYWRlcjtMb3JnL2FwYWNoZS9odHRwL2Nvb2tpZS9Db29raWVPcmlnaW47KUxqYXZhL3V0aWwvTGlzdDxMb3JnL2FwYWNoZS9odHRwL2Nvb2tpZS9Db29raWU7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvY29va2llL01hbGZvcm1lZENvb2tpZUV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEudXRpbC5MaXN0IHBhcnNlKAotb3JnLmFwYWNoZS5odHRwLkhlYWRlcgotb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5Db29raWVPcmlnaW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9jb29raWUvTWFsZm9ybWVkQ29va2llRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB2YWxpZGF0ZSgKLW9yZy5hcGFjaGUuaHR0cC5jb29raWUuQ29va2llCi1vcmcuYXBhY2hlLmh0dHAuY29va2llLkNvb2tpZU9yaWdpbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb29raWUuUkZDMjEwOVNwZWNGYWN0b3J5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaHR0cC5jb29raWUuQ29va2llU3BlY0ZhY3RvcnkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5Db29raWVTcGVjIG5ld0luc3RhbmNlKAotb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvb2tpZS5SRkMyMTA5VmVyc2lvbkhhbmRsZXIgZXh0ZW5kcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb29raWUuQWJzdHJhY3RDb29raWVBdHRyaWJ1dGVIYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL2Nvb2tpZS9NYWxmb3JtZWRDb29raWVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHBhcnNlKAotb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5TZXRDb29raWUKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9jb29raWUvTWFsZm9ybWVkQ29va2llRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB2YWxpZGF0ZSgKLW9yZy5hcGFjaGUuaHR0cC5jb29raWUuQ29va2llCi1vcmcuYXBhY2hlLmh0dHAuY29va2llLkNvb2tpZU9yaWdpbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb29raWUuUkZDMjk2NUNvbW1lbnRVcmxBdHRyaWJ1dGVIYW5kbGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaHR0cC5jb29raWUuQ29va2llQXR0cmlidXRlSGFuZGxlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBib29sZWFuIG1hdGNoKAotb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5Db29raWUKLW9yZy5hcGFjaGUuaHR0cC5jb29raWUuQ29va2llT3JpZ2luKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvY29va2llL01hbGZvcm1lZENvb2tpZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcGFyc2UoCi1vcmcuYXBhY2hlLmh0dHAuY29va2llLlNldENvb2tpZQotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL2Nvb2tpZS9NYWxmb3JtZWRDb29raWVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHZhbGlkYXRlKAotb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5Db29raWUKLW9yZy5hcGFjaGUuaHR0cC5jb29raWUuQ29va2llT3JpZ2luKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvb2tpZS5SRkMyOTY1RGlzY2FyZEF0dHJpYnV0ZUhhbmRsZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5Db29raWVBdHRyaWJ1dGVIYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGJvb2xlYW4gbWF0Y2goCi1vcmcuYXBhY2hlLmh0dHAuY29va2llLkNvb2tpZQotb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5Db29raWVPcmlnaW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9jb29raWUvTWFsZm9ybWVkQ29va2llRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBwYXJzZSgKLW9yZy5hcGFjaGUuaHR0cC5jb29raWUuU2V0Q29va2llCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvY29va2llL01hbGZvcm1lZENvb2tpZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgdmFsaWRhdGUoCi1vcmcuYXBhY2hlLmh0dHAuY29va2llLkNvb2tpZQotb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5Db29raWVPcmlnaW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmltcGwuY29va2llLlJGQzI5NjVEb21haW5BdHRyaWJ1dGVIYW5kbGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaHR0cC5jb29raWUuQ29va2llQXR0cmlidXRlSGFuZGxlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBib29sZWFuIGRvbWFpbk1hdGNoKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJvb2xlYW4gbWF0Y2goCi1vcmcuYXBhY2hlLmh0dHAuY29va2llLkNvb2tpZQotb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5Db29raWVPcmlnaW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9jb29raWUvTWFsZm9ybWVkQ29va2llRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBwYXJzZSgKLW9yZy5hcGFjaGUuaHR0cC5jb29raWUuU2V0Q29va2llCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvY29va2llL01hbGZvcm1lZENvb2tpZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgdmFsaWRhdGUoCi1vcmcuYXBhY2hlLmh0dHAuY29va2llLkNvb2tpZQotb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5Db29raWVPcmlnaW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmltcGwuY29va2llLlJGQzI5NjVQb3J0QXR0cmlidXRlSGFuZGxlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmh0dHAuY29va2llLkNvb2tpZUF0dHJpYnV0ZUhhbmRsZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvY29va2llL01hbGZvcm1lZENvb2tpZUV4Y2VwdGlvbjsgKQotcHJpdmF0ZSBzdGF0aWMgaW50W10gcGFyc2VQb3J0QXR0cmlidXRlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBwb3J0TWF0Y2goCi1pbnQKLWludFtdKQotCi1wdWJsaWMgYm9vbGVhbiBtYXRjaCgKLW9yZy5hcGFjaGUuaHR0cC5jb29raWUuQ29va2llCi1vcmcuYXBhY2hlLmh0dHAuY29va2llLkNvb2tpZU9yaWdpbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL2Nvb2tpZS9NYWxmb3JtZWRDb29raWVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHBhcnNlKAotb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5TZXRDb29raWUKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9jb29raWUvTWFsZm9ybWVkQ29va2llRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB2YWxpZGF0ZSgKLW9yZy5hcGFjaGUuaHR0cC5jb29raWUuQ29va2llCi1vcmcuYXBhY2hlLmh0dHAuY29va2llLkNvb2tpZU9yaWdpbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb29raWUuUkZDMjk2NVNwZWMgZXh0ZW5kcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb29raWUuUkZDMjEwOVNwZWMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nW10KLWJvb2xlYW4pCi0KLXByaXZhdGUgc3RhdGljIG9yZy5hcGFjaGUuaHR0cC5jb29raWUuQ29va2llT3JpZ2luIGFkanVzdEVmZmVjdGl2ZUhvc3QoCi1vcmcuYXBhY2hlLmh0dHAuY29va2llLkNvb2tpZU9yaWdpbikKLQotcHJpdmF0ZSBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb29raWUuQmFzaWNDbGllbnRDb29raWUgY3JlYXRlQ29va2llKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5Db29raWVPcmlnaW4pCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5odHRwLmltcGwuY29va2llLkJhc2ljQ2xpZW50Q29va2llIGNyZWF0ZUNvb2tpZTIoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1vcmcuYXBhY2hlLmh0dHAuY29va2llLkNvb2tpZU9yaWdpbikKLQotcHJvdGVjdGVkIHZvaWQgZm9ybWF0Q29va2llQXNWZXIoCi1vcmcuYXBhY2hlLmh0dHAudXRpbC5DaGFyQXJyYXlCdWZmZXIKLW9yZy5hcGFjaGUuaHR0cC5jb29raWUuQ29va2llCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0VmVyc2lvbigpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAuSGVhZGVyIGdldFZlcnNpb25IZWFkZXIoKQotCi1wdWJsaWMgYm9vbGVhbiBtYXRjaCgKLW9yZy5hcGFjaGUuaHR0cC5jb29raWUuQ29va2llCi1vcmcuYXBhY2hlLmh0dHAuY29va2llLkNvb2tpZU9yaWdpbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL2Nvb2tpZS9NYWxmb3JtZWRDb29raWVFeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTG9yZy9hcGFjaGUvaHR0cC9IZWFkZXI7TG9yZy9hcGFjaGUvaHR0cC9jb29raWUvQ29va2llT3JpZ2luOylMamF2YS91dGlsL0xpc3Q8TG9yZy9hcGFjaGUvaHR0cC9jb29raWUvQ29va2llOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBwYXJzZSgKLW9yZy5hcGFjaGUuaHR0cC5IZWFkZXIKLW9yZy5hcGFjaGUuaHR0cC5jb29raWUuQ29va2llT3JpZ2luKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvY29va2llL01hbGZvcm1lZENvb2tpZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgdmFsaWRhdGUoCi1vcmcuYXBhY2hlLmh0dHAuY29va2llLkNvb2tpZQotb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5Db29raWVPcmlnaW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmltcGwuY29va2llLlJGQzI5NjVTcGVjRmFjdG9yeSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmh0dHAuY29va2llLkNvb2tpZVNwZWNGYWN0b3J5Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5jb29raWUuQ29va2llU3BlYyBuZXdJbnN0YW5jZSgKLW9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb29raWUuUkZDMjk2NVZlcnNpb25BdHRyaWJ1dGVIYW5kbGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaHR0cC5jb29raWUuQ29va2llQXR0cmlidXRlSGFuZGxlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBib29sZWFuIG1hdGNoKAotb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5Db29raWUKLW9yZy5hcGFjaGUuaHR0cC5jb29raWUuQ29va2llT3JpZ2luKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvY29va2llL01hbGZvcm1lZENvb2tpZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcGFyc2UoCi1vcmcuYXBhY2hlLmh0dHAuY29va2llLlNldENvb2tpZQotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL2Nvb2tpZS9NYWxmb3JtZWRDb29raWVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHZhbGlkYXRlKAotb3JnLmFwYWNoZS5odHRwLmNvb2tpZS5Db29raWUKLW9yZy5hcGFjaGUuaHR0cC5jb29raWUuQ29va2llT3JpZ2luKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmVudGl0eS5FbnRpdHlEZXNlcmlhbGl6ZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgb3JnLmFwYWNoZS5odHRwLmVudGl0eS5Db250ZW50TGVuZ3RoU3RyYXRlZ3kgbGVuU3RyYXRlZ3kKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmh0dHAuZW50aXR5LkNvbnRlbnRMZW5ndGhTdHJhdGVneSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL0h0dHBFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAuSHR0cEVudGl0eSBkZXNlcmlhbGl6ZSgKLW9yZy5hcGFjaGUuaHR0cC5pby5TZXNzaW9uSW5wdXRCdWZmZXIKLW9yZy5hcGFjaGUuaHR0cC5IdHRwTWVzc2FnZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL0h0dHBFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCBvcmcuYXBhY2hlLmh0dHAuZW50aXR5LkJhc2ljSHR0cEVudGl0eSBkb0Rlc2VyaWFsaXplKAotb3JnLmFwYWNoZS5odHRwLmlvLlNlc3Npb25JbnB1dEJ1ZmZlcgotb3JnLmFwYWNoZS5odHRwLkh0dHBNZXNzYWdlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmVudGl0eS5FbnRpdHlTZXJpYWxpemVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5lbnRpdHkuQ29udGVudExlbmd0aFN0cmF0ZWd5IGxlblN0cmF0ZWd5Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5odHRwLmVudGl0eS5Db250ZW50TGVuZ3RoU3RyYXRlZ3kpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9IdHRwRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgamF2YS5pby5PdXRwdXRTdHJlYW0gZG9TZXJpYWxpemUoCi1vcmcuYXBhY2hlLmh0dHAuaW8uU2Vzc2lvbk91dHB1dEJ1ZmZlcgotb3JnLmFwYWNoZS5odHRwLkh0dHBNZXNzYWdlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvSHR0cEV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2VyaWFsaXplKAotb3JnLmFwYWNoZS5odHRwLmlvLlNlc3Npb25PdXRwdXRCdWZmZXIKLW9yZy5hcGFjaGUuaHR0cC5IdHRwTWVzc2FnZQotb3JnLmFwYWNoZS5odHRwLkh0dHBFbnRpdHkpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmltcGwuZW50aXR5LkxheENvbnRlbnRMZW5ndGhTdHJhdGVneSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmh0dHAuZW50aXR5LkNvbnRlbnRMZW5ndGhTdHJhdGVneQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9IdHRwRXhjZXB0aW9uOyApCi1wdWJsaWMgbG9uZyBkZXRlcm1pbmVMZW5ndGgoCi1vcmcuYXBhY2hlLmh0dHAuSHR0cE1lc3NhZ2UpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmltcGwuZW50aXR5LlN0cmljdENvbnRlbnRMZW5ndGhTdHJhdGVneSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmh0dHAuZW50aXR5LkNvbnRlbnRMZW5ndGhTdHJhdGVneQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9IdHRwRXhjZXB0aW9uOyApCi1wdWJsaWMgbG9uZyBkZXRlcm1pbmVMZW5ndGgoCi1vcmcuYXBhY2hlLmh0dHAuSHR0cE1lc3NhZ2UpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5pby5IdHRwTWVzc2FnZVdyaXRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xvcmcvYXBhY2hlL2h0dHAvSHR0cEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGUoCi1vcmcuYXBhY2hlLmh0dHAuSHR0cE1lc3NhZ2UpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmltcGwuaW8uQWJzdHJhY3RNZXNzYWdlV3JpdGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaHR0cC5pby5IdHRwTWVzc2FnZVdyaXRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgZmluYWwgb3JnLmFwYWNoZS5odHRwLnV0aWwuQ2hhckFycmF5QnVmZmVyIGxpbmVCdWYKLQotcHJvdGVjdGVkIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5tZXNzYWdlLkxpbmVGb3JtYXR0ZXIgbGluZUZvcm1hdHRlcgotCi1wcm90ZWN0ZWQgZmluYWwgb3JnLmFwYWNoZS5odHRwLmlvLlNlc3Npb25PdXRwdXRCdWZmZXIgc2Vzc2lvbkJ1ZmZlcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaHR0cC5pby5TZXNzaW9uT3V0cHV0QnVmZmVyCi1vcmcuYXBhY2hlLmh0dHAubWVzc2FnZS5MaW5lRm9ybWF0dGVyCi1vcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TG9yZy9hcGFjaGUvaHR0cC9IdHRwRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB3cml0ZSgKLW9yZy5hcGFjaGUuaHR0cC5IdHRwTWVzc2FnZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgd3JpdGVIZWFkTGluZSgKLW9yZy5hcGFjaGUuaHR0cC5IdHRwTWVzc2FnZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5pby5BYnN0cmFjdFNlc3Npb25JbnB1dEJ1ZmZlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmh0dHAuaW8uU2Vzc2lvbklucHV0QnVmZmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYm9vbGVhbiBhc2NpaQotCi1wcml2YXRlIGJ5dGVbXSBidWZmZXIKLQotcHJpdmF0ZSBpbnQgYnVmZmVybGVuCi0KLXByaXZhdGUgaW50IGJ1ZmZlcnBvcwotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgY2hhcnNldAotCi1wcml2YXRlIGphdmEuaW8uSW5wdXRTdHJlYW0gaW5zdHJlYW0KLQotcHJpdmF0ZSBvcmcuYXBhY2hlLmh0dHAudXRpbC5CeXRlQXJyYXlCdWZmZXIgbGluZWJ1ZmZlcgotCi1wcml2YXRlIGludCBtYXhMaW5lTGVuCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5odHRwLmltcGwuaW8uSHR0cFRyYW5zcG9ydE1ldHJpY3NJbXBsIG1ldHJpY3MKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIGludCBsaW5lRnJvbUxpbmVCdWZmZXIoCi1vcmcuYXBhY2hlLmh0dHAudXRpbC5DaGFyQXJyYXlCdWZmZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgaW50IGxpbmVGcm9tUmVhZEJ1ZmZlcigKLW9yZy5hcGFjaGUuaHR0cC51dGlsLkNoYXJBcnJheUJ1ZmZlcgotaW50KQotCi1wcml2YXRlIGludCBsb2NhdGVMRigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCBpbnQgZmlsbEJ1ZmZlcigpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAuaW8uSHR0cFRyYW5zcG9ydE1ldHJpY3MgZ2V0TWV0cmljcygpCi0KLXByb3RlY3RlZCBib29sZWFuIGhhc0J1ZmZlcmVkRGF0YSgpCi0KLXByb3RlY3RlZCB2b2lkIGluaXQoCi1qYXZhLmlvLklucHV0U3RyZWFtCi1pbnQKLW9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCByZWFkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCByZWFkKAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoCi1ieXRlW10KLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWRMaW5lKAotb3JnLmFwYWNoZS5odHRwLnV0aWwuQ2hhckFycmF5QnVmZmVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyByZWFkTGluZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmltcGwuaW8uQWJzdHJhY3RTZXNzaW9uT3V0cHV0QnVmZmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaHR0cC5pby5TZXNzaW9uT3V0cHV0QnVmZmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBDUkxGCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfQ0hVTksKLQotcHJpdmF0ZSBib29sZWFuIGFzY2lpCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5odHRwLnV0aWwuQnl0ZUFycmF5QnVmZmVyIGJ1ZmZlcgotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgY2hhcnNldAotCi1wcml2YXRlIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmlvLkh0dHBUcmFuc3BvcnRNZXRyaWNzSW1wbCBtZXRyaWNzCi0KLXByaXZhdGUgamF2YS5pby5PdXRwdXRTdHJlYW0gb3V0c3RyZWFtCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBmbHVzaCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIGZsdXNoQnVmZmVyKCkKLQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5pby5IdHRwVHJhbnNwb3J0TWV0cmljcyBnZXRNZXRyaWNzKCkKLQotcHJvdGVjdGVkIHZvaWQgaW5pdCgKLWphdmEuaW8uT3V0cHV0U3RyZWFtCi1pbnQKLW9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgd3JpdGUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHdyaXRlKAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB3cml0ZSgKLWJ5dGVbXQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHdyaXRlTGluZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHdyaXRlTGluZSgKLW9yZy5hcGFjaGUuaHR0cC51dGlsLkNoYXJBcnJheUJ1ZmZlcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5pby5DaHVua2VkSW5wdXRTdHJlYW0gZXh0ZW5kcyBqYXZhLmlvLklucHV0U3RyZWFtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYm9vbGVhbiBib2YKLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmh0dHAudXRpbC5DaGFyQXJyYXlCdWZmZXIgYnVmZmVyCi0KLXByaXZhdGUgaW50IGNodW5rU2l6ZQotCi1wcml2YXRlIGJvb2xlYW4gY2xvc2VkCi0KLXByaXZhdGUgYm9vbGVhbiBlb2YKLQotcHJpdmF0ZSBvcmcuYXBhY2hlLmh0dHAuSGVhZGVyW10gZm9vdGVycwotCi1wcml2YXRlIG9yZy5hcGFjaGUuaHR0cC5pby5TZXNzaW9uSW5wdXRCdWZmZXIgaW4KLQotcHJpdmF0ZSBpbnQgcG9zCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5odHRwLmlvLlNlc3Npb25JbnB1dEJ1ZmZlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotc3RhdGljIHZvaWQgZXhoYXVzdElucHV0U3RyZWFtKAotamF2YS5pby5JbnB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBpbnQgZ2V0Q2h1bmtTaXplKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIG5leHRDaHVuaygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCBwYXJzZVRyYWlsZXJIZWFkZXJzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY2xvc2UoKQotCi1wdWJsaWMgb3JnLmFwYWNoZS5odHRwLkhlYWRlcltdIGdldEZvb3RlcnMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcmVhZCgKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmltcGwuaW8uQ2h1bmtlZE91dHB1dFN0cmVhbSBleHRlbmRzIGphdmEuaW8uT3V0cHV0U3RyZWFtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYnl0ZVtdIGNhY2hlCi0KLXByaXZhdGUgaW50IGNhY2hlUG9zaXRpb24KLQotcHJpdmF0ZSBib29sZWFuIGNsb3NlZAotCi1wcml2YXRlIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5pby5TZXNzaW9uT3V0cHV0QnVmZmVyIG91dAotCi1wcml2YXRlIGJvb2xlYW4gd3JvdGVMYXN0Q2h1bmsKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmh0dHAuaW8uU2Vzc2lvbk91dHB1dEJ1ZmZlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5odHRwLmlvLlNlc3Npb25PdXRwdXRCdWZmZXIKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY2xvc2UoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBmaW5pc2goKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBmbHVzaCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIGZsdXNoQ2FjaGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBmbHVzaENhY2hlV2l0aEFwcGVuZCgKLWJ5dGVbXQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHdyaXRlKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB3cml0ZSgKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgd3JpdGUoCi1ieXRlW10KLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCB3cml0ZUNsb3NpbmdDaHVuaygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmltcGwuaW8uQ29udGVudExlbmd0aElucHV0U3RyZWFtIGV4dGVuZHMgamF2YS5pby5JbnB1dFN0cmVhbQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVGRkVSX1NJWkUKLQotcHJpdmF0ZSBib29sZWFuIGNsb3NlZAotCi1wcml2YXRlIGxvbmcgY29udGVudExlbmd0aAotCi1wcml2YXRlIG9yZy5hcGFjaGUuaHR0cC5pby5TZXNzaW9uSW5wdXRCdWZmZXIgaW4KLQotcHJpdmF0ZSBsb25nIHBvcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaHR0cC5pby5TZXNzaW9uSW5wdXRCdWZmZXIKLWxvbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNsb3NlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCByZWFkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCByZWFkKAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoCi1ieXRlW10KLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgbG9uZyBza2lwKAotbG9uZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5pby5Db250ZW50TGVuZ3RoT3V0cHV0U3RyZWFtIGV4dGVuZHMgamF2YS5pby5PdXRwdXRTdHJlYW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBib29sZWFuIGNsb3NlZAotCi1wcml2YXRlIGZpbmFsIGxvbmcgY29udGVudExlbmd0aAotCi1wcml2YXRlIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5pby5TZXNzaW9uT3V0cHV0QnVmZmVyIG91dAotCi1wcml2YXRlIGxvbmcgdG90YWwKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmh0dHAuaW8uU2Vzc2lvbk91dHB1dEJ1ZmZlcgotbG9uZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY2xvc2UoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBmbHVzaCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHdyaXRlKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB3cml0ZSgKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgd3JpdGUoCi1ieXRlW10KLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmlvLkh0dHBSZXF1ZXN0UGFyc2VyIGV4dGVuZHMgb3JnLmFwYWNoZS5odHRwLmltcGwuaW8uQWJzdHJhY3RNZXNzYWdlUGFyc2VyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgb3JnLmFwYWNoZS5odHRwLnV0aWwuQ2hhckFycmF5QnVmZmVyIGxpbmVCdWYKLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlcXVlc3RGYWN0b3J5IHJlcXVlc3RGYWN0b3J5Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5odHRwLmlvLlNlc3Npb25JbnB1dEJ1ZmZlcgotb3JnLmFwYWNoZS5odHRwLm1lc3NhZ2UuTGluZVBhcnNlcgotb3JnLmFwYWNoZS5odHRwLkh0dHBSZXF1ZXN0RmFjdG9yeQotb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xvcmcvYXBhY2hlL2h0dHAvSHR0cEV4Y2VwdGlvbjtMb3JnL2FwYWNoZS9odHRwL1BhcnNlRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgb3JnLmFwYWNoZS5odHRwLkh0dHBNZXNzYWdlIHBhcnNlSGVhZCgKLW9yZy5hcGFjaGUuaHR0cC5pby5TZXNzaW9uSW5wdXRCdWZmZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmltcGwuaW8uSHR0cFJlcXVlc3RXcml0ZXIgZXh0ZW5kcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5pby5BYnN0cmFjdE1lc3NhZ2VXcml0ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmh0dHAuaW8uU2Vzc2lvbk91dHB1dEJ1ZmZlcgotb3JnLmFwYWNoZS5odHRwLm1lc3NhZ2UuTGluZUZvcm1hdHRlcgotb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCB3cml0ZUhlYWRMaW5lKAotb3JnLmFwYWNoZS5odHRwLkh0dHBNZXNzYWdlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmlvLkh0dHBSZXNwb25zZVBhcnNlciBleHRlbmRzIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmlvLkFic3RyYWN0TWVzc2FnZVBhcnNlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC51dGlsLkNoYXJBcnJheUJ1ZmZlciBsaW5lQnVmCi0KLXByaXZhdGUgZmluYWwgb3JnLmFwYWNoZS5odHRwLkh0dHBSZXNwb25zZUZhY3RvcnkgcmVzcG9uc2VGYWN0b3J5Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5odHRwLmlvLlNlc3Npb25JbnB1dEJ1ZmZlcgotb3JnLmFwYWNoZS5odHRwLm1lc3NhZ2UuTGluZVBhcnNlcgotb3JnLmFwYWNoZS5odHRwLkh0dHBSZXNwb25zZUZhY3RvcnkKLW9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMb3JnL2FwYWNoZS9odHRwL0h0dHBFeGNlcHRpb247TG9yZy9hcGFjaGUvaHR0cC9QYXJzZUV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIG9yZy5hcGFjaGUuaHR0cC5IdHRwTWVzc2FnZSBwYXJzZUhlYWQoCi1vcmcuYXBhY2hlLmh0dHAuaW8uU2Vzc2lvbklucHV0QnVmZmVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmlvLkh0dHBSZXNwb25zZVdyaXRlciBleHRlbmRzIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmlvLkFic3RyYWN0TWVzc2FnZVdyaXRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaHR0cC5pby5TZXNzaW9uT3V0cHV0QnVmZmVyCi1vcmcuYXBhY2hlLmh0dHAubWVzc2FnZS5MaW5lRm9ybWF0dGVyCi1vcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIHdyaXRlSGVhZExpbmUoCi1vcmcuYXBhY2hlLmh0dHAuSHR0cE1lc3NhZ2UpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5pby5IdHRwVHJhbnNwb3J0TWV0cmljcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgbG9uZyBnZXRCeXRlc1RyYW5zZmVycmVkKCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgcmVzZXQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmlvLkh0dHBUcmFuc3BvcnRNZXRyaWNzSW1wbCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmh0dHAuaW8uSHR0cFRyYW5zcG9ydE1ldHJpY3MKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBsb25nIGJ5dGVzVHJhbnNmZXJyZWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgbG9uZyBnZXRCeXRlc1RyYW5zZmVycmVkKCkKLQotcHVibGljIHZvaWQgaW5jcmVtZW50Qnl0ZXNUcmFuc2ZlcnJlZCgKLWxvbmcpCi0KLXB1YmxpYyB2b2lkIHJlc2V0KCkKLQotcHVibGljIHZvaWQgc2V0Qnl0ZXNUcmFuc2ZlcnJlZCgKLWxvbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmltcGwuaW8uSWRlbnRpdHlJbnB1dFN0cmVhbSBleHRlbmRzIGphdmEuaW8uSW5wdXRTdHJlYW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBib29sZWFuIGNsb3NlZAotCi1wcml2YXRlIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5pby5TZXNzaW9uSW5wdXRCdWZmZXIgaW4KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmh0dHAuaW8uU2Vzc2lvbklucHV0QnVmZmVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGF2YWlsYWJsZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNsb3NlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCByZWFkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCByZWFkKAotYnl0ZVtdCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5pby5JZGVudGl0eU91dHB1dFN0cmVhbSBleHRlbmRzIGphdmEuaW8uT3V0cHV0U3RyZWFtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYm9vbGVhbiBjbG9zZWQKLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuaW8uU2Vzc2lvbk91dHB1dEJ1ZmZlciBvdXQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmh0dHAuaW8uU2Vzc2lvbk91dHB1dEJ1ZmZlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY2xvc2UoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBmbHVzaCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHdyaXRlKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB3cml0ZSgKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgd3JpdGUoCi1ieXRlW10KLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmlvLlNvY2tldElucHV0QnVmZmVyIGV4dGVuZHMgb3JnLmFwYWNoZS5odHRwLmltcGwuaW8uQWJzdHJhY3RTZXNzaW9uSW5wdXRCdWZmZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkNsYXNzIFNPQ0tFVF9USU1FT1VUX0NMQVNTCi0KLXByaXZhdGUgZmluYWwgamF2YS5uZXQuU29ja2V0IHNvY2tldAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5uZXQuU29ja2V0Ci1pbnQKLW9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcykKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLkNsYXNzIFNvY2tldFRpbWVvdXRFeGNlcHRpb25DbGFzcygpCi0KLXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNTb2NrZXRUaW1lb3V0RXhjZXB0aW9uKAotamF2YS5pby5JbnRlcnJ1cHRlZElPRXhjZXB0aW9uKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBpc0RhdGFBdmFpbGFibGUoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLmltcGwuaW8uU29ja2V0T3V0cHV0QnVmZmVyIGV4dGVuZHMgb3JnLmFwYWNoZS5odHRwLmltcGwuaW8uQWJzdHJhY3RTZXNzaW9uT3V0cHV0QnVmZmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5uZXQuU29ja2V0Ci1pbnQKLW9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAubWVzc2FnZS5CYXNpY0hlYWRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmh0dHAuSGVhZGVyLCBqYXZhLmxhbmcuQ2xvbmVhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBuYW1lCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyB2YWx1ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9DbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgY2xvbmUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvUGFyc2VFeGNlcHRpb247ICkKLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAuSGVhZGVyRWxlbWVudFtdIGdldEVsZW1lbnRzKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TmFtZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFZhbHVlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5tZXNzYWdlLkJhc2ljSGVhZGVyRWxlbWVudCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmh0dHAuSGVhZGVyRWxlbWVudCwgamF2YS5sYW5nLkNsb25lYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgbmFtZQotCi1wcml2YXRlIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5OYW1lVmFsdWVQYWlyW10gcGFyYW1ldGVycwotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgdmFsdWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1vcmcuYXBhY2hlLmh0dHAuTmFtZVZhbHVlUGFpcltdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGNsb25lKCkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TmFtZSgpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAuTmFtZVZhbHVlUGFpciBnZXRQYXJhbWV0ZXIoCi1pbnQpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAuTmFtZVZhbHVlUGFpciBnZXRQYXJhbWV0ZXJCeU5hbWUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgaW50IGdldFBhcmFtZXRlckNvdW50KCkKLQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5OYW1lVmFsdWVQYWlyW10gZ2V0UGFyYW1ldGVycygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFZhbHVlKCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAubWVzc2FnZS5CYXNpY0hlYWRlckVsZW1lbnRJdGVyYXRvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmh0dHAuSGVhZGVyRWxlbWVudEl0ZXJhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5odHRwLnV0aWwuQ2hhckFycmF5QnVmZmVyIGJ1ZmZlcgotCi1wcml2YXRlIG9yZy5hcGFjaGUuaHR0cC5IZWFkZXJFbGVtZW50IGN1cnJlbnRFbGVtZW50Ci0KLXByaXZhdGUgb3JnLmFwYWNoZS5odHRwLm1lc3NhZ2UuUGFyc2VyQ3Vyc29yIGN1cnNvcgotCi1wcml2YXRlIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5IZWFkZXJJdGVyYXRvciBoZWFkZXJJdAotCi1wcml2YXRlIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5tZXNzYWdlLkhlYWRlclZhbHVlUGFyc2VyIHBhcnNlcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaHR0cC5IZWFkZXJJdGVyYXRvcikKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5odHRwLkhlYWRlckl0ZXJhdG9yCi1vcmcuYXBhY2hlLmh0dHAubWVzc2FnZS5IZWFkZXJWYWx1ZVBhcnNlcikKLQotcHJpdmF0ZSB2b2lkIGJ1ZmZlckhlYWRlclZhbHVlKCkKLQotcHJpdmF0ZSB2b2lkIHBhcnNlTmV4dEVsZW1lbnQoKQotCi1wdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS91dGlsL05vU3VjaEVsZW1lbnRFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBqYXZhLmxhbmcuT2JqZWN0IG5leHQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3V0aWwvTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsgKQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5IZWFkZXJFbGVtZW50IG5leHRFbGVtZW50KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL1Vuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCByZW1vdmUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5tZXNzYWdlLkJhc2ljSGVhZGVySXRlcmF0b3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmFwYWNoZS5odHRwLkhlYWRlckl0ZXJhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuSGVhZGVyW10gYWxsSGVhZGVycwotCi1wcm90ZWN0ZWQgaW50IGN1cnJlbnRJbmRleAotCi1wcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBoZWFkZXJOYW1lCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5odHRwLkhlYWRlcltdCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcm90ZWN0ZWQgYm9vbGVhbiBmaWx0ZXJIZWFkZXIoCi1pbnQpCi0KLXByb3RlY3RlZCBpbnQgZmluZE5leHQoCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIGhhc05leHQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3V0aWwvTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIGphdmEubGFuZy5PYmplY3QgbmV4dCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvdXRpbC9Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOyApCi1wdWJsaWMgb3JnLmFwYWNoZS5odHRwLkhlYWRlciBuZXh0SGVhZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL1Vuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCByZW1vdmUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYXBhY2hlLmh0dHAubWVzc2FnZS5IZWFkZXJWYWx1ZUZvcm1hdHRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLmFwYWNoZS5odHRwLnV0aWwuQ2hhckFycmF5QnVmZmVyIGZvcm1hdEVsZW1lbnRzKAotb3JnLmFwYWNoZS5odHRwLnV0aWwuQ2hhckFycmF5QnVmZmVyCi1vcmcuYXBhY2hlLmh0dHAuSGVhZGVyRWxlbWVudFtdCi1ib29sZWFuKQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLmFwYWNoZS5odHRwLnV0aWwuQ2hhckFycmF5QnVmZmVyIGZvcm1hdEhlYWRlckVsZW1lbnQoCi1vcmcuYXBhY2hlLmh0dHAudXRpbC5DaGFyQXJyYXlCdWZmZXIKLW9yZy5hcGFjaGUuaHR0cC5IZWFkZXJFbGVtZW50Ci1ib29sZWFuKQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLmFwYWNoZS5odHRwLnV0aWwuQ2hhckFycmF5QnVmZmVyIGZvcm1hdE5hbWVWYWx1ZVBhaXIoCi1vcmcuYXBhY2hlLmh0dHAudXRpbC5DaGFyQXJyYXlCdWZmZXIKLW9yZy5hcGFjaGUuaHR0cC5OYW1lVmFsdWVQYWlyCi1ib29sZWFuKQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLmFwYWNoZS5odHRwLnV0aWwuQ2hhckFycmF5QnVmZmVyIGZvcm1hdFBhcmFtZXRlcnMoCi1vcmcuYXBhY2hlLmh0dHAudXRpbC5DaGFyQXJyYXlCdWZmZXIKLW9yZy5hcGFjaGUuaHR0cC5OYW1lVmFsdWVQYWlyW10KLWJvb2xlYW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLm1lc3NhZ2UuQmFzaWNIZWFkZXJWYWx1ZUZvcm1hdHRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmh0dHAubWVzc2FnZS5IZWFkZXJWYWx1ZUZvcm1hdHRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5tZXNzYWdlLkJhc2ljSGVhZGVyVmFsdWVGb3JtYXR0ZXIgREVGQVVMVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0VQQVJBVE9SUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVU5TQUZFX0NIQVJTCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgZm9ybWF0RWxlbWVudHMoCi1vcmcuYXBhY2hlLmh0dHAuSGVhZGVyRWxlbWVudFtdCi1ib29sZWFuCi1vcmcuYXBhY2hlLmh0dHAubWVzc2FnZS5IZWFkZXJWYWx1ZUZvcm1hdHRlcikKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGZvcm1hdEhlYWRlckVsZW1lbnQoCi1vcmcuYXBhY2hlLmh0dHAuSGVhZGVyRWxlbWVudAotYm9vbGVhbgotb3JnLmFwYWNoZS5odHRwLm1lc3NhZ2UuSGVhZGVyVmFsdWVGb3JtYXR0ZXIpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBmb3JtYXROYW1lVmFsdWVQYWlyKAotb3JnLmFwYWNoZS5odHRwLk5hbWVWYWx1ZVBhaXIKLWJvb2xlYW4KLW9yZy5hcGFjaGUuaHR0cC5tZXNzYWdlLkhlYWRlclZhbHVlRm9ybWF0dGVyKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgZm9ybWF0UGFyYW1ldGVycygKLW9yZy5hcGFjaGUuaHR0cC5OYW1lVmFsdWVQYWlyW10KLWJvb2xlYW4KLW9yZy5hcGFjaGUuaHR0cC5tZXNzYWdlLkhlYWRlclZhbHVlRm9ybWF0dGVyKQotCi1wcm90ZWN0ZWQgdm9pZCBkb0Zvcm1hdFZhbHVlKAotb3JnLmFwYWNoZS5odHRwLnV0aWwuQ2hhckFycmF5QnVmZmVyCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuKQotCi1wcm90ZWN0ZWQgaW50IGVzdGltYXRlRWxlbWVudHNMZW4oCi1vcmcuYXBhY2hlLmh0dHAuSGVhZGVyRWxlbWVudFtdKQotCi1wcm90ZWN0ZWQgaW50IGVzdGltYXRlSGVhZGVyRWxlbWVudExlbigKLW9yZy5hcGFjaGUuaHR0cC5IZWFkZXJFbGVtZW50KQotCi1wcm90ZWN0ZWQgaW50IGVzdGltYXRlTmFtZVZhbHVlUGFpckxlbigKLW9yZy5hcGFjaGUuaHR0cC5OYW1lVmFsdWVQYWlyKQotCi1wcm90ZWN0ZWQgaW50IGVzdGltYXRlUGFyYW1ldGVyc0xlbigKLW9yZy5hcGFjaGUuaHR0cC5OYW1lVmFsdWVQYWlyW10pCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAudXRpbC5DaGFyQXJyYXlCdWZmZXIgZm9ybWF0RWxlbWVudHMoCi1vcmcuYXBhY2hlLmh0dHAudXRpbC5DaGFyQXJyYXlCdWZmZXIKLW9yZy5hcGFjaGUuaHR0cC5IZWFkZXJFbGVtZW50W10KLWJvb2xlYW4pCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAudXRpbC5DaGFyQXJyYXlCdWZmZXIgZm9ybWF0SGVhZGVyRWxlbWVudCgKLW9yZy5hcGFjaGUuaHR0cC51dGlsLkNoYXJBcnJheUJ1ZmZlcgotb3JnLmFwYWNoZS5odHRwLkhlYWRlckVsZW1lbnQKLWJvb2xlYW4pCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAudXRpbC5DaGFyQXJyYXlCdWZmZXIgZm9ybWF0TmFtZVZhbHVlUGFpcigKLW9yZy5hcGFjaGUuaHR0cC51dGlsLkNoYXJBcnJheUJ1ZmZlcgotb3JnLmFwYWNoZS5odHRwLk5hbWVWYWx1ZVBhaXIKLWJvb2xlYW4pCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAudXRpbC5DaGFyQXJyYXlCdWZmZXIgZm9ybWF0UGFyYW1ldGVycygKLW9yZy5hcGFjaGUuaHR0cC51dGlsLkNoYXJBcnJheUJ1ZmZlcgotb3JnLmFwYWNoZS5odHRwLk5hbWVWYWx1ZVBhaXJbXQotYm9vbGVhbikKLQotcHJvdGVjdGVkIGJvb2xlYW4gaXNTZXBhcmF0b3IoCi1jaGFyKQotCi1wcm90ZWN0ZWQgYm9vbGVhbiBpc1Vuc2FmZSgKLWNoYXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5tZXNzYWdlLkhlYWRlclZhbHVlUGFyc2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9QYXJzZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IG9yZy5hcGFjaGUuaHR0cC5IZWFkZXJFbGVtZW50W10gcGFyc2VFbGVtZW50cygKLW9yZy5hcGFjaGUuaHR0cC51dGlsLkNoYXJBcnJheUJ1ZmZlcgotb3JnLmFwYWNoZS5odHRwLm1lc3NhZ2UuUGFyc2VyQ3Vyc29yKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvUGFyc2VFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBvcmcuYXBhY2hlLmh0dHAuSGVhZGVyRWxlbWVudCBwYXJzZUhlYWRlckVsZW1lbnQoCi1vcmcuYXBhY2hlLmh0dHAudXRpbC5DaGFyQXJyYXlCdWZmZXIKLW9yZy5hcGFjaGUuaHR0cC5tZXNzYWdlLlBhcnNlckN1cnNvcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL1BhcnNlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLmFwYWNoZS5odHRwLk5hbWVWYWx1ZVBhaXIgcGFyc2VOYW1lVmFsdWVQYWlyKAotb3JnLmFwYWNoZS5odHRwLnV0aWwuQ2hhckFycmF5QnVmZmVyCi1vcmcuYXBhY2hlLmh0dHAubWVzc2FnZS5QYXJzZXJDdXJzb3IpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9QYXJzZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IG9yZy5hcGFjaGUuaHR0cC5OYW1lVmFsdWVQYWlyW10gcGFyc2VQYXJhbWV0ZXJzKAotb3JnLmFwYWNoZS5odHRwLnV0aWwuQ2hhckFycmF5QnVmZmVyCi1vcmcuYXBhY2hlLmh0dHAubWVzc2FnZS5QYXJzZXJDdXJzb3IpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLm1lc3NhZ2UuQmFzaWNIZWFkZXJWYWx1ZVBhcnNlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmh0dHAubWVzc2FnZS5IZWFkZXJWYWx1ZVBhcnNlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gQUxMX0RFTElNSVRFUlMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmh0dHAubWVzc2FnZS5CYXNpY0hlYWRlclZhbHVlUGFyc2VyIERFRkFVTFQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBFTEVNX0RFTElNSVRFUgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFBBUkFNX0RFTElNSVRFUgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc09uZU9mKAotY2hhcgotY2hhcltdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvUGFyc2VFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5odHRwLkhlYWRlckVsZW1lbnRbXSBwYXJzZUVsZW1lbnRzKAotamF2YS5sYW5nLlN0cmluZwotb3JnLmFwYWNoZS5odHRwLm1lc3NhZ2UuSGVhZGVyVmFsdWVQYXJzZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9QYXJzZUV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuSGVhZGVyRWxlbWVudCBwYXJzZUhlYWRlckVsZW1lbnQoCi1qYXZhLmxhbmcuU3RyaW5nCi1vcmcuYXBhY2hlLmh0dHAubWVzc2FnZS5IZWFkZXJWYWx1ZVBhcnNlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL1BhcnNlRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5OYW1lVmFsdWVQYWlyIHBhcnNlTmFtZVZhbHVlUGFpcigKLWphdmEubGFuZy5TdHJpbmcKLW9yZy5hcGFjaGUuaHR0cC5tZXNzYWdlLkhlYWRlclZhbHVlUGFyc2VyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvUGFyc2VFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5odHRwLk5hbWVWYWx1ZVBhaXJbXSBwYXJzZVBhcmFtZXRlcnMoCi1qYXZhLmxhbmcuU3RyaW5nCi1vcmcuYXBhY2hlLmh0dHAubWVzc2FnZS5IZWFkZXJWYWx1ZVBhcnNlcikKLQotcHJvdGVjdGVkIG9yZy5hcGFjaGUuaHR0cC5IZWFkZXJFbGVtZW50IGNyZWF0ZUhlYWRlckVsZW1lbnQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1vcmcuYXBhY2hlLmh0dHAuTmFtZVZhbHVlUGFpcltdKQotCi1wcm90ZWN0ZWQgb3JnLmFwYWNoZS5odHRwLk5hbWVWYWx1ZVBhaXIgY3JlYXRlTmFtZVZhbHVlUGFpcigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAuSGVhZGVyRWxlbWVudFtdIHBhcnNlRWxlbWVudHMoCi1vcmcuYXBhY2hlLmh0dHAudXRpbC5DaGFyQXJyYXlCdWZmZXIKLW9yZy5hcGFjaGUuaHR0cC5tZXNzYWdlLlBhcnNlckN1cnNvcikKLQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5IZWFkZXJFbGVtZW50IHBhcnNlSGVhZGVyRWxlbWVudCgKLW9yZy5hcGFjaGUuaHR0cC51dGlsLkNoYXJBcnJheUJ1ZmZlcgotb3JnLmFwYWNoZS5odHRwLm1lc3NhZ2UuUGFyc2VyQ3Vyc29yKQotCi1wdWJsaWMgb3JnLmFwYWNoZS5odHRwLk5hbWVWYWx1ZVBhaXIgcGFyc2VOYW1lVmFsdWVQYWlyKAotb3JnLmFwYWNoZS5odHRwLnV0aWwuQ2hhckFycmF5QnVmZmVyCi1vcmcuYXBhY2hlLmh0dHAubWVzc2FnZS5QYXJzZXJDdXJzb3IpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAuTmFtZVZhbHVlUGFpciBwYXJzZU5hbWVWYWx1ZVBhaXIoCi1vcmcuYXBhY2hlLmh0dHAudXRpbC5DaGFyQXJyYXlCdWZmZXIKLW9yZy5hcGFjaGUuaHR0cC5tZXNzYWdlLlBhcnNlckN1cnNvcgotY2hhcltdKQotCi1wdWJsaWMgb3JnLmFwYWNoZS5odHRwLk5hbWVWYWx1ZVBhaXJbXSBwYXJzZVBhcmFtZXRlcnMoCi1vcmcuYXBhY2hlLmh0dHAudXRpbC5DaGFyQXJyYXlCdWZmZXIKLW9yZy5hcGFjaGUuaHR0cC5tZXNzYWdlLlBhcnNlckN1cnNvcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAubWVzc2FnZS5CYXNpY0h0dHBSZXF1ZXN0IGV4dGVuZHMgb3JnLmFwYWNoZS5odHRwLm1lc3NhZ2UuQWJzdHJhY3RIdHRwTWVzc2FnZSBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaHR0cC5IdHRwUmVxdWVzdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgbWV0aG9kCi0KLXByaXZhdGUgZmluYWwgb3JnLmFwYWNoZS5odHRwLlJlcXVlc3RMaW5lIHJlcXVlc3RsaW5lCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyB1cmkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1vcmcuYXBhY2hlLmh0dHAuUHJvdG9jb2xWZXJzaW9uKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmh0dHAuUmVxdWVzdExpbmUpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAuUHJvdG9jb2xWZXJzaW9uIGdldFByb3RvY29sVmVyc2lvbigpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAuUmVxdWVzdExpbmUgZ2V0UmVxdWVzdExpbmUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5tZXNzYWdlLkJhc2ljSHR0cEVudGl0eUVuY2xvc2luZ1JlcXVlc3QgZXh0ZW5kcyBvcmcuYXBhY2hlLmh0dHAubWVzc2FnZS5CYXNpY0h0dHBSZXF1ZXN0IGltcGxlbWVudHMgb3JnLmFwYWNoZS5odHRwLkh0dHBFbnRpdHlFbmNsb3NpbmdSZXF1ZXN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5odHRwLkh0dHBFbnRpdHkgZW50aXR5Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotb3JnLmFwYWNoZS5odHRwLlByb3RvY29sVmVyc2lvbikKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5odHRwLlJlcXVlc3RMaW5lKQotCi1wdWJsaWMgYm9vbGVhbiBleHBlY3RDb250aW51ZSgpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAuSHR0cEVudGl0eSBnZXRFbnRpdHkoKQotCi1wdWJsaWMgdm9pZCBzZXRFbnRpdHkoCi1vcmcuYXBhY2hlLmh0dHAuSHR0cEVudGl0eSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAubWVzc2FnZS5CYXNpY0h0dHBSZXNwb25zZSBleHRlbmRzIG9yZy5hcGFjaGUuaHR0cC5tZXNzYWdlLkFic3RyYWN0SHR0cE1lc3NhZ2UgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5odHRwLkh0dHBFbnRpdHkgZW50aXR5Ci0KLXByaXZhdGUgamF2YS51dGlsLkxvY2FsZSBsb2NhbGUKLQotcHJpdmF0ZSBvcmcuYXBhY2hlLmh0dHAuUmVhc29uUGhyYXNlQ2F0YWxvZyByZWFzb25DYXRhbG9nCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5odHRwLlN0YXR1c0xpbmUgc3RhdHVzbGluZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaHR0cC5Qcm90b2NvbFZlcnNpb24KLWludAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5odHRwLlN0YXR1c0xpbmUpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaHR0cC5TdGF0dXNMaW5lCi1vcmcuYXBhY2hlLmh0dHAuUmVhc29uUGhyYXNlQ2F0YWxvZwotamF2YS51dGlsLkxvY2FsZSkKLQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5IdHRwRW50aXR5IGdldEVudGl0eSgpCi0KLXB1YmxpYyBqYXZhLnV0aWwuTG9jYWxlIGdldExvY2FsZSgpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAuUHJvdG9jb2xWZXJzaW9uIGdldFByb3RvY29sVmVyc2lvbigpCi0KLXByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIGdldFJlYXNvbigKLWludCkKLQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5TdGF0dXNMaW5lIGdldFN0YXR1c0xpbmUoKQotCi1wdWJsaWMgdm9pZCBzZXRFbnRpdHkoCi1vcmcuYXBhY2hlLmh0dHAuSHR0cEVudGl0eSkKLQotcHVibGljIHZvaWQgc2V0TG9jYWxlKAotamF2YS51dGlsLkxvY2FsZSkKLQotcHVibGljIHZvaWQgc2V0UmVhc29uUGhyYXNlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0U3RhdHVzQ29kZSgKLWludCkKLQotcHVibGljIHZvaWQgc2V0U3RhdHVzTGluZSgKLW9yZy5hcGFjaGUuaHR0cC5Qcm90b2NvbFZlcnNpb24KLWludCkKLQotcHVibGljIHZvaWQgc2V0U3RhdHVzTGluZSgKLW9yZy5hcGFjaGUuaHR0cC5Qcm90b2NvbFZlcnNpb24KLWludAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0U3RhdHVzTGluZSgKLW9yZy5hcGFjaGUuaHR0cC5TdGF0dXNMaW5lKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYXBhY2hlLmh0dHAubWVzc2FnZS5MaW5lRm9ybWF0dGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBvcmcuYXBhY2hlLmh0dHAudXRpbC5DaGFyQXJyYXlCdWZmZXIgYXBwZW5kUHJvdG9jb2xWZXJzaW9uKAotb3JnLmFwYWNoZS5odHRwLnV0aWwuQ2hhckFycmF5QnVmZmVyCi1vcmcuYXBhY2hlLmh0dHAuUHJvdG9jb2xWZXJzaW9uKQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLmFwYWNoZS5odHRwLnV0aWwuQ2hhckFycmF5QnVmZmVyIGZvcm1hdEhlYWRlcigKLW9yZy5hcGFjaGUuaHR0cC51dGlsLkNoYXJBcnJheUJ1ZmZlcgotb3JnLmFwYWNoZS5odHRwLkhlYWRlcikKLQotcHVibGljIGFic3RyYWN0IG9yZy5hcGFjaGUuaHR0cC51dGlsLkNoYXJBcnJheUJ1ZmZlciBmb3JtYXRSZXF1ZXN0TGluZSgKLW9yZy5hcGFjaGUuaHR0cC51dGlsLkNoYXJBcnJheUJ1ZmZlcgotb3JnLmFwYWNoZS5odHRwLlJlcXVlc3RMaW5lKQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLmFwYWNoZS5odHRwLnV0aWwuQ2hhckFycmF5QnVmZmVyIGZvcm1hdFN0YXR1c0xpbmUoCi1vcmcuYXBhY2hlLmh0dHAudXRpbC5DaGFyQXJyYXlCdWZmZXIKLW9yZy5hcGFjaGUuaHR0cC5TdGF0dXNMaW5lKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5tZXNzYWdlLkJhc2ljTGluZUZvcm1hdHRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmh0dHAubWVzc2FnZS5MaW5lRm9ybWF0dGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5odHRwLm1lc3NhZ2UuQmFzaWNMaW5lRm9ybWF0dGVyIERFRkFVTFQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBmb3JtYXRIZWFkZXIoCi1vcmcuYXBhY2hlLmh0dHAuSGVhZGVyCi1vcmcuYXBhY2hlLmh0dHAubWVzc2FnZS5MaW5lRm9ybWF0dGVyKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgZm9ybWF0UHJvdG9jb2xWZXJzaW9uKAotb3JnLmFwYWNoZS5odHRwLlByb3RvY29sVmVyc2lvbgotb3JnLmFwYWNoZS5odHRwLm1lc3NhZ2UuTGluZUZvcm1hdHRlcikKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGZvcm1hdFJlcXVlc3RMaW5lKAotb3JnLmFwYWNoZS5odHRwLlJlcXVlc3RMaW5lCi1vcmcuYXBhY2hlLmh0dHAubWVzc2FnZS5MaW5lRm9ybWF0dGVyKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgZm9ybWF0U3RhdHVzTGluZSgKLW9yZy5hcGFjaGUuaHR0cC5TdGF0dXNMaW5lCi1vcmcuYXBhY2hlLmh0dHAubWVzc2FnZS5MaW5lRm9ybWF0dGVyKQotCi1wdWJsaWMgb3JnLmFwYWNoZS5odHRwLnV0aWwuQ2hhckFycmF5QnVmZmVyIGFwcGVuZFByb3RvY29sVmVyc2lvbigKLW9yZy5hcGFjaGUuaHR0cC51dGlsLkNoYXJBcnJheUJ1ZmZlcgotb3JnLmFwYWNoZS5odHRwLlByb3RvY29sVmVyc2lvbikKLQotcHJvdGVjdGVkIHZvaWQgZG9Gb3JtYXRIZWFkZXIoCi1vcmcuYXBhY2hlLmh0dHAudXRpbC5DaGFyQXJyYXlCdWZmZXIKLW9yZy5hcGFjaGUuaHR0cC5IZWFkZXIpCi0KLXByb3RlY3RlZCB2b2lkIGRvRm9ybWF0UmVxdWVzdExpbmUoCi1vcmcuYXBhY2hlLmh0dHAudXRpbC5DaGFyQXJyYXlCdWZmZXIKLW9yZy5hcGFjaGUuaHR0cC5SZXF1ZXN0TGluZSkKLQotcHJvdGVjdGVkIHZvaWQgZG9Gb3JtYXRTdGF0dXNMaW5lKAotb3JnLmFwYWNoZS5odHRwLnV0aWwuQ2hhckFycmF5QnVmZmVyCi1vcmcuYXBhY2hlLmh0dHAuU3RhdHVzTGluZSkKLQotcHJvdGVjdGVkIGludCBlc3RpbWF0ZVByb3RvY29sVmVyc2lvbkxlbigKLW9yZy5hcGFjaGUuaHR0cC5Qcm90b2NvbFZlcnNpb24pCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAudXRpbC5DaGFyQXJyYXlCdWZmZXIgZm9ybWF0SGVhZGVyKAotb3JnLmFwYWNoZS5odHRwLnV0aWwuQ2hhckFycmF5QnVmZmVyCi1vcmcuYXBhY2hlLmh0dHAuSGVhZGVyKQotCi1wdWJsaWMgb3JnLmFwYWNoZS5odHRwLnV0aWwuQ2hhckFycmF5QnVmZmVyIGZvcm1hdFJlcXVlc3RMaW5lKAotb3JnLmFwYWNoZS5odHRwLnV0aWwuQ2hhckFycmF5QnVmZmVyCi1vcmcuYXBhY2hlLmh0dHAuUmVxdWVzdExpbmUpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAudXRpbC5DaGFyQXJyYXlCdWZmZXIgZm9ybWF0U3RhdHVzTGluZSgKLW9yZy5hcGFjaGUuaHR0cC51dGlsLkNoYXJBcnJheUJ1ZmZlcgotb3JnLmFwYWNoZS5odHRwLlN0YXR1c0xpbmUpCi0KLXByb3RlY3RlZCBvcmcuYXBhY2hlLmh0dHAudXRpbC5DaGFyQXJyYXlCdWZmZXIgaW5pdEJ1ZmZlcigKLW9yZy5hcGFjaGUuaHR0cC51dGlsLkNoYXJBcnJheUJ1ZmZlcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLm1lc3NhZ2UuTGluZVBhcnNlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBoYXNQcm90b2NvbFZlcnNpb24oCi1vcmcuYXBhY2hlLmh0dHAudXRpbC5DaGFyQXJyYXlCdWZmZXIKLW9yZy5hcGFjaGUuaHR0cC5tZXNzYWdlLlBhcnNlckN1cnNvcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL1BhcnNlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLmFwYWNoZS5odHRwLkhlYWRlciBwYXJzZUhlYWRlcigKLW9yZy5hcGFjaGUuaHR0cC51dGlsLkNoYXJBcnJheUJ1ZmZlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL1BhcnNlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLmFwYWNoZS5odHRwLlByb3RvY29sVmVyc2lvbiBwYXJzZVByb3RvY29sVmVyc2lvbigKLW9yZy5hcGFjaGUuaHR0cC51dGlsLkNoYXJBcnJheUJ1ZmZlcgotb3JnLmFwYWNoZS5odHRwLm1lc3NhZ2UuUGFyc2VyQ3Vyc29yKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvUGFyc2VFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBvcmcuYXBhY2hlLmh0dHAuUmVxdWVzdExpbmUgcGFyc2VSZXF1ZXN0TGluZSgKLW9yZy5hcGFjaGUuaHR0cC51dGlsLkNoYXJBcnJheUJ1ZmZlcgotb3JnLmFwYWNoZS5odHRwLm1lc3NhZ2UuUGFyc2VyQ3Vyc29yKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvUGFyc2VFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBvcmcuYXBhY2hlLmh0dHAuU3RhdHVzTGluZSBwYXJzZVN0YXR1c0xpbmUoCi1vcmcuYXBhY2hlLmh0dHAudXRpbC5DaGFyQXJyYXlCdWZmZXIKLW9yZy5hcGFjaGUuaHR0cC5tZXNzYWdlLlBhcnNlckN1cnNvcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAubWVzc2FnZS5CYXNpY0xpbmVQYXJzZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmFwYWNoZS5odHRwLm1lc3NhZ2UuTGluZVBhcnNlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5tZXNzYWdlLkJhc2ljTGluZVBhcnNlciBERUZBVUxUCi0KLXByb3RlY3RlZCBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmh0dHAuUHJvdG9jb2xWZXJzaW9uKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvUGFyc2VFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5odHRwLkhlYWRlciBwYXJzZUhlYWRlcigKLWphdmEubGFuZy5TdHJpbmcKLW9yZy5hcGFjaGUuaHR0cC5tZXNzYWdlLkxpbmVQYXJzZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9QYXJzZUV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuUHJvdG9jb2xWZXJzaW9uIHBhcnNlUHJvdG9jb2xWZXJzaW9uKAotamF2YS5sYW5nLlN0cmluZwotb3JnLmFwYWNoZS5odHRwLm1lc3NhZ2UuTGluZVBhcnNlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL1BhcnNlRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5SZXF1ZXN0TGluZSBwYXJzZVJlcXVlc3RMaW5lKAotamF2YS5sYW5nLlN0cmluZwotb3JnLmFwYWNoZS5odHRwLm1lc3NhZ2UuTGluZVBhcnNlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL1BhcnNlRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5TdGF0dXNMaW5lIHBhcnNlU3RhdHVzTGluZSgKLWphdmEubGFuZy5TdHJpbmcKLW9yZy5hcGFjaGUuaHR0cC5tZXNzYWdlLkxpbmVQYXJzZXIpCi0KLXByb3RlY3RlZCBvcmcuYXBhY2hlLmh0dHAuUHJvdG9jb2xWZXJzaW9uIGNyZWF0ZVByb3RvY29sVmVyc2lvbigKLWludAotaW50KQotCi1wcm90ZWN0ZWQgb3JnLmFwYWNoZS5odHRwLlJlcXVlc3RMaW5lIGNyZWF0ZVJlcXVlc3RMaW5lKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotb3JnLmFwYWNoZS5odHRwLlByb3RvY29sVmVyc2lvbikKLQotcHJvdGVjdGVkIG9yZy5hcGFjaGUuaHR0cC5TdGF0dXNMaW5lIGNyZWF0ZVN0YXR1c0xpbmUoCi1vcmcuYXBhY2hlLmh0dHAuUHJvdG9jb2xWZXJzaW9uCi1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBib29sZWFuIGhhc1Byb3RvY29sVmVyc2lvbigKLW9yZy5hcGFjaGUuaHR0cC51dGlsLkNoYXJBcnJheUJ1ZmZlcgotb3JnLmFwYWNoZS5odHRwLm1lc3NhZ2UuUGFyc2VyQ3Vyc29yKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvUGFyc2VFeGNlcHRpb247ICkKLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAuSGVhZGVyIHBhcnNlSGVhZGVyKAotb3JnLmFwYWNoZS5odHRwLnV0aWwuQ2hhckFycmF5QnVmZmVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvUGFyc2VFeGNlcHRpb247ICkKLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAuUHJvdG9jb2xWZXJzaW9uIHBhcnNlUHJvdG9jb2xWZXJzaW9uKAotb3JnLmFwYWNoZS5odHRwLnV0aWwuQ2hhckFycmF5QnVmZmVyCi1vcmcuYXBhY2hlLmh0dHAubWVzc2FnZS5QYXJzZXJDdXJzb3IpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9QYXJzZUV4Y2VwdGlvbjsgKQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5SZXF1ZXN0TGluZSBwYXJzZVJlcXVlc3RMaW5lKAotb3JnLmFwYWNoZS5odHRwLnV0aWwuQ2hhckFycmF5QnVmZmVyCi1vcmcuYXBhY2hlLmh0dHAubWVzc2FnZS5QYXJzZXJDdXJzb3IpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9QYXJzZUV4Y2VwdGlvbjsgKQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5TdGF0dXNMaW5lIHBhcnNlU3RhdHVzTGluZSgKLW9yZy5hcGFjaGUuaHR0cC51dGlsLkNoYXJBcnJheUJ1ZmZlcgotb3JnLmFwYWNoZS5odHRwLm1lc3NhZ2UuUGFyc2VyQ3Vyc29yKQotCi1wcm90ZWN0ZWQgdm9pZCBza2lwV2hpdGVzcGFjZSgKLW9yZy5hcGFjaGUuaHR0cC51dGlsLkNoYXJBcnJheUJ1ZmZlcgotb3JnLmFwYWNoZS5odHRwLm1lc3NhZ2UuUGFyc2VyQ3Vyc29yKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5tZXNzYWdlLkJhc2ljTGlzdEhlYWRlckl0ZXJhdG9yIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaHR0cC5IZWFkZXJJdGVyYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgZmluYWwgamF2YS51dGlsLkxpc3QgYWxsSGVhZGVycwotCi1wcm90ZWN0ZWQgaW50IGN1cnJlbnRJbmRleAotCi1wcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBoZWFkZXJOYW1lCi0KLXByb3RlY3RlZCBpbnQgbGFzdEluZGV4Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkxpc3QKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByb3RlY3RlZCBib29sZWFuIGZpbHRlckhlYWRlcigKLWludCkKLQotcHJvdGVjdGVkIGludCBmaW5kTmV4dCgKLWludCkKLQotcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvdXRpbC9Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLk9iamVjdCBuZXh0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS91dGlsL05vU3VjaEVsZW1lbnRFeGNlcHRpb247ICkKLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAuSGVhZGVyIG5leHRIZWFkZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHJlbW92ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLm1lc3NhZ2UuQmFzaWNOYW1lVmFsdWVQYWlyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaHR0cC5OYW1lVmFsdWVQYWlyLCBqYXZhLmxhbmcuQ2xvbmVhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBuYW1lCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyB2YWx1ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9DbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgY2xvbmUoKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXROYW1lKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VmFsdWUoKQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5tZXNzYWdlLkJhc2ljUmVxdWVzdExpbmUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmFwYWNoZS5odHRwLlJlcXVlc3RMaW5lLCBqYXZhLmxhbmcuQ2xvbmVhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBtZXRob2QKLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuUHJvdG9jb2xWZXJzaW9uIHByb3RvdmVyc2lvbgotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgdXJpCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotb3JnLmFwYWNoZS5odHRwLlByb3RvY29sVmVyc2lvbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0Nsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBjbG9uZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE1ldGhvZCgpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAuUHJvdG9jb2xWZXJzaW9uIGdldFByb3RvY29sVmVyc2lvbigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFVyaSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAubWVzc2FnZS5CYXNpY1N0YXR1c0xpbmUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmFwYWNoZS5odHRwLlN0YXR1c0xpbmUsIGphdmEubGFuZy5DbG9uZWFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuUHJvdG9jb2xWZXJzaW9uIHByb3RvVmVyc2lvbgotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgcmVhc29uUGhyYXNlCi0KLXByaXZhdGUgZmluYWwgaW50IHN0YXR1c0NvZGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmh0dHAuUHJvdG9jb2xWZXJzaW9uCi1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9DbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgY2xvbmUoKQotCi1wdWJsaWMgb3JnLmFwYWNoZS5odHRwLlByb3RvY29sVmVyc2lvbiBnZXRQcm90b2NvbFZlcnNpb24oKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRSZWFzb25QaHJhc2UoKQotCi1wdWJsaWMgaW50IGdldFN0YXR1c0NvZGUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLm1lc3NhZ2UuQmFzaWNUb2tlbkl0ZXJhdG9yIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaHR0cC5Ub2tlbkl0ZXJhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBIVFRQX1NFUEFSQVRPUlMKLQotcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgY3VycmVudEhlYWRlcgotCi1wcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBjdXJyZW50VG9rZW4KLQotcHJvdGVjdGVkIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5IZWFkZXJJdGVyYXRvciBoZWFkZXJJdAotCi1wcm90ZWN0ZWQgaW50IHNlYXJjaFBvcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaHR0cC5IZWFkZXJJdGVyYXRvcikKLQotcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgY3JlYXRlVG9rZW4oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL1BhcnNlRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgaW50IGZpbmROZXh0KAotaW50KQotCi1wcm90ZWN0ZWQgaW50IGZpbmRUb2tlbkVuZCgKLWludCkKLQotcHJvdGVjdGVkIGludCBmaW5kVG9rZW5TZXBhcmF0b3IoCi1pbnQpCi0KLXByb3RlY3RlZCBpbnQgZmluZFRva2VuU3RhcnQoCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIGhhc05leHQoKQotCi1wcm90ZWN0ZWQgYm9vbGVhbiBpc0h0dHBTZXBhcmF0b3IoCi1jaGFyKQotCi1wcm90ZWN0ZWQgYm9vbGVhbiBpc1Rva2VuQ2hhcigKLWNoYXIpCi0KLXByb3RlY3RlZCBib29sZWFuIGlzVG9rZW5TZXBhcmF0b3IoCi1jaGFyKQotCi1wcm90ZWN0ZWQgYm9vbGVhbiBpc1doaXRlc3BhY2UoCi1jaGFyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3V0aWwvTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjtMb3JnL2FwYWNoZS9odHRwL1BhcnNlRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLk9iamVjdCBuZXh0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS91dGlsL05vU3VjaEVsZW1lbnRFeGNlcHRpb247TG9yZy9hcGFjaGUvaHR0cC9QYXJzZUV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgbmV4dFRva2VuKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL1Vuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgdm9pZCByZW1vdmUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5tZXNzYWdlLkJ1ZmZlcmVkSGVhZGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaHR0cC5Gb3JtYXR0ZWRIZWFkZXIsIGphdmEubGFuZy5DbG9uZWFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmh0dHAudXRpbC5DaGFyQXJyYXlCdWZmZXIgYnVmZmVyCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBuYW1lCi0KLXByaXZhdGUgZmluYWwgaW50IHZhbHVlUG9zCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL1BhcnNlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmh0dHAudXRpbC5DaGFyQXJyYXlCdWZmZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9DbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgY2xvbmUoKQotCi1wdWJsaWMgb3JnLmFwYWNoZS5odHRwLnV0aWwuQ2hhckFycmF5QnVmZmVyIGdldEJ1ZmZlcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9QYXJzZUV4Y2VwdGlvbjsgKQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5IZWFkZXJFbGVtZW50W10gZ2V0RWxlbWVudHMoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXROYW1lKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VmFsdWUoKQotCi1wdWJsaWMgaW50IGdldFZhbHVlUG9zKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5tZXNzYWdlLkhlYWRlckdyb3VwIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5DbG9uZWFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdCBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgYWRkSGVhZGVyKAotb3JnLmFwYWNoZS5odHRwLkhlYWRlcikKLQotcHVibGljIHZvaWQgY2xlYXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGNsb25lKCkKLQotcHVibGljIGJvb2xlYW4gY29udGFpbnNIZWFkZXIoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgb3JnLmFwYWNoZS5odHRwLm1lc3NhZ2UuSGVhZGVyR3JvdXAgY29weSgpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAuSGVhZGVyW10gZ2V0QWxsSGVhZGVycygpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAuSGVhZGVyIGdldENvbmRlbnNlZEhlYWRlcigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAuSGVhZGVyIGdldEZpcnN0SGVhZGVyKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5IZWFkZXJbXSBnZXRIZWFkZXJzKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5IZWFkZXIgZ2V0TGFzdEhlYWRlcigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAuSGVhZGVySXRlcmF0b3IgaXRlcmF0b3IoKQotCi1wdWJsaWMgb3JnLmFwYWNoZS5odHRwLkhlYWRlckl0ZXJhdG9yIGl0ZXJhdG9yKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgcmVtb3ZlSGVhZGVyKAotb3JnLmFwYWNoZS5odHRwLkhlYWRlcikKLQotcHVibGljIHZvaWQgc2V0SGVhZGVycygKLW9yZy5hcGFjaGUuaHR0cC5IZWFkZXJbXSkKLQotcHVibGljIHZvaWQgdXBkYXRlSGVhZGVyKAotb3JnLmFwYWNoZS5odHRwLkhlYWRlcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAubWVzc2FnZS5QYXJzZXJDdXJzb3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgaW50IGxvd2VyQm91bmQKLQotcHJpdmF0ZSBpbnQgcG9zCi0KLXByaXZhdGUgZmluYWwgaW50IHVwcGVyQm91bmQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWludCkKLQotcHVibGljIGJvb2xlYW4gYXRFbmQoKQotCi1wdWJsaWMgaW50IGdldExvd2VyQm91bmQoKQotCi1wdWJsaWMgaW50IGdldFBvcygpCi0KLXB1YmxpYyBpbnQgZ2V0VXBwZXJCb3VuZCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotcHVibGljIHZvaWQgdXBkYXRlUG9zKAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuQmFzaWNIdHRwUGFyYW1zIGV4dGVuZHMgb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5BYnN0cmFjdEh0dHBQYXJhbXMgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgamF2YS5sYW5nLkNsb25lYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSBqYXZhLnV0aWwuSGFzaE1hcCBwYXJhbWV0ZXJzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgY2xlYXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGNsb25lKCkKLQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcyBjb3B5KCkKLQotcHJvdGVjdGVkIHZvaWQgY29weVBhcmFtcygKLW9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcykKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0UGFyYW1ldGVyKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJvb2xlYW4gaXNQYXJhbWV0ZXJTZXQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYm9vbGVhbiBpc1BhcmFtZXRlclNldExvY2FsbHkoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYm9vbGVhbiByZW1vdmVQYXJhbWV0ZXIoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zIHNldFBhcmFtZXRlcigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2lkIHNldFBhcmFtZXRlcnMoCi1qYXZhLmxhbmcuU3RyaW5nW10KLWphdmEubGFuZy5PYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5EZWZhdWx0ZWRIdHRwUGFyYW1zIGV4dGVuZHMgb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5BYnN0cmFjdEh0dHBQYXJhbXMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMgZGVmYXVsdHMKLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMgbG9jYWwKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMKLW9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcykKLQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcyBjb3B5KCkKLQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcyBnZXREZWZhdWx0cygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldFBhcmFtZXRlcigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBib29sZWFuIHJlbW92ZVBhcmFtZXRlcigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMgc2V0UGFyYW1ldGVyKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBDb25uZWN0aW9uUGFyYW1CZWFuIGV4dGVuZHMgb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwQWJzdHJhY3RQYXJhbUJlYW4KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMpCi0KLXB1YmxpYyB2b2lkIHNldENvbm5lY3Rpb25UaW1lb3V0KAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRMaW5nZXIoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldFNvVGltZW91dCgKLWludCkKLQotcHVibGljIHZvaWQgc2V0U29ja2V0QnVmZmVyU2l6ZSgKLWludCkKLQotcHVibGljIHZvaWQgc2V0U3RhbGVDaGVja2luZ0VuYWJsZWQoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRUY3BOb0RlbGF5KAotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBDb25uZWN0aW9uUGFyYW1zIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuQ29yZUNvbm5lY3Rpb25QTmFtZXMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBpbnQgZ2V0Q29ubmVjdGlvblRpbWVvdXQoCi1vcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMpCi0KLXB1YmxpYyBzdGF0aWMgaW50IGdldExpbmdlcigKLW9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcykKLQotcHVibGljIHN0YXRpYyBpbnQgZ2V0U29UaW1lb3V0KAotb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zKQotCi1wdWJsaWMgc3RhdGljIGludCBnZXRTb2NrZXRCdWZmZXJTaXplKAotb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zKQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0VGNwTm9EZWxheSgKLW9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcykKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzU3RhbGVDaGVja2luZ0VuYWJsZWQoCi1vcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDb25uZWN0aW9uVGltZW91dCgKLW9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcwotaW50KQotCi1wdWJsaWMgc3RhdGljIHZvaWQgc2V0TGluZ2VyKAotb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTb1RpbWVvdXQoCi1vcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMKLWludCkKLQotcHVibGljIHN0YXRpYyB2b2lkIHNldFNvY2tldEJ1ZmZlclNpemUoCi1vcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMKLWludCkKLQotcHVibGljIHN0YXRpYyB2b2lkIHNldFN0YWxlQ2hlY2tpbmdFbmFibGVkKAotb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zCi1ib29sZWFuKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgc2V0VGNwTm9EZWxheSgKLW9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcwotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQcm90b2NvbFBhcmFtQmVhbiBleHRlbmRzIG9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cEFic3RyYWN0UGFyYW1CZWFuCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zKQotCi1wdWJsaWMgdm9pZCBzZXRDb250ZW50Q2hhcnNldCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHNldEh0dHBFbGVtZW50Q2hhcnNldCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHNldFVzZUV4cGVjdENvbnRpbnVlKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0VXNlckFnZW50KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0VmVyc2lvbigKLW9yZy5hcGFjaGUuaHR0cC5IdHRwVmVyc2lvbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQcm90b2NvbFBhcmFtcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkNvcmVQcm90b2NvbFBOYW1lcwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Q29udGVudENoYXJzZXQoCi1vcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRIdHRwRWxlbWVudENoYXJzZXQoCi1vcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRVc2VyQWdlbnQoCi1vcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5odHRwLlByb3RvY29sVmVyc2lvbiBnZXRWZXJzaW9uKAotb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgc2V0Q29udGVudENoYXJzZXQoCi1vcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRIdHRwRWxlbWVudENoYXJzZXQoCi1vcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRVc2VFeHBlY3RDb250aW51ZSgKLW9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcwotYm9vbGVhbikKLQotcHVibGljIHN0YXRpYyB2b2lkIHNldFVzZXJBZ2VudCgKLW9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyB2b2lkIHNldFZlcnNpb24oCi1vcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXMKLW9yZy5hcGFjaGUuaHR0cC5Qcm90b2NvbFZlcnNpb24pCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB1c2VFeHBlY3RDb250aW51ZSgKLW9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBDb250ZXh0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUkVTRVJWRURfUFJFRklYCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5PYmplY3QgZ2V0QXR0cmlidXRlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5PYmplY3QgcmVtb3ZlQXR0cmlidXRlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0QXR0cmlidXRlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuQmFzaWNIdHRwQ29udGV4dCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cENvbnRleHQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLnV0aWwuTWFwIG1hcAotCi1wcml2YXRlIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwQ29udGV4dCBwYXJlbnRDb250ZXh0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBDb250ZXh0KQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRBdHRyaWJ1dGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCByZW1vdmVBdHRyaWJ1dGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cFByb2Nlc3NvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlcXVlc3RJbnRlcmNlcHRvciwgb3JnLmFwYWNoZS5odHRwLkh0dHBSZXNwb25zZUludGVyY2VwdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBSZXF1ZXN0SW50ZXJjZXB0b3JMaXN0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGFkZFJlcXVlc3RJbnRlcmNlcHRvcigKLW9yZy5hcGFjaGUuaHR0cC5IdHRwUmVxdWVzdEludGVyY2VwdG9yKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBhZGRSZXF1ZXN0SW50ZXJjZXB0b3IoCi1vcmcuYXBhY2hlLmh0dHAuSHR0cFJlcXVlc3RJbnRlcmNlcHRvcgotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBjbGVhclJlcXVlc3RJbnRlcmNlcHRvcnMoKQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLmFwYWNoZS5odHRwLkh0dHBSZXF1ZXN0SW50ZXJjZXB0b3IgZ2V0UmVxdWVzdEludGVyY2VwdG9yKAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldFJlcXVlc3RJbnRlcmNlcHRvckNvdW50KCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgcmVtb3ZlUmVxdWVzdEludGVyY2VwdG9yQnlDbGFzcygKLWphdmEubGFuZy5DbGFzcykKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0SW50ZXJjZXB0b3JzKAotamF2YS51dGlsLkxpc3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwUmVzcG9uc2VJbnRlcmNlcHRvckxpc3QgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgYWRkUmVzcG9uc2VJbnRlcmNlcHRvcigKLW9yZy5hcGFjaGUuaHR0cC5IdHRwUmVzcG9uc2VJbnRlcmNlcHRvcikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgYWRkUmVzcG9uc2VJbnRlcmNlcHRvcigKLW9yZy5hcGFjaGUuaHR0cC5IdHRwUmVzcG9uc2VJbnRlcmNlcHRvcgotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBjbGVhclJlc3BvbnNlSW50ZXJjZXB0b3JzKCkKLQotcHVibGljIGFic3RyYWN0IG9yZy5hcGFjaGUuaHR0cC5IdHRwUmVzcG9uc2VJbnRlcmNlcHRvciBnZXRSZXNwb25zZUludGVyY2VwdG9yKAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldFJlc3BvbnNlSW50ZXJjZXB0b3JDb3VudCgpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlbW92ZVJlc3BvbnNlSW50ZXJjZXB0b3JCeUNsYXNzKAotamF2YS5sYW5nLkNsYXNzKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRJbnRlcmNlcHRvcnMoCi1qYXZhLnV0aWwuTGlzdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBvcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuQmFzaWNIdHRwUHJvY2Vzc29yIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwUHJvY2Vzc29yLCBvcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cFJlcXVlc3RJbnRlcmNlcHRvckxpc3QsIG9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwUmVzcG9uc2VJbnRlcmNlcHRvckxpc3QsIGphdmEubGFuZy5DbG9uZWFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIGphdmEudXRpbC5MaXN0IHJlcXVlc3RJbnRlcmNlcHRvcnMKLQotcHJvdGVjdGVkIGphdmEudXRpbC5MaXN0IHJlc3BvbnNlSW50ZXJjZXB0b3JzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGZpbmFsIHZvaWQgYWRkSW50ZXJjZXB0b3IoCi1vcmcuYXBhY2hlLmh0dHAuSHR0cFJlcXVlc3RJbnRlcmNlcHRvcikKLQotcHVibGljIGZpbmFsIHZvaWQgYWRkSW50ZXJjZXB0b3IoCi1vcmcuYXBhY2hlLmh0dHAuSHR0cFJlcXVlc3RJbnRlcmNlcHRvcgotaW50KQotCi1wdWJsaWMgZmluYWwgdm9pZCBhZGRJbnRlcmNlcHRvcigKLW9yZy5hcGFjaGUuaHR0cC5IdHRwUmVzcG9uc2VJbnRlcmNlcHRvcikKLQotcHVibGljIGZpbmFsIHZvaWQgYWRkSW50ZXJjZXB0b3IoCi1vcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlSW50ZXJjZXB0b3IKLWludCkKLQotcHVibGljIHZvaWQgYWRkUmVxdWVzdEludGVyY2VwdG9yKAotb3JnLmFwYWNoZS5odHRwLkh0dHBSZXF1ZXN0SW50ZXJjZXB0b3IpCi0KLXB1YmxpYyB2b2lkIGFkZFJlcXVlc3RJbnRlcmNlcHRvcigKLW9yZy5hcGFjaGUuaHR0cC5IdHRwUmVxdWVzdEludGVyY2VwdG9yCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGFkZFJlc3BvbnNlSW50ZXJjZXB0b3IoCi1vcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlSW50ZXJjZXB0b3IpCi0KLXB1YmxpYyB2b2lkIGFkZFJlc3BvbnNlSW50ZXJjZXB0b3IoCi1vcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlSW50ZXJjZXB0b3IKLWludCkKLQotcHVibGljIHZvaWQgY2xlYXJJbnRlcmNlcHRvcnMoKQotCi1wdWJsaWMgdm9pZCBjbGVhclJlcXVlc3RJbnRlcmNlcHRvcnMoKQotCi1wdWJsaWMgdm9pZCBjbGVhclJlc3BvbnNlSW50ZXJjZXB0b3JzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0Nsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBjbG9uZSgpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuQmFzaWNIdHRwUHJvY2Vzc29yIGNvcHkoKQotCi1wcm90ZWN0ZWQgdm9pZCBjb3B5SW50ZXJjZXB0b3JzKAotb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkJhc2ljSHR0cFByb2Nlc3NvcikKLQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5IdHRwUmVxdWVzdEludGVyY2VwdG9yIGdldFJlcXVlc3RJbnRlcmNlcHRvcigKLWludCkKLQotcHVibGljIGludCBnZXRSZXF1ZXN0SW50ZXJjZXB0b3JDb3VudCgpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlSW50ZXJjZXB0b3IgZ2V0UmVzcG9uc2VJbnRlcmNlcHRvcigKLWludCkKLQotcHVibGljIGludCBnZXRSZXNwb25zZUludGVyY2VwdG9yQ291bnQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xvcmcvYXBhY2hlL2h0dHAvSHR0cEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcHJvY2VzcygKLW9yZy5hcGFjaGUuaHR0cC5IdHRwUmVxdWVzdAotb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBDb250ZXh0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xvcmcvYXBhY2hlL2h0dHAvSHR0cEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcHJvY2VzcygKLW9yZy5hcGFjaGUuaHR0cC5IdHRwUmVzcG9uc2UKLW9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwQ29udGV4dCkKLQotcHVibGljIHZvaWQgcmVtb3ZlUmVxdWVzdEludGVyY2VwdG9yQnlDbGFzcygKLWphdmEubGFuZy5DbGFzcykKLQotcHVibGljIHZvaWQgcmVtb3ZlUmVzcG9uc2VJbnRlcmNlcHRvckJ5Q2xhc3MoCi1qYXZhLmxhbmcuQ2xhc3MpCi0KLXB1YmxpYyB2b2lkIHNldEludGVyY2VwdG9ycygKLWphdmEudXRpbC5MaXN0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5EZWZhdWx0ZWRIdHRwQ29udGV4dCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cENvbnRleHQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cENvbnRleHQgZGVmYXVsdHMKLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cENvbnRleHQgbG9jYWwKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cENvbnRleHQKLW9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwQ29udGV4dCkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0QXR0cmlidXRlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwQ29udGV4dCBnZXREZWZhdWx0cygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHJlbW92ZUF0dHJpYnV0ZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5FeGVjdXRpb25Db250ZXh0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSFRUUF9DT05ORUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBIVFRQX1BST1hZX0hPU1QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEhUVFBfUkVRVUVTVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSFRUUF9SRVFfU0VOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSFRUUF9SRVNQT05TRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSFRUUF9UQVJHRVRfSE9TVAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkhUVFAgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBU0NJSQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ0hBUlNFVF9QQVJBTQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ0hVTktfQ09ESU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDT05OX0NMT1NFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDT05OX0RJUkVDVElWRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ09OTl9LRUVQX0FMSVZFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDT05URU5UX0VOQ09ESU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDT05URU5UX0xFTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ09OVEVOVF9UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBEQVRFX0hFQURFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVGQVVMVF9DT05URU5UX0NIQVJTRVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFRkFVTFRfQ09OVEVOVF9UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERUZBVUxUX1BST1RPQ09MX0NIQVJTRVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEVYUEVDVF9DT05USU5VRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRVhQRUNUX0RJUkVDVElWRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBIVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSURFTlRJVFlfQ09ESU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBJU09fODg1OV8xCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExGCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBPQ1RFVF9TVFJFQU1fVFlQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUExBSU5fVEVYVF9UWVBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTRVJWRVJfSEVBREVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNQCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUQVJHRVRfSE9TVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVFJBTlNGRVJfRU5DT0RJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFVTRVJfQUdFTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFVTX0FTQ0lJCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBVVEZfMTYKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFVURl84Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1doaXRlc3BhY2UoCi1jaGFyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwRGF0ZUdlbmVyYXRvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuVGltZVpvbmUgR01UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQQVRURVJOX1JGQzExMjMKLQotcHJpdmF0ZSBsb25nIGRhdGVBc0xvbmcKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGRhdGVBc1RleHQKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLnRleHQuRGF0ZUZvcm1hdCBkYXRlZm9ybWF0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRDdXJyZW50RGF0ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwRXhwZWN0YXRpb25WZXJpZmllciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvSHR0cEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgdmVyaWZ5KAotb3JnLmFwYWNoZS5odHRwLkh0dHBSZXF1ZXN0Ci1vcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlCi1vcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cENvbnRleHQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBSZXF1ZXN0RXhlY3V0b3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJvdGVjdGVkIGJvb2xlYW4gY2FuUmVzcG9uc2VIYXZlQm9keSgKLW9yZy5hcGFjaGUuaHR0cC5IdHRwUmVxdWVzdAotb3JnLmFwYWNoZS5odHRwLkh0dHBSZXNwb25zZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL0h0dHBFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlIGRvUmVjZWl2ZVJlc3BvbnNlKAotb3JnLmFwYWNoZS5odHRwLkh0dHBSZXF1ZXN0Ci1vcmcuYXBhY2hlLmh0dHAuSHR0cENsaWVudENvbm5lY3Rpb24KLW9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwQ29udGV4dCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMb3JnL2FwYWNoZS9odHRwL0h0dHBFeGNlcHRpb247ICkKLXByb3RlY3RlZCBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlIGRvU2VuZFJlcXVlc3QoCi1vcmcuYXBhY2hlLmh0dHAuSHR0cFJlcXVlc3QKLW9yZy5hcGFjaGUuaHR0cC5IdHRwQ2xpZW50Q29ubmVjdGlvbgotb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBDb250ZXh0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xvcmcvYXBhY2hlL2h0dHAvSHR0cEV4Y2VwdGlvbjsgKQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5IdHRwUmVzcG9uc2UgZXhlY3V0ZSgKLW9yZy5hcGFjaGUuaHR0cC5IdHRwUmVxdWVzdAotb3JnLmFwYWNoZS5odHRwLkh0dHBDbGllbnRDb25uZWN0aW9uCi1vcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cENvbnRleHQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9IdHRwRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBwb3N0UHJvY2VzcygKLW9yZy5hcGFjaGUuaHR0cC5IdHRwUmVzcG9uc2UKLW9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwUHJvY2Vzc29yCi1vcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cENvbnRleHQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9IdHRwRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBwcmVQcm9jZXNzKAotb3JnLmFwYWNoZS5odHRwLkh0dHBSZXF1ZXN0Ci1vcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cFByb2Nlc3Nvcgotb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBDb250ZXh0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cFJlcXVlc3RIYW5kbGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9IdHRwRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBoYW5kbGUoCi1vcmcuYXBhY2hlLmh0dHAuSHR0cFJlcXVlc3QKLW9yZy5hcGFjaGUuaHR0cC5IdHRwUmVzcG9uc2UKLW9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwQ29udGV4dCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBSZXF1ZXN0SGFuZGxlclJlc29sdmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBvcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cFJlcXVlc3RIYW5kbGVyIGxvb2t1cCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBSZXF1ZXN0SGFuZGxlclJlZ2lzdHJ5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwUmVxdWVzdEhhbmRsZXJSZXNvbHZlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5VcmlQYXR0ZXJuTWF0Y2hlciBtYXRjaGVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIG9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwUmVxdWVzdEhhbmRsZXIgbG9va3VwKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJvdGVjdGVkIGJvb2xlYW4gbWF0Y2hVcmlSZXF1ZXN0UGF0dGVybigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHJlZ2lzdGVyKAotamF2YS5sYW5nLlN0cmluZwotb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBSZXF1ZXN0SGFuZGxlcikKLQotcHVibGljIHZvaWQgc2V0SGFuZGxlcnMoCi1qYXZhLnV0aWwuTWFwKQotCi1wdWJsaWMgdm9pZCB1bnJlZ2lzdGVyKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cFNlcnZpY2UgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5odHRwLkNvbm5lY3Rpb25SZXVzZVN0cmF0ZWd5IGNvbm5TdHJhdGVneQotCi1wcml2YXRlIG9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwRXhwZWN0YXRpb25WZXJpZmllciBleHBlY3RhdGlvblZlcmlmaWVyCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBSZXF1ZXN0SGFuZGxlclJlc29sdmVyIGhhbmRsZXJSZXNvbHZlcgotCi1wcml2YXRlIG9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcyBwYXJhbXMKLQotcHJpdmF0ZSBvcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cFByb2Nlc3NvciBwcm9jZXNzb3IKLQotcHJpdmF0ZSBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlRmFjdG9yeSByZXNwb25zZUZhY3RvcnkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cFByb2Nlc3Nvcgotb3JnLmFwYWNoZS5odHRwLkNvbm5lY3Rpb25SZXVzZVN0cmF0ZWd5Ci1vcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlRmFjdG9yeSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL0h0dHBFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIGRvU2VydmljZSgKLW9yZy5hcGFjaGUuaHR0cC5IdHRwUmVxdWVzdAotb3JnLmFwYWNoZS5odHRwLkh0dHBSZXNwb25zZQotb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBDb250ZXh0KQotCi1wdWJsaWMgb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zIGdldFBhcmFtcygpCi0KLXByb3RlY3RlZCB2b2lkIGhhbmRsZUV4Y2VwdGlvbigKLW9yZy5hcGFjaGUuaHR0cC5IdHRwRXhjZXB0aW9uCi1vcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xvcmcvYXBhY2hlL2h0dHAvSHR0cEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgaGFuZGxlUmVxdWVzdCgKLW9yZy5hcGFjaGUuaHR0cC5IdHRwU2VydmVyQ29ubmVjdGlvbgotb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBDb250ZXh0KQotCi1wdWJsaWMgdm9pZCBzZXRDb25uUmV1c2VTdHJhdGVneSgKLW9yZy5hcGFjaGUuaHR0cC5Db25uZWN0aW9uUmV1c2VTdHJhdGVneSkKLQotcHVibGljIHZvaWQgc2V0RXhwZWN0YXRpb25WZXJpZmllcigKLW9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwRXhwZWN0YXRpb25WZXJpZmllcikKLQotcHVibGljIHZvaWQgc2V0SGFuZGxlclJlc29sdmVyKAotb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBSZXF1ZXN0SGFuZGxlclJlc29sdmVyKQotCi1wdWJsaWMgdm9pZCBzZXRIdHRwUHJvY2Vzc29yKAotb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBQcm9jZXNzb3IpCi0KLXB1YmxpYyB2b2lkIHNldFBhcmFtcygKLW9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtcykKLQotcHVibGljIHZvaWQgc2V0UmVzcG9uc2VGYWN0b3J5KAotb3JnLmFwYWNoZS5odHRwLkh0dHBSZXNwb25zZUZhY3RvcnkpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLlJlcXVlc3RDb25uQ29udHJvbCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlcXVlc3RJbnRlcmNlcHRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9IdHRwRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBwcm9jZXNzKAotb3JnLmFwYWNoZS5odHRwLkh0dHBSZXF1ZXN0Ci1vcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cENvbnRleHQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLlJlcXVlc3RDb250ZW50IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaHR0cC5IdHRwUmVxdWVzdEludGVyY2VwdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL0h0dHBFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHByb2Nlc3MoCi1vcmcuYXBhY2hlLmh0dHAuSHR0cFJlcXVlc3QKLW9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwQ29udGV4dCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuUmVxdWVzdERhdGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmFwYWNoZS5odHRwLkh0dHBSZXF1ZXN0SW50ZXJjZXB0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBEYXRlR2VuZXJhdG9yIERBVEVfR0VORVJBVE9SCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvSHR0cEV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcHJvY2VzcygKLW9yZy5hcGFjaGUuaHR0cC5IdHRwUmVxdWVzdAotb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBDb250ZXh0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5SZXF1ZXN0RXhwZWN0Q29udGludWUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmFwYWNoZS5odHRwLkh0dHBSZXF1ZXN0SW50ZXJjZXB0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvSHR0cEV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcHJvY2VzcygKLW9yZy5hcGFjaGUuaHR0cC5IdHRwUmVxdWVzdAotb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBDb250ZXh0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5SZXF1ZXN0VGFyZ2V0SG9zdCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlcXVlc3RJbnRlcmNlcHRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9IdHRwRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBwcm9jZXNzKAotb3JnLmFwYWNoZS5odHRwLkh0dHBSZXF1ZXN0Ci1vcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cENvbnRleHQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLlJlcXVlc3RVc2VyQWdlbnQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmFwYWNoZS5odHRwLkh0dHBSZXF1ZXN0SW50ZXJjZXB0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvSHR0cEV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcHJvY2VzcygKLW9yZy5hcGFjaGUuaHR0cC5IdHRwUmVxdWVzdAotb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBDb250ZXh0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5SZXNwb25zZUNvbm5Db250cm9sIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaHR0cC5IdHRwUmVzcG9uc2VJbnRlcmNlcHRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaHR0cC9IdHRwRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBwcm9jZXNzKAotb3JnLmFwYWNoZS5odHRwLkh0dHBSZXNwb25zZQotb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBDb250ZXh0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5SZXNwb25zZUNvbnRlbnQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmFwYWNoZS5odHRwLkh0dHBSZXNwb25zZUludGVyY2VwdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL0h0dHBFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHByb2Nlc3MoCi1vcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlCi1vcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cENvbnRleHQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLlJlc3BvbnNlRGF0ZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlSW50ZXJjZXB0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBEYXRlR2VuZXJhdG9yIERBVEVfR0VORVJBVE9SCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2h0dHAvSHR0cEV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcHJvY2VzcygKLW9yZy5hcGFjaGUuaHR0cC5IdHRwUmVzcG9uc2UKLW9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwQ29udGV4dCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuUmVzcG9uc2VTZXJ2ZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmFwYWNoZS5odHRwLkh0dHBSZXNwb25zZUludGVyY2VwdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL0h0dHBFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHByb2Nlc3MoCi1vcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlCi1vcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cENvbnRleHQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLlN5bmNCYXNpY0h0dHBDb250ZXh0IGV4dGVuZHMgb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkJhc2ljSHR0cENvbnRleHQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cENvbnRleHQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldEF0dHJpYnV0ZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHJlbW92ZUF0dHJpYnV0ZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLlVyaVBhdHRlcm5NYXRjaGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5NYXAgaGFuZGxlck1hcAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGxvb2t1cCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByb3RlY3RlZCBib29sZWFuIG1hdGNoVXJpUmVxdWVzdFBhdHRlcm4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCByZWdpc3RlcigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2lkIHNldEhhbmRsZXJzKAotamF2YS51dGlsLk1hcCkKLQotcHVibGljIHZvaWQgdW5yZWdpc3RlcigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLnV0aWwuQnl0ZUFycmF5QnVmZmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGJ5dGVbXSBidWZmZXIKLQotcHJpdmF0ZSBpbnQgbGVuCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50KQotCi1wcml2YXRlIHZvaWQgZXhwYW5kKAotaW50KQotCi1wdWJsaWMgdm9pZCBhcHBlbmQoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGFwcGVuZCgKLW9yZy5hcGFjaGUuaHR0cC51dGlsLkNoYXJBcnJheUJ1ZmZlcgotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIGFwcGVuZCgKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIGFwcGVuZCgKLWNoYXJbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyBieXRlW10gYnVmZmVyKCkKLQotcHVibGljIGludCBieXRlQXQoCi1pbnQpCi0KLXB1YmxpYyBpbnQgY2FwYWNpdHkoKQotCi1wdWJsaWMgdm9pZCBjbGVhcigpCi0KLXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0Z1bGwoKQotCi1wdWJsaWMgaW50IGxlbmd0aCgpCi0KLXB1YmxpYyB2b2lkIHNldExlbmd0aCgKLWludCkKLQotcHVibGljIGJ5dGVbXSB0b0J5dGVBcnJheSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLnV0aWwuQ2hhckFycmF5QnVmZmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGNoYXJbXSBidWZmZXIKLQotcHJpdmF0ZSBpbnQgbGVuCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50KQotCi1wcml2YXRlIHZvaWQgZXhwYW5kKAotaW50KQotCi1wdWJsaWMgdm9pZCBhcHBlbmQoCi1jaGFyKQotCi1wdWJsaWMgdm9pZCBhcHBlbmQoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgdm9pZCBhcHBlbmQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBhcHBlbmQoCi1vcmcuYXBhY2hlLmh0dHAudXRpbC5CeXRlQXJyYXlCdWZmZXIKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBhcHBlbmQoCi1vcmcuYXBhY2hlLmh0dHAudXRpbC5DaGFyQXJyYXlCdWZmZXIpCi0KLXB1YmxpYyB2b2lkIGFwcGVuZCgKLW9yZy5hcGFjaGUuaHR0cC51dGlsLkNoYXJBcnJheUJ1ZmZlcgotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIGFwcGVuZCgKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIGFwcGVuZCgKLWNoYXJbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyBjaGFyW10gYnVmZmVyKCkKLQotcHVibGljIGludCBjYXBhY2l0eSgpCi0KLXB1YmxpYyBjaGFyIGNoYXJBdCgKLWludCkKLQotcHVibGljIHZvaWQgY2xlYXIoKQotCi1wdWJsaWMgdm9pZCBlbnN1cmVDYXBhY2l0eSgKLWludCkKLQotcHVibGljIGludCBpbmRleE9mKAotaW50KQotCi1wdWJsaWMgaW50IGluZGV4T2YoCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkKLQotcHVibGljIGJvb2xlYW4gaXNGdWxsKCkKLQotcHVibGljIGludCBsZW5ndGgoKQotCi1wdWJsaWMgdm9pZCBzZXRMZW5ndGgoCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHN1YnN0cmluZygKLWludAotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBzdWJzdHJpbmdUcmltbWVkKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBjaGFyW10gdG9DaGFyQXJyYXkoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3Mgb3JnLmFwYWNoZS5odHRwLnV0aWwuRW5jb2RpbmdVdGlscyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBieXRlW10gZ2V0QXNjaWlCeXRlcygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRBc2NpaVN0cmluZygKLWJ5dGVbXSkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEFzY2lpU3RyaW5nKAotYnl0ZVtdCi1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBieXRlW10gZ2V0Qnl0ZXMoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nKAotYnl0ZVtdCi1pbnQKLWludAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygKLWJ5dGVbXQotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBvcmcuYXBhY2hlLmh0dHAudXRpbC5FbnRpdHlVdGlscyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9odHRwL1BhcnNlRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Q29udGVudENoYXJTZXQoCi1vcmcuYXBhY2hlLmh0dHAuSHR0cEVudGl0eSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBieXRlW10gdG9CeXRlQXJyYXkoCi1vcmcuYXBhY2hlLmh0dHAuSHR0cEVudGl0eSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMb3JnL2FwYWNoZS9odHRwL1BhcnNlRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoCi1vcmcuYXBhY2hlLmh0dHAuSHR0cEVudGl0eSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMb3JnL2FwYWNoZS9odHRwL1BhcnNlRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoCi1vcmcuYXBhY2hlLmh0dHAuSHR0cEVudGl0eQotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBvcmcuYXBhY2hlLmh0dHAudXRpbC5FeGNlcHRpb25VdGlscyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIElOSVRfQ0FVU0VfTUVUSE9ECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIGdldEluaXRDYXVzZU1ldGhvZCgpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0Q2F1c2UoCi1qYXZhLmxhbmcuVGhyb3dhYmxlCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaHR0cC51dGlsLkxhbmdVdGlscyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSEFTSF9PRkZTRVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSEFTSF9TRUVECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdFtdCi1qYXZhLmxhbmcuT2JqZWN0W10pCi0KLXB1YmxpYyBzdGF0aWMgaW50IGhhc2hDb2RlKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgaW50IGhhc2hDb2RlKAotaW50Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIGludCBoYXNoQ29kZSgKLWludAotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmh0dHAudXRpbC5WZXJzaW9uSW5mbyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBST1BFUlRZX01PRFVMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUFJPUEVSVFlfUkVMRUFTRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUFJPUEVSVFlfVElNRVNUQU1QCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBVTkFWQUlMQUJMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVkVSU0lPTl9QUk9QRVJUWV9GSUxFCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBpbmZvQ2xhc3Nsb2FkZXIKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGluZm9Nb2R1bGUKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGluZm9QYWNrYWdlCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBpbmZvUmVsZWFzZQotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgaW5mb1RpbWVzdGFtcAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByb3RlY3RlZCBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5odHRwLnV0aWwuVmVyc2lvbkluZm8gZnJvbU1hcCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudXRpbC5NYXAKLWphdmEubGFuZy5DbGFzc0xvYWRlcikKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmh0dHAudXRpbC5WZXJzaW9uSW5mbyBsb2FkVmVyc2lvbkluZm8oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuQ2xhc3NMb2FkZXIpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5odHRwLnV0aWwuVmVyc2lvbkluZm9bXSBsb2FkVmVyc2lvbkluZm8oCi1qYXZhLmxhbmcuU3RyaW5nW10KLWphdmEubGFuZy5DbGFzc0xvYWRlcikKLQotcHVibGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgZ2V0Q2xhc3Nsb2FkZXIoKQotCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBnZXRNb2R1bGUoKQotCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBnZXRQYWNrYWdlKCkKLQotcHVibGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgZ2V0UmVsZWFzZSgpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGdldFRpbWVzdGFtcCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKZGlmZiAtLWdpdCBhL3Rvb2xzL2RleC10b29scy9kZXgvY2xhc3NlczAuZGV4IGIvdG9vbHMvZGV4LXRvb2xzL2RleC9jbGFzc2VzMC5kZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMTJkMmQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGV4LXRvb2xzL2RleC9jbGFzc2VzMC5kZXgKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kZXgtdG9vbHMvZGV4L2NsYXNzZXMwLm91dC5kZXggYi90b29scy9kZXgtdG9vbHMvZGV4L2NsYXNzZXMwLm91dC5kZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMWUwNTQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGV4LXRvb2xzL2RleC9jbGFzc2VzMC5vdXQuZGV4CisrKyAvZGV2L251bGwKQEAgLTEsMTExMjE5ICswLDAgQEAKLS0tLS0tLS0tLS0tLS0tLS1ERVhfRklMRS0tLS0tLS0tLS0tLS0tCi0KLUZpbGVuYW1lOiBEZXhGaWxlCi0tLS0tLS0tLS0tLURFRklORURfQ0xBU1NFUy0tLS0tLS0tLS0tLQotCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgbmF0aXZlIGphdmEubGFuZy5PYmplY3QgaW50ZXJuYWxDbG9uZSgKLWphdmEubGFuZy5DbG9uZWFibGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9DbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGphdmEubGFuZy5PYmplY3QgY2xvbmUoKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvVGhyb3dhYmxlOyApCi1wcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS9sYW5nL0NsYXNzPCtMamF2YS9sYW5nL09iamVjdDs+OyApCi1wdWJsaWMgZmluYWwgbmF0aXZlIGphdmEubGFuZy5DbGFzcyBnZXRDbGFzcygpCi0KLXB1YmxpYyBuYXRpdmUgaW50IGhhc2hDb2RlKCkKLQotcHVibGljIGZpbmFsIG5hdGl2ZSB2b2lkIG5vdGlmeSgpCi0KLXB1YmxpYyBmaW5hbCBuYXRpdmUgdm9pZCBub3RpZnlBbGwoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbnRlcnJ1cHRlZEV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIHZvaWQgd2FpdCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbnRlcnJ1cHRlZEV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIHZvaWQgd2FpdCgKLWxvbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbnRlcnJ1cHRlZEV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIG5hdGl2ZSB2b2lkIHdhaXQoCi1sb25nCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIFNRTGl0ZS5BdXRob3JpemVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgYXV0aG9yaXplKAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIFNRTGl0ZS5CbG9iIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGxvbmcgaGFuZGxlCi0KLXByb3RlY3RlZCBpbnQgc2l6ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgaW50ZXJuYWxfaW5pdCgpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBjbG9zZSgpCi0KLXByb3RlY3RlZCBuYXRpdmUgdm9pZCBmaW5hbGl6ZSgpCi0KLXB1YmxpYyBqYXZhLmlvLklucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkKLQotcHVibGljIGphdmEuaW8uT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLW5hdGl2ZSBpbnQgcmVhZCgKLWJ5dGVbXQotaW50Ci1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotbmF0aXZlIGludCB3cml0ZSgKLWJ5dGVbXQotaW50Ci1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgamF2YS5pby5DbG9zZWFibGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgY2xvc2UoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGphdmEuaW8uSW5wdXRTdHJlYW0gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5pby5DbG9zZWFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIHNraXBCdWYKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGF2YWlsYWJsZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNsb3NlKCkKLQotcHVibGljIHZvaWQgbWFyaygKLWludCkKLQotcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgcmVhZCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcmVhZCgKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCByZWFkKAotYnl0ZVtdCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcmVzZXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgbG9uZyBza2lwKAotbG9uZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLSBjbGFzcyBTUUxpdGUuQmxvYlIgZXh0ZW5kcyBqYXZhLmlvLklucHV0U3RyZWFtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgU1FMaXRlLkJsb2IgYmxvYgotCi1wcml2YXRlIGludCBwb3MKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1TUUxpdGUuQmxvYikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCBhdmFpbGFibGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjbG9zZSgpCi0KLXB1YmxpYyB2b2lkIG1hcmsoCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcmVhZCgKLWJ5dGVbXQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHJlc2V0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGxvbmcgc2tpcCgKLWxvbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEuaW8uRmx1c2hhYmxlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGZsdXNoKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZhLmlvLk91dHB1dFN0cmVhbSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmlvLkNsb3NlYWJsZSwgamF2YS5pby5GbHVzaGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjbG9zZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGZsdXNoKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHdyaXRlKAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB3cml0ZSgKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi0gY2xhc3MgU1FMaXRlLkJsb2JXIGV4dGVuZHMgamF2YS5pby5PdXRwdXRTdHJlYW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBTUUxpdGUuQmxvYiBibG9iCi0KLXByaXZhdGUgaW50IHBvcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLVNRTGl0ZS5CbG9iKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjbG9zZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGZsdXNoKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgd3JpdGUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHdyaXRlKAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB3cml0ZSgKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIFNRTGl0ZS5CdXN5SGFuZGxlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBidXN5KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBTUUxpdGUuQ2FsbGJhY2sgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgY29sdW1ucygKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gbmV3cm93KAotamF2YS5sYW5nLlN0cmluZ1tdKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB0eXBlcygKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBTUUxpdGUuQ29uc3RhbnRzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUUxJVEUyX1RFWFQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1FMSVRFM19URVhUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNRTElURV9BQk9SVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUUxJVEVfQVJHUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUUxJVEVfQVRUQUNICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNRTElURV9BVVRICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNRTElURV9CTE9CCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNRTElURV9CVVNZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNRTElURV9DQU5UT1BFTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUUxJVEVfQ09OU1RSQUlOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUUxJVEVfQ09QWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUUxJVEVfQ09SUlVQVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUUxJVEVfQ1JFQVRFX0lOREVYCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNRTElURV9DUkVBVEVfVEFCTEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1FMSVRFX0NSRUFURV9URU1QX0lOREVYCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNRTElURV9DUkVBVEVfVEVNUF9UQUJMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUUxJVEVfQ1JFQVRFX1RFTVBfVFJJR0dFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUUxJVEVfQ1JFQVRFX1RFTVBfVklFVwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUUxJVEVfQ1JFQVRFX1RSSUdHRVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1FMSVRFX0NSRUFURV9WSUVXCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNRTElURV9ERUxFVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1FMSVRFX0RFTlkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1FMSVRFX0RFVEFDSAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUUxJVEVfRE9ORQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUUxJVEVfRFJPUF9JTkRFWAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUUxJVEVfRFJPUF9UQUJMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUUxJVEVfRFJPUF9URU1QX0lOREVYCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNRTElURV9EUk9QX1RFTVBfVEFCTEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1FMSVRFX0RST1BfVEVNUF9UUklHR0VSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNRTElURV9EUk9QX1RFTVBfVklFVwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUUxJVEVfRFJPUF9UUklHR0VSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNRTElURV9EUk9QX1ZJRVcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1FMSVRFX0VNUFRZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNRTElURV9FUlJPUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUUxJVEVfRkxPQVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1FMSVRFX0ZPUk1BVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUUxJVEVfRlVMTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUUxJVEVfSUdOT1JFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNRTElURV9JTlNFUlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1FMSVRFX0lOVEVHRVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1FMSVRFX0lOVEVSTkFMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNRTElURV9JTlRFUlJVUFQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1FMSVRFX0lPRVJSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNRTElURV9MT0NLRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1FMSVRFX01JU01BVENICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNRTElURV9NSVNVU0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1FMSVRFX05PTEZTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNRTElURV9OT01FTQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUUxJVEVfTk9UQURCCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNRTElURV9OT1RGT1VORAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUUxJVEVfTlVMTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUUxJVEVfTlVNRVJJQwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUUxJVEVfT0sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1FMSVRFX1BFUk0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1FMSVRFX1BSQUdNQQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUUxJVEVfUFJPVE9DT0wKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1FMSVRFX1JBTkdFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNRTElURV9SRUFECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNRTElURV9SRUFET05MWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUUxJVEVfUk9XCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNRTElURV9TQ0hFTUEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1FMSVRFX1NFTEVDVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUUxJVEVfVEVYVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUUxJVEVfVE9PQklHCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNRTElURV9UUkFOU0FDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUUxJVEVfVVBEQVRFCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLSBjbGFzcyBTUUxpdGUuREJEdW1wIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIFNRTGl0ZS5DYWxsYmFjawotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gU1FMaXRlLlNoZWxsIHMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1TUUxpdGUuU2hlbGwKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotcHVibGljIHZvaWQgY29sdW1ucygKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotcHVibGljIGJvb2xlYW4gbmV3cm93KAotamF2YS5sYW5nLlN0cmluZ1tdKQotCi1wdWJsaWMgdm9pZCB0eXBlcygKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBTUUxpdGUuRGF0YWJhc2UgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCBpbnQgZXJyb3JfY29kZQotCi1wcm90ZWN0ZWQgbG9uZyBoYW5kbGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgX2J1c3lfaGFuZGxlcigKLVNRTGl0ZS5CdXN5SGFuZGxlcikKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBfYnVzeV90aW1lb3V0KAotaW50KQotCi1wcml2YXRlIG5hdGl2ZSBsb25nIF9jaGFuZ2VzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MU1FMaXRlL0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBfY2xvc2UoKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBfY29tcGxldGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIF9jcmVhdGVfYWdncmVnYXRlKAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1TUUxpdGUuRnVuY3Rpb24pCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgX2NyZWF0ZV9mdW5jdGlvbigKLWphdmEubGFuZy5TdHJpbmcKLWludAotU1FMaXRlLkZ1bmN0aW9uKQotCi1wcml2YXRlIG5hdGl2ZSBqYXZhLmxhbmcuU3RyaW5nIF9lcnJtc2coKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxTUUxpdGUvRXhjZXB0aW9uOyApCi1wcml2YXRlIG5hdGl2ZSB2b2lkIF9leGVjKAotamF2YS5sYW5nLlN0cmluZwotU1FMaXRlLkNhbGxiYWNrKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxTUUxpdGUvRXhjZXB0aW9uOyApCi1wcml2YXRlIG5hdGl2ZSB2b2lkIF9leGVjKAotamF2YS5sYW5nLlN0cmluZwotU1FMaXRlLkNhbGxiYWNrCi1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgX2ZpbmFsaXplKCkKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBfZnVuY3Rpb25fdHlwZSgKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBfaW50ZXJydXB0KCkKLQotcHJpdmF0ZSBuYXRpdmUgbG9uZyBfbGFzdF9pbnNlcnRfcm93aWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxTUUxpdGUvRXhjZXB0aW9uOyApCi1wcml2YXRlIG5hdGl2ZSB2b2lkIF9vcGVuKAotamF2YS5sYW5nLlN0cmluZwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxTUUxpdGUvRXhjZXB0aW9uOyApCi1wcml2YXRlIG5hdGl2ZSB2b2lkIF9vcGVuX2F1eF9maWxlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MU1FMaXRlL0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBfb3Blbl9ibG9iKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotbG9uZwotYm9vbGVhbgotU1FMaXRlLkJsb2IpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgX3Byb2dyZXNzX2hhbmRsZXIoCi1pbnQKLVNRTGl0ZS5Qcm9ncmVzc0hhbmRsZXIpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgX3NldF9hdXRob3JpemVyKAotU1FMaXRlLkF1dGhvcml6ZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TFNRTGl0ZS9FeGNlcHRpb247ICkKLXByaXZhdGUgbmF0aXZlIHZvaWQgX3NldF9lbmNvZGluZygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgX3RyYWNlKAotU1FMaXRlLlRyYWNlKQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gY29tcGxldGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBqYXZhLmxhbmcuU3RyaW5nIGVycm9yX3N0cmluZygKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgaW50ZXJuYWxfaW5pdCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TFNRTGl0ZS9FeGNlcHRpb247ICkKLXByaXZhdGUgbmF0aXZlIHZvaWQgc3RtdF9wcmVwYXJlKAotamF2YS5sYW5nLlN0cmluZwotU1FMaXRlLlN0bXQpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGphdmEubGFuZy5TdHJpbmcgdmVyc2lvbigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TFNRTGl0ZS9FeGNlcHRpb247ICkKLXByaXZhdGUgbmF0aXZlIHZvaWQgdm1fY29tcGlsZSgKLWphdmEubGFuZy5TdHJpbmcKLVNRTGl0ZS5WbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MU1FMaXRlL0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBuYXRpdmUgdm9pZCB2bV9jb21waWxlX2FyZ3MoCi1qYXZhLmxhbmcuU3RyaW5nCi1TUUxpdGUuVm0KLWphdmEubGFuZy5TdHJpbmdbXSkKLQotcHVibGljIHZvaWQgYnVzeV9oYW5kbGVyKAotU1FMaXRlLkJ1c3lIYW5kbGVyKQotCi1wdWJsaWMgdm9pZCBidXN5X3RpbWVvdXQoCi1pbnQpCi0KLXB1YmxpYyBsb25nIGNoYW5nZXMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxTUUxpdGUvRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjbG9zZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TFNRTGl0ZS9FeGNlcHRpb247ICkKLXB1YmxpYyBTUUxpdGUuVm0gY29tcGlsZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TFNRTGl0ZS9FeGNlcHRpb247ICkKLXB1YmxpYyBTUUxpdGUuVm0gY29tcGlsZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotcHVibGljIHZvaWQgY3JlYXRlX2FnZ3JlZ2F0ZSgKLWphdmEubGFuZy5TdHJpbmcKLWludAotU1FMaXRlLkZ1bmN0aW9uKQotCi1wdWJsaWMgdm9pZCBjcmVhdGVfZnVuY3Rpb24oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLVNRTGl0ZS5GdW5jdGlvbikKLQotcHVibGljIG5hdGl2ZSBqYXZhLmxhbmcuU3RyaW5nIGRidmVyc2lvbigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGVycm9yX21lc3NhZ2UoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxTUUxpdGUvRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBleGVjKAotamF2YS5sYW5nLlN0cmluZwotU1FMaXRlLkNhbGxiYWNrKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxTUUxpdGUvRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBleGVjKAotamF2YS5sYW5nLlN0cmluZwotU1FMaXRlLkNhbGxiYWNrCi1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkKLQotcHVibGljIHZvaWQgZnVuY3Rpb25fdHlwZSgKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MU1FMaXRlL0V4Y2VwdGlvbjsgKQotcHVibGljIFNRTGl0ZS5UYWJsZVJlc3VsdCBnZXRfdGFibGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxTUUxpdGUvRXhjZXB0aW9uOyApCi1wdWJsaWMgU1FMaXRlLlRhYmxlUmVzdWx0IGdldF90YWJsZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmdbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MU1FMaXRlL0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgZ2V0X3RhYmxlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZ1tdCi1TUUxpdGUuVGFibGVSZXN1bHQpCi0KLXB1YmxpYyB2b2lkIGludGVycnVwdCgpCi0KLXB1YmxpYyBuYXRpdmUgYm9vbGVhbiBpczMoKQotCi1wdWJsaWMgaW50IGxhc3RfZXJyb3IoKQotCi1wdWJsaWMgbG9uZyBsYXN0X2luc2VydF9yb3dpZCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TFNRTGl0ZS9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIG9wZW4oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TFNRTGl0ZS9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIG9wZW5fYXV4X2ZpbGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxTUUxpdGUvRXhjZXB0aW9uOyApCi1wdWJsaWMgU1FMaXRlLkJsb2Igb3Blbl9ibG9iKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotbG9uZwotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MU1FMaXRlL0V4Y2VwdGlvbjsgKQotcHVibGljIFNRTGl0ZS5TdG10IHByZXBhcmUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBwcm9ncmVzc19oYW5kbGVyKAotaW50Ci1TUUxpdGUuUHJvZ3Jlc3NIYW5kbGVyKQotCi1wdWJsaWMgdm9pZCBzZXRfYXV0aG9yaXplcigKLVNRTGl0ZS5BdXRob3JpemVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxTUUxpdGUvRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRfZW5jb2RpbmcoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRfbGFzdF9lcnJvcigKLWludCkKLQotcHVibGljIHZvaWQgdHJhY2UoCi1TUUxpdGUuVHJhY2UpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEuaW8uU2VyaWFsaXphYmxlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5sYW5nLlRocm93YWJsZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuVGhyb3dhYmxlIGNhdXNlCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBkZXRhaWxNZXNzYWdlCi0KLXByaXZhdGUgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBzdGFja1N0YXRlCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0YWNrVHJhY2VFbGVtZW50W10gc3RhY2tUcmFjZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLXByaXZhdGUgc3RhdGljIGludCBjb3VudER1cGxpY2F0ZXMoCi1qYXZhLmxhbmcuU3RhY2tUcmFjZUVsZW1lbnRbXQotamF2YS5sYW5nLlN0YWNrVHJhY2VFbGVtZW50W10pCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0YWNrVHJhY2VFbGVtZW50W10gZ2V0SW50ZXJuYWxTdGFja1RyYWNlKCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGphdmEubGFuZy5PYmplY3QgbmF0aXZlRmlsbEluU3RhY2tUcmFjZSgpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBqYXZhLmxhbmcuU3RhY2tUcmFjZUVsZW1lbnRbXSBuYXRpdmVHZXRTdGFja1RyYWNlKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KAotamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0pCi0KLXB1YmxpYyBqYXZhLmxhbmcuVGhyb3dhYmxlIGZpbGxJblN0YWNrVHJhY2UoKQotCi1wdWJsaWMgamF2YS5sYW5nLlRocm93YWJsZSBnZXRDYXVzZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldExvY2FsaXplZE1lc3NhZ2UoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRNZXNzYWdlKCkKLQotcHVibGljIGphdmEubGFuZy5TdGFja1RyYWNlRWxlbWVudFtdIGdldFN0YWNrVHJhY2UoKQotCi1wdWJsaWMgamF2YS5sYW5nLlRocm93YWJsZSBpbml0Q2F1c2UoCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1wdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoKQotCi1wdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoCi1qYXZhLmlvLlByaW50U3RyZWFtKQotCi1wdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoCi1qYXZhLmlvLlByaW50V3JpdGVyKQotCi1wdWJsaWMgdm9pZCBzZXRTdGFja1RyYWNlKAotamF2YS5sYW5nLlN0YWNrVHJhY2VFbGVtZW50W10pCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLmxhbmcuRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLlRocm93YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIFNRTGl0ZS5FeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgU1FMaXRlLkZ1bmN0aW9uIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGZ1bmN0aW9uKAotU1FMaXRlLkZ1bmN0aW9uQ29udGV4dAotamF2YS5sYW5nLlN0cmluZ1tdKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBsYXN0X3N0ZXAoCi1TUUxpdGUuRnVuY3Rpb25Db250ZXh0KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdGVwKAotU1FMaXRlLkZ1bmN0aW9uQ29udGV4dAotamF2YS5sYW5nLlN0cmluZ1tdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIFNRTGl0ZS5GdW5jdGlvbkNvbnRleHQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgbG9uZyBoYW5kbGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIGludGVybmFsX2luaXQoKQotCi1wdWJsaWMgbmF0aXZlIGludCBjb3VudCgpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBzZXRfZXJyb3IoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgc2V0X3Jlc3VsdCgKLWRvdWJsZSkKLQotcHVibGljIG5hdGl2ZSB2b2lkIHNldF9yZXN1bHQoCi1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBzZXRfcmVzdWx0KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIG5hdGl2ZSB2b2lkIHNldF9yZXN1bHQoCi1ieXRlW10pCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBzZXRfcmVzdWx0X3plcm9ibG9iKAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotIGNsYXNzIFNRTGl0ZS5KREJDMnkuQmF0Y2hBcmcgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBqYXZhLmxhbmcuU3RyaW5nIGFyZwotCi0gYm9vbGVhbiBibG9iCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLSBjbGFzcyBTUUxpdGUuSkRCQzJ5LkRhdGFiYXNlWCBleHRlbmRzIFNRTGl0ZS5EYXRhYmFzZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgamF2YS5sYW5nLk9iamVjdCBsb2NrCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxTUUxpdGUvRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBleGVjKAotamF2YS5sYW5nLlN0cmluZwotU1FMaXRlLkNhbGxiYWNrKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxTUUxpdGUvRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBleGVjKAotamF2YS5sYW5nLlN0cmluZwotU1FMaXRlLkNhbGxiYWNrCi1qYXZhLmxhbmcuU3RyaW5nW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TFNRTGl0ZS9FeGNlcHRpb247ICkKLXB1YmxpYyBTUUxpdGUuVGFibGVSZXN1bHQgZ2V0X3RhYmxlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZ1tdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxTUUxpdGUvRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBnZXRfdGFibGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nW10KLVNRTGl0ZS5UYWJsZVJlc3VsdCkKLQotIHZvaWQgd2FpdCgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgamF2YS5zcWwuQ29ubmVjdGlvbiBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fTk9ORQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9SRUFEX0NPTU1JVFRFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9SRUFEX1VOQ09NTUlUVEVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OX1JFUEVBVEFCTEVfUkVBRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9TRVJJQUxJWkFCTEUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGNsZWFyV2FybmluZ3MoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGNsb3NlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBjb21taXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnNxbC5TdGF0ZW1lbnQgY3JlYXRlU3RhdGVtZW50KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zcWwuU3RhdGVtZW50IGNyZWF0ZVN0YXRlbWVudCgKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnNxbC5TdGF0ZW1lbnQgY3JlYXRlU3RhdGVtZW50KAotaW50Ci1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBnZXRBdXRvQ29tbWl0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRDYXRhbG9nKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldEhvbGRhYmlsaXR5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSBnZXRNZXRhRGF0YSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCBnZXRUcmFuc2FjdGlvbklzb2xhdGlvbigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9DbGFzczwqPjs+OyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLk1hcCBnZXRUeXBlTWFwKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zcWwuU1FMV2FybmluZyBnZXRXYXJuaW5ncygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNDbG9zZWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzUmVhZE9ubHkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIG5hdGl2ZVNRTCgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEuc3FsLkNhbGxhYmxlU3RhdGVtZW50IHByZXBhcmVDYWxsKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zcWwuQ2FsbGFibGVTdGF0ZW1lbnQgcHJlcGFyZUNhbGwoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zcWwuQ2FsbGFibGVTdGF0ZW1lbnQgcHJlcGFyZUNhbGwoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnNxbC5QcmVwYXJlZFN0YXRlbWVudCBwcmVwYXJlU3RhdGVtZW50KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zcWwuUHJlcGFyZWRTdGF0ZW1lbnQgcHJlcGFyZVN0YXRlbWVudCgKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zcWwuUHJlcGFyZWRTdGF0ZW1lbnQgcHJlcGFyZVN0YXRlbWVudCgKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnNxbC5QcmVwYXJlZFN0YXRlbWVudCBwcmVwYXJlU3RhdGVtZW50KAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zcWwuUHJlcGFyZWRTdGF0ZW1lbnQgcHJlcGFyZVN0YXRlbWVudCgKLWphdmEubGFuZy5TdHJpbmcKLWludFtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnNxbC5QcmVwYXJlZFN0YXRlbWVudCBwcmVwYXJlU3RhdGVtZW50KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZ1tdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlbGVhc2VTYXZlcG9pbnQoCi1qYXZhLnNxbC5TYXZlcG9pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgcm9sbGJhY2soKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJvbGxiYWNrKAotamF2YS5zcWwuU2F2ZXBvaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEF1dG9Db21taXQoCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldENhdGFsb2coCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEhvbGRhYmlsaXR5KAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFJlYWRPbmx5KAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zcWwuU2F2ZXBvaW50IHNldFNhdmVwb2ludCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEuc3FsLlNhdmVwb2ludCBzZXRTYXZlcG9pbnQoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFRyYW5zYWN0aW9uSXNvbGF0aW9uKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9DbGFzczwqPjs+OylWICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFR5cGVNYXAoCi1qYXZhLnV0aWwuTWFwKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIFNRTGl0ZS5KREJDMnkuSkRCQ0Nvbm5lY3Rpb24gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zcWwuQ29ubmVjdGlvbiwgU1FMaXRlLkJ1c3lIYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCBib29sZWFuIGF1dG9jb21taXQKLQotcHJvdGVjdGVkIFNRTGl0ZS5KREJDMnkuRGF0YWJhc2VYIGRiCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBkYmZpbGUKLQotcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgZW5jCi0KLXByb3RlY3RlZCBib29sZWFuIGludHJhbnMKLQotcHJpdmF0ZSBTUUxpdGUuSkRCQzJ5LkpEQkNEYXRhYmFzZU1ldGFEYXRhIG1ldGEKLQotcHJpdmF0ZSBib29sZWFuIHJlYWRvbmx5Ci0KLXByaXZhdGUgbG9uZyB0MAotCi1wcm90ZWN0ZWQgaW50IHRpbWVvdXQKLQotcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgdXJsCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIGJvb2xlYW4gYnVzeTAoCi1TUUxpdGUuSkRCQzJ5LkRhdGFiYXNlWAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXByaXZhdGUgU1FMaXRlLkpEQkMyeS5EYXRhYmFzZVggb3BlbigKLWJvb2xlYW4pCi0KLXB1YmxpYyBib29sZWFuIGJ1c3koCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXByb3RlY3RlZCBib29sZWFuIGJ1c3kzKAotU1FMaXRlLkpEQkMyeS5EYXRhYmFzZVgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjbGVhcldhcm5pbmdzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjbG9zZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY29tbWl0KCkKLQotcHVibGljIGphdmEuc3FsLlN0YXRlbWVudCBjcmVhdGVTdGF0ZW1lbnQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnNxbC5TdGF0ZW1lbnQgY3JlYXRlU3RhdGVtZW50KAotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuc3FsLlN0YXRlbWVudCBjcmVhdGVTdGF0ZW1lbnQoCi1pbnQKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIGdldEF1dG9Db21taXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldENhdGFsb2coKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgZ2V0SG9sZGFiaWxpdHkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhIGdldE1ldGFEYXRhKCkKLQotcHVibGljIFNRTGl0ZS5EYXRhYmFzZSBnZXRTUUxpdGVEYXRhYmFzZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXRUcmFuc2FjdGlvbklzb2xhdGlvbigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL0NsYXNzPCo+Oz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS51dGlsLk1hcCBnZXRUeXBlTWFwKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zcWwuU1FMV2FybmluZyBnZXRXYXJuaW5ncygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gaXNDbG9zZWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIG5hdGl2ZVNRTCgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuc3FsLkNhbGxhYmxlU3RhdGVtZW50IHByZXBhcmVDYWxsKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zcWwuQ2FsbGFibGVTdGF0ZW1lbnQgcHJlcGFyZUNhbGwoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zcWwuQ2FsbGFibGVTdGF0ZW1lbnQgcHJlcGFyZUNhbGwoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnNxbC5QcmVwYXJlZFN0YXRlbWVudCBwcmVwYXJlU3RhdGVtZW50KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zcWwuUHJlcGFyZWRTdGF0ZW1lbnQgcHJlcGFyZVN0YXRlbWVudCgKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zcWwuUHJlcGFyZWRTdGF0ZW1lbnQgcHJlcGFyZVN0YXRlbWVudCgKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnNxbC5QcmVwYXJlZFN0YXRlbWVudCBwcmVwYXJlU3RhdGVtZW50KAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zcWwuUHJlcGFyZWRTdGF0ZW1lbnQgcHJlcGFyZVN0YXRlbWVudCgKLWphdmEubGFuZy5TdHJpbmcKLWludFtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnNxbC5QcmVwYXJlZFN0YXRlbWVudCBwcmVwYXJlU3RhdGVtZW50KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZ1tdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHJlbGVhc2VTYXZlcG9pbnQoCi1qYXZhLnNxbC5TYXZlcG9pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcm9sbGJhY2soKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHJvbGxiYWNrKAotamF2YS5zcWwuU2F2ZXBvaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldEF1dG9Db21taXQoCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldENhdGFsb2coCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldEhvbGRhYmlsaXR5KAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldFJlYWRPbmx5KAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zcWwuU2F2ZXBvaW50IHNldFNhdmVwb2ludCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuc3FsLlNhdmVwb2ludCBzZXRTYXZlcG9pbnQoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldFRyYW5zYWN0aW9uSXNvbGF0aW9uKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldFR5cGVNYXAoCi1qYXZhLnV0aWwuTWFwKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IGF0dHJpYnV0ZU5vTnVsbHMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBhdHRyaWJ1dGVOdWxsYWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IGF0dHJpYnV0ZU51bGxhYmxlVW5rbm93bgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBiZXN0Um93Tm90UHNldWRvCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJlc3RSb3dQc2V1ZG8KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYmVzdFJvd1Nlc3Npb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYmVzdFJvd1RlbXBvcmFyeQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBiZXN0Um93VHJhbnNhY3Rpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYmVzdFJvd1Vua25vd24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY29sdW1uTm9OdWxscwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb2x1bW5OdWxsYWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb2x1bW5OdWxsYWJsZVVua25vd24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaW1wb3J0ZWRLZXlDYXNjYWRlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGltcG9ydGVkS2V5SW5pdGlhbGx5RGVmZXJyZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaW1wb3J0ZWRLZXlJbml0aWFsbHlJbW1lZGlhdGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaW1wb3J0ZWRLZXlOb0FjdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpbXBvcnRlZEtleU5vdERlZmVycmFibGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaW1wb3J0ZWRLZXlSZXN0cmljdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpbXBvcnRlZEtleVNldERlZmF1bHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaW1wb3J0ZWRLZXlTZXROdWxsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByb2NlZHVyZUNvbHVtbkluCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByb2NlZHVyZUNvbHVtbkluT3V0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByb2NlZHVyZUNvbHVtbk91dAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcm9jZWR1cmVDb2x1bW5SZXN1bHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJvY2VkdXJlQ29sdW1uUmV0dXJuCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByb2NlZHVyZUNvbHVtblVua25vd24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJvY2VkdXJlTm9OdWxscwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcm9jZWR1cmVOb1Jlc3VsdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcm9jZWR1cmVOdWxsYWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcm9jZWR1cmVOdWxsYWJsZVVua25vd24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJvY2VkdXJlUmVzdWx0VW5rbm93bgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcm9jZWR1cmVSZXR1cm5zUmVzdWx0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNxbFN0YXRlU1FMOTkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3FsU3RhdGVYT3BlbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IHRhYmxlSW5kZXhDbHVzdGVyZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCB0YWJsZUluZGV4SGFzaGVkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgdGFibGVJbmRleE90aGVyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgdGFibGVJbmRleFN0YXRpc3RpYwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0eXBlTm9OdWxscwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0eXBlTnVsbGFibGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdHlwZU51bGxhYmxlVW5rbm93bgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0eXBlUHJlZEJhc2ljCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHR5cGVQcmVkQ2hhcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0eXBlUHJlZE5vbmUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdHlwZVNlYXJjaGFibGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdmVyc2lvbkNvbHVtbk5vdFBzZXVkbwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB2ZXJzaW9uQ29sdW1uUHNldWRvCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHZlcnNpb25Db2x1bW5Vbmtub3duCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBhbGxQcm9jZWR1cmVzQXJlQ2FsbGFibGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGFsbFRhYmxlc0FyZVNlbGVjdGFibGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGRhdGFEZWZpbml0aW9uQ2F1c2VzVHJhbnNhY3Rpb25Db21taXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGRhdGFEZWZpbml0aW9uSWdub3JlZEluVHJhbnNhY3Rpb25zKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBkZWxldGVzQXJlRGV0ZWN0ZWQoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZG9lc01heFJvd1NpemVJbmNsdWRlQmxvYnMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnNxbC5SZXN1bHRTZXQgZ2V0QXR0cmlidXRlcygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEuc3FsLlJlc3VsdFNldCBnZXRCZXN0Um93SWRlbnRpZmllcigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWludAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRDYXRhbG9nU2VwYXJhdG9yKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRDYXRhbG9nVGVybSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEuc3FsLlJlc3VsdFNldCBnZXRDYXRhbG9ncygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEuc3FsLlJlc3VsdFNldCBnZXRDb2x1bW5Qcml2aWxlZ2VzKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zcWwuUmVzdWx0U2V0IGdldENvbHVtbnMoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnNxbC5Db25uZWN0aW9uIGdldENvbm5lY3Rpb24oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnNxbC5SZXN1bHRTZXQgZ2V0Q3Jvc3NSZWZlcmVuY2UoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0RGF0YWJhc2VNYWpvclZlcnNpb24oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0RGF0YWJhc2VNaW5vclZlcnNpb24oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldERhdGFiYXNlUHJvZHVjdE5hbWUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldERhdGFiYXNlUHJvZHVjdFZlcnNpb24oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0RGVmYXVsdFRyYW5zYWN0aW9uSXNvbGF0aW9uKCkKLQotcHVibGljIGFic3RyYWN0IGludCBnZXREcml2ZXJNYWpvclZlcnNpb24oKQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldERyaXZlck1pbm9yVmVyc2lvbigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0RHJpdmVyTmFtZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0RHJpdmVyVmVyc2lvbigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEuc3FsLlJlc3VsdFNldCBnZXRFeHBvcnRlZEtleXMoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldEV4dHJhTmFtZUNoYXJhY3RlcnMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldElkZW50aWZpZXJRdW90ZVN0cmluZygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEuc3FsLlJlc3VsdFNldCBnZXRJbXBvcnRlZEtleXMoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnNxbC5SZXN1bHRTZXQgZ2V0SW5kZXhJbmZvKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbgotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldEpEQkNNYWpvclZlcnNpb24oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0SkRCQ01pbm9yVmVyc2lvbigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCBnZXRNYXhCaW5hcnlMaXRlcmFsTGVuZ3RoKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldE1heENhdGFsb2dOYW1lTGVuZ3RoKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldE1heENoYXJMaXRlcmFsTGVuZ3RoKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldE1heENvbHVtbk5hbWVMZW5ndGgoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0TWF4Q29sdW1uc0luR3JvdXBCeSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCBnZXRNYXhDb2x1bW5zSW5JbmRleCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCBnZXRNYXhDb2x1bW5zSW5PcmRlckJ5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldE1heENvbHVtbnNJblNlbGVjdCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCBnZXRNYXhDb2x1bW5zSW5UYWJsZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCBnZXRNYXhDb25uZWN0aW9ucygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCBnZXRNYXhDdXJzb3JOYW1lTGVuZ3RoKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldE1heEluZGV4TGVuZ3RoKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldE1heFByb2NlZHVyZU5hbWVMZW5ndGgoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0TWF4Um93U2l6ZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCBnZXRNYXhTY2hlbWFOYW1lTGVuZ3RoKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldE1heFN0YXRlbWVudExlbmd0aCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCBnZXRNYXhTdGF0ZW1lbnRzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldE1heFRhYmxlTmFtZUxlbmd0aCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCBnZXRNYXhUYWJsZXNJblNlbGVjdCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCBnZXRNYXhVc2VyTmFtZUxlbmd0aCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0TnVtZXJpY0Z1bmN0aW9ucygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEuc3FsLlJlc3VsdFNldCBnZXRQcmltYXJ5S2V5cygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEuc3FsLlJlc3VsdFNldCBnZXRQcm9jZWR1cmVDb2x1bW5zKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRQcm9jZWR1cmVUZXJtKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zcWwuUmVzdWx0U2V0IGdldFByb2NlZHVyZXMoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0UmVzdWx0U2V0SG9sZGFiaWxpdHkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldFNRTEtleXdvcmRzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldFNRTFN0YXRlVHlwZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0U2NoZW1hVGVybSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEuc3FsLlJlc3VsdFNldCBnZXRTY2hlbWFzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRTZWFyY2hTdHJpbmdFc2NhcGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZ0Z1bmN0aW9ucygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEuc3FsLlJlc3VsdFNldCBnZXRTdXBlclRhYmxlcygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEuc3FsLlJlc3VsdFNldCBnZXRTdXBlclR5cGVzKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRTeXN0ZW1GdW5jdGlvbnMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnNxbC5SZXN1bHRTZXQgZ2V0VGFibGVQcml2aWxlZ2VzKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zcWwuUmVzdWx0U2V0IGdldFRhYmxlVHlwZXMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnNxbC5SZXN1bHRTZXQgZ2V0VGFibGVzKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZ1tdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldFRpbWVEYXRlRnVuY3Rpb25zKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zcWwuUmVzdWx0U2V0IGdldFR5cGVJbmZvKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zcWwuUmVzdWx0U2V0IGdldFVEVHMoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnRbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRVUkwoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldFVzZXJOYW1lKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zcWwuUmVzdWx0U2V0IGdldFZlcnNpb25Db2x1bW5zKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpbnNlcnRzQXJlRGV0ZWN0ZWQoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNDYXRhbG9nQXRTdGFydCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNSZWFkT25seSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gbG9jYXRvcnNVcGRhdGVDb3B5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBudWxsUGx1c05vbk51bGxJc051bGwoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIG51bGxzQXJlU29ydGVkQXRFbmQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIG51bGxzQXJlU29ydGVkQXRTdGFydCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gbnVsbHNBcmVTb3J0ZWRIaWdoKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBudWxsc0FyZVNvcnRlZExvdygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gb3RoZXJzRGVsZXRlc0FyZVZpc2libGUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gb3RoZXJzSW5zZXJ0c0FyZVZpc2libGUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gb3RoZXJzVXBkYXRlc0FyZVZpc2libGUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gb3duRGVsZXRlc0FyZVZpc2libGUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gb3duSW5zZXJ0c0FyZVZpc2libGUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gb3duVXBkYXRlc0FyZVZpc2libGUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gc3RvcmVzTG93ZXJDYXNlSWRlbnRpZmllcnMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHN0b3Jlc0xvd2VyQ2FzZVF1b3RlZElkZW50aWZpZXJzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzdG9yZXNNaXhlZENhc2VJZGVudGlmaWVycygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gc3RvcmVzTWl4ZWRDYXNlUXVvdGVkSWRlbnRpZmllcnMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHN0b3Jlc1VwcGVyQ2FzZUlkZW50aWZpZXJzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzdG9yZXNVcHBlckNhc2VRdW90ZWRJZGVudGlmaWVycygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gc3VwcG9ydHNBTlNJOTJFbnRyeUxldmVsU1FMKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzdXBwb3J0c0FOU0k5MkZ1bGxTUUwoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHN1cHBvcnRzQU5TSTkySW50ZXJtZWRpYXRlU1FMKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzdXBwb3J0c0FsdGVyVGFibGVXaXRoQWRkQ29sdW1uKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzdXBwb3J0c0FsdGVyVGFibGVXaXRoRHJvcENvbHVtbigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gc3VwcG9ydHNCYXRjaFVwZGF0ZXMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHN1cHBvcnRzQ2F0YWxvZ3NJbkRhdGFNYW5pcHVsYXRpb24oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHN1cHBvcnRzQ2F0YWxvZ3NJbkluZGV4RGVmaW5pdGlvbnMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHN1cHBvcnRzQ2F0YWxvZ3NJblByaXZpbGVnZURlZmluaXRpb25zKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzSW5Qcm9jZWR1cmVDYWxscygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gc3VwcG9ydHNDYXRhbG9nc0luVGFibGVEZWZpbml0aW9ucygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gc3VwcG9ydHNDb2x1bW5BbGlhc2luZygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gc3VwcG9ydHNDb252ZXJ0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzdXBwb3J0c0NvbnZlcnQoCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzdXBwb3J0c0NvcmVTUUxHcmFtbWFyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzdXBwb3J0c0NvcnJlbGF0ZWRTdWJxdWVyaWVzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzdXBwb3J0c0RhdGFEZWZpbml0aW9uQW5kRGF0YU1hbmlwdWxhdGlvblRyYW5zYWN0aW9ucygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gc3VwcG9ydHNEYXRhTWFuaXB1bGF0aW9uVHJhbnNhY3Rpb25zT25seSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gc3VwcG9ydHNEaWZmZXJlbnRUYWJsZUNvcnJlbGF0aW9uTmFtZXMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHN1cHBvcnRzRXhwcmVzc2lvbnNJbk9yZGVyQnkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHN1cHBvcnRzRXh0ZW5kZWRTUUxHcmFtbWFyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzdXBwb3J0c0Z1bGxPdXRlckpvaW5zKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzdXBwb3J0c0dldEdlbmVyYXRlZEtleXMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHN1cHBvcnRzR3JvdXBCeSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gc3VwcG9ydHNHcm91cEJ5QmV5b25kU2VsZWN0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzdXBwb3J0c0dyb3VwQnlVbnJlbGF0ZWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHN1cHBvcnRzSW50ZWdyaXR5RW5oYW5jZW1lbnRGYWNpbGl0eSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gc3VwcG9ydHNMaWtlRXNjYXBlQ2xhdXNlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzdXBwb3J0c0xpbWl0ZWRPdXRlckpvaW5zKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzdXBwb3J0c01pbmltdW1TUUxHcmFtbWFyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzdXBwb3J0c01peGVkQ2FzZUlkZW50aWZpZXJzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzdXBwb3J0c01peGVkQ2FzZVF1b3RlZElkZW50aWZpZXJzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzdXBwb3J0c011bHRpcGxlT3BlblJlc3VsdHMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHN1cHBvcnRzTXVsdGlwbGVSZXN1bHRTZXRzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzdXBwb3J0c011bHRpcGxlVHJhbnNhY3Rpb25zKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzdXBwb3J0c05hbWVkUGFyYW1ldGVycygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gc3VwcG9ydHNOb25OdWxsYWJsZUNvbHVtbnMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHN1cHBvcnRzT3BlbkN1cnNvcnNBY3Jvc3NDb21taXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHN1cHBvcnRzT3BlbkN1cnNvcnNBY3Jvc3NSb2xsYmFjaygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gc3VwcG9ydHNPcGVuU3RhdGVtZW50c0Fjcm9zc0NvbW1pdCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gc3VwcG9ydHNPcGVuU3RhdGVtZW50c0Fjcm9zc1JvbGxiYWNrKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzdXBwb3J0c09yZGVyQnlVbnJlbGF0ZWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHN1cHBvcnRzT3V0ZXJKb2lucygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gc3VwcG9ydHNQb3NpdGlvbmVkRGVsZXRlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzdXBwb3J0c1Bvc2l0aW9uZWRVcGRhdGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHN1cHBvcnRzUmVzdWx0U2V0Q29uY3VycmVuY3koCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzdXBwb3J0c1Jlc3VsdFNldEhvbGRhYmlsaXR5KAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHN1cHBvcnRzUmVzdWx0U2V0VHlwZSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzdXBwb3J0c1NhdmVwb2ludHMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHN1cHBvcnRzU2NoZW1hc0luRGF0YU1hbmlwdWxhdGlvbigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gc3VwcG9ydHNTY2hlbWFzSW5JbmRleERlZmluaXRpb25zKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzdXBwb3J0c1NjaGVtYXNJblByaXZpbGVnZURlZmluaXRpb25zKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzdXBwb3J0c1NjaGVtYXNJblByb2NlZHVyZUNhbGxzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzdXBwb3J0c1NjaGVtYXNJblRhYmxlRGVmaW5pdGlvbnMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHN1cHBvcnRzU2VsZWN0Rm9yVXBkYXRlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzdXBwb3J0c1N0YXRlbWVudFBvb2xpbmcoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHN1cHBvcnRzU3RvcmVkUHJvY2VkdXJlcygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gc3VwcG9ydHNTdWJxdWVyaWVzSW5Db21wYXJpc29ucygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gc3VwcG9ydHNTdWJxdWVyaWVzSW5FeGlzdHMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHN1cHBvcnRzU3VicXVlcmllc0luSW5zKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzdXBwb3J0c1N1YnF1ZXJpZXNJblF1YW50aWZpZWRzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzdXBwb3J0c1RhYmxlQ29ycmVsYXRpb25OYW1lcygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gc3VwcG9ydHNUcmFuc2FjdGlvbklzb2xhdGlvbkxldmVsKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHN1cHBvcnRzVHJhbnNhY3Rpb25zKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzdXBwb3J0c1VuaW9uKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzdXBwb3J0c1VuaW9uQWxsKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiB1cGRhdGVzQXJlRGV0ZWN0ZWQoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gdXNlc0xvY2FsRmlsZVBlclRhYmxlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiB1c2VzTG9jYWxGaWxlcygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgU1FMaXRlLkpEQkMyeS5KREJDRGF0YWJhc2VNZXRhRGF0YSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgU1FMaXRlLkpEQkMyeS5KREJDQ29ubmVjdGlvbiBjb25uCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotU1FMaXRlLkpEQkMyeS5KREJDQ29ubmVjdGlvbikKLQotc3RhdGljIGludCBnZXREKAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1zdGF0aWMgaW50IGdldE0oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXByaXZhdGUgdm9pZCBpbnRlcm5hbEltcG9ydGVkS2V5cygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLVNRTGl0ZS5KREJDMnkuSkRCQ1Jlc3VsdFNldAotU1FMaXRlLkpEQkMyeS5UYWJsZVJlc3VsdFgpCi0KLXN0YXRpYyBpbnQgbWFwU3FsVHlwZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIG1hcFR5cGVOYW1lKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIGFsbFByb2NlZHVyZXNBcmVDYWxsYWJsZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gYWxsVGFibGVzQXJlU2VsZWN0YWJsZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gZGF0YURlZmluaXRpb25DYXVzZXNUcmFuc2FjdGlvbkNvbW1pdCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gZGF0YURlZmluaXRpb25JZ25vcmVkSW5UcmFuc2FjdGlvbnMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIGRlbGV0ZXNBcmVEZXRlY3RlZCgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBkb2VzTWF4Um93U2l6ZUluY2x1ZGVCbG9icygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuc3FsLlJlc3VsdFNldCBnZXRBdHRyaWJ1dGVzKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zcWwuUmVzdWx0U2V0IGdldEJlc3RSb3dJZGVudGlmaWVyKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotaW50Ci1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldENhdGFsb2dTZXBhcmF0b3IoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldENhdGFsb2dUZXJtKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zcWwuUmVzdWx0U2V0IGdldENhdGFsb2dzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zcWwuUmVzdWx0U2V0IGdldENvbHVtblByaXZpbGVnZXMoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnNxbC5SZXN1bHRTZXQgZ2V0Q29sdW1ucygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuc3FsLkNvbm5lY3Rpb24gZ2V0Q29ubmVjdGlvbigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuc3FsLlJlc3VsdFNldCBnZXRDcm9zc1JlZmVyZW5jZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBpbnQgZ2V0RGF0YWJhc2VNYWpvclZlcnNpb24oKQotCi1wdWJsaWMgaW50IGdldERhdGFiYXNlTWlub3JWZXJzaW9uKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXREYXRhYmFzZVByb2R1Y3ROYW1lKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXREYXRhYmFzZVByb2R1Y3RWZXJzaW9uKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGdldERlZmF1bHRUcmFuc2FjdGlvbklzb2xhdGlvbigpCi0KLXB1YmxpYyBpbnQgZ2V0RHJpdmVyTWFqb3JWZXJzaW9uKCkKLQotcHVibGljIGludCBnZXREcml2ZXJNaW5vclZlcnNpb24oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldERyaXZlck5hbWUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldERyaXZlclZlcnNpb24oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnNxbC5SZXN1bHRTZXQgZ2V0RXhwb3J0ZWRLZXlzKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRFeHRyYU5hbWVDaGFyYWN0ZXJzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJZGVudGlmaWVyUXVvdGVTdHJpbmcoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnNxbC5SZXN1bHRTZXQgZ2V0SW1wb3J0ZWRLZXlzKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zcWwuUmVzdWx0U2V0IGdldEluZGV4SW5mbygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4KLWJvb2xlYW4pCi0KLXB1YmxpYyBpbnQgZ2V0SkRCQ01ham9yVmVyc2lvbigpCi0KLXB1YmxpYyBpbnQgZ2V0SkRCQ01pbm9yVmVyc2lvbigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXRNYXhCaW5hcnlMaXRlcmFsTGVuZ3RoKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGdldE1heENhdGFsb2dOYW1lTGVuZ3RoKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGdldE1heENoYXJMaXRlcmFsTGVuZ3RoKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGdldE1heENvbHVtbk5hbWVMZW5ndGgoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgZ2V0TWF4Q29sdW1uc0luR3JvdXBCeSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXRNYXhDb2x1bW5zSW5JbmRleCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXRNYXhDb2x1bW5zSW5PcmRlckJ5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGdldE1heENvbHVtbnNJblNlbGVjdCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXRNYXhDb2x1bW5zSW5UYWJsZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXRNYXhDb25uZWN0aW9ucygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXRNYXhDdXJzb3JOYW1lTGVuZ3RoKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGdldE1heEluZGV4TGVuZ3RoKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGdldE1heFByb2NlZHVyZU5hbWVMZW5ndGgoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgZ2V0TWF4Um93U2l6ZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXRNYXhTY2hlbWFOYW1lTGVuZ3RoKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGdldE1heFN0YXRlbWVudExlbmd0aCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXRNYXhTdGF0ZW1lbnRzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGdldE1heFRhYmxlTmFtZUxlbmd0aCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXRNYXhUYWJsZXNJblNlbGVjdCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXRNYXhVc2VyTmFtZUxlbmd0aCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TnVtZXJpY0Z1bmN0aW9ucygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuc3FsLlJlc3VsdFNldCBnZXRQcmltYXJ5S2V5cygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuc3FsLlJlc3VsdFNldCBnZXRQcm9jZWR1cmVDb2x1bW5zKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRQcm9jZWR1cmVUZXJtKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zcWwuUmVzdWx0U2V0IGdldFByb2NlZHVyZXMoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgZ2V0UmVzdWx0U2V0SG9sZGFiaWxpdHkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFNRTEtleXdvcmRzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGdldFNRTFN0YXRlVHlwZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U2NoZW1hVGVybSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuc3FsLlJlc3VsdFNldCBnZXRTY2hlbWFzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTZWFyY2hTdHJpbmdFc2NhcGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZ0Z1bmN0aW9ucygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuc3FsLlJlc3VsdFNldCBnZXRTdXBlclRhYmxlcygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuc3FsLlJlc3VsdFNldCBnZXRTdXBlclR5cGVzKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTeXN0ZW1GdW5jdGlvbnMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnNxbC5SZXN1bHRTZXQgZ2V0VGFibGVQcml2aWxlZ2VzKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zcWwuUmVzdWx0U2V0IGdldFRhYmxlVHlwZXMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnNxbC5SZXN1bHRTZXQgZ2V0VGFibGVzKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZ1tdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFRpbWVEYXRlRnVuY3Rpb25zKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zcWwuUmVzdWx0U2V0IGdldFR5cGVJbmZvKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zcWwuUmVzdWx0U2V0IGdldFVEVHMoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnRbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRVUkwoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFVzZXJOYW1lKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zcWwuUmVzdWx0U2V0IGdldFZlcnNpb25Db2x1bW5zKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBpbnNlcnRzQXJlRGV0ZWN0ZWQoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gaXNDYXRhbG9nQXRTdGFydCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gbG9jYXRvcnNVcGRhdGVDb3B5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBudWxsUGx1c05vbk51bGxJc051bGwoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIG51bGxzQXJlU29ydGVkQXRFbmQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIG51bGxzQXJlU29ydGVkQXRTdGFydCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gbnVsbHNBcmVTb3J0ZWRIaWdoKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBudWxsc0FyZVNvcnRlZExvdygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gb3RoZXJzRGVsZXRlc0FyZVZpc2libGUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gb3RoZXJzSW5zZXJ0c0FyZVZpc2libGUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gb3RoZXJzVXBkYXRlc0FyZVZpc2libGUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gb3duRGVsZXRlc0FyZVZpc2libGUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gb3duSW5zZXJ0c0FyZVZpc2libGUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gb3duVXBkYXRlc0FyZVZpc2libGUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gc3RvcmVzTG93ZXJDYXNlSWRlbnRpZmllcnMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIHN0b3Jlc0xvd2VyQ2FzZVF1b3RlZElkZW50aWZpZXJzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBzdG9yZXNNaXhlZENhc2VJZGVudGlmaWVycygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gc3RvcmVzTWl4ZWRDYXNlUXVvdGVkSWRlbnRpZmllcnMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIHN0b3Jlc1VwcGVyQ2FzZUlkZW50aWZpZXJzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBzdG9yZXNVcHBlckNhc2VRdW90ZWRJZGVudGlmaWVycygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gc3VwcG9ydHNBTlNJOTJFbnRyeUxldmVsU1FMKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0FOU0k5MkZ1bGxTUUwoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIHN1cHBvcnRzQU5TSTkySW50ZXJtZWRpYXRlU1FMKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0FsdGVyVGFibGVXaXRoQWRkQ29sdW1uKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0FsdGVyVGFibGVXaXRoRHJvcENvbHVtbigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gc3VwcG9ydHNCYXRjaFVwZGF0ZXMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIHN1cHBvcnRzQ2F0YWxvZ3NJbkRhdGFNYW5pcHVsYXRpb24oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIHN1cHBvcnRzQ2F0YWxvZ3NJbkluZGV4RGVmaW5pdGlvbnMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIHN1cHBvcnRzQ2F0YWxvZ3NJblByaXZpbGVnZURlZmluaXRpb25zKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzSW5Qcm9jZWR1cmVDYWxscygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gc3VwcG9ydHNDYXRhbG9nc0luVGFibGVEZWZpbml0aW9ucygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gc3VwcG9ydHNDb2x1bW5BbGlhc2luZygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gc3VwcG9ydHNDb252ZXJ0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0NvbnZlcnQoCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0NvcmVTUUxHcmFtbWFyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0NvcnJlbGF0ZWRTdWJxdWVyaWVzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0RhdGFEZWZpbml0aW9uQW5kRGF0YU1hbmlwdWxhdGlvblRyYW5zYWN0aW9ucygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gc3VwcG9ydHNEYXRhTWFuaXB1bGF0aW9uVHJhbnNhY3Rpb25zT25seSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gc3VwcG9ydHNEaWZmZXJlbnRUYWJsZUNvcnJlbGF0aW9uTmFtZXMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIHN1cHBvcnRzRXhwcmVzc2lvbnNJbk9yZGVyQnkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIHN1cHBvcnRzRXh0ZW5kZWRTUUxHcmFtbWFyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0Z1bGxPdXRlckpvaW5zKCkKLQotcHVibGljIGJvb2xlYW4gc3VwcG9ydHNHZXRHZW5lcmF0ZWRLZXlzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0dyb3VwQnkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIHN1cHBvcnRzR3JvdXBCeUJleW9uZFNlbGVjdCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gc3VwcG9ydHNHcm91cEJ5VW5yZWxhdGVkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0ludGVncml0eUVuaGFuY2VtZW50RmFjaWxpdHkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIHN1cHBvcnRzTGlrZUVzY2FwZUNsYXVzZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gc3VwcG9ydHNMaW1pdGVkT3V0ZXJKb2lucygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gc3VwcG9ydHNNaW5pbXVtU1FMR3JhbW1hcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gc3VwcG9ydHNNaXhlZENhc2VJZGVudGlmaWVycygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gc3VwcG9ydHNNaXhlZENhc2VRdW90ZWRJZGVudGlmaWVycygpCi0KLXB1YmxpYyBib29sZWFuIHN1cHBvcnRzTXVsdGlwbGVPcGVuUmVzdWx0cygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gc3VwcG9ydHNNdWx0aXBsZVJlc3VsdFNldHMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIHN1cHBvcnRzTXVsdGlwbGVUcmFuc2FjdGlvbnMoKQotCi1wdWJsaWMgYm9vbGVhbiBzdXBwb3J0c05hbWVkUGFyYW1ldGVycygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gc3VwcG9ydHNOb25OdWxsYWJsZUNvbHVtbnMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIHN1cHBvcnRzT3BlbkN1cnNvcnNBY3Jvc3NDb21taXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIHN1cHBvcnRzT3BlbkN1cnNvcnNBY3Jvc3NSb2xsYmFjaygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gc3VwcG9ydHNPcGVuU3RhdGVtZW50c0Fjcm9zc0NvbW1pdCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gc3VwcG9ydHNPcGVuU3RhdGVtZW50c0Fjcm9zc1JvbGxiYWNrKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBzdXBwb3J0c09yZGVyQnlVbnJlbGF0ZWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIHN1cHBvcnRzT3V0ZXJKb2lucygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gc3VwcG9ydHNQb3NpdGlvbmVkRGVsZXRlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1Bvc2l0aW9uZWRVcGRhdGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIHN1cHBvcnRzUmVzdWx0U2V0Q29uY3VycmVuY3koCi1pbnQKLWludCkKLQotcHVibGljIGJvb2xlYW4gc3VwcG9ydHNSZXN1bHRTZXRIb2xkYWJpbGl0eSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1Jlc3VsdFNldFR5cGUoCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIHN1cHBvcnRzU2F2ZXBvaW50cygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gc3VwcG9ydHNTY2hlbWFzSW5EYXRhTWFuaXB1bGF0aW9uKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1NjaGVtYXNJbkluZGV4RGVmaW5pdGlvbnMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIHN1cHBvcnRzU2NoZW1hc0luUHJpdmlsZWdlRGVmaW5pdGlvbnMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIHN1cHBvcnRzU2NoZW1hc0luUHJvY2VkdXJlQ2FsbHMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIHN1cHBvcnRzU2NoZW1hc0luVGFibGVEZWZpbml0aW9ucygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gc3VwcG9ydHNTZWxlY3RGb3JVcGRhdGUoKQotCi1wdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1N0YXRlbWVudFBvb2xpbmcoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIHN1cHBvcnRzU3RvcmVkUHJvY2VkdXJlcygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gc3VwcG9ydHNTdWJxdWVyaWVzSW5Db21wYXJpc29ucygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gc3VwcG9ydHNTdWJxdWVyaWVzSW5FeGlzdHMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIHN1cHBvcnRzU3VicXVlcmllc0luSW5zKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1N1YnF1ZXJpZXNJblF1YW50aWZpZWRzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1RhYmxlQ29ycmVsYXRpb25OYW1lcygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gc3VwcG9ydHNUcmFuc2FjdGlvbklzb2xhdGlvbkxldmVsKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIHN1cHBvcnRzVHJhbnNhY3Rpb25zKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1VuaW9uKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1VuaW9uQWxsKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiB1cGRhdGVzQXJlRGV0ZWN0ZWQoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gdXNlc0xvY2FsRmlsZVBlclRhYmxlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiB1c2VzTG9jYWxGaWxlcygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEuc3FsLlN0YXRlbWVudCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xPU0VfQUxMX1JFU1VMVFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xPU0VfQ1VSUkVOVF9SRVNVTFQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhFQ1VURV9GQUlMRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VFUF9DVVJSRU5UX1JFU1VMVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT19HRU5FUkFURURfS0VZUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVRVUk5fR0VORVJBVEVEX0tFWVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1VDQ0VTU19OT19JTkZPCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBhZGRCYXRjaCgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgY2FuY2VsKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBjbGVhckJhdGNoKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBjbGVhcldhcm5pbmdzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBjbG9zZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZXhlY3V0ZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZXhlY3V0ZSgKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBleGVjdXRlKAotamF2YS5sYW5nLlN0cmluZwotaW50W10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZXhlY3V0ZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmdbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50W10gZXhlY3V0ZUJhdGNoKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zcWwuUmVzdWx0U2V0IGV4ZWN1dGVRdWVyeSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCBleGVjdXRlVXBkYXRlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGV4ZWN1dGVVcGRhdGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCBleGVjdXRlVXBkYXRlKAotamF2YS5sYW5nLlN0cmluZwotaW50W10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCBleGVjdXRlVXBkYXRlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZ1tdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnNxbC5Db25uZWN0aW9uIGdldENvbm5lY3Rpb24oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0RmV0Y2hEaXJlY3Rpb24oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0RmV0Y2hTaXplKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zcWwuUmVzdWx0U2V0IGdldEdlbmVyYXRlZEtleXMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0TWF4RmllbGRTaXplKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldE1heFJvd3MoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGdldE1vcmVSZXN1bHRzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBnZXRNb3JlUmVzdWx0cygKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldFF1ZXJ5VGltZW91dCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEuc3FsLlJlc3VsdFNldCBnZXRSZXN1bHRTZXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0UmVzdWx0U2V0Q29uY3VycmVuY3koKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0UmVzdWx0U2V0SG9sZGFiaWxpdHkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0UmVzdWx0U2V0VHlwZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCBnZXRVcGRhdGVDb3VudCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEuc3FsLlNRTFdhcm5pbmcgZ2V0V2FybmluZ3MoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEN1cnNvck5hbWUoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEVzY2FwZVByb2Nlc3NpbmcoCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEZldGNoRGlyZWN0aW9uKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEZldGNoU2l6ZSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRNYXhGaWVsZFNpemUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0TWF4Um93cygKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRRdWVyeVRpbWVvdXQoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgU1FMaXRlLkpEQkMyeS5KREJDU3RhdGVtZW50IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc3FsLlN0YXRlbWVudAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQXJyYXlMaXN0PExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXByaXZhdGUgamF2YS51dGlsLkFycmF5TGlzdCBiYXRjaAotCi1wcm90ZWN0ZWQgU1FMaXRlLkpEQkMyeS5KREJDQ29ubmVjdGlvbiBjb25uCi0KLXByb3RlY3RlZCBTUUxpdGUuSkRCQzJ5LkpEQkNSZXN1bHRTZXQgcnMKLQotcHJvdGVjdGVkIGludCB1cGRjbnQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1TUUxpdGUuSkRCQzJ5LkpEQkNDb25uZWN0aW9uKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGFkZEJhdGNoKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjYW5jZWwoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNsZWFyQmF0Y2goKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNsZWFyV2FybmluZ3MoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNsb3NlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBleGVjdXRlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBleGVjdXRlKAotamF2YS5sYW5nLlN0cmluZwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIGV4ZWN1dGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnRbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBleGVjdXRlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZ1tdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBpbnRbXSBleGVjdXRlQmF0Y2goKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnNxbC5SZXN1bHRTZXQgZXhlY3V0ZVF1ZXJ5KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi0gamF2YS5zcWwuUmVzdWx0U2V0IGV4ZWN1dGVRdWVyeSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmdbXQotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGV4ZWN1dGVVcGRhdGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgZXhlY3V0ZVVwZGF0ZSgKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGV4ZWN1dGVVcGRhdGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnRbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGV4ZWN1dGVVcGRhdGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuc3FsLkNvbm5lY3Rpb24gZ2V0Q29ubmVjdGlvbigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXRGZXRjaERpcmVjdGlvbigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXRGZXRjaFNpemUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnNxbC5SZXN1bHRTZXQgZ2V0R2VuZXJhdGVkS2V5cygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXRNYXhGaWVsZFNpemUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgZ2V0TWF4Um93cygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gZ2V0TW9yZVJlc3VsdHMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIGdldE1vcmVSZXN1bHRzKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgZ2V0UXVlcnlUaW1lb3V0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zcWwuUmVzdWx0U2V0IGdldFJlc3VsdFNldCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXRSZXN1bHRTZXRDb25jdXJyZW5jeSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXRSZXN1bHRTZXRIb2xkYWJpbGl0eSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXRSZXN1bHRTZXRUeXBlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGdldFVwZGF0ZUNvdW50KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zcWwuU1FMV2FybmluZyBnZXRXYXJuaW5ncygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0Q3Vyc29yTmFtZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0RXNjYXBlUHJvY2Vzc2luZygKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0RmV0Y2hEaXJlY3Rpb24oCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0RmV0Y2hTaXplKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldE1heEZpZWxkU2l6ZSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRNYXhSb3dzKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldFF1ZXJ5VGltZW91dCgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgamF2YS5zcWwuUHJlcGFyZWRTdGF0ZW1lbnQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zcWwuU3RhdGVtZW50Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBhZGRCYXRjaCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgY2xlYXJQYXJhbWV0ZXJzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBleGVjdXRlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zcWwuUmVzdWx0U2V0IGV4ZWN1dGVRdWVyeSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCBleGVjdXRlVXBkYXRlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zcWwuUmVzdWx0U2V0TWV0YURhdGEgZ2V0TWV0YURhdGEoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnNxbC5QYXJhbWV0ZXJNZXRhRGF0YSBnZXRQYXJhbWV0ZXJNZXRhRGF0YSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0QXJyYXkoCi1pbnQKLWphdmEuc3FsLkFycmF5KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEFzY2lpU3RyZWFtKAotaW50Ci1qYXZhLmlvLklucHV0U3RyZWFtCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0QmlnRGVjaW1hbCgKLWludAotamF2YS5tYXRoLkJpZ0RlY2ltYWwpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0QmluYXJ5U3RyZWFtKAotaW50Ci1qYXZhLmlvLklucHV0U3RyZWFtCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0QmxvYigKLWludAotamF2YS5zcWwuQmxvYikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRCb29sZWFuKAotaW50Ci1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEJ5dGUoCi1pbnQKLWJ5dGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0Qnl0ZXMoCi1pbnQKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRDaGFyYWN0ZXJTdHJlYW0oCi1pbnQKLWphdmEuaW8uUmVhZGVyCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0Q2xvYigKLWludAotamF2YS5zcWwuQ2xvYikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXREYXRlKAotaW50Ci1qYXZhLnNxbC5EYXRlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldERhdGUoCi1pbnQKLWphdmEuc3FsLkRhdGUKLWphdmEudXRpbC5DYWxlbmRhcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXREb3VibGUoCi1pbnQKLWRvdWJsZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRGbG9hdCgKLWludAotZmxvYXQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0SW50KAotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0TG9uZygKLWludAotbG9uZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXROdWxsKAotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0TnVsbCgKLWludAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldE9iamVjdCgKLWludAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRPYmplY3QoCi1pbnQKLWphdmEubGFuZy5PYmplY3QKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRPYmplY3QoCi1pbnQKLWphdmEubGFuZy5PYmplY3QKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFJlZigKLWludAotamF2YS5zcWwuUmVmKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFNob3J0KAotaW50Ci1zaG9ydCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRTdHJpbmcoCi1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0VGltZSgKLWludAotamF2YS5zcWwuVGltZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRUaW1lKAotaW50Ci1qYXZhLnNxbC5UaW1lCi1qYXZhLnV0aWwuQ2FsZW5kYXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0VGltZXN0YW1wKAotaW50Ci1qYXZhLnNxbC5UaW1lc3RhbXApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0VGltZXN0YW1wKAotaW50Ci1qYXZhLnNxbC5UaW1lc3RhbXAKLWphdmEudXRpbC5DYWxlbmRhcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRVUkwoCi1pbnQKLWphdmEubmV0LlVSTCkKLUBqYXZhLmxhbmcuRGVwcmVjYXRlZAotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFVuaWNvZGVTdHJlYW0oCi1pbnQKLWphdmEuaW8uSW5wdXRTdHJlYW0KLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBTUUxpdGUuSkRCQzJ5LkpEQkNQcmVwYXJlZFN0YXRlbWVudCBleHRlbmRzIFNRTGl0ZS5KREJDMnkuSkRCQ1N0YXRlbWVudCBpbXBsZW1lbnRzIGphdmEuc3FsLlByZXBhcmVkU3RhdGVtZW50Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gbnVsbHJlcGwKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nW10gYXJncwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQXJyYXlMaXN0PExTUUxpdGUvSkRCQzJ5L0JhdGNoQXJnOz47ICkKLXByaXZhdGUgamF2YS51dGlsLkFycmF5TGlzdCBiYXRjaAotCi1wcml2YXRlIGJvb2xlYW5bXSBibG9icwotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgc3FsCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1TUUxpdGUuSkRCQzJ5LkpEQkNDb25uZWN0aW9uCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZml4dXAoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZml4dXAyKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBhZGRCYXRjaCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY2xlYXJCYXRjaCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY2xlYXJQYXJhbWV0ZXJzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBleGVjdXRlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50W10gZXhlY3V0ZUJhdGNoKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zcWwuUmVzdWx0U2V0IGV4ZWN1dGVRdWVyeSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGludCBleGVjdXRlVXBkYXRlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zcWwuQXJyYXkgZ2V0QXJyYXkoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuc3FsLkFycmF5IGdldEFycmF5KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0RlY2ltYWwgZ2V0QmlnRGVjaW1hbCgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuc3FsLkJsb2IgZ2V0QmxvYigKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zcWwuQmxvYiBnZXRCbG9iKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYnl0ZSBnZXRCeXRlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYnl0ZVtdIGdldEJ5dGVzKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zcWwuQ2xvYiBnZXRDbG9iKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnNxbC5DbG9iIGdldENsb2IoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnNxbC5EYXRlIGdldERhdGUoCi1pbnQKLWphdmEudXRpbC5DYWxlbmRhcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zcWwuRGF0ZSBnZXREYXRlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zcWwuRGF0ZSBnZXREYXRlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS51dGlsLkNhbGVuZGFyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBkb3VibGUgZ2V0RG91YmxlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgZmxvYXQgZ2V0RmxvYXQoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgZ2V0SW50KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgbG9uZyBnZXRMb25nKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zcWwuUmVzdWx0U2V0TWV0YURhdGEgZ2V0TWV0YURhdGEoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldE9iamVjdCgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRPYmplY3QoCi1pbnQKLWphdmEudXRpbC5NYXApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0T2JqZWN0KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRPYmplY3QoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnV0aWwuTWFwKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnNxbC5QYXJhbWV0ZXJNZXRhRGF0YSBnZXRQYXJhbWV0ZXJNZXRhRGF0YSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuc3FsLlJlZiBnZXRSZWYoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuc3FsLlJlZiBnZXRSZWYoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBzaG9ydCBnZXRTaG9ydCgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zcWwuVGltZSBnZXRUaW1lKAotaW50Ci1qYXZhLnV0aWwuQ2FsZW5kYXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuc3FsLlRpbWUgZ2V0VGltZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuc3FsLlRpbWUgZ2V0VGltZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudXRpbC5DYWxlbmRhcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zcWwuVGltZXN0YW1wIGdldFRpbWVzdGFtcCgKLWludAotamF2YS51dGlsLkNhbGVuZGFyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnNxbC5UaW1lc3RhbXAgZ2V0VGltZXN0YW1wKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zcWwuVGltZXN0YW1wIGdldFRpbWVzdGFtcCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudXRpbC5DYWxlbmRhcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5uZXQuVVJMIGdldFVSTCgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5uZXQuVVJMIGdldFVSTCgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcmVnaXN0ZXJPdXRwdXRQYXJhbWV0ZXIoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcmVnaXN0ZXJPdXRwdXRQYXJhbWV0ZXIoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCByZWdpc3Rlck91dHB1dFBhcmFtZXRlcigKLWphdmEubGFuZy5TdHJpbmcKLWludAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRBcnJheSgKLWludAotamF2YS5zcWwuQXJyYXkpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0QXNjaWlTdHJlYW0oCi1pbnQKLWphdmEuaW8uSW5wdXRTdHJlYW0KLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRBc2NpaVN0cmVhbSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEuaW8uSW5wdXRTdHJlYW0KLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRCaWdEZWNpbWFsKAotaW50Ci1qYXZhLm1hdGguQmlnRGVjaW1hbCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRCaWdEZWNpbWFsKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5tYXRoLkJpZ0RlY2ltYWwpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0QmluYXJ5U3RyZWFtKAotaW50Ci1qYXZhLmlvLklucHV0U3RyZWFtCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0QmluYXJ5U3RyZWFtKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5pby5JbnB1dFN0cmVhbQotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldEJsb2IoCi1pbnQKLWphdmEuc3FsLkJsb2IpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0Qm9vbGVhbigKLWludAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRCb29sZWFuKAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRCeXRlKAotaW50Ci1ieXRlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldEJ5dGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1ieXRlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldEJ5dGVzKAotaW50Ci1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0Qnl0ZXMoCi1qYXZhLmxhbmcuU3RyaW5nCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0Q2hhcmFjdGVyU3RyZWFtKAotaW50Ci1qYXZhLmlvLlJlYWRlcgotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldENoYXJhY3RlclN0cmVhbSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEuaW8uUmVhZGVyCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0Q2xvYigKLWludAotamF2YS5zcWwuQ2xvYikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXREYXRlKAotaW50Ci1qYXZhLnNxbC5EYXRlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldERhdGUoCi1pbnQKLWphdmEuc3FsLkRhdGUKLWphdmEudXRpbC5DYWxlbmRhcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXREYXRlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5zcWwuRGF0ZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXREYXRlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5zcWwuRGF0ZQotamF2YS51dGlsLkNhbGVuZGFyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldERvdWJsZSgKLWludAotZG91YmxlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldERvdWJsZSgKLWphdmEubGFuZy5TdHJpbmcKLWRvdWJsZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRGbG9hdCgKLWludAotZmxvYXQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0RmxvYXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1mbG9hdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRJbnQoCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRJbnQoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0TG9uZygKLWludAotbG9uZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRMb25nKAotamF2YS5sYW5nLlN0cmluZwotbG9uZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXROdWxsKAotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0TnVsbCgKLWludAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldE51bGwoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0TnVsbCgKLWphdmEubGFuZy5TdHJpbmcKLWludAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRPYmplY3QoCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0T2JqZWN0KAotaW50Ci1qYXZhLmxhbmcuT2JqZWN0Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0T2JqZWN0KAotaW50Ci1qYXZhLmxhbmcuT2JqZWN0Ci1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRPYmplY3QoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldE9iamVjdCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3QKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRPYmplY3QoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0Ci1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRSZWYoCi1pbnQKLWphdmEuc3FsLlJlZikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRTaG9ydCgKLWludAotc2hvcnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0U2hvcnQoCi1qYXZhLmxhbmcuU3RyaW5nCi1zaG9ydCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRTdHJpbmcoCi1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0U3RyaW5nKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRUaW1lKAotaW50Ci1qYXZhLnNxbC5UaW1lKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldFRpbWUoCi1pbnQKLWphdmEuc3FsLlRpbWUKLWphdmEudXRpbC5DYWxlbmRhcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRUaW1lKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5zcWwuVGltZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRUaW1lKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5zcWwuVGltZQotamF2YS51dGlsLkNhbGVuZGFyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldFRpbWVzdGFtcCgKLWludAotamF2YS5zcWwuVGltZXN0YW1wKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldFRpbWVzdGFtcCgKLWludAotamF2YS5zcWwuVGltZXN0YW1wCi1qYXZhLnV0aWwuQ2FsZW5kYXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0VGltZXN0YW1wKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5zcWwuVGltZXN0YW1wKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldFRpbWVzdGFtcCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEuc3FsLlRpbWVzdGFtcAotamF2YS51dGlsLkNhbGVuZGFyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldFVSTCgKLWludAotamF2YS5uZXQuVVJMKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLUBqYXZhLmxhbmcuRGVwcmVjYXRlZAotcHVibGljIHZvaWQgc2V0VW5pY29kZVN0cmVhbSgKLWludAotamF2YS5pby5JbnB1dFN0cmVhbQotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZhLnNxbC5SZXN1bHRTZXQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMT1NFX0NVUlNPUlNfQVRfQ09NTUlUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTkNVUl9SRUFEX09OTFkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OQ1VSX1VQREFUQUJMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGRVRDSF9GT1JXQVJECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZFVENIX1JFVkVSU0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkVUQ0hfVU5LTk9XTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBIT0xEX0NVUlNPUlNfT1ZFUl9DT01NSVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9GT1JXQVJEX09OTFkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9TQ1JPTExfSU5TRU5TSVRJVkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9TQ1JPTExfU0VOU0lUSVZFCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBhYnNvbHV0ZSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBhZnRlckxhc3QoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGJlZm9yZUZpcnN0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBjYW5jZWxSb3dVcGRhdGVzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBjbGVhcldhcm5pbmdzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBjbG9zZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgZGVsZXRlUm93KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGZpbmRDb2x1bW4oCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGZpcnN0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zcWwuQXJyYXkgZ2V0QXJyYXkoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEuc3FsLkFycmF5IGdldEFycmF5KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5pby5JbnB1dFN0cmVhbSBnZXRBc2NpaVN0cmVhbSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5pby5JbnB1dFN0cmVhbSBnZXRBc2NpaVN0cmVhbSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubWF0aC5CaWdEZWNpbWFsIGdldEJpZ0RlY2ltYWwoCi1pbnQpCi1AamF2YS5sYW5nLkRlcHJlY2F0ZWQKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5tYXRoLkJpZ0RlY2ltYWwgZ2V0QmlnRGVjaW1hbCgKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm1hdGguQmlnRGVjaW1hbCBnZXRCaWdEZWNpbWFsKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1AamF2YS5sYW5nLkRlcHJlY2F0ZWQKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm1hdGguQmlnRGVjaW1hbCBnZXRCaWdEZWNpbWFsKAotamF2YS5sYW5nLlN0cmluZwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmlvLklucHV0U3RyZWFtIGdldEJpbmFyeVN0cmVhbSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5pby5JbnB1dFN0cmVhbSBnZXRCaW5hcnlTdHJlYW0oCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnNxbC5CbG9iIGdldEJsb2IoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEuc3FsLkJsb2IgZ2V0QmxvYigKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZ2V0Qm9vbGVhbigKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBnZXRCb29sZWFuKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYnl0ZSBnZXRCeXRlKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBieXRlIGdldEJ5dGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBieXRlW10gZ2V0Qnl0ZXMoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJ5dGVbXSBnZXRCeXRlcygKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEuaW8uUmVhZGVyIGdldENoYXJhY3RlclN0cmVhbSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5pby5SZWFkZXIgZ2V0Q2hhcmFjdGVyU3RyZWFtKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zcWwuQ2xvYiBnZXRDbG9iKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnNxbC5DbG9iIGdldENsb2IoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0Q29uY3VycmVuY3koKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldEN1cnNvck5hbWUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnNxbC5EYXRlIGdldERhdGUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEuc3FsLkRhdGUgZ2V0RGF0ZSgKLWludAotamF2YS51dGlsLkNhbGVuZGFyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnNxbC5EYXRlIGdldERhdGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnNxbC5EYXRlIGdldERhdGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnV0aWwuQ2FsZW5kYXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGRvdWJsZSBnZXREb3VibGUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGRvdWJsZSBnZXREb3VibGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0RmV0Y2hEaXJlY3Rpb24oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0RmV0Y2hTaXplKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgZmxvYXQgZ2V0RmxvYXQoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGZsb2F0IGdldEZsb2F0KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldEludCgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldEludCgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGxvbmcgZ2V0TG9uZygKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgbG9uZyBnZXRMb25nKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zcWwuUmVzdWx0U2V0TWV0YURhdGEgZ2V0TWV0YURhdGEoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuT2JqZWN0IGdldE9iamVjdCgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KElMamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL0NsYXNzPCo+Oz47KUxqYXZhL2xhbmcvT2JqZWN0OyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLk9iamVjdCBnZXRPYmplY3QoCi1pbnQKLWphdmEudXRpbC5NYXApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5PYmplY3QgZ2V0T2JqZWN0KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9DbGFzczwqPjs+OylMamF2YS9sYW5nL09iamVjdDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuT2JqZWN0IGdldE9iamVjdCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudXRpbC5NYXApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEuc3FsLlJlZiBnZXRSZWYoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEuc3FsLlJlZiBnZXRSZWYoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0Um93KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgc2hvcnQgZ2V0U2hvcnQoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHNob3J0IGdldFNob3J0KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zcWwuU3RhdGVtZW50IGdldFN0YXRlbWVudCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEuc3FsLlRpbWUgZ2V0VGltZSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zcWwuVGltZSBnZXRUaW1lKAotaW50Ci1qYXZhLnV0aWwuQ2FsZW5kYXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEuc3FsLlRpbWUgZ2V0VGltZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEuc3FsLlRpbWUgZ2V0VGltZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudXRpbC5DYWxlbmRhcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zcWwuVGltZXN0YW1wIGdldFRpbWVzdGFtcCgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zcWwuVGltZXN0YW1wIGdldFRpbWVzdGFtcCgKLWludAotamF2YS51dGlsLkNhbGVuZGFyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnNxbC5UaW1lc3RhbXAgZ2V0VGltZXN0YW1wKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zcWwuVGltZXN0YW1wIGdldFRpbWVzdGFtcCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudXRpbC5DYWxlbmRhcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldFR5cGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm5ldC5VUkwgZ2V0VVJMKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm5ldC5VUkwgZ2V0VVJMKAotamF2YS5sYW5nLlN0cmluZykKLUBqYXZhLmxhbmcuRGVwcmVjYXRlZAotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmlvLklucHV0U3RyZWFtIGdldFVuaWNvZGVTdHJlYW0oCi1pbnQpCi1AamF2YS5sYW5nLkRlcHJlY2F0ZWQKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5pby5JbnB1dFN0cmVhbSBnZXRVbmljb2RlU3RyZWFtKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zcWwuU1FMV2FybmluZyBnZXRXYXJuaW5ncygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgaW5zZXJ0Um93KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0FmdGVyTGFzdCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNCZWZvcmVGaXJzdCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNGaXJzdCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNMYXN0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBsYXN0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBtb3ZlVG9DdXJyZW50Um93KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBtb3ZlVG9JbnNlcnRSb3coKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIG5leHQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHByZXZpb3VzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCByZWZyZXNoUm93KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiByZWxhdGl2ZSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiByb3dEZWxldGVkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiByb3dJbnNlcnRlZCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gcm93VXBkYXRlZCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RmV0Y2hEaXJlY3Rpb24oCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RmV0Y2hTaXplKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHVwZGF0ZUFycmF5KAotaW50Ci1qYXZhLnNxbC5BcnJheSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB1cGRhdGVBcnJheSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEuc3FsLkFycmF5KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHVwZGF0ZUFzY2lpU3RyZWFtKAotaW50Ci1qYXZhLmlvLklucHV0U3RyZWFtCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgdXBkYXRlQXNjaWlTdHJlYW0oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmlvLklucHV0U3RyZWFtCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgdXBkYXRlQmlnRGVjaW1hbCgKLWludAotamF2YS5tYXRoLkJpZ0RlY2ltYWwpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgdXBkYXRlQmlnRGVjaW1hbCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubWF0aC5CaWdEZWNpbWFsKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHVwZGF0ZUJpbmFyeVN0cmVhbSgKLWludAotamF2YS5pby5JbnB1dFN0cmVhbQotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHVwZGF0ZUJpbmFyeVN0cmVhbSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEuaW8uSW5wdXRTdHJlYW0KLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB1cGRhdGVCbG9iKAotaW50Ci1qYXZhLnNxbC5CbG9iKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHVwZGF0ZUJsb2IoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnNxbC5CbG9iKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHVwZGF0ZUJvb2xlYW4oCi1pbnQKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgdXBkYXRlQm9vbGVhbigKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgdXBkYXRlQnl0ZSgKLWludAotYnl0ZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB1cGRhdGVCeXRlKAotamF2YS5sYW5nLlN0cmluZwotYnl0ZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB1cGRhdGVCeXRlcygKLWludAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHVwZGF0ZUJ5dGVzKAotamF2YS5sYW5nLlN0cmluZwotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHVwZGF0ZUNoYXJhY3RlclN0cmVhbSgKLWludAotamF2YS5pby5SZWFkZXIKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB1cGRhdGVDaGFyYWN0ZXJTdHJlYW0oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmlvLlJlYWRlcgotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHVwZGF0ZUNsb2IoCi1pbnQKLWphdmEuc3FsLkNsb2IpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgdXBkYXRlQ2xvYigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEuc3FsLkNsb2IpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgdXBkYXRlRGF0ZSgKLWludAotamF2YS5zcWwuRGF0ZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB1cGRhdGVEYXRlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5zcWwuRGF0ZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB1cGRhdGVEb3VibGUoCi1pbnQKLWRvdWJsZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB1cGRhdGVEb3VibGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1kb3VibGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgdXBkYXRlRmxvYXQoCi1pbnQKLWZsb2F0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHVwZGF0ZUZsb2F0KAotamF2YS5sYW5nLlN0cmluZwotZmxvYXQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgdXBkYXRlSW50KAotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgdXBkYXRlSW50KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHVwZGF0ZUxvbmcoCi1pbnQKLWxvbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgdXBkYXRlTG9uZygKLWphdmEubGFuZy5TdHJpbmcKLWxvbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgdXBkYXRlTnVsbCgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB1cGRhdGVOdWxsKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB1cGRhdGVPYmplY3QoCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgdXBkYXRlT2JqZWN0KAotaW50Ci1qYXZhLmxhbmcuT2JqZWN0Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgdXBkYXRlT2JqZWN0KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB1cGRhdGVPYmplY3QoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgdXBkYXRlUmVmKAotaW50Ci1qYXZhLnNxbC5SZWYpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgdXBkYXRlUmVmKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5zcWwuUmVmKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHVwZGF0ZVJvdygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgdXBkYXRlU2hvcnQoCi1pbnQKLXNob3J0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHVwZGF0ZVNob3J0KAotamF2YS5sYW5nLlN0cmluZwotc2hvcnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgdXBkYXRlU3RyaW5nKAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHVwZGF0ZVN0cmluZygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgdXBkYXRlVGltZSgKLWludAotamF2YS5zcWwuVGltZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB1cGRhdGVUaW1lKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5zcWwuVGltZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB1cGRhdGVUaW1lc3RhbXAoCi1pbnQKLWphdmEuc3FsLlRpbWVzdGFtcCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB1cGRhdGVUaW1lc3RhbXAoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnNxbC5UaW1lc3RhbXApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gd2FzTnVsbCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgU1FMaXRlLkpEQkMyeS5KREJDUmVzdWx0U2V0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc3FsLlJlc3VsdFNldAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbGFzdGcKLQotcHJpdmF0ZSBTUUxpdGUuSkRCQzJ5LkpEQkNSZXN1bHRTZXRNZXRhRGF0YSBtCi0KLXByaXZhdGUgaW50IHJvdwotCi1wcml2YXRlIFNRTGl0ZS5KREJDMnkuSkRCQ1N0YXRlbWVudCBzCi0KLXByb3RlY3RlZCBTUUxpdGUuVGFibGVSZXN1bHQgdHIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1TUUxpdGUuVGFibGVSZXN1bHQKLVNRTGl0ZS5KREJDMnkuSkRCQ1N0YXRlbWVudCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wcml2YXRlIGphdmEuc3FsLkRhdGUgaW50ZXJuYWxHZXREYXRlKAotaW50Ci1qYXZhLnV0aWwuQ2FsZW5kYXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSBqYXZhLmxhbmcuRG91YmxlIGludGVybmFsR2V0RG91YmxlKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXByaXZhdGUgamF2YS5sYW5nLkZsb2F0IGludGVybmFsR2V0RmxvYXQoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSBqYXZhLmxhbmcuSW50ZWdlciBpbnRlcm5hbEdldEludCgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wcml2YXRlIGphdmEubGFuZy5Mb25nIGludGVybmFsR2V0TG9uZygKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wcml2YXRlIGphdmEubGFuZy5TaG9ydCBpbnRlcm5hbEdldFNob3J0KAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXByaXZhdGUgamF2YS5zcWwuVGltZSBpbnRlcm5hbEdldFRpbWUoCi1pbnQKLWphdmEudXRpbC5DYWxlbmRhcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wcml2YXRlIGphdmEuc3FsLlRpbWVzdGFtcCBpbnRlcm5hbEdldFRpbWVzdGFtcCgKLWludAotamF2YS51dGlsLkNhbGVuZGFyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIGFic29sdXRlKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGFmdGVyTGFzdCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgYmVmb3JlRmlyc3QoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNhbmNlbFJvd1VwZGF0ZXMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNsZWFyV2FybmluZ3MoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNsb3NlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBkZWxldGVSb3coKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgZmluZENvbHVtbigKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gZmlyc3QoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnNxbC5BcnJheSBnZXRBcnJheSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zcWwuQXJyYXkgZ2V0QXJyYXkoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmlvLklucHV0U3RyZWFtIGdldEFzY2lpU3RyZWFtKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmlvLklucHV0U3RyZWFtIGdldEFzY2lpU3RyZWFtKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0RlY2ltYWwgZ2V0QmlnRGVjaW1hbCgKLWludCkKLUBqYXZhLmxhbmcuRGVwcmVjYXRlZAotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLm1hdGguQmlnRGVjaW1hbCBnZXRCaWdEZWNpbWFsKAotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubWF0aC5CaWdEZWNpbWFsIGdldEJpZ0RlY2ltYWwoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGphdmEubGFuZy5EZXByZWNhdGVkCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubWF0aC5CaWdEZWNpbWFsIGdldEJpZ0RlY2ltYWwoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuaW8uSW5wdXRTdHJlYW0gZ2V0QmluYXJ5U3RyZWFtKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmlvLklucHV0U3RyZWFtIGdldEJpbmFyeVN0cmVhbSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuc3FsLkJsb2IgZ2V0QmxvYigKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zcWwuQmxvYiBnZXRCbG9iKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIGdldEJvb2xlYW4oCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBieXRlIGdldEJ5dGUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGJ5dGUgZ2V0Qnl0ZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGJ5dGVbXSBnZXRCeXRlcygKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYnl0ZVtdIGdldEJ5dGVzKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5pby5SZWFkZXIgZ2V0Q2hhcmFjdGVyU3RyZWFtKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmlvLlJlYWRlciBnZXRDaGFyYWN0ZXJTdHJlYW0oCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnNxbC5DbG9iIGdldENsb2IoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuc3FsLkNsb2IgZ2V0Q2xvYigKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXRDb25jdXJyZW5jeSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Q3Vyc29yTmFtZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuc3FsLkRhdGUgZ2V0RGF0ZSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zcWwuRGF0ZSBnZXREYXRlKAotaW50Ci1qYXZhLnV0aWwuQ2FsZW5kYXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuc3FsLkRhdGUgZ2V0RGF0ZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuc3FsLkRhdGUgZ2V0RGF0ZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudXRpbC5DYWxlbmRhcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgZG91YmxlIGdldERvdWJsZSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgZG91YmxlIGdldERvdWJsZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXRGZXRjaERpcmVjdGlvbigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXRGZXRjaFNpemUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBmbG9hdCBnZXRGbG9hdCgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgZmxvYXQgZ2V0RmxvYXQoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgZ2V0SW50KAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgZ2V0SW50KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgbG9uZyBnZXRMb25nKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBsb25nIGdldExvbmcoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnNxbC5SZXN1bHRTZXRNZXRhRGF0YSBnZXRNZXRhRGF0YSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0T2JqZWN0KAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldE9iamVjdCgKLWludAotamF2YS51dGlsLk1hcCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRPYmplY3QoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldE9iamVjdCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudXRpbC5NYXApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuc3FsLlJlZiBnZXRSZWYoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuc3FsLlJlZiBnZXRSZWYoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgZ2V0Um93KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgc2hvcnQgZ2V0U2hvcnQoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIHNob3J0IGdldFNob3J0KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zcWwuU3RhdGVtZW50IGdldFN0YXRlbWVudCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuc3FsLlRpbWUgZ2V0VGltZSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zcWwuVGltZSBnZXRUaW1lKAotaW50Ci1qYXZhLnV0aWwuQ2FsZW5kYXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuc3FsLlRpbWUgZ2V0VGltZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuc3FsLlRpbWUgZ2V0VGltZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudXRpbC5DYWxlbmRhcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zcWwuVGltZXN0YW1wIGdldFRpbWVzdGFtcCgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zcWwuVGltZXN0YW1wIGdldFRpbWVzdGFtcCgKLWludAotamF2YS51dGlsLkNhbGVuZGFyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnNxbC5UaW1lc3RhbXAgZ2V0VGltZXN0YW1wKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zcWwuVGltZXN0YW1wIGdldFRpbWVzdGFtcCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudXRpbC5DYWxlbmRhcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGdldFR5cGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLm5ldC5VUkwgZ2V0VVJMKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLm5ldC5VUkwgZ2V0VVJMKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1AamF2YS5sYW5nLkRlcHJlY2F0ZWQKLXB1YmxpYyBqYXZhLmlvLklucHV0U3RyZWFtIGdldFVuaWNvZGVTdHJlYW0oCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotQGphdmEubGFuZy5EZXByZWNhdGVkCi1wdWJsaWMgamF2YS5pby5JbnB1dFN0cmVhbSBnZXRVbmljb2RlU3RyZWFtKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zcWwuU1FMV2FybmluZyBnZXRXYXJuaW5ncygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgaW5zZXJ0Um93KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBpc0FmdGVyTGFzdCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gaXNCZWZvcmVGaXJzdCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gaXNGaXJzdCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gaXNMYXN0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBsYXN0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBtb3ZlVG9DdXJyZW50Um93KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBtb3ZlVG9JbnNlcnRSb3coKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIG5leHQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIHByZXZpb3VzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCByZWZyZXNoUm93KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiByZWxhdGl2ZSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiByb3dEZWxldGVkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiByb3dJbnNlcnRlZCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gcm93VXBkYXRlZCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0RmV0Y2hEaXJlY3Rpb24oCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0RmV0Y2hTaXplKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHVwZGF0ZUFycmF5KAotaW50Ci1qYXZhLnNxbC5BcnJheSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB1cGRhdGVBcnJheSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEuc3FsLkFycmF5KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHVwZGF0ZUFzY2lpU3RyZWFtKAotaW50Ci1qYXZhLmlvLklucHV0U3RyZWFtCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgdXBkYXRlQXNjaWlTdHJlYW0oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmlvLklucHV0U3RyZWFtCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgdXBkYXRlQmlnRGVjaW1hbCgKLWludAotamF2YS5tYXRoLkJpZ0RlY2ltYWwpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgdXBkYXRlQmlnRGVjaW1hbCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubWF0aC5CaWdEZWNpbWFsKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHVwZGF0ZUJpbmFyeVN0cmVhbSgKLWludAotamF2YS5pby5JbnB1dFN0cmVhbQotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHVwZGF0ZUJpbmFyeVN0cmVhbSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEuaW8uSW5wdXRTdHJlYW0KLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB1cGRhdGVCbG9iKAotaW50Ci1qYXZhLnNxbC5CbG9iKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHVwZGF0ZUJsb2IoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnNxbC5CbG9iKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHVwZGF0ZUJvb2xlYW4oCi1pbnQKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgdXBkYXRlQm9vbGVhbigKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgdXBkYXRlQnl0ZSgKLWludAotYnl0ZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB1cGRhdGVCeXRlKAotamF2YS5sYW5nLlN0cmluZwotYnl0ZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB1cGRhdGVCeXRlcygKLWludAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHVwZGF0ZUJ5dGVzKAotamF2YS5sYW5nLlN0cmluZwotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHVwZGF0ZUNoYXJhY3RlclN0cmVhbSgKLWludAotamF2YS5pby5SZWFkZXIKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB1cGRhdGVDaGFyYWN0ZXJTdHJlYW0oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmlvLlJlYWRlcgotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHVwZGF0ZUNsb2IoCi1pbnQKLWphdmEuc3FsLkNsb2IpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgdXBkYXRlQ2xvYigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEuc3FsLkNsb2IpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgdXBkYXRlRGF0ZSgKLWludAotamF2YS5zcWwuRGF0ZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB1cGRhdGVEYXRlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5zcWwuRGF0ZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB1cGRhdGVEb3VibGUoCi1pbnQKLWRvdWJsZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB1cGRhdGVEb3VibGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1kb3VibGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgdXBkYXRlRmxvYXQoCi1pbnQKLWZsb2F0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHVwZGF0ZUZsb2F0KAotamF2YS5sYW5nLlN0cmluZwotZmxvYXQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgdXBkYXRlSW50KAotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgdXBkYXRlSW50KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHVwZGF0ZUxvbmcoCi1pbnQKLWxvbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgdXBkYXRlTG9uZygKLWphdmEubGFuZy5TdHJpbmcKLWxvbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgdXBkYXRlTnVsbCgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB1cGRhdGVOdWxsKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB1cGRhdGVPYmplY3QoCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgdXBkYXRlT2JqZWN0KAotaW50Ci1qYXZhLmxhbmcuT2JqZWN0Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgdXBkYXRlT2JqZWN0KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB1cGRhdGVPYmplY3QoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgdXBkYXRlUmVmKAotaW50Ci1qYXZhLnNxbC5SZWYpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgdXBkYXRlUmVmKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5zcWwuUmVmKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHVwZGF0ZVJvdygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgdXBkYXRlU2hvcnQoCi1pbnQKLXNob3J0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHVwZGF0ZVNob3J0KAotamF2YS5sYW5nLlN0cmluZwotc2hvcnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgdXBkYXRlU3RyaW5nKAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHVwZGF0ZVN0cmluZygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgdXBkYXRlVGltZSgKLWludAotamF2YS5zcWwuVGltZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB1cGRhdGVUaW1lKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5zcWwuVGltZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB1cGRhdGVUaW1lc3RhbXAoCi1pbnQKLWphdmEuc3FsLlRpbWVzdGFtcCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB1cGRhdGVUaW1lc3RhbXAoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnNxbC5UaW1lc3RhbXApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gd2FzTnVsbCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEuc3FsLlJlc3VsdFNldE1ldGFEYXRhIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb2x1bW5Ob051bGxzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNvbHVtbk51bGxhYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNvbHVtbk51bGxhYmxlVW5rbm93bgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0Q2F0YWxvZ05hbWUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0Q29sdW1uQ2xhc3NOYW1lKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0Q29sdW1uQ291bnQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0Q29sdW1uRGlzcGxheVNpemUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0Q29sdW1uTGFiZWwoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0Q29sdW1uTmFtZSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldENvbHVtblR5cGUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0Q29sdW1uVHlwZU5hbWUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCBnZXRQcmVjaXNpb24oCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCBnZXRTY2FsZSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRTY2hlbWFOYW1lKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldFRhYmxlTmFtZSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0F1dG9JbmNyZW1lbnQoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzQ3VycmVuY3koCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNEZWZpbml0ZWx5V3JpdGFibGUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCBpc051bGxhYmxlKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzUmVhZE9ubHkoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNTZWFyY2hhYmxlKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzU2lnbmVkKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzV3JpdGFibGUoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgU1FMaXRlLkpEQkMyeS5KREJDUmVzdWx0U2V0TWV0YURhdGEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zcWwuUmVzdWx0U2V0TWV0YURhdGEKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBTUUxpdGUuSkRCQzJ5LkpEQkNSZXN1bHRTZXQgcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLVNRTGl0ZS5KREJDMnkuSkRCQ1Jlc3VsdFNldCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi0gaW50IGZpbmRDb2xCeU5hbWUoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldENhdGFsb2dOYW1lKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldENvbHVtbkNsYXNzTmFtZSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGdldENvbHVtbkNvdW50KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGdldENvbHVtbkRpc3BsYXlTaXplKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldENvbHVtbkxhYmVsKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldENvbHVtbk5hbWUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXRDb2x1bW5UeXBlKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldENvbHVtblR5cGVOYW1lKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgZ2V0UHJlY2lzaW9uKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgZ2V0U2NhbGUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U2NoZW1hTmFtZSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRUYWJsZU5hbWUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gaXNBdXRvSW5jcmVtZW50KAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBpc0N1cnJlbmN5KAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIGlzRGVmaW5pdGVseVdyaXRhYmxlKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgaXNOdWxsYWJsZSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIGlzU2VhcmNoYWJsZSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBpc1NpZ25lZCgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBpc1dyaXRhYmxlKAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIFNRTGl0ZS5UYWJsZVJlc3VsdCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBTUUxpdGUuQ2FsbGJhY2sKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBjb2x1bW4KLQotcHVibGljIGludCBuY29sdW1ucwotCi1wdWJsaWMgaW50IG5yb3dzCi0KLXB1YmxpYyBqYXZhLnV0aWwuVmVjdG9yIHJvd3MKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSB0eXBlcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIGNsZWFyKCkKLQotcHVibGljIHZvaWQgY29sdW1ucygKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotcHVibGljIGJvb2xlYW4gbmV3cm93KAotamF2YS5sYW5nLlN0cmluZ1tdKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLXB1YmxpYyB2b2lkIHR5cGVzKAotamF2YS5sYW5nLlN0cmluZ1tdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIFNRTGl0ZS5KREJDMnkuVGFibGVSZXN1bHRYIGV4dGVuZHMgU1FMaXRlLlRhYmxlUmVzdWx0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBpbnRbXSBzcWxfdHlwZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLVNRTGl0ZS5UYWJsZVJlc3VsdCkKLQotIHZvaWQgc3FsX3R5cGVzKAotaW50W10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEuc3FsLkRyaXZlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGFjY2VwdHNVUkwoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnNxbC5Db25uZWN0aW9uIGNvbm5lY3QoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnV0aWwuUHJvcGVydGllcykKLQotcHVibGljIGFic3RyYWN0IGludCBnZXRNYWpvclZlcnNpb24oKQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldE1pbm9yVmVyc2lvbigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEuc3FsLkRyaXZlclByb3BlcnR5SW5mb1tdIGdldFByb3BlcnR5SW5mbygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudXRpbC5Qcm9wZXJ0aWVzKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBqZGJjQ29tcGxpYW50KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBTUUxpdGUuSkRCQ0RyaXZlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnNxbC5Ecml2ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFKT1JWRVJTSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JTk9SVkVSU0lPTgotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvciBtYWtlQ29ubgotCi1wcm90ZWN0ZWQgamF2YS5zcWwuQ29ubmVjdGlvbiBjb25uCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIGFjY2VwdHNVUkwoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnNxbC5Db25uZWN0aW9uIGNvbm5lY3QoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnV0aWwuUHJvcGVydGllcykKLQotcHVibGljIGludCBnZXRNYWpvclZlcnNpb24oKQotCi1wdWJsaWMgaW50IGdldE1pbm9yVmVyc2lvbigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuc3FsLkRyaXZlclByb3BlcnR5SW5mb1tdIGdldFByb3BlcnR5SW5mbygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudXRpbC5Qcm9wZXJ0aWVzKQotCi1wdWJsaWMgYm9vbGVhbiBqZGJjQ29tcGxpYW50KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgU1FMaXRlLlByb2dyZXNzSGFuZGxlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBwcm9ncmVzcygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgU1FMaXRlLlNoZWxsIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIFNRTGl0ZS5DYWxsYmFjawotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgaW50IE1PREVfQ29sdW1uCi0KLXN0YXRpYyBmaW5hbCBpbnQgTU9ERV9IdG1sCi0KLXN0YXRpYyBmaW5hbCBpbnQgTU9ERV9JbnNlcnQKLQotc3RhdGljIGZpbmFsIGludCBNT0RFX0luc2VydDIKLQotc3RhdGljIGZpbmFsIGludCBNT0RFX0xpbmUKLQotc3RhdGljIGZpbmFsIGludCBNT0RFX0xpc3QKLQotc3RhdGljIGZpbmFsIGludCBNT0RFX1NlbWkKLQotIGphdmEubGFuZy5TdHJpbmdbXSBjb2xzCi0KLSBpbnRbXSBjb2x3aWR0aAotCi0gaW50IGNvdW50Ci0KLSBTUUxpdGUuRGF0YWJhc2UgZGIKLQotIGphdmEubGFuZy5TdHJpbmcgZGVzdFRhYmxlCi0KLSBib29sZWFuIGVjaG8KLQotIGphdmEuaW8uUHJpbnRXcml0ZXIgZXJyCi0KLSBpbnQgbW9kZQotCi0gamF2YS5pby5QcmludFdyaXRlciBwdwotCi0gamF2YS5sYW5nLlN0cmluZyBzZXAKLQotIGJvb2xlYW4gc2hvd0hlYWRlcgotCi0gamF2YS5sYW5nLlN0cmluZyB0YWJsZU5hbWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmlvLlByaW50U3RyZWFtCi1qYXZhLmlvLlByaW50U3RyZWFtKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmlvLlByaW50V3JpdGVyCi1qYXZhLmlvLlByaW50V3JpdGVyKQotCi1zdGF0aWMgamF2YS5sYW5nLlN0cmluZyBodG1sX3F1b3RlKAotamF2YS5sYW5nLlN0cmluZykKLQotc3RhdGljIGJvb2xlYW4gaXNfbnVtZXJpYygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKAotamF2YS5sYW5nLlN0cmluZ1tdKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgc3FsX3F1b3RlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIHNxbF9xdW90ZV9kYmwoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcm90ZWN0ZWQgamF2YS5sYW5nLk9iamVjdCBjbG9uZSgpCi0KLXB1YmxpYyB2b2lkIGNvbHVtbnMoCi1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLSB2b2lkIGRvX2NtZCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLSB2b2lkIGRvX2lucHV0KAotamF2YS5pby5CdWZmZXJlZFJlYWRlcikKLQotIHZvaWQgZG9fbWV0YSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBib29sZWFuIG5ld3JvdygKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotIGphdmEubGFuZy5TdHJpbmcgcmVhZF9saW5lKAotamF2YS5pby5CdWZmZXJlZFJlYWRlcgotamF2YS5sYW5nLlN0cmluZykKLQotIHZvaWQgc2V0X3RhYmxlX25hbWUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCB0eXBlcygKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBTUUxpdGUuU3RtdCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIGludCBlcnJvcl9jb2RlCi0KLXByaXZhdGUgbG9uZyBoYW5kbGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIGludGVybmFsX2luaXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxTUUxpdGUvRXhjZXB0aW9uOyApCi1wdWJsaWMgbmF0aXZlIHZvaWQgYmluZCgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MU1FMaXRlL0V4Y2VwdGlvbjsgKQotcHVibGljIG5hdGl2ZSB2b2lkIGJpbmQoCi1pbnQKLWRvdWJsZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MU1FMaXRlL0V4Y2VwdGlvbjsgKQotcHVibGljIG5hdGl2ZSB2b2lkIGJpbmQoCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MU1FMaXRlL0V4Y2VwdGlvbjsgKQotcHVibGljIG5hdGl2ZSB2b2lkIGJpbmQoCi1pbnQKLWxvbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TFNRTGl0ZS9FeGNlcHRpb247ICkKLXB1YmxpYyBuYXRpdmUgdm9pZCBiaW5kKAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxTUUxpdGUvRXhjZXB0aW9uOyApCi1wdWJsaWMgbmF0aXZlIHZvaWQgYmluZCgKLWludAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxTUUxpdGUvRXhjZXB0aW9uOyApCi1wdWJsaWMgbmF0aXZlIGludCBiaW5kX3BhcmFtZXRlcl9jb3VudCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TFNRTGl0ZS9FeGNlcHRpb247ICkKLXB1YmxpYyBuYXRpdmUgaW50IGJpbmRfcGFyYW1ldGVyX2luZGV4KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MU1FMaXRlL0V4Y2VwdGlvbjsgKQotcHVibGljIG5hdGl2ZSBqYXZhLmxhbmcuU3RyaW5nIGJpbmRfcGFyYW1ldGVyX25hbWUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TFNRTGl0ZS9FeGNlcHRpb247ICkKLXB1YmxpYyBuYXRpdmUgdm9pZCBiaW5kX3plcm9ibG9iKAotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TFNRTGl0ZS9FeGNlcHRpb247ICkKLXB1YmxpYyBuYXRpdmUgdm9pZCBjbGVhcl9iaW5kaW5ncygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TFNRTGl0ZS9FeGNlcHRpb247ICkKLXB1YmxpYyBuYXRpdmUgdm9pZCBjbG9zZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TFNRTGl0ZS9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGNvbHVtbigKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MU1FMaXRlL0V4Y2VwdGlvbjsgKQotcHVibGljIG5hdGl2ZSBieXRlW10gY29sdW1uX2J5dGVzKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxTUUxpdGUvRXhjZXB0aW9uOyApCi1wdWJsaWMgbmF0aXZlIGludCBjb2x1bW5fY291bnQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxTUUxpdGUvRXhjZXB0aW9uOyApCi1wdWJsaWMgbmF0aXZlIGphdmEubGFuZy5TdHJpbmcgY29sdW1uX2RhdGFiYXNlX25hbWUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TFNRTGl0ZS9FeGNlcHRpb247ICkKLXB1YmxpYyBuYXRpdmUgamF2YS5sYW5nLlN0cmluZyBjb2x1bW5fZGVjbHR5cGUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TFNRTGl0ZS9FeGNlcHRpb247ICkKLXB1YmxpYyBuYXRpdmUgZG91YmxlIGNvbHVtbl9kb3VibGUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TFNRTGl0ZS9FeGNlcHRpb247ICkKLXB1YmxpYyBuYXRpdmUgaW50IGNvbHVtbl9pbnQoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TFNRTGl0ZS9FeGNlcHRpb247ICkKLXB1YmxpYyBuYXRpdmUgbG9uZyBjb2x1bW5fbG9uZygKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MU1FMaXRlL0V4Y2VwdGlvbjsgKQotcHVibGljIG5hdGl2ZSBqYXZhLmxhbmcuU3RyaW5nIGNvbHVtbl9vcmlnaW5fbmFtZSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MU1FMaXRlL0V4Y2VwdGlvbjsgKQotcHVibGljIG5hdGl2ZSBqYXZhLmxhbmcuU3RyaW5nIGNvbHVtbl9zdHJpbmcoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TFNRTGl0ZS9FeGNlcHRpb247ICkKLXB1YmxpYyBuYXRpdmUgamF2YS5sYW5nLlN0cmluZyBjb2x1bW5fdGFibGVfbmFtZSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MU1FMaXRlL0V4Y2VwdGlvbjsgKQotcHVibGljIG5hdGl2ZSBpbnQgY29sdW1uX3R5cGUoCi1pbnQpCi0KLXByb3RlY3RlZCBuYXRpdmUgdm9pZCBmaW5hbGl6ZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TFNRTGl0ZS9FeGNlcHRpb247ICkKLXB1YmxpYyBuYXRpdmUgYm9vbGVhbiBwcmVwYXJlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MU1FMaXRlL0V4Y2VwdGlvbjsgKQotcHVibGljIG5hdGl2ZSB2b2lkIHJlc2V0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MU1FMaXRlL0V4Y2VwdGlvbjsgKQotcHVibGljIG5hdGl2ZSBib29sZWFuIHN0ZXAoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIFNRTGl0ZS5TdHJpbmdFbmNvZGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgY2hhcltdIHhkaWdpdHMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgc3RhdGljIGJ5dGVbXSBieXRlQ29weSgKLWJ5dGVbXQotaW50Ci1pbnQKLWJ5dGVbXSkKLQotcHVibGljIHN0YXRpYyBieXRlW10gZGVjb2RlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGVuY29kZSgKLWJ5dGVbXSkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGVuY29kZVgoCi1ieXRlW10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIFNRTGl0ZS5UcmFjZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB0cmFjZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgU1FMaXRlLlZtIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgaW50IGVycm9yX2NvZGUKLQotcHJpdmF0ZSBsb25nIGhhbmRsZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgaW50ZXJuYWxfaW5pdCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TFNRTGl0ZS9FeGNlcHRpb247ICkKLXB1YmxpYyBuYXRpdmUgYm9vbGVhbiBjb21waWxlKCkKLQotcHJvdGVjdGVkIG5hdGl2ZSB2b2lkIGZpbmFsaXplKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MU1FMaXRlL0V4Y2VwdGlvbjsgKQotcHVibGljIG5hdGl2ZSBib29sZWFuIHN0ZXAoCi1TUUxpdGUuQ2FsbGJhY2spCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TFNRTGl0ZS9FeGNlcHRpb247ICkKLXB1YmxpYyBuYXRpdmUgdm9pZCBzdG9wKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXREZWNvZGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRU5ECi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTFVTSAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5JVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT05HT0lORwotCi1wcml2YXRlIGZsb2F0IGF2ZXJDaGFycwotCi1wcml2YXRlIGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldCBjcwotCi1wcml2YXRlIGphdmEubmlvLmNoYXJzZXQuQ29kaW5nRXJyb3JBY3Rpb24gbWFsZm9ybUFjdGlvbgotCi1wcml2YXRlIGZsb2F0IG1heENoYXJzCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZXBsYWNlCi0KLXByaXZhdGUgaW50IHN0YXR1cwotCi1wcml2YXRlIGphdmEubmlvLmNoYXJzZXQuQ29kaW5nRXJyb3JBY3Rpb24gdW5tYXBBY3Rpb24KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oCi1qYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQKLWZsb2F0Ci1mbG9hdCkKLQotcHJpdmF0ZSBqYXZhLm5pby5DaGFyQnVmZmVyIGFsbG9jYXRlTW9yZSgKLWphdmEubmlvLkNoYXJCdWZmZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmlvL2NoYXJzZXQvQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgY2hlY2tDb2RlclJlc3VsdCgKLWphdmEubmlvLmNoYXJzZXQuQ29kZXJSZXN1bHQpCi0KLXB1YmxpYyBmaW5hbCBmbG9hdCBhdmVyYWdlQ2hhcnNQZXJCeXRlKCkKLQotcHVibGljIGZpbmFsIGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldCBjaGFyc2V0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uaW8vY2hhcnNldC9DaGFyYWN0ZXJDb2RpbmdFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBqYXZhLm5pby5DaGFyQnVmZmVyIGRlY29kZSgKLWphdmEubmlvLkJ5dGVCdWZmZXIpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLm5pby5jaGFyc2V0LkNvZGVyUmVzdWx0IGRlY29kZSgKLWphdmEubmlvLkJ5dGVCdWZmZXIKLWphdmEubmlvLkNoYXJCdWZmZXIKLWJvb2xlYW4pCi0KLXByb3RlY3RlZCBhYnN0cmFjdCBqYXZhLm5pby5jaGFyc2V0LkNvZGVyUmVzdWx0IGRlY29kZUxvb3AoCi1qYXZhLm5pby5CeXRlQnVmZmVyCi1qYXZhLm5pby5DaGFyQnVmZmVyKQotCi1wdWJsaWMgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0IGRldGVjdGVkQ2hhcnNldCgpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLm5pby5jaGFyc2V0LkNvZGVyUmVzdWx0IGZsdXNoKAotamF2YS5uaW8uQ2hhckJ1ZmZlcikKLQotcHJvdGVjdGVkIGphdmEubmlvLmNoYXJzZXQuQ29kZXJSZXN1bHQgaW1wbEZsdXNoKAotamF2YS5uaW8uQ2hhckJ1ZmZlcikKLQotcHJvdGVjdGVkIHZvaWQgaW1wbE9uTWFsZm9ybWVkSW5wdXQoCi1qYXZhLm5pby5jaGFyc2V0LkNvZGluZ0Vycm9yQWN0aW9uKQotCi1wcm90ZWN0ZWQgdm9pZCBpbXBsT25Vbm1hcHBhYmxlQ2hhcmFjdGVyKAotamF2YS5uaW8uY2hhcnNldC5Db2RpbmdFcnJvckFjdGlvbikKLQotcHJvdGVjdGVkIHZvaWQgaW1wbFJlcGxhY2VXaXRoKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJvdGVjdGVkIHZvaWQgaW1wbFJlc2V0KCkKLQotcHVibGljIGJvb2xlYW4gaXNBdXRvRGV0ZWN0aW5nKCkKLQotcHVibGljIGJvb2xlYW4gaXNDaGFyc2V0RGV0ZWN0ZWQoKQotCi1wdWJsaWMgamF2YS5uaW8uY2hhcnNldC5Db2RpbmdFcnJvckFjdGlvbiBtYWxmb3JtZWRJbnB1dEFjdGlvbigpCi0KLXB1YmxpYyBmaW5hbCBmbG9hdCBtYXhDaGFyc1BlckJ5dGUoKQotCi1wdWJsaWMgZmluYWwgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0RGVjb2RlciBvbk1hbGZvcm1lZElucHV0KAotamF2YS5uaW8uY2hhcnNldC5Db2RpbmdFcnJvckFjdGlvbikKLQotcHVibGljIGZpbmFsIGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldERlY29kZXIgb25Vbm1hcHBhYmxlQ2hhcmFjdGVyKAotamF2YS5uaW8uY2hhcnNldC5Db2RpbmdFcnJvckFjdGlvbikKLQotcHVibGljIGZpbmFsIGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldERlY29kZXIgcmVwbGFjZVdpdGgoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyByZXBsYWNlbWVudCgpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXREZWNvZGVyIHJlc2V0KCkKLQotcHVibGljIGphdmEubmlvLmNoYXJzZXQuQ29kaW5nRXJyb3JBY3Rpb24gdW5tYXBwYWJsZUNoYXJhY3RlckFjdGlvbigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgY29tLmlibS5pY3U0am5pLmNoYXJzZXQuQ2hhcnNldERlY29kZXJJQ1UgZXh0ZW5kcyBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXREZWNvZGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTlBVVF9IRUxECi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTlBVVF9PRkZTRVQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfQllURVMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExJTUlUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPVVRQVVRfT0ZGU0VUCi0KLXByaXZhdGUgbG9uZyBjb252ZXJ0ZXJIYW5kbGUKLQotcHJpdmF0ZSBpbnRbXSBkYXRhCi0KLXByaXZhdGUgaW50IGVjCi0KLXByaXZhdGUgaW50IGluRW5kCi0KLXByaXZhdGUgYnl0ZVtdIGlucHV0Ci0KLXByaXZhdGUgaW50IG9uTWFsZm9ybWVkSW5wdXQKLQotcHJpdmF0ZSBpbnQgb25Vbm1hcHBhYmxlSW5wdXQKLQotcHJpdmF0ZSBpbnQgb3V0RW5kCi0KLXByaXZhdGUgY2hhcltdIG91dHB1dAotCi1wcml2YXRlIGludCBzYXZlZElucHV0SGVsZExlbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubmlvLmNoYXJzZXQuQ2hhcnNldAotbG9uZykKLQotcHJpdmF0ZSBmaW5hbCBpbnQgZ2V0QXJyYXkoCi1qYXZhLm5pby5CeXRlQnVmZmVyKQotCi1wcml2YXRlIGZpbmFsIGludCBnZXRBcnJheSgKLWphdmEubmlvLkNoYXJCdWZmZXIpCi0KLXByaXZhdGUgZmluYWwgdm9pZCBzZXRQb3NpdGlvbigKLWphdmEubmlvLkJ5dGVCdWZmZXIpCi0KLXByaXZhdGUgZmluYWwgdm9pZCBzZXRQb3NpdGlvbigKLWphdmEubmlvLkNoYXJCdWZmZXIpCi0KLXByb3RlY3RlZCBqYXZhLm5pby5jaGFyc2V0LkNvZGVyUmVzdWx0IGRlY29kZUxvb3AoCi1qYXZhLm5pby5CeXRlQnVmZmVyCi1qYXZhLm5pby5DaGFyQnVmZmVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvVGhyb3dhYmxlOyApCi1wcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpCi0KLXByb3RlY3RlZCBmaW5hbCBqYXZhLm5pby5jaGFyc2V0LkNvZGVyUmVzdWx0IGltcGxGbHVzaCgKLWphdmEubmlvLkNoYXJCdWZmZXIpCi0KLXByb3RlY3RlZCBmaW5hbCB2b2lkIGltcGxPbk1hbGZvcm1lZElucHV0KAotamF2YS5uaW8uY2hhcnNldC5Db2RpbmdFcnJvckFjdGlvbikKLQotcHJvdGVjdGVkIGZpbmFsIHZvaWQgaW1wbE9uVW5tYXBwYWJsZUNoYXJhY3RlcigKLWphdmEubmlvLmNoYXJzZXQuQ29kaW5nRXJyb3JBY3Rpb24pCi0KLXByb3RlY3RlZCB2b2lkIGltcGxSZXBsYWNlV2l0aCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByb3RlY3RlZCB2b2lkIGltcGxSZXNldCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0RW5jb2RlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVORAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxVU0gKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOSVQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9OR09JTkcKLQotcHJpdmF0ZSBmbG9hdCBhdmVyQnl0ZXMKLQotcHJpdmF0ZSBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQgY3MKLQotcHJpdmF0ZSBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXREZWNvZGVyIGRlY29kZXIKLQotcHJpdmF0ZSBqYXZhLm5pby5jaGFyc2V0LkNvZGluZ0Vycm9yQWN0aW9uIG1hbGZvcm1BY3Rpb24KLQotcHJpdmF0ZSBmbG9hdCBtYXhCeXRlcwotCi1wcml2YXRlIGJ5dGVbXSByZXBsYWNlCi0KLXByaXZhdGUgaW50IHN0YXR1cwotCi1wcml2YXRlIGphdmEubmlvLmNoYXJzZXQuQ29kaW5nRXJyb3JBY3Rpb24gdW5tYXBBY3Rpb24KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oCi1qYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQKLWZsb2F0Ci1mbG9hdCkKLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0Ci1mbG9hdAotZmxvYXQKLWJ5dGVbXSkKLQotcHJpdmF0ZSBqYXZhLm5pby5CeXRlQnVmZmVyIGFsbG9jYXRlTW9yZSgKLWphdmEubmlvLkJ5dGVCdWZmZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmlvL2NoYXJzZXQvQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgY2hlY2tDb2RlclJlc3VsdCgKLWphdmEubmlvLmNoYXJzZXQuQ29kZXJSZXN1bHQpCi0KLXByaXZhdGUgYm9vbGVhbiBpbXBsQ2FuRW5jb2RlKAotamF2YS5uaW8uQ2hhckJ1ZmZlcikKLQotcHVibGljIGZpbmFsIGZsb2F0IGF2ZXJhZ2VCeXRlc1BlckNoYXIoKQotCi1wdWJsaWMgYm9vbGVhbiBjYW5FbmNvZGUoCi1jaGFyKQotCi1wdWJsaWMgYm9vbGVhbiBjYW5FbmNvZGUoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotCi1wdWJsaWMgZmluYWwgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0IGNoYXJzZXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25pby9jaGFyc2V0L0NoYXJhY3RlckNvZGluZ0V4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIGphdmEubmlvLkJ5dGVCdWZmZXIgZW5jb2RlKAotamF2YS5uaW8uQ2hhckJ1ZmZlcikKLQotcHVibGljIGZpbmFsIGphdmEubmlvLmNoYXJzZXQuQ29kZXJSZXN1bHQgZW5jb2RlKAotamF2YS5uaW8uQ2hhckJ1ZmZlcgotamF2YS5uaW8uQnl0ZUJ1ZmZlcgotYm9vbGVhbikKLQotcHJvdGVjdGVkIGFic3RyYWN0IGphdmEubmlvLmNoYXJzZXQuQ29kZXJSZXN1bHQgZW5jb2RlTG9vcCgKLWphdmEubmlvLkNoYXJCdWZmZXIKLWphdmEubmlvLkJ5dGVCdWZmZXIpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLm5pby5jaGFyc2V0LkNvZGVyUmVzdWx0IGZsdXNoKAotamF2YS5uaW8uQnl0ZUJ1ZmZlcikKLQotcHJvdGVjdGVkIGphdmEubmlvLmNoYXJzZXQuQ29kZXJSZXN1bHQgaW1wbEZsdXNoKAotamF2YS5uaW8uQnl0ZUJ1ZmZlcikKLQotcHJvdGVjdGVkIHZvaWQgaW1wbE9uTWFsZm9ybWVkSW5wdXQoCi1qYXZhLm5pby5jaGFyc2V0LkNvZGluZ0Vycm9yQWN0aW9uKQotCi1wcm90ZWN0ZWQgdm9pZCBpbXBsT25Vbm1hcHBhYmxlQ2hhcmFjdGVyKAotamF2YS5uaW8uY2hhcnNldC5Db2RpbmdFcnJvckFjdGlvbikKLQotcHJvdGVjdGVkIHZvaWQgaW1wbFJlcGxhY2VXaXRoKAotYnl0ZVtdKQotCi1wcm90ZWN0ZWQgdm9pZCBpbXBsUmVzZXQoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0xlZ2FsUmVwbGFjZW1lbnQoCi1ieXRlW10pCi0KLXB1YmxpYyBqYXZhLm5pby5jaGFyc2V0LkNvZGluZ0Vycm9yQWN0aW9uIG1hbGZvcm1lZElucHV0QWN0aW9uKCkKLQotcHVibGljIGZpbmFsIGZsb2F0IG1heEJ5dGVzUGVyQ2hhcigpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXRFbmNvZGVyIG9uTWFsZm9ybWVkSW5wdXQoCi1qYXZhLm5pby5jaGFyc2V0LkNvZGluZ0Vycm9yQWN0aW9uKQotCi1wdWJsaWMgZmluYWwgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0RW5jb2RlciBvblVubWFwcGFibGVDaGFyYWN0ZXIoCi1qYXZhLm5pby5jaGFyc2V0LkNvZGluZ0Vycm9yQWN0aW9uKQotCi1wdWJsaWMgZmluYWwgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0RW5jb2RlciByZXBsYWNlV2l0aCgKLWJ5dGVbXSkKLQotcHVibGljIGZpbmFsIGJ5dGVbXSByZXBsYWNlbWVudCgpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXRFbmNvZGVyIHJlc2V0KCkKLQotcHVibGljIGphdmEubmlvLmNoYXJzZXQuQ29kaW5nRXJyb3JBY3Rpb24gdW5tYXBwYWJsZUNoYXJhY3RlckFjdGlvbigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgY29tLmlibS5pY3U0am5pLmNoYXJzZXQuQ2hhcnNldEVuY29kZXJJQ1UgZXh0ZW5kcyBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXRFbmNvZGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTlBVVF9IRUxECi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTlBVVF9PRkZTRVQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfQ0hBUlMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExJTUlUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPVVRQVVRfT0ZGU0VUCi0KLXByaXZhdGUgbG9uZyBjb252ZXJ0ZXJIYW5kbGUKLQotcHJpdmF0ZSBpbnRbXSBkYXRhCi0KLXByaXZhdGUgaW50IGVjCi0KLXByaXZhdGUgaW50IGluRW5kCi0KLXByaXZhdGUgY2hhcltdIGlucHV0Ci0KLXByaXZhdGUgaW50IG9uTWFsZm9ybWVkSW5wdXQKLQotcHJpdmF0ZSBpbnQgb25Vbm1hcHBhYmxlSW5wdXQKLQotcHJpdmF0ZSBpbnQgb3V0RW5kCi0KLXByaXZhdGUgYnl0ZVtdIG91dHB1dAotCi1wcml2YXRlIGludCBzYXZlZElucHV0SGVsZExlbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubmlvLmNoYXJzZXQuQ2hhcnNldAotbG9uZwotYnl0ZVtdKQotCi1wcml2YXRlIGZpbmFsIGludCBnZXRBcnJheSgKLWphdmEubmlvLkJ5dGVCdWZmZXIpCi0KLXByaXZhdGUgZmluYWwgaW50IGdldEFycmF5KAotamF2YS5uaW8uQ2hhckJ1ZmZlcikKLQotcHJpdmF0ZSBmaW5hbCB2b2lkIHNldFBvc2l0aW9uKAotamF2YS5uaW8uQnl0ZUJ1ZmZlcikKLQotcHJpdmF0ZSBmaW5hbCB2b2lkIHNldFBvc2l0aW9uKAotamF2YS5uaW8uQ2hhckJ1ZmZlcikKLQotcHVibGljIGJvb2xlYW4gY2FuRW5jb2RlKAotY2hhcikKLQotcHVibGljIGJvb2xlYW4gY2FuRW5jb2RlKAotaW50KQotCi1wcm90ZWN0ZWQgamF2YS5uaW8uY2hhcnNldC5Db2RlclJlc3VsdCBlbmNvZGVMb29wKAotamF2YS5uaW8uQ2hhckJ1ZmZlcgotamF2YS5uaW8uQnl0ZUJ1ZmZlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL1Rocm93YWJsZTsgKQotcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKQotCi1wcm90ZWN0ZWQgamF2YS5uaW8uY2hhcnNldC5Db2RlclJlc3VsdCBpbXBsRmx1c2goCi1qYXZhLm5pby5CeXRlQnVmZmVyKQotCi1wcm90ZWN0ZWQgdm9pZCBpbXBsT25NYWxmb3JtZWRJbnB1dCgKLWphdmEubmlvLmNoYXJzZXQuQ29kaW5nRXJyb3JBY3Rpb24pCi0KLXByb3RlY3RlZCB2b2lkIGltcGxPblVubWFwcGFibGVDaGFyYWN0ZXIoCi1qYXZhLm5pby5jaGFyc2V0LkNvZGluZ0Vycm9yQWN0aW9uKQotCi1wcm90ZWN0ZWQgdm9pZCBpbXBsUmVwbGFjZVdpdGgoCi1ieXRlW10pCi0KLXByb3RlY3RlZCB2b2lkIGltcGxSZXNldCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS9sYW5nL09iamVjdDsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZhLmxhbmcuQ29tcGFyYWJsZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUVDspSSApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGNvbXBhcmVUbygKLWphdmEubGFuZy5PYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcvQ29tcGFyYWJsZTxMamF2YS9uaW8vY2hhcnNldC9DaGFyc2V0Oz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGphdmEvbmlvL2NoYXJzZXQvQ2hhcnNldCRJZ25vcmVDYXNlQ29tcGFyYXRvcjsgKQotcHVibGljIGFic3RyYWN0IGNsYXNzIGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmxhbmcuQ29tcGFyYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBST1ZJREVSX0NPTkZJR1VSQVRJT05fRklMRV9DT01NRU5UCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUFJPVklERVJfQ09ORklHVVJBVElPTl9GSUxFX0VOQ09ESU5HCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUFJPVklERVJfQ09ORklHVVJBVElPTl9GSUxFX05BTUUKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL1RyZWVNYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbmlvL2NoYXJzZXQvQ2hhcnNldDs+OyApCi1wcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuVHJlZU1hcCBfYnVpbHRJbkNoYXJzZXRzCi0KLXByaXZhdGUgc3RhdGljIGNvbS5pYm0uaWN1NGpuaS5jaGFyc2V0LkNoYXJzZXRQcm92aWRlcklDVSBfYnVpbHRJblByb3ZpZGVyCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNoTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL25pby9jaGFyc2V0L0NoYXJzZXREZWNvZGVyOz47ICkKLXByaXZhdGUgc3RhdGljIGphdmEudXRpbC5IYXNoTWFwIGNhY2hlZENoYXJzZXREZWNvZGVyVGFibGUKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0hhc2hNYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbmlvL2NoYXJzZXQvQ2hhcnNldEVuY29kZXI7PjsgKQotcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLkhhc2hNYXAgY2FjaGVkQ2hhcnNldEVuY29kZXJUYWJsZQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaE1hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9uaW8vY2hhcnNldC9DaGFyc2V0Oz47ICkKLXByaXZhdGUgc3RhdGljIGphdmEudXRpbC5IYXNoTWFwIGNhY2hlZENoYXJzZXRUYWJsZQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIgc3lzdGVtQ2xhc3NMb2FkZXIKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0hhc2hTZXQ8TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHJpdmF0ZSBmaW5hbCBqYXZhLnV0aWwuSGFzaFNldCBhbGlhc2VzU2V0Ci0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBjYW5vbmljYWxOYW1lCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25pby9jaGFyc2V0L0lsbGVnYWxDaGFyc2V0TmFtZUV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZ1tdKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9uaW8vY2hhcnNldC9zcGkvQ2hhcnNldFByb3ZpZGVyO0xqYXZhL3V0aWwvVHJlZU1hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9uaW8vY2hhcnNldC9DaGFyc2V0Oz47KVYgKQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRDaGFyc2V0cygKLWphdmEubmlvLmNoYXJzZXQuc3BpLkNoYXJzZXRQcm92aWRlcgotamF2YS51dGlsLlRyZWVNYXApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL1NvcnRlZE1hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9uaW8vY2hhcnNldC9DaGFyc2V0Oz47ICkKLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlNvcnRlZE1hcCBhdmFpbGFibGVDaGFyc2V0cygpCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgY2FjaGVDaGFyc2V0KAotamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0KQotCi1wcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrQ2hhcnNldE5hbWUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldCBkZWZhdWx0Q2hhcnNldCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmlvL2NoYXJzZXQvSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uO0xqYXZhL25pby9jaGFyc2V0L1Vuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQgZm9yTmFtZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmlvL2NoYXJzZXQvSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uOyApCi1wcml2YXRlIHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQgZm9yTmFtZUludGVybmFsKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0IGdldENhY2hlZENoYXJzZXQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldERlY29kZXIgZ2V0Q2FjaGVkQ2hhcnNldERlY29kZXIoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldEVuY29kZXIgZ2V0Q2FjaGVkQ2hhcnNldEVuY29kZXIoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIgZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkKLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZXRTeXN0ZW1DbGFzc0xvYWRlcigpCi0KLXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNEaWdpdCgKLWNoYXIpCi0KLXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNMZXR0ZXIoCi1jaGFyKQotCi1wcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU3BlY2lhbCgKLWNoYXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmlvL2NoYXJzZXQvSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTdXBwb3J0ZWQoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9uZXQvVVJMO0xqYXZhL2xhbmcvQ2xhc3NMb2FkZXI7TGphdmEvdXRpbC9UcmVlTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL25pby9jaGFyc2V0L0NoYXJzZXQ7PjspViApCi1wcml2YXRlIHN0YXRpYyB2b2lkIGxvYWRDb25maWd1cmVkQ2hhcnNldHMoCi1qYXZhLm5ldC5VUkwKLWphdmEubGFuZy5DbGFzc0xvYWRlcgotamF2YS51dGlsLlRyZWVNYXApCi0KLXByaXZhdGUgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldCBzZWFyY2hDb25maWd1cmVkQ2hhcnNldHMoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuQ2xhc3NMb2FkZXIKLWphdmEubmV0LlVSTCkKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyB0cmltQ2xhc3NOYW1lKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvU2V0PExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXB1YmxpYyBmaW5hbCBqYXZhLnV0aWwuU2V0IGFsaWFzZXMoKQotCi1wdWJsaWMgYm9vbGVhbiBjYW5FbmNvZGUoKQotCi1wdWJsaWMgdm9sYXRpbGUgaW50IGNvbXBhcmVUbygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBmaW5hbCBpbnQgY29tcGFyZVRvKAotamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0KQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBjb250YWlucygKLWphdmEubmlvLmNoYXJzZXQuQ2hhcnNldCkKLQotcHVibGljIGZpbmFsIGphdmEubmlvLkNoYXJCdWZmZXIgZGVjb2RlKAotamF2YS5uaW8uQnl0ZUJ1ZmZlcikKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZGlzcGxheU5hbWUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBkaXNwbGF5TmFtZSgKLWphdmEudXRpbC5Mb2NhbGUpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLm5pby5CeXRlQnVmZmVyIGVuY29kZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLm5pby5CeXRlQnVmZmVyIGVuY29kZSgKLWphdmEubmlvLkNoYXJCdWZmZXIpCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBmaW5hbCBpbnQgaGFzaENvZGUoKQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBpc1JlZ2lzdGVyZWQoKQotCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBuYW1lKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldERlY29kZXIgbmV3RGVjb2RlcigpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXRFbmNvZGVyIG5ld0VuY29kZXIoKQotCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgY29tLmlibS5pY3U0am5pLmNoYXJzZXQuQ2hhcnNldElDVSBleHRlbmRzIGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuTWFwIHN1YkJ5dGVNYXAKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGljdUNhbm9uaWNhbE5hbWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotcHVibGljIGJvb2xlYW4gY29udGFpbnMoCi1qYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQpCi0KLXB1YmxpYyBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXREZWNvZGVyIG5ld0RlY29kZXIoKQotCi1wdWJsaWMgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0RW5jb2RlciBuZXdFbmNvZGVyKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEU6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL2xhbmcvT2JqZWN0OyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEudXRpbC5JdGVyYXRvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBoYXNOZXh0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVRFOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLk9iamVjdCBuZXh0KCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgcmVtb3ZlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2libS9pY3U0am5pL2NoYXJzZXQvQ2hhcnNldFByb3ZpZGVySUNVOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTIwIG5hbWUgPUNoYXJzZXRJdGVyYXRvciApCi1wdWJsaWMgZmluYWwgY2xhc3MgY29tLmlibS5pY3U0am5pLmNoYXJzZXQuQ2hhcnNldFByb3ZpZGVySUNVJENoYXJzZXRJdGVyYXRvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuSXRlcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBpbnQgY3VycmVudEluZGV4Ci0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZ1tdIG5hbWVzCi0KLWZpbmFsIGNvbS5pYm0uaWN1NGpuaS5jaGFyc2V0LkNoYXJzZXRQcm92aWRlcklDVSB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oCi1jb20uaWJtLmljdTRqbmkuY2hhcnNldC5DaGFyc2V0UHJvdmlkZXJJQ1UKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IG5leHQoKQotCi1wdWJsaWMgdm9pZCByZW1vdmUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGphdmEubmlvLmNoYXJzZXQuc3BpLkNoYXJzZXRQcm92aWRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlJ1bnRpbWVQZXJtaXNzaW9uIENPTlNUUlVDVF9QRVJNCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0IGNoYXJzZXRGb3JOYW1lKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvSXRlcmF0b3I8TGphdmEvbmlvL2NoYXJzZXQvQ2hhcnNldDs+OyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLkl0ZXJhdG9yIGNoYXJzZXRzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxjb20vaWJtL2ljdTRqbmkvY2hhcnNldC9DaGFyc2V0UHJvdmlkZXJJQ1UkQ2hhcnNldEl0ZXJhdG9yOyApCi1wdWJsaWMgZmluYWwgY2xhc3MgY29tLmlibS5pY3U0am5pLmNoYXJzZXQuQ2hhcnNldFByb3ZpZGVySUNVIGV4dGVuZHMgamF2YS5uaW8uY2hhcnNldC5zcGkuQ2hhcnNldFByb3ZpZGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQgZ2V0Q2hhcnNldCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQgY2hhcnNldEZvck5hbWUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgZmluYWwgamF2YS51dGlsLkl0ZXJhdG9yIGNoYXJzZXRzKCkKLQotcHVibGljIGZpbmFsIHZvaWQgcHV0Q2hhcnNldHMoCi1qYXZhLnV0aWwuTWFwKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIGNvbS5pYm0uaWN1NGpuaS5jb21tb24uRXJyb3JDb2RlIGV4dGVuZHMgamF2YS5sYW5nLkV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gRVJST1JfTkFNRVNfCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBMSUJSQVJZX0xPQURFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBVX0JVRkZFUl9PVkVSRkxPV19FUlJPUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBVX0VSUk9SX0lORk9fTElNSVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVV9FUlJPUl9JTkZPX1NUQVJUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVfRVJST1JfTElNSVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVV9GSUxFX0FDQ0VTU19FUlJPUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBVX0lMTEVHQUxfQVJHVU1FTlRfRVJST1IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVV9JTExFR0FMX0NIQVJfRk9VTkQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVV9JTExFR0FMX0VTQ0FQRV9TRVFVRU5DRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBVX0lOREVYX09VVE9GQk9VTkRTX0VSUk9SCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVfSU5URVJOQUxfUFJPR1JBTV9FUlJPUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBVX0lOVkFMSURfQ0hBUl9GT1VORAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBVX0lOVkFMSURfRk9STUFUX0VSUk9SCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVfSU5WQUxJRF9UQUJMRV9GSUxFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVfSU5WQUxJRF9UQUJMRV9GT1JNQVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVV9NRU1PUllfQUxMT0NBVElPTl9FUlJPUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBVX01FU1NBR0VfUEFSU0VfRVJST1IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVV9NSVNTSU5HX1JFU09VUkNFX0VSUk9SCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVfTk9fU1BBQ0VfQVZBSUxBQkxFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVfUEFSU0VfRVJST1IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVV9SRVNPVVJDRV9UWVBFX01JU01BVENICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVfU0FGRUNMT05FX0FMTE9DQVRFRF9FUlJPUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBVX1RSVU5DQVRFRF9DSEFSX0ZPVU5ECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVfVU5TVVBQT1JURURfRVJST1IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVV9VTlNVUFBPUlRFRF9FU0NBUEVfU0VRVUVOQ0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVV9VU0lOR19ERUZBVUxUX0VSUk9SCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVfVVNJTkdfRkFMTEJBQ0tfRVJST1IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVV9aRVJPX0VSUk9SCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RXJyb3JOYW1lKAotaW50KQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uIGdldEV4Y2VwdGlvbigKLWludCkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzRmFpbHVyZSgKLWludCkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzU3VjY2VzcygKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBjb20uaWJtLmljdTRqbmkuY29udmVydGVycy5OYXRpdmVDb252ZXJ0ZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNLSVBfQ0FMTEJBQ0sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RPUF9DQUxMQkFDSwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVUJTVElUVVRFX0NBTExCQUNLCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiBjYW5EZWNvZGUoCi1sb25nCi1ieXRlW10pCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gY2FuRW5jb2RlKAotbG9uZwotaW50KQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGNsb3NlQ29udmVydGVyKAotbG9uZykKLQotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiBjb250YWlucygKLWxvbmcKLWxvbmcpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBjb252ZXJ0Qnl0ZVRvQ2hhcigKLWxvbmcKLWJ5dGVbXQotaW50Ci1jaGFyW10KLWludAotaW50W10KLWJvb2xlYW4pCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBjb252ZXJ0Q2hhclRvQnl0ZSgKLWxvbmcKLWNoYXJbXQotaW50Ci1ieXRlW10KLWludAotaW50W10KLWJvb2xlYW4pCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBjb3VudEFsaWFzZXMoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgY291bnRBdmFpbGFibGUoKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgY291bnRJbnZhbGlkQnl0ZXMoCi1sb25nCi1pbnRbXSkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGNvdW50SW52YWxpZENoYXJzKAotbG9uZwotaW50W10pCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBkZWNvZGUoCi1sb25nCi1ieXRlW10KLWludAotY2hhcltdCi1pbnQKLWludFtdCi1ib29sZWFuKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZW5jb2RlKAotbG9uZwotY2hhcltdCi1pbnQKLWJ5dGVbXQotaW50Ci1pbnRbXQotYm9vbGVhbikKLQotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGZsdXNoQnl0ZVRvQ2hhcigKLWxvbmcKLWNoYXJbXQotaW50Ci1pbnRbXSkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGZsdXNoQ2hhclRvQnl0ZSgKLWxvbmcKLWJ5dGVbXQotaW50Ci1pbnRbXSkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgamF2YS5sYW5nLlN0cmluZ1tdIGdldEFsaWFzZXMoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0QXZhaWxhYmxlKCkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgZmxvYXQgZ2V0QXZlQnl0ZXNQZXJDaGFyKAotbG9uZykKLQotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgZmxvYXQgZ2V0QXZlQ2hhcnNQZXJCeXRlKAotbG9uZykKLQotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgamF2YS5sYW5nLlN0cmluZyBnZXRDYW5vbmljYWxOYW1lKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgamF2YS5sYW5nLlN0cmluZyBnZXRJQ1VDYW5vbmljYWxOYW1lKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgamF2YS5sYW5nLlN0cmluZyBnZXRKYXZhQ2Fub25pY2FsTmFtZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBnZXRNYXhCeXRlc1BlckNoYXIoCi1sb25nKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2V0TWF4Q2hhcnNQZXJCeXRlKAotbG9uZykKLQotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGdldE1pbkJ5dGVzUGVyQ2hhcigKLWxvbmcpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJ5dGVbXSBnZXRTdWJzdGl0dXRpb25CeXRlcygKLWxvbmcpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGxvbmcgb3BlbkNvbnZlcnRlcigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgcmVzZXRCeXRlVG9DaGFyKAotbG9uZykKLQotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCByZXNldENoYXJUb0J5dGUoCi1sb25nKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBsb25nIHNhZmVDbG9uZSgKLWxvbmcpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBzZXRDYWxsYmFja0RlY29kZSgKLWxvbmcKLWludAotaW50Ci1jaGFyW10KLWludCkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IHNldENhbGxiYWNrRW5jb2RlKAotbG9uZwotaW50Ci1pbnQKLWJ5dGVbXQotaW50KQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgc2V0U3Vic3RpdHV0aW9uQnl0ZXMoCi1sb25nCi1ieXRlW10KLWludCkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IHNldFN1YnN0aXR1dGlvbkNoYXJzKAotbG9uZwotY2hhcltdCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBzZXRTdWJzdGl0dXRpb25Nb2RlQnl0ZVRvQ2hhcigKLWxvbmcKLWJvb2xlYW4pCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBzZXRTdWJzdGl0dXRpb25Nb2RlQ2hhclRvQnl0ZSgKLWxvbmcKLWJvb2xlYW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgY29tLmlibS5pY3U0am5pLmxhbmcuVUNoYXJhY3RlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IGNvZGVibG9jaygKLWludCkKLQotcHVibGljIHN0YXRpYyBpbnQgZGlnaXQoCi1pbnQKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBkaWdpdEltcGwoCi1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBpbnQgZm9yTmFtZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgZm9ybmFtZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLkNoYXJhY3RlciRVbmljb2RlQmxvY2tbXSBnZXRCbG9ja1RhYmxlKCkKLQotcHVibGljIHN0YXRpYyBieXRlIGdldERpcmVjdGlvbmFsaXR5KAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgYnl0ZSBnZXREaXJlY3Rpb25hbGl0eUltcGwoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgaW50IGdldE51bWVyaWNWYWx1ZSgKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBnZXROdW1lcmljVmFsdWVJbXBsKAotaW50KQotCi1wdWJsaWMgc3RhdGljIGludCBnZXRUeXBlKAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IGdldFR5cGVJbXBsKAotaW50KQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEZWZpbmVkKAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBpc0RlZmluZWRWYWx1ZUltcGwoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RpZ2l0KAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBpc0RpZ2l0SW1wbCgKLWludCkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzSWRlbnRpZmllcklnbm9yYWJsZSgKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gaXNJZGVudGlmaWVySWdub3JhYmxlSW1wbCgKLWludCkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzTGV0dGVyKAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBpc0xldHRlckltcGwoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0xldHRlck9yRGlnaXQoCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBib29sZWFuIGlzTGV0dGVyT3JEaWdpdEltcGwoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0xvd2VyQ2FzZSgKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gaXNMb3dlckNhc2VJbXBsKAotaW50KQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNNaXJyb3JlZCgKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gaXNNaXJyb3JlZEltcGwoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NwYWNlQ2hhcigKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gaXNTcGFjZUNoYXJJbXBsKAotaW50KQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUaXRsZUNhc2UoCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBib29sZWFuIGlzVGl0bGVDYXNlSW1wbCgKLWludCkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzVW5pY29kZUlkZW50aWZpZXJQYXJ0KAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBpc1VuaWNvZGVJZGVudGlmaWVyUGFydEltcGwoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1VuaWNvZGVJZGVudGlmaWVyU3RhcnQoCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBib29sZWFuIGlzVW5pY29kZUlkZW50aWZpZXJTdGFydEltcGwoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1VwcGVyQ2FzZSgKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gaXNVcHBlckNhc2VJbXBsKAotaW50KQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNXaGl0ZXNwYWNlKAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBpc1doaXRlc3BhY2VJbXBsKAotaW50KQotCi1wdWJsaWMgc3RhdGljIGludCBvZigKLWludCkKLQotcHVibGljIHN0YXRpYyBpbnQgdG9Mb3dlckNhc2UoCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgdG9Mb3dlckNhc2VJbXBsKAotaW50KQotCi1wdWJsaWMgc3RhdGljIGludCB0b1RpdGxlQ2FzZSgKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCB0b1RpdGxlQ2FzZUltcGwoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgaW50IHRvVXBwZXJDYXNlKAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IHRvVXBwZXJDYXNlSW1wbCgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZhLmxhbmcuTnVtYmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBieXRlIGJ5dGVWYWx1ZSgpCi0KLXB1YmxpYyBhYnN0cmFjdCBkb3VibGUgZG91YmxlVmFsdWUoKQotCi1wdWJsaWMgYWJzdHJhY3QgZmxvYXQgZmxvYXRWYWx1ZSgpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgaW50VmFsdWUoKQotCi1wdWJsaWMgYWJzdHJhY3QgbG9uZyBsb25nVmFsdWUoKQotCi1wdWJsaWMgc2hvcnQgc2hvcnRWYWx1ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgY29tLmlibS5pY3U0am5pLm1hdGguQmlnRGVjaW1hbCBleHRlbmRzIGphdmEubGFuZy5OdW1iZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgZG91YmxlIGRvdWJsZVZhbHVlKCkKLQotcHVibGljIGZsb2F0IGZsb2F0VmFsdWUoKQotCi1wdWJsaWMgaW50IGludFZhbHVlKCkKLQotcHVibGljIGxvbmcgbG9uZ1ZhbHVlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGNvbS5pYm0uaWN1NGpuaS5yZWdleC5OYXRpdmVSZWdFeCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgY2xvbmUoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgY2xvc2UoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gZmluZCgKLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIGZpbmROZXh0KAotaW50KQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgZ3JvdXBDb3VudCgKLWludCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBoYXNBbmNob3JpbmdCb3VuZHMoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gaGFzVHJhbnNwYXJlbnRCb3VuZHMoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gaGl0RW5kKAotaW50KQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIGxvb2tpbmdBdCgKLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIG1hdGNoZXMoCi1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IG9wZW4oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCByZWdpb25FbmQoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCByZWdpb25TdGFydCgKLWludCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiByZXF1aXJlRW5kKAotaW50KQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHJlc2V0KAotaW50Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgc2V0UmVnaW9uKAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBzZXRUZXh0KAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHN0YXJ0RW5kKAotaW50Ci1pbnRbXSkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCB1c2VBbmNob3JpbmdCb3VuZHMoCi1pbnQKLWJvb2xlYW4pCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgdXNlVHJhbnNwYXJlbnRCb3VuZHMoCi1pbnQKLWJvb2xlYW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEubGFuZy5DbG9uZWFibGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBjb20uaWJtLmljdTRqbmkudGV4dC5CcmVha0l0ZXJhdG9yIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5DbG9uZWFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHN0YXRpYyBpbnQgQklfQ0hBUl9JTlNUQU5DRQotCi1wcm90ZWN0ZWQgc3RhdGljIGludCBCSV9MSU5FX0lOU1RBTkNFCi0KLXByb3RlY3RlZCBzdGF0aWMgaW50IEJJX1NFTlRfSU5TVEFOQ0UKLQotcHJvdGVjdGVkIHN0YXRpYyBpbnQgQklfV09SRF9JTlNUQU5DRQotCi1wcm90ZWN0ZWQgaW50IHR5cGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLkxvY2FsZVtdIGdldEF2YWlsYWJsZUxvY2FsZXMoKQotCi1wdWJsaWMgc3RhdGljIGNvbS5pYm0uaWN1NGpuaS50ZXh0LkJyZWFrSXRlcmF0b3IgZ2V0Q2hhcmFjdGVySW5zdGFuY2UoKQotCi1wdWJsaWMgc3RhdGljIGNvbS5pYm0uaWN1NGpuaS50ZXh0LkJyZWFrSXRlcmF0b3IgZ2V0Q2hhcmFjdGVySW5zdGFuY2UoCi1qYXZhLnV0aWwuTG9jYWxlKQotCi1wdWJsaWMgc3RhdGljIGNvbS5pYm0uaWN1NGpuaS50ZXh0LkJyZWFrSXRlcmF0b3IgZ2V0TGluZUluc3RhbmNlKCkKLQotcHVibGljIHN0YXRpYyBjb20uaWJtLmljdTRqbmkudGV4dC5CcmVha0l0ZXJhdG9yIGdldExpbmVJbnN0YW5jZSgKLWphdmEudXRpbC5Mb2NhbGUpCi0KLXB1YmxpYyBzdGF0aWMgY29tLmlibS5pY3U0am5pLnRleHQuQnJlYWtJdGVyYXRvciBnZXRTZW50ZW5jZUluc3RhbmNlKCkKLQotcHVibGljIHN0YXRpYyBjb20uaWJtLmljdTRqbmkudGV4dC5CcmVha0l0ZXJhdG9yIGdldFNlbnRlbmNlSW5zdGFuY2UoCi1qYXZhLnV0aWwuTG9jYWxlKQotCi1wdWJsaWMgc3RhdGljIGNvbS5pYm0uaWN1NGpuaS50ZXh0LkJyZWFrSXRlcmF0b3IgZ2V0V29yZEluc3RhbmNlKCkKLQotcHVibGljIHN0YXRpYyBjb20uaWJtLmljdTRqbmkudGV4dC5CcmVha0l0ZXJhdG9yIGdldFdvcmRJbnN0YW5jZSgKLWphdmEudXRpbC5Mb2NhbGUpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuT2JqZWN0IGNsb25lKCkKLQotcHVibGljIGFic3RyYWN0IGludCBjdXJyZW50KCkKLQotcHVibGljIGFic3RyYWN0IGludCBmaXJzdCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZm9sbG93aW5nKAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS50ZXh0LkNoYXJhY3Rlckl0ZXJhdG9yIGdldFRleHQoKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0JvdW5kYXJ5KAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGxhc3QoKQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IG5leHQoKQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IG5leHQoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgcHJlY2VkaW5nKAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IHByZXZpb3VzKCkKLQotcHVibGljIHZvaWQgc2V0VGV4dCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFRleHQoCi1qYXZhLnRleHQuQ2hhcmFjdGVySXRlcmF0b3IpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgY29tLmlibS5pY3U0am5pLnRleHQuQ29sbGF0aW9uQXR0cmlidXRlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTFRFUk5BVEVfSEFORExJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFX0NPVU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBU0VfRklSU1QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FTRV9MRVZFTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGUkVOQ0hfQ09MTEFUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PUk1BTElaQVRJT05fTU9ERQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVFJFTkdUSAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQUxVRV9BVFRSSUJVVEVfVkFMVUVfQ09VTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkFMVUVfREVGQVVMVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQUxVRV9ERUZBVUxUX1NUUkVOR1RICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZBTFVFX0lERU5USUNBTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQUxVRV9MT1dFUl9GSVJTVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQUxVRV9OT05fSUdOT1JBQkxFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZBTFVFX09GRgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQUxVRV9PTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQUxVRV9PTl9XSVRIT1VUX0hBTkdVTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQUxVRV9QUklNQVJZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZBTFVFX1FVQVRFUk5BUlkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkFMVUVfU0VDT05EQVJZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZBTFVFX1NISUZURUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkFMVUVfVEVSVElBUlkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkFMVUVfVVBQRVJfRklSU1QKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1zdGF0aWMgYm9vbGVhbiBjaGVja0F0dHJpYnV0ZSgKLWludAotaW50KQotCi1zdGF0aWMgYm9vbGVhbiBjaGVja05vcm1hbGl6YXRpb24oCi1pbnQpCi0KLXN0YXRpYyBib29sZWFuIGNoZWNrU3RyZW5ndGgoCi1pbnQpCi0KLXN0YXRpYyBib29sZWFuIGNoZWNrVHlwZSgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBjb20uaWJtLmljdTRqbmkudGV4dC5Db2xsYXRpb25FbGVtZW50SXRlcmF0b3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5VTExPUkRFUgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFJJTUFSWV9PUkRFUl9NQVNLXwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFJJTUFSWV9PUkRFUl9TSElGVF8KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFQ09OREFSWV9PUkRFUl9NQVNLXwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VDT05EQVJZX09SREVSX1NISUZUXwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEVSVElBUllfT1JERVJfTUFTS18KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVOU0lHTkVEXzE2X0JJVF9NQVNLXwotCi1wcml2YXRlIGludCBtX2NvbGxlbGVtaXRlcmF0b3JfCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotaW50KQotCi1wdWJsaWMgc3RhdGljIGludCBwcmltYXJ5T3JkZXIoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgaW50IHNlY29uZGFyeU9yZGVyKAotaW50KQotCi1wdWJsaWMgc3RhdGljIGludCB0ZXJ0aWFyeU9yZGVyKAotaW50KQotCi1wcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpCi0KLXB1YmxpYyBpbnQgZ2V0TWF4RXhwYW5zaW9uKAotaW50KQotCi1wdWJsaWMgaW50IGdldE9mZnNldCgpCi0KLXB1YmxpYyBpbnQgbmV4dCgpCi0KLXB1YmxpYyBpbnQgcHJldmlvdXMoKQotCi1wdWJsaWMgdm9pZCByZXNldCgpCi0KLXB1YmxpYyB2b2lkIHNldE9mZnNldCgKLWludCkKLQotcHVibGljIHZvaWQgc2V0VGV4dCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHNldFRleHQoCi1qYXZhLnRleHQuQ2hhcmFjdGVySXRlcmF0b3IpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgY29tLmlibS5pY3U0am5pLnRleHQuQ29sbGF0aW9uS2V5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5Db21wYXJhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVTlNJR05FRF9CWVRFX01BU0tfCi0KLXByaXZhdGUgYnl0ZVtdIG1fYnl0ZXNfCi0KLXByaXZhdGUgaW50IG1faGFzaF8KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi0gdm9pZCA8aW5pdD4oCi1ieXRlW10pCi0KLXB1YmxpYyBpbnQgY29tcGFyZVRvKAotY29tLmlibS5pY3U0am5pLnRleHQuQ29sbGF0aW9uS2V5KQotCi1wdWJsaWMgaW50IGNvbXBhcmVUbygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1wdWJsaWMgYnl0ZVtdIHRvQnl0ZUFycmF5KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBjb20uaWJtLmljdTRqbmkudGV4dC5Db2xsYXRvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmxhbmcuQ2xvbmVhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBTk9OSUNBTF9ERUNPTVBPU0lUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElERU5USUNBTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT19ERUNPTVBPU0lUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSU1BUlkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUVVBVEVSTkFSWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNVTFRfREVGQVVMVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNVTFRfRVFVQUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTVUxUX0dSRUFURVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTVUxUX0xFU1MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VDT05EQVJZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRFUlRJQVJZCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuTG9jYWxlW10gZ2V0QXZhaWxhYmxlTG9jYWxlcygpCi0KLXB1YmxpYyBzdGF0aWMgY29tLmlibS5pY3U0am5pLnRleHQuQ29sbGF0b3IgZ2V0SW5zdGFuY2UoKQotCi1wdWJsaWMgc3RhdGljIGNvbS5pYm0uaWN1NGpuaS50ZXh0LkNvbGxhdG9yIGdldEluc3RhbmNlKAotamF2YS51dGlsLkxvY2FsZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0Nsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLk9iamVjdCBjbG9uZSgpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgY29tcGFyZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0QXR0cmlidXRlKAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgY29tLmlibS5pY3U0am5pLnRleHQuQ29sbGF0aW9uS2V5IGdldENvbGxhdGlvbktleSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0RGVjb21wb3NpdGlvbigpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0U3RyZW5ndGgoKQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGhhc2hDb2RlKCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0QXR0cmlidXRlKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldERlY29tcG9zaXRpb24oCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFN0cmVuZ3RoKAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGphdmEvdGV4dC9Gb3JtYXQkRmllbGQ7ICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZhLnRleHQuRm9ybWF0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlLCBqYXZhLmxhbmcuQ2xvbmVhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXN0YXRpYyBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUgZ2V0QnVuZGxlKAotamF2YS51dGlsLkxvY2FsZSkKLQotc3RhdGljIGJvb2xlYW4gdXBUbygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudGV4dC5QYXJzZVBvc2l0aW9uCi1qYXZhLmxhbmcuU3RyaW5nQnVmZmVyCi1jaGFyKQotCi1zdGF0aWMgYm9vbGVhbiB1cFRvV2l0aFF1b3RlcygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudGV4dC5QYXJzZVBvc2l0aW9uCi1qYXZhLmxhbmcuU3RyaW5nQnVmZmVyCi1jaGFyCi1jaGFyKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBjbG9uZSgpCi0KLSBqYXZhLmxhbmcuU3RyaW5nIGNvbnZlcnRQYXR0ZXJuKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotcHVibGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgZm9ybWF0KAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmdCdWZmZXIgZm9ybWF0KAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgotamF2YS50ZXh0LkZpZWxkUG9zaXRpb24pCi0KLXB1YmxpYyBqYXZhLnRleHQuQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yIGZvcm1hdFRvQ2hhcmFjdGVySXRlcmF0b3IoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3RleHQvUGFyc2VFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHBhcnNlT2JqZWN0KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5PYmplY3QgcGFyc2VPYmplY3QoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnRleHQuUGFyc2VQb3NpdGlvbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxqYXZhL3RleHQvTnVtYmVyRm9ybWF0JEZpZWxkOyApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgamF2YS50ZXh0Lk51bWJlckZvcm1hdCBleHRlbmRzIGphdmEudGV4dC5Gb3JtYXQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRlJBQ1RJT05fRklFTEQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URUdFUl9GSUVMRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmlvLk9iamVjdFN0cmVhbUZpZWxkW10gc2VyaWFsUGVyc2lzdGVudEZpZWxkcwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSBib29sZWFuIGdyb3VwaW5nVXNlZAotCi1wcml2YXRlIGludCBtYXhpbXVtRnJhY3Rpb25EaWdpdHMKLQotcHJpdmF0ZSBpbnQgbWF4aW11bUludGVnZXJEaWdpdHMKLQotcHJpdmF0ZSBpbnQgbWluaW11bUZyYWN0aW9uRGlnaXRzCi0KLXByaXZhdGUgaW50IG1pbmltdW1JbnRlZ2VyRGlnaXRzCi0KLXByaXZhdGUgYm9vbGVhbiBwYXJzZUludGVnZXJPbmx5Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5Mb2NhbGVbXSBnZXRBdmFpbGFibGVMb2NhbGVzKCkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnRleHQuTnVtYmVyRm9ybWF0IGdldEN1cnJlbmN5SW5zdGFuY2UoKQotCi1wdWJsaWMgc3RhdGljIGphdmEudGV4dC5OdW1iZXJGb3JtYXQgZ2V0Q3VycmVuY3lJbnN0YW5jZSgKLWphdmEudXRpbC5Mb2NhbGUpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS50ZXh0Lk51bWJlckZvcm1hdCBnZXRJbnN0YW5jZSgpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS50ZXh0Lk51bWJlckZvcm1hdCBnZXRJbnN0YW5jZSgKLWphdmEudXRpbC5Mb2NhbGUpCi0KLXN0YXRpYyBqYXZhLnRleHQuTnVtYmVyRm9ybWF0IGdldEluc3RhbmNlKAotamF2YS51dGlsLkxvY2FsZQotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnRleHQuTnVtYmVyRm9ybWF0IGdldEludGVnZXJJbnN0YW5jZSgpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS50ZXh0Lk51bWJlckZvcm1hdCBnZXRJbnRlZ2VySW5zdGFuY2UoCi1qYXZhLnV0aWwuTG9jYWxlKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudGV4dC5OdW1iZXJGb3JtYXQgZ2V0TnVtYmVySW5zdGFuY2UoKQotCi1wdWJsaWMgc3RhdGljIGphdmEudGV4dC5OdW1iZXJGb3JtYXQgZ2V0TnVtYmVySW5zdGFuY2UoCi1qYXZhLnV0aWwuTG9jYWxlKQotCi1zdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRQYXR0ZXJuKAotamF2YS51dGlsLkxvY2FsZQotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnRleHQuTnVtYmVyRm9ybWF0IGdldFBlcmNlbnRJbnN0YW5jZSgpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS50ZXh0Lk51bWJlckZvcm1hdCBnZXRQZXJjZW50SW5zdGFuY2UoCi1qYXZhLnV0aWwuTG9jYWxlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL2xhbmcvQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoCi1qYXZhLmlvLk9iamVjdElucHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoCi1qYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgY2xvbmUoKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBmb3JtYXQoCi1kb3VibGUpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGZvcm1hdCgKLWxvbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIGZvcm1hdCgKLWRvdWJsZQotamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgotamF2YS50ZXh0LkZpZWxkUG9zaXRpb24pCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIGZvcm1hdCgKLWxvbmcKLWphdmEubGFuZy5TdHJpbmdCdWZmZXIKLWphdmEudGV4dC5GaWVsZFBvc2l0aW9uKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBmb3JtYXQoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuU3RyaW5nQnVmZmVyCi1qYXZhLnRleHQuRmllbGRQb3NpdGlvbikKLQotcHVibGljIGphdmEudXRpbC5DdXJyZW5jeSBnZXRDdXJyZW5jeSgpCi0KLXB1YmxpYyBpbnQgZ2V0TWF4aW11bUZyYWN0aW9uRGlnaXRzKCkKLQotcHVibGljIGludCBnZXRNYXhpbXVtSW50ZWdlckRpZ2l0cygpCi0KLXB1YmxpYyBpbnQgZ2V0TWluaW11bUZyYWN0aW9uRGlnaXRzKCkKLQotcHVibGljIGludCBnZXRNaW5pbXVtSW50ZWdlckRpZ2l0cygpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0dyb3VwaW5nVXNlZCgpCi0KLXB1YmxpYyBib29sZWFuIGlzUGFyc2VJbnRlZ2VyT25seSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvdGV4dC9QYXJzZUV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5OdW1iZXIgcGFyc2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLk51bWJlciBwYXJzZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudGV4dC5QYXJzZVBvc2l0aW9uKQotCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLk9iamVjdCBwYXJzZU9iamVjdCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudGV4dC5QYXJzZVBvc2l0aW9uKQotCi1wdWJsaWMgdm9pZCBzZXRDdXJyZW5jeSgKLWphdmEudXRpbC5DdXJyZW5jeSkKLQotcHVibGljIHZvaWQgc2V0R3JvdXBpbmdVc2VkKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0TWF4aW11bUZyYWN0aW9uRGlnaXRzKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRNYXhpbXVtSW50ZWdlckRpZ2l0cygKLWludCkKLQotcHVibGljIHZvaWQgc2V0TWluaW11bUZyYWN0aW9uRGlnaXRzKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRNaW5pbXVtSW50ZWdlckRpZ2l0cygKLWludCkKLQotcHVibGljIHZvaWQgc2V0UGFyc2VJbnRlZ2VyT25seSgKLWJvb2xlYW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgY29tLmlibS5pY3U0am5pLnRleHQuRGVjaW1hbEZvcm1hdCBleHRlbmRzIGphdmEudGV4dC5OdW1iZXJGb3JtYXQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBpbnQgYWRkcgotCi1wcml2YXRlIGJ5dGUgbWluRXhwb25lbnREaWdpdHMKLQotcHJpdmF0ZSBjb20uaWJtLmljdTRqbmkudGV4dC5EZWNpbWFsRm9ybWF0U3ltYm9scyBzeW1ib2xzCi0KLXByaXZhdGUgYm9vbGVhbiB1c2VFeHBvbmVudGlhbE5vdGF0aW9uCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotY29tLmlibS5pY3U0am5pLnRleHQuRGVjaW1hbEZvcm1hdFN5bWJvbHMpCi0KLXByb3RlY3RlZCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRGaWVsZFR5cGUoCi1qYXZhLnRleHQuRm9ybWF0JEZpZWxkKQotCi1wdWJsaWMgdm9pZCBhcHBseUxvY2FsaXplZFBhdHRlcm4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBhcHBseVBhdHRlcm4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBjbG9uZSgpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIGZvcm1hdCgKLWRvdWJsZQotamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgotamF2YS50ZXh0LkZpZWxkUG9zaXRpb24pCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIGZvcm1hdCgKLWxvbmcKLWphdmEubGFuZy5TdHJpbmdCdWZmZXIKLWphdmEudGV4dC5GaWVsZFBvc2l0aW9uKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBmb3JtYXQoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuU3RyaW5nQnVmZmVyCi1qYXZhLnRleHQuRmllbGRQb3NpdGlvbikKLQotcHVibGljIGphdmEudGV4dC5BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IgZm9ybWF0VG9DaGFyYWN0ZXJJdGVyYXRvcigKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBqYXZhLnV0aWwuQ3VycmVuY3kgZ2V0Q3VycmVuY3koKQotCi1wdWJsaWMgY29tLmlibS5pY3U0am5pLnRleHQuRGVjaW1hbEZvcm1hdFN5bWJvbHMgZ2V0RGVjaW1hbEZvcm1hdFN5bWJvbHMoKQotCi1wcm90ZWN0ZWQgamF2YS50ZXh0LkZvcm1hdCRGaWVsZCBnZXRGaWVsZCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBpbnQgZ2V0R3JvdXBpbmdTaXplKCkKLQotcHVibGljIGludCBnZXRNYXhpbXVtRnJhY3Rpb25EaWdpdHMoKQotCi1wdWJsaWMgaW50IGdldE1heGltdW1JbnRlZ2VyRGlnaXRzKCkKLQotcHVibGljIGludCBnZXRNaW5pbXVtRnJhY3Rpb25EaWdpdHMoKQotCi1wdWJsaWMgaW50IGdldE1pbmltdW1JbnRlZ2VyRGlnaXRzKCkKLQotcHVibGljIGludCBnZXRNdWx0aXBsaWVyKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TmVnYXRpdmVQcmVmaXgoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXROZWdhdGl2ZVN1ZmZpeCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFBvc2l0aXZlUHJlZml4KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UG9zaXRpdmVTdWZmaXgoKQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLQotcHVibGljIGJvb2xlYW4gaXNEZWNpbWFsU2VwYXJhdG9yQWx3YXlzU2hvd24oKQotCi1wdWJsaWMgYm9vbGVhbiBpc0dyb3VwaW5nVXNlZCgpCi0KLXB1YmxpYyBib29sZWFuIGlzUGFyc2VJbnRlZ2VyT25seSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuTnVtYmVyIHBhcnNlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS50ZXh0LlBhcnNlUG9zaXRpb24pCi0KLXB1YmxpYyB2b2lkIHNldEN1cnJlbmN5KAotamF2YS51dGlsLkN1cnJlbmN5KQotCi1wdWJsaWMgdm9pZCBzZXREZWNpbWFsRm9ybWF0U3ltYm9scygKLWNvbS5pYm0uaWN1NGpuaS50ZXh0LkRlY2ltYWxGb3JtYXRTeW1ib2xzKQotCi1wdWJsaWMgdm9pZCBzZXREZWNpbWFsU2VwYXJhdG9yQWx3YXlzU2hvd24oCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRHcm91cGluZ1NpemUoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldEdyb3VwaW5nVXNlZCgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldE1heGltdW1GcmFjdGlvbkRpZ2l0cygKLWludCkKLQotcHVibGljIHZvaWQgc2V0TWF4aW11bUludGVnZXJEaWdpdHMoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldE1pbmltdW1GcmFjdGlvbkRpZ2l0cygKLWludCkKLQotcHVibGljIHZvaWQgc2V0TWluaW11bUludGVnZXJEaWdpdHMoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldE11bHRpcGxpZXIoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldE5lZ2F0aXZlUHJlZml4KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0TmVnYXRpdmVTdWZmaXgoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRQYXJzZUludGVnZXJPbmx5KAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0UG9zaXRpdmVQcmVmaXgoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRQb3NpdGl2ZVN1ZmZpeCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvTG9jYWxpemVkUGF0dGVybigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvUGF0dGVybigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS9sYW5nL09iamVjdDsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb24gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVRUOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLk9iamVjdCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS9zZWN1cml0eS9Qcml2aWxlZ2VkQWN0aW9uPExqYXZhL3V0aWwvUmVzb3VyY2VCdW5kbGU7PjsgKQotIGNsYXNzIGNvbS5pYm0uaWN1NGpuaS50ZXh0LkRlY2ltYWxGb3JtYXRTeW1ib2xzJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGNvbS5pYm0uaWN1NGpuaS50ZXh0LkRlY2ltYWxGb3JtYXRTeW1ib2xzIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWNvbS5pYm0uaWN1NGpuaS50ZXh0LkRlY2ltYWxGb3JtYXRTeW1ib2xzKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBydW4oKQotCi1wdWJsaWMgamF2YS51dGlsLlJlc291cmNlQnVuZGxlIHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgY29tLmlibS5pY3U0am5pLnRleHQuRGVjaW1hbEZvcm1hdFN5bWJvbHMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgaW50IGFkZHIKLQotcHJpdmF0ZSBqYXZhLnV0aWwuTG9jYWxlIGxvYwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1pbnQKLWphdmEudXRpbC5Mb2NhbGUpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEudXRpbC5Mb2NhbGUpCi0KLXN0YXRpYyBqYXZhLnV0aWwuTG9jYWxlIGFjY2VzcyQwMDAoCi1jb20uaWJtLmljdTRqbmkudGV4dC5EZWNpbWFsRm9ybWF0U3ltYm9scykKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgY2xvbmUoKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpCi0KLSBpbnQgZ2V0QWRkcigpCi0KLXB1YmxpYyBqYXZhLnV0aWwuQ3VycmVuY3kgZ2V0Q3VycmVuY3koKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRDdXJyZW5jeVN5bWJvbCgpCi0KLXB1YmxpYyBjaGFyIGdldERlY2ltYWxTZXBhcmF0b3IoKQotCi1wdWJsaWMgY2hhciBnZXREaWdpdCgpCi0KLXB1YmxpYyBjaGFyIGdldEdyb3VwaW5nU2VwYXJhdG9yKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SW5maW5pdHkoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJbnRlcm5hdGlvbmFsQ3VycmVuY3lTeW1ib2woKQotCi0gamF2YS51dGlsLkxvY2FsZSBnZXRMb2NhbGUoKQotCi1wdWJsaWMgY2hhciBnZXRNaW51c1NpZ24oKQotCi1wdWJsaWMgY2hhciBnZXRNb25ldGFyeURlY2ltYWxTZXBhcmF0b3IoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXROYU4oKQotCi1wdWJsaWMgY2hhciBnZXRQYXR0ZXJuU2VwYXJhdG9yKCkKLQotcHVibGljIGNoYXIgZ2V0UGVyTWlsbCgpCi0KLXB1YmxpYyBjaGFyIGdldFBlcmNlbnQoKQotCi1wdWJsaWMgY2hhciBnZXRaZXJvRGlnaXQoKQotCi1wdWJsaWMgdm9pZCBzZXRDdXJyZW5jeSgKLWphdmEudXRpbC5DdXJyZW5jeSkKLQotcHVibGljIHZvaWQgc2V0Q3VycmVuY3lTeW1ib2woCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXREZWNpbWFsU2VwYXJhdG9yKAotY2hhcikKLQotcHVibGljIHZvaWQgc2V0RGlnaXQoCi1jaGFyKQotCi1wdWJsaWMgdm9pZCBzZXRHcm91cGluZ1NlcGFyYXRvcigKLWNoYXIpCi0KLXB1YmxpYyB2b2lkIHNldEluZmluaXR5KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0SW50ZXJuYXRpb25hbEN1cnJlbmN5U3ltYm9sKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0TWludXNTaWduKAotY2hhcikKLQotcHVibGljIHZvaWQgc2V0TW9uZXRhcnlEZWNpbWFsU2VwYXJhdG9yKAotY2hhcikKLQotcHVibGljIHZvaWQgc2V0TmFOKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0UGF0dGVyblNlcGFyYXRvcigKLWNoYXIpCi0KLXB1YmxpYyB2b2lkIHNldFBlck1pbGwoCi1jaGFyKQotCi1wdWJsaWMgdm9pZCBzZXRQZXJjZW50KAotY2hhcikKLQotcHVibGljIHZvaWQgc2V0WmVyb0RpZ2l0KAotY2hhcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBjb20uaWJtLmljdTRqbmkudGV4dC5OYXRpdmVCcmVha0l0ZXJhdG9yIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXN0YXRpYyBuYXRpdmUgaW50IGNsb25lSW1wbCgKLWludCkKLQotc3RhdGljIG5hdGl2ZSB2b2lkIGNsb3NlQnJlYWtJdGVyYXRvckltcGwoCi1pbnQpCi0KLXN0YXRpYyBuYXRpdmUgaW50IGN1cnJlbnRJbXBsKAotaW50KQotCi1zdGF0aWMgbmF0aXZlIGludCBmaXJzdEltcGwoCi1pbnQpCi0KLXN0YXRpYyBuYXRpdmUgaW50IGZvbGxvd2luZ0ltcGwoCi1pbnQKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBnZXRBdmFpbGFibGVMb2NhbGVzQ291bnRJbXBsKCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGphdmEubGFuZy5TdHJpbmcgZ2V0QXZhaWxhYmxlTG9jYWxlc0ltcGwoCi1pbnQpCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0QXZhaWxhYmxlTG9jYWxlc0ltcGwoKQotCi1zdGF0aWMgbmF0aXZlIGludCBnZXRDaGFyYWN0ZXJJbnN0YW5jZUltcGwoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1zdGF0aWMgbmF0aXZlIGludCBnZXRMaW5lSW5zdGFuY2VJbXBsKAotamF2YS5sYW5nLlN0cmluZykKLQotc3RhdGljIG5hdGl2ZSBpbnQgZ2V0U2VudGVuY2VJbnN0YW5jZUltcGwoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1zdGF0aWMgbmF0aXZlIGludCBnZXRXb3JkSW5zdGFuY2VJbXBsKAotamF2YS5sYW5nLlN0cmluZykKLQotc3RhdGljIG5hdGl2ZSBib29sZWFuIGlzQm91bmRhcnlJbXBsKAotaW50Ci1pbnQpCi0KLXN0YXRpYyBuYXRpdmUgaW50IGxhc3RJbXBsKAotaW50KQotCi1zdGF0aWMgbmF0aXZlIGludCBuZXh0SW1wbCgKLWludAotaW50KQotCi1zdGF0aWMgbmF0aXZlIGludCBwcmVjZWRpbmdJbXBsKAotaW50Ci1pbnQpCi0KLXN0YXRpYyBuYXRpdmUgaW50IHByZXZpb3VzSW1wbCgKLWludCkKLQotc3RhdGljIG5hdGl2ZSB2b2lkIHNldFRleHRJbXBsKAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIGNvbS5pYm0uaWN1NGpuaS50ZXh0Lk5hdGl2ZUNvbGxhdGlvbiBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1zdGF0aWMgbmF0aXZlIHZvaWQgY2xvc2VDb2xsYXRvcigKLWludCkKLQotc3RhdGljIG5hdGl2ZSB2b2lkIGNsb3NlRWxlbWVudHMoCi1pbnQpCi0KLXN0YXRpYyBuYXRpdmUgaW50IGNvbXBhcmUoCi1pbnQKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXN0YXRpYyBuYXRpdmUgaW50IGdldEF0dHJpYnV0ZSgKLWludAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IGdldEF2YWlsYWJsZUxvY2FsZXNDb3VudEltcGwoKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgamF2YS5sYW5nLlN0cmluZyBnZXRBdmFpbGFibGVMb2NhbGVzSW1wbCgKLWludCkKLQotc3RhdGljIGphdmEubGFuZy5TdHJpbmdbXSBnZXRBdmFpbGFibGVMb2NhbGVzSW1wbCgpCi0KLXN0YXRpYyBuYXRpdmUgaW50IGdldENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcigKLWludAotamF2YS5sYW5nLlN0cmluZykKLQotc3RhdGljIG5hdGl2ZSBpbnQgZ2V0TWF4RXhwYW5zaW9uKAotaW50Ci1pbnQpCi0KLXN0YXRpYyBuYXRpdmUgaW50IGdldE5vcm1hbGl6YXRpb24oCi1pbnQpCi0KLXN0YXRpYyBuYXRpdmUgaW50IGdldE9mZnNldCgKLWludCkKLQotc3RhdGljIG5hdGl2ZSBqYXZhLmxhbmcuU3RyaW5nIGdldFJ1bGVzKAotaW50KQotCi1zdGF0aWMgbmF0aXZlIGJ5dGVbXSBnZXRTb3J0S2V5KAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1zdGF0aWMgbmF0aXZlIGludCBoYXNoQ29kZSgKLWludCkKLQotc3RhdGljIG5hdGl2ZSBpbnQgbmV4dCgKLWludCkKLQotc3RhdGljIG5hdGl2ZSBpbnQgb3BlbkNvbGxhdG9yKCkKLQotc3RhdGljIG5hdGl2ZSBpbnQgb3BlbkNvbGxhdG9yKAotamF2YS5sYW5nLlN0cmluZykKLQotc3RhdGljIG5hdGl2ZSBpbnQgb3BlbkNvbGxhdG9yRnJvbVJ1bGVzKAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQpCi0KLXN0YXRpYyBuYXRpdmUgaW50IHByZXZpb3VzKAotaW50KQotCi1zdGF0aWMgbmF0aXZlIHZvaWQgcmVzZXQoCi1pbnQpCi0KLXN0YXRpYyBuYXRpdmUgaW50IHNhZmVDbG9uZSgKLWludCkKLQotc3RhdGljIG5hdGl2ZSB2b2lkIHNldEF0dHJpYnV0ZSgKLWludAotaW50Ci1pbnQpCi0KLXN0YXRpYyBuYXRpdmUgdm9pZCBzZXROb3JtYWxpemF0aW9uKAotaW50Ci1pbnQpCi0KLXN0YXRpYyBuYXRpdmUgdm9pZCBzZXRPZmZzZXQoCi1pbnQKLWludCkKLQotc3RhdGljIG5hdGl2ZSB2b2lkIHNldFRleHQoCi1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxFOkxqYXZhL2xhbmcvRW51bTxURTs+Oz5MamF2YS9sYW5nL09iamVjdDtMamF2YS9pby9TZXJpYWxpemFibGU7TGphdmEvbGFuZy9Db21wYXJhYmxlPFRFOz47ICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZhLmxhbmcuRW51bSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgamF2YS5sYW5nLkNvbXBhcmFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBuYW1lCi0KLXByaXZhdGUgZmluYWwgaW50IG9yZGluYWwKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFQ6TGphdmEvbGFuZy9FbnVtPFRUOz47PihMamF2YS9sYW5nL0NsYXNzPFRUOz47KVtUVDsgKQotc3RhdGljIGphdmEubGFuZy5FbnVtW10gZ2V0VmFsdWVzKAotamF2YS5sYW5nLkNsYXNzKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvRW51bTxUVDs+Oz4oTGphdmEvbGFuZy9DbGFzczxUVDs+O0xqYXZhL2xhbmcvU3RyaW5nOylUVDsgKQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuRW51bSB2YWx1ZU9mKAotamF2YS5sYW5nLkNsYXNzCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb247ICkKLXByb3RlY3RlZCBmaW5hbCBqYXZhLmxhbmcuT2JqZWN0IGNsb25lKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEU7KUkgKQotcHVibGljIGZpbmFsIGludCBjb21wYXJlVG8oCi1qYXZhLmxhbmcuRW51bSkKLQotcHVibGljIHZvbGF0aWxlIGludCBjb21wYXJlVG8oCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvbGFuZy9DbGFzczxURTs+OyApCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLkNsYXNzIGdldERlY2xhcmluZ0NsYXNzKCkKLQotcHVibGljIGZpbmFsIGludCBoYXNoQ29kZSgpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIG5hbWUoKQotCi1wdWJsaWMgZmluYWwgaW50IG9yZGluYWwoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvRW51bTxMY29tL2libS9pY3U0am5pL3RleHQvTmF0aXZlRGVjaW1hbEZvcm1hdCRVTnVtYmVyRm9ybWF0QXR0cmlidXRlOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTY0MDggbmFtZSA9VU51bWJlckZvcm1hdEF0dHJpYnV0ZSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2libS9pY3U0am5pL3RleHQvTmF0aXZlRGVjaW1hbEZvcm1hdDsgKQotZmluYWwgY2xhc3MgY29tLmlibS5pY3U0am5pLnRleHQuTmF0aXZlRGVjaW1hbEZvcm1hdCRVTnVtYmVyRm9ybWF0QXR0cmlidXRlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgY29tLmlibS5pY3U0am5pLnRleHQuTmF0aXZlRGVjaW1hbEZvcm1hdCRVTnVtYmVyRm9ybWF0QXR0cmlidXRlW10gJFZBTFVFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5pYm0uaWN1NGpuaS50ZXh0Lk5hdGl2ZURlY2ltYWxGb3JtYXQkVU51bWJlckZvcm1hdEF0dHJpYnV0ZSBVTlVNX0RFQ0lNQUxfQUxXQVlTX1NIT1dOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmlibS5pY3U0am5pLnRleHQuTmF0aXZlRGVjaW1hbEZvcm1hdCRVTnVtYmVyRm9ybWF0QXR0cmlidXRlIFVOVU1fRk9STUFUX1dJRFRICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmlibS5pY3U0am5pLnRleHQuTmF0aXZlRGVjaW1hbEZvcm1hdCRVTnVtYmVyRm9ybWF0QXR0cmlidXRlIFVOVU1fRlJBQ1RJT05fRElHSVRTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmlibS5pY3U0am5pLnRleHQuTmF0aXZlRGVjaW1hbEZvcm1hdCRVTnVtYmVyRm9ybWF0QXR0cmlidXRlIFVOVU1fR1JPVVBJTkdfU0laRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5pYm0uaWN1NGpuaS50ZXh0Lk5hdGl2ZURlY2ltYWxGb3JtYXQkVU51bWJlckZvcm1hdEF0dHJpYnV0ZSBVTlVNX0dST1VQSU5HX1VTRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uaWJtLmljdTRqbmkudGV4dC5OYXRpdmVEZWNpbWFsRm9ybWF0JFVOdW1iZXJGb3JtYXRBdHRyaWJ1dGUgVU5VTV9JTlRFR0VSX0RJR0lUUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5pYm0uaWN1NGpuaS50ZXh0Lk5hdGl2ZURlY2ltYWxGb3JtYXQkVU51bWJlckZvcm1hdEF0dHJpYnV0ZSBVTlVNX0xFTklFTlRfUEFSU0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uaWJtLmljdTRqbmkudGV4dC5OYXRpdmVEZWNpbWFsRm9ybWF0JFVOdW1iZXJGb3JtYXRBdHRyaWJ1dGUgVU5VTV9NQVhfRlJBQ1RJT05fRElHSVRTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmlibS5pY3U0am5pLnRleHQuTmF0aXZlRGVjaW1hbEZvcm1hdCRVTnVtYmVyRm9ybWF0QXR0cmlidXRlIFVOVU1fTUFYX0lOVEVHRVJfRElHSVRTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmlibS5pY3U0am5pLnRleHQuTmF0aXZlRGVjaW1hbEZvcm1hdCRVTnVtYmVyRm9ybWF0QXR0cmlidXRlIFVOVU1fTUFYX1NJR05JRklDQU5UX0RJR0lUUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5pYm0uaWN1NGpuaS50ZXh0Lk5hdGl2ZURlY2ltYWxGb3JtYXQkVU51bWJlckZvcm1hdEF0dHJpYnV0ZSBVTlVNX01JTl9GUkFDVElPTl9ESUdJVFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uaWJtLmljdTRqbmkudGV4dC5OYXRpdmVEZWNpbWFsRm9ybWF0JFVOdW1iZXJGb3JtYXRBdHRyaWJ1dGUgVU5VTV9NSU5fSU5URUdFUl9ESUdJVFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uaWJtLmljdTRqbmkudGV4dC5OYXRpdmVEZWNpbWFsRm9ybWF0JFVOdW1iZXJGb3JtYXRBdHRyaWJ1dGUgVU5VTV9NSU5fU0lHTklGSUNBTlRfRElHSVRTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmlibS5pY3U0am5pLnRleHQuTmF0aXZlRGVjaW1hbEZvcm1hdCRVTnVtYmVyRm9ybWF0QXR0cmlidXRlIFVOVU1fTVVMVElQTElFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5pYm0uaWN1NGpuaS50ZXh0Lk5hdGl2ZURlY2ltYWxGb3JtYXQkVU51bWJlckZvcm1hdEF0dHJpYnV0ZSBVTlVNX1BBRERJTkdfUE9TSVRJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uaWJtLmljdTRqbmkudGV4dC5OYXRpdmVEZWNpbWFsRm9ybWF0JFVOdW1iZXJGb3JtYXRBdHRyaWJ1dGUgVU5VTV9QQVJTRV9JTlRfT05MWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5pYm0uaWN1NGpuaS50ZXh0Lk5hdGl2ZURlY2ltYWxGb3JtYXQkVU51bWJlckZvcm1hdEF0dHJpYnV0ZSBVTlVNX1JPVU5ESU5HX0lOQ1JFTUVOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5pYm0uaWN1NGpuaS50ZXh0Lk5hdGl2ZURlY2ltYWxGb3JtYXQkVU51bWJlckZvcm1hdEF0dHJpYnV0ZSBVTlVNX1JPVU5ESU5HX01PREUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uaWJtLmljdTRqbmkudGV4dC5OYXRpdmVEZWNpbWFsRm9ybWF0JFVOdW1iZXJGb3JtYXRBdHRyaWJ1dGUgVU5VTV9TRUNPTkRBUllfR1JPVVBJTkdfU0laRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5pYm0uaWN1NGpuaS50ZXh0Lk5hdGl2ZURlY2ltYWxGb3JtYXQkVU51bWJlckZvcm1hdEF0dHJpYnV0ZSBVTlVNX1NJR05JRklDQU5UX0RJR0lUU19VU0VECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpViApCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgc3RhdGljIGNvbS5pYm0uaWN1NGpuaS50ZXh0Lk5hdGl2ZURlY2ltYWxGb3JtYXQkVU51bWJlckZvcm1hdEF0dHJpYnV0ZSB2YWx1ZU9mKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBjb20uaWJtLmljdTRqbmkudGV4dC5OYXRpdmVEZWNpbWFsRm9ybWF0JFVOdW1iZXJGb3JtYXRBdHRyaWJ1dGVbXSB2YWx1ZXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTY0MDggbmFtZSA9VU51bWJlckZvcm1hdFN5bWJvbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2libS9pY3U0am5pL3RleHQvTmF0aXZlRGVjaW1hbEZvcm1hdDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvRW51bTxMY29tL2libS9pY3U0am5pL3RleHQvTmF0aXZlRGVjaW1hbEZvcm1hdCRVTnVtYmVyRm9ybWF0U3ltYm9sOz47ICkKLWZpbmFsIGNsYXNzIGNvbS5pYm0uaWN1NGpuaS50ZXh0Lk5hdGl2ZURlY2ltYWxGb3JtYXQkVU51bWJlckZvcm1hdFN5bWJvbCBleHRlbmRzIGphdmEubGFuZy5FbnVtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGNvbS5pYm0uaWN1NGpuaS50ZXh0Lk5hdGl2ZURlY2ltYWxGb3JtYXQkVU51bWJlckZvcm1hdFN5bWJvbFtdICRWQUxVRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uaWJtLmljdTRqbmkudGV4dC5OYXRpdmVEZWNpbWFsRm9ybWF0JFVOdW1iZXJGb3JtYXRTeW1ib2wgVU5VTV9DVVJSRU5DWV9TWU1CT0wKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uaWJtLmljdTRqbmkudGV4dC5OYXRpdmVEZWNpbWFsRm9ybWF0JFVOdW1iZXJGb3JtYXRTeW1ib2wgVU5VTV9ERUNJTUFMX1NFUEFSQVRPUl9TWU1CT0wKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uaWJtLmljdTRqbmkudGV4dC5OYXRpdmVEZWNpbWFsRm9ybWF0JFVOdW1iZXJGb3JtYXRTeW1ib2wgVU5VTV9ESUdJVF9TWU1CT0wKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uaWJtLmljdTRqbmkudGV4dC5OYXRpdmVEZWNpbWFsRm9ybWF0JFVOdW1iZXJGb3JtYXRTeW1ib2wgVU5VTV9FWFBPTkVOVElBTF9TWU1CT0wKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uaWJtLmljdTRqbmkudGV4dC5OYXRpdmVEZWNpbWFsRm9ybWF0JFVOdW1iZXJGb3JtYXRTeW1ib2wgVU5VTV9GT1JNQVRfU1lNQk9MX0NPVU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmlibS5pY3U0am5pLnRleHQuTmF0aXZlRGVjaW1hbEZvcm1hdCRVTnVtYmVyRm9ybWF0U3ltYm9sIFVOVU1fR1JPVVBJTkdfU0VQQVJBVE9SX1NZTUJPTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5pYm0uaWN1NGpuaS50ZXh0Lk5hdGl2ZURlY2ltYWxGb3JtYXQkVU51bWJlckZvcm1hdFN5bWJvbCBVTlVNX0lORklOSVRZX1NZTUJPTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5pYm0uaWN1NGpuaS50ZXh0Lk5hdGl2ZURlY2ltYWxGb3JtYXQkVU51bWJlckZvcm1hdFN5bWJvbCBVTlVNX0lOVExfQ1VSUkVOQ1lfU1lNQk9MCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmlibS5pY3U0am5pLnRleHQuTmF0aXZlRGVjaW1hbEZvcm1hdCRVTnVtYmVyRm9ybWF0U3ltYm9sIFVOVU1fTUlOVVNfU0lHTl9TWU1CT0wKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uaWJtLmljdTRqbmkudGV4dC5OYXRpdmVEZWNpbWFsRm9ybWF0JFVOdW1iZXJGb3JtYXRTeW1ib2wgVU5VTV9NT05FVEFSWV9HUk9VUElOR19TRVBBUkFUT1JfU1lNQk9MCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmlibS5pY3U0am5pLnRleHQuTmF0aXZlRGVjaW1hbEZvcm1hdCRVTnVtYmVyRm9ybWF0U3ltYm9sIFVOVU1fTU9ORVRBUllfU0VQQVJBVE9SX1NZTUJPTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5pYm0uaWN1NGpuaS50ZXh0Lk5hdGl2ZURlY2ltYWxGb3JtYXQkVU51bWJlckZvcm1hdFN5bWJvbCBVTlVNX05BTl9TWU1CT0wKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uaWJtLmljdTRqbmkudGV4dC5OYXRpdmVEZWNpbWFsRm9ybWF0JFVOdW1iZXJGb3JtYXRTeW1ib2wgVU5VTV9QQURfRVNDQVBFX1NZTUJPTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5pYm0uaWN1NGpuaS50ZXh0Lk5hdGl2ZURlY2ltYWxGb3JtYXQkVU51bWJlckZvcm1hdFN5bWJvbCBVTlVNX1BBVFRFUk5fU0VQQVJBVE9SX1NZTUJPTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5pYm0uaWN1NGpuaS50ZXh0Lk5hdGl2ZURlY2ltYWxGb3JtYXQkVU51bWJlckZvcm1hdFN5bWJvbCBVTlVNX1BFUkNFTlRfU1lNQk9MCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmlibS5pY3U0am5pLnRleHQuTmF0aXZlRGVjaW1hbEZvcm1hdCRVTnVtYmVyRm9ybWF0U3ltYm9sIFVOVU1fUEVSTUlMTF9TWU1CT0wKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uaWJtLmljdTRqbmkudGV4dC5OYXRpdmVEZWNpbWFsRm9ybWF0JFVOdW1iZXJGb3JtYXRTeW1ib2wgVU5VTV9QTFVTX1NJR05fU1lNQk9MCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmlibS5pY3U0am5pLnRleHQuTmF0aXZlRGVjaW1hbEZvcm1hdCRVTnVtYmVyRm9ybWF0U3ltYm9sIFVOVU1fU0lHTklGSUNBTlRfRElHSVRfU1lNQk9MCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmlibS5pY3U0am5pLnRleHQuTmF0aXZlRGVjaW1hbEZvcm1hdCRVTnVtYmVyRm9ybWF0U3ltYm9sIFVOVU1fWkVST19ESUdJVF9TWU1CT0wKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClWICkKLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgY29tLmlibS5pY3U0am5pLnRleHQuTmF0aXZlRGVjaW1hbEZvcm1hdCRVTnVtYmVyRm9ybWF0U3ltYm9sIHZhbHVlT2YoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGNvbS5pYm0uaWN1NGpuaS50ZXh0Lk5hdGl2ZURlY2ltYWxGb3JtYXQkVU51bWJlckZvcm1hdFN5bWJvbFtdIHZhbHVlcygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNjQwOCBuYW1lID1VTnVtYmVyRm9ybWF0VGV4dEF0dHJpYnV0ZSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2libS9pY3U0am5pL3RleHQvTmF0aXZlRGVjaW1hbEZvcm1hdDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvRW51bTxMY29tL2libS9pY3U0am5pL3RleHQvTmF0aXZlRGVjaW1hbEZvcm1hdCRVTnVtYmVyRm9ybWF0VGV4dEF0dHJpYnV0ZTs+OyApCi1maW5hbCBjbGFzcyBjb20uaWJtLmljdTRqbmkudGV4dC5OYXRpdmVEZWNpbWFsRm9ybWF0JFVOdW1iZXJGb3JtYXRUZXh0QXR0cmlidXRlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgY29tLmlibS5pY3U0am5pLnRleHQuTmF0aXZlRGVjaW1hbEZvcm1hdCRVTnVtYmVyRm9ybWF0VGV4dEF0dHJpYnV0ZVtdICRWQUxVRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uaWJtLmljdTRqbmkudGV4dC5OYXRpdmVEZWNpbWFsRm9ybWF0JFVOdW1iZXJGb3JtYXRUZXh0QXR0cmlidXRlIFVOVU1fQ1VSUkVOQ1lfQ09ERQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5pYm0uaWN1NGpuaS50ZXh0Lk5hdGl2ZURlY2ltYWxGb3JtYXQkVU51bWJlckZvcm1hdFRleHRBdHRyaWJ1dGUgVU5VTV9ERUZBVUxUX1JVTEVTRVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uaWJtLmljdTRqbmkudGV4dC5OYXRpdmVEZWNpbWFsRm9ybWF0JFVOdW1iZXJGb3JtYXRUZXh0QXR0cmlidXRlIFVOVU1fTkVHQVRJVkVfUFJFRklYCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmlibS5pY3U0am5pLnRleHQuTmF0aXZlRGVjaW1hbEZvcm1hdCRVTnVtYmVyRm9ybWF0VGV4dEF0dHJpYnV0ZSBVTlVNX05FR0FUSVZFX1NVRkZJWAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5pYm0uaWN1NGpuaS50ZXh0Lk5hdGl2ZURlY2ltYWxGb3JtYXQkVU51bWJlckZvcm1hdFRleHRBdHRyaWJ1dGUgVU5VTV9QQURESU5HX0NIQVJBQ1RFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5pYm0uaWN1NGpuaS50ZXh0Lk5hdGl2ZURlY2ltYWxGb3JtYXQkVU51bWJlckZvcm1hdFRleHRBdHRyaWJ1dGUgVU5VTV9QT1NJVElWRV9QUkVGSVgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjb20uaWJtLmljdTRqbmkudGV4dC5OYXRpdmVEZWNpbWFsRm9ybWF0JFVOdW1iZXJGb3JtYXRUZXh0QXR0cmlidXRlIFVOVU1fUE9TSVRJVkVfU1VGRklYCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmlibS5pY3U0am5pLnRleHQuTmF0aXZlRGVjaW1hbEZvcm1hdCRVTnVtYmVyRm9ybWF0VGV4dEF0dHJpYnV0ZSBVTlVNX1BVQkxJQ19SVUxFU0VUUwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVYgKQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIHN0YXRpYyBjb20uaWJtLmljdTRqbmkudGV4dC5OYXRpdmVEZWNpbWFsRm9ybWF0JFVOdW1iZXJGb3JtYXRUZXh0QXR0cmlidXRlIHZhbHVlT2YoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGNvbS5pYm0uaWN1NGpuaS50ZXh0Lk5hdGl2ZURlY2ltYWxGb3JtYXQkVU51bWJlckZvcm1hdFRleHRBdHRyaWJ1dGVbXSB2YWx1ZXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGNvbS9pYm0vaWN1NGpuaS90ZXh0L05hdGl2ZURlY2ltYWxGb3JtYXQkVU51bWJlckZvcm1hdFRleHRBdHRyaWJ1dGU7TGNvbS9pYm0vaWN1NGpuaS90ZXh0L05hdGl2ZURlY2ltYWxGb3JtYXQkVU51bWJlckZvcm1hdEF0dHJpYnV0ZTtMY29tL2libS9pY3U0am5pL3RleHQvTmF0aXZlRGVjaW1hbEZvcm1hdCRVTnVtYmVyRm9ybWF0U3ltYm9sOyApCi1wdWJsaWMgZmluYWwgY2xhc3MgY29tLmlibS5pY3U0am5pLnRleHQuTmF0aXZlRGVjaW1hbEZvcm1hdCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1zdGF0aWMgbmF0aXZlIHZvaWQgYXBwbHlQYXR0ZXJuSW1wbCgKLWludAotYm9vbGVhbgotamF2YS5sYW5nLlN0cmluZykKLQotc3RhdGljIG5hdGl2ZSBpbnQgY2xvbmVJbXBsKAotaW50KQotCi1zdGF0aWMgbmF0aXZlIHZvaWQgY2xvc2VEZWNpbWFsRm9ybWF0SW1wbCgKLWludCkKLQotc3RhdGljIG5hdGl2ZSBqYXZhLmxhbmcuU3RyaW5nIGZvcm1hdCgKLWludAotZG91YmxlCi1qYXZhLnRleHQuRmllbGRQb3NpdGlvbgotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZ0J1ZmZlcikKLQotc3RhdGljIG5hdGl2ZSBqYXZhLmxhbmcuU3RyaW5nIGZvcm1hdCgKLWludAotbG9uZwotamF2YS50ZXh0LkZpZWxkUG9zaXRpb24KLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmdCdWZmZXIpCi0KLXN0YXRpYyBuYXRpdmUgamF2YS5sYW5nLlN0cmluZyBmb3JtYXQoCi1pbnQKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudGV4dC5GaWVsZFBvc2l0aW9uCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nQnVmZmVyCi1pbnQpCi0KLXN0YXRpYyBuYXRpdmUgaW50IGdldEF0dHJpYnV0ZSgKLWludAotaW50KQotCi1zdGF0aWMgbmF0aXZlIGphdmEubGFuZy5TdHJpbmcgZ2V0U3ltYm9sKAotaW50Ci1pbnQpCi0KLXN0YXRpYyBuYXRpdmUgamF2YS5sYW5nLlN0cmluZyBnZXRUZXh0QXR0cmlidXRlKAotaW50Ci1pbnQpCi0KLXN0YXRpYyBuYXRpdmUgaW50IG9wZW5EZWNpbWFsRm9ybWF0SW1wbCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXN0YXRpYyBuYXRpdmUgamF2YS5sYW5nLk51bWJlciBwYXJzZSgKLWludAotamF2YS5sYW5nLlN0cmluZwotamF2YS50ZXh0LlBhcnNlUG9zaXRpb24pCi0KLXN0YXRpYyBuYXRpdmUgdm9pZCBzZXRBdHRyaWJ1dGUoCi1pbnQKLWludAotaW50KQotCi1zdGF0aWMgbmF0aXZlIHZvaWQgc2V0U3ltYm9sKAotaW50Ci1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi0KLXN0YXRpYyBuYXRpdmUgdm9pZCBzZXRUZXh0QXR0cmlidXRlKAotaW50Ci1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi0KLXN0YXRpYyBuYXRpdmUgamF2YS5sYW5nLlN0cmluZyB0b1BhdHRlcm5JbXBsKAotaW50Ci1ib29sZWFuKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGNvbS5pYm0uaWN1NGpuaS50ZXh0LlJ1bGVCYXNlZEJyZWFrSXRlcmF0b3IgZXh0ZW5kcyBjb20uaWJtLmljdTRqbmkudGV4dC5CcmVha0l0ZXJhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgaW50IGFkZHIKLQotcHJpdmF0ZSBqYXZhLnRleHQuQ2hhcmFjdGVySXRlcmF0b3IgY2hhckl0ZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1pbnQKLWludCkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgY2xvbmUoKQotCi1wdWJsaWMgaW50IGN1cnJlbnQoKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpCi0KLXB1YmxpYyBpbnQgZmlyc3QoKQotCi1wdWJsaWMgaW50IGZvbGxvd2luZygKLWludCkKLQotcHVibGljIGphdmEudGV4dC5DaGFyYWN0ZXJJdGVyYXRvciBnZXRUZXh0KCkKLQotcHVibGljIGJvb2xlYW4gaXNCb3VuZGFyeSgKLWludCkKLQotcHVibGljIGludCBsYXN0KCkKLQotcHVibGljIGludCBuZXh0KCkKLQotcHVibGljIGludCBuZXh0KAotaW50KQotCi1wdWJsaWMgaW50IHByZWNlZGluZygKLWludCkKLQotcHVibGljIGludCBwcmV2aW91cygpCi0KLXB1YmxpYyB2b2lkIHNldFRleHQoCi1qYXZhLnRleHQuQ2hhcmFjdGVySXRlcmF0b3IpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgY29tLmlibS5pY3U0am5pLnRleHQuUnVsZUJhc2VkQ29sbGF0b3IgZXh0ZW5kcyBjb20uaWJtLmljdTRqbmkudGV4dC5Db2xsYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGludCBtX2NvbGxhdG9yXwotCi1wcml2YXRlIGludCBtX2hhc2hjb2RlXwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvdGV4dC9QYXJzZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS90ZXh0L1BhcnNlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50KQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuTG9jYWxlKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBjbG9uZSgpCi0KLXB1YmxpYyBpbnQgY29tcGFyZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkKLQotcHVibGljIGludCBnZXRBdHRyaWJ1dGUoCi1pbnQpCi0KLXB1YmxpYyBjb20uaWJtLmljdTRqbmkudGV4dC5Db2xsYXRpb25FbGVtZW50SXRlcmF0b3IgZ2V0Q29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGNvbS5pYm0uaWN1NGpuaS50ZXh0LkNvbGxhdGlvbkVsZW1lbnRJdGVyYXRvciBnZXRDb2xsYXRpb25FbGVtZW50SXRlcmF0b3IoCi1qYXZhLnRleHQuQ2hhcmFjdGVySXRlcmF0b3IpCi0KLXB1YmxpYyBjb20uaWJtLmljdTRqbmkudGV4dC5Db2xsYXRpb25LZXkgZ2V0Q29sbGF0aW9uS2V5KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGludCBnZXREZWNvbXBvc2l0aW9uKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UnVsZXMoKQotCi1wdWJsaWMgYnl0ZVtdIGdldFNvcnRLZXkoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgaW50IGdldFN0cmVuZ3RoKCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZSgKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXREZWNvbXBvc2l0aW9uKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRTdHJlbmd0aCgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9FbnVtPExjb20vaWJtL2ljdTRqbmkvdGV4dC9SdWxlQmFzZWROdW1iZXJGb3JtYXQkUkJORlR5cGU7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9pYm0vaWN1NGpuaS90ZXh0L1J1bGVCYXNlZE51bWJlckZvcm1hdDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNjQwOSBuYW1lID1SQk5GVHlwZSApCi1wdWJsaWMgZmluYWwgY2xhc3MgY29tLmlibS5pY3U0am5pLnRleHQuUnVsZUJhc2VkTnVtYmVyRm9ybWF0JFJCTkZUeXBlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgY29tLmlibS5pY3U0am5pLnRleHQuUnVsZUJhc2VkTnVtYmVyRm9ybWF0JFJCTkZUeXBlW10gJFZBTFVFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5pYm0uaWN1NGpuaS50ZXh0LlJ1bGVCYXNlZE51bWJlckZvcm1hdCRSQk5GVHlwZSBEVVJBVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5pYm0uaWN1NGpuaS50ZXh0LlJ1bGVCYXNlZE51bWJlckZvcm1hdCRSQk5GVHlwZSBPUkRJTkFMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmlibS5pY3U0am5pLnRleHQuUnVsZUJhc2VkTnVtYmVyRm9ybWF0JFJCTkZUeXBlIFNQRUxMT1VUCi0KLSBpbnQgdHlwZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSSlWICkKLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBjb20uaWJtLmljdTRqbmkudGV4dC5SdWxlQmFzZWROdW1iZXJGb3JtYXQkUkJORlR5cGUgdmFsdWVPZigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgY29tLmlibS5pY3U0am5pLnRleHQuUnVsZUJhc2VkTnVtYmVyRm9ybWF0JFJCTkZUeXBlW10gdmFsdWVzKCkKLQotIGludCBnZXRUeXBlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxjb20vaWJtL2ljdTRqbmkvdGV4dC9SdWxlQmFzZWROdW1iZXJGb3JtYXQkUkJORlR5cGU7ICkKLXB1YmxpYyBjbGFzcyBjb20uaWJtLmljdTRqbmkudGV4dC5SdWxlQmFzZWROdW1iZXJGb3JtYXQgZXh0ZW5kcyBqYXZhLnRleHQuTnVtYmVyRm9ybWF0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgaW50IGFkZHIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBjbG9zZVJCTkZJbXBsKAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgamF2YS5sYW5nLlN0cmluZyBmb3JtYXRSQk5GSW1wbCgKLWludAotZG91YmxlCi1qYXZhLnRleHQuRmllbGRQb3NpdGlvbgotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZ0J1ZmZlcikKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGphdmEubGFuZy5TdHJpbmcgZm9ybWF0UkJORkltcGwoCi1pbnQKLWxvbmcKLWphdmEudGV4dC5GaWVsZFBvc2l0aW9uCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nQnVmZmVyKQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEZpZWxkVHlwZSgKLWphdmEudGV4dC5Gb3JtYXQkRmllbGQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgb3BlblJCTkZJbXBsKAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG9wZW5SQk5GSW1wbCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXN0YXRpYyBuYXRpdmUgamF2YS5sYW5nLk51bWJlciBwYXJzZVJCTkZJbXBsKAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnRleHQuUGFyc2VQb3NpdGlvbgotYm9vbGVhbikKLQotcHVibGljIHZvaWQgY2xvc2UoKQotCi1wcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIGZvcm1hdCgKLWRvdWJsZQotamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgotamF2YS50ZXh0LkZpZWxkUG9zaXRpb24pCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIGZvcm1hdCgKLWxvbmcKLWphdmEubGFuZy5TdHJpbmdCdWZmZXIKLWphdmEudGV4dC5GaWVsZFBvc2l0aW9uKQotCi1wdWJsaWMgdm9pZCBvcGVuKAotY29tLmlibS5pY3U0am5pLnRleHQuUnVsZUJhc2VkTnVtYmVyRm9ybWF0JFJCTkZUeXBlKQotCi1wdWJsaWMgdm9pZCBvcGVuKAotY29tLmlibS5pY3U0am5pLnRleHQuUnVsZUJhc2VkTnVtYmVyRm9ybWF0JFJCTkZUeXBlCi1qYXZhLnV0aWwuTG9jYWxlKQotCi1wdWJsaWMgdm9pZCBvcGVuKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgb3BlbigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudXRpbC5Mb2NhbGUpCi0KLXB1YmxpYyBqYXZhLmxhbmcuTnVtYmVyIHBhcnNlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS50ZXh0LlBhcnNlUG9zaXRpb24pCi0KLXB1YmxpYyBqYXZhLmxhbmcuTnVtYmVyIHBhcnNlTGVuaWVudCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudGV4dC5QYXJzZVBvc2l0aW9uKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9NDEwNCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vaWJtL2ljdTRqbmkvdXRpbC9SZXNvdXJjZXM7ICkKLSBjbGFzcyBjb20uaWJtLmljdTRqbmkudXRpbC5SZXNvdXJjZXMkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGphdmEvdXRpbC9SZXNvdXJjZUJ1bmRsZSRNaXNzaW5nQnVuZGxlOyApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgamF2YS51dGlsLlJlc291cmNlQnVuZGxlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUgTUlTU0lORwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUgTUlTU0lOR0JBU0UKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL1dlYWtIYXNoTWFwPExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3V0aWwvSGFzaHRhYmxlPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL3V0aWwvUmVzb3VyY2VCdW5kbGU7Pjs+OyApCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuV2Vha0hhc2hNYXAgY2FjaGUKLQotcHJpdmF0ZSBqYXZhLnV0aWwuTG9jYWxlIGxvY2FsZQotCi1wcm90ZWN0ZWQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlIHBhcmVudAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS91dGlsL01pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUgZ2V0QnVuZGxlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUgZ2V0QnVuZGxlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS51dGlsLkxvY2FsZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS91dGlsL01pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUgZ2V0QnVuZGxlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS51dGlsLkxvY2FsZQotamF2YS5sYW5nLkNsYXNzTG9hZGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3V0aWwvTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOyApCi1wcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUgZ2V0QnVuZGxlSW1wbCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudXRpbC5Mb2NhbGUKLWphdmEubGFuZy5DbGFzc0xvYWRlcikKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLlJlc291cmNlQnVuZGxlIGhhbmRsZUdldEJ1bmRsZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4KLWphdmEubGFuZy5DbGFzc0xvYWRlcikKLQotcHJpdmF0ZSB2b2lkIHNldExvY2FsZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgc3RyaXAoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9FbnVtZXJhdGlvbjxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLkVudW1lcmF0aW9uIGdldEtleXMoKQotCi1wdWJsaWMgamF2YS51dGlsLkxvY2FsZSBnZXRMb2NhbGUoKQotCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLk9iamVjdCBnZXRPYmplY3QoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBnZXRTdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLlN0cmluZ1tdIGdldFN0cmluZ0FycmF5KAotamF2YS5sYW5nLlN0cmluZykKLQotcHJvdGVjdGVkIGFic3RyYWN0IGphdmEubGFuZy5PYmplY3QgaGFuZGxlR2V0T2JqZWN0KAotamF2YS5sYW5nLlN0cmluZykKLQotcHJvdGVjdGVkIHZvaWQgc2V0UGFyZW50KAotamF2YS51dGlsLlJlc291cmNlQnVuZGxlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjYgbmFtZSA9Q291bnRyeSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2libS9pY3U0am5pL3V0aWwvUmVzb3VyY2VzOyApCi1maW5hbCBjbGFzcyBjb20uaWJtLmljdTRqbmkudXRpbC5SZXNvdXJjZXMkQ291bnRyeSBleHRlbmRzIGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbG9jYWxlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvRW51bWVyYXRpb248TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHVibGljIGphdmEudXRpbC5FbnVtZXJhdGlvbiBnZXRLZXlzKCkKLQotcHJvdGVjdGVkIGphdmEubGFuZy5PYmplY3QgaGFuZGxlR2V0T2JqZWN0KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI2IG5hbWUgPUN1cnJlbmN5ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vaWJtL2ljdTRqbmkvdXRpbC9SZXNvdXJjZXM7ICkKLWZpbmFsIGNsYXNzIGNvbS5pYm0uaWN1NGpuaS51dGlsLlJlc291cmNlcyRDdXJyZW5jeSBleHRlbmRzIGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbG9jYWxlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvRW51bWVyYXRpb248TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHVibGljIGphdmEudXRpbC5FbnVtZXJhdGlvbiBnZXRLZXlzKCkKLQotcHJvdGVjdGVkIGphdmEubGFuZy5PYmplY3QgaGFuZGxlR2V0T2JqZWN0KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2libS9pY3U0am5pL3V0aWwvUmVzb3VyY2VzOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI2IG5hbWUgPUlTTzNDb3VudHJpZXMgKQotZmluYWwgY2xhc3MgY29tLmlibS5pY3U0am5pLnV0aWwuUmVzb3VyY2VzJElTTzNDb3VudHJpZXMgZXh0ZW5kcyBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KAotY29tLmlibS5pY3U0am5pLnV0aWwuUmVzb3VyY2VzJDEpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0VudW1lcmF0aW9uPExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuRW51bWVyYXRpb24gZ2V0S2V5cygpCi0KLXByb3RlY3RlZCBqYXZhLmxhbmcuT2JqZWN0IGhhbmRsZUdldE9iamVjdCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGNvbS9pYm0vaWN1NGpuaS91dGlsL1Jlc291cmNlczsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNiBuYW1lID1JU08zTGFuZ3VhZ2VzICkKLWZpbmFsIGNsYXNzIGNvbS5pYm0uaWN1NGpuaS51dGlsLlJlc291cmNlcyRJU08zTGFuZ3VhZ2VzIGV4dGVuZHMgamF2YS51dGlsLlJlc291cmNlQnVuZGxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLSB2b2lkIDxpbml0PigKLWNvbS5pYm0uaWN1NGpuaS51dGlsLlJlc291cmNlcyQxKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9FbnVtZXJhdGlvbjxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wdWJsaWMgamF2YS51dGlsLkVudW1lcmF0aW9uIGdldEtleXMoKQotCi1wcm90ZWN0ZWQgamF2YS5sYW5nLk9iamVjdCBoYW5kbGVHZXRPYmplY3QoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vaWJtL2ljdTRqbmkvdXRpbC9SZXNvdXJjZXM7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjYgbmFtZSA9SVNPNEN1cnJlbmNpZXMgKQotZmluYWwgY2xhc3MgY29tLmlibS5pY3U0am5pLnV0aWwuUmVzb3VyY2VzJElTTzRDdXJyZW5jaWVzIGV4dGVuZHMgamF2YS51dGlsLlJlc291cmNlQnVuZGxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLSB2b2lkIDxpbml0PigKLWNvbS5pYm0uaWN1NGpuaS51dGlsLlJlc291cmNlcyQxKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9FbnVtZXJhdGlvbjxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wdWJsaWMgamF2YS51dGlsLkVudW1lcmF0aW9uIGdldEtleXMoKQotCi1wcm90ZWN0ZWQgamF2YS5sYW5nLk9iamVjdCBoYW5kbGVHZXRPYmplY3QoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vaWJtL2ljdTRqbmkvdXRpbC9SZXNvdXJjZXM7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjYgbmFtZSA9SVNPNEN1cnJlbmNpZXNUb0RpZ2l0cyApCi1maW5hbCBjbGFzcyBjb20uaWJtLmljdTRqbmkudXRpbC5SZXNvdXJjZXMkSVNPNEN1cnJlbmNpZXNUb0RpZ2l0cyBleHRlbmRzIGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi0gdm9pZCA8aW5pdD4oCi1jb20uaWJtLmljdTRqbmkudXRpbC5SZXNvdXJjZXMkMSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvRW51bWVyYXRpb248TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHVibGljIGphdmEudXRpbC5FbnVtZXJhdGlvbiBnZXRLZXlzKCkKLQotcHJvdGVjdGVkIGphdmEubGFuZy5PYmplY3QgaGFuZGxlR2V0T2JqZWN0KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI2IG5hbWUgPUxhbmd1YWdlICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxjb20vaWJtL2ljdTRqbmkvdXRpbC9SZXNvdXJjZXM7ICkKLWZpbmFsIGNsYXNzIGNvbS5pYm0uaWN1NGpuaS51dGlsLlJlc291cmNlcyRMYW5ndWFnZSBleHRlbmRzIGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbG9jYWxlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvRW51bWVyYXRpb248TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHVibGljIGphdmEudXRpbC5FbnVtZXJhdGlvbiBnZXRLZXlzKCkKLQotcHJvdGVjdGVkIGphdmEubGFuZy5PYmplY3QgaGFuZGxlR2V0T2JqZWN0KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZhLnV0aWwuTGlzdFJlc291cmNlQnVuZGxlIGV4dGVuZHMgamF2YS51dGlsLlJlc291cmNlQnVuZGxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNodGFibGU8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9PYmplY3Q7PjsgKQotIGphdmEudXRpbC5IYXNodGFibGUgdGFibGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVRhYmxlKCkKLQotcHJvdGVjdGVkIGFic3RyYWN0IGphdmEubGFuZy5PYmplY3RbXVtdIGdldENvbnRlbnRzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvRW51bWVyYXRpb248TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHVibGljIGphdmEudXRpbC5FbnVtZXJhdGlvbiBnZXRLZXlzKCkKLQotcHVibGljIGZpbmFsIGphdmEubGFuZy5PYmplY3QgaGFuZGxlR2V0T2JqZWN0KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI2IG5hbWUgPUxvY2FsZSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2libS9pY3U0am5pL3V0aWwvUmVzb3VyY2VzOyApCi1maW5hbCBjbGFzcyBjb20uaWJtLmljdTRqbmkudXRpbC5SZXNvdXJjZXMkTG9jYWxlIGV4dGVuZHMgamF2YS51dGlsLkxpc3RSZXNvdXJjZUJ1bmRsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbG9jYWxlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHJvdGVjdGVkIGphdmEubGFuZy5PYmplY3RbXVtdIGdldENvbnRlbnRzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MY29tL2libS9pY3U0am5pL3V0aWwvUmVzb3VyY2VzOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI2IG5hbWUgPVZhcmlhbnQgKQotZmluYWwgY2xhc3MgY29tLmlibS5pY3U0am5pLnV0aWwuUmVzb3VyY2VzJFZhcmlhbnQgZXh0ZW5kcyBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGxvY2FsZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0VudW1lcmF0aW9uPExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuRW51bWVyYXRpb24gZ2V0S2V5cygpCi0KLXByb3RlY3RlZCBqYXZhLmxhbmcuT2JqZWN0IGhhbmRsZUdldE9iamVjdCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MY29tL2libS9pY3U0am5pL3V0aWwvUmVzb3VyY2VzJDE7TGNvbS9pYm0vaWN1NGpuaS91dGlsL1Jlc291cmNlcyRMb2NhbGU7TGNvbS9pYm0vaWN1NGpuaS91dGlsL1Jlc291cmNlcyRWYXJpYW50O0xjb20vaWJtL2ljdTRqbmkvdXRpbC9SZXNvdXJjZXMkTGFuZ3VhZ2U7TGNvbS9pYm0vaWN1NGpuaS91dGlsL1Jlc291cmNlcyRDdXJyZW5jeTtMY29tL2libS9pY3U0am5pL3V0aWwvUmVzb3VyY2VzJENvdW50cnk7TGNvbS9pYm0vaWN1NGpuaS91dGlsL1Jlc291cmNlcyRJU080Q3VycmVuY2llc1RvRGlnaXRzO0xjb20vaWJtL2ljdTRqbmkvdXRpbC9SZXNvdXJjZXMkSVNPNEN1cnJlbmNpZXM7TGNvbS9pYm0vaWN1NGpuaS91dGlsL1Jlc291cmNlcyRJU08zTGFuZ3VhZ2VzO0xjb20vaWJtL2ljdTRqbmkvdXRpbC9SZXNvdXJjZXMkSVNPM0NvdW50cmllczsgKQotcHVibGljIGNsYXNzIGNvbS5pYm0uaWN1NGpuaS51dGlsLlJlc291cmNlcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZ1tdIGF2YWlsYWJsZUxvY2FsZXMKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZ1tdIGF2YWlsYWJsZVRpbWV6b25lcwotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nW11bXSBkZWZhdWx0VGltZXpvbmVOYW1lcwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGluaXRpYWxMb2NhbGUKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZ1tdIGlzb0NvdW50cmllcwotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nW10gaXNvTGFuZ3VhZ2VzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1zdGF0aWMgamF2YS5sYW5nLlN0cmluZyBhY2Nlc3MkMTAwMCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGFjY2VzcyQxMTAwKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotc3RhdGljIGphdmEubGFuZy5PYmplY3RbXVtdIGFjY2VzcyQxMjAwKAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotc3RhdGljIGphdmEubGFuZy5TdHJpbmcgYWNjZXNzJDQwMCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGFjY2VzcyQ1MDAoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1zdGF0aWMgamF2YS5sYW5nLlN0cmluZyBhY2Nlc3MkNjAwKAotamF2YS5sYW5nLlN0cmluZykKLQotc3RhdGljIGludCBhY2Nlc3MkNzAwKAotamF2YS5sYW5nLlN0cmluZykKLQotc3RhdGljIGphdmEubGFuZy5TdHJpbmcgYWNjZXNzJDgwMCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGFjY2VzcyQ5MDAoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nW11bXSBjcmVhdGVUaW1lWm9uZU5hbWVzRm9yKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0QXZhaWxhYmxlTG9jYWxlcygpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0QXZhaWxhYmxlTG9jYWxlc05hdGl2ZSgpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBqYXZhLmxhbmcuT2JqZWN0W11bXSBnZXRDb250ZW50SW1wbCgKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4pCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBqYXZhLmxhbmcuU3RyaW5nIGdldEN1cnJlbmN5Q29kZU5hdGl2ZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBqYXZhLmxhbmcuU3RyaW5nIGdldEN1cnJlbmN5U3ltYm9sTmF0aXZlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXREZWZhdWx0TG9jYWxlTmFtZSgpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBqYXZhLmxhbmcuU3RyaW5nIGdldERpc3BsYXlDb3VudHJ5TmF0aXZlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGphdmEubGFuZy5TdHJpbmcgZ2V0RGlzcGxheUxhbmd1YWdlTmF0aXZlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldERpc3BsYXlUaW1lWm9uZSgKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4KLWludAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGphdmEubGFuZy5TdHJpbmcgZ2V0RGlzcGxheVRpbWVab25lTmF0aXZlKAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbgotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmdbXVtdIGdldERpc3BsYXlUaW1lWm9uZXMoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgamF2YS5sYW5nLlN0cmluZyBnZXREaXNwbGF5VmFyaWFudE5hdGl2ZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgZ2V0RnJhY3Rpb25EaWdpdHNOYXRpdmUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgamF2YS5sYW5nLlN0cmluZyBnZXRJU08zQ291bnRyeU5hdGl2ZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBqYXZhLmxhbmcuU3RyaW5nIGdldElTTzNMYW5ndWFnZU5hdGl2ZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZ1tdIGdldElTT0NvdW50cmllcygpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0SVNPQ291bnRyaWVzTmF0aXZlKCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0SVNPTGFuZ3VhZ2VzKCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGphdmEubGFuZy5TdHJpbmdbXSBnZXRJU09MYW5ndWFnZXNOYXRpdmUoKQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZSBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZ1tdIGdldEtub3duVGltZXpvbmVzKCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgZ2V0VGltZVpvbmVzTmF0aXZlKAotamF2YS5sYW5nLlN0cmluZ1tdW10KLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL2xhbmcvQ2xhc3M8K0xqYXZhL2xhbmcvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uOz47ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuQ2xhc3MgYW5ub3RhdGlvblR5cGUoKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGhhc2hDb2RlKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb24gKHZhbHVlID1MamF2YS9sYW5nL2Fubm90YXRpb24vUmV0ZW50aW9uUG9saWN5OyFSVU5USU1FICkKLUBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQgKHZhbHVlID1MamF2YS9sYW5nL2Fubm90YXRpb24vRWxlbWVudFR5cGU7IUFOTk9UQVRJT05fVFlQRSApCi1hYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgZGFsdmlrLmFubm90YXRpb24uQW5ub3RhdGlvbkRlZmF1bHQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbiAodmFsdWUgPUxqYXZhL2xhbmcvYW5ub3RhdGlvbi9SZXRlbnRpb25Qb2xpY3k7IVJVTlRJTUUgKQotQGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldCAodmFsdWUgPUxqYXZhL2xhbmcvYW5ub3RhdGlvbi9FbGVtZW50VHlwZTshQU5OT1RBVElPTl9UWVBFICkKLWFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uICh2YWx1ZSA9TGphdmEvbGFuZy9hbm5vdGF0aW9uL1JldGVudGlvblBvbGljeTshUlVOVElNRSApCi1AamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0ICh2YWx1ZSA9TGphdmEvbGFuZy9hbm5vdGF0aW9uL0VsZW1lbnRUeXBlOyFBTk5PVEFUSU9OX1RZUEUgKQotYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0ICh2YWx1ZSA9TGphdmEvbGFuZy9hbm5vdGF0aW9uL0VsZW1lbnRUeXBlOyFBTk5PVEFUSU9OX1RZUEUgKQotQGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbiAodmFsdWUgPUxqYXZhL2xhbmcvYW5ub3RhdGlvbi9SZXRlbnRpb25Qb2xpY3k7IVJVTlRJTUUgKQotYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldCAodmFsdWUgPUxqYXZhL2xhbmcvYW5ub3RhdGlvbi9FbGVtZW50VHlwZTshQU5OT1RBVElPTl9UWVBFICkKLUBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb24gKHZhbHVlID1MamF2YS9sYW5nL2Fubm90YXRpb24vUmV0ZW50aW9uUG9saWN5OyFSVU5USU1FICkKLWFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQgKHZhbHVlID1MamF2YS9sYW5nL2Fubm90YXRpb24vRWxlbWVudFR5cGU7IUFOTk9UQVRJT05fVFlQRSApCi1AamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uICh2YWx1ZSA9TGphdmEvbGFuZy9hbm5vdGF0aW9uL1JldGVudGlvblBvbGljeTshUlVOVElNRSApCi1hYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRGVmYXVsdCAodmFsdWUgPUxkYWx2aWsvYW5ub3RhdGlvbi9UZXN0SW5mbzs6W2xldmVsID1MZGFsdmlrL2Fubm90YXRpb24vVGVzdExldmVsOyFQQVJUSUFMLCBwdXJwb3NlID1dICkKLUBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQgKHZhbHVlID1MamF2YS9sYW5nL2Fubm90YXRpb24vRWxlbWVudFR5cGU7IU1FVEhPRCApCi1AamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uICh2YWx1ZSA9TGphdmEvbGFuZy9hbm5vdGF0aW9uL1JldGVudGlvblBvbGljeTshUlVOVElNRSApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGRhbHZpay5hbm5vdGF0aW9uLlRlc3RJbmZvIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsIGxldmVsKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgcHVycG9zZSgpCi0KLXB1YmxpYyBhYnN0cmFjdCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0W10gdGFyZ2V0cygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvRW51bTxMZGFsdmlrL2Fubm90YXRpb24vVGVzdExldmVsOz47ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWwgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWxbXSAkVkFMVUVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsIENPTVBMRVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsIFBBUlRJQUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWwgUEFSVElBTF9PSwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbCBUT0RPCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpViApCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgc3RhdGljIGRhbHZpay5hbm5vdGF0aW9uLlRlc3RMZXZlbCB2YWx1ZU9mKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWxbXSB2YWx1ZXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQgKHZhbHVlID1MamF2YS9sYW5nL2Fubm90YXRpb24vRWxlbWVudFR5cGU7IUFOTk9UQVRJT05fVFlQRSApCi1AZGFsdmlrLmFubm90YXRpb24uQW5ub3RhdGlvbkRlZmF1bHQgKHZhbHVlID1MZGFsdmlrL2Fubm90YXRpb24vVGVzdFRhcmdldDs6W2NvbmNlcHROYW1lID0sIG1ldGhvZEFyZ3MgPSwgbWV0aG9kTmFtZSA9XSApCi1AamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uICh2YWx1ZSA9TGphdmEvbGFuZy9hbm5vdGF0aW9uL1JldGVudGlvblBvbGljeTshUlVOVElNRSApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGNvbmNlcHROYW1lKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVtMamF2YS9sYW5nL0NsYXNzPCo+OyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLkNsYXNzW10gbWV0aG9kQXJncygpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIG1ldGhvZE5hbWUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQgKHZhbHVlID1MamF2YS9sYW5nL2Fubm90YXRpb24vRWxlbWVudFR5cGU7IVRZUEUgKQotQGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbiAodmFsdWUgPUxqYXZhL2xhbmcvYW5ub3RhdGlvbi9SZXRlbnRpb25Qb2xpY3k7IVJVTlRJTUUgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0VGFyZ2V0Q2xhc3MgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS9sYW5nL0NsYXNzPCo+OyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLkNsYXNzIHZhbHVlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uICh2YWx1ZSA9TGphdmEvbGFuZy9hbm5vdGF0aW9uL1JldGVudGlvblBvbGljeTshUlVOVElNRSApCi1AamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0ICh2YWx1ZSA9TGphdmEvbGFuZy9hbm5vdGF0aW9uL0VsZW1lbnRUeXBlOyFBTk5PVEFUSU9OX1RZUEUgKQotYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgZGFsdmlrLmJ5dGVjb2RlLk9wY29kZXMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX0FERF9ET1VCTEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfQUREX0RPVUJMRV8yQUREUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9BRERfRkxPQVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfQUREX0ZMT0FUXzJBRERSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX0FERF9JTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfQUREX0lOVF8yQUREUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9BRERfSU5UX0xJVDE2Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX0FERF9JTlRfTElUOAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9BRERfTE9ORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9BRERfTE9OR18yQUREUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9BR0VUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX0FHRVRfQk9PTEVBTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9BR0VUX0JZVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfQUdFVF9DSEFSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX0FHRVRfT0JKRUNUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX0FHRVRfU0hPUlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfQUdFVF9XSURFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX0FORF9JTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfQU5EX0lOVF8yQUREUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9BTkRfSU5UX0xJVDE2Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX0FORF9JTlRfTElUOAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9BTkRfTE9ORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9BTkRfTE9OR18yQUREUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9BUFVUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX0FQVVRfQk9PTEVBTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9BUFVUX0JZVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfQVBVVF9DSEFSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX0FQVVRfT0JKRUNUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX0FQVVRfU0hPUlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfQVBVVF9XSURFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX0FSUkFZX0xFTkdUSAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9DSEVDS19DQVNUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX0NNUEdfRE9VQkxFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX0NNUEdfRkxPQVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfQ01QTF9ET1VCTEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfQ01QTF9GTE9BVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9DTVBfTE9ORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9DT05TVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9DT05TVF8xNgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9DT05TVF80Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX0NPTlNUX0NMQVNTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX0NPTlNUX0hJR0gxNgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9DT05TVF9TVFJJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfQ09OU1RfU1RSSU5HX0pVTUJPCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX0NPTlNUX1dJREUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfQ09OU1RfV0lERV8xNgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9DT05TVF9XSURFXzMyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX0NPTlNUX1dJREVfSElHSDE2Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX0RJVl9ET1VCTEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfRElWX0RPVUJMRV8yQUREUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9ESVZfRkxPQVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfRElWX0ZMT0FUXzJBRERSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX0RJVl9JTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfRElWX0lOVF8yQUREUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9ESVZfSU5UX0xJVDE2Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX0RJVl9JTlRfTElUOAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9ESVZfTE9ORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9ESVZfTE9OR18yQUREUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9ET1VCTEVfVE9fRkxPQVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfRE9VQkxFX1RPX0lOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9ET1VCTEVfVE9fTE9ORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9FWEVDVVRFX0lOTElORQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9GSUxMRURfTkVXX0FSUkFZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX0ZJTExFRF9ORVdfQVJSQVlfUkFOR0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfRklMTF9BUlJBWV9EQVRBCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX0ZMT0FUX1RPX0RPVUJMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9GTE9BVF9UT19JTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfRkxPQVRfVE9fTE9ORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9HT1RPCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX0dPVE9fMTYKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfR09UT18zMgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9JRl9FUQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9JRl9FUVoKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfSUZfR0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfSUZfR0VaCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX0lGX0dUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX0lGX0dUWgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9JRl9MRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9JRl9MRVoKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfSUZfTFQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfSUZfTFRaCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX0lGX05FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX0lGX05FWgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9JR0VUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX0lHRVRfQk9PTEVBTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9JR0VUX0JZVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfSUdFVF9DSEFSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX0lHRVRfT0JKRUNUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX0lHRVRfT0JKRUNUX1FVSUNLCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX0lHRVRfUVVJQ0sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfSUdFVF9TSE9SVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9JR0VUX1dJREUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfSUdFVF9XSURFX1FVSUNLCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX0lOU1RBTkNFX09GCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX0lOVF9UT19CWVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX0lOVF9UT19DSEFSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX0lOVF9UT19ET1VCTEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfSU5UX1RPX0ZMT0FUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX0lOVF9UT19MT05HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX0lOVF9UT19TSE9SVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9JTlZPS0VfRElSRUNUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX0lOVk9LRV9ESVJFQ1RfRU1QVFkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfSU5WT0tFX0RJUkVDVF9SQU5HRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9JTlZPS0VfSU5URVJGQUNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX0lOVk9LRV9JTlRFUkZBQ0VfUkFOR0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfSU5WT0tFX1NUQVRJQwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9JTlZPS0VfU1RBVElDX1JBTkdFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX0lOVk9LRV9TVVBFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9JTlZPS0VfU1VQRVJfUVVJQ0sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfSU5WT0tFX1NVUEVSX1FVSUNLX1JBTkdFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX0lOVk9LRV9TVVBFUl9SQU5HRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9JTlZPS0VfVklSVFVBTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9JTlZPS0VfVklSVFVBTF9RVUlDSwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9JTlZPS0VfVklSVFVBTF9RVUlDS19SQU5HRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9JTlZPS0VfVklSVFVBTF9SQU5HRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9JUFVUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX0lQVVRfQk9PTEVBTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9JUFVUX0JZVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfSVBVVF9DSEFSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX0lQVVRfT0JKRUNUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX0lQVVRfT0JKRUNUX1FVSUNLCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX0lQVVRfUVVJQ0sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfSVBVVF9TSE9SVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9JUFVUX1dJREUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfSVBVVF9XSURFX1FVSUNLCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX0xPTkdfVE9fRE9VQkxFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX0xPTkdfVE9fRkxPQVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfTE9OR19UT19JTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfTU9OSVRPUl9FTlRFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9NT05JVE9SX0VYSVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfTU9WRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9NT1ZFXzE2Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX01PVkVfRVhDRVBUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX01PVkVfRlJPTTE2Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX01PVkVfT0JKRUNUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX01PVkVfT0JKRUNUXzE2Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX01PVkVfT0JKRUNUX0ZST00xNgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9NT1ZFX1JFU1VMVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9NT1ZFX1JFU1VMVF9PQkpFQ1QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfTU9WRV9SRVNVTFRfV0lERQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9NT1ZFX1dJREUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfTU9WRV9XSURFXzE2Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX01PVkVfV0lERV9GUk9NMTYKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfTVVMX0RPVUJMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9NVUxfRE9VQkxFXzJBRERSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX01VTF9GTE9BVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9NVUxfRkxPQVRfMkFERFIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfTVVMX0lOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9NVUxfSU5UXzJBRERSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX01VTF9JTlRfTElUMTYKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfTVVMX0lOVF9MSVQ4Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX01VTF9MT05HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX01VTF9MT05HXzJBRERSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX05FR19ET1VCTEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfTkVHX0ZMT0FUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX05FR19JTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfTkVHX0xPTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfTkVXX0FSUkFZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX05FV19JTlNUQU5DRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9OT1AKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfTk9UX0lOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9OT1RfTE9ORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9PUl9JTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfT1JfSU5UXzJBRERSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX09SX0lOVF9MSVQxNgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9PUl9JTlRfTElUOAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9PUl9MT05HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX09SX0xPTkdfMkFERFIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfUEFDS0VEX1NXSVRDSAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9SRU1fRE9VQkxFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX1JFTV9ET1VCTEVfMkFERFIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfUkVNX0ZMT0FUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX1JFTV9GTE9BVF8yQUREUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9SRU1fSU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX1JFTV9JTlRfMkFERFIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfUkVNX0lOVF9MSVQxNgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9SRU1fSU5UX0xJVDgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfUkVNX0xPTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfUkVNX0xPTkdfMkFERFIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfUkVUVVJOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX1JFVFVSTl9PQkpFQ1QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfUkVUVVJOX1ZPSUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfUkVUVVJOX1dJREUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfUlNVQl9JTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfUlNVQl9JTlRfTElUOAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9TR0VUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX1NHRVRfQk9PTEVBTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9TR0VUX0JZVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfU0dFVF9DSEFSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX1NHRVRfT0JKRUNUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX1NHRVRfU0hPUlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfU0dFVF9XSURFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX1NITF9JTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfU0hMX0lOVF8yQUREUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9TSExfSU5UX0xJVDgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfU0hMX0xPTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfU0hMX0xPTkdfMkFERFIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfU0hSX0lOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9TSFJfSU5UXzJBRERSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX1NIUl9JTlRfTElUOAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9TSFJfTE9ORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9TSFJfTE9OR18yQUREUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9TUEFSU0VfU1dJVENICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX1NQVVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfU1BVVF9CT09MRUFOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX1NQVVRfQllURQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9TUFVUX0NIQVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfU1BVVF9PQkpFQ1QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfU1BVVF9TSE9SVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9TUFVUX1dJREUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfU1VCX0RPVUJMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9TVUJfRE9VQkxFXzJBRERSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX1NVQl9GTE9BVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9TVUJfRkxPQVRfMkFERFIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfU1VCX0lOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9TVUJfSU5UXzJBRERSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX1NVQl9MT05HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX1NVQl9MT05HXzJBRERSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX1RIUk9XCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX1VOVVNFRF8zZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9VTlVTRURfM2YKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfVU5VU0VEXzQwCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX1VOVVNFRF80MQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9VTlVTRURfNDIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfVU5VU0VEXzQzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX1VOVVNFRF83MwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9VTlVTRURfNzkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfVU5VU0VEXzdBCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX1VOVVNFRF9FMwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9VTlVTRURfRTQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfVU5VU0VEX0U1Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX1VOVVNFRF9FNgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9VTlVTRURfRTcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfVU5VU0VEX0U4Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX1VOVVNFRF9FOQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9VTlVTRURfRUEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfVU5VU0VEX0VCCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX1VOVVNFRF9FQwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9VTlVTRURfRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfVU5VU0VEX0VGCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX1VOVVNFRF9GMQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9VTlVTRURfRkMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfVU5VU0VEX0ZECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX1VOVVNFRF9GRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9VTlVTRURfRkYKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfVVNIUl9JTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfVVNIUl9JTlRfMkFERFIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfVVNIUl9JTlRfTElUOAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9VU0hSX0xPTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfVVNIUl9MT05HXzJBRERSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX1hPUl9JTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfWE9SX0lOVF8yQUREUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9YT1JfSU5UX0xJVDE2Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX1hPUl9JTlRfTElUOAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9YT1JfTE9ORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9YT1JfTE9OR18yQUREUgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5sYW5nLkVycm9yIGV4dGVuZHMgamF2YS5sYW5nLlRocm93YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGphdmEubGFuZy5WaXJ0dWFsTWFjaGluZUVycm9yIGV4dGVuZHMgamF2YS5sYW5nLkVycm9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgZGFsdmlrLnN5c3RlbS5BbGxvY2F0aW9uTGltaXRFcnJvciBleHRlbmRzIGphdmEubGFuZy5WaXJ0dWFsTWFjaGluZUVycm9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEU6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL2xhbmcvT2JqZWN0OyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEudXRpbC5FbnVtZXJhdGlvbiBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBoYXNNb3JlRWxlbWVudHMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVEU7ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuT2JqZWN0IG5leHRFbGVtZW50KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MZGFsdmlrL3N5c3RlbS9EZXhGaWxlOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvdXRpbC9FbnVtZXJhdGlvbjxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTIgbmFtZSA9REZFbnVtICkKLSBjbGFzcyBkYWx2aWsuc3lzdGVtLkRleEZpbGUkREZFbnVtIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudXRpbC5FbnVtZXJhdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGludCBtSW5kZXgKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nW10gbU5hbWVMaXN0Ci0KLWZpbmFsIGRhbHZpay5zeXN0ZW0uRGV4RmlsZSB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1kYWx2aWsuc3lzdGVtLkRleEZpbGUKLWRhbHZpay5zeXN0ZW0uRGV4RmlsZSkKLQotcHVibGljIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgbmV4dEVsZW1lbnQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBuZXh0RWxlbWVudCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MZGFsdmlrL3N5c3RlbS9EZXhGaWxlJERGRW51bTsgKQotcHVibGljIGZpbmFsIGNsYXNzIGRhbHZpay5zeXN0ZW0uRGV4RmlsZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBpbnQgbUNvb2tpZQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbUZpbGVOYW1lCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5GaWxlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1zdGF0aWMgaW50IGFjY2VzcyQwMDAoCi1kYWx2aWsuc3lzdGVtLkRleEZpbGUpCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nW10gYWNjZXNzJDEwMCgKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgY2xvc2VEZXhGaWxlKAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgamF2YS5sYW5nLkNsYXNzIGRlZmluZUNsYXNzKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLkNsYXNzTG9hZGVyCi1pbnQKLWphdmEuc2VjdXJpdHkuUHJvdGVjdGlvbkRvbWFpbikKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGphdmEubGFuZy5TdHJpbmdbXSBnZXRDbGFzc05hbWVMaXN0KAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0ZpbGVOb3RGb3VuZEV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBpc0RleE9wdE5lZWRlZCgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgb3BlbkRleEZpbGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjbG9zZSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0VudW1lcmF0aW9uPExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuRW51bWVyYXRpb24gZW50cmllcygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TmFtZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuQ2xhc3MgbG9hZENsYXNzKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLkNsYXNzTG9hZGVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZhLmxhbmcuUnVubmFibGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLSBjbGFzcyBkYWx2aWsuc3lzdGVtLk5hdGl2ZVN0YXJ0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5SdW5uYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBtYWluKAotamF2YS5sYW5nLlN0cmluZ1tdKQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxqYXZhL2xhbmcvQ2xhc3NMb2FkZXIkU3lzdGVtQ2xhc3NMb2FkZXI7ICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9QYWNrYWdlOz47ICkKLXByaXZhdGUgamF2YS51dGlsLk1hcCBwYWNrYWdlcwotCi1wcml2YXRlIGphdmEubGFuZy5DbGFzc0xvYWRlciBwYXJlbnQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oKQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuQ2xhc3NMb2FkZXIpCi0KLXN0YXRpYyBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIgYWNjZXNzJDAwMCgpCi0KLXN0YXRpYyBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIgY2FsbGVyQ2xhc3NMb2FkZXIoKQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIgY3JlYXRlU3lzdGVtQ2xhc3NMb2FkZXIoKQotCi1zdGF0aWMgamF2YS5sYW5nLlBhY2thZ2UgZ2V0UGFja2FnZSgKLWphdmEubGFuZy5DbGFzc0xvYWRlcgotamF2YS5sYW5nLlN0cmluZykKLQotc3RhdGljIGZpbmFsIGphdmEubGFuZy5DbGFzc0xvYWRlciBnZXRTdGFja0NsYXNzTG9hZGVyKAotaW50KQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5DbGFzc0xvYWRlciBnZXRTeXN0ZW1DbGFzc0xvYWRlcigpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5uZXQuVVJMIGdldFN5c3RlbVJlc291cmNlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBqYXZhLmlvLklucHV0U3RyZWFtIGdldFN5c3RlbVJlc291cmNlQXNTdHJlYW0oCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvdXRpbC9FbnVtZXJhdGlvbjxMamF2YS9uZXQvVVJMOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuRW51bWVyYXRpb24gZ2V0U3lzdGVtUmVzb3VyY2VzKAotamF2YS5sYW5nLlN0cmluZykKLQotc3RhdGljIHZvaWQgbG9hZExpYnJhcnlXaXRoQ2xhc3NMb2FkZXIoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuQ2xhc3NMb2FkZXIpCi0KLXN0YXRpYyB2b2lkIGxvYWRMaWJyYXJ5V2l0aFBhdGgoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuQ2xhc3NMb2FkZXIKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIGNsZWFyQXNzZXJ0aW9uU3RhdHVzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0NsYXNzRm9ybWF0RXJyb3I7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbmlvL0J5dGVCdWZmZXI7TGphdmEvc2VjdXJpdHkvUHJvdGVjdGlvbkRvbWFpbjspTGphdmEvbGFuZy9DbGFzczwqPjsgKQotcHJvdGVjdGVkIGZpbmFsIGphdmEubGFuZy5DbGFzcyBkZWZpbmVDbGFzcygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubmlvLkJ5dGVCdWZmZXIKLWphdmEuc2VjdXJpdHkuUHJvdGVjdGlvbkRvbWFpbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0NsYXNzRm9ybWF0RXJyb3I7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9TdHJpbmc7W0JJSSlMamF2YS9sYW5nL0NsYXNzPCo+OyApCi1wcm90ZWN0ZWQgZmluYWwgamF2YS5sYW5nLkNsYXNzIGRlZmluZUNsYXNzKAotamF2YS5sYW5nLlN0cmluZwotYnl0ZVtdCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0NsYXNzRm9ybWF0RXJyb3I7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9TdHJpbmc7W0JJSUxqYXZhL3NlY3VyaXR5L1Byb3RlY3Rpb25Eb21haW47KUxqYXZhL2xhbmcvQ2xhc3M8Kj47ICkKLXByb3RlY3RlZCBmaW5hbCBqYXZhLmxhbmcuQ2xhc3MgZGVmaW5lQ2xhc3MoCi1qYXZhLmxhbmcuU3RyaW5nCi1ieXRlW10KLWludAotaW50Ci1qYXZhLnNlY3VyaXR5LlByb3RlY3Rpb25Eb21haW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9DbGFzc0Zvcm1hdEVycm9yOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFtCSUkpTGphdmEvbGFuZy9DbGFzczwqPjsgKQotQGphdmEubGFuZy5EZXByZWNhdGVkCi1wcm90ZWN0ZWQgZmluYWwgamF2YS5sYW5nLkNsYXNzIGRlZmluZUNsYXNzKAotYnl0ZVtdCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGphdmEubGFuZy5QYWNrYWdlIGRlZmluZVBhY2thZ2UoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLm5ldC5VUkwpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL0NsYXNzPCo+OyApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgamF2YS5sYW5nLkNsYXNzIGZpbmRDbGFzcygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIGZpbmRMaWJyYXJ5KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvQ2xhc3M8Kj47ICkKLXByb3RlY3RlZCBmaW5hbCBqYXZhLmxhbmcuQ2xhc3MgZmluZExvYWRlZENsYXNzKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJvdGVjdGVkIGphdmEubmV0LlVSTCBmaW5kUmVzb3VyY2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvdXRpbC9FbnVtZXJhdGlvbjxMamF2YS9uZXQvVVJMOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGphdmEudXRpbC5FbnVtZXJhdGlvbiBmaW5kUmVzb3VyY2VzKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0NsYXNzTm90Rm91bmRFeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvQ2xhc3M8Kj47ICkKLXByb3RlY3RlZCBmaW5hbCBqYXZhLmxhbmcuQ2xhc3MgZmluZFN5c3RlbUNsYXNzKAotamF2YS5sYW5nLlN0cmluZykKLQotIGJvb2xlYW4gZ2V0Q2xhc3NBc3NlcnRpb25TdGF0dXMoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi0gYm9vbGVhbiBnZXREZWZhdWx0QXNzZXJ0aW9uU3RhdHVzKCkKLQotcHJvdGVjdGVkIGphdmEubGFuZy5QYWNrYWdlIGdldFBhY2thZ2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi0gYm9vbGVhbiBnZXRQYWNrYWdlQXNzZXJ0aW9uU3RhdHVzKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJvdGVjdGVkIGphdmEubGFuZy5QYWNrYWdlW10gZ2V0UGFja2FnZXMoKQotCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLkNsYXNzTG9hZGVyIGdldFBhcmVudCgpCi0KLXB1YmxpYyBqYXZhLm5ldC5VUkwgZ2V0UmVzb3VyY2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5pby5JbnB1dFN0cmVhbSBnZXRSZXNvdXJjZUFzU3RyZWFtKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvdXRpbC9FbnVtZXJhdGlvbjxMamF2YS9uZXQvVVJMOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuRW51bWVyYXRpb24gZ2V0UmVzb3VyY2VzKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9DbGFzczwqPjspW0xqYXZhL2xhbmcvT2JqZWN0OyApCi1maW5hbCBqYXZhLmxhbmcuT2JqZWN0W10gZ2V0U2lnbmVycygKLWphdmEubGFuZy5DbGFzcykKLQotZmluYWwgYm9vbGVhbiBpc0FuY2VzdG9yT2YoCi1qYXZhLmxhbmcuQ2xhc3NMb2FkZXIpCi0KLWZpbmFsIGJvb2xlYW4gaXNTeXN0ZW1DbGFzc0xvYWRlcigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL0NsYXNzPCo+OyApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLkNsYXNzIGxvYWRDbGFzcygKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvU3RyaW5nO1opTGphdmEvbGFuZy9DbGFzczwqPjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGphdmEubGFuZy5DbGFzcyBsb2FkQ2xhc3MoCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL0NsYXNzPCo+OylWICkKLXByb3RlY3RlZCBmaW5hbCB2b2lkIHJlc29sdmVDbGFzcygKLWphdmEubGFuZy5DbGFzcykKLQotcHVibGljIHZvaWQgc2V0Q2xhc3NBc3NlcnRpb25TdGF0dXMoCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXREZWZhdWx0QXNzZXJ0aW9uU3RhdHVzKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0UGFja2FnZUFzc2VydGlvblN0YXR1cygKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvQ2xhc3M8Kj47W0xqYXZhL2xhbmcvT2JqZWN0OylWICkKLXByb3RlY3RlZCBmaW5hbCB2b2lkIHNldFNpZ25lcnMoCi1qYXZhLmxhbmcuQ2xhc3MKLWphdmEubGFuZy5PYmplY3RbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBkYWx2aWsuc3lzdGVtLlBhdGhDbGFzc0xvYWRlciBleHRlbmRzIGphdmEubGFuZy5DbGFzc0xvYWRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGJvb2xlYW4gaW5pdGlhbGl6ZWQKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGxpYlBhdGgKLQotcHJpdmF0ZSBkYWx2aWsuc3lzdGVtLkRleEZpbGVbXSBtRGV4cwotCi1wcml2YXRlIGphdmEuaW8uRmlsZVtdIG1GaWxlcwotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmdbXSBtTGliUGF0aHMKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nW10gbVBhdGhzCi0KLXByaXZhdGUgamF2YS51dGlsLnppcC5aaXBGaWxlW10gbVppcHMKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIHBhdGgKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuQ2xhc3NMb2FkZXIpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5DbGFzc0xvYWRlcikKLQotcHJpdmF0ZSB2b2lkIGVuc3VyZUluaXQoKQotCi1wcml2YXRlIGJvb2xlYW4gaXNJbkFyY2hpdmUoCi1qYXZhLnV0aWwuemlwLlppcEZpbGUKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgYnl0ZVtdIGxvYWRGcm9tQXJjaGl2ZSgKLWphdmEudXRpbC56aXAuWmlwRmlsZQotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBieXRlW10gbG9hZEZyb21EaXJlY3RvcnkoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9DbGFzczwqPjsgKQotcHJvdGVjdGVkIGphdmEubGFuZy5DbGFzcyBmaW5kQ2xhc3MoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBmaW5kTGlicmFyeSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByb3RlY3RlZCBqYXZhLm5ldC5VUkwgZmluZFJlc291cmNlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJvdGVjdGVkIGphdmEubGFuZy5QYWNrYWdlIGdldFBhY2thZ2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGRhbHZpay5zeXN0ZW0uUG90ZW50aWFsRGVhZGxvY2tFcnJvciBleHRlbmRzIGphdmEubGFuZy5WaXJ0dWFsTWFjaGluZUVycm9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBkYWx2aWsuc3lzdGVtLlN0YWxlRGV4Q2FjaGVFcnJvciBleHRlbmRzIGphdmEubGFuZy5WaXJ0dWFsTWFjaGluZUVycm9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBkYWx2aWsuc3lzdGVtLlRlbXBvcmFyeURpcmVjdG9yeSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQQVRIX05BTUUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQUk9QRVJUWQotCi1wcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbmZpZ3VyZWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRVcERpcmVjdG9yeSgKLWphdmEuaW8uRmlsZSkKLQotcHVibGljIHN0YXRpYyB2b2lkIHNldFVwRGlyZWN0b3J5KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgamF2YS5pby5GaWxlbmFtZUZpbHRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBhY2NlcHQoCi1qYXZhLmlvLkZpbGUKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotZmluYWwgY2xhc3MgZGFsdmlrLnN5c3RlbS5Ub3VjaERleCQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuaW8uRmlsZW5hbWVGaWx0ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgYm9vbGVhbiBhY2NlcHQoCi1qYXZhLmlvLkZpbGUKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgZGFsdmlrLnN5c3RlbS5Ub3VjaERleCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGV4cGFuZERpcmVjdG9yaWVzKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oCi1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgcHJlcEZpbGVzKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBpbnQgc3RhcnQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IHRyYW1wb2xpbmUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotIGNsYXNzIGRhbHZpay5zeXN0ZW0uVG91Y2hEZXhMb2FkZXIgZXh0ZW5kcyBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBib29sZWFuIGluaXRpYWxpemVkCi0KLXByaXZhdGUgZGFsdmlrLnN5c3RlbS5EZXhGaWxlW10gbURleHMKLQotcHJpdmF0ZSBqYXZhLmlvLkZpbGVbXSBtRmlsZXMKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nW10gbUxpYlBhdGhzCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZ1tdIG1QYXRocwotCi1wcml2YXRlIGphdmEudXRpbC56aXAuWmlwRmlsZVtdIG1aaXBzCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBwYXRoCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLkNsYXNzTG9hZGVyKQotCi1wcml2YXRlIHZvaWQgZW5zdXJlSW5pdCgpCi0KLXByaXZhdGUgYm9vbGVhbiBpc0luQXJjaGl2ZSgKLWphdmEudXRpbC56aXAuWmlwRmlsZQotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBieXRlW10gbG9hZEZyb21BcmNoaXZlKAotamF2YS51dGlsLnppcC5aaXBGaWxlCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIGJ5dGVbXSBsb2FkRnJvbURpcmVjdG9yeSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL0NsYXNzPCo+OyApCi1wcm90ZWN0ZWQgamF2YS5sYW5nLkNsYXNzIGZpbmRDbGFzcygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIGZpbmRMaWJyYXJ5KAotamF2YS5sYW5nLlN0cmluZykKLQotcHJvdGVjdGVkIGphdmEubmV0LlVSTCBmaW5kUmVzb3VyY2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIGRhbHZpay5zeXN0ZW0uVk1EZWJ1ZyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFRkFVTFRfTUVUSE9EX1RSQUNFX0ZJTEVfTkFNRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgS0lORF9BTExPQ0FURURfQllURVMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEtJTkRfQUxMT0NBVEVEX09CSkVDVFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0lORF9BTExfQ09VTlRTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBLSU5EX0VYVF9BTExPQ0FURURfQllURVMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEtJTkRfRVhUX0FMTE9DQVRFRF9PQkpFQ1RTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBLSU5EX0VYVF9GUkVFRF9CWVRFUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgS0lORF9FWFRfRlJFRURfT0JKRUNUUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgS0lORF9GUkVFRF9CWVRFUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgS0lORF9GUkVFRF9PQkpFQ1RTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBLSU5EX0dDX0lOVk9DQVRJT05TCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtJTkRfR0xPQkFMX0FMTE9DQVRFRF9CWVRFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLSU5EX0dMT0JBTF9BTExPQ0FURURfT0JKRUNUUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLSU5EX0dMT0JBTF9FWFRfQUxMT0NBVEVEX0JZVEVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtJTkRfR0xPQkFMX0VYVF9BTExPQ0FURURfT0JKRUNUUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLSU5EX0dMT0JBTF9FWFRfRlJFRURfQllURVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0lORF9HTE9CQUxfRVhUX0ZSRUVEX09CSkVDVFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0lORF9HTE9CQUxfRlJFRURfQllURVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0lORF9HTE9CQUxfRlJFRURfT0JKRUNUUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLSU5EX0dMT0JBTF9HQ19JTlZPQ0FUSU9OUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLSU5EX1RIUkVBRF9BTExPQ0FURURfQllURVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0lORF9USFJFQURfQUxMT0NBVEVEX09CSkVDVFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0lORF9USFJFQURfRVhUX0FMTE9DQVRFRF9CWVRFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLSU5EX1RIUkVBRF9FWFRfQUxMT0NBVEVEX09CSkVDVFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0lORF9USFJFQURfRVhUX0ZSRUVEX0JZVEVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtJTkRfVEhSRUFEX0VYVF9GUkVFRF9PQkpFQ1RTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtJTkRfVEhSRUFEX0ZSRUVEX0JZVEVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtJTkRfVEhSRUFEX0ZSRUVEX09CSkVDVFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0lORF9USFJFQURfR0NfSU5WT0NBVElPTlMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFJBQ0VfQ09VTlRfQUxMT0NTCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBnZXRBbGxvY0NvdW50KAotaW50KQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIGdldEluc3RydWN0aW9uQ291bnQoCi1pbnRbXSkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGdldExvYWRlZENsYXNzQ291bnQoKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIGlzRGVidWdnZXJDb25uZWN0ZWQoKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBsb25nIGxhc3REZWJ1Z2dlckFjdGl2aXR5KCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBwcmludExvYWRlZENsYXNzZXMoCi1pbnQpCi0KLXN0YXRpYyBuYXRpdmUgdm9pZCBwcmludFRoaXMoCi1qYXZhLmxhbmcuT2JqZWN0Ci1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCByZXNldEFsbG9jQ291bnQoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgcmVzZXRJbnN0cnVjdGlvbkNvdW50KCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IHNldEFsbG9jYXRpb25MaW1pdCgKLWludCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IHNldEdsb2JhbEFsbG9jYXRpb25MaW1pdCgKLWludCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBzdGFydEFsbG9jQ291bnRpbmcoKQotCi1wcml2YXRlIHN0YXRpYyB2b2lkIHN0YXJ0Q2xhc3NQcmVwKCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBzdGFydEVtdWxhdG9yVHJhY2luZygpCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgc3RhcnRHQygpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgc3RhcnRJbnN0cnVjdGlvbkNvdW50aW5nKCkKLQotcHVibGljIHN0YXRpYyB2b2lkIHN0YXJ0TWV0aG9kVHJhY2luZygpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgc3RhcnRNZXRob2RUcmFjaW5nKAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgc3RvcEFsbG9jQ291bnRpbmcoKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHN0b3BFbXVsYXRvclRyYWNpbmcoKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHN0b3BJbnN0cnVjdGlvbkNvdW50aW5nKCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBzdG9wTWV0aG9kVHJhY2luZygpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGxvbmcgdGhyZWFkQ3B1VGltZU5hbm9zKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBkYWx2aWsuc3lzdGVtLlZNUnVudGltZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgZGFsdmlrLnN5c3RlbS5WTVJ1bnRpbWUgVEhFX09ORQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgZGFsdmlrLnN5c3RlbS5WTVJ1bnRpbWUgZ2V0UnVudGltZSgpCi0KLXByaXZhdGUgbmF0aXZlIGxvbmcgbmF0aXZlTWluaW11bUhlYXBTaXplKAotbG9uZwotYm9vbGVhbikKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVTZXRUYXJnZXRIZWFwVXRpbGl6YXRpb24oCi1mbG9hdCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdjU29mdFJlZmVyZW5jZXMoKQotCi1wdWJsaWMgbmF0aXZlIGxvbmcgZ2V0RXh0ZXJuYWxCeXRlc0FsbG9jYXRlZCgpCi0KLXB1YmxpYyBsb25nIGdldE1pbmltdW1IZWFwU2l6ZSgpCi0KLXB1YmxpYyBuYXRpdmUgZmxvYXQgZ2V0VGFyZ2V0SGVhcFV0aWxpemF0aW9uKCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIHJ1bkZpbmFsaXphdGlvblN5bmMoKQotCi1wdWJsaWMgbG9uZyBzZXRNaW5pbXVtSGVhcFNpemUoCi1sb25nKQotCi1wdWJsaWMgZmxvYXQgc2V0VGFyZ2V0SGVhcFV0aWxpemF0aW9uKAotZmxvYXQpCi0KLXB1YmxpYyBuYXRpdmUgYm9vbGVhbiB0cmFja0V4dGVybmFsQWxsb2NhdGlvbigKLWxvbmcpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCB0cmFja0V4dGVybmFsRnJlZSgKLWxvbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgZGFsdmlrLnN5c3RlbS5WTVN0YWNrIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGphdmEubGFuZy5DbGFzc0xvYWRlciBnZXRDYWxsaW5nQ2xhc3NMb2FkZXIoKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIgZ2V0Q2FsbGluZ0NsYXNzTG9hZGVyMigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KElaKVtMamF2YS9sYW5nL0NsYXNzPCo+OyApCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBqYXZhLmxhbmcuQ2xhc3NbXSBnZXRDbGFzc2VzKAotaW50Ci1ib29sZWFuKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBqYXZhLmxhbmcuU3RhY2tUcmFjZUVsZW1lbnRbXSBnZXRUaHJlYWRTdGFja1RyYWNlKAotamF2YS5sYW5nLlRocmVhZCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBkYWx2aWsuc3lzdGVtLlp5Z290ZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGZvcmsoKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgZm9ya0FuZFNwZWNpYWxpemUoCi1pbnQKLWludAotaW50W10KLWJvb2xlYW4KLWludFtdW10pCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBmb3JrU3lzdGVtU2VydmVyKAotaW50Ci1pbnQKLWludFtdCi1ib29sZWFuCi1pbnRbXVtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIGphdmEuYXd0LmZvbnQuTnVtZXJpY1NoYXBlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTExfUkFOR0VTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFSQUJJQwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCRU5HQUxJCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVkFOQUdBUkkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUFTVEVSTl9BUkFCSUMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVRISU9QSUMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVVST1BFQU4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR1VKQVJBVEkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR1VSTVVLSEkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOREVYX0FSQUJJQwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5ERVhfQkVOR0FMSQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5ERVhfREVWQU5BR0FSSQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5ERVhfRUFTVEVSTl9BUkFCSUMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOREVYX0VUSElPUElDCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTkRFWF9FVVJPUEVBTgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5ERVhfR1VKQVJBVEkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOREVYX0dVUk1VS0hJCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTkRFWF9LQU5OQURBCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTkRFWF9LSE1FUgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5ERVhfTEFPCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTkRFWF9NQUxBWUFMQU0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOREVYX01PTkdPTElBTgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5ERVhfTVlBTk1BUgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5ERVhfT1JJWUEKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOREVYX1RBTUlMCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTkRFWF9URUxVR1UKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOREVYX1RIQUkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOREVYX1RJQkVUQU4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0FOTkFEQQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLSE1FUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMQU8KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFMQVlBTEFNCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfSU5ERVgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9OR09MSUFOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1ZQU5NQVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1JJWUEKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gU1RST05HX1RFWFRfRkxBR1MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFNSUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEVMVUdVCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRIQUkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVElCRVRBTgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gY29udGV4dHMKLQotcHJpdmF0ZSBmaW5hbCBpbnRbXSBkaWdpdHNMb3dSYW5nZXMKLQotcHJpdmF0ZSBib29sZWFuIGZDb250ZXh0dWFsCi0KLXByaXZhdGUgaW50IGZEZWZhdWx0Q29udGV4dEluZGV4Ci0KLXByaXZhdGUgaW50IGZSYW5nZXMKLQotcHJpdmF0ZSBpbnQgZlNpbmdsZVJhbmdlSW5kZXgKLQotcHJpdmF0ZSBpbnQga2V5Ci0KLXByaXZhdGUgaW50IG1hc2sKLQotcHJpdmF0ZSBmaW5hbCBpbnRbXSBzY3JpcHRzUmFuZ2VzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotaW50Ci1pbnQKLWJvb2xlYW4pCi0KLXByaXZhdGUgdm9pZCBjb250ZXh0dWFsU2hhcGUoCi1jaGFyW10KLWludAotaW50Ci1pbnQpCi0KLXByaXZhdGUgaW50IGdldENoYXJJbmRleCgKLWNoYXIpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5hd3QuZm9udC5OdW1lcmljU2hhcGVyIGdldENvbnRleHR1YWxTaGFwZXIoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5hd3QuZm9udC5OdW1lcmljU2hhcGVyIGdldENvbnRleHR1YWxTaGFwZXIoCi1pbnQKLWludCkKLQotcHJpdmF0ZSBpbnQgZ2V0SW5kZXhGcm9tUmFuZ2UoCi1pbnQpCi0KLXByaXZhdGUgaW50IGdldFJhbmdlRnJvbUluZGV4KAotaW50KQotCi1wdWJsaWMgc3RhdGljIGphdmEuYXd0LmZvbnQuTnVtZXJpY1NoYXBlciBnZXRTaGFwZXIoCi1pbnQpCi0KLXByaXZhdGUgYm9vbGVhbiBpc0NoYXJTdHJvbmcoCi1pbnQpCi0KLXByaXZhdGUgdm9pZCBub25Db250ZXh0dWFsU2hhcGUoCi1jaGFyW10KLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL2xhbmcvQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoCi1qYXZhLmlvLk9iamVjdElucHV0U3RyZWFtKQotCi1wcml2YXRlIHN0YXRpYyB2b2lkIHRocm93UmFuZ2UoCi1pbnQpCi0KLXByaXZhdGUgdm9pZCB1cGRhdGVLZXlNYXNrRmllbGRzKCkKLQotcHJpdmF0ZSB2b2lkIHVwZGF0ZVJhbmdlc0ZpZWxkcygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCB3cml0ZU9iamVjdCgKLWphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50IGdldFJhbmdlcygpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0NvbnRleHR1YWwoKQotCi1wdWJsaWMgdm9pZCBzaGFwZSgKLWNoYXJbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIHNoYXBlKAotY2hhcltdCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdGV4dC9BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3I7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1BdHRyaWJ1dGUgKQotcHVibGljIGNsYXNzIGphdmEudGV4dC5BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IkQXR0cmlidXRlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS50ZXh0LkF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvciRBdHRyaWJ1dGUgSU5QVVRfTUVUSE9EX1NFR01FTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnRleHQuQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yJEF0dHJpYnV0ZSBMQU5HVUFHRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudGV4dC5BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IkQXR0cmlidXRlIFJFQURJTkcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBuYW1lCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBnZXROYW1lKCkKLQotcHVibGljIGZpbmFsIGludCBoYXNoQ29kZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSW52YWxpZE9iamVjdEV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGphdmEubGFuZy5PYmplY3QgcmVhZFJlc29sdmUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgamF2YS5hd3QuZm9udC5UZXh0QXR0cmlidXRlIGV4dGVuZHMgamF2YS50ZXh0LkF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvciRBdHRyaWJ1dGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmF3dC5mb250LlRleHRBdHRyaWJ1dGUgQkFDS0dST1VORAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEuYXd0LmZvbnQuVGV4dEF0dHJpYnV0ZSBCSURJX0VNQkVERElORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEuYXd0LmZvbnQuVGV4dEF0dHJpYnV0ZSBDSEFSX1JFUExBQ0VNRU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5hd3QuZm9udC5UZXh0QXR0cmlidXRlIEZBTUlMWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEuYXd0LmZvbnQuVGV4dEF0dHJpYnV0ZSBGT05UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5hd3QuZm9udC5UZXh0QXR0cmlidXRlIEZPUkVHUk9VTkQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmF3dC5mb250LlRleHRBdHRyaWJ1dGUgSU5QVVRfTUVUSE9EX0hJR0hMSUdIVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEuYXd0LmZvbnQuVGV4dEF0dHJpYnV0ZSBJTlBVVF9NRVRIT0RfVU5ERVJMSU5FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5hd3QuZm9udC5UZXh0QXR0cmlidXRlIEpVU1RJRklDQVRJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuRmxvYXQgSlVTVElGSUNBVElPTl9GVUxMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkZsb2F0IEpVU1RJRklDQVRJT05fTk9ORQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEuYXd0LmZvbnQuVGV4dEF0dHJpYnV0ZSBOVU1FUklDX1NIQVBJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmF3dC5mb250LlRleHRBdHRyaWJ1dGUgUE9TVFVSRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5GbG9hdCBQT1NUVVJFX09CTElRVUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuRmxvYXQgUE9TVFVSRV9SRUdVTEFSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5hd3QuZm9udC5UZXh0QXR0cmlidXRlIFJVTl9ESVJFQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQm9vbGVhbiBSVU5fRElSRUNUSU9OX0xUUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5Cb29sZWFuIFJVTl9ESVJFQ1RJT05fUlRMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5hd3QuZm9udC5UZXh0QXR0cmlidXRlIFNJWkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmF3dC5mb250LlRleHRBdHRyaWJ1dGUgU1RSSUtFVEhST1VHSAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5Cb29sZWFuIFNUUklLRVRIUk9VR0hfT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmF3dC5mb250LlRleHRBdHRyaWJ1dGUgU1VQRVJTQ1JJUFQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuSW50ZWdlciBTVVBFUlNDUklQVF9TVUIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuSW50ZWdlciBTVVBFUlNDUklQVF9TVVBFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEuYXd0LmZvbnQuVGV4dEF0dHJpYnV0ZSBTV0FQX0NPTE9SUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5Cb29sZWFuIFNXQVBfQ09MT1JTX09OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5hd3QuZm9udC5UZXh0QXR0cmlidXRlIFRSQU5TRk9STQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEuYXd0LmZvbnQuVGV4dEF0dHJpYnV0ZSBVTkRFUkxJTkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuSW50ZWdlciBVTkRFUkxJTkVfTE9XX0RBU0hFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5JbnRlZ2VyIFVOREVSTElORV9MT1dfRE9UVEVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkludGVnZXIgVU5ERVJMSU5FX0xPV19HUkFZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkludGVnZXIgVU5ERVJMSU5FX0xPV19PTkVfUElYRUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuSW50ZWdlciBVTkRFUkxJTkVfTE9XX1RXT19QSVhFTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5JbnRlZ2VyIFVOREVSTElORV9PTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEuYXd0LmZvbnQuVGV4dEF0dHJpYnV0ZSBXRUlHSFQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuRmxvYXQgV0VJR0hUX0JPTEQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuRmxvYXQgV0VJR0hUX0RFTUlCT0xECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkZsb2F0IFdFSUdIVF9ERU1JTElHSFQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuRmxvYXQgV0VJR0hUX0VYVFJBQk9MRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5GbG9hdCBXRUlHSFRfRVhUUkFfTElHSFQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuRmxvYXQgV0VJR0hUX0hFQVZZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkZsb2F0IFdFSUdIVF9MSUdIVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5GbG9hdCBXRUlHSFRfTUVESVVNCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkZsb2F0IFdFSUdIVF9SRUdVTEFSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkZsb2F0IFdFSUdIVF9TRU1JQk9MRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5GbG9hdCBXRUlHSFRfVUxUUkFCT0xECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5hd3QuZm9udC5UZXh0QXR0cmlidXRlIFdJRFRICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkZsb2F0IFdJRFRIX0NPTkRFTlNFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5GbG9hdCBXSURUSF9FWFRFTkRFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5GbG9hdCBXSURUSF9SRUdVTEFSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkZsb2F0IFdJRFRIX1NFTUlfQ09OREVOU0VECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkZsb2F0IFdJRFRIX1NFTUlfRVhURU5ERUQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9hd3QvZm9udC9UZXh0QXR0cmlidXRlOz47ICkKLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEudXRpbC5NYXAgYXR0ck1hcAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSW52YWxpZE9iamVjdEV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGphdmEubGFuZy5PYmplY3QgcmVhZFJlc29sdmUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEuaW8uRmlsdGVySW5wdXRTdHJlYW0gZXh0ZW5kcyBqYXZhLmlvLklucHV0U3RyZWFtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCB2b2xhdGlsZSBqYXZhLmlvLklucHV0U3RyZWFtIGluCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotamF2YS5pby5JbnB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCBhdmFpbGFibGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjbG9zZSgpCi0KLXB1YmxpYyB2b2lkIG1hcmsoCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcmVhZCgKLWJ5dGVbXQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHJlc2V0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGxvbmcgc2tpcCgKLWxvbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtIGV4dGVuZHMgamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgdm9sYXRpbGUgYnl0ZVtdIGJ1ZgotCi1wcml2YXRlIGJvb2xlYW4gY2xvc2VkCi0KLXByb3RlY3RlZCBpbnQgY291bnQKLQotcHJvdGVjdGVkIGludCBtYXJrbGltaXQKLQotcHJvdGVjdGVkIGludCBtYXJrcG9zCi0KLXByb3RlY3RlZCBpbnQgcG9zCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5JbnB1dFN0cmVhbSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5JbnB1dFN0cmVhbQotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIGludCBmaWxsYnVmKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCBhdmFpbGFibGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjbG9zZSgpCi0KLXB1YmxpYyB2b2lkIG1hcmsoCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoCi1ieXRlW10KLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCByZXNldCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBsb25nIHNraXAoCi1sb25nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEuaW8uRmlsdGVyT3V0cHV0U3RyZWFtIGV4dGVuZHMgamF2YS5pby5PdXRwdXRTdHJlYW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIGphdmEuaW8uT3V0cHV0U3RyZWFtIG91dAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uT3V0cHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjbG9zZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGZsdXNoKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgd3JpdGUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHdyaXRlKAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB3cml0ZSgKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbSBleHRlbmRzIGphdmEuaW8uRmlsdGVyT3V0cHV0U3RyZWFtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCBieXRlW10gYnVmCi0KLXByb3RlY3RlZCBpbnQgY291bnQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmlvLk91dHB1dFN0cmVhbSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5PdXRwdXRTdHJlYW0KLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgZmx1c2goKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB3cml0ZSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgd3JpdGUoCi1ieXRlW10KLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZhLmxhbmcuUmVhZGFibGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCByZWFkKAotamF2YS5uaW8uQ2hhckJ1ZmZlcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZhLmlvLlJlYWRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmxhbmcuUmVhZGFibGUsIGphdmEuaW8uQ2xvc2VhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCBqYXZhLmxhbmcuT2JqZWN0IGxvY2sKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oKQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBjbG9zZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIG1hcmsoCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoCi1qYXZhLm5pby5DaGFyQnVmZmVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoCi1jaGFyW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgcmVhZCgKLWNoYXJbXQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIHJlYWR5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcmVzZXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgbG9uZyBza2lwKAotbG9uZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyIGV4dGVuZHMgamF2YS5pby5SZWFkZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBjaGFyW10gYnVmCi0KLXByaXZhdGUgaW50IGNvdW50Ci0KLXByaXZhdGUgamF2YS5pby5SZWFkZXIgaW4KLQotcHJpdmF0ZSBpbnQgbWFya2xpbWl0Ci0KLXByaXZhdGUgaW50IG1hcmtwb3MKLQotcHJpdmF0ZSBpbnQgcG9zCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5SZWFkZXIpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uUmVhZGVyCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgaW50IGZpbGxidWYoKQotCi1wcml2YXRlIGJvb2xlYW4gaXNDbG9zZWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjbG9zZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIG1hcmsoCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoCi1jaGFyW10KLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyByZWFkTGluZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIHJlYWR5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcmVzZXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgbG9uZyBza2lwKAotbG9uZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgamF2YS5sYW5nLkFwcGVuZGFibGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5BcHBlbmRhYmxlIGFwcGVuZCgKLWNoYXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuQXBwZW5kYWJsZSBhcHBlbmQoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLkFwcGVuZGFibGUgYXBwZW5kKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgamF2YS5pby5Xcml0ZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5sYW5nLkFwcGVuZGFibGUsIGphdmEuaW8uQ2xvc2VhYmxlLCBqYXZhLmlvLkZsdXNoYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUT0tFTl9OVUxMCi0KLXByb3RlY3RlZCBqYXZhLmxhbmcuT2JqZWN0IGxvY2sKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oKQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5pby5Xcml0ZXIgYXBwZW5kKAotY2hhcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuaW8uV3JpdGVyIGFwcGVuZCgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmlvLldyaXRlciBhcHBlbmQoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5BcHBlbmRhYmxlIGFwcGVuZCgKLWNoYXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuQXBwZW5kYWJsZSBhcHBlbmQoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLkFwcGVuZGFibGUgYXBwZW5kKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGNsb3NlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgZmx1c2goKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB3cml0ZSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgd3JpdGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB3cml0ZSgKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB3cml0ZSgKLWNoYXJbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGUoCi1jaGFyW10KLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEuaW8uQnVmZmVyZWRXcml0ZXIgZXh0ZW5kcyBqYXZhLmlvLldyaXRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGNoYXJbXSBidWYKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGxpbmVTZXBhcmF0b3IKLQotcHJpdmF0ZSBqYXZhLmlvLldyaXRlciBvdXQKLQotcHJpdmF0ZSBpbnQgcG9zCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5Xcml0ZXIpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uV3JpdGVyCi1pbnQpCi0KLXByaXZhdGUgYm9vbGVhbiBpc0Nsb3NlZCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNsb3NlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgZmx1c2goKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBuZXdMaW5lKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgd3JpdGUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHdyaXRlKAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHdyaXRlKAotY2hhcltdCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtIGV4dGVuZHMgamF2YS5pby5JbnB1dFN0cmVhbQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgYnl0ZVtdIGJ1ZgotCi1wcm90ZWN0ZWQgaW50IGNvdW50Ci0KLXByb3RlY3RlZCBpbnQgbWFyawotCi1wcm90ZWN0ZWQgaW50IHBvcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWJ5dGVbXSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYnl0ZVtdCi1pbnQKLWludCkKLQotcHVibGljIGludCBhdmFpbGFibGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjbG9zZSgpCi0KLXB1YmxpYyB2b2lkIG1hcmsoCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKQotCi1wdWJsaWMgaW50IHJlYWQoKQotCi1wdWJsaWMgaW50IHJlYWQoCi1ieXRlW10KLWludAotaW50KQotCi1wdWJsaWMgdm9pZCByZXNldCgpCi0KLXB1YmxpYyBsb25nIHNraXAoCi1sb25nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGV4dGVuZHMgamF2YS5pby5PdXRwdXRTdHJlYW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIGJ5dGVbXSBidWYKLQotcHJvdGVjdGVkIGludCBjb3VudAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludCkKLQotcHJpdmF0ZSB2b2lkIGV4cGFuZCgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY2xvc2UoKQotCi1wdWJsaWMgdm9pZCByZXNldCgpCi0KLXB1YmxpYyBpbnQgc2l6ZSgpCi0KLXB1YmxpYyBieXRlW10gdG9CeXRlQXJyYXkoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi1AamF2YS5sYW5nLkRlcHJlY2F0ZWQKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL1Vuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgd3JpdGUoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHdyaXRlKAotYnl0ZVtdCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgd3JpdGVUbygKLWphdmEuaW8uT3V0cHV0U3RyZWFtKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEuaW8uQ2hhckFycmF5UmVhZGVyIGV4dGVuZHMgamF2YS5pby5SZWFkZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIGNoYXJbXSBidWYKLQotcHJvdGVjdGVkIGludCBjb3VudAotCi1wcm90ZWN0ZWQgaW50IG1hcmtlZFBvcwotCi1wcm90ZWN0ZWQgaW50IHBvcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWNoYXJbXSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotY2hhcltdCi1pbnQKLWludCkKLQotcHJpdmF0ZSBib29sZWFuIGlzQ2xvc2VkKCkKLQotcHJpdmF0ZSBib29sZWFuIGlzT3BlbigpCi0KLXB1YmxpYyB2b2lkIGNsb3NlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgbWFyaygKLWludCkKLQotcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcmVhZCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcmVhZCgKLWNoYXJbXQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIHJlYWR5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcmVzZXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgbG9uZyBza2lwKAotbG9uZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLmlvLkNoYXJBcnJheVdyaXRlciBleHRlbmRzIGphdmEuaW8uV3JpdGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCBjaGFyW10gYnVmCi0KLXByb3RlY3RlZCBpbnQgY291bnQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQpCi0KLXByaXZhdGUgdm9pZCBleHBhbmQoCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmlvLkNoYXJBcnJheVdyaXRlciBhcHBlbmQoCi1jaGFyKQotCi1wdWJsaWMgamF2YS5pby5DaGFyQXJyYXlXcml0ZXIgYXBwZW5kKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotcHVibGljIGphdmEuaW8uQ2hhckFycmF5V3JpdGVyIGFwcGVuZCgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5pby5Xcml0ZXIgYXBwZW5kKAotY2hhcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvbGF0aWxlIGphdmEuaW8uV3JpdGVyIGFwcGVuZCgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmlvLldyaXRlciBhcHBlbmQoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5BcHBlbmRhYmxlIGFwcGVuZCgKLWNoYXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuQXBwZW5kYWJsZSBhcHBlbmQoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLkFwcGVuZGFibGUgYXBwZW5kKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIGNsb3NlKCkKLQotcHVibGljIHZvaWQgZmx1c2goKQotCi1wdWJsaWMgdm9pZCByZXNldCgpCi0KLXB1YmxpYyBpbnQgc2l6ZSgpCi0KLXB1YmxpYyBjaGFyW10gdG9DaGFyQXJyYXkoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLXB1YmxpYyB2b2lkIHdyaXRlKAotaW50KQotCi1wdWJsaWMgdm9pZCB3cml0ZSgKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCB3cml0ZSgKLWNoYXJbXQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHdyaXRlVG8oCi1qYXZhLmlvLldyaXRlcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLmlvLklPRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLkV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEuaW8uQ2hhckNvbnZlcnNpb25FeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmlvLklPRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEuaW8uRGF0YUlucHV0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHJlYWRCb29sZWFuKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJ5dGUgcmVhZEJ5dGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgY2hhciByZWFkQ2hhcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBkb3VibGUgcmVhZERvdWJsZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBmbG9hdCByZWFkRmxvYXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCByZWFkRnVsbHkoCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlYWRGdWxseSgKLWJ5dGVbXQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgcmVhZEludCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIHJlYWRMaW5lKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGxvbmcgcmVhZExvbmcoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgc2hvcnQgcmVhZFNob3J0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgcmVhZFVURigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgcmVhZFVuc2lnbmVkQnl0ZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgcmVhZFVuc2lnbmVkU2hvcnQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IHNraXBCeXRlcygKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbSBleHRlbmRzIGphdmEuaW8uRmlsdGVySW5wdXRTdHJlYW0gaW1wbGVtZW50cyBqYXZhLmlvLkRhdGFJbnB1dAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uSW5wdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyByZWFkVVRGKAotamF2YS5pby5EYXRhSW5wdXQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLSBqYXZhLmxhbmcuU3RyaW5nIGRlY29kZVVURigKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIGludCByZWFkKAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgaW50IHJlYWQoCi1ieXRlW10KLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgYm9vbGVhbiByZWFkQm9vbGVhbigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBieXRlIHJlYWRCeXRlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIGNoYXIgcmVhZENoYXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgZG91YmxlIHJlYWREb3VibGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgZmxvYXQgcmVhZEZsb2F0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIHZvaWQgcmVhZEZ1bGx5KAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgdm9pZCByZWFkRnVsbHkoCi1ieXRlW10KLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgaW50IHJlYWRJbnQoKQotQGphdmEubGFuZy5EZXByZWNhdGVkCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIHJlYWRMaW5lKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIGxvbmcgcmVhZExvbmcoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgc2hvcnQgcmVhZFNob3J0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgcmVhZFVURigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBpbnQgcmVhZFVuc2lnbmVkQnl0ZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBpbnQgcmVhZFVuc2lnbmVkU2hvcnQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgaW50IHNraXBCeXRlcygKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgamF2YS5pby5EYXRhT3V0cHV0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZSgKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGUoCi1ieXRlW10KLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZUJvb2xlYW4oCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZUJ5dGUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlQnl0ZXMoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZUNoYXIoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlQ2hhcnMoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZURvdWJsZSgKLWRvdWJsZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVGbG9hdCgKLWZsb2F0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZUludCgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVMb25nKAotbG9uZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVTaG9ydCgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVVVEYoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEuaW8uRGF0YU91dHB1dFN0cmVhbSBleHRlbmRzIGphdmEuaW8uRmlsdGVyT3V0cHV0U3RyZWFtIGltcGxlbWVudHMgamF2YS5pby5EYXRhT3V0cHV0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBmaW5hbCBpbnQgTUFYX0JVRl9TSVpFCi0KLXByb3RlY3RlZCBpbnQgd3JpdHRlbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uT3V0cHV0U3RyZWFtKQotCi0gbG9uZyBjb3VudFVURkJ5dGVzKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgZmx1c2goKQotCi1wdWJsaWMgZmluYWwgaW50IHNpemUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB3cml0ZSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgd3JpdGUoCi1ieXRlW10KLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgdm9pZCB3cml0ZUJvb2xlYW4oCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgdm9pZCB3cml0ZUJ5dGUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlQnl0ZXMoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgdm9pZCB3cml0ZUNoYXIoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlQ2hhcnMoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgdm9pZCB3cml0ZURvdWJsZSgKLWRvdWJsZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIHZvaWQgd3JpdGVGbG9hdCgKLWZsb2F0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgdm9pZCB3cml0ZUludCgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIHZvaWQgd3JpdGVMb25nKAotbG9uZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIHZvaWQgd3JpdGVTaG9ydCgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIHZvaWQgd3JpdGVVVEYoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi0gdm9pZCB3cml0ZVVURkJ5dGVzKAotamF2YS5sYW5nLlN0cmluZwotbG9uZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxqYXZhL2xhbmcvVGhyZWFkJFVuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcjtMamF2YS9sYW5nL1RocmVhZCRTdGF0ZTtMamF2YS9sYW5nL1RocmVhZCRQYXJrU3RhdGU7ICkKLXB1YmxpYyBjbGFzcyBqYXZhLmxhbmcuVGhyZWFkIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5SdW5uYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfUFJJT1JJVFkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlOX1BSSU9SSVRZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PUk1fUFJJT1JJVFkKLQotcHJpdmF0ZSBzdGF0aWMgaW50IGNvdW50Ci0KLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5UaHJlYWQkVW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyIGRlZmF1bHRVbmNhdWdodEhhbmRsZXIKLQotcHJpdmF0ZSBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIgY29udGV4dENsYXNzTG9hZGVyCi0KLXZvbGF0aWxlIGJvb2xlYW4gZGFlbW9uCi0KLXZvbGF0aWxlIGphdmEubGFuZy5UaHJlYWRHcm91cCBncm91cAotCi0gYm9vbGVhbiBoYXNCZWVuU3RhcnRlZAotCi1wcml2YXRlIGxvbmcgaWQKLQotIGphdmEubGFuZy5UaHJlYWRMb2NhbCRWYWx1ZXMgaW5oZXJpdGFibGVWYWx1ZXMKLQotcHJpdmF0ZSBqYXZhLmxhbmcuUnVubmFibGUgaW50ZXJydXB0QWN0aW9uCi0KLSBqYXZhLmxhbmcuVGhyZWFkTG9jYWwkVmFsdWVzIGxvY2FsVmFsdWVzCi0KLXZvbGF0aWxlIGphdmEubGFuZy5TdHJpbmcgbmFtZQotCi1wcml2YXRlIGludCBwYXJrU3RhdGUKLQotdm9sYXRpbGUgaW50IHByaW9yaXR5Ci0KLXZvbGF0aWxlIGxvbmcgc3RhY2tTaXplCi0KLSBqYXZhLmxhbmcuUnVubmFibGUgdGFyZ2V0Ci0KLXByaXZhdGUgamF2YS5sYW5nLlRocmVhZCRVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIgdW5jYXVnaHRIYW5kbGVyCi0KLXZvbGF0aWxlIGphdmEubGFuZy5WTVRocmVhZCB2bVRocmVhZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlJ1bm5hYmxlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuUnVubmFibGUKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5UaHJlYWRHcm91cAotamF2YS5sYW5nLlJ1bm5hYmxlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuVGhyZWFkR3JvdXAKLWphdmEubGFuZy5SdW5uYWJsZQotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlRocmVhZEdyb3VwCi1qYXZhLmxhbmcuUnVubmFibGUKLWphdmEubGFuZy5TdHJpbmcKLWxvbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5UaHJlYWRHcm91cAotamF2YS5sYW5nLlN0cmluZykKLQotIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlRocmVhZEdyb3VwCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWJvb2xlYW4pCi0KLXB1YmxpYyBzdGF0aWMgaW50IGFjdGl2ZUNvdW50KCkKLQotcHJpdmF0ZSB2b2lkIGNyZWF0ZSgKLWphdmEubGFuZy5UaHJlYWRHcm91cAotamF2YS5sYW5nLlJ1bm5hYmxlCi1qYXZhLmxhbmcuU3RyaW5nCi1sb25nKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5UaHJlYWQgY3VycmVudFRocmVhZCgpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBkdW1wU3RhY2soKQotCi1wdWJsaWMgc3RhdGljIGludCBlbnVtZXJhdGUoCi1qYXZhLmxhbmcuVGhyZWFkW10pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1RocmVhZDtbTGphdmEvbGFuZy9TdGFja1RyYWNlRWxlbWVudDs+OyApCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5NYXAgZ2V0QWxsU3RhY2tUcmFjZXMoKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5UaHJlYWQkVW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyIGdldERlZmF1bHRVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIoKQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaG9sZHNMb2NrKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGludGVycnVwdGVkKCkKLQotcHVibGljIHN0YXRpYyB2b2lkIHNldERlZmF1bHRVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIoCi1qYXZhLmxhbmcuVGhyZWFkJFVuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcikKLQotcHJpdmF0ZSB2b2lkIHNldEludGVycnVwdEFjdGlvbigKLWphdmEubGFuZy5SdW5uYWJsZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0ludGVycnVwdGVkRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIHZvaWQgc2xlZXAoCi1sb25nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSW50ZXJydXB0ZWRFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgdm9pZCBzbGVlcCgKLWxvbmcKLWludCkKLQotcHVibGljIHN0YXRpYyB2b2lkIHlpZWxkKCkKLQotcHVibGljIGZpbmFsIHZvaWQgY2hlY2tBY2Nlc3MoKQotQGphdmEubGFuZy5EZXByZWNhdGVkCi1wdWJsaWMgaW50IGNvdW50U3RhY2tGcmFtZXMoKQotQGphdmEubGFuZy5EZXByZWNhdGVkCi1wdWJsaWMgdm9pZCBkZXN0cm95KCkKLQotcHVibGljIGphdmEubGFuZy5DbGFzc0xvYWRlciBnZXRDb250ZXh0Q2xhc3NMb2FkZXIoKQotCi1wdWJsaWMgbG9uZyBnZXRJZCgpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGdldE5hbWUoKQotCi1wdWJsaWMgZmluYWwgaW50IGdldFByaW9yaXR5KCkKLQotcHVibGljIGphdmEubGFuZy5TdGFja1RyYWNlRWxlbWVudFtdIGdldFN0YWNrVHJhY2UoKQotCi1wdWJsaWMgamF2YS5sYW5nLlRocmVhZCRTdGF0ZSBnZXRTdGF0ZSgpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLmxhbmcuVGhyZWFkR3JvdXAgZ2V0VGhyZWFkR3JvdXAoKQotCi1wdWJsaWMgamF2YS5sYW5nLlRocmVhZCRVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIgZ2V0VW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyKCkKLQotcHVibGljIHZvaWQgaW50ZXJydXB0KCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gaXNBbGl2ZSgpCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGlzRGFlbW9uKCkKLQotcHVibGljIGJvb2xlYW4gaXNJbnRlcnJ1cHRlZCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbnRlcnJ1cHRlZEV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIHZvaWQgam9pbigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbnRlcnJ1cHRlZEV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIHZvaWQgam9pbigKLWxvbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbnRlcnJ1cHRlZEV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIHZvaWQgam9pbigKLWxvbmcKLWludCkKLQotIHZvaWQgcGFya0ZvcigKLWxvbmcpCi0KLSB2b2lkIHBhcmtVbnRpbCgKLWxvbmcpCi1AamF2YS5sYW5nLkRlcHJlY2F0ZWQKLXB1YmxpYyBmaW5hbCB2b2lkIHJlc3VtZSgpCi0KLXB1YmxpYyB2b2lkIHJ1bigpCi0KLXB1YmxpYyB2b2lkIHNldENvbnRleHRDbGFzc0xvYWRlcigKLWphdmEubGFuZy5DbGFzc0xvYWRlcikKLQotcHVibGljIGZpbmFsIHZvaWQgc2V0RGFlbW9uKAotYm9vbGVhbikKLQotcHVibGljIGZpbmFsIHZvaWQgc2V0TmFtZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHNldFByaW9yaXR5KAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIoCi1qYXZhLmxhbmcuVGhyZWFkJFVuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcikKLQotcHVibGljIHZvaWQgc3RhcnQoKQotQGphdmEubGFuZy5EZXByZWNhdGVkCi1wdWJsaWMgZmluYWwgdm9pZCBzdG9wKCkKLUBqYXZhLmxhbmcuRGVwcmVjYXRlZAotcHVibGljIGZpbmFsIHZvaWQgc3RvcCgKLWphdmEubGFuZy5UaHJvd2FibGUpCi1AamF2YS5sYW5nLkRlcHJlY2F0ZWQKLXB1YmxpYyBmaW5hbCB2b2lkIHN1c3BlbmQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLSB2b2lkIHVucGFyaygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi0gY2xhc3MgamF2YS5pby5EZWxldGVPbkV4aXQgZXh0ZW5kcyBqYXZhLmxhbmcuVGhyZWFkCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGphdmEuaW8uRGVsZXRlT25FeGl0IGluc3RhbmNlCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9BcnJheUxpc3Q8TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuQXJyYXlMaXN0IGZpbGVzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmlvLkRlbGV0ZU9uRXhpdCBnZXRJbnN0YW5jZSgpCi0KLXB1YmxpYyB2b2lkIGFkZEZpbGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEuaW8uRU9GRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5pby5JT0V4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL2lvL0VtdWxhdGVkRmllbGRzOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9T2JqZWN0U2xvdCApCi0gY2xhc3MgamF2YS5pby5FbXVsYXRlZEZpZWxkcyRPYmplY3RTbG90IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gYm9vbGVhbiBkZWZhdWx0ZWQKLQotIGphdmEuaW8uT2JqZWN0U3RyZWFtRmllbGQgZmllbGQKLQotIGphdmEubGFuZy5PYmplY3QgZmllbGRWYWx1ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBqYXZhLmlvLk9iamVjdFN0cmVhbUZpZWxkIGdldEZpZWxkKCkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0RmllbGRWYWx1ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MamF2YS9pby9FbXVsYXRlZEZpZWxkcyRPYmplY3RTbG90OyApCi0gY2xhc3MgamF2YS5pby5FbXVsYXRlZEZpZWxkcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLmlvLk9iamVjdFN0cmVhbUZpZWxkW10gZGVjbGFyZWRGaWVsZHMKLQotcHJpdmF0ZSBqYXZhLmlvLkVtdWxhdGVkRmllbGRzJE9iamVjdFNsb3RbXSBzbG90c1RvU2VyaWFsaXplCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5PYmplY3RTdHJlYW1GaWVsZFtdCi1qYXZhLmlvLk9iamVjdFN0cmVhbUZpZWxkW10pCi0KLXByaXZhdGUgdm9pZCBidWlsZFNsb3RzKAotamF2YS5pby5PYmplY3RTdHJlYW1GaWVsZFtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL0NsYXNzPCo+OylMamF2YS9pby9FbXVsYXRlZEZpZWxkcyRPYmplY3RTbG90OyApCi1wcml2YXRlIGphdmEuaW8uRW11bGF0ZWRGaWVsZHMkT2JqZWN0U2xvdCBmaW5kU2xvdCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5DbGFzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gZGVmYXVsdGVkKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsgKQotcHVibGljIGJ5dGUgZ2V0KAotamF2YS5sYW5nLlN0cmluZwotYnl0ZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsgKQotcHVibGljIGNoYXIgZ2V0KAotamF2YS5sYW5nLlN0cmluZwotY2hhcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsgKQotcHVibGljIGRvdWJsZSBnZXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1kb3VibGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247ICkKLXB1YmxpYyBmbG9hdCBnZXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1mbG9hdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247ICkKLXB1YmxpYyBsb25nIGdldCgKLWphdmEubGFuZy5TdHJpbmcKLWxvbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247ICkKLXB1YmxpYyBzaG9ydCBnZXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1zaG9ydCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gZ2V0KAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcHV0KAotamF2YS5sYW5nLlN0cmluZwotYnl0ZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcHV0KAotamF2YS5sYW5nLlN0cmluZwotY2hhcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcHV0KAotamF2YS5sYW5nLlN0cmluZwotZG91YmxlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBwdXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1mbG9hdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcHV0KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBwdXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1sb25nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBwdXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBwdXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1zaG9ydCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcHV0KAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotcHVibGljIGphdmEuaW8uRW11bGF0ZWRGaWVsZHMkT2JqZWN0U2xvdFtdIHNsb3RzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwMzMgbmFtZSA9UHV0RmllbGQgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvaW8vT2JqZWN0T3V0cHV0U3RyZWFtOyApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0kUHV0RmllbGQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgcHV0KAotamF2YS5sYW5nLlN0cmluZwotYnl0ZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgcHV0KAotamF2YS5sYW5nLlN0cmluZwotY2hhcikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgcHV0KAotamF2YS5sYW5nLlN0cmluZwotZG91YmxlKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBwdXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1mbG9hdCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgcHV0KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBwdXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1sb25nKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBwdXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBwdXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1zaG9ydCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgcHV0KAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotQGphdmEubGFuZy5EZXByZWNhdGVkCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZSgKLWphdmEuaW8uT2JqZWN0T3V0cHV0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotIGNsYXNzIGphdmEuaW8uRW11bGF0ZWRGaWVsZHNGb3JEdW1waW5nIGV4dGVuZHMgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0kUHV0RmllbGQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLmlvLkVtdWxhdGVkRmllbGRzIGVtdWxhdGVkRmllbGRzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS5pby5PYmplY3RTdHJlYW1DbGFzcykKLQotIGphdmEuaW8uRW11bGF0ZWRGaWVsZHMgZW11bGF0ZWRGaWVsZHMoKQotCi1wdWJsaWMgdm9pZCBwdXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1ieXRlKQotCi1wdWJsaWMgdm9pZCBwdXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1jaGFyKQotCi1wdWJsaWMgdm9pZCBwdXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1kb3VibGUpCi0KLXB1YmxpYyB2b2lkIHB1dCgKLWphdmEubGFuZy5TdHJpbmcKLWZsb2F0KQotCi1wdWJsaWMgdm9pZCBwdXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHB1dCgKLWphdmEubGFuZy5TdHJpbmcKLWxvbmcpCi0KLXB1YmxpYyB2b2lkIHB1dCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2lkIHB1dCgKLWphdmEubGFuZy5TdHJpbmcKLXNob3J0KQotCi1wdWJsaWMgdm9pZCBwdXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuKQotQGphdmEubGFuZy5EZXByZWNhdGVkCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHdyaXRlKAotamF2YS5pby5PYmplY3RPdXRwdXQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMDMzIG5hbWUgPUdldEZpZWxkICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL2lvL09iamVjdElucHV0U3RyZWFtOyApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSRHZXRGaWVsZCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBkZWZhdWx0ZWQoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYnl0ZSBnZXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1ieXRlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgY2hhciBnZXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1jaGFyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgZG91YmxlIGdldCgKLWphdmEubGFuZy5TdHJpbmcKLWRvdWJsZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGZsb2F0IGdldCgKLWphdmEubGFuZy5TdHJpbmcKLWZsb2F0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldCgKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGxvbmcgZ2V0KAotamF2YS5sYW5nLlN0cmluZwotbG9uZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5PYmplY3QgZ2V0KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHNob3J0IGdldCgKLWphdmEubGFuZy5TdHJpbmcKLXNob3J0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBnZXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5pby5PYmplY3RTdHJlYW1DbGFzcyBnZXRPYmplY3RTdHJlYW1DbGFzcygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi0gY2xhc3MgamF2YS5pby5FbXVsYXRlZEZpZWxkc0ZvckxvYWRpbmcgZXh0ZW5kcyBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtJEdldEZpZWxkCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS5pby5FbXVsYXRlZEZpZWxkcyBlbXVsYXRlZEZpZWxkcwotCi1wcml2YXRlIGphdmEuaW8uT2JqZWN0U3RyZWFtQ2xhc3Mgc3RyZWFtQ2xhc3MKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLmlvLk9iamVjdFN0cmVhbUNsYXNzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBkZWZhdWx0ZWQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi0gamF2YS5pby5FbXVsYXRlZEZpZWxkcyBlbXVsYXRlZEZpZWxkcygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247ICkKLXB1YmxpYyBieXRlIGdldCgKLWphdmEubGFuZy5TdHJpbmcKLWJ5dGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247ICkKLXB1YmxpYyBjaGFyIGdldCgKLWphdmEubGFuZy5TdHJpbmcKLWNoYXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247ICkKLXB1YmxpYyBkb3VibGUgZ2V0KAotamF2YS5sYW5nLlN0cmluZwotZG91YmxlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOyApCi1wdWJsaWMgZmxvYXQgZ2V0KAotamF2YS5sYW5nLlN0cmluZwotZmxvYXQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgZ2V0KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOyApCi1wdWJsaWMgbG9uZyBnZXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1sb25nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOyApCi1wdWJsaWMgc2hvcnQgZ2V0KAotamF2YS5sYW5nLlN0cmluZwotc2hvcnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIGdldCgKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4pCi0KLXB1YmxpYyBqYXZhLmlvLk9iamVjdFN0cmVhbUNsYXNzIGdldE9iamVjdFN0cmVhbUNsYXNzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgamF2YS5pby5FeHRlcm5hbGl6YWJsZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCByZWFkRXh0ZXJuYWwoCi1qYXZhLmlvLk9iamVjdElucHV0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZUV4dGVybmFsKAotamF2YS5pby5PYmplY3RPdXRwdXQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2lvL1NlcmlhbGl6YWJsZTtMamF2YS9sYW5nL0NvbXBhcmFibGU8TGphdmEvaW8vRmlsZTs+OyApCi1wdWJsaWMgY2xhc3MgamF2YS5pby5GaWxlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlLCBqYXZhLmxhbmcuQ29tcGFyYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBib29sZWFuIGNhc2VTZW5zaXRpdmUKLQotcHJpdmF0ZSBzdGF0aWMgaW50IGNvdW50ZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIHBhdGhTZXBhcmF0b3IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIHBhdGhTZXBhcmF0b3JDaGFyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBzZXBhcmF0b3IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIHNlcGFyYXRvckNoYXIKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBwYXRoCi0KLXRyYW5zaWVudCBieXRlW10gcHJvcGVyUGF0aAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5GaWxlCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLm5ldC5VUkkpCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBjYWxjdWxhdGVQYXRoKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSB2b2lkIGNoZWNrVVJJKAotamF2YS5uZXQuVVJJKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGphdmEuaW8uRmlsZSBjcmVhdGVUZW1wRmlsZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgamF2YS5pby5GaWxlIGNyZWF0ZVRlbXBGaWxlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5pby5GaWxlKQotCi1wcml2YXRlIG5hdGl2ZSBib29sZWFuIGRlbGV0ZURpckltcGwoCi1ieXRlW10pCi0KLXByaXZhdGUgbmF0aXZlIGJvb2xlYW4gZGVsZXRlRmlsZUltcGwoCi1ieXRlW10pCi0KLXByaXZhdGUgbmF0aXZlIGJvb2xlYW4gZXhpc3RzSW1wbCgKLWJ5dGVbXSkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGZpeFNsYXNoZXMoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmlvLkZpbGUgZ2VuVGVtcEZpbGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmlvLkZpbGUpCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBnZXRBYnNvbHV0ZU5hbWUoKQotCi1wcml2YXRlIG5hdGl2ZSBieXRlW10gZ2V0Q2Fub25JbXBsKAotYnl0ZVtdKQotCi1wcml2YXRlIG5hdGl2ZSBieXRlW10gZ2V0TGlua0ltcGwoCi1ieXRlW10pCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZUltcGwoKQotCi1wcml2YXRlIG5hdGl2ZSBib29sZWFuIGlzRGlyZWN0b3J5SW1wbCgKLWJ5dGVbXSkKLQotcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBpc0ZpbGVJbXBsKAotYnl0ZVtdKQotCi1wcml2YXRlIG5hdGl2ZSBib29sZWFuIGlzSGlkZGVuSW1wbCgKLWJ5dGVbXSkKLQotcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBpc1JlYWRPbmx5SW1wbCgKLWJ5dGVbXSkKLQotcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBpc1dyaXRlT25seUltcGwoCi1ieXRlW10pCi0KLXByaXZhdGUgbmF0aXZlIGxvbmcgbGFzdE1vZGlmaWVkSW1wbCgKLWJ5dGVbXSkKLQotcHJpdmF0ZSBuYXRpdmUgbG9uZyBsZW5ndGhJbXBsKAotYnl0ZVtdKQotCi1wcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgbmF0aXZlIGJ5dGVbXVtdIGxpc3RJbXBsKAotYnl0ZVtdKQotCi1wdWJsaWMgc3RhdGljIGphdmEuaW8uRmlsZVtdIGxpc3RSb290cygpCi0KLXByaXZhdGUgbmF0aXZlIGJvb2xlYW4gbWtkaXJJbXBsKAotYnl0ZVtdKQotCi1wcml2YXRlIG5hdGl2ZSBpbnQgbmV3RmlsZUltcGwoCi1ieXRlW10pCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG9uZVRpbWVJbml0aWFsaXphdGlvbigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgcmVhZE9iamVjdCgKLWphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0pCi0KLXByaXZhdGUgbmF0aXZlIGJvb2xlYW4gcmVuYW1lVG9JbXBsKAotYnl0ZVtdCi1ieXRlW10pCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBieXRlW11bXSByb290c0ltcGwoKQotCi1wcml2YXRlIG5hdGl2ZSBib29sZWFuIHNldExhc3RNb2RpZmllZEltcGwoCi1ieXRlW10KLWxvbmcpCi0KLXByaXZhdGUgbmF0aXZlIGJvb2xlYW4gc2V0UmVhZE9ubHlJbXBsKAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoCi1qYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSkKLQotcHVibGljIGJvb2xlYW4gY2FuUmVhZCgpCi0KLXB1YmxpYyBib29sZWFuIGNhbldyaXRlKCkKLQotcHVibGljIGludCBjb21wYXJlVG8oCi1qYXZhLmlvLkZpbGUpCi0KLXB1YmxpYyB2b2xhdGlsZSBpbnQgY29tcGFyZVRvKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gY3JlYXRlTmV3RmlsZSgpCi0KLXB1YmxpYyBib29sZWFuIGRlbGV0ZSgpCi0KLXB1YmxpYyB2b2lkIGRlbGV0ZU9uRXhpdCgpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBib29sZWFuIGV4aXN0cygpCi0KLXB1YmxpYyBqYXZhLmlvLkZpbGUgZ2V0QWJzb2x1dGVGaWxlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QWJzb2x1dGVQYXRoKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuaW8uRmlsZSBnZXRDYW5vbmljYWxGaWxlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Q2Fub25pY2FsUGF0aCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE5hbWUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRQYXJlbnQoKQotCi1wdWJsaWMgamF2YS5pby5GaWxlIGdldFBhcmVudEZpbGUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRQYXRoKCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLXB1YmxpYyBib29sZWFuIGlzQWJzb2x1dGUoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0RpcmVjdG9yeSgpCi0KLXB1YmxpYyBib29sZWFuIGlzRmlsZSgpCi0KLXB1YmxpYyBib29sZWFuIGlzSGlkZGVuKCkKLQotcHVibGljIGxvbmcgbGFzdE1vZGlmaWVkKCkKLQotcHVibGljIGxvbmcgbGVuZ3RoKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBsaXN0KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBsaXN0KAotamF2YS5pby5GaWxlbmFtZUZpbHRlcikKLQotcHVibGljIGphdmEuaW8uRmlsZVtdIGxpc3RGaWxlcygpCi0KLXB1YmxpYyBqYXZhLmlvLkZpbGVbXSBsaXN0RmlsZXMoCi1qYXZhLmlvLkZpbGVGaWx0ZXIpCi0KLXB1YmxpYyBqYXZhLmlvLkZpbGVbXSBsaXN0RmlsZXMoCi1qYXZhLmlvLkZpbGVuYW1lRmlsdGVyKQotCi1wdWJsaWMgYm9vbGVhbiBta2RpcigpCi0KLXB1YmxpYyBib29sZWFuIG1rZGlycygpCi0KLSBieXRlW10gcHJvcGVyUGF0aCgKLWJvb2xlYW4pCi0KLXB1YmxpYyBib29sZWFuIHJlbmFtZVRvKAotamF2YS5pby5GaWxlKQotCi1wdWJsaWMgYm9vbGVhbiBzZXRMYXN0TW9kaWZpZWQoCi1sb25nKQotCi1wdWJsaWMgYm9vbGVhbiBzZXRSZWFkT25seSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotcHVibGljIGphdmEubmV0LlVSSSB0b1VSSSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L01hbGZvcm1lZFVSTEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubmV0LlVSTCB0b1VSTCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgamF2YS5pby5GaWxlRGVzY3JpcHRvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yIGVycgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEuaW8uRmlsZURlc2NyaXB0b3IgaW4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yIG91dAotCi0gaW50IGRlc2NyaXB0b3IKLQotIGJvb2xlYW4gcmVhZE9ubHkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG9uZVRpbWVJbml0aWFsaXphdGlvbigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vU3luY0ZhaWxlZEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBzeW5jSW1wbCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vU3luY0ZhaWxlZEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc3luYygpCi0KLXB1YmxpYyBuYXRpdmUgYm9vbGVhbiB2YWxpZCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEuaW8uRmlsZUZpbHRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBhY2NlcHQoCi1qYXZhLmlvLkZpbGUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvaW8vRmlsZUlucHV0U3RyZWFtOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTQxMDQgbmFtZSA9bnVsbCApCi0gY2xhc3MgamF2YS5pby5GaWxlSW5wdXRTdHJlYW0kMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9UmVwb3NpdGlvbmluZ0xvY2sgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvaW8vRmlsZUlucHV0U3RyZWFtOyApCi0gY2xhc3MgamF2YS5pby5GaWxlSW5wdXRTdHJlYW0kUmVwb3NpdGlvbmluZ0xvY2sgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLSB2b2lkIDxpbml0PigKLWphdmEuaW8uRmlsZUlucHV0U3RyZWFtJDEpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MamF2YS9pby9GaWxlSW5wdXRTdHJlYW0kMTtMamF2YS9pby9GaWxlSW5wdXRTdHJlYW0kUmVwb3NpdGlvbmluZ0xvY2s7ICkKLXB1YmxpYyBjbGFzcyBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbSBleHRlbmRzIGphdmEuaW8uSW5wdXRTdHJlYW0gaW1wbGVtZW50cyBqYXZhLmlvLkNsb3NlYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsIGNoYW5uZWwKLQotIGphdmEuaW8uRmlsZURlc2NyaXB0b3IgZmQKLQotcHJpdmF0ZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5JRmlsZVN5c3RlbSBmaWxlU3lzdGVtCi0KLSBib29sZWFuIGlubmVyRkQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuT2JqZWN0IHJlcG9zaXRpb25pbmdMb2NrCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9GaWxlTm90Rm91bmRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uRmlsZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5GaWxlRGVzY3JpcHRvcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9GaWxlTm90Rm91bmRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCBvcGVuQ2hlY2soKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGF2YWlsYWJsZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNsb3NlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKQotCi1wdWJsaWMgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwgZ2V0Q2hhbm5lbCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yIGdldEZEKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCByZWFkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCByZWFkKAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoCi1ieXRlW10KLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgbG9uZyBza2lwKAotbG9uZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBleHRlbmRzIGphdmEuaW8uSU9FeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW0gZXh0ZW5kcyBqYXZhLmlvLk91dHB1dFN0cmVhbSBpbXBsZW1lbnRzIGphdmEuaW8uQ2xvc2VhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwgY2hhbm5lbAotCi0gamF2YS5pby5GaWxlRGVzY3JpcHRvciBmZAotCi1wcml2YXRlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLklGaWxlU3lzdGVtIGZpbGVTeXN0ZW0KLQotIGJvb2xlYW4gaW5uZXJGRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vRmlsZU5vdEZvdW5kRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmlvLkZpbGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vRmlsZU5vdEZvdW5kRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmlvLkZpbGUKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vRmlsZU5vdEZvdW5kRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0ZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIG9wZW5DaGVjaygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNsb3NlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKQotCi1wdWJsaWMgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwgZ2V0Q2hhbm5lbCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yIGdldEZEKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgd3JpdGUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHdyaXRlKAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB3cml0ZSgKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3NlY3VyaXR5L1ByaXZpbGVnZWRBY3Rpb248TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotIGNsYXNzIGphdmEuaW8uRmlsZVBlcm1pc3Npb24kMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgamF2YS5pby5GaWxlUGVybWlzc2lvbiB0aGlzJDAKLQotZmluYWwgamF2YS5sYW5nLlN0cmluZyB2YWwkcGF0aAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEuaW8uRmlsZVBlcm1pc3Npb24KLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IHJ1bigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEuc2VjdXJpdHkuR3VhcmQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL1NlY3VyaXR5RXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBjaGVja0d1YXJkKAotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb24gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5HdWFyZCwgamF2YS5pby5TZXJpYWxpemFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBuYW1lCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL1NlY3VyaXR5RXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjaGVja0d1YXJkKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0QWN0aW9ucygpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGdldE5hbWUoKQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGhhc2hDb2RlKCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaW1wbGllcygKLWphdmEuc2VjdXJpdHkuUGVybWlzc2lvbikKLQotcHVibGljIGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbkNvbGxlY3Rpb24gbmV3UGVybWlzc2lvbkNvbGxlY3Rpb24oKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgamF2YS5pby5GaWxlUGVybWlzc2lvbiBleHRlbmRzIGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbiBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmdbXSBhY3Rpb25MaXN0Ci0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgYWN0aW9ucwotCi1wcml2YXRlIHRyYW5zaWVudCBib29sZWFuIGFsbERpcgotCi1wcml2YXRlIHRyYW5zaWVudCBib29sZWFuIGFsbFN1YmRpcgotCi1wcml2YXRlIHRyYW5zaWVudCBqYXZhLmxhbmcuU3RyaW5nIGNhbm9uUGF0aAotCi1wcml2YXRlIHRyYW5zaWVudCBib29sZWFuIGluY2x1ZGVBbGwKLQotdHJhbnNpZW50IGludCBtYXNrCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIGludCBnZXRNYXNrKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSB2b2lkIGluaXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL2xhbmcvQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoCi1qYXZhLmlvLk9iamVjdElucHV0U3RyZWFtKQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgdG9DYW5vbmljYWxBY3Rpb25TdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoCi1qYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QWN0aW9ucygpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1wdWJsaWMgYm9vbGVhbiBpbXBsaWVzKAotamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uKQotCi0gaW50IGltcGxpZXNNYXNrKAotamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uKQotCi1wdWJsaWMgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uQ29sbGVjdGlvbiBuZXdQZXJtaXNzaW9uQ29sbGVjdGlvbigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uQ29sbGVjdGlvbiBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSBib29sZWFuIHJlYWRPbmx5Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgYWRkKAotamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9FbnVtZXJhdGlvbjxMamF2YS9zZWN1cml0eS9QZXJtaXNzaW9uOz47ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnV0aWwuRW51bWVyYXRpb24gZWxlbWVudHMoKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpbXBsaWVzKAotamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uKQotCi1wdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkKLQotcHVibGljIHZvaWQgc2V0UmVhZE9ubHkoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1maW5hbCBjbGFzcyBqYXZhLmlvLkZpbGVQZXJtaXNzaW9uQ29sbGVjdGlvbiBleHRlbmRzIGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbkNvbGxlY3Rpb24gaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL1ZlY3RvcjxMamF2YS9zZWN1cml0eS9QZXJtaXNzaW9uOz47ICkKLSBqYXZhLnV0aWwuVmVjdG9yIHBlcm1pc3Npb25zCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgYWRkKAotamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9FbnVtZXJhdGlvbjxMamF2YS9zZWN1cml0eS9QZXJtaXNzaW9uOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuRW51bWVyYXRpb24gZWxlbWVudHMoKQotCi1wdWJsaWMgYm9vbGVhbiBpbXBsaWVzKAotamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGphdmEvaW8vSW5wdXRTdHJlYW1SZWFkZXIkSGlzdG9yaWNhbE5hbWVzVXRpbDsgKQotcHVibGljIGNsYXNzIGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIgZXh0ZW5kcyBqYXZhLmlvLlJlYWRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVGRkVSX1NJWkUKLQotIGphdmEubmlvLkJ5dGVCdWZmZXIgYnl0ZXMKLQotIGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldERlY29kZXIgZGVjb2RlcgotCi1wcml2YXRlIGJvb2xlYW4gZW5kT2ZJbnB1dAotCi1wcml2YXRlIGphdmEuaW8uSW5wdXRTdHJlYW0gaW4KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmlvLklucHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL1Vuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uSW5wdXRTdHJlYW0KLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uSW5wdXRTdHJlYW0KLWphdmEubmlvLmNoYXJzZXQuQ2hhcnNldCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5JbnB1dFN0cmVhbQotamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0RGVjb2RlcikKLQotcHJpdmF0ZSBib29sZWFuIGlzT3BlbigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNsb3NlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RW5jb2RpbmcoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoCi1jaGFyW10KLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiByZWFkeSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5pby5GaWxlUmVhZGVyIGV4dGVuZHMgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vRmlsZU5vdEZvdW5kRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmlvLkZpbGUpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vRmlsZU5vdEZvdW5kRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyIGV4dGVuZHMgamF2YS5pby5Xcml0ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLm5pby5CeXRlQnVmZmVyIGJ5dGVzCi0KLXByaXZhdGUgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0RW5jb2RlciBlbmNvZGVyCi0KLXByaXZhdGUgamF2YS5pby5PdXRwdXRTdHJlYW0gb3V0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5PdXRwdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5PdXRwdXRTdHJlYW0KLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uT3V0cHV0U3RyZWFtCi1qYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uT3V0cHV0U3RyZWFtCi1qYXZhLm5pby5jaGFyc2V0LkNoYXJzZXRFbmNvZGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgY2hlY2tTdGF0dXMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgY29udmVydCgKLWphdmEubmlvLkNoYXJCdWZmZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNsb3NlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgZmx1c2goKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRFbmNvZGluZygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHdyaXRlKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB3cml0ZSgKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB3cml0ZSgKLWNoYXJbXQotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5pby5GaWxlV3JpdGVyIGV4dGVuZHMgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmlvLkZpbGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uRmlsZQotYm9vbGVhbikKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5GaWxlRGVzY3JpcHRvcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZhLmlvLkZpbHRlclJlYWRlciBleHRlbmRzIGphdmEuaW8uUmVhZGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCBqYXZhLmlvLlJlYWRlciBpbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLWphdmEuaW8uUmVhZGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjbG9zZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIG1hcmsoCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoCi1jaGFyW10KLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiByZWFkeSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHJlc2V0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGxvbmcgc2tpcCgKLWxvbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgamF2YS5pby5GaWx0ZXJXcml0ZXIgZXh0ZW5kcyBqYXZhLmlvLldyaXRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgamF2YS5pby5Xcml0ZXIgb3V0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotamF2YS5pby5Xcml0ZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNsb3NlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgZmx1c2goKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB3cml0ZSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgd3JpdGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgd3JpdGUoCi1jaGFyW10KLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1IaXN0b3JpY2FsTmFtZXNVdGlsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL2lvL0lucHV0U3RyZWFtUmVhZGVyOyApCi0gY2xhc3MgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlciRIaXN0b3JpY2FsTmFtZXNVdGlsIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaE1hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuSGFzaE1hcCBoaXN0b3JpY2FsTmFtZXMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRIaXN0b3JpY2FsTmFtZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5pby5JbnRlcnJ1cHRlZElPRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5pby5JT0V4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHVibGljIGludCBieXRlc1RyYW5zZmVycmVkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZhLmlvLk9iamVjdFN0cmVhbUV4Y2VwdGlvbiBleHRlbmRzIGphdmEuaW8uSU9FeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KCkKLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLmlvLkludmFsaWRDbGFzc0V4Y2VwdGlvbiBleHRlbmRzIGphdmEuaW8uT2JqZWN0U3RyZWFtRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBjbGFzc25hbWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRNZXNzYWdlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLmlvLkludmFsaWRPYmplY3RFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmlvLk9iamVjdFN0cmVhbUV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBqYXZhLmxhbmcuRGVwcmVjYXRlZAotcHVibGljIGNsYXNzIGphdmEuaW8uTGluZU51bWJlcklucHV0U3RyZWFtIGV4dGVuZHMgamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGludCBsYXN0Q2hhcgotCi1wcml2YXRlIGludCBsaW5lTnVtYmVyCi0KLXByaXZhdGUgaW50IG1hcmtlZExhc3RDaGFyCi0KLXByaXZhdGUgaW50IG1hcmtlZExpbmVOdW1iZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmlvLklucHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGF2YWlsYWJsZSgpCi0KLXB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpCi0KLXB1YmxpYyB2b2lkIG1hcmsoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcmVhZCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcmVhZCgKLWJ5dGVbXQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHJlc2V0KCkKLQotcHVibGljIHZvaWQgc2V0TGluZU51bWJlcigKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGxvbmcgc2tpcCgKLWxvbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5pby5MaW5lTnVtYmVyUmVhZGVyIGV4dGVuZHMgamF2YS5pby5CdWZmZXJlZFJlYWRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGJvb2xlYW4gbGFzdFdhc0NSCi0KLXByaXZhdGUgaW50IGxpbmVOdW1iZXIKLQotcHJpdmF0ZSBib29sZWFuIG1hcmtlZExhc3RXYXNDUgotCi1wcml2YXRlIGludCBtYXJrZWRMaW5lTnVtYmVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5SZWFkZXIpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uUmVhZGVyCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIG1hcmsoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcmVhZCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcmVhZCgKLWNoYXJbXQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHJlYWRMaW5lKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcmVzZXQoKQotCi1wdWJsaWMgdm9pZCBzZXRMaW5lTnVtYmVyKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgbG9uZyBza2lwKAotbG9uZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLmlvLk5vdEFjdGl2ZUV4Y2VwdGlvbiBleHRlbmRzIGphdmEuaW8uT2JqZWN0U3RyZWFtRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5pby5Ob3RTZXJpYWxpemFibGVFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmlvLk9iamVjdFN0cmVhbUV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZhLmlvLk9iamVjdElucHV0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuaW8uRGF0YUlucHV0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCBhdmFpbGFibGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBjbG9zZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgcmVhZCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgcmVhZCgKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCByZWFkKAotYnl0ZVtdCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0NsYXNzTm90Rm91bmRFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuT2JqZWN0IHJlYWRPYmplY3QoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgbG9uZyBza2lwKAotbG9uZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvc2VjdXJpdHkvUHJpdmlsZWdlZEFjdGlvbjxMamF2YS9sYW5nL0Jvb2xlYW47PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotIGNsYXNzIGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0kMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSB0aGlzJDAKLQotZmluYWwgamF2YS5sYW5nLkNsYXNzIHZhbCRpbXBsZW1lbnRhdGlvbkNsYXNzCi0KLWZpbmFsIGphdmEubGFuZy5DbGFzcyB2YWwkdGhpc0NsYXNzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbQotamF2YS5sYW5nLkNsYXNzCi1qYXZhLmxhbmcuQ2xhc3MpCi0KLXB1YmxpYyBqYXZhLmxhbmcuQm9vbGVhbiBydW4oKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1JbnB1dFZhbGlkYXRpb25EZXNjICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL2lvL09iamVjdElucHV0U3RyZWFtOyApCi0gY2xhc3MgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSRJbnB1dFZhbGlkYXRpb25EZXNjIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gaW50IHByaW9yaXR5Ci0KLSBqYXZhLmlvLk9iamVjdElucHV0VmFsaWRhdGlvbiB2YWxpZGF0b3IKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZhLmlvLk9iamVjdFN0cmVhbUNvbnN0YW50cyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPVE9DT0xfVkVSU0lPTl8xCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1RPQ09MX1ZFUlNJT05fMgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgU0NfQkxPQ0tfREFUQQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgU0NfRU5VTQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgU0NfRVhURVJOQUxJWkFCTEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFNDX1NFUklBTElaQUJMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgU0NfV1JJVEVfTUVUSE9ECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgU1RSRUFNX01BR0lDCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgU1RSRUFNX1ZFUlNJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmlvLlNlcmlhbGl6YWJsZVBlcm1pc3Npb24gU1VCQ0xBU1NfSU1QTEVNRU5UQVRJT05fUEVSTUlTU0lPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEuaW8uU2VyaWFsaXphYmxlUGVybWlzc2lvbiBTVUJTVElUVVRJT05fUEVSTUlTU0lPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgVENfQVJSQVkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFRDX0JBU0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFRDX0JMT0NLREFUQQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgVENfQkxPQ0tEQVRBTE9ORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgVENfQ0xBU1MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFRDX0NMQVNTREVTQwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgVENfRU5EQkxPQ0tEQVRBCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBUQ19FTlVNCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBUQ19FWENFUFRJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFRDX0xPTkdTVFJJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFRDX01BWAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgVENfTlVMTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgVENfT0JKRUNUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBUQ19QUk9YWUNMQVNTREVTQwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgVENfUkVGRVJFTkNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBUQ19SRVNFVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgVENfU1RSSU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJhc2VXaXJlSGFuZGxlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGphdmEvaW8vT2JqZWN0SW5wdXRTdHJlYW0kR2V0RmllbGQ7TGphdmEvaW8vT2JqZWN0SW5wdXRTdHJlYW0kSW5wdXRWYWxpZGF0aW9uRGVzYzsgKQotcHVibGljIGNsYXNzIGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0gZXh0ZW5kcyBqYXZhLmlvLklucHV0U3RyZWFtIGltcGxlbWVudHMgamF2YS5pby5PYmplY3RJbnB1dCwgamF2YS5pby5PYmplY3RTdHJlYW1Db25zdGFudHMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0hhc2h0YWJsZTxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL0NsYXNzPCo+Oz47ICkKLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEudXRpbC5IYXNodGFibGUgUFJJTUlUSVZFX0NMQVNTRVMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLk9iamVjdCBVTlNIQVJFRF9PQkoKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkNsYXNzTG9hZGVyIGJvb3RzdHJhcExvYWRlcgotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmlvLklucHV0U3RyZWFtIGVtcHR5U3RyZWFtCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DbGFzc0xvYWRlciBzeXN0ZW1Mb2FkZXIKLQotcHJpdmF0ZSBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIgY2FsbGVyQ2xhc3NMb2FkZXIKLQotcHJpdmF0ZSBqYXZhLmlvLk9iamVjdFN0cmVhbUNsYXNzIGN1cnJlbnRDbGFzcwotCi1wcml2YXRlIGludCBjdXJyZW50SGFuZGxlCi0KLXByaXZhdGUgamF2YS5sYW5nLk9iamVjdCBjdXJyZW50T2JqZWN0Ci0KLXByaXZhdGUgamF2YS5sYW5nLkludGVnZXIgZGVzY3JpcHRvckhhbmRsZQotCi1wcml2YXRlIGJvb2xlYW4gZW5hYmxlUmVzb2x2ZQotCi1wcml2YXRlIGJvb2xlYW4gaGFzUHVzaGJhY2tUQwotCi1wcml2YXRlIGphdmEuaW8uRGF0YUlucHV0U3RyZWFtIGlucHV0Ci0KLXByaXZhdGUgYm9vbGVhbiBtdXN0UmVzb2x2ZQotCi1wcml2YXRlIGludCBuZXN0ZWRMZXZlbHMKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0hhc2h0YWJsZTxMamF2YS9sYW5nL0ludGVnZXI7TGphdmEvbGFuZy9PYmplY3Q7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuSGFzaHRhYmxlIG9iamVjdHNSZWFkCi0KLXByaXZhdGUgamF2YS5pby5JbnB1dFN0cmVhbSBwcmltaXRpdmVEYXRhCi0KLXByaXZhdGUgamF2YS5pby5EYXRhSW5wdXRTdHJlYW0gcHJpbWl0aXZlVHlwZXMKLQotcHJpdmF0ZSBieXRlIHB1c2hiYWNrVEMKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0lkZW50aXR5SGFzaE1hcDxMamF2YS9sYW5nL0NsYXNzPCo+O0xqYXZhL2xhbmcvT2JqZWN0Oz47ICkKLXByaXZhdGUgamF2YS51dGlsLklkZW50aXR5SGFzaE1hcCByZWFkUmVzb2x2ZUNhY2hlCi0KLXByaXZhdGUgYm9vbGVhbiBzdWJjbGFzc092ZXJyaWRpbmdJbXBsZW1lbnRhdGlvbgotCi1wcml2YXRlIGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0kSW5wdXRWYWxpZGF0aW9uRGVzY1tdIHZhbGlkYXRpb25zCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL2xhbmcvU2VjdXJpdHlFeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vU3RyZWFtQ29ycnVwdGVkRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmlvLklucHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgY2hlY2tSZWFkUHJpbWl0aXZlVHlwZXMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL1N0cmVhbUNvcnJ1cHRlZEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja2VkU2V0U3VwZXJDbGFzc0Rlc2MoCi1qYXZhLmlvLk9iamVjdFN0cmVhbUNsYXNzCi1qYXZhLmlvLk9iamVjdFN0cmVhbUNsYXNzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIGRpc2NhcmREYXRhKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9DbGFzczwqPjtMamF2YS91dGlsL0FycmF5TGlzdDxMamF2YS9pby9PYmplY3RTdHJlYW1DbGFzczs+O0kpSSApCi1wcml2YXRlIGludCBmaW5kU3RyZWFtU3VwZXJjbGFzcygKLWphdmEubGFuZy5DbGFzcwotamF2YS51dGlsLkFycmF5TGlzdAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEJhc2VOYW1lKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLkNsYXNzTG9hZGVyIGdldENsb3Nlc3RVc2VyQ2xhc3NMb2FkZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL0NsYXNzPCo+O0xqYXZhL2xhbmcvQ2xhc3M8Kj47KVogKQotcHJpdmF0ZSBib29sZWFuIGluU2FtZVBhY2thZ2UoCi1qYXZhLmxhbmcuQ2xhc3MKLWphdmEubGFuZy5DbGFzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9DbGFzczwqPjtMamF2YS9sYW5nL0NsYXNzPCo+OylMamF2YS9sYW5nL09iamVjdDsgKQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGphdmEubGFuZy5PYmplY3QgbmV3SW5zdGFuY2UoCi1qYXZhLmxhbmcuQ2xhc3MKLWphdmEubGFuZy5DbGFzcykKLQotcHJpdmF0ZSBpbnQgbmV4dEhhbmRsZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgYnl0ZSBuZXh0VEMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvTm9TdWNoRmllbGRFcnJvcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL0NsYXNzPCo+O0xqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvT2JqZWN0OylWICkKLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG9ialNldEZpZWxkKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLkNsYXNzCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wcml2YXRlIHZvaWQgcHVzaGJhY2tUQygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgYnl0ZVtdIHJlYWRCbG9ja0RhdGEoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIGJ5dGVbXSByZWFkQmxvY2tEYXRhTG9uZygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIGphdmEuaW8uT2JqZWN0U3RyZWFtQ2xhc3MgcmVhZENsYXNzRGVzYygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIGphdmEubGFuZy5PYmplY3QgcmVhZENvbnRlbnQoCi1ieXRlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0ludmFsaWRPYmplY3RFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgamF2YS5sYW5nLk9iamVjdCByZWFkQ3ljbGljUmVmZXJlbmNlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9PcHRpb25hbERhdGFFeGNlcHRpb247TGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIGphdmEubGFuZy5PYmplY3QgcmVhZEVudW0oCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL2xhbmcvQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSBqYXZhLmlvLk9iamVjdFN0cmVhbUNsYXNzIHJlYWRFbnVtRGVzYygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uOyApCi1wcml2YXRlIGphdmEuaW8uT2JqZWN0U3RyZWFtQ2xhc3MgcmVhZEVudW1EZXNjSW50ZXJuYWwoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL1dyaXRlQWJvcnRlZEV4Y2VwdGlvbjtMamF2YS9pby9PcHRpb25hbERhdGFFeGNlcHRpb247TGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIGphdmEubGFuZy5FeGNlcHRpb24gcmVhZEV4Y2VwdGlvbigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgcmVhZEZpZWxkRGVzY3JpcHRvcnMoCi1qYXZhLmlvLk9iamVjdFN0cmVhbUNsYXNzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL09wdGlvbmFsRGF0YUV4Y2VwdGlvbjtMamF2YS9pby9JbnZhbGlkQ2xhc3NFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCByZWFkRmllbGRWYWx1ZXMoCi1qYXZhLmlvLkVtdWxhdGVkRmllbGRzRm9yTG9hZGluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9PcHRpb25hbERhdGFFeGNlcHRpb247TGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgcmVhZEZpZWxkVmFsdWVzKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5pby5PYmplY3RTdHJlYW1DbGFzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9sYW5nL0NsYXNzTm90Rm91bmRFeGNlcHRpb247TGphdmEvaW8vTm90QWN0aXZlRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgcmVhZEhpZXJhcmNoeSgKLWphdmEubGFuZy5PYmplY3QKLWphdmEuaW8uT2JqZWN0U3RyZWFtQ2xhc3MpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vT3B0aW9uYWxEYXRhRXhjZXB0aW9uO0xqYXZhL2xhbmcvQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBqYXZhLmxhbmcuT2JqZWN0IHJlYWROZXdBcnJheSgKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFopTGphdmEvbGFuZy9DbGFzczwqPjsgKQotcHJpdmF0ZSBqYXZhLmxhbmcuQ2xhc3MgcmVhZE5ld0NsYXNzKAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0NsYXNzTm90Rm91bmRFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgamF2YS5pby5PYmplY3RTdHJlYW1DbGFzcyByZWFkTmV3Q2xhc3NEZXNjKAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBqYXZhLmxhbmcuSW50ZWdlciByZWFkTmV3SGFuZGxlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBqYXZhLmxhbmcuT2JqZWN0IHJlYWROZXdMb25nU3RyaW5nKAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9PcHRpb25hbERhdGFFeGNlcHRpb247TGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIGphdmEubGFuZy5PYmplY3QgcmVhZE5ld09iamVjdCgKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS9sYW5nL0NsYXNzPCo+OyApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIGphdmEubGFuZy5DbGFzcyByZWFkTmV3UHJveHlDbGFzc0Rlc2MoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIGphdmEubGFuZy5PYmplY3QgcmVhZE5ld1N0cmluZygKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIGphdmEubGFuZy5PYmplY3QgcmVhZE5vblByaW1pdGl2ZUNvbnRlbnQoCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL09wdGlvbmFsRGF0YUV4Y2VwdGlvbjtMamF2YS9sYW5nL0NsYXNzTm90Rm91bmRFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgamF2YS5sYW5nLk9iamVjdCByZWFkT2JqZWN0KAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9sYW5nL0NsYXNzTm90Rm91bmRFeGNlcHRpb247TGphdmEvaW8vTm90QWN0aXZlRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgcmVhZE9iamVjdEZvckNsYXNzKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5pby5PYmplY3RTdHJlYW1DbGFzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9PYmplY3RTdHJlYW1FeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9DbGFzczwqPjspViApCi1wcml2YXRlIHZvaWQgcmVhZE9iamVjdE5vRGF0YSgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5DbGFzcykKLQotcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyT2JqZWN0UmVhZCgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5JbnRlZ2VyCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0ludmFsaWRPYmplY3RFeGNlcHRpb247ICkKLXByaXZhdGUgamF2YS5sYW5nLk9iamVjdCByZWdpc3RlcmVkT2JqZWN0UmVhZCgKLWphdmEubGFuZy5JbnRlZ2VyKQotCi1wcml2YXRlIHZvaWQgcmVzZXRTZWVuT2JqZWN0cygpCi0KLXByaXZhdGUgdm9pZCByZXNldFN0YXRlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL05vU3VjaEZpZWxkRXJyb3I7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9DbGFzczwqPjtMamF2YS9sYW5nL1N0cmluZztCKVYgKQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgc2V0RmllbGQoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuQ2xhc3MKLWphdmEubGFuZy5TdHJpbmcKLWJ5dGUpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcvQ2xhc3M8Kj47TGphdmEvbGFuZy9TdHJpbmc7QylWICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL05vU3VjaEZpZWxkRXJyb3I7ICkKLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIHNldEZpZWxkKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLkNsYXNzCi1qYXZhLmxhbmcuU3RyaW5nCi1jaGFyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvTm9TdWNoRmllbGRFcnJvcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL0NsYXNzPCo+O0xqYXZhL2xhbmcvU3RyaW5nO0QpViApCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBzZXRGaWVsZCgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5DbGFzcwotamF2YS5sYW5nLlN0cmluZwotZG91YmxlKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL0NsYXNzPCo+O0xqYXZhL2xhbmcvU3RyaW5nO0YpViApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9Ob1N1Y2hGaWVsZEVycm9yOyApCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBzZXRGaWVsZCgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5DbGFzcwotamF2YS5sYW5nLlN0cmluZwotZmxvYXQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9Ob1N1Y2hGaWVsZEVycm9yOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcvQ2xhc3M8Kj47TGphdmEvbGFuZy9TdHJpbmc7SSlWICkKLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIHNldEZpZWxkKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLkNsYXNzCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9Ob1N1Y2hGaWVsZEVycm9yOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcvQ2xhc3M8Kj47TGphdmEvbGFuZy9TdHJpbmc7SilWICkKLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIHNldEZpZWxkKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLkNsYXNzCi1qYXZhLmxhbmcuU3RyaW5nCi1sb25nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvTm9TdWNoRmllbGRFcnJvcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL0NsYXNzPCo+O0xqYXZhL2xhbmcvU3RyaW5nO1MpViApCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBzZXRGaWVsZCgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5DbGFzcwotamF2YS5sYW5nLlN0cmluZwotc2hvcnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcvQ2xhc3M8Kj47TGphdmEvbGFuZy9TdHJpbmc7WilWICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL05vU3VjaEZpZWxkRXJyb3I7ICkKLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIHNldEZpZWxkKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLkNsYXNzCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0ludmFsaWRDbGFzc0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHZlcmlmeUJhc2VOYW1lKAotamF2YS5pby5PYmplY3RTdHJlYW1DbGFzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JbnZhbGlkQ2xhc3NFeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCB2ZXJpZnlTVUlEKAotamF2YS5pby5PYmplY3RTdHJlYW1DbGFzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCBhdmFpbGFibGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjbG9zZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uO0xqYXZhL2lvL05vdEFjdGl2ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgZGVmYXVsdFJlYWRPYmplY3QoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvU2VjdXJpdHlFeGNlcHRpb247ICkKLXByb3RlY3RlZCBib29sZWFuIGVuYWJsZVJlc29sdmVPYmplY3QoCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoCi1ieXRlW10KLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiByZWFkQm9vbGVhbigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBieXRlIHJlYWRCeXRlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGNoYXIgcmVhZENoYXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL2xhbmcvQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGphdmEuaW8uT2JqZWN0U3RyZWFtQ2xhc3MgcmVhZENsYXNzRGVzY3JpcHRvcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBkb3VibGUgcmVhZERvdWJsZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uO0xqYXZhL2lvL05vdEFjdGl2ZUV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0kR2V0RmllbGQgcmVhZEZpZWxkcygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBmbG9hdCByZWFkRmxvYXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCByZWFkRnVsbHkoCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHJlYWRGdWxseSgKLWJ5dGVbXQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcmVhZEludCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLUBqYXZhLmxhbmcuRGVwcmVjYXRlZAotcHVibGljIGphdmEubGFuZy5TdHJpbmcgcmVhZExpbmUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgbG9uZyByZWFkTG9uZygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vT3B0aW9uYWxEYXRhRXhjZXB0aW9uO0xqYXZhL2xhbmcvQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIGphdmEubGFuZy5PYmplY3QgcmVhZE9iamVjdCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vT3B0aW9uYWxEYXRhRXhjZXB0aW9uO0xqYXZhL2xhbmcvQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGphdmEubGFuZy5PYmplY3QgcmVhZE9iamVjdE92ZXJyaWRlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHNob3J0IHJlYWRTaG9ydCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvaW8vU3RyZWFtQ29ycnVwdGVkRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCByZWFkU3RyZWFtSGVhZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgcmVhZFVURigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCByZWFkVW5zaGFyZWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWRVbnNpZ25lZEJ5dGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWRVbnNpZ25lZFNob3J0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9Ob3RBY3RpdmVFeGNlcHRpb247TGphdmEvaW8vSW52YWxpZE9iamVjdEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcmVnaXN0ZXJWYWxpZGF0aW9uKAotamF2YS5pby5PYmplY3RJbnB1dFZhbGlkYXRpb24KLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9sYW5nL0NsYXNzTm90Rm91bmRFeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvaW8vT2JqZWN0U3RyZWFtQ2xhc3M7KUxqYXZhL2xhbmcvQ2xhc3M8Kj47ICkKLXByb3RlY3RlZCBqYXZhLmxhbmcuQ2xhc3MgcmVzb2x2ZUNsYXNzKAotamF2YS5pby5PYmplY3RTdHJlYW1DbGFzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGphdmEubGFuZy5PYmplY3QgcmVzb2x2ZU9iamVjdCgKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFtMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9DbGFzczwqPjsgKQotcHJvdGVjdGVkIGphdmEubGFuZy5DbGFzcyByZXNvbHZlUHJveHlDbGFzcygKLWphdmEubGFuZy5TdHJpbmdbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCBza2lwQnl0ZXMoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEuaW8uT2JqZWN0SW5wdXRWYWxpZGF0aW9uIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSW52YWxpZE9iamVjdEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgdmFsaWRhdGVPYmplY3QoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZhLmlvLk9iamVjdE91dHB1dCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmlvLkRhdGFPdXRwdXQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBjbG9zZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGZsdXNoKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlKAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZSgKLWJ5dGVbXQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlT2JqZWN0KAotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxqYXZhL2lvL09iamVjdE91dHB1dFN0cmVhbSRQdXRGaWVsZDsgKQotcHVibGljIGNsYXNzIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIGV4dGVuZHMgamF2YS5pby5PdXRwdXRTdHJlYW0gaW1wbGVtZW50cyBqYXZhLmlvLk9iamVjdE91dHB1dCwgamF2YS5pby5PYmplY3RTdHJlYW1Db25zdGFudHMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLmlvLk9iamVjdFN0cmVhbUNsYXNzIGN1cnJlbnRDbGFzcwotCi1wcml2YXRlIGludCBjdXJyZW50SGFuZGxlCi0KLXByaXZhdGUgamF2YS5sYW5nLk9iamVjdCBjdXJyZW50T2JqZWN0Ci0KLXByaXZhdGUgamF2YS5pby5FbXVsYXRlZEZpZWxkc0ZvckR1bXBpbmcgY3VycmVudFB1dEZpZWxkCi0KLXByaXZhdGUgYm9vbGVhbiBlbmFibGVSZXBsYWNlCi0KLXByaXZhdGUgamF2YS5pby5TdHJlYW1Db3JydXB0ZWRFeGNlcHRpb24gbmVzdGVkRXhjZXB0aW9uCi0KLXByaXZhdGUgaW50IG5lc3RlZExldmVscwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSWRlbnRpdHlIYXNoTWFwPExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcvSW50ZWdlcjs+OyApCi1wcml2YXRlIGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXAgb2JqZWN0c1dyaXR0ZW4KLQotcHJpdmF0ZSBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW0gb3V0cHV0Ci0KLXByaXZhdGUgamF2YS5pby5EYXRhT3V0cHV0U3RyZWFtIHByaW1pdGl2ZVR5cGVzCi0KLXByaXZhdGUgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0gcHJpbWl0aXZlVHlwZXNCdWZmZXIKLQotcHJpdmF0ZSBpbnQgcHJvdG9jb2xWZXJzaW9uCi0KLXByaXZhdGUgYm9vbGVhbiBzdWJjbGFzc092ZXJyaWRpbmdJbXBsZW1lbnRhdGlvbgotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSWRlbnRpdHlIYXNoTWFwPExqYXZhL2xhbmcvQ2xhc3M8Kj47TGphdmEvbGFuZy9PYmplY3Q7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwIHdyaXRlUmVwbGFjZUNhY2hlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9sYW5nL1NlY3VyaXR5RXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmlvLk91dHB1dFN0cmVhbSkKLQotcHJpdmF0ZSB2b2lkIGNoZWNrV3JpdGVQcmltaXRpdmVUeXBlcygpCi0KLXByaXZhdGUgdm9pZCBjb21wdXRlUHV0RmllbGQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIGphdmEubGFuZy5JbnRlZ2VyIGR1bXBDeWNsZSgKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcvQ2xhc3M8Kj47TGphdmEvbGFuZy9TdHJpbmc7KVogKQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gZ2V0RmllbGRCb29sKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLkNsYXNzCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL0NsYXNzPCo+O0xqYXZhL2xhbmcvU3RyaW5nOylCICkKLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBieXRlIGdldEZpZWxkQnl0ZSgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5DbGFzcwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9DbGFzczwqPjtMamF2YS9sYW5nL1N0cmluZzspQyApCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgY2hhciBnZXRGaWVsZENoYXIoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuQ2xhc3MKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcvQ2xhc3M8Kj47TGphdmEvbGFuZy9TdHJpbmc7KUQgKQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGRvdWJsZSBnZXRGaWVsZERvdWJsZSgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5DbGFzcwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9DbGFzczwqPjtMamF2YS9sYW5nL1N0cmluZzspRiApCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgZmxvYXQgZ2V0RmllbGRGbG9hdCgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5DbGFzcwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9DbGFzczwqPjtMamF2YS9sYW5nL1N0cmluZzspSSApCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IGdldEZpZWxkSW50KAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLkNsYXNzCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL0NsYXNzPCo+O0xqYXZhL2xhbmcvU3RyaW5nOylKICkKLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBsb25nIGdldEZpZWxkTG9uZygKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5DbGFzcwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9DbGFzczwqPjtMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9PYmplY3Q7ICkKLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBqYXZhLmxhbmcuT2JqZWN0IGdldEZpZWxkT2JqKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLkNsYXNzCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL0NsYXNzPCo+O0xqYXZhL2xhbmcvU3RyaW5nOylTICkKLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBzaG9ydCBnZXRGaWVsZFNob3J0KAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLkNsYXNzCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIGludCBuZXh0SGFuZGxlKCkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuSW50ZWdlciByZWdpc3Rlck9iamVjdFdyaXR0ZW4oCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wcml2YXRlIHZvaWQgcmVnaXN0ZXJPYmplY3RXcml0dGVuKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLkludGVnZXIpCi0KLXByaXZhdGUgamF2YS5sYW5nLkludGVnZXIgcmVnaXN0ZXJlZE9iamVjdEhhbmRsZUZvcigKLWphdmEubGFuZy5PYmplY3QpCi0KLXByaXZhdGUgdm9pZCByZW1vdmVVbnNoYXJlZFJlZmVyZW5jZSgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5JbnRlZ2VyKQotCi1wcml2YXRlIHZvaWQgcmVzZXRTZWVuT2JqZWN0cygpCi0KLXByaXZhdGUgdm9pZCByZXNldFN0YXRlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBqYXZhLmxhbmcuSW50ZWdlciB3cml0ZUNsYXNzRGVzYygKLWphdmEuaW8uT2JqZWN0U3RyZWFtQ2xhc3MKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9DbGFzczwqPjspTGphdmEvbGFuZy9JbnRlZ2VyOyApCi1wcml2YXRlIGphdmEubGFuZy5JbnRlZ2VyIHdyaXRlQ2xhc3NEZXNjRm9yQ2xhc3MoCi1qYXZhLmxhbmcuQ2xhc3MpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCB3cml0ZUN5Y2xpY1JlZmVyZW5jZSgKLWphdmEubGFuZy5JbnRlZ2VyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvQ2xhc3M8Kj47WilMamF2YS9pby9PYmplY3RTdHJlYW1DbGFzczsgKQotcHJpdmF0ZSBqYXZhLmlvLk9iamVjdFN0cmVhbUNsYXNzIHdyaXRlRW51bURlc2MoCi1qYXZhLmxhbmcuQ2xhc3MKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCB3cml0ZUZpZWxkRGVzY3JpcHRvcnMoCi1qYXZhLmlvLk9iamVjdFN0cmVhbUNsYXNzCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgd3JpdGVGaWVsZFZhbHVlcygKLWphdmEuaW8uRW11bGF0ZWRGaWVsZHNGb3JEdW1waW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgd3JpdGVGaWVsZFZhbHVlcygKLWphdmEubGFuZy5PYmplY3QKLWphdmEuaW8uT2JqZWN0U3RyZWFtQ2xhc3MpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvaW8vTm90QWN0aXZlRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgd3JpdGVIaWVyYXJjaHkoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmlvLk9iamVjdFN0cmVhbUNsYXNzKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL0NsYXNzPCo+O0xqYXZhL2xhbmcvQ2xhc3M8Kj47WilMamF2YS9sYW5nL0ludGVnZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBqYXZhLmxhbmcuSW50ZWdlciB3cml0ZU5ld0FycmF5KAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLkNsYXNzCi1qYXZhLmxhbmcuQ2xhc3MKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvQ2xhc3M8Kj47WilMamF2YS9sYW5nL0ludGVnZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBqYXZhLmxhbmcuSW50ZWdlciB3cml0ZU5ld0NsYXNzKAotamF2YS5sYW5nLkNsYXNzCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgd3JpdGVOZXdDbGFzc0Rlc2MoCi1qYXZhLmlvLk9iamVjdFN0cmVhbUNsYXNzKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL0NsYXNzPCo+O1opTGphdmEvbGFuZy9JbnRlZ2VyOyApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgamF2YS5sYW5nLkludGVnZXIgd3JpdGVOZXdFbnVtKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLkNsYXNzCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgd3JpdGVOZXdFeGNlcHRpb24oCi1qYXZhLmxhbmcuRXhjZXB0aW9uKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcvQ2xhc3M8Kj47WilMamF2YS9sYW5nL0ludGVnZXI7ICkKLXByaXZhdGUgamF2YS5sYW5nLkludGVnZXIgd3JpdGVOZXdPYmplY3QoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuQ2xhc3MKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgamF2YS5sYW5nLkludGVnZXIgd3JpdGVOZXdTdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgd3JpdGVOdWxsKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KAotamF2YS5sYW5nLk9iamVjdAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBqYXZhLmxhbmcuSW50ZWdlciB3cml0ZU9iamVjdEludGVybmFsKAotamF2YS5sYW5nLk9iamVjdAotYm9vbGVhbgotYm9vbGVhbgotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL0NsYXNzPCo+OylWICkKLXByb3RlY3RlZCB2b2lkIGFubm90YXRlQ2xhc3MoCi1qYXZhLmxhbmcuQ2xhc3MpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvQ2xhc3M8Kj47KVYgKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBhbm5vdGF0ZVByb3h5Q2xhc3MoCi1qYXZhLmxhbmcuQ2xhc3MpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNsb3NlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgZGVmYXVsdFdyaXRlT2JqZWN0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgZHJhaW4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvU2VjdXJpdHlFeGNlcHRpb247ICkKLXByb3RlY3RlZCBib29sZWFuIGVuYWJsZVJlcGxhY2VPYmplY3QoCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBmbHVzaCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSRQdXRGaWVsZCBwdXRGaWVsZHMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgamF2YS5sYW5nLk9iamVjdCByZXBsYWNlT2JqZWN0KAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcmVzZXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB1c2VQcm90b2NvbFZlcnNpb24oCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHdyaXRlKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB3cml0ZSgKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgd3JpdGUoCi1ieXRlW10KLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB3cml0ZUJvb2xlYW4oCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB3cml0ZUJ5dGUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHdyaXRlQnl0ZXMoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB3cml0ZUNoYXIoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHdyaXRlQ2hhcnMoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCB3cml0ZUNsYXNzRGVzY3JpcHRvcigKLWphdmEuaW8uT2JqZWN0U3RyZWFtQ2xhc3MpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHdyaXRlRG91YmxlKAotZG91YmxlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB3cml0ZUZpZWxkcygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHdyaXRlRmxvYXQoCi1mbG9hdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgd3JpdGVJbnQoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHdyaXRlTG9uZygKLWxvbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlT2JqZWN0KAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgd3JpdGVPYmplY3RPdmVycmlkZSgKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHdyaXRlU2hvcnQoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIHdyaXRlU3RyZWFtSGVhZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgd3JpdGVVVEYoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB3cml0ZVVuc2hhcmVkKAotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFQ6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL2xhbmcvT2JqZWN0OyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEudXRpbC5Db21wYXJhdG9yIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRUO1RUOylJICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgY29tcGFyZSgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3V0aWwvQ29tcGFyYXRvcjxMamF2YS9sYW5nL0NsYXNzPCo+Oz47ICkKLWZpbmFsIGNsYXNzIGphdmEuaW8uT2JqZWN0U3RyZWFtQ2xhc3MkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuQ29tcGFyYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvQ2xhc3M8Kj47TGphdmEvbGFuZy9DbGFzczwqPjspSSApCi1wdWJsaWMgaW50IGNvbXBhcmUoCi1qYXZhLmxhbmcuQ2xhc3MKLWphdmEubGFuZy5DbGFzcykKLQotcHVibGljIHZvbGF0aWxlIGludCBjb21wYXJlKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvdXRpbC9Db21wYXJhdG9yPExqYXZhL2xhbmcvcmVmbGVjdC9GaWVsZDs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1maW5hbCBjbGFzcyBqYXZhLmlvLk9iamVjdFN0cmVhbUNsYXNzJDIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLkNvbXBhcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9sYXRpbGUgaW50IGNvbXBhcmUoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50IGNvbXBhcmUoCi1qYXZhLmxhbmcucmVmbGVjdC5GaWVsZAotamF2YS5sYW5nLnJlZmxlY3QuRmllbGQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3V0aWwvQ29tcGFyYXRvcjxMamF2YS9sYW5nL3JlZmxlY3QvQ29uc3RydWN0b3I8Kj47PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotZmluYWwgY2xhc3MgamF2YS5pby5PYmplY3RTdHJlYW1DbGFzcyQzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudXRpbC5Db21wYXJhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvbGF0aWxlIGludCBjb21wYXJlKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9yZWZsZWN0L0NvbnN0cnVjdG9yPCo+O0xqYXZhL2xhbmcvcmVmbGVjdC9Db25zdHJ1Y3RvcjwqPjspSSApCi1wdWJsaWMgaW50IGNvbXBhcmUoCi1qYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcgotamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3V0aWwvQ29tcGFyYXRvcjxMamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kOz47ICkKLWZpbmFsIGNsYXNzIGphdmEuaW8uT2JqZWN0U3RyZWFtQ2xhc3MkNCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuQ29tcGFyYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2xhdGlsZSBpbnQgY29tcGFyZSgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBpbnQgY29tcGFyZSgKLWphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZAotamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEuaW8uT2JqZWN0U3RyZWFtQ2xhc3MgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL0NsYXNzPCo+OyApCi1zdGF0aWMgZmluYWwgamF2YS5sYW5nLkNsYXNzIEFSUkFZX09GX0ZJRUxEUwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvQ2xhc3M8Kj47ICkKLXN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQ2xhc3MgQ0xBU1NDTEFTUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0xBU1NfTU9ESUZJRVJTX01BU0sKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENMSU5JVF9NT0RJRklFUlMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDTElOSVRfTkFNRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENMSU5JVF9TSUdOQVRVUkUKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1bTGphdmEvbGFuZy9DbGFzczwqPjsgKQotc3RhdGljIGZpbmFsIGphdmEubGFuZy5DbGFzc1tdIEVNUFRZX0NPTlNUUlVDVE9SX1BBUkFNX1RZUEVTCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9DbGFzczxMamF2YS9pby9FeHRlcm5hbGl6YWJsZTs+OyApCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQ2xhc3MgRVhURVJOQUxJWkFCTEUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZJRUxEX01PRElGSUVSU19NQVNLCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVRIT0RfTU9ESUZJRVJTX01BU0sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmlvLk9iamVjdFN0cmVhbUZpZWxkW10gTk9fRklFTERTCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9DbGFzczxMamF2YS9pby9PYmplY3RTdHJlYW1DbGFzczs+OyApCi1zdGF0aWMgZmluYWwgamF2YS5sYW5nLkNsYXNzIE9CSkVDVFNUUkVBTUNMQVNTQ0xBU1MKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1bTGphdmEvbGFuZy9DbGFzczwqPjsgKQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkNsYXNzW10gUkVBRF9QQVJBTV9UWVBFUwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvQ2xhc3M8TGphdmEvaW8vU2VyaWFsaXphYmxlOz47ICkKLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DbGFzcyBTRVJJQUxJWkFCTEUKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL0NsYXNzPExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQ2xhc3MgU1RSSU5HQ0xBU1MKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBVSURfRklFTERfTkFNRQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPVtMamF2YS9sYW5nL0NsYXNzPCo+OyApCi1zdGF0aWMgZmluYWwgamF2YS5sYW5nLkNsYXNzW10gVU5TSEFSRURfUEFSQU1fVFlQRVMKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL0NsYXNzPExqYXZhL2xhbmcvVm9pZDs+OyApCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQ2xhc3MgVk9JRF9DTEFTUwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPVtMamF2YS9sYW5nL0NsYXNzPCo+OyApCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQ2xhc3NbXSBXUklURV9QQVJBTV9UWVBFUwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvV2Vha0hhc2hNYXA8TGphdmEvbGFuZy9DbGFzczwqPjtMamF2YS9pby9PYmplY3RTdHJlYW1DbGFzczs+OyApCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuV2Vha0hhc2hNYXAgY2xhc3Nlc0FuZERlc2NyaXB0b3JzCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotCi1wcml2YXRlIHRyYW5zaWVudCBqYXZhLmxhbmcuU3RyaW5nIGNsYXNzTmFtZQotCi1wcml2YXRlIHRyYW5zaWVudCBqYXZhLmlvLk9iamVjdFN0cmVhbUZpZWxkW10gZmllbGRzCi0KLXByaXZhdGUgdHJhbnNpZW50IGJ5dGUgZmxhZ3MKLQotcHJpdmF0ZSB0cmFuc2llbnQgamF2YS5pby5PYmplY3RTdHJlYW1GaWVsZFtdIGxvYWRGaWVsZHMKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL3JlZi9XZWFrUmVmZXJlbmNlPExqYXZhL2xhbmcvQ2xhc3M8Kj47PjsgKQotcHJpdmF0ZSB0cmFuc2llbnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlIHJlc29sdmVkQ2xhc3MKLQotcHJpdmF0ZSB0cmFuc2llbnQgamF2YS5pby5PYmplY3RTdHJlYW1DbGFzcyBzdXBlcmNsYXNzCi0KLXByaXZhdGUgdHJhbnNpZW50IGxvbmcgc3ZVSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLSB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvQ2xhc3M8Kj47WilMamF2YS9pby9PYmplY3RTdHJlYW1DbGFzczsgKQotcHJpdmF0ZSBzdGF0aWMgamF2YS5pby5PYmplY3RTdHJlYW1DbGFzcyBhZGRUb0NhY2hlKAotamF2YS5sYW5nLkNsYXNzCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL0NsYXNzPCo+O1tMamF2YS9sYW5nL3JlZmxlY3QvRmllbGQ7KUogKQotcHJpdmF0ZSBzdGF0aWMgbG9uZyBjb21wdXRlU2VyaWFsVmVyc2lvblVJRCgKLWphdmEubGFuZy5DbGFzcwotamF2YS5sYW5nLnJlZmxlY3QuRmllbGRbXSkKLQotcHJpdmF0ZSB2b2lkIGNvcHlGaWVsZEF0dHJpYnV0ZXMoKQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGRlc2NyaXB0b3JGb3JGaWVsZFNpZ25hdHVyZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZGVzY3JpcHRvckZvclNpZ25hdHVyZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvQ2xhc3M8Kj47KUxqYXZhL2xhbmcvcmVmbGVjdC9GaWVsZDsgKQotc3RhdGljIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkIGZpZWxkU2VyaWFsUGVyc2lzdGVudEZpZWxkcygKLWphdmEubGFuZy5DbGFzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9yZWZsZWN0L0NvbnN0cnVjdG9yPCo+OylMamF2YS9sYW5nL1N0cmluZzsgKQotc3RhdGljIG5hdGl2ZSBqYXZhLmxhbmcuU3RyaW5nIGdldENvbnN0cnVjdG9yU2lnbmF0dXJlKAotamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBqYXZhLmxhbmcuU3RyaW5nIGdldEZpZWxkU2lnbmF0dXJlKAotamF2YS5sYW5nLnJlZmxlY3QuRmllbGQpCi0KLXN0YXRpYyBuYXRpdmUgamF2YS5sYW5nLlN0cmluZyBnZXRNZXRob2RTaWduYXR1cmUoCi1qYXZhLmxhbmcucmVmbGVjdC5NZXRob2QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvQ2xhc3M8Kj47KUxqYXZhL2xhbmcvcmVmbGVjdC9NZXRob2Q7ICkKLXN0YXRpYyBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgZ2V0UHJpdmF0ZVJlYWRPYmplY3RNZXRob2QoCi1qYXZhLmxhbmcuQ2xhc3MpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvQ2xhc3M8Kj47KUxqYXZhL2xhbmcvcmVmbGVjdC9NZXRob2Q7ICkKLXN0YXRpYyBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgZ2V0UHJpdmF0ZVJlYWRPYmplY3ROb0RhdGFNZXRob2QoCi1qYXZhLmxhbmcuQ2xhc3MpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvQ2xhc3M8Kj47KUxqYXZhL2xhbmcvcmVmbGVjdC9NZXRob2Q7ICkKLXN0YXRpYyBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgZ2V0UHJpdmF0ZVdyaXRlT2JqZWN0TWV0aG9kKAotamF2YS5sYW5nLkNsYXNzKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL0NsYXNzPCo+OylaICkKLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBib29sZWFuIGhhc0NsaW5pdCgKLWphdmEubGFuZy5DbGFzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9DbGFzczwqPjspWiApCi1zdGF0aWMgYm9vbGVhbiBpc0V4dGVybmFsaXphYmxlKAotamF2YS5sYW5nLkNsYXNzKQotCi1zdGF0aWMgYm9vbGVhbiBpc1ByaW1pdGl2ZVR5cGUoCi1jaGFyKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL0NsYXNzPCo+OylaICkKLXN0YXRpYyBib29sZWFuIGlzU2VyaWFsaXphYmxlKAotamF2YS5sYW5nLkNsYXNzKQotCi1wcml2YXRlIHN0YXRpYyBsb25nIGxpdHRsZUVuZGlhbkxvbmdBdCgKLWJ5dGVbXQotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL0NsYXNzPCo+OylMamF2YS9pby9PYmplY3RTdHJlYW1DbGFzczsgKQotcHVibGljIHN0YXRpYyBqYXZhLmlvLk9iamVjdFN0cmVhbUNsYXNzIGxvb2t1cCgKLWphdmEubGFuZy5DbGFzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9DbGFzczwqPjspTGphdmEvaW8vT2JqZWN0U3RyZWFtQ2xhc3M7ICkKLXN0YXRpYyBqYXZhLmlvLk9iamVjdFN0cmVhbUNsYXNzIGxvb2t1cFN0cmVhbUNsYXNzKAotamF2YS5sYW5nLkNsYXNzKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL0NsYXNzPCo+O1opTGphdmEvaW8vT2JqZWN0U3RyZWFtQ2xhc3M7ICkKLXByaXZhdGUgc3RhdGljIGphdmEuaW8uT2JqZWN0U3RyZWFtQ2xhc3MgbG9va3VwU3RyZWFtQ2xhc3MoCi1qYXZhLmxhbmcuQ2xhc3MKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvQ2xhc3M8Kj47KUxqYXZhL2xhbmcvcmVmbGVjdC9NZXRob2Q7ICkKLXN0YXRpYyBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgbWV0aG9kUmVhZFJlc29sdmUoCi1qYXZhLmxhbmcuQ2xhc3MpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvQ2xhc3M8Kj47KUxqYXZhL2xhbmcvcmVmbGVjdC9NZXRob2Q7ICkKLXN0YXRpYyBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgbWV0aG9kV3JpdGVSZXBsYWNlKAotamF2YS5sYW5nLkNsYXNzKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBvbmVUaW1lSW5pdGlhbGl6YXRpb24oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL0NsYXNzPCo+OylJICkKLXByaXZhdGUgaW50IHByaW1pdGl2ZVNpemUoCi1qYXZhLmxhbmcuQ2xhc3MpCi0KLSB2b2lkIGJ1aWxkRmllbGREZXNjcmlwdG9ycygKLWphdmEubGFuZy5yZWZsZWN0LkZpZWxkW10pCi0KLSBqYXZhLmlvLk9iamVjdFN0cmVhbUZpZWxkW10gZmllbGRzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL2xhbmcvQ2xhc3M8Kj47ICkKLXB1YmxpYyBqYXZhLmxhbmcuQ2xhc3MgZm9yQ2xhc3MoKQotCi1wdWJsaWMgamF2YS5pby5PYmplY3RTdHJlYW1GaWVsZCBnZXRGaWVsZCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmlvLk9iamVjdFN0cmVhbUZpZWxkW10gZ2V0RmllbGRzKCkKLQotIGJ5dGUgZ2V0RmxhZ3MoKQotCi0gamF2YS5pby5PYmplY3RTdHJlYW1GaWVsZFtdIGdldExvYWRGaWVsZHMoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXROYW1lKCkKLQotcHVibGljIGxvbmcgZ2V0U2VyaWFsVmVyc2lvblVJRCgpCi0KLSBqYXZhLmlvLk9iamVjdFN0cmVhbUNsYXNzIGdldFN1cGVyY2xhc3MoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL0NsYXNzPCo+OylWICkKLSB2b2lkIHNldENsYXNzKAotamF2YS5sYW5nLkNsYXNzKQotCi0gdm9pZCBzZXRGaWVsZHMoCi1qYXZhLmlvLk9iamVjdFN0cmVhbUZpZWxkW10pCi0KLSB2b2lkIHNldEZsYWdzKAotYnl0ZSkKLQotIHZvaWQgc2V0TG9hZEZpZWxkcygKLWphdmEuaW8uT2JqZWN0U3RyZWFtRmllbGRbXSkKLQotIHZvaWQgc2V0TmFtZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLSB2b2lkIHNldFNlcmlhbFZlcnNpb25VSUQoCi1sb25nKQotCi0gdm9pZCBzZXRTdXBlcmNsYXNzKAotamF2YS5pby5PYmplY3RTdHJlYW1DbGFzcykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS91dGlsL0NvbXBhcmF0b3I8TGphdmEvaW8vT2JqZWN0U3RyZWFtRmllbGQ7PjsgKQotZmluYWwgY2xhc3MgamF2YS5pby5PYmplY3RTdHJlYW1GaWVsZCQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudXRpbC5Db21wYXJhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGludCBjb21wYXJlKAotamF2YS5pby5PYmplY3RTdHJlYW1GaWVsZAotamF2YS5pby5PYmplY3RTdHJlYW1GaWVsZCkKLQotcHVibGljIHZvbGF0aWxlIGludCBjb21wYXJlKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9Db21wYXJhYmxlPExqYXZhL2xhbmcvT2JqZWN0Oz47ICkKLXB1YmxpYyBjbGFzcyBqYXZhLmlvLk9iamVjdFN0cmVhbUZpZWxkIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5Db21wYXJhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYm9vbGVhbiBpc0Rlc2VyaWFsaXplZAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbmFtZQotCi0gaW50IG9mZnNldAotCi1wcml2YXRlIGphdmEubGFuZy5PYmplY3QgdHlwZQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgdHlwZVN0cmluZwotCi1wcml2YXRlIGJvb2xlYW4gdW5zaGFyZWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL0NsYXNzPCo+OylWICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5DbGFzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9DbGFzczwqPjtaKVYgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLkNsYXNzCi1ib29sZWFuKQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1zdGF0aWMgdm9pZCBzb3J0RmllbGRzKAotamF2YS5pby5PYmplY3RTdHJlYW1GaWVsZFtdKQotCi1wdWJsaWMgaW50IGNvbXBhcmVUbygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE5hbWUoKQotCi1wdWJsaWMgaW50IGdldE9mZnNldCgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS9sYW5nL0NsYXNzPCo+OyApCi1wdWJsaWMgamF2YS5sYW5nLkNsYXNzIGdldFR5cGUoKQotCi1wdWJsaWMgY2hhciBnZXRUeXBlQ29kZSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS9sYW5nL0NsYXNzPCo+OyApCi0gamF2YS5sYW5nLkNsYXNzIGdldFR5cGVJbnRlcm5hbCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFR5cGVTdHJpbmcoKQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLQotcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKQotCi1wdWJsaWMgYm9vbGVhbiBpc1Vuc2hhcmVkKCkKLQotIHZvaWQgcmVzb2x2ZSgKLWphdmEubGFuZy5DbGFzc0xvYWRlcikKLQotcHJvdGVjdGVkIHZvaWQgc2V0T2Zmc2V0KAotaW50KQotCi0gdm9pZCBzZXRVbnNoYXJlZCgKLWJvb2xlYW4pCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLmlvLk9wdGlvbmFsRGF0YUV4Y2VwdGlvbiBleHRlbmRzIGphdmEuaW8uT2JqZWN0U3RyZWFtRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotCi1wdWJsaWMgYm9vbGVhbiBlb2YKLQotcHVibGljIGludCBsZW5ndGgKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEuaW8uUGlwZWRJbnB1dFN0cmVhbSBleHRlbmRzIGphdmEuaW8uSW5wdXRTdHJlYW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgUElQRV9TSVpFCi0KLXByb3RlY3RlZCBieXRlW10gYnVmZmVyCi0KLXByb3RlY3RlZCBpbnQgaW4KLQotcHJpdmF0ZSBib29sZWFuIGlzQ2xvc2VkCi0KLSBib29sZWFuIGlzQ29ubmVjdGVkCi0KLXByaXZhdGUgamF2YS5sYW5nLlRocmVhZCBsYXN0UmVhZGVyCi0KLXByaXZhdGUgamF2YS5sYW5nLlRocmVhZCBsYXN0V3JpdGVyCi0KLXByb3RlY3RlZCBpbnQgb3V0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5QaXBlZE91dHB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCBhdmFpbGFibGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjbG9zZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNvbm5lY3QoCi1qYXZhLmlvLlBpcGVkT3V0cHV0U3RyZWFtKQotCi0gdm9pZCBkb25lKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCByZWFkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCByZWFkKAotYnl0ZVtdCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgcmVjZWl2ZSgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLmlvLlBpcGVkT3V0cHV0U3RyZWFtIGV4dGVuZHMgamF2YS5pby5PdXRwdXRTdHJlYW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLmlvLlBpcGVkSW5wdXRTdHJlYW0gZGVzdAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uUGlwZWRJbnB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY2xvc2UoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjb25uZWN0KAotamF2YS5pby5QaXBlZElucHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBmbHVzaCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHdyaXRlKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB3cml0ZSgKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5pby5QaXBlZFJlYWRlciBleHRlbmRzIGphdmEuaW8uUmVhZGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQSVBFX1NJWkUKLQotcHJpdmF0ZSBjaGFyW10gZGF0YQotCi1wcml2YXRlIGludCBpbgotCi1wcml2YXRlIGJvb2xlYW4gaXNDbG9zZWQKLQotcHJpdmF0ZSBib29sZWFuIGlzQ29ubmVjdGVkCi0KLXByaXZhdGUgamF2YS5sYW5nLlRocmVhZCBsYXN0UmVhZGVyCi0KLXByaXZhdGUgamF2YS5sYW5nLlRocmVhZCBsYXN0V3JpdGVyCi0KLXByaXZhdGUgaW50IG91dAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uUGlwZWRXcml0ZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNsb3NlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY29ubmVjdCgKLWphdmEuaW8uUGlwZWRXcml0ZXIpCi0KLSB2b2lkIGRvbmUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi0gdm9pZCBlc3RhYmxpc2hDb25uZWN0aW9uKCkKLQotIHZvaWQgZmx1c2goKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoCi1jaGFyW10KLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiByZWFkeSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLSB2b2lkIHJlY2VpdmUoCi1jaGFyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi0gdm9pZCByZWNlaXZlKAotY2hhcltdCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLmlvLlBpcGVkV3JpdGVyIGV4dGVuZHMgamF2YS5pby5Xcml0ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBib29sZWFuIGNsb3NlZAotCi1wcml2YXRlIGphdmEuaW8uUGlwZWRSZWFkZXIgZGVzdAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uUGlwZWRSZWFkZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNsb3NlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY29ubmVjdCgKLWphdmEuaW8uUGlwZWRSZWFkZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGZsdXNoKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgd3JpdGUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHdyaXRlKAotY2hhcltdCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLmlvLlByaW50U3RyZWFtIGV4dGVuZHMgamF2YS5pby5GaWx0ZXJPdXRwdXRTdHJlYW0gaW1wbGVtZW50cyBqYXZhLmxhbmcuQXBwZW5kYWJsZSwgamF2YS5pby5DbG9zZWFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUT0tFTl9OVUxMCi0KLXByaXZhdGUgYm9vbGVhbiBhdXRvZmx1c2gKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGVuY29kaW5nCi0KLXByaXZhdGUgYm9vbGVhbiBpb0Vycm9yCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBsaW5lU2VwYXJhdG9yCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9GaWxlTm90Rm91bmRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uRmlsZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9GaWxlTm90Rm91bmRFeGNlcHRpb247TGphdmEvaW8vVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5GaWxlCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmlvLk91dHB1dFN0cmVhbSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5PdXRwdXRTdHJlYW0KLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5PdXRwdXRTdHJlYW0KLWJvb2xlYW4KLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vRmlsZU5vdEZvdW5kRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0ZpbGVOb3RGb3VuZEV4Y2VwdGlvbjtMamF2YS9pby9VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHZvaWQgbmV3bGluZSgpCi0KLXB1YmxpYyBqYXZhLmlvLlByaW50U3RyZWFtIGFwcGVuZCgKLWNoYXIpCi0KLXB1YmxpYyBqYXZhLmlvLlByaW50U3RyZWFtIGFwcGVuZCgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi0KLXB1YmxpYyBqYXZhLmlvLlByaW50U3RyZWFtIGFwcGVuZCgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLkFwcGVuZGFibGUgYXBwZW5kKAotY2hhcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5BcHBlbmRhYmxlIGFwcGVuZCgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuQXBwZW5kYWJsZSBhcHBlbmQoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludCkKLQotcHVibGljIGJvb2xlYW4gY2hlY2tFcnJvcigpCi0KLXB1YmxpYyB2b2lkIGNsb3NlKCkKLQotcHVibGljIHZvaWQgZmx1c2goKQotCi1wdWJsaWMgdHJhbnNpZW50IGphdmEuaW8uUHJpbnRTdHJlYW0gZm9ybWF0KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLk9iamVjdFtdKQotCi1wdWJsaWMgdHJhbnNpZW50IGphdmEuaW8uUHJpbnRTdHJlYW0gZm9ybWF0KAotamF2YS51dGlsLkxvY2FsZQotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLk9iamVjdFtdKQotCi1wdWJsaWMgdm9pZCBwcmludCgKLWNoYXIpCi0KLXB1YmxpYyB2b2lkIHByaW50KAotZG91YmxlKQotCi1wdWJsaWMgdm9pZCBwcmludCgKLWZsb2F0KQotCi1wdWJsaWMgdm9pZCBwcmludCgKLWludCkKLQotcHVibGljIHZvaWQgcHJpbnQoCi1sb25nKQotCi1wdWJsaWMgdm9pZCBwcmludCgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2lkIHByaW50KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgcHJpbnQoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBwcmludCgKLWNoYXJbXSkKLQotcHVibGljIHRyYW5zaWVudCBqYXZhLmlvLlByaW50U3RyZWFtIHByaW50ZigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3RbXSkKLQotcHVibGljIHRyYW5zaWVudCBqYXZhLmlvLlByaW50U3RyZWFtIHByaW50ZigKLWphdmEudXRpbC5Mb2NhbGUKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3RbXSkKLQotcHVibGljIHZvaWQgcHJpbnRsbigpCi0KLXB1YmxpYyB2b2lkIHByaW50bG4oCi1jaGFyKQotCi1wdWJsaWMgdm9pZCBwcmludGxuKAotZG91YmxlKQotCi1wdWJsaWMgdm9pZCBwcmludGxuKAotZmxvYXQpCi0KLXB1YmxpYyB2b2lkIHByaW50bG4oCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHByaW50bG4oCi1sb25nKQotCi1wdWJsaWMgdm9pZCBwcmludGxuKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHZvaWQgcHJpbnRsbigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHByaW50bG4oCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBwcmludGxuKAotY2hhcltdKQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRFcnJvcigpCi0KLXB1YmxpYyB2b2lkIHdyaXRlKAotaW50KQotCi1wdWJsaWMgdm9pZCB3cml0ZSgKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5pby5QcmludFdyaXRlciBleHRlbmRzIGphdmEuaW8uV3JpdGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYm9vbGVhbiBhdXRvZmx1c2gKLQotcHJpdmF0ZSBib29sZWFuIGlvRXJyb3IKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGxpbmVTZXBhcmF0b3IKLQotcHJvdGVjdGVkIGphdmEuaW8uV3JpdGVyIG91dAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vRmlsZU5vdEZvdW5kRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmlvLkZpbGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vRmlsZU5vdEZvdW5kRXhjZXB0aW9uO0xqYXZhL2lvL1Vuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uRmlsZQotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5PdXRwdXRTdHJlYW0pCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uT3V0cHV0U3RyZWFtCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmlvLldyaXRlcikKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5Xcml0ZXIKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vRmlsZU5vdEZvdW5kRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0ZpbGVOb3RGb3VuZEV4Y2VwdGlvbjtMamF2YS9pby9VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIGZpbmFsIHZvaWQgZG9Xcml0ZSgKLWNoYXJbXQotaW50Ci1pbnQpCi0KLXByaXZhdGUgdm9pZCBuZXdsaW5lKCkKLQotcHVibGljIGphdmEuaW8uUHJpbnRXcml0ZXIgYXBwZW5kKAotY2hhcikKLQotcHVibGljIGphdmEuaW8uUHJpbnRXcml0ZXIgYXBwZW5kKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotcHVibGljIGphdmEuaW8uUHJpbnRXcml0ZXIgYXBwZW5kKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmlvLldyaXRlciBhcHBlbmQoCi1jaGFyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5pby5Xcml0ZXIgYXBwZW5kKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvbGF0aWxlIGphdmEuaW8uV3JpdGVyIGFwcGVuZCgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLkFwcGVuZGFibGUgYXBwZW5kKAotY2hhcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5BcHBlbmRhYmxlIGFwcGVuZCgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuQXBwZW5kYWJsZSBhcHBlbmQoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludCkKLQotcHVibGljIGJvb2xlYW4gY2hlY2tFcnJvcigpCi0KLXB1YmxpYyB2b2lkIGNsb3NlKCkKLQotcHVibGljIHZvaWQgZmx1c2goKQotCi1wdWJsaWMgdHJhbnNpZW50IGphdmEuaW8uUHJpbnRXcml0ZXIgZm9ybWF0KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLk9iamVjdFtdKQotCi1wdWJsaWMgdHJhbnNpZW50IGphdmEuaW8uUHJpbnRXcml0ZXIgZm9ybWF0KAotamF2YS51dGlsLkxvY2FsZQotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLk9iamVjdFtdKQotCi1wdWJsaWMgdm9pZCBwcmludCgKLWNoYXIpCi0KLXB1YmxpYyB2b2lkIHByaW50KAotZG91YmxlKQotCi1wdWJsaWMgdm9pZCBwcmludCgKLWZsb2F0KQotCi1wdWJsaWMgdm9pZCBwcmludCgKLWludCkKLQotcHVibGljIHZvaWQgcHJpbnQoCi1sb25nKQotCi1wdWJsaWMgdm9pZCBwcmludCgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2lkIHByaW50KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgcHJpbnQoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBwcmludCgKLWNoYXJbXSkKLQotcHVibGljIHRyYW5zaWVudCBqYXZhLmlvLlByaW50V3JpdGVyIHByaW50ZigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3RbXSkKLQotcHVibGljIHRyYW5zaWVudCBqYXZhLmlvLlByaW50V3JpdGVyIHByaW50ZigKLWphdmEudXRpbC5Mb2NhbGUKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3RbXSkKLQotcHVibGljIHZvaWQgcHJpbnRsbigpCi0KLXB1YmxpYyB2b2lkIHByaW50bG4oCi1jaGFyKQotCi1wdWJsaWMgdm9pZCBwcmludGxuKAotZG91YmxlKQotCi1wdWJsaWMgdm9pZCBwcmludGxuKAotZmxvYXQpCi0KLXB1YmxpYyB2b2lkIHByaW50bG4oCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHByaW50bG4oCi1sb25nKQotCi1wdWJsaWMgdm9pZCBwcmludGxuKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHZvaWQgcHJpbnRsbigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHByaW50bG4oCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBwcmludGxuKAotY2hhcltdKQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRFcnJvcigpCi0KLXB1YmxpYyB2b2lkIHdyaXRlKAotaW50KQotCi1wdWJsaWMgdm9pZCB3cml0ZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHdyaXRlKAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIHdyaXRlKAotY2hhcltdKQotCi1wdWJsaWMgdm9pZCB3cml0ZSgKLWNoYXJbXQotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5pby5QdXNoYmFja0lucHV0U3RyZWFtIGV4dGVuZHMgamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgYnl0ZVtdIGJ1ZgotCi1wcm90ZWN0ZWQgaW50IHBvcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uSW5wdXRTdHJlYW0pCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uSW5wdXRTdHJlYW0KLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCBhdmFpbGFibGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjbG9zZSgpCi0KLXB1YmxpYyB2b2lkIG1hcmsoCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoCi1ieXRlW10KLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCByZXNldCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBsb25nIHNraXAoCi1sb25nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB1bnJlYWQoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHVucmVhZCgKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgdW5yZWFkKAotYnl0ZVtdCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLmlvLlB1c2hiYWNrUmVhZGVyIGV4dGVuZHMgamF2YS5pby5GaWx0ZXJSZWFkZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGNoYXJbXSBidWYKLQotIGludCBwb3MKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmlvLlJlYWRlcikKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5SZWFkZXIKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY2xvc2UoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBtYXJrKAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBtYXJrU3VwcG9ydGVkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCByZWFkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCByZWFkKAotY2hhcltdCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gcmVhZHkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCByZXNldCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBsb25nIHNraXAoCi1sb25nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB1bnJlYWQoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHVucmVhZCgKLWNoYXJbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgdW5yZWFkKAotY2hhcltdCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS9pby9SYW5kb21BY2Nlc3NGaWxlOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTQxMDQgbmFtZSA9bnVsbCApCi0gY2xhc3MgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS9pby9SYW5kb21BY2Nlc3NGaWxlOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPVJlcG9zaXRpb25Mb2NrICkKLSBjbGFzcyBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGUkUmVwb3NpdGlvbkxvY2sgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLSB2b2lkIDxpbml0PigKLWphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZSQxKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGphdmEvaW8vUmFuZG9tQWNjZXNzRmlsZSQxO0xqYXZhL2lvL1JhbmRvbUFjY2Vzc0ZpbGUkUmVwb3NpdGlvbkxvY2s7ICkKLXB1YmxpYyBjbGFzcyBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5pby5EYXRhSW5wdXQsIGphdmEuaW8uRGF0YU91dHB1dCwgamF2YS5pby5DbG9zZWFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbCBjaGFubmVsCi0KLXByaXZhdGUgamF2YS5pby5GaWxlRGVzY3JpcHRvciBmZAotCi1wcml2YXRlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLklGaWxlU3lzdGVtIGZpbGVTeXN0ZW0KLQotcHJpdmF0ZSBib29sZWFuIGlzUmVhZE9ubHkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuT2JqZWN0IHJlcG9zaXRpb25Mb2NrCi0KLXByaXZhdGUgYm9vbGVhbiBzeW5jTWV0YWRhdGEKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0ZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5GaWxlCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0ZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIG9wZW5DaGVjaygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNsb3NlKCkKLQotcHVibGljIGZpbmFsIGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsIGdldENoYW5uZWwoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgamF2YS5pby5GaWxlRGVzY3JpcHRvciBnZXRGRCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBsb25nIGdldEZpbGVQb2ludGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGxvbmcgbGVuZ3RoKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCByZWFkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCByZWFkKAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoCi1ieXRlW10KLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgYm9vbGVhbiByZWFkQm9vbGVhbigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBieXRlIHJlYWRCeXRlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIGNoYXIgcmVhZENoYXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgZG91YmxlIHJlYWREb3VibGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgZmxvYXQgcmVhZEZsb2F0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIHZvaWQgcmVhZEZ1bGx5KAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgdm9pZCByZWFkRnVsbHkoCi1ieXRlW10KLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgaW50IHJlYWRJbnQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyByZWFkTGluZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBsb25nIHJlYWRMb25nKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIHNob3J0IHJlYWRTaG9ydCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIHJlYWRVVEYoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgaW50IHJlYWRVbnNpZ25lZEJ5dGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgaW50IHJlYWRVbnNpZ25lZFNob3J0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2VlaygKLWxvbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldExlbmd0aCgKLWxvbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgc2tpcEJ5dGVzKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB3cml0ZSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgd3JpdGUoCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHdyaXRlKAotYnl0ZVtdCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIHZvaWQgd3JpdGVCb29sZWFuKAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIHZvaWQgd3JpdGVCeXRlKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgdm9pZCB3cml0ZUJ5dGVzKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIHZvaWQgd3JpdGVDaGFyKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgdm9pZCB3cml0ZUNoYXJzKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIHZvaWQgd3JpdGVEb3VibGUoCi1kb3VibGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlRmxvYXQoCi1mbG9hdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIHZvaWQgd3JpdGVJbnQoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlTG9uZygKLWxvbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlU2hvcnQoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlVVRGKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLmlvLlNlcXVlbmNlSW5wdXRTdHJlYW0gZXh0ZW5kcyBqYXZhLmlvLklucHV0U3RyZWFtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9FbnVtZXJhdGlvbjwrTGphdmEvaW8vSW5wdXRTdHJlYW07PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuRW51bWVyYXRpb24gZQotCi1wcml2YXRlIGphdmEuaW8uSW5wdXRTdHJlYW0gaW4KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmlvLklucHV0U3RyZWFtCi1qYXZhLmlvLklucHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0VudW1lcmF0aW9uPCtMamF2YS9pby9JbnB1dFN0cmVhbTs+OylWICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEudXRpbC5FbnVtZXJhdGlvbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIG5leHRTdHJlYW0oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGF2YWlsYWJsZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNsb3NlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCByZWFkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCByZWFkKAotYnl0ZVtdCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZhLnNlY3VyaXR5LkJhc2ljUGVybWlzc2lvbiBleHRlbmRzIGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbiBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgZmluYWwgdm9pZCBjaGVja05hbWUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1zdGF0aWMgYm9vbGVhbiBuYW1lSW1wbGllcygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgcmVhZE9iamVjdCgKLWphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0pCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEFjdGlvbnMoKQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLQotcHVibGljIGJvb2xlYW4gaW1wbGllcygKLWphdmEuc2VjdXJpdHkuUGVybWlzc2lvbikKLQotcHVibGljIGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbkNvbGxlY3Rpb24gbmV3UGVybWlzc2lvbkNvbGxlY3Rpb24oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIGphdmEuaW8uU2VyaWFsaXphYmxlUGVybWlzc2lvbiBleHRlbmRzIGphdmEuc2VjdXJpdHkuQmFzaWNQZXJtaXNzaW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgYWN0aW9ucwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5pby5TdHJlYW1Db3JydXB0ZWRFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmlvLk9iamVjdFN0cmVhbUV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEuaW8uU3RyZWFtVG9rZW5pemVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIFRPS0VOX0NPTU1FTlQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBUT0tFTl9ESUdJVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIFRPS0VOX1FVT1RFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgVE9LRU5fV0hJVEUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBUT0tFTl9XT1JECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRUX0VPRgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUVF9FT0wKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFRfTlVNQkVSCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUVF9VTktOT1dOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRUX1dPUkQKLQotcHJpdmF0ZSBib29sZWFuIGZvcmNlTG93ZXJjYXNlCi0KLXByaXZhdGUgamF2YS5pby5SZWFkZXIgaW5SZWFkZXIKLQotcHJpdmF0ZSBqYXZhLmlvLklucHV0U3RyZWFtIGluU3RyZWFtCi0KLXByaXZhdGUgYm9vbGVhbiBpc0VPTFNpZ25pZmljYW50Ci0KLXByaXZhdGUgYm9vbGVhbiBsYXN0Q3IKLQotcHJpdmF0ZSBpbnQgbGluZU51bWJlcgotCi1wdWJsaWMgZG91YmxlIG52YWwKLQotcHJpdmF0ZSBpbnQgcGVla0NoYXIKLQotcHJpdmF0ZSBib29sZWFuIHB1c2hCYWNrVG9rZW4KLQotcHJpdmF0ZSBib29sZWFuIHNsYXNoU2xhc2hDb21tZW50cwotCi1wcml2YXRlIGJvb2xlYW4gc2xhc2hTdGFyQ29tbWVudHMKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgc3ZhbAotCi1wcml2YXRlIGJ5dGVbXSB0b2tlblR5cGVzCi0KLXB1YmxpYyBpbnQgdHR5cGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLUBqYXZhLmxhbmcuRGVwcmVjYXRlZAotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5JbnB1dFN0cmVhbSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5SZWFkZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgaW50IHJlYWQoKQotCi1wdWJsaWMgdm9pZCBjb21tZW50Q2hhcigKLWludCkKLQotcHVibGljIHZvaWQgZW9sSXNTaWduaWZpY2FudCgKLWJvb2xlYW4pCi0KLXB1YmxpYyBpbnQgbGluZW5vKCkKLQotcHVibGljIHZvaWQgbG93ZXJDYXNlTW9kZSgKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgbmV4dFRva2VuKCkKLQotcHVibGljIHZvaWQgb3JkaW5hcnlDaGFyKAotaW50KQotCi1wdWJsaWMgdm9pZCBvcmRpbmFyeUNoYXJzKAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIHBhcnNlTnVtYmVycygpCi0KLXB1YmxpYyB2b2lkIHB1c2hCYWNrKCkKLQotcHVibGljIHZvaWQgcXVvdGVDaGFyKAotaW50KQotCi1wdWJsaWMgdm9pZCByZXNldFN5bnRheCgpCi0KLXB1YmxpYyB2b2lkIHNsYXNoU2xhc2hDb21tZW50cygKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNsYXNoU3RhckNvbW1lbnRzKAotYm9vbGVhbikKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1wdWJsaWMgdm9pZCB3aGl0ZXNwYWNlQ2hhcnMoCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgd29yZENoYXJzKAotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGphdmEubGFuZy5EZXByZWNhdGVkCi1wdWJsaWMgY2xhc3MgamF2YS5pby5TdHJpbmdCdWZmZXJJbnB1dFN0cmVhbSBleHRlbmRzIGphdmEuaW8uSW5wdXRTdHJlYW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgYnVmZmVyCi0KLXByb3RlY3RlZCBpbnQgY291bnQKLQotcHJvdGVjdGVkIGludCBwb3MKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgaW50IGF2YWlsYWJsZSgpCi0KLXB1YmxpYyBpbnQgcmVhZCgpCi0KLXB1YmxpYyBpbnQgcmVhZCgKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIHJlc2V0KCkKLQotcHVibGljIGxvbmcgc2tpcCgKLWxvbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5pby5TdHJpbmdSZWFkZXIgZXh0ZW5kcyBqYXZhLmlvLlJlYWRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGludCBjb3VudAotCi1wcml2YXRlIGludCBtYXJrcG9zCi0KLXByaXZhdGUgaW50IHBvcwotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgc3RyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBib29sZWFuIGlzQ2xvc2VkKCkKLQotcHVibGljIHZvaWQgY2xvc2UoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBtYXJrKAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBtYXJrU3VwcG9ydGVkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCByZWFkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCByZWFkKAotY2hhcltdCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gcmVhZHkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCByZXNldCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBsb25nIHNraXAoCi1sb25nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEuaW8uU3RyaW5nV3JpdGVyIGV4dGVuZHMgamF2YS5pby5Xcml0ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIGJ1ZgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludCkKLQotcHVibGljIGphdmEuaW8uU3RyaW5nV3JpdGVyIGFwcGVuZCgKLWNoYXIpCi0KLXB1YmxpYyBqYXZhLmlvLlN0cmluZ1dyaXRlciBhcHBlbmQoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotCi1wdWJsaWMgamF2YS5pby5TdHJpbmdXcml0ZXIgYXBwZW5kKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmlvLldyaXRlciBhcHBlbmQoCi1jaGFyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5pby5Xcml0ZXIgYXBwZW5kKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvbGF0aWxlIGphdmEuaW8uV3JpdGVyIGFwcGVuZCgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLkFwcGVuZGFibGUgYXBwZW5kKAotY2hhcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5BcHBlbmRhYmxlIGFwcGVuZCgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuQXBwZW5kYWJsZSBhcHBlbmQoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY2xvc2UoKQotCi1wdWJsaWMgdm9pZCBmbHVzaCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIGdldEJ1ZmZlcigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotcHVibGljIHZvaWQgd3JpdGUoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHdyaXRlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgd3JpdGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgd3JpdGUoCi1jaGFyW10KLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEuaW8uU3luY0ZhaWxlZEV4Y2VwdGlvbiBleHRlbmRzIGphdmEuaW8uSU9FeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLmlvLlVURkRhdGFGb3JtYXRFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmlvLklPRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5pby5JT0V4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEuaW8uV3JpdGVBYm9ydGVkRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5pby5PYmplY3RTdHJlYW1FeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0KLXB1YmxpYyBqYXZhLmxhbmcuRXhjZXB0aW9uIGRldGFpbAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5FeGNlcHRpb24pCi0KLXB1YmxpYyBqYXZhLmxhbmcuVGhyb3dhYmxlIGdldENhdXNlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TWVzc2FnZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5sYW5nLkxpbmthZ2VFcnJvciBleHRlbmRzIGphdmEubGFuZy5FcnJvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEubGFuZy5JbmNvbXBhdGlibGVDbGFzc0NoYW5nZUVycm9yIGV4dGVuZHMgamF2YS5sYW5nLkxpbmthZ2VFcnJvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEubGFuZy5BYnN0cmFjdE1ldGhvZEVycm9yIGV4dGVuZHMgamF2YS5sYW5nLkluY29tcGF0aWJsZUNsYXNzQ2hhbmdlRXJyb3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLWFic3RyYWN0IGNsYXNzIGphdmEubGFuZy5BYnN0cmFjdFN0cmluZ0J1aWxkZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBmaW5hbCBpbnQgSU5JVElBTF9DQVBBQ0lUWQotCi1wcml2YXRlIGludCBjb3VudAotCi1wcml2YXRlIGJvb2xlYW4gc2hhcmVkCi0KLXByaXZhdGUgY2hhcltdIHZhbHVlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KAotaW50KQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHZvaWQgZW5sYXJnZUJ1ZmZlcigKLWludCkKLQotcHJpdmF0ZSB2b2lkIG1vdmUoCi1pbnQKLWludCkKLQotZmluYWwgdm9pZCBhcHBlbmQwKAotY2hhcikKLQotZmluYWwgdm9pZCBhcHBlbmQwKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotaW50Ci1pbnQpCi0KLWZpbmFsIHZvaWQgYXBwZW5kMCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLWZpbmFsIHZvaWQgYXBwZW5kMCgKLWNoYXJbXSkKLQotZmluYWwgdm9pZCBhcHBlbmQwKAotY2hhcltdCi1pbnQKLWludCkKLQotZmluYWwgdm9pZCBhcHBlbmROdWxsKCkKLQotcHVibGljIGludCBjYXBhY2l0eSgpCi0KLXB1YmxpYyBjaGFyIGNoYXJBdCgKLWludCkKLQotcHVibGljIGludCBjb2RlUG9pbnRBdCgKLWludCkKLQotcHVibGljIGludCBjb2RlUG9pbnRCZWZvcmUoCi1pbnQpCi0KLXB1YmxpYyBpbnQgY29kZVBvaW50Q291bnQoCi1pbnQKLWludCkKLQotZmluYWwgdm9pZCBkZWxldGUwKAotaW50Ci1pbnQpCi0KLWZpbmFsIHZvaWQgZGVsZXRlQ2hhckF0MCgKLWludCkKLQotcHVibGljIHZvaWQgZW5zdXJlQ2FwYWNpdHkoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGdldENoYXJzKAotaW50Ci1pbnQKLWNoYXJbXQotaW50KQotCi1maW5hbCBjaGFyW10gZ2V0VmFsdWUoKQotCi1wdWJsaWMgaW50IGluZGV4T2YoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgaW50IGluZGV4T2YoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLWZpbmFsIHZvaWQgaW5zZXJ0MCgKLWludAotY2hhcikKLQotZmluYWwgdm9pZCBpbnNlcnQwKAotaW50Ci1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludCkKLQotZmluYWwgdm9pZCBpbnNlcnQwKAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1maW5hbCB2b2lkIGluc2VydDAoCi1pbnQKLWNoYXJbXSkKLQotZmluYWwgdm9pZCBpbnNlcnQwKAotaW50Ci1jaGFyW10KLWludAotaW50KQotCi1wdWJsaWMgaW50IGxhc3RJbmRleE9mKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGludCBsYXN0SW5kZXhPZigKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIGludCBsZW5ndGgoKQotCi1wdWJsaWMgaW50IG9mZnNldEJ5Q29kZVBvaW50cygKLWludAotaW50KQotCi1maW5hbCB2b2lkIHJlcGxhY2UwKAotaW50Ci1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi0KLWZpbmFsIHZvaWQgcmV2ZXJzZTAoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0ludmFsaWRPYmplY3RFeGNlcHRpb247ICkKLWZpbmFsIHZvaWQgc2V0KAotY2hhcltdCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldENoYXJBdCgKLWludAotY2hhcikKLQotcHVibGljIHZvaWQgc2V0TGVuZ3RoKAotaW50KQotCi1maW5hbCBjaGFyW10gc2hhcmVWYWx1ZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIHN1YlNlcXVlbmNlKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHN1YnN0cmluZygKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgc3Vic3RyaW5nKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotcHVibGljIHZvaWQgdHJpbVRvU2l6ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5sYW5nLkFyaXRobWV0aWNFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEubGFuZy5JbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLmxhbmcuQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLkluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEubGFuZy5BcnJheVN0b3JlRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLmxhbmcuQXNzZXJ0aW9uRXJyb3IgZXh0ZW5kcyBqYXZhLmxhbmcuRXJyb3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotY2hhcikKLQotcHVibGljIHZvaWQgPGluaXQ+KAotZG91YmxlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1mbG9hdCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1sb25nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ib29sZWFuKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS9pby9TZXJpYWxpemFibGU7TGphdmEvbGFuZy9Db21wYXJhYmxlPExqYXZhL2xhbmcvQm9vbGVhbjs+OyApCi1wdWJsaWMgZmluYWwgY2xhc3MgamF2YS5sYW5nLkJvb2xlYW4gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUsIGphdmEubGFuZy5Db21wYXJhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkJvb2xlYW4gRkFMU0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQm9vbGVhbiBUUlVFCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9DbGFzczxMamF2YS9sYW5nL0Jvb2xlYW47PjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQ2xhc3MgVFlQRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSBmaW5hbCBib29sZWFuIHZhbHVlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ib29sZWFuKQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0Qm9vbGVhbigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwYXJzZUJvb2xlYW4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoCi1ib29sZWFuKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5Cb29sZWFuIHZhbHVlT2YoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5Cb29sZWFuIHZhbHVlT2YoCi1ib29sZWFuKQotCi1wdWJsaWMgYm9vbGVhbiBib29sZWFuVmFsdWUoKQotCi1wdWJsaWMgaW50IGNvbXBhcmVUbygKLWphdmEubGFuZy5Cb29sZWFuKQotCi1wdWJsaWMgdm9sYXRpbGUgaW50IGNvbXBhcmVUbygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi0gY2xhc3MgamF2YS5sYW5nLkJvb3RDbGFzc0xvYWRlciBleHRlbmRzIGphdmEubGFuZy5DbGFzc0xvYWRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgamF2YS5sYW5nLkJvb3RDbGFzc0xvYWRlciBpbnN0YW5jZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLkJvb3RDbGFzc0xvYWRlciBnZXRJbnN0YW5jZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL0NsYXNzPCo+OyApCi1wcm90ZWN0ZWQgamF2YS5sYW5nLkNsYXNzIGZpbmRDbGFzcygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByb3RlY3RlZCBqYXZhLm5ldC5VUkwgZmluZFJlc291cmNlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL3V0aWwvRW51bWVyYXRpb248TGphdmEvbmV0L1VSTDs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCBqYXZhLnV0aWwuRW51bWVyYXRpb24gZmluZFJlc291cmNlcygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByb3RlY3RlZCBqYXZhLmxhbmcuUGFja2FnZSBnZXRQYWNrYWdlKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9OdW1iZXI7TGphdmEvbGFuZy9Db21wYXJhYmxlPExqYXZhL2xhbmcvQnl0ZTs+OyApCi1wdWJsaWMgZmluYWwgY2xhc3MgamF2YS5sYW5nLkJ5dGUgZXh0ZW5kcyBqYXZhLmxhbmcuTnVtYmVyIGltcGxlbWVudHMgamF2YS5sYW5nLkNvbXBhcmFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkJ5dGVbXSBDQUNIRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgTUFYX1ZBTFVFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBNSU5fVkFMVUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0laRQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvQ2xhc3M8TGphdmEvbGFuZy9CeXRlOz47ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkNsYXNzIFRZUEUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0KLXByaXZhdGUgZmluYWwgYnl0ZSB2YWx1ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYnl0ZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL051bWJlckZvcm1hdEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL051bWJlckZvcm1hdEV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuQnl0ZSBkZWNvZGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvTnVtYmVyRm9ybWF0RXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGJ5dGUgcGFyc2VCeXRlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL051bWJlckZvcm1hdEV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBieXRlIHBhcnNlQnl0ZSgKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKAotYnl0ZSkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuQnl0ZSB2YWx1ZU9mKAotYnl0ZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL051bWJlckZvcm1hdEV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuQnl0ZSB2YWx1ZU9mKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL051bWJlckZvcm1hdEV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuQnl0ZSB2YWx1ZU9mKAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgYnl0ZSBieXRlVmFsdWUoKQotCi1wdWJsaWMgaW50IGNvbXBhcmVUbygKLWphdmEubGFuZy5CeXRlKQotCi1wdWJsaWMgdm9sYXRpbGUgaW50IGNvbXBhcmVUbygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBkb3VibGUgZG91YmxlVmFsdWUoKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgZmxvYXQgZmxvYXRWYWx1ZSgpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1wdWJsaWMgaW50IGludFZhbHVlKCkKLQotcHVibGljIGxvbmcgbG9uZ1ZhbHVlKCkKLQotcHVibGljIHNob3J0IHNob3J0VmFsdWUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IGNoYXIgY2hhckF0KAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGxlbmd0aCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIHN1YlNlcXVlbmNlKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9U3Vic2V0ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL2xhbmcvQ2hhcmFjdGVyOyApCi1wdWJsaWMgY2xhc3MgamF2YS5sYW5nLkNoYXJhY3RlciRTdWJzZXQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBqYXZhLmxhbmcuU3RyaW5nIG5hbWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgZmluYWwgaW50IGhhc2hDb2RlKCkKLQotcHVibGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL2xhbmcvQ2hhcmFjdGVyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI1IG5hbWUgPVVuaWNvZGVCbG9jayApCi1wdWJsaWMgZmluYWwgY2xhc3MgamF2YS5sYW5nLkNoYXJhY3RlciRVbmljb2RlQmxvY2sgZXh0ZW5kcyBqYXZhLmxhbmcuQ2hhcmFjdGVyJFN1YnNldAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIEFFR0VBTl9OVU1CRVJTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkNoYXJhY3RlciRVbmljb2RlQmxvY2sgQUxQSEFCRVRJQ19QUkVTRU5UQVRJT05fRk9STVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQ2hhcmFjdGVyJFVuaWNvZGVCbG9jayBBUkFCSUMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQ2hhcmFjdGVyJFVuaWNvZGVCbG9jayBBUkFCSUNfUFJFU0VOVEFUSU9OX0ZPUk1TX0EKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQ2hhcmFjdGVyJFVuaWNvZGVCbG9jayBBUkFCSUNfUFJFU0VOVEFUSU9OX0ZPUk1TX0IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQ2hhcmFjdGVyJFVuaWNvZGVCbG9jayBBUk1FTklBTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIEFSUk9XUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIEJBU0lDX0xBVElOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkNoYXJhY3RlciRVbmljb2RlQmxvY2sgQkVOR0FMSQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuQ2hhcmFjdGVyJFVuaWNvZGVCbG9ja1tdIEJMT0NLUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIEJMT0NLX0VMRU1FTlRTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkNoYXJhY3RlciRVbmljb2RlQmxvY2sgQk9QT01PRk8KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQ2hhcmFjdGVyJFVuaWNvZGVCbG9jayBCT1BPTU9GT19FWFRFTkRFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIEJPWF9EUkFXSU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkNoYXJhY3RlciRVbmljb2RlQmxvY2sgQlJBSUxMRV9QQVRURVJOUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIEJVSElECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkNoYXJhY3RlciRVbmljb2RlQmxvY2sgQllaQU5USU5FX01VU0lDQUxfU1lNQk9MUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIENIRVJPS0VFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkNoYXJhY3RlciRVbmljb2RlQmxvY2sgQ0pLX0NPTVBBVElCSUxJVFkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQ2hhcmFjdGVyJFVuaWNvZGVCbG9jayBDSktfQ09NUEFUSUJJTElUWV9GT1JNUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIENKS19DT01QQVRJQklMSVRZX0lERU9HUkFQSFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQ2hhcmFjdGVyJFVuaWNvZGVCbG9jayBDSktfQ09NUEFUSUJJTElUWV9JREVPR1JBUEhTX1NVUFBMRU1FTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQ2hhcmFjdGVyJFVuaWNvZGVCbG9jayBDSktfUkFESUNBTFNfU1VQUExFTUVOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIENKS19TWU1CT0xTX0FORF9QVU5DVFVBVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIENKS19VTklGSUVEX0lERU9HUkFQSFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQ2hhcmFjdGVyJFVuaWNvZGVCbG9jayBDSktfVU5JRklFRF9JREVPR1JBUEhTX0VYVEVOU0lPTl9BCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkNoYXJhY3RlciRVbmljb2RlQmxvY2sgQ0pLX1VOSUZJRURfSURFT0dSQVBIU19FWFRFTlNJT05fQgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIENPTUJJTklOR19ESUFDUklUSUNBTF9NQVJLUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIENPTUJJTklOR19IQUxGX01BUktTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkNoYXJhY3RlciRVbmljb2RlQmxvY2sgQ09NQklOSU5HX01BUktTX0ZPUl9TWU1CT0xTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkNoYXJhY3RlciRVbmljb2RlQmxvY2sgQ09OVFJPTF9QSUNUVVJFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIENVUlJFTkNZX1NZTUJPTFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQ2hhcmFjdGVyJFVuaWNvZGVCbG9jayBDWVBSSU9UX1NZTExBQkFSWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIENZUklMTElDCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkNoYXJhY3RlciRVbmljb2RlQmxvY2sgQ1lSSUxMSUNfU1VQUExFTUVOVEFSWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIERFU0VSRVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQ2hhcmFjdGVyJFVuaWNvZGVCbG9jayBERVZBTkFHQVJJCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkNoYXJhY3RlciRVbmljb2RlQmxvY2sgRElOR0JBVFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQ2hhcmFjdGVyJFVuaWNvZGVCbG9jayBFTkNMT1NFRF9BTFBIQU5VTUVSSUNTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkNoYXJhY3RlciRVbmljb2RlQmxvY2sgRU5DTE9TRURfQ0pLX0xFVFRFUlNfQU5EX01PTlRIUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIEVUSElPUElDCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkNoYXJhY3RlciRVbmljb2RlQmxvY2sgR0VORVJBTF9QVU5DVFVBVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIEdFT01FVFJJQ19TSEFQRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQ2hhcmFjdGVyJFVuaWNvZGVCbG9jayBHRU9SR0lBTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIEdPVEhJQwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIEdSRUVLCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkNoYXJhY3RlciRVbmljb2RlQmxvY2sgR1JFRUtfRVhURU5ERUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQ2hhcmFjdGVyJFVuaWNvZGVCbG9jayBHVUpBUkFUSQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIEdVUk1VS0hJCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkNoYXJhY3RlciRVbmljb2RlQmxvY2sgSEFMRldJRFRIX0FORF9GVUxMV0lEVEhfRk9STVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQ2hhcmFjdGVyJFVuaWNvZGVCbG9jayBIQU5HVUxfQ09NUEFUSUJJTElUWV9KQU1PCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkNoYXJhY3RlciRVbmljb2RlQmxvY2sgSEFOR1VMX0pBTU8KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQ2hhcmFjdGVyJFVuaWNvZGVCbG9jayBIQU5HVUxfU1lMTEFCTEVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkNoYXJhY3RlciRVbmljb2RlQmxvY2sgSEFOVU5PTwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIEhFQlJFVwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIEhJR0hfUFJJVkFURV9VU0VfU1VSUk9HQVRFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIEhJR0hfU1VSUk9HQVRFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIEhJUkFHQU5BCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkNoYXJhY3RlciRVbmljb2RlQmxvY2sgSURFT0dSQVBISUNfREVTQ1JJUFRJT05fQ0hBUkFDVEVSUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIElQQV9FWFRFTlNJT05TCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkNoYXJhY3RlciRVbmljb2RlQmxvY2sgS0FOQlVOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkNoYXJhY3RlciRVbmljb2RlQmxvY2sgS0FOR1hJX1JBRElDQUxTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkNoYXJhY3RlciRVbmljb2RlQmxvY2sgS0FOTkFEQQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIEtBVEFLQU5BCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkNoYXJhY3RlciRVbmljb2RlQmxvY2sgS0FUQUtBTkFfUEhPTkVUSUNfRVhURU5TSU9OUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIEtITUVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkNoYXJhY3RlciRVbmljb2RlQmxvY2sgS0hNRVJfU1lNQk9MUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIExBTwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIExBVElOXzFfU1VQUExFTUVOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIExBVElOX0VYVEVOREVEX0EKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQ2hhcmFjdGVyJFVuaWNvZGVCbG9jayBMQVRJTl9FWFRFTkRFRF9BRERJVElPTkFMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkNoYXJhY3RlciRVbmljb2RlQmxvY2sgTEFUSU5fRVhURU5ERURfQgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIExFVFRFUkxJS0VfU1lNQk9MUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIExJTUJVCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkNoYXJhY3RlciRVbmljb2RlQmxvY2sgTElORUFSX0JfSURFT0dSQU1TCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkNoYXJhY3RlciRVbmljb2RlQmxvY2sgTElORUFSX0JfU1lMTEFCQVJZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkNoYXJhY3RlciRVbmljb2RlQmxvY2sgTE9XX1NVUlJPR0FURVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQ2hhcmFjdGVyJFVuaWNvZGVCbG9jayBNQUxBWUFMQU0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQ2hhcmFjdGVyJFVuaWNvZGVCbG9jayBNQVRIRU1BVElDQUxfQUxQSEFOVU1FUklDX1NZTUJPTFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQ2hhcmFjdGVyJFVuaWNvZGVCbG9jayBNQVRIRU1BVElDQUxfT1BFUkFUT1JTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkNoYXJhY3RlciRVbmljb2RlQmxvY2sgTUlTQ0VMTEFORU9VU19NQVRIRU1BVElDQUxfU1lNQk9MU19BCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkNoYXJhY3RlciRVbmljb2RlQmxvY2sgTUlTQ0VMTEFORU9VU19NQVRIRU1BVElDQUxfU1lNQk9MU19CCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkNoYXJhY3RlciRVbmljb2RlQmxvY2sgTUlTQ0VMTEFORU9VU19TWU1CT0xTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkNoYXJhY3RlciRVbmljb2RlQmxvY2sgTUlTQ0VMTEFORU9VU19TWU1CT0xTX0FORF9BUlJPV1MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQ2hhcmFjdGVyJFVuaWNvZGVCbG9jayBNSVNDRUxMQU5FT1VTX1RFQ0hOSUNBTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIE1PTkdPTElBTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIE1VU0lDQUxfU1lNQk9MUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIE1ZQU5NQVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQ2hhcmFjdGVyJFVuaWNvZGVCbG9jayBOVU1CRVJfRk9STVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQ2hhcmFjdGVyJFVuaWNvZGVCbG9jayBPR0hBTQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIE9MRF9JVEFMSUMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQ2hhcmFjdGVyJFVuaWNvZGVCbG9jayBPUFRJQ0FMX0NIQVJBQ1RFUl9SRUNPR05JVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIE9SSVlBCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkNoYXJhY3RlciRVbmljb2RlQmxvY2sgT1NNQU5ZQQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIFBIT05FVElDX0VYVEVOU0lPTlMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQ2hhcmFjdGVyJFVuaWNvZGVCbG9jayBQUklWQVRFX1VTRV9BUkVBCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkNoYXJhY3RlciRVbmljb2RlQmxvY2sgUlVOSUMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQ2hhcmFjdGVyJFVuaWNvZGVCbG9jayBTSEFWSUFOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkNoYXJhY3RlciRVbmljb2RlQmxvY2sgU0lOSEFMQQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIFNNQUxMX0ZPUk1fVkFSSUFOVFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQ2hhcmFjdGVyJFVuaWNvZGVCbG9jayBTUEFDSU5HX01PRElGSUVSX0xFVFRFUlMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQ2hhcmFjdGVyJFVuaWNvZGVCbG9jayBTUEVDSUFMUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIFNVUEVSU0NSSVBUU19BTkRfU1VCU0NSSVBUUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIFNVUFBMRU1FTlRBTF9BUlJPV1NfQQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIFNVUFBMRU1FTlRBTF9BUlJPV1NfQgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIFNVUFBMRU1FTlRBTF9NQVRIRU1BVElDQUxfT1BFUkFUT1JTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkNoYXJhY3RlciRVbmljb2RlQmxvY2sgU1VQUExFTUVOVEFSWV9QUklWQVRFX1VTRV9BUkVBX0EKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQ2hhcmFjdGVyJFVuaWNvZGVCbG9jayBTVVBQTEVNRU5UQVJZX1BSSVZBVEVfVVNFX0FSRUFfQgotQGphdmEubGFuZy5EZXByZWNhdGVkCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIFNVUlJPR0FURVNfQVJFQQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIFNZUklBQwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIFRBR0FMT0cKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQ2hhcmFjdGVyJFVuaWNvZGVCbG9jayBUQUdCQU5XQQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIFRBR1MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQ2hhcmFjdGVyJFVuaWNvZGVCbG9jayBUQUlfTEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQ2hhcmFjdGVyJFVuaWNvZGVCbG9jayBUQUlfWFVBTl9KSU5HX1NZTUJPTFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQ2hhcmFjdGVyJFVuaWNvZGVCbG9jayBUQU1JTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIFRFTFVHVQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIFRIQUFOQQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIFRIQUkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQ2hhcmFjdGVyJFVuaWNvZGVCbG9jayBUSUJFVEFOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkNoYXJhY3RlciRVbmljb2RlQmxvY2sgVUdBUklUSUMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQ2hhcmFjdGVyJFVuaWNvZGVCbG9jayBVTklGSUVEX0NBTkFESUFOX0FCT1JJR0lOQUxfU1lMTEFCSUNTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkNoYXJhY3RlciRVbmljb2RlQmxvY2sgVkFSSUFUSU9OX1NFTEVDVE9SUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIFZBUklBVElPTl9TRUxFQ1RPUlNfU1VQUExFTUVOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIFlJSklOR19IRVhBR1JBTV9TWU1CT0xTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkNoYXJhY3RlciRVbmljb2RlQmxvY2sgWUlfUkFESUNBTFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQ2hhcmFjdGVyJFVuaWNvZGVCbG9jayBZSV9TWUxMQUJMRVMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIGZvck5hbWUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5DaGFyYWN0ZXIkVW5pY29kZUJsb2NrIG9mKAotY2hhcikKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuQ2hhcmFjdGVyJFVuaWNvZGVCbG9jayBvZigKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9dmFsdWVPZkNhY2hlICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL2xhbmcvQ2hhcmFjdGVyOyApCi0gY2xhc3MgamF2YS5sYW5nLkNoYXJhY3RlciR2YWx1ZU9mQ2FjaGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DaGFyYWN0ZXJbXSBDQUNIRQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KCkKLQotc3RhdGljIGphdmEubGFuZy5DaGFyYWN0ZXJbXSBhY2Nlc3MkMDAwKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvaW8vU2VyaWFsaXphYmxlO0xqYXZhL2xhbmcvQ29tcGFyYWJsZTxMamF2YS9sYW5nL0NoYXJhY3Rlcjs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxqYXZhL2xhbmcvQ2hhcmFjdGVyJHZhbHVlT2ZDYWNoZTtMamF2YS9sYW5nL0NoYXJhY3RlciRVbmljb2RlQmxvY2s7TGphdmEvbGFuZy9DaGFyYWN0ZXIkU3Vic2V0OyApCi1wdWJsaWMgZmluYWwgY2xhc3MgamF2YS5sYW5nLkNoYXJhY3RlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgamF2YS5sYW5nLkNvbXBhcmFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIGJvb2xlYW4gJGFzc2VydGlvbnNEaXNhYmxlZAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0FDSEVfTEVOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBDT01CSU5JTkdfU1BBQ0lOR19NQVJLCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBDT05ORUNUT1JfUFVOQ1RVQVRJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIENPTlRST0wKLQotcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIENVUlJFTkNZX1NZTUJPTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgREFTSF9QVU5DVFVBVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgREVDSU1BTF9ESUdJVF9OVU1CRVIKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIERJUkVDVElPTkFMSVRZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBESVJFQ1RJT05BTElUWV9BUkFCSUNfTlVNQkVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBESVJFQ1RJT05BTElUWV9CT1VOREFSWV9ORVVUUkFMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBESVJFQ1RJT05BTElUWV9DT01NT05fTlVNQkVSX1NFUEFSQVRPUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBESVJFQ1RJT05BTElUWV9FVVJPUEVBTl9OVU1CRVJfU0VQQVJBVE9SCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBESVJFQ1RJT05BTElUWV9FVVJPUEVBTl9OVU1CRVJfVEVSTUlOQVRPUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgRElSRUNUSU9OQUxJVFlfTEVGVF9UT19SSUdIVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgRElSRUNUSU9OQUxJVFlfTEVGVF9UT19SSUdIVF9FTUJFRERJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIERJUkVDVElPTkFMSVRZX0xFRlRfVE9fUklHSFRfT1ZFUlJJREUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIERJUkVDVElPTkFMSVRZX05PTlNQQUNJTkdfTUFSSwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgRElSRUNUSU9OQUxJVFlfT1RIRVJfTkVVVFJBTFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIERJUkVDVElPTkFMSVRZX1BBUkFHUkFQSF9TRVBBUkFUT1IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIERJUkVDVElPTkFMSVRZX1BPUF9ESVJFQ1RJT05BTF9GT1JNQVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIERJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIERJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlRfQVJBQklDCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBESVJFQ1RJT05BTElUWV9SSUdIVF9UT19MRUZUX0VNQkVERElORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVF9PVkVSUklERQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgRElSRUNUSU9OQUxJVFlfU0VHTUVOVF9TRVBBUkFUT1IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIERJUkVDVElPTkFMSVRZX1VOREVGSU5FRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgRElSRUNUSU9OQUxJVFlfV0hJVEVTUEFDRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgRU5DTE9TSU5HX01BUksKLQotcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIEVORF9QVU5DVFVBVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgRklOQUxfUVVPVEVfUFVOQ1RVQVRJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIEZPUk1BVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgSU5JVElBTF9RVU9URV9QVU5DVFVBVElPTgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSVNKQVZBUEFSVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSVNKQVZBU1RBUlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIExFVFRFUl9OVU1CRVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIExJTkVfU0VQQVJBVE9SCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBMT1dFUkNBU0VfTEVUVEVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBNQVRIX1NZTUJPTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfQ09ERV9QT0lOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgTUFYX0hJR0hfU1VSUk9HQVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBNQVhfTE9XX1NVUlJPR0FURQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfUkFESVgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIE1BWF9TVVJST0dBVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIE1BWF9WQUxVRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSU5fQ09ERV9QT0lOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgTUlOX0hJR0hfU1VSUk9HQVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBNSU5fTE9XX1NVUlJPR0FURQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSU5fUkFESVgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlOX1NVUFBMRU1FTlRBUllfQ09ERV9QT0lOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgTUlOX1NVUlJPR0FURQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgTUlOX1ZBTFVFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBNT0RJRklFUl9MRVRURVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE1PRElGSUVSX1NZTUJPTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgTk9OX1NQQUNJTkdfTUFSSwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1RIRVJfTEVUVEVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPVEhFUl9OVU1CRVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9USEVSX1BVTkNUVUFUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPVEhFUl9TWU1CT0wKLQotcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFBBUkFHUkFQSF9TRVBBUkFUT1IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFBSSVZBVEVfVVNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJWkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFNQQUNFX1NFUEFSQVRPUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgU1RBUlRfUFVOQ1RVQVRJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFNVUlJPR0FURQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgVElUTEVDQVNFX0xFVFRFUgotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvQ2xhc3M8TGphdmEvbGFuZy9DaGFyYWN0ZXI7PjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQ2xhc3MgVFlQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgVU5BU1NJR05FRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgVVBQRVJDQVNFX0xFVFRFUgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIHR5cGVUYWdzCi0KLXByaXZhdGUgZmluYWwgY2hhciB2YWx1ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotY2hhcikKLQotcHVibGljIHN0YXRpYyBpbnQgY2hhckNvdW50KAotaW50KQotCi1wdWJsaWMgc3RhdGljIGludCBjb2RlUG9pbnRBdCgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWludCkKLQotcHVibGljIHN0YXRpYyBpbnQgY29kZVBvaW50QXQoCi1jaGFyW10KLWludCkKLQotcHVibGljIHN0YXRpYyBpbnQgY29kZVBvaW50QXQoCi1jaGFyW10KLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIGludCBjb2RlUG9pbnRCZWZvcmUoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgaW50IGNvZGVQb2ludEJlZm9yZSgKLWNoYXJbXQotaW50KQotCi1wdWJsaWMgc3RhdGljIGludCBjb2RlUG9pbnRCZWZvcmUoCi1jaGFyW10KLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIGludCBjb2RlUG9pbnRDb3VudCgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIGludCBjb2RlUG9pbnRDb3VudCgKLWNoYXJbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgaW50IGRpZ2l0KAotY2hhcgotaW50KQotCi1wdWJsaWMgc3RhdGljIGludCBkaWdpdCgKLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIGNoYXIgZm9yRGlnaXQoCi1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBieXRlIGdldERpcmVjdGlvbmFsaXR5KAotY2hhcikKLQotcHVibGljIHN0YXRpYyBieXRlIGdldERpcmVjdGlvbmFsaXR5KAotaW50KQotCi1wdWJsaWMgc3RhdGljIGludCBnZXROdW1lcmljVmFsdWUoCi1jaGFyKQotCi1wdWJsaWMgc3RhdGljIGludCBnZXROdW1lcmljVmFsdWUoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgaW50IGdldFR5cGUoCi1jaGFyKQotCi1wdWJsaWMgc3RhdGljIGludCBnZXRUeXBlKAotaW50KQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEZWZpbmVkKAotY2hhcikKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGVmaW5lZCgKLWludCkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGlnaXQoCi1jaGFyKQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEaWdpdCgKLWludCkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzSGlnaFN1cnJvZ2F0ZSgKLWNoYXIpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0lTT0NvbnRyb2woCi1jaGFyKQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNJU09Db250cm9sKAotaW50KQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNJZGVudGlmaWVySWdub3JhYmxlKAotY2hhcikKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzSWRlbnRpZmllcklnbm9yYWJsZSgKLWludCkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzSmF2YUlkZW50aWZpZXJQYXJ0KAotY2hhcikKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzSmF2YUlkZW50aWZpZXJQYXJ0KAotaW50KQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKYXZhSWRlbnRpZmllclN0YXJ0KAotY2hhcikKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzSmF2YUlkZW50aWZpZXJTdGFydCgKLWludCkKLUBqYXZhLmxhbmcuRGVwcmVjYXRlZAotcHVibGljIHN0YXRpYyBib29sZWFuIGlzSmF2YUxldHRlcigKLWNoYXIpCi1AamF2YS5sYW5nLkRlcHJlY2F0ZWQKLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0phdmFMZXR0ZXJPckRpZ2l0KAotY2hhcikKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzTGV0dGVyKAotY2hhcikKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzTGV0dGVyKAotaW50KQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMZXR0ZXJPckRpZ2l0KAotY2hhcikKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzTGV0dGVyT3JEaWdpdCgKLWludCkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzTG93U3Vycm9nYXRlKAotY2hhcikKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzTG93ZXJDYXNlKAotY2hhcikKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzTG93ZXJDYXNlKAotaW50KQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNNaXJyb3JlZCgKLWNoYXIpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc01pcnJvcmVkKAotaW50KQotQGphdmEubGFuZy5EZXByZWNhdGVkCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTcGFjZSgKLWNoYXIpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NwYWNlQ2hhcigKLWNoYXIpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NwYWNlQ2hhcigKLWludCkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzU3VwcGxlbWVudGFyeUNvZGVQb2ludCgKLWludCkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzU3Vycm9nYXRlUGFpcigKLWNoYXIKLWNoYXIpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RpdGxlQ2FzZSgKLWNoYXIpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RpdGxlQ2FzZSgKLWludCkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzVW5pY29kZUlkZW50aWZpZXJQYXJ0KAotY2hhcikKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzVW5pY29kZUlkZW50aWZpZXJQYXJ0KAotaW50KQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNVbmljb2RlSWRlbnRpZmllclN0YXJ0KAotY2hhcikKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzVW5pY29kZUlkZW50aWZpZXJTdGFydCgKLWludCkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzVXBwZXJDYXNlKAotY2hhcikKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzVXBwZXJDYXNlKAotaW50KQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZENvZGVQb2ludCgKLWludCkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzV2hpdGVzcGFjZSgKLWNoYXIpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1doaXRlc3BhY2UoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgaW50IG9mZnNldEJ5Q29kZVBvaW50cygKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIGludCBvZmZzZXRCeUNvZGVQb2ludHMoCi1jaGFyW10KLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBjaGFyIHJldmVyc2VCeXRlcygKLWNoYXIpCi0KLXB1YmxpYyBzdGF0aWMgaW50IHRvQ2hhcnMoCi1pbnQKLWNoYXJbXQotaW50KQotCi1wdWJsaWMgc3RhdGljIGNoYXJbXSB0b0NoYXJzKAotaW50KQotCi1wdWJsaWMgc3RhdGljIGludCB0b0NvZGVQb2ludCgKLWNoYXIKLWNoYXIpCi0KLXB1YmxpYyBzdGF0aWMgY2hhciB0b0xvd2VyQ2FzZSgKLWNoYXIpCi0KLXB1YmxpYyBzdGF0aWMgaW50IHRvTG93ZXJDYXNlKAotaW50KQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoCi1jaGFyKQotCi1wdWJsaWMgc3RhdGljIGNoYXIgdG9UaXRsZUNhc2UoCi1jaGFyKQotCi1wdWJsaWMgc3RhdGljIGludCB0b1RpdGxlQ2FzZSgKLWludCkKLQotcHVibGljIHN0YXRpYyBjaGFyIHRvVXBwZXJDYXNlKAotY2hhcikKLQotcHVibGljIHN0YXRpYyBpbnQgdG9VcHBlckNhc2UoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLkNoYXJhY3RlciB2YWx1ZU9mKAotY2hhcikKLQotcHVibGljIGNoYXIgY2hhclZhbHVlKCkKLQotcHVibGljIGludCBjb21wYXJlVG8oCi1qYXZhLmxhbmcuQ2hhcmFjdGVyKQotCi1wdWJsaWMgdm9sYXRpbGUgaW50IGNvbXBhcmVUbygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEubGFuZy5yZWZsZWN0LkFubm90YXRlZEVsZW1lbnQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDo6TGphdmEvbGFuZy9hbm5vdGF0aW9uL0Fubm90YXRpb247PihMamF2YS9sYW5nL0NsYXNzPFRUOz47KVRUOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKAotamF2YS5sYW5nLkNsYXNzKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbltdIGdldEFubm90YXRpb25zKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb25bXSBnZXREZWNsYXJlZEFubm90YXRpb25zKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9DbGFzczwrTGphdmEvbGFuZy9hbm5vdGF0aW9uL0Fubm90YXRpb247PjspWiApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0Fubm90YXRpb25QcmVzZW50KAotamF2YS5sYW5nLkNsYXNzKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZhLmxhbmcucmVmbGVjdC5HZW5lcmljRGVjbGFyYXRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVtMamF2YS9sYW5nL3JlZmxlY3QvVHlwZVZhcmlhYmxlPCo+OyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLnJlZmxlY3QuVHlwZVZhcmlhYmxlW10gZ2V0VHlwZVBhcmFtZXRlcnMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZhLmxhbmcucmVmbGVjdC5UeXBlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS9sYW5nL09iamVjdDtMamF2YS9pby9TZXJpYWxpemFibGU7TGphdmEvbGFuZy9yZWZsZWN0L0Fubm90YXRlZEVsZW1lbnQ7TGphdmEvbGFuZy9yZWZsZWN0L0dlbmVyaWNEZWNsYXJhdGlvbjtMamF2YS9sYW5nL3JlZmxlY3QvVHlwZTsgKQotcHVibGljIGZpbmFsIGNsYXNzIGphdmEubGFuZy5DbGFzcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgamF2YS5sYW5nLnJlZmxlY3QuQW5ub3RhdGVkRWxlbWVudCwgamF2YS5sYW5nLnJlZmxlY3QuR2VuZXJpY0RlY2xhcmF0aW9uLCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvcmVmL1NvZnRSZWZlcmVuY2U8TGphdmEvbGFuZy9DbGFzc0NhY2hlPFRUOz47PjsgKQotcHJpdmF0ZSB2b2xhdGlsZSBqYXZhLmxhbmcucmVmLlNvZnRSZWZlcmVuY2UgY2FjaGVSZWYKLQotcHJpdmF0ZSBqYXZhLnNlY3VyaXR5LlByb3RlY3Rpb25Eb21haW4gcGQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+KFtUVDtbVFQ7W1RUOylbVFQ7ICkKLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5PYmplY3RbXSBhcnJheWNvcHkoCi1qYXZhLmxhbmcuT2JqZWN0W10KLWphdmEubGFuZy5PYmplY3RbXQotamF2YS5sYW5nLk9iamVjdFtdKQotCi1wcml2YXRlIHZvaWQgY2hlY2tEZWNsYXJlZE1lbWJlckFjY2VzcygpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvU3RyaW5nO1pMamF2YS9sYW5nL0NsYXNzTG9hZGVyOylMamF2YS9sYW5nL0NsYXNzPCo+OyApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uOyApCi1zdGF0aWMgbmF0aXZlIGphdmEubGFuZy5DbGFzcyBjbGFzc0Zvck5hbWUoCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuCi1qYXZhLmxhbmcuQ2xhc3NMb2FkZXIpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL0NsYXNzPCo+OyApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5DbGFzcyBmb3JOYW1lKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9TdHJpbmc7WkxqYXZhL2xhbmcvQ2xhc3NMb2FkZXI7KUxqYXZhL2xhbmcvQ2xhc3M8Kj47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0NsYXNzTm90Rm91bmRFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLkNsYXNzIGZvck5hbWUoCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuCi1qYXZhLmxhbmcuQ2xhc3NMb2FkZXIpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvQ2xhc3M8Kj47KUxqYXZhL2xhbmcvQ2xhc3NMb2FkZXI7ICkKLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXIoCi1qYXZhLmxhbmcuQ2xhc3MpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvQ2xhc3M8Kj47WilbTGphdmEvbGFuZy9DbGFzczwqPjsgKQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGphdmEubGFuZy5DbGFzc1tdIGdldERlY2xhcmVkQ2xhc3NlcygKLWphdmEubGFuZy5DbGFzcwotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+KExqYXZhL2xhbmcvQ2xhc3M8VFQ7PjtaKVtMamF2YS9sYW5nL3JlZmxlY3QvQ29uc3RydWN0b3I8VFQ7PjsgKQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yW10gZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcnMoCi1qYXZhLmxhbmcuQ2xhc3MKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvQ2xhc3M8Kj47WilbTGphdmEvbGFuZy9yZWZsZWN0L0ZpZWxkOyApCi1zdGF0aWMgbmF0aXZlIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkW10gZ2V0RGVjbGFyZWRGaWVsZHMoCi1qYXZhLmxhbmcuQ2xhc3MKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvQ2xhc3M8Kj47WilbTGphdmEvbGFuZy9yZWZsZWN0L01ldGhvZDsgKQotc3RhdGljIG5hdGl2ZSBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2RbXSBnZXREZWNsYXJlZE1ldGhvZHMoCi1qYXZhLmxhbmcuQ2xhc3MKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFopW0xqYXZhL2xhbmcvQ2xhc3M8Kj47ICkKLXByaXZhdGUgamF2YS5sYW5nLkNsYXNzW10gZ2V0RnVsbExpc3RPZkNsYXNzZXMoCi1ib29sZWFuKQotCi1wcml2YXRlIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkW10gZ2V0RnVsbExpc3RPZkZpZWxkcygKLWJvb2xlYW4pCi0KLXByaXZhdGUgbmF0aXZlIGphdmEubGFuZy5TdHJpbmcgZ2V0SW5uZXJDbGFzc05hbWUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvTm9TdWNoTWV0aG9kRXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFtMamF2YS9sYW5nL3JlZmxlY3QvQ29uc3RydWN0b3I8VFQ7PjtbTGphdmEvbGFuZy9DbGFzczwqPjspTGphdmEvbGFuZy9yZWZsZWN0L0NvbnN0cnVjdG9yPFRUOz47ICkKLXByaXZhdGUgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IgZ2V0TWF0Y2hpbmdDb25zdHJ1Y3RvcigKLWphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yW10KLWphdmEubGFuZy5DbGFzc1tdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvTm9TdWNoRmllbGRFeGNlcHRpb247ICkKLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkIGdldE1hdGNoaW5nRmllbGQoCi1qYXZhLmxhbmcucmVmbGVjdC5GaWVsZFtdCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL0NsYXNzPCo+O1opSSApCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IGdldE1vZGlmaWVycygKLWphdmEubGFuZy5DbGFzcwotYm9vbGVhbikKLQotcHJpdmF0ZSBuYXRpdmUgamF2YS5sYW5nLk9iamVjdFtdIGdldFNpZ25hdHVyZUFubm90YXRpb24oKQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZ2V0U2lnbmF0dXJlQXR0cmlidXRlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSVopW0xqYXZhL2xhbmcvQ2xhc3M8Kj47ICkKLXN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQ2xhc3NbXSBnZXRTdGFja0NsYXNzZXMoCi1pbnQKLWJvb2xlYW4pCi0KLXN0YXRpYyBuYXRpdmUgdm9pZCBzZXRBY2Nlc3NpYmxlTm9DaGVjaygKLWphdmEubGFuZy5yZWZsZWN0LkFjY2Vzc2libGVPYmplY3QKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFU6TGphdmEvbGFuZy9PYmplY3Q7PihMamF2YS9sYW5nL0NsYXNzPFRVOz47KUxqYXZhL2xhbmcvQ2xhc3M8K1RVOz47ICkKLXB1YmxpYyBqYXZhLmxhbmcuQ2xhc3MgYXNTdWJjbGFzcygKLWphdmEubGFuZy5DbGFzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9PYmplY3Q7KVRUOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBjYXN0KAotamF2YS5sYW5nLk9iamVjdCkKLQotIHZvaWQgY2hlY2tQdWJsaWNNZW1iZXJBY2Nlc3MoKQotCi1wdWJsaWMgbmF0aXZlIGJvb2xlYW4gZGVzaXJlZEFzc2VydGlvblN0YXR1cygpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEE6OkxqYXZhL2xhbmcvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uOz4oTGphdmEvbGFuZy9DbGFzczxUQTs+OylUQTsgKQotcHVibGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigKLWphdmEubGFuZy5DbGFzcykKLQotcHVibGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb25bXSBnZXRBbm5vdGF0aW9ucygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldENhbm9uaWNhbE5hbWUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvbGFuZy9DbGFzc0NhY2hlPFRUOz47ICkKLSBqYXZhLmxhbmcuQ2xhc3NDYWNoZSBnZXRDbGFzc0NhY2hlKCkKLQotcHVibGljIGphdmEubGFuZy5DbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlcigpCi0KLSBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXJJbXBsKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVtMamF2YS9sYW5nL0NsYXNzPCo+OyApCi1wdWJsaWMgamF2YS5sYW5nLkNsYXNzW10gZ2V0Q2xhc3NlcygpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS9sYW5nL0NsYXNzPCo+OyApCi1wdWJsaWMgbmF0aXZlIGphdmEubGFuZy5DbGFzcyBnZXRDb21wb25lbnRUeXBlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL05vU3VjaE1ldGhvZEV4Y2VwdGlvbjtMamF2YS9sYW5nL1NlY3VyaXR5RXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFtMamF2YS9sYW5nL0NsYXNzOylMamF2YS9sYW5nL3JlZmxlY3QvQ29uc3RydWN0b3I8VFQ7PjsgKQotcHVibGljIHRyYW5zaWVudCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvciBnZXRDb25zdHJ1Y3RvcigKLWphdmEubGFuZy5DbGFzc1tdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvU2VjdXJpdHlFeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVtMamF2YS9sYW5nL3JlZmxlY3QvQ29uc3RydWN0b3I8VFQ7PjsgKQotcHVibGljIGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yW10gZ2V0Q29uc3RydWN0b3JzKCkKLQotcHVibGljIG5hdGl2ZSBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uW10gZ2V0RGVjbGFyZWRBbm5vdGF0aW9ucygpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClbTGphdmEvbGFuZy9DbGFzczwqPjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvU2VjdXJpdHlFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuQ2xhc3NbXSBnZXREZWNsYXJlZENsYXNzZXMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShbTGphdmEvbGFuZy9DbGFzczspTGphdmEvbGFuZy9yZWZsZWN0L0NvbnN0cnVjdG9yPFRUOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL05vU3VjaE1ldGhvZEV4Y2VwdGlvbjtMamF2YS9sYW5nL1NlY3VyaXR5RXhjZXB0aW9uOyApCi1wdWJsaWMgdHJhbnNpZW50IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yIGdldERlY2xhcmVkQ29uc3RydWN0b3IoCi1qYXZhLmxhbmcuQ2xhc3NbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL1NlY3VyaXR5RXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClbTGphdmEvbGFuZy9yZWZsZWN0L0NvbnN0cnVjdG9yPFRUOz47ICkKLXB1YmxpYyBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcltdIGdldERlY2xhcmVkQ29uc3RydWN0b3JzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL05vU3VjaEZpZWxkRXhjZXB0aW9uO0xqYXZhL2xhbmcvU2VjdXJpdHlFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCBnZXREZWNsYXJlZEZpZWxkKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL1NlY3VyaXR5RXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLnJlZmxlY3QuRmllbGRbXSBnZXREZWNsYXJlZEZpZWxkcygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9Ob1N1Y2hNZXRob2RFeGNlcHRpb247TGphdmEvbGFuZy9TZWN1cml0eUV4Y2VwdGlvbjsgKQotcHVibGljIHRyYW5zaWVudCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgZ2V0RGVjbGFyZWRNZXRob2QoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuQ2xhc3NbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL1NlY3VyaXR5RXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kW10gZ2V0RGVjbGFyZWRNZXRob2RzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL2xhbmcvQ2xhc3M8Kj47ICkKLXB1YmxpYyBuYXRpdmUgamF2YS5sYW5nLkNsYXNzIGdldERlY2xhcmluZ0NsYXNzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL2xhbmcvQ2xhc3M8Kj47ICkKLXB1YmxpYyBuYXRpdmUgamF2YS5sYW5nLkNsYXNzIGdldEVuY2xvc2luZ0NsYXNzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL2xhbmcvcmVmbGVjdC9Db25zdHJ1Y3RvcjwqPjsgKQotcHVibGljIG5hdGl2ZSBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvciBnZXRFbmNsb3NpbmdDb25zdHJ1Y3RvcigpCi0KLXB1YmxpYyBuYXRpdmUgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIGdldEVuY2xvc2luZ01ldGhvZCgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClbVFQ7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0W10gZ2V0RW51bUNvbnN0YW50cygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9Ob1N1Y2hGaWVsZEV4Y2VwdGlvbjtMamF2YS9sYW5nL1NlY3VyaXR5RXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQgZ2V0RmllbGQoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvU2VjdXJpdHlFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZFtdIGdldEZpZWxkcygpCi0KLXB1YmxpYyBqYXZhLmxhbmcucmVmbGVjdC5UeXBlW10gZ2V0R2VuZXJpY0ludGVyZmFjZXMoKQotCi1wdWJsaWMgamF2YS5sYW5nLnJlZmxlY3QuVHlwZSBnZXRHZW5lcmljU3VwZXJjbGFzcygpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClbTGphdmEvbGFuZy9DbGFzczwqPjsgKQotcHVibGljIG5hdGl2ZSBqYXZhLmxhbmcuQ2xhc3NbXSBnZXRJbnRlcmZhY2VzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL05vU3VjaE1ldGhvZEV4Y2VwdGlvbjtMamF2YS9sYW5nL1NlY3VyaXR5RXhjZXB0aW9uOyApCi1wdWJsaWMgdHJhbnNpZW50IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBnZXRNZXRob2QoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuQ2xhc3NbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL1NlY3VyaXR5RXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kW10gZ2V0TWV0aG9kcygpCi0KLXB1YmxpYyBpbnQgZ2V0TW9kaWZpZXJzKCkKLQotcHVibGljIG5hdGl2ZSBqYXZhLmxhbmcuU3RyaW5nIGdldE5hbWUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlBhY2thZ2UgZ2V0UGFja2FnZSgpCi0KLXB1YmxpYyBqYXZhLnNlY3VyaXR5LlByb3RlY3Rpb25Eb21haW4gZ2V0UHJvdGVjdGlvbkRvbWFpbigpCi0KLXB1YmxpYyBqYXZhLm5ldC5VUkwgZ2V0UmVzb3VyY2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5pby5JbnB1dFN0cmVhbSBnZXRSZXNvdXJjZUFzU3RyZWFtKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5PYmplY3RbXSBnZXRTaWduZXJzKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U2ltcGxlTmFtZSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS9sYW5nL0NsYXNzPC1UVDs+OyApCi1wdWJsaWMgbmF0aXZlIGphdmEubGFuZy5DbGFzcyBnZXRTdXBlcmNsYXNzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVtMamF2YS9sYW5nL3JlZmxlY3QvVHlwZVZhcmlhYmxlPExqYXZhL2xhbmcvQ2xhc3M8VFQ7Pjs+OyApCi1wdWJsaWMgamF2YS5sYW5nLnJlZmxlY3QuVHlwZVZhcmlhYmxlW10gZ2V0VHlwZVBhcmFtZXRlcnMoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0Fubm90YXRpb24oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL0NsYXNzPCtMamF2YS9sYW5nL2Fubm90YXRpb24vQW5ub3RhdGlvbjs+OylaICkKLXB1YmxpYyBib29sZWFuIGlzQW5ub3RhdGlvblByZXNlbnQoCi1qYXZhLmxhbmcuQ2xhc3MpCi0KLXB1YmxpYyBuYXRpdmUgYm9vbGVhbiBpc0Fub255bW91c0NsYXNzKCkKLQotcHVibGljIGJvb2xlYW4gaXNBcnJheSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvQ2xhc3M8Kj47KVogKQotcHVibGljIG5hdGl2ZSBib29sZWFuIGlzQXNzaWduYWJsZUZyb20oCi1qYXZhLmxhbmcuQ2xhc3MpCi0KLXB1YmxpYyBib29sZWFuIGlzRW51bSgpCi0KLXB1YmxpYyBuYXRpdmUgYm9vbGVhbiBpc0luc3RhbmNlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIG5hdGl2ZSBib29sZWFuIGlzSW50ZXJmYWNlKCkKLQotcHVibGljIGJvb2xlYW4gaXNMb2NhbENsYXNzKCkKLQotcHVibGljIGJvb2xlYW4gaXNNZW1iZXJDbGFzcygpCi0KLXB1YmxpYyBuYXRpdmUgYm9vbGVhbiBpc1ByaW1pdGl2ZSgpCi0KLXB1YmxpYyBib29sZWFuIGlzU3ludGhldGljKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBY2Nlc3NFeGNlcHRpb247TGphdmEvbGFuZy9JbnN0YW50aWF0aW9uRXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClUVDsgKQotcHVibGljIG5hdGl2ZSBqYXZhLmxhbmcuT2JqZWN0IG5ld0luc3RhbmNlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL2xhbmcvQ2xhc3NDYWNoZTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID00MTA0IG5hbWUgPW51bGwgKQotIGNsYXNzIGphdmEubGFuZy5DbGFzc0NhY2hlJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvdXRpbC9Db21wYXJhdG9yPExqYXZhL2xhbmcvRW51bTwqPjs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPUVudW1Db21wYXJhdG9yICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL2xhbmcvQ2xhc3NDYWNoZTsgKQotIGNsYXNzIGphdmEubGFuZy5DbGFzc0NhY2hlJEVudW1Db21wYXJhdG9yIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudXRpbC5Db21wYXJhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5DbGFzc0NhY2hlJDEpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvRW51bTwqPjtMamF2YS9sYW5nL0VudW08Kj47KUkgKQotcHVibGljIGludCBjb21wYXJlKAotamF2YS5sYW5nLkVudW0KLWphdmEubGFuZy5FbnVtKQotCi1wdWJsaWMgdm9sYXRpbGUgaW50IGNvbXBhcmUoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGphdmEvbGFuZy9DbGFzc0NhY2hlJDE7TGphdmEvbGFuZy9DbGFzc0NhY2hlJEVudW1Db21wYXJhdG9yOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFQ6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL2xhbmcvT2JqZWN0OyApCi0gY2xhc3MgamF2YS5sYW5nLkNsYXNzQ2FjaGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DbGFzc0NhY2hlJEVudW1Db21wYXJhdG9yIEVOVU1fQ09NUEFSQVRPUgotCi1zdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255Lmtlcm5lbC52bS5SZWZsZWN0aW9uQWNjZXNzIFJFRkxFQ1QKLQotcHJpdmF0ZSB2b2xhdGlsZSBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2RbXSBhbGxNZXRob2RzCi0KLXByaXZhdGUgdm9sYXRpbGUgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kW10gYWxsUHVibGljTWV0aG9kcwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvQ2xhc3M8VFQ7PjsgKQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuQ2xhc3MgY2xhenoKLQotcHJpdmF0ZSB2b2xhdGlsZSBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2RbXSBkZWNsYXJlZE1ldGhvZHMKLQotcHJpdmF0ZSB2b2xhdGlsZSBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2RbXSBkZWNsYXJlZFB1YmxpY01ldGhvZHMKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1bVFQ7ICkKLXByaXZhdGUgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdFtdIGVudW1WYWx1ZXNCeU5hbWUKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1bVFQ7ICkKLXByaXZhdGUgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdFtdIGVudW1WYWx1ZXNJbk9yZGVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL0NsYXNzPFRUOz47KVYgKQotIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLkNsYXNzKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpW1RUOyApCi1wcml2YXRlIGphdmEubGFuZy5PYmplY3RbXSBjYWxsRW51bVZhbHVlcygpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFtMamF2YS9sYW5nL0NsYXNzPCo+O1tMamF2YS9sYW5nL0NsYXNzPCo+OylaICkKLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb21wYXJlQ2xhc3NMaXN0cygKLWphdmEubGFuZy5DbGFzc1tdCi1qYXZhLmxhbmcuQ2xhc3NbXSkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2RbXSBkZWVwQ29weSgKLWphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZFtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL0NsYXNzPCo+O0xqYXZhL3V0aWwvQXJyYXlMaXN0PExqYXZhL2xhbmcvcmVmbGVjdC9NZXRob2Q7PjtMamF2YS91dGlsL0hhc2hTZXQ8TGphdmEvbGFuZy9TdHJpbmc7PjtaKVYgKQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZXRGdWxsTGlzdE9mTWV0aG9kcygKLWphdmEubGFuZy5DbGFzcwotamF2YS51dGlsLkFycmF5TGlzdAotamF2YS51dGlsLkhhc2hTZXQKLWJvb2xlYW4pCi0KLXByaXZhdGUgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kW10gZ2V0RnVsbExpc3RPZk1ldGhvZHMoCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvTm9TdWNoTWV0aG9kRXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFtMamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kO0xqYXZhL2xhbmcvU3RyaW5nO1tMamF2YS9sYW5nL0NsYXNzPCo+OylMamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kOyApCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBnZXRNYXRjaGluZ01ldGhvZCgKLWphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZFtdCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuQ2xhc3NbXSkKLQotcHJpdmF0ZSBzdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255Lmtlcm5lbC52bS5SZWZsZWN0aW9uQWNjZXNzIGdldFJlZmxlY3Rpb25BY2Nlc3MoKQotCi1wdWJsaWMgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kW10gZ2V0QWxsTWV0aG9kcygpCi0KLXB1YmxpYyBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2RbXSBnZXRBbGxQdWJsaWNNZXRob2RzKCkKLQotcHVibGljIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZFtdIGdldERlY2xhcmVkTWV0aG9kcygpCi0KLXB1YmxpYyBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2RbXSBnZXREZWNsYXJlZE1ldGhvZHMoCi1ib29sZWFuKQotCi1wdWJsaWMgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kW10gZ2V0RGVjbGFyZWRQdWJsaWNNZXRob2RzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9TdHJpbmc7KVRUOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRFbnVtVmFsdWUoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpW1RUOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdFtdIGdldEVudW1WYWx1ZXNCeU5hbWUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpW1RUOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdFtdIGdldEVudW1WYWx1ZXNJbk9yZGVyKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLmxhbmcuQ2xhc3NDYXN0RXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9DbGFzczwqPjtMamF2YS9sYW5nL0NsYXNzPCo+OylWICkKLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5DbGFzcwotamF2YS5sYW5nLkNsYXNzKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEubGFuZy5DbGFzc0NpcmN1bGFyaXR5RXJyb3IgZXh0ZW5kcyBqYXZhLmxhbmcuTGlua2FnZUVycm9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5sYW5nLkNsYXNzRm9ybWF0RXJyb3IgZXh0ZW5kcyBqYXZhLmxhbmcuTGlua2FnZUVycm9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvbGFuZy9DbGFzc0xvYWRlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1TeXN0ZW1DbGFzc0xvYWRlciApCi0gY2xhc3MgamF2YS5sYW5nLkNsYXNzTG9hZGVyJFN5c3RlbUNsYXNzTG9hZGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5DbGFzc0xvYWRlciBsb2FkZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEubGFuZy5DbGFzc05vdEZvdW5kRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLkV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuVGhyb3dhYmxlIGV4Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlRocm93YWJsZSkKLQotcHVibGljIGphdmEubGFuZy5UaHJvd2FibGUgZ2V0Q2F1c2UoKQotCi1wdWJsaWMgamF2YS5sYW5nLlRocm93YWJsZSBnZXRFeGNlcHRpb24oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEubGFuZy5DbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5FeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBqYXZhLmxhbmcuQ29tcGlsZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLk9iamVjdCBjb21tYW5kKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9DbGFzczwqPjspWiApCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gY29tcGlsZUNsYXNzKAotamF2YS5sYW5nLkNsYXNzKQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gY29tcGlsZUNsYXNzZXMoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgZGlzYWJsZSgpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBlbmFibGUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkCi1AamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uICh2YWx1ZSA9TGphdmEvbGFuZy9hbm5vdGF0aW9uL1JldGVudGlvblBvbGljeTshUlVOVElNRSApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEubGFuZy5EZXByZWNhdGVkIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL051bWJlcjtMamF2YS9sYW5nL0NvbXBhcmFibGU8TGphdmEvbGFuZy9Eb3VibGU7PjsgKQotcHVibGljIGZpbmFsIGNsYXNzIGphdmEubGFuZy5Eb3VibGUgZXh0ZW5kcyBqYXZhLmxhbmcuTnVtYmVyIGltcGxlbWVudHMgamF2YS5sYW5nLkNvbXBhcmFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBkb3VibGUgTUFYX1ZBTFVFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgZG91YmxlIE1JTl9WQUxVRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGRvdWJsZSBORUdBVElWRV9JTkZJTklUWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGRvdWJsZSBOYU4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBkb3VibGUgUE9TSVRJVkVfSU5GSU5JVFkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0laRQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvQ2xhc3M8TGphdmEvbGFuZy9Eb3VibGU7PjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQ2xhc3MgVFlQRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSBmaW5hbCBkb3VibGUgdmFsdWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWRvdWJsZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL051bWJlckZvcm1hdEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZSgKLWRvdWJsZQotZG91YmxlKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBsb25nIGRvdWJsZVRvTG9uZ0JpdHMoCi1kb3VibGUpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGxvbmcgZG91YmxlVG9SYXdMb25nQml0cygKLWRvdWJsZSkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzSW5maW5pdGUoCi1kb3VibGUpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc05hTigKLWRvdWJsZSkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIGxvbmdCaXRzVG9Eb3VibGUoCi1sb25nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvTnVtYmVyRm9ybWF0RXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGRvdWJsZSBwYXJzZURvdWJsZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyB0b0hleFN0cmluZygKLWRvdWJsZSkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKAotZG91YmxlKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5Eb3VibGUgdmFsdWVPZigKLWRvdWJsZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL051bWJlckZvcm1hdEV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuRG91YmxlIHZhbHVlT2YoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYnl0ZSBieXRlVmFsdWUoKQotCi1wdWJsaWMgaW50IGNvbXBhcmVUbygKLWphdmEubGFuZy5Eb3VibGUpCi0KLXB1YmxpYyB2b2xhdGlsZSBpbnQgY29tcGFyZVRvKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGRvdWJsZSBkb3VibGVWYWx1ZSgpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBmbG9hdCBmbG9hdFZhbHVlKCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLXB1YmxpYyBpbnQgaW50VmFsdWUoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0luZmluaXRlKCkKLQotcHVibGljIGJvb2xlYW4gaXNOYU4oKQotCi1wdWJsaWMgbG9uZyBsb25nVmFsdWUoKQotCi1wdWJsaWMgc2hvcnQgc2hvcnRWYWx1ZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvdXRpbC9FbnVtZXJhdGlvbjxMamF2YS9uZXQvVVJMOz47TGphdmEvaW8vU2VyaWFsaXphYmxlOyApCi1maW5hbCBjbGFzcyBqYXZhLmxhbmcuRW1wdHlFbnVtZXJhdGlvbiBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuRW51bWVyYXRpb24sIGphdmEuaW8uU2VyaWFsaXphYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5FbXB0eUVudW1lcmF0aW9uIG1JbnN0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuRW1wdHlFbnVtZXJhdGlvbiBnZXRJbnN0YW5jZSgpCi0KLXB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IG5leHRFbGVtZW50KCkKLQotcHVibGljIGphdmEubmV0LlVSTCBuZXh0RWxlbWVudCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS9sYW5nL09iamVjdDsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVRUOyApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuT2JqZWN0IHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3NlY3VyaXR5L1ByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb248TGphdmEvbGFuZy9yZWZsZWN0L01ldGhvZDs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1maW5hbCBjbGFzcyBqYXZhLmxhbmcuRW51bSQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBqYXZhLmxhbmcuQ2xhc3MgdmFsJGVudW1UeXBlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLkNsYXNzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBydW4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5sYW5nLkVudW1Db25zdGFudE5vdFByZXNlbnRFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGNvbnN0YW50TmFtZQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvQ2xhc3M8K0xqYXZhL2xhbmcvRW51bTs+OyApCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5DbGFzcyBlbnVtVHlwZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvQ2xhc3M8K0xqYXZhL2xhbmcvRW51bTs+O0xqYXZhL2xhbmcvU3RyaW5nOylWICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5DbGFzcwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgY29uc3RhbnROYW1lKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL2xhbmcvQ2xhc3M8K0xqYXZhL2xhbmcvRW51bTs+OyApCi1wdWJsaWMgamF2YS5sYW5nLkNsYXNzIGVudW1UeXBlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLmxhbmcuRXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yIGV4dGVuZHMgamF2YS5sYW5nLkxpbmthZ2VFcnJvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuVGhyb3dhYmxlIGV4Y2VwdGlvbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLXB1YmxpYyBqYXZhLmxhbmcuVGhyb3dhYmxlIGdldENhdXNlKCkKLQotcHVibGljIGphdmEubGFuZy5UaHJvd2FibGUgZ2V0RXhjZXB0aW9uKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9OdW1iZXI7TGphdmEvbGFuZy9Db21wYXJhYmxlPExqYXZhL2xhbmcvRmxvYXQ7PjsgKQotcHVibGljIGZpbmFsIGNsYXNzIGphdmEubGFuZy5GbG9hdCBleHRlbmRzIGphdmEubGFuZy5OdW1iZXIgaW1wbGVtZW50cyBqYXZhLmxhbmcuQ29tcGFyYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGZsb2F0IE1BWF9WQUxVRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGZsb2F0IE1JTl9WQUxVRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGZsb2F0IE5FR0FUSVZFX0lORklOSVRZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgZmxvYXQgTmFOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgZmxvYXQgUE9TSVRJVkVfSU5GSU5JVFkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0laRQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvQ2xhc3M8TGphdmEvbGFuZy9GbG9hdDs+OyApCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DbGFzcyBUWVBFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotCi1wcml2YXRlIGZpbmFsIGZsb2F0IHZhbHVlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1kb3VibGUpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWZsb2F0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvTnVtYmVyRm9ybWF0RXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGludCBjb21wYXJlKAotZmxvYXQKLWZsb2F0KQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgZmxvYXRUb0ludEJpdHMoCi1mbG9hdCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGZsb2F0VG9SYXdJbnRCaXRzKAotZmxvYXQpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGZsb2F0IGludEJpdHNUb0Zsb2F0KAotaW50KQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNJbmZpbml0ZSgKLWZsb2F0KQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNOYU4oCi1mbG9hdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL051bWJlckZvcm1hdEV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBmbG9hdCBwYXJzZUZsb2F0KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIHRvSGV4U3RyaW5nKAotZmxvYXQpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygKLWZsb2F0KQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5GbG9hdCB2YWx1ZU9mKAotZmxvYXQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9OdW1iZXJGb3JtYXRFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLkZsb2F0IHZhbHVlT2YoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYnl0ZSBieXRlVmFsdWUoKQotCi1wdWJsaWMgaW50IGNvbXBhcmVUbygKLWphdmEubGFuZy5GbG9hdCkKLQotcHVibGljIHZvbGF0aWxlIGludCBjb21wYXJlVG8oCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgZG91YmxlIGRvdWJsZVZhbHVlKCkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGZsb2F0IGZsb2F0VmFsdWUoKQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLQotcHVibGljIGludCBpbnRWYWx1ZSgpCi0KLXB1YmxpYyBib29sZWFuIGlzSW5maW5pdGUoKQotCi1wdWJsaWMgYm9vbGVhbiBpc05hTigpCi0KLXB1YmxpYyBsb25nIGxvbmdWYWx1ZSgpCi0KLXB1YmxpYyBzaG9ydCBzaG9ydFZhbHVlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEubGFuZy5JbGxlZ2FsQWNjZXNzRXJyb3IgZXh0ZW5kcyBqYXZhLmxhbmcuSW5jb21wYXRpYmxlQ2xhc3NDaGFuZ2VFcnJvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEubGFuZy5JbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLkV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEubGFuZy5JbGxlZ2FsTW9uaXRvclN0YXRlRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLmxhbmcuSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlRocm93YWJsZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlRocm93YWJsZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLmxhbmcuSWxsZWdhbFRocmVhZFN0YXRlRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvbGFuZy9PYmplY3Q7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGphdmEvbGFuZy9UaHJlYWRMb2NhbCRWYWx1ZXM7ICkKLXB1YmxpYyBjbGFzcyBqYXZhLmxhbmcuVGhyZWFkTG9jYWwgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyIGhhc2hDb3VudGVyCi0KLXByaXZhdGUgZmluYWwgaW50IGhhc2gKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL3JlZi9SZWZlcmVuY2U8TGphdmEvbGFuZy9UaHJlYWRMb2NhbDxUVDs+Oz47ICkKLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2UgcmVmZXJlbmNlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1zdGF0aWMgaW50IGFjY2VzcyQyMDAoCi1qYXZhLmxhbmcuVGhyZWFkTG9jYWwpCi0KLXN0YXRpYyBqYXZhLmxhbmcucmVmLlJlZmVyZW5jZSBhY2Nlc3MkMzAwKAotamF2YS5sYW5nLlRocmVhZExvY2FsKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVFQ7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldCgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClUVDsgKQotcHJvdGVjdGVkIGphdmEubGFuZy5PYmplY3QgaW5pdGlhbFZhbHVlKCkKLQotIGphdmEubGFuZy5UaHJlYWRMb2NhbCRWYWx1ZXMgaW5pdGlhbGl6ZVZhbHVlcygKLWphdmEubGFuZy5UaHJlYWQpCi0KLXB1YmxpYyB2b2lkIHJlbW92ZSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRUOylWICkKLXB1YmxpYyB2b2lkIHNldCgKLWphdmEubGFuZy5PYmplY3QpCi0KLSBqYXZhLmxhbmcuVGhyZWFkTG9jYWwkVmFsdWVzIHZhbHVlcygKLWphdmEubGFuZy5UaHJlYWQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS9sYW5nL1RocmVhZExvY2FsPFRUOz47ICkKLXB1YmxpYyBjbGFzcyBqYXZhLmxhbmcuSW5oZXJpdGFibGVUaHJlYWRMb2NhbCBleHRlbmRzIGphdmEubGFuZy5UaHJlYWRMb2NhbAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRUOylUVDsgKQotcHJvdGVjdGVkIGphdmEubGFuZy5PYmplY3QgY2hpbGRWYWx1ZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLSBqYXZhLmxhbmcuVGhyZWFkTG9jYWwkVmFsdWVzIGluaXRpYWxpemVWYWx1ZXMoCi1qYXZhLmxhbmcuVGhyZWFkKQotCi0gamF2YS5sYW5nLlRocmVhZExvY2FsJFZhbHVlcyB2YWx1ZXMoCi1qYXZhLmxhbmcuVGhyZWFkKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEubGFuZy5JbnN0YW50aWF0aW9uRXJyb3IgZXh0ZW5kcyBqYXZhLmxhbmcuSW5jb21wYXRpYmxlQ2xhc3NDaGFuZ2VFcnJvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL0NsYXNzPCo+OylWICkKLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5DbGFzcykKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLmxhbmcuSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5FeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9DbGFzczwqPjspViApCi0gdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuQ2xhc3MpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPXZhbHVlT2ZDYWNoZSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS9sYW5nL0ludGVnZXI7ICkKLSBjbGFzcyBqYXZhLmxhbmcuSW50ZWdlciR2YWx1ZU9mQ2FjaGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuSW50ZWdlcltdIENBQ0hFCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi0gdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL051bWJlcjtMamF2YS9sYW5nL0NvbXBhcmFibGU8TGphdmEvbGFuZy9JbnRlZ2VyOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGphdmEvbGFuZy9JbnRlZ2VyJHZhbHVlT2ZDYWNoZTsgKQotcHVibGljIGZpbmFsIGNsYXNzIGphdmEubGFuZy5JbnRlZ2VyIGV4dGVuZHMgamF2YS5sYW5nLk51bWJlciBpbXBsZW1lbnRzIGphdmEubGFuZy5Db21wYXJhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9WQUxVRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSU5fVkFMVUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0laRQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvQ2xhc3M8TGphdmEvbGFuZy9JbnRlZ2VyOz47ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkNsYXNzIFRZUEUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0KLXByaXZhdGUgZmluYWwgaW50IHZhbHVlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9OdW1iZXJGb3JtYXRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgaW50IGJpdENvdW50KAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvTnVtYmVyRm9ybWF0RXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5JbnRlZ2VyIGRlY29kZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLkludGVnZXIgZ2V0SW50ZWdlcigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLkludGVnZXIgZ2V0SW50ZWdlcigKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuSW50ZWdlciBnZXRJbnRlZ2VyKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLkludGVnZXIpCi0KLXB1YmxpYyBzdGF0aWMgaW50IGhpZ2hlc3RPbmVCaXQoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgaW50IGxvd2VzdE9uZUJpdCgKLWludCkKLQotcHVibGljIHN0YXRpYyBpbnQgbnVtYmVyT2ZMZWFkaW5nWmVyb3MoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgaW50IG51bWJlck9mVHJhaWxpbmdaZXJvcygKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL051bWJlckZvcm1hdEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSBzdGF0aWMgaW50IHBhcnNlKAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9OdW1iZXJGb3JtYXRFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgaW50IHBhcnNlSW50KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL051bWJlckZvcm1hdEV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBpbnQgcGFyc2VJbnQoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgaW50IHJldmVyc2UoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgaW50IHJldmVyc2VCeXRlcygKLWludCkKLQotcHVibGljIHN0YXRpYyBpbnQgcm90YXRlTGVmdCgKLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIGludCByb3RhdGVSaWdodCgKLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIGludCBzaWdudW0oCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyB0b0JpbmFyeVN0cmluZygKLWludCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIHRvSGV4U3RyaW5nKAotaW50KQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgdG9PY3RhbFN0cmluZygKLWludCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKAotaW50KQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoCi1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuSW50ZWdlciB2YWx1ZU9mKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvTnVtYmVyRm9ybWF0RXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5JbnRlZ2VyIHZhbHVlT2YoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvTnVtYmVyRm9ybWF0RXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5JbnRlZ2VyIHZhbHVlT2YoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyBieXRlIGJ5dGVWYWx1ZSgpCi0KLXB1YmxpYyBpbnQgY29tcGFyZVRvKAotamF2YS5sYW5nLkludGVnZXIpCi0KLXB1YmxpYyB2b2xhdGlsZSBpbnQgY29tcGFyZVRvKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGRvdWJsZSBkb3VibGVWYWx1ZSgpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBmbG9hdCBmbG9hdFZhbHVlKCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLXB1YmxpYyBpbnQgaW50VmFsdWUoKQotCi1wdWJsaWMgbG9uZyBsb25nVmFsdWUoKQotCi1wdWJsaWMgc2hvcnQgc2hvcnRWYWx1ZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLmxhbmcuSW50ZXJuYWxFcnJvciBleHRlbmRzIGphdmEubGFuZy5WaXJ0dWFsTWFjaGluZUVycm9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5sYW5nLkludGVycnVwdGVkRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLkV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvbGFuZy9PYmplY3Q7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgamF2YS5sYW5nLkl0ZXJhYmxlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0l0ZXJhdG9yPFRUOz47ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnV0aWwuSXRlcmF0b3IgaXRlcmF0b3IoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5rZXJuZWwudm0uTGFuZ0FjY2VzcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255Lmtlcm5lbC52bS5MYW5nQWNjZXNzIHRoZUluc3RhbmNlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS5rZXJuZWwudm0uTGFuZ0FjY2VzcyBnZXRJbnN0YW5jZSgpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJbnN0YW5jZSgKLW9yZy5hcGFjaGUuaGFybW9ueS5rZXJuZWwudm0uTGFuZ0FjY2VzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+KExqYXZhL2xhbmcvQ2xhc3M8VFQ7PjspW1RUOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLk9iamVjdFtdIGdldEVudW1WYWx1ZXNJbk9yZGVyKAotamF2YS5sYW5nLkNsYXNzKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBwYXJrRm9yKAotbG9uZykKLQotcHVibGljIGFic3RyYWN0IHZvaWQgcGFya1VudGlsKAotbG9uZykKLQotcHVibGljIGFic3RyYWN0IHZvaWQgdW5wYXJrKAotamF2YS5sYW5nLlRocmVhZCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLWZpbmFsIGNsYXNzIGphdmEubGFuZy5MYW5nQWNjZXNzSW1wbCBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS5rZXJuZWwudm0uTGFuZ0FjY2VzcwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgamF2YS5sYW5nLkxhbmdBY2Nlc3NJbXBsIFRIRV9PTkUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz4oTGphdmEvbGFuZy9DbGFzczxUVDs+OylbVFQ7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0W10gZ2V0RW51bVZhbHVlc0luT3JkZXIoCi1qYXZhLmxhbmcuQ2xhc3MpCi0KLXB1YmxpYyB2b2lkIHBhcmtGb3IoCi1sb25nKQotCi1wdWJsaWMgdm9pZCBwYXJrVW50aWwoCi1sb25nKQotCi1wdWJsaWMgdm9pZCB1bnBhcmsoCi1qYXZhLmxhbmcuVGhyZWFkKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID12YWx1ZU9mQ2FjaGUgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvbGFuZy9Mb25nOyApCi0gY2xhc3MgamF2YS5sYW5nLkxvbmckdmFsdWVPZkNhY2hlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgamF2YS5sYW5nLkxvbmdbXSBDQUNIRQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9OdW1iZXI7TGphdmEvbGFuZy9Db21wYXJhYmxlPExqYXZhL2xhbmcvTG9uZzs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxqYXZhL2xhbmcvTG9uZyR2YWx1ZU9mQ2FjaGU7ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBqYXZhLmxhbmcuTG9uZyBleHRlbmRzIGphdmEubGFuZy5OdW1iZXIgaW1wbGVtZW50cyBqYXZhLmxhbmcuQ29tcGFyYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgTUFYX1ZBTFVFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBNSU5fVkFMVUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0laRQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvQ2xhc3M8TGphdmEvbGFuZy9Mb25nOz47ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkNsYXNzIFRZUEUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0KLXByaXZhdGUgZmluYWwgbG9uZyB2YWx1ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotbG9uZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL051bWJlckZvcm1hdEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBpbnQgYml0Q291bnQoCi1sb25nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvTnVtYmVyRm9ybWF0RXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5Mb25nIGRlY29kZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLkxvbmcgZ2V0TG9uZygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLkxvbmcgZ2V0TG9uZygKLWphdmEubGFuZy5TdHJpbmcKLWxvbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLkxvbmcgZ2V0TG9uZygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5Mb25nKQotCi1wdWJsaWMgc3RhdGljIGxvbmcgaGlnaGVzdE9uZUJpdCgKLWxvbmcpCi0KLXB1YmxpYyBzdGF0aWMgbG9uZyBsb3dlc3RPbmVCaXQoCi1sb25nKQotCi1wdWJsaWMgc3RhdGljIGludCBudW1iZXJPZkxlYWRpbmdaZXJvcygKLWxvbmcpCi0KLXB1YmxpYyBzdGF0aWMgaW50IG51bWJlck9mVHJhaWxpbmdaZXJvcygKLWxvbmcpCi0KLXByaXZhdGUgc3RhdGljIGxvbmcgcGFyc2UoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL051bWJlckZvcm1hdEV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBsb25nIHBhcnNlTG9uZygKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9OdW1iZXJGb3JtYXRFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgbG9uZyBwYXJzZUxvbmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgbG9uZyByZXZlcnNlKAotbG9uZykKLQotcHVibGljIHN0YXRpYyBsb25nIHJldmVyc2VCeXRlcygKLWxvbmcpCi0KLXB1YmxpYyBzdGF0aWMgbG9uZyByb3RhdGVMZWZ0KAotbG9uZwotaW50KQotCi1wdWJsaWMgc3RhdGljIGxvbmcgcm90YXRlUmlnaHQoCi1sb25nCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgaW50IHNpZ251bSgKLWxvbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyB0b0JpbmFyeVN0cmluZygKLWxvbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyB0b0hleFN0cmluZygKLWxvbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyB0b09jdGFsU3RyaW5nKAotbG9uZykKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKAotbG9uZykKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKAotbG9uZwotaW50KQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5Mb25nIHZhbHVlT2YoCi1sb25nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvTnVtYmVyRm9ybWF0RXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5Mb25nIHZhbHVlT2YoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvTnVtYmVyRm9ybWF0RXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5Mb25nIHZhbHVlT2YoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyBieXRlIGJ5dGVWYWx1ZSgpCi0KLXB1YmxpYyBpbnQgY29tcGFyZVRvKAotamF2YS5sYW5nLkxvbmcpCi0KLXB1YmxpYyB2b2xhdGlsZSBpbnQgY29tcGFyZVRvKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGRvdWJsZSBkb3VibGVWYWx1ZSgpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBmbG9hdCBmbG9hdFZhbHVlKCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLXB1YmxpYyBpbnQgaW50VmFsdWUoKQotCi1wdWJsaWMgbG9uZyBsb25nVmFsdWUoKQotCi1wdWJsaWMgc2hvcnQgc2hvcnRWYWx1ZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBqYXZhLmxhbmcuTWF0aCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBkb3VibGUgRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGRvdWJsZSBQSQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuUmFuZG9tIHJhbmRvbQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBkb3VibGUgSUVFRXJlbWFpbmRlcigKLWRvdWJsZQotZG91YmxlKQotCi1wdWJsaWMgc3RhdGljIGRvdWJsZSBhYnMoCi1kb3VibGUpCi0KLXB1YmxpYyBzdGF0aWMgZmxvYXQgYWJzKAotZmxvYXQpCi0KLXB1YmxpYyBzdGF0aWMgaW50IGFicygKLWludCkKLQotcHVibGljIHN0YXRpYyBsb25nIGFicygKLWxvbmcpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGRvdWJsZSBhY29zKAotZG91YmxlKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBkb3VibGUgYXNpbigKLWRvdWJsZSkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIGF0YW4oCi1kb3VibGUpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGRvdWJsZSBhdGFuMigKLWRvdWJsZQotZG91YmxlKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBkb3VibGUgY2JydCgKLWRvdWJsZSkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIGNlaWwoCi1kb3VibGUpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGRvdWJsZSBjb3MoCi1kb3VibGUpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGRvdWJsZSBjb3NoKAotZG91YmxlKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBkb3VibGUgZXhwKAotZG91YmxlKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBkb3VibGUgZXhwbTEoCi1kb3VibGUpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGRvdWJsZSBmbG9vcigKLWRvdWJsZSkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIGh5cG90KAotZG91YmxlCi1kb3VibGUpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGRvdWJsZSBsb2coCi1kb3VibGUpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGRvdWJsZSBsb2cxMCgKLWRvdWJsZSkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIGxvZzFwKAotZG91YmxlKQotCi1wdWJsaWMgc3RhdGljIGRvdWJsZSBtYXgoCi1kb3VibGUKLWRvdWJsZSkKLQotcHVibGljIHN0YXRpYyBmbG9hdCBtYXgoCi1mbG9hdAotZmxvYXQpCi0KLXB1YmxpYyBzdGF0aWMgaW50IG1heCgKLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIGxvbmcgbWF4KAotbG9uZwotbG9uZykKLQotcHVibGljIHN0YXRpYyBkb3VibGUgbWluKAotZG91YmxlCi1kb3VibGUpCi0KLXB1YmxpYyBzdGF0aWMgZmxvYXQgbWluKAotZmxvYXQKLWZsb2F0KQotCi1wdWJsaWMgc3RhdGljIGludCBtaW4oCi1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBsb25nIG1pbigKLWxvbmcKLWxvbmcpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBkb3VibGUgbmV4dGFmdGVyKAotZG91YmxlCi1kb3VibGUpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBmbG9hdCBuZXh0YWZ0ZXJmKAotZmxvYXQKLWZsb2F0KQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBkb3VibGUgcG93KAotZG91YmxlCi1kb3VibGUpCi0KLXB1YmxpYyBzdGF0aWMgZG91YmxlIHJhbmRvbSgpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGRvdWJsZSByaW50KAotZG91YmxlKQotCi1wdWJsaWMgc3RhdGljIGludCByb3VuZCgKLWZsb2F0KQotCi1wdWJsaWMgc3RhdGljIGxvbmcgcm91bmQoCi1kb3VibGUpCi0KLXB1YmxpYyBzdGF0aWMgZG91YmxlIHNpZ251bSgKLWRvdWJsZSkKLQotcHVibGljIHN0YXRpYyBmbG9hdCBzaWdudW0oCi1mbG9hdCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIHNpbigKLWRvdWJsZSkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIHNpbmgoCi1kb3VibGUpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGRvdWJsZSBzcXJ0KAotZG91YmxlKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBkb3VibGUgdGFuKAotZG91YmxlKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBkb3VibGUgdGFuaCgKLWRvdWJsZSkKLQotcHVibGljIHN0YXRpYyBkb3VibGUgdG9EZWdyZWVzKAotZG91YmxlKQotCi1wdWJsaWMgc3RhdGljIGRvdWJsZSB0b1JhZGlhbnMoCi1kb3VibGUpCi0KLXB1YmxpYyBzdGF0aWMgZG91YmxlIHVscCgKLWRvdWJsZSkKLQotcHVibGljIHN0YXRpYyBmbG9hdCB1bHAoCi1mbG9hdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLmxhbmcuTmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEubGFuZy5Ob0NsYXNzRGVmRm91bmRFcnJvciBleHRlbmRzIGphdmEubGFuZy5MaW5rYWdlRXJyb3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLmxhbmcuTm9TdWNoRmllbGRFcnJvciBleHRlbmRzIGphdmEubGFuZy5JbmNvbXBhdGlibGVDbGFzc0NoYW5nZUVycm9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5sYW5nLk5vU3VjaEZpZWxkRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLkV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEubGFuZy5Ob1N1Y2hNZXRob2RFcnJvciBleHRlbmRzIGphdmEubGFuZy5JbmNvbXBhdGlibGVDbGFzc0NoYW5nZUVycm9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5sYW5nLk5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5FeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEubGFuZy5OdW1iZXJGb3JtYXRFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5sYW5nLk91dE9mTWVtb3J5RXJyb3IgZXh0ZW5kcyBqYXZhLmxhbmcuVmlydHVhbE1hY2hpbmVFcnJvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb24gKHZhbHVlID1MamF2YS9sYW5nL2Fubm90YXRpb24vUmV0ZW50aW9uUG9saWN5OyFTT1VSQ0UgKQotQGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldCAodmFsdWUgPUxqYXZhL2xhbmcvYW5ub3RhdGlvbi9FbGVtZW50VHlwZTshTUVUSE9EICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgamF2YS5sYW5nLk92ZXJyaWRlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEubGFuZy5QYWNrYWdlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5yZWZsZWN0LkFubm90YXRlZEVsZW1lbnQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGltcGxUaXRsZQotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgaW1wbFZlbmRvcgotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgaW1wbFZlcnNpb24KLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIG5hbWUKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLm5ldC5VUkwgc2VhbEJhc2UKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIHNwZWNUaXRsZQotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgc3BlY1ZlbmRvcgotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgc3BlY1ZlcnNpb24KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLm5ldC5VUkwpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uW10gZ2V0RGVjbGFyZWRBbm5vdGF0aW9ucygKLWphdmEubGFuZy5QYWNrYWdlCi1ib29sZWFuKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5QYWNrYWdlIGdldFBhY2thZ2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5QYWNrYWdlW10gZ2V0UGFja2FnZXMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOjpMamF2YS9sYW5nL2Fubm90YXRpb24vQW5ub3RhdGlvbjs+KExqYXZhL2xhbmcvQ2xhc3M8VFQ7PjspVFQ7ICkKLXB1YmxpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uIGdldEFubm90YXRpb24oCi1qYXZhLmxhbmcuQ2xhc3MpCi0KLXB1YmxpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uW10gZ2V0QW5ub3RhdGlvbnMoKQotCi1wdWJsaWMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbltdIGdldERlY2xhcmVkQW5ub3RhdGlvbnMoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJbXBsZW1lbnRhdGlvblRpdGxlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SW1wbGVtZW50YXRpb25WZW5kb3IoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJbXBsZW1lbnRhdGlvblZlcnNpb24oKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXROYW1lKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3BlY2lmaWNhdGlvblRpdGxlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3BlY2lmaWNhdGlvblZlbmRvcigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFNwZWNpZmljYXRpb25WZXJzaW9uKCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvQ2xhc3M8K0xqYXZhL2xhbmcvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uOz47KVogKQotcHVibGljIGJvb2xlYW4gaXNBbm5vdGF0aW9uUHJlc2VudCgKLWphdmEubGFuZy5DbGFzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL051bWJlckZvcm1hdEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gaXNDb21wYXRpYmxlV2l0aCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBib29sZWFuIGlzU2VhbGVkKCkKLQotcHVibGljIGJvb2xlYW4gaXNTZWFsZWQoCi1qYXZhLm5ldC5VUkwpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZhLmxhbmcuUHJvY2VzcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBkZXN0cm95KCkKLQotcHVibGljIGFic3RyYWN0IGludCBleGl0VmFsdWUoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5pby5JbnB1dFN0cmVhbSBnZXRFcnJvclN0cmVhbSgpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmlvLklucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEuaW8uT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbnRlcnJ1cHRlZEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCB3YWl0Rm9yKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBqYXZhLmxhbmcuUHJvY2Vzc0J1aWxkZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9MaXN0PExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXByaXZhdGUgamF2YS51dGlsLkxpc3QgY29tbWFuZAotCi1wcml2YXRlIGphdmEuaW8uRmlsZSBkaXJlY3RvcnkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wcml2YXRlIGphdmEudXRpbC5NYXAgZW52aXJvbm1lbnQKLQotcHJpdmF0ZSBib29sZWFuIHJlZGlyZWN0RXJyb3JTdHJlYW0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0xpc3Q8TGphdmEvbGFuZy9TdHJpbmc7PjspViApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuTGlzdCkKLQotcHVibGljIHRyYW5zaWVudCB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmdbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oW0xqYXZhL2xhbmcvU3RyaW5nOylMamF2YS91dGlsL0xpc3Q8TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLkxpc3QgdG9MaXN0KAotamF2YS5sYW5nLlN0cmluZ1tdKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0xpc3Q8TGphdmEvbGFuZy9TdHJpbmc7PjspTGphdmEvbGFuZy9Qcm9jZXNzQnVpbGRlcjsgKQotcHVibGljIGphdmEubGFuZy5Qcm9jZXNzQnVpbGRlciBjb21tYW5kKAotamF2YS51dGlsLkxpc3QpCi0KLXB1YmxpYyB0cmFuc2llbnQgamF2YS5sYW5nLlByb2Nlc3NCdWlsZGVyIGNvbW1hbmQoCi1qYXZhLmxhbmcuU3RyaW5nW10pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0xpc3Q8TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHVibGljIGphdmEudXRpbC5MaXN0IGNvbW1hbmQoKQotCi1wdWJsaWMgamF2YS5pby5GaWxlIGRpcmVjdG9yeSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuUHJvY2Vzc0J1aWxkZXIgZGlyZWN0b3J5KAotamF2YS5pby5GaWxlKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHVibGljIGphdmEudXRpbC5NYXAgZW52aXJvbm1lbnQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlByb2Nlc3NCdWlsZGVyIHJlZGlyZWN0RXJyb3JTdHJlYW0oCi1ib29sZWFuKQotCi1wdWJsaWMgYm9vbGVhbiByZWRpcmVjdEVycm9yU3RyZWFtKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5Qcm9jZXNzIHN0YXJ0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi0gY2xhc3MgamF2YS5sYW5nLlByb2Nlc3NNYW5hZ2VyJDEgZXh0ZW5kcyBqYXZhLmxhbmcuVGhyZWFkCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGphdmEubGFuZy5Qcm9jZXNzTWFuYWdlciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuUHJvY2Vzc01hbmFnZXIKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPVByb2Nlc3NJbXBsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL2xhbmcvUHJvY2Vzc01hbmFnZXI7ICkKLSBjbGFzcyBqYXZhLmxhbmcuUHJvY2Vzc01hbmFnZXIkUHJvY2Vzc0ltcGwgZXh0ZW5kcyBqYXZhLmxhbmcuUHJvY2VzcwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBqYXZhLmlvLklucHV0U3RyZWFtIGVycm9yU3RyZWFtCi0KLSBqYXZhLmxhbmcuSW50ZWdlciBleGl0VmFsdWUKLQotZmluYWwgamF2YS5sYW5nLk9iamVjdCBleGl0VmFsdWVNdXRleAotCi1maW5hbCBpbnQgaWQKLQotZmluYWwgamF2YS5pby5JbnB1dFN0cmVhbSBpbnB1dFN0cmVhbQotCi1maW5hbCBqYXZhLmlvLk91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1pbnQKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IpCi0KLXB1YmxpYyB2b2lkIGRlc3Ryb3koKQotCi1wdWJsaWMgaW50IGV4aXRWYWx1ZSgpCi0KLXB1YmxpYyBqYXZhLmlvLklucHV0U3RyZWFtIGdldEVycm9yU3RyZWFtKCkKLQotcHVibGljIGphdmEuaW8uSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKQotCi1wdWJsaWMgamF2YS5pby5PdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkKLQotIHZvaWQgc2V0RXhpdFZhbHVlKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSW50ZXJydXB0ZWRFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgd2FpdEZvcigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1Qcm9jZXNzSW5wdXRTdHJlYW0gKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvbGFuZy9Qcm9jZXNzTWFuYWdlcjsgKQotIGNsYXNzIGphdmEubGFuZy5Qcm9jZXNzTWFuYWdlciRQcm9jZXNzSW5wdXRTdHJlYW0gZXh0ZW5kcyBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEuaW8uRmlsZURlc2NyaXB0b3IgZmQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5pby5GaWxlRGVzY3JpcHRvcikKLQotIHZvaWQgPGluaXQ+KAotamF2YS5pby5GaWxlRGVzY3JpcHRvcgotamF2YS5sYW5nLlByb2Nlc3NNYW5hZ2VyJDEpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNsb3NlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS9sYW5nL1Byb2Nlc3NNYW5hZ2VyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPVByb2Nlc3NPdXRwdXRTdHJlYW0gKQotIGNsYXNzIGphdmEubGFuZy5Qcm9jZXNzTWFuYWdlciRQcm9jZXNzT3V0cHV0U3RyZWFtIGV4dGVuZHMgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS5pby5GaWxlRGVzY3JpcHRvciBmZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yKQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1qYXZhLmxhbmcuUHJvY2Vzc01hbmFnZXIkMSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY2xvc2UoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvbGFuZy9PYmplY3Q7ICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZhLmxhbmcucmVmLlJlZmVyZW5jZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGphdmEubGFuZy5yZWYuUmVmZXJlbmNlUXVldWUgcXVldWUKLQotIGphdmEubGFuZy5yZWYuUmVmZXJlbmNlIHF1ZXVlTmV4dAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPVRUOyApCi0gamF2YS5sYW5nLk9iamVjdCByZWZlcmVudAotCi1wcml2YXRlIGludCB2bURhdGEKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIGJvb2xlYW4gZW5xdWV1ZUludGVybmFsKCkKLQotcHVibGljIHZvaWQgY2xlYXIoKQotCi1wdWJsaWMgYm9vbGVhbiBlbnF1ZXVlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVRUOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXQoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0VucXVldWVkKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFQ6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL2xhbmcvcmVmL1JlZmVyZW5jZTxUVDs+OyApCi1wdWJsaWMgY2xhc3MgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlIGV4dGVuZHMgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUVDspViApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUVDtMamF2YS9sYW5nL3JlZi9SZWZlcmVuY2VRdWV1ZTwtVFQ7PjspViApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcucmVmLlJlZmVyZW5jZVF1ZXVlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL3JlZi9XZWFrUmVmZXJlbmNlPExqYXZhL2xhbmcvUHJvY2Vzc01hbmFnZXIkUHJvY2Vzc0ltcGw7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPVByb2Nlc3NSZWZlcmVuY2UgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvbGFuZy9Qcm9jZXNzTWFuYWdlcjsgKQotIGNsYXNzIGphdmEubGFuZy5Qcm9jZXNzTWFuYWdlciRQcm9jZXNzUmVmZXJlbmNlIGV4dGVuZHMgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGludCBwcm9jZXNzSWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuUHJvY2Vzc01hbmFnZXIkUHJvY2Vzc0ltcGwKLWphdmEubGFuZy5Qcm9jZXNzTWFuYWdlciRQcm9jZXNzUmVmZXJlbmNlUXVldWUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS9sYW5nL09iamVjdDsgKQotcHVibGljIGNsYXNzIGphdmEubGFuZy5yZWYuUmVmZXJlbmNlUXVldWUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9yZWYvUmVmZXJlbmNlPCtUVDs+OyApCi1wcml2YXRlIGphdmEubGFuZy5yZWYuUmVmZXJlbmNlIGhlYWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL3JlZi9SZWZlcmVuY2U8K1RUOz47KVYgKQotIHZvaWQgZW5xdWV1ZSgKLWphdmEubGFuZy5yZWYuUmVmZXJlbmNlKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvbGFuZy9yZWYvUmVmZXJlbmNlPCtUVDs+OyApCi1wdWJsaWMgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2UgcG9sbCgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS9sYW5nL3JlZi9SZWZlcmVuY2U8K1RUOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0ludGVycnVwdGVkRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2UgcmVtb3ZlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjtMamF2YS9sYW5nL0ludGVycnVwdGVkRXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KEopTGphdmEvbGFuZy9yZWYvUmVmZXJlbmNlPCtUVDs+OyApCi1wdWJsaWMgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2UgcmVtb3ZlKAotbG9uZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9yZWYvUmVmZXJlbmNlUXVldWU8TGphdmEvbGFuZy9Qcm9jZXNzTWFuYWdlciRQcm9jZXNzSW1wbDs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9UHJvY2Vzc1JlZmVyZW5jZVF1ZXVlICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL2xhbmcvUHJvY2Vzc01hbmFnZXI7ICkKLSBjbGFzcyBqYXZhLmxhbmcuUHJvY2Vzc01hbmFnZXIkUHJvY2Vzc1JlZmVyZW5jZVF1ZXVlIGV4dGVuZHMgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2VRdWV1ZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuUHJvY2Vzc01hbmFnZXIkUHJvY2Vzc1JlZmVyZW5jZSBwb2xsKCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5yZWYuUmVmZXJlbmNlIHBvbGwoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGphdmEvbGFuZy9Qcm9jZXNzTWFuYWdlciRQcm9jZXNzT3V0cHV0U3RyZWFtO0xqYXZhL2xhbmcvUHJvY2Vzc01hbmFnZXIkUHJvY2Vzc0lucHV0U3RyZWFtO0xqYXZhL2xhbmcvUHJvY2Vzc01hbmFnZXIkUHJvY2Vzc1JlZmVyZW5jZVF1ZXVlO0xqYXZhL2xhbmcvUHJvY2Vzc01hbmFnZXIkUHJvY2Vzc1JlZmVyZW5jZTtMamF2YS9sYW5nL1Byb2Nlc3NNYW5hZ2VyJFByb2Nlc3NJbXBsOyApCi1maW5hbCBjbGFzcyBqYXZhLmxhbmcuUHJvY2Vzc01hbmFnZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXQUlUX1NUQVRVU19OT19DSElMRFJFTgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0FJVF9TVEFUVVNfU1RSQU5HRV9FUlJOTwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0FJVF9TVEFUVVNfVU5LTk9XTgotCi1zdGF0aWMgZmluYWwgamF2YS5sYW5nLlByb2Nlc3NNYW5hZ2VyIGluc3RhbmNlCi0KLXByaXZhdGUgaW50IGNoaWxkQ291bnQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL01hcDxMamF2YS9sYW5nL0ludGVnZXI7TGphdmEvbGFuZy9Qcm9jZXNzTWFuYWdlciRQcm9jZXNzUmVmZXJlbmNlOz47ICkKLXByaXZhdGUgZmluYWwgamF2YS51dGlsLk1hcCBwcm9jZXNzUmVmZXJlbmNlcwotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5Qcm9jZXNzTWFuYWdlciRQcm9jZXNzUmVmZXJlbmNlUXVldWUgcmVmZXJlbmNlUXVldWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMjAwKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMzAwKAotamF2YS5pby5GaWxlRGVzY3JpcHRvcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgY2xvc2UoCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1zdGF0aWMgbmF0aXZlIGludCBleGVjKAotamF2YS5sYW5nLlN0cmluZ1tdCi1qYXZhLmxhbmcuU3RyaW5nW10KLWphdmEubGFuZy5TdHJpbmcKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IpCi0KLXN0YXRpYyBqYXZhLmxhbmcuUHJvY2Vzc01hbmFnZXIgZ2V0SW5zdGFuY2UoKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBraWxsKAotaW50KQotCi1zdGF0aWMgbmF0aXZlIHZvaWQgc3RhdGljSW5pdGlhbGl6ZSgpCi0KLSB2b2lkIGNsZWFuVXAoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi0gamF2YS5sYW5nLlByb2Nlc3MgZXhlYygKLWphdmEubGFuZy5TdHJpbmdbXQotamF2YS5sYW5nLlN0cmluZ1tdCi1qYXZhLmlvLkZpbGUpCi0KLSB2b2lkIG9uRXhpdCgKLWludAotaW50KQotCi1uYXRpdmUgdm9pZCB3YXRjaENoaWxkcmVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLSBjbGFzcyBqYXZhLmxhbmcuUmVhZGVySW5wdXRTdHJlYW0gZXh0ZW5kcyBqYXZhLmlvLklucHV0U3RyZWFtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYnl0ZVtdIGJ5dGVzCi0KLXByaXZhdGUgaW50IG5leHRCeXRlCi0KLXByaXZhdGUgaW50IG51bUJ5dGVzCi0KLXByaXZhdGUgamF2YS5pby5SZWFkZXIgcmVhZGVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5SZWFkZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCByZWFkQnVmZmVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCByZWFkKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLmxhbmcuUnVudGltZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBmaW5hbGl6ZU9uRXhpdAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuUnVudGltZSBtUnVudGltZQotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmdbXSBtTGliUGF0aHMKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0xpc3Q8TGphdmEvbGFuZy9UaHJlYWQ7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdCBzaHV0ZG93bkhvb2tzCi0KLXByaXZhdGUgYm9vbGVhbiBzaHV0dGluZ0Rvd24KLQotcHJpdmF0ZSBib29sZWFuIHRyYWNpbmdNZXRob2RzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuUnVudGltZSBnZXRSdW50aW1lKCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlRXhpdCgKLWludAotYm9vbGVhbikKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gbmF0aXZlTG9hZCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5DbGFzc0xvYWRlcikKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBydW5GaW5hbGl6YXRpb24oCi1ib29sZWFuKQotQGphdmEubGFuZy5EZXByZWNhdGVkCi1wdWJsaWMgc3RhdGljIHZvaWQgcnVuRmluYWxpemVyc09uRXhpdCgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIGFkZFNodXRkb3duSG9vaygKLWphdmEubGFuZy5UaHJlYWQpCi0KLXB1YmxpYyBpbnQgYXZhaWxhYmxlUHJvY2Vzc29ycygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuUHJvY2VzcyBleGVjKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5Qcm9jZXNzIGV4ZWMoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuUHJvY2VzcyBleGVjKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZ1tdCi1qYXZhLmlvLkZpbGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuUHJvY2VzcyBleGVjKAotamF2YS5sYW5nLlN0cmluZ1tdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLlByb2Nlc3MgZXhlYygKLWphdmEubGFuZy5TdHJpbmdbXQotamF2YS5sYW5nLlN0cmluZ1tdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLlByb2Nlc3MgZXhlYygKLWphdmEubGFuZy5TdHJpbmdbXQotamF2YS5sYW5nLlN0cmluZ1tdCi1qYXZhLmlvLkZpbGUpCi0KLXB1YmxpYyB2b2lkIGV4aXQoCi1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgbG9uZyBmcmVlTWVtb3J5KCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIGdjKCkKLUBqYXZhLmxhbmcuRGVwcmVjYXRlZAotcHVibGljIGphdmEuaW8uSW5wdXRTdHJlYW0gZ2V0TG9jYWxpemVkSW5wdXRTdHJlYW0oCi1qYXZhLmlvLklucHV0U3RyZWFtKQotQGphdmEubGFuZy5EZXByZWNhdGVkCi1wdWJsaWMgamF2YS5pby5PdXRwdXRTdHJlYW0gZ2V0TG9jYWxpemVkT3V0cHV0U3RyZWFtKAotamF2YS5pby5PdXRwdXRTdHJlYW0pCi0KLXB1YmxpYyB2b2lkIGhhbHQoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGxvYWQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi0gdm9pZCBsb2FkKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLkNsYXNzTG9hZGVyKQotCi1wdWJsaWMgdm9pZCBsb2FkTGlicmFyeSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLSB2b2lkIGxvYWRMaWJyYXJ5KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLkNsYXNzTG9hZGVyKQotCi1wdWJsaWMgbmF0aXZlIGxvbmcgbWF4TWVtb3J5KCkKLQotcHVibGljIGJvb2xlYW4gcmVtb3ZlU2h1dGRvd25Ib29rKAotamF2YS5sYW5nLlRocmVhZCkKLQotcHVibGljIHZvaWQgcnVuRmluYWxpemF0aW9uKCkKLQotcHVibGljIG5hdGl2ZSBsb25nIHRvdGFsTWVtb3J5KCkKLQotcHVibGljIHZvaWQgdHJhY2VJbnN0cnVjdGlvbnMoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCB0cmFjZU1ldGhvZENhbGxzKAotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gZXh0ZW5kcyBqYXZhLnNlY3VyaXR5LkJhc2ljUGVybWlzc2lvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgamF2YS5sYW5nLlJ1bnRpbWVQZXJtaXNzaW9uIHBlcm1pc3Npb25Ub0NyZWF0ZUNsYXNzTG9hZGVyCi0KLXN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gcGVybWlzc2lvblRvQ3JlYXRlU2VjdXJpdHlNYW5hZ2VyCi0KLXN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gcGVybWlzc2lvblRvRXhpdFZNCi0KLXN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gcGVybWlzc2lvblRvR2V0Q2xhc3NMb2FkZXIKLQotc3RhdGljIGZpbmFsIGphdmEubGFuZy5SdW50aW1lUGVybWlzc2lvbiBwZXJtaXNzaW9uVG9HZXRQcm90ZWN0aW9uRG9tYWluCi0KLXN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gcGVybWlzc2lvblRvTW9kaWZ5VGhyZWFkCi0KLXN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gcGVybWlzc2lvblRvTW9kaWZ5VGhyZWFkR3JvdXAKLQotc3RhdGljIGZpbmFsIGphdmEubGFuZy5SdW50aW1lUGVybWlzc2lvbiBwZXJtaXNzaW9uVG9RdWV1ZVByaW50Sm9iCi0KLXN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gcGVybWlzc2lvblRvUmVhZEZpbGVEZXNjcmlwdG9yCi0KLXN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gcGVybWlzc2lvblRvU2V0Q29udGV4dENsYXNzTG9hZGVyCi0KLXN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gcGVybWlzc2lvblRvU2V0RmFjdG9yeQotCi1zdGF0aWMgZmluYWwgamF2YS5sYW5nLlJ1bnRpbWVQZXJtaXNzaW9uIHBlcm1pc3Npb25Ub1NldElPCi0KLXN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gcGVybWlzc2lvblRvU2V0U2VjdXJpdHlNYW5hZ2VyCi0KLXN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gcGVybWlzc2lvblRvU3RvcFRocmVhZAotCi1zdGF0aWMgZmluYWwgamF2YS5sYW5nLlJ1bnRpbWVQZXJtaXNzaW9uIHBlcm1pc3Npb25Ub1dyaXRlRmlsZURlc2NyaXB0b3IKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEubGFuZy5TZWN1cml0eUV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQS0dfQUNDX0tFWQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBLR19ERUZfS0VZCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gUkVBRF9XUklURV9BTExfUFJPUEVSVElFU19QRVJNSVNTSU9OCi1AamF2YS5sYW5nLkRlcHJlY2F0ZWQKLXByb3RlY3RlZCBib29sZWFuIGluQ2hlY2sKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2hlY2tQYWNrYWdlUHJvcGVydHkoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBjaGVja0FjY2VwdCgKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIHZvaWQgY2hlY2tBY2Nlc3MoCi1qYXZhLmxhbmcuVGhyZWFkKQotCi1wdWJsaWMgdm9pZCBjaGVja0FjY2VzcygKLWphdmEubGFuZy5UaHJlYWRHcm91cCkKLQotcHVibGljIHZvaWQgY2hlY2tBd3RFdmVudFF1ZXVlQWNjZXNzKCkKLQotcHVibGljIHZvaWQgY2hlY2tDb25uZWN0KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgdm9pZCBjaGVja0Nvbm5lY3QoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2lkIGNoZWNrQ3JlYXRlQ2xhc3NMb2FkZXIoKQotCi1wdWJsaWMgdm9pZCBjaGVja0RlbGV0ZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIGNoZWNrRXhlYygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIGNoZWNrRXhpdCgKLWludCkKLQotcHVibGljIHZvaWQgY2hlY2tMaW5rKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgY2hlY2tMaXN0ZW4oCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvQ2xhc3M8Kj47SSlWICkKLXB1YmxpYyB2b2lkIGNoZWNrTWVtYmVyQWNjZXNzKAotamF2YS5sYW5nLkNsYXNzCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGNoZWNrTXVsdGljYXN0KAotamF2YS5uZXQuSW5ldEFkZHJlc3MpCi1AamF2YS5sYW5nLkRlcHJlY2F0ZWQKLXB1YmxpYyB2b2lkIGNoZWNrTXVsdGljYXN0KAotamF2YS5uZXQuSW5ldEFkZHJlc3MKLWJ5dGUpCi0KLXB1YmxpYyB2b2lkIGNoZWNrUGFja2FnZUFjY2VzcygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIGNoZWNrUGFja2FnZURlZmluaXRpb24oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBjaGVja1Blcm1pc3Npb24oCi1qYXZhLnNlY3VyaXR5LlBlcm1pc3Npb24pCi0KLXB1YmxpYyB2b2lkIGNoZWNrUGVybWlzc2lvbigKLWphdmEuc2VjdXJpdHkuUGVybWlzc2lvbgotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHZvaWQgY2hlY2tQcmludEpvYkFjY2VzcygpCi0KLXB1YmxpYyB2b2lkIGNoZWNrUHJvcGVydGllc0FjY2VzcygpCi0KLXB1YmxpYyB2b2lkIGNoZWNrUHJvcGVydHlBY2Nlc3MoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBjaGVja1JlYWQoCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yKQotCi1wdWJsaWMgdm9pZCBjaGVja1JlYWQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBjaGVja1JlYWQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgdm9pZCBjaGVja1NlY3VyaXR5QWNjZXNzKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgY2hlY2tTZXRGYWN0b3J5KCkKLQotcHVibGljIHZvaWQgY2hlY2tTeXN0ZW1DbGlwYm9hcmRBY2Nlc3MoKQotCi1wdWJsaWMgYm9vbGVhbiBjaGVja1RvcExldmVsV2luZG93KAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHZvaWQgY2hlY2tXcml0ZSgKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IpCi0KLXB1YmxpYyB2b2lkIGNoZWNrV3JpdGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGphdmEubGFuZy5EZXByZWNhdGVkCi1wcm90ZWN0ZWQgaW50IGNsYXNzRGVwdGgoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGphdmEubGFuZy5EZXByZWNhdGVkCi1wcm90ZWN0ZWQgaW50IGNsYXNzTG9hZGVyRGVwdGgoKQotQGphdmEubGFuZy5EZXByZWNhdGVkCi1wcm90ZWN0ZWQgamF2YS5sYW5nLkNsYXNzTG9hZGVyIGN1cnJlbnRDbGFzc0xvYWRlcigpCi1AamF2YS5sYW5nLkRlcHJlY2F0ZWQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL2xhbmcvQ2xhc3M8Kj47ICkKLXByb3RlY3RlZCBqYXZhLmxhbmcuQ2xhc3MgY3VycmVudExvYWRlZENsYXNzKCkKLQotcHJvdGVjdGVkIGphdmEubGFuZy5DbGFzc1tdIGdldENsYXNzQ29udGV4dCgpCi1AamF2YS5sYW5nLkRlcHJlY2F0ZWQKLXB1YmxpYyBib29sZWFuIGdldEluQ2hlY2soKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRTZWN1cml0eUNvbnRleHQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlRocmVhZEdyb3VwIGdldFRocmVhZEdyb3VwKCkKLUBqYXZhLmxhbmcuRGVwcmVjYXRlZAotcHJvdGVjdGVkIGJvb2xlYW4gaW5DbGFzcygKLWphdmEubGFuZy5TdHJpbmcpCi1AamF2YS5sYW5nLkRlcHJlY2F0ZWQKLXByb3RlY3RlZCBib29sZWFuIGluQ2xhc3NMb2FkZXIoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL2xhbmcvU2hvcnQ7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID12YWx1ZU9mQ2FjaGUgKQotIGNsYXNzIGphdmEubGFuZy5TaG9ydCR2YWx1ZU9mQ2FjaGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TaG9ydFtdIENBQ0hFCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi0gdm9pZCA8aW5pdD4oKQotCi1zdGF0aWMgamF2YS5sYW5nLlNob3J0W10gYWNjZXNzJDAwMCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvTnVtYmVyO0xqYXZhL2xhbmcvQ29tcGFyYWJsZTxMamF2YS9sYW5nL1Nob3J0Oz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGphdmEvbGFuZy9TaG9ydCR2YWx1ZU9mQ2FjaGU7ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBqYXZhLmxhbmcuU2hvcnQgZXh0ZW5kcyBqYXZhLmxhbmcuTnVtYmVyIGltcGxlbWVudHMgamF2YS5sYW5nLkNvbXBhcmFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBNQVhfVkFMVUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBNSU5fVkFMVUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0laRQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvQ2xhc3M8TGphdmEvbGFuZy9TaG9ydDs+OyApCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DbGFzcyBUWVBFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotCi1wcml2YXRlIGZpbmFsIHNob3J0IHZhbHVlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvTnVtYmVyRm9ybWF0RXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1zaG9ydCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL051bWJlckZvcm1hdEV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU2hvcnQgZGVjb2RlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL051bWJlckZvcm1hdEV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBzaG9ydCBwYXJzZVNob3J0KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL051bWJlckZvcm1hdEV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBzaG9ydCBwYXJzZVNob3J0KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgc3RhdGljIHNob3J0IHJldmVyc2VCeXRlcygKLXNob3J0KQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoCi1zaG9ydCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL051bWJlckZvcm1hdEV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU2hvcnQgdmFsdWVPZigKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9OdW1iZXJGb3JtYXRFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlNob3J0IHZhbHVlT2YoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlNob3J0IHZhbHVlT2YoCi1zaG9ydCkKLQotcHVibGljIGJ5dGUgYnl0ZVZhbHVlKCkKLQotcHVibGljIHZvbGF0aWxlIGludCBjb21wYXJlVG8oCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50IGNvbXBhcmVUbygKLWphdmEubGFuZy5TaG9ydCkKLQotcHVibGljIGRvdWJsZSBkb3VibGVWYWx1ZSgpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBmbG9hdCBmbG9hdFZhbHVlKCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLXB1YmxpYyBpbnQgaW50VmFsdWUoKQotCi1wdWJsaWMgbG9uZyBsb25nVmFsdWUoKQotCi1wdWJsaWMgc2hvcnQgc2hvcnRWYWx1ZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLmxhbmcuU3RhY2tPdmVyZmxvd0Vycm9yIGV4dGVuZHMgamF2YS5sYW5nLlZpcnR1YWxNYWNoaW5lRXJyb3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBqYXZhLmxhbmcuU3RhY2tUcmFjZUVsZW1lbnQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5BVElWRV9MSU5FX05VTUJFUgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotIGphdmEubGFuZy5TdHJpbmcgZGVjbGFyaW5nQ2xhc3MKLQotIGphdmEubGFuZy5TdHJpbmcgZmlsZU5hbWUKLQotIGludCBsaW5lTnVtYmVyCi0KLSBqYXZhLmxhbmcuU3RyaW5nIG1ldGhvZE5hbWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRDbGFzc05hbWUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRGaWxlTmFtZSgpCi0KLXB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE1ldGhvZE5hbWUoKQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLQotcHVibGljIGJvb2xlYW4gaXNOYXRpdmVNZXRob2QoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgamF2YS5sYW5nLlN0cmljdE1hdGggZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgZG91YmxlIEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBkb3VibGUgUEkKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLlJhbmRvbSByYW5kb20KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIElFRUVyZW1haW5kZXIoCi1kb3VibGUKLWRvdWJsZSkKLQotcHVibGljIHN0YXRpYyBkb3VibGUgYWJzKAotZG91YmxlKQotCi1wdWJsaWMgc3RhdGljIGZsb2F0IGFicygKLWZsb2F0KQotCi1wdWJsaWMgc3RhdGljIGludCBhYnMoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgbG9uZyBhYnMoCi1sb25nKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBkb3VibGUgYWNvcygKLWRvdWJsZSkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIGFzaW4oCi1kb3VibGUpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGRvdWJsZSBhdGFuKAotZG91YmxlKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBkb3VibGUgYXRhbjIoCi1kb3VibGUKLWRvdWJsZSkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIGNicnQoCi1kb3VibGUpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGRvdWJsZSBjZWlsKAotZG91YmxlKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBkb3VibGUgY29zKAotZG91YmxlKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBkb3VibGUgY29zaCgKLWRvdWJsZSkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIGV4cCgKLWRvdWJsZSkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIGV4cG0xKAotZG91YmxlKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBkb3VibGUgZmxvb3IoCi1kb3VibGUpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGRvdWJsZSBoeXBvdCgKLWRvdWJsZQotZG91YmxlKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBkb3VibGUgbG9nKAotZG91YmxlKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBkb3VibGUgbG9nMTAoCi1kb3VibGUpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGRvdWJsZSBsb2cxcCgKLWRvdWJsZSkKLQotcHVibGljIHN0YXRpYyBkb3VibGUgbWF4KAotZG91YmxlCi1kb3VibGUpCi0KLXB1YmxpYyBzdGF0aWMgZmxvYXQgbWF4KAotZmxvYXQKLWZsb2F0KQotCi1wdWJsaWMgc3RhdGljIGludCBtYXgoCi1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBsb25nIG1heCgKLWxvbmcKLWxvbmcpCi0KLXB1YmxpYyBzdGF0aWMgZG91YmxlIG1pbigKLWRvdWJsZQotZG91YmxlKQotCi1wdWJsaWMgc3RhdGljIGZsb2F0IG1pbigKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIHN0YXRpYyBpbnQgbWluKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgbG9uZyBtaW4oCi1sb25nCi1sb25nKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgZG91YmxlIG5leHRhZnRlcigKLWRvdWJsZQotZG91YmxlKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgZmxvYXQgbmV4dGFmdGVyZigKLWZsb2F0Ci1mbG9hdCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIHBvdygKLWRvdWJsZQotZG91YmxlKQotCi1wdWJsaWMgc3RhdGljIGRvdWJsZSByYW5kb20oKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBkb3VibGUgcmludCgKLWRvdWJsZSkKLQotcHVibGljIHN0YXRpYyBpbnQgcm91bmQoCi1mbG9hdCkKLQotcHVibGljIHN0YXRpYyBsb25nIHJvdW5kKAotZG91YmxlKQotCi1wdWJsaWMgc3RhdGljIGRvdWJsZSBzaWdudW0oCi1kb3VibGUpCi0KLXB1YmxpYyBzdGF0aWMgZmxvYXQgc2lnbnVtKAotZmxvYXQpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGRvdWJsZSBzaW4oCi1kb3VibGUpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGRvdWJsZSBzaW5oKAotZG91YmxlKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBkb3VibGUgc3FydCgKLWRvdWJsZSkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIHRhbigKLWRvdWJsZSkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIHRhbmgoCi1kb3VibGUpCi0KLXB1YmxpYyBzdGF0aWMgZG91YmxlIHRvRGVncmVlcygKLWRvdWJsZSkKLQotcHVibGljIHN0YXRpYyBkb3VibGUgdG9SYWRpYW5zKAotZG91YmxlKQotCi1wdWJsaWMgc3RhdGljIGRvdWJsZSB1bHAoCi1kb3VibGUpCi0KLXB1YmxpYyBzdGF0aWMgZmxvYXQgdWxwKAotZmxvYXQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID00MTA0IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvbGFuZy9TdHJpbmc7ICkKLSBjbGFzcyBqYXZhLmxhbmcuU3RyaW5nJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS9sYW5nL1N0cmluZzsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNiBuYW1lID1DYXNlSW5zZW5zaXRpdmVDb21wYXJhdG9yICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS91dGlsL0NvbXBhcmF0b3I8TGphdmEvbGFuZy9TdHJpbmc7PjtMamF2YS9pby9TZXJpYWxpemFibGU7ICkKLWZpbmFsIGNsYXNzIGphdmEubGFuZy5TdHJpbmckQ2FzZUluc2Vuc2l0aXZlQ29tcGFyYXRvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuQ29tcGFyYXRvciwgamF2YS5pby5TZXJpYWxpemFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmckMSkKLQotcHVibGljIHZvbGF0aWxlIGludCBjb21wYXJlKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGludCBjb21wYXJlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS9sYW5nL1N0cmluZzsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPUNvbnNvbGVQcmludFN0cmVhbSApCi0gY2xhc3MgamF2YS5sYW5nLlN0cmluZyRDb25zb2xlUHJpbnRTdHJlYW0gZXh0ZW5kcyBqYXZhLmlvLlByaW50U3RyZWFtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgY2hhcnNldAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5PdXRwdXRTdHJlYW0pCi0KLXB1YmxpYyB2b2lkIHByaW50KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvaW8vU2VyaWFsaXphYmxlO0xqYXZhL2xhbmcvQ29tcGFyYWJsZTxMamF2YS9sYW5nL1N0cmluZzs+O0xqYXZhL2xhbmcvQ2hhclNlcXVlbmNlOyApCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxqYXZhL2xhbmcvU3RyaW5nJDE7TGphdmEvbGFuZy9TdHJpbmckQ2FzZUluc2Vuc2l0aXZlQ29tcGFyYXRvcjtMamF2YS9sYW5nL1N0cmluZyRDb25zb2xlUHJpbnRTdHJlYW07ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBqYXZhLmxhbmcuU3RyaW5nIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlLCBqYXZhLmxhbmcuQ29tcGFyYWJsZSwgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQ29tcGFyYXRvcjxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudXRpbC5Db21wYXJhdG9yIENBU0VfSU5TRU5TSVRJVkVfT1JERVIKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0IERlZmF1bHRDaGFyc2V0Ci0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgUkVQTEFDRU1FTlRfQ0hBUgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gYXNjaWkKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0IGxhc3RDaGFyc2V0Ci0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gdXBwZXJWYWx1ZXMKLQotcHJpdmF0ZSBmaW5hbCBpbnQgY291bnQKLQotcHJpdmF0ZSBpbnQgaGFzaENvZGUKLQotcHJpdmF0ZSBmaW5hbCBpbnQgb2Zmc2V0Ci0KLXByaXZhdGUgZmluYWwgY2hhcltdIHZhbHVlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi0gdm9pZCA8aW5pdD4oCi1pbnQKLWludAotY2hhcltdKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotY2hhcikKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZ0J1ZmZlcikKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWJ5dGVbXSkKLUBqYXZhLmxhbmcuRGVwcmVjYXRlZAotcHVibGljIHZvaWQgPGluaXQ+KAotYnl0ZVtdCi1pbnQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWJ5dGVbXQotaW50Ci1pbnQpCi1AamF2YS5sYW5nLkRlcHJlY2F0ZWQKLXB1YmxpYyB2b2lkIDxpbml0PigKLWJ5dGVbXQotaW50Ci1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ieXRlW10KLWludAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL1Vuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWJ5dGVbXQotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgPGluaXQ+KAotY2hhcltdKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1jaGFyW10KLWludAotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnRbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBjb3B5VmFsdWVPZigKLWNoYXJbXSkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGNvcHlWYWx1ZU9mKAotY2hhcltdCi1pbnQKLWludCkKLQotcHJpdmF0ZSBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQgZGVmYXVsdENoYXJzZXQoKQotCi1wdWJsaWMgc3RhdGljIHRyYW5zaWVudCBqYXZhLmxhbmcuU3RyaW5nIGZvcm1hdCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3RbXSkKLQotcHVibGljIHN0YXRpYyB0cmFuc2llbnQgamF2YS5sYW5nLlN0cmluZyBmb3JtYXQoCi1qYXZhLnV0aWwuTG9jYWxlCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0W10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQgZ2V0Q2hhcnNldCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgc3RhdGljIGludCBpbmRleE9mKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQKLWNoYXIpCi0KLXByaXZhdGUgaW50IHVwcGVySW5kZXgoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyB2YWx1ZU9mKAotY2hhcikKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIHZhbHVlT2YoCi1kb3VibGUpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyB2YWx1ZU9mKAotZmxvYXQpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyB2YWx1ZU9mKAotaW50KQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgdmFsdWVPZigKLWxvbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyB2YWx1ZU9mKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIHZhbHVlT2YoCi1ib29sZWFuKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgdmFsdWVPZigKLWNoYXJbXSkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIHZhbHVlT2YoCi1jaGFyW10KLWludAotaW50KQotCi0gdm9pZCBfZ2V0Q2hhcnMoCi1pbnQKLWludAotY2hhcltdCi1pbnQpCi0KLXB1YmxpYyBjaGFyIGNoYXJBdCgKLWludCkKLQotcHVibGljIGludCBjb2RlUG9pbnRBdCgKLWludCkKLQotcHVibGljIGludCBjb2RlUG9pbnRCZWZvcmUoCi1pbnQpCi0KLXB1YmxpYyBpbnQgY29kZVBvaW50Q291bnQoCi1pbnQKLWludCkKLQotcHVibGljIHZvbGF0aWxlIGludCBjb21wYXJlVG8oCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50IGNvbXBhcmVUbygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBpbnQgY29tcGFyZVRvSWdub3JlQ2FzZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGNvbmNhdCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotcHVibGljIGJvb2xlYW4gY29udGVudEVxdWFscygKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi0KLXB1YmxpYyBib29sZWFuIGNvbnRlbnRFcXVhbHMoCi1qYXZhLmxhbmcuU3RyaW5nQnVmZmVyKQotCi1wdWJsaWMgYm9vbGVhbiBlbmRzV2l0aCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFsc0lnbm9yZUNhc2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGphdmEubGFuZy5EZXByZWNhdGVkCi1wdWJsaWMgdm9pZCBnZXRCeXRlcygKLWludAotaW50Ci1ieXRlW10KLWludCkKLQotcHVibGljIGJ5dGVbXSBnZXRCeXRlcygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsgKQotcHVibGljIGJ5dGVbXSBnZXRCeXRlcygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIGdldENoYXJzKAotaW50Ci1pbnQKLWNoYXJbXQotaW50KQotCi0gY2hhcltdIGdldFZhbHVlKCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLXB1YmxpYyBpbnQgaW5kZXhPZigKLWludCkKLQotcHVibGljIGludCBpbmRleE9mKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBpbnQgaW5kZXhPZigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBpbnQgaW5kZXhPZigKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIG5hdGl2ZSBqYXZhLmxhbmcuU3RyaW5nIGludGVybigpCi0KLXB1YmxpYyBpbnQgbGFzdEluZGV4T2YoCi1pbnQpCi0KLXB1YmxpYyBpbnQgbGFzdEluZGV4T2YoCi1pbnQKLWludCkKLQotcHVibGljIGludCBsYXN0SW5kZXhPZigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBpbnQgbGFzdEluZGV4T2YoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyBpbnQgbGVuZ3RoKCkKLQotcHVibGljIGJvb2xlYW4gbWF0Y2hlcygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBpbnQgb2Zmc2V0QnlDb2RlUG9pbnRzKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBib29sZWFuIHJlZ2lvbk1hdGNoZXMoCi1pbnQKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiByZWdpb25NYXRjaGVzKAotYm9vbGVhbgotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgcmVwbGFjZSgKLWNoYXIKLWNoYXIpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHJlcGxhY2UoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyByZXBsYWNlQWxsKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgcmVwbGFjZUZpcnN0KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBzcGxpdCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gc3BsaXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIHN0YXJ0c1dpdGgoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYm9vbGVhbiBzdGFydHNXaXRoKAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBzdWJTZXF1ZW5jZSgKLWludAotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBzdWJzdHJpbmcoCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHN1YnN0cmluZygKLWludAotaW50KQotCi1wdWJsaWMgY2hhcltdIHRvQ2hhckFycmF5KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9Mb3dlckNhc2UoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b0xvd2VyQ2FzZSgKLWphdmEudXRpbC5Mb2NhbGUpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9VcHBlckNhc2UoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1VwcGVyQ2FzZSgKLWphdmEudXRpbC5Mb2NhbGUpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRyaW0oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgZXh0ZW5kcyBqYXZhLmxhbmcuQWJzdHJhY3RTdHJpbmdCdWlsZGVyIGltcGxlbWVudHMgamF2YS5sYW5nLkFwcGVuZGFibGUsIGphdmEuaW8uU2VyaWFsaXphYmxlLCBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEuaW8uT2JqZWN0U3RyZWFtRmllbGRbXSBzZXJpYWxQZXJzaXN0ZW50RmllbGRzCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL2xhbmcvQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoCi1qYXZhLmlvLk9iamVjdElucHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoCi1qYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5BcHBlbmRhYmxlIGFwcGVuZCgKLWNoYXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuQXBwZW5kYWJsZSBhcHBlbmQoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLkFwcGVuZGFibGUgYXBwZW5kKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotaW50Ci1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIGFwcGVuZCgKLWNoYXIpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIGFwcGVuZCgKLWRvdWJsZSkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgYXBwZW5kKAotZmxvYXQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIGFwcGVuZCgKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgYXBwZW5kKAotbG9uZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgYXBwZW5kKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgYXBwZW5kKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotaW50Ci1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIGFwcGVuZCgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIGFwcGVuZCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIGFwcGVuZCgKLWphdmEubGFuZy5TdHJpbmdCdWZmZXIpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIGFwcGVuZCgKLWJvb2xlYW4pCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIGFwcGVuZCgKLWNoYXJbXSkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgYXBwZW5kKAotY2hhcltdCi1pbnQKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgYXBwZW5kQ29kZVBvaW50KAotaW50KQotCi1wdWJsaWMgdm9sYXRpbGUgaW50IGNhcGFjaXR5KCkKLQotcHVibGljIGNoYXIgY2hhckF0KAotaW50KQotCi1wdWJsaWMgaW50IGNvZGVQb2ludEF0KAotaW50KQotCi1wdWJsaWMgaW50IGNvZGVQb2ludEJlZm9yZSgKLWludCkKLQotcHVibGljIGludCBjb2RlUG9pbnRDb3VudCgKLWludAotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBkZWxldGUoCi1pbnQKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgZGVsZXRlQ2hhckF0KAotaW50KQotCi1wdWJsaWMgdm9pZCBlbnN1cmVDYXBhY2l0eSgKLWludCkKLQotcHVibGljIHZvaWQgZ2V0Q2hhcnMoCi1pbnQKLWludAotY2hhcltdCi1pbnQpCi0KLXB1YmxpYyB2b2xhdGlsZSBpbnQgaW5kZXhPZigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBpbnQgaW5kZXhPZigKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgaW5zZXJ0KAotaW50Ci1jaGFyKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBpbnNlcnQoCi1pbnQKLWRvdWJsZSkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgaW5zZXJ0KAotaW50Ci1mbG9hdCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgaW5zZXJ0KAotaW50Ci1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIGluc2VydCgKLWludAotbG9uZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgaW5zZXJ0KAotaW50Ci1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBpbnNlcnQoCi1pbnQKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWludAotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBpbnNlcnQoCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIGluc2VydCgKLWludAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgaW5zZXJ0KAotaW50Ci1ib29sZWFuKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBpbnNlcnQoCi1pbnQKLWNoYXJbXSkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgaW5zZXJ0KAotaW50Ci1jaGFyW10KLWludAotaW50KQotCi1wdWJsaWMgdm9sYXRpbGUgaW50IGxhc3RJbmRleE9mKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGludCBsYXN0SW5kZXhPZigKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIHZvbGF0aWxlIGludCBsZW5ndGgoKQotCi1wdWJsaWMgaW50IG9mZnNldEJ5Q29kZVBvaW50cygKLWludAotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciByZXBsYWNlKAotaW50Ci1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHJldmVyc2UoKQotCi1wdWJsaWMgdm9pZCBzZXRDaGFyQXQoCi1pbnQKLWNoYXIpCi0KLXB1YmxpYyB2b2lkIHNldExlbmd0aCgKLWludCkKLQotcHVibGljIGphdmEubGFuZy5DaGFyU2VxdWVuY2Ugc3ViU2VxdWVuY2UoCi1pbnQKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgc3Vic3RyaW5nKAotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBzdWJzdHJpbmcoCi1pbnQKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1wdWJsaWMgdm9pZCB0cmltVG9TaXplKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlciBleHRlbmRzIGphdmEubGFuZy5BYnN0cmFjdFN0cmluZ0J1aWxkZXIgaW1wbGVtZW50cyBqYXZhLmxhbmcuQXBwZW5kYWJsZSwgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSwgamF2YS5pby5TZXJpYWxpemFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL2xhbmcvQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoCi1qYXZhLmlvLk9iamVjdElucHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoCi1qYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5BcHBlbmRhYmxlIGFwcGVuZCgKLWNoYXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuQXBwZW5kYWJsZSBhcHBlbmQoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLkFwcGVuZGFibGUgYXBwZW5kKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotaW50Ci1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlciBhcHBlbmQoCi1jaGFyKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIgYXBwZW5kKAotZG91YmxlKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIgYXBwZW5kKAotZmxvYXQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlciBhcHBlbmQoCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlciBhcHBlbmQoCi1sb25nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIgYXBwZW5kKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmdCdWlsZGVyIGFwcGVuZCgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWludAotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIgYXBwZW5kKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmdCdWlsZGVyIGFwcGVuZCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlciBhcHBlbmQoCi1qYXZhLmxhbmcuU3RyaW5nQnVmZmVyKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIgYXBwZW5kKAotYm9vbGVhbikKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmdCdWlsZGVyIGFwcGVuZCgKLWNoYXJbXSkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmdCdWlsZGVyIGFwcGVuZCgKLWNoYXJbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlciBhcHBlbmRDb2RlUG9pbnQoCi1pbnQpCi0KLXB1YmxpYyB2b2xhdGlsZSBpbnQgY2FwYWNpdHkoKQotCi1wdWJsaWMgdm9sYXRpbGUgY2hhciBjaGFyQXQoCi1pbnQpCi0KLXB1YmxpYyB2b2xhdGlsZSBpbnQgY29kZVBvaW50QXQoCi1pbnQpCi0KLXB1YmxpYyB2b2xhdGlsZSBpbnQgY29kZVBvaW50QmVmb3JlKAotaW50KQotCi1wdWJsaWMgdm9sYXRpbGUgaW50IGNvZGVQb2ludENvdW50KAotaW50Ci1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlciBkZWxldGUoCi1pbnQKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmdCdWlsZGVyIGRlbGV0ZUNoYXJBdCgKLWludCkKLQotcHVibGljIHZvbGF0aWxlIHZvaWQgZW5zdXJlQ2FwYWNpdHkoCi1pbnQpCi0KLXB1YmxpYyB2b2xhdGlsZSB2b2lkIGdldENoYXJzKAotaW50Ci1pbnQKLWNoYXJbXQotaW50KQotCi1wdWJsaWMgdm9sYXRpbGUgaW50IGluZGV4T2YoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9sYXRpbGUgaW50IGluZGV4T2YoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlciBpbnNlcnQoCi1pbnQKLWNoYXIpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlciBpbnNlcnQoCi1pbnQKLWRvdWJsZSkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmdCdWlsZGVyIGluc2VydCgKLWludAotZmxvYXQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlciBpbnNlcnQoCi1pbnQKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmdCdWlsZGVyIGluc2VydCgKLWludAotbG9uZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmdCdWlsZGVyIGluc2VydCgKLWludAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmdCdWlsZGVyIGluc2VydCgKLWludAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotaW50Ci1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlciBpbnNlcnQoCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlciBpbnNlcnQoCi1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlciBpbnNlcnQoCi1pbnQKLWJvb2xlYW4pCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlciBpbnNlcnQoCi1pbnQKLWNoYXJbXSkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmdCdWlsZGVyIGluc2VydCgKLWludAotY2hhcltdCi1pbnQKLWludCkKLQotcHVibGljIHZvbGF0aWxlIGludCBsYXN0SW5kZXhPZigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2xhdGlsZSBpbnQgbGFzdEluZGV4T2YoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyB2b2xhdGlsZSBpbnQgbGVuZ3RoKCkKLQotcHVibGljIHZvbGF0aWxlIGludCBvZmZzZXRCeUNvZGVQb2ludHMoCi1pbnQKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmdCdWlsZGVyIHJlcGxhY2UoCi1pbnQKLWludAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmdCdWlsZGVyIHJldmVyc2UoKQotCi1wdWJsaWMgdm9sYXRpbGUgdm9pZCBzZXRDaGFyQXQoCi1pbnQKLWNoYXIpCi0KLXB1YmxpYyB2b2xhdGlsZSB2b2lkIHNldExlbmd0aCgKLWludCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5DaGFyU2VxdWVuY2Ugc3ViU2VxdWVuY2UoCi1pbnQKLWludCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5TdHJpbmcgc3Vic3RyaW5nKAotaW50KQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLlN0cmluZyBzdWJzdHJpbmcoCi1pbnQKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1wdWJsaWMgdm9sYXRpbGUgdm9pZCB0cmltVG9TaXplKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLmxhbmcuU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5JbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0ICh2YWx1ZSA9TGphdmEvbGFuZy9hbm5vdGF0aW9uL0VsZW1lbnRUeXBlOyFUWVBFTGphdmEvbGFuZy9hbm5vdGF0aW9uL0VsZW1lbnRUeXBlOyFGSUVMRExqYXZhL2xhbmcvYW5ub3RhdGlvbi9FbGVtZW50VHlwZTshTUVUSE9ETGphdmEvbGFuZy9hbm5vdGF0aW9uL0VsZW1lbnRUeXBlOyFQQVJBTUVURVJMamF2YS9sYW5nL2Fubm90YXRpb24vRWxlbWVudFR5cGU7IUNPTlNUUlVDVE9STGphdmEvbGFuZy9hbm5vdGF0aW9uL0VsZW1lbnRUeXBlOyFMT0NBTF9WQVJJQUJMRSApCi1AamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uICh2YWx1ZSA9TGphdmEvbGFuZy9hbm5vdGF0aW9uL1JldGVudGlvblBvbGljeTshU09VUkNFICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgamF2YS5sYW5nLlN1cHByZXNzV2FybmluZ3MgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nW10gdmFsdWUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIGphdmEubGFuZy5TeXN0ZW0gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5pby5QcmludFN0cmVhbSBlcnIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmlvLklucHV0U3RyZWFtIGluCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5pby5QcmludFN0cmVhbSBvdXQKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciBzZWN1cml0eU1hbmFnZXIKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLlByb3BlcnRpZXMgc3lzdGVtUHJvcGVydGllcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgYXJyYXljb3B5KAotamF2YS5sYW5nLk9iamVjdAotaW50Ci1qYXZhLmxhbmcuT2JqZWN0Ci1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGNsZWFyUHJvcGVydHkoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBsb25nIGN1cnJlbnRUaW1lTWlsbGlzKCkKLQotcHVibGljIHN0YXRpYyB2b2lkIGV4aXQoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBnYygpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBqYXZhLmxhbmcuU3RyaW5nIGdldEVudkJ5SW5kZXgoCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBqYXZhLmxhbmcuU3RyaW5nIGdldEVudkJ5TmFtZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlByb3BlcnRpZXMgZ2V0UHJvcGVydGllcygpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRQcm9wZXJ0eSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRQcm9wZXJ0eSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciBnZXRTZWN1cml0eU1hbmFnZXIoKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0ZW52KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLk1hcCBnZXRlbnYoKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgaWRlbnRpdHlIYXNoQ29kZSgKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgamF2YS5uaW8uY2hhbm5lbHMuQ2hhbm5lbCBpbmhlcml0ZWRDaGFubmVsKCkKLQotc3RhdGljIGphdmEudXRpbC5Qcm9wZXJ0aWVzIGludGVybmFsR2V0UHJvcGVydGllcygpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBsb2FkKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyB2b2lkIGxvYWRMaWJyYXJ5KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgamF2YS5sYW5nLlN0cmluZyBtYXBMaWJyYXJ5TmFtZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGxvbmcgbmFub1RpbWUoKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgcnVuRmluYWxpemF0aW9uKCkKLUBqYXZhLmxhbmcuRGVwcmVjYXRlZAotcHVibGljIHN0YXRpYyB2b2lkIHJ1bkZpbmFsaXplcnNPbkV4aXQoCi1ib29sZWFuKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgc2V0RXJyKAotamF2YS5pby5QcmludFN0cmVhbSkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgc2V0RmllbGRJbXBsKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHN0YXRpYyB2b2lkIHNldEluKAotamF2YS5pby5JbnB1dFN0cmVhbSkKLQotcHVibGljIHN0YXRpYyB2b2lkIHNldE91dCgKLWphdmEuaW8uUHJpbnRTdHJlYW0pCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQcm9wZXJ0aWVzKAotamF2YS51dGlsLlByb3BlcnRpZXMpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBzZXRQcm9wZXJ0eSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTZWN1cml0eU1hbmFnZXIoCi1qYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGphdmEvdXRpbC9NYXAkRW50cnk7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08SzpMamF2YS9sYW5nL09iamVjdDtWOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS9sYW5nL09iamVjdDsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZhLnV0aWwuTWFwIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGNsZWFyKCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gY29udGFpbnNLZXkoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBjb250YWluc1ZhbHVlKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvU2V0PExqYXZhL3V0aWwvTWFwJEVudHJ5PFRLO1RWOz47PjsgKQotcHVibGljIGFic3RyYWN0IGphdmEudXRpbC5TZXQgZW50cnlTZXQoKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL09iamVjdDspVFY7ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuT2JqZWN0IGdldCgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgaGFzaENvZGUoKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0VtcHR5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvU2V0PFRLOz47ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnV0aWwuU2V0IGtleVNldCgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRLO1RWOylUVjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5PYmplY3QgcHV0KAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9NYXA8K1RLOytUVjs+OylWICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHB1dEFsbCgKLWphdmEudXRpbC5NYXApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvT2JqZWN0OylUVjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5PYmplY3QgcmVtb3ZlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGFic3RyYWN0IGludCBzaXplKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvQ29sbGVjdGlvbjxUVjs+OyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLkNvbGxlY3Rpb24gdmFsdWVzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLSBjbGFzcyBqYXZhLmxhbmcuU3lzdGVtRW52aXJvbm1lbnQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLk1hcAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXByaXZhdGUgamF2YS51dGlsLk1hcCBtYXAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzs+OylWICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEudXRpbC5NYXApCi0KLXB1YmxpYyB2b2lkIGNsZWFyKCkKLQotcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYm9vbGVhbiBjb250YWluc1ZhbHVlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGphdmEudXRpbC5TZXQgZW50cnlTZXQoKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBnZXQoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXQoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvU2V0PExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuU2V0IGtleVNldCgpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IHB1dCgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHB1dCgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2lkIHB1dEFsbCgKLWphdmEudXRpbC5NYXApCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IHJlbW92ZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHJlbW92ZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBpbnQgc2l6ZSgpCi0KLXB1YmxpYyBqYXZhLnV0aWwuQ29sbGVjdGlvbiB2YWx1ZXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08SzpMamF2YS9sYW5nL09iamVjdDtWOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS9sYW5nL09iamVjdDsgKQotcHVibGljIGFic3RyYWN0IGNsYXNzIGphdmEudXRpbC5EaWN0aW9uYXJ5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0VudW1lcmF0aW9uPFRWOz47ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnV0aWwuRW51bWVyYXRpb24gZWxlbWVudHMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL09iamVjdDspVFY7ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuT2JqZWN0IGdldCgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzRW1wdHkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9FbnVtZXJhdGlvbjxUSzs+OyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLkVudW1lcmF0aW9uIGtleXMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUSztUVjspVFY7ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuT2JqZWN0IHB1dCgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvT2JqZWN0OylUVjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5PYmplY3QgcmVtb3ZlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGFic3RyYWN0IGludCBzaXplKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaHRhYmxlJEhhc2hFbnVtZXJhdG9yO0xqYXZhL3V0aWwvSGFzaHRhYmxlJEhhc2hJdGVyYXRvcjtMamF2YS91dGlsL0hhc2h0YWJsZSRFbnRyeTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxLOkxqYXZhL2xhbmcvT2JqZWN0O1Y6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL3V0aWwvRGljdGlvbmFyeTxUSztUVjs+O0xqYXZhL3V0aWwvTWFwPFRLO1RWOz47TGphdmEvbGFuZy9DbG9uZWFibGU7TGphdmEvaW8vU2VyaWFsaXphYmxlOyApCi1wdWJsaWMgY2xhc3MgamF2YS51dGlsLkhhc2h0YWJsZSBleHRlbmRzIGphdmEudXRpbC5EaWN0aW9uYXJ5IGltcGxlbWVudHMgamF2YS51dGlsLk1hcCwgamF2YS5sYW5nLkNsb25lYWJsZSwgamF2YS5pby5TZXJpYWxpemFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0VudW1lcmF0aW9uPCo+OyApCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuRW51bWVyYXRpb24gRU1QVFlfRU5VTUVSQVRJT04KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0KLXRyYW5zaWVudCBpbnQgZWxlbWVudENvdW50Ci1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9W0xqYXZhL3V0aWwvSGFzaHRhYmxlJEVudHJ5PFRLO1RWOz47ICkKLXRyYW5zaWVudCBqYXZhLnV0aWwuSGFzaHRhYmxlJEVudHJ5W10gZWxlbWVudERhdGEKLQotdHJhbnNpZW50IGludCBmaXJzdFNsb3QKLQotdHJhbnNpZW50IGludCBsYXN0U2xvdAotCi1wcml2YXRlIGZsb2F0IGxvYWRGYWN0b3IKLQotdHJhbnNpZW50IGludCBtb2RDb3VudAotCi1wcml2YXRlIGludCB0aHJlc2hvbGQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50Ci1mbG9hdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9NYXA8K1RLOytUVjs+OylWICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEudXRpbC5NYXApCi0KLXByaXZhdGUgdm9pZCBjb21wdXRlTWF4U2l6ZSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KEkpW0xqYXZhL3V0aWwvSGFzaHRhYmxlJEVudHJ5PFRLO1RWOz47ICkKLXByaXZhdGUgamF2YS51dGlsLkhhc2h0YWJsZSRFbnRyeVtdIG5ld0VsZW1lbnRBcnJheSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08SzpMamF2YS9sYW5nL09iamVjdDtWOkxqYXZhL2xhbmcvT2JqZWN0Oz4oVEs7VFY7SSlMamF2YS91dGlsL0hhc2h0YWJsZSRFbnRyeTxUSztUVjs+OyApCi1wcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuSGFzaHRhYmxlJEVudHJ5IG5ld0VudHJ5KAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL2xhbmcvQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoCi1qYXZhLmlvLk9iamVjdElucHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoCi1qYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSkKLQotcHVibGljIHZvaWQgY2xlYXIoKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBjbG9uZSgpCi0KLXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYm9vbGVhbiBjb250YWluc1ZhbHVlKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvRW51bWVyYXRpb248VFY7PjsgKQotcHVibGljIGphdmEudXRpbC5FbnVtZXJhdGlvbiBlbGVtZW50cygpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL1NldDxMamF2YS91dGlsL01hcCRFbnRyeTxUSztUVjs+Oz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuU2V0IGVudHJ5U2V0KCkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9PYmplY3Q7KVRWOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXQoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL09iamVjdDspTGphdmEvdXRpbC9IYXNodGFibGUkRW50cnk8VEs7VFY7PjsgKQotIGphdmEudXRpbC5IYXNodGFibGUkRW50cnkgZ2V0RW50cnkoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLQotcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL1NldDxUSzs+OyApCi1wdWJsaWMgamF2YS51dGlsLlNldCBrZXlTZXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9FbnVtZXJhdGlvbjxUSzs+OyApCi1wdWJsaWMgamF2YS51dGlsLkVudW1lcmF0aW9uIGtleXMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUSztUVjspVFY7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHB1dCgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTWFwPCtUSzsrVFY7PjspViApCi1wdWJsaWMgdm9pZCBwdXRBbGwoCi1qYXZhLnV0aWwuTWFwKQotCi1wcm90ZWN0ZWQgdm9pZCByZWhhc2goKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL09iamVjdDspVFY7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHJlbW92ZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBpbnQgc2l6ZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvQ29sbGVjdGlvbjxUVjs+OyApCi1wdWJsaWMgamF2YS51dGlsLkNvbGxlY3Rpb24gdmFsdWVzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNodGFibGU8TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9PYmplY3Q7PjsgKQotcHVibGljIGNsYXNzIGphdmEudXRpbC5Qcm9wZXJ0aWVzIGV4dGVuZHMgamF2YS51dGlsLkhhc2h0YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09OVElOVUUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElHTk9SRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgS0VZX0RPTkUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PTkUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQUk9QX0RURAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBST1BfRFREX05BTUUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNMQVNICi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVTklDT0RFCi0KLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgbGluZVNlcGFyYXRvcgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSB0cmFuc2llbnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIKLQotcHJvdGVjdGVkIGphdmEudXRpbC5Qcm9wZXJ0aWVzIGRlZmF1bHRzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLlByb3BlcnRpZXMpCi0KLXByaXZhdGUgdm9pZCBkdW1wU3RyaW5nKAotamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4pCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBnZXRUZXh0Q29udGVudCgKLW9yZy53M2MuZG9tLk5vZGUpCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBzdWJzdGl0dXRlUHJlZGVmaW5lZEVudHJpZXMoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRQcm9wZXJ0eSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFByb3BlcnR5KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgbGlzdCgKLWphdmEuaW8uUHJpbnRTdHJlYW0pCi0KLXB1YmxpYyB2b2lkIGxpc3QoCi1qYXZhLmlvLlByaW50V3JpdGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBsb2FkKAotamF2YS5pby5JbnB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS91dGlsL0ludmFsaWRQcm9wZXJ0aWVzRm9ybWF0RXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBsb2FkRnJvbVhNTCgKLWphdmEuaW8uSW5wdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0VudW1lcmF0aW9uPCo+OyApCi1wdWJsaWMgamF2YS51dGlsLkVudW1lcmF0aW9uIHByb3BlcnR5TmFtZXMoKQotQGphdmEubGFuZy5EZXByZWNhdGVkCi1wdWJsaWMgdm9pZCBzYXZlKAotamF2YS5pby5PdXRwdXRTdHJlYW0KLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHNldFByb3BlcnR5KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc3RvcmUoCi1qYXZhLmlvLk91dHB1dFN0cmVhbQotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc3RvcmVUb1hNTCgKLWphdmEuaW8uT3V0cHV0U3RyZWFtCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzdG9yZVRvWE1MKAotamF2YS5pby5PdXRwdXRTdHJlYW0KLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi0gY2xhc3MgamF2YS5sYW5nLlN5c3RlbVByb3BlcnRpZXMgZXh0ZW5kcyBqYXZhLnV0aWwuUHJvcGVydGllcwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLW5hdGl2ZSB2b2lkIHBvc3RJbml0KCkKLQotbmF0aXZlIHZvaWQgcHJlSW5pdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1QYXJrU3RhdGUgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvbGFuZy9UaHJlYWQ7ICkKLSBjbGFzcyBqYXZhLmxhbmcuVGhyZWFkJFBhcmtTdGF0ZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBUktFRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFJFRU1QVElWRUxZX1VOUEFSS0VECi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVTlBBUktFRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL0VudW08TGphdmEvbGFuZy9UaHJlYWQkU3RhdGU7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvbGFuZy9UaHJlYWQ7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTY0MDkgbmFtZSA9U3RhdGUgKQotcHVibGljIGZpbmFsIGNsYXNzIGphdmEubGFuZy5UaHJlYWQkU3RhdGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuVGhyZWFkJFN0YXRlW10gJFZBTFVFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5UaHJlYWQkU3RhdGUgQkxPQ0tFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5UaHJlYWQkU3RhdGUgTkVXCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlRocmVhZCRTdGF0ZSBSVU5OQUJMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5UaHJlYWQkU3RhdGUgVEVSTUlOQVRFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5UaHJlYWQkU3RhdGUgVElNRURfV0FJVElORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5UaHJlYWQkU3RhdGUgV0FJVElORwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVYgKQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuVGhyZWFkJFN0YXRlIHZhbHVlT2YoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5UaHJlYWQkU3RhdGVbXSB2YWx1ZXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1VbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvbGFuZy9UaHJlYWQ7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgamF2YS5sYW5nLlRocmVhZCRVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgdW5jYXVnaHRFeGNlcHRpb24oCi1qYXZhLmxhbmcuVGhyZWFkCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEubGFuZy5UaHJlYWREZWF0aCBleHRlbmRzIGphdmEubGFuZy5FcnJvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9NDEwNCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL2xhbmcvVGhyZWFkR3JvdXA7ICkKLSBjbGFzcyBqYXZhLmxhbmcuVGhyZWFkR3JvdXAkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL2xhbmcvVGhyZWFkR3JvdXA7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MiBuYW1lID1DaGlsZHJlbkdyb3Vwc0xvY2sgKQotIGNsYXNzIGphdmEubGFuZy5UaHJlYWRHcm91cCRDaGlsZHJlbkdyb3Vwc0xvY2sgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGphdmEubGFuZy5UaHJlYWRHcm91cCB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlRocmVhZEdyb3VwKQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuVGhyZWFkR3JvdXAKLWphdmEubGFuZy5UaHJlYWRHcm91cCQxKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MiBuYW1lID1DaGlsZHJlblRocmVhZHNMb2NrICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL2xhbmcvVGhyZWFkR3JvdXA7ICkKLSBjbGFzcyBqYXZhLmxhbmcuVGhyZWFkR3JvdXAkQ2hpbGRyZW5UaHJlYWRzTG9jayBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgamF2YS5sYW5nLlRocmVhZEdyb3VwIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuVGhyZWFkR3JvdXApCi0KLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5UaHJlYWRHcm91cAotamF2YS5sYW5nLlRocmVhZEdyb3VwJDEpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MamF2YS9sYW5nL1RocmVhZEdyb3VwJDE7TGphdmEvbGFuZy9UaHJlYWRHcm91cCRDaGlsZHJlblRocmVhZHNMb2NrO0xqYXZhL2xhbmcvVGhyZWFkR3JvdXAkQ2hpbGRyZW5Hcm91cHNMb2NrOyApCi1wdWJsaWMgY2xhc3MgamF2YS5sYW5nLlRocmVhZEdyb3VwIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5UaHJlYWQkVW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBqYXZhLmxhbmcuVGhyZWFkR3JvdXAgbU1haW4KLQotc3RhdGljIGphdmEubGFuZy5UaHJlYWRHcm91cCBtU3lzdGVtCi0KLXByaXZhdGUgamF2YS5sYW5nLlRocmVhZEdyb3VwW10gY2hpbGRyZW5Hcm91cHMKLQotcHJpdmF0ZSBqYXZhLmxhbmcuT2JqZWN0IGNoaWxkcmVuR3JvdXBzTG9jawotCi1wcml2YXRlIGphdmEubGFuZy5UaHJlYWRbXSBjaGlsZHJlblRocmVhZHMKLQotcHJpdmF0ZSBqYXZhLmxhbmcuT2JqZWN0IGNoaWxkcmVuVGhyZWFkc0xvY2sKLQotcHJpdmF0ZSBib29sZWFuIGlzRGFlbW9uCi0KLXByaXZhdGUgYm9vbGVhbiBpc0Rlc3Ryb3llZAotCi1wcml2YXRlIGludCBtYXhQcmlvcml0eQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbmFtZQotCi0gaW50IG51bUdyb3VwcwotCi0gaW50IG51bVRocmVhZHMKLQotIGphdmEubGFuZy5UaHJlYWRHcm91cCBwYXJlbnQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5UaHJlYWRHcm91cAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxUaHJlYWRTdGF0ZUV4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIGFkZCgKLWphdmEubGFuZy5UaHJlYWRHcm91cCkKLQotcHJpdmF0ZSB2b2lkIGRlc3Ryb3lJZkVtcHR5RGFlbW9uKCkKLQotcHJpdmF0ZSBpbnQgZW51bWVyYXRlR2VuZXJpYygKLWphdmEubGFuZy5PYmplY3RbXQotYm9vbGVhbgotaW50Ci1ib29sZWFuKQotCi1wcml2YXRlIHZvaWQgbGlzdCgKLWludCkKLQotcHJpdmF0ZSB2b2lkIHJlbW92ZSgKLWphdmEubGFuZy5UaHJlYWRHcm91cCkKLQotcHJpdmF0ZSB2b2lkIHNldFBhcmVudCgKLWphdmEubGFuZy5UaHJlYWRHcm91cCkKLUBqYXZhLmxhbmcuRGVwcmVjYXRlZAotcHJpdmF0ZSBmaW5hbCBib29sZWFuIHN0b3BIZWxwZXIoKQotQGphdmEubGFuZy5EZXByZWNhdGVkCi1wcml2YXRlIGZpbmFsIGJvb2xlYW4gc3VzcGVuZEhlbHBlcigpCi0KLXB1YmxpYyBpbnQgYWN0aXZlQ291bnQoKQotCi1wdWJsaWMgaW50IGFjdGl2ZUdyb3VwQ291bnQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbFRocmVhZFN0YXRlRXhjZXB0aW9uOyApCi1maW5hbCB2b2lkIGFkZCgKLWphdmEubGFuZy5UaHJlYWQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsVGhyZWFkU3RhdGVFeGNlcHRpb247ICkKLSB2b2lkIGFkZFRocmVhZCgKLWphdmEubGFuZy5UaHJlYWQpCi1AamF2YS5sYW5nLkRlcHJlY2F0ZWQKLXB1YmxpYyBib29sZWFuIGFsbG93VGhyZWFkU3VzcGVuc2lvbigKLWJvb2xlYW4pCi0KLXB1YmxpYyBmaW5hbCB2b2lkIGNoZWNrQWNjZXNzKCkKLQotcHVibGljIGZpbmFsIHZvaWQgZGVzdHJveSgpCi0KLXB1YmxpYyBpbnQgZW51bWVyYXRlKAotamF2YS5sYW5nLlRocmVhZFtdKQotCi1wdWJsaWMgaW50IGVudW1lcmF0ZSgKLWphdmEubGFuZy5UaHJlYWRbXQotYm9vbGVhbikKLQotcHVibGljIGludCBlbnVtZXJhdGUoCi1qYXZhLmxhbmcuVGhyZWFkR3JvdXBbXSkKLQotcHVibGljIGludCBlbnVtZXJhdGUoCi1qYXZhLmxhbmcuVGhyZWFkR3JvdXBbXQotYm9vbGVhbikKLQotcHVibGljIGZpbmFsIGludCBnZXRNYXhQcmlvcml0eSgpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGdldE5hbWUoKQotCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLlRocmVhZEdyb3VwIGdldFBhcmVudCgpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIGludGVycnVwdCgpCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGlzRGFlbW9uKCkKLQotcHVibGljIGJvb2xlYW4gaXNEZXN0cm95ZWQoKQotCi1wdWJsaWMgdm9pZCBsaXN0KCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gcGFyZW50T2YoCi1qYXZhLmxhbmcuVGhyZWFkR3JvdXApCi0KLWZpbmFsIHZvaWQgcmVtb3ZlKAotamF2YS5sYW5nLlRocmVhZCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxUaHJlYWRTdGF0ZUV4Y2VwdGlvbjsgKQotIHZvaWQgcmVtb3ZlVGhyZWFkKAotamF2YS5sYW5nLlRocmVhZCkKLUBqYXZhLmxhbmcuRGVwcmVjYXRlZAotcHVibGljIGZpbmFsIHZvaWQgcmVzdW1lKCkKLQotcHVibGljIGZpbmFsIHZvaWQgc2V0RGFlbW9uKAotYm9vbGVhbikKLQotcHVibGljIGZpbmFsIHZvaWQgc2V0TWF4UHJpb3JpdHkoCi1pbnQpCi1AamF2YS5sYW5nLkRlcHJlY2F0ZWQKLXB1YmxpYyBmaW5hbCB2b2lkIHN0b3AoKQotQGphdmEubGFuZy5EZXByZWNhdGVkCi1wdWJsaWMgZmluYWwgdm9pZCBzdXNwZW5kKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1wdWJsaWMgdm9pZCB1bmNhdWdodEV4Y2VwdGlvbigKLWphdmEubGFuZy5UaHJlYWQKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPVZhbHVlcyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS9sYW5nL1RocmVhZExvY2FsOyApCi0gY2xhc3MgamF2YS5sYW5nLlRocmVhZExvY2FsJFZhbHVlcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOSVRJQUxfU0laRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuT2JqZWN0IFRPTUJTVE9ORQotCi1wcml2YXRlIGludCBjbGVhbgotCi1wcml2YXRlIGludCBtYXNrCi0KLXByaXZhdGUgaW50IG1heGltdW1Mb2FkCi0KLXByaXZhdGUgaW50IHNpemUKLQotcHJpdmF0ZSBqYXZhLmxhbmcuT2JqZWN0W10gdGFibGUKLQotcHJpdmF0ZSBpbnQgdG9tYnN0b25lcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlRocmVhZExvY2FsJFZhbHVlcykKLQotc3RhdGljIGphdmEubGFuZy5PYmplY3RbXSBhY2Nlc3MkMDAwKAotamF2YS5sYW5nLlRocmVhZExvY2FsJFZhbHVlcykKLQotc3RhdGljIGludCBhY2Nlc3MkMTAwKAotamF2YS5sYW5nLlRocmVhZExvY2FsJFZhbHVlcykKLQotcHJpdmF0ZSB2b2lkIGNsZWFuVXAoKQotCi1wcml2YXRlIHZvaWQgaW5oZXJpdFZhbHVlcygKLWphdmEubGFuZy5UaHJlYWRMb2NhbCRWYWx1ZXMpCi0KLXByaXZhdGUgdm9pZCBpbml0aWFsaXplVGFibGUoCi1pbnQpCi0KLXByaXZhdGUgaW50IG5leHQoCi1pbnQpCi0KLXByaXZhdGUgYm9vbGVhbiByZWhhc2goKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1RocmVhZExvY2FsPCo+O0xqYXZhL2xhbmcvT2JqZWN0OylWICkKLSB2b2lkIGFkZCgKLWphdmEubGFuZy5UaHJlYWRMb2NhbAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9UaHJlYWRMb2NhbDwqPjspTGphdmEvbGFuZy9PYmplY3Q7ICkKLSBqYXZhLmxhbmcuT2JqZWN0IGdldEFmdGVyTWlzcygKLWphdmEubGFuZy5UaHJlYWRMb2NhbCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9UaHJlYWRMb2NhbDwqPjtMamF2YS9sYW5nL09iamVjdDspViApCi0gdm9pZCBwdXQoCi1qYXZhLmxhbmcuVGhyZWFkTG9jYWwKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvVGhyZWFkTG9jYWw8Kj47KVYgKQotIHZvaWQgcmVtb3ZlKAotamF2YS5sYW5nLlRocmVhZExvY2FsKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS91dGlsL0VudW1lcmF0aW9uPExqYXZhL25ldC9VUkw7PjsgKQotIGNsYXNzIGphdmEubGFuZy5Ud29FbnVtZXJhdGlvbnNJbk9uZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuRW51bWVyYXRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0VudW1lcmF0aW9uPExqYXZhL25ldC9VUkw7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuRW51bWVyYXRpb24gZmlyc3QKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0VudW1lcmF0aW9uPExqYXZhL25ldC9VUkw7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuRW51bWVyYXRpb24gc2Vjb25kCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9FbnVtZXJhdGlvbjxMamF2YS9uZXQvVVJMOz47TGphdmEvdXRpbC9FbnVtZXJhdGlvbjxMamF2YS9uZXQvVVJMOz47KVYgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkVudW1lcmF0aW9uCi1qYXZhLnV0aWwuRW51bWVyYXRpb24pCi0KLXB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IG5leHRFbGVtZW50KCkKLQotcHVibGljIGphdmEubmV0LlVSTCBuZXh0RWxlbWVudCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5sYW5nLlR5cGVOb3RQcmVzZW50RXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyB0eXBlTmFtZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHR5cGVOYW1lKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLmxhbmcuVW5rbm93bkVycm9yIGV4dGVuZHMgamF2YS5sYW5nLlZpcnR1YWxNYWNoaW5lRXJyb3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLmxhbmcuVW5zYXRpc2ZpZWRMaW5rRXJyb3IgZXh0ZW5kcyBqYXZhLmxhbmcuTGlua2FnZUVycm9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5sYW5nLlVuc3VwcG9ydGVkQ2xhc3NWZXJzaW9uRXJyb3IgZXh0ZW5kcyBqYXZhLmxhbmcuQ2xhc3NGb3JtYXRFcnJvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEubGFuZy5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS9sYW5nL09iamVjdDtMamF2YS91dGlsL0VudW1lcmF0aW9uPFRUOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL2xhbmcvVk1DbGFzc0xvYWRlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1FbnVtZXJhdGVMaXN0QXJyYXkgKQotIGNsYXNzIGphdmEubGFuZy5WTUNsYXNzTG9hZGVyJEVudW1lcmF0ZUxpc3RBcnJheSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuRW51bWVyYXRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBpbnQgaQotCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5BcnJheUxpc3QgbUxpc3QKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuQXJyYXlMaXN0KQotCi1wdWJsaWMgYm9vbGVhbiBoYXNNb3JlRWxlbWVudHMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVFQ7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IG5leHRFbGVtZW50KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxqYXZhL2xhbmcvVk1DbGFzc0xvYWRlciRFbnVtZXJhdGVMaXN0QXJyYXk7ICkKLSBjbGFzcyBqYXZhLmxhbmcuVk1DbGFzc0xvYWRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvQ2xhc3NGb3JtYXRFcnJvcjsgKQotc3RhdGljIG5hdGl2ZSBqYXZhLmxhbmcuQ2xhc3MgZGVmaW5lQ2xhc3MoCi1qYXZhLmxhbmcuQ2xhc3NMb2FkZXIKLWphdmEubGFuZy5TdHJpbmcKLWJ5dGVbXQotaW50Ci1pbnQKLWphdmEuc2VjdXJpdHkuUHJvdGVjdGlvbkRvbWFpbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0NsYXNzRm9ybWF0RXJyb3I7ICkKLXN0YXRpYyBuYXRpdmUgamF2YS5sYW5nLkNsYXNzIGRlZmluZUNsYXNzKAotamF2YS5sYW5nLkNsYXNzTG9hZGVyCi1ieXRlW10KLWludAotaW50Ci1qYXZhLnNlY3VyaXR5LlByb3RlY3Rpb25Eb21haW4pCi0KLXN0YXRpYyBuYXRpdmUgamF2YS5sYW5nLkNsYXNzIGZpbmRMb2FkZWRDbGFzcygKLWphdmEubGFuZy5DbGFzc0xvYWRlcgotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGphdmEubGFuZy5TdHJpbmcgZ2V0Qm9vdENsYXNzUGF0aFJlc291cmNlKAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IGdldEJvb3RDbGFzc1BhdGhTaXplKCkKLQotc3RhdGljIG5hdGl2ZSBqYXZhLmxhbmcuQ2xhc3MgZ2V0UHJpbWl0aXZlQ2xhc3MoCi1jaGFyKQotCi1zdGF0aWMgamF2YS5uZXQuVVJMIGdldFJlc291cmNlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL3V0aWwvRW51bWVyYXRpb248TGphdmEvbmV0L1VSTDs+OyApCi1zdGF0aWMgamF2YS51dGlsLkVudW1lcmF0aW9uIGdldFJlc291cmNlcygKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uOyApCi1zdGF0aWMgbmF0aXZlIGphdmEubGFuZy5DbGFzcyBsb2FkQ2xhc3MoCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotIGNsYXNzIGphdmEubGFuZy5WTVRocmVhZCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIGphdmEubGFuZy5UaHJlYWQkU3RhdGVbXSBTVEFURV9NQVAKLQotIGphdmEubGFuZy5UaHJlYWQgdGhyZWFkCi0KLSBpbnQgdm1EYXRhCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuVGhyZWFkKQotCi1zdGF0aWMgbmF0aXZlIHZvaWQgY3JlYXRlKAotamF2YS5sYW5nLlRocmVhZAotbG9uZykKLQotc3RhdGljIG5hdGl2ZSBqYXZhLmxhbmcuVGhyZWFkIGN1cnJlbnRUaHJlYWQoKQotCi1zdGF0aWMgbmF0aXZlIGJvb2xlYW4gaW50ZXJydXB0ZWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSW50ZXJydXB0ZWRFeGNlcHRpb247ICkKLXN0YXRpYyBuYXRpdmUgdm9pZCBzbGVlcCgKLWxvbmcKLWludCkKLQotc3RhdGljIG5hdGl2ZSB2b2lkIHlpZWxkKCkKLQotbmF0aXZlIGludCBnZXRTdGF0dXMoKQotCi1uYXRpdmUgYm9vbGVhbiBob2xkc0xvY2soCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1uYXRpdmUgdm9pZCBpbnRlcnJ1cHQoKQotCi1uYXRpdmUgYm9vbGVhbiBpc0ludGVycnVwdGVkKCkKLQotbmF0aXZlIHZvaWQgbmFtZUNoYW5nZWQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi0gdm9pZCByZXN1bWUoKQotCi1uYXRpdmUgdm9pZCBzZXRQcmlvcml0eSgKLWludCkKLQotIHZvaWQgc3RhcnQoCi1sb25nKQotCi0gdm9pZCBzdG9wKAotamF2YS5sYW5nLlRocm93YWJsZSkKLQotIHZvaWQgc3VzcGVuZCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5sYW5nLlZlcmlmeUVycm9yIGV4dGVuZHMgamF2YS5sYW5nLkxpbmthZ2VFcnJvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIGphdmEubGFuZy5Wb2lkIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvQ2xhc3M8TGphdmEvbGFuZy9Wb2lkOz47ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkNsYXNzIFRZUEUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvbGFuZy9DbGFzczxMamF2YS9sYW5nL1ZvaWQ7PjsgKQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLkNsYXNzIGxvb2t1cFR5cGUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotIGNsYXNzIGphdmEubGFuZy5Xcml0ZXJPdXRwdXRTdHJlYW0gZXh0ZW5kcyBqYXZhLmlvLk91dHB1dFN0cmVhbQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGJ5dGVbXSBieXRlcwotCi1wcml2YXRlIGludCBudW1CeXRlcwotCi1wcml2YXRlIGphdmEuaW8uV3JpdGVyIHdyaXRlcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uV3JpdGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgd3JpdGVCdWZmZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBmbHVzaCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHdyaXRlKAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb25Gb3JtYXRFcnJvciBleHRlbmRzIGphdmEubGFuZy5FcnJvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb25UeXBlTWlzbWF0Y2hFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgZWxlbWVudAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZm91bmRUeXBlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIGVsZW1lbnQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBmb3VuZFR5cGUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb24gKHZhbHVlID1MamF2YS9sYW5nL2Fubm90YXRpb24vUmV0ZW50aW9uUG9saWN5OyFSVU5USU1FICkKLUBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQgKHZhbHVlID1MamF2YS9sYW5nL2Fubm90YXRpb24vRWxlbWVudFR5cGU7IUFOTk9UQVRJT05fVFlQRSApCi1AamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZAotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL0VudW08TGphdmEvbGFuZy9hbm5vdGF0aW9uL0VsZW1lbnRUeXBlOz47ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZSBleHRlbmRzIGphdmEubGFuZy5FbnVtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlW10gJFZBTFVFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlIEFOTk9UQVRJT05fVFlQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlIENPTlNUUlVDVE9SCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUgRklFTEQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZSBMT0NBTF9WQVJJQUJMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlIE1FVEhPRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlIFBBQ0tBR0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZSBQQVJBTUVURVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZSBUWVBFCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpViApCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlIHZhbHVlT2YoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlW10gdmFsdWVzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5JbmNvbXBsZXRlQW5ub3RhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvQ2xhc3M8K0xqYXZhL2xhbmcvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uOz47ICkKLXByaXZhdGUgamF2YS5sYW5nLkNsYXNzIGFubm90YXRpb25UeXBlCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBlbGVtZW50TmFtZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvQ2xhc3M8K0xqYXZhL2xhbmcvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uOz47TGphdmEvbGFuZy9TdHJpbmc7KVYgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLkNsYXNzCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvbGFuZy9DbGFzczwrTGphdmEvbGFuZy9hbm5vdGF0aW9uL0Fubm90YXRpb247PjsgKQotcHVibGljIGphdmEubGFuZy5DbGFzcyBhbm5vdGF0aW9uVHlwZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGVsZW1lbnROYW1lKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0ICh2YWx1ZSA9TGphdmEvbGFuZy9hbm5vdGF0aW9uL0VsZW1lbnRUeXBlOyFBTk5PVEFUSU9OX1RZUEUgKQotQGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQKLUBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb24gKHZhbHVlID1MamF2YS9sYW5nL2Fubm90YXRpb24vUmV0ZW50aW9uUG9saWN5OyFSVU5USU1FICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgamF2YS5sYW5nLmFubm90YXRpb24uSW5oZXJpdGVkIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb24gKHZhbHVlID1MamF2YS9sYW5nL2Fubm90YXRpb24vUmV0ZW50aW9uUG9saWN5OyFSVU5USU1FICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRGVmYXVsdCAodmFsdWUgPUxqYXZhL2xhbmcvYW5ub3RhdGlvbi9SZXRlbnRpb247Olt2YWx1ZSA9TGphdmEvbGFuZy9hbm5vdGF0aW9uL1JldGVudGlvblBvbGljeTshQ0xBU1NdICkKLUBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQgKHZhbHVlID1MamF2YS9sYW5nL2Fubm90YXRpb24vRWxlbWVudFR5cGU7IUFOTk9UQVRJT05fVFlQRSApCi1AamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZAotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kgdmFsdWUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL0VudW08TGphdmEvbGFuZy9hbm5vdGF0aW9uL1JldGVudGlvblBvbGljeTs+OyApCi1wdWJsaWMgZmluYWwgY2xhc3MgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5IGV4dGVuZHMgamF2YS5sYW5nLkVudW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5W10gJFZBTFVFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeSBDTEFTUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeSBSVU5USU1FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5IFNPVVJDRQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVYgKQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kgdmFsdWVPZigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5W10gdmFsdWVzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZAotQGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldCAodmFsdWUgPUxqYXZhL2xhbmcvYW5ub3RhdGlvbi9FbGVtZW50VHlwZTshQU5OT1RBVElPTl9UWVBFICkKLUBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb24gKHZhbHVlID1MamF2YS9sYW5nL2Fubm90YXRpb24vUmV0ZW50aW9uUG9saWN5OyFSVU5USU1FICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGVbXSB2YWx1ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS9sYW5nL3JlZi9SZWZlcmVuY2U8VFQ7PjsgKQotcHVibGljIGNsYXNzIGphdmEubGFuZy5yZWYuUGhhbnRvbVJlZmVyZW5jZSBleHRlbmRzIGphdmEubGFuZy5yZWYuUmVmZXJlbmNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVFQ7TGphdmEvbGFuZy9yZWYvUmVmZXJlbmNlUXVldWU8LVRUOz47KVYgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLnJlZi5SZWZlcmVuY2VRdWV1ZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVRUOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvbGFuZy9yZWYvUmVmZXJlbmNlPFRUOz47ICkKLXB1YmxpYyBjbGFzcyBqYXZhLmxhbmcucmVmLlNvZnRSZWZlcmVuY2UgZXh0ZW5kcyBqYXZhLmxhbmcucmVmLlJlZmVyZW5jZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRUOylWICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRUO0xqYXZhL2xhbmcvcmVmL1JlZmVyZW5jZVF1ZXVlPC1UVDs+OylWICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5yZWYuUmVmZXJlbmNlUXVldWUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5sYW5nLnJlZmxlY3QuQWNjZXNzaWJsZU9iamVjdCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmxhbmcucmVmbGVjdC5Bbm5vdGF0ZWRFbGVtZW50Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRElNRU5TSU9OXzEKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBESU1FTlNJT05fMgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERJTUVOU0lPTl8zCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNodGFibGU8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotc3RhdGljIGphdmEudXRpbC5IYXNodGFibGUgdHJhbnMKLQotIGJvb2xlYW4gZmxhZwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGphdmEubGFuZy5PYmplY3RbXSBnZXRDbGFzc1NpZ25hdHVyZUFubm90YXRpb24oCi1qYXZhLmxhbmcuQ2xhc3MpCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldENsYXNzU2lnbmF0dXJlQXR0cmlidXRlKAotamF2YS5sYW5nLkNsYXNzKQotCi1zdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255Lmtlcm5lbC52bS5SZWZsZWN0aW9uQWNjZXNzIGdldFJlZmxlY3Rpb25BY2Nlc3MoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvU2VjdXJpdHlFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRBY2Nlc3NpYmxlKAotamF2YS5sYW5nLnJlZmxlY3QuQWNjZXNzaWJsZU9iamVjdFtdCi1ib29sZWFuKQotCi0gdm9pZCBhcHBlbmRBcnJheUdlbmVyaWNUeXBlKAotamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIKLWphdmEubGFuZy5yZWZsZWN0LlR5cGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9TdHJpbmdCdWlsZGVyO0xqYXZhL2xhbmcvQ2xhc3M8Kj47KVYgKQotIHZvaWQgYXBwZW5kQXJyYXlUeXBlKAotamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIKLWphdmEubGFuZy5DbGFzcykKLQotIHZvaWQgYXBwZW5kQXJyYXlUeXBlKAotamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIKLWphdmEubGFuZy5DbGFzc1tdKQotCi0gdm9pZCBhcHBlbmRHZW5lcmljVHlwZSgKLWphdmEubGFuZy5TdHJpbmdCdWlsZGVyCi1qYXZhLmxhbmcucmVmbGVjdC5UeXBlKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7W0xqYXZhL2xhbmcvQ2xhc3M8Kj47KVYgKQotIHZvaWQgYXBwZW5kU2ltcGxlVHlwZSgKLWphdmEubGFuZy5TdHJpbmdCdWlsZGVyCi1qYXZhLmxhbmcuQ2xhc3NbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDo6TGphdmEvbGFuZy9hbm5vdGF0aW9uL0Fubm90YXRpb247PihMamF2YS9sYW5nL0NsYXNzPFRUOz47KVRUOyApCi1wdWJsaWMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKAotamF2YS5sYW5nLkNsYXNzKQotCi1wdWJsaWMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbltdIGdldEFubm90YXRpb25zKCkKLQotcHVibGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb25bXSBnZXREZWNsYXJlZEFubm90YXRpb25zKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9DbGFzczwqPjspTGphdmEvbGFuZy9TdHJpbmc7ICkKLSBqYXZhLmxhbmcuU3RyaW5nIGdldFNpZ25hdHVyZSgKLWphdmEubGFuZy5DbGFzcykKLQotIGphdmEubGFuZy5TdHJpbmcgZ2V0U2lnbmF0dXJlQXR0cmlidXRlKCkKLQotcHVibGljIGJvb2xlYW4gaXNBY2Nlc3NpYmxlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9DbGFzczwrTGphdmEvbGFuZy9hbm5vdGF0aW9uL0Fubm90YXRpb247PjspWiApCi1wdWJsaWMgYm9vbGVhbiBpc0Fubm90YXRpb25QcmVzZW50KAotamF2YS5sYW5nLkNsYXNzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvU2VjdXJpdHlFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldEFjY2Vzc2libGUoCi1ib29sZWFuKQotCi0gdm9pZCBzZXRBY2Nlc3NpYmxlTm9DaGVjaygKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFtMamF2YS9sYW5nL0NsYXNzPCo+OylMamF2YS9sYW5nL1N0cmluZzsgKQotIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoCi1qYXZhLmxhbmcuQ2xhc3NbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBqYXZhLmxhbmcucmVmbGVjdC5BcnJheSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL05lZ2F0aXZlQXJyYXlTaXplRXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvQ2xhc3M8Kj47W0kpTGphdmEvbGFuZy9PYmplY3Q7ICkKLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBqYXZhLmxhbmcuT2JqZWN0IGNyZWF0ZU11bHRpQXJyYXkoCi1qYXZhLmxhbmcuQ2xhc3MKLWludFtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvTmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9DbGFzczwqPjtJKUxqYXZhL2xhbmcvT2JqZWN0OyApCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgamF2YS5sYW5nLk9iamVjdCBjcmVhdGVPYmplY3RBcnJheSgKLWphdmEubGFuZy5DbGFzcwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uO0xqYXZhL2xhbmcvQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5PYmplY3QgZ2V0KAotamF2YS5sYW5nLk9iamVjdAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uO0xqYXZhL2xhbmcvQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0Qm9vbGVhbigKLWphdmEubGFuZy5PYmplY3QKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjtMamF2YS9sYW5nL0FycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBieXRlIGdldEJ5dGUoCi1qYXZhLmxhbmcuT2JqZWN0Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247TGphdmEvbGFuZy9BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgY2hhciBnZXRDaGFyKAotamF2YS5sYW5nLk9iamVjdAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uO0xqYXZhL2xhbmcvQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGRvdWJsZSBnZXREb3VibGUoCi1qYXZhLmxhbmcuT2JqZWN0Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247TGphdmEvbGFuZy9BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgZmxvYXQgZ2V0RmxvYXQoCi1qYXZhLmxhbmcuT2JqZWN0Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247TGphdmEvbGFuZy9BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgaW50IGdldEludCgKLWphdmEubGFuZy5PYmplY3QKLWludCkKLQotcHVibGljIHN0YXRpYyBpbnQgZ2V0TGVuZ3RoKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjtMamF2YS9sYW5nL0FycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBsb25nIGdldExvbmcoCi1qYXZhLmxhbmcuT2JqZWN0Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247TGphdmEvbGFuZy9BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgc2hvcnQgZ2V0U2hvcnQoCi1qYXZhLmxhbmcuT2JqZWN0Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvQ2xhc3M8Kj47SSlMamF2YS9sYW5nL09iamVjdDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvTmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLk9iamVjdCBuZXdJbnN0YW5jZSgKLWphdmEubGFuZy5DbGFzcwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvTmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9DbGFzczwqPjtbSSlMamF2YS9sYW5nL09iamVjdDsgKQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuT2JqZWN0IG5ld0luc3RhbmNlKAotamF2YS5sYW5nLkNsYXNzCi1pbnRbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjtMamF2YS9sYW5nL0FycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyB2b2lkIHNldCgKLWphdmEubGFuZy5PYmplY3QKLWludAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHN0YXRpYyB2b2lkIHNldEJvb2xlYW4oCi1qYXZhLmxhbmcuT2JqZWN0Ci1pbnQKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247TGphdmEvbGFuZy9BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRCeXRlKAotamF2YS5sYW5nLk9iamVjdAotaW50Ci1ieXRlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uO0xqYXZhL2xhbmcvQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIHZvaWQgc2V0Q2hhcigKLWphdmEubGFuZy5PYmplY3QKLWludAotY2hhcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjtMamF2YS9sYW5nL0FycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyB2b2lkIHNldERvdWJsZSgKLWphdmEubGFuZy5PYmplY3QKLWludAotZG91YmxlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uO0xqYXZhL2xhbmcvQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIHZvaWQgc2V0RmxvYXQoCi1qYXZhLmxhbmcuT2JqZWN0Ci1pbnQKLWZsb2F0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uO0xqYXZhL2xhbmcvQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIHZvaWQgc2V0SW50KAotamF2YS5sYW5nLk9iamVjdAotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247TGphdmEvbGFuZy9BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRMb25nKAotamF2YS5sYW5nLk9iamVjdAotaW50Ci1sb25nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uO0xqYXZhL2xhbmcvQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIHZvaWQgc2V0U2hvcnQoCi1qYXZhLmxhbmcuT2JqZWN0Ci1pbnQKLXNob3J0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZhLmxhbmcucmVmbGVjdC5NZW1iZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFQ0xBUkVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBVQkxJQwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuQ2xhc3MgZ2V0RGVjbGFyaW5nQ2xhc3MoKQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldE1vZGlmaWVycygpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldE5hbWUoKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1N5bnRoZXRpYygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS9sYW5nL3JlZmxlY3QvQWNjZXNzaWJsZU9iamVjdDtMamF2YS9sYW5nL3JlZmxlY3QvR2VuZXJpY0RlY2xhcmF0aW9uO0xqYXZhL2xhbmcvcmVmbGVjdC9NZW1iZXI7ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvciBleHRlbmRzIGphdmEubGFuZy5yZWZsZWN0LkFjY2Vzc2libGVPYmplY3QgaW1wbGVtZW50cyBqYXZhLmxhbmcucmVmbGVjdC5HZW5lcmljRGVjbGFyYXRpb24sIGphdmEubGFuZy5yZWZsZWN0Lk1lbWJlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvQ2xhc3M8VFQ7PjsgKQotIGphdmEubGFuZy5DbGFzcyBkZWNsYXJpbmdDbGFzcwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPVtMamF2YS9sYW5nL0NsYXNzPCo+OyApCi0gamF2YS5sYW5nLkNsYXNzW10gZXhjZXB0aW9uVHlwZXMKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1bTGphdmEvbGFuZy9yZWZsZWN0L1R5cGVWYXJpYWJsZTxMamF2YS9sYW5nL3JlZmxlY3QvQ29uc3RydWN0b3I8VFQ7Pjs+OyApCi0gamF2YS5sYW5nLnJlZmxlY3QuVHlwZVZhcmlhYmxlW10gZm9ybWFsVHlwZVBhcmFtZXRlcnMKLQotIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmxhbmcucmVmbGVjdC5MaXN0T2ZUeXBlcyBnZW5lcmljRXhjZXB0aW9uVHlwZXMKLQotIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmxhbmcucmVmbGVjdC5MaXN0T2ZUeXBlcyBnZW5lcmljUGFyYW1ldGVyVHlwZXMKLQotcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIGdlbmVyaWNUeXBlc0FyZUluaXRpYWxpemVkCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9W0xqYXZhL2xhbmcvQ2xhc3M8Kj47ICkKLSBqYXZhLmxhbmcuQ2xhc3NbXSBwYXJhbWV0ZXJUeXBlcwotCi0gaW50IHNsb3QKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9DbGFzczxUVDs+O1tMamF2YS9sYW5nL0NsYXNzPCo+O1tMamF2YS9sYW5nL0NsYXNzPCo+O0kpViApCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLkNsYXNzCi1qYXZhLmxhbmcuQ2xhc3NbXQotamF2YS5sYW5nLkNsYXNzW10KLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0luc3RhbnRpYXRpb25FeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsQWNjZXNzRXhjZXB0aW9uO0xqYXZhL2xhbmcvcmVmbGVjdC9JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFtMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL0NsYXNzPFRUOz47W0xqYXZhL2xhbmcvQ2xhc3M8Kj47SVopVFQ7ICkKLXByaXZhdGUgbmF0aXZlIGphdmEubGFuZy5PYmplY3QgY29uc3RydWN0TmF0aXZlKAotamF2YS5sYW5nLk9iamVjdFtdCi1qYXZhLmxhbmcuQ2xhc3MKLWphdmEubGFuZy5DbGFzc1tdCi1pbnQKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvQ2xhc3M8VFQ7PjtJKUkgKQotcHJpdmF0ZSBuYXRpdmUgaW50IGdldENvbnN0cnVjdG9yTW9kaWZpZXJzKAotamF2YS5sYW5nLkNsYXNzCi1pbnQpCi0KLXByaXZhdGUgbmF0aXZlIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb25bXSBnZXREZWNsYXJlZEFubm90YXRpb25zKAotamF2YS5sYW5nLkNsYXNzCi1pbnQpCi0KLXByaXZhdGUgbmF0aXZlIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb25bXVtdIGdldFBhcmFtZXRlckFubm90YXRpb25zKAotamF2YS5sYW5nLkNsYXNzCi1pbnQpCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBnZXRTaWduYXR1cmUoKQotCi1wcml2YXRlIG5hdGl2ZSBqYXZhLmxhbmcuT2JqZWN0W10gZ2V0U2lnbmF0dXJlQW5ub3RhdGlvbigKLWphdmEubGFuZy5DbGFzcwotaW50KQotCi1wcml2YXRlIHZvaWQgaW5pdEdlbmVyaWNUeXBlcygpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uW10gZ2V0RGVjbGFyZWRBbm5vdGF0aW9ucygpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS9sYW5nL0NsYXNzPFRUOz47ICkKLXB1YmxpYyBqYXZhLmxhbmcuQ2xhc3MgZ2V0RGVjbGFyaW5nQ2xhc3MoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpW0xqYXZhL2xhbmcvQ2xhc3M8Kj47ICkKLXB1YmxpYyBqYXZhLmxhbmcuQ2xhc3NbXSBnZXRFeGNlcHRpb25UeXBlcygpCi0KLXB1YmxpYyBqYXZhLmxhbmcucmVmbGVjdC5UeXBlW10gZ2V0R2VuZXJpY0V4Y2VwdGlvblR5cGVzKCkKLQotcHVibGljIGphdmEubGFuZy5yZWZsZWN0LlR5cGVbXSBnZXRHZW5lcmljUGFyYW1ldGVyVHlwZXMoKQotCi1wdWJsaWMgaW50IGdldE1vZGlmaWVycygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE5hbWUoKQotCi1wdWJsaWMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbltdW10gZ2V0UGFyYW1ldGVyQW5ub3RhdGlvbnMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpW0xqYXZhL2xhbmcvQ2xhc3M8Kj47ICkKLXB1YmxpYyBqYXZhLmxhbmcuQ2xhc3NbXSBnZXRQYXJhbWV0ZXJUeXBlcygpCi0KLSBqYXZhLmxhbmcuU3RyaW5nIGdldFNpZ25hdHVyZUF0dHJpYnV0ZSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClbTGphdmEvbGFuZy9yZWZsZWN0L1R5cGVWYXJpYWJsZTxMamF2YS9sYW5nL3JlZmxlY3QvQ29uc3RydWN0b3I8VFQ7Pjs+OyApCi1wdWJsaWMgamF2YS5sYW5nLnJlZmxlY3QuVHlwZVZhcmlhYmxlW10gZ2V0VHlwZVBhcmFtZXRlcnMoKQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLQotcHVibGljIGJvb2xlYW4gaXNTeW50aGV0aWMoKQotCi1wdWJsaWMgYm9vbGVhbiBpc1ZhckFyZ3MoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSW5zdGFudGlhdGlvbkV4Y2VwdGlvbjtMamF2YS9sYW5nL0lsbGVnYWxBY2Nlc3NFeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247TGphdmEvbGFuZy9yZWZsZWN0L0ludm9jYXRpb25UYXJnZXRFeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oW0xqYXZhL2xhbmcvT2JqZWN0OylUVDsgKQotcHVibGljIHRyYW5zaWVudCBqYXZhLmxhbmcuT2JqZWN0IG5ld0luc3RhbmNlKAotamF2YS5sYW5nLk9iamVjdFtdKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b0dlbmVyaWNTdHJpbmcoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQgZXh0ZW5kcyBqYXZhLmxhbmcucmVmbGVjdC5BY2Nlc3NpYmxlT2JqZWN0IGltcGxlbWVudHMgamF2YS5sYW5nLnJlZmxlY3QuTWVtYmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUWVBFX0JPT0xFQU4KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRZUEVfQllURQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9DSEFSCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUWVBFX0RPVUJMRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9GTE9BVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9JTlRFR0VSCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUWVBFX0xPTkcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRZUEVfU0hPUlQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL0NsYXNzPCo+OyApCi1wcml2YXRlIGphdmEubGFuZy5DbGFzcyBkZWNsYXJpbmdDbGFzcwotCi1wcml2YXRlIGphdmEubGFuZy5yZWZsZWN0LlR5cGUgZ2VuZXJpY1R5cGUKLQotcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIGdlbmVyaWNUeXBlc0FyZUluaXRpYWxpemVkCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBuYW1lCi0KLXByaXZhdGUgaW50IHNsb3QKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL0NsYXNzPCo+OyApCi1wcml2YXRlIGphdmEubGFuZy5DbGFzcyB0eXBlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvQ2xhc3M8Kj47TGphdmEvbGFuZy9DbGFzczwqPjtMamF2YS9sYW5nL1N0cmluZztJKVYgKQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5DbGFzcwotamF2YS5sYW5nLkNsYXNzCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsQWNjZXNzRXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcvQ2xhc3M8Kj47TGphdmEvbGFuZy9DbGFzczwqPjtJWkkpQiApCi1wcml2YXRlIG5hdGl2ZSBieXRlIGdldEJGaWVsZCgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5DbGFzcwotamF2YS5sYW5nLkNsYXNzCi1pbnQKLWJvb2xlYW4KLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBY2Nlc3NFeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9DbGFzczwqPjtMamF2YS9sYW5nL0NsYXNzPCo+O0laSSlDICkKLXByaXZhdGUgbmF0aXZlIGNoYXIgZ2V0Q0ZpZWxkKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLkNsYXNzCi1qYXZhLmxhbmcuQ2xhc3MKLWludAotYm9vbGVhbgotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL0NsYXNzPCo+O0xqYXZhL2xhbmcvQ2xhc3M8Kj47SVpJKUQgKQotcHJpdmF0ZSBuYXRpdmUgZG91YmxlIGdldERGaWVsZCgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5DbGFzcwotamF2YS5sYW5nLkNsYXNzCi1pbnQKLWJvb2xlYW4KLWludCkKLQotcHJpdmF0ZSBuYXRpdmUgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbltdIGdldERlY2xhcmVkQW5ub3RhdGlvbnMoCi1qYXZhLmxhbmcuQ2xhc3MKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9DbGFzczwqPjtMamF2YS9sYW5nL0NsYXNzPCo+O0laSSlGICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBY2Nlc3NFeGNlcHRpb247ICkKLXByaXZhdGUgbmF0aXZlIGZsb2F0IGdldEZGaWVsZCgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5DbGFzcwotamF2YS5sYW5nLkNsYXNzCi1pbnQKLWJvb2xlYW4KLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9DbGFzczwqPjtMamF2YS9sYW5nL0NsYXNzPCo+O0laKUxqYXZhL2xhbmcvT2JqZWN0OyApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsQWNjZXNzRXhjZXB0aW9uOyApCi1wcml2YXRlIG5hdGl2ZSBqYXZhLmxhbmcuT2JqZWN0IGdldEZpZWxkKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLkNsYXNzCi1qYXZhLmxhbmcuQ2xhc3MKLWludAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9DbGFzczwqPjtJKUkgKQotcHJpdmF0ZSBuYXRpdmUgaW50IGdldEZpZWxkTW9kaWZpZXJzKAotamF2YS5sYW5nLkNsYXNzCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcvQ2xhc3M8Kj47TGphdmEvbGFuZy9DbGFzczwqPjtJWkkpSSApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsQWNjZXNzRXhjZXB0aW9uOyApCi1wcml2YXRlIG5hdGl2ZSBpbnQgZ2V0SUZpZWxkKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLkNsYXNzCi1qYXZhLmxhbmcuQ2xhc3MKLWludAotYm9vbGVhbgotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL0NsYXNzPCo+O0xqYXZhL2xhbmcvQ2xhc3M8Kj47SVpJKUogKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBuYXRpdmUgbG9uZyBnZXRKRmllbGQoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuQ2xhc3MKLWphdmEubGFuZy5DbGFzcwotaW50Ci1ib29sZWFuCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcvQ2xhc3M8Kj47TGphdmEvbGFuZy9DbGFzczwqPjtJWkkpUyApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsQWNjZXNzRXhjZXB0aW9uOyApCi1wcml2YXRlIG5hdGl2ZSBzaG9ydCBnZXRTRmllbGQoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuQ2xhc3MKLWphdmEubGFuZy5DbGFzcwotaW50Ci1ib29sZWFuCi1pbnQpCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBnZXRTaWduYXR1cmUoKQotCi1wcml2YXRlIG5hdGl2ZSBqYXZhLmxhbmcuT2JqZWN0W10gZ2V0U2lnbmF0dXJlQW5ub3RhdGlvbigKLWphdmEubGFuZy5DbGFzcwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL0NsYXNzPCo+O0xqYXZhL2xhbmcvQ2xhc3M8Kj47SVpJKVogKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBnZXRaRmllbGQoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuQ2xhc3MKLWphdmEubGFuZy5DbGFzcwotaW50Ci1ib29sZWFuCi1pbnQpCi0KLXByaXZhdGUgdm9pZCBpbml0R2VuZXJpY1R5cGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL0NsYXNzPCo+O0xqYXZhL2xhbmcvQ2xhc3M8Kj47SVpJQilWICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBY2Nlc3NFeGNlcHRpb247ICkKLXByaXZhdGUgbmF0aXZlIHZvaWQgc2V0QkZpZWxkKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLkNsYXNzCi1qYXZhLmxhbmcuQ2xhc3MKLWludAotYm9vbGVhbgotaW50Ci1ieXRlKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL0NsYXNzPCo+O0xqYXZhL2xhbmcvQ2xhc3M8Kj47SVpJQylWICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBY2Nlc3NFeGNlcHRpb247ICkKLXByaXZhdGUgbmF0aXZlIHZvaWQgc2V0Q0ZpZWxkKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLkNsYXNzCi1qYXZhLmxhbmcuQ2xhc3MKLWludAotYm9vbGVhbgotaW50Ci1jaGFyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL0NsYXNzPCo+O0xqYXZhL2xhbmcvQ2xhc3M8Kj47SVpJRClWICkKLXByaXZhdGUgbmF0aXZlIHZvaWQgc2V0REZpZWxkKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLkNsYXNzCi1qYXZhLmxhbmcuQ2xhc3MKLWludAotYm9vbGVhbgotaW50Ci1kb3VibGUpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcvQ2xhc3M8Kj47TGphdmEvbGFuZy9DbGFzczwqPjtJWklGKVYgKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBzZXRGRmllbGQoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuQ2xhc3MKLWphdmEubGFuZy5DbGFzcwotaW50Ci1ib29sZWFuCi1pbnQKLWZsb2F0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL0NsYXNzPCo+O0xqYXZhL2xhbmcvQ2xhc3M8Kj47SVpMamF2YS9sYW5nL09iamVjdDspViApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsQWNjZXNzRXhjZXB0aW9uOyApCi1wcml2YXRlIG5hdGl2ZSB2b2lkIHNldEZpZWxkKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLkNsYXNzCi1qYXZhLmxhbmcuQ2xhc3MKLWludAotYm9vbGVhbgotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9DbGFzczwqPjtMamF2YS9sYW5nL0NsYXNzPCo+O0laSUkpViApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsQWNjZXNzRXhjZXB0aW9uOyApCi1wcml2YXRlIG5hdGl2ZSB2b2lkIHNldElGaWVsZCgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5DbGFzcwotamF2YS5sYW5nLkNsYXNzCi1pbnQKLWJvb2xlYW4KLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL0NsYXNzPCo+O0xqYXZhL2xhbmcvQ2xhc3M8Kj47SVpJSilWICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBY2Nlc3NFeGNlcHRpb247ICkKLXByaXZhdGUgbmF0aXZlIHZvaWQgc2V0SkZpZWxkKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLkNsYXNzCi1qYXZhLmxhbmcuQ2xhc3MKLWludAotYm9vbGVhbgotaW50Ci1sb25nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL0NsYXNzPCo+O0xqYXZhL2xhbmcvQ2xhc3M8Kj47SVpJUylWICkKLXByaXZhdGUgbmF0aXZlIHZvaWQgc2V0U0ZpZWxkKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLkNsYXNzCi1qYXZhLmxhbmcuQ2xhc3MKLWludAotYm9vbGVhbgotaW50Ci1zaG9ydCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBY2Nlc3NFeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9DbGFzczwqPjtMamF2YS9sYW5nL0NsYXNzPCo+O0laSVopViApCi1wcml2YXRlIG5hdGl2ZSB2b2lkIHNldFpGaWVsZCgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5DbGFzcwotamF2YS5sYW5nLkNsYXNzCi1pbnQKLWJvb2xlYW4KLWludAotYm9vbGVhbikKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBY2Nlc3NFeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldCgKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsQWNjZXNzRXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBY2Nlc3NFeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247ICkKLXB1YmxpYyBieXRlIGdldEJ5dGUoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbjtMamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsgKQotcHVibGljIGNoYXIgZ2V0Q2hhcigKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uW10gZ2V0RGVjbGFyZWRBbm5vdGF0aW9ucygpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS9sYW5nL0NsYXNzPCo+OyApCi1wdWJsaWMgamF2YS5sYW5nLkNsYXNzIGdldERlY2xhcmluZ0NsYXNzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBY2Nlc3NFeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247ICkKLXB1YmxpYyBkb3VibGUgZ2V0RG91YmxlKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBY2Nlc3NFeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247ICkKLXB1YmxpYyBmbG9hdCBnZXRGbG9hdCgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBqYXZhLmxhbmcucmVmbGVjdC5UeXBlIGdldEdlbmVyaWNUeXBlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBY2Nlc3NFeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgZ2V0SW50KAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBY2Nlc3NFeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247ICkKLXB1YmxpYyBsb25nIGdldExvbmcoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50IGdldE1vZGlmaWVycygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE5hbWUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbjtMamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsgKQotcHVibGljIHNob3J0IGdldFNob3J0KAotamF2YS5sYW5nLk9iamVjdCkKLQotIGphdmEubGFuZy5TdHJpbmcgZ2V0U2lnbmF0dXJlQXR0cmlidXRlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL2xhbmcvQ2xhc3M8Kj47ICkKLXB1YmxpYyBqYXZhLmxhbmcuQ2xhc3MgZ2V0VHlwZSgpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0VudW1Db25zdGFudCgpCi0KLXB1YmxpYyBib29sZWFuIGlzU3ludGhldGljKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBY2Nlc3NFeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldCgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsQWNjZXNzRXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRCb29sZWFuKAotamF2YS5sYW5nLk9iamVjdAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBY2Nlc3NFeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldEJ5dGUoCi1qYXZhLmxhbmcuT2JqZWN0Ci1ieXRlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbjtMamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0Q2hhcigKLWphdmEubGFuZy5PYmplY3QKLWNoYXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsQWNjZXNzRXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXREb3VibGUoCi1qYXZhLmxhbmcuT2JqZWN0Ci1kb3VibGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsQWNjZXNzRXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRGbG9hdCgKLWphdmEubGFuZy5PYmplY3QKLWZsb2F0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbjtMamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0SW50KAotamF2YS5sYW5nLk9iamVjdAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbjtMamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0TG9uZygKLWphdmEubGFuZy5PYmplY3QKLWxvbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsQWNjZXNzRXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRTaG9ydCgKLWphdmEubGFuZy5PYmplY3QKLXNob3J0KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b0dlbmVyaWNTdHJpbmcoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEubGFuZy5yZWZsZWN0LkdlbmVyaWNBcnJheVR5cGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5sYW5nLnJlZmxlY3QuVHlwZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlIGdldEdlbmVyaWNDb21wb25lbnRUeXBlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLmxhbmcucmVmbGVjdC5HZW5lcmljU2lnbmF0dXJlRm9ybWF0RXJyb3IgZXh0ZW5kcyBqYXZhLmxhbmcuQ2xhc3NGb3JtYXRFcnJvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uSGFuZGxlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvVGhyb3dhYmxlOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLk9iamVjdCBpbnZva2UoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcucmVmbGVjdC5NZXRob2QKLWphdmEubGFuZy5PYmplY3RbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLkV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuVGhyb3dhYmxlIHRhcmdldAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5UaHJvd2FibGUKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuVGhyb3dhYmxlIGdldENhdXNlKCkKLQotcHVibGljIGphdmEubGFuZy5UaHJvd2FibGUgZ2V0VGFyZ2V0RXhjZXB0aW9uKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLmxhbmcucmVmbGVjdC5NYWxmb3JtZWRQYXJhbWV0ZXJpemVkVHlwZUV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIGV4dGVuZHMgamF2YS5sYW5nLnJlZmxlY3QuQWNjZXNzaWJsZU9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5yZWZsZWN0LkdlbmVyaWNEZWNsYXJhdGlvbiwgamF2YS5sYW5nLnJlZmxlY3QuTWVtYmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb25bXSBOT19BTk5PVEFUSU9OUwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvQ2xhc3M8Kj47ICkKLXByaXZhdGUgamF2YS5sYW5nLkNsYXNzIGRlY2xhcmluZ0NsYXNzCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9W0xqYXZhL2xhbmcvQ2xhc3M8Kj47ICkKLXByaXZhdGUgamF2YS5sYW5nLkNsYXNzW10gZXhjZXB0aW9uVHlwZXMKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1bTGphdmEvbGFuZy9yZWZsZWN0L1R5cGVWYXJpYWJsZTxMamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kOz47ICkKLXByaXZhdGUgamF2YS5sYW5nLnJlZmxlY3QuVHlwZVZhcmlhYmxlW10gZm9ybWFsVHlwZVBhcmFtZXRlcnMKLQotcHJpdmF0ZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5sYW5nLnJlZmxlY3QuTGlzdE9mVHlwZXMgZ2VuZXJpY0V4Y2VwdGlvblR5cGVzCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkubGFuZy5yZWZsZWN0Lkxpc3RPZlR5cGVzIGdlbmVyaWNQYXJhbWV0ZXJUeXBlcwotCi1wcml2YXRlIGphdmEubGFuZy5yZWZsZWN0LlR5cGUgZ2VuZXJpY1JldHVyblR5cGUKLQotcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIGdlbmVyaWNUeXBlc0FyZUluaXRpYWxpemVkCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBuYW1lCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9W0xqYXZhL2xhbmcvQ2xhc3M8Kj47ICkKLXByaXZhdGUgamF2YS5sYW5nLkNsYXNzW10gcGFyYW1ldGVyVHlwZXMKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL0NsYXNzPCo+OyApCi1wcml2YXRlIGphdmEubGFuZy5DbGFzcyByZXR1cm5UeXBlCi0KLXByaXZhdGUgaW50IHNsb3QKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvQ2xhc3M8Kj47W0xqYXZhL2xhbmcvQ2xhc3M8Kj47W0xqYXZhL2xhbmcvQ2xhc3M8Kj47TGphdmEvbGFuZy9DbGFzczwqPjtMamF2YS9sYW5nL1N0cmluZztJKVYgKQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5DbGFzcwotamF2YS5sYW5nLkNsYXNzW10KLWphdmEubGFuZy5DbGFzc1tdCi1qYXZhLmxhbmcuQ2xhc3MKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kKQotCi1wcml2YXRlIG5hdGl2ZSBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uW10gZ2V0RGVjbGFyZWRBbm5vdGF0aW9ucygKLWphdmEubGFuZy5DbGFzcwotaW50KQotCi1wcml2YXRlIG5hdGl2ZSBqYXZhLmxhbmcuT2JqZWN0IGdldERlZmF1bHRWYWx1ZSgKLWphdmEubGFuZy5DbGFzcwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL0NsYXNzPCo+O0kpSSApCi1wcml2YXRlIG5hdGl2ZSBpbnQgZ2V0TWV0aG9kTW9kaWZpZXJzKAotamF2YS5sYW5nLkNsYXNzCi1pbnQpCi0KLXByaXZhdGUgbmF0aXZlIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb25bXVtdIGdldFBhcmFtZXRlckFubm90YXRpb25zKAotamF2YS5sYW5nLkNsYXNzCi1pbnQpCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBnZXRTaWduYXR1cmUoKQotCi1wcml2YXRlIG5hdGl2ZSBqYXZhLmxhbmcuT2JqZWN0W10gZ2V0U2lnbmF0dXJlQW5ub3RhdGlvbigKLWphdmEubGFuZy5DbGFzcwotaW50KQotCi1wcml2YXRlIHZvaWQgaW5pdEdlbmVyaWNUeXBlcygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsQWNjZXNzRXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uO0xqYXZhL2xhbmcvcmVmbGVjdC9JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvT2JqZWN0O1tMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL0NsYXNzPCo+O1tMamF2YS9sYW5nL0NsYXNzPCo+O0xqYXZhL2xhbmcvQ2xhc3M8Kj47SVopTGphdmEvbGFuZy9PYmplY3Q7ICkKLXByaXZhdGUgbmF0aXZlIGphdmEubGFuZy5PYmplY3QgaW52b2tlTmF0aXZlKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdFtdCi1qYXZhLmxhbmcuQ2xhc3MKLWphdmEubGFuZy5DbGFzc1tdCi1qYXZhLmxhbmcuQ2xhc3MKLWludAotYm9vbGVhbikKLQotc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb25bXVtdIG5vQW5ub3RhdGlvbnMoCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uW10gZ2V0RGVjbGFyZWRBbm5vdGF0aW9ucygpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS9sYW5nL0NsYXNzPCo+OyApCi1wdWJsaWMgamF2YS5sYW5nLkNsYXNzIGdldERlY2xhcmluZ0NsYXNzKCkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0RGVmYXVsdFZhbHVlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVtMamF2YS9sYW5nL0NsYXNzPCo+OyApCi1wdWJsaWMgamF2YS5sYW5nLkNsYXNzW10gZ2V0RXhjZXB0aW9uVHlwZXMoKQotCi1wdWJsaWMgamF2YS5sYW5nLnJlZmxlY3QuVHlwZVtdIGdldEdlbmVyaWNFeGNlcHRpb25UeXBlcygpCi0KLXB1YmxpYyBqYXZhLmxhbmcucmVmbGVjdC5UeXBlW10gZ2V0R2VuZXJpY1BhcmFtZXRlclR5cGVzKCkKLQotcHVibGljIGphdmEubGFuZy5yZWZsZWN0LlR5cGUgZ2V0R2VuZXJpY1JldHVyblR5cGUoKQotCi1wdWJsaWMgaW50IGdldE1vZGlmaWVycygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE5hbWUoKQotCi1wdWJsaWMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbltdW10gZ2V0UGFyYW1ldGVyQW5ub3RhdGlvbnMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpW0xqYXZhL2xhbmcvQ2xhc3M8Kj47ICkKLXB1YmxpYyBqYXZhLmxhbmcuQ2xhc3NbXSBnZXRQYXJhbWV0ZXJUeXBlcygpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS9sYW5nL0NsYXNzPCo+OyApCi1wdWJsaWMgamF2YS5sYW5nLkNsYXNzIGdldFJldHVyblR5cGUoKQotCi0gamF2YS5sYW5nLlN0cmluZyBnZXRTaWduYXR1cmVBdHRyaWJ1dGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpW0xqYXZhL2xhbmcvcmVmbGVjdC9UeXBlVmFyaWFibGU8TGphdmEvbGFuZy9yZWZsZWN0L01ldGhvZDs+OyApCi1wdWJsaWMgamF2YS5sYW5nLnJlZmxlY3QuVHlwZVZhcmlhYmxlW10gZ2V0VHlwZVBhcmFtZXRlcnMoKQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBY2Nlc3NFeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247TGphdmEvbGFuZy9yZWZsZWN0L0ludm9jYXRpb25UYXJnZXRFeGNlcHRpb247ICkKLXB1YmxpYyB0cmFuc2llbnQgamF2YS5sYW5nLk9iamVjdCBpbnZva2UoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0W10pCi0KLXB1YmxpYyBib29sZWFuIGlzQnJpZGdlKCkKLQotcHVibGljIGJvb2xlYW4gaXNTeW50aGV0aWMoKQotCi1wdWJsaWMgYm9vbGVhbiBpc1ZhckFyZ3MoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b0dlbmVyaWNTdHJpbmcoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUCi0KLXN0YXRpYyBmaW5hbCBpbnQgQU5OT1RBVElPTgotCi1zdGF0aWMgZmluYWwgaW50IEJSSURHRQotCi1zdGF0aWMgZmluYWwgaW50IEVOVU0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklOQUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJGQUNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5BVElWRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklWQVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1RFQ1RFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQVUJMSUMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVElDCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUUklDVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTWU5DSFJPTklaRUQKLQotc3RhdGljIGZpbmFsIGludCBTWU5USEVUSUMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNJRU5UCi0KLXN0YXRpYyBmaW5hbCBpbnQgVkFSQVJHUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWT0xBVElMRQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Fic3RyYWN0KAotaW50KQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNGaW5hbCgKLWludCkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzSW50ZXJmYWNlKAotaW50KQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNOYXRpdmUoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ByaXZhdGUoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Byb3RlY3RlZCgKLWludCkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzUHVibGljKAotaW50KQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTdGF0aWMoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1N0cmljdCgKLWludCkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzU3luY2hyb25pemVkKAotaW50KQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUcmFuc2llbnQoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZvbGF0aWxlKAotaW50KQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEubGFuZy5yZWZsZWN0LlBhcmFtZXRlcml6ZWRUeXBlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5yZWZsZWN0LlR5cGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLnJlZmxlY3QuVHlwZVtdIGdldEFjdHVhbFR5cGVBcmd1bWVudHMoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLnJlZmxlY3QuVHlwZSBnZXRPd25lclR5cGUoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLnJlZmxlY3QuVHlwZSBnZXRSYXdUeXBlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLmxhbmcucmVmbGVjdC5Qcm94eSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBpbnQgTmV4dENsYXNzTmFtZUluZGV4Ci1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9DbGFzc0xvYWRlcjtMamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL3JlZi9XZWFrUmVmZXJlbmNlPExqYXZhL2xhbmcvQ2xhc3M8Kj47Pjs+Oz47ICkKLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEudXRpbC5NYXAgbG9hZGVyQ2FjaGUKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL01hcDxMamF2YS9sYW5nL0NsYXNzPCo+O0xqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEudXRpbC5NYXAgcHJveHlDYWNoZQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJvdGVjdGVkIGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25IYW5kbGVyIGgKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uSGFuZGxlcikKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgY29uc3RydWN0b3JQcm90b3R5cGUoCi1qYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uSGFuZGxlcikKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGphdmEubGFuZy5DbGFzcyBnZW5lcmF0ZVByb3h5KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLkNsYXNzW10KLWphdmEubGFuZy5DbGFzc0xvYWRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uSGFuZGxlciBnZXRJbnZvY2F0aW9uSGFuZGxlcigKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9DbGFzc0xvYWRlcjtbTGphdmEvbGFuZy9DbGFzczwqPjspTGphdmEvbGFuZy9DbGFzczwqPjsgKQotcHVibGljIHN0YXRpYyB0cmFuc2llbnQgamF2YS5sYW5nLkNsYXNzIGdldFByb3h5Q2xhc3MoCi1qYXZhLmxhbmcuQ2xhc3NMb2FkZXIKLWphdmEubGFuZy5DbGFzc1tdKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL0NsYXNzPCo+OylaICkKLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Byb3h5Q2xhc3MoCi1qYXZhLmxhbmcuQ2xhc3MpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9DbGFzc0xvYWRlcjtbTGphdmEvbGFuZy9DbGFzczwqPjtMamF2YS9sYW5nL3JlZmxlY3QvSW52b2NhdGlvbkhhbmRsZXI7KUxqYXZhL2xhbmcvT2JqZWN0OyApCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5PYmplY3QgbmV3UHJveHlJbnN0YW5jZSgKLWphdmEubGFuZy5DbGFzc0xvYWRlcgotamF2YS5sYW5nLkNsYXNzW10KLWphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25IYW5kbGVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIGphdmEubGFuZy5yZWZsZWN0LlJlZmxlY3RQZXJtaXNzaW9uIGV4dGVuZHMgamF2YS5zZWN1cml0eS5CYXNpY1Blcm1pc3Npb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255Lmtlcm5lbC52bS5SZWZsZWN0aW9uQWNjZXNzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgYWNjZXNzaWJsZUNsb25lKAotamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIGNsb25lKAotamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRBY2Nlc3NpYmxlTm9DaGVjaygKLWphdmEubGFuZy5yZWZsZWN0LkFjY2Vzc2libGVPYmplY3QKLWJvb2xlYW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1maW5hbCBjbGFzcyBqYXZhLmxhbmcucmVmbGVjdC5SZWZsZWN0aW9uQWNjZXNzSW1wbCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmhhcm1vbnkua2VybmVsLnZtLlJlZmxlY3Rpb25BY2Nlc3MKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIGphdmEubGFuZy5yZWZsZWN0LlJlZmxlY3Rpb25BY2Nlc3NJbXBsIFRIRV9PTkUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIGFjY2Vzc2libGVDbG9uZSgKLWphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCkKLQotcHVibGljIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBjbG9uZSgKLWphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCkKLQotcHVibGljIHZvaWQgc2V0QWNjZXNzaWJsZU5vQ2hlY2soCi1qYXZhLmxhbmcucmVmbGVjdC5BY2Nlc3NpYmxlT2JqZWN0Ci1ib29sZWFuKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08RDo6TGphdmEvbGFuZy9yZWZsZWN0L0dlbmVyaWNEZWNsYXJhdGlvbjs+TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9yZWZsZWN0L1R5cGU7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgamF2YS5sYW5nLnJlZmxlY3QuVHlwZVZhcmlhYmxlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5yZWZsZWN0LlR5cGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLnJlZmxlY3QuVHlwZVtdIGdldEJvdW5kcygpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClURDsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5yZWZsZWN0LkdlbmVyaWNEZWNsYXJhdGlvbiBnZXRHZW5lcmljRGVjbGFyYXRpb24oKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXROYW1lKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLmxhbmcucmVmbGVjdC5VbmRlY2xhcmVkVGhyb3dhYmxlRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0KLXByaXZhdGUgamF2YS5sYW5nLlRocm93YWJsZSB1bmRlY2xhcmVkVGhyb3dhYmxlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlRocm93YWJsZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlRocm93YWJsZQotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5UaHJvd2FibGUgZ2V0Q2F1c2UoKQotCi1wdWJsaWMgamF2YS5sYW5nLlRocm93YWJsZSBnZXRVbmRlY2xhcmVkVGhyb3dhYmxlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgamF2YS5sYW5nLnJlZmxlY3QuV2lsZGNhcmRUeXBlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5yZWZsZWN0LlR5cGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLnJlZmxlY3QuVHlwZVtdIGdldExvd2VyQm91bmRzKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5yZWZsZWN0LlR5cGVbXSBnZXRVcHBlckJvdW5kcygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID00MTA0IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvbWF0aC9CaWdEZWNpbWFsOyApCi0gY2xhc3MgamF2YS5tYXRoLkJpZ0RlY2ltYWwkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIGludFtdICRTd2l0Y2hNYXAkamF2YSRtYXRoJFJvdW5kaW5nTW9kZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9OdW1iZXI7TGphdmEvbGFuZy9Db21wYXJhYmxlPExqYXZhL21hdGgvQmlnRGVjaW1hbDs+O0xqYXZhL2lvL1NlcmlhbGl6YWJsZTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MamF2YS9tYXRoL0JpZ0RlY2ltYWwkMTsgKQotcHVibGljIGNsYXNzIGphdmEubWF0aC5CaWdEZWNpbWFsIGV4dGVuZHMgamF2YS5sYW5nLk51bWJlciBpbXBsZW1lbnRzIGphdmEubGFuZy5Db21wYXJhYmxlLCBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLm1hdGguQmlnRGVjaW1hbFtdIEJJX1NDQUxFRF9CWV9aRVJPCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCSV9TQ0FMRURfQllfWkVST19MRU5HVEgKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIENIX1pFUk9TCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubWF0aC5CaWdJbnRlZ2VyW10gRklWRV9QT1cKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIExPRzEwXzIKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIExPTkdfRklWRV9QT1cKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gTE9OR19GSVZFX1BPV19CSVRfTEVOR1RICi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBMT05HX1RFTl9QT1cKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gTE9OR19URU5fUE9XX0JJVF9MRU5HVEgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLm1hdGguQmlnRGVjaW1hbCBPTkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUk9VTkRfQ0VJTElORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBST1VORF9ET1dOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJPVU5EX0ZMT09SCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJPVU5EX0hBTEZfRE9XTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBST1VORF9IQUxGX0VWRU4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUk9VTkRfSEFMRl9VUAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBST1VORF9VTk5FQ0VTU0FSWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBST1VORF9VUAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubWF0aC5CaWdEZWNpbWFsIFRFTgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLm1hdGguQmlnSW50ZWdlcltdIFRFTl9QT1cKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLm1hdGguQmlnRGVjaW1hbCBaRVJPCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubWF0aC5CaWdEZWNpbWFsW10gWkVST19TQ0FMRURfQlkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0KLXByaXZhdGUgdHJhbnNpZW50IGludCBiaXRMZW5ndGgKLQotcHJpdmF0ZSB0cmFuc2llbnQgaW50IGhhc2hDb2RlCi0KLXByaXZhdGUgamF2YS5tYXRoLkJpZ0ludGVnZXIgaW50VmFsCi0KLXByaXZhdGUgdHJhbnNpZW50IGludCBwcmVjaXNpb24KLQotcHJpdmF0ZSBpbnQgc2NhbGUKLQotcHJpdmF0ZSB0cmFuc2llbnQgbG9uZyBzbWFsbFZhbHVlCi0KLXByaXZhdGUgdHJhbnNpZW50IGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmdJbWFnZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotZG91YmxlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1kb3VibGUKLWphdmEubWF0aC5NYXRoQ29udGV4dCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50KQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotamF2YS5tYXRoLk1hdGhDb250ZXh0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1sb25nKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotbG9uZwotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1sb25nCi1qYXZhLm1hdGguTWF0aENvbnRleHQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubWF0aC5NYXRoQ29udGV4dCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5tYXRoLkJpZ0ludGVnZXIpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1pbnQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1pbnQKLWphdmEubWF0aC5NYXRoQ29udGV4dCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5tYXRoLkJpZ0ludGVnZXIKLWphdmEubWF0aC5NYXRoQ29udGV4dCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotY2hhcltdKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1jaGFyW10KLWludAotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1jaGFyW10KLWludAotaW50Ci1qYXZhLm1hdGguTWF0aENvbnRleHQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWNoYXJbXQotamF2YS5tYXRoLk1hdGhDb250ZXh0KQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLm1hdGguQmlnRGVjaW1hbCBhZGRBbmRNdWx0MTAoCi1qYXZhLm1hdGguQmlnRGVjaW1hbAotamF2YS5tYXRoLkJpZ0RlY2ltYWwKLWludCkKLQotcHJpdmF0ZSBpbnQgYXByb3hQcmVjaXNpb24oKQotCi1wcml2YXRlIHN0YXRpYyBpbnQgYml0TGVuZ3RoKAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBpbnQgYml0TGVuZ3RoKAotbG9uZykKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5tYXRoLkJpZ0RlY2ltYWwgZGl2aWRlQmlnSW50ZWdlcnMoCi1qYXZhLm1hdGguQmlnSW50ZWdlcgotamF2YS5tYXRoLkJpZ0ludGVnZXIKLWludAotamF2YS5tYXRoLlJvdW5kaW5nTW9kZSkKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5tYXRoLkJpZ0RlY2ltYWwgZGl2aWRlUHJpbWl0aXZlTG9uZ3MoCi1sb25nCi1sb25nCi1pbnQKLWphdmEubWF0aC5Sb3VuZGluZ01vZGUpCi0KLXByaXZhdGUgamF2YS5tYXRoLkJpZ0ludGVnZXIgZ2V0VW5zY2FsZWRWYWx1ZSgpCi0KLXByaXZhdGUgdm9pZCBpbnBsYWNlUm91bmQoCi1qYXZhLm1hdGguTWF0aENvbnRleHQpCi0KLXByaXZhdGUgYm9vbGVhbiBpc1plcm8oKQotCi1wcml2YXRlIHN0YXRpYyBpbnQgbG9uZ0NvbXBhcmVUbygKLWxvbmcKLWxvbmcpCi0KLXByaXZhdGUgamF2YS5tYXRoLkJpZ0RlY2ltYWwgbW92ZVBvaW50KAotbG9uZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9sYW5nL0NsYXNzTm90Rm91bmRFeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCByZWFkT2JqZWN0KAotamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSkKLQotcHJpdmF0ZSBzdGF0aWMgaW50IHJvdW5kaW5nQmVoYXZpb3IoCi1pbnQKLWludAotamF2YS5tYXRoLlJvdW5kaW5nTW9kZSkKLQotcHJpdmF0ZSB2b2lkIHNldFVuc2NhbGVkVmFsdWUoCi1qYXZhLm1hdGguQmlnSW50ZWdlcikKLQotcHJpdmF0ZSB2b2lkIHNtYWxsUm91bmQoCi1qYXZhLm1hdGguTWF0aENvbnRleHQKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgaW50IHRvSW50U2NhbGUoCi1sb25nKQotCi1wcml2YXRlIGxvbmcgdmFsdWVFeGFjdCgKLWludCkKLQotcHVibGljIHN0YXRpYyBqYXZhLm1hdGguQmlnRGVjaW1hbCB2YWx1ZU9mKAotZG91YmxlKQotCi1wdWJsaWMgc3RhdGljIGphdmEubWF0aC5CaWdEZWNpbWFsIHZhbHVlT2YoCi1sb25nKQotCi1wdWJsaWMgc3RhdGljIGphdmEubWF0aC5CaWdEZWNpbWFsIHZhbHVlT2YoCi1sb25nCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCB3cml0ZU9iamVjdCgKLWphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtKQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLm1hdGguQmlnRGVjaW1hbCB6ZXJvU2NhbGVkQnkoCi1sb25nKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0RlY2ltYWwgYWJzKCkKLQotcHVibGljIGphdmEubWF0aC5CaWdEZWNpbWFsIGFicygKLWphdmEubWF0aC5NYXRoQ29udGV4dCkKLQotcHVibGljIGphdmEubWF0aC5CaWdEZWNpbWFsIGFkZCgKLWphdmEubWF0aC5CaWdEZWNpbWFsKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0RlY2ltYWwgYWRkKAotamF2YS5tYXRoLkJpZ0RlY2ltYWwKLWphdmEubWF0aC5NYXRoQ29udGV4dCkKLQotcHVibGljIGJ5dGUgYnl0ZVZhbHVlRXhhY3QoKQotCi1wdWJsaWMgdm9sYXRpbGUgaW50IGNvbXBhcmVUbygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBpbnQgY29tcGFyZVRvKAotamF2YS5tYXRoLkJpZ0RlY2ltYWwpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnRGVjaW1hbCBkaXZpZGUoCi1qYXZhLm1hdGguQmlnRGVjaW1hbCkKLQotcHVibGljIGphdmEubWF0aC5CaWdEZWNpbWFsIGRpdmlkZSgKLWphdmEubWF0aC5CaWdEZWNpbWFsCi1pbnQpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnRGVjaW1hbCBkaXZpZGUoCi1qYXZhLm1hdGguQmlnRGVjaW1hbAotaW50Ci1pbnQpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnRGVjaW1hbCBkaXZpZGUoCi1qYXZhLm1hdGguQmlnRGVjaW1hbAotaW50Ci1qYXZhLm1hdGguUm91bmRpbmdNb2RlKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0RlY2ltYWwgZGl2aWRlKAotamF2YS5tYXRoLkJpZ0RlY2ltYWwKLWphdmEubWF0aC5NYXRoQ29udGV4dCkKLQotcHVibGljIGphdmEubWF0aC5CaWdEZWNpbWFsIGRpdmlkZSgKLWphdmEubWF0aC5CaWdEZWNpbWFsCi1qYXZhLm1hdGguUm91bmRpbmdNb2RlKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0RlY2ltYWxbXSBkaXZpZGVBbmRSZW1haW5kZXIoCi1qYXZhLm1hdGguQmlnRGVjaW1hbCkKLQotcHVibGljIGphdmEubWF0aC5CaWdEZWNpbWFsW10gZGl2aWRlQW5kUmVtYWluZGVyKAotamF2YS5tYXRoLkJpZ0RlY2ltYWwKLWphdmEubWF0aC5NYXRoQ29udGV4dCkKLQotcHVibGljIGphdmEubWF0aC5CaWdEZWNpbWFsIGRpdmlkZVRvSW50ZWdyYWxWYWx1ZSgKLWphdmEubWF0aC5CaWdEZWNpbWFsKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0RlY2ltYWwgZGl2aWRlVG9JbnRlZ3JhbFZhbHVlKAotamF2YS5tYXRoLkJpZ0RlY2ltYWwKLWphdmEubWF0aC5NYXRoQ29udGV4dCkKLQotcHVibGljIGRvdWJsZSBkb3VibGVWYWx1ZSgpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBmbG9hdCBmbG9hdFZhbHVlKCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLXB1YmxpYyBpbnQgaW50VmFsdWUoKQotCi1wdWJsaWMgaW50IGludFZhbHVlRXhhY3QoKQotCi1wdWJsaWMgbG9uZyBsb25nVmFsdWUoKQotCi1wdWJsaWMgbG9uZyBsb25nVmFsdWVFeGFjdCgpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnRGVjaW1hbCBtYXgoCi1qYXZhLm1hdGguQmlnRGVjaW1hbCkKLQotcHVibGljIGphdmEubWF0aC5CaWdEZWNpbWFsIG1pbigKLWphdmEubWF0aC5CaWdEZWNpbWFsKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0RlY2ltYWwgbW92ZVBvaW50TGVmdCgKLWludCkKLQotcHVibGljIGphdmEubWF0aC5CaWdEZWNpbWFsIG1vdmVQb2ludFJpZ2h0KAotaW50KQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0RlY2ltYWwgbXVsdGlwbHkoCi1qYXZhLm1hdGguQmlnRGVjaW1hbCkKLQotcHVibGljIGphdmEubWF0aC5CaWdEZWNpbWFsIG11bHRpcGx5KAotamF2YS5tYXRoLkJpZ0RlY2ltYWwKLWphdmEubWF0aC5NYXRoQ29udGV4dCkKLQotcHVibGljIGphdmEubWF0aC5CaWdEZWNpbWFsIG5lZ2F0ZSgpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnRGVjaW1hbCBuZWdhdGUoCi1qYXZhLm1hdGguTWF0aENvbnRleHQpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnRGVjaW1hbCBwbHVzKCkKLQotcHVibGljIGphdmEubWF0aC5CaWdEZWNpbWFsIHBsdXMoCi1qYXZhLm1hdGguTWF0aENvbnRleHQpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnRGVjaW1hbCBwb3coCi1pbnQpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnRGVjaW1hbCBwb3coCi1pbnQKLWphdmEubWF0aC5NYXRoQ29udGV4dCkKLQotcHVibGljIGludCBwcmVjaXNpb24oKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0RlY2ltYWwgcmVtYWluZGVyKAotamF2YS5tYXRoLkJpZ0RlY2ltYWwpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnRGVjaW1hbCByZW1haW5kZXIoCi1qYXZhLm1hdGguQmlnRGVjaW1hbAotamF2YS5tYXRoLk1hdGhDb250ZXh0KQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0RlY2ltYWwgcm91bmQoCi1qYXZhLm1hdGguTWF0aENvbnRleHQpCi0KLXB1YmxpYyBpbnQgc2NhbGUoKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0RlY2ltYWwgc2NhbGVCeVBvd2VyT2ZUZW4oCi1pbnQpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnRGVjaW1hbCBzZXRTY2FsZSgKLWludCkKLQotcHVibGljIGphdmEubWF0aC5CaWdEZWNpbWFsIHNldFNjYWxlKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnRGVjaW1hbCBzZXRTY2FsZSgKLWludAotamF2YS5tYXRoLlJvdW5kaW5nTW9kZSkKLQotcHVibGljIHNob3J0IHNob3J0VmFsdWVFeGFjdCgpCi0KLXB1YmxpYyBpbnQgc2lnbnVtKCkKLQotcHVibGljIGphdmEubWF0aC5CaWdEZWNpbWFsIHN0cmlwVHJhaWxpbmdaZXJvcygpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnRGVjaW1hbCBzdWJ0cmFjdCgKLWphdmEubWF0aC5CaWdEZWNpbWFsKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0RlY2ltYWwgc3VidHJhY3QoCi1qYXZhLm1hdGguQmlnRGVjaW1hbAotamF2YS5tYXRoLk1hdGhDb250ZXh0KQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgdG9CaWdJbnRlZ2VyKCkKLQotcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIHRvQmlnSW50ZWdlckV4YWN0KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9FbmdpbmVlcmluZ1N0cmluZygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvUGxhaW5TdHJpbmcoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnRGVjaW1hbCB1bHAoKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgdW5zY2FsZWRWYWx1ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvbWF0aC9CaWdJbnQ7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1Db250ZXh0ICkKLSBjbGFzcyBqYXZhLm1hdGguQmlnSW50JENvbnRleHQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBpbnQgYm5jdHgKLQotZmluYWwgamF2YS5tYXRoLkJpZ0ludCB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLm1hdGguQmlnSW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGphdmEvbWF0aC9CaWdJbnQkQ29udGV4dDsgKQotIGNsYXNzIGphdmEubWF0aC5CaWdJbnQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBqYXZhLm1hdGguQmlnSW50JENvbnRleHQgZGVmYXVsdENvbnRleHQKLQotc3RhdGljIGphdmEubWF0aC5CaWdJbnQgZHVtbXkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0KLXRyYW5zaWVudCBpbnQgYmlnbnVtCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi0gdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIHN0YXRpYyB2b2lkIENoZWNrKAotYm9vbGVhbikKLQotcHVibGljIHN0YXRpYyBqYXZhLm1hdGguQmlnSW50IGFkZGl0aW9uKAotamF2YS5tYXRoLkJpZ0ludAotamF2YS5tYXRoLkJpZ0ludCkKLQotcHVibGljIHN0YXRpYyBqYXZhLm1hdGguQmlnSW50IGJpZ0V4cCgKLWphdmEubWF0aC5CaWdJbnQKLWphdmEubWF0aC5CaWdJbnQKLWphdmEubWF0aC5CaWdJbnQkQ29udGV4dCkKLQotcHVibGljIHN0YXRpYyBpbnQgY21wKAotamF2YS5tYXRoLkJpZ0ludAotamF2YS5tYXRoLkJpZ0ludCkKLQotcHVibGljIHN0YXRpYyBpbnQgY29uc3VtZUVycm9ycygKLWphdmEubGFuZy5TdHJpbmdCdWlsZGVyKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgZGl2aXNpb24oCi1qYXZhLm1hdGguQmlnSW50Ci1qYXZhLm1hdGguQmlnSW50Ci1qYXZhLm1hdGguQmlnSW50JENvbnRleHQKLWphdmEubWF0aC5CaWdJbnQKLWphdmEubWF0aC5CaWdJbnQpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5tYXRoLkJpZ0ludCBleHAoCi1qYXZhLm1hdGguQmlnSW50Ci1pbnQKLWphdmEubWF0aC5CaWdJbnQkQ29udGV4dCkKLQotcHVibGljIHN0YXRpYyBqYXZhLm1hdGguQmlnSW50IGdjZCgKLWphdmEubWF0aC5CaWdJbnQKLWphdmEubWF0aC5CaWdJbnQKLWphdmEubWF0aC5CaWdJbnQkQ29udGV4dCkKLQotcHVibGljIHN0YXRpYyBqYXZhLm1hdGguQmlnSW50IGdlbmVyYXRlUHJpbWVEZWZhdWx0KAotaW50Ci1qYXZhLnV0aWwuUmFuZG9tCi1qYXZhLm1hdGguQmlnSW50JENvbnRleHQpCi0KLXN0YXRpYyBpbnQgZ2V0Q3R4KAotamF2YS5tYXRoLkJpZ0ludCRDb250ZXh0KQotCi1wcml2YXRlIHZvaWQgbWFrZVZhbGlkKCkKLQotcHVibGljIHN0YXRpYyBqYXZhLm1hdGguQmlnSW50IG1vZEV4cCgKLWphdmEubWF0aC5CaWdJbnQKLWphdmEubWF0aC5CaWdJbnQKLWphdmEubWF0aC5CaWdJbnQKLWphdmEubWF0aC5CaWdJbnQkQ29udGV4dCkKLQotcHVibGljIHN0YXRpYyBqYXZhLm1hdGguQmlnSW50IG1vZEludmVyc2UoCi1qYXZhLm1hdGguQmlnSW50Ci1qYXZhLm1hdGguQmlnSW50Ci1qYXZhLm1hdGguQmlnSW50JENvbnRleHQpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5tYXRoLkJpZ0ludCBtb2R1bHVzKAotamF2YS5tYXRoLkJpZ0ludAotamF2YS5tYXRoLkJpZ0ludAotamF2YS5tYXRoLkJpZ0ludCRDb250ZXh0KQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLm1hdGguQmlnSW50IG5ld0JpZ0ludCgpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5tYXRoLkJpZ0ludCBwcm9kdWN0KAotamF2YS5tYXRoLkJpZ0ludAotamF2YS5tYXRoLkJpZ0ludAotamF2YS5tYXRoLkJpZ0ludCRDb250ZXh0KQotCi1wdWJsaWMgc3RhdGljIGludCByZW1haW5kZXJCeVBvc2l0aXZlSW50KAotamF2YS5tYXRoLkJpZ0ludAotaW50KQotCi1wdWJsaWMgc3RhdGljIGphdmEubWF0aC5CaWdJbnQgc2hpZnQoCi1qYXZhLm1hdGguQmlnSW50Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5tYXRoLkJpZ0ludCBzdWJ0cmFjdGlvbigKLWphdmEubWF0aC5CaWdJbnQKLWphdmEubWF0aC5CaWdJbnQpCi0KLXB1YmxpYyB2b2lkIGFkZCgKLWphdmEubWF0aC5CaWdJbnQpCi0KLXB1YmxpYyB2b2lkIGFkZFBvc2l0aXZlSW50KAotaW50KQotCi1wdWJsaWMgYnl0ZVtdIGJpZ0VuZGlhbk1hZ25pdHVkZSgpCi0KLXB1YmxpYyBieXRlW10gYmlnRW5kaWFuVHdvc0NvbXBsZW1lbnQoKQotCi1wdWJsaWMgaW50IGJpdExlbmd0aCgpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50IGNvcHkoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBkZWNTdHJpbmcoKQotCi1wdWJsaWMgdm9pZCBkaXNwb3NlKCkKLQotcHVibGljIGludCBkaXZpZGVCeVBvc2l0aXZlSW50KAotaW50KQotCi1wcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpCi0KLXB1YmxpYyBpbnQgZ2V0TmF0aXZlQklHTlVNKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgaGV4U3RyaW5nKCkKLQotcHVibGljIGJvb2xlYW4gaXNCaXRTZXQoCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIGlzUHJpbWUoCi1pbnQKLWphdmEudXRpbC5SYW5kb20KLWphdmEubWF0aC5CaWdJbnQkQ29udGV4dCkKLQotcHVibGljIGludFtdIGxpdHRsZUVuZGlhbkludHNNYWduaXR1ZGUoKQotCi1wdWJsaWMgbG9uZyBsb25nSW50KCkKLQotcHVibGljIHZvaWQgbW9kaWZ5Qml0KAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIG11bHRpcGx5QnkoCi1qYXZhLm1hdGguQmlnSW50Ci1qYXZhLm1hdGguQmlnSW50JENvbnRleHQpCi0KLXB1YmxpYyB2b2lkIG11bHRpcGx5QnlQb3NpdGl2ZUludCgKLWludCkKLQotcHVibGljIHZvaWQgcHV0QmlnRW5kaWFuKAotYnl0ZVtdCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBwdXRCaWdFbmRpYW5Ud29zQ29tcGxlbWVudCgKLWJ5dGVbXSkKLQotcHVibGljIHZvaWQgcHV0Q29weSgKLWphdmEubWF0aC5CaWdJbnQpCi0KLXB1YmxpYyB2b2lkIHB1dERlY1N0cmluZygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHB1dEhleFN0cmluZygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHB1dExpdHRsZUVuZGlhbkludHMoCi1pbnRbXQotYm9vbGVhbikKLQotcHVibGljIHZvaWQgcHV0TG9uZ0ludCgKLWxvbmcpCi0KLXB1YmxpYyB2b2lkIHB1dFVMb25nSW50KAotbG9uZwotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0U2lnbigKLWludCkKLQotcHVibGljIHZvaWQgc2hpZnQoCi1pbnQpCi0KLXB1YmxpYyBpbnQgc2lnbigpCi0KLXB1YmxpYyB2b2lkIHN1YnRyYWN0UG9zaXRpdmVJbnQoCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotcHVibGljIGJvb2xlYW4gdHdvc0NvbXBGaXRzSW50b0J5dGVzKAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL051bWJlcjtMamF2YS9sYW5nL0NvbXBhcmFibGU8TGphdmEvbWF0aC9CaWdJbnRlZ2VyOz47TGphdmEvaW8vU2VyaWFsaXphYmxlOyApCi1wdWJsaWMgY2xhc3MgamF2YS5tYXRoLkJpZ0ludGVnZXIgZXh0ZW5kcyBqYXZhLmxhbmcuTnVtYmVyIGltcGxlbWVudHMgamF2YS5sYW5nLkNvbXBhcmFibGUsIGphdmEuaW8uU2VyaWFsaXphYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBmaW5hbCBpbnQgRVFVQUxTCi0KLXN0YXRpYyBmaW5hbCBpbnQgR1JFQVRFUgotCi1zdGF0aWMgZmluYWwgaW50IExFU1MKLQotc3RhdGljIGZpbmFsIGphdmEubWF0aC5CaWdJbnRlZ2VyIE1JTlVTX09ORQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubWF0aC5CaWdJbnRlZ2VyIE9ORQotCi1zdGF0aWMgZmluYWwgamF2YS5tYXRoLkJpZ0ludGVnZXJbXSBTTUFMTF9WQUxVRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLm1hdGguQmlnSW50ZWdlciBURU4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLm1hdGguQmlnSW50ZWdlciBaRVJPCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotCi10cmFuc2llbnQgamF2YS5tYXRoLkJpZ0ludCBiaWdJbnQKLQotcHJpdmF0ZSB0cmFuc2llbnQgYm9vbGVhbiBiaWdJbnRJc1ZhbGlkCi0KLXRyYW5zaWVudCBpbnRbXSBkaWdpdHMKLQotcHJpdmF0ZSB0cmFuc2llbnQgaW50IGZpcnN0Tm9uemVyb0RpZ2l0Ci0KLXByaXZhdGUgdHJhbnNpZW50IGludCBoYXNoQ29kZQotCi1wcml2YXRlIGJ5dGVbXSBtYWduaXR1ZGUKLQotdHJhbnNpZW50IGludCBudW1iZXJMZW5ndGgKLQotcHJpdmF0ZSB0cmFuc2llbnQgYm9vbGVhbiBvbGRSZXBySXNWYWxpZAotCi10cmFuc2llbnQgaW50IHNpZ24KLQotcHJpdmF0ZSBpbnQgc2lnbnVtCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWludAotamF2YS51dGlsLlJhbmRvbSkKLQotIHZvaWQgPGluaXQ+KAotaW50Ci1pbnQKLWludFtdKQotCi0gdm9pZCA8aW5pdD4oCi1pbnQKLWxvbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotamF2YS51dGlsLlJhbmRvbSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50Ci1ieXRlW10pCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotIHZvaWQgPGluaXQ+KAotamF2YS5tYXRoLkJpZ0ludCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYnl0ZVtdKQotCi1zdGF0aWMgaW50IGlucGxhY2VBZGQoCi1pbnRbXQotaW50Ci1pbnQpCi0KLXN0YXRpYyBpbnQgbXVsdGlwbHlCeUludCgKLWludFtdCi1pbnRbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgcHJvYmFibGVQcmltZSgKLWludAotamF2YS51dGlsLlJhbmRvbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9sYW5nL0NsYXNzTm90Rm91bmRFeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCByZWFkT2JqZWN0KAotamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSkKLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRGcm9tU3RyaW5nKAotamF2YS5tYXRoLkJpZ0ludGVnZXIKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHJpdmF0ZSBieXRlW10gdHdvc0NvbXBsZW1lbnQoKQotCi1zdGF0aWMgdm9pZCB2YWxpZGF0ZTEoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLm1hdGguQmlnSW50ZWdlcikKLQotc3RhdGljIHZvaWQgdmFsaWRhdGUyKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5tYXRoLkJpZ0ludGVnZXIKLWphdmEubWF0aC5CaWdJbnRlZ2VyKQotCi1zdGF0aWMgdm9pZCB2YWxpZGF0ZTMoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLm1hdGguQmlnSW50ZWdlcgotamF2YS5tYXRoLkJpZ0ludGVnZXIKLWphdmEubWF0aC5CaWdJbnRlZ2VyKQotCi1zdGF0aWMgdm9pZCB2YWxpZGF0ZTQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLm1hdGguQmlnSW50ZWdlcgotamF2YS5tYXRoLkJpZ0ludGVnZXIKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1qYXZhLm1hdGguQmlnSW50ZWdlcikKLQotcHVibGljIHN0YXRpYyBqYXZhLm1hdGguQmlnSW50ZWdlciB2YWx1ZU9mKAotbG9uZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KAotamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0pCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBhYnMoKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgYWRkKAotamF2YS5tYXRoLkJpZ0ludGVnZXIpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBhbmQoCi1qYXZhLm1hdGguQmlnSW50ZWdlcikKLQotcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGFuZE5vdCgKLWphdmEubWF0aC5CaWdJbnRlZ2VyKQotCi1wdWJsaWMgaW50IGJpdENvdW50KCkKLQotcHVibGljIGludCBiaXRMZW5ndGgoKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgY2xlYXJCaXQoCi1pbnQpCi0KLXB1YmxpYyB2b2xhdGlsZSBpbnQgY29tcGFyZVRvKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGludCBjb21wYXJlVG8oCi1qYXZhLm1hdGguQmlnSW50ZWdlcikKLQotIGphdmEubWF0aC5CaWdJbnRlZ2VyIGNvcHkoKQotCi1maW5hbCB2b2lkIGN1dE9mZkxlYWRpbmdaZXJvZXMoKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgZGl2aWRlKAotamF2YS5tYXRoLkJpZ0ludGVnZXIpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlcltdIGRpdmlkZUFuZFJlbWFpbmRlcigKLWphdmEubWF0aC5CaWdJbnRlZ2VyKQotCi1wdWJsaWMgZG91YmxlIGRvdWJsZVZhbHVlKCkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotIHZvaWQgZXN0YWJsaXNoT2xkUmVwcmVzZW50YXRpb24oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgZmxpcEJpdCgKLWludCkKLQotcHVibGljIGZsb2F0IGZsb2F0VmFsdWUoKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgZ2NkKAotamF2YS5tYXRoLkJpZ0ludGVnZXIpCi0KLSBpbnQgZ2V0Rmlyc3ROb256ZXJvRGlnaXQoKQotCi1wdWJsaWMgaW50IGdldExvd2VzdFNldEJpdCgpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1wdWJsaWMgaW50IGludFZhbHVlKCkKLQotIGJvb2xlYW4gaXNPbmUoKQotCi1wdWJsaWMgYm9vbGVhbiBpc1Byb2JhYmxlUHJpbWUoCi1pbnQpCi0KLXB1YmxpYyBsb25nIGxvbmdWYWx1ZSgpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBtYXgoCi1qYXZhLm1hdGguQmlnSW50ZWdlcikKLQotcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIG1pbigKLWphdmEubWF0aC5CaWdJbnRlZ2VyKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgbW9kKAotamF2YS5tYXRoLkJpZ0ludGVnZXIpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBtb2RJbnZlcnNlKAotamF2YS5tYXRoLkJpZ0ludGVnZXIpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBtb2RQb3coCi1qYXZhLm1hdGguQmlnSW50ZWdlcgotamF2YS5tYXRoLkJpZ0ludGVnZXIpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBtdWx0aXBseSgKLWphdmEubWF0aC5CaWdJbnRlZ2VyKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgbmVnYXRlKCkKLQotcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIG5leHRQcm9iYWJsZVByaW1lKCkKLQotcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIG5vdCgpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBvcigKLWphdmEubWF0aC5CaWdJbnRlZ2VyKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgcG93KAotaW50KQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgcmVtYWluZGVyKAotamF2YS5tYXRoLkJpZ0ludGVnZXIpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBzZXRCaXQoCi1pbnQpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBzaGlmdExlZnQoCi1pbnQpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBzaGlmdFJpZ2h0KAotaW50KQotCi1wdWJsaWMgaW50IHNpZ251bSgpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBzdWJ0cmFjdCgKLWphdmEubWF0aC5CaWdJbnRlZ2VyKQotCi1wdWJsaWMgYm9vbGVhbiB0ZXN0Qml0KAotaW50KQotCi1wdWJsaWMgYnl0ZVtdIHRvQnl0ZUFycmF5KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygKLWludCkKLQotIHZvaWQgdW5DYWNoZSgpCi0KLSB2b2lkIHZhbGlkYXRlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotIGphdmEubWF0aC5CaWdJbnRlZ2VyIHdpdGhOZXdSZXByZXNlbnRhdGlvbigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciB4b3IoCi1qYXZhLm1hdGguQmlnSW50ZWdlcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLSBjbGFzcyBqYXZhLm1hdGguQml0TGV2ZWwgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLXN0YXRpYyBpbnQgYml0Q291bnQoCi1qYXZhLm1hdGguQmlnSW50ZWdlcikKLQotc3RhdGljIGludCBiaXRMZW5ndGgoCi1qYXZhLm1hdGguQmlnSW50ZWdlcikKLQotc3RhdGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGZsaXBCaXQoCi1qYXZhLm1hdGguQmlnSW50ZWdlcgotaW50KQotCi1zdGF0aWMgdm9pZCBpbnBsYWNlU2hpZnRSaWdodCgKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1pbnQpCi0KLXN0YXRpYyBib29sZWFuIG5vblplcm9Ecm9wcGVkQml0cygKLWludAotaW50W10pCi0KLXN0YXRpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBzaGlmdFJpZ2h0KAotamF2YS5tYXRoLkJpZ0ludGVnZXIKLWludCkKLQotc3RhdGljIGJvb2xlYW4gc2hpZnRSaWdodCgKLWludFtdCi1pbnQKLWludFtdCi1pbnQKLWludCkKLQotc3RhdGljIGJvb2xlYW4gdGVzdEJpdCgKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi0gY2xhc3MgamF2YS5tYXRoLkNvbnZlcnNpb24gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBmaW5hbCBpbnRbXSBiaWdSYWRpY2VzCi0KLXN0YXRpYyBmaW5hbCBpbnRbXSBkaWdpdEZpdEluSW50Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotc3RhdGljIGRvdWJsZSBiaWdJbnRlZ2VyMkRvdWJsZSgKLWphdmEubWF0aC5CaWdJbnRlZ2VyKQotCi1zdGF0aWMgamF2YS5sYW5nLlN0cmluZyBiaWdJbnRlZ2VyMlN0cmluZygKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1pbnQpCi0KLXN0YXRpYyBsb25nIGRpdmlkZUxvbmdCeUJpbGxpb24oCi1sb25nKQotCi1zdGF0aWMgamF2YS5sYW5nLlN0cmluZyB0b0RlY2ltYWxTY2FsZWRTdHJpbmcoCi1sb25nCi1pbnQpCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIHRvRGVjaW1hbFNjYWxlZFN0cmluZygKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi0gY2xhc3MgamF2YS5tYXRoLkRpdmlzaW9uIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXN0YXRpYyBqYXZhLm1hdGguQmlnSW50ZWdlcltdIGRpdmlkZUFuZFJlbWFpbmRlckJ5SW50ZWdlcigKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1pbnQKLWludCkKLQotc3RhdGljIGludCBkaXZpZGVBcnJheUJ5SW50KAotaW50W10KLWludFtdCi1pbnQKLWludCkKLQotc3RhdGljIGxvbmcgZGl2aWRlTG9uZ0J5SW50KAotbG9uZwotaW50KQotCi1zdGF0aWMgaW50IHJlbWFpbmRlcigKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1pbnQpCi0KLXN0YXRpYyBpbnQgcmVtYWluZGVyQXJyYXlCeUludCgKLWludFtdCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLSBjbGFzcyBqYXZhLm1hdGguTG9naWNhbCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotc3RhdGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGFuZCgKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1qYXZhLm1hdGguQmlnSW50ZWdlcikKLQotc3RhdGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGFuZERpZmZTaWducygKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1qYXZhLm1hdGguQmlnSW50ZWdlcikKLQotc3RhdGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGFuZE5lZ2F0aXZlKAotamF2YS5tYXRoLkJpZ0ludGVnZXIKLWphdmEubWF0aC5CaWdJbnRlZ2VyKQotCi1zdGF0aWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgYW5kTm90KAotamF2YS5tYXRoLkJpZ0ludGVnZXIKLWphdmEubWF0aC5CaWdJbnRlZ2VyKQotCi1zdGF0aWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgYW5kTm90TmVnYXRpdmUoCi1qYXZhLm1hdGguQmlnSW50ZWdlcgotamF2YS5tYXRoLkJpZ0ludGVnZXIpCi0KLXN0YXRpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBhbmROb3ROZWdhdGl2ZVBvc2l0aXZlKAotamF2YS5tYXRoLkJpZ0ludGVnZXIKLWphdmEubWF0aC5CaWdJbnRlZ2VyKQotCi1zdGF0aWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgYW5kTm90UG9zaXRpdmUoCi1qYXZhLm1hdGguQmlnSW50ZWdlcgotamF2YS5tYXRoLkJpZ0ludGVnZXIpCi0KLXN0YXRpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBhbmROb3RQb3NpdGl2ZU5lZ2F0aXZlKAotamF2YS5tYXRoLkJpZ0ludGVnZXIKLWphdmEubWF0aC5CaWdJbnRlZ2VyKQotCi1zdGF0aWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgYW5kUG9zaXRpdmUoCi1qYXZhLm1hdGguQmlnSW50ZWdlcgotamF2YS5tYXRoLkJpZ0ludGVnZXIpCi0KLXN0YXRpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBub3QoCi1qYXZhLm1hdGguQmlnSW50ZWdlcikKLQotc3RhdGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIG9yKAotamF2YS5tYXRoLkJpZ0ludGVnZXIKLWphdmEubWF0aC5CaWdJbnRlZ2VyKQotCi1zdGF0aWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgb3JEaWZmU2lnbnMoCi1qYXZhLm1hdGguQmlnSW50ZWdlcgotamF2YS5tYXRoLkJpZ0ludGVnZXIpCi0KLXN0YXRpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBvck5lZ2F0aXZlKAotamF2YS5tYXRoLkJpZ0ludGVnZXIKLWphdmEubWF0aC5CaWdJbnRlZ2VyKQotCi1zdGF0aWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgb3JQb3NpdGl2ZSgKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1qYXZhLm1hdGguQmlnSW50ZWdlcikKLQotc3RhdGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIHhvcigKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1qYXZhLm1hdGguQmlnSW50ZWdlcikKLQotc3RhdGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIHhvckRpZmZTaWducygKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1qYXZhLm1hdGguQmlnSW50ZWdlcikKLQotc3RhdGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIHhvck5lZ2F0aXZlKAotamF2YS5tYXRoLkJpZ0ludGVnZXIKLWphdmEubWF0aC5CaWdJbnRlZ2VyKQotCi1zdGF0aWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgeG9yUG9zaXRpdmUoCi1qYXZhLm1hdGguQmlnSW50ZWdlcgotamF2YS5tYXRoLkJpZ0ludGVnZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgamF2YS5tYXRoLk1hdGhDb250ZXh0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5tYXRoLk1hdGhDb250ZXh0IERFQ0lNQUwxMjgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLm1hdGguTWF0aENvbnRleHQgREVDSU1BTDMyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5tYXRoLk1hdGhDb250ZXh0IERFQ0lNQUw2NAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubWF0aC5NYXRoQ29udGV4dCBVTkxJTUlURUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIGNoUHJlY2lzaW9uCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBjaFJvdW5kaW5nTW9kZQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSBpbnQgcHJlY2lzaW9uCi0KLXByaXZhdGUgamF2YS5tYXRoLlJvdW5kaW5nTW9kZSByb3VuZGluZ01vZGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50Ci1qYXZhLm1hdGguUm91bmRpbmdNb2RlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL2xhbmcvQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoCi1qYXZhLmlvLk9iamVjdElucHV0U3RyZWFtKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50IGdldFByZWNpc2lvbigpCi0KLXB1YmxpYyBqYXZhLm1hdGguUm91bmRpbmdNb2RlIGdldFJvdW5kaW5nTW9kZSgpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi0gY2xhc3MgamF2YS5tYXRoLk11bHRpcGxpY2F0aW9uIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgamF2YS5tYXRoLkJpZ0ludGVnZXJbXSBiaWdGaXZlUG93cwotCi1zdGF0aWMgZmluYWwgamF2YS5tYXRoLkJpZ0ludGVnZXJbXSBiaWdUZW5Qb3dzCi0KLXN0YXRpYyBmaW5hbCBpbnRbXSBmaXZlUG93cwotCi1zdGF0aWMgZmluYWwgaW50W10gdGVuUG93cwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLXN0YXRpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBtdWx0aXBseUJ5Rml2ZVBvdygKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1pbnQpCi0KLXN0YXRpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBtdWx0aXBseUJ5UG9zaXRpdmVJbnQoCi1qYXZhLm1hdGguQmlnSW50ZWdlcgotaW50KQotCi1zdGF0aWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgbXVsdGlwbHlCeVRlblBvdygKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1sb25nKQotCi1zdGF0aWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgcG93ZXJPZjEwKAotbG9uZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLSBjbGFzcyBqYXZhLm1hdGguUHJpbWFsaXR5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLm1hdGguQmlnSW50ZWdlcltdIEJJcHJpbWVzCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIHByaW1lcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLXN0YXRpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBuZXh0UHJvYmFibGVQcmltZSgKLWphdmEubWF0aC5CaWdJbnRlZ2VyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL0VudW08TGphdmEvbWF0aC9Sb3VuZGluZ01vZGU7PjsgKQotcHVibGljIGZpbmFsIGNsYXNzIGphdmEubWF0aC5Sb3VuZGluZ01vZGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLm1hdGguUm91bmRpbmdNb2RlW10gJFZBTFVFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubWF0aC5Sb3VuZGluZ01vZGUgQ0VJTElORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubWF0aC5Sb3VuZGluZ01vZGUgRE9XTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubWF0aC5Sb3VuZGluZ01vZGUgRkxPT1IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLm1hdGguUm91bmRpbmdNb2RlIEhBTEZfRE9XTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubWF0aC5Sb3VuZGluZ01vZGUgSEFMRl9FVkVOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5tYXRoLlJvdW5kaW5nTW9kZSBIQUxGX1VQCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5tYXRoLlJvdW5kaW5nTW9kZSBVTk5FQ0VTU0FSWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubWF0aC5Sb3VuZGluZ01vZGUgVVAKLQotcHJpdmF0ZSBmaW5hbCBpbnQgYmlnRGVjaW1hbFJNCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJKVYgKQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIGphdmEubWF0aC5Sb3VuZGluZ01vZGUgdmFsdWVPZigKLWludCkKLQotcHVibGljIHN0YXRpYyBqYXZhLm1hdGguUm91bmRpbmdNb2RlIHZhbHVlT2YoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGphdmEubWF0aC5Sb3VuZGluZ01vZGVbXSB2YWx1ZXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTY0MDkgbmFtZSA9UmVxdWVzdG9yVHlwZSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS9uZXQvQXV0aGVudGljYXRvcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvRW51bTxMamF2YS9uZXQvQXV0aGVudGljYXRvciRSZXF1ZXN0b3JUeXBlOz47ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBqYXZhLm5ldC5BdXRoZW50aWNhdG9yJFJlcXVlc3RvclR5cGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLm5ldC5BdXRoZW50aWNhdG9yJFJlcXVlc3RvclR5cGVbXSAkVkFMVUVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5uZXQuQXV0aGVudGljYXRvciRSZXF1ZXN0b3JUeXBlIFBST1hZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5uZXQuQXV0aGVudGljYXRvciRSZXF1ZXN0b3JUeXBlIFNFUlZFUgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVYgKQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIHN0YXRpYyBqYXZhLm5ldC5BdXRoZW50aWNhdG9yJFJlcXVlc3RvclR5cGUgdmFsdWVPZigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5uZXQuQXV0aGVudGljYXRvciRSZXF1ZXN0b3JUeXBlW10gdmFsdWVzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxqYXZhL25ldC9BdXRoZW50aWNhdG9yJFJlcXVlc3RvclR5cGU7ICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZhLm5ldC5BdXRoZW50aWNhdG9yIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLm5ldC5OZXRQZXJtaXNzaW9uIHJlcXVlc3RQYXNzd29yZEF1dGhlbnRpY2F0aW9uUGVybWlzc2lvbgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLm5ldC5OZXRQZXJtaXNzaW9uIHNldERlZmF1bHRBdXRoZW50aWNhdG9yUGVybWlzc2lvbgotCi1wcml2YXRlIHN0YXRpYyBqYXZhLm5ldC5BdXRoZW50aWNhdG9yIHRoaXNBdXRoZW50aWNhdG9yCi0KLXByaXZhdGUgamF2YS5uZXQuSW5ldEFkZHJlc3MgYWRkcgotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgaG9zdAotCi1wcml2YXRlIGludCBwb3J0Ci0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBwcm9tcHQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHByb3RvY29sCi0KLXByaXZhdGUgamF2YS5uZXQuQXV0aGVudGljYXRvciRSZXF1ZXN0b3JUeXBlIHJ0Ci0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBzY2hlbWUKLQotcHJpdmF0ZSBqYXZhLm5ldC5VUkwgdXJsCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGphdmEubmV0LlBhc3N3b3JkQXV0aGVudGljYXRpb24gcmVxdWVzdFBhc3N3b3JkQXV0aGVudGljYXRpb24oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLm5ldC5JbmV0QWRkcmVzcwotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGphdmEubmV0LlBhc3N3b3JkQXV0aGVudGljYXRpb24gcmVxdWVzdFBhc3N3b3JkQXV0aGVudGljYXRpb24oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLm5ldC5JbmV0QWRkcmVzcwotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLm5ldC5VUkwKLWphdmEubmV0LkF1dGhlbnRpY2F0b3IkUmVxdWVzdG9yVHlwZSkKLQotcHVibGljIHN0YXRpYyBqYXZhLm5ldC5QYXNzd29yZEF1dGhlbnRpY2F0aW9uIHJlcXVlc3RQYXNzd29yZEF1dGhlbnRpY2F0aW9uKAotamF2YS5uZXQuSW5ldEFkZHJlc3MKLWludAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyB2b2lkIHNldERlZmF1bHQoCi1qYXZhLm5ldC5BdXRoZW50aWNhdG9yKQotCi1wcm90ZWN0ZWQgamF2YS5uZXQuUGFzc3dvcmRBdXRoZW50aWNhdGlvbiBnZXRQYXNzd29yZEF1dGhlbnRpY2F0aW9uKCkKLQotcHJvdGVjdGVkIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgZ2V0UmVxdWVzdGluZ0hvc3QoKQotCi1wcm90ZWN0ZWQgZmluYWwgaW50IGdldFJlcXVlc3RpbmdQb3J0KCkKLQotcHJvdGVjdGVkIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgZ2V0UmVxdWVzdGluZ1Byb21wdCgpCi0KLXByb3RlY3RlZCBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGdldFJlcXVlc3RpbmdQcm90b2NvbCgpCi0KLXByb3RlY3RlZCBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGdldFJlcXVlc3RpbmdTY2hlbWUoKQotCi1wcm90ZWN0ZWQgZmluYWwgamF2YS5uZXQuSW5ldEFkZHJlc3MgZ2V0UmVxdWVzdGluZ1NpdGUoKQotCi1wcm90ZWN0ZWQgamF2YS5uZXQuVVJMIGdldFJlcXVlc3RpbmdVUkwoKQotCi1wcm90ZWN0ZWQgamF2YS5uZXQuQXV0aGVudGljYXRvciRSZXF1ZXN0b3JUeXBlIGdldFJlcXVlc3RvclR5cGUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEubmV0LlNvY2tldEV4Y2VwdGlvbiBleHRlbmRzIGphdmEuaW8uSU9FeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLm5ldC5CaW5kRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgamF2YS5uZXQuQ2FjaGVSZXF1ZXN0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGFib3J0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEuaW8uT3V0cHV0U3RyZWFtIGdldEJvZHkoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGphdmEubmV0LkNhY2hlUmVzcG9uc2UgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEuaW8uSW5wdXRTdHJlYW0gZ2V0Qm9keSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS91dGlsL0xpc3Q8TGphdmEvbGFuZy9TdHJpbmc7Pjs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnV0aWwuTWFwIGdldEhlYWRlcnMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEubmV0LkNvbm5lY3RFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLm5ldC5Tb2NrZXRFeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZhLm5ldC5Db250ZW50SGFuZGxlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLk9iamVjdCBnZXRDb250ZW50KAotamF2YS5uZXQuVVJMQ29ubmVjdGlvbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0Q29udGVudCgKLWphdmEubmV0LlVSTENvbm5lY3Rpb24KLWphdmEubGFuZy5DbGFzc1tdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZhLm5ldC5Db250ZW50SGFuZGxlckZhY3RvcnkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IGphdmEubmV0LkNvbnRlbnRIYW5kbGVyIGNyZWF0ZUNvbnRlbnRIYW5kbGVyKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZhLm5ldC5Db29raWVIYW5kbGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLm5ldC5OZXRQZXJtaXNzaW9uIGdldENvb2tpZUhhbmRsZXJQZXJtaXNzaW9uCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubmV0Lk5ldFBlcm1pc3Npb24gc2V0Q29va2llSGFuZGxlclBlcm1pc3Npb24KLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5uZXQuQ29va2llSGFuZGxlciBzeXN0ZW1XaWRlQ29va2llSGFuZGxlcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBqYXZhLm5ldC5Db29raWVIYW5kbGVyIGdldERlZmF1bHQoKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVmYXVsdCgKLWphdmEubmV0LkNvb2tpZUhhbmRsZXIpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL25ldC9VUkk7TGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvdXRpbC9MaXN0PExqYXZhL2xhbmcvU3RyaW5nOz47PjspTGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvdXRpbC9MaXN0PExqYXZhL2xhbmcvU3RyaW5nOz47PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLk1hcCBnZXQoCi1qYXZhLm5ldC5VUkkKLWphdmEudXRpbC5NYXApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL25ldC9VUkk7TGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvdXRpbC9MaXN0PExqYXZhL2xhbmcvU3RyaW5nOz47PjspViApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHB1dCgKLWphdmEubmV0LlVSSQotamF2YS51dGlsLk1hcCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBqYXZhLm5ldC5EYXRhZ3JhbVBhY2tldCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGphdmEubmV0LkluZXRBZGRyZXNzIGFkZHJlc3MKLQotIGJ5dGVbXSBkYXRhCi0KLSBpbnQgbGVuZ3RoCi0KLSBpbnQgb2Zmc2V0Ci0KLSBpbnQgcG9ydAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWJ5dGVbXQotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ieXRlW10KLWludAotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ieXRlW10KLWludAotaW50Ci1qYXZhLm5ldC5JbmV0QWRkcmVzcwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWJ5dGVbXQotaW50Ci1pbnQKLWphdmEubmV0LlNvY2tldEFkZHJlc3MpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWJ5dGVbXQotaW50Ci1qYXZhLm5ldC5JbmV0QWRkcmVzcwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWJ5dGVbXQotaW50Ci1qYXZhLm5ldC5Tb2NrZXRBZGRyZXNzKQotCi1wdWJsaWMgamF2YS5uZXQuSW5ldEFkZHJlc3MgZ2V0QWRkcmVzcygpCi0KLXB1YmxpYyBieXRlW10gZ2V0RGF0YSgpCi0KLXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkKLQotcHVibGljIGludCBnZXRPZmZzZXQoKQotCi1wdWJsaWMgaW50IGdldFBvcnQoKQotCi1wdWJsaWMgamF2YS5uZXQuU29ja2V0QWRkcmVzcyBnZXRTb2NrZXRBZGRyZXNzKCkKLQotcHVibGljIHZvaWQgc2V0QWRkcmVzcygKLWphdmEubmV0LkluZXRBZGRyZXNzKQotCi1wdWJsaWMgdm9pZCBzZXREYXRhKAotYnl0ZVtdKQotCi1wdWJsaWMgdm9pZCBzZXREYXRhKAotYnl0ZVtdCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgc2V0TGVuZ3RoKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRQb3J0KAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRTb2NrZXRBZGRyZXNzKAotamF2YS5uZXQuU29ja2V0QWRkcmVzcykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTQxMDQgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS9uZXQvRGF0YWdyYW1Tb2NrZXQ7ICkKLSBjbGFzcyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldCQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1Mb2NrICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL25ldC9EYXRhZ3JhbVNvY2tldDsgKQotIGNsYXNzIGphdmEubmV0LkRhdGFncmFtU29ja2V0JExvY2sgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLSB2b2lkIDxpbml0PigKLWphdmEubmV0LkRhdGFncmFtU29ja2V0JDEpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MamF2YS9uZXQvRGF0YWdyYW1Tb2NrZXQkMTtMamF2YS9uZXQvRGF0YWdyYW1Tb2NrZXQkTG9jazsgKQotcHVibGljIGNsYXNzIGphdmEubmV0LkRhdGFncmFtU29ja2V0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgamF2YS5uZXQuRGF0YWdyYW1Tb2NrZXRJbXBsRmFjdG9yeSBmYWN0b3J5Ci0KLSBqYXZhLm5ldC5JbmV0QWRkcmVzcyBhZGRyZXNzCi0KLSBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldEltcGwgaW1wbAotCi0gYm9vbGVhbiBpc0JvdW5kCi0KLXByaXZhdGUgYm9vbGVhbiBpc0Nsb3NlZAotCi1wcml2YXRlIGJvb2xlYW4gaXNDb25uZWN0ZWQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuT2JqZWN0IGxvY2sKLQotIGludCBwb3J0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1NvY2tldEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotamF2YS5uZXQuSW5ldEFkZHJlc3MpCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLWphdmEubmV0LkRhdGFncmFtU29ja2V0SW1wbCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvU29ja2V0RXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLm5ldC5Tb2NrZXRBZGRyZXNzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIHZvaWQgc2V0RGF0YWdyYW1Tb2NrZXRJbXBsRmFjdG9yeSgKLWphdmEubmV0LkRhdGFncmFtU29ja2V0SW1wbEZhY3RvcnkpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1NvY2tldEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgYmluZCgKLWphdmEubmV0LlNvY2tldEFkZHJlc3MpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1NvY2tldEV4Y2VwdGlvbjsgKQotIHZvaWQgY2hlY2tDbG9zZWRBbmRCaW5kKAotYm9vbGVhbikKLQotIHZvaWQgY2hlY2tMaXN0ZW4oCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGNsb3NlKCkKLQotcHVibGljIHZvaWQgY29ubmVjdCgKLWphdmEubmV0LkluZXRBZGRyZXNzCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1NvY2tldEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY29ubmVjdCgKLWphdmEubmV0LlNvY2tldEFkZHJlc3MpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1NvY2tldEV4Y2VwdGlvbjsgKQotIHZvaWQgY3JlYXRlU29ja2V0KAotaW50Ci1qYXZhLm5ldC5JbmV0QWRkcmVzcykKLQotcHVibGljIHZvaWQgZGlzY29ubmVjdCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1NvY2tldEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gZ2V0QnJvYWRjYXN0KCkKLQotcHVibGljIGphdmEubmlvLmNoYW5uZWxzLkRhdGFncmFtQ2hhbm5lbCBnZXRDaGFubmVsKCkKLQotcHVibGljIGphdmEubmV0LkluZXRBZGRyZXNzIGdldEluZXRBZGRyZXNzKCkKLQotcHVibGljIGphdmEubmV0LkluZXRBZGRyZXNzIGdldExvY2FsQWRkcmVzcygpCi0KLXB1YmxpYyBpbnQgZ2V0TG9jYWxQb3J0KCkKLQotcHVibGljIGphdmEubmV0LlNvY2tldEFkZHJlc3MgZ2V0TG9jYWxTb2NrZXRBZGRyZXNzKCkKLQotcHVibGljIGludCBnZXRQb3J0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvU29ja2V0RXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGdldFJlY2VpdmVCdWZmZXJTaXplKCkKLQotcHVibGljIGphdmEubmV0LlNvY2tldEFkZHJlc3MgZ2V0UmVtb3RlU29ja2V0QWRkcmVzcygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1NvY2tldEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gZ2V0UmV1c2VBZGRyZXNzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvU29ja2V0RXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGdldFNlbmRCdWZmZXJTaXplKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvU29ja2V0RXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGdldFNvVGltZW91dCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1NvY2tldEV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXRUcmFmZmljQ2xhc3MoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0JvdW5kKCkKLQotcHVibGljIGJvb2xlYW4gaXNDbG9zZWQoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RlZCgpCi0KLSBib29sZWFuIGlzTXVsdGljYXN0U29ja2V0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcmVjZWl2ZSgKLWphdmEubmV0LkRhdGFncmFtUGFja2V0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZW5kKAotamF2YS5uZXQuRGF0YWdyYW1QYWNrZXQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1NvY2tldEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0QnJvYWRjYXN0KAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvU29ja2V0RXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRSZWNlaXZlQnVmZmVyU2l6ZSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvU29ja2V0RXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRSZXVzZUFkZHJlc3MoCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldFNlbmRCdWZmZXJTaXplKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldFNvVGltZW91dCgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvU29ja2V0RXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRUcmFmZmljQ2xhc3MoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEubmV0LlNvY2tldE9wdGlvbnMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElQX01VTFRJQ0FTVF9JRgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJUF9NVUxUSUNBU1RfSUYyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElQX01VTFRJQ0FTVF9MT09QCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElQX1RPUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTT19CSU5EQUREUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTT19CUk9BRENBU1QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU09fS0VFUEFMSVZFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNPX0xJTkdFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTT19PT0JJTkxJTkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU09fUkNWQlVGCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNPX1JFVVNFQUREUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTT19TTkRCVUYKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU09fVElNRU9VVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQ1BfTk9ERUxBWQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1NvY2tldEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5PYmplY3QgZ2V0T3B0aW9uKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldE9wdGlvbigKLWludAotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldEltcGwgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5uZXQuU29ja2V0T3B0aW9ucwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgamF2YS5pby5GaWxlRGVzY3JpcHRvciBmZAotCi1wcm90ZWN0ZWQgaW50IGxvY2FsUG9ydAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1NvY2tldEV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYmluZCgKLWludAotamF2YS5uZXQuSW5ldEFkZHJlc3MpCi0KLXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGNsb3NlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvU29ja2V0RXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBjb25uZWN0KAotamF2YS5uZXQuSW5ldEFkZHJlc3MKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvU29ja2V0RXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBjcmVhdGUoKQotCi1wcm90ZWN0ZWQgdm9pZCBkaXNjb25uZWN0KCkKLQotcHJvdGVjdGVkIGphdmEuaW8uRmlsZURlc2NyaXB0b3IgZ2V0RmlsZURlc2NyaXB0b3IoKQotCi0gamF2YS5uZXQuSW5ldEFkZHJlc3MgZ2V0TG9jYWxBZGRyZXNzKCkKLQotcHJvdGVjdGVkIGludCBnZXRMb2NhbFBvcnQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuT2JqZWN0IGdldE9wdGlvbigKLWludCkKLUBqYXZhLmxhbmcuRGVwcmVjYXRlZAotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgYWJzdHJhY3QgYnl0ZSBnZXRUVEwoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgYWJzdHJhY3QgaW50IGdldFRpbWVUb0xpdmUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBqb2luKAotamF2YS5uZXQuSW5ldEFkZHJlc3MpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGpvaW5Hcm91cCgKLWphdmEubmV0LlNvY2tldEFkZHJlc3MKLWphdmEubmV0Lk5ldHdvcmtJbnRlcmZhY2UpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGxlYXZlKAotamF2YS5uZXQuSW5ldEFkZHJlc3MpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGxlYXZlR3JvdXAoCi1qYXZhLm5ldC5Tb2NrZXRBZGRyZXNzCi1qYXZhLm5ldC5OZXR3b3JrSW50ZXJmYWNlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgYWJzdHJhY3QgaW50IHBlZWsoCi1qYXZhLm5ldC5JbmV0QWRkcmVzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGFic3RyYWN0IGludCBwZWVrRGF0YSgKLWphdmEubmV0LkRhdGFncmFtUGFja2V0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCByZWNlaXZlKAotamF2YS5uZXQuRGF0YWdyYW1QYWNrZXQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHNlbmQoCi1qYXZhLm5ldC5EYXRhZ3JhbVBhY2tldCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvU29ja2V0RXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRPcHRpb24oCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi1AamF2YS5sYW5nLkRlcHJlY2F0ZWQKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc2V0VFRMKAotYnl0ZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc2V0VGltZVRvTGl2ZSgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgamF2YS5uZXQuRGF0YWdyYW1Tb2NrZXRJbXBsRmFjdG9yeSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5uZXQuRGF0YWdyYW1Tb2NrZXRJbXBsIGNyZWF0ZURhdGFncmFtU29ja2V0SW1wbCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEubmV0LkZpbGVOYW1lTWFwIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldENvbnRlbnRUeXBlRm9yKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLm5ldC5IdHRwUmV0cnlFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmlvLklPRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbG9jYXRpb24KLQotcHJpdmF0ZSBpbnQgcmVzcG9uc2VDb2RlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldExvY2F0aW9uKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UmVhc29uKCkKLQotcHVibGljIGludCByZXNwb25zZUNvZGUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGphdmEvbmV0L1VSTENvbm5lY3Rpb24kRGVmYXVsdENvbnRlbnRIYW5kbGVyOyApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgamF2YS5uZXQuVVJMQ29ubmVjdGlvbiBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5uZXQuQ29udGVudEhhbmRsZXJGYWN0b3J5IGNvbnRlbnRIYW5kbGVyRmFjdG9yeQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaHRhYmxlPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvT2JqZWN0Oz47ICkKLXN0YXRpYyBqYXZhLnV0aWwuSGFzaHRhYmxlIGNvbnRlbnRIYW5kbGVycwotCi1wcml2YXRlIHN0YXRpYyBib29sZWFuIGRlZmF1bHRBbGxvd1VzZXJJbnRlcmFjdGlvbgotCi1wcml2YXRlIHN0YXRpYyBib29sZWFuIGRlZmF1bHRVc2VDYWNoZXMKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5uZXQuRmlsZU5hbWVNYXAgZmlsZU5hbWVNYXAKLQotcHJvdGVjdGVkIGJvb2xlYW4gYWxsb3dVc2VySW50ZXJhY3Rpb24KLQotcHJpdmF0ZSBpbnQgY29ubmVjdFRpbWVvdXQKLQotcHJvdGVjdGVkIGJvb2xlYW4gY29ubmVjdGVkCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBjb250ZW50VHlwZQotCi0gamF2YS5uZXQuQ29udGVudEhhbmRsZXIgZGVmYXVsdEhhbmRsZXIKLQotcHJvdGVjdGVkIGJvb2xlYW4gZG9JbnB1dAotCi1wcm90ZWN0ZWQgYm9vbGVhbiBkb091dHB1dAotCi1wcm90ZWN0ZWQgbG9uZyBpZk1vZGlmaWVkU2luY2UKLQotcHJpdmF0ZSBsb25nIGxhc3RNb2RpZmllZAotCi1wcml2YXRlIGludCByZWFkVGltZW91dAotCi1wcm90ZWN0ZWQgamF2YS5uZXQuVVJMIHVybAotCi1wcm90ZWN0ZWQgYm9vbGVhbiB1c2VDYWNoZXMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLWphdmEubmV0LlVSTCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBqYXZhLm5ldC5Db250ZW50SGFuZGxlciBnZXRDb250ZW50SGFuZGxlcigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXREZWZhdWx0QWxsb3dVc2VySW50ZXJhY3Rpb24oKQotQGphdmEubGFuZy5EZXByZWNhdGVkCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RGVmYXVsdFJlcXVlc3RQcm9wZXJ0eSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5uZXQuRmlsZU5hbWVNYXAgZ2V0RmlsZU5hbWVNYXAoKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ3Vlc3NDb250ZW50VHlwZUZyb21OYW1lKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGd1ZXNzQ29udGVudFR5cGVGcm9tU3RyZWFtKAotamF2YS5pby5JbnB1dFN0cmVhbSkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHBhcnNlVHlwZVN0cmluZygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDb250ZW50SGFuZGxlckZhY3RvcnkoCi1qYXZhLm5ldC5Db250ZW50SGFuZGxlckZhY3RvcnkpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBzZXREZWZhdWx0QWxsb3dVc2VySW50ZXJhY3Rpb24oCi1ib29sZWFuKQotQGphdmEubGFuZy5EZXByZWNhdGVkCi1wdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVmYXVsdFJlcXVlc3RQcm9wZXJ0eSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRGaWxlTmFtZU1hcCgKLWphdmEubmV0LkZpbGVOYW1lTWFwKQotCi1wdWJsaWMgdm9pZCBhZGRSZXF1ZXN0UHJvcGVydHkoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBjb25uZWN0KCkKLQotcHVibGljIGJvb2xlYW4gZ2V0QWxsb3dVc2VySW50ZXJhY3Rpb24oKQotCi1wdWJsaWMgaW50IGdldENvbm5lY3RUaW1lb3V0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0Q29udGVudCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldENvbnRlbnQoCi1qYXZhLmxhbmcuQ2xhc3NbXSkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Q29udGVudEVuY29kaW5nKCkKLQotcHVibGljIGludCBnZXRDb250ZW50TGVuZ3RoKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Q29udGVudFR5cGUoKQotCi1wdWJsaWMgbG9uZyBnZXREYXRlKCkKLQotcHVibGljIGJvb2xlYW4gZ2V0RGVmYXVsdFVzZUNhY2hlcygpCi0KLXB1YmxpYyBib29sZWFuIGdldERvSW5wdXQoKQotCi1wdWJsaWMgYm9vbGVhbiBnZXREb091dHB1dCgpCi0KLXB1YmxpYyBsb25nIGdldEV4cGlyYXRpb24oKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRIZWFkZXJGaWVsZCgKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SGVhZGVyRmllbGQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgbG9uZyBnZXRIZWFkZXJGaWVsZERhdGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1sb25nKQotCi1wdWJsaWMgaW50IGdldEhlYWRlckZpZWxkSW50KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRIZWFkZXJGaWVsZEtleSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL3V0aWwvTGlzdDxMamF2YS9sYW5nL1N0cmluZzs+Oz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuTWFwIGdldEhlYWRlckZpZWxkcygpCi0KLXB1YmxpYyBsb25nIGdldElmTW9kaWZpZWRTaW5jZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmlvLklucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkKLQotcHVibGljIGxvbmcgZ2V0TGFzdE1vZGlmaWVkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuaW8uT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb24gZ2V0UGVybWlzc2lvbigpCi0KLXB1YmxpYyBpbnQgZ2V0UmVhZFRpbWVvdXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvdXRpbC9MaXN0PExqYXZhL2xhbmcvU3RyaW5nOz47PjsgKQotcHVibGljIGphdmEudXRpbC5NYXAgZ2V0UmVxdWVzdFByb3BlcnRpZXMoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRSZXF1ZXN0UHJvcGVydHkoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5uZXQuVVJMIGdldFVSTCgpCi0KLXB1YmxpYyBib29sZWFuIGdldFVzZUNhY2hlcygpCi0KLXB1YmxpYyB2b2lkIHNldEFsbG93VXNlckludGVyYWN0aW9uKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0Q29ubmVjdFRpbWVvdXQoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldERlZmF1bHRVc2VDYWNoZXMoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXREb0lucHV0KAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0RG9PdXRwdXQoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRJZk1vZGlmaWVkU2luY2UoCi1sb25nKQotCi1wdWJsaWMgdm9pZCBzZXRSZWFkVGltZW91dCgKLWludCkKLQotcHVibGljIHZvaWQgc2V0UmVxdWVzdFByb3BlcnR5KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0VXNlQ2FjaGVzKAotYm9vbGVhbikKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGphdmEubmV0Lkh0dHBVUkxDb25uZWN0aW9uIGV4dGVuZHMgamF2YS5uZXQuVVJMQ29ubmVjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9DSFVOS19MRU5HVEgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSFRUUF9BQ0NFUFRFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBIVFRQX0JBRF9HQVRFV0FZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhUVFBfQkFEX01FVEhPRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBIVFRQX0JBRF9SRVFVRVNUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhUVFBfQ0xJRU5UX1RJTUVPVVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSFRUUF9DT05GTElDVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBIVFRQX0NSRUFURUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSFRUUF9FTlRJVFlfVE9PX0xBUkdFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhUVFBfRk9SQklEREVOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhUVFBfR0FURVdBWV9USU1FT1VUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhUVFBfR09ORQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBIVFRQX0lOVEVSTkFMX0VSUk9SCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhUVFBfTEVOR1RIX1JFUVVJUkVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhUVFBfTU9WRURfUEVSTQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBIVFRQX01PVkVEX1RFTVAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSFRUUF9NVUxUX0NIT0lDRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBIVFRQX05PVF9BQ0NFUFRBQkxFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhUVFBfTk9UX0FVVEhPUklUQVRJVkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSFRUUF9OT1RfRk9VTkQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSFRUUF9OT1RfSU1QTEVNRU5URUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSFRUUF9OT1RfTU9ESUZJRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSFRUUF9OT19DT05URU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhUVFBfT0sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSFRUUF9QQVJUSUFMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhUVFBfUEFZTUVOVF9SRVFVSVJFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBIVFRQX1BSRUNPTl9GQUlMRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSFRUUF9QUk9YWV9BVVRICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhUVFBfUkVRX1RPT19MT05HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhUVFBfUkVTRVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSFRUUF9TRUVfT1RIRVIKLUBqYXZhLmxhbmcuRGVwcmVjYXRlZAotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSFRUUF9TRVJWRVJfRVJST1IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSFRUUF9VTkFVVEhPUklaRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSFRUUF9VTkFWQUlMQUJMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBIVFRQX1VOU1VQUE9SVEVEX1RZUEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSFRUUF9VU0VfUFJPWFkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSFRUUF9WRVJTSU9OCi0KLXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZm9sbG93UmVkaXJlY3RzCi0KLXByb3RlY3RlZCBpbnQgY2h1bmtMZW5ndGgKLQotcHJvdGVjdGVkIGludCBmaXhlZENvbnRlbnRMZW5ndGgKLQotcHJvdGVjdGVkIGJvb2xlYW4gaW5zdGFuY2VGb2xsb3dSZWRpcmVjdHMKLQotcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgbWV0aG9kCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZ1tdIG1ldGhvZFRva2VucwotCi1wcm90ZWN0ZWQgaW50IHJlc3BvbnNlQ29kZQotCi1wcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyByZXNwb25zZU1lc3NhZ2UKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLWphdmEubmV0LlVSTCkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGdldEZvbGxvd1JlZGlyZWN0cygpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRGb2xsb3dSZWRpcmVjdHMoCi1ib29sZWFuKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBkaXNjb25uZWN0KCkKLQotcHVibGljIGphdmEuaW8uSW5wdXRTdHJlYW0gZ2V0RXJyb3JTdHJlYW0oKQotCi1wdWJsaWMgbG9uZyBnZXRIZWFkZXJGaWVsZERhdGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1sb25nKQotCi1wdWJsaWMgYm9vbGVhbiBnZXRJbnN0YW5jZUZvbGxvd1JlZGlyZWN0cygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb24gZ2V0UGVybWlzc2lvbigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFJlcXVlc3RNZXRob2QoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGdldFJlc3BvbnNlQ29kZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFJlc3BvbnNlTWVzc2FnZSgpCi0KLXB1YmxpYyB2b2lkIHNldENodW5rZWRTdHJlYW1pbmdNb2RlKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRGaXhlZExlbmd0aFN0cmVhbWluZ01vZGUoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldEluc3RhbmNlRm9sbG93UmVkaXJlY3RzKAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvUHJvdG9jb2xFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldFJlcXVlc3RNZXRob2QoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiB1c2luZ1Byb3h5KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxqYXZhL25ldC9JbmV0QWRkcmVzcyRDYWNoZTtMamF2YS9uZXQvSW5ldEFkZHJlc3MkQ2FjaGVFbGVtZW50O0xqYXZhL25ldC9JbmV0QWRkcmVzcyRXYWl0UmVhY2hhYmxlOyApCi1wdWJsaWMgY2xhc3MgamF2YS5uZXQuSW5ldEFkZHJlc3MgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGphdmEubmV0LkluZXRBZGRyZXNzIEFOWQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEVSUk1TR19DT05ORUNUSU9OX1JFRlVTRUQKLQotc3RhdGljIGZpbmFsIGphdmEubmV0LkluZXRBZGRyZXNzIExPT1BCQUNLCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLklOZXR3b3JrU3lzdGVtIE5FVElNUEwKLQotc3RhdGljIGZpbmFsIGJ5dGVbXSBhbnlfYnl0ZXMKLQotc3RhdGljIGZpbmFsIGJ5dGVbXSBsb2NhbGhvc3RfYnl0ZXMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5pby5PYmplY3RTdHJlYW1GaWVsZFtdIHNlcmlhbFBlcnNpc3RlbnRGaWVsZHMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0KLXByaXZhdGUgaW50IGFkZHJDb3VudAotCi0gaW50IGZhbWlseQotCi0gamF2YS5sYW5nLlN0cmluZyBob3N0TmFtZQotCi0gYnl0ZVtdIGlwYWRkcmVzcwotCi1wcml2YXRlIGJvb2xlYW4gcmVhY2hlZAotCi1wcml2YXRlIHRyYW5zaWVudCBqYXZhLmxhbmcuT2JqZWN0IHdhaXRSZWFjaGFibGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLSB2b2lkIDxpbml0PigpCi0KLSB2b2lkIDxpbml0PigKLWJ5dGVbXSkKLQotIHZvaWQgPGluaXQ+KAotYnl0ZVtdCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1zdGF0aWMgYm9vbGVhbiBhY2Nlc3MkMTAwKAotamF2YS5uZXQuSW5ldEFkZHJlc3MKLWphdmEubmV0LkluZXRBZGRyZXNzCi1qYXZhLm5ldC5JbmV0QWRkcmVzcwotaW50KQotCi1zdGF0aWMgamF2YS5sYW5nLk9iamVjdCBhY2Nlc3MkMjAwKAotamF2YS5uZXQuSW5ldEFkZHJlc3MpCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQzMDIoCi1qYXZhLm5ldC5JbmV0QWRkcmVzcwotYm9vbGVhbikKLQotc3RhdGljIGludCBhY2Nlc3MkNDAwKAotamF2YS5uZXQuSW5ldEFkZHJlc3MpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDQxMCgKLWphdmEubmV0LkluZXRBZGRyZXNzKQotCi1zdGF0aWMgYnl0ZVtdIGFkZHJlc3NPZigKLWludCkKLQotc3RhdGljIGludCBieXRlc1RvSW50KAotYnl0ZVtdCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1Vua25vd25Ib3N0RXhjZXB0aW9uOyApCi1zdGF0aWMgamF2YS5uZXQuSW5ldEFkZHJlc3MgY3JlYXRlSG9zdE5hbWVGcm9tSVBBZGRyZXNzKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvVW5rbm93bkhvc3RFeGNlcHRpb247ICkKLXN0YXRpYyBqYXZhLm5ldC5JbmV0QWRkcmVzc1tdIGdldEFsaWFzZXNCeU5hbWVJbXBsKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvVW5rbm93bkhvc3RFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgamF2YS5uZXQuSW5ldEFkZHJlc3NbXSBnZXRBbGxCeU5hbWUoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Vbmtub3duSG9zdEV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBqYXZhLm5ldC5JbmV0QWRkcmVzcyBnZXRCeUFkZHJlc3MoCi1qYXZhLmxhbmcuU3RyaW5nCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1Vua25vd25Ib3N0RXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGphdmEubmV0LkluZXRBZGRyZXNzIGdldEJ5QWRkcmVzcygKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvVW5rbm93bkhvc3RFeGNlcHRpb247ICkKLXN0YXRpYyBqYXZhLm5ldC5JbmV0QWRkcmVzcyBnZXRCeUFkZHJlc3MoCi1ieXRlW10KLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvVW5rbm93bkhvc3RFeGNlcHRpb247ICkKLXN0YXRpYyBqYXZhLm5ldC5JbmV0QWRkcmVzcyBnZXRCeUFkZHJlc3NJbnRlcm5hbCgKLWphdmEubGFuZy5TdHJpbmcKLWJ5dGVbXQotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Vbmtub3duSG9zdEV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBqYXZhLm5ldC5JbmV0QWRkcmVzcyBnZXRCeU5hbWUoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Vbmtub3duSG9zdEV4Y2VwdGlvbjsgKQotc3RhdGljIGphdmEubmV0LkluZXRBZGRyZXNzIGdldEhvc3RCeUFkZHJJbXBsKAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Vbmtub3duSG9zdEV4Y2VwdGlvbjsgKQotc3RhdGljIGphdmEubmV0LkluZXRBZGRyZXNzIGdldEhvc3RCeU5hbWVJbXBsKAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SG9zdE5hbWVJbXBsKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvVW5rbm93bkhvc3RFeGNlcHRpb247ICkKLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEhvc3ROYW1lSW50ZXJuYWwoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Vbmtub3duSG9zdEV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBqYXZhLm5ldC5JbmV0QWRkcmVzcyBnZXRMb2NhbEhvc3QoKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgamF2YS5sYW5nLlN0cmluZ1tdIGdldGFsaWFzZXNieW5hbWUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgamF2YS5sYW5nLlN0cmluZyBnZXRob3N0YnlhZGRyKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gZ2V0aG9zdGJ5bmFtZSgKLWphdmEubGFuZy5TdHJpbmcKLWJ5dGVbXSkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGphdmEubGFuZy5TdHJpbmcgZ2V0aG9zdG5hbWUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Vbmtub3duSG9zdEV4Y2VwdGlvbjsgKQotc3RhdGljIGludCBpbmV0QWRkcigKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1Vua25vd25Ib3N0RXhjZXB0aW9uOyApCi1zdGF0aWMgaW50IGluZXRBZGRySW1wbCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGluZXROdG9hSW1wbCgKLWludCkKLQotc3RhdGljIHZvaWQgaW50VG9CeXRlcygKLWludAotYnl0ZVtdCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNIb3N0TmFtZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJUHY0TWFwcGVkQWRkcmVzcygKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBib29sZWFuIGlzUmVhY2hhYmxlQnlNdWx0aVRocmVhZCgKLWphdmEubmV0Lk5ldHdvcmtJbnRlcmZhY2UKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIGJvb2xlYW4gaXNSZWFjaGFibGVCeVRDUCgKLWphdmEubmV0LkluZXRBZGRyZXNzCi1qYXZhLm5ldC5JbmV0QWRkcmVzcwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Vbmtub3duSG9zdEV4Y2VwdGlvbjsgKQotc3RhdGljIGphdmEubmV0LkluZXRBZGRyZXNzIGxvb2t1cEhvc3RCeU5hbWUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1zdGF0aWMgYm9vbGVhbiBwcmVmZXJJUHY2QWRkcmVzc2VzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9sYW5nL0NsYXNzTm90Rm91bmRFeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCByZWFkT2JqZWN0KAotamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9PYmplY3RTdHJlYW1FeGNlcHRpb247ICkKLXByaXZhdGUgamF2YS5sYW5nLk9iamVjdCByZWFkUmVzb2x2ZSgpCi0KLXByaXZhdGUgc3RhdGljIGludCBzZWNvbmRzVG9OYW5vcygKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KAotamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0pCi0KLSBqYXZhLm5ldC5JbmV0QWRkcmVzcyRDYWNoZUVsZW1lbnQgY2FjaGVFbGVtZW50KCkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGJ5dGVbXSBnZXRBZGRyZXNzKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Q2Fub25pY2FsSG9zdE5hbWUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRIb3N0QWRkcmVzcygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEhvc3ROYW1lKCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLXB1YmxpYyBib29sZWFuIGlzQW55TG9jYWxBZGRyZXNzKCkKLQotcHVibGljIGJvb2xlYW4gaXNMaW5rTG9jYWxBZGRyZXNzKCkKLQotcHVibGljIGJvb2xlYW4gaXNMb29wYmFja0FkZHJlc3MoKQotCi1wdWJsaWMgYm9vbGVhbiBpc01DR2xvYmFsKCkKLQotcHVibGljIGJvb2xlYW4gaXNNQ0xpbmtMb2NhbCgpCi0KLXB1YmxpYyBib29sZWFuIGlzTUNOb2RlTG9jYWwoKQotCi1wdWJsaWMgYm9vbGVhbiBpc01DT3JnTG9jYWwoKQotCi1wdWJsaWMgYm9vbGVhbiBpc01DU2l0ZUxvY2FsKCkKLQotcHVibGljIGJvb2xlYW4gaXNNdWx0aWNhc3RBZGRyZXNzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gaXNSZWFjaGFibGUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIGlzUmVhY2hhYmxlKAotamF2YS5uZXQuTmV0d29ya0ludGVyZmFjZQotaW50Ci1pbnQpCi0KLXB1YmxpYyBib29sZWFuIGlzU2l0ZUxvY2FsQWRkcmVzcygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBqYXZhLm5ldC5JbmV0NEFkZHJlc3MgZXh0ZW5kcyBqYXZhLm5ldC5JbmV0QWRkcmVzcwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1ieXRlW10pCi0KLSB2b2lkIDxpbml0PigKLWJ5dGVbXQotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9PYmplY3RTdHJlYW1FeGNlcHRpb247ICkKLXByaXZhdGUgamF2YS5sYW5nLk9iamVjdCB3cml0ZVJlcGxhY2UoKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRIb3N0QWRkcmVzcygpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0FueUxvY2FsQWRkcmVzcygpCi0KLXB1YmxpYyBib29sZWFuIGlzTGlua0xvY2FsQWRkcmVzcygpCi0KLXB1YmxpYyBib29sZWFuIGlzTG9vcGJhY2tBZGRyZXNzKCkKLQotcHVibGljIGJvb2xlYW4gaXNNQ0dsb2JhbCgpCi0KLXB1YmxpYyBib29sZWFuIGlzTUNMaW5rTG9jYWwoKQotCi1wdWJsaWMgYm9vbGVhbiBpc01DTm9kZUxvY2FsKCkKLQotcHVibGljIGJvb2xlYW4gaXNNQ09yZ0xvY2FsKCkKLQotcHVibGljIGJvb2xlYW4gaXNNQ1NpdGVMb2NhbCgpCi0KLXB1YmxpYyBib29sZWFuIGlzTXVsdGljYXN0QWRkcmVzcygpCi0KLXB1YmxpYyBib29sZWFuIGlzU2l0ZUxvY2FsQWRkcmVzcygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgamF2YS5uZXQuSW5ldDZBZGRyZXNzIGV4dGVuZHMgamF2YS5uZXQuSW5ldEFkZHJlc3MKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIGphdmEubmV0LkluZXRBZGRyZXNzIEFOWQotCi1zdGF0aWMgZmluYWwgamF2YS5uZXQuSW5ldEFkZHJlc3MgTE9PUEJBQ0sKLQotc3RhdGljIGZpbmFsIGJ5dGVbXSBhbnlfYnl0ZXMKLQotc3RhdGljIGZpbmFsIGJ5dGVbXSBsb2NhbGhvc3RfYnl0ZXMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5pby5PYmplY3RTdHJlYW1GaWVsZFtdIHNlcmlhbFBlcnNpc3RlbnRGaWVsZHMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0KLSBqYXZhLmxhbmcuU3RyaW5nIGlmbmFtZQotCi0gaW50IHNjb3BlX2lkCi0KLSBib29sZWFuIHNjb3BlX2lkX3NldAotCi0gYm9vbGVhbiBzY29wZV9pZm5hbWVfc2V0Ci0KLXRyYW5zaWVudCBqYXZhLm5ldC5OZXR3b3JrSW50ZXJmYWNlIHNjb3BlZElmCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi0gdm9pZCA8aW5pdD4oCi1ieXRlW10pCi0KLSB2b2lkIDxpbml0PigKLWJ5dGVbXQotaW50KQotCi0gdm9pZCA8aW5pdD4oCi1ieXRlW10KLWphdmEubGFuZy5TdHJpbmcpCi0KLSB2b2lkIDxpbml0PigKLWJ5dGVbXQotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wcml2YXRlIGJvb2xlYW4gY29tcGFyZUxvY2FsVHlwZSgKLWphdmEubmV0LkluZXQ2QWRkcmVzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvVW5rbm93bkhvc3RFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgamF2YS5uZXQuSW5ldDZBZGRyZXNzIGdldEJ5QWRkcmVzcygKLWphdmEubGFuZy5TdHJpbmcKLWJ5dGVbXQotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Vbmtub3duSG9zdEV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBqYXZhLm5ldC5JbmV0NkFkZHJlc3MgZ2V0QnlBZGRyZXNzKAotamF2YS5sYW5nLlN0cmluZwotYnl0ZVtdCi1qYXZhLm5ldC5OZXR3b3JrSW50ZXJmYWNlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL2xhbmcvQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoCi1qYXZhLmlvLk9iamVjdElucHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoCi1qYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SG9zdEFkZHJlc3MoKQotCi1wdWJsaWMgaW50IGdldFNjb3BlSWQoKQotCi1wdWJsaWMgamF2YS5uZXQuTmV0d29ya0ludGVyZmFjZSBnZXRTY29wZWRJbnRlcmZhY2UoKQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLQotcHVibGljIGJvb2xlYW4gaXNBbnlMb2NhbEFkZHJlc3MoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0lQdjRDb21wYXRpYmxlQWRkcmVzcygpCi0KLXB1YmxpYyBib29sZWFuIGlzTGlua0xvY2FsQWRkcmVzcygpCi0KLXB1YmxpYyBib29sZWFuIGlzTG9vcGJhY2tBZGRyZXNzKCkKLQotcHVibGljIGJvb2xlYW4gaXNNQ0dsb2JhbCgpCi0KLXB1YmxpYyBib29sZWFuIGlzTUNMaW5rTG9jYWwoKQotCi1wdWJsaWMgYm9vbGVhbiBpc01DTm9kZUxvY2FsKCkKLQotcHVibGljIGJvb2xlYW4gaXNNQ09yZ0xvY2FsKCkKLQotcHVibGljIGJvb2xlYW4gaXNNQ1NpdGVMb2NhbCgpCi0KLXB1YmxpYyBib29sZWFuIGlzTXVsdGljYXN0QWRkcmVzcygpCi0KLXB1YmxpYyBib29sZWFuIGlzU2l0ZUxvY2FsQWRkcmVzcygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi0gY2xhc3MgamF2YS5uZXQuSW5ldEFkZHJlc3MkMSBleHRlbmRzIGphdmEubGFuZy5UaHJlYWQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgamF2YS5uZXQuSW5ldEFkZHJlc3MgdGhpcyQwCi0KLWZpbmFsIGphdmEubmV0LkluZXRBZGRyZXNzIHZhbCRhZGRyCi0KLWZpbmFsIGludCB2YWwkdGltZW91dAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEubmV0LkluZXRBZGRyZXNzCi1qYXZhLm5ldC5JbmV0QWRkcmVzcwotaW50KQotCi1wdWJsaWMgdm9pZCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL25ldC9JbmV0QWRkcmVzczsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPUNhY2hlICkKLSBjbGFzcyBqYXZhLm5ldC5JbmV0QWRkcmVzcyRDYWNoZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5uZXQuSW5ldEFkZHJlc3MkQ2FjaGVFbGVtZW50IGhlYWQKLQotc3RhdGljIGludCBtYXhTaXplCi0KLXByaXZhdGUgc3RhdGljIGludCBzaXplCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi0gdm9pZCA8aW5pdD4oKQotCi1zdGF0aWMgdm9pZCBhZGQoCi1qYXZhLm5ldC5JbmV0QWRkcmVzcykKLQotc3RhdGljIHZvaWQgY2xlYXIoKQotCi1wcml2YXRlIHN0YXRpYyB2b2lkIGRlbGV0ZVRhaWwoKQotCi1zdGF0aWMgamF2YS5uZXQuSW5ldEFkZHJlc3MkQ2FjaGVFbGVtZW50IGdldCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgbW92ZVRvSGVhZCgKLWphdmEubmV0LkluZXRBZGRyZXNzJENhY2hlRWxlbWVudAotamF2YS5uZXQuSW5ldEFkZHJlc3MkQ2FjaGVFbGVtZW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1DYWNoZUVsZW1lbnQgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvbmV0L0luZXRBZGRyZXNzOyApCi0gY2xhc3MgamF2YS5uZXQuSW5ldEFkZHJlc3MkQ2FjaGVFbGVtZW50IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gbG9uZyBuYW5vVGltZUFkZGVkCi0KLSBqYXZhLm5ldC5JbmV0QWRkcmVzcyRDYWNoZUVsZW1lbnQgbmV4dAotCi1maW5hbCBqYXZhLm5ldC5JbmV0QWRkcmVzcyB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLm5ldC5JbmV0QWRkcmVzcykKLQotIGphdmEubGFuZy5TdHJpbmcgaG9zdE5hbWUoKQotCi0gamF2YS5uZXQuSW5ldEFkZHJlc3MgaW5ldEFkZHJlc3MoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL25ldC9JbmV0QWRkcmVzczsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1XYWl0UmVhY2hhYmxlICkKLSBjbGFzcyBqYXZhLm5ldC5JbmV0QWRkcmVzcyRXYWl0UmVhY2hhYmxlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLm5ldC5JbmV0QWRkcmVzcyQxKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGphdmEubmV0LlNvY2tldEFkZHJlc3MgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzIGV4dGVuZHMgamF2YS5uZXQuU29ja2V0QWRkcmVzcwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSBqYXZhLm5ldC5JbmV0QWRkcmVzcyBhZGRyCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBob3N0bmFtZQotCi1wcml2YXRlIGludCBwb3J0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5uZXQuSW5ldEFkZHJlc3MKLWludCkKLQotcHVibGljIHN0YXRpYyBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzcyBjcmVhdGVVbnJlc29sdmVkKAotamF2YS5sYW5nLlN0cmluZwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL2xhbmcvQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoCi1qYXZhLmlvLk9iamVjdElucHV0U3RyZWFtKQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgZmluYWwgamF2YS5uZXQuSW5ldEFkZHJlc3MgZ2V0QWRkcmVzcygpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGdldEhvc3ROYW1lKCkKLQotcHVibGljIGZpbmFsIGludCBnZXRQb3J0KCkKLQotcHVibGljIGZpbmFsIGludCBoYXNoQ29kZSgpCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGlzVW5yZXNvbHZlZCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZhLm5ldC5KYXJVUkxDb25uZWN0aW9uIGV4dGVuZHMgamF2YS5uZXQuVVJMQ29ubmVjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZW50cnlOYW1lCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBmaWxlCi0KLXByaXZhdGUgamF2YS5uZXQuVVJMIGZpbGVVUkwKLQotcHJvdGVjdGVkIGphdmEubmV0LlVSTENvbm5lY3Rpb24gamFyRmlsZVVSTENvbm5lY3Rpb24KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9NYWxmb3JtZWRVUkxFeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLWphdmEubmV0LlVSTCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEudXRpbC5qYXIuQXR0cmlidXRlcyBnZXRBdHRyaWJ1dGVzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZVtdIGdldENlcnRpZmljYXRlcygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEVudHJ5TmFtZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnV0aWwuamFyLkphckVudHJ5IGdldEphckVudHJ5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEudXRpbC5qYXIuSmFyRmlsZSBnZXRKYXJGaWxlKCkKLQotcHVibGljIGphdmEubmV0LlVSTCBnZXRKYXJGaWxlVVJMKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEudXRpbC5qYXIuQXR0cmlidXRlcyBnZXRNYWluQXR0cmlidXRlcygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnV0aWwuamFyLk1hbmlmZXN0IGdldE1hbmlmZXN0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmlvLklPRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5uZXQuTXVsdGljYXN0U29ja2V0IGV4dGVuZHMgamF2YS5uZXQuRGF0YWdyYW1Tb2NrZXQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIGludCBTT19SRVVTRVBPUlQKLQotcHJpdmF0ZSBqYXZhLm5ldC5JbmV0QWRkcmVzcyBpbnRlcmZhY2VTZXQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubmV0LlNvY2tldEFkZHJlc3MpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1NvY2tldEV4Y2VwdGlvbjsgKQotIHZvaWQgY3JlYXRlU29ja2V0KAotaW50Ci1qYXZhLm5ldC5JbmV0QWRkcmVzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvU29ja2V0RXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5uZXQuSW5ldEFkZHJlc3MgZ2V0SW50ZXJmYWNlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvU29ja2V0RXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBnZXRMb29wYmFja01vZGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLm5ldC5OZXR3b3JrSW50ZXJmYWNlIGdldE5ldHdvcmtJbnRlcmZhY2UoKQotQGphdmEubGFuZy5EZXByZWNhdGVkCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBieXRlIGdldFRUTCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgZ2V0VGltZVRvTGl2ZSgpCi0KLSBib29sZWFuIGlzTXVsdGljYXN0U29ja2V0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgam9pbkdyb3VwKAotamF2YS5uZXQuSW5ldEFkZHJlc3MpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGpvaW5Hcm91cCgKLWphdmEubmV0LlNvY2tldEFkZHJlc3MKLWphdmEubmV0Lk5ldHdvcmtJbnRlcmZhY2UpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGxlYXZlR3JvdXAoCi1qYXZhLm5ldC5JbmV0QWRkcmVzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgbGVhdmVHcm91cCgKLWphdmEubmV0LlNvY2tldEFkZHJlc3MKLWphdmEubmV0Lk5ldHdvcmtJbnRlcmZhY2UpCi1AamF2YS5sYW5nLkRlcHJlY2F0ZWQKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2VuZCgKLWphdmEubmV0LkRhdGFncmFtUGFja2V0Ci1ieXRlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldEludGVyZmFjZSgKLWphdmEubmV0LkluZXRBZGRyZXNzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldExvb3BiYWNrTW9kZSgKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1NvY2tldEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0TmV0d29ya0ludGVyZmFjZSgKLWphdmEubmV0Lk5ldHdvcmtJbnRlcmZhY2UpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLUBqYXZhLmxhbmcuRGVwcmVjYXRlZAotcHVibGljIHZvaWQgc2V0VFRMKAotYnl0ZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0VGltZVRvTGl2ZSgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLSBjbGFzcyBqYXZhLm5ldC5OZWdDYWNoZUVsZW1lbnQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBqYXZhLmxhbmcuU3RyaW5nIGhvc3ROYW1lCi0KLSBsb25nIG5hbm9UaW1lQWRkZWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi0gamF2YS5sYW5nLlN0cmluZyBob3N0TmFtZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxLOkxqYXZhL2xhbmcvT2JqZWN0O1Y6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3V0aWwvTWFwPFRLO1RWOz47ICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZhLnV0aWwuQWJzdHJhY3RNYXAgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLk1hcAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvU2V0PFRLOz47ICkKLSBqYXZhLnV0aWwuU2V0IGtleVNldAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQ29sbGVjdGlvbjxUVjs+OyApCi0gamF2YS51dGlsLkNvbGxlY3Rpb24gdmFsdWVzQ29sbGVjdGlvbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIGNsZWFyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0Nsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgamF2YS5sYW5nLk9iamVjdCBjbG9uZSgpCi0KLXB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGJvb2xlYW4gY29udGFpbnNWYWx1ZSgKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL1NldDxMamF2YS91dGlsL01hcCRFbnRyeTxUSztUVjs+Oz47ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnV0aWwuU2V0IGVudHJ5U2V0KCkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9PYmplY3Q7KVRWOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXQoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLQotcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL1NldDxUSzs+OyApCi1wdWJsaWMgamF2YS51dGlsLlNldCBrZXlTZXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUSztUVjspVFY7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHB1dCgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTWFwPCtUSzsrVFY7PjspViApCi1wdWJsaWMgdm9pZCBwdXRBbGwoCi1qYXZhLnV0aWwuTWFwKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL09iamVjdDspVFY7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHJlbW92ZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBpbnQgc2l6ZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvQ29sbGVjdGlvbjxUVjs+OyApCi1wdWJsaWMgamF2YS51dGlsLkNvbGxlY3Rpb24gdmFsdWVzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEs6TGphdmEvbGFuZy9PYmplY3Q7VjpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvdXRpbC9BYnN0cmFjdE1hcDxUSztUVjs+O0xqYXZhL3V0aWwvTWFwPFRLO1RWOz47TGphdmEvbGFuZy9DbG9uZWFibGU7TGphdmEvaW8vU2VyaWFsaXphYmxlOyApCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaE1hcCRIYXNoTWFwRW50cnlTZXQ7TGphdmEvdXRpbC9IYXNoTWFwJEhhc2hNYXBJdGVyYXRvcjtMamF2YS91dGlsL0hhc2hNYXAkRW50cnk7ICkKLXB1YmxpYyBjbGFzcyBqYXZhLnV0aWwuSGFzaE1hcCBleHRlbmRzIGphdmEudXRpbC5BYnN0cmFjdE1hcCBpbXBsZW1lbnRzIGphdmEudXRpbC5NYXAsIGphdmEubGFuZy5DbG9uZWFibGUsIGphdmEuaW8uU2VyaWFsaXphYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1NJWkUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0KLXRyYW5zaWVudCBpbnQgZWxlbWVudENvdW50Ci1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9W0xqYXZhL3V0aWwvSGFzaE1hcCRFbnRyeTxUSztUVjs+OyApCi10cmFuc2llbnQgamF2YS51dGlsLkhhc2hNYXAkRW50cnlbXSBlbGVtZW50RGF0YQotCi1maW5hbCBmbG9hdCBsb2FkRmFjdG9yCi0KLXRyYW5zaWVudCBpbnQgbW9kQ291bnQKLQotIGludCB0aHJlc2hvbGQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotZmxvYXQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTWFwPCtUSzsrVFY7PjspViApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuTWFwKQotCi1wcml2YXRlIHZvaWQgY29tcHV0ZU1heFNpemUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL01hcDwrVEs7K1RWOz47KVYgKQotcHJpdmF0ZSB2b2lkIHB1dEFsbEltcGwoCi1qYXZhLnV0aWwuTWFwKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL2xhbmcvQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoCi1qYXZhLmlvLk9iamVjdElucHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoCi1qYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSkKLQotcHVibGljIHZvaWQgY2xlYXIoKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBjbG9uZSgpCi0KLXB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGJvb2xlYW4gY29udGFpbnNWYWx1ZSgKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRLO0lUVjspTGphdmEvdXRpbC9IYXNoTWFwJEVudHJ5PFRLO1RWOz47ICkKLSBqYXZhLnV0aWwuSGFzaE1hcCRFbnRyeSBjcmVhdGVFbnRyeSgKLWphdmEubGFuZy5PYmplY3QKLWludAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEs7SUkpTGphdmEvdXRpbC9IYXNoTWFwJEVudHJ5PFRLO1RWOz47ICkKLSBqYXZhLnV0aWwuSGFzaE1hcCRFbnRyeSBjcmVhdGVIYXNoZWRFbnRyeSgKLWphdmEubGFuZy5PYmplY3QKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9TZXQ8TGphdmEvdXRpbC9NYXAkRW50cnk8VEs7VFY7Pjs+OyApCi1wdWJsaWMgamF2YS51dGlsLlNldCBlbnRyeVNldCgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvT2JqZWN0O0lJKUxqYXZhL3V0aWwvSGFzaE1hcCRFbnRyeTxUSztUVjs+OyApCi1maW5hbCBqYXZhLnV0aWwuSGFzaE1hcCRFbnRyeSBmaW5kTm9uTnVsbEtleUVudHJ5KAotamF2YS5sYW5nLk9iamVjdAotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0hhc2hNYXAkRW50cnk8VEs7VFY7PjsgKQotZmluYWwgamF2YS51dGlsLkhhc2hNYXAkRW50cnkgZmluZE51bGxLZXlFbnRyeSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvT2JqZWN0OylUVjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0KAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL1NldDxUSzs+OyApCi1wdWJsaWMgamF2YS51dGlsLlNldCBrZXlTZXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJKVtMamF2YS91dGlsL0hhc2hNYXAkRW50cnk8VEs7VFY7PjsgKQotIGphdmEudXRpbC5IYXNoTWFwJEVudHJ5W10gbmV3RWxlbWVudEFycmF5KAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUSztUVjspVFY7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHB1dCgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTWFwPCtUSzsrVFY7PjspViApCi1wdWJsaWMgdm9pZCBwdXRBbGwoCi1qYXZhLnV0aWwuTWFwKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUSztUVjspVFY7ICkKLSBqYXZhLmxhbmcuT2JqZWN0IHB1dEltcGwoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi0gdm9pZCByZWhhc2goKQotCi0gdm9pZCByZWhhc2goCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvT2JqZWN0OylUVjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgcmVtb3ZlKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL3V0aWwvSGFzaE1hcCRFbnRyeTxUSztUVjs+OyApCi0gamF2YS51dGlsLkhhc2hNYXAkRW50cnkgcmVtb3ZlRW50cnkoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50IHNpemUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9Db2xsZWN0aW9uPFRWOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuQ29sbGVjdGlvbiB2YWx1ZXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08SzpMamF2YS9sYW5nL09iamVjdDtWOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS91dGlsL0hhc2hNYXA8VEs7VFY7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MamF2YS91dGlsL0xpbmtlZEhhc2hNYXAkTGlua2VkSGFzaE1hcEVudHJ5O0xqYXZhL3V0aWwvTGlua2VkSGFzaE1hcCRMaW5rZWRIYXNoTWFwRW50cnlTZXQ7TGphdmEvdXRpbC9MaW5rZWRIYXNoTWFwJExpbmtlZEhhc2hJdGVyYXRvcjsgKQotcHVibGljIGNsYXNzIGphdmEudXRpbC5MaW5rZWRIYXNoTWFwIGV4dGVuZHMgamF2YS51dGlsLkhhc2hNYXAKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0KLXByaXZhdGUgZmluYWwgYm9vbGVhbiBhY2Nlc3NPcmRlcgotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvTGlua2VkSGFzaE1hcCRMaW5rZWRIYXNoTWFwRW50cnk8VEs7VFY7PjsgKQotcHJpdmF0ZSB0cmFuc2llbnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXAkTGlua2VkSGFzaE1hcEVudHJ5IGhlYWQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0xpbmtlZEhhc2hNYXAkTGlua2VkSGFzaE1hcEVudHJ5PFRLO1RWOz47ICkKLXByaXZhdGUgdHJhbnNpZW50IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwJExpbmtlZEhhc2hNYXBFbnRyeSB0YWlsCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWZsb2F0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWZsb2F0Ci1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL01hcDwrVEs7K1RWOz47KVYgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLk1hcCkKLQotc3RhdGljIGphdmEudXRpbC5MaW5rZWRIYXNoTWFwJExpbmtlZEhhc2hNYXBFbnRyeSBhY2Nlc3MkMDAwKAotamF2YS51dGlsLkxpbmtlZEhhc2hNYXApCi0KLXN0YXRpYyBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcCRMaW5rZWRIYXNoTWFwRW50cnkgYWNjZXNzJDAwMigKLWphdmEudXRpbC5MaW5rZWRIYXNoTWFwCi1qYXZhLnV0aWwuTGlua2VkSGFzaE1hcCRMaW5rZWRIYXNoTWFwRW50cnkpCi0KLXN0YXRpYyBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcCRMaW5rZWRIYXNoTWFwRW50cnkgYWNjZXNzJDEwMigKLWphdmEudXRpbC5MaW5rZWRIYXNoTWFwCi1qYXZhLnV0aWwuTGlua2VkSGFzaE1hcCRMaW5rZWRIYXNoTWFwRW50cnkpCi0KLXB1YmxpYyB2b2lkIGNsZWFyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEs7SVRWOylMamF2YS91dGlsL0hhc2hNYXAkRW50cnk8VEs7VFY7PjsgKQotIGphdmEudXRpbC5IYXNoTWFwJEVudHJ5IGNyZWF0ZUVudHJ5KAotamF2YS5sYW5nLk9iamVjdAotaW50Ci1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUSztJSSlMamF2YS91dGlsL0hhc2hNYXAkRW50cnk8VEs7VFY7PjsgKQotIGphdmEudXRpbC5IYXNoTWFwJEVudHJ5IGNyZWF0ZUhhc2hlZEVudHJ5KAotamF2YS5sYW5nLk9iamVjdAotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL1NldDxMamF2YS91dGlsL01hcCRFbnRyeTxUSztUVjs+Oz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuU2V0IGVudHJ5U2V0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9PYmplY3Q7KVRWOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXQoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9TZXQ8VEs7PjsgKQotcHVibGljIGphdmEudXRpbC5TZXQga2V5U2V0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9MaW5rZWRIYXNoTWFwJExpbmtlZEhhc2hNYXBFbnRyeTxUSztUVjs+OylWICkKLSB2b2lkIGxpbmtFbnRyeSgKLWphdmEudXRpbC5MaW5rZWRIYXNoTWFwJExpbmtlZEhhc2hNYXBFbnRyeSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSSlbTGphdmEvdXRpbC9IYXNoTWFwJEVudHJ5PFRLO1RWOz47ICkKLSBqYXZhLnV0aWwuSGFzaE1hcCRFbnRyeVtdIG5ld0VsZW1lbnRBcnJheSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEs7VFY7KVRWOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBwdXQoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUSztUVjspVFY7ICkKLSBqYXZhLmxhbmcuT2JqZWN0IHB1dEltcGwoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL09iamVjdDspVFY7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHJlbW92ZSgKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTWFwJEVudHJ5PFRLO1RWOz47KVogKQotcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlRWxkZXN0RW50cnkoCi1qYXZhLnV0aWwuTWFwJEVudHJ5KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9Db2xsZWN0aW9uPFRWOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuQ29sbGVjdGlvbiB2YWx1ZXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08SzpMamF2YS9sYW5nL09iamVjdDtWOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS91dGlsL0xpbmtlZEhhc2hNYXA8VEs7VFY7PjsgKQotIGNsYXNzIGphdmEubmV0Lk5lZ2F0aXZlQ2FjaGUgZXh0ZW5kcyBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgZmxvYXQgTE9BRElORwotCi1zdGF0aWMgZmluYWwgaW50IE1BWF9ORUdBVElWRV9FTlRSSUVTCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbmV0L05lZ2F0aXZlQ2FjaGU8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbmV0L05lZ0NhY2hlRWxlbWVudDs+OyApCi1zdGF0aWMgamF2YS5uZXQuTmVnYXRpdmVDYWNoZSBuZWdDYWNoZQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1pbnQKLWZsb2F0Ci1ib29sZWFuKQotCi1zdGF0aWMgdm9pZCBjaGVja0NhY2hlRXhpc3RzKCkKLQotc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RmFpbGVkTWVzc2FnZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXN0YXRpYyB2b2lkIHB1dCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgc3RhdGljIGludCBzZWNvbmRzVG9OYW5vcygKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9NYXAkRW50cnk8VEs7VFY7PjspWiApCi1wcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVFbGRlc3RFbnRyeSgKLWphdmEudXRpbC5NYXAkRW50cnkpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgamF2YS5uZXQuTmV0UGVybWlzc2lvbiBleHRlbmRzIGphdmEuc2VjdXJpdHkuQmFzaWNQZXJtaXNzaW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgamF2YS5uZXQuTmV0d29ya0ludGVyZmFjZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENIRUNLX0NPTk5FQ1RfTk9fUE9SVAotCi1zdGF0aWMgZmluYWwgaW50IE5PX0lOVEVSRkFDRV9JTkRFWAotCi1zdGF0aWMgZmluYWwgaW50IFVOU0VUX0lOVEVSRkFDRV9JTkRFWAotCi0gamF2YS5uZXQuSW5ldEFkZHJlc3NbXSBhZGRyZXNzZXMKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGRpc3BsYXlOYW1lCi0KLXByaXZhdGUgaW50IGhhc2hDb2RlCi0KLXByaXZhdGUgaW50IGludGVyZmFjZUluZGV4Ci0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBuYW1lCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5uZXQuSW5ldEFkZHJlc3NbXQotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgamF2YS5uZXQuTmV0d29ya0ludGVyZmFjZSBnZXRCeUluZXRBZGRyZXNzKAotamF2YS5uZXQuSW5ldEFkZHJlc3MpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1NvY2tldEV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBqYXZhLm5ldC5OZXR3b3JrSW50ZXJmYWNlIGdldEJ5TmFtZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1NvY2tldEV4Y2VwdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9FbnVtZXJhdGlvbjxMamF2YS9uZXQvTmV0d29ya0ludGVyZmFjZTs+OyApCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5FbnVtZXJhdGlvbiBnZXROZXR3b3JrSW50ZXJmYWNlcygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1NvY2tldEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGphdmEubmV0Lk5ldHdvcmtJbnRlcmZhY2VbXSBnZXROZXR3b3JrSW50ZXJmYWNlc0ltcGwoKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXREaXNwbGF5TmFtZSgpCi0KLSBqYXZhLm5ldC5JbmV0QWRkcmVzcyBnZXRGaXJzdEFkZHJlc3MoKQotCi0gaW50IGdldEluZGV4KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvRW51bWVyYXRpb248TGphdmEvbmV0L0luZXRBZGRyZXNzOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuRW51bWVyYXRpb24gZ2V0SW5ldEFkZHJlc3NlcygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE5hbWUoKQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEubmV0Lk5vUm91dGVUb0hvc3RFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLm5ldC5Tb2NrZXRFeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBqYXZhLm5ldC5QYXNzd29yZEF1dGhlbnRpY2F0aW9uIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGNoYXJbXSBwYXNzd29yZAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgdXNlck5hbWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1jaGFyW10pCi0KLXB1YmxpYyBjaGFyW10gZ2V0UGFzc3dvcmQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRVc2VyTmFtZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5uZXQuUG9ydFVucmVhY2hhYmxlRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5uZXQuUHJvdG9jb2xFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmlvLklPRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNjQwOSBuYW1lID1UeXBlICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL0VudW08TGphdmEvbmV0L1Byb3h5JFR5cGU7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvbmV0L1Byb3h5OyApCi1wdWJsaWMgZmluYWwgY2xhc3MgamF2YS5uZXQuUHJveHkkVHlwZSBleHRlbmRzIGphdmEubGFuZy5FbnVtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubmV0LlByb3h5JFR5cGVbXSAkVkFMVUVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5uZXQuUHJveHkkVHlwZSBESVJFQ1QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLm5ldC5Qcm94eSRUeXBlIEhUVFAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLm5ldC5Qcm94eSRUeXBlIFNPQ0tTCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpViApCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgc3RhdGljIGphdmEubmV0LlByb3h5JFR5cGUgdmFsdWVPZigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5uZXQuUHJveHkkVHlwZVtdIHZhbHVlcygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MamF2YS9uZXQvUHJveHkkVHlwZTsgKQotcHVibGljIGNsYXNzIGphdmEubmV0LlByb3h5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubmV0LlByb3h5IE5PX1BST1hZCi0KLXByaXZhdGUgamF2YS5uZXQuU29ja2V0QWRkcmVzcyBhZGRyZXNzCi0KLXByaXZhdGUgamF2YS5uZXQuUHJveHkkVHlwZSB0eXBlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5uZXQuUHJveHkkVHlwZQotamF2YS5uZXQuU29ja2V0QWRkcmVzcykKLQotcHVibGljIGphdmEubmV0LlNvY2tldEFkZHJlc3MgYWRkcmVzcygpCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBmaW5hbCBpbnQgaGFzaENvZGUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLXB1YmxpYyBqYXZhLm5ldC5Qcm94eSRUeXBlIHR5cGUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGphdmEubmV0LlByb3h5U2VsZWN0b3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGphdmEubmV0LlByb3h5U2VsZWN0b3IgZGVmYXVsdFNlbGVjdG9yCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubmV0Lk5ldFBlcm1pc3Npb24gZ2V0UHJveHlTZWxlY3RvclBlcm1pc3Npb24KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5uZXQuTmV0UGVybWlzc2lvbiBzZXRQcm94eVNlbGVjdG9yUGVybWlzc2lvbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBqYXZhLm5ldC5Qcm94eVNlbGVjdG9yIGdldERlZmF1bHQoKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVmYXVsdCgKLWphdmEubmV0LlByb3h5U2VsZWN0b3IpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGNvbm5lY3RGYWlsZWQoCi1qYXZhLm5ldC5VUkkKLWphdmEubmV0LlNvY2tldEFkZHJlc3MKLWphdmEuaW8uSU9FeGNlcHRpb24pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL25ldC9VUkk7KUxqYXZhL3V0aWwvTGlzdDxMamF2YS9uZXQvUHJveHk7PjsgKQotcHVibGljIGFic3RyYWN0IGphdmEudXRpbC5MaXN0IHNlbGVjdCgKLWphdmEubmV0LlVSSSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS9uZXQvUHJveHlTZWxlY3RvckltcGw7ICkKLWZpbmFsIGNsYXNzIGphdmEubmV0LlByb3h5U2VsZWN0b3JJbXBsJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLSBjbGFzcyBqYXZhLm5ldC5Qcm94eVNlbGVjdG9ySW1wbCBleHRlbmRzIGphdmEubmV0LlByb3h5U2VsZWN0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZUUF9QUk9YWV9QT1JUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIVFRQU19QUk9YWV9QT1JUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIVFRQX1BST1hZX1BPUlQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNPQ0tTX1BST1hZX1BPUlQKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLlByb3BlcnRpZXMgbmV0UHJvcHMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXN0YXRpYyBqYXZhLnV0aWwuUHJvcGVydGllcyBhY2Nlc3MkMDAwKCkKLQotc3RhdGljIGphdmEudXRpbC5Qcm9wZXJ0aWVzIGFjY2VzcyQwMDIoCi1qYXZhLnV0aWwuUHJvcGVydGllcykKLQotcHJpdmF0ZSBqYXZhLm5ldC5Qcm94eSBjcmVhdGVQcm94eSgKLWphdmEubmV0LlByb3h5JFR5cGUKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGdldFN5c3RlbVByb3BlcnR5KAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGdldFN5c3RlbVByb3BlcnR5KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGdldFN5c3RlbVByb3BlcnR5T3JBbHRlcm5hdGl2ZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgYm9vbGVhbiBpc05vblByb3h5SG9zdCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgamF2YS5uZXQuUHJveHkgc2VsZWN0RnRwUHJveHkoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIGphdmEubmV0LlByb3h5IHNlbGVjdEh0dHBQcm94eSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgamF2YS5uZXQuUHJveHkgc2VsZWN0SHR0cHNQcm94eSgpCi0KLXByaXZhdGUgamF2YS5uZXQuUHJveHkgc2VsZWN0U29ja3NQcm94eSgpCi0KLXB1YmxpYyB2b2lkIGNvbm5lY3RGYWlsZWQoCi1qYXZhLm5ldC5VUkkKLWphdmEubmV0LlNvY2tldEFkZHJlc3MKLWphdmEuaW8uSU9FeGNlcHRpb24pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL25ldC9VUkk7KUxqYXZhL3V0aWwvTGlzdDxMamF2YS9uZXQvUHJveHk7PjsgKQotcHVibGljIGphdmEudXRpbC5MaXN0IHNlbGVjdCgKLWphdmEubmV0LlVSSSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZhLm5ldC5SZXNwb25zZUNhY2hlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLm5ldC5SZXNwb25zZUNhY2hlIF9kZWZhdWx0UmVzcG9uc2VDYWNoZQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLm5ldC5OZXRQZXJtaXNzaW9uIGdldFJlc3BvbnNlQ2FjaGVwZXJtaXNzaW9uCi0KLXByaXZhdGUgc3RhdGljIGphdmEubmV0Lk5ldFBlcm1pc3Npb24gc2V0UmVzcG9uc2VDYWNoZXBlcm1pc3Npb24KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tHZXRSZXNwb25zZUNhY2hlUGVybWlzc2lvbigpCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tTZXRSZXNwb25zZUNhY2hlUGVybWlzc2lvbigpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5uZXQuUmVzcG9uc2VDYWNoZSBnZXREZWZhdWx0KCkKLQotcHVibGljIHN0YXRpYyB2b2lkIHNldERlZmF1bHQoCi1qYXZhLm5ldC5SZXNwb25zZUNhY2hlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL25ldC9VUkk7TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvdXRpbC9MaXN0PExqYXZhL2xhbmcvU3RyaW5nOz47PjspTGphdmEvbmV0L0NhY2hlUmVzcG9uc2U7ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm5ldC5DYWNoZVJlc3BvbnNlIGdldCgKLWphdmEubmV0LlVSSQotamF2YS5sYW5nLlN0cmluZwotamF2YS51dGlsLk1hcCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubmV0LkNhY2hlUmVxdWVzdCBwdXQoCi1qYXZhLm5ldC5VUkkKLWphdmEubmV0LlVSTENvbm5lY3Rpb24pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgamF2YS5uZXQuU2VjdXJlQ2FjaGVSZXNwb25zZSBleHRlbmRzIGphdmEubmV0LkNhY2hlUmVzcG9uc2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRDaXBoZXJTdWl0ZSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0xpc3Q8TGphdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZTs+OyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLkxpc3QgZ2V0TG9jYWxDZXJ0aWZpY2F0ZUNoYWluKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsIGdldExvY2FsUHJpbmNpcGFsKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YXgvbmV0L3NzbC9TU0xQZWVyVW52ZXJpZmllZEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsIGdldFBlZXJQcmluY2lwYWwoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9MaXN0PExqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGU7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZheC9uZXQvc3NsL1NTTFBlZXJVbnZlcmlmaWVkRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLkxpc3QgZ2V0U2VydmVyQ2VydGlmaWNhdGVDaGFpbigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5uZXQuU2VydmVyU29ja2V0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgamF2YS5uZXQuU29ja2V0SW1wbEZhY3RvcnkgZmFjdG9yeQotCi0gamF2YS5uZXQuU29ja2V0SW1wbCBpbXBsCi0KLXByaXZhdGUgYm9vbGVhbiBpc0JvdW5kCi0KLXByaXZhdGUgYm9vbGVhbiBpc0Nsb3NlZAotCi1wcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gaXNDcmVhdGVkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWludAotamF2YS5uZXQuSW5ldEFkZHJlc3MpCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLWphdmEubmV0LlNvY2tldEltcGwpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1NvY2tldEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIGNoZWNrQ2xvc2VkQW5kQ3JlYXRlKAotYm9vbGVhbikKLQotc3RhdGljIGludCBkZWZhdWx0QmFja2xvZygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTb2NrZXRGYWN0b3J5KAotamF2YS5uZXQuU29ja2V0SW1wbEZhY3RvcnkpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLm5ldC5Tb2NrZXQgYWNjZXB0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgYmluZCgKLWphdmEubmV0LlNvY2tldEFkZHJlc3MpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGJpbmQoCi1qYXZhLm5ldC5Tb2NrZXRBZGRyZXNzCi1pbnQpCi0KLSB2b2lkIGNoZWNrTGlzdGVuKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjbG9zZSgpCi0KLXB1YmxpYyBqYXZhLm5pby5jaGFubmVscy5TZXJ2ZXJTb2NrZXRDaGFubmVsIGdldENoYW5uZWwoKQotCi1wdWJsaWMgamF2YS5uZXQuSW5ldEFkZHJlc3MgZ2V0SW5ldEFkZHJlc3MoKQotCi1wdWJsaWMgaW50IGdldExvY2FsUG9ydCgpCi0KLXB1YmxpYyBqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzIGdldExvY2FsU29ja2V0QWRkcmVzcygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1NvY2tldEV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXRSZWNlaXZlQnVmZmVyU2l6ZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1NvY2tldEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gZ2V0UmV1c2VBZGRyZXNzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXRTb1RpbWVvdXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgZmluYWwgdm9pZCBpbXBsQWNjZXB0KAotamF2YS5uZXQuU29ja2V0KQotCi1wdWJsaWMgYm9vbGVhbiBpc0JvdW5kKCkKLQotcHVibGljIGJvb2xlYW4gaXNDbG9zZWQoKQotCi1wdWJsaWMgdm9pZCBzZXRQZXJmb3JtYW5jZVByZWZlcmVuY2VzKAotaW50Ci1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvU29ja2V0RXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRSZWNlaXZlQnVmZmVyU2l6ZSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvU29ja2V0RXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRSZXVzZUFkZHJlc3MoCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldFNvVGltZW91dCgKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9NDEwNCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXQ7ICkKLSBjbGFzcyBqYXZhLm5ldC5Tb2NrZXQkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9Q29ubmVjdExvY2sgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvbmV0L1NvY2tldDsgKQotIGNsYXNzIGphdmEubmV0LlNvY2tldCRDb25uZWN0TG9jayBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KAotamF2YS5uZXQuU29ja2V0JDEpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MamF2YS9uZXQvU29ja2V0JDE7TGphdmEvbmV0L1NvY2tldCRDb25uZWN0TG9jazsgKQotcHVibGljIGNsYXNzIGphdmEubmV0LlNvY2tldCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIGludCBGTEFHX1NIVVRET1dOCi0KLXN0YXRpYyBmaW5hbCBpbnQgTVVMVElDQVNUX0lGCi0KLXN0YXRpYyBmaW5hbCBpbnQgTVVMVElDQVNUX1RUTAotCi1zdGF0aWMgZmluYWwgaW50IFRDUF9OT0RFTEFZCi0KLXN0YXRpYyBqYXZhLm5ldC5Tb2NrZXRJbXBsRmFjdG9yeSBmYWN0b3J5Ci0KLXByaXZhdGUgamF2YS5sYW5nLk9iamVjdCBjb25uZWN0TG9jawotCi0gamF2YS5uZXQuU29ja2V0SW1wbCBpbXBsCi0KLXByaXZhdGUgYm9vbGVhbiBpc0JvdW5kCi0KLXByaXZhdGUgYm9vbGVhbiBpc0Nsb3NlZAotCi1wcml2YXRlIGJvb2xlYW4gaXNDb25uZWN0ZWQKLQotcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIGlzQ3JlYXRlZAotCi1wcml2YXRlIGJvb2xlYW4gaXNJbnB1dFNodXRkb3duCi0KLXByaXZhdGUgYm9vbGVhbiBpc091dHB1dFNodXRkb3duCi0KLXByaXZhdGUgamF2YS5uZXQuUHJveHkgcHJveHkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1Vua25vd25Ib3N0RXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludAotamF2YS5uZXQuSW5ldEFkZHJlc3MKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotQGphdmEubGFuZy5EZXByZWNhdGVkCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubmV0LkluZXRBZGRyZXNzCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubmV0LkluZXRBZGRyZXNzCi1pbnQKLWphdmEubmV0LkluZXRBZGRyZXNzCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLUBqYXZhLmxhbmcuRGVwcmVjYXRlZAotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5uZXQuSW5ldEFkZHJlc3MKLWludAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5uZXQuUHJveHkpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1NvY2tldEV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotamF2YS5uZXQuU29ja2V0SW1wbCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvU29ja2V0RXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgY2hlY2tDbG9zZWRBbmRDcmVhdGUoCi1ib29sZWFuKQotCi1wcml2YXRlIHZvaWQgY2hlY2tDb25uZWN0UGVybWlzc2lvbigKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotc3RhdGljIGJvb2xlYW4gcHJlZmVySVB2NFN0YWNrKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyB2b2lkIHNldFNvY2tldEltcGxGYWN0b3J5KAotamF2YS5uZXQuU29ja2V0SW1wbEZhY3RvcnkpCi0KLSB2b2lkIGFjY2VwdGVkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgYmluZCgKLWphdmEubmV0LlNvY2tldEFkZHJlc3MpCi0KLSB2b2lkIGNoZWNrRGVzdGluYXRpb24oCi1qYXZhLm5ldC5JbmV0QWRkcmVzcwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjbG9zZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNvbm5lY3QoCi1qYXZhLm5ldC5Tb2NrZXRBZGRyZXNzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjb25uZWN0KAotamF2YS5uZXQuU29ja2V0QWRkcmVzcwotaW50KQotCi1wdWJsaWMgamF2YS5uaW8uY2hhbm5lbHMuU29ja2V0Q2hhbm5lbCBnZXRDaGFubmVsKCkKLQotcHVibGljIGphdmEubmV0LkluZXRBZGRyZXNzIGdldEluZXRBZGRyZXNzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuaW8uSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIGdldEtlZXBBbGl2ZSgpCi0KLXB1YmxpYyBqYXZhLm5ldC5JbmV0QWRkcmVzcyBnZXRMb2NhbEFkZHJlc3MoKQotCi1wdWJsaWMgaW50IGdldExvY2FsUG9ydCgpCi0KLXB1YmxpYyBqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzIGdldExvY2FsU29ja2V0QWRkcmVzcygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1NvY2tldEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gZ2V0T09CSW5saW5lKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuaW8uT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpCi0KLXB1YmxpYyBpbnQgZ2V0UG9ydCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1NvY2tldEV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXRSZWNlaXZlQnVmZmVyU2l6ZSgpCi0KLXB1YmxpYyBqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzIGdldFJlbW90ZVNvY2tldEFkZHJlc3MoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIGdldFJldXNlQWRkcmVzcygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1NvY2tldEV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXRTZW5kQnVmZmVyU2l6ZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1NvY2tldEV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXRTb0xpbmdlcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1NvY2tldEV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXRTb1RpbWVvdXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIGdldFRjcE5vRGVsYXkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgZ2V0VHJhZmZpY0NsYXNzKCkKLQotcHVibGljIGJvb2xlYW4gaXNCb3VuZCgpCi0KLXB1YmxpYyBib29sZWFuIGlzQ2xvc2VkKCkKLQotcHVibGljIGJvb2xlYW4gaXNDb25uZWN0ZWQoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0lucHV0U2h1dGRvd24oKQotCi1wdWJsaWMgYm9vbGVhbiBpc091dHB1dFNodXRkb3duKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2VuZFVyZ2VudERhdGEoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1NvY2tldEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0S2VlcEFsaXZlKAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvU29ja2V0RXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRPT0JJbmxpbmUoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRQZXJmb3JtYW5jZVByZWZlcmVuY2VzKAotaW50Ci1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvU29ja2V0RXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRSZWNlaXZlQnVmZmVyU2l6ZSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvU29ja2V0RXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRSZXVzZUFkZHJlc3MoCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldFNlbmRCdWZmZXJTaXplKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldFNvTGluZ2VyKAotYm9vbGVhbgotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldFNvVGltZW91dCgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvU29ja2V0RXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRUY3BOb0RlbGF5KAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvU29ja2V0RXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRUcmFmZmljQ2xhc3MoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNodXRkb3duSW5wdXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzaHV0ZG93bk91dHB1dCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLSB2b2lkIHN0YXJ0dXBTb2NrZXQoCi1qYXZhLm5ldC5JbmV0QWRkcmVzcwotaW50Ci1qYXZhLm5ldC5JbmV0QWRkcmVzcwotaW50Ci1ib29sZWFuKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgamF2YS5uZXQuU29ja2V0SW1wbCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLm5ldC5Tb2NrZXRPcHRpb25zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCBqYXZhLm5ldC5JbmV0QWRkcmVzcyBhZGRyZXNzCi0KLXByb3RlY3RlZCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yIGZkCi0KLXByb3RlY3RlZCBpbnQgbG9jYWxwb3J0Ci0KLSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5JTmV0d29ya1N5c3RlbSBuZXRJbXBsCi0KLXByb3RlY3RlZCBpbnQgcG9ydAotCi1wcm90ZWN0ZWQgaW50IHJlY2VpdmVUaW1lb3V0Ci0KLSBib29sZWFuIHNodXRkb3duSW5wdXQKLQotIGJvb2xlYW4gc3RyZWFtaW5nCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYWNjZXB0KAotamF2YS5uZXQuU29ja2V0SW1wbCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGFic3RyYWN0IGludCBhdmFpbGFibGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBiaW5kKAotamF2YS5uZXQuSW5ldEFkZHJlc3MKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgY2xvc2UoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBjb25uZWN0KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBjb25uZWN0KAotamF2YS5uZXQuSW5ldEFkZHJlc3MKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgY29ubmVjdCgKLWphdmEubmV0LlNvY2tldEFkZHJlc3MKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgY3JlYXRlKAotYm9vbGVhbikKLQotcHJvdGVjdGVkIGphdmEuaW8uRmlsZURlc2NyaXB0b3IgZ2V0RmlsZURlc2NyaXB0b3IoKQotCi1wcm90ZWN0ZWQgamF2YS5uZXQuSW5ldEFkZHJlc3MgZ2V0SW5ldEFkZHJlc3MoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgYWJzdHJhY3QgamF2YS5pby5JbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpCi0KLXByb3RlY3RlZCBpbnQgZ2V0TG9jYWxQb3J0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvU29ja2V0RXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLk9iamVjdCBnZXRPcHRpb24oCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCBhYnN0cmFjdCBqYXZhLmlvLk91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKQotCi1wcm90ZWN0ZWQgaW50IGdldFBvcnQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBsaXN0ZW4oCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLSBpbnQgcmVhZCgKLWJ5dGVbXQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHNlbmRVcmdlbnREYXRhKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldE9wdGlvbigKLWludAotamF2YS5sYW5nLk9iamVjdCkKLQotcHJvdGVjdGVkIHZvaWQgc2V0UGVyZm9ybWFuY2VQcmVmZXJlbmNlcygKLWludAotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIHNodXRkb3duSW5wdXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBzaHV0ZG93bk91dHB1dCgpCi0KLXByb3RlY3RlZCBib29sZWFuIHN1cHBvcnRzVXJnZW50RGF0YSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotIGludCB3cml0ZSgKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEubmV0LlNvY2tldEltcGxGYWN0b3J5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm5ldC5Tb2NrZXRJbXBsIGNyZWF0ZVNvY2tldEltcGwoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIGphdmEubmV0LlNvY2tldFBlcm1pc3Npb24gZXh0ZW5kcyBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb24gaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSElHSEVTVF9QT1JUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMT1dFU1RfUE9SVAotCi1zdGF0aWMgZmluYWwgaW50IFNQX0FDQ0VQVAotCi1zdGF0aWMgZmluYWwgaW50IFNQX0NPTk5FQ1QKLQotc3RhdGljIGZpbmFsIGludCBTUF9MSVNURU4KLQotc3RhdGljIGZpbmFsIGludCBTUF9SRVNPTFZFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmdbXSBhY3Rpb25OYW1lcwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGFjdGlvbnMKLQotdHJhbnNpZW50IGludCBhY3Rpb25zTWFzawotCi10cmFuc2llbnQgamF2YS5sYW5nLlN0cmluZyBob3N0TmFtZQotCi10cmFuc2llbnQgamF2YS5sYW5nLlN0cmluZyBpcFN0cmluZwotCi1wcml2YXRlIHRyYW5zaWVudCBib29sZWFuIGlzUGFydGlhbFdpbGQKLQotcHJpdmF0ZSB0cmFuc2llbnQgYm9vbGVhbiBpc1dpbGQKLQotdHJhbnNpZW50IGludCBwb3J0TWF4Ci0KLXRyYW5zaWVudCBpbnQgcG9ydE1pbgotCi10cmFuc2llbnQgYm9vbGVhbiByZXNvbHZlZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGdldEhvc3RTdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZ2V0SVBTdHJpbmcoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgcGFyc2VQb3J0KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9sYW5nL0NsYXNzTm90Rm91bmRFeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCByZWFkT2JqZWN0KAotamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHNldEFjdGlvbnMoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgdG9DYW5vbmljYWxBY3Rpb25TdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoCi1qYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSkKLQotIGJvb2xlYW4gY2hlY2tIb3N0KAotamF2YS5uZXQuU29ja2V0UGVybWlzc2lvbikKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QWN0aW9ucygpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1wdWJsaWMgYm9vbGVhbiBpbXBsaWVzKAotamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uKQotCi1wdWJsaWMgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uQ29sbGVjdGlvbiBuZXdQZXJtaXNzaW9uQ29sbGVjdGlvbigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1maW5hbCBjbGFzcyBqYXZhLm5ldC5Tb2NrZXRQZXJtaXNzaW9uQ29sbGVjdGlvbiBleHRlbmRzIGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbkNvbGxlY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9WZWN0b3I8TGphdmEvc2VjdXJpdHkvUGVybWlzc2lvbjs+OyApCi1wcml2YXRlIGphdmEudXRpbC5WZWN0b3IgcGVybWlzc2lvbnMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCBhZGQoCi1qYXZhLnNlY3VyaXR5LlBlcm1pc3Npb24pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0VudW1lcmF0aW9uPExqYXZhL3NlY3VyaXR5L1Blcm1pc3Npb247PjsgKQotcHVibGljIGphdmEudXRpbC5FbnVtZXJhdGlvbiBlbGVtZW50cygpCi0KLXB1YmxpYyBib29sZWFuIGltcGxpZXMoCi1qYXZhLnNlY3VyaXR5LlBlcm1pc3Npb24pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5uZXQuU29ja2V0VGltZW91dEV4Y2VwdGlvbiBleHRlbmRzIGphdmEuaW8uSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL25ldC9VUkk7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9NDEwNCBuYW1lID1udWxsICkKLSBjbGFzcyBqYXZhLm5ldC5VUkkkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MiBuYW1lID1IZWxwZXIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvbmV0L1VSSTsgKQotIGNsYXNzIGphdmEubmV0LlVSSSRIZWxwZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGphdmEubmV0LlVSSSB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5uZXQuVVJJKQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLm5ldC5VUkkKLWphdmEubmV0LlVSSSQxKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9VUklTeW50YXhFeGNlcHRpb247ICkKLXN0YXRpYyB2b2lkIGFjY2VzcyQxMDAoCi1qYXZhLm5ldC5VUkkkSGVscGVyCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9VUklTeW50YXhFeGNlcHRpb247ICkKLXN0YXRpYyB2b2lkIGFjY2VzcyQxNTAwKAotamF2YS5uZXQuVVJJJEhlbHBlcgotYm9vbGVhbikKLQotcHJpdmF0ZSBib29sZWFuIGlzVmFsaWREb21haW5OYW1lKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRIZXhDaGFyKAotY2hhcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvVVJJU3ludGF4RXhjZXB0aW9uOyApCi1wcml2YXRlIGJvb2xlYW4gaXNWYWxpZEhvc3QoCi1ib29sZWFuCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIGJvb2xlYW4gaXNWYWxpZElQNFdvcmQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIGJvb2xlYW4gaXNWYWxpZElQNkFkZHJlc3MoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIGJvb2xlYW4gaXNWYWxpZElQdjRBZGRyZXNzKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvVVJJU3ludGF4RXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgcGFyc2VBdXRob3JpdHkoCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9VUklTeW50YXhFeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCBwYXJzZVVSSSgKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1VSSVN5bnRheEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHZhbGlkYXRlQXV0aG9yaXR5KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9VUklTeW50YXhFeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCB2YWxpZGF0ZUZyYWdtZW50KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9VUklTeW50YXhFeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCB2YWxpZGF0ZVBhdGgoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1VSSVN5bnRheEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHZhbGlkYXRlUXVlcnkoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1VSSVN5bnRheEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHZhbGlkYXRlU2NoZW1lKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9VUklTeW50YXhFeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCB2YWxpZGF0ZVNzcCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvVVJJU3ludGF4RXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgdmFsaWRhdGVVc2VyaW5mbygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxqYXZhL25ldC9VUkkkMTtMamF2YS9uZXQvVVJJJEhlbHBlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcvQ29tcGFyYWJsZTxMamF2YS9uZXQvVVJJOz47TGphdmEvaW8vU2VyaWFsaXphYmxlOyApCi1wdWJsaWMgZmluYWwgY2xhc3MgamF2YS5uZXQuVVJJIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5Db21wYXJhYmxlLCBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBhbGxMZWdhbAotCi1zdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBwdW5jdAotCi1zdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyByZXNlcnZlZAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgc29tZUxlZ2FsCi0KLXN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIHVucmVzZXJ2ZWQKLQotcHJpdmF0ZSB0cmFuc2llbnQgYm9vbGVhbiBhYnNvbHV0ZQotCi1wcml2YXRlIHRyYW5zaWVudCBqYXZhLmxhbmcuU3RyaW5nIGF1dGhvcml0eQotCi1wcml2YXRlIHRyYW5zaWVudCBqYXZhLmxhbmcuU3RyaW5nIGZyYWdtZW50Ci0KLXByaXZhdGUgdHJhbnNpZW50IGludCBoYXNoCi0KLXByaXZhdGUgdHJhbnNpZW50IGphdmEubGFuZy5TdHJpbmcgaG9zdAotCi1wcml2YXRlIHRyYW5zaWVudCBib29sZWFuIG9wYXF1ZQotCi1wcml2YXRlIHRyYW5zaWVudCBqYXZhLmxhbmcuU3RyaW5nIHBhdGgKLQotcHJpdmF0ZSB0cmFuc2llbnQgaW50IHBvcnQKLQotcHJpdmF0ZSB0cmFuc2llbnQgamF2YS5sYW5nLlN0cmluZyBxdWVyeQotCi1wcml2YXRlIHRyYW5zaWVudCBqYXZhLmxhbmcuU3RyaW5nIHNjaGVtZQotCi1wcml2YXRlIHRyYW5zaWVudCBqYXZhLmxhbmcuU3RyaW5nIHNjaGVtZXNwZWNpZmljcGFydAotCi1wcml2YXRlIHRyYW5zaWVudCBib29sZWFuIHNlcnZlckF1dGhvcml0eQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgc3RyaW5nCi0KLXByaXZhdGUgdHJhbnNpZW50IGphdmEubGFuZy5TdHJpbmcgdXNlcmluZm8KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvVVJJU3ludGF4RXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9VUklTeW50YXhFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1VSSVN5bnRheEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9VUklTeW50YXhFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1VSSVN5bnRheEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotc3RhdGljIGphdmEubGFuZy5TdHJpbmcgYWNjZXNzJDEwMDAoCi1qYXZhLm5ldC5VUkkpCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGFjY2VzcyQxMDAyKAotamF2YS5uZXQuVVJJCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1zdGF0aWMgamF2YS5sYW5nLlN0cmluZyBhY2Nlc3MkMTEwMigKLWphdmEubmV0LlVSSQotamF2YS5sYW5nLlN0cmluZykKLQotc3RhdGljIGphdmEubGFuZy5TdHJpbmcgYWNjZXNzJDEyMDIoCi1qYXZhLm5ldC5VUkkKLWphdmEubGFuZy5TdHJpbmcpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDEzMDIoCi1qYXZhLm5ldC5VUkkKLWludCkKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDE0MDIoCi1qYXZhLm5ldC5VUkkKLWJvb2xlYW4pCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGFjY2VzcyQyMDIoCi1qYXZhLm5ldC5VUkkKLWphdmEubGFuZy5TdHJpbmcpCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGFjY2VzcyQzMDAoCi1qYXZhLm5ldC5VUkkpCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGFjY2VzcyQzMDIoCi1qYXZhLm5ldC5VUkkKLWphdmEubGFuZy5TdHJpbmcpCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQ0MDIoCi1qYXZhLm5ldC5VUkkKLWJvb2xlYW4pCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGFjY2VzcyQ1MDAoCi1qYXZhLm5ldC5VUkkpCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGFjY2VzcyQ1MDIoCi1qYXZhLm5ldC5VUkkKLWphdmEubGFuZy5TdHJpbmcpCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGFjY2VzcyQ2MDAoCi1qYXZhLm5ldC5VUkkpCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGFjY2VzcyQ2MDIoCi1qYXZhLm5ldC5VUkkKLWphdmEubGFuZy5TdHJpbmcpCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQ3MDIoCi1qYXZhLm5ldC5VUkkKLWJvb2xlYW4pCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGFjY2VzcyQ4MDAoCi1qYXZhLm5ldC5VUkkpCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGFjY2VzcyQ4MDIoCi1qYXZhLm5ldC5VUkkKLWphdmEubGFuZy5TdHJpbmcpCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGFjY2VzcyQ5MDAoCi1qYXZhLm5ldC5VUkkpCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGFjY2VzcyQ5MDIoCi1qYXZhLm5ldC5VUkkKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBjb252ZXJ0SGV4VG9Mb3dlckNhc2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGphdmEubmV0LlVSSSBjcmVhdGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZGVjb2RlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBqYXZhLm5ldC5VUkkgZHVwbGljYXRlKCkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGVuY29kZU90aGVycygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgYm9vbGVhbiBlcXVhbHNIZXhDYXNlSW5zZW5zaXRpdmUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZ2V0SGFzaFN0cmluZygpCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBub3JtYWxpemUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcXVvdGVDb21wb25lbnQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL2xhbmcvQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoCi1qYXZhLmlvLk9iamVjdElucHV0U3RyZWFtKQotCi1wcml2YXRlIHZvaWQgc2V0U2NoZW1lU3BlY2lmaWNQYXJ0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9sYW5nL0NsYXNzTm90Rm91bmRFeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCB3cml0ZU9iamVjdCgKLWphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtKQotCi1wdWJsaWMgdm9sYXRpbGUgaW50IGNvbXBhcmVUbygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBpbnQgY29tcGFyZVRvKAotamF2YS5uZXQuVVJJKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRBdXRob3JpdHkoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRGcmFnbWVudCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEhvc3QoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRQYXRoKCkKLQotcHVibGljIGludCBnZXRQb3J0KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UXVlcnkoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRSYXdBdXRob3JpdHkoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRSYXdGcmFnbWVudCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFJhd1BhdGgoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRSYXdRdWVyeSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFJhd1NjaGVtZVNwZWNpZmljUGFydCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFJhd1VzZXJJbmZvKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U2NoZW1lKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U2NoZW1lU3BlY2lmaWNQYXJ0KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VXNlckluZm8oKQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLQotcHVibGljIGJvb2xlYW4gaXNBYnNvbHV0ZSgpCi0KLXB1YmxpYyBib29sZWFuIGlzT3BhcXVlKCkKLQotcHVibGljIGphdmEubmV0LlVSSSBub3JtYWxpemUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9VUklTeW50YXhFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLm5ldC5VUkkgcGFyc2VTZXJ2ZXJBdXRob3JpdHkoKQotCi1wdWJsaWMgamF2YS5uZXQuVVJJIHJlbGF0aXZpemUoCi1qYXZhLm5ldC5VUkkpCi0KLXB1YmxpYyBqYXZhLm5ldC5VUkkgcmVzb2x2ZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLm5ldC5VUkkgcmVzb2x2ZSgKLWphdmEubmV0LlVSSSkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9BU0NJSVN0cmluZygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvTWFsZm9ybWVkVVJMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5uZXQuVVJMIHRvVVJMKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLSBjbGFzcyBqYXZhLm5ldC5VUklFbmNvZGVyRGVjb2RlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgZGlnaXRzCi0KLXN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGVuY29kaW5nCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOyApCi1zdGF0aWMgamF2YS5sYW5nLlN0cmluZyBkZWNvZGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL1Vuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247ICkKLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGVuY29kZU90aGVycygKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsgKQotc3RhdGljIGphdmEubGFuZy5TdHJpbmcgcXVvdGVJbGxlZ2FsKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvVVJJU3ludGF4RXhjZXB0aW9uOyApCi1zdGF0aWMgdm9pZCB2YWxpZGF0ZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1VSSVN5bnRheEV4Y2VwdGlvbjsgKQotc3RhdGljIHZvaWQgdmFsaWRhdGVTaW1wbGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5FeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0KLXByaXZhdGUgaW50IGluZGV4Ci0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBpbnB1dAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIGludCBnZXRJbmRleCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldElucHV0KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TWVzc2FnZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFJlYXNvbigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgamF2YS5uZXQuVVJMIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLm5ldC5OZXRQZXJtaXNzaW9uIHNwZWNpZnlTdHJlYW1IYW5kbGVyUGVybWlzc2lvbgotCi1wcml2YXRlIHN0YXRpYyBqYXZhLm5ldC5VUkxTdHJlYW1IYW5kbGVyRmFjdG9yeSBzdHJlYW1IYW5kbGVyRmFjdG9yeQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaHRhYmxlPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL25ldC9VUkxTdHJlYW1IYW5kbGVyOz47ICkKLXByaXZhdGUgc3RhdGljIGphdmEudXRpbC5IYXNodGFibGUgc3RyZWFtSGFuZGxlcnMKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGF1dGhvcml0eQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZmlsZQotCi1wcml2YXRlIGludCBoYXNoQ29kZQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgaG9zdAotCi1wcml2YXRlIHRyYW5zaWVudCBqYXZhLmxhbmcuU3RyaW5nIHBhdGgKLQotcHJpdmF0ZSBpbnQgcG9ydAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcHJvdG9jb2wKLQotcHJpdmF0ZSB0cmFuc2llbnQgamF2YS5sYW5nLlN0cmluZyBxdWVyeQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVmCi0KLXRyYW5zaWVudCBqYXZhLm5ldC5VUkxTdHJlYW1IYW5kbGVyIHN0cm1IYW5kbGVyCi0KLXByaXZhdGUgdHJhbnNpZW50IGphdmEubGFuZy5TdHJpbmcgdXNlckluZm8KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L01hbGZvcm1lZFVSTEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvTWFsZm9ybWVkVVJMRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L01hbGZvcm1lZFVSTEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLm5ldC5VUkxTdHJlYW1IYW5kbGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9NYWxmb3JtZWRVUkxFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L01hbGZvcm1lZFVSTEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5uZXQuVVJMCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9NYWxmb3JtZWRVUkxFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubmV0LlVSTAotamF2YS5sYW5nLlN0cmluZwotamF2YS5uZXQuVVJMU3RyZWFtSGFuZGxlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoCi1qYXZhLmlvLk9iamVjdElucHV0U3RyZWFtKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgc2V0VVJMU3RyZWFtSGFuZGxlckZhY3RvcnkoCi1qYXZhLm5ldC5VUkxTdHJlYW1IYW5kbGVyRmFjdG9yeSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KAotamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0pCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLSB2b2lkIGZpeFVSTCgKLWJvb2xlYW4pCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEF1dGhvcml0eSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBqYXZhLmxhbmcuT2JqZWN0IGdldENvbnRlbnQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLk9iamVjdCBnZXRDb250ZW50KAotamF2YS5sYW5nLkNsYXNzW10pCi0KLXB1YmxpYyBpbnQgZ2V0RGVmYXVsdFBvcnQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRGaWxlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SG9zdCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFBhdGgoKQotCi1wdWJsaWMgaW50IGdldFBvcnQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRQcm90b2NvbCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFF1ZXJ5KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UmVmKCkKLQotIGphdmEubmV0LlVSTFN0cmVhbUhhbmRsZXIgZ2V0U3RyZWFtSGFuZGxlcigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFVzZXJJbmZvKCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLm5ldC5VUkxDb25uZWN0aW9uIG9wZW5Db25uZWN0aW9uKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubmV0LlVSTENvbm5lY3Rpb24gb3BlbkNvbm5lY3Rpb24oCi1qYXZhLm5ldC5Qcm94eSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIGphdmEuaW8uSW5wdXRTdHJlYW0gb3BlblN0cmVhbSgpCi0KLXB1YmxpYyBib29sZWFuIHNhbWVGaWxlKAotamF2YS5uZXQuVVJMKQotCi1wcm90ZWN0ZWQgdm9pZCBzZXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByb3RlY3RlZCB2b2lkIHNldCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWludAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotIHZvaWQgc2V0dXBTdHJlYW1IYW5kbGVyKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9FeHRlcm5hbEZvcm0oKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1VSSVN5bnRheEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubmV0LlVSSSB0b1VSSSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3NlY3VyaXR5L1ByaXZpbGVnZWRBY3Rpb248TGphdmEvdXRpbC9WZWN0b3I8TGphdmEvbmV0L1VSTDs+Oz47ICkKLSBjbGFzcyBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlciQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlciB0aGlzJDAKLQotZmluYWwgamF2YS5sYW5nLlN0cmluZyB2YWwkbmFtZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEubmV0LlVSTENsYXNzTG9hZGVyCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBydW4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9WZWN0b3I8TGphdmEvbmV0L1VSTDs+OyApCi1wdWJsaWMgamF2YS51dGlsLlZlY3RvciBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS9zZWN1cml0eS9Qcml2aWxlZ2VkQWN0aW9uPExqYXZhL25ldC9VUkxDbGFzc0xvYWRlcjs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1maW5hbCBjbGFzcyBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlciQyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBqYXZhLm5ldC5VUkxbXSB2YWwkdXJscwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEubmV0LlVSTFtdKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBydW4oKQotCi1wdWJsaWMgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXIgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvc2VjdXJpdHkvUHJpdmlsZWdlZEFjdGlvbjxMamF2YS9uZXQvVVJMQ2xhc3NMb2FkZXI7PjsgKQotZmluYWwgY2xhc3MgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXIkMyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgamF2YS5sYW5nLkNsYXNzTG9hZGVyIHZhbCRwYXJlbnRDbAotCi1maW5hbCBqYXZhLm5ldC5VUkxbXSB2YWwkdXJscwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEubmV0LlVSTFtdCi1qYXZhLmxhbmcuQ2xhc3NMb2FkZXIpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IHJ1bigpCi0KLXB1YmxpYyBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlciBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS9zZWN1cml0eS9Qcml2aWxlZ2VkQWN0aW9uPExqYXZhL2xhbmcvQ2xhc3M8Kj47PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotIGNsYXNzIGphdmEubmV0LlVSTENsYXNzTG9hZGVyJDQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGphdmEubmV0LlVSTENsYXNzTG9hZGVyIHRoaXMkMAotCi1maW5hbCBqYXZhLmxhbmcuU3RyaW5nIHZhbCRjbHNOYW1lCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXIKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS9sYW5nL0NsYXNzPCo+OyApCi1wdWJsaWMgamF2YS5sYW5nLkNsYXNzIHJ1bigpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3NlY3VyaXR5L1ByaXZpbGVnZWRBY3Rpb248TGphdmEvbmV0L1VSTDs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi0gY2xhc3MgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXIkNSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXIgdGhpcyQwCi0KLWZpbmFsIGphdmEubGFuZy5TdHJpbmcgdmFsJG5hbWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLm5ldC5VUkxDbGFzc0xvYWRlcgotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgcnVuKCkKLQotcHVibGljIGphdmEubmV0LlVSTCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEuc2VjdXJpdHkuU2VjdXJlQ2xhc3NMb2FkZXIgZXh0ZW5kcyBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLnV0aWwuSGFzaE1hcCBwZHMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oKQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuQ2xhc3NMb2FkZXIpCi0KLXByaXZhdGUgamF2YS5zZWN1cml0eS5Qcm90ZWN0aW9uRG9tYWluIGdldFBEKAotamF2YS5zZWN1cml0eS5Db2RlU291cmNlKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1N0cmluZztMamF2YS9uaW8vQnl0ZUJ1ZmZlcjtMamF2YS9zZWN1cml0eS9Db2RlU291cmNlOylMamF2YS9sYW5nL0NsYXNzPCo+OyApCi1wcm90ZWN0ZWQgZmluYWwgamF2YS5sYW5nLkNsYXNzIGRlZmluZUNsYXNzKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5uaW8uQnl0ZUJ1ZmZlcgotamF2YS5zZWN1cml0eS5Db2RlU291cmNlKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1N0cmluZztbQklJTGphdmEvc2VjdXJpdHkvQ29kZVNvdXJjZTspTGphdmEvbGFuZy9DbGFzczwqPjsgKQotcHJvdGVjdGVkIGZpbmFsIGphdmEubGFuZy5DbGFzcyBkZWZpbmVDbGFzcygKLWphdmEubGFuZy5TdHJpbmcKLWJ5dGVbXQotaW50Ci1pbnQKLWphdmEuc2VjdXJpdHkuQ29kZVNvdXJjZSkKLQotcHJvdGVjdGVkIGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbkNvbGxlY3Rpb24gZ2V0UGVybWlzc2lvbnMoCi1qYXZhLnNlY3VyaXR5LkNvZGVTb3VyY2UpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MamF2YS9uZXQvVVJMQ2xhc3NMb2FkZXIkU3ViVVJMQ2xhc3NMb2FkZXI7ICkKLXB1YmxpYyBjbGFzcyBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlciBleHRlbmRzIGphdmEuc2VjdXJpdHkuU2VjdXJlQ2xhc3NMb2FkZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5uZXQuVVJMW10gTk9fUEFUSAotCi1wcml2YXRlIGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbENvbnRleHQgY3VycmVudENvbnRleHQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0hhc2hNYXA8TGphdmEvbmV0L1VSTDtbTGphdmEvbmV0L1VSTDs+OyApCi0gamF2YS51dGlsLkhhc2hNYXAgZXh0ZW5zaW9ucwotCi1wcml2YXRlIGphdmEubmV0LlVSTFN0cmVhbUhhbmRsZXJGYWN0b3J5IGZhY3RvcnkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1bTGphdmEvdXRpbC9IYXNodGFibGU8TGphdmEvbGFuZy9TdHJpbmc7W0xqYXZhL25ldC9VUkw7PjsgKQotIGphdmEudXRpbC5IYXNodGFibGVbXSBpbmRleGVzCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9TZXQ8TGphdmEvbmV0L1VSTDs+OyApCi0gamF2YS51dGlsLlNldCBpbnZhbGlkVXJscwotCi1wcml2YXRlIGphdmEubGFuZy5PYmplY3QgbG9jawotCi0gamF2YS5uZXQuVVJMW10gb3JnVXJscwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvTWFwPExqYXZhL25ldC9VUkw7TGphdmEvdXRpbC9qYXIvSmFyRmlsZTs+OyApCi1wcml2YXRlIGphdmEudXRpbC5NYXAgcmVzQ2FjaGUKLQotIGphdmEubmV0LlVSTFtdIHVybHMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubmV0LlVSTFtdKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLm5ldC5VUkxbXQotamF2YS5sYW5nLkNsYXNzTG9hZGVyKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLm5ldC5VUkxbXQotamF2YS5sYW5nLkNsYXNzTG9hZGVyCi1qYXZhLm5ldC5VUkxTdHJlYW1IYW5kbGVyRmFjdG9yeSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvTWFsZm9ybWVkVVJMRXhjZXB0aW9uOyApCi1wcml2YXRlIGphdmEubmV0LlVSTCBjcmVhdGVTZWFyY2hVUkwoCi1qYXZhLm5ldC5VUkwpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgc3RhdGljIGJ5dGVbXSBnZXRCeXRlcygKLWphdmEuaW8uSW5wdXRTdHJlYW0KLWJvb2xlYW4pCi0KLXByaXZhdGUgamF2YS5uZXQuVVJMW10gZ2V0SW50ZXJuYWxVUkxzKAotamF2YS5uZXQuVVJMCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRGlyZWN0b3J5KAotamF2YS5uZXQuVVJMKQotCi1wcml2YXRlIGJvb2xlYW4gaXNTZWFsZWQoCi1qYXZhLnV0aWwuamFyLk1hbmlmZXN0Ci1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxLOkxqYXZhL2xhbmcvT2JqZWN0O1Y6TGphdmEvbGFuZy9PYmplY3Q7PihJKVtMamF2YS91dGlsL0hhc2h0YWJsZTxUSztUVjs+OyApCi1wcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuSGFzaHRhYmxlW10gbmV3SGFzaHRhYmxlQXJyYXkoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXIgbmV3SW5zdGFuY2UoCi1qYXZhLm5ldC5VUkxbXSkKLQotcHVibGljIHN0YXRpYyBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlciBuZXdJbnN0YW5jZSgKLWphdmEubmV0LlVSTFtdCi1qYXZhLmxhbmcuQ2xhc3NMb2FkZXIpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2lvL0lucHV0U3RyZWFtOylMamF2YS91dGlsL0xpc3Q8TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIGphdmEudXRpbC5MaXN0IHJlYWRMaW5lcygKLWphdmEuaW8uSW5wdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L01hbGZvcm1lZFVSTEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSBqYXZhLm5ldC5VUkwgdGFyZ2V0VVJMKAotamF2YS5uZXQuVVJMCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcm90ZWN0ZWQgdm9pZCBhZGRVUkwoCi1qYXZhLm5ldC5VUkwpCi0KLSBqYXZhLm5ldC5VUkxbXSBhZGRVUkwoCi1qYXZhLm5ldC5VUkxbXQotamF2YS5uZXQuVVJMKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgamF2YS5sYW5nLlBhY2thZ2UgZGVmaW5lUGFja2FnZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudXRpbC5qYXIuTWFuaWZlc3QKLWphdmEubmV0LlVSTCkKLQotIGphdmEubmV0LlVSTFtdIGV4cGxvcmUoCi1qYXZhLm5ldC5VUkwKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0NsYXNzTm90Rm91bmRFeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvQ2xhc3M8Kj47ICkKLXByb3RlY3RlZCBqYXZhLmxhbmcuQ2xhc3MgZmluZENsYXNzKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oW0xqYXZhL25ldC9VUkw7TGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvQ2xhc3M8Kj47ICkKLSBqYXZhLmxhbmcuQ2xhc3MgZmluZENsYXNzSW1wbCgKLWphdmEubmV0LlVSTFtdCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShbTGphdmEvbmV0L1VSTDtMamF2YS9sYW5nL1N0cmluZztJTGphdmEvdXRpbC9WZWN0b3I8TGphdmEvbmV0L1VSTDs+O1opTGphdmEvbGFuZy9PYmplY3Q7ICkKLSBqYXZhLmxhbmcuT2JqZWN0IGZpbmRJbkV4dGVuc2lvbnMoCi1qYXZhLm5ldC5VUkxbXQotamF2YS5sYW5nLlN0cmluZwotaW50Ci1qYXZhLnV0aWwuVmVjdG9yCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvdXRpbC9WZWN0b3I8TGphdmEvbmV0L1VSTDs+O1opTGphdmEvbGFuZy9PYmplY3Q7ICkKLSBqYXZhLmxhbmcuT2JqZWN0IGZpbmRJbkluZGV4KAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnV0aWwuVmVjdG9yCi1ib29sZWFuKQotCi1wdWJsaWMgamF2YS5uZXQuVVJMIGZpbmRSZXNvdXJjZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLSBqYXZhLm5ldC5VUkwgZmluZFJlc291cmNlSW1wbCgKLWphdmEubmV0LlVSTFtdCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvdXRpbC9FbnVtZXJhdGlvbjxMamF2YS9uZXQvVVJMOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEudXRpbC5FbnVtZXJhdGlvbiBmaW5kUmVzb3VyY2VzKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oW0xqYXZhL25ldC9VUkw7TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvdXRpbC9WZWN0b3I8TGphdmEvbmV0L1VSTDs+OylMamF2YS91dGlsL1ZlY3RvcjxMamF2YS9uZXQvVVJMOz47ICkKLSBqYXZhLnV0aWwuVmVjdG9yIGZpbmRSZXNvdXJjZXMoCi1qYXZhLm5ldC5VUkxbXQotamF2YS5sYW5nLlN0cmluZwotamF2YS51dGlsLlZlY3RvcikKLQotcHJvdGVjdGVkIGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbkNvbGxlY3Rpb24gZ2V0UGVybWlzc2lvbnMoCi1qYXZhLnNlY3VyaXR5LkNvZGVTb3VyY2UpCi0KLXB1YmxpYyBqYXZhLm5ldC5VUkxbXSBnZXRVUkxzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9U3ViVVJMQ2xhc3NMb2FkZXIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvbmV0L1VSTENsYXNzTG9hZGVyOyApCi0gY2xhc3MgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXIkU3ViVVJMQ2xhc3NMb2FkZXIgZXh0ZW5kcyBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGJvb2xlYW4gY2hlY2tpbmdQYWNrYWdlQWNjZXNzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS5uZXQuVVJMW10pCi0KLSB2b2lkIDxpbml0PigKLWphdmEubmV0LlVSTFtdCi1qYXZhLmxhbmcuQ2xhc3NMb2FkZXIpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvU3RyaW5nO1opTGphdmEvbGFuZy9DbGFzczwqPjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGphdmEubGFuZy5DbGFzcyBsb2FkQ2xhc3MoCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS9zZWN1cml0eS9Qcml2aWxlZ2VkQWN0aW9uPExqYXZhL2xhbmcvT2JqZWN0Oz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLSBjbGFzcyBqYXZhLm5ldC5VUkxDb25uZWN0aW9uJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGphdmEubmV0LlVSTENvbm5lY3Rpb24gdGhpcyQwCi0KLWZpbmFsIGphdmEubGFuZy5TdHJpbmcgdmFsJHR5cGVTdHJpbmcKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLm5ldC5VUkxDb25uZWN0aW9uCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL25ldC9VUkxDb25uZWN0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9RGVmYXVsdENvbnRlbnRIYW5kbGVyICkKLSBjbGFzcyBqYXZhLm5ldC5VUkxDb25uZWN0aW9uJERlZmF1bHRDb250ZW50SGFuZGxlciBleHRlbmRzIGphdmEubmV0LkNvbnRlbnRIYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0Q29udGVudCgKLWphdmEubmV0LlVSTENvbm5lY3Rpb24pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5uZXQuVVJMRGVjb2RlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGphdmEubGFuZy5EZXByZWNhdGVkCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZGVjb2RlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZGVjb2RlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLm5ldC5VUkxFbmNvZGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBkaWdpdHMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOyApCi1wcml2YXRlIHN0YXRpYyB2b2lkIGNvbnZlcnQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nQnVmZmVyCi1qYXZhLmxhbmcuU3RyaW5nKQotQGphdmEubGFuZy5EZXByZWNhdGVkCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZW5jb2RlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZW5jb2RlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZhLm5ldC5VUkxTdHJlYW1IYW5kbGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SG9zdCgKLWphdmEubmV0LlVSTCkKLQotcHJvdGVjdGVkIGJvb2xlYW4gZXF1YWxzKAotamF2YS5uZXQuVVJMCi1qYXZhLm5ldC5VUkwpCi0KLXByb3RlY3RlZCBpbnQgZ2V0RGVmYXVsdFBvcnQoKQotCi1wcm90ZWN0ZWQgamF2YS5uZXQuSW5ldEFkZHJlc3MgZ2V0SG9zdEFkZHJlc3MoCi1qYXZhLm5ldC5VUkwpCi0KLXByb3RlY3RlZCBpbnQgaGFzaENvZGUoCi1qYXZhLm5ldC5VUkwpCi0KLXByb3RlY3RlZCBib29sZWFuIGhvc3RzRXF1YWwoCi1qYXZhLm5ldC5VUkwKLWphdmEubmV0LlVSTCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGFic3RyYWN0IGphdmEubmV0LlVSTENvbm5lY3Rpb24gb3BlbkNvbm5lY3Rpb24oCi1qYXZhLm5ldC5VUkwpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uIG9wZW5Db25uZWN0aW9uKAotamF2YS5uZXQuVVJMCi1qYXZhLm5ldC5Qcm94eSkKLQotcHJvdGVjdGVkIHZvaWQgcGFyc2VVUkwoCi1qYXZhLm5ldC5VUkwKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50KQotCi1wcm90ZWN0ZWQgYm9vbGVhbiBzYW1lRmlsZSgKLWphdmEubmV0LlVSTAotamF2YS5uZXQuVVJMKQotQGphdmEubGFuZy5EZXByZWNhdGVkCi1wcm90ZWN0ZWQgdm9pZCBzZXRVUkwoCi1qYXZhLm5ldC5VUkwKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWludAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHJvdGVjdGVkIHZvaWQgc2V0VVJMKAotamF2YS5uZXQuVVJMCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIHRvRXh0ZXJuYWxGb3JtKAotamF2YS5uZXQuVVJMKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZhLm5ldC5VUkxTdHJlYW1IYW5kbGVyRmFjdG9yeSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5uZXQuVVJMU3RyZWFtSGFuZGxlciBjcmVhdGVVUkxTdHJlYW1IYW5kbGVyKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbiBleHRlbmRzIGphdmEuaW8uSU9FeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLm5ldC5Vbmtub3duU2VydmljZUV4Y2VwdGlvbiBleHRlbmRzIGphdmEuaW8uSU9FeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZhLm5pby5CdWZmZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBmaW5hbCBpbnQgVU5TRVRfTUFSSwotCi0gaW50IF9lbGVtZW50U2l6ZVNoaWZ0Ci0KLWZpbmFsIGludCBjYXBhY2l0eQotCi0gaW50IGxpbWl0Ci0KLSBpbnQgbWFyawotCi0gaW50IHBvc2l0aW9uCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotaW50KQotCi0gamF2YS5sYW5nLk9iamVjdCBfYXJyYXkoKQotCi0gaW50IF9hcnJheU9mZnNldCgpCi0KLXB1YmxpYyBmaW5hbCBpbnQgY2FwYWNpdHkoKQotCi1wdWJsaWMgZmluYWwgamF2YS5uaW8uQnVmZmVyIGNsZWFyKCkKLQotcHVibGljIGZpbmFsIGphdmEubmlvLkJ1ZmZlciBmbGlwKCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzUmVtYWluaW5nKCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNSZWFkT25seSgpCi0KLXB1YmxpYyBmaW5hbCBpbnQgbGltaXQoKQotCi1wdWJsaWMgZmluYWwgamF2YS5uaW8uQnVmZmVyIGxpbWl0KAotaW50KQotCi1wdWJsaWMgZmluYWwgamF2YS5uaW8uQnVmZmVyIG1hcmsoKQotCi1wdWJsaWMgZmluYWwgaW50IHBvc2l0aW9uKCkKLQotcHVibGljIGZpbmFsIGphdmEubmlvLkJ1ZmZlciBwb3NpdGlvbigKLWludCkKLQotcHVibGljIGZpbmFsIGludCByZW1haW5pbmcoKQotCi1wdWJsaWMgZmluYWwgamF2YS5uaW8uQnVmZmVyIHJlc2V0KCkKLQotcHVibGljIGZpbmFsIGphdmEubmlvLkJ1ZmZlciByZXdpbmQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9uaW8vQnVmZmVyO0xqYXZhL2xhbmcvQ29tcGFyYWJsZTxMamF2YS9uaW8vQnl0ZUJ1ZmZlcjs+OyApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgamF2YS5uaW8uQnl0ZUJ1ZmZlciBleHRlbmRzIGphdmEubmlvLkJ1ZmZlciBpbXBsZW1lbnRzIGphdmEubGFuZy5Db21wYXJhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5FbmRpYW5uZXNzIG9yZGVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotaW50KQotCi1wdWJsaWMgc3RhdGljIGphdmEubmlvLkJ5dGVCdWZmZXIgYWxsb2NhdGUoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5uaW8uQnl0ZUJ1ZmZlciBhbGxvY2F0ZURpcmVjdCgKLWludCkKLQotcHVibGljIHN0YXRpYyBqYXZhLm5pby5CeXRlQnVmZmVyIHdyYXAoCi1ieXRlW10pCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5uaW8uQnl0ZUJ1ZmZlciB3cmFwKAotYnl0ZVtdCi1pbnQKLWludCkKLQotIGphdmEubGFuZy5PYmplY3QgX2FycmF5KCkKLQotIGludCBfYXJyYXlPZmZzZXQoKQotCi1wdWJsaWMgZmluYWwgYnl0ZVtdIGFycmF5KCkKLQotcHVibGljIGZpbmFsIGludCBhcnJheU9mZnNldCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm5pby5DaGFyQnVmZmVyIGFzQ2hhckJ1ZmZlcigpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm5pby5Eb3VibGVCdWZmZXIgYXNEb3VibGVCdWZmZXIoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5uaW8uRmxvYXRCdWZmZXIgYXNGbG9hdEJ1ZmZlcigpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm5pby5JbnRCdWZmZXIgYXNJbnRCdWZmZXIoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5uaW8uTG9uZ0J1ZmZlciBhc0xvbmdCdWZmZXIoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5uaW8uQnl0ZUJ1ZmZlciBhc1JlYWRPbmx5QnVmZmVyKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubmlvLlNob3J0QnVmZmVyIGFzU2hvcnRCdWZmZXIoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5uaW8uQnl0ZUJ1ZmZlciBjb21wYWN0KCkKLQotcHVibGljIHZvbGF0aWxlIGludCBjb21wYXJlVG8oCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50IGNvbXBhcmVUbygKLWphdmEubmlvLkJ5dGVCdWZmZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm5pby5CeXRlQnVmZmVyIGR1cGxpY2F0ZSgpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBhYnN0cmFjdCBieXRlIGdldCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBieXRlIGdldCgKLWludCkKLQotcHVibGljIGphdmEubmlvLkJ5dGVCdWZmZXIgZ2V0KAotYnl0ZVtdKQotCi1wdWJsaWMgamF2YS5uaW8uQnl0ZUJ1ZmZlciBnZXQoCi1ieXRlW10KLWludAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgY2hhciBnZXRDaGFyKCkKLQotcHVibGljIGFic3RyYWN0IGNoYXIgZ2V0Q2hhcigKLWludCkKLQotcHVibGljIGFic3RyYWN0IGRvdWJsZSBnZXREb3VibGUoKQotCi1wdWJsaWMgYWJzdHJhY3QgZG91YmxlIGdldERvdWJsZSgKLWludCkKLQotcHVibGljIGFic3RyYWN0IGZsb2F0IGdldEZsb2F0KCkKLQotcHVibGljIGFic3RyYWN0IGZsb2F0IGdldEZsb2F0KAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldEludCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0SW50KAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgbG9uZyBnZXRMb25nKCkKLQotcHVibGljIGFic3RyYWN0IGxvbmcgZ2V0TG9uZygKLWludCkKLQotcHVibGljIGFic3RyYWN0IHNob3J0IGdldFNob3J0KCkKLQotcHVibGljIGFic3RyYWN0IHNob3J0IGdldFNob3J0KAotaW50KQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNBcnJheSgpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0RpcmVjdCgpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLm5pby5CeXRlQnVmZmVyIG9yZGVyKAotamF2YS5uaW8uQnl0ZU9yZGVyKQotCi1wdWJsaWMgZmluYWwgamF2YS5uaW8uQnl0ZU9yZGVyIG9yZGVyKCkKLQotIGphdmEubmlvLkJ5dGVCdWZmZXIgb3JkZXJJbXBsKAotamF2YS5uaW8uQnl0ZU9yZGVyKQotCi1hYnN0cmFjdCBieXRlW10gcHJvdGVjdGVkQXJyYXkoKQotCi1hYnN0cmFjdCBpbnQgcHJvdGVjdGVkQXJyYXlPZmZzZXQoKQotCi1hYnN0cmFjdCBib29sZWFuIHByb3RlY3RlZEhhc0FycmF5KCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubmlvLkJ5dGVCdWZmZXIgcHV0KAotYnl0ZSkKLQotcHVibGljIGFic3RyYWN0IGphdmEubmlvLkJ5dGVCdWZmZXIgcHV0KAotaW50Ci1ieXRlKQotCi1wdWJsaWMgamF2YS5uaW8uQnl0ZUJ1ZmZlciBwdXQoCi1qYXZhLm5pby5CeXRlQnVmZmVyKQotCi1wdWJsaWMgZmluYWwgamF2YS5uaW8uQnl0ZUJ1ZmZlciBwdXQoCi1ieXRlW10pCi0KLXB1YmxpYyBqYXZhLm5pby5CeXRlQnVmZmVyIHB1dCgKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm5pby5CeXRlQnVmZmVyIHB1dENoYXIoCi1jaGFyKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5uaW8uQnl0ZUJ1ZmZlciBwdXRDaGFyKAotaW50Ci1jaGFyKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5uaW8uQnl0ZUJ1ZmZlciBwdXREb3VibGUoCi1kb3VibGUpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm5pby5CeXRlQnVmZmVyIHB1dERvdWJsZSgKLWludAotZG91YmxlKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5uaW8uQnl0ZUJ1ZmZlciBwdXRGbG9hdCgKLWZsb2F0KQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5uaW8uQnl0ZUJ1ZmZlciBwdXRGbG9hdCgKLWludAotZmxvYXQpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm5pby5CeXRlQnVmZmVyIHB1dEludCgKLWludCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubmlvLkJ5dGVCdWZmZXIgcHV0SW50KAotaW50Ci1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm5pby5CeXRlQnVmZmVyIHB1dExvbmcoCi1pbnQKLWxvbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm5pby5CeXRlQnVmZmVyIHB1dExvbmcoCi1sb25nKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5uaW8uQnl0ZUJ1ZmZlciBwdXRTaG9ydCgKLWludAotc2hvcnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm5pby5CeXRlQnVmZmVyIHB1dFNob3J0KAotc2hvcnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm5pby5CeXRlQnVmZmVyIHNsaWNlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotYWJzdHJhY3QgY2xhc3MgamF2YS5uaW8uQmFzZUJ5dGVCdWZmZXIgZXh0ZW5kcyBqYXZhLm5pby5CeXRlQnVmZmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotaW50KQotCi1wdWJsaWMgZmluYWwgamF2YS5uaW8uQ2hhckJ1ZmZlciBhc0NoYXJCdWZmZXIoKQotCi1wdWJsaWMgZmluYWwgamF2YS5uaW8uRG91YmxlQnVmZmVyIGFzRG91YmxlQnVmZmVyKCkKLQotcHVibGljIGZpbmFsIGphdmEubmlvLkZsb2F0QnVmZmVyIGFzRmxvYXRCdWZmZXIoKQotCi1wdWJsaWMgZmluYWwgamF2YS5uaW8uSW50QnVmZmVyIGFzSW50QnVmZmVyKCkKLQotcHVibGljIGZpbmFsIGphdmEubmlvLkxvbmdCdWZmZXIgYXNMb25nQnVmZmVyKCkKLQotcHVibGljIGZpbmFsIGphdmEubmlvLlNob3J0QnVmZmVyIGFzU2hvcnRCdWZmZXIoKQotCi1wdWJsaWMgZmluYWwgY2hhciBnZXRDaGFyKCkKLQotcHVibGljIGZpbmFsIGNoYXIgZ2V0Q2hhcigKLWludCkKLQotcHVibGljIGZpbmFsIGphdmEubmlvLkJ5dGVCdWZmZXIgcHV0Q2hhcigKLWNoYXIpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLm5pby5CeXRlQnVmZmVyIHB1dENoYXIoCi1pbnQKLWNoYXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1maW5hbCBjbGFzcyBqYXZhLm5pby5CdWZmZXJGYWN0b3J5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5uaW8uQnl0ZUJ1ZmZlciBuZXdCeXRlQnVmZmVyKAotaW50KQotCi1wdWJsaWMgc3RhdGljIGphdmEubmlvLkJ5dGVCdWZmZXIgbmV3Qnl0ZUJ1ZmZlcigKLWJ5dGVbXSkKLQotcHVibGljIHN0YXRpYyBqYXZhLm5pby5DaGFyQnVmZmVyIG5ld0NoYXJCdWZmZXIoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5uaW8uQ2hhckJ1ZmZlciBuZXdDaGFyQnVmZmVyKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotcHVibGljIHN0YXRpYyBqYXZhLm5pby5DaGFyQnVmZmVyIG5ld0NoYXJCdWZmZXIoCi1jaGFyW10pCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5uaW8uQnl0ZUJ1ZmZlciBuZXdEaXJlY3RCeXRlQnVmZmVyKAotaW50KQotCi1wdWJsaWMgc3RhdGljIGphdmEubmlvLkRvdWJsZUJ1ZmZlciBuZXdEb3VibGVCdWZmZXIoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5uaW8uRG91YmxlQnVmZmVyIG5ld0RvdWJsZUJ1ZmZlcigKLWRvdWJsZVtdKQotCi1wdWJsaWMgc3RhdGljIGphdmEubmlvLkZsb2F0QnVmZmVyIG5ld0Zsb2F0QnVmZmVyKAotaW50KQotCi1wdWJsaWMgc3RhdGljIGphdmEubmlvLkZsb2F0QnVmZmVyIG5ld0Zsb2F0QnVmZmVyKAotZmxvYXRbXSkKLQotcHVibGljIHN0YXRpYyBqYXZhLm5pby5JbnRCdWZmZXIgbmV3SW50QnVmZmVyKAotaW50KQotCi1wdWJsaWMgc3RhdGljIGphdmEubmlvLkludEJ1ZmZlciBuZXdJbnRCdWZmZXIoCi1pbnRbXSkKLQotcHVibGljIHN0YXRpYyBqYXZhLm5pby5Mb25nQnVmZmVyIG5ld0xvbmdCdWZmZXIoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5uaW8uTG9uZ0J1ZmZlciBuZXdMb25nQnVmZmVyKAotbG9uZ1tdKQotCi1wdWJsaWMgc3RhdGljIGphdmEubmlvLlNob3J0QnVmZmVyIG5ld1Nob3J0QnVmZmVyKAotaW50KQotCi1wdWJsaWMgc3RhdGljIGphdmEubmlvLlNob3J0QnVmZmVyIG5ld1Nob3J0QnVmZmVyKAotc2hvcnRbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLm5pby5CdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5uaW8uQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBqYXZhLm5pby5CeXRlT3JkZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5uaW8uQnl0ZU9yZGVyIEJJR19FTkRJQU4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLm5pby5CeXRlT3JkZXIgTElUVExFX0VORElBTgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLm5pby5CeXRlT3JkZXIgTkFUSVZFX09SREVSCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBuYW1lCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBqYXZhLm5pby5CeXRlT3JkZXIgbmF0aXZlT3JkZXIoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL25pby9CdWZmZXI7TGphdmEvbGFuZy9Db21wYXJhYmxlPExqYXZhL25pby9DaGFyQnVmZmVyOz47TGphdmEvbGFuZy9DaGFyU2VxdWVuY2U7TGphdmEvbGFuZy9BcHBlbmRhYmxlO0xqYXZhL2xhbmcvUmVhZGFibGU7ICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZhLm5pby5DaGFyQnVmZmVyIGV4dGVuZHMgamF2YS5uaW8uQnVmZmVyIGltcGxlbWVudHMgamF2YS5sYW5nLkNvbXBhcmFibGUsIGphdmEubGFuZy5DaGFyU2VxdWVuY2UsIGphdmEubGFuZy5BcHBlbmRhYmxlLCBqYXZhLmxhbmcuUmVhZGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5uaW8uQ2hhckJ1ZmZlciBhbGxvY2F0ZSgKLWludCkKLQotcHVibGljIHN0YXRpYyBqYXZhLm5pby5DaGFyQnVmZmVyIHdyYXAoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotCi1wdWJsaWMgc3RhdGljIGphdmEubmlvLkNoYXJCdWZmZXIgd3JhcCgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIGphdmEubmlvLkNoYXJCdWZmZXIgd3JhcCgKLWNoYXJbXSkKLQotcHVibGljIHN0YXRpYyBqYXZhLm5pby5DaGFyQnVmZmVyIHdyYXAoCi1jaGFyW10KLWludAotaW50KQotCi0gamF2YS5sYW5nLk9iamVjdCBfYXJyYXkoKQotCi0gaW50IF9hcnJheU9mZnNldCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuQXBwZW5kYWJsZSBhcHBlbmQoCi1jaGFyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLkFwcGVuZGFibGUgYXBwZW5kKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5BcHBlbmRhYmxlIGFwcGVuZCgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UKLWludAotaW50KQotCi1wdWJsaWMgamF2YS5uaW8uQ2hhckJ1ZmZlciBhcHBlbmQoCi1jaGFyKQotCi1wdWJsaWMgamF2YS5uaW8uQ2hhckJ1ZmZlciBhcHBlbmQoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotCi1wdWJsaWMgamF2YS5uaW8uQ2hhckJ1ZmZlciBhcHBlbmQoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludCkKLQotcHVibGljIGZpbmFsIGNoYXJbXSBhcnJheSgpCi0KLXB1YmxpYyBmaW5hbCBpbnQgYXJyYXlPZmZzZXQoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5uaW8uQ2hhckJ1ZmZlciBhc1JlYWRPbmx5QnVmZmVyKCkKLQotcHVibGljIGZpbmFsIGNoYXIgY2hhckF0KAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5uaW8uQ2hhckJ1ZmZlciBjb21wYWN0KCkKLQotcHVibGljIHZvbGF0aWxlIGludCBjb21wYXJlVG8oCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50IGNvbXBhcmVUbygKLWphdmEubmlvLkNoYXJCdWZmZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm5pby5DaGFyQnVmZmVyIGR1cGxpY2F0ZSgpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBhYnN0cmFjdCBjaGFyIGdldCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBjaGFyIGdldCgKLWludCkKLQotcHVibGljIGphdmEubmlvLkNoYXJCdWZmZXIgZ2V0KAotY2hhcltdKQotCi1wdWJsaWMgamF2YS5uaW8uQ2hhckJ1ZmZlciBnZXQoCi1jaGFyW10KLWludAotaW50KQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNBcnJheSgpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0RpcmVjdCgpCi0KLXB1YmxpYyBmaW5hbCBpbnQgbGVuZ3RoKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubmlvLkJ5dGVPcmRlciBvcmRlcigpCi0KLWFic3RyYWN0IGNoYXJbXSBwcm90ZWN0ZWRBcnJheSgpCi0KLWFic3RyYWN0IGludCBwcm90ZWN0ZWRBcnJheU9mZnNldCgpCi0KLWFic3RyYWN0IGJvb2xlYW4gcHJvdGVjdGVkSGFzQXJyYXkoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5uaW8uQ2hhckJ1ZmZlciBwdXQoCi1jaGFyKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5uaW8uQ2hhckJ1ZmZlciBwdXQoCi1pbnQKLWNoYXIpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLm5pby5DaGFyQnVmZmVyIHB1dCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLm5pby5DaGFyQnVmZmVyIHB1dCgKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50KQotCi1wdWJsaWMgamF2YS5uaW8uQ2hhckJ1ZmZlciBwdXQoCi1qYXZhLm5pby5DaGFyQnVmZmVyKQotCi1wdWJsaWMgZmluYWwgamF2YS5uaW8uQ2hhckJ1ZmZlciBwdXQoCi1jaGFyW10pCi0KLXB1YmxpYyBqYXZhLm5pby5DaGFyQnVmZmVyIHB1dCgKLWNoYXJbXQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcmVhZCgKLWphdmEubmlvLkNoYXJCdWZmZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm5pby5DaGFyQnVmZmVyIHNsaWNlKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5DaGFyU2VxdWVuY2Ugc3ViU2VxdWVuY2UoCi1pbnQKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotYWJzdHJhY3QgY2xhc3MgamF2YS5uaW8uQ2hhckFycmF5QnVmZmVyIGV4dGVuZHMgamF2YS5uaW8uQ2hhckJ1ZmZlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgZmluYWwgY2hhcltdIGJhY2tpbmdBcnJheQotCi1wcm90ZWN0ZWQgZmluYWwgaW50IG9mZnNldAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWludCkKLQotIHZvaWQgPGluaXQ+KAotaW50Ci1jaGFyW10KLWludCkKLQotIHZvaWQgPGluaXQ+KAotY2hhcltdKQotCi1wdWJsaWMgZmluYWwgY2hhciBnZXQoKQotCi1wdWJsaWMgZmluYWwgY2hhciBnZXQoCi1pbnQpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLm5pby5DaGFyQnVmZmVyIGdldCgKLWNoYXJbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGlzRGlyZWN0KCkKLQotcHVibGljIGZpbmFsIGphdmEubmlvLkJ5dGVPcmRlciBvcmRlcigpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIHN1YlNlcXVlbmNlKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLWZpbmFsIGNsYXNzIGphdmEubmlvLkNoYXJTZXF1ZW5jZUFkYXB0ZXIgZXh0ZW5kcyBqYXZhLm5pby5DaGFyQnVmZmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGphdmEubGFuZy5DaGFyU2VxdWVuY2Ugc2VxdWVuY2UKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotCi1zdGF0aWMgamF2YS5uaW8uQ2hhclNlcXVlbmNlQWRhcHRlciBjb3B5KAotamF2YS5uaW8uQ2hhclNlcXVlbmNlQWRhcHRlcikKLQotcHVibGljIGphdmEubmlvLkNoYXJCdWZmZXIgYXNSZWFkT25seUJ1ZmZlcigpCi0KLXB1YmxpYyBqYXZhLm5pby5DaGFyQnVmZmVyIGNvbXBhY3QoKQotCi1wdWJsaWMgamF2YS5uaW8uQ2hhckJ1ZmZlciBkdXBsaWNhdGUoKQotCi1wdWJsaWMgY2hhciBnZXQoKQotCi1wdWJsaWMgY2hhciBnZXQoCi1pbnQpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLm5pby5DaGFyQnVmZmVyIGdldCgKLWNoYXJbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyBib29sZWFuIGlzRGlyZWN0KCkKLQotcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpCi0KLXB1YmxpYyBqYXZhLm5pby5CeXRlT3JkZXIgb3JkZXIoKQotCi1wcm90ZWN0ZWQgY2hhcltdIHByb3RlY3RlZEFycmF5KCkKLQotcHJvdGVjdGVkIGludCBwcm90ZWN0ZWRBcnJheU9mZnNldCgpCi0KLXByb3RlY3RlZCBib29sZWFuIHByb3RlY3RlZEhhc0FycmF5KCkKLQotcHVibGljIGphdmEubmlvLkNoYXJCdWZmZXIgcHV0KAotY2hhcikKLQotcHVibGljIGphdmEubmlvLkNoYXJCdWZmZXIgcHV0KAotaW50Ci1jaGFyKQotCi1wdWJsaWMgamF2YS5uaW8uQ2hhckJ1ZmZlciBwdXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludCkKLQotcHVibGljIGZpbmFsIGphdmEubmlvLkNoYXJCdWZmZXIgcHV0KAotY2hhcltdCi1pbnQKLWludCkKLQotcHVibGljIGphdmEubmlvLkNoYXJCdWZmZXIgc2xpY2UoKQotCi1wdWJsaWMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBzdWJTZXF1ZW5jZSgKLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLmludGVybmFsLkRpcmVjdEJ1ZmZlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBhZGRyZXNzVmFsaWRpdHlDaGVjaygpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGZyZWUoKQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uUGxhdGZvcm1BZGRyZXNzIGdldEJhc2VBZGRyZXNzKCkKLQotcHVibGljIGFic3RyYWN0IGludCBnZXRCeXRlQ2FwYWNpdHkoKQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uUGxhdGZvcm1BZGRyZXNzIGdldEVmZmVjdGl2ZUFkZHJlc3MoKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0FkZHJlc3NWYWxpZCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1maW5hbCBjbGFzcyBqYXZhLm5pby5DaGFyVG9CeXRlQnVmZmVyQWRhcHRlciBleHRlbmRzIGphdmEubmlvLkNoYXJCdWZmZXIgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLmludGVybmFsLkRpcmVjdEJ1ZmZlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgYm9vbGVhbiAkYXNzZXJ0aW9uc0Rpc2FibGVkCi0KLXByaXZhdGUgZmluYWwgamF2YS5uaW8uQnl0ZUJ1ZmZlciBieXRlQnVmZmVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLm5pby5CeXRlQnVmZmVyKQotCi1zdGF0aWMgamF2YS5uaW8uQ2hhckJ1ZmZlciB3cmFwKAotamF2YS5uaW8uQnl0ZUJ1ZmZlcikKLQotcHVibGljIHZvaWQgYWRkcmVzc1ZhbGlkaXR5Q2hlY2soKQotCi1wdWJsaWMgamF2YS5uaW8uQ2hhckJ1ZmZlciBhc1JlYWRPbmx5QnVmZmVyKCkKLQotcHVibGljIGphdmEubmlvLkNoYXJCdWZmZXIgY29tcGFjdCgpCi0KLXB1YmxpYyBqYXZhLm5pby5DaGFyQnVmZmVyIGR1cGxpY2F0ZSgpCi0KLXB1YmxpYyB2b2lkIGZyZWUoKQotCi1wdWJsaWMgY2hhciBnZXQoKQotCi1wdWJsaWMgY2hhciBnZXQoCi1pbnQpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5QbGF0Zm9ybUFkZHJlc3MgZ2V0QmFzZUFkZHJlc3MoKQotCi1wdWJsaWMgaW50IGdldEJ5dGVDYXBhY2l0eSgpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5QbGF0Zm9ybUFkZHJlc3MgZ2V0RWZmZWN0aXZlQWRkcmVzcygpCi0KLXB1YmxpYyBib29sZWFuIGlzQWRkcmVzc1ZhbGlkKCkKLQotcHVibGljIGJvb2xlYW4gaXNEaXJlY3QoKQotCi1wdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkKLQotcHVibGljIGphdmEubmlvLkJ5dGVPcmRlciBvcmRlcigpCi0KLXByb3RlY3RlZCBjaGFyW10gcHJvdGVjdGVkQXJyYXkoKQotCi1wcm90ZWN0ZWQgaW50IHByb3RlY3RlZEFycmF5T2Zmc2V0KCkKLQotcHJvdGVjdGVkIGJvb2xlYW4gcHJvdGVjdGVkSGFzQXJyYXkoKQotCi1wdWJsaWMgamF2YS5uaW8uQ2hhckJ1ZmZlciBwdXQoCi1jaGFyKQotCi1wdWJsaWMgamF2YS5uaW8uQ2hhckJ1ZmZlciBwdXQoCi1pbnQKLWNoYXIpCi0KLXB1YmxpYyBqYXZhLm5pby5DaGFyQnVmZmVyIHNsaWNlKCkKLQotcHVibGljIGphdmEubGFuZy5DaGFyU2VxdWVuY2Ugc3ViU2VxdWVuY2UoCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI0IG5hbWUgPVNhZmVBZGRyZXNzICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL25pby9EaXJlY3RCeXRlQnVmZmVyOyApCi1maW5hbCBjbGFzcyBqYXZhLm5pby5EaXJlY3RCeXRlQnVmZmVyJFNhZmVBZGRyZXNzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uUGxhdGZvcm1BZGRyZXNzIGFkZHJlc3MKLQotcHJvdGVjdGVkIHZvbGF0aWxlIGJvb2xlYW4gaXNWYWxpZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLlBsYXRmb3JtQWRkcmVzcykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxqYXZhL25pby9EaXJlY3RCeXRlQnVmZmVyJFNhZmVBZGRyZXNzOyApCi1hYnN0cmFjdCBjbGFzcyBqYXZhLm5pby5EaXJlY3RCeXRlQnVmZmVyIGV4dGVuZHMgamF2YS5uaW8uQmFzZUJ5dGVCdWZmZXIgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLmludGVybmFsLkRpcmVjdEJ1ZmZlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgZmluYWwgaW50IG9mZnNldAotCi1wcm90ZWN0ZWQgZmluYWwgamF2YS5uaW8uRGlyZWN0Qnl0ZUJ1ZmZlciRTYWZlQWRkcmVzcyBzYWZlQWRkcmVzcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWludCkKLQotIHZvaWQgPGluaXQ+KAotamF2YS5uaW8uRGlyZWN0Qnl0ZUJ1ZmZlciRTYWZlQWRkcmVzcwotaW50Ci1pbnQpCi0KLXByaXZhdGUgdm9pZCBtYXJrQWRkcmVzc0ludmFsaWQoKQotCi1wdWJsaWMgZmluYWwgdm9pZCBhZGRyZXNzVmFsaWRpdHlDaGVjaygpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIGZyZWUoKQotCi1wdWJsaWMgZmluYWwgYnl0ZSBnZXQoKQotCi1wdWJsaWMgZmluYWwgYnl0ZSBnZXQoCi1pbnQpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLm5pby5CeXRlQnVmZmVyIGdldCgKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5QbGF0Zm9ybUFkZHJlc3MgZ2V0QmFzZUFkZHJlc3MoKQotCi1wdWJsaWMgZmluYWwgaW50IGdldEJ5dGVDYXBhY2l0eSgpCi0KLXB1YmxpYyBmaW5hbCBkb3VibGUgZ2V0RG91YmxlKCkKLQotcHVibGljIGZpbmFsIGRvdWJsZSBnZXREb3VibGUoCi1pbnQpCi0KLXB1YmxpYyBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5QbGF0Zm9ybUFkZHJlc3MgZ2V0RWZmZWN0aXZlQWRkcmVzcygpCi0KLXB1YmxpYyBmaW5hbCBmbG9hdCBnZXRGbG9hdCgpCi0KLXB1YmxpYyBmaW5hbCBmbG9hdCBnZXRGbG9hdCgKLWludCkKLQotcHVibGljIGZpbmFsIGludCBnZXRJbnQoKQotCi1wdWJsaWMgZmluYWwgaW50IGdldEludCgKLWludCkKLQotcHVibGljIGZpbmFsIGxvbmcgZ2V0TG9uZygpCi0KLXB1YmxpYyBmaW5hbCBsb25nIGdldExvbmcoCi1pbnQpCi0KLXB1YmxpYyBmaW5hbCBzaG9ydCBnZXRTaG9ydCgpCi0KLXB1YmxpYyBmaW5hbCBzaG9ydCBnZXRTaG9ydCgKLWludCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gaXNBZGRyZXNzVmFsaWQoKQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBpc0RpcmVjdCgpCi0KLXByb3RlY3RlZCBmaW5hbCBieXRlW10gcHJvdGVjdGVkQXJyYXkoKQotCi1wcm90ZWN0ZWQgZmluYWwgaW50IHByb3RlY3RlZEFycmF5T2Zmc2V0KCkKLQotcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gcHJvdGVjdGVkSGFzQXJyYXkoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotIGNsYXNzIGphdmEubmlvLkRpcmVjdEJ5dGVCdWZmZXJzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBmcmVlKAotamF2YS5uaW8uQnl0ZUJ1ZmZlcikKLQotcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5QbGF0Zm9ybUFkZHJlc3MgZ2V0RWZmZWN0aXZlQWRkcmVzcygKLWphdmEubmlvLkJ5dGVCdWZmZXIpCi0KLXByaXZhdGUgc3RhdGljIGphdmEubmlvLkRpcmVjdEJ5dGVCdWZmZXIgdG9EaXJlY3RCdWZmZXIoCi1qYXZhLm5pby5CeXRlQnVmZmVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9uaW8vQnVmZmVyO0xqYXZhL2xhbmcvQ29tcGFyYWJsZTxMamF2YS9uaW8vRG91YmxlQnVmZmVyOz47ICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZhLm5pby5Eb3VibGVCdWZmZXIgZXh0ZW5kcyBqYXZhLm5pby5CdWZmZXIgaW1wbGVtZW50cyBqYXZhLmxhbmcuQ29tcGFyYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWludCkKLQotcHVibGljIHN0YXRpYyBqYXZhLm5pby5Eb3VibGVCdWZmZXIgYWxsb2NhdGUoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5uaW8uRG91YmxlQnVmZmVyIHdyYXAoCi1kb3VibGVbXSkKLQotcHVibGljIHN0YXRpYyBqYXZhLm5pby5Eb3VibGVCdWZmZXIgd3JhcCgKLWRvdWJsZVtdCi1pbnQKLWludCkKLQotIGphdmEubGFuZy5PYmplY3QgX2FycmF5KCkKLQotIGludCBfYXJyYXlPZmZzZXQoKQotCi1wdWJsaWMgZmluYWwgZG91YmxlW10gYXJyYXkoKQotCi1wdWJsaWMgZmluYWwgaW50IGFycmF5T2Zmc2V0KCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubmlvLkRvdWJsZUJ1ZmZlciBhc1JlYWRPbmx5QnVmZmVyKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubmlvLkRvdWJsZUJ1ZmZlciBjb21wYWN0KCkKLQotcHVibGljIHZvbGF0aWxlIGludCBjb21wYXJlVG8oCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50IGNvbXBhcmVUbygKLWphdmEubmlvLkRvdWJsZUJ1ZmZlcikKLQotcHVibGljIGFic3RyYWN0IGphdmEubmlvLkRvdWJsZUJ1ZmZlciBkdXBsaWNhdGUoKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYWJzdHJhY3QgZG91YmxlIGdldCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBkb3VibGUgZ2V0KAotaW50KQotCi1wdWJsaWMgamF2YS5uaW8uRG91YmxlQnVmZmVyIGdldCgKLWRvdWJsZVtdKQotCi1wdWJsaWMgamF2YS5uaW8uRG91YmxlQnVmZmVyIGdldCgKLWRvdWJsZVtdCi1pbnQKLWludCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzQXJyYXkoKQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNEaXJlY3QoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5uaW8uQnl0ZU9yZGVyIG9yZGVyKCkKLQotYWJzdHJhY3QgZG91YmxlW10gcHJvdGVjdGVkQXJyYXkoKQotCi1hYnN0cmFjdCBpbnQgcHJvdGVjdGVkQXJyYXlPZmZzZXQoKQotCi1hYnN0cmFjdCBib29sZWFuIHByb3RlY3RlZEhhc0FycmF5KCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubmlvLkRvdWJsZUJ1ZmZlciBwdXQoCi1kb3VibGUpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm5pby5Eb3VibGVCdWZmZXIgcHV0KAotaW50Ci1kb3VibGUpCi0KLXB1YmxpYyBqYXZhLm5pby5Eb3VibGVCdWZmZXIgcHV0KAotamF2YS5uaW8uRG91YmxlQnVmZmVyKQotCi1wdWJsaWMgZmluYWwgamF2YS5uaW8uRG91YmxlQnVmZmVyIHB1dCgKLWRvdWJsZVtdKQotCi1wdWJsaWMgamF2YS5uaW8uRG91YmxlQnVmZmVyIHB1dCgKLWRvdWJsZVtdCi1pbnQKLWludCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubmlvLkRvdWJsZUJ1ZmZlciBzbGljZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLWFic3RyYWN0IGNsYXNzIGphdmEubmlvLkRvdWJsZUFycmF5QnVmZmVyIGV4dGVuZHMgamF2YS5uaW8uRG91YmxlQnVmZmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCBmaW5hbCBkb3VibGVbXSBiYWNraW5nQXJyYXkKLQotcHJvdGVjdGVkIGZpbmFsIGludCBvZmZzZXQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1pbnQpCi0KLSB2b2lkIDxpbml0PigKLWludAotZG91YmxlW10KLWludCkKLQotIHZvaWQgPGluaXQ+KAotZG91YmxlW10pCi0KLXB1YmxpYyBmaW5hbCBkb3VibGUgZ2V0KCkKLQotcHVibGljIGZpbmFsIGRvdWJsZSBnZXQoCi1pbnQpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLm5pby5Eb3VibGVCdWZmZXIgZ2V0KAotZG91YmxlW10KLWludAotaW50KQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBpc0RpcmVjdCgpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLm5pby5CeXRlT3JkZXIgb3JkZXIoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotZmluYWwgY2xhc3MgamF2YS5uaW8uRG91YmxlVG9CeXRlQnVmZmVyQWRhcHRlciBleHRlbmRzIGphdmEubmlvLkRvdWJsZUJ1ZmZlciBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuRGlyZWN0QnVmZmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBmaW5hbCBib29sZWFuICRhc3NlcnRpb25zRGlzYWJsZWQKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLm5pby5CeXRlQnVmZmVyIGJ5dGVCdWZmZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLSB2b2lkIDxpbml0PigKLWphdmEubmlvLkJ5dGVCdWZmZXIpCi0KLXN0YXRpYyBqYXZhLm5pby5Eb3VibGVCdWZmZXIgd3JhcCgKLWphdmEubmlvLkJ5dGVCdWZmZXIpCi0KLXB1YmxpYyB2b2lkIGFkZHJlc3NWYWxpZGl0eUNoZWNrKCkKLQotcHVibGljIGphdmEubmlvLkRvdWJsZUJ1ZmZlciBhc1JlYWRPbmx5QnVmZmVyKCkKLQotcHVibGljIGphdmEubmlvLkRvdWJsZUJ1ZmZlciBjb21wYWN0KCkKLQotcHVibGljIGphdmEubmlvLkRvdWJsZUJ1ZmZlciBkdXBsaWNhdGUoKQotCi1wdWJsaWMgdm9pZCBmcmVlKCkKLQotcHVibGljIGRvdWJsZSBnZXQoKQotCi1wdWJsaWMgZG91YmxlIGdldCgKLWludCkKLQotcHVibGljIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLlBsYXRmb3JtQWRkcmVzcyBnZXRCYXNlQWRkcmVzcygpCi0KLXB1YmxpYyBpbnQgZ2V0Qnl0ZUNhcGFjaXR5KCkKLQotcHVibGljIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLlBsYXRmb3JtQWRkcmVzcyBnZXRFZmZlY3RpdmVBZGRyZXNzKCkKLQotcHVibGljIGJvb2xlYW4gaXNBZGRyZXNzVmFsaWQoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0RpcmVjdCgpCi0KLXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKQotCi1wdWJsaWMgamF2YS5uaW8uQnl0ZU9yZGVyIG9yZGVyKCkKLQotcHJvdGVjdGVkIGRvdWJsZVtdIHByb3RlY3RlZEFycmF5KCkKLQotcHJvdGVjdGVkIGludCBwcm90ZWN0ZWRBcnJheU9mZnNldCgpCi0KLXByb3RlY3RlZCBib29sZWFuIHByb3RlY3RlZEhhc0FycmF5KCkKLQotcHVibGljIGphdmEubmlvLkRvdWJsZUJ1ZmZlciBwdXQoCi1kb3VibGUpCi0KLXB1YmxpYyBqYXZhLm5pby5Eb3VibGVCdWZmZXIgcHV0KAotaW50Ci1kb3VibGUpCi0KLXB1YmxpYyBqYXZhLm5pby5Eb3VibGVCdWZmZXIgc2xpY2UoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9uaW8vQnVmZmVyO0xqYXZhL2xhbmcvQ29tcGFyYWJsZTxMamF2YS9uaW8vRmxvYXRCdWZmZXI7PjsgKQotcHVibGljIGFic3RyYWN0IGNsYXNzIGphdmEubmlvLkZsb2F0QnVmZmVyIGV4dGVuZHMgamF2YS5uaW8uQnVmZmVyIGltcGxlbWVudHMgamF2YS5sYW5nLkNvbXBhcmFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5uaW8uRmxvYXRCdWZmZXIgYWxsb2NhdGUoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5uaW8uRmxvYXRCdWZmZXIgd3JhcCgKLWZsb2F0W10pCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5uaW8uRmxvYXRCdWZmZXIgd3JhcCgKLWZsb2F0W10KLWludAotaW50KQotCi0gamF2YS5sYW5nLk9iamVjdCBfYXJyYXkoKQotCi0gaW50IF9hcnJheU9mZnNldCgpCi0KLXB1YmxpYyBmaW5hbCBmbG9hdFtdIGFycmF5KCkKLQotcHVibGljIGZpbmFsIGludCBhcnJheU9mZnNldCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm5pby5GbG9hdEJ1ZmZlciBhc1JlYWRPbmx5QnVmZmVyKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubmlvLkZsb2F0QnVmZmVyIGNvbXBhY3QoKQotCi1wdWJsaWMgdm9sYXRpbGUgaW50IGNvbXBhcmVUbygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBpbnQgY29tcGFyZVRvKAotamF2YS5uaW8uRmxvYXRCdWZmZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm5pby5GbG9hdEJ1ZmZlciBkdXBsaWNhdGUoKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYWJzdHJhY3QgZmxvYXQgZ2V0KCkKLQotcHVibGljIGFic3RyYWN0IGZsb2F0IGdldCgKLWludCkKLQotcHVibGljIGphdmEubmlvLkZsb2F0QnVmZmVyIGdldCgKLWZsb2F0W10pCi0KLXB1YmxpYyBqYXZhLm5pby5GbG9hdEJ1ZmZlciBnZXQoCi1mbG9hdFtdCi1pbnQKLWludCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzQXJyYXkoKQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNEaXJlY3QoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5uaW8uQnl0ZU9yZGVyIG9yZGVyKCkKLQotYWJzdHJhY3QgZmxvYXRbXSBwcm90ZWN0ZWRBcnJheSgpCi0KLWFic3RyYWN0IGludCBwcm90ZWN0ZWRBcnJheU9mZnNldCgpCi0KLWFic3RyYWN0IGJvb2xlYW4gcHJvdGVjdGVkSGFzQXJyYXkoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5uaW8uRmxvYXRCdWZmZXIgcHV0KAotZmxvYXQpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm5pby5GbG9hdEJ1ZmZlciBwdXQoCi1pbnQKLWZsb2F0KQotCi1wdWJsaWMgamF2YS5uaW8uRmxvYXRCdWZmZXIgcHV0KAotamF2YS5uaW8uRmxvYXRCdWZmZXIpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLm5pby5GbG9hdEJ1ZmZlciBwdXQoCi1mbG9hdFtdKQotCi1wdWJsaWMgamF2YS5uaW8uRmxvYXRCdWZmZXIgcHV0KAotZmxvYXRbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm5pby5GbG9hdEJ1ZmZlciBzbGljZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLWFic3RyYWN0IGNsYXNzIGphdmEubmlvLkZsb2F0QXJyYXlCdWZmZXIgZXh0ZW5kcyBqYXZhLm5pby5GbG9hdEJ1ZmZlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgZmluYWwgZmxvYXRbXSBiYWNraW5nQXJyYXkKLQotcHJvdGVjdGVkIGZpbmFsIGludCBvZmZzZXQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1pbnQpCi0KLSB2b2lkIDxpbml0PigKLWludAotZmxvYXRbXQotaW50KQotCi0gdm9pZCA8aW5pdD4oCi1mbG9hdFtdKQotCi1wdWJsaWMgZmluYWwgZmxvYXQgZ2V0KCkKLQotcHVibGljIGZpbmFsIGZsb2F0IGdldCgKLWludCkKLQotcHVibGljIGZpbmFsIGphdmEubmlvLkZsb2F0QnVmZmVyIGdldCgKLWZsb2F0W10KLWludAotaW50KQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBpc0RpcmVjdCgpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLm5pby5CeXRlT3JkZXIgb3JkZXIoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotZmluYWwgY2xhc3MgamF2YS5uaW8uRmxvYXRUb0J5dGVCdWZmZXJBZGFwdGVyIGV4dGVuZHMgamF2YS5uaW8uRmxvYXRCdWZmZXIgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLmludGVybmFsLkRpcmVjdEJ1ZmZlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgYm9vbGVhbiAkYXNzZXJ0aW9uc0Rpc2FibGVkCi0KLXByaXZhdGUgZmluYWwgamF2YS5uaW8uQnl0ZUJ1ZmZlciBieXRlQnVmZmVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLm5pby5CeXRlQnVmZmVyKQotCi1zdGF0aWMgamF2YS5uaW8uRmxvYXRCdWZmZXIgd3JhcCgKLWphdmEubmlvLkJ5dGVCdWZmZXIpCi0KLXB1YmxpYyB2b2lkIGFkZHJlc3NWYWxpZGl0eUNoZWNrKCkKLQotcHVibGljIGphdmEubmlvLkZsb2F0QnVmZmVyIGFzUmVhZE9ubHlCdWZmZXIoKQotCi1wdWJsaWMgamF2YS5uaW8uRmxvYXRCdWZmZXIgY29tcGFjdCgpCi0KLXB1YmxpYyBqYXZhLm5pby5GbG9hdEJ1ZmZlciBkdXBsaWNhdGUoKQotCi1wdWJsaWMgdm9pZCBmcmVlKCkKLQotcHVibGljIGZsb2F0IGdldCgpCi0KLXB1YmxpYyBmbG9hdCBnZXQoCi1pbnQpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5QbGF0Zm9ybUFkZHJlc3MgZ2V0QmFzZUFkZHJlc3MoKQotCi1wdWJsaWMgaW50IGdldEJ5dGVDYXBhY2l0eSgpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5QbGF0Zm9ybUFkZHJlc3MgZ2V0RWZmZWN0aXZlQWRkcmVzcygpCi0KLXB1YmxpYyBib29sZWFuIGlzQWRkcmVzc1ZhbGlkKCkKLQotcHVibGljIGJvb2xlYW4gaXNEaXJlY3QoKQotCi1wdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkKLQotcHVibGljIGphdmEubmlvLkJ5dGVPcmRlciBvcmRlcigpCi0KLXByb3RlY3RlZCBmbG9hdFtdIHByb3RlY3RlZEFycmF5KCkKLQotcHJvdGVjdGVkIGludCBwcm90ZWN0ZWRBcnJheU9mZnNldCgpCi0KLXByb3RlY3RlZCBib29sZWFuIHByb3RlY3RlZEhhc0FycmF5KCkKLQotcHVibGljIGphdmEubmlvLkZsb2F0QnVmZmVyIHB1dCgKLWZsb2F0KQotCi1wdWJsaWMgamF2YS5uaW8uRmxvYXRCdWZmZXIgcHV0KAotaW50Ci1mbG9hdCkKLQotcHVibGljIGphdmEubmlvLkZsb2F0QnVmZmVyIHNsaWNlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLWFic3RyYWN0IGNsYXNzIGphdmEubmlvLkhlYXBCeXRlQnVmZmVyIGV4dGVuZHMgamF2YS5uaW8uQmFzZUJ5dGVCdWZmZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIGZpbmFsIGJ5dGVbXSBiYWNraW5nQXJyYXkKLQotcHJvdGVjdGVkIGZpbmFsIGludCBvZmZzZXQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1pbnQpCi0KLSB2b2lkIDxpbml0PigKLWJ5dGVbXSkKLQotIHZvaWQgPGluaXQ+KAotYnl0ZVtdCi1pbnQKLWludCkKLQotcHVibGljIGZpbmFsIGJ5dGUgZ2V0KCkKLQotcHVibGljIGZpbmFsIGJ5dGUgZ2V0KAotaW50KQotCi1wdWJsaWMgZmluYWwgamF2YS5uaW8uQnl0ZUJ1ZmZlciBnZXQoCi1ieXRlW10KLWludAotaW50KQotCi1wdWJsaWMgZmluYWwgZG91YmxlIGdldERvdWJsZSgpCi0KLXB1YmxpYyBmaW5hbCBkb3VibGUgZ2V0RG91YmxlKAotaW50KQotCi1wdWJsaWMgZmluYWwgZmxvYXQgZ2V0RmxvYXQoKQotCi1wdWJsaWMgZmluYWwgZmxvYXQgZ2V0RmxvYXQoCi1pbnQpCi0KLXB1YmxpYyBmaW5hbCBpbnQgZ2V0SW50KCkKLQotcHVibGljIGZpbmFsIGludCBnZXRJbnQoCi1pbnQpCi0KLXB1YmxpYyBmaW5hbCBsb25nIGdldExvbmcoKQotCi1wdWJsaWMgZmluYWwgbG9uZyBnZXRMb25nKAotaW50KQotCi1wdWJsaWMgZmluYWwgc2hvcnQgZ2V0U2hvcnQoKQotCi1wdWJsaWMgZmluYWwgc2hvcnQgZ2V0U2hvcnQoCi1pbnQpCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGlzRGlyZWN0KCkKLQotcHJvdGVjdGVkIGZpbmFsIGludCBsb2FkSW50KAotaW50KQotCi1wcm90ZWN0ZWQgZmluYWwgbG9uZyBsb2FkTG9uZygKLWludCkKLQotcHJvdGVjdGVkIGZpbmFsIHNob3J0IGxvYWRTaG9ydCgKLWludCkKLQotcHJvdGVjdGVkIGZpbmFsIHZvaWQgc3RvcmUoCi1pbnQKLWludCkKLQotcHJvdGVjdGVkIGZpbmFsIHZvaWQgc3RvcmUoCi1pbnQKLWxvbmcpCi0KLXByb3RlY3RlZCBmaW5hbCB2b2lkIHN0b3JlKAotaW50Ci1zaG9ydCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbmlvL0J1ZmZlcjtMamF2YS9sYW5nL0NvbXBhcmFibGU8TGphdmEvbmlvL0ludEJ1ZmZlcjs+OyApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgamF2YS5uaW8uSW50QnVmZmVyIGV4dGVuZHMgamF2YS5uaW8uQnVmZmVyIGltcGxlbWVudHMgamF2YS5sYW5nLkNvbXBhcmFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5uaW8uSW50QnVmZmVyIGFsbG9jYXRlKAotaW50KQotCi1wdWJsaWMgc3RhdGljIGphdmEubmlvLkludEJ1ZmZlciB3cmFwKAotaW50W10pCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5uaW8uSW50QnVmZmVyIHdyYXAoCi1pbnRbXQotaW50Ci1pbnQpCi0KLSBqYXZhLmxhbmcuT2JqZWN0IF9hcnJheSgpCi0KLSBpbnQgX2FycmF5T2Zmc2V0KCkKLQotcHVibGljIGZpbmFsIGludFtdIGFycmF5KCkKLQotcHVibGljIGZpbmFsIGludCBhcnJheU9mZnNldCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm5pby5JbnRCdWZmZXIgYXNSZWFkT25seUJ1ZmZlcigpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm5pby5JbnRCdWZmZXIgY29tcGFjdCgpCi0KLXB1YmxpYyB2b2xhdGlsZSBpbnQgY29tcGFyZVRvKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGludCBjb21wYXJlVG8oCi1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm5pby5JbnRCdWZmZXIgZHVwbGljYXRlKCkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGFic3RyYWN0IGludCBnZXQoKQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldCgKLWludCkKLQotcHVibGljIGphdmEubmlvLkludEJ1ZmZlciBnZXQoCi1pbnRbXSkKLQotcHVibGljIGphdmEubmlvLkludEJ1ZmZlciBnZXQoCi1pbnRbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGhhc0FycmF5KCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzRGlyZWN0KCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubmlvLkJ5dGVPcmRlciBvcmRlcigpCi0KLWFic3RyYWN0IGludFtdIHByb3RlY3RlZEFycmF5KCkKLQotYWJzdHJhY3QgaW50IHByb3RlY3RlZEFycmF5T2Zmc2V0KCkKLQotYWJzdHJhY3QgYm9vbGVhbiBwcm90ZWN0ZWRIYXNBcnJheSgpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm5pby5JbnRCdWZmZXIgcHV0KAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5uaW8uSW50QnVmZmVyIHB1dCgKLWludAotaW50KQotCi1wdWJsaWMgamF2YS5uaW8uSW50QnVmZmVyIHB1dCgKLWphdmEubmlvLkludEJ1ZmZlcikKLQotcHVibGljIGZpbmFsIGphdmEubmlvLkludEJ1ZmZlciBwdXQoCi1pbnRbXSkKLQotcHVibGljIGphdmEubmlvLkludEJ1ZmZlciBwdXQoCi1pbnRbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm5pby5JbnRCdWZmZXIgc2xpY2UoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1hYnN0cmFjdCBjbGFzcyBqYXZhLm5pby5JbnRBcnJheUJ1ZmZlciBleHRlbmRzIGphdmEubmlvLkludEJ1ZmZlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgZmluYWwgaW50W10gYmFja2luZ0FycmF5Ci0KLXByb3RlY3RlZCBmaW5hbCBpbnQgb2Zmc2V0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotaW50KQotCi0gdm9pZCA8aW5pdD4oCi1pbnQKLWludFtdCi1pbnQpCi0KLSB2b2lkIDxpbml0PigKLWludFtdKQotCi1wdWJsaWMgZmluYWwgaW50IGdldCgpCi0KLXB1YmxpYyBmaW5hbCBpbnQgZ2V0KAotaW50KQotCi1wdWJsaWMgZmluYWwgamF2YS5uaW8uSW50QnVmZmVyIGdldCgKLWludFtdCi1pbnQKLWludCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gaXNEaXJlY3QoKQotCi1wdWJsaWMgZmluYWwgamF2YS5uaW8uQnl0ZU9yZGVyIG9yZGVyKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLWZpbmFsIGNsYXNzIGphdmEubmlvLkludFRvQnl0ZUJ1ZmZlckFkYXB0ZXIgZXh0ZW5kcyBqYXZhLm5pby5JbnRCdWZmZXIgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLmludGVybmFsLkRpcmVjdEJ1ZmZlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgYm9vbGVhbiAkYXNzZXJ0aW9uc0Rpc2FibGVkCi0KLXByaXZhdGUgZmluYWwgamF2YS5uaW8uQnl0ZUJ1ZmZlciBieXRlQnVmZmVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLm5pby5CeXRlQnVmZmVyKQotCi1zdGF0aWMgamF2YS5uaW8uSW50QnVmZmVyIHdyYXAoCi1qYXZhLm5pby5CeXRlQnVmZmVyKQotCi1wdWJsaWMgdm9pZCBhZGRyZXNzVmFsaWRpdHlDaGVjaygpCi0KLXB1YmxpYyBqYXZhLm5pby5JbnRCdWZmZXIgYXNSZWFkT25seUJ1ZmZlcigpCi0KLXB1YmxpYyBqYXZhLm5pby5JbnRCdWZmZXIgY29tcGFjdCgpCi0KLXB1YmxpYyBqYXZhLm5pby5JbnRCdWZmZXIgZHVwbGljYXRlKCkKLQotcHVibGljIHZvaWQgZnJlZSgpCi0KLXB1YmxpYyBpbnQgZ2V0KCkKLQotcHVibGljIGludCBnZXQoCi1pbnQpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5QbGF0Zm9ybUFkZHJlc3MgZ2V0QmFzZUFkZHJlc3MoKQotCi1wdWJsaWMgaW50IGdldEJ5dGVDYXBhY2l0eSgpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5QbGF0Zm9ybUFkZHJlc3MgZ2V0RWZmZWN0aXZlQWRkcmVzcygpCi0KLXB1YmxpYyBib29sZWFuIGlzQWRkcmVzc1ZhbGlkKCkKLQotcHVibGljIGJvb2xlYW4gaXNEaXJlY3QoKQotCi1wdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkKLQotcHVibGljIGphdmEubmlvLkJ5dGVPcmRlciBvcmRlcigpCi0KLXByb3RlY3RlZCBpbnRbXSBwcm90ZWN0ZWRBcnJheSgpCi0KLXByb3RlY3RlZCBpbnQgcHJvdGVjdGVkQXJyYXlPZmZzZXQoKQotCi1wcm90ZWN0ZWQgYm9vbGVhbiBwcm90ZWN0ZWRIYXNBcnJheSgpCi0KLXB1YmxpYyBqYXZhLm5pby5JbnRCdWZmZXIgcHV0KAotaW50KQotCi1wdWJsaWMgamF2YS5uaW8uSW50QnVmZmVyIHB1dCgKLWludAotaW50KQotCi1wdWJsaWMgamF2YS5uaW8uSW50QnVmZmVyIHB1dCgKLWludFtdCi1pbnQKLWludCkKLQotcHVibGljIGphdmEubmlvLkludEJ1ZmZlciBzbGljZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5uaW8uSW52YWxpZE1hcmtFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL25pby9CdWZmZXI7TGphdmEvbGFuZy9Db21wYXJhYmxlPExqYXZhL25pby9Mb25nQnVmZmVyOz47ICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZhLm5pby5Mb25nQnVmZmVyIGV4dGVuZHMgamF2YS5uaW8uQnVmZmVyIGltcGxlbWVudHMgamF2YS5sYW5nLkNvbXBhcmFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5uaW8uTG9uZ0J1ZmZlciBhbGxvY2F0ZSgKLWludCkKLQotcHVibGljIHN0YXRpYyBqYXZhLm5pby5Mb25nQnVmZmVyIHdyYXAoCi1sb25nW10pCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5uaW8uTG9uZ0J1ZmZlciB3cmFwKAotbG9uZ1tdCi1pbnQKLWludCkKLQotIGphdmEubGFuZy5PYmplY3QgX2FycmF5KCkKLQotIGludCBfYXJyYXlPZmZzZXQoKQotCi1wdWJsaWMgZmluYWwgbG9uZ1tdIGFycmF5KCkKLQotcHVibGljIGZpbmFsIGludCBhcnJheU9mZnNldCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm5pby5Mb25nQnVmZmVyIGFzUmVhZE9ubHlCdWZmZXIoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5uaW8uTG9uZ0J1ZmZlciBjb21wYWN0KCkKLQotcHVibGljIHZvbGF0aWxlIGludCBjb21wYXJlVG8oCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50IGNvbXBhcmVUbygKLWphdmEubmlvLkxvbmdCdWZmZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm5pby5Mb25nQnVmZmVyIGR1cGxpY2F0ZSgpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBhYnN0cmFjdCBsb25nIGdldCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBsb25nIGdldCgKLWludCkKLQotcHVibGljIGphdmEubmlvLkxvbmdCdWZmZXIgZ2V0KAotbG9uZ1tdKQotCi1wdWJsaWMgamF2YS5uaW8uTG9uZ0J1ZmZlciBnZXQoCi1sb25nW10KLWludAotaW50KQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNBcnJheSgpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0RpcmVjdCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm5pby5CeXRlT3JkZXIgb3JkZXIoKQotCi1hYnN0cmFjdCBsb25nW10gcHJvdGVjdGVkQXJyYXkoKQotCi1hYnN0cmFjdCBpbnQgcHJvdGVjdGVkQXJyYXlPZmZzZXQoKQotCi1hYnN0cmFjdCBib29sZWFuIHByb3RlY3RlZEhhc0FycmF5KCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubmlvLkxvbmdCdWZmZXIgcHV0KAotaW50Ci1sb25nKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5uaW8uTG9uZ0J1ZmZlciBwdXQoCi1sb25nKQotCi1wdWJsaWMgamF2YS5uaW8uTG9uZ0J1ZmZlciBwdXQoCi1qYXZhLm5pby5Mb25nQnVmZmVyKQotCi1wdWJsaWMgZmluYWwgamF2YS5uaW8uTG9uZ0J1ZmZlciBwdXQoCi1sb25nW10pCi0KLXB1YmxpYyBqYXZhLm5pby5Mb25nQnVmZmVyIHB1dCgKLWxvbmdbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm5pby5Mb25nQnVmZmVyIHNsaWNlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotYWJzdHJhY3QgY2xhc3MgamF2YS5uaW8uTG9uZ0FycmF5QnVmZmVyIGV4dGVuZHMgamF2YS5uaW8uTG9uZ0J1ZmZlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgZmluYWwgbG9uZ1tdIGJhY2tpbmdBcnJheQotCi1wcm90ZWN0ZWQgZmluYWwgaW50IG9mZnNldAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWludCkKLQotIHZvaWQgPGluaXQ+KAotaW50Ci1sb25nW10KLWludCkKLQotIHZvaWQgPGluaXQ+KAotbG9uZ1tdKQotCi1wdWJsaWMgZmluYWwgbG9uZyBnZXQoKQotCi1wdWJsaWMgZmluYWwgbG9uZyBnZXQoCi1pbnQpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLm5pby5Mb25nQnVmZmVyIGdldCgKLWxvbmdbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGlzRGlyZWN0KCkKLQotcHVibGljIGZpbmFsIGphdmEubmlvLkJ5dGVPcmRlciBvcmRlcigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1maW5hbCBjbGFzcyBqYXZhLm5pby5Mb25nVG9CeXRlQnVmZmVyQWRhcHRlciBleHRlbmRzIGphdmEubmlvLkxvbmdCdWZmZXIgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLmludGVybmFsLkRpcmVjdEJ1ZmZlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgYm9vbGVhbiAkYXNzZXJ0aW9uc0Rpc2FibGVkCi0KLXByaXZhdGUgZmluYWwgamF2YS5uaW8uQnl0ZUJ1ZmZlciBieXRlQnVmZmVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLm5pby5CeXRlQnVmZmVyKQotCi1zdGF0aWMgamF2YS5uaW8uTG9uZ0J1ZmZlciB3cmFwKAotamF2YS5uaW8uQnl0ZUJ1ZmZlcikKLQotcHVibGljIHZvaWQgYWRkcmVzc1ZhbGlkaXR5Q2hlY2soKQotCi1wdWJsaWMgamF2YS5uaW8uTG9uZ0J1ZmZlciBhc1JlYWRPbmx5QnVmZmVyKCkKLQotcHVibGljIGphdmEubmlvLkxvbmdCdWZmZXIgY29tcGFjdCgpCi0KLXB1YmxpYyBqYXZhLm5pby5Mb25nQnVmZmVyIGR1cGxpY2F0ZSgpCi0KLXB1YmxpYyB2b2lkIGZyZWUoKQotCi1wdWJsaWMgbG9uZyBnZXQoKQotCi1wdWJsaWMgbG9uZyBnZXQoCi1pbnQpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5QbGF0Zm9ybUFkZHJlc3MgZ2V0QmFzZUFkZHJlc3MoKQotCi1wdWJsaWMgaW50IGdldEJ5dGVDYXBhY2l0eSgpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5QbGF0Zm9ybUFkZHJlc3MgZ2V0RWZmZWN0aXZlQWRkcmVzcygpCi0KLXB1YmxpYyBib29sZWFuIGlzQWRkcmVzc1ZhbGlkKCkKLQotcHVibGljIGJvb2xlYW4gaXNEaXJlY3QoKQotCi1wdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkKLQotcHVibGljIGphdmEubmlvLkJ5dGVPcmRlciBvcmRlcigpCi0KLXByb3RlY3RlZCBsb25nW10gcHJvdGVjdGVkQXJyYXkoKQotCi1wcm90ZWN0ZWQgaW50IHByb3RlY3RlZEFycmF5T2Zmc2V0KCkKLQotcHJvdGVjdGVkIGJvb2xlYW4gcHJvdGVjdGVkSGFzQXJyYXkoKQotCi1wdWJsaWMgamF2YS5uaW8uTG9uZ0J1ZmZlciBwdXQoCi1pbnQKLWxvbmcpCi0KLXB1YmxpYyBqYXZhLm5pby5Mb25nQnVmZmVyIHB1dCgKLWxvbmcpCi0KLXB1YmxpYyBqYXZhLm5pby5Mb25nQnVmZmVyIHNsaWNlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZhLm5pby5NYXBwZWRCeXRlQnVmZmVyIGV4dGVuZHMgamF2YS5uaW8uQnl0ZUJ1ZmZlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGludCBtYXBNb2RlCi0KLWZpbmFsIGphdmEubmlvLkRpcmVjdEJ5dGVCdWZmZXIgd3JhcHBlZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEubmlvLkJ5dGVCdWZmZXIpCi0KLSB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLlBsYXRmb3JtQWRkcmVzcwotaW50Ci1pbnQKLWludCkKLQotcHVibGljIGZpbmFsIGphdmEubmlvLk1hcHBlZEJ5dGVCdWZmZXIgZm9yY2UoKQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBpc0xvYWRlZCgpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLm5pby5NYXBwZWRCeXRlQnVmZmVyIGxvYWQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotIGNsYXNzIGphdmEubmlvLk1hcHBlZEJ5dGVCdWZmZXJBZGFwdGVyIGV4dGVuZHMgamF2YS5uaW8uTWFwcGVkQnl0ZUJ1ZmZlciBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuRGlyZWN0QnVmZmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDSEFSX1NJWkUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERPVUJMRV9TSVpFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTE9BVF9TSVpFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTlRFR0VSX1NJWkUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExPTkdfU0laRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0hPUlRfU0laRQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubmlvLkJ5dGVCdWZmZXIpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLlBsYXRmb3JtQWRkcmVzcwotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgYWRkcmVzc1ZhbGlkaXR5Q2hlY2soKQotCi1wdWJsaWMgamF2YS5uaW8uQ2hhckJ1ZmZlciBhc0NoYXJCdWZmZXIoKQotCi1wdWJsaWMgamF2YS5uaW8uRG91YmxlQnVmZmVyIGFzRG91YmxlQnVmZmVyKCkKLQotcHVibGljIGphdmEubmlvLkZsb2F0QnVmZmVyIGFzRmxvYXRCdWZmZXIoKQotCi1wdWJsaWMgamF2YS5uaW8uSW50QnVmZmVyIGFzSW50QnVmZmVyKCkKLQotcHVibGljIGphdmEubmlvLkxvbmdCdWZmZXIgYXNMb25nQnVmZmVyKCkKLQotcHVibGljIGphdmEubmlvLkJ5dGVCdWZmZXIgYXNSZWFkT25seUJ1ZmZlcigpCi0KLXB1YmxpYyBqYXZhLm5pby5TaG9ydEJ1ZmZlciBhc1Nob3J0QnVmZmVyKCkKLQotcHVibGljIGphdmEubmlvLkJ5dGVCdWZmZXIgY29tcGFjdCgpCi0KLXB1YmxpYyBqYXZhLm5pby5CeXRlQnVmZmVyIGR1cGxpY2F0ZSgpCi0KLXB1YmxpYyB2b2lkIGZyZWUoKQotCi1wdWJsaWMgYnl0ZSBnZXQoKQotCi1wdWJsaWMgYnl0ZSBnZXQoCi1pbnQpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5QbGF0Zm9ybUFkZHJlc3MgZ2V0QmFzZUFkZHJlc3MoKQotCi1wdWJsaWMgaW50IGdldEJ5dGVDYXBhY2l0eSgpCi0KLXB1YmxpYyBjaGFyIGdldENoYXIoKQotCi1wdWJsaWMgY2hhciBnZXRDaGFyKAotaW50KQotCi1wdWJsaWMgZG91YmxlIGdldERvdWJsZSgpCi0KLXB1YmxpYyBkb3VibGUgZ2V0RG91YmxlKAotaW50KQotCi1wdWJsaWMgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uUGxhdGZvcm1BZGRyZXNzIGdldEVmZmVjdGl2ZUFkZHJlc3MoKQotCi1wdWJsaWMgZmxvYXQgZ2V0RmxvYXQoKQotCi1wdWJsaWMgZmxvYXQgZ2V0RmxvYXQoCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0SW50KCkKLQotcHVibGljIGludCBnZXRJbnQoCi1pbnQpCi0KLXB1YmxpYyBsb25nIGdldExvbmcoKQotCi1wdWJsaWMgbG9uZyBnZXRMb25nKAotaW50KQotCi1wdWJsaWMgc2hvcnQgZ2V0U2hvcnQoKQotCi1wdWJsaWMgc2hvcnQgZ2V0U2hvcnQoCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIGlzQWRkcmVzc1ZhbGlkKCkKLQotcHVibGljIGJvb2xlYW4gaXNEaXJlY3QoKQotCi1wdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkKLQotIGphdmEubmlvLkJ5dGVCdWZmZXIgb3JkZXJJbXBsKAotamF2YS5uaW8uQnl0ZU9yZGVyKQotCi0gYnl0ZVtdIHByb3RlY3RlZEFycmF5KCkKLQotIGludCBwcm90ZWN0ZWRBcnJheU9mZnNldCgpCi0KLSBib29sZWFuIHByb3RlY3RlZEhhc0FycmF5KCkKLQotcHVibGljIGphdmEubmlvLkJ5dGVCdWZmZXIgcHV0KAotYnl0ZSkKLQotcHVibGljIGphdmEubmlvLkJ5dGVCdWZmZXIgcHV0KAotaW50Ci1ieXRlKQotCi1wdWJsaWMgamF2YS5uaW8uQnl0ZUJ1ZmZlciBwdXQoCi1ieXRlW10KLWludAotaW50KQotCi1wdWJsaWMgamF2YS5uaW8uQnl0ZUJ1ZmZlciBwdXRDaGFyKAotY2hhcikKLQotcHVibGljIGphdmEubmlvLkJ5dGVCdWZmZXIgcHV0Q2hhcigKLWludAotY2hhcikKLQotcHVibGljIGphdmEubmlvLkJ5dGVCdWZmZXIgcHV0RG91YmxlKAotZG91YmxlKQotCi1wdWJsaWMgamF2YS5uaW8uQnl0ZUJ1ZmZlciBwdXREb3VibGUoCi1pbnQKLWRvdWJsZSkKLQotcHVibGljIGphdmEubmlvLkJ5dGVCdWZmZXIgcHV0RmxvYXQoCi1mbG9hdCkKLQotcHVibGljIGphdmEubmlvLkJ5dGVCdWZmZXIgcHV0RmxvYXQoCi1pbnQKLWZsb2F0KQotCi1wdWJsaWMgamF2YS5uaW8uQnl0ZUJ1ZmZlciBwdXRJbnQoCi1pbnQpCi0KLXB1YmxpYyBqYXZhLm5pby5CeXRlQnVmZmVyIHB1dEludCgKLWludAotaW50KQotCi1wdWJsaWMgamF2YS5uaW8uQnl0ZUJ1ZmZlciBwdXRMb25nKAotaW50Ci1sb25nKQotCi1wdWJsaWMgamF2YS5uaW8uQnl0ZUJ1ZmZlciBwdXRMb25nKAotbG9uZykKLQotcHVibGljIGphdmEubmlvLkJ5dGVCdWZmZXIgcHV0U2hvcnQoCi1pbnQKLXNob3J0KQotCi1wdWJsaWMgamF2YS5uaW8uQnl0ZUJ1ZmZlciBwdXRTaG9ydCgKLXNob3J0KQotCi1wdWJsaWMgamF2YS5uaW8uQnl0ZUJ1ZmZlciBzbGljZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi0gY2xhc3MgamF2YS5uaW8uTklPQWNjZXNzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXN0YXRpYyBqYXZhLmxhbmcuT2JqZWN0IGdldEJhc2VBcnJheSgKLWphdmEubmlvLkJ1ZmZlcikKLQotc3RhdGljIGludCBnZXRCYXNlQXJyYXlPZmZzZXQoCi1qYXZhLm5pby5CdWZmZXIpCi0KLXN0YXRpYyBsb25nIGdldEJhc2VQb2ludGVyKAotamF2YS5uaW8uQnVmZmVyKQotCi1zdGF0aWMgaW50IGdldFJlbWFpbmluZ0J5dGVzKAotamF2YS5uaW8uQnVmZmVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEubmlvLlJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1maW5hbCBjbGFzcyBqYXZhLm5pby5SZWFkT25seUNoYXJBcnJheUJ1ZmZlciBleHRlbmRzIGphdmEubmlvLkNoYXJBcnJheUJ1ZmZlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWludAotY2hhcltdCi1pbnQpCi0KLXN0YXRpYyBqYXZhLm5pby5SZWFkT25seUNoYXJBcnJheUJ1ZmZlciBjb3B5KAotamF2YS5uaW8uQ2hhckFycmF5QnVmZmVyCi1pbnQpCi0KLXB1YmxpYyBqYXZhLm5pby5DaGFyQnVmZmVyIGFzUmVhZE9ubHlCdWZmZXIoKQotCi1wdWJsaWMgamF2YS5uaW8uQ2hhckJ1ZmZlciBjb21wYWN0KCkKLQotcHVibGljIGphdmEubmlvLkNoYXJCdWZmZXIgZHVwbGljYXRlKCkKLQotcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpCi0KLXByb3RlY3RlZCBjaGFyW10gcHJvdGVjdGVkQXJyYXkoKQotCi1wcm90ZWN0ZWQgaW50IHByb3RlY3RlZEFycmF5T2Zmc2V0KCkKLQotcHJvdGVjdGVkIGJvb2xlYW4gcHJvdGVjdGVkSGFzQXJyYXkoKQotCi1wdWJsaWMgamF2YS5uaW8uQ2hhckJ1ZmZlciBwdXQoCi1jaGFyKQotCi1wdWJsaWMgamF2YS5uaW8uQ2hhckJ1ZmZlciBwdXQoCi1pbnQKLWNoYXIpCi0KLXB1YmxpYyBqYXZhLm5pby5DaGFyQnVmZmVyIHB1dCgKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50KQotCi1wdWJsaWMgZmluYWwgamF2YS5uaW8uQ2hhckJ1ZmZlciBwdXQoCi1qYXZhLm5pby5DaGFyQnVmZmVyKQotCi1wdWJsaWMgZmluYWwgamF2YS5uaW8uQ2hhckJ1ZmZlciBwdXQoCi1jaGFyW10KLWludAotaW50KQotCi1wdWJsaWMgamF2YS5uaW8uQ2hhckJ1ZmZlciBzbGljZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1maW5hbCBjbGFzcyBqYXZhLm5pby5SZWFkT25seURpcmVjdEJ5dGVCdWZmZXIgZXh0ZW5kcyBqYXZhLm5pby5EaXJlY3RCeXRlQnVmZmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotamF2YS5uaW8uRGlyZWN0Qnl0ZUJ1ZmZlciRTYWZlQWRkcmVzcwotaW50Ci1pbnQpCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLlBsYXRmb3JtQWRkcmVzcwotaW50Ci1pbnQpCi0KLXN0YXRpYyBqYXZhLm5pby5SZWFkT25seURpcmVjdEJ5dGVCdWZmZXIgY29weSgKLWphdmEubmlvLkRpcmVjdEJ5dGVCdWZmZXIKLWludCkKLQotcHVibGljIGphdmEubmlvLkJ5dGVCdWZmZXIgYXNSZWFkT25seUJ1ZmZlcigpCi0KLXB1YmxpYyBqYXZhLm5pby5CeXRlQnVmZmVyIGNvbXBhY3QoKQotCi1wdWJsaWMgamF2YS5uaW8uQnl0ZUJ1ZmZlciBkdXBsaWNhdGUoKQotCi1wdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkKLQotcHVibGljIGphdmEubmlvLkJ5dGVCdWZmZXIgcHV0KAotYnl0ZSkKLQotcHVibGljIGphdmEubmlvLkJ5dGVCdWZmZXIgcHV0KAotaW50Ci1ieXRlKQotCi1wdWJsaWMgamF2YS5uaW8uQnl0ZUJ1ZmZlciBwdXQoCi1qYXZhLm5pby5CeXRlQnVmZmVyKQotCi1wdWJsaWMgamF2YS5uaW8uQnl0ZUJ1ZmZlciBwdXQoCi1ieXRlW10KLWludAotaW50KQotCi1wdWJsaWMgamF2YS5uaW8uQnl0ZUJ1ZmZlciBwdXREb3VibGUoCi1kb3VibGUpCi0KLXB1YmxpYyBqYXZhLm5pby5CeXRlQnVmZmVyIHB1dERvdWJsZSgKLWludAotZG91YmxlKQotCi1wdWJsaWMgamF2YS5uaW8uQnl0ZUJ1ZmZlciBwdXRGbG9hdCgKLWZsb2F0KQotCi1wdWJsaWMgamF2YS5uaW8uQnl0ZUJ1ZmZlciBwdXRGbG9hdCgKLWludAotZmxvYXQpCi0KLXB1YmxpYyBqYXZhLm5pby5CeXRlQnVmZmVyIHB1dEludCgKLWludCkKLQotcHVibGljIGphdmEubmlvLkJ5dGVCdWZmZXIgcHV0SW50KAotaW50Ci1pbnQpCi0KLXB1YmxpYyBqYXZhLm5pby5CeXRlQnVmZmVyIHB1dExvbmcoCi1pbnQKLWxvbmcpCi0KLXB1YmxpYyBqYXZhLm5pby5CeXRlQnVmZmVyIHB1dExvbmcoCi1sb25nKQotCi1wdWJsaWMgamF2YS5uaW8uQnl0ZUJ1ZmZlciBwdXRTaG9ydCgKLWludAotc2hvcnQpCi0KLXB1YmxpYyBqYXZhLm5pby5CeXRlQnVmZmVyIHB1dFNob3J0KAotc2hvcnQpCi0KLXB1YmxpYyBqYXZhLm5pby5CeXRlQnVmZmVyIHNsaWNlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLWZpbmFsIGNsYXNzIGphdmEubmlvLlJlYWRPbmx5RG91YmxlQXJyYXlCdWZmZXIgZXh0ZW5kcyBqYXZhLm5pby5Eb3VibGVBcnJheUJ1ZmZlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWludAotZG91YmxlW10KLWludCkKLQotc3RhdGljIGphdmEubmlvLlJlYWRPbmx5RG91YmxlQXJyYXlCdWZmZXIgY29weSgKLWphdmEubmlvLkRvdWJsZUFycmF5QnVmZmVyCi1pbnQpCi0KLXB1YmxpYyBqYXZhLm5pby5Eb3VibGVCdWZmZXIgYXNSZWFkT25seUJ1ZmZlcigpCi0KLXB1YmxpYyBqYXZhLm5pby5Eb3VibGVCdWZmZXIgY29tcGFjdCgpCi0KLXB1YmxpYyBqYXZhLm5pby5Eb3VibGVCdWZmZXIgZHVwbGljYXRlKCkKLQotcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpCi0KLXByb3RlY3RlZCBkb3VibGVbXSBwcm90ZWN0ZWRBcnJheSgpCi0KLXByb3RlY3RlZCBpbnQgcHJvdGVjdGVkQXJyYXlPZmZzZXQoKQotCi1wcm90ZWN0ZWQgYm9vbGVhbiBwcm90ZWN0ZWRIYXNBcnJheSgpCi0KLXB1YmxpYyBqYXZhLm5pby5Eb3VibGVCdWZmZXIgcHV0KAotZG91YmxlKQotCi1wdWJsaWMgamF2YS5uaW8uRG91YmxlQnVmZmVyIHB1dCgKLWludAotZG91YmxlKQotCi1wdWJsaWMgZmluYWwgamF2YS5uaW8uRG91YmxlQnVmZmVyIHB1dCgKLWphdmEubmlvLkRvdWJsZUJ1ZmZlcikKLQotcHVibGljIGZpbmFsIGphdmEubmlvLkRvdWJsZUJ1ZmZlciBwdXQoCi1kb3VibGVbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyBqYXZhLm5pby5Eb3VibGVCdWZmZXIgc2xpY2UoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotZmluYWwgY2xhc3MgamF2YS5uaW8uUmVhZE9ubHlGbG9hdEFycmF5QnVmZmVyIGV4dGVuZHMgamF2YS5uaW8uRmxvYXRBcnJheUJ1ZmZlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWludAotZmxvYXRbXQotaW50KQotCi1zdGF0aWMgamF2YS5uaW8uUmVhZE9ubHlGbG9hdEFycmF5QnVmZmVyIGNvcHkoCi1qYXZhLm5pby5GbG9hdEFycmF5QnVmZmVyCi1pbnQpCi0KLXB1YmxpYyBqYXZhLm5pby5GbG9hdEJ1ZmZlciBhc1JlYWRPbmx5QnVmZmVyKCkKLQotcHVibGljIGphdmEubmlvLkZsb2F0QnVmZmVyIGNvbXBhY3QoKQotCi1wdWJsaWMgamF2YS5uaW8uRmxvYXRCdWZmZXIgZHVwbGljYXRlKCkKLQotcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpCi0KLXByb3RlY3RlZCBmbG9hdFtdIHByb3RlY3RlZEFycmF5KCkKLQotcHJvdGVjdGVkIGludCBwcm90ZWN0ZWRBcnJheU9mZnNldCgpCi0KLXByb3RlY3RlZCBib29sZWFuIHByb3RlY3RlZEhhc0FycmF5KCkKLQotcHVibGljIGphdmEubmlvLkZsb2F0QnVmZmVyIHB1dCgKLWZsb2F0KQotCi1wdWJsaWMgamF2YS5uaW8uRmxvYXRCdWZmZXIgcHV0KAotaW50Ci1mbG9hdCkKLQotcHVibGljIGphdmEubmlvLkZsb2F0QnVmZmVyIHB1dCgKLWphdmEubmlvLkZsb2F0QnVmZmVyKQotCi1wdWJsaWMgZmluYWwgamF2YS5uaW8uRmxvYXRCdWZmZXIgcHV0KAotZmxvYXRbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyBqYXZhLm5pby5GbG9hdEJ1ZmZlciBzbGljZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1maW5hbCBjbGFzcyBqYXZhLm5pby5SZWFkT25seUhlYXBCeXRlQnVmZmVyIGV4dGVuZHMgamF2YS5uaW8uSGVhcEJ5dGVCdWZmZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1ieXRlW10KLWludAotaW50KQotCi1zdGF0aWMgamF2YS5uaW8uUmVhZE9ubHlIZWFwQnl0ZUJ1ZmZlciBjb3B5KAotamF2YS5uaW8uSGVhcEJ5dGVCdWZmZXIKLWludCkKLQotcHVibGljIGphdmEubmlvLkJ5dGVCdWZmZXIgYXNSZWFkT25seUJ1ZmZlcigpCi0KLXB1YmxpYyBqYXZhLm5pby5CeXRlQnVmZmVyIGNvbXBhY3QoKQotCi1wdWJsaWMgamF2YS5uaW8uQnl0ZUJ1ZmZlciBkdXBsaWNhdGUoKQotCi1wdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkKLQotcHJvdGVjdGVkIGJ5dGVbXSBwcm90ZWN0ZWRBcnJheSgpCi0KLXByb3RlY3RlZCBpbnQgcHJvdGVjdGVkQXJyYXlPZmZzZXQoKQotCi1wcm90ZWN0ZWQgYm9vbGVhbiBwcm90ZWN0ZWRIYXNBcnJheSgpCi0KLXB1YmxpYyBqYXZhLm5pby5CeXRlQnVmZmVyIHB1dCgKLWJ5dGUpCi0KLXB1YmxpYyBqYXZhLm5pby5CeXRlQnVmZmVyIHB1dCgKLWludAotYnl0ZSkKLQotcHVibGljIGphdmEubmlvLkJ5dGVCdWZmZXIgcHV0KAotamF2YS5uaW8uQnl0ZUJ1ZmZlcikKLQotcHVibGljIGphdmEubmlvLkJ5dGVCdWZmZXIgcHV0KAotYnl0ZVtdCi1pbnQKLWludCkKLQotcHVibGljIGphdmEubmlvLkJ5dGVCdWZmZXIgcHV0RG91YmxlKAotZG91YmxlKQotCi1wdWJsaWMgamF2YS5uaW8uQnl0ZUJ1ZmZlciBwdXREb3VibGUoCi1pbnQKLWRvdWJsZSkKLQotcHVibGljIGphdmEubmlvLkJ5dGVCdWZmZXIgcHV0RmxvYXQoCi1mbG9hdCkKLQotcHVibGljIGphdmEubmlvLkJ5dGVCdWZmZXIgcHV0RmxvYXQoCi1pbnQKLWZsb2F0KQotCi1wdWJsaWMgamF2YS5uaW8uQnl0ZUJ1ZmZlciBwdXRJbnQoCi1pbnQpCi0KLXB1YmxpYyBqYXZhLm5pby5CeXRlQnVmZmVyIHB1dEludCgKLWludAotaW50KQotCi1wdWJsaWMgamF2YS5uaW8uQnl0ZUJ1ZmZlciBwdXRMb25nKAotaW50Ci1sb25nKQotCi1wdWJsaWMgamF2YS5uaW8uQnl0ZUJ1ZmZlciBwdXRMb25nKAotbG9uZykKLQotcHVibGljIGphdmEubmlvLkJ5dGVCdWZmZXIgcHV0U2hvcnQoCi1pbnQKLXNob3J0KQotCi1wdWJsaWMgamF2YS5uaW8uQnl0ZUJ1ZmZlciBwdXRTaG9ydCgKLXNob3J0KQotCi1wdWJsaWMgamF2YS5uaW8uQnl0ZUJ1ZmZlciBzbGljZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1maW5hbCBjbGFzcyBqYXZhLm5pby5SZWFkT25seUludEFycmF5QnVmZmVyIGV4dGVuZHMgamF2YS5uaW8uSW50QXJyYXlCdWZmZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1pbnQKLWludFtdCi1pbnQpCi0KLXN0YXRpYyBqYXZhLm5pby5SZWFkT25seUludEFycmF5QnVmZmVyIGNvcHkoCi1qYXZhLm5pby5JbnRBcnJheUJ1ZmZlcgotaW50KQotCi1wdWJsaWMgamF2YS5uaW8uSW50QnVmZmVyIGFzUmVhZE9ubHlCdWZmZXIoKQotCi1wdWJsaWMgamF2YS5uaW8uSW50QnVmZmVyIGNvbXBhY3QoKQotCi1wdWJsaWMgamF2YS5uaW8uSW50QnVmZmVyIGR1cGxpY2F0ZSgpCi0KLXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKQotCi1wcm90ZWN0ZWQgaW50W10gcHJvdGVjdGVkQXJyYXkoKQotCi1wcm90ZWN0ZWQgaW50IHByb3RlY3RlZEFycmF5T2Zmc2V0KCkKLQotcHJvdGVjdGVkIGJvb2xlYW4gcHJvdGVjdGVkSGFzQXJyYXkoKQotCi1wdWJsaWMgamF2YS5uaW8uSW50QnVmZmVyIHB1dCgKLWludCkKLQotcHVibGljIGphdmEubmlvLkludEJ1ZmZlciBwdXQoCi1pbnQKLWludCkKLQotcHVibGljIGphdmEubmlvLkludEJ1ZmZlciBwdXQoCi1qYXZhLm5pby5JbnRCdWZmZXIpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLm5pby5JbnRCdWZmZXIgcHV0KAotaW50W10KLWludAotaW50KQotCi1wdWJsaWMgamF2YS5uaW8uSW50QnVmZmVyIHNsaWNlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLWZpbmFsIGNsYXNzIGphdmEubmlvLlJlYWRPbmx5TG9uZ0FycmF5QnVmZmVyIGV4dGVuZHMgamF2YS5uaW8uTG9uZ0FycmF5QnVmZmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotaW50Ci1sb25nW10KLWludCkKLQotc3RhdGljIGphdmEubmlvLlJlYWRPbmx5TG9uZ0FycmF5QnVmZmVyIGNvcHkoCi1qYXZhLm5pby5Mb25nQXJyYXlCdWZmZXIKLWludCkKLQotcHVibGljIGphdmEubmlvLkxvbmdCdWZmZXIgYXNSZWFkT25seUJ1ZmZlcigpCi0KLXB1YmxpYyBqYXZhLm5pby5Mb25nQnVmZmVyIGNvbXBhY3QoKQotCi1wdWJsaWMgamF2YS5uaW8uTG9uZ0J1ZmZlciBkdXBsaWNhdGUoKQotCi1wdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkKLQotcHJvdGVjdGVkIGxvbmdbXSBwcm90ZWN0ZWRBcnJheSgpCi0KLXByb3RlY3RlZCBpbnQgcHJvdGVjdGVkQXJyYXlPZmZzZXQoKQotCi1wcm90ZWN0ZWQgYm9vbGVhbiBwcm90ZWN0ZWRIYXNBcnJheSgpCi0KLXB1YmxpYyBqYXZhLm5pby5Mb25nQnVmZmVyIHB1dCgKLWludAotbG9uZykKLQotcHVibGljIGphdmEubmlvLkxvbmdCdWZmZXIgcHV0KAotbG9uZykKLQotcHVibGljIGphdmEubmlvLkxvbmdCdWZmZXIgcHV0KAotamF2YS5uaW8uTG9uZ0J1ZmZlcikKLQotcHVibGljIGZpbmFsIGphdmEubmlvLkxvbmdCdWZmZXIgcHV0KAotbG9uZ1tdCi1pbnQKLWludCkKLQotcHVibGljIGphdmEubmlvLkxvbmdCdWZmZXIgc2xpY2UoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9uaW8vQnVmZmVyO0xqYXZhL2xhbmcvQ29tcGFyYWJsZTxMamF2YS9uaW8vU2hvcnRCdWZmZXI7PjsgKQotcHVibGljIGFic3RyYWN0IGNsYXNzIGphdmEubmlvLlNob3J0QnVmZmVyIGV4dGVuZHMgamF2YS5uaW8uQnVmZmVyIGltcGxlbWVudHMgamF2YS5sYW5nLkNvbXBhcmFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5uaW8uU2hvcnRCdWZmZXIgYWxsb2NhdGUoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5uaW8uU2hvcnRCdWZmZXIgd3JhcCgKLXNob3J0W10pCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5uaW8uU2hvcnRCdWZmZXIgd3JhcCgKLXNob3J0W10KLWludAotaW50KQotCi0gamF2YS5sYW5nLk9iamVjdCBfYXJyYXkoKQotCi0gaW50IF9hcnJheU9mZnNldCgpCi0KLXB1YmxpYyBmaW5hbCBzaG9ydFtdIGFycmF5KCkKLQotcHVibGljIGZpbmFsIGludCBhcnJheU9mZnNldCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm5pby5TaG9ydEJ1ZmZlciBhc1JlYWRPbmx5QnVmZmVyKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubmlvLlNob3J0QnVmZmVyIGNvbXBhY3QoKQotCi1wdWJsaWMgdm9sYXRpbGUgaW50IGNvbXBhcmVUbygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBpbnQgY29tcGFyZVRvKAotamF2YS5uaW8uU2hvcnRCdWZmZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm5pby5TaG9ydEJ1ZmZlciBkdXBsaWNhdGUoKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgamF2YS5uaW8uU2hvcnRCdWZmZXIgZ2V0KAotc2hvcnRbXSkKLQotcHVibGljIGphdmEubmlvLlNob3J0QnVmZmVyIGdldCgKLXNob3J0W10KLWludAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgc2hvcnQgZ2V0KCkKLQotcHVibGljIGFic3RyYWN0IHNob3J0IGdldCgKLWludCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzQXJyYXkoKQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNEaXJlY3QoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5uaW8uQnl0ZU9yZGVyIG9yZGVyKCkKLQotYWJzdHJhY3Qgc2hvcnRbXSBwcm90ZWN0ZWRBcnJheSgpCi0KLWFic3RyYWN0IGludCBwcm90ZWN0ZWRBcnJheU9mZnNldCgpCi0KLWFic3RyYWN0IGJvb2xlYW4gcHJvdGVjdGVkSGFzQXJyYXkoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5uaW8uU2hvcnRCdWZmZXIgcHV0KAotaW50Ci1zaG9ydCkKLQotcHVibGljIGphdmEubmlvLlNob3J0QnVmZmVyIHB1dCgKLWphdmEubmlvLlNob3J0QnVmZmVyKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5uaW8uU2hvcnRCdWZmZXIgcHV0KAotc2hvcnQpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLm5pby5TaG9ydEJ1ZmZlciBwdXQoCi1zaG9ydFtdKQotCi1wdWJsaWMgamF2YS5uaW8uU2hvcnRCdWZmZXIgcHV0KAotc2hvcnRbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm5pby5TaG9ydEJ1ZmZlciBzbGljZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLWFic3RyYWN0IGNsYXNzIGphdmEubmlvLlNob3J0QXJyYXlCdWZmZXIgZXh0ZW5kcyBqYXZhLm5pby5TaG9ydEJ1ZmZlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgZmluYWwgc2hvcnRbXSBiYWNraW5nQXJyYXkKLQotcHJvdGVjdGVkIGZpbmFsIGludCBvZmZzZXQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1pbnQpCi0KLSB2b2lkIDxpbml0PigKLWludAotc2hvcnRbXQotaW50KQotCi0gdm9pZCA8aW5pdD4oCi1zaG9ydFtdKQotCi1wdWJsaWMgZmluYWwgamF2YS5uaW8uU2hvcnRCdWZmZXIgZ2V0KAotc2hvcnRbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyBmaW5hbCBzaG9ydCBnZXQoKQotCi1wdWJsaWMgZmluYWwgc2hvcnQgZ2V0KAotaW50KQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBpc0RpcmVjdCgpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLm5pby5CeXRlT3JkZXIgb3JkZXIoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotZmluYWwgY2xhc3MgamF2YS5uaW8uUmVhZE9ubHlTaG9ydEFycmF5QnVmZmVyIGV4dGVuZHMgamF2YS5uaW8uU2hvcnRBcnJheUJ1ZmZlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWludAotc2hvcnRbXQotaW50KQotCi1zdGF0aWMgamF2YS5uaW8uUmVhZE9ubHlTaG9ydEFycmF5QnVmZmVyIGNvcHkoCi1qYXZhLm5pby5TaG9ydEFycmF5QnVmZmVyCi1pbnQpCi0KLXB1YmxpYyBqYXZhLm5pby5TaG9ydEJ1ZmZlciBhc1JlYWRPbmx5QnVmZmVyKCkKLQotcHVibGljIGphdmEubmlvLlNob3J0QnVmZmVyIGNvbXBhY3QoKQotCi1wdWJsaWMgamF2YS5uaW8uU2hvcnRCdWZmZXIgZHVwbGljYXRlKCkKLQotcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpCi0KLXByb3RlY3RlZCBzaG9ydFtdIHByb3RlY3RlZEFycmF5KCkKLQotcHJvdGVjdGVkIGludCBwcm90ZWN0ZWRBcnJheU9mZnNldCgpCi0KLXByb3RlY3RlZCBib29sZWFuIHByb3RlY3RlZEhhc0FycmF5KCkKLQotcHVibGljIGphdmEubmlvLlNob3J0QnVmZmVyIHB1dCgKLWludAotc2hvcnQpCi0KLXB1YmxpYyBqYXZhLm5pby5TaG9ydEJ1ZmZlciBwdXQoCi1qYXZhLm5pby5TaG9ydEJ1ZmZlcikKLQotcHVibGljIGphdmEubmlvLlNob3J0QnVmZmVyIHB1dCgKLXNob3J0KQotCi1wdWJsaWMgZmluYWwgamF2YS5uaW8uU2hvcnRCdWZmZXIgcHV0KAotc2hvcnRbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyBqYXZhLm5pby5TaG9ydEJ1ZmZlciBzbGljZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1maW5hbCBjbGFzcyBqYXZhLm5pby5SZWFkV3JpdGVDaGFyQXJyYXlCdWZmZXIgZXh0ZW5kcyBqYXZhLm5pby5DaGFyQXJyYXlCdWZmZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1pbnQpCi0KLSB2b2lkIDxpbml0PigKLWludAotY2hhcltdCi1pbnQpCi0KLSB2b2lkIDxpbml0PigKLWNoYXJbXSkKLQotc3RhdGljIGphdmEubmlvLlJlYWRXcml0ZUNoYXJBcnJheUJ1ZmZlciBjb3B5KAotamF2YS5uaW8uQ2hhckFycmF5QnVmZmVyCi1pbnQpCi0KLXB1YmxpYyBqYXZhLm5pby5DaGFyQnVmZmVyIGFzUmVhZE9ubHlCdWZmZXIoKQotCi1wdWJsaWMgamF2YS5uaW8uQ2hhckJ1ZmZlciBjb21wYWN0KCkKLQotcHVibGljIGphdmEubmlvLkNoYXJCdWZmZXIgZHVwbGljYXRlKCkKLQotcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpCi0KLXByb3RlY3RlZCBjaGFyW10gcHJvdGVjdGVkQXJyYXkoKQotCi1wcm90ZWN0ZWQgaW50IHByb3RlY3RlZEFycmF5T2Zmc2V0KCkKLQotcHJvdGVjdGVkIGJvb2xlYW4gcHJvdGVjdGVkSGFzQXJyYXkoKQotCi1wdWJsaWMgamF2YS5uaW8uQ2hhckJ1ZmZlciBwdXQoCi1jaGFyKQotCi1wdWJsaWMgamF2YS5uaW8uQ2hhckJ1ZmZlciBwdXQoCi1pbnQKLWNoYXIpCi0KLXB1YmxpYyBqYXZhLm5pby5DaGFyQnVmZmVyIHB1dCgKLWNoYXJbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyBqYXZhLm5pby5DaGFyQnVmZmVyIHNsaWNlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLWZpbmFsIGNsYXNzIGphdmEubmlvLlJlYWRXcml0ZURpcmVjdEJ5dGVCdWZmZXIgZXh0ZW5kcyBqYXZhLm5pby5EaXJlY3RCeXRlQnVmZmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotaW50KQotCi0gdm9pZCA8aW5pdD4oCi1pbnQKLWludCkKLQotIHZvaWQgPGluaXQ+KAotamF2YS5uaW8uRGlyZWN0Qnl0ZUJ1ZmZlciRTYWZlQWRkcmVzcwotaW50Ci1pbnQpCi0KLSB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLlBsYXRmb3JtQWRkcmVzcwotaW50Ci1pbnQpCi0KLXN0YXRpYyBqYXZhLm5pby5SZWFkV3JpdGVEaXJlY3RCeXRlQnVmZmVyIGNvcHkoCi1qYXZhLm5pby5EaXJlY3RCeXRlQnVmZmVyCi1pbnQpCi0KLXB1YmxpYyBqYXZhLm5pby5CeXRlQnVmZmVyIGFzUmVhZE9ubHlCdWZmZXIoKQotCi1wdWJsaWMgamF2YS5uaW8uQnl0ZUJ1ZmZlciBjb21wYWN0KCkKLQotcHVibGljIGphdmEubmlvLkJ5dGVCdWZmZXIgZHVwbGljYXRlKCkKLQotIGludCBnZXRBZGRyZXNzKCkKLQotcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpCi0KLXB1YmxpYyBqYXZhLm5pby5CeXRlQnVmZmVyIHB1dCgKLWJ5dGUpCi0KLXB1YmxpYyBqYXZhLm5pby5CeXRlQnVmZmVyIHB1dCgKLWludAotYnl0ZSkKLQotcHVibGljIGphdmEubmlvLkJ5dGVCdWZmZXIgcHV0KAotYnl0ZVtdCi1pbnQKLWludCkKLQotIGphdmEubmlvLkJ5dGVCdWZmZXIgcHV0KAotaW50W10KLWludAotaW50KQotCi0gamF2YS5uaW8uQnl0ZUJ1ZmZlciBwdXQoCi1zaG9ydFtdCi1pbnQKLWludCkKLQotcHVibGljIGphdmEubmlvLkJ5dGVCdWZmZXIgcHV0RG91YmxlKAotZG91YmxlKQotCi1wdWJsaWMgamF2YS5uaW8uQnl0ZUJ1ZmZlciBwdXREb3VibGUoCi1pbnQKLWRvdWJsZSkKLQotcHVibGljIGphdmEubmlvLkJ5dGVCdWZmZXIgcHV0RmxvYXQoCi1mbG9hdCkKLQotcHVibGljIGphdmEubmlvLkJ5dGVCdWZmZXIgcHV0RmxvYXQoCi1pbnQKLWZsb2F0KQotCi1wdWJsaWMgamF2YS5uaW8uQnl0ZUJ1ZmZlciBwdXRJbnQoCi1pbnQpCi0KLXB1YmxpYyBqYXZhLm5pby5CeXRlQnVmZmVyIHB1dEludCgKLWludAotaW50KQotCi1wdWJsaWMgamF2YS5uaW8uQnl0ZUJ1ZmZlciBwdXRMb25nKAotaW50Ci1sb25nKQotCi1wdWJsaWMgamF2YS5uaW8uQnl0ZUJ1ZmZlciBwdXRMb25nKAotbG9uZykKLQotcHVibGljIGphdmEubmlvLkJ5dGVCdWZmZXIgcHV0U2hvcnQoCi1pbnQKLXNob3J0KQotCi1wdWJsaWMgamF2YS5uaW8uQnl0ZUJ1ZmZlciBwdXRTaG9ydCgKLXNob3J0KQotCi1wdWJsaWMgamF2YS5uaW8uQnl0ZUJ1ZmZlciBzbGljZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1maW5hbCBjbGFzcyBqYXZhLm5pby5SZWFkV3JpdGVEb3VibGVBcnJheUJ1ZmZlciBleHRlbmRzIGphdmEubmlvLkRvdWJsZUFycmF5QnVmZmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotaW50KQotCi0gdm9pZCA8aW5pdD4oCi1pbnQKLWRvdWJsZVtdCi1pbnQpCi0KLSB2b2lkIDxpbml0PigKLWRvdWJsZVtdKQotCi1zdGF0aWMgamF2YS5uaW8uUmVhZFdyaXRlRG91YmxlQXJyYXlCdWZmZXIgY29weSgKLWphdmEubmlvLkRvdWJsZUFycmF5QnVmZmVyCi1pbnQpCi0KLXB1YmxpYyBqYXZhLm5pby5Eb3VibGVCdWZmZXIgYXNSZWFkT25seUJ1ZmZlcigpCi0KLXB1YmxpYyBqYXZhLm5pby5Eb3VibGVCdWZmZXIgY29tcGFjdCgpCi0KLXB1YmxpYyBqYXZhLm5pby5Eb3VibGVCdWZmZXIgZHVwbGljYXRlKCkKLQotcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpCi0KLXByb3RlY3RlZCBkb3VibGVbXSBwcm90ZWN0ZWRBcnJheSgpCi0KLXByb3RlY3RlZCBpbnQgcHJvdGVjdGVkQXJyYXlPZmZzZXQoKQotCi1wcm90ZWN0ZWQgYm9vbGVhbiBwcm90ZWN0ZWRIYXNBcnJheSgpCi0KLXB1YmxpYyBqYXZhLm5pby5Eb3VibGVCdWZmZXIgcHV0KAotZG91YmxlKQotCi1wdWJsaWMgamF2YS5uaW8uRG91YmxlQnVmZmVyIHB1dCgKLWludAotZG91YmxlKQotCi1wdWJsaWMgamF2YS5uaW8uRG91YmxlQnVmZmVyIHB1dCgKLWRvdWJsZVtdCi1pbnQKLWludCkKLQotcHVibGljIGphdmEubmlvLkRvdWJsZUJ1ZmZlciBzbGljZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1maW5hbCBjbGFzcyBqYXZhLm5pby5SZWFkV3JpdGVGbG9hdEFycmF5QnVmZmVyIGV4dGVuZHMgamF2YS5uaW8uRmxvYXRBcnJheUJ1ZmZlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWludCkKLQotIHZvaWQgPGluaXQ+KAotaW50Ci1mbG9hdFtdCi1pbnQpCi0KLSB2b2lkIDxpbml0PigKLWZsb2F0W10pCi0KLXN0YXRpYyBqYXZhLm5pby5SZWFkV3JpdGVGbG9hdEFycmF5QnVmZmVyIGNvcHkoCi1qYXZhLm5pby5GbG9hdEFycmF5QnVmZmVyCi1pbnQpCi0KLXB1YmxpYyBqYXZhLm5pby5GbG9hdEJ1ZmZlciBhc1JlYWRPbmx5QnVmZmVyKCkKLQotcHVibGljIGphdmEubmlvLkZsb2F0QnVmZmVyIGNvbXBhY3QoKQotCi1wdWJsaWMgamF2YS5uaW8uRmxvYXRCdWZmZXIgZHVwbGljYXRlKCkKLQotcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpCi0KLXByb3RlY3RlZCBmbG9hdFtdIHByb3RlY3RlZEFycmF5KCkKLQotcHJvdGVjdGVkIGludCBwcm90ZWN0ZWRBcnJheU9mZnNldCgpCi0KLXByb3RlY3RlZCBib29sZWFuIHByb3RlY3RlZEhhc0FycmF5KCkKLQotcHVibGljIGphdmEubmlvLkZsb2F0QnVmZmVyIHB1dCgKLWZsb2F0KQotCi1wdWJsaWMgamF2YS5uaW8uRmxvYXRCdWZmZXIgcHV0KAotaW50Ci1mbG9hdCkKLQotcHVibGljIGphdmEubmlvLkZsb2F0QnVmZmVyIHB1dCgKLWZsb2F0W10KLWludAotaW50KQotCi1wdWJsaWMgamF2YS5uaW8uRmxvYXRCdWZmZXIgc2xpY2UoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotZmluYWwgY2xhc3MgamF2YS5uaW8uUmVhZFdyaXRlSGVhcEJ5dGVCdWZmZXIgZXh0ZW5kcyBqYXZhLm5pby5IZWFwQnl0ZUJ1ZmZlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWludCkKLQotIHZvaWQgPGluaXQ+KAotYnl0ZVtdKQotCi0gdm9pZCA8aW5pdD4oCi1ieXRlW10KLWludAotaW50KQotCi1zdGF0aWMgamF2YS5uaW8uUmVhZFdyaXRlSGVhcEJ5dGVCdWZmZXIgY29weSgKLWphdmEubmlvLkhlYXBCeXRlQnVmZmVyCi1pbnQpCi0KLXB1YmxpYyBqYXZhLm5pby5CeXRlQnVmZmVyIGFzUmVhZE9ubHlCdWZmZXIoKQotCi1wdWJsaWMgamF2YS5uaW8uQnl0ZUJ1ZmZlciBjb21wYWN0KCkKLQotcHVibGljIGphdmEubmlvLkJ5dGVCdWZmZXIgZHVwbGljYXRlKCkKLQotcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpCi0KLXByb3RlY3RlZCBieXRlW10gcHJvdGVjdGVkQXJyYXkoKQotCi1wcm90ZWN0ZWQgaW50IHByb3RlY3RlZEFycmF5T2Zmc2V0KCkKLQotcHJvdGVjdGVkIGJvb2xlYW4gcHJvdGVjdGVkSGFzQXJyYXkoKQotCi1wdWJsaWMgamF2YS5uaW8uQnl0ZUJ1ZmZlciBwdXQoCi1ieXRlKQotCi1wdWJsaWMgamF2YS5uaW8uQnl0ZUJ1ZmZlciBwdXQoCi1pbnQKLWJ5dGUpCi0KLXB1YmxpYyBqYXZhLm5pby5CeXRlQnVmZmVyIHB1dCgKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyBqYXZhLm5pby5CeXRlQnVmZmVyIHB1dERvdWJsZSgKLWRvdWJsZSkKLQotcHVibGljIGphdmEubmlvLkJ5dGVCdWZmZXIgcHV0RG91YmxlKAotaW50Ci1kb3VibGUpCi0KLXB1YmxpYyBqYXZhLm5pby5CeXRlQnVmZmVyIHB1dEZsb2F0KAotZmxvYXQpCi0KLXB1YmxpYyBqYXZhLm5pby5CeXRlQnVmZmVyIHB1dEZsb2F0KAotaW50Ci1mbG9hdCkKLQotcHVibGljIGphdmEubmlvLkJ5dGVCdWZmZXIgcHV0SW50KAotaW50KQotCi1wdWJsaWMgamF2YS5uaW8uQnl0ZUJ1ZmZlciBwdXRJbnQoCi1pbnQKLWludCkKLQotcHVibGljIGphdmEubmlvLkJ5dGVCdWZmZXIgcHV0TG9uZygKLWludAotbG9uZykKLQotcHVibGljIGphdmEubmlvLkJ5dGVCdWZmZXIgcHV0TG9uZygKLWxvbmcpCi0KLXB1YmxpYyBqYXZhLm5pby5CeXRlQnVmZmVyIHB1dFNob3J0KAotaW50Ci1zaG9ydCkKLQotcHVibGljIGphdmEubmlvLkJ5dGVCdWZmZXIgcHV0U2hvcnQoCi1zaG9ydCkKLQotcHVibGljIGphdmEubmlvLkJ5dGVCdWZmZXIgc2xpY2UoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotZmluYWwgY2xhc3MgamF2YS5uaW8uUmVhZFdyaXRlSW50QXJyYXlCdWZmZXIgZXh0ZW5kcyBqYXZhLm5pby5JbnRBcnJheUJ1ZmZlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWludCkKLQotIHZvaWQgPGluaXQ+KAotaW50Ci1pbnRbXQotaW50KQotCi0gdm9pZCA8aW5pdD4oCi1pbnRbXSkKLQotc3RhdGljIGphdmEubmlvLlJlYWRXcml0ZUludEFycmF5QnVmZmVyIGNvcHkoCi1qYXZhLm5pby5JbnRBcnJheUJ1ZmZlcgotaW50KQotCi1wdWJsaWMgamF2YS5uaW8uSW50QnVmZmVyIGFzUmVhZE9ubHlCdWZmZXIoKQotCi1wdWJsaWMgamF2YS5uaW8uSW50QnVmZmVyIGNvbXBhY3QoKQotCi1wdWJsaWMgamF2YS5uaW8uSW50QnVmZmVyIGR1cGxpY2F0ZSgpCi0KLXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKQotCi1wcm90ZWN0ZWQgaW50W10gcHJvdGVjdGVkQXJyYXkoKQotCi1wcm90ZWN0ZWQgaW50IHByb3RlY3RlZEFycmF5T2Zmc2V0KCkKLQotcHJvdGVjdGVkIGJvb2xlYW4gcHJvdGVjdGVkSGFzQXJyYXkoKQotCi1wdWJsaWMgamF2YS5uaW8uSW50QnVmZmVyIHB1dCgKLWludCkKLQotcHVibGljIGphdmEubmlvLkludEJ1ZmZlciBwdXQoCi1pbnQKLWludCkKLQotcHVibGljIGphdmEubmlvLkludEJ1ZmZlciBwdXQoCi1pbnRbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyBqYXZhLm5pby5JbnRCdWZmZXIgc2xpY2UoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotZmluYWwgY2xhc3MgamF2YS5uaW8uUmVhZFdyaXRlTG9uZ0FycmF5QnVmZmVyIGV4dGVuZHMgamF2YS5uaW8uTG9uZ0FycmF5QnVmZmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotaW50KQotCi0gdm9pZCA8aW5pdD4oCi1pbnQKLWxvbmdbXQotaW50KQotCi0gdm9pZCA8aW5pdD4oCi1sb25nW10pCi0KLXN0YXRpYyBqYXZhLm5pby5SZWFkV3JpdGVMb25nQXJyYXlCdWZmZXIgY29weSgKLWphdmEubmlvLkxvbmdBcnJheUJ1ZmZlcgotaW50KQotCi1wdWJsaWMgamF2YS5uaW8uTG9uZ0J1ZmZlciBhc1JlYWRPbmx5QnVmZmVyKCkKLQotcHVibGljIGphdmEubmlvLkxvbmdCdWZmZXIgY29tcGFjdCgpCi0KLXB1YmxpYyBqYXZhLm5pby5Mb25nQnVmZmVyIGR1cGxpY2F0ZSgpCi0KLXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKQotCi1wcm90ZWN0ZWQgbG9uZ1tdIHByb3RlY3RlZEFycmF5KCkKLQotcHJvdGVjdGVkIGludCBwcm90ZWN0ZWRBcnJheU9mZnNldCgpCi0KLXByb3RlY3RlZCBib29sZWFuIHByb3RlY3RlZEhhc0FycmF5KCkKLQotcHVibGljIGphdmEubmlvLkxvbmdCdWZmZXIgcHV0KAotaW50Ci1sb25nKQotCi1wdWJsaWMgamF2YS5uaW8uTG9uZ0J1ZmZlciBwdXQoCi1sb25nKQotCi1wdWJsaWMgamF2YS5uaW8uTG9uZ0J1ZmZlciBwdXQoCi1sb25nW10KLWludAotaW50KQotCi1wdWJsaWMgamF2YS5uaW8uTG9uZ0J1ZmZlciBzbGljZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1maW5hbCBjbGFzcyBqYXZhLm5pby5SZWFkV3JpdGVTaG9ydEFycmF5QnVmZmVyIGV4dGVuZHMgamF2YS5uaW8uU2hvcnRBcnJheUJ1ZmZlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWludCkKLQotIHZvaWQgPGluaXQ+KAotaW50Ci1zaG9ydFtdCi1pbnQpCi0KLSB2b2lkIDxpbml0PigKLXNob3J0W10pCi0KLXN0YXRpYyBqYXZhLm5pby5SZWFkV3JpdGVTaG9ydEFycmF5QnVmZmVyIGNvcHkoCi1qYXZhLm5pby5TaG9ydEFycmF5QnVmZmVyCi1pbnQpCi0KLXB1YmxpYyBqYXZhLm5pby5TaG9ydEJ1ZmZlciBhc1JlYWRPbmx5QnVmZmVyKCkKLQotcHVibGljIGphdmEubmlvLlNob3J0QnVmZmVyIGNvbXBhY3QoKQotCi1wdWJsaWMgamF2YS5uaW8uU2hvcnRCdWZmZXIgZHVwbGljYXRlKCkKLQotcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpCi0KLXByb3RlY3RlZCBzaG9ydFtdIHByb3RlY3RlZEFycmF5KCkKLQotcHJvdGVjdGVkIGludCBwcm90ZWN0ZWRBcnJheU9mZnNldCgpCi0KLXByb3RlY3RlZCBib29sZWFuIHByb3RlY3RlZEhhc0FycmF5KCkKLQotcHVibGljIGphdmEubmlvLlNob3J0QnVmZmVyIHB1dCgKLWludAotc2hvcnQpCi0KLXB1YmxpYyBqYXZhLm5pby5TaG9ydEJ1ZmZlciBwdXQoCi1zaG9ydCkKLQotcHVibGljIGphdmEubmlvLlNob3J0QnVmZmVyIHB1dCgKLXNob3J0W10KLWludAotaW50KQotCi1wdWJsaWMgamF2YS5uaW8uU2hvcnRCdWZmZXIgc2xpY2UoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotZmluYWwgY2xhc3MgamF2YS5uaW8uU2hvcnRUb0J5dGVCdWZmZXJBZGFwdGVyIGV4dGVuZHMgamF2YS5uaW8uU2hvcnRCdWZmZXIgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLmludGVybmFsLkRpcmVjdEJ1ZmZlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgYm9vbGVhbiAkYXNzZXJ0aW9uc0Rpc2FibGVkCi0KLXByaXZhdGUgZmluYWwgamF2YS5uaW8uQnl0ZUJ1ZmZlciBieXRlQnVmZmVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLm5pby5CeXRlQnVmZmVyKQotCi1zdGF0aWMgamF2YS5uaW8uU2hvcnRCdWZmZXIgd3JhcCgKLWphdmEubmlvLkJ5dGVCdWZmZXIpCi0KLXB1YmxpYyB2b2lkIGFkZHJlc3NWYWxpZGl0eUNoZWNrKCkKLQotcHVibGljIGphdmEubmlvLlNob3J0QnVmZmVyIGFzUmVhZE9ubHlCdWZmZXIoKQotCi1wdWJsaWMgamF2YS5uaW8uU2hvcnRCdWZmZXIgY29tcGFjdCgpCi0KLXB1YmxpYyBqYXZhLm5pby5TaG9ydEJ1ZmZlciBkdXBsaWNhdGUoKQotCi1wdWJsaWMgdm9pZCBmcmVlKCkKLQotcHVibGljIHNob3J0IGdldCgpCi0KLXB1YmxpYyBzaG9ydCBnZXQoCi1pbnQpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5QbGF0Zm9ybUFkZHJlc3MgZ2V0QmFzZUFkZHJlc3MoKQotCi1wdWJsaWMgaW50IGdldEJ5dGVDYXBhY2l0eSgpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5QbGF0Zm9ybUFkZHJlc3MgZ2V0RWZmZWN0aXZlQWRkcmVzcygpCi0KLXB1YmxpYyBib29sZWFuIGlzQWRkcmVzc1ZhbGlkKCkKLQotcHVibGljIGJvb2xlYW4gaXNEaXJlY3QoKQotCi1wdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkKLQotcHVibGljIGphdmEubmlvLkJ5dGVPcmRlciBvcmRlcigpCi0KLXByb3RlY3RlZCBzaG9ydFtdIHByb3RlY3RlZEFycmF5KCkKLQotcHJvdGVjdGVkIGludCBwcm90ZWN0ZWRBcnJheU9mZnNldCgpCi0KLXByb3RlY3RlZCBib29sZWFuIHByb3RlY3RlZEhhc0FycmF5KCkKLQotcHVibGljIGphdmEubmlvLlNob3J0QnVmZmVyIHB1dCgKLWludAotc2hvcnQpCi0KLXB1YmxpYyBqYXZhLm5pby5TaG9ydEJ1ZmZlciBwdXQoCi1zaG9ydCkKLQotcHVibGljIGphdmEubmlvLlNob3J0QnVmZmVyIHB1dCgKLXNob3J0W10KLWludAotaW50KQotCi1wdWJsaWMgamF2YS5uaW8uU2hvcnRCdWZmZXIgc2xpY2UoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEubmlvLmNoYW5uZWxzLkFscmVhZHlDb25uZWN0ZWRFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5uaW8uY2hhbm5lbHMuQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbiBleHRlbmRzIGphdmEuaW8uSU9FeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLm5pby5jaGFubmVscy5Bc3luY2hyb25vdXNDbG9zZUV4Y2VwdGlvbiBleHRlbmRzIGphdmEubmlvLmNoYW5uZWxzLkNsb3NlZENoYW5uZWxFeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgamF2YS5uaW8uY2hhbm5lbHMuQ2hhbm5lbCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmlvLkNsb3NlYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGNsb3NlKCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNPcGVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgamF2YS5uaW8uY2hhbm5lbHMuUmVhZGFibGVCeXRlQ2hhbm5lbCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLm5pby5jaGFubmVscy5DaGFubmVsCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCByZWFkKAotamF2YS5uaW8uQnl0ZUJ1ZmZlcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgamF2YS5uaW8uY2hhbm5lbHMuV3JpdGFibGVCeXRlQ2hhbm5lbCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLm5pby5jaGFubmVscy5DaGFubmVsCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCB3cml0ZSgKLWphdmEubmlvLkJ5dGVCdWZmZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEubmlvLmNoYW5uZWxzLkJ5dGVDaGFubmVsIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubmlvLmNoYW5uZWxzLlJlYWRhYmxlQnl0ZUNoYW5uZWwsIGphdmEubmlvLmNoYW5uZWxzLldyaXRhYmxlQnl0ZUNoYW5uZWwKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEubmlvLmNoYW5uZWxzLkNhbmNlbGxlZEtleUV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5JbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPUJ5dGVDaGFubmVsUmVhZGVyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL25pby9jaGFubmVscy9DaGFubmVsczsgKQotIGNsYXNzIGphdmEubmlvLmNoYW5uZWxzLkNoYW5uZWxzJEJ5dGVDaGFubmVsUmVhZGVyIGV4dGVuZHMgamF2YS5pby5SZWFkZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9TSVpFCi0KLSBqYXZhLm5pby5CeXRlQnVmZmVyIGJ5dGVzCi0KLSBqYXZhLm5pby5DaGFyQnVmZmVyIGNoYXJzCi0KLSBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXREZWNvZGVyIGRlY29kZXIKLQotcHJpdmF0ZSBqYXZhLmlvLklucHV0U3RyZWFtIGlucHV0U3RyZWFtCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5JbnB1dFN0cmVhbQotamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0RGVjb2RlcgotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjbG9zZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcmVhZCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcmVhZCgKLWNoYXJbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyBib29sZWFuIHJlYWR5KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPUJ5dGVDaGFubmVsV3JpdGVyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL25pby9jaGFubmVscy9DaGFubmVsczsgKQotIGNsYXNzIGphdmEubmlvLmNoYW5uZWxzLkNoYW5uZWxzJEJ5dGVDaGFubmVsV3JpdGVyIGV4dGVuZHMgamF2YS5pby5Xcml0ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9TSVpFCi0KLXByaXZhdGUgamF2YS5uaW8uQnl0ZUJ1ZmZlciBieXRlQnVmCi0KLXByaXZhdGUgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0RW5jb2RlciBlbmNvZGVyCi0KLXByaXZhdGUgamF2YS5pby5PdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5PdXRwdXRTdHJlYW0KLWphdmEubmlvLmNoYXJzZXQuQ2hhcnNldEVuY29kZXIKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY2xvc2UoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBmbHVzaCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHdyaXRlKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB3cml0ZSgKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB3cml0ZSgKLWNoYXJbXQotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1DaGFubmVsSW5wdXRTdHJlYW0gKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvbmlvL2NoYW5uZWxzL0NoYW5uZWxzOyApCi0gY2xhc3MgamF2YS5uaW8uY2hhbm5lbHMuQ2hhbm5lbHMkQ2hhbm5lbElucHV0U3RyZWFtIGV4dGVuZHMgamF2YS5pby5JbnB1dFN0cmVhbQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgamF2YS5uaW8uY2hhbm5lbHMuUmVhZGFibGVCeXRlQ2hhbm5lbCBjaGFubmVsCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5uaW8uY2hhbm5lbHMuUmVhZGFibGVCeXRlQ2hhbm5lbCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY2xvc2UoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZhLm5pby5jaGFubmVscy5JbnRlcnJ1cHRpYmxlQ2hhbm5lbCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLm5pby5jaGFubmVscy5DaGFubmVsCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgY2xvc2UoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGphdmEubmlvLmNoYW5uZWxzLnNwaS5BYnN0cmFjdEludGVycnVwdGlibGVDaGFubmVsIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubmlvLmNoYW5uZWxzLkNoYW5uZWwsIGphdmEubmlvLmNoYW5uZWxzLkludGVycnVwdGlibGVDaGFubmVsCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Qgc2V0SW50ZXJydXB0QWN0aW9uCi0KLXByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBjbG9zZWQKLQotdm9sYXRpbGUgYm9vbGVhbiBpbnRlcnJ1cHRlZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KCkKLQotcHJvdGVjdGVkIGZpbmFsIHZvaWQgYmVnaW4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgdm9pZCBjbG9zZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmlvL2NoYW5uZWxzL0FzeW5jaHJvbm91c0Nsb3NlRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgZmluYWwgdm9pZCBlbmQoCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbXBsQ2xvc2VDaGFubmVsKCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gaXNPcGVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPVJlYWRhYmxlQnl0ZUNoYW5uZWxJbXBsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL25pby9jaGFubmVscy9DaGFubmVsczsgKQotIGNsYXNzIGphdmEubmlvLmNoYW5uZWxzLkNoYW5uZWxzJFJlYWRhYmxlQnl0ZUNoYW5uZWxJbXBsIGV4dGVuZHMgamF2YS5uaW8uY2hhbm5lbHMuc3BpLkFic3RyYWN0SW50ZXJydXB0aWJsZUNoYW5uZWwgaW1wbGVtZW50cyBqYXZhLm5pby5jaGFubmVscy5SZWFkYWJsZUJ5dGVDaGFubmVsCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS5pby5JbnB1dFN0cmVhbSBpbnB1dFN0cmVhbQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEuaW8uSW5wdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIGltcGxDbG9zZUNoYW5uZWwoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoCi1qYXZhLm5pby5CeXRlQnVmZmVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9UmVhZGFibGVCeXRlQ2hhbm5lbElucHV0U3RyZWFtICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL25pby9jaGFubmVscy9DaGFubmVsczsgKQotIGNsYXNzIGphdmEubmlvLmNoYW5uZWxzLkNoYW5uZWxzJFJlYWRhYmxlQnl0ZUNoYW5uZWxJbnB1dFN0cmVhbSBleHRlbmRzIGphdmEubmlvLmNoYW5uZWxzLkNoYW5uZWxzJENoYW5uZWxJbnB1dFN0cmVhbQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubmlvLmNoYW5uZWxzLlJlYWRhYmxlQnl0ZUNoYW5uZWwpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcmVhZCgKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvbmlvL2NoYW5uZWxzL0NoYW5uZWxzOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPVJlYWRlcklucHV0U3RyZWFtICkKLSBjbGFzcyBqYXZhLm5pby5jaGFubmVscy5DaGFubmVscyRSZWFkZXJJbnB1dFN0cmVhbSBleHRlbmRzIGphdmEubmlvLmNoYW5uZWxzLkNoYW5uZWxzJENoYW5uZWxJbnB1dFN0cmVhbQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubmlvLmNoYW5uZWxzLlJlYWRhYmxlQnl0ZUNoYW5uZWwpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcmVhZCgKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1Xcml0YWJsZUJ5dGVDaGFubmVsSW1wbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS9uaW8vY2hhbm5lbHMvQ2hhbm5lbHM7ICkKLSBjbGFzcyBqYXZhLm5pby5jaGFubmVscy5DaGFubmVscyRXcml0YWJsZUJ5dGVDaGFubmVsSW1wbCBleHRlbmRzIGphdmEubmlvLmNoYW5uZWxzLnNwaS5BYnN0cmFjdEludGVycnVwdGlibGVDaGFubmVsIGltcGxlbWVudHMgamF2YS5uaW8uY2hhbm5lbHMuV3JpdGFibGVCeXRlQ2hhbm5lbAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEuaW8uT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEuaW8uT3V0cHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBpbXBsQ2xvc2VDaGFubmVsKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCB3cml0ZSgKLWphdmEubmlvLkJ5dGVCdWZmZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1Xcml0YWJsZUJ5dGVDaGFubmVsT3V0cHV0U3RyZWFtICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL25pby9jaGFubmVscy9DaGFubmVsczsgKQotIGNsYXNzIGphdmEubmlvLmNoYW5uZWxzLkNoYW5uZWxzJFdyaXRhYmxlQnl0ZUNoYW5uZWxPdXRwdXRTdHJlYW0gZXh0ZW5kcyBqYXZhLmlvLk91dHB1dFN0cmVhbQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEubmlvLmNoYW5uZWxzLldyaXRhYmxlQnl0ZUNoYW5uZWwgY2hhbm5lbAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubmlvLmNoYW5uZWxzLldyaXRhYmxlQnl0ZUNoYW5uZWwpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNsb3NlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgd3JpdGUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHdyaXRlKAotYnl0ZVtdCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxqYXZhL25pby9jaGFubmVscy9DaGFubmVscyRCeXRlQ2hhbm5lbFdyaXRlcjtMamF2YS9uaW8vY2hhbm5lbHMvQ2hhbm5lbHMkQnl0ZUNoYW5uZWxSZWFkZXI7TGphdmEvbmlvL2NoYW5uZWxzL0NoYW5uZWxzJFdyaXRhYmxlQnl0ZUNoYW5uZWxJbXBsO0xqYXZhL25pby9jaGFubmVscy9DaGFubmVscyRSZWFkYWJsZUJ5dGVDaGFubmVsSW1wbDtMamF2YS9uaW8vY2hhbm5lbHMvQ2hhbm5lbHMkV3JpdGFibGVCeXRlQ2hhbm5lbE91dHB1dFN0cmVhbTtMamF2YS9uaW8vY2hhbm5lbHMvQ2hhbm5lbHMkUmVhZGVySW5wdXRTdHJlYW07TGphdmEvbmlvL2NoYW5uZWxzL0NoYW5uZWxzJFJlYWRhYmxlQnl0ZUNoYW5uZWxJbnB1dFN0cmVhbTtMamF2YS9uaW8vY2hhbm5lbHMvQ2hhbm5lbHMkQ2hhbm5lbElucHV0U3RyZWFtOyApCi1wdWJsaWMgZmluYWwgY2xhc3MgamF2YS5uaW8uY2hhbm5lbHMuQ2hhbm5lbHMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5uaW8uY2hhbm5lbHMuUmVhZGFibGVCeXRlQ2hhbm5lbCBuZXdDaGFubmVsKAotamF2YS5pby5JbnB1dFN0cmVhbSkKLQotcHVibGljIHN0YXRpYyBqYXZhLm5pby5jaGFubmVscy5Xcml0YWJsZUJ5dGVDaGFubmVsIG5ld0NoYW5uZWwoCi1qYXZhLmlvLk91dHB1dFN0cmVhbSkKLQotcHVibGljIHN0YXRpYyBqYXZhLmlvLklucHV0U3RyZWFtIG5ld0lucHV0U3RyZWFtKAotamF2YS5uaW8uY2hhbm5lbHMuUmVhZGFibGVCeXRlQ2hhbm5lbCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmlvLk91dHB1dFN0cmVhbSBuZXdPdXRwdXRTdHJlYW0oCi1qYXZhLm5pby5jaGFubmVscy5Xcml0YWJsZUJ5dGVDaGFubmVsKQotCi1wdWJsaWMgc3RhdGljIGphdmEuaW8uUmVhZGVyIG5ld1JlYWRlcigKLWphdmEubmlvLmNoYW5uZWxzLlJlYWRhYmxlQnl0ZUNoYW5uZWwKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5pby5SZWFkZXIgbmV3UmVhZGVyKAotamF2YS5uaW8uY2hhbm5lbHMuUmVhZGFibGVCeXRlQ2hhbm5lbAotamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0RGVjb2RlcgotaW50KQotCi1wdWJsaWMgc3RhdGljIGphdmEuaW8uV3JpdGVyIG5ld1dyaXRlcigKLWphdmEubmlvLmNoYW5uZWxzLldyaXRhYmxlQnl0ZUNoYW5uZWwKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5pby5Xcml0ZXIgbmV3V3JpdGVyKAotamF2YS5uaW8uY2hhbm5lbHMuV3JpdGFibGVCeXRlQ2hhbm5lbAotamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0RW5jb2RlcgotaW50KQotCi1zdGF0aWMgamF2YS5uaW8uQnl0ZUJ1ZmZlciB3cmFwQnl0ZUJ1ZmZlcigKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5uaW8uY2hhbm5lbHMuQ2xvc2VkQnlJbnRlcnJ1cHRFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLm5pby5jaGFubmVscy5Bc3luY2hyb25vdXNDbG9zZUV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEubmlvLmNoYW5uZWxzLkNsb3NlZFNlbGVjdG9yRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLklsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEubmlvLmNoYW5uZWxzLkNvbm5lY3Rpb25QZW5kaW5nRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLklsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdGFibGVDaGFubmVsIGV4dGVuZHMgamF2YS5uaW8uY2hhbm5lbHMuc3BpLkFic3RyYWN0SW50ZXJydXB0aWJsZUNoYW5uZWwgaW1wbGVtZW50cyBqYXZhLm5pby5jaGFubmVscy5DaGFubmVsCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5PYmplY3QgYmxvY2tpbmdMb2NrKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdGFibGVDaGFubmVsIGNvbmZpZ3VyZUJsb2NraW5nKAotYm9vbGVhbikKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNCbG9ja2luZygpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzUmVnaXN0ZXJlZCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3Rpb25LZXkga2V5Rm9yKAotamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0b3IpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm5pby5jaGFubmVscy5zcGkuU2VsZWN0b3JQcm92aWRlciBwcm92aWRlcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmlvL2NoYW5uZWxzL0Nsb3NlZENoYW5uZWxFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3Rpb25LZXkgcmVnaXN0ZXIoCi1qYXZhLm5pby5jaGFubmVscy5TZWxlY3RvcgotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25pby9jaGFubmVscy9DbG9zZWRDaGFubmVsRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0aW9uS2V5IHJlZ2lzdGVyKAotamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0b3IKLWludAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGFic3RyYWN0IGludCB2YWxpZE9wcygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MamF2YS9uaW8vY2hhbm5lbHMvc3BpL0Fic3RyYWN0U2VsZWN0YWJsZUNoYW5uZWwkMTtMamF2YS9uaW8vY2hhbm5lbHMvc3BpL0Fic3RyYWN0U2VsZWN0YWJsZUNoYW5uZWwkQmxvY2tpbmdMb2NrOyApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgamF2YS5uaW8uY2hhbm5lbHMuc3BpLkFic3RyYWN0U2VsZWN0YWJsZUNoYW5uZWwgZXh0ZW5kcyBqYXZhLm5pby5jaGFubmVscy5TZWxlY3RhYmxlQ2hhbm5lbAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5PYmplY3QgYmxvY2tpbmdMb2NrCi0KLSBib29sZWFuIGlzQmxvY2tpbmcKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0xpc3Q8TGphdmEvbmlvL2NoYW5uZWxzL1NlbGVjdGlvbktleTs+OyApCi1wcml2YXRlIGphdmEudXRpbC5MaXN0IGtleUxpc3QKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLm5pby5jaGFubmVscy5zcGkuU2VsZWN0b3JQcm92aWRlciBwcm92aWRlcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLWphdmEubmlvLmNoYW5uZWxzLnNwaS5TZWxlY3RvclByb3ZpZGVyKQotCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLk9iamVjdCBibG9ja2luZ0xvY2soKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0YWJsZUNoYW5uZWwgY29uZmlndXJlQmxvY2tpbmcoCi1ib29sZWFuKQotCi0gdm9pZCBkZXJlZ2lzdGVyKAotamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0aW9uS2V5KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgZmluYWwgdm9pZCBpbXBsQ2xvc2VDaGFubmVsKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW1wbENsb3NlU2VsZWN0YWJsZUNoYW5uZWwoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbXBsQ29uZmlndXJlQmxvY2tpbmcoCi1ib29sZWFuKQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBpc0Jsb2NraW5nKCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gaXNSZWdpc3RlcmVkKCkKLQotcHVibGljIGZpbmFsIGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdGlvbktleSBrZXlGb3IoCi1qYXZhLm5pby5jaGFubmVscy5TZWxlY3RvcikKLQotcHVibGljIGZpbmFsIGphdmEubmlvLmNoYW5uZWxzLnNwaS5TZWxlY3RvclByb3ZpZGVyIHByb3ZpZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uaW8vY2hhbm5lbHMvQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdGlvbktleSByZWdpc3RlcigKLWphdmEubmlvLmNoYW5uZWxzLlNlbGVjdG9yCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEubmlvLmNoYW5uZWxzLlNjYXR0ZXJpbmdCeXRlQ2hhbm5lbCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLm5pby5jaGFubmVscy5SZWFkYWJsZUJ5dGVDaGFubmVsCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGxvbmcgcmVhZCgKLWphdmEubmlvLkJ5dGVCdWZmZXJbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGxvbmcgcmVhZCgKLWphdmEubmlvLkJ5dGVCdWZmZXJbXQotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEubmlvLmNoYW5uZWxzLkdhdGhlcmluZ0J5dGVDaGFubmVsIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubmlvLmNoYW5uZWxzLldyaXRhYmxlQnl0ZUNoYW5uZWwKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgbG9uZyB3cml0ZSgKLWphdmEubmlvLkJ5dGVCdWZmZXJbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGxvbmcgd3JpdGUoCi1qYXZhLm5pby5CeXRlQnVmZmVyW10KLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGphdmEubmlvLmNoYW5uZWxzLkRhdGFncmFtQ2hhbm5lbCBleHRlbmRzIGphdmEubmlvLmNoYW5uZWxzLnNwaS5BYnN0cmFjdFNlbGVjdGFibGVDaGFubmVsIGltcGxlbWVudHMgamF2YS5uaW8uY2hhbm5lbHMuQnl0ZUNoYW5uZWwsIGphdmEubmlvLmNoYW5uZWxzLlNjYXR0ZXJpbmdCeXRlQ2hhbm5lbCwgamF2YS5uaW8uY2hhbm5lbHMuR2F0aGVyaW5nQnl0ZUNoYW5uZWwKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLWphdmEubmlvLmNoYW5uZWxzLnNwaS5TZWxlY3RvclByb3ZpZGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGphdmEubmlvLmNoYW5uZWxzLkRhdGFncmFtQ2hhbm5lbCBvcGVuKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubmlvLmNoYW5uZWxzLkRhdGFncmFtQ2hhbm5lbCBjb25uZWN0KAotamF2YS5uZXQuU29ja2V0QWRkcmVzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubmlvLmNoYW5uZWxzLkRhdGFncmFtQ2hhbm5lbCBkaXNjb25uZWN0KCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNDb25uZWN0ZWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IHJlYWQoCi1qYXZhLm5pby5CeXRlQnVmZmVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgbG9uZyByZWFkKAotamF2YS5uaW8uQnl0ZUJ1ZmZlcltdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgbG9uZyByZWFkKAotamF2YS5uaW8uQnl0ZUJ1ZmZlcltdCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubmV0LlNvY2tldEFkZHJlc3MgcmVjZWl2ZSgKLWphdmEubmlvLkJ5dGVCdWZmZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgc2VuZCgKLWphdmEubmlvLkJ5dGVCdWZmZXIKLWphdmEubmV0LlNvY2tldEFkZHJlc3MpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldCBzb2NrZXQoKQotCi1wdWJsaWMgZmluYWwgaW50IHZhbGlkT3BzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCB3cml0ZSgKLWphdmEubmlvLkJ5dGVCdWZmZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBsb25nIHdyaXRlKAotamF2YS5uaW8uQnl0ZUJ1ZmZlcltdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgbG9uZyB3cml0ZSgKLWphdmEubmlvLkJ5dGVCdWZmZXJbXQotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvbmlvL2NoYW5uZWxzL0ZpbGVDaGFubmVsOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9TWFwTW9kZSApCi1wdWJsaWMgY2xhc3MgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwkTWFwTW9kZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbCRNYXBNb2RlIFBSSVZBVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbCRNYXBNb2RlIFJFQURfT05MWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsJE1hcE1vZGUgUkVBRF9XUklURQotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgZGlzcGxheU5hbWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MamF2YS9uaW8vY2hhbm5lbHMvRmlsZUNoYW5uZWwkTWFwTW9kZTsgKQotcHVibGljIGFic3RyYWN0IGNsYXNzIGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsIGV4dGVuZHMgamF2YS5uaW8uY2hhbm5lbHMuc3BpLkFic3RyYWN0SW50ZXJydXB0aWJsZUNoYW5uZWwgaW1wbGVtZW50cyBqYXZhLm5pby5jaGFubmVscy5HYXRoZXJpbmdCeXRlQ2hhbm5lbCwgamF2YS5uaW8uY2hhbm5lbHMuU2NhdHRlcmluZ0J5dGVDaGFubmVsLCBqYXZhLm5pby5jaGFubmVscy5CeXRlQ2hhbm5lbAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGZvcmNlKAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIGphdmEubmlvLmNoYW5uZWxzLkZpbGVMb2NrIGxvY2soKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUxvY2sgbG9jaygKLWxvbmcKLWxvbmcKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm5pby5NYXBwZWRCeXRlQnVmZmVyIG1hcCgKLWphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsJE1hcE1vZGUKLWxvbmcKLWxvbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBsb25nIHBvc2l0aW9uKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsIHBvc2l0aW9uKAotbG9uZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCByZWFkKAotamF2YS5uaW8uQnl0ZUJ1ZmZlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCByZWFkKAotamF2YS5uaW8uQnl0ZUJ1ZmZlcgotbG9uZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIGxvbmcgcmVhZCgKLWphdmEubmlvLkJ5dGVCdWZmZXJbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGxvbmcgcmVhZCgKLWphdmEubmlvLkJ5dGVCdWZmZXJbXQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBsb25nIHNpemUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgbG9uZyB0cmFuc2ZlckZyb20oCi1qYXZhLm5pby5jaGFubmVscy5SZWFkYWJsZUJ5dGVDaGFubmVsCi1sb25nCi1sb25nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgbG9uZyB0cmFuc2ZlclRvKAotbG9uZwotbG9uZwotamF2YS5uaW8uY2hhbm5lbHMuV3JpdGFibGVCeXRlQ2hhbm5lbCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsIHRydW5jYXRlKAotbG9uZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIGphdmEubmlvLmNoYW5uZWxzLkZpbGVMb2NrIHRyeUxvY2soKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUxvY2sgdHJ5TG9jaygKLWxvbmcKLWxvbmcKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgd3JpdGUoCi1qYXZhLm5pby5CeXRlQnVmZmVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IHdyaXRlKAotamF2YS5uaW8uQnl0ZUJ1ZmZlcgotbG9uZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIGxvbmcgd3JpdGUoCi1qYXZhLm5pby5CeXRlQnVmZmVyW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBsb25nIHdyaXRlKAotamF2YS5uaW8uQnl0ZUJ1ZmZlcltdCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZhLm5pby5jaGFubmVscy5GaWxlTG9jayBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbCBjaGFubmVsCi0KLXByaXZhdGUgZmluYWwgbG9uZyBwb3NpdGlvbgotCi1wcml2YXRlIGZpbmFsIGJvb2xlYW4gc2hhcmVkCi0KLXByaXZhdGUgZmluYWwgbG9uZyBzaXplCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwKLWxvbmcKLWxvbmcKLWJvb2xlYW4pCi0KLXB1YmxpYyBmaW5hbCBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbCBjaGFubmVsKCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gaXNTaGFyZWQoKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1ZhbGlkKCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gb3ZlcmxhcHMoCi1sb25nCi1sb25nKQotCi1wdWJsaWMgZmluYWwgbG9uZyBwb3NpdGlvbigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlbGVhc2UoKQotCi1wdWJsaWMgZmluYWwgbG9uZyBzaXplKCkKLQotcHVibGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEubmlvLmNoYW5uZWxzLkZpbGVMb2NrSW50ZXJydXB0aW9uRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5pby5JT0V4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEubmlvLmNoYW5uZWxzLklsbGVnYWxCbG9ja2luZ01vZGVFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5uaW8uY2hhbm5lbHMuSWxsZWdhbFNlbGVjdG9yRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEubmlvLmNoYW5uZWxzLk5vQ29ubmVjdGlvblBlbmRpbmdFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5uaW8uY2hhbm5lbHMuTm9uUmVhZGFibGVDaGFubmVsRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLklsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEubmlvLmNoYW5uZWxzLk5vbldyaXRhYmxlQ2hhbm5lbEV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5JbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLm5pby5jaGFubmVscy5Ob3RZZXRCb3VuZEV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5JbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLm5pby5jaGFubmVscy5Ob3RZZXRDb25uZWN0ZWRFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5uaW8uY2hhbm5lbHMuT3ZlcmxhcHBpbmdGaWxlTG9ja0V4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5JbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS9uaW8vY2hhbm5lbHMvUGlwZTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMDMzIG5hbWUgPVNpbmtDaGFubmVsICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZhLm5pby5jaGFubmVscy5QaXBlJFNpbmtDaGFubmVsIGV4dGVuZHMgamF2YS5uaW8uY2hhbm5lbHMuc3BpLkFic3RyYWN0U2VsZWN0YWJsZUNoYW5uZWwgaW1wbGVtZW50cyBqYXZhLm5pby5jaGFubmVscy5Xcml0YWJsZUJ5dGVDaGFubmVsLCBqYXZhLm5pby5jaGFubmVscy5HYXRoZXJpbmdCeXRlQ2hhbm5lbAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLWphdmEubmlvLmNoYW5uZWxzLnNwaS5TZWxlY3RvclByb3ZpZGVyKQotCi1wdWJsaWMgZmluYWwgaW50IHZhbGlkT3BzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS9uaW8vY2hhbm5lbHMvUGlwZTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMDMzIG5hbWUgPVNvdXJjZUNoYW5uZWwgKQotcHVibGljIGFic3RyYWN0IGNsYXNzIGphdmEubmlvLmNoYW5uZWxzLlBpcGUkU291cmNlQ2hhbm5lbCBleHRlbmRzIGphdmEubmlvLmNoYW5uZWxzLnNwaS5BYnN0cmFjdFNlbGVjdGFibGVDaGFubmVsIGltcGxlbWVudHMgamF2YS5uaW8uY2hhbm5lbHMuUmVhZGFibGVCeXRlQ2hhbm5lbCwgamF2YS5uaW8uY2hhbm5lbHMuU2NhdHRlcmluZ0J5dGVDaGFubmVsCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotamF2YS5uaW8uY2hhbm5lbHMuc3BpLlNlbGVjdG9yUHJvdmlkZXIpCi0KLXB1YmxpYyBmaW5hbCBpbnQgdmFsaWRPcHMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGphdmEvbmlvL2NoYW5uZWxzL1BpcGUkU291cmNlQ2hhbm5lbDtMamF2YS9uaW8vY2hhbm5lbHMvUGlwZSRTaW5rQ2hhbm5lbDsgKQotcHVibGljIGFic3RyYWN0IGNsYXNzIGphdmEubmlvLmNoYW5uZWxzLlBpcGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBqYXZhLm5pby5jaGFubmVscy5QaXBlIG9wZW4oKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5uaW8uY2hhbm5lbHMuUGlwZSRTaW5rQ2hhbm5lbCBzaW5rKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubmlvLmNoYW5uZWxzLlBpcGUkU291cmNlQ2hhbm5lbCBzb3VyY2UoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdGlvbktleSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfQUNDRVBUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QX0NPTk5FQ1QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BfUkVBRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUF9XUklURQotCi1wcml2YXRlIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgYXR0YWNobWVudAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLmxhbmcuT2JqZWN0IGF0dGFjaCgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLmxhbmcuT2JqZWN0IGF0dGFjaG1lbnQoKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBjYW5jZWwoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0YWJsZUNoYW5uZWwgY2hhbm5lbCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgaW50ZXJlc3RPcHMoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0aW9uS2V5IGludGVyZXN0T3BzKAotaW50KQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBpc0FjY2VwdGFibGUoKQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBpc0Nvbm5lY3RhYmxlKCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gaXNSZWFkYWJsZSgpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzVmFsaWQoKQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBpc1dyaXRhYmxlKCkKLQotcHVibGljIGFic3RyYWN0IGludCByZWFkeU9wcygpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3RvciBzZWxlY3RvcigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0b3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBqYXZhLm5pby5jaGFubmVscy5TZWxlY3RvciBvcGVuKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgY2xvc2UoKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc09wZW4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9TZXQ8TGphdmEvbmlvL2NoYW5uZWxzL1NlbGVjdGlvbktleTs+OyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLlNldCBrZXlzKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubmlvLmNoYW5uZWxzLnNwaS5TZWxlY3RvclByb3ZpZGVyIHByb3ZpZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCBzZWxlY3QoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IHNlbGVjdCgKLWxvbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgc2VsZWN0Tm93KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvU2V0PExqYXZhL25pby9jaGFubmVscy9TZWxlY3Rpb25LZXk7PjsgKQotcHVibGljIGFic3RyYWN0IGphdmEudXRpbC5TZXQgc2VsZWN0ZWRLZXlzKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdG9yIHdha2V1cCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgamF2YS5uaW8uY2hhbm5lbHMuU2VydmVyU29ja2V0Q2hhbm5lbCBleHRlbmRzIGphdmEubmlvLmNoYW5uZWxzLnNwaS5BYnN0cmFjdFNlbGVjdGFibGVDaGFubmVsCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotamF2YS5uaW8uY2hhbm5lbHMuc3BpLlNlbGVjdG9yUHJvdmlkZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgamF2YS5uaW8uY2hhbm5lbHMuU2VydmVyU29ja2V0Q2hhbm5lbCBvcGVuKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubmlvLmNoYW5uZWxzLlNvY2tldENoYW5uZWwgYWNjZXB0KCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubmV0LlNlcnZlclNvY2tldCBzb2NrZXQoKQotCi1wdWJsaWMgZmluYWwgaW50IHZhbGlkT3BzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZhLm5pby5jaGFubmVscy5Tb2NrZXRDaGFubmVsIGV4dGVuZHMgamF2YS5uaW8uY2hhbm5lbHMuc3BpLkFic3RyYWN0U2VsZWN0YWJsZUNoYW5uZWwgaW1wbGVtZW50cyBqYXZhLm5pby5jaGFubmVscy5CeXRlQ2hhbm5lbCwgamF2YS5uaW8uY2hhbm5lbHMuU2NhdHRlcmluZ0J5dGVDaGFubmVsLCBqYXZhLm5pby5jaGFubmVscy5HYXRoZXJpbmdCeXRlQ2hhbm5lbAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotamF2YS5uaW8uY2hhbm5lbHMuc3BpLlNlbGVjdG9yUHJvdmlkZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgamF2YS5uaW8uY2hhbm5lbHMuU29ja2V0Q2hhbm5lbCBvcGVuKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBqYXZhLm5pby5jaGFubmVscy5Tb2NrZXRDaGFubmVsIG9wZW4oCi1qYXZhLm5ldC5Tb2NrZXRBZGRyZXNzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBjb25uZWN0KAotamF2YS5uZXQuU29ja2V0QWRkcmVzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZmluaXNoQ29ubmVjdCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzQ29ubmVjdGVkKCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNDb25uZWN0aW9uUGVuZGluZygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgcmVhZCgKLWphdmEubmlvLkJ5dGVCdWZmZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBsb25nIHJlYWQoCi1qYXZhLm5pby5CeXRlQnVmZmVyW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBsb25nIHJlYWQoCi1qYXZhLm5pby5CeXRlQnVmZmVyW10KLWludAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5uZXQuU29ja2V0IHNvY2tldCgpCi0KLXB1YmxpYyBmaW5hbCBpbnQgdmFsaWRPcHMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IHdyaXRlKAotamF2YS5uaW8uQnl0ZUJ1ZmZlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIGxvbmcgd3JpdGUoCi1qYXZhLm5pby5CeXRlQnVmZmVyW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBsb25nIHdyaXRlKAotamF2YS5uaW8uQnl0ZUJ1ZmZlcltdCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLm5pby5jaGFubmVscy5VbnJlc29sdmVkQWRkcmVzc0V4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLm5pby5jaGFubmVscy5VbnN1cHBvcnRlZEFkZHJlc3NUeXBlRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS9zZWN1cml0eS9Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uPExqYXZhL2xhbmcvcmVmbGVjdC9NZXRob2Q7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvbmlvL2NoYW5uZWxzL3NwaS9BYnN0cmFjdEludGVycnVwdGlibGVDaGFubmVsOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1maW5hbCBjbGFzcyBqYXZhLm5pby5jaGFubmVscy5zcGkuQWJzdHJhY3RJbnRlcnJ1cHRpYmxlQ2hhbm5lbCQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IHJ1bigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi0gY2xhc3MgamF2YS5uaW8uY2hhbm5lbHMuc3BpLkFic3RyYWN0SW50ZXJydXB0aWJsZUNoYW5uZWwkMiBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmxhbmcuUnVubmFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgamF2YS5uaW8uY2hhbm5lbHMuc3BpLkFic3RyYWN0SW50ZXJydXB0aWJsZUNoYW5uZWwgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS5uaW8uY2hhbm5lbHMuc3BpLkFic3RyYWN0SW50ZXJydXB0aWJsZUNoYW5uZWwpCi0KLXB1YmxpYyB2b2lkIHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvbmlvL2NoYW5uZWxzL3NwaS9BYnN0cmFjdFNlbGVjdGFibGVDaGFubmVsOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTQxMDQgbmFtZSA9bnVsbCApCi0gY2xhc3MgamF2YS5uaW8uY2hhbm5lbHMuc3BpLkFic3RyYWN0U2VsZWN0YWJsZUNoYW5uZWwkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MiBuYW1lID1CbG9ja2luZ0xvY2sgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvbmlvL2NoYW5uZWxzL3NwaS9BYnN0cmFjdFNlbGVjdGFibGVDaGFubmVsOyApCi0gY2xhc3MgamF2YS5uaW8uY2hhbm5lbHMuc3BpLkFic3RyYWN0U2VsZWN0YWJsZUNoYW5uZWwkQmxvY2tpbmdMb2NrIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBqYXZhLm5pby5jaGFubmVscy5zcGkuQWJzdHJhY3RTZWxlY3RhYmxlQ2hhbm5lbCB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5uaW8uY2hhbm5lbHMuc3BpLkFic3RyYWN0U2VsZWN0YWJsZUNoYW5uZWwpCi0KLSB2b2lkIDxpbml0PigKLWphdmEubmlvLmNoYW5uZWxzLnNwaS5BYnN0cmFjdFNlbGVjdGFibGVDaGFubmVsCi1qYXZhLm5pby5jaGFubmVscy5zcGkuQWJzdHJhY3RTZWxlY3RhYmxlQ2hhbm5lbCQxKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGphdmEubmlvLmNoYW5uZWxzLnNwaS5BYnN0cmFjdFNlbGVjdGlvbktleSBleHRlbmRzIGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdGlvbktleQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gYm9vbGVhbiBpc1ZhbGlkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGZpbmFsIHZvaWQgY2FuY2VsKCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gaXNWYWxpZCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotIGNsYXNzIGphdmEubmlvLmNoYW5uZWxzLnNwaS5BYnN0cmFjdFNlbGVjdG9yJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5sYW5nLlJ1bm5hYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGphdmEubmlvLmNoYW5uZWxzLnNwaS5BYnN0cmFjdFNlbGVjdG9yIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEubmlvLmNoYW5uZWxzLnNwaS5BYnN0cmFjdFNlbGVjdG9yKQotCi1wdWJsaWMgdm9pZCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGphdmEubmlvLmNoYW5uZWxzLnNwaS5BYnN0cmFjdFNlbGVjdG9yIGV4dGVuZHMgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL1NldDxMamF2YS9uaW8vY2hhbm5lbHMvU2VsZWN0aW9uS2V5Oz47ICkKLXByaXZhdGUgamF2YS51dGlsLlNldCBjYW5jZWxsZWRLZXlzU2V0Ci0KLXByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBpc09wZW4KLQotcHJpdmF0ZSBqYXZhLm5pby5jaGFubmVscy5zcGkuU2VsZWN0b3JQcm92aWRlciBwcm92aWRlcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLWphdmEubmlvLmNoYW5uZWxzLnNwaS5TZWxlY3RvclByb3ZpZGVyKQotCi1wcm90ZWN0ZWQgZmluYWwgdm9pZCBiZWdpbigpCi0KLSB2b2lkIGNhbmNlbCgKLWphdmEubmlvLmNoYW5uZWxzLlNlbGVjdGlvbktleSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvU2V0PExqYXZhL25pby9jaGFubmVscy9TZWxlY3Rpb25LZXk7PjsgKQotcHJvdGVjdGVkIGZpbmFsIGphdmEudXRpbC5TZXQgY2FuY2VsbGVkS2V5cygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCB2b2lkIGNsb3NlKCkKLQotcHJvdGVjdGVkIGZpbmFsIHZvaWQgZGVyZWdpc3RlcigKLWphdmEubmlvLmNoYW5uZWxzLnNwaS5BYnN0cmFjdFNlbGVjdGlvbktleSkKLQotcHJvdGVjdGVkIGZpbmFsIHZvaWQgZW5kKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW1wbENsb3NlU2VsZWN0b3IoKQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBpc09wZW4oKQotCi1wdWJsaWMgZmluYWwgamF2YS5uaW8uY2hhbm5lbHMuc3BpLlNlbGVjdG9yUHJvdmlkZXIgcHJvdmlkZXIoKQotCi1wcm90ZWN0ZWQgYWJzdHJhY3QgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0aW9uS2V5IHJlZ2lzdGVyKAotamF2YS5uaW8uY2hhbm5lbHMuc3BpLkFic3RyYWN0U2VsZWN0YWJsZUNoYW5uZWwKLWludAotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvc2VjdXJpdHkvUHJpdmlsZWdlZEFjdGlvbjxMamF2YS9uaW8vY2hhbm5lbHMvc3BpL1NlbGVjdG9yUHJvdmlkZXI7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotZmluYWwgY2xhc3MgamF2YS5uaW8uY2hhbm5lbHMuc3BpLlNlbGVjdG9yUHJvdmlkZXIkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBydW4oKQotCi1wdWJsaWMgamF2YS5uaW8uY2hhbm5lbHMuc3BpLlNlbGVjdG9yUHJvdmlkZXIgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvc2VjdXJpdHkvUHJpdmlsZWdlZEFjdGlvbjxMamF2YS9sYW5nL0NsYXNzTG9hZGVyOz47ICkKLWZpbmFsIGNsYXNzIGphdmEubmlvLmNoYW5uZWxzLnNwaS5TZWxlY3RvclByb3ZpZGVyJDIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGphdmEubGFuZy5DbGFzc0xvYWRlciBydW4oKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS9zZWN1cml0eS9Qcml2aWxlZ2VkQWN0aW9uPExqYXZhL25pby9jaGFubmVscy9zcGkvU2VsZWN0b3JQcm92aWRlcjs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1maW5hbCBjbGFzcyBqYXZhLm5pby5jaGFubmVscy5zcGkuU2VsZWN0b3JQcm92aWRlciQzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IHJ1bigpCi0KLXB1YmxpYyBqYXZhLm5pby5jaGFubmVscy5zcGkuU2VsZWN0b3JQcm92aWRlciBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGphdmEubmlvLmNoYW5uZWxzLnNwaS5TZWxlY3RvclByb3ZpZGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBST1ZJREVSX0lOX0pBUl9SRVNPVVJDRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBST1ZJREVSX0lOX1NZU1RFTV9QUk9QRVJUWQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNZTUJPTF9DT01NRU5UCi0KLXByaXZhdGUgc3RhdGljIGphdmEubmlvLmNoYW5uZWxzLkNoYW5uZWwgaW5oZXJpdGVkQ2hhbm5lbAotCi1wcml2YXRlIHN0YXRpYyBqYXZhLm5pby5jaGFubmVscy5zcGkuU2VsZWN0b3JQcm92aWRlciBwcm92aWRlcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KCkKLQotc3RhdGljIGphdmEubmlvLmNoYW5uZWxzLnNwaS5TZWxlY3RvclByb3ZpZGVyIGxvYWRQcm92aWRlckJ5SmFyKCkKLQotc3RhdGljIGphdmEubmlvLmNoYW5uZWxzLnNwaS5TZWxlY3RvclByb3ZpZGVyIGxvYWRQcm92aWRlckJ5UHJvcGVydHkoKQotCi1wdWJsaWMgc3RhdGljIGphdmEubmlvLmNoYW5uZWxzLnNwaS5TZWxlY3RvclByb3ZpZGVyIHByb3ZpZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubmlvLmNoYW5uZWxzLkNoYW5uZWwgaW5oZXJpdGVkQ2hhbm5lbCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm5pby5jaGFubmVscy5EYXRhZ3JhbUNoYW5uZWwgb3BlbkRhdGFncmFtQ2hhbm5lbCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm5pby5jaGFubmVscy5QaXBlIG9wZW5QaXBlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubmlvLmNoYW5uZWxzLnNwaS5BYnN0cmFjdFNlbGVjdG9yIG9wZW5TZWxlY3RvcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm5pby5jaGFubmVscy5TZXJ2ZXJTb2NrZXRDaGFubmVsIG9wZW5TZXJ2ZXJTb2NrZXRDaGFubmVsKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubmlvLmNoYW5uZWxzLlNvY2tldENoYW5uZWwgb3BlblNvY2tldENoYW5uZWwoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEubmlvLmNoYXJzZXQuQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5pby5JT0V4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS9zZWN1cml0eS9Qcml2aWxlZ2VkQWN0aW9uPExjb20vaWJtL2ljdTRqbmkvY2hhcnNldC9DaGFyc2V0UHJvdmlkZXJJQ1U7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvbmlvL2NoYXJzZXQvQ2hhcnNldDsgKQotZmluYWwgY2xhc3MgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0JDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGNvbS5pYm0uaWN1NGpuaS5jaGFyc2V0LkNoYXJzZXRQcm92aWRlcklDVSBydW4oKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS9zZWN1cml0eS9Qcml2aWxlZ2VkQWN0aW9uPExqYXZhL2xhbmcvQ2xhc3NMb2FkZXI7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotZmluYWwgY2xhc3MgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0JDIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGphdmEubGFuZy5UaHJlYWQgdmFsJHQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuVGhyZWFkKQotCi1wdWJsaWMgamF2YS5sYW5nLkNsYXNzTG9hZGVyIHJ1bigpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3NlY3VyaXR5L1ByaXZpbGVnZWRBY3Rpb248TGphdmEvbGFuZy9DbGFzc0xvYWRlcjs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1maW5hbCBjbGFzcyBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQkMyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgamF2YS5sYW5nLkNsYXNzTG9hZGVyIHJ1bigpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3NlY3VyaXR5L1ByaXZpbGVnZWRBY3Rpb248TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotZmluYWwgY2xhc3MgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0JDQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgcnVuKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9SWdub3JlQ2FzZUNvbXBhcmF0b3IgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvbmlvL2NoYXJzZXQvQ2hhcnNldDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3V0aWwvQ29tcGFyYXRvcjxMamF2YS9sYW5nL1N0cmluZzs+OyApCi0gY2xhc3MgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0JElnbm9yZUNhc2VDb21wYXJhdG9yIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudXRpbC5Db21wYXJhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9Db21wYXJhdG9yPExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXByaXZhdGUgc3RhdGljIGphdmEudXRpbC5Db21wYXJhdG9yIGMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9Db21wYXJhdG9yPExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLkNvbXBhcmF0b3IgZ2V0SW5zdGFuY2UoKQotCi1wdWJsaWMgdm9sYXRpbGUgaW50IGNvbXBhcmUoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50IGNvbXBhcmUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEubmlvLmNoYXJzZXQuQ29kZXJNYWxmdW5jdGlvbkVycm9yIGV4dGVuZHMgamF2YS5sYW5nLkVycm9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5FeGNlcHRpb24pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5uaW8uY2hhcnNldC5Db2RlclJlc3VsdCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLm5pby5jaGFyc2V0LkNvZGVyUmVzdWx0IE9WRVJGTE9XCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUWVBFX01BTEZPUk1FRF9JTlBVVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9PVkVSRkxPVwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9VTkRFUkZMT1cKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRZUEVfVU5NQVBQQUJMRV9DSEFSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5uaW8uY2hhcnNldC5Db2RlclJlc3VsdCBVTkRFUkZMT1cKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL1dlYWtIYXNoTWFwPExqYXZhL2xhbmcvSW50ZWdlcjtMamF2YS9uaW8vY2hhcnNldC9Db2RlclJlc3VsdDs+OyApCi1wcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuV2Vha0hhc2hNYXAgX21hbGZvcm1lZEVycm9ycwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvV2Vha0hhc2hNYXA8TGphdmEvbGFuZy9JbnRlZ2VyO0xqYXZhL25pby9jaGFyc2V0L0NvZGVyUmVzdWx0Oz47ICkKLXByaXZhdGUgc3RhdGljIGphdmEudXRpbC5XZWFrSGFzaE1hcCBfdW5tYXBwYWJsZUVycm9ycwotCi1wcml2YXRlIGZpbmFsIGludCBsZW5ndGgKLQotcHJpdmF0ZSBmaW5hbCBpbnQgdHlwZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuQ29kZXJSZXN1bHQgbWFsZm9ybWVkRm9yTGVuZ3RoKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuQ29kZXJSZXN1bHQgdW5tYXBwYWJsZUZvckxlbmd0aCgKLWludCkKLQotcHVibGljIGJvb2xlYW4gaXNFcnJvcigpCi0KLXB1YmxpYyBib29sZWFuIGlzTWFsZm9ybWVkKCkKLQotcHVibGljIGJvb2xlYW4gaXNPdmVyZmxvdygpCi0KLXB1YmxpYyBib29sZWFuIGlzVW5kZXJmbG93KCkKLQotcHVibGljIGJvb2xlYW4gaXNVbm1hcHBhYmxlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL1Vuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGxlbmd0aCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmlvL0J1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbjtMamF2YS9uaW8vQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb247TGphdmEvbmlvL2NoYXJzZXQvVW5tYXBwYWJsZUNoYXJhY3RlckV4Y2VwdGlvbjtMamF2YS9uaW8vY2hhcnNldC9NYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbjtMamF2YS9uaW8vY2hhcnNldC9DaGFyYWN0ZXJDb2RpbmdFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHRocm93RXhjZXB0aW9uKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEubmlvLmNoYXJzZXQuQ29kaW5nRXJyb3JBY3Rpb24gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5uaW8uY2hhcnNldC5Db2RpbmdFcnJvckFjdGlvbiBJR05PUkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLm5pby5jaGFyc2V0LkNvZGluZ0Vycm9yQWN0aW9uIFJFUExBQ0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLm5pby5jaGFyc2V0LkNvZGluZ0Vycm9yQWN0aW9uIFJFUE9SVAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgYWN0aW9uCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEubmlvLmNoYXJzZXQuSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGNoYXJzZXROYW1lCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Q2hhcnNldE5hbWUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEubmlvLmNoYXJzZXQuTWFsZm9ybWVkSW5wdXRFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLm5pby5jaGFyc2V0LkNoYXJhY3RlckNvZGluZ0V4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSBpbnQgaW5wdXRMZW5ndGgKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0SW5wdXRMZW5ndGgoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRNZXNzYWdlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLm5pby5jaGFyc2V0LlVubWFwcGFibGVDaGFyYWN0ZXJFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLm5pby5jaGFyc2V0LkNoYXJhY3RlckNvZGluZ0V4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSBpbnQgaW5wdXRMZW5ndGgKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0SW5wdXRMZW5ndGgoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRNZXNzYWdlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLm5pby5jaGFyc2V0LlVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBjaGFyc2V0TmFtZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldENoYXJzZXROYW1lKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xDb250ZXh0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gamF2YS5zZWN1cml0eS5Eb21haW5Db21iaW5lciBjb21iaW5lcgotCi0gamF2YS5zZWN1cml0eS5Qcm90ZWN0aW9uRG9tYWluW10gY29udGV4dAotCi1wcml2YXRlIGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbENvbnRleHQgaW5oZXJpdGVkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sQ29udGV4dAotamF2YS5zZWN1cml0eS5Eb21haW5Db21iaW5lcikKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5zZWN1cml0eS5Qcm90ZWN0aW9uRG9tYWluW10pCi0KLSB2b2lkIDxpbml0PigKLWphdmEuc2VjdXJpdHkuUHJvdGVjdGlvbkRvbWFpbltdCi1qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xDb250ZXh0KQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnNlY3VyaXR5LlByb3RlY3Rpb25Eb21haW5bXQotamF2YS5zZWN1cml0eS5Eb21haW5Db21iaW5lcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9BY2Nlc3NDb250cm9sRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjaGVja1Blcm1pc3Npb24oCi1qYXZhLnNlY3VyaXR5LlBlcm1pc3Npb24pCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBqYXZhLnNlY3VyaXR5LkRvbWFpbkNvbWJpbmVyIGdldERvbWFpbkNvbWJpbmVyKCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLlNlY3VyaXR5RXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotCi1wcml2YXRlIGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbiBwZXJtCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uKQotCi1wdWJsaWMgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uIGdldFBlcm1pc3Npb24oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL1dlYWtIYXNoTWFwPExqYXZhL2xhbmcvVGhyZWFkO0xqYXZhL3V0aWwvQXJyYXlMaXN0PExqYXZhL3NlY3VyaXR5L0FjY2Vzc0NvbnRyb2xDb250ZXh0Oz47PjsgKQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS51dGlsLldlYWtIYXNoTWFwIGNvbnRleHRzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9BY2Nlc3NDb250cm9sRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tQZXJtaXNzaW9uKAotamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz4oTGphdmEvc2VjdXJpdHkvUHJpdmlsZWdlZEFjdGlvbjxUVDs+OylUVDsgKQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuT2JqZWN0IGRvUHJpdmlsZWdlZCgKLWphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+KExqYXZhL3NlY3VyaXR5L1ByaXZpbGVnZWRBY3Rpb248VFQ7PjtMamF2YS9zZWN1cml0eS9BY2Nlc3NDb250cm9sQ29udGV4dDspVFQ7ICkKLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLk9iamVjdCBkb1ByaXZpbGVnZWQoCi1qYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb24KLWphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbENvbnRleHQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz4oTGphdmEvc2VjdXJpdHkvUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjxUVDs+OylUVDsgKQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuT2JqZWN0IGRvUHJpdmlsZWdlZCgKLWphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFQ6TGphdmEvbGFuZy9PYmplY3Q7PihMamF2YS9zZWN1cml0eS9Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uPFRUOz47TGphdmEvc2VjdXJpdHkvQWNjZXNzQ29udHJvbENvbnRleHQ7KVRUOyApCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5PYmplY3QgZG9Qcml2aWxlZ2VkKAotamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uCi1qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xDb250ZXh0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz4oTGphdmEvc2VjdXJpdHkvUHJpdmlsZWdlZEFjdGlvbjxUVDs+O0xqYXZhL3NlY3VyaXR5L0FjY2Vzc0NvbnRyb2xDb250ZXh0OylUVDsgKQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLk9iamVjdCBkb1ByaXZpbGVnZWRJbXBsKAotamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uCi1qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xDb250ZXh0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz4oTGphdmEvc2VjdXJpdHkvUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjxUVDs+O0xqYXZhL3NlY3VyaXR5L0FjY2Vzc0NvbnRyb2xDb250ZXh0OylUVDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L1ByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb247ICkKLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5PYmplY3QgZG9Qcml2aWxlZ2VkSW1wbCgKLWphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbgotamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sQ29udGV4dCkKLQotcHVibGljIHN0YXRpYyBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xDb250ZXh0IGdldENvbnRleHQoKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgamF2YS5zZWN1cml0eS5Qcm90ZWN0aW9uRG9tYWluW10gZ2V0U3RhY2tEb21haW5zKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLnNlY3VyaXR5LkFsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTRVJWSUNFCi0KLXByaXZhdGUgc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5mb3J0cmVzcy5FbmdpbmUgZW5naW5lCi0KLXByaXZhdGUgc3RhdGljIGphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tIHJhbmRtCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBhbGdvcml0aG0KLQotcHJpdmF0ZSBmaW5hbCBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyIHByb3ZpZGVyCi0KLXByaXZhdGUgZmluYWwgamF2YS5zZWN1cml0eS5BbGdvcml0aG1QYXJhbWV0ZXJHZW5lcmF0b3JTcGkgc3BpSW1wbAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotamF2YS5zZWN1cml0eS5BbGdvcml0aG1QYXJhbWV0ZXJHZW5lcmF0b3JTcGkKLWphdmEuc2VjdXJpdHkuUHJvdmlkZXIKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGphdmEuc2VjdXJpdHkuQWxnb3JpdGhtUGFyYW1ldGVyR2VuZXJhdG9yIGdldEluc3RhbmNlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247TGphdmEvc2VjdXJpdHkvTm9TdWNoUHJvdmlkZXJFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgamF2YS5zZWN1cml0eS5BbGdvcml0aG1QYXJhbWV0ZXJHZW5lcmF0b3IgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBqYXZhLnNlY3VyaXR5LkFsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvciBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEuc2VjdXJpdHkuUHJvdmlkZXIpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLnNlY3VyaXR5LkFsZ29yaXRobVBhcmFtZXRlcnMgZ2VuZXJhdGVQYXJhbWV0ZXJzKCkKLQotcHVibGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgZ2V0QWxnb3JpdGhtKCkKLQotcHVibGljIGZpbmFsIGphdmEuc2VjdXJpdHkuUHJvdmlkZXIgZ2V0UHJvdmlkZXIoKQotCi1wdWJsaWMgZmluYWwgdm9pZCBpbml0KAotaW50KQotCi1wdWJsaWMgZmluYWwgdm9pZCBpbml0KAotaW50Ci1qYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgdm9pZCBpbml0KAotamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIHZvaWQgaW5pdCgKLWphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjCi1qYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZhLnNlY3VyaXR5LkFsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvclNwaSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcm90ZWN0ZWQgYWJzdHJhY3QgamF2YS5zZWN1cml0eS5BbGdvcml0aG1QYXJhbWV0ZXJzIGVuZ2luZUdlbmVyYXRlUGFyYW1ldGVycygpCi0KLXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVuZ2luZUluaXQoCi1pbnQKLWphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb247ICkKLXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVuZ2luZUluaXQoCi1qYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYwotamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5zZWN1cml0eS5BbGdvcml0aG1QYXJhbWV0ZXJzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNFVklDRQotCi1wcml2YXRlIHN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuZm9ydHJlc3MuRW5naW5lIGVuZ2luZQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgYWxnb3JpdGhtCi0KLXByaXZhdGUgYm9vbGVhbiBpbml0aWFsaXplZAotCi1wcml2YXRlIGphdmEuc2VjdXJpdHkuUHJvdmlkZXIgcHJvdmlkZXIKLQotcHJpdmF0ZSBqYXZhLnNlY3VyaXR5LkFsZ29yaXRobVBhcmFtZXRlcnNTcGkgc3BpSW1wbAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotamF2YS5zZWN1cml0eS5BbGdvcml0aG1QYXJhbWV0ZXJzU3BpCi1qYXZhLnNlY3VyaXR5LlByb3ZpZGVyCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBqYXZhLnNlY3VyaXR5LkFsZ29yaXRobVBhcmFtZXRlcnMgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9Ob1N1Y2hQcm92aWRlckV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBqYXZhLnNlY3VyaXR5LkFsZ29yaXRobVBhcmFtZXRlcnMgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBqYXZhLnNlY3VyaXR5LkFsZ29yaXRobVBhcmFtZXRlcnMgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnNlY3VyaXR5LlByb3ZpZGVyKQotCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBnZXRBbGdvcml0aG0oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgYnl0ZVtdIGdldEVuY29kZWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgYnl0ZVtdIGdldEVuY29kZWQoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L3NwZWMvSW52YWxpZFBhcmFtZXRlclNwZWNFeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDo6TGphdmEvc2VjdXJpdHkvc3BlYy9BbGdvcml0aG1QYXJhbWV0ZXJTcGVjOz4oTGphdmEvbGFuZy9DbGFzczxUVDs+OylUVDsgKQotcHVibGljIGZpbmFsIGphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjIGdldFBhcmFtZXRlclNwZWMoCi1qYXZhLmxhbmcuQ2xhc3MpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyIGdldFByb3ZpZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9zcGVjL0ludmFsaWRQYXJhbWV0ZXJTcGVjRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgdm9pZCBpbml0KAotamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCB2b2lkIGluaXQoCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCB2b2lkIGluaXQoCi1ieXRlW10KLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZhLnNlY3VyaXR5LkFsZ29yaXRobVBhcmFtZXRlcnNTcGkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGFic3RyYWN0IGJ5dGVbXSBlbmdpbmVHZXRFbmNvZGVkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGFic3RyYWN0IGJ5dGVbXSBlbmdpbmVHZXRFbmNvZGVkKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDo6TGphdmEvc2VjdXJpdHkvc3BlYy9BbGdvcml0aG1QYXJhbWV0ZXJTcGVjOz4oTGphdmEvbGFuZy9DbGFzczxUVDs+OylUVDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L3NwZWMvSW52YWxpZFBhcmFtZXRlclNwZWNFeGNlcHRpb247ICkKLXByb3RlY3RlZCBhYnN0cmFjdCBqYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYyBlbmdpbmVHZXRQYXJhbWV0ZXJTcGVjKAotamF2YS5sYW5nLkNsYXNzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L3NwZWMvSW52YWxpZFBhcmFtZXRlclNwZWNFeGNlcHRpb247ICkKLXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVuZ2luZUluaXQoCi1qYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW5naW5lSW5pdCgKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW5naW5lSW5pdCgKLWJ5dGVbXQotamF2YS5sYW5nLlN0cmluZykKLQotcHJvdGVjdGVkIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZW5naW5lVG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIGphdmEuc2VjdXJpdHkuQWxsUGVybWlzc2lvbiBleHRlbmRzIGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFMTF9BQ1RJT05TCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUxMX1BFUk1JU1NJT05TCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEFjdGlvbnMoKQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLQotcHVibGljIGJvb2xlYW4gaW1wbGllcygKLWphdmEuc2VjdXJpdHkuUGVybWlzc2lvbikKLQotcHVibGljIGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbkNvbGxlY3Rpb24gbmV3UGVybWlzc2lvbkNvbGxlY3Rpb24oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0FsbFBlcm1pc3Npb25Db2xsZWN0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEU6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3V0aWwvRW51bWVyYXRpb248VEU7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNCBuYW1lID1TaW5nbGV0b25FbnVtZXJhdGlvbiApCi1maW5hbCBjbGFzcyBqYXZhLnNlY3VyaXR5LkFsbFBlcm1pc3Npb25Db2xsZWN0aW9uJFNpbmdsZXRvbkVudW1lcmF0aW9uIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudXRpbC5FbnVtZXJhdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPVRFOyApCi1wcml2YXRlIGphdmEubGFuZy5PYmplY3QgZWxlbWVudAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRFOylWICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClURTsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgbmV4dEVsZW1lbnQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvQWxsUGVybWlzc2lvbkNvbGxlY3Rpb24kU2luZ2xldG9uRW51bWVyYXRpb247ICkKLWZpbmFsIGNsYXNzIGphdmEuc2VjdXJpdHkuQWxsUGVybWlzc2lvbkNvbGxlY3Rpb24gZXh0ZW5kcyBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb25Db2xsZWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEuaW8uT2JqZWN0U3RyZWFtRmllbGRbXSBzZXJpYWxQZXJzaXN0ZW50RmllbGRzCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotCi1wcml2YXRlIHRyYW5zaWVudCBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb24gYWxsCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi0gdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL2xhbmcvQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoCi1qYXZhLmlvLk9iamVjdElucHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoCi1qYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSkKLQotcHVibGljIHZvaWQgYWRkKAotamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9FbnVtZXJhdGlvbjxMamF2YS9zZWN1cml0eS9QZXJtaXNzaW9uOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuRW51bWVyYXRpb24gZWxlbWVudHMoKQotCi1wdWJsaWMgYm9vbGVhbiBpbXBsaWVzKAotamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvUHJvdmlkZXIkU2VydmljZTsgKQotcHVibGljIGFic3RyYWN0IGNsYXNzIGphdmEuc2VjdXJpdHkuUHJvdmlkZXIgZXh0ZW5kcyBqYXZhLnV0aWwuUHJvcGVydGllcwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdXRpbC9Ud29LZXlIYXNoTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL3NlY3VyaXR5L1Byb3ZpZGVyJFNlcnZpY2U7PjsgKQotcHJpdmF0ZSB0cmFuc2llbnQgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5Ud29LZXlIYXNoTWFwIGFsaWFzVGFibGUKLQotcHJpdmF0ZSB0cmFuc2llbnQgamF2YS51dGlsLlByb3BlcnRpZXMgY2hhbmdlZFByb3BlcnRpZXMKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGluZm8KLQotcHJpdmF0ZSB0cmFuc2llbnQgamF2YS5sYW5nLlN0cmluZyBsYXN0QWxnb3JpdGhtCi0KLXByaXZhdGUgdHJhbnNpZW50IGphdmEubGFuZy5TdHJpbmcgbGFzdFNlcnZpY2VOYW1lCi0KLXByaXZhdGUgdHJhbnNpZW50IGphdmEuc2VjdXJpdHkuUHJvdmlkZXIkU2VydmljZSBsYXN0U2VydmljZXNCeVR5cGUKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL1NldDxMamF2YS9zZWN1cml0eS9Qcm92aWRlciRTZXJ2aWNlOz47ICkKLXByaXZhdGUgdHJhbnNpZW50IGphdmEudXRpbC5TZXQgbGFzdFNlcnZpY2VzU2V0Ci0KLXByaXZhdGUgdHJhbnNpZW50IGphdmEubGFuZy5TdHJpbmcgbGFzdFR5cGUKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG5hbWUKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdXRpbC9Ud29LZXlIYXNoTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL3NlY3VyaXR5L1Byb3ZpZGVyJFNlcnZpY2U7PjsgKQotcHJpdmF0ZSB0cmFuc2llbnQgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5Ud29LZXlIYXNoTWFwIHByb3BlcnR5QWxpYXNUYWJsZQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS91dGlsL1R3b0tleUhhc2hNYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvc2VjdXJpdHkvUHJvdmlkZXIkU2VydmljZTs+OyApCi1wcml2YXRlIHRyYW5zaWVudCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLlR3b0tleUhhc2hNYXAgcHJvcGVydHlTZXJ2aWNlVGFibGUKLQotcHJpdmF0ZSB0cmFuc2llbnQgaW50IHByb3ZpZGVyTnVtYmVyCi0KLXByaXZhdGUgdHJhbnNpZW50IGphdmEuc2VjdXJpdHkuUHJvdmlkZXIkU2VydmljZSByZXR1cm5lZFNlcnZpY2UKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdXRpbC9Ud29LZXlIYXNoTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL3NlY3VyaXR5L1Byb3ZpZGVyJFNlcnZpY2U7PjsgKQotcHJpdmF0ZSB0cmFuc2llbnQgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5Ud29LZXlIYXNoTWFwIHNlcnZpY2VUYWJsZQotCi1wcml2YXRlIGRvdWJsZSB2ZXJzaW9uCi0KLXByaXZhdGUgdHJhbnNpZW50IGphdmEubGFuZy5TdHJpbmcgdmVyc2lvblN0cmluZwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWRvdWJsZQotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBib29sZWFuIGNoZWNrQXR0cmlidXRlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGdldFByb3BlcnR5SWdub3JlQ2FzZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTWFwPCoqPjspViApCi1wcml2YXRlIHZvaWQgbXlQdXRBbGwoCi1qYXZhLnV0aWwuTWFwKQotCi1wcml2YXRlIHZvaWQgcHV0UHJvdmlkZXJJbmZvKCkKLQotcHJpdmF0ZSB2b2lkIHJlbW92ZUZyb21Qcm9wZXJ0eVNlcnZpY2VUYWJsZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXByaXZhdGUgdm9pZCBzZXJ2aWNlSW5mb0Zyb21Qcm9wZXJ0aWVzKAotamF2YS5zZWN1cml0eS5Qcm92aWRlciRTZXJ2aWNlKQotCi1wcml2YXRlIHZvaWQgc2VydmljZUluZm9Ub1Byb3BlcnRpZXMoCi1qYXZhLnNlY3VyaXR5LlByb3ZpZGVyJFNlcnZpY2UpCi0KLXByaXZhdGUgdm9pZCBzZXJ2aWNlc0NoYW5nZWQoKQotCi1wcml2YXRlIHZvaWQgdXBkYXRlUHJvcGVydHlTZXJ2aWNlVGFibGUoKQotCi1wdWJsaWMgdm9pZCBjbGVhcigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL1NldDxMamF2YS91dGlsL01hcCRFbnRyeTxMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL09iamVjdDs+Oz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuU2V0IGVudHJ5U2V0KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SW5mbygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE5hbWUoKQotCi0gaW50IGdldFByb3ZpZGVyTnVtYmVyKCkKLQotIGphdmEuc2VjdXJpdHkuUHJvdmlkZXIkU2VydmljZSBnZXRTZXJ2aWNlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEuc2VjdXJpdHkuUHJvdmlkZXIkU2VydmljZSBnZXRTZXJ2aWNlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvU2V0PExqYXZhL3NlY3VyaXR5L1Byb3ZpZGVyJFNlcnZpY2U7PjsgKQotcHVibGljIGphdmEudXRpbC5TZXQgZ2V0U2VydmljZXMoKQotCi1wdWJsaWMgZG91YmxlIGdldFZlcnNpb24oKQotCi0gYm9vbGVhbiBpbXBsZW1lbnRzQWxnKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvU2V0PExqYXZhL2xhbmcvT2JqZWN0Oz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuU2V0IGtleVNldCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGxvYWQoCi1qYXZhLmlvLklucHV0U3RyZWFtKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBwdXQoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL01hcDwqKj47KVYgKQotcHVibGljIHZvaWQgcHV0QWxsKAotamF2YS51dGlsLk1hcCkKLQotcHJvdGVjdGVkIHZvaWQgcHV0U2VydmljZSgKLWphdmEuc2VjdXJpdHkuUHJvdmlkZXIkU2VydmljZSkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgcmVtb3ZlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VydmljZSgKLWphdmEuc2VjdXJpdHkuUHJvdmlkZXIkU2VydmljZSkKLQotIHZvaWQgc2V0UHJvdmlkZXJOdW1iZXIoCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvQ29sbGVjdGlvbjxMamF2YS9sYW5nL09iamVjdDs+OyApCi1wdWJsaWMgamF2YS51dGlsLkNvbGxlY3Rpb24gdmFsdWVzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZhLnNlY3VyaXR5LkF1dGhQcm92aWRlciBleHRlbmRzIGphdmEuc2VjdXJpdHkuUHJvdmlkZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotZG91YmxlCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZheC9zZWN1cml0eS9hdXRoL2xvZ2luL0xvZ2luRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBsb2dpbigKLWphdmF4LnNlY3VyaXR5LmF1dGguU3ViamVjdAotamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjay5DYWxsYmFja0hhbmRsZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmF4L3NlY3VyaXR5L2F1dGgvbG9naW4vTG9naW5FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGxvZ291dCgpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldENhbGxiYWNrSGFuZGxlcigKLWphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2suQ2FsbGJhY2tIYW5kbGVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotZmluYWwgY2xhc3MgamF2YS5zZWN1cml0eS5CYXNpY1Blcm1pc3Npb25Db2xsZWN0aW9uIGV4dGVuZHMgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uQ29sbGVjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmlvLk9iamVjdFN0cmVhbUZpZWxkW10gc2VyaWFsUGVyc2lzdGVudEZpZWxkcwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSB0cmFuc2llbnQgYm9vbGVhbiBhbGxFbmFibGVkCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvc2VjdXJpdHkvUGVybWlzc2lvbjs+OyApCi1wcml2YXRlIHRyYW5zaWVudCBqYXZhLnV0aWwuTWFwIGl0ZW1zCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9DbGFzczwrTGphdmEvc2VjdXJpdHkvUGVybWlzc2lvbjs+OyApCi1wcml2YXRlIGphdmEubGFuZy5DbGFzcyBwZXJtQ2xhc3MKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLSB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgcmVhZE9iamVjdCgKLWphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCB3cml0ZU9iamVjdCgKLWphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtKQotCi1wdWJsaWMgdm9pZCBhZGQoCi1qYXZhLnNlY3VyaXR5LlBlcm1pc3Npb24pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0VudW1lcmF0aW9uPExqYXZhL3NlY3VyaXR5L1Blcm1pc3Npb247PjsgKQotcHVibGljIGphdmEudXRpbC5FbnVtZXJhdGlvbiBlbGVtZW50cygpCi0KLXB1YmxpYyBib29sZWFuIGltcGxpZXMoCi1qYXZhLnNlY3VyaXR5LlBlcm1pc3Npb24pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEuc2VjdXJpdHkuQ2VydGlmaWNhdGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9LZXlFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGRlY29kZSgKLWphdmEuaW8uSW5wdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvS2V5RXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBlbmNvZGUoCi1qYXZhLmlvLk91dHB1dFN0cmVhbSkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0Rm9ybWF0KCkKLQotcHVibGljIGFic3RyYWN0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsIGdldEd1YXJhbnRvcigpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbCBnZXRQcmluY2lwYWwoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zZWN1cml0eS5QdWJsaWNLZXkgZ2V0UHVibGljS2V5KCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoCi1ib29sZWFuKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIGphdmEuc2VjdXJpdHkuQ29kZVNpZ25lciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSB0cmFuc2llbnQgaW50IGhhc2gKLQotcHJpdmF0ZSBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGggc2lnbmVyQ2VydFBhdGgKLQotcHJpdmF0ZSBqYXZhLnNlY3VyaXR5LlRpbWVzdGFtcCB0aW1lc3RhbXAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGgKLWphdmEuc2VjdXJpdHkuVGltZXN0YW1wKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoIGdldFNpZ25lckNlcnRQYXRoKCkKLQotcHVibGljIGphdmEuc2VjdXJpdHkuVGltZXN0YW1wIGdldFRpbWVzdGFtcCgpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5zZWN1cml0eS5Db2RlU291cmNlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotCi1wcml2YXRlIHRyYW5zaWVudCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVbXSBjZXJ0cwotCi1wcml2YXRlIHRyYW5zaWVudCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVGYWN0b3J5IGZhY3RvcnkKLQotcHJpdmF0ZSBqYXZhLm5ldC5VUkwgbG9jYXRpb24KLQotcHJpdmF0ZSB0cmFuc2llbnQgamF2YS5zZWN1cml0eS5Db2RlU2lnbmVyW10gc2lnbmVycwotCi1wcml2YXRlIHRyYW5zaWVudCBqYXZhLm5ldC5Tb2NrZXRQZXJtaXNzaW9uIHNwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5uZXQuVVJMCi1qYXZhLnNlY3VyaXR5LkNvZGVTaWduZXJbXSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5uZXQuVVJMCi1qYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVbXSkKLQotcHJpdmF0ZSBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVbXSBnZXRDZXJ0aWZpY2F0ZXNOb0Nsb25lKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9MaXN0PCtMamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlOz47KUxqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydFBhdGg7ICkKLXByaXZhdGUgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoIG1ha2VDZXJ0UGF0aCgKLWphdmEudXRpbC5MaXN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL2xhbmcvQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoCi1qYXZhLmlvLk9iamVjdElucHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoCi1qYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGZpbmFsIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZVtdIGdldENlcnRpZmljYXRlcygpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLnNlY3VyaXR5LkNvZGVTaWduZXJbXSBnZXRDb2RlU2lnbmVycygpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLm5ldC5VUkwgZ2V0TG9jYXRpb24oKQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLQotcHVibGljIGJvb2xlYW4gaW1wbGllcygKLWphdmEuc2VjdXJpdHkuQ29kZVNvdXJjZSkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEuc2VjdXJpdHkuR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLkV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEuc2VjdXJpdHkuRGlnZXN0RXhjZXB0aW9uIGV4dGVuZHMgamF2YS5zZWN1cml0eS5HZW5lcmFsU2VjdXJpdHlFeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlRocm93YWJsZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlRocm93YWJsZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLnNlY3VyaXR5LkRpZ2VzdElucHV0U3RyZWFtIGV4dGVuZHMgamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0IGRpZ2VzdAotCi1wcml2YXRlIGJvb2xlYW4gaXNPbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uSW5wdXRTdHJlYW0KLWphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdCkKLQotcHVibGljIGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdCBnZXRNZXNzYWdlRGlnZXN0KCkKLQotcHVibGljIHZvaWQgb24oCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoCi1ieXRlW10KLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRNZXNzYWdlRGlnZXN0KAotamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5zZWN1cml0eS5EaWdlc3RPdXRwdXRTdHJlYW0gZXh0ZW5kcyBqYXZhLmlvLkZpbHRlck91dHB1dFN0cmVhbQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0IGRpZ2VzdAotCi1wcml2YXRlIGJvb2xlYW4gaXNPbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uT3V0cHV0U3RyZWFtCi1qYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3QpCi0KLXB1YmxpYyBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3QgZ2V0TWVzc2FnZURpZ2VzdCgpCi0KLXB1YmxpYyB2b2lkIG9uKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0TWVzc2FnZURpZ2VzdCgKLWphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB3cml0ZSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgd3JpdGUoCi1ieXRlW10KLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZhLnNlY3VyaXR5LkRvbWFpbkNvbWJpbmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnNlY3VyaXR5LlByb3RlY3Rpb25Eb21haW5bXSBjb21iaW5lKAotamF2YS5zZWN1cml0eS5Qcm90ZWN0aW9uRG9tYWluW10KLWphdmEuc2VjdXJpdHkuUHJvdGVjdGlvbkRvbWFpbltdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEuc2VjdXJpdHkuR3VhcmRlZE9iamVjdCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLnNlY3VyaXR5Lkd1YXJkIGd1YXJkCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLk9iamVjdCBvYmplY3QKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLnNlY3VyaXR5Lkd1YXJkKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoCi1qYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL1NlY3VyaXR5RXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRPYmplY3QoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXROYW1lKCkKLQotcHVibGljIGFic3RyYWN0IGludCBoYXNoQ29kZSgpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZhLnNlY3VyaXR5LklkZW50aXR5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsLCBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL1ZlY3RvcjxMamF2YS9zZWN1cml0eS9DZXJ0aWZpY2F0ZTs+OyApCi1wcml2YXRlIGphdmEudXRpbC5WZWN0b3IgY2VydGlmaWNhdGVzCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBpbmZvCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBuYW1lCi0KLXByaXZhdGUgamF2YS5zZWN1cml0eS5QdWJsaWNLZXkgcHVibGljS2V5Ci0KLXByaXZhdGUgamF2YS5zZWN1cml0eS5JZGVudGl0eVNjb3BlIHNjb3BlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9LZXlNYW5hZ2VtZW50RXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnNlY3VyaXR5LklkZW50aXR5U2NvcGUpCi0KLXByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2hlY2tLZXlzRXF1YWwoCi1qYXZhLnNlY3VyaXR5LlB1YmxpY0tleQotamF2YS5zZWN1cml0eS5QdWJsaWNLZXkpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvS2V5TWFuYWdlbWVudEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgYWRkQ2VydGlmaWNhdGUoCi1qYXZhLnNlY3VyaXR5LkNlcnRpZmljYXRlKQotCi1wdWJsaWMgamF2YS5zZWN1cml0eS5DZXJ0aWZpY2F0ZVtdIGNlcnRpZmljYXRlcygpCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEluZm8oKQotCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBnZXROYW1lKCkKLQotcHVibGljIGphdmEuc2VjdXJpdHkuUHVibGljS2V5IGdldFB1YmxpY0tleSgpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLnNlY3VyaXR5LklkZW50aXR5U2NvcGUgZ2V0U2NvcGUoKQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLQotcHJvdGVjdGVkIGJvb2xlYW4gaWRlbnRpdHlFcXVhbHMoCi1qYXZhLnNlY3VyaXR5LklkZW50aXR5KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0tleU1hbmFnZW1lbnRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHJlbW92ZUNlcnRpZmljYXRlKAotamF2YS5zZWN1cml0eS5DZXJ0aWZpY2F0ZSkKLQotcHVibGljIHZvaWQgc2V0SW5mbygKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvS2V5TWFuYWdlbWVudEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0UHVibGljS2V5KAotamF2YS5zZWN1cml0eS5QdWJsaWNLZXkpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoCi1ib29sZWFuKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS9zZWN1cml0eS9Qcml2aWxlZ2VkQWN0aW9uPExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLWZpbmFsIGNsYXNzIGphdmEuc2VjdXJpdHkuSWRlbnRpdHlTY29wZSQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IHJ1bigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgamF2YS5zZWN1cml0eS5JZGVudGl0eVNjb3BlIGV4dGVuZHMgamF2YS5zZWN1cml0eS5JZGVudGl0eQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5zZWN1cml0eS5JZGVudGl0eVNjb3BlIHN5c3RlbVNjb3BlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9LZXlNYW5hZ2VtZW50RXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnNlY3VyaXR5LklkZW50aXR5U2NvcGUpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5zZWN1cml0eS5JZGVudGl0eVNjb3BlIGdldFN5c3RlbVNjb3BlKCkKLQotcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHNldFN5c3RlbVNjb3BlKAotamF2YS5zZWN1cml0eS5JZGVudGl0eVNjb3BlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0tleU1hbmFnZW1lbnRFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGFkZElkZW50aXR5KAotamF2YS5zZWN1cml0eS5JZGVudGl0eSkKLQotcHVibGljIGFic3RyYWN0IGphdmEuc2VjdXJpdHkuSWRlbnRpdHkgZ2V0SWRlbnRpdHkoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5zZWN1cml0eS5JZGVudGl0eSBnZXRJZGVudGl0eSgKLWphdmEuc2VjdXJpdHkuUHJpbmNpcGFsKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zZWN1cml0eS5JZGVudGl0eSBnZXRJZGVudGl0eSgKLWphdmEuc2VjdXJpdHkuUHVibGljS2V5KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9FbnVtZXJhdGlvbjxMamF2YS9zZWN1cml0eS9JZGVudGl0eTs+OyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLkVudW1lcmF0aW9uIGlkZW50aXRpZXMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0tleU1hbmFnZW1lbnRFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlbW92ZUlkZW50aXR5KAotamF2YS5zZWN1cml0eS5JZGVudGl0eSkKLQotcHVibGljIGFic3RyYWN0IGludCBzaXplKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEuc2VjdXJpdHkuSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiBleHRlbmRzIGphdmEuc2VjdXJpdHkuR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5zZWN1cml0eS5LZXlFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLnNlY3VyaXR5LkdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEuc2VjdXJpdHkuSW52YWxpZEtleUV4Y2VwdGlvbiBleHRlbmRzIGphdmEuc2VjdXJpdHkuS2V5RXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5zZWN1cml0eS5JbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZhLnNlY3VyaXR5LktleSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldEFsZ29yaXRobSgpCi0KLXB1YmxpYyBhYnN0cmFjdCBieXRlW10gZ2V0RW5jb2RlZCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldEZvcm1hdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5zZWN1cml0eS5LZXlGYWN0b3J5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNFUlZJQ0UKLQotcHJpdmF0ZSBzdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmZvcnRyZXNzLkVuZ2luZSBlbmdpbmUKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGFsZ29yaXRobQotCi1wcml2YXRlIGphdmEuc2VjdXJpdHkuUHJvdmlkZXIgcHJvdmlkZXIKLQotcHJpdmF0ZSBqYXZhLnNlY3VyaXR5LktleUZhY3RvcnlTcGkgc3BpSW1wbAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotamF2YS5zZWN1cml0eS5LZXlGYWN0b3J5U3BpCi1qYXZhLnNlY3VyaXR5LlByb3ZpZGVyCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBqYXZhLnNlY3VyaXR5LktleUZhY3RvcnkgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9Ob1N1Y2hQcm92aWRlckV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBqYXZhLnNlY3VyaXR5LktleUZhY3RvcnkgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBqYXZhLnNlY3VyaXR5LktleUZhY3RvcnkgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnNlY3VyaXR5LlByb3ZpZGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L3NwZWMvSW52YWxpZEtleVNwZWNFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBqYXZhLnNlY3VyaXR5LlByaXZhdGVLZXkgZ2VuZXJhdGVQcml2YXRlKAotamF2YS5zZWN1cml0eS5zcGVjLktleVNwZWMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvc3BlYy9JbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIGphdmEuc2VjdXJpdHkuUHVibGljS2V5IGdlbmVyYXRlUHVibGljKAotamF2YS5zZWN1cml0eS5zcGVjLktleVNwZWMpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGdldEFsZ29yaXRobSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFQ6OkxqYXZhL3NlY3VyaXR5L3NwZWMvS2V5U3BlYzs+KExqYXZhL3NlY3VyaXR5L0tleTtMamF2YS9sYW5nL0NsYXNzPFRUOz47KVRUOyApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvc3BlYy9JbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIGphdmEuc2VjdXJpdHkuc3BlYy5LZXlTcGVjIGdldEtleVNwZWMoCi1qYXZhLnNlY3VyaXR5LktleQotamF2YS5sYW5nLkNsYXNzKQotCi1wdWJsaWMgZmluYWwgamF2YS5zZWN1cml0eS5Qcm92aWRlciBnZXRQcm92aWRlcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIGphdmEuc2VjdXJpdHkuS2V5IHRyYW5zbGF0ZUtleSgKLWphdmEuc2VjdXJpdHkuS2V5KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGphdmEuc2VjdXJpdHkuS2V5RmFjdG9yeVNwaSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L3NwZWMvSW52YWxpZEtleVNwZWNFeGNlcHRpb247ICkKLXByb3RlY3RlZCBhYnN0cmFjdCBqYXZhLnNlY3VyaXR5LlByaXZhdGVLZXkgZW5naW5lR2VuZXJhdGVQcml2YXRlKAotamF2YS5zZWN1cml0eS5zcGVjLktleVNwZWMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvc3BlYy9JbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGFic3RyYWN0IGphdmEuc2VjdXJpdHkuUHVibGljS2V5IGVuZ2luZUdlbmVyYXRlUHVibGljKAotamF2YS5zZWN1cml0eS5zcGVjLktleVNwZWMpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFQ6OkxqYXZhL3NlY3VyaXR5L3NwZWMvS2V5U3BlYzs+KExqYXZhL3NlY3VyaXR5L0tleTtMamF2YS9sYW5nL0NsYXNzPFRUOz47KVRUOyApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvc3BlYy9JbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGFic3RyYWN0IGphdmEuc2VjdXJpdHkuc3BlYy5LZXlTcGVjIGVuZ2luZUdldEtleVNwZWMoCi1qYXZhLnNlY3VyaXR5LktleQotamF2YS5sYW5nLkNsYXNzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247ICkKLXByb3RlY3RlZCBhYnN0cmFjdCBqYXZhLnNlY3VyaXR5LktleSBlbmdpbmVUcmFuc2xhdGVLZXkoCi1qYXZhLnNlY3VyaXR5LktleSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLnNlY3VyaXR5LktleU1hbmFnZW1lbnRFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLnNlY3VyaXR5LktleUV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIGphdmEuc2VjdXJpdHkuS2V5UGFpciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLnNlY3VyaXR5LlByaXZhdGVLZXkgcHJpdmF0ZUtleQotCi1wcml2YXRlIGZpbmFsIGphdmEuc2VjdXJpdHkuUHVibGljS2V5IHB1YmxpY0tleQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuc2VjdXJpdHkuUHVibGljS2V5Ci1qYXZhLnNlY3VyaXR5LlByaXZhdGVLZXkpCi0KLXB1YmxpYyBqYXZhLnNlY3VyaXR5LlByaXZhdGVLZXkgZ2V0UHJpdmF0ZSgpCi0KLXB1YmxpYyBqYXZhLnNlY3VyaXR5LlB1YmxpY0tleSBnZXRQdWJsaWMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0tleVBhaXJHZW5lcmF0b3I7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9NDEwNCBuYW1lID1udWxsICkKLSBjbGFzcyBqYXZhLnNlY3VyaXR5LktleVBhaXJHZW5lcmF0b3IkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGphdmEuc2VjdXJpdHkuS2V5UGFpckdlbmVyYXRvclNwaSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zZWN1cml0eS5LZXlQYWlyIGdlbmVyYXRlS2V5UGFpcigpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGluaXRpYWxpemUoCi1pbnQKLWphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGluaXRpYWxpemUoCi1qYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYwotamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MamF2YS9zZWN1cml0eS9LZXlQYWlyR2VuZXJhdG9yJDE7TGphdmEvc2VjdXJpdHkvS2V5UGFpckdlbmVyYXRvciRLZXlQYWlyR2VuZXJhdG9ySW1wbDsgKQotcHVibGljIGFic3RyYWN0IGNsYXNzIGphdmEuc2VjdXJpdHkuS2V5UGFpckdlbmVyYXRvciBleHRlbmRzIGphdmEuc2VjdXJpdHkuS2V5UGFpckdlbmVyYXRvclNwaQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNFUlZJQ0UKLQotcHJpdmF0ZSBzdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmZvcnRyZXNzLkVuZ2luZSBlbmdpbmUKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20gcmFuZG9tCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBhbGdvcml0aG0KLQotcHJpdmF0ZSBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyIHByb3ZpZGVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1zdGF0aWMgamF2YS5zZWN1cml0eS5Qcm92aWRlciBhY2Nlc3MkMTAyKAotamF2YS5zZWN1cml0eS5LZXlQYWlyR2VuZXJhdG9yCi1qYXZhLnNlY3VyaXR5LlByb3ZpZGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBqYXZhLnNlY3VyaXR5LktleVBhaXJHZW5lcmF0b3IgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9Ob1N1Y2hQcm92aWRlckV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBqYXZhLnNlY3VyaXR5LktleVBhaXJHZW5lcmF0b3IgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBqYXZhLnNlY3VyaXR5LktleVBhaXJHZW5lcmF0b3IgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnNlY3VyaXR5LlByb3ZpZGVyKQotCi1wdWJsaWMgZmluYWwgamF2YS5zZWN1cml0eS5LZXlQYWlyIGdlbktleVBhaXIoKQotCi1wdWJsaWMgamF2YS5zZWN1cml0eS5LZXlQYWlyIGdlbmVyYXRlS2V5UGFpcigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEFsZ29yaXRobSgpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyIGdldFByb3ZpZGVyKCkKLQotcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgKLWludCkKLQotcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgKLWludAotamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgKLWphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGluaXRpYWxpemUoCi1qYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYwotamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvS2V5UGFpckdlbmVyYXRvcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1LZXlQYWlyR2VuZXJhdG9ySW1wbCApCi0gY2xhc3MgamF2YS5zZWN1cml0eS5LZXlQYWlyR2VuZXJhdG9yJEtleVBhaXJHZW5lcmF0b3JJbXBsIGV4dGVuZHMgamF2YS5zZWN1cml0eS5LZXlQYWlyR2VuZXJhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS5zZWN1cml0eS5LZXlQYWlyR2VuZXJhdG9yU3BpIHNwaUltcGwKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5zZWN1cml0eS5LZXlQYWlyR2VuZXJhdG9yU3BpCi1qYXZhLnNlY3VyaXR5LlByb3ZpZGVyCi1qYXZhLmxhbmcuU3RyaW5nKQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnNlY3VyaXR5LktleVBhaXJHZW5lcmF0b3JTcGkKLWphdmEuc2VjdXJpdHkuUHJvdmlkZXIKLWphdmEubGFuZy5TdHJpbmcKLWphdmEuc2VjdXJpdHkuS2V5UGFpckdlbmVyYXRvciQxKQotCi1wdWJsaWMgamF2YS5zZWN1cml0eS5LZXlQYWlyIGdlbmVyYXRlS2V5UGFpcigpCi0KLXB1YmxpYyB2b2lkIGluaXRpYWxpemUoCi1pbnQKLWphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGluaXRpYWxpemUoCi1qYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYwotamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID00MTA0IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvS2V5UmVwOyApCi0gY2xhc3MgamF2YS5zZWN1cml0eS5LZXlSZXAkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIGludFtdICRTd2l0Y2hNYXAkamF2YSRzZWN1cml0eSRLZXlSZXAkVHlwZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE2NDA5IG5hbWUgPVR5cGUgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvRW51bTxMamF2YS9zZWN1cml0eS9LZXlSZXAkVHlwZTs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9LZXlSZXA7ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBqYXZhLnNlY3VyaXR5LktleVJlcCRUeXBlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5zZWN1cml0eS5LZXlSZXAkVHlwZVtdICRWQUxVRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnNlY3VyaXR5LktleVJlcCRUeXBlIFBSSVZBVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnNlY3VyaXR5LktleVJlcCRUeXBlIFBVQkxJQwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEuc2VjdXJpdHkuS2V5UmVwJFR5cGUgU0VDUkVUCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpViApCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgc3RhdGljIGphdmEuc2VjdXJpdHkuS2V5UmVwJFR5cGUgdmFsdWVPZigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5zZWN1cml0eS5LZXlSZXAkVHlwZVtdIHZhbHVlcygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MamF2YS9zZWN1cml0eS9LZXlSZXAkMTtMamF2YS9zZWN1cml0eS9LZXlSZXAkVHlwZTsgKQotcHVibGljIGNsYXNzIGphdmEuc2VjdXJpdHkuS2V5UmVwIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgYWxnb3JpdGhtCi0KLXByaXZhdGUgYnl0ZVtdIGVuY29kZWQKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGZvcm1hdAotCi1wcml2YXRlIGZpbmFsIGphdmEuc2VjdXJpdHkuS2V5UmVwJFR5cGUgdHlwZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuc2VjdXJpdHkuS2V5UmVwJFR5cGUKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9sYW5nL0NsYXNzTm90Rm91bmRFeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCByZWFkT2JqZWN0KAotamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9PYmplY3RTdHJlYW1FeGNlcHRpb247ICkKLXByb3RlY3RlZCBqYXZhLmxhbmcuT2JqZWN0IHJlYWRSZXNvbHZlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvc2VjdXJpdHkvUHJpdmlsZWdlZEFjdGlvbjxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1maW5hbCBjbGFzcyBqYXZhLnNlY3VyaXR5LktleVN0b3JlJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgcnVuKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvc2VjdXJpdHkvUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjxMamF2YS9sYW5nL09iamVjdDs+OyApCi0gY2xhc3MgamF2YS5zZWN1cml0eS5LZXlTdG9yZSRCdWlsZGVyJEJ1aWxkZXJJbXBsJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGphdmEuc2VjdXJpdHkuS2V5U3RvcmUkQnVpbGRlciRCdWlsZGVySW1wbCB0aGlzJDAKLQotZmluYWwgamF2YS5zZWN1cml0eS5LZXlTdG9yZSB2YWwka3MKLQotZmluYWwgY2hhcltdIHZhbCRwYXNzd2QKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnNlY3VyaXR5LktleVN0b3JlJEJ1aWxkZXIkQnVpbGRlckltcGwKLWphdmEuc2VjdXJpdHkuS2V5U3RvcmUKLWNoYXJbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0tleVN0b3JlJEJ1aWxkZXIkVG1wTFNQYXJhbWV0ZXI7TGphdmEvc2VjdXJpdHkvS2V5U3RvcmUkQnVpbGRlciRCdWlsZGVySW1wbDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvS2V5U3RvcmU7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAzMyBuYW1lID1CdWlsZGVyICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZhLnNlY3VyaXR5LktleVN0b3JlJEJ1aWxkZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBqYXZhLnNlY3VyaXR5LktleVN0b3JlJEJ1aWxkZXIgbmV3SW5zdGFuY2UoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnNlY3VyaXR5LlByb3ZpZGVyCi1qYXZhLmlvLkZpbGUKLWphdmEuc2VjdXJpdHkuS2V5U3RvcmUkUHJvdGVjdGlvblBhcmFtZXRlcikKLQotcHVibGljIHN0YXRpYyBqYXZhLnNlY3VyaXR5LktleVN0b3JlJEJ1aWxkZXIgbmV3SW5zdGFuY2UoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnNlY3VyaXR5LlByb3ZpZGVyCi1qYXZhLnNlY3VyaXR5LktleVN0b3JlJFByb3RlY3Rpb25QYXJhbWV0ZXIpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5zZWN1cml0eS5LZXlTdG9yZSRCdWlsZGVyIG5ld0luc3RhbmNlKAotamF2YS5zZWN1cml0eS5LZXlTdG9yZQotamF2YS5zZWN1cml0eS5LZXlTdG9yZSRQcm90ZWN0aW9uUGFyYW1ldGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0tleVN0b3JlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zZWN1cml0eS5LZXlTdG9yZSBnZXRLZXlTdG9yZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvS2V5U3RvcmVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnNlY3VyaXR5LktleVN0b3JlJFByb3RlY3Rpb25QYXJhbWV0ZXIgZ2V0UHJvdGVjdGlvblBhcmFtZXRlcigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvS2V5U3RvcmUkQnVpbGRlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1CdWlsZGVySW1wbCApCi0gY2xhc3MgamF2YS5zZWN1cml0eS5LZXlTdG9yZSRCdWlsZGVyJEJ1aWxkZXJJbXBsIGV4dGVuZHMgamF2YS5zZWN1cml0eS5LZXlTdG9yZSRCdWlsZGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sQ29udGV4dCBhY2NDb250cm9sQ29udGV4dAotCi1wcml2YXRlIGZpbmFsIGphdmEuaW8uRmlsZSBmaWxlRm9yTG9hZAotCi1wcml2YXRlIGJvb2xlYW4gaXNHZXRLZXlTdG9yZQotCi1wcml2YXRlIGphdmEuc2VjdXJpdHkuS2V5U3RvcmUga2V5U3RvcmUKLQotcHJpdmF0ZSBqYXZhLnNlY3VyaXR5LktleVN0b3JlRXhjZXB0aW9uIGxhc3RFeGNlcHRpb24KLQotcHJpdmF0ZSBqYXZhLnNlY3VyaXR5LktleVN0b3JlJFByb3RlY3Rpb25QYXJhbWV0ZXIgcHJvdFBhcmFtZXRlcgotCi1wcml2YXRlIGZpbmFsIGphdmEuc2VjdXJpdHkuUHJvdmlkZXIgcHJvdmlkZXJGb3JLZXlTdG9yZQotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgdHlwZUZvcktleVN0b3JlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS5zZWN1cml0eS5LZXlTdG9yZQotamF2YS5zZWN1cml0eS5LZXlTdG9yZSRQcm90ZWN0aW9uUGFyYW1ldGVyCi1qYXZhLmlvLkZpbGUKLWphdmEubGFuZy5TdHJpbmcKLWphdmEuc2VjdXJpdHkuUHJvdmlkZXIKLWphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbENvbnRleHQpCi0KLXN0YXRpYyBqYXZhLmlvLkZpbGUgYWNjZXNzJDIwMCgKLWphdmEuc2VjdXJpdHkuS2V5U3RvcmUkQnVpbGRlciRCdWlsZGVySW1wbCkKLQotc3RhdGljIGphdmEuc2VjdXJpdHkuS2V5U3RvcmUkUHJvdGVjdGlvblBhcmFtZXRlciBhY2Nlc3MkMzAwKAotamF2YS5zZWN1cml0eS5LZXlTdG9yZSRCdWlsZGVyJEJ1aWxkZXJJbXBsKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0tleVN0b3JlRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zZWN1cml0eS5LZXlTdG9yZSBnZXRLZXlTdG9yZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvS2V5U3RvcmVFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnNlY3VyaXR5LktleVN0b3JlJFByb3RlY3Rpb25QYXJhbWV0ZXIgZ2V0UHJvdGVjdGlvblBhcmFtZXRlcigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPUxvYWRTdG9yZVBhcmFtZXRlciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9LZXlTdG9yZTsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZhLnNlY3VyaXR5LktleVN0b3JlJExvYWRTdG9yZVBhcmFtZXRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zZWN1cml0eS5LZXlTdG9yZSRQcm90ZWN0aW9uUGFyYW1ldGVyIGdldFByb3RlY3Rpb25QYXJhbWV0ZXIoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9VG1wTFNQYXJhbWV0ZXIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvS2V5U3RvcmUkQnVpbGRlcjsgKQotIGNsYXNzIGphdmEuc2VjdXJpdHkuS2V5U3RvcmUkQnVpbGRlciRUbXBMU1BhcmFtZXRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnNlY3VyaXR5LktleVN0b3JlJExvYWRTdG9yZVBhcmFtZXRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGphdmEuc2VjdXJpdHkuS2V5U3RvcmUkUHJvdGVjdGlvblBhcmFtZXRlciBwcm90UGFyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5zZWN1cml0eS5LZXlTdG9yZSRQcm90ZWN0aW9uUGFyYW1ldGVyKQotCi1wdWJsaWMgamF2YS5zZWN1cml0eS5LZXlTdG9yZSRQcm90ZWN0aW9uUGFyYW1ldGVyIGdldFByb3RlY3Rpb25QYXJhbWV0ZXIoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NSBuYW1lID1Qcm90ZWN0aW9uUGFyYW1ldGVyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0tleVN0b3JlOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEuc2VjdXJpdHkuS2V5U3RvcmUkUHJvdGVjdGlvblBhcmFtZXRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1DYWxsYmFja0hhbmRsZXJQcm90ZWN0aW9uICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0tleVN0b3JlOyApCi1wdWJsaWMgY2xhc3MgamF2YS5zZWN1cml0eS5LZXlTdG9yZSRDYWxsYmFja0hhbmRsZXJQcm90ZWN0aW9uIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuS2V5U3RvcmUkUHJvdGVjdGlvblBhcmFtZXRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2suQ2FsbGJhY2tIYW5kbGVyIGNhbGxiYWNrSGFuZGxlcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2suQ2FsbGJhY2tIYW5kbGVyKQotCi1wdWJsaWMgamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjay5DYWxsYmFja0hhbmRsZXIgZ2V0Q2FsbGJhY2tIYW5kbGVyKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9RW50cnkgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvS2V5U3RvcmU7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgamF2YS5zZWN1cml0eS5LZXlTdG9yZSRFbnRyeSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZheC5zZWN1cml0eS5hdXRoLkRlc3Ryb3lhYmxlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmF4L3NlY3VyaXR5L2F1dGgvRGVzdHJveUZhaWxlZEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgZGVzdHJveSgpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzRGVzdHJveWVkKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9UGFzc3dvcmRQcm90ZWN0aW9uICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0tleVN0b3JlOyApCi1wdWJsaWMgY2xhc3MgamF2YS5zZWN1cml0eS5LZXlTdG9yZSRQYXNzd29yZFByb3RlY3Rpb24gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5LZXlTdG9yZSRQcm90ZWN0aW9uUGFyYW1ldGVyLCBqYXZheC5zZWN1cml0eS5hdXRoLkRlc3Ryb3lhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYm9vbGVhbiBpc0Rlc3Ryb3llZAotCi1wcml2YXRlIGNoYXJbXSBwYXNzd29yZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWNoYXJbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YXgvc2VjdXJpdHkvYXV0aC9EZXN0cm95RmFpbGVkRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBkZXN0cm95KCkKLQotcHVibGljIGNoYXJbXSBnZXRQYXNzd29yZCgpCi0KLXB1YmxpYyBib29sZWFuIGlzRGVzdHJveWVkKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9LZXlTdG9yZTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNSBuYW1lID1Qcml2YXRlS2V5RW50cnkgKQotcHVibGljIGZpbmFsIGNsYXNzIGphdmEuc2VjdXJpdHkuS2V5U3RvcmUkUHJpdmF0ZUtleUVudHJ5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuS2V5U3RvcmUkRW50cnkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVbXSBjaGFpbgotCi1wcml2YXRlIGphdmEuc2VjdXJpdHkuUHJpdmF0ZUtleSBwcml2YXRlS2V5Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5zZWN1cml0eS5Qcml2YXRlS2V5Ci1qYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVbXSkKLQotcHVibGljIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZSBnZXRDZXJ0aWZpY2F0ZSgpCi0KLXB1YmxpYyBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVbXSBnZXRDZXJ0aWZpY2F0ZUNoYWluKCkKLQotcHVibGljIGphdmEuc2VjdXJpdHkuUHJpdmF0ZUtleSBnZXRQcml2YXRlS2V5KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0tleVN0b3JlOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI1IG5hbWUgPVNlY3JldEtleUVudHJ5ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBqYXZhLnNlY3VyaXR5LktleVN0b3JlJFNlY3JldEtleUVudHJ5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuS2V5U3RvcmUkRW50cnkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBqYXZheC5jcnlwdG8uU2VjcmV0S2V5IHNlY3JldEtleQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmF4LmNyeXB0by5TZWNyZXRLZXkpCi0KLXB1YmxpYyBqYXZheC5jcnlwdG8uU2VjcmV0S2V5IGdldFNlY3JldEtleSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI1IG5hbWUgPVRydXN0ZWRDZXJ0aWZpY2F0ZUVudHJ5ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0tleVN0b3JlOyApCi1wdWJsaWMgZmluYWwgY2xhc3MgamF2YS5zZWN1cml0eS5LZXlTdG9yZSRUcnVzdGVkQ2VydGlmaWNhdGVFbnRyeSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnNlY3VyaXR5LktleVN0b3JlJEVudHJ5Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlIHRydXN0Q2VydGlmaWNhdGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGUpCi0KLXB1YmxpYyBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGUgZ2V0VHJ1c3RlZENlcnRpZmljYXRlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvS2V5U3RvcmUkVHJ1c3RlZENlcnRpZmljYXRlRW50cnk7TGphdmEvc2VjdXJpdHkvS2V5U3RvcmUkU2VjcmV0S2V5RW50cnk7TGphdmEvc2VjdXJpdHkvS2V5U3RvcmUkUHJpdmF0ZUtleUVudHJ5O0xqYXZhL3NlY3VyaXR5L0tleVN0b3JlJFByb3RlY3Rpb25QYXJhbWV0ZXI7TGphdmEvc2VjdXJpdHkvS2V5U3RvcmUkUGFzc3dvcmRQcm90ZWN0aW9uO0xqYXZhL3NlY3VyaXR5L0tleVN0b3JlJExvYWRTdG9yZVBhcmFtZXRlcjtMamF2YS9zZWN1cml0eS9LZXlTdG9yZSRFbnRyeTtMamF2YS9zZWN1cml0eS9LZXlTdG9yZSRDYWxsYmFja0hhbmRsZXJQcm90ZWN0aW9uO0xqYXZhL3NlY3VyaXR5L0tleVN0b3JlJEJ1aWxkZXI7ICkKLXB1YmxpYyBjbGFzcyBqYXZhLnNlY3VyaXR5LktleVN0b3JlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFRkFVTFRfS0VZU1RPUkVfVFlQRQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIE5PVElOSVRLRVlTVE9SRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBST1BFUlRZTkFNRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNFUlZJQ0UKLQotcHJpdmF0ZSBzdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmZvcnRyZXNzLkVuZ2luZSBlbmdpbmUKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLnNlY3VyaXR5LktleVN0b3JlU3BpIGltcGxTcGkKLQotcHJpdmF0ZSBib29sZWFuIGlzSW5pdAotCi1wcml2YXRlIGZpbmFsIGphdmEuc2VjdXJpdHkuUHJvdmlkZXIgcHJvdmlkZXIKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIHR5cGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLWphdmEuc2VjdXJpdHkuS2V5U3RvcmVTcGkKLWphdmEuc2VjdXJpdHkuUHJvdmlkZXIKLWphdmEubGFuZy5TdHJpbmcpCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQwMDAoCi1qYXZhLnNlY3VyaXR5LktleVN0b3JlKQotCi1zdGF0aWMgamF2YS5sYW5nLlN0cmluZyBhY2Nlc3MkMTAwKCkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGdldERlZmF1bHRUeXBlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9LZXlTdG9yZUV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBqYXZhLnNlY3VyaXR5LktleVN0b3JlIGdldEluc3RhbmNlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9LZXlTdG9yZUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9Ob1N1Y2hQcm92aWRlckV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBqYXZhLnNlY3VyaXR5LktleVN0b3JlIGdldEluc3RhbmNlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9LZXlTdG9yZUV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBqYXZhLnNlY3VyaXR5LktleVN0b3JlIGdldEluc3RhbmNlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5zZWN1cml0eS5Qcm92aWRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9LZXlTdG9yZUV4Y2VwdGlvbjsgKQotcHJpdmF0ZSBzdGF0aWMgdm9pZCB0aHJvd05vdEluaXRpYWxpemVkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9LZXlTdG9yZUV4Y2VwdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9FbnVtZXJhdGlvbjxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wdWJsaWMgZmluYWwgamF2YS51dGlsLkVudW1lcmF0aW9uIGFsaWFzZXMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0tleVN0b3JlRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBjb250YWluc0FsaWFzKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9LZXlTdG9yZUV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIHZvaWQgZGVsZXRlRW50cnkoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0tleVN0b3JlRXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvQ2xhc3M8K0xqYXZhL3NlY3VyaXR5L0tleVN0b3JlJEVudHJ5Oz47KVogKQotcHVibGljIGZpbmFsIGJvb2xlYW4gZW50cnlJbnN0YW5jZU9mKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLkNsYXNzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0tleVN0b3JlRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlIGdldENlcnRpZmljYXRlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9LZXlTdG9yZUV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgZ2V0Q2VydGlmaWNhdGVBbGlhcygKLWphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9LZXlTdG9yZUV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZVtdIGdldENlcnRpZmljYXRlQ2hhaW4oCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0tleVN0b3JlRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgamF2YS51dGlsLkRhdGUgZ2V0Q3JlYXRpb25EYXRlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247TGphdmEvc2VjdXJpdHkvVW5yZWNvdmVyYWJsZUVudHJ5RXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L0tleVN0b3JlRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgamF2YS5zZWN1cml0eS5LZXlTdG9yZSRFbnRyeSBnZXRFbnRyeSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEuc2VjdXJpdHkuS2V5U3RvcmUkUHJvdGVjdGlvblBhcmFtZXRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9LZXlTdG9yZUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247TGphdmEvc2VjdXJpdHkvVW5yZWNvdmVyYWJsZUtleUV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIGphdmEuc2VjdXJpdHkuS2V5IGdldEtleSgKLWphdmEubGFuZy5TdHJpbmcKLWNoYXJbXSkKLQotcHVibGljIGZpbmFsIGphdmEuc2VjdXJpdHkuUHJvdmlkZXIgZ2V0UHJvdmlkZXIoKQotCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBnZXRUeXBlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9LZXlTdG9yZUV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIGJvb2xlYW4gaXNDZXJ0aWZpY2F0ZUVudHJ5KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9LZXlTdG9yZUV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIGJvb2xlYW4gaXNLZXlFbnRyeSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvc2VjdXJpdHkvTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCB2b2lkIGxvYWQoCi1qYXZhLmlvLklucHV0U3RyZWFtCi1jaGFyW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvc2VjdXJpdHkvTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCB2b2lkIGxvYWQoCi1qYXZhLnNlY3VyaXR5LktleVN0b3JlJExvYWRTdG9yZVBhcmFtZXRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9LZXlTdG9yZUV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIHZvaWQgc2V0Q2VydGlmaWNhdGVFbnRyeSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9LZXlTdG9yZUV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIHZvaWQgc2V0RW50cnkoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnNlY3VyaXR5LktleVN0b3JlJEVudHJ5Ci1qYXZhLnNlY3VyaXR5LktleVN0b3JlJFByb3RlY3Rpb25QYXJhbWV0ZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvS2V5U3RvcmVFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCB2b2lkIHNldEtleUVudHJ5KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5zZWN1cml0eS5LZXkKLWNoYXJbXQotamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvS2V5U3RvcmVFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCB2b2lkIHNldEtleUVudHJ5KAotamF2YS5sYW5nLlN0cmluZwotYnl0ZVtdCi1qYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9LZXlTdG9yZUV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIGludCBzaXplKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9LZXlTdG9yZUV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247TGphdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIHZvaWQgc3RvcmUoCi1qYXZhLmlvLk91dHB1dFN0cmVhbQotY2hhcltdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0tleVN0b3JlRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgdm9pZCBzdG9yZSgKLWphdmEuc2VjdXJpdHkuS2V5U3RvcmUkTG9hZFN0b3JlUGFyYW1ldGVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEuc2VjdXJpdHkuS2V5U3RvcmVFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLnNlY3VyaXR5LkdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGphdmEuc2VjdXJpdHkuS2V5U3RvcmVTcGkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9VbnJlY292ZXJhYmxlRW50cnlFeGNlcHRpb247ICkKLXN0YXRpYyBjaGFyW10gZ2V0UGFzc3dvcmRGcm9tQ2FsbEJhY2soCi1qYXZhLnNlY3VyaXR5LktleVN0b3JlJFByb3RlY3Rpb25QYXJhbWV0ZXIpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0VudW1lcmF0aW9uPExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnV0aWwuRW51bWVyYXRpb24gZW5naW5lQWxpYXNlcygpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGVuZ2luZUNvbnRhaW5zQWxpYXMoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0tleVN0b3JlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBlbmdpbmVEZWxldGVFbnRyeSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvQ2xhc3M8K0xqYXZhL3NlY3VyaXR5L0tleVN0b3JlJEVudHJ5Oz47KVogKQotcHVibGljIGJvb2xlYW4gZW5naW5lRW50cnlJbnN0YW5jZU9mKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLkNsYXNzKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlIGVuZ2luZUdldENlcnRpZmljYXRlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZW5naW5lR2V0Q2VydGlmaWNhdGVBbGlhcygKLWphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZSkKLQotcHVibGljIGFic3RyYWN0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZVtdIGVuZ2luZUdldENlcnRpZmljYXRlQ2hhaW4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLkRhdGUgZW5naW5lR2V0Q3JlYXRpb25EYXRlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9LZXlTdG9yZUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247TGphdmEvc2VjdXJpdHkvVW5yZWNvdmVyYWJsZUVudHJ5RXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zZWN1cml0eS5LZXlTdG9yZSRFbnRyeSBlbmdpbmVHZXRFbnRyeSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEuc2VjdXJpdHkuS2V5U3RvcmUkUHJvdGVjdGlvblBhcmFtZXRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247TGphdmEvc2VjdXJpdHkvVW5yZWNvdmVyYWJsZUtleUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEuc2VjdXJpdHkuS2V5IGVuZ2luZUdldEtleSgKLWphdmEubGFuZy5TdHJpbmcKLWNoYXJbXSkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZW5naW5lSXNDZXJ0aWZpY2F0ZUVudHJ5KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZW5naW5lSXNLZXlFbnRyeSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvc2VjdXJpdHkvTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGVuZ2luZUxvYWQoCi1qYXZhLmlvLklucHV0U3RyZWFtCi1jaGFyW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvc2VjdXJpdHkvTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGVuZ2luZUxvYWQoCi1qYXZhLnNlY3VyaXR5LktleVN0b3JlJExvYWRTdG9yZVBhcmFtZXRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9LZXlTdG9yZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgZW5naW5lU2V0Q2VydGlmaWNhdGVFbnRyeSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9LZXlTdG9yZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgZW5naW5lU2V0RW50cnkoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnNlY3VyaXR5LktleVN0b3JlJEVudHJ5Ci1qYXZhLnNlY3VyaXR5LktleVN0b3JlJFByb3RlY3Rpb25QYXJhbWV0ZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvS2V5U3RvcmVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGVuZ2luZVNldEtleUVudHJ5KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5zZWN1cml0eS5LZXkKLWNoYXJbXQotamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvS2V5U3RvcmVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGVuZ2luZVNldEtleUVudHJ5KAotamF2YS5sYW5nLlN0cmluZwotYnl0ZVtdCi1qYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVbXSkKLQotcHVibGljIGFic3RyYWN0IGludCBlbmdpbmVTaXplKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247TGphdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgZW5naW5lU3RvcmUoCi1qYXZhLmlvLk91dHB1dFN0cmVhbQotY2hhcltdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBlbmdpbmVTdG9yZSgKLWphdmEuc2VjdXJpdHkuS2V5U3RvcmUkTG9hZFN0b3JlUGFyYW1ldGVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L01lc3NhZ2VEaWdlc3Q7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9NDEwNCBuYW1lID1udWxsICkKLSBjbGFzcyBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3QkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdFNwaSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGNsb25lKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9EaWdlc3RFeGNlcHRpb247ICkKLXByb3RlY3RlZCBpbnQgZW5naW5lRGlnZXN0KAotYnl0ZVtdCi1pbnQKLWludCkKLQotcHJvdGVjdGVkIGFic3RyYWN0IGJ5dGVbXSBlbmdpbmVEaWdlc3QoKQotCi1wcm90ZWN0ZWQgaW50IGVuZ2luZUdldERpZ2VzdExlbmd0aCgpCi0KLXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVuZ2luZVJlc2V0KCkKLQotcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW5naW5lVXBkYXRlKAotYnl0ZSkKLQotcHJvdGVjdGVkIHZvaWQgZW5naW5lVXBkYXRlKAotamF2YS5uaW8uQnl0ZUJ1ZmZlcikKLQotcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW5naW5lVXBkYXRlKAotYnl0ZVtdCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L01lc3NhZ2VEaWdlc3QkMTtMamF2YS9zZWN1cml0eS9NZXNzYWdlRGlnZXN0JE1lc3NhZ2VEaWdlc3RJbXBsOyApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0IGV4dGVuZHMgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0U3BpCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0VSVklDRQotCi1wcml2YXRlIHN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuZm9ydHJlc3MuRW5naW5lIGVuZ2luZQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgYWxnb3JpdGhtCi0KLXByaXZhdGUgamF2YS5zZWN1cml0eS5Qcm92aWRlciBwcm92aWRlcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotc3RhdGljIGphdmEuc2VjdXJpdHkuUHJvdmlkZXIgYWNjZXNzJDEwMigKLWphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdAotamF2YS5zZWN1cml0eS5Qcm92aWRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0IGdldEluc3RhbmNlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247TGphdmEvc2VjdXJpdHkvTm9TdWNoUHJvdmlkZXJFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0IGdldEluc3RhbmNlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0IGdldEluc3RhbmNlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5zZWN1cml0eS5Qcm92aWRlcikKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzRXF1YWwoCi1ieXRlW10KLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0Nsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBjbG9uZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvRGlnZXN0RXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGRpZ2VzdCgKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyBieXRlW10gZGlnZXN0KCkKLQotcHVibGljIGJ5dGVbXSBkaWdlc3QoCi1ieXRlW10pCi0KLXB1YmxpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGdldEFsZ29yaXRobSgpCi0KLXB1YmxpYyBmaW5hbCBpbnQgZ2V0RGlnZXN0TGVuZ3RoKCkKLQotcHVibGljIGZpbmFsIGphdmEuc2VjdXJpdHkuUHJvdmlkZXIgZ2V0UHJvdmlkZXIoKQotCi1wdWJsaWMgdm9pZCByZXNldCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotcHVibGljIHZvaWQgdXBkYXRlKAotYnl0ZSkKLQotcHVibGljIGZpbmFsIHZvaWQgdXBkYXRlKAotamF2YS5uaW8uQnl0ZUJ1ZmZlcikKLQotcHVibGljIHZvaWQgdXBkYXRlKAotYnl0ZVtdKQotCi1wdWJsaWMgdm9pZCB1cGRhdGUoCi1ieXRlW10KLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9TWVzc2FnZURpZ2VzdEltcGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvTWVzc2FnZURpZ2VzdDsgKQotIGNsYXNzIGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdCRNZXNzYWdlRGlnZXN0SW1wbCBleHRlbmRzIGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdFNwaSBzcGlJbXBsCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdFNwaQotamF2YS5zZWN1cml0eS5Qcm92aWRlcgotamF2YS5sYW5nLlN0cmluZykKLQotIHZvaWQgPGluaXQ+KAotamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0U3BpCi1qYXZhLnNlY3VyaXR5LlByb3ZpZGVyCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3QkMSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0Nsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBjbG9uZSgpCi0KLXByb3RlY3RlZCBieXRlW10gZW5naW5lRGlnZXN0KCkKLQotcHJvdGVjdGVkIGludCBlbmdpbmVHZXREaWdlc3RMZW5ndGgoKQotCi1wcm90ZWN0ZWQgdm9pZCBlbmdpbmVSZXNldCgpCi0KLXByb3RlY3RlZCB2b2lkIGVuZ2luZVVwZGF0ZSgKLWJ5dGUpCi0KLXByb3RlY3RlZCB2b2lkIGVuZ2luZVVwZGF0ZSgKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZXh0ZW5kcyBqYXZhLnNlY3VyaXR5LkdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEuc2VjdXJpdHkuTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLnNlY3VyaXR5LkdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjQgbmFtZSA9TWV0YUVudW1lcmF0aW9uICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L1Blcm1pc3Npb25zOyApCi1maW5hbCBjbGFzcyBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb25zJE1ldGFFbnVtZXJhdGlvbiBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuRW51bWVyYXRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLnV0aWwuRW51bWVyYXRpb24gY3VycmVudAotCi1wcml2YXRlIGphdmEudXRpbC5JdGVyYXRvciBwY0l0ZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuSXRlcmF0b3IpCi0KLXByaXZhdGUgamF2YS51dGlsLkVudW1lcmF0aW9uIGdldE5leHRFbnVtZXJhdGlvbigpCi0KLXB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IG5leHRFbGVtZW50KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L1Blcm1pc3Npb25zJE1ldGFFbnVtZXJhdGlvbjsgKQotcHVibGljIGZpbmFsIGNsYXNzIGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbnMgZXh0ZW5kcyBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb25Db2xsZWN0aW9uIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5pby5PYmplY3RTdHJlYW1GaWVsZFtdIHNlcmlhbFBlcnNpc3RlbnRGaWVsZHMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0KLXByaXZhdGUgYm9vbGVhbiBhbGxFbmFibGVkCi0KLXByaXZhdGUgdHJhbnNpZW50IGphdmEudXRpbC5NYXAga2xhc3NlcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9sYW5nL0NsYXNzTm90Rm91bmRFeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCByZWFkT2JqZWN0KAotamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KAotamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0pCi0KLXB1YmxpYyB2b2lkIGFkZCgKLWphdmEuc2VjdXJpdHkuUGVybWlzc2lvbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvRW51bWVyYXRpb248TGphdmEvc2VjdXJpdHkvUGVybWlzc2lvbjs+OyApCi1wdWJsaWMgamF2YS51dGlsLkVudW1lcmF0aW9uIGVsZW1lbnRzKCkKLQotcHVibGljIGJvb2xlYW4gaW1wbGllcygKLWphdmEuc2VjdXJpdHkuUGVybWlzc2lvbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLWZpbmFsIGNsYXNzIGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbnNIYXNoIGV4dGVuZHMgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uQ29sbGVjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLnV0aWwuSGFzaHRhYmxlIHBlcm1zCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgYWRkKAotamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uKQotCi1wdWJsaWMgamF2YS51dGlsLkVudW1lcmF0aW9uIGVsZW1lbnRzKCkKLQotcHVibGljIGJvb2xlYW4gaW1wbGllcygKLWphdmEuc2VjdXJpdHkuUGVybWlzc2lvbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvc2VjdXJpdHkvUHJpdmlsZWdlZEFjdGlvbjxMamF2YS9zZWN1cml0eS9Qb2xpY3k7PjsgKQotZmluYWwgY2xhc3MgamF2YS5zZWN1cml0eS5Qb2xpY3kkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgamF2YS5sYW5nLlN0cmluZyB2YWwkZGVmYXVsdENsYXNzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgcnVuKCkKLQotcHVibGljIGphdmEuc2VjdXJpdHkuUG9saWN5IHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgamF2YS5zZWN1cml0eS5Qb2xpY3kgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEuc2VjdXJpdHkuU2VjdXJpdHlQZXJtaXNzaW9uIEdFVF9QT0xJQ1kKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQT0xJQ1lfUFJPVklERVIKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5zZWN1cml0eS5TZWN1cml0eVBlcm1pc3Npb24gU0VUX1BPTElDWQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLnNlY3VyaXR5LlBvbGljeSBhY3RpdmVQb2xpY3kKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXN0YXRpYyBqYXZhLnNlY3VyaXR5LlBvbGljeSBnZXRBY2Nlc3NpYmxlUG9saWN5KCkKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5zZWN1cml0eS5Qb2xpY3kgZ2V0RGVmYXVsdFByb3ZpZGVyKCkKLQotcHVibGljIHN0YXRpYyBqYXZhLnNlY3VyaXR5LlBvbGljeSBnZXRQb2xpY3koKQotCi1zdGF0aWMgYm9vbGVhbiBpc1NldCgpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQb2xpY3koCi1qYXZhLnNlY3VyaXR5LlBvbGljeSkKLQotcHVibGljIGFic3RyYWN0IGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbkNvbGxlY3Rpb24gZ2V0UGVybWlzc2lvbnMoCi1qYXZhLnNlY3VyaXR5LkNvZGVTb3VyY2UpCi0KLXB1YmxpYyBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb25Db2xsZWN0aW9uIGdldFBlcm1pc3Npb25zKAotamF2YS5zZWN1cml0eS5Qcm90ZWN0aW9uRG9tYWluKQotCi1wdWJsaWMgYm9vbGVhbiBpbXBsaWVzKAotamF2YS5zZWN1cml0eS5Qcm90ZWN0aW9uRG9tYWluCi1qYXZhLnNlY3VyaXR5LlBlcm1pc3Npb24pCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlZnJlc2goKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZhLnNlY3VyaXR5LlByaXZhdGVLZXkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5LZXkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5FeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0KLXByaXZhdGUgamF2YS5sYW5nLkV4Y2VwdGlvbiBleGNlcHRpb24KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuRXhjZXB0aW9uKQotCi1wdWJsaWMgamF2YS5sYW5nLlRocm93YWJsZSBnZXRDYXVzZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuRXhjZXB0aW9uIGdldEV4Y2VwdGlvbigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLnNlY3VyaXR5LlByb3RlY3Rpb25Eb21haW4gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS5sYW5nLkNsYXNzTG9hZGVyIGNsYXNzTG9hZGVyCi0KLXByaXZhdGUgamF2YS5zZWN1cml0eS5Db2RlU291cmNlIGNvZGVTb3VyY2UKLQotcHJpdmF0ZSBib29sZWFuIGR5bmFtaWNQZXJtcwotCi1wcml2YXRlIGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbkNvbGxlY3Rpb24gcGVybWlzc2lvbnMKLQotcHJpdmF0ZSBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbFtdIHByaW5jaXBhbHMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnNlY3VyaXR5LkNvZGVTb3VyY2UKLWphdmEuc2VjdXJpdHkuUGVybWlzc2lvbkNvbGxlY3Rpb24pCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuc2VjdXJpdHkuQ29kZVNvdXJjZQotamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uQ29sbGVjdGlvbgotamF2YS5sYW5nLkNsYXNzTG9hZGVyCi1qYXZhLnNlY3VyaXR5LlByaW5jaXBhbFtdKQotCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLkNsYXNzTG9hZGVyIGdldENsYXNzTG9hZGVyKCkKLQotcHVibGljIGZpbmFsIGphdmEuc2VjdXJpdHkuQ29kZVNvdXJjZSBnZXRDb2RlU291cmNlKCkKLQotcHVibGljIGZpbmFsIGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbkNvbGxlY3Rpb24gZ2V0UGVybWlzc2lvbnMoKQotCi1wdWJsaWMgZmluYWwgamF2YS5zZWN1cml0eS5QcmluY2lwYWxbXSBnZXRQcmluY2lwYWxzKCkKLQotcHVibGljIGJvb2xlYW4gaW1wbGllcygKLWphdmEuc2VjdXJpdHkuUGVybWlzc2lvbikKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS9zZWN1cml0eS9Qcml2aWxlZ2VkQWN0aW9uPExqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi0gY2xhc3MgamF2YS5zZWN1cml0eS5Qcm92aWRlciRTZXJ2aWNlJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGphdmEuc2VjdXJpdHkuUHJvdmlkZXIkU2VydmljZSB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnNlY3VyaXR5LlByb3ZpZGVyJFNlcnZpY2UpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IHJ1bigpCi0KLXB1YmxpYyBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L1Byb3ZpZGVyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9U2VydmljZSApCi1wdWJsaWMgY2xhc3MgamF2YS5zZWN1cml0eS5Qcm92aWRlciRTZXJ2aWNlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgYWxnb3JpdGhtCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9MaXN0PExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXByaXZhdGUgamF2YS51dGlsLkxpc3QgYWxpYXNlcwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXByaXZhdGUgamF2YS51dGlsLk1hcCBhdHRyaWJ1dGVzCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBjbGFzc05hbWUKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL0NsYXNzPCo+OyApCi1wcml2YXRlIGphdmEubGFuZy5DbGFzcyBpbXBsZW1lbnRhdGlvbgotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbGFzdENsYXNzTmFtZQotCi1wcml2YXRlIGphdmEuc2VjdXJpdHkuUHJvdmlkZXIgcHJvdmlkZXIKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHR5cGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9zZWN1cml0eS9Qcm92aWRlcjtMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZztMamF2YS91dGlsL0xpc3Q8TGphdmEvbGFuZy9TdHJpbmc7PjtMamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzs+OylWICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuc2VjdXJpdHkuUHJvdmlkZXIKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudXRpbC5MaXN0Ci1qYXZhLnV0aWwuTWFwKQotCi1zdGF0aWMgamF2YS5sYW5nLlN0cmluZyBhY2Nlc3MkMDAwKAotamF2YS5zZWN1cml0eS5Qcm92aWRlciRTZXJ2aWNlKQotCi1zdGF0aWMgamF2YS5sYW5nLlN0cmluZyBhY2Nlc3MkMTAwKAotamF2YS5zZWN1cml0eS5Qcm92aWRlciRTZXJ2aWNlKQotCi1zdGF0aWMgamF2YS51dGlsLkxpc3QgYWNjZXNzJDIwMCgKLWphdmEuc2VjdXJpdHkuUHJvdmlkZXIkU2VydmljZSkKLQotc3RhdGljIGphdmEubGFuZy5TdHJpbmcgYWNjZXNzJDMwMCgKLWphdmEuc2VjdXJpdHkuUHJvdmlkZXIkU2VydmljZSkKLQotc3RhdGljIGphdmEubGFuZy5TdHJpbmcgYWNjZXNzJDMwMigKLWphdmEuc2VjdXJpdHkuUHJvdmlkZXIkU2VydmljZQotamF2YS5sYW5nLlN0cmluZykKLQotc3RhdGljIGphdmEudXRpbC5NYXAgYWNjZXNzJDQwMCgKLWphdmEuc2VjdXJpdHkuUHJvdmlkZXIkU2VydmljZSkKLQotc3RhdGljIGphdmEuc2VjdXJpdHkuUHJvdmlkZXIgYWNjZXNzJDUwMCgKLWphdmEuc2VjdXJpdHkuUHJvdmlkZXIkU2VydmljZSkKLQotc3RhdGljIGphdmEubGFuZy5DbGFzcyBhY2Nlc3MkNjAyKAotamF2YS5zZWN1cml0eS5Qcm92aWRlciRTZXJ2aWNlCi1qYXZhLmxhbmcuQ2xhc3MpCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGFjY2VzcyQ3MDIoCi1qYXZhLnNlY3VyaXR5LlByb3ZpZGVyJFNlcnZpY2UKLWphdmEubGFuZy5TdHJpbmcpCi0KLSB2b2lkIGFkZEFsaWFzKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgZ2V0QWxnb3JpdGhtKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvSXRlcmF0b3I8TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotIGphdmEudXRpbC5JdGVyYXRvciBnZXRBbGlhc2VzKCkKLQotcHVibGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgZ2V0QXR0cmlidXRlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgZ2V0Q2xhc3NOYW1lKCkKLQotcHVibGljIGZpbmFsIGphdmEuc2VjdXJpdHkuUHJvdmlkZXIgZ2V0UHJvdmlkZXIoKQotCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBnZXRUeXBlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IG5ld0luc3RhbmNlKAotamF2YS5sYW5nLk9iamVjdCkKLQotIHZvaWQgcHV0QXR0cmlidXRlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJvb2xlYW4gc3VwcG9ydHNQYXJhbWV0ZXIoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5zZWN1cml0eS5Qcm92aWRlckV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEuc2VjdXJpdHkuUHVibGljS2V5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuS2V5Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLnV0aWwuUmFuZG9tIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBmaW5hbCBsb25nIG11bHRpcGxpZXIKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0KLSBib29sZWFuIGhhdmVOZXh0TmV4dEdhdXNzaWFuCi0KLSBkb3VibGUgbmV4dE5leHRHYXVzc2lhbgotCi0gbG9uZyBzZWVkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotbG9uZykKLQotcHJvdGVjdGVkIGludCBuZXh0KAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBuZXh0Qm9vbGVhbigpCi0KLXB1YmxpYyB2b2lkIG5leHRCeXRlcygKLWJ5dGVbXSkKLQotcHVibGljIGRvdWJsZSBuZXh0RG91YmxlKCkKLQotcHVibGljIGZsb2F0IG5leHRGbG9hdCgpCi0KLXB1YmxpYyBkb3VibGUgbmV4dEdhdXNzaWFuKCkKLQotcHVibGljIGludCBuZXh0SW50KCkKLQotcHVibGljIGludCBuZXh0SW50KAotaW50KQotCi1wdWJsaWMgbG9uZyBuZXh0TG9uZygpCi0KLXB1YmxpYyB2b2lkIHNldFNlZWQoCi1sb25nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tIGV4dGVuZHMgamF2YS51dGlsLlJhbmRvbQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCB0cmFuc2llbnQgamF2YS5sYW5nLlN0cmluZyBTRVJWSUNFCi0KLXByaXZhdGUgc3RhdGljIHRyYW5zaWVudCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuZm9ydHJlc3MuRW5naW5lIGVuZ2luZQotCi1wcml2YXRlIHN0YXRpYyB0cmFuc2llbnQgamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20gaW50ZXJuYWxTZWN1cmVSYW5kb20KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBhbGdvcml0aG0KLQotcHJpdmF0ZSBsb25nIGNvdW50ZXIKLQotcHJpdmF0ZSBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyIHByb3ZpZGVyCi0KLXByaXZhdGUgYnl0ZVtdIHJhbmRvbUJ5dGVzCi0KLXByaXZhdGUgaW50IHJhbmRvbUJ5dGVzVXNlZAotCi1wcml2YXRlIGphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tU3BpIHNlY3VyZVJhbmRvbVNwaQotCi1wcml2YXRlIGJ5dGVbXSBzdGF0ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb21TcGkKLWphdmEuc2VjdXJpdHkuUHJvdmlkZXIpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbVNwaQotamF2YS5zZWN1cml0eS5Qcm92aWRlcgotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYnl0ZVtdKQotCi1wcml2YXRlIGphdmEuc2VjdXJpdHkuUHJvdmlkZXIkU2VydmljZSBmaW5kU2VydmljZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tIGdldEluc3RhbmNlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247TGphdmEvc2VjdXJpdHkvTm9TdWNoUHJvdmlkZXJFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20gZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEuc2VjdXJpdHkuUHJvdmlkZXIpCi0KLXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGdldFNlZWQoCi1pbnQpCi0KLXB1YmxpYyBieXRlW10gZ2VuZXJhdGVTZWVkKAotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRBbGdvcml0aG0oKQotCi1wdWJsaWMgZmluYWwgamF2YS5zZWN1cml0eS5Qcm92aWRlciBnZXRQcm92aWRlcigpCi0KLXByb3RlY3RlZCBmaW5hbCBpbnQgbmV4dCgKLWludCkKLQotcHVibGljIHZvaWQgbmV4dEJ5dGVzKAotYnl0ZVtdKQotCi1wdWJsaWMgdm9pZCBzZXRTZWVkKAotbG9uZykKLQotcHVibGljIHZvaWQgc2V0U2VlZCgKLWJ5dGVbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbVNwaSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcm90ZWN0ZWQgYWJzdHJhY3QgYnl0ZVtdIGVuZ2luZUdlbmVyYXRlU2VlZCgKLWludCkKLQotcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW5naW5lTmV4dEJ5dGVzKAotYnl0ZVtdKQotCi1wcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBlbmdpbmVTZXRTZWVkKAotYnl0ZVtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS9zZWN1cml0eS9Qcml2aWxlZ2VkQWN0aW9uPExqYXZhL2xhbmcvVm9pZDs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9TZWN1cml0eTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotZmluYWwgY2xhc3MgamF2YS5zZWN1cml0eS5TZWN1cml0eSQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IHJ1bigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuVm9pZCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuZm9ydHJlc3MuU2VjdXJpdHlBY2Nlc3MgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvc2VjdXJpdHkvUHJvdmlkZXIkU2VydmljZTspTGphdmEvdXRpbC9JdGVyYXRvcjxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLkl0ZXJhdG9yIGdldEFsaWFzZXMoCi1qYXZhLnNlY3VyaXR5LlByb3ZpZGVyJFNlcnZpY2UpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyJFNlcnZpY2UgZ2V0U2VydmljZSgKLWphdmEuc2VjdXJpdHkuUHJvdmlkZXIKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlbnVtUHJvdmlkZXJzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9TZWN1cml0eTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1TZWN1cml0eURvb3IgKQotIGNsYXNzIGphdmEuc2VjdXJpdHkuU2VjdXJpdHkkU2VjdXJpdHlEb29yIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5mb3J0cmVzcy5TZWN1cml0eUFjY2VzcwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnNlY3VyaXR5LlNlY3VyaXR5JDEpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3NlY3VyaXR5L1Byb3ZpZGVyJFNlcnZpY2U7KUxqYXZhL3V0aWwvSXRlcmF0b3I8TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHVibGljIGphdmEudXRpbC5JdGVyYXRvciBnZXRBbGlhc2VzKAotamF2YS5zZWN1cml0eS5Qcm92aWRlciRTZXJ2aWNlKQotCi1wdWJsaWMgamF2YS5zZWN1cml0eS5Qcm92aWRlciRTZXJ2aWNlIGdldFNlcnZpY2UoCi1qYXZhLnNlY3VyaXR5LlByb3ZpZGVyCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCByZW51bVByb3ZpZGVycygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MamF2YS9zZWN1cml0eS9TZWN1cml0eSRTZWN1cml0eURvb3I7ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBqYXZhLnNlY3VyaXR5LlNlY3VyaXR5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuUHJvcGVydGllcyBzZWNwcm9wcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLXN0YXRpYyBqYXZhLnV0aWwuUHJvcGVydGllcyBhY2Nlc3MkMDAwKCkKLQotc3RhdGljIHZvaWQgYWNjZXNzJDEwMCgpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQzMDAoKQotCi1wdWJsaWMgc3RhdGljIGludCBhZGRQcm92aWRlcigKLWphdmEuc2VjdXJpdHkuUHJvdmlkZXIpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRBbGdvcml0aG1Qcm9wZXJ0eSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS91dGlsL1NldDxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5TZXQgZ2V0QWxnb3JpdGhtcygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRQcm9wZXJ0eSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5zZWN1cml0eS5Qcm92aWRlciBnZXRQcm92aWRlcigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5zZWN1cml0eS5Qcm92aWRlcltdIGdldFByb3ZpZGVycygpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5zZWN1cml0eS5Qcm92aWRlcltdIGdldFByb3ZpZGVycygKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOz47KVtMamF2YS9zZWN1cml0eS9Qcm92aWRlcjsgKQotcHVibGljIHN0YXRpYyBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyW10gZ2V0UHJvdmlkZXJzKAotamF2YS51dGlsLk1hcCkKLQotcHVibGljIHN0YXRpYyBpbnQgaW5zZXJ0UHJvdmlkZXJBdCgKLWphdmEuc2VjdXJpdHkuUHJvdmlkZXIKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCByZWdpc3RlckRlZmF1bHRQcm92aWRlcnMoKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlUHJvdmlkZXIoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHN0YXRpYyB2b2lkIHJlbnVtUHJvdmlkZXJzKCkKLQotcHVibGljIHN0YXRpYyB2b2lkIHNldFByb3BlcnR5KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBqYXZhLnNlY3VyaXR5LlNlY3VyaXR5UGVybWlzc2lvbiBleHRlbmRzIGphdmEuc2VjdXJpdHkuQmFzaWNQZXJtaXNzaW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgamF2YS5zZWN1cml0eS5TaWduYXR1cmVTcGkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSBhcHBSYW5kb20KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGNsb25lKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9JbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgYWJzdHJhY3QgamF2YS5sYW5nLk9iamVjdCBlbmdpbmVHZXRQYXJhbWV0ZXIoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcm90ZWN0ZWQgamF2YS5zZWN1cml0eS5BbGdvcml0aG1QYXJhbWV0ZXJzIGVuZ2luZUdldFBhcmFtZXRlcnMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247ICkKLXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVuZ2luZUluaXRTaWduKAotamF2YS5zZWN1cml0eS5Qcml2YXRlS2V5KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIGVuZ2luZUluaXRTaWduKAotamF2YS5zZWN1cml0eS5Qcml2YXRlS2V5Ci1qYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBlbmdpbmVJbml0VmVyaWZ5KAotamF2YS5zZWN1cml0eS5QdWJsaWNLZXkpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvSW52YWxpZFBhcmFtZXRlckV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW5naW5lU2V0UGFyYW1ldGVyKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBlbmdpbmVTZXRQYXJhbWV0ZXIoCi1qYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9TaWduYXR1cmVFeGNlcHRpb247ICkKLXByb3RlY3RlZCBpbnQgZW5naW5lU2lnbigKLWJ5dGVbXQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvU2lnbmF0dXJlRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgYWJzdHJhY3QgYnl0ZVtdIGVuZ2luZVNpZ24oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L1NpZ25hdHVyZUV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW5naW5lVXBkYXRlKAotYnl0ZSkKLQotcHJvdGVjdGVkIHZvaWQgZW5naW5lVXBkYXRlKAotamF2YS5uaW8uQnl0ZUJ1ZmZlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9TaWduYXR1cmVFeGNlcHRpb247ICkKLXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVuZ2luZVVwZGF0ZSgKLWJ5dGVbXQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvU2lnbmF0dXJlRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBlbmdpbmVWZXJpZnkoCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvU2lnbmF0dXJlRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgYm9vbGVhbiBlbmdpbmVWZXJpZnkoCi1ieXRlW10KLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvU2lnbmF0dXJlJFNpZ25hdHVyZUltcGw7ICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZhLnNlY3VyaXR5LlNpZ25hdHVyZSBleHRlbmRzIGphdmEuc2VjdXJpdHkuU2lnbmF0dXJlU3BpCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0VSVklDRQotCi1wcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBTSUdOCi0KLXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFVOSU5JVElBTElaRUQKLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVkVSSUZZCi0KLXByaXZhdGUgc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5mb3J0cmVzcy5FbmdpbmUgZW5naW5lCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBhbGdvcml0aG0KLQotcHJpdmF0ZSBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyIHByb3ZpZGVyCi0KLXByb3RlY3RlZCBpbnQgc3RhdGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXN0YXRpYyBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyIGFjY2VzcyQwMDIoCi1qYXZhLnNlY3VyaXR5LlNpZ25hdHVyZQotamF2YS5zZWN1cml0eS5Qcm92aWRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgamF2YS5zZWN1cml0eS5TaWduYXR1cmUgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9Ob1N1Y2hQcm92aWRlckV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBqYXZhLnNlY3VyaXR5LlNpZ25hdHVyZSBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGphdmEuc2VjdXJpdHkuU2lnbmF0dXJlIGdldEluc3RhbmNlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5zZWN1cml0eS5Qcm92aWRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247ICkKLXByaXZhdGUgc3RhdGljIGphdmEuc2VjdXJpdHkuU2lnbmF0dXJlIGdldFNpZ25hdHVyZUluc3RhbmNlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5zZWN1cml0eS5Qcm92aWRlcikKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHN0YXRlVG9TdHJpbmcoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9DbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgY2xvbmUoKQotCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBnZXRBbGdvcml0aG0oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRQYXJhbWV0ZXJFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBqYXZhLmxhbmcuT2JqZWN0IGdldFBhcmFtZXRlcigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLnNlY3VyaXR5LkFsZ29yaXRobVBhcmFtZXRlcnMgZ2V0UGFyYW1ldGVycygpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyIGdldFByb3ZpZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgdm9pZCBpbml0U2lnbigKLWphdmEuc2VjdXJpdHkuUHJpdmF0ZUtleSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgdm9pZCBpbml0U2lnbigKLWphdmEuc2VjdXJpdHkuUHJpdmF0ZUtleQotamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIHZvaWQgaW5pdFZlcmlmeSgKLWphdmEuc2VjdXJpdHkuUHVibGljS2V5KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCB2b2lkIGluaXRWZXJpZnkoCi1qYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvSW52YWxpZFBhcmFtZXRlckV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIHZvaWQgc2V0UGFyYW1ldGVyKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgdm9pZCBzZXRQYXJhbWV0ZXIoCi1qYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9TaWduYXR1cmVFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBpbnQgc2lnbigKLWJ5dGVbXQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvU2lnbmF0dXJlRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgYnl0ZVtdIHNpZ24oKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvU2lnbmF0dXJlRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgdm9pZCB1cGRhdGUoCi1ieXRlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L1NpZ25hdHVyZUV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIHZvaWQgdXBkYXRlKAotamF2YS5uaW8uQnl0ZUJ1ZmZlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9TaWduYXR1cmVFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCB2b2lkIHVwZGF0ZSgKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9TaWduYXR1cmVFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCB2b2lkIHVwZGF0ZSgKLWJ5dGVbXQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvU2lnbmF0dXJlRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgYm9vbGVhbiB2ZXJpZnkoCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvU2lnbmF0dXJlRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgYm9vbGVhbiB2ZXJpZnkoCi1ieXRlW10KLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L1NpZ25hdHVyZTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1TaWduYXR1cmVJbXBsICkKLSBjbGFzcyBqYXZhLnNlY3VyaXR5LlNpZ25hdHVyZSRTaWduYXR1cmVJbXBsIGV4dGVuZHMgamF2YS5zZWN1cml0eS5TaWduYXR1cmUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLnNlY3VyaXR5LlNpZ25hdHVyZVNwaSBzcGlJbXBsCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5zZWN1cml0eS5TaWduYXR1cmVTcGkKLWphdmEuc2VjdXJpdHkuUHJvdmlkZXIKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9DbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgY2xvbmUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRQYXJhbWV0ZXJFeGNlcHRpb247ICkKLXByb3RlY3RlZCBqYXZhLmxhbmcuT2JqZWN0IGVuZ2luZUdldFBhcmFtZXRlcigKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgZW5naW5lSW5pdFNpZ24oCi1qYXZhLnNlY3VyaXR5LlByaXZhdGVLZXkpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgZW5naW5lSW5pdFZlcmlmeSgKLWphdmEuc2VjdXJpdHkuUHVibGljS2V5KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRQYXJhbWV0ZXJFeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIGVuZ2luZVNldFBhcmFtZXRlcigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvU2lnbmF0dXJlRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgYnl0ZVtdIGVuZ2luZVNpZ24oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L1NpZ25hdHVyZUV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgZW5naW5lVXBkYXRlKAotYnl0ZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9TaWduYXR1cmVFeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIGVuZ2luZVVwZGF0ZSgKLWJ5dGVbXQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvU2lnbmF0dXJlRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgYm9vbGVhbiBlbmdpbmVWZXJpZnkoCi1ieXRlW10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5zZWN1cml0eS5TaWduYXR1cmVFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLnNlY3VyaXR5LkdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIGphdmEuc2VjdXJpdHkuU2lnbmVkT2JqZWN0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotCi1wcml2YXRlIGJ5dGVbXSBjb250ZW50Ci0KLXByaXZhdGUgYnl0ZVtdIHNpZ25hdHVyZQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgdGhlYWxnb3JpdGhtCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L1NpZ25hdHVyZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5TZXJpYWxpemFibGUKLWphdmEuc2VjdXJpdHkuUHJpdmF0ZUtleQotamF2YS5zZWN1cml0eS5TaWduYXR1cmUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgcmVhZE9iamVjdCgKLWphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0pCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEFsZ29yaXRobSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRPYmplY3QoKQotCi1wdWJsaWMgYnl0ZVtdIGdldFNpZ25hdHVyZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9TaWduYXR1cmVFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIHZlcmlmeSgKLWphdmEuc2VjdXJpdHkuUHVibGljS2V5Ci1qYXZhLnNlY3VyaXR5LlNpZ25hdHVyZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvc2VjdXJpdHkvUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjxMamF2YS9sYW5nL1ZvaWQ7PjsgKQotIGNsYXNzIGphdmEuc2VjdXJpdHkuU2lnbmVyJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGphdmEuc2VjdXJpdHkuU2lnbmVyIHRoaXMkMAotCi1maW5hbCBqYXZhLnNlY3VyaXR5LlB1YmxpY0tleSB2YWwkcGsKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnNlY3VyaXR5LlNpZ25lcgotamF2YS5zZWN1cml0eS5QdWJsaWNLZXkpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IHJ1bigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvS2V5TWFuYWdlbWVudEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5Wb2lkIHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgamF2YS5zZWN1cml0eS5TaWduZXIgZXh0ZW5kcyBqYXZhLnNlY3VyaXR5LklkZW50aXR5Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotCi1wcml2YXRlIGphdmEuc2VjdXJpdHkuUHJpdmF0ZUtleSBwcml2YXRlS2V5Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9LZXlNYW5hZ2VtZW50RXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnNlY3VyaXR5LklkZW50aXR5U2NvcGUpCi0KLXB1YmxpYyBqYXZhLnNlY3VyaXR5LlByaXZhdGVLZXkgZ2V0UHJpdmF0ZUtleSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvSW52YWxpZFBhcmFtZXRlckV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9LZXlFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCB2b2lkIHNldEtleVBhaXIoCi1qYXZhLnNlY3VyaXR5LktleVBhaXIpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBqYXZhLnNlY3VyaXR5LlRpbWVzdGFtcCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSB0cmFuc2llbnQgaW50IGhhc2gKLQotcHJpdmF0ZSBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGggc2lnbmVyQ2VydFBhdGgKLQotcHJpdmF0ZSBqYXZhLnV0aWwuRGF0ZSB0aW1lc3RhbXAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuRGF0ZQotamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoIGdldFNpZ25lckNlcnRQYXRoKCkKLQotcHVibGljIGphdmEudXRpbC5EYXRlIGdldFRpbWVzdGFtcCgpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5zZWN1cml0eS5VbnJlY292ZXJhYmxlRW50cnlFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLnNlY3VyaXR5LkdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEuc2VjdXJpdHkuVW5yZWNvdmVyYWJsZUtleUV4Y2VwdGlvbiBleHRlbmRzIGphdmEuc2VjdXJpdHkuR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgamF2YS5zZWN1cml0eS5VbnJlc29sdmVkUGVybWlzc2lvbiBleHRlbmRzIGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbiBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEuaW8uT2JqZWN0U3RyZWFtRmllbGRbXSBzZXJpYWxQZXJzaXN0ZW50RmllbGRzCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotCi1wcml2YXRlIHRyYW5zaWVudCBpbnQgaGFzaAotCi1wcml2YXRlIHRyYW5zaWVudCBqYXZhLmxhbmcuU3RyaW5nIHRhcmdldEFjdGlvbnMKLQotcHJpdmF0ZSB0cmFuc2llbnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlW10gdGFyZ2V0Q2VydHMKLQotcHJpdmF0ZSB0cmFuc2llbnQgamF2YS5sYW5nLlN0cmluZyB0YXJnZXROYW1lCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVbXSkKLQotcHJpdmF0ZSBmaW5hbCB2b2lkIGNoZWNrVHlwZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgcmVhZE9iamVjdCgKLWphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCB3cml0ZU9iamVjdCgKLWphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRBY3Rpb25zKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VW5yZXNvbHZlZEFjdGlvbnMoKQotCi1wdWJsaWMgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlW10gZ2V0VW5yZXNvbHZlZENlcnRzKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VW5yZXNvbHZlZE5hbWUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRVbnJlc29sdmVkVHlwZSgpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1wdWJsaWMgYm9vbGVhbiBpbXBsaWVzKAotamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uKQotCi1wdWJsaWMgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uQ29sbGVjdGlvbiBuZXdQZXJtaXNzaW9uQ29sbGVjdGlvbigpCi0KLSBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb24gcmVzb2x2ZSgKLWphdmEubGFuZy5DbGFzcykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotZmluYWwgY2xhc3MgamF2YS5zZWN1cml0eS5VbnJlc29sdmVkUGVybWlzc2lvbkNvbGxlY3Rpb24gZXh0ZW5kcyBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb25Db2xsZWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEuaW8uT2JqZWN0U3RyZWFtRmllbGRbXSBzZXJpYWxQZXJzaXN0ZW50RmllbGRzCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotCi1wcml2YXRlIHRyYW5zaWVudCBqYXZhLnV0aWwuTWFwIGtsYXNzZXMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLSB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgcmVhZE9iamVjdCgKLWphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCB3cml0ZU9iamVjdCgKLWphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtKQotCi1wdWJsaWMgdm9pZCBhZGQoCi1qYXZhLnNlY3VyaXR5LlBlcm1pc3Npb24pCi0KLXB1YmxpYyBqYXZhLnV0aWwuRW51bWVyYXRpb24gZWxlbWVudHMoKQotCi0gYm9vbGVhbiBoYXNVbnJlc29sdmVkKAotamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uKQotCi1wdWJsaWMgYm9vbGVhbiBpbXBsaWVzKAotamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uKQotCi0gamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uQ29sbGVjdGlvbiByZXNvbHZlQ29sbGVjdGlvbigKLWphdmEuc2VjdXJpdHkuUGVybWlzc2lvbgotamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uQ29sbGVjdGlvbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgamF2YS5zZWN1cml0eS5hY2wuT3duZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9hY2wvTm90T3duZXJFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGFkZE93bmVyKAotamF2YS5zZWN1cml0eS5QcmluY2lwYWwKLWphdmEuc2VjdXJpdHkuUHJpbmNpcGFsKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L2FjbC9Ob3RPd25lckV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9hY2wvTGFzdE93bmVyRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBkZWxldGVPd25lcigKLWphdmEuc2VjdXJpdHkuUHJpbmNpcGFsCi1qYXZhLnNlY3VyaXR5LlByaW5jaXBhbCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNPd25lcigKLWphdmEuc2VjdXJpdHkuUHJpbmNpcGFsKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZhLnNlY3VyaXR5LmFjbC5BY2wgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5hY2wuT3duZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L2FjbC9Ob3RPd25lckV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gYWRkRW50cnkoCi1qYXZhLnNlY3VyaXR5LlByaW5jaXBhbAotamF2YS5zZWN1cml0eS5hY2wuQWNsRW50cnkpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGNoZWNrUGVybWlzc2lvbigKLWphdmEuc2VjdXJpdHkuUHJpbmNpcGFsCi1qYXZhLnNlY3VyaXR5LmFjbC5QZXJtaXNzaW9uKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9FbnVtZXJhdGlvbjxMamF2YS9zZWN1cml0eS9hY2wvQWNsRW50cnk7PjsgKQotcHVibGljIGFic3RyYWN0IGphdmEudXRpbC5FbnVtZXJhdGlvbiBlbnRyaWVzKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0TmFtZSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3NlY3VyaXR5L1ByaW5jaXBhbDspTGphdmEvdXRpbC9FbnVtZXJhdGlvbjxMamF2YS9zZWN1cml0eS9hY2wvUGVybWlzc2lvbjs+OyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLkVudW1lcmF0aW9uIGdldFBlcm1pc3Npb25zKAotamF2YS5zZWN1cml0eS5QcmluY2lwYWwpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvYWNsL05vdE93bmVyRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiByZW1vdmVFbnRyeSgKLWphdmEuc2VjdXJpdHkuUHJpbmNpcGFsCi1qYXZhLnNlY3VyaXR5LmFjbC5BY2xFbnRyeSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9hY2wvTm90T3duZXJFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldE5hbWUoCi1qYXZhLnNlY3VyaXR5LlByaW5jaXBhbAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZhLnNlY3VyaXR5LmFjbC5BY2xFbnRyeSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmxhbmcuQ2xvbmVhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gYWRkUGVybWlzc2lvbigKLWphdmEuc2VjdXJpdHkuYWNsLlBlcm1pc3Npb24pCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGNoZWNrUGVybWlzc2lvbigKLWphdmEuc2VjdXJpdHkuYWNsLlBlcm1pc3Npb24pCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuT2JqZWN0IGNsb25lKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsIGdldFByaW5jaXBhbCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzTmVnYXRpdmUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9FbnVtZXJhdGlvbjxMamF2YS9zZWN1cml0eS9hY2wvUGVybWlzc2lvbjs+OyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLkVudW1lcmF0aW9uIHBlcm1pc3Npb25zKCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gcmVtb3ZlUGVybWlzc2lvbigKLWphdmEuc2VjdXJpdHkuYWNsLlBlcm1pc3Npb24pCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldE5lZ2F0aXZlUGVybWlzc2lvbnMoKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzZXRQcmluY2lwYWwoCi1qYXZhLnNlY3VyaXR5LlByaW5jaXBhbCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEuc2VjdXJpdHkuYWNsLkFjbE5vdEZvdW5kRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLkV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZhLnNlY3VyaXR5LmFjbC5Hcm91cCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGFkZE1lbWJlcigKLWphdmEuc2VjdXJpdHkuUHJpbmNpcGFsKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc01lbWJlcigKLWphdmEuc2VjdXJpdHkuUHJpbmNpcGFsKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9FbnVtZXJhdGlvbjwrTGphdmEvc2VjdXJpdHkvUHJpbmNpcGFsOz47ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnV0aWwuRW51bWVyYXRpb24gbWVtYmVycygpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHJlbW92ZU1lbWJlcigKLWphdmEuc2VjdXJpdHkuUHJpbmNpcGFsKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEuc2VjdXJpdHkuYWNsLkxhc3RPd25lckV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5FeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLnNlY3VyaXR5LmFjbC5Ob3RPd25lckV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5FeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgamF2YS5zZWN1cml0eS5hY2wuUGVybWlzc2lvbiBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgamF2YS5zZWN1cml0eS5jZXJ0LkNSTCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIHR5cGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBnZXRUeXBlKCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNSZXZva2VkKAotamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5zZWN1cml0eS5jZXJ0LkNSTEV4Y2VwdGlvbiBleHRlbmRzIGphdmEuc2VjdXJpdHkuR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEuc2VjdXJpdHkuY2VydC5DUkxTZWxlY3RvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmxhbmcuQ2xvbmVhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5PYmplY3QgY2xvbmUoKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBtYXRjaCgKLWphdmEuc2VjdXJpdHkuY2VydC5DUkwpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvY2VydC9DZXJ0UGF0aDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMiBuYW1lID1DZXJ0UGF0aFJlcCApCi1wdWJsaWMgY2xhc3MgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoJENlcnRQYXRoUmVwIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEuaW8uT2JqZWN0U3RyZWFtRmllbGRbXSBzZXJpYWxQZXJzaXN0ZW50RmllbGRzCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotCi1wcml2YXRlIGZpbmFsIGJ5dGVbXSBkYXRhCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyB0eXBlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vT2JqZWN0U3RyZWFtRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgamF2YS5sYW5nLk9iamVjdCByZWFkUmVzb2x2ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRQYXRoJENlcnRQYXRoUmVwOyApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgdHlwZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0xpc3Q8K0xqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGU7PjsgKQotcHVibGljIGFic3RyYWN0IGphdmEudXRpbC5MaXN0IGdldENlcnRpZmljYXRlcygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYnl0ZVtdIGdldEVuY29kZWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJ5dGVbXSBnZXRFbmNvZGVkKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvSXRlcmF0b3I8TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHVibGljIGFic3RyYWN0IGphdmEudXRpbC5JdGVyYXRvciBnZXRFbmNvZGluZ3MoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRUeXBlKCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9PYmplY3RTdHJlYW1FeGNlcHRpb247ICkKLXByb3RlY3RlZCBqYXZhLmxhbmcuT2JqZWN0IHdyaXRlUmVwbGFjZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3NlY3VyaXR5L1ByaXZpbGVnZWRBY3Rpb248TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotZmluYWwgY2xhc3MgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoQnVpbGRlciQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IHJ1bigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoQnVpbGRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERUZBVUxUUFJPUEVSVFkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQUk9QRVJUWU5BTUUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTRVJWSUNFCi0KLXByaXZhdGUgc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5mb3J0cmVzcy5FbmdpbmUgZW5naW5lCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBhbGdvcml0aG0KLQotcHJpdmF0ZSBmaW5hbCBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyIHByb3ZpZGVyCi0KLXByaXZhdGUgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoQnVpbGRlclNwaSBzcGlJbXBsCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oCi1qYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGhCdWlsZGVyU3BpCi1qYXZhLnNlY3VyaXR5LlByb3ZpZGVyCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgZ2V0RGVmYXVsdFR5cGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGhCdWlsZGVyIGdldEluc3RhbmNlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247TGphdmEvc2VjdXJpdHkvTm9TdWNoUHJvdmlkZXJFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoQnVpbGRlciBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0UGF0aEJ1aWxkZXIgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnNlY3VyaXR5LlByb3ZpZGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydFBhdGhCdWlsZGVyRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L0ludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGhCdWlsZGVyUmVzdWx0IGJ1aWxkKAotamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoUGFyYW1ldGVycykKLQotcHVibGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgZ2V0QWxnb3JpdGhtKCkKLQotcHVibGljIGZpbmFsIGphdmEuc2VjdXJpdHkuUHJvdmlkZXIgZ2V0UHJvdmlkZXIoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0UGF0aEJ1aWxkZXJFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLnNlY3VyaXR5LkdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGhCdWlsZGVyUmVzdWx0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5DbG9uZWFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLk9iamVjdCBjbG9uZSgpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGggZ2V0Q2VydFBhdGgoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0UGF0aEJ1aWxkZXJTcGkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRQYXRoQnVpbGRlckV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoQnVpbGRlclJlc3VsdCBlbmdpbmVCdWlsZCgKLWphdmEuc2VjdXJpdHkuY2VydC5DZXJ0UGF0aFBhcmFtZXRlcnMpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0UGF0aFBhcmFtZXRlcnMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5sYW5nLkNsb25lYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuT2JqZWN0IGNsb25lKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvc2VjdXJpdHkvUHJpdmlsZWdlZEFjdGlvbjxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1maW5hbCBjbGFzcyBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGhWYWxpZGF0b3IkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBydW4oKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0UGF0aFZhbGlkYXRvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERUZBVUxUUFJPUEVSVFkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQUk9QRVJUWU5BTUUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTRVJWSUNFCi0KLXByaXZhdGUgc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5mb3J0cmVzcy5FbmdpbmUgZW5naW5lCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBhbGdvcml0aG0KLQotcHJpdmF0ZSBmaW5hbCBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyIHByb3ZpZGVyCi0KLXByaXZhdGUgZmluYWwgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoVmFsaWRhdG9yU3BpIHNwaUltcGwKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLWphdmEuc2VjdXJpdHkuY2VydC5DZXJ0UGF0aFZhbGlkYXRvclNwaQotamF2YS5zZWN1cml0eS5Qcm92aWRlcgotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGdldERlZmF1bHRUeXBlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoVmFsaWRhdG9yIGdldEluc3RhbmNlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247TGphdmEvc2VjdXJpdHkvTm9TdWNoUHJvdmlkZXJFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoVmFsaWRhdG9yIGdldEluc3RhbmNlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoVmFsaWRhdG9yIGdldEluc3RhbmNlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5zZWN1cml0eS5Qcm92aWRlcikKLQotcHVibGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgZ2V0QWxnb3JpdGhtKCkKLQotcHVibGljIGZpbmFsIGphdmEuc2VjdXJpdHkuUHJvdmlkZXIgZ2V0UHJvdmlkZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0UGF0aFZhbGlkYXRvclJlc3VsdCB2YWxpZGF0ZSgKLWphdmEuc2VjdXJpdHkuY2VydC5DZXJ0UGF0aAotamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoUGFyYW1ldGVycykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLnNlY3VyaXR5LkdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGggY2VydFBhdGgKLQotcHJpdmF0ZSBpbnQgaW5kZXgKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuVGhyb3dhYmxlCi1qYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGgKLWludCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlRocm93YWJsZSkKLQotcHVibGljIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0UGF0aCBnZXRDZXJ0UGF0aCgpCi0KLXB1YmxpYyBpbnQgZ2V0SW5kZXgoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGhWYWxpZGF0b3JSZXN1bHQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5sYW5nLkNsb25lYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuT2JqZWN0IGNsb25lKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGhWYWxpZGF0b3JTcGkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L0ludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGhWYWxpZGF0b3JSZXN1bHQgZW5naW5lVmFsaWRhdGUoCi1qYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGgKLWphdmEuc2VjdXJpdHkuY2VydC5DZXJ0UGF0aFBhcmFtZXRlcnMpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0U2VsZWN0b3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5sYW5nLkNsb25lYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuT2JqZWN0IGNsb25lKCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gbWF0Y2goCi1qYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3NlY3VyaXR5L1ByaXZpbGVnZWRBY3Rpb248TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotZmluYWwgY2xhc3MgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRTdG9yZSQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IHJ1bigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRTdG9yZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERUZBVUxUUFJPUEVSVFkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQUk9QRVJUWU5BTUUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTRVJWSUNFCi0KLXByaXZhdGUgc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5mb3J0cmVzcy5FbmdpbmUgZW5naW5lCi0KLXByaXZhdGUgZmluYWwgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRTdG9yZVBhcmFtZXRlcnMgY2VydFN0b3JlUGFyYW1zCi0KLXByaXZhdGUgZmluYWwgamF2YS5zZWN1cml0eS5Qcm92aWRlciBwcm92aWRlcgotCi1wcml2YXRlIGZpbmFsIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0U3RvcmVTcGkgc3BpSW1wbAotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgdHlwZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRTdG9yZVNwaQotamF2YS5zZWN1cml0eS5Qcm92aWRlcgotamF2YS5sYW5nLlN0cmluZwotamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRTdG9yZVBhcmFtZXRlcnMpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBnZXREZWZhdWx0VHlwZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRTdG9yZSBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEuc2VjdXJpdHkuY2VydC5DZXJ0U3RvcmVQYXJhbWV0ZXJzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L05vU3VjaFByb3ZpZGVyRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0U3RvcmUgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFN0b3JlUGFyYW1ldGVycwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247TGphdmEvc2VjdXJpdHkvSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFN0b3JlIGdldEluc3RhbmNlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRTdG9yZVBhcmFtZXRlcnMKLWphdmEuc2VjdXJpdHkuUHJvdmlkZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvY2VydC9DZXJ0U3RvcmVFeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvc2VjdXJpdHkvY2VydC9DUkxTZWxlY3RvcjspTGphdmEvdXRpbC9Db2xsZWN0aW9uPCtMamF2YS9zZWN1cml0eS9jZXJ0L0NSTDs+OyApCi1wdWJsaWMgZmluYWwgamF2YS51dGlsLkNvbGxlY3Rpb24gZ2V0Q1JMcygKLWphdmEuc2VjdXJpdHkuY2VydC5DUkxTZWxlY3RvcikKLQotcHVibGljIGZpbmFsIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0U3RvcmVQYXJhbWV0ZXJzIGdldENlcnRTdG9yZVBhcmFtZXRlcnMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRTZWxlY3RvcjspTGphdmEvdXRpbC9Db2xsZWN0aW9uPCtMamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRTdG9yZUV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIGphdmEudXRpbC5Db2xsZWN0aW9uIGdldENlcnRpZmljYXRlcygKLWphdmEuc2VjdXJpdHkuY2VydC5DZXJ0U2VsZWN0b3IpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyIGdldFByb3ZpZGVyKCkKLQotcHVibGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgZ2V0VHlwZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRTdG9yZUV4Y2VwdGlvbiBleHRlbmRzIGphdmEuc2VjdXJpdHkuR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0U3RvcmVQYXJhbWV0ZXJzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5DbG9uZWFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLk9iamVjdCBjbG9uZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRTdG9yZVNwaSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuc2VjdXJpdHkuY2VydC5DZXJ0U3RvcmVQYXJhbWV0ZXJzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydFN0b3JlRXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3NlY3VyaXR5L2NlcnQvQ1JMU2VsZWN0b3I7KUxqYXZhL3V0aWwvQ29sbGVjdGlvbjwrTGphdmEvc2VjdXJpdHkvY2VydC9DUkw7PjsgKQotcHVibGljIGFic3RyYWN0IGphdmEudXRpbC5Db2xsZWN0aW9uIGVuZ2luZUdldENSTHMoCi1qYXZhLnNlY3VyaXR5LmNlcnQuQ1JMU2VsZWN0b3IpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydFNlbGVjdG9yOylMamF2YS91dGlsL0NvbGxlY3Rpb248K0xqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGU7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydFN0b3JlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLkNvbGxlY3Rpb24gZW5naW5lR2V0Q2VydGlmaWNhdGVzKAotamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRTZWxlY3RvcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEyIG5hbWUgPUNlcnRpZmljYXRlUmVwICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGU7ICkKLXB1YmxpYyBjbGFzcyBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGUkQ2VydGlmaWNhdGVSZXAgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5pby5PYmplY3RTdHJlYW1GaWVsZFtdIHNlcmlhbFBlcnNpc3RlbnRGaWVsZHMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0KLXByaXZhdGUgZmluYWwgYnl0ZVtdIGRhdGEKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIHR5cGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9PYmplY3RTdHJlYW1FeGNlcHRpb247ICkKLXByb3RlY3RlZCBqYXZhLmxhbmcuT2JqZWN0IHJlYWRSZXNvbHZlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGUkQ2VydGlmaWNhdGVSZXA7ICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyB0eXBlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBieXRlW10gZ2V0RW5jb2RlZCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnNlY3VyaXR5LlB1YmxpY0tleSBnZXRQdWJsaWNLZXkoKQotCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBnZXRUeXBlKCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L05vU3VjaFByb3ZpZGVyRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L1NpZ25hdHVyZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgdmVyaWZ5KAotamF2YS5zZWN1cml0eS5QdWJsaWNLZXkpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9Ob1N1Y2hQcm92aWRlckV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9TaWduYXR1cmVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHZlcmlmeSgKLWphdmEuc2VjdXJpdHkuUHVibGljS2V5Ci1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL09iamVjdFN0cmVhbUV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGphdmEubGFuZy5PYmplY3Qgd3JpdGVSZXBsYWNlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLnNlY3VyaXR5LkdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRXhwaXJlZEV4Y2VwdGlvbiBleHRlbmRzIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUZhY3RvcnkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0VSVklDRQotCi1wcml2YXRlIHN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuZm9ydHJlc3MuRW5naW5lIGVuZ2luZQotCi1wcml2YXRlIGZpbmFsIGphdmEuc2VjdXJpdHkuUHJvdmlkZXIgcHJvdmlkZXIKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVGYWN0b3J5U3BpIHNwaUltcGwKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIHR5cGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLWphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUZhY3RvcnlTcGkKLWphdmEuc2VjdXJpdHkuUHJvdmlkZXIKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVGYWN0b3J5IGdldEluc3RhbmNlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L05vU3VjaFByb3ZpZGVyRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUZhY3RvcnkgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRmFjdG9yeSBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEuc2VjdXJpdHkuUHJvdmlkZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvY2VydC9DUkxFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBqYXZhLnNlY3VyaXR5LmNlcnQuQ1JMIGdlbmVyYXRlQ1JMKAotamF2YS5pby5JbnB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvaW8vSW5wdXRTdHJlYW07KUxqYXZhL3V0aWwvQ29sbGVjdGlvbjwrTGphdmEvc2VjdXJpdHkvY2VydC9DUkw7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L2NlcnQvQ1JMRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgamF2YS51dGlsLkNvbGxlY3Rpb24gZ2VuZXJhdGVDUkxzKAotamF2YS5pby5JbnB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoIGdlbmVyYXRlQ2VydFBhdGgoCi1qYXZhLmlvLklucHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGggZ2VuZXJhdGVDZXJ0UGF0aCgKLWphdmEuaW8uSW5wdXRTdHJlYW0KLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTGlzdDwrTGphdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZTs+OylMamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRQYXRoOyApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0UGF0aCBnZW5lcmF0ZUNlcnRQYXRoKAotamF2YS51dGlsLkxpc3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZSBnZW5lcmF0ZUNlcnRpZmljYXRlKAotamF2YS5pby5JbnB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2lvL0lucHV0U3RyZWFtOylMamF2YS91dGlsL0NvbGxlY3Rpb248K0xqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGU7PjsgKQotcHVibGljIGZpbmFsIGphdmEudXRpbC5Db2xsZWN0aW9uIGdlbmVyYXRlQ2VydGlmaWNhdGVzKAotamF2YS5pby5JbnB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvSXRlcmF0b3I8TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHVibGljIGZpbmFsIGphdmEudXRpbC5JdGVyYXRvciBnZXRDZXJ0UGF0aEVuY29kaW5ncygpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyIGdldFByb3ZpZGVyKCkKLQotcHVibGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgZ2V0VHlwZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRmFjdG9yeVNwaSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L2NlcnQvQ1JMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zZWN1cml0eS5jZXJ0LkNSTCBlbmdpbmVHZW5lcmF0ZUNSTCgKLWphdmEuaW8uSW5wdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvY2VydC9DUkxFeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvaW8vSW5wdXRTdHJlYW07KUxqYXZhL3V0aWwvQ29sbGVjdGlvbjwrTGphdmEvc2VjdXJpdHkvY2VydC9DUkw7PjsgKQotcHVibGljIGFic3RyYWN0IGphdmEudXRpbC5Db2xsZWN0aW9uIGVuZ2luZUdlbmVyYXRlQ1JMcygKLWphdmEuaW8uSW5wdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0UGF0aCBlbmdpbmVHZW5lcmF0ZUNlcnRQYXRoKAotamF2YS5pby5JbnB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoIGVuZ2luZUdlbmVyYXRlQ2VydFBhdGgoCi1qYXZhLmlvLklucHV0U3RyZWFtCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0xpc3Q8K0xqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGU7PjspTGphdmEvc2VjdXJpdHkvY2VydC9DZXJ0UGF0aDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGggZW5naW5lR2VuZXJhdGVDZXJ0UGF0aCgKLWphdmEudXRpbC5MaXN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGUgZW5naW5lR2VuZXJhdGVDZXJ0aWZpY2F0ZSgKLWphdmEuaW8uSW5wdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUV4Y2VwdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9pby9JbnB1dFN0cmVhbTspTGphdmEvdXRpbC9Db2xsZWN0aW9uPCtMamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlOz47ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnV0aWwuQ29sbGVjdGlvbiBlbmdpbmVHZW5lcmF0ZUNlcnRpZmljYXRlcygKLWphdmEuaW8uSW5wdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0l0ZXJhdG9yPExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuSXRlcmF0b3IgZW5naW5lR2V0Q2VydFBhdGhFbmNvZGluZ3MoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZU5vdFlldFZhbGlkRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbiBleHRlbmRzIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEuc2VjdXJpdHkuY2VydC5Db2xsZWN0aW9uQ2VydFN0b3JlUGFyYW1ldGVycyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFN0b3JlUGFyYW1ldGVycwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQ29sbGVjdGlvbjwqPjsgKQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS51dGlsLkNvbGxlY3Rpb24gZGVmYXVsdENvbGxlY3Rpb24KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0NvbGxlY3Rpb248Kj47ICkKLXByaXZhdGUgZmluYWwgamF2YS51dGlsLkNvbGxlY3Rpb24gY29sbGVjdGlvbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9Db2xsZWN0aW9uPCo+OylWICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEudXRpbC5Db2xsZWN0aW9uKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBjbG9uZSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0NvbGxlY3Rpb248Kj47ICkKLXB1YmxpYyBqYXZhLnV0aWwuQ29sbGVjdGlvbiBnZXRDb2xsZWN0aW9uKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEuc2VjdXJpdHkuY2VydC5MREFQQ2VydFN0b3JlUGFyYW1ldGVycyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFN0b3JlUGFyYW1ldGVycwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9MREFQX1BPUlQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERUZBVUxUX0xEQVBfU0VSVkVSX05BTUUKLQotcHJpdmF0ZSBmaW5hbCBpbnQgcG9ydAotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgc2VydmVyTmFtZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgY2xvbmUoKQotCi1wdWJsaWMgaW50IGdldFBvcnQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTZXJ2ZXJOYW1lKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEuc2VjdXJpdHkuY2VydC5QS0lYUGFyYW1ldGVycyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGhQYXJhbWV0ZXJzCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYm9vbGVhbiBhbnlQb2xpY3lJbmhpYml0ZWQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0xpc3Q8TGphdmEvc2VjdXJpdHkvY2VydC9QS0lYQ2VydFBhdGhDaGVja2VyOz47ICkKLXByaXZhdGUgamF2YS51dGlsLkxpc3QgY2VydFBhdGhDaGVja2VycwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvTGlzdDxMamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRTdG9yZTs+OyApCi1wcml2YXRlIGphdmEudXRpbC5MaXN0IGNlcnRTdG9yZXMKLQotcHJpdmF0ZSBqYXZhLnV0aWwuRGF0ZSBkYXRlCi0KLXByaXZhdGUgYm9vbGVhbiBleHBsaWNpdFBvbGljeVJlcXVpcmVkCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9TZXQ8TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuU2V0IGluaXRpYWxQb2xpY2llcwotCi1wcml2YXRlIGJvb2xlYW4gcG9saWN5TWFwcGluZ0luaGliaXRlZAotCi1wcml2YXRlIGJvb2xlYW4gcG9saWN5UXVhbGlmaWVyc1JlamVjdGVkCi0KLXByaXZhdGUgYm9vbGVhbiByZXZvY2F0aW9uRW5hYmxlZAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgc2lnUHJvdmlkZXIKLQotcHJpdmF0ZSBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFNlbGVjdG9yIHRhcmdldENlcnRDb25zdHJhaW50cwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvU2V0PExqYXZhL3NlY3VyaXR5L2NlcnQvVHJ1c3RBbmNob3I7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuU2V0IHRydXN0QW5jaG9ycwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvS2V5U3RvcmVFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5zZWN1cml0eS5LZXlTdG9yZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvU2V0PExqYXZhL3NlY3VyaXR5L2NlcnQvVHJ1c3RBbmNob3I7PjspViApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuU2V0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCBjaGVja1RydXN0QW5jaG9ycygKLWphdmEudXRpbC5TZXQpCi0KLXB1YmxpYyB2b2lkIGFkZENlcnRQYXRoQ2hlY2tlcigKLWphdmEuc2VjdXJpdHkuY2VydC5QS0lYQ2VydFBhdGhDaGVja2VyKQotCi1wdWJsaWMgdm9pZCBhZGRDZXJ0U3RvcmUoCi1qYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFN0b3JlKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBjbG9uZSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0xpc3Q8TGphdmEvc2VjdXJpdHkvY2VydC9QS0lYQ2VydFBhdGhDaGVja2VyOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRDZXJ0UGF0aENoZWNrZXJzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvTGlzdDxMamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRTdG9yZTs+OyApCi1wdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0Q2VydFN0b3JlcygpCi0KLXB1YmxpYyBqYXZhLnV0aWwuRGF0ZSBnZXREYXRlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvU2V0PExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuU2V0IGdldEluaXRpYWxQb2xpY2llcygpCi0KLXB1YmxpYyBib29sZWFuIGdldFBvbGljeVF1YWxpZmllcnNSZWplY3RlZCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFNpZ1Byb3ZpZGVyKCkKLQotcHVibGljIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0U2VsZWN0b3IgZ2V0VGFyZ2V0Q2VydENvbnN0cmFpbnRzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvU2V0PExqYXZhL3NlY3VyaXR5L2NlcnQvVHJ1c3RBbmNob3I7PjsgKQotcHVibGljIGphdmEudXRpbC5TZXQgZ2V0VHJ1c3RBbmNob3JzKCkKLQotcHVibGljIGJvb2xlYW4gaXNBbnlQb2xpY3lJbmhpYml0ZWQoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0V4cGxpY2l0UG9saWN5UmVxdWlyZWQoKQotCi1wdWJsaWMgYm9vbGVhbiBpc1BvbGljeU1hcHBpbmdJbmhpYml0ZWQoKQotCi1wdWJsaWMgYm9vbGVhbiBpc1Jldm9jYXRpb25FbmFibGVkKCkKLQotcHVibGljIHZvaWQgc2V0QW55UG9saWN5SW5oaWJpdGVkKAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9MaXN0PExqYXZhL3NlY3VyaXR5L2NlcnQvUEtJWENlcnRQYXRoQ2hlY2tlcjs+OylWICkKLXB1YmxpYyB2b2lkIHNldENlcnRQYXRoQ2hlY2tlcnMoCi1qYXZhLnV0aWwuTGlzdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9MaXN0PExqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydFN0b3JlOz47KVYgKQotcHVibGljIHZvaWQgc2V0Q2VydFN0b3JlcygKLWphdmEudXRpbC5MaXN0KQotCi1wdWJsaWMgdm9pZCBzZXREYXRlKAotamF2YS51dGlsLkRhdGUpCi0KLXB1YmxpYyB2b2lkIHNldEV4cGxpY2l0UG9saWN5UmVxdWlyZWQoCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL1NldDxMamF2YS9sYW5nL1N0cmluZzs+OylWICkKLXB1YmxpYyB2b2lkIHNldEluaXRpYWxQb2xpY2llcygKLWphdmEudXRpbC5TZXQpCi0KLXB1YmxpYyB2b2lkIHNldFBvbGljeU1hcHBpbmdJbmhpYml0ZWQoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRQb2xpY3lRdWFsaWZpZXJzUmVqZWN0ZWQoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRSZXZvY2F0aW9uRW5hYmxlZCgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldFNpZ1Byb3ZpZGVyKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0VGFyZ2V0Q2VydENvbnN0cmFpbnRzKAotamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRTZWxlY3RvcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9TZXQ8TGphdmEvc2VjdXJpdHkvY2VydC9UcnVzdEFuY2hvcjs+OylWICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRUcnVzdEFuY2hvcnMoCi1qYXZhLnV0aWwuU2V0KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5zZWN1cml0eS5jZXJ0LlBLSVhCdWlsZGVyUGFyYW1ldGVycyBleHRlbmRzIGphdmEuc2VjdXJpdHkuY2VydC5QS0lYUGFyYW1ldGVycwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGludCBtYXhQYXRoTGVuZ3RoCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9LZXlTdG9yZUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnNlY3VyaXR5LktleVN0b3JlCi1qYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFNlbGVjdG9yKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9TZXQ8TGphdmEvc2VjdXJpdHkvY2VydC9UcnVzdEFuY2hvcjs+O0xqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydFNlbGVjdG9yOylWICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEudXRpbC5TZXQKLWphdmEuc2VjdXJpdHkuY2VydC5DZXJ0U2VsZWN0b3IpCi0KLXB1YmxpYyBpbnQgZ2V0TWF4UGF0aExlbmd0aCgpCi0KLXB1YmxpYyB2b2lkIHNldE1heFBhdGhMZW5ndGgoCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLnNlY3VyaXR5LmNlcnQuUEtJWENlcnRQYXRoVmFsaWRhdG9yUmVzdWx0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0UGF0aFZhbGlkYXRvclJlc3VsdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGphdmEuc2VjdXJpdHkuY2VydC5Qb2xpY3lOb2RlIHBvbGljeVRyZWUKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLnNlY3VyaXR5LlB1YmxpY0tleSBzdWJqZWN0UHVibGljS2V5Ci0KLXByaXZhdGUgZmluYWwgamF2YS5zZWN1cml0eS5jZXJ0LlRydXN0QW5jaG9yIHRydXN0QW5jaG9yCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5zZWN1cml0eS5jZXJ0LlRydXN0QW5jaG9yCi1qYXZhLnNlY3VyaXR5LmNlcnQuUG9saWN5Tm9kZQotamF2YS5zZWN1cml0eS5QdWJsaWNLZXkpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGNsb25lKCkKLQotcHVibGljIGphdmEuc2VjdXJpdHkuY2VydC5Qb2xpY3lOb2RlIGdldFBvbGljeVRyZWUoKQotCi1wdWJsaWMgamF2YS5zZWN1cml0eS5QdWJsaWNLZXkgZ2V0UHVibGljS2V5KCkKLQotcHVibGljIGphdmEuc2VjdXJpdHkuY2VydC5UcnVzdEFuY2hvciBnZXRUcnVzdEFuY2hvcigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLnNlY3VyaXR5LmNlcnQuUEtJWENlcnRQYXRoQnVpbGRlclJlc3VsdCBleHRlbmRzIGphdmEuc2VjdXJpdHkuY2VydC5QS0lYQ2VydFBhdGhWYWxpZGF0b3JSZXN1bHQgaW1wbGVtZW50cyBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGhCdWlsZGVyUmVzdWx0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoIGNlcnRQYXRoCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoCi1qYXZhLnNlY3VyaXR5LmNlcnQuVHJ1c3RBbmNob3IKLWphdmEuc2VjdXJpdHkuY2VydC5Qb2xpY3lOb2RlCi1qYXZhLnNlY3VyaXR5LlB1YmxpY0tleSkKLQotcHVibGljIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0UGF0aCBnZXRDZXJ0UGF0aCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZhLnNlY3VyaXR5LmNlcnQuUEtJWENlcnRQYXRoQ2hlY2tlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmxhbmcuQ2xvbmVhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGU7TGphdmEvdXRpbC9Db2xsZWN0aW9uPExqYXZhL2xhbmcvU3RyaW5nOz47KVYgKQotcHVibGljIGFic3RyYWN0IHZvaWQgY2hlY2soCi1qYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGUKLWphdmEudXRpbC5Db2xsZWN0aW9uKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBjbG9uZSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL1NldDxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLlNldCBnZXRTdXBwb3J0ZWRFeHRlbnNpb25zKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBpbml0KAotYm9vbGVhbikKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNGb3J3YXJkQ2hlY2tpbmdTdXBwb3J0ZWQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZhLnNlY3VyaXR5LmNlcnQuUG9saWN5Tm9kZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9JdGVyYXRvcjwrTGphdmEvc2VjdXJpdHkvY2VydC9Qb2xpY3lOb2RlOz47ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnV0aWwuSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oKQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldERlcHRoKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvU2V0PExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnV0aWwuU2V0IGdldEV4cGVjdGVkUG9saWNpZXMoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zZWN1cml0eS5jZXJ0LlBvbGljeU5vZGUgZ2V0UGFyZW50KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvU2V0PCtMamF2YS9zZWN1cml0eS9jZXJ0L1BvbGljeVF1YWxpZmllckluZm87PjsgKQotcHVibGljIGFic3RyYWN0IGphdmEudXRpbC5TZXQgZ2V0UG9saWN5UXVhbGlmaWVycygpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldFZhbGlkUG9saWN5KCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNDcml0aWNhbCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5zZWN1cml0eS5jZXJ0LlBvbGljeVF1YWxpZmllckluZm8gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgYnl0ZVtdIGVuY29kZWQKLQotcHJpdmF0ZSBmaW5hbCBieXRlW10gcG9saWN5UXVhbGlmaWVyCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBwb2xpY3lRdWFsaWZpZXJJZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWJ5dGVbXSkKLQotcHVibGljIGZpbmFsIGJ5dGVbXSBnZXRFbmNvZGVkKCkKLQotcHVibGljIGZpbmFsIGJ5dGVbXSBnZXRQb2xpY3lRdWFsaWZpZXIoKQotCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBnZXRQb2xpY3lRdWFsaWZpZXJJZCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLnNlY3VyaXR5LmNlcnQuVHJ1c3RBbmNob3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBjYU5hbWUKLQotcHJpdmF0ZSBmaW5hbCBqYXZheC5zZWN1cml0eS5hdXRoLng1MDAuWDUwMFByaW5jaXBhbCBjYVByaW5jaXBhbAotCi1wcml2YXRlIGZpbmFsIGphdmEuc2VjdXJpdHkuUHVibGljS2V5IGNhUHVibGljS2V5Ci0KLXByaXZhdGUgZmluYWwgYnl0ZVtdIG5hbWVDb25zdHJhaW50cwotCi1wcml2YXRlIGZpbmFsIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGUgdHJ1c3RlZENlcnQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnNlY3VyaXR5LlB1YmxpY0tleQotYnl0ZVtdKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlCi1ieXRlW10pCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmF4LnNlY3VyaXR5LmF1dGgueDUwMC5YNTAwUHJpbmNpcGFsCi1qYXZhLnNlY3VyaXR5LlB1YmxpY0tleQotYnl0ZVtdKQotCi1wcml2YXRlIHZvaWQgcHJvY2Vzc05hbWVDb25zdHJhaW50cygpCi0KLXB1YmxpYyBmaW5hbCBqYXZheC5zZWN1cml0eS5hdXRoLng1MDAuWDUwMFByaW5jaXBhbCBnZXRDQSgpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGdldENBTmFtZSgpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLnNlY3VyaXR5LlB1YmxpY0tleSBnZXRDQVB1YmxpY0tleSgpCi0KLXB1YmxpYyBmaW5hbCBieXRlW10gZ2V0TmFtZUNvbnN0cmFpbnRzKCkKLQotcHVibGljIGZpbmFsIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGUgZ2V0VHJ1c3RlZENlcnQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5RXh0ZW5zaW9uIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL1NldDxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLlNldCBnZXRDcml0aWNhbEV4dGVuc2lvbk9JRHMoKQotCi1wdWJsaWMgYWJzdHJhY3QgYnl0ZVtdIGdldEV4dGVuc2lvblZhbHVlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvU2V0PExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnV0aWwuU2V0IGdldE5vbkNyaXRpY2FsRXh0ZW5zaW9uT0lEcygpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGhhc1Vuc3VwcG9ydGVkQ3JpdGljYWxFeHRlbnNpb24oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q1JMIGV4dGVuZHMgamF2YS5zZWN1cml0eS5jZXJ0LkNSTCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5RXh0ZW5zaW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9jZXJ0L0NSTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJ5dGVbXSBnZXRFbmNvZGVkKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsIGdldElzc3VlckROKCkKLQotcHVibGljIGphdmF4LnNlY3VyaXR5LmF1dGgueDUwMC5YNTAwUHJpbmNpcGFsIGdldElzc3Vlclg1MDBQcmluY2lwYWwoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLkRhdGUgZ2V0TmV4dFVwZGF0ZSgpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNSTEVudHJ5IGdldFJldm9rZWRDZXJ0aWZpY2F0ZSgKLWphdmEubWF0aC5CaWdJbnRlZ2VyKQotCi1wdWJsaWMgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDUkxFbnRyeSBnZXRSZXZva2VkQ2VydGlmaWNhdGUoCi1qYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9TZXQ8K0xqYXZhL3NlY3VyaXR5L2NlcnQvWDUwOUNSTEVudHJ5Oz47ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnV0aWwuU2V0IGdldFJldm9rZWRDZXJ0aWZpY2F0ZXMoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRTaWdBbGdOYW1lKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0U2lnQWxnT0lEKCkKLQotcHVibGljIGFic3RyYWN0IGJ5dGVbXSBnZXRTaWdBbGdQYXJhbXMoKQotCi1wdWJsaWMgYWJzdHJhY3QgYnl0ZVtdIGdldFNpZ25hdHVyZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvY2VydC9DUkxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBieXRlW10gZ2V0VEJTQ2VydExpc3QoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLkRhdGUgZ2V0VGhpc1VwZGF0ZSgpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0VmVyc2lvbigpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L2NlcnQvQ1JMRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L05vU3VjaFByb3ZpZGVyRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L1NpZ25hdHVyZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgdmVyaWZ5KAotamF2YS5zZWN1cml0eS5QdWJsaWNLZXkpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvY2VydC9DUkxFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvTm9TdWNoUHJvdmlkZXJFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvU2lnbmF0dXJlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB2ZXJpZnkoCi1qYXZhLnNlY3VyaXR5LlB1YmxpY0tleQotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNSTEVudHJ5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5RXh0ZW5zaW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGphdmF4LnNlY3VyaXR5LmF1dGgueDUwMC5YNTAwUHJpbmNpcGFsIGdldENlcnRpZmljYXRlSXNzdWVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9jZXJ0L0NSTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJ5dGVbXSBnZXRFbmNvZGVkKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEudXRpbC5EYXRlIGdldFJldm9jYXRpb25EYXRlKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldFNlcmlhbE51bWJlcigpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGhhc0V4dGVuc2lvbnMoKQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q1JMU2VsZWN0b3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5jZXJ0LkNSTFNlbGVjdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZSBjZXJ0aWZpY2F0ZUNoZWNraW5nCi0KLXByaXZhdGUgbG9uZyBkYXRlQW5kVGltZQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQXJyYXlMaXN0PExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXByaXZhdGUgamF2YS51dGlsLkFycmF5TGlzdCBpc3N1ZXJOYW1lcwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQXJyYXlMaXN0PExqYXZheC9zZWN1cml0eS9hdXRoL3g1MDAvWDUwMFByaW5jaXBhbDs+OyApCi1wcml2YXRlIGphdmEudXRpbC5BcnJheUxpc3QgaXNzdWVyUHJpbmNpcGFscwotCi1wcml2YXRlIGphdmEubWF0aC5CaWdJbnRlZ2VyIG1heENSTAotCi1wcml2YXRlIGphdmEubWF0aC5CaWdJbnRlZ2VyIG1pbkNSTAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIGFkZElzc3VlcigKLWphdmF4LnNlY3VyaXR5LmF1dGgueDUwMC5YNTAwUHJpbmNpcGFsKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBhZGRJc3N1ZXJOYW1lKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgYWRkSXNzdWVyTmFtZSgKLWJ5dGVbXSkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgY2xvbmUoKQotCi1wdWJsaWMgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZSBnZXRDZXJ0aWZpY2F0ZUNoZWNraW5nKCkKLQotcHVibGljIGphdmEudXRpbC5EYXRlIGdldERhdGVBbmRUaW1lKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvQ29sbGVjdGlvbjxMamF2YS9sYW5nL09iamVjdDs+OyApCi1wdWJsaWMgamF2YS51dGlsLkNvbGxlY3Rpb24gZ2V0SXNzdWVyTmFtZXMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9Db2xsZWN0aW9uPExqYXZheC9zZWN1cml0eS9hdXRoL3g1MDAvWDUwMFByaW5jaXBhbDs+OyApCi1wdWJsaWMgamF2YS51dGlsLkNvbGxlY3Rpb24gZ2V0SXNzdWVycygpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRNYXhDUkwoKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgZ2V0TWluQ1JMKCkKLQotcHVibGljIGJvb2xlYW4gbWF0Y2goCi1qYXZhLnNlY3VyaXR5LmNlcnQuQ1JMKQotCi1wdWJsaWMgdm9pZCBzZXRDZXJ0aWZpY2F0ZUNoZWNraW5nKAotamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZSkKLQotcHVibGljIHZvaWQgc2V0RGF0ZUFuZFRpbWUoCi1qYXZhLnV0aWwuRGF0ZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0NvbGxlY3Rpb248Kj47KVYgKQotcHVibGljIHZvaWQgc2V0SXNzdWVyTmFtZXMoCi1qYXZhLnV0aWwuQ29sbGVjdGlvbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9Db2xsZWN0aW9uPExqYXZheC9zZWN1cml0eS9hdXRoL3g1MDAvWDUwMFByaW5jaXBhbDs+OylWICkKLXB1YmxpYyB2b2lkIHNldElzc3VlcnMoCi1qYXZhLnV0aWwuQ29sbGVjdGlvbikKLQotcHVibGljIHZvaWQgc2V0TWF4Q1JMTnVtYmVyKAotamF2YS5tYXRoLkJpZ0ludGVnZXIpCi0KLXB1YmxpYyB2b2lkIHNldE1pbkNSTE51bWJlcigKLWphdmEubWF0aC5CaWdJbnRlZ2VyKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0U2VsZWN0b3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRTZWxlY3RvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGJ5dGVbXSBhdXRob3JpdHlLZXlJZGVudGlmaWVyCi0KLXByaXZhdGUgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZSBjZXJ0aWZpY2F0ZUVxdWFscwotCi1wcml2YXRlIGphdmEudXRpbC5EYXRlIGNlcnRpZmljYXRlVmFsaWQKLQotcHJpdmF0ZSBqYXZhLnV0aWwuU2V0IGV4dGVuZGVkS2V5VXNhZ2UKLQotcHJpdmF0ZSBqYXZheC5zZWN1cml0eS5hdXRoLng1MDAuWDUwMFByaW5jaXBhbCBpc3N1ZXIKLQotcHJpdmF0ZSBieXRlW10gaXNzdWVyQnl0ZXMKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGlzc3Vlck5hbWUKLQotcHJpdmF0ZSBib29sZWFuW10ga2V5VXNhZ2UKLQotcHJpdmF0ZSBib29sZWFuIG1hdGNoQWxsTmFtZXMKLQotcHJpdmF0ZSBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5OYW1lQ29uc3RyYWludHMgbmFtZUNvbnN0cmFpbnRzCi0KLXByaXZhdGUgaW50IHBhdGhMZW4KLQotcHJpdmF0ZSBqYXZhLnV0aWwuQXJyYXlMaXN0IHBhdGhUb05hbWVzCi0KLXByaXZhdGUgamF2YS51dGlsLlNldCBwb2xpY2llcwotCi1wcml2YXRlIGphdmEudXRpbC5EYXRlIHByaXZhdGVLZXlWYWxpZAotCi1wcml2YXRlIGphdmEubWF0aC5CaWdJbnRlZ2VyIHNlcmlhbE51bWJlcgotCi1wcml2YXRlIGphdmF4LnNlY3VyaXR5LmF1dGgueDUwMC5YNTAwUHJpbmNpcGFsIHN1YmplY3QKLQotcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdFtdIHN1YmplY3RBbHROYW1lcwotCi1wcml2YXRlIGJ5dGVbXSBzdWJqZWN0S2V5SWRlbnRpZmllcgotCi1wcml2YXRlIGJ5dGVbXSBzdWJqZWN0UHVibGljS2V5Ci0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBzdWJqZWN0UHVibGljS2V5QWxnSUQKLQotcHJpdmF0ZSBqYXZhLnNlY3VyaXR5LlB1YmxpY0tleSBzdWJqZWN0UHVibGljS2V5SW1wbAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCBjaGVja09JRCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBnZXRCeXRlc0FzU3RyaW5nKAotYnl0ZVtdKQotCi1wcml2YXRlIGJ5dGVbXSBnZXRFeHRlbnNpb25WYWx1ZSgKLWphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGUKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGFkZFBhdGhUb05hbWUoCi1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGFkZFBhdGhUb05hbWUoCi1pbnQKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgYWRkU3ViamVjdEFsdGVybmF0aXZlTmFtZSgKLWludAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgYWRkU3ViamVjdEFsdGVybmF0aXZlTmFtZSgKLWludAotYnl0ZVtdKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBjbG9uZSgpCi0KLXB1YmxpYyBieXRlW10gZ2V0QXV0aG9yaXR5S2V5SWRlbnRpZmllcigpCi0KLXB1YmxpYyBpbnQgZ2V0QmFzaWNDb25zdHJhaW50cygpCi0KLXB1YmxpYyBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlIGdldENlcnRpZmljYXRlKCkKLQotcHVibGljIGphdmEudXRpbC5EYXRlIGdldENlcnRpZmljYXRlVmFsaWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9TZXQ8TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHVibGljIGphdmEudXRpbC5TZXQgZ2V0RXh0ZW5kZWRLZXlVc2FnZSgpCi0KLXB1YmxpYyBqYXZheC5zZWN1cml0eS5hdXRoLng1MDAuWDUwMFByaW5jaXBhbCBnZXRJc3N1ZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYnl0ZVtdIGdldElzc3VlckFzQnl0ZXMoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJc3N1ZXJBc1N0cmluZygpCi0KLXB1YmxpYyBib29sZWFuW10gZ2V0S2V5VXNhZ2UoKQotCi1wdWJsaWMgYm9vbGVhbiBnZXRNYXRjaEFsbFN1YmplY3RBbHROYW1lcygpCi0KLXB1YmxpYyBieXRlW10gZ2V0TmFtZUNvbnN0cmFpbnRzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvQ29sbGVjdGlvbjxMamF2YS91dGlsL0xpc3Q8Kj47PjsgKQotcHVibGljIGphdmEudXRpbC5Db2xsZWN0aW9uIGdldFBhdGhUb05hbWVzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvU2V0PExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuU2V0IGdldFBvbGljeSgpCi0KLXB1YmxpYyBqYXZhLnV0aWwuRGF0ZSBnZXRQcml2YXRlS2V5VmFsaWQoKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgZ2V0U2VyaWFsTnVtYmVyKCkKLQotcHVibGljIGphdmF4LnNlY3VyaXR5LmF1dGgueDUwMC5YNTAwUHJpbmNpcGFsIGdldFN1YmplY3QoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9Db2xsZWN0aW9uPExqYXZhL3V0aWwvTGlzdDwqPjs+OyApCi1wdWJsaWMgamF2YS51dGlsLkNvbGxlY3Rpb24gZ2V0U3ViamVjdEFsdGVybmF0aXZlTmFtZXMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYnl0ZVtdIGdldFN1YmplY3RBc0J5dGVzKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3ViamVjdEFzU3RyaW5nKCkKLQotcHVibGljIGJ5dGVbXSBnZXRTdWJqZWN0S2V5SWRlbnRpZmllcigpCi0KLXB1YmxpYyBqYXZhLnNlY3VyaXR5LlB1YmxpY0tleSBnZXRTdWJqZWN0UHVibGljS2V5KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3ViamVjdFB1YmxpY0tleUFsZ0lEKCkKLQotcHVibGljIGJvb2xlYW4gbWF0Y2goCi1qYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGUpCi0KLXB1YmxpYyB2b2lkIHNldEF1dGhvcml0eUtleUlkZW50aWZpZXIoCi1ieXRlW10pCi0KLXB1YmxpYyB2b2lkIHNldEJhc2ljQ29uc3RyYWludHMoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldENlcnRpZmljYXRlKAotamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZSkKLQotcHVibGljIHZvaWQgc2V0Q2VydGlmaWNhdGVWYWxpZCgKLWphdmEudXRpbC5EYXRlKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL1NldDxMamF2YS9sYW5nL1N0cmluZzs+OylWICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0RXh0ZW5kZWRLZXlVc2FnZSgKLWphdmEudXRpbC5TZXQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldElzc3VlcigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHNldElzc3VlcigKLWphdmF4LnNlY3VyaXR5LmF1dGgueDUwMC5YNTAwUHJpbmNpcGFsKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRJc3N1ZXIoCi1ieXRlW10pCi0KLXB1YmxpYyB2b2lkIHNldEtleVVzYWdlKAotYm9vbGVhbltdKQotCi1wdWJsaWMgdm9pZCBzZXRNYXRjaEFsbFN1YmplY3RBbHROYW1lcygKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldE5hbWVDb25zdHJhaW50cygKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0NvbGxlY3Rpb248TGphdmEvdXRpbC9MaXN0PCo+Oz47KVYgKQotcHVibGljIHZvaWQgc2V0UGF0aFRvTmFtZXMoCi1qYXZhLnV0aWwuQ29sbGVjdGlvbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL1NldDxMamF2YS9sYW5nL1N0cmluZzs+OylWICkKLXB1YmxpYyB2b2lkIHNldFBvbGljeSgKLWphdmEudXRpbC5TZXQpCi0KLXB1YmxpYyB2b2lkIHNldFByaXZhdGVLZXlWYWxpZCgKLWphdmEudXRpbC5EYXRlKQotCi1wdWJsaWMgdm9pZCBzZXRTZXJpYWxOdW1iZXIoCi1qYXZhLm1hdGguQmlnSW50ZWdlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0U3ViamVjdCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHNldFN1YmplY3QoCi1qYXZheC5zZWN1cml0eS5hdXRoLng1MDAuWDUwMFByaW5jaXBhbCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0U3ViamVjdCgKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9Db2xsZWN0aW9uPExqYXZhL3V0aWwvTGlzdDwqPjs+OylWICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0U3ViamVjdEFsdGVybmF0aXZlTmFtZXMoCi1qYXZhLnV0aWwuQ29sbGVjdGlvbikKLQotcHVibGljIHZvaWQgc2V0U3ViamVjdEtleUlkZW50aWZpZXIoCi1ieXRlW10pCi0KLXB1YmxpYyB2b2lkIHNldFN1YmplY3RQdWJsaWNLZXkoCi1qYXZhLnNlY3VyaXR5LlB1YmxpY0tleSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0U3ViamVjdFB1YmxpY0tleSgKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0U3ViamVjdFB1YmxpY0tleUFsZ0lEKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGUgZXh0ZW5kcyBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGUgaW1wbGVtZW50cyBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUV4dGVuc2lvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVFeHBpcmVkRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVOb3RZZXRWYWxpZEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgY2hlY2tWYWxpZGl0eSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUV4cGlyZWRFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZU5vdFlldFZhbGlkRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBjaGVja1ZhbGlkaXR5KAotamF2YS51dGlsLkRhdGUpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0QmFzaWNDb25zdHJhaW50cygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvTGlzdDxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0RXh0ZW5kZWRLZXlVc2FnZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvQ29sbGVjdGlvbjxMamF2YS91dGlsL0xpc3Q8Kj47PjsgKQotcHVibGljIGphdmEudXRpbC5Db2xsZWN0aW9uIGdldElzc3VlckFsdGVybmF0aXZlTmFtZXMoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zZWN1cml0eS5QcmluY2lwYWwgZ2V0SXNzdWVyRE4oKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbltdIGdldElzc3VlclVuaXF1ZUlEKCkKLQotcHVibGljIGphdmF4LnNlY3VyaXR5LmF1dGgueDUwMC5YNTAwUHJpbmNpcGFsIGdldElzc3Vlclg1MDBQcmluY2lwYWwoKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbltdIGdldEtleVVzYWdlKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEudXRpbC5EYXRlIGdldE5vdEFmdGVyKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEudXRpbC5EYXRlIGdldE5vdEJlZm9yZSgpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRTZXJpYWxOdW1iZXIoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRTaWdBbGdOYW1lKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0U2lnQWxnT0lEKCkKLQotcHVibGljIGFic3RyYWN0IGJ5dGVbXSBnZXRTaWdBbGdQYXJhbXMoKQotCi1wdWJsaWMgYWJzdHJhY3QgYnl0ZVtdIGdldFNpZ25hdHVyZSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0NvbGxlY3Rpb248TGphdmEvdXRpbC9MaXN0PCo+Oz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEudXRpbC5Db2xsZWN0aW9uIGdldFN1YmplY3RBbHRlcm5hdGl2ZU5hbWVzKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsIGdldFN1YmplY3RETigpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuW10gZ2V0U3ViamVjdFVuaXF1ZUlEKCkKLQotcHVibGljIGphdmF4LnNlY3VyaXR5LmF1dGgueDUwMC5YNTAwUHJpbmNpcGFsIGdldFN1YmplY3RYNTAwUHJpbmNpcGFsKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBieXRlW10gZ2V0VEJTQ2VydGlmaWNhdGUoKQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldFZlcnNpb24oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZhLnNlY3VyaXR5LmludGVyZmFjZXMuRFNBS2V5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnNlY3VyaXR5LmludGVyZmFjZXMuRFNBUGFyYW1zIGdldFBhcmFtcygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcy5EU0FLZXlQYWlyR2VuZXJhdG9yIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvSW52YWxpZFBhcmFtZXRlckV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgaW5pdGlhbGl6ZSgKLWludAotYm9vbGVhbgotamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvSW52YWxpZFBhcmFtZXRlckV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgaW5pdGlhbGl6ZSgKLWphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcy5EU0FQYXJhbXMKLWphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZhLnNlY3VyaXR5LmludGVyZmFjZXMuRFNBUGFyYW1zIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRHKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldFAoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5tYXRoLkJpZ0ludGVnZXIgZ2V0USgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcy5EU0FQcml2YXRlS2V5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcy5EU0FLZXksIGphdmEuc2VjdXJpdHkuUHJpdmF0ZUtleQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRYKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgamF2YS5zZWN1cml0eS5pbnRlcmZhY2VzLkRTQVB1YmxpY0tleSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnNlY3VyaXR5LmludGVyZmFjZXMuRFNBS2V5LCBqYXZhLnNlY3VyaXR5LlB1YmxpY0tleQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRZKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgamF2YS5zZWN1cml0eS5pbnRlcmZhY2VzLkVDS2V5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnNlY3VyaXR5LnNwZWMuRUNQYXJhbWV0ZXJTcGVjIGdldFBhcmFtcygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcy5FQ1ByaXZhdGVLZXkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5Qcml2YXRlS2V5LCBqYXZhLnNlY3VyaXR5LmludGVyZmFjZXMuRUNLZXkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5tYXRoLkJpZ0ludGVnZXIgZ2V0UygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcy5FQ1B1YmxpY0tleSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnNlY3VyaXR5LlB1YmxpY0tleSwgamF2YS5zZWN1cml0eS5pbnRlcmZhY2VzLkVDS2V5Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IGphdmEuc2VjdXJpdHkuc3BlYy5FQ1BvaW50IGdldFcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZhLnNlY3VyaXR5LmludGVyZmFjZXMuUlNBS2V5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRNb2R1bHVzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgamF2YS5zZWN1cml0eS5pbnRlcmZhY2VzLlJTQVByaXZhdGVLZXkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5Qcml2YXRlS2V5LCBqYXZhLnNlY3VyaXR5LmludGVyZmFjZXMuUlNBS2V5Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldFByaXZhdGVFeHBvbmVudCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcy5SU0FNdWx0aVByaW1lUHJpdmF0ZUNydEtleSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnNlY3VyaXR5LmludGVyZmFjZXMuUlNBUHJpdmF0ZUtleQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRDcnRDb2VmZmljaWVudCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnNlY3VyaXR5LnNwZWMuUlNBT3RoZXJQcmltZUluZm9bXSBnZXRPdGhlclByaW1lSW5mbygpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRQcmltZUV4cG9uZW50UCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRQcmltZUV4cG9uZW50USgpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRQcmltZVAoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5tYXRoLkJpZ0ludGVnZXIgZ2V0UHJpbWVRKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldFB1YmxpY0V4cG9uZW50KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgamF2YS5zZWN1cml0eS5pbnRlcmZhY2VzLlJTQVByaXZhdGVDcnRLZXkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5pbnRlcmZhY2VzLlJTQVByaXZhdGVLZXkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5tYXRoLkJpZ0ludGVnZXIgZ2V0Q3J0Q29lZmZpY2llbnQoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5tYXRoLkJpZ0ludGVnZXIgZ2V0UHJpbWVFeHBvbmVudFAoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5tYXRoLkJpZ0ludGVnZXIgZ2V0UHJpbWVFeHBvbmVudFEoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5tYXRoLkJpZ0ludGVnZXIgZ2V0UHJpbWVQKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldFByaW1lUSgpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRQdWJsaWNFeHBvbmVudCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcy5SU0FQdWJsaWNLZXkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5QdWJsaWNLZXksIGphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcy5SU0FLZXkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5tYXRoLkJpZ0ludGVnZXIgZ2V0UHVibGljRXhwb25lbnQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEuc2VjdXJpdHkuc3BlYy5EU0FQYXJhbWV0ZXJTcGVjIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjLCBqYXZhLnNlY3VyaXR5LmludGVyZmFjZXMuRFNBUGFyYW1zCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgamF2YS5tYXRoLkJpZ0ludGVnZXIgZwotCi1wcml2YXRlIGZpbmFsIGphdmEubWF0aC5CaWdJbnRlZ2VyIHAKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLm1hdGguQmlnSW50ZWdlciBxCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5tYXRoLkJpZ0ludGVnZXIKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1qYXZhLm1hdGguQmlnSW50ZWdlcikKLQotcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldEcoKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgZ2V0UCgpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRRKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgamF2YS5zZWN1cml0eS5zcGVjLktleVNwZWMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLnNlY3VyaXR5LnNwZWMuRFNBUHJpdmF0ZUtleVNwZWMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5zcGVjLktleVNwZWMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBqYXZhLm1hdGguQmlnSW50ZWdlciBnCi0KLXByaXZhdGUgZmluYWwgamF2YS5tYXRoLkJpZ0ludGVnZXIgcAotCi1wcml2YXRlIGZpbmFsIGphdmEubWF0aC5CaWdJbnRlZ2VyIHEKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLm1hdGguQmlnSW50ZWdlciB4Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5tYXRoLkJpZ0ludGVnZXIKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1qYXZhLm1hdGguQmlnSW50ZWdlcgotamF2YS5tYXRoLkJpZ0ludGVnZXIpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRHKCkKLQotcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldFAoKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgZ2V0USgpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRYKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLnNlY3VyaXR5LnNwZWMuRFNBUHVibGljS2V5U3BlYyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnNlY3VyaXR5LnNwZWMuS2V5U3BlYwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGphdmEubWF0aC5CaWdJbnRlZ2VyIGcKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLm1hdGguQmlnSW50ZWdlciBwCi0KLXByaXZhdGUgZmluYWwgamF2YS5tYXRoLkJpZ0ludGVnZXIgcQotCi1wcml2YXRlIGZpbmFsIGphdmEubWF0aC5CaWdJbnRlZ2VyIHkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLm1hdGguQmlnSW50ZWdlcgotamF2YS5tYXRoLkJpZ0ludGVnZXIKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1qYXZhLm1hdGguQmlnSW50ZWdlcikKLQotcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldEcoKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgZ2V0UCgpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRRKCkKLQotcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldFkoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZhLnNlY3VyaXR5LnNwZWMuRUNGaWVsZCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldEZpZWxkU2l6ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5zZWN1cml0eS5zcGVjLkVDRmllbGRGMm0gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5zcGVjLkVDRmllbGQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBQQl9MRU4KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBQQl9NSURfTEVOCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUUEJfTEVOCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUUEJfTUlEX0xFTgotCi1wcml2YXRlIGZpbmFsIGludFtdIGtzCi0KLXByaXZhdGUgZmluYWwgaW50IG0KLQotcHJpdmF0ZSBmaW5hbCBqYXZhLm1hdGguQmlnSW50ZWdlciBycAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50Ci1qYXZhLm1hdGguQmlnSW50ZWdlcikKLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50Ci1pbnRbXSkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGludCBnZXRGaWVsZFNpemUoKQotCi1wdWJsaWMgaW50IGdldE0oKQotCi1wdWJsaWMgaW50W10gZ2V0TWlkVGVybXNPZlJlZHVjdGlvblBvbHlub21pYWwoKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgZ2V0UmVkdWN0aW9uUG9seW5vbWlhbCgpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEuc2VjdXJpdHkuc3BlYy5FQ0ZpZWxkRnAgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5zcGVjLkVDRmllbGQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBqYXZhLm1hdGguQmlnSW50ZWdlciBwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5tYXRoLkJpZ0ludGVnZXIpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBpbnQgZ2V0RmllbGRTaXplKCkKLQotcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldFAoKQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLnNlY3VyaXR5LnNwZWMuRUNHZW5QYXJhbWV0ZXJTcGVjIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBuYW1lCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TmFtZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5zZWN1cml0eS5zcGVjLkVDUGFyYW1ldGVyU3BlYyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGludCBjb2ZhY3RvcgotCi1wcml2YXRlIGZpbmFsIGphdmEuc2VjdXJpdHkuc3BlYy5FbGxpcHRpY0N1cnZlIGN1cnZlCi0KLXByaXZhdGUgZmluYWwgamF2YS5zZWN1cml0eS5zcGVjLkVDUG9pbnQgZ2VuZXJhdG9yCi0KLXByaXZhdGUgZmluYWwgamF2YS5tYXRoLkJpZ0ludGVnZXIgb3JkZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnNlY3VyaXR5LnNwZWMuRWxsaXB0aWNDdXJ2ZQotamF2YS5zZWN1cml0eS5zcGVjLkVDUG9pbnQKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0Q29mYWN0b3IoKQotCi1wdWJsaWMgamF2YS5zZWN1cml0eS5zcGVjLkVsbGlwdGljQ3VydmUgZ2V0Q3VydmUoKQotCi1wdWJsaWMgamF2YS5zZWN1cml0eS5zcGVjLkVDUG9pbnQgZ2V0R2VuZXJhdG9yKCkKLQotcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldE9yZGVyKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLnNlY3VyaXR5LnNwZWMuRUNQb2ludCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnNlY3VyaXR5LnNwZWMuRUNQb2ludCBQT0lOVF9JTkZJTklUWQotCi1wcml2YXRlIGZpbmFsIGphdmEubWF0aC5CaWdJbnRlZ2VyIGFmZmluZVgKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLm1hdGguQmlnSW50ZWdlciBhZmZpbmVZCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5tYXRoLkJpZ0ludGVnZXIKLWphdmEubWF0aC5CaWdJbnRlZ2VyKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgZ2V0QWZmaW5lWCgpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRBZmZpbmVZKCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5zZWN1cml0eS5zcGVjLkVDUHJpdmF0ZUtleVNwZWMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5zcGVjLktleVNwZWMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBqYXZhLnNlY3VyaXR5LnNwZWMuRUNQYXJhbWV0ZXJTcGVjIHBhcmFtcwotCi1wcml2YXRlIGZpbmFsIGphdmEubWF0aC5CaWdJbnRlZ2VyIHMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLm1hdGguQmlnSW50ZWdlcgotamF2YS5zZWN1cml0eS5zcGVjLkVDUGFyYW1ldGVyU3BlYykKLQotcHVibGljIGphdmEuc2VjdXJpdHkuc3BlYy5FQ1BhcmFtZXRlclNwZWMgZ2V0UGFyYW1zKCkKLQotcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldFMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEuc2VjdXJpdHkuc3BlYy5FQ1B1YmxpY0tleVNwZWMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5zcGVjLktleVNwZWMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBqYXZhLnNlY3VyaXR5LnNwZWMuRUNQYXJhbWV0ZXJTcGVjIHBhcmFtcwotCi1wcml2YXRlIGZpbmFsIGphdmEuc2VjdXJpdHkuc3BlYy5FQ1BvaW50IHcKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnNlY3VyaXR5LnNwZWMuRUNQb2ludAotamF2YS5zZWN1cml0eS5zcGVjLkVDUGFyYW1ldGVyU3BlYykKLQotcHVibGljIGphdmEuc2VjdXJpdHkuc3BlYy5FQ1BhcmFtZXRlclNwZWMgZ2V0UGFyYW1zKCkKLQotcHVibGljIGphdmEuc2VjdXJpdHkuc3BlYy5FQ1BvaW50IGdldFcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEuc2VjdXJpdHkuc3BlYy5FbGxpcHRpY0N1cnZlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGphdmEubWF0aC5CaWdJbnRlZ2VyIGEKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLm1hdGguQmlnSW50ZWdlciBiCi0KLXByaXZhdGUgZmluYWwgamF2YS5zZWN1cml0eS5zcGVjLkVDRmllbGQgZmllbGQKLQotcHJpdmF0ZSB2b2xhdGlsZSBpbnQgaGFzaAotCi1wcml2YXRlIGZpbmFsIGJ5dGVbXSBzZWVkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5zZWN1cml0eS5zcGVjLkVDRmllbGQKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1qYXZhLm1hdGguQmlnSW50ZWdlcikKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5zZWN1cml0eS5zcGVjLkVDRmllbGQKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1qYXZhLm1hdGguQmlnSW50ZWdlcgotYnl0ZVtdKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgZ2V0QSgpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRCKCkKLQotcHVibGljIGphdmEuc2VjdXJpdHkuc3BlYy5FQ0ZpZWxkIGdldEZpZWxkKCkKLQotcHVibGljIGJ5dGVbXSBnZXRTZWVkKCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgamF2YS5zZWN1cml0eS5zcGVjLkVuY29kZWRLZXlTcGVjIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuc3BlYy5LZXlTcGVjCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgYnl0ZVtdIGVuY29kZWRLZXkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ieXRlW10pCi0KLXB1YmxpYyBieXRlW10gZ2V0RW5jb2RlZCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldEZvcm1hdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5zZWN1cml0eS5zcGVjLkludmFsaWRLZXlTcGVjRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5zZWN1cml0eS5HZW5lcmFsU2VjdXJpdHlFeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlRocm93YWJsZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlRocm93YWJsZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLnNlY3VyaXR5LnNwZWMuSW52YWxpZFBhcmFtZXRlclNwZWNFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLnNlY3VyaXR5LkdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEuc2VjdXJpdHkuc3BlYy5NR0YxUGFyYW1ldGVyU3BlYyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEuc2VjdXJpdHkuc3BlYy5NR0YxUGFyYW1ldGVyU3BlYyBTSEExCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5zZWN1cml0eS5zcGVjLk1HRjFQYXJhbWV0ZXJTcGVjIFNIQTI1NgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEuc2VjdXJpdHkuc3BlYy5NR0YxUGFyYW1ldGVyU3BlYyBTSEEzODQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnNlY3VyaXR5LnNwZWMuTUdGMVBhcmFtZXRlclNwZWMgU0hBNTEyCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBtZE5hbWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldERpZ2VzdEFsZ29yaXRobSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5zZWN1cml0eS5zcGVjLlBLQ1M4RW5jb2RlZEtleVNwZWMgZXh0ZW5kcyBqYXZhLnNlY3VyaXR5LnNwZWMuRW5jb2RlZEtleVNwZWMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ieXRlW10pCi0KLXB1YmxpYyBieXRlW10gZ2V0RW5jb2RlZCgpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGdldEZvcm1hdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5zZWN1cml0eS5zcGVjLlBTU1BhcmFtZXRlclNwZWMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnNlY3VyaXR5LnNwZWMuUFNTUGFyYW1ldGVyU3BlYyBERUZBVUxUCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBtZE5hbWUKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIG1nZk5hbWUKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYyBtZ2ZTcGVjCi0KLXByaXZhdGUgZmluYWwgaW50IHNhbHRMZW4KLQotcHJpdmF0ZSBmaW5hbCBpbnQgdHJhaWxlckZpZWxkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjCi1pbnQKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RGlnZXN0QWxnb3JpdGhtKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TUdGQWxnb3JpdGhtKCkKLQotcHVibGljIGphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjIGdldE1HRlBhcmFtZXRlcnMoKQotCi1wdWJsaWMgaW50IGdldFNhbHRMZW5ndGgoKQotCi1wdWJsaWMgaW50IGdldFRyYWlsZXJGaWVsZCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5zZWN1cml0eS5zcGVjLlJTQUtleUdlblBhcmFtZXRlclNwZWMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLm1hdGguQmlnSW50ZWdlciBGMAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubWF0aC5CaWdJbnRlZ2VyIEY0Ci0KLXByaXZhdGUgZmluYWwgaW50IGtleXNpemUKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLm1hdGguQmlnSW50ZWdlciBwdWJsaWNFeHBvbmVudAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50Ci1qYXZhLm1hdGguQmlnSW50ZWdlcikKLQotcHVibGljIGludCBnZXRLZXlzaXplKCkKLQotcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldFB1YmxpY0V4cG9uZW50KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLnNlY3VyaXR5LnNwZWMuUlNBUHJpdmF0ZUtleVNwZWMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5zcGVjLktleVNwZWMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBqYXZhLm1hdGguQmlnSW50ZWdlciBtb2R1bHVzCi0KLXByaXZhdGUgZmluYWwgamF2YS5tYXRoLkJpZ0ludGVnZXIgcHJpdmF0ZUV4cG9uZW50Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5tYXRoLkJpZ0ludGVnZXIKLWphdmEubWF0aC5CaWdJbnRlZ2VyKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgZ2V0TW9kdWx1cygpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRQcml2YXRlRXhwb25lbnQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEuc2VjdXJpdHkuc3BlYy5SU0FNdWx0aVByaW1lUHJpdmF0ZUNydEtleVNwZWMgZXh0ZW5kcyBqYXZhLnNlY3VyaXR5LnNwZWMuUlNBUHJpdmF0ZUtleVNwZWMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBqYXZhLm1hdGguQmlnSW50ZWdlciBjcnRDb2VmZmljaWVudAotCi1wcml2YXRlIGZpbmFsIGphdmEuc2VjdXJpdHkuc3BlYy5SU0FPdGhlclByaW1lSW5mb1tdIG90aGVyUHJpbWVJbmZvCi0KLXByaXZhdGUgZmluYWwgamF2YS5tYXRoLkJpZ0ludGVnZXIgcHJpbWVFeHBvbmVudFAKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLm1hdGguQmlnSW50ZWdlciBwcmltZUV4cG9uZW50UQotCi1wcml2YXRlIGZpbmFsIGphdmEubWF0aC5CaWdJbnRlZ2VyIHByaW1lUAotCi1wcml2YXRlIGZpbmFsIGphdmEubWF0aC5CaWdJbnRlZ2VyIHByaW1lUQotCi1wcml2YXRlIGZpbmFsIGphdmEubWF0aC5CaWdJbnRlZ2VyIHB1YmxpY0V4cG9uZW50Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5tYXRoLkJpZ0ludGVnZXIKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1qYXZhLm1hdGguQmlnSW50ZWdlcgotamF2YS5tYXRoLkJpZ0ludGVnZXIKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1qYXZhLm1hdGguQmlnSW50ZWdlcgotamF2YS5tYXRoLkJpZ0ludGVnZXIKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1qYXZhLnNlY3VyaXR5LnNwZWMuUlNBT3RoZXJQcmltZUluZm9bXSkKLQotcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldENydENvZWZmaWNpZW50KCkKLQotcHVibGljIGphdmEuc2VjdXJpdHkuc3BlYy5SU0FPdGhlclByaW1lSW5mb1tdIGdldE90aGVyUHJpbWVJbmZvKCkKLQotcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldFByaW1lRXhwb25lbnRQKCkKLQotcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldFByaW1lRXhwb25lbnRRKCkKLQotcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldFByaW1lUCgpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRQcmltZVEoKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgZ2V0UHVibGljRXhwb25lbnQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEuc2VjdXJpdHkuc3BlYy5SU0FPdGhlclByaW1lSW5mbyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBqYXZhLm1hdGguQmlnSW50ZWdlciBjcnRDb2VmZmljaWVudAotCi1wcml2YXRlIGZpbmFsIGphdmEubWF0aC5CaWdJbnRlZ2VyIHByaW1lCi0KLXByaXZhdGUgZmluYWwgamF2YS5tYXRoLkJpZ0ludGVnZXIgcHJpbWVFeHBvbmVudAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1qYXZhLm1hdGguQmlnSW50ZWdlcgotamF2YS5tYXRoLkJpZ0ludGVnZXIpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRDcnRDb2VmZmljaWVudCgpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRFeHBvbmVudCgpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRQcmltZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5zZWN1cml0eS5zcGVjLlJTQVByaXZhdGVDcnRLZXlTcGVjIGV4dGVuZHMgamF2YS5zZWN1cml0eS5zcGVjLlJTQVByaXZhdGVLZXlTcGVjCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgamF2YS5tYXRoLkJpZ0ludGVnZXIgY3J0Q29lZmZpY2llbnQKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLm1hdGguQmlnSW50ZWdlciBwcmltZUV4cG9uZW50UAotCi1wcml2YXRlIGZpbmFsIGphdmEubWF0aC5CaWdJbnRlZ2VyIHByaW1lRXhwb25lbnRRCi0KLXByaXZhdGUgZmluYWwgamF2YS5tYXRoLkJpZ0ludGVnZXIgcHJpbWVQCi0KLXByaXZhdGUgZmluYWwgamF2YS5tYXRoLkJpZ0ludGVnZXIgcHJpbWVRCi0KLXByaXZhdGUgZmluYWwgamF2YS5tYXRoLkJpZ0ludGVnZXIgcHVibGljRXhwb25lbnQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLm1hdGguQmlnSW50ZWdlcgotamF2YS5tYXRoLkJpZ0ludGVnZXIKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1qYXZhLm1hdGguQmlnSW50ZWdlcgotamF2YS5tYXRoLkJpZ0ludGVnZXIKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1qYXZhLm1hdGguQmlnSW50ZWdlcgotamF2YS5tYXRoLkJpZ0ludGVnZXIpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRDcnRDb2VmZmljaWVudCgpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRQcmltZUV4cG9uZW50UCgpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRQcmltZUV4cG9uZW50USgpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRQcmltZVAoKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgZ2V0UHJpbWVRKCkKLQotcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldFB1YmxpY0V4cG9uZW50KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLnNlY3VyaXR5LnNwZWMuUlNBUHVibGljS2V5U3BlYyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnNlY3VyaXR5LnNwZWMuS2V5U3BlYwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGphdmEubWF0aC5CaWdJbnRlZ2VyIG1vZHVsdXMKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLm1hdGguQmlnSW50ZWdlciBwdWJsaWNFeHBvbmVudAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1qYXZhLm1hdGguQmlnSW50ZWdlcikKLQotcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldE1vZHVsdXMoKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgZ2V0UHVibGljRXhwb25lbnQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEuc2VjdXJpdHkuc3BlYy5YNTA5RW5jb2RlZEtleVNwZWMgZXh0ZW5kcyBqYXZhLnNlY3VyaXR5LnNwZWMuRW5jb2RlZEtleVNwZWMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ieXRlW10pCi0KLXB1YmxpYyBieXRlW10gZ2V0RW5jb2RlZCgpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGdldEZvcm1hdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEuc3FsLkFycmF5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5PYmplY3QgZ2V0QXJyYXkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuT2JqZWN0IGdldEFycmF5KAotbG9uZwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSklMamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL0NsYXNzPCo+Oz47KUxqYXZhL2xhbmcvT2JqZWN0OyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLk9iamVjdCBnZXRBcnJheSgKLWxvbmcKLWludAotamF2YS51dGlsLk1hcCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9DbGFzczwqPjs+OylMamF2YS9sYW5nL09iamVjdDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuT2JqZWN0IGdldEFycmF5KAotamF2YS51dGlsLk1hcCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldEJhc2VUeXBlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRCYXNlVHlwZU5hbWUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnNxbC5SZXN1bHRTZXQgZ2V0UmVzdWx0U2V0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zcWwuUmVzdWx0U2V0IGdldFJlc3VsdFNldCgKLWxvbmcKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KEpJTGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9DbGFzczwqPjs+OylMamF2YS9zcWwvUmVzdWx0U2V0OyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zcWwuUmVzdWx0U2V0IGdldFJlc3VsdFNldCgKLWxvbmcKLWludAotamF2YS51dGlsLk1hcCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvQ2xhc3M8Kj47PjspTGphdmEvc3FsL1Jlc3VsdFNldDsgKQotcHVibGljIGFic3RyYWN0IGphdmEuc3FsLlJlc3VsdFNldCBnZXRSZXN1bHRTZXQoCi1qYXZhLnV0aWwuTWFwKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEuc3FsLlNRTEV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5FeGNlcHRpb24gaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIFNRTFN0YXRlCi0KLXByaXZhdGUgamF2YS5zcWwuU1FMRXhjZXB0aW9uIG5leHQKLQotcHJpdmF0ZSBpbnQgdmVuZG9yQ29kZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIGludCBnZXRFcnJvckNvZGUoKQotCi1wdWJsaWMgamF2YS5zcWwuU1FMRXhjZXB0aW9uIGdldE5leHRFeGNlcHRpb24oKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTUUxTdGF0ZSgpCi0KLXB1YmxpYyB2b2lkIHNldE5leHRFeGNlcHRpb24oCi1qYXZhLnNxbC5TUUxFeGNlcHRpb24pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5zcWwuQmF0Y2hVcGRhdGVFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLnNxbC5TUUxFeGNlcHRpb24gaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSBpbnRbXSB1cGRhdGVDb3VudHMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludFtdKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnRbXSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50W10pCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludFtdKQotCi1wdWJsaWMgaW50W10gZ2V0VXBkYXRlQ291bnRzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgamF2YS5zcWwuQmxvYiBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmlvLklucHV0U3RyZWFtIGdldEJpbmFyeVN0cmVhbSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJ5dGVbXSBnZXRCeXRlcygKLWxvbmcKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgbG9uZyBsZW5ndGgoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBsb25nIHBvc2l0aW9uKAotamF2YS5zcWwuQmxvYgotbG9uZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgbG9uZyBwb3NpdGlvbigKLWJ5dGVbXQotbG9uZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5pby5PdXRwdXRTdHJlYW0gc2V0QmluYXJ5U3RyZWFtKAotbG9uZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IHNldEJ5dGVzKAotbG9uZwotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgc2V0Qnl0ZXMoCi1sb25nCi1ieXRlW10KLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHRydW5jYXRlKAotbG9uZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgamF2YS5zcWwuQ2FsbGFibGVTdGF0ZW1lbnQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zcWwuUHJlcGFyZWRTdGF0ZW1lbnQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnNxbC5BcnJheSBnZXRBcnJheSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zcWwuQXJyYXkgZ2V0QXJyYXkoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm1hdGguQmlnRGVjaW1hbCBnZXRCaWdEZWNpbWFsKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLUBqYXZhLmxhbmcuRGVwcmVjYXRlZAotcHVibGljIGFic3RyYWN0IGphdmEubWF0aC5CaWdEZWNpbWFsIGdldEJpZ0RlY2ltYWwoCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5tYXRoLkJpZ0RlY2ltYWwgZ2V0QmlnRGVjaW1hbCgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEuc3FsLkJsb2IgZ2V0QmxvYigKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zcWwuQmxvYiBnZXRCbG9iKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBnZXRCb29sZWFuKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGdldEJvb2xlYW4oCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBieXRlIGdldEJ5dGUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJ5dGUgZ2V0Qnl0ZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJ5dGVbXSBnZXRCeXRlcygKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYnl0ZVtdIGdldEJ5dGVzKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zcWwuQ2xvYiBnZXRDbG9iKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnNxbC5DbG9iIGdldENsb2IoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnNxbC5EYXRlIGdldERhdGUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEuc3FsLkRhdGUgZ2V0RGF0ZSgKLWludAotamF2YS51dGlsLkNhbGVuZGFyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnNxbC5EYXRlIGdldERhdGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnNxbC5EYXRlIGdldERhdGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnV0aWwuQ2FsZW5kYXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGRvdWJsZSBnZXREb3VibGUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGRvdWJsZSBnZXREb3VibGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBmbG9hdCBnZXRGbG9hdCgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgZmxvYXQgZ2V0RmxvYXQoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0SW50KAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0SW50KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgbG9uZyBnZXRMb25nKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBsb25nIGdldExvbmcoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuT2JqZWN0IGdldE9iamVjdCgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KElMamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL0NsYXNzPCo+Oz47KUxqYXZhL2xhbmcvT2JqZWN0OyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLk9iamVjdCBnZXRPYmplY3QoCi1pbnQKLWphdmEudXRpbC5NYXApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5PYmplY3QgZ2V0T2JqZWN0KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9DbGFzczwqPjs+OylMamF2YS9sYW5nL09iamVjdDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuT2JqZWN0IGdldE9iamVjdCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudXRpbC5NYXApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEuc3FsLlJlZiBnZXRSZWYoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEuc3FsLlJlZiBnZXRSZWYoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBzaG9ydCBnZXRTaG9ydCgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgc2hvcnQgZ2V0U2hvcnQoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRTdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnNxbC5UaW1lIGdldFRpbWUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEuc3FsLlRpbWUgZ2V0VGltZSgKLWludAotamF2YS51dGlsLkNhbGVuZGFyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnNxbC5UaW1lIGdldFRpbWUoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnNxbC5UaW1lIGdldFRpbWUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnV0aWwuQ2FsZW5kYXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEuc3FsLlRpbWVzdGFtcCBnZXRUaW1lc3RhbXAoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEuc3FsLlRpbWVzdGFtcCBnZXRUaW1lc3RhbXAoCi1pbnQKLWphdmEudXRpbC5DYWxlbmRhcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zcWwuVGltZXN0YW1wIGdldFRpbWVzdGFtcCgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEuc3FsLlRpbWVzdGFtcCBnZXRUaW1lc3RhbXAoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnV0aWwuQ2FsZW5kYXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubmV0LlVSTCBnZXRVUkwoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubmV0LlVSTCBnZXRVUkwoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlZ2lzdGVyT3V0UGFyYW1ldGVyKAotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgcmVnaXN0ZXJPdXRQYXJhbWV0ZXIoCi1pbnQKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlZ2lzdGVyT3V0UGFyYW1ldGVyKAotaW50Ci1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgcmVnaXN0ZXJPdXRQYXJhbWV0ZXIoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgcmVnaXN0ZXJPdXRQYXJhbWV0ZXIoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCByZWdpc3Rlck91dFBhcmFtZXRlcigKLWphdmEubGFuZy5TdHJpbmcKLWludAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRBc2NpaVN0cmVhbSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEuaW8uSW5wdXRTdHJlYW0KLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRCaWdEZWNpbWFsKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5tYXRoLkJpZ0RlY2ltYWwpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0QmluYXJ5U3RyZWFtKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5pby5JbnB1dFN0cmVhbQotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEJvb2xlYW4oCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEJ5dGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1ieXRlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEJ5dGVzKAotamF2YS5sYW5nLlN0cmluZwotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldENoYXJhY3RlclN0cmVhbSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEuaW8uUmVhZGVyCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RGF0ZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEuc3FsLkRhdGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RGF0ZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEuc3FsLkRhdGUKLWphdmEudXRpbC5DYWxlbmRhcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXREb3VibGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1kb3VibGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RmxvYXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1mbG9hdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRJbnQoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0TG9uZygKLWphdmEubGFuZy5TdHJpbmcKLWxvbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0TnVsbCgKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXROdWxsKAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldE9iamVjdCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0T2JqZWN0KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLk9iamVjdAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldE9iamVjdCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3QKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFNob3J0KAotamF2YS5sYW5nLlN0cmluZwotc2hvcnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0U3RyaW5nKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRUaW1lKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5zcWwuVGltZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRUaW1lKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5zcWwuVGltZQotamF2YS51dGlsLkNhbGVuZGFyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFRpbWVzdGFtcCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEuc3FsLlRpbWVzdGFtcCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRUaW1lc3RhbXAoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnNxbC5UaW1lc3RhbXAKLWphdmEudXRpbC5DYWxlbmRhcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRVUkwoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLm5ldC5VUkwpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gd2FzTnVsbCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEuc3FsLkNsb2IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5pby5JbnB1dFN0cmVhbSBnZXRBc2NpaVN0cmVhbSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEuaW8uUmVhZGVyIGdldENoYXJhY3RlclN0cmVhbSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0U3ViU3RyaW5nKAotbG9uZwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBsb25nIGxlbmd0aCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGxvbmcgcG9zaXRpb24oCi1qYXZhLmxhbmcuU3RyaW5nCi1sb25nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBsb25nIHBvc2l0aW9uKAotamF2YS5zcWwuQ2xvYgotbG9uZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5pby5PdXRwdXRTdHJlYW0gc2V0QXNjaWlTdHJlYW0oCi1sb25nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmlvLldyaXRlciBzZXRDaGFyYWN0ZXJTdHJlYW0oCi1sb25nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgc2V0U3RyaW5nKAotbG9uZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IHNldFN0cmluZygKLWxvbmcKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHRydW5jYXRlKAotbG9uZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLnNxbC5TUUxXYXJuaW5nIGV4dGVuZHMgamF2YS5zcWwuU1FMRXhjZXB0aW9uIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgamF2YS5zcWwuU1FMV2FybmluZyBnZXROZXh0V2FybmluZygpCi0KLXB1YmxpYyB2b2lkIHNldE5leHRXYXJuaW5nKAotamF2YS5zcWwuU1FMV2FybmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLnNxbC5EYXRhVHJ1bmNhdGlvbiBleHRlbmRzIGphdmEuc3FsLlNRTFdhcm5pbmcgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEhFX0VSUk9SX0NPREUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBUSEVfUkVBU09OCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEhFX1NRTFNUQVRFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotCi1wcml2YXRlIGludCBkYXRhU2l6ZQotCi1wcml2YXRlIGludCBpbmRleAotCi1wcml2YXRlIGJvb2xlYW4gcGFyYW1ldGVyCi0KLXByaXZhdGUgYm9vbGVhbiByZWFkCi0KLXByaXZhdGUgaW50IHRyYW5zZmVyU2l6ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotYm9vbGVhbgotYm9vbGVhbgotaW50Ci1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0RGF0YVNpemUoKQotCi1wdWJsaWMgaW50IGdldEluZGV4KCkKLQotcHVibGljIGJvb2xlYW4gZ2V0UGFyYW1ldGVyKCkKLQotcHVibGljIGJvb2xlYW4gZ2V0UmVhZCgpCi0KLXB1YmxpYyBpbnQgZ2V0VHJhbnNmZXJTaXplKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvaW8vU2VyaWFsaXphYmxlO0xqYXZhL2xhbmcvQ2xvbmVhYmxlO0xqYXZhL2xhbmcvQ29tcGFyYWJsZTxMamF2YS91dGlsL0RhdGU7PjsgKQotcHVibGljIGNsYXNzIGphdmEudXRpbC5EYXRlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlLCBqYXZhLmxhbmcuQ2xvbmVhYmxlLCBqYXZhLmxhbmcuQ29tcGFyYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBpbnQgY3JlYXRpb25ZZWFyCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotCi1wcml2YXRlIHRyYW5zaWVudCBsb25nIG1pbGxpc2Vjb25kcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBqYXZhLmxhbmcuRGVwcmVjYXRlZAotcHVibGljIHZvaWQgPGluaXQ+KAotaW50Ci1pbnQKLWludCkKLUBqYXZhLmxhbmcuRGVwcmVjYXRlZAotcHVibGljIHZvaWQgPGluaXQ+KAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQpCi1AamF2YS5sYW5nLkRlcHJlY2F0ZWQKLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWxvbmcpCi1AamF2YS5sYW5nLkRlcHJlY2F0ZWQKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi1AamF2YS5sYW5nLkRlcHJlY2F0ZWQKLXB1YmxpYyBzdGF0aWMgbG9uZyBVVEMoCi1pbnQKLWludAotaW50Ci1pbnQKLWludAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBpbnQgcGFyc2UoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nW10pCi1AamF2YS5sYW5nLkRlcHJlY2F0ZWQKLXB1YmxpYyBzdGF0aWMgbG9uZyBwYXJzZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgcmVhZE9iamVjdCgKLWphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCB3cml0ZU9iamVjdCgKLWphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtKQotCi1wcml2YXRlIHN0YXRpYyBpbnQgem9uZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBib29sZWFuIGFmdGVyKAotamF2YS51dGlsLkRhdGUpCi0KLXB1YmxpYyBib29sZWFuIGJlZm9yZSgKLWphdmEudXRpbC5EYXRlKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBjbG9uZSgpCi0KLXB1YmxpYyB2b2xhdGlsZSBpbnQgY29tcGFyZVRvKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGludCBjb21wYXJlVG8oCi1qYXZhLnV0aWwuRGF0ZSkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLUBqYXZhLmxhbmcuRGVwcmVjYXRlZAotcHVibGljIGludCBnZXREYXRlKCkKLUBqYXZhLmxhbmcuRGVwcmVjYXRlZAotcHVibGljIGludCBnZXREYXkoKQotQGphdmEubGFuZy5EZXByZWNhdGVkCi1wdWJsaWMgaW50IGdldEhvdXJzKCkKLUBqYXZhLmxhbmcuRGVwcmVjYXRlZAotcHVibGljIGludCBnZXRNaW51dGVzKCkKLUBqYXZhLmxhbmcuRGVwcmVjYXRlZAotcHVibGljIGludCBnZXRNb250aCgpCi1AamF2YS5sYW5nLkRlcHJlY2F0ZWQKLXB1YmxpYyBpbnQgZ2V0U2Vjb25kcygpCi0KLXB1YmxpYyBsb25nIGdldFRpbWUoKQotQGphdmEubGFuZy5EZXByZWNhdGVkCi1wdWJsaWMgaW50IGdldFRpbWV6b25lT2Zmc2V0KCkKLUBqYXZhLmxhbmcuRGVwcmVjYXRlZAotcHVibGljIGludCBnZXRZZWFyKCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi1AamF2YS5sYW5nLkRlcHJlY2F0ZWQKLXB1YmxpYyB2b2lkIHNldERhdGUoCi1pbnQpCi1AamF2YS5sYW5nLkRlcHJlY2F0ZWQKLXB1YmxpYyB2b2lkIHNldEhvdXJzKAotaW50KQotQGphdmEubGFuZy5EZXByZWNhdGVkCi1wdWJsaWMgdm9pZCBzZXRNaW51dGVzKAotaW50KQotQGphdmEubGFuZy5EZXByZWNhdGVkCi1wdWJsaWMgdm9pZCBzZXRNb250aCgKLWludCkKLUBqYXZhLmxhbmcuRGVwcmVjYXRlZAotcHVibGljIHZvaWQgc2V0U2Vjb25kcygKLWludCkKLQotcHVibGljIHZvaWQgc2V0VGltZSgKLWxvbmcpCi1AamF2YS5sYW5nLkRlcHJlY2F0ZWQKLXB1YmxpYyB2b2lkIHNldFllYXIoCi1pbnQpCi1AamF2YS5sYW5nLkRlcHJlY2F0ZWQKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvR01UU3RyaW5nKCkKLUBqYXZhLmxhbmcuRGVwcmVjYXRlZAotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9Mb2NhbGVTdHJpbmcoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5zcWwuRGF0ZSBleHRlbmRzIGphdmEudXRpbC5EYXRlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AamF2YS5sYW5nLkRlcHJlY2F0ZWQKLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWxvbmcpCi0KLXByaXZhdGUgc3RhdGljIGxvbmcgbm9ybWFsaXplVGltZSgKLWxvbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5zcWwuRGF0ZSB2YWx1ZU9mKAotamF2YS5sYW5nLlN0cmluZykKLUBqYXZhLmxhbmcuRGVwcmVjYXRlZAotcHVibGljIGludCBnZXRIb3VycygpCi1AamF2YS5sYW5nLkRlcHJlY2F0ZWQKLXB1YmxpYyBpbnQgZ2V0TWludXRlcygpCi1AamF2YS5sYW5nLkRlcHJlY2F0ZWQKLXB1YmxpYyBpbnQgZ2V0U2Vjb25kcygpCi1AamF2YS5sYW5nLkRlcHJlY2F0ZWQKLXB1YmxpYyB2b2lkIHNldEhvdXJzKAotaW50KQotQGphdmEubGFuZy5EZXByZWNhdGVkCi1wdWJsaWMgdm9pZCBzZXRNaW51dGVzKAotaW50KQotQGphdmEubGFuZy5EZXByZWNhdGVkCi1wdWJsaWMgdm9pZCBzZXRTZWNvbmRzKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRUaW1lKAotbG9uZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEuc3FsLkRyaXZlck1hbmFnZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEuc3FsLlNRTFBlcm1pc3Npb24gbG9nUGVybWlzc2lvbgotCi1wcml2YXRlIHN0YXRpYyBpbnQgbG9naW5UaW1lb3V0Ci1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9TZXQ8TGphdmEvc3FsL0RyaXZlcjs+OyApCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuU2V0IHRoZURyaXZlclNldAotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmlvLlByaW50U3RyZWFtIHRoZVByaW50U3RyZWFtCi0KLXByaXZhdGUgc3RhdGljIGphdmEuaW8uUHJpbnRXcml0ZXIgdGhlUHJpbnRXcml0ZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrTG9nU2VjdXJpdHkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgdm9pZCBkZXJlZ2lzdGVyRHJpdmVyKAotamF2YS5zcWwuRHJpdmVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgamF2YS5zcWwuQ29ubmVjdGlvbiBnZXRDb25uZWN0aW9uKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGphdmEuc3FsLkNvbm5lY3Rpb24gZ2V0Q29ubmVjdGlvbigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBqYXZhLnNxbC5Db25uZWN0aW9uIGdldENvbm5lY3Rpb24oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnV0aWwuUHJvcGVydGllcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGphdmEuc3FsLkRyaXZlciBnZXREcml2ZXIoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9FbnVtZXJhdGlvbjxMamF2YS9zcWwvRHJpdmVyOz47ICkKLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLkVudW1lcmF0aW9uIGdldERyaXZlcnMoKQotQGphdmEubGFuZy5EZXByZWNhdGVkCi1wdWJsaWMgc3RhdGljIGphdmEuaW8uUHJpbnRTdHJlYW0gZ2V0TG9nU3RyZWFtKCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmlvLlByaW50V3JpdGVyIGdldExvZ1dyaXRlcigpCi0KLXB1YmxpYyBzdGF0aWMgaW50IGdldExvZ2luVGltZW91dCgpCi0KLXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDbGFzc0Zyb21DbGFzc0xvYWRlcigKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5DbGFzc0xvYWRlcikKLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2FkSW5pdGlhbERyaXZlcnMoKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRsbigKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyRHJpdmVyKAotamF2YS5zcWwuRHJpdmVyKQotQGphdmEubGFuZy5EZXByZWNhdGVkCi1wdWJsaWMgc3RhdGljIHZvaWQgc2V0TG9nU3RyZWFtKAotamF2YS5pby5QcmludFN0cmVhbSkKLQotcHVibGljIHN0YXRpYyB2b2lkIHNldExvZ1dyaXRlcigKLWphdmEuaW8uUHJpbnRXcml0ZXIpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRMb2dpblRpbWVvdXQoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS5zcWwuRHJpdmVyUHJvcGVydHlJbmZvIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIGNob2ljZXMKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZGVzY3JpcHRpb24KLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgbmFtZQotCi1wdWJsaWMgYm9vbGVhbiByZXF1aXJlZAotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB2YWx1ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEuc3FsLlBhcmFtZXRlck1ldGFEYXRhIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwYXJhbWV0ZXJNb2RlSW4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGFyYW1ldGVyTW9kZUluT3V0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBhcmFtZXRlck1vZGVPdXQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGFyYW1ldGVyTW9kZVVua25vd24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGFyYW1ldGVyTm9OdWxscwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwYXJhbWV0ZXJOdWxsYWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBwYXJhbWV0ZXJOdWxsYWJsZVVua25vd24KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldFBhcmFtZXRlckNsYXNzTmFtZSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldFBhcmFtZXRlckNvdW50KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldFBhcmFtZXRlck1vZGUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCBnZXRQYXJhbWV0ZXJUeXBlKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldFBhcmFtZXRlclR5cGVOYW1lKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0UHJlY2lzaW9uKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0U2NhbGUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCBpc051bGxhYmxlKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzU2lnbmVkKAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZhLnNxbC5SZWYgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRCYXNlVHlwZU5hbWUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuT2JqZWN0IGdldE9iamVjdCgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvQ2xhc3M8Kj47PjspTGphdmEvbGFuZy9PYmplY3Q7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLk9iamVjdCBnZXRPYmplY3QoCi1qYXZhLnV0aWwuTWFwKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldE9iamVjdCgKLWphdmEubGFuZy5PYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEuc3FsLlNRTERhdGEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRTUUxUeXBlTmFtZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgcmVhZFNRTCgKLWphdmEuc3FsLlNRTElucHV0Ci1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlU1FMKAotamF2YS5zcWwuU1FMT3V0cHV0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZhLnNxbC5TUUxJbnB1dCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnNxbC5BcnJheSByZWFkQXJyYXkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmlvLklucHV0U3RyZWFtIHJlYWRBc2NpaVN0cmVhbSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubWF0aC5CaWdEZWNpbWFsIHJlYWRCaWdEZWNpbWFsKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5pby5JbnB1dFN0cmVhbSByZWFkQmluYXJ5U3RyZWFtKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zcWwuQmxvYiByZWFkQmxvYigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gcmVhZEJvb2xlYW4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBieXRlIHJlYWRCeXRlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYnl0ZVtdIHJlYWRCeXRlcygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEuaW8uUmVhZGVyIHJlYWRDaGFyYWN0ZXJTdHJlYW0oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnNxbC5DbG9iIHJlYWRDbG9iKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zcWwuRGF0ZSByZWFkRGF0ZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGRvdWJsZSByZWFkRG91YmxlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgZmxvYXQgcmVhZEZsb2F0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IHJlYWRJbnQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBsb25nIHJlYWRMb25nKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLk9iamVjdCByZWFkT2JqZWN0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zcWwuUmVmIHJlYWRSZWYoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBzaG9ydCByZWFkU2hvcnQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIHJlYWRTdHJpbmcoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnNxbC5UaW1lIHJlYWRUaW1lKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zcWwuVGltZXN0YW1wIHJlYWRUaW1lc3RhbXAoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm5ldC5VUkwgcmVhZFVSTCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gd2FzTnVsbCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEuc3FsLlNRTE91dHB1dCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlQXJyYXkoCi1qYXZhLnNxbC5BcnJheSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZUFzY2lpU3RyZWFtKAotamF2YS5pby5JbnB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZUJpZ0RlY2ltYWwoCi1qYXZhLm1hdGguQmlnRGVjaW1hbCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZUJpbmFyeVN0cmVhbSgKLWphdmEuaW8uSW5wdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVCbG9iKAotamF2YS5zcWwuQmxvYikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZUJvb2xlYW4oCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlQnl0ZSgKLWJ5dGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVCeXRlcygKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZUNoYXJhY3RlclN0cmVhbSgKLWphdmEuaW8uUmVhZGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlQ2xvYigKLWphdmEuc3FsLkNsb2IpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVEYXRlKAotamF2YS5zcWwuRGF0ZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZURvdWJsZSgKLWRvdWJsZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZUZsb2F0KAotZmxvYXQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVJbnQoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVMb25nKAotbG9uZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZU9iamVjdCgKLWphdmEuc3FsLlNRTERhdGEpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVSZWYoCi1qYXZhLnNxbC5SZWYpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVTaG9ydCgKLXNob3J0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlU3RyaW5nKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZVN0cnVjdCgKLWphdmEuc3FsLlN0cnVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZVRpbWUoCi1qYXZhLnNxbC5UaW1lKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlVGltZXN0YW1wKAotamF2YS5zcWwuVGltZXN0YW1wKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlVVJMKAotamF2YS5uZXQuVVJMKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIGphdmEuc3FsLlNRTFBlcm1pc3Npb24gZXh0ZW5kcyBqYXZhLnNlY3VyaXR5LkJhc2ljUGVybWlzc2lvbiBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuR3VhcmQsIGphdmEuaW8uU2VyaWFsaXphYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEuc3FsLlNhdmVwb2ludCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0U2F2ZXBvaW50SWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldFNhdmVwb2ludE5hbWUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZhLnNxbC5TdHJ1Y3QgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLk9iamVjdFtdIGdldEF0dHJpYnV0ZXMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9DbGFzczwqPjs+OylbTGphdmEvbGFuZy9PYmplY3Q7ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuT2JqZWN0W10gZ2V0QXR0cmlidXRlcygKLWphdmEudXRpbC5NYXApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0U1FMVHlwZU5hbWUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEuc3FsLlRpbWUgZXh0ZW5kcyBqYXZhLnV0aWwuRGF0ZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGphdmEubGFuZy5EZXByZWNhdGVkCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1sb25nKQotCi1wdWJsaWMgc3RhdGljIGphdmEuc3FsLlRpbWUgdmFsdWVPZigKLWphdmEubGFuZy5TdHJpbmcpCi1AamF2YS5sYW5nLkRlcHJlY2F0ZWQKLXB1YmxpYyBpbnQgZ2V0RGF0ZSgpCi1AamF2YS5sYW5nLkRlcHJlY2F0ZWQKLXB1YmxpYyBpbnQgZ2V0RGF5KCkKLUBqYXZhLmxhbmcuRGVwcmVjYXRlZAotcHVibGljIGludCBnZXRNb250aCgpCi1AamF2YS5sYW5nLkRlcHJlY2F0ZWQKLXB1YmxpYyBpbnQgZ2V0WWVhcigpCi1AamF2YS5sYW5nLkRlcHJlY2F0ZWQKLXB1YmxpYyB2b2lkIHNldERhdGUoCi1pbnQpCi1AamF2YS5sYW5nLkRlcHJlY2F0ZWQKLXB1YmxpYyB2b2lkIHNldE1vbnRoKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRUaW1lKAotbG9uZykKLUBqYXZhLmxhbmcuRGVwcmVjYXRlZAotcHVibGljIHZvaWQgc2V0WWVhcigKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEuc3FsLlRpbWVzdGFtcCBleHRlbmRzIGphdmEudXRpbC5EYXRlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotCi1wcml2YXRlIGludCBuYW5vcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AamF2YS5sYW5nLkRlcHJlY2F0ZWQKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1sb25nKQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZm9ybWF0KAotaW50Ci1pbnQpCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBzdHJpcFRyYWlsaW5nWmVyb3MoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGphdmEuc3FsLlRpbWVzdGFtcCB2YWx1ZU9mKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJvb2xlYW4gYWZ0ZXIoCi1qYXZhLnNxbC5UaW1lc3RhbXApCi0KLXB1YmxpYyBib29sZWFuIGJlZm9yZSgKLWphdmEuc3FsLlRpbWVzdGFtcCkKLQotcHVibGljIHZvbGF0aWxlIGludCBjb21wYXJlVG8oCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50IGNvbXBhcmVUbygKLWphdmEuc3FsLlRpbWVzdGFtcCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0NsYXNzQ2FzdEV4Y2VwdGlvbjsgKQotcHVibGljIGludCBjb21wYXJlVG8oCi1qYXZhLnV0aWwuRGF0ZSkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5zcWwuVGltZXN0YW1wKQotCi1wdWJsaWMgaW50IGdldE5hbm9zKCkKLQotcHVibGljIGxvbmcgZ2V0VGltZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldE5hbm9zKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRUaW1lKAotbG9uZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEuc3FsLlR5cGVzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUlJBWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCSUdJTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklOQVJZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJJVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCTE9CCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJPT0xFQU4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hBUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTE9CCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERBVEFMSU5LCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERBVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVDSU1BTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVNUSU5DVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBET1VCTEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxPQVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URUdFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBKQVZBX09CSkVDVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT05HVkFSQklOQVJZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPTkdWQVJDSEFSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5VTEwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTlVNRVJJQwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPVEhFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUFMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFRgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTTUFMTElOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVFJVQ1QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVElNRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUSU1FU1RBTVAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVElOWUlOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQVJCSU5BUlkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkFSQ0hBUgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEudGV4dC5Bbm5vdGF0aW9uIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEubGFuZy5PYmplY3QgdmFsdWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRWYWx1ZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgamF2YS50ZXh0LkNoYXJhY3Rlckl0ZXJhdG9yIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5DbG9uZWFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIERPTkUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLk9iamVjdCBjbG9uZSgpCi0KLXB1YmxpYyBhYnN0cmFjdCBjaGFyIGN1cnJlbnQoKQotCi1wdWJsaWMgYWJzdHJhY3QgY2hhciBmaXJzdCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0QmVnaW5JbmRleCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0RW5kSW5kZXgoKQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldEluZGV4KCkKLQotcHVibGljIGFic3RyYWN0IGNoYXIgbGFzdCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBjaGFyIG5leHQoKQotCi1wdWJsaWMgYWJzdHJhY3QgY2hhciBwcmV2aW91cygpCi0KLXB1YmxpYyBhYnN0cmFjdCBjaGFyIHNldEluZGV4KAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGphdmEvdGV4dC9BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IkQXR0cmlidXRlOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEudGV4dC5BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS50ZXh0LkNoYXJhY3Rlckl0ZXJhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvU2V0PExqYXZhL3RleHQvQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yJEF0dHJpYnV0ZTs+OyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLlNldCBnZXRBbGxBdHRyaWJ1dGVLZXlzKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5PYmplY3QgZ2V0QXR0cmlidXRlKAotamF2YS50ZXh0LkF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvciRBdHRyaWJ1dGUpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL01hcDxMamF2YS90ZXh0L0F0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvciRBdHRyaWJ1dGU7TGphdmEvbGFuZy9PYmplY3Q7PjsgKQotcHVibGljIGFic3RyYWN0IGphdmEudXRpbC5NYXAgZ2V0QXR0cmlidXRlcygpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0UnVuTGltaXQoKQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldFJ1bkxpbWl0KAotamF2YS50ZXh0LkF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvciRBdHRyaWJ1dGUpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvU2V0PCtMamF2YS90ZXh0L0F0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvciRBdHRyaWJ1dGU7PjspSSApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldFJ1bkxpbWl0KAotamF2YS51dGlsLlNldCkKLQotcHVibGljIGFic3RyYWN0IGludCBnZXRSdW5TdGFydCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0UnVuU3RhcnQoCi1qYXZhLnRleHQuQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yJEF0dHJpYnV0ZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9TZXQ8K0xqYXZhL3RleHQvQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yJEF0dHJpYnV0ZTs+OylJICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0UnVuU3RhcnQoCi1qYXZhLnV0aWwuU2V0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1BdHRyaWJ1dGVkSXRlcmF0b3IgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdGV4dC9BdHRyaWJ1dGVkU3RyaW5nOyApCi0gY2xhc3MgamF2YS50ZXh0LkF0dHJpYnV0ZWRTdHJpbmckQXR0cmlidXRlZEl0ZXJhdG9yIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudGV4dC5BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLnRleHQuQXR0cmlidXRlZFN0cmluZyBhdHRyU3RyaW5nCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNoU2V0PExqYXZhL3RleHQvQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yJEF0dHJpYnV0ZTs+OyApCi1wcml2YXRlIGphdmEudXRpbC5IYXNoU2V0IGF0dHJpYnV0ZXNBbGxvd2VkCi0KLXByaXZhdGUgaW50IGJlZ2luCi0KLXByaXZhdGUgaW50IGVuZAotCi1wcml2YXRlIGludCBvZmZzZXQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnRleHQuQXR0cmlidXRlZFN0cmluZykKLQotIHZvaWQgPGluaXQ+KAotamF2YS50ZXh0LkF0dHJpYnV0ZWRTdHJpbmcKLWphdmEudGV4dC5BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IkQXR0cmlidXRlW10KLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0xpc3Q8TGphdmEvdGV4dC9BdHRyaWJ1dGVkU3RyaW5nJFJhbmdlOz47KUxqYXZhL2xhbmcvT2JqZWN0OyApCi1wcml2YXRlIGphdmEubGFuZy5PYmplY3QgY3VycmVudFZhbHVlKAotamF2YS51dGlsLkxpc3QpCi0KLXByaXZhdGUgYm9vbGVhbiBpblJhbmdlKAotamF2YS50ZXh0LkF0dHJpYnV0ZWRTdHJpbmckUmFuZ2UpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTGlzdDxMamF2YS90ZXh0L0F0dHJpYnV0ZWRTdHJpbmckUmFuZ2U7PjspWiApCi1wcml2YXRlIGJvb2xlYW4gaW5SYW5nZSgKLWphdmEudXRpbC5MaXN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0xpc3Q8TGphdmEvdGV4dC9BdHRyaWJ1dGVkU3RyaW5nJFJhbmdlOz47KUkgKQotcHJpdmF0ZSBpbnQgcnVuTGltaXQoCi1qYXZhLnV0aWwuTGlzdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9MaXN0PExqYXZhL3RleHQvQXR0cmlidXRlZFN0cmluZyRSYW5nZTs+OylJICkKLXByaXZhdGUgaW50IHJ1blN0YXJ0KAotamF2YS51dGlsLkxpc3QpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGNsb25lKCkKLQotcHVibGljIGNoYXIgY3VycmVudCgpCi0KLXB1YmxpYyBjaGFyIGZpcnN0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvU2V0PExqYXZhL3RleHQvQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yJEF0dHJpYnV0ZTs+OyApCi1wdWJsaWMgamF2YS51dGlsLlNldCBnZXRBbGxBdHRyaWJ1dGVLZXlzKCkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0QXR0cmlidXRlKAotamF2YS50ZXh0LkF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvciRBdHRyaWJ1dGUpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL01hcDxMamF2YS90ZXh0L0F0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvciRBdHRyaWJ1dGU7TGphdmEvbGFuZy9PYmplY3Q7PjsgKQotcHVibGljIGphdmEudXRpbC5NYXAgZ2V0QXR0cmlidXRlcygpCi0KLXB1YmxpYyBpbnQgZ2V0QmVnaW5JbmRleCgpCi0KLXB1YmxpYyBpbnQgZ2V0RW5kSW5kZXgoKQotCi1wdWJsaWMgaW50IGdldEluZGV4KCkKLQotcHVibGljIGludCBnZXRSdW5MaW1pdCgpCi0KLXB1YmxpYyBpbnQgZ2V0UnVuTGltaXQoCi1qYXZhLnRleHQuQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yJEF0dHJpYnV0ZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9TZXQ8K0xqYXZhL3RleHQvQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yJEF0dHJpYnV0ZTs+OylJICkKLXB1YmxpYyBpbnQgZ2V0UnVuTGltaXQoCi1qYXZhLnV0aWwuU2V0KQotCi1wdWJsaWMgaW50IGdldFJ1blN0YXJ0KCkKLQotcHVibGljIGludCBnZXRSdW5TdGFydCgKLWphdmEudGV4dC5BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IkQXR0cmlidXRlKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL1NldDwrTGphdmEvdGV4dC9BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IkQXR0cmlidXRlOz47KUkgKQotcHVibGljIGludCBnZXRSdW5TdGFydCgKLWphdmEudXRpbC5TZXQpCi0KLXB1YmxpYyBjaGFyIGxhc3QoKQotCi1wdWJsaWMgY2hhciBuZXh0KCkKLQotcHVibGljIGNoYXIgcHJldmlvdXMoKQotCi1wdWJsaWMgY2hhciBzZXRJbmRleCgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9UmFuZ2UgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdGV4dC9BdHRyaWJ1dGVkU3RyaW5nOyApCi0gY2xhc3MgamF2YS50ZXh0LkF0dHJpYnV0ZWRTdHJpbmckUmFuZ2UgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBpbnQgZW5kCi0KLSBpbnQgc3RhcnQKLQotIGphdmEubGFuZy5PYmplY3QgdmFsdWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1pbnQKLWludAotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxqYXZhL3RleHQvQXR0cmlidXRlZFN0cmluZyRBdHRyaWJ1dGVkSXRlcmF0b3I7TGphdmEvdGV4dC9BdHRyaWJ1dGVkU3RyaW5nJFJhbmdlOyApCi1wdWJsaWMgY2xhc3MgamF2YS50ZXh0LkF0dHJpYnV0ZWRTdHJpbmcgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9NYXA8TGphdmEvdGV4dC9BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IkQXR0cmlidXRlO0xqYXZhL3V0aWwvTGlzdDxMamF2YS90ZXh0L0F0dHJpYnV0ZWRTdHJpbmckUmFuZ2U7Pjs+OyApCi0gamF2YS51dGlsLk1hcCBhdHRyaWJ1dGVNYXAKLQotIGphdmEubGFuZy5TdHJpbmcgdGV4dAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL3V0aWwvTWFwPCtMamF2YS90ZXh0L0F0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvciRBdHRyaWJ1dGU7Kj47KVYgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotamF2YS51dGlsLk1hcCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS50ZXh0LkF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvcikKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS50ZXh0LkF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvcgotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3RleHQvQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yO0lJTGphdmEvdXRpbC9TZXQ8TGphdmEvdGV4dC9BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IkQXR0cmlidXRlOz47KVYgKQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWphdmEudGV4dC5BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IKLWludAotaW50Ci1qYXZhLnV0aWwuU2V0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnRleHQuQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yCi1pbnQKLWludAotamF2YS50ZXh0LkF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvciRBdHRyaWJ1dGVbXSkKLQotcHVibGljIHZvaWQgYWRkQXR0cmlidXRlKAotamF2YS50ZXh0LkF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvciRBdHRyaWJ1dGUKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2lkIGFkZEF0dHJpYnV0ZSgKLWphdmEudGV4dC5BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IkQXR0cmlidXRlCi1qYXZhLmxhbmcuT2JqZWN0Ci1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9NYXA8K0xqYXZhL3RleHQvQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yJEF0dHJpYnV0ZTsqPjtJSSlWICkKLXB1YmxpYyB2b2lkIGFkZEF0dHJpYnV0ZXMoCi1qYXZhLnV0aWwuTWFwCi1pbnQKLWludCkKLQotcHVibGljIGphdmEudGV4dC5BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IgZ2V0SXRlcmF0b3IoKQotCi1wdWJsaWMgamF2YS50ZXh0LkF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvciBnZXRJdGVyYXRvcigKLWphdmEudGV4dC5BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IkQXR0cmlidXRlW10pCi0KLXB1YmxpYyBqYXZhLnRleHQuQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yIGdldEl0ZXJhdG9yKAotamF2YS50ZXh0LkF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvciRBdHRyaWJ1dGVbXQotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgamF2YS50ZXh0LkJpZGkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJUkVDVElPTl9ERUZBVUxUX0xFRlRfVE9fUklHSFQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElSRUNUSU9OX0RFRkFVTFRfUklHSFRfVE9fTEVGVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVJFQ1RJT05fTEVGVF9UT19SSUdIVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVJFQ1RJT05fUklHSFRfVE9fTEVGVAotCi1wcml2YXRlIGludCBiYXNlTGV2ZWwKLQotcHJpdmF0ZSBpbnQgZGlyZWN0aW9uCi0KLXByaXZhdGUgaW50IGxlbmd0aAotCi1wcml2YXRlIGJ5dGVbXSBvZmZzZXRMZXZlbAotCi1wcml2YXRlIG9yZy5hcGFjaGUuaGFybW9ueS50ZXh0LkJpZGlSdW5bXSBydW5zCi0KLXByaXZhdGUgYm9vbGVhbiB1bmlkaXJlY3Rpb25hbAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1sb25nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEudGV4dC5BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWNoYXJbXQotaW50Ci1ieXRlW10KLWludAotaW50Ci1pbnQpCi0KLXByaXZhdGUgc3RhdGljIGxvbmcgY3JlYXRlVUJpRGkoCi1jaGFyW10KLWludAotYnl0ZVtdCi1pbnQKLWludAotaW50KQotCi1wcml2YXRlIHZvaWQgcmVhZEJpZGlJbmZvKAotbG9uZykKLQotcHVibGljIHN0YXRpYyB2b2lkIHJlb3JkZXJWaXN1YWxseSgKLWJ5dGVbXQotaW50Ci1qYXZhLmxhbmcuT2JqZWN0W10KLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVxdWlyZXNCaWRpKAotY2hhcltdCi1pbnQKLWludCkKLQotcHVibGljIGJvb2xlYW4gYmFzZUlzTGVmdFRvUmlnaHQoKQotCi1wdWJsaWMgamF2YS50ZXh0LkJpZGkgY3JlYXRlTGluZUJpZGkoCi1pbnQKLWludCkKLQotcHVibGljIGludCBnZXRCYXNlTGV2ZWwoKQotCi1wdWJsaWMgaW50IGdldExlbmd0aCgpCi0KLXB1YmxpYyBpbnQgZ2V0TGV2ZWxBdCgKLWludCkKLQotcHVibGljIGludCBnZXRSdW5Db3VudCgpCi0KLXB1YmxpYyBpbnQgZ2V0UnVuTGV2ZWwoCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0UnVuTGltaXQoCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0UnVuU3RhcnQoCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIGlzTGVmdFRvUmlnaHQoKQotCi1wdWJsaWMgYm9vbGVhbiBpc01peGVkKCkKLQotcHVibGljIGJvb2xlYW4gaXNSaWdodFRvTGVmdCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZhLnRleHQuQnJlYWtJdGVyYXRvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmxhbmcuQ2xvbmVhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERPTkUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVF9MRU5HVEgKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExPTkdfTEVOR1RICi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSE9SVF9MRU5HVEgKLQotIGNvbS5pYm0uaWN1NGpuaS50ZXh0LkJyZWFrSXRlcmF0b3Igd3JhcHBlZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigpCi0KLSB2b2lkIDxpbml0PigKLWNvbS5pYm0uaWN1NGpuaS50ZXh0LkJyZWFrSXRlcmF0b3IpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLkxvY2FsZVtdIGdldEF2YWlsYWJsZUxvY2FsZXMoKQotCi1wdWJsaWMgc3RhdGljIGphdmEudGV4dC5CcmVha0l0ZXJhdG9yIGdldENoYXJhY3Rlckluc3RhbmNlKCkKLQotcHVibGljIHN0YXRpYyBqYXZhLnRleHQuQnJlYWtJdGVyYXRvciBnZXRDaGFyYWN0ZXJJbnN0YW5jZSgKLWphdmEudXRpbC5Mb2NhbGUpCi0KLXByb3RlY3RlZCBzdGF0aWMgaW50IGdldEludCgKLWJ5dGVbXQotaW50KQotCi1wdWJsaWMgc3RhdGljIGphdmEudGV4dC5CcmVha0l0ZXJhdG9yIGdldExpbmVJbnN0YW5jZSgpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS50ZXh0LkJyZWFrSXRlcmF0b3IgZ2V0TGluZUluc3RhbmNlKAotamF2YS51dGlsLkxvY2FsZSkKLQotcHJvdGVjdGVkIHN0YXRpYyBsb25nIGdldExvbmcoCi1ieXRlW10KLWludCkKLQotcHVibGljIHN0YXRpYyBqYXZhLnRleHQuQnJlYWtJdGVyYXRvciBnZXRTZW50ZW5jZUluc3RhbmNlKCkKLQotcHVibGljIHN0YXRpYyBqYXZhLnRleHQuQnJlYWtJdGVyYXRvciBnZXRTZW50ZW5jZUluc3RhbmNlKAotamF2YS51dGlsLkxvY2FsZSkKLQotcHJvdGVjdGVkIHN0YXRpYyBzaG9ydCBnZXRTaG9ydCgKLWJ5dGVbXQotaW50KQotCi1wdWJsaWMgc3RhdGljIGphdmEudGV4dC5CcmVha0l0ZXJhdG9yIGdldFdvcmRJbnN0YW5jZSgpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS50ZXh0LkJyZWFrSXRlcmF0b3IgZ2V0V29yZEluc3RhbmNlKAotamF2YS51dGlsLkxvY2FsZSkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgY2xvbmUoKQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGN1cnJlbnQoKQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGZpcnN0KCkKLQotcHVibGljIGFic3RyYWN0IGludCBmb2xsb3dpbmcoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnRleHQuQ2hhcmFjdGVySXRlcmF0b3IgZ2V0VGV4dCgpCi0KLXB1YmxpYyBib29sZWFuIGlzQm91bmRhcnkoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgbGFzdCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgbmV4dCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgbmV4dCgKLWludCkKLQotcHVibGljIGludCBwcmVjZWRpbmcoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgcHJldmlvdXMoKQotCi1wdWJsaWMgdm9pZCBzZXRUZXh0KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0VGV4dCgKLWphdmEudGV4dC5DaGFyYWN0ZXJJdGVyYXRvcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLnRleHQuQ2hvaWNlRm9ybWF0IGV4dGVuZHMgamF2YS50ZXh0Lk51bWJlckZvcm1hdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nW10gY2hvaWNlRm9ybWF0cwotCi1wcml2YXRlIGRvdWJsZVtdIGNob2ljZUxpbWl0cwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWRvdWJsZVtdCi1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgZG91YmxlIG5leHREb3VibGUoCi1kb3VibGUpCi0KLXB1YmxpYyBzdGF0aWMgZG91YmxlIG5leHREb3VibGUoCi1kb3VibGUKLWJvb2xlYW4pCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgZG91YmxlIHByZXZpb3VzRG91YmxlKAotZG91YmxlKQotCi1wcml2YXRlIGludCBza2lwV2hpdGVzcGFjZSgKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIHZvaWQgYXBwbHlQYXR0ZXJuKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgY2xvbmUoKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBmb3JtYXQoCi1kb3VibGUKLWphdmEubGFuZy5TdHJpbmdCdWZmZXIKLWphdmEudGV4dC5GaWVsZFBvc2l0aW9uKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBmb3JtYXQoCi1sb25nCi1qYXZhLmxhbmcuU3RyaW5nQnVmZmVyCi1qYXZhLnRleHQuRmllbGRQb3NpdGlvbikKLQotcHVibGljIGphdmEubGFuZy5PYmplY3RbXSBnZXRGb3JtYXRzKCkKLQotcHVibGljIGRvdWJsZVtdIGdldExpbWl0cygpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1wdWJsaWMgamF2YS5sYW5nLk51bWJlciBwYXJzZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudGV4dC5QYXJzZVBvc2l0aW9uKQotCi1wdWJsaWMgdm9pZCBzZXRDaG9pY2VzKAotZG91YmxlW10KLWphdmEubGFuZy5TdHJpbmdbXSkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9QYXR0ZXJuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBqYXZhLnRleHQuQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBOVUxMT1JERVIKLQotcHJpdmF0ZSBjb20uaWJtLmljdTRqbmkudGV4dC5Db2xsYXRpb25FbGVtZW50SXRlcmF0b3IgaWN1SXRlcmF0b3IKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1jb20uaWJtLmljdTRqbmkudGV4dC5Db2xsYXRpb25FbGVtZW50SXRlcmF0b3IpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByaW1hcnlPcmRlcigKLWludCkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBzZWNvbmRhcnlPcmRlcigKLWludCkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCB0ZXJ0aWFyeU9yZGVyKAotaW50KQotCi1wdWJsaWMgaW50IGdldE1heEV4cGFuc2lvbigKLWludCkKLQotcHVibGljIGludCBnZXRPZmZzZXQoKQotCi1wdWJsaWMgaW50IG5leHQoKQotCi1wdWJsaWMgaW50IHByZXZpb3VzKCkKLQotcHVibGljIHZvaWQgcmVzZXQoKQotCi1wdWJsaWMgdm9pZCBzZXRPZmZzZXQoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldFRleHQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRUZXh0KAotamF2YS50ZXh0LkNoYXJhY3Rlckl0ZXJhdG9yKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL0NvbXBhcmFibGU8TGphdmEvdGV4dC9Db2xsYXRpb25LZXk7PjsgKQotcHVibGljIGZpbmFsIGNsYXNzIGphdmEudGV4dC5Db2xsYXRpb25LZXkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5sYW5nLkNvbXBhcmFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBjb20uaWJtLmljdTRqbmkudGV4dC5Db2xsYXRpb25LZXkgaWN1S2V5Ci0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBzb3VyY2UKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1jb20uaWJtLmljdTRqbmkudGV4dC5Db2xsYXRpb25LZXkpCi0KLXB1YmxpYyB2b2xhdGlsZSBpbnQgY29tcGFyZVRvKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGludCBjb21wYXJlVG8oCi1qYXZhLnRleHQuQ29sbGF0aW9uS2V5KQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTb3VyY2VTdHJpbmcoKQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLQotcHVibGljIGJ5dGVbXSB0b0J5dGVBcnJheSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3V0aWwvQ29tcGFyYXRvcjxMamF2YS9sYW5nL09iamVjdDs+O0xqYXZhL2xhbmcvQ2xvbmVhYmxlOyApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgamF2YS50ZXh0LkNvbGxhdG9yIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudXRpbC5Db21wYXJhdG9yLCBqYXZhLmxhbmcuQ2xvbmVhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGludCBDQUNIRV9TSVpFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBTk9OSUNBTF9ERUNPTVBPU0lUSU9OCi0KLXN0YXRpYyBmaW5hbCBpbnQgRVFVQUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRlVMTF9ERUNPTVBPU0lUSU9OCi0KLXN0YXRpYyBmaW5hbCBpbnQgR1JFQVRFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJREVOVElDQUwKLQotc3RhdGljIGZpbmFsIGludCBMRVNTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PX0RFQ09NUE9TSVRJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJTUFSWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRUNPTkRBUlkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEVSVElBUlkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL1ZlY3RvcjxMamF2YS90ZXh0L0NvbGxhdG9yOz47ICkKLXByaXZhdGUgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgY2FjaGUKLQotIGNvbS5pYm0uaWN1NGpuaS50ZXh0LkNvbGxhdG9yIGljdUNvbGwKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigpCi0KLSB2b2lkIDxpbml0PigKLWNvbS5pYm0uaWN1NGpuaS50ZXh0LkNvbGxhdG9yKQotCi1wcml2YXRlIGludCBkZWNvbXBvc2l0aW9uTW9kZV9JQ1VfSmF2YSgKLWludCkKLQotcHJpdmF0ZSBpbnQgZGVjb21wb3NpdGlvbk1vZGVfSmF2YV9JQ1UoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLkxvY2FsZVtdIGdldEF2YWlsYWJsZUxvY2FsZXMoKQotCi1wdWJsaWMgc3RhdGljIGphdmEudGV4dC5Db2xsYXRvciBnZXRJbnN0YW5jZSgpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS50ZXh0LkNvbGxhdG9yIGdldEluc3RhbmNlKAotamF2YS51dGlsLkxvY2FsZSkKLQotcHJpdmF0ZSBpbnQgc3RyZW5ndGhfSUNVX0phdmEoCi1pbnQpCi0KLXByaXZhdGUgaW50IHN0cmVuZ3RoX0phdmFfSUNVKAotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBjbG9uZSgpCi0KLXB1YmxpYyBpbnQgY29tcGFyZSgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgY29tcGFyZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnRleHQuQ29sbGF0aW9uS2V5IGdldENvbGxhdGlvbktleSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBpbnQgZ2V0RGVjb21wb3NpdGlvbigpCi0KLXB1YmxpYyBpbnQgZ2V0U3RyZW5ndGgoKQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGhhc2hDb2RlKCkKLQotcHVibGljIHZvaWQgc2V0RGVjb21wb3NpdGlvbigKLWludCkKLQotcHVibGljIHZvaWQgc2V0U3RyZW5ndGgoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPUZpZWxkICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3RleHQvRm9ybWF0OyApCi1wdWJsaWMgY2xhc3MgamF2YS50ZXh0LkZvcm1hdCRGaWVsZCBleHRlbmRzIGphdmEudGV4dC5BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IkQXR0cmlidXRlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdGV4dC9EYXRlRm9ybWF0OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9RmllbGQgKQotcHVibGljIGNsYXNzIGphdmEudGV4dC5EYXRlRm9ybWF0JEZpZWxkIGV4dGVuZHMgamF2YS50ZXh0LkZvcm1hdCRGaWVsZAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudGV4dC5EYXRlRm9ybWF0JEZpZWxkIEFNX1BNCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS50ZXh0LkRhdGVGb3JtYXQkRmllbGQgREFZX09GX01PTlRICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS50ZXh0LkRhdGVGb3JtYXQkRmllbGQgREFZX09GX1dFRUsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnRleHQuRGF0ZUZvcm1hdCRGaWVsZCBEQVlfT0ZfV0VFS19JTl9NT05USAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudGV4dC5EYXRlRm9ybWF0JEZpZWxkIERBWV9PRl9ZRUFSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS50ZXh0LkRhdGVGb3JtYXQkRmllbGQgRVJBCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS50ZXh0LkRhdGVGb3JtYXQkRmllbGQgSE9VUjAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnRleHQuRGF0ZUZvcm1hdCRGaWVsZCBIT1VSMQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudGV4dC5EYXRlRm9ybWF0JEZpZWxkIEhPVVJfT0ZfREFZMAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudGV4dC5EYXRlRm9ybWF0JEZpZWxkIEhPVVJfT0ZfREFZMQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudGV4dC5EYXRlRm9ybWF0JEZpZWxkIE1JTExJU0VDT05ECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS50ZXh0LkRhdGVGb3JtYXQkRmllbGQgTUlOVVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS50ZXh0LkRhdGVGb3JtYXQkRmllbGQgTU9OVEgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnRleHQuRGF0ZUZvcm1hdCRGaWVsZCBTRUNPTkQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnRleHQuRGF0ZUZvcm1hdCRGaWVsZCBUSU1FX1pPTkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnRleHQuRGF0ZUZvcm1hdCRGaWVsZCBXRUVLX09GX01PTlRICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS50ZXh0LkRhdGVGb3JtYXQkRmllbGQgV0VFS19PRl9ZRUFSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS50ZXh0LkRhdGVGb3JtYXQkRmllbGQgWUVBUgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0hhc2h0YWJsZTxMamF2YS9sYW5nL0ludGVnZXI7TGphdmEvdGV4dC9EYXRlRm9ybWF0JEZpZWxkOz47ICkKLXByaXZhdGUgc3RhdGljIGphdmEudXRpbC5IYXNodGFibGUgdGFibGUKLQotcHJpdmF0ZSBpbnQgY2FsZW5kYXJGaWVsZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgc3RhdGljIGphdmEudGV4dC5EYXRlRm9ybWF0JEZpZWxkIG9mQ2FsZW5kYXJGaWVsZCgKLWludCkKLQotcHVibGljIGludCBnZXRDYWxlbmRhckZpZWxkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JbnZhbGlkT2JqZWN0RXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgamF2YS5sYW5nLk9iamVjdCByZWFkUmVzb2x2ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MamF2YS90ZXh0L0RhdGVGb3JtYXQkRmllbGQ7ICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZhLnRleHQuRGF0ZUZvcm1hdCBleHRlbmRzIGphdmEudGV4dC5Gb3JtYXQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQU1fUE1fRklFTEQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREFURV9GSUVMRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBEQVlfT0ZfV0VFS19GSUVMRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBEQVlfT0ZfV0VFS19JTl9NT05USF9GSUVMRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBEQVlfT0ZfWUVBUl9GSUVMRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSQV9GSUVMRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGVUxMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhPVVIwX0ZJRUxECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhPVVIxX0ZJRUxECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhPVVJfT0ZfREFZMF9GSUVMRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBIT1VSX09GX0RBWTFfRklFTEQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9ORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRURJVU0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlMTElTRUNPTkRfRklFTEQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlOVVRFX0ZJRUxECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PTlRIX0ZJRUxECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFQ09ORF9GSUVMRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9SVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUSU1FWk9ORV9GSUVMRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBXRUVLX09GX01PTlRIX0ZJRUxECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdFRUtfT0ZfWUVBUl9GSUVMRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBZRUFSX0ZJRUxECi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotCi1wcm90ZWN0ZWQgamF2YS51dGlsLkNhbGVuZGFyIGNhbGVuZGFyCi0KLXByb3RlY3RlZCBqYXZhLnRleHQuTnVtYmVyRm9ybWF0IG51bWJlckZvcm1hdAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tEYXRlU3R5bGUoCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tUaW1lU3R5bGUoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLkxvY2FsZVtdIGdldEF2YWlsYWJsZUxvY2FsZXMoKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudGV4dC5EYXRlRm9ybWF0IGdldERhdGVJbnN0YW5jZSgpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS50ZXh0LkRhdGVGb3JtYXQgZ2V0RGF0ZUluc3RhbmNlKAotaW50KQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudGV4dC5EYXRlRm9ybWF0IGdldERhdGVJbnN0YW5jZSgKLWludAotamF2YS51dGlsLkxvY2FsZSkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnRleHQuRGF0ZUZvcm1hdCBnZXREYXRlVGltZUluc3RhbmNlKCkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnRleHQuRGF0ZUZvcm1hdCBnZXREYXRlVGltZUluc3RhbmNlKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS50ZXh0LkRhdGVGb3JtYXQgZ2V0RGF0ZVRpbWVJbnN0YW5jZSgKLWludAotaW50Ci1qYXZhLnV0aWwuTG9jYWxlKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudGV4dC5EYXRlRm9ybWF0IGdldEluc3RhbmNlKCkKLQotc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3R5bGVOYW1lKAotaW50KQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudGV4dC5EYXRlRm9ybWF0IGdldFRpbWVJbnN0YW5jZSgpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS50ZXh0LkRhdGVGb3JtYXQgZ2V0VGltZUluc3RhbmNlKAotaW50KQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudGV4dC5EYXRlRm9ybWF0IGdldFRpbWVJbnN0YW5jZSgKLWludAotamF2YS51dGlsLkxvY2FsZSkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgY2xvbmUoKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBmb3JtYXQoCi1qYXZhLnV0aWwuRGF0ZSkKLQotcHVibGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgZm9ybWF0KAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgotamF2YS50ZXh0LkZpZWxkUG9zaXRpb24pCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIGZvcm1hdCgKLWphdmEudXRpbC5EYXRlCi1qYXZhLmxhbmcuU3RyaW5nQnVmZmVyCi1qYXZhLnRleHQuRmllbGRQb3NpdGlvbikKLQotcHVibGljIGphdmEudXRpbC5DYWxlbmRhciBnZXRDYWxlbmRhcigpCi0KLXB1YmxpYyBqYXZhLnRleHQuTnVtYmVyRm9ybWF0IGdldE51bWJlckZvcm1hdCgpCi0KLXB1YmxpYyBqYXZhLnV0aWwuVGltZVpvbmUgZ2V0VGltZVpvbmUoKQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLQotcHVibGljIGJvb2xlYW4gaXNMZW5pZW50KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS90ZXh0L1BhcnNlRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS51dGlsLkRhdGUgcGFyc2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLkRhdGUgcGFyc2UoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnRleHQuUGFyc2VQb3NpdGlvbikKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgcGFyc2VPYmplY3QoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnRleHQuUGFyc2VQb3NpdGlvbikKLQotcHVibGljIHZvaWQgc2V0Q2FsZW5kYXIoCi1qYXZhLnV0aWwuQ2FsZW5kYXIpCi0KLXB1YmxpYyB2b2lkIHNldExlbmllbnQoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXROdW1iZXJGb3JtYXQoCi1qYXZhLnRleHQuTnVtYmVyRm9ybWF0KQotCi1wdWJsaWMgdm9pZCBzZXRUaW1lWm9uZSgKLWphdmEudXRpbC5UaW1lWm9uZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLnRleHQuRGF0ZUZvcm1hdFN5bWJvbHMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUsIGphdmEubGFuZy5DbG9uZWFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0KLSBqYXZhLmxhbmcuU3RyaW5nW10gYW1wbXMKLQotIGphdmEubGFuZy5TdHJpbmdbXSBlcmFzCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBsb2NhbFBhdHRlcm5DaGFycwotCi1maW5hbCB0cmFuc2llbnQgamF2YS51dGlsLkxvY2FsZSBsb2NhbGUKLQotIGphdmEubGFuZy5TdHJpbmdbXSBtb250aHMKLQotIGphdmEubGFuZy5TdHJpbmdbXSBzaG9ydE1vbnRocwotCi0gamF2YS5sYW5nLlN0cmluZ1tdIHNob3J0V2Vla2RheXMKLQotIGphdmEubGFuZy5TdHJpbmdbXSB3ZWVrZGF5cwotCi0gamF2YS5sYW5nLlN0cmluZ1tdW10gem9uZVN0cmluZ3MKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuTG9jYWxlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoCi1qYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgY2xvbmUoKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIGdldEFtUG1TdHJpbmdzKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBnZXRFcmFzKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TG9jYWxQYXR0ZXJuQ2hhcnMoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIGdldE1vbnRocygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0U2hvcnRNb250aHMoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIGdldFNob3J0V2Vla2RheXMoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIGdldFdlZWtkYXlzKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmdbXVtdIGdldFpvbmVTdHJpbmdzKCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLSBqYXZhLmxhbmcuU3RyaW5nW11bXSBpbnRlcm5hbFpvbmVTdHJpbmdzKCkKLQotcHVibGljIHZvaWQgc2V0QW1QbVN0cmluZ3MoCi1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLXB1YmxpYyB2b2lkIHNldEVyYXMoCi1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLXB1YmxpYyB2b2lkIHNldExvY2FsUGF0dGVybkNoYXJzKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0TW9udGhzKAotamF2YS5sYW5nLlN0cmluZ1tdKQotCi1wdWJsaWMgdm9pZCBzZXRTaG9ydE1vbnRocygKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotcHVibGljIHZvaWQgc2V0U2hvcnRXZWVrZGF5cygKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotcHVibGljIHZvaWQgc2V0V2Vla2RheXMoCi1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLXB1YmxpYyB2b2lkIHNldFpvbmVTdHJpbmdzKAotamF2YS5sYW5nLlN0cmluZ1tdW10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3NlY3VyaXR5L1ByaXZpbGVnZWRBY3Rpb248TGphdmEvbGFuZy9yZWZsZWN0L0ZpZWxkOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLSBjbGFzcyBqYXZhLnRleHQuRGVjaW1hbEZvcm1hdCQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBqYXZhLnRleHQuRGVjaW1hbEZvcm1hdCB0aGlzJDAKLQotZmluYWwgamF2YS5sYW5nLlN0cmluZyB2YWwkZmllbGROYW1lCi0KLWZpbmFsIGphdmEubGFuZy5PYmplY3QgdmFsJHRhcmdldAotCi1maW5hbCBqYXZhLmxhbmcuT2JqZWN0IHZhbCR2YWx1ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEudGV4dC5EZWNpbWFsRm9ybWF0Ci1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBydW4oKQotCi1wdWJsaWMgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvc2VjdXJpdHkvUHJpdmlsZWdlZEFjdGlvbjxMamF2YS9sYW5nL09iamVjdDs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi0gY2xhc3MgamF2YS50ZXh0LkRlY2ltYWxGb3JtYXQkMiBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgamF2YS50ZXh0LkRlY2ltYWxGb3JtYXQgdGhpcyQwCi0KLWZpbmFsIGphdmEubGFuZy5TdHJpbmcgdmFsJGZpZWxkTmFtZQotCi1maW5hbCBqYXZhLmxhbmcuT2JqZWN0IHZhbCR0YXJnZXQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnRleHQuRGVjaW1hbEZvcm1hdAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLnRleHQuRGVjaW1hbEZvcm1hdCBleHRlbmRzIGphdmEudGV4dC5OdW1iZXJGb3JtYXQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENVUlJFTlRfU0VSSUFMX1ZFUlRJT04KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLkRvdWJsZSBORUdBVElWRV9aRVJPX0RPVUJMRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmlvLk9iamVjdFN0cmVhbUZpZWxkW10gc2VyaWFsUGVyc2lzdGVudEZpZWxkcwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSB0cmFuc2llbnQgY29tLmlibS5pY3U0am5pLnRleHQuRGVjaW1hbEZvcm1hdCBkZm9ybQotCi1wcml2YXRlIHRyYW5zaWVudCBjb20uaWJtLmljdTRqbmkudGV4dC5EZWNpbWFsRm9ybWF0U3ltYm9scyBpY3VTeW1ib2xzCi0KLXByaXZhdGUgdHJhbnNpZW50IGJvb2xlYW4gcGFyc2VCaWdEZWNpbWFsCi0KLXByaXZhdGUgdHJhbnNpZW50IGludCBzZXJpYWxWZXJzaW9uT25TdHJlYW0KLQotcHJpdmF0ZSB0cmFuc2llbnQgamF2YS50ZXh0LkRlY2ltYWxGb3JtYXRTeW1ib2xzIHN5bWJvbHMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudGV4dC5EZWNpbWFsRm9ybWF0U3ltYm9scykKLQotcHJpdmF0ZSB2b2lkIGNvcHlTeW1ib2xzKAotY29tLmlibS5pY3U0am5pLnRleHQuRGVjaW1hbEZvcm1hdFN5bWJvbHMKLWphdmEudGV4dC5EZWNpbWFsRm9ybWF0U3ltYm9scykKLQotcHJpdmF0ZSBqYXZhLmxhbmcuT2JqZWN0IGdldEludGVybmFsRmllbGQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL2xhbmcvQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoCi1qYXZhLmlvLk9iamVjdElucHV0U3RyZWFtKQotCi1wcml2YXRlIHZvaWQgc2V0SW50ZXJuYWxGaWVsZCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoCi1qYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSkKLQotcHVibGljIHZvaWQgYXBwbHlMb2NhbGl6ZWRQYXR0ZXJuKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgYXBwbHlQYXR0ZXJuKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgY2xvbmUoKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBmb3JtYXQoCi1kb3VibGUKLWphdmEubGFuZy5TdHJpbmdCdWZmZXIKLWphdmEudGV4dC5GaWVsZFBvc2l0aW9uKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBmb3JtYXQoCi1sb25nCi1qYXZhLmxhbmcuU3RyaW5nQnVmZmVyCi1qYXZhLnRleHQuRmllbGRQb3NpdGlvbikKLQotcHVibGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgZm9ybWF0KAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgotamF2YS50ZXh0LkZpZWxkUG9zaXRpb24pCi0KLXB1YmxpYyBqYXZhLnRleHQuQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yIGZvcm1hdFRvQ2hhcmFjdGVySXRlcmF0b3IoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgamF2YS51dGlsLkN1cnJlbmN5IGdldEN1cnJlbmN5KCkKLQotcHVibGljIGphdmEudGV4dC5EZWNpbWFsRm9ybWF0U3ltYm9scyBnZXREZWNpbWFsRm9ybWF0U3ltYm9scygpCi0KLXB1YmxpYyBpbnQgZ2V0R3JvdXBpbmdTaXplKCkKLQotcHVibGljIGludCBnZXRNdWx0aXBsaWVyKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TmVnYXRpdmVQcmVmaXgoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXROZWdhdGl2ZVN1ZmZpeCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFBvc2l0aXZlUHJlZml4KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UG9zaXRpdmVTdWZmaXgoKQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLQotcHVibGljIGJvb2xlYW4gaXNEZWNpbWFsU2VwYXJhdG9yQWx3YXlzU2hvd24oKQotCi1wdWJsaWMgYm9vbGVhbiBpc0dyb3VwaW5nVXNlZCgpCi0KLXB1YmxpYyBib29sZWFuIGlzUGFyc2VCaWdEZWNpbWFsKCkKLQotcHVibGljIGJvb2xlYW4gaXNQYXJzZUludGVnZXJPbmx5KCkKLQotcHVibGljIGphdmEubGFuZy5OdW1iZXIgcGFyc2UoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnRleHQuUGFyc2VQb3NpdGlvbikKLQotcHVibGljIHZvaWQgc2V0Q3VycmVuY3koCi1qYXZhLnV0aWwuQ3VycmVuY3kpCi0KLXB1YmxpYyB2b2lkIHNldERlY2ltYWxGb3JtYXRTeW1ib2xzKAotamF2YS50ZXh0LkRlY2ltYWxGb3JtYXRTeW1ib2xzKQotCi1wdWJsaWMgdm9pZCBzZXREZWNpbWFsU2VwYXJhdG9yQWx3YXlzU2hvd24oCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRHcm91cGluZ1NpemUoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldEdyb3VwaW5nVXNlZCgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldE1heGltdW1GcmFjdGlvbkRpZ2l0cygKLWludCkKLQotcHVibGljIHZvaWQgc2V0TWF4aW11bUludGVnZXJEaWdpdHMoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldE1pbmltdW1GcmFjdGlvbkRpZ2l0cygKLWludCkKLQotcHVibGljIHZvaWQgc2V0TWluaW11bUludGVnZXJEaWdpdHMoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldE11bHRpcGxpZXIoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldE5lZ2F0aXZlUHJlZml4KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0TmVnYXRpdmVTdWZmaXgoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRQYXJzZUJpZ0RlY2ltYWwoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRQYXJzZUludGVnZXJPbmx5KAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0UG9zaXRpdmVQcmVmaXgoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRQb3NpdGl2ZVN1ZmZpeCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvTG9jYWxpemVkUGF0dGVybigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvUGF0dGVybigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgamF2YS50ZXh0LkRlY2ltYWxGb3JtYXRTeW1ib2xzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5DbG9uZWFibGUsIGphdmEuaW8uU2VyaWFsaXphYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEuaW8uT2JqZWN0U3RyZWFtRmllbGRbXSBzZXJpYWxQZXJzaXN0ZW50RmllbGRzCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotCi1wcml2YXRlIGZpbmFsIGludCBEZWNpbWFsU2VwYXJhdG9yCi0KLXByaXZhdGUgZmluYWwgaW50IERpZ2l0Ci0KLXByaXZhdGUgZmluYWwgaW50IEV4cG9uZW50Ci0KLXByaXZhdGUgZmluYWwgaW50IEdyb3VwaW5nU2VwYXJhdG9yCi0KLXByaXZhdGUgZmluYWwgaW50IE1pbnVzU2lnbgotCi1wcml2YXRlIGZpbmFsIGludCBNb25ldGFyeURlY2ltYWxTZXBhcmF0b3IKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIE5hTgotCi1wcml2YXRlIGZpbmFsIGludCBQYXR0ZXJuU2VwYXJhdG9yCi0KLXByaXZhdGUgZmluYWwgaW50IFBlck1pbGwKLQotcHJpdmF0ZSBmaW5hbCBpbnQgUGVyY2VudAotCi1wcml2YXRlIGZpbmFsIGludCBaZXJvRGlnaXQKLQotcHJpdmF0ZSB0cmFuc2llbnQgamF2YS51dGlsLkN1cnJlbmN5IGN1cnJlbmN5Ci0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBjdXJyZW5jeVN5bWJvbAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgaW5maW5pdHkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGludGxDdXJyZW5jeVN5bWJvbAotCi1wcml2YXRlIHRyYW5zaWVudCBqYXZhLnV0aWwuTG9jYWxlIGxvY2FsZQotCi10cmFuc2llbnQgY2hhcltdIHBhdHRlcm5DaGFycwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkxvY2FsZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9sYW5nL0NsYXNzTm90Rm91bmRFeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCByZWFkT2JqZWN0KAotamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KAotamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0pCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGNsb25lKCkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGphdmEudXRpbC5DdXJyZW5jeSBnZXRDdXJyZW5jeSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEN1cnJlbmN5U3ltYm9sKCkKLQotcHVibGljIGNoYXIgZ2V0RGVjaW1hbFNlcGFyYXRvcigpCi0KLXB1YmxpYyBjaGFyIGdldERpZ2l0KCkKLQotIGNoYXIgZ2V0RXhwb25lbnRpYWwoKQotCi1wdWJsaWMgY2hhciBnZXRHcm91cGluZ1NlcGFyYXRvcigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEluZmluaXR5KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SW50ZXJuYXRpb25hbEN1cnJlbmN5U3ltYm9sKCkKLQotIGphdmEubGFuZy5TdHJpbmcgZ2V0TG9jYWxQYXR0ZXJuQ2hhcnMoKQotCi1wdWJsaWMgY2hhciBnZXRNaW51c1NpZ24oKQotCi1wdWJsaWMgY2hhciBnZXRNb25ldGFyeURlY2ltYWxTZXBhcmF0b3IoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXROYU4oKQotCi1wdWJsaWMgY2hhciBnZXRQYXR0ZXJuU2VwYXJhdG9yKCkKLQotcHVibGljIGNoYXIgZ2V0UGVyTWlsbCgpCi0KLXB1YmxpYyBjaGFyIGdldFBlcmNlbnQoKQotCi1wdWJsaWMgY2hhciBnZXRaZXJvRGlnaXQoKQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLQotcHVibGljIHZvaWQgc2V0Q3VycmVuY3koCi1qYXZhLnV0aWwuQ3VycmVuY3kpCi0KLXB1YmxpYyB2b2lkIHNldEN1cnJlbmN5U3ltYm9sKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0RGVjaW1hbFNlcGFyYXRvcigKLWNoYXIpCi0KLXB1YmxpYyB2b2lkIHNldERpZ2l0KAotY2hhcikKLQotIHZvaWQgc2V0RXhwb25lbnRpYWwoCi1jaGFyKQotCi1wdWJsaWMgdm9pZCBzZXRHcm91cGluZ1NlcGFyYXRvcigKLWNoYXIpCi0KLXB1YmxpYyB2b2lkIHNldEluZmluaXR5KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0SW50ZXJuYXRpb25hbEN1cnJlbmN5U3ltYm9sKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0TWludXNTaWduKAotY2hhcikKLQotcHVibGljIHZvaWQgc2V0TW9uZXRhcnlEZWNpbWFsU2VwYXJhdG9yKAotY2hhcikKLQotcHVibGljIHZvaWQgc2V0TmFOKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0UGF0dGVyblNlcGFyYXRvcigKLWNoYXIpCi0KLXB1YmxpYyB2b2lkIHNldFBlck1pbGwoCi1jaGFyKQotCi1wdWJsaWMgdm9pZCBzZXRQZXJjZW50KAotY2hhcikKLQotcHVibGljIHZvaWQgc2V0WmVyb0RpZ2l0KAotY2hhcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLnRleHQuRmllbGRQb3NpdGlvbiBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBpbnQgYmVnaW5JbmRleAotCi1wcml2YXRlIGludCBlbmRJbmRleAotCi1wcml2YXRlIGphdmEudGV4dC5Gb3JtYXQkRmllbGQgbXlBdHRyaWJ1dGUKLQotcHJpdmF0ZSBpbnQgbXlGaWVsZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS50ZXh0LkZvcm1hdCRGaWVsZCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS50ZXh0LkZvcm1hdCRGaWVsZAotaW50KQotCi0gdm9pZCBjbGVhcigpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBpbnQgZ2V0QmVnaW5JbmRleCgpCi0KLXB1YmxpYyBpbnQgZ2V0RW5kSW5kZXgoKQotCi1wdWJsaWMgaW50IGdldEZpZWxkKCkKLQotcHVibGljIGphdmEudGV4dC5Gb3JtYXQkRmllbGQgZ2V0RmllbGRBdHRyaWJ1dGUoKQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLQotcHVibGljIHZvaWQgc2V0QmVnaW5JbmRleCgKLWludCkKLQotcHVibGljIHZvaWQgc2V0RW5kSW5kZXgoCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvc2VjdXJpdHkvUHJpdmlsZWdlZEFjdGlvbjxMamF2YS91dGlsL1Jlc291cmNlQnVuZGxlOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLWZpbmFsIGNsYXNzIGphdmEudGV4dC5Gb3JtYXQkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgamF2YS51dGlsLkxvY2FsZSB2YWwkbG9jYWxlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkxvY2FsZSkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgcnVuKCkKLQotcHVibGljIGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZSBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1GaWVsZCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS90ZXh0L01lc3NhZ2VGb3JtYXQ7ICkKLXB1YmxpYyBjbGFzcyBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdCRGaWVsZCBleHRlbmRzIGphdmEudGV4dC5Gb3JtYXQkRmllbGQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdCRGaWVsZCBBUkdVTUVOVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSW52YWxpZE9iamVjdEV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGphdmEubGFuZy5PYmplY3QgcmVhZFJlc29sdmUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3RleHQvTWVzc2FnZUZvcm1hdDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1GaWVsZENvbnRhaW5lciApCi0gY2xhc3MgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQkRmllbGRDb250YWluZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBqYXZhLnRleHQuQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yJEF0dHJpYnV0ZSBhdHRyaWJ1dGUKLQotIGludCBlbmQKLQotIGludCBzdGFydAotCi0gamF2YS5sYW5nLk9iamVjdCB2YWx1ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotaW50Ci1qYXZhLnRleHQuQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yJEF0dHJpYnV0ZQotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxqYXZhL3RleHQvTWVzc2FnZUZvcm1hdCRGaWVsZDtMamF2YS90ZXh0L01lc3NhZ2VGb3JtYXQkRmllbGRDb250YWluZXI7ICkKLXB1YmxpYyBjbGFzcyBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdCBleHRlbmRzIGphdmEudGV4dC5Gb3JtYXQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5pby5PYmplY3RTdHJlYW1GaWVsZFtdIHNlcmlhbFBlcnNpc3RlbnRGaWVsZHMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0KLXByaXZhdGUgaW50W10gYXJndW1lbnROdW1iZXJzCi0KLXByaXZhdGUgamF2YS50ZXh0LkZvcm1hdFtdIGZvcm1hdHMKLQotcHJpdmF0ZSBqYXZhLnV0aWwuTG9jYWxlIGxvY2FsZQotCi1wcml2YXRlIHRyYW5zaWVudCBpbnQgbWF4QXJndW1lbnRJbmRleAotCi1wcml2YXRlIGludCBtYXhPZmZzZXQKLQotcHJpdmF0ZSB0cmFuc2llbnQgamF2YS5sYW5nLlN0cmluZ1tdIHN0cmluZ3MKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudXRpbC5Mb2NhbGUpCi0KLXByaXZhdGUgdm9pZCBhcHBlbmRRdW90ZWQoCi1qYXZhLmxhbmcuU3RyaW5nQnVmZmVyCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZGVjb2RlRGVjaW1hbEZvcm1hdCgKLWphdmEubGFuZy5TdHJpbmdCdWZmZXIKLWphdmEudGV4dC5Gb3JtYXQpCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBkZWNvZGVTaW1wbGVEYXRlRm9ybWF0KAotamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgotamF2YS50ZXh0LkZvcm1hdCkKLQotcHVibGljIHN0YXRpYyB0cmFuc2llbnQgamF2YS5sYW5nLlN0cmluZyBmb3JtYXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0W10pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFtMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL1N0cmluZ0J1ZmZlcjtMamF2YS90ZXh0L0ZpZWxkUG9zaXRpb247TGphdmEvdXRpbC9WZWN0b3I8TGphdmEvdGV4dC9NZXNzYWdlRm9ybWF0JEZpZWxkQ29udGFpbmVyOz47KUxqYXZhL2xhbmcvU3RyaW5nQnVmZmVyOyApCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgZm9ybWF0SW1wbCgKLWphdmEubGFuZy5PYmplY3RbXQotamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgotamF2YS50ZXh0LkZpZWxkUG9zaXRpb24KLWphdmEudXRpbC5WZWN0b3IpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KElJSUxqYXZhL3RleHQvRmllbGRQb3NpdGlvbjtMamF2YS91dGlsL1ZlY3RvcjxMamF2YS90ZXh0L01lc3NhZ2VGb3JtYXQkRmllbGRDb250YWluZXI7PjspViApCi1wcml2YXRlIHZvaWQgaGFuZGxlQXJndW1lbnRGaWVsZCgKLWludAotaW50Ci1pbnQKLWphdmEudGV4dC5GaWVsZFBvc2l0aW9uCi1qYXZhLnV0aWwuVmVjdG9yKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS90ZXh0L0Zvcm1hdDtMamF2YS9sYW5nL09iamVjdDtJTGphdmEvdXRpbC9WZWN0b3I8TGphdmEvdGV4dC9NZXNzYWdlRm9ybWF0JEZpZWxkQ29udGFpbmVyOz47KVYgKQotcHJpdmF0ZSB2b2lkIGhhbmRsZWZvcm1hdCgKLWphdmEudGV4dC5Gb3JtYXQKLWphdmEubGFuZy5PYmplY3QKLWludAotamF2YS51dGlsLlZlY3RvcikKLQotcHJpdmF0ZSBpbnQgbWF0Y2goCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnRleHQuUGFyc2VQb3NpdGlvbgotYm9vbGVhbgotamF2YS5sYW5nLlN0cmluZ1tdKQotCi1wcml2YXRlIGphdmEudGV4dC5Gb3JtYXQgcGFyc2VWYXJpYWJsZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudGV4dC5QYXJzZVBvc2l0aW9uKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL2xhbmcvQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoCi1qYXZhLmlvLk9iamVjdElucHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoCi1qYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSkKLQotcHVibGljIHZvaWQgYXBwbHlQYXR0ZXJuKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgY2xvbmUoKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBmb3JtYXQoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuU3RyaW5nQnVmZmVyCi1qYXZhLnRleHQuRmllbGRQb3NpdGlvbikKLQotcHVibGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgZm9ybWF0KAotamF2YS5sYW5nLk9iamVjdFtdCi1qYXZhLmxhbmcuU3RyaW5nQnVmZmVyCi1qYXZhLnRleHQuRmllbGRQb3NpdGlvbikKLQotcHVibGljIGphdmEudGV4dC5BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IgZm9ybWF0VG9DaGFyYWN0ZXJJdGVyYXRvcigKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBqYXZhLnRleHQuRm9ybWF0W10gZ2V0Rm9ybWF0cygpCi0KLXB1YmxpYyBqYXZhLnRleHQuRm9ybWF0W10gZ2V0Rm9ybWF0c0J5QXJndW1lbnRJbmRleCgpCi0KLXB1YmxpYyBqYXZhLnV0aWwuTG9jYWxlIGdldExvY2FsZSgpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3RleHQvUGFyc2VFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0W10gcGFyc2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdFtdIHBhcnNlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS50ZXh0LlBhcnNlUG9zaXRpb24pCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHBhcnNlT2JqZWN0KAotamF2YS5sYW5nLlN0cmluZwotamF2YS50ZXh0LlBhcnNlUG9zaXRpb24pCi0KLXB1YmxpYyB2b2lkIHNldEZvcm1hdCgKLWludAotamF2YS50ZXh0LkZvcm1hdCkKLQotcHVibGljIHZvaWQgc2V0Rm9ybWF0QnlBcmd1bWVudEluZGV4KAotaW50Ci1qYXZhLnRleHQuRm9ybWF0KQotCi1wdWJsaWMgdm9pZCBzZXRGb3JtYXRzKAotamF2YS50ZXh0LkZvcm1hdFtdKQotCi1wdWJsaWMgdm9pZCBzZXRGb3JtYXRzQnlBcmd1bWVudEluZGV4KAotamF2YS50ZXh0LkZvcm1hdFtdKQotCi1wdWJsaWMgdm9pZCBzZXRMb2NhbGUoCi1qYXZhLnV0aWwuTG9jYWxlKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1BhdHRlcm4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1GaWVsZCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS90ZXh0L051bWJlckZvcm1hdDsgKQotcHVibGljIGNsYXNzIGphdmEudGV4dC5OdW1iZXJGb3JtYXQkRmllbGQgZXh0ZW5kcyBqYXZhLnRleHQuRm9ybWF0JEZpZWxkCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS50ZXh0Lk51bWJlckZvcm1hdCRGaWVsZCBDVVJSRU5DWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudGV4dC5OdW1iZXJGb3JtYXQkRmllbGQgREVDSU1BTF9TRVBBUkFUT1IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnRleHQuTnVtYmVyRm9ybWF0JEZpZWxkIEVYUE9ORU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS50ZXh0Lk51bWJlckZvcm1hdCRGaWVsZCBFWFBPTkVOVF9TSUdOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS50ZXh0Lk51bWJlckZvcm1hdCRGaWVsZCBFWFBPTkVOVF9TWU1CT0wKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnRleHQuTnVtYmVyRm9ybWF0JEZpZWxkIEZSQUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS50ZXh0Lk51bWJlckZvcm1hdCRGaWVsZCBHUk9VUElOR19TRVBBUkFUT1IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnRleHQuTnVtYmVyRm9ybWF0JEZpZWxkIElOVEVHRVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnRleHQuTnVtYmVyRm9ybWF0JEZpZWxkIFBFUkNFTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnRleHQuTnVtYmVyRm9ybWF0JEZpZWxkIFBFUk1JTExFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS50ZXh0Lk51bWJlckZvcm1hdCRGaWVsZCBTSUdOCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JbnZhbGlkT2JqZWN0RXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgamF2YS5sYW5nLk9iamVjdCByZWFkUmVzb2x2ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLkV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSBpbnQgZXJyb3JPZmZzZXQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0RXJyb3JPZmZzZXQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEudGV4dC5QYXJzZVBvc2l0aW9uIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGludCBjdXJyZW50UG9zaXRpb24KLQotcHJpdmF0ZSBpbnQgZXJyb3JJbmRleAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludCkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGludCBnZXRFcnJvckluZGV4KCkKLQotcHVibGljIGludCBnZXRJbmRleCgpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1wdWJsaWMgdm9pZCBzZXRFcnJvckluZGV4KAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRJbmRleCgKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotIGNsYXNzIGphdmEudGV4dC5SdWxlQmFzZWRCcmVha0l0ZXJhdG9yIGV4dGVuZHMgamF2YS50ZXh0LkJyZWFrSXRlcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1jb20uaWJtLmljdTRqbmkudGV4dC5CcmVha0l0ZXJhdG9yKQotCi1wcml2YXRlIHZvaWQgdmFsaWRhdGVPZmZzZXQoCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGNsb25lKCkKLQotcHVibGljIGludCBjdXJyZW50KCkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGludCBmaXJzdCgpCi0KLXB1YmxpYyBpbnQgZm9sbG93aW5nKAotaW50KQotCi1wdWJsaWMgamF2YS50ZXh0LkNoYXJhY3Rlckl0ZXJhdG9yIGdldFRleHQoKQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLQotcHVibGljIGJvb2xlYW4gaXNCb3VuZGFyeSgKLWludCkKLQotcHVibGljIGludCBsYXN0KCkKLQotcHVibGljIGludCBuZXh0KCkKLQotcHVibGljIGludCBuZXh0KAotaW50KQotCi1wdWJsaWMgaW50IHByZWNlZGluZygKLWludCkKLQotcHVibGljIGludCBwcmV2aW91cygpCi0KLXB1YmxpYyB2b2lkIHNldFRleHQoCi1qYXZhLnRleHQuQ2hhcmFjdGVySXRlcmF0b3IpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLnRleHQuUnVsZUJhc2VkQ29sbGF0b3IgZXh0ZW5kcyBqYXZhLnRleHQuQ29sbGF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1jb20uaWJtLmljdTRqbmkudGV4dC5Db2xsYXRvcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS90ZXh0L1BhcnNlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBjbG9uZSgpCi0KLXB1YmxpYyBpbnQgY29tcGFyZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBqYXZhLnRleHQuQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yIGdldENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLnRleHQuQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yIGdldENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcigKLWphdmEudGV4dC5DaGFyYWN0ZXJJdGVyYXRvcikKLQotcHVibGljIGphdmEudGV4dC5Db2xsYXRpb25LZXkgZ2V0Q29sbGF0aW9uS2V5KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UnVsZXMoKQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdCBleHRlbmRzIGphdmEudGV4dC5EYXRlRm9ybWF0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgcGF0dGVybkNoYXJzCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEuaW8uT2JqZWN0U3RyZWFtRmllbGRbXSBzZXJpYWxQZXJzaXN0ZW50RmllbGRzCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotCi1wcml2YXRlIHRyYW5zaWVudCBpbnQgY3JlYXRpb25ZZWFyCi0KLXByaXZhdGUgamF2YS51dGlsLkRhdGUgZGVmYXVsdENlbnR1cnlTdGFydAotCi1wcml2YXRlIGphdmEudGV4dC5EYXRlRm9ybWF0U3ltYm9scyBmb3JtYXREYXRhCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBwYXR0ZXJuCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnRleHQuRGF0ZUZvcm1hdFN5bWJvbHMpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudXRpbC5Mb2NhbGUpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuTG9jYWxlKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1N0cmluZ0J1ZmZlcjtMamF2YS90ZXh0L0ZpZWxkUG9zaXRpb247TGphdmEvdXRpbC9WZWN0b3I8TGphdmEvdGV4dC9GaWVsZFBvc2l0aW9uOz47Q0kpViApCi1wcml2YXRlIHZvaWQgYXBwZW5kKAotamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgotamF2YS50ZXh0LkZpZWxkUG9zaXRpb24KLWphdmEudXRpbC5WZWN0b3IKLWNoYXIKLWludCkKLQotcHJpdmF0ZSB2b2lkIGFwcGVuZE51bWJlcigKLWphdmEubGFuZy5TdHJpbmdCdWZmZXIKLWludAotaW50KQotCi1wcml2YXRlIHZvaWQgYXBwZW5kVGltZVpvbmUoCi1qYXZhLmxhbmcuU3RyaW5nQnVmZmVyCi1pbnQKLWJvb2xlYW4pCi0KLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZGVmYXVsdFBhdHRlcm4oKQotCi1wcml2YXRlIGphdmEudXRpbC5EYXRlIGVycm9yKAotamF2YS50ZXh0LlBhcnNlUG9zaXRpb24KLWludAotamF2YS51dGlsLlRpbWVab25lKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0RhdGU7TGphdmEvbGFuZy9TdHJpbmdCdWZmZXI7TGphdmEvdGV4dC9GaWVsZFBvc2l0aW9uO0xqYXZhL3V0aWwvVmVjdG9yPExqYXZhL3RleHQvRmllbGRQb3NpdGlvbjs+OylMamF2YS9sYW5nL1N0cmluZ0J1ZmZlcjsgKQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIGZvcm1hdEltcGwoCi1qYXZhLnV0aWwuRGF0ZQotamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgotamF2YS50ZXh0LkZpZWxkUG9zaXRpb24KLWphdmEudXRpbC5WZWN0b3IpCi0KLXByaXZhdGUgamF2YS50ZXh0LkF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvciBmb3JtYXRUb0NoYXJhY3Rlckl0ZXJhdG9ySW1wbCgKLWphdmEudXRpbC5EYXRlKQotCi1wcml2YXRlIGludCBwYXJzZSgKLWphdmEubGFuZy5TdHJpbmcKLWludAotY2hhcgotaW50KQotCi1wcml2YXRlIGludCBwYXJzZU51bWJlcigKLWludAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQKLWludCkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuTnVtYmVyIHBhcnNlTnVtYmVyKAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnRleHQuUGFyc2VQb3NpdGlvbikKLQotcHJpdmF0ZSBpbnQgcGFyc2VUZXh0KAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1qYXZhLmxhbmcuU3RyaW5nW10KLWludCkKLQotcHJpdmF0ZSBpbnQgcGFyc2VUaW1lWm9uZSgKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9sYW5nL0NsYXNzTm90Rm91bmRFeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCByZWFkT2JqZWN0KAotamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSkKLQotcHJpdmF0ZSB2b2lkIHZhbGlkYXRlRm9ybWF0KAotY2hhcikKLQotcHJpdmF0ZSB2b2lkIHZhbGlkYXRlUGF0dGVybigKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCB3cml0ZU9iamVjdCgKLWphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtKQotCi1wdWJsaWMgdm9pZCBhcHBseUxvY2FsaXplZFBhdHRlcm4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBhcHBseVBhdHRlcm4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBjbG9uZSgpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIGZvcm1hdCgKLWphdmEudXRpbC5EYXRlCi1qYXZhLmxhbmcuU3RyaW5nQnVmZmVyCi1qYXZhLnRleHQuRmllbGRQb3NpdGlvbikKLQotcHVibGljIGphdmEudGV4dC5BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IgZm9ybWF0VG9DaGFyYWN0ZXJJdGVyYXRvcigKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBqYXZhLnV0aWwuRGF0ZSBnZXQyRGlnaXRZZWFyU3RhcnQoKQotCi1wdWJsaWMgamF2YS50ZXh0LkRhdGVGb3JtYXRTeW1ib2xzIGdldERhdGVGb3JtYXRTeW1ib2xzKCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLXB1YmxpYyBqYXZhLnV0aWwuRGF0ZSBwYXJzZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudGV4dC5QYXJzZVBvc2l0aW9uKQotCi1wdWJsaWMgdm9pZCBzZXQyRGlnaXRZZWFyU3RhcnQoCi1qYXZhLnV0aWwuRGF0ZSkKLQotcHVibGljIHZvaWQgc2V0RGF0ZUZvcm1hdFN5bWJvbHMoCi1qYXZhLnRleHQuRGF0ZUZvcm1hdFN5bWJvbHMpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvTG9jYWxpemVkUGF0dGVybigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvUGF0dGVybigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgamF2YS50ZXh0LlN0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudGV4dC5DaGFyYWN0ZXJJdGVyYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gaW50IGVuZAotCi0gaW50IG9mZnNldAotCi0gaW50IHN0YXJ0Ci0KLSBqYXZhLmxhbmcuU3RyaW5nIHN0cmluZwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQKLWludCkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgY2xvbmUoKQotCi1wdWJsaWMgY2hhciBjdXJyZW50KCkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGNoYXIgZmlyc3QoKQotCi1wdWJsaWMgaW50IGdldEJlZ2luSW5kZXgoKQotCi1wdWJsaWMgaW50IGdldEVuZEluZGV4KCkKLQotcHVibGljIGludCBnZXRJbmRleCgpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1wdWJsaWMgY2hhciBsYXN0KCkKLQotcHVibGljIGNoYXIgbmV4dCgpCi0KLXB1YmxpYyBjaGFyIHByZXZpb3VzKCkKLQotcHVibGljIGNoYXIgc2V0SW5kZXgoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldFRleHQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08RTpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9JdGVyYWJsZTxURTs+OyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEudXRpbC5Db2xsZWN0aW9uIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5JdGVyYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRFOylaICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGFkZCgKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvQ29sbGVjdGlvbjwrVEU7PjspWiApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBhZGRBbGwoCi1qYXZhLnV0aWwuQ29sbGVjdGlvbikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgY2xlYXIoKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBjb250YWlucygKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvQ29sbGVjdGlvbjwqPjspWiApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBjb250YWluc0FsbCgKLWphdmEudXRpbC5Db2xsZWN0aW9uKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGhhc2hDb2RlKCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNFbXB0eSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0l0ZXJhdG9yPFRFOz47ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnV0aWwuSXRlcmF0b3IgaXRlcmF0b3IoKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiByZW1vdmUoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0NvbGxlY3Rpb248Kj47KVogKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gcmVtb3ZlQWxsKAotamF2YS51dGlsLkNvbGxlY3Rpb24pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvQ29sbGVjdGlvbjwqPjspWiApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiByZXRhaW5BbGwoCi1qYXZhLnV0aWwuQ29sbGVjdGlvbikKLQotcHVibGljIGFic3RyYWN0IGludCBzaXplKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5PYmplY3RbXSB0b0FycmF5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+KFtUVDspW1RUOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLk9iamVjdFtdIHRvQXJyYXkoCi1qYXZhLmxhbmcuT2JqZWN0W10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxFOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS9sYW5nL09iamVjdDtMamF2YS91dGlsL0NvbGxlY3Rpb248VEU7PjsgKQotcHVibGljIGFic3RyYWN0IGNsYXNzIGphdmEudXRpbC5BYnN0cmFjdENvbGxlY3Rpb24gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLkNvbGxlY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShURTspWiApCi1wdWJsaWMgYm9vbGVhbiBhZGQoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0NvbGxlY3Rpb248K1RFOz47KVogKQotcHVibGljIGJvb2xlYW4gYWRkQWxsKAotamF2YS51dGlsLkNvbGxlY3Rpb24pCi0KLXB1YmxpYyB2b2lkIGNsZWFyKCkKLQotcHVibGljIGJvb2xlYW4gY29udGFpbnMoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0NvbGxlY3Rpb248Kj47KVogKQotcHVibGljIGJvb2xlYW4gY29udGFpbnNBbGwoCi1qYXZhLnV0aWwuQ29sbGVjdGlvbikKLQotcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0l0ZXJhdG9yPFRFOz47ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnV0aWwuSXRlcmF0b3IgaXRlcmF0b3IoKQotCi1wdWJsaWMgYm9vbGVhbiByZW1vdmUoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0NvbGxlY3Rpb248Kj47KVogKQotcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKAotamF2YS51dGlsLkNvbGxlY3Rpb24pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvQ29sbGVjdGlvbjwqPjspWiApCi1wdWJsaWMgYm9vbGVhbiByZXRhaW5BbGwoCi1qYXZhLnV0aWwuQ29sbGVjdGlvbikKLQotcHVibGljIGFic3RyYWN0IGludCBzaXplKCkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3RbXSB0b0FycmF5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+KFtUVDspW1RUOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdFtdIHRvQXJyYXkoCi1qYXZhLmxhbmcuT2JqZWN0W10pCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTIgbmFtZSA9U2ltcGxlTGlzdEl0ZXJhdG9yICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS91dGlsL0l0ZXJhdG9yPFRFOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvQWJzdHJhY3RMaXN0OyApCi0gY2xhc3MgamF2YS51dGlsLkFic3RyYWN0TGlzdCRTaW1wbGVMaXN0SXRlcmF0b3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLkl0ZXJhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBpbnQgZXhwZWN0ZWRNb2RDb3VudAotCi0gaW50IGxhc3RQb3NpdGlvbgotCi0gaW50IHBvcwotCi1maW5hbCBqYXZhLnV0aWwuQWJzdHJhY3RMaXN0IHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEudXRpbC5BYnN0cmFjdExpc3QpCi0KLXB1YmxpYyBib29sZWFuIGhhc05leHQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVEU7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IG5leHQoKQotCi1wdWJsaWMgdm9pZCByZW1vdmUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08RTpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvdXRpbC9JdGVyYXRvcjxURTs+OyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEudXRpbC5MaXN0SXRlcmF0b3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLkl0ZXJhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEU7KVYgKQotcHVibGljIGFic3RyYWN0IHZvaWQgYWRkKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaGFzTmV4dCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGhhc1ByZXZpb3VzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVRFOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLk9iamVjdCBuZXh0KCkKLQotcHVibGljIGFic3RyYWN0IGludCBuZXh0SW5kZXgoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVEU7ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuT2JqZWN0IHByZXZpb3VzKCkKLQotcHVibGljIGFic3RyYWN0IGludCBwcmV2aW91c0luZGV4KCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgcmVtb3ZlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEU7KVYgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0KAotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL0Fic3RyYWN0TGlzdDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xOCBuYW1lID1GdWxsTGlzdEl0ZXJhdG9yICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0Fic3RyYWN0TGlzdDxURTs+LlNpbXBsZUxpc3RJdGVyYXRvcjtMamF2YS91dGlsL0xpc3RJdGVyYXRvcjxURTs+OyApCi1maW5hbCBjbGFzcyBqYXZhLnV0aWwuQWJzdHJhY3RMaXN0JEZ1bGxMaXN0SXRlcmF0b3IgZXh0ZW5kcyBqYXZhLnV0aWwuQWJzdHJhY3RMaXN0JFNpbXBsZUxpc3RJdGVyYXRvciBpbXBsZW1lbnRzIGphdmEudXRpbC5MaXN0SXRlcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgamF2YS51dGlsLkFic3RyYWN0TGlzdCB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuQWJzdHJhY3RMaXN0Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRFOylWICkKLXB1YmxpYyB2b2lkIGFkZCgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCkKLQotcHVibGljIGludCBuZXh0SW5kZXgoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVEU7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHByZXZpb3VzKCkKLQotcHVibGljIGludCBwcmV2aW91c0luZGV4KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEU7KVYgKQotcHVibGljIHZvaWQgc2V0KAotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL0Fic3RyYWN0TGlzdCRTdWJBYnN0cmFjdExpc3Q7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjYgbmFtZSA9U3ViQWJzdHJhY3RMaXN0SXRlcmF0b3IgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxFOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS9sYW5nL09iamVjdDtMamF2YS91dGlsL0xpc3RJdGVyYXRvcjxURTs+OyApCi1maW5hbCBjbGFzcyBqYXZhLnV0aWwuQWJzdHJhY3RMaXN0JFN1YkFic3RyYWN0TGlzdCRTdWJBYnN0cmFjdExpc3RJdGVyYXRvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgaW50IGVuZAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvTGlzdEl0ZXJhdG9yPFRFOz47ICkKLXByaXZhdGUgZmluYWwgamF2YS51dGlsLkxpc3RJdGVyYXRvciBpdGVyYXRvcgotCi1wcml2YXRlIGludCBzdGFydAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQWJzdHJhY3RMaXN0JFN1YkFic3RyYWN0TGlzdDxURTs+OyApCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5BYnN0cmFjdExpc3QkU3ViQWJzdHJhY3RMaXN0IHN1Ykxpc3QKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0xpc3RJdGVyYXRvcjxURTs+O0xqYXZhL3V0aWwvQWJzdHJhY3RMaXN0JFN1YkFic3RyYWN0TGlzdDxURTs+O0lJKVYgKQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkxpc3RJdGVyYXRvcgotamF2YS51dGlsLkFic3RyYWN0TGlzdCRTdWJBYnN0cmFjdExpc3QKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShURTspViApCi1wdWJsaWMgdm9pZCBhZGQoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkKLQotcHVibGljIGJvb2xlYW4gaGFzUHJldmlvdXMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVEU7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IG5leHQoKQotCi1wdWJsaWMgaW50IG5leHRJbmRleCgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClURTsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgcHJldmlvdXMoKQotCi1wdWJsaWMgaW50IHByZXZpb3VzSW5kZXgoKQotCi1wdWJsaWMgdm9pZCByZW1vdmUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShURTspViApCi1wdWJsaWMgdm9pZCBzZXQoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08RTpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvdXRpbC9Db2xsZWN0aW9uPFRFOz47ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgamF2YS51dGlsLkxpc3QgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLkNvbGxlY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJVEU7KVYgKQotcHVibGljIGFic3RyYWN0IHZvaWQgYWRkKAotaW50Ci1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShURTspWiApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBhZGQoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJTGphdmEvdXRpbC9Db2xsZWN0aW9uPCtURTs+OylaICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGFkZEFsbCgKLWludAotamF2YS51dGlsLkNvbGxlY3Rpb24pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvQ29sbGVjdGlvbjwrVEU7PjspWiApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBhZGRBbGwoCi1qYXZhLnV0aWwuQ29sbGVjdGlvbikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgY2xlYXIoKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBjb250YWlucygKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvQ29sbGVjdGlvbjwqPjspWiApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBjb250YWluc0FsbCgKLWphdmEudXRpbC5Db2xsZWN0aW9uKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJKVRFOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLk9iamVjdCBnZXQoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgaGFzaENvZGUoKQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGluZGV4T2YoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0VtcHR5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvSXRlcmF0b3I8VEU7PjsgKQotcHVibGljIGFic3RyYWN0IGphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvcigpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgbGFzdEluZGV4T2YoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9MaXN0SXRlcmF0b3I8VEU7PjsgKQotcHVibGljIGFic3RyYWN0IGphdmEudXRpbC5MaXN0SXRlcmF0b3IgbGlzdEl0ZXJhdG9yKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSSlMamF2YS91dGlsL0xpc3RJdGVyYXRvcjxURTs+OyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLkxpc3RJdGVyYXRvciBsaXN0SXRlcmF0b3IoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KEkpVEU7ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuT2JqZWN0IHJlbW92ZSgKLWludCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gcmVtb3ZlKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9Db2xsZWN0aW9uPCo+OylaICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHJlbW92ZUFsbCgKLWphdmEudXRpbC5Db2xsZWN0aW9uKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0NvbGxlY3Rpb248Kj47KVogKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gcmV0YWluQWxsKAotamF2YS51dGlsLkNvbGxlY3Rpb24pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KElURTspVEU7ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuT2JqZWN0IHNldCgKLWludAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGFic3RyYWN0IGludCBzaXplKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSUkpTGphdmEvdXRpbC9MaXN0PFRFOz47ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnV0aWwuTGlzdCBzdWJMaXN0KAotaW50Ci1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuT2JqZWN0W10gdG9BcnJheSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFQ6TGphdmEvbGFuZy9PYmplY3Q7PihbVFQ7KVtUVDsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5PYmplY3RbXSB0b0FycmF5KAotamF2YS5sYW5nLk9iamVjdFtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGphdmEvdXRpbC9BYnN0cmFjdExpc3QkU3ViQWJzdHJhY3RMaXN0O0xqYXZhL3V0aWwvQWJzdHJhY3RMaXN0JFN1YkFic3RyYWN0TGlzdFJhbmRvbUFjY2VzcztMamF2YS91dGlsL0Fic3RyYWN0TGlzdCRGdWxsTGlzdEl0ZXJhdG9yO0xqYXZhL3V0aWwvQWJzdHJhY3RMaXN0JFNpbXBsZUxpc3RJdGVyYXRvcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxFOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS91dGlsL0Fic3RyYWN0Q29sbGVjdGlvbjxURTs+O0xqYXZhL3V0aWwvTGlzdDxURTs+OyApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgamF2YS51dGlsLkFic3RyYWN0TGlzdCBleHRlbmRzIGphdmEudXRpbC5BYnN0cmFjdENvbGxlY3Rpb24gaW1wbGVtZW50cyBqYXZhLnV0aWwuTGlzdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgdHJhbnNpZW50IGludCBtb2RDb3VudAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KElURTspViApCi1wdWJsaWMgdm9pZCBhZGQoCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRFOylaICkKLXB1YmxpYyBib29sZWFuIGFkZCgKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KElMamF2YS91dGlsL0NvbGxlY3Rpb248K1RFOz47KVogKQotcHVibGljIGJvb2xlYW4gYWRkQWxsKAotaW50Ci1qYXZhLnV0aWwuQ29sbGVjdGlvbikKLQotcHVibGljIHZvaWQgY2xlYXIoKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJKVRFOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLk9iamVjdCBnZXQoCi1pbnQpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1wdWJsaWMgaW50IGluZGV4T2YoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9JdGVyYXRvcjxURTs+OyApCi1wdWJsaWMgamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXJhdG9yKCkKLQotcHVibGljIGludCBsYXN0SW5kZXhPZigKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0xpc3RJdGVyYXRvcjxURTs+OyApCi1wdWJsaWMgamF2YS51dGlsLkxpc3RJdGVyYXRvciBsaXN0SXRlcmF0b3IoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJKUxqYXZhL3V0aWwvTGlzdEl0ZXJhdG9yPFRFOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yIGxpc3RJdGVyYXRvcigKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSSlURTsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgcmVtb3ZlKAotaW50KQotCi1wcm90ZWN0ZWQgdm9pZCByZW1vdmVSYW5nZSgKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJVEU7KVRFOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBzZXQoCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KElJKUxqYXZhL3V0aWwvTGlzdDxURTs+OyApCi1wdWJsaWMgamF2YS51dGlsLkxpc3Qgc3ViTGlzdCgKLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGphdmEvdXRpbC9BYnN0cmFjdExpc3QkU3ViQWJzdHJhY3RMaXN0JFN1YkFic3RyYWN0TGlzdEl0ZXJhdG9yOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEU6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL3V0aWwvQWJzdHJhY3RMaXN0PFRFOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9U3ViQWJzdHJhY3RMaXN0ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvQWJzdHJhY3RMaXN0OyApCi0gY2xhc3MgamF2YS51dGlsLkFic3RyYWN0TGlzdCRTdWJBYnN0cmFjdExpc3QgZXh0ZW5kcyBqYXZhLnV0aWwuQWJzdHJhY3RMaXN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9BYnN0cmFjdExpc3Q8VEU7PjsgKQotcHJpdmF0ZSBmaW5hbCBqYXZhLnV0aWwuQWJzdHJhY3RMaXN0IGZ1bGxMaXN0Ci0KLXByaXZhdGUgaW50IG9mZnNldAotCi1wcml2YXRlIGludCBzaXplCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9BYnN0cmFjdExpc3Q8VEU7PjtJSSlWICkKLSB2b2lkIDxpbml0PigKLWphdmEudXRpbC5BYnN0cmFjdExpc3QKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJVEU7KVYgKQotcHVibGljIHZvaWQgYWRkKAotaW50Ci1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJTGphdmEvdXRpbC9Db2xsZWN0aW9uPCtURTs+OylaICkKLXB1YmxpYyBib29sZWFuIGFkZEFsbCgKLWludAotamF2YS51dGlsLkNvbGxlY3Rpb24pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvQ29sbGVjdGlvbjwrVEU7PjspWiApCi1wdWJsaWMgYm9vbGVhbiBhZGRBbGwoCi1qYXZhLnV0aWwuQ29sbGVjdGlvbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSSlURTsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0KAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9JdGVyYXRvcjxURTs+OyApCi1wdWJsaWMgamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXJhdG9yKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSSlMamF2YS91dGlsL0xpc3RJdGVyYXRvcjxURTs+OyApCi1wdWJsaWMgamF2YS51dGlsLkxpc3RJdGVyYXRvciBsaXN0SXRlcmF0b3IoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KEkpVEU7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHJlbW92ZSgKLWludCkKLQotcHJvdGVjdGVkIHZvaWQgcmVtb3ZlUmFuZ2UoCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSVRFOylURTsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3Qgc2V0KAotaW50Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50IHNpemUoKQotCi0gdm9pZCBzaXplQ2hhbmdlZCgKLWJvb2xlYW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEudXRpbC5SYW5kb21BY2Nlc3MgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI2IG5hbWUgPVN1YkFic3RyYWN0TGlzdFJhbmRvbUFjY2VzcyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL0Fic3RyYWN0TGlzdDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxFOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS91dGlsL0Fic3RyYWN0TGlzdCRTdWJBYnN0cmFjdExpc3Q8VEU7PjtMamF2YS91dGlsL1JhbmRvbUFjY2VzczsgKQotZmluYWwgY2xhc3MgamF2YS51dGlsLkFic3RyYWN0TGlzdCRTdWJBYnN0cmFjdExpc3RSYW5kb21BY2Nlc3MgZXh0ZW5kcyBqYXZhLnV0aWwuQWJzdHJhY3RMaXN0JFN1YkFic3RyYWN0TGlzdCBpbXBsZW1lbnRzIGphdmEudXRpbC5SYW5kb21BY2Nlc3MKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0Fic3RyYWN0TGlzdDxURTs+O0lJKVYgKQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkFic3RyYWN0TGlzdAotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3V0aWwvSXRlcmF0b3I8VEs7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotIGNsYXNzIGphdmEudXRpbC5BYnN0cmFjdE1hcCQxJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLkl0ZXJhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9JdGVyYXRvcjxMamF2YS91dGlsL01hcCRFbnRyeTxUSztUVjs+Oz47ICkKLSBqYXZhLnV0aWwuSXRlcmF0b3Igc2V0SXRlcmF0b3IKLQotZmluYWwgamF2YS51dGlsLkFic3RyYWN0TWFwJDEgdGhpcyQxCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkFic3RyYWN0TWFwJDEpCi0KLXB1YmxpYyBib29sZWFuIGhhc05leHQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVEs7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IG5leHQoKQotCi1wdWJsaWMgdm9pZCByZW1vdmUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08RTpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvdXRpbC9Db2xsZWN0aW9uPFRFOz47ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgamF2YS51dGlsLlNldCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuQ29sbGVjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRFOylaICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGFkZCgKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvQ29sbGVjdGlvbjwrVEU7PjspWiApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBhZGRBbGwoCi1qYXZhLnV0aWwuQ29sbGVjdGlvbikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgY2xlYXIoKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBjb250YWlucygKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvQ29sbGVjdGlvbjwqPjspWiApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBjb250YWluc0FsbCgKLWphdmEudXRpbC5Db2xsZWN0aW9uKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGhhc2hDb2RlKCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNFbXB0eSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0l0ZXJhdG9yPFRFOz47ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnV0aWwuSXRlcmF0b3IgaXRlcmF0b3IoKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiByZW1vdmUoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0NvbGxlY3Rpb248Kj47KVogKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gcmVtb3ZlQWxsKAotamF2YS51dGlsLkNvbGxlY3Rpb24pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvQ29sbGVjdGlvbjwqPjspWiApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiByZXRhaW5BbGwoCi1qYXZhLnV0aWwuQ29sbGVjdGlvbikKLQotcHVibGljIGFic3RyYWN0IGludCBzaXplKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5PYmplY3RbXSB0b0FycmF5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+KFtUVDspW1RUOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLk9iamVjdFtdIHRvQXJyYXkoCi1qYXZhLmxhbmcuT2JqZWN0W10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxFOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS91dGlsL0Fic3RyYWN0Q29sbGVjdGlvbjxURTs+O0xqYXZhL3V0aWwvU2V0PFRFOz47ICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZhLnV0aWwuQWJzdHJhY3RTZXQgZXh0ZW5kcyBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uIGltcGxlbWVudHMgamF2YS51dGlsLlNldAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0NvbGxlY3Rpb248Kj47KVogKQotcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKAotamF2YS51dGlsLkNvbGxlY3Rpb24pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQWJzdHJhY3RTZXQ8VEs7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotIGNsYXNzIGphdmEudXRpbC5BYnN0cmFjdE1hcCQxIGV4dGVuZHMgamF2YS51dGlsLkFic3RyYWN0U2V0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGphdmEudXRpbC5BYnN0cmFjdE1hcCB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuQWJzdHJhY3RNYXApCi0KLXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvSXRlcmF0b3I8VEs7PjsgKQotcHVibGljIGphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvcigpCi0KLXB1YmxpYyBpbnQgc2l6ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3V0aWwvSXRlcmF0b3I8VFY7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotIGNsYXNzIGphdmEudXRpbC5BYnN0cmFjdE1hcCQyJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLkl0ZXJhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9JdGVyYXRvcjxMamF2YS91dGlsL01hcCRFbnRyeTxUSztUVjs+Oz47ICkKLSBqYXZhLnV0aWwuSXRlcmF0b3Igc2V0SXRlcmF0b3IKLQotZmluYWwgamF2YS51dGlsLkFic3RyYWN0TWFwJDIgdGhpcyQxCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkFic3RyYWN0TWFwJDIpCi0KLXB1YmxpYyBib29sZWFuIGhhc05leHQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVFY7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IG5leHQoKQotCi1wdWJsaWMgdm9pZCByZW1vdmUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0Fic3RyYWN0Q29sbGVjdGlvbjxUVjs+OyApCi0gY2xhc3MgamF2YS51dGlsLkFic3RyYWN0TWFwJDIgZXh0ZW5kcyBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGphdmEudXRpbC5BYnN0cmFjdE1hcCB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuQWJzdHJhY3RNYXApCi0KLXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvSXRlcmF0b3I8VFY7PjsgKQotcHVibGljIGphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvcigpCi0KLXB1YmxpYyBpbnQgc2l6ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxFOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS9sYW5nL09iamVjdDtMamF2YS91dGlsL0NvbGxlY3Rpb248VEU7PjsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZhLnV0aWwuUXVldWUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLkNvbGxlY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVEU7ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuT2JqZWN0IGVsZW1lbnQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShURTspWiApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBvZmZlcigKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClURTsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5PYmplY3QgcGVlaygpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClURTsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5PYmplY3QgcG9sbCgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClURTsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5PYmplY3QgcmVtb3ZlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEU6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL3V0aWwvQWJzdHJhY3RDb2xsZWN0aW9uPFRFOz47TGphdmEvdXRpbC9RdWV1ZTxURTs+OyApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgamF2YS51dGlsLkFic3RyYWN0UXVldWUgZXh0ZW5kcyBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uIGltcGxlbWVudHMgamF2YS51dGlsLlF1ZXVlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEU7KVogKQotcHVibGljIGJvb2xlYW4gYWRkKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9Db2xsZWN0aW9uPCtURTs+OylaICkKLXB1YmxpYyBib29sZWFuIGFkZEFsbCgKLWphdmEudXRpbC5Db2xsZWN0aW9uKQotCi1wdWJsaWMgdm9pZCBjbGVhcigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClURTsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZWxlbWVudCgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClURTsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgcmVtb3ZlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEU6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL3V0aWwvQWJzdHJhY3RMaXN0PFRFOz47ICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZhLnV0aWwuQWJzdHJhY3RTZXF1ZW50aWFsTGlzdCBleHRlbmRzIGphdmEudXRpbC5BYnN0cmFjdExpc3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJVEU7KVYgKQotcHVibGljIHZvaWQgYWRkKAotaW50Ci1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJTGphdmEvdXRpbC9Db2xsZWN0aW9uPCtURTs+OylaICkKLXB1YmxpYyBib29sZWFuIGFkZEFsbCgKLWludAotamF2YS51dGlsLkNvbGxlY3Rpb24pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KEkpVEU7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldCgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvSXRlcmF0b3I8VEU7PjsgKQotcHVibGljIGphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvcigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KEkpTGphdmEvdXRpbC9MaXN0SXRlcmF0b3I8VEU7PjsgKQotcHVibGljIGFic3RyYWN0IGphdmEudXRpbC5MaXN0SXRlcmF0b3IgbGlzdEl0ZXJhdG9yKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJKVRFOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCByZW1vdmUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KElURTspVEU7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHNldCgKLWludAotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEU6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL3V0aWwvQWJzdHJhY3RMaXN0PFRFOz47TGphdmEvdXRpbC9MaXN0PFRFOz47TGphdmEvbGFuZy9DbG9uZWFibGU7TGphdmEvaW8vU2VyaWFsaXphYmxlO0xqYXZhL3V0aWwvUmFuZG9tQWNjZXNzOyApCi1wdWJsaWMgY2xhc3MgamF2YS51dGlsLkFycmF5TGlzdCBleHRlbmRzIGphdmEudXRpbC5BYnN0cmFjdExpc3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuTGlzdCwgamF2YS5sYW5nLkNsb25lYWJsZSwgamF2YS5pby5TZXJpYWxpemFibGUsIGphdmEudXRpbC5SYW5kb21BY2Nlc3MKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLk9iamVjdFtdIGVtcHR5QXJyYXkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5pby5PYmplY3RTdHJlYW1GaWVsZFtdIHNlcmlhbFBlcnNpc3RlbnRGaWVsZHMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9W1RFOyApCi1wcml2YXRlIHRyYW5zaWVudCBqYXZhLmxhbmcuT2JqZWN0W10gYXJyYXkKLQotcHJpdmF0ZSB0cmFuc2llbnQgaW50IGZpcnN0SW5kZXgKLQotcHJpdmF0ZSB0cmFuc2llbnQgaW50IGxhc3RJbmRleAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0NvbGxlY3Rpb248K1RFOz47KVYgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkNvbGxlY3Rpb24pCi0KLXByaXZhdGUgdm9pZCBncm93QXRFbmQoCi1pbnQpCi0KLXByaXZhdGUgdm9pZCBncm93QXRGcm9udCgKLWludCkKLQotcHJpdmF0ZSB2b2lkIGdyb3dGb3JJbnNlcnQoCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSSlbVEU7ICkKLXByaXZhdGUgamF2YS5sYW5nLk9iamVjdFtdIG5ld0VsZW1lbnRBcnJheSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9sYW5nL0NsYXNzTm90Rm91bmRFeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCByZWFkT2JqZWN0KAotamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KAotamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KElURTspViApCi1wdWJsaWMgdm9pZCBhZGQoCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRFOylaICkKLXB1YmxpYyBib29sZWFuIGFkZCgKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KElMamF2YS91dGlsL0NvbGxlY3Rpb248K1RFOz47KVogKQotcHVibGljIGJvb2xlYW4gYWRkQWxsKAotaW50Ci1qYXZhLnV0aWwuQ29sbGVjdGlvbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9Db2xsZWN0aW9uPCtURTs+OylaICkKLXB1YmxpYyBib29sZWFuIGFkZEFsbCgKLWphdmEudXRpbC5Db2xsZWN0aW9uKQotCi1wdWJsaWMgdm9pZCBjbGVhcigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGNsb25lKCkKLQotcHVibGljIGJvb2xlYW4gY29udGFpbnMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgdm9pZCBlbnN1cmVDYXBhY2l0eSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSSlURTsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0KAotaW50KQotCi1wdWJsaWMgaW50IGluZGV4T2YoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkKLQotcHVibGljIGludCBsYXN0SW5kZXhPZigKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KEkpVEU7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHJlbW92ZSgKLWludCkKLQotcHVibGljIGJvb2xlYW4gcmVtb3ZlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHJvdGVjdGVkIHZvaWQgcmVtb3ZlUmFuZ2UoCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSVRFOylURTsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3Qgc2V0KAotaW50Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50IHNpemUoKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdFtdIHRvQXJyYXkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz4oW1RUOylbVFQ7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0W10gdG9BcnJheSgKLWphdmEubGFuZy5PYmplY3RbXSkKLQotcHVibGljIHZvaWQgdHJpbVRvU2l6ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9BcnJheXM7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08RTpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvdXRpbC9BYnN0cmFjdExpc3Q8VEU7PjtMamF2YS91dGlsL0xpc3Q8VEU7PjtMamF2YS9pby9TZXJpYWxpemFibGU7TGphdmEvdXRpbC9SYW5kb21BY2Nlc3M7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9QXJyYXlMaXN0ICkKLSBjbGFzcyBqYXZhLnV0aWwuQXJyYXlzJEFycmF5TGlzdCBleHRlbmRzIGphdmEudXRpbC5BYnN0cmFjdExpc3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuTGlzdCwgamF2YS5pby5TZXJpYWxpemFibGUsIGphdmEudXRpbC5SYW5kb21BY2Nlc3MKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9W1RFOyApCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5PYmplY3RbXSBhCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oW1RFOylWICkKLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5PYmplY3RbXSkKLQotcHVibGljIGJvb2xlYW4gY29udGFpbnMoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJKVRFOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXQoCi1pbnQpCi0KLXB1YmxpYyBpbnQgaW5kZXhPZigKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBpbnQgbGFzdEluZGV4T2YoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJVEU7KVRFOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBzZXQoCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBpbnQgc2l6ZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0W10gdG9BcnJheSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFQ6TGphdmEvbGFuZy9PYmplY3Q7PihbVFQ7KVtUVDsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3RbXSB0b0FycmF5KAotamF2YS5sYW5nLk9iamVjdFtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGphdmEvdXRpbC9BcnJheXMkQXJyYXlMaXN0OyApCi1wdWJsaWMgY2xhc3MgamF2YS51dGlsLkFycmF5cyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIGJvb2xlYW4gJGFzc2VydGlvbnNEaXNhYmxlZAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0lNUExFX0xFTkdUSAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFQ6TGphdmEvbGFuZy9PYmplY3Q7PihbVFQ7KUxqYXZhL3V0aWwvTGlzdDxUVDs+OyApCi1wdWJsaWMgc3RhdGljIHRyYW5zaWVudCBqYXZhLnV0aWwuTGlzdCBhc0xpc3QoCi1qYXZhLmxhbmcuT2JqZWN0W10pCi0KLXB1YmxpYyBzdGF0aWMgaW50IGJpbmFyeVNlYXJjaCgKLWJ5dGVbXQotYnl0ZSkKLQotcHVibGljIHN0YXRpYyBpbnQgYmluYXJ5U2VhcmNoKAotY2hhcltdCi1jaGFyKQotCi1wdWJsaWMgc3RhdGljIGludCBiaW5hcnlTZWFyY2goCi1kb3VibGVbXQotZG91YmxlKQotCi1wdWJsaWMgc3RhdGljIGludCBiaW5hcnlTZWFyY2goCi1mbG9hdFtdCi1mbG9hdCkKLQotcHVibGljIHN0YXRpYyBpbnQgYmluYXJ5U2VhcmNoKAotaW50W10KLWludCkKLQotcHVibGljIHN0YXRpYyBpbnQgYmluYXJ5U2VhcmNoKAotbG9uZ1tdCi1sb25nKQotCi1wdWJsaWMgc3RhdGljIGludCBiaW5hcnlTZWFyY2goCi1qYXZhLmxhbmcuT2JqZWN0W10KLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFQ6TGphdmEvbGFuZy9PYmplY3Q7PihbVFQ7VFQ7TGphdmEvdXRpbC9Db21wYXJhdG9yPC1UVDs+OylJICkKLXB1YmxpYyBzdGF0aWMgaW50IGJpbmFyeVNlYXJjaCgKLWphdmEubGFuZy5PYmplY3RbXQotamF2YS5sYW5nLk9iamVjdAotamF2YS51dGlsLkNvbXBhcmF0b3IpCi0KLXB1YmxpYyBzdGF0aWMgaW50IGJpbmFyeVNlYXJjaCgKLXNob3J0W10KLXNob3J0KQotCi1wcml2YXRlIHN0YXRpYyBpbnQgY2hhckF0KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrQm91bmRzKAotaW50Ci1pbnQKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb3B5U3dhcCgKLWphdmEubGFuZy5PYmplY3RbXQotaW50Ci1qYXZhLmxhbmcuT2JqZWN0W10KLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gZGVlcEVxdWFscygKLWphdmEubGFuZy5PYmplY3RbXQotamF2YS5sYW5nLk9iamVjdFtdKQotCi1wcml2YXRlIHN0YXRpYyBib29sZWFuIGRlZXBFcXVhbHNFbGVtZW50cygKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBzdGF0aWMgaW50IGRlZXBIYXNoQ29kZSgKLWphdmEubGFuZy5PYmplY3RbXSkKLQotcHJpdmF0ZSBzdGF0aWMgaW50IGRlZXBIYXNoQ29kZUVsZW1lbnQoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZGVlcFRvU3RyaW5nKAotamF2YS5sYW5nLk9iamVjdFtdKQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGRlZXBUb1N0cmluZ0ltcGwoCi1qYXZhLmxhbmcuT2JqZWN0W10KLWphdmEubGFuZy5PYmplY3RbXQotamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIpCi0KLXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGVlcFRvU3RyaW5nSW1wbENvbnRhaW5zKAotamF2YS5sYW5nLk9iamVjdFtdCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gZXF1YWxzKAotYnl0ZVtdCi1ieXRlW10pCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbHMoCi1jaGFyW10KLWNoYXJbXSkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFscygKLWRvdWJsZVtdCi1kb3VibGVbXSkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFscygKLWZsb2F0W10KLWZsb2F0W10pCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbHMoCi1pbnRbXQotaW50W10pCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbHMoCi1sb25nW10KLWxvbmdbXSkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3RbXQotamF2YS5sYW5nLk9iamVjdFtdKQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gZXF1YWxzKAotc2hvcnRbXQotc2hvcnRbXSkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFscygKLWJvb2xlYW5bXQotYm9vbGVhbltdKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgZmlsbCgKLWJ5dGVbXQotYnl0ZSkKLQotcHVibGljIHN0YXRpYyB2b2lkIGZpbGwoCi1ieXRlW10KLWludAotaW50Ci1ieXRlKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgZmlsbCgKLWNoYXJbXQotY2hhcikKLQotcHVibGljIHN0YXRpYyB2b2lkIGZpbGwoCi1jaGFyW10KLWludAotaW50Ci1jaGFyKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgZmlsbCgKLWRvdWJsZVtdCi1kb3VibGUpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBmaWxsKAotZG91YmxlW10KLWludAotaW50Ci1kb3VibGUpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBmaWxsKAotZmxvYXRbXQotZmxvYXQpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBmaWxsKAotZmxvYXRbXQotaW50Ci1pbnQKLWZsb2F0KQotCi1wdWJsaWMgc3RhdGljIHZvaWQgZmlsbCgKLWludFtdCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBmaWxsKAotaW50W10KLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBmaWxsKAotbG9uZ1tdCi1pbnQKLWludAotbG9uZykKLQotcHVibGljIHN0YXRpYyB2b2lkIGZpbGwoCi1sb25nW10KLWxvbmcpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBmaWxsKAotamF2YS5sYW5nLk9iamVjdFtdCi1pbnQKLWludAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHN0YXRpYyB2b2lkIGZpbGwoCi1qYXZhLmxhbmcuT2JqZWN0W10KLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBmaWxsKAotc2hvcnRbXQotaW50Ci1pbnQKLXNob3J0KQotCi1wdWJsaWMgc3RhdGljIHZvaWQgZmlsbCgKLXNob3J0W10KLXNob3J0KQotCi1wdWJsaWMgc3RhdGljIHZvaWQgZmlsbCgKLWJvb2xlYW5bXQotaW50Ci1pbnQKLWJvb2xlYW4pCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBmaWxsKAotYm9vbGVhbltdCi1ib29sZWFuKQotCi1wcml2YXRlIHN0YXRpYyBpbnQgZmluZCgKLWphdmEubGFuZy5PYmplY3RbXQotamF2YS5sYW5nLkNvbXBhcmFibGUKLWludAotaW50Ci1pbnQpCi0KLXByaXZhdGUgc3RhdGljIGludCBmaW5kKAotamF2YS5sYW5nLk9iamVjdFtdCi1qYXZhLmxhbmcuT2JqZWN0Ci1pbnQKLWludAotaW50Ci1qYXZhLnV0aWwuQ29tcGFyYXRvcikKLQotcHVibGljIHN0YXRpYyBpbnQgaGFzaENvZGUoCi1ieXRlW10pCi0KLXB1YmxpYyBzdGF0aWMgaW50IGhhc2hDb2RlKAotY2hhcltdKQotCi1wdWJsaWMgc3RhdGljIGludCBoYXNoQ29kZSgKLWRvdWJsZVtdKQotCi1wdWJsaWMgc3RhdGljIGludCBoYXNoQ29kZSgKLWZsb2F0W10pCi0KLXB1YmxpYyBzdGF0aWMgaW50IGhhc2hDb2RlKAotaW50W10pCi0KLXB1YmxpYyBzdGF0aWMgaW50IGhhc2hDb2RlKAotbG9uZ1tdKQotCi1wdWJsaWMgc3RhdGljIGludCBoYXNoQ29kZSgKLWphdmEubGFuZy5PYmplY3RbXSkKLQotcHVibGljIHN0YXRpYyBpbnQgaGFzaENvZGUoCi1zaG9ydFtdKQotCi1wdWJsaWMgc3RhdGljIGludCBoYXNoQ29kZSgKLWJvb2xlYW5bXSkKLQotcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBsZXNzVGhhbigKLWRvdWJsZQotZG91YmxlKQotCi1wcml2YXRlIHN0YXRpYyBib29sZWFuIGxlc3NUaGFuKAotZmxvYXQKLWZsb2F0KQotCi1wcml2YXRlIHN0YXRpYyBpbnQgbWVkMygKLWJ5dGVbXQotaW50Ci1pbnQKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgaW50IG1lZDMoCi1jaGFyW10KLWludAotaW50Ci1pbnQpCi0KLXByaXZhdGUgc3RhdGljIGludCBtZWQzKAotZG91YmxlW10KLWludAotaW50Ci1pbnQpCi0KLXByaXZhdGUgc3RhdGljIGludCBtZWQzKAotZmxvYXRbXQotaW50Ci1pbnQKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgaW50IG1lZDMoCi1pbnRbXQotaW50Ci1pbnQKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgaW50IG1lZDMoCi1sb25nW10KLWludAotaW50Ci1pbnQpCi0KLXByaXZhdGUgc3RhdGljIGludCBtZWQzKAotc2hvcnRbXQotaW50Ci1pbnQKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgaW50IG1lZENoYXIoCi1pbnQKLWludAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nW10KLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBtZXJnZVNvcnQoCi1qYXZhLmxhbmcuT2JqZWN0W10KLWphdmEubGFuZy5PYmplY3RbXQotaW50Ci1pbnQpCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgbWVyZ2VTb3J0KAotamF2YS5sYW5nLk9iamVjdFtdCi1qYXZhLmxhbmcuT2JqZWN0W10KLWludAotaW50Ci1qYXZhLnV0aWwuQ29tcGFyYXRvcikKLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBzb3J0KAotaW50Ci1pbnQKLWJ5dGVbXSkKLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBzb3J0KAotaW50Ci1pbnQKLWNoYXJbXSkKLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBzb3J0KAotaW50Ci1pbnQKLWRvdWJsZVtdKQotCi1wcml2YXRlIHN0YXRpYyB2b2lkIHNvcnQoCi1pbnQKLWludAotZmxvYXRbXSkKLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBzb3J0KAotaW50Ci1pbnQKLWludFtdKQotCi1wcml2YXRlIHN0YXRpYyB2b2lkIHNvcnQoCi1pbnQKLWludAotbG9uZ1tdKQotCi1wcml2YXRlIHN0YXRpYyB2b2lkIHNvcnQoCi1pbnQKLWludAotamF2YS5sYW5nLk9iamVjdFtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz4oSUlbVFQ7TGphdmEvdXRpbC9Db21wYXJhdG9yPC1UVDs+OylWICkKLXByaXZhdGUgc3RhdGljIHZvaWQgc29ydCgKLWludAotaW50Ci1qYXZhLmxhbmcuT2JqZWN0W10KLWphdmEudXRpbC5Db21wYXJhdG9yKQotCi1wcml2YXRlIHN0YXRpYyB2b2lkIHNvcnQoCi1pbnQKLWludAotc2hvcnRbXSkKLQotcHVibGljIHN0YXRpYyB2b2lkIHNvcnQoCi1ieXRlW10pCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBzb3J0KAotYnl0ZVtdCi1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyB2b2lkIHNvcnQoCi1jaGFyW10pCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBzb3J0KAotY2hhcltdCi1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyB2b2lkIHNvcnQoCi1kb3VibGVbXSkKLQotcHVibGljIHN0YXRpYyB2b2lkIHNvcnQoCi1kb3VibGVbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBzb3J0KAotZmxvYXRbXSkKLQotcHVibGljIHN0YXRpYyB2b2lkIHNvcnQoCi1mbG9hdFtdCi1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyB2b2lkIHNvcnQoCi1pbnRbXSkKLQotcHVibGljIHN0YXRpYyB2b2lkIHNvcnQoCi1pbnRbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBzb3J0KAotbG9uZ1tdKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgc29ydCgKLWxvbmdbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBzb3J0KAotamF2YS5sYW5nLk9iamVjdFtdKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgc29ydCgKLWphdmEubGFuZy5PYmplY3RbXQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFQ6TGphdmEvbGFuZy9PYmplY3Q7PihbVFQ7SUlMamF2YS91dGlsL0NvbXBhcmF0b3I8LVRUOz47KVYgKQotcHVibGljIHN0YXRpYyB2b2lkIHNvcnQoCi1qYXZhLmxhbmcuT2JqZWN0W10KLWludAotaW50Ci1qYXZhLnV0aWwuQ29tcGFyYXRvcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+KFtUVDtMamF2YS91dGlsL0NvbXBhcmF0b3I8LVRUOz47KVYgKQotcHVibGljIHN0YXRpYyB2b2lkIHNvcnQoCi1qYXZhLmxhbmcuT2JqZWN0W10KLWphdmEudXRpbC5Db21wYXJhdG9yKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgc29ydCgKLXNob3J0W10pCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBzb3J0KAotc2hvcnRbXQotaW50Ci1pbnQpCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgc3RhYmxlU3RyaW5nU29ydCgKLWphdmEubGFuZy5TdHJpbmdbXQotaW50Ci1pbnQpCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgc3RhYmxlU3RyaW5nU29ydCgKLWphdmEubGFuZy5TdHJpbmdbXQotamF2YS5sYW5nLlN0cmluZ1tdCi1qYXZhLmxhbmcuU3RyaW5nW10KLWludAotaW50Ci1pbnQpCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgc3dhcCgKLWludAotaW50Ci1qYXZhLmxhbmcuT2JqZWN0W10pCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygKLWJ5dGVbXSkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKAotY2hhcltdKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoCi1kb3VibGVbXSkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKAotZmxvYXRbXSkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKAotaW50W10pCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygKLWxvbmdbXSkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKAotamF2YS5sYW5nLk9iamVjdFtdKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoCi1zaG9ydFtdKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoCi1ib29sZWFuW10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS51dGlsLkJpdFNldCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgamF2YS5sYW5nLkNsb25lYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRUxNX1NJWkUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0KLXByaXZhdGUgbG9uZ1tdIGJpdHMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1sb25nW10pCi0KLXByaXZhdGUgdm9pZCBncm93Qml0cygKLWludCkKLQotcHVibGljIHZvaWQgYW5kKAotamF2YS51dGlsLkJpdFNldCkKLQotcHVibGljIHZvaWQgYW5kTm90KAotamF2YS51dGlsLkJpdFNldCkKLQotcHVibGljIGludCBjYXJkaW5hbGl0eSgpCi0KLXB1YmxpYyB2b2lkIGNsZWFyKCkKLQotcHVibGljIHZvaWQgY2xlYXIoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGNsZWFyKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGNsb25lKCkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHZvaWQgZmxpcCgKLWludCkKLQotcHVibGljIHZvaWQgZmxpcCgKLWludAotaW50KQotCi1wdWJsaWMgamF2YS51dGlsLkJpdFNldCBnZXQoCi1pbnQKLWludCkKLQotcHVibGljIGJvb2xlYW4gZ2V0KAotaW50KQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLQotcHVibGljIGJvb2xlYW4gaW50ZXJzZWN0cygKLWphdmEudXRpbC5CaXRTZXQpCi0KLXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKQotCi1wdWJsaWMgaW50IGxlbmd0aCgpCi0KLXB1YmxpYyBpbnQgbmV4dENsZWFyQml0KAotaW50KQotCi1wdWJsaWMgaW50IG5leHRTZXRCaXQoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIG9yKAotamF2YS51dGlsLkJpdFNldCkKLQotcHVibGljIHZvaWQgc2V0KAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXQoCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgc2V0KAotaW50Ci1pbnQKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldCgKLWludAotYm9vbGVhbikKLQotcHVibGljIGludCBzaXplKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1wdWJsaWMgdm9pZCB4b3IoCi1qYXZhLnV0aWwuQml0U2V0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS9pby9TZXJpYWxpemFibGU7TGphdmEvbGFuZy9DbG9uZWFibGU7TGphdmEvbGFuZy9Db21wYXJhYmxlPExqYXZhL3V0aWwvQ2FsZW5kYXI7PjsgKQotcHVibGljIGFic3RyYWN0IGNsYXNzIGphdmEudXRpbC5DYWxlbmRhciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgamF2YS5sYW5nLkNsb25lYWJsZSwgamF2YS5sYW5nLkNvbXBhcmFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQU0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQU1fUE0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVBSSUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVVHVVNUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERBVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREFZX09GX01PTlRICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERBWV9PRl9XRUVLCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERBWV9PRl9XRUVLX0lOX01PTlRICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERBWV9PRl9ZRUFSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFQ0VNQkVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERTVF9PRkZTRVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJBCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZFQlJVQVJZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJRUxEX0NPVU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZSSURBWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBIT1VSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhPVVJfT0ZfREFZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBTlVBUlkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSlVMWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBKVU5FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BUkNICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSUxMSVNFQ09ORAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSU5VVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9OREFZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PTlRICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PVkVNQkVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9DVE9CRVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUE0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0FUVVJEQVkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VDT05ECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUFRFTUJFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVU5EQVkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEhVUlNEQVkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFVFU0RBWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTkRFQ0lNQkVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdFRE5FU0RBWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBXRUVLX09GX01PTlRICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdFRUtfT0ZfWUVBUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBZRUFSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFpPTkVfT0ZGU0VUCi0KLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmdbXSBmaWVsZE5hbWVzCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEuaW8uT2JqZWN0U3RyZWFtRmllbGRbXSBzZXJpYWxQZXJzaXN0ZW50RmllbGRzCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotCi1wcm90ZWN0ZWQgYm9vbGVhbiBhcmVGaWVsZHNTZXQKLQotcHJvdGVjdGVkIGludFtdIGZpZWxkcwotCi1wcml2YXRlIGludCBmaXJzdERheU9mV2VlawotCi1wcm90ZWN0ZWQgYm9vbGVhbltdIGlzU2V0Ci0KLXByb3RlY3RlZCBib29sZWFuIGlzVGltZVNldAotCi10cmFuc2llbnQgaW50IGxhc3REYXRlRmllbGRTZXQKLQotdHJhbnNpZW50IGludCBsYXN0VGltZUZpZWxkU2V0Ci0KLXByaXZhdGUgYm9vbGVhbiBsZW5pZW50Ci0KLXByaXZhdGUgaW50IG1pbmltYWxEYXlzSW5GaXJzdFdlZWsKLQotcHJvdGVjdGVkIGxvbmcgdGltZQotCi1wcml2YXRlIGphdmEudXRpbC5UaW1lWm9uZSB6b25lCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oKQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuVGltZVpvbmUpCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLWphdmEudXRpbC5UaW1lWm9uZQotamF2YS51dGlsLkxvY2FsZSkKLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuTG9jYWxlW10gZ2V0QXZhaWxhYmxlTG9jYWxlcygpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLkNhbGVuZGFyIGdldEluc3RhbmNlKCkKLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuQ2FsZW5kYXIgZ2V0SW5zdGFuY2UoCi1qYXZhLnV0aWwuTG9jYWxlKQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5DYWxlbmRhciBnZXRJbnN0YW5jZSgKLWphdmEudXRpbC5UaW1lWm9uZSkKLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuQ2FsZW5kYXIgZ2V0SW5zdGFuY2UoCi1qYXZhLnV0aWwuVGltZVpvbmUKLWphdmEudXRpbC5Mb2NhbGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgcmVhZE9iamVjdCgKLWphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCB3cml0ZU9iamVjdCgKLWphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBhZGQoCi1pbnQKLWludCkKLQotcHVibGljIGJvb2xlYW4gYWZ0ZXIoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYm9vbGVhbiBiZWZvcmUoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgZmluYWwgdm9pZCBjbGVhcigpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIGNsZWFyKAotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBjbG9uZSgpCi0KLXB1YmxpYyB2b2xhdGlsZSBpbnQgY29tcGFyZVRvKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGludCBjb21wYXJlVG8oCi1qYXZhLnV0aWwuQ2FsZW5kYXIpCi0KLXByb3RlY3RlZCB2b2lkIGNvbXBsZXRlKCkKLQotcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgY29tcHV0ZUZpZWxkcygpCi0KLXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGNvbXB1dGVUaW1lKCkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGludCBnZXQoCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0QWN0dWFsTWF4aW11bSgKLWludCkKLQotcHVibGljIGludCBnZXRBY3R1YWxNaW5pbXVtKAotaW50KQotCi1wdWJsaWMgaW50IGdldEZpcnN0RGF5T2ZXZWVrKCkKLQotcHVibGljIGFic3RyYWN0IGludCBnZXRHcmVhdGVzdE1pbmltdW0oCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0TGVhc3RNYXhpbXVtKAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldE1heGltdW0oCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0TWluaW1hbERheXNJbkZpcnN0V2VlaygpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0TWluaW11bSgKLWludCkKLQotcHVibGljIGZpbmFsIGphdmEudXRpbC5EYXRlIGdldFRpbWUoKQotCi1wdWJsaWMgbG9uZyBnZXRUaW1lSW5NaWxsaXMoKQotCi1wdWJsaWMgamF2YS51dGlsLlRpbWVab25lIGdldFRpbWVab25lKCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLXByb3RlY3RlZCBmaW5hbCBpbnQgaW50ZXJuYWxHZXQoCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIGlzTGVuaWVudCgpCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGlzU2V0KAotaW50KQotCi1wdWJsaWMgdm9pZCByb2xsKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJvbGwoCi1pbnQKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldCgKLWludAotaW50KQotCi1wdWJsaWMgZmluYWwgdm9pZCBzZXQoCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgZmluYWwgdm9pZCBzZXQoCi1pbnQKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIGZpbmFsIHZvaWQgc2V0KAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgc2V0Rmlyc3REYXlPZldlZWsoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldExlbmllbnQoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRNaW5pbWFsRGF5c0luRmlyc3RXZWVrKAotaW50KQotCi1wdWJsaWMgZmluYWwgdm9pZCBzZXRUaW1lKAotamF2YS51dGlsLkRhdGUpCi0KLXB1YmxpYyB2b2lkIHNldFRpbWVJbk1pbGxpcygKLWxvbmcpCi0KLXB1YmxpYyB2b2lkIHNldFRpbWVab25lKAotamF2YS51dGlsLlRpbWVab25lKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3V0aWwvRW51bWVyYXRpb248VFQ7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotZmluYWwgY2xhc3MgamF2YS51dGlsLkNvbGxlY3Rpb25zJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLkVudW1lcmF0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9JdGVyYXRvcjxUVDs+OyApCi0gamF2YS51dGlsLkl0ZXJhdG9yIGl0Ci0KLWZpbmFsIGphdmEudXRpbC5Db2xsZWN0aW9uIHZhbCRjCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkNvbGxlY3Rpb24pCi0KLXB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClUVDsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgbmV4dEVsZW1lbnQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08RTpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvdXRpbC9Db2xsZWN0aW9uPFRFOz47TGphdmEvaW8vU2VyaWFsaXphYmxlOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPUNoZWNrZWRDb2xsZWN0aW9uICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvQ29sbGVjdGlvbnM7ICkKLSBjbGFzcyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMkQ2hlY2tlZENvbGxlY3Rpb24gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLkNvbGxlY3Rpb24sIGphdmEuaW8uU2VyaWFsaXphYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQ29sbGVjdGlvbjxURTs+OyApCi0gamF2YS51dGlsLkNvbGxlY3Rpb24gYwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvQ2xhc3M8VEU7PjsgKQotIGphdmEubGFuZy5DbGFzcyB0eXBlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9Db2xsZWN0aW9uPFRFOz47TGphdmEvbGFuZy9DbGFzczxURTs+OylWICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEudXRpbC5Db2xsZWN0aW9uCi1qYXZhLmxhbmcuQ2xhc3MpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRFOylaICkKLXB1YmxpYyBib29sZWFuIGFkZCgKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvQ29sbGVjdGlvbjwrVEU7PjspWiApCi1wdWJsaWMgYm9vbGVhbiBhZGRBbGwoCi1qYXZhLnV0aWwuQ29sbGVjdGlvbikKLQotcHVibGljIHZvaWQgY2xlYXIoKQotCi1wdWJsaWMgYm9vbGVhbiBjb250YWlucygKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvQ29sbGVjdGlvbjwqPjspWiApCi1wdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbCgKLWphdmEudXRpbC5Db2xsZWN0aW9uKQotCi1wdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvSXRlcmF0b3I8VEU7PjsgKQotcHVibGljIGphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvcigpCi0KLXB1YmxpYyBib29sZWFuIHJlbW92ZSgKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvQ29sbGVjdGlvbjwqPjspWiApCi1wdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoCi1qYXZhLnV0aWwuQ29sbGVjdGlvbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9Db2xsZWN0aW9uPCo+OylaICkKLXB1YmxpYyBib29sZWFuIHJldGFpbkFsbCgKLWphdmEudXRpbC5Db2xsZWN0aW9uKQotCi1wdWJsaWMgaW50IHNpemUoKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdFtdIHRvQXJyYXkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz4oW1RUOylbVFQ7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0W10gdG9BcnJheSgKLWphdmEubGFuZy5PYmplY3RbXSkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvQ29sbGVjdGlvbnM7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9Q2hlY2tlZExpc3QgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxFOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS91dGlsL0NvbGxlY3Rpb25zJENoZWNrZWRDb2xsZWN0aW9uPFRFOz47TGphdmEvdXRpbC9MaXN0PFRFOz47ICkKLSBjbGFzcyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMkQ2hlY2tlZExpc3QgZXh0ZW5kcyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMkQ2hlY2tlZENvbGxlY3Rpb24gaW1wbGVtZW50cyBqYXZhLnV0aWwuTGlzdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0xpc3Q8VEU7PjsgKQotIGphdmEudXRpbC5MaXN0IGwKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0xpc3Q8VEU7PjtMamF2YS9sYW5nL0NsYXNzPFRFOz47KVYgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkxpc3QKLWphdmEubGFuZy5DbGFzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSVRFOylWICkKLXB1YmxpYyB2b2lkIGFkZCgKLWludAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSUxqYXZhL3V0aWwvQ29sbGVjdGlvbjwrVEU7PjspWiApCi1wdWJsaWMgYm9vbGVhbiBhZGRBbGwoCi1pbnQKLWphdmEudXRpbC5Db2xsZWN0aW9uKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJKVRFOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXQoCi1pbnQpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1wdWJsaWMgaW50IGluZGV4T2YoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50IGxhc3RJbmRleE9mKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvTGlzdEl0ZXJhdG9yPFRFOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yIGxpc3RJdGVyYXRvcigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KEkpTGphdmEvdXRpbC9MaXN0SXRlcmF0b3I8VEU7PjsgKQotcHVibGljIGphdmEudXRpbC5MaXN0SXRlcmF0b3IgbGlzdEl0ZXJhdG9yKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJKVRFOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCByZW1vdmUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KElURTspVEU7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHNldCgKLWludAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSUkpTGphdmEvdXRpbC9MaXN0PFRFOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBzdWJMaXN0KAotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxFOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS9sYW5nL09iamVjdDtMamF2YS91dGlsL0xpc3RJdGVyYXRvcjxURTs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL0NvbGxlY3Rpb25zOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPUNoZWNrZWRMaXN0SXRlcmF0b3IgKQotIGNsYXNzIGphdmEudXRpbC5Db2xsZWN0aW9ucyRDaGVja2VkTGlzdEl0ZXJhdG9yIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudXRpbC5MaXN0SXRlcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0xpc3RJdGVyYXRvcjxURTs+OyApCi1wcml2YXRlIGphdmEudXRpbC5MaXN0SXRlcmF0b3IgaQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvQ2xhc3M8VEU7PjsgKQotcHJpdmF0ZSBqYXZhLmxhbmcuQ2xhc3MgdHlwZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTGlzdEl0ZXJhdG9yPFRFOz47TGphdmEvbGFuZy9DbGFzczxURTs+OylWICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEudXRpbC5MaXN0SXRlcmF0b3IKLWphdmEubGFuZy5DbGFzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEU7KVYgKQotcHVibGljIHZvaWQgYWRkKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpCi0KLXB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVRFOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBuZXh0KCkKLQotcHVibGljIGludCBuZXh0SW5kZXgoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVEU7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHByZXZpb3VzKCkKLQotcHVibGljIGludCBwcmV2aW91c0luZGV4KCkKLQotcHVibGljIHZvaWQgcmVtb3ZlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEU7KVYgKQotcHVibGljIHZvaWQgc2V0KAotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEs6TGphdmEvbGFuZy9PYmplY3Q7VjpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvbGFuZy9PYmplY3Q7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvTWFwOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDUgbmFtZSA9RW50cnkgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZhLnV0aWwuTWFwJEVudHJ5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClUSzsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5PYmplY3QgZ2V0S2V5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVRWOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLk9iamVjdCBnZXRWYWx1ZSgpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgaGFzaENvZGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUVjspVFY7ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuT2JqZWN0IHNldFZhbHVlKAotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL0NvbGxlY3Rpb25zJENoZWNrZWRNYXA7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08SzpMamF2YS9sYW5nL09iamVjdDtWOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS9sYW5nL09iamVjdDtMamF2YS91dGlsL01hcCRFbnRyeTxUSztUVjs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPUNoZWNrZWRFbnRyeSApCi0gY2xhc3MgamF2YS51dGlsLkNvbGxlY3Rpb25zJENoZWNrZWRNYXAkQ2hlY2tlZEVudHJ5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudXRpbC5NYXAkRW50cnkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL01hcCRFbnRyeTxUSztUVjs+OyApCi0gamF2YS51dGlsLk1hcCRFbnRyeSBlCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9DbGFzczxUVjs+OyApCi0gamF2YS5sYW5nLkNsYXNzIHZhbHVlVHlwZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTWFwJEVudHJ5PFRLO1RWOz47TGphdmEvbGFuZy9DbGFzczxUVjs+OylWICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEudXRpbC5NYXAkRW50cnkKLWphdmEubGFuZy5DbGFzcykKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVRLOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRLZXkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVFY7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldFZhbHVlKCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRWOylUVjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3Qgc2V0VmFsdWUoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08SzpMamF2YS9sYW5nL09iamVjdDtWOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS9sYW5nL09iamVjdDtMamF2YS91dGlsL0l0ZXJhdG9yPExqYXZhL3V0aWwvTWFwJEVudHJ5PFRLO1RWOz47PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9Db2xsZWN0aW9ucyRDaGVja2VkTWFwJENoZWNrZWRFbnRyeVNldDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1DaGVja2VkRW50cnlJdGVyYXRvciApCi0gY2xhc3MgamF2YS51dGlsLkNvbGxlY3Rpb25zJENoZWNrZWRNYXAkQ2hlY2tlZEVudHJ5U2V0JENoZWNrZWRFbnRyeUl0ZXJhdG9yIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudXRpbC5JdGVyYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSXRlcmF0b3I8TGphdmEvdXRpbC9NYXAkRW50cnk8VEs7VFY7Pjs+OyApCi0gamF2YS51dGlsLkl0ZXJhdG9yIGkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL0NsYXNzPFRWOz47ICkKLSBqYXZhLmxhbmcuQ2xhc3MgdmFsdWVUeXBlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9JdGVyYXRvcjxMamF2YS91dGlsL01hcCRFbnRyeTxUSztUVjs+Oz47TGphdmEvbGFuZy9DbGFzczxUVjs+OylWICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEudXRpbC5JdGVyYXRvcgotamF2YS5sYW5nLkNsYXNzKQotCi1wdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgbmV4dCgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL01hcCRFbnRyeTxUSztUVjs+OyApCi1wdWJsaWMgamF2YS51dGlsLk1hcCRFbnRyeSBuZXh0KCkKLQotcHVibGljIHZvaWQgcmVtb3ZlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPUNoZWNrZWRFbnRyeVNldCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL0NvbGxlY3Rpb25zJENoZWNrZWRNYXA7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08SzpMamF2YS9sYW5nL09iamVjdDtWOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS9sYW5nL09iamVjdDtMamF2YS91dGlsL1NldDxMamF2YS91dGlsL01hcCRFbnRyeTxUSztUVjs+Oz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGphdmEvdXRpbC9Db2xsZWN0aW9ucyRDaGVja2VkTWFwJENoZWNrZWRFbnRyeVNldCRDaGVja2VkRW50cnlJdGVyYXRvcjsgKQotIGNsYXNzIGphdmEudXRpbC5Db2xsZWN0aW9ucyRDaGVja2VkTWFwJENoZWNrZWRFbnRyeVNldCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuU2V0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9TZXQ8TGphdmEvdXRpbC9NYXAkRW50cnk8VEs7VFY7Pjs+OyApCi0gamF2YS51dGlsLlNldCBzCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9DbGFzczxUVjs+OyApCi0gamF2YS5sYW5nLkNsYXNzIHZhbHVlVHlwZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvU2V0PExqYXZhL3V0aWwvTWFwJEVudHJ5PFRLO1RWOz47PjtMamF2YS9sYW5nL0NsYXNzPFRWOz47KVYgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLlNldAotamF2YS5sYW5nLkNsYXNzKQotCi1wdWJsaWMgdm9sYXRpbGUgYm9vbGVhbiBhZGQoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL01hcCRFbnRyeTxUSztUVjs+OylaICkKLXB1YmxpYyBib29sZWFuIGFkZCgKLWphdmEudXRpbC5NYXAkRW50cnkpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvQ29sbGVjdGlvbjwrTGphdmEvdXRpbC9NYXAkRW50cnk8VEs7VFY7Pjs+OylaICkKLXB1YmxpYyBib29sZWFuIGFkZEFsbCgKLWphdmEudXRpbC5Db2xsZWN0aW9uKQotCi1wdWJsaWMgdm9pZCBjbGVhcigpCi0KLXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9Db2xsZWN0aW9uPCo+OylaICkKLXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKAotamF2YS51dGlsLkNvbGxlY3Rpb24pCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvSXRlcmF0b3I8TGphdmEvdXRpbC9NYXAkRW50cnk8VEs7VFY7Pjs+OyApCi1wdWJsaWMgamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXJhdG9yKCkKLQotcHVibGljIGJvb2xlYW4gcmVtb3ZlKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9Db2xsZWN0aW9uPCo+OylaICkKLXB1YmxpYyBib29sZWFuIHJlbW92ZUFsbCgKLWphdmEudXRpbC5Db2xsZWN0aW9uKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0NvbGxlY3Rpb248Kj47KVogKQotcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKAotamF2YS51dGlsLkNvbGxlY3Rpb24pCi0KLXB1YmxpYyBpbnQgc2l6ZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0W10gdG9BcnJheSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFQ6TGphdmEvbGFuZy9PYmplY3Q7PihbVFQ7KVtUVDsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3RbXSB0b0FycmF5KAotamF2YS5sYW5nLk9iamVjdFtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9Q2hlY2tlZE1hcCApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEs6TGphdmEvbGFuZy9PYmplY3Q7VjpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvdXRpbC9NYXA8VEs7VFY7PjtMamF2YS9pby9TZXJpYWxpemFibGU7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvQ29sbGVjdGlvbnM7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGphdmEvdXRpbC9Db2xsZWN0aW9ucyRDaGVja2VkTWFwJENoZWNrZWRFbnRyeVNldDtMamF2YS91dGlsL0NvbGxlY3Rpb25zJENoZWNrZWRNYXAkQ2hlY2tlZEVudHJ5OyApCi0gY2xhc3MgamF2YS51dGlsLkNvbGxlY3Rpb25zJENoZWNrZWRNYXAgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLk1hcCwgamF2YS5pby5TZXJpYWxpemFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9DbGFzczxUSzs+OyApCi0gamF2YS5sYW5nLkNsYXNzIGtleVR5cGUKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL01hcDxUSztUVjs+OyApCi0gamF2YS51dGlsLk1hcCBtCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9DbGFzczxUVjs+OyApCi0gamF2YS5sYW5nLkNsYXNzIHZhbHVlVHlwZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTWFwPFRLO1RWOz47TGphdmEvbGFuZy9DbGFzczxUSzs+O0xqYXZhL2xhbmcvQ2xhc3M8VFY7PjspViApCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLk1hcAotamF2YS5sYW5nLkNsYXNzCi1qYXZhLmxhbmcuQ2xhc3MpCi0KLSB2b2lkIDxpbml0PigKLWphdmEudXRpbC5NYXAKLWphdmEubGFuZy5DbGFzcwotamF2YS5sYW5nLkNsYXNzCi1qYXZhLnV0aWwuQ29sbGVjdGlvbnMkMSkKLQotcHVibGljIHZvaWQgY2xlYXIoKQotCi1wdWJsaWMgYm9vbGVhbiBjb250YWluc0tleSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBib29sZWFuIGNvbnRhaW5zVmFsdWUoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9TZXQ8TGphdmEvdXRpbC9NYXAkRW50cnk8VEs7VFY7Pjs+OyApCi1wdWJsaWMgamF2YS51dGlsLlNldCBlbnRyeVNldCgpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvT2JqZWN0OylUVjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0KAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9TZXQ8VEs7PjsgKQotcHVibGljIGphdmEudXRpbC5TZXQga2V5U2V0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEs7VFY7KVRWOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBwdXQoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL01hcDwrVEs7K1RWOz47KVYgKQotcHVibGljIHZvaWQgcHV0QWxsKAotamF2YS51dGlsLk1hcCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9PYmplY3Q7KVRWOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCByZW1vdmUoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50IHNpemUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0NvbGxlY3Rpb248VFY7PjsgKQotcHVibGljIGphdmEudXRpbC5Db2xsZWN0aW9uIHZhbHVlcygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9Db2xsZWN0aW9uczsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxFOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS91dGlsL0NvbGxlY3Rpb25zJENoZWNrZWRMaXN0PFRFOz47TGphdmEvdXRpbC9SYW5kb21BY2Nlc3M7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9Q2hlY2tlZFJhbmRvbUFjY2Vzc0xpc3QgKQotIGNsYXNzIGphdmEudXRpbC5Db2xsZWN0aW9ucyRDaGVja2VkUmFuZG9tQWNjZXNzTGlzdCBleHRlbmRzIGphdmEudXRpbC5Db2xsZWN0aW9ucyRDaGVja2VkTGlzdCBpbXBsZW1lbnRzIGphdmEudXRpbC5SYW5kb21BY2Nlc3MKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9MaXN0PFRFOz47TGphdmEvbGFuZy9DbGFzczxURTs+OylWICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEudXRpbC5MaXN0Ci1qYXZhLmxhbmcuQ2xhc3MpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxFOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS91dGlsL0NvbGxlY3Rpb25zJENoZWNrZWRDb2xsZWN0aW9uPFRFOz47TGphdmEvdXRpbC9TZXQ8VEU7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1DaGVja2VkU2V0ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvQ29sbGVjdGlvbnM7ICkKLSBjbGFzcyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMkQ2hlY2tlZFNldCBleHRlbmRzIGphdmEudXRpbC5Db2xsZWN0aW9ucyRDaGVja2VkQ29sbGVjdGlvbiBpbXBsZW1lbnRzIGphdmEudXRpbC5TZXQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9TZXQ8VEU7PjtMamF2YS9sYW5nL0NsYXNzPFRFOz47KVYgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLlNldAotamF2YS5sYW5nLkNsYXNzKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEs6TGphdmEvbGFuZy9PYmplY3Q7VjpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvdXRpbC9NYXA8VEs7VFY7PjsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZhLnV0aWwuU29ydGVkTWFwIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudXRpbC5NYXAKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9Db21wYXJhdG9yPC1USzs+OyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLkNvbXBhcmF0b3IgY29tcGFyYXRvcigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClUSzsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5PYmplY3QgZmlyc3RLZXkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUSzspTGphdmEvdXRpbC9Tb3J0ZWRNYXA8VEs7VFY7PjsgKQotcHVibGljIGFic3RyYWN0IGphdmEudXRpbC5Tb3J0ZWRNYXAgaGVhZE1hcCgKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClUSzsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5PYmplY3QgbGFzdEtleSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRLO1RLOylMamF2YS91dGlsL1NvcnRlZE1hcDxUSztUVjs+OyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLlNvcnRlZE1hcCBzdWJNYXAoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUSzspTGphdmEvdXRpbC9Tb3J0ZWRNYXA8VEs7VFY7PjsgKQotcHVibGljIGFic3RyYWN0IGphdmEudXRpbC5Tb3J0ZWRNYXAgdGFpbE1hcCgKLWphdmEubGFuZy5PYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxLOkxqYXZhL2xhbmcvT2JqZWN0O1Y6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL3V0aWwvQ29sbGVjdGlvbnMkQ2hlY2tlZE1hcDxUSztUVjs+O0xqYXZhL3V0aWwvU29ydGVkTWFwPFRLO1RWOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvQ29sbGVjdGlvbnM7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9Q2hlY2tlZFNvcnRlZE1hcCApCi0gY2xhc3MgamF2YS51dGlsLkNvbGxlY3Rpb25zJENoZWNrZWRTb3J0ZWRNYXAgZXh0ZW5kcyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMkQ2hlY2tlZE1hcCBpbXBsZW1lbnRzIGphdmEudXRpbC5Tb3J0ZWRNYXAKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9Tb3J0ZWRNYXA8VEs7VFY7PjsgKQotIGphdmEudXRpbC5Tb3J0ZWRNYXAgc20KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL1NvcnRlZE1hcDxUSztUVjs+O0xqYXZhL2xhbmcvQ2xhc3M8VEs7PjtMamF2YS9sYW5nL0NsYXNzPFRWOz47KVYgKQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLlNvcnRlZE1hcAotamF2YS5sYW5nLkNsYXNzCi1qYXZhLmxhbmcuQ2xhc3MpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0NvbXBhcmF0b3I8LVRLOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuQ29tcGFyYXRvciBjb21wYXJhdG9yKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVRLOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBmaXJzdEtleSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRLOylMamF2YS91dGlsL1NvcnRlZE1hcDxUSztUVjs+OyApCi1wdWJsaWMgamF2YS51dGlsLlNvcnRlZE1hcCBoZWFkTWFwKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVRLOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBsYXN0S2V5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEs7VEs7KUxqYXZhL3V0aWwvU29ydGVkTWFwPFRLO1RWOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuU29ydGVkTWFwIHN1Yk1hcCgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRLOylMamF2YS91dGlsL1NvcnRlZE1hcDxUSztUVjs+OyApCi1wdWJsaWMgamF2YS51dGlsLlNvcnRlZE1hcCB0YWlsTWFwKAotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEU6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3V0aWwvU2V0PFRFOz47ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgamF2YS51dGlsLlNvcnRlZFNldCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuU2V0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvQ29tcGFyYXRvcjwtVEU7PjsgKQotcHVibGljIGFic3RyYWN0IGphdmEudXRpbC5Db21wYXJhdG9yIGNvbXBhcmF0b3IoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVEU7ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuT2JqZWN0IGZpcnN0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEU7KUxqYXZhL3V0aWwvU29ydGVkU2V0PFRFOz47ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnV0aWwuU29ydGVkU2V0IGhlYWRTZXQoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVEU7ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuT2JqZWN0IGxhc3QoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShURTtURTspTGphdmEvdXRpbC9Tb3J0ZWRTZXQ8VEU7PjsgKQotcHVibGljIGFic3RyYWN0IGphdmEudXRpbC5Tb3J0ZWRTZXQgc3ViU2V0KAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEU7KUxqYXZhL3V0aWwvU29ydGVkU2V0PFRFOz47ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnV0aWwuU29ydGVkU2V0IHRhaWxTZXQoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08RTpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvdXRpbC9Db2xsZWN0aW9ucyRDaGVja2VkU2V0PFRFOz47TGphdmEvdXRpbC9Tb3J0ZWRTZXQ8VEU7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1DaGVja2VkU29ydGVkU2V0ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvQ29sbGVjdGlvbnM7ICkKLSBjbGFzcyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMkQ2hlY2tlZFNvcnRlZFNldCBleHRlbmRzIGphdmEudXRpbC5Db2xsZWN0aW9ucyRDaGVja2VkU2V0IGltcGxlbWVudHMgamF2YS51dGlsLlNvcnRlZFNldAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL1NvcnRlZFNldDxURTs+OyApCi1wcml2YXRlIGphdmEudXRpbC5Tb3J0ZWRTZXQgc3MKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL1NvcnRlZFNldDxURTs+O0xqYXZhL2xhbmcvQ2xhc3M8VEU7PjspViApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuU29ydGVkU2V0Ci1qYXZhLmxhbmcuQ2xhc3MpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0NvbXBhcmF0b3I8LVRFOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuQ29tcGFyYXRvciBjb21wYXJhdG9yKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVRFOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBmaXJzdCgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRFOylMamF2YS91dGlsL1NvcnRlZFNldDxURTs+OyApCi1wdWJsaWMgamF2YS51dGlsLlNvcnRlZFNldCBoZWFkU2V0KAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVRFOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBsYXN0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEU7VEU7KUxqYXZhL3V0aWwvU29ydGVkU2V0PFRFOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuU29ydGVkU2V0IHN1YlNldCgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRFOylMamF2YS91dGlsL1NvcnRlZFNldDxURTs+OyApCi1wdWJsaWMgamF2YS51dGlsLlNvcnRlZFNldCB0YWlsU2V0KAotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI2IG5hbWUgPUNvcGllc0xpc3QgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxFOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS91dGlsL0Fic3RyYWN0TGlzdDxURTs+O0xqYXZhL2lvL1NlcmlhbGl6YWJsZTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9Db2xsZWN0aW9uczsgKQotZmluYWwgY2xhc3MgamF2YS51dGlsLkNvbGxlY3Rpb25zJENvcGllc0xpc3QgZXh0ZW5kcyBqYXZhLnV0aWwuQWJzdHJhY3RMaXN0IGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9VEU7ICkKLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLk9iamVjdCBlbGVtZW50Ci0KLXByaXZhdGUgZmluYWwgaW50IG4KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJVEU7KVYgKQotIHZvaWQgPGluaXQ+KAotaW50Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYm9vbGVhbiBjb250YWlucygKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KEkpVEU7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldCgKLWludCkKLQotcHVibGljIGludCBzaXplKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL0NvbGxlY3Rpb25zOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI2IG5hbWUgPUVtcHR5TGlzdCApCi1maW5hbCBjbGFzcyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMkRW1wdHlMaXN0IGV4dGVuZHMgamF2YS51dGlsLkFic3RyYWN0TGlzdCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuQ29sbGVjdGlvbnMkMSkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuT2JqZWN0IHJlYWRSZXNvbHZlKCkKLQotcHVibGljIGJvb2xlYW4gY29udGFpbnMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXQoCi1pbnQpCi0KLXB1YmxpYyBpbnQgc2l6ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9Db2xsZWN0aW9uczsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNiBuYW1lID1FbXB0eU1hcCApCi1maW5hbCBjbGFzcyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMkRW1wdHlNYXAgZXh0ZW5kcyBqYXZhLnV0aWwuQWJzdHJhY3RNYXAgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkNvbGxlY3Rpb25zJDEpCi0KLXByaXZhdGUgamF2YS5sYW5nLk9iamVjdCByZWFkUmVzb2x2ZSgpCi0KLXB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGJvb2xlYW4gY29udGFpbnNWYWx1ZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBqYXZhLnV0aWwuU2V0IGVudHJ5U2V0KCkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0KAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGphdmEudXRpbC5TZXQga2V5U2V0KCkKLQotcHVibGljIGphdmEudXRpbC5Db2xsZWN0aW9uIHZhbHVlcygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotIGNsYXNzIGphdmEudXRpbC5Db2xsZWN0aW9ucyRFbXB0eVNldCQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudXRpbC5JdGVyYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBqYXZhLnV0aWwuQ29sbGVjdGlvbnMkRW1wdHlTZXQgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkNvbGxlY3Rpb25zJEVtcHR5U2V0KQotCi1wdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgbmV4dCgpCi0KLXB1YmxpYyB2b2lkIHJlbW92ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9Db2xsZWN0aW9uczsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNiBuYW1lID1FbXB0eVNldCApCi1maW5hbCBjbGFzcyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMkRW1wdHlTZXQgZXh0ZW5kcyBqYXZhLnV0aWwuQWJzdHJhY3RTZXQgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkNvbGxlY3Rpb25zJDEpCi0KLXByaXZhdGUgamF2YS5sYW5nLk9iamVjdCByZWFkUmVzb2x2ZSgpCi0KLXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvcigpCi0KLXB1YmxpYyBpbnQgc2l6ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9Db2xsZWN0aW9uczsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNiBuYW1lID1SZXZlcnNlQ29tcGFyYXRvciApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFQ6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3V0aWwvQ29tcGFyYXRvcjxUVDs+O0xqYXZhL2lvL1NlcmlhbGl6YWJsZTsgKQotZmluYWwgY2xhc3MgamF2YS51dGlsLkNvbGxlY3Rpb25zJFJldmVyc2VDb21wYXJhdG9yIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudXRpbC5Db21wYXJhdG9yLCBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkNvbGxlY3Rpb25zJDEpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRUO1RUOylJICkKLXB1YmxpYyBpbnQgY29tcGFyZSgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNiBuYW1lID1SZXZlcnNlQ29tcGFyYXRvcldpdGhDb21wYXJhdG9yICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvdXRpbC9Db21wYXJhdG9yPFRUOz47TGphdmEvaW8vU2VyaWFsaXphYmxlOyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL0NvbGxlY3Rpb25zOyApCi1maW5hbCBjbGFzcyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMkUmV2ZXJzZUNvbXBhcmF0b3JXaXRoQ29tcGFyYXRvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuQ29tcGFyYXRvciwgamF2YS5pby5TZXJpYWxpemFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9Db21wYXJhdG9yPFRUOz47ICkKLXByaXZhdGUgZmluYWwgamF2YS51dGlsLkNvbXBhcmF0b3IgY29tcGFyYXRvcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvQ29tcGFyYXRvcjxUVDs+OylWICkKLSB2b2lkIDxpbml0PigKLWphdmEudXRpbC5Db21wYXJhdG9yKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUVDtUVDspSSApCi1wdWJsaWMgaW50IGNvbXBhcmUoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvQ29sbGVjdGlvbnM7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjYgbmFtZSA9U2luZ2xldG9uTGlzdCApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEU6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL3V0aWwvQWJzdHJhY3RMaXN0PFRFOz47TGphdmEvaW8vU2VyaWFsaXphYmxlOyApCi1maW5hbCBjbGFzcyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMkU2luZ2xldG9uTGlzdCBleHRlbmRzIGphdmEudXRpbC5BYnN0cmFjdExpc3QgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1URTsgKQotZmluYWwgamF2YS5sYW5nLk9iamVjdCBlbGVtZW50Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEU7KVYgKQotIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGJvb2xlYW4gY29udGFpbnMoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJKVRFOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXQoCi1pbnQpCi0KLXB1YmxpYyBpbnQgc2l6ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3V0aWwvTWFwJEVudHJ5PFRLO1RWOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLSBjbGFzcyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMkU2luZ2xldG9uTWFwJDEkMSQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudXRpbC5NYXAkRW50cnkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgamF2YS51dGlsLkNvbGxlY3Rpb25zJFNpbmdsZXRvbk1hcCQxJDEgdGhpcyQyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkNvbGxlY3Rpb25zJFNpbmdsZXRvbk1hcCQxJDEpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClUSzsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0S2V5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVRWOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRWYWx1ZSgpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUVjspVFY7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHNldFZhbHVlKAotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvdXRpbC9JdGVyYXRvcjxMamF2YS91dGlsL01hcCRFbnRyeTxUSztUVjs+Oz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLSBjbGFzcyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMkU2luZ2xldG9uTWFwJDEkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuSXRlcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGJvb2xlYW4gaGFzTmV4dAotCi1maW5hbCBqYXZhLnV0aWwuQ29sbGVjdGlvbnMkU2luZ2xldG9uTWFwJDEgdGhpcyQxCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkNvbGxlY3Rpb25zJFNpbmdsZXRvbk1hcCQxKQotCi1wdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgbmV4dCgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL01hcCRFbnRyeTxUSztUVjs+OyApCi1wdWJsaWMgamF2YS51dGlsLk1hcCRFbnRyeSBuZXh0KCkKLQotcHVibGljIHZvaWQgcmVtb3ZlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9BYnN0cmFjdFNldDxMamF2YS91dGlsL01hcCRFbnRyeTxUSztUVjs+Oz47ICkKLSBjbGFzcyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMkU2luZ2xldG9uTWFwJDEgZXh0ZW5kcyBqYXZhLnV0aWwuQWJzdHJhY3RTZXQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgamF2YS51dGlsLkNvbGxlY3Rpb25zJFNpbmdsZXRvbk1hcCB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuQ29sbGVjdGlvbnMkU2luZ2xldG9uTWFwKQotCi1wdWJsaWMgYm9vbGVhbiBjb250YWlucygKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0l0ZXJhdG9yPExqYXZhL3V0aWwvTWFwJEVudHJ5PFRLO1RWOz47PjsgKQotcHVibGljIGphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvcigpCi0KLXB1YmxpYyBpbnQgc2l6ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9Db2xsZWN0aW9uczsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxLOkxqYXZhL2xhbmcvT2JqZWN0O1Y6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL3V0aWwvQWJzdHJhY3RNYXA8VEs7VFY7PjtMamF2YS9pby9TZXJpYWxpemFibGU7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjYgbmFtZSA9U2luZ2xldG9uTWFwICkKLWZpbmFsIGNsYXNzIGphdmEudXRpbC5Db2xsZWN0aW9ucyRTaW5nbGV0b25NYXAgZXh0ZW5kcyBqYXZhLnV0aWwuQWJzdHJhY3RNYXAgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1USzsgKQotZmluYWwgamF2YS5sYW5nLk9iamVjdCBrCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9VFY7ICkKLWZpbmFsIGphdmEubGFuZy5PYmplY3QgdgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRLO1RWOylWICkKLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGJvb2xlYW4gY29udGFpbnNWYWx1ZSgKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL1NldDxMamF2YS91dGlsL01hcCRFbnRyeTxUSztUVjs+Oz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuU2V0IGVudHJ5U2V0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9PYmplY3Q7KVRWOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXQoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50IHNpemUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS91dGlsL0l0ZXJhdG9yPFRFOz47ICkKLSBjbGFzcyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMkU2luZ2xldG9uU2V0JDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLkl0ZXJhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBib29sZWFuIGhhc05leHQKLQotZmluYWwgamF2YS51dGlsLkNvbGxlY3Rpb25zJFNpbmdsZXRvblNldCB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuQ29sbGVjdGlvbnMkU2luZ2xldG9uU2V0KQotCi1wdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVRFOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBuZXh0KCkKLQotcHVibGljIHZvaWQgcmVtb3ZlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEU6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL3V0aWwvQWJzdHJhY3RTZXQ8VEU7PjtMamF2YS9pby9TZXJpYWxpemFibGU7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjYgbmFtZSA9U2luZ2xldG9uU2V0ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvQ29sbGVjdGlvbnM7ICkKLWZpbmFsIGNsYXNzIGphdmEudXRpbC5Db2xsZWN0aW9ucyRTaW5nbGV0b25TZXQgZXh0ZW5kcyBqYXZhLnV0aWwuQWJzdHJhY3RTZXQgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1URTsgKQotZmluYWwgamF2YS5sYW5nLk9iamVjdCBlbGVtZW50Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEU7KVYgKQotIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGJvb2xlYW4gY29udGFpbnMoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9JdGVyYXRvcjxURTs+OyApCi1wdWJsaWMgamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXJhdG9yKCkKLQotcHVibGljIGludCBzaXplKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL0NvbGxlY3Rpb25zOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9U3luY2hyb25pemVkQ29sbGVjdGlvbiApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEU6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3V0aWwvQ29sbGVjdGlvbjxURTs+O0xqYXZhL2lvL1NlcmlhbGl6YWJsZTsgKQotIGNsYXNzIGphdmEudXRpbC5Db2xsZWN0aW9ucyRTeW5jaHJvbml6ZWRDb2xsZWN0aW9uIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudXRpbC5Db2xsZWN0aW9uLCBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0NvbGxlY3Rpb248VEU7PjsgKQotZmluYWwgamF2YS51dGlsLkNvbGxlY3Rpb24gYwotCi1maW5hbCBqYXZhLmxhbmcuT2JqZWN0IG11dGV4Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9Db2xsZWN0aW9uPFRFOz47KVYgKQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkNvbGxlY3Rpb24pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvQ29sbGVjdGlvbjxURTs+O0xqYXZhL2xhbmcvT2JqZWN0OylWICkKLSB2b2lkIDxpbml0PigKLWphdmEudXRpbC5Db2xsZWN0aW9uCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoCi1qYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEU7KVogKQotcHVibGljIGJvb2xlYW4gYWRkKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9Db2xsZWN0aW9uPCtURTs+OylaICkKLXB1YmxpYyBib29sZWFuIGFkZEFsbCgKLWphdmEudXRpbC5Db2xsZWN0aW9uKQotCi1wdWJsaWMgdm9pZCBjbGVhcigpCi0KLXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9Db2xsZWN0aW9uPCo+OylaICkKLXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKAotamF2YS51dGlsLkNvbGxlY3Rpb24pCi0KLXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9JdGVyYXRvcjxURTs+OyApCi1wdWJsaWMgamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXJhdG9yKCkKLQotcHVibGljIGJvb2xlYW4gcmVtb3ZlKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9Db2xsZWN0aW9uPCo+OylaICkKLXB1YmxpYyBib29sZWFuIHJlbW92ZUFsbCgKLWphdmEudXRpbC5Db2xsZWN0aW9uKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0NvbGxlY3Rpb248Kj47KVogKQotcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKAotamF2YS51dGlsLkNvbGxlY3Rpb24pCi0KLXB1YmxpYyBpbnQgc2l6ZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0W10gdG9BcnJheSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFQ6TGphdmEvbGFuZy9PYmplY3Q7PihbVFQ7KVtUVDsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3RbXSB0b0FycmF5KAotamF2YS5sYW5nLk9iamVjdFtdKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPVN5bmNocm9uaXplZExpc3QgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9Db2xsZWN0aW9uczsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxFOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS91dGlsL0NvbGxlY3Rpb25zJFN5bmNocm9uaXplZENvbGxlY3Rpb248VEU7PjtMamF2YS91dGlsL0xpc3Q8VEU7PjsgKQotIGNsYXNzIGphdmEudXRpbC5Db2xsZWN0aW9ucyRTeW5jaHJvbml6ZWRMaXN0IGV4dGVuZHMgamF2YS51dGlsLkNvbGxlY3Rpb25zJFN5bmNocm9uaXplZENvbGxlY3Rpb24gaW1wbGVtZW50cyBqYXZhLnV0aWwuTGlzdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0xpc3Q8VEU7PjsgKQotZmluYWwgamF2YS51dGlsLkxpc3QgbGlzdAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTGlzdDxURTs+OylWICkKLSB2b2lkIDxpbml0PigKLWphdmEudXRpbC5MaXN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0xpc3Q8VEU7PjtMamF2YS9sYW5nL09iamVjdDspViApCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuTGlzdAotamF2YS5sYW5nLk9iamVjdCkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuT2JqZWN0IHJlYWRSZXNvbHZlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KAotamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KElURTspViApCi1wdWJsaWMgdm9pZCBhZGQoCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KElMamF2YS91dGlsL0NvbGxlY3Rpb248K1RFOz47KVogKQotcHVibGljIGJvb2xlYW4gYWRkQWxsKAotaW50Ci1qYXZhLnV0aWwuQ29sbGVjdGlvbikKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSSlURTsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0KAotaW50KQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLQotcHVibGljIGludCBpbmRleE9mKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGludCBsYXN0SW5kZXhPZigKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0xpc3RJdGVyYXRvcjxURTs+OyApCi1wdWJsaWMgamF2YS51dGlsLkxpc3RJdGVyYXRvciBsaXN0SXRlcmF0b3IoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJKUxqYXZhL3V0aWwvTGlzdEl0ZXJhdG9yPFRFOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yIGxpc3RJdGVyYXRvcigKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSSlURTsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgcmVtb3ZlKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJVEU7KVRFOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBzZXQoCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KElJKUxqYXZhL3V0aWwvTGlzdDxURTs+OyApCi1wdWJsaWMgamF2YS51dGlsLkxpc3Qgc3ViTGlzdCgKLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvQ29sbGVjdGlvbnM7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08SzpMamF2YS9sYW5nL09iamVjdDtWOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS9sYW5nL09iamVjdDtMamF2YS91dGlsL01hcDxUSztUVjs+O0xqYXZhL2lvL1NlcmlhbGl6YWJsZTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPVN5bmNocm9uaXplZE1hcCApCi0gY2xhc3MgamF2YS51dGlsLkNvbGxlY3Rpb25zJFN5bmNocm9uaXplZE1hcCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuTWFwLCBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL01hcDxUSztUVjs+OyApCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5NYXAgbQotCi1maW5hbCBqYXZhLmxhbmcuT2JqZWN0IG11dGV4Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9NYXA8VEs7VFY7PjspViApCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuTWFwKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL01hcDxUSztUVjs+O0xqYXZhL2xhbmcvT2JqZWN0OylWICkKLSB2b2lkIDxpbml0PigKLWphdmEudXRpbC5NYXAKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCB3cml0ZU9iamVjdCgKLWphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtKQotCi1wdWJsaWMgdm9pZCBjbGVhcigpCi0KLXB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGJvb2xlYW4gY29udGFpbnNWYWx1ZSgKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL1NldDxMamF2YS91dGlsL01hcCRFbnRyeTxUSztUVjs+Oz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuU2V0IGVudHJ5U2V0KCkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9PYmplY3Q7KVRWOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXQoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLQotcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL1NldDxUSzs+OyApCi1wdWJsaWMgamF2YS51dGlsLlNldCBrZXlTZXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUSztUVjspVFY7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHB1dCgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTWFwPCtUSzsrVFY7PjspViApCi1wdWJsaWMgdm9pZCBwdXRBbGwoCi1qYXZhLnV0aWwuTWFwKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL09iamVjdDspVFY7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHJlbW92ZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBpbnQgc2l6ZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvQ29sbGVjdGlvbjxUVjs+OyApCi1wdWJsaWMgamF2YS51dGlsLkNvbGxlY3Rpb24gdmFsdWVzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEU6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL3V0aWwvQ29sbGVjdGlvbnMkU3luY2hyb25pemVkTGlzdDxURTs+O0xqYXZhL3V0aWwvUmFuZG9tQWNjZXNzOyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL0NvbGxlY3Rpb25zOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9U3luY2hyb25pemVkUmFuZG9tQWNjZXNzTGlzdCApCi0gY2xhc3MgamF2YS51dGlsLkNvbGxlY3Rpb25zJFN5bmNocm9uaXplZFJhbmRvbUFjY2Vzc0xpc3QgZXh0ZW5kcyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMkU3luY2hyb25pemVkTGlzdCBpbXBsZW1lbnRzIGphdmEudXRpbC5SYW5kb21BY2Nlc3MKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9MaXN0PFRFOz47KVYgKQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkxpc3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTGlzdDxURTs+O0xqYXZhL2xhbmcvT2JqZWN0OylWICkKLSB2b2lkIDxpbml0PigKLWphdmEudXRpbC5MaXN0Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wcml2YXRlIGphdmEubGFuZy5PYmplY3Qgd3JpdGVSZXBsYWNlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSUkpTGphdmEvdXRpbC9MaXN0PFRFOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBzdWJMaXN0KAotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9Db2xsZWN0aW9uczsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxFOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS91dGlsL0NvbGxlY3Rpb25zJFN5bmNocm9uaXplZENvbGxlY3Rpb248VEU7PjtMamF2YS91dGlsL1NldDxURTs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9U3luY2hyb25pemVkU2V0ICkKLSBjbGFzcyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMkU3luY2hyb25pemVkU2V0IGV4dGVuZHMgamF2YS51dGlsLkNvbGxlY3Rpb25zJFN5bmNocm9uaXplZENvbGxlY3Rpb24gaW1wbGVtZW50cyBqYXZhLnV0aWwuU2V0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvU2V0PFRFOz47KVYgKQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLlNldCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9TZXQ8VEU7PjtMamF2YS9sYW5nL09iamVjdDspViApCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuU2V0Ci1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoCi1qYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPVN5bmNocm9uaXplZFNvcnRlZE1hcCApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEs6TGphdmEvbGFuZy9PYmplY3Q7VjpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvdXRpbC9Db2xsZWN0aW9ucyRTeW5jaHJvbml6ZWRNYXA8VEs7VFY7PjtMamF2YS91dGlsL1NvcnRlZE1hcDxUSztUVjs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL0NvbGxlY3Rpb25zOyApCi0gY2xhc3MgamF2YS51dGlsLkNvbGxlY3Rpb25zJFN5bmNocm9uaXplZFNvcnRlZE1hcCBleHRlbmRzIGphdmEudXRpbC5Db2xsZWN0aW9ucyRTeW5jaHJvbml6ZWRNYXAgaW1wbGVtZW50cyBqYXZhLnV0aWwuU29ydGVkTWFwCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvU29ydGVkTWFwPFRLO1RWOz47ICkKLXByaXZhdGUgZmluYWwgamF2YS51dGlsLlNvcnRlZE1hcCBzbQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvU29ydGVkTWFwPFRLO1RWOz47KVYgKQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLlNvcnRlZE1hcCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9Tb3J0ZWRNYXA8VEs7VFY7PjtMamF2YS9sYW5nL09iamVjdDspViApCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuU29ydGVkTWFwCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoCi1qYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvQ29tcGFyYXRvcjwtVEs7PjsgKQotcHVibGljIGphdmEudXRpbC5Db21wYXJhdG9yIGNvbXBhcmF0b3IoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVEs7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGZpcnN0S2V5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEs7KUxqYXZhL3V0aWwvU29ydGVkTWFwPFRLO1RWOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuU29ydGVkTWFwIGhlYWRNYXAoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVEs7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGxhc3RLZXkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUSztUSzspTGphdmEvdXRpbC9Tb3J0ZWRNYXA8VEs7VFY7PjsgKQotcHVibGljIGphdmEudXRpbC5Tb3J0ZWRNYXAgc3ViTWFwKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEs7KUxqYXZhL3V0aWwvU29ydGVkTWFwPFRLO1RWOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuU29ydGVkTWFwIHRhaWxNYXAoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08RTpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvdXRpbC9Db2xsZWN0aW9ucyRTeW5jaHJvbml6ZWRTZXQ8VEU7PjtMamF2YS91dGlsL1NvcnRlZFNldDxURTs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9U3luY2hyb25pemVkU29ydGVkU2V0ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvQ29sbGVjdGlvbnM7ICkKLSBjbGFzcyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMkU3luY2hyb25pemVkU29ydGVkU2V0IGV4dGVuZHMgamF2YS51dGlsLkNvbGxlY3Rpb25zJFN5bmNocm9uaXplZFNldCBpbXBsZW1lbnRzIGphdmEudXRpbC5Tb3J0ZWRTZXQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9Tb3J0ZWRTZXQ8VEU7PjsgKQotcHJpdmF0ZSBmaW5hbCBqYXZhLnV0aWwuU29ydGVkU2V0IHNzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9Tb3J0ZWRTZXQ8VEU7PjspViApCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuU29ydGVkU2V0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL1NvcnRlZFNldDxURTs+O0xqYXZhL2xhbmcvT2JqZWN0OylWICkKLSB2b2lkIDxpbml0PigKLWphdmEudXRpbC5Tb3J0ZWRTZXQKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCB3cml0ZU9iamVjdCgKLWphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9Db21wYXJhdG9yPC1URTs+OyApCi1wdWJsaWMgamF2YS51dGlsLkNvbXBhcmF0b3IgY29tcGFyYXRvcigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClURTsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZmlyc3QoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShURTspTGphdmEvdXRpbC9Tb3J0ZWRTZXQ8VEU7PjsgKQotcHVibGljIGphdmEudXRpbC5Tb3J0ZWRTZXQgaGVhZFNldCgKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClURTsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgbGFzdCgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRFO1RFOylMamF2YS91dGlsL1NvcnRlZFNldDxURTs+OyApCi1wdWJsaWMgamF2YS51dGlsLlNvcnRlZFNldCBzdWJTZXQoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShURTspTGphdmEvdXRpbC9Tb3J0ZWRTZXQ8VEU7PjsgKQotcHVibGljIGphdmEudXRpbC5Tb3J0ZWRTZXQgdGFpbFNldCgKLWphdmEubGFuZy5PYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3V0aWwvSXRlcmF0b3I8VEU7PjsgKQotIGNsYXNzIGphdmEudXRpbC5Db2xsZWN0aW9ucyRVbm1vZGlmaWFibGVDb2xsZWN0aW9uJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLkl0ZXJhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9JdGVyYXRvcjxURTs+OyApCi0gamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXJhdG9yCi0KLWZpbmFsIGphdmEudXRpbC5Db2xsZWN0aW9ucyRVbm1vZGlmaWFibGVDb2xsZWN0aW9uIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEudXRpbC5Db2xsZWN0aW9ucyRVbm1vZGlmaWFibGVDb2xsZWN0aW9uKQotCi1wdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVRFOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBuZXh0KCkKLQotcHVibGljIHZvaWQgcmVtb3ZlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL0NvbGxlY3Rpb25zOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPVVubW9kaWZpYWJsZUNvbGxlY3Rpb24gKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxFOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS9sYW5nL09iamVjdDtMamF2YS91dGlsL0NvbGxlY3Rpb248VEU7PjtMamF2YS9pby9TZXJpYWxpemFibGU7ICkKLSBjbGFzcyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMkVW5tb2RpZmlhYmxlQ29sbGVjdGlvbiBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuQ29sbGVjdGlvbiwgamF2YS5pby5TZXJpYWxpemFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9Db2xsZWN0aW9uPFRFOz47ICkKLWZpbmFsIGphdmEudXRpbC5Db2xsZWN0aW9uIGMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0NvbGxlY3Rpb248VEU7PjspViApCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuQ29sbGVjdGlvbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEU7KVogKQotcHVibGljIGJvb2xlYW4gYWRkKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9Db2xsZWN0aW9uPCtURTs+OylaICkKLXB1YmxpYyBib29sZWFuIGFkZEFsbCgKLWphdmEudXRpbC5Db2xsZWN0aW9uKQotCi1wdWJsaWMgdm9pZCBjbGVhcigpCi0KLXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9Db2xsZWN0aW9uPCo+OylaICkKLXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKAotamF2YS51dGlsLkNvbGxlY3Rpb24pCi0KLXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9JdGVyYXRvcjxURTs+OyApCi1wdWJsaWMgamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXJhdG9yKCkKLQotcHVibGljIGJvb2xlYW4gcmVtb3ZlKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9Db2xsZWN0aW9uPCo+OylaICkKLXB1YmxpYyBib29sZWFuIHJlbW92ZUFsbCgKLWphdmEudXRpbC5Db2xsZWN0aW9uKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0NvbGxlY3Rpb248Kj47KVogKQotcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKAotamF2YS51dGlsLkNvbGxlY3Rpb24pCi0KLXB1YmxpYyBpbnQgc2l6ZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0W10gdG9BcnJheSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFQ6TGphdmEvbGFuZy9PYmplY3Q7PihbVFQ7KVtUVDsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3RbXSB0b0FycmF5KAotamF2YS5sYW5nLk9iamVjdFtdKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3V0aWwvTGlzdEl0ZXJhdG9yPFRFOz47ICkKLSBjbGFzcyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMkVW5tb2RpZmlhYmxlTGlzdCQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudXRpbC5MaXN0SXRlcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0xpc3RJdGVyYXRvcjxURTs+OyApCi0gamF2YS51dGlsLkxpc3RJdGVyYXRvciBpdGVyYXRvcgotCi1maW5hbCBqYXZhLnV0aWwuQ29sbGVjdGlvbnMkVW5tb2RpZmlhYmxlTGlzdCB0aGlzJDAKLQotZmluYWwgaW50IHZhbCRsb2NhdGlvbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEudXRpbC5Db2xsZWN0aW9ucyRVbm1vZGlmaWFibGVMaXN0Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRFOylWICkKLXB1YmxpYyB2b2lkIGFkZCgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBib29sZWFuIGhhc05leHQoKQotCi1wdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClURTsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgbmV4dCgpCi0KLXB1YmxpYyBpbnQgbmV4dEluZGV4KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVRFOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBwcmV2aW91cygpCi0KLXB1YmxpYyBpbnQgcHJldmlvdXNJbmRleCgpCi0KLXB1YmxpYyB2b2lkIHJlbW92ZSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRFOylWICkKLXB1YmxpYyB2b2lkIHNldCgKLWphdmEubGFuZy5PYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxFOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS91dGlsL0NvbGxlY3Rpb25zJFVubW9kaWZpYWJsZUNvbGxlY3Rpb248VEU7PjtMamF2YS91dGlsL0xpc3Q8VEU7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1Vbm1vZGlmaWFibGVMaXN0ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvQ29sbGVjdGlvbnM7ICkKLSBjbGFzcyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMkVW5tb2RpZmlhYmxlTGlzdCBleHRlbmRzIGphdmEudXRpbC5Db2xsZWN0aW9ucyRVbm1vZGlmaWFibGVDb2xsZWN0aW9uIGltcGxlbWVudHMgamF2YS51dGlsLkxpc3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9MaXN0PFRFOz47ICkKLWZpbmFsIGphdmEudXRpbC5MaXN0IGxpc3QKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0xpc3Q8VEU7PjspViApCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuTGlzdCkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuT2JqZWN0IHJlYWRSZXNvbHZlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSVRFOylWICkKLXB1YmxpYyB2b2lkIGFkZCgKLWludAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSUxqYXZhL3V0aWwvQ29sbGVjdGlvbjwrVEU7PjspWiApCi1wdWJsaWMgYm9vbGVhbiBhZGRBbGwoCi1pbnQKLWphdmEudXRpbC5Db2xsZWN0aW9uKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJKVRFOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXQoCi1pbnQpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1wdWJsaWMgaW50IGluZGV4T2YoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50IGxhc3RJbmRleE9mKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvTGlzdEl0ZXJhdG9yPFRFOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yIGxpc3RJdGVyYXRvcigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KEkpTGphdmEvdXRpbC9MaXN0SXRlcmF0b3I8VEU7PjsgKQotcHVibGljIGphdmEudXRpbC5MaXN0SXRlcmF0b3IgbGlzdEl0ZXJhdG9yKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJKVRFOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCByZW1vdmUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KElURTspVEU7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHNldCgKLWludAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSUkpTGphdmEvdXRpbC9MaXN0PFRFOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBzdWJMaXN0KAotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3V0aWwvSXRlcmF0b3I8TGphdmEvdXRpbC9NYXAkRW50cnk8VEs7VFY7Pjs+OyApCi0gY2xhc3MgamF2YS51dGlsLkNvbGxlY3Rpb25zJFVubW9kaWZpYWJsZU1hcCRVbm1vZGlmaWFibGVFbnRyeVNldCQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudXRpbC5JdGVyYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSXRlcmF0b3I8TGphdmEvdXRpbC9NYXAkRW50cnk8VEs7VFY7Pjs+OyApCi0gamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXJhdG9yCi0KLWZpbmFsIGphdmEudXRpbC5Db2xsZWN0aW9ucyRVbm1vZGlmaWFibGVNYXAkVW5tb2RpZmlhYmxlRW50cnlTZXQgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkNvbGxlY3Rpb25zJFVubW9kaWZpYWJsZU1hcCRVbm1vZGlmaWFibGVFbnRyeVNldCkKLQotcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IG5leHQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9NYXAkRW50cnk8VEs7VFY7PjsgKQotcHVibGljIGphdmEudXRpbC5NYXAkRW50cnkgbmV4dCgpCi0KLXB1YmxpYyB2b2lkIHJlbW92ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1Vbm1vZGlmaWFibGVNYXBFbnRyeSApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEs6TGphdmEvbGFuZy9PYmplY3Q7VjpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvdXRpbC9NYXAkRW50cnk8VEs7VFY7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9Db2xsZWN0aW9ucyRVbm1vZGlmaWFibGVNYXAkVW5tb2RpZmlhYmxlRW50cnlTZXQ7ICkKLSBjbGFzcyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMkVW5tb2RpZmlhYmxlTWFwJFVubW9kaWZpYWJsZUVudHJ5U2V0JFVubW9kaWZpYWJsZU1hcEVudHJ5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudXRpbC5NYXAkRW50cnkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL01hcCRFbnRyeTxUSztUVjs+OyApCi0gamF2YS51dGlsLk1hcCRFbnRyeSBtYXBFbnRyeQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTWFwJEVudHJ5PFRLO1RWOz47KVYgKQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLk1hcCRFbnRyeSkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVRLOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRLZXkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVFY7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldFZhbHVlKCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRWOylUVjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3Qgc2V0VmFsdWUoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxFOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS91dGlsL0NvbGxlY3Rpb25zJFVubW9kaWZpYWJsZUNvbGxlY3Rpb248VEU7PjtMamF2YS91dGlsL1NldDxURTs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL0NvbGxlY3Rpb25zOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPVVubW9kaWZpYWJsZVNldCApCi0gY2xhc3MgamF2YS51dGlsLkNvbGxlY3Rpb25zJFVubW9kaWZpYWJsZVNldCBleHRlbmRzIGphdmEudXRpbC5Db2xsZWN0aW9ucyRVbm1vZGlmaWFibGVDb2xsZWN0aW9uIGltcGxlbWVudHMgamF2YS51dGlsLlNldAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL1NldDxURTs+OylWICkKLSB2b2lkIDxpbml0PigKLWphdmEudXRpbC5TZXQpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvQ29sbGVjdGlvbnMkVW5tb2RpZmlhYmxlTWFwOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPVVubW9kaWZpYWJsZUVudHJ5U2V0ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08SzpMamF2YS9sYW5nL09iamVjdDtWOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS91dGlsL0NvbGxlY3Rpb25zJFVubW9kaWZpYWJsZVNldDxMamF2YS91dGlsL01hcCRFbnRyeTxUSztUVjs+Oz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGphdmEvdXRpbC9Db2xsZWN0aW9ucyRVbm1vZGlmaWFibGVNYXAkVW5tb2RpZmlhYmxlRW50cnlTZXQkVW5tb2RpZmlhYmxlTWFwRW50cnk7ICkKLSBjbGFzcyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMkVW5tb2RpZmlhYmxlTWFwJFVubW9kaWZpYWJsZUVudHJ5U2V0IGV4dGVuZHMgamF2YS51dGlsLkNvbGxlY3Rpb25zJFVubW9kaWZpYWJsZVNldAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL1NldDxMamF2YS91dGlsL01hcCRFbnRyeTxUSztUVjs+Oz47KVYgKQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLlNldCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvSXRlcmF0b3I8TGphdmEvdXRpbC9NYXAkRW50cnk8VEs7VFY7Pjs+OyApCi1wdWJsaWMgamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXJhdG9yKCkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3RbXSB0b0FycmF5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+KFtUVDspW1RUOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdFtdIHRvQXJyYXkoCi1qYXZhLmxhbmcuT2JqZWN0W10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1Vbm1vZGlmaWFibGVNYXAgKQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MamF2YS91dGlsL0NvbGxlY3Rpb25zJFVubW9kaWZpYWJsZU1hcCRVbm1vZGlmaWFibGVFbnRyeVNldDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxLOkxqYXZhL2xhbmcvT2JqZWN0O1Y6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3V0aWwvTWFwPFRLO1RWOz47TGphdmEvaW8vU2VyaWFsaXphYmxlOyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL0NvbGxlY3Rpb25zOyApCi0gY2xhc3MgamF2YS51dGlsLkNvbGxlY3Rpb25zJFVubW9kaWZpYWJsZU1hcCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuTWFwLCBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL01hcDxUSztUVjs+OyApCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5NYXAgbQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTWFwPFRLO1RWOz47KVYgKQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLk1hcCkKLQotcHVibGljIHZvaWQgY2xlYXIoKQotCi1wdWJsaWMgYm9vbGVhbiBjb250YWluc0tleSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBib29sZWFuIGNvbnRhaW5zVmFsdWUoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9TZXQ8TGphdmEvdXRpbC9NYXAkRW50cnk8VEs7VFY7Pjs+OyApCi1wdWJsaWMgamF2YS51dGlsLlNldCBlbnRyeVNldCgpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvT2JqZWN0OylUVjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0KAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9TZXQ8VEs7PjsgKQotcHVibGljIGphdmEudXRpbC5TZXQga2V5U2V0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEs7VFY7KVRWOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBwdXQoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL01hcDwrVEs7K1RWOz47KVYgKQotcHVibGljIHZvaWQgcHV0QWxsKAotamF2YS51dGlsLk1hcCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9PYmplY3Q7KVRWOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCByZW1vdmUoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50IHNpemUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0NvbGxlY3Rpb248VFY7PjsgKQotcHVibGljIGphdmEudXRpbC5Db2xsZWN0aW9uIHZhbHVlcygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxFOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS91dGlsL0NvbGxlY3Rpb25zJFVubW9kaWZpYWJsZUxpc3Q8VEU7PjtMamF2YS91dGlsL1JhbmRvbUFjY2VzczsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1Vbm1vZGlmaWFibGVSYW5kb21BY2Nlc3NMaXN0ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvQ29sbGVjdGlvbnM7ICkKLSBjbGFzcyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMkVW5tb2RpZmlhYmxlUmFuZG9tQWNjZXNzTGlzdCBleHRlbmRzIGphdmEudXRpbC5Db2xsZWN0aW9ucyRVbm1vZGlmaWFibGVMaXN0IGltcGxlbWVudHMgamF2YS51dGlsLlJhbmRvbUFjY2VzcwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0xpc3Q8VEU7PjspViApCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuTGlzdCkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuT2JqZWN0IHdyaXRlUmVwbGFjZSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KElJKUxqYXZhL3V0aWwvTGlzdDxURTs+OyApCi1wdWJsaWMgamF2YS51dGlsLkxpc3Qgc3ViTGlzdCgKLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvQ29sbGVjdGlvbnM7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08SzpMamF2YS9sYW5nL09iamVjdDtWOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS91dGlsL0NvbGxlY3Rpb25zJFVubW9kaWZpYWJsZU1hcDxUSztUVjs+O0xqYXZhL3V0aWwvU29ydGVkTWFwPFRLO1RWOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9VW5tb2RpZmlhYmxlU29ydGVkTWFwICkKLSBjbGFzcyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMkVW5tb2RpZmlhYmxlU29ydGVkTWFwIGV4dGVuZHMgamF2YS51dGlsLkNvbGxlY3Rpb25zJFVubW9kaWZpYWJsZU1hcCBpbXBsZW1lbnRzIGphdmEudXRpbC5Tb3J0ZWRNYXAKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9Tb3J0ZWRNYXA8VEs7VFY7PjsgKQotcHJpdmF0ZSBmaW5hbCBqYXZhLnV0aWwuU29ydGVkTWFwIHNtCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9Tb3J0ZWRNYXA8VEs7VFY7PjspViApCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuU29ydGVkTWFwKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9Db21wYXJhdG9yPC1USzs+OyApCi1wdWJsaWMgamF2YS51dGlsLkNvbXBhcmF0b3IgY29tcGFyYXRvcigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClUSzsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZmlyc3RLZXkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUSzspTGphdmEvdXRpbC9Tb3J0ZWRNYXA8VEs7VFY7PjsgKQotcHVibGljIGphdmEudXRpbC5Tb3J0ZWRNYXAgaGVhZE1hcCgKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClUSzsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgbGFzdEtleSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRLO1RLOylMamF2YS91dGlsL1NvcnRlZE1hcDxUSztUVjs+OyApCi1wdWJsaWMgamF2YS51dGlsLlNvcnRlZE1hcCBzdWJNYXAoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUSzspTGphdmEvdXRpbC9Tb3J0ZWRNYXA8VEs7VFY7PjsgKQotcHVibGljIGphdmEudXRpbC5Tb3J0ZWRNYXAgdGFpbE1hcCgKLWphdmEubGFuZy5PYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxFOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS91dGlsL0NvbGxlY3Rpb25zJFVubW9kaWZpYWJsZVNldDxURTs+O0xqYXZhL3V0aWwvU29ydGVkU2V0PFRFOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9VW5tb2RpZmlhYmxlU29ydGVkU2V0ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvQ29sbGVjdGlvbnM7ICkKLSBjbGFzcyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMkVW5tb2RpZmlhYmxlU29ydGVkU2V0IGV4dGVuZHMgamF2YS51dGlsLkNvbGxlY3Rpb25zJFVubW9kaWZpYWJsZVNldCBpbXBsZW1lbnRzIGphdmEudXRpbC5Tb3J0ZWRTZXQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9Tb3J0ZWRTZXQ8VEU7PjsgKQotcHJpdmF0ZSBmaW5hbCBqYXZhLnV0aWwuU29ydGVkU2V0IHNzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9Tb3J0ZWRTZXQ8VEU7PjspViApCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuU29ydGVkU2V0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9Db21wYXJhdG9yPC1URTs+OyApCi1wdWJsaWMgamF2YS51dGlsLkNvbXBhcmF0b3IgY29tcGFyYXRvcigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClURTsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZmlyc3QoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShURTspTGphdmEvdXRpbC9Tb3J0ZWRTZXQ8VEU7PjsgKQotcHVibGljIGphdmEudXRpbC5Tb3J0ZWRTZXQgaGVhZFNldCgKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClURTsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgbGFzdCgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRFO1RFOylMamF2YS91dGlsL1NvcnRlZFNldDxURTs+OyApCi1wdWJsaWMgamF2YS51dGlsLlNvcnRlZFNldCBzdWJTZXQoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShURTspTGphdmEvdXRpbC9Tb3J0ZWRTZXQ8VEU7PjsgKQotcHVibGljIGphdmEudXRpbC5Tb3J0ZWRTZXQgdGFpbFNldCgKLWphdmEubGFuZy5PYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MamF2YS91dGlsL0NvbGxlY3Rpb25zJENoZWNrZWRTb3J0ZWRNYXA7TGphdmEvdXRpbC9Db2xsZWN0aW9ucyRDaGVja2VkU29ydGVkU2V0O0xqYXZhL3V0aWwvQ29sbGVjdGlvbnMkQ2hlY2tlZE1hcDtMamF2YS91dGlsL0NvbGxlY3Rpb25zJENoZWNrZWRTZXQ7TGphdmEvdXRpbC9Db2xsZWN0aW9ucyRDaGVja2VkUmFuZG9tQWNjZXNzTGlzdDtMamF2YS91dGlsL0NvbGxlY3Rpb25zJENoZWNrZWRMaXN0O0xqYXZhL3V0aWwvQ29sbGVjdGlvbnMkQ2hlY2tlZExpc3RJdGVyYXRvcjtMamF2YS91dGlsL0NvbGxlY3Rpb25zJENoZWNrZWRDb2xsZWN0aW9uO0xqYXZhL3V0aWwvQ29sbGVjdGlvbnMkVW5tb2RpZmlhYmxlU29ydGVkU2V0O0xqYXZhL3V0aWwvQ29sbGVjdGlvbnMkVW5tb2RpZmlhYmxlU29ydGVkTWFwO0xqYXZhL3V0aWwvQ29sbGVjdGlvbnMkVW5tb2RpZmlhYmxlU2V0O0xqYXZhL3V0aWwvQ29sbGVjdGlvbnMkVW5tb2RpZmlhYmxlTWFwO0xqYXZhL3V0aWwvQ29sbGVjdGlvbnMkVW5tb2RpZmlhYmxlTGlzdDtMamF2YS91dGlsL0NvbGxlY3Rpb25zJFVubW9kaWZpYWJsZVJhbmRvbUFjY2Vzc0xpc3Q7TGphdmEvdXRpbC9Db2xsZWN0aW9ucyRVbm1vZGlmaWFibGVDb2xsZWN0aW9uO0xqYXZhL3V0aWwvQ29sbGVjdGlvbnMkU3luY2hyb25pemVkU29ydGVkU2V0O0xqYXZhL3V0aWwvQ29sbGVjdGlvbnMkU3luY2hyb25pemVkU29ydGVkTWFwO0xqYXZhL3V0aWwvQ29sbGVjdGlvbnMkU3luY2hyb25pemVkU2V0O0xqYXZhL3V0aWwvQ29sbGVjdGlvbnMkU3luY2hyb25pemVkTWFwO0xqYXZhL3V0aWwvQ29sbGVjdGlvbnMkU3luY2hyb25pemVkTGlzdDtMamF2YS91dGlsL0NvbGxlY3Rpb25zJFN5bmNocm9uaXplZFJhbmRvbUFjY2Vzc0xpc3Q7TGphdmEvdXRpbC9Db2xsZWN0aW9ucyRTeW5jaHJvbml6ZWRDb2xsZWN0aW9uO0xqYXZhL3V0aWwvQ29sbGVjdGlvbnMkU2luZ2xldG9uTWFwO0xqYXZhL3V0aWwvQ29sbGVjdGlvbnMkU2luZ2xldG9uTGlzdDtMamF2YS91dGlsL0NvbGxlY3Rpb25zJFNpbmdsZXRvblNldDtMamF2YS91dGlsL0NvbGxlY3Rpb25zJFJldmVyc2VDb21wYXJhdG9yV2l0aENvbXBhcmF0b3I7TGphdmEvdXRpbC9Db2xsZWN0aW9ucyRSZXZlcnNlQ29tcGFyYXRvcjtMamF2YS91dGlsL0NvbGxlY3Rpb25zJEVtcHR5TWFwO0xqYXZhL3V0aWwvQ29sbGVjdGlvbnMkRW1wdHlTZXQ7TGphdmEvdXRpbC9Db2xsZWN0aW9ucyRFbXB0eUxpc3Q7TGphdmEvdXRpbC9Db2xsZWN0aW9ucyRDb3BpZXNMaXN0OyApCi1wdWJsaWMgY2xhc3MgamF2YS51dGlsLkNvbGxlY3Rpb25zIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudXRpbC5MaXN0IEVNUFRZX0xJU1QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuTWFwIEVNUFRZX01BUAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudXRpbC5TZXQgRU1QVFlfU0VUCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+KExqYXZhL3V0aWwvQ29sbGVjdGlvbjwtVFQ7PjtbVFQ7KVogKQotcHVibGljIHN0YXRpYyB0cmFuc2llbnQgYm9vbGVhbiBhZGRBbGwoCi1qYXZhLnV0aWwuQ29sbGVjdGlvbgotamF2YS5sYW5nLk9iamVjdFtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz4oTGphdmEvdXRpbC9MaXN0PCtMamF2YS9sYW5nL0NvbXBhcmFibGU8LVRUOz47PjtUVDspSSApCi1wdWJsaWMgc3RhdGljIGludCBiaW5hcnlTZWFyY2goCi1qYXZhLnV0aWwuTGlzdAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+KExqYXZhL3V0aWwvTGlzdDwrVFQ7PjtUVDtMamF2YS91dGlsL0NvbXBhcmF0b3I8LVRUOz47KUkgKQotcHVibGljIHN0YXRpYyBpbnQgYmluYXJ5U2VhcmNoKAotamF2YS51dGlsLkxpc3QKLWphdmEubGFuZy5PYmplY3QKLWphdmEudXRpbC5Db21wYXJhdG9yKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxFOkxqYXZhL2xhbmcvT2JqZWN0Oz4oVEU7TGphdmEvbGFuZy9DbGFzczxURTs+OylURTsgKQotc3RhdGljIGphdmEubGFuZy5PYmplY3QgY2hlY2tUeXBlKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLkNsYXNzKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxFOkxqYXZhL2xhbmcvT2JqZWN0Oz4oTGphdmEvdXRpbC9Db2xsZWN0aW9uPFRFOz47TGphdmEvbGFuZy9DbGFzczxURTs+OylMamF2YS91dGlsL0NvbGxlY3Rpb248VEU7PjsgKQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuQ29sbGVjdGlvbiBjaGVja2VkQ29sbGVjdGlvbigKLWphdmEudXRpbC5Db2xsZWN0aW9uCi1qYXZhLmxhbmcuQ2xhc3MpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEU6TGphdmEvbGFuZy9PYmplY3Q7PihMamF2YS91dGlsL0xpc3Q8VEU7PjtMamF2YS9sYW5nL0NsYXNzPFRFOz47KUxqYXZhL3V0aWwvTGlzdDxURTs+OyApCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5MaXN0IGNoZWNrZWRMaXN0KAotamF2YS51dGlsLkxpc3QKLWphdmEubGFuZy5DbGFzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08SzpMamF2YS9sYW5nL09iamVjdDtWOkxqYXZhL2xhbmcvT2JqZWN0Oz4oTGphdmEvdXRpbC9NYXA8VEs7VFY7PjtMamF2YS9sYW5nL0NsYXNzPFRLOz47TGphdmEvbGFuZy9DbGFzczxUVjs+OylMamF2YS91dGlsL01hcDxUSztUVjs+OyApCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5NYXAgY2hlY2tlZE1hcCgKLWphdmEudXRpbC5NYXAKLWphdmEubGFuZy5DbGFzcwotamF2YS5sYW5nLkNsYXNzKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxFOkxqYXZhL2xhbmcvT2JqZWN0Oz4oTGphdmEvdXRpbC9TZXQ8VEU7PjtMamF2YS9sYW5nL0NsYXNzPFRFOz47KUxqYXZhL3V0aWwvU2V0PFRFOz47ICkKLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlNldCBjaGVja2VkU2V0KAotamF2YS51dGlsLlNldAotamF2YS5sYW5nLkNsYXNzKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxLOkxqYXZhL2xhbmcvT2JqZWN0O1Y6TGphdmEvbGFuZy9PYmplY3Q7PihMamF2YS91dGlsL1NvcnRlZE1hcDxUSztUVjs+O0xqYXZhL2xhbmcvQ2xhc3M8VEs7PjtMamF2YS9sYW5nL0NsYXNzPFRWOz47KUxqYXZhL3V0aWwvU29ydGVkTWFwPFRLO1RWOz47ICkKLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlNvcnRlZE1hcCBjaGVja2VkU29ydGVkTWFwKAotamF2YS51dGlsLlNvcnRlZE1hcAotamF2YS5sYW5nLkNsYXNzCi1qYXZhLmxhbmcuQ2xhc3MpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEU6TGphdmEvbGFuZy9PYmplY3Q7PihMamF2YS91dGlsL1NvcnRlZFNldDxURTs+O0xqYXZhL2xhbmcvQ2xhc3M8VEU7PjspTGphdmEvdXRpbC9Tb3J0ZWRTZXQ8VEU7PjsgKQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuU29ydGVkU2V0IGNoZWNrZWRTb3J0ZWRTZXQoCi1qYXZhLnV0aWwuU29ydGVkU2V0Ci1qYXZhLmxhbmcuQ2xhc3MpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFQ6TGphdmEvbGFuZy9PYmplY3Q7PihMamF2YS91dGlsL0xpc3Q8LVRUOz47TGphdmEvdXRpbC9MaXN0PCtUVDs+OylWICkKLXB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5KAotamF2YS51dGlsLkxpc3QKLWphdmEudXRpbC5MaXN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0NvbGxlY3Rpb248Kj47TGphdmEvdXRpbC9Db2xsZWN0aW9uPCo+OylaICkKLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkaXNqb2ludCgKLWphdmEudXRpbC5Db2xsZWN0aW9uCi1qYXZhLnV0aWwuQ29sbGVjdGlvbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+KClMamF2YS91dGlsL0xpc3Q8VFQ7PjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuTGlzdCBlbXB0eUxpc3QoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxLOkxqYXZhL2xhbmcvT2JqZWN0O1Y6TGphdmEvbGFuZy9PYmplY3Q7PigpTGphdmEvdXRpbC9NYXA8VEs7VFY7PjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuTWFwIGVtcHR5TWFwKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+KClMamF2YS91dGlsL1NldDxUVDs+OyApCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudXRpbC5TZXQgZW1wdHlTZXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz4oTGphdmEvdXRpbC9Db2xsZWN0aW9uPFRUOz47KUxqYXZhL3V0aWwvRW51bWVyYXRpb248VFQ7PjsgKQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuRW51bWVyYXRpb24gZW51bWVyYXRpb24oCi1qYXZhLnV0aWwuQ29sbGVjdGlvbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+KExqYXZhL3V0aWwvTGlzdDwtVFQ7PjtUVDspViApCi1wdWJsaWMgc3RhdGljIHZvaWQgZmlsbCgKLWphdmEudXRpbC5MaXN0Ci1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0NvbGxlY3Rpb248Kj47TGphdmEvbGFuZy9PYmplY3Q7KUkgKQotcHVibGljIHN0YXRpYyBpbnQgZnJlcXVlbmN5KAotamF2YS51dGlsLkNvbGxlY3Rpb24KLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTGlzdDwqPjtMamF2YS91dGlsL0xpc3Q8Kj47KUkgKQotcHVibGljIHN0YXRpYyBpbnQgaW5kZXhPZlN1Ykxpc3QoCi1qYXZhLnV0aWwuTGlzdAotamF2YS51dGlsLkxpc3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTGlzdDwqPjtMamF2YS91dGlsL0xpc3Q8Kj47KUkgKQotcHVibGljIHN0YXRpYyBpbnQgbGFzdEluZGV4T2ZTdWJMaXN0KAotamF2YS51dGlsLkxpc3QKLWphdmEudXRpbC5MaXN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz4oTGphdmEvdXRpbC9FbnVtZXJhdGlvbjxUVDs+OylMamF2YS91dGlsL0FycmF5TGlzdDxUVDs+OyApCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5BcnJheUxpc3QgbGlzdCgKLWphdmEudXRpbC5FbnVtZXJhdGlvbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs6TGphdmEvbGFuZy9Db21wYXJhYmxlPC1UVDs+Oz4oTGphdmEvdXRpbC9Db2xsZWN0aW9uPCtUVDs+OylUVDsgKQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuT2JqZWN0IG1heCgKLWphdmEudXRpbC5Db2xsZWN0aW9uKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz4oTGphdmEvdXRpbC9Db2xsZWN0aW9uPCtUVDs+O0xqYXZhL3V0aWwvQ29tcGFyYXRvcjwtVFQ7PjspVFQ7ICkKLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLk9iamVjdCBtYXgoCi1qYXZhLnV0aWwuQ29sbGVjdGlvbgotamF2YS51dGlsLkNvbXBhcmF0b3IpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFQ6TGphdmEvbGFuZy9PYmplY3Q7OkxqYXZhL2xhbmcvQ29tcGFyYWJsZTwtVFQ7Pjs+KExqYXZhL3V0aWwvQ29sbGVjdGlvbjwrVFQ7PjspVFQ7ICkKLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLk9iamVjdCBtaW4oCi1qYXZhLnV0aWwuQ29sbGVjdGlvbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+KExqYXZhL3V0aWwvQ29sbGVjdGlvbjwrVFQ7PjtMamF2YS91dGlsL0NvbXBhcmF0b3I8LVRUOz47KVRUOyApCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5PYmplY3QgbWluKAotamF2YS51dGlsLkNvbGxlY3Rpb24KLWphdmEudXRpbC5Db21wYXJhdG9yKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz4oSVRUOylMamF2YS91dGlsL0xpc3Q8VFQ7PjsgKQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuTGlzdCBuQ29waWVzKAotaW50Ci1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz4oTGphdmEvdXRpbC9MaXN0PFRUOz47VFQ7VFQ7KVogKQotcHVibGljIHN0YXRpYyBib29sZWFuIHJlcGxhY2VBbGwoCi1qYXZhLnV0aWwuTGlzdAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9MaXN0PCo+OylWICkKLXB1YmxpYyBzdGF0aWMgdm9pZCByZXZlcnNlKAotamF2YS51dGlsLkxpc3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFQ6TGphdmEvbGFuZy9PYmplY3Q7PigpTGphdmEvdXRpbC9Db21wYXJhdG9yPFRUOz47ICkKLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLkNvbXBhcmF0b3IgcmV2ZXJzZU9yZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+KExqYXZhL3V0aWwvQ29tcGFyYXRvcjxUVDs+OylMamF2YS91dGlsL0NvbXBhcmF0b3I8VFQ7PjsgKQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuQ29tcGFyYXRvciByZXZlcnNlT3JkZXIoCi1qYXZhLnV0aWwuQ29tcGFyYXRvcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9MaXN0PCo+O0kpViApCi1wdWJsaWMgc3RhdGljIHZvaWQgcm90YXRlKAotamF2YS51dGlsLkxpc3QKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9MaXN0PCo+OylWICkKLXB1YmxpYyBzdGF0aWMgdm9pZCBzaHVmZmxlKAotamF2YS51dGlsLkxpc3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTGlzdDwqPjtMamF2YS91dGlsL1JhbmRvbTspViApCi1wdWJsaWMgc3RhdGljIHZvaWQgc2h1ZmZsZSgKLWphdmEudXRpbC5MaXN0Ci1qYXZhLnV0aWwuUmFuZG9tKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxFOkxqYXZhL2xhbmcvT2JqZWN0Oz4oVEU7KUxqYXZhL3V0aWwvU2V0PFRFOz47ICkKLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlNldCBzaW5nbGV0b24oCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxFOkxqYXZhL2xhbmcvT2JqZWN0Oz4oVEU7KUxqYXZhL3V0aWwvTGlzdDxURTs+OyApCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5MaXN0IHNpbmdsZXRvbkxpc3QoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxLOkxqYXZhL2xhbmcvT2JqZWN0O1Y6TGphdmEvbGFuZy9PYmplY3Q7PihUSztUVjspTGphdmEvdXRpbC9NYXA8VEs7VFY7PjsgKQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuTWFwIHNpbmdsZXRvbk1hcCgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFQ6OkxqYXZhL2xhbmcvQ29tcGFyYWJsZTwtVFQ7Pjs+KExqYXZhL3V0aWwvTGlzdDxUVDs+OylWICkKLXB1YmxpYyBzdGF0aWMgdm9pZCBzb3J0KAotamF2YS51dGlsLkxpc3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFQ6TGphdmEvbGFuZy9PYmplY3Q7PihMamF2YS91dGlsL0xpc3Q8VFQ7PjtMamF2YS91dGlsL0NvbXBhcmF0b3I8LVRUOz47KVYgKQotcHVibGljIHN0YXRpYyB2b2lkIHNvcnQoCi1qYXZhLnV0aWwuTGlzdAotamF2YS51dGlsLkNvbXBhcmF0b3IpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTGlzdDwqPjtJSSlWICkKLXB1YmxpYyBzdGF0aWMgdm9pZCBzd2FwKAotamF2YS51dGlsLkxpc3QKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz4oTGphdmEvdXRpbC9Db2xsZWN0aW9uPFRUOz47KUxqYXZhL3V0aWwvQ29sbGVjdGlvbjxUVDs+OyApCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5Db2xsZWN0aW9uIHN5bmNocm9uaXplZENvbGxlY3Rpb24oCi1qYXZhLnV0aWwuQ29sbGVjdGlvbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+KExqYXZhL3V0aWwvTGlzdDxUVDs+OylMamF2YS91dGlsL0xpc3Q8VFQ7PjsgKQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuTGlzdCBzeW5jaHJvbml6ZWRMaXN0KAotamF2YS51dGlsLkxpc3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEs6TGphdmEvbGFuZy9PYmplY3Q7VjpMamF2YS9sYW5nL09iamVjdDs+KExqYXZhL3V0aWwvTWFwPFRLO1RWOz47KUxqYXZhL3V0aWwvTWFwPFRLO1RWOz47ICkKLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLk1hcCBzeW5jaHJvbml6ZWRNYXAoCi1qYXZhLnV0aWwuTWFwKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxFOkxqYXZhL2xhbmcvT2JqZWN0Oz4oTGphdmEvdXRpbC9TZXQ8VEU7PjspTGphdmEvdXRpbC9TZXQ8VEU7PjsgKQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuU2V0IHN5bmNocm9uaXplZFNldCgKLWphdmEudXRpbC5TZXQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEs6TGphdmEvbGFuZy9PYmplY3Q7VjpMamF2YS9sYW5nL09iamVjdDs+KExqYXZhL3V0aWwvU29ydGVkTWFwPFRLO1RWOz47KUxqYXZhL3V0aWwvU29ydGVkTWFwPFRLO1RWOz47ICkKLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlNvcnRlZE1hcCBzeW5jaHJvbml6ZWRTb3J0ZWRNYXAoCi1qYXZhLnV0aWwuU29ydGVkTWFwKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxFOkxqYXZhL2xhbmcvT2JqZWN0Oz4oTGphdmEvdXRpbC9Tb3J0ZWRTZXQ8VEU7PjspTGphdmEvdXRpbC9Tb3J0ZWRTZXQ8VEU7PjsgKQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuU29ydGVkU2V0IHN5bmNocm9uaXplZFNvcnRlZFNldCgKLWphdmEudXRpbC5Tb3J0ZWRTZXQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEU6TGphdmEvbGFuZy9PYmplY3Q7PihMamF2YS91dGlsL0NvbGxlY3Rpb248K1RFOz47KUxqYXZhL3V0aWwvQ29sbGVjdGlvbjxURTs+OyApCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5Db2xsZWN0aW9uIHVubW9kaWZpYWJsZUNvbGxlY3Rpb24oCi1qYXZhLnV0aWwuQ29sbGVjdGlvbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08RTpMamF2YS9sYW5nL09iamVjdDs+KExqYXZhL3V0aWwvTGlzdDwrVEU7PjspTGphdmEvdXRpbC9MaXN0PFRFOz47ICkKLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLkxpc3QgdW5tb2RpZmlhYmxlTGlzdCgKLWphdmEudXRpbC5MaXN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxLOkxqYXZhL2xhbmcvT2JqZWN0O1Y6TGphdmEvbGFuZy9PYmplY3Q7PihMamF2YS91dGlsL01hcDwrVEs7K1RWOz47KUxqYXZhL3V0aWwvTWFwPFRLO1RWOz47ICkKLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLk1hcCB1bm1vZGlmaWFibGVNYXAoCi1qYXZhLnV0aWwuTWFwKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxFOkxqYXZhL2xhbmcvT2JqZWN0Oz4oTGphdmEvdXRpbC9TZXQ8K1RFOz47KUxqYXZhL3V0aWwvU2V0PFRFOz47ICkKLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlNldCB1bm1vZGlmaWFibGVTZXQoCi1qYXZhLnV0aWwuU2V0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxLOkxqYXZhL2xhbmcvT2JqZWN0O1Y6TGphdmEvbGFuZy9PYmplY3Q7PihMamF2YS91dGlsL1NvcnRlZE1hcDxUSzsrVFY7PjspTGphdmEvdXRpbC9Tb3J0ZWRNYXA8VEs7VFY7PjsgKQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuU29ydGVkTWFwIHVubW9kaWZpYWJsZVNvcnRlZE1hcCgKLWphdmEudXRpbC5Tb3J0ZWRNYXApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEU6TGphdmEvbGFuZy9PYmplY3Q7PihMamF2YS91dGlsL1NvcnRlZFNldDxURTs+OylMamF2YS91dGlsL1NvcnRlZFNldDxURTs+OyApCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5Tb3J0ZWRTZXQgdW5tb2RpZmlhYmxlU29ydGVkU2V0KAotamF2YS51dGlsLlNvcnRlZFNldCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLnV0aWwuQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgamF2YS51dGlsLkN1cnJlbmN5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNodGFibGU8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvdXRpbC9DdXJyZW5jeTs+OyApCi1wcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuSGFzaHRhYmxlIGNvZGVzVG9DdXJyZW5jaWVzCi0KLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgY3VycmVuY3lWYXJzCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgY3VycmVuY3lDb2RlCi0KLXByaXZhdGUgdHJhbnNpZW50IGludCBkZWZhdWx0RnJhY3Rpb25EaWdpdHMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5DdXJyZW5jeSBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLkN1cnJlbmN5IGdldEluc3RhbmNlKAotamF2YS51dGlsLkxvY2FsZSkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuT2JqZWN0IHJlYWRSZXNvbHZlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Q3VycmVuY3lDb2RlKCkKLQotcHVibGljIGludCBnZXREZWZhdWx0RnJhY3Rpb25EaWdpdHMoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTeW1ib2woKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTeW1ib2woCi1qYXZhLnV0aWwuTG9jYWxlKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS51dGlsLklsbGVnYWxGb3JtYXRFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLnV0aWwuRHVwbGljYXRlRm9ybWF0RmxhZ3NFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLnV0aWwuSWxsZWdhbEZvcm1hdEV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGZsYWdzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RmxhZ3MoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRNZXNzYWdlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLnV0aWwuRW1wdHlTdGFja0V4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MamF2YS91dGlsL01hcEVudHJ5JFR5cGU7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08SzpMamF2YS9sYW5nL09iamVjdDtWOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS9sYW5nL09iamVjdDtMamF2YS91dGlsL01hcCRFbnRyeTxUSztUVjs+O0xqYXZhL2xhbmcvQ2xvbmVhYmxlOyApCi0gY2xhc3MgamF2YS51dGlsLk1hcEVudHJ5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudXRpbC5NYXAkRW50cnksIGphdmEubGFuZy5DbG9uZWFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1USzsgKQotIGphdmEubGFuZy5PYmplY3Qga2V5Ci1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9VFY7ICkKLSBqYXZhLmxhbmcuT2JqZWN0IHZhbHVlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEs7KVYgKQotIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEs7VFY7KVYgKQotIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgY2xvbmUoKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVEs7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldEtleSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClUVjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0VmFsdWUoKQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVFY7KVRWOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBzZXRWYWx1ZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL0VudW1NYXA7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08S1Q6TGphdmEvbGFuZy9FbnVtPFRLVDs+O1ZUOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS91dGlsL01hcEVudHJ5PFRLVDtUVlQ7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1FbnRyeSApCi0gY2xhc3MgamF2YS51dGlsLkVudW1NYXAkRW50cnkgZXh0ZW5kcyBqYXZhLnV0aWwuTWFwRW50cnkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0VudW1NYXA8VEtUO1RWVDs+OyApCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5FbnVtTWFwIGVudW1NYXAKLQotcHJpdmF0ZSBmaW5hbCBpbnQgb3JkaW5hbAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRLVDtUVlQ7TGphdmEvdXRpbC9FbnVtTWFwPFRLVDtUVlQ7PjspViApCi0gdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuRW51bQotamF2YS5sYW5nLk9iamVjdAotamF2YS51dGlsLkVudW1NYXApCi0KLXByaXZhdGUgdm9pZCBjaGVja0VudHJ5U3RhdHVzKCkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVRLVDsgKQotcHVibGljIGphdmEubGFuZy5FbnVtIGdldEtleSgpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IGdldEtleSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClUVlQ7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldFZhbHVlKCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRWVDspVFZUOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBzZXRWYWx1ZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEU6TGphdmEvbGFuZy9PYmplY3Q7S1Q6TGphdmEvbGFuZy9FbnVtPFRLVDs+O1ZUOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS9sYW5nL09iamVjdDtMamF2YS91dGlsL0l0ZXJhdG9yPFRFOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvRW51bU1hcDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1FbnVtTWFwSXRlcmF0b3IgKQotIGNsYXNzIGphdmEudXRpbC5FbnVtTWFwJEVudW1NYXBJdGVyYXRvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuSXRlcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0VudW1NYXA8VEtUO1RWVDs+OyApCi1maW5hbCBqYXZhLnV0aWwuRW51bU1hcCBlbnVtTWFwCi0KLSBpbnQgcG9zaXRpb24KLQotIGludCBwcmVQb3NpdGlvbgotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvTWFwRW50cnkkVHlwZTxURTtUS1Q7VFZUOz47ICkKLWZpbmFsIGphdmEudXRpbC5NYXBFbnRyeSRUeXBlIHR5cGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL01hcEVudHJ5JFR5cGU8VEU7VEtUO1RWVDs+O0xqYXZhL3V0aWwvRW51bU1hcDxUS1Q7VFZUOz47KVYgKQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLk1hcEVudHJ5JFR5cGUKLWphdmEudXRpbC5FbnVtTWFwKQotCi1wcml2YXRlIHZvaWQgY2hlY2tTdGF0dXMoKQotCi1wdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVRFOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBuZXh0KCkKLQotcHVibGljIHZvaWQgcmVtb3ZlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvRW51bU1hcDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxFOkxqYXZhL2xhbmcvT2JqZWN0O0tUOkxqYXZhL2xhbmcvRW51bTxUS1Q7PjtWVDpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvdXRpbC9FbnVtTWFwJEVudW1NYXBJdGVyYXRvcjxURTtUS1Q7VFZUOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9RW51bU1hcEVudHJ5SXRlcmF0b3IgKQotIGNsYXNzIGphdmEudXRpbC5FbnVtTWFwJEVudW1NYXBFbnRyeUl0ZXJhdG9yIGV4dGVuZHMgamF2YS51dGlsLkVudW1NYXAkRW51bU1hcEl0ZXJhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9NYXBFbnRyeSRUeXBlPFRFO1RLVDtUVlQ7PjtMamF2YS91dGlsL0VudW1NYXA8VEtUO1RWVDs+OylWICkKLSB2b2lkIDxpbml0PigKLWphdmEudXRpbC5NYXBFbnRyeSRUeXBlCi1qYXZhLnV0aWwuRW51bU1hcCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVRFOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBuZXh0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE1NDQgbmFtZSA9VHlwZSApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFJUOkxqYXZhL2xhbmcvT2JqZWN0O0tUOkxqYXZhL2xhbmcvT2JqZWN0O1ZUOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS9sYW5nL09iamVjdDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9NYXBFbnRyeTsgKQotYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEudXRpbC5NYXBFbnRyeSRUeXBlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTWFwRW50cnk8VEtUO1RWVDs+OylUUlQ7ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuT2JqZWN0IGdldCgKLWphdmEudXRpbC5NYXBFbnRyeSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvdXRpbC9NYXBFbnRyeSRUeXBlPExqYXZhL3V0aWwvTWFwJEVudHJ5PFRLVDtUVlQ7PjtUS1Q7VFZUOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLSBjbGFzcyBqYXZhLnV0aWwuRW51bU1hcCRFbnVtTWFwRW50cnlTZXQkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuTWFwRW50cnkkVHlwZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBqYXZhLnV0aWwuRW51bU1hcCRFbnVtTWFwRW50cnlTZXQgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkVudW1NYXAkRW51bU1hcEVudHJ5U2V0KQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBnZXQoCi1qYXZhLnV0aWwuTWFwRW50cnkpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTWFwRW50cnk8VEtUO1RWVDs+OylMamF2YS91dGlsL01hcCRFbnRyeTxUS1Q7VFZUOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuTWFwJEVudHJ5IGdldCgKLWphdmEudXRpbC5NYXBFbnRyeSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL0VudW1NYXA7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9RW51bU1hcEVudHJ5U2V0ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08S1Q6TGphdmEvbGFuZy9FbnVtPFRLVDs+O1ZUOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS91dGlsL0Fic3RyYWN0U2V0PExqYXZhL3V0aWwvTWFwJEVudHJ5PFRLVDtUVlQ7Pjs+OyApCi0gY2xhc3MgamF2YS51dGlsLkVudW1NYXAkRW51bU1hcEVudHJ5U2V0IGV4dGVuZHMgamF2YS51dGlsLkFic3RyYWN0U2V0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9FbnVtTWFwPFRLVDtUVlQ7PjsgKQotcHJpdmF0ZSBmaW5hbCBqYXZhLnV0aWwuRW51bU1hcCBlbnVtTWFwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9FbnVtTWFwPFRLVDtUVlQ7PjspViApCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuRW51bU1hcCkKLQotcHVibGljIHZvaWQgY2xlYXIoKQotCi1wdWJsaWMgYm9vbGVhbiBjb250YWlucygKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0l0ZXJhdG9yPExqYXZhL3V0aWwvTWFwJEVudHJ5PFRLVDtUVlQ7Pjs+OyApCi1wdWJsaWMgamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXJhdG9yKCkKLQotcHVibGljIGJvb2xlYW4gcmVtb3ZlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGludCBzaXplKCkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3RbXSB0b0FycmF5KCkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3RbXSB0b0FycmF5KAotamF2YS5sYW5nLk9iamVjdFtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS91dGlsL01hcEVudHJ5JFR5cGU8VEtUO1RLVDtUVlQ7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotIGNsYXNzIGphdmEudXRpbC5FbnVtTWFwJEVudW1NYXBLZXlTZXQkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuTWFwRW50cnkkVHlwZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBqYXZhLnV0aWwuRW51bU1hcCRFbnVtTWFwS2V5U2V0IHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEudXRpbC5FbnVtTWFwJEVudW1NYXBLZXlTZXQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTWFwRW50cnk8VEtUO1RWVDs+OylUS1Q7ICkKLXB1YmxpYyBqYXZhLmxhbmcuRW51bSBnZXQoCi1qYXZhLnV0aWwuTWFwRW50cnkpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IGdldCgKLWphdmEudXRpbC5NYXBFbnRyeSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL0VudW1NYXA7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08S1Q6TGphdmEvbGFuZy9FbnVtPFRLVDs+O1ZUOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS91dGlsL0Fic3RyYWN0U2V0PFRLVDs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPUVudW1NYXBLZXlTZXQgKQotIGNsYXNzIGphdmEudXRpbC5FbnVtTWFwJEVudW1NYXBLZXlTZXQgZXh0ZW5kcyBqYXZhLnV0aWwuQWJzdHJhY3RTZXQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0VudW1NYXA8VEtUO1RWVDs+OyApCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5FbnVtTWFwIGVudW1NYXAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0VudW1NYXA8VEtUO1RWVDs+OylWICkKLSB2b2lkIDxpbml0PigKLWphdmEudXRpbC5FbnVtTWFwKQotCi1wdWJsaWMgdm9pZCBjbGVhcigpCi0KLXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvcigpCi0KLXB1YmxpYyBib29sZWFuIHJlbW92ZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBpbnQgc2l6ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3V0aWwvTWFwRW50cnkkVHlwZTxUVlQ7VEtUO1RWVDs+OyApCi0gY2xhc3MgamF2YS51dGlsLkVudW1NYXAkRW51bU1hcFZhbHVlQ29sbGVjdGlvbiQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudXRpbC5NYXBFbnRyeSRUeXBlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGphdmEudXRpbC5FbnVtTWFwJEVudW1NYXBWYWx1ZUNvbGxlY3Rpb24gdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkVudW1NYXAkRW51bU1hcFZhbHVlQ29sbGVjdGlvbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9NYXBFbnRyeTxUS1Q7VFZUOz47KVRWVDsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0KAotamF2YS51dGlsLk1hcEVudHJ5KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08S1Q6TGphdmEvbGFuZy9FbnVtPFRLVDs+O1ZUOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS91dGlsL0Fic3RyYWN0Q29sbGVjdGlvbjxUVlQ7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9FbnVtTWFwOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPUVudW1NYXBWYWx1ZUNvbGxlY3Rpb24gKQotIGNsYXNzIGphdmEudXRpbC5FbnVtTWFwJEVudW1NYXBWYWx1ZUNvbGxlY3Rpb24gZXh0ZW5kcyBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9FbnVtTWFwPFRLVDtUVlQ7PjsgKQotcHJpdmF0ZSBmaW5hbCBqYXZhLnV0aWwuRW51bU1hcCBlbnVtTWFwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9FbnVtTWFwPFRLVDtUVlQ7PjspViApCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuRW51bU1hcCkKLQotcHVibGljIHZvaWQgY2xlYXIoKQotCi1wdWJsaWMgYm9vbGVhbiBjb250YWlucygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBqYXZhLnV0aWwuSXRlcmF0b3IgaXRlcmF0b3IoKQotCi1wdWJsaWMgYm9vbGVhbiByZW1vdmUoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50IHNpemUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGphdmEvdXRpbC9FbnVtTWFwJEVudW1NYXBFbnRyeVNldDtMamF2YS91dGlsL0VudW1NYXAkRW51bU1hcEVudHJ5SXRlcmF0b3I7TGphdmEvdXRpbC9FbnVtTWFwJEVudW1NYXBWYWx1ZUNvbGxlY3Rpb247TGphdmEvdXRpbC9FbnVtTWFwJEVudW1NYXBLZXlTZXQ7TGphdmEvdXRpbC9FbnVtTWFwJEVudW1NYXBJdGVyYXRvcjtMamF2YS91dGlsL0VudW1NYXAkRW50cnk7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08SzpMamF2YS9sYW5nL0VudW08VEs7PjtWOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS91dGlsL0Fic3RyYWN0TWFwPFRLO1RWOz47TGphdmEvdXRpbC9NYXA8VEs7VFY7PjtMamF2YS9pby9TZXJpYWxpemFibGU7TGphdmEvbGFuZy9DbG9uZWFibGU7ICkKLXB1YmxpYyBjbGFzcyBqYXZhLnV0aWwuRW51bU1hcCBleHRlbmRzIGphdmEudXRpbC5BYnN0cmFjdE1hcCBpbXBsZW1lbnRzIGphdmEudXRpbC5NYXAsIGphdmEuaW8uU2VyaWFsaXphYmxlLCBqYXZhLmxhbmcuQ2xvbmVhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvRW51bU1hcCRFbnVtTWFwRW50cnlTZXQ8VEs7VFY7PjsgKQotcHJpdmF0ZSB0cmFuc2llbnQgamF2YS51dGlsLkVudW1NYXAkRW51bU1hcEVudHJ5U2V0IGVudHJ5U2V0Ci0KLXRyYW5zaWVudCBpbnQgZW51bVNpemUKLQotdHJhbnNpZW50IGJvb2xlYW5bXSBoYXNNYXBwaW5nCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9DbGFzczxUSzs+OyApCi1wcml2YXRlIGphdmEubGFuZy5DbGFzcyBrZXlUeXBlCi0KLXRyYW5zaWVudCBqYXZhLmxhbmcuRW51bVtdIGtleXMKLQotcHJpdmF0ZSB0cmFuc2llbnQgaW50IG1hcHBpbmdzQ291bnQKLQotdHJhbnNpZW50IGphdmEubGFuZy5PYmplY3RbXSB2YWx1ZXMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL0NsYXNzPFRLOz47KVYgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLkNsYXNzKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0VudW1NYXA8VEs7K1RWOz47KVYgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkVudW1NYXApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTWFwPFRLOytUVjs+OylWICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEudXRpbC5NYXApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvQ2xhc3M8VEs7PjspViApCi1wcml2YXRlIHZvaWQgaW5pdGlhbGl6YXRpb24oCi1qYXZhLmxhbmcuQ2xhc3MpCi0KLXByaXZhdGUgdm9pZCBpbml0aWFsaXphdGlvbigKLWphdmEudXRpbC5FbnVtTWFwKQotCi1wcml2YXRlIGJvb2xlYW4gaXNWYWxpZEtleVR5cGUoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wcml2YXRlIHZvaWQgcHV0QWxsSW1wbCgKLWphdmEudXRpbC5NYXApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRLO1RWOylUVjsgKQotcHJpdmF0ZSBqYXZhLmxhbmcuT2JqZWN0IHB1dEltcGwoCi1qYXZhLmxhbmcuRW51bQotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9sYW5nL0NsYXNzTm90Rm91bmRFeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCByZWFkT2JqZWN0KAotamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KAotamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0pCi0KLXB1YmxpYyB2b2lkIGNsZWFyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0Nsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBjbG9uZSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0VudW1NYXA8VEs7VFY7PjsgKQotcHVibGljIGphdmEudXRpbC5FbnVtTWFwIGNsb25lKCkKLQotcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYm9vbGVhbiBjb250YWluc1ZhbHVlKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvU2V0PExqYXZhL3V0aWwvTWFwJEVudHJ5PFRLO1RWOz47PjsgKQotcHVibGljIGphdmEudXRpbC5TZXQgZW50cnlTZXQoKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL09iamVjdDspVFY7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldCgKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL1NldDxUSzs+OyApCi1wdWJsaWMgamF2YS51dGlsLlNldCBrZXlTZXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUSztUVjspVFY7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHB1dCgKLWphdmEubGFuZy5FbnVtCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBwdXQoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL01hcDwrVEs7K1RWOz47KVYgKQotcHVibGljIHZvaWQgcHV0QWxsKAotamF2YS51dGlsLk1hcCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9PYmplY3Q7KVRWOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCByZW1vdmUoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50IHNpemUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9Db2xsZWN0aW9uPFRWOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuQ29sbGVjdGlvbiB2YWx1ZXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9NDEwNCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvRW51bVNldDsgKQotIGNsYXNzIGphdmEudXRpbC5FbnVtU2V0JDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL0VudW1TZXQ7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08RTpMamF2YS9sYW5nL0VudW08VEU7Pjs+TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvaW8vU2VyaWFsaXphYmxlOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPVNlcmlhbGl6YXRpb25Qcm94eSApCi0gY2xhc3MgamF2YS51dGlsLkVudW1TZXQkU2VyaWFsaXphdGlvblByb3h5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvQ2xhc3M8VEU7PjsgKQotcHJpdmF0ZSBqYXZhLmxhbmcuQ2xhc3MgZWxlbWVudFR5cGUKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1bVEU7ICkKLXByaXZhdGUgamF2YS5sYW5nLkVudW1bXSBlbGVtZW50cwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuRW51bVNldCQxKQotCi1zdGF0aWMgamF2YS5sYW5nLkVudW1bXSBhY2Nlc3MkMTAyKAotamF2YS51dGlsLkVudW1TZXQkU2VyaWFsaXphdGlvblByb3h5Ci1qYXZhLmxhbmcuRW51bVtdKQotCi1zdGF0aWMgamF2YS5sYW5nLkNsYXNzIGFjY2VzcyQyMDIoCi1qYXZhLnV0aWwuRW51bVNldCRTZXJpYWxpemF0aW9uUHJveHkKLWphdmEubGFuZy5DbGFzcykKLQotcHJpdmF0ZSBqYXZhLmxhbmcuT2JqZWN0IHJlYWRSZXNvbHZlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxqYXZhL3V0aWwvRW51bVNldCQxO0xqYXZhL3V0aWwvRW51bVNldCRTZXJpYWxpemF0aW9uUHJveHk7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08RTpMamF2YS9sYW5nL0VudW08VEU7Pjs+TGphdmEvdXRpbC9BYnN0cmFjdFNldDxURTs+O0xqYXZhL2xhbmcvQ2xvbmVhYmxlO0xqYXZhL2lvL1NlcmlhbGl6YWJsZTsgKQotcHVibGljIGFic3RyYWN0IGNsYXNzIGphdmEudXRpbC5FbnVtU2V0IGV4dGVuZHMgamF2YS51dGlsLkFic3RyYWN0U2V0IGltcGxlbWVudHMgamF2YS5sYW5nLkNsb25lYWJsZSwgamF2YS5pby5TZXJpYWxpemFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS5rZXJuZWwudm0uTGFuZ0FjY2VzcyBMQU5HX0JPT1RTVFJBUAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL0NsYXNzPFRFOz47ICkKLWZpbmFsIGphdmEubGFuZy5DbGFzcyBlbGVtZW50Q2xhc3MKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvQ2xhc3M8VEU7PjspViApCi0gdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuQ2xhc3MpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEU6TGphdmEvbGFuZy9FbnVtPFRFOz47PihMamF2YS9sYW5nL0NsYXNzPFRFOz47KUxqYXZhL3V0aWwvRW51bVNldDxURTs+OyApCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5FbnVtU2V0IGFsbE9mKAotamF2YS5sYW5nLkNsYXNzKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxFOkxqYXZhL2xhbmcvRW51bTxURTs+Oz4oTGphdmEvdXRpbC9FbnVtU2V0PFRFOz47KUxqYXZhL3V0aWwvRW51bVNldDxURTs+OyApCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5FbnVtU2V0IGNvbXBsZW1lbnRPZigKLWphdmEudXRpbC5FbnVtU2V0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxFOkxqYXZhL2xhbmcvRW51bTxURTs+Oz4oTGphdmEvdXRpbC9Db2xsZWN0aW9uPFRFOz47KUxqYXZhL3V0aWwvRW51bVNldDxURTs+OyApCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5FbnVtU2V0IGNvcHlPZigKLWphdmEudXRpbC5Db2xsZWN0aW9uKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxFOkxqYXZhL2xhbmcvRW51bTxURTs+Oz4oTGphdmEvdXRpbC9FbnVtU2V0PFRFOz47KUxqYXZhL3V0aWwvRW51bVNldDxURTs+OyApCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5FbnVtU2V0IGNvcHlPZigKLWphdmEudXRpbC5FbnVtU2V0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxFOkxqYXZhL2xhbmcvRW51bTxURTs+Oz4oTGphdmEvbGFuZy9DbGFzczxURTs+OylMamF2YS91dGlsL0VudW1TZXQ8VEU7PjsgKQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuRW51bVNldCBub25lT2YoCi1qYXZhLmxhbmcuQ2xhc3MpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEU6TGphdmEvbGFuZy9FbnVtPFRFOz47PihURTspTGphdmEvdXRpbC9FbnVtU2V0PFRFOz47ICkKLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLkVudW1TZXQgb2YoCi1qYXZhLmxhbmcuRW51bSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08RTpMamF2YS9sYW5nL0VudW08VEU7Pjs+KFRFO1RFOylMamF2YS91dGlsL0VudW1TZXQ8VEU7PjsgKQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuRW51bVNldCBvZigKLWphdmEubGFuZy5FbnVtCi1qYXZhLmxhbmcuRW51bSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08RTpMamF2YS9sYW5nL0VudW08VEU7Pjs+KFRFO1RFO1RFOylMamF2YS91dGlsL0VudW1TZXQ8VEU7PjsgKQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuRW51bVNldCBvZigKLWphdmEubGFuZy5FbnVtCi1qYXZhLmxhbmcuRW51bQotamF2YS5sYW5nLkVudW0pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEU6TGphdmEvbGFuZy9FbnVtPFRFOz47PihURTtURTtURTtURTspTGphdmEvdXRpbC9FbnVtU2V0PFRFOz47ICkKLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLkVudW1TZXQgb2YoCi1qYXZhLmxhbmcuRW51bQotamF2YS5sYW5nLkVudW0KLWphdmEubGFuZy5FbnVtCi1qYXZhLmxhbmcuRW51bSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08RTpMamF2YS9sYW5nL0VudW08VEU7Pjs+KFRFO1RFO1RFO1RFO1RFOylMamF2YS91dGlsL0VudW1TZXQ8VEU7PjsgKQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuRW51bVNldCBvZigKLWphdmEubGFuZy5FbnVtCi1qYXZhLmxhbmcuRW51bQotamF2YS5sYW5nLkVudW0KLWphdmEubGFuZy5FbnVtCi1qYXZhLmxhbmcuRW51bSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08RTpMamF2YS9sYW5nL0VudW08VEU7Pjs+KFRFO1tURTspTGphdmEvdXRpbC9FbnVtU2V0PFRFOz47ICkKLXB1YmxpYyBzdGF0aWMgdHJhbnNpZW50IGphdmEudXRpbC5FbnVtU2V0IG9mKAotamF2YS5sYW5nLkVudW0KLWphdmEubGFuZy5FbnVtW10pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEU6TGphdmEvbGFuZy9FbnVtPFRFOz47PihURTtURTspTGphdmEvdXRpbC9FbnVtU2V0PFRFOz47ICkKLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLkVudW1TZXQgcmFuZ2UoCi1qYXZhLmxhbmcuRW51bQotamF2YS5sYW5nLkVudW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9DbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsgKQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgY2xvbmUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9FbnVtU2V0PFRFOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuRW51bVNldCBjbG9uZSgpCi0KLWFic3RyYWN0IHZvaWQgY29tcGxlbWVudCgpCi0KLSBib29sZWFuIGlzVmFsaWRUeXBlKAotamF2YS5sYW5nLkNsYXNzKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShURTtURTspViApCi1hYnN0cmFjdCB2b2lkIHNldFJhbmdlKAotamF2YS5sYW5nLkVudW0KLWphdmEubGFuZy5FbnVtKQotCi0gamF2YS5sYW5nLk9iamVjdCB3cml0ZVJlcGxhY2UoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGphdmEudXRpbC5FdmVudExpc3RlbmVyUHJveHkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLkV2ZW50TGlzdGVuZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lciBsaXN0ZW5lcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEudXRpbC5FdmVudExpc3RlbmVyKQotCi1wdWJsaWMgamF2YS51dGlsLkV2ZW50TGlzdGVuZXIgZ2V0TGlzdGVuZXIoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEudXRpbC5FdmVudE9iamVjdCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJvdGVjdGVkIHRyYW5zaWVudCBqYXZhLmxhbmcuT2JqZWN0IHNvdXJjZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldFNvdXJjZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLnV0aWwuRm9ybWF0RmxhZ3NDb252ZXJzaW9uTWlzbWF0Y2hFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLnV0aWwuSWxsZWdhbEZvcm1hdEV4Y2VwdGlvbiBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotCi1wcml2YXRlIGNoYXIgYwotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWNoYXIpCi0KLXB1YmxpYyBjaGFyIGdldENvbnZlcnNpb24oKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRGbGFncygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE1lc3NhZ2UoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZhLnV0aWwuRm9ybWF0dGFibGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS91dGlsL0lsbGVnYWxGb3JtYXRFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGZvcm1hdFRvKAotamF2YS51dGlsLkZvcm1hdHRlcgotaW50Ci1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLnV0aWwuRm9ybWF0dGFibGVGbGFncyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUxURVJOQVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFRlRfSlVTVElGWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBVUFBFUkNBU0UKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTQxMDQgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL0Zvcm1hdHRlcjsgKQotIGNsYXNzIGphdmEudXRpbC5Gb3JtYXR0ZXIkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvRm9ybWF0dGVyOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9FbnVtPExqYXZhL3V0aWwvRm9ybWF0dGVyJEJpZ0RlY2ltYWxMYXlvdXRGb3JtOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTY0MDkgbmFtZSA9QmlnRGVjaW1hbExheW91dEZvcm0gKQotcHVibGljIGZpbmFsIGNsYXNzIGphdmEudXRpbC5Gb3JtYXR0ZXIkQmlnRGVjaW1hbExheW91dEZvcm0gZXh0ZW5kcyBqYXZhLmxhbmcuRW51bQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuRm9ybWF0dGVyJEJpZ0RlY2ltYWxMYXlvdXRGb3JtW10gJFZBTFVFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudXRpbC5Gb3JtYXR0ZXIkQmlnRGVjaW1hbExheW91dEZvcm0gREVDSU1BTF9GTE9BVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudXRpbC5Gb3JtYXR0ZXIkQmlnRGVjaW1hbExheW91dEZvcm0gU0NJRU5USUZJQwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVYgKQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuRm9ybWF0dGVyJEJpZ0RlY2ltYWxMYXlvdXRGb3JtIHZhbHVlT2YoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5Gb3JtYXR0ZXIkQmlnRGVjaW1hbExheW91dEZvcm1bXSB2YWx1ZXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9RGF0ZVRpbWVVdGlsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvRm9ybWF0dGVyOyApCi0gY2xhc3MgamF2YS51dGlsLkZvcm1hdHRlciREYXRlVGltZVV0aWwgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS51dGlsLkNhbGVuZGFyIGNhbGVuZGFyCi0KLXByaXZhdGUgamF2YS50ZXh0LkRhdGVGb3JtYXRTeW1ib2xzIGRhdGVGb3JtYXRTeW1ib2xzCi0KLXByaXZhdGUgamF2YS51dGlsLkxvY2FsZSBsb2NhbGUKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlciByZXN1bHQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuTG9jYWxlKQotCi1wcml2YXRlIGphdmEudGV4dC5EYXRlRm9ybWF0U3ltYm9scyBnZXREYXRlRm9ybWF0U3ltYm9scygpCi0KLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgcGFkZGluZ1plcm9zKAotbG9uZwotaW50KQotCi1wcml2YXRlIHZvaWQgdHJhbnNmb3JtX0EoKQotCi1wcml2YXRlIHZvaWQgdHJhbnNmb3JtX0IoKQotCi1wcml2YXRlIHZvaWQgdHJhbnNmb3JtX0MoKQotCi1wcml2YXRlIHZvaWQgdHJhbnNmb3JtX0QoKQotCi1wcml2YXRlIHZvaWQgdHJhbnNmb3JtX0YoKQotCi1wcml2YXRlIHZvaWQgdHJhbnNmb3JtX0goKQotCi1wcml2YXRlIHZvaWQgdHJhbnNmb3JtX0koKQotCi1wcml2YXRlIHZvaWQgdHJhbnNmb3JtX0woKQotCi1wcml2YXRlIHZvaWQgdHJhbnNmb3JtX00oKQotCi1wcml2YXRlIHZvaWQgdHJhbnNmb3JtX04oKQotCi1wcml2YXRlIHZvaWQgdHJhbnNmb3JtX1EoKQotCi1wcml2YXRlIHZvaWQgdHJhbnNmb3JtX1IoKQotCi1wcml2YXRlIHZvaWQgdHJhbnNmb3JtX1MoKQotCi1wcml2YXRlIHZvaWQgdHJhbnNmb3JtX1QoKQotCi1wcml2YXRlIHZvaWQgdHJhbnNmb3JtX1koKQotCi1wcml2YXRlIHZvaWQgdHJhbnNmb3JtX1ooKQotCi1wcml2YXRlIHZvaWQgdHJhbnNmb3JtX2EoKQotCi1wcml2YXRlIHZvaWQgdHJhbnNmb3JtX2IoKQotCi1wcml2YXRlIHZvaWQgdHJhbnNmb3JtX2MoKQotCi1wcml2YXRlIHZvaWQgdHJhbnNmb3JtX2QoKQotCi1wcml2YXRlIHZvaWQgdHJhbnNmb3JtX2UoKQotCi1wcml2YXRlIHZvaWQgdHJhbnNmb3JtX2ooKQotCi1wcml2YXRlIHZvaWQgdHJhbnNmb3JtX2soKQotCi1wcml2YXRlIHZvaWQgdHJhbnNmb3JtX2woKQotCi1wcml2YXRlIHZvaWQgdHJhbnNmb3JtX20oKQotCi1wcml2YXRlIHZvaWQgdHJhbnNmb3JtX3AoCi1ib29sZWFuKQotCi1wcml2YXRlIHZvaWQgdHJhbnNmb3JtX3IoKQotCi1wcml2YXRlIHZvaWQgdHJhbnNmb3JtX3MoKQotCi1wcml2YXRlIHZvaWQgdHJhbnNmb3JtX3koKQotCi1wcml2YXRlIHZvaWQgdHJhbnNmb3JtX3ooKQotCi0gdm9pZCB0cmFuc2Zvcm0oCi1qYXZhLnV0aWwuRm9ybWF0dGVyJEZvcm1hdFRva2VuCi1qYXZhLnV0aWwuQ2FsZW5kYXIKLWphdmEubGFuZy5TdHJpbmdCdWlsZGVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9RmxvYXRVdGlsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvRm9ybWF0dGVyOyApCi0gY2xhc3MgamF2YS51dGlsLkZvcm1hdHRlciRGbG9hdFV0aWwgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS5sYW5nLk9iamVjdCBhcmd1bWVudAotCi1wcml2YXRlIGphdmEudGV4dC5EZWNpbWFsRm9ybWF0IGRlY2ltYWxGb3JtYXQKLQotcHJpdmF0ZSBqYXZhLnV0aWwuRm9ybWF0dGVyJEZvcm1hdFRva2VuIGZvcm1hdFRva2VuCi0KLXByaXZhdGUgY2hhciBtaW51c1NpZ24KLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlciByZXN1bHQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nQnVpbGRlcgotamF2YS51dGlsLkZvcm1hdHRlciRGb3JtYXRUb2tlbgotamF2YS50ZXh0LkRlY2ltYWxGb3JtYXQKLWphdmEubGFuZy5PYmplY3QpCi0KLSBjaGFyIGdldEFkZFNpZ24oKQotCi0gY2hhciBnZXRNaW51c1NpZ24oKQotCi0gdm9pZCB0cmFuc2Zvcm0oCi1qYXZhLnV0aWwuRm9ybWF0dGVyJEZvcm1hdFRva2VuCi1qYXZhLmxhbmcuU3RyaW5nQnVpbGRlcikKLQotIHZvaWQgdHJhbnNmb3JtX2EoKQotCi0gdm9pZCB0cmFuc2Zvcm1fZSgpCi0KLSB2b2lkIHRyYW5zZm9ybV9mKCkKLQotIHZvaWQgdHJhbnNmb3JtX2coKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9Rm9ybWF0VG9rZW4gKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9Gb3JtYXR0ZXI7ICkKLSBjbGFzcyBqYXZhLnV0aWwuRm9ybWF0dGVyJEZvcm1hdFRva2VuIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgaW50IERFRkFVTFRfUFJFQ0lTSU9OCi0KLXN0YXRpYyBmaW5hbCBpbnQgRkxBR1NfVU5TRVQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdUX1RZUEVfQ09VTlQKLQotc3RhdGljIGZpbmFsIGludCBGTEFHX0FERAotCi1zdGF0aWMgZmluYWwgaW50IEZMQUdfQ09NTUEKLQotc3RhdGljIGZpbmFsIGludCBGTEFHX01JTlVTCi0KLXN0YXRpYyBmaW5hbCBpbnQgRkxBR19QQVJFTlRIRVNJUwotCi1zdGF0aWMgZmluYWwgaW50IEZMQUdfU0hBUlAKLQotc3RhdGljIGZpbmFsIGludCBGTEFHX1NQQUNFCi0KLXN0YXRpYyBmaW5hbCBpbnQgRkxBR19aRVJPCi0KLXN0YXRpYyBmaW5hbCBpbnQgTEFTVF9BUkdVTUVOVF9JTkRFWAotCi1zdGF0aWMgZmluYWwgaW50IFVOU0VUCi0KLXByaXZhdGUgaW50IGFyZ0luZGV4Ci0KLXByaXZhdGUgY2hhciBjb252ZXJzaW9uVHlwZQotCi1wcml2YXRlIGNoYXIgZGF0ZVN1ZmZpeAotCi1wcml2YXRlIGludCBmbGFncwotCi1wcml2YXRlIGludCBmb3JtYXRTdHJpbmdTdGFydEluZGV4Ci0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBwbGFpblRleHQKLQotcHJpdmF0ZSBpbnQgcHJlY2lzaW9uCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIgc3RyRmxhZ3MKLQotcHJpdmF0ZSBpbnQgd2lkdGgKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkZvcm1hdHRlciQxKQotCi0gaW50IGdldEFyZ0luZGV4KCkKLQotIGNoYXIgZ2V0Q29udmVyc2lvblR5cGUoKQotCi0gY2hhciBnZXREYXRlU3VmZml4KCkKLQotIGludCBnZXRGbGFncygpCi0KLSBpbnQgZ2V0Rm9ybWF0U3RyaW5nU3RhcnRJbmRleCgpCi0KLSBqYXZhLmxhbmcuU3RyaW5nIGdldFBsYWluVGV4dCgpCi0KLSBpbnQgZ2V0UHJlY2lzaW9uKCkKLQotIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyRmxhZ3MoKQotCi0gaW50IGdldFdpZHRoKCkKLQotIGJvb2xlYW4gaXNGbGFnU2V0KAotaW50KQotCi0gYm9vbGVhbiBpc1ByZWNpc2lvblNldCgpCi0KLSBib29sZWFuIGlzV2lkdGhTZXQoKQotCi0gYm9vbGVhbiByZXF1aXJlQXJndW1lbnQoKQotCi0gdm9pZCBzZXRBcmdJbmRleCgKLWludCkKLQotIHZvaWQgc2V0Q29udmVyc2lvblR5cGUoCi1jaGFyKQotCi0gdm9pZCBzZXREYXRlU3VmZml4KAotY2hhcikKLQotIGJvb2xlYW4gc2V0RmxhZygKLWNoYXIpCi0KLSB2b2lkIHNldEZsYWdzKAotaW50KQotCi0gdm9pZCBzZXRGb3JtYXRTdHJpbmdTdGFydEluZGV4KAotaW50KQotCi0gdm9pZCBzZXRQbGFpblRleHQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi0gdm9pZCBzZXRQcmVjaXNpb24oCi1pbnQpCi0KLSB2b2lkIHNldFdpZHRoKAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvRm9ybWF0dGVyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPVBhcnNlclN0YXRlTWFjaGluZSApCi0gY2xhc3MgamF2YS51dGlsLkZvcm1hdHRlciRQYXJzZXJTdGF0ZU1hY2hpbmUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT05WRVJTSU9OX1RZUEVfU1RBVEUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVOVFJZX1NUQVRFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgRU9TCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFWElUX1NUQVRFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTEFHU19TVEFURQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFJFQ0lTSU9OX1NUQVRFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFSVF9DT05WRVJTSU9OX1NUQVRFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVUZGSVhfU1RBVEUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdJRFRIX1NUQVRFCi0KLXByaXZhdGUgY2hhciBjdXJyZW50Q2hhcgotCi1wcml2YXRlIGphdmEubmlvLkNoYXJCdWZmZXIgZm9ybWF0Ci0KLXByaXZhdGUgaW50IHN0YXRlCi0KLXByaXZhdGUgamF2YS51dGlsLkZvcm1hdHRlciRGb3JtYXRUb2tlbiB0b2tlbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEubmlvLkNoYXJCdWZmZXIpCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBnZXRGb3JtYXRTdHJpbmcoKQotCi1wcml2YXRlIGNoYXIgZ2V0TmV4dEZvcm1hdENoYXIoKQotCi1wcml2YXRlIGludCBwYXJzZUludCgKLWphdmEubmlvLkNoYXJCdWZmZXIpCi0KLXByaXZhdGUgdm9pZCBwcm9jZXNzX0NPTlZFUlNJT05fVFlQRV9TVEFURSgpCi0KLXByaXZhdGUgdm9pZCBwcm9jZXNzX0VOVFJZX1NUQVRFKCkKLQotcHJpdmF0ZSB2b2lkIHByb2Nlc3NfRVhJVF9TVEFURSgpCi0KLXByaXZhdGUgdm9pZCBwcm9jZXNzX0ZsQUdTX1NUQVRFKCkKLQotcHJpdmF0ZSB2b2lkIHByb2Nlc3NfUFJFQ0lTSU9OX1NUQVRFKCkKLQotcHJpdmF0ZSB2b2lkIHByb2Nlc3NfU1RBUlRfQ09OVkVSU0lPTl9TVEFURSgpCi0KLXByaXZhdGUgdm9pZCBwcm9jZXNzX1NVRkZJWF9TVEFURSgpCi0KLXByaXZhdGUgdm9pZCBwcm9jZXNzX1dJRFRIX1NUQVRFKCkKLQotIGphdmEudXRpbC5Gb3JtYXR0ZXIkRm9ybWF0VG9rZW4gZ2V0TmV4dEZvcm1hdFRva2VuKCkKLQotIHZvaWQgcmVzZXQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS9zZWN1cml0eS9Qcml2aWxlZ2VkQWN0aW9uPExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLSBjbGFzcyBqYXZhLnV0aWwuRm9ybWF0dGVyJFRyYW5zZm9ybWVyJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGphdmEudXRpbC5Gb3JtYXR0ZXIkVHJhbnNmb3JtZXIgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkZvcm1hdHRlciRUcmFuc2Zvcm1lcikKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgcnVuKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPVRyYW5zZm9ybWVyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvRm9ybWF0dGVyOyApCi0gY2xhc3MgamF2YS51dGlsLkZvcm1hdHRlciRUcmFuc2Zvcm1lciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBsaW5lU2VwYXJhdG9yCi0KLXByaXZhdGUgamF2YS5sYW5nLk9iamVjdCBhcmcKLQotcHJpdmF0ZSBqYXZhLnV0aWwuRm9ybWF0dGVyJERhdGVUaW1lVXRpbCBkYXRlVGltZVV0aWwKLQotcHJpdmF0ZSBqYXZhLnRleHQuRGVjaW1hbEZvcm1hdFN5bWJvbHMgZGVjaW1hbEZvcm1hdFN5bWJvbHMKLQotcHJpdmF0ZSBqYXZhLnV0aWwuRm9ybWF0dGVyJEZvcm1hdFRva2VuIGZvcm1hdFRva2VuCi0KLXByaXZhdGUgamF2YS51dGlsLkZvcm1hdHRlciBmb3JtYXR0ZXIKLQotcHJpdmF0ZSBqYXZhLnV0aWwuTG9jYWxlIGxvY2FsZQotCi1wcml2YXRlIGphdmEudGV4dC5OdW1iZXJGb3JtYXQgbnVtYmVyRm9ybWF0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkZvcm1hdHRlcgotamF2YS51dGlsLkxvY2FsZSkKLQotc3RhdGljIGphdmEudXRpbC5Mb2NhbGUgYWNjZXNzJDAwMCgKLWphdmEudXRpbC5Gb3JtYXR0ZXIkVHJhbnNmb3JtZXIpCi0KLXByaXZhdGUgamF2YS50ZXh0LkRlY2ltYWxGb3JtYXRTeW1ib2xzIGdldERlY2ltYWxGb3JtYXRTeW1ib2xzKCkKLQotcHJpdmF0ZSBqYXZhLnRleHQuTnVtYmVyRm9ybWF0IGdldE51bWJlckZvcm1hdCgpCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBwYWRkaW5nKAotamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIKLWludCkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHRyYW5zZm9ybUZyb21CaWdJbnRlZ2VyKCkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHRyYW5zZm9ybUZyb21Cb29sZWFuKCkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHRyYW5zZm9ybUZyb21DaGFyYWN0ZXIoKQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgdHJhbnNmb3JtRnJvbURhdGVUaW1lKCkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHRyYW5zZm9ybUZyb21GbG9hdCgpCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyB0cmFuc2Zvcm1Gcm9tSGFzaENvZGUoKQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgdHJhbnNmb3JtRnJvbUludGVnZXIoKQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgdHJhbnNmb3JtRnJvbU51bGwoKQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgdHJhbnNmb3JtRnJvbVBlcmNlbnQoKQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgdHJhbnNmb3JtRnJvbVNwZWNpYWxOdW1iZXIoKQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgdHJhbnNmb3JtRnJvbVN0cmluZygpCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyB0cmFuc2Zyb21Gcm9tTGluZVNlcGFyYXRvcigpCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIgd3JhcFBhcmVudGhlc2VzKAotamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIpCi0KLSBqYXZhLmxhbmcuU3RyaW5nIHRyYW5zZm9ybSgKLWphdmEudXRpbC5Gb3JtYXR0ZXIkRm9ybWF0VG9rZW4KLWphdmEubGFuZy5PYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MamF2YS91dGlsL0Zvcm1hdHRlciQxO0xqYXZhL3V0aWwvRm9ybWF0dGVyJFBhcnNlclN0YXRlTWFjaGluZTtMamF2YS91dGlsL0Zvcm1hdHRlciREYXRlVGltZVV0aWw7TGphdmEvdXRpbC9Gb3JtYXR0ZXIkRmxvYXRVdGlsO0xqYXZhL3V0aWwvRm9ybWF0dGVyJFRyYW5zZm9ybWVyO0xqYXZhL3V0aWwvRm9ybWF0dGVyJEZvcm1hdFRva2VuO0xqYXZhL3V0aWwvRm9ybWF0dGVyJEJpZ0RlY2ltYWxMYXlvdXRGb3JtOyApCi1wdWJsaWMgZmluYWwgY2xhc3MgamF2YS51dGlsLkZvcm1hdHRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmlvLkNsb3NlYWJsZSwgamF2YS5pby5GbHVzaGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBib29sZWFuIGNsb3NlZAotCi1wcml2YXRlIGphdmEuaW8uSU9FeGNlcHRpb24gbGFzdElPRXhjZXB0aW9uCi0KLXByaXZhdGUgamF2YS51dGlsLkxvY2FsZSBsb2NhbGUKLQotcHJpdmF0ZSBqYXZhLmxhbmcuQXBwZW5kYWJsZSBvdXQKLQotcHJpdmF0ZSBqYXZhLnV0aWwuRm9ybWF0dGVyJFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9GaWxlTm90Rm91bmRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uRmlsZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9GaWxlTm90Rm91bmRFeGNlcHRpb247TGphdmEvaW8vVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5GaWxlCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0ZpbGVOb3RGb3VuZEV4Y2VwdGlvbjtMamF2YS9pby9VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmlvLkZpbGUKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudXRpbC5Mb2NhbGUpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uT3V0cHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL1Vuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uT3V0cHV0U3RyZWFtCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL1Vuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uT3V0cHV0U3RyZWFtCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnV0aWwuTG9jYWxlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmlvLlByaW50U3RyZWFtKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuQXBwZW5kYWJsZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLkFwcGVuZGFibGUKLWphdmEudXRpbC5Mb2NhbGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vRmlsZU5vdEZvdW5kRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0ZpbGVOb3RGb3VuZEV4Y2VwdGlvbjtMamF2YS9pby9VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0ZpbGVOb3RGb3VuZEV4Y2VwdGlvbjtMamF2YS9pby9VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnV0aWwuTG9jYWxlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuTG9jYWxlKQotCi1wcml2YXRlIHZvaWQgY2hlY2tDbG9zZWQoKQotCi1wcml2YXRlIHN0YXRpYyB2b2lkIGNsb3NlT3V0cHV0U3RyZWFtKAotamF2YS5pby5PdXRwdXRTdHJlYW0pCi0KLXByaXZhdGUgamF2YS5sYW5nLk9iamVjdCBnZXRBcmd1bWVudCgKLWphdmEubGFuZy5PYmplY3RbXQotaW50Ci1qYXZhLnV0aWwuRm9ybWF0dGVyJEZvcm1hdFRva2VuCi1qYXZhLmxhbmcuT2JqZWN0Ci1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBjbG9zZSgpCi0KLXB1YmxpYyB2b2lkIGZsdXNoKCkKLQotcHVibGljIHRyYW5zaWVudCBqYXZhLnV0aWwuRm9ybWF0dGVyIGZvcm1hdCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3RbXSkKLQotcHVibGljIHRyYW5zaWVudCBqYXZhLnV0aWwuRm9ybWF0dGVyIGZvcm1hdCgKLWphdmEudXRpbC5Mb2NhbGUKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3RbXSkKLQotcHVibGljIGphdmEuaW8uSU9FeGNlcHRpb24gaW9FeGNlcHRpb24oKQotCi1wdWJsaWMgamF2YS51dGlsLkxvY2FsZSBsb2NhbGUoKQotCi1wdWJsaWMgamF2YS5sYW5nLkFwcGVuZGFibGUgb3V0KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEudXRpbC5Gb3JtYXR0ZXJDbG9zZWRFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXIgZXh0ZW5kcyBqYXZhLnV0aWwuQ2FsZW5kYXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkMKLQotc3RhdGljIGJ5dGVbXSBEYXlzSW5Nb250aAotCi1wcml2YXRlIHN0YXRpYyBpbnRbXSBEYXlzSW5ZZWFyCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgZGVmYXVsdEdyZWdvcmlhbkN1dG92ZXIKLQotcHJpdmF0ZSBzdGF0aWMgaW50W10gbGVhc3RNYXhpbXVtcwotCi1wcml2YXRlIHN0YXRpYyBpbnRbXSBtYXhpbXVtcwotCi1wcml2YXRlIHN0YXRpYyBpbnRbXSBtaW5pbXVtcwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSBpbnRbXSBjYWNoZWRGaWVsZHMKLQotcHJpdmF0ZSB0cmFuc2llbnQgaW50IGNoYW5nZVllYXIKLQotcHJpdmF0ZSBpbnQgY3VycmVudFllYXJTa2V3Ci0KLXByaXZhdGUgbG9uZyBncmVnb3JpYW5DdXRvdmVyCi0KLXByaXZhdGUgYm9vbGVhbiBpc0NhY2hlZAotCi1wcml2YXRlIHRyYW5zaWVudCBpbnQganVsaWFuU2tldwotCi1wcml2YXRlIGxvbmcgbGFzdE1pZG5pZ2h0TWlsbGlzCi0KLXByaXZhdGUgaW50IGxhc3RZZWFyU2tldwotCi1wcml2YXRlIGxvbmcgbmV4dE1pZG5pZ2h0TWlsbGlzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludCkKLQotIHZvaWQgPGluaXQ+KAotbG9uZykKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkxvY2FsZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLlRpbWVab25lKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuVGltZVpvbmUKLWphdmEudXRpbC5Mb2NhbGUpCi0KLSB2b2lkIDxpbml0PigKLWJvb2xlYW4pCi0KLXByaXZhdGUgZmluYWwgdm9pZCBjYWNoZWRGaWVsZHNDaGVja0FuZEdldCgKLWxvbmcKLWxvbmcKLWxvbmcKLWludAotaW50KQotCi1wcml2YXRlIGludCBjb21wdXRlWWVhckFuZERheSgKLWxvbmcKLWxvbmcpCi0KLXByaXZhdGUgbG9uZyBkYXlzRnJvbUJhc2VZZWFyKAotaW50KQotCi1wcml2YXRlIGludCBkYXlzSW5Nb250aCgpCi0KLXByaXZhdGUgaW50IGRheXNJbk1vbnRoKAotYm9vbGVhbgotaW50KQotCi1wcml2YXRlIGludCBkYXlzSW5ZZWFyKAotaW50KQotCi1wcml2YXRlIGludCBkYXlzSW5ZZWFyKAotYm9vbGVhbgotaW50KQotCi1wcml2YXRlIGZpbmFsIHZvaWQgZnVsbEZpZWxkc0NhbGMoCi1sb25nCi1pbnQKLWludCkKLQotcHJpdmF0ZSBpbnQganVsaWFuRXJyb3IoKQotCi1wcml2YXRlIGludCBtb2QoCi1pbnQKLWludCkKLQotcHJpdmF0ZSBpbnQgbW9kNygKLWxvbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgcmVhZE9iamVjdCgKLWphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCB3cml0ZU9iamVjdCgKLWphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtKQotCi1wdWJsaWMgdm9pZCBhZGQoCi1pbnQKLWludCkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgY2xvbmUoKQotCi1wcm90ZWN0ZWQgdm9pZCBjb21wdXRlRmllbGRzKCkKLQotcHJvdGVjdGVkIHZvaWQgY29tcHV0ZVRpbWUoKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50IGdldEFjdHVhbE1heGltdW0oCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0QWN0dWFsTWluaW11bSgKLWludCkKLQotcHVibGljIGludCBnZXRHcmVhdGVzdE1pbmltdW0oCi1pbnQpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLnV0aWwuRGF0ZSBnZXRHcmVnb3JpYW5DaGFuZ2UoKQotCi1wdWJsaWMgaW50IGdldExlYXN0TWF4aW11bSgKLWludCkKLQotcHVibGljIGludCBnZXRNYXhpbXVtKAotaW50KQotCi1wdWJsaWMgaW50IGdldE1pbmltdW0oCi1pbnQpCi0KLSBpbnQgZ2V0T2Zmc2V0KAotbG9uZykKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLXB1YmxpYyBib29sZWFuIGlzTGVhcFllYXIoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHJvbGwoCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgcm9sbCgKLWludAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0Rmlyc3REYXlPZldlZWsoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldEdyZWdvcmlhbkNoYW5nZSgKLWphdmEudXRpbC5EYXRlKQotCi1wdWJsaWMgdm9pZCBzZXRNaW5pbWFsRGF5c0luRmlyc3RXZWVrKAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS91dGlsL01hcEVudHJ5JFR5cGU8VEs7VEs7VFY7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotIGNsYXNzIGphdmEudXRpbC5IYXNoTWFwJDEkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuTWFwRW50cnkkVHlwZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBqYXZhLnV0aWwuSGFzaE1hcCQxIHRoaXMkMQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEudXRpbC5IYXNoTWFwJDEpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTWFwRW50cnk8VEs7VFY7PjspVEs7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldCgKLWphdmEudXRpbC5NYXBFbnRyeSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9BYnN0cmFjdFNldDxUSzs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi0gY2xhc3MgamF2YS51dGlsLkhhc2hNYXAkMSBleHRlbmRzIGphdmEudXRpbC5BYnN0cmFjdFNldAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBqYXZhLnV0aWwuSGFzaE1hcCB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuSGFzaE1hcCkKLQotcHVibGljIHZvaWQgY2xlYXIoKQotCi1wdWJsaWMgYm9vbGVhbiBjb250YWlucygKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0l0ZXJhdG9yPFRLOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuSXRlcmF0b3IgaXRlcmF0b3IoKQotCi1wdWJsaWMgYm9vbGVhbiByZW1vdmUoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50IHNpemUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS91dGlsL01hcEVudHJ5JFR5cGU8VFY7VEs7VFY7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotIGNsYXNzIGphdmEudXRpbC5IYXNoTWFwJDIkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuTWFwRW50cnkkVHlwZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBqYXZhLnV0aWwuSGFzaE1hcCQyIHRoaXMkMQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEudXRpbC5IYXNoTWFwJDIpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTWFwRW50cnk8VEs7VFY7PjspVFY7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldCgKLWphdmEudXRpbC5NYXBFbnRyeSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9BYnN0cmFjdENvbGxlY3Rpb248VFY7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotIGNsYXNzIGphdmEudXRpbC5IYXNoTWFwJDIgZXh0ZW5kcyBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGphdmEudXRpbC5IYXNoTWFwIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEudXRpbC5IYXNoTWFwKQotCi1wdWJsaWMgdm9pZCBjbGVhcigpCi0KLXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvSXRlcmF0b3I8VFY7PjsgKQotcHVibGljIGphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvcigpCi0KLXB1YmxpYyBpbnQgc2l6ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNoTWFwOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEs6TGphdmEvbGFuZy9PYmplY3Q7VjpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvdXRpbC9NYXBFbnRyeTxUSztUVjs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9RW50cnkgKQotIGNsYXNzIGphdmEudXRpbC5IYXNoTWFwJEVudHJ5IGV4dGVuZHMgamF2YS51dGlsLk1hcEVudHJ5Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNoTWFwJEVudHJ5PFRLO1RWOz47ICkKLSBqYXZhLnV0aWwuSGFzaE1hcCRFbnRyeSBuZXh0Ci0KLWZpbmFsIGludCBvcmlnS2V5SGFzaAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRLO0kpViApCi0gdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuT2JqZWN0Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRLO1RWOylWICkKLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGNsb25lKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvdXRpbC9NYXBFbnRyeSRUeXBlPExqYXZhL3V0aWwvTWFwJEVudHJ5PFRLVDtUVlQ7PjtUS1Q7VFZUOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLSBjbGFzcyBqYXZhLnV0aWwuSGFzaE1hcCRIYXNoTWFwRW50cnlTZXQkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuTWFwRW50cnkkVHlwZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBqYXZhLnV0aWwuSGFzaE1hcCRIYXNoTWFwRW50cnlTZXQgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkhhc2hNYXAkSGFzaE1hcEVudHJ5U2V0KQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBnZXQoCi1qYXZhLnV0aWwuTWFwRW50cnkpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTWFwRW50cnk8VEtUO1RWVDs+OylMamF2YS91dGlsL01hcCRFbnRyeTxUS1Q7VFZUOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuTWFwJEVudHJ5IGdldCgKLWphdmEudXRpbC5NYXBFbnRyeSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEtUOkxqYXZhL2xhbmcvT2JqZWN0O1ZUOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS91dGlsL0Fic3RyYWN0U2V0PExqYXZhL3V0aWwvTWFwJEVudHJ5PFRLVDtUVlQ7Pjs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9SGFzaE1hcEVudHJ5U2V0ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaE1hcDsgKQotIGNsYXNzIGphdmEudXRpbC5IYXNoTWFwJEhhc2hNYXBFbnRyeVNldCBleHRlbmRzIGphdmEudXRpbC5BYnN0cmFjdFNldAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaE1hcDxUS1Q7VFZUOz47ICkKLXByaXZhdGUgZmluYWwgamF2YS51dGlsLkhhc2hNYXAgYXNzb2NpYXRlZE1hcAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvSGFzaE1hcDxUS1Q7VFZUOz47KVYgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkhhc2hNYXApCi0KLXB1YmxpYyB2b2lkIGNsZWFyKCkKLQotcHVibGljIGJvb2xlYW4gY29udGFpbnMoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9IYXNoTWFwPFRLVDtUVlQ7PjsgKQotIGphdmEudXRpbC5IYXNoTWFwIGhhc2hNYXAoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9JdGVyYXRvcjxMamF2YS91dGlsL01hcCRFbnRyeTxUS1Q7VFZUOz47PjsgKQotcHVibGljIGphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvcigpCi0KLXB1YmxpYyBib29sZWFuIHJlbW92ZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBpbnQgc2l6ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPUhhc2hNYXBJdGVyYXRvciApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEU6TGphdmEvbGFuZy9PYmplY3Q7S1Q6TGphdmEvbGFuZy9PYmplY3Q7VlQ6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3V0aWwvSXRlcmF0b3I8VEU7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNoTWFwOyApCi0gY2xhc3MgamF2YS51dGlsLkhhc2hNYXAkSGFzaE1hcEl0ZXJhdG9yIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudXRpbC5JdGVyYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaE1hcDxUS1Q7VFZUOz47ICkKLWZpbmFsIGphdmEudXRpbC5IYXNoTWFwIGFzc29jaWF0ZWRNYXAKLQotIGJvb2xlYW4gY2FuUmVtb3ZlCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNoTWFwJEVudHJ5PFRLVDtUVlQ7PjsgKQotIGphdmEudXRpbC5IYXNoTWFwJEVudHJ5IGVudHJ5Ci0KLSBpbnQgZXhwZWN0ZWRNb2RDb3VudAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaE1hcCRFbnRyeTxUS1Q7VFZUOz47ICkKLSBqYXZhLnV0aWwuSGFzaE1hcCRFbnRyeSBsYXN0RW50cnkKLQotcHJpdmF0ZSBpbnQgcG9zaXRpb24KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL01hcEVudHJ5JFR5cGU8VEU7VEtUO1RWVDs+OyApCi1maW5hbCBqYXZhLnV0aWwuTWFwRW50cnkkVHlwZSB0eXBlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9NYXBFbnRyeSRUeXBlPFRFO1RLVDtUVlQ7PjtMamF2YS91dGlsL0hhc2hNYXA8VEtUO1RWVDs+OylWICkKLSB2b2lkIDxpbml0PigKLWphdmEudXRpbC5NYXBFbnRyeSRUeXBlCi1qYXZhLnV0aWwuSGFzaE1hcCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS91dGlsL0NvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb247ICkKLSB2b2lkIGNoZWNrQ29uY3VycmVudE1vZCgpCi0KLXB1YmxpYyBib29sZWFuIGhhc05leHQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVEU7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IG5leHQoKQotCi1wdWJsaWMgdm9pZCByZW1vdmUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08RTpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvdXRpbC9BYnN0cmFjdFNldDxURTs+O0xqYXZhL3V0aWwvU2V0PFRFOz47TGphdmEvbGFuZy9DbG9uZWFibGU7TGphdmEvaW8vU2VyaWFsaXphYmxlOyApCi1wdWJsaWMgY2xhc3MgamF2YS51dGlsLkhhc2hTZXQgZXh0ZW5kcyBqYXZhLnV0aWwuQWJzdHJhY3RTZXQgaW1wbGVtZW50cyBqYXZhLnV0aWwuU2V0LCBqYXZhLmxhbmcuQ2xvbmVhYmxlLCBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0hhc2hNYXA8VEU7TGphdmEvdXRpbC9IYXNoU2V0PFRFOz47PjsgKQotdHJhbnNpZW50IGphdmEudXRpbC5IYXNoTWFwIGJhY2tpbmdNYXAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotZmxvYXQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvQ29sbGVjdGlvbjwrVEU7PjspViApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuQ29sbGVjdGlvbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9IYXNoTWFwPFRFO0xqYXZhL3V0aWwvSGFzaFNldDxURTs+Oz47KVYgKQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkhhc2hNYXApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgcmVhZE9iamVjdCgKLWphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCB3cml0ZU9iamVjdCgKLWphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShURTspWiApCi1wdWJsaWMgYm9vbGVhbiBhZGQoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgdm9pZCBjbGVhcigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGNsb25lKCkKLQotcHVibGljIGJvb2xlYW4gY29udGFpbnMoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJRilMamF2YS91dGlsL0hhc2hNYXA8VEU7TGphdmEvdXRpbC9IYXNoU2V0PFRFOz47PjsgKQotIGphdmEudXRpbC5IYXNoTWFwIGNyZWF0ZUJhY2tpbmdNYXAoCi1pbnQKLWZsb2F0KQotCi1wdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvSXRlcmF0b3I8VEU7PjsgKQotcHVibGljIGphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvcigpCi0KLXB1YmxpYyBib29sZWFuIHJlbW92ZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBpbnQgc2l6ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3V0aWwvRW51bWVyYXRpb248TGphdmEvbGFuZy9PYmplY3Q7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNodGFibGU7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLWZpbmFsIGNsYXNzIGphdmEudXRpbC5IYXNodGFibGUkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuRW51bWVyYXRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgYm9vbGVhbiBoYXNNb3JlRWxlbWVudHMoKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBuZXh0RWxlbWVudCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3V0aWwvTWFwRW50cnkkVHlwZTxMamF2YS91dGlsL01hcCRFbnRyeTxUSztUVjs+O1RLO1RWOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLSBjbGFzcyBqYXZhLnV0aWwuSGFzaHRhYmxlJDIkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuTWFwRW50cnkkVHlwZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBqYXZhLnV0aWwuSGFzaHRhYmxlJDIgdGhpcyQxCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkhhc2h0YWJsZSQyKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBnZXQoCi1qYXZhLnV0aWwuTWFwRW50cnkpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTWFwRW50cnk8VEs7VFY7PjspTGphdmEvdXRpbC9NYXAkRW50cnk8VEs7VFY7PjsgKQotcHVibGljIGphdmEudXRpbC5NYXAkRW50cnkgZ2V0KAotamF2YS51dGlsLk1hcEVudHJ5KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0Fic3RyYWN0U2V0PExqYXZhL3V0aWwvTWFwJEVudHJ5PFRLO1RWOz47PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotIGNsYXNzIGphdmEudXRpbC5IYXNodGFibGUkMiBleHRlbmRzIGphdmEudXRpbC5BYnN0cmFjdFNldAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBqYXZhLnV0aWwuSGFzaHRhYmxlIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEudXRpbC5IYXNodGFibGUpCi0KLXB1YmxpYyB2b2lkIGNsZWFyKCkKLQotcHVibGljIGJvb2xlYW4gY29udGFpbnMoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9JdGVyYXRvcjxMamF2YS91dGlsL01hcCRFbnRyeTxUSztUVjs+Oz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuSXRlcmF0b3IgaXRlcmF0b3IoKQotCi1wdWJsaWMgYm9vbGVhbiByZW1vdmUoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50IHNpemUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS91dGlsL01hcEVudHJ5JFR5cGU8VEs7VEs7VFY7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotIGNsYXNzIGphdmEudXRpbC5IYXNodGFibGUkMyQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudXRpbC5NYXBFbnRyeSRUeXBlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGphdmEudXRpbC5IYXNodGFibGUkMyB0aGlzJDEKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuSGFzaHRhYmxlJDMpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTWFwRW50cnk8VEs7VFY7PjspVEs7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldCgKLWphdmEudXRpbC5NYXBFbnRyeSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9BYnN0cmFjdFNldDxUSzs+OyApCi0gY2xhc3MgamF2YS51dGlsLkhhc2h0YWJsZSQzIGV4dGVuZHMgamF2YS51dGlsLkFic3RyYWN0U2V0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGphdmEudXRpbC5IYXNodGFibGUgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkhhc2h0YWJsZSkKLQotcHVibGljIHZvaWQgY2xlYXIoKQotCi1wdWJsaWMgYm9vbGVhbiBjb250YWlucygKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0l0ZXJhdG9yPFRLOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuSXRlcmF0b3IgaXRlcmF0b3IoKQotCi1wdWJsaWMgYm9vbGVhbiByZW1vdmUoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50IHNpemUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS91dGlsL01hcEVudHJ5JFR5cGU8VFY7VEs7VFY7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotIGNsYXNzIGphdmEudXRpbC5IYXNodGFibGUkNCQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudXRpbC5NYXBFbnRyeSRUeXBlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGphdmEudXRpbC5IYXNodGFibGUkNCB0aGlzJDEKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuSGFzaHRhYmxlJDQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTWFwRW50cnk8VEs7VFY7PjspVFY7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldCgKLWphdmEudXRpbC5NYXBFbnRyeSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9BYnN0cmFjdENvbGxlY3Rpb248VFY7PjsgKQotIGNsYXNzIGphdmEudXRpbC5IYXNodGFibGUkNCBleHRlbmRzIGphdmEudXRpbC5BYnN0cmFjdENvbGxlY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgamF2YS51dGlsLkhhc2h0YWJsZSB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuSGFzaHRhYmxlKQotCi1wdWJsaWMgdm9pZCBjbGVhcigpCi0KLXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvSXRlcmF0b3I8VFY7PjsgKQotcHVibGljIGphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvcigpCi0KLXB1YmxpYyBpbnQgc2l6ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1FbnRyeSApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEs6TGphdmEvbGFuZy9PYmplY3Q7VjpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvdXRpbC9NYXBFbnRyeTxUSztUVjs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL0hhc2h0YWJsZTsgKQotIGNsYXNzIGphdmEudXRpbC5IYXNodGFibGUkRW50cnkgZXh0ZW5kcyBqYXZhLnV0aWwuTWFwRW50cnkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgaW50IGhhc2hjb2RlCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNodGFibGUkRW50cnk8VEs7VFY7PjsgKQotIGphdmEudXRpbC5IYXNodGFibGUkRW50cnkgbmV4dAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRLO1RWOylWICkKLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGNsb25lKCkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzS2V5KAotamF2YS5sYW5nLk9iamVjdAotaW50KQotCi1wdWJsaWMgaW50IGdldEtleUhhc2goKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUVjspVFY7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHNldFZhbHVlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaHRhYmxlOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEU6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3V0aWwvRW51bWVyYXRpb248VEU7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xOCBuYW1lID1IYXNoRW51bWVyYXRvciApCi1maW5hbCBjbGFzcyBqYXZhLnV0aWwuSGFzaHRhYmxlJEhhc2hFbnVtZXJhdG9yIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudXRpbC5FbnVtZXJhdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaHRhYmxlJEVudHJ5PFRLO1RWOz47ICkKLSBqYXZhLnV0aWwuSGFzaHRhYmxlJEVudHJ5IGVudHJ5Ci0KLSBib29sZWFuIGtleQotCi0gaW50IHN0YXJ0Ci0KLWZpbmFsIGphdmEudXRpbC5IYXNodGFibGUgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkhhc2h0YWJsZQotYm9vbGVhbikKLQotcHVibGljIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVRFOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBuZXh0RWxlbWVudCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxFOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS9sYW5nL09iamVjdDtMamF2YS91dGlsL0l0ZXJhdG9yPFRFOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaHRhYmxlOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE4IG5hbWUgPUhhc2hJdGVyYXRvciApCi1maW5hbCBjbGFzcyBqYXZhLnV0aWwuSGFzaHRhYmxlJEhhc2hJdGVyYXRvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuSXRlcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBib29sZWFuIGNhblJlbW92ZQotCi1wcml2YXRlIGludCBleHBlY3RlZE1vZENvdW50Ci1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNodGFibGUkRW50cnk8VEs7VFY7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuSGFzaHRhYmxlJEVudHJ5IGxhc3RFbnRyeQotCi1wcml2YXRlIGludCBsYXN0UG9zaXRpb24KLQotcHJpdmF0ZSBpbnQgcG9zaXRpb24KLQotZmluYWwgamF2YS51dGlsLkhhc2h0YWJsZSB0aGlzJDAKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL01hcEVudHJ5JFR5cGU8VEU7VEs7VFY7PjsgKQotcHJpdmF0ZSBmaW5hbCBqYXZhLnV0aWwuTWFwRW50cnkkVHlwZSB0eXBlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9NYXBFbnRyeSRUeXBlPFRFO1RLO1RWOz47KVYgKQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkhhc2h0YWJsZQotamF2YS51dGlsLk1hcEVudHJ5JFR5cGUpCi0KLXB1YmxpYyBib29sZWFuIGhhc05leHQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVEU7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IG5leHQoKQotCi1wdWJsaWMgdm9pZCByZW1vdmUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9NDEwNCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvSHVnZUVudW1TZXQ7ICkKLSBjbGFzcyBqYXZhLnV0aWwuSHVnZUVudW1TZXQkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS91dGlsL0l0ZXJhdG9yPFRFOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvSHVnZUVudW1TZXQ7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MiBuYW1lID1IdWdlRW51bVNldEl0ZXJhdG9yICkKLSBjbGFzcyBqYXZhLnV0aWwuSHVnZUVudW1TZXQkSHVnZUVudW1TZXRJdGVyYXRvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuSXRlcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBpbnQgYml0c1Bvc2l0aW9uCi0KLSBib29sZWFuIGNhblByb2Nlc3MKLQotcHJpdmF0ZSBsb25nIGN1cnJlbnRFbGVtZW50TWFzawotCi1maW5hbCBqYXZhLnV0aWwuSHVnZUVudW1TZXQgdGhpcyQwCi0KLXByaXZhdGUgbG9uZ1tdIHVuUHJvY2Vzc2VkQml0cwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuSHVnZUVudW1TZXQpCi0KLSB2b2lkIDxpbml0PigKLWphdmEudXRpbC5IdWdlRW51bVNldAotamF2YS51dGlsLkh1Z2VFbnVtU2V0JDEpCi0KLXByaXZhdGUgdm9pZCBmaW5kTmV4dE5vbmVaZXJvUG9zaXRpb24oCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIGhhc05leHQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVEU7ICkKLXB1YmxpYyBqYXZhLmxhbmcuRW51bSBuZXh0KCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgbmV4dCgpCi0KLXB1YmxpYyB2b2lkIHJlbW92ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MamF2YS91dGlsL0h1Z2VFbnVtU2V0JDE7TGphdmEvdXRpbC9IdWdlRW51bVNldCRIdWdlRW51bVNldEl0ZXJhdG9yOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEU6TGphdmEvbGFuZy9FbnVtPFRFOz47PkxqYXZhL3V0aWwvRW51bVNldDxURTs+OyApCi1maW5hbCBjbGFzcyBqYXZhLnV0aWwuSHVnZUVudW1TZXQgZXh0ZW5kcyBqYXZhLnV0aWwuRW51bVNldAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQklUX0lOX0xPTkcKLQotcHJpdmF0ZSBsb25nW10gYml0cwotCi1wcml2YXRlIGludCBiaXRzSW5kZXgKLQotcHJpdmF0ZSBpbnQgZWxlbWVudEluQml0cwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPVtURTsgKQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuRW51bVtdIGVudW1zCi0KLXByaXZhdGUgbG9uZyBvbGRCaXRzCi0KLXByaXZhdGUgaW50IHNpemUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL0NsYXNzPFRFOz47W1RFOylWICkKLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5DbGFzcwotamF2YS5sYW5nLkVudW1bXSkKLQotc3RhdGljIGxvbmdbXSBhY2Nlc3MkMDAwKAotamF2YS51dGlsLkh1Z2VFbnVtU2V0KQotCi1zdGF0aWMgamF2YS5sYW5nLkVudW1bXSBhY2Nlc3MkMTAwKAotamF2YS51dGlsLkh1Z2VFbnVtU2V0KQotCi1zdGF0aWMgaW50IGFjY2VzcyQyMTAoCi1qYXZhLnV0aWwuSHVnZUVudW1TZXQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRFOylWICkKLXByaXZhdGUgdm9pZCBjYWxjdWxhdGVFbGVtZW50SW5kZXgoCi1qYXZhLmxhbmcuRW51bSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEU7KVogKQotcHVibGljIGJvb2xlYW4gYWRkKAotamF2YS5sYW5nLkVudW0pCi0KLXB1YmxpYyB2b2xhdGlsZSBib29sZWFuIGFkZCgKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvQ29sbGVjdGlvbjwrVEU7PjspWiApCi1wdWJsaWMgYm9vbGVhbiBhZGRBbGwoCi1qYXZhLnV0aWwuQ29sbGVjdGlvbikKLQotcHVibGljIHZvaWQgY2xlYXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IGNsb25lKCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEudXRpbC5FbnVtU2V0IGNsb25lKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvSHVnZUVudW1TZXQ8VEU7PjsgKQotcHVibGljIGphdmEudXRpbC5IdWdlRW51bVNldCBjbG9uZSgpCi0KLXByb3RlY3RlZCB2b2lkIGNvbXBsZW1lbnQoKQotCi1wdWJsaWMgYm9vbGVhbiBjb250YWlucygKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvQ29sbGVjdGlvbjwqPjspWiApCi1wdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbCgKLWphdmEudXRpbC5Db2xsZWN0aW9uKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9JdGVyYXRvcjxURTs+OyApCi1wdWJsaWMgamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXJhdG9yKCkKLQotcHVibGljIGJvb2xlYW4gcmVtb3ZlKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9Db2xsZWN0aW9uPCo+OylaICkKLXB1YmxpYyBib29sZWFuIHJlbW92ZUFsbCgKLWphdmEudXRpbC5Db2xsZWN0aW9uKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0NvbGxlY3Rpb248Kj47KVogKQotcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKAotamF2YS51dGlsLkNvbGxlY3Rpb24pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRFO1RFOylWICkKLSB2b2lkIHNldFJhbmdlKAotamF2YS5sYW5nLkVudW0KLWphdmEubGFuZy5FbnVtKQotCi1wdWJsaWMgaW50IHNpemUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS91dGlsL01hcEVudHJ5JFR5cGU8VEs7VEs7VFY7PjsgKQotIGNsYXNzIGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXAkMSQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudXRpbC5NYXBFbnRyeSRUeXBlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXAkMSB0aGlzJDEKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwJDEpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTWFwRW50cnk8VEs7VFY7PjspVEs7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldCgKLWphdmEudXRpbC5NYXBFbnRyeSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9BYnN0cmFjdFNldDxUSzs+OyApCi0gY2xhc3MgamF2YS51dGlsLklkZW50aXR5SGFzaE1hcCQxIGV4dGVuZHMgamF2YS51dGlsLkFic3RyYWN0U2V0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXAgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLklkZW50aXR5SGFzaE1hcCkKLQotcHVibGljIHZvaWQgY2xlYXIoKQotCi1wdWJsaWMgYm9vbGVhbiBjb250YWlucygKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0l0ZXJhdG9yPFRLOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuSXRlcmF0b3IgaXRlcmF0b3IoKQotCi1wdWJsaWMgYm9vbGVhbiByZW1vdmUoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50IHNpemUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS91dGlsL01hcEVudHJ5JFR5cGU8VFY7VEs7VFY7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotIGNsYXNzIGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXAkMiQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudXRpbC5NYXBFbnRyeSRUeXBlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXAkMiB0aGlzJDEKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwJDIpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTWFwRW50cnk8VEs7VFY7PjspVFY7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldCgKLWphdmEudXRpbC5NYXBFbnRyeSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9BYnN0cmFjdENvbGxlY3Rpb248VFY7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotIGNsYXNzIGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXAkMiBleHRlbmRzIGphdmEudXRpbC5BYnN0cmFjdENvbGxlY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgamF2YS51dGlsLklkZW50aXR5SGFzaE1hcCB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwKQotCi1wdWJsaWMgdm9pZCBjbGVhcigpCi0KLXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvSXRlcmF0b3I8VFY7PjsgKQotcHVibGljIGphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvcigpCi0KLXB1YmxpYyBib29sZWFuIHJlbW92ZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBpbnQgc2l6ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxLOkxqYXZhL2xhbmcvT2JqZWN0O1Y6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL3V0aWwvTWFwRW50cnk8VEs7VFY7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9JZGVudGl0eUhhc2hNYXA7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1JZGVudGl0eUhhc2hNYXBFbnRyeSApCi0gY2xhc3MgamF2YS51dGlsLklkZW50aXR5SGFzaE1hcCRJZGVudGl0eUhhc2hNYXBFbnRyeSBleHRlbmRzIGphdmEudXRpbC5NYXBFbnRyeQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRLO1RWOylWICkKLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGNsb25lKCkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvdXRpbC9NYXBFbnRyeSRUeXBlPExqYXZhL3V0aWwvTWFwJEVudHJ5PFRLVDtUVlQ7PjtUS1Q7VFZUOz47ICkKLSBjbGFzcyBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwJElkZW50aXR5SGFzaE1hcEVudHJ5U2V0JDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLk1hcEVudHJ5JFR5cGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgamF2YS51dGlsLklkZW50aXR5SGFzaE1hcCRJZGVudGl0eUhhc2hNYXBFbnRyeVNldCB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwJElkZW50aXR5SGFzaE1hcEVudHJ5U2V0KQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBnZXQoCi1qYXZhLnV0aWwuTWFwRW50cnkpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTWFwRW50cnk8VEtUO1RWVDs+OylMamF2YS91dGlsL01hcCRFbnRyeTxUS1Q7VFZUOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuTWFwJEVudHJ5IGdldCgKLWphdmEudXRpbC5NYXBFbnRyeSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEtUOkxqYXZhL2xhbmcvT2JqZWN0O1ZUOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS91dGlsL0Fic3RyYWN0U2V0PExqYXZhL3V0aWwvTWFwJEVudHJ5PFRLVDtUVlQ7Pjs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9SWRlbnRpdHlIYXNoTWFwRW50cnlTZXQgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9JZGVudGl0eUhhc2hNYXA7ICkKLSBjbGFzcyBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwJElkZW50aXR5SGFzaE1hcEVudHJ5U2V0IGV4dGVuZHMgamF2YS51dGlsLkFic3RyYWN0U2V0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9JZGVudGl0eUhhc2hNYXA8VEtUO1RWVDs+OyApCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXAgYXNzb2NpYXRlZE1hcAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvSWRlbnRpdHlIYXNoTWFwPFRLVDtUVlQ7PjspViApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwKQotCi1wdWJsaWMgdm9pZCBjbGVhcigpCi0KLXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvSWRlbnRpdHlIYXNoTWFwPFRLVDtUVlQ7PjsgKQotIGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXAgaGFzaE1hcCgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0l0ZXJhdG9yPExqYXZhL3V0aWwvTWFwJEVudHJ5PFRLVDtUVlQ7Pjs+OyApCi1wdWJsaWMgamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXJhdG9yKCkKLQotcHVibGljIGJvb2xlYW4gcmVtb3ZlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGludCBzaXplKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL0lkZW50aXR5SGFzaE1hcDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxFOkxqYXZhL2xhbmcvT2JqZWN0O0tUOkxqYXZhL2xhbmcvT2JqZWN0O1ZUOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS9sYW5nL09iamVjdDtMamF2YS91dGlsL0l0ZXJhdG9yPFRFOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1JZGVudGl0eUhhc2hNYXBJdGVyYXRvciApCi0gY2xhc3MgamF2YS51dGlsLklkZW50aXR5SGFzaE1hcCRJZGVudGl0eUhhc2hNYXBJdGVyYXRvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuSXRlcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0lkZW50aXR5SGFzaE1hcDxUS1Q7VFZUOz47ICkKLWZpbmFsIGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXAgYXNzb2NpYXRlZE1hcAotCi0gYm9vbGVhbiBjYW5SZW1vdmUKLQotIGludCBleHBlY3RlZE1vZENvdW50Ci0KLXByaXZhdGUgaW50IGxhc3RQb3NpdGlvbgotCi1wcml2YXRlIGludCBwb3NpdGlvbgotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvTWFwRW50cnkkVHlwZTxURTtUS1Q7VFZUOz47ICkKLWZpbmFsIGphdmEudXRpbC5NYXBFbnRyeSRUeXBlIHR5cGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL01hcEVudHJ5JFR5cGU8VEU7VEtUO1RWVDs+O0xqYXZhL3V0aWwvSWRlbnRpdHlIYXNoTWFwPFRLVDtUVlQ7PjspViApCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuTWFwRW50cnkkVHlwZQotamF2YS51dGlsLklkZW50aXR5SGFzaE1hcCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS91dGlsL0NvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb247ICkKLSB2b2lkIGNoZWNrQ29uY3VycmVudE1vZCgpCi0KLXB1YmxpYyBib29sZWFuIGhhc05leHQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVEU7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IG5leHQoKQotCi1wdWJsaWMgdm9pZCByZW1vdmUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGphdmEvdXRpbC9JZGVudGl0eUhhc2hNYXAkSWRlbnRpdHlIYXNoTWFwRW50cnlTZXQ7TGphdmEvdXRpbC9JZGVudGl0eUhhc2hNYXAkSWRlbnRpdHlIYXNoTWFwSXRlcmF0b3I7TGphdmEvdXRpbC9JZGVudGl0eUhhc2hNYXAkSWRlbnRpdHlIYXNoTWFwRW50cnk7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08SzpMamF2YS9sYW5nL09iamVjdDtWOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS91dGlsL0Fic3RyYWN0TWFwPFRLO1RWOz47TGphdmEvdXRpbC9NYXA8VEs7VFY7PjtMamF2YS9pby9TZXJpYWxpemFibGU7TGphdmEvbGFuZy9DbG9uZWFibGU7ICkKLXB1YmxpYyBjbGFzcyBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwIGV4dGVuZHMgamF2YS51dGlsLkFic3RyYWN0TWFwIGltcGxlbWVudHMgamF2YS51dGlsLk1hcCwgamF2YS5pby5TZXJpYWxpemFibGUsIGphdmEubGFuZy5DbG9uZWFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfTUFYX1NJWkUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLk9iamVjdCBOVUxMX09CSkVDVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgbG9hZEZhY3RvcgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotdHJhbnNpZW50IGphdmEubGFuZy5PYmplY3RbXSBlbGVtZW50RGF0YQotCi10cmFuc2llbnQgaW50IG1vZENvdW50Ci0KLSBpbnQgc2l6ZQotCi10cmFuc2llbnQgaW50IHRocmVzaG9sZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL01hcDwrVEs7K1RWOz47KVYgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLk1hcCkKLQotc3RhdGljIGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXAkSWRlbnRpdHlIYXNoTWFwRW50cnkgYWNjZXNzJDAwMCgKLWphdmEudXRpbC5JZGVudGl0eUhhc2hNYXAKLWludCkKLQotc3RhdGljIGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXAkSWRlbnRpdHlIYXNoTWFwRW50cnkgYWNjZXNzJDEwMCgKLWphdmEudXRpbC5JZGVudGl0eUhhc2hNYXAKLWphdmEubGFuZy5PYmplY3QpCi0KLXByaXZhdGUgaW50IGNvbXB1dGVFbGVtZW50QXJyYXlTaXplKCkKLQotcHJpdmF0ZSB2b2lkIGNvbXB1dGVNYXhTaXplKCkKLQotcHJpdmF0ZSBpbnQgZmluZEluZGV4KAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdFtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJKUxqYXZhL3V0aWwvSWRlbnRpdHlIYXNoTWFwJElkZW50aXR5SGFzaE1hcEVudHJ5PFRLO1RWOz47ICkKLXByaXZhdGUgamF2YS51dGlsLklkZW50aXR5SGFzaE1hcCRJZGVudGl0eUhhc2hNYXBFbnRyeSBnZXRFbnRyeSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL3V0aWwvSWRlbnRpdHlIYXNoTWFwJElkZW50aXR5SGFzaE1hcEVudHJ5PFRLO1RWOz47ICkKLXByaXZhdGUgamF2YS51dGlsLklkZW50aXR5SGFzaE1hcCRJZGVudGl0eUhhc2hNYXBFbnRyeSBnZXRFbnRyeSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXByaXZhdGUgaW50IGdldE1vZHVsb0hhc2goCi1qYXZhLmxhbmcuT2JqZWN0Ci1pbnQpCi0KLXByaXZhdGUgaW50IGdldFRocmVzaG9sZCgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9PYmplY3Q7KVRWOyApCi1wcml2YXRlIGphdmEubGFuZy5PYmplY3QgbWFzc2FnZVZhbHVlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuT2JqZWN0W10gbmV3RWxlbWVudEFycmF5KAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL01hcDwrVEs7K1RWOz47KVYgKQotcHJpdmF0ZSB2b2lkIHB1dEFsbEltcGwoCi1qYXZhLnV0aWwuTWFwKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL2xhbmcvQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoCi1qYXZhLmlvLk9iamVjdElucHV0U3RyZWFtKQotCi1wcml2YXRlIHZvaWQgcmVoYXNoKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KAotamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0pCi0KLXB1YmxpYyB2b2lkIGNsZWFyKCkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgY2xvbmUoKQotCi1wdWJsaWMgYm9vbGVhbiBjb250YWluc0tleSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBib29sZWFuIGNvbnRhaW5zVmFsdWUoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9TZXQ8TGphdmEvdXRpbC9NYXAkRW50cnk8VEs7VFY7Pjs+OyApCi1wdWJsaWMgamF2YS51dGlsLlNldCBlbnRyeVNldCgpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvT2JqZWN0OylUVjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0KAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL1NldDxUSzs+OyApCi1wdWJsaWMgamF2YS51dGlsLlNldCBrZXlTZXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUSztUVjspVFY7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHB1dCgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTWFwPCtUSzsrVFY7PjspViApCi1wdWJsaWMgdm9pZCBwdXRBbGwoCi1qYXZhLnV0aWwuTWFwKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL09iamVjdDspVFY7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHJlbW92ZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBpbnQgc2l6ZSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0NvbGxlY3Rpb248VFY7PjsgKQotcHVibGljIGphdmEudXRpbC5Db2xsZWN0aW9uIHZhbHVlcygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS51dGlsLklsbGVnYWxGb3JtYXRDb2RlUG9pbnRFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLnV0aWwuSWxsZWdhbEZvcm1hdEV4Y2VwdGlvbiBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotCi1wcml2YXRlIGludCBjCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50KQotCi1wdWJsaWMgaW50IGdldENvZGVQb2ludCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE1lc3NhZ2UoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEudXRpbC5JbGxlZ2FsRm9ybWF0Q29udmVyc2lvbkV4Y2VwdGlvbiBleHRlbmRzIGphdmEudXRpbC5JbGxlZ2FsRm9ybWF0RXhjZXB0aW9uIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9DbGFzczwqPjsgKQotcHJpdmF0ZSBqYXZhLmxhbmcuQ2xhc3MgYXJnCi0KLXByaXZhdGUgY2hhciBjCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oQ0xqYXZhL2xhbmcvQ2xhc3M8Kj47KVYgKQotcHVibGljIHZvaWQgPGluaXQ+KAotY2hhcgotamF2YS5sYW5nLkNsYXNzKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvbGFuZy9DbGFzczwqPjsgKQotcHVibGljIGphdmEubGFuZy5DbGFzcyBnZXRBcmd1bWVudENsYXNzKCkKLQotcHVibGljIGNoYXIgZ2V0Q29udmVyc2lvbigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE1lc3NhZ2UoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEudXRpbC5JbGxlZ2FsRm9ybWF0RmxhZ3NFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLnV0aWwuSWxsZWdhbEZvcm1hdEV4Y2VwdGlvbiBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZmxhZ3MKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRGbGFncygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE1lc3NhZ2UoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEudXRpbC5JbGxlZ2FsRm9ybWF0UHJlY2lzaW9uRXhjZXB0aW9uIGV4dGVuZHMgamF2YS51dGlsLklsbGVnYWxGb3JtYXRFeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0KLXByaXZhdGUgaW50IHAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE1lc3NhZ2UoKQotCi1wdWJsaWMgaW50IGdldFByZWNpc2lvbigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS51dGlsLklsbGVnYWxGb3JtYXRXaWR0aEV4Y2VwdGlvbiBleHRlbmRzIGphdmEudXRpbC5JbGxlZ2FsRm9ybWF0RXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotCi1wcml2YXRlIGludCB3Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRNZXNzYWdlKCkKLQotcHVibGljIGludCBnZXRXaWR0aCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEudXRpbC5JbnB1dE1pc21hdGNoRXhjZXB0aW9uIGV4dGVuZHMgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLnV0aWwuSW52YWxpZFByb3BlcnRpZXNGb3JtYXRFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmlvLklPRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5UaHJvd2FibGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vTm90U2VyaWFsaXphYmxlRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgcmVhZE9iamVjdCgKLWphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vTm90U2VyaWFsaXphYmxlRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoCi1qYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvdXRpbC9NYXBFbnRyeSRUeXBlPFRLO1RLO1RWOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLSBjbGFzcyBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcCQxJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLk1hcEVudHJ5JFR5cGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgamF2YS51dGlsLkxpbmtlZEhhc2hNYXAkMSB0aGlzJDEKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuTGlua2VkSGFzaE1hcCQxKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL01hcEVudHJ5PFRLO1RWOz47KVRLOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXQoCi1qYXZhLnV0aWwuTWFwRW50cnkpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQWJzdHJhY3RTZXQ8VEs7PjsgKQotIGNsYXNzIGphdmEudXRpbC5MaW5rZWRIYXNoTWFwJDEgZXh0ZW5kcyBqYXZhLnV0aWwuQWJzdHJhY3RTZXQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgamF2YS51dGlsLkxpbmtlZEhhc2hNYXAgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkxpbmtlZEhhc2hNYXApCi0KLXB1YmxpYyB2b2lkIGNsZWFyKCkKLQotcHVibGljIGJvb2xlYW4gY29udGFpbnMoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9JdGVyYXRvcjxUSzs+OyApCi1wdWJsaWMgamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXJhdG9yKCkKLQotcHVibGljIGJvb2xlYW4gcmVtb3ZlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGludCBzaXplKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvdXRpbC9NYXBFbnRyeSRUeXBlPFRWO1RLO1RWOz47ICkKLSBjbGFzcyBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcCQyJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLk1hcEVudHJ5JFR5cGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgamF2YS51dGlsLkxpbmtlZEhhc2hNYXAkMiB0aGlzJDEKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuTGlua2VkSGFzaE1hcCQyKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL01hcEVudHJ5PFRLO1RWOz47KVRWOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXQoCi1qYXZhLnV0aWwuTWFwRW50cnkpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQWJzdHJhY3RDb2xsZWN0aW9uPFRWOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLSBjbGFzcyBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcCQyIGV4dGVuZHMgamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcCB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuTGlua2VkSGFzaE1hcCkKLQotcHVibGljIHZvaWQgY2xlYXIoKQotCi1wdWJsaWMgYm9vbGVhbiBjb250YWlucygKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0l0ZXJhdG9yPFRWOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuSXRlcmF0b3IgaXRlcmF0b3IoKQotCi1wdWJsaWMgaW50IHNpemUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08RTpMamF2YS9sYW5nL09iamVjdDtLVDpMamF2YS9sYW5nL09iamVjdDtWVDpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvdXRpbC9IYXNoTWFwJEhhc2hNYXBJdGVyYXRvcjxURTtUS1Q7VFZUOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjQgbmFtZSA9TGlua2VkSGFzaEl0ZXJhdG9yICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvTGlua2VkSGFzaE1hcDsgKQotZmluYWwgY2xhc3MgamF2YS51dGlsLkxpbmtlZEhhc2hNYXAkTGlua2VkSGFzaEl0ZXJhdG9yIGV4dGVuZHMgamF2YS51dGlsLkhhc2hNYXAkSGFzaE1hcEl0ZXJhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9NYXBFbnRyeSRUeXBlPFRFO1RLVDtUVlQ7PjtMamF2YS91dGlsL0xpbmtlZEhhc2hNYXA8VEtUO1RWVDs+OylWICkKLSB2b2lkIDxpbml0PigKLWphdmEudXRpbC5NYXBFbnRyeSRUeXBlCi1qYXZhLnV0aWwuTGlua2VkSGFzaE1hcCkKLQotcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClURTsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgbmV4dCgpCi0KLXB1YmxpYyB2b2lkIHJlbW92ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNCBuYW1lID1MaW5rZWRIYXNoTWFwRW50cnkgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9MaW5rZWRIYXNoTWFwOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEs6TGphdmEvbGFuZy9PYmplY3Q7VjpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvdXRpbC9IYXNoTWFwJEVudHJ5PFRLO1RWOz47ICkKLWZpbmFsIGNsYXNzIGphdmEudXRpbC5MaW5rZWRIYXNoTWFwJExpbmtlZEhhc2hNYXBFbnRyeSBleHRlbmRzIGphdmEudXRpbC5IYXNoTWFwJEVudHJ5Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9MaW5rZWRIYXNoTWFwJExpbmtlZEhhc2hNYXBFbnRyeTxUSztUVjs+OyApCi0gamF2YS51dGlsLkxpbmtlZEhhc2hNYXAkTGlua2VkSGFzaE1hcEVudHJ5IGNoYWluQmFja3dhcmQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0xpbmtlZEhhc2hNYXAkTGlua2VkSGFzaE1hcEVudHJ5PFRLO1RWOz47ICkKLSBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcCRMaW5rZWRIYXNoTWFwRW50cnkgY2hhaW5Gb3J3YXJkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEs7SSlWICkKLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5PYmplY3QKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEs7VFY7KVYgKQotIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgY2xvbmUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS91dGlsL01hcEVudHJ5JFR5cGU8TGphdmEvdXRpbC9NYXAkRW50cnk8VEtUO1RWVDs+O1RLVDtUVlQ7PjsgKQotIGNsYXNzIGphdmEudXRpbC5MaW5rZWRIYXNoTWFwJExpbmtlZEhhc2hNYXBFbnRyeVNldCQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudXRpbC5NYXBFbnRyeSRUeXBlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGphdmEudXRpbC5MaW5rZWRIYXNoTWFwJExpbmtlZEhhc2hNYXBFbnRyeVNldCB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuTGlua2VkSGFzaE1hcCRMaW5rZWRIYXNoTWFwRW50cnlTZXQpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IGdldCgKLWphdmEudXRpbC5NYXBFbnRyeSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9NYXBFbnRyeTxUS1Q7VFZUOz47KUxqYXZhL3V0aWwvTWFwJEVudHJ5PFRLVDtUVlQ7PjsgKQotcHVibGljIGphdmEudXRpbC5NYXAkRW50cnkgZ2V0KAotamF2YS51dGlsLk1hcEVudHJ5KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08S1Q6TGphdmEvbGFuZy9PYmplY3Q7VlQ6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL3V0aWwvSGFzaE1hcCRIYXNoTWFwRW50cnlTZXQ8VEtUO1RWVDs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI0IG5hbWUgPUxpbmtlZEhhc2hNYXBFbnRyeVNldCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL0xpbmtlZEhhc2hNYXA7ICkKLWZpbmFsIGNsYXNzIGphdmEudXRpbC5MaW5rZWRIYXNoTWFwJExpbmtlZEhhc2hNYXBFbnRyeVNldCBleHRlbmRzIGphdmEudXRpbC5IYXNoTWFwJEhhc2hNYXBFbnRyeVNldAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTGlua2VkSGFzaE1hcDxUS1Q7VFZUOz47KVYgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkxpbmtlZEhhc2hNYXApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0l0ZXJhdG9yPExqYXZhL3V0aWwvTWFwJEVudHJ5PFRLVDtUVlQ7Pjs+OyApCi1wdWJsaWMgamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXJhdG9yKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEU6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL3V0aWwvSGFzaFNldDxURTs+O0xqYXZhL3V0aWwvU2V0PFRFOz47TGphdmEvbGFuZy9DbG9uZWFibGU7TGphdmEvaW8vU2VyaWFsaXphYmxlOyApCi1wdWJsaWMgY2xhc3MgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQgZXh0ZW5kcyBqYXZhLnV0aWwuSGFzaFNldCBpbXBsZW1lbnRzIGphdmEudXRpbC5TZXQsIGphdmEubGFuZy5DbG9uZWFibGUsIGphdmEuaW8uU2VyaWFsaXphYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50Ci1mbG9hdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9Db2xsZWN0aW9uPCtURTs+OylWICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEudXRpbC5Db2xsZWN0aW9uKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJRilMamF2YS91dGlsL0hhc2hNYXA8VEU7TGphdmEvdXRpbC9IYXNoU2V0PFRFOz47PjsgKQotIGphdmEudXRpbC5IYXNoTWFwIGNyZWF0ZUJhY2tpbmdNYXAoCi1pbnQKLWZsb2F0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjYgbmFtZSA9TGluayApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEVUOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS9sYW5nL09iamVjdDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9MaW5rZWRMaXN0OyApCi1maW5hbCBjbGFzcyBqYXZhLnV0aWwuTGlua2VkTGlzdCRMaW5rIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPVRFVDsgKQotIGphdmEubGFuZy5PYmplY3QgZGF0YQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvTGlua2VkTGlzdCRMaW5rPFRFVDs+OyApCi0gamF2YS51dGlsLkxpbmtlZExpc3QkTGluayBuZXh0Ci1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9MaW5rZWRMaXN0JExpbms8VEVUOz47ICkKLSBqYXZhLnV0aWwuTGlua2VkTGlzdCRMaW5rIHByZXZpb3VzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEVUO0xqYXZhL3V0aWwvTGlua2VkTGlzdCRMaW5rPFRFVDs+O0xqYXZhL3V0aWwvTGlua2VkTGlzdCRMaW5rPFRFVDs+OylWICkKLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5PYmplY3QKLWphdmEudXRpbC5MaW5rZWRMaXN0JExpbmsKLWphdmEudXRpbC5MaW5rZWRMaXN0JExpbmspCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxFVDpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvdXRpbC9MaXN0SXRlcmF0b3I8VEVUOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjYgbmFtZSA9TGlua0l0ZXJhdG9yICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvTGlua2VkTGlzdDsgKQotZmluYWwgY2xhc3MgamF2YS51dGlsLkxpbmtlZExpc3QkTGlua0l0ZXJhdG9yIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudXRpbC5MaXN0SXRlcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGludCBleHBlY3RlZE1vZENvdW50Ci1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9MaW5rZWRMaXN0JExpbms8VEVUOz47ICkKLSBqYXZhLnV0aWwuTGlua2VkTGlzdCRMaW5rIGxhc3RMaW5rCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9MaW5rZWRMaXN0JExpbms8VEVUOz47ICkKLSBqYXZhLnV0aWwuTGlua2VkTGlzdCRMaW5rIGxpbmsKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0xpbmtlZExpc3Q8VEVUOz47ICkKLWZpbmFsIGphdmEudXRpbC5MaW5rZWRMaXN0IGxpc3QKLQotIGludCBwb3MKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0xpbmtlZExpc3Q8VEVUOz47SSlWICkKLSB2b2lkIDxpbml0PigKLWphdmEudXRpbC5MaW5rZWRMaXN0Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRFVDspViApCi1wdWJsaWMgdm9pZCBhZGQoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkKLQotcHVibGljIGJvb2xlYW4gaGFzUHJldmlvdXMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVEVUOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBuZXh0KCkKLQotcHVibGljIGludCBuZXh0SW5kZXgoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVEVUOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBwcmV2aW91cygpCi0KLXB1YmxpYyBpbnQgcHJldmlvdXNJbmRleCgpCi0KLXB1YmxpYyB2b2lkIHJlbW92ZSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRFVDspViApCi1wdWJsaWMgdm9pZCBzZXQoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGphdmEvdXRpbC9MaW5rZWRMaXN0JExpbmtJdGVyYXRvcjtMamF2YS91dGlsL0xpbmtlZExpc3QkTGluazsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxFOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS91dGlsL0Fic3RyYWN0U2VxdWVudGlhbExpc3Q8VEU7PjtMamF2YS91dGlsL0xpc3Q8VEU7PjtMamF2YS91dGlsL1F1ZXVlPFRFOz47TGphdmEvbGFuZy9DbG9uZWFibGU7TGphdmEvaW8vU2VyaWFsaXphYmxlOyApCi1wdWJsaWMgY2xhc3MgamF2YS51dGlsLkxpbmtlZExpc3QgZXh0ZW5kcyBqYXZhLnV0aWwuQWJzdHJhY3RTZXF1ZW50aWFsTGlzdCBpbXBsZW1lbnRzIGphdmEudXRpbC5MaXN0LCBqYXZhLnV0aWwuUXVldWUsIGphdmEubGFuZy5DbG9uZWFibGUsIGphdmEuaW8uU2VyaWFsaXphYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotCi10cmFuc2llbnQgaW50IHNpemUKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0xpbmtlZExpc3QkTGluazxURTs+OyApCi10cmFuc2llbnQgamF2YS51dGlsLkxpbmtlZExpc3QkTGluayB2b2lkTGluawotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvQ29sbGVjdGlvbjwrVEU7PjspViApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuQ29sbGVjdGlvbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9sYW5nL0NsYXNzTm90Rm91bmRFeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCByZWFkT2JqZWN0KAotamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KAotamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KElURTspViApCi1wdWJsaWMgdm9pZCBhZGQoCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRFOylaICkKLXB1YmxpYyBib29sZWFuIGFkZCgKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KElMamF2YS91dGlsL0NvbGxlY3Rpb248K1RFOz47KVogKQotcHVibGljIGJvb2xlYW4gYWRkQWxsKAotaW50Ci1qYXZhLnV0aWwuQ29sbGVjdGlvbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9Db2xsZWN0aW9uPCtURTs+OylaICkKLXB1YmxpYyBib29sZWFuIGFkZEFsbCgKLWphdmEudXRpbC5Db2xsZWN0aW9uKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShURTspViApCi1wdWJsaWMgdm9pZCBhZGRGaXJzdCgKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRFOylWICkKLXB1YmxpYyB2b2lkIGFkZExhc3QoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgdm9pZCBjbGVhcigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGNsb25lKCkKLQotcHVibGljIGJvb2xlYW4gY29udGFpbnMoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVEU7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGVsZW1lbnQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJKVRFOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXQoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClURTsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0Rmlyc3QoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVEU7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldExhc3QoKQotCi1wdWJsaWMgaW50IGluZGV4T2YoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50IGxhc3RJbmRleE9mKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSSlMamF2YS91dGlsL0xpc3RJdGVyYXRvcjxURTs+OyApCi1wdWJsaWMgamF2YS51dGlsLkxpc3RJdGVyYXRvciBsaXN0SXRlcmF0b3IoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRFOylaICkKLXB1YmxpYyBib29sZWFuIG9mZmVyKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVRFOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBwZWVrKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVRFOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBwb2xsKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVRFOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCByZW1vdmUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJKVRFOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCByZW1vdmUoCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIHJlbW92ZSgKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClURTsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgcmVtb3ZlRmlyc3QoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVEU7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHJlbW92ZUxhc3QoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJVEU7KVRFOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBzZXQoCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBpbnQgc2l6ZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0W10gdG9BcnJheSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFQ6TGphdmEvbGFuZy9PYmplY3Q7PihbVFQ7KVtUVDsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3RbXSB0b0FycmF5KAotamF2YS5sYW5nLk9iamVjdFtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS91dGlsL0VudW1lcmF0aW9uPExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLSBjbGFzcyBqYXZhLnV0aWwuTGlzdFJlc291cmNlQnVuZGxlJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLkVudW1lcmF0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9FbnVtZXJhdGlvbjxMamF2YS9sYW5nL1N0cmluZzs+OyApCi0gamF2YS51dGlsLkVudW1lcmF0aW9uIGxvY2FsCi0KLSBqYXZhLmxhbmcuU3RyaW5nIG5leHRFbGVtZW50Ci1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9FbnVtZXJhdGlvbjxMamF2YS9sYW5nL1N0cmluZzs+OyApCi0gamF2YS51dGlsLkVudW1lcmF0aW9uIHBFbnVtCi0KLWZpbmFsIGphdmEudXRpbC5MaXN0UmVzb3VyY2VCdW5kbGUgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkxpc3RSZXNvdXJjZUJ1bmRsZSkKLQotcHJpdmF0ZSBib29sZWFuIGZpbmROZXh0KCkKLQotcHVibGljIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgbmV4dEVsZW1lbnQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBuZXh0RWxlbWVudCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3NlY3VyaXR5L1ByaXZpbGVnZWRBY3Rpb248TGphdmEvdXRpbC9SZXNvdXJjZUJ1bmRsZTs+OyApCi1maW5hbCBjbGFzcyBqYXZhLnV0aWwuTG9jYWxlJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGphdmEubGFuZy5TdHJpbmcgdmFsJGNsTmFtZQotCi1maW5hbCBqYXZhLnV0aWwuTG9jYWxlIHZhbCRsb2NhbGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnV0aWwuTG9jYWxlKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBydW4oKQotCi1wdWJsaWMgamF2YS51dGlsLlJlc291cmNlQnVuZGxlIHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgamF2YS51dGlsLkxvY2FsZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmxhbmcuQ2xvbmVhYmxlLCBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudXRpbC5Mb2NhbGUgQ0FOQURBCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS51dGlsLkxvY2FsZSBDQU5BREFfRlJFTkNICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS51dGlsLkxvY2FsZSBDSElOQQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudXRpbC5Mb2NhbGUgQ0hJTkVTRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudXRpbC5Mb2NhbGUgRU5HTElTSAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudXRpbC5Mb2NhbGUgRlJBTkNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS51dGlsLkxvY2FsZSBGUkVOQ0gKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuTG9jYWxlIEdFUk1BTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudXRpbC5Mb2NhbGUgR0VSTUFOWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudXRpbC5Mb2NhbGUgSVRBTElBTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudXRpbC5Mb2NhbGUgSVRBTFkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuTG9jYWxlIEpBUEFOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS51dGlsLkxvY2FsZSBKQVBBTkVTRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudXRpbC5Mb2NhbGUgS09SRUEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuTG9jYWxlIEtPUkVBTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudXRpbC5Mb2NhbGUgUFJDCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS51dGlsLkxvY2FsZSBTSU1QTElGSUVEX0NISU5FU0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuTG9jYWxlIFRBSVdBTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudXRpbC5Mb2NhbGUgVFJBRElUSU9OQUxfQ0hJTkVTRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudXRpbC5Mb2NhbGUgVUsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuTG9jYWxlIFVTCi0KLXByaXZhdGUgc3RhdGljIGphdmEudXRpbC5Mb2NhbGVbXSBhdmFpbGFibGVMb2NhbGVzCi0KLXByaXZhdGUgc3RhdGljIGphdmEudXRpbC5Mb2NhbGUgZGVmYXVsdExvY2FsZQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmlvLk9iamVjdFN0cmVhbUZpZWxkW10gc2VyaWFsUGVyc2lzdGVudEZpZWxkcwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiBzZXRMb2NhbGVQZXJtaXNzaW9uCi0KLXByaXZhdGUgdHJhbnNpZW50IGphdmEubGFuZy5TdHJpbmcgY291bnRyeUNvZGUKLQotcHJpdmF0ZSB0cmFuc2llbnQgamF2YS5sYW5nLlN0cmluZyBsYW5ndWFnZUNvZGUKLQotcHJpdmF0ZSB0cmFuc2llbnQgamF2YS5sYW5nLlN0cmluZyB2YXJpYW50Q29kZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXN0YXRpYyBqYXZhLnV0aWwuTG9jYWxlW10gZmluZCgpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLkxvY2FsZVtdIGdldEF2YWlsYWJsZUxvY2FsZXMoKQotCi1zdGF0aWMgamF2YS51dGlsLlJlc291cmNlQnVuZGxlIGdldEJ1bmRsZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudXRpbC5Mb2NhbGUpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLkxvY2FsZSBnZXREZWZhdWx0KCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0SVNPQ291bnRyaWVzKCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0SVNPTGFuZ3VhZ2VzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9sYW5nL0NsYXNzTm90Rm91bmRFeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCByZWFkT2JqZWN0KAotamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSkKLQotcHVibGljIHN0YXRpYyB2b2lkIHNldERlZmF1bHQoCi1qYXZhLnV0aWwuTG9jYWxlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoCi1qYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgY2xvbmUoKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRDb3VudHJ5KCkKLQotcHVibGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgZ2V0RGlzcGxheUNvdW50cnkoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXREaXNwbGF5Q291bnRyeSgKLWphdmEudXRpbC5Mb2NhbGUpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGdldERpc3BsYXlMYW5ndWFnZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldERpc3BsYXlMYW5ndWFnZSgKLWphdmEudXRpbC5Mb2NhbGUpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGdldERpc3BsYXlOYW1lKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RGlzcGxheU5hbWUoCi1qYXZhLnV0aWwuTG9jYWxlKQotCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBnZXREaXNwbGF5VmFyaWFudCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldERpc3BsYXlWYXJpYW50KAotamF2YS51dGlsLkxvY2FsZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS91dGlsL01pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SVNPM0NvdW50cnkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3V0aWwvTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJU08zTGFuZ3VhZ2UoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRMYW5ndWFnZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFZhcmlhbnQoKQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLQotcHVibGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvTWluaUVudW1TZXQ7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9NDEwNCBuYW1lID1udWxsICkKLSBjbGFzcyBqYXZhLnV0aWwuTWluaUVudW1TZXQkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MiBuYW1lID1NaW5pRW51bVNldEl0ZXJhdG9yICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS91dGlsL0l0ZXJhdG9yPFRFOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvTWluaUVudW1TZXQ7ICkKLSBjbGFzcyBqYXZhLnV0aWwuTWluaUVudW1TZXQkTWluaUVudW1TZXRJdGVyYXRvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuSXRlcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBib29sZWFuIGNhblByb2Nlc3MKLQotcHJpdmF0ZSBsb25nIGN1cnJlbnRFbGVtZW50TWFzawotCi1maW5hbCBqYXZhLnV0aWwuTWluaUVudW1TZXQgdGhpcyQwCi0KLXByaXZhdGUgbG9uZyB1blByb2Nlc3NlZEJpdHMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLk1pbmlFbnVtU2V0KQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuTWluaUVudW1TZXQKLWphdmEudXRpbC5NaW5pRW51bVNldCQxKQotCi1wdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVRFOyApCi1wdWJsaWMgamF2YS5sYW5nLkVudW0gbmV4dCgpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IG5leHQoKQotCi1wdWJsaWMgdm9pZCByZW1vdmUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGphdmEvdXRpbC9NaW5pRW51bVNldCQxO0xqYXZhL3V0aWwvTWluaUVudW1TZXQkTWluaUVudW1TZXRJdGVyYXRvcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxFOkxqYXZhL2xhbmcvRW51bTxURTs+Oz5MamF2YS91dGlsL0VudW1TZXQ8VEU7PjsgKQotZmluYWwgY2xhc3MgamF2YS51dGlsLk1pbmlFbnVtU2V0IGV4dGVuZHMgamF2YS51dGlsLkVudW1TZXQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9FTEVNRU5UUwotCi1wcml2YXRlIGxvbmcgYml0cwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPVtURTsgKQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuRW51bVtdIGVudW1zCi0KLXByaXZhdGUgaW50IHNpemUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL0NsYXNzPFRFOz47W1RFOylWICkKLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5DbGFzcwotamF2YS5sYW5nLkVudW1bXSkKLQotc3RhdGljIGxvbmcgYWNjZXNzJDAwMCgKLWphdmEudXRpbC5NaW5pRW51bVNldCkKLQotc3RhdGljIGxvbmcgYWNjZXNzJDA3NCgKLWphdmEudXRpbC5NaW5pRW51bVNldAotbG9uZykKLQotc3RhdGljIGphdmEubGFuZy5FbnVtW10gYWNjZXNzJDEwMCgKLWphdmEudXRpbC5NaW5pRW51bVNldCkKLQotc3RhdGljIGludCBhY2Nlc3MkMjAyKAotamF2YS51dGlsLk1pbmlFbnVtU2V0Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRFOylaICkKLXB1YmxpYyBib29sZWFuIGFkZCgKLWphdmEubGFuZy5FbnVtKQotCi1wdWJsaWMgdm9sYXRpbGUgYm9vbGVhbiBhZGQoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0NvbGxlY3Rpb248K1RFOz47KVogKQotcHVibGljIGJvb2xlYW4gYWRkQWxsKAotamF2YS51dGlsLkNvbGxlY3Rpb24pCi0KLXB1YmxpYyB2b2lkIGNsZWFyKCkKLQotIHZvaWQgY29tcGxlbWVudCgpCi0KLXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9Db2xsZWN0aW9uPCo+OylaICkKLXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKAotamF2YS51dGlsLkNvbGxlY3Rpb24pCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0l0ZXJhdG9yPFRFOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuSXRlcmF0b3IgaXRlcmF0b3IoKQotCi1wdWJsaWMgYm9vbGVhbiByZW1vdmUoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0NvbGxlY3Rpb248Kj47KVogKQotcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKAotamF2YS51dGlsLkNvbGxlY3Rpb24pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvQ29sbGVjdGlvbjwqPjspWiApCi1wdWJsaWMgYm9vbGVhbiByZXRhaW5BbGwoCi1qYXZhLnV0aWwuQ29sbGVjdGlvbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEU7VEU7KVYgKQotIHZvaWQgc2V0UmFuZ2UoCi1qYXZhLmxhbmcuRW51bQotamF2YS5sYW5nLkVudW0pCi0KLXB1YmxpYyBpbnQgc2l6ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS51dGlsLk1pc3NpbmdGb3JtYXRBcmd1bWVudEV4Y2VwdGlvbiBleHRlbmRzIGphdmEudXRpbC5JbGxlZ2FsRm9ybWF0RXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEZvcm1hdFNwZWNpZmllcigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE1lc3NhZ2UoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEudXRpbC5NaXNzaW5nRm9ybWF0V2lkdGhFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLnV0aWwuSWxsZWdhbEZvcm1hdEV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRGb3JtYXRTcGVjaWZpZXIoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRNZXNzYWdlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0KLSBqYXZhLmxhbmcuU3RyaW5nIGNsYXNzTmFtZQotCi0gamF2YS5sYW5nLlN0cmluZyBrZXkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRDbGFzc05hbWUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRLZXkoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEudXRpbC5PYnNlcnZhYmxlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gYm9vbGVhbiBjaGFuZ2VkCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9WZWN0b3I8TGphdmEvdXRpbC9PYnNlcnZlcjs+OyApCi0gamF2YS51dGlsLlZlY3RvciBvYnNlcnZlcnMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCBhZGRPYnNlcnZlcigKLWphdmEudXRpbC5PYnNlcnZlcikKLQotcHJvdGVjdGVkIHZvaWQgY2xlYXJDaGFuZ2VkKCkKLQotcHVibGljIGludCBjb3VudE9ic2VydmVycygpCi0KLXB1YmxpYyB2b2lkIGRlbGV0ZU9ic2VydmVyKAotamF2YS51dGlsLk9ic2VydmVyKQotCi1wdWJsaWMgdm9pZCBkZWxldGVPYnNlcnZlcnMoKQotCi1wdWJsaWMgYm9vbGVhbiBoYXNDaGFuZ2VkKCkKLQotcHVibGljIHZvaWQgbm90aWZ5T2JzZXJ2ZXJzKCkKLQotcHVibGljIHZvaWQgbm90aWZ5T2JzZXJ2ZXJzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHJvdGVjdGVkIHZvaWQgc2V0Q2hhbmdlZCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEudXRpbC5PYnNlcnZlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB1cGRhdGUoCi1qYXZhLnV0aWwuT2JzZXJ2YWJsZQotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTQxMDQgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL1ByaW9yaXR5UXVldWU7ICkKLSBjbGFzcyBqYXZhLnV0aWwuUHJpb3JpdHlRdWV1ZSQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPVByaW9yaXR5SXRlcmF0b3IgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9Qcmlvcml0eVF1ZXVlOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvdXRpbC9JdGVyYXRvcjxURTs+OyApCi0gY2xhc3MgamF2YS51dGlsLlByaW9yaXR5UXVldWUkUHJpb3JpdHlJdGVyYXRvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuSXRlcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBib29sZWFuIGFsbG93UmVtb3ZlCi0KLXByaXZhdGUgaW50IGN1cnJlbnRJbmRleAotCi1maW5hbCBqYXZhLnV0aWwuUHJpb3JpdHlRdWV1ZSB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLlByaW9yaXR5UXVldWUpCi0KLSB2b2lkIDxpbml0PigKLWphdmEudXRpbC5Qcmlvcml0eVF1ZXVlCi1qYXZhLnV0aWwuUHJpb3JpdHlRdWV1ZSQxKQotCi1wdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVRFOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBuZXh0KCkKLQotcHVibGljIHZvaWQgcmVtb3ZlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEU6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL3V0aWwvQWJzdHJhY3RRdWV1ZTxURTs+O0xqYXZhL2lvL1NlcmlhbGl6YWJsZTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MamF2YS91dGlsL1ByaW9yaXR5UXVldWUkMTtMamF2YS91dGlsL1ByaW9yaXR5UXVldWUkUHJpb3JpdHlJdGVyYXRvcjsgKQotcHVibGljIGNsYXNzIGphdmEudXRpbC5Qcmlvcml0eVF1ZXVlIGV4dGVuZHMgamF2YS51dGlsLkFic3RyYWN0UXVldWUgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9DQVBBQ0lUWQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9DQVBBQ0lUWV9SQVRJTwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUgREVGQVVMVF9JTklUX0NBUEFDSVRZX1JBVElPCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQ29tcGFyYXRvcjwtVEU7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuQ29tcGFyYXRvciBjb21wYXJhdG9yCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9W1RFOyApCi1wcml2YXRlIHRyYW5zaWVudCBqYXZhLmxhbmcuT2JqZWN0W10gZWxlbWVudHMKLQotcHJpdmF0ZSBpbnQgc2l6ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSUxqYXZhL3V0aWwvQ29tcGFyYXRvcjwtVEU7PjspViApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWphdmEudXRpbC5Db21wYXJhdG9yKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0NvbGxlY3Rpb248K1RFOz47KVYgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkNvbGxlY3Rpb24pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvUHJpb3JpdHlRdWV1ZTwrVEU7PjspViApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuUHJpb3JpdHlRdWV1ZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9Tb3J0ZWRTZXQ8K1RFOz47KVYgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLlNvcnRlZFNldCkKLQotc3RhdGljIGludCBhY2Nlc3MkMTAwKAotamF2YS51dGlsLlByaW9yaXR5UXVldWUpCi0KLXN0YXRpYyBqYXZhLmxhbmcuT2JqZWN0W10gYWNjZXNzJDIwMCgKLWphdmEudXRpbC5Qcmlvcml0eVF1ZXVlKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMzAwKAotamF2YS51dGlsLlByaW9yaXR5UXVldWUKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEU7VEU7KUkgKQotcHJpdmF0ZSBpbnQgY29tcGFyZSgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvUHJpb3JpdHlRdWV1ZTwrVEU7PjspViApCi1wcml2YXRlIHZvaWQgZ2V0RnJvbVByaW9yaXR5UXVldWUoCi1qYXZhLnV0aWwuUHJpb3JpdHlRdWV1ZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9Tb3J0ZWRTZXQ8K1RFOz47KVYgKQotcHJpdmF0ZSB2b2lkIGdldEZyb21Tb3J0ZWRTZXQoCi1qYXZhLnV0aWwuU29ydGVkU2V0KQotCi1wcml2YXRlIHZvaWQgZ3Jvd1RvU2l6ZSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9Db2xsZWN0aW9uPCtURTs+OylWICkKLXByaXZhdGUgdm9pZCBpbml0U2l6ZSgKLWphdmEudXRpbC5Db2xsZWN0aW9uKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJKVtURTsgKQotcHJpdmF0ZSBqYXZhLmxhbmcuT2JqZWN0W10gbmV3RWxlbWVudEFycmF5KAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL2xhbmcvQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoCi1qYXZhLmlvLk9iamVjdElucHV0U3RyZWFtKQotCi1wcml2YXRlIHZvaWQgcmVtb3ZlQXQoCi1pbnQpCi0KLXByaXZhdGUgdm9pZCBzaWZ0RG93bigKLWludCkKLQotcHJpdmF0ZSB2b2lkIHNpZnRVcCgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KAotamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRFOylaICkKLXB1YmxpYyBib29sZWFuIGFkZCgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2lkIGNsZWFyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvQ29tcGFyYXRvcjwtVEU7PjsgKQotcHVibGljIGphdmEudXRpbC5Db21wYXJhdG9yIGNvbXBhcmF0b3IoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9JdGVyYXRvcjxURTs+OyApCi1wdWJsaWMgamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXJhdG9yKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEU7KVogKQotcHVibGljIGJvb2xlYW4gb2ZmZXIoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVEU7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHBlZWsoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVEU7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHBvbGwoKQotCi1wdWJsaWMgYm9vbGVhbiByZW1vdmUoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50IHNpemUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBlcnJvcigKLW9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGZhdGFsRXJyb3IoCi1vcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB3YXJuaW5nKAotb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb24pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotIGNsYXNzIGphdmEudXRpbC5Qcm9wZXJ0aWVzJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGphdmEudXRpbC5Qcm9wZXJ0aWVzIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEudXRpbC5Qcm9wZXJ0aWVzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGVycm9yKAotb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb24pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgZmF0YWxFcnJvcigKLW9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHdhcm5pbmcoCi1vcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotIGNsYXNzIGphdmEudXRpbC5Qcm9wZXJ0aWVzJDIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgamF2YS51dGlsLlByb3BlcnRpZXMgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLlByb3BlcnRpZXMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIG9yZy54bWwuc2F4LklucHV0U291cmNlIHJlc29sdmVFbnRpdHkoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gZXh0ZW5kcyBqYXZhLnNlY3VyaXR5LkJhc2ljUGVybWlzc2lvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmlvLk9iamVjdFN0cmVhbUZpZWxkW10gc2VyaWFsUGVyc2lzdGVudEZpZWxkcwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSB0cmFuc2llbnQgYm9vbGVhbiByZWFkCi0KLXByaXZhdGUgdHJhbnNpZW50IGJvb2xlYW4gd3JpdGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgdm9pZCBkZWNvZGVBY3Rpb25zKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9sYW5nL0NsYXNzTm90Rm91bmRFeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCByZWFkT2JqZWN0KAotamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KAotamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0pCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEFjdGlvbnMoKQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLQotcHVibGljIGJvb2xlYW4gaW1wbGllcygKLWphdmEuc2VjdXJpdHkuUGVybWlzc2lvbikKLQotcHVibGljIGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbkNvbGxlY3Rpb24gbmV3UGVybWlzc2lvbkNvbGxlY3Rpb24oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotIGNsYXNzIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb25Db2xsZWN0aW9uIGV4dGVuZHMgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uQ29sbGVjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmlvLk9iamVjdFN0cmVhbUZpZWxkW10gc2VyaWFsUGVyc2lzdGVudEZpZWxkcwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0hhc2h0YWJsZTxMamF2YS9sYW5nL1N0cmluZztMamF2YS9zZWN1cml0eS9QZXJtaXNzaW9uOz47ICkKLSBqYXZhLnV0aWwuSGFzaHRhYmxlIHBlcm1pc3Npb25zCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi0gdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL2xhbmcvQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoCi1qYXZhLmlvLk9iamVjdElucHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoCi1qYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSkKLQotcHVibGljIHZvaWQgYWRkKAotamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9FbnVtZXJhdGlvbjxMamF2YS9zZWN1cml0eS9QZXJtaXNzaW9uOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuRW51bWVyYXRpb24gZWxlbWVudHMoKQotCi1wdWJsaWMgYm9vbGVhbiBpbXBsaWVzKAotamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS91dGlsL0VudW1lcmF0aW9uPExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLSBjbGFzcyBqYXZhLnV0aWwuUHJvcGVydHlSZXNvdXJjZUJ1bmRsZSQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudXRpbC5FbnVtZXJhdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvRW51bWVyYXRpb248TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotIGphdmEudXRpbC5FbnVtZXJhdGlvbiBsb2NhbAotCi0gamF2YS5sYW5nLlN0cmluZyBuZXh0RWxlbWVudAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvRW51bWVyYXRpb248TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotIGphdmEudXRpbC5FbnVtZXJhdGlvbiBwRW51bQotCi1maW5hbCBqYXZhLnV0aWwuUHJvcGVydHlSZXNvdXJjZUJ1bmRsZSB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuUHJvcGVydHlSZXNvdXJjZUJ1bmRsZSkKLQotcHJpdmF0ZSBib29sZWFuIGZpbmROZXh0KCkKLQotcHVibGljIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgbmV4dEVsZW1lbnQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBuZXh0RWxlbWVudCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS51dGlsLlByb3BlcnR5UmVzb3VyY2VCdW5kbGUgZXh0ZW5kcyBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGphdmEudXRpbC5Qcm9wZXJ0aWVzIHJlc291cmNlcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uSW5wdXRTdHJlYW0pCi0KLXN0YXRpYyBqYXZhLnV0aWwuRW51bWVyYXRpb24gYWNjZXNzJDAwMCgKLWphdmEudXRpbC5Qcm9wZXJ0eVJlc291cmNlQnVuZGxlKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9FbnVtZXJhdGlvbjxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wcml2YXRlIGphdmEudXRpbC5FbnVtZXJhdGlvbiBnZXRMb2NhbEtleXMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9FbnVtZXJhdGlvbjxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wdWJsaWMgamF2YS51dGlsLkVudW1lcmF0aW9uIGdldEtleXMoKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBoYW5kbGVHZXRPYmplY3QoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS9zZWN1cml0eS9Qcml2aWxlZ2VkQWN0aW9uPExqYXZhL2lvL0lucHV0U3RyZWFtOz47ICkKLWZpbmFsIGNsYXNzIGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZSQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBqYXZhLmxhbmcuU3RyaW5nIHZhbCRmaWxlTmFtZQotCi1maW5hbCBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIgdmFsJGxvYWRlcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5DbGFzc0xvYWRlcgotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEuaW8uSW5wdXRTdHJlYW0gcnVuKCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL1Jlc291cmNlQnVuZGxlOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9TWlzc2luZ0J1bmRsZSApCi0gY2xhc3MgamF2YS51dGlsLlJlc291cmNlQnVuZGxlJE1pc3NpbmdCdW5kbGUgZXh0ZW5kcyBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9FbnVtZXJhdGlvbjxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wdWJsaWMgamF2YS51dGlsLkVudW1lcmF0aW9uIGdldEtleXMoKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBoYW5kbGVHZXRPYmplY3QoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL0VudW08TGphdmEvdXRpbC9TY2FubmVyJERhdGFUeXBlOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTY0MTAgbmFtZSA9RGF0YVR5cGUgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9TY2FubmVyOyApCi1maW5hbCBjbGFzcyBqYXZhLnV0aWwuU2Nhbm5lciREYXRhVHlwZSBleHRlbmRzIGphdmEubGFuZy5FbnVtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEudXRpbC5TY2FubmVyJERhdGFUeXBlW10gJFZBTFVFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudXRpbC5TY2FubmVyJERhdGFUeXBlIEZMT0FUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS51dGlsLlNjYW5uZXIkRGF0YVR5cGUgSU5UCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpViApCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5TY2FubmVyJERhdGFUeXBlIHZhbHVlT2YoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5TY2FubmVyJERhdGFUeXBlW10gdmFsdWVzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxqYXZhL3V0aWwvU2Nhbm5lciREYXRhVHlwZTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3V0aWwvSXRlcmF0b3I8TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHVibGljIGZpbmFsIGNsYXNzIGphdmEudXRpbC5TY2FubmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudXRpbC5JdGVyYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwucmVnZXguUGF0dGVybiBBTllfUEFUVEVSTgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwucmVnZXguUGF0dGVybiBCT09MRUFOX1BBVFRFUk4KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4gREVGQVVMVF9ERUxJTUlURVIKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfUkFESVgKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfVFJVTktfU0laRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElQTE9JRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwucmVnZXguUGF0dGVybiBMSU5FX1BBVFRFUk4KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4gTElORV9URVJNSU5BVE9SCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEudXRpbC5yZWdleC5QYXR0ZXJuIE1VTFRJX0xJTkVfVEVSTUlOQVRPUgotCi1wcml2YXRlIGphdmEubmlvLkNoYXJCdWZmZXIgYnVmZmVyCi0KLXByaXZhdGUgaW50IGJ1ZmZlckxlbmd0aAotCi1wcml2YXRlIGphdmEubGFuZy5PYmplY3QgY2FjaGVIYXNOZXh0VmFsdWUKLQotcHJpdmF0ZSBpbnQgY2FjaGVoYXNOZXh0SW5kZXgKLQotcHJpdmF0ZSBib29sZWFuIGNsb3NlZAotCi1wcml2YXRlIGphdmEudGV4dC5EZWNpbWFsRm9ybWF0IGRlY2ltYWxGb3JtYXQKLQotcHJpdmF0ZSBqYXZhLnV0aWwucmVnZXguUGF0dGVybiBkZWxpbWl0ZXIKLQotcHJpdmF0ZSBpbnQgZmluZFN0YXJ0SW5kZXgKLQotcHJpdmF0ZSBqYXZhLmxhbmcuUmVhZGFibGUgaW5wdXQKLQotcHJpdmF0ZSBib29sZWFuIGlucHV0RXhoYXVzdGVkCi0KLXByaXZhdGUgaW50IGludGVnZXJSYWRpeAotCi1wcml2YXRlIGphdmEuaW8uSU9FeGNlcHRpb24gbGFzdElPRXhjZXB0aW9uCi0KLXByaXZhdGUgamF2YS51dGlsLkxvY2FsZSBsb2NhbGUKLQotcHJpdmF0ZSBib29sZWFuIG1hdGNoU3VjY2Vzc2Z1bAotCi1wcml2YXRlIGphdmEudXRpbC5yZWdleC5NYXRjaGVyIG1hdGNoZXIKLQotcHJpdmF0ZSBpbnQgcHJlU3RhcnRJbmRleAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9GaWxlTm90Rm91bmRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uRmlsZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9GaWxlTm90Rm91bmRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uRmlsZQotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5JbnB1dFN0cmVhbSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5JbnB1dFN0cmVhbQotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlJlYWRhYmxlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLm5pby5jaGFubmVscy5SZWFkYWJsZUJ5dGVDaGFubmVsKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLm5pby5jaGFubmVscy5SZWFkYWJsZUJ5dGVDaGFubmVsCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmdCdWlsZGVyIGFkZE5lZ2F0aXZlU2lnbigKLWphdmEubGFuZy5TdHJpbmdCdWlsZGVyKQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmdCdWlsZGVyIGFkZFBvc2l0aXZlU2lnbigKLWphdmEubGFuZy5TdHJpbmdCdWlsZGVyKQotCi1wcml2YXRlIHZvaWQgY2hlY2tDbG9zZWQoKQotCi1wcml2YXRlIHZvaWQgY2hlY2tOdWxsKAotamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4pCi0KLXByaXZhdGUgdm9pZCBleHBhbmRCdWZmZXIoKQotCi1wcml2YXRlIGludCBmaW5kUG9zdERlbGltaXRlcigpCi0KLXByaXZhdGUgaW50IGZpbmRQcmVEZWxpbWl0ZXIoKQotCi1wcml2YXRlIGphdmEudXRpbC5yZWdleC5QYXR0ZXJuIGdldEZsb2F0UGF0dGVybigpCi0KLXByaXZhdGUgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4gZ2V0SW50ZWdlclBhdHRlcm4oCi1pbnQpCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIgZ2V0TnVtZXJhbCgKLWphdmEubGFuZy5TdHJpbmdCdWlsZGVyCi1qYXZhLmxhbmcuU3RyaW5nQnVpbGRlcikKLQotcHJpdmF0ZSB2b2lkIGluaXRpYWxpemF0aW9uKCkKLQotcHJpdmF0ZSB2b2lkIHJlYWRNb3JlKCkKLQotcHJpdmF0ZSB2b2lkIHJlY292ZXJQcmV2aW91c1N0YXR1cygpCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZW1vdmVMb2NhbGVJbmZvKAotamF2YS5sYW5nLlN0cmluZwotamF2YS51dGlsLlNjYW5uZXIkRGF0YVR5cGUpCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZW1vdmVMb2NhbGVJbmZvRnJvbUZsb2F0KAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBib29sZWFuIHJlbW92ZUxvY2FsZVNpZ24oCi1qYXZhLmxhbmcuU3RyaW5nQnVpbGRlcikKLQotcHJpdmF0ZSB2b2lkIHJlc2V0TWF0Y2hlcigpCi0KLXByaXZhdGUgdm9pZCBzYXZlQ3VycmVudFN0YXR1cygpCi0KLXByaXZhdGUgYm9vbGVhbiBzZXRIZWFkVG9rZW5SZWdpb24oCi1pbnQpCi0KLXByaXZhdGUgYm9vbGVhbiBzZXRUb2tlblJlZ2lvbigpCi0KLXB1YmxpYyB2b2lkIGNsb3NlKCkKLQotcHVibGljIGphdmEudXRpbC5yZWdleC5QYXR0ZXJuIGRlbGltaXRlcigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGZpbmRJbkxpbmUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBmaW5kSW5MaW5lKAotamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4pCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGZpbmRXaXRoaW5Ib3Jpem9uKAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBmaW5kV2l0aGluSG9yaXpvbigKLWphdmEudXRpbC5yZWdleC5QYXR0ZXJuCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIGhhc05leHQoKQotCi1wdWJsaWMgYm9vbGVhbiBoYXNOZXh0KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJvb2xlYW4gaGFzTmV4dCgKLWphdmEudXRpbC5yZWdleC5QYXR0ZXJuKQotCi1wdWJsaWMgYm9vbGVhbiBoYXNOZXh0QmlnRGVjaW1hbCgpCi0KLXB1YmxpYyBib29sZWFuIGhhc05leHRCaWdJbnRlZ2VyKCkKLQotcHVibGljIGJvb2xlYW4gaGFzTmV4dEJpZ0ludGVnZXIoCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIGhhc05leHRCb29sZWFuKCkKLQotcHVibGljIGJvb2xlYW4gaGFzTmV4dEJ5dGUoKQotCi1wdWJsaWMgYm9vbGVhbiBoYXNOZXh0Qnl0ZSgKLWludCkKLQotcHVibGljIGJvb2xlYW4gaGFzTmV4dERvdWJsZSgpCi0KLXB1YmxpYyBib29sZWFuIGhhc05leHRGbG9hdCgpCi0KLXB1YmxpYyBib29sZWFuIGhhc05leHRJbnQoKQotCi1wdWJsaWMgYm9vbGVhbiBoYXNOZXh0SW50KAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBoYXNOZXh0TGluZSgpCi0KLXB1YmxpYyBib29sZWFuIGhhc05leHRMb25nKCkKLQotcHVibGljIGJvb2xlYW4gaGFzTmV4dExvbmcoCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIGhhc05leHRTaG9ydCgpCi0KLXB1YmxpYyBib29sZWFuIGhhc05leHRTaG9ydCgKLWludCkKLQotcHVibGljIGphdmEuaW8uSU9FeGNlcHRpb24gaW9FeGNlcHRpb24oKQotCi1wdWJsaWMgamF2YS51dGlsLkxvY2FsZSBsb2NhbGUoKQotCi1wdWJsaWMgamF2YS51dGlsLnJlZ2V4Lk1hdGNoUmVzdWx0IG1hdGNoKCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgbmV4dCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIG5leHQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBuZXh0KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgbmV4dCgKLWphdmEudXRpbC5yZWdleC5QYXR0ZXJuKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0RlY2ltYWwgbmV4dEJpZ0RlY2ltYWwoKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgbmV4dEJpZ0ludGVnZXIoKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgbmV4dEJpZ0ludGVnZXIoCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIG5leHRCb29sZWFuKCkKLQotcHVibGljIGJ5dGUgbmV4dEJ5dGUoKQotCi1wdWJsaWMgYnl0ZSBuZXh0Qnl0ZSgKLWludCkKLQotcHVibGljIGRvdWJsZSBuZXh0RG91YmxlKCkKLQotcHVibGljIGZsb2F0IG5leHRGbG9hdCgpCi0KLXB1YmxpYyBpbnQgbmV4dEludCgpCi0KLXB1YmxpYyBpbnQgbmV4dEludCgKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgbmV4dExpbmUoKQotCi1wdWJsaWMgbG9uZyBuZXh0TG9uZygpCi0KLXB1YmxpYyBsb25nIG5leHRMb25nKAotaW50KQotCi1wdWJsaWMgc2hvcnQgbmV4dFNob3J0KCkKLQotcHVibGljIHNob3J0IG5leHRTaG9ydCgKLWludCkKLQotcHVibGljIGludCByYWRpeCgpCi0KLXB1YmxpYyB2b2lkIHJlbW92ZSgpCi0KLXB1YmxpYyBqYXZhLnV0aWwuU2Nhbm5lciBza2lwKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEudXRpbC5TY2FubmVyIHNraXAoCi1qYXZhLnV0aWwucmVnZXguUGF0dGVybikKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1wdWJsaWMgamF2YS51dGlsLlNjYW5uZXIgdXNlRGVsaW1pdGVyKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEudXRpbC5TY2FubmVyIHVzZURlbGltaXRlcigKLWphdmEudXRpbC5yZWdleC5QYXR0ZXJuKQotCi1wdWJsaWMgamF2YS51dGlsLlNjYW5uZXIgdXNlTG9jYWxlKAotamF2YS51dGlsLkxvY2FsZSkKLQotcHVibGljIGphdmEudXRpbC5TY2FubmVyIHVzZVJhZGl4KAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGphdmEudXRpbC5UaW1lWm9uZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgamF2YS5sYW5nLkNsb25lYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuVGltZVpvbmUgRGVmYXVsdAotCi1zdGF0aWMgamF2YS51dGlsLlRpbWVab25lIEdNVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT05HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIT1JUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgdm9pZCBhcHBlbmROdW1iZXIoCi1qYXZhLmxhbmcuU3RyaW5nQnVmZmVyCi1pbnQKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBmb3JtYXRUaW1lWm9uZU5hbWUoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZ1tdIGdldEF2YWlsYWJsZUlEcygpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZ1tdIGdldEF2YWlsYWJsZUlEcygKLWludCkKLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVGltZVpvbmUgZ2V0RGVmYXVsdCgpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlRpbWVab25lIGdldFRpbWVab25lKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBzdGF0aWMgaW50IHBhcnNlTnVtYmVyKAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnRbXSkKLQotcHVibGljIHN0YXRpYyB2b2lkIHNldERlZmF1bHQoCi1qYXZhLnV0aWwuVGltZVpvbmUpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGNsb25lKCkKLQotcHVibGljIGludCBnZXREU1RTYXZpbmdzKCkKLQotcHVibGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgZ2V0RGlzcGxheU5hbWUoKQotCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBnZXREaXNwbGF5TmFtZSgKLWphdmEudXRpbC5Mb2NhbGUpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGdldERpc3BsYXlOYW1lKAotYm9vbGVhbgotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXREaXNwbGF5TmFtZSgKLWJvb2xlYW4KLWludAotamF2YS51dGlsLkxvY2FsZSkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SUQoKQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldE9mZnNldCgKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0T2Zmc2V0KAotbG9uZykKLQotcHVibGljIGFic3RyYWN0IGludCBnZXRSYXdPZmZzZXQoKQotCi1wdWJsaWMgYm9vbGVhbiBoYXNTYW1lUnVsZXMoCi1qYXZhLnV0aWwuVGltZVpvbmUpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGluRGF5bGlnaHRUaW1lKAotamF2YS51dGlsLkRhdGUpCi0KLXB1YmxpYyB2b2lkIHNldElEKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0UmF3T2Zmc2V0KAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiB1c2VEYXlsaWdodFRpbWUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEudXRpbC5TaW1wbGVUaW1lWm9uZSBleHRlbmRzIGphdmEudXRpbC5UaW1lWm9uZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRE9NX01PREUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERPV19HRV9ET01fTU9ERQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRE9XX0lOX01PTlRIX01PREUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERPV19MRV9ET01fTU9ERQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFOREFSRF9USU1FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVUQ19USU1FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBTExfVElNRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmlvLk9iamVjdFN0cmVhbUZpZWxkW10gc2VyaWFsUGVyc2lzdGVudEZpZWxkcwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXIgZGF5bGlnaHRTYXZpbmdzCi0KLXByaXZhdGUgaW50IGRzdFNhdmluZ3MKLQotcHJpdmF0ZSBpbnQgZW5kRGF5Ci0KLXByaXZhdGUgaW50IGVuZERheU9mV2VlawotCi1wcml2YXRlIGludCBlbmRNb2RlCi0KLXByaXZhdGUgaW50IGVuZE1vbnRoCi0KLXByaXZhdGUgaW50IGVuZFRpbWUKLQotcHJpdmF0ZSBpbnQgcmF3T2Zmc2V0Ci0KLXByaXZhdGUgaW50IHN0YXJ0RGF5Ci0KLXByaXZhdGUgaW50IHN0YXJ0RGF5T2ZXZWVrCi0KLXByaXZhdGUgaW50IHN0YXJ0TW9kZQotCi1wcml2YXRlIGludCBzdGFydE1vbnRoCi0KLXByaXZhdGUgaW50IHN0YXJ0VGltZQotCi1wcml2YXRlIGludCBzdGFydFllYXIKLQotcHJpdmF0ZSBib29sZWFuIHVzZURheWxpZ2h0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludCkKLQotcHJpdmF0ZSB2b2lkIGNoZWNrRGF5KAotaW50Ci1pbnQpCi0KLXByaXZhdGUgdm9pZCBjaGVja1JhbmdlKAotaW50Ci1pbnQKLWludCkKLQotcHJpdmF0ZSBib29sZWFuIGlzTGVhcFllYXIoCi1pbnQpCi0KLXByaXZhdGUgaW50IG1vZDcoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgcmVhZE9iamVjdCgKLWphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0pCi0KLXByaXZhdGUgdm9pZCBzZXRFbmRNb2RlKCkKLQotcHJpdmF0ZSB2b2lkIHNldFN0YXJ0TW9kZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCB3cml0ZU9iamVjdCgKLWphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBjbG9uZSgpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBpbnQgZ2V0RFNUU2F2aW5ncygpCi0KLXB1YmxpYyBpbnQgZ2V0T2Zmc2V0KAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIGludCBnZXRPZmZzZXQoCi1sb25nKQotCi1wdWJsaWMgaW50IGdldFJhd09mZnNldCgpCi0KLXB1YmxpYyBib29sZWFuIGhhc1NhbWVSdWxlcygKLWphdmEudXRpbC5UaW1lWm9uZSkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLXB1YmxpYyBib29sZWFuIGluRGF5bGlnaHRUaW1lKAotamF2YS51dGlsLkRhdGUpCi0KLXB1YmxpYyB2b2lkIHNldERTVFNhdmluZ3MoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldEVuZFJ1bGUoCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRFbmRSdWxlKAotaW50Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRFbmRSdWxlKAotaW50Ci1pbnQKLWludAotaW50Ci1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRSYXdPZmZzZXQoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldFN0YXJ0UnVsZSgKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldFN0YXJ0UnVsZSgKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHZvaWQgc2V0U3RhcnRSdWxlKAotaW50Ci1pbnQKLWludAotaW50Ci1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRTdGFydFllYXIoCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotcHVibGljIGJvb2xlYW4gdXNlRGF5bGlnaHRUaW1lKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLWZpbmFsIGNsYXNzIGphdmEudXRpbC5TcGVjaWFsQWNjZXNzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255Lmtlcm5lbC52bS5MYW5nQWNjZXNzIExBTkcKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLSB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxFOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS91dGlsL0Fic3RyYWN0TGlzdDxURTs+O0xqYXZhL3V0aWwvTGlzdDxURTs+O0xqYXZhL3V0aWwvUmFuZG9tQWNjZXNzO0xqYXZhL2xhbmcvQ2xvbmVhYmxlO0xqYXZhL2lvL1NlcmlhbGl6YWJsZTsgKQotcHVibGljIGNsYXNzIGphdmEudXRpbC5WZWN0b3IgZXh0ZW5kcyBqYXZhLnV0aWwuQWJzdHJhY3RMaXN0IGltcGxlbWVudHMgamF2YS51dGlsLkxpc3QsIGphdmEudXRpbC5SYW5kb21BY2Nlc3MsIGphdmEubGFuZy5DbG9uZWFibGUsIGphdmEuaW8uU2VyaWFsaXphYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBmaW5hbCBib29sZWFuICRhc3NlcnRpb25zRGlzYWJsZWQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfU0laRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJvdGVjdGVkIGludCBjYXBhY2l0eUluY3JlbWVudAotCi1wcm90ZWN0ZWQgaW50IGVsZW1lbnRDb3VudAotCi1wcm90ZWN0ZWQgamF2YS5sYW5nLk9iamVjdFtdIGVsZW1lbnREYXRhCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0NvbGxlY3Rpb248K1RFOz47KVYgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkNvbGxlY3Rpb24pCi0KLXByaXZhdGUgdm9pZCBncm93KAotaW50KQotCi1wcml2YXRlIHZvaWQgZ3Jvd0J5KAotaW50KQotCi1wcml2YXRlIHZvaWQgZ3Jvd0J5T25lKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSSlbVEU7ICkKLXByaXZhdGUgamF2YS5sYW5nLk9iamVjdFtdIG5ld0VsZW1lbnRBcnJheSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KAotamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KElURTspViApCi1wdWJsaWMgdm9pZCBhZGQoCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRFOylaICkKLXB1YmxpYyBib29sZWFuIGFkZCgKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KElMamF2YS91dGlsL0NvbGxlY3Rpb248K1RFOz47KVogKQotcHVibGljIGJvb2xlYW4gYWRkQWxsKAotaW50Ci1qYXZhLnV0aWwuQ29sbGVjdGlvbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9Db2xsZWN0aW9uPCtURTs+OylaICkKLXB1YmxpYyBib29sZWFuIGFkZEFsbCgKLWphdmEudXRpbC5Db2xsZWN0aW9uKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShURTspViApCi1wdWJsaWMgdm9pZCBhZGRFbGVtZW50KAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGludCBjYXBhY2l0eSgpCi0KLXB1YmxpYyB2b2lkIGNsZWFyKCkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgY2xvbmUoKQotCi1wdWJsaWMgYm9vbGVhbiBjb250YWlucygKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvQ29sbGVjdGlvbjwqPjspWiApCi1wdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbCgKLWphdmEudXRpbC5Db2xsZWN0aW9uKQotCi1wdWJsaWMgdm9pZCBjb3B5SW50bygKLWphdmEubGFuZy5PYmplY3RbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSSlURTsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZWxlbWVudEF0KAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9FbnVtZXJhdGlvbjxURTs+OyApCi1wdWJsaWMgamF2YS51dGlsLkVudW1lcmF0aW9uIGVsZW1lbnRzKCkKLQotcHVibGljIHZvaWQgZW5zdXJlQ2FwYWNpdHkoCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClURTsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZmlyc3RFbGVtZW50KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSSlURTsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0KAotaW50KQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLQotcHVibGljIGludCBpbmRleE9mKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGludCBpbmRleE9mKAotamF2YS5sYW5nLk9iamVjdAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShURTtJKVYgKQotcHVibGljIHZvaWQgaW5zZXJ0RWxlbWVudEF0KAotamF2YS5sYW5nLk9iamVjdAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVRFOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBsYXN0RWxlbWVudCgpCi0KLXB1YmxpYyBpbnQgbGFzdEluZGV4T2YoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50IGxhc3RJbmRleE9mKAotamF2YS5sYW5nLk9iamVjdAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJKVRFOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCByZW1vdmUoCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIHJlbW92ZSgKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvQ29sbGVjdGlvbjwqPjspWiApCi1wdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoCi1qYXZhLnV0aWwuQ29sbGVjdGlvbikKLQotcHVibGljIHZvaWQgcmVtb3ZlQWxsRWxlbWVudHMoKQotCi1wdWJsaWMgYm9vbGVhbiByZW1vdmVFbGVtZW50KAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHZvaWQgcmVtb3ZlRWxlbWVudEF0KAotaW50KQotCi1wcm90ZWN0ZWQgdm9pZCByZW1vdmVSYW5nZSgKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0NvbGxlY3Rpb248Kj47KVogKQotcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKAotamF2YS51dGlsLkNvbGxlY3Rpb24pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KElURTspVEU7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHNldCgKLWludAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEU7SSlWICkKLXB1YmxpYyB2b2lkIHNldEVsZW1lbnRBdCgKLWphdmEubGFuZy5PYmplY3QKLWludCkKLQotcHVibGljIHZvaWQgc2V0U2l6ZSgKLWludCkKLQotcHVibGljIGludCBzaXplKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSUkpTGphdmEvdXRpbC9MaXN0PFRFOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBzdWJMaXN0KAotaW50Ci1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0W10gdG9BcnJheSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFQ6TGphdmEvbGFuZy9PYmplY3Q7PihbVFQ7KVtUVDsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3RbXSB0b0FycmF5KAotamF2YS5sYW5nLk9iamVjdFtdKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLXB1YmxpYyB2b2lkIHRyaW1Ub1NpemUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08RTpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvdXRpbC9WZWN0b3I8VEU7PjsgKQotcHVibGljIGNsYXNzIGphdmEudXRpbC5TdGFjayBleHRlbmRzIGphdmEudXRpbC5WZWN0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGJvb2xlYW4gZW1wdHkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVEU7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHBlZWsoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVEU7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHBvcCgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRFOylURTsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgcHVzaCgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBpbnQgc2VhcmNoKAotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvdXRpbC9FbnVtZXJhdGlvbjxMamF2YS9sYW5nL09iamVjdDs+OyApCi1wdWJsaWMgY2xhc3MgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuRW51bWVyYXRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGRlbGltaXRlcnMKLQotcHJpdmF0ZSBpbnQgcG9zaXRpb24KLQotcHJpdmF0ZSBib29sZWFuIHJldHVybkRlbGltaXRlcnMKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHN0cmluZwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4pCi0KLXB1YmxpYyBpbnQgY291bnRUb2tlbnMoKQotCi1wdWJsaWMgYm9vbGVhbiBoYXNNb3JlRWxlbWVudHMoKQotCi1wdWJsaWMgYm9vbGVhbiBoYXNNb3JlVG9rZW5zKCkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgbmV4dEVsZW1lbnQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBuZXh0VG9rZW4oKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBuZXh0VG9rZW4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvVGltZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLSBjbGFzcyBqYXZhLnV0aWwuVGltZXIkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgamF2YS51dGlsLlRpbWVyIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEudXRpbC5UaW1lcikKLQotcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjYgbmFtZSA9VGltZXJOb2RlICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvVGltZXIkVGltZXJJbXBsOyApCi1maW5hbCBjbGFzcyBqYXZhLnV0aWwuVGltZXIkVGltZXJJbXBsJFRpbWVyTm9kZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGphdmEudXRpbC5UaW1lciRUaW1lckltcGwkVGltZXJOb2RlIGxlZnQKLQotIGphdmEudXRpbC5UaW1lciRUaW1lckltcGwkVGltZXJOb2RlIHBhcmVudAotCi0gamF2YS51dGlsLlRpbWVyJFRpbWVySW1wbCRUaW1lck5vZGUgcmlnaHQKLQotIGphdmEudXRpbC5UaW1lclRhc2sgdGFzawotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEudXRpbC5UaW1lclRhc2spCi0KLXB1YmxpYyB2b2lkIGRlbGV0ZUlmQ2FuY2VsbGVkKAotamF2YS51dGlsLlRpbWVyJFRpbWVySW1wbCRUaW1lclRyZWUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNiBuYW1lID1UaW1lclRyZWUgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9UaW1lciRUaW1lckltcGw7ICkKLWZpbmFsIGNsYXNzIGphdmEudXRpbC5UaW1lciRUaW1lckltcGwkVGltZXJUcmVlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gaW50IGRlbGV0ZWRDYW5jZWxsZWROdW1iZXIKLQotIGphdmEudXRpbC5UaW1lciRUaW1lckltcGwkVGltZXJOb2RlIHJvb3QKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLlRpbWVyJDEpCi0KLXByaXZhdGUgamF2YS51dGlsLlRpbWVyJFRpbWVySW1wbCRUaW1lck5vZGUgbWluaW11bSgKLWphdmEudXRpbC5UaW1lciRUaW1lckltcGwkVGltZXJOb2RlKQotCi1wcml2YXRlIGphdmEudXRpbC5UaW1lciRUaW1lckltcGwkVGltZXJOb2RlIHN1Y2Nlc3NvcigKLWphdmEudXRpbC5UaW1lciRUaW1lckltcGwkVGltZXJOb2RlKQotCi0gdm9pZCBkZWxldGUoCi1qYXZhLnV0aWwuVGltZXIkVGltZXJJbXBsJFRpbWVyTm9kZSkKLQotIHZvaWQgaW5zZXJ0KAotamF2YS51dGlsLlRpbWVyJFRpbWVySW1wbCRUaW1lck5vZGUpCi0KLSBib29sZWFuIGlzRW1wdHkoKQotCi0gamF2YS51dGlsLlRpbWVyJFRpbWVySW1wbCRUaW1lck5vZGUgbWluaW11bSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9UaW1lcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNiBuYW1lID1UaW1lckltcGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MamF2YS91dGlsL1RpbWVyJFRpbWVySW1wbCRUaW1lclRyZWU7TGphdmEvdXRpbC9UaW1lciRUaW1lckltcGwkVGltZXJOb2RlOyApCi1maW5hbCBjbGFzcyBqYXZhLnV0aWwuVGltZXIkVGltZXJJbXBsIGV4dGVuZHMgamF2YS5sYW5nLlRocmVhZAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGJvb2xlYW4gY2FuY2VsbGVkCi0KLXByaXZhdGUgYm9vbGVhbiBmaW5pc2hlZAotCi1wcml2YXRlIGphdmEudXRpbC5UaW1lciRUaW1lckltcGwkVGltZXJUcmVlIHRhc2tzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotIHZvaWQgPGluaXQ+KAotYm9vbGVhbikKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDIwMigKLWphdmEudXRpbC5UaW1lciRUaW1lckltcGwKLWJvb2xlYW4pCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQzMDAoCi1qYXZhLnV0aWwuVGltZXIkVGltZXJJbXBsKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkNDAwKAotamF2YS51dGlsLlRpbWVyJFRpbWVySW1wbAotamF2YS51dGlsLlRpbWVyVGFzaykKLQotcHJpdmF0ZSB2b2lkIGluc2VydFRhc2soCi1qYXZhLnV0aWwuVGltZXJUYXNrKQotCi1wdWJsaWMgdm9pZCBjYW5jZWwoKQotCi1wdWJsaWMgaW50IHB1cmdlKCkKLQotcHVibGljIHZvaWQgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxqYXZhL3V0aWwvVGltZXIkVGltZXJJbXBsOyApCi1wdWJsaWMgY2xhc3MgamF2YS51dGlsLlRpbWVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEubGFuZy5PYmplY3QgZmluYWxpemVyCi0KLXByaXZhdGUgamF2YS51dGlsLlRpbWVyJFRpbWVySW1wbCBpbXBsCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYm9vbGVhbikKLQotc3RhdGljIGphdmEudXRpbC5UaW1lciRUaW1lckltcGwgYWNjZXNzJDEwMCgKLWphdmEudXRpbC5UaW1lcikKLQotcHJpdmF0ZSB2b2lkIHNjaGVkdWxlSW1wbCgKLWphdmEudXRpbC5UaW1lclRhc2sKLWxvbmcKLWxvbmcKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIGNhbmNlbCgpCi0KLXB1YmxpYyBpbnQgcHVyZ2UoKQotCi1wdWJsaWMgdm9pZCBzY2hlZHVsZSgKLWphdmEudXRpbC5UaW1lclRhc2sKLWxvbmcpCi0KLXB1YmxpYyB2b2lkIHNjaGVkdWxlKAotamF2YS51dGlsLlRpbWVyVGFzawotbG9uZwotbG9uZykKLQotcHVibGljIHZvaWQgc2NoZWR1bGUoCi1qYXZhLnV0aWwuVGltZXJUYXNrCi1qYXZhLnV0aWwuRGF0ZSkKLQotcHVibGljIHZvaWQgc2NoZWR1bGUoCi1qYXZhLnV0aWwuVGltZXJUYXNrCi1qYXZhLnV0aWwuRGF0ZQotbG9uZykKLQotcHVibGljIHZvaWQgc2NoZWR1bGVBdEZpeGVkUmF0ZSgKLWphdmEudXRpbC5UaW1lclRhc2sKLWxvbmcKLWxvbmcpCi0KLXB1YmxpYyB2b2lkIHNjaGVkdWxlQXRGaXhlZFJhdGUoCi1qYXZhLnV0aWwuVGltZXJUYXNrCi1qYXZhLnV0aWwuRGF0ZQotbG9uZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZhLnV0aWwuVGltZXJUYXNrIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5SdW5uYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gYm9vbGVhbiBjYW5jZWxsZWQKLQotIGJvb2xlYW4gZml4ZWRSYXRlCi0KLWZpbmFsIGphdmEubGFuZy5PYmplY3QgbG9jawotCi0gbG9uZyBwZXJpb2QKLQotcHJpdmF0ZSBsb25nIHNjaGVkdWxlZFRpbWUKLQotIGxvbmcgd2hlbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBib29sZWFuIGNhbmNlbCgpCi0KLSBsb25nIGdldFdoZW4oKQotCi0gYm9vbGVhbiBpc1NjaGVkdWxlZCgpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJ1bigpCi0KLXB1YmxpYyBsb25nIHNjaGVkdWxlZEV4ZWN1dGlvblRpbWUoKQotCi0gdm9pZCBzZXRTY2hlZHVsZWRUaW1lKAotbG9uZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLnV0aWwuVG9vTWFueUxpc3RlbmVyc0V4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5FeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9BYnN0cmFjdFNldDxMamF2YS91dGlsL01hcCRFbnRyeTxUSztUVjs+Oz47ICkKLSBjbGFzcyBqYXZhLnV0aWwuVHJlZU1hcCQxIGV4dGVuZHMgamF2YS51dGlsLkFic3RyYWN0U2V0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGphdmEudXRpbC5UcmVlTWFwIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEudXRpbC5UcmVlTWFwKQotCi1wdWJsaWMgdm9pZCBjbGVhcigpCi0KLXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvSXRlcmF0b3I8TGphdmEvdXRpbC9NYXAkRW50cnk8VEs7VFY7Pjs+OyApCi1wdWJsaWMgamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXJhdG9yKCkKLQotcHVibGljIGludCBzaXplKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9BYnN0cmFjdFNldDxUSzs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi0gY2xhc3MgamF2YS51dGlsLlRyZWVNYXAkMiBleHRlbmRzIGphdmEudXRpbC5BYnN0cmFjdFNldAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBqYXZhLnV0aWwuVHJlZU1hcCB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuVHJlZU1hcCkKLQotcHVibGljIHZvaWQgY2xlYXIoKQotCi1wdWJsaWMgYm9vbGVhbiBjb250YWlucygKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0l0ZXJhdG9yPFRLOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuSXRlcmF0b3IgaXRlcmF0b3IoKQotCi1wdWJsaWMgaW50IHNpemUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0Fic3RyYWN0Q29sbGVjdGlvbjxUVjs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi0gY2xhc3MgamF2YS51dGlsLlRyZWVNYXAkMyBleHRlbmRzIGphdmEudXRpbC5BYnN0cmFjdENvbGxlY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgamF2YS51dGlsLlRyZWVNYXAgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLlRyZWVNYXApCi0KLXB1YmxpYyB2b2lkIGNsZWFyKCkKLQotcHVibGljIGJvb2xlYW4gY29udGFpbnMoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9JdGVyYXRvcjxUVjs+OyApCi1wdWJsaWMgamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXJhdG9yKCkKLQotcHVibGljIGludCBzaXplKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEs6TGphdmEvbGFuZy9PYmplY3Q7VjpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvbGFuZy9PYmplY3Q7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9QWJzdHJhY3RNYXBJdGVyYXRvciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL1RyZWVNYXA7ICkKLSBjbGFzcyBqYXZhLnV0aWwuVHJlZU1hcCRBYnN0cmFjdE1hcEl0ZXJhdG9yIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvVHJlZU1hcDxUSztUVjs+OyApCi0gamF2YS51dGlsLlRyZWVNYXAgYmFja2luZ01hcAotCi0gaW50IGV4cGVjdGVkTW9kQ291bnQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL1RyZWVNYXAkRW50cnk8VEs7VFY7PjsgKQotIGphdmEudXRpbC5UcmVlTWFwJEVudHJ5IGxhc3ROb2RlCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9UcmVlTWFwJEVudHJ5PFRLO1RWOz47ICkKLSBqYXZhLnV0aWwuVHJlZU1hcCRFbnRyeSBub2RlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9UcmVlTWFwPFRLO1RWOz47TGphdmEvdXRpbC9UcmVlTWFwJEVudHJ5PFRLO1RWOz47KVYgKQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLlRyZWVNYXAKLWphdmEudXRpbC5UcmVlTWFwJEVudHJ5KQotCi1wdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkKLQotZmluYWwgdm9pZCBtYWtlTmV4dCgpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1Db21wYXJhYmxlQm91bmRlZEl0ZXJhdG9yICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08SzpMamF2YS9sYW5nL09iamVjdDtWOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS91dGlsL1RyZWVNYXAkQWJzdHJhY3RNYXBJdGVyYXRvcjxUSztUVjs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL1RyZWVNYXA7ICkKLSBjbGFzcyBqYXZhLnV0aWwuVHJlZU1hcCRDb21wYXJhYmxlQm91bmRlZEl0ZXJhdG9yIGV4dGVuZHMgamF2YS51dGlsLlRyZWVNYXAkQWJzdHJhY3RNYXBJdGVyYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvQ29tcGFyYWJsZTxUSzs+OyApCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5Db21wYXJhYmxlIGVuZEtleQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvVHJlZU1hcDxUSztUVjs+O0xqYXZhL3V0aWwvVHJlZU1hcCRFbnRyeTxUSztUVjs+O0xqYXZhL2xhbmcvQ29tcGFyYWJsZTxUSzs+OylWICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEudXRpbC5UcmVlTWFwCi1qYXZhLnV0aWwuVHJlZU1hcCRFbnRyeQotamF2YS5sYW5nLkNvbXBhcmFibGUpCi0KLWZpbmFsIHZvaWQgY2xlYW5OZXh0KCkKLQotcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxLOkxqYXZhL2xhbmcvT2JqZWN0O1Y6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL3V0aWwvVHJlZU1hcCRDb21wYXJhYmxlQm91bmRlZEl0ZXJhdG9yPFRLO1RWOz47TGphdmEvdXRpbC9JdGVyYXRvcjxMamF2YS91dGlsL01hcCRFbnRyeTxUSztUVjs+Oz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9Q29tcGFyYWJsZUJvdW5kZWRFbnRyeUl0ZXJhdG9yICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvVHJlZU1hcDsgKQotIGNsYXNzIGphdmEudXRpbC5UcmVlTWFwJENvbXBhcmFibGVCb3VuZGVkRW50cnlJdGVyYXRvciBleHRlbmRzIGphdmEudXRpbC5UcmVlTWFwJENvbXBhcmFibGVCb3VuZGVkSXRlcmF0b3IgaW1wbGVtZW50cyBqYXZhLnV0aWwuSXRlcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL1RyZWVNYXA8VEs7VFY7PjtMamF2YS91dGlsL1RyZWVNYXAkRW50cnk8VEs7VFY7PjtMamF2YS9sYW5nL0NvbXBhcmFibGU8VEs7PjspViApCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuVHJlZU1hcAotamF2YS51dGlsLlRyZWVNYXAkRW50cnkKLWphdmEubGFuZy5Db21wYXJhYmxlKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBuZXh0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvTWFwJEVudHJ5PFRLO1RWOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuTWFwJEVudHJ5IG5leHQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvVHJlZU1hcDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxLOkxqYXZhL2xhbmcvT2JqZWN0O1Y6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL3V0aWwvVHJlZU1hcCRDb21wYXJhYmxlQm91bmRlZEl0ZXJhdG9yPFRLO1RWOz47TGphdmEvdXRpbC9JdGVyYXRvcjxUSzs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPUNvbXBhcmFibGVCb3VuZGVkS2V5SXRlcmF0b3IgKQotIGNsYXNzIGphdmEudXRpbC5UcmVlTWFwJENvbXBhcmFibGVCb3VuZGVkS2V5SXRlcmF0b3IgZXh0ZW5kcyBqYXZhLnV0aWwuVHJlZU1hcCRDb21wYXJhYmxlQm91bmRlZEl0ZXJhdG9yIGltcGxlbWVudHMgamF2YS51dGlsLkl0ZXJhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9UcmVlTWFwPFRLO1RWOz47TGphdmEvdXRpbC9UcmVlTWFwJEVudHJ5PFRLO1RWOz47TGphdmEvbGFuZy9Db21wYXJhYmxlPFRLOz47KVYgKQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLlRyZWVNYXAKLWphdmEudXRpbC5UcmVlTWFwJEVudHJ5Ci1qYXZhLmxhbmcuQ29tcGFyYWJsZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVRLOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBuZXh0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEs6TGphdmEvbGFuZy9PYmplY3Q7VjpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvdXRpbC9UcmVlTWFwJENvbXBhcmFibGVCb3VuZGVkSXRlcmF0b3I8VEs7VFY7PjtMamF2YS91dGlsL0l0ZXJhdG9yPFRWOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9Q29tcGFyYWJsZUJvdW5kZWRWYWx1ZUl0ZXJhdG9yICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvVHJlZU1hcDsgKQotIGNsYXNzIGphdmEudXRpbC5UcmVlTWFwJENvbXBhcmFibGVCb3VuZGVkVmFsdWVJdGVyYXRvciBleHRlbmRzIGphdmEudXRpbC5UcmVlTWFwJENvbXBhcmFibGVCb3VuZGVkSXRlcmF0b3IgaW1wbGVtZW50cyBqYXZhLnV0aWwuSXRlcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL1RyZWVNYXA8VEs7VFY7PjtMamF2YS91dGlsL1RyZWVNYXAkRW50cnk8VEs7VFY7PjtMamF2YS9sYW5nL0NvbXBhcmFibGU8VEs7PjspViApCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuVHJlZU1hcAotamF2YS51dGlsLlRyZWVNYXAkRW50cnkKLWphdmEubGFuZy5Db21wYXJhYmxlKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVFY7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IG5leHQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9Q29tcGFyYXRvckJvdW5kZWRJdGVyYXRvciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL1RyZWVNYXA7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08SzpMamF2YS9sYW5nL09iamVjdDtWOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS91dGlsL1RyZWVNYXAkQWJzdHJhY3RNYXBJdGVyYXRvcjxUSztUVjs+OyApCi0gY2xhc3MgamF2YS51dGlsLlRyZWVNYXAkQ29tcGFyYXRvckJvdW5kZWRJdGVyYXRvciBleHRlbmRzIGphdmEudXRpbC5UcmVlTWFwJEFic3RyYWN0TWFwSXRlcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0NvbXBhcmF0b3I8LVRLOz47ICkKLXByaXZhdGUgZmluYWwgamF2YS51dGlsLkNvbXBhcmF0b3IgY21wCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9VEs7ICkKLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLk9iamVjdCBlbmRLZXkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL1RyZWVNYXA8VEs7VFY7PjtMamF2YS91dGlsL1RyZWVNYXAkRW50cnk8VEs7VFY7PjtUSzspViApCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuVHJlZU1hcAotamF2YS51dGlsLlRyZWVNYXAkRW50cnkKLWphdmEubGFuZy5PYmplY3QpCi0KLWZpbmFsIHZvaWQgY2xlYW5OZXh0KCkKLQotcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxLOkxqYXZhL2xhbmcvT2JqZWN0O1Y6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL3V0aWwvVHJlZU1hcCRDb21wYXJhdG9yQm91bmRlZEl0ZXJhdG9yPFRLO1RWOz47TGphdmEvdXRpbC9JdGVyYXRvcjxMamF2YS91dGlsL01hcCRFbnRyeTxUSztUVjs+Oz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvVHJlZU1hcDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1Db21wYXJhdG9yQm91bmRlZEVudHJ5SXRlcmF0b3IgKQotIGNsYXNzIGphdmEudXRpbC5UcmVlTWFwJENvbXBhcmF0b3JCb3VuZGVkRW50cnlJdGVyYXRvciBleHRlbmRzIGphdmEudXRpbC5UcmVlTWFwJENvbXBhcmF0b3JCb3VuZGVkSXRlcmF0b3IgaW1wbGVtZW50cyBqYXZhLnV0aWwuSXRlcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL1RyZWVNYXA8VEs7VFY7PjtMamF2YS91dGlsL1RyZWVNYXAkRW50cnk8VEs7VFY7PjtUSzspViApCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuVHJlZU1hcAotamF2YS51dGlsLlRyZWVNYXAkRW50cnkKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IG5leHQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9NYXAkRW50cnk8VEs7VFY7PjsgKQotcHVibGljIGphdmEudXRpbC5NYXAkRW50cnkgbmV4dCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxLOkxqYXZhL2xhbmcvT2JqZWN0O1Y6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL3V0aWwvVHJlZU1hcCRDb21wYXJhdG9yQm91bmRlZEl0ZXJhdG9yPFRLO1RWOz47TGphdmEvdXRpbC9JdGVyYXRvcjxUSzs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPUNvbXBhcmF0b3JCb3VuZGVkS2V5SXRlcmF0b3IgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9UcmVlTWFwOyApCi0gY2xhc3MgamF2YS51dGlsLlRyZWVNYXAkQ29tcGFyYXRvckJvdW5kZWRLZXlJdGVyYXRvciBleHRlbmRzIGphdmEudXRpbC5UcmVlTWFwJENvbXBhcmF0b3JCb3VuZGVkSXRlcmF0b3IgaW1wbGVtZW50cyBqYXZhLnV0aWwuSXRlcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL1RyZWVNYXA8VEs7VFY7PjtMamF2YS91dGlsL1RyZWVNYXAkRW50cnk8VEs7VFY7PjtUSzspViApCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuVHJlZU1hcAotamF2YS51dGlsLlRyZWVNYXAkRW50cnkKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClUSzsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgbmV4dCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1Db21wYXJhdG9yQm91bmRlZFZhbHVlSXRlcmF0b3IgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9UcmVlTWFwOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEs6TGphdmEvbGFuZy9PYmplY3Q7VjpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvdXRpbC9UcmVlTWFwJENvbXBhcmF0b3JCb3VuZGVkSXRlcmF0b3I8VEs7VFY7PjtMamF2YS91dGlsL0l0ZXJhdG9yPFRWOz47ICkKLSBjbGFzcyBqYXZhLnV0aWwuVHJlZU1hcCRDb21wYXJhdG9yQm91bmRlZFZhbHVlSXRlcmF0b3IgZXh0ZW5kcyBqYXZhLnV0aWwuVHJlZU1hcCRDb21wYXJhdG9yQm91bmRlZEl0ZXJhdG9yIGltcGxlbWVudHMgamF2YS51dGlsLkl0ZXJhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9UcmVlTWFwPFRLO1RWOz47TGphdmEvdXRpbC9UcmVlTWFwJEVudHJ5PFRLO1RWOz47VEs7KVYgKQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLlRyZWVNYXAKLWphdmEudXRpbC5UcmVlTWFwJEVudHJ5Ci1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVFY7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IG5leHQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08SzpMamF2YS9sYW5nL09iamVjdDtWOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS91dGlsL01hcEVudHJ5PFRLO1RWOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1FbnRyeSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL1RyZWVNYXA7ICkKLSBjbGFzcyBqYXZhLnV0aWwuVHJlZU1hcCRFbnRyeSBleHRlbmRzIGphdmEudXRpbC5NYXBFbnRyeQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gYm9vbGVhbiBjb2xvcgotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvVHJlZU1hcCRFbnRyeTxUSztUVjs+OyApCi0gamF2YS51dGlsLlRyZWVNYXAkRW50cnkgbGVmdAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvVHJlZU1hcCRFbnRyeTxUSztUVjs+OyApCi0gamF2YS51dGlsLlRyZWVNYXAkRW50cnkgcGFyZW50Ci1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9UcmVlTWFwJEVudHJ5PFRLO1RWOz47ICkKLSBqYXZhLnV0aWwuVHJlZU1hcCRFbnRyeSByaWdodAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRLOylWICkKLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRLO1RWOylWICkKLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvVHJlZU1hcCRFbnRyeTxUSztUVjs+OylMamF2YS91dGlsL1RyZWVNYXAkRW50cnk8VEs7VFY7PjsgKQotIGphdmEudXRpbC5UcmVlTWFwJEVudHJ5IGNsb25lKAotamF2YS51dGlsLlRyZWVNYXAkRW50cnkpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxLOkxqYXZhL2xhbmcvT2JqZWN0O1Y6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL3V0aWwvQWJzdHJhY3RNYXA8VEs7VFY7PjtMamF2YS91dGlsL1NvcnRlZE1hcDxUSztUVjs+O0xqYXZhL2lvL1NlcmlhbGl6YWJsZTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNCBuYW1lID1TdWJNYXAgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9UcmVlTWFwOyApCi1maW5hbCBjbGFzcyBqYXZhLnV0aWwuVHJlZU1hcCRTdWJNYXAgZXh0ZW5kcyBqYXZhLnV0aWwuQWJzdHJhY3RNYXAgaW1wbGVtZW50cyBqYXZhLnV0aWwuU29ydGVkTWFwLCBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL1RyZWVNYXA8VEs7VFY7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuVHJlZU1hcCBiYWNraW5nTWFwCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9VEs7ICkKLSBqYXZhLmxhbmcuT2JqZWN0IGVuZEtleQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvU2V0PExqYXZhL3V0aWwvTWFwJEVudHJ5PFRLO1RWOz47PjsgKQotdHJhbnNpZW50IGphdmEudXRpbC5TZXQgZW50cnlTZXQKLQotIGJvb2xlYW4gaGFzRW5kCi0KLSBib29sZWFuIGhhc1N0YXJ0Ci1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9VEs7ICkKLSBqYXZhLmxhbmcuT2JqZWN0IHN0YXJ0S2V5Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEs7TGphdmEvdXRpbC9UcmVlTWFwPFRLO1RWOz47KVYgKQotIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLk9iamVjdAotamF2YS51dGlsLlRyZWVNYXApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRLO0xqYXZhL3V0aWwvVHJlZU1hcDxUSztUVjs+O1RLOylWICkKLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5PYmplY3QKLWphdmEudXRpbC5UcmVlTWFwCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL1RyZWVNYXA8VEs7VFY7PjtUSzspViApCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuVHJlZU1hcAotamF2YS5sYW5nLk9iamVjdCkKLQotc3RhdGljIGphdmEudXRpbC5UcmVlTWFwIGFjY2VzcyQyMDAoCi1qYXZhLnV0aWwuVHJlZU1hcCRTdWJNYXApCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQzMDAoCi1qYXZhLnV0aWwuVHJlZU1hcCRTdWJNYXAKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRLOylaICkKLXByaXZhdGUgYm9vbGVhbiBjaGVja0xvd2VyQm91bmQoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUSzspViApCi1wcml2YXRlIHZvaWQgY2hlY2tSYW5nZSgKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRLOylaICkKLXByaXZhdGUgYm9vbGVhbiBjaGVja1VwcGVyQm91bmQoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUSzspWiApCi1wcml2YXRlIGJvb2xlYW4gaXNJblJhbmdlKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvQ29tcGFyYXRvcjwtVEs7PjsgKQotcHVibGljIGphdmEudXRpbC5Db21wYXJhdG9yIGNvbXBhcmF0b3IoKQotCi1wdWJsaWMgYm9vbGVhbiBjb250YWluc0tleSgKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL1NldDxMamF2YS91dGlsL01hcCRFbnRyeTxUSztUVjs+Oz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuU2V0IGVudHJ5U2V0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvVHJlZU1hcCRFbnRyeTxUSztUVjs+OyApCi0gamF2YS51dGlsLlRyZWVNYXAkRW50cnkgZmlyc3RFbnRyeSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClUSzsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZmlyc3RLZXkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL09iamVjdDspVFY7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldCgKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRLOylMamF2YS91dGlsL1NvcnRlZE1hcDxUSztUVjs+OyApCi1wdWJsaWMgamF2YS51dGlsLlNvcnRlZE1hcCBoZWFkTWFwKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL1NldDxUSzs+OyApCi1wdWJsaWMgamF2YS51dGlsLlNldCBrZXlTZXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVEs7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGxhc3RLZXkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUSztUVjspVFY7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHB1dCgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvT2JqZWN0OylUVjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgcmVtb3ZlKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEs7VEs7KUxqYXZhL3V0aWwvU29ydGVkTWFwPFRLO1RWOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuU29ydGVkTWFwIHN1Yk1hcCgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRLOylMamF2YS91dGlsL1NvcnRlZE1hcDxUSztUVjs+OyApCi1wdWJsaWMgamF2YS51dGlsLlNvcnRlZE1hcCB0YWlsTWFwKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvQ29sbGVjdGlvbjxUVjs+OyApCi1wdWJsaWMgamF2YS51dGlsLkNvbGxlY3Rpb24gdmFsdWVzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9U3ViTWFwRW50cnlTZXQgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9UcmVlTWFwOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEs6TGphdmEvbGFuZy9PYmplY3Q7VjpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvdXRpbC9BYnN0cmFjdFNldDxMamF2YS91dGlsL01hcCRFbnRyeTxUSztUVjs+Oz47TGphdmEvdXRpbC9TZXQ8TGphdmEvdXRpbC9NYXAkRW50cnk8VEs7VFY7Pjs+OyApCi0gY2xhc3MgamF2YS51dGlsLlRyZWVNYXAkU3ViTWFwRW50cnlTZXQgZXh0ZW5kcyBqYXZhLnV0aWwuQWJzdHJhY3RTZXQgaW1wbGVtZW50cyBqYXZhLnV0aWwuU2V0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9UcmVlTWFwJFN1Yk1hcDxUSztUVjs+OyApCi0gamF2YS51dGlsLlRyZWVNYXAkU3ViTWFwIHN1Yk1hcAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvVHJlZU1hcCRTdWJNYXA8VEs7VFY7PjspViApCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuVHJlZU1hcCRTdWJNYXApCi0KLXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0l0ZXJhdG9yPExqYXZhL3V0aWwvTWFwJEVudHJ5PFRLO1RWOz47PjsgKQotcHVibGljIGphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvcigpCi0KLXB1YmxpYyBpbnQgc2l6ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxLOkxqYXZhL2xhbmcvT2JqZWN0O1Y6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL3V0aWwvQWJzdHJhY3RTZXQ8VEs7PjtMamF2YS91dGlsL1NldDxUSzs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9U3ViTWFwS2V5U2V0ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvVHJlZU1hcDsgKQotIGNsYXNzIGphdmEudXRpbC5UcmVlTWFwJFN1Yk1hcEtleVNldCBleHRlbmRzIGphdmEudXRpbC5BYnN0cmFjdFNldCBpbXBsZW1lbnRzIGphdmEudXRpbC5TZXQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL1RyZWVNYXAkU3ViTWFwPFRLO1RWOz47ICkKLSBqYXZhLnV0aWwuVHJlZU1hcCRTdWJNYXAgc3ViTWFwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9UcmVlTWFwJFN1Yk1hcDxUSztUVjs+OylWICkKLSB2b2lkIDxpbml0PigKLWphdmEudXRpbC5UcmVlTWFwJFN1Yk1hcCkKLQotcHVibGljIGJvb2xlYW4gY29udGFpbnMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvSXRlcmF0b3I8VEs7PjsgKQotcHVibGljIGphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvcigpCi0KLXB1YmxpYyBpbnQgc2l6ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9UcmVlTWFwOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9U3ViTWFwVmFsdWVzQ29sbGVjdGlvbiApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEs6TGphdmEvbGFuZy9PYmplY3Q7VjpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvdXRpbC9BYnN0cmFjdENvbGxlY3Rpb248VFY7PjsgKQotIGNsYXNzIGphdmEudXRpbC5UcmVlTWFwJFN1Yk1hcFZhbHVlc0NvbGxlY3Rpb24gZXh0ZW5kcyBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9UcmVlTWFwJFN1Yk1hcDxUSztUVjs+OyApCi0gamF2YS51dGlsLlRyZWVNYXAkU3ViTWFwIHN1Yk1hcAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvVHJlZU1hcCRTdWJNYXA8VEs7VFY7PjspViApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuVHJlZU1hcCRTdWJNYXApCi0KLXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9JdGVyYXRvcjxUVjs+OyApCi1wdWJsaWMgamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXJhdG9yKCkKLQotcHVibGljIGludCBzaXplKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEs6TGphdmEvbGFuZy9PYmplY3Q7VjpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvdXRpbC9UcmVlTWFwJEFic3RyYWN0TWFwSXRlcmF0b3I8VEs7VFY7PjtMamF2YS91dGlsL0l0ZXJhdG9yPExqYXZhL3V0aWwvTWFwJEVudHJ5PFRLO1RWOz47PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9UcmVlTWFwOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPVVuYm91bmRlZEVudHJ5SXRlcmF0b3IgKQotIGNsYXNzIGphdmEudXRpbC5UcmVlTWFwJFVuYm91bmRlZEVudHJ5SXRlcmF0b3IgZXh0ZW5kcyBqYXZhLnV0aWwuVHJlZU1hcCRBYnN0cmFjdE1hcEl0ZXJhdG9yIGltcGxlbWVudHMgamF2YS51dGlsLkl0ZXJhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9UcmVlTWFwPFRLO1RWOz47KVYgKQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLlRyZWVNYXApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvVHJlZU1hcDxUSztUVjs+O0xqYXZhL3V0aWwvVHJlZU1hcCRFbnRyeTxUSztUVjs+OylWICkKLSB2b2lkIDxpbml0PigKLWphdmEudXRpbC5UcmVlTWFwCi1qYXZhLnV0aWwuVHJlZU1hcCRFbnRyeSkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgbmV4dCgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL01hcCRFbnRyeTxUSztUVjs+OyApCi1wdWJsaWMgamF2YS51dGlsLk1hcCRFbnRyeSBuZXh0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL1RyZWVNYXA7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1VbmJvdW5kZWRLZXlJdGVyYXRvciApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEs6TGphdmEvbGFuZy9PYmplY3Q7VjpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvdXRpbC9UcmVlTWFwJEFic3RyYWN0TWFwSXRlcmF0b3I8VEs7VFY7PjtMamF2YS91dGlsL0l0ZXJhdG9yPFRLOz47ICkKLSBjbGFzcyBqYXZhLnV0aWwuVHJlZU1hcCRVbmJvdW5kZWRLZXlJdGVyYXRvciBleHRlbmRzIGphdmEudXRpbC5UcmVlTWFwJEFic3RyYWN0TWFwSXRlcmF0b3IgaW1wbGVtZW50cyBqYXZhLnV0aWwuSXRlcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL1RyZWVNYXA8VEs7VFY7PjspViApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuVHJlZU1hcCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9UcmVlTWFwPFRLO1RWOz47TGphdmEvdXRpbC9UcmVlTWFwJEVudHJ5PFRLO1RWOz47KVYgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLlRyZWVNYXAKLWphdmEudXRpbC5UcmVlTWFwJEVudHJ5KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVEs7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IG5leHQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08SzpMamF2YS9sYW5nL09iamVjdDtWOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS91dGlsL1RyZWVNYXAkQWJzdHJhY3RNYXBJdGVyYXRvcjxUSztUVjs+O0xqYXZhL3V0aWwvSXRlcmF0b3I8VFY7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPVVuYm91bmRlZFZhbHVlSXRlcmF0b3IgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9UcmVlTWFwOyApCi0gY2xhc3MgamF2YS51dGlsLlRyZWVNYXAkVW5ib3VuZGVkVmFsdWVJdGVyYXRvciBleHRlbmRzIGphdmEudXRpbC5UcmVlTWFwJEFic3RyYWN0TWFwSXRlcmF0b3IgaW1wbGVtZW50cyBqYXZhLnV0aWwuSXRlcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL1RyZWVNYXA8VEs7VFY7PjspViApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuVHJlZU1hcCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9UcmVlTWFwPFRLO1RWOz47TGphdmEvdXRpbC9UcmVlTWFwJEVudHJ5PFRLO1RWOz47KVYgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLlRyZWVNYXAKLWphdmEudXRpbC5UcmVlTWFwJEVudHJ5KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVFY7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IG5leHQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08SzpMamF2YS9sYW5nL09iamVjdDtWOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS91dGlsL0Fic3RyYWN0TWFwPFRLO1RWOz47TGphdmEvdXRpbC9Tb3J0ZWRNYXA8VEs7VFY7PjtMamF2YS9sYW5nL0Nsb25lYWJsZTtMamF2YS9pby9TZXJpYWxpemFibGU7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGphdmEvdXRpbC9UcmVlTWFwJFN1Yk1hcFZhbHVlc0NvbGxlY3Rpb247TGphdmEvdXRpbC9UcmVlTWFwJFN1Yk1hcEtleVNldDtMamF2YS91dGlsL1RyZWVNYXAkU3ViTWFwRW50cnlTZXQ7TGphdmEvdXRpbC9UcmVlTWFwJFN1Yk1hcDtMamF2YS91dGlsL1RyZWVNYXAkQ29tcGFyYWJsZUJvdW5kZWRWYWx1ZUl0ZXJhdG9yO0xqYXZhL3V0aWwvVHJlZU1hcCRDb21wYXJhYmxlQm91bmRlZEtleUl0ZXJhdG9yO0xqYXZhL3V0aWwvVHJlZU1hcCRDb21wYXJhYmxlQm91bmRlZEVudHJ5SXRlcmF0b3I7TGphdmEvdXRpbC9UcmVlTWFwJENvbXBhcmFibGVCb3VuZGVkSXRlcmF0b3I7TGphdmEvdXRpbC9UcmVlTWFwJENvbXBhcmF0b3JCb3VuZGVkVmFsdWVJdGVyYXRvcjtMamF2YS91dGlsL1RyZWVNYXAkQ29tcGFyYXRvckJvdW5kZWRLZXlJdGVyYXRvcjtMamF2YS91dGlsL1RyZWVNYXAkQ29tcGFyYXRvckJvdW5kZWRFbnRyeUl0ZXJhdG9yO0xqYXZhL3V0aWwvVHJlZU1hcCRDb21wYXJhdG9yQm91bmRlZEl0ZXJhdG9yO0xqYXZhL3V0aWwvVHJlZU1hcCRVbmJvdW5kZWRWYWx1ZUl0ZXJhdG9yO0xqYXZhL3V0aWwvVHJlZU1hcCRVbmJvdW5kZWRLZXlJdGVyYXRvcjtMamF2YS91dGlsL1RyZWVNYXAkVW5ib3VuZGVkRW50cnlJdGVyYXRvcjtMamF2YS91dGlsL1RyZWVNYXAkQWJzdHJhY3RNYXBJdGVyYXRvcjtMamF2YS91dGlsL1RyZWVNYXAkRW50cnk7ICkKLXB1YmxpYyBjbGFzcyBqYXZhLnV0aWwuVHJlZU1hcCBleHRlbmRzIGphdmEudXRpbC5BYnN0cmFjdE1hcCBpbXBsZW1lbnRzIGphdmEudXRpbC5Tb3J0ZWRNYXAsIGphdmEubGFuZy5DbG9uZWFibGUsIGphdmEuaW8uU2VyaWFsaXphYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQ29tcGFyYXRvcjwtVEs7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuQ29tcGFyYXRvciBjb21wYXJhdG9yCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9TZXQ8TGphdmEvdXRpbC9NYXAkRW50cnk8VEs7VFY7Pjs+OyApCi10cmFuc2llbnQgamF2YS51dGlsLlNldCBlbnRyeVNldAotCi10cmFuc2llbnQgaW50IG1vZENvdW50Ci1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9UcmVlTWFwJEVudHJ5PFRLO1RWOz47ICkKLXRyYW5zaWVudCBqYXZhLnV0aWwuVHJlZU1hcCRFbnRyeSByb290Ci0KLXRyYW5zaWVudCBpbnQgc2l6ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvQ29tcGFyYXRvcjwtVEs7PjspViApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuQ29tcGFyYXRvcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9NYXA8K1RLOytUVjs+OylWICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEudXRpbC5NYXApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvU29ydGVkTWFwPFRLOytUVjs+OylWICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEudXRpbC5Tb3J0ZWRNYXApCi0KLXN0YXRpYyBqYXZhLnV0aWwuQ29tcGFyYXRvciBhY2Nlc3MkMDAwKAotamF2YS51dGlsLlRyZWVNYXApCi0KLXN0YXRpYyBqYXZhLmxhbmcuQ29tcGFyYWJsZSBhY2Nlc3MkMTAwKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9UcmVlTWFwJEVudHJ5PFRLO1RWOz47TGphdmEvbGFuZy9PYmplY3Q7KVogKQotcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zVmFsdWUoCi1qYXZhLnV0aWwuVHJlZU1hcCRFbnRyeQotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL3V0aWwvVHJlZU1hcCRFbnRyeTxUSztUVjs+OyApCi1wcml2YXRlIGphdmEudXRpbC5UcmVlTWFwJEVudHJ5IGZpbmQoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL1RyZWVNYXAkRW50cnk8VEs7VFY7PjspViApCi1wcml2YXRlIHZvaWQgZml4dXAoCi1qYXZhLnV0aWwuVHJlZU1hcCRFbnRyeSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9UcmVlTWFwJEVudHJ5PFRLO1RWOz47KVYgKQotcHJpdmF0ZSB2b2lkIGxlZnRSb3RhdGUoCi1qYXZhLnV0aWwuVHJlZU1hcCRFbnRyeSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08SzpMamF2YS9sYW5nL09iamVjdDtWOkxqYXZhL2xhbmcvT2JqZWN0Oz4oTGphdmEvdXRpbC9UcmVlTWFwJEVudHJ5PFRLO1RWOz47KUxqYXZhL3V0aWwvVHJlZU1hcCRFbnRyeTxUSztUVjs+OyApCi1zdGF0aWMgamF2YS51dGlsLlRyZWVNYXAkRW50cnkgbWF4aW11bSgKLWphdmEudXRpbC5UcmVlTWFwJEVudHJ5KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxLOkxqYXZhL2xhbmcvT2JqZWN0O1Y6TGphdmEvbGFuZy9PYmplY3Q7PihMamF2YS91dGlsL1RyZWVNYXAkRW50cnk8VEs7VFY7PjspTGphdmEvdXRpbC9UcmVlTWFwJEVudHJ5PFRLO1RWOz47ICkKLXN0YXRpYyBqYXZhLnV0aWwuVHJlZU1hcCRFbnRyeSBtaW5pbXVtKAotamF2YS51dGlsLlRyZWVNYXAkRW50cnkpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEs6TGphdmEvbGFuZy9PYmplY3Q7VjpMamF2YS9sYW5nL09iamVjdDs+KExqYXZhL3V0aWwvVHJlZU1hcCRFbnRyeTxUSztUVjs+OylMamF2YS91dGlsL1RyZWVNYXAkRW50cnk8VEs7VFY7PjsgKQotc3RhdGljIGphdmEudXRpbC5UcmVlTWFwJEVudHJ5IHByZWRlY2Vzc29yKAotamF2YS51dGlsLlRyZWVNYXAkRW50cnkpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRLOylMamF2YS91dGlsL1RyZWVNYXAkRW50cnk8VEs7VFY7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuVHJlZU1hcCRFbnRyeSByYkluc2VydCgKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgcmVhZE9iamVjdCgKLWphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvVHJlZU1hcCRFbnRyeTxUSztUVjs+OylWICkKLXByaXZhdGUgdm9pZCByaWdodFJvdGF0ZSgKLWphdmEudXRpbC5UcmVlTWFwJEVudHJ5KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxLOkxqYXZhL2xhbmcvT2JqZWN0O1Y6TGphdmEvbGFuZy9PYmplY3Q7PihMamF2YS91dGlsL1RyZWVNYXAkRW50cnk8VEs7VFY7PjspTGphdmEvdXRpbC9UcmVlTWFwJEVudHJ5PFRLO1RWOz47ICkKLXN0YXRpYyBqYXZhLnV0aWwuVHJlZU1hcCRFbnRyeSBzdWNjZXNzb3IoCi1qYXZhLnV0aWwuVHJlZU1hcCRFbnRyeSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+KFRUOylMamF2YS9sYW5nL0NvbXBhcmFibGU8VFQ7PjsgKQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLkNvbXBhcmFibGUgdG9Db21wYXJhYmxlKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KAotamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvVHJlZU1hcCRFbnRyeTxUSztUVjs+OylWICkKLSB2b2lkIGJhbGFuY2UoCi1qYXZhLnV0aWwuVHJlZU1hcCRFbnRyeSkKLQotcHVibGljIHZvaWQgY2xlYXIoKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBjbG9uZSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0NvbXBhcmF0b3I8LVRLOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuQ29tcGFyYXRvciBjb21wYXJhdG9yKCkKLQotcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYm9vbGVhbiBjb250YWluc1ZhbHVlKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvU2V0PExqYXZhL3V0aWwvTWFwJEVudHJ5PFRLO1RWOz47PjsgKQotcHVibGljIGphdmEudXRpbC5TZXQgZW50cnlTZXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL09iamVjdDspTGphdmEvdXRpbC9UcmVlTWFwJEVudHJ5PFRLO1RWOz47ICkKLSBqYXZhLnV0aWwuVHJlZU1hcCRFbnRyeSBmaW5kQWZ0ZXIoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUSzspTGphdmEvdXRpbC9UcmVlTWFwJEVudHJ5PFRLO1RWOz47ICkKLSBqYXZhLnV0aWwuVHJlZU1hcCRFbnRyeSBmaW5kQmVmb3JlKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVRLOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBmaXJzdEtleSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvT2JqZWN0OylUVjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0KAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEs7KUxqYXZhL3V0aWwvU29ydGVkTWFwPFRLO1RWOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuU29ydGVkTWFwIGhlYWRNYXAoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9TZXQ8VEs7PjsgKQotcHVibGljIGphdmEudXRpbC5TZXQga2V5U2V0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVRLOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBsYXN0S2V5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEs7VFY7KVRWOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBwdXQoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL01hcDwrVEs7K1RWOz47KVYgKQotcHVibGljIHZvaWQgcHV0QWxsKAotamF2YS51dGlsLk1hcCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9UcmVlTWFwJEVudHJ5PFRLO1RWOz47KVYgKQotIHZvaWQgcmJEZWxldGUoCi1qYXZhLnV0aWwuVHJlZU1hcCRFbnRyeSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9PYmplY3Q7KVRWOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCByZW1vdmUoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50IHNpemUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUSztUSzspTGphdmEvdXRpbC9Tb3J0ZWRNYXA8VEs7VFY7PjsgKQotcHVibGljIGphdmEudXRpbC5Tb3J0ZWRNYXAgc3ViTWFwKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEs7KUxqYXZhL3V0aWwvU29ydGVkTWFwPFRLO1RWOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuU29ydGVkTWFwIHRhaWxNYXAoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9Db2xsZWN0aW9uPFRWOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuQ29sbGVjdGlvbiB2YWx1ZXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08RTpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvdXRpbC9BYnN0cmFjdFNldDxURTs+O0xqYXZhL3V0aWwvU29ydGVkU2V0PFRFOz47TGphdmEvbGFuZy9DbG9uZWFibGU7TGphdmEvaW8vU2VyaWFsaXphYmxlOyApCi1wdWJsaWMgY2xhc3MgamF2YS51dGlsLlRyZWVTZXQgZXh0ZW5kcyBqYXZhLnV0aWwuQWJzdHJhY3RTZXQgaW1wbGVtZW50cyBqYXZhLnV0aWwuU29ydGVkU2V0LCBqYXZhLmxhbmcuQ2xvbmVhYmxlLCBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL1NvcnRlZE1hcDxURTtURTs+OyApCi1wcml2YXRlIHRyYW5zaWVudCBqYXZhLnV0aWwuU29ydGVkTWFwIGJhY2tpbmdNYXAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0NvbGxlY3Rpb248K1RFOz47KVYgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkNvbGxlY3Rpb24pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvQ29tcGFyYXRvcjwtVEU7PjspViApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuQ29tcGFyYXRvcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9Tb3J0ZWRNYXA8VEU7VEU7PjspViApCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLlNvcnRlZE1hcCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9Tb3J0ZWRTZXQ8VEU7PjspViApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuU29ydGVkU2V0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL2xhbmcvQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoCi1qYXZhLmlvLk9iamVjdElucHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoCi1qYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEU7KVogKQotcHVibGljIGJvb2xlYW4gYWRkKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9Db2xsZWN0aW9uPCtURTs+OylaICkKLXB1YmxpYyBib29sZWFuIGFkZEFsbCgKLWphdmEudXRpbC5Db2xsZWN0aW9uKQotCi1wdWJsaWMgdm9pZCBjbGVhcigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGNsb25lKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvQ29tcGFyYXRvcjwtVEU7PjsgKQotcHVibGljIGphdmEudXRpbC5Db21wYXJhdG9yIGNvbXBhcmF0b3IoKQotCi1wdWJsaWMgYm9vbGVhbiBjb250YWlucygKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClURTsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZmlyc3QoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShURTspTGphdmEvdXRpbC9Tb3J0ZWRTZXQ8VEU7PjsgKQotcHVibGljIGphdmEudXRpbC5Tb3J0ZWRTZXQgaGVhZFNldCgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9JdGVyYXRvcjxURTs+OyApCi1wdWJsaWMgamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXJhdG9yKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVRFOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBsYXN0KCkKLQotcHVibGljIGJvb2xlYW4gcmVtb3ZlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGludCBzaXplKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEU7VEU7KUxqYXZhL3V0aWwvU29ydGVkU2V0PFRFOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuU29ydGVkU2V0IHN1YlNldCgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRFOylMamF2YS91dGlsL1NvcnRlZFNldDxURTs+OyApCi1wdWJsaWMgamF2YS51dGlsLlNvcnRlZFNldCB0YWlsU2V0KAotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvaW8vU2VyaWFsaXphYmxlO0xqYXZhL2xhbmcvQ29tcGFyYWJsZTxMamF2YS91dGlsL1VVSUQ7PjsgKQotcHVibGljIGZpbmFsIGNsYXNzIGphdmEudXRpbC5VVUlEIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlLCBqYXZhLmxhbmcuQ29tcGFyYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgYm9vbGVhbiAkYXNzZXJ0aW9uc0Rpc2FibGVkCi0KLXByaXZhdGUgc3RhdGljIGphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tIHJuZwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSB0cmFuc2llbnQgaW50IGNsb2NrU2VxdWVuY2UKLQotcHJpdmF0ZSB0cmFuc2llbnQgaW50IGhhc2gKLQotcHJpdmF0ZSBsb25nIGxlYXN0U2lnQml0cwotCi1wcml2YXRlIGxvbmcgbW9zdFNpZ0JpdHMKLQotcHJpdmF0ZSB0cmFuc2llbnQgbG9uZyBub2RlCi0KLXByaXZhdGUgdHJhbnNpZW50IGxvbmcgdGltZXN0YW1wCi0KLXByaXZhdGUgdHJhbnNpZW50IGludCB2YXJpYW50Ci0KLXByaXZhdGUgdHJhbnNpZW50IGludCB2ZXJzaW9uCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1sb25nCi1sb25nKQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5VVUlEIGZyb21TdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHZvaWQgaW5pdCgpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlVVSUQgbmFtZVVVSURGcm9tQnl0ZXMoCi1ieXRlW10pCi0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlVVSUQgcmFuZG9tVVVJRCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgcmVhZE9iamVjdCgKLWphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0pCi0KLXB1YmxpYyBpbnQgY2xvY2tTZXF1ZW5jZSgpCi0KLXB1YmxpYyB2b2xhdGlsZSBpbnQgY29tcGFyZVRvKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGludCBjb21wYXJlVG8oCi1qYXZhLnV0aWwuVVVJRCkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGxvbmcgZ2V0TGVhc3RTaWduaWZpY2FudEJpdHMoKQotCi1wdWJsaWMgbG9uZyBnZXRNb3N0U2lnbmlmaWNhbnRCaXRzKCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLXB1YmxpYyBsb25nIG5vZGUoKQotCi1wdWJsaWMgbG9uZyB0aW1lc3RhbXAoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLXB1YmxpYyBpbnQgdmFyaWFudCgpCi0KLXB1YmxpYyBpbnQgdmVyc2lvbigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS51dGlsLlVua25vd25Gb3JtYXRDb252ZXJzaW9uRXhjZXB0aW9uIGV4dGVuZHMgamF2YS51dGlsLklsbGVnYWxGb3JtYXRFeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Q29udmVyc2lvbigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE1lc3NhZ2UoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEudXRpbC5Vbmtub3duRm9ybWF0RmxhZ3NFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLnV0aWwuSWxsZWdhbEZvcm1hdEV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGZsYWdzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RmxhZ3MoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRNZXNzYWdlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvdXRpbC9FbnVtZXJhdGlvbjxURTs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi0gY2xhc3MgamF2YS51dGlsLlZlY3RvciQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudXRpbC5FbnVtZXJhdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gaW50IHBvcwotCi1maW5hbCBqYXZhLnV0aWwuVmVjdG9yIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEudXRpbC5WZWN0b3IpCi0KLXB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClURTsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgbmV4dEVsZW1lbnQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTU0NCBuYW1lID1UeXBlICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08UjpMamF2YS9sYW5nL09iamVjdDtLOkxqYXZhL2xhbmcvT2JqZWN0O1Y6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL2xhbmcvT2JqZWN0OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL1dlYWtIYXNoTWFwJEVudHJ5OyApCi1hYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgamF2YS51dGlsLldlYWtIYXNoTWFwJEVudHJ5JFR5cGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9NYXAkRW50cnk8VEs7VFY7PjspVFI7ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuT2JqZWN0IGdldCgKLWphdmEudXRpbC5NYXAkRW50cnkpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3V0aWwvV2Vha0hhc2hNYXAkRW50cnkkVHlwZTxMamF2YS91dGlsL01hcCRFbnRyeTxUSztUVjs+O1RLO1RWOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLSBjbGFzcyBqYXZhLnV0aWwuV2Vha0hhc2hNYXAkMSQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudXRpbC5XZWFrSGFzaE1hcCRFbnRyeSRUeXBlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGphdmEudXRpbC5XZWFrSGFzaE1hcCQxIHRoaXMkMQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEudXRpbC5XZWFrSGFzaE1hcCQxKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBnZXQoCi1qYXZhLnV0aWwuTWFwJEVudHJ5KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL01hcCRFbnRyeTxUSztUVjs+OylMamF2YS91dGlsL01hcCRFbnRyeTxUSztUVjs+OyApCi1wdWJsaWMgamF2YS51dGlsLk1hcCRFbnRyeSBnZXQoCi1qYXZhLnV0aWwuTWFwJEVudHJ5KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0Fic3RyYWN0U2V0PExqYXZhL3V0aWwvTWFwJEVudHJ5PFRLO1RWOz47PjsgKQotIGNsYXNzIGphdmEudXRpbC5XZWFrSGFzaE1hcCQxIGV4dGVuZHMgamF2YS51dGlsLkFic3RyYWN0U2V0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGphdmEudXRpbC5XZWFrSGFzaE1hcCB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuV2Vha0hhc2hNYXApCi0KLXB1YmxpYyB2b2lkIGNsZWFyKCkKLQotcHVibGljIGJvb2xlYW4gY29udGFpbnMoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9JdGVyYXRvcjxMamF2YS91dGlsL01hcCRFbnRyeTxUSztUVjs+Oz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuSXRlcmF0b3IgaXRlcmF0b3IoKQotCi1wdWJsaWMgYm9vbGVhbiByZW1vdmUoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50IHNpemUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS91dGlsL1dlYWtIYXNoTWFwJEVudHJ5JFR5cGU8VEs7VEs7VFY7PjsgKQotIGNsYXNzIGphdmEudXRpbC5XZWFrSGFzaE1hcCQyJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLldlYWtIYXNoTWFwJEVudHJ5JFR5cGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgamF2YS51dGlsLldlYWtIYXNoTWFwJDIgdGhpcyQxCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLldlYWtIYXNoTWFwJDIpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTWFwJEVudHJ5PFRLO1RWOz47KVRLOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXQoCi1qYXZhLnV0aWwuTWFwJEVudHJ5KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0Fic3RyYWN0U2V0PFRLOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLSBjbGFzcyBqYXZhLnV0aWwuV2Vha0hhc2hNYXAkMiBleHRlbmRzIGphdmEudXRpbC5BYnN0cmFjdFNldAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBqYXZhLnV0aWwuV2Vha0hhc2hNYXAgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLldlYWtIYXNoTWFwKQotCi1wdWJsaWMgdm9pZCBjbGVhcigpCi0KLXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvSXRlcmF0b3I8VEs7PjsgKQotcHVibGljIGphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvcigpCi0KLXB1YmxpYyBib29sZWFuIHJlbW92ZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBpbnQgc2l6ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3V0aWwvV2Vha0hhc2hNYXAkRW50cnkkVHlwZTxUVjtUSztUVjs+OyApCi0gY2xhc3MgamF2YS51dGlsLldlYWtIYXNoTWFwJDMkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuV2Vha0hhc2hNYXAkRW50cnkkVHlwZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBqYXZhLnV0aWwuV2Vha0hhc2hNYXAkMyB0aGlzJDEKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuV2Vha0hhc2hNYXAkMykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9NYXAkRW50cnk8VEs7VFY7PjspVFY7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldCgKLWphdmEudXRpbC5NYXAkRW50cnkpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQWJzdHJhY3RDb2xsZWN0aW9uPFRWOz47ICkKLSBjbGFzcyBqYXZhLnV0aWwuV2Vha0hhc2hNYXAkMyBleHRlbmRzIGphdmEudXRpbC5BYnN0cmFjdENvbGxlY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgamF2YS51dGlsLldlYWtIYXNoTWFwIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEudXRpbC5XZWFrSGFzaE1hcCkKLQotcHVibGljIHZvaWQgY2xlYXIoKQotCi1wdWJsaWMgYm9vbGVhbiBjb250YWlucygKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0l0ZXJhdG9yPFRWOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuSXRlcmF0b3IgaXRlcmF0b3IoKQotCi1wdWJsaWMgaW50IHNpemUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08SzpMamF2YS9sYW5nL09iamVjdDtWOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS9sYW5nL3JlZi9XZWFrUmVmZXJlbmNlPFRLOz47TGphdmEvdXRpbC9NYXAkRW50cnk8VEs7VFY7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MamF2YS91dGlsL1dlYWtIYXNoTWFwJEVudHJ5JFR5cGU7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvV2Vha0hhc2hNYXA7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjYgbmFtZSA9RW50cnkgKQotZmluYWwgY2xhc3MgamF2YS51dGlsLldlYWtIYXNoTWFwJEVudHJ5IGV4dGVuZHMgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlIGltcGxlbWVudHMgamF2YS51dGlsLk1hcCRFbnRyeQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gaW50IGhhc2gKLQotIGJvb2xlYW4gaXNOdWxsCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9XZWFrSGFzaE1hcCRFbnRyeTxUSztUVjs+OyApCi0gamF2YS51dGlsLldlYWtIYXNoTWFwJEVudHJ5IG5leHQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1UVjsgKQotIGphdmEubGFuZy5PYmplY3QgdmFsdWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUSztUVjtMamF2YS9sYW5nL3JlZi9SZWZlcmVuY2VRdWV1ZTxUSzs+OylWICkKLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5yZWYuUmVmZXJlbmNlUXVldWUpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClUSzsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0S2V5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVRWOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRWYWx1ZSgpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUVjspVFY7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHNldFZhbHVlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1IYXNoSXRlcmF0b3IgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9XZWFrSGFzaE1hcDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxSOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS9sYW5nL09iamVjdDtMamF2YS91dGlsL0l0ZXJhdG9yPFRSOz47ICkKLSBjbGFzcyBqYXZhLnV0aWwuV2Vha0hhc2hNYXAkSGFzaEl0ZXJhdG9yIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudXRpbC5JdGVyYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvV2Vha0hhc2hNYXAkRW50cnk8VEs7VFY7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuV2Vha0hhc2hNYXAkRW50cnkgY3VycmVudEVudHJ5Ci0KLXByaXZhdGUgaW50IGV4cGVjdGVkTW9kQ291bnQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL1dlYWtIYXNoTWFwJEVudHJ5PFRLO1RWOz47ICkKLXByaXZhdGUgamF2YS51dGlsLldlYWtIYXNoTWFwJEVudHJ5IG5leHRFbnRyeQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPVRLOyApCi1wcml2YXRlIGphdmEubGFuZy5PYmplY3QgbmV4dEtleQotCi1wcml2YXRlIGludCBwb3NpdGlvbgotCi1maW5hbCBqYXZhLnV0aWwuV2Vha0hhc2hNYXAgdGhpcyQwCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9XZWFrSGFzaE1hcCRFbnRyeSRUeXBlPFRSO1RLO1RWOz47ICkKLWZpbmFsIGphdmEudXRpbC5XZWFrSGFzaE1hcCRFbnRyeSRUeXBlIHR5cGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL1dlYWtIYXNoTWFwJEVudHJ5JFR5cGU8VFI7VEs7VFY7PjspViApCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuV2Vha0hhc2hNYXAKLWphdmEudXRpbC5XZWFrSGFzaE1hcCRFbnRyeSRUeXBlKQotCi1wdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVRSOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBuZXh0KCkKLQotcHVibGljIHZvaWQgcmVtb3ZlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEs6TGphdmEvbGFuZy9PYmplY3Q7VjpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvdXRpbC9BYnN0cmFjdE1hcDxUSztUVjs+O0xqYXZhL3V0aWwvTWFwPFRLO1RWOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGphdmEvdXRpbC9XZWFrSGFzaE1hcCRIYXNoSXRlcmF0b3I7TGphdmEvdXRpbC9XZWFrSGFzaE1hcCRFbnRyeTsgKQotcHVibGljIGNsYXNzIGphdmEudXRpbC5XZWFrSGFzaE1hcCBleHRlbmRzIGphdmEudXRpbC5BYnN0cmFjdE1hcCBpbXBsZW1lbnRzIGphdmEudXRpbC5NYXAKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfU0laRQotCi0gaW50IGVsZW1lbnRDb3VudAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPVtMamF2YS91dGlsL1dlYWtIYXNoTWFwJEVudHJ5PFRLO1RWOz47ICkKLSBqYXZhLnV0aWwuV2Vha0hhc2hNYXAkRW50cnlbXSBlbGVtZW50RGF0YQotCi1wcml2YXRlIGZpbmFsIGludCBsb2FkRmFjdG9yCi0KLXZvbGF0aWxlIGludCBtb2RDb3VudAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvcmVmL1JlZmVyZW5jZVF1ZXVlPFRLOz47ICkKLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2VRdWV1ZSByZWZlcmVuY2VRdWV1ZQotCi1wcml2YXRlIGludCB0aHJlc2hvbGQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotZmxvYXQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTWFwPCtUSzsrVFY7PjspViApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuTWFwKQotCi1wcml2YXRlIHZvaWQgY29tcHV0ZU1heFNpemUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxLOkxqYXZhL2xhbmcvT2JqZWN0O1Y6TGphdmEvbGFuZy9PYmplY3Q7PihJKVtMamF2YS91dGlsL1dlYWtIYXNoTWFwJEVudHJ5PFRLO1RWOz47ICkKLXByaXZhdGUgc3RhdGljIGphdmEudXRpbC5XZWFrSGFzaE1hcCRFbnRyeVtdIG5ld0VudHJ5QXJyYXkoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTWFwPCtUSzsrVFY7PjspViApCi1wcml2YXRlIHZvaWQgcHV0QWxsSW1wbCgKLWphdmEudXRpbC5NYXApCi0KLXByaXZhdGUgdm9pZCByZWhhc2goKQotCi1wdWJsaWMgdm9pZCBjbGVhcigpCi0KLXB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGJvb2xlYW4gY29udGFpbnNWYWx1ZSgKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL1NldDxMamF2YS91dGlsL01hcCRFbnRyeTxUSztUVjs+Oz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuU2V0IGVudHJ5U2V0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9PYmplY3Q7KVRWOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXQoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL09iamVjdDspTGphdmEvdXRpbC9XZWFrSGFzaE1hcCRFbnRyeTxUSztUVjs+OyApCi0gamF2YS51dGlsLldlYWtIYXNoTWFwJEVudHJ5IGdldEVudHJ5KAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL1NldDxUSzs+OyApCi1wdWJsaWMgamF2YS51dGlsLlNldCBrZXlTZXQoKQotCi0gdm9pZCBwb2xsKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEs7VFY7KVRWOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBwdXQoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL01hcDwrVEs7K1RWOz47KVYgKQotcHVibGljIHZvaWQgcHV0QWxsKAotamF2YS51dGlsLk1hcCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9PYmplY3Q7KVRWOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCByZW1vdmUoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL1dlYWtIYXNoTWFwJEVudHJ5PFRLO1RWOz47KVYgKQotIHZvaWQgcmVtb3ZlRW50cnkoCi1qYXZhLnV0aWwuV2Vha0hhc2hNYXAkRW50cnkpCi0KLXB1YmxpYyBpbnQgc2l6ZSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0NvbGxlY3Rpb248VFY7PjsgKQotcHVibGljIGphdmEudXRpbC5Db2xsZWN0aW9uIHZhbHVlcygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi0gY2xhc3MgamF2YS51dGlsLlpvbmVJbmZvIGV4dGVuZHMgamF2YS51dGlsLlRpbWVab25lCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIExFQVAKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBNSUxMSVNFQ09ORFNfUEVSXzQwMF9ZRUFSUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIE1JTExJU0VDT05EU19QRVJfREFZCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIE5PUk1BTAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFVOSVhfT0ZGU0VUCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtRGF5bGlnaHROYW1lCi0KLXByaXZhdGUgaW50W10gbUdtdE9mZnMKLQotcHJpdmF0ZSBieXRlW10gbUlzRHN0cwotCi1wcml2YXRlIGludCBtUmF3T2Zmc2V0Ci0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtU3RhbmRhcmROYW1lCi0KLXByaXZhdGUgaW50W10gbVRyYW5zaXRpb25zCi0KLXByaXZhdGUgYnl0ZVtdIG1UeXBlcwotCi1wcml2YXRlIGJvb2xlYW4gbVVzZURzdAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50W10KLWJ5dGVbXQotaW50W10KLWJ5dGVbXQotYnl0ZVtdCi1ieXRlW10KLWludCkKLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVGltZVpvbmUgZ2V0VGltZVpvbmUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIG51bGxOYW1lKAotYnl0ZVtdCi1pbnQKLWludCkKLQotcHVibGljIGludCBnZXRPZmZzZXQoCi1pbnQKLWludAotaW50Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgaW50IGdldE9mZnNldCgKLWxvbmcpCi0KLXB1YmxpYyBpbnQgZ2V0UmF3T2Zmc2V0KCkKLQotcHVibGljIGJvb2xlYW4gaW5EYXlsaWdodFRpbWUoCi1qYXZhLnV0aWwuRGF0ZSkKLQotcHVibGljIHZvaWQgc2V0UmF3T2Zmc2V0KAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiB1c2VEYXlsaWdodFRpbWUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvWm9uZUluZm9EQjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPU1pbmltYWxUaW1lWm9uZSApCi0gY2xhc3MgamF2YS51dGlsLlpvbmVJbmZvREIkTWluaW1hbFRpbWVab25lIGV4dGVuZHMgamF2YS51dGlsLlRpbWVab25lCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgaW50IHJhd09mZnNldAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludCkKLQotcHVibGljIGludCBnZXRPZmZzZXQoCi1pbnQKLWludAotaW50Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgaW50IGdldFJhd09mZnNldCgpCi0KLXB1YmxpYyBib29sZWFuIGluRGF5bGlnaHRUaW1lKAotamF2YS51dGlsLkRhdGUpCi0KLXB1YmxpYyB2b2lkIHNldFJhd09mZnNldCgKLWludCkKLQotcHVibGljIGJvb2xlYW4gdXNlRGF5bGlnaHRUaW1lKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxqYXZhL3V0aWwvWm9uZUluZm9EQiRNaW5pbWFsVGltZVpvbmU7ICkKLWZpbmFsIGNsYXNzIGphdmEudXRpbC5ab25lSW5mb0RCIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIElOREVYX0ZJTEVfTkFNRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFpJTlRfTEVOR1RICi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUWk5BTUVfTEVOR1RICi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgWk9ORV9ESVJFQ1RPUllfTkFNRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFpPTkVfRklMRV9OQU1FCi0KLXByaXZhdGUgc3RhdGljIGphdmEudXRpbC5UaW1lWm9uZSBkZWZhdWx0Wm9uZQotCi1wcml2YXRlIHN0YXRpYyBpbnRbXSBsZW5ndGhzCi0KLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5PYmplY3QgbG9jawotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nW10gbmFtZXMKLQotcHJpdmF0ZSBzdGF0aWMgaW50W10gb2Zmc2V0cwotCi1wcml2YXRlIHN0YXRpYyBpbnRbXSBzdGFydHMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nW10gX2dldEF2YWlsYWJsZUlEcygKLWludAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotc3RhdGljIGphdmEudXRpbC5UaW1lWm9uZSBfZ2V0VGltZVpvbmUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmdbXSBnZXRBdmFpbGFibGVJRHMoKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmdbXSBnZXRBdmFpbGFibGVJRHMoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlRpbWVab25lIGdldERlZmF1bHQoKQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5UaW1lWm9uZSBnZXRUaW1lWm9uZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgc3RhdGljIHZvaWQgaW5pdCgpCi0KLXByaXZhdGUgc3RhdGljIGludCBwYXJzZU51bWVyaWNab25lKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBzdGF0aWMgaW50IHJlYWQ0KAotYnl0ZVtdCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgc2NhbkZvclpvbmVzKAotamF2YS5pby5GaWxlCi1qYXZhLnV0aWwuU2V0Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBzZXREZWZhdWx0KAotamF2YS51dGlsLlRpbWVab25lKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBleGVjdXRlKAotamF2YS5sYW5nLlJ1bm5hYmxlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2UgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSW50ZXJydXB0ZWRFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGF3YWl0VGVybWluYXRpb24oCi1sb25nCi1qYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+KExqYXZhL3V0aWwvQ29sbGVjdGlvbjxMamF2YS91dGlsL2NvbmN1cnJlbnQvQ2FsbGFibGU8VFQ7Pjs+OylMamF2YS91dGlsL0xpc3Q8TGphdmEvdXRpbC9jb25jdXJyZW50L0Z1dHVyZTxUVDs+Oz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0ludGVycnVwdGVkRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLkxpc3QgaW52b2tlQWxsKAotamF2YS51dGlsLkNvbGxlY3Rpb24pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFQ6TGphdmEvbGFuZy9PYmplY3Q7PihMamF2YS91dGlsL0NvbGxlY3Rpb248TGphdmEvdXRpbC9jb25jdXJyZW50L0NhbGxhYmxlPFRUOz47PjtKTGphdmEvdXRpbC9jb25jdXJyZW50L1RpbWVVbml0OylMamF2YS91dGlsL0xpc3Q8TGphdmEvdXRpbC9jb25jdXJyZW50L0Z1dHVyZTxUVDs+Oz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0ludGVycnVwdGVkRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLkxpc3QgaW52b2tlQWxsKAotamF2YS51dGlsLkNvbGxlY3Rpb24KLWxvbmcKLWphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSW50ZXJydXB0ZWRFeGNlcHRpb247TGphdmEvdXRpbC9jb25jdXJyZW50L0V4ZWN1dGlvbkV4Y2VwdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz4oTGphdmEvdXRpbC9Db2xsZWN0aW9uPExqYXZhL3V0aWwvY29uY3VycmVudC9DYWxsYWJsZTxUVDs+Oz47KVRUOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLk9iamVjdCBpbnZva2VBbnkoCi1qYXZhLnV0aWwuQ29sbGVjdGlvbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0ludGVycnVwdGVkRXhjZXB0aW9uO0xqYXZhL3V0aWwvY29uY3VycmVudC9FeGVjdXRpb25FeGNlcHRpb247TGphdmEvdXRpbC9jb25jdXJyZW50L1RpbWVvdXRFeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+KExqYXZhL3V0aWwvQ29sbGVjdGlvbjxMamF2YS91dGlsL2NvbmN1cnJlbnQvQ2FsbGFibGU8VFQ7Pjs+O0pMamF2YS91dGlsL2NvbmN1cnJlbnQvVGltZVVuaXQ7KVRUOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLk9iamVjdCBpbnZva2VBbnkoCi1qYXZhLnV0aWwuQ29sbGVjdGlvbgotbG9uZwotamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzU2h1dGRvd24oKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1Rlcm1pbmF0ZWQoKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzaHV0ZG93bigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0xpc3Q8TGphdmEvbGFuZy9SdW5uYWJsZTs+OyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLkxpc3Qgc2h1dGRvd25Ob3coKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1J1bm5hYmxlOylMamF2YS91dGlsL2NvbmN1cnJlbnQvRnV0dXJlPCo+OyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlIHN1Ym1pdCgKLWphdmEubGFuZy5SdW5uYWJsZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+KExqYXZhL2xhbmcvUnVubmFibGU7VFQ7KUxqYXZhL3V0aWwvY29uY3VycmVudC9GdXR1cmU8VFQ7PjsgKQotcHVibGljIGFic3RyYWN0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZSBzdWJtaXQoCi1qYXZhLmxhbmcuUnVubmFibGUKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFQ6TGphdmEvbGFuZy9PYmplY3Q7PihMamF2YS91dGlsL2NvbmN1cnJlbnQvQ2FsbGFibGU8VFQ7PjspTGphdmEvdXRpbC9jb25jdXJyZW50L0Z1dHVyZTxUVDs+OyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlIHN1Ym1pdCgKLWphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGphdmEudXRpbC5jb25jdXJyZW50LkFic3RyYWN0RXhlY3V0b3JTZXJ2aWNlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgYm9vbGVhbiAkYXNzZXJ0aW9uc0Rpc2FibGVkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSW50ZXJydXB0ZWRFeGNlcHRpb247TGphdmEvdXRpbC9jb25jdXJyZW50L0V4ZWN1dGlvbkV4Y2VwdGlvbjtMamF2YS91dGlsL2NvbmN1cnJlbnQvVGltZW91dEV4Y2VwdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz4oTGphdmEvdXRpbC9Db2xsZWN0aW9uPExqYXZhL3V0aWwvY29uY3VycmVudC9DYWxsYWJsZTxUVDs+Oz47WkopVFQ7ICkKLXByaXZhdGUgamF2YS5sYW5nLk9iamVjdCBkb0ludm9rZUFueSgKLWphdmEudXRpbC5Db2xsZWN0aW9uCi1ib29sZWFuCi1sb25nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz4oTGphdmEvdXRpbC9Db2xsZWN0aW9uPExqYXZhL3V0aWwvY29uY3VycmVudC9DYWxsYWJsZTxUVDs+Oz47KUxqYXZhL3V0aWwvTGlzdDxMamF2YS91dGlsL2NvbmN1cnJlbnQvRnV0dXJlPFRUOz47PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSW50ZXJydXB0ZWRFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBpbnZva2VBbGwoCi1qYXZhLnV0aWwuQ29sbGVjdGlvbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+KExqYXZhL3V0aWwvQ29sbGVjdGlvbjxMamF2YS91dGlsL2NvbmN1cnJlbnQvQ2FsbGFibGU8VFQ7Pjs+O0pMamF2YS91dGlsL2NvbmN1cnJlbnQvVGltZVVuaXQ7KUxqYXZhL3V0aWwvTGlzdDxMamF2YS91dGlsL2NvbmN1cnJlbnQvRnV0dXJlPFRUOz47PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSW50ZXJydXB0ZWRFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBpbnZva2VBbGwoCi1qYXZhLnV0aWwuQ29sbGVjdGlvbgotbG9uZwotamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFQ6TGphdmEvbGFuZy9PYmplY3Q7PihMamF2YS91dGlsL0NvbGxlY3Rpb248TGphdmEvdXRpbC9jb25jdXJyZW50L0NhbGxhYmxlPFRUOz47PjspVFQ7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0ludGVycnVwdGVkRXhjZXB0aW9uO0xqYXZhL3V0aWwvY29uY3VycmVudC9FeGVjdXRpb25FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGludm9rZUFueSgKLWphdmEudXRpbC5Db2xsZWN0aW9uKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz4oTGphdmEvdXRpbC9Db2xsZWN0aW9uPExqYXZhL3V0aWwvY29uY3VycmVudC9DYWxsYWJsZTxUVDs+Oz47SkxqYXZhL3V0aWwvY29uY3VycmVudC9UaW1lVW5pdDspVFQ7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0ludGVycnVwdGVkRXhjZXB0aW9uO0xqYXZhL3V0aWwvY29uY3VycmVudC9FeGVjdXRpb25FeGNlcHRpb247TGphdmEvdXRpbC9jb25jdXJyZW50L1RpbWVvdXRFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGludm9rZUFueSgKLWphdmEudXRpbC5Db2xsZWN0aW9uCi1sb25nCi1qYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9SdW5uYWJsZTspTGphdmEvdXRpbC9jb25jdXJyZW50L0Z1dHVyZTwqPjsgKQotcHVibGljIGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZSBzdWJtaXQoCi1qYXZhLmxhbmcuUnVubmFibGUpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFQ6TGphdmEvbGFuZy9PYmplY3Q7PihMamF2YS9sYW5nL1J1bm5hYmxlO1RUOylMamF2YS91dGlsL2NvbmN1cnJlbnQvRnV0dXJlPFRUOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmUgc3VibWl0KAotamF2YS5sYW5nLlJ1bm5hYmxlCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz4oTGphdmEvdXRpbC9jb25jdXJyZW50L0NhbGxhYmxlPFRUOz47KUxqYXZhL3V0aWwvY29uY3VycmVudC9GdXR1cmU8VFQ7PjsgKQotcHVibGljIGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZSBzdWJtaXQoCi1qYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTIgbmFtZSA9SXRyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS91dGlsL0l0ZXJhdG9yPFRFOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvY29uY3VycmVudC9BcnJheUJsb2NraW5nUXVldWU7ICkKLSBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5BcnJheUJsb2NraW5nUXVldWUkSXRyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudXRpbC5JdGVyYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGludCBsYXN0UmV0Ci0KLXByaXZhdGUgaW50IG5leHRJbmRleAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPVRFOyApCi1wcml2YXRlIGphdmEubGFuZy5PYmplY3QgbmV4dEl0ZW0KLQotZmluYWwgamF2YS51dGlsLmNvbmN1cnJlbnQuQXJyYXlCbG9ja2luZ1F1ZXVlIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEudXRpbC5jb25jdXJyZW50LkFycmF5QmxvY2tpbmdRdWV1ZSkKLQotcHJpdmF0ZSB2b2lkIGNoZWNrTmV4dCgpCi0KLXB1YmxpYyBib29sZWFuIGhhc05leHQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVEU7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IG5leHQoKQotCi1wdWJsaWMgdm9pZCByZW1vdmUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08RTpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvdXRpbC9RdWV1ZTxURTs+OyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEudXRpbC5jb25jdXJyZW50LkJsb2NraW5nUXVldWUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLlF1ZXVlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEU7KVogKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gYWRkKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9Db2xsZWN0aW9uPC1URTs+OylJICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgZHJhaW5UbygKLWphdmEudXRpbC5Db2xsZWN0aW9uKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0NvbGxlY3Rpb248LVRFOz47SSlJICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgZHJhaW5UbygKLWphdmEudXRpbC5Db2xsZWN0aW9uCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRFOylaICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIG9mZmVyKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEU7SkxqYXZhL3V0aWwvY29uY3VycmVudC9UaW1lVW5pdDspWiApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbnRlcnJ1cHRlZEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gb2ZmZXIoCi1qYXZhLmxhbmcuT2JqZWN0Ci1sb25nCi1qYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0ludGVycnVwdGVkRXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KEpMamF2YS91dGlsL2NvbmN1cnJlbnQvVGltZVVuaXQ7KVRFOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLk9iamVjdCBwb2xsKAotbG9uZwotamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbnRlcnJ1cHRlZEV4Y2VwdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShURTspViApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBwdXQoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IHJlbWFpbmluZ0NhcGFjaXR5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVRFOyApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbnRlcnJ1cHRlZEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5PYmplY3QgdGFrZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MamF2YS91dGlsL2NvbmN1cnJlbnQvQXJyYXlCbG9ja2luZ1F1ZXVlJEl0cjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxFOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS91dGlsL0Fic3RyYWN0UXVldWU8VEU7PjtMamF2YS91dGlsL2NvbmN1cnJlbnQvQmxvY2tpbmdRdWV1ZTxURTs+O0xqYXZhL2lvL1NlcmlhbGl6YWJsZTsgKQotcHVibGljIGNsYXNzIGphdmEudXRpbC5jb25jdXJyZW50LkFycmF5QmxvY2tpbmdRdWV1ZSBleHRlbmRzIGphdmEudXRpbC5BYnN0cmFjdFF1ZXVlIGltcGxlbWVudHMgamF2YS51dGlsLmNvbmN1cnJlbnQuQmxvY2tpbmdRdWV1ZSwgamF2YS5pby5TZXJpYWxpemFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0KLXByaXZhdGUgaW50IGNvdW50Ci1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9W1RFOyApCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5PYmplY3RbXSBpdGVtcwotCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudExvY2sgbG9jawotCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkNvbmRpdGlvbiBub3RFbXB0eQotCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkNvbmRpdGlvbiBub3RGdWxsCi0KLXByaXZhdGUgdHJhbnNpZW50IGludCBwdXRJbmRleAotCi1wcml2YXRlIHRyYW5zaWVudCBpbnQgdGFrZUluZGV4Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KElaTGphdmEvdXRpbC9Db2xsZWN0aW9uPCtURTs+OylWICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotYm9vbGVhbgotamF2YS51dGlsLkNvbGxlY3Rpb24pCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDAwMCgKLWphdmEudXRpbC5jb25jdXJyZW50LkFycmF5QmxvY2tpbmdRdWV1ZSkKLQotc3RhdGljIGludCBhY2Nlc3MkMTAwKAotamF2YS51dGlsLmNvbmN1cnJlbnQuQXJyYXlCbG9ja2luZ1F1ZXVlKQotCi1zdGF0aWMgamF2YS5sYW5nLk9iamVjdFtdIGFjY2VzcyQyMDAoCi1qYXZhLnV0aWwuY29uY3VycmVudC5BcnJheUJsb2NraW5nUXVldWUpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDMwMCgKLWphdmEudXRpbC5jb25jdXJyZW50LkFycmF5QmxvY2tpbmdRdWV1ZSkKLQotc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudExvY2sgYWNjZXNzJDQwMCgKLWphdmEudXRpbC5jb25jdXJyZW50LkFycmF5QmxvY2tpbmdRdWV1ZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVRFOyApCi1wcml2YXRlIGphdmEubGFuZy5PYmplY3QgZXh0cmFjdCgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRFOylWICkKLXByaXZhdGUgdm9pZCBpbnNlcnQoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgdm9pZCBjbGVhcigpCi0KLXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9Db2xsZWN0aW9uPC1URTs+OylJICkKLXB1YmxpYyBpbnQgZHJhaW5UbygKLWphdmEudXRpbC5Db2xsZWN0aW9uKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0NvbGxlY3Rpb248LVRFOz47SSlJICkKLXB1YmxpYyBpbnQgZHJhaW5UbygKLWphdmEudXRpbC5Db2xsZWN0aW9uCi1pbnQpCi0KLWZpbmFsIGludCBpbmMoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0l0ZXJhdG9yPFRFOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuSXRlcmF0b3IgaXRlcmF0b3IoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShURTspWiApCi1wdWJsaWMgYm9vbGVhbiBvZmZlcigKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbnRlcnJ1cHRlZEV4Y2VwdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShURTtKTGphdmEvdXRpbC9jb25jdXJyZW50L1RpbWVVbml0OylaICkKLXB1YmxpYyBib29sZWFuIG9mZmVyKAotamF2YS5sYW5nLk9iamVjdAotbG9uZwotamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClURTsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgcGVlaygpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClURTsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgcG9sbCgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KEpMamF2YS91dGlsL2NvbmN1cnJlbnQvVGltZVVuaXQ7KVRFOyApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbnRlcnJ1cHRlZEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgcG9sbCgKLWxvbmcKLWphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSW50ZXJydXB0ZWRFeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEU7KVYgKQotcHVibGljIHZvaWQgcHV0KAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGludCByZW1haW5pbmdDYXBhY2l0eSgpCi0KLXB1YmxpYyBib29sZWFuIHJlbW92ZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLSB2b2lkIHJlbW92ZUF0KAotaW50KQotCi1wdWJsaWMgaW50IHNpemUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVEU7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0ludGVycnVwdGVkRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCB0YWtlKCkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3RbXSB0b0FycmF5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+KFtUVDspW1RUOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdFtdIHRvQXJyYXkoCi1qYXZhLmxhbmcuT2JqZWN0W10pCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5Ccm9rZW5CYXJyaWVyRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLkV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VjpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvbGFuZy9PYmplY3Q7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0V4Y2VwdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVFY7ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuT2JqZWN0IGNhbGwoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEudXRpbC5jb25jdXJyZW50LkNhbmNlbGxhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5JbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFY6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL2xhbmcvT2JqZWN0OyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEudXRpbC5jb25jdXJyZW50LkNvbXBsZXRpb25TZXJ2aWNlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL2NvbmN1cnJlbnQvRnV0dXJlPFRWOz47ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmUgcG9sbCgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KEpMamF2YS91dGlsL2NvbmN1cnJlbnQvVGltZVVuaXQ7KUxqYXZhL3V0aWwvY29uY3VycmVudC9GdXR1cmU8VFY7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSW50ZXJydXB0ZWRFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmUgcG9sbCgKLWxvbmcKLWphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1J1bm5hYmxlO1RWOylMamF2YS91dGlsL2NvbmN1cnJlbnQvRnV0dXJlPFRWOz47ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmUgc3VibWl0KAotamF2YS5sYW5nLlJ1bm5hYmxlCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL2NvbmN1cnJlbnQvQ2FsbGFibGU8VFY7PjspTGphdmEvdXRpbC9jb25jdXJyZW50L0Z1dHVyZTxUVjs+OyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlIHN1Ym1pdCgKLWphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9jb25jdXJyZW50L0Z1dHVyZTxUVjs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbnRlcnJ1cHRlZEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZSB0YWtlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL2NvbmN1cnJlbnQvQ29uY3VycmVudEhhc2hNYXA7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAyNCBuYW1lID1IYXNoSXRlcmF0b3IgKQotYWJzdHJhY3QgY2xhc3MgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXAkSGFzaEl0ZXJhdG9yIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXAkSGFzaEVudHJ5W10gY3VycmVudFRhYmxlCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9jb25jdXJyZW50L0NvbmN1cnJlbnRIYXNoTWFwJEhhc2hFbnRyeTxUSztUVjs+OyApCi0gamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXAkSGFzaEVudHJ5IGxhc3RSZXR1cm5lZAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvY29uY3VycmVudC9Db25jdXJyZW50SGFzaE1hcCRIYXNoRW50cnk8VEs7VFY7PjsgKQotIGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwJEhhc2hFbnRyeSBuZXh0RW50cnkKLQotIGludCBuZXh0U2VnbWVudEluZGV4Ci0KLSBpbnQgbmV4dFRhYmxlSW5kZXgKLQotZmluYWwgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXAgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXApCi0KLWZpbmFsIHZvaWQgYWR2YW5jZSgpCi0KLXB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpCi0KLXB1YmxpYyBib29sZWFuIGhhc05leHQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9jb25jdXJyZW50L0NvbmN1cnJlbnRIYXNoTWFwJEhhc2hFbnRyeTxUSztUVjs+OyApCi0gamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXAkSGFzaEVudHJ5IG5leHRFbnRyeSgpCi0KLXB1YmxpYyB2b2lkIHJlbW92ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9jb25jdXJyZW50L0NvbmN1cnJlbnRIYXNoTWFwOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9jb25jdXJyZW50L0NvbmN1cnJlbnRIYXNoTWFwPFRLO1RWOz4uSGFzaEl0ZXJhdG9yO0xqYXZhL3V0aWwvTWFwJEVudHJ5PFRLO1RWOz47TGphdmEvdXRpbC9JdGVyYXRvcjxMamF2YS91dGlsL01hcCRFbnRyeTxUSztUVjs+Oz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTYgbmFtZSA9RW50cnlJdGVyYXRvciApCi1maW5hbCBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcCRFbnRyeUl0ZXJhdG9yIGV4dGVuZHMgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXAkSGFzaEl0ZXJhdG9yIGltcGxlbWVudHMgamF2YS51dGlsLk1hcCRFbnRyeSwgamF2YS51dGlsLkl0ZXJhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwKQotCi0gYm9vbGVhbiBlcSgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClUSzsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0S2V5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVRWOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRWYWx1ZSgpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBuZXh0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvTWFwJEVudHJ5PFRLO1RWOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuTWFwJEVudHJ5IG5leHQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUVjspVFY7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHNldFZhbHVlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvY29uY3VycmVudC9Db25jdXJyZW50SGFzaE1hcDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQWJzdHJhY3RTZXQ8TGphdmEvdXRpbC9NYXAkRW50cnk8VEs7VFY7Pjs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE2IG5hbWUgPUVudHJ5U2V0ICkKLWZpbmFsIGNsYXNzIGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwJEVudHJ5U2V0IGV4dGVuZHMgamF2YS51dGlsLkFic3RyYWN0U2V0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwKQotCi1wdWJsaWMgdm9pZCBjbGVhcigpCi0KLXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvSXRlcmF0b3I8TGphdmEvdXRpbC9NYXAkRW50cnk8VEs7VFY7Pjs+OyApCi1wdWJsaWMgamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXJhdG9yKCkKLQotcHVibGljIGJvb2xlYW4gcmVtb3ZlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGludCBzaXplKCkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3RbXSB0b0FycmF5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+KFtUVDspW1RUOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdFtdIHRvQXJyYXkoCi1qYXZhLmxhbmcuT2JqZWN0W10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxLOkxqYXZhL2xhbmcvT2JqZWN0O1Y6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL2xhbmcvT2JqZWN0OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI0IG5hbWUgPUhhc2hFbnRyeSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL2NvbmN1cnJlbnQvQ29uY3VycmVudEhhc2hNYXA7ICkKLWZpbmFsIGNsYXNzIGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwJEhhc2hFbnRyeSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgaW50IGhhc2gKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1USzsgKQotZmluYWwgamF2YS5sYW5nLk9iamVjdCBrZXkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL2NvbmN1cnJlbnQvQ29uY3VycmVudEhhc2hNYXAkSGFzaEVudHJ5PFRLO1RWOz47ICkKLWZpbmFsIGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwJEhhc2hFbnRyeSBuZXh0Ci1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9VFY7ICkKLSBqYXZhLmxhbmcuT2JqZWN0IHZhbHVlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSVRLO1RWO0xqYXZhL3V0aWwvY29uY3VycmVudC9Db25jdXJyZW50SGFzaE1hcCRIYXNoRW50cnk8VEs7VFY7PjspViApCi0gdm9pZCA8aW5pdD4oCi1pbnQKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QKLWphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwJEhhc2hFbnRyeSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE2IG5hbWUgPUtleUl0ZXJhdG9yICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvY29uY3VycmVudC9Db25jdXJyZW50SGFzaE1hcDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvY29uY3VycmVudC9Db25jdXJyZW50SGFzaE1hcDxUSztUVjs+Lkhhc2hJdGVyYXRvcjtMamF2YS91dGlsL0l0ZXJhdG9yPFRLOz47TGphdmEvdXRpbC9FbnVtZXJhdGlvbjxUSzs+OyApCi1maW5hbCBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcCRLZXlJdGVyYXRvciBleHRlbmRzIGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwJEhhc2hJdGVyYXRvciBpbXBsZW1lbnRzIGphdmEudXRpbC5JdGVyYXRvciwgamF2YS51dGlsLkVudW1lcmF0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVEs7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IG5leHQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVEs7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IG5leHRFbGVtZW50KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL2NvbmN1cnJlbnQvQ29uY3VycmVudEhhc2hNYXA7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0Fic3RyYWN0U2V0PFRLOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTYgbmFtZSA9S2V5U2V0ICkKLWZpbmFsIGNsYXNzIGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwJEtleVNldCBleHRlbmRzIGphdmEudXRpbC5BYnN0cmFjdFNldAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcCB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcCkKLQotcHVibGljIHZvaWQgY2xlYXIoKQotCi1wdWJsaWMgYm9vbGVhbiBjb250YWlucygKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0l0ZXJhdG9yPFRLOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuSXRlcmF0b3IgaXRlcmF0b3IoKQotCi1wdWJsaWMgYm9vbGVhbiByZW1vdmUoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50IHNpemUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5Mb2NrIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGxvY2soKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSW50ZXJydXB0ZWRFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGxvY2tJbnRlcnJ1cHRpYmx5KCkKLQotcHVibGljIGFic3RyYWN0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkNvbmRpdGlvbiBuZXdDb25kaXRpb24oKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiB0cnlMb2NrKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0ludGVycnVwdGVkRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiB0cnlMb2NrKAotbG9uZwotamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHVubG9jaygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MamF2YS91dGlsL2NvbmN1cnJlbnQvbG9ja3MvUmVlbnRyYW50TG9jayRGYWlyU3luYztMamF2YS91dGlsL2NvbmN1cnJlbnQvbG9ja3MvUmVlbnRyYW50TG9jayROb25mYWlyU3luYztMamF2YS91dGlsL2NvbmN1cnJlbnQvbG9ja3MvUmVlbnRyYW50TG9jayRTeW5jOyApCi1wdWJsaWMgY2xhc3MgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50TG9jayBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5Mb2NrLCBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRMb2NrJFN5bmMgc3luYwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWJvb2xlYW4pCi0KLXB1YmxpYyBpbnQgZ2V0SG9sZENvdW50KCkKLQotcHJvdGVjdGVkIGphdmEubGFuZy5UaHJlYWQgZ2V0T3duZXIoKQotCi1wdWJsaWMgZmluYWwgaW50IGdldFF1ZXVlTGVuZ3RoKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvQ29sbGVjdGlvbjxMamF2YS9sYW5nL1RocmVhZDs+OyApCi1wcm90ZWN0ZWQgamF2YS51dGlsLkNvbGxlY3Rpb24gZ2V0UXVldWVkVGhyZWFkcygpCi0KLXB1YmxpYyBpbnQgZ2V0V2FpdFF1ZXVlTGVuZ3RoKAotamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuQ29uZGl0aW9uKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL2NvbmN1cnJlbnQvbG9ja3MvQ29uZGl0aW9uOylMamF2YS91dGlsL0NvbGxlY3Rpb248TGphdmEvbGFuZy9UaHJlYWQ7PjsgKQotcHJvdGVjdGVkIGphdmEudXRpbC5Db2xsZWN0aW9uIGdldFdhaXRpbmdUaHJlYWRzKAotamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuQ29uZGl0aW9uKQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNRdWV1ZWRUaHJlYWQoCi1qYXZhLmxhbmcuVGhyZWFkKQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNRdWV1ZWRUaHJlYWRzKCkKLQotcHVibGljIGJvb2xlYW4gaGFzV2FpdGVycygKLWphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkNvbmRpdGlvbikKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gaXNGYWlyKCkKLQotcHVibGljIGJvb2xlYW4gaXNIZWxkQnlDdXJyZW50VGhyZWFkKCkKLQotcHVibGljIGJvb2xlYW4gaXNMb2NrZWQoKQotCi1wdWJsaWMgdm9pZCBsb2NrKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0ludGVycnVwdGVkRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBsb2NrSW50ZXJydXB0aWJseSgpCi0KLXB1YmxpYyBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5Db25kaXRpb24gbmV3Q29uZGl0aW9uKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1wdWJsaWMgYm9vbGVhbiB0cnlMb2NrKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0ludGVycnVwdGVkRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiB0cnlMb2NrKAotbG9uZwotamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQpCi0KLXB1YmxpYyB2b2lkIHVubG9jaygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9jb25jdXJyZW50L0NvbmN1cnJlbnRIYXNoTWFwOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEs6TGphdmEvbGFuZy9PYmplY3Q7VjpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvdXRpbC9jb25jdXJyZW50L2xvY2tzL1JlZW50cmFudExvY2s7TGphdmEvaW8vU2VyaWFsaXphYmxlOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI0IG5hbWUgPVNlZ21lbnQgKQotZmluYWwgY2xhc3MgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXAkU2VnbWVudCBleHRlbmRzIGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudExvY2sgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotdHJhbnNpZW50IHZvbGF0aWxlIGludCBjb3VudAotCi1maW5hbCBmbG9hdCBsb2FkRmFjdG9yCi0KLXRyYW5zaWVudCBpbnQgbW9kQ291bnQKLQotdHJhbnNpZW50IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwJEhhc2hFbnRyeVtdIHRhYmxlCi0KLXRyYW5zaWVudCBpbnQgdGhyZXNob2xkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotaW50Ci1mbG9hdCkKLQotIHZvaWQgY2xlYXIoKQotCi0gYm9vbGVhbiBjb250YWluc0tleSgKLWphdmEubGFuZy5PYmplY3QKLWludCkKLQotIGJvb2xlYW4gY29udGFpbnNWYWx1ZSgKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvT2JqZWN0O0kpVFY7ICkKLSBqYXZhLmxhbmcuT2JqZWN0IGdldCgKLWphdmEubGFuZy5PYmplY3QKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEs7SVRWO1opVFY7ICkKLSBqYXZhLmxhbmcuT2JqZWN0IHB1dCgKLWphdmEubGFuZy5PYmplY3QKLWludAotamF2YS5sYW5nLk9iamVjdAotYm9vbGVhbikKLQotIGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwJEhhc2hFbnRyeVtdIHJlaGFzaCgKLWphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwJEhhc2hFbnRyeVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL09iamVjdDtJTGphdmEvbGFuZy9PYmplY3Q7KVRWOyApCi0gamF2YS5sYW5nLk9iamVjdCByZW1vdmUoCi1qYXZhLmxhbmcuT2JqZWN0Ci1pbnQKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRLO0lUVjspVFY7ICkKLSBqYXZhLmxhbmcuT2JqZWN0IHJlcGxhY2UoCi1qYXZhLmxhbmcuT2JqZWN0Ci1pbnQKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRLO0lUVjtUVjspWiApCi0gYm9vbGVhbiByZXBsYWNlKAotamF2YS5sYW5nLk9iamVjdAotaW50Ci1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi0gdm9pZCBzZXRUYWJsZSgKLWphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwJEhhc2hFbnRyeVtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjQgbmFtZSA9U2ltcGxlRW50cnkgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9jb25jdXJyZW50L0NvbmN1cnJlbnRIYXNoTWFwOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEs6TGphdmEvbGFuZy9PYmplY3Q7VjpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvdXRpbC9NYXAkRW50cnk8VEs7VFY7PjsgKQotZmluYWwgY2xhc3MgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXAkU2ltcGxlRW50cnkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLk1hcCRFbnRyeQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPVRLOyApCi0gamF2YS5sYW5nLk9iamVjdCBrZXkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1UVjsgKQotIGphdmEubGFuZy5PYmplY3QgdmFsdWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUSztUVjspViApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL01hcCRFbnRyeTxUSztUVjs+OylWICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEudXRpbC5NYXAkRW50cnkpCi0KLXN0YXRpYyBib29sZWFuIGVxKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVRLOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRLZXkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVFY7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldFZhbHVlKCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRWOylUVjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3Qgc2V0VmFsdWUoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9jb25jdXJyZW50L0NvbmN1cnJlbnRIYXNoTWFwOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9jb25jdXJyZW50L0NvbmN1cnJlbnRIYXNoTWFwPFRLO1RWOz4uSGFzaEl0ZXJhdG9yO0xqYXZhL3V0aWwvSXRlcmF0b3I8VFY7PjtMamF2YS91dGlsL0VudW1lcmF0aW9uPFRWOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTYgbmFtZSA9VmFsdWVJdGVyYXRvciApCi1maW5hbCBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcCRWYWx1ZUl0ZXJhdG9yIGV4dGVuZHMgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXAkSGFzaEl0ZXJhdG9yIGltcGxlbWVudHMgamF2YS51dGlsLkl0ZXJhdG9yLCBqYXZhLnV0aWwuRW51bWVyYXRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXAgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClUVjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgbmV4dCgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClUVjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgbmV4dEVsZW1lbnQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvY29uY3VycmVudC9Db25jdXJyZW50SGFzaE1hcDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQWJzdHJhY3RDb2xsZWN0aW9uPFRWOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTYgbmFtZSA9VmFsdWVzICkKLWZpbmFsIGNsYXNzIGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwJFZhbHVlcyBleHRlbmRzIGphdmEudXRpbC5BYnN0cmFjdENvbGxlY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXAgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXApCi0KLXB1YmxpYyB2b2lkIGNsZWFyKCkKLQotcHVibGljIGJvb2xlYW4gY29udGFpbnMoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9JdGVyYXRvcjxUVjs+OyApCi1wdWJsaWMgamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXJhdG9yKCkKLQotcHVibGljIGludCBzaXplKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEs6TGphdmEvbGFuZy9PYmplY3Q7VjpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvdXRpbC9NYXA8VEs7VFY7PjsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TWFwIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudXRpbC5NYXAKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUSztUVjspVFY7ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuT2JqZWN0IHB1dElmQWJzZW50KAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gcmVtb3ZlKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEs7VFY7KVRWOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLk9iamVjdCByZXBsYWNlKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEs7VFY7VFY7KVogKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gcmVwbGFjZSgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MamF2YS91dGlsL2NvbmN1cnJlbnQvQ29uY3VycmVudEhhc2hNYXAkU2ltcGxlRW50cnk7TGphdmEvdXRpbC9jb25jdXJyZW50L0NvbmN1cnJlbnRIYXNoTWFwJEVudHJ5U2V0O0xqYXZhL3V0aWwvY29uY3VycmVudC9Db25jdXJyZW50SGFzaE1hcCRWYWx1ZXM7TGphdmEvdXRpbC9jb25jdXJyZW50L0NvbmN1cnJlbnRIYXNoTWFwJEtleVNldDtMamF2YS91dGlsL2NvbmN1cnJlbnQvQ29uY3VycmVudEhhc2hNYXAkRW50cnlJdGVyYXRvcjtMamF2YS91dGlsL2NvbmN1cnJlbnQvQ29uY3VycmVudEhhc2hNYXAkVmFsdWVJdGVyYXRvcjtMamF2YS91dGlsL2NvbmN1cnJlbnQvQ29uY3VycmVudEhhc2hNYXAkS2V5SXRlcmF0b3I7TGphdmEvdXRpbC9jb25jdXJyZW50L0NvbmN1cnJlbnRIYXNoTWFwJEhhc2hJdGVyYXRvcjtMamF2YS91dGlsL2NvbmN1cnJlbnQvQ29uY3VycmVudEhhc2hNYXAkSGFzaEVudHJ5O0xqYXZhL3V0aWwvY29uY3VycmVudC9Db25jdXJyZW50SGFzaE1hcCRTZWdtZW50OyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEs6TGphdmEvbGFuZy9PYmplY3Q7VjpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvdXRpbC9BYnN0cmFjdE1hcDxUSztUVjs+O0xqYXZhL3V0aWwvY29uY3VycmVudC9Db25jdXJyZW50TWFwPFRLO1RWOz47TGphdmEvaW8vU2VyaWFsaXphYmxlOyApCi1wdWJsaWMgY2xhc3MgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXAgZXh0ZW5kcyBqYXZhLnV0aWwuQWJzdHJhY3RNYXAgaW1wbGVtZW50cyBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TWFwLCBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgaW50IERFRkFVTFRfSU5JVElBTF9DQVBBQ0lUWQotCi1zdGF0aWMgZmluYWwgZmxvYXQgREVGQVVMVF9MT0FEX0ZBQ1RPUgotCi1zdGF0aWMgZmluYWwgaW50IERFRkFVTFRfU0VHTUVOVFMKLQotc3RhdGljIGZpbmFsIGludCBNQVhJTVVNX0NBUEFDSVRZCi0KLXN0YXRpYyBmaW5hbCBpbnQgTUFYX1NFR01FTlRTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvU2V0PExqYXZhL3V0aWwvTWFwJEVudHJ5PFRLO1RWOz47PjsgKQotdHJhbnNpZW50IGphdmEudXRpbC5TZXQgZW50cnlTZXQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL1NldDxUSzs+OyApCi10cmFuc2llbnQgamF2YS51dGlsLlNldCBrZXlTZXQKLQotZmluYWwgaW50IHNlZ21lbnRNYXNrCi0KLWZpbmFsIGludCBzZWdtZW50U2hpZnQKLQotZmluYWwgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXAkU2VnbWVudFtdIHNlZ21lbnRzCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9Db2xsZWN0aW9uPFRWOz47ICkKLXRyYW5zaWVudCBqYXZhLnV0aWwuQ29sbGVjdGlvbiB2YWx1ZXMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50Ci1mbG9hdAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL01hcDwrVEs7K1RWOz47KVYgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLk1hcCkKLQotc3RhdGljIGludCBoYXNoKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9sYW5nL0NsYXNzTm90Rm91bmRFeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCByZWFkT2JqZWN0KAotamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KAotamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0pCi0KLXB1YmxpYyB2b2lkIGNsZWFyKCkKLQotcHVibGljIGJvb2xlYW4gY29udGFpbnMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYm9vbGVhbiBjb250YWluc0tleSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBib29sZWFuIGNvbnRhaW5zVmFsdWUoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9FbnVtZXJhdGlvbjxUVjs+OyApCi1wdWJsaWMgamF2YS51dGlsLkVudW1lcmF0aW9uIGVsZW1lbnRzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvU2V0PExqYXZhL3V0aWwvTWFwJEVudHJ5PFRLO1RWOz47PjsgKQotcHVibGljIGphdmEudXRpbC5TZXQgZW50cnlTZXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL09iamVjdDspVFY7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldCgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9TZXQ8VEs7PjsgKQotcHVibGljIGphdmEudXRpbC5TZXQga2V5U2V0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvRW51bWVyYXRpb248VEs7PjsgKQotcHVibGljIGphdmEudXRpbC5FbnVtZXJhdGlvbiBrZXlzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEs7VFY7KVRWOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBwdXQoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL01hcDwrVEs7K1RWOz47KVYgKQotcHVibGljIHZvaWQgcHV0QWxsKAotamF2YS51dGlsLk1hcCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEs7VFY7KVRWOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBwdXRJZkFic2VudCgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvT2JqZWN0OylUVjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgcmVtb3ZlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGJvb2xlYW4gcmVtb3ZlKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEs7VFY7KVRWOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCByZXBsYWNlKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEs7VFY7VFY7KVogKQotcHVibGljIGJvb2xlYW4gcmVwbGFjZSgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KEkpTGphdmEvdXRpbC9jb25jdXJyZW50L0NvbmN1cnJlbnRIYXNoTWFwJFNlZ21lbnQ8VEs7VFY7PjsgKQotZmluYWwgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXAkU2VnbWVudCBzZWdtZW50Rm9yKAotaW50KQotCi1wdWJsaWMgaW50IHNpemUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9Db2xsZWN0aW9uPFRWOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuQ29sbGVjdGlvbiB2YWx1ZXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MiBuYW1lID1JdHIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9jb25jdXJyZW50L0NvbmN1cnJlbnRMaW5rZWRRdWV1ZTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3V0aWwvSXRlcmF0b3I8VEU7PjsgKQotIGNsYXNzIGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRMaW5rZWRRdWV1ZSRJdHIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLkl0ZXJhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9jb25jdXJyZW50L0NvbmN1cnJlbnRMaW5rZWRRdWV1ZSROb2RlPFRFOz47ICkKLXByaXZhdGUgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudExpbmtlZFF1ZXVlJE5vZGUgbGFzdFJldAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPVRFOyApCi1wcml2YXRlIGphdmEubGFuZy5PYmplY3QgbmV4dEl0ZW0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL2NvbmN1cnJlbnQvQ29uY3VycmVudExpbmtlZFF1ZXVlJE5vZGU8VEU7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TGlua2VkUXVldWUkTm9kZSBuZXh0Tm9kZQotCi1maW5hbCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TGlua2VkUXVldWUgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudExpbmtlZFF1ZXVlKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVEU7ICkKLXByaXZhdGUgamF2YS5sYW5nLk9iamVjdCBhZHZhbmNlKCkKLQotcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClURTsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgbmV4dCgpCi0KLXB1YmxpYyB2b2lkIHJlbW92ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1Ob2RlICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvY29uY3VycmVudC9Db25jdXJyZW50TGlua2VkUXVldWU7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08RTpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvbGFuZy9PYmplY3Q7ICkKLSBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TGlua2VkUXVldWUkTm9kZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL2NvbmN1cnJlbnQvYXRvbWljL0F0b21pY1JlZmVyZW5jZUZpZWxkVXBkYXRlcjxMamF2YS91dGlsL2NvbmN1cnJlbnQvQ29uY3VycmVudExpbmtlZFF1ZXVlJE5vZGU7TGphdmEvbGFuZy9PYmplY3Q7PjsgKQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY1JlZmVyZW5jZUZpZWxkVXBkYXRlciBpdGVtVXBkYXRlcgotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvY29uY3VycmVudC9hdG9taWMvQXRvbWljUmVmZXJlbmNlRmllbGRVcGRhdGVyPExqYXZhL3V0aWwvY29uY3VycmVudC9Db25jdXJyZW50TGlua2VkUXVldWUkTm9kZTtMamF2YS91dGlsL2NvbmN1cnJlbnQvQ29uY3VycmVudExpbmtlZFF1ZXVlJE5vZGU7PjsgKQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY1JlZmVyZW5jZUZpZWxkVXBkYXRlciBuZXh0VXBkYXRlcgotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPVRFOyApCi1wcml2YXRlIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgaXRlbQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvY29uY3VycmVudC9Db25jdXJyZW50TGlua2VkUXVldWUkTm9kZTxURTs+OyApCi1wcml2YXRlIHZvbGF0aWxlIGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRMaW5rZWRRdWV1ZSROb2RlIG5leHQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRFOylWICkKLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRFO0xqYXZhL3V0aWwvY29uY3VycmVudC9Db25jdXJyZW50TGlua2VkUXVldWUkTm9kZTxURTs+OylWICkKLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5PYmplY3QKLWphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRMaW5rZWRRdWV1ZSROb2RlKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShURTtURTspWiApCi0gYm9vbGVhbiBjYXNJdGVtKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9jb25jdXJyZW50L0NvbmN1cnJlbnRMaW5rZWRRdWV1ZSROb2RlPFRFOz47TGphdmEvdXRpbC9jb25jdXJyZW50L0NvbmN1cnJlbnRMaW5rZWRRdWV1ZSROb2RlPFRFOz47KVogKQotIGJvb2xlYW4gY2FzTmV4dCgKLWphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRMaW5rZWRRdWV1ZSROb2RlCi1qYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TGlua2VkUXVldWUkTm9kZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVRFOyApCi0gamF2YS5sYW5nLk9iamVjdCBnZXRJdGVtKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvY29uY3VycmVudC9Db25jdXJyZW50TGlua2VkUXVldWUkTm9kZTxURTs+OyApCi0gamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudExpbmtlZFF1ZXVlJE5vZGUgZ2V0TmV4dCgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRFOylWICkKLSB2b2lkIHNldEl0ZW0oCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL2NvbmN1cnJlbnQvQ29uY3VycmVudExpbmtlZFF1ZXVlJE5vZGU8VEU7PjspViApCi0gdm9pZCBzZXROZXh0KAotamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudExpbmtlZFF1ZXVlJE5vZGUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MamF2YS91dGlsL2NvbmN1cnJlbnQvQ29uY3VycmVudExpbmtlZFF1ZXVlJEl0cjtMamF2YS91dGlsL2NvbmN1cnJlbnQvQ29uY3VycmVudExpbmtlZFF1ZXVlJE5vZGU7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08RTpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvdXRpbC9BYnN0cmFjdFF1ZXVlPFRFOz47TGphdmEvdXRpbC9RdWV1ZTxURTs+O0xqYXZhL2lvL1NlcmlhbGl6YWJsZTsgKQotcHVibGljIGNsYXNzIGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRMaW5rZWRRdWV1ZSBleHRlbmRzIGphdmEudXRpbC5BYnN0cmFjdFF1ZXVlIGltcGxlbWVudHMgamF2YS51dGlsLlF1ZXVlLCBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvY29uY3VycmVudC9hdG9taWMvQXRvbWljUmVmZXJlbmNlRmllbGRVcGRhdGVyPExqYXZhL3V0aWwvY29uY3VycmVudC9Db25jdXJyZW50TGlua2VkUXVldWU7TGphdmEvdXRpbC9jb25jdXJyZW50L0NvbmN1cnJlbnRMaW5rZWRRdWV1ZSROb2RlOz47ICkKLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2VGaWVsZFVwZGF0ZXIgaGVhZFVwZGF0ZXIKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9jb25jdXJyZW50L2F0b21pYy9BdG9taWNSZWZlcmVuY2VGaWVsZFVwZGF0ZXI8TGphdmEvdXRpbC9jb25jdXJyZW50L0NvbmN1cnJlbnRMaW5rZWRRdWV1ZTtMamF2YS91dGlsL2NvbmN1cnJlbnQvQ29uY3VycmVudExpbmtlZFF1ZXVlJE5vZGU7PjsgKQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY1JlZmVyZW5jZUZpZWxkVXBkYXRlciB0YWlsVXBkYXRlcgotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvY29uY3VycmVudC9Db25jdXJyZW50TGlua2VkUXVldWUkTm9kZTxURTs+OyApCi1wcml2YXRlIHRyYW5zaWVudCB2b2xhdGlsZSBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TGlua2VkUXVldWUkTm9kZSBoZWFkCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9jb25jdXJyZW50L0NvbmN1cnJlbnRMaW5rZWRRdWV1ZSROb2RlPFRFOz47ICkKLXByaXZhdGUgdHJhbnNpZW50IHZvbGF0aWxlIGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRMaW5rZWRRdWV1ZSROb2RlIHRhaWwKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvQ29sbGVjdGlvbjwrVEU7PjspViApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuQ29sbGVjdGlvbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9jb25jdXJyZW50L0NvbmN1cnJlbnRMaW5rZWRRdWV1ZSROb2RlPFRFOz47TGphdmEvdXRpbC9jb25jdXJyZW50L0NvbmN1cnJlbnRMaW5rZWRRdWV1ZSROb2RlPFRFOz47KVogKQotcHJpdmF0ZSBib29sZWFuIGNhc0hlYWQoCi1qYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TGlua2VkUXVldWUkTm9kZQotamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudExpbmtlZFF1ZXVlJE5vZGUpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvY29uY3VycmVudC9Db25jdXJyZW50TGlua2VkUXVldWUkTm9kZTxURTs+O0xqYXZhL3V0aWwvY29uY3VycmVudC9Db25jdXJyZW50TGlua2VkUXVldWUkTm9kZTxURTs+OylaICkKLXByaXZhdGUgYm9vbGVhbiBjYXNUYWlsKAotamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudExpbmtlZFF1ZXVlJE5vZGUKLWphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRMaW5rZWRRdWV1ZSROb2RlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL2xhbmcvQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoCi1qYXZhLmlvLk9iamVjdElucHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoCi1qYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEU7KVogKQotcHVibGljIGJvb2xlYW4gYWRkKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGJvb2xlYW4gY29udGFpbnMoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9jb25jdXJyZW50L0NvbmN1cnJlbnRMaW5rZWRRdWV1ZSROb2RlPFRFOz47ICkKLSBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TGlua2VkUXVldWUkTm9kZSBmaXJzdCgpCi0KLXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9JdGVyYXRvcjxURTs+OyApCi1wdWJsaWMgamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXJhdG9yKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEU7KVogKQotcHVibGljIGJvb2xlYW4gb2ZmZXIoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVEU7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHBlZWsoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVEU7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHBvbGwoKQotCi1wdWJsaWMgYm9vbGVhbiByZW1vdmUoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50IHNpemUoKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdFtdIHRvQXJyYXkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz4oW1RUOylbVFQ7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0W10gdG9BcnJheSgKLWphdmEubGFuZy5PYmplY3RbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL2NvbmN1cnJlbnQvQ29weU9uV3JpdGVBcnJheUxpc3Q7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9NDEwNCBuYW1lID1udWxsICkKLSBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5Db3B5T25Xcml0ZUFycmF5TGlzdCQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9jb25jdXJyZW50L0NvcHlPbldyaXRlQXJyYXlMaXN0OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPUxpc3RJdGVyYXRvckltcGwgKQotIGNsYXNzIGphdmEudXRpbC5jb25jdXJyZW50LkNvcHlPbldyaXRlQXJyYXlMaXN0JExpc3RJdGVyYXRvckltcGwgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLkxpc3RJdGVyYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5PYmplY3RbXSBhcnIKLQotcHJpdmF0ZSBpbnQgY3VycmVudAotCi1wcml2YXRlIGZpbmFsIGludCBzaXplCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLk9iamVjdFtdCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGFkZCgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBib29sZWFuIGhhc05leHQoKQotCi1wdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IG5leHQoKQotCi1wdWJsaWMgaW50IG5leHRJbmRleCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHByZXZpb3VzKCkKLQotcHVibGljIGludCBwcmV2aW91c0luZGV4KCkKLQotcHVibGljIHZvaWQgcmVtb3ZlKCkKLQotcHVibGljIHZvaWQgc2V0KAotamF2YS5sYW5nLk9iamVjdCkKLQotZmluYWwgaW50IHNpemUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvY29uY3VycmVudC9Db3B5T25Xcml0ZUFycmF5TGlzdCRTdWJMaXN0OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTIgbmFtZSA9U3ViTGlzdEl0ZXJhdG9yICkKLSBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5Db3B5T25Xcml0ZUFycmF5TGlzdCRTdWJMaXN0JFN1Ykxpc3RJdGVyYXRvciBleHRlbmRzIGphdmEudXRpbC5jb25jdXJyZW50LkNvcHlPbldyaXRlQXJyYXlMaXN0JExpc3RJdGVyYXRvckltcGwKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3B5T25Xcml0ZUFycmF5TGlzdCRTdWJMaXN0UmVhZERhdGEgZGF0YVIKLQotZmluYWwgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29weU9uV3JpdGVBcnJheUxpc3QkU3ViTGlzdCB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLmNvbmN1cnJlbnQuQ29weU9uV3JpdGVBcnJheUxpc3QkU3ViTGlzdAotaW50Ci1qYXZhLnV0aWwuY29uY3VycmVudC5Db3B5T25Xcml0ZUFycmF5TGlzdCRTdWJMaXN0UmVhZERhdGEpCi0KLSB2b2lkIDxpbml0PigKLWphdmEudXRpbC5jb25jdXJyZW50LkNvcHlPbldyaXRlQXJyYXlMaXN0JFN1Ykxpc3QKLWludAotamF2YS51dGlsLmNvbmN1cnJlbnQuQ29weU9uV3JpdGVBcnJheUxpc3QkU3ViTGlzdFJlYWREYXRhCi1qYXZhLnV0aWwuY29uY3VycmVudC5Db3B5T25Xcml0ZUFycmF5TGlzdCQxKQotCi1wdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkKLQotcHVibGljIGJvb2xlYW4gaGFzUHJldmlvdXMoKQotCi1wdWJsaWMgaW50IG5leHRJbmRleCgpCi0KLXB1YmxpYyBpbnQgcHJldmlvdXNJbmRleCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPVN1Ykxpc3QgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9jb25jdXJyZW50L0NvcHlPbldyaXRlQXJyYXlMaXN0OyApCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxqYXZhL3V0aWwvY29uY3VycmVudC9Db3B5T25Xcml0ZUFycmF5TGlzdCRTdWJMaXN0JFN1Ykxpc3RJdGVyYXRvcjsgKQotIGNsYXNzIGphdmEudXRpbC5jb25jdXJyZW50LkNvcHlPbldyaXRlQXJyYXlMaXN0JFN1Ykxpc3QgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLkxpc3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3B5T25Xcml0ZUFycmF5TGlzdCBsaXN0Ci0KLXByaXZhdGUgdm9sYXRpbGUgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29weU9uV3JpdGVBcnJheUxpc3QkU3ViTGlzdFJlYWREYXRhIHJlYWQKLQotcHJpdmF0ZSBmaW5hbCBpbnQgc3RhcnQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuY29uY3VycmVudC5Db3B5T25Xcml0ZUFycmF5TGlzdAotaW50Ci1pbnQpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDIwMCgKLWphdmEudXRpbC5jb25jdXJyZW50LkNvcHlPbldyaXRlQXJyYXlMaXN0JFN1Ykxpc3QpCi0KLXByaXZhdGUgdm9pZCBjaGVja01vZGlmaWNhdGlvbnMoKQotCi1wdWJsaWMgdm9pZCBhZGQoCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBib29sZWFuIGFkZCgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBib29sZWFuIGFkZEFsbCgKLWludAotamF2YS51dGlsLkNvbGxlY3Rpb24pCi0KLXB1YmxpYyBib29sZWFuIGFkZEFsbCgKLWphdmEudXRpbC5Db2xsZWN0aW9uKQotCi1wdWJsaWMgdm9pZCBjbGVhcigpCi0KLXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGJvb2xlYW4gY29udGFpbnNBbGwoCi1qYXZhLnV0aWwuQ29sbGVjdGlvbikKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0KAotaW50KQotCi1wdWJsaWMgaW50IGluZGV4T2YoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkKLQotcHVibGljIGphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvcigpCi0KLXB1YmxpYyBpbnQgbGFzdEluZGV4T2YoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgamF2YS51dGlsLkxpc3RJdGVyYXRvciBsaXN0SXRlcmF0b3IoKQotCi1wdWJsaWMgamF2YS51dGlsLkxpc3RJdGVyYXRvciBsaXN0SXRlcmF0b3IoCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHJlbW92ZSgKLWludCkKLQotcHVibGljIGJvb2xlYW4gcmVtb3ZlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKAotamF2YS51dGlsLkNvbGxlY3Rpb24pCi0KLXB1YmxpYyBib29sZWFuIHJldGFpbkFsbCgKLWphdmEudXRpbC5Db2xsZWN0aW9uKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBzZXQoCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBpbnQgc2l6ZSgpCi0KLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBzdWJMaXN0KAotaW50Ci1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0W10gdG9BcnJheSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0W10gdG9BcnJheSgKLWphdmEubGFuZy5PYmplY3RbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI0IG5hbWUgPVN1Ykxpc3RSZWFkRGF0YSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL2NvbmN1cnJlbnQvQ29weU9uV3JpdGVBcnJheUxpc3Q7ICkKLWZpbmFsIGNsYXNzIGphdmEudXRpbC5jb25jdXJyZW50LkNvcHlPbldyaXRlQXJyYXlMaXN0JFN1Ykxpc3RSZWFkRGF0YSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgamF2YS5sYW5nLk9iamVjdFtdIGRhdGEKLQotZmluYWwgaW50IHNpemUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1pbnQKLWphdmEubGFuZy5PYmplY3RbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxqYXZhL3V0aWwvY29uY3VycmVudC9Db3B5T25Xcml0ZUFycmF5TGlzdCQxO0xqYXZhL3V0aWwvY29uY3VycmVudC9Db3B5T25Xcml0ZUFycmF5TGlzdCRTdWJMaXN0O0xqYXZhL3V0aWwvY29uY3VycmVudC9Db3B5T25Xcml0ZUFycmF5TGlzdCRTdWJMaXN0UmVhZERhdGE7TGphdmEvdXRpbC9jb25jdXJyZW50L0NvcHlPbldyaXRlQXJyYXlMaXN0JExpc3RJdGVyYXRvckltcGw7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08RTpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvdXRpbC9MaXN0PFRFOz47TGphdmEvdXRpbC9SYW5kb21BY2Nlc3M7TGphdmEvbGFuZy9DbG9uZWFibGU7TGphdmEvaW8vU2VyaWFsaXphYmxlOyApCi1wdWJsaWMgY2xhc3MgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29weU9uV3JpdGVBcnJheUxpc3QgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLkxpc3QsIGphdmEudXRpbC5SYW5kb21BY2Nlc3MsIGphdmEubGFuZy5DbG9uZWFibGUsIGphdmEuaW8uU2VyaWFsaXphYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPVtURTsgKQotcHJpdmF0ZSB0cmFuc2llbnQgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdFtdIGFycgotCi1wcml2YXRlIGZpbmFsIHRyYW5zaWVudCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRMb2NrIGxvY2sKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0NvbGxlY3Rpb248K1RFOz47KVYgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkNvbGxlY3Rpb24pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFtURTspViApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuT2JqZWN0W10pCi0KLXN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRMb2NrIGFjY2VzcyQxMDAoCi1qYXZhLnV0aWwuY29uY3VycmVudC5Db3B5T25Xcml0ZUFycmF5TGlzdCkKLQotc3RhdGljIGZpbmFsIHZvaWQgY2hlY2tJbmRleEV4bHVzaXZlKAotaW50Ci1pbnQpCi0KLXN0YXRpYyBmaW5hbCB2b2lkIGNoZWNrSW5kZXhJbmNsdXNpdmUoCi1pbnQKLWludCkKLQotc3RhdGljIGZpbmFsIGJvb2xlYW4gY29udGFpbnNBbGwoCi1qYXZhLnV0aWwuQ29sbGVjdGlvbgotamF2YS5sYW5nLk9iamVjdFtdCi1pbnQKLWludCkKLQotc3RhdGljIGZpbmFsIGludCBpbmRleE9mKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdFtdCi1pbnQKLWludCkKLQotc3RhdGljIGZpbmFsIGludCBsYXN0SW5kZXhPZigKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3RbXQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KEkpW1RFOyApCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5PYmplY3RbXSBuZXdFbGVtZW50QXJyYXkoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgcmVhZE9iamVjdCgKLWphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFtURTspViApCi1wcml2YXRlIGZpbmFsIHZvaWQgc2V0RGF0YSgKLWphdmEubGFuZy5PYmplY3RbXSkKLQotc3RhdGljIGphdmEubGFuZy5PYmplY3RbXSB0b0FycmF5KAotamF2YS5sYW5nLk9iamVjdFtdCi1pbnQKLWludCkKLQotc3RhdGljIGphdmEubGFuZy5PYmplY3RbXSB0b0FycmF5KAotamF2YS5sYW5nLk9iamVjdFtdCi1qYXZhLmxhbmcuT2JqZWN0W10KLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoCi1qYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSVRFOylWICkKLXB1YmxpYyB2b2lkIGFkZCgKLWludAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEU7KVogKQotcHVibGljIGJvb2xlYW4gYWRkKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSUxqYXZhL3V0aWwvQ29sbGVjdGlvbjwrVEU7PjspWiApCi1wdWJsaWMgYm9vbGVhbiBhZGRBbGwoCi1pbnQKLWphdmEudXRpbC5Db2xsZWN0aW9uKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0NvbGxlY3Rpb248K1RFOz47KVogKQotcHVibGljIGJvb2xlYW4gYWRkQWxsKAotamF2YS51dGlsLkNvbGxlY3Rpb24pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvQ29sbGVjdGlvbjwrVEU7PjspSSApCi1wdWJsaWMgaW50IGFkZEFsbEFic2VudCgKLWphdmEudXRpbC5Db2xsZWN0aW9uKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShURTspWiApCi1wdWJsaWMgYm9vbGVhbiBhZGRJZkFic2VudCgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2lkIGNsZWFyKCkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgY2xvbmUoKQotCi1wdWJsaWMgYm9vbGVhbiBjb250YWlucygKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvQ29sbGVjdGlvbjwqPjspWiApCi1wdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbCgKLWphdmEudXRpbC5Db2xsZWN0aW9uKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJKVRFOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXQoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClbVEU7ICkKLWZpbmFsIGphdmEubGFuZy5PYmplY3RbXSBnZXREYXRhKCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLXB1YmxpYyBpbnQgaW5kZXhPZigKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRFO0kpSSApCi1wdWJsaWMgaW50IGluZGV4T2YoCi1qYXZhLmxhbmcuT2JqZWN0Ci1pbnQpCi0KLXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9JdGVyYXRvcjxURTs+OyApCi1wdWJsaWMgamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXJhdG9yKCkKLQotcHVibGljIGludCBsYXN0SW5kZXhPZigKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRFO0kpSSApCi1wdWJsaWMgaW50IGxhc3RJbmRleE9mKAotamF2YS5sYW5nLk9iamVjdAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9MaXN0SXRlcmF0b3I8VEU7PjsgKQotcHVibGljIGphdmEudXRpbC5MaXN0SXRlcmF0b3IgbGlzdEl0ZXJhdG9yKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSSlMamF2YS91dGlsL0xpc3RJdGVyYXRvcjxURTs+OyApCi1wdWJsaWMgamF2YS51dGlsLkxpc3RJdGVyYXRvciBsaXN0SXRlcmF0b3IoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KEkpVEU7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHJlbW92ZSgKLWludCkKLQotcHVibGljIGJvb2xlYW4gcmVtb3ZlKAotamF2YS5sYW5nLk9iamVjdCkKLQotZmluYWwgaW50IHJlbW92ZUFsbCgKLWphdmEudXRpbC5Db2xsZWN0aW9uCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9Db2xsZWN0aW9uPCo+OylaICkKLXB1YmxpYyBib29sZWFuIHJlbW92ZUFsbCgKLWphdmEudXRpbC5Db2xsZWN0aW9uKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJSSlURTsgKQotIGphdmEubGFuZy5PYmplY3QgcmVtb3ZlUmFuZ2UoCi1pbnQKLWludCkKLQotIGludCByZXRhaW5BbGwoCi1qYXZhLnV0aWwuQ29sbGVjdGlvbgotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvQ29sbGVjdGlvbjwqPjspWiApCi1wdWJsaWMgYm9vbGVhbiByZXRhaW5BbGwoCi1qYXZhLnV0aWwuQ29sbGVjdGlvbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSVRFOylURTsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3Qgc2V0KAotaW50Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50IHNpemUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJSSlMamF2YS91dGlsL0xpc3Q8VEU7PjsgKQotcHVibGljIGphdmEudXRpbC5MaXN0IHN1Ykxpc3QoCi1pbnQKLWludCkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3RbXSB0b0FycmF5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+KFtUVDspW1RUOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdFtdIHRvQXJyYXkoCi1qYXZhLmxhbmcuT2JqZWN0W10pCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEU6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL3V0aWwvQWJzdHJhY3RTZXQ8VEU7PjtMamF2YS9pby9TZXJpYWxpemFibGU7ICkKLXB1YmxpYyBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5Db3B5T25Xcml0ZUFycmF5U2V0IGV4dGVuZHMgamF2YS51dGlsLkFic3RyYWN0U2V0IGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9jb25jdXJyZW50L0NvcHlPbldyaXRlQXJyYXlMaXN0PFRFOz47ICkKLXByaXZhdGUgZmluYWwgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29weU9uV3JpdGVBcnJheUxpc3QgYWwKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0NvbGxlY3Rpb248K1RFOz47KVYgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkNvbGxlY3Rpb24pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRFOylaICkKLXB1YmxpYyBib29sZWFuIGFkZCgKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvQ29sbGVjdGlvbjwrVEU7PjspWiApCi1wdWJsaWMgYm9vbGVhbiBhZGRBbGwoCi1qYXZhLnV0aWwuQ29sbGVjdGlvbikKLQotcHVibGljIHZvaWQgY2xlYXIoKQotCi1wdWJsaWMgYm9vbGVhbiBjb250YWlucygKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvQ29sbGVjdGlvbjwqPjspWiApCi1wdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbCgKLWphdmEudXRpbC5Db2xsZWN0aW9uKQotCi1wdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvSXRlcmF0b3I8VEU7PjsgKQotcHVibGljIGphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvcigpCi0KLXB1YmxpYyBib29sZWFuIHJlbW92ZSgKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvQ29sbGVjdGlvbjwqPjspWiApCi1wdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoCi1qYXZhLnV0aWwuQ29sbGVjdGlvbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9Db2xsZWN0aW9uPCo+OylaICkKLXB1YmxpYyBib29sZWFuIHJldGFpbkFsbCgKLWphdmEudXRpbC5Db2xsZWN0aW9uKQotCi1wdWJsaWMgaW50IHNpemUoKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdFtdIHRvQXJyYXkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz4oW1RUOylbVFQ7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0W10gdG9BcnJheSgKLWphdmEubGFuZy5PYmplY3RbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxqYXZhL3V0aWwvY29uY3VycmVudC9sb2Nrcy9BYnN0cmFjdFF1ZXVlZFN5bmNocm9uaXplciRDb25kaXRpb25PYmplY3Q7TGphdmEvdXRpbC9jb25jdXJyZW50L2xvY2tzL0Fic3RyYWN0UXVldWVkU3luY2hyb25pemVyJE5vZGU7ICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5BYnN0cmFjdFF1ZXVlZFN5bmNocm9uaXplciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIGhlYWRPZmZzZXQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc3RhdGVPZmZzZXQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyB0YWlsT2Zmc2V0Ci0KLXByaXZhdGUgc3RhdGljIGZpbmFsIHN1bi5taXNjLlVuc2FmZSB1bnNhZmUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyB3YWl0U3RhdHVzT2Zmc2V0Ci0KLXByaXZhdGUgdHJhbnNpZW50IHZvbGF0aWxlIGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkFic3RyYWN0UXVldWVkU3luY2hyb25pemVyJE5vZGUgaGVhZAotCi1wcml2YXRlIHZvbGF0aWxlIGludCBzdGF0ZQotCi1wcml2YXRlIHRyYW5zaWVudCB2b2xhdGlsZSBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5BYnN0cmFjdFF1ZXVlZFN5bmNocm9uaXplciROb2RlIHRhaWwKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQwMDAoKQotCi1wcml2YXRlIGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkFic3RyYWN0UXVldWVkU3luY2hyb25pemVyJE5vZGUgYWRkV2FpdGVyKAotamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuQWJzdHJhY3RRdWV1ZWRTeW5jaHJvbml6ZXIkTm9kZSkKLQotcHJpdmF0ZSB2b2lkIGNhbmNlbEFjcXVpcmUoCi1qYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5BYnN0cmFjdFF1ZXVlZFN5bmNocm9uaXplciROb2RlKQotCi1wcml2YXRlIGZpbmFsIGJvb2xlYW4gY29tcGFyZUFuZFNldEhlYWQoCi1qYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5BYnN0cmFjdFF1ZXVlZFN5bmNocm9uaXplciROb2RlKQotCi1wcml2YXRlIGZpbmFsIGJvb2xlYW4gY29tcGFyZUFuZFNldFRhaWwoCi1qYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5BYnN0cmFjdFF1ZXVlZFN5bmNocm9uaXplciROb2RlCi1qYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5BYnN0cmFjdFF1ZXVlZFN5bmNocm9uaXplciROb2RlKQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGNvbXBhcmVBbmRTZXRXYWl0U3RhdHVzKAotamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuQWJzdHJhY3RRdWV1ZWRTeW5jaHJvbml6ZXIkTm9kZQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbnRlcnJ1cHRlZEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIGRvQWNxdWlyZUludGVycnVwdGlibHkoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbnRlcnJ1cHRlZEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSBib29sZWFuIGRvQWNxdWlyZU5hbm9zKAotaW50Ci1sb25nKQotCi1wcml2YXRlIHZvaWQgZG9BY3F1aXJlU2hhcmVkKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSW50ZXJydXB0ZWRFeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCBkb0FjcXVpcmVTaGFyZWRJbnRlcnJ1cHRpYmx5KAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSW50ZXJydXB0ZWRFeGNlcHRpb247ICkKLXByaXZhdGUgYm9vbGVhbiBkb0FjcXVpcmVTaGFyZWROYW5vcygKLWludAotbG9uZykKLQotcHJpdmF0ZSBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5BYnN0cmFjdFF1ZXVlZFN5bmNocm9uaXplciROb2RlIGVucSgKLWphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkFic3RyYWN0UXVldWVkU3luY2hyb25pemVyJE5vZGUpCi0KLXByaXZhdGUgYm9vbGVhbiBmaW5kTm9kZUZyb21UYWlsKAotamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuQWJzdHJhY3RRdWV1ZWRTeW5jaHJvbml6ZXIkTm9kZSkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuVGhyZWFkIGZ1bGxHZXRGaXJzdFF1ZXVlZFRocmVhZCgpCi0KLXByaXZhdGUgc3RhdGljIGJvb2xlYW4gcGFya0FuZENoZWNrSW50ZXJydXB0KCkKLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZWxmSW50ZXJydXB0KCkKLQotcHJpdmF0ZSB2b2lkIHNldEhlYWQoCi1qYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5BYnN0cmFjdFF1ZXVlZFN5bmNocm9uaXplciROb2RlKQotCi1wcml2YXRlIHZvaWQgc2V0SGVhZEFuZFByb3BhZ2F0ZSgKLWphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkFic3RyYWN0UXVldWVkU3luY2hyb25pemVyJE5vZGUKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzaG91bGRQYXJrQWZ0ZXJGYWlsZWRBY3F1aXJlKAotamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuQWJzdHJhY3RRdWV1ZWRTeW5jaHJvbml6ZXIkTm9kZQotamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuQWJzdHJhY3RRdWV1ZWRTeW5jaHJvbml6ZXIkTm9kZSkKLQotcHJpdmF0ZSB2b2lkIHVucGFya1N1Y2Nlc3NvcigKLWphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkFic3RyYWN0UXVldWVkU3luY2hyb25pemVyJE5vZGUpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIGFjcXVpcmUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbnRlcnJ1cHRlZEV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIHZvaWQgYWNxdWlyZUludGVycnVwdGlibHkoCi1pbnQpCi0KLWZpbmFsIGJvb2xlYW4gYWNxdWlyZVF1ZXVlZCgKLWphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkFic3RyYWN0UXVldWVkU3luY2hyb25pemVyJE5vZGUKLWludCkKLQotcHVibGljIGZpbmFsIHZvaWQgYWNxdWlyZVNoYXJlZCgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0ludGVycnVwdGVkRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgdm9pZCBhY3F1aXJlU2hhcmVkSW50ZXJydXB0aWJseSgKLWludCkKLQotcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gY29tcGFyZUFuZFNldFN0YXRlKAotaW50Ci1pbnQpCi0KLWZpbmFsIGludCBmdWxseVJlbGVhc2UoCi1qYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5BYnN0cmFjdFF1ZXVlZFN5bmNocm9uaXplciROb2RlKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9Db2xsZWN0aW9uPExqYXZhL2xhbmcvVGhyZWFkOz47ICkKLXB1YmxpYyBmaW5hbCBqYXZhLnV0aWwuQ29sbGVjdGlvbiBnZXRFeGNsdXNpdmVRdWV1ZWRUaHJlYWRzKCkKLQotcHVibGljIGZpbmFsIGphdmEubGFuZy5UaHJlYWQgZ2V0Rmlyc3RRdWV1ZWRUaHJlYWQoKQotCi1wdWJsaWMgZmluYWwgaW50IGdldFF1ZXVlTGVuZ3RoKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvQ29sbGVjdGlvbjxMamF2YS9sYW5nL1RocmVhZDs+OyApCi1wdWJsaWMgZmluYWwgamF2YS51dGlsLkNvbGxlY3Rpb24gZ2V0UXVldWVkVGhyZWFkcygpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0NvbGxlY3Rpb248TGphdmEvbGFuZy9UaHJlYWQ7PjsgKQotcHVibGljIGZpbmFsIGphdmEudXRpbC5Db2xsZWN0aW9uIGdldFNoYXJlZFF1ZXVlZFRocmVhZHMoKQotCi1wcm90ZWN0ZWQgZmluYWwgaW50IGdldFN0YXRlKCkKLQotcHVibGljIGZpbmFsIGludCBnZXRXYWl0UXVldWVMZW5ndGgoCi1qYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5BYnN0cmFjdFF1ZXVlZFN5bmNocm9uaXplciRDb25kaXRpb25PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvY29uY3VycmVudC9sb2Nrcy9BYnN0cmFjdFF1ZXVlZFN5bmNocm9uaXplciRDb25kaXRpb25PYmplY3Q7KUxqYXZhL3V0aWwvQ29sbGVjdGlvbjxMamF2YS9sYW5nL1RocmVhZDs+OyApCi1wdWJsaWMgZmluYWwgamF2YS51dGlsLkNvbGxlY3Rpb24gZ2V0V2FpdGluZ1RocmVhZHMoCi1qYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5BYnN0cmFjdFF1ZXVlZFN5bmNocm9uaXplciRDb25kaXRpb25PYmplY3QpCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGhhc0NvbnRlbmRlZCgpCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGhhc1F1ZXVlZFRocmVhZHMoKQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNXYWl0ZXJzKAotamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuQWJzdHJhY3RRdWV1ZWRTeW5jaHJvbml6ZXIkQ29uZGl0aW9uT2JqZWN0KQotCi1wcm90ZWN0ZWQgYm9vbGVhbiBpc0hlbGRFeGNsdXNpdmVseSgpCi0KLWZpbmFsIGJvb2xlYW4gaXNPblN5bmNRdWV1ZSgKLWphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkFic3RyYWN0UXVldWVkU3luY2hyb25pemVyJE5vZGUpCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGlzUXVldWVkKAotamF2YS5sYW5nLlRocmVhZCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gb3ducygKLWphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkFic3RyYWN0UXVldWVkU3luY2hyb25pemVyJENvbmRpdGlvbk9iamVjdCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gcmVsZWFzZSgKLWludCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gcmVsZWFzZVNoYXJlZCgKLWludCkKLQotcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0U3RhdGUoCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotZmluYWwgYm9vbGVhbiB0cmFuc2ZlckFmdGVyQ2FuY2VsbGVkV2FpdCgKLWphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkFic3RyYWN0UXVldWVkU3luY2hyb25pemVyJE5vZGUpCi0KLWZpbmFsIGJvb2xlYW4gdHJhbnNmZXJGb3JTaWduYWwoCi1qYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5BYnN0cmFjdFF1ZXVlZFN5bmNocm9uaXplciROb2RlKQotCi1wcm90ZWN0ZWQgYm9vbGVhbiB0cnlBY3F1aXJlKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSW50ZXJydXB0ZWRFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBib29sZWFuIHRyeUFjcXVpcmVOYW5vcygKLWludAotbG9uZykKLQotcHJvdGVjdGVkIGludCB0cnlBY3F1aXJlU2hhcmVkKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSW50ZXJydXB0ZWRFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBib29sZWFuIHRyeUFjcXVpcmVTaGFyZWROYW5vcygKLWludAotbG9uZykKLQotcHJvdGVjdGVkIGJvb2xlYW4gdHJ5UmVsZWFzZSgKLWludCkKLQotcHJvdGVjdGVkIGJvb2xlYW4gdHJ5UmVsZWFzZVNoYXJlZCgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL2NvbmN1cnJlbnQvQ291bnREb3duTGF0Y2g7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjYgbmFtZSA9U3luYyApCi1maW5hbCBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaCRTeW5jIGV4dGVuZHMgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuQWJzdHJhY3RRdWV1ZWRTeW5jaHJvbml6ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1pbnQpCi0KLSBpbnQgZ2V0Q291bnQoKQotCi1wdWJsaWMgaW50IHRyeUFjcXVpcmVTaGFyZWQoCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIHRyeVJlbGVhc2VTaGFyZWQoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MamF2YS91dGlsL2NvbmN1cnJlbnQvQ291bnREb3duTGF0Y2gkU3luYzsgKQotcHVibGljIGNsYXNzIGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoJFN5bmMgc3luYwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0ludGVycnVwdGVkRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBhd2FpdCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbnRlcnJ1cHRlZEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gYXdhaXQoCi1sb25nCi1qYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdCkKLQotcHVibGljIHZvaWQgY291bnREb3duKCkKLQotcHVibGljIGxvbmcgZ2V0Q291bnQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS51dGlsLmNvbmN1cnJlbnQuQ3ljbGljQmFycmllciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuUnVubmFibGUgYmFycmllckNvbW1hbmQKLQotcHJpdmF0ZSBib29sZWFuIGJyb2tlbgotCi1wcml2YXRlIGludCBjb3VudAotCi1wcml2YXRlIGxvbmcgZ2VuZXJhdGlvbgotCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudExvY2sgbG9jawotCi1wcml2YXRlIGZpbmFsIGludCBwYXJ0aWVzCi0KLXByaXZhdGUgZmluYWwgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuQ29uZGl0aW9uIHRyaXAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotamF2YS5sYW5nLlJ1bm5hYmxlKQotCi1wcml2YXRlIHZvaWQgYnJlYWtCYXJyaWVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0ludGVycnVwdGVkRXhjZXB0aW9uO0xqYXZhL3V0aWwvY29uY3VycmVudC9Ccm9rZW5CYXJyaWVyRXhjZXB0aW9uO0xqYXZhL3V0aWwvY29uY3VycmVudC9UaW1lb3V0RXhjZXB0aW9uOyApCi1wcml2YXRlIGludCBkb3dhaXQoCi1ib29sZWFuCi1sb25nKQotCi1wcml2YXRlIHZvaWQgbmV4dEdlbmVyYXRpb24oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSW50ZXJydXB0ZWRFeGNlcHRpb247TGphdmEvdXRpbC9jb25jdXJyZW50L0Jyb2tlbkJhcnJpZXJFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgYXdhaXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSW50ZXJydXB0ZWRFeGNlcHRpb247TGphdmEvdXRpbC9jb25jdXJyZW50L0Jyb2tlbkJhcnJpZXJFeGNlcHRpb247TGphdmEvdXRpbC9jb25jdXJyZW50L1RpbWVvdXRFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgYXdhaXQoCi1sb25nCi1qYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdCkKLQotcHVibGljIGludCBnZXROdW1iZXJXYWl0aW5nKCkKLQotcHVibGljIGludCBnZXRQYXJ0aWVzKCkKLQotcHVibGljIGJvb2xlYW4gaXNCcm9rZW4oKQotCi1wdWJsaWMgdm9pZCByZXNldCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxFOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS9sYW5nL09iamVjdDtMamF2YS91dGlsL0l0ZXJhdG9yPFRFOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MiBuYW1lID1JdHIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9jb25jdXJyZW50L0RlbGF5UXVldWU7ICkKLSBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5EZWxheVF1ZXVlJEl0ciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuSXRlcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0l0ZXJhdG9yPFRFOz47ICkKLXByaXZhdGUgZmluYWwgamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXIKLQotZmluYWwgamF2YS51dGlsLmNvbmN1cnJlbnQuRGVsYXlRdWV1ZSB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0l0ZXJhdG9yPFRFOz47KVYgKQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLmNvbmN1cnJlbnQuRGVsYXlRdWV1ZQotamF2YS51dGlsLkl0ZXJhdG9yKQotCi1wdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVRFOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBuZXh0KCkKLQotcHVibGljIHZvaWQgcmVtb3ZlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxqYXZhL3V0aWwvY29uY3VycmVudC9EZWxheVF1ZXVlJEl0cjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxFOjpMamF2YS91dGlsL2NvbmN1cnJlbnQvRGVsYXllZDs+TGphdmEvdXRpbC9BYnN0cmFjdFF1ZXVlPFRFOz47TGphdmEvdXRpbC9jb25jdXJyZW50L0Jsb2NraW5nUXVldWU8VEU7PjsgKQotcHVibGljIGNsYXNzIGphdmEudXRpbC5jb25jdXJyZW50LkRlbGF5UXVldWUgZXh0ZW5kcyBqYXZhLnV0aWwuQWJzdHJhY3RRdWV1ZSBpbXBsZW1lbnRzIGphdmEudXRpbC5jb25jdXJyZW50LkJsb2NraW5nUXVldWUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIGJvb2xlYW4gJGFzc2VydGlvbnNEaXNhYmxlZAotCi1wcml2YXRlIGZpbmFsIHRyYW5zaWVudCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5Db25kaXRpb24gYXZhaWxhYmxlCi0KLXByaXZhdGUgZmluYWwgdHJhbnNpZW50IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudExvY2sgbG9jawotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvUHJpb3JpdHlRdWV1ZTxURTs+OyApCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5Qcmlvcml0eVF1ZXVlIHEKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvQ29sbGVjdGlvbjwrVEU7PjspViApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuQ29sbGVjdGlvbikKLQotc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudExvY2sgYWNjZXNzJDAwMCgKLWphdmEudXRpbC5jb25jdXJyZW50LkRlbGF5UXVldWUpCi0KLXB1YmxpYyB2b2xhdGlsZSBib29sZWFuIGFkZCgKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRFOylaICkKLXB1YmxpYyBib29sZWFuIGFkZCgKLWphdmEudXRpbC5jb25jdXJyZW50LkRlbGF5ZWQpCi0KLXB1YmxpYyB2b2lkIGNsZWFyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9Db2xsZWN0aW9uPC1URTs+OylJICkKLXB1YmxpYyBpbnQgZHJhaW5UbygKLWphdmEudXRpbC5Db2xsZWN0aW9uKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0NvbGxlY3Rpb248LVRFOz47SSlJICkKLXB1YmxpYyBpbnQgZHJhaW5UbygKLWphdmEudXRpbC5Db2xsZWN0aW9uCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0l0ZXJhdG9yPFRFOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuSXRlcmF0b3IgaXRlcmF0b3IoKQotCi1wdWJsaWMgdm9sYXRpbGUgYm9vbGVhbiBvZmZlcigKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbnRlcnJ1cHRlZEV4Y2VwdGlvbjsgKQotcHVibGljIHZvbGF0aWxlIGJvb2xlYW4gb2ZmZXIoCi1qYXZhLmxhbmcuT2JqZWN0Ci1sb25nCi1qYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEU7KVogKQotcHVibGljIGJvb2xlYW4gb2ZmZXIoCi1qYXZhLnV0aWwuY29uY3VycmVudC5EZWxheWVkKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShURTtKTGphdmEvdXRpbC9jb25jdXJyZW50L1RpbWVVbml0OylaICkKLXB1YmxpYyBib29sZWFuIG9mZmVyKAotamF2YS51dGlsLmNvbmN1cnJlbnQuRGVsYXllZAotbG9uZwotamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IHBlZWsoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVEU7ICkKLXB1YmxpYyBqYXZhLnV0aWwuY29uY3VycmVudC5EZWxheWVkIHBlZWsoKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBwb2xsKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0ludGVycnVwdGVkRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBwb2xsKAotbG9uZwotamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClURTsgKQotcHVibGljIGphdmEudXRpbC5jb25jdXJyZW50LkRlbGF5ZWQgcG9sbCgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KEpMamF2YS91dGlsL2NvbmN1cnJlbnQvVGltZVVuaXQ7KVRFOyApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbnRlcnJ1cHRlZEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEudXRpbC5jb25jdXJyZW50LkRlbGF5ZWQgcG9sbCgKLWxvbmcKLWphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSW50ZXJydXB0ZWRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2xhdGlsZSB2b2lkIHB1dCgKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRFOylWICkKLXB1YmxpYyB2b2lkIHB1dCgKLWphdmEudXRpbC5jb25jdXJyZW50LkRlbGF5ZWQpCi0KLXB1YmxpYyBpbnQgcmVtYWluaW5nQ2FwYWNpdHkoKQotCi1wdWJsaWMgYm9vbGVhbiByZW1vdmUoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50IHNpemUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSW50ZXJydXB0ZWRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IHRha2UoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVEU7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0ludGVycnVwdGVkRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS51dGlsLmNvbmN1cnJlbnQuRGVsYXllZCB0YWtlKCkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3RbXSB0b0FycmF5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+KFtUVDspW1RUOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdFtdIHRvQXJyYXkoCi1qYXZhLmxhbmcuT2JqZWN0W10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcvQ29tcGFyYWJsZTxMamF2YS91dGlsL2NvbmN1cnJlbnQvRGVsYXllZDs+OyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEudXRpbC5jb25jdXJyZW50LkRlbGF5ZWQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5sYW5nLkNvbXBhcmFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgbG9uZyBnZXREZWxheSgKLWphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VjpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvbGFuZy9PYmplY3Q7ICkKLXB1YmxpYyBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5FeGNoYW5nZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgaW50IGFycml2YWxDb3VudAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPVRWOyApCi1wcml2YXRlIGphdmEubGFuZy5PYmplY3QgaXRlbQotCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudExvY2sgbG9jawotCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkNvbmRpdGlvbiB0YWtlbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRWO1pKKVRWOyApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbnRlcnJ1cHRlZEV4Y2VwdGlvbjtMamF2YS91dGlsL2NvbmN1cnJlbnQvVGltZW91dEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSBqYXZhLmxhbmcuT2JqZWN0IGRvRXhjaGFuZ2UoCi1qYXZhLmxhbmcuT2JqZWN0Ci1ib29sZWFuCi1sb25nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSW50ZXJydXB0ZWRFeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVFY7KVRWOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBleGNoYW5nZSgKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbnRlcnJ1cHRlZEV4Y2VwdGlvbjtMamF2YS91dGlsL2NvbmN1cnJlbnQvVGltZW91dEV4Y2VwdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUVjtKTGphdmEvdXRpbC9jb25jdXJyZW50L1RpbWVVbml0OylUVjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZXhjaGFuZ2UoCi1qYXZhLmxhbmcuT2JqZWN0Ci1sb25nCi1qYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigpCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxWOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS9sYW5nL09iamVjdDsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gY2FuY2VsKAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0ludGVycnVwdGVkRXhjZXB0aW9uO0xqYXZhL3V0aWwvY29uY3VycmVudC9FeGVjdXRpb25FeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVRWOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLk9iamVjdCBnZXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShKTGphdmEvdXRpbC9jb25jdXJyZW50L1RpbWVVbml0OylUVjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSW50ZXJydXB0ZWRFeGNlcHRpb247TGphdmEvdXRpbC9jb25jdXJyZW50L0V4ZWN1dGlvbkV4Y2VwdGlvbjtMamF2YS91dGlsL2NvbmN1cnJlbnQvVGltZW91dEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5PYmplY3QgZ2V0KAotbG9uZwotamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzQ2FuY2VsbGVkKCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNEb25lKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFY6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3V0aWwvY29uY3VycmVudC9GdXR1cmU8VFY7PjtMamF2YS9sYW5nL1J1bm5hYmxlOyApCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxqYXZhL3V0aWwvY29uY3VycmVudC9GdXR1cmVUYXNrJFN5bmM7ICkKLXB1YmxpYyBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmVUYXNrIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZSwgamF2YS5sYW5nLlJ1bm5hYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9jb25jdXJyZW50L0Z1dHVyZVRhc2s8VFY7Pi5TeW5jOyApCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZVRhc2skU3luYyBzeW5jCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9SdW5uYWJsZTtUVjspViApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuUnVubmFibGUKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvY29uY3VycmVudC9DYWxsYWJsZTxUVjs+OylWICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlKQotCi1wdWJsaWMgYm9vbGVhbiBjYW5jZWwoCi1ib29sZWFuKQotCi1wcm90ZWN0ZWQgdm9pZCBkb25lKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVRWOyApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbnRlcnJ1cHRlZEV4Y2VwdGlvbjtMamF2YS91dGlsL2NvbmN1cnJlbnQvRXhlY3V0aW9uRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShKTGphdmEvdXRpbC9jb25jdXJyZW50L1RpbWVVbml0OylUVjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSW50ZXJydXB0ZWRFeGNlcHRpb247TGphdmEvdXRpbC9jb25jdXJyZW50L0V4ZWN1dGlvbkV4Y2VwdGlvbjtMamF2YS91dGlsL2NvbmN1cnJlbnQvVGltZW91dEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0KAotbG9uZwotamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQpCi0KLXB1YmxpYyBib29sZWFuIGlzQ2FuY2VsbGVkKCkKLQotcHVibGljIGJvb2xlYW4gaXNEb25lKCkKLQotcHVibGljIHZvaWQgcnVuKCkKLQotcHJvdGVjdGVkIGJvb2xlYW4gcnVuQW5kUmVzZXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUVjspViApCi1wcm90ZWN0ZWQgdm9pZCBzZXQoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRFeGNlcHRpb24oCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MiBuYW1lID1RdWV1ZWluZ0Z1dHVyZSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL2NvbmN1cnJlbnQvRXhlY3V0b3JDb21wbGV0aW9uU2VydmljZTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvY29uY3VycmVudC9GdXR1cmVUYXNrPFRWOz47ICkKLSBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvckNvbXBsZXRpb25TZXJ2aWNlJFF1ZXVlaW5nRnV0dXJlIGV4dGVuZHMgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlVGFzawotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvckNvbXBsZXRpb25TZXJ2aWNlIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvUnVubmFibGU7VFY7KVYgKQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JDb21wbGV0aW9uU2VydmljZQotamF2YS5sYW5nLlJ1bm5hYmxlCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL2NvbmN1cnJlbnQvQ2FsbGFibGU8VFY7PjspViApCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvckNvbXBsZXRpb25TZXJ2aWNlCi1qYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZSkKLQotcHJvdGVjdGVkIHZvaWQgZG9uZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxWOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS9sYW5nL09iamVjdDtMamF2YS91dGlsL2NvbmN1cnJlbnQvQ29tcGxldGlvblNlcnZpY2U8VFY7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MamF2YS91dGlsL2NvbmN1cnJlbnQvRXhlY3V0b3JDb21wbGV0aW9uU2VydmljZSRRdWV1ZWluZ0Z1dHVyZTsgKQotcHVibGljIGNsYXNzIGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yQ29tcGxldGlvblNlcnZpY2UgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29tcGxldGlvblNlcnZpY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL2NvbmN1cnJlbnQvQmxvY2tpbmdRdWV1ZTxMamF2YS91dGlsL2NvbmN1cnJlbnQvRnV0dXJlPFRWOz47PjsgKQotcHJpdmF0ZSBmaW5hbCBqYXZhLnV0aWwuY29uY3VycmVudC5CbG9ja2luZ1F1ZXVlIGNvbXBsZXRpb25RdWV1ZQotCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yIGV4ZWN1dG9yCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3IpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvY29uY3VycmVudC9FeGVjdXRvcjtMamF2YS91dGlsL2NvbmN1cnJlbnQvQmxvY2tpbmdRdWV1ZTxMamF2YS91dGlsL2NvbmN1cnJlbnQvRnV0dXJlPFRWOz47PjspViApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcgotamF2YS51dGlsLmNvbmN1cnJlbnQuQmxvY2tpbmdRdWV1ZSkKLQotc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LkJsb2NraW5nUXVldWUgYWNjZXNzJDAwMCgKLWphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yQ29tcGxldGlvblNlcnZpY2UpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL2NvbmN1cnJlbnQvRnV0dXJlPFRWOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmUgcG9sbCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbnRlcnJ1cHRlZEV4Y2VwdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShKTGphdmEvdXRpbC9jb25jdXJyZW50L1RpbWVVbml0OylMamF2YS91dGlsL2NvbmN1cnJlbnQvRnV0dXJlPFRWOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmUgcG9sbCgKLWxvbmcKLWphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1J1bm5hYmxlO1RWOylMamF2YS91dGlsL2NvbmN1cnJlbnQvRnV0dXJlPFRWOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmUgc3VibWl0KAotamF2YS5sYW5nLlJ1bm5hYmxlCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL2NvbmN1cnJlbnQvQ2FsbGFibGU8VFY7PjspTGphdmEvdXRpbC9jb25jdXJyZW50L0Z1dHVyZTxUVjs+OyApCi1wdWJsaWMgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlIHN1Ym1pdCgKLWphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9jb25jdXJyZW50L0Z1dHVyZTxUVjs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbnRlcnJ1cHRlZEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZSB0YWtlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkRmFjdG9yeSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlRocmVhZCBuZXdUaHJlYWQoCi1qYXZhLmxhbmcuUnVubmFibGUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9jb25jdXJyZW50L0V4ZWN1dG9yczsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPURlZmF1bHRUaHJlYWRGYWN0b3J5ICkKLSBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnMkRGVmYXVsdFRocmVhZEZhY3RvcnkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkRmFjdG9yeQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXIgcG9vbE51bWJlcgotCi1maW5hbCBqYXZhLmxhbmcuVGhyZWFkR3JvdXAgZ3JvdXAKLQotZmluYWwgamF2YS5sYW5nLlN0cmluZyBuYW1lUHJlZml4Ci0KLWZpbmFsIGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyIHRocmVhZE51bWJlcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGphdmEubGFuZy5UaHJlYWQgbmV3VGhyZWFkKAotamF2YS5sYW5nLlJ1bm5hYmxlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvY29uY3VycmVudC9FeGVjdXRvcnM7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1EZWxlZ2F0ZWRFeGVjdXRvclNlcnZpY2UgKQotIGNsYXNzIGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9ycyREZWxlZ2F0ZWRFeGVjdXRvclNlcnZpY2UgZXh0ZW5kcyBqYXZhLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEV4ZWN1dG9yU2VydmljZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZSBlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSW50ZXJydXB0ZWRFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIGF3YWl0VGVybWluYXRpb24oCi1sb25nCi1qYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdCkKLQotcHVibGljIHZvaWQgZXhlY3V0ZSgKLWphdmEubGFuZy5SdW5uYWJsZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0ludGVycnVwdGVkRXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFQ6TGphdmEvbGFuZy9PYmplY3Q7PihMamF2YS91dGlsL0NvbGxlY3Rpb248TGphdmEvdXRpbC9jb25jdXJyZW50L0NhbGxhYmxlPFRUOz47PjspTGphdmEvdXRpbC9MaXN0PExqYXZhL3V0aWwvY29uY3VycmVudC9GdXR1cmU8VFQ7Pjs+OyApCi1wdWJsaWMgamF2YS51dGlsLkxpc3QgaW52b2tlQWxsKAotamF2YS51dGlsLkNvbGxlY3Rpb24pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFQ6TGphdmEvbGFuZy9PYmplY3Q7PihMamF2YS91dGlsL0NvbGxlY3Rpb248TGphdmEvdXRpbC9jb25jdXJyZW50L0NhbGxhYmxlPFRUOz47PjtKTGphdmEvdXRpbC9jb25jdXJyZW50L1RpbWVVbml0OylMamF2YS91dGlsL0xpc3Q8TGphdmEvdXRpbC9jb25jdXJyZW50L0Z1dHVyZTxUVDs+Oz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0ludGVycnVwdGVkRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS51dGlsLkxpc3QgaW52b2tlQWxsKAotamF2YS51dGlsLkNvbGxlY3Rpb24KLWxvbmcKLWphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSW50ZXJydXB0ZWRFeGNlcHRpb247TGphdmEvdXRpbC9jb25jdXJyZW50L0V4ZWN1dGlvbkV4Y2VwdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz4oTGphdmEvdXRpbC9Db2xsZWN0aW9uPExqYXZhL3V0aWwvY29uY3VycmVudC9DYWxsYWJsZTxUVDs+Oz47KVRUOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBpbnZva2VBbnkoCi1qYXZhLnV0aWwuQ29sbGVjdGlvbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+KExqYXZhL3V0aWwvQ29sbGVjdGlvbjxMamF2YS91dGlsL2NvbmN1cnJlbnQvQ2FsbGFibGU8VFQ7Pjs+O0pMamF2YS91dGlsL2NvbmN1cnJlbnQvVGltZVVuaXQ7KVRUOyApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbnRlcnJ1cHRlZEV4Y2VwdGlvbjtMamF2YS91dGlsL2NvbmN1cnJlbnQvRXhlY3V0aW9uRXhjZXB0aW9uO0xqYXZhL3V0aWwvY29uY3VycmVudC9UaW1lb3V0RXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBpbnZva2VBbnkoCi1qYXZhLnV0aWwuQ29sbGVjdGlvbgotbG9uZwotamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQpCi0KLXB1YmxpYyBib29sZWFuIGlzU2h1dGRvd24oKQotCi1wdWJsaWMgYm9vbGVhbiBpc1Rlcm1pbmF0ZWQoKQotCi1wdWJsaWMgdm9pZCBzaHV0ZG93bigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0xpc3Q8TGphdmEvbGFuZy9SdW5uYWJsZTs+OyApCi1wdWJsaWMgamF2YS51dGlsLkxpc3Qgc2h1dGRvd25Ob3coKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1J1bm5hYmxlOylMamF2YS91dGlsL2NvbmN1cnJlbnQvRnV0dXJlPCo+OyApCi1wdWJsaWMgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlIHN1Ym1pdCgKLWphdmEubGFuZy5SdW5uYWJsZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+KExqYXZhL2xhbmcvUnVubmFibGU7VFQ7KUxqYXZhL3V0aWwvY29uY3VycmVudC9GdXR1cmU8VFQ7PjsgKQotcHVibGljIGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZSBzdWJtaXQoCi1qYXZhLmxhbmcuUnVubmFibGUKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFQ6TGphdmEvbGFuZy9PYmplY3Q7PihMamF2YS91dGlsL2NvbmN1cnJlbnQvQ2FsbGFibGU8VFQ7PjspTGphdmEvdXRpbC9jb25jdXJyZW50L0Z1dHVyZTxUVDs+OyApCi1wdWJsaWMgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlIHN1Ym1pdCgKLWphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5TY2hlZHVsZWRFeGVjdXRvclNlcnZpY2UgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9SdW5uYWJsZTtKTGphdmEvdXRpbC9jb25jdXJyZW50L1RpbWVVbml0OylMamF2YS91dGlsL2NvbmN1cnJlbnQvU2NoZWR1bGVkRnV0dXJlPCo+OyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkRnV0dXJlIHNjaGVkdWxlKAotamF2YS5sYW5nLlJ1bm5hYmxlCi1sb25nCi1qYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VjpMamF2YS9sYW5nL09iamVjdDs+KExqYXZhL3V0aWwvY29uY3VycmVudC9DYWxsYWJsZTxUVjs+O0pMamF2YS91dGlsL2NvbmN1cnJlbnQvVGltZVVuaXQ7KUxqYXZhL3V0aWwvY29uY3VycmVudC9TY2hlZHVsZWRGdXR1cmU8VFY7PjsgKQotcHVibGljIGFic3RyYWN0IGphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZEZ1dHVyZSBzY2hlZHVsZSgKLWphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlCi1sb25nCi1qYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9SdW5uYWJsZTtKSkxqYXZhL3V0aWwvY29uY3VycmVudC9UaW1lVW5pdDspTGphdmEvdXRpbC9jb25jdXJyZW50L1NjaGVkdWxlZEZ1dHVyZTwqPjsgKQotcHVibGljIGFic3RyYWN0IGphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZEZ1dHVyZSBzY2hlZHVsZUF0Rml4ZWRSYXRlKAotamF2YS5sYW5nLlJ1bm5hYmxlCi1sb25nCi1sb25nCi1qYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9SdW5uYWJsZTtKSkxqYXZhL3V0aWwvY29uY3VycmVudC9UaW1lVW5pdDspTGphdmEvdXRpbC9jb25jdXJyZW50L1NjaGVkdWxlZEZ1dHVyZTwqPjsgKQotcHVibGljIGFic3RyYWN0IGphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZEZ1dHVyZSBzY2hlZHVsZVdpdGhGaXhlZERlbGF5KAotamF2YS5sYW5nLlJ1bm5hYmxlCi1sb25nCi1sb25nCi1qYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL2NvbmN1cnJlbnQvRXhlY3V0b3JzOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9RGVsZWdhdGVkU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlICkKLSBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnMkRGVsZWdhdGVkU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlIGV4dGVuZHMgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzJERlbGVnYXRlZEV4ZWN1dG9yU2VydmljZSBpbXBsZW1lbnRzIGphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSBlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1J1bm5hYmxlO0pMamF2YS91dGlsL2NvbmN1cnJlbnQvVGltZVVuaXQ7KUxqYXZhL3V0aWwvY29uY3VycmVudC9TY2hlZHVsZWRGdXR1cmU8Kj47ICkKLXB1YmxpYyBqYXZhLnV0aWwuY29uY3VycmVudC5TY2hlZHVsZWRGdXR1cmUgc2NoZWR1bGUoCi1qYXZhLmxhbmcuUnVubmFibGUKLWxvbmcKLWphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxWOkxqYXZhL2xhbmcvT2JqZWN0Oz4oTGphdmEvdXRpbC9jb25jdXJyZW50L0NhbGxhYmxlPFRWOz47SkxqYXZhL3V0aWwvY29uY3VycmVudC9UaW1lVW5pdDspTGphdmEvdXRpbC9jb25jdXJyZW50L1NjaGVkdWxlZEZ1dHVyZTxUVjs+OyApCi1wdWJsaWMgamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkRnV0dXJlIHNjaGVkdWxlKAotamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGUKLWxvbmcKLWphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1J1bm5hYmxlO0pKTGphdmEvdXRpbC9jb25jdXJyZW50L1RpbWVVbml0OylMamF2YS91dGlsL2NvbmN1cnJlbnQvU2NoZWR1bGVkRnV0dXJlPCo+OyApCi1wdWJsaWMgamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkRnV0dXJlIHNjaGVkdWxlQXRGaXhlZFJhdGUoCi1qYXZhLmxhbmcuUnVubmFibGUKLWxvbmcKLWxvbmcKLWphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1J1bm5hYmxlO0pKTGphdmEvdXRpbC9jb25jdXJyZW50L1RpbWVVbml0OylMamF2YS91dGlsL2NvbmN1cnJlbnQvU2NoZWR1bGVkRnV0dXJlPCo+OyApCi1wdWJsaWMgamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkRnV0dXJlIHNjaGVkdWxlV2l0aEZpeGVkRGVsYXkoCi1qYXZhLmxhbmcuUnVubmFibGUKLWxvbmcKLWxvbmcKLWphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS91dGlsL2NvbmN1cnJlbnQvQ2FsbGFibGU8TGphdmEvbGFuZy9PYmplY3Q7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9jb25jdXJyZW50L0V4ZWN1dG9yczsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNCBuYW1lID1Qcml2aWxlZ2VkQWN0aW9uQWRhcHRlciApCi1maW5hbCBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnMkUHJpdmlsZWdlZEFjdGlvbkFkYXB0ZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb24gYWN0aW9uCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBjYWxsKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi0gY2xhc3MgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzJFByaXZpbGVnZWRDYWxsYWJsZSQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnMkUHJpdmlsZWdlZENhbGxhYmxlIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9ycyRQcml2aWxlZ2VkQ2FsbGFibGUpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9jb25jdXJyZW50L0V4ZWN1dG9yczsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNCBuYW1lID1Qcml2aWxlZ2VkQ2FsbGFibGUgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS9sYW5nL09iamVjdDtMamF2YS91dGlsL2NvbmN1cnJlbnQvQ2FsbGFibGU8VFQ7PjsgKQotZmluYWwgY2xhc3MgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzJFByaXZpbGVnZWRDYWxsYWJsZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbENvbnRleHQgYWNjCi0KLXByaXZhdGUgamF2YS5sYW5nLkV4Y2VwdGlvbiBleGNlcHRpb24KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1UVDsgKQotcHJpdmF0ZSBqYXZhLmxhbmcuT2JqZWN0IHJlc3VsdAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvY29uY3VycmVudC9DYWxsYWJsZTxUVDs+OyApCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlIHRhc2sKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL2NvbmN1cnJlbnQvQ2FsbGFibGU8VFQ7PjspViApCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZSkKLQotc3RhdGljIGphdmEubGFuZy5PYmplY3QgYWNjZXNzJDAwMigKLWphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9ycyRQcml2aWxlZ2VkQ2FsbGFibGUKLWphdmEubGFuZy5PYmplY3QpCi0KLXN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZSBhY2Nlc3MkMTAwKAotamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzJFByaXZpbGVnZWRDYWxsYWJsZSkKLQotc3RhdGljIGphdmEubGFuZy5FeGNlcHRpb24gYWNjZXNzJDIwMigKLWphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9ycyRQcml2aWxlZ2VkQ2FsbGFibGUKLWphdmEubGFuZy5FeGNlcHRpb24pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClUVDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBjYWxsKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi0gY2xhc3MgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzJFByaXZpbGVnZWRDYWxsYWJsZVVzaW5nQ3VycmVudENsYXNzTG9hZGVyJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9ycyRQcml2aWxlZ2VkQ2FsbGFibGVVc2luZ0N1cnJlbnRDbGFzc0xvYWRlciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnMkUHJpdmlsZWdlZENhbGxhYmxlVXNpbmdDdXJyZW50Q2xhc3NMb2FkZXIpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9jb25jdXJyZW50L0V4ZWN1dG9yczsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS9sYW5nL09iamVjdDtMamF2YS91dGlsL2NvbmN1cnJlbnQvQ2FsbGFibGU8VFQ7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNCBuYW1lID1Qcml2aWxlZ2VkQ2FsbGFibGVVc2luZ0N1cnJlbnRDbGFzc0xvYWRlciApCi1maW5hbCBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnMkUHJpdmlsZWdlZENhbGxhYmxlVXNpbmdDdXJyZW50Q2xhc3NMb2FkZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xDb250ZXh0IGFjYwotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5DbGFzc0xvYWRlciBjY2wKLQotcHJpdmF0ZSBqYXZhLmxhbmcuRXhjZXB0aW9uIGV4Y2VwdGlvbgotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPVRUOyApCi1wcml2YXRlIGphdmEubGFuZy5PYmplY3QgcmVzdWx0Ci1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9jb25jdXJyZW50L0NhbGxhYmxlPFRUOz47ICkKLXByaXZhdGUgZmluYWwgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGUgdGFzawotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvY29uY3VycmVudC9DYWxsYWJsZTxUVDs+OylWICkKLSB2b2lkIDxpbml0PigKLWphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlKQotCi1zdGF0aWMgamF2YS5sYW5nLkNsYXNzTG9hZGVyIGFjY2VzcyQzMDAoCi1qYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnMkUHJpdmlsZWdlZENhbGxhYmxlVXNpbmdDdXJyZW50Q2xhc3NMb2FkZXIpCi0KLXN0YXRpYyBqYXZhLmxhbmcuT2JqZWN0IGFjY2VzcyQ0MDIoCi1qYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnMkUHJpdmlsZWdlZENhbGxhYmxlVXNpbmdDdXJyZW50Q2xhc3NMb2FkZXIKLWphdmEubGFuZy5PYmplY3QpCi0KLXN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZSBhY2Nlc3MkNTAwKAotamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzJFByaXZpbGVnZWRDYWxsYWJsZVVzaW5nQ3VycmVudENsYXNzTG9hZGVyKQotCi1zdGF0aWMgamF2YS5sYW5nLkV4Y2VwdGlvbiBhY2Nlc3MkNjAyKAotamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzJFByaXZpbGVnZWRDYWxsYWJsZVVzaW5nQ3VycmVudENsYXNzTG9hZGVyCi1qYXZhLmxhbmcuRXhjZXB0aW9uKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVFQ7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgY2FsbCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNCBuYW1lID1Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uQWRhcHRlciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL2NvbmN1cnJlbnQvRXhlY3V0b3JzOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvdXRpbC9jb25jdXJyZW50L0NhbGxhYmxlPExqYXZhL2xhbmcvT2JqZWN0Oz47ICkKLWZpbmFsIGNsYXNzIGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9ycyRQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uQWRhcHRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbiBhY3Rpb24KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGNhbGwoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLSBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnMkUHJpdmlsZWdlZFRocmVhZEZhY3RvcnkkMSQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnMkUHJpdmlsZWdlZFRocmVhZEZhY3RvcnkkMSB0aGlzJDEKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnMkUHJpdmlsZWdlZFRocmVhZEZhY3RvcnkkMSkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi0gY2xhc3MgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzJFByaXZpbGVnZWRUaHJlYWRGYWN0b3J5JDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5sYW5nLlJ1bm5hYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9ycyRQcml2aWxlZ2VkVGhyZWFkRmFjdG9yeSB0aGlzJDAKLQotZmluYWwgamF2YS5sYW5nLlJ1bm5hYmxlIHZhbCRyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzJFByaXZpbGVnZWRUaHJlYWRGYWN0b3J5Ci1qYXZhLmxhbmcuUnVubmFibGUpCi0KLXB1YmxpYyB2b2lkIHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9jb25jdXJyZW50L0V4ZWN1dG9yczsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPVByaXZpbGVnZWRUaHJlYWRGYWN0b3J5ICkKLSBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnMkUHJpdmlsZWdlZFRocmVhZEZhY3RvcnkgZXh0ZW5kcyBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnMkRGVmYXVsdFRocmVhZEZhY3RvcnkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xDb250ZXh0IGFjYwotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5DbGFzc0xvYWRlciBjY2wKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1zdGF0aWMgamF2YS5sYW5nLkNsYXNzTG9hZGVyIGFjY2VzcyQ3MDAoCi1qYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnMkUHJpdmlsZWdlZFRocmVhZEZhY3RvcnkpCi0KLXN0YXRpYyBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xDb250ZXh0IGFjY2VzcyQ4MDAoCi1qYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnMkUHJpdmlsZWdlZFRocmVhZEZhY3RvcnkpCi0KLXB1YmxpYyBqYXZhLmxhbmcuVGhyZWFkIG5ld1RocmVhZCgKLWphdmEubGFuZy5SdW5uYWJsZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL2NvbmN1cnJlbnQvRXhlY3V0b3JzOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI0IG5hbWUgPVJ1bm5hYmxlQWRhcHRlciApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFQ6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3V0aWwvY29uY3VycmVudC9DYWxsYWJsZTxUVDs+OyApCi1maW5hbCBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnMkUnVubmFibGVBZGFwdGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9VFQ7ICkKLWZpbmFsIGphdmEubGFuZy5PYmplY3QgcmVzdWx0Ci0KLWZpbmFsIGphdmEubGFuZy5SdW5uYWJsZSB0YXNrCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9SdW5uYWJsZTtUVDspViApCi0gdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuUnVubmFibGUKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClUVDsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgY2FsbCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MamF2YS91dGlsL2NvbmN1cnJlbnQvRXhlY3V0b3JzJERlbGVnYXRlZFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZTtMamF2YS91dGlsL2NvbmN1cnJlbnQvRXhlY3V0b3JzJERlbGVnYXRlZEV4ZWN1dG9yU2VydmljZTtMamF2YS91dGlsL2NvbmN1cnJlbnQvRXhlY3V0b3JzJFByaXZpbGVnZWRUaHJlYWRGYWN0b3J5O0xqYXZhL3V0aWwvY29uY3VycmVudC9FeGVjdXRvcnMkRGVmYXVsdFRocmVhZEZhY3Rvcnk7TGphdmEvdXRpbC9jb25jdXJyZW50L0V4ZWN1dG9ycyRQcml2aWxlZ2VkQ2FsbGFibGVVc2luZ0N1cnJlbnRDbGFzc0xvYWRlcjtMamF2YS91dGlsL2NvbmN1cnJlbnQvRXhlY3V0b3JzJFByaXZpbGVnZWRDYWxsYWJsZTtMamF2YS91dGlsL2NvbmN1cnJlbnQvRXhlY3V0b3JzJFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb25BZGFwdGVyO0xqYXZhL3V0aWwvY29uY3VycmVudC9FeGVjdXRvcnMkUHJpdmlsZWdlZEFjdGlvbkFkYXB0ZXI7TGphdmEvdXRpbC9jb25jdXJyZW50L0V4ZWN1dG9ycyRSdW5uYWJsZUFkYXB0ZXI7ICkKLXB1YmxpYyBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvUnVubmFibGU7KUxqYXZhL3V0aWwvY29uY3VycmVudC9DYWxsYWJsZTxMamF2YS9sYW5nL09iamVjdDs+OyApCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlIGNhbGxhYmxlKAotamF2YS5sYW5nLlJ1bm5hYmxlKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz4oTGphdmEvbGFuZy9SdW5uYWJsZTtUVDspTGphdmEvdXRpbC9jb25jdXJyZW50L0NhbGxhYmxlPFRUOz47ICkKLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGUgY2FsbGFibGUoCi1qYXZhLmxhbmcuUnVubmFibGUKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3NlY3VyaXR5L1ByaXZpbGVnZWRBY3Rpb247KUxqYXZhL3V0aWwvY29uY3VycmVudC9DYWxsYWJsZTxMamF2YS9sYW5nL09iamVjdDs+OyApCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlIGNhbGxhYmxlKAotamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9zZWN1cml0eS9Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uOylMamF2YS91dGlsL2NvbmN1cnJlbnQvQ2FsbGFibGU8TGphdmEvbGFuZy9PYmplY3Q7PjsgKQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZSBjYWxsYWJsZSgKLWphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbikKLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRGYWN0b3J5IGRlZmF1bHRUaHJlYWRGYWN0b3J5KCkKLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2UgbmV3Q2FjaGVkVGhyZWFkUG9vbCgpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlIG5ld0NhY2hlZFRocmVhZFBvb2woCi1qYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRGYWN0b3J5KQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZSBuZXdGaXhlZFRocmVhZFBvb2woCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlIG5ld0ZpeGVkVGhyZWFkUG9vbCgKLWludAotamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkRmFjdG9yeSkKLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5TY2hlZHVsZWRFeGVjdXRvclNlcnZpY2UgbmV3U2NoZWR1bGVkVGhyZWFkUG9vbCgKLWludCkKLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5TY2hlZHVsZWRFeGVjdXRvclNlcnZpY2UgbmV3U2NoZWR1bGVkVGhyZWFkUG9vbCgKLWludAotamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkRmFjdG9yeSkKLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2UgbmV3U2luZ2xlVGhyZWFkRXhlY3V0b3IoKQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZSBuZXdTaW5nbGVUaHJlYWRFeGVjdXRvcigKLWphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZEZhY3RvcnkpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlIG5ld1NpbmdsZVRocmVhZFNjaGVkdWxlZEV4ZWN1dG9yKCkKLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5TY2hlZHVsZWRFeGVjdXRvclNlcnZpY2UgbmV3U2luZ2xlVGhyZWFkU2NoZWR1bGVkRXhlY3V0b3IoCi1qYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRGYWN0b3J5KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz4oTGphdmEvdXRpbC9jb25jdXJyZW50L0NhbGxhYmxlPFRUOz47KUxqYXZhL3V0aWwvY29uY3VycmVudC9DYWxsYWJsZTxUVDs+OyApCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlIHByaXZpbGVnZWRDYWxsYWJsZSgKLWphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz4oTGphdmEvdXRpbC9jb25jdXJyZW50L0NhbGxhYmxlPFRUOz47KUxqYXZhL3V0aWwvY29uY3VycmVudC9DYWxsYWJsZTxUVDs+OyApCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlIHByaXZpbGVnZWRDYWxsYWJsZVVzaW5nQ3VycmVudENsYXNzTG9hZGVyKAotamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGUpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkRmFjdG9yeSBwcml2aWxlZ2VkVGhyZWFkRmFjdG9yeSgpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlIHVuY29uZmlndXJhYmxlRXhlY3V0b3JTZXJ2aWNlKAotamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlKQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSB1bmNvbmZpZ3VyYWJsZVNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSgKLWphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL2NvbmN1cnJlbnQvRnV0dXJlVGFzazsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xOCBuYW1lID1TeW5jICkKLWZpbmFsIGNsYXNzIGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZVRhc2skU3luYyBleHRlbmRzIGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkFic3RyYWN0UXVldWVkU3luY2hyb25pemVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDQU5DRUxMRUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJBTgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUlVOTklORwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvY29uY3VycmVudC9DYWxsYWJsZTxUVjs+OyApCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlIGNhbGxhYmxlCi0KLXByaXZhdGUgamF2YS5sYW5nLlRocm93YWJsZSBleGNlcHRpb24KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1UVjsgKQotcHJpdmF0ZSBqYXZhLmxhbmcuT2JqZWN0IHJlc3VsdAotCi1wcml2YXRlIHZvbGF0aWxlIGphdmEubGFuZy5UaHJlYWQgcnVubmVyCi0KLWZpbmFsIGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZVRhc2sgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9jb25jdXJyZW50L0NhbGxhYmxlPFRWOz47KVYgKQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlVGFzawotamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGUpCi0KLXByaXZhdGUgYm9vbGVhbiByYW5PckNhbmNlbGxlZCgKLWludCkKLQotIGJvb2xlYW4gaW5uZXJDYW5jZWwoCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSW50ZXJydXB0ZWRFeGNlcHRpb247TGphdmEvdXRpbC9jb25jdXJyZW50L0V4ZWN1dGlvbkV4Y2VwdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVFY7ICkKLSBqYXZhLmxhbmcuT2JqZWN0IGlubmVyR2V0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSilUVjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSW50ZXJydXB0ZWRFeGNlcHRpb247TGphdmEvdXRpbC9jb25jdXJyZW50L0V4ZWN1dGlvbkV4Y2VwdGlvbjtMamF2YS91dGlsL2NvbmN1cnJlbnQvVGltZW91dEV4Y2VwdGlvbjsgKQotIGphdmEubGFuZy5PYmplY3QgaW5uZXJHZXQoCi1sb25nKQotCi0gYm9vbGVhbiBpbm5lcklzQ2FuY2VsbGVkKCkKLQotIGJvb2xlYW4gaW5uZXJJc0RvbmUoKQotCi0gdm9pZCBpbm5lclJ1bigpCi0KLSBib29sZWFuIGlubmVyUnVuQW5kUmVzZXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUVjspViApCi0gdm9pZCBpbm5lclNldCgKLWphdmEubGFuZy5PYmplY3QpCi0KLSB2b2lkIGlubmVyU2V0RXhjZXB0aW9uKAotamF2YS5sYW5nLlRocm93YWJsZSkKLQotcHJvdGVjdGVkIGludCB0cnlBY3F1aXJlU2hhcmVkKAotaW50KQotCi1wcm90ZWN0ZWQgYm9vbGVhbiB0cnlSZWxlYXNlU2hhcmVkKAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvY29uY3VycmVudC9MaW5rZWRCbG9ja2luZ1F1ZXVlOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvdXRpbC9JdGVyYXRvcjxURTs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTIgbmFtZSA9SXRyICkKLSBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5MaW5rZWRCbG9ja2luZ1F1ZXVlJEl0ciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuSXRlcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL2NvbmN1cnJlbnQvTGlua2VkQmxvY2tpbmdRdWV1ZSROb2RlPFRFOz47ICkKLXByaXZhdGUgamF2YS51dGlsLmNvbmN1cnJlbnQuTGlua2VkQmxvY2tpbmdRdWV1ZSROb2RlIGN1cnJlbnQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1URTsgKQotcHJpdmF0ZSBqYXZhLmxhbmcuT2JqZWN0IGN1cnJlbnRFbGVtZW50Ci1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9jb25jdXJyZW50L0xpbmtlZEJsb2NraW5nUXVldWUkTm9kZTxURTs+OyApCi1wcml2YXRlIGphdmEudXRpbC5jb25jdXJyZW50LkxpbmtlZEJsb2NraW5nUXVldWUkTm9kZSBsYXN0UmV0Ci0KLWZpbmFsIGphdmEudXRpbC5jb25jdXJyZW50LkxpbmtlZEJsb2NraW5nUXVldWUgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLmNvbmN1cnJlbnQuTGlua2VkQmxvY2tpbmdRdWV1ZSkKLQotcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClURTsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgbmV4dCgpCi0KLXB1YmxpYyB2b2lkIHJlbW92ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPU5vZGUgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxFOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS9sYW5nL09iamVjdDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9jb25jdXJyZW50L0xpbmtlZEJsb2NraW5nUXVldWU7ICkKLSBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5MaW5rZWRCbG9ja2luZ1F1ZXVlJE5vZGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9VEU7ICkKLXZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgaXRlbQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvY29uY3VycmVudC9MaW5rZWRCbG9ja2luZ1F1ZXVlJE5vZGU8VEU7PjsgKQotIGphdmEudXRpbC5jb25jdXJyZW50LkxpbmtlZEJsb2NraW5nUXVldWUkTm9kZSBuZXh0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEU7KVYgKQotIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxqYXZhL3V0aWwvY29uY3VycmVudC9MaW5rZWRCbG9ja2luZ1F1ZXVlJEl0cjtMamF2YS91dGlsL2NvbmN1cnJlbnQvTGlua2VkQmxvY2tpbmdRdWV1ZSROb2RlOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEU6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL3V0aWwvQWJzdHJhY3RRdWV1ZTxURTs+O0xqYXZhL3V0aWwvY29uY3VycmVudC9CbG9ja2luZ1F1ZXVlPFRFOz47TGphdmEvaW8vU2VyaWFsaXphYmxlOyApCi1wdWJsaWMgY2xhc3MgamF2YS51dGlsLmNvbmN1cnJlbnQuTGlua2VkQmxvY2tpbmdRdWV1ZSBleHRlbmRzIGphdmEudXRpbC5BYnN0cmFjdFF1ZXVlIGltcGxlbWVudHMgamF2YS51dGlsLmNvbmN1cnJlbnQuQmxvY2tpbmdRdWV1ZSwgamF2YS5pby5TZXJpYWxpemFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0KLXByaXZhdGUgZmluYWwgaW50IGNhcGFjaXR5Ci0KLXByaXZhdGUgZmluYWwgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXIgY291bnQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL2NvbmN1cnJlbnQvTGlua2VkQmxvY2tpbmdRdWV1ZSROb2RlPFRFOz47ICkKLXByaXZhdGUgdHJhbnNpZW50IGphdmEudXRpbC5jb25jdXJyZW50LkxpbmtlZEJsb2NraW5nUXVldWUkTm9kZSBoZWFkCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9jb25jdXJyZW50L0xpbmtlZEJsb2NraW5nUXVldWUkTm9kZTxURTs+OyApCi1wcml2YXRlIHRyYW5zaWVudCBqYXZhLnV0aWwuY29uY3VycmVudC5MaW5rZWRCbG9ja2luZ1F1ZXVlJE5vZGUgbGFzdAotCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkNvbmRpdGlvbiBub3RFbXB0eQotCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkNvbmRpdGlvbiBub3RGdWxsCi0KLXByaXZhdGUgZmluYWwgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50TG9jayBwdXRMb2NrCi0KLXByaXZhdGUgZmluYWwgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50TG9jayB0YWtlTG9jawotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9Db2xsZWN0aW9uPCtURTs+OylWICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEudXRpbC5Db2xsZWN0aW9uKQotCi1zdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50TG9jayBhY2Nlc3MkMDAwKAotamF2YS51dGlsLmNvbmN1cnJlbnQuTGlua2VkQmxvY2tpbmdRdWV1ZSkKLQotc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudExvY2sgYWNjZXNzJDEwMCgKLWphdmEudXRpbC5jb25jdXJyZW50LkxpbmtlZEJsb2NraW5nUXVldWUpCi0KLXN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5MaW5rZWRCbG9ja2luZ1F1ZXVlJE5vZGUgYWNjZXNzJDIwMCgKLWphdmEudXRpbC5jb25jdXJyZW50LkxpbmtlZEJsb2NraW5nUXVldWUpCi0KLXN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlciBhY2Nlc3MkMzAwKAotamF2YS51dGlsLmNvbmN1cnJlbnQuTGlua2VkQmxvY2tpbmdRdWV1ZSkKLQotc3RhdGljIGludCBhY2Nlc3MkNDAwKAotamF2YS51dGlsLmNvbmN1cnJlbnQuTGlua2VkQmxvY2tpbmdRdWV1ZSkKLQotc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkNvbmRpdGlvbiBhY2Nlc3MkNTAwKAotamF2YS51dGlsLmNvbmN1cnJlbnQuTGlua2VkQmxvY2tpbmdRdWV1ZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVRFOyApCi1wcml2YXRlIGphdmEubGFuZy5PYmplY3QgZXh0cmFjdCgpCi0KLXByaXZhdGUgdm9pZCBmdWxseUxvY2soKQotCi1wcml2YXRlIHZvaWQgZnVsbHlVbmxvY2soKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShURTspViApCi1wcml2YXRlIHZvaWQgaW5zZXJ0KAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9sYW5nL0NsYXNzTm90Rm91bmRFeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCByZWFkT2JqZWN0KAotamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSkKLQotcHJpdmF0ZSB2b2lkIHNpZ25hbE5vdEVtcHR5KCkKLQotcHJpdmF0ZSB2b2lkIHNpZ25hbE5vdEZ1bGwoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoCi1qYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSkKLQotcHVibGljIHZvaWQgY2xlYXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0NvbGxlY3Rpb248LVRFOz47KUkgKQotcHVibGljIGludCBkcmFpblRvKAotamF2YS51dGlsLkNvbGxlY3Rpb24pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvQ29sbGVjdGlvbjwtVEU7PjtJKUkgKQotcHVibGljIGludCBkcmFpblRvKAotamF2YS51dGlsLkNvbGxlY3Rpb24KLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvSXRlcmF0b3I8VEU7PjsgKQotcHVibGljIGphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvcigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRFOylaICkKLXB1YmxpYyBib29sZWFuIG9mZmVyKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0ludGVycnVwdGVkRXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRFO0pMamF2YS91dGlsL2NvbmN1cnJlbnQvVGltZVVuaXQ7KVogKQotcHVibGljIGJvb2xlYW4gb2ZmZXIoCi1qYXZhLmxhbmcuT2JqZWN0Ci1sb25nCi1qYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVRFOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBwZWVrKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVRFOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBwb2xsKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0ludGVycnVwdGVkRXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KEpMamF2YS91dGlsL2NvbmN1cnJlbnQvVGltZVVuaXQ7KVRFOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBwb2xsKAotbG9uZwotamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbnRlcnJ1cHRlZEV4Y2VwdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShURTspViApCi1wdWJsaWMgdm9pZCBwdXQoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50IHJlbWFpbmluZ0NhcGFjaXR5KCkKLQotcHVibGljIGJvb2xlYW4gcmVtb3ZlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGludCBzaXplKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVRFOyApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbnRlcnJ1cHRlZEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgdGFrZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0W10gdG9BcnJheSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFQ6TGphdmEvbGFuZy9PYmplY3Q7PihbVFQ7KVtUVDsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3RbXSB0b0FycmF5KAotamF2YS5sYW5nLk9iamVjdFtdKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPUl0ciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL2NvbmN1cnJlbnQvUHJpb3JpdHlCbG9ja2luZ1F1ZXVlOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEU6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3V0aWwvSXRlcmF0b3I8VEU7PjsgKQotIGNsYXNzIGphdmEudXRpbC5jb25jdXJyZW50LlByaW9yaXR5QmxvY2tpbmdRdWV1ZSRJdHIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLkl0ZXJhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9JdGVyYXRvcjxURTs+OyApCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5JdGVyYXRvciBpdGVyCi0KLWZpbmFsIGphdmEudXRpbC5jb25jdXJyZW50LlByaW9yaXR5QmxvY2tpbmdRdWV1ZSB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0l0ZXJhdG9yPFRFOz47KVYgKQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLmNvbmN1cnJlbnQuUHJpb3JpdHlCbG9ja2luZ1F1ZXVlCi1qYXZhLnV0aWwuSXRlcmF0b3IpCi0KLXB1YmxpYyBib29sZWFuIGhhc05leHQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVEU7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IG5leHQoKQotCi1wdWJsaWMgdm9pZCByZW1vdmUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGphdmEvdXRpbC9jb25jdXJyZW50L1ByaW9yaXR5QmxvY2tpbmdRdWV1ZSRJdHI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08RTpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvdXRpbC9BYnN0cmFjdFF1ZXVlPFRFOz47TGphdmEvdXRpbC9jb25jdXJyZW50L0Jsb2NraW5nUXVldWU8VEU7PjtMamF2YS9pby9TZXJpYWxpemFibGU7ICkKLXB1YmxpYyBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5Qcmlvcml0eUJsb2NraW5nUXVldWUgZXh0ZW5kcyBqYXZhLnV0aWwuQWJzdHJhY3RRdWV1ZSBpbXBsZW1lbnRzIGphdmEudXRpbC5jb25jdXJyZW50LkJsb2NraW5nUXVldWUsIGphdmEuaW8uU2VyaWFsaXphYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBmaW5hbCBib29sZWFuICRhc3NlcnRpb25zRGlzYWJsZWQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0KLXByaXZhdGUgZmluYWwgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50TG9jayBsb2NrCi0KLXByaXZhdGUgZmluYWwgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuQ29uZGl0aW9uIG5vdEVtcHR5Ci1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9Qcmlvcml0eVF1ZXVlPFRFOz47ICkKLXByaXZhdGUgZmluYWwgamF2YS51dGlsLlByaW9yaXR5UXVldWUgcQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJTGphdmEvdXRpbC9Db21wYXJhdG9yPC1URTs+OylWICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotamF2YS51dGlsLkNvbXBhcmF0b3IpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvQ29sbGVjdGlvbjwrVEU7PjspViApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuQ29sbGVjdGlvbikKLQotc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudExvY2sgYWNjZXNzJDAwMCgKLWphdmEudXRpbC5jb25jdXJyZW50LlByaW9yaXR5QmxvY2tpbmdRdWV1ZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KAotamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRFOylaICkKLXB1YmxpYyBib29sZWFuIGFkZCgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2lkIGNsZWFyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvQ29tcGFyYXRvcjwtVEU7PjsgKQotcHVibGljIGphdmEudXRpbC5Db21wYXJhdG9yIGNvbXBhcmF0b3IoKQotCi1wdWJsaWMgYm9vbGVhbiBjb250YWlucygKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvQ29sbGVjdGlvbjwtVEU7PjspSSApCi1wdWJsaWMgaW50IGRyYWluVG8oCi1qYXZhLnV0aWwuQ29sbGVjdGlvbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9Db2xsZWN0aW9uPC1URTs+O0kpSSApCi1wdWJsaWMgaW50IGRyYWluVG8oCi1qYXZhLnV0aWwuQ29sbGVjdGlvbgotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9JdGVyYXRvcjxURTs+OyApCi1wdWJsaWMgamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXJhdG9yKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEU7KVogKQotcHVibGljIGJvb2xlYW4gb2ZmZXIoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShURTtKTGphdmEvdXRpbC9jb25jdXJyZW50L1RpbWVVbml0OylaICkKLXB1YmxpYyBib29sZWFuIG9mZmVyKAotamF2YS5sYW5nLk9iamVjdAotbG9uZwotamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClURTsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgcGVlaygpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClURTsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgcG9sbCgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KEpMamF2YS91dGlsL2NvbmN1cnJlbnQvVGltZVVuaXQ7KVRFOyApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbnRlcnJ1cHRlZEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgcG9sbCgKLWxvbmcKLWphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShURTspViApCi1wdWJsaWMgdm9pZCBwdXQoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50IHJlbWFpbmluZ0NhcGFjaXR5KCkKLQotcHVibGljIGJvb2xlYW4gcmVtb3ZlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGludCBzaXplKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVRFOyApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbnRlcnJ1cHRlZEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgdGFrZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0W10gdG9BcnJheSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFQ6TGphdmEvbGFuZy9PYmplY3Q7PihbVFQ7KVtUVDsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3RbXSB0b0FycmF5KAotamF2YS5sYW5nLk9iamVjdFtdKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS51dGlsLmNvbmN1cnJlbnQuUmVqZWN0ZWRFeGVjdXRpb25FeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5SZWplY3RlZEV4ZWN1dGlvbkhhbmRsZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgcmVqZWN0ZWRFeGVjdXRpb24oCi1qYXZhLmxhbmcuUnVubmFibGUKLWphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFY6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3V0aWwvY29uY3VycmVudC9EZWxheWVkO0xqYXZhL3V0aWwvY29uY3VycmVudC9GdXR1cmU8VFY7PjsgKQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5TY2hlZHVsZWRGdXR1cmUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLmNvbmN1cnJlbnQuRGVsYXllZCwgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL2NvbmN1cnJlbnQvU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTQxMDQgbmFtZSA9bnVsbCApCi0gY2xhc3MgamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvdXRpbC9JdGVyYXRvcjxMamF2YS9sYW5nL1J1bm5hYmxlOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLSBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5TY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3IkRGVsYXllZFdvcmtRdWV1ZSQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudXRpbC5JdGVyYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSXRlcmF0b3I8TGphdmEvdXRpbC9jb25jdXJyZW50L1NjaGVkdWxlZFRocmVhZFBvb2xFeGVjdXRvciRTY2hlZHVsZWRGdXR1cmVUYXNrOz47ICkKLXByaXZhdGUgamF2YS51dGlsLkl0ZXJhdG9yIGl0Ci0KLWZpbmFsIGphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZFRocmVhZFBvb2xFeGVjdXRvciREZWxheWVkV29ya1F1ZXVlIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZFRocmVhZFBvb2xFeGVjdXRvciREZWxheWVkV29ya1F1ZXVlKQotCi1wdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgbmV4dCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuUnVubmFibGUgbmV4dCgpCi0KLXB1YmxpYyB2b2lkIHJlbW92ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1EZWxheWVkV29ya1F1ZXVlICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0Fic3RyYWN0Q29sbGVjdGlvbjxMamF2YS9sYW5nL1J1bm5hYmxlOz47TGphdmEvdXRpbC9jb25jdXJyZW50L0Jsb2NraW5nUXVldWU8TGphdmEvbGFuZy9SdW5uYWJsZTs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL2NvbmN1cnJlbnQvU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yOyApCi0gY2xhc3MgamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yJERlbGF5ZWRXb3JrUXVldWUgZXh0ZW5kcyBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uIGltcGxlbWVudHMgamF2YS51dGlsLmNvbmN1cnJlbnQuQmxvY2tpbmdRdWV1ZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvY29uY3VycmVudC9EZWxheVF1ZXVlPExqYXZhL3V0aWwvY29uY3VycmVudC9TY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3IkU2NoZWR1bGVkRnV0dXJlVGFzazs+OyApCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5jb25jdXJyZW50LkRlbGF5UXVldWUgZHEKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yJDEpCi0KLXN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5EZWxheVF1ZXVlIGFjY2VzcyQ1MDAoCi1qYXZhLnV0aWwuY29uY3VycmVudC5TY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3IkRGVsYXllZFdvcmtRdWV1ZSkKLQotcHVibGljIHZvbGF0aWxlIGJvb2xlYW4gYWRkKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGJvb2xlYW4gYWRkKAotamF2YS5sYW5nLlJ1bm5hYmxlKQotCi1wdWJsaWMgdm9pZCBjbGVhcigpCi0KLXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9Db2xsZWN0aW9uPC1MamF2YS9sYW5nL1J1bm5hYmxlOz47KUkgKQotcHVibGljIGludCBkcmFpblRvKAotamF2YS51dGlsLkNvbGxlY3Rpb24pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvQ29sbGVjdGlvbjwtTGphdmEvbGFuZy9SdW5uYWJsZTs+O0kpSSApCi1wdWJsaWMgaW50IGRyYWluVG8oCi1qYXZhLnV0aWwuQ29sbGVjdGlvbgotaW50KQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBlbGVtZW50KCkKLQotcHVibGljIGphdmEubGFuZy5SdW5uYWJsZSBlbGVtZW50KCkKLQotcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0l0ZXJhdG9yPExqYXZhL2xhbmcvUnVubmFibGU7PjsgKQotcHVibGljIGphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvcigpCi0KLXB1YmxpYyB2b2xhdGlsZSBib29sZWFuIG9mZmVyKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0ludGVycnVwdGVkRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9sYXRpbGUgYm9vbGVhbiBvZmZlcigKLWphdmEubGFuZy5PYmplY3QKLWxvbmcKLWphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0KQotCi1wdWJsaWMgYm9vbGVhbiBvZmZlcigKLWphdmEubGFuZy5SdW5uYWJsZSkKLQotcHVibGljIGJvb2xlYW4gb2ZmZXIoCi1qYXZhLmxhbmcuUnVubmFibGUKLWxvbmcKLWphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0KQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBwZWVrKCkKLQotcHVibGljIGphdmEubGFuZy5SdW5uYWJsZSBwZWVrKCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgcG9sbCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbnRlcnJ1cHRlZEV4Y2VwdGlvbjsgKQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgcG9sbCgKLWxvbmcKLWphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0KQotCi1wdWJsaWMgamF2YS5sYW5nLlJ1bm5hYmxlIHBvbGwoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSW50ZXJydXB0ZWRFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuUnVubmFibGUgcG9sbCgKLWxvbmcKLWphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSW50ZXJydXB0ZWRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2xhdGlsZSB2b2lkIHB1dCgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2lkIHB1dCgKLWphdmEubGFuZy5SdW5uYWJsZSkKLQotcHVibGljIGludCByZW1haW5pbmdDYXBhY2l0eSgpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IHJlbW92ZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuUnVubmFibGUgcmVtb3ZlKCkKLQotcHVibGljIGJvb2xlYW4gcmVtb3ZlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGludCBzaXplKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0ludGVycnVwdGVkRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCB0YWtlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0ludGVycnVwdGVkRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLlJ1bm5hYmxlIHRha2UoKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdFtdIHRvQXJyYXkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz4oW1RUOylbVFQ7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0W10gdG9BcnJheSgKLWphdmEubGFuZy5PYmplY3RbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFY6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL3V0aWwvY29uY3VycmVudC9GdXR1cmVUYXNrPFRWOz47TGphdmEvdXRpbC9jb25jdXJyZW50L1NjaGVkdWxlZEZ1dHVyZTxUVjs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTIgbmFtZSA9U2NoZWR1bGVkRnV0dXJlVGFzayApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL2NvbmN1cnJlbnQvU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yOyApCi0gY2xhc3MgamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yJFNjaGVkdWxlZEZ1dHVyZVRhc2sgZXh0ZW5kcyBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmVUYXNrIGltcGxlbWVudHMgamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkRnV0dXJlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgbG9uZyBwZXJpb2QKLQotcHJpdmF0ZSBmaW5hbCBsb25nIHNlcXVlbmNlTnVtYmVyCi0KLWZpbmFsIGphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZFRocmVhZFBvb2xFeGVjdXRvciB0aGlzJDAKLQotcHJpdmF0ZSBsb25nIHRpbWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1J1bm5hYmxlO1RWO0opViApCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuY29uY3VycmVudC5TY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3IKLWphdmEubGFuZy5SdW5uYWJsZQotamF2YS5sYW5nLk9iamVjdAotbG9uZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9SdW5uYWJsZTtUVjtKSilWICkKLSB2b2lkIDxpbml0PigKLWphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZFRocmVhZFBvb2xFeGVjdXRvcgotamF2YS5sYW5nLlJ1bm5hYmxlCi1qYXZhLmxhbmcuT2JqZWN0Ci1sb25nCi1sb25nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL2NvbmN1cnJlbnQvQ2FsbGFibGU8VFY7PjtKKVYgKQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yCi1qYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZQotbG9uZykKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDEwMSgKLWphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZFRocmVhZFBvb2xFeGVjdXRvciRTY2hlZHVsZWRGdXR1cmVUYXNrKQotCi1zdGF0aWMgdm9pZCBhY2Nlc3MkMzAxKAotamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yJFNjaGVkdWxlZEZ1dHVyZVRhc2spCi0KLXByaXZhdGUgdm9pZCBydW5QZXJpb2RpYygpCi0KLXB1YmxpYyB2b2xhdGlsZSBpbnQgY29tcGFyZVRvKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGludCBjb21wYXJlVG8oCi1qYXZhLnV0aWwuY29uY3VycmVudC5EZWxheWVkKQotCi1wdWJsaWMgbG9uZyBnZXREZWxheSgKLWphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0KQotCi0gYm9vbGVhbiBpc1BlcmlvZGljKCkKLQotcHVibGljIHZvaWQgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxqYXZhL3V0aWwvY29uY3VycmVudC9UaHJlYWRQb29sRXhlY3V0b3IkRGlzY2FyZE9sZGVzdFBvbGljeTtMamF2YS91dGlsL2NvbmN1cnJlbnQvVGhyZWFkUG9vbEV4ZWN1dG9yJERpc2NhcmRQb2xpY3k7TGphdmEvdXRpbC9jb25jdXJyZW50L1RocmVhZFBvb2xFeGVjdXRvciRBYm9ydFBvbGljeTtMamF2YS91dGlsL2NvbmN1cnJlbnQvVGhyZWFkUG9vbEV4ZWN1dG9yJENhbGxlclJ1bnNQb2xpY3k7TGphdmEvdXRpbC9jb25jdXJyZW50L1RocmVhZFBvb2xFeGVjdXRvciRXb3JrZXI7ICkKLXB1YmxpYyBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IgZXh0ZW5kcyBqYXZhLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEV4ZWN1dG9yU2VydmljZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgYm9vbGVhbiAkYXNzZXJ0aW9uc0Rpc2FibGVkCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5SdW5uYWJsZVtdIEVNUFRZX1JVTk5BQkxFX0FSUkFZCi0KLXN0YXRpYyBmaW5hbCBpbnQgUlVOTklORwotCi1zdGF0aWMgZmluYWwgaW50IFNIVVRET1dOCi0KLXN0YXRpYyBmaW5hbCBpbnQgU1RPUAotCi1zdGF0aWMgZmluYWwgaW50IFRFUk1JTkFURUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS51dGlsLmNvbmN1cnJlbnQuUmVqZWN0ZWRFeGVjdXRpb25IYW5kbGVyIGRlZmF1bHRIYW5kbGVyCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5SdW50aW1lUGVybWlzc2lvbiBzaHV0ZG93blBlcm0KLQotcHJpdmF0ZSBsb25nIGNvbXBsZXRlZFRhc2tDb3VudAotCi1wcml2YXRlIHZvbGF0aWxlIGludCBjb3JlUG9vbFNpemUKLQotcHJpdmF0ZSB2b2xhdGlsZSBqYXZhLnV0aWwuY29uY3VycmVudC5SZWplY3RlZEV4ZWN1dGlvbkhhbmRsZXIgaGFuZGxlcgotCi1wcml2YXRlIHZvbGF0aWxlIGxvbmcga2VlcEFsaXZlVGltZQotCi1wcml2YXRlIGludCBsYXJnZXN0UG9vbFNpemUKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRMb2NrIG1haW5Mb2NrCi0KLXByaXZhdGUgdm9sYXRpbGUgaW50IG1heGltdW1Qb29sU2l6ZQotCi1wcml2YXRlIHZvbGF0aWxlIGludCBwb29sU2l6ZQotCi12b2xhdGlsZSBpbnQgcnVuU3RhdGUKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5Db25kaXRpb24gdGVybWluYXRpb24KLQotcHJpdmF0ZSB2b2xhdGlsZSBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRGYWN0b3J5IHRocmVhZEZhY3RvcnkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL2NvbmN1cnJlbnQvQmxvY2tpbmdRdWV1ZTxMamF2YS9sYW5nL1J1bm5hYmxlOz47ICkKLXByaXZhdGUgZmluYWwgamF2YS51dGlsLmNvbmN1cnJlbnQuQmxvY2tpbmdRdWV1ZSB3b3JrUXVldWUKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0hhc2hTZXQ8TGphdmEvdXRpbC9jb25jdXJyZW50L1RocmVhZFBvb2xFeGVjdXRvciRXb3JrZXI7PjsgKQotcHJpdmF0ZSBmaW5hbCBqYXZhLnV0aWwuSGFzaFNldCB3b3JrZXJzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJSUpMamF2YS91dGlsL2NvbmN1cnJlbnQvVGltZVVuaXQ7TGphdmEvdXRpbC9jb25jdXJyZW50L0Jsb2NraW5nUXVldWU8TGphdmEvbGFuZy9SdW5uYWJsZTs+OylWICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotaW50Ci1sb25nCi1qYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdAotamF2YS51dGlsLmNvbmN1cnJlbnQuQmxvY2tpbmdRdWV1ZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSUlKTGphdmEvdXRpbC9jb25jdXJyZW50L1RpbWVVbml0O0xqYXZhL3V0aWwvY29uY3VycmVudC9CbG9ja2luZ1F1ZXVlPExqYXZhL2xhbmcvUnVubmFibGU7PjtMamF2YS91dGlsL2NvbmN1cnJlbnQvUmVqZWN0ZWRFeGVjdXRpb25IYW5kbGVyOylWICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotaW50Ci1sb25nCi1qYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdAotamF2YS51dGlsLmNvbmN1cnJlbnQuQmxvY2tpbmdRdWV1ZQotamF2YS51dGlsLmNvbmN1cnJlbnQuUmVqZWN0ZWRFeGVjdXRpb25IYW5kbGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJSUpMamF2YS91dGlsL2NvbmN1cnJlbnQvVGltZVVuaXQ7TGphdmEvdXRpbC9jb25jdXJyZW50L0Jsb2NraW5nUXVldWU8TGphdmEvbGFuZy9SdW5uYWJsZTs+O0xqYXZhL3V0aWwvY29uY3VycmVudC9UaHJlYWRGYWN0b3J5OylWICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotaW50Ci1sb25nCi1qYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdAotamF2YS51dGlsLmNvbmN1cnJlbnQuQmxvY2tpbmdRdWV1ZQotamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkRmFjdG9yeSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSUlKTGphdmEvdXRpbC9jb25jdXJyZW50L1RpbWVVbml0O0xqYXZhL3V0aWwvY29uY3VycmVudC9CbG9ja2luZ1F1ZXVlPExqYXZhL2xhbmcvUnVubmFibGU7PjtMamF2YS91dGlsL2NvbmN1cnJlbnQvVGhyZWFkRmFjdG9yeTtMamF2YS91dGlsL2NvbmN1cnJlbnQvUmVqZWN0ZWRFeGVjdXRpb25IYW5kbGVyOylWICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotaW50Ci1sb25nCi1qYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdAotamF2YS51dGlsLmNvbmN1cnJlbnQuQmxvY2tpbmdRdWV1ZQotamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkRmFjdG9yeQotamF2YS51dGlsLmNvbmN1cnJlbnQuUmVqZWN0ZWRFeGVjdXRpb25IYW5kbGVyKQotCi1wcml2YXRlIGJvb2xlYW4gYWRkSWZVbmRlckNvcmVQb29sU2l6ZSgKLWphdmEubGFuZy5SdW5uYWJsZSkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuUnVubmFibGUgYWRkSWZVbmRlck1heGltdW1Qb29sU2l6ZSgKLWphdmEubGFuZy5SdW5uYWJsZSkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuVGhyZWFkIGFkZFRocmVhZCgKLWphdmEubGFuZy5SdW5uYWJsZSkKLQotcHJvdGVjdGVkIHZvaWQgYWZ0ZXJFeGVjdXRlKAotamF2YS5sYW5nLlJ1bm5hYmxlCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSW50ZXJydXB0ZWRFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIGF3YWl0VGVybWluYXRpb24oCi1sb25nCi1qYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdCkKLQotcHJvdGVjdGVkIHZvaWQgYmVmb3JlRXhlY3V0ZSgKLWphdmEubGFuZy5UaHJlYWQKLWphdmEubGFuZy5SdW5uYWJsZSkKLQotcHVibGljIHZvaWQgZXhlY3V0ZSgKLWphdmEubGFuZy5SdW5uYWJsZSkKLQotcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKQotCi1wdWJsaWMgaW50IGdldEFjdGl2ZUNvdW50KCkKLQotcHVibGljIGxvbmcgZ2V0Q29tcGxldGVkVGFza0NvdW50KCkKLQotcHVibGljIGludCBnZXRDb3JlUG9vbFNpemUoKQotCi1wdWJsaWMgbG9uZyBnZXRLZWVwQWxpdmVUaW1lKAotamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQpCi0KLXB1YmxpYyBpbnQgZ2V0TGFyZ2VzdFBvb2xTaXplKCkKLQotcHVibGljIGludCBnZXRNYXhpbXVtUG9vbFNpemUoKQotCi1wdWJsaWMgaW50IGdldFBvb2xTaXplKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvY29uY3VycmVudC9CbG9ja2luZ1F1ZXVlPExqYXZhL2xhbmcvUnVubmFibGU7PjsgKQotcHVibGljIGphdmEudXRpbC5jb25jdXJyZW50LkJsb2NraW5nUXVldWUgZ2V0UXVldWUoKQotCi1wdWJsaWMgamF2YS51dGlsLmNvbmN1cnJlbnQuUmVqZWN0ZWRFeGVjdXRpb25IYW5kbGVyIGdldFJlamVjdGVkRXhlY3V0aW9uSGFuZGxlcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbnRlcnJ1cHRlZEV4Y2VwdGlvbjsgKQotIGphdmEubGFuZy5SdW5uYWJsZSBnZXRUYXNrKCkKLQotcHVibGljIGxvbmcgZ2V0VGFza0NvdW50KCkKLQotcHVibGljIGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZEZhY3RvcnkgZ2V0VGhyZWFkRmFjdG9yeSgpCi0KLSB2b2lkIGludGVycnVwdElkbGVXb3JrZXJzKCkKLQotcHVibGljIGJvb2xlYW4gaXNTaHV0ZG93bigpCi0KLXB1YmxpYyBib29sZWFuIGlzVGVybWluYXRlZCgpCi0KLXB1YmxpYyBib29sZWFuIGlzVGVybWluYXRpbmcoKQotCi1wdWJsaWMgaW50IHByZXN0YXJ0QWxsQ29yZVRocmVhZHMoKQotCi1wdWJsaWMgYm9vbGVhbiBwcmVzdGFydENvcmVUaHJlYWQoKQotCi1wdWJsaWMgdm9pZCBwdXJnZSgpCi0KLSB2b2lkIHJlamVjdCgKLWphdmEubGFuZy5SdW5uYWJsZSkKLQotcHVibGljIGJvb2xlYW4gcmVtb3ZlKAotamF2YS5sYW5nLlJ1bm5hYmxlKQotCi1wdWJsaWMgdm9pZCBzZXRDb3JlUG9vbFNpemUoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldEtlZXBBbGl2ZVRpbWUoCi1sb25nCi1qYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdCkKLQotcHVibGljIHZvaWQgc2V0TWF4aW11bVBvb2xTaXplKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRSZWplY3RlZEV4ZWN1dGlvbkhhbmRsZXIoCi1qYXZhLnV0aWwuY29uY3VycmVudC5SZWplY3RlZEV4ZWN1dGlvbkhhbmRsZXIpCi0KLXB1YmxpYyB2b2lkIHNldFRocmVhZEZhY3RvcnkoCi1qYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRGYWN0b3J5KQotCi1wdWJsaWMgdm9pZCBzaHV0ZG93bigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0xpc3Q8TGphdmEvbGFuZy9SdW5uYWJsZTs+OyApCi1wdWJsaWMgamF2YS51dGlsLkxpc3Qgc2h1dGRvd25Ob3coKQotCi1wcm90ZWN0ZWQgdm9pZCB0ZXJtaW5hdGVkKCkKLQotIHZvaWQgd29ya2VyRG9uZSgKLWphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MamF2YS91dGlsL2NvbmN1cnJlbnQvU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yJDE7TGphdmEvdXRpbC9jb25jdXJyZW50L1NjaGVkdWxlZFRocmVhZFBvb2xFeGVjdXRvciREZWxheWVkV29ya1F1ZXVlO0xqYXZhL3V0aWwvY29uY3VycmVudC9TY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3IkU2NoZWR1bGVkRnV0dXJlVGFzazsgKQotcHVibGljIGNsYXNzIGphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZFRocmVhZFBvb2xFeGVjdXRvciBleHRlbmRzIGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciBpbXBsZW1lbnRzIGphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIE5BTk9fT1JJR0lOCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNMb25nIHNlcXVlbmNlcgotCi1wcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gY29udGludWVFeGlzdGluZ1BlcmlvZGljVGFza3NBZnRlclNodXRkb3duCi0KLXByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBleGVjdXRlRXhpc3RpbmdEZWxheWVkVGFza3NBZnRlclNodXRkb3duCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotamF2YS51dGlsLmNvbmN1cnJlbnQuUmVqZWN0ZWRFeGVjdXRpb25IYW5kbGVyKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZEZhY3RvcnkpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkRmFjdG9yeQotamF2YS51dGlsLmNvbmN1cnJlbnQuUmVqZWN0ZWRFeGVjdXRpb25IYW5kbGVyKQotCi1zdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0xvbmcgYWNjZXNzJDAwMCgpCi0KLXN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5CbG9ja2luZ1F1ZXVlIGFjY2VzcyQyMDEoCi1qYXZhLnV0aWwuY29uY3VycmVudC5TY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3IpCi0KLXByaXZhdGUgdm9pZCBjYW5jZWxVbndhbnRlZFRhc2tzKCkKLQotcHJpdmF0ZSB2b2lkIGRlbGF5ZWRFeGVjdXRlKAotamF2YS5sYW5nLlJ1bm5hYmxlKQotCi1wdWJsaWMgdm9pZCBleGVjdXRlKAotamF2YS5sYW5nLlJ1bm5hYmxlKQotCi1wdWJsaWMgYm9vbGVhbiBnZXRDb250aW51ZUV4aXN0aW5nUGVyaW9kaWNUYXNrc0FmdGVyU2h1dGRvd25Qb2xpY3koKQotCi1wdWJsaWMgYm9vbGVhbiBnZXRFeGVjdXRlRXhpc3RpbmdEZWxheWVkVGFza3NBZnRlclNodXRkb3duUG9saWN5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvY29uY3VycmVudC9CbG9ja2luZ1F1ZXVlPExqYXZhL2xhbmcvUnVubmFibGU7PjsgKQotcHVibGljIGphdmEudXRpbC5jb25jdXJyZW50LkJsb2NraW5nUXVldWUgZ2V0UXVldWUoKQotCi1maW5hbCBsb25nIG5vdygpCi0KLXB1YmxpYyBib29sZWFuIHJlbW92ZSgKLWphdmEubGFuZy5SdW5uYWJsZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9SdW5uYWJsZTtKTGphdmEvdXRpbC9jb25jdXJyZW50L1RpbWVVbml0OylMamF2YS91dGlsL2NvbmN1cnJlbnQvU2NoZWR1bGVkRnV0dXJlPCo+OyApCi1wdWJsaWMgamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkRnV0dXJlIHNjaGVkdWxlKAotamF2YS5sYW5nLlJ1bm5hYmxlCi1sb25nCi1qYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VjpMamF2YS9sYW5nL09iamVjdDs+KExqYXZhL3V0aWwvY29uY3VycmVudC9DYWxsYWJsZTxUVjs+O0pMamF2YS91dGlsL2NvbmN1cnJlbnQvVGltZVVuaXQ7KUxqYXZhL3V0aWwvY29uY3VycmVudC9TY2hlZHVsZWRGdXR1cmU8VFY7PjsgKQotcHVibGljIGphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZEZ1dHVyZSBzY2hlZHVsZSgKLWphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlCi1sb25nCi1qYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9SdW5uYWJsZTtKSkxqYXZhL3V0aWwvY29uY3VycmVudC9UaW1lVW5pdDspTGphdmEvdXRpbC9jb25jdXJyZW50L1NjaGVkdWxlZEZ1dHVyZTwqPjsgKQotcHVibGljIGphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZEZ1dHVyZSBzY2hlZHVsZUF0Rml4ZWRSYXRlKAotamF2YS5sYW5nLlJ1bm5hYmxlCi1sb25nCi1sb25nCi1qYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9SdW5uYWJsZTtKSkxqYXZhL3V0aWwvY29uY3VycmVudC9UaW1lVW5pdDspTGphdmEvdXRpbC9jb25jdXJyZW50L1NjaGVkdWxlZEZ1dHVyZTwqPjsgKQotcHVibGljIGphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZEZ1dHVyZSBzY2hlZHVsZVdpdGhGaXhlZERlbGF5KAotamF2YS5sYW5nLlJ1bm5hYmxlCi1sb25nCi1sb25nCi1qYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdCkKLQotcHVibGljIHZvaWQgc2V0Q29udGludWVFeGlzdGluZ1BlcmlvZGljVGFza3NBZnRlclNodXRkb3duUG9saWN5KAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0RXhlY3V0ZUV4aXN0aW5nRGVsYXllZFRhc2tzQWZ0ZXJTaHV0ZG93blBvbGljeSgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNodXRkb3duKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvTGlzdDxMamF2YS9sYW5nL1J1bm5hYmxlOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBzaHV0ZG93bk5vdygpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvUnVubmFibGU7KUxqYXZhL3V0aWwvY29uY3VycmVudC9GdXR1cmU8Kj47ICkKLXB1YmxpYyBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmUgc3VibWl0KAotamF2YS5sYW5nLlJ1bm5hYmxlKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz4oTGphdmEvbGFuZy9SdW5uYWJsZTtUVDspTGphdmEvdXRpbC9jb25jdXJyZW50L0Z1dHVyZTxUVDs+OyApCi1wdWJsaWMgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlIHN1Ym1pdCgKLWphdmEubGFuZy5SdW5uYWJsZQotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+KExqYXZhL3V0aWwvY29uY3VycmVudC9DYWxsYWJsZTxUVDs+OylMamF2YS91dGlsL2NvbmN1cnJlbnQvRnV0dXJlPFRUOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmUgc3VibWl0KAotamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMDMyIG5hbWUgPVN5bmMgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9jb25jdXJyZW50L1NlbWFwaG9yZTsgKQotYWJzdHJhY3QgY2xhc3MgamF2YS51dGlsLmNvbmN1cnJlbnQuU2VtYXBob3JlJFN5bmMgZXh0ZW5kcyBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5BYnN0cmFjdFF1ZXVlZFN5bmNocm9uaXplcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWludCkKLQotZmluYWwgaW50IGRyYWluUGVybWl0cygpCi0KLWZpbmFsIGludCBnZXRQZXJtaXRzKCkKLQotZmluYWwgaW50IG5vbmZhaXJUcnlBY3F1aXJlU2hhcmVkKAotaW50KQotCi1maW5hbCB2b2lkIHJlZHVjZVBlcm1pdHMoCi1pbnQpCi0KLXByb3RlY3RlZCBmaW5hbCBib29sZWFuIHRyeVJlbGVhc2VTaGFyZWQoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9jb25jdXJyZW50L1NlbWFwaG9yZTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNCBuYW1lID1GYWlyU3luYyApCi1maW5hbCBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5TZW1hcGhvcmUkRmFpclN5bmMgZXh0ZW5kcyBqYXZhLnV0aWwuY29uY3VycmVudC5TZW1hcGhvcmUkU3luYwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWludCkKLQotcHJvdGVjdGVkIGludCB0cnlBY3F1aXJlU2hhcmVkKAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjQgbmFtZSA9Tm9uZmFpclN5bmMgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9jb25jdXJyZW50L1NlbWFwaG9yZTsgKQotZmluYWwgY2xhc3MgamF2YS51dGlsLmNvbmN1cnJlbnQuU2VtYXBob3JlJE5vbmZhaXJTeW5jIGV4dGVuZHMgamF2YS51dGlsLmNvbmN1cnJlbnQuU2VtYXBob3JlJFN5bmMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1pbnQpCi0KLXByb3RlY3RlZCBpbnQgdHJ5QWNxdWlyZVNoYXJlZCgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxqYXZhL3V0aWwvY29uY3VycmVudC9TZW1hcGhvcmUkRmFpclN5bmM7TGphdmEvdXRpbC9jb25jdXJyZW50L1NlbWFwaG9yZSROb25mYWlyU3luYztMamF2YS91dGlsL2NvbmN1cnJlbnQvU2VtYXBob3JlJFN5bmM7ICkKLXB1YmxpYyBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5TZW1hcGhvcmUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0KLXByaXZhdGUgZmluYWwgamF2YS51dGlsLmNvbmN1cnJlbnQuU2VtYXBob3JlJFN5bmMgc3luYwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50Ci1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSW50ZXJydXB0ZWRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGFjcXVpcmUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSW50ZXJydXB0ZWRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGFjcXVpcmUoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGFjcXVpcmVVbmludGVycnVwdGlibHkoKQotCi1wdWJsaWMgdm9pZCBhY3F1aXJlVW5pbnRlcnJ1cHRpYmx5KAotaW50KQotCi1wdWJsaWMgaW50IGF2YWlsYWJsZVBlcm1pdHMoKQotCi1wdWJsaWMgaW50IGRyYWluUGVybWl0cygpCi0KLXB1YmxpYyBmaW5hbCBpbnQgZ2V0UXVldWVMZW5ndGgoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9Db2xsZWN0aW9uPExqYXZhL2xhbmcvVGhyZWFkOz47ICkKLXByb3RlY3RlZCBqYXZhLnV0aWwuQ29sbGVjdGlvbiBnZXRRdWV1ZWRUaHJlYWRzKCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzUXVldWVkVGhyZWFkcygpCi0KLXB1YmxpYyBib29sZWFuIGlzRmFpcigpCi0KLXByb3RlY3RlZCB2b2lkIHJlZHVjZVBlcm1pdHMoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHJlbGVhc2UoKQotCi1wdWJsaWMgdm9pZCByZWxlYXNlKAotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLXB1YmxpYyBib29sZWFuIHRyeUFjcXVpcmUoKQotCi1wdWJsaWMgYm9vbGVhbiB0cnlBY3F1aXJlKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSW50ZXJydXB0ZWRFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIHRyeUFjcXVpcmUoCi1pbnQKLWxvbmcKLWphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSW50ZXJydXB0ZWRFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIHRyeUFjcXVpcmUoCi1sb25nCi1qYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9RW1wdHlJdGVyYXRvciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL2NvbmN1cnJlbnQvU3luY2hyb25vdXNRdWV1ZTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxFOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS9sYW5nL09iamVjdDtMamF2YS91dGlsL0l0ZXJhdG9yPFRFOz47ICkKLSBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5TeW5jaHJvbm91c1F1ZXVlJEVtcHR5SXRlcmF0b3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLkl0ZXJhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClURTsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgbmV4dCgpCi0KLXB1YmxpYyB2b2lkIHJlbW92ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMDMyIG5hbWUgPVdhaXRRdWV1ZSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL2NvbmN1cnJlbnQvU3luY2hyb25vdXNRdWV1ZTsgKQotYWJzdHJhY3QgY2xhc3MgamF2YS51dGlsLmNvbmN1cnJlbnQuU3luY2hyb25vdXNRdWV1ZSRXYWl0UXVldWUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1hYnN0cmFjdCBqYXZhLnV0aWwuY29uY3VycmVudC5TeW5jaHJvbm91c1F1ZXVlJE5vZGUgZGVxKCkKLQotYWJzdHJhY3QgamF2YS51dGlsLmNvbmN1cnJlbnQuU3luY2hyb25vdXNRdWV1ZSROb2RlIGVucSgKLWphdmEubGFuZy5PYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNCBuYW1lID1GaWZvV2FpdFF1ZXVlICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvY29uY3VycmVudC9TeW5jaHJvbm91c1F1ZXVlOyApCi1maW5hbCBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5TeW5jaHJvbm91c1F1ZXVlJEZpZm9XYWl0UXVldWUgZXh0ZW5kcyBqYXZhLnV0aWwuY29uY3VycmVudC5TeW5jaHJvbm91c1F1ZXVlJFdhaXRRdWV1ZSBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotCi1wcml2YXRlIHRyYW5zaWVudCBqYXZhLnV0aWwuY29uY3VycmVudC5TeW5jaHJvbm91c1F1ZXVlJE5vZGUgaGVhZAotCi1wcml2YXRlIHRyYW5zaWVudCBqYXZhLnV0aWwuY29uY3VycmVudC5TeW5jaHJvbm91c1F1ZXVlJE5vZGUgbGFzdAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLSBqYXZhLnV0aWwuY29uY3VycmVudC5TeW5jaHJvbm91c1F1ZXVlJE5vZGUgZGVxKCkKLQotIGphdmEudXRpbC5jb25jdXJyZW50LlN5bmNocm9ub3VzUXVldWUkTm9kZSBlbnEoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjQgbmFtZSA9TGlmb1dhaXRRdWV1ZSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL2NvbmN1cnJlbnQvU3luY2hyb25vdXNRdWV1ZTsgKQotZmluYWwgY2xhc3MgamF2YS51dGlsLmNvbmN1cnJlbnQuU3luY2hyb25vdXNRdWV1ZSRMaWZvV2FpdFF1ZXVlIGV4dGVuZHMgamF2YS51dGlsLmNvbmN1cnJlbnQuU3luY2hyb25vdXNRdWV1ZSRXYWl0UXVldWUgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSB0cmFuc2llbnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU3luY2hyb25vdXNRdWV1ZSROb2RlIGhlYWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi0gamF2YS51dGlsLmNvbmN1cnJlbnQuU3luY2hyb25vdXNRdWV1ZSROb2RlIGRlcSgpCi0KLSBqYXZhLnV0aWwuY29uY3VycmVudC5TeW5jaHJvbm91c1F1ZXVlJE5vZGUgZW5xKAotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL2NvbmN1cnJlbnQvU3luY2hyb25vdXNRdWV1ZTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNCBuYW1lID1Ob2RlICkKLWZpbmFsIGNsYXNzIGphdmEudXRpbC5jb25jdXJyZW50LlN5bmNocm9ub3VzUXVldWUkTm9kZSBleHRlbmRzIGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkFic3RyYWN0UXVldWVkU3luY2hyb25pemVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBQ0sKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENBTkNFTAotCi0gamF2YS5sYW5nLk9iamVjdCBpdGVtCi0KLSBqYXZhLnV0aWwuY29uY3VycmVudC5TeW5jaHJvbm91c1F1ZXVlJE5vZGUgbmV4dAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5PYmplY3QpCi0KLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5PYmplY3QKLWphdmEudXRpbC5jb25jdXJyZW50LlN5bmNocm9ub3VzUXVldWUkTm9kZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0ludGVycnVwdGVkRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgY2hlY2tDYW5jZWxsYXRpb25PbkludGVycnVwdCgKLWphdmEubGFuZy5JbnRlcnJ1cHRlZEV4Y2VwdGlvbikKLQotcHJpdmF0ZSBqYXZhLmxhbmcuT2JqZWN0IGV4dHJhY3QoKQotCi0gamF2YS5sYW5nLk9iamVjdCBnZXRJdGVtKCkKLQotIGJvb2xlYW4gc2V0SXRlbSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXByb3RlY3RlZCBib29sZWFuIHRyeUFjcXVpcmUoCi1pbnQpCi0KLXByb3RlY3RlZCBib29sZWFuIHRyeVJlbGVhc2UoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbnRlcnJ1cHRlZEV4Y2VwdGlvbjsgKQotIGphdmEubGFuZy5PYmplY3Qgd2FpdEZvclB1dCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbnRlcnJ1cHRlZEV4Y2VwdGlvbjsgKQotIGphdmEubGFuZy5PYmplY3Qgd2FpdEZvclB1dCgKLWxvbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbnRlcnJ1cHRlZEV4Y2VwdGlvbjsgKQotIHZvaWQgd2FpdEZvclRha2UoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSW50ZXJydXB0ZWRFeGNlcHRpb247ICkKLSBib29sZWFuIHdhaXRGb3JUYWtlKAotbG9uZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEU6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL3V0aWwvQWJzdHJhY3RRdWV1ZTxURTs+O0xqYXZhL3V0aWwvY29uY3VycmVudC9CbG9ja2luZ1F1ZXVlPFRFOz47TGphdmEvaW8vU2VyaWFsaXphYmxlOyApCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxqYXZhL3V0aWwvY29uY3VycmVudC9TeW5jaHJvbm91c1F1ZXVlJEVtcHR5SXRlcmF0b3I7TGphdmEvdXRpbC9jb25jdXJyZW50L1N5bmNocm9ub3VzUXVldWUkTm9kZTtMamF2YS91dGlsL2NvbmN1cnJlbnQvU3luY2hyb25vdXNRdWV1ZSRMaWZvV2FpdFF1ZXVlO0xqYXZhL3V0aWwvY29uY3VycmVudC9TeW5jaHJvbm91c1F1ZXVlJEZpZm9XYWl0UXVldWU7TGphdmEvdXRpbC9jb25jdXJyZW50L1N5bmNocm9ub3VzUXVldWUkV2FpdFF1ZXVlOyApCi1wdWJsaWMgY2xhc3MgamF2YS51dGlsLmNvbmN1cnJlbnQuU3luY2hyb25vdXNRdWV1ZSBleHRlbmRzIGphdmEudXRpbC5BYnN0cmFjdFF1ZXVlIGltcGxlbWVudHMgamF2YS51dGlsLmNvbmN1cnJlbnQuQmxvY2tpbmdRdWV1ZSwgamF2YS5pby5TZXJpYWxpemFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0KLXByaXZhdGUgZmluYWwgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50TG9jayBxbG9jawotCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5jb25jdXJyZW50LlN5bmNocm9ub3VzUXVldWUkV2FpdFF1ZXVlIHdhaXRpbmdDb25zdW1lcnMKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLnV0aWwuY29uY3VycmVudC5TeW5jaHJvbm91c1F1ZXVlJFdhaXRRdWV1ZSB3YWl0aW5nUHJvZHVjZXJzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgY2xlYXIoKQotCi1wdWJsaWMgYm9vbGVhbiBjb250YWlucygKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvQ29sbGVjdGlvbjwqPjspWiApCi1wdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbCgKLWphdmEudXRpbC5Db2xsZWN0aW9uKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0NvbGxlY3Rpb248LVRFOz47KUkgKQotcHVibGljIGludCBkcmFpblRvKAotamF2YS51dGlsLkNvbGxlY3Rpb24pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvQ29sbGVjdGlvbjwtVEU7PjtJKUkgKQotcHVibGljIGludCBkcmFpblRvKAotamF2YS51dGlsLkNvbGxlY3Rpb24KLWludCkKLQotcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0l0ZXJhdG9yPFRFOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuSXRlcmF0b3IgaXRlcmF0b3IoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShURTspWiApCi1wdWJsaWMgYm9vbGVhbiBvZmZlcigKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRFO0pMamF2YS91dGlsL2NvbmN1cnJlbnQvVGltZVVuaXQ7KVogKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSW50ZXJydXB0ZWRFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIG9mZmVyKAotamF2YS5sYW5nLk9iamVjdAotbG9uZwotamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClURTsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgcGVlaygpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClURTsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgcG9sbCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbnRlcnJ1cHRlZEV4Y2VwdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShKTGphdmEvdXRpbC9jb25jdXJyZW50L1RpbWVVbml0OylURTsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgcG9sbCgKLWxvbmcKLWphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSW50ZXJydXB0ZWRFeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEU7KVYgKQotcHVibGljIHZvaWQgcHV0KAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGludCByZW1haW5pbmdDYXBhY2l0eSgpCi0KLXB1YmxpYyBib29sZWFuIHJlbW92ZSgKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvQ29sbGVjdGlvbjwqPjspWiApCi1wdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoCi1qYXZhLnV0aWwuQ29sbGVjdGlvbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9Db2xsZWN0aW9uPCo+OylaICkKLXB1YmxpYyBib29sZWFuIHJldGFpbkFsbCgKLWphdmEudXRpbC5Db2xsZWN0aW9uKQotCi1wdWJsaWMgaW50IHNpemUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVEU7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0ludGVycnVwdGVkRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCB0YWtlKCkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3RbXSB0b0FycmF5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+KFtUVDspW1RUOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdFtdIHRvQXJyYXkoCi1qYXZhLmxhbmcuT2JqZWN0W10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9jb25jdXJyZW50L1RocmVhZFBvb2xFeGVjdXRvcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPUFib3J0UG9saWN5ICkKLXB1YmxpYyBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkQWJvcnRQb2xpY3kgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLmNvbmN1cnJlbnQuUmVqZWN0ZWRFeGVjdXRpb25IYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgcmVqZWN0ZWRFeGVjdXRpb24oCi1qYXZhLmxhbmcuUnVubmFibGUKLWphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL2NvbmN1cnJlbnQvVGhyZWFkUG9vbEV4ZWN1dG9yOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9Q2FsbGVyUnVuc1BvbGljeSApCi1wdWJsaWMgY2xhc3MgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJENhbGxlclJ1bnNQb2xpY3kgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLmNvbmN1cnJlbnQuUmVqZWN0ZWRFeGVjdXRpb25IYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgcmVqZWN0ZWRFeGVjdXRpb24oCi1qYXZhLmxhbmcuUnVubmFibGUKLWphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9RGlzY2FyZE9sZGVzdFBvbGljeSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL2NvbmN1cnJlbnQvVGhyZWFkUG9vbEV4ZWN1dG9yOyApCi1wdWJsaWMgY2xhc3MgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJERpc2NhcmRPbGRlc3RQb2xpY3kgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLmNvbmN1cnJlbnQuUmVqZWN0ZWRFeGVjdXRpb25IYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgcmVqZWN0ZWRFeGVjdXRpb24oCi1qYXZhLmxhbmcuUnVubmFibGUKLWphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9RGlzY2FyZFBvbGljeSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL2NvbmN1cnJlbnQvVGhyZWFkUG9vbEV4ZWN1dG9yOyApCi1wdWJsaWMgY2xhc3MgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJERpc2NhcmRQb2xpY3kgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLmNvbmN1cnJlbnQuUmVqZWN0ZWRFeGVjdXRpb25IYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgcmVqZWN0ZWRFeGVjdXRpb24oCi1qYXZhLmxhbmcuUnVubmFibGUKLWphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTIgbmFtZSA9V29ya2VyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvY29uY3VycmVudC9UaHJlYWRQb29sRXhlY3V0b3I7ICkKLSBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5SdW5uYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi12b2xhdGlsZSBsb25nIGNvbXBsZXRlZFRhc2tzCi0KLXByaXZhdGUgamF2YS5sYW5nLlJ1bm5hYmxlIGZpcnN0VGFzawotCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudExvY2sgcnVuTG9jawotCi1maW5hbCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IgdGhpcyQwCi0KLSBqYXZhLmxhbmcuVGhyZWFkIHRocmVhZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvcgotamF2YS5sYW5nLlJ1bm5hYmxlKQotCi1wcml2YXRlIHZvaWQgcnVuVGFzaygKLWphdmEubGFuZy5SdW5uYWJsZSkKLQotIHZvaWQgaW50ZXJydXB0SWZJZGxlKCkKLQotIHZvaWQgaW50ZXJydXB0Tm93KCkKLQotIGJvb2xlYW4gaXNBY3RpdmUoKQotCi1wdWJsaWMgdm9pZCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL0VudW08TGphdmEvdXRpbC9jb25jdXJyZW50L1RpbWVVbml0Oz47ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdCBleHRlbmRzIGphdmEubGFuZy5FbnVtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0W10gJFZBTFVFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0IE1JQ1JPU0VDT05EUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0IE1JTExJU0VDT05EUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0IE5BTk9TRUNPTkRTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQgU0VDT05EUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBtdWx0aXBsaWVycwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gb3ZlcmZsb3dzCi0KLXByaXZhdGUgZmluYWwgaW50IGluZGV4Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJKVYgKQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBsb25nIGRvQ29udmVydCgKLWludAotbG9uZykKLQotcHJpdmF0ZSBpbnQgZXhjZXNzTmFub3MoCi1sb25nCi1sb25nKQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0IHZhbHVlT2YoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0W10gdmFsdWVzKCkKLQotcHVibGljIGxvbmcgY29udmVydCgKLWxvbmcKLWphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSW50ZXJydXB0ZWRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNsZWVwKAotbG9uZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0ludGVycnVwdGVkRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB0aW1lZEpvaW4oCi1qYXZhLmxhbmcuVGhyZWFkCi1sb25nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSW50ZXJydXB0ZWRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHRpbWVkV2FpdCgKLWphdmEubGFuZy5PYmplY3QKLWxvbmcpCi0KLXB1YmxpYyBsb25nIHRvTWljcm9zKAotbG9uZykKLQotcHVibGljIGxvbmcgdG9NaWxsaXMoCi1sb25nKQotCi1wdWJsaWMgbG9uZyB0b05hbm9zKAotbG9uZykKLQotcHVibGljIGxvbmcgdG9TZWNvbmRzKAotbG9uZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lb3V0RXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLkV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBzdW4ubWlzYy5VbnNhZmUgdW5zYWZlCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgdmFsdWVPZmZzZXQKLQotcHJpdmF0ZSB2b2xhdGlsZSBpbnQgdmFsdWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWJvb2xlYW4pCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGNvbXBhcmVBbmRTZXQoCi1ib29sZWFuCi1ib29sZWFuKQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBnZXQoKQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBnZXRBbmRTZXQoCi1ib29sZWFuKQotCi1wdWJsaWMgZmluYWwgdm9pZCBzZXQoCi1ib29sZWFuKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLXB1YmxpYyBib29sZWFuIHdlYWtDb21wYXJlQW5kU2V0KAotYm9vbGVhbgotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlciBleHRlbmRzIGphdmEubGFuZy5OdW1iZXIgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgc3VuLm1pc2MuVW5zYWZlIHVuc2FmZQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHZhbHVlT2Zmc2V0Ci0KLXByaXZhdGUgdm9sYXRpbGUgaW50IHZhbHVlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQpCi0KLXB1YmxpYyBmaW5hbCBpbnQgYWRkQW5kR2V0KAotaW50KQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBjb21wYXJlQW5kU2V0KAotaW50Ci1pbnQpCi0KLXB1YmxpYyBmaW5hbCBpbnQgZGVjcmVtZW50QW5kR2V0KCkKLQotcHVibGljIGRvdWJsZSBkb3VibGVWYWx1ZSgpCi0KLXB1YmxpYyBmbG9hdCBmbG9hdFZhbHVlKCkKLQotcHVibGljIGZpbmFsIGludCBnZXQoKQotCi1wdWJsaWMgZmluYWwgaW50IGdldEFuZEFkZCgKLWludCkKLQotcHVibGljIGZpbmFsIGludCBnZXRBbmREZWNyZW1lbnQoKQotCi1wdWJsaWMgZmluYWwgaW50IGdldEFuZEluY3JlbWVudCgpCi0KLXB1YmxpYyBmaW5hbCBpbnQgZ2V0QW5kU2V0KAotaW50KQotCi1wdWJsaWMgZmluYWwgaW50IGluY3JlbWVudEFuZEdldCgpCi0KLXB1YmxpYyBpbnQgaW50VmFsdWUoKQotCi1wdWJsaWMgbG9uZyBsb25nVmFsdWUoKQotCi1wdWJsaWMgZmluYWwgdm9pZCBzZXQoCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gd2Vha0NvbXBhcmVBbmRTZXQoCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlckFycmF5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBiYXNlCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBzY2FsZQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgc3VuLm1pc2MuVW5zYWZlIHVuc2FmZQotCi1wcml2YXRlIGZpbmFsIGludFtdIGFycmF5Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludFtdKQotCi1wcml2YXRlIGxvbmcgcmF3SW5kZXgoCi1pbnQpCi0KLXB1YmxpYyBmaW5hbCBpbnQgYWRkQW5kR2V0KAotaW50Ci1pbnQpCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGNvbXBhcmVBbmRTZXQoCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgZmluYWwgaW50IGRlY3JlbWVudEFuZEdldCgKLWludCkKLQotcHVibGljIGZpbmFsIGludCBnZXQoCi1pbnQpCi0KLXB1YmxpYyBmaW5hbCBpbnQgZ2V0QW5kQWRkKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBmaW5hbCBpbnQgZ2V0QW5kRGVjcmVtZW50KAotaW50KQotCi1wdWJsaWMgZmluYWwgaW50IGdldEFuZEluY3JlbWVudCgKLWludCkKLQotcHVibGljIGZpbmFsIGludCBnZXRBbmRTZXQoCi1pbnQKLWludCkKLQotcHVibGljIGZpbmFsIGludCBpbmNyZW1lbnRBbmRHZXQoCi1pbnQpCi0KLXB1YmxpYyBmaW5hbCBpbnQgbGVuZ3RoKCkKLQotcHVibGljIGZpbmFsIHZvaWQgc2V0KAotaW50Ci1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gd2Vha0NvbXBhcmVBbmRTZXQoCi1pbnQKLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGphdmEvdXRpbC9jb25jdXJyZW50L2F0b21pYy9BdG9taWNJbnRlZ2VyRmllbGRVcGRhdGVyJEF0b21pY0ludGVnZXJGaWVsZFVwZGF0ZXJJbXBsOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFQ6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL2xhbmcvT2JqZWN0OyApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXJGaWVsZFVwZGF0ZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VTpMamF2YS9sYW5nL09iamVjdDs+KExqYXZhL2xhbmcvQ2xhc3M8VFU7PjtMamF2YS9sYW5nL1N0cmluZzspTGphdmEvdXRpbC9jb25jdXJyZW50L2F0b21pYy9BdG9taWNJbnRlZ2VyRmllbGRVcGRhdGVyPFRVOz47ICkKLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXJGaWVsZFVwZGF0ZXIgbmV3VXBkYXRlcigKLWphdmEubGFuZy5DbGFzcwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVFQ7SSlJICkKLXB1YmxpYyBpbnQgYWRkQW5kR2V0KAotamF2YS5sYW5nLk9iamVjdAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUVDtJSSlaICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGNvbXBhcmVBbmRTZXQoCi1qYXZhLmxhbmcuT2JqZWN0Ci1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVFQ7KUkgKQotcHVibGljIGludCBkZWNyZW1lbnRBbmRHZXQoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUVDspSSApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldCgKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRUO0kpSSApCi1wdWJsaWMgaW50IGdldEFuZEFkZCgKLWphdmEubGFuZy5PYmplY3QKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVFQ7KUkgKQotcHVibGljIGludCBnZXRBbmREZWNyZW1lbnQoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUVDspSSApCi1wdWJsaWMgaW50IGdldEFuZEluY3JlbWVudCgKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRUO0kpSSApCi1wdWJsaWMgaW50IGdldEFuZFNldCgKLWphdmEubGFuZy5PYmplY3QKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVFQ7KUkgKQotcHVibGljIGludCBpbmNyZW1lbnRBbmRHZXQoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUVDtJKVYgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0KAotamF2YS5sYW5nLk9iamVjdAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUVDtJSSlaICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHdlYWtDb21wYXJlQW5kU2V0KAotamF2YS5sYW5nLk9iamVjdAotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1BdG9taWNJbnRlZ2VyRmllbGRVcGRhdGVySW1wbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL2NvbmN1cnJlbnQvYXRvbWljL0F0b21pY0ludGVnZXJGaWVsZFVwZGF0ZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvdXRpbC9jb25jdXJyZW50L2F0b21pYy9BdG9taWNJbnRlZ2VyRmllbGRVcGRhdGVyPFRUOz47ICkKLSBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlckZpZWxkVXBkYXRlciRBdG9taWNJbnRlZ2VyRmllbGRVcGRhdGVySW1wbCBleHRlbmRzIGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyRmllbGRVcGRhdGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIHN1bi5taXNjLlVuc2FmZSB1bnNhZmUKLQotcHJpdmF0ZSBmaW5hbCBsb25nIG9mZnNldAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvQ2xhc3M8VFQ7PjsgKQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuQ2xhc3MgdGNsYXNzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL0NsYXNzPFRUOz47TGphdmEvbGFuZy9TdHJpbmc7KVYgKQotIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLkNsYXNzCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUVDtJSSlaICkKLXB1YmxpYyBib29sZWFuIGNvbXBhcmVBbmRTZXQoCi1qYXZhLmxhbmcuT2JqZWN0Ci1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVFQ7KUkgKQotcHVibGljIGZpbmFsIGludCBnZXQoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUVDtJKVYgKQotcHVibGljIHZvaWQgc2V0KAotamF2YS5sYW5nLk9iamVjdAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUVDtJSSlaICkKLXB1YmxpYyBib29sZWFuIHdlYWtDb21wYXJlQW5kU2V0KAotamF2YS5sYW5nLk9iamVjdAotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0xvbmcgZXh0ZW5kcyBqYXZhLmxhbmcuTnVtYmVyIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIGJvb2xlYW4gVk1fU1VQUE9SVFNfTE9OR19DQVMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIHN1bi5taXNjLlVuc2FmZSB1bnNhZmUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyB2YWx1ZU9mZnNldAotCi1wcml2YXRlIHZvbGF0aWxlIGxvbmcgdmFsdWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWxvbmcpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBib29sZWFuIFZNU3VwcG9ydHNDUzgoKQotCi1wdWJsaWMgZmluYWwgbG9uZyBhZGRBbmRHZXQoCi1sb25nKQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBjb21wYXJlQW5kU2V0KAotbG9uZwotbG9uZykKLQotcHVibGljIGZpbmFsIGxvbmcgZGVjcmVtZW50QW5kR2V0KCkKLQotcHVibGljIGRvdWJsZSBkb3VibGVWYWx1ZSgpCi0KLXB1YmxpYyBmbG9hdCBmbG9hdFZhbHVlKCkKLQotcHVibGljIGZpbmFsIGxvbmcgZ2V0KCkKLQotcHVibGljIGZpbmFsIGxvbmcgZ2V0QW5kQWRkKAotbG9uZykKLQotcHVibGljIGZpbmFsIGxvbmcgZ2V0QW5kRGVjcmVtZW50KCkKLQotcHVibGljIGZpbmFsIGxvbmcgZ2V0QW5kSW5jcmVtZW50KCkKLQotcHVibGljIGZpbmFsIGxvbmcgZ2V0QW5kU2V0KAotbG9uZykKLQotcHVibGljIGZpbmFsIGxvbmcgaW5jcmVtZW50QW5kR2V0KCkKLQotcHVibGljIGludCBpbnRWYWx1ZSgpCi0KLXB1YmxpYyBsb25nIGxvbmdWYWx1ZSgpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHNldCgKLWxvbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gd2Vha0NvbXBhcmVBbmRTZXQoCi1sb25nCi1sb25nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNMb25nQXJyYXkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGJhc2UKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IHNjYWxlCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBzdW4ubWlzYy5VbnNhZmUgdW5zYWZlCi0KLXByaXZhdGUgZmluYWwgbG9uZ1tdIGFycmF5Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWxvbmdbXSkKLQotcHJpdmF0ZSBsb25nIHJhd0luZGV4KAotaW50KQotCi1wdWJsaWMgbG9uZyBhZGRBbmRHZXQoCi1pbnQKLWxvbmcpCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGNvbXBhcmVBbmRTZXQoCi1pbnQKLWxvbmcKLWxvbmcpCi0KLXB1YmxpYyBmaW5hbCBsb25nIGRlY3JlbWVudEFuZEdldCgKLWludCkKLQotcHVibGljIGZpbmFsIGxvbmcgZ2V0KAotaW50KQotCi1wdWJsaWMgZmluYWwgbG9uZyBnZXRBbmRBZGQoCi1pbnQKLWxvbmcpCi0KLXB1YmxpYyBmaW5hbCBsb25nIGdldEFuZERlY3JlbWVudCgKLWludCkKLQotcHVibGljIGZpbmFsIGxvbmcgZ2V0QW5kSW5jcmVtZW50KAotaW50KQotCi1wdWJsaWMgZmluYWwgbG9uZyBnZXRBbmRTZXQoCi1pbnQKLWxvbmcpCi0KLXB1YmxpYyBmaW5hbCBsb25nIGluY3JlbWVudEFuZEdldCgKLWludCkKLQotcHVibGljIGZpbmFsIGludCBsZW5ndGgoKQotCi1wdWJsaWMgZmluYWwgdm9pZCBzZXQoCi1pbnQKLWxvbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gd2Vha0NvbXBhcmVBbmRTZXQoCi1pbnQKLWxvbmcKLWxvbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS9sYW5nL09iamVjdDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MamF2YS91dGlsL2NvbmN1cnJlbnQvYXRvbWljL0F0b21pY0xvbmdGaWVsZFVwZGF0ZXIkTG9ja2VkVXBkYXRlcjtMamF2YS91dGlsL2NvbmN1cnJlbnQvYXRvbWljL0F0b21pY0xvbmdGaWVsZFVwZGF0ZXIkQ0FTVXBkYXRlcjsgKQotcHVibGljIGFic3RyYWN0IGNsYXNzIGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNMb25nRmllbGRVcGRhdGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFU6TGphdmEvbGFuZy9PYmplY3Q7PihMamF2YS9sYW5nL0NsYXNzPFRVOz47TGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL3V0aWwvY29uY3VycmVudC9hdG9taWMvQXRvbWljTG9uZ0ZpZWxkVXBkYXRlcjxUVTs+OyApCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNMb25nRmllbGRVcGRhdGVyIG5ld1VwZGF0ZXIoCi1qYXZhLmxhbmcuQ2xhc3MKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRUO0opSiApCi1wdWJsaWMgbG9uZyBhZGRBbmRHZXQoCi1qYXZhLmxhbmcuT2JqZWN0Ci1sb25nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUVDtKSilaICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGNvbXBhcmVBbmRTZXQoCi1qYXZhLmxhbmcuT2JqZWN0Ci1sb25nCi1sb25nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUVDspSiApCi1wdWJsaWMgbG9uZyBkZWNyZW1lbnRBbmRHZXQoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUVDspSiApCi1wdWJsaWMgYWJzdHJhY3QgbG9uZyBnZXQoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUVDtKKUogKQotcHVibGljIGxvbmcgZ2V0QW5kQWRkKAotamF2YS5sYW5nLk9iamVjdAotbG9uZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVFQ7KUogKQotcHVibGljIGxvbmcgZ2V0QW5kRGVjcmVtZW50KAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVFQ7KUogKQotcHVibGljIGxvbmcgZ2V0QW5kSW5jcmVtZW50KAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVFQ7SilKICkKLXB1YmxpYyBsb25nIGdldEFuZFNldCgKLWphdmEubGFuZy5PYmplY3QKLWxvbmcpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRUOylKICkKLXB1YmxpYyBsb25nIGluY3JlbWVudEFuZEdldCgKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRUO0opViApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXQoCi1qYXZhLmxhbmcuT2JqZWN0Ci1sb25nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUVDtKSilaICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHdlYWtDb21wYXJlQW5kU2V0KAotamF2YS5sYW5nLk9iamVjdAotbG9uZwotbG9uZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFQ6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL3V0aWwvY29uY3VycmVudC9hdG9taWMvQXRvbWljTG9uZ0ZpZWxkVXBkYXRlcjxUVDs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPUNBU1VwZGF0ZXIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9jb25jdXJyZW50L2F0b21pYy9BdG9taWNMb25nRmllbGRVcGRhdGVyOyApCi0gY2xhc3MgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0xvbmdGaWVsZFVwZGF0ZXIkQ0FTVXBkYXRlciBleHRlbmRzIGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNMb25nRmllbGRVcGRhdGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIHN1bi5taXNjLlVuc2FmZSB1bnNhZmUKLQotcHJpdmF0ZSBmaW5hbCBsb25nIG9mZnNldAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvQ2xhc3M8VFQ7PjsgKQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuQ2xhc3MgdGNsYXNzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL0NsYXNzPFRUOz47TGphdmEvbGFuZy9TdHJpbmc7KVYgKQotIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLkNsYXNzCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUVDtKSilaICkKLXB1YmxpYyBib29sZWFuIGNvbXBhcmVBbmRTZXQoCi1qYXZhLmxhbmcuT2JqZWN0Ci1sb25nCi1sb25nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUVDspSiApCi1wdWJsaWMgbG9uZyBnZXQoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUVDtKKVYgKQotcHVibGljIHZvaWQgc2V0KAotamF2YS5sYW5nLk9iamVjdAotbG9uZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVFQ7SkopWiApCi1wdWJsaWMgYm9vbGVhbiB3ZWFrQ29tcGFyZUFuZFNldCgKLWphdmEubGFuZy5PYmplY3QKLWxvbmcKLWxvbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1Mb2NrZWRVcGRhdGVyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvdXRpbC9jb25jdXJyZW50L2F0b21pYy9BdG9taWNMb25nRmllbGRVcGRhdGVyPFRUOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvY29uY3VycmVudC9hdG9taWMvQXRvbWljTG9uZ0ZpZWxkVXBkYXRlcjsgKQotIGNsYXNzIGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNMb25nRmllbGRVcGRhdGVyJExvY2tlZFVwZGF0ZXIgZXh0ZW5kcyBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljTG9uZ0ZpZWxkVXBkYXRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBzdW4ubWlzYy5VbnNhZmUgdW5zYWZlCi0KLXByaXZhdGUgZmluYWwgbG9uZyBvZmZzZXQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL0NsYXNzPFRUOz47ICkKLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLkNsYXNzIHRjbGFzcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9DbGFzczxUVDs+O0xqYXZhL2xhbmcvU3RyaW5nOylWICkKLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5DbGFzcwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVFQ7SkopWiApCi1wdWJsaWMgYm9vbGVhbiBjb21wYXJlQW5kU2V0KAotamF2YS5sYW5nLk9iamVjdAotbG9uZwotbG9uZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVFQ7KUogKQotcHVibGljIGxvbmcgZ2V0KAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVFQ7SilWICkKLXB1YmxpYyB2b2lkIHNldCgKLWphdmEubGFuZy5PYmplY3QKLWxvbmcpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRUO0pKKVogKQotcHVibGljIGJvb2xlYW4gd2Vha0NvbXBhcmVBbmRTZXQoCi1qYXZhLmxhbmcuT2JqZWN0Ci1sb25nCi1sb25nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9UmVmZXJlbmNlQm9vbGVhblBhaXIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9jb25jdXJyZW50L2F0b21pYy9BdG9taWNNYXJrYWJsZVJlZmVyZW5jZTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS9sYW5nL09iamVjdDsgKQotIGNsYXNzIGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNNYXJrYWJsZVJlZmVyZW5jZSRSZWZlcmVuY2VCb29sZWFuUGFpciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBib29sZWFuIGJpdAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPVRUOyApCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5PYmplY3QgcmVmZXJlbmNlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVFQ7WilWICkKLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5PYmplY3QKLWJvb2xlYW4pCi0KLXN0YXRpYyBqYXZhLmxhbmcuT2JqZWN0IGFjY2VzcyQwMDAoCi1qYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljTWFya2FibGVSZWZlcmVuY2UkUmVmZXJlbmNlQm9vbGVhblBhaXIpCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQxMDAoCi1qYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljTWFya2FibGVSZWZlcmVuY2UkUmVmZXJlbmNlQm9vbGVhblBhaXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxWOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS9sYW5nL09iamVjdDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MamF2YS91dGlsL2NvbmN1cnJlbnQvYXRvbWljL0F0b21pY01hcmthYmxlUmVmZXJlbmNlJFJlZmVyZW5jZUJvb2xlYW5QYWlyOyApCi1wdWJsaWMgY2xhc3MgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY01hcmthYmxlUmVmZXJlbmNlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvY29uY3VycmVudC9hdG9taWMvQXRvbWljUmVmZXJlbmNlPExqYXZhL3V0aWwvY29uY3VycmVudC9hdG9taWMvQXRvbWljTWFya2FibGVSZWZlcmVuY2UkUmVmZXJlbmNlQm9vbGVhblBhaXI8VFY7Pjs+OyApCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2UgYXRvbWljUmVmCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVFY7WilWICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5PYmplY3QKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRWO1opWiApCi1wdWJsaWMgYm9vbGVhbiBhdHRlbXB0TWFyaygKLWphdmEubGFuZy5PYmplY3QKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRWO1RWO1paKVogKQotcHVibGljIGJvb2xlYW4gY29tcGFyZUFuZFNldCgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QKLWJvb2xlYW4KLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFtaKVRWOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXQoCi1ib29sZWFuW10pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClUVjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0UmVmZXJlbmNlKCkKLQotcHVibGljIGJvb2xlYW4gaXNNYXJrZWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUVjtaKVYgKQotcHVibGljIHZvaWQgc2V0KAotamF2YS5sYW5nLk9iamVjdAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVFY7VFY7WlopWiApCi1wdWJsaWMgYm9vbGVhbiB3ZWFrQ29tcGFyZUFuZFNldCgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QKLWJvb2xlYW4KLWJvb2xlYW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxWOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS9sYW5nL09iamVjdDtMamF2YS9pby9TZXJpYWxpemFibGU7ICkKLXB1YmxpYyBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljUmVmZXJlbmNlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBzdW4ubWlzYy5VbnNhZmUgdW5zYWZlCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgdmFsdWVPZmZzZXQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1UVjsgKQotcHJpdmF0ZSB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IHZhbHVlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUVjspViApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUVjtUVjspWiApCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBjb21wYXJlQW5kU2V0KAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVRWOyApCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLk9iamVjdCBnZXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUVjspVFY7ICkKLXB1YmxpYyBmaW5hbCBqYXZhLmxhbmcuT2JqZWN0IGdldEFuZFNldCgKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRWOylWICkKLXB1YmxpYyBmaW5hbCB2b2lkIHNldCgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVFY7VFY7KVogKQotcHVibGljIGZpbmFsIGJvb2xlYW4gd2Vha0NvbXBhcmVBbmRTZXQoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08RTpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvaW8vU2VyaWFsaXphYmxlOyApCi1wdWJsaWMgY2xhc3MgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY1JlZmVyZW5jZUFycmF5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBiYXNlCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBzY2FsZQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgc3VuLm1pc2MuVW5zYWZlIHVuc2FmZQotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5PYmplY3RbXSBhcnJheQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShbVEU7KVYgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLk9iamVjdFtdKQotCi1wcml2YXRlIGxvbmcgcmF3SW5kZXgoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KElURTtURTspWiApCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBjb21wYXJlQW5kU2V0KAotaW50Ci1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJKVRFOyApCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLk9iamVjdCBnZXQoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KElURTspVEU7ICkKLXB1YmxpYyBmaW5hbCBqYXZhLmxhbmcuT2JqZWN0IGdldEFuZFNldCgKLWludAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGZpbmFsIGludCBsZW5ndGgoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShJVEU7KVYgKQotcHVibGljIGZpbmFsIHZvaWQgc2V0KAotaW50Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KElURTtURTspWiApCi1wdWJsaWMgZmluYWwgYm9vbGVhbiB3ZWFrQ29tcGFyZUFuZFNldCgKLWludAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxqYXZhL3V0aWwvY29uY3VycmVudC9hdG9taWMvQXRvbWljUmVmZXJlbmNlRmllbGRVcGRhdGVyJEF0b21pY1JlZmVyZW5jZUZpZWxkVXBkYXRlckltcGw7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDtWOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS9sYW5nL09iamVjdDsgKQotcHVibGljIGFic3RyYWN0IGNsYXNzIGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2VGaWVsZFVwZGF0ZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VTpMamF2YS9sYW5nL09iamVjdDtXOkxqYXZhL2xhbmcvT2JqZWN0Oz4oTGphdmEvbGFuZy9DbGFzczxUVTs+O0xqYXZhL2xhbmcvQ2xhc3M8VFc7PjtMamF2YS9sYW5nL1N0cmluZzspTGphdmEvdXRpbC9jb25jdXJyZW50L2F0b21pYy9BdG9taWNSZWZlcmVuY2VGaWVsZFVwZGF0ZXI8VFU7VFc7PjsgKQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljUmVmZXJlbmNlRmllbGRVcGRhdGVyIG5ld1VwZGF0ZXIoCi1qYXZhLmxhbmcuQ2xhc3MKLWphdmEubGFuZy5DbGFzcwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVFQ7VFY7VFY7KVogKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gY29tcGFyZUFuZFNldCgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRUOylUVjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5PYmplY3QgZ2V0KAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVFQ7VFY7KVRWOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRBbmRTZXQoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUVDtUVjspViApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXQoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUVDtUVjtUVjspWiApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiB3ZWFrQ29tcGFyZUFuZFNldCgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0O1Y6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL3V0aWwvY29uY3VycmVudC9hdG9taWMvQXRvbWljUmVmZXJlbmNlRmllbGRVcGRhdGVyPFRUO1RWOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9QXRvbWljUmVmZXJlbmNlRmllbGRVcGRhdGVySW1wbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL2NvbmN1cnJlbnQvYXRvbWljL0F0b21pY1JlZmVyZW5jZUZpZWxkVXBkYXRlcjsgKQotIGNsYXNzIGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2VGaWVsZFVwZGF0ZXIkQXRvbWljUmVmZXJlbmNlRmllbGRVcGRhdGVySW1wbCBleHRlbmRzIGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2VGaWVsZFVwZGF0ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgc3VuLm1pc2MuVW5zYWZlIHVuc2FmZQotCi1wcml2YXRlIGZpbmFsIGxvbmcgb2Zmc2V0Ci1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9DbGFzczxUVDs+OyApCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5DbGFzcyB0Y2xhc3MKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL0NsYXNzPFRWOz47ICkKLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLkNsYXNzIHZjbGFzcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9DbGFzczxUVDs+O0xqYXZhL2xhbmcvQ2xhc3M8VFY7PjtMamF2YS9sYW5nL1N0cmluZzspViApCi0gdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuQ2xhc3MKLWphdmEubGFuZy5DbGFzcwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVFQ7VFY7VFY7KVogKQotcHVibGljIGJvb2xlYW4gY29tcGFyZUFuZFNldCgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRUOylUVjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0KAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVFQ7VFY7KVYgKQotcHVibGljIHZvaWQgc2V0KAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVFQ7VFY7VFY7KVogKQotcHVibGljIGJvb2xlYW4gd2Vha0NvbXBhcmVBbmRTZXQoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvbGFuZy9PYmplY3Q7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvY29uY3VycmVudC9hdG9taWMvQXRvbWljU3RhbXBlZFJlZmVyZW5jZTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1SZWZlcmVuY2VJbnRlZ2VyUGFpciApCi0gY2xhc3MgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY1N0YW1wZWRSZWZlcmVuY2UkUmVmZXJlbmNlSW50ZWdlclBhaXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgaW50IGludGVnZXIKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1UVDsgKQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuT2JqZWN0IHJlZmVyZW5jZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRUO0kpViApCi0gdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuT2JqZWN0Ci1pbnQpCi0KLXN0YXRpYyBqYXZhLmxhbmcuT2JqZWN0IGFjY2VzcyQwMDAoCi1qYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljU3RhbXBlZFJlZmVyZW5jZSRSZWZlcmVuY2VJbnRlZ2VyUGFpcikKLQotc3RhdGljIGludCBhY2Nlc3MkMTAwKAotamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY1N0YW1wZWRSZWZlcmVuY2UkUmVmZXJlbmNlSW50ZWdlclBhaXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MamF2YS91dGlsL2NvbmN1cnJlbnQvYXRvbWljL0F0b21pY1N0YW1wZWRSZWZlcmVuY2UkUmVmZXJlbmNlSW50ZWdlclBhaXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VjpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvbGFuZy9PYmplY3Q7ICkKLXB1YmxpYyBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljU3RhbXBlZFJlZmVyZW5jZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL2NvbmN1cnJlbnQvYXRvbWljL0F0b21pY1JlZmVyZW5jZTxMamF2YS91dGlsL2NvbmN1cnJlbnQvYXRvbWljL0F0b21pY1N0YW1wZWRSZWZlcmVuY2UkUmVmZXJlbmNlSW50ZWdlclBhaXI8VFY7Pjs+OyApCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2UgYXRvbWljUmVmCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVFY7SSlWICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5PYmplY3QKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVFY7SSlaICkKLXB1YmxpYyBib29sZWFuIGF0dGVtcHRTdGFtcCgKLWphdmEubGFuZy5PYmplY3QKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVFY7VFY7SUkpWiApCi1wdWJsaWMgYm9vbGVhbiBjb21wYXJlQW5kU2V0KAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdAotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFtJKVRWOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXQoCi1pbnRbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVRWOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRSZWZlcmVuY2UoKQotCi1wdWJsaWMgaW50IGdldFN0YW1wKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVFY7SSlWICkKLXB1YmxpYyB2b2lkIHNldCgKLWphdmEubGFuZy5PYmplY3QKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVFY7VFY7SUkpWiApCi1wdWJsaWMgYm9vbGVhbiB3ZWFrQ29tcGFyZUFuZFNldCgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QKLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotZmluYWwgY2xhc3MgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLlVuc2FmZUFjY2VzcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIHN1bi5taXNjLlVuc2FmZSBUSEVfT05FCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuQ29uZGl0aW9uIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbnRlcnJ1cHRlZEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgYXdhaXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSW50ZXJydXB0ZWRFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGF3YWl0KAotbG9uZwotamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbnRlcnJ1cHRlZEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGxvbmcgYXdhaXROYW5vcygKLWxvbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGF3YWl0VW5pbnRlcnJ1cHRpYmx5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0ludGVycnVwdGVkRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBhd2FpdFVudGlsKAotamF2YS51dGlsLkRhdGUpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNpZ25hbCgpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNpZ25hbEFsbCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9jb25jdXJyZW50L2xvY2tzL0Fic3RyYWN0UXVldWVkU3luY2hyb25pemVyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEgbmFtZSA9Q29uZGl0aW9uT2JqZWN0ICkKLXB1YmxpYyBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5BYnN0cmFjdFF1ZXVlZFN5bmNocm9uaXplciRDb25kaXRpb25PYmplY3QgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuQ29uZGl0aW9uLCBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVJTlRFUlJVUFQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRIUk9XX0lFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotCi1wcml2YXRlIHRyYW5zaWVudCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5BYnN0cmFjdFF1ZXVlZFN5bmNocm9uaXplciROb2RlIGZpcnN0V2FpdGVyCi0KLXByaXZhdGUgdHJhbnNpZW50IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkFic3RyYWN0UXVldWVkU3luY2hyb25pemVyJE5vZGUgbGFzdFdhaXRlcgotCi1maW5hbCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5BYnN0cmFjdFF1ZXVlZFN5bmNocm9uaXplciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5BYnN0cmFjdFF1ZXVlZFN5bmNocm9uaXplcikKLQotcHJpdmF0ZSBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5BYnN0cmFjdFF1ZXVlZFN5bmNocm9uaXplciROb2RlIGFkZENvbmRpdGlvbldhaXRlcigpCi0KLXByaXZhdGUgaW50IGNoZWNrSW50ZXJydXB0V2hpbGVXYWl0aW5nKAotamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuQWJzdHJhY3RRdWV1ZWRTeW5jaHJvbml6ZXIkTm9kZSkKLQotcHJpdmF0ZSB2b2lkIGRvU2lnbmFsKAotamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuQWJzdHJhY3RRdWV1ZWRTeW5jaHJvbml6ZXIkTm9kZSkKLQotcHJpdmF0ZSB2b2lkIGRvU2lnbmFsQWxsKAotamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuQWJzdHJhY3RRdWV1ZWRTeW5jaHJvbml6ZXIkTm9kZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0ludGVycnVwdGVkRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgcmVwb3J0SW50ZXJydXB0QWZ0ZXJXYWl0KAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSW50ZXJydXB0ZWRFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCB2b2lkIGF3YWl0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0ludGVycnVwdGVkRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBhd2FpdCgKLWxvbmcKLWphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSW50ZXJydXB0ZWRFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBsb25nIGF3YWl0TmFub3MoCi1sb25nKQotCi1wdWJsaWMgZmluYWwgdm9pZCBhd2FpdFVuaW50ZXJydXB0aWJseSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbnRlcnJ1cHRlZEV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIGJvb2xlYW4gYXdhaXRVbnRpbCgKLWphdmEudXRpbC5EYXRlKQotCi1wcm90ZWN0ZWQgZmluYWwgaW50IGdldFdhaXRRdWV1ZUxlbmd0aCgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0NvbGxlY3Rpb248TGphdmEvbGFuZy9UaHJlYWQ7PjsgKQotcHJvdGVjdGVkIGZpbmFsIGphdmEudXRpbC5Db2xsZWN0aW9uIGdldFdhaXRpbmdUaHJlYWRzKCkKLQotcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaGFzV2FpdGVycygpCi0KLWZpbmFsIGJvb2xlYW4gaXNPd25lZEJ5KAotamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuQWJzdHJhY3RRdWV1ZWRTeW5jaHJvbml6ZXIpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHNpZ25hbCgpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHNpZ25hbEFsbCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNCBuYW1lID1Ob2RlICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvY29uY3VycmVudC9sb2Nrcy9BYnN0cmFjdFF1ZXVlZFN5bmNocm9uaXplcjsgKQotZmluYWwgY2xhc3MgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuQWJzdHJhY3RRdWV1ZWRTeW5jaHJvbml6ZXIkTm9kZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIGludCBDQU5DRUxMRUQKLQotc3RhdGljIGZpbmFsIGludCBDT05ESVRJT04KLQotc3RhdGljIGZpbmFsIGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkFic3RyYWN0UXVldWVkU3luY2hyb25pemVyJE5vZGUgRVhDTFVTSVZFCi0KLXN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5BYnN0cmFjdFF1ZXVlZFN5bmNocm9uaXplciROb2RlIFNIQVJFRAotCi1zdGF0aWMgZmluYWwgaW50IFNJR05BTAotCi12b2xhdGlsZSBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5BYnN0cmFjdFF1ZXVlZFN5bmNocm9uaXplciROb2RlIG5leHQKLQotIGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkFic3RyYWN0UXVldWVkU3luY2hyb25pemVyJE5vZGUgbmV4dFdhaXRlcgotCi12b2xhdGlsZSBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5BYnN0cmFjdFF1ZXVlZFN5bmNocm9uaXplciROb2RlIHByZXYKLQotdm9sYXRpbGUgamF2YS5sYW5nLlRocmVhZCB0aHJlYWQKLQotdm9sYXRpbGUgaW50IHdhaXRTdGF0dXMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLSB2b2lkIDxpbml0PigpCi0KLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5UaHJlYWQKLWludCkKLQotIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlRocmVhZAotamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuQWJzdHJhY3RRdWV1ZWRTeW5jaHJvbml6ZXIkTm9kZSkKLQotZmluYWwgYm9vbGVhbiBpc1NoYXJlZCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9OdWxsUG9pbnRlckV4Y2VwdGlvbjsgKQotZmluYWwgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuQWJzdHJhY3RRdWV1ZWRTeW5jaHJvbml6ZXIkTm9kZSBwcmVkZWNlc3NvcigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuTG9ja1N1cHBvcnQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIHN1bi5taXNjLlVuc2FmZSB1bnNhZmUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgcGFyaygpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBwYXJrTmFub3MoCi1sb25nKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgcGFya1VudGlsKAotbG9uZykKLQotcHVibGljIHN0YXRpYyB2b2lkIHVucGFyaygKLWphdmEubGFuZy5UaHJlYWQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlYWRXcml0ZUxvY2sgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkxvY2sgcmVhZExvY2soKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuTG9jayB3cml0ZUxvY2soKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvY29uY3VycmVudC9sb2Nrcy9SZWVudHJhbnRMb2NrOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwMzIgbmFtZSA9U3luYyApCi1hYnN0cmFjdCBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRMb2NrJFN5bmMgZXh0ZW5kcyBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5BYnN0cmFjdFF1ZXVlZFN5bmNocm9uaXplcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi10cmFuc2llbnQgamF2YS5sYW5nLlRocmVhZCBvd25lcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgcmVhZE9iamVjdCgKLWphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0pCi0KLWZpbmFsIGludCBnZXRIb2xkQ291bnQoKQotCi1maW5hbCBqYXZhLmxhbmcuVGhyZWFkIGdldE93bmVyKCkKLQotcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaXNIZWxkRXhjbHVzaXZlbHkoKQotCi1maW5hbCBib29sZWFuIGlzTG9ja2VkKCkKLQotYWJzdHJhY3Qgdm9pZCBsb2NrKCkKLQotZmluYWwgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuQWJzdHJhY3RRdWV1ZWRTeW5jaHJvbml6ZXIkQ29uZGl0aW9uT2JqZWN0IG5ld0NvbmRpdGlvbigpCi0KLWZpbmFsIGJvb2xlYW4gbm9uZmFpclRyeUFjcXVpcmUoCi1pbnQpCi0KLXByb3RlY3RlZCBmaW5hbCBib29sZWFuIHRyeVJlbGVhc2UoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9jb25jdXJyZW50L2xvY2tzL1JlZW50cmFudExvY2s7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjQgbmFtZSA9RmFpclN5bmMgKQotZmluYWwgY2xhc3MgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50TG9jayRGYWlyU3luYyBleHRlbmRzIGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudExvY2skU3luYwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLWZpbmFsIHZvaWQgbG9jaygpCi0KLXByb3RlY3RlZCBmaW5hbCBib29sZWFuIHRyeUFjcXVpcmUoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNCBuYW1lID1Ob25mYWlyU3luYyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL2NvbmN1cnJlbnQvbG9ja3MvUmVlbnRyYW50TG9jazsgKQotZmluYWwgY2xhc3MgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50TG9jayROb25mYWlyU3luYyBleHRlbmRzIGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudExvY2skU3luYwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLWZpbmFsIHZvaWQgbG9jaygpCi0KLXByb3RlY3RlZCBmaW5hbCBib29sZWFuIHRyeUFjcXVpcmUoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMDMyIG5hbWUgPVN5bmMgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9jb25jdXJyZW50L2xvY2tzL1JlZW50cmFudFJlYWRXcml0ZUxvY2s7ICkKLWFic3RyYWN0IGNsYXNzIGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudFJlYWRXcml0ZUxvY2skU3luYyBleHRlbmRzIGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkFic3RyYWN0UXVldWVkU3luY2hyb25pemVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXRyYW5zaWVudCBqYXZhLmxhbmcuVGhyZWFkIG93bmVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9sYW5nL0NsYXNzTm90Rm91bmRFeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCByZWFkT2JqZWN0KAotamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSkKLQotZmluYWwgaW50IGdldENvdW50KCkKLQotZmluYWwgamF2YS5sYW5nLlRocmVhZCBnZXRPd25lcigpCi0KLWZpbmFsIGludCBnZXRSZWFkTG9ja0NvdW50KCkKLQotZmluYWwgaW50IGdldFdyaXRlSG9sZENvdW50KCkKLQotcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaXNIZWxkRXhjbHVzaXZlbHkoKQotCi1maW5hbCBib29sZWFuIGlzV3JpdGVMb2NrZWQoKQotCi1maW5hbCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5BYnN0cmFjdFF1ZXVlZFN5bmNocm9uaXplciRDb25kaXRpb25PYmplY3QgbmV3Q29uZGl0aW9uKCkKLQotZmluYWwgYm9vbGVhbiBub25mYWlyVHJ5QWNxdWlyZSgKLWludCkKLQotZmluYWwgaW50IG5vbmZhaXJUcnlBY3F1aXJlU2hhcmVkKAotaW50KQotCi1wcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiB0cnlSZWxlYXNlKAotaW50KQotCi1wcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiB0cnlSZWxlYXNlU2hhcmVkKAotaW50KQotCi1hYnN0cmFjdCB2b2lkIHdsb2NrKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI0IG5hbWUgPUZhaXJTeW5jICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvY29uY3VycmVudC9sb2Nrcy9SZWVudHJhbnRSZWFkV3JpdGVMb2NrOyApCi1maW5hbCBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRSZWFkV3JpdGVMb2NrJEZhaXJTeW5jIGV4dGVuZHMgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50UmVhZFdyaXRlTG9jayRTeW5jCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gdHJ5QWNxdWlyZSgKLWludCkKLQotcHJvdGVjdGVkIGZpbmFsIGludCB0cnlBY3F1aXJlU2hhcmVkKAotaW50KQotCi1maW5hbCB2b2lkIHdsb2NrKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL2NvbmN1cnJlbnQvbG9ja3MvUmVlbnRyYW50UmVhZFdyaXRlTG9jazsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNCBuYW1lID1Ob25mYWlyU3luYyApCi1maW5hbCBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRSZWFkV3JpdGVMb2NrJE5vbmZhaXJTeW5jIGV4dGVuZHMgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50UmVhZFdyaXRlTG9jayRTeW5jCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gdHJ5QWNxdWlyZSgKLWludCkKLQotcHJvdGVjdGVkIGZpbmFsIGludCB0cnlBY3F1aXJlU2hhcmVkKAotaW50KQotCi1maW5hbCB2b2lkIHdsb2NrKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL2NvbmN1cnJlbnQvbG9ja3MvUmVlbnRyYW50UmVhZFdyaXRlTG9jazsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPVJlYWRMb2NrICkKLXB1YmxpYyBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRSZWFkV3JpdGVMb2NrJFJlYWRMb2NrIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkxvY2ssIGphdmEuaW8uU2VyaWFsaXphYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudFJlYWRXcml0ZUxvY2skU3luYyBzeW5jCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50UmVhZFdyaXRlTG9jaykKLQotcHVibGljIHZvaWQgbG9jaygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbnRlcnJ1cHRlZEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgbG9ja0ludGVycnVwdGlibHkoKQotCi1wdWJsaWMgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuQ29uZGl0aW9uIG5ld0NvbmRpdGlvbigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotcHVibGljIGJvb2xlYW4gdHJ5TG9jaygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbnRlcnJ1cHRlZEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gdHJ5TG9jaygKLWxvbmcKLWphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0KQotCi1wdWJsaWMgdm9pZCB1bmxvY2soKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvY29uY3VycmVudC9sb2Nrcy9SZWVudHJhbnRSZWFkV3JpdGVMb2NrOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9V3JpdGVMb2NrICkKLXB1YmxpYyBjbGFzcyBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRSZWFkV3JpdGVMb2NrJFdyaXRlTG9jayBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5Mb2NrLCBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRSZWFkV3JpdGVMb2NrJFN5bmMgc3luYwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLWphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudFJlYWRXcml0ZUxvY2spCi0KLXB1YmxpYyB2b2lkIGxvY2soKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSW50ZXJydXB0ZWRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGxvY2tJbnRlcnJ1cHRpYmx5KCkKLQotcHVibGljIGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkNvbmRpdGlvbiBuZXdDb25kaXRpb24oKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLXB1YmxpYyBib29sZWFuIHRyeUxvY2soKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSW50ZXJydXB0ZWRFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIHRyeUxvY2soCi1sb25nCi1qYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdCkKLQotcHVibGljIHZvaWQgdW5sb2NrKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxqYXZhL3V0aWwvY29uY3VycmVudC9sb2Nrcy9SZWVudHJhbnRSZWFkV3JpdGVMb2NrJFdyaXRlTG9jaztMamF2YS91dGlsL2NvbmN1cnJlbnQvbG9ja3MvUmVlbnRyYW50UmVhZFdyaXRlTG9jayRSZWFkTG9jaztMamF2YS91dGlsL2NvbmN1cnJlbnQvbG9ja3MvUmVlbnRyYW50UmVhZFdyaXRlTG9jayRGYWlyU3luYztMamF2YS91dGlsL2NvbmN1cnJlbnQvbG9ja3MvUmVlbnRyYW50UmVhZFdyaXRlTG9jayROb25mYWlyU3luYztMamF2YS91dGlsL2NvbmN1cnJlbnQvbG9ja3MvUmVlbnRyYW50UmVhZFdyaXRlTG9jayRTeW5jOyApCi1wdWJsaWMgY2xhc3MgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50UmVhZFdyaXRlTG9jayBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWFkV3JpdGVMb2NrLCBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgaW50IEVYQ0xVU0lWRV9NQVNLCi0KLXN0YXRpYyBmaW5hbCBpbnQgU0hBUkVEX1NISUZUCi0KLXN0YXRpYyBmaW5hbCBpbnQgU0hBUkVEX1VOSVQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0KLXByaXZhdGUgZmluYWwgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50UmVhZFdyaXRlTG9jayRSZWFkTG9jayByZWFkZXJMb2NrCi0KLXByaXZhdGUgZmluYWwgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50UmVhZFdyaXRlTG9jayRTeW5jIHN5bmMKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRSZWFkV3JpdGVMb2NrJFdyaXRlTG9jayB3cml0ZXJMb2NrCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYm9vbGVhbikKLQotc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudFJlYWRXcml0ZUxvY2skU3luYyBhY2Nlc3MkMDAwKAotamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50UmVhZFdyaXRlTG9jaykKLQotc3RhdGljIGludCBleGNsdXNpdmVDb3VudCgKLWludCkKLQotc3RhdGljIGludCBzaGFyZWRDb3VudCgKLWludCkKLQotcHJvdGVjdGVkIGphdmEubGFuZy5UaHJlYWQgZ2V0T3duZXIoKQotCi1wdWJsaWMgZmluYWwgaW50IGdldFF1ZXVlTGVuZ3RoKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvQ29sbGVjdGlvbjxMamF2YS9sYW5nL1RocmVhZDs+OyApCi1wcm90ZWN0ZWQgamF2YS51dGlsLkNvbGxlY3Rpb24gZ2V0UXVldWVkUmVhZGVyVGhyZWFkcygpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0NvbGxlY3Rpb248TGphdmEvbGFuZy9UaHJlYWQ7PjsgKQotcHJvdGVjdGVkIGphdmEudXRpbC5Db2xsZWN0aW9uIGdldFF1ZXVlZFRocmVhZHMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9Db2xsZWN0aW9uPExqYXZhL2xhbmcvVGhyZWFkOz47ICkKLXByb3RlY3RlZCBqYXZhLnV0aWwuQ29sbGVjdGlvbiBnZXRRdWV1ZWRXcml0ZXJUaHJlYWRzKCkKLQotcHVibGljIGludCBnZXRSZWFkTG9ja0NvdW50KCkKLQotcHVibGljIGludCBnZXRXYWl0UXVldWVMZW5ndGgoCi1qYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5Db25kaXRpb24pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvY29uY3VycmVudC9sb2Nrcy9Db25kaXRpb247KUxqYXZhL3V0aWwvQ29sbGVjdGlvbjxMamF2YS9sYW5nL1RocmVhZDs+OyApCi1wcm90ZWN0ZWQgamF2YS51dGlsLkNvbGxlY3Rpb24gZ2V0V2FpdGluZ1RocmVhZHMoCi1qYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5Db25kaXRpb24pCi0KLXB1YmxpYyBpbnQgZ2V0V3JpdGVIb2xkQ291bnQoKQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNRdWV1ZWRUaHJlYWQoCi1qYXZhLmxhbmcuVGhyZWFkKQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNRdWV1ZWRUaHJlYWRzKCkKLQotcHVibGljIGJvb2xlYW4gaGFzV2FpdGVycygKLWphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkNvbmRpdGlvbikKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gaXNGYWlyKCkKLQotcHVibGljIGJvb2xlYW4gaXNXcml0ZUxvY2tlZCgpCi0KLXB1YmxpYyBib29sZWFuIGlzV3JpdGVMb2NrZWRCeUN1cnJlbnRUaHJlYWQoKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuTG9jayByZWFkTG9jaygpCi0KLXB1YmxpYyBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRSZWFkV3JpdGVMb2NrJFJlYWRMb2NrIHJlYWRMb2NrKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuTG9jayB3cml0ZUxvY2soKQotCi1wdWJsaWMgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50UmVhZFdyaXRlTG9jayRXcml0ZUxvY2sgd3JpdGVMb2NrKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLWZpbmFsIGNsYXNzIGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlVuc2FmZUFjY2VzcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIHN1bi5taXNjLlVuc2FmZSBUSEVfT05FCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL2phci9BdHRyaWJ1dGVzOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9TmFtZSApCi1wdWJsaWMgY2xhc3MgamF2YS51dGlsLmphci5BdHRyaWJ1dGVzJE5hbWUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS51dGlsLmphci5BdHRyaWJ1dGVzJE5hbWUgQ0xBU1NfUEFUSAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudXRpbC5qYXIuQXR0cmlidXRlcyROYW1lIENPTlRFTlRfVFlQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudXRpbC5qYXIuQXR0cmlidXRlcyROYW1lIEVYVEVOU0lPTl9JTlNUQUxMQVRJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXMkTmFtZSBFWFRFTlNJT05fTElTVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudXRpbC5qYXIuQXR0cmlidXRlcyROYW1lIEVYVEVOU0lPTl9OQU1FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS51dGlsLmphci5BdHRyaWJ1dGVzJE5hbWUgSU1QTEVNRU5UQVRJT05fVElUTEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXMkTmFtZSBJTVBMRU1FTlRBVElPTl9VUkwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXMkTmFtZSBJTVBMRU1FTlRBVElPTl9WRU5ET1IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXMkTmFtZSBJTVBMRU1FTlRBVElPTl9WRU5ET1JfSUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXMkTmFtZSBJTVBMRU1FTlRBVElPTl9WRVJTSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS51dGlsLmphci5BdHRyaWJ1dGVzJE5hbWUgTUFJTl9DTEFTUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudXRpbC5qYXIuQXR0cmlidXRlcyROYW1lIE1BTklGRVNUX1ZFUlNJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXMkTmFtZSBTRUFMRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXMkTmFtZSBTSUdOQVRVUkVfVkVSU0lPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudXRpbC5qYXIuQXR0cmlidXRlcyROYW1lIFNQRUNJRklDQVRJT05fVElUTEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXMkTmFtZSBTUEVDSUZJQ0FUSU9OX1ZFTkRPUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudXRpbC5qYXIuQXR0cmlidXRlcyROYW1lIFNQRUNJRklDQVRJT05fVkVSU0lPTgotCi1wcml2YXRlIGludCBoYXNoQ29kZQotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgbmFtZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9DbG9uZWFibGU7TGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9PYmplY3Q7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MamF2YS91dGlsL2phci9BdHRyaWJ1dGVzJE5hbWU7ICkKLXB1YmxpYyBjbGFzcyBqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5sYW5nLkNsb25lYWJsZSwgamF2YS51dGlsLk1hcAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcvT2JqZWN0Oz47ICkKLXByb3RlY3RlZCBqYXZhLnV0aWwuTWFwIG1hcAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLmphci5BdHRyaWJ1dGVzKQotCi1wdWJsaWMgdm9pZCBjbGVhcigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGNsb25lKCkKLQotcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYm9vbGVhbiBjb250YWluc1ZhbHVlKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvU2V0PExqYXZhL3V0aWwvTWFwJEVudHJ5PExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcvT2JqZWN0Oz47PjsgKQotcHVibGljIGphdmEudXRpbC5TZXQgZW50cnlTZXQoKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXQoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRWYWx1ZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFZhbHVlKAotamF2YS51dGlsLmphci5BdHRyaWJ1dGVzJE5hbWUpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvU2V0PExqYXZhL2xhbmcvT2JqZWN0Oz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuU2V0IGtleVNldCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHB1dCgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTWFwPCoqPjspViApCi1wdWJsaWMgdm9pZCBwdXRBbGwoCi1qYXZhLnV0aWwuTWFwKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBwdXRWYWx1ZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHJlbW92ZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBpbnQgc2l6ZSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0NvbGxlY3Rpb248TGphdmEvbGFuZy9PYmplY3Q7PjsgKQotcHVibGljIGphdmEudXRpbC5Db2xsZWN0aW9uIHZhbHVlcygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi0gY2xhc3MgamF2YS51dGlsLmphci5Jbml0TWFuaWZlc3QgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvdXRpbC9qYXIvQXR0cmlidXRlcyROYW1lOz47ICkKLXByaXZhdGUgZmluYWwgamF2YS51dGlsLk1hcCBhdHRyaWJ1dGVOYW1lcwotCi1wcml2YXRlIGJ5dGVbXSBidWZmZXIKLQotcHJpdmF0ZSBjaGFyW10gY2hhcmJ1ZgotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZW5jb2RpbmcKLQotcHJpdmF0ZSBmaW5hbCBieXRlW10gaW5idWYKLQotcHJpdmF0ZSBpbnQgaW5idWZDb3VudAotCi1wcml2YXRlIGludCBpbmJ1ZlBvcwotCi1wcml2YXRlIGZpbmFsIGJ5dGVbXSBtYWluQXR0cmlidXRlc0NodW5rCi0KLXByaXZhdGUgZmluYWwgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0Ci0KLXByaXZhdGUgYm9vbGVhbiB1c2luZ1VURjgKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2lvL0lucHV0U3RyZWFtO0xqYXZhL3V0aWwvamFyL0F0dHJpYnV0ZXM7TGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvdXRpbC9qYXIvQXR0cmlidXRlczs+O0xqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcvU3RyaW5nO1tCPjtMamF2YS9sYW5nL1N0cmluZzspViApCi0gdm9pZCA8aW5pdD4oCi1qYXZhLmlvLklucHV0U3RyZWFtCi1qYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXMKLWphdmEudXRpbC5NYXAKLWphdmEudXRpbC5NYXAKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCBhZGRBdHRyaWJ1dGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSUxqYXZhL3V0aWwvTGlzdDxMamF2YS9sYW5nL1N0cmluZzs+OylWICkKLXByaXZhdGUgdm9pZCBhZGRMaW5lKAotaW50Ci1qYXZhLnV0aWwuTGlzdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9pby9JbnB1dFN0cmVhbTtMamF2YS91dGlsL0xpc3Q8TGphdmEvbGFuZy9TdHJpbmc7PjspW0IgKQotcHJpdmF0ZSBieXRlW10gbmV4dENodW5rKAotamF2YS5pby5JbnB1dFN0cmVhbQotamF2YS51dGlsLkxpc3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvaW8vSW5wdXRTdHJlYW07TGphdmEvdXRpbC9MaXN0PExqYXZhL2xhbmcvU3RyaW5nOz47KVogKQotcHJpdmF0ZSBib29sZWFuIHJlYWRMaW5lcygKLWphdmEuaW8uSW5wdXRTdHJlYW0KLWphdmEudXRpbC5MaXN0KQotCi0gYnl0ZVtdIGdldE1haW5BdHRyaWJ1dGVzQ2h1bmsoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEudXRpbC56aXAuWmlwQ29uc3RhbnRzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDRU5BVFQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0VOQVRYCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENFTkNPTQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDRU5DUkMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0VORFNLCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENFTkVYVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDRU5GTEcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0VOSERSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENFTkhPVwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDRU5MRU4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0VOTkFNCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENFTk9GRgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgQ0VOU0lHCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENFTlNJWgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDRU5USU0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0VOVkVNCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENFTlZFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkRDT00KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5ESERSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVORE9GRgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgRU5EU0lHCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVORFNJWgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkRTVUIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5EVE9UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYVENSQwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFRIRFIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhUTEVOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBFWFRTSUcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhUU0laCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQ0NSQwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0NFWFQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9DRkxHCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQ0hEUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0NIT1cKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9DTEVOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQ05BTQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgTE9DU0lHCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQ1NJWgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0NUSU0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9DVkVSCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxqYXZhL3V0aWwvemlwL1ppcEVudHJ5JExpdHRsZUVuZGlhblJlYWRlcjsgKQotcHVibGljIGNsYXNzIGphdmEudXRpbC56aXAuWmlwRW50cnkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLnppcC5aaXBDb25zdGFudHMsIGphdmEubGFuZy5DbG9uZWFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGTEFURUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RPUkVECi0KLXN0YXRpYyBmaW5hbCBpbnQgVVNFU19EQVRBX0RFU0NSCi0KLSBqYXZhLmxhbmcuU3RyaW5nIGNvbW1lbnQKLQotIGludCBjb21tZW50TGVuCi0KLSBsb25nIGNvbXByZXNzZWRTaXplCi0KLSBpbnQgY29tcHJlc3Npb25NZXRob2QKLQotIGxvbmcgY3JjCi0KLSBieXRlW10gZXh0cmEKLQotIGludCBleHRyYUxlbgotCi1wcml2YXRlIGludCBtRGlza051bWJlclN0YXJ0Ci0KLXByaXZhdGUgbG9uZyBtRXh0ZXJuYWxBdHRycwotCi1wcml2YXRlIGludCBtR1BCaXRGbGFnCi0KLXByaXZhdGUgaW50IG1JbnRlcm5hbEF0dHJzCi0KLSBsb25nIG1Mb2NhbEhlYWRlclJlbE9mZnNldAotCi1wcml2YXRlIGludCBtVmVyc2lvbk1hZGVCeQotCi1wcml2YXRlIGludCBtVmVyc2lvblRvRXh0cmFjdAotCi0gaW50IG1vZERhdGUKLQotIGphdmEubGFuZy5TdHJpbmcgbmFtZQotCi0gaW50IG5hbWVMZW4KLQotIGxvbmcgc2l6ZQotCi0gaW50IHRpbWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuemlwLlppcEVudHJ5JExpdHRsZUVuZGlhblJlYWRlcgotamF2YS5pby5JbnB1dFN0cmVhbSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLnppcC5aaXBFbnRyeSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIG15UmVhZEZ1bGx5KAotamF2YS5pby5JbnB1dFN0cmVhbQotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1zdGF0aWMgbG9uZyByZWFkSW50TEUoCi1qYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXN0YXRpYyBpbnQgcmVhZFNob3J0TEUoCi1qYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXN0YXRpYyB2b2lkIHdyaXRlSW50TEUoCi1qYXZhLmlvLk91dHB1dFN0cmVhbQotbG9uZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotc3RhdGljIHZvaWQgd3JpdGVTaG9ydExFKAotamF2YS5pby5PdXRwdXRTdHJlYW0KLWludCkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgY2xvbmUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRDb21tZW50KCkKLQotcHVibGljIGxvbmcgZ2V0Q29tcHJlc3NlZFNpemUoKQotCi1wdWJsaWMgbG9uZyBnZXRDcmMoKQotCi1wdWJsaWMgYnl0ZVtdIGdldEV4dHJhKCkKLQotIGludCBnZXRHUEJpdEZsYWcoKQotCi0gbG9uZyBnZXRMb2NhbEhlYWRlclJlbE9mZnNldCgpCi0KLXB1YmxpYyBpbnQgZ2V0TWV0aG9kKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TmFtZSgpCi0KLXB1YmxpYyBsb25nIGdldFNpemUoKQotCi1wdWJsaWMgbG9uZyBnZXRUaW1lKCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLXB1YmxpYyBib29sZWFuIGlzRGlyZWN0b3J5KCkKLQotcHVibGljIHZvaWQgc2V0Q29tbWVudCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHNldENvbXByZXNzZWRTaXplKAotbG9uZykKLQotcHVibGljIHZvaWQgc2V0Q3JjKAotbG9uZykKLQotIHZvaWQgc2V0RGF0ZVRpbWUoCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgc2V0RXh0cmEoCi1ieXRlW10pCi0KLSB2b2lkIHNldEdQQml0RmxhZygKLWludCkKLQotIHZvaWQgc2V0TG9jYWxIZWFkZXJSZWxPZmZzZXQoCi1sb25nKQotCi1wdWJsaWMgdm9pZCBzZXRNZXRob2QoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldFNpemUoCi1sb25nKQotCi1wdWJsaWMgdm9pZCBzZXRUaW1lKAotbG9uZykKLQotIHZvaWQgc2V0VmVyc2lvblRvRXh0cmFjdCgKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi0gaW50IHdyaXRlQ0RFKAotamF2YS5pby5PdXRwdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLSBpbnQgd3JpdGVERCgKLWphdmEuaW8uT3V0cHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi0gaW50IHdyaXRlTEZIKAotamF2YS5pby5PdXRwdXRTdHJlYW0pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS51dGlsLmphci5KYXJFbnRyeSBleHRlbmRzIGphdmEudXRpbC56aXAuWmlwRW50cnkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXMgYXR0cmlidXRlcwotCi1wcml2YXRlIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUZhY3RvcnkgZmFjdG9yeQotCi1wcml2YXRlIGJvb2xlYW4gaXNGYWN0b3J5Q2hlY2tlZAotCi0gamF2YS51dGlsLmphci5KYXJGaWxlIHBhcmVudEphcgotCi0gamF2YS5zZWN1cml0eS5Db2RlU2lnbmVyW10gc2lnbmVycwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEudXRpbC5qYXIuSmFyRW50cnkpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEudXRpbC56aXAuWmlwRW50cnkpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvQXJyYXlMaXN0PExqYXZhL3NlY3VyaXR5L0NvZGVTaWduZXI7PjtMamF2YS91dGlsL0xpc3Q8TGphdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZTs+OylWICkKLXByaXZhdGUgdm9pZCBhZGRDb2RlU2lnbmVyKAotamF2YS51dGlsLkFycmF5TGlzdAotamF2YS51dGlsLkxpc3QpCi0KLXByaXZhdGUgamF2YS5zZWN1cml0eS5Db2RlU2lnbmVyW10gZ2V0Q29kZVNpZ25lcnMoCi1qYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEudXRpbC5qYXIuQXR0cmlidXRlcyBnZXRBdHRyaWJ1dGVzKCkKLQotcHVibGljIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZVtdIGdldENlcnRpZmljYXRlcygpCi0KLXB1YmxpYyBqYXZhLnNlY3VyaXR5LkNvZGVTaWduZXJbXSBnZXRDb2RlU2lnbmVycygpCi0KLSB2b2lkIHNldEF0dHJpYnV0ZXMoCi1qYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXMpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS51dGlsLnppcC5aaXBFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmlvLklPRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS51dGlsLmphci5KYXJFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLnV0aWwuemlwLlppcEV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS91dGlsL0VudW1lcmF0aW9uPExqYXZhL3V0aWwvamFyL0phckVudHJ5Oz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1KYXJGaWxlRW51bWVyYXRvciApCi0gY2xhc3MgamF2YS51dGlsLmphci5KYXJGaWxlJDFKYXJGaWxlRW51bWVyYXRvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuRW51bWVyYXRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGphdmEudXRpbC5qYXIuSmFyRmlsZSBqZgotCi1maW5hbCBqYXZhLnV0aWwuamFyLkphckZpbGUgdGhpcyQwCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9FbnVtZXJhdGlvbjwrTGphdmEvdXRpbC96aXAvWmlwRW50cnk7PjsgKQotIGphdmEudXRpbC5FbnVtZXJhdGlvbiB6ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvRW51bWVyYXRpb248K0xqYXZhL3V0aWwvemlwL1ppcEVudHJ5Oz47TGphdmEvdXRpbC9qYXIvSmFyRmlsZTspViApCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuamFyLkphckZpbGUKLWphdmEudXRpbC5FbnVtZXJhdGlvbgotamF2YS51dGlsLmphci5KYXJGaWxlKQotCi1wdWJsaWMgYm9vbGVhbiBoYXNNb3JlRWxlbWVudHMoKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBuZXh0RWxlbWVudCgpCi0KLXB1YmxpYyBqYXZhLnV0aWwuamFyLkphckVudHJ5IG5leHRFbGVtZW50KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI0IG5hbWUgPUphckZpbGVJbnB1dFN0cmVhbSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL2phci9KYXJGaWxlOyApCi1maW5hbCBjbGFzcyBqYXZhLnV0aWwuamFyLkphckZpbGUkSmFyRmlsZUlucHV0U3RyZWFtIGV4dGVuZHMgamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGxvbmcgY291bnQKLQotcHJpdmF0ZSBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3QgZGlnZXN0Ci0KLXByaXZhdGUgamF2YS51dGlsLmphci5KYXJWZXJpZmllciRWZXJpZmllckVudHJ5IGVudHJ5Ci0KLXByaXZhdGUgamF2YS51dGlsLmphci5KYXJWZXJpZmllciB2ZXJpZmllcgotCi1wcml2YXRlIGphdmEudXRpbC56aXAuWmlwRW50cnkgemlwRW50cnkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLmlvLklucHV0U3RyZWFtCi1qYXZhLnV0aWwuemlwLlppcEVudHJ5Ci1qYXZhLnV0aWwuamFyLkphclZlcmlmaWVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoCi1ieXRlW10KLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgbG9uZyBza2lwKAotbG9uZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxqYXZhL3V0aWwvemlwL1ppcEZpbGUkUkFGU3RyZWFtOyApCi1wdWJsaWMgY2xhc3MgamF2YS51dGlsLnppcC5aaXBGaWxlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudXRpbC56aXAuWmlwQ29uc3RhbnRzCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QRU5fREVMRVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QRU5fUkVBRAotCi0gamF2YS5sYW5nLlN0cmluZyBmaWxlTmFtZQotCi0gamF2YS5pby5GaWxlIGZpbGVUb0RlbGV0ZU9uQ2xvc2UKLQotIGphdmEudXRpbC56aXAuWmlwRW50cnkkTGl0dGxlRW5kaWFuUmVhZGVyIGxlcgotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQXJyYXlMaXN0PExqYXZhL3V0aWwvemlwL1ppcEVudHJ5Oz47ICkKLXByaXZhdGUgamF2YS51dGlsLkFycmF5TGlzdCBtRW50cnlMaXN0Ci1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNoTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL3V0aWwvemlwL1ppcEVudHJ5Oz47ICkKLXByaXZhdGUgamF2YS51dGlsLkhhc2hNYXAgbUZhc3RMb29rdXAKLQotcHJpdmF0ZSBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGUgbVJhZgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvdXRpbC96aXAvWmlwRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmlvLkZpbGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uRmlsZQotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1zdGF0aWMgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlIGFjY2VzcyQwMDAoCi1qYXZhLnV0aWwuemlwLlppcEZpbGUpCi0KLXN0YXRpYyBqYXZhLnV0aWwuQXJyYXlMaXN0IGFjY2VzcyQxMDAoCi1qYXZhLnV0aWwuemlwLlppcEZpbGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCByZWFkQ2VudHJhbERpcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNsb3NlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvRW51bWVyYXRpb248K0xqYXZhL3V0aWwvemlwL1ppcEVudHJ5Oz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuRW51bWVyYXRpb24gZW50cmllcygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkKLQotcHVibGljIGphdmEudXRpbC56aXAuWmlwRW50cnkgZ2V0RW50cnkoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5pby5JbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgKLWphdmEudXRpbC56aXAuWmlwRW50cnkpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE5hbWUoKQotCi1wdWJsaWMgaW50IHNpemUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGphdmEvdXRpbC9qYXIvSmFyRmlsZSRKYXJGaWxlSW5wdXRTdHJlYW07ICkKLXB1YmxpYyBjbGFzcyBqYXZhLnV0aWwuamFyLkphckZpbGUgZXh0ZW5kcyBqYXZhLnV0aWwuemlwLlppcEZpbGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE1BTklGRVNUX05BTUUKLQotc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTUVUQV9ESVIKLQotcHJpdmF0ZSBib29sZWFuIGNsb3NlZAotCi1wcml2YXRlIGphdmEudXRpbC5qYXIuTWFuaWZlc3QgbWFuaWZlc3QKLQotcHJpdmF0ZSBqYXZhLnV0aWwuemlwLlppcEVudHJ5IG1hbmlmZXN0RW50cnkKLQotIGphdmEudXRpbC5qYXIuSmFyVmVyaWZpZXIgdmVyaWZpZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmlvLkZpbGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uRmlsZQotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5GaWxlCi1ib29sZWFuCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgYnl0ZVtdIGdldEFsbEJ5dGVzRnJvbVN0cmVhbUFuZENsb3NlKAotamF2YS5pby5JbnB1dFN0cmVhbSkKLQotcHJpdmF0ZSBqYXZhLnV0aWwuemlwLlppcEVudHJ5W10gZ2V0TWV0YUVudHJpZXNJbXBsKAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgcmVhZE1ldGFFbnRyaWVzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY2xvc2UoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9FbnVtZXJhdGlvbjxMamF2YS91dGlsL2phci9KYXJFbnRyeTs+OyApCi1wdWJsaWMgamF2YS51dGlsLkVudW1lcmF0aW9uIGVudHJpZXMoKQotCi1wdWJsaWMgamF2YS51dGlsLnppcC5aaXBFbnRyeSBnZXRFbnRyeSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmlvLklucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKAotamF2YS51dGlsLnppcC5aaXBFbnRyeSkKLQotcHVibGljIGphdmEudXRpbC5qYXIuSmFyRW50cnkgZ2V0SmFyRW50cnkoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS51dGlsLmphci5NYW5pZmVzdCBnZXRNYW5pZmVzdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS51dGlsLnppcC5JbmZsYXRlcklucHV0U3RyZWFtIGV4dGVuZHMgamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgaW50IEJVRl9TSVpFCi0KLXByb3RlY3RlZCBieXRlW10gYnVmCi0KLSBib29sZWFuIGNsb3NlZAotCi0gYm9vbGVhbiBlb2YKLQotcHJvdGVjdGVkIGphdmEudXRpbC56aXAuSW5mbGF0ZXIgaW5mCi0KLXByb3RlY3RlZCBpbnQgbGVuCi0KLSBpbnQgbmF0aXZlRW5kQnVmU2l6ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uSW5wdXRTdHJlYW0pCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uSW5wdXRTdHJlYW0KLWphdmEudXRpbC56aXAuSW5mbGF0ZXIpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uSW5wdXRTdHJlYW0KLWphdmEudXRpbC56aXAuSW5mbGF0ZXIKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCBhdmFpbGFibGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjbG9zZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIGZpbGwoKQotCi1wdWJsaWMgdm9pZCBtYXJrKAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBtYXJrU3VwcG9ydGVkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCByZWFkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCByZWFkKAotYnl0ZVtdCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcmVzZXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgbG9uZyBza2lwKAotbG9uZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLnV0aWwuemlwLlppcElucHV0U3RyZWFtIGV4dGVuZHMgamF2YS51dGlsLnppcC5JbmZsYXRlcklucHV0U3RyZWFtIGltcGxlbWVudHMgamF2YS51dGlsLnppcC5aaXBDb25zdGFudHMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIGludCBERUZMQVRFRAotCi1zdGF0aWMgZmluYWwgaW50IFNUT1JFRAotCi1zdGF0aWMgZmluYWwgaW50IFpJUERhdGFEZXNjcmlwdG9yRmxhZwotCi1zdGF0aWMgZmluYWwgaW50IFpJUExvY2FsSGVhZGVyVmVyc2lvbk5lZWRlZAotCi1wcml2YXRlIGNoYXJbXSBjaGFyQnVmCi0KLXByaXZhdGUgZmluYWwgamF2YS51dGlsLnppcC5DUkMzMiBjcmMKLQotIGphdmEudXRpbC56aXAuWmlwRW50cnkgY3VycmVudEVudHJ5Ci0KLXByaXZhdGUgYm9vbGVhbiBlbnRyaWVzRW5kCi0KLXByaXZhdGUgaW50IGVudHJ5SW4KLQotcHJpdmF0ZSBib29sZWFuIGhhc0RECi0KLXByaXZhdGUgZmluYWwgYnl0ZVtdIGhkckJ1ZgotCi1wcml2YXRlIGludCBpblJlYWQKLQotcHJpdmF0ZSBpbnQgbGFzdFJlYWQKLQotcHJpdmF0ZSBieXRlW10gbmFtZUJ1ZgotCi1wcml2YXRlIGJvb2xlYW4gemlwQ2xvc2VkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5JbnB1dFN0cmVhbSkKLQotcHJpdmF0ZSBsb25nIGdldExvbmcoCi1ieXRlW10KLWludCkKLQotcHJpdmF0ZSBpbnQgZ2V0U2hvcnQoCi1ieXRlW10KLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCBhdmFpbGFibGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjbG9zZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNsb3NlRW50cnkoKQotCi1wcm90ZWN0ZWQgamF2YS51dGlsLnppcC5aaXBFbnRyeSBjcmVhdGVaaXBFbnRyeSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnV0aWwuemlwLlppcEVudHJ5IGdldE5leHRFbnRyeSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcmVhZCgKLWJ5dGVbXQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBsb25nIHNraXAoCi1sb25nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEudXRpbC5qYXIuSmFySW5wdXRTdHJlYW0gZXh0ZW5kcyBqYXZhLnV0aWwuemlwLlppcElucHV0U3RyZWFtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYm9vbGVhbiBlb3MKLQotcHJpdmF0ZSBib29sZWFuIGlzTWV0YQotCi1wcml2YXRlIGphdmEudXRpbC5qYXIuSmFyRW50cnkgamFyRW50cnkKLQotcHJpdmF0ZSBqYXZhLnV0aWwuamFyLkphckVudHJ5IG1FbnRyeQotCi1wcml2YXRlIGphdmEudXRpbC5qYXIuTWFuaWZlc3QgbWFuaWZlc3QKLQotcHJpdmF0ZSBqYXZhLmlvLk91dHB1dFN0cmVhbSB2ZXJTdHJlYW0KLQotcHJpdmF0ZSBqYXZhLnV0aWwuamFyLkphclZlcmlmaWVyIHZlcmlmaWVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5JbnB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5JbnB1dFN0cmVhbQotYm9vbGVhbikKLQotcHJvdGVjdGVkIGphdmEudXRpbC56aXAuWmlwRW50cnkgY3JlYXRlWmlwRW50cnkoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS51dGlsLmphci5NYW5pZmVzdCBnZXRNYW5pZmVzdCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnV0aWwuemlwLlppcEVudHJ5IGdldE5leHRFbnRyeSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnV0aWwuamFyLkphckVudHJ5IGdldE5leHRKYXJFbnRyeSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcmVhZCgKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS51dGlsLnppcC5EZWZsYXRlck91dHB1dFN0cmVhbSBleHRlbmRzIGphdmEuaW8uRmlsdGVyT3V0cHV0U3RyZWFtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBmaW5hbCBpbnQgQlVGX1NJWkUKLQotcHJvdGVjdGVkIGJ5dGVbXSBidWYKLQotcHJvdGVjdGVkIGphdmEudXRpbC56aXAuRGVmbGF0ZXIgZGVmCi0KLSBib29sZWFuIGRvbmUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmlvLk91dHB1dFN0cmVhbSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5PdXRwdXRTdHJlYW0KLWphdmEudXRpbC56aXAuRGVmbGF0ZXIpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uT3V0cHV0U3RyZWFtCi1qYXZhLnV0aWwuemlwLkRlZmxhdGVyCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNsb3NlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgZGVmbGF0ZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGZpbmlzaCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHdyaXRlKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB3cml0ZSgKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS51dGlsLnppcC5aaXBPdXRwdXRTdHJlYW0gZXh0ZW5kcyBqYXZhLnV0aWwuemlwLkRlZmxhdGVyT3V0cHV0U3RyZWFtIGltcGxlbWVudHMgamF2YS51dGlsLnppcC5aaXBDb25zdGFudHMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGTEFURUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RPUkVECi0KLXN0YXRpYyBmaW5hbCBpbnQgWklQRGF0YURlc2NyaXB0b3JGbGFnCi0KLXN0YXRpYyBmaW5hbCBpbnQgWklQTG9jYWxIZWFkZXJWZXJzaW9uTmVlZGVkCi0KLXByaXZhdGUgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0gY0RpcgotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgY29tbWVudAotCi1wcml2YXRlIGludCBjb21wcmVzc0xldmVsCi0KLXByaXZhdGUgaW50IGNvbXByZXNzTWV0aG9kCi0KLXByaXZhdGUgZmluYWwgamF2YS51dGlsLnppcC5DUkMzMiBjcmMKLQotcHJpdmF0ZSBpbnQgY3VyT2Zmc2V0Ci0KLXByaXZhdGUgamF2YS51dGlsLnppcC5aaXBFbnRyeSBjdXJyZW50RW50cnkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL1ZlY3RvcjxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5WZWN0b3IgZW50cmllcwotCi1wcml2YXRlIGJ5dGVbXSBuYW1lQnl0ZXMKLQotcHJpdmF0ZSBpbnQgbmFtZUxlbmd0aAotCi1wcml2YXRlIGludCBvZmZzZXQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmlvLk91dHB1dFN0cmVhbSkKLQotc3RhdGljIGJ5dGVbXSB0b1VURjhCeXRlcygKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotc3RhdGljIGludCB1dGY4Q291bnQoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIGxvbmcgd3JpdGVMb25nKAotamF2YS5pby5PdXRwdXRTdHJlYW0KLWxvbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgaW50IHdyaXRlU2hvcnQoCi1qYXZhLmlvLk91dHB1dFN0cmVhbQotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjbG9zZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNsb3NlRW50cnkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBmaW5pc2goKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBwdXROZXh0RW50cnkoCi1qYXZhLnV0aWwuemlwLlppcEVudHJ5KQotCi1wdWJsaWMgdm9pZCBzZXRDb21tZW50KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0TGV2ZWwoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldE1ldGhvZCgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgd3JpdGUoCi1ieXRlW10KLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEudXRpbC5qYXIuSmFyT3V0cHV0U3RyZWFtIGV4dGVuZHMgamF2YS51dGlsLnppcC5aaXBPdXRwdXRTdHJlYW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLnV0aWwuamFyLk1hbmlmZXN0IG1hbmlmZXN0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5PdXRwdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uT3V0cHV0U3RyZWFtCi1qYXZhLnV0aWwuamFyLk1hbmlmZXN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBwdXROZXh0RW50cnkoCi1qYXZhLnV0aWwuemlwLlppcEVudHJ5KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvamFyL0phclZlcmlmaWVyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9VmVyaWZpZXJFbnRyeSApCi0gY2xhc3MgamF2YS51dGlsLmphci5KYXJWZXJpZmllciRWZXJpZmllckVudHJ5IGV4dGVuZHMgamF2YS5pby5PdXRwdXRTdHJlYW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZVtdIGNlcnRpZmljYXRlcwotCi0gamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0IGRpZ2VzdAotCi0gYnl0ZVtdIGhhc2gKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3QKLWJ5dGVbXQotamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlW10pCi0KLXB1YmxpYyB2b2lkIHdyaXRlKAotaW50KQotCi1wdWJsaWMgdm9pZCB3cml0ZSgKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MamF2YS91dGlsL2phci9KYXJWZXJpZmllciRWZXJpZmllckVudHJ5OyApCi0gY2xhc3MgamF2YS51dGlsLmphci5KYXJWZXJpZmllciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgbG9uZyBhdmVyYWdlVGltZQotCi1wcml2YXRlIHN0YXRpYyBsb25nIG1lYXN1cmVDb3VudAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaHRhYmxlPExqYXZhL2xhbmcvU3RyaW5nO1tMamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlOz47ICkKLXByaXZhdGUgZmluYWwgamF2YS51dGlsLkhhc2h0YWJsZSBjZXJ0aWZpY2F0ZXMKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGphck5hbWUKLQotIGJ5dGVbXSBtYWluQXR0cmlidXRlc0NodW5rCi0KLXByaXZhdGUgamF2YS51dGlsLmphci5NYW5pZmVzdCBtYW4KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0hhc2hNYXA8TGphdmEvbGFuZy9TdHJpbmc7W0I+OyApCi1wcml2YXRlIGphdmEudXRpbC5IYXNoTWFwIG1ldGFFbnRyaWVzCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNodGFibGU8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvdXRpbC9IYXNoTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL3V0aWwvamFyL0F0dHJpYnV0ZXM7Pjs+OyApCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5IYXNodGFibGUgc2lnbmF0dXJlcwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaHRhYmxlPExqYXZhL2xhbmcvU3RyaW5nO1tMamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlOz47ICkKLXByaXZhdGUgZmluYWwgamF2YS51dGlsLkhhc2h0YWJsZSB2ZXJpZmllZEVudHJpZXMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcvU3RyaW5nO1tMamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlOz47KUxqYXZhL3V0aWwvVmVjdG9yPExqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGU7PjsgKQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIGdldFNpZ25lckNlcnRpZmljYXRlcygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudXRpbC5NYXApCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgbG9nKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBib29sZWFuIHZlcmlmeSgKLWphdmEudXRpbC5qYXIuQXR0cmlidXRlcwotamF2YS5sYW5nLlN0cmluZwotYnl0ZVtdCi1ib29sZWFuCi1ib29sZWFuKQotCi1wcml2YXRlIHZvaWQgdmVyaWZ5Q2VydGlmaWNhdGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi0gdm9pZCBhZGRNZXRhRW50cnkoCi1qYXZhLmxhbmcuU3RyaW5nCi1ieXRlW10pCi0KLSBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVbXSBnZXRDZXJ0aWZpY2F0ZXMoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi0gamF2YS51dGlsLmphci5KYXJWZXJpZmllciRWZXJpZmllckVudHJ5IGluaXRFbnRyeSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLSBib29sZWFuIGlzU2lnbmVkSmFyKCkKLQotIGJvb2xlYW4gcmVhZENlcnRpZmljYXRlcygpCi0KLSB2b2lkIHJlbW92ZU1ldGFFbnRyaWVzKCkKLQotIHZvaWQgc2V0TWFuaWZlc3QoCi1qYXZhLnV0aWwuamFyLk1hbmlmZXN0KQotCi0gdm9pZCB2ZXJpZnlTaWduYXR1cmVzKAotamF2YS51dGlsLmphci5KYXJWZXJpZmllciRWZXJpZmllckVudHJ5Ci1qYXZhLnV0aWwuemlwLlppcEVudHJ5KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEudXRpbC5qYXIuTWFuaWZlc3QgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5sYW5nLkNsb25lYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTElORV9MRU5HVEhfTElNSVQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIExJTkVfU0VQQVJBVE9SCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEudXRpbC5qYXIuQXR0cmlidXRlcyROYW1lIE5BTUVfQVRUUklCVVRFCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNoTWFwPExqYXZhL2xhbmcvU3RyaW5nO1tCPjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuSGFzaE1hcCBjaHVua3MKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0hhc2hNYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvdXRpbC9qYXIvQXR0cmlidXRlczs+OyApCi1wcml2YXRlIGphdmEudXRpbC5IYXNoTWFwIGVudHJ5QXR0cmlidXRlcwotCi1wcml2YXRlIGphdmEudXRpbC5qYXIuQXR0cmlidXRlcyBtYWluQXR0cmlidXRlcwotCi1wcml2YXRlIGJ5dGVbXSBtYWluQXR0cmlidXRlc0NodW5rCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmlvLklucHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi0gdm9pZCA8aW5pdD4oCi1qYXZhLmlvLklucHV0U3RyZWFtCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuamFyLk1hbmlmZXN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1zdGF0aWMgdm9pZCB3cml0ZSgKLWphdmEudXRpbC5qYXIuTWFuaWZlc3QKLWphdmEuaW8uT3V0cHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlRW50cnkoCi1qYXZhLmlvLk91dHB1dFN0cmVhbQotamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0Ci1qYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXMkTmFtZQotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgY2xlYXIoKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBjbG9uZSgpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXMgZ2V0QXR0cmlidXRlcygKLWphdmEubGFuZy5TdHJpbmcpCi0KLSBieXRlW10gZ2V0Q2h1bmsoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvdXRpbC9qYXIvQXR0cmlidXRlczs+OyApCi1wdWJsaWMgamF2YS51dGlsLk1hcCBnZXRFbnRyaWVzKCkKLQotcHVibGljIGphdmEudXRpbC5qYXIuQXR0cmlidXRlcyBnZXRNYWluQXR0cmlidXRlcygpCi0KLSBieXRlW10gZ2V0TWFpbkF0dHJpYnV0ZXNDaHVuaygpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCByZWFkKAotamF2YS5pby5JbnB1dFN0cmVhbSkKLQotIHZvaWQgcmVtb3ZlQ2h1bmtzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgd3JpdGUoCi1qYXZhLmlvLk91dHB1dFN0cmVhbSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvc2VjdXJpdHkvUHJpdmlsZWdlZEFjdGlvbjxMamF2YS9sYW5nL09iamVjdDs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1maW5hbCBjbGFzcyBqYXZhLnV0aWwuamFyLlBhY2syMDAkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS9zZWN1cml0eS9Qcml2aWxlZ2VkQWN0aW9uPExqYXZhL2xhbmcvT2JqZWN0Oz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLWZpbmFsIGNsYXNzIGphdmEudXRpbC5qYXIuUGFjazIwMCQyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPVBhY2tlciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL2phci9QYWNrMjAwOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEudXRpbC5qYXIuUGFjazIwMCRQYWNrZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDTEFTU19BVFRSSUJVVEVfUEZYCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDT0RFX0FUVFJJQlVURV9QRlgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFRkxBVEVfSElOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRUZGT1JUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBFUlJPUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRkFMU0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEZJRUxEX0FUVFJJQlVURV9QRlgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEtFRVAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEtFRVBfRklMRV9PUkRFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTEFURVNUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBNRVRIT0RfQVRUUklCVVRFX1BGWAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTU9ESUZJQ0FUSU9OX1RJTUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBBU1MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBBU1NfRklMRV9QRlgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBST0dSRVNTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTRUdNRU5UX0xJTUlUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTVFJJUAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVFJVRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVU5LTk9XTl9BVFRSSUJVVEUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBwYWNrKAotamF2YS51dGlsLmphci5KYXJGaWxlCi1qYXZhLmlvLk91dHB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgcGFjaygKLWphdmEudXRpbC5qYXIuSmFySW5wdXRTdHJlYW0KLWphdmEuaW8uT3V0cHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9Tb3J0ZWRNYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHVibGljIGFic3RyYWN0IGphdmEudXRpbC5Tb3J0ZWRNYXAgcHJvcGVydGllcygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9qYXIvUGFjazIwMDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPVVucGFja2VyICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgamF2YS51dGlsLmphci5QYWNrMjAwJFVucGFja2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVGTEFURV9ISU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBGQUxTRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgS0VFUAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUFJPR1JFU1MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRSVUUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9Tb3J0ZWRNYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHVibGljIGFic3RyYWN0IGphdmEudXRpbC5Tb3J0ZWRNYXAgcHJvcGVydGllcygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHVucGFjaygKLWphdmEuaW8uRmlsZQotamF2YS51dGlsLmphci5KYXJPdXRwdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHVucGFjaygKLWphdmEuaW8uSW5wdXRTdHJlYW0KLWphdmEudXRpbC5qYXIuSmFyT3V0cHV0U3RyZWFtKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGphdmEvdXRpbC9qYXIvUGFjazIwMCRVbnBhY2tlcjtMamF2YS91dGlsL2phci9QYWNrMjAwJFBhY2tlcjsgKQotcHVibGljIGFic3RyYWN0IGNsYXNzIGphdmEudXRpbC5qYXIuUGFjazIwMCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTWVNURU1fUFJPUEVSVFlfUEFDS0VSCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU1lTVEVNX1BST1BFUlRZX1VOUEFDS0VSCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLmphci5QYWNrMjAwJFBhY2tlciBuZXdQYWNrZXIoKQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5qYXIuUGFjazIwMCRVbnBhY2tlciBuZXdVbnBhY2tlcigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgamF2YS51dGlsLmxvZ2dpbmcuSGFuZGxlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwgREVGQVVMVF9MRVZFTAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZW5jb2RpbmcKLQotcHJpdmF0ZSBqYXZhLnV0aWwubG9nZ2luZy5FcnJvck1hbmFnZXIgZXJyb3JNYW4KLQotcHJpdmF0ZSBqYXZhLnV0aWwubG9nZ2luZy5GaWx0ZXIgZmlsdGVyCi0KLXByaXZhdGUgamF2YS51dGlsLmxvZ2dpbmcuRm9ybWF0dGVyIGZvcm1hdHRlcgotCi1wcml2YXRlIGphdmEudXRpbC5sb2dnaW5nLkxldmVsIGxldmVsCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBwcmVmaXgKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9FeGNlcHRpb247ICkKLXByaXZhdGUgamF2YS5sYW5nLk9iamVjdCBnZXRDdXN0b21pemVJbnN0YW5jZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgamF2YS5sYW5nLk9iamVjdCBnZXREZWZhdWx0SW5zdGFuY2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBjbG9zZSgpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGZsdXNoKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RW5jb2RpbmcoKQotCi1wdWJsaWMgamF2YS51dGlsLmxvZ2dpbmcuRXJyb3JNYW5hZ2VyIGdldEVycm9yTWFuYWdlcigpCi0KLXB1YmxpYyBqYXZhLnV0aWwubG9nZ2luZy5GaWx0ZXIgZ2V0RmlsdGVyKCkKLQotcHVibGljIGphdmEudXRpbC5sb2dnaW5nLkZvcm1hdHRlciBnZXRGb3JtYXR0ZXIoKQotCi1wdWJsaWMgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwgZ2V0TGV2ZWwoKQotCi0gdm9pZCBpbml0UHJvcGVydGllcygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsgKQotIHZvaWQgaW50ZXJuYWxTZXRFbmNvZGluZygKLWphdmEubGFuZy5TdHJpbmcpCi0KLSB2b2lkIGludGVybmFsU2V0Rm9ybWF0dGVyKAotamF2YS51dGlsLmxvZ2dpbmcuRm9ybWF0dGVyKQotCi1wdWJsaWMgYm9vbGVhbiBpc0xvZ2dhYmxlKAotamF2YS51dGlsLmxvZ2dpbmcuTG9nUmVjb3JkKQotCi0gdm9pZCBwcmludEludmFsaWRQcm9wTWVzc2FnZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5FeGNlcHRpb24pCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHB1Ymxpc2goCi1qYXZhLnV0aWwubG9nZ2luZy5Mb2dSZWNvcmQpCi0KLXByb3RlY3RlZCB2b2lkIHJlcG9ydEVycm9yKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLkV4Y2VwdGlvbgotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvU2VjdXJpdHlFeGNlcHRpb247TGphdmEvaW8vVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0RW5jb2RpbmcoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRFcnJvck1hbmFnZXIoCi1qYXZhLnV0aWwubG9nZ2luZy5FcnJvck1hbmFnZXIpCi0KLXB1YmxpYyB2b2lkIHNldEZpbHRlcigKLWphdmEudXRpbC5sb2dnaW5nLkZpbHRlcikKLQotcHVibGljIHZvaWQgc2V0Rm9ybWF0dGVyKAotamF2YS51dGlsLmxvZ2dpbmcuRm9ybWF0dGVyKQotCi1wdWJsaWMgdm9pZCBzZXRMZXZlbCgKLWphdmEudXRpbC5sb2dnaW5nLkxldmVsKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEudXRpbC5sb2dnaW5nLlN0cmVhbUhhbmRsZXIgZXh0ZW5kcyBqYXZhLnV0aWwubG9nZ2luZy5IYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS5pby5PdXRwdXRTdHJlYW0gb3MKLQotcHJpdmF0ZSBqYXZhLmlvLldyaXRlciB3cml0ZXIKLQotcHJpdmF0ZSBib29sZWFuIHdyaXRlck5vdEluaXRpYWxpemVkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KAotamF2YS5pby5PdXRwdXRTdHJlYW0pCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uT3V0cHV0U3RyZWFtCi1qYXZhLnV0aWwubG9nZ2luZy5Gb3JtYXR0ZXIpCi0KLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgdm9pZCBpbml0aWFsaXplV3JpdHRlcigpCi0KLXByaXZhdGUgdm9pZCB3cml0ZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIGNsb3NlKCkKLQotIHZvaWQgY2xvc2UoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBmbHVzaCgpCi0KLSB2b2lkIGludGVybmFsU2V0T3V0cHV0U3RyZWFtKAotamF2YS5pby5PdXRwdXRTdHJlYW0pCi0KLXB1YmxpYyBib29sZWFuIGlzTG9nZ2FibGUoCi1qYXZhLnV0aWwubG9nZ2luZy5Mb2dSZWNvcmQpCi0KLXB1YmxpYyB2b2lkIHB1Ymxpc2goCi1qYXZhLnV0aWwubG9nZ2luZy5Mb2dSZWNvcmQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9TZWN1cml0eUV4Y2VwdGlvbjtMamF2YS9pby9VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRFbmNvZGluZygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByb3RlY3RlZCB2b2lkIHNldE91dHB1dFN0cmVhbSgKLWphdmEuaW8uT3V0cHV0U3RyZWFtKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEudXRpbC5sb2dnaW5nLkNvbnNvbGVIYW5kbGVyIGV4dGVuZHMgamF2YS51dGlsLmxvZ2dpbmcuU3RyZWFtSGFuZGxlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIGNsb3NlKCkKLQotcHVibGljIHZvaWQgcHVibGlzaCgKLWphdmEudXRpbC5sb2dnaW5nLkxvZ1JlY29yZCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLnV0aWwubG9nZ2luZy5FcnJvck1hbmFnZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMT1NFX0ZBSUxVUkUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZ1tdIEZBSUxVUkVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMVVNIX0ZBSUxVUkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0ZBSUxVUkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0VORVJJQ19GQUlMVVJFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QRU5fRkFJTFVSRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBXUklURV9GQUlMVVJFCi0KLXByaXZhdGUgYm9vbGVhbiBjYWxsZWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIGVycm9yKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLkV4Y2VwdGlvbgotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS9zZWN1cml0eS9Qcml2aWxlZ2VkQWN0aW9uPExqYXZhL2xhbmcvT2JqZWN0Oz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLSBjbGFzcyBqYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlciQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBqYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlcikKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9TWVhc3VyZU91dHB1dFN0cmVhbSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL2xvZ2dpbmcvRmlsZUhhbmRsZXI7ICkKLSBjbGFzcyBqYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlciRNZWFzdXJlT3V0cHV0U3RyZWFtIGV4dGVuZHMgamF2YS5pby5PdXRwdXRTdHJlYW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGxvbmcgbGVuZ3RoCi0KLSBqYXZhLmlvLk91dHB1dFN0cmVhbSB3cmFwcGVkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5PdXRwdXRTdHJlYW0pCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uT3V0cHV0U3RyZWFtCi1sb25nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjbG9zZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGZsdXNoKCkKLQotcHVibGljIGxvbmcgZ2V0TGVuZ3RoKCkKLQotcHVibGljIHZvaWQgc2V0TGVuZ3RoKAotbG9uZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgd3JpdGUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHdyaXRlKAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB3cml0ZSgKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1MamF2YS91dGlsL2xvZ2dpbmcvRmlsZUhhbmRsZXIkTWVhc3VyZU91dHB1dFN0cmVhbTsgKQotcHVibGljIGNsYXNzIGphdmEudXRpbC5sb2dnaW5nLkZpbGVIYW5kbGVyIGV4dGVuZHMgamF2YS51dGlsLmxvZ2dpbmcuU3RyZWFtSGFuZGxlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFRkFVTFRfQVBQRU5ECi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0NPVU5UCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0xJTUlUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVGQVVMVF9QQVRURVJOCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTENLX0VYVAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaHRhYmxlPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL25pby9jaGFubmVscy9GaWxlTG9jazs+OyApCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuSGFzaHRhYmxlIGFsbExvY2tzCi0KLXByaXZhdGUgYm9vbGVhbiBhcHBlbmQKLQotcHJpdmF0ZSBpbnQgY291bnQKLQotIGphdmEubGFuZy5TdHJpbmcgZmlsZU5hbWUKLQotcHJpdmF0ZSBqYXZhLmlvLkZpbGVbXSBmaWxlcwotCi1wcml2YXRlIGludCBsaW1pdAotCi0gamF2YS5uaW8uY2hhbm5lbHMuRmlsZUxvY2sgbG9jawotCi1wcml2YXRlIGphdmEudXRpbC5sb2dnaW5nLkxvZ01hbmFnZXIgbWFuYWdlcgotCi1wcml2YXRlIGphdmEudXRpbC5sb2dnaW5nLkZpbGVIYW5kbGVyJE1lYXN1cmVPdXRwdXRTdHJlYW0gb3V0cHV0Ci0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBwYXR0ZXJuCi0KLSBpbnQgdW5pcXVlSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotcHJpdmF0ZSBib29sZWFuIGdldEJvb2xlYW5Qcm9wZXJ0eSgKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4pCi0KLXByaXZhdGUgaW50IGdldEludFByb3BlcnR5KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nUHJvcGVydHkoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgaW5pdCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5Cb29sZWFuCi1qYXZhLmxhbmcuSW50ZWdlcgotamF2YS5sYW5nLkludGVnZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vRmlsZU5vdEZvdW5kRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgaW5pdE91dHB1dEZpbGVzKCkKLQotcHJpdmF0ZSB2b2lkIGluaXRQcm9wZXJ0aWVzKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLkJvb2xlYW4KLWphdmEubGFuZy5JbnRlZ2VyCi1qYXZhLmxhbmcuSW50ZWdlcikKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHBhcnNlRmlsZU5hbWUoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGNsb3NlKCkKLQotIHZvaWQgZmluZE5leHRHZW5lcmF0aW9uKCkKLQotcHVibGljIHZvaWQgcHVibGlzaCgKLWphdmEudXRpbC5sb2dnaW5nLkxvZ1JlY29yZCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgamF2YS51dGlsLmxvZ2dpbmcuRmlsdGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzTG9nZ2FibGUoCi1qYXZhLnV0aWwubG9nZ2luZy5Mb2dSZWNvcmQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgamF2YS51dGlsLmxvZ2dpbmcuRm9ybWF0dGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGZvcm1hdCgKLWphdmEudXRpbC5sb2dnaW5nLkxvZ1JlY29yZCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZm9ybWF0TWVzc2FnZSgKLWphdmEudXRpbC5sb2dnaW5nLkxvZ1JlY29yZCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SGVhZCgKLWphdmEudXRpbC5sb2dnaW5nLkhhbmRsZXIpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFRhaWwoCi1qYXZhLnV0aWwubG9nZ2luZy5IYW5kbGVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS9zZWN1cml0eS9Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uPExqYXZhL2xhbmcvQ2xhc3M8Kj47PjsgKQotIGNsYXNzIGphdmEudXRpbC5sb2dnaW5nLkhhbmRsZXIkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgamF2YS51dGlsLmxvZ2dpbmcuSGFuZGxlciB0aGlzJDAKLQotZmluYWwgamF2YS5sYW5nLlN0cmluZyB2YWwkY2xhc3NOYW1lCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLmxvZ2dpbmcuSGFuZGxlcgotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL2xhbmcvQ2xhc3M8Kj47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5DbGFzcyBydW4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEudXRpbC5sb2dnaW5nLkxldmVsIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwgQUxMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwgQ09ORklHCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwgRklORQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudXRpbC5sb2dnaW5nLkxldmVsIEZJTkVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwgRklORVNUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwgSU5GTwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudXRpbC5sb2dnaW5nLkxldmVsIE9GRgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudXRpbC5sb2dnaW5nLkxldmVsIFNFVkVSRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudXRpbC5sb2dnaW5nLkxldmVsIFdBUk5JTkcKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0xpc3Q8TGphdmEvdXRpbC9sb2dnaW5nL0xldmVsOz47ICkKLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEudXRpbC5MaXN0IGxldmVscwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIG5hbWUKLQotcHJpdmF0ZSB0cmFuc2llbnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlIHJiCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyByZXNvdXJjZUJ1bmRsZU5hbWUKLQotcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudXRpbC5sb2dnaW5nLkxldmVsIHBhcnNlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9sYW5nL0NsYXNzTm90Rm91bmRFeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCByZWFkT2JqZWN0KAotamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuT2JqZWN0IHJlYWRSZXNvbHZlKCkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TG9jYWxpemVkTmFtZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE5hbWUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRSZXNvdXJjZUJ1bmRsZU5hbWUoKQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLQotcHVibGljIGZpbmFsIGludCBpbnRWYWx1ZSgpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvc2VjdXJpdHkvUHJpdmlsZWdlZEFjdGlvbjxMamF2YS9sYW5nL09iamVjdDs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL2xvZ2dpbmcvTG9nTWFuYWdlcjsgKQotZmluYWwgY2xhc3MgamF2YS51dGlsLmxvZ2dpbmcuTG9nTWFuYWdlciQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotIGNsYXNzIGphdmEudXRpbC5sb2dnaW5nLkxvZ01hbmFnZXIkMiQxIGV4dGVuZHMgamF2YS5sYW5nLlRocmVhZAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dNYW5hZ2VyJDIgdGhpcyQxCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLmxvZ2dpbmcuTG9nTWFuYWdlciQyKQotCi1wdWJsaWMgdm9pZCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS9zZWN1cml0eS9Qcml2aWxlZ2VkQWN0aW9uPExqYXZhL2xhbmcvVm9pZDs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi0gY2xhc3MgamF2YS51dGlsLmxvZ2dpbmcuTG9nTWFuYWdlciQyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dNYW5hZ2VyIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEudXRpbC5sb2dnaW5nLkxvZ01hbmFnZXIpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IHJ1bigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuVm9pZCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS9zZWN1cml0eS9Qcml2aWxlZ2VkQWN0aW9uPExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLWZpbmFsIGNsYXNzIGphdmEudXRpbC5sb2dnaW5nLkxvZ01hbmFnZXIkMyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgamF2YS5sYW5nLlN0cmluZyB2YWwka2V5Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgcnVuKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLnV0aWwubG9nZ2luZy5Mb2dNYW5hZ2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTE9HR0lOR19NWEJFQU5fTkFNRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGxpbmVTZXBhcmF0b3IKLQotc3RhdGljIGphdmEudXRpbC5sb2dnaW5nLkxvZ01hbmFnZXIgbWFuYWdlcgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnaW5nUGVybWlzc2lvbiBwZXJtCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNodGFibGU8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvdXRpbC9sb2dnaW5nL0xvZ2dlcjs+OyApCi1wcml2YXRlIGphdmEudXRpbC5IYXNodGFibGUgbG9nZ2VycwotCi1wcml2YXRlIGphdmEudXRpbC5Qcm9wZXJ0aWVzIHByb3BzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIHZvaWQgYWRkVG9GYW1pbHlUcmVlKAotamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1zdGF0aWMgamF2YS5sYW5nLk9iamVjdCBnZXRJbnN0YW5jZUJ5Q2xhc3MoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5sb2dnaW5nLkxvZ01hbmFnZXIgZ2V0TG9nTWFuYWdlcigpCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFByaXZpbGVnZWRTeXN0ZW1Qcm9wZXJ0eSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN5c3RlbUxpbmVTZXBhcmF0b3IoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgcmVhZENvbmZpZ3VyYXRpb25JbXBsKAotamF2YS5pby5JbnB1dFN0cmVhbSkKLQotcHVibGljIGJvb2xlYW4gYWRkTG9nZ2VyKAotamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyKQotCi1wdWJsaWMgdm9pZCBjaGVja0FjY2VzcygpCi0KLXB1YmxpYyBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXIgZ2V0TG9nZ2VyKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvRW51bWVyYXRpb248TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHVibGljIGphdmEudXRpbC5FbnVtZXJhdGlvbiBnZXRMb2dnZXJOYW1lcygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFByb3BlcnR5KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcmVhZENvbmZpZ3VyYXRpb24oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCByZWFkQ29uZmlndXJhdGlvbigKLWphdmEuaW8uSW5wdXRTdHJlYW0pCi0KLXB1YmxpYyB2b2lkIHJlc2V0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLnV0aWwubG9nZ2luZy5Mb2dSZWNvcmQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BSk9SCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNSU5PUgotCi1wcml2YXRlIHN0YXRpYyBsb25nIGN1cnJlbnRTZXF1ZW5jZU51bWJlcgotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvVGhyZWFkTG9jYWw8TGphdmEvbGFuZy9JbnRlZ2VyOz47ICkKLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5UaHJlYWRMb2NhbCBjdXJyZW50VGhyZWFkSWQKLQotcHJpdmF0ZSBzdGF0aWMgaW50IGluaXRUaHJlYWRJZAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbCBsZXZlbAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbG9nZ2VyTmFtZQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbWVzc2FnZQotCi1wcml2YXRlIGxvbmcgbWlsbGlzCi0KLXByaXZhdGUgdHJhbnNpZW50IGphdmEubGFuZy5PYmplY3RbXSBwYXJhbWV0ZXJzCi0KLXByaXZhdGUgdHJhbnNpZW50IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVzb3VyY2VCdW5kbGVOYW1lCi0KLXByaXZhdGUgbG9uZyBzZXF1ZW5jZU51bWJlcgotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgc291cmNlQ2xhc3NOYW1lCi0KLXByaXZhdGUgdHJhbnNpZW50IGJvb2xlYW4gc291cmNlSW5pdGVkCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBzb3VyY2VNZXRob2ROYW1lCi0KLXByaXZhdGUgaW50IHRocmVhZElECi0KLXByaXZhdGUgamF2YS5sYW5nLlRocm93YWJsZSB0aHJvd24KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEudXRpbC5sb2dnaW5nLkxldmVsCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHZvaWQgaW5pdFNvdXJjZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgcmVhZE9iamVjdCgKLWphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCB3cml0ZU9iamVjdCgKLWphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtKQotCi1wdWJsaWMgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwgZ2V0TGV2ZWwoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRMb2dnZXJOYW1lKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TWVzc2FnZSgpCi0KLXB1YmxpYyBsb25nIGdldE1pbGxpcygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0W10gZ2V0UGFyYW1ldGVycygpCi0KLXB1YmxpYyBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRSZXNvdXJjZUJ1bmRsZU5hbWUoKQotCi1wdWJsaWMgbG9uZyBnZXRTZXF1ZW5jZU51bWJlcigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFNvdXJjZUNsYXNzTmFtZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFNvdXJjZU1ldGhvZE5hbWUoKQotCi1wdWJsaWMgaW50IGdldFRocmVhZElEKCkKLQotcHVibGljIGphdmEubGFuZy5UaHJvd2FibGUgZ2V0VGhyb3duKCkKLQotcHVibGljIHZvaWQgc2V0TGV2ZWwoCi1qYXZhLnV0aWwubG9nZ2luZy5MZXZlbCkKLQotcHVibGljIHZvaWQgc2V0TG9nZ2VyTmFtZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRNaWxsaXMoCi1sb25nKQotCi1wdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJzKAotamF2YS5sYW5nLk9iamVjdFtdKQotCi1wdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUJ1bmRsZSgKLWphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZSkKLQotcHVibGljIHZvaWQgc2V0UmVzb3VyY2VCdW5kbGVOYW1lKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0U2VxdWVuY2VOdW1iZXIoCi1sb25nKQotCi1wdWJsaWMgdm9pZCBzZXRTb3VyY2VDbGFzc05hbWUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRTb3VyY2VNZXRob2ROYW1lKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0VGhyZWFkSUQoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldFRocm93bigKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3NlY3VyaXR5L1ByaXZpbGVnZWRBY3Rpb248TGphdmEvbGFuZy9DbGFzc0xvYWRlcjs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1maW5hbCBjbGFzcyBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXIkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgamF2YS5sYW5nLkNsYXNzTG9hZGVyIHJ1bigpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3NlY3VyaXR5L1ByaXZpbGVnZWRBY3Rpb248TGphdmEvbGFuZy9DbGFzc0xvYWRlcjs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1maW5hbCBjbGFzcyBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXIkMiBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgamF2YS5sYW5nLkNsYXNzTG9hZGVyIHJ1bigpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3NlY3VyaXR5L1ByaXZpbGVnZWRBY3Rpb248W0xqYXZhL2xhbmcvQ2xhc3M8Kj47PjsgKQotZmluYWwgY2xhc3MgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyJDMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgcnVuKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVtMamF2YS9sYW5nL0NsYXNzPCo+OyApCi1wdWJsaWMgamF2YS5sYW5nLkNsYXNzW10gcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvc2VjdXJpdHkvUHJpdmlsZWdlZEFjdGlvbjxMamF2YS9sYW5nL0NsYXNzTG9hZGVyOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLWZpbmFsIGNsYXNzIGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlciQ0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBqYXZhLmxhbmcuQ2xhc3NbXSB2YWwkY2xhc3NlcwotCi1maW5hbCBpbnQgdmFsJGluZGV4Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLkNsYXNzW10KLWludCkKLQotcHVibGljIGphdmEubGFuZy5DbGFzc0xvYWRlciBydW4oKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1Qcml2YXRlU2VjdXJpdHlNYW5hZ2VyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvbG9nZ2luZy9Mb2dnZXI7ICkKLSBjbGFzcyBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXIkUHJpdmF0ZVNlY3VyaXR5TWFuYWdlciBleHRlbmRzIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpW0xqYXZhL2xhbmcvQ2xhc3M8Kj47ICkKLXB1YmxpYyBqYXZhLmxhbmcuQ2xhc3NbXSBwcml2YXRlR2V0Q2xhc3NDb250ZXh0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxqYXZhL3V0aWwvbG9nZ2luZy9Mb2dnZXIkUHJpdmF0ZVNlY3VyaXR5TWFuYWdlcjsgKQotcHVibGljIGNsYXNzIGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXIgZ2xvYmFsCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9MaXN0PExqYXZhL3V0aWwvbG9nZ2luZy9Mb2dnZXI7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdCBjaGlsZHMKLQotcHJpdmF0ZSBqYXZhLnV0aWwubG9nZ2luZy5GaWx0ZXIgZmlsdGVyCi0KLXByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBoYW5kbGVySW5pdGVkCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9MaXN0PExqYXZhL3V0aWwvbG9nZ2luZy9IYW5kbGVyOz47ICkKLXByaXZhdGUgamF2YS51dGlsLkxpc3QgaGFuZGxlcnMKLQotcHJpdmF0ZSBib29sZWFuIGlzTmFtZWQKLQotcHJpdmF0ZSB2b2xhdGlsZSBpbnQgbGV2ZWxJbnRWYWwKLQotcHJpdmF0ZSB2b2xhdGlsZSBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbCBsZXZlbE9ialZhbAotCi1wcml2YXRlIGphdmEudXRpbC5sb2dnaW5nLkxvZ01hbmFnZXIgbWFuYWdlcgotCi1wcml2YXRlIHZvbGF0aWxlIGphdmEubGFuZy5TdHJpbmcgbmFtZQotCi1wcml2YXRlIGJvb2xlYW4gbm90aWZ5UGFyZW50SGFuZGxlcnMKLQotcHJpdmF0ZSBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXIgcGFyZW50Ci0KLXByaXZhdGUgamF2YS51dGlsLlJlc291cmNlQnVuZGxlIHJlc0J1bmRsZQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVzQnVuZGxlTmFtZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSB2b2lkIGZvcmNlQ2hpbGRzVG9Jbmhlcml0KCkKLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXIgZ2V0QW5vbnltb3VzTG9nZ2VyKCkKLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXIgZ2V0QW5vbnltb3VzTG9nZ2VyKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXIgZ2V0TG9nZ2VyKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXIgZ2V0TG9nZ2VyKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyIGdldExvZ2dlcldpdGhSZXMoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuKQotCi1wcml2YXRlIHZvaWQgaW5pdEhhbmRsZXIoKQotCi1wcml2YXRlIGJvb2xlYW4gaW50ZXJuYWxJc0xvZ2dhYmxlKAotamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwpCi0KLXN0YXRpYyBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUgbG9hZFJlc291cmNlQnVuZGxlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSB2b2lkIHNldExldmVsSW1wbCgKLWphdmEudXRpbC5sb2dnaW5nLkxldmVsKQotCi1wcml2YXRlIHZvaWQgc2V0UmVzb3VyY2VCdW5kbGUoCi1qYXZhLnV0aWwubG9nZ2luZy5Mb2dSZWNvcmQpCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgdXBkYXRlUmVzb3VyY2VCdW5kbGUoCi1qYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXIKLWphdmEubGFuZy5TdHJpbmcpCi0KLWZpbmFsIHZvaWQgYWRkQ2hpbGQoCi1qYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXIpCi0KLXB1YmxpYyB2b2lkIGFkZEhhbmRsZXIoCi1qYXZhLnV0aWwubG9nZ2luZy5IYW5kbGVyKQotCi1wdWJsaWMgdm9pZCBjb25maWcoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBlbnRlcmluZygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIGVudGVyaW5nKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHZvaWQgZW50ZXJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0W10pCi0KLXB1YmxpYyB2b2lkIGV4aXRpbmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBleGl0aW5nKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHZvaWQgZmluZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIGZpbmVyKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgZmluZXN0KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEudXRpbC5sb2dnaW5nLkZpbHRlciBnZXRGaWx0ZXIoKQotCi1wdWJsaWMgamF2YS51dGlsLmxvZ2dpbmcuSGFuZGxlcltdIGdldEhhbmRsZXJzKCkKLQotcHVibGljIGphdmEudXRpbC5sb2dnaW5nLkxldmVsIGdldExldmVsKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TmFtZSgpCi0KLXB1YmxpYyBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXIgZ2V0UGFyZW50KCkKLQotcHVibGljIGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFJlc291cmNlQnVuZGxlTmFtZSgpCi0KLXB1YmxpYyBib29sZWFuIGdldFVzZVBhcmVudEhhbmRsZXJzKCkKLQotcHVibGljIHZvaWQgaW5mbygKLWphdmEubGFuZy5TdHJpbmcpCi0KLSB2b2lkIGludGVybmFsU2V0UGFyZW50KAotamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyKQotCi1wdWJsaWMgYm9vbGVhbiBpc0xvZ2dhYmxlKAotamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwpCi0KLXB1YmxpYyB2b2lkIGxvZygKLWphdmEudXRpbC5sb2dnaW5nLkxldmVsCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBsb2coCi1qYXZhLnV0aWwubG9nZ2luZy5MZXZlbAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHZvaWQgbG9nKAotamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLXB1YmxpYyB2b2lkIGxvZygKLWphdmEudXRpbC5sb2dnaW5nLkxldmVsCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0W10pCi0KLXB1YmxpYyB2b2lkIGxvZygKLWphdmEudXRpbC5sb2dnaW5nLkxvZ1JlY29yZCkKLQotcHVibGljIHZvaWQgbG9ncCgKLWphdmEudXRpbC5sb2dnaW5nLkxldmVsCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBsb2dwKAotamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2lkIGxvZ3AoCi1qYXZhLnV0aWwubG9nZ2luZy5MZXZlbAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlRocm93YWJsZSkKLQotcHVibGljIHZvaWQgbG9ncCgKLWphdmEudXRpbC5sb2dnaW5nLkxldmVsCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0W10pCi0KLXB1YmxpYyB2b2lkIGxvZ3JiKAotamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIGxvZ3JiKAotamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2lkIGxvZ3JiKAotamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLXB1YmxpYyB2b2lkIGxvZ3JiKAotamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3RbXSkKLQotZmluYWwgdm9pZCByZW1vdmVDaGlsZCgKLWphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcikKLQotcHVibGljIHZvaWQgcmVtb3ZlSGFuZGxlcigKLWphdmEudXRpbC5sb2dnaW5nLkhhbmRsZXIpCi0KLSB2b2lkIHJlc2V0KCkKLQotcHVibGljIHZvaWQgc2V0RmlsdGVyKAotamF2YS51dGlsLmxvZ2dpbmcuRmlsdGVyKQotCi1wdWJsaWMgdm9pZCBzZXRMZXZlbCgKLWphdmEudXRpbC5sb2dnaW5nLkxldmVsKQotCi0gdm9pZCBzZXRNYW5hZ2VyKAotamF2YS51dGlsLmxvZ2dpbmcuTG9nTWFuYWdlcikKLQotcHVibGljIHZvaWQgc2V0UGFyZW50KAotamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyKQotCi1wdWJsaWMgdm9pZCBzZXRVc2VQYXJlbnRIYW5kbGVycygKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldmVyZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHRocm93aW5nKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlRocm93YWJsZSkKLQotcHVibGljIHZvaWQgd2FybmluZygKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEudXRpbC5sb2dnaW5nLkxvZ2dpbmdNWEJlYW4gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0TG9nZ2VyTGV2ZWwoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9MaXN0PExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnV0aWwuTGlzdCBnZXRMb2dnZXJOYW1lcygpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldFBhcmVudExvZ2dlck5hbWUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRMb2dnZXJMZXZlbCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2luZ1Blcm1pc3Npb24gZXh0ZW5kcyBqYXZhLnNlY3VyaXR5LkJhc2ljUGVybWlzc2lvbiBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuR3VhcmQsIGphdmEuaW8uU2VyaWFsaXphYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3NlY3VyaXR5L1ByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb248TGphdmEvbGFuZy9DbGFzczwqPjs+OyApCi0gY2xhc3MgamF2YS51dGlsLmxvZ2dpbmcuTWVtb3J5SGFuZGxlciQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBqYXZhLnV0aWwubG9nZ2luZy5NZW1vcnlIYW5kbGVyIHRoaXMkMAotCi1maW5hbCBqYXZhLmxhbmcuU3RyaW5nIHZhbCR0YXJnZXROYW1lCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLmxvZ2dpbmcuTWVtb3J5SGFuZGxlcgotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL2xhbmcvQ2xhc3M8Kj47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5DbGFzcyBydW4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEudXRpbC5sb2dnaW5nLk1lbW9yeUhhbmRsZXIgZXh0ZW5kcyBqYXZhLnV0aWwubG9nZ2luZy5IYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1NJWkUKLQotcHJpdmF0ZSBqYXZhLnV0aWwubG9nZ2luZy5Mb2dSZWNvcmRbXSBidWZmZXIKLQotcHJpdmF0ZSBpbnQgY3Vyc29yCi0KLXByaXZhdGUgZmluYWwgamF2YS51dGlsLmxvZ2dpbmcuTG9nTWFuYWdlciBtYW5hZ2VyCi0KLXByaXZhdGUgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwgcHVzaAotCi1wcml2YXRlIGludCBzaXplCi0KLXByaXZhdGUgamF2YS51dGlsLmxvZ2dpbmcuSGFuZGxlciB0YXJnZXQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwubG9nZ2luZy5IYW5kbGVyCi1pbnQKLWphdmEudXRpbC5sb2dnaW5nLkxldmVsKQotCi1wdWJsaWMgdm9pZCBjbG9zZSgpCi0KLXB1YmxpYyB2b2lkIGZsdXNoKCkKLQotcHVibGljIGphdmEudXRpbC5sb2dnaW5nLkxldmVsIGdldFB1c2hMZXZlbCgpCi0KLXB1YmxpYyBib29sZWFuIGlzTG9nZ2FibGUoCi1qYXZhLnV0aWwubG9nZ2luZy5Mb2dSZWNvcmQpCi0KLXB1YmxpYyB2b2lkIHB1Ymxpc2goCi1qYXZhLnV0aWwubG9nZ2luZy5Mb2dSZWNvcmQpCi0KLXB1YmxpYyB2b2lkIHB1c2goKQotCi1wdWJsaWMgdm9pZCBzZXRQdXNoTGV2ZWwoCi1qYXZhLnV0aWwubG9nZ2luZy5MZXZlbCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLnV0aWwubG9nZ2luZy5TaW1wbGVGb3JtYXR0ZXIgZXh0ZW5kcyBqYXZhLnV0aWwubG9nZ2luZy5Gb3JtYXR0ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBmb3JtYXQoCi1qYXZhLnV0aWwubG9nZ2luZy5Mb2dSZWNvcmQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS51dGlsLmxvZ2dpbmcuU29ja2V0SGFuZGxlciBleHRlbmRzIGphdmEudXRpbC5sb2dnaW5nLlN0cmVhbUhhbmRsZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERUZBVUxUX0ZPUk1BVFRFUgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERFRkFVTFRfTEVWRUwKLQotcHJpdmF0ZSBqYXZhLm5ldC5Tb2NrZXQgc29ja2V0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgaW5pdFNvY2tldCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIGNsb3NlKCkKLQotcHVibGljIHZvaWQgcHVibGlzaCgKLWphdmEudXRpbC5sb2dnaW5nLkxvZ1JlY29yZCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvc2VjdXJpdHkvUHJpdmlsZWdlZEFjdGlvbjxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1maW5hbCBjbGFzcyBqYXZhLnV0aWwubG9nZ2luZy5YTUxGb3JtYXR0ZXIkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgamF2YS5sYW5nLlN0cmluZyB2YWwka2V5Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgcnVuKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLnV0aWwubG9nZ2luZy5YTUxGb3JtYXR0ZXIgZXh0ZW5kcyBqYXZhLnV0aWwubG9nZ2luZy5Gb3JtYXR0ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBpbmRlbnQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBsaW5lU2VwZXJhdG9yCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIHZvaWQgZm9ybWF0TWVzc2FnZXMoCi1qYXZhLnV0aWwubG9nZ2luZy5Mb2dSZWNvcmQKLWphdmEubGFuZy5TdHJpbmdCdWlsZGVyKQotCi1wcml2YXRlIHZvaWQgZm9ybWF0VGhyb3dhYmxlKAotamF2YS51dGlsLmxvZ2dpbmcuTG9nUmVjb3JkCi1qYXZhLmxhbmcuU3RyaW5nQnVpbGRlcikKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRTeXN0ZW1Qcm9wZXJ0eSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGZvcm1hdCgKLWphdmEudXRpbC5sb2dnaW5nLkxvZ1JlY29yZCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SGVhZCgKLWphdmEudXRpbC5sb2dnaW5nLkhhbmRsZXIpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFRhaWwoCi1qYXZhLnV0aWwubG9nZ2luZy5IYW5kbGVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvcHJlZnMvQWJzdHJhY3RQcmVmZXJlbmNlczsgKQotZmluYWwgY2xhc3MgamF2YS51dGlsLnByZWZzLkFic3RyYWN0UHJlZmVyZW5jZXMkMSBleHRlbmRzIGphdmEubGFuZy5UaHJlYWQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvcHJlZnMvQWJzdHJhY3RQcmVmZXJlbmNlczsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1FdmVudERpc3BhdGNoZXIgKQotIGNsYXNzIGphdmEudXRpbC5wcmVmcy5BYnN0cmFjdFByZWZlcmVuY2VzJEV2ZW50RGlzcGF0Y2hlciBleHRlbmRzIGphdmEubGFuZy5UaHJlYWQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL3ByZWZzL05vZGVDaGFuZ2VFdmVudDtMamF2YS91dGlsL0xpc3Q8TGphdmEvdXRpbC9FdmVudExpc3RlbmVyOz47KVYgKQotcHJpdmF0ZSB2b2lkIGRpc3BhdGNoTm9kZUFkZCgKLWphdmEudXRpbC5wcmVmcy5Ob2RlQ2hhbmdlRXZlbnQKLWphdmEudXRpbC5MaXN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL3ByZWZzL05vZGVDaGFuZ2VFdmVudDtMamF2YS91dGlsL0xpc3Q8TGphdmEvdXRpbC9FdmVudExpc3RlbmVyOz47KVYgKQotcHJpdmF0ZSB2b2lkIGRpc3BhdGNoTm9kZVJlbW92ZSgKLWphdmEudXRpbC5wcmVmcy5Ob2RlQ2hhbmdlRXZlbnQKLWphdmEudXRpbC5MaXN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL3ByZWZzL1ByZWZlcmVuY2VDaGFuZ2VFdmVudDtMamF2YS91dGlsL0xpc3Q8TGphdmEvdXRpbC9FdmVudExpc3RlbmVyOz47KVYgKQotcHJpdmF0ZSB2b2lkIGRpc3BhdGNoUHJlZkNoYW5nZSgKLWphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlQ2hhbmdlRXZlbnQKLWphdmEudXRpbC5MaXN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSW50ZXJydXB0ZWRFeGNlcHRpb247ICkKLXByaXZhdGUgamF2YS51dGlsLkV2ZW50T2JqZWN0IGdldEV2ZW50T2JqZWN0KCkKLQotcHVibGljIHZvaWQgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL3ByZWZzL0Fic3RyYWN0UHJlZmVyZW5jZXM7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9TG9jayApCi0gY2xhc3MgamF2YS51dGlsLnByZWZzLkFic3RyYWN0UHJlZmVyZW5jZXMkTG9jayBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLnByZWZzLkFic3RyYWN0UHJlZmVyZW5jZXMkMSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLnV0aWwucHJlZnMuTm9kZUNoYW5nZUV2ZW50IGV4dGVuZHMgamF2YS51dGlsLkV2ZW50T2JqZWN0IGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0KLXByaXZhdGUgZmluYWwgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzIGNoaWxkCi0KLXByaXZhdGUgZmluYWwgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzIHBhcmVudAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlcwotamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL2xhbmcvQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoCi1qYXZhLmlvLk9iamVjdElucHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoCi1qYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSkKLQotcHVibGljIGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlcyBnZXRDaGlsZCgpCi0KLXB1YmxpYyBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZXMgZ2V0UGFyZW50KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPU5vZGVBZGRFdmVudCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL3ByZWZzL0Fic3RyYWN0UHJlZmVyZW5jZXM7ICkKLSBjbGFzcyBqYXZhLnV0aWwucHJlZnMuQWJzdHJhY3RQcmVmZXJlbmNlcyROb2RlQWRkRXZlbnQgZXh0ZW5kcyBqYXZhLnV0aWwucHJlZnMuTm9kZUNoYW5nZUV2ZW50Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlcwotamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9Tm9kZVJlbW92ZUV2ZW50ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvcHJlZnMvQWJzdHJhY3RQcmVmZXJlbmNlczsgKQotIGNsYXNzIGphdmEudXRpbC5wcmVmcy5BYnN0cmFjdFByZWZlcmVuY2VzJE5vZGVSZW1vdmVFdmVudCBleHRlbmRzIGphdmEudXRpbC5wcmVmcy5Ob2RlQ2hhbmdlRXZlbnQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzCi1qYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZXMpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENPTkZJR1VSQVRJT05fRklMRV9DT01NRU5UCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ09ORklHVVJBVElPTl9GSUxFX0VOQ09ESU5HCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRkFDVE9SWV9DT05GSUdVUkFUSU9OX0ZJTEVfTkFNRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfS0VZX0xFTkdUSAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfTkFNRV9MRU5HVEgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1ZBTFVFX0xFTkdUSAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gUFJFRlNfUEVSTQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZXNGYWN0b3J5IGZhY3RvcnkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tTZWN1cml0eSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvQ2xhc3M8Kj47KUxqYXZhL2xhbmcvU3RyaW5nOyApCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE5vZGVOYW1lKAotamF2YS5sYW5nLkNsYXNzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3V0aWwvcHJlZnMvSW52YWxpZFByZWZlcmVuY2VzRm9ybWF0RXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIHZvaWQgaW1wb3J0UHJlZmVyZW5jZXMoCi1qYXZhLmlvLklucHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL0NsYXNzPCo+OylMamF2YS91dGlsL3ByZWZzL1ByZWZlcmVuY2VzOyApCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlcyBzeXN0ZW1Ob2RlRm9yUGFja2FnZSgKLWphdmEubGFuZy5DbGFzcykKLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZXMgc3lzdGVtUm9vdCgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvQ2xhc3M8Kj47KUxqYXZhL3V0aWwvcHJlZnMvUHJlZmVyZW5jZXM7ICkKLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzIHVzZXJOb2RlRm9yUGFja2FnZSgKLWphdmEubGFuZy5DbGFzcykKLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZXMgdXNlclJvb3QoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBhYnNvbHV0ZVBhdGgoKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBhZGROb2RlQ2hhbmdlTGlzdGVuZXIoCi1qYXZhLnV0aWwucHJlZnMuTm9kZUNoYW5nZUxpc3RlbmVyKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBhZGRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIoCi1qYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3V0aWwvcHJlZnMvQmFja2luZ1N0b3JlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZ1tdIGNoaWxkcmVuTmFtZXMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3V0aWwvcHJlZnMvQmFja2luZ1N0b3JlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBjbGVhcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvdXRpbC9wcmVmcy9CYWNraW5nU3RvcmVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGV4cG9ydE5vZGUoCi1qYXZhLmlvLk91dHB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS91dGlsL3ByZWZzL0JhY2tpbmdTdG9yZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgZXhwb3J0U3VidHJlZSgKLWphdmEuaW8uT3V0cHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3V0aWwvcHJlZnMvQmFja2luZ1N0b3JlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBmbHVzaCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGdldEJvb2xlYW4oCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuKQotCi1wdWJsaWMgYWJzdHJhY3QgYnl0ZVtdIGdldEJ5dGVBcnJheSgKLWphdmEubGFuZy5TdHJpbmcKLWJ5dGVbXSkKLQotcHVibGljIGFic3RyYWN0IGRvdWJsZSBnZXREb3VibGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1kb3VibGUpCi0KLXB1YmxpYyBhYnN0cmFjdCBmbG9hdCBnZXRGbG9hdCgKLWphdmEubGFuZy5TdHJpbmcKLWZsb2F0KQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldEludCgKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIGFic3RyYWN0IGxvbmcgZ2V0TG9uZygKLWphdmEubGFuZy5TdHJpbmcKLWxvbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzVXNlck5vZGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3V0aWwvcHJlZnMvQmFja2luZ1N0b3JlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZ1tdIGtleXMoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBuYW1lKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlcyBub2RlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS91dGlsL3ByZWZzL0JhY2tpbmdTdG9yZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gbm9kZUV4aXN0cygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZXMgcGFyZW50KCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgcHV0KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IHZvaWQgcHV0Qm9vbGVhbigKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4pCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHB1dEJ5dGVBcnJheSgKLWphdmEubGFuZy5TdHJpbmcKLWJ5dGVbXSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgcHV0RG91YmxlKAotamF2YS5sYW5nLlN0cmluZwotZG91YmxlKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBwdXRGbG9hdCgKLWphdmEubGFuZy5TdHJpbmcKLWZsb2F0KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBwdXRJbnQoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHB1dExvbmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1sb25nKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCByZW1vdmUoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3V0aWwvcHJlZnMvQmFja2luZ1N0b3JlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCByZW1vdmVOb2RlKCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgcmVtb3ZlTm9kZUNoYW5nZUxpc3RlbmVyKAotamF2YS51dGlsLnByZWZzLk5vZGVDaGFuZ2VMaXN0ZW5lcikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgcmVtb3ZlUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKAotamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS91dGlsL3ByZWZzL0JhY2tpbmdTdG9yZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc3luYygpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxqYXZhL3V0aWwvcHJlZnMvQWJzdHJhY3RQcmVmZXJlbmNlcyROb2RlUmVtb3ZlRXZlbnQ7TGphdmEvdXRpbC9wcmVmcy9BYnN0cmFjdFByZWZlcmVuY2VzJE5vZGVBZGRFdmVudDtMamF2YS91dGlsL3ByZWZzL0Fic3RyYWN0UHJlZmVyZW5jZXMkRXZlbnREaXNwYXRjaGVyO0xqYXZhL3V0aWwvcHJlZnMvQWJzdHJhY3RQcmVmZXJlbmNlcyRMb2NrOyApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgamF2YS51dGlsLnByZWZzLkFic3RyYWN0UHJlZmVyZW5jZXMgZXh0ZW5kcyBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZXMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS51dGlsLnByZWZzLkFic3RyYWN0UHJlZmVyZW5jZXMkRXZlbnREaXNwYXRjaGVyIGRpc3BhdGNoZXIKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0xpc3Q8TGphdmEvdXRpbC9FdmVudE9iamVjdDs+OyApCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuTGlzdCBldmVudHMKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS91dGlsL3ByZWZzL0Fic3RyYWN0UHJlZmVyZW5jZXM7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuTWFwIGNhY2hlZE5vZGUKLQotcHJpdmF0ZSBib29sZWFuIGlzUmVtb3ZlZAotCi1wcm90ZWN0ZWQgZmluYWwgamF2YS5sYW5nLk9iamVjdCBsb2NrCi0KLXByb3RlY3RlZCBib29sZWFuIG5ld05vZGUKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0xpc3Q8TGphdmEvdXRpbC9FdmVudExpc3RlbmVyOz47ICkKLXByaXZhdGUgamF2YS51dGlsLkxpc3Qgbm9kZUNoYW5nZUxpc3RlbmVycwotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbm9kZU5hbWUKLQotcHJpdmF0ZSBqYXZhLnV0aWwucHJlZnMuQWJzdHJhY3RQcmVmZXJlbmNlcyBwYXJlbnRQcmVmCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9MaXN0PExqYXZhL3V0aWwvRXZlbnRMaXN0ZW5lcjs+OyApCi1wcml2YXRlIGphdmEudXRpbC5MaXN0IHByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcnMKLQotcHJpdmF0ZSBqYXZhLnV0aWwucHJlZnMuQWJzdHJhY3RQcmVmZXJlbmNlcyByb290Ci0KLSBib29sZWFuIHVzZXJOb2RlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwucHJlZnMuQWJzdHJhY3RQcmVmZXJlbmNlcwotamF2YS5sYW5nLlN0cmluZykKLQotc3RhdGljIGphdmEudXRpbC5MaXN0IGFjY2VzcyQxMDAoCi1qYXZhLnV0aWwucHJlZnMuQWJzdHJhY3RQcmVmZXJlbmNlcykKLQotc3RhdGljIGphdmEudXRpbC5MaXN0IGFjY2VzcyQyMDAoCi1qYXZhLnV0aWwucHJlZnMuQWJzdHJhY3RQcmVmZXJlbmNlcykKLQotc3RhdGljIGphdmEudXRpbC5MaXN0IGFjY2VzcyQzMDAoKQotCi1wcml2YXRlIHZvaWQgY2hlY2tTdGF0ZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvdXRpbC9wcmVmcy9CYWNraW5nU3RvcmVFeGNlcHRpb247ICkKLXByaXZhdGUgamF2YS51dGlsLnByZWZzLkFic3RyYWN0UHJlZmVyZW5jZXMgZ2V0Tm9kZUZyb21CYWNrZW5kKAotYm9vbGVhbgotamF2YS51dGlsLnByZWZzLkFic3RyYWN0UHJlZmVyZW5jZXMKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvdXRpbC9wcmVmcy9CYWNraW5nU3RvcmVFeGNlcHRpb247ICkKLXByaXZhdGUgamF2YS51dGlsLnByZWZzLkFic3RyYWN0UHJlZmVyZW5jZXMgbm9kZUltcGwoCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuKQotCi1wcml2YXRlIHZvaWQgbm90aWZ5Q2hpbGRBZGRlZCgKLWphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlcykKLQotcHJpdmF0ZSB2b2lkIG5vdGlmeUNoaWxkUmVtb3ZlZCgKLWphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlcykKLQotcHJpdmF0ZSB2b2lkIG5vdGlmeVByZWZlcmVuY2VDaGFuZ2UoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3V0aWwvcHJlZnMvQmFja2luZ1N0b3JlRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgcmVtb3ZlTm9kZUltcGwoKQotCi1wcml2YXRlIHZvaWQgdmFsaWRhdGVOYW1lKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgYWJzb2x1dGVQYXRoKCkKLQotcHVibGljIHZvaWQgYWRkTm9kZUNoYW5nZUxpc3RlbmVyKAotamF2YS51dGlsLnByZWZzLk5vZGVDaGFuZ2VMaXN0ZW5lcikKLQotcHVibGljIHZvaWQgYWRkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKAotamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcikKLQotcHJvdGVjdGVkIGZpbmFsIGphdmEudXRpbC5wcmVmcy5BYnN0cmFjdFByZWZlcmVuY2VzW10gY2FjaGVkQ2hpbGRyZW4oKQotCi1wcm90ZWN0ZWQgYWJzdHJhY3QgamF2YS51dGlsLnByZWZzLkFic3RyYWN0UHJlZmVyZW5jZXMgY2hpbGRTcGkoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3V0aWwvcHJlZnMvQmFja2luZ1N0b3JlRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIGNoaWxkcmVuTmFtZXMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3V0aWwvcHJlZnMvQmFja2luZ1N0b3JlRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZ1tdIGNoaWxkcmVuTmFtZXNTcGkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3V0aWwvcHJlZnMvQmFja2luZ1N0b3JlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjbGVhcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvdXRpbC9wcmVmcy9CYWNraW5nU3RvcmVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGV4cG9ydE5vZGUoCi1qYXZhLmlvLk91dHB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS91dGlsL3ByZWZzL0JhY2tpbmdTdG9yZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgZXhwb3J0U3VidHJlZSgKLWphdmEuaW8uT3V0cHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3V0aWwvcHJlZnMvQmFja2luZ1N0b3JlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBmbHVzaCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvdXRpbC9wcmVmcy9CYWNraW5nU3RvcmVFeGNlcHRpb247ICkKLXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGZsdXNoU3BpKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhbigKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4pCi0KLXB1YmxpYyBieXRlW10gZ2V0Qnl0ZUFycmF5KAotamF2YS5sYW5nLlN0cmluZwotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3V0aWwvcHJlZnMvQmFja2luZ1N0b3JlRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgamF2YS51dGlsLnByZWZzLkFic3RyYWN0UHJlZmVyZW5jZXMgZ2V0Q2hpbGQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgZG91YmxlIGdldERvdWJsZSgKLWphdmEubGFuZy5TdHJpbmcKLWRvdWJsZSkKLQotcHVibGljIGZsb2F0IGdldEZsb2F0KAotamF2YS5sYW5nLlN0cmluZwotZmxvYXQpCi0KLXB1YmxpYyBpbnQgZ2V0SW50KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgbG9uZyBnZXRMb25nKAotamF2YS5sYW5nLlN0cmluZwotbG9uZykKLQotcHJvdGVjdGVkIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0U3BpKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJvdGVjdGVkIGJvb2xlYW4gaXNSZW1vdmVkKCkKLQotcHVibGljIGJvb2xlYW4gaXNVc2VyTm9kZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvdXRpbC9wcmVmcy9CYWNraW5nU3RvcmVFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10ga2V5cygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvdXRpbC9wcmVmcy9CYWNraW5nU3RvcmVFeGNlcHRpb247ICkKLXByb3RlY3RlZCBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nW10ga2V5c1NwaSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIG5hbWUoKQotCi1wdWJsaWMgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzIG5vZGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3V0aWwvcHJlZnMvQmFja2luZ1N0b3JlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBub2RlRXhpc3RzKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlcyBwYXJlbnQoKQotCi1wdWJsaWMgdm9pZCBwdXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBwdXRCb29sZWFuKAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotcHVibGljIHZvaWQgcHV0Qnl0ZUFycmF5KAotamF2YS5sYW5nLlN0cmluZwotYnl0ZVtdKQotCi1wdWJsaWMgdm9pZCBwdXREb3VibGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1kb3VibGUpCi0KLXB1YmxpYyB2b2lkIHB1dEZsb2F0KAotamF2YS5sYW5nLlN0cmluZwotZmxvYXQpCi0KLXB1YmxpYyB2b2lkIHB1dEludCgKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIHZvaWQgcHV0TG9uZygKLWphdmEubGFuZy5TdHJpbmcKLWxvbmcpCi0KLXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHB1dFNwaSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHJlbW92ZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvdXRpbC9wcmVmcy9CYWNraW5nU3RvcmVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHJlbW92ZU5vZGUoKQotCi1wdWJsaWMgdm9pZCByZW1vdmVOb2RlQ2hhbmdlTGlzdGVuZXIoCi1qYXZhLnV0aWwucHJlZnMuTm9kZUNoYW5nZUxpc3RlbmVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3V0aWwvcHJlZnMvQmFja2luZ1N0b3JlRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCByZW1vdmVOb2RlU3BpKCkKLQotcHVibGljIHZvaWQgcmVtb3ZlUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKAotamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcikKLQotcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcmVtb3ZlU3BpKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS91dGlsL3ByZWZzL0JhY2tpbmdTdG9yZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc3luYygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvdXRpbC9wcmVmcy9CYWNraW5nU3RvcmVFeGNlcHRpb247ICkKLXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHN5bmNTcGkoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS51dGlsLnByZWZzLkJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5FeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlRocm93YWJsZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzRmFjdG9yeSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzIHN5c3RlbVJvb3QoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzIHVzZXJSb290KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLSBjbGFzcyBqYXZhLnV0aWwucHJlZnMuRmlsZVByZWZlcmVuY2VzRmFjdG9yeUltcGwgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzRmFjdG9yeQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZXMgU1lTVEVNX1JPT1QKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzIFVTRVJfUk9PVAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlcyBzeXN0ZW1Sb290KCkKLQotcHVibGljIGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlcyB1c2VyUm9vdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC9wcmVmcy9GaWxlUHJlZmVyZW5jZXNJbXBsOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvc2VjdXJpdHkvUHJpdmlsZWdlZEFjdGlvbjxMamF2YS9sYW5nL1ZvaWQ7PjsgKQotZmluYWwgY2xhc3MgamF2YS51dGlsLnByZWZzLkZpbGVQcmVmZXJlbmNlc0ltcGwkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBydW4oKQotCi1wdWJsaWMgamF2YS5sYW5nLlZvaWQgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvc2VjdXJpdHkvUHJpdmlsZWdlZEFjdGlvbjxMamF2YS9sYW5nL0Jvb2xlYW47PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotIGNsYXNzIGphdmEudXRpbC5wcmVmcy5GaWxlUHJlZmVyZW5jZXNJbXBsJDIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGphdmEudXRpbC5wcmVmcy5GaWxlUHJlZmVyZW5jZXNJbXBsIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEudXRpbC5wcmVmcy5GaWxlUHJlZmVyZW5jZXNJbXBsKQotCi1wdWJsaWMgamF2YS5sYW5nLkJvb2xlYW4gcnVuKCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi0gY2xhc3MgamF2YS51dGlsLnByZWZzLkZpbGVQcmVmZXJlbmNlc0ltcGwkMyQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuaW8uRmlsZW5hbWVGaWx0ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgamF2YS51dGlsLnByZWZzLkZpbGVQcmVmZXJlbmNlc0ltcGwkMyB0aGlzJDEKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwucHJlZnMuRmlsZVByZWZlcmVuY2VzSW1wbCQzKQotCi1wdWJsaWMgYm9vbGVhbiBhY2NlcHQoCi1qYXZhLmlvLkZpbGUKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3NlY3VyaXR5L1ByaXZpbGVnZWRBY3Rpb248W0xqYXZhL2xhbmcvU3RyaW5nOz47ICkKLSBjbGFzcyBqYXZhLnV0aWwucHJlZnMuRmlsZVByZWZlcmVuY2VzSW1wbCQzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBqYXZhLnV0aWwucHJlZnMuRmlsZVByZWZlcmVuY2VzSW1wbCB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwucHJlZnMuRmlsZVByZWZlcmVuY2VzSW1wbCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgcnVuKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS9zZWN1cml0eS9Qcml2aWxlZ2VkQWN0aW9uPExqYXZhL2xhbmcvQm9vbGVhbjs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi0gY2xhc3MgamF2YS51dGlsLnByZWZzLkZpbGVQcmVmZXJlbmNlc0ltcGwkNCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgamF2YS51dGlsLnByZWZzLkZpbGVQcmVmZXJlbmNlc0ltcGwgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLnByZWZzLkZpbGVQcmVmZXJlbmNlc0ltcGwpCi0KLXB1YmxpYyBqYXZhLmxhbmcuQm9vbGVhbiBydW4oKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotIGNsYXNzIGphdmEudXRpbC5wcmVmcy5GaWxlUHJlZmVyZW5jZXNJbXBsIGV4dGVuZHMgamF2YS51dGlsLnByZWZzLkFic3RyYWN0UHJlZmVyZW5jZXMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQUkVGU19GSUxFX05BTUUKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBTWVNURU1fSE9NRQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIFVTRVJfSE9NRQotCi1wcml2YXRlIGphdmEuaW8uRmlsZSBkaXIKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHBhdGgKLQotcHJpdmF0ZSBqYXZhLnV0aWwuUHJvcGVydGllcyBwcmVmcwotCi1wcml2YXRlIGphdmEuaW8uRmlsZSBwcmVmc0ZpbGUKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL1NldDxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wcml2YXRlIGphdmEudXRpbC5TZXQgcmVtb3ZlZAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvU2V0PExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXByaXZhdGUgamF2YS51dGlsLlNldCB1cGRhdGVkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLnByZWZzLkFic3RyYWN0UHJlZmVyZW5jZXMKLWphdmEubGFuZy5TdHJpbmcpCi0KLSB2b2lkIDxpbml0PigKLWJvb2xlYW4pCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGFjY2VzcyQwMDIoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1zdGF0aWMgamF2YS5sYW5nLlN0cmluZyBhY2Nlc3MkMTAyKAotamF2YS5sYW5nLlN0cmluZykKLQotc3RhdGljIGphdmEuaW8uRmlsZSBhY2Nlc3MkMjAwKAotamF2YS51dGlsLnByZWZzLkZpbGVQcmVmZXJlbmNlc0ltcGwpCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGFjY2VzcyQzMDAoCi1qYXZhLnV0aWwucHJlZnMuRmlsZVByZWZlcmVuY2VzSW1wbCkKLQotc3RhdGljIGphdmEuaW8uRmlsZSBhY2Nlc3MkNDAwKAotamF2YS51dGlsLnByZWZzLkZpbGVQcmVmZXJlbmNlc0ltcGwpCi0KLXByaXZhdGUgdm9pZCBpbml0UHJlZnMoKQotCi1wcm90ZWN0ZWQgamF2YS51dGlsLnByZWZzLkFic3RyYWN0UHJlZmVyZW5jZXMgY2hpbGRTcGkoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3V0aWwvcHJlZnMvQmFja2luZ1N0b3JlRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZ1tdIGNoaWxkcmVuTmFtZXNTcGkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3V0aWwvcHJlZnMvQmFja2luZ1N0b3JlRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBmbHVzaFNwaSgpCi0KLXByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIGdldFNwaSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvdXRpbC9wcmVmcy9CYWNraW5nU3RvcmVFeGNlcHRpb247ICkKLXByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nW10ga2V5c1NwaSgpCi0KLXByb3RlY3RlZCB2b2lkIHB1dFNwaSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvdXRpbC9wcmVmcy9CYWNraW5nU3RvcmVFeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIHJlbW92ZU5vZGVTcGkoKQotCi1wcm90ZWN0ZWQgdm9pZCByZW1vdmVTcGkoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3V0aWwvcHJlZnMvQmFja2luZ1N0b3JlRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBzeW5jU3BpKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLnV0aWwucHJlZnMuSW52YWxpZFByZWZlcmVuY2VzRm9ybWF0RXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLkV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZhLnV0aWwucHJlZnMuTm9kZUNoYW5nZUxpc3RlbmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudXRpbC5FdmVudExpc3RlbmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgY2hpbGRBZGRlZCgKLWphdmEudXRpbC5wcmVmcy5Ob2RlQ2hhbmdlRXZlbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGNoaWxkUmVtb3ZlZCgKLWphdmEudXRpbC5wcmVmcy5Ob2RlQ2hhbmdlRXZlbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy53M2MuZG9tLk5vZGVMaXN0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0TGVuZ3RoKCkKLQotcHVibGljIGFic3RyYWN0IG9yZy53M2MuZG9tLk5vZGUgaXRlbSgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLSBjbGFzcyBqYXZhLnV0aWwucHJlZnMuTm9kZVNldCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcudzNjLmRvbS5Ob2RlTGlzdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQXJyYXlMaXN0PExvcmcvdzNjL2RvbS9Ob2RlOz47ICkKLSBqYXZhLnV0aWwuQXJyYXlMaXN0IGxpc3QKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0l0ZXJhdG9yPExvcmcvdzNjL2RvbS9Ob2RlOz47KVYgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkl0ZXJhdG9yKQotCi1wdWJsaWMgaW50IGdldExlbmd0aCgpCi0KLXB1YmxpYyBvcmcudzNjLmRvbS5Ob2RlIGl0ZW0oCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VDaGFuZ2VFdmVudCBleHRlbmRzIGphdmEudXRpbC5FdmVudE9iamVjdCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmcga2V5Ci0KLXByaXZhdGUgZmluYWwgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzIG5vZGUKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIHZhbHVlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgcmVhZE9iamVjdCgKLWphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCB3cml0ZU9iamVjdCgKLWphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRLZXkoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXROZXdWYWx1ZSgpCi0KLXB1YmxpYyBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZXMgZ2V0Tm9kZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLkV2ZW50TGlzdGVuZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBwcmVmZXJlbmNlQ2hhbmdlKAotamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VDaGFuZ2VFdmVudCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL3ByZWZzL1ByZWZlcmVuY2VzOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvc2VjdXJpdHkvUHJpdmlsZWdlZEFjdGlvbjxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1maW5hbCBjbGFzcyBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZXMkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBydW4oKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvcHJlZnMvWE1MUGFyc2VyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1maW5hbCBjbGFzcyBqYXZhLnV0aWwucHJlZnMuWE1MUGFyc2VyJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBvcmcueG1sLnNheC5JbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YS91dGlsL3ByZWZzL1hNTFBhcnNlcjsgKQotZmluYWwgY2xhc3MgamF2YS51dGlsLnByZWZzLlhNTFBhcnNlciQyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgZXJyb3IoCi1vcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBmYXRhbEVycm9yKAotb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb24pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgd2FybmluZygKLW9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS9zZWN1cml0eS9Qcml2aWxlZ2VkQWN0aW9uPExqYXZhL3V0aWwvUHJvcGVydGllczs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1maW5hbCBjbGFzcyBqYXZhLnV0aWwucHJlZnMuWE1MUGFyc2VyJDMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGphdmEuaW8uRmlsZSB2YWwkZmlsZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEuaW8uRmlsZSkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgcnVuKCkKLQotcHVibGljIGphdmEudXRpbC5Qcm9wZXJ0aWVzIHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3NlY3VyaXR5L1ByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb248TGphdmEvbGFuZy9PYmplY3Q7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotZmluYWwgY2xhc3MgamF2YS51dGlsLnByZWZzLlhNTFBhcnNlciQ0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBqYXZhLmlvLkZpbGUgdmFsJGZpbGUKLQotZmluYWwgamF2YS51dGlsLlByb3BlcnRpZXMgdmFsJHByZWZzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS5pby5GaWxlCi1qYXZhLnV0aWwuUHJvcGVydGllcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLSBjbGFzcyBqYXZhLnV0aWwucHJlZnMuWE1MUGFyc2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBET0NUWVBFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmdbXSBFTVBUWV9TQVJSQVkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBGSUxFX1BSRUZTCi0KLXN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEhFQURFUgotCi1zdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQUkVGU19EVEQKLQotc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUFJFRlNfRFREX05BTUUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgWE1MX1ZFUlNJT04KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIKLQotcHJpdmF0ZSBzdGF0aWMgaW50IGluZGVudAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvdXRpbC9wcmVmcy9CYWNraW5nU3RvcmVFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgc3RhdGljIHZvaWQgZXhwb3J0RW50cmllcygKLWphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlcwotamF2YS5pby5CdWZmZXJlZFdyaXRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBleHBvcnRFbnRyaWVzKAotamF2YS5sYW5nLlN0cmluZ1tdCi1qYXZhLmxhbmcuU3RyaW5nW10KLWphdmEuaW8uQnVmZmVyZWRXcml0ZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvdXRpbC9wcmVmcy9CYWNraW5nU3RvcmVFeGNlcHRpb247ICkKLXByaXZhdGUgc3RhdGljIHZvaWQgZXhwb3J0Tm9kZSgKLWphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXIKLWphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlcwotYm9vbGVhbgotamF2YS5pby5CdWZmZXJlZFdyaXRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS91dGlsL3ByZWZzL0JhY2tpbmdTdG9yZUV4Y2VwdGlvbjsgKQotc3RhdGljIHZvaWQgZXhwb3J0UHJlZnMoCi1qYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZXMKLWphdmEuaW8uT3V0cHV0U3RyZWFtCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3V0aWwvcHJlZnMvQmFja2luZ1N0b3JlRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHN0YXRpYyB2b2lkIGV4cG9ydFN1YlRyZWUoCi1qYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZXMKLWphdmEuaW8uQnVmZmVyZWRXcml0ZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgc3RhdGljIHZvaWQgZmx1c2hFbXB0eUVsZW1lbnQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHN0YXRpYyB2b2lkIGZsdXNoRW1wdHlFbGVtZW50KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZ1tdCi1qYXZhLmxhbmcuU3RyaW5nW10KLWphdmEuaW8uQnVmZmVyZWRXcml0ZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgc3RhdGljIHZvaWQgZmx1c2hFbmRUYWcoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L1ByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb247ICkKLXN0YXRpYyB2b2lkIGZsdXNoRmlsZVByZWZzKAotamF2YS5pby5GaWxlCi1qYXZhLnV0aWwuUHJvcGVydGllcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotc3RhdGljIHZvaWQgZmx1c2hGaWxlUHJlZnNJbXBsKAotamF2YS5pby5GaWxlCi1qYXZhLnV0aWwuUHJvcGVydGllcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBmbHVzaEluZGVudCgKLWludAotamF2YS5pby5CdWZmZXJlZFdyaXRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBmbHVzaFBhaXJzKAotamF2YS5sYW5nLlN0cmluZ1tdCi1qYXZhLmxhbmcuU3RyaW5nW10KLWphdmEuaW8uQnVmZmVyZWRXcml0ZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgc3RhdGljIHZvaWQgZmx1c2hTdGFydFRhZygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEuaW8uQnVmZmVyZWRXcml0ZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgc3RhdGljIHZvaWQgZmx1c2hTdGFydFRhZygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmdbXQotamF2YS5sYW5nLlN0cmluZ1tdCi1qYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyKQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGh0bWxFbmNvZGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL3V0aWwvcHJlZnMvSW52YWxpZFByZWZlcmVuY2VzRm9ybWF0RXhjZXB0aW9uOyApCi1zdGF0aWMgdm9pZCBpbXBvcnRQcmVmcygKLWphdmEuaW8uSW5wdXRTdHJlYW0pCi0KLXN0YXRpYyBqYXZhLnV0aWwuUHJvcGVydGllcyBsb2FkRmlsZVByZWZzKAotamF2YS5pby5GaWxlKQotCi1zdGF0aWMgamF2YS51dGlsLlByb3BlcnRpZXMgbG9hZEZpbGVQcmVmc0ltcGwoCi1qYXZhLmlvLkZpbGUpCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgbG9hZE5vZGUoCi1qYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZXMKLW9yZy53M2MuZG9tLkVsZW1lbnQpCi0KLXByaXZhdGUgc3RhdGljIG9yZy53M2MuZG9tLk5vZGVMaXN0IHNlbGVjdE5vZGVMaXN0KAotb3JnLnczYy5kb20uRWxlbWVudAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgamF2YS51dGlsLnJlZ2V4Lk1hdGNoUmVzdWx0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZW5kKCkKLQotcHVibGljIGFic3RyYWN0IGludCBlbmQoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdyb3VwKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ3JvdXAoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ3JvdXBDb3VudCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgc3RhcnQoKQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IHN0YXJ0KAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotIGNsYXNzIGphdmEudXRpbC5yZWdleC5NYXRjaFJlc3VsdEltcGwgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLnJlZ2V4Lk1hdGNoUmVzdWx0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgaW50W10gb2Zmc2V0cwotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgdGV4dAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludFtdKQotCi1wdWJsaWMgaW50IGVuZCgpCi0KLXB1YmxpYyBpbnQgZW5kKAotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBncm91cCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdyb3VwKAotaW50KQotCi1wdWJsaWMgaW50IGdyb3VwQ291bnQoKQotCi1wdWJsaWMgaW50IHN0YXJ0KCkKLQotcHVibGljIGludCBzdGFydCgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBqYXZhLnV0aWwucmVnZXguTWF0Y2hlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwucmVnZXguTWF0Y2hSZXN1bHQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBib29sZWFuIGFuY2hvcmluZ0JvdW5kcwotCi1wcml2YXRlIGludCBhcHBlbmRQb3MKLQotcHJpdmF0ZSBpbnQgZmluZFBvcwotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgaW5wdXQKLQotcHJpdmF0ZSBib29sZWFuIG1hdGNoRm91bmQKLQotcHJpdmF0ZSBpbnRbXSBtYXRjaE9mZnNldHMKLQotcHJpdmF0ZSBpbnQgbmF0aXZlUGF0dGVybgotCi1wcml2YXRlIGphdmEudXRpbC5yZWdleC5QYXR0ZXJuIHBhdHRlcm4KLQotcHJpdmF0ZSBpbnQgcmVnaW9uRW5kCi0KLXByaXZhdGUgaW50IHJlZ2lvblN0YXJ0Ci0KLXByaXZhdGUgYm9vbGVhbiBzZWFyY2hpbmcKLQotcHJpdmF0ZSBib29sZWFuIHRyYW5zcGFyZW50Qm91bmRzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4KLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi0KLXByaXZhdGUgdm9pZCBhcHBlbmRFdmFsdWF0ZWQoCi1qYXZhLmxhbmcuU3RyaW5nQnVmZmVyCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgZW5zdXJlTWF0Y2goKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgcXVvdGVSZXBsYWNlbWVudCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXIgcmVzZXQoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEudXRpbC5yZWdleC5NYXRjaGVyIGFwcGVuZFJlcGxhY2VtZW50KAotamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgYXBwZW5kVGFpbCgKLWphdmEubGFuZy5TdHJpbmdCdWZmZXIpCi0KLXB1YmxpYyBpbnQgZW5kKCkKLQotcHVibGljIGludCBlbmQoCi1pbnQpCi0KLXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkKLQotcHVibGljIGJvb2xlYW4gZmluZCgpCi0KLXB1YmxpYyBib29sZWFuIGZpbmQoCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdyb3VwKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ3JvdXAoCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ3JvdXBDb3VudCgpCi0KLXB1YmxpYyBib29sZWFuIGhhc0FuY2hvcmluZ0JvdW5kcygpCi0KLXB1YmxpYyBib29sZWFuIGhhc1RyYW5zcGFyZW50Qm91bmRzKCkKLQotcHVibGljIGJvb2xlYW4gaGl0RW5kKCkKLQotcHVibGljIGJvb2xlYW4gbG9va2luZ0F0KCkKLQotcHVibGljIGJvb2xlYW4gbWF0Y2hlcygpCi0KLXB1YmxpYyBqYXZhLnV0aWwucmVnZXguUGF0dGVybiBwYXR0ZXJuKCkKLQotcHVibGljIGphdmEudXRpbC5yZWdleC5NYXRjaGVyIHJlZ2lvbigKLWludAotaW50KQotCi1wdWJsaWMgaW50IHJlZ2lvbkVuZCgpCi0KLXB1YmxpYyBpbnQgcmVnaW9uU3RhcnQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyByZXBsYWNlQWxsKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgcmVwbGFjZUZpcnN0KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJvb2xlYW4gcmVxdWlyZUVuZCgpCi0KLXB1YmxpYyBqYXZhLnV0aWwucmVnZXguTWF0Y2hlciByZXNldCgpCi0KLXB1YmxpYyBqYXZhLnV0aWwucmVnZXguTWF0Y2hlciByZXNldCgKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgc3RhcnQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHN0YXJ0KAotaW50KQotCi1wdWJsaWMgamF2YS51dGlsLnJlZ2V4Lk1hdGNoUmVzdWx0IHRvTWF0Y2hSZXN1bHQoKQotCi1wdWJsaWMgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXIgdXNlQW5jaG9yaW5nQm91bmRzKAotYm9vbGVhbikKLQotcHVibGljIGphdmEudXRpbC5yZWdleC5NYXRjaGVyIHVzZVBhdHRlcm4oCi1qYXZhLnV0aWwucmVnZXguUGF0dGVybikKLQotcHVibGljIGphdmEudXRpbC5yZWdleC5NYXRjaGVyIHVzZVRyYW5zcGFyZW50Qm91bmRzKAotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBqYXZhLnV0aWwucmVnZXguUGF0dGVybiBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQU5PTl9FUQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVNFX0lOU0VOU0lUSVZFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTU1FTlRTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERPVEFMTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMSVRFUkFMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1VTFRJTElORQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTklDT0RFX0NBU0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5JWF9MSU5FUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSBpbnQgZmxhZ3MKLQotdHJhbnNpZW50IGludCBtR3JvdXBDb3VudAotCi10cmFuc2llbnQgaW50IG1OYXRpdmVQYXR0ZXJuCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBwYXR0ZXJuCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS91dGlsL3JlZ2V4L1BhdHRlcm5TeW50YXhFeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvdXRpbC9yZWdleC9QYXR0ZXJuU3ludGF4RXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5yZWdleC5QYXR0ZXJuIGNvbXBpbGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3V0aWwvcmVnZXgvUGF0dGVyblN5bnRheEV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwucmVnZXguUGF0dGVybiBjb21waWxlKAotamF2YS5sYW5nLlN0cmluZwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3V0aWwvcmVnZXgvUGF0dGVyblN5bnRheEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIGNvbXBpbGVJbXBsKAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gbWF0Y2hlcygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5DaGFyU2VxdWVuY2UpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBxdW90ZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgcmVhZE9iamVjdCgKLWphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0pCi0KLXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkKLQotcHVibGljIGludCBmbGFncygpCi0KLXB1YmxpYyBqYXZhLnV0aWwucmVnZXguTWF0Y2hlciBtYXRjaGVyKAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgcGF0dGVybigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gc3BsaXQoCi1qYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIHNwbGl0KAotamF2YS5sYW5nLkNoYXJTZXF1ZW5jZQotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm5TeW50YXhFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZGVzY3JpcHRpb24KLQotcHJpdmF0ZSBpbnQgaW5kZXgKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHBhdHRlcm4KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldERlc2NyaXB0aW9uKCkKLQotcHVibGljIGludCBnZXRJbmRleCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE1lc3NhZ2UoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRQYXR0ZXJuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgamF2YS51dGlsLnppcC5DaGVja3N1bSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgbG9uZyBnZXRWYWx1ZSgpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlc2V0KCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgdXBkYXRlKAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB1cGRhdGUoCi1ieXRlW10KLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEudXRpbC56aXAuQWRsZXIzMiBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuemlwLkNoZWNrc3VtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgbG9uZyBhZGxlcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgbmF0aXZlIGxvbmcgdXBkYXRlQnl0ZUltcGwoCi1pbnQKLWxvbmcpCi0KLXByaXZhdGUgbmF0aXZlIGxvbmcgdXBkYXRlSW1wbCgKLWJ5dGVbXQotaW50Ci1pbnQKLWxvbmcpCi0KLXB1YmxpYyBsb25nIGdldFZhbHVlKCkKLQotcHVibGljIHZvaWQgcmVzZXQoKQotCi1wdWJsaWMgdm9pZCB1cGRhdGUoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHVwZGF0ZSgKLWJ5dGVbXSkKLQotcHVibGljIHZvaWQgdXBkYXRlKAotYnl0ZVtdCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLnV0aWwuemlwLkNSQzMyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudXRpbC56aXAuQ2hlY2tzdW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBsb25nIGNyYwotCi0gbG9uZyB0Ynl0ZXMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIG5hdGl2ZSBsb25nIHVwZGF0ZUJ5dGVJbXBsKAotYnl0ZQotbG9uZykKLQotcHJpdmF0ZSBuYXRpdmUgbG9uZyB1cGRhdGVJbXBsKAotYnl0ZVtdCi1pbnQKLWludAotbG9uZykKLQotcHVibGljIGxvbmcgZ2V0VmFsdWUoKQotCi1wdWJsaWMgdm9pZCByZXNldCgpCi0KLXB1YmxpYyB2b2lkIHVwZGF0ZSgKLWludCkKLQotcHVibGljIHZvaWQgdXBkYXRlKAotYnl0ZVtdKQotCi1wdWJsaWMgdm9pZCB1cGRhdGUoCi1ieXRlW10KLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEudXRpbC56aXAuQ2hlY2tlZElucHV0U3RyZWFtIGV4dGVuZHMgamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC56aXAuQ2hlY2tzdW0gY2hlY2sKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmlvLklucHV0U3RyZWFtCi1qYXZhLnV0aWwuemlwLkNoZWNrc3VtKQotCi1wdWJsaWMgamF2YS51dGlsLnppcC5DaGVja3N1bSBnZXRDaGVja3N1bSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcmVhZCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcmVhZCgKLWJ5dGVbXQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBsb25nIHNraXAoCi1sb25nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEudXRpbC56aXAuQ2hlY2tlZE91dHB1dFN0cmVhbSBleHRlbmRzIGphdmEuaW8uRmlsdGVyT3V0cHV0U3RyZWFtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgamF2YS51dGlsLnppcC5DaGVja3N1bSBjaGVjawotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uT3V0cHV0U3RyZWFtCi1qYXZhLnV0aWwuemlwLkNoZWNrc3VtKQotCi1wdWJsaWMgamF2YS51dGlsLnppcC5DaGVja3N1bSBnZXRDaGVja3N1bSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHdyaXRlKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB3cml0ZSgKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YS51dGlsLnppcC5EYXRhRm9ybWF0RXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLkV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEudXRpbC56aXAuRGVmbGF0ZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJFU1RfQ09NUFJFU1NJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkVTVF9TUEVFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0NPTVBSRVNTSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfU1RSQVRFR1kKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGTEFURUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMVEVSRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSFVGRk1BTl9PTkxZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PX0NPTVBSRVNTSU9OCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBTVFVCX0lOUFVUX0JVRkZFUgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWl9GSU5JU0gKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpfTk9fRkxVU0gKLQotcHJpdmF0ZSBpbnQgY29tcHJlc3NMZXZlbAotCi1wcml2YXRlIGJvb2xlYW4gZmluaXNoZWQKLQotcHJpdmF0ZSBpbnQgZmx1c2hQYXJtCi0KLXByaXZhdGUgaW50IGluTGVuZ3RoCi0KLXByaXZhdGUgaW50IGluUmVhZAotCi1wcml2YXRlIGJ5dGVbXSBpbnB1dEJ1ZmZlcgotCi1wcml2YXRlIGludCBzdHJhdGVneQotCi1wcml2YXRlIGxvbmcgc3RyZWFtSGFuZGxlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotYm9vbGVhbikKLQotcHJpdmF0ZSBuYXRpdmUgbG9uZyBjcmVhdGVTdHJlYW0oCi1pbnQKLWludAotYm9vbGVhbikKLQotcHJpdmF0ZSBzeW5jaHJvbml6ZWQgbmF0aXZlIGludCBkZWZsYXRlSW1wbCgKLWJ5dGVbXQotaW50Ci1pbnQKLWxvbmcKLWludCkKLQotcHJpdmF0ZSBzeW5jaHJvbml6ZWQgbmF0aXZlIHZvaWQgZW5kSW1wbCgKLWxvbmcpCi0KLXByaXZhdGUgc3luY2hyb25pemVkIG5hdGl2ZSBpbnQgZ2V0QWRsZXJJbXBsKAotbG9uZykKLQotcHJpdmF0ZSBzeW5jaHJvbml6ZWQgbmF0aXZlIGxvbmcgZ2V0VG90YWxJbkltcGwoCi1sb25nKQotCi1wcml2YXRlIHN5bmNocm9uaXplZCBuYXRpdmUgbG9uZyBnZXRUb3RhbE91dEltcGwoCi1sb25nKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBvbmVUaW1lSW5pdGlhbGl6YXRpb24oKQotCi1wcml2YXRlIHN5bmNocm9uaXplZCBuYXRpdmUgdm9pZCByZXNldEltcGwoCi1sb25nKQotCi1wcml2YXRlIHN5bmNocm9uaXplZCBuYXRpdmUgdm9pZCBzZXREaWN0aW9uYXJ5SW1wbCgKLWJ5dGVbXQotaW50Ci1pbnQKLWxvbmcpCi0KLXByaXZhdGUgc3luY2hyb25pemVkIG5hdGl2ZSB2b2lkIHNldElucHV0SW1wbCgKLWJ5dGVbXQotaW50Ci1pbnQKLWxvbmcpCi0KLXByaXZhdGUgc3luY2hyb25pemVkIG5hdGl2ZSB2b2lkIHNldExldmVsc0ltcGwoCi1pbnQKLWludAotbG9uZykKLQotcHVibGljIGludCBkZWZsYXRlKAotYnl0ZVtdKQotCi1wdWJsaWMgaW50IGRlZmxhdGUoCi1ieXRlW10KLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBlbmQoKQotCi1wcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpCi0KLXB1YmxpYyB2b2lkIGZpbmlzaCgpCi0KLXB1YmxpYyBib29sZWFuIGZpbmlzaGVkKCkKLQotcHVibGljIGludCBnZXRBZGxlcigpCi0KLXB1YmxpYyBsb25nIGdldEJ5dGVzUmVhZCgpCi0KLXB1YmxpYyBsb25nIGdldEJ5dGVzV3JpdHRlbigpCi0KLXB1YmxpYyBpbnQgZ2V0VG90YWxJbigpCi0KLXB1YmxpYyBpbnQgZ2V0VG90YWxPdXQoKQotCi1wdWJsaWMgYm9vbGVhbiBuZWVkc0lucHV0KCkKLQotcHVibGljIHZvaWQgcmVzZXQoKQotCi1wdWJsaWMgdm9pZCBzZXREaWN0aW9uYXJ5KAotYnl0ZVtdKQotCi1wdWJsaWMgdm9pZCBzZXREaWN0aW9uYXJ5KAotYnl0ZVtdCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgc2V0SW5wdXQoCi1ieXRlW10pCi0KLXB1YmxpYyB2b2lkIHNldElucHV0KAotYnl0ZVtdCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgc2V0TGV2ZWwoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldFN0cmF0ZWd5KAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEudXRpbC56aXAuR1pJUElucHV0U3RyZWFtIGV4dGVuZHMgamF2YS51dGlsLnppcC5JbmZsYXRlcklucHV0U3RyZWFtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGQ09NTUVOVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkVYVFJBCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGSENSQwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRk5BTUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR1pJUF9NQUdJQwotCi1wcm90ZWN0ZWQgamF2YS51dGlsLnppcC5DUkMzMiBjcmMKLQotcHJvdGVjdGVkIGJvb2xlYW4gZW9zCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5JbnB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5JbnB1dFN0cmVhbQotaW50KQotCi1wcml2YXRlIGxvbmcgZ2V0TG9uZygKLWJ5dGVbXQotaW50KQotCi1wcml2YXRlIGludCBnZXRTaG9ydCgKLWJ5dGVbXQotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgcmVhZEZ1bGx5KAotYnl0ZVtdCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHJlYWRaZXJvVGVybWluYXRlZCgKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNsb3NlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCByZWFkKAotYnl0ZVtdCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZhLnV0aWwuemlwLkdaSVBPdXRwdXRTdHJlYW0gZXh0ZW5kcyBqYXZhLnV0aWwuemlwLkRlZmxhdGVyT3V0cHV0U3RyZWFtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCBqYXZhLnV0aWwuemlwLkNSQzMyIGNyYwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uT3V0cHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmlvLk91dHB1dFN0cmVhbQotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIGxvbmcgd3JpdGVMb25nKAotbG9uZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBpbnQgd3JpdGVTaG9ydCgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgZmluaXNoKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgd3JpdGUoCi1ieXRlW10KLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmEudXRpbC56aXAuSW5mbGF0ZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgTUFHSUNfTlVNQkVSCi0KLXByaXZhdGUgYm9vbGVhbiBmaW5pc2hlZAotCi1wcml2YXRlIGJvb2xlYW4gZ290Rmlyc3RCeXRlCi0KLSBpbnQgaW5MZW5ndGgKLQotIGludCBpblJlYWQKLQotcHJpdmF0ZSBib29sZWFuIG5lZWRzRGljdGlvbmFyeQotCi1wcml2YXRlIGJvb2xlYW4gcGFzc19tYWdpY19udW1iZXJfY2hlY2sKLQotcHJpdmF0ZSBsb25nIHN0cmVhbUhhbmRsZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYm9vbGVhbikKLQotcHJpdmF0ZSBuYXRpdmUgbG9uZyBjcmVhdGVTdHJlYW0oCi1ib29sZWFuKQotCi1wcml2YXRlIHN5bmNocm9uaXplZCBuYXRpdmUgdm9pZCBlbmRJbXBsKAotbG9uZykKLQotcHJpdmF0ZSBzeW5jaHJvbml6ZWQgbmF0aXZlIGludCBnZXRBZGxlckltcGwoCi1sb25nKQotCi1wcml2YXRlIHN5bmNocm9uaXplZCBuYXRpdmUgbG9uZyBnZXRUb3RhbEluSW1wbCgKLWxvbmcpCi0KLXByaXZhdGUgc3luY2hyb25pemVkIG5hdGl2ZSBsb25nIGdldFRvdGFsT3V0SW1wbCgKLWxvbmcpCi0KLXByaXZhdGUgc3luY2hyb25pemVkIG5hdGl2ZSBpbnQgaW5mbGF0ZUltcGwoCi1ieXRlW10KLWludAotaW50Ci1sb25nKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBvbmVUaW1lSW5pdGlhbGl6YXRpb24oKQotCi1wcml2YXRlIHN5bmNocm9uaXplZCBuYXRpdmUgdm9pZCByZXNldEltcGwoCi1sb25nKQotCi1wcml2YXRlIHN5bmNocm9uaXplZCBuYXRpdmUgdm9pZCBzZXREaWN0aW9uYXJ5SW1wbCgKLWJ5dGVbXQotaW50Ci1pbnQKLWxvbmcpCi0KLXByaXZhdGUgc3luY2hyb25pemVkIG5hdGl2ZSBpbnQgc2V0RmlsZUlucHV0SW1wbCgKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IKLWxvbmcKLWludAotbG9uZykKLQotcHJpdmF0ZSBzeW5jaHJvbml6ZWQgbmF0aXZlIHZvaWQgc2V0SW5wdXRJbXBsKAotYnl0ZVtdCi1pbnQKLWludAotbG9uZykKLQotcHVibGljIHZvaWQgZW5kKCkKLQotcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKQotCi1wdWJsaWMgYm9vbGVhbiBmaW5pc2hlZCgpCi0KLXB1YmxpYyBpbnQgZ2V0QWRsZXIoKQotCi1wdWJsaWMgbG9uZyBnZXRCeXRlc1JlYWQoKQotCi1wdWJsaWMgbG9uZyBnZXRCeXRlc1dyaXR0ZW4oKQotCi1wdWJsaWMgaW50IGdldFJlbWFpbmluZygpCi0KLXB1YmxpYyBpbnQgZ2V0VG90YWxJbigpCi0KLXB1YmxpYyBpbnQgZ2V0VG90YWxPdXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3V0aWwvemlwL0RhdGFGb3JtYXRFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgaW5mbGF0ZSgKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS91dGlsL3ppcC9EYXRhRm9ybWF0RXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGluZmxhdGUoCi1ieXRlW10KLWludAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBuZWVkc0RpY3Rpb25hcnkoKQotCi1wdWJsaWMgYm9vbGVhbiBuZWVkc0lucHV0KCkKLQotcHVibGljIHZvaWQgcmVzZXQoKQotCi1wdWJsaWMgdm9pZCBzZXREaWN0aW9uYXJ5KAotYnl0ZVtdKQotCi1wdWJsaWMgdm9pZCBzZXREaWN0aW9uYXJ5KAotYnl0ZVtdCi1pbnQKLWludCkKLQotIGludCBzZXRGaWxlSW5wdXQoCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1sb25nCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldElucHV0KAotYnl0ZVtdKQotCi1wdWJsaWMgdm9pZCBzZXRJbnB1dCgKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmEvdXRpbC96aXAvWmlwRW50cnk7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1MaXR0bGVFbmRpYW5SZWFkZXIgKQotIGNsYXNzIGphdmEudXRpbC56aXAuWmlwRW50cnkkTGl0dGxlRW5kaWFuUmVhZGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGJ5dGVbXSBiCi0KLSBieXRlW10gaGRyQnVmCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotIGxvbmcgcmVhZEludExFKAotamF2YS5pby5JbnB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotIGludCByZWFkU2hvcnRMRSgKLWphdmEuaW8uSW5wdXRTdHJlYW0pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3NlY3VyaXR5L1ByaXZpbGVnZWRBY3Rpb248TGphdmEvbGFuZy9PYmplY3Q7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotIGNsYXNzIGphdmEudXRpbC56aXAuWmlwRmlsZSQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBqYXZhLnV0aWwuemlwLlppcEZpbGUgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLnppcC5aaXBGaWxlKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS91dGlsL0VudW1lcmF0aW9uPExqYXZhL3V0aWwvemlwL1ppcEVudHJ5Oz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLSBjbGFzcyBqYXZhLnV0aWwuemlwLlppcEZpbGUkMiBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuRW51bWVyYXRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBpbnQgaQotCi1maW5hbCBqYXZhLnV0aWwuemlwLlppcEZpbGUgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLnppcC5aaXBGaWxlKQotCi1wdWJsaWMgYm9vbGVhbiBoYXNNb3JlRWxlbWVudHMoKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBuZXh0RWxlbWVudCgpCi0KLXB1YmxpYyBqYXZhLnV0aWwuemlwLlppcEVudHJ5IG5leHRFbGVtZW50KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9UkFGU3RyZWFtICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZhL3V0aWwvemlwL1ppcEZpbGU7ICkKLSBjbGFzcyBqYXZhLnV0aWwuemlwLlppcEZpbGUkUkFGU3RyZWFtIGV4dGVuZHMgamF2YS5pby5JbnB1dFN0cmVhbQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gbG9uZyBtTGVuZ3RoCi0KLSBsb25nIG1PZmZzZXQKLQotIGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZSBtU2hhcmVkUmFmCi0KLXByaXZhdGUgYnl0ZVtdIHNpbmdsZUJ5dGVCdWYKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGUKLWxvbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgYXZhaWxhYmxlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCByZWFkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCByZWFkKAotYnl0ZVtdCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGxvbmcgc2tpcCgKLWxvbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YXguY3J5cHRvLkJhZFBhZGRpbmdFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLnNlY3VyaXR5LkdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmF4LmNyeXB0by5DaXBoZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFQ1JZUFRfTU9ERQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkNSWVBUX01PREUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJVkFURV9LRVkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFVCTElDX0tFWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRUNSRVRfS0VZCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0VSVklDRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTldSQVBfTU9ERQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBXUkFQX01PREUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmZvcnRyZXNzLkVuZ2luZSBlbmdpbmUKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20gc2VjX3JhbmQKLQotcHJpdmF0ZSBpbnQgbW9kZQotCi1wcml2YXRlIGphdmEuc2VjdXJpdHkuUHJvdmlkZXIgcHJvdmlkZXIKLQotcHJpdmF0ZSBqYXZheC5jcnlwdG8uQ2lwaGVyU3BpIHNwaUltcGwKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHRyYW5zZm9ybWF0aW9uCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oCi1qYXZheC5jcnlwdG8uQ2lwaGVyU3BpCi1qYXZhLnNlY3VyaXR5LlByb3ZpZGVyCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsgKQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZ1tdIGNoZWNrVHJhbnNmb3JtYXRpb24oCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjtMamF2YXgvY3J5cHRvL05vU3VjaFBhZGRpbmdFeGNlcHRpb247ICkKLXByaXZhdGUgc3RhdGljIGphdmF4LmNyeXB0by5DaXBoZXIgZ2V0Q2lwaGVyKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5zZWN1cml0eS5Qcm92aWRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247TGphdmF4L2NyeXB0by9Ob1N1Y2hQYWRkaW5nRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmF4LmNyeXB0by5DaXBoZXIgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9Ob1N1Y2hQcm92aWRlckV4Y2VwdGlvbjtMamF2YXgvY3J5cHRvL05vU3VjaFBhZGRpbmdFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YXguY3J5cHRvLkNpcGhlciBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uO0xqYXZheC9jcnlwdG8vTm9TdWNoUGFkZGluZ0V4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZheC5jcnlwdG8uQ2lwaGVyIGdldEluc3RhbmNlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5zZWN1cml0eS5Qcm92aWRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGdldE1heEFsbG93ZWRLZXlMZW5ndGgoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYyBnZXRNYXhBbGxvd2VkUGFyYW1ldGVyU3BlYygKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmF4L2NyeXB0by9TaG9ydEJ1ZmZlckV4Y2VwdGlvbjtMamF2YXgvY3J5cHRvL0lsbGVnYWxCbG9ja1NpemVFeGNlcHRpb247TGphdmF4L2NyeXB0by9CYWRQYWRkaW5nRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgaW50IGRvRmluYWwoCi1qYXZhLm5pby5CeXRlQnVmZmVyCi1qYXZhLm5pby5CeXRlQnVmZmVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZheC9jcnlwdG8vSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbjtMamF2YXgvY3J5cHRvL1Nob3J0QnVmZmVyRXhjZXB0aW9uO0xqYXZheC9jcnlwdG8vQmFkUGFkZGluZ0V4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIGludCBkb0ZpbmFsKAotYnl0ZVtdCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmF4L2NyeXB0by9TaG9ydEJ1ZmZlckV4Y2VwdGlvbjtMamF2YXgvY3J5cHRvL0lsbGVnYWxCbG9ja1NpemVFeGNlcHRpb247TGphdmF4L2NyeXB0by9CYWRQYWRkaW5nRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgaW50IGRvRmluYWwoCi1ieXRlW10KLWludAotaW50Ci1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmF4L2NyeXB0by9TaG9ydEJ1ZmZlckV4Y2VwdGlvbjtMamF2YXgvY3J5cHRvL0lsbGVnYWxCbG9ja1NpemVFeGNlcHRpb247TGphdmF4L2NyeXB0by9CYWRQYWRkaW5nRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgaW50IGRvRmluYWwoCi1ieXRlW10KLWludAotaW50Ci1ieXRlW10KLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YXgvY3J5cHRvL0lsbGVnYWxCbG9ja1NpemVFeGNlcHRpb247TGphdmF4L2NyeXB0by9CYWRQYWRkaW5nRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgYnl0ZVtdIGRvRmluYWwoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZheC9jcnlwdG8vSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbjtMamF2YXgvY3J5cHRvL0JhZFBhZGRpbmdFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBieXRlW10gZG9GaW5hbCgKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YXgvY3J5cHRvL0lsbGVnYWxCbG9ja1NpemVFeGNlcHRpb247TGphdmF4L2NyeXB0by9CYWRQYWRkaW5nRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgYnl0ZVtdIGRvRmluYWwoCi1ieXRlW10KLWludAotaW50KQotCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBnZXRBbGdvcml0aG0oKQotCi1wdWJsaWMgZmluYWwgaW50IGdldEJsb2NrU2l6ZSgpCi0KLXB1YmxpYyBmaW5hbCBqYXZheC5jcnlwdG8uRXhlbXB0aW9uTWVjaGFuaXNtIGdldEV4ZW1wdGlvbk1lY2hhbmlzbSgpCi0KLXB1YmxpYyBmaW5hbCBieXRlW10gZ2V0SVYoKQotCi1wdWJsaWMgZmluYWwgaW50IGdldE91dHB1dFNpemUoCi1pbnQpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLnNlY3VyaXR5LkFsZ29yaXRobVBhcmFtZXRlcnMgZ2V0UGFyYW1ldGVycygpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyIGdldFByb3ZpZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgdm9pZCBpbml0KAotaW50Ci1qYXZhLnNlY3VyaXR5LktleSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L0ludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCB2b2lkIGluaXQoCi1pbnQKLWphdmEuc2VjdXJpdHkuS2V5Ci1qYXZhLnNlY3VyaXR5LkFsZ29yaXRobVBhcmFtZXRlcnMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgdm9pZCBpbml0KAotaW50Ci1qYXZhLnNlY3VyaXR5LktleQotamF2YS5zZWN1cml0eS5BbGdvcml0aG1QYXJhbWV0ZXJzCi1qYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgdm9pZCBpbml0KAotaW50Ci1qYXZhLnNlY3VyaXR5LktleQotamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgdm9pZCBpbml0KAotaW50Ci1qYXZhLnNlY3VyaXR5LktleQotamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgdm9pZCBpbml0KAotaW50Ci1qYXZhLnNlY3VyaXR5LktleQotamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWMKLWphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCB2b2lkIGluaXQoCi1pbnQKLWphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgdm9pZCBpbml0KAotaW50Ci1qYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGUKLWphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgamF2YS5zZWN1cml0eS5LZXkgdW53cmFwKAotYnl0ZVtdCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmF4L2NyeXB0by9TaG9ydEJ1ZmZlckV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIGludCB1cGRhdGUoCi1qYXZhLm5pby5CeXRlQnVmZmVyCi1qYXZhLm5pby5CeXRlQnVmZmVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZheC9jcnlwdG8vU2hvcnRCdWZmZXJFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBpbnQgdXBkYXRlKAotYnl0ZVtdCi1pbnQKLWludAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZheC9jcnlwdG8vU2hvcnRCdWZmZXJFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBpbnQgdXBkYXRlKAotYnl0ZVtdCi1pbnQKLWludAotYnl0ZVtdCi1pbnQpCi0KLXB1YmxpYyBmaW5hbCBieXRlW10gdXBkYXRlKAotYnl0ZVtdKQotCi1wdWJsaWMgZmluYWwgYnl0ZVtdIHVwZGF0ZSgKLWJ5dGVbXQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmF4L2NyeXB0by9JbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBieXRlW10gd3JhcCgKLWphdmEuc2VjdXJpdHkuS2V5KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmF4LmNyeXB0by5DaXBoZXJJbnB1dFN0cmVhbSBleHRlbmRzIGphdmEuaW8uRmlsdGVySW5wdXRTdHJlYW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBpbnQgSV9CVUZGRVJfU0laRQotCi1wcml2YXRlIGZpbmFsIGphdmF4LmNyeXB0by5DaXBoZXIgY2lwaGVyCi0KLXByaXZhdGUgYm9vbGVhbiBmaW5pc2hlZAotCi1wcml2YXRlIGZpbmFsIGJ5dGVbXSBpX2J1ZmZlcgotCi1wcml2YXRlIGludCBpbmRleAotCi1wcml2YXRlIGJ5dGVbXSBvX2J1ZmZlcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLWphdmEuaW8uSW5wdXRTdHJlYW0pCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uSW5wdXRTdHJlYW0KLWphdmF4LmNyeXB0by5DaXBoZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgYXZhaWxhYmxlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY2xvc2UoKQotCi1wdWJsaWMgYm9vbGVhbiBtYXJrU3VwcG9ydGVkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCByZWFkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCByZWFkKAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoCi1ieXRlW10KLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgbG9uZyBza2lwKAotbG9uZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZheC5jcnlwdG8uQ2lwaGVyT3V0cHV0U3RyZWFtIGV4dGVuZHMgamF2YS5pby5GaWx0ZXJPdXRwdXRTdHJlYW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBieXRlW10gYXJyCi0KLXByaXZhdGUgZmluYWwgamF2YXguY3J5cHRvLkNpcGhlciBjaXBoZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oCi1qYXZhLmlvLk91dHB1dFN0cmVhbSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5PdXRwdXRTdHJlYW0KLWphdmF4LmNyeXB0by5DaXBoZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNsb3NlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgZmx1c2goKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB3cml0ZSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgd3JpdGUoCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHdyaXRlKAotYnl0ZVtdCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZheC5jcnlwdG8uQ2lwaGVyU3BpIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmF4L2NyeXB0by9TaG9ydEJ1ZmZlckV4Y2VwdGlvbjtMamF2YXgvY3J5cHRvL0lsbGVnYWxCbG9ja1NpemVFeGNlcHRpb247TGphdmF4L2NyeXB0by9CYWRQYWRkaW5nRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgaW50IGVuZ2luZURvRmluYWwoCi1qYXZhLm5pby5CeXRlQnVmZmVyCi1qYXZhLm5pby5CeXRlQnVmZmVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZheC9jcnlwdG8vU2hvcnRCdWZmZXJFeGNlcHRpb247TGphdmF4L2NyeXB0by9JbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uO0xqYXZheC9jcnlwdG8vQmFkUGFkZGluZ0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGFic3RyYWN0IGludCBlbmdpbmVEb0ZpbmFsKAotYnl0ZVtdCi1pbnQKLWludAotYnl0ZVtdCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmF4L2NyeXB0by9JbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uO0xqYXZheC9jcnlwdG8vQmFkUGFkZGluZ0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGFic3RyYWN0IGJ5dGVbXSBlbmdpbmVEb0ZpbmFsKAotYnl0ZVtdCi1pbnQKLWludCkKLQotcHJvdGVjdGVkIGFic3RyYWN0IGludCBlbmdpbmVHZXRCbG9ja1NpemUoKQotCi1wcm90ZWN0ZWQgYWJzdHJhY3QgYnl0ZVtdIGVuZ2luZUdldElWKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgaW50IGVuZ2luZUdldEtleVNpemUoCi1qYXZhLnNlY3VyaXR5LktleSkKLQotcHJvdGVjdGVkIGFic3RyYWN0IGludCBlbmdpbmVHZXRPdXRwdXRTaXplKAotaW50KQotCi1wcm90ZWN0ZWQgYWJzdHJhY3QgamF2YS5zZWN1cml0eS5BbGdvcml0aG1QYXJhbWV0ZXJzIGVuZ2luZUdldFBhcmFtZXRlcnMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW5naW5lSW5pdCgKLWludAotamF2YS5zZWN1cml0eS5LZXkKLWphdmEuc2VjdXJpdHkuQWxnb3JpdGhtUGFyYW1ldGVycwotamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW5naW5lSW5pdCgKLWludAotamF2YS5zZWN1cml0eS5LZXkKLWphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW5naW5lSW5pdCgKLWludAotamF2YS5zZWN1cml0eS5LZXkKLWphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjCi1qYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247ICkKLXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVuZ2luZVNldE1vZGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZheC9jcnlwdG8vTm9TdWNoUGFkZGluZ0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW5naW5lU2V0UGFkZGluZygKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247ICkKLXByb3RlY3RlZCBqYXZhLnNlY3VyaXR5LktleSBlbmdpbmVVbndyYXAoCi1ieXRlW10KLWphdmEubGFuZy5TdHJpbmcKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YXgvY3J5cHRvL1Nob3J0QnVmZmVyRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgaW50IGVuZ2luZVVwZGF0ZSgKLWphdmEubmlvLkJ5dGVCdWZmZXIKLWphdmEubmlvLkJ5dGVCdWZmZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmF4L2NyeXB0by9TaG9ydEJ1ZmZlckV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGFic3RyYWN0IGludCBlbmdpbmVVcGRhdGUoCi1ieXRlW10KLWludAotaW50Ci1ieXRlW10KLWludCkKLQotcHJvdGVjdGVkIGFic3RyYWN0IGJ5dGVbXSBlbmdpbmVVcGRhdGUoCi1ieXRlW10KLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZheC9jcnlwdG8vSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgYnl0ZVtdIGVuZ2luZVdyYXAoCi1qYXZhLnNlY3VyaXR5LktleSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMUNvbnN0YW50cyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xBU1NfQVBQTElDQVRJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xBU1NfQ09OVEVYVFNQRUNJRklDCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMQVNTX1BSSVZBVEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xBU1NfVU5JVkVSU0FMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBDX0NPTlNUUlVDVEVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBDX1BSSU1JVElWRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfQU5ZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19CSVRTVFJJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX0JNUFNUUklORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfQk9PTEVBTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfQ0hPSUNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19DX0JJVFNUUklORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfQ19HRU5FUkFMSVpFRFRJTUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX0NfT0NURVRTVFJJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX0NfU0VRVUVOQ0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX0NfU0VRVUVOQ0VPRgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfQ19TRVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX0NfU0VUT0YKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX0NfVVRDVElNRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfQ19VVEY4U1RSSU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19FTUJFRERFRFBEVgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfRU5VTQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfRVhURVJOQUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX0dFTkVSQUxJWkVEVElNRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfR0VORVJBTFNUUklORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfR1JBUEhJQ1NUUklORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfSUE1U1RSSU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19JTlNUQU5DRU9GCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19JTlRFR0VSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19JU082NDZTVFJJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX05VTEwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX05VTUVSSUNTVFJJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX09CSkRFU0NSSVBUT1IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX09DVEVUU1RSSU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19PSUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX1BSSU5UQUJMRVNUUklORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfUkVBTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfUkVMQVRJVkVPSUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX1NFUVVFTkNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19TRVFVRU5DRU9GCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19TRVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX1NFVE9GCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19UNjFTVFJJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX1RFTEVURVhTVFJJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX1VOSVZFUlNBTFNUUklORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfVVRDVElNRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfVVRGOFNUUklORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfVklERU9URVhTVFJJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX1ZJU0lCTEVTVFJJTkcKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFUeXBlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFDb25zdGFudHMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGZpbmFsIGludCBjb25zdHJJZAotCi1wdWJsaWMgZmluYWwgaW50IGlkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWludCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gY2hlY2tUYWcoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBqYXZhLmxhbmcuT2JqZWN0IGRlY29kZSgKLWphdmEuaW8uSW5wdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuT2JqZWN0IGRlY29kZSgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkJlcklucHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLk9iamVjdCBkZWNvZGUoCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBqYXZhLmxhbmcuT2JqZWN0IGRlY29kZSgKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyBmaW5hbCBieXRlW10gZW5jb2RlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgZW5jb2RlQVNOKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVyT3V0cHV0U3RyZWFtKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBlbmNvZGVDb250ZW50KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVyT3V0cHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgamF2YS5sYW5nLk9iamVjdCBnZXREZWNvZGVkT2JqZWN0KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVySW5wdXRTdHJlYW0pCi0KLXB1YmxpYyBpbnQgZ2V0RW5jb2RlZExlbmd0aCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkJlck91dHB1dFN0cmVhbSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RW5jb2RpbmdDb250ZW50KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVyT3V0cHV0U3RyZWFtKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCB2b2lkIHZlcmlmeSgKLWphdmEuaW8uSW5wdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCB2b2lkIHZlcmlmeSgKLWJ5dGVbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xQ29uc3RydWN0dXJlZCBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFUeXBlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWludCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gY2hlY2tUYWcoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGVuY29kZUFTTigKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkJlck91dHB1dFN0cmVhbSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xVHlwZUNvbGxlY3Rpb24gZXh0ZW5kcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xQ29uc3RydWN0dXJlZAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLk9iamVjdFtdIERFRkFVTFQKLQotcHVibGljIGZpbmFsIGJvb2xlYW5bXSBPUFRJT05BTAotCi1wdWJsaWMgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVR5cGVbXSB0eXBlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50Ci1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xVHlwZVtdKQotCi1wcm90ZWN0ZWQgdm9pZCBnZXRWYWx1ZXMoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0W10pCi0KLXByb3RlY3RlZCBmaW5hbCB2b2lkIHNldERlZmF1bHQoCi1qYXZhLmxhbmcuT2JqZWN0Ci1pbnQpCi0KLXByb3RlY3RlZCBmaW5hbCB2b2lkIHNldE9wdGlvbmFsKAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXF1ZW5jZSBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFUeXBlQ29sbGVjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFUeXBlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGRlY29kZSgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkJlcklucHV0U3RyZWFtKQotCi1wdWJsaWMgZmluYWwgdm9pZCBlbmNvZGVDb250ZW50KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVyT3V0cHV0U3RyZWFtKQotCi1wdWJsaWMgZmluYWwgdm9pZCBzZXRFbmNvZGluZ0NvbnRlbnQoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5CZXJPdXRwdXRTdHJlYW0pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmF4L2NyeXB0by9FbmNyeXB0ZWRQcml2YXRlS2V5SW5mbzsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotZmluYWwgY2xhc3MgamF2YXguY3J5cHRvLkVuY3J5cHRlZFByaXZhdGVLZXlJbmZvJDEgZXh0ZW5kcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xU2VxdWVuY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xVHlwZVtdKQotCi1wcm90ZWN0ZWQgdm9pZCBnZXRWYWx1ZXMoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0W10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmF4L2NyeXB0by9FbmNyeXB0ZWRQcml2YXRlS2V5SW5mbzsgKQotZmluYWwgY2xhc3MgamF2YXguY3J5cHRvLkVuY3J5cHRlZFByaXZhdGVLZXlJbmZvJDIgZXh0ZW5kcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xU2VxdWVuY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xVHlwZVtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmF4LmNyeXB0by5FbmNyeXB0ZWRQcml2YXRlS2V5SW5mbyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVNldE9mIEFTTjFBdHRyaWJ1dGVzCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXF1ZW5jZSBBU04xUHJpdmF0ZUtleUluZm8KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVNlcXVlbmNlIGFzbjEKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIG51bGxQYXJhbQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgYWxnTmFtZQotCi1wcml2YXRlIGZpbmFsIGphdmEuc2VjdXJpdHkuQWxnb3JpdGhtUGFyYW1ldGVycyBhbGdQYXJhbWV0ZXJzCi0KLXByaXZhdGUgdm9sYXRpbGUgYnl0ZVtdIGVuY29kZWQKLQotcHJpdmF0ZSBmaW5hbCBieXRlW10gZW5jcnlwdGVkRGF0YQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgb2lkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5zZWN1cml0eS5BbGdvcml0aG1QYXJhbWV0ZXJzCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWJ5dGVbXSkKLQotc3RhdGljIGphdmEuc2VjdXJpdHkuQWxnb3JpdGhtUGFyYW1ldGVycyBhY2Nlc3MkMDAwKAotamF2YXguY3J5cHRvLkVuY3J5cHRlZFByaXZhdGVLZXlJbmZvKQotCi1zdGF0aWMgYnl0ZVtdIGFjY2VzcyQxMDAoKQotCi1zdGF0aWMgamF2YS5sYW5nLlN0cmluZyBhY2Nlc3MkMjAwKAotamF2YXguY3J5cHRvLkVuY3J5cHRlZFByaXZhdGVLZXlJbmZvKQotCi1zdGF0aWMgYnl0ZVtdIGFjY2VzcyQzMDAoCi1qYXZheC5jcnlwdG8uRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8pCi0KLXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNOdWxsVmFsdWUoCi1ieXRlW10pCi0KLXByaXZhdGUgYm9vbGVhbiBtYXBBbGdOYW1lKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QWxnTmFtZSgpCi0KLXB1YmxpYyBqYXZhLnNlY3VyaXR5LkFsZ29yaXRobVBhcmFtZXRlcnMgZ2V0QWxnUGFyYW1ldGVycygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBieXRlW10gZ2V0RW5jb2RlZCgpCi0KLXB1YmxpYyBieXRlW10gZ2V0RW5jcnlwdGVkRGF0YSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnNlY3VyaXR5LnNwZWMuUEtDUzhFbmNvZGVkS2V5U3BlYyBnZXRLZXlTcGVjKAotamF2YS5zZWN1cml0eS5LZXkpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvTm9TdWNoUHJvdmlkZXJFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnNlY3VyaXR5LnNwZWMuUEtDUzhFbmNvZGVkS2V5U3BlYyBnZXRLZXlTcGVjKAotamF2YS5zZWN1cml0eS5LZXkKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnNlY3VyaXR5LnNwZWMuUEtDUzhFbmNvZGVkS2V5U3BlYyBnZXRLZXlTcGVjKAotamF2YS5zZWN1cml0eS5LZXkKLWphdmEuc2VjdXJpdHkuUHJvdmlkZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvc3BlYy9JbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuc2VjdXJpdHkuc3BlYy5QS0NTOEVuY29kZWRLZXlTcGVjIGdldEtleVNwZWMoCi1qYXZheC5jcnlwdG8uQ2lwaGVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmF4LmNyeXB0by5FeGVtcHRpb25NZWNoYW5pc20gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5mb3J0cmVzcy5FbmdpbmUgZW5naW5lCi0KLXByaXZhdGUgYm9vbGVhbiBnZW5lcmF0ZWQKLQotcHJpdmF0ZSBqYXZhLnNlY3VyaXR5LktleSBpbml0S2V5Ci0KLXByaXZhdGUgYm9vbGVhbiBpc0luaXQKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIG1lY2hhbmlzbQotCi1wcml2YXRlIGZpbmFsIGphdmEuc2VjdXJpdHkuUHJvdmlkZXIgcHJvdmlkZXIKLQotcHJpdmF0ZSBmaW5hbCBqYXZheC5jcnlwdG8uRXhlbXB0aW9uTWVjaGFuaXNtU3BpIHNwaUltcGwKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLWphdmF4LmNyeXB0by5FeGVtcHRpb25NZWNoYW5pc21TcGkKLWphdmEuc2VjdXJpdHkuUHJvdmlkZXIKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmF4LmNyeXB0by5FeGVtcHRpb25NZWNoYW5pc20gZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9Ob1N1Y2hQcm92aWRlckV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZheC5jcnlwdG8uRXhlbXB0aW9uTWVjaGFuaXNtIGdldEluc3RhbmNlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YXguY3J5cHRvLkV4ZW1wdGlvbk1lY2hhbmlzbSBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEuc2VjdXJpdHkuUHJvdmlkZXIpCi0KLXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbjtMamF2YXgvY3J5cHRvL1Nob3J0QnVmZmVyRXhjZXB0aW9uO0xqYXZheC9jcnlwdG8vRXhlbXB0aW9uTWVjaGFuaXNtRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgaW50IGdlbkV4ZW1wdGlvbkJsb2IoCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247TGphdmF4L2NyeXB0by9TaG9ydEJ1ZmZlckV4Y2VwdGlvbjtMamF2YXgvY3J5cHRvL0V4ZW1wdGlvbk1lY2hhbmlzbUV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIGludCBnZW5FeGVtcHRpb25CbG9iKAotYnl0ZVtdCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247TGphdmF4L2NyeXB0by9FeGVtcHRpb25NZWNoYW5pc21FeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBieXRlW10gZ2VuRXhlbXB0aW9uQmxvYigpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGdldE5hbWUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgaW50IGdldE91dHB1dFNpemUoCi1pbnQpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyIGdldFByb3ZpZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uO0xqYXZheC9jcnlwdG8vRXhlbXB0aW9uTWVjaGFuaXNtRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgdm9pZCBpbml0KAotamF2YS5zZWN1cml0eS5LZXkpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uO0xqYXZheC9jcnlwdG8vRXhlbXB0aW9uTWVjaGFuaXNtRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgdm9pZCBpbml0KAotamF2YS5zZWN1cml0eS5LZXkKLWphdmEuc2VjdXJpdHkuQWxnb3JpdGhtUGFyYW1ldGVycykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L0ludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb247TGphdmF4L2NyeXB0by9FeGVtcHRpb25NZWNoYW5pc21FeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCB2b2lkIGluaXQoCi1qYXZhLnNlY3VyaXR5LktleQotamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmF4L2NyeXB0by9FeGVtcHRpb25NZWNoYW5pc21FeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBib29sZWFuIGlzQ3J5cHRvQWxsb3dlZCgKLWphdmEuc2VjdXJpdHkuS2V5KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmF4LmNyeXB0by5FeGVtcHRpb25NZWNoYW5pc21FeGNlcHRpb24gZXh0ZW5kcyBqYXZhLnNlY3VyaXR5LkdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGphdmF4LmNyeXB0by5FeGVtcHRpb25NZWNoYW5pc21TcGkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YXgvY3J5cHRvL1Nob3J0QnVmZmVyRXhjZXB0aW9uO0xqYXZheC9jcnlwdG8vRXhlbXB0aW9uTWVjaGFuaXNtRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgYWJzdHJhY3QgaW50IGVuZ2luZUdlbkV4ZW1wdGlvbkJsb2IoCi1ieXRlW10KLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YXgvY3J5cHRvL0V4ZW1wdGlvbk1lY2hhbmlzbUV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGFic3RyYWN0IGJ5dGVbXSBlbmdpbmVHZW5FeGVtcHRpb25CbG9iKCkKLQotcHJvdGVjdGVkIGFic3RyYWN0IGludCBlbmdpbmVHZXRPdXRwdXRTaXplKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247TGphdmF4L2NyeXB0by9FeGVtcHRpb25NZWNoYW5pc21FeGNlcHRpb247ICkKLXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVuZ2luZUluaXQoCi1qYXZhLnNlY3VyaXR5LktleSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L0ludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb247TGphdmF4L2NyeXB0by9FeGVtcHRpb25NZWNoYW5pc21FeGNlcHRpb247ICkKLXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVuZ2luZUluaXQoCi1qYXZhLnNlY3VyaXR5LktleQotamF2YS5zZWN1cml0eS5BbGdvcml0aG1QYXJhbWV0ZXJzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjtMamF2YXgvY3J5cHRvL0V4ZW1wdGlvbk1lY2hhbmlzbUV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW5naW5lSW5pdCgKLWphdmEuc2VjdXJpdHkuS2V5Ci1qYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZheC5jcnlwdG8uTWFjU3BpIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9DbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgY2xvbmUoKQotCi1wcm90ZWN0ZWQgYWJzdHJhY3QgYnl0ZVtdIGVuZ2luZURvRmluYWwoKQotCi1wcm90ZWN0ZWQgYWJzdHJhY3QgaW50IGVuZ2luZUdldE1hY0xlbmd0aCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBlbmdpbmVJbml0KAotamF2YS5zZWN1cml0eS5LZXkKLWphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjKQotCi1wcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBlbmdpbmVSZXNldCgpCi0KLXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVuZ2luZVVwZGF0ZSgKLWJ5dGUpCi0KLXByb3RlY3RlZCB2b2lkIGVuZ2luZVVwZGF0ZSgKLWphdmEubmlvLkJ5dGVCdWZmZXIpCi0KLXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVuZ2luZVVwZGF0ZSgKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi0gY2xhc3MgamF2YXguY3J5cHRvLkhtYWNTcGkgZXh0ZW5kcyBqYXZheC5jcnlwdG8uTWFjU3BpCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0gbURhdGEKLQotcHJpdmF0ZSBqYXZhLnNlY3VyaXR5LktleSBtS2V5Ci0KLXByaXZhdGUgamF2YS5sYW5nLk9iamVjdCBtU3luYwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgbmF0aXZlIGJ5dGVbXSBuYXRpdmVfY29tcHV0ZV9zaGExX2htYWMoCi1ieXRlW10KLWJ5dGVbXSkKLQotcHJvdGVjdGVkIGJ5dGVbXSBlbmdpbmVEb0ZpbmFsKCkKLQotcHJvdGVjdGVkIGludCBlbmdpbmVHZXRNYWNMZW5ndGgoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgZW5naW5lSW5pdCgKLWphdmEuc2VjdXJpdHkuS2V5Ci1qYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYykKLQotcHJvdGVjdGVkIHZvaWQgZW5naW5lUmVzZXQoKQotCi1wcm90ZWN0ZWQgdm9pZCBlbmdpbmVVcGRhdGUoCi1ieXRlKQotCi1wcm90ZWN0ZWQgdm9pZCBlbmdpbmVVcGRhdGUoCi1ieXRlW10KLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmF4LmNyeXB0by5JbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5zZWN1cml0eS5HZW5lcmFsU2VjdXJpdHlFeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZheC5jcnlwdG8uS2V5QWdyZWVtZW50IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuZm9ydHJlc3MuRW5naW5lIGVuZ2luZQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSBybmRtCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBhbGdvcml0aG0KLQotcHJpdmF0ZSBmaW5hbCBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyIHByb3ZpZGVyCi0KLXByaXZhdGUgZmluYWwgamF2YXguY3J5cHRvLktleUFncmVlbWVudFNwaSBzcGlJbXBsCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oCi1qYXZheC5jcnlwdG8uS2V5QWdyZWVtZW50U3BpCi1qYXZhLnNlY3VyaXR5LlByb3ZpZGVyCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZheC5jcnlwdG8uS2V5QWdyZWVtZW50IGdldEluc3RhbmNlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247TGphdmEvc2VjdXJpdHkvTm9TdWNoUHJvdmlkZXJFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YXguY3J5cHRvLktleUFncmVlbWVudCBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmF4LmNyeXB0by5LZXlBZ3JlZW1lbnQgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnNlY3VyaXR5LlByb3ZpZGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBqYXZhLnNlY3VyaXR5LktleSBkb1BoYXNlKAotamF2YS5zZWN1cml0eS5LZXkKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247TGphdmF4L2NyeXB0by9TaG9ydEJ1ZmZlckV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIGludCBnZW5lcmF0ZVNlY3JldCgKLWJ5dGVbXQotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgamF2YXguY3J5cHRvLlNlY3JldEtleSBnZW5lcmF0ZVNlY3JldCgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBieXRlW10gZ2VuZXJhdGVTZWNyZXQoKQotCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBnZXRBbGdvcml0aG0oKQotCi1wdWJsaWMgZmluYWwgamF2YS5zZWN1cml0eS5Qcm92aWRlciBnZXRQcm92aWRlcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIHZvaWQgaW5pdCgKLWphdmEuc2VjdXJpdHkuS2V5KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCB2b2lkIGluaXQoCi1qYXZhLnNlY3VyaXR5LktleQotamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgdm9pZCBpbml0KAotamF2YS5zZWN1cml0eS5LZXkKLWphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIHZvaWQgaW5pdCgKLWphdmEuc2VjdXJpdHkuS2V5Ci1qYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYwotamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgamF2YXguY3J5cHRvLktleUFncmVlbWVudFNwaSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247ICkKLXByb3RlY3RlZCBhYnN0cmFjdCBqYXZhLnNlY3VyaXR5LktleSBlbmdpbmVEb1BoYXNlKAotamF2YS5zZWN1cml0eS5LZXkKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247TGphdmF4L2NyeXB0by9TaG9ydEJ1ZmZlckV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGFic3RyYWN0IGludCBlbmdpbmVHZW5lcmF0ZVNlY3JldCgKLWJ5dGVbXQotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgYWJzdHJhY3QgamF2YXguY3J5cHRvLlNlY3JldEtleSBlbmdpbmVHZW5lcmF0ZVNlY3JldCgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247ICkKLXByb3RlY3RlZCBhYnN0cmFjdCBieXRlW10gZW5naW5lR2VuZXJhdGVTZWNyZXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247ICkKLXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVuZ2luZUluaXQoCi1qYXZhLnNlY3VyaXR5LktleQotamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBlbmdpbmVJbml0KAotamF2YS5zZWN1cml0eS5LZXkKLWphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjCi1qYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZheC5jcnlwdG8uS2V5R2VuZXJhdG9yIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuZm9ydHJlc3MuRW5naW5lIGVuZ2luZQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSBybmRtCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBhbGdvcml0aG0KLQotcHJpdmF0ZSBmaW5hbCBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyIHByb3ZpZGVyCi0KLXByaXZhdGUgZmluYWwgamF2YXguY3J5cHRvLktleUdlbmVyYXRvclNwaSBzcGlJbXBsCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oCi1qYXZheC5jcnlwdG8uS2V5R2VuZXJhdG9yU3BpCi1qYXZhLnNlY3VyaXR5LlByb3ZpZGVyCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZheC5jcnlwdG8uS2V5R2VuZXJhdG9yIGdldEluc3RhbmNlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247TGphdmEvc2VjdXJpdHkvTm9TdWNoUHJvdmlkZXJFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YXguY3J5cHRvLktleUdlbmVyYXRvciBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmF4LmNyeXB0by5LZXlHZW5lcmF0b3IgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnNlY3VyaXR5LlByb3ZpZGVyKQotCi1wdWJsaWMgZmluYWwgamF2YXguY3J5cHRvLlNlY3JldEtleSBnZW5lcmF0ZUtleSgpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGdldEFsZ29yaXRobSgpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyIGdldFByb3ZpZGVyKCkKLQotcHVibGljIGZpbmFsIHZvaWQgaW5pdCgKLWludCkKLQotcHVibGljIGZpbmFsIHZvaWQgaW5pdCgKLWludAotamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20pCi0KLXB1YmxpYyBmaW5hbCB2b2lkIGluaXQoCi1qYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgdm9pZCBpbml0KAotamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIHZvaWQgaW5pdCgKLWphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjCi1qYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZheC5jcnlwdG8uS2V5R2VuZXJhdG9yU3BpIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByb3RlY3RlZCBhYnN0cmFjdCBqYXZheC5jcnlwdG8uU2VjcmV0S2V5IGVuZ2luZUdlbmVyYXRlS2V5KCkKLQotcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW5naW5lSW5pdCgKLWludAotamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20pCi0KLXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVuZ2luZUluaXQoCi1qYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBlbmdpbmVJbml0KAotamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWMKLWphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmF4LmNyeXB0by5NYWMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5sYW5nLkNsb25lYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuZm9ydHJlc3MuRW5naW5lIGVuZ2luZQotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgYWxnb3JpdGhtCi0KLXByaXZhdGUgYm9vbGVhbiBpc0luaXRNYWMKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyIHByb3ZpZGVyCi0KLXByaXZhdGUgZmluYWwgamF2YXguY3J5cHRvLk1hY1NwaSBzcGlJbXBsCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oCi1qYXZheC5jcnlwdG8uTWFjU3BpCi1qYXZhLnNlY3VyaXR5LlByb3ZpZGVyCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZheC5jcnlwdG8uTWFjIGdldEluc3RhbmNlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247TGphdmEvc2VjdXJpdHkvTm9TdWNoUHJvdmlkZXJFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YXguY3J5cHRvLk1hYyBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmF4LmNyeXB0by5NYWMgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnNlY3VyaXR5LlByb3ZpZGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBqYXZhLmxhbmcuT2JqZWN0IGNsb25lKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YXgvY3J5cHRvL1Nob3J0QnVmZmVyRXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgdm9pZCBkb0ZpbmFsKAotYnl0ZVtdCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBieXRlW10gZG9GaW5hbCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBieXRlW10gZG9GaW5hbCgKLWJ5dGVbXSkKLQotcHVibGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgZ2V0QWxnb3JpdGhtKCkKLQotcHVibGljIGZpbmFsIGludCBnZXRNYWNMZW5ndGgoKQotCi1wdWJsaWMgZmluYWwgamF2YS5zZWN1cml0eS5Qcm92aWRlciBnZXRQcm92aWRlcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIHZvaWQgaW5pdCgKLWphdmEuc2VjdXJpdHkuS2V5KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIHZvaWQgaW5pdCgKLWphdmEuc2VjdXJpdHkuS2V5Ci1qYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYykKLQotcHVibGljIGZpbmFsIHZvaWQgcmVzZXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgdm9pZCB1cGRhdGUoCi1ieXRlKQotCi1wdWJsaWMgZmluYWwgdm9pZCB1cGRhdGUoCi1qYXZhLm5pby5CeXRlQnVmZmVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgdm9pZCB1cGRhdGUoCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCB2b2lkIHVwZGF0ZSgKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YXguY3J5cHRvLk5vU3VjaFBhZGRpbmdFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLnNlY3VyaXR5LkdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmF4LmNyeXB0by5OdWxsQ2lwaGVyIGV4dGVuZHMgamF2YXguY3J5cHRvLkNpcGhlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YXguY3J5cHRvLlNlYWxlZE9iamVjdCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJvdGVjdGVkIGJ5dGVbXSBlbmNvZGVkUGFyYW1zCi0KLXByaXZhdGUgYnl0ZVtdIGVuY3J5cHRlZENvbnRlbnQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHBhcmFtc0FsZwotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgc2VhbEFsZwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmF4L2NyeXB0by9JbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmlvLlNlcmlhbGl6YWJsZQotamF2YXguY3J5cHRvLkNpcGhlcikKLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotamF2YXguY3J5cHRvLlNlYWxlZE9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9sYW5nL0NsYXNzTm90Rm91bmRFeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCByZWFkT2JqZWN0KAotamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSkKLQotcHVibGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgZ2V0QWxnb3JpdGhtKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9sYW5nL0NsYXNzTm90Rm91bmRFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBqYXZhLmxhbmcuT2JqZWN0IGdldE9iamVjdCgKLWphdmEuc2VjdXJpdHkuS2V5KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL2xhbmcvQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247TGphdmEvc2VjdXJpdHkvTm9TdWNoUHJvdmlkZXJFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIGphdmEubGFuZy5PYmplY3QgZ2V0T2JqZWN0KAotamF2YS5zZWN1cml0eS5LZXkKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uO0xqYXZheC9jcnlwdG8vSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbjtMamF2YXgvY3J5cHRvL0JhZFBhZGRpbmdFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBqYXZhLmxhbmcuT2JqZWN0IGdldE9iamVjdCgKLWphdmF4LmNyeXB0by5DaXBoZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmF4LmNyeXB0by5TZWNyZXRLZXkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5LZXkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmF4LmNyeXB0by5TZWNyZXRLZXlGYWN0b3J5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuZm9ydHJlc3MuRW5naW5lIGVuZ2luZQotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgYWxnb3JpdGhtCi0KLXByaXZhdGUgZmluYWwgamF2YS5zZWN1cml0eS5Qcm92aWRlciBwcm92aWRlcgotCi1wcml2YXRlIGZpbmFsIGphdmF4LmNyeXB0by5TZWNyZXRLZXlGYWN0b3J5U3BpIHNwaUltcGwKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLWphdmF4LmNyeXB0by5TZWNyZXRLZXlGYWN0b3J5U3BpCi1qYXZhLnNlY3VyaXR5LlByb3ZpZGVyCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZheC5jcnlwdG8uU2VjcmV0S2V5RmFjdG9yeSBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L05vU3VjaFByb3ZpZGVyRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmF4LmNyeXB0by5TZWNyZXRLZXlGYWN0b3J5IGdldEluc3RhbmNlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YXguY3J5cHRvLlNlY3JldEtleUZhY3RvcnkgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnNlY3VyaXR5LlByb3ZpZGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L3NwZWMvSW52YWxpZEtleVNwZWNFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBqYXZheC5jcnlwdG8uU2VjcmV0S2V5IGdlbmVyYXRlU2VjcmV0KAotamF2YS5zZWN1cml0eS5zcGVjLktleVNwZWMpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGdldEFsZ29yaXRobSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvc3BlYy9JbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIGphdmEuc2VjdXJpdHkuc3BlYy5LZXlTcGVjIGdldEtleVNwZWMoCi1qYXZheC5jcnlwdG8uU2VjcmV0S2V5Ci1qYXZhLmxhbmcuQ2xhc3MpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyIGdldFByb3ZpZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgamF2YXguY3J5cHRvLlNlY3JldEtleSB0cmFuc2xhdGVLZXkoCi1qYXZheC5jcnlwdG8uU2VjcmV0S2V5KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGphdmF4LmNyeXB0by5TZWNyZXRLZXlGYWN0b3J5U3BpIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvc3BlYy9JbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGFic3RyYWN0IGphdmF4LmNyeXB0by5TZWNyZXRLZXkgZW5naW5lR2VuZXJhdGVTZWNyZXQoCi1qYXZhLnNlY3VyaXR5LnNwZWMuS2V5U3BlYykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9zcGVjL0ludmFsaWRLZXlTcGVjRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgYWJzdHJhY3QgamF2YS5zZWN1cml0eS5zcGVjLktleVNwZWMgZW5naW5lR2V0S2V5U3BlYygKLWphdmF4LmNyeXB0by5TZWNyZXRLZXkKLWphdmEubGFuZy5DbGFzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgYWJzdHJhY3QgamF2YXguY3J5cHRvLlNlY3JldEtleSBlbmdpbmVUcmFuc2xhdGVLZXkoCi1qYXZheC5jcnlwdG8uU2VjcmV0S2V5KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmF4LmNyeXB0by5TaG9ydEJ1ZmZlckV4Y2VwdGlvbiBleHRlbmRzIGphdmEuc2VjdXJpdHkuR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmF4LmNyeXB0by5pbnRlcmZhY2VzLkRIS2V5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZheC5jcnlwdG8uc3BlYy5ESFBhcmFtZXRlclNwZWMgZ2V0UGFyYW1zKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgamF2YXguY3J5cHRvLmludGVyZmFjZXMuREhQcml2YXRlS2V5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmF4LmNyeXB0by5pbnRlcmZhY2VzLkRIS2V5LCBqYXZhLnNlY3VyaXR5LlByaXZhdGVLZXkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5tYXRoLkJpZ0ludGVnZXIgZ2V0WCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmF4LmNyeXB0by5pbnRlcmZhY2VzLkRIUHVibGljS2V5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmF4LmNyeXB0by5pbnRlcmZhY2VzLkRIS2V5LCBqYXZhLnNlY3VyaXR5LlB1YmxpY0tleQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRZKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgamF2YXguY3J5cHRvLmludGVyZmFjZXMuUEJFS2V5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmF4LmNyeXB0by5TZWNyZXRLZXkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldEl0ZXJhdGlvbkNvdW50KCkKLQotcHVibGljIGFic3RyYWN0IGNoYXJbXSBnZXRQYXNzd29yZCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBieXRlW10gZ2V0U2FsdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YXguY3J5cHRvLnNwZWMuREVTS2V5U3BlYyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnNlY3VyaXR5LnNwZWMuS2V5U3BlYwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVNfS0VZX0xFTgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW11bXSBTRU1JV0VBS1MKLQotcHJpdmF0ZSBmaW5hbCBieXRlW10ga2V5Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ieXRlW10KLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQYXJpdHlBZGp1c3RlZCgKLWJ5dGVbXQotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1dlYWsoCi1ieXRlW10KLWludCkKLQotcHVibGljIGJ5dGVbXSBnZXRLZXkoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmF4LmNyeXB0by5zcGVjLkRFU2VkZUtleVNwZWMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5zcGVjLktleVNwZWMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVTX0VERV9LRVlfTEVOCi0KLXByaXZhdGUgZmluYWwgYnl0ZVtdIGtleQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWJ5dGVbXQotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Bhcml0eUFkanVzdGVkKAotYnl0ZVtdCi1pbnQpCi0KLXB1YmxpYyBieXRlW10gZ2V0S2V5KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZheC5jcnlwdG8uc3BlYy5ESEdlblBhcmFtZXRlclNwZWMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBpbnQgZXhwb25lbnRTaXplCi0KLXByaXZhdGUgZmluYWwgaW50IHByaW1lU2l6ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotaW50KQotCi1wdWJsaWMgaW50IGdldEV4cG9uZW50U2l6ZSgpCi0KLXB1YmxpYyBpbnQgZ2V0UHJpbWVTaXplKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZheC5jcnlwdG8uc3BlYy5ESFBhcmFtZXRlclNwZWMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBqYXZhLm1hdGguQmlnSW50ZWdlciBnCi0KLXByaXZhdGUgZmluYWwgaW50IGwKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLm1hdGguQmlnSW50ZWdlciBwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5tYXRoLkJpZ0ludGVnZXIKLWphdmEubWF0aC5CaWdJbnRlZ2VyKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLm1hdGguQmlnSW50ZWdlcgotamF2YS5tYXRoLkJpZ0ludGVnZXIKLWludCkKLQotcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldEcoKQotCi1wdWJsaWMgaW50IGdldEwoKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgZ2V0UCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YXguY3J5cHRvLnNwZWMuREhQcml2YXRlS2V5U3BlYyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnNlY3VyaXR5LnNwZWMuS2V5U3BlYwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGphdmEubWF0aC5CaWdJbnRlZ2VyIGcKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLm1hdGguQmlnSW50ZWdlciBwCi0KLXByaXZhdGUgZmluYWwgamF2YS5tYXRoLkJpZ0ludGVnZXIgeAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1qYXZhLm1hdGguQmlnSW50ZWdlcgotamF2YS5tYXRoLkJpZ0ludGVnZXIpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRHKCkKLQotcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldFAoKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgZ2V0WCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YXguY3J5cHRvLnNwZWMuREhQdWJsaWNLZXlTcGVjIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuc3BlYy5LZXlTcGVjCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgamF2YS5tYXRoLkJpZ0ludGVnZXIgZwotCi1wcml2YXRlIGZpbmFsIGphdmEubWF0aC5CaWdJbnRlZ2VyIHAKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLm1hdGguQmlnSW50ZWdlciB5Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5tYXRoLkJpZ0ludGVnZXIKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1qYXZhLm1hdGguQmlnSW50ZWdlcikKLQotcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldEcoKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgZ2V0UCgpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRZKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZheC5jcnlwdG8uc3BlYy5JdlBhcmFtZXRlclNwZWMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBieXRlW10gaXYKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ieXRlW10pCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyBieXRlW10gZ2V0SVYoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmF4LmNyeXB0by5zcGVjLk9BRVBQYXJhbWV0ZXJTcGVjIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YXguY3J5cHRvLnNwZWMuT0FFUFBhcmFtZXRlclNwZWMgREVGQVVMVAotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgbWROYW1lCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBtZ2ZOYW1lCi0KLXByaXZhdGUgZmluYWwgamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWMgbWdmU3BlYwotCi1wcml2YXRlIGZpbmFsIGphdmF4LmNyeXB0by5zcGVjLlBTb3VyY2UgcFNyYwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjCi1qYXZheC5jcnlwdG8uc3BlYy5QU291cmNlKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXREaWdlc3RBbGdvcml0aG0oKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRNR0ZBbGdvcml0aG0oKQotCi1wdWJsaWMgamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWMgZ2V0TUdGUGFyYW1ldGVycygpCi0KLXB1YmxpYyBqYXZheC5jcnlwdG8uc3BlYy5QU291cmNlIGdldFBTb3VyY2UoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmF4LmNyeXB0by5zcGVjLlBCRUtleVNwZWMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5zcGVjLktleVNwZWMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBpbnQgaXRlcmF0aW9uQ291bnQKLQotcHJpdmF0ZSBmaW5hbCBpbnQga2V5TGVuZ3RoCi0KLXByaXZhdGUgY2hhcltdIHBhc3N3b3JkCi0KLXByaXZhdGUgZmluYWwgYnl0ZVtdIHNhbHQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1jaGFyW10pCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWNoYXJbXQotYnl0ZVtdCi1pbnQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWNoYXJbXQotYnl0ZVtdCi1pbnQKLWludCkKLQotcHVibGljIGZpbmFsIHZvaWQgY2xlYXJQYXNzd29yZCgpCi0KLXB1YmxpYyBmaW5hbCBpbnQgZ2V0SXRlcmF0aW9uQ291bnQoKQotCi1wdWJsaWMgZmluYWwgaW50IGdldEtleUxlbmd0aCgpCi0KLXB1YmxpYyBmaW5hbCBjaGFyW10gZ2V0UGFzc3dvcmQoKQotCi1wdWJsaWMgZmluYWwgYnl0ZVtdIGdldFNhbHQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmF4LmNyeXB0by5zcGVjLlBCRVBhcmFtZXRlclNwZWMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBpbnQgaXRlcmF0aW9uQ291bnQKLQotcHJpdmF0ZSBmaW5hbCBieXRlW10gc2FsdAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWJ5dGVbXQotaW50KQotCi1wdWJsaWMgaW50IGdldEl0ZXJhdGlvbkNvdW50KCkKLQotcHVibGljIGJ5dGVbXSBnZXRTYWx0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxqYXZheC9jcnlwdG8vc3BlYy9QU291cmNlJFBTcGVjaWZpZWQ7ICkKLXB1YmxpYyBjbGFzcyBqYXZheC5jcnlwdG8uc3BlYy5QU291cmNlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcFNyY05hbWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QWxnb3JpdGhtKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YXgvY3J5cHRvL3NwZWMvUFNvdXJjZTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNSBuYW1lID1QU3BlY2lmaWVkICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBqYXZheC5jcnlwdG8uc3BlYy5QU291cmNlJFBTcGVjaWZpZWQgZXh0ZW5kcyBqYXZheC5jcnlwdG8uc3BlYy5QU291cmNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YXguY3J5cHRvLnNwZWMuUFNvdXJjZSRQU3BlY2lmaWVkIERFRkFVTFQKLQotcHJpdmF0ZSBmaW5hbCBieXRlW10gcAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWJ5dGVbXSkKLQotcHVibGljIGJ5dGVbXSBnZXRWYWx1ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YXguY3J5cHRvLnNwZWMuUkMyUGFyYW1ldGVyU3BlYyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGludCBlZmZlY3RpdmVLZXlCaXRzCi0KLXByaXZhdGUgZmluYWwgYnl0ZVtdIGl2Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWJ5dGVbXSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50Ci1ieXRlW10KLWludCkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGludCBnZXRFZmZlY3RpdmVLZXlCaXRzKCkKLQotcHVibGljIGJ5dGVbXSBnZXRJVigpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmF4LmNyeXB0by5zcGVjLlJDNVBhcmFtZXRlclNwZWMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBieXRlW10gaXYKLQotcHJpdmF0ZSBmaW5hbCBpbnQgcm91bmRzCi0KLXByaXZhdGUgZmluYWwgaW50IHZlcnNpb24KLQotcHJpdmF0ZSBmaW5hbCBpbnQgd29yZFNpemUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWludAotaW50Ci1ieXRlW10pCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotaW50Ci1pbnQKLWJ5dGVbXQotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYnl0ZVtdIGdldElWKCkKLQotcHVibGljIGludCBnZXRSb3VuZHMoKQotCi1wdWJsaWMgaW50IGdldFZlcnNpb24oKQotCi1wdWJsaWMgaW50IGdldFdvcmRTaXplKCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YXguY3J5cHRvLnNwZWMuU2VjcmV0S2V5U3BlYyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZheC5jcnlwdG8uU2VjcmV0S2V5LCBqYXZhLnNlY3VyaXR5LnNwZWMuS2V5U3BlYywgamF2YS5pby5TZXJpYWxpemFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBhbGdvcml0aG0KLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGZvcm1hdAotCi1wcml2YXRlIGZpbmFsIGJ5dGVbXSBrZXkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ieXRlW10KLWludAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ieXRlW10KLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEFsZ29yaXRobSgpCi0KLXB1YmxpYyBieXRlW10gZ2V0RW5jb2RlZCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEZvcm1hdCgpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGphdmF4Lm5ldC5TZXJ2ZXJTb2NrZXRGYWN0b3J5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgamF2YXgubmV0LlNlcnZlclNvY2tldEZhY3RvcnkgZGVmYXVsdEZhY3RvcnkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGphdmF4Lm5ldC5TZXJ2ZXJTb2NrZXRGYWN0b3J5IGdldERlZmF1bHQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5uZXQuU2VydmVyU29ja2V0IGNyZWF0ZVNlcnZlclNvY2tldCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQgY3JlYXRlU2VydmVyU29ja2V0KAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5uZXQuU2VydmVyU29ja2V0IGNyZWF0ZVNlcnZlclNvY2tldCgKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5uZXQuU2VydmVyU29ja2V0IGNyZWF0ZVNlcnZlclNvY2tldCgKLWludAotaW50Ci1qYXZhLm5ldC5JbmV0QWRkcmVzcykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLSBjbGFzcyBqYXZheC5uZXQuRGVmYXVsdFNlcnZlclNvY2tldEZhY3RvcnkgZXh0ZW5kcyBqYXZheC5uZXQuU2VydmVyU29ja2V0RmFjdG9yeQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQgY3JlYXRlU2VydmVyU29ja2V0KAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5uZXQuU2VydmVyU29ja2V0IGNyZWF0ZVNlcnZlclNvY2tldCgKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5uZXQuU2VydmVyU29ja2V0IGNyZWF0ZVNlcnZlclNvY2tldCgKLWludAotaW50Ci1qYXZhLm5ldC5JbmV0QWRkcmVzcykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZheC5uZXQuU29ja2V0RmFjdG9yeSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGphdmF4Lm5ldC5Tb2NrZXRGYWN0b3J5IGRlZmF1bHRGYWN0b3J5Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBqYXZheC5uZXQuU29ja2V0RmFjdG9yeSBnZXREZWZhdWx0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubmV0LlNvY2tldCBjcmVhdGVTb2NrZXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL25ldC9Vbmtub3duSG9zdEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubmV0LlNvY2tldCBjcmVhdGVTb2NrZXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvbmV0L1Vua25vd25Ib3N0RXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5uZXQuU29ja2V0IGNyZWF0ZVNvY2tldCgKLWphdmEubGFuZy5TdHJpbmcKLWludAotamF2YS5uZXQuSW5ldEFkZHJlc3MKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubmV0LlNvY2tldCBjcmVhdGVTb2NrZXQoCi1qYXZhLm5ldC5JbmV0QWRkcmVzcwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5uZXQuU29ja2V0IGNyZWF0ZVNvY2tldCgKLWphdmEubmV0LkluZXRBZGRyZXNzCi1pbnQKLWphdmEubmV0LkluZXRBZGRyZXNzCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi0gY2xhc3MgamF2YXgubmV0LkRlZmF1bHRTb2NrZXRGYWN0b3J5IGV4dGVuZHMgamF2YXgubmV0LlNvY2tldEZhY3RvcnkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5uZXQuU29ja2V0IGNyZWF0ZVNvY2tldCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvbmV0L1Vua25vd25Ib3N0RXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5uZXQuU29ja2V0IGNyZWF0ZVNvY2tldCgKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9uZXQvVW5rbm93bkhvc3RFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLm5ldC5Tb2NrZXQgY3JlYXRlU29ja2V0KAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1qYXZhLm5ldC5JbmV0QWRkcmVzcwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5uZXQuU29ja2V0IGNyZWF0ZVNvY2tldCgKLWphdmEubmV0LkluZXRBZGRyZXNzCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLm5ldC5Tb2NrZXQgY3JlYXRlU29ja2V0KAotamF2YS5uZXQuSW5ldEFkZHJlc3MKLWludAotamF2YS5uZXQuSW5ldEFkZHJlc3MKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgamF2YXgubmV0LnNzbC5NYW5hZ2VyRmFjdG9yeVBhcmFtZXRlcnMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZheC5uZXQuc3NsLkNlcnRQYXRoVHJ1c3RNYW5hZ2VyUGFyYW1ldGVycyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZheC5uZXQuc3NsLk1hbmFnZXJGYWN0b3J5UGFyYW1ldGVycwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0UGF0aFBhcmFtZXRlcnMgcGFyYW0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGhQYXJhbWV0ZXJzKQotCi1wdWJsaWMgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoUGFyYW1ldGVycyBnZXRQYXJhbWV0ZXJzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZheC5uZXQuc3NsLlNTTENvbnRleHQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0VSVklDRQotCi1wcml2YXRlIHN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuZm9ydHJlc3MuRW5naW5lIGVuZ2luZQotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgcHJvdG9jb2wKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyIHByb3ZpZGVyCi0KLXByaXZhdGUgZmluYWwgamF2YXgubmV0LnNzbC5TU0xDb250ZXh0U3BpIHNwaUltcGwKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLWphdmF4Lm5ldC5zc2wuU1NMQ29udGV4dFNwaQotamF2YS5zZWN1cml0eS5Qcm92aWRlcgotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgamF2YXgubmV0LnNzbC5TU0xDb250ZXh0IGdldEluc3RhbmNlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247TGphdmEvc2VjdXJpdHkvTm9TdWNoUHJvdmlkZXJFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgamF2YXgubmV0LnNzbC5TU0xDb250ZXh0IGdldEluc3RhbmNlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgamF2YXgubmV0LnNzbC5TU0xDb250ZXh0IGdldEluc3RhbmNlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5zZWN1cml0eS5Qcm92aWRlcikKLQotcHVibGljIGZpbmFsIGphdmF4Lm5ldC5zc2wuU1NMRW5naW5lIGNyZWF0ZVNTTEVuZ2luZSgpCi0KLXB1YmxpYyBmaW5hbCBqYXZheC5uZXQuc3NsLlNTTEVuZ2luZSBjcmVhdGVTU0xFbmdpbmUoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyBmaW5hbCBqYXZheC5uZXQuc3NsLlNTTFNlc3Npb25Db250ZXh0IGdldENsaWVudFNlc3Npb25Db250ZXh0KCkKLQotcHVibGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgZ2V0UHJvdG9jb2woKQotCi1wdWJsaWMgZmluYWwgamF2YS5zZWN1cml0eS5Qcm92aWRlciBnZXRQcm92aWRlcigpCi0KLXB1YmxpYyBmaW5hbCBqYXZheC5uZXQuc3NsLlNTTFNlc3Npb25Db250ZXh0IGdldFNlcnZlclNlc3Npb25Db250ZXh0KCkKLQotcHVibGljIGZpbmFsIGphdmF4Lm5ldC5zc2wuU1NMU2VydmVyU29ja2V0RmFjdG9yeSBnZXRTZXJ2ZXJTb2NrZXRGYWN0b3J5KCkKLQotcHVibGljIGZpbmFsIGphdmF4Lm5ldC5zc2wuU1NMU29ja2V0RmFjdG9yeSBnZXRTb2NrZXRGYWN0b3J5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9LZXlNYW5hZ2VtZW50RXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgdm9pZCBpbml0KAotamF2YXgubmV0LnNzbC5LZXlNYW5hZ2VyW10KLWphdmF4Lm5ldC5zc2wuVHJ1c3RNYW5hZ2VyW10KLWphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotIGNsYXNzIGphdmF4Lm5ldC5zc2wuQ29udGV4dEltcGwgZXh0ZW5kcyBqYXZheC5uZXQuc3NsLlNTTENvbnRleHQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZheC5uZXQuc3NsLlNTTENvbnRleHRTcGkKLWphdmEuc2VjdXJpdHkuUHJvdmlkZXIKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmF4Lm5ldC5zc2wuSG9zdG5hbWVWZXJpZmllciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiB2ZXJpZnkoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZheC5uZXQuc3NsLlNTTFNlc3Npb24pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi0gY2xhc3MgamF2YXgubmV0LnNzbC5EZWZhdWx0SG9zdG5hbWVWZXJpZmllciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZheC5uZXQuc3NsLkhvc3RuYW1lVmVyaWZpZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgYm9vbGVhbiB2ZXJpZnkoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZheC5uZXQuc3NsLlNTTFNlc3Npb24pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3NlY3VyaXR5L1ByaXZpbGVnZWRBY3Rpb248TGphdmF4L25ldC9zc2wvU1NMQ29udGV4dDs+OyApCi1maW5hbCBjbGFzcyBqYXZheC5uZXQuc3NsLkRlZmF1bHRTU0xDb250ZXh0JDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgcnVuKCkKLQotcHVibGljIGphdmF4Lm5ldC5zc2wuU1NMQ29udGV4dCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotIGNsYXNzIGphdmF4Lm5ldC5zc2wuRGVmYXVsdFNTTENvbnRleHQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGphdmF4Lm5ldC5zc2wuU1NMQ29udGV4dCBkZWZhdWx0U1NMQ29udGV4dAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXN0YXRpYyBqYXZheC5uZXQuc3NsLlNTTENvbnRleHQgYWNjZXNzJDAwMCgpCi0KLXByaXZhdGUgc3RhdGljIGphdmF4Lm5ldC5zc2wuU1NMQ29udGV4dCBmaW5kRGVmYXVsdCgpCi0KLXB1YmxpYyBzdGF0aWMgamF2YXgubmV0LnNzbC5TU0xDb250ZXh0IGdldENvbnRleHQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGphdmF4Lm5ldC5zc2wuU1NMU2VydmVyU29ja2V0RmFjdG9yeSBleHRlbmRzIGphdmF4Lm5ldC5TZXJ2ZXJTb2NrZXRGYWN0b3J5Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZGVmYXVsdE5hbWUKLQotcHJpdmF0ZSBzdGF0aWMgamF2YXgubmV0LlNlcnZlclNvY2tldEZhY3RvcnkgZGVmYXVsdFNlcnZlclNvY2tldEZhY3RvcnkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oKQotCi1zdGF0aWMgamF2YS5sYW5nLlN0cmluZyBhY2Nlc3MkMDAwKCkKLQotc3RhdGljIGphdmEubGFuZy5TdHJpbmcgYWNjZXNzJDAwMigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXN0YXRpYyBqYXZheC5uZXQuU2VydmVyU29ja2V0RmFjdG9yeSBhY2Nlc3MkMTAyKAotamF2YXgubmV0LlNlcnZlclNvY2tldEZhY3RvcnkpCi0KLXB1YmxpYyBzdGF0aWMgamF2YXgubmV0LlNlcnZlclNvY2tldEZhY3RvcnkgZ2V0RGVmYXVsdCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0RGVmYXVsdENpcGhlclN1aXRlcygpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0U3VwcG9ydGVkQ2lwaGVyU3VpdGVzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLSBjbGFzcyBqYXZheC5uZXQuc3NsLkRlZmF1bHRTU0xTZXJ2ZXJTb2NrZXRGYWN0b3J5IGV4dGVuZHMgamF2YXgubmV0LnNzbC5TU0xTZXJ2ZXJTb2NrZXRGYWN0b3J5Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBlcnJNZXNzYWdlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubmV0LlNlcnZlclNvY2tldCBjcmVhdGVTZXJ2ZXJTb2NrZXQoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQgY3JlYXRlU2VydmVyU29ja2V0KAotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQgY3JlYXRlU2VydmVyU29ja2V0KAotaW50Ci1pbnQKLWphdmEubmV0LkluZXRBZGRyZXNzKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIGdldERlZmF1bHRDaXBoZXJTdWl0ZXMoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIGdldFN1cHBvcnRlZENpcGhlclN1aXRlcygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgamF2YXgubmV0LnNzbC5TU0xTb2NrZXRGYWN0b3J5IGV4dGVuZHMgamF2YXgubmV0LlNvY2tldEZhY3RvcnkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBkZWZhdWx0TmFtZQotCi1wcml2YXRlIHN0YXRpYyBqYXZheC5uZXQuU29ja2V0RmFjdG9yeSBkZWZhdWx0U29ja2V0RmFjdG9yeQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGFjY2VzcyQwMDAoKQotCi1zdGF0aWMgamF2YS5sYW5nLlN0cmluZyBhY2Nlc3MkMDAyKAotamF2YS5sYW5nLlN0cmluZykKLQotc3RhdGljIGphdmF4Lm5ldC5Tb2NrZXRGYWN0b3J5IGFjY2VzcyQxMDIoCi1qYXZheC5uZXQuU29ja2V0RmFjdG9yeSkKLQotcHVibGljIHN0YXRpYyBqYXZheC5uZXQuU29ja2V0RmFjdG9yeSBnZXREZWZhdWx0KCkKLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2coCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5uZXQuU29ja2V0IGNyZWF0ZVNvY2tldCgKLWphdmEubmV0LlNvY2tldAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1ib29sZWFuKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZ1tdIGdldERlZmF1bHRDaXBoZXJTdWl0ZXMoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZ1tdIGdldFN1cHBvcnRlZENpcGhlclN1aXRlcygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi0gY2xhc3MgamF2YXgubmV0LnNzbC5EZWZhdWx0U1NMU29ja2V0RmFjdG9yeSBleHRlbmRzIGphdmF4Lm5ldC5zc2wuU1NMU29ja2V0RmFjdG9yeQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZXJyTWVzc2FnZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvbmV0L1Vua25vd25Ib3N0RXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5uZXQuU29ja2V0IGNyZWF0ZVNvY2tldCgKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9uZXQvVW5rbm93bkhvc3RFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLm5ldC5Tb2NrZXQgY3JlYXRlU29ja2V0KAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1qYXZhLm5ldC5JbmV0QWRkcmVzcwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5uZXQuU29ja2V0IGNyZWF0ZVNvY2tldCgKLWphdmEubmV0LkluZXRBZGRyZXNzCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLm5ldC5Tb2NrZXQgY3JlYXRlU29ja2V0KAotamF2YS5uZXQuSW5ldEFkZHJlc3MKLWludAotamF2YS5uZXQuSW5ldEFkZHJlc3MKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubmV0LlNvY2tldCBjcmVhdGVTb2NrZXQoCi1qYXZhLm5ldC5Tb2NrZXQKLWphdmEubGFuZy5TdHJpbmcKLWludAotYm9vbGVhbikKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBnZXREZWZhdWx0Q2lwaGVyU3VpdGVzKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBnZXRTdXBwb3J0ZWRDaXBoZXJTdWl0ZXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmF4Lm5ldC5zc2wuSGFuZHNoYWtlQ29tcGxldGVkRXZlbnQgZXh0ZW5kcyBqYXZhLnV0aWwuRXZlbnRPYmplY3QgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSB0cmFuc2llbnQgamF2YXgubmV0LnNzbC5TU0xTZXNzaW9uIHNlc3Npb24KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZheC5uZXQuc3NsLlNTTFNvY2tldAotamF2YXgubmV0LnNzbC5TU0xTZXNzaW9uKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRDaXBoZXJTdWl0ZSgpCi0KLXB1YmxpYyBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVbXSBnZXRMb2NhbENlcnRpZmljYXRlcygpCi0KLXB1YmxpYyBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbCBnZXRMb2NhbFByaW5jaXBhbCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmF4L25ldC9zc2wvU1NMUGVlclVudmVyaWZpZWRFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZheC5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZVtdIGdldFBlZXJDZXJ0aWZpY2F0ZUNoYWluKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YXgvbmV0L3NzbC9TU0xQZWVyVW52ZXJpZmllZEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZVtdIGdldFBlZXJDZXJ0aWZpY2F0ZXMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZheC9uZXQvc3NsL1NTTFBlZXJVbnZlcmlmaWVkRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zZWN1cml0eS5QcmluY2lwYWwgZ2V0UGVlclByaW5jaXBhbCgpCi0KLXB1YmxpYyBqYXZheC5uZXQuc3NsLlNTTFNlc3Npb24gZ2V0U2Vzc2lvbigpCi0KLXB1YmxpYyBqYXZheC5uZXQuc3NsLlNTTFNvY2tldCBnZXRTb2NrZXQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZheC5uZXQuc3NsLkhhbmRzaGFrZUNvbXBsZXRlZExpc3RlbmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudXRpbC5FdmVudExpc3RlbmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgaGFuZHNoYWtlQ29tcGxldGVkKAotamF2YXgubmV0LnNzbC5IYW5kc2hha2VDb21wbGV0ZWRFdmVudCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZheC5uZXQuc3NsLkh0dHBzVVJMQ29ubmVjdGlvbiBleHRlbmRzIGphdmEubmV0Lkh0dHBVUkxDb25uZWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGphdmF4Lm5ldC5zc2wuSG9zdG5hbWVWZXJpZmllciBkZWZhdWx0SG9zdG5hbWVWZXJpZmllcgotCi1wcml2YXRlIHN0YXRpYyBqYXZheC5uZXQuc3NsLlNTTFNvY2tldEZhY3RvcnkgZGVmYXVsdFNTTFNvY2tldEZhY3RvcnkKLQotcHJpdmF0ZSBzdGF0aWMgamF2YXgubmV0LnNzbC5TU0xTb2NrZXRGYWN0b3J5IHNvY2tldEZhY3RvcnkKLQotcHJvdGVjdGVkIGphdmF4Lm5ldC5zc2wuSG9zdG5hbWVWZXJpZmllciBob3N0bmFtZVZlcmlmaWVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oCi1qYXZhLm5ldC5VUkwpCi0KLXB1YmxpYyBzdGF0aWMgamF2YXgubmV0LnNzbC5Ib3N0bmFtZVZlcmlmaWVyIGdldERlZmF1bHRIb3N0bmFtZVZlcmlmaWVyKCkKLQotcHVibGljIHN0YXRpYyBqYXZheC5uZXQuc3NsLlNTTFNvY2tldEZhY3RvcnkgZ2V0RGVmYXVsdFNTTFNvY2tldEZhY3RvcnkoKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVmYXVsdEhvc3RuYW1lVmVyaWZpZXIoCi1qYXZheC5uZXQuc3NsLkhvc3RuYW1lVmVyaWZpZXIpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBzZXREZWZhdWx0U1NMU29ja2V0RmFjdG9yeSgKLWphdmF4Lm5ldC5zc2wuU1NMU29ja2V0RmFjdG9yeSkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0Q2lwaGVyU3VpdGUoKQotCi1wdWJsaWMgamF2YXgubmV0LnNzbC5Ib3N0bmFtZVZlcmlmaWVyIGdldEhvc3RuYW1lVmVyaWZpZXIoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlW10gZ2V0TG9jYWxDZXJ0aWZpY2F0ZXMoKQotCi1wdWJsaWMgamF2YS5zZWN1cml0eS5QcmluY2lwYWwgZ2V0TG9jYWxQcmluY2lwYWwoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZheC9uZXQvc3NsL1NTTFBlZXJVbnZlcmlmaWVkRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zZWN1cml0eS5QcmluY2lwYWwgZ2V0UGVlclByaW5jaXBhbCgpCi0KLXB1YmxpYyBqYXZheC5uZXQuc3NsLlNTTFNvY2tldEZhY3RvcnkgZ2V0U1NMU29ja2V0RmFjdG9yeSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmF4L25ldC9zc2wvU1NMUGVlclVudmVyaWZpZWRFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVbXSBnZXRTZXJ2ZXJDZXJ0aWZpY2F0ZXMoKQotCi1wdWJsaWMgdm9pZCBzZXRIb3N0bmFtZVZlcmlmaWVyKAotamF2YXgubmV0LnNzbC5Ib3N0bmFtZVZlcmlmaWVyKQotCi1wdWJsaWMgdm9pZCBzZXRTU0xTb2NrZXRGYWN0b3J5KAotamF2YXgubmV0LnNzbC5TU0xTb2NrZXRGYWN0b3J5KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZheC5uZXQuc3NsLktleU1hbmFnZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvc2VjdXJpdHkvUHJpdmlsZWdlZEFjdGlvbjxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1maW5hbCBjbGFzcyBqYXZheC5uZXQuc3NsLktleU1hbmFnZXJGYWN0b3J5JDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgcnVuKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZheC5uZXQuc3NsLktleU1hbmFnZXJGYWN0b3J5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBST1BFUlRZX05BTUUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTRVJWSUNFCi0KLXByaXZhdGUgc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5mb3J0cmVzcy5FbmdpbmUgZW5naW5lCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBhbGdvcml0aG0KLQotcHJpdmF0ZSBmaW5hbCBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyIHByb3ZpZGVyCi0KLXByaXZhdGUgZmluYWwgamF2YXgubmV0LnNzbC5LZXlNYW5hZ2VyRmFjdG9yeVNwaSBzcGlJbXBsCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oCi1qYXZheC5uZXQuc3NsLktleU1hbmFnZXJGYWN0b3J5U3BpCi1qYXZhLnNlY3VyaXR5LlByb3ZpZGVyCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgZ2V0RGVmYXVsdEFsZ29yaXRobSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmF4Lm5ldC5zc2wuS2V5TWFuYWdlckZhY3RvcnkgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9Ob1N1Y2hQcm92aWRlckV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZheC5uZXQuc3NsLktleU1hbmFnZXJGYWN0b3J5IGdldEluc3RhbmNlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YXgubmV0LnNzbC5LZXlNYW5hZ2VyRmFjdG9yeSBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEuc2VjdXJpdHkuUHJvdmlkZXIpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGdldEFsZ29yaXRobSgpCi0KLXB1YmxpYyBmaW5hbCBqYXZheC5uZXQuc3NsLktleU1hbmFnZXJbXSBnZXRLZXlNYW5hZ2VycygpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyIGdldFByb3ZpZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9LZXlTdG9yZUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247TGphdmEvc2VjdXJpdHkvVW5yZWNvdmVyYWJsZUtleUV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIHZvaWQgaW5pdCgKLWphdmEuc2VjdXJpdHkuS2V5U3RvcmUKLWNoYXJbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgdm9pZCBpbml0KAotamF2YXgubmV0LnNzbC5NYW5hZ2VyRmFjdG9yeVBhcmFtZXRlcnMpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgamF2YXgubmV0LnNzbC5LZXlNYW5hZ2VyRmFjdG9yeVNwaSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcm90ZWN0ZWQgYWJzdHJhY3QgamF2YXgubmV0LnNzbC5LZXlNYW5hZ2VyW10gZW5naW5lR2V0S2V5TWFuYWdlcnMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0tleVN0b3JlRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9VbnJlY292ZXJhYmxlS2V5RXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBlbmdpbmVJbml0KAotamF2YS5zZWN1cml0eS5LZXlTdG9yZQotY2hhcltdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb247ICkKLXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVuZ2luZUluaXQoCi1qYXZheC5uZXQuc3NsLk1hbmFnZXJGYWN0b3J5UGFyYW1ldGVycykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZheC5uZXQuc3NsLktleVN0b3JlQnVpbGRlclBhcmFtZXRlcnMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YXgubmV0LnNzbC5NYW5hZ2VyRmFjdG9yeVBhcmFtZXRlcnMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdCBrc2J1aWxkZXJzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5zZWN1cml0eS5LZXlTdG9yZSRCdWlsZGVyKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuTGlzdCkKLQotcHVibGljIGphdmEudXRpbC5MaXN0IGdldFBhcmFtZXRlcnMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGphdmF4Lm5ldC5zc2wuU1NMQ29udGV4dFNwaSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcm90ZWN0ZWQgYWJzdHJhY3QgamF2YXgubmV0LnNzbC5TU0xFbmdpbmUgZW5naW5lQ3JlYXRlU1NMRW5naW5lKCkKLQotcHJvdGVjdGVkIGFic3RyYWN0IGphdmF4Lm5ldC5zc2wuU1NMRW5naW5lIGVuZ2luZUNyZWF0ZVNTTEVuZ2luZSgKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHJvdGVjdGVkIGFic3RyYWN0IGphdmF4Lm5ldC5zc2wuU1NMU2Vzc2lvbkNvbnRleHQgZW5naW5lR2V0Q2xpZW50U2Vzc2lvbkNvbnRleHQoKQotCi1wcm90ZWN0ZWQgYWJzdHJhY3QgamF2YXgubmV0LnNzbC5TU0xTZXNzaW9uQ29udGV4dCBlbmdpbmVHZXRTZXJ2ZXJTZXNzaW9uQ29udGV4dCgpCi0KLXByb3RlY3RlZCBhYnN0cmFjdCBqYXZheC5uZXQuc3NsLlNTTFNlcnZlclNvY2tldEZhY3RvcnkgZW5naW5lR2V0U2VydmVyU29ja2V0RmFjdG9yeSgpCi0KLXByb3RlY3RlZCBhYnN0cmFjdCBqYXZheC5uZXQuc3NsLlNTTFNvY2tldEZhY3RvcnkgZW5naW5lR2V0U29ja2V0RmFjdG9yeSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvS2V5TWFuYWdlbWVudEV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW5naW5lSW5pdCgKLWphdmF4Lm5ldC5zc2wuS2V5TWFuYWdlcltdCi1qYXZheC5uZXQuc3NsLlRydXN0TWFuYWdlcltdCi1qYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZheC5uZXQuc3NsLlNTTEVuZ2luZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGhvc3QKLQotcHJpdmF0ZSBmaW5hbCBpbnQgcG9ydAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigpCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YXgvbmV0L3NzbC9TU0xFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGJlZ2luSGFuZHNoYWtlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YXgvbmV0L3NzbC9TU0xFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGNsb3NlSW5ib3VuZCgpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGNsb3NlT3V0Ym91bmQoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlJ1bm5hYmxlIGdldERlbGVnYXRlZFRhc2soKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBnZXRFbmFibGVTZXNzaW9uQ3JlYXRpb24oKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZ1tdIGdldEVuYWJsZWRDaXBoZXJTdWl0ZXMoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZ1tdIGdldEVuYWJsZWRQcm90b2NvbHMoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YXgubmV0LnNzbC5TU0xFbmdpbmVSZXN1bHQkSGFuZHNoYWtlU3RhdHVzIGdldEhhbmRzaGFrZVN0YXR1cygpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGdldE5lZWRDbGllbnRBdXRoKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UGVlckhvc3QoKQotCi1wdWJsaWMgaW50IGdldFBlZXJQb3J0KCkKLQotcHVibGljIGFic3RyYWN0IGphdmF4Lm5ldC5zc2wuU1NMU2Vzc2lvbiBnZXRTZXNzaW9uKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmdbXSBnZXRTdXBwb3J0ZWRDaXBoZXJTdWl0ZXMoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZ1tdIGdldFN1cHBvcnRlZFByb3RvY29scygpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGdldFVzZUNsaWVudE1vZGUoKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBnZXRXYW50Q2xpZW50QXV0aCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzSW5ib3VuZERvbmUoKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc091dGJvdW5kRG9uZSgpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEVuYWJsZVNlc3Npb25DcmVhdGlvbigKLWJvb2xlYW4pCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEVuYWJsZWRDaXBoZXJTdWl0ZXMoCi1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEVuYWJsZWRQcm90b2NvbHMoCi1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldE5lZWRDbGllbnRBdXRoKAotYm9vbGVhbikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0VXNlQ2xpZW50TW9kZSgKLWJvb2xlYW4pCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFdhbnRDbGllbnRBdXRoKAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YXgvbmV0L3NzbC9TU0xFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZheC5uZXQuc3NsLlNTTEVuZ2luZVJlc3VsdCB1bndyYXAoCi1qYXZhLm5pby5CeXRlQnVmZmVyCi1qYXZhLm5pby5CeXRlQnVmZmVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZheC9uZXQvc3NsL1NTTEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmF4Lm5ldC5zc2wuU1NMRW5naW5lUmVzdWx0IHVud3JhcCgKLWphdmEubmlvLkJ5dGVCdWZmZXIKLWphdmEubmlvLkJ5dGVCdWZmZXJbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YXgvbmV0L3NzbC9TU0xFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZheC5uZXQuc3NsLlNTTEVuZ2luZVJlc3VsdCB1bndyYXAoCi1qYXZhLm5pby5CeXRlQnVmZmVyCi1qYXZhLm5pby5CeXRlQnVmZmVyW10KLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZheC9uZXQvc3NsL1NTTEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmF4Lm5ldC5zc2wuU1NMRW5naW5lUmVzdWx0IHdyYXAoCi1qYXZhLm5pby5CeXRlQnVmZmVyCi1qYXZhLm5pby5CeXRlQnVmZmVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZheC9uZXQvc3NsL1NTTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmF4Lm5ldC5zc2wuU1NMRW5naW5lUmVzdWx0IHdyYXAoCi1qYXZhLm5pby5CeXRlQnVmZmVyW10KLWludAotaW50Ci1qYXZhLm5pby5CeXRlQnVmZmVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZheC9uZXQvc3NsL1NTTEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmF4Lm5ldC5zc2wuU1NMRW5naW5lUmVzdWx0IHdyYXAoCi1qYXZhLm5pby5CeXRlQnVmZmVyW10KLWphdmEubmlvLkJ5dGVCdWZmZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNjQwOSBuYW1lID1IYW5kc2hha2VTdGF0dXMgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmF4L25ldC9zc2wvU1NMRW5naW5lUmVzdWx0OyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9FbnVtPExqYXZheC9uZXQvc3NsL1NTTEVuZ2luZVJlc3VsdCRIYW5kc2hha2VTdGF0dXM7PjsgKQotcHVibGljIGZpbmFsIGNsYXNzIGphdmF4Lm5ldC5zc2wuU1NMRW5naW5lUmVzdWx0JEhhbmRzaGFrZVN0YXR1cyBleHRlbmRzIGphdmEubGFuZy5FbnVtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmF4Lm5ldC5zc2wuU1NMRW5naW5lUmVzdWx0JEhhbmRzaGFrZVN0YXR1c1tdICRWQUxVRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZheC5uZXQuc3NsLlNTTEVuZ2luZVJlc3VsdCRIYW5kc2hha2VTdGF0dXMgRklOSVNIRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZheC5uZXQuc3NsLlNTTEVuZ2luZVJlc3VsdCRIYW5kc2hha2VTdGF0dXMgTkVFRF9UQVNLCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YXgubmV0LnNzbC5TU0xFbmdpbmVSZXN1bHQkSGFuZHNoYWtlU3RhdHVzIE5FRURfVU5XUkFQCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YXgubmV0LnNzbC5TU0xFbmdpbmVSZXN1bHQkSGFuZHNoYWtlU3RhdHVzIE5FRURfV1JBUAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmF4Lm5ldC5zc2wuU1NMRW5naW5lUmVzdWx0JEhhbmRzaGFrZVN0YXR1cyBOT1RfSEFORFNIQUtJTkcKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClWICkKLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgamF2YXgubmV0LnNzbC5TU0xFbmdpbmVSZXN1bHQkSGFuZHNoYWtlU3RhdHVzIHZhbHVlT2YoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGphdmF4Lm5ldC5zc2wuU1NMRW5naW5lUmVzdWx0JEhhbmRzaGFrZVN0YXR1c1tdIHZhbHVlcygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNjQwOSBuYW1lID1TdGF0dXMgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvRW51bTxMamF2YXgvbmV0L3NzbC9TU0xFbmdpbmVSZXN1bHQkU3RhdHVzOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZheC9uZXQvc3NsL1NTTEVuZ2luZVJlc3VsdDsgKQotcHVibGljIGZpbmFsIGNsYXNzIGphdmF4Lm5ldC5zc2wuU1NMRW5naW5lUmVzdWx0JFN0YXR1cyBleHRlbmRzIGphdmEubGFuZy5FbnVtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmF4Lm5ldC5zc2wuU1NMRW5naW5lUmVzdWx0JFN0YXR1c1tdICRWQUxVRVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZheC5uZXQuc3NsLlNTTEVuZ2luZVJlc3VsdCRTdGF0dXMgQlVGRkVSX09WRVJGTE9XCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YXgubmV0LnNzbC5TU0xFbmdpbmVSZXN1bHQkU3RhdHVzIEJVRkZFUl9VTkRFUkZMT1cKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZheC5uZXQuc3NsLlNTTEVuZ2luZVJlc3VsdCRTdGF0dXMgQ0xPU0VECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YXgubmV0LnNzbC5TU0xFbmdpbmVSZXN1bHQkU3RhdHVzIE9LCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpViApCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgc3RhdGljIGphdmF4Lm5ldC5zc2wuU1NMRW5naW5lUmVzdWx0JFN0YXR1cyB2YWx1ZU9mKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBqYXZheC5uZXQuc3NsLlNTTEVuZ2luZVJlc3VsdCRTdGF0dXNbXSB2YWx1ZXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGphdmF4L25ldC9zc2wvU1NMRW5naW5lUmVzdWx0JFN0YXR1cztMamF2YXgvbmV0L3NzbC9TU0xFbmdpbmVSZXN1bHQkSGFuZHNoYWtlU3RhdHVzOyApCi1wdWJsaWMgY2xhc3MgamF2YXgubmV0LnNzbC5TU0xFbmdpbmVSZXN1bHQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgaW50IGJ5dGVzQ29uc3VtZWQKLQotcHJpdmF0ZSBmaW5hbCBpbnQgYnl0ZXNQcm9kdWNlZAotCi1wcml2YXRlIGZpbmFsIGphdmF4Lm5ldC5zc2wuU1NMRW5naW5lUmVzdWx0JEhhbmRzaGFrZVN0YXR1cyBoYW5kc2hha2VTdGF0dXMKLQotcHJpdmF0ZSBmaW5hbCBqYXZheC5uZXQuc3NsLlNTTEVuZ2luZVJlc3VsdCRTdGF0dXMgc3RhdHVzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YXgubmV0LnNzbC5TU0xFbmdpbmVSZXN1bHQkU3RhdHVzCi1qYXZheC5uZXQuc3NsLlNTTEVuZ2luZVJlc3VsdCRIYW5kc2hha2VTdGF0dXMKLWludAotaW50KQotCi1wdWJsaWMgZmluYWwgaW50IGJ5dGVzQ29uc3VtZWQoKQotCi1wdWJsaWMgZmluYWwgaW50IGJ5dGVzUHJvZHVjZWQoKQotCi1wdWJsaWMgZmluYWwgamF2YXgubmV0LnNzbC5TU0xFbmdpbmVSZXN1bHQkSGFuZHNoYWtlU3RhdHVzIGdldEhhbmRzaGFrZVN0YXR1cygpCi0KLXB1YmxpYyBmaW5hbCBqYXZheC5uZXQuc3NsLlNTTEVuZ2luZVJlc3VsdCRTdGF0dXMgZ2V0U3RhdHVzKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmF4Lm5ldC5zc2wuU1NMRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5pby5JT0V4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmF4Lm5ldC5zc2wuU1NMSGFuZHNoYWtlRXhjZXB0aW9uIGV4dGVuZHMgamF2YXgubmV0LnNzbC5TU0xFeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZheC5uZXQuc3NsLlNTTEtleUV4Y2VwdGlvbiBleHRlbmRzIGphdmF4Lm5ldC5zc2wuU1NMRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YXgubmV0LnNzbC5TU0xQZWVyVW52ZXJpZmllZEV4Y2VwdGlvbiBleHRlbmRzIGphdmF4Lm5ldC5zc2wuU1NMRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgamF2YXgubmV0LnNzbC5TU0xQZXJtaXNzaW9uIGV4dGVuZHMgamF2YS5zZWN1cml0eS5CYXNpY1Blcm1pc3Npb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZheC5uZXQuc3NsLlNTTFByb3RvY29sRXhjZXB0aW9uIGV4dGVuZHMgamF2YXgubmV0LnNzbC5TU0xFeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZheC5uZXQuc3NsLlNTTFNlcnZlclNvY2tldCBleHRlbmRzIGphdmEubmV0LlNlcnZlclNvY2tldAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLWludAotaW50Ci1qYXZhLm5ldC5JbmV0QWRkcmVzcykKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZ2V0RW5hYmxlU2Vzc2lvbkNyZWF0aW9uKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmdbXSBnZXRFbmFibGVkQ2lwaGVyU3VpdGVzKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmdbXSBnZXRFbmFibGVkUHJvdG9jb2xzKCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZ2V0TmVlZENsaWVudEF1dGgoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZ1tdIGdldFN1cHBvcnRlZENpcGhlclN1aXRlcygpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0U3VwcG9ydGVkUHJvdG9jb2xzKCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZ2V0VXNlQ2xpZW50TW9kZSgpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGdldFdhbnRDbGllbnRBdXRoKCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RW5hYmxlU2Vzc2lvbkNyZWF0aW9uKAotYm9vbGVhbikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RW5hYmxlZENpcGhlclN1aXRlcygKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RW5hYmxlZFByb3RvY29scygKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0TmVlZENsaWVudEF1dGgoCi1ib29sZWFuKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRVc2VDbGllbnRNb2RlKAotYm9vbGVhbikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0V2FudENsaWVudEF1dGgoCi1ib29sZWFuKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLWZpbmFsIGNsYXNzIGphdmF4Lm5ldC5zc2wuU1NMU2VydmVyU29ja2V0RmFjdG9yeSQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmF4Lm5ldC5zc2wuU1NMU2Vzc2lvbiBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldEFwcGxpY2F0aW9uQnVmZmVyU2l6ZSgpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldENpcGhlclN1aXRlKCkKLQotcHVibGljIGFic3RyYWN0IGxvbmcgZ2V0Q3JlYXRpb25UaW1lKCkKLQotcHVibGljIGFic3RyYWN0IGJ5dGVbXSBnZXRJZCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBsb25nIGdldExhc3RBY2Nlc3NlZFRpbWUoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlW10gZ2V0TG9jYWxDZXJ0aWZpY2F0ZXMoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zZWN1cml0eS5QcmluY2lwYWwgZ2V0TG9jYWxQcmluY2lwYWwoKQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldFBhY2tldEJ1ZmZlclNpemUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZheC9uZXQvc3NsL1NTTFBlZXJVbnZlcmlmaWVkRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YXguc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGVbXSBnZXRQZWVyQ2VydGlmaWNhdGVDaGFpbigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmF4L25ldC9zc2wvU1NMUGVlclVudmVyaWZpZWRFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVbXSBnZXRQZWVyQ2VydGlmaWNhdGVzKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0UGVlckhvc3QoKQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldFBlZXJQb3J0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YXgvbmV0L3NzbC9TU0xQZWVyVW52ZXJpZmllZEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsIGdldFBlZXJQcmluY2lwYWwoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRQcm90b2NvbCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZheC5uZXQuc3NsLlNTTFNlc3Npb25Db250ZXh0IGdldFNlc3Npb25Db250ZXh0KCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5PYmplY3QgZ2V0VmFsdWUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZ1tdIGdldFZhbHVlTmFtZXMoKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBpbnZhbGlkYXRlKCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNWYWxpZCgpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHB1dFZhbHVlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgcmVtb3ZlVmFsdWUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmF4Lm5ldC5zc2wuU1NMU2Vzc2lvbkJpbmRpbmdFdmVudCBleHRlbmRzIGphdmEudXRpbC5FdmVudE9iamVjdCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbmFtZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmF4Lm5ldC5zc2wuU1NMU2Vzc2lvbgotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TmFtZSgpCi0KLXB1YmxpYyBqYXZheC5uZXQuc3NsLlNTTFNlc3Npb24gZ2V0U2Vzc2lvbigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmF4Lm5ldC5zc2wuU1NMU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHZhbHVlQm91bmQoCi1qYXZheC5uZXQuc3NsLlNTTFNlc3Npb25CaW5kaW5nRXZlbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHZhbHVlVW5ib3VuZCgKLWphdmF4Lm5ldC5zc2wuU1NMU2Vzc2lvbkJpbmRpbmdFdmVudCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgamF2YXgubmV0LnNzbC5TU0xTZXNzaW9uQ29udGV4dCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLkVudW1lcmF0aW9uIGdldElkcygpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZheC5uZXQuc3NsLlNTTFNlc3Npb24gZ2V0U2Vzc2lvbigKLWJ5dGVbXSkKLQotcHVibGljIGFic3RyYWN0IGludCBnZXRTZXNzaW9uQ2FjaGVTaXplKCkKLQotcHVibGljIGFic3RyYWN0IGludCBnZXRTZXNzaW9uVGltZW91dCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFNlc3Npb25DYWNoZVNpemUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFNlc3Npb25UaW1lb3V0KAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGphdmF4Lm5ldC5zc2wuU1NMU29ja2V0IGV4dGVuZHMgamF2YS5uZXQuU29ja2V0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9uZXQvVW5rbm93bkhvc3RFeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9uZXQvVW5rbm93bkhvc3RFeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWludAotamF2YS5uZXQuSW5ldEFkZHJlc3MKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotamF2YS5uZXQuSW5ldEFkZHJlc3MKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotamF2YS5uZXQuSW5ldEFkZHJlc3MKLWludAotamF2YS5uZXQuSW5ldEFkZHJlc3MKLWludCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgYWRkSGFuZHNoYWtlQ29tcGxldGVkTGlzdGVuZXIoCi1qYXZheC5uZXQuc3NsLkhhbmRzaGFrZUNvbXBsZXRlZExpc3RlbmVyKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBnZXRFbmFibGVTZXNzaW9uQ3JlYXRpb24oKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZ1tdIGdldEVuYWJsZWRDaXBoZXJTdWl0ZXMoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZ1tdIGdldEVuYWJsZWRQcm90b2NvbHMoKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBnZXROZWVkQ2xpZW50QXV0aCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZheC5uZXQuc3NsLlNTTFNlc3Npb24gZ2V0U2Vzc2lvbigpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0U3VwcG9ydGVkQ2lwaGVyU3VpdGVzKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmdbXSBnZXRTdXBwb3J0ZWRQcm90b2NvbHMoKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBnZXRVc2VDbGllbnRNb2RlKCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZ2V0V2FudENsaWVudEF1dGgoKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCByZW1vdmVIYW5kc2hha2VDb21wbGV0ZWRMaXN0ZW5lcigKLWphdmF4Lm5ldC5zc2wuSGFuZHNoYWtlQ29tcGxldGVkTGlzdGVuZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEVuYWJsZVNlc3Npb25DcmVhdGlvbigKLWJvb2xlYW4pCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEVuYWJsZWRDaXBoZXJTdWl0ZXMoCi1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEVuYWJsZWRQcm90b2NvbHMoCi1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldE5lZWRDbGllbnRBdXRoKAotYm9vbGVhbikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0VXNlQ2xpZW50TW9kZSgKLWJvb2xlYW4pCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFdhbnRDbGllbnRBdXRoKAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc3RhcnRIYW5kc2hha2UoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLWZpbmFsIGNsYXNzIGphdmF4Lm5ldC5zc2wuU1NMU29ja2V0RmFjdG9yeSQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmF4Lm5ldC5zc2wuVHJ1c3RNYW5hZ2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3NlY3VyaXR5L1ByaXZpbGVnZWRBY3Rpb248TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotZmluYWwgY2xhc3MgamF2YXgubmV0LnNzbC5UcnVzdE1hbmFnZXJGYWN0b3J5JDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgcnVuKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZheC5uZXQuc3NsLlRydXN0TWFuYWdlckZhY3RvcnkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUFJPUEVSVFlOQU1FCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0VSVklDRQotCi1wcml2YXRlIHN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuZm9ydHJlc3MuRW5naW5lIGVuZ2luZQotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgYWxnb3JpdGhtCi0KLXByaXZhdGUgZmluYWwgamF2YS5zZWN1cml0eS5Qcm92aWRlciBwcm92aWRlcgotCi1wcml2YXRlIGZpbmFsIGphdmF4Lm5ldC5zc2wuVHJ1c3RNYW5hZ2VyRmFjdG9yeVNwaSBzcGlJbXBsCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oCi1qYXZheC5uZXQuc3NsLlRydXN0TWFuYWdlckZhY3RvcnlTcGkKLWphdmEuc2VjdXJpdHkuUHJvdmlkZXIKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBnZXREZWZhdWx0QWxnb3JpdGhtKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YXgubmV0LnNzbC5UcnVzdE1hbmFnZXJGYWN0b3J5IGdldEluc3RhbmNlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247TGphdmEvc2VjdXJpdHkvTm9TdWNoUHJvdmlkZXJFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YXgubmV0LnNzbC5UcnVzdE1hbmFnZXJGYWN0b3J5IGdldEluc3RhbmNlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YXgubmV0LnNzbC5UcnVzdE1hbmFnZXJGYWN0b3J5IGdldEluc3RhbmNlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5zZWN1cml0eS5Qcm92aWRlcikKLQotcHVibGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgZ2V0QWxnb3JpdGhtKCkKLQotcHVibGljIGZpbmFsIGphdmEuc2VjdXJpdHkuUHJvdmlkZXIgZ2V0UHJvdmlkZXIoKQotCi1wdWJsaWMgZmluYWwgamF2YXgubmV0LnNzbC5UcnVzdE1hbmFnZXJbXSBnZXRUcnVzdE1hbmFnZXJzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9LZXlTdG9yZUV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIHZvaWQgaW5pdCgKLWphdmEuc2VjdXJpdHkuS2V5U3RvcmUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIHZvaWQgaW5pdCgKLWphdmF4Lm5ldC5zc2wuTWFuYWdlckZhY3RvcnlQYXJhbWV0ZXJzKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGphdmF4Lm5ldC5zc2wuVHJ1c3RNYW5hZ2VyRmFjdG9yeVNwaSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcm90ZWN0ZWQgYWJzdHJhY3QgamF2YXgubmV0LnNzbC5UcnVzdE1hbmFnZXJbXSBlbmdpbmVHZXRUcnVzdE1hbmFnZXJzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9LZXlTdG9yZUV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW5naW5lSW5pdCgKLWphdmEuc2VjdXJpdHkuS2V5U3RvcmUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW5naW5lSW5pdCgKLWphdmF4Lm5ldC5zc2wuTWFuYWdlckZhY3RvcnlQYXJhbWV0ZXJzKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZheC5uZXQuc3NsLlg1MDlLZXlNYW5hZ2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmF4Lm5ldC5zc2wuS2V5TWFuYWdlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGNob29zZUNsaWVudEFsaWFzKAotamF2YS5sYW5nLlN0cmluZ1tdCi1qYXZhLnNlY3VyaXR5LlByaW5jaXBhbFtdCi1qYXZhLm5ldC5Tb2NrZXQpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGNob29zZVNlcnZlckFsaWFzKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5zZWN1cml0eS5QcmluY2lwYWxbXQotamF2YS5uZXQuU29ja2V0KQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZVtdIGdldENlcnRpZmljYXRlQ2hhaW4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZ1tdIGdldENsaWVudEFsaWFzZXMoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnNlY3VyaXR5LlByaW5jaXBhbFtdKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zZWN1cml0eS5Qcml2YXRlS2V5IGdldFByaXZhdGVLZXkoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZ1tdIGdldFNlcnZlckFsaWFzZXMoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnNlY3VyaXR5LlByaW5jaXBhbFtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGphdmF4Lm5ldC5zc2wuWDUwOUV4dGVuZGVkS2V5TWFuYWdlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZheC5uZXQuc3NsLlg1MDlLZXlNYW5hZ2VyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgY2hvb3NlRW5naW5lQ2xpZW50QWxpYXMoCi1qYXZhLmxhbmcuU3RyaW5nW10KLWphdmEuc2VjdXJpdHkuUHJpbmNpcGFsW10KLWphdmF4Lm5ldC5zc2wuU1NMRW5naW5lKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBjaG9vc2VFbmdpbmVTZXJ2ZXJBbGlhcygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEuc2VjdXJpdHkuUHJpbmNpcGFsW10KLWphdmF4Lm5ldC5zc2wuU1NMRW5naW5lKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZheC5uZXQuc3NsLlg1MDlUcnVzdE1hbmFnZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YXgubmV0LnNzbC5UcnVzdE1hbmFnZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGNoZWNrQ2xpZW50VHJ1c3RlZCgKLWphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGVbXQotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBjaGVja1NlcnZlclRydXN0ZWQoCi1qYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlW10KLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlW10gZ2V0QWNjZXB0ZWRJc3N1ZXJzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBqYXZheC5zZWN1cml0eS5hdXRoLkF1dGhQZXJtaXNzaW9uIGV4dGVuZHMgamF2YS5zZWN1cml0eS5CYXNpY1Blcm1pc3Npb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDUkVBVEVfTE9HSU5fQ09OVEVYVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENSRUFURV9MT0dJTl9DT05URVhUX0FOWQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGluaXQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmF4LnNlY3VyaXR5LmF1dGguRGVzdHJveUZhaWxlZEV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5FeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YXgvc2VjdXJpdHkvYXV0aC9Qcml2YXRlQ3JlZGVudGlhbFBlcm1pc3Npb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjYgbmFtZSA9Q3JlZE93bmVyICkKLWZpbmFsIGNsYXNzIGphdmF4LnNlY3VyaXR5LmF1dGguUHJpdmF0ZUNyZWRlbnRpYWxQZXJtaXNzaW9uJENyZWRPd25lciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSB0cmFuc2llbnQgYm9vbGVhbiBpc0NsYXNzV2lsZGNhcmQKLQotcHJpdmF0ZSB0cmFuc2llbnQgYm9vbGVhbiBpc1BOYW1lV2lsZGNhcmQKLQotIGphdmEubGFuZy5TdHJpbmcgcHJpbmNpcGFsQ2xhc3MKLQotIGphdmEubGFuZy5TdHJpbmcgcHJpbmNpcGFsTmFtZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi0gYm9vbGVhbiBpbXBsaWVzKAotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxqYXZheC9zZWN1cml0eS9hdXRoL1ByaXZhdGVDcmVkZW50aWFsUGVybWlzc2lvbiRDcmVkT3duZXI7ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBqYXZheC5zZWN1cml0eS5hdXRoLlByaXZhdGVDcmVkZW50aWFsUGVybWlzc2lvbiBleHRlbmRzIGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFJFQUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBjcmVkZW50aWFsQ2xhc3MKLQotcHJpdmF0ZSB0cmFuc2llbnQgaW50IG9mZnNldAotCi1wcml2YXRlIHRyYW5zaWVudCBqYXZheC5zZWN1cml0eS5hdXRoLlByaXZhdGVDcmVkZW50aWFsUGVybWlzc2lvbiRDcmVkT3duZXJbXSBzZXQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1N0cmluZztMamF2YS91dGlsL1NldDxMamF2YS9zZWN1cml0eS9QcmluY2lwYWw7PjspViApCi0gdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnV0aWwuU2V0KQotCi1wcml2YXRlIHZvaWQgaW5pdFRhcmdldE5hbWUoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL2xhbmcvQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoCi1qYXZhLmlvLk9iamVjdElucHV0U3RyZWFtKQotCi1wcml2YXRlIGJvb2xlYW4gc2FtZU1lbWJlcnMoCi1qYXZhLmxhbmcuT2JqZWN0W10KLWphdmEubGFuZy5PYmplY3RbXQotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRBY3Rpb25zKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Q3JlZGVudGlhbENsYXNzKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmdbXVtdIGdldFByaW5jaXBhbHMoKQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLQotcHVibGljIGJvb2xlYW4gaW1wbGllcygKLWphdmEuc2VjdXJpdHkuUGVybWlzc2lvbikKLQotcHVibGljIGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbkNvbGxlY3Rpb24gbmV3UGVybWlzc2lvbkNvbGxlY3Rpb24oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLWZpbmFsIGNsYXNzIGphdmF4LnNlY3VyaXR5LmF1dGguU3ViamVjdCQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBqYXZheC5zZWN1cml0eS5hdXRoLlN1YmplY3REb21haW5Db21iaW5lciB2YWwkY29tYmluZXIKLQotZmluYWwgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sQ29udGV4dCB2YWwkY29udGV4dAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbENvbnRleHQKLWphdmF4LnNlY3VyaXR5LmF1dGguU3ViamVjdERvbWFpbkNvbWJpbmVyKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS9zZWN1cml0eS9Qcml2aWxlZ2VkQWN0aW9uPExqYXZhL3NlY3VyaXR5L0FjY2Vzc0NvbnRyb2xDb250ZXh0Oz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLWZpbmFsIGNsYXNzIGphdmF4LnNlY3VyaXR5LmF1dGguU3ViamVjdCQyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBqYXZheC5zZWN1cml0eS5hdXRoLlN1YmplY3REb21haW5Db21iaW5lciB2YWwkY29tYmluZXIKLQotZmluYWwgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sQ29udGV4dCB2YWwkY29udGV4dAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbENvbnRleHQKLWphdmF4LnNlY3VyaXR5LmF1dGguU3ViamVjdERvbWFpbkNvbWJpbmVyKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBydW4oKQotCi1wdWJsaWMgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sQ29udGV4dCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS9zZWN1cml0eS9Qcml2aWxlZ2VkQWN0aW9uPExqYXZhL3NlY3VyaXR5L0RvbWFpbkNvbWJpbmVyOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLWZpbmFsIGNsYXNzIGphdmF4LnNlY3VyaXR5LmF1dGguU3ViamVjdCQzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xDb250ZXh0IHZhbCRjb250ZXh0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sQ29udGV4dCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgcnVuKCkKLQotcHVibGljIGphdmEuc2VjdXJpdHkuRG9tYWluQ29tYmluZXIgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTIgbmFtZSA9U2VjdXJlSXRlcmF0b3IgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TGphdmF4L3NlY3VyaXR5L2F1dGgvU3ViamVjdCRTZWN1cmVTZXQ7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS91dGlsL0l0ZXJhdG9yPFRTU1Q7PjsgKQotIGNsYXNzIGphdmF4LnNlY3VyaXR5LmF1dGguU3ViamVjdCRTZWN1cmVTZXQkU2VjdXJlSXRlcmF0b3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLkl0ZXJhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9JdGVyYXRvcjxUU1NUOz47ICkKLXByb3RlY3RlZCBqYXZhLnV0aWwuSXRlcmF0b3IgaXRlcmF0b3IKLQotZmluYWwgamF2YXguc2VjdXJpdHkuYXV0aC5TdWJqZWN0JFNlY3VyZVNldCB0aGlzJDEKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0l0ZXJhdG9yPFRTU1Q7PjspViApCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oCi1qYXZheC5zZWN1cml0eS5hdXRoLlN1YmplY3QkU2VjdXJlU2V0Ci1qYXZhLnV0aWwuSXRlcmF0b3IpCi0KLXB1YmxpYyBib29sZWFuIGhhc05leHQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVFNTVDsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgbmV4dCgpCi0KLXB1YmxpYyB2b2lkIHJlbW92ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotIGNsYXNzIGphdmF4LnNlY3VyaXR5LmF1dGguU3ViamVjdCRTZWN1cmVTZXQkMSBleHRlbmRzIGphdmF4LnNlY3VyaXR5LmF1dGguU3ViamVjdCRTZWN1cmVTZXQkU2VjdXJlSXRlcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgamF2YXguc2VjdXJpdHkuYXV0aC5TdWJqZWN0JFNlY3VyZVNldCB0aGlzJDEKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZheC5zZWN1cml0eS5hdXRoLlN1YmplY3QkU2VjdXJlU2V0Ci1qYXZhLnV0aWwuSXRlcmF0b3IpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClUU1NUOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBuZXh0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9BYnN0cmFjdFNldDxURTs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi0gY2xhc3MgamF2YXguc2VjdXJpdHkuYXV0aC5TdWJqZWN0JFNlY3VyZVNldCQyIGV4dGVuZHMgamF2YS51dGlsLkFic3RyYWN0U2V0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9MaW5rZWRMaXN0PFRFOz47ICkKLXByaXZhdGUgamF2YS51dGlsLkxpbmtlZExpc3QgZWxlbWVudHMKLQotZmluYWwgamF2YXguc2VjdXJpdHkuYXV0aC5TdWJqZWN0JFNlY3VyZVNldCB0aGlzJDEKLQotZmluYWwgamF2YS5sYW5nLkNsYXNzIHZhbCRjCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YXguc2VjdXJpdHkuYXV0aC5TdWJqZWN0JFNlY3VyZVNldAotamF2YS5sYW5nLkNsYXNzKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShURTspWiApCi1wdWJsaWMgYm9vbGVhbiBhZGQoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9JdGVyYXRvcjxURTs+OyApCi1wdWJsaWMgamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXJhdG9yKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9Db2xsZWN0aW9uPCo+OylaICkKLXB1YmxpYyBib29sZWFuIHJldGFpbkFsbCgKLWphdmEudXRpbC5Db2xsZWN0aW9uKQotCi1wdWJsaWMgaW50IHNpemUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTggbmFtZSA9U2VjdXJlU2V0ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08U1NUOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS91dGlsL0Fic3RyYWN0U2V0PFRTU1Q7PjtMamF2YS9pby9TZXJpYWxpemFibGU7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGphdmF4L3NlY3VyaXR5L2F1dGgvU3ViamVjdCRTZWN1cmVTZXQkU2VjdXJlSXRlcmF0b3I7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxqYXZheC9zZWN1cml0eS9hdXRoL1N1YmplY3Q7ICkKLWZpbmFsIGNsYXNzIGphdmF4LnNlY3VyaXR5LmF1dGguU3ViamVjdCRTZWN1cmVTZXQgZXh0ZW5kcyBqYXZhLnV0aWwuQWJzdHJhY3RTZXQgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VUX1ByaW5jaXBhbAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VUX1ByaXZDcmVkCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRVRfUHViQ3JlZAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0xpbmtlZExpc3Q8VFNTVDs+OyApCi1wcml2YXRlIGphdmEudXRpbC5MaW5rZWRMaXN0IGVsZW1lbnRzCi0KLXByaXZhdGUgdHJhbnNpZW50IGphdmF4LnNlY3VyaXR5LmF1dGguQXV0aFBlcm1pc3Npb24gcGVybWlzc2lvbgotCi1wcml2YXRlIGludCBzZXRUeXBlCi0KLWZpbmFsIGphdmF4LnNlY3VyaXR5LmF1dGguU3ViamVjdCB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oCi1qYXZheC5zZWN1cml0eS5hdXRoLlN1YmplY3QKLWphdmF4LnNlY3VyaXR5LmF1dGguQXV0aFBlcm1pc3Npb24pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZheC9zZWN1cml0eS9hdXRoL0F1dGhQZXJtaXNzaW9uO0xqYXZhL3V0aWwvQ29sbGVjdGlvbjwrVFNTVDs+OylWICkKLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLWphdmF4LnNlY3VyaXR5LmF1dGguU3ViamVjdAotamF2YXguc2VjdXJpdHkuYXV0aC5BdXRoUGVybWlzc2lvbgotamF2YS51dGlsLkNvbGxlY3Rpb24pCi0KLXN0YXRpYyBqYXZheC5zZWN1cml0eS5hdXRoLkF1dGhQZXJtaXNzaW9uIGFjY2VzcyQ2MDAoCi1qYXZheC5zZWN1cml0eS5hdXRoLlN1YmplY3QkU2VjdXJlU2V0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL2xhbmcvQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoCi1qYXZhLmlvLk9iamVjdElucHV0U3RyZWFtKQotCi1wcml2YXRlIHZvaWQgdmVyaWZ5RWxlbWVudCgKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCB3cml0ZU9iamVjdCgKLWphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShUU1NUOylaICkKLXB1YmxpYyBib29sZWFuIGFkZCgKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEU6TGphdmEvbGFuZy9PYmplY3Q7PihMamF2YS9sYW5nL0NsYXNzPFRFOz47KUxqYXZhL3V0aWwvU2V0PFRFOz47ICkKLXByb3RlY3RlZCBmaW5hbCBqYXZhLnV0aWwuU2V0IGdldCgKLWphdmEubGFuZy5DbGFzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvSXRlcmF0b3I8VFNTVDs+OyApCi1wdWJsaWMgamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXJhdG9yKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9Db2xsZWN0aW9uPCo+OylaICkKLXB1YmxpYyBib29sZWFuIHJldGFpbkFsbCgKLWphdmEudXRpbC5Db2xsZWN0aW9uKQotCi1wdWJsaWMgaW50IHNpemUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TGphdmF4L3NlY3VyaXR5L2F1dGgvU3ViamVjdCRTZWN1cmVTZXQ7ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBqYXZheC5zZWN1cml0eS5hdXRoLlN1YmplY3QgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YXguc2VjdXJpdHkuYXV0aC5BdXRoUGVybWlzc2lvbiBfQVMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YXguc2VjdXJpdHkuYXV0aC5BdXRoUGVybWlzc2lvbiBfQVNfUFJJVklMRUdFRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZheC5zZWN1cml0eS5hdXRoLkF1dGhQZXJtaXNzaW9uIF9QUklOQ0lQQUxTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmF4LnNlY3VyaXR5LmF1dGguQXV0aFBlcm1pc3Npb24gX1BSSVZBVEVfQ1JFREVOVElBTFMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YXguc2VjdXJpdHkuYXV0aC5BdXRoUGVybWlzc2lvbiBfUFVCTElDX0NSRURFTlRJQUxTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmF4LnNlY3VyaXR5LmF1dGguQXV0aFBlcm1pc3Npb24gX1JFQURfT05MWQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZheC5zZWN1cml0eS5hdXRoLkF1dGhQZXJtaXNzaW9uIF9TVUJKRUNUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvU2V0PExqYXZhL3NlY3VyaXR5L1ByaW5jaXBhbDs+OyApCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5TZXQgcHJpbmNpcGFscwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZheC9zZWN1cml0eS9hdXRoL1N1YmplY3QkU2VjdXJlU2V0PExqYXZhL2xhbmcvT2JqZWN0Oz47ICkKLXByaXZhdGUgdHJhbnNpZW50IGphdmF4LnNlY3VyaXR5LmF1dGguU3ViamVjdCRTZWN1cmVTZXQgcHJpdmF0ZUNyZWRlbnRpYWxzCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmF4L3NlY3VyaXR5L2F1dGgvU3ViamVjdCRTZWN1cmVTZXQ8TGphdmEvbGFuZy9PYmplY3Q7PjsgKQotcHJpdmF0ZSB0cmFuc2llbnQgamF2YXguc2VjdXJpdHkuYXV0aC5TdWJqZWN0JFNlY3VyZVNldCBwdWJsaWNDcmVkZW50aWFscwotCi1wcml2YXRlIGJvb2xlYW4gcmVhZE9ubHkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFpMamF2YS91dGlsL1NldDwrTGphdmEvc2VjdXJpdHkvUHJpbmNpcGFsOz47TGphdmEvdXRpbC9TZXQ8Kj47TGphdmEvdXRpbC9TZXQ8Kj47KVYgKQotcHVibGljIHZvaWQgPGluaXQ+KAotYm9vbGVhbgotamF2YS51dGlsLlNldAotamF2YS51dGlsLlNldAotamF2YS51dGlsLlNldCkKLQotc3RhdGljIGphdmF4LnNlY3VyaXR5LmF1dGguQXV0aFBlcm1pc3Npb24gYWNjZXNzJDAwMCgpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQxMDAoCi1qYXZheC5zZWN1cml0eS5hdXRoLlN1YmplY3QpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQyMDAoCi1qYXZhLnNlY3VyaXR5LlBlcm1pc3Npb24pCi0KLXN0YXRpYyBqYXZheC5zZWN1cml0eS5hdXRoLkF1dGhQZXJtaXNzaW9uIGFjY2VzcyQzMDAoKQotCi1zdGF0aWMgamF2YS51dGlsLlNldCBhY2Nlc3MkNDAwKAotamF2YXguc2VjdXJpdHkuYXV0aC5TdWJqZWN0KQotCi1zdGF0aWMgamF2YXguc2VjdXJpdHkuYXV0aC5BdXRoUGVybWlzc2lvbiBhY2Nlc3MkNTAwKCkKLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja1Blcm1pc3Npb24oCi1qYXZhLnNlY3VyaXR5LlBlcm1pc3Npb24pCi0KLXByaXZhdGUgdm9pZCBjaGVja1N0YXRlKCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuT2JqZWN0IGRvQXMoCi1qYXZheC5zZWN1cml0eS5hdXRoLlN1YmplY3QKLWphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5PYmplY3QgZG9BcygKLWphdmF4LnNlY3VyaXR5LmF1dGguU3ViamVjdAotamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5PYmplY3QgZG9Bc1ByaXZpbGVnZWQoCi1qYXZheC5zZWN1cml0eS5hdXRoLlN1YmplY3QKLWphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbgotamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sQ29udGV4dCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5PYmplY3QgZG9Bc1ByaXZpbGVnZWQoCi1qYXZheC5zZWN1cml0eS5hdXRoLlN1YmplY3QKLWphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbgotamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sQ29udGV4dCkKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLk9iamVjdCBkb0FzX1ByaXZpbGVnZWRBY3Rpb24oCi1qYXZheC5zZWN1cml0eS5hdXRoLlN1YmplY3QKLWphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbgotamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sQ29udGV4dCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uOyApCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuT2JqZWN0IGRvQXNfUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigKLWphdmF4LnNlY3VyaXR5LmF1dGguU3ViamVjdAotamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uCi1qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xDb250ZXh0KQotCi1wdWJsaWMgc3RhdGljIGphdmF4LnNlY3VyaXR5LmF1dGguU3ViamVjdCBnZXRTdWJqZWN0KAotamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sQ29udGV4dCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9sYW5nL0NsYXNzTm90Rm91bmRFeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCByZWFkT2JqZWN0KAotamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KAotamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0pCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL1NldDxMamF2YS9zZWN1cml0eS9QcmluY2lwYWw7PjsgKQotcHVibGljIGphdmEudXRpbC5TZXQgZ2V0UHJpbmNpcGFscygpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFQ6OkxqYXZhL3NlY3VyaXR5L1ByaW5jaXBhbDs+KExqYXZhL2xhbmcvQ2xhc3M8VFQ7PjspTGphdmEvdXRpbC9TZXQ8VFQ7PjsgKQotcHVibGljIGphdmEudXRpbC5TZXQgZ2V0UHJpbmNpcGFscygKLWphdmEubGFuZy5DbGFzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvU2V0PExqYXZhL2xhbmcvT2JqZWN0Oz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuU2V0IGdldFByaXZhdGVDcmVkZW50aWFscygpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFQ6TGphdmEvbGFuZy9PYmplY3Q7PihMamF2YS9sYW5nL0NsYXNzPFRUOz47KUxqYXZhL3V0aWwvU2V0PFRUOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuU2V0IGdldFByaXZhdGVDcmVkZW50aWFscygKLWphdmEubGFuZy5DbGFzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvU2V0PExqYXZhL2xhbmcvT2JqZWN0Oz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuU2V0IGdldFB1YmxpY0NyZWRlbnRpYWxzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+KExqYXZhL2xhbmcvQ2xhc3M8VFQ7PjspTGphdmEvdXRpbC9TZXQ8VFQ7PjsgKQotcHVibGljIGphdmEudXRpbC5TZXQgZ2V0UHVibGljQ3JlZGVudGlhbHMoCi1qYXZhLmxhbmcuQ2xhc3MpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1wdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkKLQotcHVibGljIHZvaWQgc2V0UmVhZE9ubHkoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YXguc2VjdXJpdHkuYXV0aC5TdWJqZWN0RG9tYWluQ29tYmluZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5Eb21haW5Db21iaW5lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZheC5zZWN1cml0eS5hdXRoLkF1dGhQZXJtaXNzaW9uIF9HRVQKLQotcHJpdmF0ZSBqYXZheC5zZWN1cml0eS5hdXRoLlN1YmplY3Qgc3ViamVjdAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YXguc2VjdXJpdHkuYXV0aC5TdWJqZWN0KQotCi1wdWJsaWMgamF2YS5zZWN1cml0eS5Qcm90ZWN0aW9uRG9tYWluW10gY29tYmluZSgKLWphdmEuc2VjdXJpdHkuUHJvdGVjdGlvbkRvbWFpbltdCi1qYXZhLnNlY3VyaXR5LlByb3RlY3Rpb25Eb21haW5bXSkKLQotcHVibGljIGphdmF4LnNlY3VyaXR5LmF1dGguU3ViamVjdCBnZXRTdWJqZWN0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjay5DYWxsYmFjayBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrLkNhbGxiYWNrSGFuZGxlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZheC9zZWN1cml0eS9hdXRoL2NhbGxiYWNrL1Vuc3VwcG9ydGVkQ2FsbGJhY2tFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGhhbmRsZSgKLWphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2suQ2FsbGJhY2tbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrLlBhc3N3b3JkQ2FsbGJhY2sgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjay5DYWxsYmFjaywgamF2YS5pby5TZXJpYWxpemFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0KLSBib29sZWFuIGVjaG9PbgotCi1wcml2YXRlIGNoYXJbXSBpbnB1dFBhc3N3b3JkCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBwcm9tcHQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgc2V0UHJvbXB0KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgY2xlYXJQYXNzd29yZCgpCi0KLXB1YmxpYyBjaGFyW10gZ2V0UGFzc3dvcmQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRQcm9tcHQoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0VjaG9PbigpCi0KLXB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKAotY2hhcltdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2suVW5zdXBwb3J0ZWRDYWxsYmFja0V4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5FeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0KLXByaXZhdGUgamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjay5DYWxsYmFjayBjYWxsYmFjawotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2suQ2FsbGJhY2spCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2suQ2FsbGJhY2sKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrLkNhbGxiYWNrIGdldENhbGxiYWNrKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZheC5zZWN1cml0eS5hdXRoLmxvZ2luLkxvZ2luRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5zZWN1cml0eS5HZW5lcmFsU2VjdXJpdHlFeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBqYXZheC5zZWN1cml0eS5hdXRoLng1MDAuWDUwMFByaW5jaXBhbCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgamF2YS5zZWN1cml0eS5QcmluY2lwYWwKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENBTk9OSUNBTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUkZDMTc3OQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUkZDMjI1MwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSB0cmFuc2llbnQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDEuTmFtZSBkbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uSW5wdXRTdHJlYW0pCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9sYW5nL0NsYXNzTm90Rm91bmRFeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCByZWFkT2JqZWN0KAotamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KAotamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0pCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBieXRlW10gZ2V0RW5jb2RlZCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE5hbWUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXROYW1lKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZheC5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmF4L3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJ5dGVbXSBnZXRFbmNvZGVkKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEuc2VjdXJpdHkuUHVibGljS2V5IGdldFB1YmxpY0tleSgpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmF4L3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvTm9TdWNoUHJvdmlkZXJFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvU2lnbmF0dXJlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB2ZXJpZnkoCi1qYXZhLnNlY3VyaXR5LlB1YmxpY0tleSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YXgvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9Ob1N1Y2hQcm92aWRlckV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9TaWduYXR1cmVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHZlcmlmeSgKLWphdmEuc2VjdXJpdHkuUHVibGljS2V5Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmF4LnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YXguc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uIGV4dGVuZHMgamF2YXguc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmF4LnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVFeHBpcmVkRXhjZXB0aW9uIGV4dGVuZHMgamF2YXguc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmF4LnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVOb3RZZXRWYWxpZEV4Y2VwdGlvbiBleHRlbmRzIGphdmF4LnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVFeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZheC5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbiBleHRlbmRzIGphdmF4LnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVFeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1MamF2YXgvc2VjdXJpdHkvY2VydC9YNTA5Q2VydGlmaWNhdGU7ICkKLWZpbmFsIGNsYXNzIGphdmF4LnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZheC5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZSBleHRlbmRzIGphdmF4LnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IgY29uc3RydWN0b3IKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmF4L3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YXguc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGUgZ2V0SW5zdGFuY2UoCi1qYXZhLmlvLklucHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZheC9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmF4LnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlIGdldEluc3RhbmNlKAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZheC9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRXhwaXJlZEV4Y2VwdGlvbjtMamF2YXgvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZU5vdFlldFZhbGlkRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBjaGVja1ZhbGlkaXR5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YXgvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUV4cGlyZWRFeGNlcHRpb247TGphdmF4L3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVOb3RZZXRWYWxpZEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgY2hlY2tWYWxpZGl0eSgKLWphdmEudXRpbC5EYXRlKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zZWN1cml0eS5QcmluY2lwYWwgZ2V0SXNzdWVyRE4oKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLkRhdGUgZ2V0Tm90QWZ0ZXIoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLkRhdGUgZ2V0Tm90QmVmb3JlKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldFNlcmlhbE51bWJlcigpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldFNpZ0FsZ05hbWUoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRTaWdBbGdPSUQoKQotCi1wdWJsaWMgYWJzdHJhY3QgYnl0ZVtdIGdldFNpZ0FsZ1BhcmFtcygpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbCBnZXRTdWJqZWN0RE4oKQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldFZlcnNpb24oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLWZpbmFsIGNsYXNzIGphdmF4LnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlJDIgZXh0ZW5kcyBqYXZheC5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlIHZhbCRjZXJ0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YXgvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUV4cGlyZWRFeGNlcHRpb247TGphdmF4L3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVOb3RZZXRWYWxpZEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY2hlY2tWYWxpZGl0eSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmF4L3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVFeHBpcmVkRXhjZXB0aW9uO0xqYXZheC9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlTm90WWV0VmFsaWRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNoZWNrVmFsaWRpdHkoCi1qYXZhLnV0aWwuRGF0ZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YXgvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uOyApCi1wdWJsaWMgYnl0ZVtdIGdldEVuY29kZWQoKQotCi1wdWJsaWMgamF2YS5zZWN1cml0eS5QcmluY2lwYWwgZ2V0SXNzdWVyRE4oKQotCi1wdWJsaWMgamF2YS51dGlsLkRhdGUgZ2V0Tm90QWZ0ZXIoKQotCi1wdWJsaWMgamF2YS51dGlsLkRhdGUgZ2V0Tm90QmVmb3JlKCkKLQotcHVibGljIGphdmEuc2VjdXJpdHkuUHVibGljS2V5IGdldFB1YmxpY0tleSgpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRTZXJpYWxOdW1iZXIoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTaWdBbGdOYW1lKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U2lnQWxnT0lEKCkKLQotcHVibGljIGJ5dGVbXSBnZXRTaWdBbGdQYXJhbXMoKQotCi1wdWJsaWMgamF2YS5zZWN1cml0eS5QcmluY2lwYWwgZ2V0U3ViamVjdEROKCkKLQotcHVibGljIGludCBnZXRWZXJzaW9uKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZheC9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L05vU3VjaFByb3ZpZGVyRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L1NpZ25hdHVyZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgdmVyaWZ5KAotamF2YS5zZWN1cml0eS5QdWJsaWNLZXkpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmF4L3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvTm9TdWNoUHJvdmlkZXJFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvU2lnbmF0dXJlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB2ZXJpZnkoCi1qYXZhLnNlY3VyaXR5LlB1YmxpY0tleQotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZheC5zcWwuQ29ubmVjdGlvbkV2ZW50IGV4dGVuZHMgamF2YS51dGlsLkV2ZW50T2JqZWN0IGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0KLXByaXZhdGUgamF2YS5zcWwuU1FMRXhjZXB0aW9uIHRoZVNRTEV4Y2VwdGlvbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmF4LnNxbC5Qb29sZWRDb25uZWN0aW9uKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZheC5zcWwuUG9vbGVkQ29ubmVjdGlvbgotamF2YS5zcWwuU1FMRXhjZXB0aW9uKQotCi1wdWJsaWMgamF2YS5zcWwuU1FMRXhjZXB0aW9uIGdldFNRTEV4Y2VwdGlvbigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmF4LnNxbC5Db25uZWN0aW9uRXZlbnRMaXN0ZW5lciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGNvbm5lY3Rpb25DbG9zZWQoCi1qYXZheC5zcWwuQ29ubmVjdGlvbkV2ZW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBjb25uZWN0aW9uRXJyb3JPY2N1cnJlZCgKLWphdmF4LnNxbC5Db25uZWN0aW9uRXZlbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmF4LnNxbC5Db25uZWN0aW9uUG9vbERhdGFTb3VyY2UgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5pby5QcmludFdyaXRlciBnZXRMb2dXcml0ZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0TG9naW5UaW1lb3V0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YXguc3FsLlBvb2xlZENvbm5lY3Rpb24gZ2V0UG9vbGVkQ29ubmVjdGlvbigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmF4LnNxbC5Qb29sZWRDb25uZWN0aW9uIGdldFBvb2xlZENvbm5lY3Rpb24oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldExvZ1dyaXRlcigKLWphdmEuaW8uUHJpbnRXcml0ZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0TG9naW5UaW1lb3V0KAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZheC5zcWwuRGF0YVNvdXJjZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnNxbC5Db25uZWN0aW9uIGdldENvbm5lY3Rpb24oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLnNxbC5Db25uZWN0aW9uIGdldENvbm5lY3Rpb24oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmlvLlByaW50V3JpdGVyIGdldExvZ1dyaXRlcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCBnZXRMb2dpblRpbWVvdXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldExvZ1dyaXRlcigKLWphdmEuaW8uUHJpbnRXcml0ZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0TG9naW5UaW1lb3V0KAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZheC5zcWwuUG9vbGVkQ29ubmVjdGlvbiBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBhZGRDb25uZWN0aW9uRXZlbnRMaXN0ZW5lcigKLWphdmF4LnNxbC5Db25uZWN0aW9uRXZlbnRMaXN0ZW5lcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBjbG9zZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEuc3FsLkNvbm5lY3Rpb24gZ2V0Q29ubmVjdGlvbigpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlbW92ZUNvbm5lY3Rpb25FdmVudExpc3RlbmVyKAotamF2YXguc3FsLkNvbm5lY3Rpb25FdmVudExpc3RlbmVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZheC5zcWwuUm93U2V0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc3FsLlJlc3VsdFNldAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGFkZFJvd1NldExpc3RlbmVyKAotamF2YXguc3FsLlJvd1NldExpc3RlbmVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGNsZWFyUGFyYW1ldGVycygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgZXhlY3V0ZSgpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldENvbW1hbmQoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXREYXRhU291cmNlTmFtZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZ2V0RXNjYXBlUHJvY2Vzc2luZygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCBnZXRNYXhGaWVsZFNpemUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0TWF4Um93cygpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldFBhc3N3b3JkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldFF1ZXJ5VGltZW91dCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0VHJhbnNhY3Rpb25Jc29sYXRpb24oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9DbGFzczwqPjs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEudXRpbC5NYXAgZ2V0VHlwZU1hcCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0VXJsKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0VXNlcm5hbWUoKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1JlYWRPbmx5KCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgcmVtb3ZlUm93U2V0TGlzdGVuZXIoCi1qYXZheC5zcWwuUm93U2V0TGlzdGVuZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0QXJyYXkoCi1pbnQKLWphdmEuc3FsLkFycmF5KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEFzY2lpU3RyZWFtKAotaW50Ci1qYXZhLmlvLklucHV0U3RyZWFtCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0QmlnRGVjaW1hbCgKLWludAotamF2YS5tYXRoLkJpZ0RlY2ltYWwpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0QmluYXJ5U3RyZWFtKAotaW50Ci1qYXZhLmlvLklucHV0U3RyZWFtCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0QmxvYigKLWludAotamF2YS5zcWwuQmxvYikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRCb29sZWFuKAotaW50Ci1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEJ5dGUoCi1pbnQKLWJ5dGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0Qnl0ZXMoCi1pbnQKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRDaGFyYWN0ZXJTdHJlYW0oCi1pbnQKLWphdmEuaW8uUmVhZGVyCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0Q2xvYigKLWludAotamF2YS5zcWwuQ2xvYikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRDb21tYW5kKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRDb25jdXJyZW5jeSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXREYXRhU291cmNlTmFtZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RGF0ZSgKLWludAotamF2YS5zcWwuRGF0ZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXREYXRlKAotaW50Ci1qYXZhLnNxbC5EYXRlCi1qYXZhLnV0aWwuQ2FsZW5kYXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RG91YmxlKAotaW50Ci1kb3VibGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RXNjYXBlUHJvY2Vzc2luZygKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RmxvYXQoCi1pbnQKLWZsb2F0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEludCgKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldExvbmcoCi1pbnQKLWxvbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0TWF4RmllbGRTaXplKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldE1heFJvd3MoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0TnVsbCgKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldE51bGwoCi1pbnQKLWludAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRPYmplY3QoCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0T2JqZWN0KAotaW50Ci1qYXZhLmxhbmcuT2JqZWN0Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0T2JqZWN0KAotaW50Ci1qYXZhLmxhbmcuT2JqZWN0Ci1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRQYXNzd29yZCgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0UXVlcnlUaW1lb3V0KAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFJlYWRPbmx5KAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRSZWYoCi1pbnQKLWphdmEuc3FsLlJlZikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRTaG9ydCgKLWludAotc2hvcnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0U3RyaW5nKAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFRpbWUoCi1pbnQKLWphdmEuc3FsLlRpbWUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0VGltZSgKLWludAotamF2YS5zcWwuVGltZQotamF2YS51dGlsLkNhbGVuZGFyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFRpbWVzdGFtcCgKLWludAotamF2YS5zcWwuVGltZXN0YW1wKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFRpbWVzdGFtcCgKLWludAotamF2YS5zcWwuVGltZXN0YW1wCi1qYXZhLnV0aWwuQ2FsZW5kYXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0VHJhbnNhY3Rpb25Jc29sYXRpb24oCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0VHlwZSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9DbGFzczwqPjs+OylWICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRUeXBlTWFwKAotamF2YS51dGlsLk1hcCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRVcmwoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFVzZXJuYW1lKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZheC5zcWwuUm93U2V0RXZlbnQgZXh0ZW5kcyBqYXZhLnV0aWwuRXZlbnRPYmplY3QgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZheC5zcWwuUm93U2V0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZheC5zcWwuUm93U2V0SW50ZXJuYWwgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zcWwuQ29ubmVjdGlvbiBnZXRDb25uZWN0aW9uKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zcWwuUmVzdWx0U2V0IGdldE9yaWdpbmFsKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zcWwuUmVzdWx0U2V0IGdldE9yaWdpbmFsUm93KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLk9iamVjdFtdIGdldFBhcmFtcygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0TWV0YURhdGEoCi1qYXZheC5zcWwuUm93U2V0TWV0YURhdGEpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGphdmF4LnNxbC5Sb3dTZXRMaXN0ZW5lciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGN1cnNvck1vdmVkKAotamF2YXguc3FsLlJvd1NldEV2ZW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCByb3dDaGFuZ2VkKAotamF2YXguc3FsLlJvd1NldEV2ZW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCByb3dTZXRDaGFuZ2VkKAotamF2YXguc3FsLlJvd1NldEV2ZW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZheC5zcWwuUm93U2V0TWV0YURhdGEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zcWwuUmVzdWx0U2V0TWV0YURhdGEKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEF1dG9JbmNyZW1lbnQoCi1pbnQKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0Q2FzZVNlbnNpdGl2ZSgKLWludAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRDYXRhbG9nTmFtZSgKLWludAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRDb2x1bW5Db3VudCgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRDb2x1bW5EaXNwbGF5U2l6ZSgKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldENvbHVtbkxhYmVsKAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldENvbHVtbk5hbWUoCi1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0Q29sdW1uVHlwZSgKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldENvbHVtblR5cGVOYW1lKAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEN1cnJlbmN5KAotaW50Ci1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldE51bGxhYmxlKAotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0UHJlY2lzaW9uKAotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0U2NhbGUoCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zcWwvU1FMRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRTY2hlbWFOYW1lKAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFNlYXJjaGFibGUoCi1pbnQKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0U2lnbmVkKAotaW50Ci1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFRhYmxlTmFtZSgKLWludAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgamF2YXguc3FsLlJvd1NldFJlYWRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NxbC9TUUxFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlYWREYXRhKAotamF2YXguc3FsLlJvd1NldEludGVybmFsKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqYXZheC5zcWwuUm93U2V0V3JpdGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc3FsL1NRTEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gd3JpdGVEYXRhKAotamF2YXguc3FsLlJvd1NldEludGVybmFsKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGphdmF4LnhtbC5YTUxDb25zdGFudHMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERUZBVUxUX05TX1BSRUZJWAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRkVBVFVSRV9TRUNVUkVfUFJPQ0VTU0lORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTlVMTF9OU19VUkkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFJFTEFYTkdfTlNfVVJJCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBXM0NfWE1MX1NDSEVNQV9JTlNUQU5DRV9OU19VUkkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFczQ19YTUxfU0NIRU1BX05TX1VSSQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVzNDX1hQQVRIX0RBVEFUWVBFX05TX1VSSQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgWE1MTlNfQVRUUklCVVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBYTUxOU19BVFRSSUJVVEVfTlNfVVJJCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBYTUxfRFREX05TX1VSSQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgWE1MX05TX1BSRUZJWAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgWE1MX05TX1VSSQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBhYnN0cmFjdCBvcmcudzNjLmRvbS5ET01JbXBsZW1lbnRhdGlvbiBnZXRET01JbXBsZW1lbnRhdGlvbigpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzTmFtZXNwYWNlQXdhcmUoKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1ZhbGlkYXRpbmcoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIGlzWEluY2x1ZGVBd2FyZSgpCi0KLXB1YmxpYyBhYnN0cmFjdCBvcmcudzNjLmRvbS5Eb2N1bWVudCBuZXdEb2N1bWVudCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIG9yZy53M2MuZG9tLkRvY3VtZW50IHBhcnNlKAotamF2YS5pby5GaWxlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBvcmcudzNjLmRvbS5Eb2N1bWVudCBwYXJzZSgKLWphdmEuaW8uSW5wdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIG9yZy53M2MuZG9tLkRvY3VtZW50IHBhcnNlKAotamF2YS5pby5JbnB1dFN0cmVhbQotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgb3JnLnczYy5kb20uRG9jdW1lbnQgcGFyc2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBvcmcudzNjLmRvbS5Eb2N1bWVudCBwYXJzZSgKLW9yZy54bWwuc2F4LklucHV0U291cmNlKQotCi1wdWJsaWMgdm9pZCByZXNldCgpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEVudGl0eVJlc29sdmVyKAotb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEVycm9ySGFuZGxlcigKLW9yZy54bWwuc2F4LkVycm9ySGFuZGxlcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGJvb2xlYW4gY29hbGVzY2UKLQotcHJpdmF0ZSBib29sZWFuIGV4cGFuZEVudGl0eVJlZmVyZW5jZXMKLQotcHJpdmF0ZSBib29sZWFuIGlnbm9yZUNvbW1lbnRzCi0KLXByaXZhdGUgYm9vbGVhbiBpZ25vcmVFbGVtZW50Q29udGVudFdoaXRlc3BhY2UKLQotcHJpdmF0ZSBib29sZWFuIG5hbWVzcGFjZUF3YXJlCi0KLXByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmF4L3htbC9wYXJzZXJzL0ZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3I7ICkKLXB1YmxpYyBzdGF0aWMgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBuZXdJbnN0YW5jZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuT2JqZWN0IGdldEF0dHJpYnV0ZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmF4L3htbC9wYXJzZXJzL1BhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGdldEZlYXR1cmUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYm9vbGVhbiBpc0NvYWxlc2NpbmcoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0V4cGFuZEVudGl0eVJlZmVyZW5jZXMoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0lnbm9yaW5nQ29tbWVudHMoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0lnbm9yaW5nRWxlbWVudENvbnRlbnRXaGl0ZXNwYWNlKCkKLQotcHVibGljIGJvb2xlYW4gaXNOYW1lc3BhY2VBd2FyZSgpCi0KLXB1YmxpYyBib29sZWFuIGlzVmFsaWRhdGluZygpCi0KLXB1YmxpYyBib29sZWFuIGlzWEluY2x1ZGVBd2FyZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmF4L3htbC9wYXJzZXJzL1BhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXIgbmV3RG9jdW1lbnRCdWlsZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0QXR0cmlidXRlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHZvaWQgc2V0Q29hbGVzY2luZygKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldEV4cGFuZEVudGl0eVJlZmVyZW5jZXMoCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZheC94bWwvcGFyc2Vycy9QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRGZWF0dXJlKAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0SWdub3JpbmdDb21tZW50cygKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldElnbm9yaW5nRWxlbWVudENvbnRlbnRXaGl0ZXNwYWNlKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlQXdhcmUoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW5nKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0WEluY2x1ZGVBd2FyZSgKLWJvb2xlYW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MgamF2YXgueG1sLnBhcnNlcnMuRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciBleHRlbmRzIGphdmEubGFuZy5FcnJvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEubGFuZy5FeGNlcHRpb24gY2F1c2UKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuRXhjZXB0aW9uKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuRXhjZXB0aW9uCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLkV4Y2VwdGlvbiBnZXRFeGNlcHRpb24oKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRNZXNzYWdlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLkV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IG9yZy54bWwuc2F4LlBhcnNlciBnZXRQYXJzZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uO0xvcmcveG1sL3NheC9TQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuT2JqZWN0IGdldFByb3BlcnR5KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLnhtbC5zYXguWE1MUmVhZGVyIGdldFhNTFJlYWRlcigpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzTmFtZXNwYWNlQXdhcmUoKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1ZhbGlkYXRpbmcoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIGlzWEluY2x1ZGVBd2FyZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcGFyc2UoCi1qYXZhLmlvLkZpbGUKLW9yZy54bWwuc2F4LkhhbmRsZXJCYXNlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHBhcnNlKAotamF2YS5pby5GaWxlCi1vcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHBhcnNlKAotamF2YS5pby5JbnB1dFN0cmVhbQotb3JnLnhtbC5zYXguSGFuZGxlckJhc2UpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcGFyc2UoCi1qYXZhLmlvLklucHV0U3RyZWFtCi1vcmcueG1sLnNheC5IYW5kbGVyQmFzZQotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBwYXJzZSgKLWphdmEuaW8uSW5wdXRTdHJlYW0KLW9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcGFyc2UoCi1qYXZhLmlvLklucHV0U3RyZWFtCi1vcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHBhcnNlKAotamF2YS5sYW5nLlN0cmluZwotb3JnLnhtbC5zYXguSGFuZGxlckJhc2UpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcGFyc2UoCi1qYXZhLmxhbmcuU3RyaW5nCi1vcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHBhcnNlKAotb3JnLnhtbC5zYXguSW5wdXRTb3VyY2UKLW9yZy54bWwuc2F4LkhhbmRsZXJCYXNlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHBhcnNlKAotb3JnLnhtbC5zYXguSW5wdXRTb3VyY2UKLW9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXIpCi0KLXB1YmxpYyB2b2lkIHJlc2V0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbjtMb3JnL3htbC9zYXgvU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRQcm9wZXJ0eSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBib29sZWFuIG5hbWVzcGFjZUF3YXJlCi0KLXByaXZhdGUgYm9vbGVhbiB2YWxpZGF0aW5nCi0KLXByaXZhdGUgYm9vbGVhbiB4aW5jbHVkZUF3YXJlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YXgveG1sL3BhcnNlcnMvRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsgKQotcHVibGljIHN0YXRpYyBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5IG5ld0luc3RhbmNlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YXgveG1sL3BhcnNlcnMvUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjtMb3JnL3htbC9zYXgvU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbjtMb3JnL3htbC9zYXgvU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBnZXRGZWF0dXJlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJvb2xlYW4gaXNOYW1lc3BhY2VBd2FyZSgpCi0KLXB1YmxpYyBib29sZWFuIGlzVmFsaWRhdGluZygpCi0KLXB1YmxpYyBib29sZWFuIGlzWEluY2x1ZGVBd2FyZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmF4L3htbC9wYXJzZXJzL1BhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlciBuZXdTQVhQYXJzZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZheC94bWwvcGFyc2Vycy9QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uO0xvcmcveG1sL3NheC9TQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uO0xvcmcveG1sL3NheC9TQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEZlYXR1cmUoCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VBd2FyZSgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldFZhbGlkYXRpbmcoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRYSW5jbHVkZUF3YXJlKAotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi0gY2xhc3MganVuaXQuZXh0ZW5zaW9ucy5BY3RpdmVUZXN0U3VpdGUkMSBleHRlbmRzIGphdmEubGFuZy5UaHJlYWQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwganVuaXQuZXh0ZW5zaW9ucy5BY3RpdmVUZXN0U3VpdGUgdGhpcyQwCi0KLWZpbmFsIGp1bml0LmZyYW1ld29yay5UZXN0UmVzdWx0IHZhbCRyZXN1bHQKLQotZmluYWwganVuaXQuZnJhbWV3b3JrLlRlc3QgdmFsJHRlc3QKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qdW5pdC5leHRlbnNpb25zLkFjdGl2ZVRlc3RTdWl0ZQotanVuaXQuZnJhbWV3b3JrLlRlc3QKLWp1bml0LmZyYW1ld29yay5UZXN0UmVzdWx0KQotCi1wdWJsaWMgdm9pZCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqdW5pdC5mcmFtZXdvcmsuVGVzdCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGNvdW50VGVzdENhc2VzKCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgcnVuKAotanVuaXQuZnJhbWV3b3JrLlRlc3RSZXN1bHQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqdW5pdC5mcmFtZXdvcmsuVGVzdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZk5hbWUKLQotcHJpdmF0ZSBqYXZhLnV0aWwuVmVjdG9yIGZUZXN0cwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5DbGFzcykKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLkNsYXNzCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHZvaWQgYWRkVGVzdE1ldGhvZCgKLWphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZAotamF2YS51dGlsLlZlY3RvcgotamF2YS5sYW5nLkNsYXNzKQotCi1wdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IGNyZWF0ZVRlc3QoCi1qYXZhLmxhbmcuQ2xhc3MKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZXhjZXB0aW9uVG9TdHJpbmcoCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvTm9TdWNoTWV0aG9kRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yIGdldFRlc3RDb25zdHJ1Y3RvcigKLWphdmEubGFuZy5DbGFzcykKLQotcHJpdmF0ZSBib29sZWFuIGlzUHVibGljVGVzdE1ldGhvZCgKLWphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCkKLQotcHJpdmF0ZSBib29sZWFuIGlzVGVzdE1ldGhvZCgKLWphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCkKLQotcHJpdmF0ZSBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3Qgd2FybmluZygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIGFkZFRlc3QoCi1qdW5pdC5mcmFtZXdvcmsuVGVzdCkKLQotcHVibGljIHZvaWQgYWRkVGVzdFN1aXRlKAotamF2YS5sYW5nLkNsYXNzKQotCi1wdWJsaWMgaW50IGNvdW50VGVzdENhc2VzKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TmFtZSgpCi0KLXB1YmxpYyB2b2lkIHJ1bigKLWp1bml0LmZyYW1ld29yay5UZXN0UmVzdWx0KQotCi1wdWJsaWMgdm9pZCBydW5UZXN0KAotanVuaXQuZnJhbWV3b3JrLlRlc3QKLWp1bml0LmZyYW1ld29yay5UZXN0UmVzdWx0KQotCi1wdWJsaWMgdm9pZCBzZXROYW1lKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGp1bml0LmZyYW1ld29yay5UZXN0IHRlc3RBdCgKLWludCkKLQotcHVibGljIGludCB0ZXN0Q291bnQoKQotCi1wdWJsaWMgamF2YS51dGlsLkVudW1lcmF0aW9uIHRlc3RzKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGp1bml0LmV4dGVuc2lvbnMuQWN0aXZlVGVzdFN1aXRlIGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvbGF0aWxlIGludCBmQWN0aXZlVGVzdERlYXRoQ291bnQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuQ2xhc3MpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5DbGFzcwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgcnVuKAotanVuaXQuZnJhbWV3b3JrLlRlc3RSZXN1bHQpCi0KLXB1YmxpYyB2b2lkIHJ1bkZpbmlzaGVkKAotanVuaXQuZnJhbWV3b3JrLlRlc3QpCi0KLXB1YmxpYyB2b2lkIHJ1blRlc3QoCi1qdW5pdC5mcmFtZXdvcmsuVGVzdAotanVuaXQuZnJhbWV3b3JrLlRlc3RSZXN1bHQpCi0KLSB2b2lkIHdhaXRVbnRpbEZpbmlzaGVkKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRFcXVhbHMoCi1ieXRlCi1ieXRlKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0RXF1YWxzKAotY2hhcgotY2hhcikKLQotcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydEVxdWFscygKLWRvdWJsZQotZG91YmxlCi1kb3VibGUpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRFcXVhbHMoCi1mbG9hdAotZmxvYXQKLWZsb2F0KQotCi1wdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0RXF1YWxzKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRFcXVhbHMoCi1sb25nCi1sb25nKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0RXF1YWxzKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydEVxdWFscygKLWphdmEubGFuZy5TdHJpbmcKLWJ5dGUKLWJ5dGUpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRFcXVhbHMoCi1qYXZhLmxhbmcuU3RyaW5nCi1jaGFyCi1jaGFyKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0RXF1YWxzKAotamF2YS5sYW5nLlN0cmluZwotZG91YmxlCi1kb3VibGUKLWRvdWJsZSkKLQotcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydEVxdWFscygKLWphdmEubGFuZy5TdHJpbmcKLWZsb2F0Ci1mbG9hdAotZmxvYXQpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRFcXVhbHMoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydEVxdWFscygKLWphdmEubGFuZy5TdHJpbmcKLWxvbmcKLWxvbmcpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRFcXVhbHMoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0RXF1YWxzKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydEVxdWFscygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRFcXVhbHMoCi1qYXZhLmxhbmcuU3RyaW5nCi1zaG9ydAotc2hvcnQpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRFcXVhbHMoCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuCi1ib29sZWFuKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0RXF1YWxzKAotc2hvcnQKLXNob3J0KQotCi1wdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0RXF1YWxzKAotYm9vbGVhbgotYm9vbGVhbikKLQotcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydEZhbHNlKAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydEZhbHNlKAotYm9vbGVhbikKLQotcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydE5vdE51bGwoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0Tm90TnVsbCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnROb3RTYW1lKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydE5vdFNhbWUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0TnVsbCgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnROdWxsKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydFNhbWUoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0U2FtZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRUcnVlKAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydFRydWUoCi1ib29sZWFuKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgZmFpbCgpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBmYWlsKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBmYWlsTm90RXF1YWxzKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdCkKLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBmYWlsTm90U2FtZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgZmFpbFNhbWUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1zdGF0aWMgamF2YS5sYW5nLlN0cmluZyBmb3JtYXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSBleHRlbmRzIGp1bml0LmZyYW1ld29yay5Bc3NlcnQgaW1wbGVtZW50cyBqdW5pdC5mcmFtZXdvcmsuVGVzdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZk5hbWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgaW50IGNvdW50VGVzdENhc2VzKCkKLQotcHJvdGVjdGVkIGp1bml0LmZyYW1ld29yay5UZXN0UmVzdWx0IGNyZWF0ZVJlc3VsdCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE5hbWUoKQotCi1wdWJsaWMganVuaXQuZnJhbWV3b3JrLlRlc3RSZXN1bHQgcnVuKCkKLQotcHVibGljIHZvaWQgcnVuKAotanVuaXQuZnJhbWV3b3JrLlRlc3RSZXN1bHQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9UaHJvd2FibGU7ICkKLXB1YmxpYyB2b2lkIHJ1bkJhcmUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvVGhyb3dhYmxlOyApCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkKLQotcHVibGljIHZvaWQgc2V0TmFtZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9FeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIHNldFVwKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MganVuaXQuZXh0ZW5zaW9ucy5FeGNlcHRpb25UZXN0Q2FzZSBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gamF2YS5sYW5nLkNsYXNzIGZFeHBlY3RlZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5DbGFzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL1Rocm93YWJsZTsgKQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MganVuaXQuZXh0ZW5zaW9ucy5UZXN0RGVjb3JhdG9yIGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLkFzc2VydCBpbXBsZW1lbnRzIGp1bml0LmZyYW1ld29yay5UZXN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCBqdW5pdC5mcmFtZXdvcmsuVGVzdCBmVGVzdAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWp1bml0LmZyYW1ld29yay5UZXN0KQotCi1wdWJsaWMgdm9pZCBiYXNpY1J1bigKLWp1bml0LmZyYW1ld29yay5UZXN0UmVzdWx0KQotCi1wdWJsaWMgaW50IGNvdW50VGVzdENhc2VzKCkKLQotcHVibGljIGp1bml0LmZyYW1ld29yay5UZXN0IGdldFRlc3QoKQotCi1wdWJsaWMgdm9pZCBydW4oCi1qdW5pdC5mcmFtZXdvcmsuVGVzdFJlc3VsdCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGp1bml0LmV4dGVuc2lvbnMuUmVwZWF0ZWRUZXN0IGV4dGVuZHMganVuaXQuZXh0ZW5zaW9ucy5UZXN0RGVjb3JhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgaW50IGZUaW1lc1JlcGVhdAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWp1bml0LmZyYW1ld29yay5UZXN0Ci1pbnQpCi0KLXB1YmxpYyBpbnQgY291bnRUZXN0Q2FzZXMoKQotCi1wdWJsaWMgdm9pZCBydW4oCi1qdW5pdC5mcmFtZXdvcmsuVGVzdFJlc3VsdCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBqdW5pdC5mcmFtZXdvcmsuUHJvdGVjdGFibGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL1Rocm93YWJsZTsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgcHJvdGVjdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotIGNsYXNzIGp1bml0LmV4dGVuc2lvbnMuVGVzdFNldHVwJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMganVuaXQuZnJhbWV3b3JrLlByb3RlY3RhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGp1bml0LmV4dGVuc2lvbnMuVGVzdFNldHVwIHRoaXMkMAotCi1maW5hbCBqdW5pdC5mcmFtZXdvcmsuVGVzdFJlc3VsdCB2YWwkcmVzdWx0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotanVuaXQuZXh0ZW5zaW9ucy5UZXN0U2V0dXAKLWp1bml0LmZyYW1ld29yay5UZXN0UmVzdWx0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBwcm90ZWN0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqdW5pdC5leHRlbnNpb25zLlRlc3RTZXR1cCBleHRlbmRzIGp1bml0LmV4dGVuc2lvbnMuVGVzdERlY29yYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWp1bml0LmZyYW1ld29yay5UZXN0KQotCi1wdWJsaWMgdm9pZCBydW4oCi1qdW5pdC5mcmFtZXdvcmsuVGVzdFJlc3VsdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3MganVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yIGV4dGVuZHMgamF2YS5sYW5nLkVycm9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqdW5pdC5mcmFtZXdvcmsuQ29tcGFyaXNvbkZhaWx1cmUgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0aW9uRmFpbGVkRXJyb3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGZBY3R1YWwKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGZFeHBlY3RlZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE1lc3NhZ2UoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIGp1bml0LmZyYW1ld29yay5UZXN0RmFpbHVyZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIGp1bml0LmZyYW1ld29yay5UZXN0IGZGYWlsZWRUZXN0Ci0KLXByb3RlY3RlZCBqYXZhLmxhbmcuVGhyb3dhYmxlIGZUaHJvd25FeGNlcHRpb24KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qdW5pdC5mcmFtZXdvcmsuVGVzdAotamF2YS5sYW5nLlRocm93YWJsZSkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZXhjZXB0aW9uTWVzc2FnZSgpCi0KLXB1YmxpYyBqdW5pdC5mcmFtZXdvcmsuVGVzdCBmYWlsZWRUZXN0KCkKLQotcHVibGljIGJvb2xlYW4gaXNGYWlsdXJlKCkKLQotcHVibGljIGphdmEubGFuZy5UaHJvd2FibGUgdGhyb3duRXhjZXB0aW9uKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0cmFjZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIGp1bml0LmZyYW1ld29yay5UZXN0TGlzdGVuZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgYWRkRXJyb3IoCi1qdW5pdC5mcmFtZXdvcmsuVGVzdAotamF2YS5sYW5nLlRocm93YWJsZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgYWRkRmFpbHVyZSgKLWp1bml0LmZyYW1ld29yay5UZXN0Ci1qdW5pdC5mcmFtZXdvcmsuQXNzZXJ0aW9uRmFpbGVkRXJyb3IpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGVuZFRlc3QoCi1qdW5pdC5mcmFtZXdvcmsuVGVzdCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc3RhcnRUZXN0KAotanVuaXQuZnJhbWV3b3JrLlRlc3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotIGNsYXNzIGp1bml0LmZyYW1ld29yay5UZXN0UmVzdWx0JDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMganVuaXQuZnJhbWV3b3JrLlByb3RlY3RhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGp1bml0LmZyYW1ld29yay5UZXN0UmVzdWx0IHRoaXMkMAotCi1maW5hbCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgdmFsJHRlc3QKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qdW5pdC5mcmFtZXdvcmsuVGVzdFJlc3VsdAotanVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvVGhyb3dhYmxlOyApCi1wdWJsaWMgdm9pZCBwcm90ZWN0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBqdW5pdC5mcmFtZXdvcmsuVGVzdFJlc3VsdCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIGphdmEudXRpbC5WZWN0b3IgZkVycm9ycwotCi1wcm90ZWN0ZWQgamF2YS51dGlsLlZlY3RvciBmRmFpbHVyZXMKLQotcHJvdGVjdGVkIGphdmEudXRpbC5WZWN0b3IgZkxpc3RlbmVycwotCi1wcm90ZWN0ZWQgaW50IGZSdW5UZXN0cwotCi1wcml2YXRlIGJvb2xlYW4gZlN0b3AKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIGphdmEudXRpbC5WZWN0b3IgY2xvbmVMaXN0ZW5lcnMoKQotCi1wdWJsaWMgdm9pZCBhZGRFcnJvcigKLWp1bml0LmZyYW1ld29yay5UZXN0Ci1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1wdWJsaWMgdm9pZCBhZGRGYWlsdXJlKAotanVuaXQuZnJhbWV3b3JrLlRlc3QKLWp1bml0LmZyYW1ld29yay5Bc3NlcnRpb25GYWlsZWRFcnJvcikKLQotcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoCi1qdW5pdC5mcmFtZXdvcmsuVGVzdExpc3RlbmVyKQotCi1wdWJsaWMgdm9pZCBlbmRUZXN0KAotanVuaXQuZnJhbWV3b3JrLlRlc3QpCi0KLXB1YmxpYyBpbnQgZXJyb3JDb3VudCgpCi0KLXB1YmxpYyBqYXZhLnV0aWwuRW51bWVyYXRpb24gZXJyb3JzKCkKLQotcHVibGljIGludCBmYWlsdXJlQ291bnQoKQotCi1wdWJsaWMgamF2YS51dGlsLkVudW1lcmF0aW9uIGZhaWx1cmVzKCkKLQotcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoCi1qdW5pdC5mcmFtZXdvcmsuVGVzdExpc3RlbmVyKQotCi1wcm90ZWN0ZWQgdm9pZCBydW4oCi1qdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UpCi0KLXB1YmxpYyBpbnQgcnVuQ291bnQoKQotCi1wdWJsaWMgdm9pZCBydW5Qcm90ZWN0ZWQoCi1qdW5pdC5mcmFtZXdvcmsuVGVzdAotanVuaXQuZnJhbWV3b3JrLlByb3RlY3RhYmxlKQotCi1wdWJsaWMgYm9vbGVhbiBzaG91bGRTdG9wKCkKLQotcHVibGljIHZvaWQgc3RhcnRUZXN0KAotanVuaXQuZnJhbWV3b3JrLlRlc3QpCi0KLXB1YmxpYyB2b2lkIHN0b3AoKQotCi1wdWJsaWMgYm9vbGVhbiB3YXNTdWNjZXNzZnVsKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1maW5hbCBjbGFzcyBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlJDEgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgamF2YS5sYW5nLlN0cmluZyB2YWwkbWVzc2FnZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5hbm5vdGF0aW9uLmludGVybmFsLm5scy5NZXNzYWdlcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBzUmVzb3VyY2UKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygKLWphdmEubGFuZy5TdHJpbmcKLWNoYXIpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3RbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuYXJjaGl2ZS5pbnRlcm5hbC5ubHMuTWVzc2FnZXMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgc1Jlc291cmNlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1jaGFyKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nKAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0W10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LmFyY2hpdmUudXRpbC5VdGlsIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBBU0NJSUlnbm9yZUNhc2VSZWdpb25NYXRjaGVzKAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIHRvQVNDSUlMb3dlckNhc2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgdG9BU0NJSVVwcGVyQ2FzZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LmF1dGguaW50ZXJuYWwubmxzLk1lc3NhZ2VzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIHNSZXNvdXJjZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nKAotamF2YS5sYW5nLlN0cmluZwotY2hhcikKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLk9iamVjdFtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5jcnlwdG8uaW50ZXJuYWwuTnVsbENpcGhlclNwaSBleHRlbmRzIGphdmF4LmNyeXB0by5DaXBoZXJTcGkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZheC9jcnlwdG8vU2hvcnRCdWZmZXJFeGNlcHRpb247TGphdmF4L2NyeXB0by9JbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uO0xqYXZheC9jcnlwdG8vQmFkUGFkZGluZ0V4Y2VwdGlvbjsgKQotcHVibGljIGludCBlbmdpbmVEb0ZpbmFsKAotamF2YS5uaW8uQnl0ZUJ1ZmZlcgotamF2YS5uaW8uQnl0ZUJ1ZmZlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YXgvY3J5cHRvL1Nob3J0QnVmZmVyRXhjZXB0aW9uO0xqYXZheC9jcnlwdG8vSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbjtMamF2YXgvY3J5cHRvL0JhZFBhZGRpbmdFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgZW5naW5lRG9GaW5hbCgKLWJ5dGVbXQotaW50Ci1pbnQKLWJ5dGVbXQotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZheC9jcnlwdG8vSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbjtMamF2YXgvY3J5cHRvL0JhZFBhZGRpbmdFeGNlcHRpb247ICkKLXB1YmxpYyBieXRlW10gZW5naW5lRG9GaW5hbCgKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyBpbnQgZW5naW5lR2V0QmxvY2tTaXplKCkKLQotcHVibGljIGJ5dGVbXSBlbmdpbmVHZXRJVigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjsgKQotcHVibGljIGludCBlbmdpbmVHZXRLZXlTaXplKAotamF2YS5zZWN1cml0eS5LZXkpCi0KLXB1YmxpYyBpbnQgZW5naW5lR2V0T3V0cHV0U2l6ZSgKLWludCkKLQotcHVibGljIGphdmEuc2VjdXJpdHkuQWxnb3JpdGhtUGFyYW1ldGVycyBlbmdpbmVHZXRQYXJhbWV0ZXJzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L0ludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGVuZ2luZUluaXQoCi1pbnQKLWphdmEuc2VjdXJpdHkuS2V5Ci1qYXZhLnNlY3VyaXR5LkFsZ29yaXRobVBhcmFtZXRlcnMKLWphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGVuZ2luZUluaXQoCi1pbnQKLWphdmEuc2VjdXJpdHkuS2V5Ci1qYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L0ludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGVuZ2luZUluaXQoCi1pbnQKLWphdmEuc2VjdXJpdHkuS2V5Ci1qYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYwotamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBlbmdpbmVTZXRNb2RlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YXgvY3J5cHRvL05vU3VjaFBhZGRpbmdFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGVuZ2luZVNldFBhZGRpbmcoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zZWN1cml0eS5LZXkgZW5naW5lVW53cmFwKAotYnl0ZVtdCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmF4L2NyeXB0by9TaG9ydEJ1ZmZlckV4Y2VwdGlvbjsgKQotcHVibGljIGludCBlbmdpbmVVcGRhdGUoCi1qYXZhLm5pby5CeXRlQnVmZmVyCi1qYXZhLm5pby5CeXRlQnVmZmVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZheC9jcnlwdG8vU2hvcnRCdWZmZXJFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgZW5naW5lVXBkYXRlKAotYnl0ZVtdCi1pbnQKLWludAotYnl0ZVtdCi1pbnQpCi0KLXB1YmxpYyBieXRlW10gZW5naW5lVXBkYXRlKAotYnl0ZVtdCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YXgvY3J5cHRvL0lsbGVnYWxCbG9ja1NpemVFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjsgKQotcHVibGljIGJ5dGVbXSBlbmdpbmVXcmFwKAotamF2YS5zZWN1cml0eS5LZXkpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LmNyeXB0by5pbnRlcm5hbC5ubHMuTWVzc2FnZXMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgc1Jlc291cmNlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1jaGFyKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nKAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0W10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LmRhbHZpay5OYXRpdmVUZXN0VGFyZ2V0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgZW1wdHlJbmxpbmVNZXRob2QoKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIGVtcHR5SW50ZXJuYWxTdGF0aWNNZXRob2QoKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIGVtcHR5Sm5pU3RhdGljTWV0aG9kMCgpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgZW1wdHlKbmlTdGF0aWNNZXRob2Q2KAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBlbXB0eUpuaVN0YXRpY01ldGhvZDZMKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZ1tdCi1pbnRbXVtdCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0W10KLWphdmEubGFuZy5PYmplY3RbXVtdW11bXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuZGFsdmlrLmRkbWMuQ2h1bmsgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBieXRlW10gZGF0YQotCi1wdWJsaWMgaW50IGxlbmd0aAotCi1wdWJsaWMgaW50IG9mZnNldAotCi1wdWJsaWMgaW50IHR5cGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWphdmEubmlvLkJ5dGVCdWZmZXIpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotYnl0ZVtdCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuZGFsdmlrLmRkbWMuQ2h1bmtIYW5kbGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSFVOS19GQUlMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5uaW8uQnl0ZU9yZGVyIENIVU5LX09SREVSCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS5kYWx2aWsuZGRtYy5DaHVuayBjcmVhdGVGYWlsQ2h1bmsoCi1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdHJpbmcoCi1qYXZhLm5pby5CeXRlQnVmZmVyCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBuYW1lKAotaW50KQotCi1wdWJsaWMgc3RhdGljIHZvaWQgcHV0U3RyaW5nKAotamF2YS5uaW8uQnl0ZUJ1ZmZlcgotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBpbnQgdHlwZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5uaW8uQnl0ZUJ1ZmZlciB3cmFwQ2h1bmsoCi1vcmcuYXBhY2hlLmhhcm1vbnkuZGFsdmlrLmRkbWMuQ2h1bmspCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGNvbm5lY3RlZCgpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGRpc2Nvbm5lY3RlZCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBvcmcuYXBhY2hlLmhhcm1vbnkuZGFsdmlrLmRkbWMuQ2h1bmsgaGFuZGxlQ2h1bmsoCi1vcmcuYXBhY2hlLmhhcm1vbnkuZGFsdmlrLmRkbWMuQ2h1bmspCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LmRhbHZpay5kZG1jLkRkbVNlcnZlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX1BST1RPQ09MX1ZFUlNJT04KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RFRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElTQ09OTkVDVEVECi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNoTWFwPExqYXZhL2xhbmcvSW50ZWdlcjtMb3JnL2FwYWNoZS9oYXJtb255L2RhbHZpay9kZG1jL0NodW5rSGFuZGxlcjs+OyApCi1wcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuSGFzaE1hcCBtSGFuZGxlck1hcAotCi1wcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBib29sZWFuIG1SZWdpc3RyYXRpb25Db21wbGV0ZQotCi1wcml2YXRlIHN0YXRpYyBib29sZWFuIG1SZWdpc3RyYXRpb25UaW1lZE91dAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgYnJvYWRjYXN0KAotaW50KQotCi1wcml2YXRlIHN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkuZGFsdmlrLmRkbWMuQ2h1bmsgZGlzcGF0Y2goCi1pbnQKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZVNlbmRDaHVuaygKLWludAotYnl0ZVtdCi1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVySGFuZGxlcigKLWludAotb3JnLmFwYWNoZS5oYXJtb255LmRhbHZpay5kZG1jLkNodW5rSGFuZGxlcikKLQotcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdHJhdGlvbkNvbXBsZXRlKCkKLQotcHVibGljIHN0YXRpYyB2b2lkIHNlbmRDaHVuaygKLW9yZy5hcGFjaGUuaGFybW9ueS5kYWx2aWsuZGRtYy5DaHVuaykKLQotcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkuZGFsdmlrLmRkbWMuQ2h1bmtIYW5kbGVyIHVucmVnaXN0ZXJIYW5kbGVyKAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5kYWx2aWsuZGRtYy5EZG1WbUludGVybmFsIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIGVuYWJsZVJlY2VudEFsbG9jYXRpb25zKAotYm9vbGVhbikKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBnZXRSZWNlbnRBbGxvY2F0aW9uU3RhdHVzKCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgYnl0ZVtdIGdldFJlY2VudEFsbG9jYXRpb25zKCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgamF2YS5sYW5nLlN0YWNrVHJhY2VFbGVtZW50W10gZ2V0U3RhY2tUcmFjZUJ5SWQoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGJ5dGVbXSBnZXRUaHJlYWRTdGF0cygpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gaGVhcEluZm9Ob3RpZnkoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gaGVhcFNlZ21lbnROb3RpZnkoCi1pbnQKLWludAotYm9vbGVhbikKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCB0aHJlYWROb3RpZnkoCi1ib29sZWFuKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5rZXJuZWwudm0uU3RyaW5nVXRpbHMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBjb21iaW5lU3RyaW5ncygKLWphdmEubGFuZy5PYmplY3RbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkua2VybmVsLnZtLlZNIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgaW50IENQRV9UWVBFX0RJUkVDVE9SWQotCi1zdGF0aWMgZmluYWwgaW50IENQRV9UWVBFX0pBUgotCi1zdGF0aWMgZmluYWwgaW50IENQRV9UWVBFX1RDUAotCi1zdGF0aWMgZmluYWwgaW50IENQRV9UWVBFX1VOS05PV04KLQotc3RhdGljIGZpbmFsIGludCBDUEVfVFlQRV9VTlVTQUJMRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQga2VybmVsVmVyc2lvbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRTaHV0ZG93bkhvb2soCi1qYXZhLmxhbmcuVGhyZWFkKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5DbGFzc0xvYWRlciBib290Q2FsbGVyQ2xhc3NMb2FkZXIoKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5DbGFzc0xvYWRlciBjYWxsZXJDbGFzc0xvYWRlcigpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBjbG9zZUphcnMoKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlT25FeGl0KCkKLQotcHVibGljIHN0YXRpYyB2b2lkIGR1bXBTdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL0NsYXNzTG9hZGVyOylMamF2YS9sYW5nL0NsYXNzPCo+OyApCi1zdGF0aWMgamF2YS5sYW5nLkNsYXNzIGZpbmRDbGFzc09yTnVsbCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5DbGFzc0xvYWRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9DbGFzczwqPjspSSApCi1zdGF0aWMgaW50IGdldENQSW5kZXhJbXBsKAotamF2YS5sYW5nLkNsYXNzKQotCi1zdGF0aWMgaW50IGdldENsYXNzUGF0aENvdW50KCkKLQotc3RhdGljIGZpbmFsIGludCBnZXRDbGFzc1BhdGhFbnRyeVR5cGUoCi1qYXZhLmxhbmcuT2JqZWN0Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgaW50IGdldEtlcm5lbFZlcnNpb24oKQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DbGFzc0xvYWRlciBnZXROb25Cb290c3RyYXBDbGFzc0xvYWRlcigpCi0KLXN0YXRpYyBieXRlW10gZ2V0UGF0aEZyb21DbGFzc1BhdGgoCi1pbnQpCi0KLXN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIgZ2V0U3RhY2tDbGFzc0xvYWRlcigKLWludCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0Vk1BcmdzKCkKLQotcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIGluaXRpYWxpemVDbGFzc0xvYWRlcigKLWphdmEubGFuZy5DbGFzc0xvYWRlcgotYm9vbGVhbikKLQotc3RhdGljIHZvaWQgaW5pdGlhbGl6ZVZNKCkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGludGVybigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZW1vdmVTaHV0ZG93bkhvb2soCi1qYXZhLmxhbmcuVGhyZWFkKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS9zZWN1cml0eS9Qcml2aWxlZ2VkQWN0aW9uPExqYXZhL2xhbmcvT2JqZWN0Oz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLSBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb25GYWN0b3J5JDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbkZhY3RvcnkgdGhpcyQwCi0KLWZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbk1lbWJlciB2YWwkZWwKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb25GYWN0b3J5Ci1vcmcuYXBhY2hlLmhhcm1vbnkubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb25NZW1iZXIpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRmFjdG9yeSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uSGFuZGxlciwgamF2YS5pby5TZXJpYWxpemFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL01hcDxMamF2YS9sYW5nL0NsYXNzPCtMamF2YS9sYW5nL2Fubm90YXRpb24vQW5ub3RhdGlvbjs+O1tMb3JnL2FwYWNoZS9oYXJtb255L2xhbmcvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uTWVtYmVyOz47ICkKLXByaXZhdGUgc3RhdGljIGZpbmFsIHRyYW5zaWVudCBqYXZhLnV0aWwuTWFwIGNhY2hlCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5oYXJtb255LmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uTWVtYmVyW10gZWxlbWVudHMKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL0NsYXNzPCtMamF2YS9sYW5nL2Fubm90YXRpb24vQW5ub3RhdGlvbjs+OyApCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5DbGFzcyBrbGF6egotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9DbGFzczwrTGphdmEvbGFuZy9hbm5vdGF0aW9uL0Fubm90YXRpb247PjtbTG9yZy9hcGFjaGUvaGFybW9ueS9sYW5nL2Fubm90YXRpb24vQW5ub3RhdGlvbk1lbWJlcjspViApCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLkNsYXNzCi1vcmcuYXBhY2hlLmhhcm1vbnkubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb25NZW1iZXJbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9DbGFzczwrTGphdmEvbGFuZy9hbm5vdGF0aW9uL0Fubm90YXRpb247PjtbTG9yZy9hcGFjaGUvaGFybW9ueS9sYW5nL2Fubm90YXRpb24vQW5ub3RhdGlvbk1lbWJlcjspTGphdmEvbGFuZy9hbm5vdGF0aW9uL0Fubm90YXRpb247ICkKLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbiBjcmVhdGVBbm5vdGF0aW9uKAotamF2YS5sYW5nLkNsYXNzCi1vcmcuYXBhY2hlLmhhcm1vbnkubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb25NZW1iZXJbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9DbGFzczwrTGphdmEvbGFuZy9hbm5vdGF0aW9uL0Fubm90YXRpb247PjspW0xvcmcvYXBhY2hlL2hhcm1vbnkvbGFuZy9hbm5vdGF0aW9uL0Fubm90YXRpb25NZW1iZXI7ICkKLXB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uTWVtYmVyW10gZ2V0RWxlbWVudHNEZXNjcmlwdGlvbigKLWphdmEubGFuZy5DbGFzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9sYW5nL0NsYXNzTm90Rm91bmRFeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCByZWFkT2JqZWN0KAotamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9UaHJvd2FibGU7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGludm9rZSgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZAotamF2YS5sYW5nLk9iamVjdFtdKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9sYW5nL2Fubm90YXRpb24vQW5ub3RhdGlvbk1lbWJlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvRW51bTxMb3JnL2FwYWNoZS9oYXJtb255L2xhbmcvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uTWVtYmVyJERlZmF1bHRWYWx1ZXM7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNjQxMCBuYW1lID1EZWZhdWx0VmFsdWVzICkKLWZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbk1lbWJlciREZWZhdWx0VmFsdWVzIGV4dGVuZHMgamF2YS5sYW5nLkVudW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uTWVtYmVyJERlZmF1bHRWYWx1ZXNbXSAkVkFMVUVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uTWVtYmVyJERlZmF1bHRWYWx1ZXMgTk9fVkFMVUUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClWICkKLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uTWVtYmVyJERlZmF1bHRWYWx1ZXMgdmFsdWVPZigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uTWVtYmVyJERlZmF1bHRWYWx1ZXNbXSB2YWx1ZXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9sYW5nL2Fubm90YXRpb24vQW5ub3RhdGlvbk1lbWJlciREZWZhdWx0VmFsdWVzOyApCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uTWVtYmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2hhciBBUlJBWQotCi1wcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNoYXIgRVJST1IKLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuT2JqZWN0IE5PX1ZBTFVFCi0KLXByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2hhciBPVEhFUgotCi1wcm90ZWN0ZWQgdHJhbnNpZW50IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBkZWZpbmluZ01ldGhvZAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvQ2xhc3M8Kj47ICkKLXByb3RlY3RlZCB0cmFuc2llbnQgamF2YS5sYW5nLkNsYXNzIGVsZW1lbnRUeXBlCi0KLXByb3RlY3RlZCBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIG5hbWUKLQotcHJvdGVjdGVkIGZpbmFsIGNoYXIgdGFnCi0KLXByb3RlY3RlZCBmaW5hbCBqYXZhLmxhbmcuT2JqZWN0IHZhbHVlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuQ2xhc3MKLWphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL1Rocm93YWJsZTsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgY29weVZhbHVlKCkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxBcnJheVZhbHVlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9UaHJvd2FibGU7ICkKLXB1YmxpYyB2b2lkIHJldGhyb3dFcnJvcigpCi0KLXByb3RlY3RlZCBvcmcuYXBhY2hlLmhhcm1vbnkubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb25NZW1iZXIgc2V0RGVmaW5pdGlvbigKLW9yZy5hcGFjaGUuaGFybW9ueS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbk1lbWJlcikKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvVGhyb3dhYmxlOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCB2YWxpZGF0ZVZhbHVlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkubG9nZ2luZy5pbnRlcm5hbC5ubHMuTWVzc2FnZXMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgc1Jlc291cmNlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1jaGFyKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nKAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0W10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3NlY3VyaXR5L1ByaXZpbGVnZWRBY3Rpb248TGphdmEvaW8vSW5wdXRTdHJlYW07PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmludGVybmFsLm5ldC53d3cuTWltZVRhYmxlJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmludGVybmFsLm5ldC53d3cuTWltZVRhYmxlIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmludGVybmFsLm5ldC53d3cuTWltZVRhYmxlKQotCi1wdWJsaWMgamF2YS5pby5JbnB1dFN0cmVhbSBydW4oKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmludGVybmFsLm5ldC53d3cuTWltZVRhYmxlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubmV0LkZpbGVOYW1lTWFwCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBVTktOT1dOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS51dGlsLlByb3BlcnRpZXMgdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXN0YXRpYyBqYXZhLmlvLklucHV0U3RyZWFtIGFjY2VzcyQwMDAoCi1vcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5pbnRlcm5hbC5uZXQud3d3Lk1pbWVUYWJsZSkKLQotcHJpdmF0ZSBqYXZhLmlvLklucHV0U3RyZWFtIGdldENvbnRlbnRUeXBlcygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldENvbnRlbnRUeXBlRm9yKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5pbnRlcm5hbC5uZXQud3d3LnByb3RvY29sLmZpbGUuRmlsZVVSTENvbm5lY3Rpb24gZXh0ZW5kcyBqYXZhLm5ldC5VUkxDb25uZWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBqYXZhLmxhbmcuU3RyaW5nIGZpbGVOYW1lCi0KLXByaXZhdGUgamF2YS5pby5JbnB1dFN0cmVhbSBpcwotCi1wcml2YXRlIGJvb2xlYW4gaXNEaXIKLQotcHJpdmF0ZSBpbnQgbGVuZ3RoCi0KLXByaXZhdGUgamF2YS5pby5GaWxlUGVybWlzc2lvbiBwZXJtaXNzaW9uCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5uZXQuVVJMKQotCi1wcml2YXRlIGphdmEuaW8uSW5wdXRTdHJlYW0gZ2V0RGlyZWN0b3J5TGlzdGluZygKLWphdmEuaW8uRmlsZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY29ubmVjdCgpCi0KLXB1YmxpYyBpbnQgZ2V0Q29udGVudExlbmd0aCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldENvbnRlbnRUeXBlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuaW8uSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uIGdldFBlcm1pc3Npb24oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmludGVybmFsLm5ldC53d3cucHJvdG9jb2wuZmlsZS5IYW5kbGVyIGV4dGVuZHMgamF2YS5uZXQuVVJMU3RyZWFtSGFuZGxlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBqYXZhLm5ldC5VUkxDb25uZWN0aW9uIG9wZW5Db25uZWN0aW9uKAotamF2YS5uZXQuVVJMKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5uZXQuVVJMQ29ubmVjdGlvbiBvcGVuQ29ubmVjdGlvbigKLWphdmEubmV0LlVSTAotamF2YS5uZXQuUHJveHkpCi0KLXByb3RlY3RlZCB2b2lkIHBhcnNlVVJMKAotamF2YS5uZXQuVVJMCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5pbnRlcm5hbC5uZXQud3d3LnByb3RvY29sLmZ0cC5GdHBVUkxDb25uZWN0aW9uIGV4dGVuZHMgamF2YS5uZXQuVVJMQ29ubmVjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRlRQX0RBVEFPUEVOCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGVFBfRklMRU9LCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGVFBfTE9HR0VESU4KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZUUF9OT1RGT1VORAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRlRQX09LCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGVFBfT1BFTkRBVEEKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZUUF9QQVNXRAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRlRQX1BPUlQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZUUF9UUkFOU0ZFUk9LCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGVFBfVVNFUlJFQURZCi0KLXByaXZhdGUgamF2YS5uZXQuU2VydmVyU29ja2V0IGFjY2VwdFNvY2tldAotCi1wcml2YXRlIGphdmEubmV0LlNvY2tldCBjb250cm9sU29ja2V0Ci0KLXByaXZhdGUgamF2YS5pby5JbnB1dFN0cmVhbSBjdHJsSW5wdXQKLQotcHJpdmF0ZSBqYXZhLmlvLk91dHB1dFN0cmVhbSBjdHJsT3V0cHV0Ci0KLXByaXZhdGUgamF2YS5uZXQuUHJveHkgY3VycmVudFByb3h5Ci0KLXByaXZhdGUgaW50IGRhdGFQb3J0Ci0KLXByaXZhdGUgamF2YS5uZXQuU29ja2V0IGRhdGFTb2NrZXQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGhvc3ROYW1lCi0KLXByaXZhdGUgamF2YS5pby5JbnB1dFN0cmVhbSBpbnB1dFN0cmVhbQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcGFzc3dvcmQKLQotcHJpdmF0ZSBqYXZhLm5ldC5Qcm94eSBwcm94eQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVwbHlDb2RlCi0KLXByaXZhdGUgamF2YS5uZXQuVVJJIHVyaQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgdXNlcm5hbWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oCi1qYXZhLm5ldC5VUkwpCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLWphdmEubmV0LlVSTAotamF2YS5uZXQuUHJveHkpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCBjZCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCBjb25uZWN0SW50ZXJuYWwoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgZ2V0RmlsZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgaW50IGdldFJlcGx5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIGxvZ2luKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHBvcnQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVhZExpbmUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIGJvb2xlYW4gcmVhZE11bHRpTGluZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCBzZW5kRmlsZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCBzZXRUeXBlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHdyaXRlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY29ubmVjdCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldENvbnRlbnRUeXBlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuaW8uSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5pby5PdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbiBnZXRQZXJtaXNzaW9uKCkKLQotcHVibGljIHZvaWQgc2V0RG9JbnB1dCgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldERvT3V0cHV0KAotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLSBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5pbnRlcm5hbC5uZXQud3d3LnByb3RvY29sLmZ0cC5GdHBVUkxJbnB1dFN0cmVhbSBleHRlbmRzIGphdmEuaW8uSW5wdXRTdHJlYW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLm5ldC5Tb2NrZXQgY29udHJvbFNvY2tldAotCi1wcml2YXRlIGphdmEuaW8uSW5wdXRTdHJlYW0gaXMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmlvLklucHV0U3RyZWFtCi1qYXZhLm5ldC5Tb2NrZXQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgYXZhaWxhYmxlKCkKLQotcHVibGljIHZvaWQgY2xvc2UoKQotCi1wdWJsaWMgdm9pZCBtYXJrKAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBtYXJrU3VwcG9ydGVkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCByZWFkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCByZWFkKAotYnl0ZVtdCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcmVzZXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgbG9uZyBza2lwKAotbG9uZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5pbnRlcm5hbC5uZXQud3d3LnByb3RvY29sLmZ0cC5IYW5kbGVyIGV4dGVuZHMgamF2YS5uZXQuVVJMU3RyZWFtSGFuZGxlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByb3RlY3RlZCBpbnQgZ2V0RGVmYXVsdFBvcnQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbiBvcGVuQ29ubmVjdGlvbigKLWphdmEubmV0LlVSTCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGphdmEubmV0LlVSTENvbm5lY3Rpb24gb3BlbkNvbm5lY3Rpb24oCi1qYXZhLm5ldC5VUkwKLWphdmEubmV0LlByb3h5KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmludGVybmFsLm5ldC53d3cucHJvdG9jb2wuaHR0cC5IYW5kbGVyIGV4dGVuZHMgamF2YS5uZXQuVVJMU3RyZWFtSGFuZGxlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByb3RlY3RlZCBpbnQgZ2V0RGVmYXVsdFBvcnQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbiBvcGVuQ29ubmVjdGlvbigKLWphdmEubmV0LlVSTCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGphdmEubmV0LlVSTENvbm5lY3Rpb24gb3BlbkNvbm5lY3Rpb24oCi1qYXZhLm5ldC5VUkwKLWphdmEubmV0LlByb3h5KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmludGVybmFsLm5ldC53d3cucHJvdG9jb2wuaHR0cC5IZWFkZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5sYW5nLkNsb25lYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvSGFzaE1hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS91dGlsL0xpbmtlZExpc3Q8TGphdmEvbGFuZy9TdHJpbmc7Pjs+OyApCi1wcml2YXRlIGphdmEudXRpbC5IYXNoTWFwIGtleVRhYmxlCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9BcnJheUxpc3Q8TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuQXJyYXlMaXN0IHByb3BzCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBzdGF0dXNMaW5lCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvdXRpbC9MaXN0PExqYXZhL2xhbmcvU3RyaW5nOz47PjspViApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuTWFwKQotCi1wdWJsaWMgdm9pZCBhZGQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBjbG9uZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldCgKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL3V0aWwvTGlzdDxMamF2YS9sYW5nL1N0cmluZzs+Oz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuTWFwIGdldEZpZWxkTWFwKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0S2V5KAotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdGF0dXNMaW5lKCkKLQotcHVibGljIGludCBsZW5ndGgoKQotCi1wdWJsaWMgdm9pZCBzZXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRTdGF0dXNMaW5lKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5pbnRlcm5hbC5uZXQud3d3LnByb3RvY29sLmh0dHAuSHR0cENvbmZpZ3VyYXRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBob3N0TmFtZQotCi1wcml2YXRlIGludCBob3N0UG9ydAotCi1wcml2YXRlIGphdmEubmV0LlByb3h5IHByb3h5Ci0KLXByaXZhdGUgamF2YS5uZXQuVVJJIHVyaQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubmV0LlVSSSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5uZXQuVVJJCi1qYXZhLm5ldC5Qcm94eSkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SG9zdE5hbWUoKQotCi1wdWJsaWMgaW50IGdldEhvc3RQb3J0KCkKLQotcHVibGljIGphdmEubmV0LlByb3h5IGdldFByb3h5KCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLXB1YmxpYyBib29sZWFuIHVzZXNQcm94eSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkuaW50ZXJuYWwubmV0Lnd3dy5wcm90b2NvbC5odHRwLkh0dHBDb25uZWN0aW9uIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQ2xhc3MgU09DS0VUX1RJTUVPVVRfQ0xBU1MKLQotcHJpdmF0ZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5pbnRlcm5hbC5uZXQud3d3LnByb3RvY29sLmh0dHAuSHR0cENvbmZpZ3VyYXRpb24gY29uZmlnCi0KLXByaXZhdGUgamF2YS5pby5JbnB1dFN0cmVhbSBpbnB1dFN0cmVhbQotCi1wcml2YXRlIGphdmEuaW8uT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbQotCi1wcml2YXRlIGphdmEubmV0LlNvY2tldCBzb2NrZXQKLQotcHJpdmF0ZSBqYXZhLmlvLklucHV0U3RyZWFtIHNzbElucHV0U3RyZWFtCi0KLXByaXZhdGUgamF2YS5pby5PdXRwdXRTdHJlYW0gc3NsT3V0cHV0U3RyZWFtCi0KLXByaXZhdGUgamF2YXgubmV0LnNzbC5TU0xTb2NrZXQgc3NsU29ja2V0Ci0KLXByaXZhdGUgYm9vbGVhbiB1c2luZ1NlY3VyZVNvY2tldAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkuaW50ZXJuYWwubmV0Lnd3dy5wcm90b2NvbC5odHRwLkh0dHBDb25maWd1cmF0aW9uCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5DbGFzcyBTb2NrZXRUaW1lb3V0RXhjZXB0aW9uQ2xhc3MoKQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTb2NrZXRUaW1lb3V0RXhjZXB0aW9uKAotamF2YS5pby5JbnRlcnJ1cHRlZElPRXhjZXB0aW9uKQotCi1wdWJsaWMgdm9pZCBjbG9zZVNvY2tldEFuZFN0cmVhbXMoKQotCi1wdWJsaWMgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkuaW50ZXJuYWwubmV0Lnd3dy5wcm90b2NvbC5odHRwLkh0dHBDb25maWd1cmF0aW9uIGdldEh0dHBDb25maWd1cmF0aW9uKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuaW8uSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5pby5PdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmF4Lm5ldC5zc2wuU1NMU29ja2V0IGdldFNlY3VyZVNvY2tldCgKLWphdmF4Lm5ldC5zc2wuU1NMU29ja2V0RmFjdG9yeQotamF2YXgubmV0LnNzbC5Ib3N0bmFtZVZlcmlmaWVyKQotCi0gamF2YS5uZXQuU29ja2V0IGdldFNvY2tldCgpCi0KLXByb3RlY3RlZCBib29sZWFuIGlzRWxpZ2libGVGb3JSZWN5Y2xpbmcoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgYm9vbGVhbiBpc1N0YWxlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvU29ja2V0RXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRTb1RpbWVvdXQoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID00MTA0IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9sdW5pL2ludGVybmFsL25ldC93d3cvcHJvdG9jb2wvaHR0cC9IdHRwQ29ubmVjdGlvbk1hbmFnZXI7ICkKLSBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5pbnRlcm5hbC5uZXQud3d3LnByb3RvY29sLmh0dHAuSHR0cENvbm5lY3Rpb25NYW5hZ2VyJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvaW50ZXJuYWwvbmV0L3d3dy9wcm90b2NvbC9odHRwL0h0dHBDb25uZWN0aW9uTWFuYWdlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1Db25uZWN0aW9uUG9vbCApCi0gY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkuaW50ZXJuYWwubmV0Lnd3dy5wcm90b2NvbC5odHRwLkh0dHBDb25uZWN0aW9uTWFuYWdlciRDb25uZWN0aW9uUG9vbCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL01hcDxMb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvaW50ZXJuYWwvbmV0L3d3dy9wcm90b2NvbC9odHRwL0h0dHBDb25maWd1cmF0aW9uO0xqYXZhL3V0aWwvTGlzdDxMb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvaW50ZXJuYWwvbmV0L3d3dy9wcm90b2NvbC9odHRwL0h0dHBDb25uZWN0aW9uOz47PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuTWFwIGZyZWVDb25uZWN0aW9uTWFwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLSB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmludGVybmFsLm5ldC53d3cucHJvdG9jb2wuaHR0cC5IdHRwQ29ubmVjdGlvbk1hbmFnZXIkMSkKLQotcHVibGljIHZvaWQgY2xlYXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkuaW50ZXJuYWwubmV0Lnd3dy5wcm90b2NvbC5odHRwLkh0dHBDb25uZWN0aW9uIGdldEh0dHBDb25uZWN0aW9uKAotb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkuaW50ZXJuYWwubmV0Lnd3dy5wcm90b2NvbC5odHRwLkh0dHBDb25maWd1cmF0aW9uCi1pbnQpCi0KLXB1YmxpYyBpbnQgbnVtRnJlZUNvbm5lY3Rpb25zKCkKLQotcHVibGljIHZvaWQgcmV0dXJuQ29ubmVjdGlvbigKLW9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmludGVybmFsLm5ldC53d3cucHJvdG9jb2wuaHR0cC5IdHRwQ29ubmVjdGlvbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS9pbnRlcm5hbC9uZXQvd3d3L3Byb3RvY29sL2h0dHAvSHR0cENvbm5lY3Rpb25NYW5hZ2VyJDE7TG9yZy9hcGFjaGUvaGFybW9ueS9sdW5pL2ludGVybmFsL25ldC93d3cvcHJvdG9jb2wvaHR0cC9IdHRwQ29ubmVjdGlvbk1hbmFnZXIkQ29ubmVjdGlvblBvb2w7ICkKLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5pbnRlcm5hbC5uZXQud3d3LnByb3RvY29sLmh0dHAuSHR0cENvbm5lY3Rpb25NYW5hZ2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5pbnRlcm5hbC5uZXQud3d3LnByb3RvY29sLmh0dHAuSHR0cENvbm5lY3Rpb25NYW5hZ2VyIGRlZmF1bHRDb25uZWN0aW9uTWFuYWdlcgotCi1wcml2YXRlIHN0YXRpYyBib29sZWFuIGtlZXBBbGl2ZQotCi1wcml2YXRlIHN0YXRpYyBpbnQgbWF4Q29ubmVjdGlvbnMKLQotcHJpdmF0ZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5pbnRlcm5hbC5uZXQud3d3LnByb3RvY29sLmh0dHAuSHR0cENvbm5lY3Rpb25NYW5hZ2VyJENvbm5lY3Rpb25Qb29sIHBvb2wKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQxMDAoKQotCi1zdGF0aWMgaW50IGFjY2VzcyQyMDAoKQotCi1wcml2YXRlIHZvaWQgY2hlY2tTeXN0ZW1Qcm9wZXJ0aWVzKCkKLQotcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5pbnRlcm5hbC5uZXQud3d3LnByb3RvY29sLmh0dHAuSHR0cENvbm5lY3Rpb25NYW5hZ2VyIGdldERlZmF1bHQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkuaW50ZXJuYWwubmV0Lnd3dy5wcm90b2NvbC5odHRwLkh0dHBDb25uZWN0aW9uIGdldENvbm5lY3Rpb24oCi1qYXZhLm5ldC5VUkkKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmludGVybmFsLm5ldC53d3cucHJvdG9jb2wuaHR0cC5IdHRwQ29ubmVjdGlvbiBnZXRDb25uZWN0aW9uKAotamF2YS5uZXQuVVJJCi1qYXZhLm5ldC5Qcm94eQotaW50KQotCi1wdWJsaWMgaW50IG51bUZyZWVDb25uZWN0aW9ucygpCi0KLXB1YmxpYyB2b2lkIHJlc2V0KCkKLQotcHVibGljIHZvaWQgcmV0dXJuQ29ubmVjdGlvblRvUG9vbCgKLW9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmludGVybmFsLm5ldC53d3cucHJvdG9jb2wuaHR0cC5IdHRwQ29ubmVjdGlvbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvc2VjdXJpdHkvUHJpdmlsZWdlZEFjdGlvbjxMamF2YS9uZXQvUmVzcG9uc2VDYWNoZTs+OyApCi0gY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkuaW50ZXJuYWwubmV0Lnd3dy5wcm90b2NvbC5odHRwLkh0dHBVUkxDb25uZWN0aW9uJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmludGVybmFsLm5ldC53d3cucHJvdG9jb2wuaHR0cC5IdHRwVVJMQ29ubmVjdGlvbiB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5pbnRlcm5hbC5uZXQud3d3LnByb3RvY29sLmh0dHAuSHR0cFVSTENvbm5lY3Rpb24pCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IHJ1bigpCi0KLXB1YmxpYyBqYXZhLm5ldC5SZXNwb25zZUNhY2hlIHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPUNodW5rZWRJbnB1dFN0cmVhbSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvaW50ZXJuYWwvbmV0L3d3dy9wcm90b2NvbC9odHRwL0h0dHBVUkxDb25uZWN0aW9uOyApCi0gY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkuaW50ZXJuYWwubmV0Lnd3dy5wcm90b2NvbC5odHRwLkh0dHBVUkxDb25uZWN0aW9uJENodW5rZWRJbnB1dFN0cmVhbSBleHRlbmRzIGphdmEuaW8uSW5wdXRTdHJlYW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBib29sZWFuIGF0RW5kCi0KLXByaXZhdGUgaW50IGJ5dGVzUmVtYWluaW5nCi0KLWZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmludGVybmFsLm5ldC53d3cucHJvdG9jb2wuaHR0cC5IdHRwVVJMQ29ubmVjdGlvbiB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5pbnRlcm5hbC5uZXQud3d3LnByb3RvY29sLmh0dHAuSHR0cFVSTENvbm5lY3Rpb24pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCByZWFkQ2h1bmtTaXplKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCBhdmFpbGFibGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjbG9zZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcmVhZCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcmVhZCgKLWJ5dGVbXQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBsb25nIHNraXAoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPUh0dHBPdXRwdXRTdHJlYW0gKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9sdW5pL2ludGVybmFsL25ldC93d3cvcHJvdG9jb2wvaHR0cC9IdHRwVVJMQ29ubmVjdGlvbjsgKQotIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmludGVybmFsLm5ldC53d3cucHJvdG9jb2wuaHR0cC5IdHRwVVJMQ29ubmVjdGlvbiRIdHRwT3V0cHV0U3RyZWFtIGV4dGVuZHMgamF2YS5pby5PdXRwdXRTdHJlYW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIGludCBNQVgKLQotIGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGNhY2hlCi0KLSBpbnQgY2FjaGVMZW5ndGgKLQotIGJvb2xlYW4gY2xvc2VkCi0KLSBpbnQgZGVmYXVsdENhY2hlU2l6ZQotCi0gaW50IGxpbWl0Ci0KLWZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmludGVybmFsLm5ldC53d3cucHJvdG9jb2wuaHR0cC5IdHRwVVJMQ29ubmVjdGlvbiB0aGlzJDAKLQotIGJvb2xlYW4gd3JpdGVUb1NvY2tldAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmludGVybmFsLm5ldC53d3cucHJvdG9jb2wuaHR0cC5IdHRwVVJMQ29ubmVjdGlvbikKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkuaW50ZXJuYWwubmV0Lnd3dy5wcm90b2NvbC5odHRwLkh0dHBVUkxDb25uZWN0aW9uCi1pbnQpCi0KLXByaXZhdGUgaW50IGNhbGN1bGF0ZUNodW5rRGF0YUxlbmd0aCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCBvdXRwdXQoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgc2VuZENhY2hlKAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY2xvc2UoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBmbHVzaCgpCi0KLSBib29sZWFuIGlzQ2FjaGVkKCkKLQotIGJvb2xlYW4gaXNDaHVua2VkKCkKLQotIGludCBzaXplKCkKLQotIGJ5dGVbXSB0b0J5dGVBcnJheSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHdyaXRlKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB3cml0ZSgKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPUxpbWl0ZWRJbnB1dFN0cmVhbSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvaW50ZXJuYWwvbmV0L3d3dy9wcm90b2NvbC9odHRwL0h0dHBVUkxDb25uZWN0aW9uOyApCi0gY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkuaW50ZXJuYWwubmV0Lnd3dy5wcm90b2NvbC5odHRwLkh0dHBVUkxDb25uZWN0aW9uJExpbWl0ZWRJbnB1dFN0cmVhbSBleHRlbmRzIGphdmEuaW8uSW5wdXRTdHJlYW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGludCBieXRlc1JlbWFpbmluZwotCi1maW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5pbnRlcm5hbC5uZXQud3d3LnByb3RvY29sLmh0dHAuSHR0cFVSTENvbm5lY3Rpb24gdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkuaW50ZXJuYWwubmV0Lnd3dy5wcm90b2NvbC5odHRwLkh0dHBVUkxDb25uZWN0aW9uCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgYXZhaWxhYmxlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY2xvc2UoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoCi1ieXRlW10KLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgbG9uZyBza2lwKAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS9pbnRlcm5hbC9uZXQvd3d3L3Byb3RvY29sL2h0dHAvSHR0cFVSTENvbm5lY3Rpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MiBuYW1lID1Mb2NhbENsb3NlSW5wdXRTdHJlYW0gKQotIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmludGVybmFsLm5ldC53d3cucHJvdG9jb2wuaHR0cC5IdHRwVVJMQ29ubmVjdGlvbiRMb2NhbENsb3NlSW5wdXRTdHJlYW0gZXh0ZW5kcyBqYXZhLmlvLklucHV0U3RyZWFtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYm9vbGVhbiBjbG9zZWQKLQotZmluYWwgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkuaW50ZXJuYWwubmV0Lnd3dy5wcm90b2NvbC5odHRwLkh0dHBVUkxDb25uZWN0aW9uIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmludGVybmFsLm5ldC53d3cucHJvdG9jb2wuaHR0cC5IdHRwVVJMQ29ubmVjdGlvbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHRocm93Q2xvc2VkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCBhdmFpbGFibGUoKQotCi1wdWJsaWMgdm9pZCBjbG9zZSgpCi0KLXB1YmxpYyB2b2lkIG1hcmsoCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcmVhZCgKLWJ5dGVbXQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHJlc2V0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGxvbmcgc2tpcCgKLWxvbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvaW50ZXJuYWwvbmV0L3d3dy9wcm90b2NvbC9odHRwL0h0dHBVUkxDb25uZWN0aW9uJEh0dHBPdXRwdXRTdHJlYW07TG9yZy9hcGFjaGUvaGFybW9ueS9sdW5pL2ludGVybmFsL25ldC93d3cvcHJvdG9jb2wvaHR0cC9IdHRwVVJMQ29ubmVjdGlvbiRDaHVua2VkSW5wdXRTdHJlYW07TG9yZy9hcGFjaGUvaGFybW9ueS9sdW5pL2ludGVybmFsL25ldC93d3cvcHJvdG9jb2wvaHR0cC9IdHRwVVJMQ29ubmVjdGlvbiRMaW1pdGVkSW5wdXRTdHJlYW07TG9yZy9hcGFjaGUvaGFybW9ueS9sdW5pL2ludGVybmFsL25ldC93d3cvcHJvdG9jb2wvaHR0cC9IdHRwVVJMQ29ubmVjdGlvbiRMb2NhbENsb3NlSW5wdXRTdHJlYW07ICkKLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5pbnRlcm5hbC5uZXQud3d3LnByb3RvY29sLmh0dHAuSHR0cFVSTENvbm5lY3Rpb24gZXh0ZW5kcyBqYXZhLm5ldC5IdHRwVVJMQ29ubmVjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEdFVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEhFQUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQT1NUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUFVUCi0KLXByaXZhdGUgc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmludGVybmFsLm5ldC53d3cucHJvdG9jb2wuaHR0cC5IZWFkZXIgZGVmYXVsdFJlcUhlYWRlcgotCi1wcml2YXRlIGphdmEuaW8uT3V0cHV0U3RyZWFtIGNhY2hlT3V0Ci0KLXByaXZhdGUgamF2YS5uZXQuQ2FjaGVSZXF1ZXN0IGNhY2hlUmVxdWVzdAotCi1wcml2YXRlIGphdmEubmV0LkNhY2hlUmVzcG9uc2UgY2FjaGVSZXNwb25zZQotCi1wcm90ZWN0ZWQgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkuaW50ZXJuYWwubmV0Lnd3dy5wcm90b2NvbC5odHRwLkh0dHBDb25uZWN0aW9uIGNvbm5lY3Rpb24KLQotcHJpdmF0ZSBmaW5hbCBpbnQgZGVmYXVsdFBvcnQKLQotcHJpdmF0ZSBib29sZWFuIGhhc1RyaWVkQ2FjaGUKLQotcHJpdmF0ZSBqYXZhLm5ldC5JbmV0QWRkcmVzcyBob3N0QWRkcmVzcwotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgaG9zdE5hbWUKLQotcHJpdmF0ZSBpbnQgaG9zdFBvcnQKLQotcHJpdmF0ZSBpbnQgaHR0cFZlcnNpb24KLQotcHJpdmF0ZSBqYXZhLmlvLklucHV0U3RyZWFtIGlzCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkuaW50ZXJuYWwubmV0Lnd3dy5wcm90b2NvbC5odHRwLkh0dHBVUkxDb25uZWN0aW9uJEh0dHBPdXRwdXRTdHJlYW0gb3MKLQotcHJpdmF0ZSBqYXZhLm5ldC5Qcm94eSBwcm94eQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcHJveHlOYW1lCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkuaW50ZXJuYWwubmV0Lnd3dy5wcm90b2NvbC5odHRwLkhlYWRlciByZXFIZWFkZXIKLQotcHJpdmF0ZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5pbnRlcm5hbC5uZXQud3d3LnByb3RvY29sLmh0dHAuSGVhZGVyIHJlc0hlYWRlcgotCi1wcml2YXRlIGphdmEubmV0LlJlc3BvbnNlQ2FjaGUgcmVzcG9uc2VDYWNoZQotCi0gYm9vbGVhbiBzZW5kQ2h1bmtlZAotCi1wcml2YXRlIGJvb2xlYW4gc2VudFJlcXVlc3QKLQotcHJpdmF0ZSBqYXZhLmlvLk91dHB1dFN0cmVhbSBzb2NrZXRPdXQKLQotcHJpdmF0ZSBqYXZhLmlvLklucHV0U3RyZWFtIHVpcwotCi1wcml2YXRlIGphdmEubmV0LlVSSSB1cmkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLWphdmEubmV0LlVSTCkKLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotamF2YS5uZXQuVVJMCi1pbnQpCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLWphdmEubmV0LlVSTAotaW50Ci1qYXZhLm5ldC5Qcm94eSkKLQotc3RhdGljIGphdmEuaW8uSW5wdXRTdHJlYW0gYWNjZXNzJDAwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmludGVybmFsLm5ldC53d3cucHJvdG9jb2wuaHR0cC5IdHRwVVJMQ29ubmVjdGlvbikKLQotc3RhdGljIHZvaWQgYWNjZXNzJDEwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmludGVybmFsLm5ldC53d3cucHJvdG9jb2wuaHR0cC5IdHRwVVJMQ29ubmVjdGlvbgotYm9vbGVhbikKLQotc3RhdGljIGludCBhY2Nlc3MkMTAwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmludGVybmFsLm5ldC53d3cucHJvdG9jb2wuaHR0cC5IdHRwVVJMQ29ubmVjdGlvbikKLQotc3RhdGljIGludCBhY2Nlc3MkMTEwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmludGVybmFsLm5ldC53d3cucHJvdG9jb2wuaHR0cC5IdHRwVVJMQ29ubmVjdGlvbikKLQotc3RhdGljIGphdmEuaW8uT3V0cHV0U3RyZWFtIGFjY2VzcyQxMjAwKAotb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkuaW50ZXJuYWwubmV0Lnd3dy5wcm90b2NvbC5odHRwLkh0dHBVUkxDb25uZWN0aW9uKQotCi1zdGF0aWMgYm9vbGVhbiBhY2Nlc3MkMjAwKAotb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkuaW50ZXJuYWwubmV0Lnd3dy5wcm90b2NvbC5odHRwLkh0dHBVUkxDb25uZWN0aW9uKQotCi1zdGF0aWMgamF2YS5uZXQuQ2FjaGVSZXF1ZXN0IGFjY2VzcyQzMDAoCi1vcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5pbnRlcm5hbC5uZXQud3d3LnByb3RvY29sLmh0dHAuSHR0cFVSTENvbm5lY3Rpb24pCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQ0MDAoCi1vcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5pbnRlcm5hbC5uZXQud3d3LnByb3RvY29sLmh0dHAuSHR0cFVSTENvbm5lY3Rpb24pCi0KLXN0YXRpYyBqYXZhLmlvLk91dHB1dFN0cmVhbSBhY2Nlc3MkNTAwKAotb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkuaW50ZXJuYWwubmV0Lnd3dy5wcm90b2NvbC5odHRwLkh0dHBVUkxDb25uZWN0aW9uKQotCi1zdGF0aWMgYm9vbGVhbiBhY2Nlc3MkNjAwKAotb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkuaW50ZXJuYWwubmV0Lnd3dy5wcm90b2NvbC5odHRwLkh0dHBVUkxDb25uZWN0aW9uKQotCi1zdGF0aWMgYm9vbGVhbiBhY2Nlc3MkNzAwKAotb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkuaW50ZXJuYWwubmV0Lnd3dy5wcm90b2NvbC5odHRwLkh0dHBVUkxDb25uZWN0aW9uKQotCi1zdGF0aWMgYm9vbGVhbiBhY2Nlc3MkODAwKAotb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkuaW50ZXJuYWwubmV0Lnd3dy5wcm90b2NvbC5odHRwLkh0dHBVUkxDb25uZWN0aW9uKQotCi1zdGF0aWMgYm9vbGVhbiBhY2Nlc3MkOTAwKAotb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkuaW50ZXJuYWwubmV0Lnd3dy5wcm90b2NvbC5odHRwLkh0dHBVUkxDb25uZWN0aW9uKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIGJ5dGVbXSBjcmVhdGVSZXF1ZXN0KCkKLQotcHJpdmF0ZSB2b2lkIGRpc2Nvbm5lY3QoCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZ2V0QXV0aG9yaXphdGlvbkNyZWRlbnRpYWxzKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBqYXZhLmlvLklucHV0U3RyZWFtIGdldENvbnRlbnRTdHJlYW0oKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RGVmYXVsdFJlcXVlc3RQcm9wZXJ0eSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgYm9vbGVhbiBnZXRGcm9tQ2FjaGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIGphdmEubmV0LkluZXRBZGRyZXNzIGdldEhvc3RBZGRyZXNzKCkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGdldEhvc3ROYW1lKCkKLQotcHJpdmF0ZSBpbnQgZ2V0SG9zdFBvcnQoKQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZ2V0U3lzdGVtUHJvcGVydHkoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgcHV0VG9DYWNoZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgYm9vbGVhbiBzZW5kUmVxdWVzdCgpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBzZXREZWZhdWx0UmVxdWVzdFByb3BlcnR5KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSB2b2lkIHNldFByb3h5KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgYWRkUmVxdWVzdFByb3BlcnR5KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY29ubmVjdCgpCi0KLXB1YmxpYyB2b2lkIGRpc2Nvbm5lY3QoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBkb1JlcXVlc3QoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi0gdm9pZCBkb1JlcXVlc3RJbnRlcm5hbCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIGVuZFJlcXVlc3QoKQotCi1wdWJsaWMgamF2YS5pby5JbnB1dFN0cmVhbSBnZXRFcnJvclN0cmVhbSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5pbnRlcm5hbC5uZXQud3d3LnByb3RvY29sLmh0dHAuSHR0cENvbm5lY3Rpb24gZ2V0SFRUUENvbm5lY3Rpb24oCi1qYXZhLm5ldC5Qcm94eSkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SGVhZGVyRmllbGQoCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEhlYWRlckZpZWxkKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SGVhZGVyRmllbGRLZXkoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS91dGlsL0xpc3Q8TGphdmEvbGFuZy9TdHJpbmc7Pjs+OyApCi1wdWJsaWMgamF2YS51dGlsLk1hcCBnZXRIZWFkZXJGaWVsZHMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5pby5JbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmlvLk91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uIGdldFBlcm1pc3Npb24oKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvdXRpbC9MaXN0PExqYXZhL2xhbmcvU3RyaW5nOz47PjsgKQotcHVibGljIGphdmEudXRpbC5NYXAgZ2V0UmVxdWVzdFByb3BlcnRpZXMoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRSZXF1ZXN0UHJvcGVydHkoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGdldFJlc3BvbnNlQ29kZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLSB2b2lkIHJlYWRIZWFkZXJzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotIHZvaWQgcmVhZFNlcnZlclJlc3BvbnNlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotIGphdmEubGFuZy5TdHJpbmcgcmVhZGxuKCkKLQotcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgcmVxdWVzdFN0cmluZygpCi0KLXB1YmxpYyB2b2lkIHNldElmTW9kaWZpZWRTaW5jZSgKLWxvbmcpCi0KLXB1YmxpYyB2b2lkIHNldFJlcXVlc3RQcm9wZXJ0eSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIHNldFVwVHJhbnNwb3J0SU8oCi1vcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5pbnRlcm5hbC5uZXQud3d3LnByb3RvY29sLmh0dHAuSHR0cENvbm5lY3Rpb24pCi0KLXB1YmxpYyBib29sZWFuIHVzaW5nUHJveHkoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmludGVybmFsLm5ldC53d3cucHJvdG9jb2wuaHR0cHMuSGFuZGxlciBleHRlbmRzIGphdmEubmV0LlVSTFN0cmVhbUhhbmRsZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcm90ZWN0ZWQgaW50IGdldERlZmF1bHRQb3J0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGphdmEubmV0LlVSTENvbm5lY3Rpb24gb3BlbkNvbm5lY3Rpb24oCi1qYXZhLm5ldC5VUkwpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uIG9wZW5Db25uZWN0aW9uKAotamF2YS5uZXQuVVJMCi1qYXZhLm5ldC5Qcm94eSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTIgbmFtZSA9SHR0cHNFbmdpbmUgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9sdW5pL2ludGVybmFsL25ldC93d3cvcHJvdG9jb2wvaHR0cHMvSHR0cHNVUkxDb25uZWN0aW9uOyApCi0gY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkuaW50ZXJuYWwubmV0Lnd3dy5wcm90b2NvbC5odHRwcy5IdHRwc1VSTENvbm5lY3Rpb24kSHR0cHNFbmdpbmUgZXh0ZW5kcyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5pbnRlcm5hbC5uZXQud3d3LnByb3RvY29sLmh0dHAuSHR0cFVSTENvbm5lY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBib29sZWFuIG1ha2luZ1NTTFR1bm5lbAotCi1maW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5pbnRlcm5hbC5uZXQud3d3LnByb3RvY29sLmh0dHBzLkh0dHBzVVJMQ29ubmVjdGlvbiB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5pbnRlcm5hbC5uZXQud3d3LnByb3RvY29sLmh0dHBzLkh0dHBzVVJMQ29ubmVjdGlvbgotamF2YS5uZXQuVVJMCi1pbnQpCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmludGVybmFsLm5ldC53d3cucHJvdG9jb2wuaHR0cHMuSHR0cHNVUkxDb25uZWN0aW9uCi1qYXZhLm5ldC5VUkwKLWludAotamF2YS5uZXQuUHJveHkpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNvbm5lY3QoKQotCi1wcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyByZXF1ZXN0U3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS9pbnRlcm5hbC9uZXQvd3d3L3Byb3RvY29sL2h0dHBzL0h0dHBzVVJMQ29ubmVjdGlvbiRIdHRwc0VuZ2luZTsgKQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmludGVybmFsLm5ldC53d3cucHJvdG9jb2wuaHR0cHMuSHR0cHNVUkxDb25uZWN0aW9uIGV4dGVuZHMgamF2YXgubmV0LnNzbC5IdHRwc1VSTENvbm5lY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5pbnRlcm5hbC5uZXQud3d3LnByb3RvY29sLmh0dHBzLkh0dHBzVVJMQ29ubmVjdGlvbiRIdHRwc0VuZ2luZSBodHRwc0VuZ2luZQotCi1wcml2YXRlIGphdmF4Lm5ldC5zc2wuU1NMU29ja2V0IHNzbFNvY2tldAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLWphdmEubmV0LlVSTAotaW50KQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oCi1qYXZhLm5ldC5VUkwKLWludAotamF2YS5uZXQuUHJveHkpCi0KLXN0YXRpYyBqYXZheC5uZXQuc3NsLlNTTFNvY2tldCBhY2Nlc3MkMDAyKAotb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkuaW50ZXJuYWwubmV0Lnd3dy5wcm90b2NvbC5odHRwcy5IdHRwc1VSTENvbm5lY3Rpb24KLWphdmF4Lm5ldC5zc2wuU1NMU29ja2V0KQotCi1wdWJsaWMgdm9pZCBhZGRSZXF1ZXN0UHJvcGVydHkoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjb25uZWN0KCkKLQotcHVibGljIHZvaWQgZGlzY29ubmVjdCgpCi0KLXB1YmxpYyBib29sZWFuIGdldEFsbG93VXNlckludGVyYWN0aW9uKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Q2lwaGVyU3VpdGUoKQotCi1wdWJsaWMgaW50IGdldENvbm5lY3RUaW1lb3V0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0Q29udGVudCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldENvbnRlbnQoCi1qYXZhLmxhbmcuQ2xhc3NbXSkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Q29udGVudEVuY29kaW5nKCkKLQotcHVibGljIGludCBnZXRDb250ZW50TGVuZ3RoKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Q29udGVudFR5cGUoKQotCi1wdWJsaWMgbG9uZyBnZXREYXRlKCkKLQotcHVibGljIGJvb2xlYW4gZ2V0RGVmYXVsdFVzZUNhY2hlcygpCi0KLXB1YmxpYyBib29sZWFuIGdldERvSW5wdXQoKQotCi1wdWJsaWMgYm9vbGVhbiBnZXREb091dHB1dCgpCi0KLXB1YmxpYyBqYXZhLmlvLklucHV0U3RyZWFtIGdldEVycm9yU3RyZWFtKCkKLQotcHVibGljIGxvbmcgZ2V0RXhwaXJhdGlvbigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEhlYWRlckZpZWxkKAotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRIZWFkZXJGaWVsZCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBsb25nIGdldEhlYWRlckZpZWxkRGF0ZSgKLWphdmEubGFuZy5TdHJpbmcKLWxvbmcpCi0KLXB1YmxpYyBpbnQgZ2V0SGVhZGVyRmllbGRJbnQoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEhlYWRlckZpZWxkS2V5KAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvdXRpbC9MaXN0PExqYXZhL2xhbmcvU3RyaW5nOz47PjsgKQotcHVibGljIGphdmEudXRpbC5NYXAgZ2V0SGVhZGVyRmllbGRzKCkKLQotcHVibGljIGxvbmcgZ2V0SWZNb2RpZmllZFNpbmNlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuaW8uSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKQotCi1wdWJsaWMgYm9vbGVhbiBnZXRJbnN0YW5jZUZvbGxvd1JlZGlyZWN0cygpCi0KLXB1YmxpYyBsb25nIGdldExhc3RNb2RpZmllZCgpCi0KLXB1YmxpYyBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVbXSBnZXRMb2NhbENlcnRpZmljYXRlcygpCi0KLXB1YmxpYyBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbCBnZXRMb2NhbFByaW5jaXBhbCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmlvLk91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZheC9uZXQvc3NsL1NTTFBlZXJVbnZlcmlmaWVkRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zZWN1cml0eS5QcmluY2lwYWwgZ2V0UGVlclByaW5jaXBhbCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb24gZ2V0UGVybWlzc2lvbigpCi0KLXB1YmxpYyBpbnQgZ2V0UmVhZFRpbWVvdXQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRSZXF1ZXN0TWV0aG9kKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL3V0aWwvTGlzdDxMamF2YS9sYW5nL1N0cmluZzs+Oz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuTWFwIGdldFJlcXVlc3RQcm9wZXJ0aWVzKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UmVxdWVzdFByb3BlcnR5KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXRSZXNwb25zZUNvZGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRSZXNwb25zZU1lc3NhZ2UoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZheC9uZXQvc3NsL1NTTFBlZXJVbnZlcmlmaWVkRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlW10gZ2V0U2VydmVyQ2VydGlmaWNhdGVzKCkKLQotcHVibGljIGphdmEubmV0LlVSTCBnZXRVUkwoKQotCi1wdWJsaWMgYm9vbGVhbiBnZXRVc2VDYWNoZXMoKQotCi1wdWJsaWMgdm9pZCBzZXRBbGxvd1VzZXJJbnRlcmFjdGlvbigKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldENvbm5lY3RUaW1lb3V0KAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXREZWZhdWx0VXNlQ2FjaGVzKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0RG9JbnB1dCgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldERvT3V0cHV0KAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0SWZNb2RpZmllZFNpbmNlKAotbG9uZykKLQotcHVibGljIHZvaWQgc2V0SW5zdGFuY2VGb2xsb3dSZWRpcmVjdHMoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRSZWFkVGltZW91dCgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvUHJvdG9jb2xFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldFJlcXVlc3RNZXRob2QoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRSZXF1ZXN0UHJvcGVydHkoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRVc2VDYWNoZXMoCi1ib29sZWFuKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLXB1YmxpYyBib29sZWFuIHVzaW5nUHJveHkoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmludGVybmFsLm5ldC53d3cucHJvdG9jb2wuamFyLkhhbmRsZXIgZXh0ZW5kcyBqYXZhLm5ldC5VUkxTdHJlYW1IYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGphdmEubmV0LlVSTENvbm5lY3Rpb24gb3BlbkNvbm5lY3Rpb24oCi1qYXZhLm5ldC5VUkwpCi0KLXByb3RlY3RlZCB2b2lkIHBhcnNlVVJMKAotamF2YS5uZXQuVVJMCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludCkKLQotcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgdG9FeHRlcm5hbEZvcm0oCi1qYXZhLm5ldC5VUkwpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3NlY3VyaXR5L1ByaXZpbGVnZWRBY3Rpb248TGphdmEvbGFuZy9JbnRlZ2VyOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS9pbnRlcm5hbC9uZXQvd3d3L3Byb3RvY29sL2phci9KYXJVUkxDb25uZWN0aW9uOyApCi1maW5hbCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5pbnRlcm5hbC5uZXQud3d3LnByb3RvY29sLmphci5KYXJVUkxDb25uZWN0aW9uJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGphdmEubGFuZy5JbnRlZ2VyIHJ1bigpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3NlY3VyaXR5L1ByaXZpbGVnZWRBY3Rpb248TGphdmEvdXRpbC9qYXIvSmFyRmlsZTs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi0gY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkuaW50ZXJuYWwubmV0Lnd3dy5wcm90b2NvbC5qYXIuSmFyVVJMQ29ubmVjdGlvbiQyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5pbnRlcm5hbC5uZXQud3d3LnByb3RvY29sLmphci5KYXJVUkxDb25uZWN0aW9uIHRoaXMkMAotCi1maW5hbCBqYXZhLmxhbmcuU3RyaW5nIHZhbCRleHRlcm5hbEZvcm0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5pbnRlcm5hbC5uZXQud3d3LnByb3RvY29sLmphci5KYXJVUkxDb25uZWN0aW9uCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBydW4oKQotCi1wdWJsaWMgamF2YS51dGlsLmphci5KYXJGaWxlIHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3NlY3VyaXR5L1ByaXZpbGVnZWRBY3Rpb248TGphdmEvdXRpbC9qYXIvSmFyRmlsZTs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi0gY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkuaW50ZXJuYWwubmV0Lnd3dy5wcm90b2NvbC5qYXIuSmFyVVJMQ29ubmVjdGlvbiQzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5pbnRlcm5hbC5uZXQud3d3LnByb3RvY29sLmphci5KYXJVUkxDb25uZWN0aW9uIHRoaXMkMAotCi1maW5hbCBqYXZhLmxhbmcuU3RyaW5nIHZhbCRleHRlcm5hbEZvcm0KLQotZmluYWwgamF2YS5pby5JbnB1dFN0cmVhbSB2YWwkaXMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5pbnRlcm5hbC5uZXQud3d3LnByb3RvY29sLmphci5KYXJVUkxDb25uZWN0aW9uCi1qYXZhLmlvLklucHV0U3RyZWFtCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBydW4oKQotCi1wdWJsaWMgamF2YS51dGlsLmphci5KYXJGaWxlIHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yNCBuYW1lID1DYWNoZUVudHJ5ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS9pbnRlcm5hbC9uZXQvd3d3L3Byb3RvY29sL2phci9KYXJVUkxDb25uZWN0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFQ6TGphdmEvdXRpbC9qYXIvSmFyRmlsZTs+TGphdmEvbGFuZy9yZWYvV2Vha1JlZmVyZW5jZTxUVDs+OyApCi1maW5hbCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5pbnRlcm5hbC5uZXQud3d3LnByb3RvY29sLmphci5KYXJVUkxDb25uZWN0aW9uJENhY2hlRW50cnkgZXh0ZW5kcyBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGphdmEubGFuZy5PYmplY3Qga2V5Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVFQ7TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9yZWYvUmVmZXJlbmNlUXVldWU8TGphdmEvdXRpbC9qYXIvSmFyRmlsZTs+OylWICkKLSB2b2lkIDxpbml0PigKLWphdmEudXRpbC5qYXIuSmFyRmlsZQotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLnJlZi5SZWZlcmVuY2VRdWV1ZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTIgbmFtZSA9SmFyVVJMQ29ubmVjdGlvbklucHV0U3RyZWFtICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS9pbnRlcm5hbC9uZXQvd3d3L3Byb3RvY29sL2phci9KYXJVUkxDb25uZWN0aW9uOyApCi0gY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkuaW50ZXJuYWwubmV0Lnd3dy5wcm90b2NvbC5qYXIuSmFyVVJMQ29ubmVjdGlvbiRKYXJVUkxDb25uZWN0aW9uSW5wdXRTdHJlYW0gZXh0ZW5kcyBqYXZhLmlvLkZpbHRlcklucHV0U3RyZWFtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBqYXZhLmlvLklucHV0U3RyZWFtIGlucHV0U3RyZWFtCi0KLSBqYXZhLnV0aWwuamFyLkphckZpbGUgamFyRmlsZQotCi1maW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5pbnRlcm5hbC5uZXQud3d3LnByb3RvY29sLmphci5KYXJVUkxDb25uZWN0aW9uIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmludGVybmFsLm5ldC53d3cucHJvdG9jb2wuamFyLkphclVSTENvbm5lY3Rpb24KLWphdmEuaW8uSW5wdXRTdHJlYW0KLWphdmEudXRpbC5qYXIuSmFyRmlsZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY2xvc2UoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoCi1ieXRlW10KLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgbG9uZyBza2lwKAotbG9uZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFQ6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3V0aWwvQ29tcGFyYXRvcjxMb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvaW50ZXJuYWwvbmV0L3d3dy9wcm90b2NvbC9qYXIvSmFyVVJMQ29ubmVjdGlvbiRMUlVLZXk7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9sdW5pL2ludGVybmFsL25ldC93d3cvcHJvdG9jb2wvamFyL0phclVSTENvbm5lY3Rpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjQgbmFtZSA9TFJVQ29tcGFyYXRvciApCi1maW5hbCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5pbnRlcm5hbC5uZXQud3d3LnByb3RvY29sLmphci5KYXJVUkxDb25uZWN0aW9uJExSVUNvbXBhcmF0b3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLkNvbXBhcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9sYXRpbGUgaW50IGNvbXBhcmUoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50IGNvbXBhcmUoCi1vcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5pbnRlcm5hbC5uZXQud3d3LnByb3RvY29sLmphci5KYXJVUkxDb25uZWN0aW9uJExSVUtleQotb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkuaW50ZXJuYWwubmV0Lnd3dy5wcm90b2NvbC5qYXIuSmFyVVJMQ29ubmVjdGlvbiRMUlVLZXkpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9sdW5pL2ludGVybmFsL25ldC93d3cvcHJvdG9jb2wvamFyL0phclVSTENvbm5lY3Rpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjQgbmFtZSA9TFJVS2V5ICkKLWZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmludGVybmFsLm5ldC53d3cucHJvdG9jb2wuamFyLkphclVSTENvbm5lY3Rpb24kTFJVS2V5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gamF2YS51dGlsLmphci5KYXJGaWxlIGphcgotCi0gbG9uZyB0cwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEudXRpbC5qYXIuSmFyRmlsZQotbG9uZykKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvaW50ZXJuYWwvbmV0L3d3dy9wcm90b2NvbC9qYXIvSmFyVVJMQ29ubmVjdGlvbiRKYXJVUkxDb25uZWN0aW9uSW5wdXRTdHJlYW07TG9yZy9hcGFjaGUvaGFybW9ueS9sdW5pL2ludGVybmFsL25ldC93d3cvcHJvdG9jb2wvamFyL0phclVSTENvbm5lY3Rpb24kTFJVQ29tcGFyYXRvcjtMb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvaW50ZXJuYWwvbmV0L3d3dy9wcm90b2NvbC9qYXIvSmFyVVJMQ29ubmVjdGlvbiRMUlVLZXk7TG9yZy9hcGFjaGUvaGFybW9ueS9sdW5pL2ludGVybmFsL25ldC93d3cvcHJvdG9jb2wvamFyL0phclVSTENvbm5lY3Rpb24kQ2FjaGVFbnRyeTsgKQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmludGVybmFsLm5ldC53d3cucHJvdG9jb2wuamFyLkphclVSTENvbm5lY3Rpb24gZXh0ZW5kcyBqYXZhLm5ldC5KYXJVUkxDb25uZWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBpbnQgTGltaXQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0hhc2h0YWJsZTxMamF2YS9sYW5nL1N0cmluZztMb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvaW50ZXJuYWwvbmV0L3d3dy9wcm90b2NvbC9qYXIvSmFyVVJMQ29ubmVjdGlvbiRDYWNoZUVudHJ5PCtMamF2YS91dGlsL2phci9KYXJGaWxlOz47PjsgKQotc3RhdGljIGphdmEudXRpbC5IYXNodGFibGUgamFyQ2FjaGUKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL1RyZWVTZXQ8TG9yZy9hcGFjaGUvaGFybW9ueS9sdW5pL2ludGVybmFsL25ldC93d3cvcHJvdG9jb2wvamFyL0phclVSTENvbm5lY3Rpb24kTFJVS2V5Oz47ICkKLXN0YXRpYyBqYXZhLnV0aWwuVHJlZVNldCBscnUKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL3JlZi9SZWZlcmVuY2VRdWV1ZTxMamF2YS91dGlsL2phci9KYXJGaWxlOz47ICkKLSBqYXZhLmxhbmcucmVmLlJlZmVyZW5jZVF1ZXVlIGNhY2hlUXVldWUKLQotcHJpdmF0ZSBib29sZWFuIGNsb3NlZAotCi1wcml2YXRlIGphdmEudXRpbC5qYXIuSmFyRW50cnkgamFyRW50cnkKLQotcHJpdmF0ZSBqYXZhLnV0aWwuamFyLkphckZpbGUgamFyRmlsZQotCi0gamF2YS5pby5JbnB1dFN0cmVhbSBqYXJJbnB1dAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvTWFsZm9ybWVkVVJMRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLm5ldC5VUkwpCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQwMDAoCi1vcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5pbnRlcm5hbC5uZXQud3d3LnByb3RvY29sLmphci5KYXJVUkxDb25uZWN0aW9uKQotCi1zdGF0aWMgYm9vbGVhbiBhY2Nlc3MkMTAyKAotb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkuaW50ZXJuYWwubmV0Lnd3dy5wcm90b2NvbC5qYXIuSmFyVVJMQ29ubmVjdGlvbgotYm9vbGVhbikKLQotcHVibGljIHN0YXRpYyB2b2lkIGNsb3NlQ2FjaGVkRmlsZXMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgZmluZEphckVudHJ5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIGZpbmRKYXJGaWxlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY29ubmVjdCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldENvbnRlbnQoKQotCi1wdWJsaWMgaW50IGdldENvbnRlbnRMZW5ndGgoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRDb250ZW50VHlwZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmlvLklucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEudXRpbC5qYXIuSmFyRW50cnkgZ2V0SmFyRW50cnkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS51dGlsLmphci5KYXJGaWxlIGdldEphckZpbGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uIGdldFBlcm1pc3Npb24oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi0gamF2YS51dGlsLmphci5KYXJGaWxlIG9wZW5KYXJGaWxlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5pbnRlcm5hbC5ubHMuTWVzc2FnZXMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgc1Jlc291cmNlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1jaGFyKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nKAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0W10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi0gY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkuaW50ZXJuYWwucmVmbGVjdC5Qcm94eUNoYXJBcnJheUNhY2hlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGludCBlbGVtZW50U2l6ZQotCi1wcml2YXRlIGNoYXJbXVtdIGtleVRhYmxlCi0KLXByaXZhdGUgaW50IHRocmVzaG9sZAotCi1wcml2YXRlIGludFtdIHZhbHVlVGFibGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1pbnQpCi0KLXN0YXRpYyBib29sZWFuIGVxdWFscygKLWNoYXJbXQotY2hhcltdKQotCi1wcml2YXRlIGludCBoYXNoQ29kZUNoYXIoCi1jaGFyW10pCi0KLXByaXZhdGUgdm9pZCByZWhhc2goKQotCi0gaW50IGdldCgKLWNoYXJbXSkKLQotIGludCBwdXQoCi1jaGFyW10KLWludCkKLQotIGludCBzaXplKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmludGVybmFsLnJlZmxlY3QuUHJveHlDb25zdGFudHMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFjY0ZpbmFsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFjY1ByaXZhdGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQWNjUHJvdGVjdGVkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFjY1B1YmxpYwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBY2NTdGF0aWMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQWNjU3VwZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ2xhc3NUYWcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gQ29kZU5hbWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRG91YmxlVGFnCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIEV4Y2VwdGlvbnNOYW1lCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZpZWxkUmVmVGFnCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZsb2F0VGFnCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIEluaXQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSW50ZWdlclRhZwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJbnRlcmZhY2VNZXRob2RSZWZUYWcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTG9uZ1RhZwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNZXRob2RSZWZUYWcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTmFtZUFuZFR5cGVUYWcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2FhbG9hZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfYWFzdG9yZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfYWNvbnN0X251bGwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2Fsb2FkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QQ19hbG9hZF8wCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QQ19hbG9hZF8xCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QQ19hbG9hZF8yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QQ19hbG9hZF8zCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QQ19hbmV3YXJyYXkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2FyZXR1cm4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2FycmF5bGVuZ3RoCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QQ19hc3RvcmUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2FzdG9yZV8wCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QQ19hc3RvcmVfMQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfYXN0b3JlXzIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2FzdG9yZV8zCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QQ19hdGhyb3cKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2JhbG9hZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfYmFzdG9yZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfYmlwdXNoCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QQ19jYWxvYWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2Nhc3RvcmUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2NoZWNrY2FzdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfZDJmCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QQ19kMmkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2QybAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfZGFkZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfZGFsb2FkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QQ19kYXN0b3JlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QQ19kY21wZwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfZGNtcGwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2Rjb25zdF8wCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QQ19kY29uc3RfMQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfZGRpdgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfZGxvYWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2Rsb2FkXzAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2Rsb2FkXzEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2Rsb2FkXzIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2Rsb2FkXzMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2RtdWwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2RuZWcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2RyZW0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2RyZXR1cm4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2RzdG9yZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfZHN0b3JlXzAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2RzdG9yZV8xCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QQ19kc3RvcmVfMgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfZHN0b3JlXzMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2RzdWIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2R1cAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfZHVwMgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfZHVwMl94MQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfZHVwMl94MgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfZHVwX3gxCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QQ19kdXBfeDIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2YyZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfZjJpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QQ19mMmwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2ZhZGQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2ZhbG9hZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfZmFzdG9yZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfZmNtcGcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2ZjbXBsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QQ19mY29uc3RfMAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfZmNvbnN0XzEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2Zjb25zdF8yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QQ19mZGl2Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QQ19mbG9hZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfZmxvYWRfMAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfZmxvYWRfMQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfZmxvYWRfMgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfZmxvYWRfMwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfZm11bAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfZm5lZwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfZnJlbQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfZnJldHVybgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfZnN0b3JlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QQ19mc3RvcmVfMAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfZnN0b3JlXzEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2ZzdG9yZV8yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QQ19mc3RvcmVfMwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfZnN1YgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfZ2V0ZmllbGQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2dldHN0YXRpYwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfZ290bwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfZ290b193Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QQ19pMmIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2kyYwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfaTJkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QQ19pMmYKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2kybAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfaTJzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QQ19pYWRkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QQ19pYWxvYWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2lhbmQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2lhc3RvcmUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2ljb25zdF8wCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QQ19pY29uc3RfMQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfaWNvbnN0XzIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2ljb25zdF8zCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QQ19pY29uc3RfNAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfaWNvbnN0XzUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2ljb25zdF9tMQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfaWRpdgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfaWZfYWNtcGVxCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QQ19pZl9hY21wbmUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2lmX2ljbXBlcQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfaWZfaWNtcGdlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QQ19pZl9pY21wZ3QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2lmX2ljbXBsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfaWZfaWNtcGx0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QQ19pZl9pY21wbmUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2lmZXEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2lmZ2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2lmZ3QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2lmbGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2lmbHQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2lmbmUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2lmbm9ubnVsbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfaWZudWxsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QQ19paW5jCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QQ19pbG9hZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfaWxvYWRfMAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfaWxvYWRfMQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfaWxvYWRfMgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfaWxvYWRfMwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfaW11bAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfaW5lZwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfaW5zdGFuY2VvZgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfaW52b2tlaW50ZXJmYWNlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QQ19pbnZva2VzcGVjaWFsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QQ19pbnZva2VzdGF0aWMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2ludm9rZXZpcnR1YWwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2lvcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfaXJlbQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfaXJldHVybgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfaXNobAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfaXNocgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfaXN0b3JlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QQ19pc3RvcmVfMAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfaXN0b3JlXzEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2lzdG9yZV8yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QQ19pc3RvcmVfMwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfaXN1YgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfaXVzaHIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2l4b3IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2pzcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfanNyX3cKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2wyZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfbDJmCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QQ19sMmkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2xhZGQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2xhbG9hZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfbGFuZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfbGFzdG9yZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfbGNtcAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfbGNvbnN0XzAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2xjb25zdF8xCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QQ19sZGMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2xkYzJfdwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfbGRjX3cKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2xkaXYKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2xsb2FkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QQ19sbG9hZF8wCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QQ19sbG9hZF8xCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QQ19sbG9hZF8yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QQ19sbG9hZF8zCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QQ19sbXVsCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QQ19sbmVnCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QQ19sb29rdXBzd2l0Y2gKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2xvcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfbHJlbQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfbHJldHVybgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfbHNobAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfbHNocgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfbHN0b3JlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QQ19sc3RvcmVfMAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfbHN0b3JlXzEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2xzdG9yZV8yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QQ19sc3RvcmVfMwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfbHN1YgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfbHVzaHIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX2x4b3IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX21vbml0b3JlbnRlcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfbW9uaXRvcmV4aXQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX211bHRpYW5ld2FycmF5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QQ19uZXcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX25ld2FycmF5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QQ19ub3AKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX3BvcAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfcG9wMgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfcHV0ZmllbGQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX3B1dHN0YXRpYwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfcmV0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QQ19yZXR1cm4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BDX3NhbG9hZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfc2FzdG9yZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfc2lwdXNoCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QQ19zd2FwCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QQ190YWJsZXN3aXRjaAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUENfd2lkZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTdHJpbmdUYWcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVXRmOFRhZwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5pbnRlcm5hbC5yZWZsZWN0LlByb3h5Q2xhc3NGaWxlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmludGVybmFsLnJlZmxlY3QuUHJveHlDb25zdGFudHMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIENsYXNzRm9yTmFtZU1ldGhvZAotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgQ2xhc3NHZXRNZXRob2QKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIEhhbmRsZXJJbnZva2VNZXRob2QKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOQ1JFTUVOVF9TSVpFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTklUSUFMX0NPTlRFTlRTX1NJWkUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOSVRJQUxfSEVBREVSX1NJWkUKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIE9iamVjdEVxdWFsc01ldGhvZAotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgT2JqZWN0SGFzaENvZGVNZXRob2QKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIE9iamVjdFRvU3RyaW5nTWV0aG9kCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9yZWZsZWN0L0NvbnN0cnVjdG9yPCo+OyApCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvciBQcm94eUNvbnN0cnVjdG9yCi0KLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkIFByb3h5SGFuZGxlckZpZWxkCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9yZWZsZWN0L0NvbnN0cnVjdG9yPCo+OyApCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvciBVbmRlY2xhcmVkVGhyb3dhYmxlRXhjZXB0aW9uQ29uc3RydWN0b3IKLQotcHJpdmF0ZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5pbnRlcm5hbC5yZWZsZWN0LlByb3h5Q29uc3RhbnRQb29sIGNvbnN0YW50UG9vbAotCi1wcml2YXRlIGludCBjb25zdGFudFBvb2xPZmZzZXQKLQotcHJpdmF0ZSBieXRlW10gY29udGVudHMKLQotcHJpdmF0ZSBpbnQgY29udGVudHNPZmZzZXQKLQotIGJ5dGVbXSBoZWFkZXIKLQotIGludCBoZWFkZXJPZmZzZXQKLQotcHJpdmF0ZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5pbnRlcm5hbC5yZWZsZWN0LlByb3h5TWV0aG9kW10gcHJveHlNZXRob2RzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLkNsYXNzW10pCi0KLXByaXZhdGUgdm9pZCBhZGRBdHRyaWJ1dGVzKCkKLQotcHJpdmF0ZSB2b2lkIGFkZEZpZWxkcygpCi0KLXByaXZhdGUgdm9pZCBhZGRNZXRob2RzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9DbGFzczwqPjtMamF2YS91dGlsL0FycmF5TGlzdDxMb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvaW50ZXJuYWwvcmVmbGVjdC9Qcm94eU1ldGhvZDs+O0xqYXZhL3V0aWwvSGFzaFNldDxMamF2YS9sYW5nL0NsYXNzPCo+Oz47KVYgKQotcHJpdmF0ZSB2b2lkIGZpbmRNZXRob2RzKAotamF2YS5sYW5nLkNsYXNzCi1qYXZhLnV0aWwuQXJyYXlMaXN0Ci1qYXZhLnV0aWwuSGFzaFNldCkKLQotcHJpdmF0ZSB2b2lkIGZpbmRNZXRob2RzKAotamF2YS5sYW5nLkNsYXNzW10pCi0KLXByaXZhdGUgdm9pZCBnZW5DYWxsQ2xhc3NGb3JOYW1lKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9DbGFzczwqPjtMamF2YS9sYW5nL1N0cmluZztbTGphdmEvbGFuZy9DbGFzczspViApCi1wcml2YXRlIHZvaWQgZ2VuQ2FsbEdldE1ldGhvZCgKLWphdmEubGFuZy5DbGFzcwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLkNsYXNzW10pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvQ2xhc3M8Kj47KVYgKQotcHJpdmF0ZSB2b2lkIGdlbkNhc3RSZXR1cm5UeXBlKAotamF2YS5sYW5nLkNsYXNzKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL0NsYXNzPCo+O0kpSSApCi1wcml2YXRlIGludCBnZW5JbnZva2VBcmcoCi1qYXZhLmxhbmcuQ2xhc3MKLWludCkKLQotcHJpdmF0ZSBpbnQgZ2VuSW52b2tlQXJncygKLWphdmEubGFuZy5DbGFzc1tdKQotCi1wcml2YXRlIHZvaWQgZ2VuTG9hZEFyZygKLWludCkKLQotcHJpdmF0ZSB2b2lkIGdlblN0b3JlQXJnKAotaW50KQotCi1wdWJsaWMgc3RhdGljIGJ5dGVbXSBnZW5lcmF0ZUJ5dGVzKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLkNsYXNzW10pCi0KLXByaXZhdGUgdm9pZCBnZW5lcmF0ZUNvZGVBdHRyaWJ1dGUoCi1vcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5pbnRlcm5hbC5yZWZsZWN0LlByb3h5TWV0aG9kKQotCi1wcml2YXRlIGJ5dGVbXSBnZXRCeXRlcygpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvQ2xhc3M8Kj47KVtDICkKLXN0YXRpYyBjaGFyW10gZ2V0Q29uc3RhbnRQb29sTmFtZSgKLWphdmEubGFuZy5DbGFzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9yZWZsZWN0L0NvbnN0cnVjdG9yPCo+OylbQyApCi1zdGF0aWMgY2hhcltdIGdldENvbnN0YW50UG9vbE5hbWUoCi1qYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcikKLQotc3RhdGljIGNoYXJbXSBnZXRDb25zdGFudFBvb2xOYW1lKAotamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL0NsYXNzPCo+OylMamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kOyApCi1wcml2YXRlIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCB0eXBlQWNjZXNzTWV0aG9kKAotamF2YS5sYW5nLkNsYXNzKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL0NsYXNzPCo+OylMamF2YS9sYW5nL3JlZmxlY3QvRmllbGQ7ICkKLXByaXZhdGUgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQgdHlwZUZpZWxkKAotamF2YS5sYW5nLkNsYXNzKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL0NsYXNzPCo+OylMamF2YS9sYW5nL3JlZmxlY3QvQ29uc3RydWN0b3I8Kj47ICkKLXByaXZhdGUgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IgdHlwZUluaXRNZXRob2QoCi1qYXZhLmxhbmcuQ2xhc3MpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvQ2xhc3M8Kj47KUxqYXZhL2xhbmcvU3RyaW5nOyApCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgdHlwZVdyYXBwZXJOYW1lKAotamF2YS5sYW5nLkNsYXNzKQotCi1wcml2YXRlIHZvaWQgd3JpdGVJbnRDb25zdGFudCgKLWludCkKLQotcHJpdmF0ZSB2b2lkIHdyaXRlTGRjKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSB2b2lkIHdyaXRlVW5zaWduZWRCeXRlKAotaW50KQotCi1wcml2YXRlIHZvaWQgd3JpdGVVbnNpZ25lZFNob3J0KAotaW50KQotCi1wcml2YXRlIHZvaWQgd3JpdGVVbnNpZ25lZFdvcmQoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi0gY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkuaW50ZXJuYWwucmVmbGVjdC5Qcm94eUNvbnN0YW50UG9vbCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5pbnRlcm5hbC5yZWZsZWN0LlByb3h5Q29uc3RhbnRzCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMQVNTX0lOSVRJQUxfU0laRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05TVEFOVFBPT0xfR1JPV19TSVpFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlNUQU5UUE9PTF9JTklUSUFMX1NJWkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklFTERfSU5JVElBTF9TSVpFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSRkFDRV9JTklUSUFMX1NJWkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVUSE9EX0lOSVRJQUxfU0laRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBOQU1FQU5EVFlQRV9JTklUSUFMX1NJWkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RSSU5HX0lOSVRJQUxfU0laRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBVVEY4X0lOSVRJQUxfU0laRQotCi0gb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkuaW50ZXJuYWwucmVmbGVjdC5Qcm94eUNoYXJBcnJheUNhY2hlIFVURjhDYWNoZQotCi0gb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkuaW50ZXJuYWwucmVmbGVjdC5Qcm94eUNoYXJBcnJheUNhY2hlIGNsYXNzTmFtZUNhY2hlCi0KLSBpbnQgY3VycmVudEluZGV4Ci0KLSBpbnQgY3VycmVudE9mZnNldAotCi0gb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkuaW50ZXJuYWwucmVmbGVjdC5Qcm94eU9iamVjdENhY2hlIGZpZWxkQ2FjaGUKLQotIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmludGVybmFsLnJlZmxlY3QuUHJveHlPYmplY3RDYWNoZSBpbnRlcmZhY2VNZXRob2RDYWNoZQotCi0gb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkuaW50ZXJuYWwucmVmbGVjdC5Qcm94eU9iamVjdENhY2hlIG1ldGhvZENhY2hlCi0KLSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5pbnRlcm5hbC5yZWZsZWN0LlByb3h5TmFtZUFuZFR5cGVDYWNoZSBuYW1lQW5kVHlwZUNhY2hlCi0KLSBieXRlW10gcG9vbENvbnRlbnQKLQotIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmludGVybmFsLnJlZmxlY3QuUHJveHlDaGFyQXJyYXlDYWNoZSBzdHJpbmdDYWNoZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmludGVybmFsLnJlZmxlY3QuUHJveHlDbGFzc0ZpbGUpCi0KLXByaXZhdGUgaW50IGxpdGVyYWxJbmRleEZvck5hbWVBbmRUeXBlKAotaW50Ci1pbnQpCi0KLXByaXZhdGUgZmluYWwgdm9pZCB3cml0ZVUxKAotaW50KQotCi1wcml2YXRlIGZpbmFsIHZvaWQgd3JpdGVVMigKLWludCkKLQotIGludCBsaXRlcmFsSW5kZXgoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL3JlZmxlY3QvQ29uc3RydWN0b3I8Kj47KUkgKQotIGludCBsaXRlcmFsSW5kZXgoCi1qYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcikKLQotIGludCBsaXRlcmFsSW5kZXgoCi1qYXZhLmxhbmcucmVmbGVjdC5GaWVsZCkKLQotIGludCBsaXRlcmFsSW5kZXgoCi1qYXZhLmxhbmcucmVmbGVjdC5NZXRob2QpCi0KLSBpbnQgbGl0ZXJhbEluZGV4KAotY2hhcltdKQotCi0gaW50IGxpdGVyYWxJbmRleEZvckxkYygKLWNoYXJbXSkKLQotIGludCB0eXBlSW5kZXgoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmludGVybmFsLnJlZmxlY3QuUHJveHlNZXRob2QgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBqYXZhLmxhbmcuQ2xhc3NbXSBjb21tb25FeGNlcHRpb25zCi0KLSBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgbWV0aG9kCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kKQotCi0gamF2YS5sYW5nLkNsYXNzW10gZ2V0Q2hlY2tlZEV4Y2VwdGlvbnMoKQotCi0gYm9vbGVhbiBtYXRjaE1ldGhvZCgKLWphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLSBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5pbnRlcm5hbC5yZWZsZWN0LlByb3h5TmFtZUFuZFR5cGVDYWNoZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGludCBlbGVtZW50U2l6ZQotCi0gaW50W11bXSBrZXlUYWJsZQotCi0gaW50IHRocmVzaG9sZAotCi0gaW50W10gdmFsdWVUYWJsZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWludCkKLQotcHJpdmF0ZSB2b2lkIHJlaGFzaCgpCi0KLSBpbnQgZ2V0KAotaW50W10pCi0KLSBpbnQgaGFzaENvZGUoCi1pbnRbXSkKLQotIGludCBwdXQoCi1pbnRbXQotaW50KQotCi0gaW50IHNpemUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi0gY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkuaW50ZXJuYWwucmVmbGVjdC5Qcm94eU9iamVjdENhY2hlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gaW50IGVsZW1lbnRTaXplCi0KLSBqYXZhLmxhbmcuT2JqZWN0W10ga2V5VGFibGUKLQotIGludCB0aHJlc2hvbGQKLQotIGludFtdIHZhbHVlVGFibGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1pbnQpCi0KLXByaXZhdGUgdm9pZCByZWhhc2goKQotCi0gaW50IGdldCgKLWphdmEubGFuZy5PYmplY3QpCi0KLSBpbnQgaGFzaENvZGUoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi0gaW50IHB1dCgKLWphdmEubGFuZy5PYmplY3QKLWludCkKLQotIGludCBzaXplKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmludGVybmFsLnV0aWwuVGltZXpvbmVHZXR0ZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmludGVybmFsLnV0aWwuVGltZXpvbmVHZXR0ZXIgaW5zdGFuY2UKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmludGVybmFsLnV0aWwuVGltZXpvbmVHZXR0ZXIgZ2V0SW5zdGFuY2UoKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgc2V0SW5zdGFuY2UoCi1vcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5pbnRlcm5hbC51dGlsLlRpbWV6b25lR2V0dGVyKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRJZCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkubGFuZy5yZWZsZWN0LkdlbmVyaWNTaWduYXR1cmVQYXJzZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBjaGFyW10gYnVmZmVyCi0KLXByaXZhdGUgYm9vbGVhbiBlb2YKLQotcHVibGljIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmxhbmcucmVmbGVjdC5MaXN0T2ZUeXBlcyBleGNlcHRpb25UeXBlcwotCi1wdWJsaWMgamF2YS5sYW5nLnJlZmxlY3QuVHlwZSBmaWVsZFR5cGUKLQotcHVibGljIGphdmEubGFuZy5yZWZsZWN0LlR5cGVWYXJpYWJsZVtdIGZvcm1hbFR5cGVQYXJhbWV0ZXJzCi0KLSBqYXZhLmxhbmcucmVmbGVjdC5HZW5lcmljRGVjbGFyYXRpb24gZ2VuZXJpY0RlY2wKLQotIGphdmEubGFuZy5TdHJpbmcgaWRlbnRpZmllcgotCi1wdWJsaWMgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkubGFuZy5yZWZsZWN0Lkxpc3RPZlR5cGVzIGludGVyZmFjZVR5cGVzCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5sYW5nLnJlZmxlY3QuTGlzdE9mVHlwZXMgcGFyYW1ldGVyVHlwZXMKLQotIGludCBwb3MKLQotcHVibGljIGphdmEubGFuZy5yZWZsZWN0LlR5cGUgcmV0dXJuVHlwZQotCi1wdWJsaWMgamF2YS5sYW5nLnJlZmxlY3QuVHlwZSBzdXBlcmNsYXNzVHlwZQotCi0gY2hhciBzeW1ib2wKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi0gdm9pZCBleHBlY3QoCi1jaGFyKQotCi0gYm9vbGVhbiBpc1N0b3BTeW1ib2woCi1jaGFyKQotCi0gdm9pZCBwYXJzZUNsYXNzU2lnbmF0dXJlKCkKLQotIGphdmEubGFuZy5yZWZsZWN0LlR5cGUgcGFyc2VDbGFzc1R5cGVTaWduYXR1cmUoKQotCi0gamF2YS5sYW5nLnJlZmxlY3QuVHlwZSBwYXJzZUZpZWxkVHlwZVNpZ25hdHVyZSgpCi0KLXB1YmxpYyB2b2lkIHBhcnNlRm9yQ2xhc3MoCi1qYXZhLmxhbmcucmVmbGVjdC5HZW5lcmljRGVjbGFyYXRpb24KLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHBhcnNlRm9yQ29uc3RydWN0b3IoCi1qYXZhLmxhbmcucmVmbGVjdC5HZW5lcmljRGVjbGFyYXRpb24KLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHBhcnNlRm9yRmllbGQoCi1qYXZhLmxhbmcucmVmbGVjdC5HZW5lcmljRGVjbGFyYXRpb24KLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHBhcnNlRm9yTWV0aG9kKAotamF2YS5sYW5nLnJlZmxlY3QuR2VuZXJpY0RlY2xhcmF0aW9uCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTG9yZy9hcGFjaGUvaGFybW9ueS9sdW5pL2xhbmcvcmVmbGVjdC9JbXBsRm9yVmFyaWFibGU8TGphdmEvbGFuZy9yZWZsZWN0L0dlbmVyaWNEZWNsYXJhdGlvbjs+OyApCi0gb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkubGFuZy5yZWZsZWN0LkltcGxGb3JWYXJpYWJsZSBwYXJzZUZvcm1hbFR5cGVQYXJhbWV0ZXIoKQotCi0gdm9pZCBwYXJzZU1ldGhvZFR5cGVTaWduYXR1cmUoCi1ib29sZWFuKQotCi0gdm9pZCBwYXJzZU9wdEZvcm1hbFR5cGVQYXJhbWV0ZXJzKCkKLQotIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmxhbmcucmVmbGVjdC5MaXN0T2ZUeXBlcyBwYXJzZU9wdFR5cGVBcmd1bWVudHMoKQotCi0gamF2YS5sYW5nLnJlZmxlY3QuVHlwZSBwYXJzZVJldHVyblR5cGUoKQotCi0gamF2YS5sYW5nLnJlZmxlY3QuVHlwZSBwYXJzZVR5cGVBcmd1bWVudCgpCi0KLSBqYXZhLmxhbmcucmVmbGVjdC5UeXBlIHBhcnNlVHlwZVNpZ25hdHVyZSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvbGFuZy9yZWZsZWN0L0ltcGxGb3JWYXJpYWJsZTxMamF2YS9sYW5nL3JlZmxlY3QvR2VuZXJpY0RlY2xhcmF0aW9uOz47ICkKLSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5sYW5nLnJlZmxlY3QuSW1wbEZvclZhcmlhYmxlIHBhcnNlVHlwZVZhcmlhYmxlU2lnbmF0dXJlKCkKLQotIHZvaWQgc2NhbklkZW50aWZpZXIoKQotCi0gdm9pZCBzY2FuU3ltYm9sKCkKLQotIHZvaWQgc2V0SW5wdXQoCi1qYXZhLmxhbmcucmVmbGVjdC5HZW5lcmljRGVjbGFyYXRpb24KLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkubGFuZy5yZWZsZWN0LkltcGxGb3JBcnJheSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmxhbmcucmVmbGVjdC5HZW5lcmljQXJyYXlUeXBlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLnJlZmxlY3QuVHlwZSBjb21wb25lbnRUeXBlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLnJlZmxlY3QuVHlwZSkKLQotcHVibGljIGphdmEubGFuZy5yZWZsZWN0LlR5cGUgZ2V0R2VuZXJpY0NvbXBvbmVudFR5cGUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkubGFuZy5yZWZsZWN0LkltcGxGb3JUeXBlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5yZWZsZWN0LlBhcmFtZXRlcml6ZWRUeXBlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkubGFuZy5yZWZsZWN0Lkxpc3RPZlR5cGVzIGFyZ3MKLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5sYW5nLnJlZmxlY3QuSW1wbEZvclR5cGUgb3duZXJUeXBlMAotCi1wcml2YXRlIGphdmEubGFuZy5yZWZsZWN0LlR5cGUgb3duZXJUeXBlUmVzCi0KLXByaXZhdGUgamF2YS5sYW5nLkNsYXNzIHJhd1R5cGUKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIHJhd1R5cGVOYW1lCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkubGFuZy5yZWZsZWN0LkltcGxGb3JUeXBlCi1qYXZhLmxhbmcuU3RyaW5nCi1vcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5sYW5nLnJlZmxlY3QuTGlzdE9mVHlwZXMpCi0KLXB1YmxpYyBqYXZhLmxhbmcucmVmbGVjdC5UeXBlW10gZ2V0QWN0dWFsVHlwZUFyZ3VtZW50cygpCi0KLXB1YmxpYyBqYXZhLmxhbmcucmVmbGVjdC5UeXBlIGdldE93bmVyVHlwZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuQ2xhc3MgZ2V0UmF3VHlwZSgpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcucmVmbGVjdC5UeXBlIGdldFJhd1R5cGUoKQotCi0gamF2YS5sYW5nLnJlZmxlY3QuVHlwZSBnZXRSZXNvbHZlZFR5cGUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxEOjpMamF2YS9sYW5nL3JlZmxlY3QvR2VuZXJpY0RlY2xhcmF0aW9uOz5MamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL3JlZmxlY3QvVHlwZVZhcmlhYmxlPFREOz47ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5sYW5nLnJlZmxlY3QuSW1wbEZvclZhcmlhYmxlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEubGFuZy5yZWZsZWN0LlR5cGVWYXJpYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmxhbmcucmVmbGVjdC5MaXN0T2ZUeXBlcyBib3VuZHMKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcucmVmbGVjdC5HZW5lcmljRGVjbGFyYXRpb24gZGVjbE9mVmFyVXNlcgotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS9sYW5nL3JlZmxlY3QvSW1wbEZvclZhcmlhYmxlPFREOz47ICkKLXByaXZhdGUgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkubGFuZy5yZWZsZWN0LkltcGxGb3JWYXJpYWJsZSBmb3JtYWxWYXIKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1URDsgKQotcHJpdmF0ZSBqYXZhLmxhbmcucmVmbGVjdC5HZW5lcmljRGVjbGFyYXRpb24gZ2VuZXJpY0RlY2xhcmF0aW9uCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBuYW1lCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEQ7TGphdmEvbGFuZy9TdHJpbmc7KVYgKQotIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLnJlZmxlY3QuR2VuZXJpY0RlY2xhcmF0aW9uCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShURDtMamF2YS9sYW5nL1N0cmluZztMb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvbGFuZy9yZWZsZWN0L0xpc3RPZlR5cGVzOylWICkKLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5yZWZsZWN0LkdlbmVyaWNEZWNsYXJhdGlvbgotamF2YS5sYW5nLlN0cmluZwotb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkubGFuZy5yZWZsZWN0Lkxpc3RPZlR5cGVzKQotCi1zdGF0aWMgamF2YS5sYW5nLnJlZmxlY3QuVHlwZVZhcmlhYmxlIGZpbmRGb3JtYWxWYXIoCi1qYXZhLmxhbmcucmVmbGVjdC5HZW5lcmljRGVjbGFyYXRpb24KLWphdmEubGFuZy5TdHJpbmcpCi0KLXN0YXRpYyBqYXZhLmxhbmcucmVmbGVjdC5HZW5lcmljRGVjbGFyYXRpb24gbmV4dExheWVyKAotamF2YS5sYW5nLnJlZmxlY3QuR2VuZXJpY0RlY2xhcmF0aW9uKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgamF2YS5sYW5nLnJlZmxlY3QuVHlwZVtdIGdldEJvdW5kcygpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClURDsgKQotcHVibGljIGphdmEubGFuZy5yZWZsZWN0LkdlbmVyaWNEZWNsYXJhdGlvbiBnZXRHZW5lcmljRGVjbGFyYXRpb24oKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXROYW1lKCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLSB2b2lkIHJlc29sdmUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkubGFuZy5yZWZsZWN0LkltcGxGb3JXaWxkY2FyZCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmxhbmcucmVmbGVjdC5XaWxkY2FyZFR5cGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5sYW5nLnJlZmxlY3QuTGlzdE9mVHlwZXMgZXh0ZW5kc0JvdW5kCi0KLXByaXZhdGUgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkubGFuZy5yZWZsZWN0Lkxpc3RPZlR5cGVzIHN1cGVyQm91bmQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5sYW5nLnJlZmxlY3QuTGlzdE9mVHlwZXMKLW9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmxhbmcucmVmbGVjdC5MaXN0T2ZUeXBlcykKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL1R5cGVOb3RQcmVzZW50RXhjZXB0aW9uO0xqYXZhL2xhbmcvcmVmbGVjdC9NYWxmb3JtZWRQYXJhbWV0ZXJpemVkVHlwZUV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5yZWZsZWN0LlR5cGVbXSBnZXRMb3dlckJvdW5kcygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9UeXBlTm90UHJlc2VudEV4Y2VwdGlvbjtMamF2YS9sYW5nL3JlZmxlY3QvTWFsZm9ybWVkUGFyYW1ldGVyaXplZFR5cGVFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcucmVmbGVjdC5UeXBlW10gZ2V0VXBwZXJCb3VuZHMoKQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmxhbmcucmVmbGVjdC5MaXN0T2ZUeXBlcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmxhbmcucmVmbGVjdC5MaXN0T2ZUeXBlcyBlbXB0eQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQXJyYXlMaXN0PExqYXZhL2xhbmcvcmVmbGVjdC9UeXBlOz47ICkKLSBqYXZhLnV0aWwuQXJyYXlMaXN0IGxpc3QKLQotcHJpdmF0ZSBqYXZhLmxhbmcucmVmbGVjdC5UeXBlW10gcmVzb2x2ZWRUeXBlcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KAotaW50KQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcucmVmbGVjdC5UeXBlW10pCi0KLSB2b2lkIGFkZCgKLWphdmEubGFuZy5yZWZsZWN0LlR5cGUpCi0KLXB1YmxpYyBqYXZhLmxhbmcucmVmbGVjdC5UeXBlW10gZ2V0UmVzb2x2ZWRUeXBlcygpCi0KLSBpbnQgbGVuZ3RoKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmxhbmcucmVmbGVjdC5MaXN0T2ZWYXJpYWJsZXMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLnJlZmxlY3QuVHlwZVZhcmlhYmxlW10gZW1wdHkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0FycmF5TGlzdDxMamF2YS9sYW5nL3JlZmxlY3QvVHlwZVZhcmlhYmxlPCo+Oz47ICkKLSBqYXZhLnV0aWwuQXJyYXlMaXN0IGFycmF5Ci0KLSBpbnQgbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9yZWZsZWN0L1R5cGVWYXJpYWJsZTwqPjspViApCi0gdm9pZCBhZGQoCi1qYXZhLmxhbmcucmVmbGVjdC5UeXBlVmFyaWFibGUpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClbTGphdmEvbGFuZy9yZWZsZWN0L1R5cGVWYXJpYWJsZTwqPjsgKQotIGphdmEubGFuZy5yZWZsZWN0LlR5cGVWYXJpYWJsZVtdIGdldEFycmF5KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5sYW5nLnJlZmxlY3QuVHlwZXMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcucmVmbGVjdC5UeXBlW10gZ2V0Q2xvbmVkVHlwZUFycmF5KAotb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkubGFuZy5yZWZsZWN0Lkxpc3RPZlR5cGVzKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5yZWZsZWN0LlR5cGUgZ2V0VHlwZSgKLWphdmEubGFuZy5yZWZsZWN0LlR5cGUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1maW5hbCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5uZXQuR2VuZXJpY0lQTXJlcSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLm5ldC5JbmV0QWRkcmVzcyBpbnRlcmZhY2VBZGRyCi0KLXByaXZhdGUgaW50IGludGVyZmFjZUlkeAotCi1wcml2YXRlIGJvb2xlYW4gaXNJUFY2QWRkcmVzcwotCi1wcml2YXRlIGphdmEubmV0LkluZXRBZGRyZXNzIG11bHRpYWRkcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEubmV0LkluZXRBZGRyZXNzKQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLm5ldC5JbmV0QWRkcmVzcwotamF2YS5uZXQuTmV0d29ya0ludGVyZmFjZSkKLQotcHJpdmF0ZSB2b2lkIGluaXQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS9zZWN1cml0eS9Qcml2aWxlZ2VkQWN0aW9uPExqYXZhL2xhbmcvQm9vbGVhbjs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI2IG5hbWUgPUFjdGlvbiApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvbmV0L05ldFV0aWw7ICkKLWZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLm5ldC5OZXRVdGlsJEFjdGlvbiBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIHByb3BlcnR5TmFtZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuQm9vbGVhbiBydW4oKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9sdW5pL25ldC9OZXRVdGlsJEFjdGlvbjsgKQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLm5ldC5OZXRVdGlsIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXN0YXRpYyBpbnQgYnl0ZXNUb0ludCgKLWJ5dGVbXQotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9uZXQvVVJJOylMamF2YS91dGlsL0xpc3Q8TGphdmEvbmV0L1Byb3h5Oz47ICkKLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLkxpc3QgZ2V0UHJveHlMaXN0KAotamF2YS5uZXQuVVJJKQotCi1zdGF0aWMgdm9pZCBpbnRUb0J5dGVzKAotaW50Ci1ieXRlW10KLWludCkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIHByZWZlcklQdjRTdGFjaygpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwcmVmZXJJUHY2QWRkcmVzc2VzKCkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIHVzaW5nU29ja3MoCi1qYXZhLm5ldC5Qcm94eSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLSBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5uZXQuUGxhaW5EYXRhZ3JhbVNvY2tldEltcGwgZXh0ZW5kcyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldEltcGwKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIGludCBGTEFHX1NIVVRET1dOCi0KLXN0YXRpYyBmaW5hbCBpbnQgSVBfTVVMVElDQVNUX0FERAotCi1zdGF0aWMgZmluYWwgaW50IElQX01VTFRJQ0FTVF9EUk9QCi0KLXN0YXRpYyBmaW5hbCBpbnQgSVBfTVVMVElDQVNUX1RUTAotCi1zdGF0aWMgZmluYWwgaW50IE1VTFRJQ0FTVF9JRgotCi1zdGF0aWMgZmluYWwgaW50IE1VTFRJQ0FTVF9UVEwKLQotc3RhdGljIGZpbmFsIGludCBSRVVTRUFERFJfQU5EX1JFVVNFUE9SVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU09fQlJPQURDQVNUCi0KLXN0YXRpYyBmaW5hbCBpbnQgVENQX05PREVMQVkKLQotcHJpdmF0ZSBib29sZWFuIGJpbmRUb0RldmljZQotCi1wcml2YXRlIGphdmEubmV0LkluZXRBZGRyZXNzIGNvbm5lY3RlZEFkZHJlc3MKLQotcHJpdmF0ZSBpbnQgY29ubmVjdGVkUG9ydAotCi1wcml2YXRlIGJ5dGVbXSBpcGFkZHJlc3MKLQotcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIGlzTmF0aXZlQ29ubmVjdGVkCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uSU5ldHdvcmtTeXN0ZW0gbmV0SW1wbAotCi1wdWJsaWMgaW50IHJlY2VpdmVUaW1lb3V0Ci0KLXB1YmxpYyBib29sZWFuIHNodXRkb3duSW5wdXQKLQotcHVibGljIGJvb2xlYW4gc3RyZWFtaW5nCi0KLXByaXZhdGUgaW50IHRyYWZmaWNDbGFzcwotCi1wcml2YXRlIGludCB0dGwKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1pbnQpCi0KLXByaXZhdGUgdm9pZCB1cGRhdGVQYWNrZXRSZWN2QWRkcmVzcygKLWphdmEubmV0LkRhdGFncmFtUGFja2V0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGJpbmQoCi1pbnQKLWphdmEubmV0LkluZXRBZGRyZXNzKQotCi1wdWJsaWMgdm9pZCBjbG9zZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1NvY2tldEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY29ubmVjdCgKLWphdmEubmV0LkluZXRBZGRyZXNzCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1NvY2tldEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY3JlYXRlKCkKLQotcHVibGljIHZvaWQgZGlzY29ubmVjdCgpCi0KLXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvU29ja2V0RXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRPcHRpb24oCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBieXRlIGdldFRUTCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgZ2V0VGltZVRvTGl2ZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGpvaW4oCi1qYXZhLm5ldC5JbmV0QWRkcmVzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgam9pbkdyb3VwKAotamF2YS5uZXQuU29ja2V0QWRkcmVzcwotamF2YS5uZXQuTmV0d29ya0ludGVyZmFjZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgbGVhdmUoCi1qYXZhLm5ldC5JbmV0QWRkcmVzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgbGVhdmVHcm91cCgKLWphdmEubmV0LlNvY2tldEFkZHJlc3MKLWphdmEubmV0Lk5ldHdvcmtJbnRlcmZhY2UpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCBpbnQgcGVlaygKLWphdmEubmV0LkluZXRBZGRyZXNzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHBlZWtEYXRhKAotamF2YS5uZXQuRGF0YWdyYW1QYWNrZXQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHJlY2VpdmUoCi1qYXZhLm5ldC5EYXRhZ3JhbVBhY2tldCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2VuZCgKLWphdmEubmV0LkRhdGFncmFtUGFja2V0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldE9wdGlvbigKLWludAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0VFRMKAotYnl0ZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0VGltZVRvTGl2ZSgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLSBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5uZXQuUGxhaW5NdWx0aWNhc3RTb2NrZXRJbXBsIGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkubmV0LlBsYWluRGF0YWdyYW1Tb2NrZXRJbXBsCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvU29ja2V0RXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjcmVhdGUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLm5ldC5QbGFpblNvY2tldEltcGwgZXh0ZW5kcyBqYXZhLm5ldC5Tb2NrZXRJbXBsCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBmaW5hbCBpbnQgRkxBR19TSFVURE9XTgotCi1zdGF0aWMgZmluYWwgaW50IE1VTFRJQ0FTVF9JRgotCi1zdGF0aWMgZmluYWwgaW50IE1VTFRJQ0FTVF9UVEwKLQotc3RhdGljIGZpbmFsIGludCBUQ1BfTk9ERUxBWQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCBmZEZpZWxkCi0KLXByaXZhdGUgc3RhdGljIGphdmEubmV0LkluZXRBZGRyZXNzIGxhc3RDb25uZWN0ZWRBZGRyZXNzCi0KLXByaXZhdGUgc3RhdGljIGludCBsYXN0Q29ubmVjdGVkUG9ydAotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCBsb2NhbHBvcnRGaWVsZAotCi1wcm90ZWN0ZWQgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uSU5ldHdvcmtTeXN0ZW0gbmV0SW1wbAotCi0gamF2YS5uZXQuUHJveHkgcHJveHkKLQotcHVibGljIGJvb2xlYW4gc2h1dGRvd25JbnB1dAotCi1wdWJsaWMgYm9vbGVhbiBzdHJlYW1pbmcKLQotcHJpdmF0ZSBib29sZWFuIHRjcE5vRGVsYXkKLQotcHJpdmF0ZSBpbnQgdHJhZmZpY0NsYXNzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIGNvbm5lY3QoCi1qYXZhLm5ldC5JbmV0QWRkcmVzcwotaW50Ci1pbnQpCi0KLXByaXZhdGUgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQgZ2V0U29ja2V0SW1wbEZpZWxkKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSB2b2lkIHNldExvY2FscG9ydCgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHNvY2tzQmluZCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCBzb2Nrc0Nvbm5lY3QoCi1qYXZhLm5ldC5JbmV0QWRkcmVzcwotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1Vua25vd25Ib3N0RXhjZXB0aW9uOyApCi1wcml2YXRlIGphdmEubmV0LkluZXRBZGRyZXNzIHNvY2tzR2V0U2VydmVyQWRkcmVzcygpCi0KLXByaXZhdGUgaW50IHNvY2tzR2V0U2VydmVyUG9ydCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkubmV0LlNvY2tzNE1lc3NhZ2Ugc29ja3NSZWFkUmVwbHkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgc29ja3NSZXF1ZXN0Q29ubmVjdGlvbigKLWphdmEubmV0LkluZXRBZGRyZXNzCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCBzb2Nrc1NlbmRSZXF1ZXN0KAotaW50Ci1qYXZhLm5ldC5JbmV0QWRkcmVzcwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBhY2NlcHQoCi1qYXZhLm5ldC5Tb2NrZXRJbXBsKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgaW50IGF2YWlsYWJsZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIGJpbmQoCi1qYXZhLm5ldC5JbmV0QWRkcmVzcwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBjbG9zZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIGNvbm5lY3QoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIGNvbm5lY3QoCi1qYXZhLm5ldC5JbmV0QWRkcmVzcwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBjb25uZWN0KAotamF2YS5uZXQuU29ja2V0QWRkcmVzcwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBjcmVhdGUoCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpCi0KLSBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yIGdldEZEKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGphdmEuaW8uSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldE9wdGlvbigKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGphdmEuaW8uT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIGxpc3RlbigKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotIGludCByZWFkKAotYnl0ZVtdCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgc2VuZFVyZ2VudERhdGEoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1NvY2tldEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0T3B0aW9uKAotaW50Ci1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBzaHV0ZG93bklucHV0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgc2h1dGRvd25PdXRwdXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzb2Nrc0FjY2VwdCgpCi0KLXByb3RlY3RlZCBib29sZWFuIHN1cHBvcnRzVXJnZW50RGF0YSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLSBpbnQgd3JpdGUoCi1ieXRlW10KLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLm5ldC5QbGFpblNlcnZlclNvY2tldEltcGwgZXh0ZW5kcyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5uZXQuUGxhaW5Tb2NrZXRJbXBsCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5GaWxlRGVzY3JpcHRvcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvU29ja2V0RXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBjcmVhdGUoCi1ib29sZWFuKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS9zZWN1cml0eS9Qcml2aWxlZ2VkQWN0aW9uPExqYXZhL2xhbmcvcmVmbGVjdC9GaWVsZDs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi0gY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkubmV0LlBsYWluU29ja2V0SW1wbCQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5uZXQuUGxhaW5Tb2NrZXRJbXBsIHRoaXMkMAotCi1maW5hbCBqYXZhLmxhbmcuU3RyaW5nIHZhbCRmaWVsZE5hbWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5uZXQuUGxhaW5Tb2NrZXRJbXBsCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBydW4oKQotCi1wdWJsaWMgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLSBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5uZXQuUGxhaW5Tb2NrZXRJbXBsMiBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLm5ldC5QbGFpblNvY2tldEltcGwKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1pbnQKLWphdmEubmV0LkluZXRBZGRyZXNzCi1pbnQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubmV0LlByb3h5KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBjcmVhdGUoCi1ib29sZWFuKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLm5ldC5Tb2NrZXRJbXBsUHJvdmlkZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldEltcGwgZ2V0RGF0YWdyYW1Tb2NrZXRJbXBsKCkKLQotcHVibGljIHN0YXRpYyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldEltcGwgZ2V0RGF0YWdyYW1Tb2NrZXRJbXBsKAotamF2YS5pby5GaWxlRGVzY3JpcHRvcgotaW50KQotCi1wdWJsaWMgc3RhdGljIGphdmEubmV0LkRhdGFncmFtU29ja2V0SW1wbCBnZXRNdWx0aWNhc3RTb2NrZXRJbXBsKCkKLQotcHVibGljIHN0YXRpYyBqYXZhLm5ldC5Tb2NrZXRJbXBsIGdldFNlcnZlclNvY2tldEltcGwoKQotCi1wdWJsaWMgc3RhdGljIGphdmEubmV0LlNvY2tldEltcGwgZ2V0U2VydmVyU29ja2V0SW1wbCgKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5uZXQuU29ja2V0SW1wbCBnZXRTb2NrZXRJbXBsKCkKLQotcHVibGljIHN0YXRpYyBqYXZhLm5ldC5Tb2NrZXRJbXBsIGdldFNvY2tldEltcGwoCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1pbnQKLWphdmEubmV0LkluZXRBZGRyZXNzCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5uZXQuU29ja2V0SW1wbCBnZXRTb2NrZXRJbXBsKAotamF2YS5uZXQuUHJveHkpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi0gY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkubmV0LlNvY2tldElucHV0U3RyZWFtIGV4dGVuZHMgamF2YS5pby5JbnB1dFN0cmVhbQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLm5ldC5QbGFpblNvY2tldEltcGwgc29ja2V0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5uZXQuU29ja2V0SW1wbCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCBhdmFpbGFibGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjbG9zZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcmVhZCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcmVhZCgKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCByZWFkKAotYnl0ZVtdCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGxvbmcgc2tpcCgKLWxvbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi0gY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkubmV0LlNvY2tldE91dHB1dFN0cmVhbSBleHRlbmRzIGphdmEuaW8uT3V0cHV0U3RyZWFtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkubmV0LlBsYWluU29ja2V0SW1wbCBzb2NrZXQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLm5ldC5Tb2NrZXRJbXBsKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjbG9zZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHdyaXRlKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB3cml0ZSgKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgd3JpdGUoCi1ieXRlW10KLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLm5ldC5Tb2NrczRNZXNzYWdlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVGRkVSX0xFTkdUSAotCi1zdGF0aWMgZmluYWwgaW50IENPTU1BTkRfQklORAotCi1zdGF0aWMgZmluYWwgaW50IENPTU1BTkRfQ09OTkVDVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5ERVhfQ09NTUFORAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5ERVhfSVAKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOREVYX1BPUlQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOREVYX1VTRVJfSUQKLQotc3RhdGljIGZpbmFsIGludCBJTkRFWF9WRVJTSU9OCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfVVNFUl9JRF9MRU5HVEgKLQotc3RhdGljIGZpbmFsIGludCBSRVBMWV9MRU5HVEgKLQotc3RhdGljIGZpbmFsIGludCBSRVRVUk5fQ0FOTk9UX0NPTk5FQ1RfVE9fSURFTlRECi0KLXN0YXRpYyBmaW5hbCBpbnQgUkVUVVJOX0RJRkZFUkVOVF9VU0VSX0lEUwotCi1zdGF0aWMgZmluYWwgaW50IFJFVFVSTl9GQUlMVVJFCi0KLXN0YXRpYyBmaW5hbCBpbnQgUkVUVVJOX1NVQ0NFU1MKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNPQ0tTX1ZFUlNJT04KLQotcHJvdGVjdGVkIGJ5dGVbXSBidWZmZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIGludCBnZXRJbnQxNigKLWludCkKLQotcHJpdmF0ZSBpbnQgZ2V0SW50MzIoCi1pbnQpCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBnZXRTdHJpbmcoCi1pbnQKLWludCkKLQotcHJpdmF0ZSBpbnQgZ2V0VmVyc2lvbk51bWJlcigpCi0KLXByaXZhdGUgdm9pZCBzZXRJbnQxNigKLWludAotaW50KQotCi1wcml2YXRlIHZvaWQgc2V0U3RyaW5nKAotaW50Ci1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgdm9pZCBzZXRWZXJzaW9uTnVtYmVyKAotaW50KQotCi1wdWJsaWMgYnl0ZVtdIGdldEJ5dGVzKCkKLQotcHVibGljIGludCBnZXRDb21tYW5kT3JSZXN1bHQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRFcnJvclN0cmluZygKLWludCkKLQotcHVibGljIGludCBnZXRJUCgpCi0KLXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkKLQotcHVibGljIGludCBnZXRQb3J0KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VXNlcklkKCkKLQotcHVibGljIHZvaWQgc2V0Q29tbWFuZE9yUmVzdWx0KAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRJUCgKLWJ5dGVbXSkKLQotcHVibGljIHZvaWQgc2V0UG9ydCgKLWludCkKLQotcHVibGljIHZvaWQgc2V0VXNlcklkKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS9wbGF0Zm9ybS9BYnN0cmFjdE1lbW9yeVNweTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNiBuYW1lID1BZGRyZXNzV3JhcHBlciApCi1maW5hbCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5BYnN0cmFjdE1lbW9yeVNweSRBZGRyZXNzV3JhcHBlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotdm9sYXRpbGUgYm9vbGVhbiBhdXRvRnJlZQotCi1maW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5QbGF0Zm9ybUFkZHJlc3Mgc2hhZG93Ci0KLWZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLkFic3RyYWN0TWVtb3J5U3B5IHRoaXMkMAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvcmVmL1BoYW50b21SZWZlcmVuY2U8TG9yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3BsYXRmb3JtL1BsYXRmb3JtQWRkcmVzczs+OyApCi1maW5hbCBqYXZhLmxhbmcucmVmLlBoYW50b21SZWZlcmVuY2Ugd3JBZGRyZXNzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uQWJzdHJhY3RNZW1vcnlTcHkKLW9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLlBsYXRmb3JtQWRkcmVzcykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uSU1lbW9yeVNweSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBhbGxvYygKLW9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLlBsYXRmb3JtQWRkcmVzcykKLQotcHVibGljIGFic3RyYWN0IHZvaWQgYXV0b0ZyZWUoCi1vcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5QbGF0Zm9ybUFkZHJlc3MpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGZyZWUoCi1vcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5QbGF0Zm9ybUFkZHJlc3MpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbmRleE91dE9mQm91bmRzRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCByYW5nZUNoZWNrKAotb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uUGxhdGZvcm1BZGRyZXNzCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS9wbGF0Zm9ybS9BYnN0cmFjdE1lbW9yeVNweSRBZGRyZXNzV3JhcHBlcjsgKQotYWJzdHJhY3QgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uQWJzdHJhY3RNZW1vcnlTcHkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uSU1lbW9yeVNweQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvTWFwPExvcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS9wbGF0Zm9ybS9QbGF0Zm9ybUFkZHJlc3M7TG9yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3BsYXRmb3JtL0Fic3RyYWN0TWVtb3J5U3B5JEFkZHJlc3NXcmFwcGVyOz47ICkKLXByb3RlY3RlZCBqYXZhLnV0aWwuTWFwIG1lbW9yeUluVXNlCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9yZWYvUmVmZXJlbmNlUXVldWU8TGphdmEvbGFuZy9PYmplY3Q7PjsgKQotcHJvdGVjdGVkIGphdmEubGFuZy5yZWYuUmVmZXJlbmNlUXVldWUgbm90aWZ5UXVldWUKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL01hcDxMamF2YS9sYW5nL3JlZi9SZWZlcmVuY2U7TG9yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3BsYXRmb3JtL1BsYXRmb3JtQWRkcmVzczs+OyApCi1wcm90ZWN0ZWQgamF2YS51dGlsLk1hcCByZWZUb1NoYWRvdwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIGFsbG9jKAotb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uUGxhdGZvcm1BZGRyZXNzKQotCi1wdWJsaWMgdm9pZCBhdXRvRnJlZSgKLW9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLlBsYXRmb3JtQWRkcmVzcykKLQotcHVibGljIGJvb2xlYW4gZnJlZSgKLW9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLlBsYXRmb3JtQWRkcmVzcykKLQotcHJvdGVjdGVkIHZvaWQgb3JwaGFuZWRNZW1vcnkoCi1qYXZhLmxhbmcucmVmLlJlZmVyZW5jZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHJhbmdlQ2hlY2soCi1vcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5QbGF0Zm9ybUFkZHJlc3MKLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5JQWRhcHRlck1hbmFnZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5PYmplY3QgZ2V0QWRhcHRlcigKLW9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLklBZGFwdGFibGUKLWphdmEubGFuZy5DbGFzcykKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaGFzQWRhcHRlcigKLW9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLklBZGFwdGFibGUKLWphdmEubGFuZy5DbGFzcykKLQotcHVibGljIGFic3RyYWN0IHZvaWQgcmVnaXN0ZXJBZGFwdGVycygKLW9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLklBZGFwdGVyRmFjdG9yeQotamF2YS5sYW5nLkNsYXNzKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB1bnJlZ2lzdGVyQWRhcHRlcnMoCi1vcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5JQWRhcHRlckZhY3RvcnkpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHVucmVnaXN0ZXJBZGFwdGVycygKLW9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLklBZGFwdGVyRmFjdG9yeQotamF2YS5sYW5nLkNsYXNzKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotZmluYWwgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uQWRhcHRlck1hbmFnZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uSUFkYXB0ZXJNYW5hZ2VyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9IYXNoTWFwPExqYXZhL2xhbmcvQ2xhc3M7TGphdmEvdXRpbC9MaXN0PExvcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS9wbGF0Zm9ybS9JQWRhcHRlckZhY3Rvcnk7Pjs+OyApCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5IYXNoTWFwIGZhY3RvcmllcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldEFkYXB0ZXIoCi1vcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5JQWRhcHRhYmxlCi1qYXZhLmxhbmcuQ2xhc3MpCi0KLXB1YmxpYyBib29sZWFuIGhhc0FkYXB0ZXIoCi1vcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5JQWRhcHRhYmxlCi1qYXZhLmxhbmcuQ2xhc3MpCi0KLXB1YmxpYyB2b2lkIHJlZ2lzdGVyQWRhcHRlcnMoCi1vcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5JQWRhcHRlckZhY3RvcnkKLWphdmEubGFuZy5DbGFzcykKLQotcHVibGljIHZvaWQgdW5yZWdpc3RlckFkYXB0ZXJzKAotb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uSUFkYXB0ZXJGYWN0b3J5KQotCi1wdWJsaWMgdm9pZCB1bnJlZ2lzdGVyQWRhcHRlcnMoCi1vcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5JQWRhcHRlckZhY3RvcnkKLWphdmEubGFuZy5DbGFzcykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5FbmRpYW5uZXNzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLkVuZGlhbm5lc3MgQklHX0VORElBTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLkVuZGlhbm5lc3MgTElUVExFX0VORElBTgotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgZGlzcGxheU5hbWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLkZpbGVEZXNjcmlwdG9ySGFuZGxlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5pby5GaWxlRGVzY3JpcHRvciBnZXRGRCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLklBZGFwdGFibGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5PYmplY3QgZ2V0QWRhcHRlcigKLWphdmEubGFuZy5DbGFzcykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uSUFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuT2JqZWN0IGdldEFkYXB0ZXIoCi1vcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5JQWRhcHRhYmxlCi1qYXZhLmxhbmcuQ2xhc3MpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLklDb21tb25EYXRhVHlwZXMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJWkVPRl9CT09MCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJWkVPRl9CT09MRUFOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJWkVPRl9ET1VCTEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0laRU9GX0VJR0hUX0JZVEVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJWkVPRl9GTE9BVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSVpFT0ZfSUVFRTc1NF8zMl9CSVRTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJWkVPRl9JRUVFNzU0XzY0X0JJVFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0laRU9GX0lOVDE2Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJWkVPRl9JTlQzMgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSVpFT0ZfSkJPT0xFQU4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0laRU9GX0pCWVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJWkVPRl9KQ0hBUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSVpFT0ZfSkRPVUJMRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSVpFT0ZfSkZMT0FUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJWkVPRl9KSU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJWkVPRl9KTE9ORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSVpFT0ZfSlNIT1JUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJWkVPRl9KU0laRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSVpFT0ZfTE9ORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSVpFT0ZfTk9fQllURVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0laRU9GX09ORV9CWVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJWkVPRl9TSE9SVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSVpFT0ZfU0lHTkVEXzE2X0JJVFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0laRU9GX1NJR05FRF8zMl9CSVRTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJWkVPRl9TSUdORURfNjRfQklUUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSVpFT0ZfU0lHTkVEXzhfQklUUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSVpFT0ZfU0lHTkVEX0NIQVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0laRU9GX1NJR05FRF9MT05HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJWkVPRl9TSUdORURfU0hPUlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0laRU9GX1RXT19CWVRFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSVpFT0ZfVUlOVDE2Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJWkVPRl9VSU5UMzIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0laRU9GX1VOU0lHTkVEXzMyX0JJVFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0laRU9GX1VOU0lHTkVEXzY0X0JJVFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0laRU9GX1VOU0lHTkVEX0NIQVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0laRU9GX1VOU0lHTkVEX0xPTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0laRU9GX1VOU0lHTkVEX1NIT1JUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJWkVPRl9WT0lECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJWkVfT0ZfRk9VUl9CWVRFUwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLklTeXN0ZW1Db21wb25lbnQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uSUFkYXB0YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLklGaWxlU3lzdGVtIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLklTeXN0ZW1Db21wb25lbnQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhDTFVTSVZFX0xPQ0tfVFlQRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPX0FQUEVORAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPX0NSRUFUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9fRVhDTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPX05PQ1RUWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPX05PTkJMT0NLCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9fUkRPTkxZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9fUkRXUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPX1JEV1JTWU5DCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9fVFJVTkMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT19XUk9OTFkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VFS19DVVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VFS19FTkQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VFS19TRVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hBUkVEX0xPQ0tfVFlQRQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGNsb3NlKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBmZmx1c2goCi1pbnQKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0QWxsb2NHcmFudWxhcml0eSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgaW9jdGxBdmFpbGFibGUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGxvY2soCi1pbnQKLWxvbmcKLWxvbmcKLWludAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9GaWxlTm90Rm91bmRFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgb3BlbigKLWJ5dGVbXQotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgbG9uZyByZWFkKAotaW50Ci1ieXRlW10KLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgbG9uZyByZWFkRGlyZWN0KAotaW50Ci1pbnQKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgbG9uZyByZWFkdigKLWludAotaW50W10KLWludFtdCi1pbnRbXQotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgbG9uZyBzZWVrKAotaW50Ci1sb25nCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBsb25nIHRyYW5zZmVyKAotaW50Ci1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1sb25nCi1sb25nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB0cnVuY2F0ZSgKLWludAotbG9uZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGxvbmcgdHR5UmVhZCgKLWJ5dGVbXQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHVubG9jaygKLWludAotbG9uZwotbG9uZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGxvbmcgd3JpdGUoCi1pbnQKLWJ5dGVbXQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBsb25nIHdyaXRlRGlyZWN0KAotaW50Ci1pbnQKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgbG9uZyB3cml0ZXYoCi1pbnQKLWludFtdCi1pbnRbXQotaW50W10KLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uSU1lbW9yeVN5c3RlbSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU1BUF9SRUFEX09OTFkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU1BUF9SRUFEX1dSSVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1NQVBfV1JJVEVfQ09QWQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGZsdXNoKAotaW50Ci1sb25nKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBmcmVlKAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldEFkZHJlc3MoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBieXRlIGdldEJ5dGUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9OdWxsUG9pbnRlckV4Y2VwdGlvbjtMamF2YS9sYW5nL0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdldEJ5dGVBcnJheSgKLWludAotYnl0ZVtdCi1pbnQKLWludCkKLQotcHVibGljIGFic3RyYWN0IGRvdWJsZSBnZXREb3VibGUoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBkb3VibGUgZ2V0RG91YmxlKAotaW50Ci1vcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5FbmRpYW5uZXNzKQotCi1wdWJsaWMgYWJzdHJhY3QgZmxvYXQgZ2V0RmxvYXQoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBmbG9hdCBnZXRGbG9hdCgKLWludAotb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uRW5kaWFubmVzcykKLQotcHVibGljIGFic3RyYWN0IGludCBnZXRJbnQoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0SW50KAotaW50Ci1vcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5FbmRpYW5uZXNzKQotCi1wdWJsaWMgYWJzdHJhY3QgbG9uZyBnZXRMb25nKAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgbG9uZyBnZXRMb25nKAotaW50Ci1vcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5FbmRpYW5uZXNzKQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldFBvaW50ZXJTaXplKCkKLQotcHVibGljIGFic3RyYWN0IHNob3J0IGdldFNob3J0KAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgc2hvcnQgZ2V0U2hvcnQoCi1pbnQKLW9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLkVuZGlhbm5lc3MpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzTGl0dGxlRW5kaWFuKCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNMb2FkZWQoCi1pbnQKLWxvbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGxvYWQoCi1pbnQKLWxvbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9PdXRPZk1lbW9yeUVycm9yOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IG1hbGxvYygKLWludCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgbWVtbW92ZSgKLWludAotaW50Ci1sb25nKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBtZW1zZXQoCi1pbnQKLWJ5dGUKLWxvbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgbW1hcCgKLWludAotbG9uZwotbG9uZwotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRBZGRyZXNzKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEJ5dGUoCi1pbnQKLWJ5dGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9OdWxsUG9pbnRlckV4Y2VwdGlvbjtMamF2YS9sYW5nL0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEJ5dGVBcnJheSgKLWludAotYnl0ZVtdCi1pbnQKLWludCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RG91YmxlKAotaW50Ci1kb3VibGUpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldERvdWJsZSgKLWludAotZG91YmxlCi1vcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5FbmRpYW5uZXNzKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRGbG9hdCgKLWludAotZmxvYXQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEZsb2F0KAotaW50Ci1mbG9hdAotb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uRW5kaWFubmVzcykKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0SW50KAotaW50Ci1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEludCgKLWludAotaW50Ci1vcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5FbmRpYW5uZXNzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvTnVsbFBvaW50ZXJFeGNlcHRpb247TGphdmEvbGFuZy9JbmRleE91dE9mQm91bmRzRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRJbnRBcnJheSgKLWludAotaW50W10KLWludAotaW50Ci1ib29sZWFuKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRMb25nKAotaW50Ci1sb25nKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRMb25nKAotaW50Ci1sb25nCi1vcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5FbmRpYW5uZXNzKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRTaG9ydCgKLWludAotc2hvcnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFNob3J0KAotaW50Ci1zaG9ydAotb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uRW5kaWFubmVzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL051bGxQb2ludGVyRXhjZXB0aW9uO0xqYXZhL2xhbmcvSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0U2hvcnRBcnJheSgKLWludAotc2hvcnRbXQotaW50Ci1pbnQKLWJvb2xlYW4pCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHVubWFwKAotaW50Ci1sb25nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5JTmV0d29ya1N5c3RlbSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU09DS0VUX0NPTk5FQ1RfU1RFUF9DSEVDSwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTT0NLRVRfQ09OTkVDVF9TVEVQX1NUQVJUCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgYWNjZXB0KAotamF2YS5pby5GaWxlRGVzY3JpcHRvcgotamF2YS5uZXQuU29ja2V0SW1wbAotamF2YS5pby5GaWxlRGVzY3JpcHRvcgotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgYXZhaWxhYmxlU3RyZWFtKAotamF2YS5pby5GaWxlRGVzY3JpcHRvcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvU29ja2V0RXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBiaW5kKAotamF2YS5pby5GaWxlRGVzY3JpcHRvcgotaW50Ci1qYXZhLm5ldC5JbmV0QWRkcmVzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvU29ja2V0RXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBiaW5kMigKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IKLWludAotYm9vbGVhbgotamF2YS5uZXQuSW5ldEFkZHJlc3MpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgY29ubmVjdCgKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IKLWludAotamF2YS5uZXQuSW5ldEFkZHJlc3MKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvU29ja2V0RXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBjb25uZWN0RGF0YWdyYW0oCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1pbnQKLWludAotamF2YS5uZXQuSW5ldEFkZHJlc3MpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGNvbm5lY3RTdHJlYW1XaXRoVGltZW91dFNvY2tldCgKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IKLWludAotaW50Ci1pbnQKLWphdmEubmV0LkluZXRBZGRyZXNzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGNvbm5lY3RXaXRoVGltZW91dCgKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IKLWludAotaW50Ci1qYXZhLm5ldC5JbmV0QWRkcmVzcwotaW50Ci1pbnQKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvU29ja2V0RXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBjcmVhdGVEYXRhZ3JhbVNvY2tldCgKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1NvY2tldEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgY3JlYXRlTXVsdGljYXN0U29ja2V0KAotamF2YS5pby5GaWxlRGVzY3JpcHRvcgotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvU29ja2V0RXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBjcmVhdGVTZXJ2ZXJTdHJlYW1Tb2NrZXQoCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBjcmVhdGVTb2NrZXQoCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGRpc2Nvbm5lY3REYXRhZ3JhbSgKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1Vua25vd25Ib3N0RXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5uZXQuSW5ldEFkZHJlc3MgZ2V0SG9zdEJ5QWRkcigKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvVW5rbm93bkhvc3RFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm5ldC5JbmV0QWRkcmVzcyBnZXRIb3N0QnlOYW1lKAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotcHVibGljIGFic3RyYWN0IGludCBnZXRTb2NrZXRGbGFncygpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm5ldC5JbmV0QWRkcmVzcyBnZXRTb2NrZXRMb2NhbEFkZHJlc3MoCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1ib29sZWFuKQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldFNvY2tldExvY2FsUG9ydCgKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1NvY2tldEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5PYmplY3QgZ2V0U29ja2V0T3B0aW9uKAotamF2YS5pby5GaWxlRGVzY3JpcHRvcgotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5uaW8uY2hhbm5lbHMuQ2hhbm5lbCBpbmhlcml0ZWRDaGFubmVsKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvU29ja2V0RXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBsaXN0ZW5TdHJlYW1Tb2NrZXQoCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uZVRpbWVJbml0aWFsaXphdGlvbigKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgcGVla0RhdGFncmFtKAotamF2YS5pby5GaWxlRGVzY3JpcHRvcgotamF2YS5uZXQuSW5ldEFkZHJlc3MKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCByZWFkKAotamF2YS5pby5GaWxlRGVzY3JpcHRvcgotYnl0ZVtdCi1pbnQKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IHJlYWREaXJlY3QoCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1pbnQKLWludAotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgcmVjZWl2ZURhdGFncmFtKAotamF2YS5pby5GaWxlRGVzY3JpcHRvcgotamF2YS5uZXQuRGF0YWdyYW1QYWNrZXQKLWJ5dGVbXQotaW50Ci1pbnQKLWludAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCByZWNlaXZlRGF0YWdyYW1EaXJlY3QoCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1qYXZhLm5ldC5EYXRhZ3JhbVBhY2tldAotaW50Ci1pbnQKLWludAotaW50Ci1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IHJlY2VpdmVTdHJlYW0oCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1ieXRlW10KLWludAotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgcmVjdkNvbm5lY3RlZERhdGFncmFtKAotamF2YS5pby5GaWxlRGVzY3JpcHRvcgotamF2YS5uZXQuRGF0YWdyYW1QYWNrZXQKLWJ5dGVbXQotaW50Ci1pbnQKLWludAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCByZWN2Q29ubmVjdGVkRGF0YWdyYW1EaXJlY3QoCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1qYXZhLm5ldC5EYXRhZ3JhbVBhY2tldAotaW50Ci1pbnQKLWludAotaW50Ci1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRbXSBzZWxlY3QoCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yW10KLWphdmEuaW8uRmlsZURlc2NyaXB0b3JbXQotbG9uZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCBzZW5kQ29ubmVjdGVkRGF0YWdyYW0oCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1ieXRlW10KLWludAotaW50Ci1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IHNlbmRDb25uZWN0ZWREYXRhZ3JhbURpcmVjdCgKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IKLWludAotaW50Ci1pbnQKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgc2VuZERhdGFncmFtKAotamF2YS5pby5GaWxlRGVzY3JpcHRvcgotYnl0ZVtdCi1pbnQKLWludAotaW50Ci1ib29sZWFuCi1pbnQKLWphdmEubmV0LkluZXRBZGRyZXNzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IHNlbmREYXRhZ3JhbTIoCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1ieXRlW10KLWludAotaW50Ci1pbnQKLWphdmEubmV0LkluZXRBZGRyZXNzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IHNlbmREYXRhZ3JhbURpcmVjdCgKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IKLWludAotaW50Ci1pbnQKLWludAotYm9vbGVhbgotaW50Ci1qYXZhLm5ldC5JbmV0QWRkcmVzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCBzZW5kU3RyZWFtKAotamF2YS5pby5GaWxlRGVzY3JpcHRvcgotYnl0ZVtdCi1pbnQKLWludCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2VuZFVyZ2VudERhdGEoCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1ieXRlKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRJbmV0QWRkcmVzcygKLWphdmEubmV0LkluZXRBZGRyZXNzCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldE5vbkJsb2NraW5nKAotamF2YS5pby5GaWxlRGVzY3JpcHRvcgotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvU29ja2V0RXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRTb2NrZXRPcHRpb24oCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNodXRkb3duSW5wdXQoCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzaHV0ZG93bk91dHB1dCgKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNvY2tldENsb3NlKAotamF2YS5pby5GaWxlRGVzY3JpcHRvcikKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gc3VwcG9ydHNVcmdlbnREYXRhKAotamF2YS5pby5GaWxlRGVzY3JpcHRvcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCB3cml0ZSgKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IKLWJ5dGVbXQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgd3JpdGVEaXJlY3QoCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1pbnQKLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLlBsYXRmb3JtQWRkcmVzcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5JQ29tbW9uRGF0YVR5cGVzLCBqYXZhLmxhbmcuQ29tcGFyYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLlBsYXRmb3JtQWRkcmVzcyBOVUxMCi0KLXN0YXRpYyBmaW5hbCBpbnQgU0laRU9GCi0KLXN0YXRpYyBmaW5hbCBsb25nIFVOS05PV04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5JTWVtb3J5U3B5IG1lbW9yeVNweQotCi1zdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uSU1lbW9yeVN5c3RlbSBvc01lbW9yeQotCi1maW5hbCBpbnQgb3NhZGRyCi0KLWZpbmFsIGxvbmcgc2l6ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KAotaW50Ci1sb25nKQotCi1wdWJsaWMgZmluYWwgdm9pZCBhdXRvRnJlZSgpCi0KLXB1YmxpYyBmaW5hbCBpbnQgY29tcGFyZVRvKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLlBsYXRmb3JtQWRkcmVzcyBkdXBsaWNhdGUoKQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgdm9pZCBmcmVlKCkKLQotcHVibGljIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLlBsYXRmb3JtQWRkcmVzcyBnZXRBZGRyZXNzKAotaW50KQotCi1wdWJsaWMgZmluYWwgYnl0ZSBnZXRCeXRlKAotaW50KQotCi1wdWJsaWMgZmluYWwgdm9pZCBnZXRCeXRlQXJyYXkoCi1pbnQKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyBmaW5hbCBkb3VibGUgZ2V0RG91YmxlKAotaW50KQotCi1wdWJsaWMgZmluYWwgZG91YmxlIGdldERvdWJsZSgKLWludAotb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uRW5kaWFubmVzcykKLQotcHVibGljIGZpbmFsIGZsb2F0IGdldEZsb2F0KAotaW50KQotCi1wdWJsaWMgZmluYWwgZmxvYXQgZ2V0RmxvYXQoCi1pbnQKLW9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLkVuZGlhbm5lc3MpCi0KLXB1YmxpYyBmaW5hbCBpbnQgZ2V0SW50KAotaW50KQotCi1wdWJsaWMgZmluYWwgaW50IGdldEludCgKLWludAotb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uRW5kaWFubmVzcykKLQotcHVibGljIGZpbmFsIGxvbmcgZ2V0TG9uZygKLWludCkKLQotcHVibGljIGZpbmFsIGxvbmcgZ2V0TG9uZygKLWludAotb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uRW5kaWFubmVzcykKLQotcHVibGljIGZpbmFsIHNob3J0IGdldFNob3J0KAotaW50KQotCi1wdWJsaWMgZmluYWwgc2hvcnQgZ2V0U2hvcnQoCi1pbnQKLW9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLkVuZGlhbm5lc3MpCi0KLXB1YmxpYyBmaW5hbCBsb25nIGdldFNpemUoKQotCi1wdWJsaWMgZmluYWwgaW50IGhhc2hDb2RlKCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gaXNOVUxMKCkKLQotcHVibGljIGZpbmFsIHZvaWQgbW92ZVRvKAotb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uUGxhdGZvcm1BZGRyZXNzCi1sb25nKQotCi1wdWJsaWMgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uUGxhdGZvcm1BZGRyZXNzIG9mZnNldEJ5dGVzKAotaW50KQotCi1wdWJsaWMgZmluYWwgdm9pZCBzZXRBZGRyZXNzKAotaW50Ci1vcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5QbGF0Zm9ybUFkZHJlc3MpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHNldEJ5dGUoCi1pbnQKLWJ5dGUpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHNldEJ5dGVBcnJheSgKLWludAotYnl0ZVtdCi1pbnQKLWludCkKLQotcHVibGljIGZpbmFsIHZvaWQgc2V0RG91YmxlKAotaW50Ci1kb3VibGUpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHNldERvdWJsZSgKLWludAotZG91YmxlCi1vcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5FbmRpYW5uZXNzKQotCi1wdWJsaWMgZmluYWwgdm9pZCBzZXRGbG9hdCgKLWludAotZmxvYXQpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHNldEZsb2F0KAotaW50Ci1mbG9hdAotb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uRW5kaWFubmVzcykKLQotcHVibGljIGZpbmFsIHZvaWQgc2V0SW50KAotaW50Ci1pbnQpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHNldEludCgKLWludAotaW50Ci1vcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5FbmRpYW5uZXNzKQotCi1wdWJsaWMgZmluYWwgdm9pZCBzZXRJbnRBcnJheSgKLWludAotaW50W10KLWludAotaW50Ci1ib29sZWFuKQotCi1wdWJsaWMgZmluYWwgdm9pZCBzZXRMb25nKAotaW50Ci1sb25nKQotCi1wdWJsaWMgZmluYWwgdm9pZCBzZXRMb25nKAotaW50Ci1sb25nCi1vcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5FbmRpYW5uZXNzKQotCi1wdWJsaWMgZmluYWwgdm9pZCBzZXRTaG9ydCgKLWludAotc2hvcnQpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHNldFNob3J0KAotaW50Ci1zaG9ydAotb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uRW5kaWFubmVzcykKLQotcHVibGljIGZpbmFsIHZvaWQgc2V0U2hvcnRBcnJheSgKLWludAotc2hvcnRbXQotaW50Ci1pbnQKLWJvb2xlYW4pCi0KLXB1YmxpYyBmaW5hbCBpbnQgdG9JbnQoKQotCi1wdWJsaWMgZmluYWwgbG9uZyB0b0xvbmcoKQotCi1wdWJsaWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uTWFwcGVkUGxhdGZvcm1BZGRyZXNzIGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uUGxhdGZvcm1BZGRyZXNzCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotaW50Ci1sb25nKQotCi1wdWJsaWMgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uUGxhdGZvcm1BZGRyZXNzIGR1cGxpY2F0ZSgpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIGZyZWUoKQotCi1wdWJsaWMgZmluYWwgdm9pZCBtbWFwRmx1c2goKQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBtbWFwSXNMb2FkZWQoKQotCi1wdWJsaWMgZmluYWwgdm9pZCBtbWFwTG9hZCgpCi0KLXB1YmxpYyBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5QbGF0Zm9ybUFkZHJlc3Mgb2Zmc2V0Qnl0ZXMoCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi0gY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uT1NDb21wb25lbnQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uSUFkYXB0YWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldEFkYXB0ZXIoCi1qYXZhLmxhbmcuQ2xhc3MpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi0gY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uT1NDb21wb25lbnRGYWN0b3J5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uSUZpbGVTeXN0ZW0gZ2V0RmlsZVN5c3RlbSgpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uSU1lbW9yeVN5c3RlbSBnZXRNZW1vcnlTeXN0ZW0oKQotCi1wdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLklOZXR3b3JrU3lzdGVtIGdldE5ldHdvcmtTeXN0ZW0oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLk9TRmlsZVN5c3RlbSBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLk9TQ29tcG9uZW50IGltcGxlbWVudHMgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uSUZpbGVTeXN0ZW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIG5hdGl2ZSBpbnQgY2xvc2VJbXBsKAotaW50KQotCi1wcml2YXRlIG5hdGl2ZSBpbnQgZmZsdXNoSW1wbCgKLWludAotYm9vbGVhbikKLQotcHJpdmF0ZSBuYXRpdmUgaW50IGxvY2tJbXBsKAotaW50Ci1sb25nCi1sb25nCi1pbnQKLWJvb2xlYW4pCi0KLXByaXZhdGUgbmF0aXZlIGludCBvcGVuSW1wbCgKLWJ5dGVbXQotaW50KQotCi1wcml2YXRlIG5hdGl2ZSBsb25nIHJlYWREaXJlY3RJbXBsKAotaW50Ci1pbnQKLWludAotaW50KQotCi1wcml2YXRlIG5hdGl2ZSBsb25nIHJlYWRJbXBsKAotaW50Ci1ieXRlW10KLWludAotaW50KQotCi1wcml2YXRlIG5hdGl2ZSBsb25nIHJlYWR2SW1wbCgKLWludAotaW50W10KLWludFtdCi1pbnRbXQotaW50KQotCi1wcml2YXRlIG5hdGl2ZSBsb25nIHNlZWtJbXBsKAotaW50Ci1sb25nCi1pbnQpCi0KLXByaXZhdGUgbmF0aXZlIGxvbmcgdHJhbnNmZXJJbXBsKAotaW50Ci1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1sb25nCi1sb25nKQotCi1wcml2YXRlIG5hdGl2ZSBpbnQgdHJ1bmNhdGVJbXBsKAotaW50Ci1sb25nKQotCi1wcml2YXRlIG5hdGl2ZSBsb25nIHR0eVJlYWRJbXBsKAotYnl0ZVtdCi1pbnQKLWludCkKLQotcHJpdmF0ZSBuYXRpdmUgaW50IHVubG9ja0ltcGwoCi1pbnQKLWxvbmcKLWxvbmcpCi0KLXByaXZhdGUgZmluYWwgdm9pZCB2YWxpZGF0ZUxvY2tBcmdzKAotaW50Ci1sb25nCi1sb25nKQotCi1wcml2YXRlIG5hdGl2ZSBsb25nIHdyaXRlRGlyZWN0SW1wbCgKLWludAotaW50Ci1pbnQKLWludCkKLQotcHJpdmF0ZSBuYXRpdmUgbG9uZyB3cml0ZUltcGwoCi1pbnQKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLXByaXZhdGUgbmF0aXZlIGxvbmcgd3JpdGV2SW1wbCgKLWludAotaW50W10KLWludFtdCi1pbnRbXQotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjbG9zZSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgZmZsdXNoKAotaW50Ci1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgbmF0aXZlIGludCBnZXRBbGxvY0dyYW51bGFyaXR5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIG5hdGl2ZSBpbnQgaW9jdGxBdmFpbGFibGUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIGxvY2soCi1pbnQKLWxvbmcKLWxvbmcKLWludAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9GaWxlTm90Rm91bmRFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgb3BlbigKLWJ5dGVbXQotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgbG9uZyByZWFkKAotaW50Ci1ieXRlW10KLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgbG9uZyByZWFkRGlyZWN0KAotaW50Ci1pbnQKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgbG9uZyByZWFkdigKLWludAotaW50W10KLWludFtdCi1pbnRbXQotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgbG9uZyBzZWVrKAotaW50Ci1sb25nCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBsb25nIHRyYW5zZmVyKAotaW50Ci1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1sb25nCi1sb25nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB0cnVuY2F0ZSgKLWludAotbG9uZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGxvbmcgdHR5UmVhZCgKLWJ5dGVbXQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHVubG9jaygKLWludAotbG9uZwotbG9uZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGxvbmcgd3JpdGUoCi1pbnQKLWJ5dGVbXQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBsb25nIHdyaXRlRGlyZWN0KAotaW50Ci1pbnQKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgbG9uZyB3cml0ZXYoCi1pbnQKLWludFtdCi1pbnRbXQotaW50W10KLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLWZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLk9TTWVtb3J5IGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uT1NDb21wb25lbnQgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5JTWVtb3J5U3lzdGVtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uRW5kaWFubmVzcyBOQVRJVkVfT1JERVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUE9JTlRFUl9TSVpFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLk9TTWVtb3J5IHNpbmdsZXRvbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSBuYXRpdmUgaW50IGZsdXNoSW1wbCgKLWludAotbG9uZykKLQotcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5PU01lbW9yeSBnZXRPU01lbW9yeSgpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgZ2V0UG9pbnRlclNpemVJbXBsKCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gaXNMaXR0bGVFbmRpYW5JbXBsKCkKLQotcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBpc0xvYWRlZEltcGwoCi1pbnQKLWxvbmcpCi0KLXByaXZhdGUgbmF0aXZlIGludCBsb2FkSW1wbCgKLWludAotbG9uZykKLQotcHJpdmF0ZSBuYXRpdmUgaW50IG1tYXBJbXBsKAotaW50Ci1sb25nCi1sb25nCi1pbnQpCi0KLXByaXZhdGUgaW50IHN3YXAoCi1pbnQpCi0KLXByaXZhdGUgbG9uZyBzd2FwKAotbG9uZykKLQotcHJpdmF0ZSBzaG9ydCBzd2FwKAotc2hvcnQpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgdW5tYXBJbXBsKAotaW50Ci1sb25nKQotCi1wdWJsaWMgdm9pZCBmbHVzaCgKLWludAotbG9uZykKLQotcHVibGljIG5hdGl2ZSB2b2lkIGZyZWUoCi1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgaW50IGdldEFkZHJlc3MoCi1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgYnl0ZSBnZXRCeXRlKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvTnVsbFBvaW50ZXJFeGNlcHRpb247TGphdmEvbGFuZy9JbmRleE91dE9mQm91bmRzRXhjZXB0aW9uOyApCi1wdWJsaWMgbmF0aXZlIHZvaWQgZ2V0Qnl0ZUFycmF5KAotaW50Ci1ieXRlW10KLWludAotaW50KQotCi1wdWJsaWMgbmF0aXZlIGRvdWJsZSBnZXREb3VibGUoCi1pbnQpCi0KLXB1YmxpYyBkb3VibGUgZ2V0RG91YmxlKAotaW50Ci1vcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5FbmRpYW5uZXNzKQotCi1wdWJsaWMgbmF0aXZlIGZsb2F0IGdldEZsb2F0KAotaW50KQotCi1wdWJsaWMgZmxvYXQgZ2V0RmxvYXQoCi1pbnQKLW9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLkVuZGlhbm5lc3MpCi0KLXB1YmxpYyBuYXRpdmUgaW50IGdldEludCgKLWludCkKLQotcHVibGljIGludCBnZXRJbnQoCi1pbnQKLW9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLkVuZGlhbm5lc3MpCi0KLXB1YmxpYyBuYXRpdmUgbG9uZyBnZXRMb25nKAotaW50KQotCi1wdWJsaWMgbG9uZyBnZXRMb25nKAotaW50Ci1vcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5FbmRpYW5uZXNzKQotCi1wdWJsaWMgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uRW5kaWFubmVzcyBnZXROYXRpdmVPcmRlcigpCi0KLXB1YmxpYyBpbnQgZ2V0UG9pbnRlclNpemUoKQotCi1wdWJsaWMgbmF0aXZlIHNob3J0IGdldFNob3J0KAotaW50KQotCi1wdWJsaWMgc2hvcnQgZ2V0U2hvcnQoCi1pbnQKLW9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLkVuZGlhbm5lc3MpCi0KLXB1YmxpYyBib29sZWFuIGlzTGl0dGxlRW5kaWFuKCkKLQotcHVibGljIGJvb2xlYW4gaXNMb2FkZWQoCi1pbnQKLWxvbmcpCi0KLXB1YmxpYyB2b2lkIGxvYWQoCi1pbnQKLWxvbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9PdXRPZk1lbW9yeUVycm9yOyApCi1wdWJsaWMgbmF0aXZlIGludCBtYWxsb2MoCi1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBtZW1tb3ZlKAotaW50Ci1pbnQKLWxvbmcpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBtZW1zZXQoCi1pbnQKLWJ5dGUKLWxvbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgbW1hcCgKLWludAotbG9uZwotbG9uZwotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgc2V0QWRkcmVzcygKLWludAotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgc2V0Qnl0ZSgKLWludAotYnl0ZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL051bGxQb2ludGVyRXhjZXB0aW9uO0xqYXZhL2xhbmcvSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbjsgKQotcHVibGljIG5hdGl2ZSB2b2lkIHNldEJ5dGVBcnJheSgKLWludAotYnl0ZVtdCi1pbnQKLWludCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIHNldERvdWJsZSgKLWludAotZG91YmxlKQotCi1wdWJsaWMgdm9pZCBzZXREb3VibGUoCi1pbnQKLWRvdWJsZQotb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uRW5kaWFubmVzcykKLQotcHVibGljIG5hdGl2ZSB2b2lkIHNldEZsb2F0KAotaW50Ci1mbG9hdCkKLQotcHVibGljIHZvaWQgc2V0RmxvYXQoCi1pbnQKLWZsb2F0Ci1vcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5FbmRpYW5uZXNzKQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgc2V0SW50KAotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldEludCgKLWludAotaW50Ci1vcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5FbmRpYW5uZXNzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvTnVsbFBvaW50ZXJFeGNlcHRpb247TGphdmEvbGFuZy9JbmRleE91dE9mQm91bmRzRXhjZXB0aW9uOyApCi1wdWJsaWMgbmF0aXZlIHZvaWQgc2V0SW50QXJyYXkoCi1pbnQKLWludFtdCi1pbnQKLWludAotYm9vbGVhbikKLQotcHVibGljIG5hdGl2ZSB2b2lkIHNldExvbmcoCi1pbnQKLWxvbmcpCi0KLXB1YmxpYyB2b2lkIHNldExvbmcoCi1pbnQKLWxvbmcKLW9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLkVuZGlhbm5lc3MpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBzZXRTaG9ydCgKLWludAotc2hvcnQpCi0KLXB1YmxpYyB2b2lkIHNldFNob3J0KAotaW50Ci1zaG9ydAotb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uRW5kaWFubmVzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL051bGxQb2ludGVyRXhjZXB0aW9uO0xqYXZhL2xhbmcvSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbjsgKQotcHVibGljIG5hdGl2ZSB2b2lkIHNldFNob3J0QXJyYXkoCi1pbnQKLXNob3J0W10KLWludAotaW50Ci1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCB1bm1hcCgKLWludAotbG9uZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLWZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLk9TTmV0d29ya1N5c3RlbSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5JTmV0d29ya1N5c3RlbQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JDT0RFX1NPQ0tFVF9USU1FT1VUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTkVUQUREUl9SRUFDSEFCTEUKLQotcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc05ldHdvcmtJbml0ZWQKLQotcHJpdmF0ZSBzdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uT1NOZXR3b3JrU3lzdGVtIHJlZgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXN0YXRpYyBuYXRpdmUgdm9pZCBhY2NlcHRTb2NrZXRJbXBsKAotamF2YS5pby5GaWxlRGVzY3JpcHRvcgotamF2YS5uZXQuU29ja2V0SW1wbAotamF2YS5pby5GaWxlRGVzY3JpcHRvcgotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXN0YXRpYyBuYXRpdmUgaW50IGF2YWlsYWJsZVN0cmVhbUltcGwoCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXN0YXRpYyBuYXRpdmUgdm9pZCBjb25uZWN0RGF0YWdyYW1JbXBsMigKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IKLWludAotaW50Ci1qYXZhLm5ldC5JbmV0QWRkcmVzcykKLQotc3RhdGljIG5hdGl2ZSBpbnQgY29ubmVjdFNvY2tldEltcGwoCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1pbnQKLWphdmEubmV0LkluZXRBZGRyZXNzCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXN0YXRpYyBuYXRpdmUgdm9pZCBjb25uZWN0U3RyZWFtV2l0aFRpbWVvdXRTb2NrZXRJbXBsKAotamF2YS5pby5GaWxlRGVzY3JpcHRvcgotaW50Ci1pbnQKLWludAotamF2YS5uZXQuSW5ldEFkZHJlc3MpCi0KLXN0YXRpYyBuYXRpdmUgaW50IGNvbm5lY3RXaXRoVGltZW91dFNvY2tldEltcGwoCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1pbnQKLWludAotamF2YS5uZXQuSW5ldEFkZHJlc3MKLWludAotaW50Ci1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1NvY2tldEV4Y2VwdGlvbjsgKQotc3RhdGljIG5hdGl2ZSB2b2lkIGNyZWF0ZURhdGFncmFtU29ja2V0SW1wbCgKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1NvY2tldEV4Y2VwdGlvbjsgKQotc3RhdGljIG5hdGl2ZSB2b2lkIGNyZWF0ZU11bHRpY2FzdFNvY2tldEltcGwoCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXN0YXRpYyBuYXRpdmUgdm9pZCBjcmVhdGVTZXJ2ZXJTdHJlYW1Tb2NrZXRJbXBsKAotamF2YS5pby5GaWxlRGVzY3JpcHRvcgotYm9vbGVhbikKLQotc3RhdGljIG5hdGl2ZSB2b2lkIGNyZWF0ZVNvY2tldEltcGwoCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXN0YXRpYyBuYXRpdmUgdm9pZCBkaXNjb25uZWN0RGF0YWdyYW1JbXBsKAotamF2YS5pby5GaWxlRGVzY3JpcHRvcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvVW5rbm93bkhvc3RFeGNlcHRpb247ICkKLXN0YXRpYyBuYXRpdmUgamF2YS5uZXQuSW5ldEFkZHJlc3MgZ2V0SG9zdEJ5QWRkckltcGwoCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1Vua25vd25Ib3N0RXhjZXB0aW9uOyApCi1zdGF0aWMgbmF0aXZlIGphdmEubmV0LkluZXRBZGRyZXNzIGdldEhvc3RCeU5hbWVJbXBsKAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5PU05ldHdvcmtTeXN0ZW0gZ2V0T1NOZXR3b3JrU3lzdGVtKCkKLQotc3RhdGljIG5hdGl2ZSBpbnQgZ2V0U29ja2V0RmxhZ3NJbXBsKCkKLQotc3RhdGljIG5hdGl2ZSBqYXZhLm5ldC5JbmV0QWRkcmVzcyBnZXRTb2NrZXRMb2NhbEFkZHJlc3NJbXBsKAotamF2YS5pby5GaWxlRGVzY3JpcHRvcgotYm9vbGVhbikKLQotc3RhdGljIG5hdGl2ZSBpbnQgZ2V0U29ja2V0TG9jYWxQb3J0SW1wbCgKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1NvY2tldEV4Y2VwdGlvbjsgKQotc3RhdGljIG5hdGl2ZSBqYXZhLmxhbmcuT2JqZWN0IGdldFNvY2tldE9wdGlvbkltcGwoCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1NvY2tldEV4Y2VwdGlvbjsgKQotc3RhdGljIG5hdGl2ZSB2b2lkIGxpc3RlblN0cmVhbVNvY2tldEltcGwoCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXN0YXRpYyBuYXRpdmUgaW50IHBlZWtEYXRhZ3JhbUltcGwoCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1qYXZhLm5ldC5JbmV0QWRkcmVzcwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1zdGF0aWMgbmF0aXZlIGludCByZWFkU29ja2V0RGlyZWN0SW1wbCgKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IKLWludAotaW50Ci1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotc3RhdGljIG5hdGl2ZSBpbnQgcmVhZFNvY2tldEltcGwoCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1ieXRlW10KLWludAotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXN0YXRpYyBuYXRpdmUgaW50IHJlY2VpdmVEYXRhZ3JhbURpcmVjdEltcGwoCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1qYXZhLm5ldC5EYXRhZ3JhbVBhY2tldAotaW50Ci1pbnQKLWludAotaW50Ci1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1zdGF0aWMgbmF0aXZlIGludCByZWNlaXZlRGF0YWdyYW1JbXBsKAotamF2YS5pby5GaWxlRGVzY3JpcHRvcgotamF2YS5uZXQuRGF0YWdyYW1QYWNrZXQKLWJ5dGVbXQotaW50Ci1pbnQKLWludAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotc3RhdGljIG5hdGl2ZSBpbnQgcmVjZWl2ZVN0cmVhbUltcGwoCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1ieXRlW10KLWludAotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXN0YXRpYyBuYXRpdmUgaW50IHJlY3ZDb25uZWN0ZWREYXRhZ3JhbURpcmVjdEltcGwoCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1qYXZhLm5ldC5EYXRhZ3JhbVBhY2tldAotaW50Ci1pbnQKLWludAotaW50Ci1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1zdGF0aWMgbmF0aXZlIGludCByZWN2Q29ubmVjdGVkRGF0YWdyYW1JbXBsKAotamF2YS5pby5GaWxlRGVzY3JpcHRvcgotamF2YS5uZXQuRGF0YWdyYW1QYWNrZXQKLWJ5dGVbXQotaW50Ci1pbnQKLWludAotYm9vbGVhbikKLQotc3RhdGljIG5hdGl2ZSBpbnQgc2VsZWN0SW1wbCgKLWphdmEuaW8uRmlsZURlc2NyaXB0b3JbXQotamF2YS5pby5GaWxlRGVzY3JpcHRvcltdCi1pbnQKLWludAotaW50W10KLWxvbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXN0YXRpYyBuYXRpdmUgaW50IHNlbmRDb25uZWN0ZWREYXRhZ3JhbURpcmVjdEltcGwoCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1pbnQKLWludAotaW50Ci1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1zdGF0aWMgbmF0aXZlIGludCBzZW5kQ29ubmVjdGVkRGF0YWdyYW1JbXBsKAotamF2YS5pby5GaWxlRGVzY3JpcHRvcgotYnl0ZVtdCi1pbnQKLWludAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotc3RhdGljIG5hdGl2ZSBpbnQgc2VuZERhdGFncmFtRGlyZWN0SW1wbCgKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IKLWludAotaW50Ci1pbnQKLWludAotYm9vbGVhbgotaW50Ci1qYXZhLm5ldC5JbmV0QWRkcmVzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotc3RhdGljIG5hdGl2ZSBpbnQgc2VuZERhdGFncmFtSW1wbCgKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IKLWJ5dGVbXQotaW50Ci1pbnQKLWludAotYm9vbGVhbgotaW50Ci1qYXZhLm5ldC5JbmV0QWRkcmVzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotc3RhdGljIG5hdGl2ZSBpbnQgc2VuZERhdGFncmFtSW1wbDIoCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1ieXRlW10KLWludAotaW50Ci1pbnQKLWphdmEubmV0LkluZXRBZGRyZXNzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1zdGF0aWMgbmF0aXZlIGludCBzZW5kU3RyZWFtSW1wbCgKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLXN0YXRpYyBuYXRpdmUgdm9pZCBzZW5kVXJnZW50RGF0YUltcGwoCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1ieXRlKQotCi1zdGF0aWMgbmF0aXZlIHZvaWQgc2V0Tm9uQmxvY2tpbmdJbXBsKAotamF2YS5pby5GaWxlRGVzY3JpcHRvcgotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvU29ja2V0RXhjZXB0aW9uOyApCi1zdGF0aWMgbmF0aXZlIHZvaWQgc2V0U29ja2V0T3B0aW9uSW1wbCgKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IKLWludAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBzaHV0ZG93bklucHV0SW1wbCgKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgbmF0aXZlIHZvaWQgc2h1dGRvd25PdXRwdXRJbXBsKAotamF2YS5pby5GaWxlRGVzY3JpcHRvcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvU29ja2V0RXhjZXB0aW9uOyApCi1zdGF0aWMgbmF0aXZlIHZvaWQgc29ja2V0QmluZEltcGwoCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1pbnQKLWphdmEubmV0LkluZXRBZGRyZXNzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXN0YXRpYyBuYXRpdmUgYm9vbGVhbiBzb2NrZXRCaW5kSW1wbDIoCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1pbnQKLWJvb2xlYW4KLWphdmEubmV0LkluZXRBZGRyZXNzKQotCi1zdGF0aWMgbmF0aXZlIHZvaWQgc29ja2V0Q2xvc2VJbXBsKAotamF2YS5pby5GaWxlRGVzY3JpcHRvcikKLQotc3RhdGljIG5hdGl2ZSBib29sZWFuIHN1cHBvcnRzVXJnZW50RGF0YUltcGwoCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1zdGF0aWMgbmF0aXZlIGludCB3cml0ZVNvY2tldERpcmVjdEltcGwoCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1pbnQKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1zdGF0aWMgbmF0aXZlIGludCB3cml0ZVNvY2tldEltcGwoCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1ieXRlW10KLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBhY2NlcHQoCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1qYXZhLm5ldC5Tb2NrZXRJbXBsCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1NvY2tldEV4Y2VwdGlvbjsgKQotcHVibGljIGludCBhdmFpbGFibGVTdHJlYW0oCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGJpbmQoCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1pbnQKLWphdmEubmV0LkluZXRBZGRyZXNzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIGJpbmQyKAotamF2YS5pby5GaWxlRGVzY3JpcHRvcgotaW50Ci1ib29sZWFuCi1qYXZhLm5ldC5JbmV0QWRkcmVzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCBjb25uZWN0KAotamF2YS5pby5GaWxlRGVzY3JpcHRvcgotaW50Ci1qYXZhLm5ldC5JbmV0QWRkcmVzcwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNvbm5lY3REYXRhZ3JhbSgKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IKLWludAotaW50Ci1qYXZhLm5ldC5JbmV0QWRkcmVzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY29ubmVjdFN0cmVhbVdpdGhUaW1lb3V0U29ja2V0KAotamF2YS5pby5GaWxlRGVzY3JpcHRvcgotaW50Ci1pbnQKLWludAotamF2YS5uZXQuSW5ldEFkZHJlc3MpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgY29ubmVjdFdpdGhUaW1lb3V0KAotamF2YS5pby5GaWxlRGVzY3JpcHRvcgotaW50Ci1pbnQKLWphdmEubmV0LkluZXRBZGRyZXNzCi1pbnQKLWludAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNyZWF0ZURhdGFncmFtU29ja2V0KAotamF2YS5pby5GaWxlRGVzY3JpcHRvcgotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvU29ja2V0RXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjcmVhdGVNdWx0aWNhc3RTb2NrZXQoCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNyZWF0ZVNlcnZlclN0cmVhbVNvY2tldCgKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNyZWF0ZVNvY2tldCgKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1NvY2tldEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgZGlzY29ubmVjdERhdGFncmFtKAotamF2YS5pby5GaWxlRGVzY3JpcHRvcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvVW5rbm93bkhvc3RFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLm5ldC5JbmV0QWRkcmVzcyBnZXRIb3N0QnlBZGRyKAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Vbmtub3duSG9zdEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubmV0LkluZXRBZGRyZXNzIGdldEhvc3RCeU5hbWUoCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuKQotCi1wdWJsaWMgaW50IGdldFNvY2tldEZsYWdzKCkKLQotcHVibGljIGphdmEubmV0LkluZXRBZGRyZXNzIGdldFNvY2tldExvY2FsQWRkcmVzcygKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IKLWJvb2xlYW4pCi0KLXB1YmxpYyBpbnQgZ2V0U29ja2V0TG9jYWxQb3J0KAotamF2YS5pby5GaWxlRGVzY3JpcHRvcgotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvU29ja2V0RXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRTb2NrZXRPcHRpb24oCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1pbnQpCi0KLXB1YmxpYyBqYXZhLm5pby5jaGFubmVscy5DaGFubmVsIGluaGVyaXRlZENoYW5uZWwoKQotCi1uYXRpdmUgamF2YS5uaW8uY2hhbm5lbHMuQ2hhbm5lbCBpbmhlcml0ZWRDaGFubmVsSW1wbCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1NvY2tldEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgbGlzdGVuU3RyZWFtU29ja2V0KAotamF2YS5pby5GaWxlRGVzY3JpcHRvcgotaW50KQotCi1wdWJsaWMgdm9pZCBvbmVUaW1lSW5pdGlhbGl6YXRpb24oCi1ib29sZWFuKQotCi1uYXRpdmUgdm9pZCBvbmVUaW1lSW5pdGlhbGl6YXRpb25JbXBsKAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCBwZWVrRGF0YWdyYW0oCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1qYXZhLm5ldC5JbmV0QWRkcmVzcwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1ieXRlW10KLWludAotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcmVhZERpcmVjdCgKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IKLWludAotaW50Ci1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCByZWNlaXZlRGF0YWdyYW0oCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1qYXZhLm5ldC5EYXRhZ3JhbVBhY2tldAotYnl0ZVtdCi1pbnQKLWludAotaW50Ci1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlY2VpdmVEYXRhZ3JhbURpcmVjdCgKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IKLWphdmEubmV0LkRhdGFncmFtUGFja2V0Ci1pbnQKLWludAotaW50Ci1pbnQKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcmVjZWl2ZVN0cmVhbSgKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IKLWJ5dGVbXQotaW50Ci1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCByZWN2Q29ubmVjdGVkRGF0YWdyYW0oCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1qYXZhLm5ldC5EYXRhZ3JhbVBhY2tldAotYnl0ZVtdCi1pbnQKLWludAotaW50Ci1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlY3ZDb25uZWN0ZWREYXRhZ3JhbURpcmVjdCgKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IKLWphdmEubmV0LkRhdGFncmFtUGFja2V0Ci1pbnQKLWludAotaW50Ci1pbnQKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1NvY2tldEV4Y2VwdGlvbjsgKQotcHVibGljIGludFtdIHNlbGVjdCgKLWphdmEuaW8uRmlsZURlc2NyaXB0b3JbXQotamF2YS5pby5GaWxlRGVzY3JpcHRvcltdCi1sb25nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHNlbmRDb25uZWN0ZWREYXRhZ3JhbSgKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IKLWJ5dGVbXQotaW50Ci1pbnQKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgc2VuZENvbm5lY3RlZERhdGFncmFtRGlyZWN0KAotamF2YS5pby5GaWxlRGVzY3JpcHRvcgotaW50Ci1pbnQKLWludAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCBzZW5kRGF0YWdyYW0oCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1ieXRlW10KLWludAotaW50Ci1pbnQKLWJvb2xlYW4KLWludAotamF2YS5uZXQuSW5ldEFkZHJlc3MpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgc2VuZERhdGFncmFtMigKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IKLWJ5dGVbXQotaW50Ci1pbnQKLWludAotamF2YS5uZXQuSW5ldEFkZHJlc3MpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgc2VuZERhdGFncmFtRGlyZWN0KAotamF2YS5pby5GaWxlRGVzY3JpcHRvcgotaW50Ci1pbnQKLWludAotaW50Ci1ib29sZWFuCi1pbnQKLWphdmEubmV0LkluZXRBZGRyZXNzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHNlbmRTdHJlYW0oCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1ieXRlW10KLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBzZW5kVXJnZW50RGF0YSgKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IKLWJ5dGUpCi0KLXB1YmxpYyB2b2lkIHNldEluZXRBZGRyZXNzKAotamF2YS5uZXQuSW5ldEFkZHJlc3MKLWJ5dGVbXSkKLQotbmF0aXZlIHZvaWQgc2V0SW5ldEFkZHJlc3NJbXBsKAotamF2YS5uZXQuSW5ldEFkZHJlc3MKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0Tm9uQmxvY2tpbmcoCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldFNvY2tldE9wdGlvbigKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IKLWludAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2h1dGRvd25JbnB1dCgKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNodXRkb3duT3V0cHV0KAotamF2YS5pby5GaWxlRGVzY3JpcHRvcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc29ja2V0Q2xvc2UoCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yKQotCi1wdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1VyZ2VudERhdGEoCi1qYXZhLmlvLkZpbGVEZXNjcmlwdG9yKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHdyaXRlKAotamF2YS5pby5GaWxlRGVzY3JpcHRvcgotYnl0ZVtdCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCB3cml0ZURpcmVjdCgKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IKLWludAotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uUGxhdGZvcm0gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5JQWRhcHRlck1hbmFnZXIgQURBUFRFUl9NQU5BR0VSCi0KLXN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5JRmlsZVN5c3RlbSBGSUxFX1NZU1RFTQotCi1zdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uSU1lbW9yeVN5c3RlbSBNRU1PUllfU1lTVEVNCi0KLXN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5JTmV0d29ya1N5c3RlbSBORVRXT1JLX1NZU1RFTQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgdm9pZCBhY2Nlc3NDaGVjaygpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uSUFkYXB0ZXJNYW5hZ2VyIGdldEFkYXB0ZXJNYW5hZ2VyKCkKLQotcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5JRmlsZVN5c3RlbSBnZXRGaWxlU3lzdGVtKCkKLQotcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5JTWVtb3J5U3lzdGVtIGdldE1lbW9yeVN5c3RlbSgpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uSU5ldHdvcmtTeXN0ZW0gZ2V0TmV0d29ya1N5c3RlbSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uUGxhdGZvcm1BZGRyZXNzRmFjdG9yeSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLlBsYXRmb3JtQWRkcmVzcyBhbGxvYygKLWludCkKLQotcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5QbGF0Zm9ybUFkZHJlc3MgYWxsb2MoCi1pbnQKLWJ5dGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uUGxhdGZvcm1BZGRyZXNzIGFsbG9jTWFwKAotaW50Ci1sb25nCi1sb25nCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uTWFwcGVkUGxhdGZvcm1BZGRyZXNzIG1hcE9uKAotaW50Ci1sb25nKQotCi1wdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLlBsYXRmb3JtQWRkcmVzcyBvbigKLWludCkKLQotcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5QbGF0Zm9ybUFkZHJlc3Mgb24oCi1pbnQKLWxvbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1maW5hbCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5SdW50aW1lTWVtb3J5U3B5IGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uQWJzdHJhY3RNZW1vcnlTcHkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCBhbGxvYygKLW9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLlBsYXRmb3JtQWRkcmVzcykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLkJhc2U2NCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIG1hcAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBieXRlW10gZGVjb2RlKAotYnl0ZVtdKQotCi1wdWJsaWMgc3RhdGljIGJ5dGVbXSBkZWNvZGUoCi1ieXRlW10KLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZW5jb2RlKAotYnl0ZVtdCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuQmluYXJ5U2VhcmNoIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgaW50IGJpbmFyeVNlYXJjaCgKLWphdmEubGFuZy5TdHJpbmcKLWNoYXIpCi0KLXB1YmxpYyBzdGF0aWMgaW50IGJpbmFyeVNlYXJjaFJhbmdlKAotamF2YS5sYW5nLlN0cmluZwotY2hhcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvdXRpbC9Db21wYXJhdG9yPExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLWZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuRGVsZXRlT25FeGl0JDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLkNvbXBhcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9sYXRpbGUgaW50IGNvbXBhcmUoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50IGNvbXBhcmUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuRGVsZXRlT25FeGl0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvVmVjdG9yPExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXByaXZhdGUgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgZGVsZXRlTGlzdAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyB2b2lkIGFkZEZpbGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlT25FeGl0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLkVycm9yQ29kZUV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5FeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0KLXByaXZhdGUgaW50IGVycm9yQ29kZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludCkKLQotcHVibGljIGludCBnZXRFcnJvckNvZGUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS91dGlsL0Zsb2F0aW5nUG9pbnRQYXJzZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MjYgbmFtZSA9U3RyaW5nRXhwb25lbnRQYWlyICkKLWZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuRmxvYXRpbmdQb2ludFBhcnNlciRTdHJpbmdFeHBvbmVudFBhaXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBpbnQgZQotCi0gYm9vbGVhbiBuZWdhdGl2ZQotCi0gamF2YS5sYW5nLlN0cmluZyBzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1ib29sZWFuKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3V0aWwvRmxvYXRpbmdQb2ludFBhcnNlciRTdHJpbmdFeHBvbmVudFBhaXI7ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLkZsb2F0aW5nUG9pbnRQYXJzZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSBzdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5GbG9hdGluZ1BvaW50UGFyc2VyJFN0cmluZ0V4cG9uZW50UGFpciBpbml0aWFsUGFyc2UoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBkb3VibGUgcGFyc2VEYmxJbXBsKAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wcml2YXRlIHN0YXRpYyBkb3VibGUgcGFyc2VEYmxOYW1lKAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgc3RhdGljIGRvdWJsZSBwYXJzZURvdWJsZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgZmxvYXQgcGFyc2VGbG9hdCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBmbG9hdCBwYXJzZUZsdEltcGwoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIGZsb2F0IHBhcnNlRmx0TmFtZSgKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLWZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuSGV4U3RyaW5nUGFyc2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEJJTkFSWV9FWFBPTkVOVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRE9VQkxFX0VYUE9ORU5UX1dJRFRICi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBET1VCTEVfTUFOVElTU0FfV0lEVEgKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMT0FUX0VYUE9ORU5UX1dJRFRICi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTE9BVF9NQU5USVNTQV9XSURUSAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEZMT0FUX1RZUEVfU1VGRklYCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSEVYX1BBVFRFUk4KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhFWF9SQURJWAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEhFWF9TSUdOSUZJQ0FOVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1NJR05JRklDQU5UX0xFTkdUSAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwucmVnZXguUGF0dGVybiBQQVRURVJOCi0KLXByaXZhdGUgZmluYWwgbG9uZyBFWFBPTkVOVF9CQVNFCi0KLXByaXZhdGUgZmluYWwgaW50IEVYUE9ORU5UX1dJRFRICi0KLXByaXZhdGUgZmluYWwgbG9uZyBNQU5USVNTQV9NQVNLCi0KLXByaXZhdGUgZmluYWwgaW50IE1BTlRJU1NBX1dJRFRICi0KLXByaXZhdGUgZmluYWwgbG9uZyBNQVhfRVhQT05FTlQKLQotcHJpdmF0ZSBmaW5hbCBsb25nIE1JTl9FWFBPTkVOVAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgYWJhbmRvbmVkTnVtYmVyCi0KLXByaXZhdGUgbG9uZyBleHBvbmVudAotCi1wcml2YXRlIGxvbmcgbWFudGlzc2EKLQotcHJpdmF0ZSBsb25nIHNpZ24KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotaW50KQotCi1wcml2YXRlIHZvaWQgY2hlY2tlZEFkZEV4cG9uZW50KAotbG9uZykKLQotcHJpdmF0ZSBpbnQgY291bnRCaXRzTGVuZ3RoKAotbG9uZykKLQotcHJpdmF0ZSB2b2lkIGRpc2NhcmRUcmFpbGluZ0JpdHMoCi1sb25nKQotCi1wcml2YXRlIHZvaWQgZml0TWFudGlzc2FJbkRlc2lyZWRXaWR0aCgKLWludCkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGdldE5vcm1hbGl6ZWRTaWduaWZpY2FuZCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgaW50IGdldE9mZnNldCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmdbXSBnZXRTZWdtZW50c0Zyb21IZXhTdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIGxvbmcgcGFyc2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGRvdWJsZSBwYXJzZURvdWJsZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgdm9pZCBwYXJzZUV4cG9uZW50KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBmbG9hdCBwYXJzZUZsb2F0KAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSB2b2lkIHBhcnNlSGV4U2lnbigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgdm9pZCBwYXJzZU1hbnRpc3NhKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSB2b2lkIHByb2Nlc3NOb3JtYWxOdW1iZXIoKQotCi1wcml2YXRlIHZvaWQgcHJvY2Vzc1N1Yk5vcm1hbE51bWJlcigpCi0KLXByaXZhdGUgdm9pZCByb3VuZCgpCi0KLXByaXZhdGUgdm9pZCBzZXRJbmZpbml0ZSgpCi0KLXByaXZhdGUgdm9pZCBzZXRaZXJvKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLkluZXQ2VXRpbCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGphdmEubGFuZy5TdHJpbmcgaGV4Q2hhcmFjdGVycwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGFkZHJlc3NUb1N0cmluZygKLWludCkKLQotcHVibGljIHN0YXRpYyBpbnQgYnl0ZXNUb0ludCgKLWJ5dGVbXQotaW50KQotCi1wdWJsaWMgc3RhdGljIHZvaWQgY29udmVydFRvQnl0ZXMoCi1qYXZhLmxhbmcuU3RyaW5nCi1ieXRlW10KLWludCkKLQotcHVibGljIHN0YXRpYyBieXRlW10gY3JlYXRlQnl0ZUFycmF5RnJvbUlQQWRkcmVzc1N0cmluZygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBjcmVhdGVJUEFkZHJTdHJpbmdGcm9tQnl0ZUFycmF5KAotYnl0ZVtdKQotCi1zdGF0aWMgaW50IGdldEludFZhbHVlKAotY2hhcikKLQotcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0lQdjRNYXBwZWRBZGRyZXNzKAotYnl0ZVtdKQotCi1zdGF0aWMgYm9vbGVhbiBpc1ZhbGlkSGV4Q2hhcigKLWNoYXIpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkSVA0V29yZCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkSVA2QWRkcmVzcygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkSVBWNEFkZHJlc3MoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuSW52YWxpZEphckluZGV4RXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLk1zZyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBzUmVzb3VyY2UKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygKLWphdmEubGFuZy5TdHJpbmcKLWNoYXIpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3RbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvc2VjdXJpdHkvUHJpdmlsZWdlZEFjdGlvbjxMamF2YS9sYW5nL09iamVjdDs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1maW5hbCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLk1zZ0hlbHAkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgamF2YS5sYW5nLkNsYXNzTG9hZGVyIHZhbCRsb2FkZXIKLQotZmluYWwgamF2YS51dGlsLkxvY2FsZSB2YWwkbG9jYWxlCi0KLWZpbmFsIGphdmEubGFuZy5TdHJpbmcgdmFsJHJlc291cmNlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotamF2YS51dGlsLkxvY2FsZQotamF2YS5sYW5nLkNsYXNzTG9hZGVyKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTXNnSGVscCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0hhc2hNYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9yZWYvU29mdFJlZmVyZW5jZTxMamF2YS91dGlsL1Jlc291cmNlQnVuZGxlOz47PjsgKQotcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLkhhc2hNYXAgc1JlZk1hcAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGZvcm1hdCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3RbXSkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0W10pCi0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlJlc291cmNlQnVuZGxlIGxvYWRCdW5kbGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZSBzZXRMb2NhbGUoCi1qYXZhLnV0aWwuTG9jYWxlCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTm90SW1wbGVtZW50ZWRFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmlvLlByaW50U3RyZWFtKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTnVtYmVyQ29udmVydGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gVEVOX1RPX1RIRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUgaW52TG9nT2ZUZW5CYXNlVHdvCi0KLXByaXZhdGUgaW50IGZpcnN0SwotCi1wcml2YXRlIGludCBnZXRDb3VudAotCi1wcml2YXRlIGludCBzZXRDb3VudAotCi1wcml2YXRlIGludFtdIHVBcnJheQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBiaWdJbnREaWdpdEdlbmVyYXRvckluc3RJbXBsKAotbG9uZwotaW50Ci1ib29sZWFuCi1ib29sZWFuCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBjb252ZXJ0KAotZG91YmxlKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgY29udmVydCgKLWZsb2F0KQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZnJlZUZvcm1hdCgpCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBmcmVlRm9ybWF0RXhwb25lbnRpYWwoKQotCi1wcml2YXRlIHN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLk51bWJlckNvbnZlcnRlciBnZXRDb252ZXJ0ZXIoKQotCi1wcml2YXRlIHZvaWQgbG9uZ0RpZ2l0R2VuZXJhdG9yKAotbG9uZwotaW50Ci1ib29sZWFuCi1ib29sZWFuCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGNvbnZlcnREKAotZG91YmxlKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBjb252ZXJ0RigKLWZsb2F0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1EQkVudHJ5ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS91dGlsL09JRERhdGFiYXNlOyApCi0gY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5PSUREYXRhYmFzZSREQkVudHJ5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvTGlzdDxMb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdXRpbC9PSUREYXRhYmFzZSREQkVudHJ5Oz47ICkKLXByaXZhdGUgZmluYWwgamF2YS51dGlsLkxpc3QgZXF1aXZhbGVudHMKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIHZhbHVlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotIHZvaWQgYWRkRXF1aXZhbGVudCgKLW9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuT0lERGF0YWJhc2UkREJFbnRyeSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvU2V0PExvcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS91dGlsL09JRERhdGFiYXNlJERCRW50cnk7PjsgKQotIGphdmEudXRpbC5TZXQgZ2V0QWxsRXF1aXZhbGVudHMoKQotCi0gamF2YS5sYW5nLlN0cmluZyBnZXRWYWx1ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdXRpbC9PSUREYXRhYmFzZSREQkVudHJ5OyApCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5PSUREYXRhYmFzZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5PSUREYXRhYmFzZSBpbnN0YW5jZQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvU2V0PExvcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS91dGlsL09JRERhdGFiYXNlJERCRW50cnk7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuU2V0IGFsZ29yaXRobXMKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL1NldDxMb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdXRpbC9PSUREYXRhYmFzZSREQkVudHJ5Oz47ICkKLXByaXZhdGUgamF2YS51dGlsLlNldCBvaWRzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvdXRpbC9JdGVyYXRvcjxMb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdXRpbC9PSUREYXRhYmFzZSREQkVudHJ5Oz47KUxqYXZhL3V0aWwvU2V0PExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXByaXZhdGUgamF2YS51dGlsLlNldCBnZXRBbGxFcXVpdmFsZW50cygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudXRpbC5JdGVyYXRvcikKLQotcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLk9JRERhdGFiYXNlIGdldEluc3RhbmNlKCkKLQotcHJpdmF0ZSB2b2lkIHdpcmVUb2dldGhlcigKLW9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuT0lERGF0YWJhc2UkREJFbnRyeQotb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5PSUREYXRhYmFzZSREQkVudHJ5KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvdXRpbC9TZXQ8TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHVibGljIGphdmEudXRpbC5TZXQgZ2V0QWxsQWxnb3JpdGhtc0Zvck9JRCgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS91dGlsL1NldDxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wdWJsaWMgamF2YS51dGlsLlNldCBnZXRBbGxPSURzRm9yQWxnb3JpdGhtKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Rmlyc3RBbGdvcml0aG1Gb3JPSUQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRGaXJzdE9JREZvckFsZ29yaXRobSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5QYXNzd29yZFByb3RlY3RlZElucHV0U3RyZWFtIGV4dGVuZHMgamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGJ5dGVbXSBwYXNzd29yZAotCi1wcml2YXRlIGludCBwd2RJbmRleAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uSW5wdXRTdHJlYW0KLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCByZWFkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCByZWFkKAotYnl0ZVtdCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGxvbmcgc2tpcCgKLWxvbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5Qb3NpdGlvbmVkSW5wdXRTdHJlYW0gZXh0ZW5kcyBqYXZhLmlvLkZpbHRlcklucHV0U3RyZWFtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgaW50IGN1cnJlbnRQb3NpdGlvbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uSW5wdXRTdHJlYW0pCi0KLXB1YmxpYyBpbnQgY3VycmVudFBvc2l0aW9uKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCByZWFkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCByZWFkKAotYnl0ZVtdCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgcmVzZXRDdXJyZW50UG9zaXRpb24oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgbG9uZyBza2lwKAotbG9uZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFQ6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3NlY3VyaXR5L1ByaXZpbGVnZWRBY3Rpb248VFQ7PjsgKQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuUHJpdmlBY3Rpb24gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHRVRfU0VDVVJJVFlfUE9MSUNZCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHRVRfU0VDVVJJVFlfUFJPUEVSVFkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdFVF9TWVNURU1fUFJPUEVSVFkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFVF9BQ0NFU1NJQkxFCi0KLXByaXZhdGUgaW50IGFjdGlvbgotCi1wcml2YXRlIGphdmEubGFuZy5PYmplY3QgYXJnMQotCi1wcml2YXRlIGphdmEubGFuZy5PYmplY3QgYXJnMgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5yZWZsZWN0LkFjY2Vzc2libGVPYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9zZWN1cml0eS9Qcml2aWxlZ2VkQWN0aW9uPExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXB1YmxpYyBzdGF0aWMgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uIGdldFNlY3VyaXR5UHJvcGVydHkoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpVFQ7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5TSEFPdXRwdXRTdHJlYW0gZXh0ZW5kcyBqYXZhLmlvLk91dHB1dFN0cmVhbSBpbXBsZW1lbnRzIGphdmEubGFuZy5DbG9uZWFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJsb2NrU2l6ZUluQnl0ZXMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEgwCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIMQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSDIKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEgzCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBINAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSENvbnN0YW50c1NpemUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhhc2hTaXplSW5CeXRlcwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSzBfMTkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEsyMF8zOQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSzQwXzU5Ci0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBLNjBfNzkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdBcnJheVNpemUKLQotcHJpdmF0ZSBpbnRbXSBIQ29uc3RhbnRzCi0KLXByaXZhdGUgYnl0ZVtdIE1BcnJheQotCi1wcml2YXRlIGludFtdIFdBcnJheQotCi1wcml2YXRlIGxvbmcgYnl0ZXNQcm9jZXNzZWQKLQotcHJpdmF0ZSBpbnQgYnl0ZXNUb1Byb2Nlc3MKLQotcHJpdmF0ZSBieXRlW10gb25lQnl0ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWJ5dGVbXSkKLQotcHJpdmF0ZSB2b2lkIGNvcHlUb0ludGVybmFsQnVmZmVyKAotYnl0ZVtdCi1pbnQKLWludCkKLQotcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKQotCi1wcml2YXRlIHZvaWQgcGFkQnVmZmVyKCkKLQotcHJpdmF0ZSB2b2lkIHByb2Nlc3NCdWZmZXIoKQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nQmxvY2soCi1ieXRlW10pCi0KLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmdCbG9jaygKLWJ5dGVbXQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9DbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgY2xvbmUoKQotCi1wdWJsaWMgaW50W10gZ2V0SGFzaCgpCi0KLXB1YmxpYyBieXRlW10gZ2V0SGFzaEFzQnl0ZXMoKQotCi1wdWJsaWMgYnl0ZVtdIGdldEhhc2hBc0J5dGVzKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgcmVzZXQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLXB1YmxpYyB2b2lkIHdyaXRlKAotaW50KQotCi1wdWJsaWMgdm9pZCB3cml0ZSgKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS9sYW5nL09iamVjdDtMamF2YS91dGlsL0NvbXBhcmF0b3I8VFQ7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPUNvbXBhcmF0b3IgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3V0aWwvU29ydGVyOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuU29ydGVyJENvbXBhcmF0b3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLkNvbXBhcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBqYXZhLmxhbmcuRGVwcmVjYXRlZAotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdXRpbC9Tb3J0ZXIkQ29tcGFyYXRvcjsgKQotcHVibGljIGZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuU29ydGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PFQ6TGphdmEvbGFuZy9PYmplY3Q7PihbVFQ7TG9yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3V0aWwvU29ydGVyJENvbXBhcmF0b3I8VFQ7PjspViApCi1wdWJsaWMgc3RhdGljIHZvaWQgc29ydCgKLWphdmEubGFuZy5PYmplY3RbXQotb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5Tb3J0ZXIkQ29tcGFyYXRvcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEU6TGphdmEvbGFuZy9PYmplY3Q7SzpMamF2YS9sYW5nL09iamVjdDtWOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS9sYW5nL09iamVjdDtMamF2YS91dGlsL01hcCRFbnRyeTxMamF2YS9sYW5nL1N0cmluZztUVjs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdXRpbC9Ud29LZXlIYXNoTWFwOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9RW50cnkgKQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuVHdvS2V5SGFzaE1hcCRFbnRyeSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuTWFwJEVudHJ5Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBpbnQgaGFzaAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPVRFOyApCi0gamF2YS5sYW5nLk9iamVjdCBrZXkxCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9VEs7ICkKLSBqYXZhLmxhbmcuT2JqZWN0IGtleTIKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdXRpbC9Ud29LZXlIYXNoTWFwJEVudHJ5PFRFO1RLO1RWOz47ICkKLSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLlR3b0tleUhhc2hNYXAkRW50cnkgbmV4dAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPVRWOyApCi0gamF2YS5sYW5nLk9iamVjdCB2YWx1ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KElURTtUSztUVjtMb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdXRpbC9Ud29LZXlIYXNoTWFwJEVudHJ5PFRFO1RLO1RWOz47KVYgKQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50Ci1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0Ci1vcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLlR3b0tleUhhc2hNYXAkRW50cnkpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IGdldEtleSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEtleSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClURTsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0S2V5MSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClUSzsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0S2V5MigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClUVjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0VmFsdWUoKQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVFY7KVRWOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBzZXRWYWx1ZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3V0aWwvVHdvS2V5SGFzaE1hcDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3V0aWwvSXRlcmF0b3I8TGphdmEvdXRpbC9NYXAkRW50cnk8TGphdmEvbGFuZy9TdHJpbmc7VFY7Pjs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9RW50cnlJdGVyYXRvckltcGwgKQotIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuVHdvS2V5SGFzaE1hcCRFbnRyeUl0ZXJhdG9ySW1wbCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuSXRlcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBpbnQgY3VycgotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS91dGlsL1R3b0tleUhhc2hNYXAkRW50cnk8VEU7VEs7VFY7PjsgKQotcHJpdmF0ZSBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLlR3b0tleUhhc2hNYXAkRW50cnkgY3Vycl9lbnRyeQotCi1wcml2YXRlIGJvb2xlYW4gZm91bmQKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdXRpbC9Ud29LZXlIYXNoTWFwJEVudHJ5PFRFO1RLO1RWOz47ICkKLXByaXZhdGUgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5Ud29LZXlIYXNoTWFwJEVudHJ5IHJldHVybmVkX2VudHJ5Ci0KLXByaXZhdGUgaW50IHJldHVybmVkX2luZGV4Ci0KLXByaXZhdGUgaW50IHN0YXJ0TW9kQ291bnQKLQotZmluYWwgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5Ud29LZXlIYXNoTWFwIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuVHdvS2V5SGFzaE1hcCkKLQotcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IG5leHQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9NYXAkRW50cnk8TGphdmEvbGFuZy9TdHJpbmc7VFY7PjsgKQotcHVibGljIGphdmEudXRpbC5NYXAkRW50cnkgbmV4dCgpCi0KLXB1YmxpYyB2b2lkIHJlbW92ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3V0aWwvVHdvS2V5SGFzaE1hcDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPUVudHJ5U2V0SW1wbCApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9BYnN0cmFjdFNldDxMamF2YS91dGlsL01hcCRFbnRyeTxMamF2YS9sYW5nL1N0cmluZztUVjs+Oz47ICkKLSBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLlR3b0tleUhhc2hNYXAkRW50cnlTZXRJbXBsIGV4dGVuZHMgamF2YS51dGlsLkFic3RyYWN0U2V0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuVHdvS2V5SGFzaE1hcCB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLlR3b0tleUhhc2hNYXApCi0KLXB1YmxpYyB2b2lkIGNsZWFyKCkKLQotcHVibGljIGJvb2xlYW4gY29udGFpbnMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvSXRlcmF0b3I8TGphdmEvdXRpbC9NYXAkRW50cnk8TGphdmEvbGFuZy9TdHJpbmc7VFY7Pjs+OyApCi1wdWJsaWMgamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXJhdG9yKCkKLQotcHVibGljIGJvb2xlYW4gcmVtb3ZlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGludCBzaXplKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvdXRpbC9JdGVyYXRvcjxUVjs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdXRpbC9Ud29LZXlIYXNoTWFwOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9VmFsdWVJdGVyYXRvckltcGwgKQotIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuVHdvS2V5SGFzaE1hcCRWYWx1ZUl0ZXJhdG9ySW1wbCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuSXRlcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdXRpbC9Ud29LZXlIYXNoTWFwPFRFO1RLO1RWOz4uRW50cnlJdGVyYXRvckltcGw7ICkKLXByaXZhdGUgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5Ud29LZXlIYXNoTWFwJEVudHJ5SXRlcmF0b3JJbXBsIGl0cgotCi1maW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLlR3b0tleUhhc2hNYXAgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5Ud29LZXlIYXNoTWFwKQotCi1wdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVRWOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBuZXh0KCkKLQotcHVibGljIHZvaWQgcmVtb3ZlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9BYnN0cmFjdENvbGxlY3Rpb248VFY7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPVZhbHVlc0NvbGxlY3Rpb25JbXBsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS91dGlsL1R3b0tleUhhc2hNYXA7ICkKLSBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLlR3b0tleUhhc2hNYXAkVmFsdWVzQ29sbGVjdGlvbkltcGwgZXh0ZW5kcyBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuVHdvS2V5SGFzaE1hcCB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLlR3b0tleUhhc2hNYXApCi0KLXB1YmxpYyB2b2lkIGNsZWFyKCkKLQotcHVibGljIGJvb2xlYW4gY29udGFpbnMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvSXRlcmF0b3I8VFY7PjsgKQotcHVibGljIGphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvcigpCi0KLXB1YmxpYyBpbnQgc2l6ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdXRpbC9Ud29LZXlIYXNoTWFwJFZhbHVlSXRlcmF0b3JJbXBsO0xvcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS91dGlsL1R3b0tleUhhc2hNYXAkVmFsdWVzQ29sbGVjdGlvbkltcGw7TG9yZy9hcGFjaGUvaGFybW9ueS9sdW5pL3V0aWwvVHdvS2V5SGFzaE1hcCRFbnRyeUl0ZXJhdG9ySW1wbDtMb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdXRpbC9Ud29LZXlIYXNoTWFwJEVudHJ5U2V0SW1wbDtMb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdXRpbC9Ud29LZXlIYXNoTWFwJEVudHJ5OyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEU6TGphdmEvbGFuZy9PYmplY3Q7SzpMamF2YS9sYW5nL09iamVjdDtWOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS91dGlsL0Fic3RyYWN0TWFwPExqYXZhL2xhbmcvU3RyaW5nO1RWOz47ICkKLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLlR3b0tleUhhc2hNYXAgZXh0ZW5kcyBqYXZhLnV0aWwuQWJzdHJhY3RNYXAKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0lOSVRJQUxfU0laRQotCi1zdGF0aWMgZmluYWwgZmxvYXQgREVGQVVMVF9MT0FEX0ZBQ1RPUgotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPVtMb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdXRpbC9Ud29LZXlIYXNoTWFwJEVudHJ5PFRFO1RLO1RWOz47ICkKLXByaXZhdGUgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5Ud29LZXlIYXNoTWFwJEVudHJ5W10gYXJyCi0KLXByaXZhdGUgaW50IGFyclNpemUKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL1NldDxMamF2YS91dGlsL01hcCRFbnRyeTxMamF2YS9sYW5nL1N0cmluZztUVjs+Oz47ICkKLXByaXZhdGUgamF2YS51dGlsLlNldCBlbnRyeVNldAotCi1wcml2YXRlIGZsb2F0IGxvYWRGYWN0b3IKLQotcHJpdmF0ZSBpbnQgbW9kQ291bnQKLQotcHJpdmF0ZSBpbnQgc2l6ZQotCi0gaW50IHRocmVzaG9sZAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQ29sbGVjdGlvbjxUVjs+OyApCi1wcml2YXRlIGphdmEudXRpbC5Db2xsZWN0aW9uIHZhbHVlcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50Ci1mbG9hdCkKLQotc3RhdGljIGludCBhY2Nlc3MkMDAwKAotb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5Ud29LZXlIYXNoTWFwKQotCi1zdGF0aWMgaW50IGFjY2VzcyQwMTAoCi1vcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLlR3b0tleUhhc2hNYXApCi0KLXN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLlR3b0tleUhhc2hNYXAkRW50cnkgYWNjZXNzJDEwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuVHdvS2V5SGFzaE1hcAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdCkKLQotc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuVHdvS2V5SGFzaE1hcCRFbnRyeSBhY2Nlc3MkMjAwKAotb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5Ud29LZXlIYXNoTWFwCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1zdGF0aWMgaW50IGFjY2VzcyQzMDAoCi1vcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLlR3b0tleUhhc2hNYXApCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDMwOCgKLW9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuVHdvS2V5SGFzaE1hcCkKLQotc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuVHdvS2V5SGFzaE1hcCRFbnRyeVtdIGFjY2VzcyQ0MDAoCi1vcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLlR3b0tleUhhc2hNYXApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcvT2JqZWN0OylMb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdXRpbC9Ud29LZXlIYXNoTWFwJEVudHJ5PFRFO1RLO1RWOz47ICkKLXByaXZhdGUgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5Ud29LZXlIYXNoTWFwJEVudHJ5IGZpbmRFbnRyeSgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcvT2JqZWN0OylMb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdXRpbC9Ud29LZXlIYXNoTWFwJEVudHJ5PFRFO1RLO1RWOz47ICkKLXByaXZhdGUgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5Ud29LZXlIYXNoTWFwJEVudHJ5IHJlbW92ZUVudHJ5KAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHZvaWQgY2xlYXIoKQotCi1wdWJsaWMgYm9vbGVhbiBjb250YWluc0tleSgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KElURTtUSztUVjtMb3JnL2FwYWNoZS9oYXJtb255L2x1bmkvdXRpbC9Ud29LZXlIYXNoTWFwJEVudHJ5PFRFO1RLO1RWOz47KUxvcmcvYXBhY2hlL2hhcm1vbnkvbHVuaS91dGlsL1R3b0tleUhhc2hNYXAkRW50cnk8VEU7VEs7VFY7PjsgKQotIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuVHdvS2V5SGFzaE1hcCRFbnRyeSBjcmVhdGVFbnRyeSgKLWludAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdAotb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5Ud29LZXlIYXNoTWFwJEVudHJ5KQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9JdGVyYXRvcjxMamF2YS91dGlsL01hcCRFbnRyeTxMamF2YS9sYW5nL1N0cmluZztUVjs+Oz47ICkKLSBqYXZhLnV0aWwuSXRlcmF0b3IgY3JlYXRlRW50cnlTZXRJdGVyYXRvcigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0l0ZXJhdG9yPFRWOz47ICkKLSBqYXZhLnV0aWwuSXRlcmF0b3IgY3JlYXRlVmFsdWVDb2xsZWN0aW9uSXRlcmF0b3IoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9TZXQ8TGphdmEvdXRpbC9NYXAkRW50cnk8TGphdmEvbGFuZy9TdHJpbmc7VFY7Pjs+OyApCi1wdWJsaWMgamF2YS51dGlsLlNldCBlbnRyeVNldCgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcvT2JqZWN0OylUVjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0KAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KFRFO1RLO1RWOylUVjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgcHV0KAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdCkKLQotIHZvaWQgcmVoYXNoKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9PYmplY3Q7KVRWOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCByZW1vdmUoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50IHNpemUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9Db2xsZWN0aW9uPFRWOz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuQ29sbGVjdGlvbiB2YWx1ZXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuVVJMVXRpbCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgY2Fub25pY2FsaXplUGF0aCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5VdGlsIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nW10gTU9OVEhTCi0KLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmdbXSBXRUVLREFZUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGRlZmF1bHRFbmNvZGluZwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9VVEZEYXRhRm9ybWF0RXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgY29udmVydEZyb21VVEY4KAotYnl0ZVtdCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9VVEZEYXRhRm9ybWF0RXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgY29udmVydFVURjhXaXRoQnVmKAotYnl0ZVtdCi1jaGFyW10KLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZGVjb2RlKAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotcHVibGljIHN0YXRpYyBieXRlW10gZ2V0Qnl0ZXMoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHN0YXRpYyBpbnQgcGFyc2UoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLXB1YmxpYyBzdGF0aWMgbG9uZyBwYXJzZURhdGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgdG9BU0NJSUxvd2VyQ2FzZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyB0b0FTQ0lJVXBwZXJDYXNlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKAotYnl0ZVtdKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoCi1ieXRlW10KLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5tYXRoLmludGVybmFsLm5scy5NZXNzYWdlcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBzUmVzb3VyY2UKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygKLWphdmEubGFuZy5TdHJpbmcKLWNoYXIpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3RbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkubWlzYy5IYXNoQ29kZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU1QVFlfSEFTSF9DT0RFCi0KLXByaXZhdGUgaW50IGhhc2hDb2RlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBpbnQgY29tYmluZSgKLWludAotZG91YmxlKQotCi1wdWJsaWMgc3RhdGljIGludCBjb21iaW5lKAotaW50Ci1mbG9hdCkKLQotcHVibGljIHN0YXRpYyBpbnQgY29tYmluZSgKLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIGludCBjb21iaW5lKAotaW50Ci1sb25nKQotCi1wdWJsaWMgc3RhdGljIGludCBjb21iaW5lKAotaW50Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIGludCBjb21iaW5lKAotaW50Ci1ib29sZWFuKQotCi1wdWJsaWMgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255Lm1pc2MuSGFzaENvZGUgYXBwZW5kKAotZG91YmxlKQotCi1wdWJsaWMgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255Lm1pc2MuSGFzaENvZGUgYXBwZW5kKAotZmxvYXQpCi0KLXB1YmxpYyBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkubWlzYy5IYXNoQ29kZSBhcHBlbmQoCi1pbnQpCi0KLXB1YmxpYyBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkubWlzYy5IYXNoQ29kZSBhcHBlbmQoCi1sb25nKQotCi1wdWJsaWMgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255Lm1pc2MuSGFzaENvZGUgYXBwZW5kKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5taXNjLkhhc2hDb2RlIGFwcGVuZCgKLWJvb2xlYW4pCi0KLXB1YmxpYyBmaW5hbCBpbnQgaGFzaENvZGUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5taXNjLlN5c3RlbVV0aWxzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUkNfSUEzMgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUkNfSUE2NAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUkNfVU5LTk9XTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPU19MSU5VWAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPU19VTktOT1dOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9TX1dJTkRPV1MKLQotcHJpdmF0ZSBzdGF0aWMgaW50IGFyYwotCi1wcml2YXRlIHN0YXRpYyBpbnQgb3MKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgaW50IGdldE9TKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkubWlzYy5pbnRlcm5hbC5ubHMuTWVzc2FnZXMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgc1Jlc291cmNlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1jaGFyKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nKAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0W10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255Lm5pby5BZGRyZXNzVXRpbCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGludCBnZXRDaGFubmVsQWRkcmVzcygKLWphdmEubmlvLmNoYW5uZWxzLkNoYW5uZWwpCi0KLXB1YmxpYyBzdGF0aWMgaW50IGdldERpcmVjdEJ1ZmZlckFkZHJlc3MoCi1qYXZhLm5pby5CdWZmZXIpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgZ2V0RkRBZGRyZXNzKAotamF2YS5pby5GaWxlRGVzY3JpcHRvcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLkZpbGVDaGFubmVsRmFjdG9yeSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsIGdldEZpbGVDaGFubmVsKAotamF2YS5sYW5nLk9iamVjdAotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255Lm5pby5VdGlsIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0QXJyYXlJbmRleCgKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRBcnJheUluZGV4KAotYnl0ZVtdCi1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydEFycmF5SW5kZXgoCi1jaGFyW10KLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0QXJyYXlJbmRleCgKLWRvdWJsZVtdCi1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydEFycmF5SW5kZXgoCi1mbG9hdFtdCi1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydEFycmF5SW5kZXgoCi1pbnRbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRBcnJheUluZGV4KAotbG9uZ1tdCi1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydEFycmF5SW5kZXgoCi1qYXZhLmxhbmcuT2JqZWN0W10KLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0QXJyYXlJbmRleCgKLXNob3J0W10KLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0QXJyYXlJbmRleCgKLWJvb2xlYW5bXQotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9uaW8vaW50ZXJuYWwvRGF0YWdyYW1DaGFubmVsSW1wbDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1EYXRhZ3JhbVNvY2tldEFkYXB0ZXIgKQotIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuRGF0YWdyYW1DaGFubmVsSW1wbCREYXRhZ3JhbVNvY2tldEFkYXB0ZXIgZXh0ZW5kcyBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuRGF0YWdyYW1DaGFubmVsSW1wbCBjaGFubmVsSW1wbAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEubmV0LkRhdGFncmFtU29ja2V0SW1wbAotb3JnLmFwYWNoZS5oYXJtb255Lm5pby5pbnRlcm5hbC5EYXRhZ3JhbUNoYW5uZWxJbXBsKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGJpbmQoCi1qYXZhLm5ldC5Tb2NrZXRBZGRyZXNzKQotCi1wdWJsaWMgdm9pZCBjbG9zZSgpCi0KLXB1YmxpYyB2b2lkIGRpc2Nvbm5lY3QoKQotCi1wdWJsaWMgamF2YS5uaW8uY2hhbm5lbHMuRGF0YWdyYW1DaGFubmVsIGdldENoYW5uZWwoKQotCi1wdWJsaWMgamF2YS5uZXQuSW5ldEFkZHJlc3MgZ2V0SW5ldEFkZHJlc3MoKQotCi1wdWJsaWMgamF2YS5uZXQuSW5ldEFkZHJlc3MgZ2V0TG9jYWxBZGRyZXNzKCkKLQotcHVibGljIGludCBnZXRQb3J0KCkKLQotcHVibGljIGJvb2xlYW4gaXNCb3VuZCgpCi0KLXB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGVkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcmVjZWl2ZSgKLWphdmEubmV0LkRhdGFncmFtUGFja2V0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZW5kKAotamF2YS5uZXQuRGF0YWdyYW1QYWNrZXQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L25pby9pbnRlcm5hbC9EYXRhZ3JhbUNoYW5uZWxJbXBsJERhdGFncmFtU29ja2V0QWRhcHRlcjsgKQotIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuRGF0YWdyYW1DaGFubmVsSW1wbCBleHRlbmRzIGphdmEubmlvLmNoYW5uZWxzLkRhdGFncmFtQ2hhbm5lbCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLkZpbGVEZXNjcmlwdG9ySGFuZGxlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9USU1FT1VUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFUlJDT0RFX1NPQ0tFVF9OT05CTE9DS0lOR19XT1VMRF9CTE9DSwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5JTmV0d29ya1N5c3RlbSBuZXR3b3JrU3lzdGVtCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBzdHViQXJyYXkKLQotIGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzIGNvbm5lY3RBZGRyZXNzCi0KLSBib29sZWFuIGNvbm5lY3RlZAotCi1wcml2YXRlIGphdmEuaW8uRmlsZURlc2NyaXB0b3IgZmQKLQotIGJvb2xlYW4gaXNCb3VuZAotCi1wcml2YXRlIGludCBsb2NhbFBvcnQKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuT2JqZWN0IHJlYWRMb2NrCi0KLXByaXZhdGUgamF2YS5uZXQuRGF0YWdyYW1Tb2NrZXQgc29ja2V0Ci0KLXByaXZhdGUgaW50IHRyYWZmaWNDbGFzcwotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5PYmplY3Qgd3JpdGVMb2NrCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotamF2YS5uaW8uY2hhbm5lbHMuc3BpLlNlbGVjdG9yUHJvdmlkZXIpCi0KLXByaXZhdGUgaW50IGNhbGN1bGF0ZUJ5dGVCdWZmZXJBcnJheSgKLWphdmEubmlvLkJ5dGVCdWZmZXJbXQotaW50Ci1pbnQpCi0KLXByaXZhdGUgdm9pZCBjaGVja05vdE51bGwoCi1qYXZhLm5pby5CeXRlQnVmZmVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgY2hlY2tPcGVuKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIGNoZWNrT3BlbkNvbm5lY3RlZCgpCi0KLXByaXZhdGUgdm9pZCBjaGVja1dyaXRhYmxlKAotamF2YS5uaW8uQnl0ZUJ1ZmZlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBpbnQgcmVhZEltcGwoCi1qYXZhLm5pby5CeXRlQnVmZmVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIGphdmEubmV0LlNvY2tldEFkZHJlc3MgcmVjZWl2ZURpcmVjdEltcGwoCi1qYXZhLm5pby5CeXRlQnVmZmVyCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIGphdmEubmV0LlNvY2tldEFkZHJlc3MgcmVjZWl2ZUltcGwoCi1qYXZhLm5pby5CeXRlQnVmZmVyCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIGludCB3cml0ZUltcGwoCi1qYXZhLm5pby5CeXRlQnVmZmVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5uaW8uY2hhbm5lbHMuRGF0YWdyYW1DaGFubmVsIGNvbm5lY3QoCi1qYXZhLm5ldC5Tb2NrZXRBZGRyZXNzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5uaW8uY2hhbm5lbHMuRGF0YWdyYW1DaGFubmVsIGRpc2Nvbm5lY3QoKQotCi1wdWJsaWMgamF2YS5pby5GaWxlRGVzY3JpcHRvciBnZXRGRCgpCi0KLSBqYXZhLm5ldC5JbmV0QWRkcmVzcyBnZXRMb2NhbEFkZHJlc3MoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBpbXBsQ2xvc2VTZWxlY3RhYmxlQ2hhbm5lbCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIGltcGxDb25maWd1cmVCbG9ja2luZygKLWJvb2xlYW4pCi0KLXB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGVkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCByZWFkKAotamF2YS5uaW8uQnl0ZUJ1ZmZlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGxvbmcgcmVhZCgKLWphdmEubmlvLkJ5dGVCdWZmZXJbXQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzIHJlY2VpdmUoCi1qYXZhLm5pby5CeXRlQnVmZmVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHNlbmQoCi1qYXZhLm5pby5CeXRlQnVmZmVyCi1qYXZhLm5ldC5Tb2NrZXRBZGRyZXNzKQotCi1wdWJsaWMgamF2YS5uZXQuRGF0YWdyYW1Tb2NrZXQgc29ja2V0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCB3cml0ZSgKLWphdmEubmlvLkJ5dGVCdWZmZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBsb25nIHdyaXRlKAotamF2YS5uaW8uQnl0ZUJ1ZmZlcltdCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L25pby9pbnRlcm5hbC9GaWxlQ2hhbm5lbEltcGw7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9NDEwNCBuYW1lID1udWxsICkKLSBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLmludGVybmFsLkZpbGVDaGFubmVsSW1wbCQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPVJlcG9zaXRpb25pbmdMb2NrICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkvbmlvL2ludGVybmFsL0ZpbGVDaGFubmVsSW1wbDsgKQotIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuRmlsZUNoYW5uZWxJbXBsJFJlcG9zaXRpb25pbmdMb2NrIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLmludGVybmFsLkZpbGVDaGFubmVsSW1wbCB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255Lm5pby5pbnRlcm5hbC5GaWxlQ2hhbm5lbEltcGwpCi0KLSB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuRmlsZUNoYW5uZWxJbXBsCi1vcmcuYXBhY2hlLmhhcm1vbnkubmlvLmludGVybmFsLkZpbGVDaGFubmVsSW1wbCQxKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9uaW8vaW50ZXJuYWwvRmlsZUNoYW5uZWxJbXBsJDE7TG9yZy9hcGFjaGUvaGFybW9ueS9uaW8vaW50ZXJuYWwvRmlsZUNoYW5uZWxJbXBsJFJlcG9zaXRpb25pbmdMb2NrOyApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255Lm5pby5pbnRlcm5hbC5GaWxlQ2hhbm5lbEltcGwgZXh0ZW5kcyBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUxMT0NfR1JBTlVMQVJJVFkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uSUZpbGVTeXN0ZW0gZmlsZVN5c3RlbQotCi1wcml2YXRlIGZpbmFsIGludCBoYW5kbGUKLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLmludGVybmFsLkxvY2tNYW5hZ2VyIGxvY2tNYW5hZ2VyCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLk9iamVjdCByZXBvc2l0aW9uaW5nTG9jawotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5PYmplY3Qgc3RyZWFtCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuT2JqZWN0Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgbG9uZyBrZXJuZWxUcmFuc2ZlcigKLWludAotamF2YS5pby5GaWxlRGVzY3JpcHRvcgotbG9uZwotbG9uZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBpbnQgd3JpdGVJbXBsKAotamF2YS5uaW8uQnl0ZUJ1ZmZlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGphdmEubmlvLmNoYW5uZWxzLkZpbGVMb2NrIGJhc2ljTG9jaygKLWxvbmcKLWxvbmcKLWJvb2xlYW4KLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGZvcmNlKAotYm9vbGVhbikKLQotcHVibGljIGludCBnZXRIYW5kbGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBpbXBsQ2xvc2VDaGFubmVsKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIGphdmEubmlvLmNoYW5uZWxzLkZpbGVMb2NrIGxvY2soCi1sb25nCi1sb25nCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5uaW8uTWFwcGVkQnl0ZUJ1ZmZlciBtYXAoCi1qYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbCRNYXBNb2RlCi1sb25nCi1sb25nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgZmluYWwgamF2YS5uaW8uTWFwcGVkQnl0ZUJ1ZmZlciBtYXBJbXBsKAotaW50Ci1sb25nCi1sb25nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25pby9jaGFubmVscy9DbG9zZWRDaGFubmVsRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgZmluYWwgdm9pZCBvcGVuQ2hlY2soKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgbG9uZyBwb3NpdGlvbigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbCBwb3NpdGlvbigKLWxvbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcmVhZCgKLWphdmEubmlvLkJ5dGVCdWZmZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcmVhZCgKLWphdmEubmlvLkJ5dGVCdWZmZXIKLWxvbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBsb25nIHJlYWQoCi1qYXZhLm5pby5CeXRlQnVmZmVyW10KLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi0gdm9pZCByZWxlYXNlKAotamF2YS5uaW8uY2hhbm5lbHMuRmlsZUxvY2spCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBsb25nIHNpemUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgbG9uZyB0cmFuc2ZlckZyb20oCi1qYXZhLm5pby5jaGFubmVscy5SZWFkYWJsZUJ5dGVDaGFubmVsCi1sb25nCi1sb25nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgbG9uZyB0cmFuc2ZlclRvKAotbG9uZwotbG9uZwotamF2YS5uaW8uY2hhbm5lbHMuV3JpdGFibGVCeXRlQ2hhbm5lbCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsIHRydW5jYXRlKAotbG9uZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIGphdmEubmlvLmNoYW5uZWxzLkZpbGVMb2NrIHRyeUxvY2soCi1sb25nCi1sb25nCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHdyaXRlKAotamF2YS5uaW8uQnl0ZUJ1ZmZlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCB3cml0ZSgKLWphdmEubmlvLkJ5dGVCdWZmZXIKLWxvbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBsb25nIHdyaXRlKAotamF2YS5uaW8uQnl0ZUJ1ZmZlcltdCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLWZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuRmlsZUxvY2tJbXBsIGV4dGVuZHMgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUxvY2sKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBib29sZWFuIGlzUmVsZWFzZWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbAotbG9uZwotbG9uZwotYm9vbGVhbikKLQotcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHJlbGVhc2UoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuSU9VdGlsIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9CVUZGRVJfU0laRQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHN0YXRpYyB2b2lkIGNvbnZlcnQoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLm5pby5jaGFyc2V0LkNoYXJzZXRFbmNvZGVyCi1qYXZhLm5pby5CeXRlQnVmZmVyCi1qYXZhLm5pby5DaGFyQnVmZmVyCi1qYXZhLmlvLk91dHB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBmaWxsQnVmKAotamF2YS5pby5JbnB1dFN0cmVhbQotamF2YS5uaW8uQnl0ZUJ1ZmZlcgotamF2YS5uaW8uQ2hhckJ1ZmZlcgotamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0RGVjb2RlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyB2b2lkIGZsdXNoT3V0cHV0U3RyZWFtV3JpdGVyKAotamF2YS5pby5PdXRwdXRTdHJlYW0KLWphdmEubmlvLkJ5dGVCdWZmZXIKLWphdmEubmlvLmNoYXJzZXQuQ2hhcnNldEVuY29kZXIKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgaW50IHJlYWRJbnB1dFN0cmVhbVJlYWRlcigKLWphdmEuaW8uSW5wdXRTdHJlYW0KLWphdmEubmlvLkJ5dGVCdWZmZXIKLWphdmEubmlvLkNoYXJCdWZmZXIKLWphdmEubmlvLmNoYXJzZXQuQ2hhcnNldERlY29kZXIKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgaW50IHJlYWRJbnB1dFN0cmVhbVJlYWRlcigKLWNoYXJbXQotaW50Ci1pbnQKLWphdmEuaW8uSW5wdXRTdHJlYW0KLWphdmEubmlvLkJ5dGVCdWZmZXIKLWphdmEubmlvLkNoYXJCdWZmZXIKLWphdmEubmlvLmNoYXJzZXQuQ2hhcnNldERlY29kZXIKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZU91dHB1dFN0cmVhbVdyaXRlcigKLWludAotamF2YS5pby5PdXRwdXRTdHJlYW0KLWphdmEubmlvLkJ5dGVCdWZmZXIKLWphdmEubmlvLmNoYXJzZXQuQ2hhcnNldEVuY29kZXIKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZU91dHB1dFN0cmVhbVdyaXRlcigKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50Ci1qYXZhLmlvLk91dHB1dFN0cmVhbQotamF2YS5uaW8uQnl0ZUJ1ZmZlcgotamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0RW5jb2RlcgotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlT3V0cHV0U3RyZWFtV3JpdGVyKAotY2hhcltdCi1pbnQKLWludAotamF2YS5pby5PdXRwdXRTdHJlYW0KLWphdmEubmlvLkJ5dGVCdWZmZXIKLWphdmEubmlvLmNoYXJzZXQuQ2hhcnNldEVuY29kZXIKLWphdmEubGFuZy5PYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9uaW8vaW50ZXJuYWwvTG9ja01hbmFnZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS91dGlsL0NvbXBhcmF0b3I8TGphdmEvbmlvL2NoYW5uZWxzL0ZpbGVMb2NrOz47ICkKLSBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLmludGVybmFsLkxvY2tNYW5hZ2VyJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLkNvbXBhcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgb3JnLmFwYWNoZS5oYXJtb255Lm5pby5pbnRlcm5hbC5Mb2NrTWFuYWdlciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkubmlvLmludGVybmFsLkxvY2tNYW5hZ2VyKQotCi1wdWJsaWMgdm9sYXRpbGUgaW50IGNvbXBhcmUoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50IGNvbXBhcmUoCi1qYXZhLm5pby5jaGFubmVscy5GaWxlTG9jawotamF2YS5uaW8uY2hhbm5lbHMuRmlsZUxvY2spCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1maW5hbCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLmludGVybmFsLkxvY2tNYW5hZ2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQ29tcGFyYXRvcjxMamF2YS9uaW8vY2hhbm5lbHMvRmlsZUxvY2s7PjsgKQotcHJpdmF0ZSBmaW5hbCBqYXZhLnV0aWwuQ29tcGFyYXRvciBsb2NrQ29tcGFyYXRvcgotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvU29ydGVkU2V0PExqYXZhL25pby9jaGFubmVscy9GaWxlTG9jazs+OyApCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5Tb3J0ZWRTZXQgbG9ja3MKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25pby9jaGFubmVscy9PdmVybGFwcGluZ0ZpbGVMb2NrRXhjZXB0aW9uOyApCi0gdm9pZCBhZGRMb2NrKAotamF2YS5uaW8uY2hhbm5lbHMuRmlsZUxvY2spCi0KLSB2b2lkIHJlbW92ZUxvY2soCi1qYXZhLm5pby5jaGFubmVscy5GaWxlTG9jaykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L25pby9pbnRlcm5hbC9NYXBwZWRCeXRlQnVmZmVyRmFjdG9yeTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3NlY3VyaXR5L1ByaXZpbGVnZWRBY3Rpb248TGphdmEvbGFuZy9yZWZsZWN0L0NvbnN0cnVjdG9yOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLWZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuTWFwcGVkQnl0ZUJ1ZmZlckZhY3RvcnkkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBydW4oKQotCi1wdWJsaWMgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLSBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLmludGVybmFsLk1hcHBlZEJ5dGVCdWZmZXJGYWN0b3J5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IgY29uc3RydWN0b3IKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLSB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9FeGNlcHRpb247ICkKLXN0YXRpYyBqYXZhLm5pby5NYXBwZWRCeXRlQnVmZmVyIGdldEJ1ZmZlcigKLW9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLlBsYXRmb3JtQWRkcmVzcwotaW50Ci1sb25nCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9uaW8vaW50ZXJuYWwvUGlwZUltcGw7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MiBuYW1lID1TaW5rQ2hhbm5lbEltcGwgKQotIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuUGlwZUltcGwkU2lua0NoYW5uZWxJbXBsIGV4dGVuZHMgamF2YS5uaW8uY2hhbm5lbHMuUGlwZSRTaW5rQ2hhbm5lbCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLkZpbGVEZXNjcmlwdG9ySGFuZGxlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuU29ja2V0Q2hhbm5lbEltcGwgc2lua1NvY2tldAotCi1maW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLmludGVybmFsLlBpcGVJbXBsIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuUGlwZUltcGwKLWphdmEubmlvLmNoYW5uZWxzLnNwaS5TZWxlY3RvclByb3ZpZGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBmaW5pc2hDb25uZWN0KCkKLQotcHVibGljIGphdmEuaW8uRmlsZURlc2NyaXB0b3IgZ2V0RkQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBpbXBsQ2xvc2VTZWxlY3RhYmxlQ2hhbm5lbCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIGltcGxDb25maWd1cmVCbG9ja2luZygKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgd3JpdGUoCi1qYXZhLm5pby5CeXRlQnVmZmVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgbG9uZyB3cml0ZSgKLWphdmEubmlvLkJ5dGVCdWZmZXJbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGxvbmcgd3JpdGUoCi1qYXZhLm5pby5CeXRlQnVmZmVyW10KLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MiBuYW1lID1Tb3VyY2VDaGFubmVsSW1wbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L25pby9pbnRlcm5hbC9QaXBlSW1wbDsgKQotIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuUGlwZUltcGwkU291cmNlQ2hhbm5lbEltcGwgZXh0ZW5kcyBqYXZhLm5pby5jaGFubmVscy5QaXBlJFNvdXJjZUNoYW5uZWwgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5GaWxlRGVzY3JpcHRvckhhbmRsZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLm5pby5jaGFubmVscy5TZXJ2ZXJTb2NrZXRDaGFubmVsIHNvdXJjZVNlcnZlcgotCi1wcml2YXRlIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuU29ja2V0Q2hhbm5lbEltcGwgc291cmNlU29ja2V0Ci0KLWZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuUGlwZUltcGwgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255Lm5pby5pbnRlcm5hbC5QaXBlSW1wbAotamF2YS5uaW8uY2hhbm5lbHMuc3BpLlNlbGVjdG9yUHJvdmlkZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLSB2b2lkIGFjY2VwdCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLSB2b2lkIGNsb3NlU2VydmVyKCkKLQotcHVibGljIGphdmEuaW8uRmlsZURlc2NyaXB0b3IgZ2V0RkQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBpbXBsQ2xvc2VTZWxlY3RhYmxlQ2hhbm5lbCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIGltcGxDb25maWd1cmVCbG9ja2luZygKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcmVhZCgKLWphdmEubmlvLkJ5dGVCdWZmZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBsb25nIHJlYWQoCi1qYXZhLm5pby5CeXRlQnVmZmVyW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBsb25nIHJlYWQoCi1qYXZhLm5pby5CeXRlQnVmZmVyW10KLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9uaW8vaW50ZXJuYWwvUGlwZUltcGwkU2lua0NoYW5uZWxJbXBsO0xvcmcvYXBhY2hlL2hhcm1vbnkvbmlvL2ludGVybmFsL1BpcGVJbXBsJFNvdXJjZUNoYW5uZWxJbXBsOyApCi1maW5hbCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLmludGVybmFsLlBpcGVJbXBsIGV4dGVuZHMgamF2YS5uaW8uY2hhbm5lbHMuUGlwZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGludCBzZXJ2ZXJQb3J0Ci0KLXByaXZhdGUgb3JnLmFwYWNoZS5oYXJtb255Lm5pby5pbnRlcm5hbC5QaXBlSW1wbCRTaW5rQ2hhbm5lbEltcGwgc2luawotCi1wcml2YXRlIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuUGlwZUltcGwkU291cmNlQ2hhbm5lbEltcGwgc291cmNlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotc3RhdGljIGludCBhY2Nlc3MkMDAwKAotb3JnLmFwYWNoZS5oYXJtb255Lm5pby5pbnRlcm5hbC5QaXBlSW1wbCkKLQotc3RhdGljIGludCBhY2Nlc3MkMDAyKAotb3JnLmFwYWNoZS5oYXJtb255Lm5pby5pbnRlcm5hbC5QaXBlSW1wbAotaW50KQotCi1wcml2YXRlIHZvaWQgcmVzZXQoKQotCi1wdWJsaWMgamF2YS5uaW8uY2hhbm5lbHMuUGlwZSRTaW5rQ2hhbm5lbCBzaW5rKCkKLQotcHVibGljIGphdmEubmlvLmNoYW5uZWxzLlBpcGUkU291cmNlQ2hhbm5lbCBzb3VyY2UoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuUmVhZE9ubHlGaWxlQ2hhbm5lbCBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuRmlsZUNoYW5uZWxJbXBsCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLk9iamVjdAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgZmluYWwgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUxvY2sgYmFzaWNMb2NrKAotbG9uZwotbG9uZwotYm9vbGVhbgotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIHZvaWQgZm9yY2UoCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgamF2YS5uaW8uTWFwcGVkQnl0ZUJ1ZmZlciBtYXAoCi1qYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbCRNYXBNb2RlCi1sb25nCi1sb25nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgbG9uZyB0cmFuc2ZlckZyb20oCi1qYXZhLm5pby5jaGFubmVscy5SZWFkYWJsZUJ5dGVDaGFubmVsCi1sb25nCi1sb25nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWwgdHJ1bmNhdGUoCi1sb25nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgaW50IHdyaXRlKAotamF2YS5uaW8uQnl0ZUJ1ZmZlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIGludCB3cml0ZSgKLWphdmEubmlvLkJ5dGVCdWZmZXIKLWxvbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBsb25nIHdyaXRlKAotamF2YS5uaW8uQnl0ZUJ1ZmZlcltdCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLmludGVybmFsLlJlYWRXcml0ZUZpbGVDaGFubmVsIGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255Lm5pby5pbnRlcm5hbC5GaWxlQ2hhbm5lbEltcGwKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuT2JqZWN0Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCBqYXZhLm5pby5NYXBwZWRCeXRlQnVmZmVyIG1hcCgKLWphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsJE1hcE1vZGUKLWxvbmcKLWxvbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1maW5hbCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLmludGVybmFsLlNlbGVjdGlvbktleUltcGwgZXh0ZW5kcyBqYXZhLm5pby5jaGFubmVscy5zcGkuQWJzdHJhY3RTZWxlY3Rpb25LZXkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLm5pby5jaGFubmVscy5zcGkuQWJzdHJhY3RTZWxlY3RhYmxlQ2hhbm5lbCBjaGFubmVsCi0KLXByaXZhdGUgaW50IGludGVyZXN0T3BzCi0KLSBpbnQgb2xkSW50ZXJlc3RPcHMKLQotcHJpdmF0ZSBpbnQgcmVhZHlPcHMKLQotcHJpdmF0ZSBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLmludGVybmFsLlNlbGVjdG9ySW1wbCBzZWxlY3RvcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubmlvLmNoYW5uZWxzLnNwaS5BYnN0cmFjdFNlbGVjdGFibGVDaGFubmVsCi1pbnQKLWphdmEubGFuZy5PYmplY3QKLW9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuU2VsZWN0b3JJbXBsKQotCi1wcml2YXRlIHZvaWQgY2hlY2tWYWxpZCgpCi0KLXB1YmxpYyBqYXZhLm5pby5jaGFubmVscy5TZWxlY3RhYmxlQ2hhbm5lbCBjaGFubmVsKCkKLQotcHVibGljIGludCBpbnRlcmVzdE9wcygpCi0KLXB1YmxpYyBqYXZhLm5pby5jaGFubmVscy5TZWxlY3Rpb25LZXkgaW50ZXJlc3RPcHMoCi1pbnQpCi0KLXB1YmxpYyBpbnQgcmVhZHlPcHMoKQotCi1wdWJsaWMgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0b3Igc2VsZWN0b3IoKQotCi0gdm9pZCBzZXRSZWFkeU9wcygKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9PEU6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3V0aWwvU2V0PFRFOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9VW5hZGRhYmxlU2V0ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkvbmlvL2ludGVybmFsL1NlbGVjdG9ySW1wbDsgKQotIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuU2VsZWN0b3JJbXBsJFVuYWRkYWJsZVNldCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuU2V0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9TZXQ8VEU7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuU2V0IHNldAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvU2V0PFRFOz47KVYgKQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLlNldCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oVEU7KVogKQotcHVibGljIGJvb2xlYW4gYWRkKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9Db2xsZWN0aW9uPCtURTs+OylaICkKLXB1YmxpYyBib29sZWFuIGFkZEFsbCgKLWphdmEudXRpbC5Db2xsZWN0aW9uKQotCi1wdWJsaWMgdm9pZCBjbGVhcigpCi0KLXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9Db2xsZWN0aW9uPCo+OylaICkKLXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKAotamF2YS51dGlsLkNvbGxlY3Rpb24pCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvSXRlcmF0b3I8VEU7PjsgKQotcHVibGljIGphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvcigpCi0KLXB1YmxpYyBib29sZWFuIHJlbW92ZSgKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvQ29sbGVjdGlvbjwqPjspWiApCi1wdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoCi1qYXZhLnV0aWwuQ29sbGVjdGlvbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvdXRpbC9Db2xsZWN0aW9uPCo+OylaICkKLXB1YmxpYyBib29sZWFuIHJldGFpbkFsbCgKLWphdmEudXRpbC5Db2xsZWN0aW9uKQotCi1wdWJsaWMgaW50IHNpemUoKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdFtdIHRvQXJyYXkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPTxUOkxqYXZhL2xhbmcvT2JqZWN0Oz4oW1RUOylbVFQ7ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0W10gdG9BcnJheSgKLWphdmEubGFuZy5PYmplY3RbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkvbmlvL2ludGVybmFsL1NlbGVjdG9ySW1wbCRVbmFkZGFibGVTZXQ7ICkKLWZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuU2VsZWN0b3JJbXBsIGV4dGVuZHMgamF2YS5uaW8uY2hhbm5lbHMuc3BpLkFic3RyYWN0U2VsZWN0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PQ0tfUkVBREJVRl9TSVpFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNT0NLX1dSSVRFQlVGX1NJWkUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5BCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRUFEQUJMRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VMRUNUX0JMT0NLCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRUxFQ1RfTk9XCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXUklURUFCTEUKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL1NldDxMamF2YS9uaW8vY2hhbm5lbHMvU2VsZWN0aW9uS2V5Oz47ICkKLXByaXZhdGUgZmluYWwgamF2YS51dGlsLlNldCBrZXlzCi0KLWZpbmFsIGphdmEubGFuZy5PYmplY3Qga2V5c0xvY2sKLQotcHJpdmF0ZSBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yW10gcmVhZGFibGUKLQotcHJpdmF0ZSBqYXZhLm5pby5jaGFubmVscy5TZWxlY3Rpb25LZXlbXSByZWFkYWJsZUNoYW5uZWxzCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9MaXN0PExqYXZhL2lvL0ZpbGVEZXNjcmlwdG9yOz47ICkKLXByaXZhdGUgamF2YS51dGlsLkxpc3QgcmVhZGFibGVGRHMKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL1NldDxMamF2YS9uaW8vY2hhbm5lbHMvU2VsZWN0aW9uS2V5Oz47ICkKLXByaXZhdGUgZmluYWwgamF2YS51dGlsLlNldCBzZWxlY3RlZEtleXMKLQotcHJpdmF0ZSBqYXZhLm5pby5jaGFubmVscy5QaXBlJFNpbmtDaGFubmVsIHNpbmsKLQotcHJpdmF0ZSBqYXZhLm5pby5jaGFubmVscy5QaXBlJFNvdXJjZUNoYW5uZWwgc291cmNlCi0KLXByaXZhdGUgamF2YS5pby5GaWxlRGVzY3JpcHRvciBzb3VyY2VmZAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvU2V0PExqYXZhL25pby9jaGFubmVscy9TZWxlY3Rpb25LZXk7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuU2V0IHVuYWRkYWJsZVNlbGVjdGVkS2V5cwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvU2V0PExqYXZhL25pby9jaGFubmVscy9TZWxlY3Rpb25LZXk7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuU2V0IHVubW9kaWZpYWJsZUtleXMKLQotcHJpdmF0ZSBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yW10gd3JpdGFibGUKLQotcHJpdmF0ZSBqYXZhLm5pby5jaGFubmVscy5TZWxlY3Rpb25LZXlbXSB3cml0YWJsZUNoYW5uZWxzCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9MaXN0PExqYXZhL2lvL0ZpbGVEZXNjcmlwdG9yOz47ICkKLXByaXZhdGUgamF2YS51dGlsLkxpc3Qgd3JpdGFibGVGRHMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLm5pby5jaGFubmVscy5zcGkuU2VsZWN0b3JQcm92aWRlcikKLQotcHJpdmF0ZSB2b2lkIGNsb3NlQ2hlY2soKQotCi1wcml2YXRlIHZvaWQgZG9DYW5jZWwoKQotCi1wcml2YXRlIGJvb2xlYW4gaXNDb25uZWN0ZWQoCi1vcmcuYXBhY2hlLmhhcm1vbnkubmlvLmludGVybmFsLlNlbGVjdGlvbktleUltcGwpCi0KLXByaXZhdGUgdm9pZCBwcmVwYXJlQ2hhbm5lbHMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIGludCBwcm9jZXNzU2VsZWN0UmVzdWx0KAotaW50W10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgaW50IHNlbGVjdEludGVybmFsKAotbG9uZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgaW1wbENsb3NlU2VsZWN0b3IoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9TZXQ8TGphdmEvbmlvL2NoYW5uZWxzL1NlbGVjdGlvbktleTs+OyApCi1wdWJsaWMgamF2YS51dGlsLlNldCBrZXlzKCkKLQotcHJvdGVjdGVkIGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdGlvbktleSByZWdpc3RlcigKLWphdmEubmlvLmNoYW5uZWxzLnNwaS5BYnN0cmFjdFNlbGVjdGFibGVDaGFubmVsCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgc2VsZWN0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCBzZWxlY3QoCi1sb25nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHNlbGVjdE5vdygpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL1NldDxMamF2YS9uaW8vY2hhbm5lbHMvU2VsZWN0aW9uS2V5Oz47ICkKLXB1YmxpYyBqYXZhLnV0aWwuU2V0IHNlbGVjdGVkS2V5cygpCi0KLXB1YmxpYyBqYXZhLm5pby5jaGFubmVscy5TZWxlY3RvciB3YWtldXAoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuU2VsZWN0b3JQcm92aWRlckltcGwgZXh0ZW5kcyBqYXZhLm5pby5jaGFubmVscy5zcGkuU2VsZWN0b3JQcm92aWRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLm5pby5jaGFubmVscy5EYXRhZ3JhbUNoYW5uZWwgb3BlbkRhdGFncmFtQ2hhbm5lbCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLm5pby5jaGFubmVscy5QaXBlIG9wZW5QaXBlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubmlvLmNoYW5uZWxzLnNwaS5BYnN0cmFjdFNlbGVjdG9yIG9wZW5TZWxlY3RvcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLm5pby5jaGFubmVscy5TZXJ2ZXJTb2NrZXRDaGFubmVsIG9wZW5TZXJ2ZXJTb2NrZXRDaGFubmVsKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubmlvLmNoYW5uZWxzLlNvY2tldENoYW5uZWwgb3BlblNvY2tldENoYW5uZWwoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkvbmlvL2ludGVybmFsL1NlcnZlclNvY2tldENoYW5uZWxJbXBsOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTQxMDQgbmFtZSA9bnVsbCApCi0gY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255Lm5pby5pbnRlcm5hbC5TZXJ2ZXJTb2NrZXRDaGFubmVsSW1wbCQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9uaW8vaW50ZXJuYWwvU2VydmVyU29ja2V0Q2hhbm5lbEltcGw7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MiBuYW1lID1BY2NlcHRMb2NrICkKLSBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLmludGVybmFsLlNlcnZlclNvY2tldENoYW5uZWxJbXBsJEFjY2VwdExvY2sgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuU2VydmVyU29ja2V0Q2hhbm5lbEltcGwgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuU2VydmVyU29ja2V0Q2hhbm5lbEltcGwpCi0KLSB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuU2VydmVyU29ja2V0Q2hhbm5lbEltcGwKLW9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuU2VydmVyU29ja2V0Q2hhbm5lbEltcGwkMSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTIgbmFtZSA9U2VydmVyU29ja2V0QWRhcHRlciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L25pby9pbnRlcm5hbC9TZXJ2ZXJTb2NrZXRDaGFubmVsSW1wbDsgKQotIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuU2VydmVyU29ja2V0Q2hhbm5lbEltcGwkU2VydmVyU29ja2V0QWRhcHRlciBleHRlbmRzIGphdmEubmV0LlNlcnZlclNvY2tldAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gb3JnLmFwYWNoZS5oYXJtb255Lm5pby5pbnRlcm5hbC5TZXJ2ZXJTb2NrZXRDaGFubmVsSW1wbCBjaGFubmVsSW1wbAotCi1maW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLmludGVybmFsLlNlcnZlclNvY2tldENoYW5uZWxJbXBsIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuU2VydmVyU29ja2V0Q2hhbm5lbEltcGwKLWphdmEubmV0LlNvY2tldEltcGwKLW9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuU2VydmVyU29ja2V0Q2hhbm5lbEltcGwpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgamF2YS5uZXQuU29ja2V0IGFjY2VwdCgKLWphdmEubmV0LlNvY2tldAotb3JnLmFwYWNoZS5oYXJtb255Lm5pby5pbnRlcm5hbC5Tb2NrZXRDaGFubmVsSW1wbCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotc3RhdGljIGphdmEubmV0LlNvY2tldCBhY2Nlc3MkMTAwKAotb3JnLmFwYWNoZS5oYXJtb255Lm5pby5pbnRlcm5hbC5TZXJ2ZXJTb2NrZXRDaGFubmVsSW1wbCRTZXJ2ZXJTb2NrZXRBZGFwdGVyCi1qYXZhLm5ldC5Tb2NrZXQKLW9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuU29ja2V0Q2hhbm5lbEltcGwpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLm5ldC5Tb2NrZXQgYWNjZXB0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgYmluZCgKLWphdmEubmV0LlNvY2tldEFkZHJlc3MpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGJpbmQoCi1qYXZhLm5ldC5Tb2NrZXRBZGRyZXNzCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNsb3NlKCkKLQotcHVibGljIGphdmEubmlvLmNoYW5uZWxzLlNlcnZlclNvY2tldENoYW5uZWwgZ2V0Q2hhbm5lbCgpCi0KLXB1YmxpYyBib29sZWFuIGlzQm91bmQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9uaW8vaW50ZXJuYWwvU2VydmVyU29ja2V0Q2hhbm5lbEltcGwkMTtMb3JnL2FwYWNoZS9oYXJtb255L25pby9pbnRlcm5hbC9TZXJ2ZXJTb2NrZXRDaGFubmVsSW1wbCRTZXJ2ZXJTb2NrZXRBZGFwdGVyO0xvcmcvYXBhY2hlL2hhcm1vbnkvbmlvL2ludGVybmFsL1NlcnZlclNvY2tldENoYW5uZWxJbXBsJEFjY2VwdExvY2s7ICkKLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLmludGVybmFsLlNlcnZlclNvY2tldENoYW5uZWxJbXBsIGV4dGVuZHMgamF2YS5uaW8uY2hhbm5lbHMuU2VydmVyU29ja2V0Q2hhbm5lbCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnBsYXRmb3JtLkZpbGVEZXNjcmlwdG9ySGFuZGxlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VSVkVSX1NUQVRVU19DTE9TRUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFUlZFUl9TVEFUVVNfT1BFTgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VSVkVSX1NUQVRVU19VTklOSVQKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuT2JqZWN0IGFjY2VwdExvY2sKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yIGZkCi0KLXByaXZhdGUgZmluYWwgamF2YS5uZXQuU29ja2V0SW1wbCBpbXBsCi0KLSBib29sZWFuIGlzQm91bmQKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQgc29ja2V0Ci0KLSBpbnQgc3RhdHVzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubmlvLmNoYW5uZWxzLnNwaS5TZWxlY3RvclByb3ZpZGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5uaW8uY2hhbm5lbHMuU29ja2V0Q2hhbm5lbCBhY2NlcHQoKQotCi1wdWJsaWMgamF2YS5pby5GaWxlRGVzY3JpcHRvciBnZXRGRCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIGltcGxDbG9zZVNlbGVjdGFibGVDaGFubmVsKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgaW1wbENvbmZpZ3VyZUJsb2NraW5nKAotYm9vbGVhbikKLQotcHVibGljIGphdmEubmV0LlNlcnZlclNvY2tldCBzb2NrZXQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9U29ja2V0QWRhcHRlciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L25pby9pbnRlcm5hbC9Tb2NrZXRDaGFubmVsSW1wbDsgKQotIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuU29ja2V0Q2hhbm5lbEltcGwkU29ja2V0QWRhcHRlciBleHRlbmRzIGphdmEubmV0LlNvY2tldAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gb3JnLmFwYWNoZS5oYXJtb255Lm5pby5pbnRlcm5hbC5Tb2NrZXRDaGFubmVsSW1wbCBjaGFubmVsCi0KLSBqYXZhLm5ldC5Tb2NrZXRJbXBsIHNvY2tldEltcGwKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLSB2b2lkIDxpbml0PigKLWphdmEubmV0LlNvY2tldEltcGwKLW9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuU29ja2V0Q2hhbm5lbEltcGwpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1NvY2tldEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIGNoZWNrT3BlbigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGJpbmQoCi1qYXZhLm5ldC5Tb2NrZXRBZGRyZXNzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjbG9zZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNvbm5lY3QoCi1qYXZhLm5ldC5Tb2NrZXRBZGRyZXNzCi1pbnQpCi0KLXB1YmxpYyBqYXZhLm5pby5jaGFubmVscy5Tb2NrZXRDaGFubmVsIGdldENoYW5uZWwoKQotCi1wdWJsaWMgamF2YS5uZXQuU29ja2V0SW1wbCBnZXRJbXBsKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuaW8uSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIGdldEtlZXBBbGl2ZSgpCi0KLXB1YmxpYyBqYXZhLm5ldC5JbmV0QWRkcmVzcyBnZXRMb2NhbEFkZHJlc3MoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIGdldE9PQklubGluZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmlvLk91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgZ2V0UmVjZWl2ZUJ1ZmZlclNpemUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIGdldFJldXNlQWRkcmVzcygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1NvY2tldEV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXRTZW5kQnVmZmVyU2l6ZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1NvY2tldEV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXRTb0xpbmdlcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1NvY2tldEV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXRTb1RpbWVvdXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIGdldFRjcE5vRGVsYXkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgZ2V0VHJhZmZpY0NsYXNzKCkKLQotcHVibGljIGJvb2xlYW4gaXNCb3VuZCgpCi0KLXB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGVkKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L25pby9pbnRlcm5hbC9Tb2NrZXRDaGFubmVsSW1wbDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1Tb2NrZXRDaGFubmVsSW5wdXRTdHJlYW0gKQotIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuU29ja2V0Q2hhbm5lbEltcGwkU29ja2V0Q2hhbm5lbElucHV0U3RyZWFtIGV4dGVuZHMgamF2YS5pby5JbnB1dFN0cmVhbQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gamF2YS5uaW8uY2hhbm5lbHMuU29ja2V0Q2hhbm5lbCBjaGFubmVsCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5uaW8uY2hhbm5lbHMuU29ja2V0Q2hhbm5lbCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY2xvc2UoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoCi1ieXRlW10KLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9U29ja2V0Q2hhbm5lbE91dHB1dFN0cmVhbSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L25pby9pbnRlcm5hbC9Tb2NrZXRDaGFubmVsSW1wbDsgKQotIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuU29ja2V0Q2hhbm5lbEltcGwkU29ja2V0Q2hhbm5lbE91dHB1dFN0cmVhbSBleHRlbmRzIGphdmEuaW8uT3V0cHV0U3RyZWFtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBqYXZhLm5pby5jaGFubmVscy5Tb2NrZXRDaGFubmVsIGNoYW5uZWwKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLm5pby5jaGFubmVscy5Tb2NrZXRDaGFubmVsKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjbG9zZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHdyaXRlKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB3cml0ZSgKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L25pby9pbnRlcm5hbC9Tb2NrZXRDaGFubmVsSW1wbCRTb2NrZXRDaGFubmVsSW5wdXRTdHJlYW07TG9yZy9hcGFjaGUvaGFybW9ueS9uaW8vaW50ZXJuYWwvU29ja2V0Q2hhbm5lbEltcGwkU29ja2V0Q2hhbm5lbE91dHB1dFN0cmVhbTtMb3JnL2FwYWNoZS9oYXJtb255L25pby9pbnRlcm5hbC9Tb2NrZXRDaGFubmVsSW1wbCRTb2NrZXRBZGFwdGVyOyApCi0gY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255Lm5pby5pbnRlcm5hbC5Tb2NrZXRDaGFubmVsSW1wbCBleHRlbmRzIGphdmEubmlvLmNoYW5uZWxzLlNvY2tldENoYW5uZWwgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5wbGF0Zm9ybS5GaWxlRGVzY3JpcHRvckhhbmRsZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RfU1VDQ0VTUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRU9GCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFUlJDT0RFX1NPQ0tFVF9OT05CTE9DS0lOR19XT1VMRF9CTE9DSwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSFlfUE9SVF9TT0NLRVRfU1RFUF9DSEVDSwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSFlfU09DS19TVEVQX1NUQVJUCi0KLXN0YXRpYyBmaW5hbCBpbnQgU09DS0VUX1NUQVRVU19DTE9TRUQKLQotc3RhdGljIGZpbmFsIGludCBTT0NLRVRfU1RBVFVTX0NPTk5FQ1RFRAotCi1zdGF0aWMgZmluYWwgaW50IFNPQ0tFVF9TVEFUVVNfUEVORElORwotCi1zdGF0aWMgZmluYWwgaW50IFNPQ0tFVF9TVEFUVVNfVU5DT05ORUNURUQKLQotc3RhdGljIGZpbmFsIGludCBTT0NLRVRfU1RBVFVTX1VOSU5JVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVElNRU9VVF9CTE9DSwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVElNRU9VVF9OT05CTE9DSwotCi1zdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkucGxhdGZvcm0uSU5ldHdvcmtTeXN0ZW0gbmV0d29ya1N5c3RlbQotCi0gamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3MgY29ubmVjdEFkZHJlc3MKLQotcHJpdmF0ZSBieXRlW10gY29ubmVjdENvbnRleHQKLQotIGphdmEuaW8uRmlsZURlc2NyaXB0b3IgZmQKLQotIGJvb2xlYW4gaXNCb3VuZAotCi0gamF2YS5uZXQuSW5ldEFkZHJlc3MgbG9jYWxBZGRyZXNzCi0KLSBpbnQgbG9jYWxQb3J0Ci0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLk9iamVjdCByZWFkTG9jawotCi1wcml2YXRlIGphdmEubmV0LlNvY2tldCBzb2NrZXQKLQotIGludCBzdGF0dXMKLQotcHJpdmF0ZSBpbnQgdHJhZmZpY0NsYXNzCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLk9iamVjdCB3cml0ZUxvY2sKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLm5ldC5Tb2NrZXQKLWphdmEuaW8uRmlsZURlc2NyaXB0b3IpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubmlvLmNoYW5uZWxzLnNwaS5TZWxlY3RvclByb3ZpZGVyKQotCi1wcml2YXRlIGludCBjYWxjdWxhdGVCeXRlQnVmZmVyQXJyYXkoCi1qYXZhLm5pby5CeXRlQnVmZmVyW10KLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25pby9jaGFubmVscy9DbG9zZWRDaGFubmVsRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgY2hlY2tPcGVuQ29ubmVjdGVkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIGNoZWNrVW5jb25uZWN0ZWQoKQotCi1wcml2YXRlIGJvb2xlYW4gaXNJbmRleFZhbGlkKAotamF2YS5uaW8uQnl0ZUJ1ZmZlcltdCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBpbnQgcmVhZEltcGwoCi1qYXZhLm5pby5CeXRlQnVmZmVyKQotCi1zdGF0aWMgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3MgdmFsaWRhdGVBZGRyZXNzKAotamF2YS5uZXQuU29ja2V0QWRkcmVzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBpbnQgd3JpdGVJbXBsKAotamF2YS5uaW8uQnl0ZUJ1ZmZlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gY29ubmVjdCgKLWphdmEubmV0LlNvY2tldEFkZHJlc3MpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIGZpbmlzaENvbm5lY3QoKQotCi1wdWJsaWMgamF2YS5pby5GaWxlRGVzY3JpcHRvciBnZXRGRCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1Vua25vd25Ib3N0RXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5uZXQuSW5ldEFkZHJlc3MgZ2V0TG9jYWxBZGRyZXNzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgaW1wbENsb3NlU2VsZWN0YWJsZUNoYW5uZWwoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBpbXBsQ29uZmlndXJlQmxvY2tpbmcoCi1ib29sZWFuKQotCi1wdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RlZCgpCi0KLXB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGlvblBlbmRpbmcoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoCi1qYXZhLm5pby5CeXRlQnVmZmVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgbG9uZyByZWFkKAotamF2YS5uaW8uQnl0ZUJ1ZmZlcltdCi1pbnQKLWludCkKLQotIHZvaWQgc2V0Q29ubmVjdGVkKCkKLQotcHVibGljIGphdmEubmV0LlNvY2tldCBzb2NrZXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHdyaXRlKAotamF2YS5uaW8uQnl0ZUJ1ZmZlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGxvbmcgd3JpdGUoCi1qYXZhLm5pby5CeXRlQnVmZmVyW10KLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuV3JpdGVPbmx5RmlsZUNoYW5uZWwgZXh0ZW5kcyBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLmludGVybmFsLkZpbGVDaGFubmVsSW1wbAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGJvb2xlYW4gYXBwZW5kCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLk9iamVjdAotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuT2JqZWN0Ci1pbnQKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCBmaW5hbCBqYXZhLm5pby5jaGFubmVscy5GaWxlTG9jayBiYXNpY0xvY2soCi1sb25nCi1sb25nCi1ib29sZWFuCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5uaW8uTWFwcGVkQnl0ZUJ1ZmZlciBtYXAoCi1qYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbCRNYXBNb2RlCi1sb25nCi1sb25nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgbG9uZyBwb3NpdGlvbigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcmVhZCgKLWphdmEubmlvLkJ5dGVCdWZmZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcmVhZCgKLWphdmEubmlvLkJ5dGVCdWZmZXIKLWxvbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBsb25nIHJlYWQoCi1qYXZhLm5pby5CeXRlQnVmZmVyW10KLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgbG9uZyB0cmFuc2ZlclRvKAotbG9uZwotbG9uZwotamF2YS5uaW8uY2hhbm5lbHMuV3JpdGFibGVCeXRlQ2hhbm5lbCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCB3cml0ZSgKLWphdmEubmlvLkJ5dGVCdWZmZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255Lm5pby5pbnRlcm5hbC5ubHMuTWVzc2FnZXMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgc1Jlc291cmNlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1jaGFyKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nKAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0W10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255Lm5pb2NoYXIuaW50ZXJuYWwubmxzLk1lc3NhZ2VzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIHNSZXNvdXJjZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nKAotamF2YS5sYW5nLlN0cmluZwotY2hhcikKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLk9iamVjdFtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5wcmVmcy5pbnRlcm5hbC5ubHMuTWVzc2FnZXMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgc1Jlc291cmNlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1jaGFyKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nKAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0W10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPUdyYW50RW50cnkgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS9EZWZhdWx0UG9saWN5U2Nhbm5lcjsgKQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5EZWZhdWx0UG9saWN5U2Nhbm5lciRHcmFudEVudHJ5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBjb2RlYmFzZQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQ29sbGVjdGlvbjxMb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L0RlZmF1bHRQb2xpY3lTY2FubmVyJFBlcm1pc3Npb25FbnRyeTs+OyApCi1wdWJsaWMgamF2YS51dGlsLkNvbGxlY3Rpb24gcGVybWlzc2lvbnMKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0NvbGxlY3Rpb248TG9yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS9EZWZhdWx0UG9saWN5U2Nhbm5lciRQcmluY2lwYWxFbnRyeTs+OyApCi1wdWJsaWMgamF2YS51dGlsLkNvbGxlY3Rpb24gcHJpbmNpcGFscwotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBzaWduZXJzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgYWRkUHJpbmNpcGFsKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LkRlZmF1bHRQb2xpY3lTY2FubmVyJFByaW5jaXBhbEVudHJ5KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvRGVmYXVsdFBvbGljeVNjYW5uZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1JbnZhbGlkRm9ybWF0RXhjZXB0aW9uICkKLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuRGVmYXVsdFBvbGljeVNjYW5uZXIkSW52YWxpZEZvcm1hdEV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5FeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9S2V5c3RvcmVFbnRyeSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L0RlZmF1bHRQb2xpY3lTY2FubmVyOyApCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LkRlZmF1bHRQb2xpY3lTY2FubmVyJEtleXN0b3JlRW50cnkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHR5cGUKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdXJsCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L0RlZmF1bHRQb2xpY3lTY2FubmVyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9UGVybWlzc2lvbkVudHJ5ICkKLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuRGVmYXVsdFBvbGljeVNjYW5uZXIkUGVybWlzc2lvbkVudHJ5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBhY3Rpb25zCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGtsYXNzCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIG5hbWUKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgc2lnbmVycwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS9EZWZhdWx0UG9saWN5U2Nhbm5lcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPVByaW5jaXBhbEVudHJ5ICkKLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuRGVmYXVsdFBvbGljeVNjYW5uZXIkUHJpbmNpcGFsRW50cnkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBXSUxEQ0FSRAotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBrbGFzcwotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBuYW1lCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvRGVmYXVsdFBvbGljeVNjYW5uZXIkUGVybWlzc2lvbkVudHJ5O0xvcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvRGVmYXVsdFBvbGljeVNjYW5uZXIkUHJpbmNpcGFsRW50cnk7TG9yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS9EZWZhdWx0UG9saWN5U2Nhbm5lciRHcmFudEVudHJ5O0xvcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvRGVmYXVsdFBvbGljeVNjYW5uZXIkS2V5c3RvcmVFbnRyeTtMb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L0RlZmF1bHRQb2xpY3lTY2FubmVyJEludmFsaWRGb3JtYXRFeGNlcHRpb247ICkKLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuRGVmYXVsdFBvbGljeVNjYW5uZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgY29tcG9zZVN0YXR1cygKLWphdmEuaW8uU3RyZWFtVG9rZW5pemVyKQotCi1wcm90ZWN0ZWQgamF2YS5pby5TdHJlYW1Ub2tlbml6ZXIgY29uZmlndXJlKAotamF2YS5pby5TdHJlYW1Ub2tlbml6ZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS9EZWZhdWx0UG9saWN5U2Nhbm5lciRJbnZhbGlkRm9ybWF0RXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgZmluYWwgdm9pZCBoYW5kbGVVbmV4cGVjdGVkVG9rZW4oCi1qYXZhLmlvLlN0cmVhbVRva2VuaXplcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L0RlZmF1bHRQb2xpY3lTY2FubmVyJEludmFsaWRGb3JtYXRFeGNlcHRpb247ICkKLXByb3RlY3RlZCBmaW5hbCB2b2lkIGhhbmRsZVVuZXhwZWN0ZWRUb2tlbigKLWphdmEuaW8uU3RyZWFtVG9rZW5pemVyCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xvcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvRGVmYXVsdFBvbGljeVNjYW5uZXIkSW52YWxpZEZvcm1hdEV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5EZWZhdWx0UG9saWN5U2Nhbm5lciRHcmFudEVudHJ5IHJlYWRHcmFudEVudHJ5KAotamF2YS5pby5TdHJlYW1Ub2tlbml6ZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TG9yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS9EZWZhdWx0UG9saWN5U2Nhbm5lciRJbnZhbGlkRm9ybWF0RXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LkRlZmF1bHRQb2xpY3lTY2FubmVyJEtleXN0b3JlRW50cnkgcmVhZEtleXN0b3JlRW50cnkoCi1qYXZhLmlvLlN0cmVhbVRva2VuaXplcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L0RlZmF1bHRQb2xpY3lTY2FubmVyJEludmFsaWRGb3JtYXRFeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvaW8vU3RyZWFtVG9rZW5pemVyOylMamF2YS91dGlsL0NvbGxlY3Rpb248TG9yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS9EZWZhdWx0UG9saWN5U2Nhbm5lciRQZXJtaXNzaW9uRW50cnk7PjsgKQotcHJvdGVjdGVkIGphdmEudXRpbC5Db2xsZWN0aW9uIHJlYWRQZXJtaXNzaW9uRW50cmllcygKLWphdmEuaW8uU3RyZWFtVG9rZW5pemVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xvcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvRGVmYXVsdFBvbGljeVNjYW5uZXIkSW52YWxpZEZvcm1hdEV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5EZWZhdWx0UG9saWN5U2Nhbm5lciRQcmluY2lwYWxFbnRyeSByZWFkUHJpbmNpcGFsRW50cnkoCi1qYXZhLmlvLlN0cmVhbVRva2VuaXplcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvaW8vUmVhZGVyO0xqYXZhL3V0aWwvQ29sbGVjdGlvbjxMb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L0RlZmF1bHRQb2xpY3lTY2FubmVyJEdyYW50RW50cnk7PjtMamF2YS91dGlsL0xpc3Q8TG9yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS9EZWZhdWx0UG9saWN5U2Nhbm5lciRLZXlzdG9yZUVudHJ5Oz47KVYgKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xvcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvRGVmYXVsdFBvbGljeVNjYW5uZXIkSW52YWxpZEZvcm1hdEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2NhblN0cmVhbSgKLWphdmEuaW8uUmVhZGVyCi1qYXZhLnV0aWwuQ29sbGVjdGlvbgotamF2YS51dGlsLkxpc3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LlBvbGljeUVudHJ5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGphdmEuc2VjdXJpdHkuQ29kZVNvdXJjZSBjcwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvQ29sbGVjdGlvbjxMamF2YS9zZWN1cml0eS9QZXJtaXNzaW9uOz47ICkKLXByaXZhdGUgZmluYWwgamF2YS51dGlsLkNvbGxlY3Rpb24gcGVybWlzc2lvbnMKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbFtdIHByaW5jaXBhbHMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9zZWN1cml0eS9Db2RlU291cmNlO0xqYXZhL3V0aWwvQ29sbGVjdGlvbjwrTGphdmEvc2VjdXJpdHkvUHJpbmNpcGFsOz47TGphdmEvdXRpbC9Db2xsZWN0aW9uPCtMamF2YS9zZWN1cml0eS9QZXJtaXNzaW9uOz47KVYgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5zZWN1cml0eS5Db2RlU291cmNlCi1qYXZhLnV0aWwuQ29sbGVjdGlvbgotamF2YS51dGlsLkNvbGxlY3Rpb24pCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL0NvbGxlY3Rpb248TGphdmEvc2VjdXJpdHkvUGVybWlzc2lvbjs+OyApCi1wdWJsaWMgamF2YS51dGlsLkNvbGxlY3Rpb24gZ2V0UGVybWlzc2lvbnMoKQotCi1wdWJsaWMgYm9vbGVhbiBpbXBsaWVzQ29kZVNvdXJjZSgKLWphdmEuc2VjdXJpdHkuQ29kZVNvdXJjZSkKLQotcHVibGljIGJvb2xlYW4gaW1wbGllc1ByaW5jaXBhbHMoCi1qYXZhLnNlY3VyaXR5LlByaW5jaXBhbFtdKQotCi1wdWJsaWMgYm9vbGVhbiBpc1ZvaWQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5Qcml2YXRlS2V5SW1wbCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnNlY3VyaXR5LlByaXZhdGVLZXkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBhbGdvcml0aG0KLQotcHJpdmF0ZSBieXRlW10gZW5jb2RpbmcKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRBbGdvcml0aG0oKQotCi1wdWJsaWMgYnl0ZVtdIGdldEVuY29kZWQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRGb3JtYXQoKQotCi1wdWJsaWMgdm9pZCBzZXRBbGdvcml0aG0oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRFbmNvZGluZygKLWJ5dGVbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuUHVibGljS2V5SW1wbCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnNlY3VyaXR5LlB1YmxpY0tleQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGFsZ29yaXRobQotCi1wcml2YXRlIGJ5dGVbXSBlbmNvZGluZwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEFsZ29yaXRobSgpCi0KLXB1YmxpYyBieXRlW10gZ2V0RW5jb2RlZCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEZvcm1hdCgpCi0KLXB1YmxpYyB2b2lkIHNldEFsZ29yaXRobSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHNldEVuY29kaW5nKAotYnl0ZVtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5TeXN0ZW1TY29wZSBleHRlbmRzIGphdmEuc2VjdXJpdHkuSWRlbnRpdHlTY29wZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSBqYXZhLnV0aWwuSGFzaHRhYmxlIGtleXMKLQotcHJpdmF0ZSBqYXZhLnV0aWwuSGFzaHRhYmxlIG5hbWVzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9LZXlNYW5hZ2VtZW50RXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnNlY3VyaXR5LklkZW50aXR5U2NvcGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvS2V5TWFuYWdlbWVudEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgYWRkSWRlbnRpdHkoCi1qYXZhLnNlY3VyaXR5LklkZW50aXR5KQotCi1wdWJsaWMgamF2YS5zZWN1cml0eS5JZGVudGl0eSBnZXRJZGVudGl0eSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLnNlY3VyaXR5LklkZW50aXR5IGdldElkZW50aXR5KAotamF2YS5zZWN1cml0eS5QdWJsaWNLZXkpCi0KLXB1YmxpYyBqYXZhLnV0aWwuRW51bWVyYXRpb24gaWRlbnRpdGllcygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvS2V5TWFuYWdlbWVudEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcmVtb3ZlSWRlbnRpdHkoCi1qYXZhLnNlY3VyaXR5LklkZW50aXR5KQotCi1wdWJsaWMgaW50IHNpemUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5VbnJlc29sdmVkUHJpbmNpcGFsIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBXSUxEQ0FSRAotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmcga2xhc3MKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIG5hbWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRDbGFzc05hbWUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXROYW1lKCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLXB1YmxpYyBib29sZWFuIGltcGxpZXMoCi1qYXZhLnNlY3VyaXR5LlByaW5jaXBhbCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFBbnkgZXh0ZW5kcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xVHlwZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xQW55IEFTTjEKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMUFueSBnZXRJbnN0YW5jZSgpCi0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGNoZWNrVGFnKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBkZWNvZGUoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5CZXJJbnB1dFN0cmVhbSkKLQotcHVibGljIHZvaWQgZW5jb2RlQVNOKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVyT3V0cHV0U3RyZWFtKQotCi1wdWJsaWMgdm9pZCBlbmNvZGVDb250ZW50KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVyT3V0cHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXREZWNvZGVkT2JqZWN0KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVySW5wdXRTdHJlYW0pCi0KLXB1YmxpYyBpbnQgZ2V0RW5jb2RlZExlbmd0aCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkJlck91dHB1dFN0cmVhbSkKLQotcHVibGljIHZvaWQgc2V0RW5jb2RpbmdDb250ZW50KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVyT3V0cHV0U3RyZWFtKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTdHJpbmdUeXBlIGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVR5cGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xU3RyaW5nVHlwZSBCTVBTVFJJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xU3RyaW5nVHlwZSBHRU5FUkFMU1RSSU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVN0cmluZ1R5cGUgSUE1U1RSSU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVN0cmluZ1R5cGUgUFJJTlRBQkxFU1RSSU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVN0cmluZ1R5cGUgVEVMRVRFWFNUUklORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTdHJpbmdUeXBlIFVOSVZFUlNBTFNUUklORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTdHJpbmdUeXBlIFVURjhTVFJJTkcKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludCkKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gY2hlY2tUYWcoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGRlY29kZSgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkJlcklucHV0U3RyZWFtKQotCi1wdWJsaWMgdm9pZCBlbmNvZGVBU04oCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5CZXJPdXRwdXRTdHJlYW0pCi0KLXB1YmxpYyB2b2lkIGVuY29kZUNvbnRlbnQoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5CZXJPdXRwdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldERlY29kZWRPYmplY3QoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5CZXJJbnB1dFN0cmVhbSkKLQotcHVibGljIHZvaWQgc2V0RW5jb2RpbmdDb250ZW50KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVyT3V0cHV0U3RyZWFtKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS9hc24xL0FTTjFCaXRTdHJpbmckQVNOMU5hbWVkQml0TGlzdDsgKQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFCaXRTdHJpbmcgZXh0ZW5kcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xU3RyaW5nVHlwZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xQml0U3RyaW5nIEFTTjEKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMUJpdFN0cmluZyBnZXRJbnN0YW5jZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGRlY29kZSgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkJlcklucHV0U3RyZWFtKQotCi1wdWJsaWMgdm9pZCBlbmNvZGVDb250ZW50KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVyT3V0cHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXREZWNvZGVkT2JqZWN0KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVySW5wdXRTdHJlYW0pCi0KLXB1YmxpYyB2b2lkIHNldEVuY29kaW5nQ29udGVudCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkJlck91dHB1dFN0cmVhbSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L2FzbjEvQVNOMUJpdFN0cmluZzsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPUFTTjFOYW1lZEJpdExpc3QgKQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFCaXRTdHJpbmckQVNOMU5hbWVkQml0TGlzdCBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFCaXRTdHJpbmcKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOREVGSU5JVEVfU0laRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gU0VUX01BU0sKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQml0U3RyaW5nIGVtcHR5U3RyaW5nCi0KLXByaXZhdGUgZmluYWwgaW50IG1heEJpdHMKLQotcHJpdmF0ZSBmaW5hbCBpbnQgbWluQml0cwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0RGVjb2RlZE9iamVjdCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkJlcklucHV0U3RyZWFtKQotCi1wdWJsaWMgdm9pZCBzZXRFbmNvZGluZ0NvbnRlbnQoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5CZXJPdXRwdXRTdHJlYW0pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVByaW1pdGl2ZSBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFUeXBlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50KQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBjaGVja1RhZygKLWludCkKLQotcHVibGljIHZvaWQgZW5jb2RlQVNOKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVyT3V0cHV0U3RyZWFtKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFCb29sZWFuIGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVByaW1pdGl2ZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xQm9vbGVhbiBBU04xCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFCb29sZWFuIGdldEluc3RhbmNlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZGVjb2RlKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVySW5wdXRTdHJlYW0pCi0KLXB1YmxpYyB2b2lkIGVuY29kZUNvbnRlbnQoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5CZXJPdXRwdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldERlY29kZWRPYmplY3QoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5CZXJJbnB1dFN0cmVhbSkKLQotcHVibGljIHZvaWQgc2V0RW5jb2RpbmdDb250ZW50KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVyT3V0cHV0U3RyZWFtKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFDaG9pY2UgZXh0ZW5kcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xVHlwZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGludFtdW10gaWRlbnRpZmllcnMKLQotcHVibGljIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFUeXBlW10gdHlwZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFUeXBlW10pCi0KLXByaXZhdGUgdm9pZCBhZGRJZGVudGlmaWVyKAotamF2YS51dGlsLlRyZWVNYXAKLWludAotaW50KQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBjaGVja1RhZygKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZGVjb2RlKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVySW5wdXRTdHJlYW0pCi0KLXB1YmxpYyB2b2lkIGVuY29kZUFTTigKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkJlck91dHB1dFN0cmVhbSkKLQotcHVibGljIGZpbmFsIHZvaWQgZW5jb2RlQ29udGVudCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkJlck91dHB1dFN0cmVhbSkKLQotcHVibGljIGFic3RyYWN0IGludCBnZXRJbmRleCgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuT2JqZWN0IGdldE9iamVjdFRvRW5jb2RlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGZpbmFsIHZvaWQgc2V0RW5jb2RpbmdDb250ZW50KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVyT3V0cHV0U3RyZWFtKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFFbnVtZXJhdGVkIGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVByaW1pdGl2ZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xRW51bWVyYXRlZCBBU04xCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFFbnVtZXJhdGVkIGdldEluc3RhbmNlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZGVjb2RlKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVySW5wdXRTdHJlYW0pCi0KLXB1YmxpYyB2b2lkIGVuY29kZUNvbnRlbnQoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5CZXJPdXRwdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldERlY29kZWRPYmplY3QoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5CZXJJbnB1dFN0cmVhbSkKLQotcHVibGljIHZvaWQgc2V0RW5jb2RpbmdDb250ZW50KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVyT3V0cHV0U3RyZWFtKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmlvLklPRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMUV4cGxpY2l0IGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMUNvbnN0cnVjdHVyZWQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFUeXBlIHR5cGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWludAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVR5cGUpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVR5cGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGRlY29kZSgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkJlcklucHV0U3RyZWFtKQotCi1wdWJsaWMgdm9pZCBlbmNvZGVDb250ZW50KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVyT3V0cHV0U3RyZWFtKQotCi1wdWJsaWMgdm9pZCBzZXRFbmNvZGluZ0NvbnRlbnQoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5CZXJPdXRwdXRTdHJlYW0pCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xVGltZSBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTdHJpbmdUeXBlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXREZWNvZGVkT2JqZWN0KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVySW5wdXRTdHJlYW0pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMUdlbmVyYWxpemVkVGltZSBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFUaW1lCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFHZW5lcmFsaXplZFRpbWUgQVNOMQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEdFTl9QQVRURVJOCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFHZW5lcmFsaXplZFRpbWUgZ2V0SW5zdGFuY2UoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBkZWNvZGUoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5CZXJJbnB1dFN0cmVhbSkKLQotcHVibGljIHZvaWQgZW5jb2RlQ29udGVudCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkJlck91dHB1dFN0cmVhbSkKLQotcHVibGljIHZvaWQgc2V0RW5jb2RpbmdDb250ZW50KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVyT3V0cHV0U3RyZWFtKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFJbXBsaWNpdCBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFUeXBlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUQUdHSU5HX0NPTlNUUlVDVEVECi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUQUdHSU5HX1BSSU1JVElWRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEFHR0lOR19TVFJJTkcKLQotcHJpdmF0ZSBmaW5hbCBpbnQgdGFnZ2luZ1R5cGUKLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xVHlwZSB0eXBlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50Ci1pbnQKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFUeXBlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFUeXBlKQotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBjaGVja1RhZygKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZGVjb2RlKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVySW5wdXRTdHJlYW0pCi0KLXB1YmxpYyB2b2lkIGVuY29kZUFTTigKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkJlck91dHB1dFN0cmVhbSkKLQotcHVibGljIHZvaWQgZW5jb2RlQ29udGVudCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkJlck91dHB1dFN0cmVhbSkKLQotcHVibGljIHZvaWQgc2V0RW5jb2RpbmdDb250ZW50KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVyT3V0cHV0U3RyZWFtKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFJbnRlZ2VyIGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVByaW1pdGl2ZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xSW50ZWdlciBBU04xCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5PYmplY3QgZnJvbUludFZhbHVlKAotaW50KQotCi1wdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFJbnRlZ2VyIGdldEluc3RhbmNlKCkKLQotcHVibGljIHN0YXRpYyBqYXZhLm1hdGguQmlnSW50ZWdlciB0b0JpZ0ludGVnZXJWYWx1ZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBzdGF0aWMgaW50IHRvSW50VmFsdWUoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBkZWNvZGUoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5CZXJJbnB1dFN0cmVhbSkKLQotcHVibGljIHZvaWQgZW5jb2RlQ29udGVudCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkJlck91dHB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0RGVjb2RlZE9iamVjdCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkJlcklucHV0U3RyZWFtKQotCi1wdWJsaWMgdm9pZCBzZXRFbmNvZGluZ0NvbnRlbnQoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5CZXJPdXRwdXRTdHJlYW0pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMU9jdGV0U3RyaW5nIGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVN0cmluZ1R5cGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMU9jdGV0U3RyaW5nIEFTTjEKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMU9jdGV0U3RyaW5nIGdldEluc3RhbmNlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZGVjb2RlKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVySW5wdXRTdHJlYW0pCi0KLXB1YmxpYyB2b2lkIGVuY29kZUNvbnRlbnQoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5CZXJPdXRwdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldERlY29kZWRPYmplY3QoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5CZXJJbnB1dFN0cmVhbSkKLQotcHVibGljIHZvaWQgc2V0RW5jb2RpbmdDb250ZW50KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVyT3V0cHV0U3RyZWFtKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFPaWQgZXh0ZW5kcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xUHJpbWl0aXZlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFPaWQgQVNOMQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xT2lkIFNUUklOR19PSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMU9pZCBnZXRJbnN0YW5jZSgpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMU9pZCBnZXRJbnN0YW5jZUZvclN0cmluZygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGRlY29kZSgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkJlcklucHV0U3RyZWFtKQotCi1wdWJsaWMgdm9pZCBlbmNvZGVDb250ZW50KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVyT3V0cHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXREZWNvZGVkT2JqZWN0KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVySW5wdXRTdHJlYW0pCi0KLXB1YmxpYyB2b2lkIHNldEVuY29kaW5nQ29udGVudCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkJlck91dHB1dFN0cmVhbSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L2FzbjEvQVNOMU9pZDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotZmluYWwgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMU9pZCQxIGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMU9pZAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldERlY29kZWRPYmplY3QoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5CZXJJbnB1dFN0cmVhbSkKLQotcHVibGljIHZvaWQgc2V0RW5jb2RpbmdDb250ZW50KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVyT3V0cHV0U3RyZWFtKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvYXNuMS9BU04xT3BlblR5cGU7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1JZCApCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMU9wZW5UeXBlJElkIGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMU9pZAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGRlY29kZSgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkJlcklucHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXREZWNvZGVkT2JqZWN0KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVySW5wdXRTdHJlYW0pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L2FzbjEvQVNOMU9wZW5UeXBlJElkOyApCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMU9wZW5UeXBlIGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMUFueQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFPcGVuVHlwZSRJZCBrZXkKLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5JbmZvcm1hdGlvbk9iamVjdFNldCBwb29sCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMU9wZW5UeXBlJElkCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5JbmZvcm1hdGlvbk9iamVjdFNldCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZGVjb2RlKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVySW5wdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldERlY29kZWRPYmplY3QoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5CZXJJbnB1dFN0cmVhbSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xVmFsdWVDb2xsZWN0aW9uIGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMUNvbnN0cnVjdHVyZWQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFUeXBlIHR5cGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFUeXBlKQotCi1wdWJsaWMgamF2YS51dGlsLkNvbGxlY3Rpb24gZ2V0VmFsdWVzKAotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xU2VxdWVuY2VPZiBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFWYWx1ZUNvbGxlY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xVHlwZSkKLQotcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xU2VxdWVuY2VPZiBhc0FycmF5T2YoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xVHlwZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZGVjb2RlKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVySW5wdXRTdHJlYW0pCi0KLXB1YmxpYyBmaW5hbCB2b2lkIGVuY29kZUNvbnRlbnQoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5CZXJPdXRwdXRTdHJlYW0pCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHNldEVuY29kaW5nQ29udGVudCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkJlck91dHB1dFN0cmVhbSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1maW5hbCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xU2VxdWVuY2VPZiQxIGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVNlcXVlbmNlT2YKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xVHlwZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0RGVjb2RlZE9iamVjdCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkJlcklucHV0U3RyZWFtKQotCi1wdWJsaWMgamF2YS51dGlsLkNvbGxlY3Rpb24gZ2V0VmFsdWVzKAotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xU2V0IGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVR5cGVDb2xsZWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVR5cGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZGVjb2RlKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVySW5wdXRTdHJlYW0pCi0KLXB1YmxpYyBmaW5hbCB2b2lkIGVuY29kZUNvbnRlbnQoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5CZXJPdXRwdXRTdHJlYW0pCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHNldEVuY29kaW5nQ29udGVudCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkJlck91dHB1dFN0cmVhbSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xU2V0T2YgZXh0ZW5kcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xVmFsdWVDb2xsZWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVR5cGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVNldE9mIGFzQXJyYXlPZigKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFUeXBlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBkZWNvZGUoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5CZXJJbnB1dFN0cmVhbSkKLQotcHVibGljIGZpbmFsIHZvaWQgZW5jb2RlQ29udGVudCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkJlck91dHB1dFN0cmVhbSkKLQotcHVibGljIGZpbmFsIHZvaWQgc2V0RW5jb2RpbmdDb250ZW50KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVyT3V0cHV0U3RyZWFtKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLWZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXRPZiQxIGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVNldE9mCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVR5cGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldERlY29kZWRPYmplY3QoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5CZXJJbnB1dFN0cmVhbSkKLQotcHVibGljIGphdmEudXRpbC5Db2xsZWN0aW9uIGdldFZhbHVlcygKLWphdmEubGFuZy5PYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS9hc24xL0FTTjFTdHJpbmdUeXBlOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1maW5hbCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xU3RyaW5nVHlwZSQxIGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVN0cmluZ1R5cGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS9hc24xL0FTTjFTdHJpbmdUeXBlOyApCi1maW5hbCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xU3RyaW5nVHlwZSQyIGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVN0cmluZ1R5cGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS9hc24xL0FTTjFTdHJpbmdUeXBlOyApCi1maW5hbCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xU3RyaW5nVHlwZSQzIGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVN0cmluZ1R5cGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS9hc24xL0FTTjFTdHJpbmdUeXBlOyApCi1maW5hbCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xU3RyaW5nVHlwZSQ0IGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVN0cmluZ1R5cGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS9hc24xL0FTTjFTdHJpbmdUeXBlOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1maW5hbCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xU3RyaW5nVHlwZSQ1IGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVN0cmluZ1R5cGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS9hc24xL0FTTjFTdHJpbmdUeXBlOyApCi1maW5hbCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xU3RyaW5nVHlwZSQ2IGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVN0cmluZ1R5cGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS9hc24xL0FTTjFTdHJpbmdUeXBlOyApCi1maW5hbCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xU3RyaW5nVHlwZSQ3IGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVN0cmluZ1R5cGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldERlY29kZWRPYmplY3QoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5CZXJJbnB1dFN0cmVhbSkKLQotcHVibGljIHZvaWQgc2V0RW5jb2RpbmdDb250ZW50KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVyT3V0cHV0U3RyZWFtKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFVVENUaW1lIGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVRpbWUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVVUQ1RpbWUgQVNOMQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBVVENfSE0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVRDX0hNUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBVVENfTE9DQUxfSE0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVRDX0xPQ0FMX0hNUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFVUQ19QQVRURVJOCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFVVENUaW1lIGdldEluc3RhbmNlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZGVjb2RlKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVySW5wdXRTdHJlYW0pCi0KLXB1YmxpYyB2b2lkIGVuY29kZUNvbnRlbnQoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5CZXJPdXRwdXRTdHJlYW0pCi0KLXB1YmxpYyB2b2lkIHNldEVuY29kaW5nQ29udGVudCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkJlck91dHB1dFN0cmVhbSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5CZXJJbnB1dFN0cmVhbSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRl9JTkNSRUFTRV9TSVpFCi0KLXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IElOREVGSU5JVF9MRU5HVEgKLQotcHJvdGVjdGVkIGJ5dGVbXSBidWZmZXIKLQotcHVibGljIGludCBjaG9pY2VJbmRleAotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBjb250ZW50Ci0KLXByb3RlY3RlZCBpbnQgY29udGVudE9mZnNldAotCi1wcm90ZWN0ZWQgamF2YS5pby5JbnB1dFN0cmVhbSBpbgotCi1wcm90ZWN0ZWQgYm9vbGVhbiBpc0luZGVmaW5lZExlbmd0aAotCi1wcm90ZWN0ZWQgYm9vbGVhbiBpc1ZlcmlmeQotCi1wcm90ZWN0ZWQgaW50IGxlbmd0aAotCi1wcm90ZWN0ZWQgaW50IG9mZnNldAotCi1wdWJsaWMgaW50IG9pZEVsZW1lbnQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuT2JqZWN0W11bXSBwb29sCi0KLXB1YmxpYyBpbnQgdGFnCi0KLXByb3RlY3RlZCBpbnQgdGFnT2Zmc2V0Ci0KLXB1YmxpYyBpbnRbXSB0aW1lcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uSW5wdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uSW5wdXRTdHJlYW0KLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ieXRlW10KLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIGZpbmFsIHZvaWQgZGVjb2RlVmFsdWVDb2xsZWN0aW9uKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVZhbHVlQ29sbGVjdGlvbikKLQotcHVibGljIHN0YXRpYyBpbnQgZ2V0TGVuZ3RoKAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvYXNuMS9BU04xRXhjZXB0aW9uOyApCi1wcml2YXRlIGludCBzdHJUb0ludCgKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCBjb21wYWN0QnVmZmVyKCkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0KAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGZpbmFsIGJ5dGVbXSBnZXRCdWZmZXIoKQotCi1wdWJsaWMgZmluYWwgaW50IGdldENvbnRlbnRPZmZzZXQoKQotCi1wdWJsaWMgYnl0ZVtdIGdldEVuY29kZWQoKQotCi1wdWJsaWMgZmluYWwgaW50IGdldEVuZE9mZnNldCgpCi0KLXB1YmxpYyBmaW5hbCBpbnQgZ2V0TGVuZ3RoKCkKLQotcHVibGljIGZpbmFsIGludCBnZXRPZmZzZXQoKQotCi1wdWJsaWMgZmluYWwgaW50IGdldFRhZ09mZnNldCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgbmV4dCgpCi0KLXB1YmxpYyB2b2lkIHB1dCgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCBpbnQgcmVhZCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHJlYWRCaXRTdHJpbmcoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCByZWFkQm9vbGVhbigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHJlYWRDb250ZW50KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcmVhZEVudW1lcmF0ZWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCByZWFkR2VuZXJhbGl6ZWRUaW1lKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcmVhZEludGVnZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCByZWFkT0lEKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcmVhZE9jdGV0U3RyaW5nKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcmVhZFNlcXVlbmNlKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVNlcXVlbmNlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCByZWFkU2VxdWVuY2VPZigKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXF1ZW5jZU9mKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCByZWFkU2V0KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVNldCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcmVhZFNldE9mKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVNldE9mKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCByZWFkU3RyaW5nKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVN0cmluZ1R5cGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHJlYWRVVENUaW1lKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIHZvaWQgcmVzZXQoCi1ieXRlW10pCi0KLXB1YmxpYyBmaW5hbCB2b2lkIHNldFZlcmlmeSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVyT3V0cHV0U3RyZWFtIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBjb250ZW50Ci0KLXB1YmxpYyBieXRlW10gZW5jb2RlZAotCi1wdWJsaWMgaW50IGxlbmd0aAotCi1wcm90ZWN0ZWQgaW50IG9mZnNldAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIGVuY29kZUFOWSgpCi0KLXB1YmxpYyB2b2lkIGVuY29kZUJpdFN0cmluZygpCi0KLXB1YmxpYyB2b2lkIGVuY29kZUJvb2xlYW4oKQotCi1wdWJsaWMgdm9pZCBlbmNvZGVDaG9pY2UoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xQ2hvaWNlKQotCi1wdWJsaWMgdm9pZCBlbmNvZGVFeHBsaWNpdCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFFeHBsaWNpdCkKLQotcHVibGljIHZvaWQgZW5jb2RlR2VuZXJhbGl6ZWRUaW1lKCkKLQotcHVibGljIHZvaWQgZW5jb2RlSW50ZWdlcigpCi0KLXB1YmxpYyB2b2lkIGVuY29kZU9JRCgpCi0KLXB1YmxpYyB2b2lkIGVuY29kZU9jdGV0U3RyaW5nKCkKLQotcHVibGljIHZvaWQgZW5jb2RlU2VxdWVuY2UoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xU2VxdWVuY2UpCi0KLXB1YmxpYyB2b2lkIGVuY29kZVNlcXVlbmNlT2YoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xU2VxdWVuY2VPZikKLQotcHVibGljIHZvaWQgZW5jb2RlU2V0KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVNldCkKLQotcHVibGljIHZvaWQgZW5jb2RlU2V0T2YoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xU2V0T2YpCi0KLXB1YmxpYyB2b2lkIGVuY29kZVN0cmluZygpCi0KLXB1YmxpYyBmaW5hbCB2b2lkIGVuY29kZVRhZygKLWludCkKLQotcHVibGljIHZvaWQgZW5jb2RlVVRDVGltZSgpCi0KLXB1YmxpYyB2b2lkIGdldENob2ljZUxlbmd0aCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFDaG9pY2UpCi0KLXB1YmxpYyB2b2lkIGdldEV4cGxpY2l0TGVuZ3RoKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMUV4cGxpY2l0KQotCi1wdWJsaWMgdm9pZCBnZXRTZXF1ZW5jZUxlbmd0aCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXF1ZW5jZSkKLQotcHVibGljIHZvaWQgZ2V0U2VxdWVuY2VPZkxlbmd0aCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXF1ZW5jZU9mKQotCi1wdWJsaWMgdm9pZCBnZXRTZXRMZW5ndGgoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xU2V0KQotCi1wdWJsaWMgdm9pZCBnZXRTZXRPZkxlbmd0aCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXRPZikKLQotcHVibGljIGludCBnZXRTdHJpbmdMZW5ndGgoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkJpdFN0cmluZyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIFJFU0VUX01BU0sKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIFNFVF9NQVNLCi0KLXB1YmxpYyBmaW5hbCBieXRlW10gYnl0ZXMKLQotcHVibGljIGZpbmFsIGludCB1bnVzZWRCaXRzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ieXRlW10KLWludCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYm9vbGVhbltdKQotCi1wdWJsaWMgYm9vbGVhbiBnZXRCaXQoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldEJpdCgKLWludAotYm9vbGVhbikKLQotcHVibGljIGJvb2xlYW5bXSB0b0Jvb2xlYW5BcnJheSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuRGVySW5wdXRTdHJlYW0gZXh0ZW5kcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5CZXJJbnB1dFN0cmVhbQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gVU5VU0VEX0JJVFNfTUFTSwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5JbnB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ieXRlW10KLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgZmluYWwgaW50IG5leHQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCByZWFkQml0U3RyaW5nKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcmVhZEJvb2xlYW4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCByZWFkR2VuZXJhbGl6ZWRUaW1lKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcmVhZE9jdGV0U3RyaW5nKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcmVhZFNlcXVlbmNlKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVNlcXVlbmNlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCByZWFkU2V0T2YoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xU2V0T2YpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHJlYWRTdHJpbmcoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xU3RyaW5nVHlwZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcmVhZFVUQ1RpbWUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkRlck91dHB1dFN0cmVhbSBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkJlck91dHB1dFN0cmVhbQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgaW5pdFNpemUKLQotcHJpdmF0ZSBpbnQgaW5kZXgKLQotcHJpdmF0ZSBpbnRbXVtdIGxlbgotCi1wcml2YXRlIGphdmEubGFuZy5PYmplY3RbXVtdIHZhbAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFUeXBlCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wcml2YXRlIGZpbmFsIHZvaWQgZW5jb2RlVmFsdWVDb2xsZWN0aW9uKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVZhbHVlQ29sbGVjdGlvbikKLQotcHJpdmF0ZSB2b2lkIGdldFZhbHVlT2ZMZW5ndGgoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xVmFsdWVDb2xsZWN0aW9uKQotCi1wcml2YXRlIHZvaWQgcHVzaCgKLWludFtdCi1qYXZhLmxhbmcuT2JqZWN0W10pCi0KLXB1YmxpYyB2b2lkIGVuY29kZUNob2ljZSgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFDaG9pY2UpCi0KLXB1YmxpYyB2b2lkIGVuY29kZUV4cGxpY2l0KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMUV4cGxpY2l0KQotCi1wdWJsaWMgdm9pZCBlbmNvZGVTZXF1ZW5jZSgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXF1ZW5jZSkKLQotcHVibGljIHZvaWQgZW5jb2RlU2VxdWVuY2VPZigKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXF1ZW5jZU9mKQotCi1wdWJsaWMgdm9pZCBlbmNvZGVTZXRPZigKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXRPZikKLQotcHVibGljIHZvaWQgZ2V0Q2hvaWNlTGVuZ3RoKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMUNob2ljZSkKLQotcHVibGljIHZvaWQgZ2V0RXhwbGljaXRMZW5ndGgoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xRXhwbGljaXQpCi0KLXB1YmxpYyB2b2lkIGdldFNlcXVlbmNlTGVuZ3RoKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVNlcXVlbmNlKQotCi1wdWJsaWMgdm9pZCBnZXRTZXF1ZW5jZU9mTGVuZ3RoKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVNlcXVlbmNlT2YpCi0KLXB1YmxpYyB2b2lkIGdldFNldE9mTGVuZ3RoKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVNldE9mKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MiBuYW1lID1FbnRyeSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L2FzbjEvSW5mb3JtYXRpb25PYmplY3RTZXQ7ICkKLSBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5JbmZvcm1hdGlvbk9iamVjdFNldCRFbnRyeSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGphdmEubGFuZy5PYmplY3Qgb2JqZWN0Ci0KLXB1YmxpYyBpbnRbXSBvaWQKLQotZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuSW5mb3JtYXRpb25PYmplY3RTZXQgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuSW5mb3JtYXRpb25PYmplY3RTZXQKLWludFtdCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS9hc24xL0luZm9ybWF0aW9uT2JqZWN0U2V0JEVudHJ5OyApCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuSW5mb3JtYXRpb25PYmplY3RTZXQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgaW50IGNhcGFjaXR5Ci0KLXByaXZhdGUgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuSW5mb3JtYXRpb25PYmplY3RTZXQkRW50cnlbXVtdIHBvb2wKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWludCkKLQotcHJpdmF0ZSBpbnQgaGFzaEludEFycmF5KAotaW50W10pCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldCgKLWludFtdKQotCi1wdWJsaWMgdm9pZCBwdXQoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwMS5BdHRyaWJ1dGVUeXBlKQotCi1wdWJsaWMgdm9pZCBwdXQoCi1pbnRbXQotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5PYmplY3RJZGVudGlmaWVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGludFtdIG9pZAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgc29pZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludFtdKQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNPSUQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGludFtdIHRvSW50QXJyYXkoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHN0YXRpYyBpbnRbXSB0b0ludEFycmF5KAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKAotaW50W10pCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZSgKLWludFtdKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50W10gZ2V0T2lkKCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuZm9ydHJlc3MuRGVmYXVsdFBvbGljeSBleHRlbmRzIGphdmEuc2VjdXJpdHkuUG9saWN5Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBKQVZBX1NFQ1VSSVRZX1BPTElDWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUE9MSUNZX1VSTF9QUkVGSVgKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL01hcDxMamF2YS9sYW5nL09iamVjdDtMamF2YS91dGlsL0NvbGxlY3Rpb248TGphdmEvc2VjdXJpdHkvUGVybWlzc2lvbjs+Oz47ICkKLXByaXZhdGUgZmluYWwgamF2YS51dGlsLk1hcCBjYWNoZQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvU2V0PExvcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvUG9saWN5RW50cnk7PjsgKQotcHJpdmF0ZSBmaW5hbCBqYXZhLnV0aWwuU2V0IGdyYW50cwotCi1wcml2YXRlIGJvb2xlYW4gaW5pdGlhaWxpemVkCi0KLXByaXZhdGUgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmZvcnRyZXNzLkRlZmF1bHRQb2xpY3lQYXJzZXIgcGFyc2VyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmZvcnRyZXNzLkRlZmF1bHRQb2xpY3lQYXJzZXIpCi0KLXB1YmxpYyBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb25Db2xsZWN0aW9uIGdldFBlcm1pc3Npb25zKAotamF2YS5zZWN1cml0eS5Db2RlU291cmNlKQotCi1wdWJsaWMgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uQ29sbGVjdGlvbiBnZXRQZXJtaXNzaW9ucygKLWphdmEuc2VjdXJpdHkuUHJvdGVjdGlvbkRvbWFpbikKLQotcHVibGljIHZvaWQgcmVmcmVzaCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS9mb3J0cmVzcy9Qb2xpY3lVdGlsczsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNTQ1IG5hbWUgPUdlbmVyYWxFeHBhbnNpb25IYW5kbGVyICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmZvcnRyZXNzLlBvbGljeVV0aWxzJEdlbmVyYWxFeHBhbnNpb25IYW5kbGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS9mb3J0cmVzcy9Qb2xpY3lVdGlscyRFeHBhbnNpb25GYWlsZWRFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIHJlc29sdmUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1QZXJtaXNzaW9uRXhwYW5kZXIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS9mb3J0cmVzcy9EZWZhdWx0UG9saWN5UGFyc2VyOyApCi0gY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmZvcnRyZXNzLkRlZmF1bHRQb2xpY3lQYXJzZXIkUGVybWlzc2lvbkV4cGFuZGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5mb3J0cmVzcy5Qb2xpY3lVdGlscyRHZW5lcmFsRXhwYW5zaW9uSGFuZGxlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5EZWZhdWx0UG9saWN5U2Nhbm5lciRHcmFudEVudHJ5IGdlCi0KLXByaXZhdGUgamF2YS5zZWN1cml0eS5LZXlTdG9yZSBrcwotCi1maW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuZm9ydHJlc3MuRGVmYXVsdFBvbGljeVBhcnNlciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuZm9ydHJlc3MuRGVmYXVsdFBvbGljeVBhcnNlcikKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHBjMnN0cigKLWphdmEuc2VjdXJpdHkuUHJpbmNpcGFsKQotCi1wdWJsaWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmZvcnRyZXNzLkRlZmF1bHRQb2xpY3lQYXJzZXIkUGVybWlzc2lvbkV4cGFuZGVyIGNvbmZpZ3VyZSgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5EZWZhdWx0UG9saWN5U2Nhbm5lciRHcmFudEVudHJ5Ci1qYXZhLnNlY3VyaXR5LktleVN0b3JlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvZm9ydHJlc3MvUG9saWN5VXRpbHMkRXhwYW5zaW9uRmFpbGVkRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyByZXNvbHZlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvZm9ydHJlc3MvRGVmYXVsdFBvbGljeVBhcnNlciRQZXJtaXNzaW9uRXhwYW5kZXI7ICkKLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuZm9ydHJlc3MuRGVmYXVsdFBvbGljeVBhcnNlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuRGVmYXVsdFBvbGljeVNjYW5uZXIgc2Nhbm5lcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5EZWZhdWx0UG9saWN5U2Nhbm5lcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9LZXlTdG9yZUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgamF2YS5zZWN1cml0eS5QcmluY2lwYWwgZ2V0UHJpbmNpcGFsQnlBbGlhcygKLWphdmEuc2VjdXJpdHkuS2V5U3RvcmUKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTGlzdDxMb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L0RlZmF1bHRQb2xpY3lTY2FubmVyJEtleXN0b3JlRW50cnk7PjtMamF2YS9uZXQvVVJMO0xqYXZhL3V0aWwvUHJvcGVydGllcztaKUxqYXZhL3NlY3VyaXR5L0tleVN0b3JlOyApCi1wcm90ZWN0ZWQgamF2YS5zZWN1cml0eS5LZXlTdG9yZSBpbml0S2V5U3RvcmUoCi1qYXZhLnV0aWwuTGlzdAotamF2YS5uZXQuVVJMCi1qYXZhLnV0aWwuUHJvcGVydGllcwotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbmV0L1VSTDtMamF2YS91dGlsL1Byb3BlcnRpZXM7KUxqYXZhL3V0aWwvQ29sbGVjdGlvbjxMb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L1BvbGljeUVudHJ5Oz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEudXRpbC5Db2xsZWN0aW9uIHBhcnNlKAotamF2YS5uZXQuVVJMCi1qYXZhLnV0aWwuUHJvcGVydGllcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5Qb2xpY3lFbnRyeSByZXNvbHZlR3JhbnQoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuRGVmYXVsdFBvbGljeVNjYW5uZXIkR3JhbnRFbnRyeQotamF2YS5zZWN1cml0eS5LZXlTdG9yZQotamF2YS51dGlsLlByb3BlcnRpZXMKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9FeGNlcHRpb247ICkKLXByb3RlY3RlZCBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb24gcmVzb2x2ZVBlcm1pc3Npb24oCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuRGVmYXVsdFBvbGljeVNjYW5uZXIkUGVybWlzc2lvbkVudHJ5Ci1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuRGVmYXVsdFBvbGljeVNjYW5uZXIkR3JhbnRFbnRyeQotamF2YS5zZWN1cml0eS5LZXlTdG9yZQotamF2YS51dGlsLlByb3BlcnRpZXMKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9FeGNlcHRpb247ICkKLXByb3RlY3RlZCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVbXSByZXNvbHZlU2lnbmVycygKLWphdmEuc2VjdXJpdHkuS2V5U3RvcmUKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmZvcnRyZXNzLkVuZ2luZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuZm9ydHJlc3MuU2VjdXJpdHlBY2Nlc3MgZG9vcgotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbGFzdEFsZ29yaXRobQotCi1wdWJsaWMgamF2YS5zZWN1cml0eS5Qcm92aWRlciBwcm92aWRlcgotCi1wcml2YXRlIGludCByZWZyZXNoTnVtYmVyCi0KLXByaXZhdGUgamF2YS5zZWN1cml0eS5Qcm92aWRlciRTZXJ2aWNlIHJldHVybmVkU2VydmljZQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgc2VydmljZU5hbWUKLQotcHVibGljIGphdmEubGFuZy5PYmplY3Qgc3BpCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGdldEluc3RhbmNlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGdldEluc3RhbmNlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5zZWN1cml0eS5Qcm92aWRlcgotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvc2VjdXJpdHkvUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjxMamF2YS9uZXQvVVJMOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLWZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5mb3J0cmVzcy5Qb2xpY3lVdGlscyQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBqYXZhLmlvLkZpbGUgdmFsJGYKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLmlvLkZpbGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IHJ1bigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLm5ldC5VUkwgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9RXhwYW5zaW9uRmFpbGVkRXhjZXB0aW9uICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvZm9ydHJlc3MvUG9saWN5VXRpbHM7ICkKLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuZm9ydHJlc3MuUG9saWN5VXRpbHMkRXhwYW5zaW9uRmFpbGVkRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLkV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvc2VjdXJpdHkvUHJpdmlsZWdlZEFjdGlvbjxUVDs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L2ZvcnRyZXNzL1BvbGljeVV0aWxzOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9UHJvdmlkZXJMb2FkZXIgKQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5mb3J0cmVzcy5Qb2xpY3lVdGlscyRQcm92aWRlckxvYWRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL0NsYXNzPFRUOz47ICkKLXByaXZhdGUgamF2YS5sYW5nLkNsYXNzIGV4cGVjdGVkVHlwZQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcga2V5Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9DbGFzczxUVDs+OylWICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5DbGFzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKVRUOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS9zZWN1cml0eS9Qcml2aWxlZ2VkQWN0aW9uPExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvZm9ydHJlc3MvUG9saWN5VXRpbHM7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1TZWN1cml0eVByb3BlcnR5QWNjZXNzb3IgKQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5mb3J0cmVzcy5Qb2xpY3lVdGlscyRTZWN1cml0eVByb3BlcnR5QWNjZXNzb3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBrZXkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvc2VjdXJpdHkvUHJpdmlsZWdlZEFjdGlvbjxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wdWJsaWMgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uIGtleSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IHJ1bigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3NlY3VyaXR5L1ByaXZpbGVnZWRBY3Rpb248TGphdmEvdXRpbC9Qcm9wZXJ0aWVzOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1TeXN0ZW1LaXQgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS9mb3J0cmVzcy9Qb2xpY3lVdGlsczsgKQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5mb3J0cmVzcy5Qb2xpY3lVdGlscyRTeXN0ZW1LaXQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgcnVuKCkKLQotcHVibGljIGphdmEudXRpbC5Qcm9wZXJ0aWVzIHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3NlY3VyaXR5L1ByaXZpbGVnZWRBY3Rpb248TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPVN5c3RlbVByb3BlcnR5QWNjZXNzb3IgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS9mb3J0cmVzcy9Qb2xpY3lVdGlsczsgKQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5mb3J0cmVzcy5Qb2xpY3lVdGlscyRTeXN0ZW1Qcm9wZXJ0eUFjY2Vzc29yIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBrZXkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvc2VjdXJpdHkvUHJpdmlsZWdlZEFjdGlvbjxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wdWJsaWMgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uIGtleSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IHJ1bigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS9mb3J0cmVzcy9Qb2xpY3lVdGlsczsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPVVSTExvYWRlciApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvc2VjdXJpdHkvUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjxMamF2YS9pby9JbnB1dFN0cmVhbTs+OyApCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmZvcnRyZXNzLlBvbGljeVV0aWxzJFVSTExvYWRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGphdmEubmV0LlVSTCBsb2NhdGlvbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubmV0LlVSTCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuaW8uSW5wdXRTdHJlYW0gcnVuKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0V4Y2VwdGlvbjsgKQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvZm9ydHJlc3MvUG9saWN5VXRpbHMkR2VuZXJhbEV4cGFuc2lvbkhhbmRsZXI7TG9yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS9mb3J0cmVzcy9Qb2xpY3lVdGlscyRFeHBhbnNpb25GYWlsZWRFeGNlcHRpb247TG9yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS9mb3J0cmVzcy9Qb2xpY3lVdGlscyRQcm92aWRlckxvYWRlcjtMb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L2ZvcnRyZXNzL1BvbGljeVV0aWxzJFNlY3VyaXR5UHJvcGVydHlBY2Nlc3NvcjtMb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L2ZvcnRyZXNzL1BvbGljeVV0aWxzJFN5c3RlbVByb3BlcnR5QWNjZXNzb3I7TG9yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS9mb3J0cmVzcy9Qb2xpY3lVdGlscyRTeXN0ZW1LaXQ7TG9yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS9mb3J0cmVzcy9Qb2xpY3lVdGlscyRVUkxMb2FkZXI7ICkKLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuZm9ydHJlc3MuUG9saWN5VXRpbHMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBGQUxTRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQ2xhc3NbXSBOT19BUkdTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5DbGFzc1tdIE9ORV9BUkdTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQT0xJQ1lfQUxMT1dfRFlOQU1JQwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUE9MSUNZX0VYUEFORAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVFJVRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuQ2xhc3NbXSBUV09fQVJHUwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjYW5FeHBhbmRQcm9wZXJ0aWVzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L2ZvcnRyZXNzL1BvbGljeVV0aWxzJEV4cGFuc2lvbkZhaWxlZEV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGV4cGFuZCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudXRpbC5Qcm9wZXJ0aWVzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvZm9ydHJlc3MvUG9saWN5VXRpbHMkRXhwYW5zaW9uRmFpbGVkRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZXhwYW5kR2VuZXJhbCgKLWphdmEubGFuZy5TdHJpbmcKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5mb3J0cmVzcy5Qb2xpY3lVdGlscyRHZW5lcmFsRXhwYW5zaW9uSGFuZGxlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L2ZvcnRyZXNzL1BvbGljeVV0aWxzJEV4cGFuc2lvbkZhaWxlZEV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGV4cGFuZFVSTCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudXRpbC5Qcm9wZXJ0aWVzKQotCi1wdWJsaWMgc3RhdGljIGphdmEubmV0LlVSTFtdIGdldFBvbGljeVVSTHMoCi1qYXZhLnV0aWwuUHJvcGVydGllcwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9DbGFzczwqPjtMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspTGphdmEvc2VjdXJpdHkvUGVybWlzc2lvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbiBpbnN0YW50aWF0ZVBlcm1pc3Npb24oCi1qYXZhLmxhbmcuQ2xhc3MKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBtYXRjaFN1YnNldCgKLWphdmEubGFuZy5PYmplY3RbXQotamF2YS5sYW5nLk9iamVjdFtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL0NvbGxlY3Rpb248TGphdmEvc2VjdXJpdHkvUGVybWlzc2lvbjs+OylMamF2YS9zZWN1cml0eS9QZXJtaXNzaW9uQ29sbGVjdGlvbjsgKQotcHVibGljIHN0YXRpYyBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb25Db2xsZWN0aW9uIHRvUGVybWlzc2lvbkNvbGxlY3Rpb24oCi1qYXZhLnV0aWwuQ29sbGVjdGlvbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuZm9ydHJlc3MuU2VjdXJpdHlVdGlscyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL1dlYWtIYXNoTWFwPExqYXZhL2xhbmcvVGhyZWFkO0xqYXZhL3NlY3VyaXR5L0FjY2Vzc0NvbnRyb2xDb250ZXh0Oz47ICkKLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEudXRpbC5XZWFrSGFzaE1hcCBBQ0NfQ0FDSEUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9TZWN1cml0eUV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xDb250ZXh0IGdldENvbnRleHQoCi1qYXZhLmxhbmcuVGhyZWFkKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvU2VjdXJpdHlFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgdm9pZCBwdXRDb250ZXh0KAotamF2YS5sYW5nLlRocmVhZAotamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sQ29udGV4dCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvc2VjdXJpdHkvUHJpdmlsZWdlZEFjdGlvbjxMamF2YS9sYW5nL09iamVjdDs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L2ZvcnRyZXNzL1NlcnZpY2VzOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1maW5hbCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuZm9ydHJlc3MuU2VydmljZXMkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5mb3J0cmVzcy5TZXJ2aWNlcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBuZWVkUmVmcmVzaAotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvTGlzdDxMamF2YS9zZWN1cml0eS9Qcm92aWRlcjs+OyApCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuTGlzdCBwcm92aWRlcnMKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9zZWN1cml0eS9Qcm92aWRlcjs+OyApCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuTWFwIHByb3ZpZGVyc05hbWVzCi0KLXB1YmxpYyBzdGF0aWMgaW50IHJlZnJlc2hOdW1iZXIKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9zZWN1cml0eS9Qcm92aWRlciRTZXJ2aWNlOz47ICkKLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEudXRpbC5NYXAgc2VydmljZXMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXN0YXRpYyB2b2lkIGFjY2VzcyQwMDAoKQotCi1wdWJsaWMgc3RhdGljIGphdmEuc2VjdXJpdHkuUHJvdmlkZXIgZ2V0UHJvdmlkZXIoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGphdmEuc2VjdXJpdHkuUHJvdmlkZXJbXSBnZXRQcm92aWRlcnMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPSgpTGphdmEvdXRpbC9MaXN0PExqYXZhL3NlY3VyaXR5L1Byb3ZpZGVyOz47ICkKLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLkxpc3QgZ2V0UHJvdmlkZXJzTGlzdCgpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5zZWN1cml0eS5Qcm92aWRlciRTZXJ2aWNlIGdldFNlcnZpY2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgaW5pdFNlcnZpY2VJbmZvKAotamF2YS5zZWN1cml0eS5Qcm92aWRlcikKLQotcHVibGljIHN0YXRpYyBpbnQgaW5zZXJ0UHJvdmlkZXJBdCgKLWphdmEuc2VjdXJpdHkuUHJvdmlkZXIKLWludCkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzRW1wdHkoKQotCi1wcml2YXRlIHN0YXRpYyB2b2lkIGxvYWRQcm92aWRlcnMoKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRTZXJ2aWNlcygpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCByZWZyZXNoKCkKLQotcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZVByb3ZpZGVyKAotaW50KQotCi1wdWJsaWMgc3RhdGljIHZvaWQgc2V0TmVlZFJlZnJlc2goKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgdXBkYXRlU2VydmljZUluZm8oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5pbnRlcm5hbC5ubHMuTWVzc2FnZXMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgc1Jlc291cmNlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1jaGFyKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nKAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0W10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS9wa2NzMTAvQ2VydGlmaWNhdGlvblJlcXVlc3Q7ICkKLWZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5wa2NzMTAuQ2VydGlmaWNhdGlvblJlcXVlc3QkMSBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXF1ZW5jZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFUeXBlW10pCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldERlY29kZWRPYmplY3QoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5CZXJJbnB1dFN0cmVhbSkKLQotcHJvdGVjdGVkIHZvaWQgZ2V0VmFsdWVzKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdFtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5wa2NzMTAuQ2VydGlmaWNhdGlvblJlcXVlc3QgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVNlcXVlbmNlIEFTTjEKLQotcHJpdmF0ZSBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyIGFsZ0lkCi0KLXByaXZhdGUgYnl0ZVtdIGVuY29kaW5nCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnBrY3MxMC5DZXJ0aWZpY2F0aW9uUmVxdWVzdEluZm8gaW5mbwotCi1wcml2YXRlIGJ5dGVbXSBzaWduYXR1cmUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5wa2NzMTAuQ2VydGlmaWNhdGlvblJlcXVlc3RJbmZvCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyCi1ieXRlW10pCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkucGtjczEwLkNlcnRpZmljYXRpb25SZXF1ZXN0SW5mbwotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuQWxnb3JpdGhtSWRlbnRpZmllcgotYnl0ZVtdCi1ieXRlW10pCi0KLSB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5wa2NzMTAuQ2VydGlmaWNhdGlvblJlcXVlc3RJbmZvCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyCi1ieXRlW10KLWJ5dGVbXQotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnBrY3MxMC5DZXJ0aWZpY2F0aW9uUmVxdWVzdCQxKQotCi1zdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnBrY3MxMC5DZXJ0aWZpY2F0aW9uUmVxdWVzdEluZm8gYWNjZXNzJDEwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5wa2NzMTAuQ2VydGlmaWNhdGlvblJlcXVlc3QpCi0KLXN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyIGFjY2VzcyQyMDAoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkucGtjczEwLkNlcnRpZmljYXRpb25SZXF1ZXN0KQotCi1zdGF0aWMgYnl0ZVtdIGFjY2VzcyQzMDAoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkucGtjczEwLkNlcnRpZmljYXRpb25SZXF1ZXN0KQotCi1wdWJsaWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuQWxnb3JpdGhtSWRlbnRpZmllciBnZXRBbGdJZCgpCi0KLXB1YmxpYyBieXRlW10gZ2V0RW5jb2RlZCgpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkucGtjczEwLkNlcnRpZmljYXRpb25SZXF1ZXN0SW5mbyBnZXRJbmZvKCkKLQotcHVibGljIGJ5dGVbXSBnZXRTaWduYXR1cmUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvcGtjczEwL0NlcnRpZmljYXRpb25SZXF1ZXN0SW5mbzsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotZmluYWwgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnBrY3MxMC5DZXJ0aWZpY2F0aW9uUmVxdWVzdEluZm8kMSBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXF1ZW5jZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFUeXBlW10pCi0KLXByb3RlY3RlZCBqYXZhLmxhbmcuT2JqZWN0IGdldERlY29kZWRPYmplY3QoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5CZXJJbnB1dFN0cmVhbSkKLQotcHJvdGVjdGVkIHZvaWQgZ2V0VmFsdWVzKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdFtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5wa2NzMTAuQ2VydGlmaWNhdGlvblJlcXVlc3RJbmZvIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXF1ZW5jZSBBU04xCi0KLXByaXZhdGUgamF2YS51dGlsLkxpc3QgYXR0cmlidXRlcwotCi1wcml2YXRlIGJ5dGVbXSBlbmNvZGluZwotCi1wcml2YXRlIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTAxLk5hbWUgc3ViamVjdAotCi1wcml2YXRlIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LlN1YmplY3RQdWJsaWNLZXlJbmZvIHN1YmplY3RQdWJsaWNLZXlJbmZvCi0KLXByaXZhdGUgaW50IHZlcnNpb24KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDEuTmFtZQotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuU3ViamVjdFB1YmxpY0tleUluZm8KLWphdmEudXRpbC5MaXN0KQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotaW50Ci1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwMS5OYW1lCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5TdWJqZWN0UHVibGljS2V5SW5mbwotamF2YS51dGlsLkxpc3QKLWJ5dGVbXSkKLQotIHZvaWQgPGluaXQ+KAotaW50Ci1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwMS5OYW1lCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5TdWJqZWN0UHVibGljS2V5SW5mbwotamF2YS51dGlsLkxpc3QKLWJ5dGVbXQotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnBrY3MxMC5DZXJ0aWZpY2F0aW9uUmVxdWVzdEluZm8kMSkKLQotc3RhdGljIGludCBhY2Nlc3MkMTAwKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnBrY3MxMC5DZXJ0aWZpY2F0aW9uUmVxdWVzdEluZm8pCi0KLXN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwMS5OYW1lIGFjY2VzcyQyMDAoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkucGtjczEwLkNlcnRpZmljYXRpb25SZXF1ZXN0SW5mbykKLQotc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LlN1YmplY3RQdWJsaWNLZXlJbmZvIGFjY2VzcyQzMDAoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkucGtjczEwLkNlcnRpZmljYXRpb25SZXF1ZXN0SW5mbykKLQotc3RhdGljIGphdmEudXRpbC5MaXN0IGFjY2VzcyQ0MDAoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkucGtjczEwLkNlcnRpZmljYXRpb25SZXF1ZXN0SW5mbykKLQotcHVibGljIGphdmEudXRpbC5MaXN0IGdldEF0dHJpYnV0ZXMoKQotCi1wdWJsaWMgYnl0ZVtdIGdldEVuY29kZWQoKQotCi1wdWJsaWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDEuTmFtZSBnZXRTdWJqZWN0KCkKLQotcHVibGljIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LlN1YmplY3RQdWJsaWNLZXlJbmZvIGdldFN1YmplY3RQdWJsaWNLZXlJbmZvKCkKLQotcHVibGljIGludCBnZXRWZXJzaW9uKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvcGtjczcvQXV0aGVudGljYXRlZEF0dHJpYnV0ZXM7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLWZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5wa2NzNy5BdXRoZW50aWNhdGVkQXR0cmlidXRlcyQxIGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVNldE9mCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVR5cGUpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldERlY29kZWRPYmplY3QoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5CZXJJbnB1dFN0cmVhbSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLSBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkucGtjczcuQXV0aGVudGljYXRlZEF0dHJpYnV0ZXMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVNldE9mIEFTTjEKLQotcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdCBhdXRoZW50aWNhdGVkQXR0cmlidXRlcwotCi1wcml2YXRlIGJ5dGVbXSBlbmNvZGluZwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYnl0ZVtdCi1qYXZhLnV0aWwuTGlzdCkKLQotcHVibGljIGphdmEudXRpbC5MaXN0IGdldEF0dHJpYnV0ZXMoKQotCi1wdWJsaWMgYnl0ZVtdIGdldEVuY29kZWQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvcGtjczcvQ29udGVudEluZm87ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLWZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5wa2NzNy5Db250ZW50SW5mbyQxIGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVNlcXVlbmNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVR5cGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGphdmEubGFuZy5PYmplY3QgZ2V0RGVjb2RlZE9iamVjdCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkJlcklucHV0U3RyZWFtKQotCi1wcm90ZWN0ZWQgdm9pZCBnZXRWYWx1ZXMoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0W10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnBrY3M3LkNvbnRlbnRJbmZvIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXF1ZW5jZSBBU04xCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gREFUQQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIERJR0VTVEVEX0RBVEEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBFTkNSWVBURURfREFUQQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEVOVkVMT1BFRF9EQVRBCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gU0lHTkVEX0FORF9FTlZFTE9QRURfREFUQQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIFNJR05FRF9EQVRBCi0KLXByaXZhdGUgamF2YS5sYW5nLk9iamVjdCBjb250ZW50Ci0KLXByaXZhdGUgYnl0ZVtdIGVuY29kaW5nCi0KLXByaXZhdGUgaW50W10gb2lkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnRbXQotamF2YS5sYW5nLk9iamVjdCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWludFtdCi1qYXZhLmxhbmcuT2JqZWN0Ci1ieXRlW10pCi0KLSB2b2lkIDxpbml0PigKLWludFtdCi1qYXZhLmxhbmcuT2JqZWN0Ci1ieXRlW10KLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5wa2NzNy5Db250ZW50SW5mbyQxKQotCi1zdGF0aWMgaW50W10gYWNjZXNzJDAwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5wa2NzNy5Db250ZW50SW5mbykKLQotc3RhdGljIGphdmEubGFuZy5PYmplY3QgYWNjZXNzJDEwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5wa2NzNy5Db250ZW50SW5mbykKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0Q29udGVudCgpCi0KLXB1YmxpYyBpbnRbXSBnZXRDb250ZW50VHlwZSgpCi0KLXB1YmxpYyBieXRlW10gZ2V0RW5jb2RlZCgpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkucGtjczcuU2lnbmVkRGF0YSBnZXRTaWduZWREYXRhKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvcGtjczcvU2lnbmVkRGF0YTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotZmluYWwgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnBrY3M3LlNpZ25lZERhdGEkMSBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXF1ZW5jZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFUeXBlW10pCi0KLXByb3RlY3RlZCBqYXZhLmxhbmcuT2JqZWN0IGdldERlY29kZWRPYmplY3QoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5CZXJJbnB1dFN0cmVhbSkKLQotcHJvdGVjdGVkIHZvaWQgZ2V0VmFsdWVzKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdFtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5wa2NzNy5TaWduZWREYXRhIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXF1ZW5jZSBBU04xCi0KLXByaXZhdGUgamF2YS51dGlsLkxpc3QgY2VydGlmaWNhdGVzCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnBrY3M3LkNvbnRlbnRJbmZvIGNvbnRlbnRJbmZvCi0KLXByaXZhdGUgamF2YS51dGlsLkxpc3QgY3JscwotCi1wcml2YXRlIGphdmEudXRpbC5MaXN0IGRpZ2VzdEFsZ29yaXRobXMKLQotcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdCBzaWduZXJJbmZvcwotCi1wcml2YXRlIGludCB2ZXJzaW9uCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWphdmEudXRpbC5MaXN0Ci1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkucGtjczcuQ29udGVudEluZm8KLWphdmEudXRpbC5MaXN0Ci1qYXZhLnV0aWwuTGlzdAotamF2YS51dGlsLkxpc3QpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDAwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5wa2NzNy5TaWduZWREYXRhKQotCi1zdGF0aWMgamF2YS51dGlsLkxpc3QgYWNjZXNzJDEwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5wa2NzNy5TaWduZWREYXRhKQotCi1zdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnBrY3M3LkNvbnRlbnRJbmZvIGFjY2VzcyQyMDAoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkucGtjczcuU2lnbmVkRGF0YSkKLQotc3RhdGljIGphdmEudXRpbC5MaXN0IGFjY2VzcyQzMDAoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkucGtjczcuU2lnbmVkRGF0YSkKLQotc3RhdGljIGphdmEudXRpbC5MaXN0IGFjY2VzcyQ0MDAoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkucGtjczcuU2lnbmVkRGF0YSkKLQotc3RhdGljIGphdmEudXRpbC5MaXN0IGFjY2VzcyQ1MDAoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkucGtjczcuU2lnbmVkRGF0YSkKLQotcHVibGljIGphdmEudXRpbC5MaXN0IGdldENSTHMoKQotCi1wdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0Q2VydGlmaWNhdGVzKCkKLQotcHVibGljIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5wa2NzNy5Db250ZW50SW5mbyBnZXRDb250ZW50SW5mbygpCi0KLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXREaWdlc3RBbGdvcml0aG1zKCkKLQotcHVibGljIGphdmEudXRpbC5MaXN0IGdldFNpZ25lckluZm9zKCkKLQotcHVibGljIGludCBnZXRWZXJzaW9uKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvcGtjczcvU2lnbmVySW5mbzsgKQotZmluYWwgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnBrY3M3LlNpZ25lckluZm8kMSBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXF1ZW5jZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFUeXBlW10pCi0KLXB1YmxpYyB2b2lkIGdldFZhbHVlcygKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3RbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3BrY3M3L1NpZ25lckluZm87ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLWZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5wa2NzNy5TaWduZXJJbmZvJDIgZXh0ZW5kcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xU2VxdWVuY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xVHlwZVtdKQotCi1wcm90ZWN0ZWQgamF2YS5sYW5nLk9iamVjdCBnZXREZWNvZGVkT2JqZWN0KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVySW5wdXRTdHJlYW0pCi0KLXByb3RlY3RlZCB2b2lkIGdldFZhbHVlcygKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3RbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkucGtjczcuU2lnbmVySW5mbyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xU2VxdWVuY2UgQVNOMQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXF1ZW5jZSBJU1NVRVJfQU5EX1NFUklBTF9OVU1CRVIKLQotcHJpdmF0ZSBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkucGtjczcuQXV0aGVudGljYXRlZEF0dHJpYnV0ZXMgYXV0aGVudGljYXRlZEF0dHJpYnV0ZXMKLQotcHJpdmF0ZSBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyIGRpZ2VzdEFsZ29yaXRobQotCi1wcml2YXRlIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIgZGlnZXN0RW5jcnlwdGlvbkFsZ29yaXRobQotCi1wcml2YXRlIGJ5dGVbXSBlbmNyeXB0ZWREaWdlc3QKLQotcHJpdmF0ZSBqYXZheC5zZWN1cml0eS5hdXRoLng1MDAuWDUwMFByaW5jaXBhbCBpc3N1ZXIKLQotcHJpdmF0ZSBqYXZhLm1hdGguQmlnSW50ZWdlciBzZXJpYWxOdW1iZXIKLQotcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdCB1bmF1dGhlbnRpY2F0ZWRBdHRyaWJ1dGVzCi0KLXByaXZhdGUgaW50IHZlcnNpb24KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotamF2YS5sYW5nLk9iamVjdFtdCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkucGtjczcuQXV0aGVudGljYXRlZEF0dHJpYnV0ZXMKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIKLWJ5dGVbXQotamF2YS51dGlsLkxpc3QpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDAwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5wa2NzNy5TaWduZXJJbmZvKQotCi1zdGF0aWMgamF2YXguc2VjdXJpdHkuYXV0aC54NTAwLlg1MDBQcmluY2lwYWwgYWNjZXNzJDEwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5wa2NzNy5TaWduZXJJbmZvKQotCi1zdGF0aWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgYWNjZXNzJDIwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5wa2NzNy5TaWduZXJJbmZvKQotCi1zdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuQWxnb3JpdGhtSWRlbnRpZmllciBhY2Nlc3MkMzAwKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnBrY3M3LlNpZ25lckluZm8pCi0KLXN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkucGtjczcuQXV0aGVudGljYXRlZEF0dHJpYnV0ZXMgYWNjZXNzJDQwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5wa2NzNy5TaWduZXJJbmZvKQotCi1zdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuQWxnb3JpdGhtSWRlbnRpZmllciBhY2Nlc3MkNTAwKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnBrY3M3LlNpZ25lckluZm8pCi0KLXN0YXRpYyBieXRlW10gYWNjZXNzJDYwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5wa2NzNy5TaWduZXJJbmZvKQotCi1zdGF0aWMgamF2YS51dGlsLkxpc3QgYWNjZXNzJDcwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5wa2NzNy5TaWduZXJJbmZvKQotCi1wdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0QXV0aGVudGljYXRlZEF0dHJpYnV0ZXMoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXREaWdlc3RBbGdvcml0aG0oKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXREaWdlc3RFbmNyeXB0aW9uQWxnb3JpdGhtKCkKLQotcHVibGljIGJ5dGVbXSBnZXRFbmNvZGVkQXV0aGVudGljYXRlZEF0dHJpYnV0ZXMoKQotCi1wdWJsaWMgYnl0ZVtdIGdldEVuY3J5cHRlZERpZ2VzdCgpCi0KLXB1YmxpYyBqYXZheC5zZWN1cml0eS5hdXRoLng1MDAuWDUwMFByaW5jaXBhbCBnZXRJc3N1ZXIoKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgZ2V0U2VyaWFsTnVtYmVyKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0ZGlnZXN0QWxnb3JpdGhtKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkvcGtjczgvUHJpdmF0ZUtleUluZm87ICkKLWZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5wa2NzOC5Qcml2YXRlS2V5SW5mbyQxIGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVNlcXVlbmNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVR5cGVbXSkKLQotcHJvdGVjdGVkIGphdmEubGFuZy5PYmplY3QgZ2V0RGVjb2RlZE9iamVjdCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkJlcklucHV0U3RyZWFtKQotCi1wcm90ZWN0ZWQgdm9pZCBnZXRWYWx1ZXMoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0W10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnBrY3M4LlByaXZhdGVLZXlJbmZvIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXF1ZW5jZSBBU04xCi0KLXByaXZhdGUgamF2YS51dGlsLkxpc3QgYXR0cmlidXRlcwotCi1wcml2YXRlIGJ5dGVbXSBlbmNvZGluZwotCi1wcml2YXRlIGJ5dGVbXSBwcml2YXRlS2V5Ci0KLXByaXZhdGUgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuQWxnb3JpdGhtSWRlbnRpZmllciBwcml2YXRlS2V5QWxnb3JpdGhtCi0KLXByaXZhdGUgaW50IHZlcnNpb24KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuQWxnb3JpdGhtSWRlbnRpZmllcgotYnl0ZVtdCi1qYXZhLnV0aWwuTGlzdCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWludAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuQWxnb3JpdGhtSWRlbnRpZmllcgotYnl0ZVtdCi1qYXZhLnV0aWwuTGlzdAotYnl0ZVtdKQotCi0gdm9pZCA8aW5pdD4oCi1pbnQKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIKLWJ5dGVbXQotamF2YS51dGlsLkxpc3QKLWJ5dGVbXQotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnBrY3M4LlByaXZhdGVLZXlJbmZvJDEpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDEwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5wa2NzOC5Qcml2YXRlS2V5SW5mbykKLQotc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIgYWNjZXNzJDIwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5wa2NzOC5Qcml2YXRlS2V5SW5mbykKLQotc3RhdGljIGJ5dGVbXSBhY2Nlc3MkMzAwKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnBrY3M4LlByaXZhdGVLZXlJbmZvKQotCi1zdGF0aWMgamF2YS51dGlsLkxpc3QgYWNjZXNzJDQwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5wa2NzOC5Qcml2YXRlS2V5SW5mbykKLQotcHVibGljIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIgZ2V0QWxnb3JpdGhtSWRlbnRpZmllcigpCi0KLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRBdHRyaWJ1dGVzKCkKLQotcHVibGljIGJ5dGVbXSBnZXRFbmNvZGVkKCkKLQotcHVibGljIGJ5dGVbXSBnZXRQcml2YXRlS2V5KCkKLQotcHVibGljIGludCBnZXRWZXJzaW9uKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkucHJvdmlkZXIuY2VydC5DYWNoZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBIQVNIX01BU0sKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOREVYX01BU0sKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBQUkVGSVhfSEFTSF9NQVNLCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLk9iamVjdFtdIGNhY2hlCi0KLXByaXZhdGUgYm9vbGVhbiBjYWNoZV9pc19mdWxsCi0KLXByaXZhdGUgZmluYWwgaW50IGNhY2hlX3NpemUKLQotcHJpdmF0ZSBmaW5hbCBieXRlW11bXSBlbmNvZGluZ3MKLQotcHJpdmF0ZSBmaW5hbCBsb25nW10gaGFzaGVzCi0KLXByaXZhdGUgZmluYWwgbG9uZ1tdIGhhc2hlc19pZHgKLQotcHJpdmF0ZSBpbnQgbGFzdF9jYWNoZWQKLQotcHJpdmF0ZSBmaW5hbCBpbnQgcHJlZml4X3NpemUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotaW50KQotCi1wcml2YXRlIGxvbmcgZ2V0U3VmZkhhc2goCi1ieXRlW10pCi0KLXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKAotbG9uZykKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0KAotbG9uZwotYnl0ZVtdKQotCi1wdWJsaWMgbG9uZyBnZXRIYXNoKAotYnl0ZVtdKQotCi1wdWJsaWMgdm9pZCBwdXQoCi1sb25nCi1ieXRlW10KLWphdmEubGFuZy5PYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3NlY3VyaXR5L1ByaXZpbGVnZWRBY3Rpb248TGphdmEvbGFuZy9Wb2lkOz47ICkKLSBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkucHJvdmlkZXIuY2VydC5EUkxDZXJ0RmFjdG9yeSQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkucHJvdmlkZXIuY2VydC5EUkxDZXJ0RmFjdG9yeSB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkucHJvdmlkZXIuY2VydC5EUkxDZXJ0RmFjdG9yeSkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgcnVuKCkKLQotcHVibGljIGphdmEubGFuZy5Wb2lkIHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnByb3ZpZGVyLmNlcnQuRFJMQ2VydEZhY3RvcnkgZXh0ZW5kcyBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnByb3ZpZGVyLmNlcnQuWDUwOUNSTEVudHJ5SW1wbCBleHRlbmRzIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q1JMRW50cnkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBieXRlW10gZW5jb2RpbmcKLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5FeHRlbnNpb25zIGV4dGVuc2lvbnMKLQotcHJpdmF0ZSBmaW5hbCBqYXZheC5zZWN1cml0eS5hdXRoLng1MDAuWDUwMFByaW5jaXBhbCBpc3N1ZXIKLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5UQlNDZXJ0TGlzdCRSZXZva2VkQ2VydGlmaWNhdGUgcmNlcnQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5UQlNDZXJ0TGlzdCRSZXZva2VkQ2VydGlmaWNhdGUKLWphdmF4LnNlY3VyaXR5LmF1dGgueDUwMC5YNTAwUHJpbmNpcGFsKQotCi1wdWJsaWMgamF2YXguc2VjdXJpdHkuYXV0aC54NTAwLlg1MDBQcmluY2lwYWwgZ2V0Q2VydGlmaWNhdGVJc3N1ZXIoKQotCi1wdWJsaWMgamF2YS51dGlsLlNldCBnZXRDcml0aWNhbEV4dGVuc2lvbk9JRHMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L2NlcnQvQ1JMRXhjZXB0aW9uOyApCi1wdWJsaWMgYnl0ZVtdIGdldEVuY29kZWQoKQotCi1wdWJsaWMgYnl0ZVtdIGdldEV4dGVuc2lvblZhbHVlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEudXRpbC5TZXQgZ2V0Tm9uQ3JpdGljYWxFeHRlbnNpb25PSURzKCkKLQotcHVibGljIGphdmEudXRpbC5EYXRlIGdldFJldm9jYXRpb25EYXRlKCkKLQotcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldFNlcmlhbE51bWJlcigpCi0KLXB1YmxpYyBib29sZWFuIGhhc0V4dGVuc2lvbnMoKQotCi1wdWJsaWMgYm9vbGVhbiBoYXNVbnN1cHBvcnRlZENyaXRpY2FsRXh0ZW5zaW9uKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5wcm92aWRlci5jZXJ0Llg1MDlDUkxJbXBsIGV4dGVuZHMgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDUkwKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5DZXJ0aWZpY2F0ZUxpc3QgY3JsCi0KLXByaXZhdGUgYnl0ZVtdIGVuY29kaW5nCi0KLXByaXZhdGUgamF2YS51dGlsLkFycmF5TGlzdCBlbnRyaWVzCi0KLXByaXZhdGUgYm9vbGVhbiBlbnRyaWVzUmV0cmlldmVkCi0KLXByaXZhdGUgaW50IGVudHJpZXNTaXplCi0KLXByaXZhdGUgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuRXh0ZW5zaW9ucyBleHRlbnNpb25zCi0KLXByaXZhdGUgYm9vbGVhbiBpc0luZGlyZWN0Q1JMCi0KLXByaXZhdGUgamF2YXguc2VjdXJpdHkuYXV0aC54NTAwLlg1MDBQcmluY2lwYWwgaXNzdWVyCi0KLXByaXZhdGUgaW50IG5vbkluZGlyZWN0RW50cmllc1NpemUKLQotcHJpdmF0ZSBib29sZWFuIG51bGxTaWdBbGdQYXJhbXMKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHNpZ0FsZ05hbWUKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHNpZ0FsZ09JRAotCi1wcml2YXRlIGJ5dGVbXSBzaWdBbGdQYXJhbXMKLQotcHJpdmF0ZSBieXRlW10gc2lnbmF0dXJlCi0KLXByaXZhdGUgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuVEJTQ2VydExpc3QgdGJzQ2VydExpc3QKLQotcHJpdmF0ZSBieXRlW10gdGJzQ2VydExpc3RFbmNvZGluZwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvY2VydC9DUkxFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uSW5wdXRTdHJlYW0pCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkNlcnRpZmljYXRlTGlzdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotYnl0ZVtdKQotCi1wcml2YXRlIHZvaWQgcmV0aXJpZXZlRW50cmllcygpCi0KLXB1YmxpYyBqYXZhLnV0aWwuU2V0IGdldENyaXRpY2FsRXh0ZW5zaW9uT0lEcygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvY2VydC9DUkxFeGNlcHRpb247ICkKLXB1YmxpYyBieXRlW10gZ2V0RW5jb2RlZCgpCi0KLXB1YmxpYyBieXRlW10gZ2V0RXh0ZW5zaW9uVmFsdWUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5zZWN1cml0eS5QcmluY2lwYWwgZ2V0SXNzdWVyRE4oKQotCi1wdWJsaWMgamF2YXguc2VjdXJpdHkuYXV0aC54NTAwLlg1MDBQcmluY2lwYWwgZ2V0SXNzdWVyWDUwMFByaW5jaXBhbCgpCi0KLXB1YmxpYyBqYXZhLnV0aWwuRGF0ZSBnZXROZXh0VXBkYXRlKCkKLQotcHVibGljIGphdmEudXRpbC5TZXQgZ2V0Tm9uQ3JpdGljYWxFeHRlbnNpb25PSURzKCkKLQotcHVibGljIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q1JMRW50cnkgZ2V0UmV2b2tlZENlcnRpZmljYXRlKAotamF2YS5tYXRoLkJpZ0ludGVnZXIpCi0KLXB1YmxpYyBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNSTEVudHJ5IGdldFJldm9rZWRDZXJ0aWZpY2F0ZSgKLWphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGUpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KClMamF2YS91dGlsL1NldDwrTGphdmEvc2VjdXJpdHkvY2VydC9YNTA5Q1JMRW50cnk7PjsgKQotcHVibGljIGphdmEudXRpbC5TZXQgZ2V0UmV2b2tlZENlcnRpZmljYXRlcygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFNpZ0FsZ05hbWUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTaWdBbGdPSUQoKQotCi1wdWJsaWMgYnl0ZVtdIGdldFNpZ0FsZ1BhcmFtcygpCi0KLXB1YmxpYyBieXRlW10gZ2V0U2lnbmF0dXJlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9jZXJ0L0NSTEV4Y2VwdGlvbjsgKQotcHVibGljIGJ5dGVbXSBnZXRUQlNDZXJ0TGlzdCgpCi0KLXB1YmxpYyBqYXZhLnV0aWwuRGF0ZSBnZXRUaGlzVXBkYXRlKCkKLQotcHVibGljIGludCBnZXRWZXJzaW9uKCkKLQotcHVibGljIGJvb2xlYW4gaGFzVW5zdXBwb3J0ZWRDcml0aWNhbEV4dGVuc2lvbigpCi0KLXB1YmxpYyBib29sZWFuIGlzUmV2b2tlZCgKLWphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZSkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L2NlcnQvQ1JMRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L05vU3VjaFByb3ZpZGVyRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L1NpZ25hdHVyZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgdmVyaWZ5KAotamF2YS5zZWN1cml0eS5QdWJsaWNLZXkpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvY2VydC9DUkxFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvTm9TdWNoUHJvdmlkZXJFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvU2lnbmF0dXJlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB2ZXJpZnkoCi1qYXZhLnNlY3VyaXR5LlB1YmxpY0tleQotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Byb3ZpZGVyL2NlcnQvWDUwOUNlcnRGYWN0b3J5SW1wbDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1SZXN0b3JpbmdJbnB1dFN0cmVhbSApCi0gY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnByb3ZpZGVyLmNlcnQuWDUwOUNlcnRGYWN0b3J5SW1wbCRSZXN0b3JpbmdJbnB1dFN0cmVhbSBleHRlbmRzIGphdmEuaW8uSW5wdXRTdHJlYW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZfU0laRQotCi1wcml2YXRlIGludCBiYXIKLQotcHJpdmF0ZSBmaW5hbCBpbnRbXSBidWZmCi0KLXByaXZhdGUgaW50IGVuZAotCi1wcml2YXRlIGZpbmFsIGphdmEuaW8uSW5wdXRTdHJlYW0gaW5TdHJlYW0KLQotcHJpdmF0ZSBpbnQgcG9zCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5JbnB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCBhdmFpbGFibGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjbG9zZSgpCi0KLXB1YmxpYyB2b2lkIG1hcmsoCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcmVhZCgKLWJ5dGVbXQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHJlc2V0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGxvbmcgc2tpcCgKLWxvbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Byb3ZpZGVyL2NlcnQvWDUwOUNlcnRGYWN0b3J5SW1wbCRSZXN0b3JpbmdJbnB1dFN0cmVhbTsgKQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5wcm92aWRlci5jZXJ0Llg1MDlDZXJ0RmFjdG9yeUltcGwgZXh0ZW5kcyBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVGYWN0b3J5U3BpCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGJ5dGVbXSBDRVJUX0JPVU5EX1NVRkZJWAotCi1wcml2YXRlIHN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkucHJvdmlkZXIuY2VydC5DYWNoZSBDRVJUX0NBQ0hFCi0KLXByaXZhdGUgc3RhdGljIGludCBDRVJUX0NBQ0hFX1NFRURfTEVOR1RICi0KLXByaXZhdGUgc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5wcm92aWRlci5jZXJ0LkNhY2hlIENSTF9DQUNIRQotCi1wcml2YXRlIHN0YXRpYyBpbnQgQ1JMX0NBQ0hFX1NFRURfTEVOR1RICi0KLXByaXZhdGUgc3RhdGljIGJ5dGVbXSBGUkVFX0JPVU5EX1NVRkZJWAotCi1wcml2YXRlIHN0YXRpYyBieXRlW10gcGVtQmVnaW4KLQotcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIHBlbUNsb3NlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIGJ5dGVbXSBkZWNvZGVQRU0oCi1qYXZhLmlvLklucHV0U3RyZWFtCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvY2VydC9DUkxFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgc3RhdGljIGphdmEuc2VjdXJpdHkuY2VydC5DUkwgZ2V0Q1JMKAotamF2YS5pby5JbnB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9jZXJ0L0NSTEV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBzdGF0aWMgamF2YS5zZWN1cml0eS5jZXJ0LkNSTCBnZXRDUkwoCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBzdGF0aWMgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlIGdldENlcnRpZmljYXRlKAotamF2YS5pby5JbnB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHN0YXRpYyBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGUgZ2V0Q2VydGlmaWNhdGUoCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgc3RhdGljIGJ5dGVbXSByZWFkQnl0ZXMoCi1qYXZhLmlvLklucHV0U3RyZWFtCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvY2VydC9DUkxFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnNlY3VyaXR5LmNlcnQuQ1JMIGVuZ2luZUdlbmVyYXRlQ1JMKAotamF2YS5pby5JbnB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9jZXJ0L0NSTEV4Y2VwdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS9pby9JbnB1dFN0cmVhbTspTGphdmEvdXRpbC9Db2xsZWN0aW9uPCtMamF2YS9zZWN1cml0eS9jZXJ0L0NSTDs+OyApCi1wdWJsaWMgamF2YS51dGlsLkNvbGxlY3Rpb24gZW5naW5lR2VuZXJhdGVDUkxzKAotamF2YS5pby5JbnB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoIGVuZ2luZUdlbmVyYXRlQ2VydFBhdGgoCi1qYXZhLmlvLklucHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGggZW5naW5lR2VuZXJhdGVDZXJ0UGF0aCgKLWphdmEuaW8uSW5wdXRTdHJlYW0KLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0UGF0aCBlbmdpbmVHZW5lcmF0ZUNlcnRQYXRoKAotamF2YS51dGlsLkxpc3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZSBlbmdpbmVHZW5lcmF0ZUNlcnRpZmljYXRlKAotamF2YS5pby5JbnB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRXhjZXB0aW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL2lvL0lucHV0U3RyZWFtOylMamF2YS91dGlsL0NvbGxlY3Rpb248K0xqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGU7PjsgKQotcHVibGljIGphdmEudXRpbC5Db2xsZWN0aW9uIGVuZ2luZUdlbmVyYXRlQ2VydGlmaWNhdGVzKAotamF2YS5pby5JbnB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvSXRlcmF0b3I8TGphdmEvbGFuZy9TdHJpbmc7PjsgKQotcHVibGljIGphdmEudXRpbC5JdGVyYXRvciBlbmdpbmVHZXRDZXJ0UGF0aEVuY29kaW5ncygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnByb3ZpZGVyLmNlcnQuWDUwOUNlcnRJbXBsIGV4dGVuZHMgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5DZXJ0aWZpY2F0ZSBjZXJ0aWZpY2F0ZQotCi1wcml2YXRlIGJ5dGVbXSBlbmNvZGluZwotCi1wcml2YXRlIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkV4dGVuc2lvbnMgZXh0ZW5zaW9ucwotCi1wcml2YXRlIGphdmF4LnNlY3VyaXR5LmF1dGgueDUwMC5YNTAwUHJpbmNpcGFsIGlzc3VlcgotCi1wcml2YXRlIGxvbmcgbm90QWZ0ZXIKLQotcHJpdmF0ZSBsb25nIG5vdEJlZm9yZQotCi1wcml2YXRlIGJvb2xlYW4gbnVsbFNpZ0FsZ1BhcmFtcwotCi1wcml2YXRlIGphdmEuc2VjdXJpdHkuUHVibGljS2V5IHB1YmxpY0tleQotCi1wcml2YXRlIGphdmEubWF0aC5CaWdJbnRlZ2VyIHNlcmlhbE51bWJlcgotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgc2lnQWxnTmFtZQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgc2lnQWxnT0lECi0KLXByaXZhdGUgYnl0ZVtdIHNpZ0FsZ1BhcmFtcwotCi1wcml2YXRlIGJ5dGVbXSBzaWduYXR1cmUKLQotcHJpdmF0ZSBqYXZheC5zZWN1cml0eS5hdXRoLng1MDAuWDUwMFByaW5jaXBhbCBzdWJqZWN0Ci0KLXByaXZhdGUgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuVEJTQ2VydGlmaWNhdGUgdGJzQ2VydAotCi1wcml2YXRlIGJ5dGVbXSB0YnNDZXJ0aWZpY2F0ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5JbnB1dFN0cmVhbSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuQ2VydGlmaWNhdGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9TaWduYXR1cmVFeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCBmYXN0VmVyaWZ5KAotamF2YS5zZWN1cml0eS5QdWJsaWNLZXkpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUV4cGlyZWRFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZU5vdFlldFZhbGlkRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjaGVja1ZhbGlkaXR5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRXhwaXJlZEV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlTm90WWV0VmFsaWRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNoZWNrVmFsaWRpdHkoCi1qYXZhLnV0aWwuRGF0ZSkKLQotcHVibGljIGludCBnZXRCYXNpY0NvbnN0cmFpbnRzKCkKLQotcHVibGljIGphdmEudXRpbC5TZXQgZ2V0Q3JpdGljYWxFeHRlbnNpb25PSURzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb247ICkKLXB1YmxpYyBieXRlW10gZ2V0RW5jb2RlZCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRFeHRlbmRlZEtleVVzYWdlKCkKLQotcHVibGljIGJ5dGVbXSBnZXRFeHRlbnNpb25WYWx1ZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnV0aWwuQ29sbGVjdGlvbiBnZXRJc3N1ZXJBbHRlcm5hdGl2ZU5hbWVzKCkKLQotcHVibGljIGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsIGdldElzc3VlckROKCkKLQotcHVibGljIGJvb2xlYW5bXSBnZXRJc3N1ZXJVbmlxdWVJRCgpCi0KLXB1YmxpYyBqYXZheC5zZWN1cml0eS5hdXRoLng1MDAuWDUwMFByaW5jaXBhbCBnZXRJc3N1ZXJYNTAwUHJpbmNpcGFsKCkKLQotcHVibGljIGJvb2xlYW5bXSBnZXRLZXlVc2FnZSgpCi0KLXB1YmxpYyBqYXZhLnV0aWwuU2V0IGdldE5vbkNyaXRpY2FsRXh0ZW5zaW9uT0lEcygpCi0KLXB1YmxpYyBqYXZhLnV0aWwuRGF0ZSBnZXROb3RBZnRlcigpCi0KLXB1YmxpYyBqYXZhLnV0aWwuRGF0ZSBnZXROb3RCZWZvcmUoKQotCi1wdWJsaWMgamF2YS5zZWN1cml0eS5QdWJsaWNLZXkgZ2V0UHVibGljS2V5KCkKLQotcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldFNlcmlhbE51bWJlcigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFNpZ0FsZ05hbWUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTaWdBbGdPSUQoKQotCi1wdWJsaWMgYnl0ZVtdIGdldFNpZ0FsZ1BhcmFtcygpCi0KLXB1YmxpYyBieXRlW10gZ2V0U2lnbmF0dXJlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlUGFyc2luZ0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEudXRpbC5Db2xsZWN0aW9uIGdldFN1YmplY3RBbHRlcm5hdGl2ZU5hbWVzKCkKLQotcHVibGljIGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsIGdldFN1YmplY3RETigpCi0KLXB1YmxpYyBib29sZWFuW10gZ2V0U3ViamVjdFVuaXF1ZUlEKCkKLQotcHVibGljIGphdmF4LnNlY3VyaXR5LmF1dGgueDUwMC5YNTAwUHJpbmNpcGFsIGdldFN1YmplY3RYNTAwUHJpbmNpcGFsKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb247ICkKLXB1YmxpYyBieXRlW10gZ2V0VEJTQ2VydGlmaWNhdGUoKQotCi1wdWJsaWMgaW50IGdldFZlcnNpb24oKQotCi1wdWJsaWMgYm9vbGVhbiBoYXNVbnN1cHBvcnRlZENyaXRpY2FsRXh0ZW5zaW9uKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvTm9TdWNoUHJvdmlkZXJFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvU2lnbmF0dXJlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB2ZXJpZnkoCi1qYXZhLnNlY3VyaXR5LlB1YmxpY0tleSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L05vU3VjaFByb3ZpZGVyRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L1NpZ25hdHVyZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgdmVyaWZ5KAotamF2YS5zZWN1cml0eS5QdWJsaWNLZXkKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS9wcm92aWRlci9jZXJ0L1g1MDlDZXJ0UGF0aEltcGw7ICkKLWZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5wcm92aWRlci5jZXJ0Llg1MDlDZXJ0UGF0aEltcGwkMSBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXF1ZW5jZU9mCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVR5cGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldERlY29kZWRPYmplY3QoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5CZXJJbnB1dFN0cmVhbSkKLQotcHVibGljIGphdmEudXRpbC5Db2xsZWN0aW9uIGdldFZhbHVlcygKLWphdmEubGFuZy5PYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS9wcm92aWRlci9jZXJ0L1g1MDlDZXJ0UGF0aEltcGw7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLWZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5wcm92aWRlci5jZXJ0Llg1MDlDZXJ0UGF0aEltcGwkMiBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXF1ZW5jZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGJ5dGVbXSBQUkVDQUxDVUxBVEVEX0hFQUQKLQotcHJpdmF0ZSBmaW5hbCBieXRlW10gU0lHTkVSU19JTkZPCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVR5cGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZGVjb2RlKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVySW5wdXRTdHJlYW0pCi0KLXByb3RlY3RlZCB2b2lkIGdldFZhbHVlcygKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3RbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Byb3ZpZGVyL2NlcnQvWDUwOUNlcnRQYXRoSW1wbDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotZmluYWwgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnByb3ZpZGVyLmNlcnQuWDUwOUNlcnRQYXRoSW1wbCQzIGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVNlcXVlbmNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgYnl0ZVtdIFNJR05FRF9EQVRBX09JRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFUeXBlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGRlY29kZSgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkJlcklucHV0U3RyZWFtKQotCi1wcm90ZWN0ZWQgdm9pZCBnZXRWYWx1ZXMoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0W10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnByb3ZpZGVyLmNlcnQuWDUwOUNlcnRQYXRoSW1wbCBleHRlbmRzIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0UGF0aAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXF1ZW5jZU9mIEFTTjEKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVNlcXVlbmNlIEFTTjFfU0lHTkVEX0RBVEEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEtDUzcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVNlcXVlbmNlIFBLQ1M3X1NJR05FRF9EQVRBX09CSkVDVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQS0lfUEFUSAotCi1zdGF0aWMgZmluYWwgamF2YS51dGlsLkxpc3QgZW5jb2RpbmdzCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmdbXSBlbmNvZGluZ3NBcnIKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0KLXByaXZhdGUgZmluYWwgamF2YS51dGlsLkxpc3QgY2VydGlmaWNhdGVzCi0KLXByaXZhdGUgYnl0ZVtdIHBrY3M3RW5jb2RpbmcKLQotcHJpdmF0ZSBieXRlW10gcGtpUGF0aEVuY29kaW5nCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEudXRpbC5MaXN0KQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkxpc3QKLWludAotYnl0ZVtdKQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuTGlzdAotaW50Ci1ieXRlW10KLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5wcm92aWRlci5jZXJ0Llg1MDlDZXJ0UGF0aEltcGwkMSkKLQotc3RhdGljIGphdmEudXRpbC5MaXN0IGFjY2VzcyQxMDAoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkucHJvdmlkZXIuY2VydC5YNTA5Q2VydFBhdGhJbXBsKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnByb3ZpZGVyLmNlcnQuWDUwOUNlcnRQYXRoSW1wbCBnZXRJbnN0YW5jZSgKLWphdmEuaW8uSW5wdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkucHJvdmlkZXIuY2VydC5YNTA5Q2VydFBhdGhJbXBsIGdldEluc3RhbmNlKAotamF2YS5pby5JbnB1dFN0cmVhbQotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5wcm92aWRlci5jZXJ0Llg1MDlDZXJ0UGF0aEltcGwgZ2V0SW5zdGFuY2UoCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkucHJvdmlkZXIuY2VydC5YNTA5Q2VydFBhdGhJbXBsIGdldEluc3RhbmNlKAotYnl0ZVtdCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0Q2VydGlmaWNhdGVzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb247ICkKLXB1YmxpYyBieXRlW10gZ2V0RW5jb2RlZCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uOyApCi1wdWJsaWMgYnl0ZVtdIGdldEVuY29kZWQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS51dGlsLkl0ZXJhdG9yIGdldEVuY29kaW5ncygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3NlY3VyaXR5L1ByaXZpbGVnZWRBY3Rpb248TGphdmEvbGFuZy9Wb2lkOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLSBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkucHJvdmlkZXIuY3J5cHRvLkNyeXB0b1Byb3ZpZGVyJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5wcm92aWRlci5jcnlwdG8uQ3J5cHRvUHJvdmlkZXIgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnByb3ZpZGVyLmNyeXB0by5DcnlwdG9Qcm92aWRlcikKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgcnVuKCkKLQotcHVibGljIGphdmEubGFuZy5Wb2lkIHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnByb3ZpZGVyLmNyeXB0by5DcnlwdG9Qcm92aWRlciBleHRlbmRzIGphdmEuc2VjdXJpdHkuUHJvdmlkZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkucHJvdmlkZXIuY3J5cHRvLkRTQUtleUZhY3RvcnlJbXBsIGV4dGVuZHMgamF2YS5zZWN1cml0eS5LZXlGYWN0b3J5U3BpCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9zcGVjL0ludmFsaWRLZXlTcGVjRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgamF2YS5zZWN1cml0eS5Qcml2YXRlS2V5IGVuZ2luZUdlbmVyYXRlUHJpdmF0ZSgKLWphdmEuc2VjdXJpdHkuc3BlYy5LZXlTcGVjKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L3NwZWMvSW52YWxpZEtleVNwZWNFeGNlcHRpb247ICkKLXByb3RlY3RlZCBqYXZhLnNlY3VyaXR5LlB1YmxpY0tleSBlbmdpbmVHZW5lcmF0ZVB1YmxpYygKLWphdmEuc2VjdXJpdHkuc3BlYy5LZXlTcGVjKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L3NwZWMvSW52YWxpZEtleVNwZWNFeGNlcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID08VDo6TGphdmEvc2VjdXJpdHkvc3BlYy9LZXlTcGVjOz4oTGphdmEvc2VjdXJpdHkvS2V5O0xqYXZhL2xhbmcvQ2xhc3M8VFQ7PjspVFQ7ICkKLXByb3RlY3RlZCBqYXZhLnNlY3VyaXR5LnNwZWMuS2V5U3BlYyBlbmdpbmVHZXRLZXlTcGVjKAotamF2YS5zZWN1cml0eS5LZXkKLWphdmEubGFuZy5DbGFzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgamF2YS5zZWN1cml0eS5LZXkgZW5naW5lVHJhbnNsYXRlS2V5KAotamF2YS5zZWN1cml0eS5LZXkpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnByb3ZpZGVyLmNyeXB0by5EU0FQcml2YXRlS2V5SW1wbCBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5Qcml2YXRlS2V5SW1wbCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcy5EU0FQcml2YXRlS2V5Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRAotCi1wcml2YXRlIGphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcy5EU0FQYXJhbXMgcGFyYW1zCi0KLXByaXZhdGUgamF2YS5tYXRoLkJpZ0ludGVnZXIgeAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuc2VjdXJpdHkuc3BlYy5EU0FQcml2YXRlS2V5U3BlYykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9zcGVjL0ludmFsaWRLZXlTcGVjRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnNlY3VyaXR5LnNwZWMuUEtDUzhFbmNvZGVkS2V5U3BlYykKLQotcHVibGljIGphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcy5EU0FQYXJhbXMgZ2V0UGFyYW1zKCkKLQotcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldFgoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5wcm92aWRlci5jcnlwdG8uRFNBUHVibGljS2V5SW1wbCBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5QdWJsaWNLZXlJbXBsIGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5pbnRlcmZhY2VzLkRTQVB1YmxpY0tleQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQKLQotcHJpdmF0ZSBqYXZhLnNlY3VyaXR5LmludGVyZmFjZXMuRFNBUGFyYW1zIHBhcmFtcwotCi1wcml2YXRlIGphdmEubWF0aC5CaWdJbnRlZ2VyIHkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnNlY3VyaXR5LnNwZWMuRFNBUHVibGljS2V5U3BlYykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9zcGVjL0ludmFsaWRLZXlTcGVjRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnNlY3VyaXR5LnNwZWMuWDUwOUVuY29kZWRLZXlTcGVjKQotCi1wdWJsaWMgamF2YS5zZWN1cml0eS5pbnRlcmZhY2VzLkRTQVBhcmFtcyBnZXRQYXJhbXMoKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgZ2V0WSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS9wcm92aWRlci9jcnlwdG8vUmFuZG9tQml0c1N1cHBsaWVyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1maW5hbCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkucHJvdmlkZXIuY3J5cHRvLlJhbmRvbUJpdHNTdXBwbGllciQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5wcm92aWRlci5jcnlwdG8uU0hBMV9EYXRhIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCWVRFU19PRkZTRVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gREVWSUNFX05BTUVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJR0VTVF9MRU5HVEgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSDAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSDEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSDIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSDMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSDQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSEFTSF9PRkZTRVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIExJQlJBUllfTkFNRQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkucHJvdmlkZXIuY3J5cHRvLlJhbmRvbUJpdHNTdXBwbGllciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkucHJvdmlkZXIuY3J5cHRvLlNIQTFfRGF0YQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbSBiaXMKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5pby5GaWxlIHJhbmRvbUZpbGUKLQotcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzZXJ2aWNlQXZhaWxhYmxlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1zdGF0aWMgamF2YS5pby5GaWxlSW5wdXRTdHJlYW0gYWNjZXNzJDAwMigKLWphdmEuaW8uRmlsZUlucHV0U3RyZWFtKQotCi1zdGF0aWMgamF2YS5pby5GaWxlIGFjY2VzcyQxMDIoCi1qYXZhLmlvLkZpbGUpCi0KLXByaXZhdGUgc3RhdGljIGJ5dGVbXSBnZXRMaW51eFJhbmRvbUJpdHMoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGdldFJhbmRvbUJpdHMoCi1pbnQpCi0KLXN0YXRpYyBib29sZWFuIGlzU2VydmljZUF2YWlsYWJsZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnByb3ZpZGVyLmNyeXB0by5TSEExSW1wbCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkucHJvdmlkZXIuY3J5cHRvLlNIQTFfRGF0YQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXN0YXRpYyB2b2lkIGNvbXB1dGVIYXNoKAotaW50W10pCi0KLXN0YXRpYyB2b2lkIHVwZGF0ZUhhc2goCi1pbnRbXQotYnl0ZVtdCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkucHJvdmlkZXIuY3J5cHRvLlNIQTFQUk5HX1NlY3VyZVJhbmRvbUltcGwgZXh0ZW5kcyBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbVNwaSBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlLCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkucHJvdmlkZXIuY3J5cHRvLlNIQTFfRGF0YQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09VTlRFUl9CQVNFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIEVORF9GTEFHUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVhUUkFGUkFNRV9PRkZTRVQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZSQU1FX0xFTkdUSAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRlJBTUVfT0ZGU0VUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIQVNIQllURVNfVE9fVVNFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIQVNIQ09QWV9PRkZTRVQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gTEVGVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBNQVNLCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfQllURVMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5FWFRfQllURVMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gUklHSFQxCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIFJJR0hUMgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VUX1NFRUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVOREVGSU5FRAotCi1wcml2YXRlIHN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkucHJvdmlkZXIuY3J5cHRvLlNIQTFQUk5HX1NlY3VyZVJhbmRvbUltcGwgbXlSYW5kb20KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlECi0KLXByaXZhdGUgdHJhbnNpZW50IGludFtdIGNvcGllcwotCi1wcml2YXRlIHRyYW5zaWVudCBsb25nIGNvdW50ZXIKLQotcHJpdmF0ZSB0cmFuc2llbnQgaW50IG5leHRCSW5kZXgKLQotcHJpdmF0ZSB0cmFuc2llbnQgYnl0ZVtdIG5leHRCeXRlcwotCi1wcml2YXRlIHRyYW5zaWVudCBpbnRbXSBzZWVkCi0KLXByaXZhdGUgdHJhbnNpZW50IGxvbmcgc2VlZExlbmd0aAotCi1wcml2YXRlIHRyYW5zaWVudCBpbnQgc3RhdGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgcmVhZE9iamVjdCgKLWphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0pCi0KLXByaXZhdGUgdm9pZCB1cGRhdGVTZWVkKAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoCi1qYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSkKLQotcHJvdGVjdGVkIGJ5dGVbXSBlbmdpbmVHZW5lcmF0ZVNlZWQoCi1pbnQpCi0KLXByb3RlY3RlZCB2b2lkIGVuZ2luZU5leHRCeXRlcygKLWJ5dGVbXSkKLQotcHJvdGVjdGVkIHZvaWQgZW5naW5lU2V0U2VlZCgKLWJ5dGVbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkucHJvdmlkZXIuY3J5cHRvLlNIQTFfTWVzc2FnZURpZ2VzdEltcGwgZXh0ZW5kcyBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3RTcGkgaW1wbGVtZW50cyBqYXZhLmxhbmcuQ2xvbmVhYmxlLCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkucHJvdmlkZXIuY3J5cHRvLlNIQTFfRGF0YQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGludFtdIGJ1ZmZlcgotCi1wcml2YXRlIGludCBtZXNzYWdlTGVuZ3RoCi0KLXByaXZhdGUgYnl0ZVtdIG9uZUJ5dGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIHZvaWQgcHJvY2Vzc0RpZ2VzdCgKLWJ5dGVbXQotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGNsb25lKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9EaWdlc3RFeGNlcHRpb247ICkKLXByb3RlY3RlZCBpbnQgZW5naW5lRGlnZXN0KAotYnl0ZVtdCi1pbnQKLWludCkKLQotcHJvdGVjdGVkIGJ5dGVbXSBlbmdpbmVEaWdlc3QoKQotCi1wcm90ZWN0ZWQgaW50IGVuZ2luZUdldERpZ2VzdExlbmd0aCgpCi0KLXByb3RlY3RlZCB2b2lkIGVuZ2luZVJlc2V0KCkKLQotcHJvdGVjdGVkIHZvaWQgZW5naW5lVXBkYXRlKAotYnl0ZSkKLQotcHJvdGVjdGVkIHZvaWQgZW5naW5lVXBkYXRlKAotYnl0ZVtdCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkucHJvdmlkZXIuY3J5cHRvLlNIQTF3aXRoRFNBX1NpZ25hdHVyZUltcGwgZXh0ZW5kcyBqYXZhLnNlY3VyaXR5LlNpZ25hdHVyZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcy5EU0FLZXkgZHNhS2V5Ci0KLXByaXZhdGUgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0IG1zZ0RpZ2VzdAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L1NpZ25hdHVyZUV4Y2VwdGlvbjsgKQotcHJpdmF0ZSBib29sZWFuIGNoZWNrU2lnbmF0dXJlKAotYnl0ZVtdCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9JbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgamF2YS5sYW5nLk9iamVjdCBlbmdpbmVHZXRQYXJhbWV0ZXIoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIGVuZ2luZUluaXRTaWduKAotamF2YS5zZWN1cml0eS5Qcml2YXRlS2V5KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIGVuZ2luZUluaXRWZXJpZnkoCi1qYXZhLnNlY3VyaXR5LlB1YmxpY0tleSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9JbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBlbmdpbmVTZXRQYXJhbWV0ZXIoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L1NpZ25hdHVyZUV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGJ5dGVbXSBlbmdpbmVTaWduKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9TaWduYXR1cmVFeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIGVuZ2luZVVwZGF0ZSgKLWJ5dGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvU2lnbmF0dXJlRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBlbmdpbmVVcGRhdGUoCi1ieXRlW10KLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L1NpZ25hdHVyZUV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGJvb2xlYW4gZW5naW5lVmVyaWZ5KAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L1NpZ25hdHVyZUV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGJvb2xlYW4gZW5naW5lVmVyaWZ5KAotYnl0ZVtdCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3Byb3ZpZGVyL2NyeXB0by9UaHJlZUludGVnZXJTZXF1ZW5jZTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotZmluYWwgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnByb3ZpZGVyLmNyeXB0by5UaHJlZUludGVnZXJTZXF1ZW5jZSQxIGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVNlcXVlbmNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVR5cGVbXSkKLQotcHJvdGVjdGVkIGphdmEubGFuZy5PYmplY3QgZ2V0RGVjb2RlZE9iamVjdCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkJlcklucHV0U3RyZWFtKQotCi1wcm90ZWN0ZWQgdm9pZCBnZXRWYWx1ZXMoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0W10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi0gY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnByb3ZpZGVyLmNyeXB0by5UaHJlZUludGVnZXJTZXF1ZW5jZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xU2VxdWVuY2UgQVNOMQotCi1wcml2YXRlIGJ5dGVbXSBlbmNvZGluZwotCi0gYnl0ZVtdIGcKLQotIGJ5dGVbXSBwCi0KLSBieXRlW10gcQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KAotYnl0ZVtdCi1ieXRlW10KLWJ5dGVbXSkKLQotcHVibGljIGJ5dGVbXSBnZXRFbmNvZGVkKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudXRpbHMuQWxnTmFtZU1hcHBlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuTWFwIGFsZzJPaWRNYXAKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzs+OyApCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuTWFwIGFsZ0FsaWFzZXNNYXAKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZ1tdW10ga25vd25BbGdNYXBwaW5ncwotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOz47ICkKLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEudXRpbC5NYXAgb2lkMkFsZ01hcAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gc2VydmljZU5hbWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZHVtcCgpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdGFuZGFyZE5hbWUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNPSUQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgbWFwMkFsZ05hbWUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgbWFwMk9JRCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBub3JtYWxpemUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHN0YXRpYyB2b2lkIHNlbGVjdEVudHJpZXMoCi1qYXZhLnNlY3VyaXR5LlByb3ZpZGVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS51dGlscy5BcnJheSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKAotYnl0ZVtdCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS51dGlscy5KYXJVdGlscyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gTUVTU0FHRV9ESUdFU1RfT0lECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlW10gY3JlYXRlQ2hhaW4oCi1qYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlCi1qYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlW10pCi0KLXByaXZhdGUgc3RhdGljIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGUgZmluZENlcnQoCi1qYXZhLnNlY3VyaXR5LlByaW5jaXBhbAotamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L0dlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVbXSB2ZXJpZnlTaWduYXR1cmUoCi1qYXZhLmlvLklucHV0U3RyZWFtCi1qYXZhLmlvLklucHV0U3RyZWFtKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS51dGlscy5PYmplY3RJZGVudGlmaWVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEubGFuZy5PYmplY3QgZ3JvdXAKLQotcHJpdmF0ZSBpbnQgaGFzaAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbmFtZQotCi1wcml2YXRlIGZpbmFsIGludFtdIG9pZAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgc09JRAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgc29pZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludFtdKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnRbXQotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHN0YXRpYyBpbnQgaGFzaEludEFycmF5KAotaW50W10pCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZU9pZCgKLWludFtdKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRHcm91cCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE5hbWUoKQotCi1wdWJsaWMgaW50W10gZ2V0T2lkKCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvT0lEU3RyaW5nKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTAxLkF0dHJpYnV0ZVR5cGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5PYmplY3RJZGVudGlmaWVyIG9pZAotCi1wdWJsaWMgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVR5cGUgdHlwZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLk9iamVjdElkZW50aWZpZXIKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFUeXBlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkveDUwMS9BdHRyaWJ1dGVUeXBlQW5kVmFsdWU7ICkKLWZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTAxLkF0dHJpYnV0ZVR5cGVBbmRWYWx1ZSQxIGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVR5cGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIGNoZWNrVGFnKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBkZWNvZGUoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5CZXJJbnB1dFN0cmVhbSkKLQotcHVibGljIHZvaWQgZW5jb2RlQVNOKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVyT3V0cHV0U3RyZWFtKQotCi1wdWJsaWMgdm9pZCBlbmNvZGVDb250ZW50KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVyT3V0cHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXREZWNvZGVkT2JqZWN0KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVySW5wdXRTdHJlYW0pCi0KLXB1YmxpYyBpbnQgZ2V0RW5jb2RlZExlbmd0aCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkJlck91dHB1dFN0cmVhbSkKLQotcHVibGljIHZvaWQgc2V0RW5jb2RpbmdDb250ZW50KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVyT3V0cHV0U3RyZWFtKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkveDUwMS9BdHRyaWJ1dGVUeXBlQW5kVmFsdWU7ICkKLWZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTAxLkF0dHJpYnV0ZVR5cGVBbmRWYWx1ZSQyIGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVNlcXVlbmNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVR5cGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGphdmEubGFuZy5PYmplY3QgZ2V0RGVjb2RlZE9iamVjdCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkJlcklucHV0U3RyZWFtKQotCi1wcm90ZWN0ZWQgdm9pZCBnZXRWYWx1ZXMoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0W10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDEuQXR0cmlidXRlVHlwZUFuZFZhbHVlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXF1ZW5jZSBBU04xCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVR5cGUgQXR0cmlidXRlVmFsdWUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnV0aWxzLk9iamVjdElkZW50aWZpZXIgQwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0FQQUNJVFkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnV0aWxzLk9iamVjdElkZW50aWZpZXIgQ04KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnV0aWxzLk9iamVjdElkZW50aWZpZXIgREMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnV0aWxzLk9iamVjdElkZW50aWZpZXIgRE5RCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS51dGlscy5PYmplY3RJZGVudGlmaWVyIEROUVVBTElGSUVSCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS51dGlscy5PYmplY3RJZGVudGlmaWVyIEVNQUlMQUREUkVTUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudXRpbHMuT2JqZWN0SWRlbnRpZmllciBHRU5FUkFUSU9OCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS51dGlscy5PYmplY3RJZGVudGlmaWVyIEdJVkVOTkFNRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudXRpbHMuT2JqZWN0SWRlbnRpZmllciBJTklUSUFMUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuSGFzaE1hcCBLTk9XTl9OQU1FUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudXRpbHMuT2JqZWN0SWRlbnRpZmllcltdW10gS05PV05fT0lEUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudXRpbHMuT2JqZWN0SWRlbnRpZmllciBMCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS51dGlscy5PYmplY3RJZGVudGlmaWVyIE8KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnV0aWxzLk9iamVjdElkZW50aWZpZXIgT1UKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS51dGlsLkhhc2hNYXAgUkZDMTc3OV9OQU1FUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuSGFzaE1hcCBSRkMyMjUzX05BTUVTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEudXRpbC5IYXNoTWFwIFJGQzI0NTlfTkFNRVMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnV0aWxzLk9iamVjdElkZW50aWZpZXIgU0VSSUFMTlVNQkVSCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS51dGlscy5PYmplY3RJZGVudGlmaWVyIFNUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS51dGlscy5PYmplY3RJZGVudGlmaWVyIFNUUkVFVAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudXRpbHMuT2JqZWN0SWRlbnRpZmllciBTVVJOQU1FCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS51dGlscy5PYmplY3RJZGVudGlmaWVyIFQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnV0aWxzLk9iamVjdElkZW50aWZpZXIgVUlECi0KLXByaXZhdGUgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnV0aWxzLk9iamVjdElkZW50aWZpZXIgb2lkCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDEuQXR0cmlidXRlVmFsdWUgdmFsdWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTAxLkF0dHJpYnV0ZVZhbHVlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotaW50W10KLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTAxLkF0dHJpYnV0ZVZhbHVlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi0gdm9pZCA8aW5pdD4oCi1pbnRbXQotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDEuQXR0cmlidXRlVmFsdWUKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTAxLkF0dHJpYnV0ZVR5cGVBbmRWYWx1ZSQxKQotCi1zdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnV0aWxzLk9iamVjdElkZW50aWZpZXIgYWNjZXNzJDEwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTAxLkF0dHJpYnV0ZVR5cGVBbmRWYWx1ZSkKLQotc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTAxLkF0dHJpYnV0ZVZhbHVlIGFjY2VzcyQyMDAoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwMS5BdHRyaWJ1dGVUeXBlQW5kVmFsdWUpCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgYWRkT0lEKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnV0aWxzLk9iamVjdElkZW50aWZpZXIpCi0KLXByaXZhdGUgc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS51dGlscy5PYmplY3RJZGVudGlmaWVyIGdldE9JRCgKLWludFtdKQotCi1wcml2YXRlIHN0YXRpYyBpbnQgaGFzaEludEFycmF5KAotaW50W10pCi0KLXB1YmxpYyB2b2lkIGFwcGVuZE5hbWUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nQnVmZmVyKQotCi1wdWJsaWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LnV0aWxzLk9iamVjdElkZW50aWZpZXIgZ2V0VHlwZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDEuQXR0cmlidXRlVHlwZUFuZFZhbHVlQ29tcGFyYXRvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnV0aWwuQ29tcGFyYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgc3RhdGljIGludCBjb21wYXRlT2lkcygKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS51dGlscy5PYmplY3RJZGVudGlmaWVyCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkudXRpbHMuT2JqZWN0SWRlbnRpZmllcikKLQotcHVibGljIGludCBjb21wYXJlKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwMS5BdHRyaWJ1dGVWYWx1ZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGJ5dGVbXSBieXRlcwotCi1wdWJsaWMgYnl0ZVtdIGVuY29kZWQKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZXNjYXBlZFN0cmluZwotCi1wdWJsaWMgYm9vbGVhbiBoYXNRRQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgaGV4U3RyaW5nCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHJhd1N0cmluZwotCi1wcml2YXRlIGludCB0YWcKLQotcHVibGljIGZpbmFsIGJvb2xlYW4gd2FzRW5jb2RlZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWJ5dGVbXSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotYnl0ZVtdCi1pbnQpCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBtYWtlRXNjYXBlZCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIGFwcGVuZFFFU3RyaW5nKAotamF2YS5sYW5nLlN0cmluZ0J1ZmZlcikKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SGV4U3RyaW5nKCkKLQotcHVibGljIGludCBnZXRUYWcoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBtYWtlQ2Fub25pY2FsKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwMS5BdHRyaWJ1dGVzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVNlcXVlbmNlIGdldEFTTjEoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5JbmZvcm1hdGlvbk9iamVjdFNldCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3g1MDEvRGlyZWN0b3J5U3RyaW5nOyApCi1maW5hbCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwMS5EaXJlY3RvcnlTdHJpbmckMSBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFDaG9pY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xVHlwZVtdKQotCi1wdWJsaWMgaW50IGdldEluZGV4KAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0T2JqZWN0VG9FbmNvZGUoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTAxLkRpcmVjdG9yeVN0cmluZyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xQ2hvaWNlIEFTTjEKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS94NTAxL05hbWU7ICkKLWZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTAxLk5hbWUkMSBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXF1ZW5jZU9mCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVR5cGUpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldERlY29kZWRPYmplY3QoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5CZXJJbnB1dFN0cmVhbSkKLQotcHVibGljIGphdmEudXRpbC5Db2xsZWN0aW9uIGdldFZhbHVlcygKLWphdmEubGFuZy5PYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDEuTmFtZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xU2VxdWVuY2VPZiBBU04xCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVNldE9mIEFTTjFfUkROCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBjYW5vbmljYWxTdHJpbmcKLQotcHJpdmF0ZSB2b2xhdGlsZSBieXRlW10gZW5jb2RlZAotCi1wcml2YXRlIGphdmEudXRpbC5MaXN0IHJkbgotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmZjMTc3OVN0cmluZwotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmZjMjI1M1N0cmluZwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWphdmEudXRpbC5MaXN0KQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuTGlzdAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDEuTmFtZSQxKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ieXRlW10pCi0KLXN0YXRpYyBqYXZhLnV0aWwuTGlzdCBhY2Nlc3MkMTAwKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDEuTmFtZSkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGdldE5hbWUwKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJ5dGVbXSBnZXRFbmNvZGVkKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TmFtZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZheC5zZWN1cml0eS5hdXRoLng1MDAuWDUwMFByaW5jaXBhbCBnZXRYNTAwUHJpbmNpcGFsKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3g1MDkvQWNjZXNzRGVzY3JpcHRpb247ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLWZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkFjY2Vzc0Rlc2NyaXB0aW9uJDEgZXh0ZW5kcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xU2VxdWVuY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xVHlwZVtdKQotCi1wcm90ZWN0ZWQgamF2YS5sYW5nLk9iamVjdCBnZXREZWNvZGVkT2JqZWN0KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVySW5wdXRTdHJlYW0pCi0KLXByb3RlY3RlZCB2b2lkIGdldFZhbHVlcygKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3RbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5BY2Nlc3NEZXNjcmlwdGlvbiBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xU2VxdWVuY2UgQVNOMQotCi1wcml2YXRlIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkdlbmVyYWxOYW1lIGFjY2Vzc0xvY2F0aW9uCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBhY2Nlc3NNZXRob2QKLQotcHJpdmF0ZSBieXRlW10gZW5jb2RpbmcKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkdlbmVyYWxOYW1lKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuR2VuZXJhbE5hbWUKLWJ5dGVbXSkKLQotIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuR2VuZXJhbE5hbWUKLWJ5dGVbXQotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuQWNjZXNzRGVzY3JpcHRpb24kMSkKLQotc3RhdGljIGphdmEubGFuZy5TdHJpbmcgYWNjZXNzJDEwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkFjY2Vzc0Rlc2NyaXB0aW9uKQotCi1zdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuR2VuZXJhbE5hbWUgYWNjZXNzJDIwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkFjY2Vzc0Rlc2NyaXB0aW9uKQotCi1wdWJsaWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuR2VuZXJhbE5hbWUgZ2V0QWNjZXNzTG9jYXRpb24oKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRBY2Nlc3NNZXRob2QoKQotCi1wdWJsaWMgYnl0ZVtdIGdldEVuY29kZWQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS94NTA5L0FsZ29yaXRobUlkZW50aWZpZXI7ICkKLWZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIkMSBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXF1ZW5jZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFUeXBlW10pCi0KLXByb3RlY3RlZCBqYXZhLmxhbmcuT2JqZWN0IGdldERlY29kZWRPYmplY3QoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5CZXJJbnB1dFN0cmVhbSkKLQotcHJvdGVjdGVkIHZvaWQgZ2V0VmFsdWVzKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdFtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVNlcXVlbmNlIEFTTjEKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGFsZ29yaXRobQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgYWxnb3JpdGhtTmFtZQotCi1wcml2YXRlIGJ5dGVbXSBlbmNvZGluZwotCi1wcml2YXRlIGJ5dGVbXSBwYXJhbWV0ZXJzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1ieXRlW10pCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1ieXRlW10KLWJ5dGVbXSkKLQotcHVibGljIHZvaWQgZHVtcFZhbHVlKAotamF2YS5sYW5nLlN0cmluZ0J1ZmZlcikKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QWxnb3JpdGhtKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QWxnb3JpdGhtTmFtZSgpCi0KLXB1YmxpYyBieXRlW10gZ2V0RW5jb2RlZCgpCi0KLXB1YmxpYyBieXRlW10gZ2V0UGFyYW1ldGVycygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuRXh0ZW5zaW9uVmFsdWUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCBieXRlW10gZW5jb2RpbmcKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ieXRlW10pCi0KLXB1YmxpYyB2b2lkIGR1bXBWYWx1ZSgKLWphdmEubGFuZy5TdHJpbmdCdWZmZXIpCi0KLXB1YmxpYyB2b2lkIGR1bXBWYWx1ZSgKLWphdmEubGFuZy5TdHJpbmdCdWZmZXIKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBieXRlW10gZ2V0RW5jb2RlZCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuQWx0ZXJuYXRpdmVOYW1lIGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuRXh0ZW5zaW9uVmFsdWUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIElTU1VFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gU1VCSkVDVAotCi1wcml2YXRlIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkdlbmVyYWxOYW1lcyBhbHRlcm5hdGl2ZU5hbWVzCi0KLXByaXZhdGUgYm9vbGVhbiB3aGljaAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWJvb2xlYW4KLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkdlbmVyYWxOYW1lcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotYm9vbGVhbgotYnl0ZVtdKQotCi1wdWJsaWMgdm9pZCBkdW1wVmFsdWUoCi1qYXZhLmxhbmcuU3RyaW5nQnVmZmVyCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0QWx0ZXJuYXRpdmVOYW1lcygpCi0KLXB1YmxpYyBieXRlW10gZ2V0RW5jb2RlZCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS94NTA5L0F1dGhvcml0eUtleUlkZW50aWZpZXI7ICkKLWZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkF1dGhvcml0eUtleUlkZW50aWZpZXIkMSBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXF1ZW5jZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFUeXBlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCBqYXZhLmxhbmcuT2JqZWN0IGdldERlY29kZWRPYmplY3QoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5CZXJJbnB1dFN0cmVhbSkKLQotcHJvdGVjdGVkIHZvaWQgZ2V0VmFsdWVzKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdFtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkF1dGhvcml0eUtleUlkZW50aWZpZXIgZXh0ZW5kcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5FeHRlbnNpb25WYWx1ZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFUeXBlIEFTTjEKLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5HZW5lcmFsTmFtZXMgYXV0aG9yaXR5Q2VydElzc3VlcgotCi1wcml2YXRlIGZpbmFsIGphdmEubWF0aC5CaWdJbnRlZ2VyIGF1dGhvcml0eUNlcnRTZXJpYWxOdW1iZXIKLQotcHJpdmF0ZSBmaW5hbCBieXRlW10ga2V5SWRlbnRpZmllcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYnl0ZVtdCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5HZW5lcmFsTmFtZXMKLWphdmEubWF0aC5CaWdJbnRlZ2VyKQotCi1zdGF0aWMgYnl0ZVtdIGFjY2VzcyQwMDAoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5BdXRob3JpdHlLZXlJZGVudGlmaWVyKQotCi1zdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuR2VuZXJhbE5hbWVzIGFjY2VzcyQxMDAoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5BdXRob3JpdHlLZXlJZGVudGlmaWVyKQotCi1zdGF0aWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgYWNjZXNzJDIwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkF1dGhvcml0eUtleUlkZW50aWZpZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuQXV0aG9yaXR5S2V5SWRlbnRpZmllciBkZWNvZGUoCi1ieXRlW10pCi0KLXB1YmxpYyB2b2lkIGR1bXBWYWx1ZSgKLWphdmEubGFuZy5TdHJpbmdCdWZmZXIKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBieXRlW10gZ2V0RW5jb2RlZCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS94NTA5L0Jhc2ljQ29uc3RyYWludHM7ICkKLWZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkJhc2ljQ29uc3RyYWludHMkMSBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXF1ZW5jZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFUeXBlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldERlY29kZWRPYmplY3QoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5CZXJJbnB1dFN0cmVhbSkKLQotcHJvdGVjdGVkIHZvaWQgZ2V0VmFsdWVzKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdFtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkJhc2ljQ29uc3RyYWludHMgZXh0ZW5kcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5FeHRlbnNpb25WYWx1ZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFUeXBlIEFTTjEKLQotcHJpdmF0ZSBib29sZWFuIGNBCi0KLXByaXZhdGUgaW50IHBhdGhMZW5Db25zdHJhaW50Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ib29sZWFuCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWJ5dGVbXSkKLQotcHVibGljIHZvaWQgZHVtcFZhbHVlKAotamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJvb2xlYW4gZ2V0Q0EoKQotCi1wdWJsaWMgYnl0ZVtdIGdldEVuY29kZWQoKQotCi1wdWJsaWMgaW50IGdldFBhdGhMZW5Db25zdHJhaW50KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3g1MDkvQ1JMRGlzdHJpYnV0aW9uUG9pbnRzOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1maW5hbCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5DUkxEaXN0cmlidXRpb25Qb2ludHMkMSBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXF1ZW5jZU9mCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVR5cGUpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldERlY29kZWRPYmplY3QoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5CZXJJbnB1dFN0cmVhbSkKLQotcHVibGljIGphdmEudXRpbC5Db2xsZWN0aW9uIGdldFZhbHVlcygKLWphdmEubGFuZy5PYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuQ1JMRGlzdHJpYnV0aW9uUG9pbnRzIGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuRXh0ZW5zaW9uVmFsdWUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xVHlwZSBBU04xCi0KLXByaXZhdGUgamF2YS51dGlsLkxpc3QgZGlzdHJpYnV0aW9uUG9pbnRzCi0KLXByaXZhdGUgYnl0ZVtdIGVuY29kaW5nCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuTGlzdCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkxpc3QKLWJ5dGVbXSkKLQotc3RhdGljIGphdmEudXRpbC5MaXN0IGFjY2VzcyQwMDAoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5DUkxEaXN0cmlidXRpb25Qb2ludHMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuQ1JMRGlzdHJpYnV0aW9uUG9pbnRzIGRlY29kZSgKLWJ5dGVbXSkKLQotcHVibGljIHZvaWQgZHVtcFZhbHVlKAotamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJ5dGVbXSBnZXRFbmNvZGVkKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5DUkxOdW1iZXIgZXh0ZW5kcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5FeHRlbnNpb25WYWx1ZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFUeXBlIEFTTjEKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLm1hdGguQmlnSW50ZWdlciBudW1iZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubWF0aC5CaWdJbnRlZ2VyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ieXRlW10pCi0KLXB1YmxpYyB2b2lkIGR1bXBWYWx1ZSgKLWphdmEubGFuZy5TdHJpbmdCdWZmZXIKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBieXRlW10gZ2V0RW5jb2RlZCgpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXROdW1iZXIoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkveDUwOS9DZXJ0aWZpY2F0ZTsgKQotZmluYWwgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuQ2VydGlmaWNhdGUkMSBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXF1ZW5jZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFUeXBlW10pCi0KLXByb3RlY3RlZCBqYXZhLmxhbmcuT2JqZWN0IGdldERlY29kZWRPYmplY3QoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5CZXJJbnB1dFN0cmVhbSkKLQotcHJvdGVjdGVkIHZvaWQgZ2V0VmFsdWVzKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdFtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkNlcnRpZmljYXRlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXF1ZW5jZSBBU04xCi0KLXByaXZhdGUgYnl0ZVtdIGVuY29kaW5nCi0KLXByaXZhdGUgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuQWxnb3JpdGhtSWRlbnRpZmllciBzaWduYXR1cmVBbGdvcml0aG0KLQotcHJpdmF0ZSBmaW5hbCBieXRlW10gc2lnbmF0dXJlVmFsdWUKLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5UQlNDZXJ0aWZpY2F0ZSB0YnNDZXJ0aWZpY2F0ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuVEJTQ2VydGlmaWNhdGUKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIKLWJ5dGVbXSkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LlRCU0NlcnRpZmljYXRlCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyCi1ieXRlW10KLWJ5dGVbXSkKLQotIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuVEJTQ2VydGlmaWNhdGUKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIKLWJ5dGVbXQotYnl0ZVtdCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5DZXJ0aWZpY2F0ZSQxKQotCi1zdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuVEJTQ2VydGlmaWNhdGUgYWNjZXNzJDEwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkNlcnRpZmljYXRlKQotCi1zdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuQWxnb3JpdGhtSWRlbnRpZmllciBhY2Nlc3MkMjAwKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuQ2VydGlmaWNhdGUpCi0KLXN0YXRpYyBieXRlW10gYWNjZXNzJDMwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkNlcnRpZmljYXRlKQotCi1wdWJsaWMgYnl0ZVtdIGdldEVuY29kZWQoKQotCi1wdWJsaWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuQWxnb3JpdGhtSWRlbnRpZmllciBnZXRTaWduYXR1cmVBbGdvcml0aG0oKQotCi1wdWJsaWMgYnl0ZVtdIGdldFNpZ25hdHVyZVZhbHVlKCkKLQotcHVibGljIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LlRCU0NlcnRpZmljYXRlIGdldFRic0NlcnRpZmljYXRlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkveDUwOS9DZXJ0aWZpY2F0ZUlzc3VlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotZmluYWwgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuQ2VydGlmaWNhdGVJc3N1ZXIkMSBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXF1ZW5jZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFUeXBlW10pCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldERlY29kZWRPYmplY3QoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5CZXJJbnB1dFN0cmVhbSkKLQotcHJvdGVjdGVkIHZvaWQgZ2V0VmFsdWVzKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdFtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkNlcnRpZmljYXRlSXNzdWVyIGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuRXh0ZW5zaW9uVmFsdWUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xVHlwZSBBU04xCi0KLXByaXZhdGUgamF2YXguc2VjdXJpdHkuYXV0aC54NTAwLlg1MDBQcmluY2lwYWwgaXNzdWVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5HZW5lcmFsTmFtZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYnl0ZVtdKQotCi1wdWJsaWMgdm9pZCBkdW1wVmFsdWUoCi1qYXZhLmxhbmcuU3RyaW5nQnVmZmVyCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YXguc2VjdXJpdHkuYXV0aC54NTAwLlg1MDBQcmluY2lwYWwgZ2V0SXNzdWVyKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3g1MDkvQ2VydGlmaWNhdGVMaXN0OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1maW5hbCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5DZXJ0aWZpY2F0ZUxpc3QkMSBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXF1ZW5jZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFUeXBlW10pCi0KLXByb3RlY3RlZCBqYXZhLmxhbmcuT2JqZWN0IGdldERlY29kZWRPYmplY3QoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5CZXJJbnB1dFN0cmVhbSkKLQotcHJvdGVjdGVkIHZvaWQgZ2V0VmFsdWVzKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdFtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkNlcnRpZmljYXRlTGlzdCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xU2VxdWVuY2UgQVNOMQotCi1wcml2YXRlIGJ5dGVbXSBlbmNvZGluZwotCi1wcml2YXRlIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIgc2lnbmF0dXJlQWxnb3JpdGhtCi0KLXByaXZhdGUgZmluYWwgYnl0ZVtdIHNpZ25hdHVyZVZhbHVlCi0KLXByaXZhdGUgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuVEJTQ2VydExpc3QgdGJzQ2VydExpc3QKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LlRCU0NlcnRMaXN0Ci1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyCi1ieXRlW10pCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5UQlNDZXJ0TGlzdAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuQWxnb3JpdGhtSWRlbnRpZmllcgotYnl0ZVtdCi1ieXRlW10pCi0KLSB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LlRCU0NlcnRMaXN0Ci1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyCi1ieXRlW10KLWJ5dGVbXQotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuQ2VydGlmaWNhdGVMaXN0JDEpCi0KLXN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5UQlNDZXJ0TGlzdCBhY2Nlc3MkMTAwKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuQ2VydGlmaWNhdGVMaXN0KQotCi1zdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuQWxnb3JpdGhtSWRlbnRpZmllciBhY2Nlc3MkMjAwKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuQ2VydGlmaWNhdGVMaXN0KQotCi1zdGF0aWMgYnl0ZVtdIGFjY2VzcyQzMDAoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5DZXJ0aWZpY2F0ZUxpc3QpCi0KLXB1YmxpYyBieXRlW10gZ2V0RW5jb2RlZCgpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyIGdldFNpZ25hdHVyZUFsZ29yaXRobSgpCi0KLXB1YmxpYyBieXRlW10gZ2V0U2lnbmF0dXJlVmFsdWUoKQotCi1wdWJsaWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuVEJTQ2VydExpc3QgZ2V0VGJzQ2VydExpc3QoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS94NTA5L0NlcnRpZmljYXRlUG9saWNpZXM7ICkKLWZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkNlcnRpZmljYXRlUG9saWNpZXMkMSBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXF1ZW5jZU9mCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVR5cGUpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldERlY29kZWRPYmplY3QoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5CZXJJbnB1dFN0cmVhbSkKLQotcHVibGljIGphdmEudXRpbC5Db2xsZWN0aW9uIGdldFZhbHVlcygKLWphdmEubGFuZy5PYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuQ2VydGlmaWNhdGVQb2xpY2llcyBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkV4dGVuc2lvblZhbHVlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVR5cGUgQVNOMQotCi1wcml2YXRlIGJ5dGVbXSBlbmNvZGluZwotCi1wcml2YXRlIGphdmEudXRpbC5MaXN0IHBvbGljeUluZm9ybWF0aW9ucwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkxpc3QpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuTGlzdAotYnl0ZVtdKQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuTGlzdAotYnl0ZVtdCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5DZXJ0aWZpY2F0ZVBvbGljaWVzJDEpCi0KLXN0YXRpYyBqYXZhLnV0aWwuTGlzdCBhY2Nlc3MkMTAwKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuQ2VydGlmaWNhdGVQb2xpY2llcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5DZXJ0aWZpY2F0ZVBvbGljaWVzIGRlY29kZSgKLWJ5dGVbXSkKLQotcHVibGljIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkNlcnRpZmljYXRlUG9saWNpZXMgYWRkUG9saWN5SW5mb3JtYXRpb24oCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5Qb2xpY3lJbmZvcm1hdGlvbikKLQotcHVibGljIHZvaWQgZHVtcFZhbHVlKAotamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJ5dGVbXSBnZXRFbmNvZGVkKCkKLQotcHVibGljIGphdmEudXRpbC5MaXN0IGdldFBvbGljeUluZm9ybWF0aW9ucygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuRE5QYXJzZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCBpbnQgYmVnCi0KLXByb3RlY3RlZCBjaGFyW10gY2hhcnMKLQotcHJvdGVjdGVkIGludCBjdXIKLQotcHJvdGVjdGVkIGJ5dGVbXSBlbmNvZGVkCi0KLXByb3RlY3RlZCBpbnQgZW5kCi0KLXByb3RlY3RlZCBib29sZWFuIGhhc1FFCi0KLXByb3RlY3RlZCBmaW5hbCBpbnQgbGVuZ3RoCi0KLXByb3RlY3RlZCBpbnQgcG9zCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBjaGFyIGdldEVzY2FwZWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgaGV4QVYoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBlc2NhcGVkQVYoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgaW50IGdldEJ5dGUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCBjaGFyIGdldFVURjgoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBuZXh0QVQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS51dGlsLkxpc3QgcGFyc2UoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBxdW90ZWRBVigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS94NTA5L0Rpc3RyaWJ1dGlvblBvaW50OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1maW5hbCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5EaXN0cmlidXRpb25Qb2ludCQxIGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVNlcXVlbmNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVR5cGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGphdmEubGFuZy5PYmplY3QgZ2V0RGVjb2RlZE9iamVjdCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkJlcklucHV0U3RyZWFtKQotCi1wcm90ZWN0ZWQgdm9pZCBnZXRWYWx1ZXMoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0W10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuRGlzdHJpYnV0aW9uUG9pbnQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVNlcXVlbmNlIEFTTjEKLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5HZW5lcmFsTmFtZXMgY1JMSXNzdWVyCi0KLXByaXZhdGUgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuRGlzdHJpYnV0aW9uUG9pbnROYW1lIGRpc3RyaWJ1dGlvblBvaW50Ci0KLXByaXZhdGUgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuUmVhc29uRmxhZ3MgcmVhc29ucwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuRGlzdHJpYnV0aW9uUG9pbnROYW1lCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5SZWFzb25GbGFncwotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuR2VuZXJhbE5hbWVzKQotCi1zdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuRGlzdHJpYnV0aW9uUG9pbnROYW1lIGFjY2VzcyQwMDAoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5EaXN0cmlidXRpb25Qb2ludCkKLQotc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LlJlYXNvbkZsYWdzIGFjY2VzcyQxMDAoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5EaXN0cmlidXRpb25Qb2ludCkKLQotc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkdlbmVyYWxOYW1lcyBhY2Nlc3MkMjAwKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuRGlzdHJpYnV0aW9uUG9pbnQpCi0KLXB1YmxpYyB2b2lkIGR1bXBWYWx1ZSgKLWphdmEubGFuZy5TdHJpbmdCdWZmZXIKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS94NTA5L0Rpc3RyaWJ1dGlvblBvaW50TmFtZTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotZmluYWwgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuRGlzdHJpYnV0aW9uUG9pbnROYW1lJDEgZXh0ZW5kcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xQ2hvaWNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVR5cGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGphdmEubGFuZy5PYmplY3QgZ2V0RGVjb2RlZE9iamVjdCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkJlcklucHV0U3RyZWFtKQotCi1wdWJsaWMgaW50IGdldEluZGV4KAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0T2JqZWN0VG9FbmNvZGUoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkRpc3RyaWJ1dGlvblBvaW50TmFtZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xQ2hvaWNlIEFTTjEKLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5HZW5lcmFsTmFtZXMgZnVsbE5hbWUKLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwMS5OYW1lIG5hbWVSZWxhdGl2ZVRvQ1JMSXNzdWVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwMS5OYW1lKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5HZW5lcmFsTmFtZXMpCi0KLXN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5HZW5lcmFsTmFtZXMgYWNjZXNzJDAwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkRpc3RyaWJ1dGlvblBvaW50TmFtZSkKLQotc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTAxLk5hbWUgYWNjZXNzJDEwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkRpc3RyaWJ1dGlvblBvaW50TmFtZSkKLQotcHVibGljIHZvaWQgZHVtcFZhbHVlKAotamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3g1MDkvRURJUGFydHlOYW1lOyApCi1maW5hbCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5FRElQYXJ0eU5hbWUkMSBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXF1ZW5jZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFUeXBlW10pCi0KLXByb3RlY3RlZCBqYXZhLmxhbmcuT2JqZWN0IGdldERlY29kZWRPYmplY3QoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5CZXJJbnB1dFN0cmVhbSkKLQotcHJvdGVjdGVkIHZvaWQgZ2V0VmFsdWVzKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdFtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkVESVBhcnR5TmFtZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xU2VxdWVuY2UgQVNOMQotCi1wcml2YXRlIGJ5dGVbXSBlbmNvZGluZwotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbmFtZUFzc2lnbmVyCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBwYXJ0eU5hbWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1ieXRlW10pCi0KLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWJ5dGVbXQotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuRURJUGFydHlOYW1lJDEpCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGFjY2VzcyQxMDAoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5FRElQYXJ0eU5hbWUpCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGFjY2VzcyQyMDAoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5FRElQYXJ0eU5hbWUpCi0KLXB1YmxpYyBieXRlW10gZ2V0RW5jb2RlZCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE5hbWVBc3NpZ25lcigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFBhcnR5TmFtZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS94NTA5L0V4dGVuZGVkS2V5VXNhZ2U7ICkKLWZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkV4dGVuZGVkS2V5VXNhZ2UkMSBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFPaWQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXREZWNvZGVkT2JqZWN0KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVySW5wdXRTdHJlYW0pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuRXh0ZW5kZWRLZXlVc2FnZSBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkV4dGVuc2lvblZhbHVlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVR5cGUgQVNOMQotCi1wcml2YXRlIGphdmEudXRpbC5MaXN0IGtleXMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEudXRpbC5MaXN0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ieXRlW10pCi0KLXB1YmxpYyB2b2lkIGR1bXBWYWx1ZSgKLWphdmEubGFuZy5TdHJpbmdCdWZmZXIKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBieXRlW10gZ2V0RW5jb2RlZCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRFeHRlbmRlZEtleVVzYWdlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3g1MDkvRXh0ZW5zaW9uOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1maW5hbCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5FeHRlbnNpb24kMSBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFPY3RldFN0cmluZwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldERlY29kZWRPYmplY3QoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5CZXJJbnB1dFN0cmVhbSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3g1MDkvRXh0ZW5zaW9uOyApCi1maW5hbCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5FeHRlbnNpb24kMiBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXF1ZW5jZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFUeXBlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCBqYXZhLmxhbmcuT2JqZWN0IGdldERlY29kZWRPYmplY3QoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5CZXJJbnB1dFN0cmVhbSkKLQotcHJvdGVjdGVkIHZvaWQgZ2V0VmFsdWVzKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdFtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkV4dGVuc2lvbiBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xU2VxdWVuY2UgQVNOMQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEFVVEhPUklUWV9JTkZPX0FDQ0VTUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEFVVEhfS0VZX0lECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gQkFTSUNfQ09OU1RSQUlOVFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBDRVJUSUZJQ0FURV9JU1NVRVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBDRVJUSUZJQ0FURV9QT0xJQ0lFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gQ1JJVElDQUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBDUkxfRElTVFJfUE9JTlRTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gQ1JMX05VTUJFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEVYVEVOREVEX0tFWV9VU0FHRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEZSRVNIRVNUX0NSTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIElOSElCSVRfQU5ZX1BPTElDWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIElOVkFMSURJVFlfREFURQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIElTU1VFUl9BTFRFUk5BVElWRV9OQU1FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gSVNTVUlOR19ESVNUUl9QT0lOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIElTU1VJTkdfRElTVFJfUE9JTlRTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gS0VZX1VTQUdFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gTkFNRV9DT05TVFJBSU5UUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gTk9OX0NSSVRJQ0FMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gUE9MSUNZX0NPTlNUUkFJTlRTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gUE9MSUNZX01BUFBJTkdTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gUFJJVkFURV9LRVlfVVNBR0VfUEVSSU9ECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gUkVBU09OX0NPREUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBTVUJKRUNUX0FMVF9OQU1FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gU1VCSkVDVF9JTkZPX0FDQ0VTUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIFNVQkpfRElSRUNUT1JZX0FUVFJTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gU1VCSl9LRVlfSUQKLQotcHJpdmF0ZSBmaW5hbCBib29sZWFuIGNyaXRpY2FsCi0KLXByaXZhdGUgYnl0ZVtdIGVuY29kaW5nCi0KLXByaXZhdGUgZmluYWwgaW50W10gZXh0bklECi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBleHRuSURfc3RyCi0KLXByaXZhdGUgZmluYWwgYnl0ZVtdIGV4dG5WYWx1ZQotCi1wcm90ZWN0ZWQgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuRXh0ZW5zaW9uVmFsdWUgZXh0blZhbHVlT2JqZWN0Ci0KLXByaXZhdGUgYnl0ZVtdIHJhd0V4dG5WYWx1ZQotCi1wcml2YXRlIGJvb2xlYW4gdmFsdWVEZWNvZGVkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5FeHRlbnNpb25WYWx1ZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbgotYnl0ZVtdKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1ieXRlW10pCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludFtdCi1ib29sZWFuCi1ieXRlW10pCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1pbnRbXQotYm9vbGVhbgotYnl0ZVtdCi1ieXRlW10KLWJ5dGVbXQotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuRXh0ZW5zaW9uVmFsdWUpCi0KLSB2b2lkIDxpbml0PigKLWludFtdCi1ib29sZWFuCi1ieXRlW10KLWJ5dGVbXQotYnl0ZVtdCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5FeHRlbnNpb25WYWx1ZQotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuRXh0ZW5zaW9uJDEpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludFtdCi1ieXRlW10pCi0KLXN0YXRpYyBib29sZWFuIGFjY2VzcyQwMDAoCi1pbnRbXQotaW50W10pCi0KLXN0YXRpYyBpbnRbXSBhY2Nlc3MkMjAwKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuRXh0ZW5zaW9uKQotCi1zdGF0aWMgYm9vbGVhbiBhY2Nlc3MkMzAwKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuRXh0ZW5zaW9uKQotCi1zdGF0aWMgYnl0ZVtdIGFjY2VzcyQ0MDAoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5FeHRlbnNpb24pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCBkZWNvZGVFeHRlbnNpb25WYWx1ZSgpCi0KLXByaXZhdGUgc3RhdGljIGJvb2xlYW4gb2lkRXF1YWxzKAotaW50W10KLWludFtdKQotCi1wdWJsaWMgdm9pZCBkdW1wVmFsdWUoCi1qYXZhLmxhbmcuU3RyaW5nQnVmZmVyCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuQmFzaWNDb25zdHJhaW50cyBnZXRCYXNpY0NvbnN0cmFpbnRzVmFsdWUoKQotCi1wdWJsaWMgYm9vbGVhbiBnZXRDcml0aWNhbCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5FeHRlbnNpb25WYWx1ZSBnZXREZWNvZGVkRXh0ZW5zaW9uVmFsdWUoKQotCi1wdWJsaWMgYnl0ZVtdIGdldEVuY29kZWQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRFeHRuSUQoKQotCi1wdWJsaWMgYnl0ZVtdIGdldEV4dG5WYWx1ZSgpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5LZXlVc2FnZSBnZXRLZXlVc2FnZVZhbHVlKCkKLQotcHVibGljIGJ5dGVbXSBnZXRSYXdFeHRuVmFsdWUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkveDUwOS9FeHRlbnNpb25zOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1maW5hbCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5FeHRlbnNpb25zJDEgZXh0ZW5kcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xU2VxdWVuY2VPZgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFUeXBlKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXREZWNvZGVkT2JqZWN0KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVySW5wdXRTdHJlYW0pCi0KLXB1YmxpYyBqYXZhLnV0aWwuQ29sbGVjdGlvbiBnZXRWYWx1ZXMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkV4dGVuc2lvbnMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVR5cGUgQVNOMQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuTGlzdCBTVVBQT1JURURfQ1JJVElDQUwKLQotcHJpdmF0ZSBqYXZhLnV0aWwuU2V0IGNyaXRpY2FsCi0KLXByaXZhdGUgYnl0ZVtdIGVuY29kaW5nCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9MaXN0PExvcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkveDUwOS9FeHRlbnNpb247PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdCBleHRlbnNpb25zCi0KLXByaXZhdGUgYm9vbGVhbiBoYXNVbnN1cHBvcnRlZAotCi1wcml2YXRlIGphdmEudXRpbC5TZXQgbm9uY3JpdGljYWwKLQotcHJpdmF0ZSBqYXZhLnV0aWwuSGFzaE1hcCBvaWRNYXAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEudXRpbC5MaXN0KQotCi1zdGF0aWMgamF2YS51dGlsLkxpc3QgYWNjZXNzJDAwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkV4dGVuc2lvbnMpCi0KLXByaXZhdGUgdm9pZCBtYWtlT2lkc0xpc3RzKCkKLQotcHVibGljIHZvaWQgYWRkRXh0ZW5zaW9uKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuRXh0ZW5zaW9uKQotCi1wdWJsaWMgdm9pZCBkdW1wVmFsdWUoCi1qYXZhLmxhbmcuU3RyaW5nQnVmZmVyCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgamF2YS51dGlsLlNldCBnZXRDcml0aWNhbEV4dGVuc2lvbnMoKQotCi1wdWJsaWMgYnl0ZVtdIGdldEVuY29kZWQoKQotCi1wdWJsaWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuRXh0ZW5zaW9uIGdldEV4dGVuc2lvbkJ5T0lEKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEudXRpbC5MaXN0IGdldEV4dGVuc2lvbnMoKQotCi1wdWJsaWMgamF2YS51dGlsLlNldCBnZXROb25Dcml0aWNhbEV4dGVuc2lvbnMoKQotCi1wdWJsaWMgYm9vbGVhbiBoYXNVbnN1cHBvcnRlZENyaXRpY2FsKCkKLQotcHVibGljIGludCBzaXplKCkKLQotcHVibGljIGludCB2YWx1ZU9mQmFzaWNDb25zdHJhaW5zKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmF4LnNlY3VyaXR5LmF1dGgueDUwMC5YNTAwUHJpbmNpcGFsIHZhbHVlT2ZDZXJ0aWZpY2F0ZUlzc3VlckV4dGVuc2lvbigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCB2YWx1ZU9mRXh0ZW5kZWRLZXlVc2FnZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCB2YWx1ZU9mSXNzdWVyQWx0ZXJuYXRpdmVOYW1lKCkKLQotcHVibGljIGJvb2xlYW5bXSB2YWx1ZU9mS2V5VXNhZ2UoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS51dGlsLkxpc3QgdmFsdWVPZlN1YmplY3RBbHRlcm5hdGl2ZU5hbWUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkveDUwOS9HZW5lcmFsTmFtZTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotZmluYWwgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuR2VuZXJhbE5hbWUkMSBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFDaG9pY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xVHlwZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXREZWNvZGVkT2JqZWN0KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVySW5wdXRTdHJlYW0pCi0KLXB1YmxpYyBpbnQgZ2V0SW5kZXgoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRPYmplY3RUb0VuY29kZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuR2VuZXJhbE5hbWUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMUNob2ljZSBBU04xCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJUl9OQU1FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEROU19OQU1FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVESVBfTkFNRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJUF9BRERSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9USEVSX05BTUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVHX0lECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJGQzgyMl9OQU1FCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVSX0lECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFg0MDBfQUREUgotCi1wcml2YXRlIHN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xVHlwZVtdIG5hbWVBU04xCi0KLXByaXZhdGUgYnl0ZVtdIGVuY29kaW5nCi0KLXByaXZhdGUgamF2YS5sYW5nLk9iamVjdCBuYW1lCi0KLXByaXZhdGUgYnl0ZVtdIG5hbWVfZW5jb2RpbmcKLQotcHJpdmF0ZSBpbnQgdGFnCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotYnl0ZVtdKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwMS5OYW1lKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5FRElQYXJ0eU5hbWUpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5Lk9SQWRkcmVzcykKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuT3RoZXJOYW1lKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ieXRlW10pCi0KLXN0YXRpYyBqYXZhLmxhbmcuT2JqZWN0IGFjY2VzcyQwMDAoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5HZW5lcmFsTmFtZSkKLQotc3RhdGljIGludCBhY2Nlc3MkMTAwKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuR2VuZXJhbE5hbWUpCi0KLXN0YXRpYyBieXRlW10gYWNjZXNzJDIwMigKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkdlbmVyYWxOYW1lCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja0ROUygKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja1VSSSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBnZXRCeXRlc0FzU3RyaW5nKAotYnl0ZVtdKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgaXBCeXRlc1RvU3RyKAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGJ5dGVbXSBpcFN0clRvQnl0ZXMoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGludFtdIG9pZFN0clRvSW50cygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRBc0xpc3QoKQotCi1wdWJsaWMgYnl0ZVtdIGdldEVuY29kZWQoKQotCi1wdWJsaWMgYnl0ZVtdIGdldEVuY29kZWROYW1lKCkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0TmFtZSgpCi0KLXB1YmxpYyBpbnQgZ2V0VGFnKCkKLQotcHVibGljIGJvb2xlYW4gaXNBY2NlcHRhYmxlKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuR2VuZXJhbE5hbWUpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3g1MDkvR2VuZXJhbE5hbWVzOyApCi1maW5hbCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5HZW5lcmFsTmFtZXMkMSBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXF1ZW5jZU9mCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVR5cGUpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldERlY29kZWRPYmplY3QoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5CZXJJbnB1dFN0cmVhbSkKLQotcHVibGljIGphdmEudXRpbC5Db2xsZWN0aW9uIGdldFZhbHVlcygKLWphdmEubGFuZy5PYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuR2VuZXJhbE5hbWVzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFUeXBlIEFTTjEKLQotcHJpdmF0ZSBieXRlW10gZW5jb2RpbmcKLQotcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdCBnZW5lcmFsTmFtZXMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEudXRpbC5MaXN0KQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkxpc3QKLWJ5dGVbXSkKLQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkxpc3QKLWJ5dGVbXQotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuR2VuZXJhbE5hbWVzJDEpCi0KLXN0YXRpYyBqYXZhLnV0aWwuTGlzdCBhY2Nlc3MkMTAwKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuR2VuZXJhbE5hbWVzKQotCi1wdWJsaWMgdm9pZCBhZGROYW1lKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuR2VuZXJhbE5hbWUpCi0KLXB1YmxpYyB2b2lkIGR1bXBWYWx1ZSgKLWphdmEubGFuZy5TdHJpbmdCdWZmZXIKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBieXRlW10gZ2V0RW5jb2RlZCgpCi0KLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXROYW1lcygpCi0KLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRQYWlyc0xpc3QoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkveDUwOS9HZW5lcmFsU3VidHJlZTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotZmluYWwgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuR2VuZXJhbFN1YnRyZWUkMSBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXF1ZW5jZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFUeXBlW10pCi0KLXByb3RlY3RlZCBqYXZhLmxhbmcuT2JqZWN0IGdldERlY29kZWRPYmplY3QoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5CZXJJbnB1dFN0cmVhbSkKLQotcHJvdGVjdGVkIHZvaWQgZ2V0VmFsdWVzKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdFtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkdlbmVyYWxTdWJ0cmVlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXF1ZW5jZSBBU04xCi0KLXByaXZhdGUgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuR2VuZXJhbE5hbWUgYmFzZQotCi1wcml2YXRlIGJ5dGVbXSBlbmNvZGluZwotCi1wcml2YXRlIGZpbmFsIGludCBtYXhpbXVtCi0KLXByaXZhdGUgZmluYWwgaW50IG1pbmltdW0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkdlbmVyYWxOYW1lKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5HZW5lcmFsTmFtZQotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5HZW5lcmFsTmFtZQotaW50Ci1pbnQpCi0KLXN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5HZW5lcmFsTmFtZSBhY2Nlc3MkMDAwKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuR2VuZXJhbFN1YnRyZWUpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDEwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkdlbmVyYWxTdWJ0cmVlKQotCi1zdGF0aWMgaW50IGFjY2VzcyQyMDAoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5HZW5lcmFsU3VidHJlZSkKLQotcHVibGljIHZvaWQgZHVtcFZhbHVlKAotamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkdlbmVyYWxOYW1lIGdldEJhc2UoKQotCi1wdWJsaWMgYnl0ZVtdIGdldEVuY29kZWQoKQotCi1wdWJsaWMgaW50IGdldE1heGltdW0oKQotCi1wdWJsaWMgaW50IGdldE1pbmltdW0oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkveDUwOS9HZW5lcmFsU3VidHJlZXM7ICkKLWZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkdlbmVyYWxTdWJ0cmVlcyQxIGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVNlcXVlbmNlT2YKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xVHlwZSkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0RGVjb2RlZE9iamVjdCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkJlcklucHV0U3RyZWFtKQotCi1wdWJsaWMgamF2YS51dGlsLkNvbGxlY3Rpb24gZ2V0VmFsdWVzKAotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5HZW5lcmFsU3VidHJlZXMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVR5cGUgQVNOMQotCi1wcml2YXRlIGJ5dGVbXSBlbmNvZGluZwotCi1wcml2YXRlIGphdmEudXRpbC5MaXN0IGdlbmVyYWxTdWJ0cmVlcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkxpc3QpCi0KLXN0YXRpYyBqYXZhLnV0aWwuTGlzdCBhY2Nlc3MkMDAwKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuR2VuZXJhbFN1YnRyZWVzKQotCi1wdWJsaWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuR2VuZXJhbFN1YnRyZWVzIGFkZFN1YnRyZWUoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5HZW5lcmFsU3VidHJlZSkKLQotcHVibGljIGJ5dGVbXSBnZXRFbmNvZGVkKCkKLQotcHVibGljIGphdmEudXRpbC5MaXN0IGdldFN1YnRyZWVzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3g1MDkvSW5mb0FjY2Vzc1N5bnRheDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotZmluYWwgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuSW5mb0FjY2Vzc1N5bnRheCQxIGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVNlcXVlbmNlT2YKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xVHlwZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0RGVjb2RlZE9iamVjdCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkJlcklucHV0U3RyZWFtKQotCi1wdWJsaWMgamF2YS51dGlsLkNvbGxlY3Rpb24gZ2V0VmFsdWVzKAotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5JbmZvQWNjZXNzU3ludGF4IGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuRXh0ZW5zaW9uVmFsdWUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xVHlwZSBBU04xCi0KLXByaXZhdGUgZmluYWwgamF2YS51dGlsLkxpc3QgYWNjZXNzRGVzY3JpcHRpb25zCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuTGlzdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWphdmEudXRpbC5MaXN0Ci1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLSB2b2lkIDxpbml0PigKLWphdmEudXRpbC5MaXN0Ci1ieXRlW10KLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkluZm9BY2Nlc3NTeW50YXgkMSkKLQotc3RhdGljIGphdmEudXRpbC5MaXN0IGFjY2VzcyQxMDAoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5JbmZvQWNjZXNzU3ludGF4KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkluZm9BY2Nlc3NTeW50YXggZGVjb2RlKAotYnl0ZVtdKQotCi1wdWJsaWMgdm9pZCBkdW1wVmFsdWUoCi1qYXZhLmxhbmcuU3RyaW5nQnVmZmVyCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0QWNjZXNzRGVzY3JpcHRpb25zKCkKLQotcHVibGljIGJ5dGVbXSBnZXRFbmNvZGVkKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkluaGliaXRBbnlQb2xpY3kgZXh0ZW5kcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5FeHRlbnNpb25WYWx1ZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGludCBza2lwQ2VydHMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWJ5dGVbXSkKLQotcHVibGljIHZvaWQgZHVtcFZhbHVlKAotamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJ5dGVbXSBnZXRFbmNvZGVkKCkKLQotcHVibGljIGludCBnZXRTa2lwQ2VydHMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkludmFsaWRpdHlEYXRlIGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuRXh0ZW5zaW9uVmFsdWUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xVHlwZSBBU04xCi0KLXByaXZhdGUgZmluYWwgamF2YS51dGlsLkRhdGUgZGF0ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkRhdGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWJ5dGVbXSkKLQotcHVibGljIHZvaWQgZHVtcFZhbHVlKAotamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEudXRpbC5EYXRlIGdldERhdGUoKQotCi1wdWJsaWMgYnl0ZVtdIGdldEVuY29kZWQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkveDUwOS9Jc3N1aW5nRGlzdHJpYnV0aW9uUG9pbnQ7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLWZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5Lklzc3VpbmdEaXN0cmlidXRpb25Qb2ludCQxIGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVNlcXVlbmNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVR5cGVbXSkKLQotcHJvdGVjdGVkIGphdmEubGFuZy5PYmplY3QgZ2V0RGVjb2RlZE9iamVjdCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkJlcklucHV0U3RyZWFtKQotCi1wcm90ZWN0ZWQgdm9pZCBnZXRWYWx1ZXMoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0W10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuSXNzdWluZ0Rpc3RyaWJ1dGlvblBvaW50IGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuRXh0ZW5zaW9uVmFsdWUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xVHlwZSBBU04xCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuRGlzdHJpYnV0aW9uUG9pbnROYW1lIGRpc3RyaWJ1dGlvblBvaW50Ci0KLXByaXZhdGUgYm9vbGVhbiBpbmRpcmVjdENSTAotCi1wcml2YXRlIGJvb2xlYW4gb25seUNvbnRhaW5zQXR0cmlidXRlQ2VydHMKLQotcHJpdmF0ZSBib29sZWFuIG9ubHlDb250YWluc0NBQ2VydHMKLQotcHJpdmF0ZSBib29sZWFuIG9ubHlDb250YWluc1VzZXJDZXJ0cwotCi1wcml2YXRlIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LlJlYXNvbkZsYWdzIG9ubHlTb21lUmVhc29ucwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuRGlzdHJpYnV0aW9uUG9pbnROYW1lCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5SZWFzb25GbGFncykKLQotc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkRpc3RyaWJ1dGlvblBvaW50TmFtZSBhY2Nlc3MkMDAwKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuSXNzdWluZ0Rpc3RyaWJ1dGlvblBvaW50KQotCi1zdGF0aWMgYm9vbGVhbiBhY2Nlc3MkMTAwKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuSXNzdWluZ0Rpc3RyaWJ1dGlvblBvaW50KQotCi1zdGF0aWMgYm9vbGVhbiBhY2Nlc3MkMjAwKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuSXNzdWluZ0Rpc3RyaWJ1dGlvblBvaW50KQotCi1zdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuUmVhc29uRmxhZ3MgYWNjZXNzJDMwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5Lklzc3VpbmdEaXN0cmlidXRpb25Qb2ludCkKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDQwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5Lklzc3VpbmdEaXN0cmlidXRpb25Qb2ludCkKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDUwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5Lklzc3VpbmdEaXN0cmlidXRpb25Qb2ludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5Jc3N1aW5nRGlzdHJpYnV0aW9uUG9pbnQgZGVjb2RlKAotYnl0ZVtdKQotCi1wdWJsaWMgdm9pZCBkdW1wVmFsdWUoCi1qYXZhLmxhbmcuU3RyaW5nQnVmZmVyCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuRGlzdHJpYnV0aW9uUG9pbnROYW1lIGdldERpc3RyaWJ1dGlvblBvaW50KCkKLQotcHVibGljIGJ5dGVbXSBnZXRFbmNvZGVkKCkKLQotcHVibGljIGJvb2xlYW4gZ2V0SW5kaXJlY3RDUkwoKQotCi1wdWJsaWMgYm9vbGVhbiBnZXRPbmx5Q29udGFpbnNBdHRyaWJ1dGVDZXJ0cygpCi0KLXB1YmxpYyBib29sZWFuIGdldE9ubHlDb250YWluc0NBQ2VydHMoKQotCi1wdWJsaWMgYm9vbGVhbiBnZXRPbmx5Q29udGFpbnNVc2VyQ2VydHMoKQotCi1wdWJsaWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuUmVhc29uRmxhZ3MgZ2V0T25seVNvbWVSZWFzb25zKCkKLQotcHVibGljIHZvaWQgc2V0SW5kaXJlY3RDUkwoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRPbmx5Q29udGFpbnNBdHRyaWJ1dGVDZXJ0cygKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldE9ubHlDb250YWluc0NBQ2VydHMoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRPbmx5Q29udGFpbnNVc2VyQ2VydHMoCi1ib29sZWFuKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LktleVVzYWdlIGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuRXh0ZW5zaW9uVmFsdWUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVR5cGUgQVNOMQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gVVNBR0VTCi0KLXByaXZhdGUgZmluYWwgYm9vbGVhbltdIGtleVVzYWdlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ieXRlW10pCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWJvb2xlYW5bXSkKLQotcHVibGljIHZvaWQgZHVtcFZhbHVlKAotamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJ5dGVbXSBnZXRFbmNvZGVkKCkKLQotcHVibGljIGJvb2xlYW5bXSBnZXRLZXlVc2FnZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS94NTA5L05hbWVDb25zdHJhaW50czsgKQotZmluYWwgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuTmFtZUNvbnN0cmFpbnRzJDEgZXh0ZW5kcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xU2VxdWVuY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xVHlwZVtdKQotCi1wcm90ZWN0ZWQgamF2YS5sYW5nLk9iamVjdCBnZXREZWNvZGVkT2JqZWN0KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVySW5wdXRTdHJlYW0pCi0KLXByb3RlY3RlZCB2b2lkIGdldFZhbHVlcygKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3RbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5OYW1lQ29uc3RyYWludHMgZXh0ZW5kcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5FeHRlbnNpb25WYWx1ZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXF1ZW5jZSBBU04xCi0KLXByaXZhdGUgYnl0ZVtdIGVuY29kaW5nCi0KLXByaXZhdGUgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuR2VuZXJhbFN1YnRyZWVzIGV4Y2x1ZGVkU3VidHJlZXMKLQotcHJpdmF0ZSBqYXZhLnV0aWwuQXJyYXlMaXN0W10gZXhjbHVkZWRfbmFtZXMKLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5HZW5lcmFsU3VidHJlZXMgcGVybWl0dGVkU3VidHJlZXMKLQotcHJpdmF0ZSBqYXZhLnV0aWwuQXJyYXlMaXN0W10gcGVybWl0dGVkX25hbWVzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5HZW5lcmFsU3VidHJlZXMKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkdlbmVyYWxTdWJ0cmVlcykKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkdlbmVyYWxTdWJ0cmVlcwotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuR2VuZXJhbFN1YnRyZWVzCi1ieXRlW10pCi0KLSB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkdlbmVyYWxTdWJ0cmVlcwotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuR2VuZXJhbFN1YnRyZWVzCi1ieXRlW10KLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5Lk5hbWVDb25zdHJhaW50cyQxKQotCi1zdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuR2VuZXJhbFN1YnRyZWVzIGFjY2VzcyQxMDAoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5OYW1lQ29uc3RyYWludHMpCi0KLXN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5HZW5lcmFsU3VidHJlZXMgYWNjZXNzJDIwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5Lk5hbWVDb25zdHJhaW50cykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5OYW1lQ29uc3RyYWludHMgZGVjb2RlKAotYnl0ZVtdKQotCi1wcml2YXRlIGJ5dGVbXSBnZXRFeHRlbnNpb25WYWx1ZSgKLWphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGUKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgdm9pZCBwcmVwYXJlTmFtZXMoKQotCi1wdWJsaWMgdm9pZCBkdW1wVmFsdWUoCi1qYXZhLmxhbmcuU3RyaW5nQnVmZmVyCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYnl0ZVtdIGdldEVuY29kZWQoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0FjY2VwdGFibGUoCi1qYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlKQotCi1wdWJsaWMgYm9vbGVhbiBpc0FjY2VwdGFibGUoCi1qYXZhLnV0aWwuTGlzdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3g1MDkvT1JBZGRyZXNzOyApCi1maW5hbCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5PUkFkZHJlc3MkMSBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXF1ZW5jZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFUeXBlW10pCi0KLXByb3RlY3RlZCBqYXZhLmxhbmcuT2JqZWN0IGdldERlY29kZWRPYmplY3QoCi1qYXZhLmxhbmcuT2JqZWN0W10pCi0KLXByb3RlY3RlZCB2b2lkIGdldFZhbHVlcygKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3RbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3g1MDkvT1JBZGRyZXNzOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1maW5hbCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5PUkFkZHJlc3MkMiBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXF1ZW5jZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5PYmplY3QgZm9vCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVR5cGVbXSkKLQotcHJvdGVjdGVkIGphdmEubGFuZy5PYmplY3QgZ2V0RGVjb2RlZE9iamVjdCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkJlcklucHV0U3RyZWFtKQotCi1wcm90ZWN0ZWQgdm9pZCBnZXRWYWx1ZXMoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0W10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuT1JBZGRyZXNzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXF1ZW5jZSBBU04xCi0KLXByaXZhdGUgYnl0ZVtdIGVuY29kaW5nCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgYnl0ZVtdIGdldEVuY29kZWQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkveDUwOS9PdGhlck5hbWU7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLWZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5Lk90aGVyTmFtZSQxIGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVNlcXVlbmNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVR5cGVbXSkKLQotcHJvdGVjdGVkIGphdmEubGFuZy5PYmplY3QgZ2V0RGVjb2RlZE9iamVjdCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkJlcklucHV0U3RyZWFtKQotCi1wcm90ZWN0ZWQgdm9pZCBnZXRWYWx1ZXMoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0W10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuT3RoZXJOYW1lIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXF1ZW5jZSBBU04xCi0KLXByaXZhdGUgYnl0ZVtdIGVuY29kaW5nCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyB0eXBlSUQKLQotcHJpdmF0ZSBieXRlW10gdmFsdWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWJ5dGVbXSkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWJ5dGVbXQotYnl0ZVtdKQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1ieXRlW10KLWJ5dGVbXQotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuT3RoZXJOYW1lJDEpCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGFjY2VzcyQxMDAoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5PdGhlck5hbWUpCi0KLXN0YXRpYyBieXRlW10gYWNjZXNzJDIwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5Lk90aGVyTmFtZSkKLQotcHVibGljIGJ5dGVbXSBnZXRFbmNvZGVkKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VHlwZUlEKCkKLQotcHVibGljIGJ5dGVbXSBnZXRWYWx1ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS94NTA5L1BvbGljeUNvbnN0cmFpbnRzOyApCi1maW5hbCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5Qb2xpY3lDb25zdHJhaW50cyQxIGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVNlcXVlbmNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVR5cGVbXSkKLQotcHJvdGVjdGVkIGphdmEubGFuZy5PYmplY3QgZ2V0RGVjb2RlZE9iamVjdCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkJlcklucHV0U3RyZWFtKQotCi1wcm90ZWN0ZWQgdm9pZCBnZXRWYWx1ZXMoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0W10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuUG9saWN5Q29uc3RyYWludHMgZXh0ZW5kcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5FeHRlbnNpb25WYWx1ZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXF1ZW5jZSBBU04xCi0KLXByaXZhdGUgYnl0ZVtdIGVuY29kaW5nCi0KLXByaXZhdGUgZmluYWwgamF2YS5tYXRoLkJpZ0ludGVnZXIgaW5oaWJpdFBvbGljeU1hcHBpbmcKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLm1hdGguQmlnSW50ZWdlciByZXF1aXJlRXhwbGljaXRQb2xpY3kKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLm1hdGguQmlnSW50ZWdlcgotamF2YS5tYXRoLkJpZ0ludGVnZXIpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLm1hdGguQmlnSW50ZWdlcgotamF2YS5tYXRoLkJpZ0ludGVnZXIKLWJ5dGVbXSkKLQotIHZvaWQgPGluaXQ+KAotamF2YS5tYXRoLkJpZ0ludGVnZXIKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1ieXRlW10KLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LlBvbGljeUNvbnN0cmFpbnRzJDEpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWJ5dGVbXSkKLQotc3RhdGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGFjY2VzcyQxMDAoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5Qb2xpY3lDb25zdHJhaW50cykKLQotc3RhdGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGFjY2VzcyQyMDAoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5Qb2xpY3lDb25zdHJhaW50cykKLQotcHVibGljIHZvaWQgZHVtcFZhbHVlKAotamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJ5dGVbXSBnZXRFbmNvZGVkKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3g1MDkvUG9saWN5SW5mb3JtYXRpb247ICkKLWZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LlBvbGljeUluZm9ybWF0aW9uJDEgZXh0ZW5kcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xU2VxdWVuY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xVHlwZVtdKQotCi1wcm90ZWN0ZWQgamF2YS5sYW5nLk9iamVjdCBnZXREZWNvZGVkT2JqZWN0KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVySW5wdXRTdHJlYW0pCi0KLXByb3RlY3RlZCB2b2lkIGdldFZhbHVlcygKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3RbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5Qb2xpY3lJbmZvcm1hdGlvbiBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xU2VxdWVuY2UgQVNOMQotCi1wcml2YXRlIGJ5dGVbXSBlbmNvZGluZwotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcG9saWN5SWRlbnRpZmllcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotc3RhdGljIGphdmEubGFuZy5TdHJpbmcgYWNjZXNzJDAwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LlBvbGljeUluZm9ybWF0aW9uKQotCi1wdWJsaWMgdm9pZCBkdW1wVmFsdWUoCi1qYXZhLmxhbmcuU3RyaW5nQnVmZmVyKQotCi1wdWJsaWMgYnl0ZVtdIGdldEVuY29kZWQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRQb2xpY3lJZGVudGlmaWVyKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3g1MDkvUG9saWN5UXVhbGlmaWVySW5mbzsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotZmluYWwgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuUG9saWN5UXVhbGlmaWVySW5mbyQxIGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVNlcXVlbmNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVR5cGVbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5Qb2xpY3lRdWFsaWZpZXJJbmZvIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXF1ZW5jZSBBU04xCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkveDUwOS9Qcml2YXRlS2V5VXNhZ2VQZXJpb2Q7ICkKLWZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LlByaXZhdGVLZXlVc2FnZVBlcmlvZCQxIGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVNlcXVlbmNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVR5cGVbXSkKLQotcHJvdGVjdGVkIGphdmEubGFuZy5PYmplY3QgZ2V0RGVjb2RlZE9iamVjdCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkJlcklucHV0U3RyZWFtKQotCi1wcm90ZWN0ZWQgdm9pZCBnZXRWYWx1ZXMoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0W10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuUHJpdmF0ZUtleVVzYWdlUGVyaW9kIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXF1ZW5jZSBBU04xCi0KLXByaXZhdGUgYnl0ZVtdIGVuY29kaW5nCi0KLXByaXZhdGUgZmluYWwgamF2YS51dGlsLkRhdGUgbm90QWZ0ZXJEYXRlCi0KLXByaXZhdGUgZmluYWwgamF2YS51dGlsLkRhdGUgbm90QmVmb3JlRGF0ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkRhdGUKLWphdmEudXRpbC5EYXRlKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkRhdGUKLWphdmEudXRpbC5EYXRlCi1ieXRlW10pCi0KLSB2b2lkIDxpbml0PigKLWphdmEudXRpbC5EYXRlCi1qYXZhLnV0aWwuRGF0ZQotYnl0ZVtdCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5Qcml2YXRlS2V5VXNhZ2VQZXJpb2QkMSkKLQotc3RhdGljIGphdmEudXRpbC5EYXRlIGFjY2VzcyQxMDAoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5Qcml2YXRlS2V5VXNhZ2VQZXJpb2QpCi0KLXN0YXRpYyBqYXZhLnV0aWwuRGF0ZSBhY2Nlc3MkMjAwKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuUHJpdmF0ZUtleVVzYWdlUGVyaW9kKQotCi1wdWJsaWMgYnl0ZVtdIGdldEVuY29kZWQoKQotCi1wdWJsaWMgamF2YS51dGlsLkRhdGUgZ2V0Tm90QWZ0ZXIoKQotCi1wdWJsaWMgamF2YS51dGlsLkRhdGUgZ2V0Tm90QmVmb3JlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5SZWFzb25Db2RlIGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuRXh0ZW5zaW9uVmFsdWUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIEFBX0NPTVBST01JU0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIEFGRklMSUFUSU9OX0NIQU5HRUQKLQotcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xVHlwZSBBU04xCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBDQV9DT01QUk9NSVNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBDRVJUSUZJQ0FURV9IT0xECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBDRVNTQVRJT05fT0ZfT1BFUkFUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBLRVlfQ09NUFJPTUlTRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgUFJJVklMRUdFX1dJVEhEUkFXTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgUkVNT1ZFX0ZST01fQ1JMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBTVVBFUlNFREVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBVTlNQRUNJRklFRAotCi1wcml2YXRlIGZpbmFsIGJ5dGUgY29kZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYnl0ZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotYnl0ZVtdKQotCi1wdWJsaWMgdm9pZCBkdW1wVmFsdWUoCi1qYXZhLmxhbmcuU3RyaW5nQnVmZmVyCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgaW50IGdldENvZGUoKQotCi1wdWJsaWMgYnl0ZVtdIGdldEVuY29kZWQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkveDUwOS9SZWFzb25GbGFnczsgKQotZmluYWwgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuUmVhc29uRmxhZ3MkMSBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFCaXRTdHJpbmckQVNOMU5hbWVkQml0TGlzdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0RGVjb2RlZE9iamVjdCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkJlcklucHV0U3RyZWFtKQotCi1wdWJsaWMgdm9pZCBzZXRFbmNvZGluZ0NvbnRlbnQoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5CZXJPdXRwdXRTdHJlYW0pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuUmVhc29uRmxhZ3MgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMUJpdFN0cmluZyBBU04xCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZ1tdIFJFQVNPTlMKLQotcHJpdmF0ZSBib29sZWFuW10gZmxhZ3MKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWJvb2xlYW5bXSkKLQotc3RhdGljIGJvb2xlYW5bXSBhY2Nlc3MkMDAwKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuUmVhc29uRmxhZ3MpCi0KLXB1YmxpYyB2b2lkIGR1bXBWYWx1ZSgKLWphdmEubGFuZy5TdHJpbmdCdWZmZXIKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuU3ViamVjdEtleUlkZW50aWZpZXIgZXh0ZW5kcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5FeHRlbnNpb25WYWx1ZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGJ5dGVbXSBrZXlJZGVudGlmaWVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LlN1YmplY3RLZXlJZGVudGlmaWVyIGRlY29kZSgKLWJ5dGVbXSkKLQotcHVibGljIHZvaWQgZHVtcFZhbHVlKAotamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJ5dGVbXSBnZXRFbmNvZGVkKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3g1MDkvU3ViamVjdFB1YmxpY0tleUluZm87ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLWZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LlN1YmplY3RQdWJsaWNLZXlJbmZvJDEgZXh0ZW5kcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xU2VxdWVuY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xVHlwZVtdKQotCi1wcm90ZWN0ZWQgamF2YS5sYW5nLk9iamVjdCBnZXREZWNvZGVkT2JqZWN0KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVySW5wdXRTdHJlYW0pCi0KLXByb3RlY3RlZCB2b2lkIGdldFZhbHVlcygKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3RbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5TdWJqZWN0UHVibGljS2V5SW5mbyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xU2VxdWVuY2UgQVNOMQotCi1wcml2YXRlIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIgYWxnb3JpdGhtSUQKLQotcHJpdmF0ZSBieXRlW10gZW5jb2RpbmcKLQotcHJpdmF0ZSBqYXZhLnNlY3VyaXR5LlB1YmxpY0tleSBwdWJsaWNLZXkKLQotcHJpdmF0ZSBieXRlW10gc3ViamVjdFB1YmxpY0tleQotCi1wcml2YXRlIGludCB1bnVzZWRCaXRzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyCi1ieXRlW10pCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIKLWJ5dGVbXQotaW50KQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuQWxnb3JpdGhtSWRlbnRpZmllcgotYnl0ZVtdCi1pbnQKLWJ5dGVbXSkKLQotIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuQWxnb3JpdGhtSWRlbnRpZmllcgotYnl0ZVtdCi1pbnQKLWJ5dGVbXQotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuU3ViamVjdFB1YmxpY0tleUluZm8kMSkKLQotc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIgYWNjZXNzJDEwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LlN1YmplY3RQdWJsaWNLZXlJbmZvKQotCi1zdGF0aWMgYnl0ZVtdIGFjY2VzcyQyMDAoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5TdWJqZWN0UHVibGljS2V5SW5mbykKLQotc3RhdGljIGludCBhY2Nlc3MkMzAwKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuU3ViamVjdFB1YmxpY0tleUluZm8pCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyIGdldEFsZ29yaXRobUlkZW50aWZpZXIoKQotCi1wdWJsaWMgYnl0ZVtdIGdldEVuY29kZWQoKQotCi1wdWJsaWMgamF2YS5zZWN1cml0eS5QdWJsaWNLZXkgZ2V0UHVibGljS2V5KCkKLQotcHVibGljIGJ5dGVbXSBnZXRTdWJqZWN0UHVibGljS2V5KCkKLQotcHVibGljIGludCBnZXRVbnVzZWRCaXRzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3g1MDkvVEJTQ2VydExpc3Q7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLWZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LlRCU0NlcnRMaXN0JDEgZXh0ZW5kcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xU2VxdWVuY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xVHlwZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgamF2YS5sYW5nLk9iamVjdCBnZXREZWNvZGVkT2JqZWN0KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVySW5wdXRTdHJlYW0pCi0KLXByb3RlY3RlZCB2b2lkIGdldFZhbHVlcygKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3RbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3g1MDkvVEJTQ2VydExpc3QkUmV2b2tlZENlcnRpZmljYXRlOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1maW5hbCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5UQlNDZXJ0TGlzdCRSZXZva2VkQ2VydGlmaWNhdGUkMSBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXF1ZW5jZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFUeXBlW10pCi0KLXByb3RlY3RlZCBqYXZhLmxhbmcuT2JqZWN0IGdldERlY29kZWRPYmplY3QoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5CZXJJbnB1dFN0cmVhbSkKLQotcHJvdGVjdGVkIHZvaWQgZ2V0VmFsdWVzKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdFtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkveDUwOS9UQlNDZXJ0TGlzdDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPVJldm9rZWRDZXJ0aWZpY2F0ZSApCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuVEJTQ2VydExpc3QkUmV2b2tlZENlcnRpZmljYXRlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXF1ZW5jZSBBU04xCi0KLXByaXZhdGUgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuRXh0ZW5zaW9ucyBjcmxFbnRyeUV4dGVuc2lvbnMKLQotcHJpdmF0ZSBieXRlW10gZW5jb2RpbmcKLQotcHJpdmF0ZSBqYXZheC5zZWN1cml0eS5hdXRoLng1MDAuWDUwMFByaW5jaXBhbCBpc3N1ZXIKLQotcHJpdmF0ZSBib29sZWFuIGlzc3VlclJldHJpZXZlZAotCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5EYXRlIHJldm9jYXRpb25EYXRlCi0KLXByaXZhdGUgZmluYWwgamF2YS5tYXRoLkJpZ0ludGVnZXIgdXNlckNlcnRpZmljYXRlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLm1hdGguQmlnSW50ZWdlcgotamF2YS51dGlsLkRhdGUKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkV4dGVuc2lvbnMpCi0KLXN0YXRpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBhY2Nlc3MkMDAwKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuVEJTQ2VydExpc3QkUmV2b2tlZENlcnRpZmljYXRlKQotCi1zdGF0aWMgamF2YS51dGlsLkRhdGUgYWNjZXNzJDEwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LlRCU0NlcnRMaXN0JFJldm9rZWRDZXJ0aWZpY2F0ZSkKLQotc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkV4dGVuc2lvbnMgYWNjZXNzJDIwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LlRCU0NlcnRMaXN0JFJldm9rZWRDZXJ0aWZpY2F0ZSkKLQotcHVibGljIHZvaWQgZHVtcFZhbHVlKAotamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkV4dGVuc2lvbnMgZ2V0Q3JsRW50cnlFeHRlbnNpb25zKCkKLQotcHVibGljIGJ5dGVbXSBnZXRFbmNvZGVkKCkKLQotcHVibGljIGphdmF4LnNlY3VyaXR5LmF1dGgueDUwMC5YNTAwUHJpbmNpcGFsIGdldElzc3VlcigpCi0KLXB1YmxpYyBqYXZhLnV0aWwuRGF0ZSBnZXRSZXZvY2F0aW9uRGF0ZSgpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRVc2VyQ2VydGlmaWNhdGUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS94NTA5L1RCU0NlcnRMaXN0JFJldm9rZWRDZXJ0aWZpY2F0ZTsgKQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LlRCU0NlcnRMaXN0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXF1ZW5jZSBBU04xCi0KLXByaXZhdGUgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuRXh0ZW5zaW9ucyBjcmxFeHRlbnNpb25zCi0KLXByaXZhdGUgYnl0ZVtdIGVuY29kaW5nCi0KLXByaXZhdGUgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDEuTmFtZSBpc3N1ZXIKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLnV0aWwuRGF0ZSBuZXh0VXBkYXRlCi0KLXByaXZhdGUgZmluYWwgamF2YS51dGlsLkxpc3QgcmV2b2tlZENlcnRpZmljYXRlcwotCi1wcml2YXRlIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIgc2lnbmF0dXJlCi0KLXByaXZhdGUgZmluYWwgamF2YS51dGlsLkRhdGUgdGhpc1VwZGF0ZQotCi1wcml2YXRlIGZpbmFsIGludCB2ZXJzaW9uCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTAxLk5hbWUKLWphdmEudXRpbC5EYXRlCi1qYXZhLnV0aWwuRGF0ZQotamF2YS51dGlsLkxpc3QKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkV4dGVuc2lvbnMpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1pbnQKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTAxLk5hbWUKLWphdmEudXRpbC5EYXRlCi1qYXZhLnV0aWwuRGF0ZQotamF2YS51dGlsLkxpc3QKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkV4dGVuc2lvbnMKLWJ5dGVbXSkKLQotIHZvaWQgPGluaXQ+KAotaW50Ci1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwMS5OYW1lCi1qYXZhLnV0aWwuRGF0ZQotamF2YS51dGlsLkRhdGUKLWphdmEudXRpbC5MaXN0Ci1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5FeHRlbnNpb25zCi1ieXRlW10KLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LlRCU0NlcnRMaXN0JDEpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTAxLk5hbWUKLWphdmEudXRpbC5EYXRlKQotCi1zdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuRXh0ZW5zaW9ucyBhY2Nlc3MkMTAwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LlRCU0NlcnRMaXN0KQotCi1zdGF0aWMgaW50IGFjY2VzcyQ0MDAoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5UQlNDZXJ0TGlzdCkKLQotc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIgYWNjZXNzJDUwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LlRCU0NlcnRMaXN0KQotCi1zdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDEuTmFtZSBhY2Nlc3MkNjAwKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuVEJTQ2VydExpc3QpCi0KLXN0YXRpYyBqYXZhLnV0aWwuRGF0ZSBhY2Nlc3MkNzAwKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuVEJTQ2VydExpc3QpCi0KLXN0YXRpYyBqYXZhLnV0aWwuRGF0ZSBhY2Nlc3MkODAwKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuVEJTQ2VydExpc3QpCi0KLXN0YXRpYyBqYXZhLnV0aWwuTGlzdCBhY2Nlc3MkOTAwKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuVEJTQ2VydExpc3QpCi0KLXB1YmxpYyB2b2lkIGR1bXBWYWx1ZSgKLWphdmEubGFuZy5TdHJpbmdCdWZmZXIpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5FeHRlbnNpb25zIGdldENybEV4dGVuc2lvbnMoKQotCi1wdWJsaWMgYnl0ZVtdIGdldEVuY29kZWQoKQotCi1wdWJsaWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDEuTmFtZSBnZXRJc3N1ZXIoKQotCi1wdWJsaWMgamF2YS51dGlsLkRhdGUgZ2V0TmV4dFVwZGF0ZSgpCi0KLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRSZXZva2VkQ2VydGlmaWNhdGVzKCkKLQotcHVibGljIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIgZ2V0U2lnbmF0dXJlKCkKLQotcHVibGljIGphdmEudXRpbC5EYXRlIGdldFRoaXNVcGRhdGUoKQotCi1wdWJsaWMgaW50IGdldFZlcnNpb24oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkveDUwOS9UQlNDZXJ0aWZpY2F0ZTsgKQotZmluYWwgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuVEJTQ2VydGlmaWNhdGUkMSBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXF1ZW5jZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFUeXBlW10pCi0KLXByb3RlY3RlZCBqYXZhLmxhbmcuT2JqZWN0IGdldERlY29kZWRPYmplY3QoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5CZXJJbnB1dFN0cmVhbSkKLQotcHJvdGVjdGVkIHZvaWQgZ2V0VmFsdWVzKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdFtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LlRCU0NlcnRpZmljYXRlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXF1ZW5jZSBBU04xCi0KLSBieXRlW10gZW5jb2RpbmcKLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5FeHRlbnNpb25zIGV4dGVuc2lvbnMKLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwMS5OYW1lIGlzc3VlcgotCi1wcml2YXRlIGZpbmFsIGJvb2xlYW5bXSBpc3N1ZXJVbmlxdWVJRAotCi1wcml2YXRlIGZpbmFsIGphdmEubWF0aC5CaWdJbnRlZ2VyIHNlcmlhbE51bWJlcgotCi1wcml2YXRlIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIgc2lnbmF0dXJlCi0KLXByaXZhdGUgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDEuTmFtZSBzdWJqZWN0Ci0KLXByaXZhdGUgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuU3ViamVjdFB1YmxpY0tleUluZm8gc3ViamVjdFB1YmxpY0tleUluZm8KLQotcHJpdmF0ZSBmaW5hbCBib29sZWFuW10gc3ViamVjdFVuaXF1ZUlECi0KLXByaXZhdGUgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuVmFsaWRpdHkgdmFsaWRpdHkKLQotcHJpdmF0ZSBmaW5hbCBpbnQgdmVyc2lvbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50Ci1qYXZhLm1hdGguQmlnSW50ZWdlcgotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuQWxnb3JpdGhtSWRlbnRpZmllcgotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDEuTmFtZQotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuVmFsaWRpdHkKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTAxLk5hbWUKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LlN1YmplY3RQdWJsaWNLZXlJbmZvKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwMS5OYW1lCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5WYWxpZGl0eQotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDEuTmFtZQotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuU3ViamVjdFB1YmxpY0tleUluZm8KLWJvb2xlYW5bXQotYm9vbGVhbltdCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5FeHRlbnNpb25zKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotaW50Ci1qYXZhLm1hdGguQmlnSW50ZWdlcgotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuQWxnb3JpdGhtSWRlbnRpZmllcgotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDEuTmFtZQotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuVmFsaWRpdHkKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTAxLk5hbWUKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LlN1YmplY3RQdWJsaWNLZXlJbmZvCi1ib29sZWFuW10KLWJvb2xlYW5bXQotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuRXh0ZW5zaW9ucwotYnl0ZVtdKQotCi0gdm9pZCA8aW5pdD4oCi1pbnQKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwMS5OYW1lCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5WYWxpZGl0eQotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDEuTmFtZQotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuU3ViamVjdFB1YmxpY0tleUluZm8KLWJvb2xlYW5bXQotYm9vbGVhbltdCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5FeHRlbnNpb25zCi1ieXRlW10KLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LlRCU0NlcnRpZmljYXRlJDEpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDEwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LlRCU0NlcnRpZmljYXRlKQotCi1zdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuRXh0ZW5zaW9ucyBhY2Nlc3MkMTAwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LlRCU0NlcnRpZmljYXRlKQotCi1zdGF0aWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgYWNjZXNzJDIwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LlRCU0NlcnRpZmljYXRlKQotCi1zdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuQWxnb3JpdGhtSWRlbnRpZmllciBhY2Nlc3MkMzAwKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuVEJTQ2VydGlmaWNhdGUpCi0KLXN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwMS5OYW1lIGFjY2VzcyQ0MDAoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5UQlNDZXJ0aWZpY2F0ZSkKLQotc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LlZhbGlkaXR5IGFjY2VzcyQ1MDAoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5UQlNDZXJ0aWZpY2F0ZSkKLQotc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTAxLk5hbWUgYWNjZXNzJDYwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LlRCU0NlcnRpZmljYXRlKQotCi1zdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuU3ViamVjdFB1YmxpY0tleUluZm8gYWNjZXNzJDcwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LlRCU0NlcnRpZmljYXRlKQotCi1zdGF0aWMgYm9vbGVhbltdIGFjY2VzcyQ4MDAoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5UQlNDZXJ0aWZpY2F0ZSkKLQotc3RhdGljIGJvb2xlYW5bXSBhY2Nlc3MkOTAwKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuVEJTQ2VydGlmaWNhdGUpCi0KLXB1YmxpYyB2b2lkIGR1bXBWYWx1ZSgKLWphdmEubGFuZy5TdHJpbmdCdWZmZXIpCi0KLXB1YmxpYyBieXRlW10gZ2V0RW5jb2RlZCgpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5FeHRlbnNpb25zIGdldEV4dGVuc2lvbnMoKQotCi1wdWJsaWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDEuTmFtZSBnZXRJc3N1ZXIoKQotCi1wdWJsaWMgYm9vbGVhbltdIGdldElzc3VlclVuaXF1ZUlEKCkKLQotcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldFNlcmlhbE51bWJlcigpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyIGdldFNpZ25hdHVyZSgpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwMS5OYW1lIGdldFN1YmplY3QoKQotCi1wdWJsaWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuU3ViamVjdFB1YmxpY0tleUluZm8gZ2V0U3ViamVjdFB1YmxpY0tleUluZm8oKQotCi1wdWJsaWMgYm9vbGVhbltdIGdldFN1YmplY3RVbmlxdWVJRCgpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5WYWxpZGl0eSBnZXRWYWxpZGl0eSgpCi0KLXB1YmxpYyBpbnQgZ2V0VmVyc2lvbigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS94NTA5L1RpbWU7ICkKLWZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LlRpbWUkMSBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFDaG9pY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xVHlwZVtdKQotCi1wdWJsaWMgaW50IGdldEluZGV4KAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0T2JqZWN0VG9FbmNvZGUoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LlRpbWUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMUNob2ljZSBBU04xCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgSkFOXzAxXzIwNTAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuVXRpbHMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzUHJpbnRhYmxlU3RyaW5nKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3g1MDkvVmFsaWRpdHk7ICkKLWZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LlZhbGlkaXR5JDEgZXh0ZW5kcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xU2VxdWVuY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xVHlwZVtdKQotCi1wcm90ZWN0ZWQgamF2YS5sYW5nLk9iamVjdCBnZXREZWNvZGVkT2JqZWN0KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVySW5wdXRTdHJlYW0pCi0KLXByb3RlY3RlZCB2b2lkIGdldFZhbHVlcygKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3RbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5WYWxpZGl0eSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xU2VxdWVuY2UgQVNOMQotCi1wcml2YXRlIGJ5dGVbXSBlbmNvZGluZwotCi1wcml2YXRlIGZpbmFsIGphdmEudXRpbC5EYXRlIG5vdEFmdGVyCi0KLXByaXZhdGUgZmluYWwgamF2YS51dGlsLkRhdGUgbm90QmVmb3JlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuRGF0ZQotamF2YS51dGlsLkRhdGUpCi0KLXN0YXRpYyBqYXZhLnV0aWwuRGF0ZSBhY2Nlc3MkMDAwKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuVmFsaWRpdHkpCi0KLXN0YXRpYyBqYXZhLnV0aWwuRGF0ZSBhY2Nlc3MkMTAwKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuVmFsaWRpdHkpCi0KLXB1YmxpYyBieXRlW10gZ2V0RW5jb2RlZCgpCi0KLXB1YmxpYyBqYXZhLnV0aWwuRGF0ZSBnZXROb3RBZnRlcigpCi0KLXB1YmxpYyBqYXZhLnV0aWwuRGF0ZSBnZXROb3RCZWZvcmUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5Llg1MDlQdWJsaWNLZXkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5QdWJsaWNLZXkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGFsZ29yaXRobQotCi1wcml2YXRlIGZpbmFsIGJ5dGVbXSBlbmNvZGVkCi0KLXByaXZhdGUgZmluYWwgYnl0ZVtdIGtleUJ5dGVzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotYnl0ZVtdCi1ieXRlW10pCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEFsZ29yaXRobSgpCi0KLXB1YmxpYyBieXRlW10gZ2V0RW5jb2RlZCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEZvcm1hdCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3g1MDkvdHNwL01lc3NhZ2VJbXByaW50OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1maW5hbCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS50c3AuTWVzc2FnZUltcHJpbnQkMSBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXF1ZW5jZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFUeXBlW10pCi0KLXByb3RlY3RlZCBqYXZhLmxhbmcuT2JqZWN0IGdldERlY29kZWRPYmplY3QoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5CZXJJbnB1dFN0cmVhbSkKLQotcHJvdGVjdGVkIHZvaWQgZ2V0VmFsdWVzKAotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdFtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LnRzcC5NZXNzYWdlSW1wcmludCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xU2VxdWVuY2UgQVNOMQotCi1wcml2YXRlIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIgYWxnSWQKLQotcHJpdmF0ZSBmaW5hbCBieXRlW10gaGFzaGVkTWVzc2FnZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuQWxnb3JpdGhtSWRlbnRpZmllcgotYnl0ZVtdKQotCi1zdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuQWxnb3JpdGhtSWRlbnRpZmllciBhY2Nlc3MkMDAwKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkudHNwLk1lc3NhZ2VJbXByaW50KQotCi1zdGF0aWMgYnl0ZVtdIGFjY2VzcyQxMDAoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS50c3AuTWVzc2FnZUltcHJpbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvRW51bTxMb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3g1MDkvdHNwL1BLSUZhaWx1cmVJbmZvOz47ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS50c3AuUEtJRmFpbHVyZUluZm8gZXh0ZW5kcyBqYXZhLmxhbmcuRW51bQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS50c3AuUEtJRmFpbHVyZUluZm9bXSAkVkFMVUVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkudHNwLlBLSUZhaWx1cmVJbmZvIEFERF9JTkZPX05PVF9BVkFJTEFCTEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS50c3AuUEtJRmFpbHVyZUluZm8gQkFEX0FMRwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LnRzcC5QS0lGYWlsdXJlSW5mbyBCQURfREFUQV9GT1JNQVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS50c3AuUEtJRmFpbHVyZUluZm8gQkFEX1JFUVVFU1QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS50c3AuUEtJRmFpbHVyZUluZm8gU1lTVEVNX0ZBSUxVUkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS50c3AuUEtJRmFpbHVyZUluZm8gVElNRV9OT1RfQVZBSUxBQkxFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkudHNwLlBLSUZhaWx1cmVJbmZvIFVOQUNDRVBURURfRVhURU5TSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkudHNwLlBLSUZhaWx1cmVJbmZvIFVOQUNDRVBURURfUE9MSUNZCi0KLXByaXZhdGUgc3RhdGljIGludCBtYXhWYWx1ZQotCi1wcml2YXRlIGZpbmFsIGludCB2YWx1ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSSlWICkKLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS50c3AuUEtJRmFpbHVyZUluZm8gZ2V0SW5zdGFuY2UoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgaW50IGdldE1heFZhbHVlKCkKLQotcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS50c3AuUEtJRmFpbHVyZUluZm8gdmFsdWVPZigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkudHNwLlBLSUZhaWx1cmVJbmZvW10gdmFsdWVzKCkKLQotcHVibGljIGludCBnZXRWYWx1ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL2xhbmcvRW51bTxMb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3g1MDkvdHNwL1BLSVN0YXR1czs+OyApCi1wdWJsaWMgZmluYWwgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkudHNwLlBLSVN0YXR1cyBleHRlbmRzIGphdmEubGFuZy5FbnVtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LnRzcC5QS0lTdGF0dXNbXSAkVkFMVUVTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkudHNwLlBLSVN0YXR1cyBHUkFOVEVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkudHNwLlBLSVN0YXR1cyBHUkFOVEVEX1dJVEhfTU9EUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LnRzcC5QS0lTdGF0dXMgUkVKRUNUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkudHNwLlBLSVN0YXR1cyBSRVZPQ0FUSU9OX05PVElGSUNBVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LnRzcC5QS0lTdGF0dXMgUkVWT0NBVElPTl9XQVJOSU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkudHNwLlBLSVN0YXR1cyBXQUlUSU5HCi0KLXByaXZhdGUgZmluYWwgaW50IHN0YXR1cwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oSSlWICkKLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS50c3AuUEtJU3RhdHVzIGdldEluc3RhbmNlKAotaW50KQotCi1wdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LnRzcC5QS0lTdGF0dXMgdmFsdWVPZigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkudHNwLlBLSVN0YXR1c1tdIHZhbHVlcygpCi0KLXB1YmxpYyBpbnQgZ2V0U3RhdHVzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3g1MDkvdHNwL1BLSVN0YXR1c0luZm87ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLWZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LnRzcC5QS0lTdGF0dXNJbmZvJDEgZXh0ZW5kcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xU2VxdWVuY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xVHlwZVtdKQotCi1wcm90ZWN0ZWQgamF2YS5sYW5nLk9iamVjdCBnZXREZWNvZGVkT2JqZWN0KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVySW5wdXRTdHJlYW0pCi0KLXByb3RlY3RlZCB2b2lkIGdldFZhbHVlcygKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3RbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS50c3AuUEtJU3RhdHVzSW5mbyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xU2VxdWVuY2UgQVNOMQotCi1wcml2YXRlIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LnRzcC5QS0lGYWlsdXJlSW5mbyBmYWlsSW5mbwotCi1wcml2YXRlIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LnRzcC5QS0lTdGF0dXMgc3RhdHVzCi0KLXByaXZhdGUgZmluYWwgamF2YS51dGlsLkxpc3Qgc3RhdHVzU3RyaW5nCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS50c3AuUEtJU3RhdHVzCi1qYXZhLnV0aWwuTGlzdAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkudHNwLlBLSUZhaWx1cmVJbmZvKQotCi1zdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkudHNwLlBLSVN0YXR1cyBhY2Nlc3MkMDAwKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkudHNwLlBLSVN0YXR1c0luZm8pCi0KLXN0YXRpYyBqYXZhLnV0aWwuTGlzdCBhY2Nlc3MkMTAwKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkudHNwLlBLSVN0YXR1c0luZm8pCi0KLXN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS50c3AuUEtJRmFpbHVyZUluZm8gYWNjZXNzJDIwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LnRzcC5QS0lTdGF0dXNJbmZvKQotCi1wdWJsaWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkudHNwLlBLSUZhaWx1cmVJbmZvIGdldEZhaWxJbmZvKCkKLQotcHVibGljIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LnRzcC5QS0lTdGF0dXMgZ2V0U3RhdHVzKCkKLQotcHVibGljIGphdmEudXRpbC5MaXN0IGdldFN0YXR1c1N0cmluZygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3g1MDkvdHNwL1RTVEluZm87ICkKLWZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LnRzcC5UU1RJbmZvJDEgZXh0ZW5kcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xU2VxdWVuY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xVHlwZVtdKQotCi1wcm90ZWN0ZWQgamF2YS5sYW5nLk9iamVjdCBnZXREZWNvZGVkT2JqZWN0KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVySW5wdXRTdHJlYW0pCi0KLXByb3RlY3RlZCB2b2lkIGdldFZhbHVlcygKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3RbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3NlY3VyaXR5L3g1MDkvdHNwL1RTVEluZm87ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1udWxsICkKLWZpbmFsIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LnRzcC5UU1RJbmZvJDIgZXh0ZW5kcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xU2VxdWVuY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xVHlwZVtdKQotCi1wcm90ZWN0ZWQgamF2YS5sYW5nLk9iamVjdCBnZXREZWNvZGVkT2JqZWN0KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVySW5wdXRTdHJlYW0pCi0KLXByb3RlY3RlZCB2b2lkIGdldFZhbHVlcygKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3RbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS50c3AuVFNUSW5mbyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xU2VxdWVuY2UgQUNDVVJBQ1kKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xU2VxdWVuY2UgQVNOMQotCi1wcml2YXRlIGZpbmFsIGludFtdIGFjY3VyYWN5Ci0KLXByaXZhdGUgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuRXh0ZW5zaW9ucyBleHRlbnNpb25zCi0KLXByaXZhdGUgZmluYWwgamF2YS51dGlsLkRhdGUgZ2VuVGltZQotCi1wcml2YXRlIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LnRzcC5NZXNzYWdlSW1wcmludCBtZXNzYWdlSW1wcmludAotCi1wcml2YXRlIGZpbmFsIGphdmEubWF0aC5CaWdJbnRlZ2VyIG5vbmNlCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLkJvb2xlYW4gb3JkZXJpbmcKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIHBvbGljeQotCi1wcml2YXRlIGZpbmFsIGphdmEubWF0aC5CaWdJbnRlZ2VyIHNlcmlhbE51bWJlcgotCi1wcml2YXRlIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkdlbmVyYWxOYW1lIHRzYQotCi1wcml2YXRlIGZpbmFsIGludCB2ZXJzaW9uCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWphdmEubGFuZy5TdHJpbmcKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LnRzcC5NZXNzYWdlSW1wcmludAotamF2YS5tYXRoLkJpZ0ludGVnZXIKLWphdmEudXRpbC5EYXRlCi1pbnRbXQotamF2YS5sYW5nLkJvb2xlYW4KLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5HZW5lcmFsTmFtZQotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuRXh0ZW5zaW9ucykKLQotc3RhdGljIGludCBhY2Nlc3MkMDAwKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkudHNwLlRTVEluZm8pCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGFjY2VzcyQxMDAoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS50c3AuVFNUSW5mbykKLQotc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LnRzcC5NZXNzYWdlSW1wcmludCBhY2Nlc3MkMjAwKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkudHNwLlRTVEluZm8pCi0KLXN0YXRpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBhY2Nlc3MkMzAwKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkudHNwLlRTVEluZm8pCi0KLXN0YXRpYyBqYXZhLnV0aWwuRGF0ZSBhY2Nlc3MkNDAwKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkudHNwLlRTVEluZm8pCi0KLXN0YXRpYyBpbnRbXSBhY2Nlc3MkNTAwKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkudHNwLlRTVEluZm8pCi0KLXN0YXRpYyBqYXZhLmxhbmcuQm9vbGVhbiBhY2Nlc3MkNjAwKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkudHNwLlRTVEluZm8pCi0KLXN0YXRpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBhY2Nlc3MkNzAwKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkudHNwLlRTVEluZm8pCi0KLXN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5HZW5lcmFsTmFtZSBhY2Nlc3MkODAwKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkudHNwLlRTVEluZm8pCi0KLXN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS5FeHRlbnNpb25zIGFjY2VzcyQ5MDAoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS50c3AuVFNUSW5mbykKLQotcHVibGljIGludFtdIGdldEFjY3VyYWN5KCkKLQotcHVibGljIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkV4dGVuc2lvbnMgZ2V0RXh0ZW5zaW9ucygpCi0KLXB1YmxpYyBqYXZhLnV0aWwuRGF0ZSBnZXRHZW5UaW1lKCkKLQotcHVibGljIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LnRzcC5NZXNzYWdlSW1wcmludCBnZXRNZXNzYWdlSW1wcmludCgpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXROb25jZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuQm9vbGVhbiBnZXRPcmRlcmluZygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFBvbGljeSgpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRTZXJpYWxOdW1iZXIoKQotCi1wdWJsaWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuR2VuZXJhbE5hbWUgZ2V0VHNhKCkKLQotcHVibGljIGludCBnZXRWZXJzaW9uKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkvc2VjdXJpdHkveDUwOS90c3AvVGltZVN0YW1wUmVxOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1maW5hbCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS50c3AuVGltZVN0YW1wUmVxJDEgZXh0ZW5kcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xU2VxdWVuY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkuYXNuMS5BU04xVHlwZVtdKQotCi1wcm90ZWN0ZWQgamF2YS5sYW5nLk9iamVjdCBnZXREZWNvZGVkT2JqZWN0KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQmVySW5wdXRTdHJlYW0pCi0KLXByb3RlY3RlZCB2b2lkIGdldFZhbHVlcygKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5PYmplY3RbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS50c3AuVGltZVN0YW1wUmVxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkFTTjFTZXF1ZW5jZSBBU04xCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLkJvb2xlYW4gY2VydFJlcQotCi1wcml2YXRlIGJ5dGVbXSBlbmNvZGluZwotCi1wcml2YXRlIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkV4dGVuc2lvbnMgZXh0ZW5zaW9ucwotCi1wcml2YXRlIGZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LnRzcC5NZXNzYWdlSW1wcmludCBtZXNzYWdlSW1wcmludAotCi1wcml2YXRlIGZpbmFsIGphdmEubWF0aC5CaWdJbnRlZ2VyIG5vbmNlCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyByZXFQb2xpY3kKLQotcHJpdmF0ZSBmaW5hbCBpbnQgdmVyc2lvbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50Ci1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS50c3AuTWVzc2FnZUltcHJpbnQKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1qYXZhLmxhbmcuQm9vbGVhbgotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuRXh0ZW5zaW9ucykKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWludAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkudHNwLk1lc3NhZ2VJbXByaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLm1hdGguQmlnSW50ZWdlcgotamF2YS5sYW5nLkJvb2xlYW4KLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkV4dGVuc2lvbnMKLWJ5dGVbXSkKLQotIHZvaWQgPGluaXQ+KAotaW50Ci1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS50c3AuTWVzc2FnZUltcHJpbnQKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1qYXZhLmxhbmcuQm9vbGVhbgotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkuRXh0ZW5zaW9ucwotYnl0ZVtdCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS50c3AuVGltZVN0YW1wUmVxJDEpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDEwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LnRzcC5UaW1lU3RhbXBSZXEpCi0KLXN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS50c3AuTWVzc2FnZUltcHJpbnQgYWNjZXNzJDIwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LnRzcC5UaW1lU3RhbXBSZXEpCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGFjY2VzcyQzMDAoCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS50c3AuVGltZVN0YW1wUmVxKQotCi1zdGF0aWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgYWNjZXNzJDQwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LnRzcC5UaW1lU3RhbXBSZXEpCi0KLXN0YXRpYyBqYXZhLmxhbmcuQm9vbGVhbiBhY2Nlc3MkNTAwKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkudHNwLlRpbWVTdGFtcFJlcSkKLQotc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkV4dGVuc2lvbnMgYWNjZXNzJDYwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LnRzcC5UaW1lU3RhbXBSZXEpCi0KLXB1YmxpYyBqYXZhLmxhbmcuQm9vbGVhbiBnZXRDZXJ0UmVxKCkKLQotcHVibGljIGJ5dGVbXSBnZXRFbmNvZGVkKCkKLQotcHVibGljIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LkV4dGVuc2lvbnMgZ2V0RXh0ZW5zaW9ucygpCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS50c3AuTWVzc2FnZUltcHJpbnQgZ2V0TWVzc2FnZUltcHJpbnQoKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgZ2V0Tm9uY2UoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRSZXFQb2xpY3koKQotCi1wdWJsaWMgaW50IGdldFZlcnNpb24oKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS9zZWN1cml0eS94NTA5L3RzcC9UaW1lU3RhbXBSZXNwOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1maW5hbCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS50c3AuVGltZVN0YW1wUmVzcCQxIGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVNlcXVlbmNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVR5cGVbXSkKLQotcHJvdGVjdGVkIGphdmEubGFuZy5PYmplY3QgZ2V0RGVjb2RlZE9iamVjdCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5hc24xLkJlcklucHV0U3RyZWFtKQotCi1wcm90ZWN0ZWQgdm9pZCBnZXRWYWx1ZXMoCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0W10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkudHNwLlRpbWVTdGFtcFJlc3AgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5LmFzbjEuQVNOMVNlcXVlbmNlIEFTTjEKLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS50c3AuUEtJU3RhdHVzSW5mbyBzdGF0dXMKLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkucGtjczcuQ29udGVudEluZm8gdGltZVN0YW1wVG9rZW4KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LnRzcC5QS0lTdGF0dXNJbmZvCi1vcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkucGtjczcuQ29udGVudEluZm8pCi0KLXN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkueDUwOS50c3AuUEtJU3RhdHVzSW5mbyBhY2Nlc3MkMDAwKAotb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkudHNwLlRpbWVTdGFtcFJlc3ApCi0KLXN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkuc2VjdXJpdHkucGtjczcuQ29udGVudEluZm8gYWNjZXNzJDEwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS54NTA5LnRzcC5UaW1lU3RhbXBSZXNwKQotCi1wdWJsaWMgb3JnLmFwYWNoZS5oYXJtb255LnNlY3VyaXR5Lng1MDkudHNwLlBLSVN0YXR1c0luZm8gZ2V0U3RhdHVzKCkKLQotcHVibGljIG9yZy5hcGFjaGUuaGFybW9ueS5zZWN1cml0eS5wa2NzNy5Db250ZW50SW5mbyBnZXRUaW1lU3RhbXBUb2tlbigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkuc3FsLmludGVybmFsLm5scy5NZXNzYWdlcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBzUmVzb3VyY2UKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygKLWphdmEubGFuZy5TdHJpbmcKLWNoYXIpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3RbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkudGV4dC5CaWRpUnVuIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGludCBsZXZlbAotCi1wcml2YXRlIGZpbmFsIGludCBsaW1pdAotCi1wcml2YXRlIGZpbmFsIGludCBzdGFydAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBpbnQgZ2V0TGV2ZWwoKQotCi1wdWJsaWMgaW50IGdldExpbWl0KCkKLQotcHVibGljIGludCBnZXRTdGFydCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnRleHQuQmlkaVdyYXBwZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVCSURJX0RFRkFVTFRfTFRSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVCSURJX0RFRkFVTFRfUlRMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVCSURJX0RPX01JUlJPUklORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBVQklESV9JTlNFUlRfTFJNX0ZPUl9OVU1FUklDCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVCSURJX0tFRVBfQkFTRV9DT01CSU5JTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVUJJRElfTEVWRUxfT1ZFUlJJREUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVUJJRElfTUFYX0VYUExJQ0lUX0xFVkVMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVCSURJX09VVFBVVF9SRVZFUlNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVCSURJX1JFTU9WRV9CSURJX0NPTlRST0xTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVCaURpRGlyZWN0aW9uX1VCSURJX0xUUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBVQmlEaURpcmVjdGlvbl9VQklESV9NSVhFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBVQmlEaURpcmVjdGlvbl9VQklESV9SVEwKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHViaWRpX2Nsb3NlKAotbG9uZykKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IHViaWRpX2NvdW50UnVucygKLWxvbmcpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCB1YmlkaV9nZXREaXJlY3Rpb24oCi1sb25nKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgdWJpZGlfZ2V0TGVuZ3RoKAotbG9uZykKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgYnl0ZVtdIHViaWRpX2dldExldmVscygKLWxvbmcpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGJ5dGUgdWJpZGlfZ2V0UGFyYUxldmVsKAotbG9uZykKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgb3JnLmFwYWNoZS5oYXJtb255LnRleHQuQmlkaVJ1bltdIHViaWRpX2dldFJ1bnMoCi1sb25nKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBsb25nIHViaWRpX29wZW4oKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnRbXSB1YmlkaV9yZW9yZGVyVmlzdWFsKAotYnl0ZVtdCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGxvbmcgdWJpZGlfc2V0TGluZSgKLWxvbmcKLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHViaWRpX3NldFBhcmEoCi1sb25nCi1jaGFyW10KLWludAotYnl0ZQotYnl0ZVtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS50ZXh0LmludGVybmFsLm5scy5NZXNzYWdlcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBzUmVzb3VyY2UKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygKLWphdmEubGFuZy5TdHJpbmcKLWNoYXIpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLk9iamVjdAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3RbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLnhtbC5zYXguQXR0cmlidXRlcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldEluZGV4KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IGludCBnZXRJbmRleCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0TGVuZ3RoKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0TG9jYWxOYW1lKAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRRTmFtZSgKLWludCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0VHlwZSgKLWludCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0VHlwZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldFR5cGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRVUkkoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldFZhbHVlKAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRWYWx1ZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldFZhbHVlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLWFic3RyYWN0IGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS54bWwuRXhwYXRBdHRyaWJ1dGVzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy54bWwuc2F4LkF0dHJpYnV0ZXMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDREFUQQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXN0YXRpYyBuYXRpdmUgdm9pZCBmcmVlQXR0cmlidXRlcygKLWludCkKLQotc3RhdGljIG5hdGl2ZSBpbnQgZ2V0SW5kZXgoCi1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi0KLXN0YXRpYyBuYXRpdmUgaW50IGdldEluZGV4KAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1zdGF0aWMgbmF0aXZlIGphdmEubGFuZy5TdHJpbmcgZ2V0TG9jYWxOYW1lKAotaW50Ci1pbnQKLWludCkKLQotc3RhdGljIG5hdGl2ZSBqYXZhLmxhbmcuU3RyaW5nIGdldFFOYW1lKAotaW50Ci1pbnQKLWludCkKLQotc3RhdGljIG5hdGl2ZSBqYXZhLmxhbmcuU3RyaW5nIGdldFVSSSgKLWludAotaW50Ci1pbnQpCi0KLXN0YXRpYyBuYXRpdmUgamF2YS5sYW5nLlN0cmluZyBnZXRWYWx1ZSgKLWludAotaW50KQotCi1zdGF0aWMgbmF0aXZlIGphdmEubGFuZy5TdHJpbmcgZ2V0VmFsdWUoCi1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi0KLXN0YXRpYyBuYXRpdmUgamF2YS5sYW5nLlN0cmluZyBnZXRWYWx1ZSgKLWludAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGludCBnZXRJbmRleCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBpbnQgZ2V0SW5kZXgoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldExlbmd0aCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldExvY2FsTmFtZSgKLWludCkKLQotYWJzdHJhY3QgaW50IGdldFBhcnNlclBvaW50ZXIoKQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldFBvaW50ZXIoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRRTmFtZSgKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VHlwZSgKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VHlwZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFR5cGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRVUkkoCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFZhbHVlKAotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRWYWx1ZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFZhbHVlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLSBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkueG1sLkV4cGF0RXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLkV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS94bWwvRXhwYXRQYXJzZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9NDEwNCBuYW1lID1udWxsICkKLSBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkueG1sLkV4cGF0UGFyc2VyJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPUNsb25lZEF0dHJpYnV0ZXMgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS94bWwvRXhwYXRQYXJzZXI7ICkKLSBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkueG1sLkV4cGF0UGFyc2VyJENsb25lZEF0dHJpYnV0ZXMgZXh0ZW5kcyBvcmcuYXBhY2hlLmhhcm1vbnkueG1sLkV4cGF0QXR0cmlidXRlcwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzIEVNUFRZCi0KLXByaXZhdGUgZmluYWwgaW50IGxlbmd0aAotCi1wcml2YXRlIGZpbmFsIGludCBwYXJzZXJQb2ludGVyCi0KLXByaXZhdGUgaW50IHBvaW50ZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1pbnQKLWludAotaW50KQotCi0gdm9pZCA8aW5pdD4oCi1pbnQKLWludAotaW50Ci1vcmcuYXBhY2hlLmhhcm1vbnkueG1sLkV4cGF0UGFyc2VyJDEpCi0KLXN0YXRpYyBvcmcueG1sLnNheC5BdHRyaWJ1dGVzIGFjY2VzcyQ0MDAoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvVGhyb3dhYmxlOyApCi1wcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpCi0KLXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkKLQotcHVibGljIGludCBnZXRQYXJzZXJQb2ludGVyKCkKLQotcHVibGljIGludCBnZXRQb2ludGVyKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3htbC9FeHBhdFBhcnNlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPUN1cnJlbnRBdHRyaWJ1dGVzICkKLSBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkueG1sLkV4cGF0UGFyc2VyJEN1cnJlbnRBdHRyaWJ1dGVzIGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnhtbC5FeHBhdEF0dHJpYnV0ZXMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnhtbC5FeHBhdFBhcnNlciB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnhtbC5FeHBhdFBhcnNlcikKLQotIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnhtbC5FeHBhdFBhcnNlcgotb3JnLmFwYWNoZS5oYXJtb255LnhtbC5FeHBhdFBhcnNlciQxKQotCi1wdWJsaWMgaW50IGdldExlbmd0aCgpCi0KLXB1YmxpYyBpbnQgZ2V0UGFyc2VyUG9pbnRlcigpCi0KLXB1YmxpYyBpbnQgZ2V0UG9pbnRlcigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3htbC9FeHBhdFBhcnNlciQxO0xvcmcvYXBhY2hlL2hhcm1vbnkveG1sL0V4cGF0UGFyc2VyJEVudGl0eVBhcnNlcjtMb3JnL2FwYWNoZS9oYXJtb255L3htbC9FeHBhdFBhcnNlciRQYXJzZUV4Y2VwdGlvbjtMb3JnL2FwYWNoZS9oYXJtb255L3htbC9FeHBhdFBhcnNlciRDdXJyZW50QXR0cmlidXRlcztMb3JnL2FwYWNoZS9oYXJtb255L3htbC9FeHBhdFBhcnNlciRFeHBhdExvY2F0b3I7TG9yZy9hcGFjaGUvaGFybW9ueS94bWwvRXhwYXRQYXJzZXIkQ2xvbmVkQXR0cmlidXRlczsgKQotIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS54bWwuRXhwYXRQYXJzZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVUZGRVJfU0laRQotCi1zdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDSEFSQUNURVJfRU5DT0RJTkcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERUZBVUxUX0VOQ09ESU5HCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgT1VUU0lERV9TVEFSVF9FTEVNRU5UCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUSU1FT1VUCi0KLXByaXZhdGUgaW50IGF0dHJpYnV0ZUNvdW50Ci0KLXByaXZhdGUgaW50IGF0dHJpYnV0ZVBvaW50ZXIKLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkueG1sLkV4cGF0QXR0cmlidXRlcyBhdHRyaWJ1dGVzCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBlbmNvZGluZwotCi1wcml2YXRlIGJvb2xlYW4gaW5TdGFydEVsZW1lbnQKLQotcHJpdmF0ZSBmaW5hbCBvcmcueG1sLnNheC5Mb2NhdG9yIGxvY2F0b3IKLQotcHJpdmF0ZSBpbnQgcG9pbnRlcgotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgcHVibGljSWQKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIHN5c3RlbUlkCi0KLXByaXZhdGUgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnhtbC5FeHBhdFJlYWRlciB4bWxSZWFkZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1vcmcuYXBhY2hlLmhhcm1vbnkueG1sLkV4cGF0UmVhZGVyCi1pbnQKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLW9yZy5hcGFjaGUuaGFybW9ueS54bWwuRXhwYXRSZWFkZXIKLWludAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotb3JnLmFwYWNoZS5oYXJtb255LnhtbC5FeHBhdFBhcnNlciQxKQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1vcmcuYXBhY2hlLmhhcm1vbnkueG1sLkV4cGF0UmVhZGVyCi1ib29sZWFuCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1zdGF0aWMgaW50IGFjY2VzcyQxMDAwKAotb3JnLmFwYWNoZS5oYXJtb255LnhtbC5FeHBhdFBhcnNlcikKLQotc3RhdGljIGJvb2xlYW4gYWNjZXNzJDExMDAoCi1vcmcuYXBhY2hlLmhhcm1vbnkueG1sLkV4cGF0UGFyc2VyKQotCi1zdGF0aWMgaW50IGFjY2VzcyQxMjAwKAotb3JnLmFwYWNoZS5oYXJtb255LnhtbC5FeHBhdFBhcnNlcikKLQotc3RhdGljIGludCBhY2Nlc3MkMTMwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS54bWwuRXhwYXRQYXJzZXIpCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGFjY2VzcyQ2MDAoCi1vcmcuYXBhY2hlLmhhcm1vbnkueG1sLkV4cGF0UGFyc2VyKQotCi1zdGF0aWMgamF2YS5sYW5nLlN0cmluZyBhY2Nlc3MkNzAwKAotb3JnLmFwYWNoZS5oYXJtb255LnhtbC5FeHBhdFBhcnNlcikKLQotc3RhdGljIGludCBhY2Nlc3MkODAwKAotb3JnLmFwYWNoZS5oYXJtb255LnhtbC5FeHBhdFBhcnNlcikKLQotc3RhdGljIGludCBhY2Nlc3MkOTAwKAotb3JnLmFwYWNoZS5oYXJtb255LnhtbC5FeHBhdFBhcnNlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uO0xvcmcvYXBhY2hlL2hhcm1vbnkveG1sL0V4cGF0RXhjZXB0aW9uOyApCi1wcml2YXRlIG5hdGl2ZSB2b2lkIGFwcGVuZCgKLWludAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uO0xvcmcvYXBhY2hlL2hhcm1vbnkveG1sL0V4cGF0RXhjZXB0aW9uOyApCi1wcml2YXRlIG5hdGl2ZSB2b2lkIGFwcGVuZCgKLWludAotYnl0ZVtdCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uO0xvcmcvYXBhY2hlL2hhcm1vbnkveG1sL0V4cGF0RXhjZXB0aW9uOyApCi1wcml2YXRlIG5hdGl2ZSB2b2lkIGFwcGVuZCgKLWludAotY2hhcltdCi1pbnQKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBjbG9uZUF0dHJpYnV0ZXMoCi1pbnQKLWludCkKLQotcHJpdmF0ZSBpbnQgY29sdW1uKCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBjb2x1bW4oCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgY3JlYXRlRW50aXR5UGFyc2VyKAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCBlbmREb2N1bWVudCgpCi0KLXByaXZhdGUgbmF0aXZlIGludCBpbml0aWFsaXplKAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotcHJpdmF0ZSBpbnQgbGluZSgpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbGluZSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotc3RhdGljIGphdmEuaW8uSW5wdXRTdHJlYW0gb3BlblVybCgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHBhcnNlRXh0ZXJuYWxFbnRpdHkoCi1vcmcuYXBhY2hlLmhhcm1vbnkueG1sLkV4cGF0UGFyc2VyCi1vcmcueG1sLnNheC5JbnB1dFNvdXJjZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgcGFyc2VGcmFnbWVudCgKLWphdmEuaW8uSW5wdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHBhcnNlRnJhZ21lbnQoCi1qYXZhLmlvLlJlYWRlcikKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHBpY2tFbmNvZGluZygKLW9yZy54bWwuc2F4LklucHV0U291cmNlKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIHJlbGVhc2UoCi1pbnQpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIHJlbGVhc2VQYXJzZXIoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHN0YXJ0RG9jdW1lbnQoKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBzdGF0aWNJbml0aWFsaXplKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi0gdm9pZCBhcHBlbmQoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247ICkKLSB2b2lkIGFwcGVuZCgKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi0gdm9pZCBhcHBlbmQoCi1ieXRlW10KLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247ICkKLSB2b2lkIGFwcGVuZCgKLWNoYXJbXQotaW50Ci1pbnQpCi0KLSBvcmcueG1sLnNheC5BdHRyaWJ1dGVzIGNsb25lQXR0cmlidXRlcygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotIHZvaWQgY29tbWVudCgKLWNoYXJbXQotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247ICkKLSB2b2lkIGVuZENkYXRhKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi0gdm9pZCBlbmREdGQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247ICkKLSB2b2lkIGVuZEVsZW1lbnQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247ICkKLSB2b2lkIGVuZE5hbWVzcGFjZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9UaHJvd2FibGU7ICkKLXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi0gdm9pZCBmaW5pc2goKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLSB2b2lkIGhhbmRsZUV4dGVybmFsRW50aXR5KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi0gdm9pZCBwYXJzZURvY3VtZW50KAotamF2YS5pby5JbnB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi0gdm9pZCBwYXJzZURvY3VtZW50KAotamF2YS5pby5SZWFkZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotIHZvaWQgcHJvY2Vzc2luZ0luc3RydWN0aW9uKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi0gdm9pZCBzdGFydENkYXRhKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi0gdm9pZCBzdGFydER0ZCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotIHZvaWQgc3RhcnRFbGVtZW50KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotIHZvaWQgc3RhcnROYW1lc3BhY2UoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247ICkKLSB2b2lkIHRleHQoCi1jaGFyW10KLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEwIG5hbWUgPUVudGl0eVBhcnNlciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3htbC9FeHBhdFBhcnNlcjsgKQotIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS54bWwuRXhwYXRQYXJzZXIkRW50aXR5UGFyc2VyIGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnhtbC5FeHBhdFBhcnNlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGludCBkZXB0aAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1vcmcuYXBhY2hlLmhhcm1vbnkueG1sLkV4cGF0UmVhZGVyCi1pbnQKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLW9yZy5hcGFjaGUuaGFybW9ueS54bWwuRXhwYXRSZWFkZXIKLWludAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotb3JnLmFwYWNoZS5oYXJtb255LnhtbC5FeHBhdFBhcnNlciQxKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247ICkKLSB2b2lkIGVuZEVsZW1lbnQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvVGhyb3dhYmxlOyApCi1wcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotIHZvaWQgc3RhcnRFbGVtZW50KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy54bWwuc2F4LkxvY2F0b3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IGludCBnZXRDb2x1bW5OdW1iZXIoKQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldExpbmVOdW1iZXIoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRQdWJsaWNJZCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldFN5c3RlbUlkKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTIgbmFtZSA9RXhwYXRMb2NhdG9yICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkveG1sL0V4cGF0UGFyc2VyOyApCi0gY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnhtbC5FeHBhdFBhcnNlciRFeHBhdExvY2F0b3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLnhtbC5zYXguTG9jYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkueG1sLkV4cGF0UGFyc2VyIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkueG1sLkV4cGF0UGFyc2VyKQotCi0gdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkueG1sLkV4cGF0UGFyc2VyCi1vcmcuYXBhY2hlLmhhcm1vbnkueG1sLkV4cGF0UGFyc2VyJDEpCi0KLXB1YmxpYyBpbnQgZ2V0Q29sdW1uTnVtYmVyKCkKLQotcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UHVibGljSWQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTeXN0ZW1JZCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS5sYW5nLkV4Y2VwdGlvbiBleGNlcHRpb24KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuRXhjZXB0aW9uKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuRXhjZXB0aW9uKQotCi1wdWJsaWMgamF2YS5sYW5nLkV4Y2VwdGlvbiBnZXRFeGNlcHRpb24oKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRNZXNzYWdlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uIGV4dGVuZHMgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgaW50IGNvbHVtbk51bWJlcgotCi1wcml2YXRlIGludCBsaW5lTnVtYmVyCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBwdWJsaWNJZAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgc3lzdGVtSWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQKLWphdmEubGFuZy5FeGNlcHRpb24pCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLW9yZy54bWwuc2F4LkxvY2F0b3IpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLW9yZy54bWwuc2F4LkxvY2F0b3IKLWphdmEubGFuZy5FeGNlcHRpb24pCi0KLXByaXZhdGUgdm9pZCBpbml0KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotaW50Ci1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0Q29sdW1uTnVtYmVyKCkKLQotcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UHVibGljSWQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTeXN0ZW1JZCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1QYXJzZUV4Y2VwdGlvbiApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3htbC9FeHBhdFBhcnNlcjsgKQotIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS54bWwuRXhwYXRQYXJzZXIkUGFyc2VFeGNlcHRpb24gZXh0ZW5kcyBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1vcmcueG1sLnNheC5Mb2NhdG9yKQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1vcmcueG1sLnNheC5Mb2NhdG9yCi1vcmcuYXBhY2hlLmhhcm1vbnkueG1sLkV4cGF0UGFyc2VyJDEpCi0KLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgbWFrZU1lc3NhZ2UoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBtYWtlTWVzc2FnZSgKLWphdmEubGFuZy5TdHJpbmcKLW9yZy54bWwuc2F4LkxvY2F0b3IpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID00MTA0IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS94bWwvRXhwYXRQdWxsUGFyc2VyOyApCi0gY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnhtbC5FeHBhdFB1bGxQYXJzZXIkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkveG1sL0V4cGF0UHVsbFBhcnNlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMDI0IG5hbWUgPURvY3VtZW50ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS94bWwvRXhwYXRQdWxsUGFyc2VyJERvY3VtZW50JFNheEhhbmRsZXI7ICkKLWFic3RyYWN0IGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS54bWwuRXhwYXRQdWxsUGFyc2VyJERvY3VtZW50IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gb3JnLmFwYWNoZS5oYXJtb255LnhtbC5FeHBhdFB1bGxQYXJzZXIkRXZlbnQgY3VycmVudEV2ZW50Ci0KLWZpbmFsIGphdmEubGFuZy5TdHJpbmcgZW5jb2RpbmcKLQotIGJvb2xlYW4gZmluaXNoZWQKLQotIG9yZy5hcGFjaGUuaGFybW9ueS54bWwuRXhwYXRQdWxsUGFyc2VyJEV2ZW50IGxhc3QKLQotIG9yZy5hcGFjaGUuaGFybW9ueS54bWwuRXhwYXRQdWxsUGFyc2VyJE5hbWVzcGFjZVN0YWNrJEJ1aWxkZXIgbmFtZXNwYWNlU3RhY2tCdWlsZGVyCi0KLWZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS54bWwuRXhwYXRQYXJzZXIgcGFyc2VyCi0KLWZpbmFsIGJvb2xlYW4gcHJvY2Vzc05hbWVzcGFjZXMKLQotIG9yZy5hcGFjaGUuaGFybW9ueS54bWwuRXhwYXRQdWxsUGFyc2VyJFRleHRFdmVudCB0ZXh0RXZlbnQKLQotZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnhtbC5FeHBhdFB1bGxQYXJzZXIgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnhtbC5FeHBhdFB1bGxQYXJzZXIKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4pCi0KLSB2b2lkIGFkZCgKLW9yZy5hcGFjaGUuaGFybW9ueS54bWwuRXhwYXRQdWxsUGFyc2VyJEV2ZW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1hYnN0cmFjdCBpbnQgYnVmZmVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotIGludCBkZXF1ZXVlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsgKQotYWJzdHJhY3Qgdm9pZCBmbHVzaCgKLW9yZy5hcGFjaGUuaGFybW9ueS54bWwuRXhwYXRQYXJzZXIKLWludCkKLQotIGludCBnZXREZXB0aCgpCi0KLSBqYXZhLmxhbmcuU3RyaW5nIGdldEVuY29kaW5nKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsgKQotIGJvb2xlYW4gaXNDdXJyZW50RWxlbWVudEVtcHR5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsgKQotIHZvaWQgcHVtcCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS94bWwvRXhwYXRQdWxsUGFyc2VyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9Qnl0ZURvY3VtZW50ICkKLSBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkueG1sLkV4cGF0UHVsbFBhcnNlciRCeXRlRG9jdW1lbnQgZXh0ZW5kcyBvcmcuYXBhY2hlLmhhcm1vbnkueG1sLkV4cGF0UHVsbFBhcnNlciREb2N1bWVudAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBieXRlW10gYnVmZmVyCi0KLWZpbmFsIGphdmEuaW8uSW5wdXRTdHJlYW0gaW4KLQotZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnhtbC5FeHBhdFB1bGxQYXJzZXIgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnhtbC5FeHBhdFB1bGxQYXJzZXIKLWphdmEuaW8uSW5wdXRTdHJlYW0KLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLSBpbnQgYnVmZmVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsgKQotIHZvaWQgZmx1c2goCi1vcmcuYXBhY2hlLmhhcm1vbnkueG1sLkV4cGF0UGFyc2VyCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPUNoYXJEb2N1bWVudCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3htbC9FeHBhdFB1bGxQYXJzZXI7ICkKLSBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkueG1sLkV4cGF0UHVsbFBhcnNlciRDaGFyRG9jdW1lbnQgZXh0ZW5kcyBvcmcuYXBhY2hlLmhhcm1vbnkueG1sLkV4cGF0UHVsbFBhcnNlciREb2N1bWVudAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBjaGFyW10gYnVmZmVyCi0KLWZpbmFsIGphdmEuaW8uUmVhZGVyIGluCi0KLWZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS54bWwuRXhwYXRQdWxsUGFyc2VyIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS54bWwuRXhwYXRQdWxsUGFyc2VyCi1qYXZhLmlvLlJlYWRlcgotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotIGludCBidWZmZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOyApCi0gdm9pZCBmbHVzaCgKLW9yZy5hcGFjaGUuaGFybW9ueS54bWwuRXhwYXRQYXJzZXIKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBjaGFyYWN0ZXJzKAotY2hhcltdCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBlbmREb2N1bWVudCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgZW5kRWxlbWVudCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgZW5kUHJlZml4TWFwcGluZygKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgaWdub3JhYmxlV2hpdGVzcGFjZSgKLWNoYXJbXQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgcHJvY2Vzc2luZ0luc3RydWN0aW9uKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RG9jdW1lbnRMb2NhdG9yKAotb3JnLnhtbC5zYXguTG9jYXRvcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBza2lwcGVkRW50aXR5KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdGFydERvY3VtZW50KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdGFydEVsZW1lbnQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1vcmcueG1sLnNheC5BdHRyaWJ1dGVzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHN0YXJ0UHJlZml4TWFwcGluZygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS94bWwvRXhwYXRQdWxsUGFyc2VyJERvY3VtZW50OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTIgbmFtZSA9U2F4SGFuZGxlciApCi0gY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnhtbC5FeHBhdFB1bGxQYXJzZXIkRG9jdW1lbnQkU2F4SGFuZGxlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gaW50IGRlcHRoCi0KLWZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS54bWwuRXhwYXRQdWxsUGFyc2VyJERvY3VtZW50IHRoaXMkMQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkueG1sLkV4cGF0UHVsbFBhcnNlciREb2N1bWVudCkKLQotIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnhtbC5FeHBhdFB1bGxQYXJzZXIkRG9jdW1lbnQKLW9yZy5hcGFjaGUuaGFybW9ueS54bWwuRXhwYXRQdWxsUGFyc2VyJDEpCi0KLXB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoCi1jaGFyW10KLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGVuZERvY3VtZW50KCkKLQotcHVibGljIHZvaWQgZW5kRWxlbWVudCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgZW5kUHJlZml4TWFwcGluZygKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgaWdub3JhYmxlV2hpdGVzcGFjZSgKLWNoYXJbXQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcHJvY2Vzc2luZ0luc3RydWN0aW9uKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0RG9jdW1lbnRMb2NhdG9yKAotb3JnLnhtbC5zYXguTG9jYXRvcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBza2lwcGVkRW50aXR5KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzdGFydERvY3VtZW50KCkKLQotcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotb3JnLnhtbC5zYXguQXR0cmlidXRlcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzdGFydFByZWZpeE1hcHBpbmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAzMiBuYW1lID1FdmVudCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3htbC9FeHBhdFB1bGxQYXJzZXI7ICkKLWFic3RyYWN0IGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS54bWwuRXhwYXRQdWxsUGFyc2VyJEV2ZW50IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBpbnQgZGVwdGgKLQotZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnhtbC5FeHBhdFB1bGxQYXJzZXIkTmFtZXNwYWNlU3RhY2sgbmFtZXNwYWNlU3RhY2sKLQotIG9yZy5hcGFjaGUuaGFybW9ueS54bWwuRXhwYXRQdWxsUGFyc2VyJEV2ZW50IG5leHQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1pbnQKLW9yZy5hcGFjaGUuaGFybW9ueS54bWwuRXhwYXRQdWxsUGFyc2VyJE5hbWVzcGFjZVN0YWNrKQotCi0gaW50IGdldEF0dHJpYnV0ZUNvdW50KCkKLQotIGphdmEubGFuZy5TdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgKLWludCkKLQotIGphdmEubGFuZy5TdHJpbmcgZ2V0QXR0cmlidXRlTmFtZXNwYWNlKAotaW50KQotCi0gamF2YS5sYW5nLlN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZSgKLWludCkKLQotIGphdmEubGFuZy5TdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgaW50IGdldERlcHRoKCkKLQotIGphdmEubGFuZy5TdHJpbmcgZ2V0TmFtZSgpCi0KLSBqYXZhLmxhbmcuU3RyaW5nIGdldE5hbWVzcGFjZSgpCi0KLSBvcmcuYXBhY2hlLmhhcm1vbnkueG1sLkV4cGF0UHVsbFBhcnNlciRFdmVudCBnZXROZXh0KCkKLQotIGphdmEubGFuZy5TdHJpbmdCdWlsZGVyIGdldFRleHQoKQotCi1hYnN0cmFjdCBpbnQgZ2V0VHlwZSgpCi0KLSB2b2lkIHNldE5leHQoCi1vcmcuYXBhY2hlLmhhcm1vbnkueG1sLkV4cGF0UHVsbFBhcnNlciRFdmVudCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9RW5kRG9jdW1lbnRFdmVudCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3htbC9FeHBhdFB1bGxQYXJzZXI7ICkKLSBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkueG1sLkV4cGF0UHVsbFBhcnNlciRFbmREb2N1bWVudEV2ZW50IGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnhtbC5FeHBhdFB1bGxQYXJzZXIkRXZlbnQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi0gb3JnLmFwYWNoZS5oYXJtb255LnhtbC5FeHBhdFB1bGxQYXJzZXIkRXZlbnQgZ2V0TmV4dCgpCi0KLSBpbnQgZ2V0VHlwZSgpCi0KLSB2b2lkIHNldE5leHQoCi1vcmcuYXBhY2hlLmhhcm1vbnkueG1sLkV4cGF0UHVsbFBhcnNlciRFdmVudCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9RW5kVGFnRXZlbnQgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS94bWwvRXhwYXRQdWxsUGFyc2VyOyApCi0gY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnhtbC5FeHBhdFB1bGxQYXJzZXIkRW5kVGFnRXZlbnQgZXh0ZW5kcyBvcmcuYXBhY2hlLmhhcm1vbnkueG1sLkV4cGF0UHVsbFBhcnNlciRFdmVudAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBqYXZhLmxhbmcuU3RyaW5nIGxvY2FsTmFtZQotCi1maW5hbCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWludAotb3JnLmFwYWNoZS5oYXJtb255LnhtbC5FeHBhdFB1bGxQYXJzZXIkTmFtZXNwYWNlU3RhY2spCi0KLSBqYXZhLmxhbmcuU3RyaW5nIGdldE5hbWUoKQotCi0gamF2YS5sYW5nLlN0cmluZyBnZXROYW1lc3BhY2UoKQotCi0gaW50IGdldFR5cGUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkveG1sL0V4cGF0UHVsbFBhcnNlciROYW1lc3BhY2VTdGFjazsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPUJ1aWxkZXIgKQotIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS54bWwuRXhwYXRQdWxsUGFyc2VyJE5hbWVzcGFjZVN0YWNrJEJ1aWxkZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBvcmcuYXBhY2hlLmhhcm1vbnkueG1sLkV4cGF0UHVsbFBhcnNlciROYW1lc3BhY2VTdGFjayB0b3AKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi0gb3JnLmFwYWNoZS5oYXJtb255LnhtbC5FeHBhdFB1bGxQYXJzZXIkTmFtZXNwYWNlU3RhY2sgYnVpbGQoKQotCi0gdm9pZCBwb3AoCi1pbnQpCi0KLSB2b2lkIHB1c2goCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS94bWwvRXhwYXRQdWxsUGFyc2VyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9TmFtZXNwYWNlU3RhY2sgKQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3htbC9FeHBhdFB1bGxQYXJzZXIkTmFtZXNwYWNlU3RhY2skQnVpbGRlcjsgKQotIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS54bWwuRXhwYXRQdWxsUGFyc2VyJE5hbWVzcGFjZVN0YWNrIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnhtbC5FeHBhdFB1bGxQYXJzZXIkTmFtZXNwYWNlU3RhY2sgRU1QVFkKLQotcHJpdmF0ZSBmaW5hbCBpbnQgZGVwdGgKLQotcHJpdmF0ZSBmaW5hbCBpbnQgaW5kZXgKLQotcHJpdmF0ZSBmaW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkueG1sLkV4cGF0UHVsbFBhcnNlciROYW1lc3BhY2VTdGFjayBwYXJlbnQKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeAotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgdXJpCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS54bWwuRXhwYXRQdWxsUGFyc2VyJE5hbWVzcGFjZVN0YWNrCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLSB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS54bWwuRXhwYXRQdWxsUGFyc2VyJE5hbWVzcGFjZVN0YWNrCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLW9yZy5hcGFjaGUuaGFybW9ueS54bWwuRXhwYXRQdWxsUGFyc2VyJDEpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDEwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS54bWwuRXhwYXRQdWxsUGFyc2VyJE5hbWVzcGFjZVN0YWNrKQotCi1zdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnhtbC5FeHBhdFB1bGxQYXJzZXIkTmFtZXNwYWNlU3RhY2sgYWNjZXNzJDIwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS54bWwuRXhwYXRQdWxsUGFyc2VyJE5hbWVzcGFjZVN0YWNrKQotCi1wcml2YXRlIG9yZy5hcGFjaGUuaGFybW9ueS54bWwuRXhwYXRQdWxsUGFyc2VyJE5hbWVzcGFjZVN0YWNrIG5vZGVBdCgKLWludCkKLQotIGludCBjb3VudEF0KAotaW50KQotCi0gamF2YS5sYW5nLlN0cmluZyBwcmVmaXhBdCgKLWludCkKLQotIGphdmEubGFuZy5TdHJpbmcgdXJpQXQoCi1pbnQpCi0KLSBqYXZhLmxhbmcuU3RyaW5nIHVyaUZvcigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID04IG5hbWUgPVN0YXJ0RG9jdW1lbnRFdmVudCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3htbC9FeHBhdFB1bGxQYXJzZXI7ICkKLSBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkueG1sLkV4cGF0UHVsbFBhcnNlciRTdGFydERvY3VtZW50RXZlbnQgZXh0ZW5kcyBvcmcuYXBhY2hlLmhhcm1vbnkueG1sLkV4cGF0UHVsbFBhcnNlciRFdmVudAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLSBpbnQgZ2V0VHlwZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS94bWwvRXhwYXRQdWxsUGFyc2VyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9U3RhcnRUYWdFdmVudCApCi0gY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnhtbC5FeHBhdFB1bGxQYXJzZXIkU3RhcnRUYWdFdmVudCBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS54bWwuRXhwYXRQdWxsUGFyc2VyJEV2ZW50Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIG9yZy54bWwuc2F4LkF0dHJpYnV0ZXMgYXR0cmlidXRlcwotCi1maW5hbCBqYXZhLmxhbmcuU3RyaW5nIG5hbWUKLQotZmluYWwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UKLQotZmluYWwgYm9vbGVhbiBwcm9jZXNzTmFtZXNwYWNlcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLW9yZy5hcGFjaGUuaGFybW9ueS54bWwuRXhwYXRQYXJzZXIKLWludAotb3JnLmFwYWNoZS5oYXJtb255LnhtbC5FeHBhdFB1bGxQYXJzZXIkTmFtZXNwYWNlU3RhY2sKLWJvb2xlYW4pCi0KLSBpbnQgZ2V0QXR0cmlidXRlQ291bnQoKQotCi0gamF2YS5sYW5nLlN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKAotaW50KQotCi0gamF2YS5sYW5nLlN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lc3BhY2UoCi1pbnQpCi0KLSBqYXZhLmxhbmcuU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKAotaW50KQotCi0gamF2YS5sYW5nLlN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLSBqYXZhLmxhbmcuU3RyaW5nIGdldE5hbWUoKQotCi0gamF2YS5sYW5nLlN0cmluZyBnZXROYW1lc3BhY2UoKQotCi0gaW50IGdldFR5cGUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OCBuYW1lID1UZXh0RXZlbnQgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS94bWwvRXhwYXRQdWxsUGFyc2VyOyApCi0gY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnhtbC5FeHBhdFB1bGxQYXJzZXIkVGV4dEV2ZW50IGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnhtbC5FeHBhdFB1bGxQYXJzZXIkRXZlbnQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIgYnVpbGRlcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotaW50Ci1vcmcuYXBhY2hlLmhhcm1vbnkueG1sLkV4cGF0UHVsbFBhcnNlciROYW1lc3BhY2VTdGFjaykKLQotIHZvaWQgYXBwZW5kKAotY2hhcltdCi1pbnQKLWludCkKLQotIGphdmEubGFuZy5TdHJpbmdCdWlsZGVyIGdldFRleHQoKQotCi0gaW50IGdldFR5cGUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDRFNFQ1QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NTUVOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBET0NERUNMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVORF9ET0NVTUVOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkRfVEFHCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOVElUWV9SRUYKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEZFQVRVUkVfUFJPQ0VTU19ET0NERUNMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBGRUFUVVJFX1BST0NFU1NfTkFNRVNQQUNFUwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRkVBVFVSRV9SRVBPUlRfTkFNRVNQQUNFX0FUVFJJQlVURVMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEZFQVRVUkVfVkFMSURBVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJR05PUkFCTEVfV0hJVEVTUEFDRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTk9fTkFNRVNQQUNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST0NFU1NJTkdfSU5TVFJVQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBUlRfRE9DVU1FTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBUlRfVEFHCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRFWFQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gVFlQRVMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGRlZmluZUVudGl0eVJlcGxhY2VtZW50VGV4dCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0QXR0cmlidXRlQ291bnQoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lc3BhY2UoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldEF0dHJpYnV0ZVByZWZpeCgKLWludCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0QXR0cmlidXRlVHlwZSgKLWludCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IGludCBnZXRDb2x1bW5OdW1iZXIoKQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldERlcHRoKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCBnZXRFdmVudFR5cGUoKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBnZXRGZWF0dXJlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0SW5wdXRFbmNvZGluZygpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0TGluZU51bWJlcigpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldE5hbWUoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXROYW1lc3BhY2UoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXROYW1lc3BhY2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldE5hbWVzcGFjZUNvdW50KAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXROYW1lc3BhY2VQcmVmaXgoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldE5hbWVzcGFjZVVyaSgKLWludCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0UG9zaXRpb25EZXNjcmlwdGlvbigpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldFByZWZpeCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuT2JqZWN0IGdldFByb3BlcnR5KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0VGV4dCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBjaGFyW10gZ2V0VGV4dENoYXJhY3RlcnMoCi1pbnRbXSkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNBdHRyaWJ1dGVEZWZhdWx0KAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0VtcHR5RWxlbWVudFRhZygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzV2hpdGVzcGFjZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgbmV4dCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnQgbmV4dFRhZygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIG5leHRUZXh0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCBuZXh0VG9rZW4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCByZXF1aXJlKAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRGZWF0dXJlKAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0SW5wdXQoCi1qYXZhLmlvLklucHV0U3RyZWFtCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRJbnB1dCgKLWphdmEuaW8uUmVhZGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRQcm9wZXJ0eSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3htbC9FeHBhdFB1bGxQYXJzZXIkMTtMb3JnL2FwYWNoZS9oYXJtb255L3htbC9FeHBhdFB1bGxQYXJzZXIkQnl0ZURvY3VtZW50O0xvcmcvYXBhY2hlL2hhcm1vbnkveG1sL0V4cGF0UHVsbFBhcnNlciRDaGFyRG9jdW1lbnQ7TG9yZy9hcGFjaGUvaGFybW9ueS94bWwvRXhwYXRQdWxsUGFyc2VyJERvY3VtZW50O0xvcmcvYXBhY2hlL2hhcm1vbnkveG1sL0V4cGF0UHVsbFBhcnNlciRFbmREb2N1bWVudEV2ZW50O0xvcmcvYXBhY2hlL2hhcm1vbnkveG1sL0V4cGF0UHVsbFBhcnNlciRUZXh0RXZlbnQ7TG9yZy9hcGFjaGUvaGFybW9ueS94bWwvRXhwYXRQdWxsUGFyc2VyJEVuZFRhZ0V2ZW50O0xvcmcvYXBhY2hlL2hhcm1vbnkveG1sL0V4cGF0UHVsbFBhcnNlciRTdGFydFRhZ0V2ZW50O0xvcmcvYXBhY2hlL2hhcm1vbnkveG1sL0V4cGF0UHVsbFBhcnNlciRTdGFydERvY3VtZW50RXZlbnQ7TG9yZy9hcGFjaGUvaGFybW9ueS94bWwvRXhwYXRQdWxsUGFyc2VyJEV2ZW50O0xvcmcvYXBhY2hlL2hhcm1vbnkveG1sL0V4cGF0UHVsbFBhcnNlciROYW1lc3BhY2VTdGFjazsgKQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS54bWwuRXhwYXRQdWxsUGFyc2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9TSVpFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBGRUFUVVJFX1JFTEFYRUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBOT1RfQV9TVEFSVF9UQUcKLQotcHJpdmF0ZSBvcmcuYXBhY2hlLmhhcm1vbnkueG1sLkV4cGF0UHVsbFBhcnNlciREb2N1bWVudCBkb2N1bWVudAotCi1wcml2YXRlIGJvb2xlYW4gcHJvY2Vzc05hbWVzcGFjZXMKLQotcHJpdmF0ZSBib29sZWFuIHJlbGF4ZWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1zdGF0aWMgYm9vbGVhbiBhY2Nlc3MkNDAwKAotb3JnLmFwYWNoZS5oYXJtb255LnhtbC5FeHBhdFB1bGxQYXJzZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGRlZmluZUVudGl0eVJlcGxhY2VtZW50VGV4dCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBpbnQgZ2V0QXR0cmlidXRlQ291bnQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKAotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lc3BhY2UoCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEF0dHJpYnV0ZVByZWZpeCgKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QXR0cmlidXRlVHlwZSgKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGludCBnZXRDb2x1bW5OdW1iZXIoKQotCi1wdWJsaWMgaW50IGdldERlcHRoKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXRFdmVudFR5cGUoKQotCi1wdWJsaWMgYm9vbGVhbiBnZXRGZWF0dXJlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SW5wdXRFbmNvZGluZygpCi0KLXB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE5hbWUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXROYW1lc3BhY2UoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXROYW1lc3BhY2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGdldE5hbWVzcGFjZUNvdW50KAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXROYW1lc3BhY2VQcmVmaXgoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE5hbWVzcGFjZVVyaSgKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UG9zaXRpb25EZXNjcmlwdGlvbigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFByZWZpeCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldFByb3BlcnR5KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VGV4dCgpCi0KLXB1YmxpYyBjaGFyW10gZ2V0VGV4dENoYXJhY3RlcnMoCi1pbnRbXSkKLQotcHVibGljIGJvb2xlYW4gaXNBdHRyaWJ1dGVEZWZhdWx0KAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBpc0VtcHR5RWxlbWVudFRhZygpCi0KLXB1YmxpYyBib29sZWFuIGlzTmFtZXNwYWNlUHJvY2Vzc2luZ0VuYWJsZWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBpc1doaXRlc3BhY2UoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IG5leHQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IG5leHRUYWcoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBuZXh0VGV4dCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgbmV4dFRva2VuKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcmVxdWlyZSgKLWludAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0RmVhdHVyZSgKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldElucHV0KAotamF2YS5pby5JbnB1dFN0cmVhbQotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0SW5wdXQoCi1qYXZhLmlvLlJlYWRlcikKLQotcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlUHJvY2Vzc2luZ0VuYWJsZWQoCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS94bWwvRXhwYXRSZWFkZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MTAgbmFtZSA9RmVhdHVyZSApCi0gY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnhtbC5FeHBhdFJlYWRlciRGZWF0dXJlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEJBU0VfVVJJCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTkFNRVNQQUNFUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE5BTUVTUEFDRV9QUkVGSVhFUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNUUklOR19JTlRFUk5JTkcKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBWQUxJREFUSU9OCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy54bWwuc2F4LlhNTFJlYWRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIgZ2V0Q29udGVudEhhbmRsZXIoKQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLnhtbC5zYXguRFRESGFuZGxlciBnZXREVERIYW5kbGVyKCkKLQotcHVibGljIGFic3RyYWN0IG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyIGdldEVudGl0eVJlc29sdmVyKCkKLQotcHVibGljIGFic3RyYWN0IG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciBnZXRFcnJvckhhbmRsZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uO0xvcmcveG1sL3NheC9TQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGdldEZlYXR1cmUoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uO0xvcmcveG1sL3NheC9TQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuT2JqZWN0IGdldFByb3BlcnR5KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBwYXJzZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgcGFyc2UoCi1vcmcueG1sLnNheC5JbnB1dFNvdXJjZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0Q29udGVudEhhbmRsZXIoCi1vcmcueG1sLnNheC5Db250ZW50SGFuZGxlcikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RFRESGFuZGxlcigKLW9yZy54bWwuc2F4LkRUREhhbmRsZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEVudGl0eVJlc29sdmVyKAotb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEVycm9ySGFuZGxlcigKLW9yZy54bWwuc2F4LkVycm9ySGFuZGxlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbjtMb3JnL3htbC9zYXgvU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRGZWF0dXJlKAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbjtMb3JnL3htbC9zYXgvU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRQcm9wZXJ0eSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3htbC9FeHBhdFJlYWRlciRGZWF0dXJlOyApCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnhtbC5FeHBhdFJlYWRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcueG1sLnNheC5YTUxSZWFkZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMRVhJQ0FMX0hBTkRMRVJfUFJPUEVSVFkKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyIGxvZ2dlcgotCi0gb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIgY29udGVudEhhbmRsZXIKLQotIG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyIGVudGl0eVJlc29sdmVyCi0KLSBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyCi0KLSBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXIgbGV4aWNhbEhhbmRsZXIKLQotcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NOYW1lc3BhY2VQcmVmaXhlcwotCi1wcml2YXRlIGJvb2xlYW4gcHJvY2Vzc05hbWVzcGFjZXMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHBhcnNlKAotamF2YS5pby5JbnB1dFN0cmVhbQotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgcGFyc2UoCi1qYXZhLmlvLlJlYWRlcgotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyIGdldENvbnRlbnRIYW5kbGVyKCkKLQotcHVibGljIG9yZy54bWwuc2F4LkRUREhhbmRsZXIgZ2V0RFRESGFuZGxlcigpCi0KLXB1YmxpYyBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlciBnZXRFbnRpdHlSZXNvbHZlcigpCi0KLXB1YmxpYyBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIgZ2V0RXJyb3JIYW5kbGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbjtMb3JnL3htbC9zYXgvU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBnZXRGZWF0dXJlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlciBnZXRMZXhpY2FsSGFuZGxlcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWE5vdFJlY29nbml6ZWRFeGNlcHRpb247TG9yZy94bWwvc2F4L1NBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0UHJvcGVydHkoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYm9vbGVhbiBpc05hbWVzcGFjZVByb2Nlc3NpbmdFbmFibGVkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBwYXJzZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcGFyc2UoCi1vcmcueG1sLnNheC5JbnB1dFNvdXJjZSkKLQotcHVibGljIHZvaWQgc2V0Q29udGVudEhhbmRsZXIoCi1vcmcueG1sLnNheC5Db250ZW50SGFuZGxlcikKLQotcHVibGljIHZvaWQgc2V0RFRESGFuZGxlcigKLW9yZy54bWwuc2F4LkRUREhhbmRsZXIpCi0KLXB1YmxpYyB2b2lkIHNldEVudGl0eVJlc29sdmVyKAotb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXIpCi0KLXB1YmxpYyB2b2lkIHNldEVycm9ySGFuZGxlcigKLW9yZy54bWwuc2F4LkVycm9ySGFuZGxlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbjtMb3JnL3htbC9zYXgvU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRGZWF0dXJlKAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0TGV4aWNhbEhhbmRsZXIoCi1vcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXIpCi0KLXB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZVByb2Nlc3NpbmdFbmFibGVkKAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbjtMb3JnL3htbC9zYXgvU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy53M2MuZG9tLk5vZGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgQVRUUklCVVRFX05PREUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBDREFUQV9TRUNUSU9OX05PREUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBDT01NRU5UX05PREUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBET0NVTUVOVF9GUkFHTUVOVF9OT0RFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgRE9DVU1FTlRfTk9ERQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IERPQ1VNRU5UX1RZUEVfTk9ERQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IEVMRU1FTlRfTk9ERQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IEVOVElUWV9OT0RFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgRU5USVRZX1JFRkVSRU5DRV9OT0RFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgTk9UQVRJT05fTk9ERQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IFBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IFRFWFRfTk9ERQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy93M2MvZG9tL0RPTUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IG9yZy53M2MuZG9tLk5vZGUgYXBwZW5kQ2hpbGQoCi1vcmcudzNjLmRvbS5Ob2RlKQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLnczYy5kb20uTm9kZSBjbG9uZU5vZGUoCi1ib29sZWFuKQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwIGdldEF0dHJpYnV0ZXMoKQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLnczYy5kb20uTm9kZUxpc3QgZ2V0Q2hpbGROb2RlcygpCi0KLXB1YmxpYyBhYnN0cmFjdCBvcmcudzNjLmRvbS5Ob2RlIGdldEZpcnN0Q2hpbGQoKQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLnczYy5kb20uTm9kZSBnZXRMYXN0Q2hpbGQoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRMb2NhbE5hbWUoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXROYW1lc3BhY2VVUkkoKQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLnczYy5kb20uTm9kZSBnZXROZXh0U2libGluZygpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldE5vZGVOYW1lKCkKLQotcHVibGljIGFic3RyYWN0IHNob3J0IGdldE5vZGVUeXBlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3czYy9kb20vRE9NRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXROb2RlVmFsdWUoKQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLnczYy5kb20uRG9jdW1lbnQgZ2V0T3duZXJEb2N1bWVudCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBvcmcudzNjLmRvbS5Ob2RlIGdldFBhcmVudE5vZGUoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRQcmVmaXgoKQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLnczYy5kb20uTm9kZSBnZXRQcmV2aW91c1NpYmxpbmcoKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBoYXNBdHRyaWJ1dGVzKCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaGFzQ2hpbGROb2RlcygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy93M2MvZG9tL0RPTUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IG9yZy53M2MuZG9tLk5vZGUgaW5zZXJ0QmVmb3JlKAotb3JnLnczYy5kb20uTm9kZQotb3JnLnczYy5kb20uTm9kZSkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNTdXBwb3J0ZWQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBub3JtYWxpemUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvdzNjL2RvbS9ET01FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBvcmcudzNjLmRvbS5Ob2RlIHJlbW92ZUNoaWxkKAotb3JnLnczYy5kb20uTm9kZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3czYy9kb20vRE9NRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLnczYy5kb20uTm9kZSByZXBsYWNlQ2hpbGQoCi1vcmcudzNjLmRvbS5Ob2RlCi1vcmcudzNjLmRvbS5Ob2RlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvdzNjL2RvbS9ET01FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldE5vZGVWYWx1ZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy93M2MvZG9tL0RPTUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0UHJlZml4KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkueG1sLmRvbS5Ob2RlSW1wbCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcudzNjLmRvbS5Ob2RlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy53M2MuZG9tLk5vZGVMaXN0IEVNUFRZX0xJU1QKLQotIG9yZy5hcGFjaGUuaGFybW9ueS54bWwuZG9tLkRvY3VtZW50SW1wbCBkb2N1bWVudAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnhtbC5kb20uRG9jdW1lbnRJbXBsKQotCi1wcml2YXRlIHN0YXRpYyBib29sZWFuIG1hdGNoZXNOYW1lKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3czYy9kb20vRE9NRXhjZXB0aW9uOyApCi1wdWJsaWMgb3JnLnczYy5kb20uTm9kZSBhcHBlbmRDaGlsZCgKLW9yZy53M2MuZG9tLk5vZGUpCi0KLXB1YmxpYyBvcmcudzNjLmRvbS5Ob2RlIGNsb25lTm9kZSgKLWJvb2xlYW4pCi0KLXB1YmxpYyBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXAgZ2V0QXR0cmlidXRlcygpCi0KLXB1YmxpYyBvcmcudzNjLmRvbS5Ob2RlTGlzdCBnZXRDaGlsZE5vZGVzKCkKLQotcHVibGljIG9yZy53M2MuZG9tLk5vZGUgZ2V0Rmlyc3RDaGlsZCgpCi0KLXB1YmxpYyBvcmcudzNjLmRvbS5Ob2RlIGdldExhc3RDaGlsZCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldExvY2FsTmFtZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpCi0KLXB1YmxpYyBvcmcudzNjLmRvbS5Ob2RlIGdldE5leHRTaWJsaW5nKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Tm9kZU5hbWUoKQotCi1wdWJsaWMgYWJzdHJhY3Qgc2hvcnQgZ2V0Tm9kZVR5cGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvdzNjL2RvbS9ET01FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE5vZGVWYWx1ZSgpCi0KLXB1YmxpYyBvcmcudzNjLmRvbS5Eb2N1bWVudCBnZXRPd25lckRvY3VtZW50KCkKLQotcHVibGljIG9yZy53M2MuZG9tLk5vZGUgZ2V0UGFyZW50Tm9kZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFByZWZpeCgpCi0KLXB1YmxpYyBvcmcudzNjLmRvbS5Ob2RlIGdldFByZXZpb3VzU2libGluZygpCi0KLXB1YmxpYyBib29sZWFuIGhhc0F0dHJpYnV0ZXMoKQotCi1wdWJsaWMgYm9vbGVhbiBoYXNDaGlsZE5vZGVzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3czYy9kb20vRE9NRXhjZXB0aW9uOyApCi1wdWJsaWMgb3JnLnczYy5kb20uTm9kZSBpbnNlcnRCZWZvcmUoCi1vcmcudzNjLmRvbS5Ob2RlCi1vcmcudzNjLmRvbS5Ob2RlKQotCi1wdWJsaWMgYm9vbGVhbiBpc1N1cHBvcnRlZCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBib29sZWFuIG1hdGNoZXNOYW1lKAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotcHVibGljIGJvb2xlYW4gbWF0Y2hlc05hbWVOUygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIG5vcm1hbGl6ZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy93M2MvZG9tL0RPTUV4Y2VwdGlvbjsgKQotcHVibGljIG9yZy53M2MuZG9tLk5vZGUgcmVtb3ZlQ2hpbGQoCi1vcmcudzNjLmRvbS5Ob2RlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvdzNjL2RvbS9ET01FeGNlcHRpb247ICkKLXB1YmxpYyBvcmcudzNjLmRvbS5Ob2RlIHJlcGxhY2VDaGlsZCgKLW9yZy53M2MuZG9tLk5vZGUKLW9yZy53M2MuZG9tLk5vZGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy93M2MvZG9tL0RPTUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0Tm9kZVZhbHVlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3czYy9kb20vRE9NRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRQcmVmaXgoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcudzNjLmRvbS5BdHRyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy53M2MuZG9tLk5vZGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXROYW1lKCkKLQotcHVibGljIGFic3RyYWN0IG9yZy53M2MuZG9tLkVsZW1lbnQgZ2V0T3duZXJFbGVtZW50KCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZ2V0U3BlY2lmaWVkKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0VmFsdWUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvdzNjL2RvbS9ET01FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFZhbHVlKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkueG1sLmRvbS5BdHRySW1wbCBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS54bWwuZG9tLk5vZGVJbXBsIGltcGxlbWVudHMgb3JnLnczYy5kb20uQXR0cgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbG9jYWxOYW1lCi0KLXByaXZhdGUgYm9vbGVhbiBuYW1lc3BhY2VBd2FyZQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJCi0KLSBvcmcuYXBhY2hlLmhhcm1vbnkueG1sLmRvbS5FbGVtZW50SW1wbCBvd25lckVsZW1lbnQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgdmFsdWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkueG1sLmRvbS5Eb2N1bWVudEltcGwKLWphdmEubGFuZy5TdHJpbmcpCi0KLSB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS54bWwuZG9tLkRvY3VtZW50SW1wbAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TG9jYWxOYW1lKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TmFtZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE5vZGVOYW1lKCkKLQotcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Tm9kZVZhbHVlKCkKLQotcHVibGljIG9yZy53M2MuZG9tLkVsZW1lbnQgZ2V0T3duZXJFbGVtZW50KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UHJlZml4KCkKLQotcHVibGljIGJvb2xlYW4gZ2V0U3BlY2lmaWVkKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VmFsdWUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvdzNjL2RvbS9ET01FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldE5vZGVWYWx1ZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHNldFByZWZpeCgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy93M2MvZG9tL0RPTUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0VmFsdWUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS54bWwuZG9tLkxlYWZOb2RlSW1wbCBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS54bWwuZG9tLk5vZGVJbXBsCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBpbnQgaW5kZXgKLQotIG9yZy5hcGFjaGUuaGFybW9ueS54bWwuZG9tLklubmVyTm9kZUltcGwgcGFyZW50Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnhtbC5kb20uRG9jdW1lbnRJbXBsKQotCi1wdWJsaWMgb3JnLnczYy5kb20uTm9kZSBnZXROZXh0U2libGluZygpCi0KLXB1YmxpYyBvcmcudzNjLmRvbS5Ob2RlIGdldFBhcmVudE5vZGUoKQotCi1wdWJsaWMgb3JnLnczYy5kb20uTm9kZSBnZXRQcmV2aW91c1NpYmxpbmcoKQotCi0gYm9vbGVhbiBpc1BhcmVudE9mKAotb3JnLnczYy5kb20uTm9kZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLnczYy5kb20uQ2hhcmFjdGVyRGF0YSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcudzNjLmRvbS5Ob2RlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3czYy9kb20vRE9NRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBhcHBlbmREYXRhKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3czYy9kb20vRE9NRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBkZWxldGVEYXRhKAotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy93M2MvZG9tL0RPTUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0RGF0YSgpCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0TGVuZ3RoKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3czYy9kb20vRE9NRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBpbnNlcnREYXRhKAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvdzNjL2RvbS9ET01FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlcGxhY2VEYXRhKAotaW50Ci1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy93M2MvZG9tL0RPTUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RGF0YSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy93M2MvZG9tL0RPTUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgc3Vic3RyaW5nRGF0YSgKLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS54bWwuZG9tLkNoYXJhY3RlckRhdGFJbXBsIGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnhtbC5kb20uTGVhZk5vZGVJbXBsIGltcGxlbWVudHMgb3JnLnczYy5kb20uQ2hhcmFjdGVyRGF0YQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgYnVmZmVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnhtbC5kb20uRG9jdW1lbnRJbXBsCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvdzNjL2RvbS9ET01FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGFwcGVuZERhdGEoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvdzNjL2RvbS9ET01FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGRlbGV0ZURhdGEoCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3czYy9kb20vRE9NRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXREYXRhKCkKLQotcHVibGljIGludCBnZXRMZW5ndGgoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXROb2RlVmFsdWUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvdzNjL2RvbS9ET01FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGluc2VydERhdGEoCi1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy93M2MvZG9tL0RPTUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcmVwbGFjZURhdGEoCi1pbnQKLWludAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3czYy9kb20vRE9NRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXREYXRhKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3czYy9kb20vRE9NRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBzdWJzdHJpbmdEYXRhKAotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy53M2MuZG9tLlRleHQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLnczYy5kb20uQ2hhcmFjdGVyRGF0YQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy93M2MvZG9tL0RPTUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IG9yZy53M2MuZG9tLlRleHQgc3BsaXRUZXh0KAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS54bWwuZG9tLlRleHRJbXBsIGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnhtbC5kb20uQ2hhcmFjdGVyRGF0YUltcGwgaW1wbGVtZW50cyBvcmcudzNjLmRvbS5UZXh0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnhtbC5kb20uRG9jdW1lbnRJbXBsCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXROb2RlTmFtZSgpCi0KLXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE5vZGVWYWx1ZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy93M2MvZG9tL0RPTUV4Y2VwdGlvbjsgKQotcHVibGljIG9yZy53M2MuZG9tLlRleHQgc3BsaXRUZXh0KAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcudzNjLmRvbS5DREFUQVNlY3Rpb24gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLnczYy5kb20uVGV4dAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnhtbC5kb20uQ0RBVEFTZWN0aW9uSW1wbCBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS54bWwuZG9tLlRleHRJbXBsIGltcGxlbWVudHMgb3JnLnczYy5kb20uQ0RBVEFTZWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnhtbC5kb20uRG9jdW1lbnRJbXBsCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXROb2RlTmFtZSgpCi0KLXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy53M2MuZG9tLkNvbW1lbnQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLnczYy5kb20uQ2hhcmFjdGVyRGF0YQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnhtbC5kb20uQ29tbWVudEltcGwgZXh0ZW5kcyBvcmcuYXBhY2hlLmhhcm1vbnkueG1sLmRvbS5DaGFyYWN0ZXJEYXRhSW1wbCBpbXBsZW1lbnRzIG9yZy53M2MuZG9tLkNvbW1lbnQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkueG1sLmRvbS5Eb2N1bWVudEltcGwKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE5vZGVOYW1lKCkKLQotcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLnczYy5kb20uRE9NSW1wbGVtZW50YXRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3czYy9kb20vRE9NRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLnczYy5kb20uRG9jdW1lbnQgY3JlYXRlRG9jdW1lbnQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1vcmcudzNjLmRvbS5Eb2N1bWVudFR5cGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy93M2MvZG9tL0RPTUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZSBjcmVhdGVEb2N1bWVudFR5cGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBoYXNGZWF0dXJlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkueG1sLmRvbS5ET01JbXBsZW1lbnRhdGlvbkltcGwgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLnczYy5kb20uRE9NSW1wbGVtZW50YXRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnhtbC5kb20uRE9NSW1wbGVtZW50YXRpb25JbXBsIGluc3RhbmNlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkueG1sLmRvbS5ET01JbXBsZW1lbnRhdGlvbkltcGwgZ2V0SW5zdGFuY2UoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvdzNjL2RvbS9ET01FeGNlcHRpb247ICkKLXB1YmxpYyBvcmcudzNjLmRvbS5Eb2N1bWVudCBjcmVhdGVEb2N1bWVudCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLW9yZy53M2MuZG9tLkRvY3VtZW50VHlwZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3czYy9kb20vRE9NRXhjZXB0aW9uOyApCi1wdWJsaWMgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlIGNyZWF0ZURvY3VtZW50VHlwZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBib29sZWFuIGhhc0ZlYXR1cmUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS54bWwuZG9tLklubmVyTm9kZUltcGwgZXh0ZW5kcyBvcmcuYXBhY2hlLmhhcm1vbnkueG1sLmRvbS5MZWFmTm9kZUltcGwKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0xpc3Q8TG9yZy9hcGFjaGUvaGFybW9ueS94bWwvZG9tL0xlYWZOb2RlSW1wbDs+OyApCi0gamF2YS51dGlsLkxpc3QgY2hpbGRyZW4KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkueG1sLmRvbS5Eb2N1bWVudEltcGwpCi0KLXByaXZhdGUgdm9pZCByZWZyZXNoSW5kaWNlcygKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3czYy9kb20vRE9NRXhjZXB0aW9uOyApCi1wdWJsaWMgb3JnLnczYy5kb20uTm9kZSBhcHBlbmRDaGlsZCgKLW9yZy53M2MuZG9tLk5vZGUpCi0KLXB1YmxpYyBvcmcudzNjLmRvbS5Ob2RlTGlzdCBnZXRDaGlsZE5vZGVzKCkKLQotcHVibGljIG9yZy53M2MuZG9tLk5vZGUgZ2V0Rmlyc3RDaGlsZCgpCi0KLXB1YmxpYyBvcmcudzNjLmRvbS5Ob2RlIGdldExhc3RDaGlsZCgpCi0KLXB1YmxpYyBvcmcudzNjLmRvbS5Ob2RlIGdldE5leHRTaWJsaW5nKCkKLQotcHVibGljIGJvb2xlYW4gaGFzQ2hpbGROb2RlcygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy93M2MvZG9tL0RPTUV4Y2VwdGlvbjsgKQotcHVibGljIG9yZy53M2MuZG9tLk5vZGUgaW5zZXJ0QmVmb3JlKAotb3JnLnczYy5kb20uTm9kZQotb3JnLnczYy5kb20uTm9kZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3czYy9kb20vRE9NRXhjZXB0aW9uOyApCi1wdWJsaWMgb3JnLnczYy5kb20uTm9kZSBpbnNlcnRDaGlsZEF0KAotb3JnLnczYy5kb20uTm9kZQotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBpc1BhcmVudE9mKAotb3JnLnczYy5kb20uTm9kZSkKLQotcHVibGljIHZvaWQgbm9ybWFsaXplKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3czYy9kb20vRE9NRXhjZXB0aW9uOyApCi1wdWJsaWMgb3JnLnczYy5kb20uTm9kZSByZW1vdmVDaGlsZCgKLW9yZy53M2MuZG9tLk5vZGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy93M2MvZG9tL0RPTUV4Y2VwdGlvbjsgKQotcHVibGljIG9yZy53M2MuZG9tLk5vZGUgcmVwbGFjZUNoaWxkKAotb3JnLnczYy5kb20uTm9kZQotb3JnLnczYy5kb20uTm9kZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLnczYy5kb20uRG9jdW1lbnRGcmFnbWVudCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcudzNjLmRvbS5Ob2RlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkueG1sLmRvbS5Eb2N1bWVudEZyYWdtZW50SW1wbCBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS54bWwuZG9tLklubmVyTm9kZUltcGwgaW1wbGVtZW50cyBvcmcudzNjLmRvbS5Eb2N1bWVudEZyYWdtZW50Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnhtbC5kb20uRG9jdW1lbnRJbXBsKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXROb2RlTmFtZSgpCi0KLXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy53M2MuZG9tLkRvY3VtZW50IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy53M2MuZG9tLk5vZGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvdzNjL2RvbS9ET01FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBvcmcudzNjLmRvbS5BdHRyIGNyZWF0ZUF0dHJpYnV0ZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy93M2MvZG9tL0RPTUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IG9yZy53M2MuZG9tLkF0dHIgY3JlYXRlQXR0cmlidXRlTlMoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvdzNjL2RvbS9ET01FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBvcmcudzNjLmRvbS5DREFUQVNlY3Rpb24gY3JlYXRlQ0RBVEFTZWN0aW9uKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IG9yZy53M2MuZG9tLkNvbW1lbnQgY3JlYXRlQ29tbWVudCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCBvcmcudzNjLmRvbS5Eb2N1bWVudEZyYWdtZW50IGNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvdzNjL2RvbS9ET01FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBvcmcudzNjLmRvbS5FbGVtZW50IGNyZWF0ZUVsZW1lbnQoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvdzNjL2RvbS9ET01FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBvcmcudzNjLmRvbS5FbGVtZW50IGNyZWF0ZUVsZW1lbnROUygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy93M2MvZG9tL0RPTUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IG9yZy53M2MuZG9tLkVudGl0eVJlZmVyZW5jZSBjcmVhdGVFbnRpdHlSZWZlcmVuY2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvdzNjL2RvbS9ET01FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBvcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IG9yZy53M2MuZG9tLlRleHQgY3JlYXRlVGV4dE5vZGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlIGdldERvY3R5cGUoKQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLnczYy5kb20uRWxlbWVudCBnZXREb2N1bWVudEVsZW1lbnQoKQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLnczYy5kb20uRWxlbWVudCBnZXRFbGVtZW50QnlJZCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCBvcmcudzNjLmRvbS5Ob2RlTGlzdCBnZXRFbGVtZW50c0J5VGFnTmFtZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCBvcmcudzNjLmRvbS5Ob2RlTGlzdCBnZXRFbGVtZW50c0J5VGFnTmFtZU5TKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IG9yZy53M2MuZG9tLkRPTUltcGxlbWVudGF0aW9uIGdldEltcGxlbWVudGF0aW9uKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3czYy9kb20vRE9NRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLnczYy5kb20uTm9kZSBpbXBvcnROb2RlKAotb3JnLnczYy5kb20uTm9kZQotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkueG1sLmRvbS5Eb2N1bWVudEltcGwgZXh0ZW5kcyBvcmcuYXBhY2hlLmhhcm1vbnkueG1sLmRvbS5Jbm5lck5vZGVJbXBsIGltcGxlbWVudHMgb3JnLnczYy5kb20uRG9jdW1lbnQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBvcmcudzNjLmRvbS5ET01JbXBsZW1lbnRhdGlvbiBkb21JbXBsZW1lbnRhdGlvbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS54bWwuZG9tLkRPTUltcGxlbWVudGF0aW9uSW1wbAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlKQotCi1zdGF0aWMgYm9vbGVhbiBpc1hNTElkZW50aWZpZXIoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIHN0YXRpYyBib29sZWFuIGlzWE1MSWRlbnRpZmllclBhcnQoCi1jaGFyKQotCi1wcml2YXRlIHN0YXRpYyBib29sZWFuIGlzWE1MSWRlbnRpZmllclN0YXJ0KAotY2hhcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3czYy9kb20vRE9NRXhjZXB0aW9uOyApCi0gb3JnLnczYy5kb20uTm9kZSBjbG9uZU5vZGUoCi1vcmcudzNjLmRvbS5Ob2RlCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvdzNjL2RvbS9ET01FeGNlcHRpb247ICkKLXB1YmxpYyBvcmcuYXBhY2hlLmhhcm1vbnkueG1sLmRvbS5BdHRySW1wbCBjcmVhdGVBdHRyaWJ1dGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvdzNjL2RvbS9ET01FeGNlcHRpb247ICkKLXB1YmxpYyB2b2xhdGlsZSBvcmcudzNjLmRvbS5BdHRyIGNyZWF0ZUF0dHJpYnV0ZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy93M2MvZG9tL0RPTUV4Y2VwdGlvbjsgKQotcHVibGljIG9yZy53M2MuZG9tLkF0dHIgY3JlYXRlQXR0cmlidXRlTlMoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvdzNjL2RvbS9ET01FeGNlcHRpb247ICkKLXB1YmxpYyBvcmcudzNjLmRvbS5DREFUQVNlY3Rpb24gY3JlYXRlQ0RBVEFTZWN0aW9uKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIG9yZy53M2MuZG9tLkNvbW1lbnQgY3JlYXRlQ29tbWVudCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBvcmcudzNjLmRvbS5Eb2N1bWVudEZyYWdtZW50IGNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvdzNjL2RvbS9ET01FeGNlcHRpb247ICkKLXB1YmxpYyBvcmcudzNjLmRvbS5FbGVtZW50IGNyZWF0ZUVsZW1lbnQoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvdzNjL2RvbS9ET01FeGNlcHRpb247ICkKLXB1YmxpYyBvcmcudzNjLmRvbS5FbGVtZW50IGNyZWF0ZUVsZW1lbnROUygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy93M2MvZG9tL0RPTUV4Y2VwdGlvbjsgKQotcHVibGljIG9yZy53M2MuZG9tLkVudGl0eVJlZmVyZW5jZSBjcmVhdGVFbnRpdHlSZWZlcmVuY2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvdzNjL2RvbS9ET01FeGNlcHRpb247ICkKLXB1YmxpYyBvcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIG9yZy53M2MuZG9tLlRleHQgY3JlYXRlVGV4dE5vZGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlIGdldERvY3R5cGUoKQotCi1wdWJsaWMgb3JnLnczYy5kb20uRWxlbWVudCBnZXREb2N1bWVudEVsZW1lbnQoKQotCi1wdWJsaWMgb3JnLnczYy5kb20uRWxlbWVudCBnZXRFbGVtZW50QnlJZCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBvcmcudzNjLmRvbS5Ob2RlTGlzdCBnZXRFbGVtZW50c0J5VGFnTmFtZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBvcmcudzNjLmRvbS5Ob2RlTGlzdCBnZXRFbGVtZW50c0J5VGFnTmFtZU5TKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIG9yZy53M2MuZG9tLkRPTUltcGxlbWVudGF0aW9uIGdldEltcGxlbWVudGF0aW9uKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Tm9kZU5hbWUoKQotCi1wdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvdzNjL2RvbS9ET01FeGNlcHRpb247ICkKLXB1YmxpYyBvcmcudzNjLmRvbS5Ob2RlIGltcG9ydE5vZGUoCi1vcmcudzNjLmRvbS5Ob2RlCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvdzNjL2RvbS9ET01FeGNlcHRpb247ICkKLXB1YmxpYyBvcmcudzNjLmRvbS5Ob2RlIGluc2VydENoaWxkQXQoCi1vcmcudzNjLmRvbS5Ob2RlCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcudzNjLmRvbS5Ob2RlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcCBnZXRFbnRpdGllcygpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldEludGVybmFsU3Vic2V0KCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0TmFtZSgpCi0KLXB1YmxpYyBhYnN0cmFjdCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXAgZ2V0Tm90YXRpb25zKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0UHVibGljSWQoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRTeXN0ZW1JZCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnhtbC5kb20uRG9jdW1lbnRUeXBlSW1wbCBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS54bWwuZG9tLkxlYWZOb2RlSW1wbCBpbXBsZW1lbnRzIG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcHVibGljSWQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHF1YWxpZmllZE5hbWUKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHN5c3RlbUlkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnhtbC5kb20uRE9NSW1wbGVtZW50YXRpb25JbXBsCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwIGdldEVudGl0aWVzKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SW50ZXJuYWxTdWJzZXQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXROYW1lKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Tm9kZU5hbWUoKQotCi1wdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKQotCi1wdWJsaWMgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwIGdldE5vdGF0aW9ucygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFB1YmxpY0lkKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3lzdGVtSWQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXAgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IGludCBnZXRMZW5ndGgoKQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLnczYy5kb20uTm9kZSBnZXROYW1lZEl0ZW0oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLnczYy5kb20uTm9kZSBnZXROYW1lZEl0ZW1OUygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCBvcmcudzNjLmRvbS5Ob2RlIGl0ZW0oCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy93M2MvZG9tL0RPTUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IG9yZy53M2MuZG9tLk5vZGUgcmVtb3ZlTmFtZWRJdGVtKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3czYy9kb20vRE9NRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLnczYy5kb20uTm9kZSByZW1vdmVOYW1lZEl0ZW1OUygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy93M2MvZG9tL0RPTUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IG9yZy53M2MuZG9tLk5vZGUgc2V0TmFtZWRJdGVtKAotb3JnLnczYy5kb20uTm9kZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3czYy9kb20vRE9NRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLnczYy5kb20uTm9kZSBzZXROYW1lZEl0ZW1OUygKLW9yZy53M2MuZG9tLk5vZGUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xIG5hbWUgPUVsZW1lbnRBdHRyTmFtZWROb2RlTWFwSW1wbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3htbC9kb20vRWxlbWVudEltcGw7ICkKLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkueG1sLmRvbS5FbGVtZW50SW1wbCRFbGVtZW50QXR0ck5hbWVkTm9kZU1hcEltcGwgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS54bWwuZG9tLkVsZW1lbnRJbXBsIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS54bWwuZG9tLkVsZW1lbnRJbXBsKQotCi1wcml2YXRlIGludCBpbmRleE9mSXRlbSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgaW50IGluZGV4T2ZJdGVtTlMoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgaW50IGdldExlbmd0aCgpCi0KLXB1YmxpYyBvcmcudzNjLmRvbS5Ob2RlIGdldE5hbWVkSXRlbSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBvcmcudzNjLmRvbS5Ob2RlIGdldE5hbWVkSXRlbU5TKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIG9yZy53M2MuZG9tLk5vZGUgaXRlbSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3czYy9kb20vRE9NRXhjZXB0aW9uOyApCi1wdWJsaWMgb3JnLnczYy5kb20uTm9kZSByZW1vdmVOYW1lZEl0ZW0oCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvdzNjL2RvbS9ET01FeGNlcHRpb247ICkKLXB1YmxpYyBvcmcudzNjLmRvbS5Ob2RlIHJlbW92ZU5hbWVkSXRlbU5TKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3czYy9kb20vRE9NRXhjZXB0aW9uOyApCi1wdWJsaWMgb3JnLnczYy5kb20uTm9kZSBzZXROYW1lZEl0ZW0oCi1vcmcudzNjLmRvbS5Ob2RlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvdzNjL2RvbS9ET01FeGNlcHRpb247ICkKLXB1YmxpYyBvcmcudzNjLmRvbS5Ob2RlIHNldE5hbWVkSXRlbU5TKAotb3JnLnczYy5kb20uTm9kZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLnczYy5kb20uRWxlbWVudCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcudzNjLmRvbS5Ob2RlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0QXR0cmlidXRlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0QXR0cmlidXRlTlMoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLnczYy5kb20uQXR0ciBnZXRBdHRyaWJ1dGVOb2RlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IG9yZy53M2MuZG9tLkF0dHIgZ2V0QXR0cmlidXRlTm9kZU5TKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IG9yZy53M2MuZG9tLk5vZGVMaXN0IGdldEVsZW1lbnRzQnlUYWdOYW1lKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IG9yZy53M2MuZG9tLk5vZGVMaXN0IGdldEVsZW1lbnRzQnlUYWdOYW1lTlMoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRUYWdOYW1lKCkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaGFzQXR0cmlidXRlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaGFzQXR0cmlidXRlTlMoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvdzNjL2RvbS9ET01FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlbW92ZUF0dHJpYnV0ZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy93M2MvZG9tL0RPTUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgcmVtb3ZlQXR0cmlidXRlTlMoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvdzNjL2RvbS9ET01FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBvcmcudzNjLmRvbS5BdHRyIHJlbW92ZUF0dHJpYnV0ZU5vZGUoCi1vcmcudzNjLmRvbS5BdHRyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvdzNjL2RvbS9ET01FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEF0dHJpYnV0ZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy93M2MvZG9tL0RPTUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0QXR0cmlidXRlTlMoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvdzNjL2RvbS9ET01FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBvcmcudzNjLmRvbS5BdHRyIHNldEF0dHJpYnV0ZU5vZGUoCi1vcmcudzNjLmRvbS5BdHRyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvdzNjL2RvbS9ET01FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBvcmcudzNjLmRvbS5BdHRyIHNldEF0dHJpYnV0ZU5vZGVOUygKLW9yZy53M2MuZG9tLkF0dHIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3htbC9kb20vRWxlbWVudEltcGwkRWxlbWVudEF0dHJOYW1lZE5vZGVNYXBJbXBsOyApCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnhtbC5kb20uRWxlbWVudEltcGwgZXh0ZW5kcyBvcmcuYXBhY2hlLmhhcm1vbnkueG1sLmRvbS5Jbm5lck5vZGVJbXBsIGltcGxlbWVudHMgb3JnLnczYy5kb20uRWxlbWVudAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvTGlzdDxMb3JnL2FwYWNoZS9oYXJtb255L3htbC9kb20vQXR0ckltcGw7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdCBhdHRyaWJ1dGVzCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBsb2NhbE5hbWUKLQotcHJpdmF0ZSBib29sZWFuIG5hbWVzcGFjZUF3YXJlCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS54bWwuZG9tLkRvY3VtZW50SW1wbAotamF2YS5sYW5nLlN0cmluZykKLQotIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnhtbC5kb20uRG9jdW1lbnRJbXBsCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1zdGF0aWMgamF2YS51dGlsLkxpc3QgYWNjZXNzJDAwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS54bWwuZG9tLkVsZW1lbnRJbXBsKQotCi1zdGF0aWMgaW50IGFjY2VzcyQxMDAoCi1vcmcuYXBhY2hlLmhhcm1vbnkueG1sLmRvbS5FbGVtZW50SW1wbAotamF2YS5sYW5nLlN0cmluZykKLQotc3RhdGljIGludCBhY2Nlc3MkMjAwKAotb3JnLmFwYWNoZS5oYXJtb255LnhtbC5kb20uRWxlbWVudEltcGwKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgaW50IGluZGV4T2ZBdHRyaWJ1dGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIGludCBpbmRleE9mQXR0cmlidXRlTlMoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRBdHRyaWJ1dGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRBdHRyaWJ1dGVOUygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBvcmcudzNjLmRvbS5BdHRyIGdldEF0dHJpYnV0ZU5vZGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgb3JnLnczYy5kb20uQXR0ciBnZXRBdHRyaWJ1dGVOb2RlTlMoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwIGdldEF0dHJpYnV0ZXMoKQotCi0gb3JnLnczYy5kb20uRWxlbWVudCBnZXRFbGVtZW50QnlJZCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBvcmcudzNjLmRvbS5Ob2RlTGlzdCBnZXRFbGVtZW50c0J5VGFnTmFtZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLSB2b2lkIGdldEVsZW1lbnRzQnlUYWdOYW1lKAotb3JnLmFwYWNoZS5oYXJtb255LnhtbC5kb20uTm9kZUxpc3RJbXBsCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgb3JnLnczYy5kb20uTm9kZUxpc3QgZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLSB2b2lkIGdldEVsZW1lbnRzQnlUYWdOYW1lTlMoCi1vcmcuYXBhY2hlLmhhcm1vbnkueG1sLmRvbS5Ob2RlTGlzdEltcGwKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldExvY2FsTmFtZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE5vZGVOYW1lKCkKLQotcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UHJlZml4KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VGFnTmFtZSgpCi0KLXB1YmxpYyBib29sZWFuIGhhc0F0dHJpYnV0ZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBib29sZWFuIGhhc0F0dHJpYnV0ZU5TKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJvb2xlYW4gaGFzQXR0cmlidXRlcygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy93M2MvZG9tL0RPTUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcmVtb3ZlQXR0cmlidXRlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3czYy9kb20vRE9NRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCByZW1vdmVBdHRyaWJ1dGVOUygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy93M2MvZG9tL0RPTUV4Y2VwdGlvbjsgKQotcHVibGljIG9yZy53M2MuZG9tLkF0dHIgcmVtb3ZlQXR0cmlidXRlTm9kZSgKLW9yZy53M2MuZG9tLkF0dHIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy93M2MvZG9tL0RPTUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3czYy9kb20vRE9NRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVOUygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy93M2MvZG9tL0RPTUV4Y2VwdGlvbjsgKQotcHVibGljIG9yZy53M2MuZG9tLkF0dHIgc2V0QXR0cmlidXRlTm9kZSgKLW9yZy53M2MuZG9tLkF0dHIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy93M2MvZG9tL0RPTUV4Y2VwdGlvbjsgKQotcHVibGljIG9yZy53M2MuZG9tLkF0dHIgc2V0QXR0cmlidXRlTm9kZU5TKAotb3JnLnczYy5kb20uQXR0cikKLQotcHVibGljIHZvaWQgc2V0UHJlZml4KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLnczYy5kb20uRW50aXR5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy53M2MuZG9tLk5vZGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXROb3RhdGlvbk5hbWUoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRQdWJsaWNJZCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldFN5c3RlbUlkKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkueG1sLmRvbS5FbnRpdHlJbXBsIGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnhtbC5kb20uTm9kZUltcGwgaW1wbGVtZW50cyBvcmcudzNjLmRvbS5FbnRpdHkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG5vdGF0aW9uTmFtZQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcHVibGljSUQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHN5c3RlbUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnhtbC5kb20uRG9jdW1lbnRJbXBsCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXROb2RlTmFtZSgpCi0KLXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE5vdGF0aW9uTmFtZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFB1YmxpY0lkKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3lzdGVtSWQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcudzNjLmRvbS5FbnRpdHlSZWZlcmVuY2UgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLnczYy5kb20uTm9kZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnhtbC5kb20uRW50aXR5UmVmZXJlbmNlSW1wbCBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS54bWwuZG9tLkxlYWZOb2RlSW1wbCBpbXBsZW1lbnRzIG9yZy53M2MuZG9tLkVudGl0eVJlZmVyZW5jZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbmFtZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS54bWwuZG9tLkRvY3VtZW50SW1wbAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Tm9kZU5hbWUoKQotCi1wdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS54bWwuZG9tLk5hbWVkTm9kZU1hcEltcGwgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9MaXN0PExvcmcvYXBhY2hlL2hhcm1vbnkveG1sL2RvbS9Ob2RlSW1wbDs+OyApCi1wcml2YXRlIGphdmEudXRpbC5MaXN0IGxpc3QKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL0NsYXNzPCo+OyApCi1wcml2YXRlIGphdmEubGFuZy5DbGFzcyB0eXBlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oTGphdmEvbGFuZy9DbGFzczwqPjspViApCi0gdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuQ2xhc3MpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTGlzdDxMb3JnL2FwYWNoZS9oYXJtb255L3htbC9kb20vTm9kZUltcGw7PjtMamF2YS9sYW5nL0NsYXNzPCo+OylWICkKLSB2b2lkIDxpbml0PigKLWphdmEudXRpbC5MaXN0Ci1qYXZhLmxhbmcuQ2xhc3MpCi0KLXByaXZhdGUgaW50IGluZGV4T2ZJdGVtKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBpbnQgaW5kZXhPZkl0ZW1OUygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkKLQotcHVibGljIG9yZy53M2MuZG9tLk5vZGUgZ2V0TmFtZWRJdGVtKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIG9yZy53M2MuZG9tLk5vZGUgZ2V0TmFtZWRJdGVtTlMoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgb3JnLnczYy5kb20uTm9kZSBpdGVtKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvdzNjL2RvbS9ET01FeGNlcHRpb247ICkKLXB1YmxpYyBvcmcudzNjLmRvbS5Ob2RlIHJlbW92ZU5hbWVkSXRlbSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy93M2MvZG9tL0RPTUV4Y2VwdGlvbjsgKQotcHVibGljIG9yZy53M2MuZG9tLk5vZGUgcmVtb3ZlTmFtZWRJdGVtTlMoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvdzNjL2RvbS9ET01FeGNlcHRpb247ICkKLXB1YmxpYyBvcmcudzNjLmRvbS5Ob2RlIHNldE5hbWVkSXRlbSgKLW9yZy53M2MuZG9tLk5vZGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy93M2MvZG9tL0RPTUV4Y2VwdGlvbjsgKQotcHVibGljIG9yZy53M2MuZG9tLk5vZGUgc2V0TmFtZWRJdGVtTlMoCi1vcmcudzNjLmRvbS5Ob2RlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS54bWwuZG9tLk5vZGVMaXN0SW1wbCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcudzNjLmRvbS5Ob2RlTGlzdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPUxqYXZhL3V0aWwvTGlzdDxMb3JnL2FwYWNoZS9oYXJtb255L3htbC9kb20vTm9kZUltcGw7PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdCBjaGlsZHJlbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9KExqYXZhL3V0aWwvTGlzdDxMb3JnL2FwYWNoZS9oYXJtb255L3htbC9kb20vTm9kZUltcGw7PjspViApCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuTGlzdCkKLQotIHZvaWQgYWRkKAotb3JnLmFwYWNoZS5oYXJtb255LnhtbC5kb20uTm9kZUltcGwpCi0KLXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkKLQotcHVibGljIG9yZy53M2MuZG9tLk5vZGUgaXRlbSgKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLnczYy5kb20uTm90YXRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLnczYy5kb20uTm9kZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldFB1YmxpY0lkKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0U3lzdGVtSWQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS54bWwuZG9tLk5vdGF0aW9uSW1wbCBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS54bWwuZG9tLkxlYWZOb2RlSW1wbCBpbXBsZW1lbnRzIG9yZy53M2MuZG9tLk5vdGF0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBub3RhdGlvbk5hbWUKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHB1YmxpY0lECi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBzeXN0ZW1JRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS54bWwuZG9tLkRvY3VtZW50SW1wbAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Tm9kZU5hbWUoKQotCi1wdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRQdWJsaWNJZCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN5c3RlbUlkKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLnczYy5kb20uUHJvY2Vzc2luZ0luc3RydWN0aW9uIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy53M2MuZG9tLk5vZGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXREYXRhKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0VGFyZ2V0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3czYy9kb20vRE9NRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXREYXRhKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkueG1sLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsIGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnhtbC5kb20uTGVhZk5vZGVJbXBsIGltcGxlbWVudHMgb3JnLnczYy5kb20uUHJvY2Vzc2luZ0luc3RydWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBkYXRhCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyB0YXJnZXQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkueG1sLmRvbS5Eb2N1bWVudEltcGwKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldERhdGEoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXROb2RlTmFtZSgpCi0KLXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE5vZGVWYWx1ZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFRhcmdldCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy93M2MvZG9tL0RPTUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0RGF0YSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3RvcnlJbXBsIGV4dGVuZHMgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE5BTUVTUEFDRVMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBWQUxJREFUSU9OCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0QXR0cmlidXRlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YXgveG1sL3BhcnNlcnMvUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gZ2V0RmVhdHVyZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmF4L3htbC9wYXJzZXJzL1BhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXIgbmV3RG9jdW1lbnRCdWlsZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YXgveG1sL3BhcnNlcnMvUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0RmVhdHVyZSgKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi0gY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckltcGwgZXh0ZW5kcyBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgb3JnLnczYy5kb20uRE9NSW1wbGVtZW50YXRpb24gZG9tCi0KLXByaXZhdGUgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXIgZW50aXR5UmVzb2x2ZXIKLQotcHJpdmF0ZSBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyCi0KLXByaXZhdGUgYm9vbGVhbiBpZ25vcmVDb21tZW50cwotCi1wcml2YXRlIGJvb2xlYW4gaWdub3JlRWxlbWVudENvbnRlbnRXaGl0ZXNwYWNlCi0KLXByaXZhdGUgYm9vbGVhbiBuYW1lc3BhY2VBd2FyZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHBhcnNlKAotb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcgotb3JnLnczYy5kb20uRG9jdW1lbnQKLW9yZy53M2MuZG9tLk5vZGUKLWludCkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlc29sdmVTdGFuZGFyZEVudGl0eSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBvcmcudzNjLmRvbS5ET01JbXBsZW1lbnRhdGlvbiBnZXRET01JbXBsZW1lbnRhdGlvbigpCi0KLXB1YmxpYyBib29sZWFuIGlzSWdub3JpbmdDb21tZW50cygpCi0KLXB1YmxpYyBib29sZWFuIGlzSWdub3JpbmdFbGVtZW50Q29udGVudFdoaXRlc3BhY2UoKQotCi1wdWJsaWMgYm9vbGVhbiBpc05hbWVzcGFjZUF3YXJlKCkKLQotcHVibGljIGJvb2xlYW4gaXNWYWxpZGF0aW5nKCkKLQotcHVibGljIG9yZy53M2MuZG9tLkRvY3VtZW50IG5ld0RvY3VtZW50KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgb3JnLnczYy5kb20uRG9jdW1lbnQgcGFyc2UoCi1vcmcueG1sLnNheC5JbnB1dFNvdXJjZSkKLQotcHVibGljIHZvaWQgc2V0RW50aXR5UmVzb2x2ZXIoCi1vcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcikKLQotcHVibGljIHZvaWQgc2V0RXJyb3JIYW5kbGVyKAotb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyKQotCi1wdWJsaWMgdm9pZCBzZXRJZ25vcmVDb21tZW50cygKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldElnbm9yZUVsZW1lbnRDb250ZW50V2hpdGVzcGFjZSgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZUF3YXJlKAotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeUltcGwgZXh0ZW5kcyBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTkFNRVNQQUNFUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFZBTElEQVRJT04KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL0Jvb2xlYW47PjsgKQotcHJpdmF0ZSBqYXZhLnV0aWwuTWFwIGZlYXR1cmVzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gZ2V0RmVhdHVyZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBib29sZWFuIGlzTmFtZXNwYWNlQXdhcmUoKQotCi1wdWJsaWMgYm9vbGVhbiBpc1ZhbGlkYXRpbmcoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZheC94bWwvcGFyc2Vycy9QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyIG5ld1NBWFBhcnNlcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWE5vdFJlY29nbml6ZWRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldEZlYXR1cmUoCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VBd2FyZSgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldFZhbGlkYXRpbmcoCi1ib29sZWFuKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS54bWwucGFyc2Vycy5TQVhQYXJzZXJJbXBsIGV4dGVuZHMgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgb3JnLnhtbC5zYXguUGFyc2VyIHBhcnNlcgotCi1wcml2YXRlIG9yZy54bWwuc2F4LlhNTFJlYWRlciByZWFkZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlNpZ25hdHVyZSAodmFsdWUgPShMamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL0Jvb2xlYW47PjspViApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWE5vdFJlY29nbml6ZWRFeGNlcHRpb247TG9yZy94bWwvc2F4L1NBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsgKQotIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLk1hcCkKLQotcHVibGljIG9yZy54bWwuc2F4LlBhcnNlciBnZXRQYXJzZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uO0xvcmcveG1sL3NheC9TQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldFByb3BlcnR5KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIG9yZy54bWwuc2F4LlhNTFJlYWRlciBnZXRYTUxSZWFkZXIoKQotCi1wdWJsaWMgYm9vbGVhbiBpc05hbWVzcGFjZUF3YXJlKCkKLQotcHVibGljIGJvb2xlYW4gaXNWYWxpZGF0aW5nKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbjtMb3JnL3htbC9zYXgvU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQuaW50ZXJuYWwubmxzLk1lc3NhZ2VzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIHNSZXNvdXJjZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nKAotamF2YS5sYW5nLlN0cmluZwotY2hhcikKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLk9iamVjdFtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuQWxlcnRFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGJ5dGUgZGVzY3JpcHRpb24KLQotcHJpdmF0ZSBmaW5hbCBqYXZheC5uZXQuc3NsLlNTTEV4Y2VwdGlvbiByZWFzb24KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oCi1ieXRlCi1qYXZheC5uZXQuc3NsLlNTTEV4Y2VwdGlvbikKLQotcHJvdGVjdGVkIGJ5dGUgZ2V0RGVzY3JpcHRpb25Db2RlKCkKLQotcHJvdGVjdGVkIGphdmF4Lm5ldC5zc2wuU1NMRXhjZXB0aW9uIGdldFJlYXNvbigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5BbGVydFByb3RvY29sIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJ5dGUgQUNDRVNTX0RFTklFRAotCi1wcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJ5dGUgQkFEX0NFUlRJRklDQVRFCi0KLXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYnl0ZSBCQURfUkVDT1JEX01BQwotCi1wcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJ5dGUgQ0VSVElGSUNBVEVfRVhQSVJFRAotCi1wcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJ5dGUgQ0VSVElGSUNBVEVfUkVWT0tFRAotCi1wcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJ5dGUgQ0VSVElGSUNBVEVfVU5LTk9XTgotCi1wcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJ5dGUgQ0xPU0VfTk9USUZZCi0KLXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYnl0ZSBERUNPREVfRVJST1IKLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBieXRlIERFQ09NUFJFU1NJT05fRkFJTFVSRQotCi1wcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJ5dGUgREVDUllQVElPTl9GQUlMRUQKLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBieXRlIERFQ1JZUFRfRVJST1IKLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBieXRlIEVYUE9SVF9SRVNUUklDVElPTgotCi1wcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJ5dGUgRkFUQUwKLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBieXRlIEhBTkRTSEFLRV9GQUlMVVJFCi0KLXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYnl0ZSBJTExFR0FMX1BBUkFNRVRFUgotCi1wcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJ5dGUgSU5TVUZGSUNJRU5UX1NFQ1VSSVRZCi0KLXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYnl0ZSBJTlRFUk5BTF9FUlJPUgotCi1wcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJ5dGUgTk9fUkVORUdPVElBVElPTgotCi1wcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJ5dGUgUFJPVE9DT0xfVkVSU0lPTgotCi1wcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJ5dGUgUkVDT1JEX09WRVJGTE9XCi0KLXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYnl0ZSBVTkVYUEVDVEVEX01FU1NBR0UKLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBieXRlIFVOS05PV05fQ0EKLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBieXRlIFVOU1VQUE9SVEVEX0NFUlRJRklDQVRFCi0KLXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYnl0ZSBVU0VSX0NBTkNFTEVECi0KLXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYnl0ZSBXQVJOSU5HCi0KLXByaXZhdGUgZmluYWwgYnl0ZVtdIGFsZXJ0Ci0KLXByaXZhdGUgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5Mb2dnZXIkU3RyZWFtIGxvZ2dlcgotCi1wcml2YXRlIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuU1NMUmVjb3JkUHJvdG9jb2wgcmVjb3JkUHJvdG9jb2wKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oKQotCi1wcm90ZWN0ZWQgdm9pZCBhbGVydCgKLWJ5dGUKLWJ5dGUpCi0KLXByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIGdldEFsZXJ0RGVzY3JpcHRpb24oKQotCi1wcm90ZWN0ZWQgYnl0ZSBnZXREZXNjcmlwdGlvbkNvZGUoKQotCi1wcm90ZWN0ZWQgYm9vbGVhbiBoYXNBbGVydCgpCi0KLXByb3RlY3RlZCBib29sZWFuIGlzRmF0YWxBbGVydCgpCi0KLXByb3RlY3RlZCB2b2lkIHNldFByb2Nlc3NlZCgpCi0KLXByb3RlY3RlZCB2b2lkIHNldFJlY29yZFByb3RvY29sKAotb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5TU0xSZWNvcmRQcm90b2NvbCkKLQotcHJvdGVjdGVkIHZvaWQgc2h1dGRvd24oKQotCi1wcm90ZWN0ZWQgYnl0ZVtdIHdyYXAoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLkFwcGVuZGFibGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IHZvaWQgYXBwZW5kKAotYnl0ZVtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuTWVzc2FnZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIGludCBsZW5ndGgKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcm90ZWN0ZWQgdm9pZCBmYXRhbEFsZXJ0KAotYnl0ZQotamF2YS5sYW5nLlN0cmluZykKLQotcHJvdGVjdGVkIHZvaWQgZmF0YWxBbGVydCgKLWJ5dGUKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLWFic3RyYWN0IGludCBnZXRUeXBlKCkKLQotcHVibGljIGludCBsZW5ndGgoKQotCi1hYnN0cmFjdCB2b2lkIHNlbmQoCi1vcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLkhhbmRzaGFrZUlPRGF0YVN0cmVhbSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLkNlcnRpZmljYXRlTWVzc2FnZSBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuTWVzc2FnZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZVtdIGNlcnRzCi0KLSBieXRlW11bXSBlbmNvZGVkX2NlcnRzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5IYW5kc2hha2VJT0RhdGFTdHJlYW0KLWludCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZVtdKQotCi1wdWJsaWMgaW50IGdldFR5cGUoKQotCi1wdWJsaWMgdm9pZCBzZW5kKAotb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5IYW5kc2hha2VJT0RhdGFTdHJlYW0pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5DZXJ0aWZpY2F0ZVJlcXVlc3QgZXh0ZW5kcyBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLk1lc3NhZ2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIERTU19GSVhFRF9ESAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgRFNTX1NJR04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFJTQV9GSVhFRF9ESAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgUlNBX1NJR04KLQotIGphdmF4LnNlY3VyaXR5LmF1dGgueDUwMC5YNTAwUHJpbmNpcGFsW10gY2VydGlmaWNhdGVfYXV0aG9yaXRpZXMKLQotZmluYWwgYnl0ZVtdIGNlcnRpZmljYXRlX3R5cGVzCi0KLXByaXZhdGUgYnl0ZVtdW10gZW5jb2RlZF9wcmluY2lwYWxzCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZ1tdIHR5cGVzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5IYW5kc2hha2VJT0RhdGFTdHJlYW0KLWludCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYnl0ZVtdCi1qYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlW10pCi0KLXB1YmxpYyBpbnQgZ2V0VHlwZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0VHlwZXNBc1N0cmluZygpCi0KLXB1YmxpYyB2b2lkIHNlbmQoCi1vcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLkhhbmRzaGFrZUlPRGF0YVN0cmVhbSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLkNlcnRpZmljYXRlVmVyaWZ5IGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5NZXNzYWdlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBieXRlW10gc2lnbmVkSGFzaAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuSGFuZHNoYWtlSU9EYXRhU3RyZWFtCi1pbnQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWJ5dGVbXSkKLQotcHVibGljIGludCBnZXRUeXBlKCkKLQotcHVibGljIHZvaWQgc2VuZCgKLW9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuSGFuZHNoYWtlSU9EYXRhU3RyZWFtKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuQ2lwaGVyU3VpdGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBpbnQgS2V5RXhjaGFuZ2VfREhFX0RTUwotCi1zdGF0aWMgaW50IEtleUV4Y2hhbmdlX0RIRV9EU1NfRVhQT1JUCi0KLXN0YXRpYyBpbnQgS2V5RXhjaGFuZ2VfREhFX1JTQQotCi1zdGF0aWMgaW50IEtleUV4Y2hhbmdlX0RIRV9SU0FfRVhQT1JUCi0KLXN0YXRpYyBpbnQgS2V5RXhjaGFuZ2VfREhfRFNTCi0KLXN0YXRpYyBpbnQgS2V5RXhjaGFuZ2VfREhfRFNTX0VYUE9SVAotCi1zdGF0aWMgaW50IEtleUV4Y2hhbmdlX0RIX1JTQQotCi1zdGF0aWMgaW50IEtleUV4Y2hhbmdlX0RIX1JTQV9FWFBPUlQKLQotc3RhdGljIGludCBLZXlFeGNoYW5nZV9ESF9hbm9uCi0KLXN0YXRpYyBpbnQgS2V5RXhjaGFuZ2VfREhfYW5vbl9FWFBPUlQKLQotc3RhdGljIGludCBLZXlFeGNoYW5nZV9SU0EKLQotc3RhdGljIGludCBLZXlFeGNoYW5nZV9SU0FfRVhQT1JUCi0KLXN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLkNpcGhlclN1aXRlIFRMU19ESEVfRFNTX0VYUE9SVF9XSVRIX0RFUzQwX0NCQ19TSEEKLQotc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuQ2lwaGVyU3VpdGUgVExTX0RIRV9EU1NfV0lUSF8zREVTX0VERV9DQkNfU0hBCi0KLXN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLkNpcGhlclN1aXRlIFRMU19ESEVfRFNTX1dJVEhfREVTX0NCQ19TSEEKLQotc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuQ2lwaGVyU3VpdGUgVExTX0RIRV9SU0FfRVhQT1JUX1dJVEhfREVTNDBfQ0JDX1NIQQotCi1zdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5DaXBoZXJTdWl0ZSBUTFNfREhFX1JTQV9XSVRIXzNERVNfRURFX0NCQ19TSEEKLQotc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuQ2lwaGVyU3VpdGUgVExTX0RIRV9SU0FfV0lUSF9ERVNfQ0JDX1NIQQotCi1zdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5DaXBoZXJTdWl0ZSBUTFNfREhfRFNTX0VYUE9SVF9XSVRIX0RFUzQwX0NCQ19TSEEKLQotc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuQ2lwaGVyU3VpdGUgVExTX0RIX0RTU19XSVRIXzNERVNfRURFX0NCQ19TSEEKLQotc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuQ2lwaGVyU3VpdGUgVExTX0RIX0RTU19XSVRIX0RFU19DQkNfU0hBCi0KLXN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLkNpcGhlclN1aXRlIFRMU19ESF9SU0FfRVhQT1JUX1dJVEhfREVTNDBfQ0JDX1NIQQotCi1zdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5DaXBoZXJTdWl0ZSBUTFNfREhfUlNBX1dJVEhfM0RFU19FREVfQ0JDX1NIQQotCi1zdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5DaXBoZXJTdWl0ZSBUTFNfREhfUlNBX1dJVEhfREVTX0NCQ19TSEEKLQotc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuQ2lwaGVyU3VpdGUgVExTX0RIX2Fub25fRVhQT1JUX1dJVEhfREVTNDBfQ0JDX1NIQQotCi1zdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5DaXBoZXJTdWl0ZSBUTFNfREhfYW5vbl9FWFBPUlRfV0lUSF9SQzRfNDBfTUQ1Ci0KLXN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLkNpcGhlclN1aXRlIFRMU19ESF9hbm9uX1dJVEhfM0RFU19FREVfQ0JDX1NIQQotCi1zdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5DaXBoZXJTdWl0ZSBUTFNfREhfYW5vbl9XSVRIX0RFU19DQkNfU0hBCi0KLXN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLkNpcGhlclN1aXRlIFRMU19ESF9hbm9uX1dJVEhfUkM0XzEyOF9NRDUKLQotc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuQ2lwaGVyU3VpdGUgVExTX05VTExfV0lUSF9OVUxMX05VTEwKLQotc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuQ2lwaGVyU3VpdGUgVExTX1JTQV9FWFBPUlRfV0lUSF9ERVM0MF9DQkNfU0hBCi0KLXN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLkNpcGhlclN1aXRlIFRMU19SU0FfRVhQT1JUX1dJVEhfUkMyX0NCQ180MF9NRDUKLQotc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuQ2lwaGVyU3VpdGUgVExTX1JTQV9FWFBPUlRfV0lUSF9SQzRfNDBfTUQ1Ci0KLXN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLkNpcGhlclN1aXRlIFRMU19SU0FfV0lUSF8zREVTX0VERV9DQkNfU0hBCi0KLXN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLkNpcGhlclN1aXRlIFRMU19SU0FfV0lUSF9ERVNfQ0JDX1NIQQotCi1zdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5DaXBoZXJTdWl0ZSBUTFNfUlNBX1dJVEhfSURFQV9DQkNfU0hBCi0KLXN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLkNpcGhlclN1aXRlIFRMU19SU0FfV0lUSF9OVUxMX01ENQotCi1zdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5DaXBoZXJTdWl0ZSBUTFNfUlNBX1dJVEhfTlVMTF9TSEEKLQotc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuQ2lwaGVyU3VpdGUgVExTX1JTQV9XSVRIX1JDNF8xMjhfTUQ1Ci0KLXN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLkNpcGhlclN1aXRlIFRMU19SU0FfV0lUSF9SQzRfMTI4X1NIQQotCi1zdGF0aWMgYnl0ZVtdIGNvZGVfVExTX0RIRV9EU1NfRVhQT1JUX1dJVEhfREVTNDBfQ0JDX1NIQQotCi1zdGF0aWMgYnl0ZVtdIGNvZGVfVExTX0RIRV9EU1NfV0lUSF8zREVTX0VERV9DQkNfU0hBCi0KLXN0YXRpYyBieXRlW10gY29kZV9UTFNfREhFX0RTU19XSVRIX0RFU19DQkNfU0hBCi0KLXN0YXRpYyBieXRlW10gY29kZV9UTFNfREhFX1JTQV9FWFBPUlRfV0lUSF9ERVM0MF9DQkNfU0hBCi0KLXN0YXRpYyBieXRlW10gY29kZV9UTFNfREhFX1JTQV9XSVRIXzNERVNfRURFX0NCQ19TSEEKLQotc3RhdGljIGJ5dGVbXSBjb2RlX1RMU19ESEVfUlNBX1dJVEhfREVTX0NCQ19TSEEKLQotc3RhdGljIGJ5dGVbXSBjb2RlX1RMU19ESF9EU1NfRVhQT1JUX1dJVEhfREVTNDBfQ0JDX1NIQQotCi1zdGF0aWMgYnl0ZVtdIGNvZGVfVExTX0RIX0RTU19XSVRIXzNERVNfRURFX0NCQ19TSEEKLQotc3RhdGljIGJ5dGVbXSBjb2RlX1RMU19ESF9EU1NfV0lUSF9ERVNfQ0JDX1NIQQotCi1zdGF0aWMgYnl0ZVtdIGNvZGVfVExTX0RIX1JTQV9FWFBPUlRfV0lUSF9ERVM0MF9DQkNfU0hBCi0KLXN0YXRpYyBieXRlW10gY29kZV9UTFNfREhfUlNBX1dJVEhfM0RFU19FREVfQ0JDX1NIQQotCi1zdGF0aWMgYnl0ZVtdIGNvZGVfVExTX0RIX1JTQV9XSVRIX0RFU19DQkNfU0hBCi0KLXN0YXRpYyBieXRlW10gY29kZV9UTFNfREhfYW5vbl9FWFBPUlRfV0lUSF9ERVM0MF9DQkNfU0hBCi0KLXN0YXRpYyBieXRlW10gY29kZV9UTFNfREhfYW5vbl9FWFBPUlRfV0lUSF9SQzRfNDBfTUQ1Ci0KLXN0YXRpYyBieXRlW10gY29kZV9UTFNfREhfYW5vbl9XSVRIXzNERVNfRURFX0NCQ19TSEEKLQotc3RhdGljIGJ5dGVbXSBjb2RlX1RMU19ESF9hbm9uX1dJVEhfREVTX0NCQ19TSEEKLQotc3RhdGljIGJ5dGVbXSBjb2RlX1RMU19ESF9hbm9uX1dJVEhfUkM0XzEyOF9NRDUKLQotc3RhdGljIGJ5dGVbXSBjb2RlX1RMU19OVUxMX1dJVEhfTlVMTF9OVUxMCi0KLXN0YXRpYyBieXRlW10gY29kZV9UTFNfUlNBX0VYUE9SVF9XSVRIX0RFUzQwX0NCQ19TSEEKLQotc3RhdGljIGJ5dGVbXSBjb2RlX1RMU19SU0FfRVhQT1JUX1dJVEhfUkMyX0NCQ180MF9NRDUKLQotc3RhdGljIGJ5dGVbXSBjb2RlX1RMU19SU0FfRVhQT1JUX1dJVEhfUkM0XzQwX01ENQotCi1zdGF0aWMgYnl0ZVtdIGNvZGVfVExTX1JTQV9XSVRIXzNERVNfRURFX0NCQ19TSEEKLQotc3RhdGljIGJ5dGVbXSBjb2RlX1RMU19SU0FfV0lUSF9ERVNfQ0JDX1NIQQotCi1zdGF0aWMgYnl0ZVtdIGNvZGVfVExTX1JTQV9XSVRIX0lERUFfQ0JDX1NIQQotCi1zdGF0aWMgYnl0ZVtdIGNvZGVfVExTX1JTQV9XSVRIX05VTExfTUQ1Ci0KLXN0YXRpYyBieXRlW10gY29kZV9UTFNfUlNBX1dJVEhfTlVMTF9TSEEKLQotc3RhdGljIGJ5dGVbXSBjb2RlX1RMU19SU0FfV0lUSF9SQzRfMTI4X01ENQotCi1zdGF0aWMgYnl0ZVtdIGNvZGVfVExTX1JTQV9XSVRIX1JDNF8xMjhfU0hBCi0KLXByaXZhdGUgc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuQ2lwaGVyU3VpdGVbXSBjdWl0ZXNCeUNvZGUKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLkhhc2h0YWJsZSBjdWl0ZXNCeU5hbWUKLQotc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuQ2lwaGVyU3VpdGVbXSBkZWZhdWx0Q2lwaGVyU3VpdGVzCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nW10gc3VwcG9ydGVkQ2lwaGVyU3VpdGVOYW1lcwotCi1zdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5DaXBoZXJTdWl0ZVtdIHN1cHBvcnRlZENpcGhlclN1aXRlcwotCi1maW5hbCBpbnQgSVZTaXplCi0KLXByaXZhdGUgZmluYWwgaW50IGJsb2NrU2l6ZQotCi1maW5hbCBqYXZhLmxhbmcuU3RyaW5nIGNpcGhlck5hbWUKLQotcHJpdmF0ZSBmaW5hbCBieXRlW10gY2lwaGVyU3VpdGVDb2RlCi0KLWZpbmFsIGludCBlZmZlY3RpdmVLZXlCeXRlcwotCi1maW5hbCBpbnQgZXhwYW5kZWRLZXlNYXRlcmlhbAotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgaGFzaE5hbWUKLQotcHJpdmF0ZSBmaW5hbCBpbnQgaGFzaFNpemUKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGhtYWNOYW1lCi0KLXByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0V4cG9ydGFibGUKLQotZmluYWwgaW50IGtleUV4Y2hhbmdlCi0KLWZpbmFsIGludCBrZXlNYXRlcmlhbAotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgbmFtZQotCi0gYm9vbGVhbiBzdXBwb3J0ZWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4KLWludAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotYnl0ZVtdKQotCi1wdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuQ2lwaGVyU3VpdGUgZ2V0QnlDb2RlKAotYnl0ZQotYnl0ZSkKLQotcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLkNpcGhlclN1aXRlIGdldEJ5Q29kZSgKLWJ5dGUKLWJ5dGUKLWJ5dGUpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5DaXBoZXJTdWl0ZSBnZXRCeU5hbWUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuQ2lwaGVyU3VpdGVbXSBnZXRTdXBwb3J0ZWQoKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmdbXSBnZXRTdXBwb3J0ZWRDaXBoZXJTdWl0ZU5hbWVzKCkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGludCBnZXRCbG9ja1NpemUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRCdWxrRW5jcnlwdGlvbkFsZ29yaXRobSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEhhc2hOYW1lKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SG1hY05hbWUoKQotCi1wdWJsaWMgaW50IGdldE1BQ0xlbmd0aCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE5hbWUoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0Fub255bW91cygpCi0KLXB1YmxpYyBib29sZWFuIGlzRXhwb3J0YWJsZSgpCi0KLXB1YmxpYyBieXRlW10gdG9CeXRlcygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi0gY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5DbGllbnRIYW5kc2hha2VJbXBsJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuQ2xpZW50SGFuZHNoYWtlSW1wbCB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLkNsaWVudEhhbmRzaGFrZUltcGwpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5IYW5kc2hha2VQcm90b2NvbCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklOSVNIRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkVFRF9UQVNLCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5FRURfVU5XUkFQCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PVF9IQU5EU0hBS0lORwotCi1wcm90ZWN0ZWQgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5DZXJ0aWZpY2F0ZVJlcXVlc3QgY2VydGlmaWNhdGVSZXF1ZXN0Ci0KLXByb3RlY3RlZCBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLkNlcnRpZmljYXRlVmVyaWZ5IGNlcnRpZmljYXRlVmVyaWZ5Ci0KLXByb3RlY3RlZCBib29sZWFuIGNoYW5nZUNpcGhlclNwZWNSZWNlaXZlZAotCi1wcm90ZWN0ZWQgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5DZXJ0aWZpY2F0ZU1lc3NhZ2UgY2xpZW50Q2VydAotCi1wcm90ZWN0ZWQgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5GaW5pc2hlZCBjbGllbnRGaW5pc2hlZAotCi1wcm90ZWN0ZWQgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5DbGllbnRIZWxsbyBjbGllbnRIZWxsbwotCi1wcm90ZWN0ZWQgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5DbGllbnRLZXlFeGNoYW5nZSBjbGllbnRLZXlFeGNoYW5nZQotCi1wcm90ZWN0ZWQgamF2YS5sYW5nLkV4Y2VwdGlvbiBkZWxlZ2F0ZWRUYXNrRXJyCi0KLXByb3RlY3RlZCBqYXZhLnV0aWwuVmVjdG9yIGRlbGVnYXRlZFRhc2tzCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLlNTTEVuZ2luZUltcGwgZW5naW5lT3duZXIKLQotcHJvdGVjdGVkIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuSGFuZHNoYWtlSU9EYXRhU3RyZWFtIGlvX3N0cmVhbQotCi1wcm90ZWN0ZWQgYm9vbGVhbiBpc1Jlc3VtaW5nCi0KLXByaXZhdGUgYnl0ZVtdIG1hc3Rlcl9zZWNyZXRfYnl0ZXMKLQotcHJpdmF0ZSBib29sZWFuIG5lZWRTZW5kQ0NTcGVjCi0KLXByb3RlY3RlZCBib29sZWFuIG5lZWRTZW5kSGVsbG9SZXF1ZXN0Ci0KLXByb3RlY3RlZCBib29sZWFuIG5vbkJsb2NraW5nCi0KLXByb3RlY3RlZCBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLlNTTFBhcmFtZXRlcnMgcGFyYW1ldGVycwotCi1wcm90ZWN0ZWQgYnl0ZVtdIHByZU1hc3RlclNlY3JldAotCi1wcm90ZWN0ZWQgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5TU0xSZWNvcmRQcm90b2NvbCByZWNvcmRQcm90b2NvbAotCi1wcm90ZWN0ZWQgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5DZXJ0aWZpY2F0ZU1lc3NhZ2Ugc2VydmVyQ2VydAotCi1wcm90ZWN0ZWQgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5GaW5pc2hlZCBzZXJ2ZXJGaW5pc2hlZAotCi1wcm90ZWN0ZWQgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5TZXJ2ZXJIZWxsbyBzZXJ2ZXJIZWxsbwotCi1wcm90ZWN0ZWQgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5TZXJ2ZXJIZWxsb0RvbmUgc2VydmVySGVsbG9Eb25lCi0KLXByb3RlY3RlZCBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLlNlcnZlcktleUV4Y2hhbmdlIHNlcnZlcktleUV4Y2hhbmdlCi0KLXByb3RlY3RlZCBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLlNTTFNlc3Npb25JbXBsIHNlc3Npb24KLQotcHJvdGVjdGVkIGludCBzdGF0dXMKLQotcHJpdmF0ZSBieXRlW10gdmVyaWZ5X2RhdGEKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9zcGVjL0ludmFsaWRLZXlTcGVjRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgc3RhdGljIGludCBnZXRSU0FLZXlMZW5ndGgoCi1qYXZhLnNlY3VyaXR5LlB1YmxpY0tleSkKLQotcHJvdGVjdGVkIHZvaWQgY2xlYXJNZXNzYWdlcygpCi0KLXB1YmxpYyB2b2lkIGNvbXB1dGVyTWFzdGVyU2VjcmV0KCkKLQotcHJvdGVjdGVkIHZvaWQgY29tcHV0ZXJSZWZlcmVuY2VWZXJpZnlEYXRhU1NMdjMoCi1ieXRlW10pCi0KLXByb3RlY3RlZCB2b2lkIGNvbXB1dGVyUmVmZXJlbmNlVmVyaWZ5RGF0YVRMUygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByb3RlY3RlZCB2b2lkIGNvbXB1dGVyVmVyaWZ5RGF0YVNTTHYzKAotYnl0ZVtdCi1ieXRlW10pCi0KLXByb3RlY3RlZCB2b2lkIGNvbXB1dGVyVmVyaWZ5RGF0YVRMUygKLWphdmEubGFuZy5TdHJpbmcKLWJ5dGVbXSkKLQotcHJvdGVjdGVkIHZvaWQgZmF0YWxBbGVydCgKLWJ5dGUKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByb3RlY3RlZCB2b2lkIGZhdGFsQWxlcnQoCi1ieXRlCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuRXhjZXB0aW9uKQotCi1wcm90ZWN0ZWQgdm9pZCBmYXRhbEFsZXJ0KAotYnl0ZQotamF2YXgubmV0LnNzbC5TU0xFeGNlcHRpb24pCi0KLXB1YmxpYyBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLlNTTFNlc3Npb25JbXBsIGdldFNlc3Npb24oKQotCi1wdWJsaWMgamF2YXgubmV0LnNzbC5TU0xFbmdpbmVSZXN1bHQkSGFuZHNoYWtlU3RhdHVzIGdldFN0YXR1cygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuUnVubmFibGUgZ2V0VGFzaygpCi0KLWFic3RyYWN0IHZvaWQgbWFrZUZpbmlzaGVkKCkKLQotYWJzdHJhY3Qgdm9pZCByZWNlaXZlQ2hhbmdlQ2lwaGVyU3BlYygpCi0KLXB1YmxpYyB2b2lkIHNlbmQoCi1vcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLk1lc3NhZ2UpCi0KLXByb3RlY3RlZCB2b2lkIHNlbmRDaGFuZ2VDaXBoZXJTcGVjKCkKLQotcHJvdGVjdGVkIHZvaWQgc2VuZEhlbGxvUmVxdWVzdCgpCi0KLXByb3RlY3RlZCB2b2lkIHNlbmRXYXJuaW5nQWxlcnQoCi1ieXRlKQotCi1wdWJsaWMgdm9pZCBzZXRSZWNvcmRQcm90b2NvbCgKLW9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuU1NMUmVjb3JkUHJvdG9jb2wpCi0KLXByb3RlY3RlZCB2b2lkIHNodXRkb3duKCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc3RhcnQoKQotCi1wcm90ZWN0ZWQgdm9pZCBzdG9wKCkKLQotcHJvdGVjdGVkIHZvaWQgdW5leHBlY3RlZE1lc3NhZ2UoKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB1bndyYXAoCi1ieXRlW10pCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHVud3JhcFNTTHYyKAotYnl0ZVtdKQotCi1wcm90ZWN0ZWQgdm9pZCB2ZXJpZnlGaW5pc2hlZCgKLWJ5dGVbXSkKLQotcHVibGljIGJ5dGVbXSB3cmFwKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLkNsaWVudEhhbmRzaGFrZUltcGwgZXh0ZW5kcyBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLkhhbmRzaGFrZVByb3RvY29sCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLk9iamVjdCkKLQotcHJpdmF0ZSBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLlNTTFNlc3Npb25JbXBsIGZpbmRTZXNzaW9uVG9SZXN1bWUoKQotCi1wcml2YXRlIHZvaWQgcmVuZWdvdGlhdGVOZXdTZXNzaW9uKCkKLQotcHJpdmF0ZSB2b2lkIHN0YXJ0U2Vzc2lvbigpCi0KLXByaXZhdGUgdm9pZCB2ZXJpZnlTZXJ2ZXJDZXJ0KCkKLQotcHJvdGVjdGVkIHZvaWQgbWFrZUZpbmlzaGVkKCkKLQotIHZvaWQgcHJvY2Vzc1NlcnZlckhlbGxvRG9uZSgpCi0KLXB1YmxpYyB2b2lkIHJlY2VpdmVDaGFuZ2VDaXBoZXJTcGVjKCkKLQotcHVibGljIHZvaWQgc3RhcnQoKQotCi1wdWJsaWMgdm9pZCB1bndyYXAoCi1ieXRlW10pCi0KLXB1YmxpYyB2b2lkIHVud3JhcFNTTHYyKAotYnl0ZVtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuQ2xpZW50SGVsbG8gZXh0ZW5kcyBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLk1lc3NhZ2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5DaXBoZXJTdWl0ZVtdIGNpcGhlcl9zdWl0ZXMKLQotZmluYWwgYnl0ZVtdIGNsaWVudF92ZXJzaW9uCi0KLWZpbmFsIGJ5dGVbXSBjb21wcmVzc2lvbl9tZXRob2RzCi0KLWZpbmFsIGJ5dGVbXSByYW5kb20KLQotZmluYWwgYnl0ZVtdIHNlc3Npb25faWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbQotYnl0ZVtdCi1ieXRlW10KLW9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuQ2lwaGVyU3VpdGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5IYW5kc2hha2VJT0RhdGFTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuSGFuZHNoYWtlSU9EYXRhU3RyZWFtCi1pbnQpCi0KLXB1YmxpYyBieXRlW10gZ2V0UmFuZG9tKCkKLQotcHVibGljIGludCBnZXRUeXBlKCkKLQotcHVibGljIHZvaWQgc2VuZCgKLW9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuSGFuZHNoYWtlSU9EYXRhU3RyZWFtKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuQ2xpZW50S2V5RXhjaGFuZ2UgZXh0ZW5kcyBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLk1lc3NhZ2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgYnl0ZVtdIGV4Y2hhbmdlX2tleXMKLQotZmluYWwgYm9vbGVhbiBpc1JTQQotCi0gYm9vbGVhbiBpc1RMUwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubWF0aC5CaWdJbnRlZ2VyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLkhhbmRzaGFrZUlPRGF0YVN0cmVhbQotaW50Ci1ib29sZWFuCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ieXRlW10KLWJvb2xlYW4pCi0KLXB1YmxpYyBpbnQgZ2V0VHlwZSgpCi0KLXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKQotCi1wdWJsaWMgdm9pZCBzZW5kKAotb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5IYW5kc2hha2VJT0RhdGFTdHJlYW0pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5Db25uZWN0aW9uU3RhdGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCBqYXZheC5jcnlwdG8uQ2lwaGVyIGRlY0NpcGhlcgotCi1wcm90ZWN0ZWQgamF2YXguY3J5cHRvLkNpcGhlciBlbmNDaXBoZXIKLQotcHJvdGVjdGVkIGludCBoYXNoX3NpemUKLQotcHJvdGVjdGVkIGJvb2xlYW4gaXNfYmxvY2tfY2lwaGVyCi0KLXByb3RlY3RlZCBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLkxvZ2dlciRTdHJlYW0gbG9nZ2VyCi0KLXByb3RlY3RlZCBmaW5hbCBieXRlW10gcmVhZF9zZXFfbnVtCi0KLXByb3RlY3RlZCBmaW5hbCBieXRlW10gd3JpdGVfc2VxX251bQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByb3RlY3RlZCBzdGF0aWMgdm9pZCBpbmNTZXF1ZW5jZU51bWJlcigKLWJ5dGVbXSkKLQotcHJvdGVjdGVkIGJ5dGVbXSBkZWNyeXB0KAotYnl0ZQotYnl0ZVtdKQotCi1wcm90ZWN0ZWQgYWJzdHJhY3QgYnl0ZVtdIGRlY3J5cHQoCi1ieXRlCi1ieXRlW10KLWludAotaW50KQotCi1wcm90ZWN0ZWQgYnl0ZVtdIGVuY3J5cHQoCi1ieXRlCi1ieXRlW10pCi0KLXByb3RlY3RlZCBhYnN0cmFjdCBieXRlW10gZW5jcnlwdCgKLWJ5dGUKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLXByb3RlY3RlZCBpbnQgZ2V0Q29udGVudFNpemUoCi1pbnQpCi0KLXByb3RlY3RlZCBpbnQgZ2V0RnJhZ21lbnRTaXplKAotaW50KQotCi1wcm90ZWN0ZWQgaW50IGdldE1pbkZyYWdtZW50U2l6ZSgpCi0KLXByb3RlY3RlZCB2b2lkIHNodXRkb3duKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLkNvbm5lY3Rpb25TdGF0ZVNTTHYzIGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5Db25uZWN0aW9uU3RhdGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBieXRlW10gbWFjX21hdGVyaWFsX3BhcnQKLQotcHJpdmF0ZSBmaW5hbCBieXRlW10gbWFjX3JlYWRfc2VjcmV0Ci0KLXByaXZhdGUgZmluYWwgYnl0ZVtdIG1hY193cml0ZV9zZWNyZXQKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3QgbWVzc2FnZURpZ2VzdAotCi1wcml2YXRlIGZpbmFsIGJ5dGVbXSBwYWRfMQotCi1wcml2YXRlIGZpbmFsIGJ5dGVbXSBwYWRfMgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuU1NMU2Vzc2lvbkltcGwpCi0KLXByb3RlY3RlZCBieXRlW10gZGVjcnlwdCgKLWJ5dGUKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLXByb3RlY3RlZCBieXRlW10gZW5jcnlwdCgKLWJ5dGUKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLXByb3RlY3RlZCB2b2lkIHNodXRkb3duKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLkNvbm5lY3Rpb25TdGF0ZVRMUyBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuQ29ubmVjdGlvblN0YXRlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGJ5dGVbXSBDTElFTlRfV1JJVEVfS0VZX0xBQkVMCi0KLXByaXZhdGUgc3RhdGljIGJ5dGVbXSBJVl9CTE9DS19MQUJFTAotCi1wcml2YXRlIHN0YXRpYyBieXRlW10gS0VZX0VYUEFOU0lPTl9MQUJFTAotCi1wcml2YXRlIHN0YXRpYyBieXRlW10gU0VSVkVSX1dSSVRFX0tFWV9MQUJFTAotCi1wcml2YXRlIGZpbmFsIGphdmF4LmNyeXB0by5NYWMgZGVjTWFjCi0KLXByaXZhdGUgZmluYWwgamF2YXguY3J5cHRvLk1hYyBlbmNNYWMKLQotcHJpdmF0ZSBmaW5hbCBieXRlW10gbWFjX21hdGVyaWFsX2hlYWRlcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5TU0xTZXNzaW9uSW1wbCkKLQotcHJvdGVjdGVkIGJ5dGVbXSBkZWNyeXB0KAotYnl0ZQotYnl0ZVtdCi1pbnQKLWludCkKLQotcHJvdGVjdGVkIGJ5dGVbXSBlbmNyeXB0KAotYnl0ZQotYnl0ZVtdCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLkNvbnRlbnRUeXBlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJ5dGUgQUxFUlQKLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBieXRlIEFQUExJQ0FUSU9OX0RBVEEKLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBieXRlIENIQU5HRV9DSVBIRVJfU1BFQwotCi1wcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJ5dGUgSEFORFNIQUtFCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLkRIUGFyYW1ldGVycyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIHByaW1lCi0KLXByaXZhdGUgc3RhdGljIGJ5dGVbXSBwcmltZTUxMgotCi1wcml2YXRlIHN0YXRpYyBieXRlW10gcHJpbWVHcm91cDEKLQotcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIHByaW1lR3JvdXAyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGJ5dGVbXSBnZXRQcmltZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuRGF0YVN0cmVhbSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgYnl0ZVtdIGdldERhdGEoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGhhc0RhdGEoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuRGVsZWdhdGVkVGFzayBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLmxhbmcuUnVubmFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBmaW5hbCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24gYWN0aW9uCi0KLXByaXZhdGUgZmluYWwgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sQ29udGV4dCBjb250ZXh0Ci0KLXByaXZhdGUgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5IYW5kc2hha2VQcm90b2NvbCBoYW5kc2hha2VyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uCi1vcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLkhhbmRzaGFrZVByb3RvY29sCi1qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xDb250ZXh0KQotCi1wdWJsaWMgdm9pZCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuRGlnaXRhbFNpZ25hdHVyZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZheC5jcnlwdG8uQ2lwaGVyIGNpcGhlcgotCi1wcml2YXRlIGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdCBtZDUKLQotcHJpdmF0ZSBieXRlW10gbWQ1X2hhc2gKLQotcHJpdmF0ZSBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Qgc2hhCi0KLXByaXZhdGUgYnl0ZVtdIHNoYV9oYXNoCi0KLXByaXZhdGUgamF2YS5zZWN1cml0eS5TaWduYXR1cmUgc2lnbmF0dXJlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50KQotCi1wdWJsaWMgdm9pZCBpbml0KAotamF2YS5zZWN1cml0eS5Qcml2YXRlS2V5KQotCi1wdWJsaWMgdm9pZCBpbml0KAotamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlKQotCi1wdWJsaWMgdm9pZCBzZXRNRDUoCi1ieXRlW10pCi0KLXB1YmxpYyB2b2lkIHNldFNIQSgKLWJ5dGVbXSkKLQotcHVibGljIGJ5dGVbXSBzaWduKCkKLQotcHVibGljIHZvaWQgdXBkYXRlKAotYnl0ZVtdKQotCi1wdWJsaWMgYm9vbGVhbiB2ZXJpZnlTaWduYXR1cmUoCi1ieXRlW10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5FbmRPZkJ1ZmZlckV4Y2VwdGlvbiBleHRlbmRzIGphdmEuaW8uSU9FeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuRW5kT2ZTb3VyY2VFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmlvLklPRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLkZpbmlzaGVkIGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5NZXNzYWdlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYnl0ZVtdIGRhdGEKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLkhhbmRzaGFrZUlPRGF0YVN0cmVhbQotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ieXRlW10pCi0KLXB1YmxpYyBieXRlW10gZ2V0RGF0YSgpCi0KLXB1YmxpYyBpbnQgZ2V0VHlwZSgpCi0KLXB1YmxpYyB2b2lkIHNlbmQoCi1vcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLkhhbmRzaGFrZUlPRGF0YVN0cmVhbSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLkhhbmRzaGFrZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIENFUlRJRklDQVRFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBDRVJUSUZJQ0FURV9SRVFVRVNUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBDRVJUSUZJQ0FURV9WRVJJRlkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIENMSUVOVF9IRUxMTwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgQ0xJRU5UX0tFWV9FWENIQU5HRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgRklOSVNIRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIEhFTExPX1JFUVVFU1QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFNFUlZFUl9IRUxMTwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgU0VSVkVSX0hFTExPX0RPTkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFNFUlZFUl9LRVlfRVhDSEFOR0UKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuU1NMSW5wdXRTdHJlYW0gZXh0ZW5kcyBqYXZhLmlvLklucHV0U3RyZWFtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCBhdmFpbGFibGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IHJlYWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoCi1ieXRlW10KLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYnl0ZVtdIHJlYWQoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcmVhZFVpbnQxNigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcmVhZFVpbnQyNCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBsb25nIHJlYWRVaW50MzIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgbG9uZyByZWFkVWludDY0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCByZWFkVWludDgoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgbG9uZyBza2lwKAotbG9uZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLkhhbmRzaGFrZUlPRGF0YVN0cmVhbSBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuU1NMSW5wdXRTdHJlYW0gaW1wbGVtZW50cyBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLkFwcGVuZGFibGUsIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuRGF0YVN0cmVhbQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3QgbWQ1Ci0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdCBzaGEKLQotcHJpdmF0ZSBpbnQgYnVmZl9zaXplCi0KLXByaXZhdGUgYnl0ZVtdIGJ1ZmZlcgotCi1wcml2YXRlIGludCBpbmNfYnVmZl9zaXplCi0KLXByaXZhdGUgaW50IG1hcmtlZF9wb3MKLQotcHJpdmF0ZSBpbnQgcmVhZF9wb3MKLQotcHJpdmF0ZSBpbnQgcmVhZF9wb3NfZW5kCi0KLXByaXZhdGUgaW50IHdyaXRlX3BvcwotCi1wcml2YXRlIGludCB3cml0ZV9wb3NfYmVnCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIHZvaWQgYXBwZW5kKAotYnl0ZVtdCi1pbnQKLWludCkKLQotcHJpdmF0ZSB2b2lkIGNoZWNrKAotaW50KQotCi1wcml2YXRlIHZvaWQgZW5sYXJnZUJ1ZmZlcigKLWludCkKLQotcHVibGljIHZvaWQgYXBwZW5kKAotYnl0ZVtdKQotCi1wdWJsaWMgaW50IGF2YWlsYWJsZSgpCi0KLXByb3RlY3RlZCB2b2lkIGNsZWFyQnVmZmVyKCkKLQotcHVibGljIGJ5dGVbXSBnZXREYXRhKAotaW50KQotCi1wcm90ZWN0ZWQgYnl0ZVtdIGdldERpZ2VzdE1ENSgpCi0KLXByb3RlY3RlZCBieXRlW10gZ2V0RGlnZXN0TUQ1d2l0aG91dExhc3QoKQotCi1wcm90ZWN0ZWQgYnl0ZVtdIGdldERpZ2VzdFNIQSgpCi0KLXByb3RlY3RlZCBieXRlW10gZ2V0RGlnZXN0U0hBd2l0aG91dExhc3QoKQotCi1wcm90ZWN0ZWQgYnl0ZVtdIGdldE1lc3NhZ2VzKCkKLQotcHVibGljIGJvb2xlYW4gaGFzRGF0YSgpCi0KLXB1YmxpYyB2b2lkIG1hcmsoKQotCi1wdWJsaWMgdm9pZCBtYXJrKAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBtYXJrU3VwcG9ydGVkKCkKLQotcHJvdGVjdGVkIHZvaWQgcHJpbnRDb250ZW50KAotamF2YS5pby5QcmludFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCByZWFkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCByZWFkKAotYnl0ZVtdCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGJ5dGVbXSByZWFkKAotaW50KQotCi1wcm90ZWN0ZWQgdm9pZCByZW1vdmVGcm9tTWFya2VkUG9zaXRpb24oKQotCi1wdWJsaWMgdm9pZCByZXNldCgpCi0KLXB1YmxpYyB2b2lkIHdyaXRlKAotYnl0ZSkKLQotcHVibGljIHZvaWQgd3JpdGUoCi1ieXRlW10pCi0KLXB1YmxpYyB2b2lkIHdyaXRlVWludDE2KAotbG9uZykKLQotcHVibGljIHZvaWQgd3JpdGVVaW50MjQoCi1sb25nKQotCi1wdWJsaWMgdm9pZCB3cml0ZVVpbnQzMigKLWxvbmcpCi0KLXB1YmxpYyB2b2lkIHdyaXRlVWludDY0KAotbG9uZykKLQotcHVibGljIHZvaWQgd3JpdGVVaW50OCgKLWxvbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5IZWxsb1JlcXVlc3QgZXh0ZW5kcyBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLk1lc3NhZ2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLkhhbmRzaGFrZUlPRGF0YVN0cmVhbQotaW50KQotCi1wdWJsaWMgaW50IGdldFR5cGUoKQotCi1wdWJsaWMgaW50IGxlbmd0aCgpCi0KLXB1YmxpYyB2b2lkIHNlbmQoCi1vcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLkhhbmRzaGFrZUlPRGF0YVN0cmVhbSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvc2VjdXJpdHkvUHJpdmlsZWdlZEFjdGlvbjxMamF2YS9sYW5nL1ZvaWQ7PjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuSlNTRVByb3ZpZGVyJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuSlNTRVByb3ZpZGVyIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuSlNTRVByb3ZpZGVyKQotCi1wdWJsaWMgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCBydW4oKQotCi1wdWJsaWMgamF2YS5sYW5nLlZvaWQgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLkpTU0VQcm92aWRlciBleHRlbmRzIGphdmEuc2VjdXJpdHkuUHJvdmlkZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS9zZWN1cml0eS9Qcml2aWxlZ2VkQWN0aW9uPExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLSBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLktleU1hbmFnZXJGYWN0b3J5SW1wbCQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLktleU1hbmFnZXJGYWN0b3J5SW1wbCB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLktleU1hbmFnZXJGYWN0b3J5SW1wbCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgcnVuKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvc2VjdXJpdHkvUHJpdmlsZWdlZEFjdGlvbjxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi0gY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5LZXlNYW5hZ2VyRmFjdG9yeUltcGwkMiBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5LZXlNYW5hZ2VyRmFjdG9yeUltcGwgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5LZXlNYW5hZ2VyRmFjdG9yeUltcGwpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IHJ1bigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5LZXlNYW5hZ2VyRmFjdG9yeUltcGwgZXh0ZW5kcyBqYXZheC5uZXQuc3NsLktleU1hbmFnZXJGYWN0b3J5U3BpCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS5zZWN1cml0eS5LZXlTdG9yZSBrZXlTdG9yZQotCi1wcml2YXRlIGNoYXJbXSBwd2QKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgamF2YXgubmV0LnNzbC5LZXlNYW5hZ2VyW10gZW5naW5lR2V0S2V5TWFuYWdlcnMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0tleVN0b3JlRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9VbnJlY292ZXJhYmxlS2V5RXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBlbmdpbmVJbml0KAotamF2YS5zZWN1cml0eS5LZXlTdG9yZQotY2hhcltdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGVuZ2luZUluaXQoCi1qYXZheC5uZXQuc3NsLk1hbmFnZXJGYWN0b3J5UGFyYW1ldGVycykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLktleU1hbmFnZXJJbXBsIGV4dGVuZHMgamF2YXgubmV0LnNzbC5YNTA5RXh0ZW5kZWRLZXlNYW5hZ2VyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgamF2YS51dGlsLkhhc2h0YWJsZSBoYXNoCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5zZWN1cml0eS5LZXlTdG9yZQotY2hhcltdKQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmdbXSBjaG9vc2VBbGlhcygKLWphdmEubGFuZy5TdHJpbmdbXQotamF2YS5zZWN1cml0eS5QcmluY2lwYWxbXSkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgY2hvb3NlQ2xpZW50QWxpYXMoCi1qYXZhLmxhbmcuU3RyaW5nW10KLWphdmEuc2VjdXJpdHkuUHJpbmNpcGFsW10KLWphdmEubmV0LlNvY2tldCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgY2hvb3NlRW5naW5lQ2xpZW50QWxpYXMoCi1qYXZhLmxhbmcuU3RyaW5nW10KLWphdmEuc2VjdXJpdHkuUHJpbmNpcGFsW10KLWphdmF4Lm5ldC5zc2wuU1NMRW5naW5lKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBjaG9vc2VFbmdpbmVTZXJ2ZXJBbGlhcygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEuc2VjdXJpdHkuUHJpbmNpcGFsW10KLWphdmF4Lm5ldC5zc2wuU1NMRW5naW5lKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBjaG9vc2VTZXJ2ZXJBbGlhcygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEuc2VjdXJpdHkuUHJpbmNpcGFsW10KLWphdmEubmV0LlNvY2tldCkKLQotcHVibGljIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGVbXSBnZXRDZXJ0aWZpY2F0ZUNoYWluKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBnZXRDbGllbnRBbGlhc2VzKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5zZWN1cml0eS5QcmluY2lwYWxbXSkKLQotcHVibGljIGphdmEuc2VjdXJpdHkuUHJpdmF0ZUtleSBnZXRQcml2YXRlS2V5KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBnZXRTZXJ2ZXJBbGlhc2VzKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5zZWN1cml0eS5QcmluY2lwYWxbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTggbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9Mb2dnZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS9zZWN1cml0eS9Qcml2aWxlZ2VkQWN0aW9uPFtMamF2YS9sYW5nL1N0cmluZzs+OyApCi1maW5hbCBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLkxvZ2dlciQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IHJ1bigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9U3RyZWFtICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL0xvZ2dlcjsgKQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuTG9nZ2VyJFN0cmVhbSBleHRlbmRzIGphdmEuaW8uUHJpbnRTdHJlYW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgaW50IGluZGVudAotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgcHJlZml4Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBlbmRJbmRlbnQoKQotCi1wdWJsaWMgdm9pZCBuZXdJbmRlbnQoKQotCi1wdWJsaWMgdm9pZCBwcmludCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHByaW50KAotYnl0ZVtdKQotCi1wdWJsaWMgdm9pZCBwcmludCgKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIHByaW50QXNIZXgoCi1pbnQKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWJ5dGVbXSkKLQotcHVibGljIHZvaWQgcHJpbnRBc0hleCgKLWludAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotYnl0ZVtdCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgcHJpbnRsbigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9Mb2dnZXIkU3RyZWFtOyApCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5Mb2dnZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmdbXSBuYW1lcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLkxvZ2dlciRTdHJlYW0gZ2V0U3RyZWFtKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLk5hdGl2ZUNyeXB0byBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBFVlBfRGlnZXN0QmxvY2tTaXplKAotaW50KQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgRVZQX0RpZ2VzdEZpbmFsKAotaW50Ci1ieXRlW10KLWludCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBFVlBfRGlnZXN0SW5pdCgKLWludAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IEVWUF9EaWdlc3RTaXplKAotaW50KQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIEVWUF9EaWdlc3RVcGRhdGUoCi1pbnQKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgRVZQX1BLRVlfZnJlZSgKLWludCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IEVWUF9QS0VZX25ld19EU0EoCi1ieXRlW10KLWJ5dGVbXQotYnl0ZVtdCi1ieXRlW10KLWJ5dGVbXSkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IEVWUF9QS0VZX25ld19SU0EoCi1ieXRlW10KLWJ5dGVbXQotYnl0ZVtdCi1ieXRlW10KLWJ5dGVbXSkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IEVWUF9WZXJpZnlGaW5hbCgKLWludAotYnl0ZVtdCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIEVWUF9WZXJpZnlJbml0KAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIEVWUF9WZXJpZnlVcGRhdGUoCi1pbnQKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgRVZQX2ZyZWUoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBFVlBfbmV3KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uRGlnZXN0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZG9GaW5hbCgKLWJ5dGVbXQotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRBbGdvcml0aG1OYW1lKCkKLQotcHVibGljIGFic3RyYWN0IGludCBnZXREaWdlc3RTaXplKCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgcmVzZXQoKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB1cGRhdGUoCi1ieXRlKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB1cGRhdGUoCi1ieXRlW10KLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5FeHRlbmRlZERpZ2VzdCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5EaWdlc3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldEJ5dGVMZW5ndGgoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuT3BlblNTTE1lc3NhZ2VEaWdlc3QgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uRXh0ZW5kZWREaWdlc3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGFsZ29yaXRobQotCi1wcml2YXRlIGludCBjdHgKLQotcHJpdmF0ZSBieXRlW10gc2luZ2xlQnl0ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuT3BlblNTTE1lc3NhZ2VEaWdlc3QgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgaW50IGRvRmluYWwoCi1ieXRlW10KLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL1Rocm93YWJsZTsgKQotcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRBbGdvcml0aG1OYW1lKCkKLQotcHVibGljIGludCBnZXRCeXRlTGVuZ3RoKCkKLQotcHVibGljIGludCBnZXREaWdlc3RTaXplKCkKLQotcHVibGljIHZvaWQgcmVzZXQoKQotCi1wdWJsaWMgdm9pZCB1cGRhdGUoCi1ieXRlKQotCi1wdWJsaWMgdm9pZCB1cGRhdGUoCi1ieXRlW10KLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuT3BlblNTTE1lc3NhZ2VEaWdlc3RKREsgZXh0ZW5kcyBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBpbnQgY3R4Ci0KLXByaXZhdGUgYnl0ZVtdIHNpbmdsZUJ5dGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuT3BlblNTTE1lc3NhZ2VEaWdlc3RKREsgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcm90ZWN0ZWQgYnl0ZVtdIGVuZ2luZURpZ2VzdCgpCi0KLXByb3RlY3RlZCB2b2lkIGVuZ2luZVJlc2V0KCkKLQotcHJvdGVjdGVkIHZvaWQgZW5naW5lVXBkYXRlKAotYnl0ZSkKLQotcHJvdGVjdGVkIHZvaWQgZW5naW5lVXBkYXRlKAotYnl0ZVtdCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL1Rocm93YWJsZTsgKQotcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuT3BlblNTTFNlcnZlclNvY2tldEZhY3RvcnlJbXBsIGV4dGVuZHMgamF2YXgubmV0LnNzbC5TU0xTZXJ2ZXJTb2NrZXRGYWN0b3J5Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS5pby5JT0V4Y2VwdGlvbiBpbnN0YW50aWF0aW9uRXhjZXB0aW9uCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5TU0xQYXJhbWV0ZXJzIHNzbFBhcmFtZXRlcnMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLlNTTFBhcmFtZXRlcnMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQgY3JlYXRlU2VydmVyU29ja2V0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubmV0LlNlcnZlclNvY2tldCBjcmVhdGVTZXJ2ZXJTb2NrZXQoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQgY3JlYXRlU2VydmVyU29ja2V0KAotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQgY3JlYXRlU2VydmVyU29ja2V0KAotaW50Ci1pbnQKLWphdmEubmV0LkluZXRBZGRyZXNzKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIGdldERlZmF1bHRDaXBoZXJTdWl0ZXMoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIGdldFN1cHBvcnRlZENpcGhlclN1aXRlcygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5PcGVuU1NMU2VydmVyU29ja2V0SW1wbCBleHRlbmRzIGphdmF4Lm5ldC5zc2wuU1NMU2VydmVyU29ja2V0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGxvbmcgU1NMX09QX05PX1NTTHYzCi0KLXByaXZhdGUgc3RhdGljIGxvbmcgU1NMX09QX05PX1RMU3YxCi0KLXByaXZhdGUgc3RhdGljIGludCBTU0xfVkVSSUZZX0NMSUVOVF9PTkNFCi0KLXByaXZhdGUgc3RhdGljIGludCBTU0xfVkVSSUZZX0ZBSUxfSUZfTk9fUEVFUl9DRVJUCi0KLXByaXZhdGUgc3RhdGljIGludCBTU0xfVkVSSUZZX05PTkUKLQotcHJpdmF0ZSBzdGF0aWMgaW50IFNTTF9WRVJJRllfUEVFUgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gc3VwcG9ydGVkUHJvdG9jb2xzCi0KLXByaXZhdGUgYm9vbGVhbiBjbGllbnRfbW9kZQotCi1wcml2YXRlIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuU1NMUGFyYW1ldGVycyBzc2xQYXJhbWV0ZXJzCi0KLXByaXZhdGUgaW50IHNzbF9jdHgKLQotcHJpdmF0ZSBsb25nIHNzbF9vcF9ubwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotaW50Ci1pbnQKLWphdmEubmV0LkluZXRBZGRyZXNzCi1vcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLlNTTFBhcmFtZXRlcnMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLWludAotaW50Ci1vcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLlNTTFBhcmFtZXRlcnMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLWludAotb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5TU0xQYXJhbWV0ZXJzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLlNTTFBhcmFtZXRlcnMpCi0KLXByaXZhdGUgYm9vbGVhbiBmaW5kU3VpdGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgaW5pdCgpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlZnJlZSgpCi0KLXByaXZhdGUgbmF0aXZlIGphdmEubGFuZy5TdHJpbmdbXSBuYXRpdmVnZXRlbmFibGVkY2lwaGVyc3VpdGVzKCkKLQotc3RhdGljIG5hdGl2ZSBqYXZhLmxhbmcuU3RyaW5nW10gbmF0aXZlZ2V0c3VwcG9ydGVkY2lwaGVyc3VpdGVzKCkKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVpbml0KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotYnl0ZVtdKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVpbml0c3RhdGljKCkKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVzZXRjbGllbnRhdXRoKAotaW50KQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZXNldGVuYWJsZWRjaXBoZXJzdWl0ZXMoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZXNldGVuYWJsZWRwcm90b2NvbHMoCi1sb25nKQotCi1wcml2YXRlIHZvaWQgc2V0Q2xpZW50QXV0aCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLm5ldC5Tb2NrZXQgYWNjZXB0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY2xvc2UoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvVGhyb3dhYmxlOyApCi1wcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpCi0KLXB1YmxpYyBib29sZWFuIGdldEVuYWJsZVNlc3Npb25DcmVhdGlvbigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0RW5hYmxlZENpcGhlclN1aXRlcygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0RW5hYmxlZFByb3RvY29scygpCi0KLXB1YmxpYyBib29sZWFuIGdldE5lZWRDbGllbnRBdXRoKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBnZXRTdXBwb3J0ZWRDaXBoZXJTdWl0ZXMoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIGdldFN1cHBvcnRlZFByb3RvY29scygpCi0KLXB1YmxpYyBib29sZWFuIGdldFVzZUNsaWVudE1vZGUoKQotCi1wdWJsaWMgYm9vbGVhbiBnZXRXYW50Q2xpZW50QXV0aCgpCi0KLXB1YmxpYyB2b2lkIHNldEVuYWJsZVNlc3Npb25DcmVhdGlvbigKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldEVuYWJsZWRDaXBoZXJTdWl0ZXMoCi1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLXB1YmxpYyB2b2lkIHNldEVuYWJsZWRQcm90b2NvbHMoCi1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLXB1YmxpYyB2b2lkIHNldE5lZWRDbGllbnRBdXRoKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0VXNlQ2xpZW50TW9kZSgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldFdhbnRDbGllbnRBdXRoKAotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLk9wZW5TU0xTZXNzaW9uSW1wbCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZheC5uZXQuc3NsLlNTTFNlc3Npb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBib29sZWFuIGlzVmFsaWQKLQotIGxvbmcgbGFzdEFjY2Vzc2VkVGltZQotCi0gamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZVtdIGxvY2FsQ2VydGlmaWNhdGVzCi0KLXByaXZhdGUgamF2YXguc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGVbXSBwZWVyQ2VydGlmaWNhdGVDaGFpbgotCi0gamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZVtdIHBlZXJDZXJ0aWZpY2F0ZXMKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHBlZXJIb3N0Ci0KLXByaXZhdGUgaW50IHBlZXJQb3J0Ci0KLXByb3RlY3RlZCBpbnQgc2Vzc2lvbgotCi1wcml2YXRlIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuU1NMUGFyYW1ldGVycyBzc2xQYXJhbWV0ZXJzCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5Ud29LZXlIYXNoTWFwIHZhbHVlcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLWludAotb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5TU0xQYXJhbWV0ZXJzCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlZnJlZSgKLWludCkKLQotcHJpdmF0ZSBuYXRpdmUgamF2YS5sYW5nLlN0cmluZyBuYXRpdmVnZXRjaXBoZXJzdWl0ZSgpCi0KLXByaXZhdGUgbmF0aXZlIGxvbmcgbmF0aXZlZ2V0Y3JlYXRpb250aW1lKCkKLQotcHJpdmF0ZSBuYXRpdmUgYnl0ZVtdIG5hdGl2ZWdldGlkKCkKLQotcHJpdmF0ZSBuYXRpdmUgYnl0ZVtdW10gbmF0aXZlZ2V0cGVlcmNlcnRpZmljYXRlcygpCi0KLXByaXZhdGUgbmF0aXZlIGphdmEubGFuZy5TdHJpbmcgbmF0aXZlZ2V0cGVlcmhvc3QoKQotCi1wcml2YXRlIG5hdGl2ZSBqYXZhLmxhbmcuU3RyaW5nIG5hdGl2ZWdldHBlZXJwb3J0KCkKLQotcHJpdmF0ZSBuYXRpdmUgamF2YS5sYW5nLlN0cmluZyBuYXRpdmVnZXRwcm90b2NvbCgpCi0KLXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkKLQotcHVibGljIGludCBnZXRBcHBsaWNhdGlvbkJ1ZmZlclNpemUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRDaXBoZXJTdWl0ZSgpCi0KLXB1YmxpYyBsb25nIGdldENyZWF0aW9uVGltZSgpCi0KLXB1YmxpYyBieXRlW10gZ2V0SWQoKQotCi1wdWJsaWMgbG9uZyBnZXRMYXN0QWNjZXNzZWRUaW1lKCkKLQotcHVibGljIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZVtdIGdldExvY2FsQ2VydGlmaWNhdGVzKCkKLQotcHVibGljIGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsIGdldExvY2FsUHJpbmNpcGFsKCkKLQotcHVibGljIGludCBnZXRQYWNrZXRCdWZmZXJTaXplKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YXgvbmV0L3NzbC9TU0xQZWVyVW52ZXJpZmllZEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmF4LnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlW10gZ2V0UGVlckNlcnRpZmljYXRlQ2hhaW4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZheC9uZXQvc3NsL1NTTFBlZXJVbnZlcmlmaWVkRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlW10gZ2V0UGVlckNlcnRpZmljYXRlcygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFBlZXJIb3N0KCkKLQotcHVibGljIGludCBnZXRQZWVyUG9ydCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmF4L25ldC9zc2wvU1NMUGVlclVudmVyaWZpZWRFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbCBnZXRQZWVyUHJpbmNpcGFsKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UHJvdG9jb2woKQotCi1wdWJsaWMgamF2YXgubmV0LnNzbC5TU0xTZXNzaW9uQ29udGV4dCBnZXRTZXNzaW9uQ29udGV4dCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldFZhbHVlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBnZXRWYWx1ZU5hbWVzKCkKLQotcHVibGljIHZvaWQgaW52YWxpZGF0ZSgpCi0KLXB1YmxpYyBib29sZWFuIGlzVmFsaWQoKQotCi1wdWJsaWMgdm9pZCBwdXRWYWx1ZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2lkIHJlbW92ZVZhbHVlKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLk9wZW5TU0xTaWduYXR1cmUgZXh0ZW5kcyBqYXZhLnNlY3VyaXR5LlNpZ25hdHVyZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGludCBjdHgKLQotcHJpdmF0ZSBpbnQgZHNhCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBldnBBbGdvcml0aG0KLQotcHJpdmF0ZSBpbnQgcnNhCi0KLXByaXZhdGUgYnl0ZVtdIHNpbmdsZUJ5dGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuT3BlblNTTFNpZ25hdHVyZSBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgbG9nKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9JbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgamF2YS5sYW5nLk9iamVjdCBlbmdpbmVHZXRQYXJhbWV0ZXIoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIGVuZ2luZUluaXRTaWduKAotamF2YS5zZWN1cml0eS5Qcml2YXRlS2V5KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIGVuZ2luZUluaXRWZXJpZnkoCi1qYXZhLnNlY3VyaXR5LlB1YmxpY0tleSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9JbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBlbmdpbmVTZXRQYXJhbWV0ZXIoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L1NpZ25hdHVyZUV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGJ5dGVbXSBlbmdpbmVTaWduKCkKLQotcHJvdGVjdGVkIHZvaWQgZW5naW5lVXBkYXRlKAotYnl0ZSkKLQotcHJvdGVjdGVkIHZvaWQgZW5naW5lVXBkYXRlKAotYnl0ZVtdCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9TaWduYXR1cmVFeGNlcHRpb247ICkKLXByb3RlY3RlZCBib29sZWFuIGVuZ2luZVZlcmlmeSgKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL1Rocm93YWJsZTsgKQotcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuT3BlblNTTFNvY2tldEZhY3RvcnlJbXBsIGV4dGVuZHMgamF2YXgubmV0LnNzbC5TU0xTb2NrZXRGYWN0b3J5Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS5pby5JT0V4Y2VwdGlvbiBpbnN0YW50aWF0aW9uRXhjZXB0aW9uCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5TU0xQYXJhbWV0ZXJzIHNzbFBhcmFtZXRlcnMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLlNTTFBhcmFtZXRlcnMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLm5ldC5Tb2NrZXQgY3JlYXRlU29ja2V0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9uZXQvVW5rbm93bkhvc3RFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLm5ldC5Tb2NrZXQgY3JlYXRlU29ja2V0KAotamF2YS5sYW5nLlN0cmluZwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL25ldC9Vbmtub3duSG9zdEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubmV0LlNvY2tldCBjcmVhdGVTb2NrZXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWphdmEubmV0LkluZXRBZGRyZXNzCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLm5ldC5Tb2NrZXQgY3JlYXRlU29ja2V0KAotamF2YS5uZXQuSW5ldEFkZHJlc3MKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubmV0LlNvY2tldCBjcmVhdGVTb2NrZXQoCi1qYXZhLm5ldC5JbmV0QWRkcmVzcwotaW50Ci1qYXZhLm5ldC5JbmV0QWRkcmVzcwotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5uZXQuU29ja2V0IGNyZWF0ZVNvY2tldCgKLWphdmEubmV0LlNvY2tldAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1ib29sZWFuKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIGdldERlZmF1bHRDaXBoZXJTdWl0ZXMoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIGdldFN1cHBvcnRlZENpcGhlclN1aXRlcygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvT3BlblNTTFNvY2tldEltcGw7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9NDEwNCBuYW1lID1udWxsICkKLSBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLk9wZW5TU0xTb2NrZXRJbXBsJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTIgbmFtZSA9RmluYWxpemVyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL09wZW5TU0xTb2NrZXRJbXBsOyApCi0gY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5PcGVuU1NMU29ja2V0SW1wbCRGaW5hbGl6ZXIgZXh0ZW5kcyBqYXZhLmxhbmcuVGhyZWFkCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuT3BlblNTTFNvY2tldEltcGwgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuT3BlblNTTFNvY2tldEltcGwpCi0KLSB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuT3BlblNTTFNvY2tldEltcGwKLW9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuT3BlblNTTFNvY2tldEltcGwkMSkKLQotcHVibGljIHZvaWQgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9PcGVuU1NMU29ja2V0SW1wbDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPVNTTElucHV0U3RyZWFtICkKLSBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLk9wZW5TU0xTb2NrZXRJbXBsJFNTTElucHV0U3RyZWFtIGV4dGVuZHMgamF2YS5pby5JbnB1dFN0cmVhbQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLk9wZW5TU0xTb2NrZXRJbXBsIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLSB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuT3BlblNTTFNvY2tldEltcGwpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcmVhZCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcmVhZCgKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPVNTTE91dHB1dFN0cmVhbSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9PcGVuU1NMU29ja2V0SW1wbDsgKQotIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuT3BlblNTTFNvY2tldEltcGwkU1NMT3V0cHV0U3RyZWFtIGV4dGVuZHMgamF2YS5pby5PdXRwdXRTdHJlYW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5PcGVuU1NMU29ja2V0SW1wbCB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi0gdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLk9wZW5TU0xTb2NrZXRJbXBsKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB3cml0ZSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgd3JpdGUoCi1ieXRlW10KLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TG9yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvT3BlblNTTFNvY2tldEltcGwkMTtMb3JnL2FwYWNoZS9oYXJtb255L3huZXQvcHJvdmlkZXIvanNzZS9PcGVuU1NMU29ja2V0SW1wbCRGaW5hbGl6ZXI7TG9yZy9hcGFjaGUvaGFybW9ueS94bmV0L3Byb3ZpZGVyL2pzc2UvT3BlblNTTFNvY2tldEltcGwkU1NMT3V0cHV0U3RyZWFtO0xvcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL09wZW5TU0xTb2NrZXRJbXBsJFNTTElucHV0U3RyZWFtOyApCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5PcGVuU1NMU29ja2V0SW1wbCBleHRlbmRzIGphdmF4Lm5ldC5zc2wuU1NMU29ja2V0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGxvbmcgU1NMX09QX05PX1NTTHYzCi0KLXByaXZhdGUgc3RhdGljIGxvbmcgU1NMX09QX05PX1RMU3YxCi0KLXByaXZhdGUgc3RhdGljIGludCBpbnN0YW5jZUNvdW50Ci0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmdbXSBzdXBwb3J0ZWRQcm90b2NvbHMKLQotcHJpdmF0ZSBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzcyBhZGRyZXNzCi0KLXByaXZhdGUgYm9vbGVhbiBhdXRvQ2xvc2UKLQotcHJpdmF0ZSBqYXZhLmxhbmcuT2JqZWN0IGhhbmRzaGFrZUxvY2sKLQotcHJpdmF0ZSBib29sZWFuIGhhbmRzaGFrZVN0YXJ0ZWQKLQotcHJpdmF0ZSBqYXZhLmlvLklucHV0U3RyZWFtIGlzCi0KLXByaXZhdGUgamF2YS51dGlsLkFycmF5TGlzdCBsaXN0ZW5lcnMKLQotcHJpdmF0ZSBqYXZhLmlvLk91dHB1dFN0cmVhbSBvcwotCi1wcml2YXRlIGphdmEubGFuZy5PYmplY3QgcmVhZExvY2sKLQotcHJpdmF0ZSBqYXZhLm5ldC5Tb2NrZXQgc29ja2V0Ci0KLXByaXZhdGUgaW50IHNzbAotCi1wcml2YXRlIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuU1NMUGFyYW1ldGVycyBzc2xQYXJhbWV0ZXJzCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5PcGVuU1NMU2Vzc2lvbkltcGwgc3NsU2Vzc2lvbgotCi1wcml2YXRlIGludCBzc2xfY3R4Ci0KLXByaXZhdGUgbG9uZyBzc2xfb3Bfbm8KLQotcHJpdmF0ZSBpbnQgdGltZW91dAotCi1wcml2YXRlIGphdmEubGFuZy5PYmplY3Qgd3JpdGVMb2NrCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWphdmEubmV0LkluZXRBZGRyZXNzCi1pbnQKLW9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuU1NMUGFyYW1ldGVycykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1vcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLlNTTFBhcmFtZXRlcnMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLWphdmEubmV0LkluZXRBZGRyZXNzCi1pbnQKLWphdmEubmV0LkluZXRBZGRyZXNzCi1pbnQKLW9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuU1NMUGFyYW1ldGVycykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotamF2YS5uZXQuSW5ldEFkZHJlc3MKLWludAotb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5TU0xQYXJhbWV0ZXJzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oCi1qYXZhLm5ldC5Tb2NrZXQKLWphdmEubGFuZy5TdHJpbmcKLWludAotYm9vbGVhbgotb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5TU0xQYXJhbWV0ZXJzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLlNTTFBhcmFtZXRlcnMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuU1NMUGFyYW1ldGVycwotbG9uZykKLQotc3RhdGljIGphdmEubGFuZy5PYmplY3QgYWNjZXNzJDAwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuT3BlblNTTFNvY2tldEltcGwpCi0KLXN0YXRpYyBpbnQgYWNjZXNzJDEwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuT3BlblNTTFNvY2tldEltcGwpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXN0YXRpYyBpbnQgYWNjZXNzJDIwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuT3BlblNTTFNvY2tldEltcGwKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotc3RhdGljIGludCBhY2Nlc3MkMzAwKAotb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5PcGVuU1NMU29ja2V0SW1wbAotYnl0ZVtdCi1pbnQKLWludAotaW50KQotCi1zdGF0aWMgamF2YS5sYW5nLk9iamVjdCBhY2Nlc3MkNDAwKAotb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5PcGVuU1NMU29ja2V0SW1wbCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotc3RhdGljIHZvaWQgYWNjZXNzJDUwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuT3BlblNTTFNvY2tldEltcGwKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotc3RhdGljIHZvaWQgYWNjZXNzJDYwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuT3BlblNTTFNvY2tldEltcGwKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLXN0YXRpYyBqYXZhLm5ldC5Tb2NrZXQgYWNjZXNzJDgwMCgKLW9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuT3BlblNTTFNvY2tldEltcGwpCi0KLXByaXZhdGUgYm9vbGVhbiBmaW5kU3VpdGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIGludCBnZXRJbnN0YW5jZUNvdW50KCkKLQotcHJpdmF0ZSBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLk9wZW5TU0xTZXNzaW9uSW1wbCBnZXRPcGVuU1NMU2Vzc2lvbkltcGwoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgaW5pdCgpCi0KLXByaXZhdGUgbmF0aXZlIGphdmEubGFuZy5TdHJpbmcgbmF0aXZlY2lwaGVyYXV0aGVudGljYXRpb25tZXRob2QoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZWNsb3NlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBuYXRpdmVjb25uZWN0KAotaW50Ci1qYXZhLm5ldC5Tb2NrZXQKLWJvb2xlYW4KLWludCkKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVmcmVlKCkKLQotcHJpdmF0ZSBuYXRpdmUgamF2YS5sYW5nLlN0cmluZ1tdIG5hdGl2ZWdldGVuYWJsZWRjaXBoZXJzdWl0ZXMoKQotCi1wcml2YXRlIG5hdGl2ZSBpbnQgbmF0aXZlZ2V0c3Nsc2Vzc2lvbigKLWludCkKLQotc3RhdGljIG5hdGl2ZSBqYXZhLmxhbmcuU3RyaW5nW10gbmF0aXZlZ2V0c3VwcG9ydGVkY2lwaGVyc3VpdGVzKCkKLQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVpbml0KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotYnl0ZVtdKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVpbml0c3RhdGljKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVpbnRlcnJ1cHQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIG5hdGl2ZSBpbnQgbmF0aXZlcmVhZCgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBuYXRpdmUgaW50IG5hdGl2ZXJlYWQoCi1ieXRlW10KLWludAotaW50Ci1pbnQpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlc2V0ZW5hYmxlZGNpcGhlcnN1aXRlcygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlc2V0ZW5hYmxlZHByb3RvY29scygKLWxvbmcpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZldmVyaWZ5c2lnbmF0dXJlKAotYnl0ZVtdCi1ieXRlW10KLWphdmEubGFuZy5TdHJpbmcKLWJ5dGVbXQotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZXdyaXRlKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZXdyaXRlKAotYnl0ZVtdCi1pbnQKLWludCkKLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCB1cGRhdGVJbnN0YW5jZUNvdW50KAotaW50KQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gdmVyaWZ5U2lnbmF0dXJlKAotYnl0ZVtdCi1ieXRlW10KLWphdmEubGFuZy5TdHJpbmcKLWphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcy5SU0FQdWJsaWNLZXkpCi0KLXByaXZhdGUgaW50IHZlcmlmeV9jYWxsYmFjaygKLWJ5dGVbXVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBhY2NlcHQoCi1pbnQKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIGFkZEhhbmRzaGFrZUNvbXBsZXRlZExpc3RlbmVyKAotamF2YXgubmV0LnNzbC5IYW5kc2hha2VDb21wbGV0ZWRMaXN0ZW5lcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY2xvc2UoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpCi0KLXB1YmxpYyBib29sZWFuIGdldEVuYWJsZVNlc3Npb25DcmVhdGlvbigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0RW5hYmxlZENpcGhlclN1aXRlcygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0RW5hYmxlZFByb3RvY29scygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmlvLklucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkKLQotcHVibGljIGJvb2xlYW4gZ2V0TmVlZENsaWVudEF1dGgoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5pby5PdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkKLQotcHVibGljIGphdmF4Lm5ldC5zc2wuU1NMU2Vzc2lvbiBnZXRTZXNzaW9uKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBnZXRTdXBwb3J0ZWRDaXBoZXJTdWl0ZXMoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIGdldFN1cHBvcnRlZFByb3RvY29scygpCi0KLXB1YmxpYyBib29sZWFuIGdldFVzZUNsaWVudE1vZGUoKQotCi1wdWJsaWMgYm9vbGVhbiBnZXRXYW50Q2xpZW50QXV0aCgpCi0KLXN5bmNocm9uaXplZCBuYXRpdmUgdm9pZCBuYXRpdmVhY2NlcHQoCi1qYXZhLm5ldC5Tb2NrZXQKLWludAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgcmVtb3ZlSGFuZHNoYWtlQ29tcGxldGVkTGlzdGVuZXIoCi1qYXZheC5uZXQuc3NsLkhhbmRzaGFrZUNvbXBsZXRlZExpc3RlbmVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZW5kVXJnZW50RGF0YSgKLWludCkKLQotcHVibGljIHZvaWQgc2V0RW5hYmxlU2Vzc2lvbkNyZWF0aW9uKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0RW5hYmxlZENpcGhlclN1aXRlcygKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotcHVibGljIHZvaWQgc2V0RW5hYmxlZFByb3RvY29scygKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotcHVibGljIHZvaWQgc2V0TmVlZENsaWVudEF1dGgoCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldE9PQklubGluZSgKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1NvY2tldEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0U29UaW1lb3V0KAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRVc2VDbGllbnRNb2RlKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0V2FudENsaWVudEF1dGgoCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzaHV0ZG93bklucHV0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2h1dGRvd25PdXRwdXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzdGFydEhhbmRzaGFrZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5PcGVuU1NMU29ja2V0SW1wbFdyYXBwZXIgZXh0ZW5kcyBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLk9wZW5TU0xTb2NrZXRJbXBsCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS5uZXQuU29ja2V0IHNvY2tldAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLWphdmEubmV0LlNvY2tldAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1ib29sZWFuCi1vcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLlNTTFBhcmFtZXRlcnMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGJpbmQoCi1qYXZhLm5ldC5Tb2NrZXRBZGRyZXNzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjb25uZWN0KAotamF2YS5uZXQuU29ja2V0QWRkcmVzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY29ubmVjdCgKLWphdmEubmV0LlNvY2tldEFkZHJlc3MKLWludCkKLQotcHVibGljIGphdmEubmV0LkluZXRBZGRyZXNzIGdldEluZXRBZGRyZXNzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvU29ja2V0RXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBnZXRLZWVwQWxpdmUoKQotCi1wdWJsaWMgamF2YS5uZXQuSW5ldEFkZHJlc3MgZ2V0TG9jYWxBZGRyZXNzKCkKLQotcHVibGljIGludCBnZXRMb2NhbFBvcnQoKQotCi1wdWJsaWMgamF2YS5uZXQuU29ja2V0QWRkcmVzcyBnZXRMb2NhbFNvY2tldEFkZHJlc3MoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIGdldE9PQklubGluZSgpCi0KLXB1YmxpYyBpbnQgZ2V0UG9ydCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1NvY2tldEV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXRSZWNlaXZlQnVmZmVyU2l6ZSgpCi0KLXB1YmxpYyBqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzIGdldFJlbW90ZVNvY2tldEFkZHJlc3MoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIGdldFJldXNlQWRkcmVzcygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1NvY2tldEV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXRTZW5kQnVmZmVyU2l6ZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1NvY2tldEV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXRTb0xpbmdlcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1NvY2tldEV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXRTb1RpbWVvdXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIGdldFRjcE5vRGVsYXkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgZ2V0VHJhZmZpY0NsYXNzKCkKLQotcHVibGljIGJvb2xlYW4gaXNCb3VuZCgpCi0KLXB1YmxpYyBib29sZWFuIGlzQ2xvc2VkKCkKLQotcHVibGljIGJvb2xlYW4gaXNDb25uZWN0ZWQoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0lucHV0U2h1dGRvd24oKQotCi1wdWJsaWMgYm9vbGVhbiBpc091dHB1dFNodXRkb3duKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9uZXQvU29ja2V0RXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRLZWVwQWxpdmUoCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldFJlY2VpdmVCdWZmZXJTaXplKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldFJldXNlQWRkcmVzcygKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1NvY2tldEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0U2VuZEJ1ZmZlclNpemUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1NvY2tldEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0U29MaW5nZXIoCi1ib29sZWFuCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbmV0L1NvY2tldEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0U29UaW1lb3V0KAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldFRjcE5vRGVsYXkoCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL25ldC9Tb2NrZXRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldFRyYWZmaWNDbGFzcygKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuUFJGIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLkxvZ2dlciRTdHJlYW0gbG9nZ2VyCi0KLXByb3RlY3RlZCBzdGF0aWMgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0IG1kNQotCi1wcml2YXRlIHN0YXRpYyBqYXZheC5jcnlwdG8uTWFjIG1kNV9tYWMKLQotcHJpdmF0ZSBzdGF0aWMgaW50IG1kNV9tYWNfbGVuZ3RoCi0KLXByb3RlY3RlZCBzdGF0aWMgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0IHNoYQotCi1wcml2YXRlIHN0YXRpYyBqYXZheC5jcnlwdG8uTWFjIHNoYV9tYWMKLQotcHJpdmF0ZSBzdGF0aWMgaW50IHNoYV9tYWNfbGVuZ3RoCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0dlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbjsgKQotc3RhdGljIHZvaWQgY29tcHV0ZVBSRigKLWJ5dGVbXQotYnl0ZVtdCi1ieXRlW10KLWJ5dGVbXSkKLQotc3RhdGljIHZvaWQgY29tcHV0ZVBSRl9TU0x2MygKLWJ5dGVbXQotYnl0ZVtdCi1ieXRlW10pCi0KLXByaXZhdGUgc3RhdGljIHZvaWQgaW5pdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5Qcm90b2NvbFZlcnNpb24gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5Qcm90b2NvbFZlcnNpb24gU1NMdjMKLQotcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLlByb3RvY29sVmVyc2lvbiBUTFN2MQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuSGFzaHRhYmxlIHByb3RvY29sc0J5TmFtZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmdbXSBzdXBwb3J0ZWRQcm90b2NvbHMKLQotcHVibGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgbmFtZQotCi1wdWJsaWMgZmluYWwgYnl0ZVtdIHZlcnNpb24KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1ieXRlW10pCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5Qcm90b2NvbFZlcnNpb24gZ2V0QnlOYW1lKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLlByb3RvY29sVmVyc2lvbiBnZXRCeVZlcnNpb24oCi1ieXRlW10pCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5Qcm90b2NvbFZlcnNpb24gZ2V0TGF0ZXN0VmVyc2lvbigKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzU3VwcG9ydGVkKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzU3VwcG9ydGVkKAotYnl0ZVtdKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuU1NMQnVmZmVyZWRJbnB1dCBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuU1NMSW5wdXRTdHJlYW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBpbnQgYnl0aWsKLQotcHJpdmF0ZSBpbnQgY29uc3VtZWQKLQotcHJpdmF0ZSBqYXZhLm5pby5CeXRlQnVmZmVyIGluCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCBhdmFpbGFibGUoKQotCi1wcm90ZWN0ZWQgaW50IGNvbnN1bWVkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCByZWFkKCkKLQotcHJvdGVjdGVkIHZvaWQgc2V0U291cmNlQnVmZmVyKAotamF2YS5uaW8uQnl0ZUJ1ZmZlcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLlNTTENvbnRleHRJbXBsIGV4dGVuZHMgamF2YXgubmV0LnNzbC5TU0xDb250ZXh0U3BpCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5TU0xTZXNzaW9uQ29udGV4dEltcGwgY2xpZW50U2Vzc2lvbkNvbnRleHQKLQotcHJpdmF0ZSBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLlNTTFNlc3Npb25Db250ZXh0SW1wbCBzZXJ2ZXJTZXNzaW9uQ29udGV4dAotCi1wcm90ZWN0ZWQgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5TU0xQYXJhbWV0ZXJzIHNzbFBhcmFtZXRlcnMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgamF2YXgubmV0LnNzbC5TU0xFbmdpbmUgZW5naW5lQ3JlYXRlU1NMRW5naW5lKCkKLQotcHVibGljIGphdmF4Lm5ldC5zc2wuU1NMRW5naW5lIGVuZ2luZUNyZWF0ZVNTTEVuZ2luZSgKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIGphdmF4Lm5ldC5zc2wuU1NMU2Vzc2lvbkNvbnRleHQgZW5naW5lR2V0Q2xpZW50U2Vzc2lvbkNvbnRleHQoKQotCi1wdWJsaWMgamF2YXgubmV0LnNzbC5TU0xTZXNzaW9uQ29udGV4dCBlbmdpbmVHZXRTZXJ2ZXJTZXNzaW9uQ29udGV4dCgpCi0KLXB1YmxpYyBqYXZheC5uZXQuc3NsLlNTTFNlcnZlclNvY2tldEZhY3RvcnkgZW5naW5lR2V0U2VydmVyU29ja2V0RmFjdG9yeSgpCi0KLXB1YmxpYyBqYXZheC5uZXQuc3NsLlNTTFNvY2tldEZhY3RvcnkgZW5naW5lR2V0U29ja2V0RmFjdG9yeSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvS2V5TWFuYWdlbWVudEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgZW5naW5lSW5pdCgKLWphdmF4Lm5ldC5zc2wuS2V5TWFuYWdlcltdCi1qYXZheC5uZXQuc3NsLlRydXN0TWFuYWdlcltdCi1qYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLlNTTEVuZ2luZUFwcERhdGEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5BcHBlbmRhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBieXRlW10gYnVmZmVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgYXBwZW5kKAotYnl0ZVtdKQotCi1wcm90ZWN0ZWQgaW50IHBsYWNlVG8oCi1qYXZhLm5pby5CeXRlQnVmZmVyW10KLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuU1NMRW5naW5lRGF0YVN0cmVhbSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLkRhdGFTdHJlYW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBpbnQgYXZhaWxhYmxlCi0KLXByaXZhdGUgaW50IGNvbnN1bWVkCi0KLXByaXZhdGUgaW50IGxpbWl0Ci0KLXByaXZhdGUgaW50IG9mZnNldAotCi1wcml2YXRlIGphdmEubmlvLkJ5dGVCdWZmZXJbXSBzcmNzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGludCBhdmFpbGFibGUoKQotCi1wcm90ZWN0ZWQgaW50IGNvbnN1bWVkKCkKLQotcHVibGljIGJ5dGVbXSBnZXREYXRhKAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBoYXNEYXRhKCkKLQotcHJvdGVjdGVkIHZvaWQgc2V0U291cmNlQnVmZmVycygKLWphdmEubmlvLkJ5dGVCdWZmZXJbXQotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5TU0xFbmdpbmVJbXBsIGV4dGVuZHMgamF2YXgubmV0LnNzbC5TU0xFbmdpbmUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLkFsZXJ0UHJvdG9jb2wgYWxlcnRQcm90b2NvbAotCi1wcml2YXRlIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuU1NMRW5naW5lQXBwRGF0YSBhcHBEYXRhCi0KLXByaXZhdGUgYm9vbGVhbiBjbG9zZV9ub3RpZnlfd2FzX3JlY2VpdmVkCi0KLXByaXZhdGUgYm9vbGVhbiBjbG9zZV9ub3RpZnlfd2FzX3NlbnQKLQotcHJpdmF0ZSBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLlNTTEVuZ2luZURhdGFTdHJlYW0gZGF0YVN0cmVhbQotCi1wcml2YXRlIGJvb2xlYW4gZW5naW5lX3dhc19jbG9zZWQKLQotcHJpdmF0ZSBib29sZWFuIGVuZ2luZV93YXNfc2h1dHRlZGRvd24KLQotcHJpdmF0ZSBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLkhhbmRzaGFrZVByb3RvY29sIGhhbmRzaGFrZVByb3RvY29sCi0KLXByaXZhdGUgYm9vbGVhbiBoYW5kc2hha2Vfc3RhcnRlZAotCi1wcml2YXRlIGJvb2xlYW4gaXNJbmJvdW5kRG9uZQotCi1wcml2YXRlIGJvb2xlYW4gaXNPdXRib3VuZERvbmUKLQotcHJpdmF0ZSBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLkxvZ2dlciRTdHJlYW0gbG9nZ2VyCi0KLXByaXZhdGUgYm9vbGVhbiBwZWVyX21vZGVfd2FzX3NldAotCi1wcml2YXRlIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuU1NMQnVmZmVyZWRJbnB1dCByZWNQcm90SVMKLQotcHJvdGVjdGVkIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuU1NMUmVjb3JkUHJvdG9jb2wgcmVjb3JkUHJvdG9jb2wKLQotcHJpdmF0ZSBieXRlW10gcmVtYWluaW5nX2hzaF9kYXRhCi0KLXByaXZhdGUgYnl0ZVtdIHJlbWFpbmluZ193cmFwcGVkX2RhdGEKLQotcHJpdmF0ZSBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLlNTTFNlc3Npb25JbXBsIHNlc3Npb24KLQotcHJvdGVjdGVkIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuU1NMUGFyYW1ldGVycyBzc2xQYXJhbWV0ZXJzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1vcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLlNTTFBhcmFtZXRlcnMpCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuU1NMUGFyYW1ldGVycykKLQotcHJpdmF0ZSBqYXZheC5uZXQuc3NsLlNTTEVuZ2luZVJlc3VsdCRTdGF0dXMgZ2V0RW5naW5lU3RhdHVzKCkKLQotcHJpdmF0ZSB2b2lkIHNodXRkb3duKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YXgvbmV0L3NzbC9TU0xFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGJlZ2luSGFuZHNoYWtlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YXgvbmV0L3NzbC9TU0xFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNsb3NlSW5ib3VuZCgpCi0KLXB1YmxpYyB2b2lkIGNsb3NlT3V0Ym91bmQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlJ1bm5hYmxlIGdldERlbGVnYXRlZFRhc2soKQotCi1wdWJsaWMgYm9vbGVhbiBnZXRFbmFibGVTZXNzaW9uQ3JlYXRpb24oKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIGdldEVuYWJsZWRDaXBoZXJTdWl0ZXMoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIGdldEVuYWJsZWRQcm90b2NvbHMoKQotCi1wdWJsaWMgamF2YXgubmV0LnNzbC5TU0xFbmdpbmVSZXN1bHQkSGFuZHNoYWtlU3RhdHVzIGdldEhhbmRzaGFrZVN0YXR1cygpCi0KLXB1YmxpYyBib29sZWFuIGdldE5lZWRDbGllbnRBdXRoKCkKLQotcHVibGljIGphdmF4Lm5ldC5zc2wuU1NMU2Vzc2lvbiBnZXRTZXNzaW9uKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBnZXRTdXBwb3J0ZWRDaXBoZXJTdWl0ZXMoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIGdldFN1cHBvcnRlZFByb3RvY29scygpCi0KLXB1YmxpYyBib29sZWFuIGdldFVzZUNsaWVudE1vZGUoKQotCi1wdWJsaWMgYm9vbGVhbiBnZXRXYW50Q2xpZW50QXV0aCgpCi0KLXB1YmxpYyBib29sZWFuIGlzSW5ib3VuZERvbmUoKQotCi1wdWJsaWMgYm9vbGVhbiBpc091dGJvdW5kRG9uZSgpCi0KLXB1YmxpYyB2b2lkIHNldEVuYWJsZVNlc3Npb25DcmVhdGlvbigKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldEVuYWJsZWRDaXBoZXJTdWl0ZXMoCi1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLXB1YmxpYyB2b2lkIHNldEVuYWJsZWRQcm90b2NvbHMoCi1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLXB1YmxpYyB2b2lkIHNldE5lZWRDbGllbnRBdXRoKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0VXNlQ2xpZW50TW9kZSgKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldFdhbnRDbGllbnRBdXRoKAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YXgvbmV0L3NzbC9TU0xFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZheC5uZXQuc3NsLlNTTEVuZ2luZVJlc3VsdCB1bndyYXAoCi1qYXZhLm5pby5CeXRlQnVmZmVyCi1qYXZhLm5pby5CeXRlQnVmZmVyW10KLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZheC9uZXQvc3NsL1NTTEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmF4Lm5ldC5zc2wuU1NMRW5naW5lUmVzdWx0IHdyYXAoCi1qYXZhLm5pby5CeXRlQnVmZmVyW10KLWludAotaW50Ci1qYXZhLm5pby5CeXRlQnVmZmVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuU1NMUGFyYW1ldGVycyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgamF2YXgubmV0LnNzbC5YNTA5S2V5TWFuYWdlciBkZWZhdWx0S2V5TWFuYWdlcgotCi1wcml2YXRlIHN0YXRpYyBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLlNTTFBhcmFtZXRlcnMgZGVmYXVsdFBhcmFtZXRlcnMKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20gZGVmYXVsdFNlY3VyZVJhbmRvbQotCi1wcml2YXRlIHN0YXRpYyBqYXZheC5uZXQuc3NsLlg1MDlUcnVzdE1hbmFnZXIgZGVmYXVsdFRydXN0TWFuYWdlcgotCi1wcml2YXRlIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuU1NMU2Vzc2lvbkNvbnRleHRJbXBsIGNsaWVudFNlc3Npb25Db250ZXh0Ci0KLXByaXZhdGUgYm9vbGVhbiBjbGllbnRfbW9kZQotCi1wcml2YXRlIGJvb2xlYW4gZW5hYmxlX3Nlc3Npb25fY3JlYXRpb24KLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nW10gZW5hYmxlZENpcGhlclN1aXRlTmFtZXMKLQotcHJpdmF0ZSBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLkNpcGhlclN1aXRlW10gZW5hYmxlZENpcGhlclN1aXRlcwotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmdbXSBlbmFibGVkUHJvdG9jb2xzCi0KLXByaXZhdGUgamF2YXgubmV0LnNzbC5YNTA5S2V5TWFuYWdlciBrZXlNYW5hZ2VyCi0KLXByaXZhdGUgYm9vbGVhbiBuZWVkX2NsaWVudF9hdXRoCi0KLXByaXZhdGUgamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20gc2VjdXJlUmFuZG9tCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5TU0xTZXNzaW9uQ29udGV4dEltcGwgc2VydmVyU2Vzc2lvbkNvbnRleHQKLQotcHJpdmF0ZSBpbnQgc3NsX2N0eAotCi1wcml2YXRlIGphdmF4Lm5ldC5zc2wuWDUwOVRydXN0TWFuYWdlciB0cnVzdE1hbmFnZXIKLQotcHJpdmF0ZSBib29sZWFuIHdhbnRfY2xpZW50X2F1dGgKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9LZXlNYW5hZ2VtZW50RXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oCi1qYXZheC5uZXQuc3NsLktleU1hbmFnZXJbXQotamF2YXgubmV0LnNzbC5UcnVzdE1hbmFnZXJbXQotamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20KLW9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuU1NMU2Vzc2lvbkNvbnRleHRJbXBsCi1vcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLlNTTFNlc3Npb25Db250ZXh0SW1wbCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9LZXlNYW5hZ2VtZW50RXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgc3RhdGljIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuU1NMUGFyYW1ldGVycyBnZXREZWZhdWx0KCkKLQotcHJpdmF0ZSBuYXRpdmUgaW50IG5hdGl2ZWluaXRzc2xjdHgoKQotCi1wcm90ZWN0ZWQgamF2YS5sYW5nLk9iamVjdCBjbG9uZSgpCi0KLXByb3RlY3RlZCBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLlNTTFNlc3Npb25Db250ZXh0SW1wbCBnZXRDbGllbnRTZXNzaW9uQ29udGV4dCgpCi0KLXByb3RlY3RlZCBib29sZWFuIGdldEVuYWJsZVNlc3Npb25DcmVhdGlvbigpCi0KLXByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0RW5hYmxlZENpcGhlclN1aXRlcygpCi0KLXByb3RlY3RlZCBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLkNpcGhlclN1aXRlW10gZ2V0RW5hYmxlZENpcGhlclN1aXRlc01lbWJlcigpCi0KLXByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0RW5hYmxlZFByb3RvY29scygpCi0KLXByb3RlY3RlZCBqYXZheC5uZXQuc3NsLlg1MDlLZXlNYW5hZ2VyIGdldEtleU1hbmFnZXIoKQotCi1wcm90ZWN0ZWQgYm9vbGVhbiBnZXROZWVkQ2xpZW50QXV0aCgpCi0KLXByb3RlY3RlZCBpbnQgZ2V0U1NMQ1RYKCkKLQotcHJvdGVjdGVkIGphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tIGdldFNlY3VyZVJhbmRvbSgpCi0KLXByb3RlY3RlZCBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSBnZXRTZWN1cmVSYW5kb21NZW1iZXIoKQotCi1wcm90ZWN0ZWQgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5TU0xTZXNzaW9uQ29udGV4dEltcGwgZ2V0U2VydmVyU2Vzc2lvbkNvbnRleHQoKQotCi1wcm90ZWN0ZWQgamF2YXgubmV0LnNzbC5YNTA5VHJ1c3RNYW5hZ2VyIGdldFRydXN0TWFuYWdlcigpCi0KLXByb3RlY3RlZCBib29sZWFuIGdldFVzZUNsaWVudE1vZGUoKQotCi1wcm90ZWN0ZWQgYm9vbGVhbiBnZXRXYW50Q2xpZW50QXV0aCgpCi0KLXByb3RlY3RlZCB2b2lkIHNldEVuYWJsZVNlc3Npb25DcmVhdGlvbigKLWJvb2xlYW4pCi0KLXByb3RlY3RlZCB2b2lkIHNldEVuYWJsZWRDaXBoZXJTdWl0ZXMoCi1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLXByb3RlY3RlZCB2b2lkIHNldEVuYWJsZWRQcm90b2NvbHMoCi1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLXByb3RlY3RlZCB2b2lkIHNldE5lZWRDbGllbnRBdXRoKAotYm9vbGVhbikKLQotcHJvdGVjdGVkIHZvaWQgc2V0VXNlQ2xpZW50TW9kZSgKLWJvb2xlYW4pCi0KLXByb3RlY3RlZCB2b2lkIHNldFdhbnRDbGllbnRBdXRoKAotYm9vbGVhbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLlNTTFJlY29yZFByb3RvY29sIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgc3RhdGljIGludCBNQVhfQ0lQSEVSRURfREFUQV9MRU5HVEgKLQotcHJvdGVjdGVkIHN0YXRpYyBpbnQgTUFYX0NPTVBSRVNTRURfREFUQV9MRU5HVEgKLQotcHJvdGVjdGVkIHN0YXRpYyBpbnQgTUFYX0RBVEFfTEVOR1RICi0KLXByb3RlY3RlZCBzdGF0aWMgaW50IE1BWF9TU0xfUEFDS0VUX1NJWkUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIGNoYW5nZV9jaXBoZXJfc3BlY19ieXRlCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5Db25uZWN0aW9uU3RhdGUgYWN0aXZlUmVhZFN0YXRlCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5Db25uZWN0aW9uU3RhdGUgYWN0aXZlV3JpdGVTdGF0ZQotCi1wcml2YXRlIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuQWxlcnRQcm90b2NvbCBhbGVydFByb3RvY29sCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5BcHBlbmRhYmxlIGFwcERhdGEKLQotcHJpdmF0ZSBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLkhhbmRzaGFrZVByb3RvY29sIGhhbmRzaGFrZVByb3RvY29sCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5TU0xJbnB1dFN0cmVhbSBpbgotCi1wcml2YXRlIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuTG9nZ2VyJFN0cmVhbSBsb2dnZXIKLQotcHJpdmF0ZSBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLkNvbm5lY3Rpb25TdGF0ZSBwZW5kaW5nQ29ubmVjdGlvblN0YXRlCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5TU0xTZXNzaW9uSW1wbCBzZXNzaW9uCi0KLXByaXZhdGUgYm9vbGVhbiBzZXNzaW9uV2FzQ2hhbmdlZAotCi1wcml2YXRlIGJ5dGVbXSB2ZXJzaW9uCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLkhhbmRzaGFrZVByb3RvY29sCi1vcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLkFsZXJ0UHJvdG9jb2wKLW9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuU1NMSW5wdXRTdHJlYW0KLW9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuQXBwZW5kYWJsZSkKLQotcHJpdmF0ZSBieXRlW10gcGFja2V0aXplKAotYnl0ZQotYnl0ZVtdCi1ieXRlW10pCi0KLXByaXZhdGUgdm9pZCBzZXRTZXNzaW9uKAotb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5TU0xTZXNzaW9uSW1wbCkKLQotcHJvdGVjdGVkIHZvaWQgYWxlcnQoCi1ieXRlCi1ieXRlKQotCi1wcm90ZWN0ZWQgYnl0ZVtdIGdldENoYW5nZUNpcGhlclNwZWNNZXNhZ2UoCi1vcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLlNTTFNlc3Npb25JbXBsKQotCi1wcm90ZWN0ZWQgaW50IGdldERhdGFTaXplKAotaW50KQotCi1wcm90ZWN0ZWQgaW50IGdldE1pblJlY29yZFNpemUoKQotCi1wcm90ZWN0ZWQgaW50IGdldFJlY29yZFNpemUoCi1pbnQpCi0KLXByb3RlY3RlZCBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLlNTTFNlc3Npb25JbXBsIGdldFNlc3Npb24oKQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRWZXJzaW9uKAotYnl0ZVtdKQotCi1wcm90ZWN0ZWQgdm9pZCBzaHV0ZG93bigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCBpbnQgdW53cmFwKCkKLQotcHJvdGVjdGVkIGJ5dGVbXSB3cmFwKAotYnl0ZQotb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5EYXRhU3RyZWFtKQotCi1wcm90ZWN0ZWQgYnl0ZVtdIHdyYXAoCi1ieXRlCi1ieXRlW10KLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0xpbmtlZEhhc2hNYXA8W0JMamF2YXgvbmV0L3NzbC9TU0xTZXNzaW9uOz47ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYXBhY2hlL2hhcm1vbnkveG5ldC9wcm92aWRlci9qc3NlL1NTTFNlc3Npb25Db250ZXh0SW1wbDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuU1NMU2Vzc2lvbkNvbnRleHRJbXBsJDEgZXh0ZW5kcyBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLlNTTFNlc3Npb25Db250ZXh0SW1wbCB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLlNTTFNlc3Npb25Db250ZXh0SW1wbAotaW50Ci1mbG9hdAotYm9vbGVhbikKLQotcHVibGljIGJvb2xlYW4gcmVtb3ZlRWxkZXN0RW50cnkoCi1qYXZhLnV0aWwuTWFwJEVudHJ5KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS91dGlsL0VudW1lcmF0aW9uPFtCPjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuU1NMU2Vzc2lvbkNvbnRleHRJbXBsJDIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS51dGlsLkVudW1lcmF0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvdXRpbC9JdGVyYXRvcjxbQj47ICkKLSBqYXZhLnV0aWwuSXRlcmF0b3IgaXRlcmF0b3IKLQotZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5TU0xTZXNzaW9uQ29udGV4dEltcGwgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5TU0xTZXNzaW9uQ29udGV4dEltcGwpCi0KLXB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IG5leHRFbGVtZW50KCkKLQotcHVibGljIGJ5dGVbXSBuZXh0RWxlbWVudCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5TU0xTZXNzaW9uQ29udGV4dEltcGwgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YXgubmV0LnNzbC5TU0xTZXNzaW9uQ29udGV4dAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGludCBjYWNoZVNpemUKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0xpbmtlZEhhc2hNYXA8W0JMamF2YXgvbmV0L3NzbC9TU0xTZXNzaW9uOz47ICkKLXByaXZhdGUgdm9sYXRpbGUgamF2YS51dGlsLkxpbmtlZEhhc2hNYXAgY2xvbmUKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS91dGlsL0xpbmtlZEhhc2hNYXA8W0JMamF2YXgvbmV0L3NzbC9TU0xTZXNzaW9uOz47ICkKLXByaXZhdGUgZmluYWwgamF2YS51dGlsLkxpbmtlZEhhc2hNYXAgc2Vzc2lvbnMKLQotcHJpdmF0ZSBsb25nIHRpbWVvdXQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1zdGF0aWMgaW50IGFjY2VzcyQwMDAoCi1vcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLlNTTFNlc3Npb25Db250ZXh0SW1wbCkKLQotc3RhdGljIGphdmEudXRpbC5MaW5rZWRIYXNoTWFwIGFjY2VzcyQxMDAoCi1vcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLlNTTFNlc3Npb25Db250ZXh0SW1wbCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID0oKUxqYXZhL3V0aWwvRW51bWVyYXRpb248W0I+OyApCi1wdWJsaWMgamF2YS51dGlsLkVudW1lcmF0aW9uIGdldElkcygpCi0KLXB1YmxpYyBqYXZheC5uZXQuc3NsLlNTTFNlc3Npb24gZ2V0U2Vzc2lvbigKLWJ5dGVbXSkKLQotcHVibGljIGludCBnZXRTZXNzaW9uQ2FjaGVTaXplKCkKLQotcHVibGljIGludCBnZXRTZXNzaW9uVGltZW91dCgpCi0KLSB2b2lkIHB1dFNlc3Npb24oCi1qYXZheC5uZXQuc3NsLlNTTFNlc3Npb24pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldFNlc3Npb25DYWNoZVNpemUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldFNlc3Npb25UaW1lb3V0KAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuU1NMU2Vzc2lvbkltcGwgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YXgubmV0LnNzbC5TU0xTZXNzaW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5TU0xTZXNzaW9uSW1wbCBOVUxMX1NFU1NJT04KLQotIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuQ2lwaGVyU3VpdGUgY2lwaGVyU3VpdGUKLQotIGJ5dGVbXSBjbGllbnRSYW5kb20KLQotIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuU1NMU2Vzc2lvbkNvbnRleHRJbXBsIGNvbnRleHQKLQotcHJpdmF0ZSBsb25nIGNyZWF0aW9uVGltZQotCi0gYnl0ZVtdIGlkCi0KLSBib29sZWFuIGlzU2VydmVyCi0KLXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkCi0KLSBsb25nIGxhc3RBY2Nlc3NlZFRpbWUKLQotIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGVbXSBsb2NhbENlcnRpZmljYXRlcwotCi0gYnl0ZVtdIG1hc3Rlcl9zZWNyZXQKLQotIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGVbXSBwZWVyQ2VydGlmaWNhdGVzCi0KLSBqYXZhLmxhbmcuU3RyaW5nIHBlZXJIb3N0Ci0KLSBpbnQgcGVlclBvcnQKLQotIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sCi0KLSBieXRlW10gc2VydmVyUmFuZG9tCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5Ud29LZXlIYXNoTWFwIHZhbHVlcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLkNpcGhlclN1aXRlCi1qYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgY2xvbmUoKQotCi1wdWJsaWMgaW50IGdldEFwcGxpY2F0aW9uQnVmZmVyU2l6ZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldENpcGhlclN1aXRlKCkKLQotcHVibGljIGxvbmcgZ2V0Q3JlYXRpb25UaW1lKCkKLQotcHVibGljIGJ5dGVbXSBnZXRJZCgpCi0KLXB1YmxpYyBsb25nIGdldExhc3RBY2Nlc3NlZFRpbWUoKQotCi1wdWJsaWMgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlW10gZ2V0TG9jYWxDZXJ0aWZpY2F0ZXMoKQotCi1wdWJsaWMgamF2YS5zZWN1cml0eS5QcmluY2lwYWwgZ2V0TG9jYWxQcmluY2lwYWwoKQotCi1wdWJsaWMgaW50IGdldFBhY2tldEJ1ZmZlclNpemUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZheC9uZXQvc3NsL1NTTFBlZXJVbnZlcmlmaWVkRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YXguc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGVbXSBnZXRQZWVyQ2VydGlmaWNhdGVDaGFpbigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmF4L25ldC9zc2wvU1NMUGVlclVudmVyaWZpZWRFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVbXSBnZXRQZWVyQ2VydGlmaWNhdGVzKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UGVlckhvc3QoKQotCi1wdWJsaWMgaW50IGdldFBlZXJQb3J0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YXgvbmV0L3NzbC9TU0xQZWVyVW52ZXJpZmllZEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsIGdldFBlZXJQcmluY2lwYWwoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRQcm90b2NvbCgpCi0KLXB1YmxpYyBqYXZheC5uZXQuc3NsLlNTTFNlc3Npb25Db250ZXh0IGdldFNlc3Npb25Db250ZXh0KCkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0VmFsdWUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIGdldFZhbHVlTmFtZXMoKQotCi1wdWJsaWMgdm9pZCBpbnZhbGlkYXRlKCkKLQotcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpCi0KLXB1YmxpYyB2b2lkIHB1dFZhbHVlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHZvaWQgcmVtb3ZlVmFsdWUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi0gdm9pZCBzZXRQZWVyKAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuU1NMU3RyZWFtZWRJbnB1dCBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuU1NMSW5wdXRTdHJlYW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLmlvLklucHV0U3RyZWFtIGluCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5JbnB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCBhdmFpbGFibGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuU1NMdjNDb25zdGFudHMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBmaW5hbCBieXRlW10gTUQ1cGFkMQotCi1zdGF0aWMgZmluYWwgYnl0ZVtdIE1ENXBhZDIKLQotc3RhdGljIGZpbmFsIGJ5dGVbXSBTSEFwYWQxCi0KLXN0YXRpYyBmaW5hbCBieXRlW10gU0hBcGFkMgotCi1zdGF0aWMgZmluYWwgYnl0ZVtdIGNsaWVudAotCi1zdGF0aWMgZmluYWwgYnl0ZVtdIHNlcnZlcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi0gY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5TZXJ2ZXJIYW5kc2hha2VJbXBsJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuU2VydmVySGFuZHNoYWtlSW1wbCB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLlNlcnZlckhhbmRzaGFrZUltcGwpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ01ldGhvZCAodmFsdWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuU2VydmVySGFuZHNoYWtlSW1wbCQyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLlNlcnZlckhhbmRzaGFrZUltcGwgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5TZXJ2ZXJIYW5kc2hha2VJbXBsKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBydW4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuU2VydmVySGFuZHNoYWtlSW1wbCBleHRlbmRzIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuSGFuZHNoYWtlUHJvdG9jb2wKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLnNlY3VyaXR5LlByaXZhdGVLZXkgcHJpdktleQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5PYmplY3QpCi0KLXByaXZhdGUgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5TU0xTZXNzaW9uSW1wbCBmaW5kU2Vzc2lvblRvUmVzdW1lKAotYnl0ZVtdKQotCi1wcml2YXRlIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuQ2lwaGVyU3VpdGUgc2VsZWN0U3VpdGUoCi1vcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLkNpcGhlclN1aXRlW10pCi0KLXByb3RlY3RlZCB2b2lkIG1ha2VGaW5pc2hlZCgpCi0KLSB2b2lkIHByb2Nlc3NDbGllbnRIZWxsbygpCi0KLXB1YmxpYyB2b2lkIHJlY2VpdmVDaGFuZ2VDaXBoZXJTcGVjKCkKLQotcHVibGljIHZvaWQgc3RhcnQoKQotCi1wdWJsaWMgdm9pZCB1bndyYXAoCi1ieXRlW10pCi0KLXB1YmxpYyB2b2lkIHVud3JhcFNTTHYyKAotYnl0ZVtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuU2VydmVySGVsbG8gZXh0ZW5kcyBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLk1lc3NhZ2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuQ2lwaGVyU3VpdGUgY2lwaGVyX3N1aXRlCi0KLSBieXRlIGNvbXByZXNzaW9uX21ldGhvZAotCi0gYnl0ZVtdIHJhbmRvbQotCi0gYnl0ZVtdIHNlcnZlcl92ZXJzaW9uCi0KLSBieXRlW10gc2Vzc2lvbl9pZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tCi1ieXRlW10KLWJ5dGVbXQotb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5DaXBoZXJTdWl0ZQotYnl0ZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5IYW5kc2hha2VJT0RhdGFTdHJlYW0KLWludCkKLQotcHVibGljIGJ5dGVbXSBnZXRSYW5kb20oKQotCi1wdWJsaWMgaW50IGdldFR5cGUoKQotCi1wdWJsaWMgdm9pZCBzZW5kKAotb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5IYW5kc2hha2VJT0RhdGFTdHJlYW0pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5TZXJ2ZXJIZWxsb0RvbmUgZXh0ZW5kcyBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLk1lc3NhZ2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLkhhbmRzaGFrZUlPRGF0YVN0cmVhbQotaW50KQotCi1wdWJsaWMgaW50IGdldFR5cGUoKQotCi1wdWJsaWMgaW50IGxlbmd0aCgpCi0KLXB1YmxpYyB2b2lkIHNlbmQoCi1vcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLkhhbmRzaGFrZUlPRGF0YVN0cmVhbSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLlNlcnZlcktleUV4Y2hhbmdlIGV4dGVuZHMgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5NZXNzYWdlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGJ5dGVbXSBieXRlczEKLQotZmluYWwgYnl0ZVtdIGJ5dGVzMgotCi1maW5hbCBieXRlW10gYnl0ZXMzCi0KLWZpbmFsIGJ5dGVbXSBoYXNoCi0KLXByaXZhdGUgamF2YS5zZWN1cml0eS5pbnRlcmZhY2VzLlJTQVB1YmxpY0tleSBrZXkKLQotZmluYWwgamF2YS5tYXRoLkJpZ0ludGVnZXIgcGFyMQotCi1maW5hbCBqYXZhLm1hdGguQmlnSW50ZWdlciBwYXIyCi0KLWZpbmFsIGphdmEubWF0aC5CaWdJbnRlZ2VyIHBhcjMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLm1hdGguQmlnSW50ZWdlcgotamF2YS5tYXRoLkJpZ0ludGVnZXIKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuSGFuZHNoYWtlSU9EYXRhU3RyZWFtCi1pbnQKLWludCkKLQotcHVibGljIGphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcy5SU0FQdWJsaWNLZXkgZ2V0UlNBUHVibGljS2V5KCkKLQotcHVibGljIGludCBnZXRUeXBlKCkKLQotcHVibGljIHZvaWQgc2VuZCgKLW9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuSGFuZHNoYWtlSU9EYXRhU3RyZWFtKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9MCBuYW1lID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdNZXRob2QgKHZhbHVlID1udWxsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5TaWduYXR1cmUgKHZhbHVlID1MamF2YS9sYW5nL09iamVjdDtMamF2YS9zZWN1cml0eS9Qcml2aWxlZ2VkQWN0aW9uPExqYXZhL2xhbmcvU3RyaW5nOz47ICkKLSBjbGFzcyBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLlRydXN0TWFuYWdlckZhY3RvcnlJbXBsJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuVHJ1c3RNYW5hZ2VyRmFjdG9yeUltcGwgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5UcnVzdE1hbmFnZXJGYWN0b3J5SW1wbCkKLQotcHVibGljIHZvbGF0aWxlIGphdmEubGFuZy5PYmplY3QgcnVuKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgcnVuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uU2lnbmF0dXJlICh2YWx1ZSA9TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvc2VjdXJpdHkvUHJpdmlsZWdlZEFjdGlvbjxMamF2YS9sYW5nL1N0cmluZzs+OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nTWV0aG9kICh2YWx1ZSA9bnVsbCApCi0gY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5UcnVzdE1hbmFnZXJGYWN0b3J5SW1wbCQyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1maW5hbCBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLlRydXN0TWFuYWdlckZhY3RvcnlJbXBsIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLW9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuVHJ1c3RNYW5hZ2VyRmFjdG9yeUltcGwpCi0KLXB1YmxpYyB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0IHJ1bigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHJ1bigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5UcnVzdE1hbmFnZXJGYWN0b3J5SW1wbCBleHRlbmRzIGphdmF4Lm5ldC5zc2wuVHJ1c3RNYW5hZ2VyRmFjdG9yeVNwaQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEuc2VjdXJpdHkuS2V5U3RvcmUga2V5U3RvcmUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgamF2YXgubmV0LnNzbC5UcnVzdE1hbmFnZXJbXSBlbmdpbmVHZXRUcnVzdE1hbmFnZXJzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9LZXlTdG9yZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgZW5naW5lSW5pdCgKLWphdmEuc2VjdXJpdHkuS2V5U3RvcmUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgZW5naW5lSW5pdCgKLWphdmF4Lm5ldC5zc2wuTWFuYWdlckZhY3RvcnlQYXJhbWV0ZXJzKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5hcGFjaGUuaGFybW9ueS54bmV0LnByb3ZpZGVyLmpzc2UuVHJ1c3RNYW5hZ2VySW1wbCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZheC5uZXQuc3NsLlg1MDlUcnVzdE1hbmFnZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLmxhbmcuRXhjZXB0aW9uIGVycgotCi1wcml2YXRlIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUZhY3RvcnkgZmFjdG9yeQotCi1wcml2YXRlIGphdmEuc2VjdXJpdHkuY2VydC5QS0lYUGFyYW1ldGVycyBwYXJhbXMKLQotcHJpdmF0ZSBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGhWYWxpZGF0b3IgdmFsaWRhdG9yCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5zZWN1cml0eS5LZXlTdG9yZSkKLQotcHJpdmF0ZSBib29sZWFuIGlzRGlyZWN0bHlUcnVzdGVkQ2VydCgKLWphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjaGVja0NsaWVudFRydXN0ZWQoCi1qYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlW10KLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY2hlY2tTZXJ2ZXJUcnVzdGVkKAotamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZVtdCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZVtdIGdldEFjY2VwdGVkSXNzdWVycygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xQ2hvaWNlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvYXNuMS9BU04xQ29sbGVjdGlvbjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID00MTA0IG5hbWUgPW51bGwgKQotIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xQ29sbGVjdGlvbiQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPUFTTjFDb2xsZWN0aW9uRW51bWVyYXRpb24gKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvYXNuMS9BU04xQ29sbGVjdGlvbjsgKQotIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xQ29sbGVjdGlvbiRBU04xQ29sbGVjdGlvbkVudW1lcmF0aW9uIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudXRpbC5FbnVtZXJhdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGludCBhdAotCi1wcml2YXRlIGZpbmFsIGludCBvcmlnU2l6ZQotCi1maW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUNvbGxlY3Rpb24gdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xQ29sbGVjdGlvbikKLQotIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFDb2xsZWN0aW9uCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUNvbGxlY3Rpb24kMSkKLQotcHVibGljIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgbmV4dEVsZW1lbnQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSRW5jb2RhYmxlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IGdldERFUk9iamVjdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFFbmNvZGFibGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkVuY29kYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQkVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERVIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYnl0ZVtdIGdldERFUkVuY29kZWQoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCBnZXRERVJPYmplY3QoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYnl0ZVtdIGdldEVuY29kZWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYnl0ZVtdIGdldEVuY29kZWQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLQotcHVibGljIGFic3RyYWN0IG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgdG9BU04xT2JqZWN0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUlRhZ3MgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFQUExJQ0FUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJJVF9TVFJJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQk1QX1NUUklORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCT09MRUFOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlNUUlVDVEVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOVU1FUkFURUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhURVJOQUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0VORVJBTElaRURfVElNRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHRU5FUkFMX1NUUklORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHUkFQSElDX1NUUklORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJQTVfU1RSSU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVHRVIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTlVMTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBOVU1FUklDX1NUUklORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfSURFTlRJRklFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPQ1RFVF9TVFJJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJTlRBQkxFX1NUUklORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVFVRU5DRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVFVRU5DRV9PRgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VUX09GCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFQ2MV9TVFJJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHR0VECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOSVZFUlNBTF9TVFJJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVRDX1RJTUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVRGOF9TVFJJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklERU9URVhfU1RSSU5HCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU0lCTEVfU1RSSU5HCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFFbmNvZGFibGUgaW1wbGVtZW50cyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSVGFncwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLWFic3RyYWN0IHZvaWQgZW5jb2RlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk91dHB1dFN0cmVhbSkKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGFic3RyYWN0IGludCBoYXNoQ29kZSgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IHRvQVNOMU9iamVjdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9hc24xL0FTTjFDb2xsZWN0aW9uJDE7TG9yZy9ib3VuY3ljYXN0bGUvYXNuMS9BU04xQ29sbGVjdGlvbiRBU04xQ29sbGVjdGlvbkVudW1lcmF0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFDb2xsZWN0aW9uIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJFbmNvZGFibGUgb2JqMAotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJFbmNvZGFibGUgb2JqMQotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJFbmNvZGFibGUgb2JqMgotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJFbmNvZGFibGUgb2JqMwotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJFbmNvZGFibGVbXSByZXN0Ci0KLXByaXZhdGUgaW50IHNpemUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1zdGF0aWMgaW50IGFjY2VzcyQxMDAoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUNvbGxlY3Rpb24pCi0KLXN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSRW5jb2RhYmxlIGFjY2VzcyQyMDAoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUNvbGxlY3Rpb24pCi0KLXN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSRW5jb2RhYmxlIGFjY2VzcyQzMDAoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUNvbGxlY3Rpb24pCi0KLXN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSRW5jb2RhYmxlIGFjY2VzcyQ0MDAoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUNvbGxlY3Rpb24pCi0KLXN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSRW5jb2RhYmxlIGFjY2VzcyQ1MDAoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUNvbGxlY3Rpb24pCi0KLXN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSRW5jb2RhYmxlW10gYWNjZXNzJDYwMCgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xQ29sbGVjdGlvbikKLQotcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGdldEVuY29kZWQoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSRW5jb2RhYmxlKQotCi1wcml2YXRlIHN0YXRpYyBib29sZWFuIGxlc3NUaGFuT3JFcXVhbCgKLWJ5dGVbXQotYnl0ZVtdKQotCi1wcml2YXRlIHZvaWQgc2V0T2JqZWN0QXQoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSRW5jb2RhYmxlCi1pbnQpCi0KLXByb3RlY3RlZCB2b2lkIGFkZE9iamVjdCgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJFbmNvZGFibGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLWFic3RyYWN0IHZvaWQgZW5jb2RlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk91dHB1dFN0cmVhbSkKLQotcHVibGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJFbmNvZGFibGUgZ2V0T2JqZWN0QXQoCi1pbnQpCi0KLXB1YmxpYyBmaW5hbCBqYXZhLnV0aWwuRW51bWVyYXRpb24gZ2V0T2JqZWN0cygpCi0KLXB1YmxpYyBmaW5hbCBpbnQgaGFzaENvZGUoKQotCi1wdWJsaWMgZmluYWwgaW50IHNpemUoKQotCi1wcm90ZWN0ZWQgdm9pZCBzb3J0KCkKLQotcHVibGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJFbmNvZGFibGVWZWN0b3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS51dGlsLlZlY3RvciB2Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgYWRkKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkVuY29kYWJsZSkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJFbmNvZGFibGUgZ2V0KAotaW50KQotCi1wdWJsaWMgaW50IHNpemUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlVmVjdG9yIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkVuY29kYWJsZVZlY3RvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0wIG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvYXNuMS9BU04xSW5wdXRTdHJlYW07ICkKLSBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUlucHV0U3RyZWFtJDEgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xSW5wdXRTdHJlYW0gdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFJbnB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotIHZvaWQgZW5jb2RlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk91dHB1dFN0cmVhbSkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFJbnB1dFN0cmVhbSBleHRlbmRzIGphdmEuaW8uRmlsdGVySW5wdXRTdHJlYW0gaW1wbGVtZW50cyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSVGFncwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgRU5EX09GX1NUUkVBTQotCi0gYm9vbGVhbiBlb2ZGb3VuZAotCi0gaW50IGxpbWl0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5JbnB1dFN0cmVhbSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5JbnB1dFN0cmVhbQotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkJFUkNvbnN0cnVjdGVkT2N0ZXRTdHJpbmcgYnVpbGRDb25zdHJ1Y3RlZE9jdGV0U3RyaW5nKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQkVSQ29uc3RydWN0ZWRPY3RldFN0cmluZyBidWlsZERlckNvbnN0cnVjdGVkT2N0ZXRTdHJpbmcoCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgYnl0ZVtdIHJlYWRJbmRlZmluaXRlTGVuZ3RoRnVsbHkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIGludCByZWFkVGFnTnVtYmVyKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCBidWlsZE9iamVjdCgKLWludAotaW50Ci1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIHJlYWRGdWxseSgKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGludCByZWFkTGVuZ3RoKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgcmVhZE9iamVjdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFOdWxsIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLWFic3RyYWN0IHZvaWQgZW5jb2RlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk91dHB1dFN0cmVhbSkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMU9jdGV0U3RyaW5nIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gYnl0ZVtdIHN0cmluZwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJFbmNvZGFibGUpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWJ5dGVbXSkKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMU9jdGV0U3RyaW5nIGdldEluc3RhbmNlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMU9jdGV0U3RyaW5nIGdldEluc3RhbmNlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFUYWdnZWRPYmplY3QKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLWFic3RyYWN0IHZvaWQgZW5jb2RlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk91dHB1dFN0cmVhbSkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGJ5dGVbXSBnZXRPY3RldHMoKQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPdXRwdXRTdHJlYW0gZXh0ZW5kcyBqYXZhLmlvLkZpbHRlck91dHB1dFN0cmVhbSBpbXBsZW1lbnRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJUYWdzCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5PdXRwdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCB3cml0ZUxlbmd0aCgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotIHZvaWQgd3JpdGVFbmNvZGVkKAotaW50Ci1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIHdyaXRlTnVsbCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHdyaXRlT2JqZWN0KAotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMU91dHB1dFN0cmVhbSBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPdXRwdXRTdHJlYW0KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmlvLk91dHB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgd3JpdGVPYmplY3QoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUNvbGxlY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UgZ2V0SW5zdGFuY2UoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVRhZ2dlZE9iamVjdAotYm9vbGVhbikKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNldCBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xQ29sbGVjdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXQgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2V0IGdldEluc3RhbmNlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFUYWdnZWRPYmplY3QKLWJvb2xlYW4pCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFUYWdnZWRPYmplY3QgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBib29sZWFuIGVtcHR5Ci0KLSBib29sZWFuIGV4cGxpY2l0Ci0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSRW5jb2RhYmxlIG9iagotCi0gaW50IHRhZ05vCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50Ci1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSRW5jb2RhYmxlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ib29sZWFuCi1pbnQKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJFbmNvZGFibGUpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFUYWdnZWRPYmplY3QgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xVGFnZ2VkT2JqZWN0IGdldEluc3RhbmNlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFUYWdnZWRPYmplY3QKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLWFic3RyYWN0IHZvaWQgZW5jb2RlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk91dHB1dFN0cmVhbSkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgZ2V0T2JqZWN0KCkKLQotcHVibGljIGludCBnZXRUYWdObygpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkKLQotcHVibGljIGJvb2xlYW4gaXNFeHBsaWNpdCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2N0ZXRTdHJpbmcgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMU9jdGV0U3RyaW5nCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkVuY29kYWJsZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi0gdm9pZCBlbmNvZGUoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST3V0cHV0U3RyZWFtKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5CRVJDb25zdHJ1Y3RlZE9jdGV0U3RyaW5nIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9jdGV0U3RyaW5nCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS51dGlsLlZlY3RvciBvY3RzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLlZlY3RvcikKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkVuY29kYWJsZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYnl0ZVtdKQotCi1wcml2YXRlIGphdmEudXRpbC5WZWN0b3IgZ2VuZXJhdGVPY3RzKCkKLQotcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIHRvQnl0ZXMoCi1qYXZhLnV0aWwuVmVjdG9yKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBlbmNvZGUoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST3V0cHV0U3RyZWFtKQotCi1wdWJsaWMgamF2YS51dGlsLkVudW1lcmF0aW9uIGdldE9iamVjdHMoKQotCi1wdWJsaWMgYnl0ZVtdIGdldE9jdGV0cygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkNvbnN0cnVjdGVkU2VxdWVuY2UgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgYWRkT2JqZWN0KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkVuY29kYWJsZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotIHZvaWQgZW5jb2RlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk91dHB1dFN0cmVhbSkKLQotcHVibGljIGludCBnZXRTaXplKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQkVSQ29uc3RydWN0ZWRTZXF1ZW5jZSBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJDb25zdHJ1Y3RlZFNlcXVlbmNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotIHZvaWQgZW5jb2RlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk91dHB1dFN0cmVhbSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9hc24xL0JFUklucHV0U3RyZWFtOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTAgbmFtZSA9bnVsbCApCi0gY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkJFUklucHV0U3RyZWFtJDEgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5CRVJJbnB1dFN0cmVhbSB0aGlzJDAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQkVSSW5wdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLSB2b2lkIGVuY29kZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPdXRwdXRTdHJlYW0pCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJJbnB1dFN0cmVhbSBleHRlbmRzIGphdmEuaW8uRmlsdGVySW5wdXRTdHJlYW0gaW1wbGVtZW50cyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSVGFncwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uSW5wdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IGJ1aWxkT2JqZWN0KAotaW50Ci1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIHJlYWRGdWxseSgKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGludCByZWFkTGVuZ3RoKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgcmVhZE9iamVjdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkJFUklucHV0U3RyZWFtIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUklucHV0U3RyZWFtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCBFTkRfT0ZfU1RSRUFNCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5JbnB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQkVSQ29uc3RydWN0ZWRPY3RldFN0cmluZyBidWlsZENvbnN0cnVjdGVkT2N0ZXRTdHJpbmcoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIGJ5dGVbXSByZWFkSW5kZWZpbml0ZUxlbmd0aEZ1bGx5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgcmVhZE9iamVjdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk51bGwgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMU51bGwKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSTnVsbCBUSEVfT05FCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSB6ZXJvQnl0ZXMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLSB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLSB2b2lkIGVuY29kZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPdXRwdXRTdHJlYW0pCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5CRVJOdWxsIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk51bGwKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQkVSTnVsbCBUSEVfT05FCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotIHZvaWQgZW5jb2RlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk91dHB1dFN0cmVhbSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQkVST3V0cHV0U3RyZWFtIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk91dHB1dFN0cmVhbQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uT3V0cHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB3cml0ZU9iamVjdCgKLWphdmEubGFuZy5PYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUlNlcXVlbmNlIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJFbmNvZGFibGUpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJFbmNvZGFibGVWZWN0b3IpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLSB2b2lkIGVuY29kZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPdXRwdXRTdHJlYW0pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkJFUlNlcXVlbmNlIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUlNlcXVlbmNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkVuY29kYWJsZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkVuY29kYWJsZVZlY3RvcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotIHZvaWQgZW5jb2RlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk91dHB1dFN0cmVhbSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSU2V0IGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSRW5jb2RhYmxlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSRW5jb2RhYmxlVmVjdG9yKQotCi0gdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSRW5jb2RhYmxlVmVjdG9yCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi0gdm9pZCBlbmNvZGUoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST3V0cHV0U3RyZWFtKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5CRVJTZXQgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSU2V0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkVuY29kYWJsZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkVuY29kYWJsZVZlY3RvcikKLQotIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkVuY29kYWJsZVZlY3RvcgotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotIHZvaWQgZW5jb2RlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk91dHB1dFN0cmVhbSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSVGFnZ2VkT2JqZWN0IGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFUYWdnZWRPYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkVuY29kYWJsZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYm9vbGVhbgotaW50Ci1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSRW5jb2RhYmxlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi0gdm9pZCBlbmNvZGUoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST3V0cHV0U3RyZWFtKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5CRVJUYWdnZWRPYmplY3QgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSVGFnZ2VkT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJFbmNvZGFibGUpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWJvb2xlYW4KLWludAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkVuY29kYWJsZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotIHZvaWQgZW5jb2RlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk91dHB1dFN0cmVhbSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSQXBwbGljYXRpb25TcGVjaWZpYyBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBieXRlW10gb2N0ZXRzCi0KLXByaXZhdGUgaW50IHRhZwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkVuY29kYWJsZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50Ci1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLSB2b2lkIGVuY29kZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPdXRwdXRTdHJlYW0pCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBpbnQgZ2V0QXBwbGljYXRpb25UYWcoKQotCi1wdWJsaWMgYnl0ZVtdIGdldENvbnRlbnRzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgZ2V0T2JqZWN0KCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLXB1YmxpYyBib29sZWFuIGlzQ29uc3RydWN0ZWQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSU3RyaW5nIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkJNUFN0cmluZyBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgaW1wbGVtZW50cyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSU3RyaW5nCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBqYXZhLmxhbmcuU3RyaW5nIHN0cmluZwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWJ5dGVbXSkKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSQk1QU3RyaW5nIGdldEluc3RhbmNlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSQk1QU3RyaW5nIGdldEluc3RhbmNlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFUYWdnZWRPYmplY3QKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLSB2b2lkIGVuY29kZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPdXRwdXRTdHJlYW0pCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJCaXRTdHJpbmcgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IGltcGxlbWVudHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUlN0cmluZwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gdGFibGUKLQotcHJvdGVjdGVkIGJ5dGVbXSBkYXRhCi0KLXByb3RlY3RlZCBpbnQgcGFkQml0cwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotYnl0ZQotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSRW5jb2RhYmxlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ieXRlW10pCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWJ5dGVbXQotaW50KQotCi1wcm90ZWN0ZWQgc3RhdGljIGJ5dGVbXSBnZXRCeXRlcygKLWludCkKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSQml0U3RyaW5nIGdldEluc3RhbmNlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSQml0U3RyaW5nIGdldEluc3RhbmNlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFUYWdnZWRPYmplY3QKLWJvb2xlYW4pCi0KLXByb3RlY3RlZCBzdGF0aWMgaW50IGdldFBhZEJpdHMoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLSB2b2lkIGVuY29kZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPdXRwdXRTdHJlYW0pCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBieXRlW10gZ2V0Qnl0ZXMoKQotCi1wdWJsaWMgaW50IGdldFBhZEJpdHMoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdHJpbmcoKQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLQotcHVibGljIGludCBpbnRWYWx1ZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSQm9vbGVhbiBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSQm9vbGVhbiBGQUxTRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJCb29sZWFuIFRSVUUKLQotcHJpdmF0ZSBmaW5hbCBieXRlIHZhbHVlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotYm9vbGVhbikKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSQm9vbGVhbiBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkJvb2xlYW4gZ2V0SW5zdGFuY2UoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVRhZ2dlZE9iamVjdAotYm9vbGVhbikKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSQm9vbGVhbiBnZXRJbnN0YW5jZSgKLWJvb2xlYW4pCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkJvb2xlYW4gZ2V0SW5zdGFuY2UoCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLSB2b2lkIGVuY29kZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPdXRwdXRTdHJlYW0pCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1wdWJsaWMgYm9vbGVhbiBpc1RydWUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkNvbnN0cnVjdGVkU2V0IGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSRW5jb2RhYmxlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSRW5jb2RhYmxlVmVjdG9yKQotCi1wdWJsaWMgdm9pZCBhZGRPYmplY3QoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSRW5jb2RhYmxlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi0gdm9pZCBlbmNvZGUoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST3V0cHV0U3RyZWFtKQotCi1wdWJsaWMgaW50IGdldFNpemUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJFbnVtZXJhdGVkIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gYnl0ZVtdIGJ5dGVzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLm1hdGguQmlnSW50ZWdlcikKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYnl0ZVtdKQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJFbnVtZXJhdGVkIGdldEluc3RhbmNlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSRW51bWVyYXRlZCBnZXRJbnN0YW5jZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xVGFnZ2VkT2JqZWN0Ci1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi0gdm9pZCBlbmNvZGUoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST3V0cHV0U3RyZWFtKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgZ2V0VmFsdWUoKQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSR2VuZXJhbFN0cmluZyBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgaW1wbGVtZW50cyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSU3RyaW5nCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBzdHJpbmcKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ieXRlW10pCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkdlbmVyYWxTdHJpbmcgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJHZW5lcmFsU3RyaW5nIGdldEluc3RhbmNlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFUYWdnZWRPYmplY3QKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLSB2b2lkIGVuY29kZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPdXRwdXRTdHJlYW0pCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBieXRlW10gZ2V0T2N0ZXRzKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nKCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkdlbmVyYWxpemVkVGltZSBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGphdmEubGFuZy5TdHJpbmcgdGltZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEudXRpbC5EYXRlKQotCi0gdm9pZCA8aW5pdD4oCi1ieXRlW10pCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkdlbmVyYWxpemVkVGltZSBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkdlbmVyYWxpemVkVGltZSBnZXRJbnN0YW5jZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xVGFnZ2VkT2JqZWN0Ci1ib29sZWFuKQotCi1wcml2YXRlIGJ5dGVbXSBnZXRPY3RldHMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi0gdm9pZCBlbmNvZGUoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST3V0cHV0U3RyZWFtKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3RleHQvUGFyc2VFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnV0aWwuRGF0ZSBnZXREYXRlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VGltZSgpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJJQTVTdHJpbmcgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IGltcGxlbWVudHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUlN0cmluZwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gamF2YS5sYW5nLlN0cmluZyBzdHJpbmcKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ieXRlW10pCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUklBNVN0cmluZyBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUklBNVN0cmluZyBnZXRJbnN0YW5jZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xVGFnZ2VkT2JqZWN0Ci1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi0gdm9pZCBlbmNvZGUoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST3V0cHV0U3RyZWFtKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYnl0ZVtdIGdldE9jdGV0cygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJJbnRlZ2VyIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gYnl0ZVtdIGJ5dGVzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLm1hdGguQmlnSW50ZWdlcikKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYnl0ZVtdKQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJJbnRlZ2VyIGdldEluc3RhbmNlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSSW50ZWdlciBnZXRJbnN0YW5jZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xVGFnZ2VkT2JqZWN0Ci1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi0gdm9pZCBlbmNvZGUoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST3V0cHV0U3RyZWFtKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgZ2V0UG9zaXRpdmVWYWx1ZSgpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRWYWx1ZSgpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk51bWVyaWNTdHJpbmcgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IGltcGxlbWVudHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUlN0cmluZwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gamF2YS5sYW5nLlN0cmluZyBzdHJpbmcKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ieXRlW10pCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk51bWVyaWNTdHJpbmcgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJOdW1lcmljU3RyaW5nIGdldEluc3RhbmNlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFUYWdnZWRPYmplY3QKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLSB2b2lkIGVuY29kZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPdXRwdXRTdHJlYW0pCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBieXRlW10gZ2V0T2N0ZXRzKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nKCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBqYXZhLmxhbmcuU3RyaW5nIGlkZW50aWZpZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi0gdm9pZCA8aW5pdD4oCi1ieXRlW10pCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGdldEluc3RhbmNlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFUYWdnZWRPYmplY3QKLWJvb2xlYW4pCi0KLXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNWYWxpZElkZW50aWZpZXIoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgd3JpdGVGaWVsZCgKLWphdmEuaW8uT3V0cHV0U3RyZWFtCi1sb25nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgd3JpdGVGaWVsZCgKLWphdmEuaW8uT3V0cHV0U3RyZWFtCi1qYXZhLm1hdGguQmlnSW50ZWdlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotIHZvaWQgZW5jb2RlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk91dHB1dFN0cmVhbSkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SWQoKQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJQcmludGFibGVTdHJpbmcgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IGltcGxlbWVudHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUlN0cmluZwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgc3RyaW5nCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYnl0ZVtdKQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJQcmludGFibGVTdHJpbmcgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJQcmludGFibGVTdHJpbmcgZ2V0SW5zdGFuY2UoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVRhZ2dlZE9iamVjdAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotIHZvaWQgZW5jb2RlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk91dHB1dFN0cmVhbSkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGJ5dGVbXSBnZXRPY3RldHMoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdHJpbmcoKQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJUNjFTdHJpbmcgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IGltcGxlbWVudHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUlN0cmluZwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gamF2YS5sYW5nLlN0cmluZyBzdHJpbmcKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ieXRlW10pCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUlQ2MVN0cmluZyBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUlQ2MVN0cmluZyBnZXRJbnN0YW5jZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xVGFnZ2VkT2JqZWN0Ci1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi0gdm9pZCBlbmNvZGUoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST3V0cHV0U3RyZWFtKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYnl0ZVtdIGdldE9jdGV0cygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJVVENUaW1lIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gamF2YS5sYW5nLlN0cmluZyB0aW1lCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkRhdGUpCi0KLSB2b2lkIDxpbml0PigKLWJ5dGVbXSkKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSVVRDVGltZSBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUlVUQ1RpbWUgZ2V0SW5zdGFuY2UoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVRhZ2dlZE9iamVjdAotYm9vbGVhbikKLQotcHJpdmF0ZSBieXRlW10gZ2V0T2N0ZXRzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotIHZvaWQgZW5jb2RlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk91dHB1dFN0cmVhbSkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QWRqdXN0ZWRUaW1lKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VGltZSgpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUlVURjhTdHJpbmcgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IGltcGxlbWVudHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUlN0cmluZwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gamF2YS5sYW5nLlN0cmluZyBzdHJpbmcKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi0gdm9pZCA8aW5pdD4oCi1ieXRlW10pCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUlVURjhTdHJpbmcgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJVVEY4U3RyaW5nIGdldEluc3RhbmNlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFUYWdnZWRPYmplY3QKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLSB2b2lkIGVuY29kZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPdXRwdXRTdHJlYW0pCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJVbml2ZXJzYWxTdHJpbmcgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IGltcGxlbWVudHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUlN0cmluZwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gdGFibGUKLQotcHJpdmF0ZSBieXRlW10gc3RyaW5nCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ieXRlW10pCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUlVuaXZlcnNhbFN0cmluZyBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUlVuaXZlcnNhbFN0cmluZyBnZXRJbnN0YW5jZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xVGFnZ2VkT2JqZWN0Ci1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi0gdm9pZCBlbmNvZGUoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST3V0cHV0U3RyZWFtKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYnl0ZVtdIGdldE9jdGV0cygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJVbmtub3duVGFnIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gYnl0ZVtdIGRhdGEKLQotIGludCB0YWcKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotIHZvaWQgZW5jb2RlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk91dHB1dFN0cmVhbSkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGJ5dGVbXSBnZXREYXRhKCkKLQotcHVibGljIGludCBnZXRUYWcoKQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSVmlzaWJsZVN0cmluZyBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgaW1wbGVtZW50cyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSU3RyaW5nCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBqYXZhLmxhbmcuU3RyaW5nIHN0cmluZwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWJ5dGVbXSkKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSVmlzaWJsZVN0cmluZyBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUlZpc2libGVTdHJpbmcgZ2V0SW5zdGFuY2UoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVRhZ2dlZE9iamVjdAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotIHZvaWQgZW5jb2RlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk91dHB1dFN0cmVhbSkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGJ5dGVbXSBnZXRPY3RldHMoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdHJpbmcoKQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuT0lEVG9rZW5pemVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGludCBpbmRleAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgb2lkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJvb2xlYW4gaGFzTW9yZVRva2VucygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIG5leHRUb2tlbigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID00MTA0IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvYXNuMS9PcmRlcmVkVGFibGU7ICkKLSBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuT3JkZXJlZFRhYmxlJDEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9hc24xL09yZGVyZWRUYWJsZTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPUtleUVudW1lcmF0aW9uICkKLSBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuT3JkZXJlZFRhYmxlJEtleUVudW1lcmF0aW9uIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudXRpbC5FbnVtZXJhdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGludCBhdAotCi1wcml2YXRlIGZpbmFsIGludCBvcmlnU2l6ZQotCi1maW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuT3JkZXJlZFRhYmxlIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuT3JkZXJlZFRhYmxlKQotCi0gdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuT3JkZXJlZFRhYmxlCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuT3JkZXJlZFRhYmxlJDEpCi0KLXB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IG5leHRFbGVtZW50KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2FzbjEvT3JkZXJlZFRhYmxlJDE7TG9yZy9ib3VuY3ljYXN0bGUvYXNuMS9PcmRlcmVkVGFibGUkS2V5RW51bWVyYXRpb247ICkKLXB1YmxpYyBmaW5hbCBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuT3JkZXJlZFRhYmxlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGtleTAKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBrZXkxCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIga2V5MgotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGtleTMKLQotcHJpdmF0ZSBqYXZhLmxhbmcuT2JqZWN0W10gcmVzdAotCi1wcml2YXRlIGludCBzaXplCi0KLXByaXZhdGUgamF2YS5sYW5nLk9iamVjdCB2YWx1ZTAKLQotcHJpdmF0ZSBqYXZhLmxhbmcuT2JqZWN0IHZhbHVlMQotCi1wcml2YXRlIGphdmEubGFuZy5PYmplY3QgdmFsdWUyCi0KLXByaXZhdGUgamF2YS5sYW5nLk9iamVjdCB2YWx1ZTMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1zdGF0aWMgaW50IGFjY2VzcyQxMDAoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuT3JkZXJlZFRhYmxlKQotCi1wdWJsaWMgdm9pZCBhZGQoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllcgotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBnZXRLZXkoCi1pbnQpCi0KLXB1YmxpYyBqYXZhLnV0aWwuRW51bWVyYXRpb24gZ2V0S2V5cygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldFZhbHVlKAotaW50KQotCi1wdWJsaWMgaW50IHNpemUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5jbXAuUEtJRmFpbHVyZUluZm8gZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSQml0U3RyaW5nCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFERF9JTkZPX05PVF9BVkFJTEFCTEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkFEX0FMRwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCQURfQ0VSVF9JRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCQURfREFUQV9GT1JNQVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkFEX01FU1NBR0VfQ0hFQ0sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkFEX1BPUAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCQURfUkVRVUVTVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBCQURfVElNRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkNPUlJFQ1RfREFUQQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSVNTSU5HX1RJTUVfU1RBTVAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1lTVEVNX0ZBSUxVUkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVElNRV9OT1RfQVZBSUxBQkxFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOQUNDRVBURURfRVhURU5TSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOQUNDRVBURURfUE9MSUNZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdST05HX0FVVEhPUklUWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBhZGRJbmZvTm90QXZhaWxhYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJhZEFsZwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBiYWRDZXJ0SWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYmFkRGF0YUZvcm1hdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBiYWRNZXNzYWdlQ2hlY2sKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYmFkUE9QCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJhZFJlcXVlc3QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYmFkVGltZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBpbmNvcnJlY3REYXRhCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1pc3NpbmdUaW1lU3RhbXAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3lzdGVtRmFpbHVyZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB0aW1lTm90QXZhaWxhYmxlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHVuYWNjZXB0ZWRFeHRlbnNpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdW5hY2NlcHRlZFBvbGljeQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB3cm9uZ0F1dGhvcml0eQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkJpdFN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5jbXAuUEtJRnJlZVRleHQgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSBzdHJpbmdzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUlVURjhTdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLmNtcC5QS0lGcmVlVGV4dCBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLmNtcC5QS0lGcmVlVGV4dCBnZXRJbnN0YW5jZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xVGFnZ2VkT2JqZWN0Ci1ib29sZWFuKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUlVURjhTdHJpbmcgZ2V0U3RyaW5nQXQoCi1pbnQpCi0KLXB1YmxpYyBpbnQgc2l6ZSgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IHRvQVNOMU9iamVjdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5jbXAuUEtJU3RhdHVzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHUkFOVEVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdSQU5URURfV0lUSF9NT0RTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFSkVDVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVZPQ0FUSU9OX05PVElGSUNBVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVZPQ0FUSU9OX1dBUk5JTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FJVElORwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLmNtcC5QS0lTdGF0dXNJbmZvIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFFbmNvZGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJCaXRTdHJpbmcgZmFpbEluZm8KLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJJbnRlZ2VyIHN0YXR1cwotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLmNtcC5QS0lGcmVlVGV4dCBzdGF0dXNTdHJpbmcKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLmNtcC5QS0lGcmVlVGV4dCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50Ci1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuY21wLlBLSUZyZWVUZXh0Ci1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuY21wLlBLSUZhaWx1cmVJbmZvKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlKQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5jbXAuUEtJU3RhdHVzSW5mbyBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLmNtcC5QS0lTdGF0dXNJbmZvIGdldEluc3RhbmNlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFUYWdnZWRPYmplY3QKLWJvb2xlYW4pCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSQml0U3RyaW5nIGdldEZhaWxJbmZvKCkKLQotcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldFN0YXR1cygpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuY21wLlBLSUZyZWVUZXh0IGdldFN0YXR1c1N0cmluZygpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IHRvQVNOMU9iamVjdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLmNtcy5BdHRyaWJ1dGUgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGF0dHJUeXBlCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXQgYXR0clZhbHVlcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNldCkKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuY21zLkF0dHJpYnV0ZSBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBnZXRBdHRyVHlwZSgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNldCBnZXRBdHRyVmFsdWVzKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgdG9BU04xT2JqZWN0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuY21zLkF0dHJpYnV0ZVRhYmxlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEudXRpbC5IYXNodGFibGUgYXR0cmlidXRlcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEudXRpbC5IYXNodGFibGUpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2V0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSRW5jb2RhYmxlVmVjdG9yKQotCi1wcml2YXRlIHZvaWQgYWRkQXR0cmlidXRlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5jbXMuQXR0cmlidXRlKQotCi1wcml2YXRlIGphdmEudXRpbC5IYXNodGFibGUgY29weVRhYmxlKAotamF2YS51dGlsLkhhc2h0YWJsZSkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5jbXMuQXR0cmlidXRlIGdldCgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFFbmNvZGFibGVWZWN0b3IgZ2V0QWxsKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZVZlY3RvciB0b0FTTjFFbmNvZGFibGVWZWN0b3IoKQotCi1wdWJsaWMgamF2YS51dGlsLkhhc2h0YWJsZSB0b0hhc2h0YWJsZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5jbXMuQ01TQXR0cmlidXRlcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBjb250ZW50VHlwZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGNvdW50ZXJTaWduYXR1cmUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBtZXNzYWdlRGlnZXN0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgc2lnbmluZ1RpbWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5jbXMuQ01TT2JqZWN0SWRlbnRpZmllcnMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgY29tcHJlc3NlZERhdGEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBkYXRhCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgZGlnZXN0ZWREYXRhCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgZW5jcnlwdGVkRGF0YQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGVudmVsb3BlZERhdGEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBzaWduZWRBbmRFbnZlbG9wZWREYXRhCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgc2lnbmVkRGF0YQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuY21zLkNvbXByZXNzZWREYXRhIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFFbmNvZGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyIGNvbXByZXNzaW9uQWxnb3JpdGhtCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLmNtcy5Db250ZW50SW5mbyBlbmNhcENvbnRlbnRJbmZvCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkludGVnZXIgdmVyc2lvbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5jbXMuQ29udGVudEluZm8pCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLmNtcy5Db21wcmVzc2VkRGF0YSBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLmNtcy5Db21wcmVzc2VkRGF0YSBnZXRJbnN0YW5jZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xVGFnZ2VkT2JqZWN0Ci1ib29sZWFuKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllciBnZXRDb21wcmVzc2lvbkFsZ29yaXRobUlkZW50aWZpZXIoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLmNtcy5Db250ZW50SW5mbyBnZXRFbmNhcENvbnRlbnRJbmZvKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJJbnRlZ2VyIGdldFZlcnNpb24oKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCB0b0FTTjFPYmplY3QoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5jbXMuQ29udGVudEluZm8gZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZSBpbXBsZW1lbnRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5jbXMuQ01TT2JqZWN0SWRlbnRpZmllcnMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSRW5jb2RhYmxlIGNvbnRlbnQKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBjb250ZW50VHlwZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSRW5jb2RhYmxlKQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5jbXMuQ29udGVudEluZm8gZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkVuY29kYWJsZSBnZXRDb250ZW50KCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGdldENvbnRlbnRUeXBlKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgdG9BU04xT2JqZWN0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuY21zLkVuY3J5cHRlZENvbnRlbnRJbmZvIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFFbmNvZGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyIGNvbnRlbnRFbmNyeXB0aW9uQWxnb3JpdGhtCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgY29udGVudFR5cGUKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMU9jdGV0U3RyaW5nIGVuY3J5cHRlZENvbnRlbnQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllcgotb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllcgotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFPY3RldFN0cmluZykKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuY21zLkVuY3J5cHRlZENvbnRlbnRJbmZvIGdldEluc3RhbmNlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIgZ2V0Q29udGVudEVuY3J5cHRpb25BbGdvcml0aG0oKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgZ2V0Q29udGVudFR5cGUoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFPY3RldFN0cmluZyBnZXRFbmNyeXB0ZWRDb250ZW50KCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgdG9BU04xT2JqZWN0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuY21zLkVudmVsb3BlZERhdGEgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5jbXMuRW5jcnlwdGVkQ29udGVudEluZm8gZW5jcnlwdGVkQ29udGVudEluZm8KLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuY21zLk9yaWdpbmF0b3JJbmZvIG9yaWdpbmF0b3JJbmZvCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXQgcmVjaXBpZW50SW5mb3MKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNldCB1bnByb3RlY3RlZEF0dHJzCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkludGVnZXIgdmVyc2lvbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5jbXMuT3JpZ2luYXRvckluZm8KLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2V0Ci1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuY21zLkVuY3J5cHRlZENvbnRlbnRJbmZvCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNldCkKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuY21zLkVudmVsb3BlZERhdGEgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5jbXMuRW52ZWxvcGVkRGF0YSBnZXRJbnN0YW5jZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xVGFnZ2VkT2JqZWN0Ci1ib29sZWFuKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLmNtcy5FbmNyeXB0ZWRDb250ZW50SW5mbyBnZXRFbmNyeXB0ZWRDb250ZW50SW5mbygpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuY21zLk9yaWdpbmF0b3JJbmZvIGdldE9yaWdpbmF0b3JJbmZvKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2V0IGdldFJlY2lwaWVudEluZm9zKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2V0IGdldFVucHJvdGVjdGVkQXR0cnMoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkludGVnZXIgZ2V0VmVyc2lvbigpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IHRvQVNOMU9iamVjdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLmNtcy5Jc3N1ZXJBbmRTZXJpYWxOdW1iZXIgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuWDUwOU5hbWUgbmFtZQotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkludGVnZXIgc2VyaWFsTnVtYmVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuWDUwOU5hbWUKLWphdmEubWF0aC5CaWdJbnRlZ2VyKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5YNTA5TmFtZQotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkludGVnZXIpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLmNtcy5Jc3N1ZXJBbmRTZXJpYWxOdW1iZXIgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuWDUwOU5hbWUgZ2V0TmFtZSgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSSW50ZWdlciBnZXRTZXJpYWxOdW1iZXIoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCB0b0FTTjFPYmplY3QoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5jbXMuS0VLSWRlbnRpZmllciBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkdlbmVyYWxpemVkVGltZSBkYXRlCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFPY3RldFN0cmluZyBrZXlJZGVudGlmaWVyCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLmNtcy5PdGhlcktleUF0dHJpYnV0ZSBvdGhlcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWJ5dGVbXQotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkdlbmVyYWxpemVkVGltZQotb3JnLmJvdW5jeWNhc3RsZS5hc24xLmNtcy5PdGhlcktleUF0dHJpYnV0ZSkKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuY21zLktFS0lkZW50aWZpZXIgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5jbXMuS0VLSWRlbnRpZmllciBnZXRJbnN0YW5jZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xVGFnZ2VkT2JqZWN0Ci1ib29sZWFuKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkdlbmVyYWxpemVkVGltZSBnZXREYXRlKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xT2N0ZXRTdHJpbmcgZ2V0S2V5SWRlbnRpZmllcigpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuY21zLk90aGVyS2V5QXR0cmlidXRlIGdldE90aGVyKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgdG9BU04xT2JqZWN0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuY21zLktFS1JlY2lwaWVudEluZm8gZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xT2N0ZXRTdHJpbmcgZW5jcnlwdGVkS2V5Ci0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLmNtcy5LRUtJZGVudGlmaWVyIGtla2lkCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllciBrZXlFbmNyeXB0aW9uQWxnb3JpdGhtCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkludGVnZXIgdmVyc2lvbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5jbXMuS0VLSWRlbnRpZmllcgotb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllcgotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFPY3RldFN0cmluZykKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuY21zLktFS1JlY2lwaWVudEluZm8gZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5jbXMuS0VLUmVjaXBpZW50SW5mbyBnZXRJbnN0YW5jZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xVGFnZ2VkT2JqZWN0Ci1ib29sZWFuKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFPY3RldFN0cmluZyBnZXRFbmNyeXB0ZWRLZXkoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLmNtcy5LRUtJZGVudGlmaWVyIGdldEtla2lkKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIgZ2V0S2V5RW5jcnlwdGlvbkFsZ29yaXRobSgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSSW50ZWdlciBnZXRWZXJzaW9uKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgdG9BU04xT2JqZWN0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuY21zLktleUFncmVlUmVjaXBpZW50SW5mbyBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllciBrZXlFbmNyeXB0aW9uQWxnb3JpdGhtCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLmNtcy5PcmlnaW5hdG9ySWRlbnRpZmllck9yS2V5IG9yaWdpbmF0b3IKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlIHJlY2lwaWVudEVuY3J5cHRlZEtleXMKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMU9jdGV0U3RyaW5nIHVrbQotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJJbnRlZ2VyIHZlcnNpb24KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuY21zLk9yaWdpbmF0b3JJZGVudGlmaWVyT3JLZXkKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xT2N0ZXRTdHJpbmcKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLmNtcy5LZXlBZ3JlZVJlY2lwaWVudEluZm8gZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5jbXMuS2V5QWdyZWVSZWNpcGllbnRJbmZvIGdldEluc3RhbmNlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFUYWdnZWRPYmplY3QKLWJvb2xlYW4pCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyIGdldEtleUVuY3J5cHRpb25BbGdvcml0aG0oKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLmNtcy5PcmlnaW5hdG9ySWRlbnRpZmllck9yS2V5IGdldE9yaWdpbmF0b3IoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSBnZXRSZWNpcGllbnRFbmNyeXB0ZWRLZXlzKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xT2N0ZXRTdHJpbmcgZ2V0VXNlcktleWluZ01hdGVyaWFsKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJJbnRlZ2VyIGdldFZlcnNpb24oKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCB0b0FTTjFPYmplY3QoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5jbXMuS2V5VHJhbnNSZWNpcGllbnRJbmZvIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFFbmNvZGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMU9jdGV0U3RyaW5nIGVuY3J5cHRlZEtleQotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIga2V5RW5jcnlwdGlvbkFsZ29yaXRobQotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5jbXMuUmVjaXBpZW50SWRlbnRpZmllciByaWQKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSSW50ZWdlciB2ZXJzaW9uCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLmNtcy5SZWNpcGllbnRJZGVudGlmaWVyCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMU9jdGV0U3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5jbXMuS2V5VHJhbnNSZWNpcGllbnRJbmZvIGdldEluc3RhbmNlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xT2N0ZXRTdHJpbmcgZ2V0RW5jcnlwdGVkS2V5KCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIgZ2V0S2V5RW5jcnlwdGlvbkFsZ29yaXRobSgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuY21zLlJlY2lwaWVudElkZW50aWZpZXIgZ2V0UmVjaXBpZW50SWRlbnRpZmllcigpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSSW50ZWdlciBnZXRWZXJzaW9uKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgdG9BU04xT2JqZWN0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuY21zLk9yaWdpbmF0b3JJZGVudGlmaWVyT3JLZXkgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJFbmNvZGFibGUgaWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMU9jdGV0U3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuY21zLklzc3VlckFuZFNlcmlhbE51bWJlcikKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLmNtcy5PcmlnaW5hdG9yUHVibGljS2V5KQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5jbXMuT3JpZ2luYXRvcklkZW50aWZpZXJPcktleSBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLmNtcy5PcmlnaW5hdG9ySWRlbnRpZmllck9yS2V5IGdldEluc3RhbmNlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFUYWdnZWRPYmplY3QKLWJvb2xlYW4pCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSRW5jb2RhYmxlIGdldElkKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgdG9BU04xT2JqZWN0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuY21zLk9yaWdpbmF0b3JJbmZvIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFFbmNvZGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNldCBjZXJ0cwotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2V0IGNybHMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNldAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXQpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLmNtcy5PcmlnaW5hdG9ySW5mbyBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLmNtcy5PcmlnaW5hdG9ySW5mbyBnZXRJbnN0YW5jZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xVGFnZ2VkT2JqZWN0Ci1ib29sZWFuKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXQgZ2V0Q1JMcygpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNldCBnZXRDZXJ0aWZpY2F0ZXMoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCB0b0FTTjFPYmplY3QoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5jbXMuT3JpZ2luYXRvclB1YmxpY0tleSBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllciBhbGdvcml0aG0KLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSQml0U3RyaW5nIHB1YmxpY0tleQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIKLWJ5dGVbXSkKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuY21zLk9yaWdpbmF0b3JQdWJsaWNLZXkgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5jbXMuT3JpZ2luYXRvclB1YmxpY0tleSBnZXRJbnN0YW5jZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xVGFnZ2VkT2JqZWN0Ci1ib29sZWFuKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllciBnZXRBbGdvcml0aG0oKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkJpdFN0cmluZyBnZXRQdWJsaWNLZXkoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCB0b0FTTjFPYmplY3QoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5jbXMuT3RoZXJLZXlBdHRyaWJ1dGUgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJFbmNvZGFibGUga2V5QXR0cgotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGtleUF0dHJJZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSRW5jb2RhYmxlKQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5jbXMuT3RoZXJLZXlBdHRyaWJ1dGUgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkVuY29kYWJsZSBnZXRLZXlBdHRyKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGdldEtleUF0dHJJZCgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IHRvQVNOMU9iamVjdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLmNtcy5PdGhlclJlY2lwaWVudEluZm8gZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIG9yaVR5cGUKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSRW5jb2RhYmxlIG9yaVZhbHVlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJFbmNvZGFibGUpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLmNtcy5PdGhlclJlY2lwaWVudEluZm8gZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5jbXMuT3RoZXJSZWNpcGllbnRJbmZvIGdldEluc3RhbmNlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFUYWdnZWRPYmplY3QKLWJvb2xlYW4pCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBnZXRUeXBlKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJFbmNvZGFibGUgZ2V0VmFsdWUoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCB0b0FTTjFPYmplY3QoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5jbXMuUGFzc3dvcmRSZWNpcGllbnRJbmZvIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFFbmNvZGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMU9jdGV0U3RyaW5nIGVuY3J5cHRlZEtleQotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIga2V5RGVyaXZhdGlvbkFsZ29yaXRobQotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIga2V5RW5jcnlwdGlvbkFsZ29yaXRobQotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJJbnRlZ2VyIHZlcnNpb24KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMU9jdGV0U3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMU9jdGV0U3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5jbXMuUGFzc3dvcmRSZWNpcGllbnRJbmZvIGdldEluc3RhbmNlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuY21zLlBhc3N3b3JkUmVjaXBpZW50SW5mbyBnZXRJbnN0YW5jZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xVGFnZ2VkT2JqZWN0Ci1ib29sZWFuKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFPY3RldFN0cmluZyBnZXRFbmNyeXB0ZWRLZXkoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllciBnZXRLZXlEZXJpdmF0aW9uQWxnb3JpdGhtKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIgZ2V0S2V5RW5jcnlwdGlvbkFsZ29yaXRobSgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSSW50ZWdlciBnZXRWZXJzaW9uKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgdG9BU04xT2JqZWN0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuY21zLlJlY2lwaWVudElkZW50aWZpZXIgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJFbmNvZGFibGUgaWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMU9jdGV0U3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuY21zLklzc3VlckFuZFNlcmlhbE51bWJlcikKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuY21zLlJlY2lwaWVudElkZW50aWZpZXIgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkVuY29kYWJsZSBnZXRJZCgpCi0KLXB1YmxpYyBib29sZWFuIGlzVGFnZ2VkKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgdG9BU04xT2JqZWN0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuY21zLlJlY2lwaWVudEluZm8gZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkVuY29kYWJsZSBpbmZvCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLmNtcy5LRUtSZWNpcGllbnRJbmZvKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuY21zLktleUFncmVlUmVjaXBpZW50SW5mbykKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLmNtcy5LZXlUcmFuc1JlY2lwaWVudEluZm8pCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5jbXMuT3RoZXJSZWNpcGllbnRJbmZvKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuY21zLlBhc3N3b3JkUmVjaXBpZW50SW5mbykKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuY21zLlJlY2lwaWVudEluZm8gZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkVuY29kYWJsZSBnZXRJbmZvKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJJbnRlZ2VyIGdldFZlcnNpb24oKQotCi1wdWJsaWMgYm9vbGVhbiBpc1RhZ2dlZCgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IHRvQVNOMU9iamVjdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLmNtcy5SZWNpcGllbnRLZXlJZGVudGlmaWVyIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFFbmNvZGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSR2VuZXJhbGl6ZWRUaW1lIGRhdGUKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuY21zLk90aGVyS2V5QXR0cmlidXRlIG90aGVyCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFPY3RldFN0cmluZyBzdWJqZWN0S2V5SWRlbnRpZmllcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xT2N0ZXRTdHJpbmcKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJHZW5lcmFsaXplZFRpbWUKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5jbXMuT3RoZXJLZXlBdHRyaWJ1dGUpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLmNtcy5SZWNpcGllbnRLZXlJZGVudGlmaWVyIGdldEluc3RhbmNlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuY21zLlJlY2lwaWVudEtleUlkZW50aWZpZXIgZ2V0SW5zdGFuY2UoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVRhZ2dlZE9iamVjdAotYm9vbGVhbikKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJHZW5lcmFsaXplZFRpbWUgZ2V0RGF0ZSgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuY21zLk90aGVyS2V5QXR0cmlidXRlIGdldE90aGVyS2V5QXR0cmlidXRlKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xT2N0ZXRTdHJpbmcgZ2V0U3ViamVjdEtleUlkZW50aWZpZXIoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCB0b0FTTjFPYmplY3QoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5jbXMuU2lnbmVkRGF0YSBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYm9vbGVhbiBjZXJ0QmVyCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXQgY2VydGlmaWNhdGVzCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLmNtcy5Db250ZW50SW5mbyBjb250ZW50SW5mbwotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2V0IGNybHMKLQotcHJpdmF0ZSBib29sZWFuIGNybHNCZXIKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNldCBkaWdlc3RBbGdvcml0aG1zCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXQgc2lnbmVySW5mb3MKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSSW50ZWdlciB2ZXJzaW9uCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXQKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5jbXMuQ29udGVudEluZm8KLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2V0Ci1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNldAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXQpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLmNtcy5TaWduZWREYXRhIGdldEluc3RhbmNlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2V0IGdldENSTHMoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXQgZ2V0Q2VydGlmaWNhdGVzKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2V0IGdldERpZ2VzdEFsZ29yaXRobXMoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLmNtcy5Db250ZW50SW5mbyBnZXRFbmNhcENvbnRlbnRJbmZvKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2V0IGdldFNpZ25lckluZm9zKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJJbnRlZ2VyIGdldFZlcnNpb24oKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCB0b0FTTjFPYmplY3QoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5jbXMuU2lnbmVySWRlbnRpZmllciBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkVuY29kYWJsZSBpZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xT2N0ZXRTdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5jbXMuSXNzdWVyQW5kU2VyaWFsTnVtYmVyKQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5jbXMuU2lnbmVySWRlbnRpZmllciBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSRW5jb2RhYmxlIGdldElkKCkKLQotcHVibGljIGJvb2xlYW4gaXNUYWdnZWQoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCB0b0FTTjFPYmplY3QoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5jbXMuU2lnbmVySW5mbyBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXQgYXV0aGVudGljYXRlZEF0dHJpYnV0ZXMKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyIGRpZ0FsZ29yaXRobQotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIgZGlnRW5jcnlwdGlvbkFsZ29yaXRobQotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xT2N0ZXRTdHJpbmcgZW5jcnlwdGVkRGlnZXN0Ci0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLmNtcy5TaWduZXJJZGVudGlmaWVyIHNpZAotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2V0IHVuYXV0aGVudGljYXRlZEF0dHJpYnV0ZXMKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSSW50ZWdlciB2ZXJzaW9uCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLmNtcy5TaWduZXJJZGVudGlmaWVyCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNldAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllcgotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFPY3RldFN0cmluZwotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXQpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLmNtcy5TaWduZXJJbmZvIGdldEluc3RhbmNlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2V0IGdldEF1dGhlbnRpY2F0ZWRBdHRyaWJ1dGVzKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIgZ2V0RGlnZXN0QWxnb3JpdGhtKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIgZ2V0RGlnZXN0RW5jcnlwdGlvbkFsZ29yaXRobSgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMU9jdGV0U3RyaW5nIGdldEVuY3J5cHRlZERpZ2VzdCgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuY21zLlNpZ25lcklkZW50aWZpZXIgZ2V0U0lEKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2V0IGdldFVuYXV0aGVudGljYXRlZEF0dHJpYnV0ZXMoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkludGVnZXIgZ2V0VmVyc2lvbigpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IHRvQVNOMU9iamVjdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLmNtcy5UaW1lIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFFbmNvZGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgdGltZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEudXRpbC5EYXRlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5jbXMuVGltZSBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLmNtcy5UaW1lIGdldEluc3RhbmNlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFUYWdnZWRPYmplY3QKLWJvb2xlYW4pCi0KLXB1YmxpYyBqYXZhLnV0aWwuRGF0ZSBnZXREYXRlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VGltZSgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IHRvQVNOMU9iamVjdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5jcnlwdG9wcm8uQ3J5cHRvUHJvT2JqZWN0SWRlbnRpZmllcnMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBHT1NUX2lkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgZ29zdFIyODE0N19jYmMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBnb3N0UjM0MTBfMjAwMQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGdvc3RSMzQxMF8yMDAxX0NyeXB0b1Byb19BCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgZ29zdFIzNDEwXzIwMDFfQ3J5cHRvUHJvX0IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBnb3N0UjM0MTBfMjAwMV9DcnlwdG9Qcm9fQwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGdvc3RSMzQxMF8yMDAxX0NyeXB0b1Byb19YY2hBCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgZ29zdFIzNDEwXzIwMDFfQ3J5cHRvUHJvX1hjaEIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBnb3N0UjM0MTBfOTQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBnb3N0UjM0MTBfOTRfQ3J5cHRvUHJvX0EKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBnb3N0UjM0MTBfOTRfQ3J5cHRvUHJvX0IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBnb3N0UjM0MTBfOTRfQ3J5cHRvUHJvX0MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBnb3N0UjM0MTBfOTRfQ3J5cHRvUHJvX0QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBnb3N0UjM0MTBfOTRfQ3J5cHRvUHJvX1hjaEEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBnb3N0UjM0MTBfOTRfQ3J5cHRvUHJvX1hjaEIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBnb3N0UjM0MTBfOTRfQ3J5cHRvUHJvX1hjaEMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBnb3N0UjM0MTEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBnb3N0UjM0MTFfOTRfQ3J5cHRvUHJvUGFyYW1TZXQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBnb3N0UjM0MTFfOTRfd2l0aF9nb3N0UjM0MTBfMjAwMQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGdvc3RSMzQxMV85NF93aXRoX2dvc3RSMzQxMF85NAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGdvc3RfRWxTZ0RIMzQxMF8xCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgZ29zdF9FbFNnREgzNDEwX2RlZmF1bHQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5lc2YuQ29tbWl0bWVudFR5cGVJZGVudGlmaWVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIHByb29mT2ZBcHByb3ZhbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIHByb29mT2ZDcmVhdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIHByb29mT2ZEZWxpdmVyeQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIHByb29mT2ZPcmlnaW4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBwcm9vZk9mUmVjZWlwdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIHByb29mT2ZTZW5kZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLmVzZi5Db21taXRtZW50VHlwZUluZGljYXRpb24gZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGNvbW1pdG1lbnRUeXBlSWQKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlIGNvbW1pdG1lbnRUeXBlUXVhbGlmaWVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlKQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5lc2YuQ29tbWl0bWVudFR5cGVJbmRpY2F0aW9uIGdldEluc3RhbmNlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGdldENvbW1pdG1lbnRUeXBlSWQoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSBnZXRDb21taXRtZW50VHlwZVF1YWxpZmllcigpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IHRvQVNOMU9iamVjdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLmVzZi5Db21taXRtZW50VHlwZVF1YWxpZmllciBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgY29tbWl0bWVudFR5cGVJZGVudGlmaWVyCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkVuY29kYWJsZSBxdWFsaWZpZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllcikKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJFbmNvZGFibGUpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLmVzZi5Db21taXRtZW50VHlwZVF1YWxpZmllciBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBnZXRDb21taXRtZW50VHlwZUlkZW50aWZpZXIoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkVuY29kYWJsZSBnZXRRdWFsaWZpZXIoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCB0b0FTTjFPYmplY3QoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuZXNmLkVTRkF0dHJpYnV0ZXMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgY29tbWl0bWVudFR5cGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBzaWdQb2xpY3lJZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIHNpZ25lckxvY2F0aW9uCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5lc2YuU2lnbmVyTG9jYXRpb24gZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJVVEY4U3RyaW5nIGNvdW50cnlOYW1lCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUlVURjhTdHJpbmcgbG9jYWxpdHlOYW1lCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSBwb3N0YWxBZGRyZXNzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUlVURjhTdHJpbmcKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJVVEY4U3RyaW5nCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlKQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5lc2YuU2lnbmVyTG9jYXRpb24gZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUlVURjhTdHJpbmcgZ2V0Q291bnRyeU5hbWUoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUlVURjhTdHJpbmcgZ2V0TG9jYWxpdHlOYW1lKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UgZ2V0UG9zdGFsQWRkcmVzcygpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IHRvQVNOMU9iamVjdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLmVzcy5Db250ZW50SWRlbnRpZmllciBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMU9jdGV0U3RyaW5nIHZhbHVlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFPY3RldFN0cmluZykKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYnl0ZVtdKQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5lc3MuQ29udGVudElkZW50aWZpZXIgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFPY3RldFN0cmluZyBnZXRWYWx1ZSgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IHRvQVNOMU9iamVjdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLmVzcy5FU1NDZXJ0SUQgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xT2N0ZXRTdHJpbmcgY2VydEhhc2gKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5Jc3N1ZXJTZXJpYWwgaXNzdWVyU2VyaWFsCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYnl0ZVtdKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ieXRlW10KLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5Lklzc3VlclNlcmlhbCkKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuZXNzLkVTU0NlcnRJRCBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBieXRlW10gZ2V0Q2VydEhhc2goKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuSXNzdWVyU2VyaWFsIGdldElzc3VlclNlcmlhbCgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IHRvQVNOMU9iamVjdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLmVzcy5PdGhlckNlcnRJRCBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuSXNzdWVyU2VyaWFsIGlzc3VlclNlcmlhbAotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlIG90aGVyQ2VydEhhc2gKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyCi1ieXRlW10pCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIKLWJ5dGVbXQotb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuSXNzdWVyU2VyaWFsKQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5lc3MuT3RoZXJDZXJ0SUQgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllciBnZXRBbGdvcml0aG1IYXNoKCkKLQotcHVibGljIGJ5dGVbXSBnZXRDZXJ0SGFzaCgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5Jc3N1ZXJTZXJpYWwgZ2V0SXNzdWVyU2VyaWFsKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgdG9BU04xT2JqZWN0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuZXNzLk90aGVyU2lnbmluZ0NlcnRpZmljYXRlIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFFbmNvZGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UgY2VydHMKLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UgcG9saWNpZXMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuZXNzLk90aGVyQ2VydElEKQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5lc3MuT3RoZXJTaWduaW5nQ2VydGlmaWNhdGUgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLmVzcy5PdGhlckNlcnRJRFtdIGdldENlcnRzKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LlBvbGljeUluZm9ybWF0aW9uW10gZ2V0UG9saWNpZXMoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCB0b0FTTjFPYmplY3QoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5lc3MuU2lnbmluZ0NlcnRpZmljYXRlIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFFbmNvZGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UgY2VydHMKLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UgcG9saWNpZXMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuZXNzLkVTU0NlcnRJRCkKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuZXNzLlNpZ25pbmdDZXJ0aWZpY2F0ZSBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuZXNzLkVTU0NlcnRJRFtdIGdldENlcnRzKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LlBvbGljeUluZm9ybWF0aW9uW10gZ2V0UG9saWNpZXMoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCB0b0FTTjFPYmplY3QoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuZ251LkdOVU9iamVjdElkZW50aWZpZXJzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIENSQwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIENSQzMyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgR05VCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgR251UEcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBHbnVSYWRhcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIFNlcnBlbnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBTZXJwZW50XzEyOF9DQkMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBTZXJwZW50XzEyOF9DRkIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBTZXJwZW50XzEyOF9FQ0IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBTZXJwZW50XzEyOF9PRkIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBTZXJwZW50XzE5Ml9DQkMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBTZXJwZW50XzE5Ml9DRkIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBTZXJwZW50XzE5Ml9FQ0IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBTZXJwZW50XzE5Ml9PRkIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBTZXJwZW50XzI1Nl9DQkMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBTZXJwZW50XzI1Nl9DRkIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBTZXJwZW50XzI1Nl9FQ0IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBTZXJwZW50XzI1Nl9PRkIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBUaWdlcl8xOTIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBkaWdlc3RBbGdvcml0aG0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBlbmNyeXB0aW9uQWxnb3JpdGhtCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgbm90YXRpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBwa2FBZGRyZXNzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuaWFuYS5JQU5BT2JqZWN0SWRlbnRpZmllcnMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgaG1hY01ENQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGhtYWNSSVBFTUQxNjAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBobWFjU0hBMQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGhtYWNUSUdFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGlzYWttcE9ha2xleQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuaWNhby5EYXRhR3JvdXBIYXNoIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFFbmNvZGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xT2N0ZXRTdHJpbmcgZGF0YUdyb3VwSGFzaFZhbHVlCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSSW50ZWdlciBkYXRhR3JvdXBOdW1iZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xT2N0ZXRTdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLmljYW8uRGF0YUdyb3VwSGFzaCBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMU9jdGV0U3RyaW5nIGdldERhdGFHcm91cEhhc2hWYWx1ZSgpCi0KLXB1YmxpYyBpbnQgZ2V0RGF0YUdyb3VwTnVtYmVyKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgdG9BU04xT2JqZWN0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLmljYW8uSUNBT09iamVjdElkZW50aWZpZXJzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgaWRfaWNhbwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGlkX2ljYW9fbGRzU2VjdXJpdHlPYmplY3QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBpZF9pY2FvX21ydGQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBpZF9pY2FvX21ydGRfc2VjdXJpdHkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLmljYW8uTERTU2VjdXJpdHlPYmplY3QgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZSBpbXBsZW1lbnRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5pY2FvLklDQU9PYmplY3RJZGVudGlmaWVycwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB1Yl9EYXRhR3JvdXBzCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuaWNhby5EYXRhR3JvdXBIYXNoW10gZGF0YWdyb3VwSGFzaAotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllciBkaWdlc3RBbGdvcml0aG1JZGVudGlmaWVyCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSSW50ZWdlciB2ZXJzaW9uCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllcgotb3JnLmJvdW5jeWNhc3RsZS5hc24xLmljYW8uRGF0YUdyb3VwSGFzaFtdKQotCi1wcml2YXRlIHZvaWQgY2hlY2tEYXRhZ3JvdXBIYXNoU2VxU2l6ZSgKLWludCkKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuaWNhby5MRFNTZWN1cml0eU9iamVjdCBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuaWNhby5EYXRhR3JvdXBIYXNoW10gZ2V0RGF0YWdyb3VwSGFzaCgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyIGdldERpZ2VzdEFsZ29yaXRobUlkZW50aWZpZXIoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCB0b0FTTjFPYmplY3QoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5taXNjLklERUFDQkNQYXIgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFPY3RldFN0cmluZyBpdgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWJ5dGVbXSkKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEubWlzYy5JREVBQ0JDUGFyIGdldEluc3RhbmNlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGJ5dGVbXSBnZXRJVigpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IHRvQVNOMU9iamVjdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5taXNjLk1pc2NPYmplY3RJZGVudGlmaWVycyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIG5ldHNjYXBlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgbmV0c2NhcGVCYXNlVVJMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgbmV0c2NhcGVDQVJldm9jYXRpb25VUkwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBuZXRzY2FwZUNBcG9saWN5VVJMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgbmV0c2NhcGVDZXJ0Q29tbWVudAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIG5ldHNjYXBlQ2VydFR5cGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBuZXRzY2FwZVJlbmV3YWxVUkwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBuZXRzY2FwZVJldm9jYXRpb25VUkwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBuZXRzY2FwZVNTTFNlcnZlck5hbWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIHZlcmlzaWduCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgdmVyaXNpZ25DemFnRXh0ZW5zaW9uCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5taXNjLk5ldHNjYXBlQ2VydFR5cGUgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSQml0U3RyaW5nCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG9iamVjdFNpZ25pbmcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgb2JqZWN0U2lnbmluZ0NBCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHJlc2VydmVkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNtaW1lCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNtaW1lQ0EKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3NsQ0EKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3NsQ2xpZW50Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNzbFNlcnZlcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkJpdFN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5taXNjLk5ldHNjYXBlUmV2b2NhdGlvblVSTCBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJJQTVTdHJpbmcKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSSUE1U3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLm1pc2MuVmVyaXNpZ25DemFnRXh0ZW5zaW9uIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUklBNVN0cmluZwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJJQTVTdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEubW96aWxsYS5QdWJsaWNLZXlBbmRDaGFsbGVuZ2UgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJJQTVTdHJpbmcgY2hhbGxlbmdlCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSBwa2FjU2VxCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuU3ViamVjdFB1YmxpY0tleUluZm8gc3BraQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLm1vemlsbGEuUHVibGljS2V5QW5kQ2hhbGxlbmdlIGdldEluc3RhbmNlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJJQTVTdHJpbmcgZ2V0Q2hhbGxlbmdlKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LlN1YmplY3RQdWJsaWNLZXlJbmZvIGdldFN1YmplY3RQdWJsaWNLZXlJbmZvKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgdG9BU04xT2JqZWN0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLm5pc3QuTklTVE9iamVjdElkZW50aWZpZXJzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgYWVzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgZHNhX3dpdGhfc2hhMjI0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgZHNhX3dpdGhfc2hhMjU2Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgaWRfYWVzMTI4X0NCQwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGlkX2FlczEyOF9DRkIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBpZF9hZXMxMjhfRUNCCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgaWRfYWVzMTI4X09GQgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGlkX2FlczEyOF93cmFwCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgaWRfYWVzMTkyX0NCQwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGlkX2FlczE5Ml9DRkIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBpZF9hZXMxOTJfRUNCCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgaWRfYWVzMTkyX09GQgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGlkX2FlczE5Ml93cmFwCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgaWRfYWVzMjU2X0NCQwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGlkX2FlczI1Nl9DRkIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBpZF9hZXMyNTZfRUNCCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgaWRfYWVzMjU2X09GQgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGlkX2FlczI1Nl93cmFwCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgaWRfZHNhX3dpdGhfc2hhMgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGlkX3NoYTIyNAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGlkX3NoYTI1NgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGlkX3NoYTM4NAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGlkX3NoYTUxMgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgbmlzdEFsZ29yaXRobQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEub2NzcC5CYXNpY09DU1BSZXNwb25zZSBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSBjZXJ0cwotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJCaXRTdHJpbmcgc2lnbmF0dXJlCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllciBzaWduYXR1cmVBbGdvcml0aG0KLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEub2NzcC5SZXNwb25zZURhdGEgdGJzUmVzcG9uc2VEYXRhCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLm9jc3AuUmVzcG9uc2VEYXRhCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSQml0U3RyaW5nCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlKQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5vY3NwLkJhc2ljT0NTUFJlc3BvbnNlIGdldEluc3RhbmNlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEub2NzcC5CYXNpY09DU1BSZXNwb25zZSBnZXRJbnN0YW5jZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xVGFnZ2VkT2JqZWN0Ci1ib29sZWFuKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSBnZXRDZXJ0cygpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSQml0U3RyaW5nIGdldFNpZ25hdHVyZSgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyIGdldFNpZ25hdHVyZUFsZ29yaXRobSgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEub2NzcC5SZXNwb25zZURhdGEgZ2V0VGJzUmVzcG9uc2VEYXRhKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgdG9BU04xT2JqZWN0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEub2NzcC5DZXJ0SUQgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllciBoYXNoQWxnb3JpdGhtCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMU9jdGV0U3RyaW5nIGlzc3VlcktleUhhc2gKLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xT2N0ZXRTdHJpbmcgaXNzdWVyTmFtZUhhc2gKLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJJbnRlZ2VyIHNlcmlhbE51bWJlcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xT2N0ZXRTdHJpbmcKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xT2N0ZXRTdHJpbmcKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJJbnRlZ2VyKQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5vY3NwLkNlcnRJRCBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLm9jc3AuQ2VydElEIGdldEluc3RhbmNlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFUYWdnZWRPYmplY3QKLWJvb2xlYW4pCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyIGdldEhhc2hBbGdvcml0aG0oKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFPY3RldFN0cmluZyBnZXRJc3N1ZXJLZXlIYXNoKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xT2N0ZXRTdHJpbmcgZ2V0SXNzdWVyTmFtZUhhc2goKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkludGVnZXIgZ2V0U2VyaWFsTnVtYmVyKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgdG9BU04xT2JqZWN0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEub2NzcC5DZXJ0U3RhdHVzIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFFbmNvZGFibGUgaW1wbGVtZW50cyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUNob2ljZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGludCB0YWdObwotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJFbmNvZGFibGUgdmFsdWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJFbmNvZGFibGUpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xVGFnZ2VkT2JqZWN0KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEub2NzcC5SZXZva2VkSW5mbykKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEub2NzcC5DZXJ0U3RhdHVzIGdldEluc3RhbmNlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEub2NzcC5DZXJ0U3RhdHVzIGdldEluc3RhbmNlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFUYWdnZWRPYmplY3QKLWJvb2xlYW4pCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSRW5jb2RhYmxlIGdldFN0YXR1cygpCi0KLXB1YmxpYyBpbnQgZ2V0VGFnTm8oKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCB0b0FTTjFPYmplY3QoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5vY3NwLkNybElEIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFFbmNvZGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJJbnRlZ2VyIGNybE51bQotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkdlbmVyYWxpemVkVGltZSBjcmxUaW1lCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSSUE1U3RyaW5nIGNybFVybAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSSW50ZWdlciBnZXRDcmxOdW0oKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkdlbmVyYWxpemVkVGltZSBnZXRDcmxUaW1lKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJJQTVTdHJpbmcgZ2V0Q3JsVXJsKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgdG9BU04xT2JqZWN0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLm9jc3AuT0NTUE9iamVjdElkZW50aWZpZXJzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGlkX3BraXhfb2NzcAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGlkX3BraXhfb2NzcF9hcmNoaXZlX2N1dG9mZgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGlkX3BraXhfb2NzcF9iYXNpYwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGlkX3BraXhfb2NzcF9jcmwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBpZF9wa2l4X29jc3Bfbm9jaGVjawotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGlkX3BraXhfb2NzcF9ub25jZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGlkX3BraXhfb2NzcF9yZXNwb25zZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGlkX3BraXhfb2NzcF9zZXJ2aWNlX2xvY2F0b3IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIHBraXhfb2NzcAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEub2NzcC5PQ1NQUmVxdWVzdCBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEub2NzcC5TaWduYXR1cmUgb3B0aW9uYWxTaWduYXR1cmUKLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5vY3NwLlRCU1JlcXVlc3QgdGJzUmVxdWVzdAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5vY3NwLlRCU1JlcXVlc3QKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5vY3NwLlNpZ25hdHVyZSkKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEub2NzcC5PQ1NQUmVxdWVzdCBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLm9jc3AuT0NTUFJlcXVlc3QgZ2V0SW5zdGFuY2UoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVRhZ2dlZE9iamVjdAotYm9vbGVhbikKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5vY3NwLlNpZ25hdHVyZSBnZXRPcHRpb25hbFNpZ25hdHVyZSgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEub2NzcC5UQlNSZXF1ZXN0IGdldFRic1JlcXVlc3QoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCB0b0FTTjFPYmplY3QoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5vY3NwLk9DU1BSZXNwb25zZSBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEub2NzcC5SZXNwb25zZUJ5dGVzIHJlc3BvbnNlQnl0ZXMKLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5vY3NwLk9DU1BSZXNwb25zZVN0YXR1cyByZXNwb25zZVN0YXR1cwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5vY3NwLk9DU1BSZXNwb25zZVN0YXR1cwotb3JnLmJvdW5jeWNhc3RsZS5hc24xLm9jc3AuUmVzcG9uc2VCeXRlcykKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEub2NzcC5PQ1NQUmVzcG9uc2UgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5vY3NwLk9DU1BSZXNwb25zZSBnZXRJbnN0YW5jZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xVGFnZ2VkT2JqZWN0Ci1ib29sZWFuKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLm9jc3AuUmVzcG9uc2VCeXRlcyBnZXRSZXNwb25zZUJ5dGVzKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5vY3NwLk9DU1BSZXNwb25zZVN0YXR1cyBnZXRSZXNwb25zZVN0YXR1cygpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IHRvQVNOMU9iamVjdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLm9jc3AuT0NTUFJlc3BvbnNlU3RhdHVzIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkVudW1lcmF0ZWQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJOQUxfRVJST1IKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFMRk9STUVEX1JFUVVFU1QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0lHX1JFUVVJUkVECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNVQ0NFU1NGVUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFJZX0xBVEVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOQVVUSE9SSVpFRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkVudW1lcmF0ZWQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLm9jc3AuUmVxdWVzdCBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEub2NzcC5DZXJ0SUQgcmVxQ2VydAotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuWDUwOUV4dGVuc2lvbnMgc2luZ2xlUmVxdWVzdEV4dGVuc2lvbnMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEub2NzcC5DZXJ0SUQKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5Llg1MDlFeHRlbnNpb25zKQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5vY3NwLlJlcXVlc3QgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5vY3NwLlJlcXVlc3QgZ2V0SW5zdGFuY2UoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVRhZ2dlZE9iamVjdAotYm9vbGVhbikKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5vY3NwLkNlcnRJRCBnZXRSZXFDZXJ0KCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5Llg1MDlFeHRlbnNpb25zIGdldFNpbmdsZVJlcXVlc3RFeHRlbnNpb25zKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgdG9BU04xT2JqZWN0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEub2NzcC5SZXNwb25kZXJJRCBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlIGltcGxlbWVudHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFDaG9pY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSRW5jb2RhYmxlIHZhbHVlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFPY3RldFN0cmluZykKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuWDUwOU5hbWUpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLm9jc3AuUmVzcG9uZGVySUQgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5vY3NwLlJlc3BvbmRlcklEIGdldEluc3RhbmNlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFUYWdnZWRPYmplY3QKLWJvb2xlYW4pCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IHRvQVNOMU9iamVjdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLm9jc3AuUmVzcG9uc2VCeXRlcyBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMU9jdGV0U3RyaW5nIHJlc3BvbnNlCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciByZXNwb25zZVR5cGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllcgotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFPY3RldFN0cmluZykKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEub2NzcC5SZXNwb25zZUJ5dGVzIGdldEluc3RhbmNlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEub2NzcC5SZXNwb25zZUJ5dGVzIGdldEluc3RhbmNlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFUYWdnZWRPYmplY3QKLWJvb2xlYW4pCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMU9jdGV0U3RyaW5nIGdldFJlc3BvbnNlKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGdldFJlc3BvbnNlVHlwZSgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IHRvQVNOMU9iamVjdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLm9jc3AuUmVzcG9uc2VEYXRhIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFFbmNvZGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkludGVnZXIgVjEKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSR2VuZXJhbGl6ZWRUaW1lIHByb2R1Y2VkQXQKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEub2NzcC5SZXNwb25kZXJJRCByZXNwb25kZXJJRAotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5Llg1MDlFeHRlbnNpb25zIHJlc3BvbnNlRXh0ZW5zaW9ucwotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UgcmVzcG9uc2VzCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkludGVnZXIgdmVyc2lvbgotCi1wcml2YXRlIGJvb2xlYW4gdmVyc2lvblByZXNlbnQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJJbnRlZ2VyCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEub2NzcC5SZXNwb25kZXJJRAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkdlbmVyYWxpemVkVGltZQotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZQotb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuWDUwOUV4dGVuc2lvbnMpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5vY3NwLlJlc3BvbmRlcklECi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSR2VuZXJhbGl6ZWRUaW1lCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5YNTA5RXh0ZW5zaW9ucykKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEub2NzcC5SZXNwb25zZURhdGEgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5vY3NwLlJlc3BvbnNlRGF0YSBnZXRJbnN0YW5jZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xVGFnZ2VkT2JqZWN0Ci1ib29sZWFuKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkdlbmVyYWxpemVkVGltZSBnZXRQcm9kdWNlZEF0KCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5vY3NwLlJlc3BvbmRlcklEIGdldFJlc3BvbmRlcklEKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5Llg1MDlFeHRlbnNpb25zIGdldFJlc3BvbnNlRXh0ZW5zaW9ucygpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlIGdldFJlc3BvbnNlcygpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSSW50ZWdlciBnZXRWZXJzaW9uKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgdG9BU04xT2JqZWN0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEub2NzcC5SZXZva2VkSW5mbyBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQ1JMUmVhc29uIHJldm9jYXRpb25SZWFzb24KLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSR2VuZXJhbGl6ZWRUaW1lIHJldm9jYXRpb25UaW1lCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkdlbmVyYWxpemVkVGltZQotb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQ1JMUmVhc29uKQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5vY3NwLlJldm9rZWRJbmZvIGdldEluc3RhbmNlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEub2NzcC5SZXZva2VkSW5mbyBnZXRJbnN0YW5jZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xVGFnZ2VkT2JqZWN0Ci1ib29sZWFuKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQ1JMUmVhc29uIGdldFJldm9jYXRpb25SZWFzb24oKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkdlbmVyYWxpemVkVGltZSBnZXRSZXZvY2F0aW9uVGltZSgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IHRvQVNOMU9iamVjdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLm9jc3AuU2VydmljZUxvY2F0b3IgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuWDUwOU5hbWUgaXNzdWVyCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IGxvY2F0b3IKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCB0b0FTTjFPYmplY3QoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5vY3NwLlNpZ25hdHVyZSBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlIGNlcnRzCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSQml0U3RyaW5nIHNpZ25hdHVyZQotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllciBzaWduYXR1cmVBbGdvcml0aG0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSQml0U3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSQml0U3RyaW5nCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlKQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5vY3NwLlNpZ25hdHVyZSBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLm9jc3AuU2lnbmF0dXJlIGdldEluc3RhbmNlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFUYWdnZWRPYmplY3QKLWJvb2xlYW4pCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlIGdldENlcnRzKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJCaXRTdHJpbmcgZ2V0U2lnbmF0dXJlKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIgZ2V0U2lnbmF0dXJlQWxnb3JpdGhtKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgdG9BU04xT2JqZWN0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEub2NzcC5TaW5nbGVSZXNwb25zZSBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLm9jc3AuQ2VydElEIGNlcnRJRAotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5vY3NwLkNlcnRTdGF0dXMgY2VydFN0YXR1cwotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJHZW5lcmFsaXplZFRpbWUgbmV4dFVwZGF0ZQotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5Llg1MDlFeHRlbnNpb25zIHNpbmdsZUV4dGVuc2lvbnMKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSR2VuZXJhbGl6ZWRUaW1lIHRoaXNVcGRhdGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEub2NzcC5DZXJ0SUQKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5vY3NwLkNlcnRTdGF0dXMKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJHZW5lcmFsaXplZFRpbWUKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJHZW5lcmFsaXplZFRpbWUKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5Llg1MDlFeHRlbnNpb25zKQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5vY3NwLlNpbmdsZVJlc3BvbnNlIGdldEluc3RhbmNlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEub2NzcC5TaW5nbGVSZXNwb25zZSBnZXRJbnN0YW5jZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xVGFnZ2VkT2JqZWN0Ci1ib29sZWFuKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLm9jc3AuQ2VydElEIGdldENlcnRJRCgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEub2NzcC5DZXJ0U3RhdHVzIGdldENlcnRTdGF0dXMoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkdlbmVyYWxpemVkVGltZSBnZXROZXh0VXBkYXRlKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5Llg1MDlFeHRlbnNpb25zIGdldFNpbmdsZUV4dGVuc2lvbnMoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkdlbmVyYWxpemVkVGltZSBnZXRUaGlzVXBkYXRlKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgdG9BU04xT2JqZWN0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEub2NzcC5UQlNSZXF1ZXN0IGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFFbmNvZGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkludGVnZXIgVjEKLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5Llg1MDlFeHRlbnNpb25zIHJlcXVlc3RFeHRlbnNpb25zCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlIHJlcXVlc3RMaXN0Ci0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5HZW5lcmFsTmFtZSByZXF1ZXN0b3JOYW1lCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSSW50ZWdlciB2ZXJzaW9uCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5HZW5lcmFsTmFtZQotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZQotb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuWDUwOUV4dGVuc2lvbnMpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLm9jc3AuVEJTUmVxdWVzdCBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLm9jc3AuVEJTUmVxdWVzdCBnZXRJbnN0YW5jZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xVGFnZ2VkT2JqZWN0Ci1ib29sZWFuKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuWDUwOUV4dGVuc2lvbnMgZ2V0UmVxdWVzdEV4dGVuc2lvbnMoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSBnZXRSZXF1ZXN0TGlzdCgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5HZW5lcmFsTmFtZSBnZXRSZXF1ZXN0b3JOYW1lKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJJbnRlZ2VyIGdldFZlcnNpb24oKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCB0b0FTTjFPYmplY3QoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEub2l3Lk9JV09iamVjdElkZW50aWZpZXJzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGRlc0NCQwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGRzYVdpdGhTSEExCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgZWxHYW1hbEFsZ29yaXRobQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGlkU0hBMQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIG1kNFdpdGhSU0EKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBtZDRXaXRoUlNBRW5jcnlwdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIG1kNVdpdGhSU0EKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBzaGExV2l0aFJTQQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEucGtjcy5BdHRyaWJ1dGUgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGF0dHJUeXBlCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXQgYXR0clZhbHVlcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNldCkKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEucGtjcy5BdHRyaWJ1dGUgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgZ2V0QXR0clR5cGUoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXQgZ2V0QXR0clZhbHVlcygpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IHRvQVNOMU9iamVjdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLnBrY3MuQXV0aGVudGljYXRlZFNhZmUgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLnBrY3MuQ29udGVudEluZm9bXSBpbmZvCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLnBrY3MuQ29udGVudEluZm9bXSkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5wa2NzLkNvbnRlbnRJbmZvW10gZ2V0Q29udGVudEluZm8oKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCB0b0FTTjFPYmplY3QoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5wa2NzLkNlcnRCYWcgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgY2VydElkCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IGNlcnRWYWx1ZQotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSBzZXEKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllcgotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGdldENlcnRJZCgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IGdldENlcnRWYWx1ZSgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IHRvQVNOMU9iamVjdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLnBrY3MuQ2VydGlmaWNhdGlvblJlcXVlc3QgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgb3JnLmJvdW5jeWNhc3RsZS5hc24xLnBrY3MuQ2VydGlmaWNhdGlvblJlcXVlc3RJbmZvIHJlcUluZm8KLQotcHJvdGVjdGVkIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIgc2lnQWxnSWQKLQotcHJvdGVjdGVkIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJCaXRTdHJpbmcgc2lnQml0cwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5wa2NzLkNlcnRpZmljYXRpb25SZXF1ZXN0SW5mbwotb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllcgotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkJpdFN0cmluZykKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5wa2NzLkNlcnRpZmljYXRpb25SZXF1ZXN0SW5mbyBnZXRDZXJ0aWZpY2F0aW9uUmVxdWVzdEluZm8oKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkJpdFN0cmluZyBnZXRTaWduYXR1cmUoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllciBnZXRTaWduYXR1cmVBbGdvcml0aG0oKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCB0b0FTTjFPYmplY3QoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5wa2NzLkNlcnRpZmljYXRpb25SZXF1ZXN0SW5mbyBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNldCBhdHRyaWJ1dGVzCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5YNTA5TmFtZSBzdWJqZWN0Ci0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5TdWJqZWN0UHVibGljS2V5SW5mbyBzdWJqZWN0UEtJbmZvCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSSW50ZWdlciB2ZXJzaW9uCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuWDUwOU5hbWUKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LlN1YmplY3RQdWJsaWNLZXlJbmZvCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNldCkKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEucGtjcy5DZXJ0aWZpY2F0aW9uUmVxdWVzdEluZm8gZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXQgZ2V0QXR0cmlidXRlcygpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5YNTA5TmFtZSBnZXRTdWJqZWN0KCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LlN1YmplY3RQdWJsaWNLZXlJbmZvIGdldFN1YmplY3RQdWJsaWNLZXlJbmZvKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJJbnRlZ2VyIGdldFZlcnNpb24oKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCB0b0FTTjFPYmplY3QoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEucGtjcy5QS0NTT2JqZWN0SWRlbnRpZmllcnMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgUkMyX0NCQwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgYmFndHlwZXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBjYW5Ob3REZWNyeXB0QW55Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgY2VydEJhZwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGNybEJhZwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGRhdGEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBkZXNfRURFM19DQkMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBkaEtleUFncmVlbWVudAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgZGlnZXN0QWxnb3JpdGhtCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgZGlnZXN0ZWREYXRhCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgZW5jcnlwdGVkRGF0YQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgZW5jcnlwdGlvbkFsZ29yaXRobQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGVudmVsb3BlZERhdGEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBpZF9QQkVTMgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGlkX1BCS0RGMgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGlkX1JTQUVTX09BRVAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBpZF9SU0FTU0FfUFNTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBpZF9hYQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGlkX2FhX2NvbW1pdG1lbnRUeXBlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgaWRfYWFfY29udGVudElkZW50aWZpZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBpZF9hYV9lbmNyeXBLZXlQcmVmCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgaWRfYWFfb3RoZXJTaWdDZXJ0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgaWRfYWFfcmVjZWlwdFJlcXVlc3QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBpZF9hYV9zaWdQb2xpY3lJZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGlkX2FhX3NpZ25hdHVyZVRpbWVTdGFtcFRva2VuCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgaWRfYWFfc2lnbmVyTG9jYXRpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBpZF9hYV9zaWduaW5nQ2VydGlmaWNhdGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBpZF9hbGdfUFdSSV9LRUsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGlkX2N0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgaWRfY3RfVFNUSW5mbwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGlkX2N0X2NvbXByZXNzZWREYXRhCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBpZF9jdGkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBpZF9jdGlfZXRzX3Byb29mT2ZBcHByb3ZhbAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGlkX2N0aV9ldHNfcHJvb2ZPZkNyZWF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgaWRfY3RpX2V0c19wcm9vZk9mRGVsaXZlcnkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBpZF9jdGlfZXRzX3Byb29mT2ZPcmlnaW4KLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBpZF9jdGlfZXRzX3Byb29mT2ZSZWNlaXB0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgaWRfY3RpX2V0c19wcm9vZk9mU2VuZGVyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgaWRfaG1hY1dpdGhTSEExCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgaWRfaG1hY1dpdGhTSEEyMjQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBpZF9obWFjV2l0aFNIQTI1NgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGlkX2htYWNXaXRoU0hBMzg0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgaWRfaG1hY1dpdGhTSEE1MTIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBpZF9tZ2YxCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgaWRfcFNwZWNpZmllZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGtleUJhZwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIG1kMgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIG1kMldpdGhSU0FFbmNyeXB0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgbWQ0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgbWQ0V2l0aFJTQUVuY3J5cHRpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBtZDUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBtZDVXaXRoUlNBRW5jcnlwdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIHBiZVdpdGhNRDJBbmRERVNfQ0JDCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgcGJlV2l0aE1EMkFuZFJDMl9DQkMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBwYmVXaXRoTUQ1QW5kREVTX0NCQwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIHBiZVdpdGhNRDVBbmRSQzJfQ0JDCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgcGJlV2l0aFNIQTFBbmRERVNfQ0JDCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgcGJlV2l0aFNIQTFBbmRSQzJfQ0JDCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgcGJlV2l0aFNIQUFuZDEyOEJpdFJDMl9DQkMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBwYmVXaXRoU0hBQW5kMTI4Qml0UkM0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgcGJlV2l0aFNIQUFuZDJfS2V5VHJpcGxlREVTX0NCQwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIHBiZVdpdGhTSEFBbmQzX0tleVRyaXBsZURFU19DQkMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBwYmVXaXRoU0hBQW5kNDBCaXRSQzQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBwYmV3aXRoU0hBQW5kNDBCaXRSQzJfQ0JDCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgcGtjczhTaHJvdWRlZEtleUJhZwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgcGtjc18xCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBwa2NzXzEyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBwa2NzXzEyUGJlSWRzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBwa2NzXzMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIHBrY3NfNQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgcGtjc183Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBwa2NzXzkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBwa2NzXzlfYXRfY2hhbGxlbmdlUGFzc3dvcmQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBwa2NzXzlfYXRfY29udGVudFR5cGUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBwa2NzXzlfYXRfY291bnRlclNpZ25hdHVyZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIHBrY3NfOV9hdF9lbWFpbEFkZHJlc3MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBwa2NzXzlfYXRfZXh0ZW5kZWRDZXJ0aWZpY2F0ZUF0dHJpYnV0ZXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBwa2NzXzlfYXRfZXh0ZW5zaW9uUmVxdWVzdAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIHBrY3NfOV9hdF9mcmllbmRseU5hbWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBwa2NzXzlfYXRfbG9jYWxLZXlJZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIHBrY3NfOV9hdF9tZXNzYWdlRGlnZXN0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgcGtjc185X2F0X3NpZ25pbmdEZXNjcmlwdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIHBrY3NfOV9hdF9zaWduaW5nVGltZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIHBrY3NfOV9hdF9zbWltZUNhcGFiaWxpdGllcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIHBrY3NfOV9hdF91bnN0cnVjdHVyZWRBZGRyZXNzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgcGtjc185X2F0X3Vuc3RydWN0dXJlZE5hbWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBwcmVmZXJTaWduZWREYXRhCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgcnNhRW5jcnlwdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIHNNSU1FQ2FwYWJpbGl0aWVzVmVyc2lvbnMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBzYWZlQ29udGVudHNCYWcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBzZWNyZXRCYWcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBzaGExV2l0aFJTQUVuY3J5cHRpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBzaGEyMjRXaXRoUlNBRW5jcnlwdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIHNoYTI1NldpdGhSU0FFbmNyeXB0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgc2hhMzg0V2l0aFJTQUVuY3J5cHRpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBzaGE1MTJXaXRoUlNBRW5jcnlwdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIHNpZ25lZEFuZEVudmVsb3BlZERhdGEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBzaWduZWREYXRhCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgc3JzYU9BRVBFbmNyeXB0aW9uU0VUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgeDUwOWNlcnRUeXBlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5wa2NzLkNvbnRlbnRJbmZvIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFFbmNvZGFibGUgaW1wbGVtZW50cyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEucGtjcy5QS0NTT2JqZWN0SWRlbnRpZmllcnMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSRW5jb2RhYmxlIGNvbnRlbnQKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBjb250ZW50VHlwZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSRW5jb2RhYmxlKQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5wa2NzLkNvbnRlbnRJbmZvIGdldEluc3RhbmNlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJFbmNvZGFibGUgZ2V0Q29udGVudCgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBnZXRDb250ZW50VHlwZSgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IHRvQVNOMU9iamVjdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLnBrY3MuREhQYXJhbWV0ZXIgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkludGVnZXIgZwotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkludGVnZXIgbAotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkludGVnZXIgcAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1qYXZhLm1hdGguQmlnSW50ZWdlcgotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgZ2V0RygpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRMKCkKLQotcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldFAoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCB0b0FTTjFPYmplY3QoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5wa2NzLkVuY3J5cHRlZERhdGEgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgYmFnSWQKLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgYmFnVmFsdWUKLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UgZGF0YQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSRW5jb2RhYmxlKQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5wa2NzLkVuY3J5cHRlZERhdGEgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFPY3RldFN0cmluZyBnZXRDb250ZW50KCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGdldENvbnRlbnRUeXBlKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIgZ2V0RW5jcnlwdGlvbkFsZ29yaXRobSgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IHRvQVNOMU9iamVjdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLnBrY3MuRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8gZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIgYWxnSWQKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMU9jdGV0U3RyaW5nIGRhdGEKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyCi1ieXRlW10pCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLnBrY3MuRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8gZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYnl0ZVtdIGdldEVuY3J5cHRlZERhdGEoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllciBnZXRFbmNyeXB0aW9uQWxnb3JpdGhtKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgdG9BU04xT2JqZWN0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFFbmNvZGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBvYmplY3RJZAotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJFbmNvZGFibGUgcGFyYW1ldGVycwotCi1wcml2YXRlIGJvb2xlYW4gcGFyYW1ldGVyc0RlZmluZWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllcikKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJFbmNvZGFibGUpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllciBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllciBnZXRJbnN0YW5jZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xVGFnZ2VkT2JqZWN0Ci1ib29sZWFuKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgZ2V0T2JqZWN0SWQoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkVuY29kYWJsZSBnZXRQYXJhbWV0ZXJzKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgdG9BU04xT2JqZWN0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEucGtjcy5FbmNyeXB0aW9uU2NoZW1lIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCBvYmoKLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3Qgb2JqZWN0SWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCBnZXRERVJPYmplY3QoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCBnZXRPYmplY3QoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5wa2NzLklzc3VlckFuZFNlcmlhbE51bWJlciBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSSW50ZWdlciBjZXJ0U2VyaWFsTnVtYmVyCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5YNTA5TmFtZSBuYW1lCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuWDUwOU5hbWUKLWphdmEubWF0aC5CaWdJbnRlZ2VyKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5YNTA5TmFtZQotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkludGVnZXIpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLnBrY3MuSXNzdWVyQW5kU2VyaWFsTnVtYmVyIGdldEluc3RhbmNlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJJbnRlZ2VyIGdldENlcnRpZmljYXRlU2VyaWFsTnVtYmVyKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5Llg1MDlOYW1lIGdldE5hbWUoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCB0b0FTTjFPYmplY3QoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5wa2NzLktleURlcml2YXRpb25GdW5jIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UpCi0KLSB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEucGtjcy5NYWNEYXRhIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFFbmNvZGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkRpZ2VzdEluZm8gZGlnSW5mbwotCi0gamF2YS5tYXRoLkJpZ0ludGVnZXIgaXRlcmF0aW9uQ291bnQKLQotIGJ5dGVbXSBzYWx0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuRGlnZXN0SW5mbwotYnl0ZVtdCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLnBrY3MuTWFjRGF0YSBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRJdGVyYXRpb25Db3VudCgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5EaWdlc3RJbmZvIGdldE1hYygpCi0KLXB1YmxpYyBieXRlW10gZ2V0U2FsdCgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IHRvQVNOMU9iamVjdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLnBrY3MuUEJFUzJBbGdvcml0aG1zIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllciBpbXBsZW1lbnRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5wa2NzLlBLQ1NPYmplY3RJZGVudGlmaWVycwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5wa2NzLktleURlcml2YXRpb25GdW5jIGZ1bmMKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBvYmplY3RJZAotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5wa2NzLkVuY3J5cHRpb25TY2hlbWUgc2NoZW1lCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgZ2V0REVST2JqZWN0KCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5wa2NzLkVuY3J5cHRpb25TY2hlbWUgZ2V0RW5jcnlwdGlvblNjaGVtZSgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEucGtjcy5LZXlEZXJpdmF0aW9uRnVuYyBnZXRLZXlEZXJpdmF0aW9uRnVuYygpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBnZXRPYmplY3RJZCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLnBrY3MuUEJFUzJQYXJhbWV0ZXJzIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFFbmNvZGFibGUgaW1wbGVtZW50cyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEucGtjcy5QS0NTT2JqZWN0SWRlbnRpZmllcnMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEucGtjcy5LZXlEZXJpdmF0aW9uRnVuYyBmdW5jCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLnBrY3MuRW5jcnlwdGlvblNjaGVtZSBzY2hlbWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLnBrY3MuRW5jcnlwdGlvblNjaGVtZSBnZXRFbmNyeXB0aW9uU2NoZW1lKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5wa2NzLktleURlcml2YXRpb25GdW5jIGdldEtleURlcml2YXRpb25GdW5jKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgdG9BU04xT2JqZWN0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEucGtjcy5QQktERjJQYXJhbXMgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkludGVnZXIgaXRlcmF0aW9uQ291bnQKLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJJbnRlZ2VyIGtleUxlbmd0aAotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFPY3RldFN0cmluZyBvY3RTdHIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ieXRlW10KLWludCkKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEucGtjcy5QQktERjJQYXJhbXMgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgZ2V0SXRlcmF0aW9uQ291bnQoKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgZ2V0S2V5TGVuZ3RoKCkKLQotcHVibGljIGJ5dGVbXSBnZXRTYWx0KCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgdG9BU04xT2JqZWN0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEucGtjcy5QS0NTMTJQQkVQYXJhbXMgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkludGVnZXIgaXRlcmF0aW9ucwotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFPY3RldFN0cmluZyBpdgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWJ5dGVbXQotaW50KQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5wa2NzLlBLQ1MxMlBCRVBhcmFtcyBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBieXRlW10gZ2V0SVYoKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgZ2V0SXRlcmF0aW9ucygpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IHRvQVNOMU9iamVjdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLnBrY3MuUGZ4IGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFFbmNvZGFibGUgaW1wbGVtZW50cyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEucGtjcy5QS0NTT2JqZWN0SWRlbnRpZmllcnMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEucGtjcy5Db250ZW50SW5mbyBjb250ZW50SW5mbwotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5wa2NzLk1hY0RhdGEgbWFjRGF0YQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5wa2NzLkNvbnRlbnRJbmZvCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEucGtjcy5NYWNEYXRhKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLnBrY3MuQ29udGVudEluZm8gZ2V0QXV0aFNhZmUoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLnBrY3MuTWFjRGF0YSBnZXRNYWNEYXRhKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgdG9BU04xT2JqZWN0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEucGtjcy5Qcml2YXRlS2V5SW5mbyBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllciBhbGdJZAotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2V0IGF0dHJpYnV0ZXMKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IHByaXZLZXkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5wa2NzLlByaXZhdGVLZXlJbmZvIGdldEluc3RhbmNlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEucGtjcy5Qcml2YXRlS2V5SW5mbyBnZXRJbnN0YW5jZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xVGFnZ2VkT2JqZWN0Ci1ib29sZWFuKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllciBnZXRBbGdvcml0aG1JZCgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNldCBnZXRBdHRyaWJ1dGVzKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgZ2V0UHJpdmF0ZUtleSgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IHRvQVNOMU9iamVjdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLnBrY3MuUkMyQ0JDUGFyYW1ldGVyIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFFbmNvZGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xT2N0ZXRTdHJpbmcgaXYKLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJJbnRlZ2VyIHZlcnNpb24KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWJ5dGVbXSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYnl0ZVtdKQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5wa2NzLlJDMkNCQ1BhcmFtZXRlciBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBieXRlW10gZ2V0SVYoKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgZ2V0UkMyUGFyYW1ldGVyVmVyc2lvbigpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IHRvQVNOMU9iamVjdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLnBrY3MuUlNBRVNPQUVQcGFyYW1zIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFFbmNvZGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyIERFRkFVTFRfSEFTSF9BTEdPUklUSE0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyIERFRkFVTFRfTUFTS19HRU5fRlVOQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyIERFRkFVTFRfUF9TT1VSQ0VfQUxHT1JJVEhNCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllciBoYXNoQWxnb3JpdGhtCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllciBtYXNrR2VuQWxnb3JpdGhtCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllciBwU291cmNlQWxnb3JpdGhtCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyKQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5wa2NzLlJTQUVTT0FFUHBhcmFtcyBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyIGdldEhhc2hBbGdvcml0aG0oKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllciBnZXRNYXNrR2VuQWxnb3JpdGhtKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIgZ2V0UFNvdXJjZUFsZ29yaXRobSgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IHRvQVNOMU9iamVjdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLnBrY3MuUlNBUHJpdmF0ZUtleVN0cnVjdHVyZSBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS5tYXRoLkJpZ0ludGVnZXIgY29lZmZpY2llbnQKLQotcHJpdmF0ZSBqYXZhLm1hdGguQmlnSW50ZWdlciBleHBvbmVudDEKLQotcHJpdmF0ZSBqYXZhLm1hdGguQmlnSW50ZWdlciBleHBvbmVudDIKLQotcHJpdmF0ZSBqYXZhLm1hdGguQmlnSW50ZWdlciBtb2R1bHVzCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSBvdGhlclByaW1lSW5mb3MKLQotcHJpdmF0ZSBqYXZhLm1hdGguQmlnSW50ZWdlciBwcmltZTEKLQotcHJpdmF0ZSBqYXZhLm1hdGguQmlnSW50ZWdlciBwcmltZTIKLQotcHJpdmF0ZSBqYXZhLm1hdGguQmlnSW50ZWdlciBwcml2YXRlRXhwb25lbnQKLQotcHJpdmF0ZSBqYXZhLm1hdGguQmlnSW50ZWdlciBwdWJsaWNFeHBvbmVudAotCi1wcml2YXRlIGludCB2ZXJzaW9uCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5tYXRoLkJpZ0ludGVnZXIKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1qYXZhLm1hdGguQmlnSW50ZWdlcgotamF2YS5tYXRoLkJpZ0ludGVnZXIKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1qYXZhLm1hdGguQmlnSW50ZWdlcgotamF2YS5tYXRoLkJpZ0ludGVnZXIKLWphdmEubWF0aC5CaWdJbnRlZ2VyKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlKQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5wa2NzLlJTQVByaXZhdGVLZXlTdHJ1Y3R1cmUgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5wa2NzLlJTQVByaXZhdGVLZXlTdHJ1Y3R1cmUgZ2V0SW5zdGFuY2UoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVRhZ2dlZE9iamVjdAotYm9vbGVhbikKLQotcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldENvZWZmaWNpZW50KCkKLQotcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldEV4cG9uZW50MSgpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRFeHBvbmVudDIoKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgZ2V0TW9kdWx1cygpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRQcmltZTEoKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgZ2V0UHJpbWUyKCkKLQotcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldFByaXZhdGVFeHBvbmVudCgpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRQdWJsaWNFeHBvbmVudCgpCi0KLXB1YmxpYyBpbnQgZ2V0VmVyc2lvbigpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IHRvQVNOMU9iamVjdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLnBrY3MuUlNBU1NBUFNTcGFyYW1zIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFFbmNvZGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyIERFRkFVTFRfSEFTSF9BTEdPUklUSE0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyIERFRkFVTFRfTUFTS19HRU5fRlVOQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSSW50ZWdlciBERUZBVUxUX1NBTFRfTEVOR1RICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkludGVnZXIgREVGQVVMVF9UUkFJTEVSX0ZJRUxECi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllciBoYXNoQWxnb3JpdGhtCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllciBtYXNrR2VuQWxnb3JpdGhtCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkludGVnZXIgc2FsdExlbmd0aAotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJJbnRlZ2VyIHRyYWlsZXJGaWVsZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllcgotb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllcgotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkludGVnZXIKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJJbnRlZ2VyKQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5wa2NzLlJTQVNTQVBTU3BhcmFtcyBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyIGdldEhhc2hBbGdvcml0aG0oKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllciBnZXRNYXNrR2VuQWxnb3JpdGhtKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJJbnRlZ2VyIGdldFNhbHRMZW5ndGgoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkludGVnZXIgZ2V0VHJhaWxlckZpZWxkKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgdG9BU04xT2JqZWN0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEucGtjcy5TYWZlQmFnIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFFbmNvZGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2V0IGJhZ0F0dHJpYnV0ZXMKLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGJhZ0lkCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IGJhZ1ZhbHVlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0Ci1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNldCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2V0IGdldEJhZ0F0dHJpYnV0ZXMoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgZ2V0QmFnSWQoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCBnZXRCYWdWYWx1ZSgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IHRvQVNOMU9iamVjdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLnBrY3MuU2lnbmVkRGF0YSBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlIGltcGxlbWVudHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLnBrY3MuUEtDU09iamVjdElkZW50aWZpZXJzCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXQgY2VydGlmaWNhdGVzCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLnBrY3MuQ29udGVudEluZm8gY29udGVudEluZm8KLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNldCBjcmxzCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXQgZGlnZXN0QWxnb3JpdGhtcwotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2V0IHNpZ25lckluZm9zCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkludGVnZXIgdmVyc2lvbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJJbnRlZ2VyCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNldAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLnBrY3MuQ29udGVudEluZm8KLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2V0Ci1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNldAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXQpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLnBrY3MuU2lnbmVkRGF0YSBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNldCBnZXRDUkxzKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2V0IGdldENlcnRpZmljYXRlcygpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEucGtjcy5Db250ZW50SW5mbyBnZXRDb250ZW50SW5mbygpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNldCBnZXREaWdlc3RBbGdvcml0aG1zKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2V0IGdldFNpZ25lckluZm9zKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJJbnRlZ2VyIGdldFZlcnNpb24oKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCB0b0FTTjFPYmplY3QoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5wa2NzLlNpZ25lckluZm8gZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2V0IGF1dGhlbnRpY2F0ZWRBdHRyaWJ1dGVzCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllciBkaWdBbGdvcml0aG0KLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyIGRpZ0VuY3J5cHRpb25BbGdvcml0aG0KLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMU9jdGV0U3RyaW5nIGVuY3J5cHRlZERpZ2VzdAotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5wa2NzLklzc3VlckFuZFNlcmlhbE51bWJlciBpc3N1ZXJBbmRTZXJpYWxOdW1iZXIKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNldCB1bmF1dGhlbnRpY2F0ZWRBdHRyaWJ1dGVzCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkludGVnZXIgdmVyc2lvbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJJbnRlZ2VyCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEucGtjcy5Jc3N1ZXJBbmRTZXJpYWxOdW1iZXIKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2V0Ci1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMU9jdGV0U3RyaW5nCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNldCkKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEucGtjcy5TaWduZXJJbmZvIGdldEluc3RhbmNlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2V0IGdldEF1dGhlbnRpY2F0ZWRBdHRyaWJ1dGVzKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIgZ2V0RGlnZXN0QWxnb3JpdGhtKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIgZ2V0RGlnZXN0RW5jcnlwdGlvbkFsZ29yaXRobSgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMU9jdGV0U3RyaW5nIGdldEVuY3J5cHRlZERpZ2VzdCgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEucGtjcy5Jc3N1ZXJBbmRTZXJpYWxOdW1iZXIgZ2V0SXNzdWVyQW5kU2VyaWFsTnVtYmVyKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2V0IGdldFVuYXV0aGVudGljYXRlZEF0dHJpYnV0ZXMoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkludGVnZXIgZ2V0VmVyc2lvbigpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IHRvQVNOMU9iamVjdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS50ZWxldHJ1c3QuVGVsZVRydXNUT2JqZWN0SWRlbnRpZmllcnMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgcmlwZW1kMTI4Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgcmlwZW1kMTYwCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgcmlwZW1kMjU2Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgcnNhU2lnbmF0dXJlV2l0aHJpcGVtZDEyOAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIHJzYVNpZ25hdHVyZVdpdGhyaXBlbWQxNjAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciByc2FTaWduYXR1cmVXaXRocmlwZW1kMjU2Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyB0ZWxlVHJ1c1RBbGdvcml0aG0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIHRlbGVUcnVzVFJTQXNpZ25hdHVyZUFsZ29yaXRobQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEudHNwLkFjY3VyYWN5IGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFFbmNvZGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTUFYX01JQ1JPUwotCi1wcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBNQVhfTUlMTElTCi0KLXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE1JTl9NSUNST1MKLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTUlOX01JTExJUwotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkludGVnZXIgbWljcm9zCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSSW50ZWdlciBtaWxsaXMKLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJJbnRlZ2VyIHNlY29uZHMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSSW50ZWdlcgotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkludGVnZXIKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJJbnRlZ2VyKQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS50c3AuQWNjdXJhY3kgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkludGVnZXIgZ2V0TWljcm9zKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJJbnRlZ2VyIGdldE1pbGxpcygpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSSW50ZWdlciBnZXRTZWNvbmRzKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgdG9BU04xT2JqZWN0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEudHNwLk1lc3NhZ2VJbXByaW50IGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFFbmNvZGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIgaGFzaEFsZ29yaXRobQotCi0gYnl0ZVtdIGhhc2hlZE1lc3NhZ2UKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyCi1ieXRlW10pCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLnRzcC5NZXNzYWdlSW1wcmludCBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyIGdldEhhc2hBbGdvcml0aG0oKQotCi1wdWJsaWMgYnl0ZVtdIGdldEhhc2hlZE1lc3NhZ2UoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCB0b0FTTjFPYmplY3QoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS50c3AuVFNUSW5mbyBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEudHNwLkFjY3VyYWN5IGFjY3VyYWN5Ci0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5YNTA5RXh0ZW5zaW9ucyBleHRlbnNpb25zCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSR2VuZXJhbGl6ZWRUaW1lIGdlblRpbWUKLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS50c3AuTWVzc2FnZUltcHJpbnQgbWVzc2FnZUltcHJpbnQKLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJJbnRlZ2VyIG5vbmNlCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSQm9vbGVhbiBvcmRlcmluZwotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkludGVnZXIgc2VyaWFsTnVtYmVyCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5HZW5lcmFsTmFtZSB0c2EKLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIHRzYVBvbGljeUlkCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSSW50ZWdlciB2ZXJzaW9uCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS50c3AuTWVzc2FnZUltcHJpbnQKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJJbnRlZ2VyCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSR2VuZXJhbGl6ZWRUaW1lCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEudHNwLkFjY3VyYWN5Ci1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSQm9vbGVhbgotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkludGVnZXIKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkdlbmVyYWxOYW1lCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5YNTA5RXh0ZW5zaW9ucykKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEudHNwLlRTVEluZm8gZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLnRzcC5BY2N1cmFjeSBnZXRBY2N1cmFjeSgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5YNTA5RXh0ZW5zaW9ucyBnZXRFeHRlbnNpb25zKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJHZW5lcmFsaXplZFRpbWUgZ2V0R2VuVGltZSgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEudHNwLk1lc3NhZ2VJbXByaW50IGdldE1lc3NhZ2VJbXByaW50KCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJJbnRlZ2VyIGdldE5vbmNlKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJCb29sZWFuIGdldE9yZGVyaW5nKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGdldFBvbGljeSgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSSW50ZWdlciBnZXRTZXJpYWxOdW1iZXIoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuR2VuZXJhbE5hbWUgZ2V0VHNhKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgdG9BU04xT2JqZWN0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEudHNwLlRpbWVTdGFtcFJlcSBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSQm9vbGVhbiBjZXJ0UmVxCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5YNTA5RXh0ZW5zaW9ucyBleHRlbnNpb25zCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEudHNwLk1lc3NhZ2VJbXByaW50IG1lc3NhZ2VJbXByaW50Ci0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSSW50ZWdlciBub25jZQotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgdHNhUG9saWN5Ci0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSSW50ZWdlciB2ZXJzaW9uCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLnRzcC5NZXNzYWdlSW1wcmludAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJJbnRlZ2VyCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSQm9vbGVhbgotb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuWDUwOUV4dGVuc2lvbnMpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLnRzcC5UaW1lU3RhbXBSZXEgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkJvb2xlYW4gZ2V0Q2VydFJlcSgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5YNTA5RXh0ZW5zaW9ucyBnZXRFeHRlbnNpb25zKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS50c3AuTWVzc2FnZUltcHJpbnQgZ2V0TWVzc2FnZUltcHJpbnQoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkludGVnZXIgZ2V0Tm9uY2UoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgZ2V0UmVxUG9saWN5KCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJJbnRlZ2VyIGdldFZlcnNpb24oKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCB0b0FTTjFPYmplY3QoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS50c3AuVGltZVN0YW1wUmVzcCBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuY21wLlBLSVN0YXR1c0luZm8gcGtpU3RhdHVzSW5mbwotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLmNtcy5Db250ZW50SW5mbyB0aW1lU3RhbXBUb2tlbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5jbXAuUEtJU3RhdHVzSW5mbwotb3JnLmJvdW5jeWNhc3RsZS5hc24xLmNtcy5Db250ZW50SW5mbykKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEudHNwLlRpbWVTdGFtcFJlc3AgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLmNtcC5QS0lTdGF0dXNJbmZvIGdldFN0YXR1cygpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuY21zLkNvbnRlbnRJbmZvIGdldFRpbWVTdGFtcFRva2VuKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgdG9BU04xT2JqZWN0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEudXRpbC5BU04xRHVtcCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBUQUIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIF9kdW1wQXNTdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZHVtcEFzU3RyaW5nKAotamF2YS5sYW5nLk9iamVjdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEudXRpbC5ERVJEdW1wIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLnV0aWwuQVNOMUR1bXAKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZHVtcEFzU3RyaW5nKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkVuY29kYWJsZSkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGR1bXBBc1N0cmluZygKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLnV0aWwuRHVtcCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbigKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BY2Nlc3NEZXNjcmlwdGlvbiBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgaWRfYWRfY2FJc3N1ZXJzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgaWRfYWRfb2NzcAotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuR2VuZXJhbE5hbWUgYWNjZXNzTG9jYXRpb24KLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGFjY2Vzc01ldGhvZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkdlbmVyYWxOYW1lKQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkFjY2Vzc0Rlc2NyaXB0aW9uIGdldEluc3RhbmNlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkdlbmVyYWxOYW1lIGdldEFjY2Vzc0xvY2F0aW9uKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGdldEFjY2Vzc01ldGhvZCgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IHRvQVNOMU9iamVjdCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BdHRDZXJ0SXNzdWVyIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFFbmNvZGFibGUgaW1wbGVtZW50cyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUNob2ljZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCBjaG9pY2VPYmoKLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlIG9iagotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkdlbmVyYWxOYW1lcykKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuVjJGb3JtKQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkF0dENlcnRJc3N1ZXIgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkF0dENlcnRJc3N1ZXIgZ2V0SW5zdGFuY2UoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVRhZ2dlZE9iamVjdAotYm9vbGVhbikKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlIGdldElzc3VlcigpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IHRvQVNOMU9iamVjdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQXR0Q2VydFZhbGlkaXR5UGVyaW9kIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFFbmNvZGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJHZW5lcmFsaXplZFRpbWUgbm90QWZ0ZXJUaW1lCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSR2VuZXJhbGl6ZWRUaW1lIG5vdEJlZm9yZVRpbWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSR2VuZXJhbGl6ZWRUaW1lCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSR2VuZXJhbGl6ZWRUaW1lKQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkF0dENlcnRWYWxpZGl0eVBlcmlvZCBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSR2VuZXJhbGl6ZWRUaW1lIGdldE5vdEFmdGVyVGltZSgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSR2VuZXJhbGl6ZWRUaW1lIGdldE5vdEJlZm9yZVRpbWUoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCB0b0FTTjFPYmplY3QoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkF0dHJpYnV0ZSBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgYXR0clR5cGUKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNldCBhdHRyVmFsdWVzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2V0KQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkF0dHJpYnV0ZSBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBnZXRBdHRyVHlwZSgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNldCBnZXRBdHRyVmFsdWVzKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgdG9BU04xT2JqZWN0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BdHRyaWJ1dGVDZXJ0aWZpY2F0ZSBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BdHRyaWJ1dGVDZXJ0aWZpY2F0ZUluZm8gYWNpbmZvCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyIHNpZ25hdHVyZUFsZ29yaXRobQotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkJpdFN0cmluZyBzaWduYXR1cmVWYWx1ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkF0dHJpYnV0ZUNlcnRpZmljYXRlSW5mbwotb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllcgotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkJpdFN0cmluZykKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BdHRyaWJ1dGVDZXJ0aWZpY2F0ZSBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BdHRyaWJ1dGVDZXJ0aWZpY2F0ZUluZm8gZ2V0QWNpbmZvKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIgZ2V0U2lnbmF0dXJlQWxnb3JpdGhtKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJCaXRTdHJpbmcgZ2V0U2lnbmF0dXJlVmFsdWUoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCB0b0FTTjFPYmplY3QoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkF0dHJpYnV0ZUNlcnRpZmljYXRlSW5mbyBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQXR0Q2VydFZhbGlkaXR5UGVyaW9kIGF0dHJDZXJ0VmFsaWRpdHlQZXJpb2QKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlIGF0dHJpYnV0ZXMKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5YNTA5RXh0ZW5zaW9ucyBleHRlbnNpb25zCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuSG9sZGVyIGhvbGRlcgotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkF0dENlcnRJc3N1ZXIgaXNzdWVyCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkJpdFN0cmluZyBpc3N1ZXJVbmlxdWVJRAotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJJbnRlZ2VyIHNlcmlhbE51bWJlcgotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIgc2lnbmF0dXJlCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkludGVnZXIgdmVyc2lvbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQXR0cmlidXRlQ2VydGlmaWNhdGVJbmZvIGdldEluc3RhbmNlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BdHRyaWJ1dGVDZXJ0aWZpY2F0ZUluZm8gZ2V0SW5zdGFuY2UoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVRhZ2dlZE9iamVjdAotYm9vbGVhbikKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkF0dENlcnRWYWxpZGl0eVBlcmlvZCBnZXRBdHRyQ2VydFZhbGlkaXR5UGVyaW9kKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UgZ2V0QXR0cmlidXRlcygpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5YNTA5RXh0ZW5zaW9ucyBnZXRFeHRlbnNpb25zKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkhvbGRlciBnZXRIb2xkZXIoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQXR0Q2VydElzc3VlciBnZXRJc3N1ZXIoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkJpdFN0cmluZyBnZXRJc3N1ZXJVbmlxdWVJRCgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSSW50ZWdlciBnZXRTZXJpYWxOdW1iZXIoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllciBnZXRTaWduYXR1cmUoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkludGVnZXIgZ2V0VmVyc2lvbigpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IHRvQVNOMU9iamVjdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQXV0aG9yaXR5SW5mb3JtYXRpb25BY2Nlc3MgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkFjY2Vzc0Rlc2NyaXB0aW9uW10gZGVzY3JpcHRpb25zCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkdlbmVyYWxOYW1lKQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkF1dGhvcml0eUluZm9ybWF0aW9uQWNjZXNzIGdldEluc3RhbmNlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkFjY2Vzc0Rlc2NyaXB0aW9uW10gZ2V0QWNjZXNzRGVzY3JpcHRpb25zKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgdG9BU04xT2JqZWN0KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkF1dGhvcml0eUtleUlkZW50aWZpZXIgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuR2VuZXJhbE5hbWVzIGNlcnRpc3N1ZXIKLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJJbnRlZ2VyIGNlcnRzZXJubwotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFPY3RldFN0cmluZyBrZXlpZGVudGlmaWVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuR2VuZXJhbE5hbWVzCi1qYXZhLm1hdGguQmlnSW50ZWdlcikKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuU3ViamVjdFB1YmxpY0tleUluZm8pCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LlN1YmplY3RQdWJsaWNLZXlJbmZvCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5HZW5lcmFsTmFtZXMKLWphdmEubWF0aC5CaWdJbnRlZ2VyKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ieXRlW10KLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkdlbmVyYWxOYW1lcwotamF2YS5tYXRoLkJpZ0ludGVnZXIpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQXV0aG9yaXR5S2V5SWRlbnRpZmllciBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQXV0aG9yaXR5S2V5SWRlbnRpZmllciBnZXRJbnN0YW5jZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xVGFnZ2VkT2JqZWN0Ci1ib29sZWFuKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuR2VuZXJhbE5hbWVzIGdldEF1dGhvcml0eUNlcnRJc3N1ZXIoKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgZ2V0QXV0aG9yaXR5Q2VydFNlcmlhbE51bWJlcigpCi0KLXB1YmxpYyBieXRlW10gZ2V0S2V5SWRlbnRpZmllcigpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IHRvQVNOMU9iamVjdCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5CYXNpY0NvbnN0cmFpbnRzIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFFbmNvZGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJCb29sZWFuIGNBCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSSW50ZWdlciBwYXRoTGVuQ29uc3RyYWludAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYm9vbGVhbgotaW50KQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkJhc2ljQ29uc3RyYWludHMgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkJhc2ljQ29uc3RyYWludHMgZ2V0SW5zdGFuY2UoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVRhZ2dlZE9iamVjdAotYm9vbGVhbikKLQotcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldFBhdGhMZW5Db25zdHJhaW50KCkKLQotcHVibGljIGJvb2xlYW4gaXNDQSgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IHRvQVNOMU9iamVjdCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5DUkxEaXN0UG9pbnQgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSBzZXEKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5EaXN0cmlidXRpb25Qb2ludFtdKQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkNSTERpc3RQb2ludCBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQ1JMRGlzdFBvaW50IGdldEluc3RhbmNlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFUYWdnZWRPYmplY3QKLWJvb2xlYW4pCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5EaXN0cmlidXRpb25Qb2ludFtdIGdldERpc3RyaWJ1dGlvblBvaW50cygpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IHRvQVNOMU9iamVjdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQ1JMTnVtYmVyIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkludGVnZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLm1hdGguQmlnSW50ZWdlcikKLQotcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldENSTE51bWJlcigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQ1JMUmVhc29uIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkVudW1lcmF0ZWQKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUFfQ09NUFJPTUlTRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRkZJTElBVElPTl9DSEFOR0VECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBX0NPTVBST01JU0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0VSVElGSUNBVEVfSE9MRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDRVNTQVRJT05fT0ZfT1BFUkFUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWV9DT01QUk9NSVNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSVZJTEVHRV9XSVRIRFJBV04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVNT1ZFX0ZST01fQ1JMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNVUEVSU0VERUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5TUEVDSUZJRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYUFDb21wcm9taXNlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGFmZmlsaWF0aW9uQ2hhbmdlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjQUNvbXByb21pc2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY2VydGlmaWNhdGVIb2xkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNlc3NhdGlvbk9mT3BlcmF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGtleUNvbXByb21pc2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJpdmlsZWdlV2l0aGRyYXduCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHJlbW92ZUZyb21DUkwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3VwZXJzZWRlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB1bnNwZWNpZmllZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkVudW1lcmF0ZWQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQ2VydFBvbGljeUlkIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkNlcnRpZmljYXRlTGlzdCBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSQml0U3RyaW5nIHNpZwotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllciBzaWdBbGdJZAotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuVEJTQ2VydExpc3QgdGJzQ2VydExpc3QKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlKQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkNlcnRpZmljYXRlTGlzdCBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQ2VydGlmaWNhdGVMaXN0IGdldEluc3RhbmNlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFUYWdnZWRPYmplY3QKLWJvb2xlYW4pCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5YNTA5TmFtZSBnZXRJc3N1ZXIoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuVGltZSBnZXROZXh0VXBkYXRlKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LlRCU0NlcnRMaXN0JENSTEVudHJ5W10gZ2V0UmV2b2tlZENlcnRpZmljYXRlcygpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSQml0U3RyaW5nIGdldFNpZ25hdHVyZSgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyIGdldFNpZ25hdHVyZUFsZ29yaXRobSgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5UQlNDZXJ0TGlzdCBnZXRUQlNDZXJ0TGlzdCgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5UaW1lIGdldFRoaXNVcGRhdGUoKQotCi1wdWJsaWMgaW50IGdldFZlcnNpb24oKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCB0b0FTTjFPYmplY3QoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkNlcnRpZmljYXRlUG9saWNpZXMgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgYW55UG9saWN5Ci0KLSBqYXZhLnV0aWwuVmVjdG9yIHBvbGljaWVzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllcikKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5DZXJ0aWZpY2F0ZVBvbGljaWVzIGdldEluc3RhbmNlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5DZXJ0aWZpY2F0ZVBvbGljaWVzIGdldEluc3RhbmNlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFUYWdnZWRPYmplY3QKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIGFkZFBvbGljeSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFBvbGljeSgKLWludCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgdG9BU04xT2JqZWN0KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkRTQVBhcmFtZXRlciBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSSW50ZWdlciBnCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSSW50ZWdlciBwCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSSW50ZWdlciBxCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5tYXRoLkJpZ0ludGVnZXIKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1qYXZhLm1hdGguQmlnSW50ZWdlcikKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSkKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5EU0FQYXJhbWV0ZXIgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkRTQVBhcmFtZXRlciBnZXRJbnN0YW5jZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xVGFnZ2VkT2JqZWN0Ci1ib29sZWFuKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgZ2V0RygpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRQKCkKLQotcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldFEoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCB0b0FTTjFPYmplY3QoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkRpZ2VzdEluZm8gZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIgYWxnSWQKLQotcHJpdmF0ZSBieXRlW10gZGlnZXN0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllcgotYnl0ZVtdKQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkRpZ2VzdEluZm8gZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkRpZ2VzdEluZm8gZ2V0SW5zdGFuY2UoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVRhZ2dlZE9iamVjdAotYm9vbGVhbikKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIgZ2V0QWxnb3JpdGhtSWQoKQotCi1wdWJsaWMgYnl0ZVtdIGdldERpZ2VzdCgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IHRvQVNOMU9iamVjdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuRGlzcGxheVRleHQgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZSBpbXBsZW1lbnRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xQ2hvaWNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRFTlRfVFlQRV9CTVBTVFJJTkcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEVOVF9UWVBFX0lBNVNUUklORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05URU5UX1RZUEVfVVRGOFNUUklORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05URU5UX1RZUEVfVklTSUJMRVNUUklORwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVNQTEFZX1RFWFRfTUFYSU1VTV9TSVpFCi0KLSBpbnQgY29udGVudFR5cGUKLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJTdHJpbmcgY29udGVudHMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJTdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuRGlzcGxheVRleHQgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkRpc3BsYXlUZXh0IGdldEluc3RhbmNlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFUYWdnZWRPYmplY3QKLWJvb2xlYW4pCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IHRvQVNOMU9iamVjdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuRGlzdHJpYnV0aW9uUG9pbnQgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuR2VuZXJhbE5hbWVzIGNSTElzc3VlcgotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuRGlzdHJpYnV0aW9uUG9pbnROYW1lIGRpc3RyaWJ1dGlvblBvaW50Ci0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5SZWFzb25GbGFncyByZWFzb25zCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuRGlzdHJpYnV0aW9uUG9pbnROYW1lCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5SZWFzb25GbGFncwotb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuR2VuZXJhbE5hbWVzKQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkRpc3RyaWJ1dGlvblBvaW50IGdldEluc3RhbmNlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5EaXN0cmlidXRpb25Qb2ludCBnZXRJbnN0YW5jZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xVGFnZ2VkT2JqZWN0Ci1ib29sZWFuKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuR2VuZXJhbE5hbWVzIGdldENSTElzc3VlcigpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5EaXN0cmlidXRpb25Qb2ludE5hbWUgZ2V0RGlzdHJpYnV0aW9uUG9pbnQoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuUmVhc29uRmxhZ3MgZ2V0UmVhc29ucygpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IHRvQVNOMU9iamVjdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuRGlzdHJpYnV0aW9uUG9pbnROYW1lIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFFbmNvZGFibGUgaW1wbGVtZW50cyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUNob2ljZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBGVUxMX05BTUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFNRV9SRUxBVElWRV9UT19DUkxfSVNTVUVSCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSRW5jb2RhYmxlIG5hbWUKLQotIGludCB0eXBlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50Ci1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50Ci1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSRW5jb2RhYmxlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVRhZ2dlZE9iamVjdCkKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5EaXN0cmlidXRpb25Qb2ludE5hbWUgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkRpc3RyaWJ1dGlvblBvaW50TmFtZSBnZXRJbnN0YW5jZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xVGFnZ2VkT2JqZWN0Ci1ib29sZWFuKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFFbmNvZGFibGUgZ2V0TmFtZSgpCi0KLXB1YmxpYyBpbnQgZ2V0VHlwZSgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IHRvQVNOMU9iamVjdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuRXh0ZW5kZWRLZXlVc2FnZSBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlIHNlcQotCi0gamF2YS51dGlsLkhhc2h0YWJsZSB1c2FnZVRhYmxlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLlZlY3RvcikKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuS2V5UHVycG9zZUlkKQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkV4dGVuZGVkS2V5VXNhZ2UgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkV4dGVuZGVkS2V5VXNhZ2UgZ2V0SW5zdGFuY2UoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVRhZ2dlZE9iamVjdAotYm9vbGVhbikKLQotcHVibGljIGJvb2xlYW4gaGFzS2V5UHVycG9zZUlkKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuS2V5UHVycG9zZUlkKQotCi1wdWJsaWMgaW50IHNpemUoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCB0b0FTTjFPYmplY3QoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkdlbmVyYWxOYW1lIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFFbmNvZGFibGUgaW1wbGVtZW50cyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUNob2ljZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkTlNOYW1lCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGRpcmVjdG9yeU5hbWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZWRpUGFydHlOYW1lCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGlQQWRkcmVzcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBvdGhlck5hbWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcmVnaXN0ZXJlZElECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHJmYzgyMk5hbWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdW5pZm9ybVJlc291cmNlSWRlbnRpZmllcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCB4NDAwQWRkcmVzcwotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkVuY29kYWJsZSBvYmoKLQotIGludCB0YWcKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWludAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFFbmNvZGFibGUpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QKLWludCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuWDUwOU5hbWUpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuR2VuZXJhbE5hbWUgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkdlbmVyYWxOYW1lIGdldEluc3RhbmNlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFUYWdnZWRPYmplY3QKLWJvb2xlYW4pCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSRW5jb2RhYmxlIGdldE5hbWUoKQotCi1wdWJsaWMgaW50IGdldFRhZ05vKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgdG9BU04xT2JqZWN0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5HZW5lcmFsTmFtZXMgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSBzZXEKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5HZW5lcmFsTmFtZSkKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5HZW5lcmFsTmFtZXMgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkdlbmVyYWxOYW1lcyBnZXRJbnN0YW5jZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xVGFnZ2VkT2JqZWN0Ci1ib29sZWFuKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuR2VuZXJhbE5hbWVbXSBnZXROYW1lcygpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IHRvQVNOMU9iamVjdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuR2VuZXJhbFN1YnRyZWUgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLm1hdGguQmlnSW50ZWdlciBaRVJPCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuR2VuZXJhbE5hbWUgYmFzZQotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJJbnRlZ2VyIG1heGltdW0KLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSSW50ZWdlciBtaW5pbXVtCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5HZW5lcmFsTmFtZQotamF2YS5tYXRoLkJpZ0ludGVnZXIKLWphdmEubWF0aC5CaWdJbnRlZ2VyKQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkdlbmVyYWxTdWJ0cmVlIGdldEluc3RhbmNlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5HZW5lcmFsU3VidHJlZSBnZXRJbnN0YW5jZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xVGFnZ2VkT2JqZWN0Ci1ib29sZWFuKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuR2VuZXJhbE5hbWUgZ2V0QmFzZSgpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRNYXhpbXVtKCkKLQotcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldE1pbmltdW0oKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCB0b0FTTjFPYmplY3QoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkhvbGRlciBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5Jc3N1ZXJTZXJpYWwgYmFzZUNlcnRpZmljYXRlSUQKLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkdlbmVyYWxOYW1lcyBlbnRpdHlOYW1lCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5PYmplY3REaWdlc3RJbmZvIG9iamVjdERpZ2VzdEluZm8KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5HZW5lcmFsTmFtZXMpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5Lklzc3VlclNlcmlhbCkKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5Ib2xkZXIgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuSXNzdWVyU2VyaWFsIGdldEJhc2VDZXJ0aWZpY2F0ZUlEKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkdlbmVyYWxOYW1lcyBnZXRFbnRpdHlOYW1lKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5Lk9iamVjdERpZ2VzdEluZm8gZ2V0T2JqZWN0RGlnZXN0SW5mbygpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IHRvQVNOMU9iamVjdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuSWV0ZkF0dHJTeW50YXggZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQUxVRV9PQ1RFVFMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkFMVUVfT0lECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZBTFVFX1VURjgKLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkdlbmVyYWxOYW1lcyBwb2xpY3lBdXRob3JpdHkKLQotIGludCB2YWx1ZUNob2ljZQotCi0gamF2YS51dGlsLlZlY3RvciB2YWx1ZXMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuR2VuZXJhbE5hbWVzIGdldFBvbGljeUF1dGhvcml0eSgpCi0KLXB1YmxpYyBpbnQgZ2V0VmFsdWVUeXBlKCkKLQotcHVibGljIGphdmEubGFuZy5PYmplY3RbXSBnZXRWYWx1ZXMoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCB0b0FTTjFPYmplY3QoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5Lklzc3VlclNlcmlhbCBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5HZW5lcmFsTmFtZXMgaXNzdWVyCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSQml0U3RyaW5nIGlzc3VlclVJRAotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkludGVnZXIgc2VyaWFsCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuR2VuZXJhbE5hbWVzCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSSW50ZWdlcikKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5Jc3N1ZXJTZXJpYWwgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5Lklzc3VlclNlcmlhbCBnZXRJbnN0YW5jZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xVGFnZ2VkT2JqZWN0Ci1ib29sZWFuKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuR2VuZXJhbE5hbWVzIGdldElzc3VlcigpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSQml0U3RyaW5nIGdldElzc3VlclVJRCgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSSW50ZWdlciBnZXRTZXJpYWwoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCB0b0FTTjFPYmplY3QoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5Lklzc3VpbmdEaXN0cmlidXRpb25Qb2ludCBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYm9vbGVhbiBpbmRpcmVjdENSTAotCi1wcml2YXRlIGJvb2xlYW4gb25seUNvbnRhaW5zQXR0cmlidXRlQ2VydHMKLQotcHJpdmF0ZSBib29sZWFuIG9ubHlDb250YWluc0NBQ2VydHMKLQotcHJpdmF0ZSBib29sZWFuIG9ubHlDb250YWluc1VzZXJDZXJ0cwotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2Ugc2VxCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSkKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5Jc3N1aW5nRGlzdHJpYnV0aW9uUG9pbnQgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5Lklzc3VpbmdEaXN0cmlidXRpb25Qb2ludCBnZXRJbnN0YW5jZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xVGFnZ2VkT2JqZWN0Ci1ib29sZWFuKQotCi1wdWJsaWMgYm9vbGVhbiBpc0luZGlyZWN0Q1JMKCkKLQotcHVibGljIGJvb2xlYW4gb25seUNvbnRhaW5zQXR0cmlidXRlQ2VydHMoKQotCi1wdWJsaWMgYm9vbGVhbiBvbmx5Q29udGFpbnNDQUNlcnRzKCkKLQotcHVibGljIGJvb2xlYW4gb25seUNvbnRhaW5zVXNlckNlcnRzKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgdG9BU04xT2JqZWN0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5LZXlQdXJwb3NlSWQgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LktleVB1cnBvc2VJZCBhbnlFeHRlbmRlZEtleVVzYWdlCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgaWRfa3AKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5LZXlQdXJwb3NlSWQgaWRfa3BfT0NTUFNpZ25pbmcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5LZXlQdXJwb3NlSWQgaWRfa3BfY2xpZW50QXV0aAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LktleVB1cnBvc2VJZCBpZF9rcF9jb2RlU2lnbmluZwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LktleVB1cnBvc2VJZCBpZF9rcF9lbWFpbFByb3RlY3Rpb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5LZXlQdXJwb3NlSWQgaWRfa3BfaXBzZWNFbmRTeXN0ZW0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5LZXlQdXJwb3NlSWQgaWRfa3BfaXBzZWNUdW5uZWwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5LZXlQdXJwb3NlSWQgaWRfa3BfaXBzZWNVc2VyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuS2V5UHVycG9zZUlkIGlkX2twX3NlcnZlckF1dGgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5LZXlQdXJwb3NlSWQgaWRfa3Bfc21hcnRjYXJkbG9nb24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5LZXlQdXJwb3NlSWQgaWRfa3BfdGltZVN0YW1waW5nCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5LZXlVc2FnZSBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJCaXRTdHJpbmcKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY1JMU2lnbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkYXRhRW5jaXBoZXJtZW50Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGRlY2lwaGVyT25seQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkaWdpdGFsU2lnbmF0dXJlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGVuY2lwaGVyT25seQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBrZXlBZ3JlZW1lbnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQga2V5Q2VydFNpZ24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQga2V5RW5jaXBoZXJtZW50Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG5vblJlcHVkaWF0aW9uCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSQml0U3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuTmFtZUNvbnN0cmFpbnRzIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFFbmNvZGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlIGV4Y2x1ZGVkCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSBwZXJtaXR0ZWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuVmVjdG9yCi1qYXZhLnV0aWwuVmVjdG9yKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlKQotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJTZXF1ZW5jZSBjcmVhdGVTZXF1ZW5jZSgKLWphdmEudXRpbC5WZWN0b3IpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlIGdldEV4Y2x1ZGVkU3VidHJlZXMoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSBnZXRQZXJtaXR0ZWRTdWJ0cmVlcygpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IHRvQVNOMU9iamVjdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuTm90aWNlUmVmZXJlbmNlIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFFbmNvZGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlIG5vdGljZU51bWJlcnMKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5EaXNwbGF5VGV4dCBvcmdhbml6YXRpb24KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQKLWphdmEubGFuZy5TdHJpbmcKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudXRpbC5WZWN0b3IpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuTm90aWNlUmVmZXJlbmNlIGdldEluc3RhbmNlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UgZ2V0Tm90aWNlTnVtYmVycygpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5EaXNwbGF5VGV4dCBnZXRPcmdhbml6YXRpb24oKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCB0b0FTTjFPYmplY3QoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5Lk9iamVjdERpZ2VzdEluZm8gZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllciBkaWdlc3RBbGdvcml0aG0KLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJFbnVtZXJhdGVkIGRpZ2VzdGVkT2JqZWN0VHlwZQotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkJpdFN0cmluZyBvYmplY3REaWdlc3QKLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIG90aGVyT2JqZWN0VHlwZUlECi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSkKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5PYmplY3REaWdlc3RJbmZvIGdldEluc3RhbmNlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5PYmplY3REaWdlc3RJbmZvIGdldEluc3RhbmNlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFUYWdnZWRPYmplY3QKLWJvb2xlYW4pCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyIGdldERpZ2VzdEFsZ29yaXRobSgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSRW51bWVyYXRlZCBnZXREaWdlc3RlZE9iamVjdFR5cGUoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkJpdFN0cmluZyBnZXRPYmplY3REaWdlc3QoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgZ2V0T3RoZXJPYmplY3RUeXBlSUQoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCB0b0FTTjFPYmplY3QoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LlBvbGljeUluZm9ybWF0aW9uIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFFbmNvZGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBwb2xpY3lJZGVudGlmaWVyCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSBwb2xpY3lRdWFsaWZpZXJzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlKQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LlBvbGljeUluZm9ybWF0aW9uIGdldEluc3RhbmNlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGdldFBvbGljeUlkZW50aWZpZXIoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSBnZXRQb2xpY3lRdWFsaWZpZXJzKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgdG9BU04xT2JqZWN0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5Qb2xpY3lNYXBwaW5ncyBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlIHNlcQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEudXRpbC5IYXNodGFibGUpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IHRvQVNOMU9iamVjdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuUG9saWN5UXVhbGlmaWVySWQgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGlkX3F0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuUG9saWN5UXVhbGlmaWVySWQgaWRfcXRfY3BzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuUG9saWN5UXVhbGlmaWVySWQgaWRfcXRfdW5vdGljZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuUG9saWN5UXVhbGlmaWVySW5mbyBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgcG9saWN5UXVhbGlmaWVySWQKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSRW5jb2RhYmxlIHF1YWxpZmllcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSRW5jb2RhYmxlKQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LlBvbGljeVF1YWxpZmllckluZm8gZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgZ2V0UG9saWN5UXVhbGlmaWVySWQoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkVuY29kYWJsZSBnZXRRdWFsaWZpZXIoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCB0b0FTTjFPYmplY3QoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LlJTQVB1YmxpY0tleVN0cnVjdHVyZSBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS5tYXRoLkJpZ0ludGVnZXIgbW9kdWx1cwotCi1wcml2YXRlIGphdmEubWF0aC5CaWdJbnRlZ2VyIHB1YmxpY0V4cG9uZW50Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5tYXRoLkJpZ0ludGVnZXIKLWphdmEubWF0aC5CaWdJbnRlZ2VyKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlKQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LlJTQVB1YmxpY0tleVN0cnVjdHVyZSBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuUlNBUHVibGljS2V5U3RydWN0dXJlIGdldEluc3RhbmNlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFUYWdnZWRPYmplY3QKLWJvb2xlYW4pCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRNb2R1bHVzKCkKLQotcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldFB1YmxpY0V4cG9uZW50KCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgdG9BU04xT2JqZWN0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5SZWFzb25GbGFncyBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJCaXRTdHJpbmcKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUFfQ09NUFJPTUlTRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRkZJTElBVElPTl9DSEFOR0VECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBX0NPTVBST01JU0UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0VSVElGSUNBVEVfSE9MRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDRVNTQVRJT05fT0ZfT1BFUkFUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWV9DT01QUk9NSVNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSVZJTEVHRV9XSVRIRFJBV04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1VQRVJTRURFRAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTlVTRUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYUFDb21wcm9taXNlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGFmZmlsaWF0aW9uQ2hhbmdlZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBjQUNvbXByb21pc2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY2VydGlmaWNhdGVIb2xkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNlc3NhdGlvbk9mT3BlcmF0aW9uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGtleUNvbXByb21pc2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJpdmlsZWdlV2l0aGRyYXduCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN1cGVyc2VkZWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdW51c2VkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSQml0U3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LlJvbGVTeW50YXggZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkdlbmVyYWxOYW1lcyByb2xlQXV0aG9yaXR5Ci0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuR2VuZXJhbE5hbWUgcm9sZU5hbWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5HZW5lcmFsTmFtZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuR2VuZXJhbE5hbWVzCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5HZW5lcmFsTmFtZSkKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5Sb2xlU3ludGF4IGdldEluc3RhbmNlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkdlbmVyYWxOYW1lcyBnZXRSb2xlQXV0aG9yaXR5KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBnZXRSb2xlQXV0aG9yaXR5QXNTdHJpbmcoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuR2VuZXJhbE5hbWUgZ2V0Um9sZU5hbWUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRSb2xlTmFtZUFzU3RyaW5nKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgdG9BU04xT2JqZWN0KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LlN1YmplY3REaXJlY3RvcnlBdHRyaWJ1dGVzIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFFbmNvZGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLnV0aWwuVmVjdG9yIGF0dHJpYnV0ZXMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuVmVjdG9yKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlKQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LlN1YmplY3REaXJlY3RvcnlBdHRyaWJ1dGVzIGdldEluc3RhbmNlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGphdmEudXRpbC5WZWN0b3IgZ2V0QXR0cmlidXRlcygpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IHRvQVNOMU9iamVjdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuU3ViamVjdEtleUlkZW50aWZpZXIgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGJ5dGVbXSBrZXlpZGVudGlmaWVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFPY3RldFN0cmluZykKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuU3ViamVjdFB1YmxpY0tleUluZm8pCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWJ5dGVbXSkKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5TdWJqZWN0S2V5SWRlbnRpZmllciBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuU3ViamVjdEtleUlkZW50aWZpZXIgZ2V0SW5zdGFuY2UoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVRhZ2dlZE9iamVjdAotYm9vbGVhbikKLQotcHVibGljIGJ5dGVbXSBnZXRLZXlJZGVudGlmaWVyKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgdG9BU04xT2JqZWN0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5TdWJqZWN0UHVibGljS2V5SW5mbyBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllciBhbGdJZAotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJCaXRTdHJpbmcga2V5RGF0YQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJFbmNvZGFibGUpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIKLWJ5dGVbXSkKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5TdWJqZWN0UHVibGljS2V5SW5mbyBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuU3ViamVjdFB1YmxpY0tleUluZm8gZ2V0SW5zdGFuY2UoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVRhZ2dlZE9iamVjdAotYm9vbGVhbikKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIgZ2V0QWxnb3JpdGhtSWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCBnZXRQdWJsaWNLZXkoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkJpdFN0cmluZyBnZXRQdWJsaWNLZXlEYXRhKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgdG9BU04xT2JqZWN0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTEgbmFtZSA9Q1JMRW50cnkgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvYXNuMS94NTA5L1RCU0NlcnRMaXN0OyApCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuVEJTQ2VydExpc3QkQ1JMRW50cnkgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuWDUwOUV4dGVuc2lvbnMgY3JsRW50cnlFeHRlbnNpb25zCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5UaW1lIHJldm9jYXRpb25EYXRlCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlIHNlcQotCi1maW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5UQlNDZXJ0TGlzdCB0aGlzJDAKLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJJbnRlZ2VyIHVzZXJDZXJ0aWZpY2F0ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LlRCU0NlcnRMaXN0Ci1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuWDUwOUV4dGVuc2lvbnMgZ2V0RXh0ZW5zaW9ucygpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5UaW1lIGdldFJldm9jYXRpb25EYXRlKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJJbnRlZ2VyIGdldFVzZXJDZXJ0aWZpY2F0ZSgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IHRvQVNOMU9iamVjdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9hc24xL3g1MDkvVEJTQ2VydExpc3QkQ1JMRW50cnk7ICkKLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5UQlNDZXJ0TGlzdCBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5YNTA5RXh0ZW5zaW9ucyBjcmxFeHRlbnNpb25zCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5YNTA5TmFtZSBpc3N1ZXIKLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LlRpbWUgbmV4dFVwZGF0ZQotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuVEJTQ2VydExpc3QkQ1JMRW50cnlbXSByZXZva2VkQ2VydGlmaWNhdGVzCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlIHNlcQotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllciBzaWduYXR1cmUKLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LlRpbWUgdGhpc1VwZGF0ZQotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkludGVnZXIgdmVyc2lvbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuVEJTQ2VydExpc3QgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LlRCU0NlcnRMaXN0IGdldEluc3RhbmNlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFUYWdnZWRPYmplY3QKLWJvb2xlYW4pCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5YNTA5RXh0ZW5zaW9ucyBnZXRFeHRlbnNpb25zKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5Llg1MDlOYW1lIGdldElzc3VlcigpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5UaW1lIGdldE5leHRVcGRhdGUoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuVEJTQ2VydExpc3QkQ1JMRW50cnlbXSBnZXRSZXZva2VkQ2VydGlmaWNhdGVzKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIgZ2V0U2lnbmF0dXJlKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LlRpbWUgZ2V0VGhpc1VwZGF0ZSgpCi0KLXB1YmxpYyBpbnQgZ2V0VmVyc2lvbigpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSSW50ZWdlciBnZXRWZXJzaW9uTnVtYmVyKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgdG9BU04xT2JqZWN0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuWDUwOU9iamVjdElkZW50aWZpZXJzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGNvbW1vbk5hbWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBjb3VudHJ5TmFtZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgaWQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBpZF9TSEExCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgaWRfZWFfcnNhCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgbG9jYWxpdHlOYW1lCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgb2NzcEFjY2Vzc01ldGhvZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIG9yZ2FuaXphdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIG9yZ2FuaXphdGlvbmFsVW5pdE5hbWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciByaXBlbWQxNjAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciByaXBlbWQxNjBXaXRoUlNBRW5jcnlwdGlvbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIHN0YXRlT3JQcm92aW5jZU5hbWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuVEJTQ2VydGlmaWNhdGVTdHJ1Y3R1cmUgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZSBpbXBsZW1lbnRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5Llg1MDlPYmplY3RJZGVudGlmaWVycywgb3JnLmJvdW5jeWNhc3RsZS5hc24xLnBrY3MuUEtDU09iamVjdElkZW50aWZpZXJzCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5UaW1lIGVuZERhdGUKLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5Llg1MDlFeHRlbnNpb25zIGV4dGVuc2lvbnMKLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5Llg1MDlOYW1lIGlzc3VlcgotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkJpdFN0cmluZyBpc3N1ZXJVbmlxdWVJZAotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSBzZXEKLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJJbnRlZ2VyIHNlcmlhbE51bWJlcgotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllciBzaWduYXR1cmUKLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LlRpbWUgc3RhcnREYXRlCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5YNTA5TmFtZSBzdWJqZWN0Ci0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5TdWJqZWN0UHVibGljS2V5SW5mbyBzdWJqZWN0UHVibGljS2V5SW5mbwotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkJpdFN0cmluZyBzdWJqZWN0VW5pcXVlSWQKLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJJbnRlZ2VyIHZlcnNpb24KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlKQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LlRCU0NlcnRpZmljYXRlU3RydWN0dXJlIGdldEluc3RhbmNlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5UQlNDZXJ0aWZpY2F0ZVN0cnVjdHVyZSBnZXRJbnN0YW5jZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xVGFnZ2VkT2JqZWN0Ci1ib29sZWFuKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuVGltZSBnZXRFbmREYXRlKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5Llg1MDlFeHRlbnNpb25zIGdldEV4dGVuc2lvbnMoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuWDUwOU5hbWUgZ2V0SXNzdWVyKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJCaXRTdHJpbmcgZ2V0SXNzdWVyVW5pcXVlSWQoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkludGVnZXIgZ2V0U2VyaWFsTnVtYmVyKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIgZ2V0U2lnbmF0dXJlKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LlRpbWUgZ2V0U3RhcnREYXRlKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5Llg1MDlOYW1lIGdldFN1YmplY3QoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuU3ViamVjdFB1YmxpY0tleUluZm8gZ2V0U3ViamVjdFB1YmxpY0tleUluZm8oKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkJpdFN0cmluZyBnZXRTdWJqZWN0VW5pcXVlSWQoKQotCi1wdWJsaWMgaW50IGdldFZlcnNpb24oKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkludGVnZXIgZ2V0VmVyc2lvbk51bWJlcigpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IHRvQVNOMU9iamVjdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuVGltZSBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlIGltcGxlbWVudHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFDaG9pY2UKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgdGltZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEudXRpbC5EYXRlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LlRpbWUgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LlRpbWUgZ2V0SW5zdGFuY2UoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVRhZ2dlZE9iamVjdAotYm9vbGVhbikKLQotcHVibGljIGphdmEudXRpbC5EYXRlIGdldERhdGUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRUaW1lKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgdG9BU04xT2JqZWN0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5Vc2VyTm90aWNlIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFFbmNvZGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5EaXNwbGF5VGV4dCBleHBsaWNpdFRleHQKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5Ob3RpY2VSZWZlcmVuY2Ugbm90aWNlUmVmCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuTm90aWNlUmVmZXJlbmNlCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5Ob3RpY2VSZWZlcmVuY2UKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkRpc3BsYXlUZXh0KQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuRGlzcGxheVRleHQgZ2V0RXhwbGljaXRUZXh0KCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5Lk5vdGljZVJlZmVyZW5jZSBnZXROb3RpY2VSZWYoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCB0b0FTTjFPYmplY3QoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LlYxVEJTQ2VydGlmaWNhdGVHZW5lcmF0b3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5UaW1lIGVuZERhdGUKLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5Llg1MDlOYW1lIGlzc3VlcgotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkludGVnZXIgc2VyaWFsTnVtYmVyCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyIHNpZ25hdHVyZQotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuVGltZSBzdGFydERhdGUKLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5Llg1MDlOYW1lIHN1YmplY3QKLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LlN1YmplY3RQdWJsaWNLZXlJbmZvIHN1YmplY3RQdWJsaWNLZXlJbmZvCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSVGFnZ2VkT2JqZWN0IHZlcnNpb24KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuVEJTQ2VydGlmaWNhdGVTdHJ1Y3R1cmUgZ2VuZXJhdGVUQlNDZXJ0aWZpY2F0ZSgpCi0KLXB1YmxpYyB2b2lkIHNldEVuZERhdGUoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSVVRDVGltZSkKLQotcHVibGljIHZvaWQgc2V0RW5kRGF0ZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LlRpbWUpCi0KLXB1YmxpYyB2b2lkIHNldElzc3VlcigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5Llg1MDlOYW1lKQotCi1wdWJsaWMgdm9pZCBzZXRTZXJpYWxOdW1iZXIoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSSW50ZWdlcikKLQotcHVibGljIHZvaWQgc2V0U2lnbmF0dXJlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllcikKLQotcHVibGljIHZvaWQgc2V0U3RhcnREYXRlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUlVUQ1RpbWUpCi0KLXB1YmxpYyB2b2lkIHNldFN0YXJ0RGF0ZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LlRpbWUpCi0KLXB1YmxpYyB2b2lkIHNldFN1YmplY3QoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5YNTA5TmFtZSkKLQotcHVibGljIHZvaWQgc2V0U3ViamVjdFB1YmxpY0tleUluZm8oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5TdWJqZWN0UHVibGljS2V5SW5mbykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5WMkF0dHJpYnV0ZUNlcnRpZmljYXRlSW5mb0dlbmVyYXRvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BdHRDZXJ0VmFsaWRpdHlQZXJpb2QgYXR0ckNlcnRWYWxpZGl0eVBlcmlvZAotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlVmVjdG9yIGF0dHJpYnV0ZXMKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSR2VuZXJhbGl6ZWRUaW1lIGVuZERhdGUKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5YNTA5RXh0ZW5zaW9ucyBleHRlbnNpb25zCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuSG9sZGVyIGhvbGRlcgotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkF0dENlcnRJc3N1ZXIgaXNzdWVyCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkJpdFN0cmluZyBpc3N1ZXJVbmlxdWVJRAotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJJbnRlZ2VyIHNlcmlhbE51bWJlcgotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIgc2lnbmF0dXJlCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkdlbmVyYWxpemVkVGltZSBzdGFydERhdGUKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSSW50ZWdlciB2ZXJzaW9uCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgYWRkQXR0cmlidXRlKAotamF2YS5sYW5nLlN0cmluZwotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFFbmNvZGFibGUpCi0KLXB1YmxpYyB2b2lkIGFkZEF0dHJpYnV0ZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkF0dHJpYnV0ZSkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkF0dHJpYnV0ZUNlcnRpZmljYXRlSW5mbyBnZW5lcmF0ZUF0dHJpYnV0ZUNlcnRpZmljYXRlSW5mbygpCi0KLXB1YmxpYyB2b2lkIHNldEVuZERhdGUoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSR2VuZXJhbGl6ZWRUaW1lKQotCi1wdWJsaWMgdm9pZCBzZXRFeHRlbnNpb25zKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuWDUwOUV4dGVuc2lvbnMpCi0KLXB1YmxpYyB2b2lkIHNldEhvbGRlcigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkhvbGRlcikKLQotcHVibGljIHZvaWQgc2V0SXNzdWVyKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQXR0Q2VydElzc3VlcikKLQotcHVibGljIHZvaWQgc2V0SXNzdWVyVW5pcXVlSUQoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSQml0U3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRTZXJpYWxOdW1iZXIoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSSW50ZWdlcikKLQotcHVibGljIHZvaWQgc2V0U2lnbmF0dXJlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllcikKLQotcHVibGljIHZvaWQgc2V0U3RhcnREYXRlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkdlbmVyYWxpemVkVGltZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5WMkZvcm0gZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuSXNzdWVyU2VyaWFsIGJhc2VDZXJ0aWZpY2F0ZUlECi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5HZW5lcmFsTmFtZXMgaXNzdWVyTmFtZQotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuT2JqZWN0RGlnZXN0SW5mbyBvYmplY3REaWdlc3RJbmZvCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuR2VuZXJhbE5hbWVzKQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LlYyRm9ybSBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuVjJGb3JtIGdldEluc3RhbmNlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFUYWdnZWRPYmplY3QKLWJvb2xlYW4pCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5Jc3N1ZXJTZXJpYWwgZ2V0QmFzZUNlcnRpZmljYXRlSUQoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuR2VuZXJhbE5hbWVzIGdldElzc3Vlck5hbWUoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuT2JqZWN0RGlnZXN0SW5mbyBnZXRPYmplY3REaWdlc3RJbmZvKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgdG9BU04xT2JqZWN0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5WMlRCU0NlcnRMaXN0R2VuZXJhdG9yIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEudXRpbC5WZWN0b3IgY3JsZW50cmllcwotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuWDUwOUV4dGVuc2lvbnMgZXh0ZW5zaW9ucwotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuWDUwOU5hbWUgaXNzdWVyCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5UaW1lIG5leHRVcGRhdGUKLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIgc2lnbmF0dXJlCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5UaW1lIHRoaXNVcGRhdGUKLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJJbnRlZ2VyIHZlcnNpb24KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCBhZGRDUkxFbnRyeSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UpCi0KLXB1YmxpYyB2b2lkIGFkZENSTEVudHJ5KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkludGVnZXIKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJVVENUaW1lCi1pbnQpCi0KLXB1YmxpYyB2b2lkIGFkZENSTEVudHJ5KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkludGVnZXIKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LlRpbWUKLWludCkKLQotcHVibGljIHZvaWQgYWRkQ1JMRW50cnkoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSSW50ZWdlcgotb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuVGltZQotaW50Ci1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSR2VuZXJhbGl6ZWRUaW1lKQotCi1wdWJsaWMgdm9pZCBhZGRDUkxFbnRyeSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJJbnRlZ2VyCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5UaW1lCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5YNTA5RXh0ZW5zaW9ucykKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LlRCU0NlcnRMaXN0IGdlbmVyYXRlVEJTQ2VydExpc3QoKQotCi1wdWJsaWMgdm9pZCBzZXRFeHRlbnNpb25zKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuWDUwOUV4dGVuc2lvbnMpCi0KLXB1YmxpYyB2b2lkIHNldElzc3VlcigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5Llg1MDlOYW1lKQotCi1wdWJsaWMgdm9pZCBzZXROZXh0VXBkYXRlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUlVUQ1RpbWUpCi0KLXB1YmxpYyB2b2lkIHNldE5leHRVcGRhdGUoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5UaW1lKQotCi1wdWJsaWMgdm9pZCBzZXRTaWduYXR1cmUoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyKQotCi1wdWJsaWMgdm9pZCBzZXRUaGlzVXBkYXRlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUlVUQ1RpbWUpCi0KLXB1YmxpYyB2b2lkIHNldFRoaXNVcGRhdGUoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5UaW1lKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LlYzVEJTQ2VydGlmaWNhdGVHZW5lcmF0b3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5UaW1lIGVuZERhdGUKLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5Llg1MDlFeHRlbnNpb25zIGV4dGVuc2lvbnMKLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5Llg1MDlOYW1lIGlzc3VlcgotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkludGVnZXIgc2VyaWFsTnVtYmVyCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyIHNpZ25hdHVyZQotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuVGltZSBzdGFydERhdGUKLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5Llg1MDlOYW1lIHN1YmplY3QKLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LlN1YmplY3RQdWJsaWNLZXlJbmZvIHN1YmplY3RQdWJsaWNLZXlJbmZvCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSVGFnZ2VkT2JqZWN0IHZlcnNpb24KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuVEJTQ2VydGlmaWNhdGVTdHJ1Y3R1cmUgZ2VuZXJhdGVUQlNDZXJ0aWZpY2F0ZSgpCi0KLXB1YmxpYyB2b2lkIHNldEVuZERhdGUoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSVVRDVGltZSkKLQotcHVibGljIHZvaWQgc2V0RW5kRGF0ZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LlRpbWUpCi0KLXB1YmxpYyB2b2lkIHNldEV4dGVuc2lvbnMoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5YNTA5RXh0ZW5zaW9ucykKLQotcHVibGljIHZvaWQgc2V0SXNzdWVyKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuWDUwOU5hbWUpCi0KLXB1YmxpYyB2b2lkIHNldFNlcmlhbE51bWJlcigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJJbnRlZ2VyKQotCi1wdWJsaWMgdm9pZCBzZXRTaWduYXR1cmUoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyKQotCi1wdWJsaWMgdm9pZCBzZXRTdGFydERhdGUoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSVVRDVGltZSkKLQotcHVibGljIHZvaWQgc2V0U3RhcnREYXRlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuVGltZSkKLQotcHVibGljIHZvaWQgc2V0U3ViamVjdCgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5Llg1MDlOYW1lKQotCi1wdWJsaWMgdm9pZCBzZXRTdWJqZWN0UHVibGljS2V5SW5mbygKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LlN1YmplY3RQdWJsaWNLZXlJbmZvKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5Llg1MDlBdHRyaWJ1dGVzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIFJvbGVTeW50YXgKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuWDUwOUNlcnRpZmljYXRlU3RydWN0dXJlIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFFbmNvZGFibGUgaW1wbGVtZW50cyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5YNTA5T2JqZWN0SWRlbnRpZmllcnMsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5wa2NzLlBLQ1NPYmplY3RJZGVudGlmaWVycwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSBzZXEKLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJCaXRTdHJpbmcgc2lnCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyIHNpZ0FsZ0lkCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5UQlNDZXJ0aWZpY2F0ZVN0cnVjdHVyZSB0YnNDZXJ0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSkKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5YNTA5Q2VydGlmaWNhdGVTdHJ1Y3R1cmUgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5Llg1MDlDZXJ0aWZpY2F0ZVN0cnVjdHVyZSBnZXRJbnN0YW5jZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xVGFnZ2VkT2JqZWN0Ci1ib29sZWFuKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuVGltZSBnZXRFbmREYXRlKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5Llg1MDlOYW1lIGdldElzc3VlcigpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSSW50ZWdlciBnZXRTZXJpYWxOdW1iZXIoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkJpdFN0cmluZyBnZXRTaWduYXR1cmUoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllciBnZXRTaWduYXR1cmVBbGdvcml0aG0oKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuVGltZSBnZXRTdGFydERhdGUoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuWDUwOU5hbWUgZ2V0U3ViamVjdCgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5TdWJqZWN0UHVibGljS2V5SW5mbyBnZXRTdWJqZWN0UHVibGljS2V5SW5mbygpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5UQlNDZXJ0aWZpY2F0ZVN0cnVjdHVyZSBnZXRUQlNDZXJ0aWZpY2F0ZSgpCi0KLXB1YmxpYyBpbnQgZ2V0VmVyc2lvbigpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IHRvQVNOMU9iamVjdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuWDUwOU5hbWVFbnRyeUNvbnZlcnRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcm90ZWN0ZWQgYm9vbGVhbiBjYW5CZVByaW50YWJsZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IGNvbnZlcnRIZXhFbmNvZGVkKAotamF2YS5sYW5nLlN0cmluZwotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCBnZXRDb252ZXJ0ZWRWYWx1ZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5Llg1MDlEZWZhdWx0RW50cnlDb252ZXJ0ZXIgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5YNTA5TmFtZUVudHJ5Q29udmVydGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgZ2V0Q29udmVydGVkVmFsdWUoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllcgotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5YNTA5RXh0ZW5zaW9uIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gYm9vbGVhbiBjcml0aWNhbAotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFPY3RldFN0cmluZyB2YWx1ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJCb29sZWFuCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMU9jdGV0U3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ib29sZWFuCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMU9jdGV0U3RyaW5nKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFPY3RldFN0cmluZyBnZXRWYWx1ZSgpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1wdWJsaWMgYm9vbGVhbiBpc0NyaXRpY2FsKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5YNTA5RXh0ZW5zaW9ucyBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgQXV0aG9yaXR5SW5mb0FjY2VzcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIEF1dGhvcml0eUtleUlkZW50aWZpZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBCYXNpY0NvbnN0cmFpbnRzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgQmlvbWV0cmljSW5mbwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIENSTERpc3RyaWJ1dGlvblBvaW50cwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIENSTE51bWJlcgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIENlcnRpZmljYXRlSXNzdWVyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgQ2VydGlmaWNhdGVQb2xpY2llcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIERlbHRhQ1JMSW5kaWNhdG9yCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgRXh0ZW5kZWRLZXlVc2FnZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIEZyZXNoZXN0Q1JMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgSW5oaWJpdEFueVBvbGljeQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIEluc3RydWN0aW9uQ29kZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIEludmFsaWRpdHlEYXRlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgSXNzdWVyQWx0ZXJuYXRpdmVOYW1lCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgSXNzdWluZ0Rpc3RyaWJ1dGlvblBvaW50Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgS2V5VXNhZ2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBOYW1lQ29uc3RyYWludHMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBQb2xpY3lDb25zdHJhaW50cwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIFBvbGljeU1hcHBpbmdzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgUHJpdmF0ZUtleVVzYWdlUGVyaW9kCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgUUNTdGF0ZW1lbnRzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgUmVhc29uQ29kZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIFN1YmplY3RBbHRlcm5hdGl2ZU5hbWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBTdWJqZWN0RGlyZWN0b3J5QXR0cmlidXRlcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIFN1YmplY3RJbmZvQWNjZXNzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgU3ViamVjdEtleUlkZW50aWZpZXIKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuT3JkZXJlZFRhYmxlIHRhYmxlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuSGFzaHRhYmxlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuVmVjdG9yCi1qYXZhLnV0aWwuSGFzaHRhYmxlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuVmVjdG9yCi1qYXZhLnV0aWwuVmVjdG9yKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlKQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5Llg1MDlFeHRlbnNpb25zIGdldEluc3RhbmNlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5YNTA5RXh0ZW5zaW9ucyBnZXRJbnN0YW5jZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xVGFnZ2VkT2JqZWN0Ci1ib29sZWFuKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuWDUwOUV4dGVuc2lvbiBnZXRFeHRlbnNpb24oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllcikKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLXB1YmxpYyBqYXZhLnV0aWwuRW51bWVyYXRpb24gb2lkcygpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IHRvQVNOMU9iamVjdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuWDUwOU5hbWUgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIEJVU0lORVNTX0NBVEVHT1JZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgQwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIENOCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgQ09VTlRSWV9PRl9DSVRJWkVOU0hJUAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIENPVU5UUllfT0ZfUkVTSURFTkNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgREFURV9PRl9CSVJUSAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIERDCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgRE5fUVVBTElGSUVSCi0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLkhhc2h0YWJsZSBEZWZhdWx0TG9va1VwCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBEZWZhdWx0UmV2ZXJzZQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5IYXNodGFibGUgRGVmYXVsdFN5bWJvbHMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgRW1haWxBZGRyZXNzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgR0VOREVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgR0VORVJBVElPTgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIEdJVkVOTkFNRQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIElOSVRJQUxTCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIE5BTUVfQVRfQklSVEgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBPCi0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLkhhc2h0YWJsZSBPSURMb29rVXAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBPVQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIFBMQUNFX09GX0JJUlRICi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgUE9TVEFMX0FERFJFU1MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBQT1NUQUxfQ09ERQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIFBTRVVET05ZTQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5IYXNodGFibGUgUkZDMTc3OVN5bWJvbHMKLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuSGFzaHRhYmxlIFJGQzIyNTNTeW1ib2xzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgU0VSSUFMTlVNQkVSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgU04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBTVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIFNUUkVFVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIFNVUk5BTUUKLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuSGFzaHRhYmxlIFN5bWJvbExvb2tVcAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIFQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBVSUQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBVTklRVUVfSURFTlRJRklFUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIFVuc3RydWN0dXJlZEFkZHJlc3MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBVbnN0cnVjdHVyZWROYW1lCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuWDUwOU5hbWVFbnRyeUNvbnZlcnRlciBjb252ZXJ0ZXIKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5YNTA5TmFtZUVsZW1lbnRMaXN0IGVsZW1zCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSBzZXEKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5Llg1MDlOYW1lRW50cnlDb252ZXJ0ZXIpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEudXRpbC5IYXNodGFibGUpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEudXRpbC5WZWN0b3IKLWphdmEudXRpbC5IYXNodGFibGUpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEudXRpbC5WZWN0b3IKLWphdmEudXRpbC5IYXNodGFibGUKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5Llg1MDlEZWZhdWx0RW50cnlDb252ZXJ0ZXIpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEudXRpbC5WZWN0b3IKLWphdmEudXRpbC5WZWN0b3IpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEudXRpbC5WZWN0b3IKLWphdmEudXRpbC5WZWN0b3IKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5Llg1MDlOYW1lRW50cnlDb252ZXJ0ZXIpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWJvb2xlYW4KLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWJvb2xlYW4KLWphdmEubGFuZy5TdHJpbmcKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5Llg1MDlOYW1lRW50cnlDb252ZXJ0ZXIpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWJvb2xlYW4KLWphdmEudXRpbC5IYXNodGFibGUKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWJvb2xlYW4KLWphdmEudXRpbC5IYXNodGFibGUKLWphdmEubGFuZy5TdHJpbmcKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5Llg1MDlOYW1lRW50cnlDb252ZXJ0ZXIpCi0KLXByaXZhdGUgdm9pZCBhcHBlbmRWYWx1ZSgKLWphdmEubGFuZy5TdHJpbmdCdWZmZXIKLWphdmEudXRpbC5IYXNodGFibGUKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgYnl0ZXNUb1N0cmluZygKLWJ5dGVbXSkKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBkZWNvZGVPSUQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnV0aWwuSGFzaHRhYmxlKQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5Llg1MDlOYW1lIGdldEluc3RhbmNlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5YNTA5TmFtZSBnZXRJbnN0YW5jZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xVGFnZ2VkT2JqZWN0Ci1ib29sZWFuKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0Ci1ib29sZWFuKQotCi1wdWJsaWMgamF2YS51dGlsLlZlY3RvciBnZXRPSURzKCkKLQotcHVibGljIGphdmEudXRpbC5WZWN0b3IgZ2V0VmFsdWVzKCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IHRvQVNOMU9iamVjdCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoCi1ib29sZWFuCi1qYXZhLnV0aWwuSGFzaHRhYmxlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5Llg1MDlOYW1lRWxlbWVudExpc3QgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgaW50IGFkZGVkCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIga2V5MAotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGtleTEKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBrZXkyCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIga2V5MwotCi1wcml2YXRlIGphdmEubGFuZy5PYmplY3RbXSByZXN0Ci0KLXByaXZhdGUgaW50IHNpemUKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHZhbHVlMAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgdmFsdWUxCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyB2YWx1ZTIKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHZhbHVlMwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIGFkZCgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBhZGQoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllcgotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotcHVibGljIGJvb2xlYW4gZ2V0QWRkZWQoCi1pbnQpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBnZXRLZXkoCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFZhbHVlKAotaW50KQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuWDUwOU5hbWVFbGVtZW50TGlzdCByZXZlcnNlKCkKLQotcHVibGljIHZvaWQgc2V0TGFzdEFkZGVkRmxhZygpCi0KLXB1YmxpYyBpbnQgc2l6ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuWDUwOU5hbWVUb2tlbml6ZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBidWYKLQotcHJpdmF0ZSBpbnQgaW5kZXgKLQotcHJpdmF0ZSBjaGFyIHNlcGVyYXRvcgotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgdmFsdWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1jaGFyKQotCi1wdWJsaWMgYm9vbGVhbiBoYXNNb3JlVG9rZW5zKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgbmV4dFRva2VuKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5xdWFsaWZpZWQuQmlvbWV0cmljRGF0YSBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMU9jdGV0U3RyaW5nIGJpb21ldHJpY0RhdGFIYXNoCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyIGhhc2hBbGdvcml0aG0KLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJJQTVTdHJpbmcgc291cmNlRGF0YVVyaQotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkucXVhbGlmaWVkLlR5cGVPZkJpb21ldHJpY0RhdGEgdHlwZU9mQmlvbWV0cmljRGF0YQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LnF1YWxpZmllZC5UeXBlT2ZCaW9tZXRyaWNEYXRhCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMU9jdGV0U3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5xdWFsaWZpZWQuVHlwZU9mQmlvbWV0cmljRGF0YQotb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllcgotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFPY3RldFN0cmluZwotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUklBNVN0cmluZykKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5xdWFsaWZpZWQuQmlvbWV0cmljRGF0YSBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMU9jdGV0U3RyaW5nIGdldEJpb21ldHJpY0RhdGFIYXNoKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIgZ2V0SGFzaEFsZ29yaXRobSgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSSUE1U3RyaW5nIGdldFNvdXJjZURhdGFVcmkoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkucXVhbGlmaWVkLlR5cGVPZkJpb21ldHJpY0RhdGEgZ2V0VHlwZU9mQmlvbWV0cmljRGF0YSgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IHRvQVNOMU9iamVjdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LnF1YWxpZmllZC5FVFNJUUNPYmplY3RJZGVudGlmaWVycyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGlkX2V0c2lfcWNzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgaWRfZXRzaV9xY3NfTGltaXRlVmFsdWUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBpZF9ldHNpX3Fjc19RY0NvbXBsaWFuY2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBpZF9ldHNpX3Fjc19RY1NTQ0QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBpZF9ldHNpX3Fjc19SZXRlbnRpb25QZXJpb2QKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkucXVhbGlmaWVkLklzbzQyMTdDdXJyZW5jeUNvZGUgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZSBpbXBsZW1lbnRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xQ2hvaWNlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIGludCBBTFBIQUJFVElDX01BWFNJWkUKLQotZmluYWwgaW50IE5VTUVSSUNfTUFYU0laRQotCi1maW5hbCBpbnQgTlVNRVJJQ19NSU5TSVpFCi0KLSBpbnQgbnVtZXJpYwotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkVuY29kYWJsZSBvYmoKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkucXVhbGlmaWVkLklzbzQyMTdDdXJyZW5jeUNvZGUgZ2V0SW5zdGFuY2UoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRBbHBoYWJldGljKCkKLQotcHVibGljIGludCBnZXROdW1lcmljKCkKLQotcHVibGljIGJvb2xlYW4gaXNBbHBoYWJldGljKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgdG9BU04xT2JqZWN0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5xdWFsaWZpZWQuTW9uZXRhcnlWYWx1ZSBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSSW50ZWdlciBhbW91bnQKLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LnF1YWxpZmllZC5Jc280MjE3Q3VycmVuY3lDb2RlIGN1cnJlbmN5Ci0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSSW50ZWdlciBleHBvbmVudAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LnF1YWxpZmllZC5Jc280MjE3Q3VycmVuY3lDb2RlCi1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5xdWFsaWZpZWQuTW9uZXRhcnlWYWx1ZSBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRBbW91bnQoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkucXVhbGlmaWVkLklzbzQyMTdDdXJyZW5jeUNvZGUgZ2V0Q3VycmVuY3koKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgZ2V0RXhwb25lbnQoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCB0b0FTTjFPYmplY3QoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5xdWFsaWZpZWQuUkZDMzczOVFDT2JqZWN0SWRlbnRpZmllcnMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBpZF9xY3MKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBpZF9xY3NfcGtpeFFDU3ludGF4X3YxCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgaWRfcWNzX3BraXhRQ1N5bnRheF92MgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5xdWFsaWZpZWQuUUNTdGF0ZW1lbnQgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZSBpbXBsZW1lbnRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LnF1YWxpZmllZC5FVFNJUUNPYmplY3RJZGVudGlmaWVycywgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkucXVhbGlmaWVkLlJGQzM3MzlRQ09iamVjdElkZW50aWZpZXJzCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBxY1N0YXRlbWVudElkCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZSBxY1N0YXRlbWVudEluZm8KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllcikKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlKQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LnF1YWxpZmllZC5RQ1N0YXRlbWVudCBnZXRJbnN0YW5jZSgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBnZXRTdGF0ZW1lbnRJZCgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZSBnZXRTdGF0ZW1lbnRJbmZvKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgdG9BU04xT2JqZWN0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5xdWFsaWZpZWQuU2VtYW50aWNzSW5mb3JtYXRpb24gZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuR2VuZXJhbE5hbWVbXSBuYW1lUmVnaXN0cmF0aW9uQXV0aG9yaXRpZXMKLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIHNlbWFudGljc0lkZW50aWZpZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllcikKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkdlbmVyYWxOYW1lW10pCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkdlbmVyYWxOYW1lW10pCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkucXVhbGlmaWVkLlNlbWFudGljc0luZm9ybWF0aW9uIGdldEluc3RhbmNlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkdlbmVyYWxOYW1lW10gZ2V0TmFtZVJlZ2lzdHJhdGlvbkF1dGhvcml0aWVzKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGdldFNlbWFudGljc0lkZW50aWZpZXIoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCB0b0FTTjFPYmplY3QoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LnF1YWxpZmllZC5UeXBlT2ZCaW9tZXRyaWNEYXRhIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFFbmNvZGFibGUgaW1wbGVtZW50cyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUNob2ljZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBIQU5EV1JJVFRFTl9TSUdOQVRVUkUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUElDVFVSRQotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkVuY29kYWJsZSBvYmoKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1pbnQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyKQotCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LnF1YWxpZmllZC5UeXBlT2ZCaW9tZXRyaWNEYXRhIGdldEluc3RhbmNlKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGdldEJpb21ldHJpY0RhdGFPaWQoKQotCi1wdWJsaWMgaW50IGdldFByZWRlZmluZWRCaW9tZXRyaWNUeXBlKCkKLQotcHVibGljIGJvb2xlYW4gaXNQcmVkZWZpbmVkKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgdG9BU04xT2JqZWN0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5zaWdpLlNpZ0lPYmplY3RJZGVudGlmaWVycyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBpZF9zaWdpCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgaWRfc2lnaV9jcAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGlkX3NpZ2lfY3Bfc2lnY29uZm9ybQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGlkX3NpZ2lfa3AKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBpZF9zaWdpX2twX2RpcmVjdG9yeVNlcnZpY2UKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBpZF9zaWdpX29uCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgaWRfc2lnaV9vbl9wZXJzb25hbERhdGEKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDkuWDlPYmplY3RJZGVudGlmaWVycyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGFuc2lfWDlfNjIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBjMm9uYjE5MXY0Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgYzJvbmIxOTF2NQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGMyb25iMjM5djQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBjMm9uYjIzOXY1Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgYzJwbmIxNjN2MQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGMycG5iMTYzdjIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBjMnBuYjE2M3YzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgYzJwbmIxNzZ3MQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGMycG5iMjA4dzEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBjMnBuYjI3MncxCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgYzJwbmIzNjh3MQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGMycG5nMzA0djEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBjMnRuYjE5MXYxCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgYzJ0bmIxOTF2MgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGMydG5iMTkxdjMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBjMnRuYjIzOXYxCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgYzJ0bmIyMzl2MgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGMydG5iMjM5djMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBjMnRuYjM1OXYxCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgYzJ0bmI0MzFyMQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgY1R3b0N1cnZlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgY2hhcmFjdGVyaXN0aWNfdHdvX2ZpZWxkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgZGhwdWJsaWNudW1iZXIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBlY2RzYV93aXRoX1NIQTEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBlY2RzYV93aXRoX1NIQTIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBlY2RzYV93aXRoX1NIQTIyNAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGVjZHNhX3dpdGhfU0hBMjU2Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgZWNkc2Ffd2l0aF9TSEEzODQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBlY2RzYV93aXRoX1NIQTUxMgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgZWxsaXB0aWNDdXJ2ZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGduQmFzaXMKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBpZF9kc2EKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBpZF9kc2Ffd2l0aF9zaGExCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgaWRfZWNQdWJsaWNLZXkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGlkX2VjU2lnVHlwZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgaWRfZmllbGRUeXBlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBpZF9wdWJsaWNLZXlUeXBlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgcHBCYXNpcwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIHByaW1lMTkydjEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBwcmltZTE5MnYyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgcHJpbWUxOTJ2MwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIHByaW1lMjM5djEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBwcmltZTIzOXYyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgcHJpbWUyMzl2MwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIHByaW1lMjU2djEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIHByaW1lQ3VydmUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBwcmltZV9maWVsZAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIHRwQmFzaXMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkFzeW1tZXRyaWNCbG9ja0NpcGhlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldElucHV0QmxvY2tTaXplKCkKLQotcHVibGljIGFic3RyYWN0IGludCBnZXRPdXRwdXRCbG9ja1NpemUoKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBpbml0KAotYm9vbGVhbgotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQ2lwaGVyUGFyYW1ldGVycykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9jcnlwdG8vSW52YWxpZENpcGhlclRleHRFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBieXRlW10gcHJvY2Vzc0Jsb2NrKAotYnl0ZVtdCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5Bc3ltbWV0cmljQ2lwaGVyS2V5UGFpciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5DaXBoZXJQYXJhbWV0ZXJzIHByaXZhdGVQYXJhbQotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkNpcGhlclBhcmFtZXRlcnMgcHVibGljUGFyYW0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5DaXBoZXJQYXJhbWV0ZXJzCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5DaXBoZXJQYXJhbWV0ZXJzKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQ2lwaGVyUGFyYW1ldGVycyBnZXRQcml2YXRlKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkNpcGhlclBhcmFtZXRlcnMgZ2V0UHVibGljKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQXN5bW1ldHJpY0NpcGhlcktleVBhaXJHZW5lcmF0b3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkFzeW1tZXRyaWNDaXBoZXJLZXlQYWlyIGdlbmVyYXRlS2V5UGFpcigpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGluaXQoCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5LZXlHZW5lcmF0aW9uUGFyYW1ldGVycykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQmFzaWNBZ3JlZW1lbnQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IGphdmEubWF0aC5CaWdJbnRlZ2VyIGNhbGN1bGF0ZUFncmVlbWVudCgKLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkNpcGhlclBhcmFtZXRlcnMpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGluaXQoCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5DaXBoZXJQYXJhbWV0ZXJzKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5CbG9ja0NpcGhlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRBbGdvcml0aG1OYW1lKCkKLQotcHVibGljIGFic3RyYWN0IGludCBnZXRCbG9ja1NpemUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBpbml0KAotYm9vbGVhbgotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQ2lwaGVyUGFyYW1ldGVycykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9jcnlwdG8vRGF0YUxlbmd0aEV4Y2VwdGlvbjtMamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCBwcm9jZXNzQmxvY2soCi1ieXRlW10KLWludAotYnl0ZVtdCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlc2V0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5CdWZmZXJlZEFzeW1tZXRyaWNCbG9ja0NpcGhlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIGJ5dGVbXSBidWYKLQotcHJvdGVjdGVkIGludCBidWZPZmYKLQotcHJpdmF0ZSBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5Bc3ltbWV0cmljQmxvY2tDaXBoZXIgY2lwaGVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQXN5bW1ldHJpY0Jsb2NrQ2lwaGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2NyeXB0by9JbnZhbGlkQ2lwaGVyVGV4dEV4Y2VwdGlvbjsgKQotcHVibGljIGJ5dGVbXSBkb0ZpbmFsKCkKLQotcHVibGljIGludCBnZXRCdWZmZXJQb3NpdGlvbigpCi0KLXB1YmxpYyBpbnQgZ2V0SW5wdXRCbG9ja1NpemUoKQotCi1wdWJsaWMgaW50IGdldE91dHB1dEJsb2NrU2l6ZSgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5Bc3ltbWV0cmljQmxvY2tDaXBoZXIgZ2V0VW5kZXJseWluZ0NpcGhlcigpCi0KLXB1YmxpYyB2b2lkIGluaXQoCi1ib29sZWFuCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5DaXBoZXJQYXJhbWV0ZXJzKQotCi1wdWJsaWMgdm9pZCBwcm9jZXNzQnl0ZSgKLWJ5dGUpCi0KLXB1YmxpYyB2b2lkIHByb2Nlc3NCeXRlcygKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIHJlc2V0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5CdWZmZXJlZEJsb2NrQ2lwaGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgYnl0ZVtdIGJ1ZgotCi1wcm90ZWN0ZWQgaW50IGJ1Zk9mZgotCi1wcm90ZWN0ZWQgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQmxvY2tDaXBoZXIgY2lwaGVyCi0KLXByb3RlY3RlZCBib29sZWFuIGZvckVuY3J5cHRpb24KLQotcHJvdGVjdGVkIGJvb2xlYW4gcGFydGlhbEJsb2NrT2theQotCi1wcm90ZWN0ZWQgYm9vbGVhbiBwZ3BDRkIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5CbG9ja0NpcGhlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9jcnlwdG8vRGF0YUxlbmd0aEV4Y2VwdGlvbjtMamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbjtMb3JnL2JvdW5jeWNhc3RsZS9jcnlwdG8vSW52YWxpZENpcGhlclRleHRFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgZG9GaW5hbCgKLWJ5dGVbXQotaW50KQotCi1wdWJsaWMgaW50IGdldEJsb2NrU2l6ZSgpCi0KLXB1YmxpYyBpbnQgZ2V0T3V0cHV0U2l6ZSgKLWludCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkJsb2NrQ2lwaGVyIGdldFVuZGVybHlpbmdDaXBoZXIoKQotCi1wdWJsaWMgaW50IGdldFVwZGF0ZU91dHB1dFNpemUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGluaXQoCi1ib29sZWFuCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5DaXBoZXJQYXJhbWV0ZXJzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2NyeXB0by9EYXRhTGVuZ3RoRXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHByb2Nlc3NCeXRlKAotYnl0ZQotYnl0ZVtdCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvY3J5cHRvL0RhdGFMZW5ndGhFeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcHJvY2Vzc0J5dGVzKAotYnl0ZVtdCi1pbnQKLWludAotYnl0ZVtdCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHJlc2V0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5DaXBoZXJLZXlHZW5lcmF0b3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSByYW5kb20KLQotcHJvdGVjdGVkIGludCBzdHJlbmd0aAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBieXRlW10gZ2VuZXJhdGVLZXkoKQotCi1wdWJsaWMgdm9pZCBpbml0KAotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uS2V5R2VuZXJhdGlvblBhcmFtZXRlcnMpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkNpcGhlclBhcmFtZXRlcnMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5DcnlwdG9FeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uRFNBIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLm1hdGguQmlnSW50ZWdlcltdIGdlbmVyYXRlU2lnbmF0dXJlKAotYnl0ZVtdKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBpbml0KAotYm9vbGVhbgotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQ2lwaGVyUGFyYW1ldGVycykKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gdmVyaWZ5U2lnbmF0dXJlKAotYnl0ZVtdCi1qYXZhLm1hdGguQmlnSW50ZWdlcgotamF2YS5tYXRoLkJpZ0ludGVnZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uUnVudGltZUNyeXB0b0V4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5EYXRhTGVuZ3RoRXhjZXB0aW9uIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uUnVudGltZUNyeXB0b0V4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkRlcml2YXRpb25GdW5jdGlvbiBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2NyeXB0by9EYXRhTGVuZ3RoRXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdlbmVyYXRlQnl0ZXMoCi1ieXRlW10KLWludAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uRGlnZXN0IGdldERpZ2VzdCgpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGluaXQoCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5EZXJpdmF0aW9uUGFyYW1ldGVycykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uRGVyaXZhdGlvblBhcmFtZXRlcnMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5JbnZhbGlkQ2lwaGVyVGV4dEV4Y2VwdGlvbiBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkNyeXB0b0V4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uS2V5R2VuZXJhdGlvblBhcmFtZXRlcnMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20gcmFuZG9tCi0KLXByaXZhdGUgaW50IHN0cmVuZ3RoCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20KLWludCkKLQotcHVibGljIGphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tIGdldFJhbmRvbSgpCi0KLXB1YmxpYyBpbnQgZ2V0U3RyZW5ndGgoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5NYWMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9jcnlwdG8vRGF0YUxlbmd0aEV4Y2VwdGlvbjtMamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGludCBkb0ZpbmFsKAotYnl0ZVtdCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldEFsZ29yaXRobU5hbWUoKQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGdldE1hY1NpemUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBpbml0KAotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQ2lwaGVyUGFyYW1ldGVycykKLQotcHVibGljIGFic3RyYWN0IHZvaWQgcmVzZXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB1cGRhdGUoCi1ieXRlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2NyeXB0by9EYXRhTGVuZ3RoRXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB1cGRhdGUoCi1ieXRlW10KLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLlBCRVBhcmFtZXRlcnNHZW5lcmF0b3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCBpbnQgaXRlcmF0aW9uQ291bnQKLQotcHJvdGVjdGVkIGJ5dGVbXSBwYXNzd29yZAotCi1wcm90ZWN0ZWQgYnl0ZVtdIHNhbHQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIGJ5dGVbXSBQS0NTMTJQYXNzd29yZFRvQnl0ZXMoCi1jaGFyW10pCi0KLXB1YmxpYyBzdGF0aWMgYnl0ZVtdIFBLQ1M1UGFzc3dvcmRUb0J5dGVzKAotY2hhcltdKQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQ2lwaGVyUGFyYW1ldGVycyBnZW5lcmF0ZURlcml2ZWRNYWNQYXJhbWV0ZXJzKAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQ2lwaGVyUGFyYW1ldGVycyBnZW5lcmF0ZURlcml2ZWRQYXJhbWV0ZXJzKAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQ2lwaGVyUGFyYW1ldGVycyBnZW5lcmF0ZURlcml2ZWRQYXJhbWV0ZXJzKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0SXRlcmF0aW9uQ291bnQoKQotCi1wdWJsaWMgYnl0ZVtdIGdldFBhc3N3b3JkKCkKLQotcHVibGljIGJ5dGVbXSBnZXRTYWx0KCkKLQotcHVibGljIHZvaWQgaW5pdCgKLWJ5dGVbXQotYnl0ZVtdCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLlNpZ25lciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2NyeXB0by9DcnlwdG9FeGNlcHRpb247TG9yZy9ib3VuY3ljYXN0bGUvY3J5cHRvL0RhdGFMZW5ndGhFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBieXRlW10gZ2VuZXJhdGVTaWduYXR1cmUoKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBpbml0KAotYm9vbGVhbgotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQ2lwaGVyUGFyYW1ldGVycykKLQotcHVibGljIGFic3RyYWN0IHZvaWQgcmVzZXQoKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB1cGRhdGUoCi1ieXRlKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCB1cGRhdGUoCi1ieXRlW10KLWludAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiB2ZXJpZnlTaWduYXR1cmUoCi1ieXRlW10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLlNpZ25lcldpdGhSZWNvdmVyeSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5TaWduZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgYnl0ZVtdIGdldFJlY292ZXJlZE1lc3NhZ2UoKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBoYXNGdWxsTWVzc2FnZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLlN0cmVhbUNpcGhlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRBbGdvcml0aG1OYW1lKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgaW5pdCgKLWJvb2xlYW4KLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkNpcGhlclBhcmFtZXRlcnMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvY3J5cHRvL0RhdGFMZW5ndGhFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHByb2Nlc3NCeXRlcygKLWJ5dGVbXQotaW50Ci1pbnQKLWJ5dGVbXQotaW50KQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCByZXNldCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBieXRlIHJldHVybkJ5dGUoCi1ieXRlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLlN0cmVhbUJsb2NrQ2lwaGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLlN0cmVhbUNpcGhlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkJsb2NrQ2lwaGVyIGNpcGhlcgotCi1wcml2YXRlIGJ5dGVbXSBvbmVCeXRlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQmxvY2tDaXBoZXIpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEFsZ29yaXRobU5hbWUoKQotCi1wdWJsaWMgdm9pZCBpbml0KAotYm9vbGVhbgotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQ2lwaGVyUGFyYW1ldGVycykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9jcnlwdG8vRGF0YUxlbmd0aEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcHJvY2Vzc0J5dGVzKAotYnl0ZVtdCi1pbnQKLWludAotYnl0ZVtdCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHJlc2V0KCkKLQotcHVibGljIGJ5dGUgcmV0dXJuQnl0ZSgKLWJ5dGUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLldyYXBwZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0QWxnb3JpdGhtTmFtZSgpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGluaXQoCi1ib29sZWFuCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5DaXBoZXJQYXJhbWV0ZXJzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2NyeXB0by9JbnZhbGlkQ2lwaGVyVGV4dEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJ5dGVbXSB1bndyYXAoCi1ieXRlW10KLWludAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgYnl0ZVtdIHdyYXAoCi1ieXRlW10KLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLmFncmVlbWVudC5ESEFncmVlbWVudCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5wYXJhbXMuREhQYXJhbWV0ZXJzIGRoUGFyYW1zCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ucGFyYW1zLkRIUHJpdmF0ZUtleVBhcmFtZXRlcnMga2V5Ci0KLXByaXZhdGUgamF2YS5tYXRoLkJpZ0ludGVnZXIgcHJpdmF0ZVZhbHVlCi0KLXByaXZhdGUgamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20gcmFuZG9tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGNhbGN1bGF0ZUFncmVlbWVudCgKLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLnBhcmFtcy5ESFB1YmxpY0tleVBhcmFtZXRlcnMKLWphdmEubWF0aC5CaWdJbnRlZ2VyKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgY2FsY3VsYXRlTWVzc2FnZSgpCi0KLXB1YmxpYyB2b2lkIGluaXQoCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5DaXBoZXJQYXJhbWV0ZXJzKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLmFncmVlbWVudC5ESEJhc2ljQWdyZWVtZW50IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkJhc2ljQWdyZWVtZW50Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ucGFyYW1zLkRIUGFyYW1ldGVycyBkaFBhcmFtcwotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLnBhcmFtcy5ESFByaXZhdGVLZXlQYXJhbWV0ZXJzIGtleQotCi1wcml2YXRlIGphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tIHJhbmRvbQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBjYWxjdWxhdGVBZ3JlZW1lbnQoCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5DaXBoZXJQYXJhbWV0ZXJzKQotCi1wdWJsaWMgdm9pZCBpbml0KAotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQ2lwaGVyUGFyYW1ldGVycykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5kaWdlc3RzLkdlbmVyYWxEaWdlc3QgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uRXh0ZW5kZWREaWdlc3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJZVEVfTEVOR1RICi0KLXByaXZhdGUgbG9uZyBieXRlQ291bnQKLQotcHJpdmF0ZSBieXRlW10geEJ1ZgotCi1wcml2YXRlIGludCB4QnVmT2ZmCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KCkKLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uZGlnZXN0cy5HZW5lcmFsRGlnZXN0KQotCi1wdWJsaWMgdm9pZCBmaW5pc2goKQotCi1wdWJsaWMgaW50IGdldEJ5dGVMZW5ndGgoKQotCi1wcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwcm9jZXNzQmxvY2soKQotCi1wcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwcm9jZXNzTGVuZ3RoKAotbG9uZykKLQotcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcHJvY2Vzc1dvcmQoCi1ieXRlW10KLWludCkKLQotcHVibGljIHZvaWQgcmVzZXQoKQotCi1wdWJsaWMgdm9pZCB1cGRhdGUoCi1ieXRlKQotCi1wdWJsaWMgdm9pZCB1cGRhdGUoCi1ieXRlW10KLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLmRpZ2VzdHMuTG9uZ0RpZ2VzdCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5FeHRlbmRlZERpZ2VzdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQllURV9MRU5HVEgKLQotc3RhdGljIGZpbmFsIGxvbmdbXSBLCi0KLXByb3RlY3RlZCBsb25nIEgxCi0KLXByb3RlY3RlZCBsb25nIEgyCi0KLXByb3RlY3RlZCBsb25nIEgzCi0KLXByb3RlY3RlZCBsb25nIEg0Ci0KLXByb3RlY3RlZCBsb25nIEg1Ci0KLXByb3RlY3RlZCBsb25nIEg2Ci0KLXByb3RlY3RlZCBsb25nIEg3Ci0KLXByb3RlY3RlZCBsb25nIEg4Ci0KLXByaXZhdGUgbG9uZ1tdIFcKLQotcHJpdmF0ZSBsb25nIGJ5dGVDb3VudDEKLQotcHJpdmF0ZSBsb25nIGJ5dGVDb3VudDIKLQotcHJpdmF0ZSBpbnQgd09mZgotCi1wcml2YXRlIGJ5dGVbXSB4QnVmCi0KLXByaXZhdGUgaW50IHhCdWZPZmYKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigpCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLmRpZ2VzdHMuTG9uZ0RpZ2VzdCkKLQotcHJpdmF0ZSBsb25nIENoKAotbG9uZwotbG9uZwotbG9uZykKLQotcHJpdmF0ZSBsb25nIE1haigKLWxvbmcKLWxvbmcKLWxvbmcpCi0KLXByaXZhdGUgbG9uZyBTaWdtYTAoCi1sb25nKQotCi1wcml2YXRlIGxvbmcgU2lnbWExKAotbG9uZykKLQotcHJpdmF0ZSBsb25nIFN1bTAoCi1sb25nKQotCi1wcml2YXRlIGxvbmcgU3VtMSgKLWxvbmcpCi0KLXByaXZhdGUgdm9pZCBhZGp1c3RCeXRlQ291bnRzKCkKLQotcHVibGljIHZvaWQgZmluaXNoKCkKLQotcHVibGljIGludCBnZXRCeXRlTGVuZ3RoKCkKLQotcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0Jsb2NrKCkKLQotcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0xlbmd0aCgKLWxvbmcKLWxvbmcpCi0KLXByb3RlY3RlZCB2b2lkIHByb2Nlc3NXb3JkKAotYnl0ZVtdCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHJlc2V0KCkKLQotcHJvdGVjdGVkIHZvaWQgdW5wYWNrV29yZCgKLWxvbmcKLWJ5dGVbXQotaW50KQotCi1wdWJsaWMgdm9pZCB1cGRhdGUoCi1ieXRlKQotCi1wdWJsaWMgdm9pZCB1cGRhdGUoCi1ieXRlW10KLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLmRpZ2VzdHMuTUQyRGlnZXN0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkV4dGVuZGVkRGlnZXN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBESUdFU1RfTEVOR1RICi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBTCi0KLXByaXZhdGUgYnl0ZVtdIEMKLQotcHJpdmF0ZSBpbnQgQ09mZgotCi1wcml2YXRlIGJ5dGVbXSBNCi0KLXByaXZhdGUgYnl0ZVtdIFgKLQotcHJpdmF0ZSBpbnQgbU9mZgotCi1wcml2YXRlIGludCB4T2ZmCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5kaWdlc3RzLk1EMkRpZ2VzdCkKLQotcHVibGljIGludCBkb0ZpbmFsKAotYnl0ZVtdCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEFsZ29yaXRobU5hbWUoKQotCi1wdWJsaWMgaW50IGdldEJ5dGVMZW5ndGgoKQotCi1wdWJsaWMgaW50IGdldERpZ2VzdFNpemUoKQotCi1wcm90ZWN0ZWQgdm9pZCBwcm9jZXNzQmxvY2soCi1ieXRlW10pCi0KLXByb3RlY3RlZCB2b2lkIHByb2Nlc3NDaGVja1N1bSgKLWJ5dGVbXSkKLQotcHVibGljIHZvaWQgcmVzZXQoKQotCi1wdWJsaWMgdm9pZCB1cGRhdGUoCi1ieXRlKQotCi1wdWJsaWMgdm9pZCB1cGRhdGUoCi1ieXRlW10KLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLmRpZ2VzdHMuTUQ0RGlnZXN0IGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uZGlnZXN0cy5HZW5lcmFsRGlnZXN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBESUdFU1RfTEVOR1RICi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTMTEKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFMxMgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUzEzCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTMTQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFMyMQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUzIyCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTMjMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFMyNAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUzMxCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTMzIKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFMzMwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUzM0Ci0KLXByaXZhdGUgaW50IEgxCi0KLXByaXZhdGUgaW50IEgyCi0KLXByaXZhdGUgaW50IEgzCi0KLXByaXZhdGUgaW50IEg0Ci0KLXByaXZhdGUgaW50W10gWAotCi1wcml2YXRlIGludCB4T2ZmCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uZGlnZXN0cy5NRDREaWdlc3QpCi0KLXByaXZhdGUgaW50IEYoCi1pbnQKLWludAotaW50KQotCi1wcml2YXRlIGludCBHKAotaW50Ci1pbnQKLWludCkKLQotcHJpdmF0ZSBpbnQgSCgKLWludAotaW50Ci1pbnQpCi0KLXByaXZhdGUgaW50IHJvdGF0ZUxlZnQoCi1pbnQKLWludCkKLQotcHJpdmF0ZSB2b2lkIHVucGFja1dvcmQoCi1pbnQKLWJ5dGVbXQotaW50KQotCi1wdWJsaWMgaW50IGRvRmluYWwoCi1ieXRlW10KLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QWxnb3JpdGhtTmFtZSgpCi0KLXB1YmxpYyBpbnQgZ2V0RGlnZXN0U2l6ZSgpCi0KLXByb3RlY3RlZCB2b2lkIHByb2Nlc3NCbG9jaygpCi0KLXByb3RlY3RlZCB2b2lkIHByb2Nlc3NMZW5ndGgoCi1sb25nKQotCi1wcm90ZWN0ZWQgdm9pZCBwcm9jZXNzV29yZCgKLWJ5dGVbXQotaW50KQotCi1wdWJsaWMgdm9pZCByZXNldCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uZGlnZXN0cy5NRDVEaWdlc3QgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5kaWdlc3RzLkdlbmVyYWxEaWdlc3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJR0VTVF9MRU5HVEgKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFMxMQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUzEyCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTMTMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFMxNAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUzIxCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTMjIKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFMyMwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUzI0Ci0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTMzEKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFMzMgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUzMzCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTMzQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFM0MQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUzQyCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTNDMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFM0NAotCi1wcml2YXRlIGludCBIMQotCi1wcml2YXRlIGludCBIMgotCi1wcml2YXRlIGludCBIMwotCi1wcml2YXRlIGludCBINAotCi1wcml2YXRlIGludFtdIFgKLQotcHJpdmF0ZSBpbnQgeE9mZgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLmRpZ2VzdHMuTUQ1RGlnZXN0KQotCi1wcml2YXRlIGludCBGKAotaW50Ci1pbnQKLWludCkKLQotcHJpdmF0ZSBpbnQgRygKLWludAotaW50Ci1pbnQpCi0KLXByaXZhdGUgaW50IEgoCi1pbnQKLWludAotaW50KQotCi1wcml2YXRlIGludCBLKAotaW50Ci1pbnQKLWludCkKLQotcHJpdmF0ZSBpbnQgcm90YXRlTGVmdCgKLWludAotaW50KQotCi1wcml2YXRlIHZvaWQgdW5wYWNrV29yZCgKLWludAotYnl0ZVtdCi1pbnQpCi0KLXB1YmxpYyBpbnQgZG9GaW5hbCgKLWJ5dGVbXQotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRBbGdvcml0aG1OYW1lKCkKLQotcHVibGljIGludCBnZXREaWdlc3RTaXplKCkKLQotcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0Jsb2NrKCkKLQotcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0xlbmd0aCgKLWxvbmcpCi0KLXByb3RlY3RlZCB2b2lkIHByb2Nlc3NXb3JkKAotYnl0ZVtdCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHJlc2V0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5kaWdlc3RzLlNIQTFEaWdlc3QgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5kaWdlc3RzLkdlbmVyYWxEaWdlc3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJR0VTVF9MRU5HVEgKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFkxCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBZMgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWTMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFk0Ci0KLXByaXZhdGUgaW50IEgxCi0KLXByaXZhdGUgaW50IEgyCi0KLXByaXZhdGUgaW50IEgzCi0KLXByaXZhdGUgaW50IEg0Ci0KLXByaXZhdGUgaW50IEg1Ci0KLXByaXZhdGUgaW50W10gWAotCi1wcml2YXRlIGludCB4T2ZmCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uZGlnZXN0cy5TSEExRGlnZXN0KQotCi1wcml2YXRlIGludCBmKAotaW50Ci1pbnQKLWludCkKLQotcHJpdmF0ZSBpbnQgZygKLWludAotaW50Ci1pbnQpCi0KLXByaXZhdGUgaW50IGgoCi1pbnQKLWludAotaW50KQotCi1wcml2YXRlIHZvaWQgdW5wYWNrV29yZCgKLWludAotYnl0ZVtdCi1pbnQpCi0KLXB1YmxpYyBpbnQgZG9GaW5hbCgKLWJ5dGVbXQotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRBbGdvcml0aG1OYW1lKCkKLQotcHVibGljIGludCBnZXREaWdlc3RTaXplKCkKLQotcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0Jsb2NrKCkKLQotcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0xlbmd0aCgKLWxvbmcpCi0KLXByb3RlY3RlZCB2b2lkIHByb2Nlc3NXb3JkKAotYnl0ZVtdCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHJlc2V0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5kaWdlc3RzLlNIQTIyNERpZ2VzdCBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLmRpZ2VzdHMuR2VuZXJhbERpZ2VzdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElHRVNUX0xFTkdUSAotCi1zdGF0aWMgZmluYWwgaW50W10gSwotCi1wcml2YXRlIGludCBIMQotCi1wcml2YXRlIGludCBIMgotCi1wcml2YXRlIGludCBIMwotCi1wcml2YXRlIGludCBINAotCi1wcml2YXRlIGludCBINQotCi1wcml2YXRlIGludCBINgotCi1wcml2YXRlIGludCBINwotCi1wcml2YXRlIGludCBIOAotCi1wcml2YXRlIGludFtdIFgKLQotcHJpdmF0ZSBpbnQgeE9mZgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uZGlnZXN0cy5TSEEyMjREaWdlc3QpCi0KLXByaXZhdGUgaW50IENoKAotaW50Ci1pbnQKLWludCkKLQotcHJpdmF0ZSBpbnQgTWFqKAotaW50Ci1pbnQKLWludCkKLQotcHJpdmF0ZSBpbnQgU3VtMCgKLWludCkKLQotcHJpdmF0ZSBpbnQgU3VtMSgKLWludCkKLQotcHJpdmF0ZSBpbnQgVGhldGEwKAotaW50KQotCi1wcml2YXRlIGludCBUaGV0YTEoCi1pbnQpCi0KLXByaXZhdGUgdm9pZCB1bnBhY2tXb3JkKAotaW50Ci1ieXRlW10KLWludCkKLQotcHVibGljIGludCBkb0ZpbmFsKAotYnl0ZVtdCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEFsZ29yaXRobU5hbWUoKQotCi1wdWJsaWMgaW50IGdldERpZ2VzdFNpemUoKQotCi1wcm90ZWN0ZWQgdm9pZCBwcm9jZXNzQmxvY2soKQotCi1wcm90ZWN0ZWQgdm9pZCBwcm9jZXNzTGVuZ3RoKAotbG9uZykKLQotcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1dvcmQoCi1ieXRlW10KLWludCkKLQotcHVibGljIHZvaWQgcmVzZXQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLmRpZ2VzdHMuU0hBMjU2RGlnZXN0IGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uZGlnZXN0cy5HZW5lcmFsRGlnZXN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBESUdFU1RfTEVOR1RICi0KLXN0YXRpYyBmaW5hbCBpbnRbXSBLCi0KLXByaXZhdGUgaW50IEgxCi0KLXByaXZhdGUgaW50IEgyCi0KLXByaXZhdGUgaW50IEgzCi0KLXByaXZhdGUgaW50IEg0Ci0KLXByaXZhdGUgaW50IEg1Ci0KLXByaXZhdGUgaW50IEg2Ci0KLXByaXZhdGUgaW50IEg3Ci0KLXByaXZhdGUgaW50IEg4Ci0KLXByaXZhdGUgaW50W10gWAotCi1wcml2YXRlIGludCB4T2ZmCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5kaWdlc3RzLlNIQTI1NkRpZ2VzdCkKLQotcHJpdmF0ZSBpbnQgQ2goCi1pbnQKLWludAotaW50KQotCi1wcml2YXRlIGludCBNYWooCi1pbnQKLWludAotaW50KQotCi1wcml2YXRlIGludCBTdW0wKAotaW50KQotCi1wcml2YXRlIGludCBTdW0xKAotaW50KQotCi1wcml2YXRlIGludCBUaGV0YTAoCi1pbnQpCi0KLXByaXZhdGUgaW50IFRoZXRhMSgKLWludCkKLQotcHJpdmF0ZSB2b2lkIHVucGFja1dvcmQoCi1pbnQKLWJ5dGVbXQotaW50KQotCi1wdWJsaWMgaW50IGRvRmluYWwoCi1ieXRlW10KLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QWxnb3JpdGhtTmFtZSgpCi0KLXB1YmxpYyBpbnQgZ2V0RGlnZXN0U2l6ZSgpCi0KLXByb3RlY3RlZCB2b2lkIHByb2Nlc3NCbG9jaygpCi0KLXByb3RlY3RlZCB2b2lkIHByb2Nlc3NMZW5ndGgoCi1sb25nKQotCi1wcm90ZWN0ZWQgdm9pZCBwcm9jZXNzV29yZCgKLWJ5dGVbXQotaW50KQotCi1wdWJsaWMgdm9pZCByZXNldCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uZGlnZXN0cy5TSEEzODREaWdlc3QgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5kaWdlc3RzLkxvbmdEaWdlc3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJR0VTVF9MRU5HVEgKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5kaWdlc3RzLlNIQTM4NERpZ2VzdCkKLQotcHVibGljIGludCBkb0ZpbmFsKAotYnl0ZVtdCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEFsZ29yaXRobU5hbWUoKQotCi1wdWJsaWMgaW50IGdldERpZ2VzdFNpemUoKQotCi1wdWJsaWMgdm9pZCByZXNldCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uZGlnZXN0cy5TSEE1MTJEaWdlc3QgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5kaWdlc3RzLkxvbmdEaWdlc3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJR0VTVF9MRU5HVEgKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5kaWdlc3RzLlNIQTUxMkRpZ2VzdCkKLQotcHVibGljIGludCBkb0ZpbmFsKAotYnl0ZVtdCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEFsZ29yaXRobU5hbWUoKQotCi1wdWJsaWMgaW50IGdldERpZ2VzdFNpemUoKQotCi1wdWJsaWMgdm9pZCByZXNldCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uZGlnZXN0cy5TaG9ydGVuZWREaWdlc3QgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uRXh0ZW5kZWREaWdlc3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5FeHRlbmRlZERpZ2VzdCBiYXNlRGlnZXN0Ci0KLXByaXZhdGUgaW50IGxlbmd0aAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkV4dGVuZGVkRGlnZXN0Ci1pbnQpCi0KLXB1YmxpYyBpbnQgZG9GaW5hbCgKLWJ5dGVbXQotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRBbGdvcml0aG1OYW1lKCkKLQotcHVibGljIGludCBnZXRCeXRlTGVuZ3RoKCkKLQotcHVibGljIGludCBnZXREaWdlc3RTaXplKCkKLQotcHVibGljIHZvaWQgcmVzZXQoKQotCi1wdWJsaWMgdm9pZCB1cGRhdGUoCi1ieXRlKQotCi1wdWJsaWMgdm9pZCB1cGRhdGUoCi1ieXRlW10KLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLmVuY29kaW5ncy5JU085Nzk2ZDFFbmNvZGluZyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5Bc3ltbWV0cmljQmxvY2tDaXBoZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGludmVyc2UKLQotcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIHNoYWRvd3MKLQotcHJpdmF0ZSBpbnQgYml0U2l6ZQotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkFzeW1tZXRyaWNCbG9ja0NpcGhlciBlbmdpbmUKLQotcHJpdmF0ZSBib29sZWFuIGZvckVuY3J5cHRpb24KLQotcHJpdmF0ZSBpbnQgcGFkQml0cwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQXN5bW1ldHJpY0Jsb2NrQ2lwaGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2NyeXB0by9JbnZhbGlkQ2lwaGVyVGV4dEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSBieXRlW10gZGVjb2RlQmxvY2soCi1ieXRlW10KLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2NyeXB0by9JbnZhbGlkQ2lwaGVyVGV4dEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSBieXRlW10gZW5jb2RlQmxvY2soCi1ieXRlW10KLWludAotaW50KQotCi1wdWJsaWMgaW50IGdldElucHV0QmxvY2tTaXplKCkKLQotcHVibGljIGludCBnZXRPdXRwdXRCbG9ja1NpemUoKQotCi1wdWJsaWMgaW50IGdldFBhZEJpdHMoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQXN5bW1ldHJpY0Jsb2NrQ2lwaGVyIGdldFVuZGVybHlpbmdDaXBoZXIoKQotCi1wdWJsaWMgdm9pZCBpbml0KAotYm9vbGVhbgotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQ2lwaGVyUGFyYW1ldGVycykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9jcnlwdG8vSW52YWxpZENpcGhlclRleHRFeGNlcHRpb247ICkKLXB1YmxpYyBieXRlW10gcHJvY2Vzc0Jsb2NrKAotYnl0ZVtdCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgc2V0UGFkQml0cygKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5lbmNvZGluZ3MuT0FFUEVuY29kaW5nIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkFzeW1tZXRyaWNCbG9ja0NpcGhlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGJ5dGVbXSBkZWZIYXNoCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQXN5bW1ldHJpY0Jsb2NrQ2lwaGVyIGVuZ2luZQotCi1wcml2YXRlIGJvb2xlYW4gZm9yRW5jcnlwdGlvbgotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkRpZ2VzdCBoYXNoCi0KLXByaXZhdGUgamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20gcmFuZG9tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQXN5bW1ldHJpY0Jsb2NrQ2lwaGVyKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5Bc3ltbWV0cmljQmxvY2tDaXBoZXIKLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkRpZ2VzdCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQXN5bW1ldHJpY0Jsb2NrQ2lwaGVyCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5EaWdlc3QKLWJ5dGVbXSkKLQotcHJpdmF0ZSB2b2lkIEl0b09TUCgKLWludAotYnl0ZVtdKQotCi1wcml2YXRlIGJ5dGVbXSBtYXNrR2VuZXJhdG9yRnVuY3Rpb24xKAotYnl0ZVtdCi1pbnQKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2NyeXB0by9JbnZhbGlkQ2lwaGVyVGV4dEV4Y2VwdGlvbjsgKQotcHVibGljIGJ5dGVbXSBkZWNvZGVCbG9jaygKLWJ5dGVbXQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvY3J5cHRvL0ludmFsaWRDaXBoZXJUZXh0RXhjZXB0aW9uOyApCi1wdWJsaWMgYnl0ZVtdIGVuY29kZUJsb2NrKAotYnl0ZVtdCi1pbnQKLWludCkKLQotcHVibGljIGludCBnZXRJbnB1dEJsb2NrU2l6ZSgpCi0KLXB1YmxpYyBpbnQgZ2V0T3V0cHV0QmxvY2tTaXplKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkFzeW1tZXRyaWNCbG9ja0NpcGhlciBnZXRVbmRlcmx5aW5nQ2lwaGVyKCkKLQotcHVibGljIHZvaWQgaW5pdCgKLWJvb2xlYW4KLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkNpcGhlclBhcmFtZXRlcnMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvY3J5cHRvL0ludmFsaWRDaXBoZXJUZXh0RXhjZXB0aW9uOyApCi1wdWJsaWMgYnl0ZVtdIHByb2Nlc3NCbG9jaygKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uZW5jb2RpbmdzLlBLQ1MxRW5jb2RpbmcgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQXN5bW1ldHJpY0Jsb2NrQ2lwaGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGludCBIRUFERVJfTEVOR1RICi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBTVFJJQ1RfTEVOR1RIX0VOQUJMRURfUFJPUEVSVFkKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5Bc3ltbWV0cmljQmxvY2tDaXBoZXIgZW5naW5lCi0KLXByaXZhdGUgYm9vbGVhbiBmb3JFbmNyeXB0aW9uCi0KLXByaXZhdGUgYm9vbGVhbiBmb3JQcml2YXRlS2V5Ci0KLXByaXZhdGUgamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20gcmFuZG9tCi0KLXByaXZhdGUgYm9vbGVhbiB1c2VTdHJpY3RMZW5ndGgKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkFzeW1tZXRyaWNCbG9ja0NpcGhlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9jcnlwdG8vSW52YWxpZENpcGhlclRleHRFeGNlcHRpb247ICkKLXByaXZhdGUgYnl0ZVtdIGRlY29kZUJsb2NrKAotYnl0ZVtdCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9jcnlwdG8vSW52YWxpZENpcGhlclRleHRFeGNlcHRpb247ICkKLXByaXZhdGUgYnl0ZVtdIGVuY29kZUJsb2NrKAotYnl0ZVtdCi1pbnQKLWludCkKLQotcHVibGljIGludCBnZXRJbnB1dEJsb2NrU2l6ZSgpCi0KLXB1YmxpYyBpbnQgZ2V0T3V0cHV0QmxvY2tTaXplKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkFzeW1tZXRyaWNCbG9ja0NpcGhlciBnZXRVbmRlcmx5aW5nQ2lwaGVyKCkKLQotcHVibGljIHZvaWQgaW5pdCgKLWJvb2xlYW4KLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkNpcGhlclBhcmFtZXRlcnMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvY3J5cHRvL0ludmFsaWRDaXBoZXJUZXh0RXhjZXB0aW9uOyApCi1wdWJsaWMgYnl0ZVtdIHByb2Nlc3NCbG9jaygKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uZW5naW5lcy5BRVNFbmdpbmUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQmxvY2tDaXBoZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJMT0NLX1NJWkUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIFMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIFNpCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIFQwCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIFRpbnYwCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBtMQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgbTIKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IG0zCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIHJjb24KLQotcHJpdmF0ZSBpbnQgQzAKLQotcHJpdmF0ZSBpbnQgQzEKLQotcHJpdmF0ZSBpbnQgQzIKLQotcHJpdmF0ZSBpbnQgQzMKLQotcHJpdmF0ZSBpbnQgUk9VTkRTCi0KLXByaXZhdGUgaW50W11bXSBXb3JraW5nS2V5Ci0KLXByaXZhdGUgYm9vbGVhbiBmb3JFbmNyeXB0aW9uCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIGludCBGRm11bFgoCi1pbnQpCi0KLXByaXZhdGUgZmluYWwgdm9pZCBkZWNyeXB0QmxvY2soCi1pbnRbXVtdKQotCi1wcml2YXRlIGZpbmFsIHZvaWQgZW5jcnlwdEJsb2NrKAotaW50W11bXSkKLQotcHJpdmF0ZSBpbnRbXVtdIGdlbmVyYXRlV29ya2luZ0tleSgKLWJ5dGVbXQotYm9vbGVhbikKLQotcHJpdmF0ZSBpbnQgaW52X21jb2woCi1pbnQpCi0KLXByaXZhdGUgZmluYWwgdm9pZCBwYWNrQmxvY2soCi1ieXRlW10KLWludCkKLQotcHJpdmF0ZSBpbnQgc2hpZnQoCi1pbnQKLWludCkKLQotcHJpdmF0ZSBpbnQgc3ViV29yZCgKLWludCkKLQotcHJpdmF0ZSBmaW5hbCB2b2lkIHVucGFja0Jsb2NrKAotYnl0ZVtdCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEFsZ29yaXRobU5hbWUoKQotCi1wdWJsaWMgaW50IGdldEJsb2NrU2l6ZSgpCi0KLXB1YmxpYyB2b2lkIGluaXQoCi1ib29sZWFuCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5DaXBoZXJQYXJhbWV0ZXJzKQotCi1wdWJsaWMgaW50IHByb2Nlc3NCbG9jaygKLWJ5dGVbXQotaW50Ci1ieXRlW10KLWludCkKLQotcHVibGljIHZvaWQgcmVzZXQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLmVuZ2luZXMuQUVTRmFzdEVuZ2luZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5CbG9ja0NpcGhlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQkxPQ0tfU0laRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gU2kKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gVDAKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gVDEKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gVDIKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gVDMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gVGludjAKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gVGludjEKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gVGludjIKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gVGludjMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IG0xCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBtMgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgbTMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gcmNvbgotCi1wcml2YXRlIGludCBDMAotCi1wcml2YXRlIGludCBDMQotCi1wcml2YXRlIGludCBDMgotCi1wcml2YXRlIGludCBDMwotCi1wcml2YXRlIGludCBST1VORFMKLQotcHJpdmF0ZSBpbnRbXVtdIFdvcmtpbmdLZXkKLQotcHJpdmF0ZSBib29sZWFuIGZvckVuY3J5cHRpb24KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgaW50IEZGbXVsWCgKLWludCkKLQotcHJpdmF0ZSBmaW5hbCB2b2lkIGRlY3J5cHRCbG9jaygKLWludFtdW10pCi0KLXByaXZhdGUgZmluYWwgdm9pZCBlbmNyeXB0QmxvY2soCi1pbnRbXVtdKQotCi1wcml2YXRlIGludFtdW10gZ2VuZXJhdGVXb3JraW5nS2V5KAotYnl0ZVtdCi1ib29sZWFuKQotCi1wcml2YXRlIGludCBpbnZfbWNvbCgKLWludCkKLQotcHJpdmF0ZSBmaW5hbCB2b2lkIHBhY2tCbG9jaygKLWJ5dGVbXQotaW50KQotCi1wcml2YXRlIGludCBzaGlmdCgKLWludAotaW50KQotCi1wcml2YXRlIGludCBzdWJXb3JkKAotaW50KQotCi1wcml2YXRlIGZpbmFsIHZvaWQgdW5wYWNrQmxvY2soCi1ieXRlW10KLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QWxnb3JpdGhtTmFtZSgpCi0KLXB1YmxpYyBpbnQgZ2V0QmxvY2tTaXplKCkKLQotcHVibGljIHZvaWQgaW5pdCgKLWJvb2xlYW4KLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkNpcGhlclBhcmFtZXRlcnMpCi0KLXB1YmxpYyBpbnQgcHJvY2Vzc0Jsb2NrKAotYnl0ZVtdCi1pbnQKLWJ5dGVbXQotaW50KQotCi1wdWJsaWMgdm9pZCByZXNldCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uZW5naW5lcy5BRVNMaWdodEVuZ2luZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5CbG9ja0NpcGhlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQkxPQ0tfU0laRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gU2kKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IG0xCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBtMgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgbTMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gcmNvbgotCi1wcml2YXRlIGludCBDMAotCi1wcml2YXRlIGludCBDMQotCi1wcml2YXRlIGludCBDMgotCi1wcml2YXRlIGludCBDMwotCi1wcml2YXRlIGludCBST1VORFMKLQotcHJpdmF0ZSBpbnRbXVtdIFdvcmtpbmdLZXkKLQotcHJpdmF0ZSBib29sZWFuIGZvckVuY3J5cHRpb24KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgaW50IEZGbXVsWCgKLWludCkKLQotcHJpdmF0ZSBmaW5hbCB2b2lkIGRlY3J5cHRCbG9jaygKLWludFtdW10pCi0KLXByaXZhdGUgdm9pZCBlbmNyeXB0QmxvY2soCi1pbnRbXVtdKQotCi1wcml2YXRlIGludFtdW10gZ2VuZXJhdGVXb3JraW5nS2V5KAotYnl0ZVtdCi1ib29sZWFuKQotCi1wcml2YXRlIGludCBpbnZfbWNvbCgKLWludCkKLQotcHJpdmF0ZSBpbnQgbWNvbCgKLWludCkKLQotcHJpdmF0ZSBmaW5hbCB2b2lkIHBhY2tCbG9jaygKLWJ5dGVbXQotaW50KQotCi1wcml2YXRlIGludCBzaGlmdCgKLWludAotaW50KQotCi1wcml2YXRlIGludCBzdWJXb3JkKAotaW50KQotCi1wcml2YXRlIGZpbmFsIHZvaWQgdW5wYWNrQmxvY2soCi1ieXRlW10KLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QWxnb3JpdGhtTmFtZSgpCi0KLXB1YmxpYyBpbnQgZ2V0QmxvY2tTaXplKCkKLQotcHVibGljIHZvaWQgaW5pdCgKLWJvb2xlYW4KLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkNpcGhlclBhcmFtZXRlcnMpCi0KLXB1YmxpYyBpbnQgcHJvY2Vzc0Jsb2NrKAotYnl0ZVtdCi1pbnQKLWJ5dGVbXQotaW50KQotCi1wdWJsaWMgdm9pZCByZXNldCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uZW5naW5lcy5BRVNXcmFwRW5naW5lIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLldyYXBwZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5CbG9ja0NpcGhlciBlbmdpbmUKLQotcHJpdmF0ZSBib29sZWFuIGZvcldyYXBwaW5nCi0KLXByaXZhdGUgYnl0ZVtdIGl2Ci0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ucGFyYW1zLktleVBhcmFtZXRlciBwYXJhbQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEFsZ29yaXRobU5hbWUoKQotCi1wdWJsaWMgdm9pZCBpbml0KAotYm9vbGVhbgotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQ2lwaGVyUGFyYW1ldGVycykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9jcnlwdG8vSW52YWxpZENpcGhlclRleHRFeGNlcHRpb247ICkKLXB1YmxpYyBieXRlW10gdW53cmFwKAotYnl0ZVtdCi1pbnQKLWludCkKLQotcHVibGljIGJ5dGVbXSB3cmFwKAotYnl0ZVtdCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5lbmdpbmVzLkRFU0VuZ2luZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5CbG9ja0NpcGhlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBCTE9DS19TSVpFCi0KLXN0YXRpYyBzaG9ydFtdIERmX0tleQotCi1zdGF0aWMgaW50W10gU1AxCi0KLXN0YXRpYyBpbnRbXSBTUDIKLQotc3RhdGljIGludFtdIFNQMwotCi1zdGF0aWMgaW50W10gU1A0Ci0KLXN0YXRpYyBpbnRbXSBTUDUKLQotc3RhdGljIGludFtdIFNQNgotCi1zdGF0aWMgaW50W10gU1A3Ci0KLXN0YXRpYyBpbnRbXSBTUDgKLQotc3RhdGljIGludFtdIGJpZ2J5dGUKLQotc3RhdGljIHNob3J0W10gYnl0ZWJpdAotCi1zdGF0aWMgYnl0ZVtdIHBjMQotCi1zdGF0aWMgYnl0ZVtdIHBjMgotCi1zdGF0aWMgYnl0ZVtdIHRvdHJvdAotCi1wcml2YXRlIGludFtdIHdvcmtpbmdLZXkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByb3RlY3RlZCB2b2lkIGRlc0Z1bmMoCi1pbnRbXQotYnl0ZVtdCi1pbnQKLWJ5dGVbXQotaW50KQotCi1wcm90ZWN0ZWQgaW50W10gZ2VuZXJhdGVXb3JraW5nS2V5KAotYm9vbGVhbgotYnl0ZVtdKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRBbGdvcml0aG1OYW1lKCkKLQotcHVibGljIGludCBnZXRCbG9ja1NpemUoKQotCi1wdWJsaWMgdm9pZCBpbml0KAotYm9vbGVhbgotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQ2lwaGVyUGFyYW1ldGVycykKLQotcHVibGljIGludCBwcm9jZXNzQmxvY2soCi1ieXRlW10KLWludAotYnl0ZVtdCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHJlc2V0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5lbmdpbmVzLkRFU2VkZUVuZ2luZSBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLmVuZ2luZXMuREVTRW5naW5lCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEJMT0NLX1NJWkUKLQotcHJpdmF0ZSBib29sZWFuIGZvckVuY3J5cHRpb24KLQotcHJpdmF0ZSBpbnRbXSB3b3JraW5nS2V5MQotCi1wcml2YXRlIGludFtdIHdvcmtpbmdLZXkyCi0KLXByaXZhdGUgaW50W10gd29ya2luZ0tleTMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRBbGdvcml0aG1OYW1lKCkKLQotcHVibGljIGludCBnZXRCbG9ja1NpemUoKQotCi1wdWJsaWMgdm9pZCBpbml0KAotYm9vbGVhbgotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQ2lwaGVyUGFyYW1ldGVycykKLQotcHVibGljIGludCBwcm9jZXNzQmxvY2soCi1ieXRlW10KLWludAotYnl0ZVtdCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHJlc2V0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5lbmdpbmVzLkRFU2VkZVdyYXBFbmdpbmUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uV3JhcHBlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gSVYyCi0KLSBieXRlW10gZGlnZXN0Ci0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ubW9kZXMuQ0JDQmxvY2tDaXBoZXIgZW5naW5lCi0KLXByaXZhdGUgYm9vbGVhbiBmb3JXcmFwcGluZwotCi1wcml2YXRlIGJ5dGVbXSBpdgotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLnBhcmFtcy5LZXlQYXJhbWV0ZXIgcGFyYW0KLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5wYXJhbXMuUGFyYW1ldGVyc1dpdGhJViBwYXJhbVBsdXNJVgotCi0gb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uRGlnZXN0IHNoYTEKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgYnl0ZVtdIGNhbGN1bGF0ZUNNU0tleUNoZWNrc3VtKAotYnl0ZVtdKQotCi1wcml2YXRlIGJvb2xlYW4gY2hlY2tDTVNLZXlDaGVja3N1bSgKLWJ5dGVbXQotYnl0ZVtdKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRBbGdvcml0aG1OYW1lKCkKLQotcHVibGljIHZvaWQgaW5pdCgKLWJvb2xlYW4KLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkNpcGhlclBhcmFtZXRlcnMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvY3J5cHRvL0ludmFsaWRDaXBoZXJUZXh0RXhjZXB0aW9uOyApCi1wdWJsaWMgYnl0ZVtdIHVud3JhcCgKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyBieXRlW10gd3JhcCgKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uZW5naW5lcy5JRVNFbmdpbmUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5CYXNpY0FncmVlbWVudCBhZ3JlZQotCi0gb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQnVmZmVyZWRCbG9ja0NpcGhlciBjaXBoZXIKLQotIGJvb2xlYW4gZm9yRW5jcnlwdGlvbgotCi0gb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uRGVyaXZhdGlvbkZ1bmN0aW9uIGtkZgotCi0gb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uTWFjIG1hYwotCi0gYnl0ZVtdIG1hY0J1ZgotCi0gb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ucGFyYW1zLklFU1BhcmFtZXRlcnMgcGFyYW0KLQotIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkNpcGhlclBhcmFtZXRlcnMgcHJpdlBhcmFtCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5DaXBoZXJQYXJhbWV0ZXJzIHB1YlBhcmFtCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQmFzaWNBZ3JlZW1lbnQKLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkRlcml2YXRpb25GdW5jdGlvbgotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uTWFjKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5CYXNpY0FncmVlbWVudAotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uRGVyaXZhdGlvbkZ1bmN0aW9uCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5NYWMKLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkJ1ZmZlcmVkQmxvY2tDaXBoZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvY3J5cHRvL0ludmFsaWRDaXBoZXJUZXh0RXhjZXB0aW9uOyApCi1wcml2YXRlIGJ5dGVbXSBkZWNyeXB0QmxvY2soCi1ieXRlW10KLWludAotaW50Ci1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvY3J5cHRvL0ludmFsaWRDaXBoZXJUZXh0RXhjZXB0aW9uOyApCi1wcml2YXRlIGJ5dGVbXSBlbmNyeXB0QmxvY2soCi1ieXRlW10KLWludAotaW50Ci1ieXRlW10pCi0KLXB1YmxpYyB2b2lkIGluaXQoCi1ib29sZWFuCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5DaXBoZXJQYXJhbWV0ZXJzCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5DaXBoZXJQYXJhbWV0ZXJzCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5DaXBoZXJQYXJhbWV0ZXJzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2NyeXB0by9JbnZhbGlkQ2lwaGVyVGV4dEV4Y2VwdGlvbjsgKQotcHVibGljIGJ5dGVbXSBwcm9jZXNzQmxvY2soCi1ieXRlW10KLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLmVuZ2luZXMuTnVsbEVuZ2luZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5CbG9ja0NpcGhlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBCTE9DS19TSVpFCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QWxnb3JpdGhtTmFtZSgpCi0KLXB1YmxpYyBpbnQgZ2V0QmxvY2tTaXplKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgaW5pdCgKLWJvb2xlYW4KLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkNpcGhlclBhcmFtZXRlcnMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvY3J5cHRvL0RhdGFMZW5ndGhFeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcHJvY2Vzc0Jsb2NrKAotYnl0ZVtdCi1pbnQKLWJ5dGVbXQotaW50KQotCi1wdWJsaWMgdm9pZCByZXNldCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uZW5naW5lcy5SU0FFbmdpbmUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQXN5bW1ldHJpY0Jsb2NrQ2lwaGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYm9vbGVhbiBmb3JFbmNyeXB0aW9uCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ucGFyYW1zLlJTQUtleVBhcmFtZXRlcnMga2V5Ci0KLXByaXZhdGUgaW50IHNoaWZ0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGludCBnZXRJbnB1dEJsb2NrU2l6ZSgpCi0KLXB1YmxpYyBpbnQgZ2V0T3V0cHV0QmxvY2tTaXplKCkKLQotcHVibGljIHZvaWQgaW5pdCgKLWJvb2xlYW4KLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkNpcGhlclBhcmFtZXRlcnMpCi0KLXB1YmxpYyBieXRlW10gcHJvY2Vzc0Jsb2NrKAotYnl0ZVtdCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5nZW5lcmF0b3JzLkJhc2VLREZCeXRlc0dlbmVyYXRvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5EZXJpdmF0aW9uRnVuY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBpbnQgY291bnRlclN0YXJ0Ci0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uRGlnZXN0IGRpZ2VzdAotCi1wcml2YXRlIGJ5dGVbXSBpdgotCi1wcml2YXRlIGJ5dGVbXSBzaGFyZWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oCi1pbnQKLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkRpZ2VzdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9jcnlwdG8vRGF0YUxlbmd0aEV4Y2VwdGlvbjtMamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZW5lcmF0ZUJ5dGVzKAotYnl0ZVtdCi1pbnQKLWludCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkRpZ2VzdCBnZXREaWdlc3QoKQotCi1wdWJsaWMgdm9pZCBpbml0KAotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uRGVyaXZhdGlvblBhcmFtZXRlcnMpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uZ2VuZXJhdG9ycy5ERVNLZXlHZW5lcmF0b3IgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5DaXBoZXJLZXlHZW5lcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgYnl0ZVtdIGdlbmVyYXRlS2V5KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5nZW5lcmF0b3JzLkRFU2VkZUtleUdlbmVyYXRvciBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLmdlbmVyYXRvcnMuREVTS2V5R2VuZXJhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGJ5dGVbXSBnZW5lcmF0ZUtleSgpCi0KLXB1YmxpYyB2b2lkIGluaXQoCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5LZXlHZW5lcmF0aW9uUGFyYW1ldGVycykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5nZW5lcmF0b3JzLkRIQmFzaWNLZXlQYWlyR2VuZXJhdG9yIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkFzeW1tZXRyaWNDaXBoZXJLZXlQYWlyR2VuZXJhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uZ2VuZXJhdG9ycy5ESEtleUdlbmVyYXRvckhlbHBlciBoZWxwZXIKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5wYXJhbXMuREhLZXlHZW5lcmF0aW9uUGFyYW1ldGVycyBwYXJhbQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5Bc3ltbWV0cmljQ2lwaGVyS2V5UGFpciBnZW5lcmF0ZUtleVBhaXIoKQotCi1wdWJsaWMgdm9pZCBpbml0KAotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uS2V5R2VuZXJhdGlvblBhcmFtZXRlcnMpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi0gY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uZ2VuZXJhdG9ycy5ESEtleUdlbmVyYXRvckhlbHBlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLmdlbmVyYXRvcnMuREhLZXlHZW5lcmF0b3JIZWxwZXIgSU5TVEFOQ0UKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9JVEVSQVRJT05TCi0KLXByaXZhdGUgc3RhdGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIFRXTwotCi1wcml2YXRlIHN0YXRpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBaRVJPCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSBqYXZhLm1hdGguQmlnSW50ZWdlciBjcmVhdGVJblJhbmdlKAotamF2YS5tYXRoLkJpZ0ludGVnZXIKLWphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tKQotCi0gamF2YS5tYXRoLkJpZ0ludGVnZXIgY2FsY3VsYXRlUHJpdmF0ZSgKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1qYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbQotaW50KQotCi0gamF2YS5tYXRoLkJpZ0ludGVnZXIgY2FsY3VsYXRlUHVibGljKAotamF2YS5tYXRoLkJpZ0ludGVnZXIKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1qYXZhLm1hdGguQmlnSW50ZWdlcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5nZW5lcmF0b3JzLkRIS2V5UGFpckdlbmVyYXRvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5Bc3ltbWV0cmljQ2lwaGVyS2V5UGFpckdlbmVyYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLmdlbmVyYXRvcnMuREhLZXlHZW5lcmF0b3JIZWxwZXIgaGVscGVyCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ucGFyYW1zLkRIS2V5R2VuZXJhdGlvblBhcmFtZXRlcnMgcGFyYW0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQXN5bW1ldHJpY0NpcGhlcktleVBhaXIgZ2VuZXJhdGVLZXlQYWlyKCkKLQotcHVibGljIHZvaWQgaW5pdCgKLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLktleUdlbmVyYXRpb25QYXJhbWV0ZXJzKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLmdlbmVyYXRvcnMuREhQYXJhbWV0ZXJzR2VuZXJhdG9yIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBPTkUKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgVFdPCi0KLXByaXZhdGUgaW50IGNlcnRhaW50eQotCi1wcml2YXRlIGphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tIHJhbmRvbQotCi1wcml2YXRlIGludCBzaXplCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ucGFyYW1zLkRIUGFyYW1ldGVycyBnZW5lcmF0ZVBhcmFtZXRlcnMoKQotCi1wdWJsaWMgdm9pZCBpbml0KAotaW50Ci1pbnQKLWphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLmdlbmVyYXRvcnMuRFNBS2V5UGFpckdlbmVyYXRvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5Bc3ltbWV0cmljQ2lwaGVyS2V5UGFpckdlbmVyYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBaRVJPCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ucGFyYW1zLkRTQUtleUdlbmVyYXRpb25QYXJhbWV0ZXJzIHBhcmFtCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQXN5bW1ldHJpY0NpcGhlcktleVBhaXIgZ2VuZXJhdGVLZXlQYWlyKCkKLQotcHVibGljIHZvaWQgaW5pdCgKLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLktleUdlbmVyYXRpb25QYXJhbWV0ZXJzKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLmdlbmVyYXRvcnMuRFNBUGFyYW1ldGVyc0dlbmVyYXRvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgT05FCi0KLXByaXZhdGUgc3RhdGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIFRXTwotCi1wcml2YXRlIGludCBjZXJ0YWludHkKLQotcHJpdmF0ZSBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSByYW5kb20KLQotcHJpdmF0ZSBpbnQgc2l6ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIGFkZCgKLWJ5dGVbXQotYnl0ZVtdCi1pbnQpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5wYXJhbXMuRFNBUGFyYW1ldGVycyBnZW5lcmF0ZVBhcmFtZXRlcnMoKQotCi1wdWJsaWMgdm9pZCBpbml0KAotaW50Ci1pbnQKLWphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLmdlbmVyYXRvcnMuS0RGMUJ5dGVzR2VuZXJhdG9yIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uZ2VuZXJhdG9ycy5CYXNlS0RGQnl0ZXNHZW5lcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5EaWdlc3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uZ2VuZXJhdG9ycy5LREYyQnl0ZXNHZW5lcmF0b3IgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5nZW5lcmF0b3JzLkJhc2VLREZCeXRlc0dlbmVyYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkRpZ2VzdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5nZW5lcmF0b3JzLk1HRjFCeXRlc0dlbmVyYXRvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5EZXJpdmF0aW9uRnVuY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5EaWdlc3QgZGlnZXN0Ci0KLXByaXZhdGUgaW50IGhMZW4KLQotcHJpdmF0ZSBieXRlW10gc2VlZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkRpZ2VzdCkKLQotcHJpdmF0ZSB2b2lkIEl0b09TUCgKLWludAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2NyeXB0by9EYXRhTGVuZ3RoRXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGdlbmVyYXRlQnl0ZXMoCi1ieXRlW10KLWludAotaW50KQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uRGlnZXN0IGdldERpZ2VzdCgpCi0KLXB1YmxpYyB2b2lkIGluaXQoCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5EZXJpdmF0aW9uUGFyYW1ldGVycykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5nZW5lcmF0b3JzLk9wZW5TU0xQQkVQYXJhbWV0ZXJzR2VuZXJhdG9yIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uUEJFUGFyYW1ldGVyc0dlbmVyYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkRpZ2VzdCBkaWdlc3QKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIGJ5dGVbXSBnZW5lcmF0ZURlcml2ZWRLZXkoCi1pbnQpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5DaXBoZXJQYXJhbWV0ZXJzIGdlbmVyYXRlRGVyaXZlZE1hY1BhcmFtZXRlcnMoCi1pbnQpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5DaXBoZXJQYXJhbWV0ZXJzIGdlbmVyYXRlRGVyaXZlZFBhcmFtZXRlcnMoCi1pbnQpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5DaXBoZXJQYXJhbWV0ZXJzIGdlbmVyYXRlRGVyaXZlZFBhcmFtZXRlcnMoCi1pbnQKLWludCkKLQotcHVibGljIHZvaWQgaW5pdCgKLWJ5dGVbXQotYnl0ZVtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLmdlbmVyYXRvcnMuUEtDUzEyUGFyYW1ldGVyc0dlbmVyYXRvciBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLlBCRVBhcmFtZXRlcnNHZW5lcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSVZfTUFURVJJQUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZX01BVEVSSUFMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BQ19NQVRFUklBTAotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkRpZ2VzdCBkaWdlc3QKLQotcHJpdmF0ZSBpbnQgdQotCi1wcml2YXRlIGludCB2Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uRGlnZXN0KQotCi1wcml2YXRlIHZvaWQgYWRqdXN0KAotYnl0ZVtdCi1pbnQKLWJ5dGVbXSkKLQotcHJpdmF0ZSBieXRlW10gZ2VuZXJhdGVEZXJpdmVkS2V5KAotaW50Ci1pbnQpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5DaXBoZXJQYXJhbWV0ZXJzIGdlbmVyYXRlRGVyaXZlZE1hY1BhcmFtZXRlcnMoCi1pbnQpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5DaXBoZXJQYXJhbWV0ZXJzIGdlbmVyYXRlRGVyaXZlZFBhcmFtZXRlcnMoCi1pbnQpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5DaXBoZXJQYXJhbWV0ZXJzIGdlbmVyYXRlRGVyaXZlZFBhcmFtZXRlcnMoCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5nZW5lcmF0b3JzLlBLQ1M1UzFQYXJhbWV0ZXJzR2VuZXJhdG9yIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uUEJFUGFyYW1ldGVyc0dlbmVyYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkRpZ2VzdCBkaWdlc3QKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5EaWdlc3QpCi0KLXByaXZhdGUgYnl0ZVtdIGdlbmVyYXRlRGVyaXZlZEtleSgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5DaXBoZXJQYXJhbWV0ZXJzIGdlbmVyYXRlRGVyaXZlZE1hY1BhcmFtZXRlcnMoCi1pbnQpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5DaXBoZXJQYXJhbWV0ZXJzIGdlbmVyYXRlRGVyaXZlZFBhcmFtZXRlcnMoCi1pbnQpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5DaXBoZXJQYXJhbWV0ZXJzIGdlbmVyYXRlRGVyaXZlZFBhcmFtZXRlcnMoCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5nZW5lcmF0b3JzLlBLQ1M1UzJQYXJhbWV0ZXJzR2VuZXJhdG9yIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uUEJFUGFyYW1ldGVyc0dlbmVyYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLk1hYyBoTWFjCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSB2b2lkIEYoCi1ieXRlW10KLWJ5dGVbXQotaW50Ci1ieXRlW10KLWJ5dGVbXQotaW50KQotCi1wcml2YXRlIGJ5dGVbXSBnZW5lcmF0ZURlcml2ZWRLZXkoCi1pbnQpCi0KLXByaXZhdGUgdm9pZCBpbnRUb09jdGV0KAotYnl0ZVtdCi1pbnQpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5DaXBoZXJQYXJhbWV0ZXJzIGdlbmVyYXRlRGVyaXZlZE1hY1BhcmFtZXRlcnMoCi1pbnQpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5DaXBoZXJQYXJhbWV0ZXJzIGdlbmVyYXRlRGVyaXZlZFBhcmFtZXRlcnMoCi1pbnQpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5DaXBoZXJQYXJhbWV0ZXJzIGdlbmVyYXRlRGVyaXZlZFBhcmFtZXRlcnMoCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5nZW5lcmF0b3JzLlJTQUtleVBhaXJHZW5lcmF0b3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQXN5bW1ldHJpY0NpcGhlcktleVBhaXJHZW5lcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgT05FCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ucGFyYW1zLlJTQUtleUdlbmVyYXRpb25QYXJhbWV0ZXJzIHBhcmFtCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQXN5bW1ldHJpY0NpcGhlcktleVBhaXIgZ2VuZXJhdGVLZXlQYWlyKCkKLQotcHVibGljIHZvaWQgaW5pdCgKLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLktleUdlbmVyYXRpb25QYXJhbWV0ZXJzKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLmlvLkRpZ2VzdElucHV0U3RyZWFtIGV4dGVuZHMgamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uRGlnZXN0IGRpZ2VzdAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uSW5wdXRTdHJlYW0KLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkRpZ2VzdCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkRpZ2VzdCBnZXREaWdlc3QoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoCi1ieXRlW10KLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLmlvLkRpZ2VzdE91dHB1dFN0cmVhbSBleHRlbmRzIGphdmEuaW8uRmlsdGVyT3V0cHV0U3RyZWFtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5EaWdlc3QgZGlnZXN0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5PdXRwdXRTdHJlYW0KLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkRpZ2VzdCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkRpZ2VzdCBnZXREaWdlc3QoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB3cml0ZSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgd3JpdGUoCi1ieXRlW10KLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLmlvLk1hY0lucHV0U3RyZWFtIGV4dGVuZHMgamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uTWFjIG1hYwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuaW8uSW5wdXRTdHJlYW0KLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLk1hYykKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLk1hYyBnZXRNYWMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHJlYWQoCi1ieXRlW10KLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLmlvLk1hY091dHB1dFN0cmVhbSBleHRlbmRzIGphdmEuaW8uRmlsdGVyT3V0cHV0U3RyZWFtCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5NYWMgbWFjCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5PdXRwdXRTdHJlYW0KLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLk1hYykKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLk1hYyBnZXRNYWMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB3cml0ZSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgd3JpdGUoCi1ieXRlW10KLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLm1hY3MuQmxvY2tDaXBoZXJNYWMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uTWFjCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYnl0ZVtdIGJ1ZgotCi1wcml2YXRlIGludCBidWZPZmYKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5CbG9ja0NpcGhlciBjaXBoZXIKLQotcHJpdmF0ZSBieXRlW10gbWFjCi0KLXByaXZhdGUgaW50IG1hY1NpemUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5CbG9ja0NpcGhlcikKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQmxvY2tDaXBoZXIKLWludCkKLQotcHVibGljIGludCBkb0ZpbmFsKAotYnl0ZVtdCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEFsZ29yaXRobU5hbWUoKQotCi1wdWJsaWMgaW50IGdldE1hY1NpemUoKQotCi1wdWJsaWMgdm9pZCBpbml0KAotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQ2lwaGVyUGFyYW1ldGVycykKLQotcHVibGljIHZvaWQgcmVzZXQoKQotCi1wdWJsaWMgdm9pZCB1cGRhdGUoCi1ieXRlKQotCi1wdWJsaWMgdm9pZCB1cGRhdGUoCi1ieXRlW10KLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLm1hY3MuQ0JDQmxvY2tDaXBoZXJNYWMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uTWFjCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYnl0ZVtdIGJ1ZgotCi1wcml2YXRlIGludCBidWZPZmYKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5CbG9ja0NpcGhlciBjaXBoZXIKLQotcHJpdmF0ZSBieXRlW10gbWFjCi0KLXByaXZhdGUgaW50IG1hY1NpemUKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5wYWRkaW5ncy5CbG9ja0NpcGhlclBhZGRpbmcgcGFkZGluZwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkJsb2NrQ2lwaGVyKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5CbG9ja0NpcGhlcgotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5CbG9ja0NpcGhlcgotaW50Ci1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5wYWRkaW5ncy5CbG9ja0NpcGhlclBhZGRpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkJsb2NrQ2lwaGVyCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5wYWRkaW5ncy5CbG9ja0NpcGhlclBhZGRpbmcpCi0KLXB1YmxpYyBpbnQgZG9GaW5hbCgKLWJ5dGVbXQotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRBbGdvcml0aG1OYW1lKCkKLQotcHVibGljIGludCBnZXRNYWNTaXplKCkKLQotcHVibGljIHZvaWQgaW5pdCgKLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkNpcGhlclBhcmFtZXRlcnMpCi0KLXB1YmxpYyB2b2lkIHJlc2V0KCkKLQotcHVibGljIHZvaWQgdXBkYXRlKAotYnl0ZSkKLQotcHVibGljIHZvaWQgdXBkYXRlKAotYnl0ZVtdCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5tYWNzLkNGQkJsb2NrQ2lwaGVyTWFjIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLk1hYwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGJ5dGVbXSBidWYKLQotcHJpdmF0ZSBpbnQgYnVmT2ZmCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ubWFjcy5NYWNDRkJCbG9ja0NpcGhlciBjaXBoZXIKLQotcHJpdmF0ZSBieXRlW10gbWFjCi0KLXByaXZhdGUgaW50IG1hY1NpemUKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5wYWRkaW5ncy5CbG9ja0NpcGhlclBhZGRpbmcgcGFkZGluZwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkJsb2NrQ2lwaGVyKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5CbG9ja0NpcGhlcgotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkJsb2NrQ2lwaGVyCi1pbnQKLWludAotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ucGFkZGluZ3MuQmxvY2tDaXBoZXJQYWRkaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5CbG9ja0NpcGhlcgotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ucGFkZGluZ3MuQmxvY2tDaXBoZXJQYWRkaW5nKQotCi1wdWJsaWMgaW50IGRvRmluYWwoCi1ieXRlW10KLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QWxnb3JpdGhtTmFtZSgpCi0KLXB1YmxpYyBpbnQgZ2V0TWFjU2l6ZSgpCi0KLXB1YmxpYyB2b2lkIGluaXQoCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5DaXBoZXJQYXJhbWV0ZXJzKQotCi1wdWJsaWMgdm9pZCByZXNldCgpCi0KLXB1YmxpYyB2b2lkIHVwZGF0ZSgKLWJ5dGUpCi0KLXB1YmxpYyB2b2lkIHVwZGF0ZSgKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ubWFjcy5ITWFjIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLk1hYwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIElQQUQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBPUEFECi0KLXByaXZhdGUgc3RhdGljIGphdmEudXRpbC5IYXNodGFibGUgYmxvY2tMZW5ndGhzCi0KLXByaXZhdGUgaW50IGJsb2NrTGVuZ3RoCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uRGlnZXN0IGRpZ2VzdAotCi1wcml2YXRlIGludCBkaWdlc3RTaXplCi0KLXByaXZhdGUgYnl0ZVtdIGlucHV0UGFkCi0KLXByaXZhdGUgYnl0ZVtdIG91dHB1dFBhZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uRGlnZXN0KQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uRGlnZXN0Ci1pbnQpCi0KLXByaXZhdGUgc3RhdGljIGludCBnZXRCeXRlTGVuZ3RoKAotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uRGlnZXN0KQotCi1wdWJsaWMgaW50IGRvRmluYWwoCi1ieXRlW10KLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QWxnb3JpdGhtTmFtZSgpCi0KLXB1YmxpYyBpbnQgZ2V0TWFjU2l6ZSgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5EaWdlc3QgZ2V0VW5kZXJseWluZ0RpZ2VzdCgpCi0KLXB1YmxpYyB2b2lkIGluaXQoCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5DaXBoZXJQYXJhbWV0ZXJzKQotCi1wdWJsaWMgdm9pZCByZXNldCgpCi0KLXB1YmxpYyB2b2lkIHVwZGF0ZSgKLWJ5dGUpCi0KLXB1YmxpYyB2b2lkIHVwZGF0ZSgKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ubWFjcy5JU085Nzk3QWxnM01hYyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5NYWMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBieXRlW10gYnVmCi0KLXByaXZhdGUgaW50IGJ1Zk9mZgotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkJsb2NrQ2lwaGVyIGNpcGhlcgotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLnBhcmFtcy5LZXlQYXJhbWV0ZXIgbGFzdEtleTIKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5wYXJhbXMuS2V5UGFyYW1ldGVyIGxhc3RLZXkzCi0KLXByaXZhdGUgYnl0ZVtdIG1hYwotCi1wcml2YXRlIGludCBtYWNTaXplCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ucGFkZGluZ3MuQmxvY2tDaXBoZXJQYWRkaW5nIHBhZGRpbmcKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5CbG9ja0NpcGhlcikKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQmxvY2tDaXBoZXIKLWludCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQmxvY2tDaXBoZXIKLWludAotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ucGFkZGluZ3MuQmxvY2tDaXBoZXJQYWRkaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5CbG9ja0NpcGhlcgotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ucGFkZGluZ3MuQmxvY2tDaXBoZXJQYWRkaW5nKQotCi1wdWJsaWMgaW50IGRvRmluYWwoCi1ieXRlW10KLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QWxnb3JpdGhtTmFtZSgpCi0KLXB1YmxpYyBpbnQgZ2V0TWFjU2l6ZSgpCi0KLXB1YmxpYyB2b2lkIGluaXQoCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5DaXBoZXJQYXJhbWV0ZXJzKQotCi1wdWJsaWMgdm9pZCByZXNldCgpCi0KLXB1YmxpYyB2b2lkIHVwZGF0ZSgKLWJ5dGUpCi0KLXB1YmxpYyB2b2lkIHVwZGF0ZSgKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi0gY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ubWFjcy5NYWNDRkJCbG9ja0NpcGhlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBieXRlW10gSVYKLQotcHJpdmF0ZSBpbnQgYmxvY2tTaXplCi0KLXByaXZhdGUgYnl0ZVtdIGNmYk91dFYKLQotcHJpdmF0ZSBieXRlW10gY2ZiVgotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkJsb2NrQ2lwaGVyIGNpcGhlcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkJsb2NrQ2lwaGVyCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEFsZ29yaXRobU5hbWUoKQotCi1wdWJsaWMgaW50IGdldEJsb2NrU2l6ZSgpCi0KLSB2b2lkIGdldE1hY0Jsb2NrKAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBpbml0KAotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQ2lwaGVyUGFyYW1ldGVycykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9jcnlwdG8vRGF0YUxlbmd0aEV4Y2VwdGlvbjtMamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsgKQotcHVibGljIGludCBwcm9jZXNzQmxvY2soCi1ieXRlW10KLWludAotYnl0ZVtdCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHJlc2V0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5tYWNzLk9sZEhNYWMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uTWFjCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCTE9DS19MRU5HVEgKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBJUEFECi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgT1BBRAotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkRpZ2VzdCBkaWdlc3QKLQotcHJpdmF0ZSBpbnQgZGlnZXN0U2l6ZQotCi1wcml2YXRlIGJ5dGVbXSBpbnB1dFBhZAotCi1wcml2YXRlIGJ5dGVbXSBvdXRwdXRQYWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5EaWdlc3QpCi0KLXB1YmxpYyBpbnQgZG9GaW5hbCgKLWJ5dGVbXQotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRBbGdvcml0aG1OYW1lKCkKLQotcHVibGljIGludCBnZXRNYWNTaXplKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkRpZ2VzdCBnZXRVbmRlcmx5aW5nRGlnZXN0KCkKLQotcHVibGljIHZvaWQgaW5pdCgKLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkNpcGhlclBhcmFtZXRlcnMpCi0KLXB1YmxpYyB2b2lkIHJlc2V0KCkKLQotcHVibGljIHZvaWQgdXBkYXRlKAotYnl0ZSkKLQotcHVibGljIHZvaWQgdXBkYXRlKAotYnl0ZVtdCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5tb2Rlcy5DQkNCbG9ja0NpcGhlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5CbG9ja0NpcGhlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGJ5dGVbXSBJVgotCi1wcml2YXRlIGludCBibG9ja1NpemUKLQotcHJpdmF0ZSBieXRlW10gY2JjTmV4dFYKLQotcHJpdmF0ZSBieXRlW10gY2JjVgotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkJsb2NrQ2lwaGVyIGNpcGhlcgotCi1wcml2YXRlIGJvb2xlYW4gZW5jcnlwdGluZwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkJsb2NrQ2lwaGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2NyeXB0by9EYXRhTGVuZ3RoRXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uOyApCi1wcml2YXRlIGludCBkZWNyeXB0QmxvY2soCi1ieXRlW10KLWludAotYnl0ZVtdCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvY3J5cHRvL0RhdGFMZW5ndGhFeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247ICkKLXByaXZhdGUgaW50IGVuY3J5cHRCbG9jaygKLWJ5dGVbXQotaW50Ci1ieXRlW10KLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QWxnb3JpdGhtTmFtZSgpCi0KLXB1YmxpYyBpbnQgZ2V0QmxvY2tTaXplKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkJsb2NrQ2lwaGVyIGdldFVuZGVybHlpbmdDaXBoZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBpbml0KAotYm9vbGVhbgotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQ2lwaGVyUGFyYW1ldGVycykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9jcnlwdG8vRGF0YUxlbmd0aEV4Y2VwdGlvbjtMamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsgKQotcHVibGljIGludCBwcm9jZXNzQmxvY2soCi1ieXRlW10KLWludAotYnl0ZVtdCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHJlc2V0KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5tb2Rlcy5DQ01CbG9ja0NpcGhlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBpbnQgYmxvY2tTaXplCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQmxvY2tDaXBoZXIgY2lwaGVyCi0KLXByaXZhdGUgYm9vbGVhbiBmb3JFbmNyeXB0aW9uCi0KLXByaXZhdGUgYnl0ZVtdIG1hY0Jsb2NrCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ucGFyYW1zLkNDTVBhcmFtZXRlcnMgcGFyYW1zCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQmxvY2tDaXBoZXIpCi0KLXByaXZhdGUgYm9vbGVhbiBhcmVFcXVhbCgKLWJ5dGVbXQotYnl0ZVtdKQotCi1wcml2YXRlIGludCBjYWxjdWxhdGVNYWMoCi1ieXRlW10KLWludAotaW50Ci1ieXRlW10pCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEFsZ29yaXRobU5hbWUoKQotCi1wdWJsaWMgYnl0ZVtdIGdldE1hYygpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5CbG9ja0NpcGhlciBnZXRVbmRlcmx5aW5nQ2lwaGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgaW5pdCgKLWJvb2xlYW4KLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkNpcGhlclBhcmFtZXRlcnMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247TG9yZy9ib3VuY3ljYXN0bGUvY3J5cHRvL0ludmFsaWRDaXBoZXJUZXh0RXhjZXB0aW9uOyApCi1wdWJsaWMgYnl0ZVtdIHByb2Nlc3NQYWNrZXQoCi1ieXRlW10KLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLm1vZGVzLkNGQkJsb2NrQ2lwaGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkJsb2NrQ2lwaGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYnl0ZVtdIElWCi0KLXByaXZhdGUgaW50IGJsb2NrU2l6ZQotCi1wcml2YXRlIGJ5dGVbXSBjZmJPdXRWCi0KLXByaXZhdGUgYnl0ZVtdIGNmYlYKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5CbG9ja0NpcGhlciBjaXBoZXIKLQotcHJpdmF0ZSBib29sZWFuIGVuY3J5cHRpbmcKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5CbG9ja0NpcGhlcgotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2NyeXB0by9EYXRhTGVuZ3RoRXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGRlY3J5cHRCbG9jaygKLWJ5dGVbXQotaW50Ci1ieXRlW10KLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9jcnlwdG8vRGF0YUxlbmd0aEV4Y2VwdGlvbjtMamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsgKQotcHVibGljIGludCBlbmNyeXB0QmxvY2soCi1ieXRlW10KLWludAotYnl0ZVtdCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEFsZ29yaXRobU5hbWUoKQotCi1wdWJsaWMgaW50IGdldEJsb2NrU2l6ZSgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5CbG9ja0NpcGhlciBnZXRVbmRlcmx5aW5nQ2lwaGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgaW5pdCgKLWJvb2xlYW4KLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkNpcGhlclBhcmFtZXRlcnMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvY3J5cHRvL0RhdGFMZW5ndGhFeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcHJvY2Vzc0Jsb2NrKAotYnl0ZVtdCi1pbnQKLWJ5dGVbXQotaW50KQotCi1wdWJsaWMgdm9pZCByZXNldCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ubW9kZXMuQ1RTQmxvY2tDaXBoZXIgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5CdWZmZXJlZEJsb2NrQ2lwaGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgaW50IGJsb2NrU2l6ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkJsb2NrQ2lwaGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2NyeXB0by9EYXRhTGVuZ3RoRXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uO0xvcmcvYm91bmN5Y2FzdGxlL2NyeXB0by9JbnZhbGlkQ2lwaGVyVGV4dEV4Y2VwdGlvbjsgKQotcHVibGljIGludCBkb0ZpbmFsKAotYnl0ZVtdCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0T3V0cHV0U2l6ZSgKLWludCkKLQotcHVibGljIGludCBnZXRVcGRhdGVPdXRwdXRTaXplKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2NyeXB0by9EYXRhTGVuZ3RoRXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHByb2Nlc3NCeXRlKAotYnl0ZQotYnl0ZVtdCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvY3J5cHRvL0RhdGFMZW5ndGhFeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcHJvY2Vzc0J5dGVzKAotYnl0ZVtdCi1pbnQKLWludAotYnl0ZVtdCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ubW9kZXMuR09GQkJsb2NrQ2lwaGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkJsb2NrQ2lwaGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBmaW5hbCBpbnQgQzEKLQotc3RhdGljIGZpbmFsIGludCBDMgotCi1wcml2YXRlIGJ5dGVbXSBJVgotCi0gaW50IE4zCi0KLSBpbnQgTjQKLQotcHJpdmF0ZSBmaW5hbCBpbnQgYmxvY2tTaXplCi0KLXByaXZhdGUgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQmxvY2tDaXBoZXIgY2lwaGVyCi0KLSBib29sZWFuIGZpcnN0U3RlcAotCi1wcml2YXRlIGJ5dGVbXSBvZmJPdXRWCi0KLXByaXZhdGUgYnl0ZVtdIG9mYlYKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5CbG9ja0NpcGhlcikKLQotcHJpdmF0ZSBpbnQgYnl0ZXNUb2ludCgKLWJ5dGVbXQotaW50KQotCi1wcml2YXRlIHZvaWQgaW50VG9ieXRlcygKLWludAotYnl0ZVtdCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEFsZ29yaXRobU5hbWUoKQotCi1wdWJsaWMgaW50IGdldEJsb2NrU2l6ZSgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5CbG9ja0NpcGhlciBnZXRVbmRlcmx5aW5nQ2lwaGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgaW5pdCgKLWJvb2xlYW4KLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkNpcGhlclBhcmFtZXRlcnMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvY3J5cHRvL0RhdGFMZW5ndGhFeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcHJvY2Vzc0Jsb2NrKAotYnl0ZVtdCi1pbnQKLWJ5dGVbXQotaW50KQotCi1wdWJsaWMgdm9pZCByZXNldCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ubW9kZXMuT0ZCQmxvY2tDaXBoZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQmxvY2tDaXBoZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBieXRlW10gSVYKLQotcHJpdmF0ZSBmaW5hbCBpbnQgYmxvY2tTaXplCi0KLXByaXZhdGUgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQmxvY2tDaXBoZXIgY2lwaGVyCi0KLXByaXZhdGUgYnl0ZVtdIG9mYk91dFYKLQotcHJpdmF0ZSBieXRlW10gb2ZiVgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkJsb2NrQ2lwaGVyCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEFsZ29yaXRobU5hbWUoKQotCi1wdWJsaWMgaW50IGdldEJsb2NrU2l6ZSgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5CbG9ja0NpcGhlciBnZXRVbmRlcmx5aW5nQ2lwaGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgaW5pdCgKLWJvb2xlYW4KLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkNpcGhlclBhcmFtZXRlcnMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvY3J5cHRvL0RhdGFMZW5ndGhFeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcHJvY2Vzc0Jsb2NrKAotYnl0ZVtdCi1pbnQKLWJ5dGVbXQotaW50KQotCi1wdWJsaWMgdm9pZCByZXNldCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ubW9kZXMuUGFkZGVkQmxvY2tDaXBoZXIgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5CdWZmZXJlZEJsb2NrQ2lwaGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQmxvY2tDaXBoZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvY3J5cHRvL0RhdGFMZW5ndGhFeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247TG9yZy9ib3VuY3ljYXN0bGUvY3J5cHRvL0ludmFsaWRDaXBoZXJUZXh0RXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGRvRmluYWwoCi1ieXRlW10KLWludCkKLQotcHVibGljIGludCBnZXRPdXRwdXRTaXplKAotaW50KQotCi1wdWJsaWMgaW50IGdldFVwZGF0ZU91dHB1dFNpemUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvY3J5cHRvL0RhdGFMZW5ndGhFeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcHJvY2Vzc0J5dGUoCi1ieXRlCi1ieXRlW10KLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9jcnlwdG8vRGF0YUxlbmd0aEV4Y2VwdGlvbjtMamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsgKQotcHVibGljIGludCBwcm9jZXNzQnl0ZXMoCi1ieXRlW10KLWludAotaW50Ci1ieXRlW10KLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5tb2Rlcy5TSUNCbG9ja0NpcGhlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5CbG9ja0NpcGhlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGJ5dGVbXSBJVgotCi1wcml2YXRlIGZpbmFsIGludCBibG9ja1NpemUKLQotcHJpdmF0ZSBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5CbG9ja0NpcGhlciBjaXBoZXIKLQotcHJpdmF0ZSBieXRlW10gY291bnRlcgotCi1wcml2YXRlIGJ5dGVbXSBjb3VudGVyT3V0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQmxvY2tDaXBoZXIpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEFsZ29yaXRobU5hbWUoKQotCi1wdWJsaWMgaW50IGdldEJsb2NrU2l6ZSgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5CbG9ja0NpcGhlciBnZXRVbmRlcmx5aW5nQ2lwaGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgaW5pdCgKLWJvb2xlYW4KLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkNpcGhlclBhcmFtZXRlcnMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvY3J5cHRvL0RhdGFMZW5ndGhFeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcHJvY2Vzc0Jsb2NrKAotYnl0ZVtdCi1pbnQKLWJ5dGVbXQotaW50KQotCi1wdWJsaWMgdm9pZCByZXNldCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLnBhZGRpbmdzLkJsb2NrQ2lwaGVyUGFkZGluZyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50IGFkZFBhZGRpbmcoCi1ieXRlW10KLWludCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0UGFkZGluZ05hbWUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBpbml0KAotamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvY3J5cHRvL0ludmFsaWRDaXBoZXJUZXh0RXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IHBhZENvdW50KAotYnl0ZVtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLnBhZGRpbmdzLklTTzEwMTI2ZDJQYWRkaW5nIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLnBhZGRpbmdzLkJsb2NrQ2lwaGVyUGFkZGluZwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20gcmFuZG9tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGludCBhZGRQYWRkaW5nKAotYnl0ZVtdCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFBhZGRpbmdOYW1lKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgaW5pdCgKLWphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2NyeXB0by9JbnZhbGlkQ2lwaGVyVGV4dEV4Y2VwdGlvbjsgKQotcHVibGljIGludCBwYWRDb3VudCgKLWJ5dGVbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5wYWRkaW5ncy5JU083ODE2ZDRQYWRkaW5nIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLnBhZGRpbmdzLkJsb2NrQ2lwaGVyUGFkZGluZwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBpbnQgYWRkUGFkZGluZygKLWJ5dGVbXQotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRQYWRkaW5nTmFtZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGluaXQoCi1qYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9jcnlwdG8vSW52YWxpZENpcGhlclRleHRFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcGFkQ291bnQoCi1ieXRlW10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ucGFkZGluZ3MuUEtDUzdQYWRkaW5nIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLnBhZGRpbmdzLkJsb2NrQ2lwaGVyUGFkZGluZwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBpbnQgYWRkUGFkZGluZygKLWJ5dGVbXQotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRQYWRkaW5nTmFtZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGluaXQoCi1qYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9jcnlwdG8vSW52YWxpZENpcGhlclRleHRFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcGFkQ291bnQoCi1ieXRlW10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ucGFkZGluZ3MuUGFkZGVkQnVmZmVyZWRCbG9ja0NpcGhlciBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkJ1ZmZlcmVkQmxvY2tDaXBoZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLnBhZGRpbmdzLkJsb2NrQ2lwaGVyUGFkZGluZyBwYWRkaW5nCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQmxvY2tDaXBoZXIpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkJsb2NrQ2lwaGVyCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5wYWRkaW5ncy5CbG9ja0NpcGhlclBhZGRpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvY3J5cHRvL0RhdGFMZW5ndGhFeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247TG9yZy9ib3VuY3ljYXN0bGUvY3J5cHRvL0ludmFsaWRDaXBoZXJUZXh0RXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGRvRmluYWwoCi1ieXRlW10KLWludCkKLQotcHVibGljIGludCBnZXRPdXRwdXRTaXplKAotaW50KQotCi1wdWJsaWMgaW50IGdldFVwZGF0ZU91dHB1dFNpemUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGluaXQoCi1ib29sZWFuCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5DaXBoZXJQYXJhbWV0ZXJzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2NyeXB0by9EYXRhTGVuZ3RoRXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHByb2Nlc3NCeXRlKAotYnl0ZQotYnl0ZVtdCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvY3J5cHRvL0RhdGFMZW5ndGhFeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgcHJvY2Vzc0J5dGVzKAotYnl0ZVtdCi1pbnQKLWludAotYnl0ZVtdCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ucGFkZGluZ3MuVEJDUGFkZGluZyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5wYWRkaW5ncy5CbG9ja0NpcGhlclBhZGRpbmcKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgaW50IGFkZFBhZGRpbmcoCi1ieXRlW10KLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UGFkZGluZ05hbWUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBpbml0KAotamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvY3J5cHRvL0ludmFsaWRDaXBoZXJUZXh0RXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IHBhZENvdW50KAotYnl0ZVtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLnBhZGRpbmdzLlg5MjNQYWRkaW5nIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLnBhZGRpbmdzLkJsb2NrQ2lwaGVyUGFkZGluZwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20gcmFuZG9tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGludCBhZGRQYWRkaW5nKAotYnl0ZVtdCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFBhZGRpbmdOYW1lKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgaW5pdCgKLWphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2NyeXB0by9JbnZhbGlkQ2lwaGVyVGV4dEV4Y2VwdGlvbjsgKQotcHVibGljIGludCBwYWRDb3VudCgKLWJ5dGVbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5wYWRkaW5ncy5aZXJvQnl0ZVBhZGRpbmcgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ucGFkZGluZ3MuQmxvY2tDaXBoZXJQYWRkaW5nCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGludCBhZGRQYWRkaW5nKAotYnl0ZVtdCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFBhZGRpbmdOYW1lKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgaW5pdCgKLWphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2NyeXB0by9JbnZhbGlkQ2lwaGVyVGV4dEV4Y2VwdGlvbjsgKQotcHVibGljIGludCBwYWRDb3VudCgKLWJ5dGVbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5wYXJhbXMuQXN5bW1ldHJpY0tleVBhcmFtZXRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5DaXBoZXJQYXJhbWV0ZXJzCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBib29sZWFuIHByaXZhdGVLZXkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ib29sZWFuKQotCi1wdWJsaWMgYm9vbGVhbiBpc1ByaXZhdGUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLnBhcmFtcy5DQ01QYXJhbWV0ZXJzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkNpcGhlclBhcmFtZXRlcnMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBieXRlW10gYXNzb2NpYXRlZFRleHQKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5wYXJhbXMuS2V5UGFyYW1ldGVyIGtleQotCi1wcml2YXRlIGludCBtYWNTaXplCi0KLXByaXZhdGUgYnl0ZVtdIG5vbmNlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ucGFyYW1zLktleVBhcmFtZXRlcgotaW50Ci1ieXRlW10KLWJ5dGVbXSkKLQotcHVibGljIGJ5dGVbXSBnZXRBc3NvY2lhdGVkVGV4dCgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5wYXJhbXMuS2V5UGFyYW1ldGVyIGdldEtleSgpCi0KLXB1YmxpYyBpbnQgZ2V0TWFjU2l6ZSgpCi0KLXB1YmxpYyBieXRlW10gZ2V0Tm9uY2UoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLnBhcmFtcy5LZXlQYXJhbWV0ZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQ2lwaGVyUGFyYW1ldGVycwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGJ5dGVbXSBrZXkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ieXRlW10pCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyBieXRlW10gZ2V0S2V5KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5wYXJhbXMuREVTUGFyYW1ldGVycyBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLnBhcmFtcy5LZXlQYXJhbWV0ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVTX0tFWV9MRU5HVEgKLQotcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIERFU193ZWFrX2tleXMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5fREVTX1dFQUtfS0VZUwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYnl0ZVtdKQotCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNXZWFrS2V5KAotYnl0ZVtdCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRPZGRQYXJpdHkoCi1ieXRlW10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ucGFyYW1zLkRFU2VkZVBhcmFtZXRlcnMgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5wYXJhbXMuREVTUGFyYW1ldGVycwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVNfRURFX0tFWV9MRU5HVEgKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ieXRlW10pCi0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1dlYWtLZXkoCi1ieXRlW10KLWludCkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzV2Vha0tleSgKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ucGFyYW1zLkRIS2V5R2VuZXJhdGlvblBhcmFtZXRlcnMgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5LZXlHZW5lcmF0aW9uUGFyYW1ldGVycwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLnBhcmFtcy5ESFBhcmFtZXRlcnMgcGFyYW1zCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20KLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLnBhcmFtcy5ESFBhcmFtZXRlcnMpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5wYXJhbXMuREhQYXJhbWV0ZXJzIGdldFBhcmFtZXRlcnMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLnBhcmFtcy5ESEtleVBhcmFtZXRlcnMgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5wYXJhbXMuQXN5bW1ldHJpY0tleVBhcmFtZXRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLnBhcmFtcy5ESFBhcmFtZXRlcnMgcGFyYW1zCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotYm9vbGVhbgotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ucGFyYW1zLkRIUGFyYW1ldGVycykKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLnBhcmFtcy5ESFBhcmFtZXRlcnMgZ2V0UGFyYW1ldGVycygpCi0KLXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLnBhcmFtcy5ESFBhcmFtZXRlcnMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQ2lwaGVyUGFyYW1ldGVycwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEubWF0aC5CaWdJbnRlZ2VyIGcKLQotcHJpdmF0ZSBpbnQgagotCi1wcml2YXRlIGphdmEubWF0aC5CaWdJbnRlZ2VyIHAKLQotcHJpdmF0ZSBqYXZhLm1hdGguQmlnSW50ZWdlciBxCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ucGFyYW1zLkRIVmFsaWRhdGlvblBhcmFtZXRlcnMgdmFsaWRhdGlvbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1qYXZhLm1hdGguQmlnSW50ZWdlcikKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5tYXRoLkJpZ0ludGVnZXIKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1qYXZhLm1hdGguQmlnSW50ZWdlcgotaW50KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLm1hdGguQmlnSW50ZWdlcgotamF2YS5tYXRoLkJpZ0ludGVnZXIKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1pbnQKLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLnBhcmFtcy5ESFZhbGlkYXRpb25QYXJhbWV0ZXJzKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgZ2V0RygpCi0KLXB1YmxpYyBpbnQgZ2V0SigpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRQKCkKLQotcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldFEoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ucGFyYW1zLkRIVmFsaWRhdGlvblBhcmFtZXRlcnMgZ2V0VmFsaWRhdGlvblBhcmFtZXRlcnMoKQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5wYXJhbXMuREhQcml2YXRlS2V5UGFyYW1ldGVycyBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLnBhcmFtcy5ESEtleVBhcmFtZXRlcnMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLm1hdGguQmlnSW50ZWdlciB4Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5tYXRoLkJpZ0ludGVnZXIKLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLnBhcmFtcy5ESFBhcmFtZXRlcnMpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRYKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5wYXJhbXMuREhQdWJsaWNLZXlQYXJhbWV0ZXJzIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ucGFyYW1zLkRIS2V5UGFyYW1ldGVycwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEubWF0aC5CaWdJbnRlZ2VyIHkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLm1hdGguQmlnSW50ZWdlcgotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ucGFyYW1zLkRIUGFyYW1ldGVycykKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldFkoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLnBhcmFtcy5ESFZhbGlkYXRpb25QYXJhbWV0ZXJzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGludCBjb3VudGVyCi0KLXByaXZhdGUgYnl0ZVtdIHNlZWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ieXRlW10KLWludCkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGludCBoYXNoQ29kZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ucGFyYW1zLkRTQUtleUdlbmVyYXRpb25QYXJhbWV0ZXJzIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uS2V5R2VuZXJhdGlvblBhcmFtZXRlcnMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5wYXJhbXMuRFNBUGFyYW1ldGVycyBwYXJhbXMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbQotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ucGFyYW1zLkRTQVBhcmFtZXRlcnMpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5wYXJhbXMuRFNBUGFyYW1ldGVycyBnZXRQYXJhbWV0ZXJzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5wYXJhbXMuRFNBS2V5UGFyYW1ldGVycyBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLnBhcmFtcy5Bc3ltbWV0cmljS2V5UGFyYW1ldGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ucGFyYW1zLkRTQVBhcmFtZXRlcnMgcGFyYW1zCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYm9vbGVhbgotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ucGFyYW1zLkRTQVBhcmFtZXRlcnMpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5wYXJhbXMuRFNBUGFyYW1ldGVycyBnZXRQYXJhbWV0ZXJzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5wYXJhbXMuRFNBUGFyYW1ldGVycyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5DaXBoZXJQYXJhbWV0ZXJzCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS5tYXRoLkJpZ0ludGVnZXIgZwotCi1wcml2YXRlIGphdmEubWF0aC5CaWdJbnRlZ2VyIHAKLQotcHJpdmF0ZSBqYXZhLm1hdGguQmlnSW50ZWdlciBxCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ucGFyYW1zLkRTQVZhbGlkYXRpb25QYXJhbWV0ZXJzIHZhbGlkYXRpb24KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLm1hdGguQmlnSW50ZWdlcgotamF2YS5tYXRoLkJpZ0ludGVnZXIKLWphdmEubWF0aC5CaWdJbnRlZ2VyKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLm1hdGguQmlnSW50ZWdlcgotamF2YS5tYXRoLkJpZ0ludGVnZXIKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5wYXJhbXMuRFNBVmFsaWRhdGlvblBhcmFtZXRlcnMpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRHKCkKLQotcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldFAoKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgZ2V0USgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5wYXJhbXMuRFNBVmFsaWRhdGlvblBhcmFtZXRlcnMgZ2V0VmFsaWRhdGlvblBhcmFtZXRlcnMoKQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5wYXJhbXMuRFNBUHJpdmF0ZUtleVBhcmFtZXRlcnMgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5wYXJhbXMuRFNBS2V5UGFyYW1ldGVycwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEubWF0aC5CaWdJbnRlZ2VyIHgKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLm1hdGguQmlnSW50ZWdlcgotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ucGFyYW1zLkRTQVBhcmFtZXRlcnMpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRYKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5wYXJhbXMuRFNBUHVibGljS2V5UGFyYW1ldGVycyBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLnBhcmFtcy5EU0FLZXlQYXJhbWV0ZXJzCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS5tYXRoLkJpZ0ludGVnZXIgeQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5wYXJhbXMuRFNBUGFyYW1ldGVycykKLQotcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldFkoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLnBhcmFtcy5EU0FWYWxpZGF0aW9uUGFyYW1ldGVycyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBpbnQgY291bnRlcgotCi1wcml2YXRlIGJ5dGVbXSBzZWVkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotYnl0ZVtdCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBpbnQgZ2V0Q291bnRlcigpCi0KLXB1YmxpYyBieXRlW10gZ2V0U2VlZCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ucGFyYW1zLklFU1BhcmFtZXRlcnMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQ2lwaGVyUGFyYW1ldGVycwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGJ5dGVbXSBkZXJpdmF0aW9uCi0KLXByaXZhdGUgYnl0ZVtdIGVuY29kaW5nCi0KLXByaXZhdGUgaW50IG1hY0tleVNpemUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ieXRlW10KLWJ5dGVbXQotaW50KQotCi1wdWJsaWMgYnl0ZVtdIGdldERlcml2YXRpb25WKCkKLQotcHVibGljIGJ5dGVbXSBnZXRFbmNvZGluZ1YoKQotCi1wdWJsaWMgaW50IGdldE1hY0tleVNpemUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLnBhcmFtcy5JRVNXaXRoQ2lwaGVyUGFyYW1ldGVycyBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLnBhcmFtcy5JRVNQYXJhbWV0ZXJzCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgaW50IGNpcGhlcktleVNpemUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ieXRlW10KLWJ5dGVbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0Q2lwaGVyS2V5U2l6ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ucGFyYW1zLklTTzE4MDMzS0RGUGFyYW1ldGVycyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5EZXJpdmF0aW9uUGFyYW1ldGVycwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gYnl0ZVtdIHNlZWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ieXRlW10pCi0KLXB1YmxpYyBieXRlW10gZ2V0U2VlZCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ucGFyYW1zLktERlBhcmFtZXRlcnMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uRGVyaXZhdGlvblBhcmFtZXRlcnMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGJ5dGVbXSBpdgotCi0gYnl0ZVtdIHNoYXJlZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWJ5dGVbXQotYnl0ZVtdKQotCi1wdWJsaWMgYnl0ZVtdIGdldElWKCkKLQotcHVibGljIGJ5dGVbXSBnZXRTaGFyZWRTZWNyZXQoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLnBhcmFtcy5NR0ZQYXJhbWV0ZXJzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkRlcml2YXRpb25QYXJhbWV0ZXJzCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBieXRlW10gc2VlZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWJ5dGVbXSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYnl0ZVtdCi1pbnQKLWludCkKLQotcHVibGljIGJ5dGVbXSBnZXRTZWVkKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5wYXJhbXMuUGFyYW1ldGVyc1dpdGhJViBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5DaXBoZXJQYXJhbWV0ZXJzCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYnl0ZVtdIGl2Ci0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQ2lwaGVyUGFyYW1ldGVycyBwYXJhbWV0ZXJzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQ2lwaGVyUGFyYW1ldGVycwotYnl0ZVtdKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5DaXBoZXJQYXJhbWV0ZXJzCi1ieXRlW10KLWludAotaW50KQotCi1wdWJsaWMgYnl0ZVtdIGdldElWKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkNpcGhlclBhcmFtZXRlcnMgZ2V0UGFyYW1ldGVycygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ucGFyYW1zLlBhcmFtZXRlcnNXaXRoUmFuZG9tIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkNpcGhlclBhcmFtZXRlcnMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5DaXBoZXJQYXJhbWV0ZXJzIHBhcmFtZXRlcnMKLQotcHJpdmF0ZSBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSByYW5kb20KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5DaXBoZXJQYXJhbWV0ZXJzKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5DaXBoZXJQYXJhbWV0ZXJzCi1qYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkNpcGhlclBhcmFtZXRlcnMgZ2V0UGFyYW1ldGVycygpCi0KLXB1YmxpYyBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSBnZXRSYW5kb20oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLnBhcmFtcy5QYXJhbWV0ZXJzV2l0aFNCb3ggZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQ2lwaGVyUGFyYW1ldGVycwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkNpcGhlclBhcmFtZXRlcnMgcGFyYW1ldGVycwotCi1wcml2YXRlIGJ5dGVbXSBzQm94Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQ2lwaGVyUGFyYW1ldGVycwotYnl0ZVtdKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQ2lwaGVyUGFyYW1ldGVycyBnZXRQYXJhbWV0ZXJzKCkKLQotcHVibGljIGJ5dGVbXSBnZXRTQm94KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5wYXJhbXMuUGFyYW1ldGVyc1dpdGhTYWx0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkNpcGhlclBhcmFtZXRlcnMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5DaXBoZXJQYXJhbWV0ZXJzIHBhcmFtZXRlcnMKLQotcHJpdmF0ZSBieXRlW10gc2FsdAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkNpcGhlclBhcmFtZXRlcnMKLWJ5dGVbXSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQ2lwaGVyUGFyYW1ldGVycwotYnl0ZVtdCi1pbnQKLWludCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkNpcGhlclBhcmFtZXRlcnMgZ2V0UGFyYW1ldGVycygpCi0KLXB1YmxpYyBieXRlW10gZ2V0U2FsdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ucGFyYW1zLlJDMlBhcmFtZXRlcnMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQ2lwaGVyUGFyYW1ldGVycwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGludCBiaXRzCi0KLXByaXZhdGUgYnl0ZVtdIGtleQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWJ5dGVbXSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYnl0ZVtdCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0RWZmZWN0aXZlS2V5Qml0cygpCi0KLXB1YmxpYyBieXRlW10gZ2V0S2V5KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5wYXJhbXMuUkM1UGFyYW1ldGVycyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5DaXBoZXJQYXJhbWV0ZXJzCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYnl0ZVtdIGtleQotCi1wcml2YXRlIGludCByb3VuZHMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ieXRlW10KLWludCkKLQotcHVibGljIGJ5dGVbXSBnZXRLZXkoKQotCi1wdWJsaWMgaW50IGdldFJvdW5kcygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ucGFyYW1zLlJTQUtleUdlbmVyYXRpb25QYXJhbWV0ZXJzIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uS2V5R2VuZXJhdGlvblBhcmFtZXRlcnMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBpbnQgY2VydGFpbnR5Ci0KLXByaXZhdGUgamF2YS5tYXRoLkJpZ0ludGVnZXIgcHVibGljRXhwb25lbnQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLm1hdGguQmlnSW50ZWdlcgotamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20KLWludAotaW50KQotCi1wdWJsaWMgaW50IGdldENlcnRhaW50eSgpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRQdWJsaWNFeHBvbmVudCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ucGFyYW1zLlJTQUtleVBhcmFtZXRlcnMgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5wYXJhbXMuQXN5bW1ldHJpY0tleVBhcmFtZXRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEubWF0aC5CaWdJbnRlZ2VyIGV4cG9uZW50Ci0KLXByaXZhdGUgamF2YS5tYXRoLkJpZ0ludGVnZXIgbW9kdWx1cwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWJvb2xlYW4KLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1qYXZhLm1hdGguQmlnSW50ZWdlcikKLQotcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldEV4cG9uZW50KCkKLQotcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldE1vZHVsdXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLnBhcmFtcy5SU0FQcml2YXRlQ3J0S2V5UGFyYW1ldGVycyBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLnBhcmFtcy5SU0FLZXlQYXJhbWV0ZXJzCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS5tYXRoLkJpZ0ludGVnZXIgZFAKLQotcHJpdmF0ZSBqYXZhLm1hdGguQmlnSW50ZWdlciBkUQotCi1wcml2YXRlIGphdmEubWF0aC5CaWdJbnRlZ2VyIGUKLQotcHJpdmF0ZSBqYXZhLm1hdGguQmlnSW50ZWdlciBwCi0KLXByaXZhdGUgamF2YS5tYXRoLkJpZ0ludGVnZXIgcQotCi1wcml2YXRlIGphdmEubWF0aC5CaWdJbnRlZ2VyIHFJbnYKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLm1hdGguQmlnSW50ZWdlcgotamF2YS5tYXRoLkJpZ0ludGVnZXIKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1qYXZhLm1hdGguQmlnSW50ZWdlcgotamF2YS5tYXRoLkJpZ0ludGVnZXIKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1qYXZhLm1hdGguQmlnSW50ZWdlcgotamF2YS5tYXRoLkJpZ0ludGVnZXIpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXREUCgpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXREUSgpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRQKCkKLQotcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldFB1YmxpY0V4cG9uZW50KCkKLQotcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldFEoKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgZ2V0UUludigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uc2lnbmVycy5EU0FTaWduZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uRFNBCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5wYXJhbXMuRFNBS2V5UGFyYW1ldGVycyBrZXkKLQotIGphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tIHJhbmRvbQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlcltdIGdlbmVyYXRlU2lnbmF0dXJlKAotYnl0ZVtdKQotCi1wdWJsaWMgdm9pZCBpbml0KAotYm9vbGVhbgotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQ2lwaGVyUGFyYW1ldGVycykKLQotcHVibGljIGJvb2xlYW4gdmVyaWZ5U2lnbmF0dXJlKAotYnl0ZVtdCi1qYXZhLm1hdGguQmlnSW50ZWdlcgotamF2YS5tYXRoLkJpZ0ludGVnZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uc2lnbmVycy5JU085Nzk2ZDJQU1NTaWduZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uU2lnbmVyV2l0aFJlY292ZXJ5Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSQUlMRVJfSU1QTElDSVQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFJBSUxFUl9SSVBFTUQxMjgKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFJBSUxFUl9SSVBFTUQxNjAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFJBSUxFUl9TSEExCi0KLXByaXZhdGUgYnl0ZVtdIGJsb2NrCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQXN5bW1ldHJpY0Jsb2NrQ2lwaGVyIGNpcGhlcgotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkRpZ2VzdCBkaWdlc3QKLQotcHJpdmF0ZSBib29sZWFuIGZ1bGxNZXNzYWdlCi0KLXByaXZhdGUgaW50IGhMZW4KLQotcHJpdmF0ZSBpbnQga2V5Qml0cwotCi1wcml2YXRlIGJ5dGVbXSBtQnVmCi0KLXByaXZhdGUgaW50IG1lc3NhZ2VMZW5ndGgKLQotcHJpdmF0ZSBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSByYW5kb20KLQotcHJpdmF0ZSBieXRlW10gcmVjb3ZlcmVkTWVzc2FnZQotCi1wcml2YXRlIGludCBzYWx0TGVuZ3RoCi0KLXByaXZhdGUgYnl0ZVtdIHN0YW5kYXJkU2FsdAotCi1wcml2YXRlIGludCB0cmFpbGVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQXN5bW1ldHJpY0Jsb2NrQ2lwaGVyCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5EaWdlc3QKLWludCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQXN5bW1ldHJpY0Jsb2NrQ2lwaGVyCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5EaWdlc3QKLWludAotYm9vbGVhbikKLQotcHJpdmF0ZSB2b2lkIEl0b09TUCgKLWludAotYnl0ZVtdKQotCi1wcml2YXRlIHZvaWQgTHRvT1NQKAotbG9uZwotYnl0ZVtdKQotCi1wcml2YXRlIHZvaWQgY2xlYXJCbG9jaygKLWJ5dGVbXSkKLQotcHJpdmF0ZSBib29sZWFuIGlzU2FtZUFzKAotYnl0ZVtdCi1ieXRlW10pCi0KLXByaXZhdGUgYnl0ZVtdIG1hc2tHZW5lcmF0b3JGdW5jdGlvbjEoCi1ieXRlW10KLWludAotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvY3J5cHRvL0NyeXB0b0V4Y2VwdGlvbjsgKQotcHVibGljIGJ5dGVbXSBnZW5lcmF0ZVNpZ25hdHVyZSgpCi0KLXB1YmxpYyBieXRlW10gZ2V0UmVjb3ZlcmVkTWVzc2FnZSgpCi0KLXB1YmxpYyBib29sZWFuIGhhc0Z1bGxNZXNzYWdlKCkKLQotcHVibGljIHZvaWQgaW5pdCgKLWJvb2xlYW4KLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkNpcGhlclBhcmFtZXRlcnMpCi0KLXB1YmxpYyB2b2lkIHJlc2V0KCkKLQotcHVibGljIHZvaWQgdXBkYXRlKAotYnl0ZSkKLQotcHVibGljIHZvaWQgdXBkYXRlKAotYnl0ZVtdCi1pbnQKLWludCkKLQotcHVibGljIGJvb2xlYW4gdmVyaWZ5U2lnbmF0dXJlKAotYnl0ZVtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLnNpZ25lcnMuSVNPOTc5NmQyU2lnbmVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLlNpZ25lcldpdGhSZWNvdmVyeQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUUkFJTEVSX0lNUExJQ0lUCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSQUlMRVJfUklQRU1EMTI4Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSQUlMRVJfUklQRU1EMTYwCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSQUlMRVJfU0hBMQotCi1wcml2YXRlIGJ5dGVbXSBibG9jawotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkFzeW1tZXRyaWNCbG9ja0NpcGhlciBjaXBoZXIKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5EaWdlc3QgZGlnZXN0Ci0KLXByaXZhdGUgYm9vbGVhbiBmdWxsTWVzc2FnZQotCi1wcml2YXRlIGludCBrZXlCaXRzCi0KLXByaXZhdGUgYnl0ZVtdIG1CdWYKLQotcHJpdmF0ZSBpbnQgbWVzc2FnZUxlbmd0aAotCi1wcml2YXRlIGJ5dGVbXSByZWNvdmVyZWRNZXNzYWdlCi0KLXByaXZhdGUgaW50IHRyYWlsZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5Bc3ltbWV0cmljQmxvY2tDaXBoZXIKLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkRpZ2VzdCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQXN5bW1ldHJpY0Jsb2NrQ2lwaGVyCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5EaWdlc3QKLWJvb2xlYW4pCi0KLXByaXZhdGUgdm9pZCBjbGVhckJsb2NrKAotYnl0ZVtdKQotCi1wcml2YXRlIGJvb2xlYW4gaXNTYW1lQXMoCi1ieXRlW10KLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9jcnlwdG8vQ3J5cHRvRXhjZXB0aW9uOyApCi1wdWJsaWMgYnl0ZVtdIGdlbmVyYXRlU2lnbmF0dXJlKCkKLQotcHVibGljIGJ5dGVbXSBnZXRSZWNvdmVyZWRNZXNzYWdlKCkKLQotcHVibGljIGJvb2xlYW4gaGFzRnVsbE1lc3NhZ2UoKQotCi1wdWJsaWMgdm9pZCBpbml0KAotYm9vbGVhbgotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQ2lwaGVyUGFyYW1ldGVycykKLQotcHVibGljIHZvaWQgcmVzZXQoKQotCi1wdWJsaWMgdm9pZCB1cGRhdGUoCi1ieXRlKQotCi1wdWJsaWMgdm9pZCB1cGRhdGUoCi1ieXRlW10KLWludAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiB2ZXJpZnlTaWduYXR1cmUoCi1ieXRlW10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uc2lnbmVycy5QU1NTaWduZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uU2lnbmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBUUkFJTEVSX0lNUExJQ0lUCi0KLXByaXZhdGUgYnl0ZVtdIGJsb2NrCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQXN5bW1ldHJpY0Jsb2NrQ2lwaGVyIGNpcGhlcgotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkRpZ2VzdCBkaWdlc3QKLQotcHJpdmF0ZSBpbnQgZW1CaXRzCi0KLXByaXZhdGUgaW50IGhMZW4KLQotcHJpdmF0ZSBieXRlW10gbURhc2gKLQotcHJpdmF0ZSBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSByYW5kb20KLQotcHJpdmF0ZSBpbnQgc0xlbgotCi1wcml2YXRlIGJ5dGVbXSBzYWx0Ci0KLXByaXZhdGUgYnl0ZSB0cmFpbGVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQXN5bW1ldHJpY0Jsb2NrQ2lwaGVyCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5EaWdlc3QKLWludCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQXN5bW1ldHJpY0Jsb2NrQ2lwaGVyCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5EaWdlc3QKLWludAotYnl0ZSkKLQotcHJpdmF0ZSB2b2lkIEl0b09TUCgKLWludAotYnl0ZVtdKQotCi1wcml2YXRlIHZvaWQgY2xlYXJCbG9jaygKLWJ5dGVbXSkKLQotcHJpdmF0ZSBieXRlW10gbWFza0dlbmVyYXRvckZ1bmN0aW9uMSgKLWJ5dGVbXQotaW50Ci1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9jcnlwdG8vQ3J5cHRvRXhjZXB0aW9uO0xvcmcvYm91bmN5Y2FzdGxlL2NyeXB0by9EYXRhTGVuZ3RoRXhjZXB0aW9uOyApCi1wdWJsaWMgYnl0ZVtdIGdlbmVyYXRlU2lnbmF0dXJlKCkKLQotcHVibGljIHZvaWQgaW5pdCgKLWJvb2xlYW4KLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkNpcGhlclBhcmFtZXRlcnMpCi0KLXB1YmxpYyB2b2lkIHJlc2V0KCkKLQotcHVibGljIHZvaWQgdXBkYXRlKAotYnl0ZSkKLQotcHVibGljIHZvaWQgdXBkYXRlKAotYnl0ZVtdCi1pbnQKLWludCkKLQotcHVibGljIGJvb2xlYW4gdmVyaWZ5U2lnbmF0dXJlKAotYnl0ZVtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLnV0aWwuUHJpdmF0ZUtleUZhY3RvcnkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5wYXJhbXMuQXN5bW1ldHJpY0tleVBhcmFtZXRlciBjcmVhdGVLZXkoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEucGtjcy5Qcml2YXRlS2V5SW5mbykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by51dGlsLlB1YmxpY0tleUZhY3RvcnkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5wYXJhbXMuQXN5bW1ldHJpY0tleVBhcmFtZXRlciBjcmVhdGVLZXkoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5TdWJqZWN0UHVibGljS2V5SW5mbykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmkxOG4uTG9jYWxpemVkTWVzc2FnZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIGphdmEubGFuZy5PYmplY3RbXSBhcmd1bWVudHMKLQotcHJvdGVjdGVkIG9yZy5ib3VuY3ljYXN0bGUuaTE4bi5maWx0ZXIuRmlsdGVyIGZpbHRlcgotCi1wcm90ZWN0ZWQgamF2YS5sYW5nLk9iamVjdFtdIGZpbHRlcmVkQXJndW1lbnRzCi0KLXByb3RlY3RlZCBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIGlkCi0KLXByb3RlY3RlZCBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIHJlc291cmNlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL051bGxQb2ludGVyRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvTnVsbFBvaW50ZXJFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3RbXSkKLQotcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgZm9ybWF0V2l0aFRpbWVab25lKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLk9iamVjdFtdCi1qYXZhLnV0aWwuTG9jYWxlCi1qYXZhLnV0aWwuVGltZVpvbmUpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0W10gZ2V0QXJndW1lbnRzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9pMThuL01pc3NpbmdFbnRyeUV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RW50cnkoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnV0aWwuTG9jYWxlCi1qYXZhLnV0aWwuVGltZVpvbmUpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmkxOG4uZmlsdGVyLkZpbHRlciBnZXRGaWx0ZXIoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJZCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFJlc291cmNlKCkKLQotcHVibGljIHZvaWQgc2V0RmlsdGVyKAotb3JnLmJvdW5jeWNhc3RsZS5pMThuLmZpbHRlci5GaWx0ZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5pMThuLlRleHRCdW5kbGUgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmkxOG4uTG9jYWxpemVkTWVzc2FnZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEVYVF9FTlRSWQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9OdWxsUG9pbnRlckV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL051bGxQb2ludGVyRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0W10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvaTE4bi9NaXNzaW5nRW50cnlFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFRleHQoCi1qYXZhLnV0aWwuTG9jYWxlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2kxOG4vTWlzc2luZ0VudHJ5RXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRUZXh0KAotamF2YS51dGlsLkxvY2FsZQotamF2YS51dGlsLlRpbWVab25lKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuaTE4bi5NZXNzYWdlQnVuZGxlIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5pMThuLlRleHRCdW5kbGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFRJVExFX0VOVFJZCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL051bGxQb2ludGVyRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvTnVsbFBvaW50ZXJFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3RbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9pMThuL01pc3NpbmdFbnRyeUV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VGl0bGUoCi1qYXZhLnV0aWwuTG9jYWxlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2kxOG4vTWlzc2luZ0VudHJ5RXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRUaXRsZSgKLWphdmEudXRpbC5Mb2NhbGUKLWphdmEudXRpbC5UaW1lWm9uZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmkxOG4uRXJyb3JCdW5kbGUgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmkxOG4uTWVzc2FnZUJ1bmRsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVUQUlMX0VOVFJZCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTVU1NQVJZX0VOVFJZCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL051bGxQb2ludGVyRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvTnVsbFBvaW50ZXJFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3RbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9pMThuL01pc3NpbmdFbnRyeUV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RGV0YWlsKAotamF2YS51dGlsLkxvY2FsZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9pMThuL01pc3NpbmdFbnRyeUV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RGV0YWlsKAotamF2YS51dGlsLkxvY2FsZQotamF2YS51dGlsLlRpbWVab25lKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2kxOG4vTWlzc2luZ0VudHJ5RXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdW1tYXJ5KAotamF2YS51dGlsLkxvY2FsZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9pMThuL01pc3NpbmdFbnRyeUV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3VtbWFyeSgKLWphdmEudXRpbC5Mb2NhbGUKLWphdmEudXRpbC5UaW1lWm9uZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmkxOG4uTG9jYWxpemVkRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLkV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEubGFuZy5UaHJvd2FibGUgY2F1c2UKLQotcHJvdGVjdGVkIG9yZy5ib3VuY3ljYXN0bGUuaTE4bi5FcnJvckJ1bmRsZSBtZXNzYWdlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5pMThuLkVycm9yQnVuZGxlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmkxOG4uRXJyb3JCdW5kbGUKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLXB1YmxpYyBqYXZhLmxhbmcuVGhyb3dhYmxlIGdldENhdXNlKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuaTE4bi5FcnJvckJ1bmRsZSBnZXRFcnJvck1lc3NhZ2UoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuaTE4bi5NaXNzaW5nRW50cnlFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgZmluYWwgamF2YS5sYW5nLlN0cmluZyBrZXkKLQotcHJvdGVjdGVkIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgcmVzb3VyY2UKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRLZXkoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRSZXNvdXJjZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuaTE4bi5maWx0ZXIuRmlsdGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGRvRmlsdGVyKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmkxOG4uZmlsdGVyLkhUTUxGaWx0ZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmJvdW5jeWNhc3RsZS5pMThuLmZpbHRlci5GaWx0ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBkb0ZpbHRlcigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5pMThuLmZpbHRlci5TUUxGaWx0ZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmJvdW5jeWNhc3RsZS5pMThuLmZpbHRlci5GaWx0ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBkb0ZpbHRlcigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5pMThuLmZpbHRlci5VbnRydXN0ZWRJbnB1dCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIGphdmEubGFuZy5PYmplY3QgaW5wdXQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRJbnB1dCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5QS0NTMTBDZXJ0aWZpY2F0aW9uUmVxdWVzdCBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5wa2NzLkNlcnRpZmljYXRpb25SZXF1ZXN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGphdmEudXRpbC5IYXNodGFibGUgYWxnb3JpdGhtcwotCi1wcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuSGFzaHRhYmxlIGtleUFsZ29yaXRobXMKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLlNldCBub1BhcmFtcwotCi1wcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuSGFzaHRhYmxlIG9pZHMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L05vU3VjaFByb3ZpZGVyRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvU2lnbmF0dXJlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZheC5zZWN1cml0eS5hdXRoLng1MDAuWDUwMFByaW5jaXBhbAotamF2YS5zZWN1cml0eS5QdWJsaWNLZXkKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2V0Ci1qYXZhLnNlY3VyaXR5LlByaXZhdGVLZXkpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L05vU3VjaFByb3ZpZGVyRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvU2lnbmF0dXJlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZheC5zZWN1cml0eS5hdXRoLng1MDAuWDUwMFByaW5jaXBhbAotamF2YS5zZWN1cml0eS5QdWJsaWNLZXkKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2V0Ci1qYXZhLnNlY3VyaXR5LlByaXZhdGVLZXkKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L05vU3VjaFByb3ZpZGVyRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvU2lnbmF0dXJlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5YNTA5TmFtZQotamF2YS5zZWN1cml0eS5QdWJsaWNLZXkKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2V0Ci1qYXZhLnNlY3VyaXR5LlByaXZhdGVLZXkpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L05vU3VjaFByb3ZpZGVyRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvU2lnbmF0dXJlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5YNTA5TmFtZQotamF2YS5zZWN1cml0eS5QdWJsaWNLZXkKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2V0Ci1qYXZhLnNlY3VyaXR5LlByaXZhdGVLZXkKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWJ5dGVbXSkKLQotcHJpdmF0ZSBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuWDUwOU5hbWUgY29udmVydE5hbWUoCi1qYXZheC5zZWN1cml0eS5hdXRoLng1MDAuWDUwMFByaW5jaXBhbCkKLQotcHJpdmF0ZSBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSB0b0RFUlNlcXVlbmNlKAotYnl0ZVtdKQotCi1wdWJsaWMgYnl0ZVtdIGdldEVuY29kZWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9Ob1N1Y2hQcm92aWRlckV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zZWN1cml0eS5QdWJsaWNLZXkgZ2V0UHVibGljS2V5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247TGphdmEvc2VjdXJpdHkvTm9TdWNoUHJvdmlkZXJFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuc2VjdXJpdHkuUHVibGljS2V5IGdldFB1YmxpY0tleSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L05vU3VjaFByb3ZpZGVyRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvU2lnbmF0dXJlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiB2ZXJpZnkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9Ob1N1Y2hQcm92aWRlckV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L1NpZ25hdHVyZUV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gdmVyaWZ5KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5QS0NTN1NpZ25lZERhdGEgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLnBrY3MuUEtDU09iamVjdElkZW50aWZpZXJzCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBJRF9EU0EKLQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIElEX01EMgotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSURfTUQ1Ci0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBJRF9QS0NTN19EQVRBCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBJRF9QS0NTN19TSUdORURfREFUQQotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSURfUlNBCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBJRF9TSEExCi0KLXByaXZhdGUgamF2YS51dGlsLkNvbGxlY3Rpb24gY2VydHMKLQotcHJpdmF0ZSBqYXZhLnV0aWwuQ29sbGVjdGlvbiBjcmxzCi0KLXByaXZhdGUgYnl0ZVtdIGRpZ2VzdAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZGlnZXN0QWxnb3JpdGhtCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBkaWdlc3RFbmNyeXB0aW9uQWxnb3JpdGhtCi0KLXByaXZhdGUgamF2YS51dGlsLlNldCBkaWdlc3RhbGdvcwotCi1wcml2YXRlIHRyYW5zaWVudCBqYXZhLnNlY3VyaXR5LlByaXZhdGVLZXkgcHJpdktleQotCi1wcml2YXRlIGphdmEuc2VjdXJpdHkuU2lnbmF0dXJlIHNpZwotCi1wcml2YXRlIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGUgc2lnbkNlcnQKLQotcHJpdmF0ZSBpbnQgc2lnbmVydmVyc2lvbgotCi1wcml2YXRlIGludCB2ZXJzaW9uCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL1NlY3VyaXR5RXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvTm9TdWNoUHJvdmlkZXJFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnNlY3VyaXR5LlByaXZhdGVLZXkKLWphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZVtdCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvU2VjdXJpdHlFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9Ob1N1Y2hQcm92aWRlckV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuc2VjdXJpdHkuUHJpdmF0ZUtleQotamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlW10KLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9TZWN1cml0eUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L05vU3VjaFByb3ZpZGVyRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5zZWN1cml0eS5Qcml2YXRlS2V5Ci1qYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVbXQotamF2YS5zZWN1cml0eS5jZXJ0LkNSTFtdCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvU2VjdXJpdHlFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvY2VydC9DUkxFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9Ob1N1Y2hQcm92aWRlckV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL1NlY3VyaXR5RXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L2NlcnQvQ1JMRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvTm9TdWNoUHJvdmlkZXJFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ieXRlW10KLWphdmEubGFuZy5TdHJpbmcpCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCBnZXRJc3N1ZXIoCi1ieXRlW10pCi0KLXB1YmxpYyBqYXZhLnV0aWwuQ29sbGVjdGlvbiBnZXRDUkxzKCkKLQotcHVibGljIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZVtdIGdldENlcnRpZmljYXRlcygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldERpZ2VzdEFsZ29yaXRobSgpCi0KLXB1YmxpYyBieXRlW10gZ2V0RW5jb2RlZCgpCi0KLXB1YmxpYyBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlIGdldFNpZ25pbmdDZXJ0aWZpY2F0ZSgpCi0KLXB1YmxpYyBpbnQgZ2V0U2lnbmluZ0luZm9WZXJzaW9uKCkKLQotcHVibGljIGludCBnZXRWZXJzaW9uKCkKLQotcHVibGljIHZvaWQgcmVzZXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L1NpZ25hdHVyZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgdXBkYXRlKAotYnl0ZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9TaWduYXR1cmVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHVwZGF0ZSgKLWJ5dGVbXQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvU2lnbmF0dXJlRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiB2ZXJpZnkoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLlByaW5jaXBhbFV0aWwgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9jZXJ0L0NSTEV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5YNTA5UHJpbmNpcGFsIGdldElzc3Vlclg1MDlQcmluY2lwYWwoCi1qYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNSTCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5qY2UuWDUwOVByaW5jaXBhbCBnZXRJc3N1ZXJYNTA5UHJpbmNpcGFsKAotamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5qY2UuWDUwOVByaW5jaXBhbCBnZXRTdWJqZWN0WDUwOVByaW5jaXBhbCgKLWphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UuWDUwOUtleVVzYWdlIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFFbmNvZGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY1JMU2lnbgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkYXRhRW5jaXBoZXJtZW50Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGRlY2lwaGVyT25seQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBkaWdpdGFsU2lnbmF0dXJlCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGVuY2lwaGVyT25seQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBrZXlBZ3JlZW1lbnQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQga2V5Q2VydFNpZ24KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQga2V5RW5jaXBoZXJtZW50Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG5vblJlcHVkaWF0aW9uCi0KLXByaXZhdGUgaW50IHVzYWdlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotaW50KQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCB0b0FTTjFPYmplY3QoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLlg1MDlQcmluY2lwYWwgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5YNTA5TmFtZSBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkhhc2h0YWJsZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLlZlY3RvcgotamF2YS51dGlsLkhhc2h0YWJsZSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLlZlY3RvcgotamF2YS51dGlsLlZlY3RvcikKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuWDUwOU5hbWUpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWJvb2xlYW4KLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWJvb2xlYW4KLWphdmEudXRpbC5IYXNodGFibGUKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSByZWFkU2VxdWVuY2UoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUlucHV0U3RyZWFtKQotCi1wdWJsaWMgYnl0ZVtdIGdldEVuY29kZWQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXROYW1lKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5YNTA5VjFDZXJ0aWZpY2F0ZUdlbmVyYXRvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLkhhc2h0YWJsZSBhbGdvcml0aG1zCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllciBzaWdBbGdJZAotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIHNpZ09JRAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgc2lnbmF0dXJlQWxnb3JpdGhtCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuVjFUQlNDZXJ0aWZpY2F0ZUdlbmVyYXRvciB0YnNHZW4KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9TZWN1cml0eUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9TaWduYXR1cmVFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGUgZ2VuZXJhdGVYNTA5Q2VydGlmaWNhdGUoCi1qYXZhLnNlY3VyaXR5LlByaXZhdGVLZXkpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvTm9TdWNoUHJvdmlkZXJFeGNlcHRpb247TGphdmEvbGFuZy9TZWN1cml0eUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9TaWduYXR1cmVFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGUgZ2VuZXJhdGVYNTA5Q2VydGlmaWNhdGUoCi1qYXZhLnNlY3VyaXR5LlByaXZhdGVLZXkKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvTm9TdWNoUHJvdmlkZXJFeGNlcHRpb247TGphdmEvbGFuZy9TZWN1cml0eUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9TaWduYXR1cmVFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGUgZ2VuZXJhdGVYNTA5Q2VydGlmaWNhdGUoCi1qYXZhLnNlY3VyaXR5LlByaXZhdGVLZXkKLWphdmEubGFuZy5TdHJpbmcKLWphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvU2VjdXJpdHlFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvU2lnbmF0dXJlRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlIGdlbmVyYXRlWDUwOUNlcnRpZmljYXRlKAotamF2YS5zZWN1cml0eS5Qcml2YXRlS2V5Ci1qYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSkKLQotcHVibGljIHZvaWQgcmVzZXQoKQotCi1wdWJsaWMgdm9pZCBzZXRJc3N1ZXJETigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5Llg1MDlOYW1lKQotCi1wdWJsaWMgdm9pZCBzZXROb3RBZnRlcigKLWphdmEudXRpbC5EYXRlKQotCi1wdWJsaWMgdm9pZCBzZXROb3RCZWZvcmUoCi1qYXZhLnV0aWwuRGF0ZSkKLQotcHVibGljIHZvaWQgc2V0UHVibGljS2V5KAotamF2YS5zZWN1cml0eS5QdWJsaWNLZXkpCi0KLXB1YmxpYyB2b2lkIHNldFNlcmlhbE51bWJlcigKLWphdmEubWF0aC5CaWdJbnRlZ2VyKQotCi1wdWJsaWMgdm9pZCBzZXRTaWduYXR1cmVBbGdvcml0aG0oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRTdWJqZWN0RE4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5YNTA5TmFtZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5YNTA5VjJDUkxHZW5lcmF0b3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGphdmEudXRpbC5IYXNodGFibGUgYWxnb3JpdGhtcwotCi1wcml2YXRlIGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0IGRhdGVGCi0KLXByaXZhdGUgamF2YS51dGlsLlZlY3RvciBleHRPcmRlcmluZwotCi1wcml2YXRlIGphdmEudXRpbC5IYXNodGFibGUgZXh0ZW5zaW9ucwotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIgc2lnQWxnSWQKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBzaWdPSUQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHNpZ25hdHVyZUFsZ29yaXRobQotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LlYyVEJTQ2VydExpc3RHZW5lcmF0b3IgdGJzR2VuCi0KLXByaXZhdGUgamF2YS51dGlsLlNpbXBsZVRpbWVab25lIHR6Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCBhZGRDUkxFbnRyeSgKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1qYXZhLnV0aWwuRGF0ZQotaW50KQotCi1wdWJsaWMgdm9pZCBhZGRFeHRlbnNpb24oCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSRW5jb2RhYmxlKQotCi1wdWJsaWMgdm9pZCBhZGRFeHRlbnNpb24oCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuCi1ieXRlW10pCi0KLXB1YmxpYyB2b2lkIGFkZEV4dGVuc2lvbigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyCi1ib29sZWFuCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSRW5jb2RhYmxlKQotCi1wdWJsaWMgdm9pZCBhZGRFeHRlbnNpb24oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllcgotYm9vbGVhbgotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvU2VjdXJpdHlFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvU2lnbmF0dXJlRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNSTCBnZW5lcmF0ZVg1MDlDUkwoCi1qYXZhLnNlY3VyaXR5LlByaXZhdGVLZXkpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvTm9TdWNoUHJvdmlkZXJFeGNlcHRpb247TGphdmEvbGFuZy9TZWN1cml0eUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9TaWduYXR1cmVFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q1JMIGdlbmVyYXRlWDUwOUNSTCgKLWphdmEuc2VjdXJpdHkuUHJpdmF0ZUtleQotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9Ob1N1Y2hQcm92aWRlckV4Y2VwdGlvbjtMamF2YS9sYW5nL1NlY3VyaXR5RXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L1NpZ25hdHVyZUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDUkwgZ2VuZXJhdGVYNTA5Q1JMKAotamF2YS5zZWN1cml0eS5Qcml2YXRlS2V5Ci1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL1NlY3VyaXR5RXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L1NpZ25hdHVyZUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDUkwgZ2VuZXJhdGVYNTA5Q1JMKAotamF2YS5zZWN1cml0eS5Qcml2YXRlS2V5Ci1qYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSkKLQotcHVibGljIHZvaWQgcmVzZXQoKQotCi1wdWJsaWMgdm9pZCBzZXRJc3N1ZXJETigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5Llg1MDlOYW1lKQotCi1wdWJsaWMgdm9pZCBzZXROZXh0VXBkYXRlKAotamF2YS51dGlsLkRhdGUpCi0KLXB1YmxpYyB2b2lkIHNldFNpZ25hdHVyZUFsZ29yaXRobSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHNldFRoaXNVcGRhdGUoCi1qYXZhLnV0aWwuRGF0ZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5YNTA5VjNDZXJ0aWZpY2F0ZUdlbmVyYXRvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLkhhc2h0YWJsZSBhbGdvcml0aG1zCi0KLXByaXZhdGUgamF2YS51dGlsLlZlY3RvciBleHRPcmRlcmluZwotCi1wcml2YXRlIGphdmEudXRpbC5IYXNodGFibGUgZXh0ZW5zaW9ucwotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIgc2lnQWxnSWQKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBzaWdPSUQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHNpZ25hdHVyZUFsZ29yaXRobQotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LlYzVEJTQ2VydGlmaWNhdGVHZW5lcmF0b3IgdGJzR2VuCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCBhZGRFeHRlbnNpb24oCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSRW5jb2RhYmxlKQotCi1wdWJsaWMgdm9pZCBhZGRFeHRlbnNpb24oCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuCi1ieXRlW10pCi0KLXB1YmxpYyB2b2lkIGFkZEV4dGVuc2lvbigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyCi1ib29sZWFuCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSRW5jb2RhYmxlKQotCi1wdWJsaWMgdm9pZCBhZGRFeHRlbnNpb24oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllcgotYm9vbGVhbgotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvU2VjdXJpdHlFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvU2lnbmF0dXJlRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlIGdlbmVyYXRlWDUwOUNlcnRpZmljYXRlKAotamF2YS5zZWN1cml0eS5Qcml2YXRlS2V5KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L05vU3VjaFByb3ZpZGVyRXhjZXB0aW9uO0xqYXZhL2xhbmcvU2VjdXJpdHlFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvU2lnbmF0dXJlRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlIGdlbmVyYXRlWDUwOUNlcnRpZmljYXRlKAotamF2YS5zZWN1cml0eS5Qcml2YXRlS2V5Ci1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L05vU3VjaFByb3ZpZGVyRXhjZXB0aW9uO0xqYXZhL2xhbmcvU2VjdXJpdHlFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvU2lnbmF0dXJlRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlIGdlbmVyYXRlWDUwOUNlcnRpZmljYXRlKAotamF2YS5zZWN1cml0eS5Qcml2YXRlS2V5Ci1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL1NlY3VyaXR5RXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L1NpZ25hdHVyZUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZSBnZW5lcmF0ZVg1MDlDZXJ0aWZpY2F0ZSgKLWphdmEuc2VjdXJpdHkuUHJpdmF0ZUtleQotamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20pCi0KLXB1YmxpYyB2b2lkIHJlc2V0KCkKLQotcHVibGljIHZvaWQgc2V0SXNzdWVyRE4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5YNTA5TmFtZSkKLQotcHVibGljIHZvaWQgc2V0Tm90QWZ0ZXIoCi1qYXZhLnV0aWwuRGF0ZSkKLQotcHVibGljIHZvaWQgc2V0Tm90QmVmb3JlKAotamF2YS51dGlsLkRhdGUpCi0KLXB1YmxpYyB2b2lkIHNldFB1YmxpY0tleSgKLWphdmEuc2VjdXJpdHkuUHVibGljS2V5KQotCi1wdWJsaWMgdm9pZCBzZXRTZXJpYWxOdW1iZXIoCi1qYXZhLm1hdGguQmlnSW50ZWdlcikKLQotcHVibGljIHZvaWQgc2V0U2lnbmF0dXJlQWxnb3JpdGhtKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0U3ViamVjdEROKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuWDUwOU5hbWUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLmludGVyZmFjZXMuQkNLZXlTdG9yZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRSYW5kb20oCi1qYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UuaW50ZXJmYWNlcy5JRVNLZXkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5LZXkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zZWN1cml0eS5Qcml2YXRlS2V5IGdldFByaXZhdGUoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5zZWN1cml0eS5QdWJsaWNLZXkgZ2V0UHVibGljKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UuaW50ZXJmYWNlcy5QS0NTMTJCYWdBdHRyaWJ1dGVDYXJyaWVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSRW5jb2RhYmxlIGdldEJhZ0F0dHJpYnV0ZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLkVudW1lcmF0aW9uIGdldEJhZ0F0dHJpYnV0ZUtleXMoKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRCYWdBdHRyaWJ1dGUoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllcgotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkVuY29kYWJsZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5uZXRzY2FwZS5OZXRzY2FwZUNlcnRSZXF1ZXN0IGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFFbmNvZGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGphdmEubGFuZy5TdHJpbmcgY2hhbGxlbmdlCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSQml0U3RyaW5nIGNvbnRlbnQKLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIga2V5QWxnCi0KLSBqYXZhLnNlY3VyaXR5LlB1YmxpY0tleSBwdWJrZXkKLQotIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIgc2lnQWxnCi0KLSBieXRlW10gc2lnQml0cwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L3NwZWMvSW52YWxpZEtleVNwZWNFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvTm9TdWNoUHJvdmlkZXJFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIKLWphdmEuc2VjdXJpdHkuUHVibGljS2V5KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L3NwZWMvSW52YWxpZEtleVNwZWNFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvTm9TdWNoUHJvdmlkZXJFeGNlcHRpb247ICkKLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCBnZXRLZXlTcGVjKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSBnZXRSZXEoCi1ieXRlW10pCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldENoYWxsZW5nZSgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyIGdldEtleUFsZ29yaXRobSgpCi0KLXB1YmxpYyBqYXZhLnNlY3VyaXR5LlB1YmxpY0tleSBnZXRQdWJsaWNLZXkoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllciBnZXRTaWduaW5nQWxnb3JpdGhtKCkKLQotcHVibGljIHZvaWQgc2V0Q2hhbGxlbmdlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0S2V5QWxnb3JpdGhtKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllcikKLQotcHVibGljIHZvaWQgc2V0UHVibGljS2V5KAotamF2YS5zZWN1cml0eS5QdWJsaWNLZXkpCi0KLXB1YmxpYyB2b2lkIHNldFNpZ25pbmdBbGdvcml0aG0oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L1NpZ25hdHVyZUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9Ob1N1Y2hQcm92aWRlckV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9zcGVjL0ludmFsaWRLZXlTcGVjRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzaWduKAotamF2YS5zZWN1cml0eS5Qcml2YXRlS2V5KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L1NpZ25hdHVyZUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9Ob1N1Y2hQcm92aWRlckV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9zcGVjL0ludmFsaWRLZXlTcGVjRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzaWduKAotamF2YS5zZWN1cml0eS5Qcml2YXRlS2V5Ci1qYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3QgdG9BU04xT2JqZWN0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9TaWduYXR1cmVFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvTm9TdWNoUHJvdmlkZXJFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIHZlcmlmeSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuQW5ub3RhdGVkRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLkV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEubGFuZy5FeGNlcHRpb24gX3VuZGVybHlpbmdFeGNlcHRpb24KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuRXhjZXB0aW9uKQotCi1wdWJsaWMgamF2YS5sYW5nLlRocm93YWJsZSBnZXRDYXVzZSgpCi0KLSBqYXZhLmxhbmcuRXhjZXB0aW9uIGdldFVuZGVybHlpbmdFeGNlcHRpb24oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkJvdW5jeUNhc3RsZVByb3ZpZGVyIGV4dGVuZHMgamF2YS5zZWN1cml0eS5Qcm92aWRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgUFJPVklERVJfTkFNRQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGluZm8KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgdm9pZCBhZGRITUFDQWxnb3JpdGhtKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSB2b2lkIGFkZEhNQUNBbGlhcygKLWphdmEubGFuZy5TdHJpbmcKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyKQotCi1wcml2YXRlIHZvaWQgYWRkTWFjQWxnb3JpdGhtcygpCi0KLXByaXZhdGUgdm9pZCBhZGRNZXNzYWdlRGlnZXN0QWxnb3JpdGhtcygpCi0KLXByaXZhdGUgdm9pZCBhZGRTaWduYXR1cmVBbGdvcml0aG0oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllcikKLQotcHJpdmF0ZSB2b2lkIGFkZFNpZ25hdHVyZUFsZ29yaXRobXMoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0Jyb2tlblBCRSRVdGlsOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkJyb2tlblBCRSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUQ1Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9MRF9QS0NTMTIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEtDUzEyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBLQ1M1UzEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEtDUzVTMgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSVBFTUQxNjAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hBMQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvQnJva2VuSkNFQmxvY2tDaXBoZXIkQnJva2VQQkVXaXRoU0hBQW5kREVTMktleTtMb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvQnJva2VuSkNFQmxvY2tDaXBoZXIkT2xkUEJFV2l0aFNIQUFuZERFUzNLZXk7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0Jyb2tlbkpDRUJsb2NrQ2lwaGVyJEJyb2tlUEJFV2l0aFNIQUFuZERFUzNLZXk7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0Jyb2tlbkpDRUJsb2NrQ2lwaGVyJEJyb2tlUEJFV2l0aFNIQTFBbmRERVM7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0Jyb2tlbkpDRUJsb2NrQ2lwaGVyJEJyb2tlUEJFV2l0aE1ENUFuZERFUzsgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkJyb2tlbkpDRUJsb2NrQ2lwaGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkJyb2tlblBCRQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEubGFuZy5DbGFzc1tdIGF2YWlsYWJsZVNwZWNzCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQnVmZmVyZWRCbG9ja0NpcGhlciBjaXBoZXIKLQotcHJpdmF0ZSBqYXZhLnNlY3VyaXR5LkFsZ29yaXRobVBhcmFtZXRlcnMgZW5naW5lUGFyYW1zCi0KLXByaXZhdGUgaW50IGl2TGVuZ3RoCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ucGFyYW1zLlBhcmFtZXRlcnNXaXRoSVYgaXZQYXJhbQotCi1wcml2YXRlIGludCBwYmVIYXNoCi0KLXByaXZhdGUgaW50IHBiZUl2U2l6ZQotCi1wcml2YXRlIGludCBwYmVLZXlTaXplCi0KLXByaXZhdGUgaW50IHBiZVR5cGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5CbG9ja0NpcGhlcikKLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQmxvY2tDaXBoZXIKLWludAotaW50Ci1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YXgvY3J5cHRvL0lsbGVnYWxCbG9ja1NpemVFeGNlcHRpb247TGphdmF4L2NyeXB0by9CYWRQYWRkaW5nRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgaW50IGVuZ2luZURvRmluYWwoCi1ieXRlW10KLWludAotaW50Ci1ieXRlW10KLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YXgvY3J5cHRvL0lsbGVnYWxCbG9ja1NpemVFeGNlcHRpb247TGphdmF4L2NyeXB0by9CYWRQYWRkaW5nRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgYnl0ZVtdIGVuZ2luZURvRmluYWwoCi1ieXRlW10KLWludAotaW50KQotCi1wcm90ZWN0ZWQgaW50IGVuZ2luZUdldEJsb2NrU2l6ZSgpCi0KLXByb3RlY3RlZCBieXRlW10gZW5naW5lR2V0SVYoKQotCi1wcm90ZWN0ZWQgaW50IGVuZ2luZUdldEtleVNpemUoCi1qYXZhLnNlY3VyaXR5LktleSkKLQotcHJvdGVjdGVkIGludCBlbmdpbmVHZXRPdXRwdXRTaXplKAotaW50KQotCi1wcm90ZWN0ZWQgamF2YS5zZWN1cml0eS5BbGdvcml0aG1QYXJhbWV0ZXJzIGVuZ2luZUdldFBhcmFtZXRlcnMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgZW5naW5lSW5pdCgKLWludAotamF2YS5zZWN1cml0eS5LZXkKLWphdmEuc2VjdXJpdHkuQWxnb3JpdGhtUGFyYW1ldGVycwotamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgZW5naW5lSW5pdCgKLWludAotamF2YS5zZWN1cml0eS5LZXkKLWphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgZW5naW5lSW5pdCgKLWludAotamF2YS5zZWN1cml0eS5LZXkKLWphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjCi1qYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSkKLQotcHJvdGVjdGVkIHZvaWQgZW5naW5lU2V0TW9kZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmF4L2NyeXB0by9Ob1N1Y2hQYWRkaW5nRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBlbmdpbmVTZXRQYWRkaW5nKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgamF2YS5zZWN1cml0eS5LZXkgZW5naW5lVW53cmFwKAotYnl0ZVtdCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXByb3RlY3RlZCBpbnQgZW5naW5lVXBkYXRlKAotYnl0ZVtdCi1pbnQKLWludAotYnl0ZVtdCi1pbnQpCi0KLXByb3RlY3RlZCBieXRlW10gZW5naW5lVXBkYXRlKAotYnl0ZVtdCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YXgvY3J5cHRvL0lsbGVnYWxCbG9ja1NpemVFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGJ5dGVbXSBlbmdpbmVXcmFwKAotamF2YS5zZWN1cml0eS5LZXkpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0Jyb2tlbkpDRUJsb2NrQ2lwaGVyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9QnJva2VQQkVXaXRoTUQ1QW5kREVTICkKLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5Ccm9rZW5KQ0VCbG9ja0NpcGhlciRCcm9rZVBCRVdpdGhNRDVBbmRERVMgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5Ccm9rZW5KQ0VCbG9ja0NpcGhlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0Jyb2tlbkpDRUJsb2NrQ2lwaGVyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9QnJva2VQQkVXaXRoU0hBMUFuZERFUyApCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuQnJva2VuSkNFQmxvY2tDaXBoZXIkQnJva2VQQkVXaXRoU0hBMUFuZERFUyBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkJyb2tlbkpDRUJsb2NrQ2lwaGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvQnJva2VuSkNFQmxvY2tDaXBoZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1Ccm9rZVBCRVdpdGhTSEFBbmRERVMyS2V5ICkKLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5Ccm9rZW5KQ0VCbG9ja0NpcGhlciRCcm9rZVBCRVdpdGhTSEFBbmRERVMyS2V5IGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuQnJva2VuSkNFQmxvY2tDaXBoZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1Ccm9rZVBCRVdpdGhTSEFBbmRERVMzS2V5ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9Ccm9rZW5KQ0VCbG9ja0NpcGhlcjsgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkJyb2tlbkpDRUJsb2NrQ2lwaGVyJEJyb2tlUEJFV2l0aFNIQUFuZERFUzNLZXkgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5Ccm9rZW5KQ0VCbG9ja0NpcGhlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0Jyb2tlbkpDRUJsb2NrQ2lwaGVyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9T2xkUEJFV2l0aFNIQUFuZERFUzNLZXkgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkJyb2tlbkpDRUJsb2NrQ2lwaGVyJE9sZFBCRVdpdGhTSEFBbmRERVMzS2V5IGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuQnJva2VuSkNFQmxvY2tDaXBoZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkJyb2tlbktERjJCeXRlc0dlbmVyYXRvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5EZXJpdmF0aW9uRnVuY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5EaWdlc3QgZGlnZXN0Ci0KLXByaXZhdGUgYnl0ZVtdIGl2Ci0KLXByaXZhdGUgYnl0ZVtdIHNoYXJlZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkRpZ2VzdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9jcnlwdG8vRGF0YUxlbmd0aEV4Y2VwdGlvbjtMamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZW5lcmF0ZUJ5dGVzKAotYnl0ZVtdCi1pbnQKLWludCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkRpZ2VzdCBnZXREaWdlc3QoKQotCi1wdWJsaWMgdm9pZCBpbml0KAotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uRGVyaXZhdGlvblBhcmFtZXRlcnMpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPVV0aWwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0Jyb2tlblBCRTsgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkJyb2tlblBCRSRVdGlsIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByaXZhdGUgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLlBCRVBhcmFtZXRlcnNHZW5lcmF0b3IgbWFrZVBCRUdlbmVyYXRvcigKLWludAotaW50KQotCi1zdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQ2lwaGVyUGFyYW1ldGVycyBtYWtlUEJFTWFjUGFyYW1ldGVycygKLW9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRVBCRUtleQotamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWMKLWludAotaW50Ci1pbnQpCi0KLXN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5DaXBoZXJQYXJhbWV0ZXJzIG1ha2VQQkVQYXJhbWV0ZXJzKAotb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFUEJFS2V5Ci1qYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYwotaW50Ci1pbnQKLWphdmEubGFuZy5TdHJpbmcKLWludAotaW50KQotCi1wcml2YXRlIHN0YXRpYyB2b2lkIHNldE9kZFBhcml0eSgKLWJ5dGVbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5DZXJ0UGF0aFZhbGlkYXRvclV0aWxpdGllcyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFOWV9QT0xJQ1kKLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEJBU0lDX0NPTlNUUkFJTlRTCi0KLXByb3RlY3RlZCBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDRVJUSUZJQ0FURV9QT0xJQ0lFUwotCi1wcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ1JMX05VTUJFUgotCi1wcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBDUkxfU0lHTgotCi1wcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVMVEFfQ1JMX0lORElDQVRPUgotCi1wcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSU5ISUJJVF9BTllfUE9MSUNZCi0KLXByb3RlY3RlZCBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBJU1NVSU5HX0RJU1RSSUJVVElPTl9QT0lOVAotCi1wcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBLRVlfQ0VSVF9TSUdOCi0KLXByb3RlY3RlZCBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBLRVlfVVNBR0UKLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE5BTUVfQ09OU1RSQUlOVFMKLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBPTElDWV9DT05TVFJBSU5UUwotCi1wcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUE9MSUNZX01BUFBJTkdTCi0KLXByb3RlY3RlZCBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTVUJKRUNUX0FMVEVSTkFUSVZFX05BTUUKLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gY3JsUmVhc29ucwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgc3RhdGljIHZvaWQgY2hlY2tFeGNsdWRlZEROKAotamF2YS51dGlsLlNldAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgc3RhdGljIHZvaWQgY2hlY2tFeGNsdWRlZEVtYWlsKAotamF2YS51dGlsLlNldAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgc3RhdGljIHZvaWQgY2hlY2tFeGNsdWRlZElQKAotamF2YS51dGlsLlNldAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb247ICkKLXByb3RlY3RlZCBzdGF0aWMgdm9pZCBjaGVja1Blcm1pdHRlZEROKAotamF2YS51dGlsLlNldAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgc3RhdGljIHZvaWQgY2hlY2tQZXJtaXR0ZWRFbWFpbCgKLWphdmEudXRpbC5TZXQKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvY2VydC9DZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGNoZWNrUGVybWl0dGVkSVAoCi1qYXZhLnV0aWwuU2V0Ci1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0Fubm90YXRlZEV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuQ29sbGVjdGlvbiBmaW5kQ1JMcygKLWphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q1JMU2VsZWN0b3IKLWphdmEudXRpbC5MaXN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb247ICkKLXByb3RlY3RlZCBzdGF0aWMgZmluYWwgamF2YS5zZWN1cml0eS5jZXJ0LlRydXN0QW5jaG9yIGZpbmRUcnVzdEFuY2hvcigKLWphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGUKLWphdmEuc2VjdXJpdHkuY2VydC5DZXJ0UGF0aAotaW50Ci1qYXZhLnV0aWwuU2V0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb247ICkKLXByb3RlY3RlZCBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllciBnZXRBbGdvcml0aG1JZGVudGlmaWVyKAotamF2YS5zZWN1cml0eS5QdWJsaWNLZXkpCi0KLXByb3RlY3RlZCBzdGF0aWMgamF2YXguc2VjdXJpdHkuYXV0aC54NTAwLlg1MDBQcmluY2lwYWwgZ2V0RW5jb2RlZElzc3VlclByaW5jaXBhbCgKLWphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0Fubm90YXRlZEV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IGdldEV4dGVuc2lvblZhbHVlKAotamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlFeHRlbnNpb24KLWphdmEubGFuZy5TdHJpbmcpCi0KLXByb3RlY3RlZCBzdGF0aWMgamF2YXguc2VjdXJpdHkuYXV0aC54NTAwLlg1MDBQcmluY2lwYWwgZ2V0SXNzdWVyUHJpbmNpcGFsKAotamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDUkwpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0Fubm90YXRlZEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCBnZXRPYmplY3QoCi1qYXZhLmxhbmcuU3RyaW5nCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvY2VydC9DZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuU2V0IGdldFF1YWxpZmllclNldCgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UpCi0KLXByb3RlY3RlZCBzdGF0aWMgamF2YXguc2VjdXJpdHkuYXV0aC54NTAwLlg1MDBQcmluY2lwYWwgZ2V0U3ViamVjdFByaW5jaXBhbCgKLWphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGUpCi0KLXByb3RlY3RlZCBzdGF0aWMgamF2YS51dGlsLkRhdGUgZ2V0VmFsaWREYXRlKAotamF2YS5zZWN1cml0eS5jZXJ0LlBLSVhQYXJhbWV0ZXJzKQotCi1wcm90ZWN0ZWQgc3RhdGljIGphdmEudXRpbC5TZXQgaW50ZXJzZWN0RE4oCi1qYXZhLnV0aWwuU2V0Ci1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlKQotCi1wcm90ZWN0ZWQgc3RhdGljIGphdmEudXRpbC5TZXQgaW50ZXJzZWN0RW1haWwoCi1qYXZhLnV0aWwuU2V0Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcm90ZWN0ZWQgc3RhdGljIGphdmEudXRpbC5TZXQgaW50ZXJzZWN0SVAoCi1qYXZhLnV0aWwuU2V0Ci1ieXRlW10pCi0KLXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc0FueVBvbGljeSgKLWphdmEudXRpbC5TZXQpCi0KLXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc1NlbGZJc3N1ZWQoCi1qYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9Bbm5vdGF0ZWRFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvY2VydC9DZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHByZXBhcmVOZXh0Q2VydEIxKAotaW50Ci1qYXZhLnV0aWwuTGlzdFtdCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnV0aWwuTWFwCi1qYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlKQotCi1wcm90ZWN0ZWQgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLlBLSVhQb2xpY3lOb2RlIHByZXBhcmVOZXh0Q2VydEIyKAotaW50Ci1qYXZhLnV0aWwuTGlzdFtdCi1qYXZhLmxhbmcuU3RyaW5nCi1vcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5QS0lYUG9saWN5Tm9kZSkKLQotcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIHByb2Nlc3NDZXJ0RDFpKAotaW50Ci1qYXZhLnV0aWwuTGlzdFtdCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllcgotamF2YS51dGlsLlNldCkKLQotcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHByb2Nlc3NDZXJ0RDFpaSgKLWludAotamF2YS51dGlsLkxpc3RbXQotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIKLWphdmEudXRpbC5TZXQpCi0KLXByb3RlY3RlZCBzdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuUEtJWFBvbGljeU5vZGUgcmVtb3ZlUG9saWN5Tm9kZSgKLW9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLlBLSVhQb2xpY3lOb2RlCi1qYXZhLnV0aWwuTGlzdFtdCi1vcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5QS0lYUG9saWN5Tm9kZSkKLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVQb2xpY3lOb2RlUmVjdXJzZSgKLWphdmEudXRpbC5MaXN0W10KLW9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLlBLSVhQb2xpY3lOb2RlKQotCi1wcm90ZWN0ZWQgc3RhdGljIGphdmEudXRpbC5TZXQgdW5pb25ETigKLWphdmEudXRpbC5TZXQKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UpCi0KLXByb3RlY3RlZCBzdGF0aWMgamF2YS51dGlsLlNldCB1bmlvbkVtYWlsKAotamF2YS51dGlsLlNldAotamF2YS5sYW5nLlN0cmluZykKLQotcHJvdGVjdGVkIHN0YXRpYyBqYXZhLnV0aWwuU2V0IHVuaW9uSVAoCi1qYXZhLnV0aWwuU2V0Ci1ieXRlW10pCi0KLXByaXZhdGUgc3RhdGljIGJvb2xlYW4gd2l0aGluRE5TdWJ0cmVlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZQotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFTZXF1ZW5jZSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5DZXJ0U3RvcmVDb2xsZWN0aW9uU3BpIGV4dGVuZHMgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRTdG9yZVNwaQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEuc2VjdXJpdHkuY2VydC5Db2xsZWN0aW9uQ2VydFN0b3JlUGFyYW1ldGVycyBwYXJhbXMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuc2VjdXJpdHkuY2VydC5DZXJ0U3RvcmVQYXJhbWV0ZXJzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydFN0b3JlRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS51dGlsLkNvbGxlY3Rpb24gZW5naW5lR2V0Q1JMcygKLWphdmEuc2VjdXJpdHkuY2VydC5DUkxTZWxlY3RvcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRTdG9yZUV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEudXRpbC5Db2xsZWN0aW9uIGVuZ2luZUdldENlcnRpZmljYXRlcygKLWphdmEuc2VjdXJpdHkuY2VydC5DZXJ0U2VsZWN0b3IpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuREhVdGlsIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5wYXJhbXMuQXN5bW1ldHJpY0tleVBhcmFtZXRlciBnZW5lcmF0ZVByaXZhdGVLZXlQYXJhbWV0ZXIoCi1qYXZhLnNlY3VyaXR5LlByaXZhdGVLZXkpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5wYXJhbXMuQXN5bW1ldHJpY0tleVBhcmFtZXRlciBnZW5lcmF0ZVB1YmxpY0tleVBhcmFtZXRlcigKLWphdmEuc2VjdXJpdHkuUHVibGljS2V5KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkRTQVV0aWwgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLnBhcmFtcy5Bc3ltbWV0cmljS2V5UGFyYW1ldGVyIGdlbmVyYXRlUHJpdmF0ZUtleVBhcmFtZXRlcigKLWphdmEuc2VjdXJpdHkuUHJpdmF0ZUtleSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLnBhcmFtcy5Bc3ltbWV0cmljS2V5UGFyYW1ldGVyIGdlbmVyYXRlUHVibGljS2V5UGFyYW1ldGVyKAotamF2YS5zZWN1cml0eS5QdWJsaWNLZXkpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvUEJFJFV0aWw7ICkKLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuUEJFIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRDUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BFTlNTTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQS0NTMTIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEtDUzVTMQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQS0NTNVMyCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJUEVNRDE2MAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSEExCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIQTI1NgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBUSUdFUgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvV3JhcENpcGhlclNwaSRERVNFREVXcmFwO0xvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9XcmFwQ2lwaGVyU3BpJEFFU1dyYXA7ICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5XcmFwQ2lwaGVyU3BpIGV4dGVuZHMgamF2YXguY3J5cHRvLkNpcGhlclNwaSBpbXBsZW1lbnRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLlBCRQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEubGFuZy5DbGFzc1tdIGF2YWlsYWJsZVNwZWNzCi0KLXByb3RlY3RlZCBqYXZhLnNlY3VyaXR5LkFsZ29yaXRobVBhcmFtZXRlcnMgZW5naW5lUGFyYW1zCi0KLXByb3RlY3RlZCBpbnQgcGJlSGFzaAotCi1wcm90ZWN0ZWQgaW50IHBiZUl2U2l6ZQotCi1wcm90ZWN0ZWQgaW50IHBiZUtleVNpemUKLQotcHJvdGVjdGVkIGludCBwYmVUeXBlCi0KLXByb3RlY3RlZCBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5XcmFwcGVyIHdyYXBFbmdpbmUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oKQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5XcmFwcGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZheC9jcnlwdG8vSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbjtMamF2YXgvY3J5cHRvL0JhZFBhZGRpbmdFeGNlcHRpb247ICkKLXByb3RlY3RlZCBpbnQgZW5naW5lRG9GaW5hbCgKLWJ5dGVbXQotaW50Ci1pbnQKLWJ5dGVbXQotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZheC9jcnlwdG8vSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbjtMamF2YXgvY3J5cHRvL0JhZFBhZGRpbmdFeGNlcHRpb247ICkKLXByb3RlY3RlZCBieXRlW10gZW5naW5lRG9GaW5hbCgKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLXByb3RlY3RlZCBpbnQgZW5naW5lR2V0QmxvY2tTaXplKCkKLQotcHJvdGVjdGVkIGJ5dGVbXSBlbmdpbmVHZXRJVigpCi0KLXByb3RlY3RlZCBpbnQgZW5naW5lR2V0S2V5U2l6ZSgKLWphdmEuc2VjdXJpdHkuS2V5KQotCi1wcm90ZWN0ZWQgaW50IGVuZ2luZUdldE91dHB1dFNpemUoCi1pbnQpCi0KLXByb3RlY3RlZCBqYXZhLnNlY3VyaXR5LkFsZ29yaXRobVBhcmFtZXRlcnMgZW5naW5lR2V0UGFyYW1ldGVycygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBlbmdpbmVJbml0KAotaW50Ci1qYXZhLnNlY3VyaXR5LktleQotamF2YS5zZWN1cml0eS5BbGdvcml0aG1QYXJhbWV0ZXJzCi1qYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBlbmdpbmVJbml0KAotaW50Ci1qYXZhLnNlY3VyaXR5LktleQotamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBlbmdpbmVJbml0KAotaW50Ci1qYXZhLnNlY3VyaXR5LktleQotamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWMKLWphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgZW5naW5lU2V0TW9kZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmF4L2NyeXB0by9Ob1N1Y2hQYWRkaW5nRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBlbmdpbmVTZXRQYWRkaW5nKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgamF2YS5zZWN1cml0eS5LZXkgZW5naW5lVW53cmFwKAotYnl0ZVtdCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmF4L2NyeXB0by9TaG9ydEJ1ZmZlckV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGludCBlbmdpbmVVcGRhdGUoCi1ieXRlW10KLWludAotaW50Ci1ieXRlW10KLWludCkKLQotcHJvdGVjdGVkIGJ5dGVbXSBlbmdpbmVVcGRhdGUoCi1ieXRlW10KLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZheC9jcnlwdG8vSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgYnl0ZVtdIGVuZ2luZVdyYXAoCi1qYXZhLnNlY3VyaXR5LktleSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VCbG9ja0NpcGhlciRQQkVXaXRoQUVTQ0JDO0xvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VCbG9ja0NpcGhlciRQQkVXaXRoU0hBQW5kREVTMktleTtMb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFQmxvY2tDaXBoZXIkUEJFV2l0aFNIQUFuZERFUzNLZXk7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRUJsb2NrQ2lwaGVyJFBCRVdpdGhTSEExQW5kREVTO0xvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VCbG9ja0NpcGhlciRQQkVXaXRoTUQ1QW5kREVTO0xvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VCbG9ja0NpcGhlciRBRVNPRkI7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRUJsb2NrQ2lwaGVyJEFFU0NGQjtMb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFQmxvY2tDaXBoZXIkQUVTQ0JDO0xvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VCbG9ja0NpcGhlciRBRVM7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRUJsb2NrQ2lwaGVyJERFU2VkZUNCQztMb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFQmxvY2tDaXBoZXIkREVTZWRlO0xvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VCbG9ja0NpcGhlciRERVNDQkM7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRUJsb2NrQ2lwaGVyJERFUzsgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRUJsb2NrQ2lwaGVyIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuV3JhcENpcGhlclNwaSBpbXBsZW1lbnRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLlBCRQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEubGFuZy5DbGFzc1tdIGF2YWlsYWJsZVNwZWNzCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQmxvY2tDaXBoZXIgYmFzZUVuZ2luZQotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkJ1ZmZlcmVkQmxvY2tDaXBoZXIgY2lwaGVyCi0KLXByaXZhdGUgaW50IGl2TGVuZ3RoCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ucGFyYW1zLlBhcmFtZXRlcnNXaXRoSVYgaXZQYXJhbQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbW9kZU5hbWUKLQotcHJpdmF0ZSBib29sZWFuIHBhZGRlZAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcGJlQWxnb3JpdGhtCi0KLXByaXZhdGUgamF2YXguY3J5cHRvLnNwZWMuUEJFUGFyYW1ldGVyU3BlYyBwYmVTcGVjCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQmxvY2tDaXBoZXIpCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkJsb2NrQ2lwaGVyCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmF4L2NyeXB0by9JbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uO0xqYXZheC9jcnlwdG8vQmFkUGFkZGluZ0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGludCBlbmdpbmVEb0ZpbmFsKAotYnl0ZVtdCi1pbnQKLWludAotYnl0ZVtdCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmF4L2NyeXB0by9JbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uO0xqYXZheC9jcnlwdG8vQmFkUGFkZGluZ0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGJ5dGVbXSBlbmdpbmVEb0ZpbmFsKAotYnl0ZVtdCi1pbnQKLWludCkKLQotcHJvdGVjdGVkIGludCBlbmdpbmVHZXRCbG9ja1NpemUoKQotCi1wcm90ZWN0ZWQgYnl0ZVtdIGVuZ2luZUdldElWKCkKLQotcHJvdGVjdGVkIGludCBlbmdpbmVHZXRLZXlTaXplKAotamF2YS5zZWN1cml0eS5LZXkpCi0KLXByb3RlY3RlZCBpbnQgZW5naW5lR2V0T3V0cHV0U2l6ZSgKLWludCkKLQotcHJvdGVjdGVkIGphdmEuc2VjdXJpdHkuQWxnb3JpdGhtUGFyYW1ldGVycyBlbmdpbmVHZXRQYXJhbWV0ZXJzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L0ludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIGVuZ2luZUluaXQoCi1pbnQKLWphdmEuc2VjdXJpdHkuS2V5Ci1qYXZhLnNlY3VyaXR5LkFsZ29yaXRobVBhcmFtZXRlcnMKLWphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIGVuZ2luZUluaXQoCi1pbnQKLWphdmEuc2VjdXJpdHkuS2V5Ci1qYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L0ludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIGVuZ2luZUluaXQoCi1pbnQKLWphdmEuc2VjdXJpdHkuS2V5Ci1qYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYwotamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBlbmdpbmVTZXRNb2RlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YXgvY3J5cHRvL05vU3VjaFBhZGRpbmdFeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIGVuZ2luZVNldFBhZGRpbmcoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZheC9jcnlwdG8vU2hvcnRCdWZmZXJFeGNlcHRpb247ICkKLXByb3RlY3RlZCBpbnQgZW5naW5lVXBkYXRlKAotYnl0ZVtdCi1pbnQKLWludAotYnl0ZVtdCi1pbnQpCi0KLXByb3RlY3RlZCBieXRlW10gZW5naW5lVXBkYXRlKAotYnl0ZVtdCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9QUVTICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VCbG9ja0NpcGhlcjsgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRUJsb2NrQ2lwaGVyJEFFUyBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRUJsb2NrQ2lwaGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9QUVTQ0JDICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VCbG9ja0NpcGhlcjsgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRUJsb2NrQ2lwaGVyJEFFU0NCQyBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRUJsb2NrQ2lwaGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9QUVTQ0ZCICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VCbG9ja0NpcGhlcjsgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRUJsb2NrQ2lwaGVyJEFFU0NGQiBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRUJsb2NrQ2lwaGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFQmxvY2tDaXBoZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1BRVNPRkIgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRUJsb2NrQ2lwaGVyJEFFU09GQiBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRUJsb2NrQ2lwaGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFQmxvY2tDaXBoZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1ERVMgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRUJsb2NrQ2lwaGVyJERFUyBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRUJsb2NrQ2lwaGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFQmxvY2tDaXBoZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1ERVNDQkMgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRUJsb2NrQ2lwaGVyJERFU0NCQyBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRUJsb2NrQ2lwaGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9REVTZWRlICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VCbG9ja0NpcGhlcjsgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRUJsb2NrQ2lwaGVyJERFU2VkZSBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRUJsb2NrQ2lwaGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFQmxvY2tDaXBoZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1ERVNlZGVDQkMgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRUJsb2NrQ2lwaGVyJERFU2VkZUNCQyBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRUJsb2NrQ2lwaGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9UEJFV2l0aEFFU0NCQyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFQmxvY2tDaXBoZXI7ICkKLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VCbG9ja0NpcGhlciRQQkVXaXRoQUVTQ0JDIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFQmxvY2tDaXBoZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VCbG9ja0NpcGhlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPVBCRVdpdGhNRDVBbmRERVMgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRUJsb2NrQ2lwaGVyJFBCRVdpdGhNRDVBbmRERVMgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VCbG9ja0NpcGhlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPVBCRVdpdGhTSEExQW5kREVTICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VCbG9ja0NpcGhlcjsgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRUJsb2NrQ2lwaGVyJFBCRVdpdGhTSEExQW5kREVTIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFQmxvY2tDaXBoZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VCbG9ja0NpcGhlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPVBCRVdpdGhTSEFBbmRERVMyS2V5ICkKLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VCbG9ja0NpcGhlciRQQkVXaXRoU0hBQW5kREVTMktleSBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRUJsb2NrQ2lwaGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9UEJFV2l0aFNIQUFuZERFUzNLZXkgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRUJsb2NrQ2lwaGVyOyApCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFQmxvY2tDaXBoZXIkUEJFV2l0aFNIQUFuZERFUzNLZXkgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VCbG9ja0NpcGhlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFREhLZXlBZ3JlZW1lbnQgZXh0ZW5kcyBqYXZheC5jcnlwdG8uS2V5QWdyZWVtZW50U3BpCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS5tYXRoLkJpZ0ludGVnZXIgZwotCi1wcml2YXRlIGphdmEubWF0aC5CaWdJbnRlZ2VyIHAKLQotcHJpdmF0ZSBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSByYW5kb20KLQotcHJpdmF0ZSBqYXZhLm1hdGguQmlnSW50ZWdlciByZXN1bHQKLQotcHJpdmF0ZSBqYXZhLm1hdGguQmlnSW50ZWdlciB4Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSBieXRlW10gYmlnSW50VG9CeXRlcygKLWphdmEubWF0aC5CaWdJbnRlZ2VyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247ICkKLXByb3RlY3RlZCBqYXZhLnNlY3VyaXR5LktleSBlbmdpbmVEb1BoYXNlKAotamF2YS5zZWN1cml0eS5LZXkKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247TGphdmF4L2NyeXB0by9TaG9ydEJ1ZmZlckV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGludCBlbmdpbmVHZW5lcmF0ZVNlY3JldCgKLWJ5dGVbXQotaW50KQotCi1wcm90ZWN0ZWQgamF2YXguY3J5cHRvLlNlY3JldEtleSBlbmdpbmVHZW5lcmF0ZVNlY3JldCgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247ICkKLXByb3RlY3RlZCBieXRlW10gZW5naW5lR2VuZXJhdGVTZWNyZXQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIGVuZ2luZUluaXQoCi1qYXZhLnNlY3VyaXR5LktleQotamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBlbmdpbmVJbml0KAotamF2YS5zZWN1cml0eS5LZXkKLWphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjCi1qYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VESFByaXZhdGVLZXkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YXguY3J5cHRvLmludGVyZmFjZXMuREhQcml2YXRlS2V5LCBvcmcuYm91bmN5Y2FzdGxlLmpjZS5pbnRlcmZhY2VzLlBLQ1MxMkJhZ0F0dHJpYnV0ZUNhcnJpZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGphdmF4LmNyeXB0by5zcGVjLkRIUGFyYW1ldGVyU3BlYyBkaFNwZWMKLQotcHJpdmF0ZSBqYXZhLnV0aWwuSGFzaHRhYmxlIHBrY3MxMkF0dHJpYnV0ZXMKLQotcHJpdmF0ZSBqYXZhLnV0aWwuVmVjdG9yIHBrY3MxMk9yZGVyaW5nCi0KLSBqYXZhLm1hdGguQmlnSW50ZWdlciB4Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KAotamF2YXguY3J5cHRvLmludGVyZmFjZXMuREhQcml2YXRlS2V5KQotCi0gdm9pZCA8aW5pdD4oCi1qYXZheC5jcnlwdG8uc3BlYy5ESFByaXZhdGVLZXlTcGVjKQotCi0gdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEucGtjcy5Qcml2YXRlS2V5SW5mbykKLQotIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ucGFyYW1zLkRIUHJpdmF0ZUtleVBhcmFtZXRlcnMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgcmVhZE9iamVjdCgKLWphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCB3cml0ZU9iamVjdCgKLWphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRBbGdvcml0aG0oKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUkVuY29kYWJsZSBnZXRCYWdBdHRyaWJ1dGUoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllcikKLQotcHVibGljIGphdmEudXRpbC5FbnVtZXJhdGlvbiBnZXRCYWdBdHRyaWJ1dGVLZXlzKCkKLQotcHVibGljIGJ5dGVbXSBnZXRFbmNvZGVkKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Rm9ybWF0KCkKLQotcHVibGljIGphdmF4LmNyeXB0by5zcGVjLkRIUGFyYW1ldGVyU3BlYyBnZXRQYXJhbXMoKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgZ2V0WCgpCi0KLXB1YmxpYyB2b2lkIHNldEJhZ0F0dHJpYnV0ZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSRW5jb2RhYmxlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRURIUHVibGljS2V5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmF4LmNyeXB0by5pbnRlcmZhY2VzLkRIUHVibGljS2V5Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YXguY3J5cHRvLnNwZWMuREhQYXJhbWV0ZXJTcGVjIGRoU3BlYwotCi1wcml2YXRlIGphdmEubWF0aC5CaWdJbnRlZ2VyIHkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLm1hdGguQmlnSW50ZWdlcgotamF2YXguY3J5cHRvLnNwZWMuREhQYXJhbWV0ZXJTcGVjKQotCi0gdm9pZCA8aW5pdD4oCi1qYXZheC5jcnlwdG8uaW50ZXJmYWNlcy5ESFB1YmxpY0tleSkKLQotIHZvaWQgPGluaXQ+KAotamF2YXguY3J5cHRvLnNwZWMuREhQdWJsaWNLZXlTcGVjKQotCi0gdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5TdWJqZWN0UHVibGljS2V5SW5mbykKLQotIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ucGFyYW1zLkRIUHVibGljS2V5UGFyYW1ldGVycykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9sYW5nL0NsYXNzTm90Rm91bmRFeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCByZWFkT2JqZWN0KAotamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KAotamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0pCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEFsZ29yaXRobSgpCi0KLXB1YmxpYyBieXRlW10gZ2V0RW5jb2RlZCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEZvcm1hdCgpCi0KLXB1YmxpYyBqYXZheC5jcnlwdG8uc3BlYy5ESFBhcmFtZXRlclNwZWMgZ2V0UGFyYW1zKCkKLQotcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldFkoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRURpZ2VzdFV0aWwgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGphdmEudXRpbC5TZXQgbWQ1Ci0KLXByaXZhdGUgc3RhdGljIGphdmEudXRpbC5NYXAgb2lkcwotCi1wcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuU2V0IHNoYTEKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLlNldCBzaGEyMjQKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLlNldCBzaGEyNTYKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLlNldCBzaGEzODQKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLlNldCBzaGE1MTIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLSB2b2lkIDxpbml0PigpCi0KLXN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5EaWdlc3QgZ2V0RGlnZXN0KAotamF2YS5sYW5nLlN0cmluZykKLQotc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGdldE9JRCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXN0YXRpYyBib29sZWFuIGlzU2FtZURpZ2VzdCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFSUVTQ2lwaGVyJElFUztMb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFSUVTQ2lwaGVyJEJyb2tlbklFUzsgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRUlFU0NpcGhlciBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLldyYXBDaXBoZXJTcGkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLmxhbmcuQ2xhc3NbXSBhdmFpbGFibGVTcGVjcwotCi1wcml2YXRlIGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ1ZmZlcgotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLmVuZ2luZXMuSUVTRW5naW5lIGNpcGhlcgotCi1wcml2YXRlIGphdmEuc2VjdXJpdHkuQWxnb3JpdGhtUGFyYW1ldGVycyBlbmdpbmVQYXJhbQotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuamNlLnNwZWMuSUVTUGFyYW1ldGVyU3BlYyBlbmdpbmVQYXJhbXMKLQotcHJpdmF0ZSBpbnQgc3RhdGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5lbmdpbmVzLklFU0VuZ2luZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YXgvY3J5cHRvL0lsbGVnYWxCbG9ja1NpemVFeGNlcHRpb247TGphdmF4L2NyeXB0by9CYWRQYWRkaW5nRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgaW50IGVuZ2luZURvRmluYWwoCi1ieXRlW10KLWludAotaW50Ci1ieXRlW10KLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YXgvY3J5cHRvL0lsbGVnYWxCbG9ja1NpemVFeGNlcHRpb247TGphdmF4L2NyeXB0by9CYWRQYWRkaW5nRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgYnl0ZVtdIGVuZ2luZURvRmluYWwoCi1ieXRlW10KLWludAotaW50KQotCi1wcm90ZWN0ZWQgaW50IGVuZ2luZUdldEJsb2NrU2l6ZSgpCi0KLXByb3RlY3RlZCBieXRlW10gZW5naW5lR2V0SVYoKQotCi1wcm90ZWN0ZWQgaW50IGVuZ2luZUdldEtleVNpemUoCi1qYXZhLnNlY3VyaXR5LktleSkKLQotcHJvdGVjdGVkIGludCBlbmdpbmVHZXRPdXRwdXRTaXplKAotaW50KQotCi1wcm90ZWN0ZWQgamF2YS5zZWN1cml0eS5BbGdvcml0aG1QYXJhbWV0ZXJzIGVuZ2luZUdldFBhcmFtZXRlcnMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgZW5naW5lSW5pdCgKLWludAotamF2YS5zZWN1cml0eS5LZXkKLWphdmEuc2VjdXJpdHkuQWxnb3JpdGhtUGFyYW1ldGVycwotamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgZW5naW5lSW5pdCgKLWludAotamF2YS5zZWN1cml0eS5LZXkKLWphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgZW5naW5lSW5pdCgKLWludAotamF2YS5zZWN1cml0eS5LZXkKLWphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjCi1qYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSkKLQotcHJvdGVjdGVkIHZvaWQgZW5naW5lU2V0TW9kZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmF4L2NyeXB0by9Ob1N1Y2hQYWRkaW5nRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBlbmdpbmVTZXRQYWRkaW5nKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJvdGVjdGVkIGludCBlbmdpbmVVcGRhdGUoCi1ieXRlW10KLWludAotaW50Ci1ieXRlW10KLWludCkKLQotcHJvdGVjdGVkIGJ5dGVbXSBlbmdpbmVVcGRhdGUoCi1ieXRlW10KLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1Ccm9rZW5JRVMgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRUlFU0NpcGhlcjsgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRUlFU0NpcGhlciRCcm9rZW5JRVMgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VJRVNDaXBoZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1JRVMgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRUlFU0NpcGhlcjsgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRUlFU0NpcGhlciRJRVMgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VJRVNDaXBoZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRUtleUdlbmVyYXRvciRITUFDVElHRVI7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRUtleUdlbmVyYXRvciRITUFDU0hBNTEyO0xvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VLZXlHZW5lcmF0b3IkSE1BQ1NIQTM4NDtMb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFS2V5R2VuZXJhdG9yJEhNQUNTSEEyNTY7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRUtleUdlbmVyYXRvciRITUFDU0hBMjI0O0xvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VLZXlHZW5lcmF0b3IkSE1BQ1NIQTE7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRUtleUdlbmVyYXRvciRSSVBFTUQxNjBITUFDO0xvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VLZXlHZW5lcmF0b3IkUklQRU1EMTI4SE1BQztMb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFS2V5R2VuZXJhdG9yJE1ENUhNQUM7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRUtleUdlbmVyYXRvciRNRDRITUFDO0xvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VLZXlHZW5lcmF0b3IkTUQySE1BQztMb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFS2V5R2VuZXJhdG9yJElERUE7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRUtleUdlbmVyYXRvciRDQVNUNjtMb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFS2V5R2VuZXJhdG9yJENBU1Q1O0xvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VLZXlHZW5lcmF0b3IkQ2FtZWxsaWE7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRUtleUdlbmVyYXRvciRTZXJwZW50O0xvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VLZXlHZW5lcmF0b3IkUmlqbmRhZWw7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRUtleUdlbmVyYXRvciRHT1NUMjgxNDc7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRUtleUdlbmVyYXRvciRBRVMyNTY7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRUtleUdlbmVyYXRvciRBRVMxOTI7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRUtleUdlbmVyYXRvciRBRVMxMjg7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRUtleUdlbmVyYXRvciRBRVM7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRUtleUdlbmVyYXRvciRSQzY7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRUtleUdlbmVyYXRvciRSQzU2NDtMb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFS2V5R2VuZXJhdG9yJFJDNTtMb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFS2V5R2VuZXJhdG9yJFJDNDtMb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFS2V5R2VuZXJhdG9yJFJDMjtMb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFS2V5R2VuZXJhdG9yJFR3b2Zpc2g7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRUtleUdlbmVyYXRvciRCbG93ZmlzaDtMb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFS2V5R2VuZXJhdG9yJFNraXBqYWNrO0xvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VLZXlHZW5lcmF0b3IkREVTZWRlMztMb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFS2V5R2VuZXJhdG9yJERFU2VkZTtMb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFS2V5R2VuZXJhdG9yJERFUzsgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRUtleUdlbmVyYXRvciBleHRlbmRzIGphdmF4LmNyeXB0by5LZXlHZW5lcmF0b3JTcGkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgYWxnTmFtZQotCi1wcm90ZWN0ZWQgaW50IGRlZmF1bHRLZXlTaXplCi0KLXByb3RlY3RlZCBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5DaXBoZXJLZXlHZW5lcmF0b3IgZW5naW5lCi0KLXByb3RlY3RlZCBpbnQga2V5U2l6ZQotCi1wcm90ZWN0ZWQgYm9vbGVhbiB1bmluaXRpYWxpc2VkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5DaXBoZXJLZXlHZW5lcmF0b3IpCi0KLXByb3RlY3RlZCBqYXZheC5jcnlwdG8uU2VjcmV0S2V5IGVuZ2luZUdlbmVyYXRlS2V5KCkKLQotcHJvdGVjdGVkIHZvaWQgZW5naW5lSW5pdCgKLWludAotamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20pCi0KLXByb3RlY3RlZCB2b2lkIGVuZ2luZUluaXQoCi1qYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBlbmdpbmVJbml0KAotamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWMKLWphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VLZXlHZW5lcmF0b3I7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1BRVMxMjggKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRUtleUdlbmVyYXRvciRBRVMxMjggZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VLZXlHZW5lcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VLZXlHZW5lcmF0b3I7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1BRVMxOTIgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRUtleUdlbmVyYXRvciRBRVMxOTIgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VLZXlHZW5lcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1BRVMyNTYgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRUtleUdlbmVyYXRvcjsgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRUtleUdlbmVyYXRvciRBRVMyNTYgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VLZXlHZW5lcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VLZXlHZW5lcmF0b3I7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1BRVMgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRUtleUdlbmVyYXRvciRBRVMgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VLZXlHZW5lcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VLZXlHZW5lcmF0b3I7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1CbG93ZmlzaCApCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFS2V5R2VuZXJhdG9yJEJsb3dmaXNoIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFS2V5R2VuZXJhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9Q0FTVDUgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRUtleUdlbmVyYXRvcjsgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRUtleUdlbmVyYXRvciRDQVNUNSBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRUtleUdlbmVyYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPUNBU1Q2ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VLZXlHZW5lcmF0b3I7ICkKLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VLZXlHZW5lcmF0b3IkQ0FTVDYgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VLZXlHZW5lcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VLZXlHZW5lcmF0b3I7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1DYW1lbGxpYSApCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFS2V5R2VuZXJhdG9yJENhbWVsbGlhIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFS2V5R2VuZXJhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9REVTICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VLZXlHZW5lcmF0b3I7ICkKLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VLZXlHZW5lcmF0b3IkREVTIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFS2V5R2VuZXJhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9REVTZWRlMyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFS2V5R2VuZXJhdG9yOyApCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFS2V5R2VuZXJhdG9yJERFU2VkZTMgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VLZXlHZW5lcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBib29sZWFuIGtleVNpemVTZXQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcm90ZWN0ZWQgamF2YXguY3J5cHRvLlNlY3JldEtleSBlbmdpbmVHZW5lcmF0ZUtleSgpCi0KLXByb3RlY3RlZCB2b2lkIGVuZ2luZUluaXQoCi1pbnQKLWphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1ERVNlZGUgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRUtleUdlbmVyYXRvcjsgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRUtleUdlbmVyYXRvciRERVNlZGUgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VLZXlHZW5lcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBib29sZWFuIGtleVNpemVTZXQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcm90ZWN0ZWQgamF2YXguY3J5cHRvLlNlY3JldEtleSBlbmdpbmVHZW5lcmF0ZUtleSgpCi0KLXByb3RlY3RlZCB2b2lkIGVuZ2luZUluaXQoCi1pbnQKLWphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1HT1NUMjgxNDcgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRUtleUdlbmVyYXRvcjsgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRUtleUdlbmVyYXRvciRHT1NUMjgxNDcgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VLZXlHZW5lcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1ITUFDU0hBMSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFS2V5R2VuZXJhdG9yOyApCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFS2V5R2VuZXJhdG9yJEhNQUNTSEExIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFS2V5R2VuZXJhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFS2V5R2VuZXJhdG9yOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9SE1BQ1NIQTIyNCApCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFS2V5R2VuZXJhdG9yJEhNQUNTSEEyMjQgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VLZXlHZW5lcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1ITUFDU0hBMjU2ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VLZXlHZW5lcmF0b3I7ICkKLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VLZXlHZW5lcmF0b3IkSE1BQ1NIQTI1NiBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRUtleUdlbmVyYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPUhNQUNTSEEzODQgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRUtleUdlbmVyYXRvcjsgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRUtleUdlbmVyYXRvciRITUFDU0hBMzg0IGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFS2V5R2VuZXJhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFS2V5R2VuZXJhdG9yOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9SE1BQ1NIQTUxMiApCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFS2V5R2VuZXJhdG9yJEhNQUNTSEE1MTIgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VLZXlHZW5lcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VLZXlHZW5lcmF0b3I7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1ITUFDVElHRVIgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRUtleUdlbmVyYXRvciRITUFDVElHRVIgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VLZXlHZW5lcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1JREVBICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VLZXlHZW5lcmF0b3I7ICkKLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VLZXlHZW5lcmF0b3IkSURFQSBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRUtleUdlbmVyYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPU1EMkhNQUMgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRUtleUdlbmVyYXRvcjsgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRUtleUdlbmVyYXRvciRNRDJITUFDIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFS2V5R2VuZXJhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFS2V5R2VuZXJhdG9yOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9TUQ0SE1BQyApCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFS2V5R2VuZXJhdG9yJE1ENEhNQUMgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VLZXlHZW5lcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1NRDVITUFDICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VLZXlHZW5lcmF0b3I7ICkKLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VLZXlHZW5lcmF0b3IkTUQ1SE1BQyBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRUtleUdlbmVyYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRUtleUdlbmVyYXRvcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPVJDMiApCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFS2V5R2VuZXJhdG9yJFJDMiBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRUtleUdlbmVyYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPVJDNCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFS2V5R2VuZXJhdG9yOyApCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFS2V5R2VuZXJhdG9yJFJDNCBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRUtleUdlbmVyYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRUtleUdlbmVyYXRvcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPVJDNTY0ICkKLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VLZXlHZW5lcmF0b3IkUkM1NjQgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VLZXlHZW5lcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VLZXlHZW5lcmF0b3I7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1SQzUgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRUtleUdlbmVyYXRvciRSQzUgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VLZXlHZW5lcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VLZXlHZW5lcmF0b3I7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1SQzYgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRUtleUdlbmVyYXRvciRSQzYgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VLZXlHZW5lcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VLZXlHZW5lcmF0b3I7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1SSVBFTUQxMjhITUFDICkKLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VLZXlHZW5lcmF0b3IkUklQRU1EMTI4SE1BQyBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRUtleUdlbmVyYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPVJJUEVNRDE2MEhNQUMgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRUtleUdlbmVyYXRvcjsgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRUtleUdlbmVyYXRvciRSSVBFTUQxNjBITUFDIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFS2V5R2VuZXJhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9UmlqbmRhZWwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRUtleUdlbmVyYXRvcjsgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRUtleUdlbmVyYXRvciRSaWpuZGFlbCBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRUtleUdlbmVyYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRUtleUdlbmVyYXRvcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPVNlcnBlbnQgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRUtleUdlbmVyYXRvciRTZXJwZW50IGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFS2V5R2VuZXJhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9U2tpcGphY2sgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRUtleUdlbmVyYXRvcjsgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRUtleUdlbmVyYXRvciRTa2lwamFjayBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRUtleUdlbmVyYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPVR3b2Zpc2ggKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRUtleUdlbmVyYXRvcjsgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRUtleUdlbmVyYXRvciRUd29maXNoIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFS2V5R2VuZXJhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VNYWMkUEJFV2l0aFNIQTtMb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFTWFjJE9sZFNIQTUxMjtMb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFTWFjJFNIQTUxMjtMb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFTWFjJE9sZFNIQTM4NDtMb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFTWFjJFNIQTM4NDtMb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFTWFjJFNIQTI1NjtMb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFTWFjJFNIQTIyNDtMb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFTWFjJFNIQTE7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRU1hYyRNRDU7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRU1hYyRERVM5Nzk3QWxnMztMb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFTWFjJERFU2VkZTY0O0xvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VNYWMkREVTZWRlQ0ZCODtMb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFTWFjJERFU0NGQjg7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRU1hYyRERVNlZGU7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRU1hYyRERVM7ICkKLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VNYWMgZXh0ZW5kcyBqYXZheC5jcnlwdG8uTWFjU3BpIGltcGxlbWVudHMgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuUEJFCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgaW50IGtleVNpemUKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5NYWMgbWFjRW5naW5lCi0KLXByaXZhdGUgaW50IHBiZUhhc2gKLQotcHJpdmF0ZSBpbnQgcGJlVHlwZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLk1hYykKLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uTWFjCi1pbnQKLWludAotaW50KQotCi1wcm90ZWN0ZWQgYnl0ZVtdIGVuZ2luZURvRmluYWwoKQotCi1wcm90ZWN0ZWQgaW50IGVuZ2luZUdldE1hY0xlbmd0aCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBlbmdpbmVJbml0KAotamF2YS5zZWN1cml0eS5LZXkKLWphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjKQotCi1wcm90ZWN0ZWQgdm9pZCBlbmdpbmVSZXNldCgpCi0KLXByb3RlY3RlZCB2b2lkIGVuZ2luZVVwZGF0ZSgKLWJ5dGUpCi0KLXByb3RlY3RlZCB2b2lkIGVuZ2luZVVwZGF0ZSgKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPURFUzk3OTdBbGczICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VNYWM7ICkKLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VNYWMkREVTOTc5N0FsZzMgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VNYWMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VNYWM7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1ERVMgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRU1hYyRERVMgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VNYWMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1ERVNDRkI4ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VNYWM7ICkKLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VNYWMkREVTQ0ZCOCBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRU1hYwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRU1hYzsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPURFU2VkZTY0ICkKLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VNYWMkREVTZWRlNjQgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VNYWMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VNYWM7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1ERVNlZGUgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRU1hYyRERVNlZGUgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VNYWMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VNYWM7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1ERVNlZGVDRkI4ICkKLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VNYWMkREVTZWRlQ0ZCOCBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRU1hYwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPU1ENSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFTWFjOyApCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFTWFjJE1ENSBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRU1hYwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPU9sZFNIQTM4NCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFTWFjOyApCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFTWFjJE9sZFNIQTM4NCBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRU1hYwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPU9sZFNIQTUxMiApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFTWFjOyApCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFTWFjJE9sZFNIQTUxMiBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRU1hYwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRU1hYzsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPVBCRVdpdGhTSEEgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRU1hYyRQQkVXaXRoU0hBIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFTWFjCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFTWFjOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9U0hBMSApCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFTWFjJFNIQTEgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VNYWMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1TSEEyMjQgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRU1hYzsgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRU1hYyRTSEEyMjQgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VNYWMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VNYWM7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1TSEEyNTYgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRU1hYyRTSEEyNTYgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VNYWMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VNYWM7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1TSEEzODQgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRU1hYyRTSEEzODQgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VNYWMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VNYWM7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1TSEE1MTIgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRU1hYyRTSEE1MTIgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VNYWMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRVBCRUtleSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZheC5jcnlwdG8uaW50ZXJmYWNlcy5QQkVLZXkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGphdmEubGFuZy5TdHJpbmcgYWxnb3JpdGhtCi0KLSBpbnQgZGlnZXN0Ci0KLSBpbnQgaXZTaXplCi0KLSBpbnQga2V5U2l6ZQotCi0gb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgb2lkCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5DaXBoZXJQYXJhbWV0ZXJzIHBhcmFtCi0KLSBqYXZheC5jcnlwdG8uc3BlYy5QQkVLZXlTcGVjIHBiZUtleVNwZWMKLQotIGJvb2xlYW4gdHJ5V3JvbmcKLQotIGludCB0eXBlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIKLWludAotaW50Ci1pbnQKLWludAotamF2YXguY3J5cHRvLnNwZWMuUEJFS2V5U3BlYwotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQ2lwaGVyUGFyYW1ldGVycykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QWxnb3JpdGhtKCkKLQotIGludCBnZXREaWdlc3QoKQotCi1wdWJsaWMgYnl0ZVtdIGdldEVuY29kZWQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRGb3JtYXQoKQotCi1wdWJsaWMgaW50IGdldEl0ZXJhdGlvbkNvdW50KCkKLQotIGludCBnZXRJdlNpemUoKQotCi0gaW50IGdldEtleVNpemUoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgZ2V0T0lEKCkKLQotIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkNpcGhlclBhcmFtZXRlcnMgZ2V0UGFyYW0oKQotCi1wdWJsaWMgY2hhcltdIGdldFBhc3N3b3JkKCkKLQotcHVibGljIGJ5dGVbXSBnZXRTYWx0KCkKLQotIGludCBnZXRUeXBlKCkKLQotIHZvaWQgc2V0VHJ5V3JvbmdQS0NTMTJaZXJvKAotYm9vbGVhbikKLQotIGJvb2xlYW4gc2hvdWxkVHJ5V3JvbmdQS0NTMTIoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRVJTQUNpcGhlciRJU085Nzk2ZDFQYWRkaW5nO0xvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VSU0FDaXBoZXIkT0FFUFBhZGRpbmc7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRVJTQUNpcGhlciRQS0NTMXYxXzVQYWRkaW5nX1B1YmxpY09ubHk7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRVJTQUNpcGhlciRQS0NTMXYxXzVQYWRkaW5nX1ByaXZhdGVPbmx5O0xvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VSU0FDaXBoZXIkUEtDUzF2MV81UGFkZGluZztMb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFUlNBQ2lwaGVyJE5vUGFkZGluZzsgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRVJTQUNpcGhlciBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLldyYXBDaXBoZXJTcGkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSBiT3V0Ci0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQXN5bW1ldHJpY0Jsb2NrQ2lwaGVyIGNpcGhlcgotCi1wcml2YXRlIGphdmEuc2VjdXJpdHkuQWxnb3JpdGhtUGFyYW1ldGVycyBlbmdpbmVQYXJhbXMKLQotcHJpdmF0ZSBqYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYyBwYXJhbVNwZWMKLQotcHJpdmF0ZSBib29sZWFuIHByaXZhdGVLZXlPbmx5Ci0KLXByaXZhdGUgYm9vbGVhbiBwdWJsaWNLZXlPbmx5Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YXguY3J5cHRvLnNwZWMuT0FFUFBhcmFtZXRlclNwZWMpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkFzeW1tZXRyaWNCbG9ja0NpcGhlcikKLQotcHVibGljIHZvaWQgPGluaXQ+KAotYm9vbGVhbgotYm9vbGVhbgotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQXN5bW1ldHJpY0Jsb2NrQ2lwaGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZheC9jcnlwdG8vTm9TdWNoUGFkZGluZ0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIGluaXRGcm9tU3BlYygKLWphdmF4LmNyeXB0by5zcGVjLk9BRVBQYXJhbWV0ZXJTcGVjKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZheC9jcnlwdG8vSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbjtMamF2YXgvY3J5cHRvL0JhZFBhZGRpbmdFeGNlcHRpb247ICkKLXByb3RlY3RlZCBpbnQgZW5naW5lRG9GaW5hbCgKLWJ5dGVbXQotaW50Ci1pbnQKLWJ5dGVbXQotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZheC9jcnlwdG8vSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbjtMamF2YXgvY3J5cHRvL0JhZFBhZGRpbmdFeGNlcHRpb247ICkKLXByb3RlY3RlZCBieXRlW10gZW5naW5lRG9GaW5hbCgKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLXByb3RlY3RlZCBpbnQgZW5naW5lR2V0QmxvY2tTaXplKCkKLQotcHJvdGVjdGVkIGJ5dGVbXSBlbmdpbmVHZXRJVigpCi0KLXByb3RlY3RlZCBpbnQgZW5naW5lR2V0S2V5U2l6ZSgKLWphdmEuc2VjdXJpdHkuS2V5KQotCi1wcm90ZWN0ZWQgaW50IGVuZ2luZUdldE91dHB1dFNpemUoCi1pbnQpCi0KLXByb3RlY3RlZCBqYXZhLnNlY3VyaXR5LkFsZ29yaXRobVBhcmFtZXRlcnMgZW5naW5lR2V0UGFyYW1ldGVycygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBlbmdpbmVJbml0KAotaW50Ci1qYXZhLnNlY3VyaXR5LktleQotamF2YS5zZWN1cml0eS5BbGdvcml0aG1QYXJhbWV0ZXJzCi1qYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBlbmdpbmVJbml0KAotaW50Ci1qYXZhLnNlY3VyaXR5LktleQotamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBlbmdpbmVJbml0KAotaW50Ci1qYXZhLnNlY3VyaXR5LktleQotamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWMKLWphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgZW5naW5lU2V0TW9kZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmF4L2NyeXB0by9Ob1N1Y2hQYWRkaW5nRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBlbmdpbmVTZXRQYWRkaW5nKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJvdGVjdGVkIGludCBlbmdpbmVVcGRhdGUoCi1ieXRlW10KLWludAotaW50Ci1ieXRlW10KLWludCkKLQotcHJvdGVjdGVkIGJ5dGVbXSBlbmdpbmVVcGRhdGUoCi1ieXRlW10KLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1JU085Nzk2ZDFQYWRkaW5nICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VSU0FDaXBoZXI7ICkKLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VSU0FDaXBoZXIkSVNPOTc5NmQxUGFkZGluZyBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRVJTQUNpcGhlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRVJTQUNpcGhlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPU5vUGFkZGluZyApCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFUlNBQ2lwaGVyJE5vUGFkZGluZyBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRVJTQUNpcGhlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPU9BRVBQYWRkaW5nICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VSU0FDaXBoZXI7ICkKLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VSU0FDaXBoZXIkT0FFUFBhZGRpbmcgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VSU0FDaXBoZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VSU0FDaXBoZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1QS0NTMXYxXzVQYWRkaW5nICkKLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VSU0FDaXBoZXIkUEtDUzF2MV81UGFkZGluZyBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRVJTQUNpcGhlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPVBLQ1MxdjFfNVBhZGRpbmdfUHJpdmF0ZU9ubHkgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRVJTQUNpcGhlcjsgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRVJTQUNpcGhlciRQS0NTMXYxXzVQYWRkaW5nX1ByaXZhdGVPbmx5IGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFUlNBQ2lwaGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFUlNBQ2lwaGVyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9UEtDUzF2MV81UGFkZGluZ19QdWJsaWNPbmx5ICkKLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VSU0FDaXBoZXIkUEtDUzF2MV81UGFkZGluZ19QdWJsaWNPbmx5IGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFUlNBQ2lwaGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VSU0FQcml2YXRlS2V5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcy5SU0FQcml2YXRlS2V5LCBvcmcuYm91bmN5Y2FzdGxlLmpjZS5pbnRlcmZhY2VzLlBLQ1MxMkJhZ0F0dHJpYnV0ZUNhcnJpZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIGphdmEubWF0aC5CaWdJbnRlZ2VyIG1vZHVsdXMKLQotcHJpdmF0ZSBqYXZhLnV0aWwuSGFzaHRhYmxlIHBrY3MxMkF0dHJpYnV0ZXMKLQotcHJpdmF0ZSBqYXZhLnV0aWwuVmVjdG9yIHBrY3MxMk9yZGVyaW5nCi0KLXByb3RlY3RlZCBqYXZhLm1hdGguQmlnSW50ZWdlciBwcml2YXRlRXhwb25lbnQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oKQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnNlY3VyaXR5LmludGVyZmFjZXMuUlNBUHJpdmF0ZUtleSkKLQotIHZvaWQgPGluaXQ+KAotamF2YS5zZWN1cml0eS5zcGVjLlJTQVByaXZhdGVLZXlTcGVjKQotCi0gdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5wYXJhbXMuUlNBS2V5UGFyYW1ldGVycykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9sYW5nL0NsYXNzTm90Rm91bmRFeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCByZWFkT2JqZWN0KAotamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KAotamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0pCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEFsZ29yaXRobSgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSRW5jb2RhYmxlIGdldEJhZ0F0dHJpYnV0ZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyKQotCi1wdWJsaWMgamF2YS51dGlsLkVudW1lcmF0aW9uIGdldEJhZ0F0dHJpYnV0ZUtleXMoKQotCi1wdWJsaWMgYnl0ZVtdIGdldEVuY29kZWQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRGb3JtYXQoKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgZ2V0TW9kdWx1cygpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRQcml2YXRlRXhwb25lbnQoKQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLQotcHVibGljIHZvaWQgc2V0QmFnQXR0cmlidXRlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJFbmNvZGFibGUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFUlNBUHJpdmF0ZUNydEtleSBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRVJTQVByaXZhdGVLZXkgaW1wbGVtZW50cyBqYXZhLnNlY3VyaXR5LmludGVyZmFjZXMuUlNBUHJpdmF0ZUNydEtleQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEubWF0aC5CaWdJbnRlZ2VyIGNydENvZWZmaWNpZW50Ci0KLXByaXZhdGUgamF2YS5tYXRoLkJpZ0ludGVnZXIgcHJpbWVFeHBvbmVudFAKLQotcHJpdmF0ZSBqYXZhLm1hdGguQmlnSW50ZWdlciBwcmltZUV4cG9uZW50UQotCi1wcml2YXRlIGphdmEubWF0aC5CaWdJbnRlZ2VyIHByaW1lUAotCi1wcml2YXRlIGphdmEubWF0aC5CaWdJbnRlZ2VyIHByaW1lUQotCi1wcml2YXRlIGphdmEubWF0aC5CaWdJbnRlZ2VyIHB1YmxpY0V4cG9uZW50Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotamF2YS5zZWN1cml0eS5pbnRlcmZhY2VzLlJTQVByaXZhdGVDcnRLZXkpCi0KLSB2b2lkIDxpbml0PigKLWphdmEuc2VjdXJpdHkuc3BlYy5SU0FQcml2YXRlQ3J0S2V5U3BlYykKLQotIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLnBrY3MuUHJpdmF0ZUtleUluZm8pCi0KLSB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5wa2NzLlJTQVByaXZhdGVLZXlTdHJ1Y3R1cmUpCi0KLSB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLnBhcmFtcy5SU0FQcml2YXRlQ3J0S2V5UGFyYW1ldGVycykKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldENydENvZWZmaWNpZW50KCkKLQotcHVibGljIGJ5dGVbXSBnZXRFbmNvZGVkKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Rm9ybWF0KCkKLQotcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldFByaW1lRXhwb25lbnRQKCkKLQotcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldFByaW1lRXhwb25lbnRRKCkKLQotcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldFByaW1lUCgpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRQcmltZVEoKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgZ2V0UHVibGljRXhwb25lbnQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFUlNBUHVibGljS2V5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcy5SU0FQdWJsaWNLZXkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLm1hdGguQmlnSW50ZWdlciBtb2R1bHVzCi0KLXByaXZhdGUgamF2YS5tYXRoLkJpZ0ludGVnZXIgcHVibGljRXhwb25lbnQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnNlY3VyaXR5LmludGVyZmFjZXMuUlNBUHVibGljS2V5KQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnNlY3VyaXR5LnNwZWMuUlNBUHVibGljS2V5U3BlYykKLQotIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuU3ViamVjdFB1YmxpY0tleUluZm8pCi0KLSB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLnBhcmFtcy5SU0FLZXlQYXJhbWV0ZXJzKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRBbGdvcml0aG0oKQotCi1wdWJsaWMgYnl0ZVtdIGdldEVuY29kZWQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRGb3JtYXQoKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgZ2V0TW9kdWx1cygpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRQdWJsaWNFeHBvbmVudCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VTZWNyZXRLZXlGYWN0b3J5JFBCRVdpdGhNRDVBbmQyNTZCaXRBRVNDQkNPcGVuU1NMO0xvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VTZWNyZXRLZXlGYWN0b3J5JFBCRVdpdGhNRDVBbmQxOTJCaXRBRVNDQkNPcGVuU1NMO0xvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VTZWNyZXRLZXlGYWN0b3J5JFBCRVdpdGhNRDVBbmQxMjhCaXRBRVNDQkNPcGVuU1NMO0xvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VTZWNyZXRLZXlGYWN0b3J5JFBCRVdpdGhTSEEyNTZBbmQyNTZCaXRBRVNCQztMb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFU2VjcmV0S2V5RmFjdG9yeSRQQkVXaXRoU0hBMjU2QW5kMTkyQml0QUVTQkM7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRVNlY3JldEtleUZhY3RvcnkkUEJFV2l0aFNIQTI1NkFuZDEyOEJpdEFFU0JDO0xvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VTZWNyZXRLZXlGYWN0b3J5JFBCRVdpdGhTSEFBbmQyNTZCaXRBRVNCQztMb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFU2VjcmV0S2V5RmFjdG9yeSRQQkVXaXRoU0hBQW5kMTkyQml0QUVTQkM7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRVNlY3JldEtleUZhY3RvcnkkUEJFV2l0aFNIQUFuZDEyOEJpdEFFU0JDO0xvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VTZWNyZXRLZXlGYWN0b3J5JFBCRVdpdGhUaWdlcjtMb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFU2VjcmV0S2V5RmFjdG9yeSRQQkVXaXRoU0hBO0xvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VTZWNyZXRLZXlGYWN0b3J5JFBCRVdpdGhSSVBFTUQxNjA7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRVNlY3JldEtleUZhY3RvcnkkUEJFV2l0aFNIQUFuZDQwQml0UkM0O0xvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VTZWNyZXRLZXlGYWN0b3J5JFBCRVdpdGhTSEFBbmQxMjhCaXRSQzQ7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRVNlY3JldEtleUZhY3RvcnkkUEJFV2l0aFNIQUFuZElERUE7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRVNlY3JldEtleUZhY3RvcnkkUEJFV2l0aFNIQUFuZFR3b2Zpc2g7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRVNlY3JldEtleUZhY3RvcnkkUEJFV2l0aFNIQUFuZDQwQml0UkMyO0xvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VTZWNyZXRLZXlGYWN0b3J5JFBCRVdpdGhTSEFBbmQxMjhCaXRSQzI7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRVNlY3JldEtleUZhY3RvcnkkUEJFV2l0aFNIQUFuZERFUzJLZXk7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRVNlY3JldEtleUZhY3RvcnkkUEJFV2l0aFNIQUFuZERFUzNLZXk7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRVNlY3JldEtleUZhY3RvcnkkUEJFV2l0aFNIQTFBbmRSQzI7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRVNlY3JldEtleUZhY3RvcnkkUEJFV2l0aFNIQTFBbmRERVM7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRVNlY3JldEtleUZhY3RvcnkkUEJFV2l0aE1ENUFuZFJDMjtMb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFU2VjcmV0S2V5RmFjdG9yeSRQQkVXaXRoTUQ1QW5kREVTO0xvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VTZWNyZXRLZXlGYWN0b3J5JERFU2VkZTtMb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFU2VjcmV0S2V5RmFjdG9yeSRERVM7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRVNlY3JldEtleUZhY3RvcnkkREVTUEJFS2V5RmFjdG9yeTtMb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFU2VjcmV0S2V5RmFjdG9yeSRQQkVLZXlGYWN0b3J5OyApCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFU2VjcmV0S2V5RmFjdG9yeSBleHRlbmRzIGphdmF4LmNyeXB0by5TZWNyZXRLZXlGYWN0b3J5U3BpIGltcGxlbWVudHMgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuUEJFCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIGFsZ05hbWUKLQotcHJvdGVjdGVkIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGFsZ09pZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L3NwZWMvSW52YWxpZEtleVNwZWNFeGNlcHRpb247ICkKLXByb3RlY3RlZCBqYXZheC5jcnlwdG8uU2VjcmV0S2V5IGVuZ2luZUdlbmVyYXRlU2VjcmV0KAotamF2YS5zZWN1cml0eS5zcGVjLktleVNwZWMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvc3BlYy9JbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGphdmEuc2VjdXJpdHkuc3BlYy5LZXlTcGVjIGVuZ2luZUdldEtleVNwZWMoCi1qYXZheC5jcnlwdG8uU2VjcmV0S2V5Ci1qYXZhLmxhbmcuQ2xhc3MpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGphdmF4LmNyeXB0by5TZWNyZXRLZXkgZW5naW5lVHJhbnNsYXRlS2V5KAotamF2YXguY3J5cHRvLlNlY3JldEtleSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9REVTICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VTZWNyZXRLZXlGYWN0b3J5OyApCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFU2VjcmV0S2V5RmFjdG9yeSRERVMgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VTZWNyZXRLZXlGYWN0b3J5Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9zcGVjL0ludmFsaWRLZXlTcGVjRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgamF2YXguY3J5cHRvLlNlY3JldEtleSBlbmdpbmVHZW5lcmF0ZVNlY3JldCgKLWphdmEuc2VjdXJpdHkuc3BlYy5LZXlTcGVjKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VTZWNyZXRLZXlGYWN0b3J5OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9REVTUEJFS2V5RmFjdG9yeSApCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFU2VjcmV0S2V5RmFjdG9yeSRERVNQQkVLZXlGYWN0b3J5IGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFU2VjcmV0S2V5RmFjdG9yeQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGludCBkaWdlc3QKLQotcHJpdmF0ZSBib29sZWFuIGZvckNpcGhlcgotCi1wcml2YXRlIGludCBpdlNpemUKLQotcHJpdmF0ZSBpbnQga2V5U2l6ZQotCi1wcml2YXRlIGludCBzY2hlbWUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllcgotYm9vbGVhbgotaW50Ci1pbnQKLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L3NwZWMvSW52YWxpZEtleVNwZWNFeGNlcHRpb247ICkKLXByb3RlY3RlZCBqYXZheC5jcnlwdG8uU2VjcmV0S2V5IGVuZ2luZUdlbmVyYXRlU2VjcmV0KAotamF2YS5zZWN1cml0eS5zcGVjLktleVNwZWMpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPURFU2VkZSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFU2VjcmV0S2V5RmFjdG9yeTsgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRVNlY3JldEtleUZhY3RvcnkkREVTZWRlIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFU2VjcmV0S2V5RmFjdG9yeQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvc3BlYy9JbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGphdmF4LmNyeXB0by5TZWNyZXRLZXkgZW5naW5lR2VuZXJhdGVTZWNyZXQoCi1qYXZhLnNlY3VyaXR5LnNwZWMuS2V5U3BlYykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9zcGVjL0ludmFsaWRLZXlTcGVjRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgamF2YS5zZWN1cml0eS5zcGVjLktleVNwZWMgZW5naW5lR2V0S2V5U3BlYygKLWphdmF4LmNyeXB0by5TZWNyZXRLZXkKLWphdmEubGFuZy5DbGFzcykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9UEJFS2V5RmFjdG9yeSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFU2VjcmV0S2V5RmFjdG9yeTsgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRVNlY3JldEtleUZhY3RvcnkkUEJFS2V5RmFjdG9yeSBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRVNlY3JldEtleUZhY3RvcnkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBpbnQgZGlnZXN0Ci0KLXByaXZhdGUgYm9vbGVhbiBmb3JDaXBoZXIKLQotcHJpdmF0ZSBpbnQgaXZTaXplCi0KLXByaXZhdGUgaW50IGtleVNpemUKLQotcHJpdmF0ZSBpbnQgc2NoZW1lCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIKLWJvb2xlYW4KLWludAotaW50Ci1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9zcGVjL0ludmFsaWRLZXlTcGVjRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgamF2YXguY3J5cHRvLlNlY3JldEtleSBlbmdpbmVHZW5lcmF0ZVNlY3JldCgKLWphdmEuc2VjdXJpdHkuc3BlYy5LZXlTcGVjKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1QQkVXaXRoTUQ1QW5kMTI4Qml0QUVTQ0JDT3BlblNTTCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFU2VjcmV0S2V5RmFjdG9yeTsgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRVNlY3JldEtleUZhY3RvcnkkUEJFV2l0aE1ENUFuZDEyOEJpdEFFU0NCQ09wZW5TU0wgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VTZWNyZXRLZXlGYWN0b3J5JFBCRUtleUZhY3RvcnkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VTZWNyZXRLZXlGYWN0b3J5OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9UEJFV2l0aE1ENUFuZDE5MkJpdEFFU0NCQ09wZW5TU0wgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRVNlY3JldEtleUZhY3RvcnkkUEJFV2l0aE1ENUFuZDE5MkJpdEFFU0NCQ09wZW5TU0wgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VTZWNyZXRLZXlGYWN0b3J5JFBCRUtleUZhY3RvcnkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VTZWNyZXRLZXlGYWN0b3J5OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9UEJFV2l0aE1ENUFuZDI1NkJpdEFFU0NCQ09wZW5TU0wgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRVNlY3JldEtleUZhY3RvcnkkUEJFV2l0aE1ENUFuZDI1NkJpdEFFU0NCQ09wZW5TU0wgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VTZWNyZXRLZXlGYWN0b3J5JFBCRUtleUZhY3RvcnkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1QQkVXaXRoTUQ1QW5kREVTICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VTZWNyZXRLZXlGYWN0b3J5OyApCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFU2VjcmV0S2V5RmFjdG9yeSRQQkVXaXRoTUQ1QW5kREVTIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFU2VjcmV0S2V5RmFjdG9yeSRERVNQQkVLZXlGYWN0b3J5Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFU2VjcmV0S2V5RmFjdG9yeTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPVBCRVdpdGhNRDVBbmRSQzIgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRVNlY3JldEtleUZhY3RvcnkkUEJFV2l0aE1ENUFuZFJDMiBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRVNlY3JldEtleUZhY3RvcnkkUEJFS2V5RmFjdG9yeQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRVNlY3JldEtleUZhY3Rvcnk7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1QQkVXaXRoUklQRU1EMTYwICkKLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VTZWNyZXRLZXlGYWN0b3J5JFBCRVdpdGhSSVBFTUQxNjAgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VTZWNyZXRLZXlGYWN0b3J5JFBCRUtleUZhY3RvcnkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1QQkVXaXRoU0hBMUFuZERFUyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFU2VjcmV0S2V5RmFjdG9yeTsgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRVNlY3JldEtleUZhY3RvcnkkUEJFV2l0aFNIQTFBbmRERVMgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VTZWNyZXRLZXlGYWN0b3J5JFBCRUtleUZhY3RvcnkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1QQkVXaXRoU0hBMUFuZFJDMiApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFU2VjcmV0S2V5RmFjdG9yeTsgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRVNlY3JldEtleUZhY3RvcnkkUEJFV2l0aFNIQTFBbmRSQzIgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VTZWNyZXRLZXlGYWN0b3J5JFBCRUtleUZhY3RvcnkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VTZWNyZXRLZXlGYWN0b3J5OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9UEJFV2l0aFNIQTI1NkFuZDEyOEJpdEFFU0JDICkKLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VTZWNyZXRLZXlGYWN0b3J5JFBCRVdpdGhTSEEyNTZBbmQxMjhCaXRBRVNCQyBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRVNlY3JldEtleUZhY3RvcnkkUEJFS2V5RmFjdG9yeQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPVBCRVdpdGhTSEEyNTZBbmQxOTJCaXRBRVNCQyApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFU2VjcmV0S2V5RmFjdG9yeTsgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRVNlY3JldEtleUZhY3RvcnkkUEJFV2l0aFNIQTI1NkFuZDE5MkJpdEFFU0JDIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFU2VjcmV0S2V5RmFjdG9yeSRQQkVLZXlGYWN0b3J5Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFU2VjcmV0S2V5RmFjdG9yeTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPVBCRVdpdGhTSEEyNTZBbmQyNTZCaXRBRVNCQyApCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFU2VjcmV0S2V5RmFjdG9yeSRQQkVXaXRoU0hBMjU2QW5kMjU2Qml0QUVTQkMgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VTZWNyZXRLZXlGYWN0b3J5JFBCRUtleUZhY3RvcnkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VTZWNyZXRLZXlGYWN0b3J5OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9UEJFV2l0aFNIQSApCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFU2VjcmV0S2V5RmFjdG9yeSRQQkVXaXRoU0hBIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFU2VjcmV0S2V5RmFjdG9yeSRQQkVLZXlGYWN0b3J5Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9UEJFV2l0aFNIQUFuZDEyOEJpdEFFU0JDICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VTZWNyZXRLZXlGYWN0b3J5OyApCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFU2VjcmV0S2V5RmFjdG9yeSRQQkVXaXRoU0hBQW5kMTI4Qml0QUVTQkMgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VTZWNyZXRLZXlGYWN0b3J5JFBCRUtleUZhY3RvcnkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1QQkVXaXRoU0hBQW5kMTI4Qml0UkMyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VTZWNyZXRLZXlGYWN0b3J5OyApCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFU2VjcmV0S2V5RmFjdG9yeSRQQkVXaXRoU0hBQW5kMTI4Qml0UkMyIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFU2VjcmV0S2V5RmFjdG9yeSRQQkVLZXlGYWN0b3J5Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9UEJFV2l0aFNIQUFuZDEyOEJpdFJDNCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFU2VjcmV0S2V5RmFjdG9yeTsgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRVNlY3JldEtleUZhY3RvcnkkUEJFV2l0aFNIQUFuZDEyOEJpdFJDNCBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRVNlY3JldEtleUZhY3RvcnkkUEJFS2V5RmFjdG9yeQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRVNlY3JldEtleUZhY3Rvcnk7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1QQkVXaXRoU0hBQW5kMTkyQml0QUVTQkMgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRVNlY3JldEtleUZhY3RvcnkkUEJFV2l0aFNIQUFuZDE5MkJpdEFFU0JDIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFU2VjcmV0S2V5RmFjdG9yeSRQQkVLZXlGYWN0b3J5Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFU2VjcmV0S2V5RmFjdG9yeTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPVBCRVdpdGhTSEFBbmQyNTZCaXRBRVNCQyApCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFU2VjcmV0S2V5RmFjdG9yeSRQQkVXaXRoU0hBQW5kMjU2Qml0QUVTQkMgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VTZWNyZXRLZXlGYWN0b3J5JFBCRUtleUZhY3RvcnkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1QQkVXaXRoU0hBQW5kNDBCaXRSQzIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRVNlY3JldEtleUZhY3Rvcnk7ICkKLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VTZWNyZXRLZXlGYWN0b3J5JFBCRVdpdGhTSEFBbmQ0MEJpdFJDMiBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRVNlY3JldEtleUZhY3RvcnkkUEJFS2V5RmFjdG9yeQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRVNlY3JldEtleUZhY3Rvcnk7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1QQkVXaXRoU0hBQW5kNDBCaXRSQzQgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRVNlY3JldEtleUZhY3RvcnkkUEJFV2l0aFNIQUFuZDQwQml0UkM0IGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFU2VjcmV0S2V5RmFjdG9yeSRQQkVLZXlGYWN0b3J5Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9UEJFV2l0aFNIQUFuZERFUzJLZXkgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRVNlY3JldEtleUZhY3Rvcnk7ICkKLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VTZWNyZXRLZXlGYWN0b3J5JFBCRVdpdGhTSEFBbmRERVMyS2V5IGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFU2VjcmV0S2V5RmFjdG9yeSRQQkVLZXlGYWN0b3J5Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFU2VjcmV0S2V5RmFjdG9yeTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPVBCRVdpdGhTSEFBbmRERVMzS2V5ICkKLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VTZWNyZXRLZXlGYWN0b3J5JFBCRVdpdGhTSEFBbmRERVMzS2V5IGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFU2VjcmV0S2V5RmFjdG9yeSRQQkVLZXlGYWN0b3J5Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFU2VjcmV0S2V5RmFjdG9yeTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPVBCRVdpdGhTSEFBbmRJREVBICkKLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VTZWNyZXRLZXlGYWN0b3J5JFBCRVdpdGhTSEFBbmRJREVBIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFU2VjcmV0S2V5RmFjdG9yeSRQQkVLZXlGYWN0b3J5Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9UEJFV2l0aFNIQUFuZFR3b2Zpc2ggKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRVNlY3JldEtleUZhY3Rvcnk7ICkKLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VTZWNyZXRLZXlGYWN0b3J5JFBCRVdpdGhTSEFBbmRUd29maXNoIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFU2VjcmV0S2V5RmFjdG9yeSRQQkVLZXlGYWN0b3J5Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9UEJFV2l0aFRpZ2VyICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VTZWNyZXRLZXlGYWN0b3J5OyApCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFU2VjcmV0S2V5RmFjdG9yeSRQQkVXaXRoVGlnZXIgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VTZWNyZXRLZXlGYWN0b3J5JFBCRUtleUZhY3RvcnkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRVN0cmVhbUNpcGhlciRERVNlZGVfT0ZCODtMb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFU3RyZWFtQ2lwaGVyJERFU19PRkI4O0xvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VTdHJlYW1DaXBoZXIkREVTZWRlX0NGQjg7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRVN0cmVhbUNpcGhlciRERVNfQ0ZCODsgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRVN0cmVhbUNpcGhlciBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLldyYXBDaXBoZXJTcGkgaW1wbGVtZW50cyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5QQkUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLmxhbmcuQ2xhc3NbXSBhdmFpbGFibGVTcGVjcwotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLlN0cmVhbUNpcGhlciBjaXBoZXIKLQotcHJpdmF0ZSBpbnQgaXZMZW5ndGgKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5wYXJhbXMuUGFyYW1ldGVyc1dpdGhJViBpdlBhcmFtCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBwYmVBbGdvcml0aG0KLQotcHJpdmF0ZSBqYXZheC5jcnlwdG8uc3BlYy5QQkVQYXJhbWV0ZXJTcGVjIHBiZVNwZWMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5CbG9ja0NpcGhlcgotaW50KQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5TdHJlYW1DaXBoZXIpCi0KLXByb3RlY3RlZCBpbnQgZW5naW5lRG9GaW5hbCgKLWJ5dGVbXQotaW50Ci1pbnQKLWJ5dGVbXQotaW50KQotCi1wcm90ZWN0ZWQgYnl0ZVtdIGVuZ2luZURvRmluYWwoCi1ieXRlW10KLWludAotaW50KQotCi1wcm90ZWN0ZWQgaW50IGVuZ2luZUdldEJsb2NrU2l6ZSgpCi0KLXByb3RlY3RlZCBieXRlW10gZW5naW5lR2V0SVYoKQotCi1wcm90ZWN0ZWQgaW50IGVuZ2luZUdldEtleVNpemUoCi1qYXZhLnNlY3VyaXR5LktleSkKLQotcHJvdGVjdGVkIGludCBlbmdpbmVHZXRPdXRwdXRTaXplKAotaW50KQotCi1wcm90ZWN0ZWQgamF2YS5zZWN1cml0eS5BbGdvcml0aG1QYXJhbWV0ZXJzIGVuZ2luZUdldFBhcmFtZXRlcnMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgZW5naW5lSW5pdCgKLWludAotamF2YS5zZWN1cml0eS5LZXkKLWphdmEuc2VjdXJpdHkuQWxnb3JpdGhtUGFyYW1ldGVycwotamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgZW5naW5lSW5pdCgKLWludAotamF2YS5zZWN1cml0eS5LZXkKLWphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgZW5naW5lSW5pdCgKLWludAotamF2YS5zZWN1cml0eS5LZXkKLWphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjCi1qYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSkKLQotcHJvdGVjdGVkIHZvaWQgZW5naW5lU2V0TW9kZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmF4L2NyeXB0by9Ob1N1Y2hQYWRkaW5nRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBlbmdpbmVTZXRQYWRkaW5nKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YXgvY3J5cHRvL1Nob3J0QnVmZmVyRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgaW50IGVuZ2luZVVwZGF0ZSgKLWJ5dGVbXQotaW50Ci1pbnQKLWJ5dGVbXQotaW50KQotCi1wcm90ZWN0ZWQgYnl0ZVtdIGVuZ2luZVVwZGF0ZSgKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRVN0cmVhbUNpcGhlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPURFU19DRkI4ICkKLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VTdHJlYW1DaXBoZXIkREVTX0NGQjggZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VTdHJlYW1DaXBoZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KQ0VTdHJlYW1DaXBoZXI7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1ERVNfT0ZCOCApCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFU3RyZWFtQ2lwaGVyJERFU19PRkI4IGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkNFU3RyZWFtQ2lwaGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkNFU3RyZWFtQ2lwaGVyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9REVTZWRlX0NGQjggKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRVN0cmVhbUNpcGhlciRERVNlZGVfQ0ZCOCBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRVN0cmVhbUNpcGhlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pDRVN0cmVhbUNpcGhlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPURFU2VkZV9PRkI4ICkKLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VTdHJlYW1DaXBoZXIkREVTZWRlX09GQjggZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KQ0VTdHJlYW1DaXBoZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pES0FsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvciRDQVNUNTtMb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkRLQWxnb3JpdGhtUGFyYW1ldGVyR2VuZXJhdG9yJElERUE7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pES0FsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvciRBRVM7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pES0FsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvciRSQzI7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pES0FsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvciRERVM7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pES0FsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvciREU0E7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pES0FsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvciRESDsgKQotcHVibGljIGFic3RyYWN0IGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES0FsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvciBleHRlbmRzIGphdmEuc2VjdXJpdHkuQWxnb3JpdGhtUGFyYW1ldGVyR2VuZXJhdG9yU3BpCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSByYW5kb20KLQotcHJvdGVjdGVkIGludCBzdHJlbmd0aAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByb3RlY3RlZCB2b2lkIGVuZ2luZUluaXQoCi1pbnQKLWphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1BRVMgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pES0FsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvcjsgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES0FsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvciRBRVMgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KREtBbGdvcml0aG1QYXJhbWV0ZXJHZW5lcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcm90ZWN0ZWQgamF2YS5zZWN1cml0eS5BbGdvcml0aG1QYXJhbWV0ZXJzIGVuZ2luZUdlbmVyYXRlUGFyYW1ldGVycygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgZW5naW5lSW5pdCgKLWphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjCi1qYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkRLQWxnb3JpdGhtUGFyYW1ldGVyR2VuZXJhdG9yOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9Q0FTVDUgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES0FsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvciRDQVNUNSBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES0FsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByb3RlY3RlZCBqYXZhLnNlY3VyaXR5LkFsZ29yaXRobVBhcmFtZXRlcnMgZW5naW5lR2VuZXJhdGVQYXJhbWV0ZXJzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBlbmdpbmVJbml0KAotamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWMKLWphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1ERVMgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pES0FsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvcjsgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES0FsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvciRERVMgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KREtBbGdvcml0aG1QYXJhbWV0ZXJHZW5lcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcm90ZWN0ZWQgamF2YS5zZWN1cml0eS5BbGdvcml0aG1QYXJhbWV0ZXJzIGVuZ2luZUdlbmVyYXRlUGFyYW1ldGVycygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgZW5naW5lSW5pdCgKLWphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjCi1qYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9REggKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pES0FsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvcjsgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES0FsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvciRESCBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES0FsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGludCBsCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJvdGVjdGVkIGphdmEuc2VjdXJpdHkuQWxnb3JpdGhtUGFyYW1ldGVycyBlbmdpbmVHZW5lcmF0ZVBhcmFtZXRlcnMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIGVuZ2luZUluaXQoCi1qYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYwotamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPURTQSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkRLQWxnb3JpdGhtUGFyYW1ldGVyR2VuZXJhdG9yOyApCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkRLQWxnb3JpdGhtUGFyYW1ldGVyR2VuZXJhdG9yJERTQSBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES0FsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByb3RlY3RlZCBqYXZhLnNlY3VyaXR5LkFsZ29yaXRobVBhcmFtZXRlcnMgZW5naW5lR2VuZXJhdGVQYXJhbWV0ZXJzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBlbmdpbmVJbml0KAotamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWMKLWphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1JREVBICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KREtBbGdvcml0aG1QYXJhbWV0ZXJHZW5lcmF0b3I7ICkKLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KREtBbGdvcml0aG1QYXJhbWV0ZXJHZW5lcmF0b3IkSURFQSBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES0FsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByb3RlY3RlZCBqYXZhLnNlY3VyaXR5LkFsZ29yaXRobVBhcmFtZXRlcnMgZW5naW5lR2VuZXJhdGVQYXJhbWV0ZXJzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBlbmdpbmVJbml0KAotamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWMKLWphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KREtBbGdvcml0aG1QYXJhbWV0ZXJHZW5lcmF0b3I7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1SQzIgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES0FsZ29yaXRobVBhcmFtZXRlckdlbmVyYXRvciRSQzIgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KREtBbGdvcml0aG1QYXJhbWV0ZXJHZW5lcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGphdmF4LmNyeXB0by5zcGVjLlJDMlBhcmFtZXRlclNwZWMgc3BlYwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXByb3RlY3RlZCBqYXZhLnNlY3VyaXR5LkFsZ29yaXRobVBhcmFtZXRlcnMgZW5naW5lR2VuZXJhdGVQYXJhbWV0ZXJzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBlbmdpbmVJbml0KAotamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWMKLWphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pES0FsZ29yaXRobVBhcmFtZXRlcnMkUFNTO0xvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KREtBbGdvcml0aG1QYXJhbWV0ZXJzJE9BRVA7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pES0FsZ29yaXRobVBhcmFtZXRlcnMkSUVTO0xvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KREtBbGdvcml0aG1QYXJhbWV0ZXJzJERTQTtMb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkRLQWxnb3JpdGhtUGFyYW1ldGVycyRESDtMb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkRLQWxnb3JpdGhtUGFyYW1ldGVycyRQS0NTMTJQQkU7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pES0FsZ29yaXRobVBhcmFtZXRlcnMkQ0FTVDVBbGdvcml0aG1QYXJhbWV0ZXJzO0xvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KREtBbGdvcml0aG1QYXJhbWV0ZXJzJFJDMkFsZ29yaXRobVBhcmFtZXRlcnM7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pES0FsZ29yaXRobVBhcmFtZXRlcnMkSURFQUFsZ29yaXRobVBhcmFtZXRlcnM7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pES0FsZ29yaXRobVBhcmFtZXRlcnMkSVZBbGdvcml0aG1QYXJhbWV0ZXJzOyApCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkRLQWxnb3JpdGhtUGFyYW1ldGVycyBleHRlbmRzIGphdmEuc2VjdXJpdHkuQWxnb3JpdGhtUGFyYW1ldGVyc1NwaQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pES0FsZ29yaXRobVBhcmFtZXRlcnM7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1DQVNUNUFsZ29yaXRobVBhcmFtZXRlcnMgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES0FsZ29yaXRobVBhcmFtZXRlcnMkQ0FTVDVBbGdvcml0aG1QYXJhbWV0ZXJzIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkRLQWxnb3JpdGhtUGFyYW1ldGVycwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGJ5dGVbXSBpdgotCi1wcml2YXRlIGludCBrZXlMZW5ndGgKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcm90ZWN0ZWQgYnl0ZVtdIGVuZ2luZUdldEVuY29kZWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgYnl0ZVtdIGVuZ2luZUdldEVuY29kZWQoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L3NwZWMvSW52YWxpZFBhcmFtZXRlclNwZWNFeGNlcHRpb247ICkKLXByb3RlY3RlZCBqYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYyBlbmdpbmVHZXRQYXJhbWV0ZXJTcGVjKAotamF2YS5sYW5nLkNsYXNzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L3NwZWMvSW52YWxpZFBhcmFtZXRlclNwZWNFeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIGVuZ2luZUluaXQoCi1qYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgZW5naW5lSW5pdCgKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgZW5naW5lSW5pdCgKLWJ5dGVbXQotamF2YS5sYW5nLlN0cmluZykKLQotcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgZW5naW5lVG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KREtBbGdvcml0aG1QYXJhbWV0ZXJzOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9REggKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES0FsZ29yaXRobVBhcmFtZXRlcnMkREggZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KREtBbGdvcml0aG1QYXJhbWV0ZXJzCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBqYXZheC5jcnlwdG8uc3BlYy5ESFBhcmFtZXRlclNwZWMgY3VycmVudFNwZWMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcm90ZWN0ZWQgYnl0ZVtdIGVuZ2luZUdldEVuY29kZWQoKQotCi1wcm90ZWN0ZWQgYnl0ZVtdIGVuZ2luZUdldEVuY29kZWQoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L3NwZWMvSW52YWxpZFBhcmFtZXRlclNwZWNFeGNlcHRpb247ICkKLXByb3RlY3RlZCBqYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYyBlbmdpbmVHZXRQYXJhbWV0ZXJTcGVjKAotamF2YS5sYW5nLkNsYXNzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L3NwZWMvSW52YWxpZFBhcmFtZXRlclNwZWNFeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIGVuZ2luZUluaXQoCi1qYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgZW5naW5lSW5pdCgKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgZW5naW5lSW5pdCgKLWJ5dGVbXQotamF2YS5sYW5nLlN0cmluZykKLQotcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgZW5naW5lVG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1EU0EgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pES0FsZ29yaXRobVBhcmFtZXRlcnM7ICkKLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KREtBbGdvcml0aG1QYXJhbWV0ZXJzJERTQSBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES0FsZ29yaXRobVBhcmFtZXRlcnMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGphdmEuc2VjdXJpdHkuc3BlYy5EU0FQYXJhbWV0ZXJTcGVjIGN1cnJlbnRTcGVjCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJvdGVjdGVkIGJ5dGVbXSBlbmdpbmVHZXRFbmNvZGVkKCkKLQotcHJvdGVjdGVkIGJ5dGVbXSBlbmdpbmVHZXRFbmNvZGVkKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9zcGVjL0ludmFsaWRQYXJhbWV0ZXJTcGVjRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWMgZW5naW5lR2V0UGFyYW1ldGVyU3BlYygKLWphdmEubGFuZy5DbGFzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9zcGVjL0ludmFsaWRQYXJhbWV0ZXJTcGVjRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBlbmdpbmVJbml0KAotamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIGVuZ2luZUluaXQoCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIGVuZ2luZUluaXQoCi1ieXRlW10KLWphdmEubGFuZy5TdHJpbmcpCi0KLXByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIGVuZ2luZVRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkRLQWxnb3JpdGhtUGFyYW1ldGVyczsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPUlERUFBbGdvcml0aG1QYXJhbWV0ZXJzICkKLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KREtBbGdvcml0aG1QYXJhbWV0ZXJzJElERUFBbGdvcml0aG1QYXJhbWV0ZXJzIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkRLQWxnb3JpdGhtUGFyYW1ldGVycwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGJ5dGVbXSBpdgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCBieXRlW10gZW5naW5lR2V0RW5jb2RlZCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCBieXRlW10gZW5naW5lR2V0RW5jb2RlZCgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvc3BlYy9JbnZhbGlkUGFyYW1ldGVyU3BlY0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjIGVuZ2luZUdldFBhcmFtZXRlclNwZWMoCi1qYXZhLmxhbmcuQ2xhc3MpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvc3BlYy9JbnZhbGlkUGFyYW1ldGVyU3BlY0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgZW5naW5lSW5pdCgKLWphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBlbmdpbmVJbml0KAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBlbmdpbmVJbml0KAotYnl0ZVtdCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBlbmdpbmVUb1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pES0FsZ29yaXRobVBhcmFtZXRlcnM7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1JRVMgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES0FsZ29yaXRobVBhcmFtZXRlcnMkSUVTIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkRLQWxnb3JpdGhtUGFyYW1ldGVycwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gb3JnLmJvdW5jeWNhc3RsZS5qY2Uuc3BlYy5JRVNQYXJhbWV0ZXJTcGVjIGN1cnJlbnRTcGVjCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJvdGVjdGVkIGJ5dGVbXSBlbmdpbmVHZXRFbmNvZGVkKCkKLQotcHJvdGVjdGVkIGJ5dGVbXSBlbmdpbmVHZXRFbmNvZGVkKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9zcGVjL0ludmFsaWRQYXJhbWV0ZXJTcGVjRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWMgZW5naW5lR2V0UGFyYW1ldGVyU3BlYygKLWphdmEubGFuZy5DbGFzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9zcGVjL0ludmFsaWRQYXJhbWV0ZXJTcGVjRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBlbmdpbmVJbml0KAotamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIGVuZ2luZUluaXQoCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIGVuZ2luZUluaXQoCi1ieXRlW10KLWphdmEubGFuZy5TdHJpbmcpCi0KLXByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIGVuZ2luZVRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9SVZBbGdvcml0aG1QYXJhbWV0ZXJzICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KREtBbGdvcml0aG1QYXJhbWV0ZXJzOyApCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkRLQWxnb3JpdGhtUGFyYW1ldGVycyRJVkFsZ29yaXRobVBhcmFtZXRlcnMgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KREtBbGdvcml0aG1QYXJhbWV0ZXJzCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYnl0ZVtdIGl2Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGJ5dGVbXSBlbmdpbmVHZXRFbmNvZGVkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGJ5dGVbXSBlbmdpbmVHZXRFbmNvZGVkKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9zcGVjL0ludmFsaWRQYXJhbWV0ZXJTcGVjRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWMgZW5naW5lR2V0UGFyYW1ldGVyU3BlYygKLWphdmEubGFuZy5DbGFzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9zcGVjL0ludmFsaWRQYXJhbWV0ZXJTcGVjRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBlbmdpbmVJbml0KAotamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIGVuZ2luZUluaXQoCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIGVuZ2luZUluaXQoCi1ieXRlW10KLWphdmEubGFuZy5TdHJpbmcpCi0KLXByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIGVuZ2luZVRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9T0FFUCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkRLQWxnb3JpdGhtUGFyYW1ldGVyczsgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES0FsZ29yaXRobVBhcmFtZXRlcnMkT0FFUCBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES0FsZ29yaXRobVBhcmFtZXRlcnMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGphdmF4LmNyeXB0by5zcGVjLk9BRVBQYXJhbWV0ZXJTcGVjIGN1cnJlbnRTcGVjCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJvdGVjdGVkIGJ5dGVbXSBlbmdpbmVHZXRFbmNvZGVkKCkKLQotcHJvdGVjdGVkIGJ5dGVbXSBlbmdpbmVHZXRFbmNvZGVkKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9zcGVjL0ludmFsaWRQYXJhbWV0ZXJTcGVjRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWMgZW5naW5lR2V0UGFyYW1ldGVyU3BlYygKLWphdmEubGFuZy5DbGFzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9zcGVjL0ludmFsaWRQYXJhbWV0ZXJTcGVjRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBlbmdpbmVJbml0KAotamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIGVuZ2luZUluaXQoCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIGVuZ2luZUluaXQoCi1ieXRlW10KLWphdmEubGFuZy5TdHJpbmcpCi0KLXByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIGVuZ2luZVRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkRLQWxnb3JpdGhtUGFyYW1ldGVyczsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPVBLQ1MxMlBCRSApCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkRLQWxnb3JpdGhtUGFyYW1ldGVycyRQS0NTMTJQQkUgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KREtBbGdvcml0aG1QYXJhbWV0ZXJzCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEucGtjcy5QS0NTMTJQQkVQYXJhbXMgcGFyYW1zCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJvdGVjdGVkIGJ5dGVbXSBlbmdpbmVHZXRFbmNvZGVkKCkKLQotcHJvdGVjdGVkIGJ5dGVbXSBlbmdpbmVHZXRFbmNvZGVkKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9zcGVjL0ludmFsaWRQYXJhbWV0ZXJTcGVjRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWMgZW5naW5lR2V0UGFyYW1ldGVyU3BlYygKLWphdmEubGFuZy5DbGFzcykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9zcGVjL0ludmFsaWRQYXJhbWV0ZXJTcGVjRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBlbmdpbmVJbml0KAotamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIGVuZ2luZUluaXQoCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIGVuZ2luZUluaXQoCi1ieXRlW10KLWphdmEubGFuZy5TdHJpbmcpCi0KLXByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIGVuZ2luZVRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkRLQWxnb3JpdGhtUGFyYW1ldGVyczsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPVBTUyApCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkRLQWxnb3JpdGhtUGFyYW1ldGVycyRQU1MgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KREtBbGdvcml0aG1QYXJhbWV0ZXJzCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBqYXZhLnNlY3VyaXR5LnNwZWMuUFNTUGFyYW1ldGVyU3BlYyBjdXJyZW50U3BlYwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCBieXRlW10gZW5naW5lR2V0RW5jb2RlZCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCBieXRlW10gZW5naW5lR2V0RW5jb2RlZCgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvc3BlYy9JbnZhbGlkUGFyYW1ldGVyU3BlY0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjIGVuZ2luZUdldFBhcmFtZXRlclNwZWMoCi1qYXZhLmxhbmcuQ2xhc3MpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvc3BlYy9JbnZhbGlkUGFyYW1ldGVyU3BlY0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgZW5naW5lSW5pdCgKLWphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBlbmdpbmVJbml0KAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBlbmdpbmVJbml0KAotYnl0ZVtdCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBlbmdpbmVUb1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPVJDMkFsZ29yaXRobVBhcmFtZXRlcnMgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pES0FsZ29yaXRobVBhcmFtZXRlcnM7ICkKLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KREtBbGdvcml0aG1QYXJhbWV0ZXJzJFJDMkFsZ29yaXRobVBhcmFtZXRlcnMgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KREtBbGdvcml0aG1QYXJhbWV0ZXJzCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc2hvcnRbXSBla2IKLQotcHJpdmF0ZSBieXRlW10gaXYKLQotcHJpdmF0ZSBpbnQgcGFyYW1ldGVyVmVyc2lvbgotCi1wcml2YXRlIHNob3J0W10gdGFibGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcm90ZWN0ZWQgYnl0ZVtdIGVuZ2luZUdldEVuY29kZWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgYnl0ZVtdIGVuZ2luZUdldEVuY29kZWQoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L3NwZWMvSW52YWxpZFBhcmFtZXRlclNwZWNFeGNlcHRpb247ICkKLXByb3RlY3RlZCBqYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYyBlbmdpbmVHZXRQYXJhbWV0ZXJTcGVjKAotamF2YS5sYW5nLkNsYXNzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L3NwZWMvSW52YWxpZFBhcmFtZXRlclNwZWNFeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIGVuZ2luZUluaXQoCi1qYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgZW5naW5lSW5pdCgKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgZW5naW5lSW5pdCgKLWJ5dGVbXQotamF2YS5sYW5nLlN0cmluZykKLQotcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgZW5naW5lVG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES0RTQVByaXZhdGVLZXkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5pbnRlcmZhY2VzLkRTQVByaXZhdGVLZXksIG9yZy5ib3VuY3ljYXN0bGUuamNlLmludGVyZmFjZXMuUEtDUzEyQmFnQXR0cmlidXRlQ2FycmllcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gamF2YS5zZWN1cml0eS5pbnRlcmZhY2VzLkRTQVBhcmFtcyBkc2FTcGVjCi0KLXByaXZhdGUgamF2YS51dGlsLkhhc2h0YWJsZSBwa2NzMTJBdHRyaWJ1dGVzCi0KLXByaXZhdGUgamF2YS51dGlsLlZlY3RvciBwa2NzMTJPcmRlcmluZwotCi0gamF2YS5tYXRoLkJpZ0ludGVnZXIgeAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigpCi0KLSB2b2lkIDxpbml0PigKLWphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcy5EU0FQcml2YXRlS2V5KQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnNlY3VyaXR5LnNwZWMuRFNBUHJpdmF0ZUtleVNwZWMpCi0KLSB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5wa2NzLlByaXZhdGVLZXlJbmZvKQotCi0gdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5wYXJhbXMuRFNBUHJpdmF0ZUtleVBhcmFtZXRlcnMpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEFsZ29yaXRobSgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSRW5jb2RhYmxlIGdldEJhZ0F0dHJpYnV0ZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyKQotCi1wdWJsaWMgamF2YS51dGlsLkVudW1lcmF0aW9uIGdldEJhZ0F0dHJpYnV0ZUtleXMoKQotCi1wdWJsaWMgYnl0ZVtdIGdldEVuY29kZWQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRGb3JtYXQoKQotCi1wdWJsaWMgamF2YS5zZWN1cml0eS5pbnRlcmZhY2VzLkRTQVBhcmFtcyBnZXRQYXJhbXMoKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgZ2V0WCgpCi0KLXB1YmxpYyB2b2lkIHNldEJhZ0F0dHJpYnV0ZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSRW5jb2RhYmxlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES0RTQVB1YmxpY0tleSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnNlY3VyaXR5LmludGVyZmFjZXMuRFNBUHVibGljS2V5Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS5zZWN1cml0eS5pbnRlcmZhY2VzLkRTQVBhcmFtcyBkc2FTcGVjCi0KLXByaXZhdGUgamF2YS5tYXRoLkJpZ0ludGVnZXIgeQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1qYXZhLnNlY3VyaXR5LnNwZWMuRFNBUGFyYW1ldGVyU3BlYykKLQotIHZvaWQgPGluaXQ+KAotamF2YS5zZWN1cml0eS5pbnRlcmZhY2VzLkRTQVB1YmxpY0tleSkKLQotIHZvaWQgPGluaXQ+KAotamF2YS5zZWN1cml0eS5zcGVjLkRTQVB1YmxpY0tleVNwZWMpCi0KLSB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LlN1YmplY3RQdWJsaWNLZXlJbmZvKQotCi0gdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5wYXJhbXMuRFNBUHVibGljS2V5UGFyYW1ldGVycykKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QWxnb3JpdGhtKCkKLQotcHVibGljIGJ5dGVbXSBnZXRFbmNvZGVkKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Rm9ybWF0KCkKLQotcHVibGljIGphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcy5EU0FQYXJhbXMgZ2V0UGFyYW1zKCkKLQotcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldFkoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID00MTA0IG5hbWUgPW51bGwgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pES0RTQVNpZ25lcjsgKQotIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES0RTQVNpZ25lciQxIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pES0RTQVNpZ25lcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xMCBuYW1lID1OdWxsRGlnZXN0ICkKLSBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KREtEU0FTaWduZXIkTnVsbERpZ2VzdCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5EaWdlc3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSBiT3V0Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSB2b2lkIDxpbml0PigpCi0KLSB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES0RTQVNpZ25lciQxKQotCi1wdWJsaWMgaW50IGRvRmluYWwoCi1ieXRlW10KLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QWxnb3JpdGhtTmFtZSgpCi0KLXB1YmxpYyBpbnQgZ2V0RGlnZXN0U2l6ZSgpCi0KLXB1YmxpYyB2b2lkIHJlc2V0KCkKLQotcHVibGljIHZvaWQgdXBkYXRlKAotYnl0ZSkKLQotcHVibGljIHZvaWQgdXBkYXRlKAotYnl0ZVtdCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KREtEU0FTaWduZXIkMTtMb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkRLRFNBU2lnbmVyJE51bGxEaWdlc3Q7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pES0RTQVNpZ25lciRub25lRFNBO0xvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KREtEU0FTaWduZXIkc3RkRFNBOyApCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkRLRFNBU2lnbmVyIGV4dGVuZHMgamF2YS5zZWN1cml0eS5TaWduYXR1cmUgaW1wbGVtZW50cyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEucGtjcy5QS0NTT2JqZWN0SWRlbnRpZmllcnMsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5Llg1MDlPYmplY3RJZGVudGlmaWVycwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkRpZ2VzdCBkaWdlc3QKLQotcHJpdmF0ZSBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSByYW5kb20KLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5EU0Egc2lnbmVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uRGlnZXN0Ci1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5EU0EpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgamF2YS5tYXRoLkJpZ0ludGVnZXJbXSBkZXJEZWNvZGUoCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgYnl0ZVtdIGRlckVuY29kZSgKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1qYXZhLm1hdGguQmlnSW50ZWdlcikKLQotcHJvdGVjdGVkIGphdmEubGFuZy5PYmplY3QgZW5naW5lR2V0UGFyYW1ldGVyKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBlbmdpbmVJbml0U2lnbigKLWphdmEuc2VjdXJpdHkuUHJpdmF0ZUtleSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBlbmdpbmVJbml0U2lnbigKLWphdmEuc2VjdXJpdHkuUHJpdmF0ZUtleQotamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgZW5naW5lSW5pdFZlcmlmeSgKLWphdmEuc2VjdXJpdHkuUHVibGljS2V5KQotCi1wcm90ZWN0ZWQgdm9pZCBlbmdpbmVTZXRQYXJhbWV0ZXIoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wcm90ZWN0ZWQgdm9pZCBlbmdpbmVTZXRQYXJhbWV0ZXIoCi1qYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9TaWduYXR1cmVFeGNlcHRpb247ICkKLXByb3RlY3RlZCBieXRlW10gZW5naW5lU2lnbigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvU2lnbmF0dXJlRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBlbmdpbmVVcGRhdGUoCi1ieXRlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L1NpZ25hdHVyZUV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgZW5naW5lVXBkYXRlKAotYnl0ZVtdCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9TaWduYXR1cmVFeGNlcHRpb247ICkKLXByb3RlY3RlZCBib29sZWFuIGVuZ2luZVZlcmlmeSgKLWJ5dGVbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkRLRFNBU2lnbmVyOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9bm9uZURTQSApCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkRLRFNBU2lnbmVyJG5vbmVEU0EgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KREtEU0FTaWduZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1zdGREU0EgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pES0RTQVNpZ25lcjsgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES0RTQVNpZ25lciRzdGREU0EgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KREtEU0FTaWduZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pES0RpZ2VzdFNpZ25hdHVyZSRNRDVXaXRoUlNBRW5jcnlwdGlvbjtMb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkRLRGlnZXN0U2lnbmF0dXJlJE1ENFdpdGhSU0FFbmNyeXB0aW9uO0xvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KREtEaWdlc3RTaWduYXR1cmUkTUQyV2l0aFJTQUVuY3J5cHRpb247TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pES0RpZ2VzdFNpZ25hdHVyZSRTSEE1MTJXaXRoUlNBRW5jcnlwdGlvbjtMb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkRLRGlnZXN0U2lnbmF0dXJlJFNIQTM4NFdpdGhSU0FFbmNyeXB0aW9uO0xvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KREtEaWdlc3RTaWduYXR1cmUkU0hBMjU2V2l0aFJTQUVuY3J5cHRpb247TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pES0RpZ2VzdFNpZ25hdHVyZSRTSEEyMjRXaXRoUlNBRW5jcnlwdGlvbjtMb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkRLRGlnZXN0U2lnbmF0dXJlJFNIQTFXaXRoUlNBRW5jcnlwdGlvbjsgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES0RpZ2VzdFNpZ25hdHVyZSBleHRlbmRzIGphdmEuc2VjdXJpdHkuU2lnbmF0dXJlIGltcGxlbWVudHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLnBrY3MuUEtDU09iamVjdElkZW50aWZpZXJzLCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5YNTA5T2JqZWN0SWRlbnRpZmllcnMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyIGFsZ0lkCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQXN5bW1ldHJpY0Jsb2NrQ2lwaGVyIGNpcGhlcgotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkRpZ2VzdCBkaWdlc3QKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllcgotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uRGlnZXN0Ci1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5Bc3ltbWV0cmljQmxvY2tDaXBoZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgYnl0ZVtdIGRlckVuY29kZSgKLWJ5dGVbXSkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGdldFR5cGUoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wcm90ZWN0ZWQgamF2YS5sYW5nLk9iamVjdCBlbmdpbmVHZXRQYXJhbWV0ZXIoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIGVuZ2luZUluaXRTaWduKAotamF2YS5zZWN1cml0eS5Qcml2YXRlS2V5KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIGVuZ2luZUluaXRWZXJpZnkoCi1qYXZhLnNlY3VyaXR5LlB1YmxpY0tleSkKLQotcHJvdGVjdGVkIHZvaWQgZW5naW5lU2V0UGFyYW1ldGVyKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLk9iamVjdCkKLQotcHJvdGVjdGVkIHZvaWQgZW5naW5lU2V0UGFyYW1ldGVyKAotamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvU2lnbmF0dXJlRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgYnl0ZVtdIGVuZ2luZVNpZ24oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L1NpZ25hdHVyZUV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgZW5naW5lVXBkYXRlKAotYnl0ZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9TaWduYXR1cmVFeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIGVuZ2luZVVwZGF0ZSgKLWJ5dGVbXQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvU2lnbmF0dXJlRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgYm9vbGVhbiBlbmdpbmVWZXJpZnkoCi1ieXRlW10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPU1EMldpdGhSU0FFbmNyeXB0aW9uICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KREtEaWdlc3RTaWduYXR1cmU7ICkKLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KREtEaWdlc3RTaWduYXR1cmUkTUQyV2l0aFJTQUVuY3J5cHRpb24gZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KREtEaWdlc3RTaWduYXR1cmUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KREtEaWdlc3RTaWduYXR1cmU7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1NRDRXaXRoUlNBRW5jcnlwdGlvbiApCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkRLRGlnZXN0U2lnbmF0dXJlJE1ENFdpdGhSU0FFbmNyeXB0aW9uIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkRLRGlnZXN0U2lnbmF0dXJlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9TUQ1V2l0aFJTQUVuY3J5cHRpb24gKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pES0RpZ2VzdFNpZ25hdHVyZTsgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES0RpZ2VzdFNpZ25hdHVyZSRNRDVXaXRoUlNBRW5jcnlwdGlvbiBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES0RpZ2VzdFNpZ25hdHVyZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPVNIQTFXaXRoUlNBRW5jcnlwdGlvbiApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkRLRGlnZXN0U2lnbmF0dXJlOyApCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkRLRGlnZXN0U2lnbmF0dXJlJFNIQTFXaXRoUlNBRW5jcnlwdGlvbiBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES0RpZ2VzdFNpZ25hdHVyZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPVNIQTIyNFdpdGhSU0FFbmNyeXB0aW9uICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KREtEaWdlc3RTaWduYXR1cmU7ICkKLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KREtEaWdlc3RTaWduYXR1cmUkU0hBMjI0V2l0aFJTQUVuY3J5cHRpb24gZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KREtEaWdlc3RTaWduYXR1cmUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1TSEEyNTZXaXRoUlNBRW5jcnlwdGlvbiApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkRLRGlnZXN0U2lnbmF0dXJlOyApCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkRLRGlnZXN0U2lnbmF0dXJlJFNIQTI1NldpdGhSU0FFbmNyeXB0aW9uIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkRLRGlnZXN0U2lnbmF0dXJlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9U0hBMzg0V2l0aFJTQUVuY3J5cHRpb24gKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pES0RpZ2VzdFNpZ25hdHVyZTsgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES0RpZ2VzdFNpZ25hdHVyZSRTSEEzODRXaXRoUlNBRW5jcnlwdGlvbiBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES0RpZ2VzdFNpZ25hdHVyZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPVNIQTUxMldpdGhSU0FFbmNyeXB0aW9uICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KREtEaWdlc3RTaWduYXR1cmU7ICkKLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KREtEaWdlc3RTaWduYXR1cmUkU0hBNTEyV2l0aFJTQUVuY3J5cHRpb24gZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KREtEaWdlc3RTaWduYXR1cmUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1TaWdBbGdQYXJhbWV0ZXJzICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KREtFQ0RTQUFsZ1BhcmFtZXRlcnM7ICkKLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KREtFQ0RTQUFsZ1BhcmFtZXRlcnMkU2lnQWxnUGFyYW1ldGVycyBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES0FsZ29yaXRobVBhcmFtZXRlcnMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSRW5jb2RhYmxlIHBhcmFtcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCBieXRlW10gZW5naW5lR2V0RW5jb2RlZCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCBieXRlW10gZW5naW5lR2V0RW5jb2RlZCgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvc3BlYy9JbnZhbGlkUGFyYW1ldGVyU3BlY0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjIGVuZ2luZUdldFBhcmFtZXRlclNwZWMoCi1qYXZhLmxhbmcuQ2xhc3MpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvc3BlYy9JbnZhbGlkUGFyYW1ldGVyU3BlY0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgZW5naW5lSW5pdCgKLWphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBlbmdpbmVJbml0KAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBlbmdpbmVJbml0KAotYnl0ZVtdCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBlbmdpbmVUb1N0cmluZygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkRLRUNEU0FBbGdQYXJhbWV0ZXJzJFNpZ0FsZ1BhcmFtZXRlcnM7ICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KREtFQ0RTQUFsZ1BhcmFtZXRlcnMgZXh0ZW5kcyBqYXZhLnNlY3VyaXR5LkFsZ29yaXRobVBhcmFtZXRlcnNTcGkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pES0lTT1NpZ25hdHVyZSRNRDVXaXRoUlNBRW5jcnlwdGlvbjtMb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkRLSVNPU2lnbmF0dXJlJFNIQTFXaXRoUlNBRW5jcnlwdGlvbjsgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES0lTT1NpZ25hdHVyZSBleHRlbmRzIGphdmEuc2VjdXJpdHkuU2lnbmF0dXJlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uc2lnbmVycy5JU085Nzk2ZDJTaWduZXIgc2lnbmVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uRGlnZXN0Ci1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5Bc3ltbWV0cmljQmxvY2tDaXBoZXIpCi0KLXByb3RlY3RlZCBqYXZhLmxhbmcuT2JqZWN0IGVuZ2luZUdldFBhcmFtZXRlcigKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgZW5naW5lSW5pdFNpZ24oCi1qYXZhLnNlY3VyaXR5LlByaXZhdGVLZXkpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgZW5naW5lSW5pdFZlcmlmeSgKLWphdmEuc2VjdXJpdHkuUHVibGljS2V5KQotCi1wcm90ZWN0ZWQgdm9pZCBlbmdpbmVTZXRQYXJhbWV0ZXIoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wcm90ZWN0ZWQgdm9pZCBlbmdpbmVTZXRQYXJhbWV0ZXIoCi1qYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9TaWduYXR1cmVFeGNlcHRpb247ICkKLXByb3RlY3RlZCBieXRlW10gZW5naW5lU2lnbigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvU2lnbmF0dXJlRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBlbmdpbmVVcGRhdGUoCi1ieXRlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L1NpZ25hdHVyZUV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgZW5naW5lVXBkYXRlKAotYnl0ZVtdCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9TaWduYXR1cmVFeGNlcHRpb247ICkKLXByb3RlY3RlZCBib29sZWFuIGVuZ2luZVZlcmlmeSgKLWJ5dGVbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkRLSVNPU2lnbmF0dXJlOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9TUQ1V2l0aFJTQUVuY3J5cHRpb24gKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES0lTT1NpZ25hdHVyZSRNRDVXaXRoUlNBRW5jcnlwdGlvbiBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES0lTT1NpZ25hdHVyZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pES0lTT1NpZ25hdHVyZTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPVNIQTFXaXRoUlNBRW5jcnlwdGlvbiApCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkRLSVNPU2lnbmF0dXJlJFNIQTFXaXRoUlNBRW5jcnlwdGlvbiBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES0lTT1NpZ25hdHVyZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkRLS2V5RmFjdG9yeSRFQ0RIQztMb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkRLS2V5RmFjdG9yeSRFQ0RIO0xvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KREtLZXlGYWN0b3J5JEVDR09TVDM0MTA7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pES0tleUZhY3RvcnkkRUNEU0E7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pES0tleUZhY3RvcnkkRUM7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pES0tleUZhY3RvcnkkWDUwOTtMb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkRLS2V5RmFjdG9yeSRFbEdhbWFsO0xvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KREtLZXlGYWN0b3J5JEdPU1QzNDEwO0xvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KREtLZXlGYWN0b3J5JERTQTtMb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkRLS2V5RmFjdG9yeSRESDtMb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkRLS2V5RmFjdG9yeSRSU0E7ICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KREtLZXlGYWN0b3J5IGV4dGVuZHMgamF2YS5zZWN1cml0eS5LZXlGYWN0b3J5U3BpCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCBib29sZWFuIGVsR2FtYWxGYWN0b3J5Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotc3RhdGljIGphdmEuc2VjdXJpdHkuUHJpdmF0ZUtleSBjcmVhdGVQcml2YXRlS2V5RnJvbURFUlN0cmVhbSgKLWJ5dGVbXSkKLQotc3RhdGljIGphdmEuc2VjdXJpdHkuUHJpdmF0ZUtleSBjcmVhdGVQcml2YXRlS2V5RnJvbVByaXZhdGVLZXlJbmZvKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLnBrY3MuUHJpdmF0ZUtleUluZm8pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXN0YXRpYyBqYXZhLnNlY3VyaXR5LlB1YmxpY0tleSBjcmVhdGVQdWJsaWNLZXlGcm9tREVSU3RyZWFtKAotYnl0ZVtdKQotCi1zdGF0aWMgamF2YS5zZWN1cml0eS5QdWJsaWNLZXkgY3JlYXRlUHVibGljS2V5RnJvbVB1YmxpY0tleUluZm8oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5TdWJqZWN0UHVibGljS2V5SW5mbykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9zcGVjL0ludmFsaWRLZXlTcGVjRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgamF2YS5zZWN1cml0eS5zcGVjLktleVNwZWMgZW5naW5lR2V0S2V5U3BlYygKLWphdmEuc2VjdXJpdHkuS2V5Ci1qYXZhLmxhbmcuQ2xhc3MpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGphdmEuc2VjdXJpdHkuS2V5IGVuZ2luZVRyYW5zbGF0ZUtleSgKLWphdmEuc2VjdXJpdHkuS2V5KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KREtLZXlGYWN0b3J5OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9REggKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES0tleUZhY3RvcnkkREggZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KREtLZXlGYWN0b3J5Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9zcGVjL0ludmFsaWRLZXlTcGVjRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgamF2YS5zZWN1cml0eS5Qcml2YXRlS2V5IGVuZ2luZUdlbmVyYXRlUHJpdmF0ZSgKLWphdmEuc2VjdXJpdHkuc3BlYy5LZXlTcGVjKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L3NwZWMvSW52YWxpZEtleVNwZWNFeGNlcHRpb247ICkKLXByb3RlY3RlZCBqYXZhLnNlY3VyaXR5LlB1YmxpY0tleSBlbmdpbmVHZW5lcmF0ZVB1YmxpYygKLWphdmEuc2VjdXJpdHkuc3BlYy5LZXlTcGVjKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KREtLZXlGYWN0b3J5OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9RFNBICkKLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KREtLZXlGYWN0b3J5JERTQSBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES0tleUZhY3RvcnkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L3NwZWMvSW52YWxpZEtleVNwZWNFeGNlcHRpb247ICkKLXByb3RlY3RlZCBqYXZhLnNlY3VyaXR5LlByaXZhdGVLZXkgZW5naW5lR2VuZXJhdGVQcml2YXRlKAotamF2YS5zZWN1cml0eS5zcGVjLktleVNwZWMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvc3BlYy9JbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGphdmEuc2VjdXJpdHkuUHVibGljS2V5IGVuZ2luZUdlbmVyYXRlUHVibGljKAotamF2YS5zZWN1cml0eS5zcGVjLktleVNwZWMpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPUVDICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KREtLZXlGYWN0b3J5OyApCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkRLS2V5RmFjdG9yeSRFQyBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES0tleUZhY3RvcnkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGphdmEubGFuZy5TdHJpbmcgYWxnb3JpdGhtCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9zcGVjL0ludmFsaWRLZXlTcGVjRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgamF2YS5zZWN1cml0eS5Qcml2YXRlS2V5IGVuZ2luZUdlbmVyYXRlUHJpdmF0ZSgKLWphdmEuc2VjdXJpdHkuc3BlYy5LZXlTcGVjKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L3NwZWMvSW52YWxpZEtleVNwZWNFeGNlcHRpb247ICkKLXByb3RlY3RlZCBqYXZhLnNlY3VyaXR5LlB1YmxpY0tleSBlbmdpbmVHZW5lcmF0ZVB1YmxpYygKLWphdmEuc2VjdXJpdHkuc3BlYy5LZXlTcGVjKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1FQ0RIICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KREtLZXlGYWN0b3J5OyApCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkRLS2V5RmFjdG9yeSRFQ0RIIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkRLS2V5RmFjdG9yeSRFQwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPUVDREhDICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KREtLZXlGYWN0b3J5OyApCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkRLS2V5RmFjdG9yeSRFQ0RIQyBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES0tleUZhY3RvcnkkRUMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1FQ0RTQSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkRLS2V5RmFjdG9yeTsgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES0tleUZhY3RvcnkkRUNEU0EgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KREtLZXlGYWN0b3J5JEVDCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9RUNHT1NUMzQxMCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkRLS2V5RmFjdG9yeTsgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES0tleUZhY3RvcnkkRUNHT1NUMzQxMCBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES0tleUZhY3RvcnkkRUMKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KREtLZXlGYWN0b3J5OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9RWxHYW1hbCApCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkRLS2V5RmFjdG9yeSRFbEdhbWFsIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkRLS2V5RmFjdG9yeQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvc3BlYy9JbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGphdmEuc2VjdXJpdHkuUHJpdmF0ZUtleSBlbmdpbmVHZW5lcmF0ZVByaXZhdGUoCi1qYXZhLnNlY3VyaXR5LnNwZWMuS2V5U3BlYykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9zcGVjL0ludmFsaWRLZXlTcGVjRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgamF2YS5zZWN1cml0eS5QdWJsaWNLZXkgZW5naW5lR2VuZXJhdGVQdWJsaWMoCi1qYXZhLnNlY3VyaXR5LnNwZWMuS2V5U3BlYykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkRLS2V5RmFjdG9yeTsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPUdPU1QzNDEwICkKLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KREtLZXlGYWN0b3J5JEdPU1QzNDEwIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkRLS2V5RmFjdG9yeQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvc3BlYy9JbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGphdmEuc2VjdXJpdHkuUHJpdmF0ZUtleSBlbmdpbmVHZW5lcmF0ZVByaXZhdGUoCi1qYXZhLnNlY3VyaXR5LnNwZWMuS2V5U3BlYykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9zcGVjL0ludmFsaWRLZXlTcGVjRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgamF2YS5zZWN1cml0eS5QdWJsaWNLZXkgZW5naW5lR2VuZXJhdGVQdWJsaWMoCi1qYXZhLnNlY3VyaXR5LnNwZWMuS2V5U3BlYykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9UlNBICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KREtLZXlGYWN0b3J5OyApCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkRLS2V5RmFjdG9yeSRSU0EgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KREtLZXlGYWN0b3J5Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9zcGVjL0ludmFsaWRLZXlTcGVjRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgamF2YS5zZWN1cml0eS5Qcml2YXRlS2V5IGVuZ2luZUdlbmVyYXRlUHJpdmF0ZSgKLWphdmEuc2VjdXJpdHkuc3BlYy5LZXlTcGVjKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L3NwZWMvSW52YWxpZEtleVNwZWNFeGNlcHRpb247ICkKLXByb3RlY3RlZCBqYXZhLnNlY3VyaXR5LlB1YmxpY0tleSBlbmdpbmVHZW5lcmF0ZVB1YmxpYygKLWphdmEuc2VjdXJpdHkuc3BlYy5LZXlTcGVjKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KREtLZXlGYWN0b3J5OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9WDUwOSApCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkRLS2V5RmFjdG9yeSRYNTA5IGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkRLS2V5RmFjdG9yeQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvc3BlYy9JbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGphdmEuc2VjdXJpdHkuUHJpdmF0ZUtleSBlbmdpbmVHZW5lcmF0ZVByaXZhdGUoCi1qYXZhLnNlY3VyaXR5LnNwZWMuS2V5U3BlYykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9zcGVjL0ludmFsaWRLZXlTcGVjRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgamF2YS5zZWN1cml0eS5QdWJsaWNLZXkgZW5naW5lR2VuZXJhdGVQdWJsaWMoCi1qYXZhLnNlY3VyaXR5LnNwZWMuS2V5U3BlYykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KREtLZXlQYWlyR2VuZXJhdG9yJERTQTtMb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkRLS2V5UGFpckdlbmVyYXRvciRESDtMb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkRLS2V5UGFpckdlbmVyYXRvciRSU0E7ICkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KREtLZXlQYWlyR2VuZXJhdG9yIGV4dGVuZHMgamF2YS5zZWN1cml0eS5LZXlQYWlyR2VuZXJhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IGphdmEuc2VjdXJpdHkuS2V5UGFpciBnZW5lcmF0ZUtleVBhaXIoKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBpbml0aWFsaXplKAotaW50Ci1qYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9REggKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pES0tleVBhaXJHZW5lcmF0b3I7ICkKLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KREtLZXlQYWlyR2VuZXJhdG9yJERIIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkRLS2V5UGFpckdlbmVyYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gaW50IGNlcnRhaW50eQotCi0gb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uZ2VuZXJhdG9ycy5ESEJhc2ljS2V5UGFpckdlbmVyYXRvciBlbmdpbmUKLQotIGJvb2xlYW4gaW5pdGlhbGlzZWQKLQotIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLnBhcmFtcy5ESEtleUdlbmVyYXRpb25QYXJhbWV0ZXJzIHBhcmFtCi0KLSBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSByYW5kb20KLQotIGludCBzdHJlbmd0aAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBqYXZhLnNlY3VyaXR5LktleVBhaXIgZ2VuZXJhdGVLZXlQYWlyKCkKLQotcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgKLWludAotamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgKLWphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjCi1qYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkRLS2V5UGFpckdlbmVyYXRvcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPURTQSApCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkRLS2V5UGFpckdlbmVyYXRvciREU0EgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KREtLZXlQYWlyR2VuZXJhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBpbnQgY2VydGFpbnR5Ci0KLSBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5nZW5lcmF0b3JzLkRTQUtleVBhaXJHZW5lcmF0b3IgZW5naW5lCi0KLSBib29sZWFuIGluaXRpYWxpc2VkCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5wYXJhbXMuRFNBS2V5R2VuZXJhdGlvblBhcmFtZXRlcnMgcGFyYW0KLQotIGphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tIHJhbmRvbQotCi0gaW50IHN0cmVuZ3RoCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIGphdmEuc2VjdXJpdHkuS2V5UGFpciBnZW5lcmF0ZUtleVBhaXIoKQotCi1wdWJsaWMgdm9pZCBpbml0aWFsaXplKAotaW50Ci1qYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBpbml0aWFsaXplKAotamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWMKLWphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KREtLZXlQYWlyR2VuZXJhdG9yOyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9UlNBICkKLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KREtLZXlQYWlyR2VuZXJhdG9yJFJTQSBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES0tleVBhaXJHZW5lcmF0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIGphdmEubWF0aC5CaWdJbnRlZ2VyIGRlZmF1bHRQdWJsaWNFeHBvbmVudAotCi1zdGF0aWMgZmluYWwgaW50IGRlZmF1bHRUZXN0cwotCi0gb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uZ2VuZXJhdG9ycy5SU0FLZXlQYWlyR2VuZXJhdG9yIGVuZ2luZQotCi0gb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ucGFyYW1zLlJTQUtleUdlbmVyYXRpb25QYXJhbWV0ZXJzIHBhcmFtCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgamF2YS5zZWN1cml0eS5LZXlQYWlyIGdlbmVyYXRlS2V5UGFpcigpCi0KLXB1YmxpYyB2b2lkIGluaXRpYWxpemUoCi1pbnQKLWphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGluaXRpYWxpemUoCi1qYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYwotamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkRLS2V5U3RvcmUkQm91bmN5Q2FzdGxlU3RvcmU7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pES0tleVN0b3JlJFN0b3JlRW50cnk7ICkKLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KREtLZXlTdG9yZSBleHRlbmRzIGphdmEuc2VjdXJpdHkuS2V5U3RvcmVTcGkgaW1wbGVtZW50cyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5pbnRlcmZhY2VzLkJDS2V5U3RvcmUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIGludCBDRVJUSUZJQ0FURQotCi1zdGF0aWMgZmluYWwgaW50IEtFWQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEtFWV9DSVBIRVIKLQotc3RhdGljIGZpbmFsIGludCBLRVlfUFJJVkFURQotCi1zdGF0aWMgZmluYWwgaW50IEtFWV9QVUJMSUMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEtFWV9TQUxUX1NJWkUKLQotc3RhdGljIGZpbmFsIGludCBLRVlfU0VDUkVUCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNSU5fSVRFUkFUSU9OUwotCi1zdGF0aWMgZmluYWwgaW50IE5VTEwKLQotc3RhdGljIGZpbmFsIGludCBTRUFMRUQKLQotc3RhdGljIGZpbmFsIGludCBTRUNSRVQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTVE9SRV9DSVBIRVIKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUT1JFX1NBTFRfU0laRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RPUkVfVkVSU0lPTgotCi1wcm90ZWN0ZWQgamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20gcmFuZG9tCi0KLXByb3RlY3RlZCBqYXZhLnV0aWwuSGFzaHRhYmxlIHRhYmxlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotc3RhdGljIHZvaWQgYWNjZXNzJDAwMCgKLW9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES0tleVN0b3JlCi1qYXZhLnNlY3VyaXR5LktleQotamF2YS5pby5EYXRhT3V0cHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1zdGF0aWMgamF2YS5zZWN1cml0eS5LZXkgYWNjZXNzJDEwMCgKLW9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES0tleVN0b3JlCi1qYXZhLmlvLkRhdGFJbnB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGUgZGVjb2RlQ2VydGlmaWNhdGUoCi1qYXZhLmlvLkRhdGFJbnB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBqYXZhLnNlY3VyaXR5LktleSBkZWNvZGVLZXkoCi1qYXZhLmlvLkRhdGFJbnB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIGVuY29kZUNlcnRpZmljYXRlKAotamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlCi1qYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCBlbmNvZGVLZXkoCi1qYXZhLnNlY3VyaXR5LktleQotamF2YS5pby5EYXRhT3V0cHV0U3RyZWFtKQotCi1wdWJsaWMgamF2YS51dGlsLkVudW1lcmF0aW9uIGVuZ2luZUFsaWFzZXMoKQotCi1wdWJsaWMgYm9vbGVhbiBlbmdpbmVDb250YWluc0FsaWFzKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9LZXlTdG9yZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgZW5naW5lRGVsZXRlRW50cnkoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlIGVuZ2luZUdldENlcnRpZmljYXRlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZW5naW5lR2V0Q2VydGlmaWNhdGVBbGlhcygKLWphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZSkKLQotcHVibGljIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZVtdIGVuZ2luZUdldENlcnRpZmljYXRlQ2hhaW4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS51dGlsLkRhdGUgZW5naW5lR2V0Q3JlYXRpb25EYXRlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247TGphdmEvc2VjdXJpdHkvVW5yZWNvdmVyYWJsZUtleUV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuc2VjdXJpdHkuS2V5IGVuZ2luZUdldEtleSgKLWphdmEubGFuZy5TdHJpbmcKLWNoYXJbXSkKLQotcHVibGljIGJvb2xlYW4gZW5naW5lSXNDZXJ0aWZpY2F0ZUVudHJ5KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJvb2xlYW4gZW5naW5lSXNLZXlFbnRyeSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGVuZ2luZUxvYWQoCi1qYXZhLmlvLklucHV0U3RyZWFtCi1jaGFyW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvS2V5U3RvcmVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGVuZ2luZVNldENlcnRpZmljYXRlRW50cnkoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvS2V5U3RvcmVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGVuZ2luZVNldEtleUVudHJ5KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5zZWN1cml0eS5LZXkKLWNoYXJbXQotamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvS2V5U3RvcmVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGVuZ2luZVNldEtleUVudHJ5KAotamF2YS5sYW5nLlN0cmluZwotYnl0ZVtdCi1qYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVbXSkKLQotcHVibGljIGludCBlbmdpbmVTaXplKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgZW5naW5lU3RvcmUoCi1qYXZhLmlvLk91dHB1dFN0cmVhbQotY2hhcltdKQotCi1wcm90ZWN0ZWQgYm9vbGVhbiBpc1NhbWVBcygKLWJ5dGVbXQotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBsb2FkU3RvcmUoCi1qYXZhLmlvLklucHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgamF2YXguY3J5cHRvLkNpcGhlciBtYWtlUEJFQ2lwaGVyKAotamF2YS5sYW5nLlN0cmluZwotaW50Ci1jaGFyW10KLWJ5dGVbXQotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBzYXZlU3RvcmUoCi1qYXZhLmlvLk91dHB1dFN0cmVhbSkKLQotcHVibGljIHZvaWQgc2V0UmFuZG9tKAotamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPUJvdW5jeUNhc3RsZVN0b3JlICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KREtLZXlTdG9yZTsgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES0tleVN0b3JlJEJvdW5jeUNhc3RsZVN0b3JlIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkRLS2V5U3RvcmUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBlbmdpbmVMb2FkKAotamF2YS5pby5JbnB1dFN0cmVhbQotY2hhcltdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBlbmdpbmVTdG9yZSgKLWphdmEuaW8uT3V0cHV0U3RyZWFtCi1jaGFyW10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPVN0b3JlRW50cnkgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pES0tleVN0b3JlOyApCi0gY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkRLS2V5U3RvcmUkU3RvcmVFbnRyeSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGphdmEubGFuZy5TdHJpbmcgYWxpYXMKLQotIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZVtdIGNlcnRDaGFpbgotCi0gamF2YS51dGlsLkRhdGUgZGF0ZQotCi0gamF2YS5sYW5nLk9iamVjdCBvYmoKLQotZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkRLS2V5U3RvcmUgdGhpcyQwCi0KLSBpbnQgdHlwZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9FeGNlcHRpb247ICkKLSB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES0tleVN0b3JlCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnNlY3VyaXR5LktleQotY2hhcltdCi1qYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVbXSkKLQotIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkRLS2V5U3RvcmUKLWphdmEubGFuZy5TdHJpbmcKLWphdmEuc2VjdXJpdHkuS2V5Ci1qYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVbXSkKLQotIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkRLS2V5U3RvcmUKLWphdmEubGFuZy5TdHJpbmcKLWphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZSkKLQotIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkRLS2V5U3RvcmUKLWphdmEubGFuZy5TdHJpbmcKLWphdmEudXRpbC5EYXRlCi1pbnQKLWphdmEubGFuZy5PYmplY3QpCi0KLSB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES0tleVN0b3JlCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnV0aWwuRGF0ZQotaW50Ci1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVbXSkKLQotIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkRLS2V5U3RvcmUKLWphdmEubGFuZy5TdHJpbmcKLWJ5dGVbXQotamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlW10pCi0KLSBqYXZhLmxhbmcuU3RyaW5nIGdldEFsaWFzKCkKLQotIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZVtdIGdldENlcnRpZmljYXRlQ2hhaW4oKQotCi0gamF2YS51dGlsLkRhdGUgZ2V0RGF0ZSgpCi0KLSBqYXZhLmxhbmcuT2JqZWN0IGdldE9iamVjdCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L1VucmVjb3ZlcmFibGVLZXlFeGNlcHRpb247ICkKLSBqYXZhLmxhbmcuT2JqZWN0IGdldE9iamVjdCgKLWNoYXJbXSkKLQotIGludCBnZXRUeXBlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KREtNZXNzYWdlRGlnZXN0JE1ENTtMb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkRLTWVzc2FnZURpZ2VzdCRTSEE1MTI7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pES01lc3NhZ2VEaWdlc3QkU0hBMzg0O0xvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KREtNZXNzYWdlRGlnZXN0JFNIQTI1NjtMb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkRLTWVzc2FnZURpZ2VzdCRTSEEyMjQ7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pES01lc3NhZ2VEaWdlc3QkU0hBMTsgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES01lc3NhZ2VEaWdlc3QgZXh0ZW5kcyBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkRpZ2VzdCBkaWdlc3QKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5EaWdlc3QpCi0KLXB1YmxpYyBieXRlW10gZW5naW5lRGlnZXN0KCkKLQotcHVibGljIHZvaWQgZW5naW5lUmVzZXQoKQotCi1wdWJsaWMgdm9pZCBlbmdpbmVVcGRhdGUoCi1ieXRlKQotCi1wdWJsaWMgdm9pZCBlbmdpbmVVcGRhdGUoCi1ieXRlW10KLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1NRDUgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pES01lc3NhZ2VEaWdlc3Q7ICkKLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KREtNZXNzYWdlRGlnZXN0JE1ENSBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES01lc3NhZ2VEaWdlc3QgaW1wbGVtZW50cyBqYXZhLmxhbmcuQ2xvbmVhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0Nsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBjbG9uZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPVNIQTEgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pES01lc3NhZ2VEaWdlc3Q7ICkKLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KREtNZXNzYWdlRGlnZXN0JFNIQTEgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KREtNZXNzYWdlRGlnZXN0IGltcGxlbWVudHMgamF2YS5sYW5nLkNsb25lYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9DbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgY2xvbmUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KREtNZXNzYWdlRGlnZXN0OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9U0hBMjI0ICkKLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KREtNZXNzYWdlRGlnZXN0JFNIQTIyNCBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES01lc3NhZ2VEaWdlc3QgaW1wbGVtZW50cyBqYXZhLmxhbmcuQ2xvbmVhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0Nsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBjbG9uZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPVNIQTI1NiApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkRLTWVzc2FnZURpZ2VzdDsgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES01lc3NhZ2VEaWdlc3QkU0hBMjU2IGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkRLTWVzc2FnZURpZ2VzdCBpbXBsZW1lbnRzIGphdmEubGFuZy5DbG9uZWFibGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGNsb25lKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9U0hBMzg0ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KREtNZXNzYWdlRGlnZXN0OyApCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkRLTWVzc2FnZURpZ2VzdCRTSEEzODQgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KREtNZXNzYWdlRGlnZXN0IGltcGxlbWVudHMgamF2YS5sYW5nLkNsb25lYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9DbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgY2xvbmUoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1TSEE1MTIgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pES01lc3NhZ2VEaWdlc3Q7ICkKLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KREtNZXNzYWdlRGlnZXN0JFNIQTUxMiBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES01lc3NhZ2VEaWdlc3QgaW1wbGVtZW50cyBqYXZhLmxhbmcuQ2xvbmVhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0Nsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBjbG9uZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkRLUEtDUzEyS2V5U3RvcmUkRGVmUEtDUzEyS2V5U3RvcmU7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pES1BLQ1MxMktleVN0b3JlJEJDUEtDUzEyS2V5U3RvcmU7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pES1BLQ1MxMktleVN0b3JlJENlcnRJZDsgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES1BLQ1MxMktleVN0b3JlIGV4dGVuZHMgamF2YS5zZWN1cml0eS5LZXlTdG9yZVNwaSBpbXBsZW1lbnRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5wa2NzLlBLQ1NPYmplY3RJZGVudGlmaWVycywgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuWDUwOU9iamVjdElkZW50aWZpZXJzLCBvcmcuYm91bmN5Y2FzdGxlLmpjZS5pbnRlcmZhY2VzLkJDS2V5U3RvcmUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGZpbmFsIGludCBDRVJUSUZJQ0FURQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENFUlRfQUxHT1JJVEhNCi0KLXN0YXRpYyBmaW5hbCBpbnQgS0VZCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgS0VZX0FMR09SSVRITQotCi1zdGF0aWMgZmluYWwgaW50IEtFWV9QUklWQVRFCi0KLXN0YXRpYyBmaW5hbCBpbnQgS0VZX1BVQkxJQwotCi1zdGF0aWMgZmluYWwgaW50IEtFWV9TRUNSRVQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1JTl9JVEVSQVRJT05TCi0KLXN0YXRpYyBmaW5hbCBpbnQgTlVMTAotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0FMVF9TSVpFCi0KLXN0YXRpYyBmaW5hbCBpbnQgU0VBTEVECi0KLXN0YXRpYyBmaW5hbCBpbnQgU0VDUkVUCi0KLXByaXZhdGUgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRmFjdG9yeSBjZXJ0RmFjdAotCi1wcml2YXRlIGphdmEudXRpbC5IYXNodGFibGUgY2VydHMKLQotcHJpdmF0ZSBqYXZhLnV0aWwuSGFzaHRhYmxlIGNoYWluQ2VydHMKLQotcHJpdmF0ZSBqYXZhLnV0aWwuSGFzaHRhYmxlIGtleUNlcnRzCi0KLXByaXZhdGUgamF2YS51dGlsLkhhc2h0YWJsZSBrZXlzCi0KLXByaXZhdGUgamF2YS51dGlsLkhhc2h0YWJsZSBsb2NhbElkcwotCi1wcm90ZWN0ZWQgamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20gcmFuZG9tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LlN1YmplY3RLZXlJZGVudGlmaWVyIGFjY2VzcyQwMDAoCi1vcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KREtQS0NTMTJLZXlTdG9yZQotamF2YS5zZWN1cml0eS5QdWJsaWNLZXkpCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuU3ViamVjdEtleUlkZW50aWZpZXIgY3JlYXRlU3ViamVjdEtleUlkKAotamF2YS5zZWN1cml0eS5QdWJsaWNLZXkpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlIGRlY3J5cHREYXRhKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllcgotYnl0ZVtdCi1jaGFyW10KLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByb3RlY3RlZCBieXRlW10gZW5jcnlwdERhdGEoCi1qYXZhLmxhbmcuU3RyaW5nCi1ieXRlW10KLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5wa2NzLlBLQ1MxMlBCRVBhcmFtcwotY2hhcltdKQotCi1wdWJsaWMgamF2YS51dGlsLkVudW1lcmF0aW9uIGVuZ2luZUFsaWFzZXMoKQotCi1wdWJsaWMgYm9vbGVhbiBlbmdpbmVDb250YWluc0FsaWFzKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9LZXlTdG9yZUV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgZW5naW5lRGVsZXRlRW50cnkoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlIGVuZ2luZUdldENlcnRpZmljYXRlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZW5naW5lR2V0Q2VydGlmaWNhdGVBbGlhcygKLWphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZSkKLQotcHVibGljIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZVtdIGVuZ2luZUdldENlcnRpZmljYXRlQ2hhaW4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS51dGlsLkRhdGUgZW5naW5lR2V0Q3JlYXRpb25EYXRlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247TGphdmEvc2VjdXJpdHkvVW5yZWNvdmVyYWJsZUtleUV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuc2VjdXJpdHkuS2V5IGVuZ2luZUdldEtleSgKLWphdmEubGFuZy5TdHJpbmcKLWNoYXJbXSkKLQotcHVibGljIGJvb2xlYW4gZW5naW5lSXNDZXJ0aWZpY2F0ZUVudHJ5KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJvb2xlYW4gZW5naW5lSXNLZXlFbnRyeSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGVuZ2luZUxvYWQoCi1qYXZhLmlvLklucHV0U3RyZWFtCi1jaGFyW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvS2V5U3RvcmVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGVuZ2luZVNldENlcnRpZmljYXRlRW50cnkoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvS2V5U3RvcmVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGVuZ2luZVNldEtleUVudHJ5KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5zZWN1cml0eS5LZXkKLWNoYXJbXQotamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvS2V5U3RvcmVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGVuZ2luZVNldEtleUVudHJ5KAotamF2YS5sYW5nLlN0cmluZwotYnl0ZVtdCi1qYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVbXSkKLQotcHVibGljIGludCBlbmdpbmVTaXplKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgZW5naW5lU3RvcmUoCi1qYXZhLmlvLk91dHB1dFN0cmVhbQotY2hhcltdKQotCi1wdWJsaWMgdm9pZCBzZXRSYW5kb20oCi1qYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGphdmEuc2VjdXJpdHkuUHJpdmF0ZUtleSB1bndyYXBLZXkoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyCi1ieXRlW10KLWNoYXJbXQotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIGJ5dGVbXSB3cmFwS2V5KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5zZWN1cml0eS5LZXkKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5wa2NzLlBLQ1MxMlBCRVBhcmFtcwotY2hhcltdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1CQ1BLQ1MxMktleVN0b3JlICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KREtQS0NTMTJLZXlTdG9yZTsgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES1BLQ1MxMktleVN0b3JlJEJDUEtDUzEyS2V5U3RvcmUgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KREtQS0NTMTJLZXlTdG9yZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0yIG5hbWUgPUNlcnRJZCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkRLUEtDUzEyS2V5U3RvcmU7ICkKLSBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KREtQS0NTMTJLZXlTdG9yZSRDZXJ0SWQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBieXRlW10gaWQKLQotZmluYWwgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkRLUEtDUzEyS2V5U3RvcmUgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkRLUEtDUzEyS2V5U3RvcmUKLWphdmEuc2VjdXJpdHkuUHVibGljS2V5KQotCi0gdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KREtQS0NTMTJLZXlTdG9yZQotYnl0ZVtdKQotCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoCi1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkRLUEtDUzEyS2V5U3RvcmU7ICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1EZWZQS0NTMTJLZXlTdG9yZSApCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkRLUEtDUzEyS2V5U3RvcmUkRGVmUEtDUzEyS2V5U3RvcmUgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KREtQS0NTMTJLZXlTdG9yZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLk1lbWJlckNsYXNzZXMgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkRLUFNTU2lnbmVyJFNIQTUxMndpdGhSU0E7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pES1BTU1NpZ25lciRTSEEzODR3aXRoUlNBO0xvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KREtQU1NTaWduZXIkU0hBMjU2d2l0aFJTQTtMb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkRLUFNTU2lnbmVyJFNIQTIyNHdpdGhSU0E7TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pES1BTU1NpZ25lciRTSEExd2l0aFJTQTtMb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkRLUFNTU2lnbmVyJFBTU3dpdGhSU0E7ICkKLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KREtQU1NTaWduZXIgZXh0ZW5kcyBqYXZhLnNlY3VyaXR5LlNpZ25hdHVyZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkRpZ2VzdCBkaWdlc3QKLQotcHJpdmF0ZSBqYXZhLnNlY3VyaXR5LkFsZ29yaXRobVBhcmFtZXRlcnMgZW5naW5lUGFyYW1zCi0KLXByaXZhdGUgamF2YS5zZWN1cml0eS5zcGVjLlBTU1BhcmFtZXRlclNwZWMgb3JpZ2luYWxTcGVjCi0KLXByaXZhdGUgamF2YS5zZWN1cml0eS5zcGVjLlBTU1BhcmFtZXRlclNwZWMgcGFyYW1TcGVjCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uc2lnbmVycy5QU1NTaWduZXIgcHNzCi0KLXByaXZhdGUgaW50IHNhbHRMZW5ndGgKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5Bc3ltbWV0cmljQmxvY2tDaXBoZXIgc2lnbmVyCi0KLXByaXZhdGUgYnl0ZSB0cmFpbGVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZwotb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQXN5bW1ldHJpY0Jsb2NrQ2lwaGVyCi1qYXZhLnNlY3VyaXR5LnNwZWMuUFNTUGFyYW1ldGVyU3BlYykKLQotcHJpdmF0ZSBieXRlIGdldFRyYWlsZXIoCi1pbnQpCi0KLXByb3RlY3RlZCBqYXZhLmxhbmcuT2JqZWN0IGVuZ2luZUdldFBhcmFtZXRlcigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByb3RlY3RlZCBqYXZhLnNlY3VyaXR5LkFsZ29yaXRobVBhcmFtZXRlcnMgZW5naW5lR2V0UGFyYW1ldGVycygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgZW5naW5lSW5pdFNpZ24oCi1qYXZhLnNlY3VyaXR5LlByaXZhdGVLZXkpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgZW5naW5lSW5pdFNpZ24oCi1qYXZhLnNlY3VyaXR5LlByaXZhdGVLZXkKLWphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247ICkKLXByb3RlY3RlZCB2b2lkIGVuZ2luZUluaXRWZXJpZnkoCi1qYXZhLnNlY3VyaXR5LlB1YmxpY0tleSkKLQotcHJvdGVjdGVkIHZvaWQgZW5naW5lU2V0UGFyYW1ldGVyKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9JbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBlbmdpbmVTZXRQYXJhbWV0ZXIoCi1qYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9TaWduYXR1cmVFeGNlcHRpb247ICkKLXByb3RlY3RlZCBieXRlW10gZW5naW5lU2lnbigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvU2lnbmF0dXJlRXhjZXB0aW9uOyApCi1wcm90ZWN0ZWQgdm9pZCBlbmdpbmVVcGRhdGUoCi1ieXRlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L1NpZ25hdHVyZUV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgZW5naW5lVXBkYXRlKAotYnl0ZVtdCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9TaWduYXR1cmVFeGNlcHRpb247ICkKLXByb3RlY3RlZCBib29sZWFuIGVuZ2luZVZlcmlmeSgKLWJ5dGVbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9UFNTd2l0aFJTQSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkRLUFNTU2lnbmVyOyApCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkRLUFNTU2lnbmVyJFBTU3dpdGhSU0EgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KREtQU1NTaWduZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1TSEExd2l0aFJTQSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkRLUFNTU2lnbmVyOyApCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkRLUFNTU2lnbmVyJFNIQTF3aXRoUlNBIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkRLUFNTU2lnbmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9U0hBMjI0d2l0aFJTQSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkRLUFNTU2lnbmVyOyApCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkRLUFNTU2lnbmVyJFNIQTIyNHdpdGhSU0EgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KREtQU1NTaWduZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1TSEEyNTZ3aXRoUlNBICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9KREtQU1NTaWduZXI7ICkKLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KREtQU1NTaWduZXIkU0hBMjU2d2l0aFJTQSBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES1BTU1NpZ25lcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL0pES1BTU1NpZ25lcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPVNIQTM4NHdpdGhSU0EgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES1BTU1NpZ25lciRTSEEzODR3aXRoUlNBIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkRLUFNTU2lnbmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9U0hBNTEyd2l0aFJTQSApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvSkRLUFNTU2lnbmVyOyApCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuSkRLUFNTU2lnbmVyJFNIQTUxMndpdGhSU0EgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5KREtQU1NTaWduZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpES1g1MDlDZXJ0aWZpY2F0ZUZhY3RvcnkgZXh0ZW5kcyBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVGYWN0b3J5U3BpCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgTUFYX01FTU9SWQotCi1wcml2YXRlIGphdmEuaW8uSW5wdXRTdHJlYW0gY3VycmVudENybFN0cmVhbQotCi1wcml2YXRlIGphdmEuaW8uSW5wdXRTdHJlYW0gY3VycmVudFN0cmVhbQotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5wa2NzLlNpZ25lZERhdGEgc0NybERhdGEKLQotcHJpdmF0ZSBpbnQgc0NybERhdGFPYmplY3RDb3VudAotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5wa2NzLlNpZ25lZERhdGEgc0RhdGEKLQotcHJpdmF0ZSBpbnQgc0RhdGFPYmplY3RDb3VudAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBpbnQgZ2V0TGltaXQoCi1qYXZhLmlvLklucHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L2NlcnQvQ1JMRXhjZXB0aW9uOyApCi1wcml2YXRlIGphdmEuc2VjdXJpdHkuY2VydC5DUkwgcmVhZERFUkNSTCgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xSW5wdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlIHJlYWRERVJDZXJ0aWZpY2F0ZSgKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xSW5wdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWFkTGluZSgKLWphdmEuaW8uSW5wdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvc2VjdXJpdHkvY2VydC9DUkxFeGNlcHRpb247ICkKLXByaXZhdGUgamF2YS5zZWN1cml0eS5jZXJ0LkNSTCByZWFkUEVNQ1JMKAotamF2YS5pby5JbnB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGUgcmVhZFBFTUNlcnRpZmljYXRlKAotamF2YS5pby5JbnB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9jZXJ0L0NSTEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSBqYXZhLnNlY3VyaXR5LmNlcnQuQ1JMIHJlYWRQS0NTN0NSTCgKLWphdmEuaW8uSW5wdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlIHJlYWRQS0NTN0NlcnRpZmljYXRlKAotamF2YS5pby5JbnB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9jZXJ0L0NSTEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuc2VjdXJpdHkuY2VydC5DUkwgZW5naW5lR2VuZXJhdGVDUkwoCi1qYXZhLmlvLklucHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L2NlcnQvQ1JMRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS51dGlsLkNvbGxlY3Rpb24gZW5naW5lR2VuZXJhdGVDUkxzKAotamF2YS5pby5JbnB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoIGVuZ2luZUdlbmVyYXRlQ2VydFBhdGgoCi1qYXZhLmlvLklucHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGggZW5naW5lR2VuZXJhdGVDZXJ0UGF0aCgKLWphdmEuaW8uSW5wdXRTdHJlYW0KLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0UGF0aCBlbmdpbmVHZW5lcmF0ZUNlcnRQYXRoKAotamF2YS51dGlsLkxpc3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZSBlbmdpbmVHZW5lcmF0ZUNlcnRpZmljYXRlKAotamF2YS5pby5JbnB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS51dGlsLkNvbGxlY3Rpb24gZW5naW5lR2VuZXJhdGVDZXJ0aWZpY2F0ZXMoCi1qYXZhLmlvLklucHV0U3RyZWFtKQotCi1wdWJsaWMgamF2YS51dGlsLkl0ZXJhdG9yIGVuZ2luZUdldENlcnRQYXRoRW5jb2RpbmdzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLSBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5PbGRQS0NTMTJQYXJhbWV0ZXJzR2VuZXJhdG9yIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uUEJFUGFyYW1ldGVyc0dlbmVyYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBJVl9NQVRFUklBTAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlfTUFURVJJQUwKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFDX01BVEVSSUFMCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uRGlnZXN0IGRpZ2VzdAotCi1wcml2YXRlIGludCB1Ci0KLXByaXZhdGUgaW50IHYKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5EaWdlc3QpCi0KLXByaXZhdGUgdm9pZCBhZGp1c3QoCi1ieXRlW10KLWludAotYnl0ZVtdKQotCi1wcml2YXRlIGJ5dGVbXSBnZW5lcmF0ZURlcml2ZWRLZXkoCi1pbnQKLWludCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkNpcGhlclBhcmFtZXRlcnMgZ2VuZXJhdGVEZXJpdmVkTWFjUGFyYW1ldGVycygKLWludCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkNpcGhlclBhcmFtZXRlcnMgZ2VuZXJhdGVEZXJpdmVkUGFyYW1ldGVycygKLWludCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkNpcGhlclBhcmFtZXRlcnMgZ2VuZXJhdGVEZXJpdmVkUGFyYW1ldGVycygKLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5Jbm5lckNsYXNzIChhY2Nlc3NGbGFncyA9OSBuYW1lID1VdGlsICkKLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL2pjZS9wcm92aWRlci9QQkU7ICkKLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5QQkUkVXRpbCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5QQkVQYXJhbWV0ZXJzR2VuZXJhdG9yIG1ha2VQQkVHZW5lcmF0b3IoCi1pbnQKLWludCkKLQotc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuY3J5cHRvLkNpcGhlclBhcmFtZXRlcnMgbWFrZVBCRU1hY1BhcmFtZXRlcnMoCi1qYXZheC5jcnlwdG8uc3BlYy5QQkVLZXlTcGVjCi1pbnQKLWludAotaW50KQotCi1zdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQ2lwaGVyUGFyYW1ldGVycyBtYWtlUEJFTWFjUGFyYW1ldGVycygKLW9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRVBCRUtleQotamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWMpCi0KLXN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5DaXBoZXJQYXJhbWV0ZXJzIG1ha2VQQkVQYXJhbWV0ZXJzKAotamF2YXguY3J5cHRvLnNwZWMuUEJFS2V5U3BlYwotaW50Ci1pbnQKLWludAotaW50KQotCi1zdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8uQ2lwaGVyUGFyYW1ldGVycyBtYWtlUEJFUGFyYW1ldGVycygKLW9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkpDRVBCRUtleQotamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWMKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuUEtJWENlcnRQYXRoIGV4dGVuZHMgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuTGlzdCBjZXJ0UGF0aEVuY29kaW5ncwotCi1wcml2YXRlIGphdmEudXRpbC5MaXN0IGNlcnRpZmljYXRlcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRXhjZXB0aW9uOyApCi0gdm9pZCA8aW5pdD4oCi1qYXZhLmlvLklucHV0U3RyZWFtCi1qYXZhLmxhbmcuU3RyaW5nKQotCi0gdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuTGlzdCkKLQotcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdCBzb3J0Q2VydHMoCi1qYXZhLnV0aWwuTGlzdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb247ICkKLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdCB0b0FTTjFPYmplY3QoCi1qYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBieXRlW10gdG9ERVJFbmNvZGVkKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFFbmNvZGFibGUpCi0KLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRDZXJ0aWZpY2F0ZXMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbjsgKQotcHVibGljIGJ5dGVbXSBnZXRFbmNvZGVkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb247ICkKLXB1YmxpYyBieXRlW10gZ2V0RW5jb2RlZCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLnV0aWwuSXRlcmF0b3IgZ2V0RW5jb2RpbmdzKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5QS0lYQ2VydFBhdGhCdWlsZGVyU3BpIGV4dGVuZHMgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoQnVpbGRlclNwaQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvY2VydC9DZXJ0U3RvcmVFeGNlcHRpb247ICkKLXByaXZhdGUgZmluYWwgamF2YS51dGlsLkNvbGxlY3Rpb24gZmluZENlcnRpZmljYXRlcygKLWphdmEuc2VjdXJpdHkuY2VydC5DZXJ0U2VsZWN0b3IKLWphdmEudXRpbC5MaXN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb247ICkKLXByaXZhdGUgZmluYWwgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZSBmaW5kSXNzdWVyKAotamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZQotamF2YS51dGlsLkxpc3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvY2VydC9DZXJ0UGF0aEJ1aWxkZXJFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0UGF0aEJ1aWxkZXJSZXN1bHQgZW5naW5lQnVpbGQoCi1qYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGhQYXJhbWV0ZXJzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydFBhdGhCdWlsZGVyRXhjZXB0aW9uOyApCi1maW5hbCBqYXZhLnNlY3VyaXR5LmNlcnQuVHJ1c3RBbmNob3IgZmluZFRydXN0QW5jaG9yKAotamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZQotamF2YS51dGlsLlNldCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5QS0lYQ2VydFBhdGhWYWxpZGF0b3JTcGkgZXh0ZW5kcyBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGhWYWxpZGF0b3JTcGkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBTllfUE9MSUNZCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQkFTSUNfQ09OU1RSQUlOVFMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDRVJUSUZJQ0FURV9QT0xJQ0lFUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENSTF9OVU1CRVIKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENSTF9TSUdOCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVMVEFfQ1JMX0lORElDQVRPUgotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIElOSElCSVRfQU5ZX1BPTElDWQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIElTU1VJTkdfRElTVFJJQlVUSU9OX1BPSU5UCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBLRVlfQ0VSVF9TSUdOCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgS0VZX1VTQUdFCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTkFNRV9DT05TVFJBSU5UUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBPTElDWV9DT05TVFJBSU5UUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBPTElDWV9NQVBQSU5HUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNVQkpFQ1RfQUxURVJOQVRJVkVfTkFNRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gY3JsUmVhc29ucwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvQW5ub3RhdGVkRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgY2hlY2tDUkxzKAotamF2YS5zZWN1cml0eS5jZXJ0LlBLSVhQYXJhbWV0ZXJzCi1qYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlCi1qYXZhLnV0aWwuRGF0ZQotamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZQotamF2YS5zZWN1cml0eS5QdWJsaWNLZXkpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvY2VydC9DZXJ0UGF0aFZhbGlkYXRvckV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9JbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoVmFsaWRhdG9yUmVzdWx0IGVuZ2luZVZhbGlkYXRlKAotamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoCi1qYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGhQYXJhbWV0ZXJzKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLlBLSVhQb2xpY3lOb2RlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuY2VydC5Qb2xpY3lOb2RlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCBqYXZhLnV0aWwuTGlzdCBjaGlsZHJlbgotCi1wcm90ZWN0ZWQgYm9vbGVhbiBjcml0aWNhbAotCi1wcm90ZWN0ZWQgaW50IGRlcHRoCi0KLXByb3RlY3RlZCBqYXZhLnV0aWwuU2V0IGV4cGVjdGVkUG9saWNpZXMKLQotcHJvdGVjdGVkIGphdmEuc2VjdXJpdHkuY2VydC5Qb2xpY3lOb2RlIHBhcmVudAotCi1wcm90ZWN0ZWQgamF2YS51dGlsLlNldCBwb2xpY3lRdWFsaWZpZXJzCi0KLXByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIHZhbGlkUG9saWN5Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS51dGlsLkxpc3QKLWludAotamF2YS51dGlsLlNldAotamF2YS5zZWN1cml0eS5jZXJ0LlBvbGljeU5vZGUKLWphdmEudXRpbC5TZXQKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIGFkZENoaWxkKAotb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuUEtJWFBvbGljeU5vZGUpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGNsb25lKCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLlBLSVhQb2xpY3lOb2RlIGNvcHkoKQotCi1wdWJsaWMgamF2YS51dGlsLkl0ZXJhdG9yIGdldENoaWxkcmVuKCkKLQotcHVibGljIGludCBnZXREZXB0aCgpCi0KLXB1YmxpYyBqYXZhLnV0aWwuU2V0IGdldEV4cGVjdGVkUG9saWNpZXMoKQotCi1wdWJsaWMgamF2YS5zZWN1cml0eS5jZXJ0LlBvbGljeU5vZGUgZ2V0UGFyZW50KCkKLQotcHVibGljIGphdmEudXRpbC5TZXQgZ2V0UG9saWN5UXVhbGlmaWVycygpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFZhbGlkUG9saWN5KCkKLQotcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKQotCi1wdWJsaWMgYm9vbGVhbiBpc0NyaXRpY2FsKCkKLQotcHVibGljIHZvaWQgcmVtb3ZlQ2hpbGQoCi1vcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5QS0lYUG9saWN5Tm9kZSkKLQotcHVibGljIHZvaWQgc2V0Q3JpdGljYWwoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBzZXRQYXJlbnQoCi1vcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5QS0lYUG9saWN5Tm9kZSkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi0gY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuUlNBVXRpbCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1zdGF0aWMgb3JnLmJvdW5jeWNhc3RsZS5jcnlwdG8ucGFyYW1zLlJTQUtleVBhcmFtZXRlcnMgZ2VuZXJhdGVQcml2YXRlS2V5UGFyYW1ldGVyKAotamF2YS5zZWN1cml0eS5pbnRlcmZhY2VzLlJTQVByaXZhdGVLZXkpCi0KLXN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmNyeXB0by5wYXJhbXMuUlNBS2V5UGFyYW1ldGVycyBnZW5lcmF0ZVB1YmxpY0tleVBhcmFtZXRlcigKLWphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcy5SU0FQdWJsaWNLZXkpCi0KLXN0YXRpYyBib29sZWFuIGlzUnNhT2lkKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID05IG5hbWUgPUFFU1dyYXAgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUvamNlL3Byb3ZpZGVyL1dyYXBDaXBoZXJTcGk7ICkKLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5XcmFwQ2lwaGVyU3BpJEFFU1dyYXAgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5XcmFwQ2lwaGVyU3BpCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTkgbmFtZSA9REVTRURFV3JhcCApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS9qY2UvcHJvdmlkZXIvV3JhcENpcGhlclNwaTsgKQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLldyYXBDaXBoZXJTcGkkREVTRURFV3JhcCBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLldyYXBDaXBoZXJTcGkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLlg1MDlDUkxFbnRyeU9iamVjdCBleHRlbmRzIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q1JMRW50cnkKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5UQlNDZXJ0TGlzdCRDUkxFbnRyeSBjCi0KLXByaXZhdGUgYm9vbGVhbiBpc0luZGlyZWN0Ci0KLXByaXZhdGUgamF2YXguc2VjdXJpdHkuYXV0aC54NTAwLlg1MDBQcmluY2lwYWwgcHJldmlvdXNDZXJ0aWZpY2F0ZUlzc3VlcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LlRCU0NlcnRMaXN0JENSTEVudHJ5KQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5UQlNDZXJ0TGlzdCRDUkxFbnRyeQotYm9vbGVhbgotamF2YXguc2VjdXJpdHkuYXV0aC54NTAwLlg1MDBQcmluY2lwYWwpCi0KLXByaXZhdGUgamF2YS51dGlsLlNldCBnZXRFeHRlbnNpb25PSURzKAotYm9vbGVhbikKLQotcHVibGljIGphdmF4LnNlY3VyaXR5LmF1dGgueDUwMC5YNTAwUHJpbmNpcGFsIGdldENlcnRpZmljYXRlSXNzdWVyKCkKLQotcHVibGljIGphdmEudXRpbC5TZXQgZ2V0Q3JpdGljYWxFeHRlbnNpb25PSURzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9jZXJ0L0NSTEV4Y2VwdGlvbjsgKQotcHVibGljIGJ5dGVbXSBnZXRFbmNvZGVkKCkKLQotcHVibGljIGJ5dGVbXSBnZXRFeHRlbnNpb25WYWx1ZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLnV0aWwuU2V0IGdldE5vbkNyaXRpY2FsRXh0ZW5zaW9uT0lEcygpCi0KLXB1YmxpYyBqYXZhLnV0aWwuRGF0ZSBnZXRSZXZvY2F0aW9uRGF0ZSgpCi0KLXB1YmxpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRTZXJpYWxOdW1iZXIoKQotCi1wdWJsaWMgYm9vbGVhbiBoYXNFeHRlbnNpb25zKCkKLQotcHVibGljIGJvb2xlYW4gaGFzVW5zdXBwb3J0ZWRDcml0aWNhbEV4dGVuc2lvbigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5YNTA5Q1JMT2JqZWN0IGV4dGVuZHMgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDUkwKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5DZXJ0aWZpY2F0ZUxpc3QgYwotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgc2lnQWxnTmFtZQotCi1wcml2YXRlIGJ5dGVbXSBzaWdBbGdQYXJhbXMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L2NlcnQvQ1JMRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5DZXJ0aWZpY2F0ZUxpc3QpCi0KLXByaXZhdGUgamF2YS51dGlsLlNldCBnZXRFeHRlbnNpb25PSURzKAotYm9vbGVhbikKLQotcHJpdmF0ZSBib29sZWFuIGlzSW5kaXJlY3RDUkwoKQotCi1wdWJsaWMgamF2YS51dGlsLlNldCBnZXRDcml0aWNhbEV4dGVuc2lvbk9JRHMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L2NlcnQvQ1JMRXhjZXB0aW9uOyApCi1wdWJsaWMgYnl0ZVtdIGdldEVuY29kZWQoKQotCi1wdWJsaWMgYnl0ZVtdIGdldEV4dGVuc2lvblZhbHVlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsIGdldElzc3VlckROKCkKLQotcHVibGljIGphdmF4LnNlY3VyaXR5LmF1dGgueDUwMC5YNTAwUHJpbmNpcGFsIGdldElzc3Vlclg1MDBQcmluY2lwYWwoKQotCi1wdWJsaWMgamF2YS51dGlsLkRhdGUgZ2V0TmV4dFVwZGF0ZSgpCi0KLXB1YmxpYyBqYXZhLnV0aWwuU2V0IGdldE5vbkNyaXRpY2FsRXh0ZW5zaW9uT0lEcygpCi0KLXB1YmxpYyBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNSTEVudHJ5IGdldFJldm9rZWRDZXJ0aWZpY2F0ZSgKLWphdmEubWF0aC5CaWdJbnRlZ2VyKQotCi1wdWJsaWMgamF2YS51dGlsLlNldCBnZXRSZXZva2VkQ2VydGlmaWNhdGVzKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U2lnQWxnTmFtZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFNpZ0FsZ09JRCgpCi0KLXB1YmxpYyBieXRlW10gZ2V0U2lnQWxnUGFyYW1zKCkKLQotcHVibGljIGJ5dGVbXSBnZXRTaWduYXR1cmUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L2NlcnQvQ1JMRXhjZXB0aW9uOyApCi1wdWJsaWMgYnl0ZVtdIGdldFRCU0NlcnRMaXN0KCkKLQotcHVibGljIGphdmEudXRpbC5EYXRlIGdldFRoaXNVcGRhdGUoKQotCi1wdWJsaWMgaW50IGdldFZlcnNpb24oKQotCi1wdWJsaWMgYm9vbGVhbiBoYXNVbnN1cHBvcnRlZENyaXRpY2FsRXh0ZW5zaW9uKCkKLQotcHVibGljIGJvb2xlYW4gaXNSZXZva2VkKAotamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvY2VydC9DUkxFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvTm9TdWNoUHJvdmlkZXJFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvU2lnbmF0dXJlRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB2ZXJpZnkoCi1qYXZhLnNlY3VyaXR5LlB1YmxpY0tleSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9jZXJ0L0NSTEV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9Ob1N1Y2hQcm92aWRlckV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9TaWduYXR1cmVFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHZlcmlmeSgKLWphdmEuc2VjdXJpdHkuUHVibGljS2V5Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLlg1MDlDZXJ0aWZpY2F0ZU9iamVjdCBleHRlbmRzIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGUgaW1wbGVtZW50cyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5pbnRlcmZhY2VzLlBLQ1MxMkJhZ0F0dHJpYnV0ZUNhcnJpZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5YNTA5Q2VydGlmaWNhdGVTdHJ1Y3R1cmUgYwotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5PcmRlcmVkVGFibGUgcGtjczEyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuWDUwOUNlcnRpZmljYXRlU3RydWN0dXJlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L1NpZ25hdHVyZUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIGNoZWNrU2lnbmF0dXJlKAotamF2YS5zZWN1cml0eS5QdWJsaWNLZXkKLWphdmEuc2VjdXJpdHkuU2lnbmF0dXJlKQotCi1wcml2YXRlIGJ5dGVbXSBnZXRFeHRlbnNpb25CeXRlcygKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUV4cGlyZWRFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZU5vdFlldFZhbGlkRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjaGVja1ZhbGlkaXR5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRXhwaXJlZEV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlTm90WWV0VmFsaWRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNoZWNrVmFsaWRpdHkoCi1qYXZhLnV0aWwuRGF0ZSkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJFbmNvZGFibGUgZ2V0QmFnQXR0cmlidXRlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIpCi0KLXB1YmxpYyBqYXZhLnV0aWwuRW51bWVyYXRpb24gZ2V0QmFnQXR0cmlidXRlS2V5cygpCi0KLXB1YmxpYyBpbnQgZ2V0QmFzaWNDb25zdHJhaW50cygpCi0KLXB1YmxpYyBqYXZhLnV0aWwuU2V0IGdldENyaXRpY2FsRXh0ZW5zaW9uT0lEcygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUVuY29kaW5nRXhjZXB0aW9uOyApCi1wdWJsaWMgYnl0ZVtdIGdldEVuY29kZWQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0RXh0ZW5kZWRLZXlVc2FnZSgpCi0KLXB1YmxpYyBieXRlW10gZ2V0RXh0ZW5zaW9uVmFsdWUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5zZWN1cml0eS5QcmluY2lwYWwgZ2V0SXNzdWVyRE4oKQotCi1wdWJsaWMgYm9vbGVhbltdIGdldElzc3VlclVuaXF1ZUlEKCkKLQotcHVibGljIGphdmF4LnNlY3VyaXR5LmF1dGgueDUwMC5YNTAwUHJpbmNpcGFsIGdldElzc3Vlclg1MDBQcmluY2lwYWwoKQotCi1wdWJsaWMgYm9vbGVhbltdIGdldEtleVVzYWdlKCkKLQotcHVibGljIGphdmEudXRpbC5TZXQgZ2V0Tm9uQ3JpdGljYWxFeHRlbnNpb25PSURzKCkKLQotcHVibGljIGphdmEudXRpbC5EYXRlIGdldE5vdEFmdGVyKCkKLQotcHVibGljIGphdmEudXRpbC5EYXRlIGdldE5vdEJlZm9yZSgpCi0KLXB1YmxpYyBqYXZhLnNlY3VyaXR5LlB1YmxpY0tleSBnZXRQdWJsaWNLZXkoKQotCi1wdWJsaWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgZ2V0U2VyaWFsTnVtYmVyKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U2lnQWxnTmFtZSgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFNpZ0FsZ09JRCgpCi0KLXB1YmxpYyBieXRlW10gZ2V0U2lnQWxnUGFyYW1zKCkKLQotcHVibGljIGJ5dGVbXSBnZXRTaWduYXR1cmUoKQotCi1wdWJsaWMgamF2YS5zZWN1cml0eS5QcmluY2lwYWwgZ2V0U3ViamVjdEROKCkKLQotcHVibGljIGJvb2xlYW5bXSBnZXRTdWJqZWN0VW5pcXVlSUQoKQotCi1wdWJsaWMgamF2YXguc2VjdXJpdHkuYXV0aC54NTAwLlg1MDBQcmluY2lwYWwgZ2V0U3ViamVjdFg1MDBQcmluY2lwYWwoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbjsgKQotcHVibGljIGJ5dGVbXSBnZXRUQlNDZXJ0aWZpY2F0ZSgpCi0KLXB1YmxpYyBpbnQgZ2V0VmVyc2lvbigpCi0KLXB1YmxpYyBib29sZWFuIGhhc1Vuc3VwcG9ydGVkQ3JpdGljYWxFeHRlbnNpb24oKQotCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkKLQotcHVibGljIHZvaWQgc2V0QmFnQXR0cmlidXRlKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJFbmNvZGFibGUpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L05vU3VjaFByb3ZpZGVyRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L1NpZ25hdHVyZUV4Y2VwdGlvbjsgKQotcHVibGljIGZpbmFsIHZvaWQgdmVyaWZ5KAotamF2YS5zZWN1cml0eS5QdWJsaWNLZXkpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9Ob1N1Y2hQcm92aWRlckV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9TaWduYXR1cmVFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCB2b2lkIHZlcmlmeSgKLWphdmEuc2VjdXJpdHkuUHVibGljS2V5Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLlg1MDlTaWduYXR1cmVVdGlsIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMU51bGwgZGVyTnVsbAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXREaWdlc3RBbGdOYW1lKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIpCi0KLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFNpZ25hdHVyZU5hbWUoCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9TaWduYXR1cmVFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjsgKQotc3RhdGljIHZvaWQgc2V0U2lnbmF0dXJlUGFyYW1ldGVycygKLWphdmEuc2VjdXJpdHkuU2lnbmF0dXJlCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSRW5jb2RhYmxlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUuamNlLnNwZWMuSUVLZXlTcGVjIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuc3BlYy5LZXlTcGVjLCBvcmcuYm91bmN5Y2FzdGxlLmpjZS5pbnRlcmZhY2VzLklFU0tleQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEuc2VjdXJpdHkuUHJpdmF0ZUtleSBwcml2S2V5Ci0KLXByaXZhdGUgamF2YS5zZWN1cml0eS5QdWJsaWNLZXkgcHViS2V5Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5zZWN1cml0eS5Qcml2YXRlS2V5Ci1qYXZhLnNlY3VyaXR5LlB1YmxpY0tleSkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QWxnb3JpdGhtKCkKLQotcHVibGljIGJ5dGVbXSBnZXRFbmNvZGVkKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Rm9ybWF0KCkKLQotcHVibGljIGphdmEuc2VjdXJpdHkuUHJpdmF0ZUtleSBnZXRQcml2YXRlKCkKLQotcHVibGljIGphdmEuc2VjdXJpdHkuUHVibGljS2V5IGdldFB1YmxpYygpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5qY2Uuc3BlYy5JRVNQYXJhbWV0ZXJTcGVjIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYnl0ZVtdIGRlcml2YXRpb24KLQotcHJpdmF0ZSBieXRlW10gZW5jb2RpbmcKLQotcHJpdmF0ZSBpbnQgbWFjS2V5U2l6ZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWJ5dGVbXQotYnl0ZVtdCi1pbnQpCi0KLXB1YmxpYyBieXRlW10gZ2V0RGVyaXZhdGlvblYoKQotCi1wdWJsaWMgYnl0ZVtdIGdldEVuY29kaW5nVigpCi0KLXB1YmxpYyBpbnQgZ2V0TWFjS2V5U2l6ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS5vcGVuc3NsLlBFTVdyaXRlciBleHRlbmRzIGphdmEuaW8uQnVmZmVyZWRXcml0ZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmlvLldyaXRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHdyaXRlRW5jb2RlZCgKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHdyaXRlSGV4RW5jb2RlZCgKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgd3JpdGVPYmplY3QoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB3cml0ZU9iamVjdCgKLWphdmEubGFuZy5PYmplY3QKLWphdmEubGFuZy5TdHJpbmcKLWNoYXJbXQotamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgZmluYWwgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS51dGlsLkFycmF5cyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBib29sZWFuIGFyZUVxdWFsKAotYnl0ZVtdCi1ieXRlW10pCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBmaWxsKAotYnl0ZVtdCi1ieXRlKQotCi1wdWJsaWMgc3RhdGljIHZvaWQgZmlsbCgKLWxvbmdbXQotbG9uZykKLQotcHVibGljIHN0YXRpYyB2b2lkIGZpbGwoCi1zaG9ydFtdCi1zaG9ydCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLnV0aWwuQmlnSW50ZWdlcnMgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHN0YXRpYyBieXRlW10gYXNVbnNpZ25lZEJ5dGVBcnJheSgKLWphdmEubWF0aC5CaWdJbnRlZ2VyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUudXRpbC5TdHJpbmdzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBmcm9tVVRGOEJ5dGVBcnJheSgKLWJ5dGVbXSkKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIHRvTG93ZXJDYXNlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBieXRlW10gdG9VVEY4Qnl0ZUFycmF5KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIHRvVXBwZXJDYXNlKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLnV0aWwuZW5jb2RlcnMuQmFzZTY0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYm91bmN5Y2FzdGxlLnV0aWwuZW5jb2RlcnMuRW5jb2RlciBlbmNvZGVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGludCBkZWNvZGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmlvLk91dHB1dFN0cmVhbSkKLQotcHVibGljIHN0YXRpYyBieXRlW10gZGVjb2RlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBieXRlW10gZGVjb2RlKAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIGludCBlbmNvZGUoCi1ieXRlW10KLWludAotaW50Ci1qYXZhLmlvLk91dHB1dFN0cmVhbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBpbnQgZW5jb2RlKAotYnl0ZVtdCi1qYXZhLmlvLk91dHB1dFN0cmVhbSkKLQotcHVibGljIHN0YXRpYyBieXRlW10gZW5jb2RlKAotYnl0ZVtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLnV0aWwuZW5jb2RlcnMuRW5jb2RlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGRlY29kZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEuaW8uT3V0cHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGRlY29kZSgKLWJ5dGVbXQotaW50Ci1pbnQKLWphdmEuaW8uT3V0cHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3QgaW50IGVuY29kZSgKLWJ5dGVbXQotaW50Ci1pbnQKLWphdmEuaW8uT3V0cHV0U3RyZWFtKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUudXRpbC5lbmNvZGVycy5CYXNlNjRFbmNvZGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5ib3VuY3ljYXN0bGUudXRpbC5lbmNvZGVycy5FbmNvZGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCBmaW5hbCBieXRlW10gZGVjb2RpbmdUYWJsZQotCi1wcm90ZWN0ZWQgZmluYWwgYnl0ZVtdIGVuY29kaW5nVGFibGUKLQotcHJvdGVjdGVkIGJ5dGUgcGFkZGluZwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXByaXZhdGUgaW50IGRlY29kZUxhc3RCbG9jaygKLWphdmEuaW8uT3V0cHV0U3RyZWFtCi1jaGFyCi1jaGFyCi1jaGFyCi1jaGFyKQotCi1wcml2YXRlIGJvb2xlYW4gaWdub3JlKAotY2hhcikKLQotcHJpdmF0ZSBpbnQgbmV4dEkoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQKLWludCkKLQotcHJpdmF0ZSBpbnQgbmV4dEkoCi1ieXRlW10KLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGRlY29kZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEuaW8uT3V0cHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGRlY29kZSgKLWJ5dGVbXQotaW50Ci1pbnQKLWphdmEuaW8uT3V0cHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGVuY29kZSgKLWJ5dGVbXQotaW50Ci1pbnQKLWphdmEuaW8uT3V0cHV0U3RyZWFtKQotCi1wcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXNlRGVjb2RpbmdUYWJsZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS51dGlsLmVuY29kZXJzLkJ1ZmZlcmVkRGVjb2RlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIGJ5dGVbXSBidWYKLQotcHJvdGVjdGVkIGludCBidWZPZmYKLQotcHJvdGVjdGVkIG9yZy5ib3VuY3ljYXN0bGUudXRpbC5lbmNvZGVycy5UcmFuc2xhdG9yIHRyYW5zbGF0b3IKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLnV0aWwuZW5jb2RlcnMuVHJhbnNsYXRvcgotaW50KQotCi1wdWJsaWMgaW50IHByb2Nlc3NCeXRlKAotYnl0ZQotYnl0ZVtdCi1pbnQpCi0KLXB1YmxpYyBpbnQgcHJvY2Vzc0J5dGVzKAotYnl0ZVtdCi1pbnQKLWludAotYnl0ZVtdCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS51dGlsLmVuY29kZXJzLkJ1ZmZlcmVkRW5jb2RlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJvdGVjdGVkIGJ5dGVbXSBidWYKLQotcHJvdGVjdGVkIGludCBidWZPZmYKLQotcHJvdGVjdGVkIG9yZy5ib3VuY3ljYXN0bGUudXRpbC5lbmNvZGVycy5UcmFuc2xhdG9yIHRyYW5zbGF0b3IKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLnV0aWwuZW5jb2RlcnMuVHJhbnNsYXRvcgotaW50KQotCi1wdWJsaWMgaW50IHByb2Nlc3NCeXRlKAotYnl0ZQotYnl0ZVtdCi1pbnQpCi0KLXB1YmxpYyBpbnQgcHJvY2Vzc0J5dGVzKAotYnl0ZVtdCi1pbnQKLWludAotYnl0ZVtdCi1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS51dGlsLmVuY29kZXJzLkhleCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS51dGlsLmVuY29kZXJzLkVuY29kZXIgZW5jb2RlcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBpbnQgZGVjb2RlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5pby5PdXRwdXRTdHJlYW0pCi0KLXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGRlY29kZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGRlY29kZSgKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBpbnQgZW5jb2RlKAotYnl0ZVtdCi1pbnQKLWludAotamF2YS5pby5PdXRwdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgaW50IGVuY29kZSgKLWJ5dGVbXQotamF2YS5pby5PdXRwdXRTdHJlYW0pCi0KLXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGVuY29kZSgKLWJ5dGVbXSkKLQotcHVibGljIHN0YXRpYyBieXRlW10gZW5jb2RlKAotYnl0ZVtdCi1pbnQKLWludCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLnV0aWwuZW5jb2RlcnMuSGV4RW5jb2RlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYm91bmN5Y2FzdGxlLnV0aWwuZW5jb2RlcnMuRW5jb2RlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgZmluYWwgYnl0ZVtdIGRlY29kaW5nVGFibGUKLQotcHJvdGVjdGVkIGZpbmFsIGJ5dGVbXSBlbmNvZGluZ1RhYmxlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHJpdmF0ZSBib29sZWFuIGlnbm9yZSgKLWNoYXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgZGVjb2RlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5pby5PdXRwdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgZGVjb2RlKAotYnl0ZVtdCi1pbnQKLWludAotamF2YS5pby5PdXRwdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgZW5jb2RlKAotYnl0ZVtdCi1pbnQKLWludAotamF2YS5pby5PdXRwdXRTdHJlYW0pCi0KLXByb3RlY3RlZCB2b2lkIGluaXRpYWxpc2VEZWNvZGluZ1RhYmxlKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS51dGlsLmVuY29kZXJzLlRyYW5zbGF0b3IgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IGludCBkZWNvZGUoCi1ieXRlW10KLWludAotaW50Ci1ieXRlW10KLWludCkKLQotcHVibGljIGFic3RyYWN0IGludCBlbmNvZGUoCi1ieXRlW10KLWludAotaW50Ci1ieXRlW10KLWludCkKLQotcHVibGljIGFic3RyYWN0IGludCBnZXREZWNvZGVkQmxvY2tTaXplKCkKLQotcHVibGljIGFic3RyYWN0IGludCBnZXRFbmNvZGVkQmxvY2tTaXplKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLnV0aWwuZW5jb2RlcnMuSGV4VHJhbnNsYXRvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcuYm91bmN5Y2FzdGxlLnV0aWwuZW5jb2RlcnMuVHJhbnNsYXRvcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gaGV4VGFibGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBpbnQgZGVjb2RlKAotYnl0ZVtdCi1pbnQKLWludAotYnl0ZVtdCi1pbnQpCi0KLXB1YmxpYyBpbnQgZW5jb2RlKAotYnl0ZVtdCi1pbnQKLWludAotYnl0ZVtdCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0RGVjb2RlZEJsb2NrU2l6ZSgpCi0KLXB1YmxpYyBpbnQgZ2V0RW5jb2RlZEJsb2NrU2l6ZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS51dGlsLmVuY29kZXJzLlVybEJhc2U2NCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmJvdW5jeWNhc3RsZS51dGlsLmVuY29kZXJzLkVuY29kZXIgZW5jb2RlcgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBpbnQgZGVjb2RlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5pby5PdXRwdXRTdHJlYW0pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgaW50IGRlY29kZSgKLWJ5dGVbXQotamF2YS5pby5PdXRwdXRTdHJlYW0pCi0KLXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGRlY29kZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGRlY29kZSgKLWJ5dGVbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBpbnQgZW5jb2RlKAotYnl0ZVtdCi1qYXZhLmlvLk91dHB1dFN0cmVhbSkKLQotcHVibGljIHN0YXRpYyBieXRlW10gZW5jb2RlKAotYnl0ZVtdKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUudXRpbC5lbmNvZGVycy5VcmxCYXNlNjRFbmNvZGVyIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS51dGlsLmVuY29kZXJzLkJhc2U2NEVuY29kZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUueDUwOS5BdHRyaWJ1dGVDZXJ0aWZpY2F0ZUhvbGRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFNlbGVjdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkhvbGRlciBob2xkZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZheC5zZWN1cml0eS5hdXRoLng1MDAuWDUwMFByaW5jaXBhbCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YXguc2VjdXJpdHkuYXV0aC54NTAwLlg1MDBQcmluY2lwYWwKLWphdmEubWF0aC5CaWdJbnRlZ2VyKQotCi0gdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmpjZS5YNTA5UHJpbmNpcGFsKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmpjZS5YNTA5UHJpbmNpcGFsCi1qYXZhLm1hdGguQmlnSW50ZWdlcikKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5HZW5lcmFsTmFtZXMgZ2VuZXJhdGVHZW5lcmFsTmFtZXMoCi1vcmcuYm91bmN5Y2FzdGxlLmpjZS5YNTA5UHJpbmNpcGFsKQotCi1wcml2YXRlIGphdmEubGFuZy5PYmplY3RbXSBnZXROYW1lcygKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkdlbmVyYWxOYW1lW10pCi0KLXByaXZhdGUgamF2YS5zZWN1cml0eS5QcmluY2lwYWxbXSBnZXRQcmluY2lwYWxzKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuR2VuZXJhbE5hbWVzKQotCi1wcml2YXRlIGJvb2xlYW4gbWF0Y2hlc0ROKAotb3JnLmJvdW5jeWNhc3RsZS5qY2UuWDUwOVByaW5jaXBhbAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuR2VuZXJhbE5hbWVzKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBjbG9uZSgpCi0KLXB1YmxpYyBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbFtdIGdldEVudGl0eU5hbWVzKCkKLQotcHVibGljIGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsW10gZ2V0SXNzdWVyKCkKLQotcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldFNlcmlhbE51bWJlcigpCi0KLXB1YmxpYyBib29sZWFuIG1hdGNoKAotamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUueDUwOS5BdHRyaWJ1dGVDZXJ0aWZpY2F0ZUlzc3VlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFNlbGVjdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLWZpbmFsIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlIGZvcm0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZheC5zZWN1cml0eS5hdXRoLng1MDAuWDUwMFByaW5jaXBhbCkKLQotIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQXR0Q2VydElzc3VlcikKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5qY2UuWDUwOVByaW5jaXBhbCkKLQotcHJpdmF0ZSBqYXZhLmxhbmcuT2JqZWN0W10gZ2V0TmFtZXMoKQotCi1wcml2YXRlIGJvb2xlYW4gbWF0Y2hlc0ROKAotamF2YXguc2VjdXJpdHkuYXV0aC54NTAwLlg1MDBQcmluY2lwYWwKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkdlbmVyYWxOYW1lcykKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgY2xvbmUoKQotCi1wdWJsaWMgamF2YS5zZWN1cml0eS5QcmluY2lwYWxbXSBnZXRQcmluY2lwYWxzKCkKLQotcHVibGljIGJvb2xlYW4gbWF0Y2goCi1qYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS54NTA5LkNlcnRQYXRoUmV2aWV3ZXJFeGNlcHRpb24gZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmkxOG4uTG9jYWxpemVkRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoIGNlcnRQYXRoCi0KLXByaXZhdGUgaW50IGluZGV4Ci0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5pMThuLkVycm9yQnVuZGxlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmkxOG4uRXJyb3JCdW5kbGUKLWphdmEubGFuZy5UaHJvd2FibGUpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuaTE4bi5FcnJvckJ1bmRsZQotamF2YS5sYW5nLlRocm93YWJsZQotamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5ib3VuY3ljYXN0bGUuaTE4bi5FcnJvckJ1bmRsZQotamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoCi1pbnQpCi0KLXB1YmxpYyBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGggZ2V0Q2VydFBhdGgoKQotCi1wdWJsaWMgaW50IGdldEluZGV4KCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLng1MDkuUEtJWENlcnRQYXRoUmV2aWV3ZXIgZXh0ZW5kcyBvcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5DZXJ0UGF0aFZhbGlkYXRvclV0aWxpdGllcwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFVVEhfSU5GT19BQ0NFU1MKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBDUkxfRElTVF9QT0lOVFMKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBRQ19TVEFURU1FTlQKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSRVNPVVJDRV9OQU1FCi0KLXByb3RlY3RlZCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGggY2VydFBhdGgKLQotcHJvdGVjdGVkIGphdmEudXRpbC5MaXN0IGNlcnRzCi0KLXByb3RlY3RlZCBqYXZhLnV0aWwuTGlzdFtdIGVycm9ycwotCi1wcm90ZWN0ZWQgaW50IG4KLQotcHJvdGVjdGVkIGphdmEudXRpbC5MaXN0W10gbm90aWZpY2F0aW9ucwotCi1wcm90ZWN0ZWQgamF2YS5zZWN1cml0eS5jZXJ0LlBLSVhQYXJhbWV0ZXJzIHBraXhQYXJhbXMKLQotcHJvdGVjdGVkIGphdmEuc2VjdXJpdHkuY2VydC5Qb2xpY3lOb2RlIHBvbGljeVRyZWUKLQotcHJvdGVjdGVkIGphdmEuc2VjdXJpdHkuUHVibGljS2V5IHN1YmplY3RQdWJsaWNLZXkKLQotcHJvdGVjdGVkIGphdmEuc2VjdXJpdHkuY2VydC5UcnVzdEFuY2hvciB0cnVzdEFuY2hvcgotCi1wcm90ZWN0ZWQgamF2YS51dGlsLkRhdGUgdmFsaWREYXRlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL3g1MDkvQ2VydFBhdGhSZXZpZXdlckV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoCi1qYXZhLnNlY3VyaXR5LmNlcnQuUEtJWFBhcmFtZXRlcnMpCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBJUHRvU3RyaW5nKAotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvYm91bmN5Y2FzdGxlL3g1MDkvQ2VydFBhdGhSZXZpZXdlckV4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIGNoZWNrQ1JMcygKLWphdmEuc2VjdXJpdHkuY2VydC5QS0lYUGFyYW1ldGVycwotamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZQotamF2YS51dGlsLkRhdGUKLWphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGUKLWphdmEuc2VjdXJpdHkuUHVibGljS2V5Ci1qYXZhLnV0aWwuVmVjdG9yCi1pbnQpCi0KLXByaXZhdGUgdm9pZCBjaGVja0NyaXRpY2FsRXh0ZW5zaW9ucygpCi0KLXByaXZhdGUgdm9pZCBjaGVja05hbWVDb25zdHJhaW50cygpCi0KLXByaXZhdGUgdm9pZCBjaGVja1BhdGhMZW5ndGgoKQotCi1wcml2YXRlIHZvaWQgY2hlY2tQb2xpY3koKQotCi1wcml2YXRlIHZvaWQgY2hlY2tTaWduYXR1cmVzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2JvdW5jeWNhc3RsZS94NTA5L0NlcnRQYXRoUmV2aWV3ZXJFeGNlcHRpb247ICkKLXByaXZhdGUgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDUkwgZ2V0Q1JMKAotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBqYXZhLnV0aWwuVmVjdG9yIGdldENSTERpc3RVcmxzKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQ1JMRGlzdFBvaW50Ci1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BdXRob3JpdHlJbmZvcm1hdGlvbkFjY2VzcykKLQotcHJpdmF0ZSBqYXZhLnV0aWwuVmVjdG9yIGdldE9DU1BVcmxzKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQXV0aG9yaXR5SW5mb3JtYXRpb25BY2Nlc3MpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9ib3VuY3ljYXN0bGUveDUwOS9DZXJ0UGF0aFJldmlld2VyRXhjZXB0aW9uOyApCi1wcml2YXRlIGphdmEudXRpbC5Db2xsZWN0aW9uIGdldFRydXN0QW5jaG9ycygKLWphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGUKLWphdmEudXRpbC5TZXQpCi0KLXByaXZhdGUgYm9vbGVhbiBwcm9jZXNzUWNTdGF0ZW1lbnRzKAotamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZQotaW50KQotCi1wcm90ZWN0ZWQgdm9pZCBhZGRFcnJvcigKLW9yZy5ib3VuY3ljYXN0bGUuaTE4bi5FcnJvckJ1bmRsZSkKLQotcHJvdGVjdGVkIHZvaWQgYWRkRXJyb3IoCi1vcmcuYm91bmN5Y2FzdGxlLmkxOG4uRXJyb3JCdW5kbGUKLWludCkKLQotcHJvdGVjdGVkIHZvaWQgYWRkTm90aWZpY2F0aW9uKAotb3JnLmJvdW5jeWNhc3RsZS5pMThuLkVycm9yQnVuZGxlKQotCi1wcm90ZWN0ZWQgdm9pZCBhZGROb3RpZmljYXRpb24oCi1vcmcuYm91bmN5Y2FzdGxlLmkxOG4uRXJyb3JCdW5kbGUKLWludCkKLQotcHJvdGVjdGVkIHZvaWQgZG9DaGVja3MoKQotCi1wdWJsaWMgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRQYXRoIGdldENlcnRQYXRoKCkKLQotcHVibGljIGludCBnZXRDZXJ0UGF0aFNpemUoKQotCi1wdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0RXJyb3JzKAotaW50KQotCi1wdWJsaWMgamF2YS51dGlsLkxpc3RbXSBnZXRFcnJvcnMoKQotCi1wdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0Tm90aWZpY2F0aW9ucygKLWludCkKLQotcHVibGljIGphdmEudXRpbC5MaXN0W10gZ2V0Tm90aWZpY2F0aW9ucygpCi0KLXB1YmxpYyBqYXZhLnNlY3VyaXR5LmNlcnQuUG9saWN5Tm9kZSBnZXRQb2xpY3lUcmVlKCkKLQotcHVibGljIGphdmEuc2VjdXJpdHkuUHVibGljS2V5IGdldFN1YmplY3RQdWJsaWNLZXkoKQotCi1wdWJsaWMgamF2YS5zZWN1cml0eS5jZXJ0LlRydXN0QW5jaG9yIGdldFRydXN0QW5jaG9yKCkKLQotcHVibGljIGJvb2xlYW4gaXNWYWxpZENlcnRQYXRoKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLng1MDkuWDUwOUF0dHJpYnV0ZSBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BdHRyaWJ1dGUgYXR0cgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZVZlY3RvcikKLQotIHZvaWQgPGluaXQ+KAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkFTTjFFbmNvZGFibGUpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE9JRCgpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZVtdIGdldFZhbHVlcygpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0IHRvQVNOMU9iamVjdCgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUueDUwOS5YNTA5QXR0cmlidXRlQ2VydGlmaWNhdGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlFeHRlbnNpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVFeHBpcmVkRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVOb3RZZXRWYWxpZEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgY2hlY2tWYWxpZGl0eSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUV4cGlyZWRFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZU5vdFlldFZhbGlkRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBjaGVja1ZhbGlkaXR5KAotamF2YS51dGlsLkRhdGUpCi0KLXB1YmxpYyBhYnN0cmFjdCBvcmcuYm91bmN5Y2FzdGxlLng1MDkuWDUwOUF0dHJpYnV0ZVtdIGdldEF0dHJpYnV0ZXMoKQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLmJvdW5jeWNhc3RsZS54NTA5Llg1MDlBdHRyaWJ1dGVbXSBnZXRBdHRyaWJ1dGVzKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IGphdmEudXRpbC5TZXQgZ2V0Q3JpdGljYWxFeHRlbnNpb25PSURzKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGJ5dGVbXSBnZXRFbmNvZGVkKCkKLQotcHVibGljIGFic3RyYWN0IG9yZy5ib3VuY3ljYXN0bGUueDUwOS5BdHRyaWJ1dGVDZXJ0aWZpY2F0ZUhvbGRlciBnZXRIb2xkZXIoKQotCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLmJvdW5jeWNhc3RsZS54NTA5LkF0dHJpYnV0ZUNlcnRpZmljYXRlSXNzdWVyIGdldElzc3VlcigpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuW10gZ2V0SXNzdWVyVW5pcXVlSUQoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLlNldCBnZXROb25Dcml0aWNhbEV4dGVuc2lvbk9JRHMoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLkRhdGUgZ2V0Tm90QWZ0ZXIoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS51dGlsLkRhdGUgZ2V0Tm90QmVmb3JlKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldFNlcmlhbE51bWJlcigpCi0KLXB1YmxpYyBhYnN0cmFjdCBieXRlW10gZ2V0U2lnbmF0dXJlKCkKLQotcHVibGljIGFic3RyYWN0IGludCBnZXRWZXJzaW9uKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L05vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L05vU3VjaFByb3ZpZGVyRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L1NpZ25hdHVyZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgdmVyaWZ5KAotamF2YS5zZWN1cml0eS5QdWJsaWNLZXkKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi0gY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS54NTA5Llg1MDlVdGlsIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuSGFzaHRhYmxlIGFsZ29yaXRobXMKLQotcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLlNldCBub1BhcmFtcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIDxjbGluaXQ+KCkKLQotIHZvaWQgPGluaXQ+KCkKLQotc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuamNlLlg1MDlQcmluY2lwYWwgY29udmVydFByaW5jaXBhbCgKLWphdmF4LnNlY3VyaXR5LmF1dGgueDUwMC5YNTAwUHJpbmNpcGFsKQotCi1zdGF0aWMgamF2YS51dGlsLkl0ZXJhdG9yIGdldEFsZ05hbWVzKCkKLQotc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIGdldEFsZ29yaXRobU9JRCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyIGdldFNpZ0FsZ0lEKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS54NTA5Llg1MDlWMUNlcnRpZmljYXRlR2VuZXJhdG9yIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIgc2lnQWxnSWQKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciBzaWdPSUQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHNpZ25hdHVyZUFsZ29yaXRobQotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LlYxVEJTQ2VydGlmaWNhdGVHZW5lcmF0b3IgdGJzR2VuCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL1NlY3VyaXR5RXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L1NpZ25hdHVyZUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZSBnZW5lcmF0ZVg1MDlDZXJ0aWZpY2F0ZSgKLWphdmEuc2VjdXJpdHkuUHJpdmF0ZUtleSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9Ob1N1Y2hQcm92aWRlckV4Y2VwdGlvbjtMamF2YS9sYW5nL1NlY3VyaXR5RXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L1NpZ25hdHVyZUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZSBnZW5lcmF0ZVg1MDlDZXJ0aWZpY2F0ZSgKLWphdmEuc2VjdXJpdHkuUHJpdmF0ZUtleQotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9Ob1N1Y2hQcm92aWRlckV4Y2VwdGlvbjtMamF2YS9sYW5nL1NlY3VyaXR5RXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L1NpZ25hdHVyZUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZSBnZW5lcmF0ZVg1MDlDZXJ0aWZpY2F0ZSgKLWphdmEuc2VjdXJpdHkuUHJpdmF0ZUtleQotamF2YS5sYW5nLlN0cmluZwotamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9TZWN1cml0eUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9TaWduYXR1cmVFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGUgZ2VuZXJhdGVYNTA5Q2VydGlmaWNhdGUoCi1qYXZhLnNlY3VyaXR5LlByaXZhdGVLZXkKLWphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tKQotCi1wdWJsaWMgamF2YS51dGlsLkl0ZXJhdG9yIGdldFNpZ25hdHVyZUFsZ05hbWVzKCkKLQotcHVibGljIHZvaWQgcmVzZXQoKQotCi1wdWJsaWMgdm9pZCBzZXRJc3N1ZXJETigKLWphdmF4LnNlY3VyaXR5LmF1dGgueDUwMC5YNTAwUHJpbmNpcGFsKQotCi1wdWJsaWMgdm9pZCBzZXRJc3N1ZXJETigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5Llg1MDlOYW1lKQotCi1wdWJsaWMgdm9pZCBzZXROb3RBZnRlcigKLWphdmEudXRpbC5EYXRlKQotCi1wdWJsaWMgdm9pZCBzZXROb3RCZWZvcmUoCi1qYXZhLnV0aWwuRGF0ZSkKLQotcHVibGljIHZvaWQgc2V0UHVibGljS2V5KAotamF2YS5zZWN1cml0eS5QdWJsaWNLZXkpCi0KLXB1YmxpYyB2b2lkIHNldFNlcmlhbE51bWJlcigKLWphdmEubWF0aC5CaWdJbnRlZ2VyKQotCi1wdWJsaWMgdm9pZCBzZXRTaWduYXR1cmVBbGdvcml0aG0oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRTdWJqZWN0RE4oCi1qYXZheC5zZWN1cml0eS5hdXRoLng1MDAuWDUwMFByaW5jaXBhbCkKLQotcHVibGljIHZvaWQgc2V0U3ViamVjdEROKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuWDUwOU5hbWUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS54NTA5Llg1MDlWMkF0dHJpYnV0ZUNlcnRpZmljYXRlIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy5ib3VuY3ljYXN0bGUueDUwOS5YNTA5QXR0cmlidXRlQ2VydGlmaWNhdGUKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BdHRyaWJ1dGVDZXJ0aWZpY2F0ZSBjZXJ0Ci0KLXByaXZhdGUgamF2YS51dGlsLkRhdGUgbm90QWZ0ZXIKLQotcHJpdmF0ZSBqYXZhLnV0aWwuRGF0ZSBub3RCZWZvcmUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmlvLklucHV0U3RyZWFtKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi0gdm9pZCA8aW5pdD4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BdHRyaWJ1dGVDZXJ0aWZpY2F0ZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotYnl0ZVtdKQotCi1wcml2YXRlIGphdmEudXRpbC5TZXQgZ2V0RXh0ZW5zaW9uT0lEcygKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUV4cGlyZWRFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZU5vdFlldFZhbGlkRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjaGVja1ZhbGlkaXR5KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlRXhwaXJlZEV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9jZXJ0L0NlcnRpZmljYXRlTm90WWV0VmFsaWRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNoZWNrVmFsaWRpdHkoCi1qYXZhLnV0aWwuRGF0ZSkKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUueDUwOS5YNTA5QXR0cmlidXRlW10gZ2V0QXR0cmlidXRlcygpCi0KLXB1YmxpYyBvcmcuYm91bmN5Y2FzdGxlLng1MDkuWDUwOUF0dHJpYnV0ZVtdIGdldEF0dHJpYnV0ZXMoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS51dGlsLlNldCBnZXRDcml0aWNhbEV4dGVuc2lvbk9JRHMoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYnl0ZVtdIGdldEVuY29kZWQoKQotCi1wdWJsaWMgYnl0ZVtdIGdldEV4dGVuc2lvblZhbHVlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUueDUwOS5BdHRyaWJ1dGVDZXJ0aWZpY2F0ZUhvbGRlciBnZXRIb2xkZXIoKQotCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS54NTA5LkF0dHJpYnV0ZUNlcnRpZmljYXRlSXNzdWVyIGdldElzc3VlcigpCi0KLXB1YmxpYyBib29sZWFuW10gZ2V0SXNzdWVyVW5pcXVlSUQoKQotCi1wdWJsaWMgamF2YS51dGlsLlNldCBnZXROb25Dcml0aWNhbEV4dGVuc2lvbk9JRHMoKQotCi1wdWJsaWMgamF2YS51dGlsLkRhdGUgZ2V0Tm90QWZ0ZXIoKQotCi1wdWJsaWMgamF2YS51dGlsLkRhdGUgZ2V0Tm90QmVmb3JlKCkKLQotcHVibGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIGdldFNlcmlhbE51bWJlcigpCi0KLXB1YmxpYyBieXRlW10gZ2V0U2lnbmF0dXJlKCkKLQotcHVibGljIGludCBnZXRWZXJzaW9uKCkKLQotcHVibGljIGJvb2xlYW4gaGFzVW5zdXBwb3J0ZWRDcml0aWNhbEV4dGVuc2lvbigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9Ob1N1Y2hQcm92aWRlckV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9TaWduYXR1cmVFeGNlcHRpb247ICkKLXB1YmxpYyBmaW5hbCB2b2lkIHZlcmlmeSgKLWphdmEuc2VjdXJpdHkuUHVibGljS2V5Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUueDUwOS5YNTA5VjJBdHRyaWJ1dGVDZXJ0aWZpY2F0ZUdlbmVyYXRvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5WMkF0dHJpYnV0ZUNlcnRpZmljYXRlSW5mb0dlbmVyYXRvciBhY0luZm9HZW4KLQotcHJpdmF0ZSBqYXZhLnV0aWwuVmVjdG9yIGV4dE9yZGVyaW5nCi0KLXByaXZhdGUgamF2YS51dGlsLkhhc2h0YWJsZSBleHRlbnNpb25zCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllciBzaWdBbGdJZAotCi1wcml2YXRlIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyIHNpZ09JRAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgc2lnbmF0dXJlQWxnb3JpdGhtCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgYWRkQXR0cmlidXRlKAotb3JnLmJvdW5jeWNhc3RsZS54NTA5Llg1MDlBdHRyaWJ1dGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGFkZEV4dGVuc2lvbigKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4KLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xRW5jb2RhYmxlKQotCi1wdWJsaWMgdm9pZCBhZGRFeHRlbnNpb24oCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvTm9TdWNoUHJvdmlkZXJFeGNlcHRpb247TGphdmEvbGFuZy9TZWN1cml0eUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9TaWduYXR1cmVFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjsgKQotcHVibGljIG9yZy5ib3VuY3ljYXN0bGUueDUwOS5YNTA5QXR0cmlidXRlQ2VydGlmaWNhdGUgZ2VuZXJhdGVDZXJ0aWZpY2F0ZSgKLWphdmEuc2VjdXJpdHkuUHJpdmF0ZUtleQotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9Ob1N1Y2hQcm92aWRlckV4Y2VwdGlvbjtMamF2YS9sYW5nL1NlY3VyaXR5RXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L1NpZ25hdHVyZUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uOyApCi1wdWJsaWMgb3JnLmJvdW5jeWNhc3RsZS54NTA5Llg1MDlBdHRyaWJ1dGVDZXJ0aWZpY2F0ZSBnZW5lcmF0ZUNlcnRpZmljYXRlKAotamF2YS5zZWN1cml0eS5Qcml2YXRlS2V5Ci1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSkKLQotcHVibGljIGphdmEudXRpbC5JdGVyYXRvciBnZXRTaWduYXR1cmVBbGdOYW1lcygpCi0KLXB1YmxpYyB2b2lkIHJlc2V0KCkKLQotcHVibGljIHZvaWQgc2V0SG9sZGVyKAotb3JnLmJvdW5jeWNhc3RsZS54NTA5LkF0dHJpYnV0ZUNlcnRpZmljYXRlSG9sZGVyKQotCi1wdWJsaWMgdm9pZCBzZXRJc3N1ZXIoCi1vcmcuYm91bmN5Y2FzdGxlLng1MDkuQXR0cmlidXRlQ2VydGlmaWNhdGVJc3N1ZXIpCi0KLXB1YmxpYyB2b2lkIHNldElzc3VlclVuaXF1ZUlkKAotYm9vbGVhbltdKQotCi1wdWJsaWMgdm9pZCBzZXROb3RBZnRlcigKLWphdmEudXRpbC5EYXRlKQotCi1wdWJsaWMgdm9pZCBzZXROb3RCZWZvcmUoCi1qYXZhLnV0aWwuRGF0ZSkKLQotcHVibGljIHZvaWQgc2V0U2VyaWFsTnVtYmVyKAotamF2YS5tYXRoLkJpZ0ludGVnZXIpCi0KLXB1YmxpYyB2b2lkIHNldFNpZ25hdHVyZUFsZ29yaXRobSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS54NTA5Llg1MDlWMkNSTEdlbmVyYXRvciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdCBkYXRlRgotCi1wcml2YXRlIGphdmEudXRpbC5WZWN0b3IgZXh0T3JkZXJpbmcKLQotcHJpdmF0ZSBqYXZhLnV0aWwuSGFzaHRhYmxlIGV4dGVuc2lvbnMKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyIHNpZ0FsZ0lkCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgc2lnT0lECi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBzaWduYXR1cmVBbGdvcml0aG0KLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5WMlRCU0NlcnRMaXN0R2VuZXJhdG9yIHRic0dlbgotCi1wcml2YXRlIGphdmEudXRpbC5TaW1wbGVUaW1lWm9uZSB0egotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvY2VydC9DUkxFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGFkZENSTCgKLWphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q1JMKQotCi1wdWJsaWMgdm9pZCBhZGRDUkxFbnRyeSgKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1qYXZhLnV0aWwuRGF0ZQotaW50KQotCi1wdWJsaWMgdm9pZCBhZGRDUkxFbnRyeSgKLWphdmEubWF0aC5CaWdJbnRlZ2VyCi1qYXZhLnV0aWwuRGF0ZQotaW50Ci1qYXZhLnV0aWwuRGF0ZSkKLQotcHVibGljIHZvaWQgYWRkQ1JMRW50cnkoCi1qYXZhLm1hdGguQmlnSW50ZWdlcgotamF2YS51dGlsLkRhdGUKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5Llg1MDlFeHRlbnNpb25zKQotCi1wdWJsaWMgdm9pZCBhZGRFeHRlbnNpb24oCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSRW5jb2RhYmxlKQotCi1wdWJsaWMgdm9pZCBhZGRFeHRlbnNpb24oCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuCi1ieXRlW10pCi0KLXB1YmxpYyB2b2lkIGFkZEV4dGVuc2lvbigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyCi1ib29sZWFuCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVSRW5jb2RhYmxlKQotCi1wdWJsaWMgdm9pZCBhZGRFeHRlbnNpb24oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEuREVST2JqZWN0SWRlbnRpZmllcgotYm9vbGVhbgotYnl0ZVtdKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvU2VjdXJpdHlFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvU2lnbmF0dXJlRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNSTCBnZW5lcmF0ZVg1MDlDUkwoCi1qYXZhLnNlY3VyaXR5LlByaXZhdGVLZXkpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvTm9TdWNoUHJvdmlkZXJFeGNlcHRpb247TGphdmEvbGFuZy9TZWN1cml0eUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9TaWduYXR1cmVFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q1JMIGdlbmVyYXRlWDUwOUNSTCgKLWphdmEuc2VjdXJpdHkuUHJpdmF0ZUtleQotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9Ob1N1Y2hQcm92aWRlckV4Y2VwdGlvbjtMamF2YS9sYW5nL1NlY3VyaXR5RXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L1NpZ25hdHVyZUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDUkwgZ2VuZXJhdGVYNTA5Q1JMKAotamF2YS5zZWN1cml0eS5Qcml2YXRlS2V5Ci1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL1NlY3VyaXR5RXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L1NpZ25hdHVyZUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDUkwgZ2VuZXJhdGVYNTA5Q1JMKAotamF2YS5zZWN1cml0eS5Qcml2YXRlS2V5Ci1qYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSkKLQotcHVibGljIGphdmEudXRpbC5JdGVyYXRvciBnZXRTaWduYXR1cmVBbGdOYW1lcygpCi0KLXB1YmxpYyB2b2lkIHJlc2V0KCkKLQotcHVibGljIHZvaWQgc2V0SXNzdWVyRE4oCi1qYXZheC5zZWN1cml0eS5hdXRoLng1MDAuWDUwMFByaW5jaXBhbCkKLQotcHVibGljIHZvaWQgc2V0SXNzdWVyRE4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5YNTA5TmFtZSkKLQotcHVibGljIHZvaWQgc2V0TmV4dFVwZGF0ZSgKLWphdmEudXRpbC5EYXRlKQotCi1wdWJsaWMgdm9pZCBzZXRTaWduYXR1cmVBbGdvcml0aG0oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRUaGlzVXBkYXRlKAotamF2YS51dGlsLkRhdGUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmJvdW5jeWNhc3RsZS54NTA5Llg1MDlWM0NlcnRpZmljYXRlR2VuZXJhdG9yIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEudXRpbC5WZWN0b3IgZXh0T3JkZXJpbmcKLQotcHJpdmF0ZSBqYXZhLnV0aWwuSGFzaHRhYmxlIGV4dGVuc2lvbnMKLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyIHNpZ0FsZ0lkCi0KLXByaXZhdGUgb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIgc2lnT0lECi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBzaWduYXR1cmVBbGdvcml0aG0KLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5WM1RCU0NlcnRpZmljYXRlR2VuZXJhdG9yIHRic0dlbgotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIGFkZEV4dGVuc2lvbigKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4KLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJFbmNvZGFibGUpCi0KLXB1YmxpYyB2b2lkIGFkZEV4dGVuc2lvbigKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4KLWJ5dGVbXSkKLQotcHVibGljIHZvaWQgYWRkRXh0ZW5zaW9uKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIKLWJvb2xlYW4KLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJFbmNvZGFibGUpCi0KLXB1YmxpYyB2b2lkIGFkZEV4dGVuc2lvbigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyCi1ib29sZWFuCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNvcHlBbmRBZGRFeHRlbnNpb24oCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuCi1qYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjb3B5QW5kQWRkRXh0ZW5zaW9uKAotb3JnLmJvdW5jeWNhc3RsZS5hc24xLkRFUk9iamVjdElkZW50aWZpZXIKLWJvb2xlYW4KLWphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvbGFuZy9TZWN1cml0eUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9TaWduYXR1cmVFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGUgZ2VuZXJhdGVYNTA5Q2VydGlmaWNhdGUoCi1qYXZhLnNlY3VyaXR5LlByaXZhdGVLZXkpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvTm9TdWNoUHJvdmlkZXJFeGNlcHRpb247TGphdmEvbGFuZy9TZWN1cml0eUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9TaWduYXR1cmVFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGUgZ2VuZXJhdGVYNTA5Q2VydGlmaWNhdGUoCi1qYXZhLnNlY3VyaXR5LlByaXZhdGVLZXkKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvTm9TdWNoUHJvdmlkZXJFeGNlcHRpb247TGphdmEvbGFuZy9TZWN1cml0eUV4Y2VwdGlvbjtMamF2YS9zZWN1cml0eS9TaWduYXR1cmVFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvSW52YWxpZEtleUV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGUgZ2VuZXJhdGVYNTA5Q2VydGlmaWNhdGUoCi1qYXZhLnNlY3VyaXR5LlByaXZhdGVLZXkKLWphdmEubGFuZy5TdHJpbmcKLWphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvU2VjdXJpdHlFeGNlcHRpb247TGphdmEvc2VjdXJpdHkvU2lnbmF0dXJlRXhjZXB0aW9uO0xqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlIGdlbmVyYXRlWDUwOUNlcnRpZmljYXRlKAotamF2YS5zZWN1cml0eS5Qcml2YXRlS2V5Ci1qYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSkKLQotcHVibGljIGphdmEudXRpbC5JdGVyYXRvciBnZXRTaWduYXR1cmVBbGdOYW1lcygpCi0KLXB1YmxpYyB2b2lkIHJlc2V0KCkKLQotcHVibGljIHZvaWQgc2V0SXNzdWVyRE4oCi1qYXZheC5zZWN1cml0eS5hdXRoLng1MDAuWDUwMFByaW5jaXBhbCkKLQotcHVibGljIHZvaWQgc2V0SXNzdWVyRE4oCi1vcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5YNTA5TmFtZSkKLQotcHVibGljIHZvaWQgc2V0Tm90QWZ0ZXIoCi1qYXZhLnV0aWwuRGF0ZSkKLQotcHVibGljIHZvaWQgc2V0Tm90QmVmb3JlKAotamF2YS51dGlsLkRhdGUpCi0KLXB1YmxpYyB2b2lkIHNldFB1YmxpY0tleSgKLWphdmEuc2VjdXJpdHkuUHVibGljS2V5KQotCi1wdWJsaWMgdm9pZCBzZXRTZXJpYWxOdW1iZXIoCi1qYXZhLm1hdGguQmlnSW50ZWdlcikKLQotcHVibGljIHZvaWQgc2V0U2lnbmF0dXJlQWxnb3JpdGhtKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0U3ViamVjdEROKAotamF2YXguc2VjdXJpdHkuYXV0aC54NTAwLlg1MDBQcmluY2lwYWwpCi0KLXB1YmxpYyB2b2lkIHNldFN1YmplY3RETigKLW9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5Llg1MDlOYW1lKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUueDUwOS5leHRlbnNpb24uQXV0aG9yaXR5S2V5SWRlbnRpZmllclN0cnVjdHVyZSBleHRlbmRzIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS54NTA5LkF1dGhvcml0eUtleUlkZW50aWZpZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L0ludmFsaWRLZXlFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuc2VjdXJpdHkuUHVibGljS2V5KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydGlmaWNhdGVQYXJzaW5nRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb247ICkKLXByaXZhdGUgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xU2VxdWVuY2UgZnJvbUNlcnRpZmljYXRlKAotamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9zZWN1cml0eS9JbnZhbGlkS2V5RXhjZXB0aW9uOyApCi1wcml2YXRlIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMVNlcXVlbmNlIGZyb21LZXkoCi1qYXZhLnNlY3VyaXR5LlB1YmxpY0tleSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcuYm91bmN5Y2FzdGxlLng1MDkuZXh0ZW5zaW9uLlN1YmplY3RLZXlJZGVudGlmaWVyU3RydWN0dXJlIGV4dGVuZHMgb3JnLmJvdW5jeWNhc3RsZS5hc24xLng1MDkuU3ViamVjdEtleUlkZW50aWZpZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBvcmcuYm91bmN5Y2FzdGxlLmFzbjEueDUwOS5BdXRob3JpdHlLZXlJZGVudGlmaWVyIGF1dGhLZXlJRAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEuc2VjdXJpdHkuUHVibGljS2V5KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1ieXRlW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvc2VjdXJpdHkvY2VydC9DZXJ0aWZpY2F0ZVBhcnNpbmdFeGNlcHRpb247ICkKLXByaXZhdGUgc3RhdGljIG9yZy5ib3VuY3ljYXN0bGUuYXNuMS5BU04xT2N0ZXRTdHJpbmcgZnJvbVB1YmxpY0tleSgKLWphdmEuc2VjdXJpdHkuUHVibGljS2V5KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5ib3VuY3ljYXN0bGUueDUwOS5leHRlbnNpb24uWDUwOUV4dGVuc2lvblV0aWwgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBvcmcuYm91bmN5Y2FzdGxlLmFzbjEuQVNOMUVuY29kYWJsZSBmcm9tRXh0ZW5zaW9uVmFsdWUoCi1ieXRlW10pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmpzb24uSlNPTkFycmF5IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIGphdmEudXRpbC5BcnJheUxpc3QgbXlBcnJheUxpc3QKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvanNvbi9KU09ORXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLnV0aWwuQ29sbGVjdGlvbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2pzb24vSlNPTkV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmpzb24uSlNPTlRva2VuZXIpCi0KLXB1YmxpYyBib29sZWFuIGVxdWFscygKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9qc29uL0pTT05FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldCgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2pzb24vSlNPTkV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhbigKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2pzb24vSlNPTkV4Y2VwdGlvbjsgKQotcHVibGljIGRvdWJsZSBnZXREb3VibGUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9qc29uL0pTT05FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgZ2V0SW50KAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvanNvbi9KU09ORXhjZXB0aW9uOyApCi1wdWJsaWMgb3JnLmpzb24uSlNPTkFycmF5IGdldEpTT05BcnJheSgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2pzb24vSlNPTkV4Y2VwdGlvbjsgKQotcHVibGljIG9yZy5qc29uLkpTT05PYmplY3QgZ2V0SlNPTk9iamVjdCgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2pzb24vSlNPTkV4Y2VwdGlvbjsgKQotcHVibGljIGxvbmcgZ2V0TG9uZygKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2pzb24vSlNPTkV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nKAotaW50KQotCi1wdWJsaWMgYm9vbGVhbiBpc051bGwoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9qc29uL0pTT05FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGpvaW4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgaW50IGxlbmd0aCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IG9wdCgKLWludCkKLQotcHVibGljIGJvb2xlYW4gb3B0Qm9vbGVhbigKLWludCkKLQotcHVibGljIGJvb2xlYW4gb3B0Qm9vbGVhbigKLWludAotYm9vbGVhbikKLQotcHVibGljIGRvdWJsZSBvcHREb3VibGUoCi1pbnQpCi0KLXB1YmxpYyBkb3VibGUgb3B0RG91YmxlKAotaW50Ci1kb3VibGUpCi0KLXB1YmxpYyBpbnQgb3B0SW50KAotaW50KQotCi1wdWJsaWMgaW50IG9wdEludCgKLWludAotaW50KQotCi1wdWJsaWMgb3JnLmpzb24uSlNPTkFycmF5IG9wdEpTT05BcnJheSgKLWludCkKLQotcHVibGljIG9yZy5qc29uLkpTT05PYmplY3Qgb3B0SlNPTk9iamVjdCgKLWludCkKLQotcHVibGljIGxvbmcgb3B0TG9uZygKLWludCkKLQotcHVibGljIGxvbmcgb3B0TG9uZygKLWludAotbG9uZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgb3B0U3RyaW5nKAotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBvcHRTdHJpbmcoCi1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9qc29uL0pTT05FeGNlcHRpb247ICkKLXB1YmxpYyBvcmcuanNvbi5KU09OQXJyYXkgcHV0KAotZG91YmxlKQotCi1wdWJsaWMgb3JnLmpzb24uSlNPTkFycmF5IHB1dCgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2pzb24vSlNPTkV4Y2VwdGlvbjsgKQotcHVibGljIG9yZy5qc29uLkpTT05BcnJheSBwdXQoCi1pbnQKLWRvdWJsZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2pzb24vSlNPTkV4Y2VwdGlvbjsgKQotcHVibGljIG9yZy5qc29uLkpTT05BcnJheSBwdXQoCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2pzb24vSlNPTkV4Y2VwdGlvbjsgKQotcHVibGljIG9yZy5qc29uLkpTT05BcnJheSBwdXQoCi1pbnQKLWxvbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9qc29uL0pTT05FeGNlcHRpb247ICkKLXB1YmxpYyBvcmcuanNvbi5KU09OQXJyYXkgcHV0KAotaW50Ci1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvanNvbi9KU09ORXhjZXB0aW9uOyApCi1wdWJsaWMgb3JnLmpzb24uSlNPTkFycmF5IHB1dCgKLWludAotYm9vbGVhbikKLQotcHVibGljIG9yZy5qc29uLkpTT05BcnJheSBwdXQoCi1sb25nKQotCi1wdWJsaWMgb3JnLmpzb24uSlNPTkFycmF5IHB1dCgKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBvcmcuanNvbi5KU09OQXJyYXkgcHV0KAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2pzb24vSlNPTkV4Y2VwdGlvbjsgKQotcHVibGljIG9yZy5qc29uLkpTT05PYmplY3QgdG9KU09OT2JqZWN0KAotb3JnLmpzb24uSlNPTkFycmF5KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9qc29uL0pTT05FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvanNvbi9KU09ORXhjZXB0aW9uOyApCi0gamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygKLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5qc29uLkpTT05FeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL2pzb24vSlNPTk9iamVjdDsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID00MTA0IG5hbWUgPW51bGwgKQotIGNsYXNzIG9yZy5qc29uLkpTT05PYmplY3QkMSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5FbmNsb3NpbmdDbGFzcyAodmFsdWUgPUxvcmcvanNvbi9KU09OT2JqZWN0OyApCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTI2IG5hbWUgPU51bGwgKQotZmluYWwgY2xhc3Mgb3JnLmpzb24uSlNPTk9iamVjdCROdWxsIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi0gdm9pZCA8aW5pdD4oCi1vcmcuanNvbi5KU09OT2JqZWN0JDEpCi0KLXByb3RlY3RlZCBmaW5hbCBqYXZhLmxhbmcuT2JqZWN0IGNsb25lKCkKLQotcHVibGljIGJvb2xlYW4gZXF1YWxzKAotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TG9yZy9qc29uL0pTT05PYmplY3QkMTtMb3JnL2pzb24vSlNPTk9iamVjdCROdWxsOyApCi1wdWJsaWMgY2xhc3Mgb3JnLmpzb24uSlNPTk9iamVjdCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuT2JqZWN0IE5VTEwKLQotcHJpdmF0ZSBqYXZhLnV0aWwuSGFzaE1hcCBteUhhc2hNYXAKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9qc29uL0pTT05FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEudXRpbC5NYXApCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9qc29uL0pTT05FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy5qc29uLkpTT05PYmplY3QKLWphdmEubGFuZy5TdHJpbmdbXSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2pzb24vSlNPTkV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLmpzb24uSlNPTlRva2VuZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9qc29uL0pTT05FeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBudW1iZXJUb1N0cmluZygKLWphdmEubGFuZy5OdW1iZXIpCi0KLXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBxdW90ZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9qc29uL0pTT05FeGNlcHRpb247ICkKLXN0YXRpYyB2b2lkIHRlc3RWYWxpZGl0eSgKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9qc29uL0pTT05FeGNlcHRpb247ICkKLXN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIHZhbHVlVG9TdHJpbmcoCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvanNvbi9KU09ORXhjZXB0aW9uOyApCi1zdGF0aWMgamF2YS5sYW5nLlN0cmluZyB2YWx1ZVRvU3RyaW5nKAotamF2YS5sYW5nLk9iamVjdAotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9qc29uL0pTT05FeGNlcHRpb247ICkKLXB1YmxpYyBvcmcuanNvbi5KU09OT2JqZWN0IGFjY3VtdWxhdGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvanNvbi9KU09ORXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXQoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvanNvbi9KU09ORXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2pzb24vSlNPTkV4Y2VwdGlvbjsgKQotcHVibGljIGRvdWJsZSBnZXREb3VibGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvanNvbi9KU09ORXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IGdldEludCgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9qc29uL0pTT05FeGNlcHRpb247ICkKLXB1YmxpYyBvcmcuanNvbi5KU09OQXJyYXkgZ2V0SlNPTkFycmF5KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2pzb24vSlNPTkV4Y2VwdGlvbjsgKQotcHVibGljIG9yZy5qc29uLkpTT05PYmplY3QgZ2V0SlNPTk9iamVjdCgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9qc29uL0pTT05FeGNlcHRpb247ICkKLXB1YmxpYyBsb25nIGdldExvbmcoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvanNvbi9KU09ORXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdHJpbmcoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYm9vbGVhbiBoYXMoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYm9vbGVhbiBpc051bGwoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS51dGlsLkl0ZXJhdG9yIGtleXMoKQotCi1wdWJsaWMgaW50IGxlbmd0aCgpCi0KLXB1YmxpYyBvcmcuanNvbi5KU09OQXJyYXkgbmFtZXMoKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBvcHQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYm9vbGVhbiBvcHRCb29sZWFuKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJvb2xlYW4gb3B0Qm9vbGVhbigKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4pCi0KLXB1YmxpYyBkb3VibGUgb3B0RG91YmxlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGRvdWJsZSBvcHREb3VibGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1kb3VibGUpCi0KLXB1YmxpYyBpbnQgb3B0SW50KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGludCBvcHRJbnQoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi0KLXB1YmxpYyBvcmcuanNvbi5KU09OQXJyYXkgb3B0SlNPTkFycmF5KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIG9yZy5qc29uLkpTT05PYmplY3Qgb3B0SlNPTk9iamVjdCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBsb25nIG9wdExvbmcoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgbG9uZyBvcHRMb25nKAotamF2YS5sYW5nLlN0cmluZwotbG9uZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgb3B0U3RyaW5nKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgb3B0U3RyaW5nKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2pzb24vSlNPTkV4Y2VwdGlvbjsgKQotcHVibGljIG9yZy5qc29uLkpTT05PYmplY3QgcHV0KAotamF2YS5sYW5nLlN0cmluZwotZG91YmxlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvanNvbi9KU09ORXhjZXB0aW9uOyApCi1wdWJsaWMgb3JnLmpzb24uSlNPTk9iamVjdCBwdXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9qc29uL0pTT05FeGNlcHRpb247ICkKLXB1YmxpYyBvcmcuanNvbi5KU09OT2JqZWN0IHB1dCgKLWphdmEubGFuZy5TdHJpbmcKLWxvbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9qc29uL0pTT05FeGNlcHRpb247ICkKLXB1YmxpYyBvcmcuanNvbi5KU09OT2JqZWN0IHB1dCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9qc29uL0pTT05FeGNlcHRpb247ICkKLXB1YmxpYyBvcmcuanNvbi5KU09OT2JqZWN0IHB1dCgKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9qc29uL0pTT05FeGNlcHRpb247ICkKLXB1YmxpYyBvcmcuanNvbi5KU09OT2JqZWN0IHB1dE9wdCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IHJlbW92ZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9qc29uL0pTT05FeGNlcHRpb247ICkKLXB1YmxpYyBvcmcuanNvbi5KU09OQXJyYXkgdG9KU09OQXJyYXkoCi1vcmcuanNvbi5KU09OQXJyYXkpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2pzb24vSlNPTkV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9qc29uL0pTT05FeGNlcHRpb247ICkKLSBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKAotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmpzb24uSlNPTlN0cmluZ2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgbWF4ZGVwdGgKLQotcHJpdmF0ZSBib29sZWFuIGNvbW1hCi0KLXByaXZhdGUgY2hhciBtb2RlCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIgc2IKLQotcHJpdmF0ZSBjaGFyW10gc3RhY2sKLQotcHJpdmF0ZSBpbnQgdG9wCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2pzb24vSlNPTkV4Y2VwdGlvbjsgKQotcHJpdmF0ZSBvcmcuanNvbi5KU09OU3RyaW5nZXIgYXBwZW5kKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2pzb24vSlNPTkV4Y2VwdGlvbjsgKQotcHJpdmF0ZSBvcmcuanNvbi5KU09OU3RyaW5nZXIgZW5kKAotY2hhcgotY2hhcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2pzb24vSlNPTkV4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHBvcCgKLWNoYXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9qc29uL0pTT05FeGNlcHRpb247ICkKLXByaXZhdGUgdm9pZCBwdXNoKAotY2hhcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2pzb24vSlNPTkV4Y2VwdGlvbjsgKQotcHVibGljIG9yZy5qc29uLkpTT05TdHJpbmdlciBhcnJheSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9qc29uL0pTT05FeGNlcHRpb247ICkKLXB1YmxpYyBvcmcuanNvbi5KU09OU3RyaW5nZXIgZW5kQXJyYXkoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvanNvbi9KU09ORXhjZXB0aW9uOyApCi1wdWJsaWMgb3JnLmpzb24uSlNPTlN0cmluZ2VyIGVuZE9iamVjdCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9qc29uL0pTT05FeGNlcHRpb247ICkKLXB1YmxpYyBvcmcuanNvbi5KU09OU3RyaW5nZXIga2V5KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2pzb24vSlNPTkV4Y2VwdGlvbjsgKQotcHVibGljIG9yZy5qc29uLkpTT05TdHJpbmdlciBvYmplY3QoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9qc29uL0pTT05FeGNlcHRpb247ICkKLXB1YmxpYyBvcmcuanNvbi5KU09OU3RyaW5nZXIgdmFsdWUoCi1kb3VibGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9qc29uL0pTT05FeGNlcHRpb247ICkKLXB1YmxpYyBvcmcuanNvbi5KU09OU3RyaW5nZXIgdmFsdWUoCi1sb25nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvanNvbi9KU09ORXhjZXB0aW9uOyApCi1wdWJsaWMgb3JnLmpzb24uSlNPTlN0cmluZ2VyIHZhbHVlKAotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2pzb24vSlNPTkV4Y2VwdGlvbjsgKQotcHVibGljIG9yZy5qc29uLkpTT05TdHJpbmdlciB2YWx1ZSgKLWJvb2xlYW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLmpzb24uSlNPTlRva2VuZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgaW50IG15SW5kZXgKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG15U291cmNlCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHN0YXRpYyBpbnQgZGVoZXhjaGFyKAotY2hhcikKLQotcHVibGljIHZvaWQgYmFjaygpCi0KLXB1YmxpYyBib29sZWFuIG1vcmUoKQotCi1wdWJsaWMgY2hhciBuZXh0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL2pzb24vSlNPTkV4Y2VwdGlvbjsgKQotcHVibGljIGNoYXIgbmV4dCgKLWNoYXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9qc29uL0pTT05FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIG5leHQoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9qc29uL0pTT05FeGNlcHRpb247ICkKLXB1YmxpYyBjaGFyIG5leHRDbGVhbigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy9qc29uL0pTT05FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIG5leHRTdHJpbmcoCi1jaGFyKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBuZXh0VG8oCi1jaGFyKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBuZXh0VG8oCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcvanNvbi9KU09ORXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBuZXh0VmFsdWUoKQotCi1wdWJsaWMgdm9pZCBza2lwUGFzdCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBjaGFyIHNraXBUbygKLWNoYXIpCi0KLXB1YmxpYyBvcmcuanNvbi5KU09ORXhjZXB0aW9uIHN5bnRheEVycm9yKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5reG1sMi5pby5LWG1sUGFyc2VyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBJTExFR0FMX1RZUEUKLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExFR0FDWQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFVORVhQRUNURURfRU9GCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBYTUxfREVDTAotCi1wcml2YXRlIGludCBhdHRyaWJ1dGVDb3VudAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmdbXSBhdHRyaWJ1dGVzCi0KLXByaXZhdGUgaW50IGNvbHVtbgotCi1wcml2YXRlIGJvb2xlYW4gZGVnZW5lcmF0ZWQKLQotcHJpdmF0ZSBpbnQgZGVwdGgKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nW10gZWxlbWVudFN0YWNrCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBlbmNvZGluZwotCi1wcml2YXRlIGphdmEudXRpbC5IYXNoTWFwIGVudGl0eU1hcAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZXJyb3IKLQotcHJpdmF0ZSBib29sZWFuIGlzV2hpdGVzcGFjZQotCi1wcml2YXRlIGludCBsaW5lCi0KLXByaXZhdGUgamF2YS5sYW5nLk9iamVjdCBsb2NhdGlvbgotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbmFtZQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlCi0KLXByaXZhdGUgaW50W10gbnNwQ291bnRzCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZ1tdIG5zcFN0YWNrCi0KLXByaXZhdGUgaW50W10gcGVlawotCi1wcml2YXRlIGludCBwZWVrQ291bnQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeAotCi1wcml2YXRlIGJvb2xlYW4gcHJvY2Vzc05zcAotCi1wcml2YXRlIGphdmEuaW8uUmVhZGVyIHJlYWRlcgotCi1wcml2YXRlIGJvb2xlYW4gcmVsYXhlZAotCi1wcml2YXRlIGNoYXJbXSBzcmNCdWYKLQotcHJpdmF0ZSBpbnQgc3JjQ291bnQKLQotcHJpdmF0ZSBpbnQgc3JjUG9zCi0KLXByaXZhdGUgaW50IHN0YWNrTWlzbWF0Y2gKLQotcHJpdmF0ZSBqYXZhLmxhbmcuQm9vbGVhbiBzdGFuZGFsb25lCi0KLXByaXZhdGUgYm9vbGVhbiB0b2tlbgotCi1wcml2YXRlIGNoYXJbXSB0eHRCdWYKLQotcHJpdmF0ZSBpbnQgdHh0UG9zCi0KLXByaXZhdGUgaW50IHR5cGUKLQotcHJpdmF0ZSBib29sZWFuIHVucmVzb2x2ZWQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHZlcnNpb24KLQotcHJpdmF0ZSBib29sZWFuIHdhc0NSCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsgKQotcHJpdmF0ZSBmaW5hbCBib29sZWFuIGFkanVzdE5zcCgpCi0KLXByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZ1tdIGVuc3VyZUNhcGFjaXR5KAotamF2YS5sYW5nLlN0cmluZ1tdCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247ICkKLXByaXZhdGUgZmluYWwgdm9pZCBlcnJvcigKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247ICkKLXByaXZhdGUgZmluYWwgdm9pZCBleGNlcHRpb24oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgZ2V0KAotaW50KQotCi1wcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNQcm9wKAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbgotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsgKQotcHJpdmF0ZSBmaW5hbCB2b2lkIG5leHRJbXBsKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsgKQotcHJpdmF0ZSBmaW5hbCB2b2lkIHBhcnNlRG9jdHlwZSgKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247ICkKLXByaXZhdGUgZmluYWwgdm9pZCBwYXJzZUVuZFRhZygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247ICkKLXByaXZhdGUgZmluYWwgaW50IHBhcnNlTGVnYWN5KAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsgKQotcHJpdmF0ZSBmaW5hbCB2b2lkIHBhcnNlU3RhcnRUYWcoCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIGZpbmFsIGludCBwZWVrKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIGZpbmFsIGludCBwZWVrVHlwZSgpCi0KLXByaXZhdGUgZmluYWwgdm9pZCBwdXNoKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOyApCi1wcml2YXRlIGZpbmFsIHZvaWQgcHVzaEVudGl0eSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247ICkKLXByaXZhdGUgZmluYWwgdm9pZCBwdXNoVGV4dCgKLWludAotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBmaW5hbCBpbnQgcmVhZCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247ICkKLXByaXZhdGUgZmluYWwgdm9pZCByZWFkKAotY2hhcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsgKQotcHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIHJlYWROYW1lKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBmaW5hbCB2b2lkIHNraXAoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBkZWZpbmVFbnRpdHlSZXBsYWNlbWVudFRleHQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgaW50IGdldEF0dHJpYnV0ZUNvdW50KCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QXR0cmlidXRlTmFtZXNwYWNlKAotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRBdHRyaWJ1dGVQcmVmaXgoCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEF0dHJpYnV0ZVR5cGUoCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKAotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBpbnQgZ2V0Q29sdW1uTnVtYmVyKCkKLQotcHVibGljIGludCBnZXREZXB0aCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgZ2V0RXZlbnRUeXBlKCkKLQotcHVibGljIGJvb2xlYW4gZ2V0RmVhdHVyZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldElucHV0RW5jb2RpbmcoKQotCi1wdWJsaWMgaW50IGdldExpbmVOdW1iZXIoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXROYW1lKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TmFtZXNwYWNlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TmFtZXNwYWNlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGludCBnZXROYW1lc3BhY2VDb3VudCgKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TmFtZXNwYWNlUHJlZml4KAotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXROYW1lc3BhY2VVcmkoCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFBvc2l0aW9uRGVzY3JpcHRpb24oKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRQcmVmaXgoKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRQcm9wZXJ0eSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFRleHQoKQotCi1wdWJsaWMgY2hhcltdIGdldFRleHRDaGFyYWN0ZXJzKAotaW50W10pCi0KLXB1YmxpYyBib29sZWFuIGlzQXR0cmlidXRlRGVmYXVsdCgKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gaXNFbXB0eUVsZW1lbnRUYWcoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBpc1doaXRlc3BhY2UoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IG5leHQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgaW50IG5leHRUYWcoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBuZXh0VGV4dCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgbmV4dFRva2VuKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcmVxdWlyZSgKLWludAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0RmVhdHVyZSgKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldElucHV0KAotamF2YS5pby5JbnB1dFN0cmVhbQotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0SW5wdXQoCi1qYXZhLmlvLlJlYWRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0UHJvcGVydHkoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBza2lwU3ViVHJlZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy54bWxwdWxsLnYxLlhtbFNlcmlhbGl6ZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjtMamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IG9yZy54bWxwdWxsLnYxLlhtbFNlcmlhbGl6ZXIgYXR0cmlidXRlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjtMamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgY2RzZWN0KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjtMamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgY29tbWVudCgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGRvY2RlY2woCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBlbmREb2N1bWVudCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBvcmcueG1scHVsbC52MS5YbWxTZXJpYWxpemVyIGVuZFRhZygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGVudGl0eVJlZigKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGZsdXNoKCkKLQotcHVibGljIGFic3RyYWN0IGludCBnZXREZXB0aCgpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGdldEZlYXR1cmUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXROYW1lKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0TmFtZXNwYWNlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0UHJlZml4KAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5PYmplY3QgZ2V0UHJvcGVydHkoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBpZ25vcmFibGVXaGl0ZXNwYWNlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjtMamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgcHJvY2Vzc2luZ0luc3RydWN0aW9uKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjtMamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RmVhdHVyZSgKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldE91dHB1dCgKLWphdmEuaW8uT3V0cHV0U3RyZWFtCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRPdXRwdXQoCi1qYXZhLmlvLldyaXRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjtMamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0UHJlZml4KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjtMamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0UHJvcGVydHkoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uO0xqYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdGFydERvY3VtZW50KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLkJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBvcmcueG1scHVsbC52MS5YbWxTZXJpYWxpemVyIHN0YXJ0VGFnKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjtMamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IG9yZy54bWxwdWxsLnYxLlhtbFNlcmlhbGl6ZXIgdGV4dCgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBvcmcueG1scHVsbC52MS5YbWxTZXJpYWxpemVyIHRleHQoCi1jaGFyW10KLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5reG1sMi5pby5LWG1sU2VyaWFsaXplciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcueG1scHVsbC52MS5YbWxTZXJpYWxpemVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXUklURV9CVUZGRVJfU0laRQotCi1wcml2YXRlIGludCBhdXRvCi0KLXByaXZhdGUgaW50IGRlcHRoCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZ1tdIGVsZW1lbnRTdGFjawotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZW5jb2RpbmcKLQotcHJpdmF0ZSBib29sZWFuW10gaW5kZW50Ci0KLXByaXZhdGUgaW50W10gbnNwQ291bnRzCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZ1tdIG5zcFN0YWNrCi0KLXByaXZhdGUgYm9vbGVhbiBwZW5kaW5nCi0KLXByaXZhdGUgYm9vbGVhbiB1bmljb2RlCi0KLXByaXZhdGUgamF2YS5pby5CdWZmZXJlZFdyaXRlciB3cml0ZXIKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIGZpbmFsIHZvaWQgY2hlY2soCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgZ2V0UHJlZml4KAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbgotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBmaW5hbCB2b2lkIHdyaXRlRXNjYXBlZCgKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIG9yZy54bWxwdWxsLnYxLlhtbFNlcmlhbGl6ZXIgYXR0cmlidXRlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY2RzZWN0KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgY29tbWVudCgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGRvY2RlY2woCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBlbmREb2N1bWVudCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBvcmcueG1scHVsbC52MS5YbWxTZXJpYWxpemVyIGVuZFRhZygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGVudGl0eVJlZigKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGZsdXNoKCkKLQotcHVibGljIGludCBnZXREZXB0aCgpCi0KLXB1YmxpYyBib29sZWFuIGdldEZlYXR1cmUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXROYW1lKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TmFtZXNwYWNlKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UHJlZml4KAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0UHJvcGVydHkoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBpZ25vcmFibGVXaGl0ZXNwYWNlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcHJvY2Vzc2luZ0luc3RydWN0aW9uKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0RmVhdHVyZSgKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldE91dHB1dCgKLWphdmEuaW8uT3V0cHV0U3RyZWFtCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRPdXRwdXQoCi1qYXZhLmlvLldyaXRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0UHJlZml4KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0UHJvcGVydHkoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuT2JqZWN0KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzdGFydERvY3VtZW50KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLkJvb2xlYW4pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBvcmcueG1scHVsbC52MS5YbWxTZXJpYWxpemVyIHN0YXJ0VGFnKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIG9yZy54bWxwdWxsLnYxLlhtbFNlcmlhbGl6ZXIgdGV4dCgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBvcmcueG1scHVsbC52MS5YbWxTZXJpYWxpemVyIHRleHQoCi1jaGFyW10KLWludAotaW50KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5reG1sMi5rZG9tLk5vZGUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENEU0VDVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01NRU5UCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERPQ0RFQ0wKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRE9DVU1FTlQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUxFTUVOVAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRJVFlfUkVGCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElHTk9SQUJMRV9XSElURVNQQUNFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST0NFU1NJTkdfSU5TVFJVQ1RJT04KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEVYVAotCi1wcm90ZWN0ZWQgamF2YS51dGlsLkFycmF5TGlzdCBjaGlsZHJlbgotCi1wcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciB0eXBlcwotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIGFkZENoaWxkKAotaW50Ci1pbnQKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2lkIGFkZENoaWxkKAotaW50Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgb3JnLmt4bWwyLmtkb20uRWxlbWVudCBjcmVhdGVFbGVtZW50KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0Q2hpbGQoCi1pbnQpCi0KLXB1YmxpYyBpbnQgZ2V0Q2hpbGRDb3VudCgpCi0KLXB1YmxpYyBvcmcua3htbDIua2RvbS5FbGVtZW50IGdldEVsZW1lbnQoCi1pbnQpCi0KLXB1YmxpYyBvcmcua3htbDIua2RvbS5FbGVtZW50IGdldEVsZW1lbnQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRUZXh0KAotaW50KQotCi1wdWJsaWMgaW50IGdldFR5cGUoCi1pbnQpCi0KLXB1YmxpYyBpbnQgaW5kZXhPZigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWludCkKLQotcHVibGljIGJvb2xlYW4gaXNUZXh0KAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBwYXJzZSgKLW9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXIpCi0KLXB1YmxpYyB2b2lkIHJlbW92ZUNoaWxkKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB3cml0ZSgKLW9yZy54bWxwdWxsLnYxLlhtbFNlcmlhbGl6ZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHdyaXRlQ2hpbGRyZW4oCi1vcmcueG1scHVsbC52MS5YbWxTZXJpYWxpemVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5reG1sMi5rZG9tLkRvY3VtZW50IGV4dGVuZHMgb3JnLmt4bWwyLmtkb20uTm9kZQotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gamF2YS5sYW5nLlN0cmluZyBlbmNvZGluZwotCi1wcm90ZWN0ZWQgaW50IHJvb3RJbmRleAotCi0gamF2YS5sYW5nLkJvb2xlYW4gc3RhbmRhbG9uZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIGFkZENoaWxkKAotaW50Ci1pbnQKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEVuY29kaW5nKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TmFtZSgpCi0KLXB1YmxpYyBvcmcua3htbDIua2RvbS5FbGVtZW50IGdldFJvb3RFbGVtZW50KCkKLQotcHVibGljIGphdmEubGFuZy5Cb29sZWFuIGdldFN0YW5kYWxvbmUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBwYXJzZSgKLW9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXIpCi0KLXB1YmxpYyB2b2lkIHJlbW92ZUNoaWxkKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRFbmNvZGluZygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHNldFN0YW5kYWxvbmUoCi1qYXZhLmxhbmcuQm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgd3JpdGUoCi1vcmcueG1scHVsbC52MS5YbWxTZXJpYWxpemVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5reG1sMi5rZG9tLkVsZW1lbnQgZXh0ZW5kcyBvcmcua3htbDIua2RvbS5Ob2RlCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYnV0ZXMKLQotcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgbmFtZQotCi1wcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UKLQotcHJvdGVjdGVkIG9yZy5reG1sMi5rZG9tLk5vZGUgcGFyZW50Ci0KLXByb3RlY3RlZCBqYXZhLnV0aWwuQXJyYXlMaXN0IHByZWZpeGVzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgY2xlYXIoKQotCi1wdWJsaWMgb3JnLmt4bWwyLmtkb20uRWxlbWVudCBjcmVhdGVFbGVtZW50KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGludCBnZXRBdHRyaWJ1dGVDb3VudCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWVzcGFjZSgKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXROYW1lKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TmFtZXNwYWNlKCkKLQotcHVibGljIGludCBnZXROYW1lc3BhY2VDb3VudCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE5hbWVzcGFjZVByZWZpeCgKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TmFtZXNwYWNlVXJpKAotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXROYW1lc3BhY2VVcmkoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgb3JnLmt4bWwyLmtkb20uTm9kZSBnZXRQYXJlbnQoKQotCi1wdWJsaWMgb3JnLmt4bWwyLmtkb20uTm9kZSBnZXRSb290KCkKLQotcHVibGljIHZvaWQgaW5pdCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHBhcnNlKAotb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcikKLQotcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0TmFtZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXByb3RlY3RlZCB2b2lkIHNldFBhcmVudCgKLW9yZy5reG1sMi5rZG9tLk5vZGUpCi0KLXB1YmxpYyB2b2lkIHNldFByZWZpeCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHdyaXRlKAotb3JnLnhtbHB1bGwudjEuWG1sU2VyaWFsaXplcikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLmt4bWwyLndhcC5XYnhtbCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5ECi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOVElUWQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFRfMAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFRfMQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFRfMgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFRfSV8wCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYVF9JXzEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhUX0lfMgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFRfVF8wCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYVF9UXzEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhUX1RfMgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMSVRFUkFMCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExJVEVSQUxfQQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMSVRFUkFMX0FDCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExJVEVSQUxfQwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUEFRVUUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEkKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RSX0kKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RSX1QKLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1dJVENIX1BBR0UKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5reG1sMi53YXAuV2J4bWxQYXJzZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIElMTEVHQUxfVFlQRQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFVORVhQRUNURURfRU9GCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUF9FWFRFTlNJT04KLQotcHJpdmF0ZSBpbnQgQVRUUl9TVEFSVF9UQUJMRQotCi1wcml2YXRlIGludCBBVFRSX1ZBTFVFX1RBQkxFCi0KLXByaXZhdGUgaW50IFRBR19UQUJMRQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmdbXSBhdHRyU3RhcnRUYWJsZQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmdbXSBhdHRyVmFsdWVUYWJsZQotCi1wcml2YXRlIGludCBhdHRyaWJ1dGVDb3VudAotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmdbXSBhdHRyaWJ1dGVzCi0KLXByaXZhdGUgamF2YS51dGlsLkhhc2h0YWJsZSBjYWNoZVN0cmluZ1RhYmxlCi0KLSBpbnQgY2hhclNldAotCi1wcml2YXRlIGludCBjb2RlUGFnZQotCi1wcml2YXRlIGJvb2xlYW4gZGVnZW5lcmF0ZWQKLQotcHJpdmF0ZSBpbnQgZGVwdGgKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nW10gZWxlbWVudFN0YWNrCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBlbmNvZGluZwotCi1wcml2YXRlIGphdmEuaW8uSW5wdXRTdHJlYW0gaW4KLQotcHJpdmF0ZSBib29sZWFuIGlzV2hpdGVzcGFjZQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbmFtZQotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlCi0KLXByaXZhdGUgaW50IG5leHRJZAotCi1wcml2YXRlIGludFtdIG5zcENvdW50cwotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmdbXSBuc3BTdGFjawotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcHJlZml4Ci0KLXByaXZhdGUgYm9vbGVhbiBwcm9jZXNzTnNwCi0KLSBpbnQgcHVibGljSWRlbnRpZmllcklkCi0KLXByaXZhdGUgYnl0ZVtdIHN0cmluZ1RhYmxlCi0KLXByaXZhdGUgamF2YS51dGlsLlZlY3RvciB0YWJsZXMKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nW10gdGFnVGFibGUKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHRleHQKLQotcHJpdmF0ZSBpbnQgdHlwZQotCi0gaW50IHZlcnNpb24KLQotcHJpdmF0ZSBpbnQgd2FwRXh0ZW5zaW9uQ29kZQotCi1wcml2YXRlIGphdmEubGFuZy5PYmplY3Qgd2FwRXh0ZW5zaW9uRGF0YQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247ICkKLXByaXZhdGUgZmluYWwgYm9vbGVhbiBhZGp1c3ROc3AoKQotCi1wcml2YXRlIGZpbmFsIGphdmEubGFuZy5TdHJpbmdbXSBlbnN1cmVDYXBhY2l0eSgKLWphdmEubGFuZy5TdHJpbmdbXQotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOyApCi1wcml2YXRlIGZpbmFsIHZvaWQgZXhjZXB0aW9uKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsgKQotcHJpdmF0ZSBmaW5hbCB2b2lkIG5leHRJbXBsKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHJpdmF0ZSBpbnQgcGVla0lkKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsgKQotcHJpdmF0ZSB2b2lkIHNlbGVjdFBhZ2UoCi1pbnQKLWJvb2xlYW4pCi0KLXByaXZhdGUgZmluYWwgdm9pZCBzZXRUYWJsZSgKLWludAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGRlZmluZUVudGl0eVJlcGxhY2VtZW50VGV4dCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBpbnQgZ2V0QXR0cmlidXRlQ291bnQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKAotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lc3BhY2UoCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEF0dHJpYnV0ZVByZWZpeCgKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QXR0cmlidXRlVHlwZSgKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGludCBnZXRDb2x1bW5OdW1iZXIoKQotCi1wdWJsaWMgaW50IGdldERlcHRoKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsgKQotcHVibGljIGludCBnZXRFdmVudFR5cGUoKQotCi1wdWJsaWMgYm9vbGVhbiBnZXRGZWF0dXJlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SW5wdXRFbmNvZGluZygpCi0KLXB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE5hbWUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXROYW1lc3BhY2UoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXROYW1lc3BhY2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgaW50IGdldE5hbWVzcGFjZUNvdW50KAotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXROYW1lc3BhY2VQcmVmaXgoCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE5hbWVzcGFjZVVyaSgKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UG9zaXRpb25EZXNjcmlwdGlvbigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFByZWZpeCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldFByb3BlcnR5KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VGV4dCgpCi0KLXB1YmxpYyBjaGFyW10gZ2V0VGV4dENoYXJhY3RlcnMoCi1pbnRbXSkKLQotcHVibGljIGJvb2xlYW4gaXNBdHRyaWJ1dGVEZWZhdWx0KAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOyApCi1wdWJsaWMgYm9vbGVhbiBpc0VtcHR5RWxlbWVudFRhZygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247ICkKLXB1YmxpYyBib29sZWFuIGlzV2hpdGVzcGFjZSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgbmV4dCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBpbnQgbmV4dFRhZygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIG5leHRUZXh0KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGludCBuZXh0VG9rZW4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOyApCi0gdm9pZCBwYXJzZUVsZW1lbnQoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHBhcnNlV2FwRXh0ZW5zaW9uKAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCByZWFkQXR0cigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLSBpbnQgcmVhZEJ5dGUoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi0gaW50IHJlYWRJbnQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi0gamF2YS5sYW5nLlN0cmluZyByZWFkU3RySSgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLSBqYXZhLmxhbmcuU3RyaW5nIHJlYWRTdHJUKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcmVxdWlyZSgKLWludAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotIGphdmEubGFuZy5TdHJpbmcgcmVzb2x2ZUlkKAotamF2YS5sYW5nLlN0cmluZ1tdCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldEF0dHJTdGFydFRhYmxlKAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nW10pCi0KLXB1YmxpYyB2b2lkIHNldEF0dHJWYWx1ZVRhYmxlKAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldEZlYXR1cmUoCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRJbnB1dCgKLWphdmEuaW8uSW5wdXRTdHJlYW0KLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldElucHV0KAotamF2YS5pby5SZWFkZXIpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldFByb3BlcnR5KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHZvaWQgc2V0VGFnVGFibGUoCi1pbnQKLWphdmEubGFuZy5TdHJpbmdbXSkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcua3htbDIud2FwLldieG1sU2VyaWFsaXplciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcueG1scHVsbC52MS5YbWxTZXJpYWxpemVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgaW50IGF0dHJQYWdlCi0KLSBqYXZhLnV0aWwuSGFzaHRhYmxlIGF0dHJTdGFydFRhYmxlCi0KLSBqYXZhLnV0aWwuSGFzaHRhYmxlIGF0dHJWYWx1ZVRhYmxlCi0KLSBqYXZhLnV0aWwuVmVjdG9yIGF0dHJpYnV0ZXMKLQotIGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ1ZgotCi0gaW50IGRlcHRoCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBlbmNvZGluZwotCi0gamF2YS5sYW5nLlN0cmluZyBuYW1lCi0KLSBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZQotCi0gamF2YS5pby5PdXRwdXRTdHJlYW0gb3V0Ci0KLSBqYXZhLmxhbmcuU3RyaW5nIHBlbmRpbmcKLQotIGphdmEudXRpbC5IYXNodGFibGUgc3RyaW5nVGFibGUKLQotIGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHN0cmluZ1RhYmxlQnVmCi0KLXByaXZhdGUgaW50IHRhZ1BhZ2UKLQotIGphdmEudXRpbC5IYXNodGFibGUgdGFnVGFibGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1zdGF0aWMgdm9pZCB3cml0ZUludCgKLWphdmEuaW8uT3V0cHV0U3RyZWFtCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXN0YXRpYyB2b2lkIHdyaXRlU3RySSgKLWphdmEuaW8uT3V0cHV0U3RyZWFtCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgb3JnLnhtbHB1bGwudjEuWG1sU2VyaWFsaXplciBhdHRyaWJ1dGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjZHNlY3QoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjaGVja1BlbmRpbmcoCi1ib29sZWFuKQotCi1wdWJsaWMgdm9pZCBjb21tZW50KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgZG9jZGVjbCgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGVuZERvY3VtZW50KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIG9yZy54bWxwdWxsLnYxLlhtbFNlcmlhbGl6ZXIgZW5kVGFnKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgZW50aXR5UmVmKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgZmx1c2goKQotCi1wdWJsaWMgaW50IGdldERlcHRoKCkKLQotcHVibGljIGJvb2xlYW4gZ2V0RmVhdHVyZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE5hbWUoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXROYW1lc3BhY2UoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRQcmVmaXgoCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuKQotCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRQcm9wZXJ0eSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIGlnbm9yYWJsZVdoaXRlc3BhY2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBwcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRBdHRyU3RhcnRUYWJsZSgKLWludAotamF2YS5sYW5nLlN0cmluZ1tdKQotCi1wdWJsaWMgdm9pZCBzZXRBdHRyVmFsdWVUYWJsZSgKLWludAotamF2YS5sYW5nLlN0cmluZ1tdKQotCi1wdWJsaWMgdm9pZCBzZXRGZWF0dXJlKAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0T3V0cHV0KAotamF2YS5pby5PdXRwdXRTdHJlYW0KLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHNldE91dHB1dCgKLWphdmEuaW8uV3JpdGVyKQotCi1wdWJsaWMgdm9pZCBzZXRQcmVmaXgoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3QpCi0KLXB1YmxpYyB2b2lkIHNldFRhZ1RhYmxlKAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nW10pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHN0YXJ0RG9jdW1lbnQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuQm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIG9yZy54bWxwdWxsLnYxLlhtbFNlcmlhbGl6ZXIgc3RhcnRUYWcoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgb3JnLnhtbHB1bGwudjEuWG1sU2VyaWFsaXplciB0ZXh0KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIG9yZy54bWxwdWxsLnYxLlhtbFNlcmlhbGl6ZXIgdGV4dCgKLWNoYXJbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIHdyaXRlTGVnYWN5KAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi0gdm9pZCB3cml0ZVN0clQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIG9yZy5reG1sMi53YXAuc3luY21sLlN5bmNNTCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gVEFHX1RBQkxFXzAKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gVEFHX1RBQkxFXzEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gVEFHX1RBQkxFXzJfRE0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmt4bWwyLndhcC5XYnhtbFBhcnNlciBjcmVhdGVETVBhcnNlcigpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmt4bWwyLndhcC5XYnhtbFNlcmlhbGl6ZXIgY3JlYXRlRE1TZXJpYWxpemVyKCkKLQotcHVibGljIHN0YXRpYyBvcmcua3htbDIud2FwLldieG1sUGFyc2VyIGNyZWF0ZVBhcnNlcigpCi0KLXB1YmxpYyBzdGF0aWMgb3JnLmt4bWwyLndhcC5XYnhtbFNlcmlhbGl6ZXIgY3JlYXRlU2VyaWFsaXplcigpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3Mgb3JnLmt4bWwyLndhcC53bWwuV21sIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmdbXSBBVFRSX1NUQVJUX1RBQkxFCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZ1tdIEFUVFJfVkFMVUVfVEFCTEUKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gVEFHX1RBQkxFCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgc3RhdGljIG9yZy5reG1sMi53YXAuV2J4bWxQYXJzZXIgY3JlYXRlUGFyc2VyKCkKLQotcHVibGljIHN0YXRpYyBvcmcua3htbDIud2FwLldieG1sU2VyaWFsaXplciBjcmVhdGVTZXJpYWxpemVyKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBvcmcua3htbDIud2FwLnd2LldWIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmdbXSBhdHRyU3RhcnRUYWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmdbXSBhdHRyVmFsdWVUYWJsZQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmdbXSB0YWdUYWJsZVBhZ2UwCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZ1tdIHRhZ1RhYmxlUGFnZTEKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gdGFnVGFibGVQYWdlMgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmdbXSB0YWdUYWJsZVBhZ2UzCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZ1tdIHRhZ1RhYmxlUGFnZTQKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gdGFnVGFibGVQYWdlNQotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmdbXSB0YWdUYWJsZVBhZ2U2Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZ1tdIHRhZ1RhYmxlUGFnZTcKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nW10gdGFnVGFibGVQYWdlOAotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmdbXSB0YWdUYWJsZVBhZ2U5Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZ1tdIHRhZ1RhYmxlUGFnZUEKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgb3JnLmt4bWwyLndhcC5XYnhtbFBhcnNlciBjcmVhdGVQYXJzZXIoKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy5vcGVuc3NsLk5hdGl2ZUJOIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBCTl9DVFhfbmV3KCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBCTl9hZGQoCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIEJOX2FkZF93b3JkKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gQk5fYmluMmJuKAotYnl0ZVtdCi1pbnQKLWJvb2xlYW4KLWludCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgYnl0ZVtdIEJOX2JuMmJpbigKLWludAotYnl0ZVtdKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBqYXZhLmxhbmcuU3RyaW5nIEJOX2JuMmRlYygKLWludCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgamF2YS5sYW5nLlN0cmluZyBCTl9ibjJoZXgoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBCTl9jbXAoCi1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBCTl9jb3B5KAotaW50Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBCTl9kZWMyYm4oCi1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gQk5fZGl2KAotaW50Ci1pbnQKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBCTl9kaXZfd29yZCgKLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIEJOX2V4cCgKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBCTl9mcmVlKAotaW50KQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIEJOX2djZCgKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBCTl9nZW5lcmF0ZV9wcmltZV9leCgKLWludAotaW50Ci1ib29sZWFuCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgQk5faGV4MmJuKAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIEJOX2lzX2JpdF9zZXQoCi1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBCTl9pc19wcmltZV9leCgKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBCTl9sc2hpZnQoCi1pbnQKLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIEJOX21vZF9leHAoCi1pbnQKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBCTl9tb2RfaW52ZXJzZSgKLWludAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IEJOX21vZF93b3JkKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gQk5fbXVsKAotaW50Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIEJOX211bF93b3JkKAotaW50Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBCTl9uZXcoKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIEJOX25ubW9kKAotaW50Ci1pbnQKLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIEJOX3NldF9uZWdhdGl2ZSgKLWludAotaW50KQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIEJOX3N1YigKLWludAotaW50Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gQk5fc3ViX3dvcmQoCi1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgamF2YS5sYW5nLlN0cmluZyBFUlJfZXJyb3Jfc3RyaW5nKAotaW50KQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgRVJSX2dldF9lcnJvcigpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBiaXRMZW5ndGgoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludFtdIGJuMmxpdEVuZEludHMoCi1pbnQKLWludFtdKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBieXRlW10gYm4ydHdvc0NvbXAoCi1pbnQKLWJ5dGVbXSkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBsaXRFbmRJbnRzMmJuKAotaW50W10KLWludAotYm9vbGVhbgotaW50KQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBsb25nIGxvbmdJbnQoCi1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gbW9kaWZ5Qml0KAotaW50Ci1pbnQKLWludCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBwdXRMb25nSW50KAotaW50Ci1sb25nKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIHB1dFVMb25nSW50KAotaW50Ci1sb25nCi1ib29sZWFuKQotCi1wdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgc2lnbigKLWludCkKLQotcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiB0d29zQ29tcDJibigKLWJ5dGVbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gdHdvc0NvbXBGaXRzSW50b0J5dGVzKAotaW50Ci1pbnQpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24KLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBET01TVFJJTkdfU0laRV9FUlIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBISUVSQVJDSFlfUkVRVUVTVF9FUlIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBJTkRFWF9TSVpFX0VSUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IElOVVNFX0FUVFJJQlVURV9FUlIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBJTlZBTElEX0FDQ0VTU19FUlIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBJTlZBTElEX0NIQVJBQ1RFUl9FUlIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBJTlZBTElEX01PRElGSUNBVElPTl9FUlIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBJTlZBTElEX1NUQVRFX0VSUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IE5BTUVTUEFDRV9FUlIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBOT1RfRk9VTkRfRVJSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgTk9UX1NVUFBPUlRFRF9FUlIKLQotcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBOT19EQVRBX0FMTE9XRURfRVJSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgU1lOVEFYX0VSUgotCi1wdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IFdST05HX0RPQ1VNRU5UX0VSUgotCi1wdWJsaWMgc2hvcnQgY29kZQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLXNob3J0Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcueG1sLnNheC5BdHRyaWJ1dGVMaXN0IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0TGVuZ3RoKCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0TmFtZSgKLWludCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0VHlwZSgKLWludCkKLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0VHlwZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIGdldFZhbHVlKAotaW50KQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRWYWx1ZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy54bWwuc2F4LkRUREhhbmRsZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBub3RhdGlvbkRlY2woCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHVucGFyc2VkRW50aXR5RGVjbCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy54bWwuc2F4LkRvY3VtZW50SGFuZGxlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGNoYXJhY3RlcnMoCi1jaGFyW10KLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGVuZERvY3VtZW50KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBlbmRFbGVtZW50KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBpZ25vcmFibGVXaGl0ZXNwYWNlKAotY2hhcltdCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBwcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXREb2N1bWVudExvY2F0b3IoCi1vcmcueG1sLnNheC5Mb2NhdG9yKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHN0YXJ0RG9jdW1lbnQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHN0YXJ0RWxlbWVudCgKLWphdmEubGFuZy5TdHJpbmcKLW9yZy54bWwuc2F4LkF0dHJpYnV0ZUxpc3QpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLnhtbC5zYXguSGFuZGxlckJhc2UgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXIsIG9yZy54bWwuc2F4LkRUREhhbmRsZXIsIG9yZy54bWwuc2F4LkRvY3VtZW50SGFuZGxlciwgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKAotY2hhcltdCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBlbmREb2N1bWVudCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgZW5kRWxlbWVudCgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgZXJyb3IoCi1vcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBmYXRhbEVycm9yKAotb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb24pCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgaWdub3JhYmxlV2hpdGVzcGFjZSgKLWNoYXJbXQotaW50Ci1pbnQpCi0KLXB1YmxpYyB2b2lkIG5vdGF0aW9uRGVjbCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcHJvY2Vzc2luZ0luc3RydWN0aW9uKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHNldERvY3VtZW50TG9jYXRvcigKLW9yZy54bWwuc2F4LkxvY2F0b3IpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc3RhcnREb2N1bWVudCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KAotamF2YS5sYW5nLlN0cmluZwotb3JnLnhtbC5zYXguQXR0cmlidXRlTGlzdCkKLQotcHVibGljIHZvaWQgdW5wYXJzZWRFbnRpdHlEZWNsKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB3YXJuaW5nKAotb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb24pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2UgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgamF2YS5pby5JbnB1dFN0cmVhbSBieXRlU3RyZWFtCi0KLXByaXZhdGUgamF2YS5pby5SZWFkZXIgY2hhcmFjdGVyU3RyZWFtCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBlbmNvZGluZwotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcHVibGljSWQKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHN5c3RlbUlkCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5JbnB1dFN0cmVhbSkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5pby5SZWFkZXIpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmlvLklucHV0U3RyZWFtIGdldEJ5dGVTdHJlYW0oKQotCi1wdWJsaWMgamF2YS5pby5SZWFkZXIgZ2V0Q2hhcmFjdGVyU3RyZWFtKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RW5jb2RpbmcoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRQdWJsaWNJZCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFN5c3RlbUlkKCkKLQotcHVibGljIHZvaWQgc2V0Qnl0ZVN0cmVhbSgKLWphdmEuaW8uSW5wdXRTdHJlYW0pCi0KLXB1YmxpYyB2b2lkIHNldENoYXJhY3RlclN0cmVhbSgKLWphdmEuaW8uUmVhZGVyKQotCi1wdWJsaWMgdm9pZCBzZXRFbmNvZGluZygKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHNldFB1YmxpY0lkKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0U3lzdGVtSWQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcueG1sLnNheC5QYXJzZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBwYXJzZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgcGFyc2UoCi1vcmcueG1sLnNheC5JbnB1dFNvdXJjZSkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RFRESGFuZGxlcigKLW9yZy54bWwuc2F4LkRUREhhbmRsZXIpCi0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldERvY3VtZW50SGFuZGxlcigKLW9yZy54bWwuc2F4LkRvY3VtZW50SGFuZGxlcikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RW50aXR5UmVzb2x2ZXIoCi1vcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcikKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RXJyb3JIYW5kbGVyKAotb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldExvY2FsZSgKLWphdmEudXRpbC5Mb2NhbGUpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLnhtbC5zYXguU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiBleHRlbmRzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLnhtbC5zYXguU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4dGVuZHMgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLnhtbC5zYXguWE1MRmlsdGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy54bWwuc2F4LlhNTFJlYWRlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBvcmcueG1sLnNheC5YTUxSZWFkZXIgZ2V0UGFyZW50KCkKLQotcHVibGljIGFic3RyYWN0IHZvaWQgc2V0UGFyZW50KAotb3JnLnhtbC5zYXguWE1MUmVhZGVyKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcueG1sLnNheC5leHQuQXR0cmlidXRlczIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLnhtbC5zYXguQXR0cmlidXRlcwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzRGVjbGFyZWQoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzRGVjbGFyZWQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0RlY2xhcmVkKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNTcGVjaWZpZWQoCi1pbnQpCi0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzU3BlY2lmaWVkKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNTcGVjaWZpZWQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy54bWwuc2F4LmhlbHBlcnMuQXR0cmlidXRlc0ltcGwgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLnhtbC5zYXguQXR0cmlidXRlcwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gamF2YS5sYW5nLlN0cmluZ1tdIGRhdGEKLQotIGludCBsZW5ndGgKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcueG1sLnNheC5BdHRyaWJ1dGVzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2xhbmcvQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgYmFkSW5kZXgoCi1pbnQpCi0KLXByaXZhdGUgdm9pZCBlbnN1cmVDYXBhY2l0eSgKLWludCkKLQotcHVibGljIHZvaWQgYWRkQXR0cmlidXRlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgY2xlYXIoKQotCi1wdWJsaWMgaW50IGdldEluZGV4KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGludCBnZXRJbmRleCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TG9jYWxOYW1lKAotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRRTmFtZSgKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VHlwZSgKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VHlwZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFR5cGUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRVUkkoCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFZhbHVlKAotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRWYWx1ZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFZhbHVlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgcmVtb3ZlQXR0cmlidXRlKAotaW50KQotCi1wdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoCi1pbnQKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZXMoCi1vcmcueG1sLnNheC5BdHRyaWJ1dGVzKQotCi1wdWJsaWMgdm9pZCBzZXRMb2NhbE5hbWUoCi1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHNldFFOYW1lKAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRUeXBlKAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRVUkkoCi1pbnQKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyB2b2lkIHNldFZhbHVlKAotaW50Ci1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy54bWwuc2F4LmV4dC5BdHRyaWJ1dGVzMkltcGwgZXh0ZW5kcyBvcmcueG1sLnNheC5oZWxwZXJzLkF0dHJpYnV0ZXNJbXBsIGltcGxlbWVudHMgb3JnLnhtbC5zYXguZXh0LkF0dHJpYnV0ZXMyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgYm9vbGVhbltdIGRlY2xhcmVkCi0KLXByaXZhdGUgYm9vbGVhbltdIHNwZWNpZmllZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy54bWwuc2F4LkF0dHJpYnV0ZXMpCi0KLXB1YmxpYyB2b2lkIGFkZEF0dHJpYnV0ZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBib29sZWFuIGlzRGVjbGFyZWQoCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIGlzRGVjbGFyZWQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYm9vbGVhbiBpc0RlY2xhcmVkKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJvb2xlYW4gaXNTcGVjaWZpZWQoCi1pbnQpCi0KLXB1YmxpYyBib29sZWFuIGlzU3BlY2lmaWVkKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJvb2xlYW4gaXNTcGVjaWZpZWQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCByZW1vdmVBdHRyaWJ1dGUoCi1pbnQpCi0KLXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZXMoCi1vcmcueG1sLnNheC5BdHRyaWJ1dGVzKQotCi1wdWJsaWMgdm9pZCBzZXREZWNsYXJlZCgKLWludAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkKAotaW50Ci1ib29sZWFuKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcueG1sLnNheC5leHQuRGVjbEhhbmRsZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBhdHRyaWJ1dGVEZWNsKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBlbGVtZW50RGVjbCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgZXh0ZXJuYWxFbnRpdHlEZWNsKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBpbnRlcm5hbEVudGl0eURlY2woCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXIsIG9yZy54bWwuc2F4LkRUREhhbmRsZXIsIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyLCBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoCi1jaGFyW10KLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGVuZERvY3VtZW50KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBlbmRFbGVtZW50KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBlbmRQcmVmaXhNYXBwaW5nKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBlcnJvcigKLW9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoCi1vcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBpZ25vcmFibGVXaGl0ZXNwYWNlKAotY2hhcltdCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBub3RhdGlvbkRlY2woCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHByb2Nlc3NpbmdJbnN0cnVjdGlvbigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIG9yZy54bWwuc2F4LklucHV0U291cmNlIHJlc29sdmVFbnRpdHkoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXREb2N1bWVudExvY2F0b3IoCi1vcmcueG1sLnNheC5Mb2NhdG9yKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNraXBwZWRFbnRpdHkoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHN0YXJ0RG9jdW1lbnQoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLW9yZy54bWwuc2F4LkF0dHJpYnV0ZXMpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc3RhcnRQcmVmaXhNYXBwaW5nKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB1bnBhcnNlZEVudGl0eURlY2woCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHdhcm5pbmcoCi1vcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3Mgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgY29tbWVudCgKLWNoYXJbXQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgZW5kQ0RBVEEoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGVuZERURCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgZW5kRW50aXR5KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdGFydENEQVRBKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdGFydERURCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIGFic3RyYWN0IHZvaWQgc3RhcnRFbnRpdHkoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBjbGFzcyBvcmcueG1sLnNheC5leHQuRW50aXR5UmVzb2x2ZXIyIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgYWJzdHJhY3Qgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2UgZ2V0RXh0ZXJuYWxTdWJzZXQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBhYnN0cmFjdCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcueG1sLnNheC5leHQuRGVmYXVsdEhhbmRsZXIyIGV4dGVuZHMgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlciBpbXBsZW1lbnRzIG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlciwgb3JnLnhtbC5zYXguZXh0LkRlY2xIYW5kbGVyLCBvcmcueG1sLnNheC5leHQuRW50aXR5UmVzb2x2ZXIyCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBhdHRyaWJ1dGVEZWNsKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjb21tZW50KAotY2hhcltdCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBlbGVtZW50RGVjbCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgZW5kQ0RBVEEoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGVuZERURCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgZW5kRW50aXR5KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBleHRlcm5hbEVudGl0eURlY2woCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBvcmcueG1sLnNheC5JbnB1dFNvdXJjZSBnZXRFeHRlcm5hbFN1YnNldCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgaW50ZXJuYWxFbnRpdHlEZWNsKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIG9yZy54bWwuc2F4LklucHV0U291cmNlIHJlc29sdmVFbnRpdHkoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHN0YXJ0Q0RBVEEoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHN0YXJ0RFREKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzdGFydEVudGl0eSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIG9yZy54bWwuc2F4LmV4dC5Mb2NhdG9yMiBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcueG1sLnNheC5Mb2NhdG9yCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgZ2V0RW5jb2RpbmcoKQotCi1wdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLlN0cmluZyBnZXRYTUxWZXJzaW9uKCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcueG1sLnNheC5oZWxwZXJzLkxvY2F0b3JJbXBsIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy54bWwuc2F4LkxvY2F0b3IKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBpbnQgY29sdW1uTnVtYmVyCi0KLXByaXZhdGUgaW50IGxpbmVOdW1iZXIKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHB1YmxpY0lkCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBzeXN0ZW1JZAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy54bWwuc2F4LkxvY2F0b3IpCi0KLXB1YmxpYyBpbnQgZ2V0Q29sdW1uTnVtYmVyKCkKLQotcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UHVibGljSWQoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTeXN0ZW1JZCgpCi0KLXB1YmxpYyB2b2lkIHNldENvbHVtbk51bWJlcigKLWludCkKLQotcHVibGljIHZvaWQgc2V0TGluZU51bWJlcigKLWludCkKLQotcHVibGljIHZvaWQgc2V0UHVibGljSWQoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRTeXN0ZW1JZCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLnhtbC5zYXguZXh0LkxvY2F0b3IySW1wbCBleHRlbmRzIG9yZy54bWwuc2F4LmhlbHBlcnMuTG9jYXRvckltcGwgaW1wbGVtZW50cyBvcmcueG1sLnNheC5leHQuTG9jYXRvcjIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGVuY29kaW5nCi0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyB2ZXJzaW9uCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLnhtbC5zYXguTG9jYXRvcikKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RW5jb2RpbmcoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRYTUxWZXJzaW9uKCkKLQotcHVibGljIHZvaWQgc2V0RW5jb2RpbmcoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRYTUxWZXJzaW9uKAotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcueG1sLnNheC5oZWxwZXJzLkF0dHJpYnV0ZUxpc3RJbXBsIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy54bWwuc2F4LkF0dHJpYnV0ZUxpc3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotIGphdmEudXRpbC5WZWN0b3IgbmFtZXMKLQotIGphdmEudXRpbC5WZWN0b3IgdHlwZXMKLQotIGphdmEudXRpbC5WZWN0b3IgdmFsdWVzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIHZvaWQgPGluaXQ+KCkKLQotcHVibGljIHZvaWQgPGluaXQ+KAotb3JnLnhtbC5zYXguQXR0cmlidXRlTGlzdCkKLQotcHVibGljIHZvaWQgYWRkQXR0cmlidXRlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgY2xlYXIoKQotCi1wdWJsaWMgaW50IGdldExlbmd0aCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE5hbWUoCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFR5cGUoCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFR5cGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRWYWx1ZSgKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VmFsdWUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCByZW1vdmVBdHRyaWJ1dGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVMaXN0KAotb3JnLnhtbC5zYXguQXR0cmlidXRlTGlzdCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uSW5uZXJDbGFzcyAoYWNjZXNzRmxhZ3MgPTE2IG5hbWUgPUNvbnRleHQgKQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy94bWwvc2F4L2hlbHBlcnMvTmFtZXNwYWNlU3VwcG9ydDsgKQotZmluYWwgY2xhc3Mgb3JnLnhtbC5zYXguaGVscGVycy5OYW1lc3BhY2VTdXBwb3J0JENvbnRleHQgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSBqYXZhLnV0aWwuSGFzaHRhYmxlIGF0dHJpYnV0ZU5hbWVUYWJsZQotCi1wcml2YXRlIGJvb2xlYW4gZGVjbFNlZW4KLQotcHJpdmF0ZSBqYXZhLnV0aWwuVmVjdG9yIGRlY2xhcmF0aW9ucwotCi0gYm9vbGVhbiBkZWNsc09LCi0KLSBqYXZhLmxhbmcuU3RyaW5nIGRlZmF1bHROUwotCi0gamF2YS51dGlsLkhhc2h0YWJsZSBlbGVtZW50TmFtZVRhYmxlCi0KLXByaXZhdGUgb3JnLnhtbC5zYXguaGVscGVycy5OYW1lc3BhY2VTdXBwb3J0JENvbnRleHQgcGFyZW50Ci0KLSBqYXZhLnV0aWwuSGFzaHRhYmxlIHByZWZpeFRhYmxlCi0KLWZpbmFsIG9yZy54bWwuc2F4LmhlbHBlcnMuTmFtZXNwYWNlU3VwcG9ydCB0aGlzJDAKLQotIGphdmEudXRpbC5IYXNodGFibGUgdXJpVGFibGUKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oCi1vcmcueG1sLnNheC5oZWxwZXJzLk5hbWVzcGFjZVN1cHBvcnQpCi0KLXByaXZhdGUgdm9pZCBjb3B5VGFibGVzKCkKLQotIHZvaWQgY2xlYXIoKQotCi0gdm9pZCBkZWNsYXJlUHJlZml4KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotIGphdmEudXRpbC5FbnVtZXJhdGlvbiBnZXREZWNsYXJlZFByZWZpeGVzKCkKLQotIGphdmEubGFuZy5TdHJpbmcgZ2V0UHJlZml4KAotamF2YS5sYW5nLlN0cmluZykKLQotIGphdmEudXRpbC5FbnVtZXJhdGlvbiBnZXRQcmVmaXhlcygpCi0KLSBqYXZhLmxhbmcuU3RyaW5nIGdldFVSSSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLSBqYXZhLmxhbmcuU3RyaW5nW10gcHJvY2Vzc05hbWUoCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuKQotCi0gdm9pZCBzZXRQYXJlbnQoCi1vcmcueG1sLnNheC5oZWxwZXJzLk5hbWVzcGFjZVN1cHBvcnQkQ29udGV4dCkKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxvcmcveG1sL3NheC9oZWxwZXJzL05hbWVzcGFjZVN1cHBvcnQkQ29udGV4dDsgKQotcHVibGljIGNsYXNzIG9yZy54bWwuc2F4LmhlbHBlcnMuTmFtZXNwYWNlU3VwcG9ydCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS51dGlsLkVudW1lcmF0aW9uIEVNUFRZX0VOVU1FUkFUSU9OCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBOU0RFQ0wKLQotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFhNTE5TCi0KLXByaXZhdGUgaW50IGNvbnRleHRQb3MKLQotcHJpdmF0ZSBvcmcueG1sLnNheC5oZWxwZXJzLk5hbWVzcGFjZVN1cHBvcnQkQ29udGV4dFtdIGNvbnRleHRzCi0KLXByaXZhdGUgb3JnLnhtbC5zYXguaGVscGVycy5OYW1lc3BhY2VTdXBwb3J0JENvbnRleHQgY3VycmVudENvbnRleHQKLQotcHJpdmF0ZSBib29sZWFuIG5hbWVzcGFjZURlY2xVcmlzCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgPGNsaW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1zdGF0aWMgYm9vbGVhbiBhY2Nlc3MkMDAwKAotb3JnLnhtbC5zYXguaGVscGVycy5OYW1lc3BhY2VTdXBwb3J0KQotCi1zdGF0aWMgamF2YS51dGlsLkVudW1lcmF0aW9uIGFjY2VzcyQxMDAoKQotCi1wdWJsaWMgYm9vbGVhbiBkZWNsYXJlUHJlZml4KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEudXRpbC5FbnVtZXJhdGlvbiBnZXREZWNsYXJlZFByZWZpeGVzKCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UHJlZml4KAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEudXRpbC5FbnVtZXJhdGlvbiBnZXRQcmVmaXhlcygpCi0KLXB1YmxpYyBqYXZhLnV0aWwuRW51bWVyYXRpb24gZ2V0UHJlZml4ZXMoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRVUkkoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgYm9vbGVhbiBpc05hbWVzcGFjZURlY2xVcmlzKCkKLQotcHVibGljIHZvaWQgcG9wQ29udGV4dCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gcHJvY2Vzc05hbWUoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nW10KLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHB1c2hDb250ZXh0KCkKLQotcHVibGljIHZvaWQgcmVzZXQoKQotCi1wdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VEZWNsVXJpcygKLWJvb2xlYW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi0gY2xhc3Mgb3JnLnhtbC5zYXguaGVscGVycy5OZXdJbnN0YW5jZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi0gdm9pZCA8aW5pdD4oKQotCi1zdGF0aWMgamF2YS5sYW5nLkNsYXNzTG9hZGVyIGdldENsYXNzTG9hZGVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0NsYXNzTm90Rm91bmRFeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsQWNjZXNzRXhjZXB0aW9uO0xqYXZhL2xhbmcvSW5zdGFudGlhdGlvbkV4Y2VwdGlvbjsgKQotc3RhdGljIGphdmEubGFuZy5PYmplY3QgbmV3SW5zdGFuY2UoCi1qYXZhLmxhbmcuQ2xhc3NMb2FkZXIKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLkVuY2xvc2luZ0NsYXNzICh2YWx1ZSA9TG9yZy94bWwvc2F4L2hlbHBlcnMvUGFyc2VyQWRhcHRlcjsgKQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNiBuYW1lID1BdHRyaWJ1dGVMaXN0QWRhcHRlciApCi1maW5hbCBjbGFzcyBvcmcueG1sLnNheC5oZWxwZXJzLlBhcnNlckFkYXB0ZXIkQXR0cmlidXRlTGlzdEFkYXB0ZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLnhtbC5zYXguQXR0cmlidXRlcwotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIG9yZy54bWwuc2F4LkF0dHJpYnV0ZUxpc3QgcUF0dHMKLQotZmluYWwgb3JnLnhtbC5zYXguaGVscGVycy5QYXJzZXJBZGFwdGVyIHRoaXMkMAotLS0tLS0tLS0tLS0tLS0tLU1FVEhPRFMtLS0tLS0tLS0tLS0tLS0tCi0KLSB2b2lkIDxpbml0PigKLW9yZy54bWwuc2F4LmhlbHBlcnMuUGFyc2VyQWRhcHRlcikKLQotcHVibGljIGludCBnZXRJbmRleCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBpbnQgZ2V0SW5kZXgoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgaW50IGdldExlbmd0aCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldExvY2FsTmFtZSgKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UU5hbWUoCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFR5cGUoCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFR5cGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRUeXBlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VVJJKAotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRWYWx1ZSgKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VmFsdWUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRWYWx1ZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi0KLSB2b2lkIHNldEF0dHJpYnV0ZUxpc3QoCi1vcmcueG1sLnNheC5BdHRyaWJ1dGVMaXN0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLUBkYWx2aWsuYW5ub3RhdGlvbi5NZW1iZXJDbGFzc2VzICh2YWx1ZSA9TG9yZy94bWwvc2F4L2hlbHBlcnMvUGFyc2VyQWRhcHRlciRBdHRyaWJ1dGVMaXN0QWRhcHRlcjsgKQotcHVibGljIGNsYXNzIG9yZy54bWwuc2F4LmhlbHBlcnMuUGFyc2VyQWRhcHRlciBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaW1wbGVtZW50cyBvcmcueG1sLnNheC5YTUxSZWFkZXIsIG9yZy54bWwuc2F4LkRvY3VtZW50SGFuZGxlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEZFQVRVUkVTCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTkFNRVNQQUNFUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE5BTUVTUEFDRV9QUkVGSVhFUwotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFhNTE5TX1VSSXMKLQotcHJpdmF0ZSBvcmcueG1sLnNheC5oZWxwZXJzLlBhcnNlckFkYXB0ZXIkQXR0cmlidXRlTGlzdEFkYXB0ZXIgYXR0QWRhcHRlcgotCi1wcml2YXRlIG9yZy54bWwuc2F4LmhlbHBlcnMuQXR0cmlidXRlc0ltcGwgYXR0cwotCi0gb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIgY29udGVudEhhbmRsZXIKLQotIG9yZy54bWwuc2F4LkRUREhhbmRsZXIgZHRkSGFuZGxlcgotCi0gb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXIgZW50aXR5UmVzb2x2ZXIKLQotIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIKLQotIG9yZy54bWwuc2F4LkxvY2F0b3IgbG9jYXRvcgotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmdbXSBuYW1lUGFydHMKLQotcHJpdmF0ZSBib29sZWFuIG5hbWVzcGFjZXMKLQotcHJpdmF0ZSBvcmcueG1sLnNheC5oZWxwZXJzLk5hbWVzcGFjZVN1cHBvcnQgbnNTdXBwb3J0Ci0KLXByaXZhdGUgb3JnLnhtbC5zYXguUGFyc2VyIHBhcnNlcgotCi1wcml2YXRlIGJvb2xlYW4gcGFyc2luZwotCi1wcml2YXRlIGJvb2xlYW4gcHJlZml4ZXMKLQotcHJpdmF0ZSBib29sZWFuIHVyaXMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIDxpbml0PigpCi0KLXB1YmxpYyB2b2lkIDxpbml0PigKLW9yZy54bWwuc2F4LlBhcnNlcikKLQotc3RhdGljIG9yZy54bWwuc2F4LmhlbHBlcnMuQXR0cmlidXRlc0ltcGwgYWNjZXNzJDAwMCgKLW9yZy54bWwuc2F4LmhlbHBlcnMuUGFyc2VyQWRhcHRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgY2hlY2tOb3RQYXJzaW5nKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHJpdmF0ZSBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbiBtYWtlRXhjZXB0aW9uKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmdbXSBwcm9jZXNzTmFtZSgKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4KLWJvb2xlYW4pCi0KLXByaXZhdGUgdm9pZCBzZXR1cCgKLW9yZy54bWwuc2F4LlBhcnNlcikKLQotcHJpdmF0ZSB2b2lkIHNldHVwUGFyc2VyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKAotY2hhcltdCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBlbmREb2N1bWVudCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgZW5kRWxlbWVudCgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciBnZXRDb250ZW50SGFuZGxlcigpCi0KLXB1YmxpYyBvcmcueG1sLnNheC5EVERIYW5kbGVyIGdldERUREhhbmRsZXIoKQotCi1wdWJsaWMgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXIgZ2V0RW50aXR5UmVzb2x2ZXIoKQotCi1wdWJsaWMgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyIGdldEVycm9ySGFuZGxlcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWE5vdFJlY29nbml6ZWRFeGNlcHRpb247TG9yZy94bWwvc2F4L1NBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gZ2V0RmVhdHVyZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWE5vdFJlY29nbml6ZWRFeGNlcHRpb247TG9yZy94bWwvc2F4L1NBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0UHJvcGVydHkoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGlnbm9yYWJsZVdoaXRlc3BhY2UoCi1jaGFyW10KLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xvcmcveG1sL3NheC9TQVhFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHBhcnNlKAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9pby9JT0V4Y2VwdGlvbjtMb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBwYXJzZSgKLW9yZy54bWwuc2F4LklucHV0U291cmNlKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHByb2Nlc3NpbmdJbnN0cnVjdGlvbigKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotIHZvaWQgcmVwb3J0RXJyb3IoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCBzZXRDb250ZW50SGFuZGxlcigKLW9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyKQotCi1wdWJsaWMgdm9pZCBzZXREVERIYW5kbGVyKAotb3JnLnhtbC5zYXguRFRESGFuZGxlcikKLQotcHVibGljIHZvaWQgc2V0RG9jdW1lbnRMb2NhdG9yKAotb3JnLnhtbC5zYXguTG9jYXRvcikKLQotcHVibGljIHZvaWQgc2V0RW50aXR5UmVzb2x2ZXIoCi1vcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcikKLQotcHVibGljIHZvaWQgc2V0RXJyb3JIYW5kbGVyKAotb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uO0xvcmcveG1sL3NheC9TQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldEZlYXR1cmUoCi1qYXZhLmxhbmcuU3RyaW5nCi1ib29sZWFuKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uO0xvcmcveG1sL3NheC9TQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldFByb3BlcnR5KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzdGFydERvY3VtZW50KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoCi1qYXZhLmxhbmcuU3RyaW5nCi1vcmcueG1sLnNheC5BdHRyaWJ1dGVMaXN0KQotCi1fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fCi0KLQotcHVibGljIGNsYXNzIG9yZy54bWwuc2F4LmhlbHBlcnMuUGFyc2VyRmFjdG9yeSBleHRlbmRzIGphdmEubGFuZy5PYmplY3QKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0NsYXNzTm90Rm91bmRFeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsQWNjZXNzRXhjZXB0aW9uO0xqYXZhL2xhbmcvSW5zdGFudGlhdGlvbkV4Y2VwdGlvbjtMamF2YS9sYW5nL051bGxQb2ludGVyRXhjZXB0aW9uO0xqYXZhL2xhbmcvQ2xhc3NDYXN0RXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIG9yZy54bWwuc2F4LlBhcnNlciBtYWtlUGFyc2VyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1MamF2YS9sYW5nL0NsYXNzTm90Rm91bmRFeGNlcHRpb247TGphdmEvbGFuZy9JbGxlZ2FsQWNjZXNzRXhjZXB0aW9uO0xqYXZhL2xhbmcvSW5zdGFudGlhdGlvbkV4Y2VwdGlvbjtMamF2YS9sYW5nL0NsYXNzQ2FzdEV4Y2VwdGlvbjsgKQotcHVibGljIHN0YXRpYyBvcmcueG1sLnNheC5QYXJzZXIgbWFrZVBhcnNlcigKLWphdmEubGFuZy5TdHJpbmcpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLnhtbC5zYXguaGVscGVycy5YTUxGaWx0ZXJJbXBsIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIG9yZy54bWwuc2F4LlhNTEZpbHRlciwgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXIsIG9yZy54bWwuc2F4LkRUREhhbmRsZXIsIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyLCBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIKLQotLS0tLS0tLS0tLS0tLS0tLUZJRUxEUy0tLS0tLS0tLS0tLS0tLS0KLQotcHJpdmF0ZSBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciBjb250ZW50SGFuZGxlcgotCi1wcml2YXRlIG9yZy54bWwuc2F4LkRUREhhbmRsZXIgZHRkSGFuZGxlcgotCi1wcml2YXRlIG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyIGVudGl0eVJlc29sdmVyCi0KLXByaXZhdGUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlcgotCi1wcml2YXRlIG9yZy54bWwuc2F4LkxvY2F0b3IgbG9jYXRvcgotCi1wcml2YXRlIG9yZy54bWwuc2F4LlhNTFJlYWRlciBwYXJlbnQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcueG1sLnNheC5YTUxSZWFkZXIpCi0KLXByaXZhdGUgdm9pZCBzZXR1cFBhcnNlKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKAotY2hhcltdCi1pbnQKLWludCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBlbmREb2N1bWVudCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgZW5kRWxlbWVudCgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgZW5kUHJlZml4TWFwcGluZygKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgZXJyb3IoCi1vcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBmYXRhbEVycm9yKAotb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb24pCi0KLXB1YmxpYyBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciBnZXRDb250ZW50SGFuZGxlcigpCi0KLXB1YmxpYyBvcmcueG1sLnNheC5EVERIYW5kbGVyIGdldERUREhhbmRsZXIoKQotCi1wdWJsaWMgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXIgZ2V0RW50aXR5UmVzb2x2ZXIoKQotCi1wdWJsaWMgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyIGdldEVycm9ySGFuZGxlcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWE5vdFJlY29nbml6ZWRFeGNlcHRpb247TG9yZy94bWwvc2F4L1NBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gZ2V0RmVhdHVyZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBvcmcueG1sLnNheC5YTUxSZWFkZXIgZ2V0UGFyZW50KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbjtMb3JnL3htbC9zYXgvU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uOyApCi1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRQcm9wZXJ0eSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgaWdub3JhYmxlV2hpdGVzcGFjZSgKLWNoYXJbXQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgbm90YXRpb25EZWNsKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uO0xqYXZhL2lvL0lPRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBwYXJzZSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcGFyc2UoCi1vcmcueG1sLnNheC5JbnB1dFNvdXJjZSkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBwcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyBvcmcueG1sLnNheC5JbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0Q29udGVudEhhbmRsZXIoCi1vcmcueG1sLnNheC5Db250ZW50SGFuZGxlcikKLQotcHVibGljIHZvaWQgc2V0RFRESGFuZGxlcigKLW9yZy54bWwuc2F4LkRUREhhbmRsZXIpCi0KLXB1YmxpYyB2b2lkIHNldERvY3VtZW50TG9jYXRvcigKLW9yZy54bWwuc2F4LkxvY2F0b3IpCi0KLXB1YmxpYyB2b2lkIHNldEVudGl0eVJlc29sdmVyKAotb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXIpCi0KLXB1YmxpYyB2b2lkIHNldEVycm9ySGFuZGxlcigKLW9yZy54bWwuc2F4LkVycm9ySGFuZGxlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbjtMb3JnL3htbC9zYXgvU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRGZWF0dXJlKAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0UGFyZW50KAotb3JnLnhtbC5zYXguWE1MUmVhZGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uO0xvcmcveG1sL3NheC9TQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldFByb3BlcnR5KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLk9iamVjdCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBza2lwcGVkRW50aXR5KAotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzdGFydERvY3VtZW50KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1qYXZhLmxhbmcuU3RyaW5nCi1vcmcueG1sLnNheC5BdHRyaWJ1dGVzKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHN0YXJ0UHJlZml4TWFwcGluZygKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgdW5wYXJzZWRFbnRpdHlEZWNsKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCB3YXJuaW5nKAotb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb24pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotQGRhbHZpay5hbm5vdGF0aW9uLklubmVyQ2xhc3MgKGFjY2Vzc0ZsYWdzID0xNiBuYW1lID1BdHRyaWJ1dGVzQWRhcHRlciApCi1AZGFsdmlrLmFubm90YXRpb24uRW5jbG9zaW5nQ2xhc3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvaGVscGVycy9YTUxSZWFkZXJBZGFwdGVyOyApCi1maW5hbCBjbGFzcyBvcmcueG1sLnNheC5oZWxwZXJzLlhNTFJlYWRlckFkYXB0ZXIkQXR0cmlidXRlc0FkYXB0ZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLnhtbC5zYXguQXR0cmlidXRlTGlzdAotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIG9yZy54bWwuc2F4LkF0dHJpYnV0ZXMgYXR0cmlidXRlcwotCi1maW5hbCBvcmcueG1sLnNheC5oZWxwZXJzLlhNTFJlYWRlckFkYXB0ZXIgdGhpcyQwCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLQotIHZvaWQgPGluaXQ+KAotb3JnLnhtbC5zYXguaGVscGVycy5YTUxSZWFkZXJBZGFwdGVyKQotCi1wdWJsaWMgaW50IGdldExlbmd0aCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE5hbWUoCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFR5cGUoCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFR5cGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRWYWx1ZSgKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VmFsdWUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi0gdm9pZCBzZXRBdHRyaWJ1dGVzKAotb3JnLnhtbC5zYXguQXR0cmlidXRlcykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi1AZGFsdmlrLmFubm90YXRpb24uTWVtYmVyQ2xhc3NlcyAodmFsdWUgPUxvcmcveG1sL3NheC9oZWxwZXJzL1hNTFJlYWRlckFkYXB0ZXIkQXR0cmlidXRlc0FkYXB0ZXI7ICkKLXB1YmxpYyBjbGFzcyBvcmcueG1sLnNheC5oZWxwZXJzLlhNTFJlYWRlckFkYXB0ZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLnhtbC5zYXguUGFyc2VyLCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi0gb3JnLnhtbC5zYXguRG9jdW1lbnRIYW5kbGVyIGRvY3VtZW50SGFuZGxlcgotCi0gb3JnLnhtbC5zYXguaGVscGVycy5YTUxSZWFkZXJBZGFwdGVyJEF0dHJpYnV0ZXNBZGFwdGVyIHFBdHRzCi0KLSBvcmcueG1sLnNheC5YTUxSZWFkZXIgeG1sUmVhZGVyCi0tLS0tLS0tLS0tLS0tLS0tTUVUSE9EUy0tLS0tLS0tLS0tLS0tLS0KLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcueG1sLnNheC5YTUxSZWFkZXIpCi0KLXByaXZhdGUgdm9pZCBzZXR1cCgKLW9yZy54bWwuc2F4LlhNTFJlYWRlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wcml2YXRlIHZvaWQgc2V0dXBYTUxSZWFkZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoCi1jaGFyW10KLWludAotaW50KQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIGVuZERvY3VtZW50KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBlbmRFbGVtZW50KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgZW5kUHJlZml4TWFwcGluZygKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgaWdub3JhYmxlV2hpdGVzcGFjZSgKLWNoYXJbXQotaW50Ci1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TGphdmEvaW8vSU9FeGNlcHRpb247TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcGFyc2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxqYXZhL2lvL0lPRXhjZXB0aW9uO0xvcmcveG1sL3NheC9TQVhFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHBhcnNlKAotb3JnLnhtbC5zYXguSW5wdXRTb3VyY2UpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcHJvY2Vzc2luZ0luc3RydWN0aW9uKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIHZvaWQgc2V0RFRESGFuZGxlcigKLW9yZy54bWwuc2F4LkRUREhhbmRsZXIpCi0KLXB1YmxpYyB2b2lkIHNldERvY3VtZW50SGFuZGxlcigKLW9yZy54bWwuc2F4LkRvY3VtZW50SGFuZGxlcikKLQotcHVibGljIHZvaWQgc2V0RG9jdW1lbnRMb2NhdG9yKAotb3JnLnhtbC5zYXguTG9jYXRvcikKLQotcHVibGljIHZvaWQgc2V0RW50aXR5UmVzb2x2ZXIoCi1vcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcikKLQotcHVibGljIHZvaWQgc2V0RXJyb3JIYW5kbGVyKAotb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHNldExvY2FsZSgKLWphdmEudXRpbC5Mb2NhbGUpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2tpcHBlZEVudGl0eSgKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc3RhcnREb2N1bWVudCgpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotb3JnLnhtbC5zYXguQXR0cmlidXRlcykKLQotcHVibGljIHZvaWQgc3RhcnRQcmVmaXhNYXBwaW5nKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBvcmcueG1sLnNheC5oZWxwZXJzLlhNTFJlYWRlckZhY3RvcnkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgcHJvcGVydHkKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wcml2YXRlIHZvaWQgPGluaXQ+KCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIG9yZy54bWwuc2F4LlhNTFJlYWRlciBjcmVhdGVYTUxSZWFkZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgb3JnLnhtbC5zYXguWE1MUmVhZGVyIGNyZWF0ZVhNTFJlYWRlcigKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHJpdmF0ZSBzdGF0aWMgb3JnLnhtbC5zYXguWE1MUmVhZGVyIGxvYWRDbGFzcygKLWphdmEubGFuZy5DbGFzc0xvYWRlcgotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBjbGFzcyBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLkV4Y2VwdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLQotCi1wcm90ZWN0ZWQgaW50IGNvbHVtbgotCi1wcm90ZWN0ZWQgamF2YS5sYW5nLlRocm93YWJsZSBkZXRhaWwKLQotcHJvdGVjdGVkIGludCByb3cKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1qYXZhLmxhbmcuU3RyaW5nCi1vcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyCi1qYXZhLmxhbmcuVGhyb3dhYmxlKQotCi1wdWJsaWMgaW50IGdldENvbHVtbk51bWJlcigpCi0KLXB1YmxpYyBqYXZhLmxhbmcuVGhyb3dhYmxlIGdldERldGFpbCgpCi0KLXB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpCi0KLXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZSgpCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckZhY3RvcnkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQUk9QRVJUWV9OQU1FCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUkVTT1VSQ0VfTkFNRQotCi1zdGF0aWMgZmluYWwgamF2YS5sYW5nLkNsYXNzIHJlZmVyZW5jZUNvbnRleHRDbGFzcwotCi1wcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBjbGFzc05hbWVzTG9jYXRpb24KLQotcHJvdGVjdGVkIGphdmEudXRpbC5IYXNoTWFwIGZlYXR1cmVzCi0KLXByb3RlY3RlZCBqYXZhLnV0aWwuQXJyYXlMaXN0IHBhcnNlckNsYXNzZXMKLQotcHJvdGVjdGVkIGphdmEudXRpbC5BcnJheUxpc3Qgc2VyaWFsaXplckNsYXNzZXMKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByb3RlY3RlZCB2b2lkIDxpbml0PigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247ICkKLXB1YmxpYyBzdGF0aWMgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckZhY3RvcnkgbmV3SW5zdGFuY2UoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOyApCi1wdWJsaWMgc3RhdGljIG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJGYWN0b3J5IG5ld0luc3RhbmNlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLkNsYXNzKQotCi1wdWJsaWMgYm9vbGVhbiBnZXRGZWF0dXJlKAotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGJvb2xlYW4gaXNOYW1lc3BhY2VBd2FyZSgpCi0KLXB1YmxpYyBib29sZWFuIGlzVmFsaWRhdGluZygpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWxwdWxsL3YxL1htbFB1bGxQYXJzZXJFeGNlcHRpb247ICkKLXB1YmxpYyBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyIG5ld1B1bGxQYXJzZXIoKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOyApCi1wdWJsaWMgb3JnLnhtbHB1bGwudjEuWG1sU2VyaWFsaXplciBuZXdTZXJpYWxpemVyKCkKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbHB1bGwvdjEvWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgc2V0RmVhdHVyZSgKLWphdmEubGFuZy5TdHJpbmcKLWJvb2xlYW4pCi0KLXB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZUF3YXJlKAotYm9vbGVhbikKLQotcHVibGljIHZvaWQgc2V0VmFsaWRhdGluZygKLWJvb2xlYW4pCi0KLV9fX19fX19fX19fX19fX19DTEFTU19fX19fX19fX19fX19fX18KLQotCi1wdWJsaWMgY2xhc3Mgb3JnLnhtbHB1bGwudjEuc2F4Mi5Ecml2ZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGltcGxlbWVudHMgb3JnLnhtbC5zYXguTG9jYXRvciwgb3JnLnhtbC5zYXguWE1MUmVhZGVyLCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzCi0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByb3RlY3RlZCBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBUEFDSEVfRFlOQU1JQ19WQUxJREFUSU9OX0ZFQVRVUkUKLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFQQUNIRV9TQ0hFTUFfVkFMSURBVElPTl9GRUFUVVJFCi0KLXByb3RlY3RlZCBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBERUNMQVJBVElPTl9IQU5ETEVSX1BST1BFUlRZCi0KLXByb3RlY3RlZCBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBMRVhJQ0FMX0hBTkRMRVJfUFJPUEVSVFkKLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIE5BTUVTUEFDRVNfRkVBVFVSRQotCi1wcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTkFNRVNQQUNFX1BSRUZJWEVTX0ZFQVRVUkUKLQotcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFZBTElEQVRJT05fRkVBVFVSRQotCi1wcm90ZWN0ZWQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIgY29udGVudEhhbmRsZXIKLQotcHJvdGVjdGVkIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIKLQotcHJvdGVjdGVkIG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXIgcHAKLQotcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgc3lzdGVtSWQKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1scHVsbC92MS9YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCA8aW5pdD4oCi1vcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyKQotCi1wdWJsaWMgaW50IGdldENvbHVtbk51bWJlcigpCi0KLXB1YmxpYyBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciBnZXRDb250ZW50SGFuZGxlcigpCi0KLXB1YmxpYyBvcmcueG1sLnNheC5EVERIYW5kbGVyIGdldERUREhhbmRsZXIoKQotCi1wdWJsaWMgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXIgZ2V0RW50aXR5UmVzb2x2ZXIoKQotCi1wdWJsaWMgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyIGdldEVycm9ySGFuZGxlcigpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWE5vdFJlY29nbml6ZWRFeGNlcHRpb247TG9yZy94bWwvc2F4L1NBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsgKQotcHVibGljIGJvb2xlYW4gZ2V0RmVhdHVyZSgKLWphdmEubGFuZy5TdHJpbmcpCi0KLXB1YmxpYyBpbnQgZ2V0SW5kZXgoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgaW50IGdldEluZGV4KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGludCBnZXRMZW5ndGgoKQotCi1wdWJsaWMgaW50IGdldExpbmVOdW1iZXIoKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRMb2NhbE5hbWUoCi1pbnQpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWE5vdFJlY29nbml6ZWRFeGNlcHRpb247TG9yZy94bWwvc2F4L1NBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsgKQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0UHJvcGVydHkoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRQdWJsaWNJZCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFFOYW1lKAotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTeXN0ZW1JZCgpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFR5cGUoCi1pbnQpCi0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFR5cGUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRUeXBlKAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VVJJKAotaW50KQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRWYWx1ZSgKLWludCkKLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VmFsdWUoCi1qYXZhLmxhbmcuU3RyaW5nKQotCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRWYWx1ZSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5TdHJpbmcpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcGFyc2UoCi1qYXZhLmxhbmcuU3RyaW5nKQotQGRhbHZpay5hbm5vdGF0aW9uLlRocm93cyAodmFsdWUgPUxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247TGphdmEvaW8vSU9FeGNlcHRpb247ICkKLXB1YmxpYyB2b2lkIHBhcnNlKAotb3JnLnhtbC5zYXguSW5wdXRTb3VyY2UpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjtMamF2YS9pby9JT0V4Y2VwdGlvbjsgKQotcHVibGljIHZvaWQgcGFyc2VTdWJUcmVlKAotb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcikKLQotcHVibGljIHZvaWQgc2V0Q29udGVudEhhbmRsZXIoCi1vcmcueG1sLnNheC5Db250ZW50SGFuZGxlcikKLQotcHVibGljIHZvaWQgc2V0RFRESGFuZGxlcigKLW9yZy54bWwuc2F4LkRUREhhbmRsZXIpCi0KLXB1YmxpYyB2b2lkIHNldEVudGl0eVJlc29sdmVyKAotb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXIpCi0KLXB1YmxpYyB2b2lkIHNldEVycm9ySGFuZGxlcigKLW9yZy54bWwuc2F4LkVycm9ySGFuZGxlcikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbjtMb3JnL3htbC9zYXgvU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRGZWF0dXJlKAotamF2YS5sYW5nLlN0cmluZwotYm9vbGVhbikKLUBkYWx2aWsuYW5ub3RhdGlvbi5UaHJvd3MgKHZhbHVlID1Mb3JnL3htbC9zYXgvU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbjtMb3JnL3htbC9zYXgvU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uOyApCi1wdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eSgKLWphdmEubGFuZy5TdHJpbmcKLWphdmEubGFuZy5PYmplY3QpCi1AZGFsdmlrLmFubm90YXRpb24uVGhyb3dzICh2YWx1ZSA9TG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbjsgKQotcHJvdGVjdGVkIHZvaWQgc3RhcnRFbGVtZW50KAotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZwotamF2YS5sYW5nLlN0cmluZykKLQotX19fX19fX19fX19fX19fX0NMQVNTX19fX19fX19fX19fX19fXwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBzdW4ubWlzYy5VbnNhZmUgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Ci0KLS0tLS0tLS0tLS0tLS0tLS1GSUVMRFMtLS0tLS0tLS0tLS0tLS0tCi0KLXByaXZhdGUgc3RhdGljIGZpbmFsIHN1bi5taXNjLlVuc2FmZSBUSEVfT05FCi0KLXByaXZhdGUgZmluYWwgb3JnLmFwYWNoZS5oYXJtb255Lmtlcm5lbC52bS5MYW5nQWNjZXNzIGxhbmcKLS0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCA8Y2xpbml0PigpCi0KLXByaXZhdGUgdm9pZCA8aW5pdD4oKQotCi1wcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IGFycmF5QmFzZU9mZnNldDAoCi1qYXZhLmxhbmcuQ2xhc3MpCi0KLXByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgYXJyYXlJbmRleFNjYWxlMCgKLWphdmEubGFuZy5DbGFzcykKLQotcHVibGljIHN0YXRpYyBzdW4ubWlzYy5VbnNhZmUgZ2V0VW5zYWZlKCkKLQotcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGxvbmcgb2JqZWN0RmllbGRPZmZzZXQwKAotamF2YS5sYW5nLnJlZmxlY3QuRmllbGQpCi0KLXB1YmxpYyBpbnQgYXJyYXlCYXNlT2Zmc2V0KAotamF2YS5sYW5nLkNsYXNzKQotCi1wdWJsaWMgaW50IGFycmF5SW5kZXhTY2FsZSgKLWphdmEubGFuZy5DbGFzcykKLQotcHVibGljIG5hdGl2ZSBib29sZWFuIGNvbXBhcmVBbmRTd2FwSW50KAotamF2YS5sYW5nLk9iamVjdAotbG9uZwotaW50Ci1pbnQpCi0KLXB1YmxpYyBuYXRpdmUgYm9vbGVhbiBjb21wYXJlQW5kU3dhcExvbmcoCi1qYXZhLmxhbmcuT2JqZWN0Ci1sb25nCi1sb25nCi1sb25nKQotCi1wdWJsaWMgbmF0aXZlIGJvb2xlYW4gY29tcGFyZUFuZFN3YXBPYmplY3QoCi1qYXZhLmxhbmcuT2JqZWN0Ci1sb25nCi1qYXZhLmxhbmcuT2JqZWN0Ci1qYXZhLmxhbmcuT2JqZWN0KQotCi1wdWJsaWMgbmF0aXZlIGludCBnZXRJbnQoCi1qYXZhLmxhbmcuT2JqZWN0Ci1sb25nKQotCi1wdWJsaWMgbmF0aXZlIGludCBnZXRJbnRWb2xhdGlsZSgKLWphdmEubGFuZy5PYmplY3QKLWxvbmcpCi0KLXB1YmxpYyBuYXRpdmUgbG9uZyBnZXRMb25nKAotamF2YS5sYW5nLk9iamVjdAotbG9uZykKLQotcHVibGljIG5hdGl2ZSBsb25nIGdldExvbmdWb2xhdGlsZSgKLWphdmEubGFuZy5PYmplY3QKLWxvbmcpCi0KLXB1YmxpYyBuYXRpdmUgamF2YS5sYW5nLk9iamVjdCBnZXRPYmplY3QoCi1qYXZhLmxhbmcuT2JqZWN0Ci1sb25nKQotCi1wdWJsaWMgbmF0aXZlIGphdmEubGFuZy5PYmplY3QgZ2V0T2JqZWN0Vm9sYXRpbGUoCi1qYXZhLmxhbmcuT2JqZWN0Ci1sb25nKQotCi1wdWJsaWMgbG9uZyBvYmplY3RGaWVsZE9mZnNldCgKLWphdmEubGFuZy5yZWZsZWN0LkZpZWxkKQotCi1wdWJsaWMgdm9pZCBwYXJrKAotYm9vbGVhbgotbG9uZykKLQotcHVibGljIG5hdGl2ZSB2b2lkIHB1dEludCgKLWphdmEubGFuZy5PYmplY3QKLWxvbmcKLWludCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIHB1dEludFZvbGF0aWxlKAotamF2YS5sYW5nLk9iamVjdAotbG9uZwotaW50KQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgcHV0TG9uZygKLWphdmEubGFuZy5PYmplY3QKLWxvbmcKLWxvbmcpCi0KLXB1YmxpYyBuYXRpdmUgdm9pZCBwdXRMb25nVm9sYXRpbGUoCi1qYXZhLmxhbmcuT2JqZWN0Ci1sb25nCi1sb25nKQotCi1wdWJsaWMgbmF0aXZlIHZvaWQgcHV0T2JqZWN0KAotamF2YS5sYW5nLk9iamVjdAotbG9uZwotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIG5hdGl2ZSB2b2lkIHB1dE9iamVjdFZvbGF0aWxlKAotamF2YS5sYW5nLk9iamVjdAotbG9uZwotamF2YS5sYW5nLk9iamVjdCkKLQotcHVibGljIHZvaWQgdW5wYXJrKAotamF2YS5sYW5nLk9iamVjdCkKZGlmZiAtLWdpdCBhL3Rvb2xzL2RleC10b29scy9zcmMvZGV4L3JlYWRlci9EZXhBbm5vdGF0aW9uQXR0cmlidXRlSW1wbC5qYXZhIGIvdG9vbHMvZGV4LXRvb2xzL3NyYy9kZXgvcmVhZGVyL0RleEFubm90YXRpb25BdHRyaWJ1dGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlZWM5M2MuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGV4LXRvb2xzL3NyYy9kZXgvcmVhZGVyL0RleEFubm90YXRpb25BdHRyaWJ1dGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBkZXgucmVhZGVyOwotCi1pbXBvcnQgZGV4LnJlYWRlci5EZXhGaWxlUmVhZGVyLkZpZWxkSWRJdGVtOwotaW1wb3J0IGRleC5zdHJ1Y3R1cmUuRGV4QW5ub3RhdGlvbjsKLWltcG9ydCBkZXguc3RydWN0dXJlLkRleEFubm90YXRpb25BdHRyaWJ1dGU7Ci1pbXBvcnQgZGV4LnN0cnVjdHVyZS5EZXhFbmNvZGVkVmFsdWU7Ci0KLS8qIHBhY2thZ2UgKi9maW5hbCBjbGFzcyBEZXhBbm5vdGF0aW9uQXR0cmlidXRlSW1wbCBpbXBsZW1lbnRzCi0gICAgICAgIERleEFubm90YXRpb25BdHRyaWJ1dGUgewotICAgIGludCBuYW1lSWR4OyAvLyB1bGViMTI4Ci0gICAgRGV4RW5jb2RlZFZhbHVlIHZhbHVlOy8vIGVuY29kZWRfdmFsdWUKLSAgICBwcml2YXRlIFN0cmluZ1tdIHN0cmluZ1Bvb2w7Ci0gICAgcHJpdmF0ZSBEZXhCdWZmZXIgYnVmZmVyOwotICAgIHByaXZhdGUgZmluYWwgaW50W10gdHlwZUlkczsKLSAgICBwcml2YXRlIGZpbmFsIEZpZWxkSWRJdGVtW10gZmllbGRJZEl0ZW1zOwotICAgIHByaXZhdGUgZmluYWwgRGV4QW5ub3RhdGlvbiBhbm5vdGF0aW9uOwotCi0gICAgcHVibGljIERleEFubm90YXRpb25BdHRyaWJ1dGVJbXBsKERleEJ1ZmZlciBidWZmZXIsCi0gICAgICAgICAgICBEZXhBbm5vdGF0aW9uIGFubm90YXRpb24sIGludFtdIHR5cGVJZHMsIFN0cmluZ1tdIHN0cmluZ1Bvb2wsCi0gICAgICAgICAgICBGaWVsZElkSXRlbVtdIGZpZWxkSWRJdGVtcykgewotICAgICAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjsKLSAgICAgICAgdGhpcy5hbm5vdGF0aW9uID0gYW5ub3RhdGlvbjsKLSAgICAgICAgdGhpcy50eXBlSWRzID0gdHlwZUlkczsKLSAgICAgICAgdGhpcy5zdHJpbmdQb29sID0gc3RyaW5nUG9vbDsKLSAgICAgICAgdGhpcy5maWVsZElkSXRlbXMgPSBmaWVsZElkSXRlbXM7Ci0gICAgICAgIHBhcnNlVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcGFyc2VWYWx1ZSgpIHsKLSAgICAgICAgbmFtZUlkeCA9IGJ1ZmZlci5yZWFkVWxlYjEyOCgpOwotICAgICAgICB2YWx1ZSA9IG5ldyBEZXhFbmNvZGVkVmFsdWVJbXBsKGJ1ZmZlciwgYW5ub3RhdGlvbiwgdHlwZUlkcywKLSAgICAgICAgICAgICAgICBzdHJpbmdQb29sLCBmaWVsZElkSXRlbXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHN0cmluZ1Bvb2xbbmFtZUlkeF07Ci0gICAgfQotCi0gICAgcHVibGljIERleEVuY29kZWRWYWx1ZSBnZXRFbmNvZGVkVmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gZ2V0TmFtZSgpICsgIiAiICsgZ2V0RW5jb2RlZFZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIERleEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGFubm90YXRpb247Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90b29scy9kZXgtdG9vbHMvc3JjL2RleC9yZWFkZXIvRGV4QW5ub3RhdGlvbkltcGwuamF2YSBiL3Rvb2xzL2RleC10b29scy9zcmMvZGV4L3JlYWRlci9EZXhBbm5vdGF0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWE5M2FlLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RleC10b29scy9zcmMvZGV4L3JlYWRlci9EZXhBbm5vdGF0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgZGV4LnJlYWRlcjsKLQotaW1wb3J0IGRleC5yZWFkZXIuRGV4RmlsZVJlYWRlci5GaWVsZElkSXRlbTsKLWltcG9ydCBkZXguc3RydWN0dXJlLkRleEFubm90YXRpb247Ci1pbXBvcnQgZGV4LnN0cnVjdHVyZS5EZXhBbm5vdGF0aW9uQXR0cmlidXRlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8vIEZJWE1FIHByb3ZpZGUgc3BlY2lhbCB0eXBlIGZvciBTaWduYXR1cmUgYW5ub3RhdGlvbgotLyogcGFja2FnZSAqL2ZpbmFsIGNsYXNzIERleEFubm90YXRpb25JbXBsIGltcGxlbWVudHMgRGV4QW5ub3RhdGlvbiB7Ci0KLSAgICBwcml2YXRlIGludCBvZmZzZXQ7Ci0gICAgcHJpdmF0ZSBEZXhCdWZmZXIgYnVmZmVyOwotICAgIHByaXZhdGUgaW50W10gdHlwZUlkczsKLSAgICBwcml2YXRlIFN0cmluZ1tdIHN0cmluZ1Bvb2w7Ci0gICAgcHJpdmF0ZSBWaXNpYmlsaXR5IHZpc2liaWxpdHk7Ci0gICAgcHJpdmF0ZSBEZXhFbmNvZGVkQW5ub3RhdGlvbkltcGwgZW5jb2RlZEFubm90YXRpb247Ci0KLSAgICBwcml2YXRlIFR5cGVGb3JtYXR0ZXIgZm9ybWF0dGVyID0gbmV3IFR5cGVGb3JtYXR0ZXIoKTsKLSAgICBwcml2YXRlIGZpbmFsIEZpZWxkSWRJdGVtW10gZmllbGRJZEl0ZW1zOwotCi0gICAgcHVibGljIERleEFubm90YXRpb25JbXBsKERleEJ1ZmZlciBidWZmZXIsIGludCBvZmZzZXQsIGludFtdIHR5cGVJZHMsCi0gICAgICAgICAgICBTdHJpbmdbXSBzdHJpbmdQb29sLCBGaWVsZElkSXRlbVtdIGZpZWxkSWRJdGVtcykgewotICAgICAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjsKLSAgICAgICAgdGhpcy5vZmZzZXQgPSBvZmZzZXQ7Ci0gICAgICAgIHRoaXMudHlwZUlkcyA9IHR5cGVJZHM7Ci0gICAgICAgIHRoaXMuc3RyaW5nUG9vbCA9IHN0cmluZ1Bvb2w7Ci0gICAgICAgIHRoaXMuZmllbGRJZEl0ZW1zID0gZmllbGRJZEl0ZW1zOwotICAgICAgICBwYXJzZUFubm90YXRpb25zKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHBhcnNlQW5ub3RhdGlvbnMoKSB7Ci0gICAgICAgIGJ1ZmZlci5zZXRQb3NpdGlvbihvZmZzZXQpOwotICAgICAgICB2aXNpYmlsaXR5ID0gVmlzaWJpbGl0eS5nZXQoYnVmZmVyLnJlYWRVQnl0ZSgpKTsKLSAgICAgICAgZW5jb2RlZEFubm90YXRpb24gPSBuZXcgRGV4RW5jb2RlZEFubm90YXRpb25JbXBsKGJ1ZmZlciwgdGhpcywgdHlwZUlkcywKLSAgICAgICAgICAgICAgICBzdHJpbmdQb29sLCBmaWVsZElkSXRlbXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PERleEFubm90YXRpb25BdHRyaWJ1dGU+IGdldEF0dHJpYnV0ZXMoKSB7Ci0gICAgICAgIHJldHVybiBlbmNvZGVkQW5ub3RhdGlvbi5nZXRWYWx1ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBlbmNvZGVkQW5ub3RhdGlvbi5nZXRUeXBlTmFtZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBWaXNpYmlsaXR5IGdldFZpc2liaWxpdHkoKSB7Ci0gICAgICAgIHJldHVybiB2aXNpYmlsaXR5OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJAIik7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKGZvcm1hdHRlci5mb3JtYXQoZW5jb2RlZEFubm90YXRpb24uZ2V0VHlwZU5hbWUoKSkpOwotICAgICAgICBpZiAoIWdldEF0dHJpYnV0ZXMoKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIgKCIpOwotICAgICAgICAgICAgZm9yIChEZXhBbm5vdGF0aW9uQXR0cmlidXRlIHZhbHVlIDogZ2V0QXR0cmlidXRlcygpKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQodmFsdWUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIpIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RleC10b29scy9zcmMvZGV4L3JlYWRlci9EZXhCdWZmZXIuamF2YSBiL3Rvb2xzL2RleC10b29scy9zcmMvZGV4L3JlYWRlci9EZXhCdWZmZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI5MmUyOC4uMDAwMDAwMAotLS0gYS90b29scy9kZXgtdG9vbHMvc3JjL2RleC9yZWFkZXIvRGV4QnVmZmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgZGV4LnJlYWRlcjsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZU9yZGVyOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgRGV4QnVmZmVyIHsKLQotICAgIHByaXZhdGUgQnl0ZUJ1ZmZlciBiOwotCi0gICAgcHVibGljIERleEJ1ZmZlcihTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gRklYTUUgY2hhbm5lbD8gYWxsb2NhdGUgZml4IHNpemU/Ci0gICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlTmFtZSk7Ci0KLSAgICAgICAgICAgIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gYmlzID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oZmlzKTsKLSAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbMTAyNF07Ci0gICAgICAgICAgICBpbnQgbGVuOwotICAgICAgICAgICAgd2hpbGUgKChsZW4gPSBiaXMucmVhZChidWYpKSA+IDApIHsKLSAgICAgICAgICAgICAgICBib3Mud3JpdGUoYnVmLCAwLCBsZW4pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gYm9zLnRvQnl0ZUFycmF5KCk7Ci0gICAgICAgICAgICBpbml0aWFsaXplKEJ5dGVCdWZmZXIud3JhcChieXRlcykpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGZpcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmlzLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgRGV4QnVmZmVyKGJ5dGVbXSBieXRlcykgewotICAgICAgICBpbml0aWFsaXplKEJ5dGVCdWZmZXIud3JhcChieXRlcykpOwotICAgIH0KLQotICAgIHByaXZhdGUgRGV4QnVmZmVyKEJ5dGVCdWZmZXIgc2xpY2UpIHsKLSAgICAgICAgaW5pdGlhbGl6ZShzbGljZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoQnl0ZUJ1ZmZlciBidWZmZXIpIHsKLSAgICAgICAgYiA9IGJ1ZmZlci5hc1JlYWRPbmx5QnVmZmVyKCk7Ci0gICAgICAgIGIuY2xlYXIoKTsKLSAgICAgICAgYi5vcmRlcihCeXRlT3JkZXIuTElUVExFX0VORElBTik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UG9zaXRpb24oaW50IG9mZnNldCkgewotICAgICAgICBiLnBvc2l0aW9uKG9mZnNldCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVhZEJ5dGVzKGJ5dGVbXSBkc3QpIHsKLSAgICAgICAgYi5nZXQoZHN0LCAwLCBkc3QubGVuZ3RoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGSVhNRSBtYWtlIGVuZGlhbiBkZXBlbmRlbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IHJlYWRVbGViMTI4KCkgewotICAgICAgICBpbnQgZW5kVmFsdWUgPSAwOwotICAgICAgICBpbnQgdmFsdWUgPSAwOwotICAgICAgICBpbnQgbnIgPSAwOwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICB2YWx1ZSA9IChiLmdldCgpICYgMHhGRik7Ci0gICAgICAgICAgICBlbmRWYWx1ZSB8PSAoKHZhbHVlICYgMHg3RikgPDwgNyAqIG5yKTsvLyBjdXQgYXdheSBsZWZ0IG1vc3QgYml0Ci0gICAgICAgICAgICBucisrOwotICAgICAgICB9IHdoaWxlICgodmFsdWUgJiAweDgwKSAhPSAwKTsgLy8gaGlnaGVzdCBiaXQgc2V0PwotICAgICAgICByZXR1cm4gZW5kVmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcHJlIDAgPCBuQnl0ZXMgPD00Ci0gICAgICovCi0gICAgcHVibGljIGludCByZWFkSW50KGludCBuQnl0ZXMpIHsKLSAgICAgICAgaW50IGVuZFZhbHVlID0gMDsKLSAgICAgICAgaW50IHRtcCA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkJ5dGVzOyBpKyspIHsKLSAgICAgICAgICAgIHRtcCA9IGIuZ2V0KCkgJiAweEZGOwotICAgICAgICAgICAgZW5kVmFsdWUgfD0gKHRtcCA8PCBpICogOCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVuZFZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHByZSAwIDwgbkJ5dGVzIDw9MSBGSVhNRTogU2lnbiBleHRlbnNpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc2hvcnQgcmVhZFNob3J0KGludCBuQnl0ZXMpIHsKLSAgICAgICAgc2hvcnQgZW5kVmFsdWUgPSAwOwotICAgICAgICBpbnQgdG1wID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuQnl0ZXM7IGkrKykgewotICAgICAgICAgICAgdG1wID0gYi5nZXQoKSAmIDB4RkY7Ci0gICAgICAgICAgICBlbmRWYWx1ZSB8PSAodG1wIDw8IGkgKiA4KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZW5kVmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcHJlIDAgPCBuQnl0ZXMgPD0xCi0gICAgICovCi0gICAgcHVibGljIGNoYXIgcmVhZENoYXIoaW50IG5CeXRlcykgewotICAgICAgICBjaGFyIGVuZFZhbHVlID0gMDsKLSAgICAgICAgaW50IHRtcCA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkJ5dGVzOyBpKyspIHsKLSAgICAgICAgICAgIHRtcCA9IGIuZ2V0KCkgJiAweEZGOwotICAgICAgICAgICAgZW5kVmFsdWUgfD0gKHRtcCA8PCBpICogOCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVuZFZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHByZSAwIDwgbkJ5dGVzIDw9NyBGSVhNRTogU2lnbiBleHRlbnNpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyByZWFkTG9uZyhpbnQgbkJ5dGVzKSB7Ci0gICAgICAgIGxvbmcgZW5kVmFsdWUgPSAwOwotICAgICAgICBpbnQgdG1wID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuQnl0ZXM7IGkrKykgewotICAgICAgICAgICAgdG1wID0gYi5nZXQoKSAmIDB4RkY7Ci0gICAgICAgICAgICBlbmRWYWx1ZSB8PSAodG1wIDw8IGkgKiA4KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZW5kVmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcHJlIDAgPCBuQnl0ZXMgPD00Ci0gICAgICovCi0gICAgcHVibGljIGZsb2F0IHJlYWRGbG9hdChpbnQgbkJ5dGVzKSB7Ci0gICAgICAgIGludCBiaXRzID0gcmVhZEludChuQnl0ZXMpOwotICAgICAgICBpbnQgYnl0ZXNUb01vdmUgPSAoNCAtIG5CeXRlcykgKiA4OwotICAgICAgICBiaXRzIDw8PSBieXRlc1RvTW92ZTsKLSAgICAgICAgcmV0dXJuIEZsb2F0LmludEJpdHNUb0Zsb2F0KGJpdHMpOwotICAgIH0KLQotICAgIC8vIHJldHVybnMgaW50IGZvcm0gY3VycmVudCBwb3NpdGlvbgotICAgIHB1YmxpYyBpbnQgcmVhZFVJbnQoKSB7Ci0gICAgICAgIGludCB2YWx1ZSA9IGIuZ2V0SW50KCk7Ci0gICAgICAgIC8vIGFzc2VydCB2YWx1ZSA+PSAwOwotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIGludCByZWFkVVNob3J0KCkgewotICAgICAgICByZXR1cm4gYi5nZXRTaG9ydCgpICYgMHhGRkZGOwotICAgIH0KLQotICAgIC8vIHJldHVybnMgYnl0ZSBmb3JtIGN1cnJlbnQgcG9zaXRpb24KLSAgICBwdWJsaWMgYnl0ZSByZWFkVUJ5dGUoKSB7Ci0gICAgICAgIHJldHVybiBiLmdldCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBEZXhCdWZmZXIgY3JlYXRlQ29weSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBEZXhCdWZmZXIoYi5kdXBsaWNhdGUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGRvdWJsZSByZWFkRG91YmxlKGludCBuQnl0ZXMpIHsKLSAgICAgICAgbG9uZyBiaXRzID0gcmVhZExvbmcobkJ5dGVzKTsKLSAgICAgICAgaW50IGJ5dGVzVG9Nb3ZlID0gKDggLSBuQnl0ZXMpICogODsKLSAgICAgICAgYml0cyA8PD0gYnl0ZXNUb01vdmU7Ci0gICAgICAgIHJldHVybiBEb3VibGUubG9uZ0JpdHNUb0RvdWJsZShiaXRzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBza2lwKGludCBuQnl0ZXMpIHsKLSAgICAgICAgYi5wb3NpdGlvbihiLnBvc2l0aW9uKCkgKyBuQnl0ZXMpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RleC10b29scy9zcmMvZGV4L3JlYWRlci9EZXhDbGFzc0ltcGwuamF2YSBiL3Rvb2xzL2RleC10b29scy9zcmMvZGV4L3JlYWRlci9EZXhDbGFzc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE1ZTgwOS4uMDAwMDAwMAotLS0gYS90b29scy9kZXgtdG9vbHMvc3JjL2RleC9yZWFkZXIvRGV4Q2xhc3NJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgZGV4LnJlYWRlcjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgZGV4LnJlYWRlci5EZXhGaWxlUmVhZGVyLkNsYXNzRGVmSXRlbTsKLWltcG9ydCBkZXgucmVhZGVyLkRleEZpbGVSZWFkZXIuRmllbGRJZEl0ZW07Ci1pbXBvcnQgZGV4LnJlYWRlci5EZXhGaWxlUmVhZGVyLk1ldGhvZHNJZEl0ZW07Ci1pbXBvcnQgZGV4LnJlYWRlci5EZXhGaWxlUmVhZGVyLlByb3RJZEl0ZW07Ci1pbXBvcnQgZGV4LnN0cnVjdHVyZS5EZXhBbm5vdGF0aW9uOwotaW1wb3J0IGRleC5zdHJ1Y3R1cmUuRGV4Q2xhc3M7Ci1pbXBvcnQgZGV4LnN0cnVjdHVyZS5EZXhGaWVsZDsKLWltcG9ydCBkZXguc3RydWN0dXJlLkRleE1ldGhvZDsKLQotLyogcGFja2FnZSAqL2ZpbmFsIGNsYXNzIERleENsYXNzSW1wbCBpbXBsZW1lbnRzIERleENsYXNzIHsKLSAgICAvLyBjb25zdGFudAotICAgIHByaXZhdGUgZmluYWwgaW50IE5PX0lOREVYID0gLTE7Ci0gICAgLy8gZGV4IGJ5dGVzCi0gICAgcHJpdmF0ZSBmaW5hbCBEZXhCdWZmZXIgYnVmZmVyOwotICAgIC8vIGFsbHJlYWR5IHBhcnNlZAotICAgIHByaXZhdGUgZmluYWwgQ2xhc3NEZWZJdGVtIGNsYXNzRGVmSXRlbTsKLSAgICBwcml2YXRlIGZpbmFsIGludFtdIHR5cGVJZHM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBzdHJpbmdQb29sOwotICAgIHByaXZhdGUgUHJvdElkSXRlbVtdIHByb3RvSWRJdGVtczsKLSAgICBwcml2YXRlIEZpZWxkSWRJdGVtW10gZmllbGRJZEl0ZW1zOwotICAgIHByaXZhdGUgTWV0aG9kc0lkSXRlbVtdIG1ldGhvZElkSXRlbXM7Ci0KLSAgICAvLwotICAgIHByaXZhdGUgTGlzdDxEZXhGaWVsZD4gZmllbGRzOwotICAgIHByaXZhdGUgTGlzdDxEZXhNZXRob2Q+IG1ldGhvZHM7Ci0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gaW50ZXJmYWNlczsKLSAgICBwcml2YXRlIENsYXNzRGF0YUl0ZW0gY2xhc3NEYXRhSXRlbTsKLSAgICBwcml2YXRlIEFubm90YXRpb25zRGlyZWN0b3J5SXRlbSBhbm5vdGF0aW9uRGlyOwotICAgIHByaXZhdGUgTWFwPEludGVnZXIsIEZpZWxkQW5ub3RhdGlvbj4gaWRUb0ZpZWxkQW5ub3RhdGlvbiA9Ci0gICAgICAgICAgICBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBGaWVsZEFubm90YXRpb24+KCk7Ci0gICAgcHJpdmF0ZSBNYXA8SW50ZWdlciwgTWV0aG9kQW5ub3RhdGlvbj4gaWRUb01ldGhvZEFubm90YXRpb24gPQotICAgICAgICAgICAgbmV3IEhhc2hNYXA8SW50ZWdlciwgTWV0aG9kQW5ub3RhdGlvbj4oKTsKLSAgICBwcml2YXRlIE1hcDxJbnRlZ2VyLCBQYXJhbWV0ZXJBbm5vdGF0aW9uPiBpZFRvUGFyYW1ldGVyQW5ub3RhdGlvbiA9Ci0gICAgICAgICAgICBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBQYXJhbWV0ZXJBbm5vdGF0aW9uPigpOwotCi0gICAgcHJpdmF0ZSBTZXQ8RGV4QW5ub3RhdGlvbj4gYW5ub3RhdGlvbnM7Ci0gICAgcHJpdmF0ZSBUeXBlRm9ybWF0dGVyIGZvcm1hdHRlciA9IG5ldyBUeXBlRm9ybWF0dGVyKCk7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzQ2xhc3NEYXRhOwotCi0KLSAgICBwdWJsaWMgRGV4Q2xhc3NJbXBsKERleEJ1ZmZlciBidWZmZXIsIENsYXNzRGVmSXRlbSBjbGFzc0RlZkl0ZW0sCi0gICAgICAgICAgICBTdHJpbmdbXSBzdHJpbmdQb29sLCBpbnRbXSB0eXBlSWRzLCBQcm90SWRJdGVtW10gcHJvdG9JZEl0ZW1zLAotICAgICAgICAgICAgRmllbGRJZEl0ZW1bXSBmaWVsZElkSXRlbXMsIE1ldGhvZHNJZEl0ZW1bXSBtZXRob2RJZEl0ZW1zKSB7Ci0gICAgICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyOwotICAgICAgICB0aGlzLmNsYXNzRGVmSXRlbSA9IGNsYXNzRGVmSXRlbTsKLSAgICAgICAgdGhpcy5zdHJpbmdQb29sID0gc3RyaW5nUG9vbDsKLSAgICAgICAgdGhpcy50eXBlSWRzID0gdHlwZUlkczsKLSAgICAgICAgdGhpcy5wcm90b0lkSXRlbXMgPSBwcm90b0lkSXRlbXM7Ci0gICAgICAgIHRoaXMuZmllbGRJZEl0ZW1zID0gZmllbGRJZEl0ZW1zOwotICAgICAgICB0aGlzLm1ldGhvZElkSXRlbXMgPSBtZXRob2RJZEl0ZW1zOwotICAgICAgICBoYXNDbGFzc0RhdGEgPSBjbGFzc0RlZkl0ZW0uY2xhc3NfZGF0YV9vZmYgIT0gMDsKLSAgICAgICAgcGFyc2VDbGFzc0RhdGEoKTsKLSAgICAgICAgcGFyc2VBbm5vdGF0aW9uRGlyZWN0b3J5KCk7Ci0gICAgICAgIHBhcnNlQ2xhc3NBbm5vdGF0aW9ucygpOwotICAgIH0KLQotICAgIHN0YXRpYyBjbGFzcyBBbm5vdGF0aW9uc0RpcmVjdG9yeUl0ZW0gewotICAgICAgICBpbnQgY2xhc3NfYW5ub3RhdGlvbnNfb2ZmOyAvLyB1aW50Ci0gICAgICAgIGludCBmaWVsZHNfc2l6ZTsgLy8gdWludAotICAgICAgICBpbnQgbWV0aG9kc19zaXplOyAvLyB1aW50Ci0gICAgICAgIGludCBhbm5vdGF0ZWRfcGFyYW1zX3NpemU7IC8vIHVpbnQKLSAgICAgICAgRmllbGRBbm5vdGF0aW9uW10gZmllbGRBbm5vdGF0aW9uczsKLSAgICAgICAgTWV0aG9kQW5ub3RhdGlvbltdIG1ldGhvZEFubm90YXRpb25zOwotICAgICAgICBQYXJhbWV0ZXJBbm5vdGF0aW9uW10gcGFyYW1ldGVyQW5ub3RhdGlvbnM7Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIEFubm90YXRpb25TZXRJdGVtIHsKLSAgICAgICAgaW50IHNpemU7Ly8gdWludAotICAgICAgICBpbnRbXSBhbm5vdGF0aW9uT2ZmSXRlbTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgY2xhc3MgRmllbGRBbm5vdGF0aW9uIHsKLSAgICAgICAgaW50IGZpZWxkSWR4Oy8vIHVpbnQKLSAgICAgICAgaW50IGFubm90YXRpb25zT2ZmOy8vIHVpbnQKLSAgICAgICAgQW5ub3RhdGlvblNldEl0ZW1bXSBhbm5vdGF0aW9uU2V0SXRlbXM7Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIE1ldGhvZEFubm90YXRpb24gewotICAgICAgICBpbnQgbWV0aG9kSWR4Oy8vIHVpbnQKLSAgICAgICAgaW50IGFubm90YXRpb25zT2ZmOy8vIHVpbnQKLSAgICAgICAgQW5ub3RhdGlvblNldEl0ZW1bXSBhbm5vdGF0aW9uU2V0SXRlbXM7Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIFBhcmFtZXRlckFubm90YXRpb24gewotICAgICAgICBpbnQgbWV0aG9kSWR4Oy8vIHVpbnQKLSAgICAgICAgaW50IGFubm90YXRpb25zT2ZmOy8vIHVpbnQKLSAgICAgICAgLy8gQW5ub3RhdGlvblNldFJlZkxpc3RJdGVtW10gYW5ub3RhdGlvblNldFJlZkxpc3RJdGVtczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcGFyc2VBbm5vdGF0aW9uRGlyZWN0b3J5KCkgewotICAgICAgICBpZiAoY2xhc3NEZWZJdGVtLmFubm90YXRpb25zX29mZiAhPSAwKSB7Ci0gICAgICAgICAgICBidWZmZXIuc2V0UG9zaXRpb24oY2xhc3NEZWZJdGVtLmFubm90YXRpb25zX29mZik7Ci0gICAgICAgICAgICBhbm5vdGF0aW9uRGlyID0gbmV3IEFubm90YXRpb25zRGlyZWN0b3J5SXRlbSgpOwotICAgICAgICAgICAgYW5ub3RhdGlvbkRpci5jbGFzc19hbm5vdGF0aW9uc19vZmYgPSBidWZmZXIucmVhZFVJbnQoKTsKLSAgICAgICAgICAgIGFubm90YXRpb25EaXIuZmllbGRzX3NpemUgPSBidWZmZXIucmVhZFVJbnQoKTsKLSAgICAgICAgICAgIGFubm90YXRpb25EaXIubWV0aG9kc19zaXplID0gYnVmZmVyLnJlYWRVSW50KCk7Ci0gICAgICAgICAgICBhbm5vdGF0aW9uRGlyLmFubm90YXRlZF9wYXJhbXNfc2l6ZSA9IGJ1ZmZlci5yZWFkVUludCgpOwotCi0gICAgICAgICAgICBpZiAoYW5ub3RhdGlvbkRpci5maWVsZHNfc2l6ZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgYW5ub3RhdGlvbkRpci5maWVsZEFubm90YXRpb25zID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWVsZEFubm90YXRpb25bYW5ub3RhdGlvbkRpci5maWVsZHNfc2l6ZV07Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbm5vdGF0aW9uRGlyLmZpZWxkc19zaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbkRpci5maWVsZEFubm90YXRpb25zW2ldID0gbmV3IEZpZWxkQW5ub3RhdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uRGlyLmZpZWxkQW5ub3RhdGlvbnNbaV0uZmllbGRJZHggPSBidWZmZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVhZFVJbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbkRpci5maWVsZEFubm90YXRpb25zW2ldLmFubm90YXRpb25zT2ZmID0gYnVmZmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlYWRVSW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlkVG9GaWVsZEFubm90YXRpb24ucHV0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25EaXIuZmllbGRBbm5vdGF0aW9uc1tpXS5maWVsZElkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uRGlyLmZpZWxkQW5ub3RhdGlvbnNbaV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uRGlyLm1ldGhvZHNfc2l6ZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgYW5ub3RhdGlvbkRpci5tZXRob2RBbm5vdGF0aW9ucyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgTWV0aG9kQW5ub3RhdGlvblthbm5vdGF0aW9uRGlyLm1ldGhvZHNfc2l6ZV07Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbm5vdGF0aW9uRGlyLm1ldGhvZHNfc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25EaXIubWV0aG9kQW5ub3RhdGlvbnNbaV0gPSBuZXcgTWV0aG9kQW5ub3RhdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uRGlyLm1ldGhvZEFubm90YXRpb25zW2ldLm1ldGhvZElkeCA9IGJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZWFkVUludCgpOwotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uRGlyLm1ldGhvZEFubm90YXRpb25zW2ldLmFubm90YXRpb25zT2ZmID0gYnVmZmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlYWRVSW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlkVG9NZXRob2RBbm5vdGF0aW9uLnB1dCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uRGlyLm1ldGhvZEFubm90YXRpb25zW2ldLm1ldGhvZElkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uRGlyLm1ldGhvZEFubm90YXRpb25zW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYW5ub3RhdGlvbkRpci5hbm5vdGF0ZWRfcGFyYW1zX3NpemUgIT0gMCkgewotICAgICAgICAgICAgICAgIGFubm90YXRpb25EaXIucGFyYW1ldGVyQW5ub3RhdGlvbnMgPQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFBhcmFtZXRlckFubm90YXRpb25bYW5ub3RhdGlvbkRpcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYW5ub3RhdGVkX3BhcmFtc19zaXplXTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFubm90YXRpb25EaXIuYW5ub3RhdGVkX3BhcmFtc19zaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbkRpci5wYXJhbWV0ZXJBbm5vdGF0aW9uc1tpXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFBhcmFtZXRlckFubm90YXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbkRpci5wYXJhbWV0ZXJBbm5vdGF0aW9uc1tpXS5tZXRob2RJZHggPSBidWZmZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVhZFVJbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbkRpci5wYXJhbWV0ZXJBbm5vdGF0aW9uc1tpXS5hbm5vdGF0aW9uc09mZiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLnJlYWRVSW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlkVG9QYXJhbWV0ZXJBbm5vdGF0aW9uLnB1dCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uRGlyLnBhcmFtZXRlckFubm90YXRpb25zW2ldLm1ldGhvZElkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uRGlyLnBhcmFtZXRlckFubm90YXRpb25zW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgY2xhc3MgQ2xhc3NEYXRhSXRlbSB7Ci0gICAgICAgIGludCBzdGF0aWNfZmllbGRzX3NpemU7Ly8gdWxlYjEyOAotICAgICAgICBpbnQgaW5zdGFuY2VfZmllbGRzX3NpemU7Ly8gdWxlYjEyOAotICAgICAgICBpbnQgZGlyZWN0X21ldGhvZHNfc2l6ZTsvLyB1bGViMTI4Ci0gICAgICAgIGludCB2aXJ0dWFsX21ldGhvZHNfc2l6ZTsvLyB1bGViMTI4Ci0gICAgICAgIEVuY29kZWRGaWVsZFtdIHN0YXRpY0ZpZWxkczsKLSAgICAgICAgRW5jb2RlZEZpZWxkW10gaW5zdGFuY2VGaWVsZHM7Ci0gICAgICAgIEVuY29kZWRNZXRob2RbXSBkaXJlY3RNZXRob2RzOwotICAgICAgICBFbmNvZGVkTWV0aG9kW10gdmlydHVhbE1ldGhvZHM7Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIEVuY29kZWRGaWVsZCB7Ci0gICAgICAgIGludCBmaWVsZF9pZHhfZGlmZjsgLy8gdWxlYjEyOAotICAgICAgICBpbnQgYWNjZXNzX2ZsYWdzOyAvLyB1bGViMTI4Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIEVuY29kZWRNZXRob2QgewotICAgICAgICBpbnQgbWV0aG9kX2lkeF9kaWZmOy8vIHVsZWIxMjgKLSAgICAgICAgaW50IGFjY2Vzc19mbGFnczsvLyB1bGViMTI4Ci0gICAgICAgIGludCBjb2RlX29mZjsgLy8gdWxlYjEyOAotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwYXJzZUNsYXNzRGF0YSgpIHsKLSAgICAgICAgaWYgKGhhc0NsYXNzRGF0YSkgewotICAgICAgICAgICAgYnVmZmVyLnNldFBvc2l0aW9uKGNsYXNzRGVmSXRlbS5jbGFzc19kYXRhX29mZik7Ci0gICAgICAgICAgICBjbGFzc0RhdGFJdGVtID0gbmV3IENsYXNzRGF0YUl0ZW0oKTsKLSAgICAgICAgICAgIGNsYXNzRGF0YUl0ZW0uc3RhdGljX2ZpZWxkc19zaXplID0gYnVmZmVyLnJlYWRVbGViMTI4KCk7Ci0gICAgICAgICAgICBjbGFzc0RhdGFJdGVtLmluc3RhbmNlX2ZpZWxkc19zaXplID0gYnVmZmVyLnJlYWRVbGViMTI4KCk7Ci0gICAgICAgICAgICBjbGFzc0RhdGFJdGVtLmRpcmVjdF9tZXRob2RzX3NpemUgPSBidWZmZXIucmVhZFVsZWIxMjgoKTsKLSAgICAgICAgICAgIGNsYXNzRGF0YUl0ZW0udmlydHVhbF9tZXRob2RzX3NpemUgPSBidWZmZXIucmVhZFVsZWIxMjgoKTsKLSAgICAgICAgICAgIGNsYXNzRGF0YUl0ZW0uc3RhdGljRmllbGRzID0gcGFyc2VGaWVsZHMoCi0gICAgICAgICAgICAgICAgICAgIGNsYXNzRGF0YUl0ZW0uc3RhdGljX2ZpZWxkc19zaXplKTsKLSAgICAgICAgICAgIGNsYXNzRGF0YUl0ZW0uaW5zdGFuY2VGaWVsZHMgPSBwYXJzZUZpZWxkcygKLSAgICAgICAgICAgICAgICAgICAgY2xhc3NEYXRhSXRlbS5pbnN0YW5jZV9maWVsZHNfc2l6ZSk7Ci0gICAgICAgICAgICBjbGFzc0RhdGFJdGVtLmRpcmVjdE1ldGhvZHMgPSBwYXJzZU1ldGhvZHMoCi0gICAgICAgICAgICAgICAgICAgIGNsYXNzRGF0YUl0ZW0uZGlyZWN0X21ldGhvZHNfc2l6ZSk7Ci0gICAgICAgICAgICBjbGFzc0RhdGFJdGVtLnZpcnR1YWxNZXRob2RzID0gcGFyc2VNZXRob2RzKAotICAgICAgICAgICAgICAgICAgICBjbGFzc0RhdGFJdGVtLnZpcnR1YWxfbWV0aG9kc19zaXplKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgRW5jb2RlZEZpZWxkW10gcGFyc2VGaWVsZHMoaW50IHNpemUpIHsKLSAgICAgICAgRW5jb2RlZEZpZWxkW10gZmllbGRzID0gbmV3IEVuY29kZWRGaWVsZFtzaXplXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGZpZWxkc1tpXSA9IG5ldyBFbmNvZGVkRmllbGQoKTsKLSAgICAgICAgICAgIGZpZWxkc1tpXS5maWVsZF9pZHhfZGlmZiA9IGJ1ZmZlci5yZWFkVWxlYjEyOCgpOwotICAgICAgICAgICAgZmllbGRzW2ldLmFjY2Vzc19mbGFncyA9IGJ1ZmZlci5yZWFkVWxlYjEyOCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmaWVsZHM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBFbmNvZGVkTWV0aG9kW10gcGFyc2VNZXRob2RzKGludCBzaXplKSB7Ci0gICAgICAgIEVuY29kZWRNZXRob2RbXSBtZXRob2RzID0gbmV3IEVuY29kZWRNZXRob2Rbc2l6ZV07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgbWV0aG9kc1tpXSA9IG5ldyBFbmNvZGVkTWV0aG9kKCk7Ci0gICAgICAgICAgICBtZXRob2RzW2ldLm1ldGhvZF9pZHhfZGlmZiA9IGJ1ZmZlci5yZWFkVWxlYjEyOCgpOwotICAgICAgICAgICAgbWV0aG9kc1tpXS5hY2Nlc3NfZmxhZ3MgPSBidWZmZXIucmVhZFVsZWIxMjgoKTsKLSAgICAgICAgICAgIG1ldGhvZHNbaV0uY29kZV9vZmYgPSBidWZmZXIucmVhZFVsZWIxMjgoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWV0aG9kczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcGFyc2VDbGFzc0Fubm90YXRpb25zKCkgewotICAgICAgICBhbm5vdGF0aW9ucyA9IG5ldyBIYXNoU2V0PERleEFubm90YXRpb24+KCk7Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uRGlyICE9IG51bGwgJiYgYW5ub3RhdGlvbkRpci5jbGFzc19hbm5vdGF0aW9uc19vZmYgIT0gMCkgewotICAgICAgICAgICAgYnVmZmVyLnNldFBvc2l0aW9uKGFubm90YXRpb25EaXIuY2xhc3NfYW5ub3RhdGlvbnNfb2ZmKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBzaXplID0gYnVmZmVyLnJlYWRVSW50KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgIGFubm90YXRpb25zLmFkZChuZXcgRGV4QW5ub3RhdGlvbkltcGwoYnVmZmVyLmNyZWF0ZUNvcHkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5yZWFkVUludCgpLCB0eXBlSWRzLCBzdHJpbmdQb29sLCBmaWVsZElkSXRlbXMpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgTGlzdDxEZXhGaWVsZD4gZ2V0RmllbGRzKCkgewotICAgICAgICBpZiAoZmllbGRzID09IG51bGwpIHsKLSAgICAgICAgICAgIGZpZWxkcyA9IG5ldyBBcnJheUxpc3Q8RGV4RmllbGQ+KCk7Ci0gICAgICAgICAgICBpZiAoaGFzQ2xhc3NEYXRhKSB7Ci0gICAgICAgICAgICAgICAgZmllbGRzLmFkZEFsbChnZXREZXhGaWVsZHMoY2xhc3NEYXRhSXRlbS5zdGF0aWNGaWVsZHMpKTsKLSAgICAgICAgICAgICAgICBmaWVsZHMuYWRkQWxsKGdldERleEZpZWxkcyhjbGFzc0RhdGFJdGVtLmluc3RhbmNlRmllbGRzKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZpZWxkczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIExpc3Q8RGV4RmllbGQ+IGdldERleEZpZWxkcyhFbmNvZGVkRmllbGRbXSBmaWVsZHMpIHsKLSAgICAgICAgTGlzdDxEZXhGaWVsZD4gZGV4RmllbGRzID0gbmV3IEFycmF5TGlzdDxEZXhGaWVsZD4oZmllbGRzLmxlbmd0aCk7Ci0gICAgICAgIGlmIChmaWVsZHMubGVuZ3RoICE9IDApIHsKLSAgICAgICAgICAgIGludCBmaWVsZElkSWR4ID0gMDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IGFjY2Vzc0ZsYWdzID0gZmllbGRzW2ldLmFjY2Vzc19mbGFnczsKLSAgICAgICAgICAgICAgICBmaWVsZElkSWR4ID0gKGkgPT0gMCkgPyBmaWVsZHNbaV0uZmllbGRfaWR4X2RpZmYgOiBmaWVsZElkSWR4Ci0gICAgICAgICAgICAgICAgICAgICAgICArIGZpZWxkc1tpXS5maWVsZF9pZHhfZGlmZjsKLSAgICAgICAgICAgICAgICBkZXhGaWVsZHMuYWRkKG5ldyBEZXhGaWVsZEltcGwoYnVmZmVyLmNyZWF0ZUNvcHkoKSwgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSWRJdGVtc1tmaWVsZElkSWR4XSwgYWNjZXNzRmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBpZFRvRmllbGRBbm5vdGF0aW9uLmdldChmaWVsZElkSWR4KSwgc3RyaW5nUG9vbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVJZHMsIGZpZWxkSWRJdGVtcykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkZXhGaWVsZHM7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBMaXN0PERleE1ldGhvZD4gZ2V0TWV0aG9kcygpIHsKLSAgICAgICAgaWYgKG1ldGhvZHMgPT0gbnVsbCkgewotICAgICAgICAgICAgbWV0aG9kcyA9IG5ldyBBcnJheUxpc3Q8RGV4TWV0aG9kPigpOwotICAgICAgICAgICAgaWYgKGhhc0NsYXNzRGF0YSkgewotICAgICAgICAgICAgICAgIG1ldGhvZHMuYWRkQWxsKGdldERleE1ldGhvZHMoY2xhc3NEYXRhSXRlbS5kaXJlY3RNZXRob2RzKSk7Ci0gICAgICAgICAgICAgICAgbWV0aG9kcy5hZGRBbGwoZ2V0RGV4TWV0aG9kcyhjbGFzc0RhdGFJdGVtLnZpcnR1YWxNZXRob2RzKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1ldGhvZHM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0PERleE1ldGhvZD4gZ2V0RGV4TWV0aG9kcyhFbmNvZGVkTWV0aG9kW10gbWV0aG9kcykgewotICAgICAgICBMaXN0PERleE1ldGhvZD4gZGV4TWV0aG9kcyA9IG5ldyBBcnJheUxpc3Q8RGV4TWV0aG9kPihtZXRob2RzLmxlbmd0aCk7Ci0gICAgICAgIGlmIChtZXRob2RzLmxlbmd0aCAhPSAwKSB7Ci0gICAgICAgICAgICBpbnQgbWV0aG9kSWRJZHggPSAwOwotICAgICAgICAgICAgRW5jb2RlZE1ldGhvZCBtZXRob2QgPSBudWxsOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbWV0aG9kID0gbWV0aG9kc1tpXTsKLSAgICAgICAgICAgICAgICBtZXRob2RJZElkeCA9IChpID09IDApID8gbWV0aG9kLm1ldGhvZF9pZHhfZGlmZiA6IG1ldGhvZElkSWR4Ci0gICAgICAgICAgICAgICAgICAgICAgICArIG1ldGhvZC5tZXRob2RfaWR4X2RpZmY7Ci0gICAgICAgICAgICAgICAgZGV4TWV0aG9kcy5hZGQobmV3IERleE1ldGhvZEltcGwoYnVmZmVyLCB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kSWRJdGVtc1ttZXRob2RJZElkeF0sCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm90b0lkSXRlbXNbbWV0aG9kSWRJdGVtc1ttZXRob2RJZElkeF0ucHJvdG9faWR4XSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZC5hY2Nlc3NfZmxhZ3MsIGlkVG9NZXRob2RBbm5vdGF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQobWV0aG9kSWRJZHgpLCBpZFRvUGFyYW1ldGVyQW5ub3RhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KG1ldGhvZElkSWR4KSwgc3RyaW5nUG9vbCwgdHlwZUlkcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSWRJdGVtcykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkZXhNZXRob2RzOwotICAgIH0KLQotCi0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIExpc3Q8U3RyaW5nPiBnZXRJbnRlcmZhY2VzKCkgewotICAgICAgICBpZiAoaW50ZXJmYWNlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbnRlcmZhY2VzID0gbmV3IExpbmtlZExpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgaWYgKGNsYXNzRGVmSXRlbS5pbnRlcmZhY2VzX29mZiAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLnNldFBvc2l0aW9uKGNsYXNzRGVmSXRlbS5pbnRlcmZhY2VzX29mZik7Ci0gICAgICAgICAgICAgICAgaW50IHNpemUgPSBidWZmZXIucmVhZFVJbnQoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VzLmFkZChzdHJpbmdQb29sW3R5cGVJZHNbYnVmZmVyLnJlYWRVU2hvcnQoKV1dKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGludGVyZmFjZXM7Ci0gICAgfQotCi0gICAgLy8gcmV0dXJucyBudWxsIGlmIG5vIHN1cGVyIGNsYXNzIGlzIHByZXNlbnQKLSAgICBwdWJsaWMgU3RyaW5nIGdldFN1cGVyQ2xhc3MoKSB7Ci0gICAgICAgIHJldHVybiBjbGFzc0RlZkl0ZW0uc3VwZXJjbGFzc19pZHggPT0gTk9fSU5ERVggPyBudWxsCi0gICAgICAgICAgICAgICAgOiBzdHJpbmdQb29sW3R5cGVJZHNbY2xhc3NEZWZJdGVtLnN1cGVyY2xhc3NfaWR4XV07Ci0gICAgfQotCi0gICAgcHVibGljIFNldDxEZXhBbm5vdGF0aW9uPiBnZXRBbm5vdGF0aW9ucygpIHsKLSAgICAgICAgcmV0dXJuIGFubm90YXRpb25zOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHN0cmluZ1Bvb2xbdHlwZUlkc1tjbGFzc0RlZkl0ZW0uY2xhc3NfaWR4XV07Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRNb2RpZmllcnMoKSB7Ci0gICAgICAgIHJldHVybiBjbGFzc0RlZkl0ZW0uYWNjZXNzX2ZsYWdzOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKGZvcm1hdHRlci5mb3JtYXRBbm5vdGF0aW9ucyhnZXRBbm5vdGF0aW9ucygpKSk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKE1vZGlmaWVyLnRvU3RyaW5nKGdldE1vZGlmaWVycygpKSk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIgY2xhc3MgIik7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKGZvcm1hdHRlci5mb3JtYXQoZ2V0TmFtZSgpKSk7Ci0gICAgICAgIGlmIChnZXRTdXBlckNsYXNzKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiBleHRlbmRzICIpOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoZm9ybWF0dGVyLmZvcm1hdChnZXRTdXBlckNsYXNzKCkpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWdldEludGVyZmFjZXMoKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIgaW1wbGVtZW50cyAiKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGZvcm1hdHRlci5mb3JtYXQoZ2V0SW50ZXJmYWNlcygpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RleC10b29scy9zcmMvZGV4L3JlYWRlci9EZXhFbmNvZGVkQW5ub3RhdGlvbkltcGwuamF2YSBiL3Rvb2xzL2RleC10b29scy9zcmMvZGV4L3JlYWRlci9EZXhFbmNvZGVkQW5ub3RhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDExNGNlMy4uMDAwMDAwMAotLS0gYS90b29scy9kZXgtdG9vbHMvc3JjL2RleC9yZWFkZXIvRGV4RW5jb2RlZEFubm90YXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBkZXgucmVhZGVyOwotCi1pbXBvcnQgZGV4LnJlYWRlci5EZXhGaWxlUmVhZGVyLkZpZWxkSWRJdGVtOwotaW1wb3J0IGRleC5zdHJ1Y3R1cmUuRGV4QW5ub3RhdGlvbjsKLWltcG9ydCBkZXguc3RydWN0dXJlLkRleEFubm90YXRpb25BdHRyaWJ1dGU7Ci1pbXBvcnQgZGV4LnN0cnVjdHVyZS5EZXhFbmNvZGVkQW5ub3RhdGlvbjsKLWltcG9ydCBkZXguc3RydWN0dXJlLkRleEVuY29kZWRWYWx1ZVR5cGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKiBwYWNrYWdlICovZmluYWwgY2xhc3MgRGV4RW5jb2RlZEFubm90YXRpb25JbXBsIGltcGxlbWVudHMKLSAgICAgICAgRGV4RW5jb2RlZEFubm90YXRpb24gewotCi0gICAgcHJpdmF0ZSBMaXN0PERleEFubm90YXRpb25BdHRyaWJ1dGU+IHZhbHVlczsKLSAgICBwcml2YXRlIGZpbmFsIERleEJ1ZmZlciBidWZmZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnRbXSB0eXBlSWRzOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nW10gc3RyaW5nUG9vbDsKLSAgICBwcml2YXRlIGludCB0eXBlSWR4OwotICAgIHByaXZhdGUgZmluYWwgRmllbGRJZEl0ZW1bXSBmaWVsZElkSXRlbXM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBEZXhBbm5vdGF0aW9uIGFubm90YXRpb247Ci0KLSAgICBwdWJsaWMgRGV4RW5jb2RlZEFubm90YXRpb25JbXBsKERleEJ1ZmZlciBidWZmZXIsIERleEFubm90YXRpb24gYW5ub3RhdGlvbiwKLSAgICAgICAgICAgIGludFtdIHR5cGVJZHMsIFN0cmluZ1tdIHN0cmluZ1Bvb2wsIEZpZWxkSWRJdGVtW10gZmllbGRJZEl0ZW1zKSB7Ci0gICAgICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyOwotICAgICAgICB0aGlzLmFubm90YXRpb24gPSBhbm5vdGF0aW9uOwotICAgICAgICB0aGlzLnR5cGVJZHMgPSB0eXBlSWRzOwotICAgICAgICB0aGlzLnN0cmluZ1Bvb2wgPSBzdHJpbmdQb29sOwotICAgICAgICB0aGlzLmZpZWxkSWRJdGVtcyA9IGZpZWxkSWRJdGVtczsKLSAgICAgICAgcGFyc2VFbmNvZGVkQW5ub3RhdGlvbigpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwYXJzZUVuY29kZWRBbm5vdGF0aW9uKCkgewotICAgICAgICB0eXBlSWR4ID0gYnVmZmVyLnJlYWRVbGViMTI4KCk7Ci0gICAgICAgIGludCBzaXplID0gYnVmZmVyLnJlYWRVbGViMTI4KCk7Ci0gICAgICAgIHZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8RGV4QW5ub3RhdGlvbkF0dHJpYnV0ZT4oc2l6ZSk7Ci0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTsgaisrKSB7Ci0gICAgICAgICAgICB2YWx1ZXMuYWRkKG5ldyBEZXhBbm5vdGF0aW9uQXR0cmlidXRlSW1wbChidWZmZXIsIGFubm90YXRpb24sCi0gICAgICAgICAgICAgICAgICAgIHR5cGVJZHMsIHN0cmluZ1Bvb2wsIGZpZWxkSWRJdGVtcykpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIERleEVuY29kZWRWYWx1ZVR5cGUgZ2V0VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIERleEVuY29kZWRWYWx1ZVR5cGUuVkFMVUVfQU5OT1RBVElPTjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxEZXhBbm5vdGF0aW9uQXR0cmlidXRlPiBnZXRWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotICAgICAgICByZXR1cm4gc3RyaW5nUG9vbFt0eXBlSWRzW3R5cGVJZHhdXTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gZ2V0VHlwZU5hbWUoKSArICI6IiArIGdldFZhbHVlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGV4LXRvb2xzL3NyYy9kZXgvcmVhZGVyL0RleEVuY29kZWRWYWx1ZUltcGwuamF2YSBiL3Rvb2xzL2RleC10b29scy9zcmMvZGV4L3JlYWRlci9EZXhFbmNvZGVkVmFsdWVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYmExODQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGV4LXRvb2xzL3NyYy9kZXgvcmVhZGVyL0RleEVuY29kZWRWYWx1ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBkZXgucmVhZGVyOwotCi1pbXBvcnQgc3RhdGljIGRleC5zdHJ1Y3R1cmUuRGV4RW5jb2RlZFZhbHVlVHlwZS4qOwotaW1wb3J0IGRleC5yZWFkZXIuRGV4RmlsZVJlYWRlci5GaWVsZElkSXRlbTsKLWltcG9ydCBkZXguc3RydWN0dXJlLkRleEFubm90YXRpb247Ci1pbXBvcnQgZGV4LnN0cnVjdHVyZS5EZXhFbmNvZGVkVmFsdWU7Ci1pbXBvcnQgZGV4LnN0cnVjdHVyZS5EZXhFbmNvZGVkVmFsdWVUeXBlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyogcGFja2FnZSAqL2ZpbmFsIGNsYXNzIERleEVuY29kZWRWYWx1ZUltcGwgaW1wbGVtZW50cyBEZXhFbmNvZGVkVmFsdWUgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBEZXhCdWZmZXIgYnVmZmVyOwotICAgIHByaXZhdGUgYnl0ZSB0eXBlQW5kVmFsdWVBcmc7Ci0gICAgcHJpdmF0ZSBEZXhFbmNvZGVkVmFsdWVUeXBlIHR5cGU7Ci0gICAgcHJpdmF0ZSBTdHJpbmdbXSBzdHJpbmdQb29sOwotICAgIHByaXZhdGUgT2JqZWN0IHZhbHVlOwotICAgIHByaXZhdGUgaW50W10gdHlwZUlkczsKLSAgICBwcml2YXRlIGZpbmFsIEZpZWxkSWRJdGVtW10gZmllbGRJZEl0ZW1zOwotICAgIHByaXZhdGUgZmluYWwgRGV4QW5ub3RhdGlvbiBhbm5vdGF0aW9uOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGJ1ZmZlcgotICAgICAqICAgICAgICAgICAgdGhlIGJ1ZmZlciB3aXRoIHRoZSBjb3JyZWN0IHBvc2l0aW9uCi0gICAgICogQHBhcmFtIGFubm90YXRpb24KLSAgICAgKiBAcGFyYW0gc3RyaW5nUG9vbAotICAgICAqIEBwYXJhbSBmaWVsZElkSXRlbXMKLSAgICAgKi8KLSAgICBwdWJsaWMgRGV4RW5jb2RlZFZhbHVlSW1wbChEZXhCdWZmZXIgYnVmZmVyLCBEZXhBbm5vdGF0aW9uIGFubm90YXRpb24sCi0gICAgICAgICAgICBpbnRbXSB0eXBlSWRzLCBTdHJpbmdbXSBzdHJpbmdQb29sLCBGaWVsZElkSXRlbVtdIGZpZWxkSWRJdGVtcykgewotICAgICAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjsKLSAgICAgICAgdGhpcy5hbm5vdGF0aW9uID0gYW5ub3RhdGlvbjsKLSAgICAgICAgdGhpcy50eXBlSWRzID0gdHlwZUlkczsKLSAgICAgICAgdGhpcy5zdHJpbmdQb29sID0gc3RyaW5nUG9vbDsKLSAgICAgICAgdGhpcy5maWVsZElkSXRlbXMgPSBmaWVsZElkSXRlbXM7Ci0gICAgICAgIHBhcnNlVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcGFyc2VWYWx1ZSgpIHsKLSAgICAgICAgdHlwZUFuZFZhbHVlQXJnID0gYnVmZmVyLnJlYWRVQnl0ZSgpOwotICAgICAgICB0eXBlID0gRGV4RW5jb2RlZFZhbHVlVHlwZS5nZXQodHlwZUFuZFZhbHVlQXJnKTsKLSAgICAgICAgaW50IHZhbHVlQXJnID0gRGV4RW5jb2RlZFZhbHVlVHlwZS52YWx1ZUFyZyh0eXBlQW5kVmFsdWVBcmcpOwotICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgY2FzZSBWQUxVRV9CWVRFOgotICAgICAgICAgICAgdmFsdWUgPSBnZXRCeXRlVmFsdWUodmFsdWVBcmcpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVkFMVUVfU0hPUlQ6Ci0gICAgICAgICAgICB2YWx1ZSA9IGdldFNob3J0VmFsdWUodmFsdWVBcmcpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVkFMVUVfQ0hBUjoKLSAgICAgICAgICAgIHZhbHVlID0gZ2V0Q2hhclZhbHVlKHZhbHVlQXJnKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFZBTFVFX0lOVDoKLSAgICAgICAgICAgIHZhbHVlID0gZ2V0SW50VmFsdWUodmFsdWVBcmcpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVkFMVUVfTE9ORzoKLSAgICAgICAgICAgIHZhbHVlID0gZ2V0TG9uZ1ZhbHVlKHZhbHVlQXJnKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFZBTFVFX0ZMT0FUOgotICAgICAgICAgICAgdmFsdWUgPSBnZXRGbG9hdFZhbHVlKHZhbHVlQXJnKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFZBTFVFX0RPVUJMRToKLSAgICAgICAgICAgIHZhbHVlID0gZ2V0RG91YmxlVmFsdWUodmFsdWVBcmcpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVkFMVUVfU1RSSU5HOgotICAgICAgICAgICAgdmFsdWUgPSBnZXRTdHJpbmdWYWx1ZSh2YWx1ZUFyZyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBWQUxVRV9UWVBFOgotICAgICAgICAgICAgdmFsdWUgPSBnZXRUeXBlVmFsdWUodmFsdWVBcmcpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVkFMVUVfRklFTEQ6Ci0gICAgICAgICAgICB2YWx1ZSA9IGdldEZpZWxkVmFsdWUodmFsdWVBcmcpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVkFMVUVfTUVUSE9EOgotICAgICAgICAgICAgdmFsdWUgPSBnZXRNZXRob2RWYWx1ZSh2YWx1ZUFyZyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBWQUxVRV9FTlVNOgotICAgICAgICAgICAgdmFsdWUgPSBnZXRFbnVtVmFsdWUodmFsdWVBcmcpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVkFMVUVfQVJSQVk6Ci0gICAgICAgICAgICB2YWx1ZSA9IGdldEFycmF5VmFsdWUodmFsdWVBcmcpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVkFMVUVfQU5OT1RBVElPTjoKLSAgICAgICAgICAgIHZhbHVlID0gZ2V0QW5ub3RhdGlvblZhbHVlKHZhbHVlQXJnKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFZBTFVFX05VTEw6Ci0gICAgICAgICAgICB2YWx1ZSA9IGdldE51bGxWYWx1ZSh2YWx1ZUFyZyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBWQUxVRV9CT09MRUFOOgotICAgICAgICAgICAgdmFsdWUgPSBnZXRCb29sZWFuVmFsdWUodmFsdWVBcmcpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJEZXhFbmNvZGVkVmFsdWVUeXBlICIgKyB0eXBlCi0gICAgICAgICAgICAgICAgICAgICsgIiBub3QgcmVjb2duaXplZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVkFMVUVfQk9PTEVBTiAweDFmIGJvb2xlYW4gKDAuLi4xKSAobm9uZSkgb25lLWJpdCB2YWx1ZTsgMCBmb3IgZmFsc2UgYW5kCi0gICAgICogMSBmb3IgdHJ1ZS4gVGhlIGJpdCBpcyByZXByZXNlbnRlZCBpbiB0aGUgdmFsdWVfYXJnLgotICAgICAqLwotICAgIHByaXZhdGUgQm9vbGVhbiBnZXRCb29sZWFuVmFsdWUoaW50IHZhbHVlQXJnKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZUFyZyA9PSAxOwotICAgIH0KLQotICAgIC8qKiBWQUxVRV9OVUxMIDB4MWUgKG5vbmU7IG11c3QgYmUgMCkgKG5vbmUpIG51bGwgcmVmZXJlbmNlIHZhbHVlICovCi0gICAgcHJpdmF0ZSBPYmplY3QgZ2V0TnVsbFZhbHVlKGludCB2YWx1ZUFyZykgewotICAgICAgICByZXR1cm4gbnVsbDsgLy8gbXVzdCBiZSBsaWtlIHRoYXQhCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVkFMVUVfQU5OT1RBVElPTiAweDFkIChub25lOyBtdXN0IGJlIDApIGVuY29kZWRfYW5ub3RhdGlvbiBhCi0gICAgICogc3ViLWFubm90YXRpb24sIGluIHRoZSBmb3JtYXQgc3BlY2lmaWVkIGJ5ICJlbmNvZGVkX2Fubm90YXRpb24gRm9ybWF0IgotICAgICAqIGJlbG93LiBUaGUgc2l6ZSBvZiB0aGUgdmFsdWUgaXMgaW1wbGljaXQgaW4gdGhlIGVuY29kaW5nLgotICAgICAqLwotICAgIHByaXZhdGUgT2JqZWN0IGdldEFubm90YXRpb25WYWx1ZShpbnQgdmFsdWVBcmcpIHsKLSAgICAgICAgLy8gdXNlIHRoZSBidWZmZXIgZGlyZWN0bHkgdG8gZ2V0IGFkanVzdGVkIG9mZnNldAotICAgICAgICByZXR1cm4gbmV3IERleEVuY29kZWRBbm5vdGF0aW9uSW1wbChidWZmZXIsIGFubm90YXRpb24sIHR5cGVJZHMsCi0gICAgICAgICAgICAgICAgc3RyaW5nUG9vbCwgZmllbGRJZEl0ZW1zKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWQUxVRV9BUlJBWSAweDFjIChub25lOyBtdXN0IGJlIDApIGVuY29kZWRfYXJyYXkgYW4gYXJyYXkgb2YgdmFsdWVzLCBpbgotICAgICAqIHRoZSBmb3JtYXQgc3BlY2lmaWVkIGJ5ICJlbmNvZGVkX2FycmF5IEZvcm1hdCIgYmVsb3cuIFRoZSBzaXplIG9mIHRoZQotICAgICAqIHZhbHVlIGlzIGltcGxpY2l0IGluIHRoZSBlbmNvZGluZy4KLSAgICAgKi8KLSAgICBwcml2YXRlIExpc3Q8RGV4RW5jb2RlZFZhbHVlPiBnZXRBcnJheVZhbHVlKGludCB2YWx1ZUFyZykgewotICAgICAgICBpbnQgc2l6ZSA9IGJ1ZmZlci5yZWFkVWxlYjEyOCgpOwotICAgICAgICBMaXN0PERleEVuY29kZWRWYWx1ZT4gdmFsdWVzID0gbmV3IEFycmF5TGlzdDxEZXhFbmNvZGVkVmFsdWU+KHNpemUpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgdmFsdWVzLmFkZChuZXcgRGV4RW5jb2RlZFZhbHVlSW1wbChidWZmZXIsIGFubm90YXRpb24sIHR5cGVJZHMsCi0gICAgICAgICAgICAgICAgICAgIHN0cmluZ1Bvb2wsIGZpZWxkSWRJdGVtcykpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWx1ZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVkFMVUVfRU5VTSAweDFiIHNpemUgLSAxICgwLi4uMykgdWJ5dGVbc2l6ZV0gdW5zaWduZWQgKHplcm8tZXh0ZW5kZWQpCi0gICAgICogZm91ci1ieXRlIGludGVnZXIgdmFsdWUsIGludGVycHJldGVkIGFzIGFuIGluZGV4IGludG8gdGhlIGZpZWxkX2lkcwotICAgICAqIHNlY3Rpb24gYW5kIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgYW4gZW51bWVyYXRlZCB0eXBlIGNvbnN0YW50Ci0gICAgICovCi0gICAgcHJpdmF0ZSBPYmplY3QgZ2V0RW51bVZhbHVlKGludCB2YWx1ZUFyZykgewotICAgICAgICBpbnQgZmllbGRPZmZzZXQgPSBidWZmZXIucmVhZEludCh2YWx1ZUFyZyArIDEpOwotICAgICAgICBGaWVsZElkSXRlbSBmaWVsZElkSXRlbSA9IGZpZWxkSWRJdGVtc1tmaWVsZE9mZnNldF07Ci0gICAgICAgIC8vIEZPUk1BVCBMYS9iL0U7IUNPTlNUQU5UCi0gICAgICAgIFN0cmluZyBjb25zdGFudE5hbWUgPSBzdHJpbmdQb29sW2ZpZWxkSWRJdGVtLm5hbWVfaWR4XTsKLSAgICAgICAgU3RyaW5nIHR5cGVOYW1lID0gc3RyaW5nUG9vbFt0eXBlSWRzW2ZpZWxkSWRJdGVtLnR5cGVfaWR4XV07Ci0gICAgICAgIHJldHVybiB0eXBlTmFtZSArICIhIiArIGNvbnN0YW50TmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWQUxVRV9NRVRIT0QgMHgxYSBzaXplIC0gMSAoMC4uLjMpIHVieXRlW3NpemVdIHVuc2lnbmVkICh6ZXJvLWV4dGVuZGVkKQotICAgICAqIGZvdXItYnl0ZSBpbnRlZ2VyIHZhbHVlLCBpbnRlcnByZXRlZCBhcyBhbiBpbmRleCBpbnRvIHRoZSBtZXRob2RfaWRzCi0gICAgICogc2VjdGlvbiBhbmQgcmVwcmVzZW50aW5nIGEgcmVmbGVjdGl2ZSBtZXRob2QgdmFsdWUKLSAgICAgKi8KLSAgICBwcml2YXRlIE9iamVjdCBnZXRNZXRob2RWYWx1ZShpbnQgdmFsdWVBcmcpIHsKLSAgICAgICAgLy8gRklYTUUgbG9va3VwIHZhbHVlCi0gICAgICAgIGJ1ZmZlci5za2lwKHZhbHVlQXJnICsgMSk7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZBTFVFX0ZJRUxEIDB4MTkgc2l6ZSAtIDEgKDAuLi4zKSB1Ynl0ZVtzaXplXSB1bnNpZ25lZCAoemVyby1leHRlbmRlZCkKLSAgICAgKiBmb3VyLWJ5dGUgaW50ZWdlciB2YWx1ZSwgaW50ZXJwcmV0ZWQgYXMgYW4gaW5kZXggaW50byB0aGUgZmllbGRfaWRzCi0gICAgICogc2VjdGlvbiBhbmQgcmVwcmVzZW50aW5nIGEgcmVmbGVjdGl2ZSBmaWVsZCB2YWx1ZQotICAgICAqLwotICAgIHByaXZhdGUgT2JqZWN0IGdldEZpZWxkVmFsdWUoaW50IHZhbHVlQXJnKSB7Ci0gICAgICAgIGludCBmaWVsZE9mZnNldCA9IGJ1ZmZlci5yZWFkSW50KHZhbHVlQXJnICsgMSk7Ci0gICAgICAgIEZpZWxkSWRJdGVtIGZpZWxkSWRJdGVtID0gZmllbGRJZEl0ZW1zW2ZpZWxkT2Zmc2V0XTsKLSAgICAgICAgLy8gRk9STUFUIExhL2IvRTshQ09OU1RBTlQKLSAgICAgICAgU3RyaW5nIGZpZWxkTmFtZSA9IHN0cmluZ1Bvb2xbZmllbGRJZEl0ZW0ubmFtZV9pZHhdOwotICAgICAgICBTdHJpbmcgdHlwZU5hbWUgPSBzdHJpbmdQb29sW3R5cGVJZHNbZmllbGRJZEl0ZW0udHlwZV9pZHhdXTsKLSAgICAgICAgcmV0dXJuIHR5cGVOYW1lICsgIiEiICsgZmllbGROYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZBTFVFX1RZUEUgMHgxOCBzaXplIC0gMSAoMC4uLjMpIHVieXRlW3NpemVdIHVuc2lnbmVkICh6ZXJvLWV4dGVuZGVkKQotICAgICAqIGZvdXItYnl0ZSBpbnRlZ2VyIHZhbHVlLCBpbnRlcnByZXRlZCBhcyBhbiBpbmRleCBpbnRvIHRoZSB0eXBlX2lkcwotICAgICAqIHNlY3Rpb24gYW5kIHJlcHJlc2VudGluZyBhIHJlZmxlY3RpdmUgdHlwZS9jbGFzcyB2YWx1ZQotICAgICAqLwotICAgIHByaXZhdGUgT2JqZWN0IGdldFR5cGVWYWx1ZShpbnQgdmFsdWVBcmcpIHsKLSAgICAgICAgdmFsdWVBcmcrKzsgLy8gc2l6ZSAtIDEgKDAuLi4zKQotICAgICAgICAvLyBGSVhNRSBTUEVDISEgc3RhdGVzOiB1bnNpZ25lZCAoemVyby1leHRlbmRlZCkgZm91ci1ieXRlIGludGVnZXIgdmFsdWUKLSAgICAgICAgcmV0dXJuIHN0cmluZ1Bvb2xbdHlwZUlkc1tidWZmZXIucmVhZEludCh2YWx1ZUFyZyldXTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWQUxVRV9TVFJJTkcgMHgxNyBzaXplIC0gMSAoMC4uLjMpIHVieXRlW3NpemVdIHVuc2lnbmVkICh6ZXJvLWV4dGVuZGVkKQotICAgICAqIGZvdXItYnl0ZSBpbnRlZ2VyIHZhbHVlLCBpbnRlcnByZXRlZCBhcyBhbiBpbmRleCBpbnRvIHRoZSBzdHJpbmdfaWRzCi0gICAgICogc2VjdGlvbiBhbmQgcmVwcmVzZW50aW5nIGEgc3RyaW5nIHZhbHVlCi0gICAgICovCi0gICAgcHJpdmF0ZSBPYmplY3QgZ2V0U3RyaW5nVmFsdWUoaW50IHZhbHVlQXJnKSB7Ci0gICAgICAgIHZhbHVlQXJnKys7Ci0gICAgICAgIHJldHVybiBzdHJpbmdQb29sW2J1ZmZlci5yZWFkSW50KHZhbHVlQXJnKV07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVkFMVUVfRE9VQkxFIDB4MTEgc2l6ZSAtIDEgKDAuLi43KSB1Ynl0ZVtzaXplXSBlaWdodC1ieXRlIGJpdCBwYXR0ZXJuLAotICAgICAqIHplcm8tZXh0ZW5kZWQgdG8gdGhlIHJpZ2h0LCBhbmQgaW50ZXJwcmV0ZWQgYXMgYW4gSUVFRTc1NCA2NC1iaXQgZmxvYXRpbmcKLSAgICAgKiBwb2ludCB2YWx1ZQotICAgICAqLwotICAgIHByaXZhdGUgT2JqZWN0IGdldERvdWJsZVZhbHVlKGludCB2YWx1ZUFyZykgewotICAgICAgICByZXR1cm4gYnVmZmVyLnJlYWREb3VibGUodmFsdWVBcmcgKyAxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWQUxVRV9GTE9BVCAweDEwIHNpemUgLSAxICgwLi4uMykgdWJ5dGVbc2l6ZV0gZm91ci1ieXRlIGJpdCBwYXR0ZXJuLAotICAgICAqIHplcm8tZXh0ZW5kZWQgdG8gdGhlIHJpZ2h0LCBhbmQgaW50ZXJwcmV0ZWQgYXMgYW4gSUVFRTc1NCAzMi1iaXQgZmxvYXRpbmcKLSAgICAgKiBwb2ludCB2YWx1ZQotICAgICAqLwotICAgIHByaXZhdGUgRmxvYXQgZ2V0RmxvYXRWYWx1ZShpbnQgdmFsdWVBcmcpIHsKLSAgICAgICAgcmV0dXJuIGJ1ZmZlci5yZWFkRmxvYXQodmFsdWVBcmcgKyAxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWQUxVRV9MT05HIDB4MDYgc2l6ZSAtIDEgKDAuLi43KSB1Ynl0ZVtzaXplXSBzaWduZWQgZWlnaHQtYnl0ZSBpbnRlZ2VyCi0gICAgICogdmFsdWUsIHNpZ24tZXh0ZW5kZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIExvbmcgZ2V0TG9uZ1ZhbHVlKGludCB2YWx1ZUFyZykgewotICAgICAgICByZXR1cm4gYnVmZmVyLnJlYWRMb25nKHZhbHVlQXJnICsgMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVkFMVUVfSU5UIDB4MDQgc2l6ZSAtIDEgKDAuLi4zKSB1Ynl0ZVtzaXplXSBzaWduZWQgZm91ci1ieXRlIGludGVnZXIKLSAgICAgKiB2YWx1ZSwgc2lnbi1leHRlbmRlZAotICAgICAqLwotICAgIHByaXZhdGUgSW50ZWdlciBnZXRJbnRWYWx1ZShpbnQgdmFsdWVBcmcpIHsKLSAgICAgICAgcmV0dXJuIGJ1ZmZlci5yZWFkSW50KHZhbHVlQXJnICsgMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVkFMVUVfQ0hBUiAweDAzIHNpemUgLSAxICgwLi4uMSkgdWJ5dGVbc2l6ZV0gdW5zaWduZWQgdHdvLWJ5dGUgaW50ZWdlcgotICAgICAqIHZhbHVlLCB6ZXJvLWV4dGVuZGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBDaGFyYWN0ZXIgZ2V0Q2hhclZhbHVlKGludCB2YWx1ZUFyZykgewotICAgICAgICByZXR1cm4gYnVmZmVyLnJlYWRDaGFyKHZhbHVlQXJnICsgMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVkFMVUVfU0hPUlQgMHgwMiBzaXplIC0gMSAoMC4uLjEpIHVieXRlW3NpemVdIHNpZ25lZCB0d28tYnl0ZSBpbnRlZ2VyCi0gICAgICogdmFsdWUsIHNpZ24tZXh0ZW5kZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIFNob3J0IGdldFNob3J0VmFsdWUoaW50IHZhbHVlQXJnKSB7Ci0gICAgICAgIHJldHVybiBidWZmZXIucmVhZFNob3J0KHZhbHVlQXJnICsgMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVkFMVUVfQllURSAweDAwIChub25lOyBtdXN0IGJlIDApIHVieXRlWzFdIHNpZ25lZCBvbmUtYnl0ZSBpbnRlZ2VyIHZhbHVlCi0gICAgICovCi0gICAgcHJpdmF0ZSBCeXRlIGdldEJ5dGVWYWx1ZShpbnQgdmFsdWVBcmcpIHsKLSAgICAgICAgYXNzZXJ0IHZhbHVlQXJnID09IDAgOiAiSWxsZWdhbCB2YWx1ZUFyZyBmb3IgVkFMVUVfQllURTogIiArIHZhbHVlQXJnOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRGV4RW5jb2RlZFZhbHVlVHlwZSBnZXRUeXBlKCkgewotICAgICAgICByZXR1cm4gdHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQoIj0iKTsKLSAgICAgICAgaWYgKHR5cGUgPT0gVkFMVUVfQVJSQVkpIHsKLSAgICAgICAgICAgIGlmIChnZXRWYWx1ZSgpIGluc3RhbmNlb2YgTGlzdDw/PikgewotICAgICAgICAgICAgICAgIExpc3Q8Pz4gdmFsdWVzID0gKExpc3Q8Pz4pIGdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChPYmplY3Qgb2JqZWN0IDogdmFsdWVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIERleEVuY29kZWRWYWx1ZSB2YWwgPSAoRGV4RW5jb2RlZFZhbHVlKSBvYmplY3Q7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHZhbC5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChnZXRWYWx1ZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RleC10b29scy9zcmMvZGV4L3JlYWRlci9EZXhGaWVsZEltcGwuamF2YSBiL3Rvb2xzL2RleC10b29scy9zcmMvZGV4L3JlYWRlci9EZXhGaWVsZEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRhOGM3Mi4uMDAwMDAwMAotLS0gYS90b29scy9kZXgtdG9vbHMvc3JjL2RleC9yZWFkZXIvRGV4RmllbGRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgZGV4LnJlYWRlcjsKLQotaW1wb3J0IGRleC5yZWFkZXIuRGV4Q2xhc3NJbXBsLkZpZWxkQW5ub3RhdGlvbjsKLWltcG9ydCBkZXgucmVhZGVyLkRleEZpbGVSZWFkZXIuRmllbGRJZEl0ZW07Ci1pbXBvcnQgZGV4LnN0cnVjdHVyZS5EZXhBbm5vdGF0aW9uOwotaW1wb3J0IGRleC5zdHJ1Y3R1cmUuRGV4Q2xhc3M7Ci1pbXBvcnQgZGV4LnN0cnVjdHVyZS5EZXhGaWVsZDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qIHBhY2thZ2UgKi9maW5hbCBjbGFzcyBEZXhGaWVsZEltcGwgaW1wbGVtZW50cyBEZXhGaWVsZCB7Ci0KLSAgICBwcml2YXRlIERleEJ1ZmZlciBidWZmZXI7Ci0gICAgcHJpdmF0ZSBTdHJpbmdbXSBzdHJpbmdQb29sOwotICAgIHByaXZhdGUgRmllbGRJZEl0ZW0gZmllbGRJZEl0ZW07Ci0gICAgcHJpdmF0ZSBpbnRbXSB0eXBlSWRzOwotICAgIHByaXZhdGUgZmluYWwgaW50IGFjY2Vzc0ZsYWdzOwotICAgIHByaXZhdGUgU2V0PERleEFubm90YXRpb24+IGFubm90YXRpb25zOwotICAgIHByaXZhdGUgRmllbGRBbm5vdGF0aW9uIGZpZWxkQW5ub3RhdGlvbjsKLSAgICBwcml2YXRlIFR5cGVGb3JtYXR0ZXIgZm9ybWF0dGVyID0gbmV3IFR5cGVGb3JtYXR0ZXIoKTsKLSAgICBwcml2YXRlIGZpbmFsIERleENsYXNzIGRlY2xhcmluZ0NsYXNzOwotICAgIHByaXZhdGUgZmluYWwgRmllbGRJZEl0ZW1bXSBmaWVsZElkSXRlbXM7Ci0KLSAgICBwdWJsaWMgRGV4RmllbGRJbXBsKERleEJ1ZmZlciBidWZmZXIsIERleENsYXNzIGRlY2xhcmluZ0NsYXNzLAotICAgICAgICAgICAgRmllbGRJZEl0ZW0gZmllbGRJZEl0ZW0sIGludCBhY2Nlc3NGbGFncywKLSAgICAgICAgICAgIEZpZWxkQW5ub3RhdGlvbiBmaWVsZEFubm90YXRpb24sIFN0cmluZ1tdIHN0cmluZ1Bvb2wsCi0gICAgICAgICAgICBpbnRbXSB0eXBlSWRzLCBGaWVsZElkSXRlbVtdIGZpZWxkSWRJdGVtcykgewotICAgICAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjsKLSAgICAgICAgdGhpcy5kZWNsYXJpbmdDbGFzcyA9IGRlY2xhcmluZ0NsYXNzOwotICAgICAgICB0aGlzLmZpZWxkSWRJdGVtID0gZmllbGRJZEl0ZW07Ci0gICAgICAgIHRoaXMuYWNjZXNzRmxhZ3MgPSBhY2Nlc3NGbGFnczsKLSAgICAgICAgdGhpcy5maWVsZEFubm90YXRpb24gPSBmaWVsZEFubm90YXRpb247Ci0gICAgICAgIHRoaXMuc3RyaW5nUG9vbCA9IHN0cmluZ1Bvb2w7Ci0gICAgICAgIHRoaXMudHlwZUlkcyA9IHR5cGVJZHM7Ci0gICAgICAgIHRoaXMuZmllbGRJZEl0ZW1zID0gZmllbGRJZEl0ZW1zOwotICAgICAgICBwYXJzZUFubm90YXRpb25zKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHBhcnNlQW5ub3RhdGlvbnMoKSB7Ci0gICAgICAgIGFubm90YXRpb25zID0gbmV3IEhhc2hTZXQ8RGV4QW5ub3RhdGlvbj4oKTsKLSAgICAgICAgaWYgKGZpZWxkQW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBidWZmZXIuc2V0UG9zaXRpb24oZmllbGRBbm5vdGF0aW9uLmFubm90YXRpb25zT2ZmKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBzaXplID0gYnVmZmVyLnJlYWRVSW50KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgIGFubm90YXRpb25zLmFkZChuZXcgRGV4QW5ub3RhdGlvbkltcGwoYnVmZmVyLmNyZWF0ZUNvcHkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5yZWFkVUludCgpLCB0eXBlSWRzLCBzdHJpbmdQb29sLCBmaWVsZElkSXRlbXMpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHN0cmluZ1Bvb2xbZmllbGRJZEl0ZW0ubmFtZV9pZHhdOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIHN0cmluZ1Bvb2xbdHlwZUlkc1tmaWVsZElkSXRlbS50eXBlX2lkeF1dOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0TW9kaWZpZXJzKCkgewotICAgICAgICByZXR1cm4gYWNjZXNzRmxhZ3M7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBTZXQ8RGV4QW5ub3RhdGlvbj4gZ2V0QW5ub3RhdGlvbnMoKSB7Ci0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRGV4Q2xhc3MgZ2V0RGVjbGFyaW5nQ2xhc3MoKSB7Ci0gICAgICAgIHJldHVybiBkZWNsYXJpbmdDbGFzczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VudW1Db25zdGFudCgpIHsKLSAgICAgICAgcmV0dXJuIChnZXRNb2RpZmllcnMoKSAmIDB4NDAwMCkgPiAwOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKGZvcm1hdHRlci5mb3JtYXRBbm5vdGF0aW9ucyhnZXRBbm5vdGF0aW9ucygpKSk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKE1vZGlmaWVyLnRvU3RyaW5nKGdldE1vZGlmaWVycygpKSk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIgIik7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKGZvcm1hdHRlci5mb3JtYXQoZ2V0VHlwZSgpKSk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIgIik7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKGdldE5hbWUoKSk7Ci0gICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGV4LXRvb2xzL3NyYy9kZXgvcmVhZGVyL0RleEZpbGVJbXBsLmphdmEgYi90b29scy9kZXgtdG9vbHMvc3JjL2RleC9yZWFkZXIvRGV4RmlsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEwNjZmMS4uMDAwMDAwMAotLS0gYS90b29scy9kZXgtdG9vbHMvc3JjL2RleC9yZWFkZXIvRGV4RmlsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGRleC5yZWFkZXI7Ci0KLWltcG9ydCBkZXgucmVhZGVyLkRleEZpbGVSZWFkZXIuQ2xhc3NEZWZJdGVtOwotaW1wb3J0IGRleC5yZWFkZXIuRGV4RmlsZVJlYWRlci5GaWVsZElkSXRlbTsKLWltcG9ydCBkZXgucmVhZGVyLkRleEZpbGVSZWFkZXIuTWV0aG9kc0lkSXRlbTsKLWltcG9ydCBkZXgucmVhZGVyLkRleEZpbGVSZWFkZXIuUHJvdElkSXRlbTsKLWltcG9ydCBkZXguc3RydWN0dXJlLkRleENsYXNzOwotaW1wb3J0IGRleC5zdHJ1Y3R1cmUuRGV4RmlsZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyogcGFja2FnZSAqL2ZpbmFsIGNsYXNzIERleEZpbGVJbXBsIGltcGxlbWVudHMgRGV4RmlsZSB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZ1tdIHN0cmluZ1Bvb2w7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnRbXSB0eXBlSWRzOwotICAgIHByaXZhdGUgUHJvdElkSXRlbVtdIHByb3RvSWRJdGVtczsKLSAgICBwcml2YXRlIEZpZWxkSWRJdGVtW10gZmllbGRJZEl0ZW1zOwotICAgIHByaXZhdGUgTWV0aG9kc0lkSXRlbVtdIG1ldGhvZElkSXRlbXM7Ci0gICAgcHJpdmF0ZSBDbGFzc0RlZkl0ZW1bXSBjbGFzc0RlZkl0ZW1zOwotICAgIHByaXZhdGUgZmluYWwgRGV4QnVmZmVyIGJ1ZmZlcjsKLQotICAgIHByaXZhdGUgTGlzdDxEZXhDbGFzcz4gY2xhc3NlcyA9IG51bGw7Ci0KLSAgICBwdWJsaWMgRGV4RmlsZUltcGwoRGV4QnVmZmVyIGJ1ZmZlciwgU3RyaW5nW10gc3RyaW5nUG9vbCwgaW50W10gdHlwZUlkcywKLSAgICAgICAgICAgIFByb3RJZEl0ZW1bXSBwcm90b0lkcywgRmllbGRJZEl0ZW1bXSBmaWVsZElkSXRlbXMsCi0gICAgICAgICAgICBNZXRob2RzSWRJdGVtW10gbWV0aG9kSWRJdGVtcywgQ2xhc3NEZWZJdGVtW10gY2xhc3NEZWZJdGVtcykgewotICAgICAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjsKLSAgICAgICAgdGhpcy5zdHJpbmdQb29sID0gc3RyaW5nUG9vbDsKLSAgICAgICAgdGhpcy50eXBlSWRzID0gdHlwZUlkczsKLSAgICAgICAgdGhpcy5wcm90b0lkSXRlbXMgPSBwcm90b0lkczsKLSAgICAgICAgdGhpcy5maWVsZElkSXRlbXMgPSBmaWVsZElkSXRlbXM7Ci0gICAgICAgIHRoaXMubWV0aG9kSWRJdGVtcyA9IG1ldGhvZElkSXRlbXM7Ci0gICAgICAgIHRoaXMuY2xhc3NEZWZJdGVtcyA9IGNsYXNzRGVmSXRlbXM7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBkZXgucmVhZGVyLkRleEZpbGUjZ2V0RGVmaW5lZENsYXNzZXMoKQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgTGlzdDxEZXhDbGFzcz4gZ2V0RGVmaW5lZENsYXNzZXMoKSB7Ci0gICAgICAgIGlmIChjbGFzc2VzID09IG51bGwpIHsKLSAgICAgICAgICAgIGNsYXNzZXMgPSBuZXcgQXJyYXlMaXN0PERleENsYXNzPihjbGFzc0RlZkl0ZW1zLmxlbmd0aCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzRGVmSXRlbXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBjbGFzc2VzLmFkZChuZXcgRGV4Q2xhc3NJbXBsKGJ1ZmZlci5jcmVhdGVDb3B5KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc0RlZkl0ZW1zW2ldLCBzdHJpbmdQb29sLCB0eXBlSWRzLCBwcm90b0lkSXRlbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElkSXRlbXMsIG1ldGhvZElkSXRlbXMpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2xhc3NlczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBiLmFwcGVuZCgiU3RyaW5nUG9vbDpcbiIpLmFwcGVuZChBcnJheXMudG9TdHJpbmcoc3RyaW5nUG9vbCkpOwotICAgICAgICBiLmFwcGVuZCgiXG5UeXBlczpcbiIpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVJZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGIuYXBwZW5kKHN0cmluZ1Bvb2xbdHlwZUlkc1tpXV0gKyAiXG4iKTsKLSAgICAgICAgfQotICAgICAgICBiLmFwcGVuZCgiXG5Qcm90b3M6XG4iKS5hcHBlbmQoQXJyYXlzLnRvU3RyaW5nKHByb3RvSWRJdGVtcykpOwotICAgICAgICBiLmFwcGVuZCgiXG5GaWVsZHM6XG4iKS5hcHBlbmQoQXJyYXlzLnRvU3RyaW5nKGZpZWxkSWRJdGVtcykpOwotICAgICAgICBiLmFwcGVuZCgiXG5NZXRob2RzOlxuIikuYXBwZW5kKEFycmF5cy50b1N0cmluZyhtZXRob2RJZEl0ZW1zKSk7Ci0gICAgICAgIGIuYXBwZW5kKCJcbkNsYXNzZXM6XG4iKS5hcHBlbmQoQXJyYXlzLnRvU3RyaW5nKGNsYXNzRGVmSXRlbXMpKTsKLSAgICAgICAgcmV0dXJuIGIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiRGV4RmlsZSI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGV4LXRvb2xzL3NyYy9kZXgvcmVhZGVyL0RleEZpbGVSZWFkZXIuamF2YSBiL3Rvb2xzL2RleC10b29scy9zcmMvZGV4L3JlYWRlci9EZXhGaWxlUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmZDE3ZjYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGV4LXRvb2xzL3NyYy9kZXgvcmVhZGVyL0RleEZpbGVSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBkZXgucmVhZGVyOwotCi1pbXBvcnQgZGV4LnN0cnVjdHVyZS5EZXhGaWxlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotcHVibGljIGZpbmFsIGNsYXNzIERleEZpbGVSZWFkZXIgewotCi0gICAgLy8gREVYIGNvbnN0YW50cwotICAgIHByaXZhdGUgaW50IEVORElBTl9DT05TVEFOVCA9IDB4MTIzNDU2Nzg7Ci0gICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0gICAgcHJpdmF0ZSBpbnQgUkVWRVJTRV9FTkRJQU5fQ09OU1RBTlQgPSAweDc4NTYzNDEyOwotICAgIHByaXZhdGUgZmluYWwgYnl0ZVtdIFJFRl9NQUdJQyA9IG5ldyBieXRlW10gewotICAgICAgICAgICAgMHg2NCwgMHg2NSwgMHg3OCwgMHgwYSwgMHgzMCwgMHgzMywgMHgzNSwgMHgwMH07Ci0KLSAgICAvLyBIZWFkZXIgdmFsdWVzCi0gICAgcHJpdmF0ZSBEZXhCdWZmZXIgYjsKLSAgICBwcml2YXRlIGJ5dGVbXSBtYWdpYyA9IG5ldyBieXRlWzhdOwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotICAgIHByaXZhdGUgaW50IGNoZWNrc3VtID0gMDsKLSAgICBwcml2YXRlIGJ5dGVbXSBzaWduYXR1cmUgPSBuZXcgYnl0ZVsyMF07Ci0gICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0gICAgcHJpdmF0ZSBpbnQgZmlsZVNpemUgPSAwOwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotICAgIHByaXZhdGUgaW50IGhlYWRlclNpemUgPSAwOwotICAgIHByaXZhdGUgaW50IGVuZGlhblRhZyA9IDA7Ci0KLSAgICAvLyBJbmRpY2VzIG9mIG9mZnNldCBhbmQgc2l6ZSBpdGVtcwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMSU5LID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFQID0gMTsgLy8gbm8gc2l6ZSEKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RSSU5HX0lEUyA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRZUEVfSURTID0gMzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFJPVE9fSURTID0gNDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRklFTERfSURTID0gNTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVUSE9EX0lEUyA9IDY7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENMQVNTX0RFRlMgPSA3OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEQVRBID0gODsKLQotICAgIHByaXZhdGUgaW50W10gc2l6ZSA9IG5ldyBpbnRbOV07Ci0gICAgcHJpdmF0ZSBpbnRbXSBvZmYgPSBuZXcgaW50WzldOwotCi0KLSAgICAvLwotICAgIHByaXZhdGUgU3RyaW5nW10gc3RyaW5nUG9vbDsKLSAgICBwcml2YXRlIGludFtdIHR5cGVJZHM7IC8vIHZhbHVlcyBhcmUgaW5kZXggb2Ygc3RyaW5nUG9vbAotICAgIHByaXZhdGUgUHJvdElkSXRlbVtdIHByb3RvSWRJdGVtczsKLSAgICBwcml2YXRlIEZpZWxkSWRJdGVtW10gZmllbGRJZEl0ZW1zOwotICAgIHByaXZhdGUgTWV0aG9kc0lkSXRlbVtdIG1ldGhvZElkSXRlbXM7Ci0gICAgcHJpdmF0ZSBDbGFzc0RlZkl0ZW1bXSBjbGFzc0RlZkl0ZW1zOwotCi0gICAgLy8gc3RhcnRpbmcgYnVmZmVyIGF0IHplcm8KLSAgICBwdWJsaWMgRGV4RmlsZSByZWFkKERleEJ1ZmZlciBidWZmZXIpIHsKLSAgICAgICAgdGhpcy5iID0gYnVmZmVyOwotICAgICAgICByZWFkTWFnaWMoKTsKLSAgICAgICAgcmVhZENoZWNrc3VtKCk7Ci0gICAgICAgIHJlYWRTaWduYXR1cmUoKTsKLSAgICAgICAgcmVhZEZpbGVTaXplKCk7Ci0gICAgICAgIHJlYWRIZWFkZXJTaXplKCk7Ci0gICAgICAgIHJlYWRFbmRpYW5UYWcoKTsKLSAgICAgICAgcmVhZFNpemUoTElOSyk7Ci0gICAgICAgIHJlYWRPZmZzZXQoTElOSyk7Ci0gICAgICAgIHJlYWRPZmZzZXQoTUFQKTsKLSAgICAgICAgcmVhZFNpemUoU1RSSU5HX0lEUyk7Ci0gICAgICAgIHJlYWRPZmZzZXQoU1RSSU5HX0lEUyk7Ci0gICAgICAgIHJlYWRTaXplKFRZUEVfSURTKTsKLSAgICAgICAgcmVhZE9mZnNldChUWVBFX0lEUyk7Ci0gICAgICAgIHJlYWRTaXplKFBST1RPX0lEUyk7Ci0gICAgICAgIHJlYWRPZmZzZXQoUFJPVE9fSURTKTsKLSAgICAgICAgcmVhZFNpemUoRklFTERfSURTKTsKLSAgICAgICAgcmVhZE9mZnNldChGSUVMRF9JRFMpOwotICAgICAgICByZWFkU2l6ZShNRVRIT0RfSURTKTsKLSAgICAgICAgcmVhZE9mZnNldChNRVRIT0RfSURTKTsKLSAgICAgICAgcmVhZFNpemUoQ0xBU1NfREVGUyk7Ci0gICAgICAgIHJlYWRPZmZzZXQoQ0xBU1NfREVGUyk7Ci0gICAgICAgIHJlYWRTaXplKERBVEEpOwotICAgICAgICByZWFkT2Zmc2V0KERBVEEpOwotICAgICAgICAvLyBmcm9tIG5vdyBvbiwgaW5kZXggaXMgbm90IGF1dG9tYXRpY2FsbHkgb24gdGhlIGRlc2lyZWQgcG9zaXRpb24KLSAgICAgICAgcmVhZFN0cmluZ3MoKTsKLSAgICAgICAgcmVhZFR5cGVJZHMoKTsKLSAgICAgICAgcmVhZFByb3RvcygpOwotICAgICAgICByZWFkRmllbGRzKCk7Ci0gICAgICAgIHJlYWRNZXRob2RzKCk7Ci0gICAgICAgIHJlYWRDbGFzc2VzKCk7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBEZXhGaWxlSW1wbChiLmNyZWF0ZUNvcHkoKSwgc3RyaW5nUG9vbCwgdHlwZUlkcywKLSAgICAgICAgICAgICAgICBwcm90b0lkSXRlbXMsIGZpZWxkSWRJdGVtcywgbWV0aG9kSWRJdGVtcywgY2xhc3NEZWZJdGVtcyk7Ci0gICAgfQotCi0gICAgLy8gTUFHSUMgKDgsIFVfQllURSkKLSAgICAvLyAiZGV4XG4wMzVcMCIKLSAgICBwcml2YXRlIHZvaWQgcmVhZE1hZ2ljKCkgewotICAgICAgICBiLnJlYWRCeXRlcyhtYWdpYyk7Ci0gICAgICAgIGFzc2VydCBBcnJheXMuZXF1YWxzKG1hZ2ljLCBSRUZfTUFHSUMpIDogIk5vdCBhIERFWCBmaWxlIjsKLSAgICB9Ci0KLSAgICAvLyBDSEVDS1NVTSAoMSwgVV9JTlQpCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWRDaGVja3N1bSgpIHsKLSAgICAgICAgY2hlY2tzdW0gPSBiLnJlYWRVSW50KCk7Ci0gICAgfQotCi0gICAgLy8gU0lHTkFUVVJFICgyMCwgVV9CWVRFKQotICAgIHByaXZhdGUgdm9pZCByZWFkU2lnbmF0dXJlKCkgewotICAgICAgICBiLnJlYWRCeXRlcyhzaWduYXR1cmUpOwotICAgIH0KLQotICAgIC8vIEZJTEVfU0laRSAoMSwgVV9JTlQpCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWRGaWxlU2l6ZSgpIHsKLSAgICAgICAgZmlsZVNpemUgPSBiLnJlYWRVSW50KCk7Ci0gICAgfQotCi0gICAgLy8gSEVBREVSX1NJWkUgKDEsIFVfSU5UKSwgLy8weDcwCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWRIZWFkZXJTaXplKCkgewotICAgICAgICBoZWFkZXJTaXplID0gYi5yZWFkVUludCgpOwotICAgIH0KLQotICAgIC8vIEVORElBTl9UQUcgKDEsIFVfSU5UKSwgLy9FTkRJQU5fQ09OU1RBTlQKLSAgICBwcml2YXRlIHZvaWQgcmVhZEVuZGlhblRhZygpIHsKLSAgICAgICAgZW5kaWFuVGFnID0gYi5yZWFkVUludCgpOwotICAgICAgICAvLyBGSVhNRSBTdXBwb3J0IGZvciBiaWcgZW5kaWFuIGVuY29kZWQgZGV4IGZpbGVzCi0gICAgICAgIGFzc2VydCBlbmRpYW5UYWcgPT0gRU5ESUFOX0NPTlNUQU5UIDogIkJ5dGVvcmRlciBOT1QgaW4gbGl0dGxlIGVuZGlhbiI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWRTaXplKGludCBhdHRyaWJ1dGUpIHsKLSAgICAgICAgc2l6ZVthdHRyaWJ1dGVdID0gYi5yZWFkVUludCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZWFkT2Zmc2V0KGludCBhdHRyaWJ1dGUpIHsKLSAgICAgICAgb2ZmW2F0dHJpYnV0ZV0gPSBiLnJlYWRVSW50KCk7Ci0gICAgfQotCi0gICAgLy8gcmVhZHMgdGhlIHN0cmluZyBwb29sCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWRTdHJpbmdzKCkgewotICAgICAgICBpbnQgblN0cmluZ3MgPSBzaXplW1NUUklOR19JRFNdOwotICAgICAgICBiLnNldFBvc2l0aW9uKG9mZltTVFJJTkdfSURTXSk7IC8vIHRoZSBmaXJzdCBzdHJpbmcgb2Zmc2V0IGlzIGhlcmUKLSAgICAgICAgaW50W10gc3RyaW5nRGF0YU9mZnNldHMgPSBuZXcgaW50W25TdHJpbmdzXTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0cmluZ0RhdGFPZmZzZXRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBzdHJpbmdEYXRhT2Zmc2V0c1tpXSA9IGIucmVhZFVJbnQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN0cmluZ1Bvb2wgPSBuZXcgU3RyaW5nW25TdHJpbmdzXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJpbmdEYXRhT2Zmc2V0cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgYi5zZXRQb3NpdGlvbihzdHJpbmdEYXRhT2Zmc2V0c1tpXSk7IC8vIHNldCBidWZmZXIgdG8gb2Zmc2V0Ci0gICAgICAgICAgICAvLyBQb3NpdGlvbgotICAgICAgICAgICAgaW50IGxlbmdodCA9IGIucmVhZFVsZWIxMjgoKTsgLy8gcmVhZCB1bGViMTI4Ci0gICAgICAgICAgICBieXRlW10gdmFsdWVzID0gbmV3IGJ5dGVbbGVuZ2h0XTsKLSAgICAgICAgICAgIGIucmVhZEJ5dGVzKHZhbHVlcyk7Ci0gICAgICAgICAgICBzdHJpbmdQb29sW2ldID0gbmV3IFN0cmluZyh2YWx1ZXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWRUeXBlSWRzKCkgewotICAgICAgICBpbnQgblR5cGVzID0gc2l6ZVtUWVBFX0lEU107Ci0gICAgICAgIGIuc2V0UG9zaXRpb24ob2ZmW1RZUEVfSURTXSk7IC8vIHRoZSBmaXJzdCBlbGVtZW50IGlzIGhlcmUKLSAgICAgICAgdHlwZUlkcyA9IG5ldyBpbnRbblR5cGVzXTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVJZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHR5cGVJZHNbaV0gPSBiLnJlYWRVSW50KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgY2xhc3MgUHJvdElkSXRlbSB7Ci0gICAgICAgIHB1YmxpYyBpbnQgc2hvcnR5X2lkeDsKLSAgICAgICAgcHVibGljIGludCByZXR1cm5fdHlwZV9pZHg7Ci0gICAgICAgIHB1YmxpYyBpbnQgcGFyYW1ldGVyX29mZjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVhZFByb3RvcygpIHsKLSAgICAgICAgaW50IG5Qcm90b3MgPSBzaXplW1BST1RPX0lEU107Ci0gICAgICAgIGIuc2V0UG9zaXRpb24ob2ZmW1BST1RPX0lEU10pOwotICAgICAgICBwcm90b0lkSXRlbXMgPSBuZXcgUHJvdElkSXRlbVtuUHJvdG9zXTsKLQotICAgICAgICBQcm90SWRJdGVtIGl0ZW0gPSBudWxsOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3RvSWRJdGVtcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaXRlbSA9IG5ldyBQcm90SWRJdGVtKCk7Ci0gICAgICAgICAgICBpdGVtLnNob3J0eV9pZHggPSBiLnJlYWRVSW50KCk7Ci0gICAgICAgICAgICBpdGVtLnJldHVybl90eXBlX2lkeCA9IGIucmVhZFVJbnQoKTsKLSAgICAgICAgICAgIGl0ZW0ucGFyYW1ldGVyX29mZiA9IGIucmVhZFVJbnQoKTsKLSAgICAgICAgICAgIHByb3RvSWRJdGVtc1tpXSA9IGl0ZW07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgY2xhc3MgRmllbGRJZEl0ZW0gewotICAgICAgICBwdWJsaWMgaW50IGNsYXNzX2lkeDsgLy8gZGVmaW5pbmcgY2xhc3MgOiBpbmRleCBvZiB0eXBlX2lkcwotICAgICAgICBwdWJsaWMgaW50IHR5cGVfaWR4OyAvLyB0eXBlIG9mIGZpZWxkIDogaW5kZXggb2YgdHlwZV9pZHMKLSAgICAgICAgcHVibGljIGludCBuYW1lX2lkeDsgLy8gbmFtZSBvZiBmaWVsZCA6IGluZGV4IGludG8gc3RyaW5nIGlkIChvcgotICAgICAgICAvLyBkaXJlY3RseSBzdHJpbmdwb29sKQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZWFkRmllbGRzKCkgewotICAgICAgICBpbnQgbkZpZWxkcyA9IHNpemVbRklFTERfSURTXTsKLSAgICAgICAgYi5zZXRQb3NpdGlvbihvZmZbRklFTERfSURTXSk7Ci0gICAgICAgIGZpZWxkSWRJdGVtcyA9IG5ldyBGaWVsZElkSXRlbVtuRmllbGRzXTsKLQotICAgICAgICBGaWVsZElkSXRlbSBpdGVtID0gbnVsbDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZElkSXRlbXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGl0ZW0gPSBuZXcgRmllbGRJZEl0ZW0oKTsKLSAgICAgICAgICAgIGl0ZW0uY2xhc3NfaWR4ID0gYi5yZWFkVVNob3J0KCk7Ci0gICAgICAgICAgICBpdGVtLnR5cGVfaWR4ID0gYi5yZWFkVVNob3J0KCk7Ci0gICAgICAgICAgICBpdGVtLm5hbWVfaWR4ID0gYi5yZWFkVUludCgpOwotICAgICAgICAgICAgZmllbGRJZEl0ZW1zW2ldID0gaXRlbTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBjbGFzcyBNZXRob2RzSWRJdGVtIHsKLSAgICAgICAgcHVibGljIGludCBjbGFzc19pZHg7IC8vIGRlZmluaW5nIGNsYXNzIDogaW5kZXggb2YgdHlwZUlkcwotICAgICAgICBwdWJsaWMgaW50IHByb3RvX2lkeDsgLy8gcHJvdG8gb2YgbWV0aG9kIDogaW5kZXggb2YgcHJvdG9JZEl0ZW1zCi0gICAgICAgIHB1YmxpYyBpbnQgbmFtZV9pZHg7IC8vIG5hbWUgb2YgbWV0aG9kIDogaW5kZXggaW50byBzdHJpbmcgaWQgKG9yCi0gICAgICAgIC8vIGRpcmVjdGx5IHN0cmluZ3Bvb2wpCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWRNZXRob2RzKCkgewotICAgICAgICBpbnQgbk1ldGhvZHMgPSBzaXplW01FVEhPRF9JRFNdOwotICAgICAgICBiLnNldFBvc2l0aW9uKG9mZltNRVRIT0RfSURTXSk7Ci0gICAgICAgIG1ldGhvZElkSXRlbXMgPSBuZXcgTWV0aG9kc0lkSXRlbVtuTWV0aG9kc107Ci0KLSAgICAgICAgTWV0aG9kc0lkSXRlbSBpdGVtID0gbnVsbDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RJZEl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpdGVtID0gbmV3IE1ldGhvZHNJZEl0ZW0oKTsKLSAgICAgICAgICAgIGl0ZW0uY2xhc3NfaWR4ID0gYi5yZWFkVVNob3J0KCk7Ci0gICAgICAgICAgICBpdGVtLnByb3RvX2lkeCA9IGIucmVhZFVTaG9ydCgpOwotICAgICAgICAgICAgaXRlbS5uYW1lX2lkeCA9IGIucmVhZFVJbnQoKTsKLSAgICAgICAgICAgIG1ldGhvZElkSXRlbXNbaV0gPSBpdGVtOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBDbGFzc0RlZkl0ZW0gewotICAgICAgICBwdWJsaWMgaW50IGNsYXNzX2lkeDsKLSAgICAgICAgcHVibGljIGludCBhY2Nlc3NfZmxhZ3M7Ci0gICAgICAgIHB1YmxpYyBpbnQgc3VwZXJjbGFzc19pZHg7Ci0gICAgICAgIHB1YmxpYyBpbnQgaW50ZXJmYWNlc19vZmY7Ci0gICAgICAgIHB1YmxpYyBpbnQgc291cmNlX2ZpbGVfaWR4OwotICAgICAgICBwdWJsaWMgaW50IGFubm90YXRpb25zX29mZjsKLSAgICAgICAgcHVibGljIGludCBjbGFzc19kYXRhX29mZjsKLSAgICAgICAgcHVibGljIGludCBzdGF0aWNfdmFsdWVzX29mZjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVhZENsYXNzZXMoKSB7Ci0gICAgICAgIGludCBuQ2xhc3NEZWZzID0gc2l6ZVtDTEFTU19ERUZTXTsKLSAgICAgICAgYi5zZXRQb3NpdGlvbihvZmZbQ0xBU1NfREVGU10pOwotICAgICAgICBjbGFzc0RlZkl0ZW1zID0gbmV3IENsYXNzRGVmSXRlbVtuQ2xhc3NEZWZzXTsKLQotICAgICAgICBDbGFzc0RlZkl0ZW0gaXRlbSA9IG51bGw7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NEZWZJdGVtcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaXRlbSA9IG5ldyBDbGFzc0RlZkl0ZW0oKTsKLSAgICAgICAgICAgIGl0ZW0uY2xhc3NfaWR4ID0gYi5yZWFkVUludCgpOwotICAgICAgICAgICAgaXRlbS5hY2Nlc3NfZmxhZ3MgPSBiLnJlYWRVSW50KCk7Ci0gICAgICAgICAgICBpdGVtLnN1cGVyY2xhc3NfaWR4ID0gYi5yZWFkVUludCgpOwotICAgICAgICAgICAgaXRlbS5pbnRlcmZhY2VzX29mZiA9IGIucmVhZFVJbnQoKTsKLSAgICAgICAgICAgIGl0ZW0uc291cmNlX2ZpbGVfaWR4ID0gYi5yZWFkVUludCgpOwotICAgICAgICAgICAgaXRlbS5hbm5vdGF0aW9uc19vZmYgPSBiLnJlYWRVSW50KCk7Ci0gICAgICAgICAgICBpdGVtLmNsYXNzX2RhdGFfb2ZmID0gYi5yZWFkVUludCgpOwotICAgICAgICAgICAgaXRlbS5zdGF0aWNfdmFsdWVzX29mZiA9IGIucmVhZFVJbnQoKTsKLSAgICAgICAgICAgIGNsYXNzRGVmSXRlbXNbaV0gPSBpdGVtOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGV4LXRvb2xzL3NyYy9kZXgvcmVhZGVyL0RleE1ldGhvZEltcGwuamF2YSBiL3Rvb2xzL2RleC10b29scy9zcmMvZGV4L3JlYWRlci9EZXhNZXRob2RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYTE5ZTUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGV4LXRvb2xzL3NyYy9kZXgvcmVhZGVyL0RleE1ldGhvZEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBkZXgucmVhZGVyOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgZGV4LnJlYWRlci5EZXhDbGFzc0ltcGwuTWV0aG9kQW5ub3RhdGlvbjsKLWltcG9ydCBkZXgucmVhZGVyLkRleENsYXNzSW1wbC5QYXJhbWV0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IGRleC5yZWFkZXIuRGV4RmlsZVJlYWRlci5GaWVsZElkSXRlbTsKLWltcG9ydCBkZXgucmVhZGVyLkRleEZpbGVSZWFkZXIuTWV0aG9kc0lkSXRlbTsKLWltcG9ydCBkZXgucmVhZGVyLkRleEZpbGVSZWFkZXIuUHJvdElkSXRlbTsKLWltcG9ydCBkZXguc3RydWN0dXJlLkRleEFubm90YXRpb247Ci1pbXBvcnQgZGV4LnN0cnVjdHVyZS5EZXhDbGFzczsKLWltcG9ydCBkZXguc3RydWN0dXJlLkRleE1ldGhvZDsKLWltcG9ydCBkZXguc3RydWN0dXJlLkRleFBhcmFtZXRlcjsKLQotLyogcGFja2FnZSAqL2ZpbmFsIGNsYXNzIERleE1ldGhvZEltcGwgaW1wbGVtZW50cyBEZXhNZXRob2QgewotCi0gICAgcHJpdmF0ZSBEZXhCdWZmZXIgYnVmZmVyOwotICAgIHByaXZhdGUgTWV0aG9kc0lkSXRlbSBtZXRob2RzSWRJdGVtOwotICAgIHByaXZhdGUgU3RyaW5nW10gc3RyaW5nUG9vbDsKLSAgICBwcml2YXRlIGludFtdIHR5cGVJZHM7Ci0gICAgcHJpdmF0ZSBQcm90SWRJdGVtIHByb3RvSWRJdGVtOwotICAgIHByaXZhdGUgTGlzdDxEZXhQYXJhbWV0ZXI+IHBhcmFtZXRlcnM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgYWNjZXNzRmxhZ3M7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNZXRob2RBbm5vdGF0aW9uIG1ldGhvZEFubm90YXRpb247Ci0gICAgcHJpdmF0ZSBTZXQ8RGV4QW5ub3RhdGlvbj4gYW5ub3RhdGlvbnM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBUeXBlRm9ybWF0dGVyIGZvcm1hdHRlciA9IG5ldyBUeXBlRm9ybWF0dGVyKCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBEZXhDbGFzcyBkZWNsYXJpbmdDbGFzczsKLSAgICBwcml2YXRlIGZpbmFsIFBhcmFtZXRlckFubm90YXRpb24gcGFyYW1ldGVyQW5ub3RhdGlvbjsKLSAgICBwcml2YXRlIE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiBwYXJhbWV0ZXJJZFRvSW5kZXg7Ci0gICAgcHJpdmF0ZSBmaW5hbCBGaWVsZElkSXRlbVtdIGZpZWxkSWRJdGVtczsKLQotICAgIHB1YmxpYyBEZXhNZXRob2RJbXBsKERleEJ1ZmZlciBidWZmZXIsIERleENsYXNzIGRlY2xhcmluZ0NsYXNzLAotICAgICAgICAgICAgTWV0aG9kc0lkSXRlbSBtZXRob2RzSWRJdGVtLCBQcm90SWRJdGVtIHByb3RvSWRJdGVtLAotICAgICAgICAgICAgaW50IGFjY2Vzc0ZsYWdzLCBNZXRob2RBbm5vdGF0aW9uIG1ldGhvZEFubm90YXRpb24sCi0gICAgICAgICAgICBQYXJhbWV0ZXJBbm5vdGF0aW9uIHBhcmFtZXRlckFubm90YXRpb24sIFN0cmluZ1tdIHN0cmluZ1Bvb2wsCi0gICAgICAgICAgICBpbnRbXSB0eXBlSWRzLCBGaWVsZElkSXRlbVtdIGZpZWxkSWRJdGVtcykgewotICAgICAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjsKLSAgICAgICAgdGhpcy5kZWNsYXJpbmdDbGFzcyA9IGRlY2xhcmluZ0NsYXNzOwotICAgICAgICB0aGlzLm1ldGhvZHNJZEl0ZW0gPSBtZXRob2RzSWRJdGVtOwotICAgICAgICB0aGlzLnByb3RvSWRJdGVtID0gcHJvdG9JZEl0ZW07Ci0gICAgICAgIHRoaXMuYWNjZXNzRmxhZ3MgPSBhY2Nlc3NGbGFnczsKLSAgICAgICAgdGhpcy5tZXRob2RBbm5vdGF0aW9uID0gbWV0aG9kQW5ub3RhdGlvbjsKLSAgICAgICAgdGhpcy5wYXJhbWV0ZXJBbm5vdGF0aW9uID0gcGFyYW1ldGVyQW5ub3RhdGlvbjsKLSAgICAgICAgdGhpcy5zdHJpbmdQb29sID0gc3RyaW5nUG9vbDsKLSAgICAgICAgdGhpcy50eXBlSWRzID0gdHlwZUlkczsKLSAgICAgICAgdGhpcy5maWVsZElkSXRlbXMgPSBmaWVsZElkSXRlbXM7Ci0gICAgICAgIHBhcnNlQW5ub3RhdGlvbnMoKTsKLSAgICAgICAgcGFyc2VQYXJhbWV0ZXJBbm5vdGF0aW9ucygpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwYXJzZVBhcmFtZXRlckFubm90YXRpb25zKCkgewotICAgICAgICBwYXJhbWV0ZXJJZFRvSW5kZXggPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPigpOwotICAgICAgICBpZiAocGFyYW1ldGVyQW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBidWZmZXIuc2V0UG9zaXRpb24ocGFyYW1ldGVyQW5ub3RhdGlvbi5hbm5vdGF0aW9uc09mZik7Ci0gICAgICAgICAgICBpbnQgbnVtYmVyT2ZQYXJhbWV0ZXJzID0gYnVmZmVyLnJlYWRVSW50KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bWJlck9mUGFyYW1ldGVyczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVySWRUb0luZGV4LnB1dChpLCBidWZmZXIucmVhZFVJbnQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcGFyc2VBbm5vdGF0aW9ucygpIHsKLSAgICAgICAgYW5ub3RhdGlvbnMgPSBuZXcgSGFzaFNldDxEZXhBbm5vdGF0aW9uPigpOwotICAgICAgICBpZiAobWV0aG9kQW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBidWZmZXIuc2V0UG9zaXRpb24obWV0aG9kQW5ub3RhdGlvbi5hbm5vdGF0aW9uc09mZik7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IGJ1ZmZlci5yZWFkVUludCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucy5hZGQobmV3IERleEFubm90YXRpb25JbXBsKGJ1ZmZlci5jcmVhdGVDb3B5KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIucmVhZFVJbnQoKSwgdHlwZUlkcywgc3RyaW5nUG9vbCwgZmllbGRJZEl0ZW1zKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBzdHJpbmdQb29sW21ldGhvZHNJZEl0ZW0ubmFtZV9pZHhdOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmV0dXJuVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIHN0cmluZ1Bvb2xbdHlwZUlkc1twcm90b0lkSXRlbS5yZXR1cm5fdHlwZV9pZHhdXTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIExpc3Q8RGV4UGFyYW1ldGVyPiBnZXRQYXJhbWV0ZXJzKCkgewotICAgICAgICBpZiAocGFyYW1ldGVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBwYXJhbWV0ZXJzID0gbmV3IExpbmtlZExpc3Q8RGV4UGFyYW1ldGVyPigpOwotICAgICAgICAgICAgaWYgKHByb3RvSWRJdGVtLnBhcmFtZXRlcl9vZmYgIT0gMCkgewotCi0gICAgICAgICAgICAgICAgYnVmZmVyLnNldFBvc2l0aW9uKHByb3RvSWRJdGVtLnBhcmFtZXRlcl9vZmYpOwotICAgICAgICAgICAgICAgIGludCBzaXplID0gYnVmZmVyLnJlYWRVSW50KCk7Ci0KLSAgICAgICAgICAgICAgICBpbnRbXSBwYXJhbVR5cGVJZHggPSBuZXcgaW50W3NpemVdOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtVHlwZUlkeFtpXSA9IGJ1ZmZlci5yZWFkVVNob3J0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1UeXBlSWR4Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMuYWRkKG5ldyBEZXhQYXJhbWV0ZXJJbXBsKGJ1ZmZlci5jcmVhdGVDb3B5KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nUG9vbFt0eXBlSWRzW3BhcmFtVHlwZUlkeFtpXV1dLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcklkVG9JbmRleC5nZXQoaSksIHR5cGVJZHMsIHN0cmluZ1Bvb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJZEl0ZW1zKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwYXJhbWV0ZXJzOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0TW9kaWZpZXJzKCkgewotICAgICAgICByZXR1cm4gYWNjZXNzRmxhZ3M7Ci0gICAgfQotCi0gICAgcHVibGljIFNldDxEZXhBbm5vdGF0aW9uPiBnZXRBbm5vdGF0aW9ucygpIHsKLSAgICAgICAgcmV0dXJuIGFubm90YXRpb25zOwotICAgIH0KLQotICAgIHB1YmxpYyBEZXhDbGFzcyBnZXREZWNsYXJpbmdDbGFzcygpIHsKLSAgICAgICAgcmV0dXJuIGRlY2xhcmluZ0NsYXNzOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKGZvcm1hdHRlci5mb3JtYXRBbm5vdGF0aW9ucyhnZXRBbm5vdGF0aW9ucygpKSk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKE1vZGlmaWVyLnRvU3RyaW5nKGdldE1vZGlmaWVycygpKSk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIgIik7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKGZvcm1hdHRlci5mb3JtYXQoZ2V0UmV0dXJuVHlwZSgpKSk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIgIik7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKGdldE5hbWUoKSk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIoIik7Ci0gICAgICAgIExpc3Q8RGV4UGFyYW1ldGVyPiBwYXJhbWV0ZXJzID0gZ2V0UGFyYW1ldGVycygpOwotICAgICAgICBmb3IgKERleFBhcmFtZXRlciBkZXhQYXJhbWV0ZXIgOiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChmb3JtYXR0ZXIuZm9ybWF0QW5ub3RhdGlvbnMoZGV4UGFyYW1ldGVyCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9ucygpKSk7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChmb3JtYXR0ZXIuZm9ybWF0KGRleFBhcmFtZXRlci5nZXRUeXBlTmFtZSgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnVpbGRlci5hcHBlbmQoIikiKTsKLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9kZXgtdG9vbHMvc3JjL2RleC9yZWFkZXIvRGV4UGFyYW1ldGVySW1wbC5qYXZhIGIvdG9vbHMvZGV4LXRvb2xzL3NyYy9kZXgvcmVhZGVyL0RleFBhcmFtZXRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMyZGIwNS4uMDAwMDAwMAotLS0gYS90b29scy9kZXgtdG9vbHMvc3JjL2RleC9yZWFkZXIvRGV4UGFyYW1ldGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgZGV4LnJlYWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBkZXgucmVhZGVyLkRleEZpbGVSZWFkZXIuRmllbGRJZEl0ZW07Ci1pbXBvcnQgZGV4LnN0cnVjdHVyZS5EZXhBbm5vdGF0aW9uOwotaW1wb3J0IGRleC5zdHJ1Y3R1cmUuRGV4UGFyYW1ldGVyOwotCi1wdWJsaWMgY2xhc3MgRGV4UGFyYW1ldGVySW1wbCBpbXBsZW1lbnRzIERleFBhcmFtZXRlciB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyB0eXBlTmFtZTsKLSAgICBwcml2YXRlIGZpbmFsIEludGVnZXIgYW5ub3RhdGlvbk9mZnNldDsKLSAgICBwcml2YXRlIFNldDxEZXhBbm5vdGF0aW9uPiBhbm5vdGF0aW9uczsKLSAgICBwcml2YXRlIGZpbmFsIERleEJ1ZmZlciBidWZmZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnRbXSB0eXBlSWRzOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nW10gc3RyaW5nUG9vbDsKLSAgICBwcml2YXRlIGZpbmFsIEZpZWxkSWRJdGVtW10gZmllbGRJZEl0ZW1zOwotCi0gICAgcHVibGljIERleFBhcmFtZXRlckltcGwoRGV4QnVmZmVyIGJ1ZmZlciwgU3RyaW5nIHR5cGVOYW1lLAotICAgICAgICAgICAgSW50ZWdlciBhbm5vdGF0aW9uT2Zmc2V0LCBpbnRbXSB0eXBlSWRzLCBTdHJpbmdbXSBzdHJpbmdQb29sLAotICAgICAgICAgICAgRmllbGRJZEl0ZW1bXSBmaWVsZElkSXRlbXMpIHsKLSAgICAgICAgdGhpcy5idWZmZXIgPSBidWZmZXI7Ci0gICAgICAgIHRoaXMudHlwZU5hbWUgPSB0eXBlTmFtZTsKLSAgICAgICAgdGhpcy5hbm5vdGF0aW9uT2Zmc2V0ID0gYW5ub3RhdGlvbk9mZnNldDsKLSAgICAgICAgdGhpcy50eXBlSWRzID0gdHlwZUlkczsKLSAgICAgICAgdGhpcy5zdHJpbmdQb29sID0gc3RyaW5nUG9vbDsKLSAgICAgICAgdGhpcy5maWVsZElkSXRlbXMgPSBmaWVsZElkSXRlbXM7Ci0gICAgICAgIHBhcnNlQW5ub3RhdGlvbnMoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcGFyc2VBbm5vdGF0aW9ucygpIHsKLSAgICAgICAgYW5ub3RhdGlvbnMgPSBuZXcgSGFzaFNldDxEZXhBbm5vdGF0aW9uPigpOwotICAgICAgICBpZiAoYW5ub3RhdGlvbk9mZnNldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBidWZmZXIuc2V0UG9zaXRpb24oYW5ub3RhdGlvbk9mZnNldCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IGJ1ZmZlci5yZWFkVUludCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucy5hZGQobmV3IERleEFubm90YXRpb25JbXBsKGJ1ZmZlci5jcmVhdGVDb3B5KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIucmVhZFVJbnQoKSwgdHlwZUlkcywgc3RyaW5nUG9vbCwgZmllbGRJZEl0ZW1zKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotICAgICAgICByZXR1cm4gdHlwZU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFNldDxEZXhBbm5vdGF0aW9uPiBnZXRBbm5vdGF0aW9ucygpIHsKLSAgICAgICAgcmV0dXJuIGFubm90YXRpb25zOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBnZXRUeXBlTmFtZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RleC10b29scy9zcmMvZGV4L3JlYWRlci9UeXBlRm9ybWF0dGVyLmphdmEgYi90b29scy9kZXgtdG9vbHMvc3JjL2RleC9yZWFkZXIvVHlwZUZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTRiMzBmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RleC10b29scy9zcmMvZGV4L3JlYWRlci9UeXBlRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgZGV4LnJlYWRlcjsKLQotaW1wb3J0IGRleC5zdHJ1Y3R1cmUuRGV4QW5ub3RhdGlvbjsKLWltcG9ydCBkZXguc3RydWN0dXJlLkRleENsYXNzOwotaW1wb3J0IGRleC5zdHJ1Y3R1cmUuRGV4RmllbGQ7Ci1pbXBvcnQgZGV4LnN0cnVjdHVyZS5EZXhGaWxlOwotaW1wb3J0IGRleC5zdHJ1Y3R1cmUuRGV4TWV0aG9kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIDxwcmU+Ci0gKiBUeXBlRGVzY3JpcHRvciA6PSAnVicgfCBGaWVsZFR5cGVEZXNjcmlwdG9yCi0gKiBGaWVsZFR5cGVEZXNjcmlwdG9yIDo9IE5vbkFycmF5RmllbGRUeXBlRGVzY3JpcHRvciB8ICgnWycgKiAxLi4uMjU1KSBOb25BcnJheUZpZWxkVHlwZURlc2NyaXB0b3IKLSAqIE5vbkFycmF5RmllbGRUeXBlRGVzY3JpcHRvciA6PSAnWicgfCAnQicgfCAnUycgfCAnQycgfCAnSScgfCAnSicgfCAnRicgfCAnRCcgfCAnTCcgRnVsbENsYXNzTmFtZSAnOycKLSAqIDwvcHJlPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVHlwZUZvcm1hdHRlciB7Ci0KLSAgICAvKioKLSAgICAgKiBWIHZvaWQ7IG9ubHkgdmFsaWQgZm9yIHJldHVybiB0eXBlcyBaIGJvb2xlYW4gQiBieXRlIFMgc2hvcnQgQyBjaGFyIEkgaW50Ci0gICAgICogSiBsb25nIEYgZmxvYXQgRCBkb3VibGUgTGZ1bGx5L3F1YWxpZmllZC9OYW1lOyB0aGUgY2xhc3MKLSAgICAgKiBmdWxseS5xdWFsaWZpZWQuTmFtZSBbZGVzY3JpcHRvciBhcnJheSBvZiBkZXNjcmlwdG9yLCB1c2FibGUgcmVjdXJzaXZlbHkKLSAgICAgKiBmb3IgYXJyYXlzLW9mLWFycmF5cywgdGhvdWdoIGl0IGlzIGludmFsaWQgdG8gaGF2ZSBtb3JlIHRoYW4gMjU1Ci0gICAgICogZGltZW5zaW9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGZvcm1hdChTdHJpbmcgdHlwZU5hbWUpIHsKLSAgICAgICAgaWYgKHR5cGVOYW1lLmxlbmd0aCgpID09IDEpIHsKLSAgICAgICAgICAgIHN3aXRjaCAodHlwZU5hbWUuY2hhckF0KDApKSB7Ci0gICAgICAgICAgICBjYXNlICdWJzoKLSAgICAgICAgICAgICAgICByZXR1cm4gInZvaWQiOwotICAgICAgICAgICAgY2FzZSAnWic6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJib29sZWFuIjsKLSAgICAgICAgICAgIGNhc2UgJ0InOgotICAgICAgICAgICAgICAgIHJldHVybiAiYnl0ZSI7Ci0gICAgICAgICAgICBjYXNlICdTJzoKLSAgICAgICAgICAgICAgICByZXR1cm4gInNob3J0IjsKLSAgICAgICAgICAgIGNhc2UgJ0MnOgotICAgICAgICAgICAgICAgIHJldHVybiAiY2hhciI7Ci0gICAgICAgICAgICBjYXNlICdJJzoKLSAgICAgICAgICAgICAgICByZXR1cm4gImludCI7Ci0gICAgICAgICAgICBjYXNlICdKJzoKLSAgICAgICAgICAgICAgICByZXR1cm4gImxvbmciOwotICAgICAgICAgICAgY2FzZSAnRic6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJmbG9hdCI7Ci0gICAgICAgICAgICBjYXNlICdEJzoKLSAgICAgICAgICAgICAgICByZXR1cm4gImRvdWJsZSI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAodHlwZU5hbWUuc3RhcnRzV2l0aCgiTCIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVOYW1lLnN1YnN0cmluZygxLCB0eXBlTmFtZS5sZW5ndGgoKSAtIDEpLnJlcGxhY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAiLyIsICIuIik7IC8vIHJlbW92ZSAnTCcgYW5kICc7JywgcmVwbGFjZSAnLycgd2l0aCAnLicKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZU5hbWUuc3RhcnRzV2l0aCgiWyIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZvcm1hdCh0eXBlTmFtZS5zdWJzdHJpbmcoMSkpICsgIltdIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlN0cmFuZ2UgdHlwZSBpbiBmb3JtYXR0ZXI6ICIgKyB0eXBlTmFtZSk7Ci0gICAgICAgIHJldHVybiB0eXBlTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGZvcm1hdChMaXN0PFN0cmluZz4gdHlwZU5hbWVzKSB7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPih0eXBlTmFtZXMuc2l6ZSgpKTsKLSAgICAgICAgZm9yIChTdHJpbmcgdHlwZSA6IHR5cGVOYW1lcykgewotICAgICAgICAgICAgdHlwZXMuYWRkKGZvcm1hdCh0eXBlKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZvcm1hdCh0eXBlcywgIiwgIik7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBmb3JtYXRBbm5vdGF0aW9ucyhTZXQ8RGV4QW5ub3RhdGlvbj4gYW5ub3RhdGlvbnMpIHsKLSAgICAgICAgcmV0dXJuIGZvcm1hdChuZXcgQXJyYXlMaXN0PERleEFubm90YXRpb24+KGFubm90YXRpb25zKSwgIlxuIikgKyAiXG4iOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGZvcm1hdChMaXN0PD8+IGVsZW1lbnRzLCBTdHJpbmcgc2VwYXJhdG9yKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOwotICAgICAgICBmb3IgKE9iamVjdCBlbGVtZW50IDogZWxlbWVudHMpIHsKLSAgICAgICAgICAgIGlmICghZmlyc3QpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChzZXBhcmF0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoZWxlbWVudC50b1N0cmluZygpKTsKLSAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBTdHJpbmcgZm9ybWF0RGV4RmlsZShEZXhGaWxlIGZpbGUpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQoIi0tLS0tLS0tLS0tLS0tLS1ERVhfRklMRS0tLS0tLS0tLS0tLS0tXG5cbiIpOwotICAgICAgICBidWlsZGVyLmFwcGVuZCgiRmlsZW5hbWU6ICIpLmFwcGVuZChmaWxlLmdldE5hbWUoKSk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJcbi0tLS0tLS0tLS0tREVGSU5FRF9DTEFTU0VTLS0tLS0tLS0tLS0tXG5cbiIpOwotICAgICAgICBmb3IgKERleENsYXNzIGRleENsYXNzIDogZmlsZS5nZXREZWZpbmVkQ2xhc3NlcygpKSB7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiXG5fX19fX19fX19fX19fX19fQ0xBU1NfX19fX19fX19fX19fX19fXG5cbiIpOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoZGV4Q2xhc3MpOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIlxuXG4tLS0tLS0tLS0tLS0tLS0tRklFTERTLS0tLS0tLS0tLS0tLS0tLVxuIik7Ci0gICAgICAgICAgICBmb3IgKERleEZpZWxkIGZpZWxkIDogZGV4Q2xhc3MuZ2V0RmllbGRzKCkpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChmaWVsZCkuYXBwZW5kKCJcbiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIi0tLS0tLS0tLS0tLS0tLS1NRVRIT0RTLS0tLS0tLS0tLS0tLS0tLVxuIik7Ci0gICAgICAgICAgICBmb3IgKERleE1ldGhvZCBtZXRob2QgOiBkZXhDbGFzcy5nZXRNZXRob2RzKCkpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChtZXRob2QpLmFwcGVuZCgiXG4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RleC10b29scy9zcmMvZGV4L3N0cnVjdHVyZS9EZXhBbm5vdGF0ZWRFbGVtZW50LmphdmEgYi90b29scy9kZXgtdG9vbHMvc3JjL2RleC9zdHJ1Y3R1cmUvRGV4QW5ub3RhdGVkRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjY5Y2E4Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RleC10b29scy9zcmMvZGV4L3N0cnVjdHVyZS9EZXhBbm5vdGF0ZWRFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBkZXguc3RydWN0dXJlOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiB7QGNvZGUgRGV4QW5ub3RhdGVkRWxlbWVudH0gaXMgaW1wbGVtZW50ZWQgYnkgYWxsIEVsZW1lbnRzIHRoYXQgY291bGQgaGF2ZQotICogYXR0YWNoZWQgYW5ub3RhdGlvbnMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGV4QW5ub3RhdGVkRWxlbWVudCB7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiB7QGNvZGUgRGV4QW5ub3RhdGlvbn0gZWxlbWVudHMuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIGxpc3Qgb2Yge0Bjb2RlIERleEFubm90YXRpb259IGVsZW1lbnRzCi0gICAgICovCi0gICAgU2V0PERleEFubm90YXRpb24+IGdldEFubm90YXRpb25zKCk7Ci19CmRpZmYgLS1naXQgYS90b29scy9kZXgtdG9vbHMvc3JjL2RleC9zdHJ1Y3R1cmUvRGV4QW5ub3RhdGlvbi5qYXZhIGIvdG9vbHMvZGV4LXRvb2xzL3NyYy9kZXgvc3RydWN0dXJlL0RleEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNkMzcyZC4uMDAwMDAwMAotLS0gYS90b29scy9kZXgtdG9vbHMvc3JjL2RleC9zdHJ1Y3R1cmUvRGV4QW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgZGV4LnN0cnVjdHVyZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIHtAY29kZSBEZXhBbm5vdGF0aW9ufSByZXByZXNlbnRzIGFuIGFubm90YXRpb24uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGV4QW5ub3RhdGlvbiB7Ci0KLSAgICAvKioKLSAgICAgKiB7QGNvZGUgVmlzaWJpbGl0eX0gaW5kaWNhdGVzIHRoZSByZXRlbnRpb24gb2YgYSB7QGNvZGUgRGV4QW5ub3RhdGlvbn0uCi0gICAgICovCi0gICAgZW51bSBWaXNpYmlsaXR5IHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEludGVuZGVkIG9ubHkgdG8gYmUgdmlzaWJsZSBhdCBidWlsZCB0aW1lIChlLmcuLCBkdXJpbmcgY29tcGlsYXRpb24KLSAgICAgICAgICogb2Ygb3RoZXIgY29kZSkuCi0gICAgICAgICAqLwotICAgICAgICBWSVNJQklMSVRZX0JVSUxEKChieXRlKSAweDAwKSwKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEludGVuZGVkIHRvIGJlIHZpc2libGUgYXQgcnVudGltZS4gRklYTUUgbWlzc2luZyB3b3JkcyBpbiBzcGVjCi0gICAgICAgICAqLwotICAgICAgICBWSVNJQklMSVRZX1JVTlRJTUUoKGJ5dGUpIDBYMDEpLAotICAgICAgICAvKioKLSAgICAgICAgICogSW50ZW5kZWQgdG8gYmUgdmlzaWJsZSBhdCBydW50aW1lLCBidXQgb25seSB0byB0aGUgdW5kZXJseWluZyBzeXN0ZW0KLSAgICAgICAgICogKGFuZCBub3QgdG8gcmVndWxhciB1c2VyIGNvZGUpLiBGSVhNRSBtaXNzaW5nIHdvcmRzIGluIHNwZWMKLSAgICAgICAgICovCi0gICAgICAgIFZJU0lCSUxJVFlfU1lTVEVNKChieXRlKSAweDAyKTsKLQotICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLSAgICAgICAgcHJpdmF0ZSBieXRlIHZhbHVlOwotCi0gICAgICAgIHByaXZhdGUgVmlzaWJpbGl0eShieXRlIHZhbHVlKSB7Ci0gICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0aGUge0Bjb2RlIFZpc2liaWxpdHl9IGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIHtAY29kZSBieXRlfS4KLSAgICAgICAgICogcHJlOiAwIDw9IHtAY29kZSB2YWx1ZX0gPD0yCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgICAgICogICAgICAgICAgICB0aGUge0Bjb2RlIGJ5dGV9IHZhbHVlIHdoaWNoIGlkZW50aWZpZXMgYSB7QGNvZGUKLSAgICAgICAgICogICAgICAgICAgICBWaXNpYmlsaXR5fQotICAgICAgICAgKiBAcmV0dXJuIHRoZSB7QGNvZGUgVmlzaWJpbGl0eX0gZm9yIHRoZSBnaXZlbiB7QGNvZGUgYnl0ZX0KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgVmlzaWJpbGl0eSBnZXQoYnl0ZSB2YWx1ZSkgewotICAgICAgICAgICAgLy8gRklYTUUgbG9vcCBhbmQgY29tcGFyZSBpbnN0ZWFkIG9mIHN3aXRjaD8KLSAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHsKLSAgICAgICAgICAgIGNhc2UgMHgwMDoKLSAgICAgICAgICAgICAgICByZXR1cm4gVklTSUJJTElUWV9CVUlMRDsKLSAgICAgICAgICAgIGNhc2UgMHgwMToKLSAgICAgICAgICAgICAgICByZXR1cm4gVklTSUJJTElUWV9SVU5USU1FOwotICAgICAgICAgICAgY2FzZSAweDAyOgotICAgICAgICAgICAgICAgIHJldHVybiBWSVNJQklMSVRZX1NZU1RFTTsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVmlzaWJpbGl0eSBkb2Vzbid0IGV4aXN0ISIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUge0Bjb2RlIFZpc2liaWxpdHl9IG9mIHRoaXMge0Bjb2RlIERleEFubm90YXRpb259LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHtAY29kZSBWaXNpYmlsaXR5fSBvZiB0aGlzIHtAY29kZSBEZXhBbm5vdGF0aW9ufQotICAgICAqLwotICAgIFZpc2liaWxpdHkgZ2V0VmlzaWJpbGl0eSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYXR0cmlidXRlcyBvZiB0aGlzIHtAY29kZSBEZXhBbm5vdGF0aW9ufS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBhdHRyaWJ1dGVzIG9mIHRoaXMge0Bjb2RlIERleEFubm90YXRpb259Ci0gICAgICovCi0gICAgTGlzdDxEZXhBbm5vdGF0aW9uQXR0cmlidXRlPiBnZXRBdHRyaWJ1dGVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjbGFzcyBuYW1lIG9mIHRoaXMge0Bjb2RlIERleEFubm90YXRpb259LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNsYXNzIG5hbWUgb2YgdGhpcyB7QGNvZGUgRGV4QW5ub3RhdGlvbn0KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0VHlwZU5hbWUoKTsKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RleC10b29scy9zcmMvZGV4L3N0cnVjdHVyZS9EZXhBbm5vdGF0aW9uQXR0cmlidXRlLmphdmEgYi90b29scy9kZXgtdG9vbHMvc3JjL2RleC9zdHJ1Y3R1cmUvRGV4QW5ub3RhdGlvbkF0dHJpYnV0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDUxYzA4Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RleC10b29scy9zcmMvZGV4L3N0cnVjdHVyZS9EZXhBbm5vdGF0aW9uQXR0cmlidXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBkZXguc3RydWN0dXJlOwotCi0vKioKLSAqIHtAY29kZSBEZXhBbm5vdGF0aW9uVmFsdWV9IGlzIGltcGxlbWVudGVkIGJ5IGFubm90YXRpb24gdmFsdWVzLiBJbiB0aGUKLSAqIGZvbGxvd2luZyBleGFtcGxlOgotICogCi0gKiA8cHJlPgotICogJiMwNjQ7VGV4dCh2YWx1ZT0mcXVvdDtoZWxsbyZxdW90OykKLSAqIDwvcHJlPgotICogCi0gKiAndmFsdWU9ImhlbGxvIicgaXMgcmVwcmVzZW50ZWQgYnkgYSB7QGNvZGUgRGV4QW5ub3RhdGlvblZhbHVlfS4gInZhbHVlIiBpcwotICogaXRzIG5hbWUgYW5kICJoZWxsbyIgaXMgaXRzIGVuY29kZWQgdmFsdWUuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGV4QW5ub3RhdGlvbkF0dHJpYnV0ZSBleHRlbmRzIE5hbWVkRWxlbWVudCB7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZW5jb2RlZCB2YWx1ZSBvZiB0aGlzIHtAY29kZSBEZXhBbm5vdGF0aW9uVmFsdWV9LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGVuY29kZWQgdmFsdWUgb2YgdGhpcyB7QGNvZGUgRGV4QW5ub3RhdGlvblZhbHVlfQotICAgICAqLwotICAgIHB1YmxpYyBEZXhFbmNvZGVkVmFsdWUgZ2V0RW5jb2RlZFZhbHVlKCk7Ci0KLSAgICBwdWJsaWMgRGV4QW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCk7Ci19CmRpZmYgLS1naXQgYS90b29scy9kZXgtdG9vbHMvc3JjL2RleC9zdHJ1Y3R1cmUvRGV4Q2xhc3MuamF2YSBiL3Rvb2xzL2RleC10b29scy9zcmMvZGV4L3N0cnVjdHVyZS9EZXhDbGFzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOThmNGVlLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RleC10b29scy9zcmMvZGV4L3N0cnVjdHVyZS9EZXhDbGFzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgZGV4LnN0cnVjdHVyZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIHtAY29kZSBEZXhDbGFzc30gcmVwcmVzZW50cyBhIGNsYXNzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIERleENsYXNzIGV4dGVuZHMgRGV4QW5ub3RhdGVkRWxlbWVudCwgV2l0aE1vZGlmaWVycywKLSAgICAgICAgTmFtZWRFbGVtZW50IHsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbGlzdCBjb250YWluaW5nIHRoZSBuYW1lcyBvZiBhbGwgaW1wbGVtZW50ZWQgaW50ZXJmYWNlcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBjb250YWluaW5nIHRoZSBuYW1lcyBvZiBhbGwgaW1wbGVtZW50ZWQgaW50ZXJmYWNlcwotICAgICAqLwotICAgIExpc3Q8U3RyaW5nPiBnZXRJbnRlcmZhY2VzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBzdXBlciBjbGFzcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzdXBlciBjbGFzcywgbWF5YmUge0Bjb2RlIG51bGx9Ci0gICAgICovCi0gICAgU3RyaW5nIGdldFN1cGVyQ2xhc3MoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IGNvbnRhaW5pbmcgYWxsIGZpZWxkcyBkZWNsYXJlZCBieSB0aGlzIHtAY29kZSBEZXhDbGFzc30uCi0gICAgICogCi0gICAgICogQHJldHVybiBhIGxpc3QgY29udGFpbmluZyBhbGwgZmllbGRzIGRlY2xhcmVkIGJ5IHRoaXMge0Bjb2RlIERleENsYXNzfQotICAgICAqLwotICAgIExpc3Q8RGV4RmllbGQ+IGdldEZpZWxkcygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGxpc3QgY29udGFpbmluZyBhbGwgbWV0aG9kcyBkZWNsYXJlZCBieSB0aGlzIHtAY29kZSBEZXhDbGFzc30uCi0gICAgICogCi0gICAgICogQHJldHVybiBhIGxpc3QgY29udGFpbmluZyBhbGwgbWV0aG9kcyBkZWNsYXJlZCBieSB0aGlzIHtAY29kZSBEZXhDbGFzc30KLSAgICAgKi8KLSAgICBMaXN0PERleE1ldGhvZD4gZ2V0TWV0aG9kcygpOwotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGV4LXRvb2xzL3NyYy9kZXgvc3RydWN0dXJlL0RleEVuY29kZWRBbm5vdGF0aW9uLmphdmEgYi90b29scy9kZXgtdG9vbHMvc3JjL2RleC9zdHJ1Y3R1cmUvRGV4RW5jb2RlZEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMxZmU3NC4uMDAwMDAwMAotLS0gYS90b29scy9kZXgtdG9vbHMvc3JjL2RleC9zdHJ1Y3R1cmUvRGV4RW5jb2RlZEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGRleC5zdHJ1Y3R1cmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGludGVyZmFjZSBEZXhFbmNvZGVkQW5ub3RhdGlvbiBleHRlbmRzIERleEVuY29kZWRWYWx1ZSB7Ci0gICAgU3RyaW5nIGdldFR5cGVOYW1lKCk7Ci0KLSAgICBMaXN0PERleEFubm90YXRpb25BdHRyaWJ1dGU+IGdldFZhbHVlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RleC10b29scy9zcmMvZGV4L3N0cnVjdHVyZS9EZXhFbmNvZGVkVmFsdWUuamF2YSBiL3Rvb2xzL2RleC10b29scy9zcmMvZGV4L3N0cnVjdHVyZS9EZXhFbmNvZGVkVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQwOWYzNC4uMDAwMDAwMAotLS0gYS90b29scy9kZXgtdG9vbHMvc3JjL2RleC9zdHJ1Y3R1cmUvRGV4RW5jb2RlZFZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBkZXguc3RydWN0dXJlOwotCi0vKioKLSAqIHtAY29kZSBEZXhFbmNvZGVkVmFsdWV9IHJlcHJlc2VudHMgYW4gZW5jb2RlZCB2YWx1ZS4gVGhlIHZhbHVlIG9mIGEge0Bjb2RlCi0gKiBEZXhBbm5vdGF0aW9uVmFsdWV9IGlzIGVuY29kZWQgYXMge0Bjb2RlIERleEVuY29kZWRWYWx1ZX0uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGV4RW5jb2RlZFZhbHVlIHsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhpcyB7QGNvZGUgRGV4RW5jb2RlZFZhbHVlfS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoaXMge0Bjb2RlIERleEVuY29kZWRWYWx1ZX0KLSAgICAgKi8KLSAgICBEZXhFbmNvZGVkVmFsdWVUeXBlIGdldFR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoaXMge0Bjb2RlIERleEVuY29kZWRWYWx1ZX0uCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhpcyB7QGNvZGUgRGV4RW5jb2RlZFZhbHVlfQotICAgICAqLwotICAgIE9iamVjdCBnZXRWYWx1ZSgpOwotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGV4LXRvb2xzL3NyYy9kZXgvc3RydWN0dXJlL0RleEVuY29kZWRWYWx1ZVR5cGUuamF2YSBiL3Rvb2xzL2RleC10b29scy9zcmMvZGV4L3N0cnVjdHVyZS9EZXhFbmNvZGVkVmFsdWVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNTYwZjMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGV4LXRvb2xzL3NyYy9kZXgvc3RydWN0dXJlL0RleEVuY29kZWRWYWx1ZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBkZXguc3RydWN0dXJlOwotCi0vKioKLSAqIHtAY29kZSBEZXhFbmNvZGVkVmFsdWVUeXBlfSByZXByZXNlbnRzIHRoZSB0eXBlIG9mIGFuIHtjb2RlIERleEVuY29kZWRWYWx1ZX0uCi0gKi8KLXB1YmxpYyBlbnVtIERleEVuY29kZWRWYWx1ZVR5cGUgewotICAgIC8qKgotICAgICAqIDxwcmU+Ci0gICAgICogVkFMVUVfQllURSAweDAwIChub25lOyBtdXN0IGJlIDApIHVieXRlWzFdCi0gICAgICogPC9wcmU+Ci0gICAgICogCi0gICAgICogc2lnbmVkIG9uZS1ieXRlIGludGVnZXIgdmFsdWUKLSAgICAgKi8KLSAgICBWQUxVRV9CWVRFKChieXRlKSAweDAwKSwKLSAgICAvKioKLSAgICAgKiA8cHJlPgotICAgICAqIFZBTFVFX1NIT1JUIDB4MDIgc2l6ZSAtIDEgKDAuLi4xKSB1Ynl0ZVtzaXplXQotICAgICAqIDwvcHJlPgotICAgICAqIAotICAgICAqIHNpZ25lZCB0d28tYnl0ZSBpbnRlZ2VyIHZhbHVlLCBzaWduLWV4dGVuZGVkCi0gICAgICovCi0gICAgVkFMVUVfU0hPUlQoKGJ5dGUpIDB4MDIpLAotICAgIC8qKgotICAgICAqIDxwcmU+Ci0gICAgICogVkFMVUVfQ0hBUiAweDAzIHNpemUgLSAxICgwLi4uMSkgdWJ5dGVbc2l6ZV0KLSAgICAgKiA8L3ByZT4KLSAgICAgKiAKLSAgICAgKiB1bnNpZ25lZCB0d28tYnl0ZSBpbnRlZ2VyIHZhbHVlLCB6ZXJvLWV4dGVuZGVkCi0gICAgICovCi0gICAgVkFMVUVfQ0hBUigoYnl0ZSkgMHgwMyksCi0gICAgLyoqCi0gICAgICogPHByZT4KLSAgICAgKiBWQUxVRV9JTlQgMHgwNCBzaXplIC0gMSAoMC4uLjMpIHVieXRlW3NpemVdCi0gICAgICogPC9wcmU+Ci0gICAgICogCi0gICAgICogc2lnbmVkIGZvdXItYnl0ZSBpbnRlZ2VyIHZhbHVlLCBzaWduLWV4dGVuZGVkCi0gICAgICovCi0gICAgVkFMVUVfSU5UKChieXRlKSAweDA0KSwKLSAgICAvKioKLSAgICAgKiA8cHJlPgotICAgICAqIFZBTFVFX0xPTkcgMHgwNiBzaXplIC0gMSAoMC4uLjcpIHVieXRlW3NpemVdCi0gICAgICogPC9wcmU+Ci0gICAgICogCi0gICAgICogc2lnbmVkIGVpZ2h0LWJ5dGUgaW50ZWdlciB2YWx1ZSwgc2lnbi1leHRlbmRlZAotICAgICAqLwotICAgIFZBTFVFX0xPTkcoKGJ5dGUpIDB4MDYpLAotICAgIC8qKgotICAgICAqIDxwcmU+Ci0gICAgICogVkFMVUVfRkxPQVQgMHgxMCBzaXplIC0gMSAoMC4uLjMpIHVieXRlW3NpemVdCi0gICAgICogPC9wcmU+Ci0gICAgICogCi0gICAgICogZm91ci1ieXRlIGJpdCBwYXR0ZXJuLCB6ZXJvLWV4dGVuZGVkIHRvIHRoZSByaWdodCwgYW5kIGludGVycHJldGVkIGFzIGFuCi0gICAgICogSUVFRTc1NCAzMi1iaXQgZmxvYXRpbmcgcG9pbnQgdmFsdWUKLSAgICAgKi8KLSAgICBWQUxVRV9GTE9BVCgoYnl0ZSkgMHgxMCksCi0gICAgLyoqCi0gICAgICogPHByZT4KLSAgICAgKiBWQUxVRV9ET1VCTEUgMHgxMSBzaXplIC0gMSAoMC4uLjcpIHVieXRlW3NpemVdCi0gICAgICogPC9wcmU+Ci0gICAgICogCi0gICAgICogZWlnaHQtYnl0ZSBiaXQgcGF0dGVybiwgemVyby1leHRlbmRlZCB0byB0aGUgcmlnaHQsIGFuZCBpbnRlcnByZXRlZCBhcyBhbgotICAgICAqIElFRUU3NTQgNjQtYml0IGZsb2F0aW5nIHBvaW50IHZhbHVlCi0gICAgICovCi0gICAgVkFMVUVfRE9VQkxFKChieXRlKSAweDExKSwKLSAgICAvKioKLSAgICAgKiA8cHJlPgotICAgICAqIFZBTFVFX1NUUklORyAgICAweDE3ICAgICBzaXplIC0gMSAoMC4uLjMpICAgICB1Ynl0ZVtzaXplXQotICAgICAqIDwvcHJlPgotICAgICAqIAotICAgICAqIHVuc2lnbmVkICh6ZXJvLWV4dGVuZGVkKSBmb3VyLWJ5dGUgaW50ZWdlciB2YWx1ZSwgaW50ZXJwcmV0ZWQgYXMgYW4gaW5kZXgKLSAgICAgKiBpbnRvIHRoZSBzdHJpbmdfaWRzIHNlY3Rpb24gYW5kIHJlcHJlc2VudGluZyBhIHN0cmluZyB2YWx1ZQotICAgICAqLwotICAgIFZBTFVFX1NUUklORygoYnl0ZSkgMHgxNyksCi0gICAgLyoqCi0gICAgICogPHByZT4KLSAgICAgKiBWQUxVRV9UWVBFIDB4MTggc2l6ZSAtIDEgKDAuLi4zKSB1Ynl0ZVtzaXplXQotICAgICAqIDwvcHJlPgotICAgICAqIAotICAgICAqIHVuc2lnbmVkICh6ZXJvLWV4dGVuZGVkKSBmb3VyLWJ5dGUgaW50ZWdlciB2YWx1ZSwgaW50ZXJwcmV0ZWQgYXMgYW4gaW5kZXgKLSAgICAgKiBpbnRvIHRoZSB0eXBlX2lkcyBzZWN0aW9uIGFuZCByZXByZXNlbnRpbmcgYSByZWZsZWN0aXZlIHR5cGUvY2xhc3MgdmFsdWUKLSAgICAgKi8KLSAgICBWQUxVRV9UWVBFKChieXRlKSAweDE4KSwKLSAgICAvKioKLSAgICAgKiA8cHJlPgotICAgICAqIFZBTFVFX0ZJRUxEIDB4MTkgc2l6ZSAtIDEgKDAuLi4zKSB1Ynl0ZVtzaXplXQotICAgICAqIDwvcHJlPgotICAgICAqIAotICAgICAqIHVuc2lnbmVkICh6ZXJvLWV4dGVuZGVkKSBmb3VyLWJ5dGUgaW50ZWdlciB2YWx1ZSwgaW50ZXJwcmV0ZWQgYXMgYW4gaW5kZXgKLSAgICAgKiBpbnRvIHRoZSBmaWVsZF9pZHMgc2VjdGlvbiBhbmQgcmVwcmVzZW50aW5nIGEgcmVmbGVjdGl2ZSBmaWVsZCB2YWx1ZQotICAgICAqLwotICAgIFZBTFVFX0ZJRUxEKChieXRlKSAweDE5KSwKLSAgICAvKioKLSAgICAgKiA8cHJlPgotICAgICAqIFZBTFVFX01FVEhPRCAweDFhIHNpemUgLSAxICgwLi4uMykgdWJ5dGVbc2l6ZV0KLSAgICAgKiA8L3ByZT4KLSAgICAgKiAKLSAgICAgKiB1bnNpZ25lZCAoemVyby1leHRlbmRlZCkgZm91ci1ieXRlIGludGVnZXIgdmFsdWUsIGludGVycHJldGVkIGFzIGFuIGluZGV4Ci0gICAgICogaW50byB0aGUgbWV0aG9kX2lkcyBzZWN0aW9uIGFuZCByZXByZXNlbnRpbmcgYSByZWZsZWN0aXZlIG1ldGhvZCB2YWx1ZQotICAgICAqLwotICAgIFZBTFVFX01FVEhPRCgoYnl0ZSkgMHgxYSksCi0gICAgLyoqCi0gICAgICogPHByZT4KLSAgICAgKiBWQUxVRV9FTlVNIDB4MWIgc2l6ZSAtIDEgKDAuLi4zKSB1Ynl0ZVtzaXplXQotICAgICAqIDwvcHJlPgotICAgICAqIAotICAgICAqIHVuc2lnbmVkICh6ZXJvLWV4dGVuZGVkKSBmb3VyLWJ5dGUgaW50ZWdlciB2YWx1ZSwgaW50ZXJwcmV0ZWQgYXMgYW4gaW5kZXgKLSAgICAgKiBpbnRvIHRoZSBmaWVsZF9pZHMgc2VjdGlvbiBhbmQgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiBhbiBlbnVtZXJhdGVkCi0gICAgICogdHlwZSBjb25zdGFudAotICAgICAqLwotICAgIFZBTFVFX0VOVU0oKGJ5dGUpIDB4MWIpLAotICAgIC8qKgotICAgICAqIDxwcmU+Ci0gICAgICogVkFMVUVfQVJSQVkgMHgxYyAobm9uZTsgbXVzdCBiZSAwKSBlbmNvZGVkX2FycmF5Ci0gICAgICogPC9wcmU+Ci0gICAgICogCi0gICAgICogYW4gYXJyYXkgb2YgdmFsdWVzLCBpbiB0aGUgZm9ybWF0IHNwZWNpZmllZCBieSAiZW5jb2RlZF9hcnJheSBGb3JtYXQiCi0gICAgICogYmVsb3cuIFRoZSBzaXplIG9mIHRoZSB2YWx1ZSBpcyBpbXBsaWNpdCBpbiB0aGUgZW5jb2RpbmcuCi0gICAgICovCi0gICAgVkFMVUVfQVJSQVkoKGJ5dGUpIDB4MWMpLAotICAgIC8qKgotICAgICAqIDxwcmU+Ci0gICAgICogVkFMVUVfQU5OT1RBVElPTiAweDFkIChub25lOyBtdXN0IGJlIDApIGVuY29kZWRfYW5ub3RhdGlvbgotICAgICAqIDwvcHJlPgotICAgICAqIAotICAgICAqIGEgc3ViLWFubm90YXRpb24sIGluIHRoZSBmb3JtYXQgc3BlY2lmaWVkIGJ5ICJlbmNvZGVkX2Fubm90YXRpb24gRm9ybWF0IgotICAgICAqIGJlbG93LiBUaGUgc2l6ZSBvZiB0aGUgdmFsdWUgaXMgaW1wbGljaXQgaW4gdGhlIGVuY29kaW5nLgotICAgICAqLwotICAgIFZBTFVFX0FOTk9UQVRJT04oKGJ5dGUpIDB4MWQpLAotICAgIC8qKgotICAgICAqIDxwcmU+Ci0gICAgICogVkFMVUVfTlVMTCAweDFlIChub25lOyBtdXN0IGJlIDApIChub25lKQotICAgICAqIDwvcHJlPgotICAgICAqIAotICAgICAqIG51bGwgcmVmZXJlbmNlIHZhbHVlCi0gICAgICovCi0gICAgVkFMVUVfTlVMTCgoYnl0ZSkgMHgxZSksCi0gICAgLyoqCi0gICAgICogPHByZT4KLSAgICAgKiBWQUxVRV9CT09MRUFOIDB4MWYgYm9vbGVhbiAoMC4uLjEpIChub25lKQotICAgICAqIDwvcHJlPgotICAgICAqIAotICAgICAqIG9uZS1iaXQgdmFsdWU7IDAgZm9yIGZhbHNlIGFuZCAxIGZvciB0cnVlLiBUaGUgYml0IGlzIHJlcHJlc2VudGVkIGluIHRoZQotICAgICAqIHZhbHVlX2FyZy4KLSAgICAgKi8KLSAgICBWQUxVRV9CT09MRUFOKChieXRlKSAweDFmKTsKLQotICAgIHByaXZhdGUgYnl0ZSB2YWx1ZTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIERleEVuY29kZWRWYWx1ZVR5cGV9IHVzaW5nIHRoZSBwcm92aWRlZAotICAgICAqIGJ5dGUuCi0gICAgICogPHA+Ci0gICAgICogRm9ybWF0OiB2YWx1ZSA6PSAodmFsdWVfYXJnIDw8IDUpIHwgdmFsdWVfdHlwZQotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBieXRlfSBjb250YWluaW5nIHRoZSB0eXBlIGFuZCB0aGUgdmFsdWUgYXJndW1lbnQKLSAgICAgKi8KLSAgICBwcml2YXRlIERleEVuY29kZWRWYWx1ZVR5cGUoYnl0ZSB2YWx1ZSkgewotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUge0Bjb2RlIERleEVuY29kZWRWYWx1ZVR5cGV9IGZvciB0aGUgZ2l2ZW4ge0Bjb2RlIGJ5dGV9LgotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgdGhlIHtAY29kZSBieXRlfSBjb250YWluaW5nIHRoZSB0eXBlIGFuZCB0aGUgdmFsdWUgYXJndW1lbnQKLSAgICAgKiBAcmV0dXJuIHRoZSB7QGNvZGUgRGV4RW5jb2RlZFZhbHVlVHlwZX0gZm9yIHRoZSBnaXZlbiB7QGNvZGUgYnl0ZX0KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIERleEVuY29kZWRWYWx1ZVR5cGUgZ2V0KGJ5dGUgdmFsdWUpIHsKLSAgICAgICAgLy8gRklYTUUgZG9uJ3QgbG9vcCAtPiBzd2l0Y2ggdG8gZ2V0IHBlcmZvcm1hbmNlIGJvb3N0Ci0gICAgICAgIGZvciAoRGV4RW5jb2RlZFZhbHVlVHlwZSB0eXBlIDogdmFsdWVzKCkpIHsKLSAgICAgICAgICAgIGlmICh0eXBlLnZhbHVlID09ICh2YWx1ZSAmIDB4MUYpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVHlwZSBkb2VzIG5vdCBleGlzdCEiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcmd1bWVudCBvZiB0aGUgZ2l2ZW4ge0Bjb2RlIGJ5dGV9LgotICAgICAqIDxwPgotICAgICAqIEZvcm1hdDogdmFsdWUgOj0gKHZhbHVlX2FyZyA8PCA1KSB8IHZhbHVlX3R5cGUKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgYnl0ZX0gY29udGFpbmluZyB0aGUgdHlwZSBhbmQgdGhlIHZhbHVlIGFyZ3VtZW50Ci0gICAgICogQHJldHVybiB0aGUgdmFsdWUgYXJndW1lbnQgb2YgdGhlIGdpdmVuIHtAY29kZSBieXRlfQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYnl0ZSB2YWx1ZUFyZyhieXRlIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiAoYnl0ZSkgKHZhbHVlID4+PiA1KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9kZXgtdG9vbHMvc3JjL2RleC9zdHJ1Y3R1cmUvRGV4RmllbGQuamF2YSBiL3Rvb2xzL2RleC10b29scy9zcmMvZGV4L3N0cnVjdHVyZS9EZXhGaWVsZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTliZmFkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RleC10b29scy9zcmMvZGV4L3N0cnVjdHVyZS9EZXhGaWVsZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgZGV4LnN0cnVjdHVyZTsKLQotLyoqCi0gKiB7QGNvZGUgRGV4RmllbGR9IHJlcHJlc2VudHMgYSBmaWVsZC4KLSAqLwotcHVibGljIGludGVyZmFjZSBEZXhGaWVsZCBleHRlbmRzIERleEFubm90YXRlZEVsZW1lbnQsIFdpdGhNb2RpZmllcnMsCi0gICAgICAgIE5hbWVkRWxlbWVudCB7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSB0eXBlIG9mIHRoaXMge0Bjb2RlIERleEZpZWxkfS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSB0eXBlIG9mIHRoaXMge0Bjb2RlIERleEZpZWxkfQotICAgICAqLwotICAgIFN0cmluZyBnZXRUeXBlKCk7Ci0KLSAgICBEZXhDbGFzcyBnZXREZWNsYXJpbmdDbGFzcygpOwotCi0gICAgYm9vbGVhbiBpc0VudW1Db25zdGFudCgpOwotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGV4LXRvb2xzL3NyYy9kZXgvc3RydWN0dXJlL0RleEZpbGUuamF2YSBiL3Rvb2xzL2RleC10b29scy9zcmMvZGV4L3N0cnVjdHVyZS9EZXhGaWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZWU1MGUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGV4LXRvb2xzL3NyYy9kZXgvc3RydWN0dXJlL0RleEZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGRleC5zdHJ1Y3R1cmU7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIHtAY29kZSBEZXhGaWxlfSByZXByZXNlbnRzIGEgd2hvbGUgZGV4IGZpbGUsIGNvbnRhaW5pbmcgbXVsdGlwbGUgY2xhc3Nlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBEZXhGaWxlIGV4dGVuZHMgTmFtZWRFbGVtZW50IHsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIHtAY29kZSBEZXhDbGFzc30gZWxlbWVudHMgdGhhdCBhcmUgcGFydCBvZiB0aGlzIHtAY29kZQotICAgICAqIERleEZpbGV9LgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIHtAY29kZSBEZXhDbGFzc30gZWxlbWVudHMgdGhhdCBhcmUgcGFydCBvZiB0aGlzIHtAY29kZQotICAgICAqICAgICAgICAgRGV4RmlsZX0KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxEZXhDbGFzcz4gZ2V0RGVmaW5lZENsYXNzZXMoKTsKLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGV4LXRvb2xzL3NyYy9kZXgvc3RydWN0dXJlL0RleEludGVyZmFjZS5qYXZhIGIvdG9vbHMvZGV4LXRvb2xzL3NyYy9kZXgvc3RydWN0dXJlL0RleEludGVyZmFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzliMTRkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RleC10b29scy9zcmMvZGV4L3N0cnVjdHVyZS9EZXhJbnRlcmZhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGRleC5zdHJ1Y3R1cmU7Ci0KLS8qKgotICoge0Bjb2RlIERleEludGVyZmFjZX0gcmVwcmVzZW50cyBhbiBpbnRlcmZhY2UuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGV4SW50ZXJmYWNlIGV4dGVuZHMgRGV4QW5ub3RhdGVkRWxlbWVudCB7Ci19CmRpZmYgLS1naXQgYS90b29scy9kZXgtdG9vbHMvc3JjL2RleC9zdHJ1Y3R1cmUvRGV4TWV0aG9kLmphdmEgYi90b29scy9kZXgtdG9vbHMvc3JjL2RleC9zdHJ1Y3R1cmUvRGV4TWV0aG9kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZTNhMDkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGV4LXRvb2xzL3NyYy9kZXgvc3RydWN0dXJlL0RleE1ldGhvZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgZGV4LnN0cnVjdHVyZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIHtAY29kZSBEZXhNZXRob2R9IHJlcHJlc2VudHMgYSBtZXRob2QuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGV4TWV0aG9kIGV4dGVuZHMgV2l0aE1vZGlmaWVycywgRGV4QW5ub3RhdGVkRWxlbWVudCwKLSAgICAgICAgTmFtZWRFbGVtZW50IHsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBzdHJpbmdzIHJlcHJlc2VudGluZyB0aGUgdHlwZXMgb2YgdGhlIHBhcmFtZXRlcnMgb2YKLSAgICAgKiB0aGlzIG1ldGhvZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBzdHJpbmdzIHJlcHJlc2VudGluZyB0aGUgdHlwZXMgb2YgdGhlIHBhcmFtZXRlcnMgb2YKLSAgICAgKiAgICAgICAgIHRoaXMgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8RGV4UGFyYW1ldGVyPiBnZXRQYXJhbWV0ZXJzKCk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJldHVyblR5cGUoKTsKLQotICAgIHB1YmxpYyBEZXhDbGFzcyBnZXREZWNsYXJpbmdDbGFzcygpOwotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGV4LXRvb2xzL3NyYy9kZXgvc3RydWN0dXJlL0RleFBhcmFtZXRlci5qYXZhIGIvdG9vbHMvZGV4LXRvb2xzL3NyYy9kZXgvc3RydWN0dXJlL0RleFBhcmFtZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmEyMWUwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RleC10b29scy9zcmMvZGV4L3N0cnVjdHVyZS9EZXhQYXJhbWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGRleC5zdHJ1Y3R1cmU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgRGV4UGFyYW1ldGVyIGV4dGVuZHMgRGV4QW5ub3RhdGVkRWxlbWVudCB7Ci0gICAgU3RyaW5nIGdldFR5cGVOYW1lKCk7Ci19CmRpZmYgLS1naXQgYS90b29scy9kZXgtdG9vbHMvc3JjL2RleC9zdHJ1Y3R1cmUvTmFtZWRFbGVtZW50LmphdmEgYi90b29scy9kZXgtdG9vbHMvc3JjL2RleC9zdHJ1Y3R1cmUvTmFtZWRFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiOGIxMjguLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGV4LXRvb2xzL3NyYy9kZXgvc3RydWN0dXJlL05hbWVkRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgZGV4LnN0cnVjdHVyZTsKLQotLyoqCi0gKiB7QGNvZGUgTmFtZWRFbGVtZW50fSByZXByZXNlbnRzIGFuIGVsZW1lbnQgd2l0aCBhIG5hbWUuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTmFtZWRFbGVtZW50IHsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMge0Bjb2RlIE5hbWVkRWxlbWVudH0uCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIHtAY29kZSBOYW1lZEVsZW1lbnR9Ci0gICAgICovCi0gICAgU3RyaW5nIGdldE5hbWUoKTsKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RleC10b29scy9zcmMvZGV4L3N0cnVjdHVyZS9XaXRoTW9kaWZpZXJzLmphdmEgYi90b29scy9kZXgtdG9vbHMvc3JjL2RleC9zdHJ1Y3R1cmUvV2l0aE1vZGlmaWVycy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDRjNDYxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RleC10b29scy9zcmMvZGV4L3N0cnVjdHVyZS9XaXRoTW9kaWZpZXJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBkZXguc3RydWN0dXJlOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7Ci0KLS8qKgotICoge0BsaW5rIFdpdGhNb2RpZmllcnN9IGlzIGltcGxlbWVudGVkIGJ5IGFsbCBsYW5ndWFnZSBlbGVtZW50cyB0aGF0IGhhdmUKLSAqIG1vZGlmaWVycy4KLSAqLwotcHVibGljIGludGVyZmFjZSBXaXRoTW9kaWZpZXJzIHsKLQotICAgIC8qKgotICAgICAqIFRoZSB7QGxpbmsgTW9kaWZpZXJ9IGNsYXNzIHNob3VsZCBiZSB1c2VkIHRvIGRlY29kZSB0aGUgcmVzdWx0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1vZGlmaWVycyBmb3IgdGhpcyBtZW1iZXIKLSAgICAgKiAKLSAgICAgKiBAc2VlIE1vZGlmaWVyCi0gICAgICovCi0gICAgaW50IGdldE1vZGlmaWVycygpOwotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGV4LXRvb2xzL3Rlc3QvZGV4L3JlYWRlci9EZXhGaWxlUmVhZGVyVGVzdHMuamF2YSBiL3Rvb2xzL2RleC10b29scy90ZXN0L2RleC9yZWFkZXIvRGV4RmlsZVJlYWRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1OTA3ZjkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGV4LXRvb2xzL3Rlc3QvZGV4L3JlYWRlci9EZXhGaWxlUmVhZGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBkZXgucmVhZGVyOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1pbXBvcnQgZGV4LnJlYWRlci51dGlsLkphdmFTb3VyY2U7Ci1pbXBvcnQgZGV4LnN0cnVjdHVyZS5EZXhBbm5vdGF0aW9uOwotaW1wb3J0IGRleC5zdHJ1Y3R1cmUuRGV4QW5ub3RhdGlvbkF0dHJpYnV0ZTsKLWltcG9ydCBkZXguc3RydWN0dXJlLkRleENsYXNzOwotaW1wb3J0IGRleC5zdHJ1Y3R1cmUuRGV4RW5jb2RlZFZhbHVlOwotaW1wb3J0IGRleC5zdHJ1Y3R1cmUuRGV4RmllbGQ7Ci1pbXBvcnQgZGV4LnN0cnVjdHVyZS5EZXhGaWxlOwotaW1wb3J0IGRleC5zdHJ1Y3R1cmUuRGV4TWV0aG9kOwotaW1wb3J0IGRleC5zdHJ1Y3R1cmUuRGV4UGFyYW1ldGVyOwotCi0KLXB1YmxpYyBjbGFzcyBEZXhGaWxlUmVhZGVyVGVzdHMgZXh0ZW5kcyBEZXhUZXN0c0NvbW1vbiB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTERBTFZJS19BTk5PVEFUSU9OX1NJR05BVFVSRSA9ICJMZGFsdmlrL2Fubm90YXRpb24vU2lnbmF0dXJlOyI7Ci0gICAgCi0gICAgCi0gICAgSmF2YVNvdXJjZSBBID0gbmV3IEphdmFTb3VyY2UoImEuYi5jLkEiLCAKLSAgICAgICAgICAgICJwYWNrYWdlIGEuYi5jOyBwdWJsaWMgY2xhc3MgQXsgcHVibGljIHZvaWQgZ2V0KCkge319IgotICAgICk7Ci0gICAgCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIERleEZpbGUgZGV4RmlsZSA9IGphdmFUb0RleFV0aWwuZ2V0RnJvbShBKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGRleEZpbGUuZ2V0RGVmaW5lZENsYXNzZXMoKS5zaXplKCkpOwotICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLSAgICAgICAgRGV4Q2xhc3MgY2xhc3MxID0gZ2V0Q2xhc3MoZGV4RmlsZSwgIkxhL2IvYy9BOyIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZGV4RmlsZSk7Ci0gICAgfQotICAgIAotICAgIAotICAgIEphdmFTb3VyY2UgVDAgPSBuZXcgSmF2YVNvdXJjZSgiVDAiLAotICAgICAgICAgICAgInB1YmxpYyBjbGFzcyBUMCB7IiArIAotICAgICAgICAgICAgIiAgICBwdWJsaWMgaW50IHB1YmxpY0ludEZpZWxkOyIgKyAKLSAgICAgICAgICAgICIgICAgcHJvdGVjdGVkIGxvbmcgcHJvdGVjdGVkTG9uZ0ZpZWxkOyIgKyAKLSAgICAgICAgICAgICIgICAgc2hvcnQgZGVmYXVsdFNob3J0RmllbGQ7IiArIAotICAgICAgICAgICAgIiAgICBwcml2YXRlIGRvdWJsZSBwcml2YXRlRG91YmxlRmllbGQ7IiArIAotICAgICAgICAgICAgIiAgICAiICsgCi0gICAgICAgICAgICAiICAgIHB1YmxpYyBTdHJpbmcgcHVibGljU3RyaW5nTWV0aG9kSW50KGludCBhKXsgcmV0dXJuIFwiYmxhXCI7IH0iICsgCi0gICAgICAgICAgICAiICAgIHByb3RlY3RlZCBTdHJpbmcgcHJvdGVjdGVkU3RyaW5nTWV0aG9kSW50KGludCBhKXsgcmV0dXJuIFwiYmxhXCI7IH0iICsgCi0gICAgICAgICAgICAiICAgIFN0cmluZyBkZWZhdWx0U3RyaW5nTWV0aG9kSW50KGludCBhKXsgcmV0dXJuIFwiYmxhXCI7IH0iICsgCi0gICAgICAgICAgICAiICAgIHByaXZhdGUgU3RyaW5nIHByaXZhdGVTdHJpbmdNZXRob2RJbnQoaW50IGEpeyByZXR1cm4gXCJibGFcIjsgfSIgKyAKLSAgICAgICAgICAgICJ9IiAgICAgCi0gICAgKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0cyBwYXJzaW5nIGEgc2ltcGxlIGNsYXNzLgotICAgICAqLwotICAgIEBUZXN0IAotICAgIHB1YmxpYyB2b2lkIHRlc3RUMCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIAotICAgICAgICBEZXhGaWxlIGRleEZpbGUgPSBqYXZhVG9EZXhVdGlsLmdldEZyb20oVDApOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZGV4RmlsZS5nZXREZWZpbmVkQ2xhc3NlcygpLnNpemUoKSk7Ci0gICAgICAgIERleENsYXNzIGNsYXp6ID0gZGV4RmlsZS5nZXREZWZpbmVkQ2xhc3NlcygpLmdldCgwKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJMVDA7IiwgY2xhenouZ2V0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0UHVibGljKGNsYXp6KTsKLSAgICAgICAgLy9maWVsZHMKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIGNsYXp6LmdldEZpZWxkcygpLnNpemUoKSk7Ci0gICAgICAgIERleEZpZWxkIGZpZWxkID0gZ2V0RmllbGQoY2xhenosICJwdWJsaWNJbnRGaWVsZCIpOwotICAgICAgICBhc3NlcnRQdWJsaWMoZmllbGQpOwotICAgICAgICBmaWVsZCA9IGdldEZpZWxkKGNsYXp6LCAicHJvdGVjdGVkTG9uZ0ZpZWxkIik7Ci0gICAgICAgIGFzc2VydFByb3RlY3RlZChmaWVsZCk7Ci0gICAgICAgIGZpZWxkID0gZ2V0RmllbGQoY2xhenosICJkZWZhdWx0U2hvcnRGaWVsZCIpOwotICAgICAgICBhc3NlcnREZWZhdWx0KGZpZWxkKTsKLSAgICAgICAgZmllbGQgPSBnZXRGaWVsZChjbGF6eiwgInByaXZhdGVEb3VibGVGaWVsZCIpOwotICAgICAgICBhc3NlcnRQcml2YXRlKGZpZWxkKTsKLSAgICAgICAgLy9tZXRob2RzCi0gICAgICAgIERleE1ldGhvZCBtZXRob2QgPSBnZXRNZXRob2QoY2xhenosICJwdWJsaWNTdHJpbmdNZXRob2RJbnQiLCAiSSIpOwotICAgICAgICBhc3NlcnRQdWJsaWMobWV0aG9kKTsKLSAgICAgICAgbWV0aG9kID0gZ2V0TWV0aG9kKGNsYXp6LCAicHJvdGVjdGVkU3RyaW5nTWV0aG9kSW50IiwgIkkiKTsvKiogYS5iLkMgKi8KLSAgICAgICAgYXNzZXJ0UHJvdGVjdGVkKG1ldGhvZCk7Ci0gICAgICAgIG1ldGhvZCA9IGdldE1ldGhvZChjbGF6eiwgImRlZmF1bHRTdHJpbmdNZXRob2RJbnQiLCAiSSIpOwotICAgICAgICBhc3NlcnREZWZhdWx0KG1ldGhvZCk7Ci0gICAgICAgIG1ldGhvZCA9IGdldE1ldGhvZChjbGF6eiwgInByaXZhdGVTdHJpbmdNZXRob2RJbnQiLCAiSSIpOwotICAgICAgICBhc3NlcnRQcml2YXRlKG1ldGhvZCk7Ci0gICAgfQotICAgIAotICAgIEphdmFTb3VyY2UgVDEgPSBuZXcgSmF2YVNvdXJjZSggIlQxIiwicHVibGljIGNsYXNzIFQxIGV4dGVuZHMgVDAge30iICk7Ci0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBTZXQ8SmF2YVNvdXJjZT4gdG9TZXQoSmF2YVNvdXJjZS4uLmphdmFTb3VyY2VzKXsKLSAgICAgICAgcmV0dXJuIG5ldyBIYXNoU2V0PEphdmFTb3VyY2U+KEFycmF5cy5hc0xpc3QoamF2YVNvdXJjZXMpKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgU2V0PFN0cmluZz4gdG9TdHJpbmdTZXQoSmF2YVNvdXJjZS4uLiBqYXZhU291cmNlcykgewotICAgICAgICBTZXQ8U3RyaW5nPiBuYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgZm9yIChKYXZhU291cmNlIGphdmFTb3VyY2UgOiBqYXZhU291cmNlcykgewotICAgICAgICAgICAgbmFtZXMuYWRkKGphdmFTb3VyY2UuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG5hbWVzOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBTZXQ8U3RyaW5nPiB0b1N0cmluZ1NldChTdHJpbmcuLi4gamF2YVNvdXJjZU5hbWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBIYXNoU2V0PFN0cmluZz4oQXJyYXlzLmFzTGlzdChqYXZhU291cmNlTmFtZSkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0cyBwYXJzaW5nIGEgc2ltcGxlIHN1YiBjbGFzcy4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgQFRlc3QgCi0gICAgcHVibGljIHZvaWQgdGVzdFQxKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgRGV4RmlsZSBkZXhGaWxlID0gamF2YVRvRGV4VXRpbC5nZXRGcm9tKHRvU2V0KFQxLCBUMCksIHRvU3RyaW5nU2V0KFQxKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBkZXhGaWxlLmdldERlZmluZWRDbGFzc2VzKCkuc2l6ZSgpKTsKLSAgICAgICAgRGV4Q2xhc3MgY2xhenogPSBkZXhGaWxlLmdldERlZmluZWRDbGFzc2VzKCkuZ2V0KDApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkxUMTsiLCBjbGF6ei5nZXROYW1lKCkpOwotICAgICAgICBhc3NlcnRQdWJsaWMoY2xhenopOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkxUMDsiLCBjbGF6ei5nZXRTdXBlckNsYXNzKCkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0cyBwYXJzaW5nIFQwIGFuZCBUMSBmcm9tIHNhbWUgZGV4IGZpbGUuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIEBUZXN0IAotICAgIHB1YmxpYyB2b2lkIHRlc3RUMF9UMSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIERleEZpbGUgZGV4RmlsZSA9IGphdmFUb0RleFV0aWwuZ2V0RnJvbShUMSwgVDApOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgZGV4RmlsZS5nZXREZWZpbmVkQ2xhc3NlcygpLnNpemUoKSk7Ci0gICAgICAgIAotICAgICAgICBEZXhDbGFzcyBUMCA9IGdldENsYXNzKGRleEZpbGUsICJMVDA7Iik7Ci0gICAgICAgIGFzc2VydFB1YmxpYyhUMCk7Ci0gICAgICAgIAotICAgICAgICBEZXhDbGFzcyBUMSA9IGdldENsYXNzKGRleEZpbGUsICJMVDE7Iik7Ci0gICAgICAgIGFzc2VydFB1YmxpYyhUMSk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoVDEuZ2V0U3VwZXJDbGFzcygpLCBUMC5nZXROYW1lKCkpOwotICAgIH0KLSAgICAKLSAgICBzdGF0aWMgZmluYWwgSmF2YVNvdXJjZSBBMCA9IG5ldyBKYXZhU291cmNlKCJBMCIsIAotICAgICJpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uKjsiICsgCi0gICAgIkBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpIiArIAotICAgICJAVGFyZ2V0KEVsZW1lbnRUeXBlLlRZUEUpIiArIAotICAgICJwdWJsaWMgQGludGVyZmFjZSBBMCB7fSIKLSAgICAgKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0cyBwYXJzaW5nIEFubm90YXRpb24gRGVjbGFyYXRpb24uCi0gICAgICovCi0gICAgQFRlc3QgCi0gICAgcHVibGljIHZvaWQgdGVzdEEwKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgRGV4RmlsZSBkZXhGaWxlID0gamF2YVRvRGV4VXRpbC5nZXRGcm9tKEEwKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGRleEZpbGUuZ2V0RGVmaW5lZENsYXNzZXMoKS5zaXplKCkpOwotICAgICAgICAKLSAgICAgICAgRGV4Q2xhc3MgQTAgPSBnZXRDbGFzcyhkZXhGaWxlLCAiTEEwOyIpOwotICAgICAgICBhc3NlcnRQdWJsaWMoQTApOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgQTAuZ2V0QW5ub3RhdGlvbnMoKS5zaXplKCkpOwotICAgIH0KLSAgICAKLSAgICAKLSAgICBzdGF0aWMgZmluYWwgSmF2YVNvdXJjZSBUMyA9IG5ldyBKYXZhU291cmNlKCJUMyIsCi0gICAgImltcG9ydCBqYXZhLmlvLio7IiArIAotICAgICJAQTAgIiArIAotICAgICJwdWJsaWMgZmluYWwgY2xhc3MgVDMge30iICAgICAgICAKLSAgICApOwotICAgIAotICAgIAotICAgIC8qKgotICAgICAqIFRlc3RzIHBhcnNpbmcgQW5ub3RhdGVkIENsYXNzLgotICAgICAqLwotICAgIEBUZXN0IAotICAgIHB1YmxpYyB2b2lkIHRlc3RBMF9UMygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIERleEZpbGUgZGV4RmlsZSA9IGphdmFUb0RleFV0aWwuZ2V0RnJvbShUMywgQTApOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgZGV4RmlsZS5nZXREZWZpbmVkQ2xhc3NlcygpLnNpemUoKSk7Ci0gICAgICAgIAotICAgICAgICBEZXhDbGFzcyBUMyA9IGdldENsYXNzKGRleEZpbGUsICJMVDM7Iik7Ci0gICAgICAgIGFzc2VydFB1YmxpYyhUMyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBUMy5nZXRBbm5vdGF0aW9ucygpLnNpemUoKSk7Ci0gICAgICAgIAotICAgICAgICBEZXhBbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXRBbm5vdGF0aW9uKFQzLCAiTEEwOyIpOwotICAgICAgICAKLSAgICAgICAgRGV4Q2xhc3MgQTAgPSBnZXRDbGFzcyhkZXhGaWxlLCAiTEEwOyIpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEEwLmdldE5hbWUoKSwgYW5ub3RhdGlvbi5nZXRUeXBlTmFtZSgpKTsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgc3RhdGljIGZpbmFsIEphdmFTb3VyY2UgRzAgPSBuZXcgSmF2YVNvdXJjZSgiRzAiLCJwdWJsaWMgY2xhc3MgRzA8VD57fSIpOwotICAgIAotICAgIC8qKgotICAgICAqIFRlc3RzIHBhcnNpbmcgR2VuZXJpYyBUeXBlLgotICAgICAqLwotICAgIEBUZXN0IAotICAgIHB1YmxpYyB2b2lkIHRlc3RHMCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIERleEZpbGUgZGV4RmlsZSA9IGphdmFUb0RleFV0aWwuZ2V0RnJvbShHMCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBkZXhGaWxlLmdldERlZmluZWRDbGFzc2VzKCkuc2l6ZSgpKTsKLSAgICAgICAgRGV4Q2xhc3MgRzAgPSBnZXRDbGFzcyhkZXhGaWxlLCAiTEcwOyIpOwotICAgICAgICBhc3NlcnRQdWJsaWMoRzApOwotICAgICAgICBEZXhBbm5vdGF0aW9uIHNpZyA9IGdldEFubm90YXRpb24oRzAsIExEQUxWSUtfQU5OT1RBVElPTl9TSUdOQVRVUkUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc2lnLmdldEF0dHJpYnV0ZXMoKS5zaXplKCkpOwotICAgICAgICBEZXhBbm5vdGF0aW9uQXR0cmlidXRlIGRleEFubm90YXRpb25WYWx1ZSA9IHNpZy5nZXRBdHRyaWJ1dGVzKCkuZ2V0KDApOwotICAgICAgICBhc3NlcnROb3ROdWxsKGRleEFubm90YXRpb25WYWx1ZS5nZXRFbmNvZGVkVmFsdWUoKSk7Ci0gICAgICAgIE9iamVjdCB2YWx1ZSA9IGRleEFubm90YXRpb25WYWx1ZS5nZXRFbmNvZGVkVmFsdWUoKS5nZXRWYWx1ZSgpOwotICAgICAgICBhc3NlcnRUcnVlKHZhbHVlIGluc3RhbmNlb2YgTGlzdCk7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGZvciAoT2JqZWN0IG8gOiAoTGlzdDw/Pil2YWx1ZSkgewotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoKChEZXhFbmNvZGVkVmFsdWUpbykuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy9GSVhNRSB2ZXJpZnkKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI8VDpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvbGFuZy9PYmplY3Q7IiwgYnVpbGRlci50b1N0cmluZygpKTsKLSAgICB9Ci0gICAgCi0gICAgc3RhdGljIGZpbmFsIEphdmFTb3VyY2UgRzEgPSBuZXcgSmF2YVNvdXJjZSgiRzEiLCJwdWJsaWMgY2xhc3MgRzE8VCBleHRlbmRzIEcxPnt9Iik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdHMgcGFyc2luZyBHZW5lcmljIFR5cGUuCi0gICAgICovCi0gICAgQFRlc3QgCi0gICAgcHVibGljIHZvaWQgdGVzdEcxKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgRGV4RmlsZSBkZXhGaWxlID0gamF2YVRvRGV4VXRpbC5nZXRGcm9tKEcxKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGRleEZpbGUuZ2V0RGVmaW5lZENsYXNzZXMoKS5zaXplKCkpOwotICAgICAgICBEZXhDbGFzcyBHMSA9IGdldENsYXNzKGRleEZpbGUsICJMRzE7Iik7Ci0gICAgICAgIGFzc2VydFB1YmxpYyhHMSk7Ci0gICAgICAgIERleEFubm90YXRpb24gc2lnID0gZ2V0QW5ub3RhdGlvbihHMSwgTERBTFZJS19BTk5PVEFUSU9OX1NJR05BVFVSRSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBzaWcuZ2V0QXR0cmlidXRlcygpLnNpemUoKSk7Ci0gICAgICAgIERleEFubm90YXRpb25BdHRyaWJ1dGUgZGV4QW5ub3RhdGlvblZhbHVlID0gc2lnLmdldEF0dHJpYnV0ZXMoKS5nZXQoMCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZGV4QW5ub3RhdGlvblZhbHVlLmdldEVuY29kZWRWYWx1ZSgpKTsKLSAgICAgICAgT2JqZWN0IHZhbHVlID0gZGV4QW5ub3RhdGlvblZhbHVlLmdldEVuY29kZWRWYWx1ZSgpLmdldFZhbHVlKCk7Ci0gICAgICAgIGFzc2VydFRydWUodmFsdWUgaW5zdGFuY2VvZiBMaXN0KTsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgZm9yIChPYmplY3QgbyA6IChMaXN0PD8+KXZhbHVlKSB7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgoKERleEVuY29kZWRWYWx1ZSlvKS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgfQotICAgICAgICAvL0ZJWE1FIHZlcmlmeQotICAgICAgICBhc3NlcnRFcXVhbHMoIjxUOkxHMTs+TGphdmEvbGFuZy9PYmplY3Q7IiwgYnVpbGRlci50b1N0cmluZygpKTsKLSAgICB9Ci0gICAgCi0KLSAgICAKLSAgICBzdGF0aWMgZmluYWwgSmF2YVNvdXJjZSBJMCA9IG5ldyBKYXZhU291cmNlKCJJMCIsCi0gICAgImltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsiICsgCi0gICAgInB1YmxpYyBpbnRlcmZhY2UgSTAgZXh0ZW5kcyBTZXJpYWxpemFibGUge30iCi0gICAgKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0cyBwYXJzaW5nIEludGVyZmFjZSBUeXBlLgotICAgICAqLwotICAgIEBUZXN0ICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0STAoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBEZXhGaWxlIGRleEZpbGUgPSBqYXZhVG9EZXhVdGlsLmdldEZyb20oSTApOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZGV4RmlsZS5nZXREZWZpbmVkQ2xhc3NlcygpLnNpemUoKSk7Ci0gICAgICAgIERleENsYXNzIEkwID0gZ2V0Q2xhc3MoZGV4RmlsZSwgIkxJMDsiKTsKLSAgICAgICAgYXNzZXJ0UHVibGljKEkwKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShNb2RpZmllci5pc0ludGVyZmFjZShJMC5nZXRNb2RpZmllcnMoKSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgIEkwLmdldEludGVyZmFjZXMoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkxqYXZhL2lvL1NlcmlhbGl6YWJsZTsiLCAgSTAuZ2V0SW50ZXJmYWNlcygpLmdldCgwKSk7Ci0gICAgfQotICAgIAotICAgIAotICAgIHN0YXRpYyBmaW5hbCBKYXZhU291cmNlIE91dGVyMCA9IG5ldyBKYXZhU291cmNlKCJPdXRlcjAiLAotICAgICJwdWJsaWMgY2xhc3MgT3V0ZXIwIHsiICsgCi0gICAgIiAgICBzdGF0aWMgY2xhc3MgU3RhdGljSW5uZXIge30iICsgCi0gICAgIiAgICBjbGFzcyBJbm5lcnt9IiArIAotICAgICJ9IgotICAgICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdHMgcGFyc2luZyBJbnRlcmZhY2UgVHlwZS4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgQFRlc3QgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RPdXRlcjAoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBEZXhGaWxlIGRleEZpbGUgPSBqYXZhVG9EZXhVdGlsLmdldEZyb20odG9TZXQoT3V0ZXIwKSwgdG9TdHJpbmdTZXQoIk91dGVyMCIsICJPdXRlcjAkSW5uZXIiLCAiT3V0ZXIwJFN0YXRpY0lubmVyIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMywgZGV4RmlsZS5nZXREZWZpbmVkQ2xhc3NlcygpLnNpemUoKSk7Ci0gICAgICAgIERleENsYXNzIE91dGVyMCA9IGdldENsYXNzKGRleEZpbGUsICJMT3V0ZXIwOyIpOwotICAgICAgICBEZXhBbm5vdGF0aW9uIHNpZyA9IGdldEFubm90YXRpb24oT3V0ZXIwLCAiTGRhbHZpay9hbm5vdGF0aW9uL01lbWJlckNsYXNzZXM7Iik7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBzaWcuZ2V0QXR0cmlidXRlcygpLnNpemUoKSk7Ci0gICAgICAgIERleEFubm90YXRpb25BdHRyaWJ1dGUgZGV4QW5ub3RhdGlvblZhbHVlID0gc2lnLmdldEF0dHJpYnV0ZXMoKS5nZXQoMCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZGV4QW5ub3RhdGlvblZhbHVlLmdldEVuY29kZWRWYWx1ZSgpKTsKLSAgICAgICAgTGlzdDxEZXhFbmNvZGVkVmFsdWU+IHZhbHVlcyA9IChMaXN0PERleEVuY29kZWRWYWx1ZT4pIGRleEFubm90YXRpb25WYWx1ZS5nZXRFbmNvZGVkVmFsdWUoKS5nZXRWYWx1ZSgpOwotICAgICAgICBTZXQ8U3RyaW5nPiBpbm5lclR5cGVOYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgZm9yIChEZXhFbmNvZGVkVmFsdWUgdmFsdWUgOiB2YWx1ZXMpIHsKLSAgICAgICAgICAgIGlubmVyVHlwZU5hbWVzLmFkZCgoU3RyaW5nKSB2YWx1ZS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgfQotICAgICAgICBEZXhDbGFzcyBpbm5lciA9IGdldENsYXNzKGRleEZpbGUsICJMT3V0ZXIwJElubmVyOyIpOwotICAgICAgICBEZXhDbGFzcyBzdGF0aWNJbm5lciA9IGdldENsYXNzKGRleEZpbGUsICJMT3V0ZXIwJFN0YXRpY0lubmVyOyIpOwotICAgICAgICBhc3NlcnRUcnVlKGlubmVyVHlwZU5hbWVzLmNvbnRhaW5zKGlubmVyLmdldE5hbWUoKSkpOwotICAgICAgICBhc3NlcnRUcnVlKGlubmVyVHlwZU5hbWVzLmNvbnRhaW5zKHN0YXRpY0lubmVyLmdldE5hbWUoKSkpOwotICAgIH0KLSAgICAKLSAgICBzdGF0aWMgZmluYWwgSmF2YVNvdXJjZSBwYXJhbWV0ZXJBbm5vdGF0aW9uID0gbmV3IEphdmFTb3VyY2UoIkEiLAotICAgICAgICAgICAgInB1YmxpYyBjbGFzcyBBIHsiICsgCi0gICAgICAgICAgICAiICB2b2lkIG0oQERlcHJlY2F0ZWQgaW50IGEpIHt9IiArIAotICAgICAgICAgICAgIn0iKTsKLQotICAgIC8qKgotICAgICAqIFRlc3RzIHBhcmFtZXRlciBhbm5vdGF0aW9uLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJhbWV0ZXJBbm5vdGF0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgRGV4RmlsZSBkZXhGaWxlID0gamF2YVRvRGV4VXRpbC5nZXRGcm9tKHBhcmFtZXRlckFubm90YXRpb24pOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZGV4RmlsZS5nZXREZWZpbmVkQ2xhc3NlcygpLnNpemUoKSk7Ci0gICAgICAgIERleENsYXNzIEEgPSBnZXRDbGFzcyhkZXhGaWxlLCAiTEE7Iik7Ci0KLSAgICAgICAgRGV4TWV0aG9kIG1ldGhvZCA9IGdldE1ldGhvZChBLCAibSIsICJJIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBtZXRob2QuZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7Ci0gICAgICAgIERleFBhcmFtZXRlciBkZXhQYXJhbWV0ZXIgPSBtZXRob2QuZ2V0UGFyYW1ldGVycygpLmdldCgwKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJJIiwgZGV4UGFyYW1ldGVyLmdldFR5cGVOYW1lKCkpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBkZXhQYXJhbWV0ZXIuZ2V0QW5ub3RhdGlvbnMoKS5zaXplKCkpOwotICAgICAgICBEZXhBbm5vdGF0aW9uIGFubm90YXRpb24gPSBkZXhQYXJhbWV0ZXIuZ2V0QW5ub3RhdGlvbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJMamF2YS9sYW5nL0RlcHJlY2F0ZWQ7IiwgYW5ub3RhdGlvbi5nZXRUeXBlTmFtZSgpKTsKLSAgICB9Ci0gICAgCi0gICAgQFRlc3QgCi0gICAgcHVibGljIHZvaWQgdGVzdEVudW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBKYXZhU291cmNlIHNvdXJjZSA9IG5ldyBKYXZhU291cmNlKCJFIiwgInB1YmxpYyBlbnVtIEUgeyBBLEI7IHB1YmxpYyBzdGF0aWMgZmluYWwgRSBDID0gbnVsbDsgfSIpOwotICAgICAgICBEZXhGaWxlIGRleEZpbGUgPSBqYXZhVG9EZXhVdGlsLmdldEZyb20oc291cmNlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGRleEZpbGUuZ2V0RGVmaW5lZENsYXNzZXMoKS5zaXplKCkpOwotICAgICAgICBEZXhDbGFzcyBFID0gZ2V0Q2xhc3MoZGV4RmlsZSwgIkxFOyIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oRSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihFLmdldEZpZWxkcygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyBwYXJzaW5nIG9mIGh1Z2UgZGV4IGZpbGUuIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBAVGVzdCAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWxsUmVhZGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZVdyaXRlciB3ID0gbmV3IEZpbGVXcml0ZXIoImRleC9jbGFzc2VzLm91dC5kZXgiKTsKLSAgICAgICAgRGV4RmlsZVJlYWRlciBkZXhSZWFkZXIgPSBuZXcgRGV4RmlsZVJlYWRlcigpOwotICAgICAgICBEZXhGaWxlIGRleEZpbGUgPSBkZXhSZWFkZXIucmVhZChuZXcgRGV4QnVmZmVyKCJkZXgvY2xhc3Nlcy5kZXgiKSk7Ci0gICAgICAgIFR5cGVGb3JtYXR0ZXIgZm9ybWF0dGVyID0gbmV3IFR5cGVGb3JtYXR0ZXIoKTsKLSAgICAgICAgdy5hcHBlbmQoZm9ybWF0dGVyLmZvcm1hdERleEZpbGUoZGV4RmlsZSkpOwotICAgICAgICB3LmZsdXNoKCk7Ci0gICAgICAgIHcuY2xvc2UoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh0cnVlKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdHMgcGFyc2luZyBvZiBodWdlIGRleCBmaWxlLiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgQFRlc3QgCi0gICAgcHVibGljIHZvaWQgdGVzdEFsbFJlYWRlcjAoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBGaWxlV3JpdGVyIHcgPSBuZXcgRmlsZVdyaXRlcigiZGV4L2NsYXNzZXMwLm91dC5kZXgiKTsKLSAgICAgICAgRGV4RmlsZVJlYWRlciBkZXhSZWFkZXIgPSBuZXcgRGV4RmlsZVJlYWRlcigpOwotICAgICAgICBEZXhGaWxlIGRleEZpbGUgPSBkZXhSZWFkZXIucmVhZChuZXcgRGV4QnVmZmVyKCJkZXgvY2xhc3NlczAuZGV4IikpOwotICAgICAgICBUeXBlRm9ybWF0dGVyIGZvcm1hdHRlciA9IG5ldyBUeXBlRm9ybWF0dGVyKCk7Ci0gICAgICAgIHcuYXBwZW5kKGZvcm1hdHRlci5mb3JtYXREZXhGaWxlKGRleEZpbGUpKTsKLSAgICAgICAgdy5mbHVzaCgpOwotICAgICAgICB3LmNsb3NlKCk7Ci0gICAgICAgIGFzc2VydFRydWUodHJ1ZSk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGV4LXRvb2xzL3Rlc3QvZGV4L3JlYWRlci9EZXhUZXN0c0NvbW1vbi5qYXZhIGIvdG9vbHMvZGV4LXRvb2xzL3Rlc3QvZGV4L3JlYWRlci9EZXhUZXN0c0NvbW1vbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWMzODk4Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RleC10b29scy90ZXN0L2RleC9yZWFkZXIvRGV4VGVzdHNDb21tb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBkZXgucmVhZGVyOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7Ci0KLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLQotaW1wb3J0IGRleC5yZWFkZXIudXRpbC5KYXZhU291cmNlVG9EZXhVdGlsOwotaW1wb3J0IGRleC5zdHJ1Y3R1cmUuRGV4QW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBkZXguc3RydWN0dXJlLkRleEFubm90YXRpb247Ci1pbXBvcnQgZGV4LnN0cnVjdHVyZS5EZXhDbGFzczsKLWltcG9ydCBkZXguc3RydWN0dXJlLkRleEZpZWxkOwotaW1wb3J0IGRleC5zdHJ1Y3R1cmUuRGV4RmlsZTsKLWltcG9ydCBkZXguc3RydWN0dXJlLkRleE1ldGhvZDsKLWltcG9ydCBkZXguc3RydWN0dXJlLkRleFBhcmFtZXRlcjsKLWltcG9ydCBkZXguc3RydWN0dXJlLldpdGhNb2RpZmllcnM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBEZXhUZXN0c0NvbW1vbiB7Ci0gICAgCi0gICAgcHJvdGVjdGVkIEphdmFTb3VyY2VUb0RleFV0aWwgamF2YVRvRGV4VXRpbDsKLQotICAgIEBCZWZvcmUKLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplSmF2YVRvRGV4VXRpbCgpIHsKLSAgICAgICAgamF2YVRvRGV4VXRpbCA9IG5ldyBKYXZhU291cmNlVG9EZXhVdGlsKCk7Ci0gICAgfQotICAgIAotICAgIEBBZnRlcgotICAgIHB1YmxpYyB2b2lkIHNodXRkb3duSmF2YVRvRGV4VXRpbCgpIHsKLSAgICAgICAgamF2YVRvRGV4VXRpbCA9IG51bGw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRQdWJsaWMoV2l0aE1vZGlmaWVycyB3aXRoTW9kKSB7Ci0gICAgICAgIGFzc2VydFRydWUoTW9kaWZpZXIuaXNQdWJsaWMod2l0aE1vZC5nZXRNb2RpZmllcnMoKSkpOwotICAgICAgICBhc3NlcnRGYWxzZShNb2RpZmllci5pc1ByaXZhdGUod2l0aE1vZC5nZXRNb2RpZmllcnMoKSkKLSAgICAgICAgICAgICAgICB8fCBNb2RpZmllci5pc1Byb3RlY3RlZCh3aXRoTW9kLmdldE1vZGlmaWVycygpKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRQcm90ZWN0ZWQoV2l0aE1vZGlmaWVycyB3aXRoTW9kKSB7Ci0gICAgICAgIGFzc2VydFRydWUoTW9kaWZpZXIuaXNQcm90ZWN0ZWQod2l0aE1vZC5nZXRNb2RpZmllcnMoKSkpOwotICAgICAgICBhc3NlcnRGYWxzZShNb2RpZmllci5pc1ByaXZhdGUod2l0aE1vZC5nZXRNb2RpZmllcnMoKSkKLSAgICAgICAgICAgICAgICB8fCBNb2RpZmllci5pc1B1YmxpYyh3aXRoTW9kLmdldE1vZGlmaWVycygpKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRQcml2YXRlKFdpdGhNb2RpZmllcnMgd2l0aE1vZCkgewotICAgICAgICBhc3NlcnRUcnVlKE1vZGlmaWVyLmlzUHJpdmF0ZSh3aXRoTW9kLmdldE1vZGlmaWVycygpKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKE1vZGlmaWVyLmlzUHJvdGVjdGVkKHdpdGhNb2QuZ2V0TW9kaWZpZXJzKCkpCi0gICAgICAgICAgICAgICAgfHwgTW9kaWZpZXIuaXNQdWJsaWMod2l0aE1vZC5nZXRNb2RpZmllcnMoKSkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0RGVmYXVsdChXaXRoTW9kaWZpZXJzIHdpdGhNb2QpIHsKLSAgICAgICAgYXNzZXJ0RmFsc2UoTW9kaWZpZXIuaXNQcml2YXRlKHdpdGhNb2QuZ2V0TW9kaWZpZXJzKCkpCi0gICAgICAgICAgICAgICAgfHwgTW9kaWZpZXIuaXNQcm90ZWN0ZWQod2l0aE1vZC5nZXRNb2RpZmllcnMoKSkKLSAgICAgICAgICAgICAgICB8fCBNb2RpZmllci5pc1B1YmxpYyh3aXRoTW9kLmdldE1vZGlmaWVycygpKSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBkZXggZmlsZSBmcm9tIHRoZSBzcGVjaWZpZWQgZmlsZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZmlsZU5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gcmVhZAotICAgICAqIEByZXR1cm4gdGhlIGRleCBmaWxlCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgZmlsZSBpcyBub3QgYWNjZXNzaWJsZQotICAgICAqLwotICAgIHByb3RlY3RlZCBEZXhGaWxlIHByZXBhcmVEZXhGaWxlKFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uewotICAgICAgICBEZXhGaWxlUmVhZGVyIGRleFJlYWRlciA9IG5ldyBEZXhGaWxlUmVhZGVyKCk7Ci0gICAgICAgIHJldHVybiAgZGV4UmVhZGVyLnJlYWQobmV3IERleEJ1ZmZlcihmaWxlTmFtZSkpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgRGV4Q2xhc3MgZ2V0Q2xhc3MoRGV4RmlsZSBmaWxlLCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZmlsZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoY2xhc3NOYW1lKTsKLSAgICAgICAgZm9yIChEZXhDbGFzcyBjbGF6eiA6IGZpbGUuZ2V0RGVmaW5lZENsYXNzZXMoKSkgewotICAgICAgICAgICAgaWYoY2xhc3NOYW1lLmVxdWFscyhjbGF6ei5nZXROYW1lKCkpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gY2xheno7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmFpbCgiQ2xhc3M6ICIgKyBjbGFzc05hbWUgKyIgbm90IHByZXNlbnQgaW4gZmlsZTogIiArIGZpbGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2xhc3M6ICIgKyBjbGFzc05hbWUgKyIgbm90IHByZXNlbnQgaW4gZmlsZTogIiArIGZpbGUuZ2V0TmFtZSgpKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIERleEZpZWxkIGdldEZpZWxkKERleENsYXNzIGNsYXp6LCBTdHJpbmcgZmllbGROYW1lKSB7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoY2xhenopOwotICAgICAgICBhc3NlcnROb3ROdWxsKGZpZWxkTmFtZSk7Ci0gICAgICAgIGZvciAoRGV4RmllbGQgZmllbGQgOiBjbGF6ei5nZXRGaWVsZHMoKSkgewotICAgICAgICAgICAgaWYoZmllbGROYW1lLmVxdWFscyhmaWVsZC5nZXROYW1lKCkpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmllbGQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmFpbCgiRmllbGQ6ICIgKyBmaWVsZE5hbWUgKyIgbm90IHByZXNlbnQgaW4gY2xhc3M6ICIgKyBjbGF6ei5nZXROYW1lKCkpOwotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJGaWVsZDogIiArIGZpZWxkTmFtZSArIiBub3QgcHJlc2VudCBpbiBjbGFzczogIiArIGNsYXp6LmdldE5hbWUoKSk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBEZXhBbm5vdGF0aW9uIGdldEFubm90YXRpb24oRGV4QW5ub3RhdGVkRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgYW5ub3RhdGlvblR5cGUpIHsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlbGVtZW50KTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uVHlwZSk7Ci0gICAgICAgIGZvciAoRGV4QW5ub3RhdGlvbiBhbm5vIDogZWxlbWVudC5nZXRBbm5vdGF0aW9ucygpKSB7Ci0gICAgICAgICAgICBpZihhbm5vdGF0aW9uVHlwZS5lcXVhbHMoYW5uby5nZXRUeXBlTmFtZSgpKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFubm87Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmFpbCgiQW5ub3RhdGlvbjogIiArIGFubm90YXRpb25UeXBlICsiIG5vdCBwcmVzZW50IGluIEVsZW1lbnQuIik7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkFubm90YXRpb246ICIgKyBhbm5vdGF0aW9uVHlwZSArIiBub3QgcHJlc2VudCBpbiBFbGVtZW50LiIpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgRGV4TWV0aG9kIGdldE1ldGhvZChEZXhDbGFzcyBjbGF6eiwgU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZy4uLiB0eXBlTmFtZXMpIHsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChjbGF6eik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwobWV0aG9kTmFtZSk7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBwYXJhbVR5cGVOYW1lcyA9IEFycmF5cy5hc0xpc3QodHlwZU5hbWVzKTsKLSAgICAgICAgZm9yIChEZXhNZXRob2QgbWV0aG9kIDogY2xhenouZ2V0TWV0aG9kcygpKSB7Ci0gICAgICAgICAgICBMaXN0PFN0cmluZz4gbWV0aG9kc1BhcmFtVHlwZU5hbWVzID0gZ2V0UGFyYW1UeXBlTmFtZXMobWV0aG9kLmdldFBhcmFtZXRlcnMoKSk7Ci0gICAgICAgICAgICBpZihtZXRob2ROYW1lLmVxdWFscyhtZXRob2QuZ2V0TmFtZSgpKSAmJiBwYXJhbVR5cGVOYW1lcy5lcXVhbHMobWV0aG9kc1BhcmFtVHlwZU5hbWVzKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmYWlsKCJNZXRob2Q6ICIgKyBtZXRob2ROYW1lICsiIG5vdCBwcmVzZW50IGluIGNsYXNzOiAiICsgY2xhenouZ2V0TmFtZSgpKTsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTWV0aG9kOiAiICsgbWV0aG9kTmFtZSArIiBub3QgcHJlc2VudCBpbiBjbGFzczogIiArIGNsYXp6LmdldE5hbWUoKSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGdldFBhcmFtVHlwZU5hbWVzKExpc3Q8RGV4UGFyYW1ldGVyPiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBwYXJhbVR5cGVOYW1lcyA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgZm9yIChEZXhQYXJhbWV0ZXIgcGFyYW1ldGVyIDogcGFyYW1ldGVycykgewotICAgICAgICAgICAgcGFyYW1UeXBlTmFtZXMuYWRkKHBhcmFtZXRlci5nZXRUeXBlTmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcGFyYW1UeXBlTmFtZXM7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90b29scy9kZXgtdG9vbHMvdGVzdC9kZXgvcmVhZGVyL0xhcmdlRGV4VGVzdHMuamF2YSBiL3Rvb2xzL2RleC10b29scy90ZXN0L2RleC9yZWFkZXIvTGFyZ2VEZXhUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGQzOTkzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RleC10b29scy90ZXN0L2RleC9yZWFkZXIvTGFyZ2VEZXhUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgZGV4LnJlYWRlcjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBkZXgucmVhZGVyLnV0aWwuSmF2YVNvdXJjZTsKLWltcG9ydCBkZXguc3RydWN0dXJlLkRleENsYXNzOwotaW1wb3J0IGRleC5zdHJ1Y3R1cmUuRGV4RmlsZTsKLQotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIExhcmdlRGV4VGVzdHMgZXh0ZW5kcyBEZXhUZXN0c0NvbW1vbnsKLSAgIAotICAgIC8qKgotICAgICAqIFRlc3RzIHBhcnNpbmcgYSBjbGFzcyB3aXRoIDEwMDAwIEZpZWxkcy4KLSAgICAgKi8KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RNYW55RmllbGRzKCkgdGhyb3dzIElPRXhjZXB0aW9uewotICAgICAgICBTdHJpbmcgQ0xBU1NfTkFNRSA9ICJMMCI7Ci0gICAgICAgIGludCBOUl9PRl9GSUVMRFMgPSAxMDAwMDsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoQ0xBU1NfTkFNRSkuYXBwZW5kKCJ7XG4iKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOUl9PRl9GSUVMRFM7IGkrKykgewotICAgICAgICAgICAgYi5hcHBlbmQoIlx0cHVibGljIGludCBmIikuYXBwZW5kKGkpLmFwcGVuZCgiO1xuIik7Ci0gICAgICAgIH0KLSAgICAgICAgYi5hcHBlbmQoIn1cbiIpOwotICAgICAgICAKLSAgICAgICAgSmF2YVNvdXJjZSBzb3VyY2UgPSBuZXcgSmF2YVNvdXJjZShDTEFTU19OQU1FLCBiLnRvU3RyaW5nKCkpOwotICAgICAgICBEZXhGaWxlIGRleEZpbGUgPSBqYXZhVG9EZXhVdGlsLmdldEZyb20oc291cmNlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGRleEZpbGUuZ2V0RGVmaW5lZENsYXNzZXMoKS5zaXplKCkpOwotICAgICAgICBEZXhDbGFzcyBjbGF6eiA9IGRleEZpbGUuZ2V0RGVmaW5lZENsYXNzZXMoKS5nZXQoMCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiTEwwOyIsIGNsYXp6LmdldE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydFB1YmxpYyhjbGF6eik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhOUl9PRl9GSUVMRFMsIGNsYXp6LmdldEZpZWxkcygpLnNpemUoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGV4LXRvb2xzL3Rlc3QvZGV4L3JlYWRlci91dGlsL0phdmFTb3VyY2UuamF2YSBiL3Rvb2xzL2RleC10b29scy90ZXN0L2RleC9yZWFkZXIvdXRpbC9KYXZhU291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMTdmNTIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGV4LXRvb2xzL3Rlc3QvZGV4L3JlYWRlci91dGlsL0phdmFTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGRleC5yZWFkZXIudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci0KLWltcG9ydCBqYXZheC50b29scy5TaW1wbGVKYXZhRmlsZU9iamVjdDsKLQotLyoqCi0gKiB7QGNvZGUgSmF2YVNvdXJjZX0gcmVwcmVzZW50cyBhbiBpbi1tZW1vcnkgamF2YSBzb3VyY2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhU291cmNlIGV4dGVuZHMgU2ltcGxlSmF2YUZpbGVPYmplY3QgewotICAgIHByaXZhdGUgU3RyaW5nIHNyYzsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBzb3VyY2VOYW1lOwotCi0gICAgcHVibGljIEphdmFTb3VyY2UoU3RyaW5nIHNvdXJjZU5hbWUsIFN0cmluZyBzb3VyY2VDb2RlKSB7Ci0gICAgICAgIHN1cGVyKFVSSS5jcmVhdGUoInN0cmluZzovLy8iICsgc291cmNlTmFtZS5yZXBsYWNlKCIuIiwgIi8iKSArICIuamF2YSIpLAotICAgICAgICAgICAgICAgIEtpbmQuU09VUkNFKTsKLSAgICAgICAgdGhpcy5zb3VyY2VOYW1lID0gc291cmNlTmFtZTsKLSAgICAgICAgdGhpcy5zcmMgPSBzb3VyY2VDb2RlOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgcmV0dXJuIHNvdXJjZU5hbWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0Q2hhckNvbnRlbnQoYm9vbGVhbiBpZ25vcmVFbmNvZGluZ0Vycm9ycykgewotICAgICAgICByZXR1cm4gc3JjOwotICAgIH0KLQotICAgIHB1YmxpYyBPdXRwdXRTdHJlYW0gb3Blbk91dHB1dFN0cmVhbSgpIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBvcGVuSW5wdXRTdHJlYW0oKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oc3JjLmdldEJ5dGVzKCkpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9kZXgtdG9vbHMvdGVzdC9kZXgvcmVhZGVyL3V0aWwvSmF2YVNvdXJjZVRvRGV4VXRpbC5qYXZhIGIvdG9vbHMvZGV4LXRvb2xzL3Rlc3QvZGV4L3JlYWRlci91dGlsL0phdmFTb3VyY2VUb0RleFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAzN2I5NS4uMDAwMDAwMAotLS0gYS90b29scy9kZXgtdG9vbHMvdGVzdC9kZXgvcmVhZGVyL3V0aWwvSmF2YVNvdXJjZVRvRGV4VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGRleC5yZWFkZXIudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmF4LnRvb2xzLkRpYWdub3N0aWM7Ci1pbXBvcnQgamF2YXgudG9vbHMuRGlhZ25vc3RpY0NvbGxlY3RvcjsKLWltcG9ydCBqYXZheC50b29scy5KYXZhQ29tcGlsZXI7Ci1pbXBvcnQgamF2YXgudG9vbHMuSmF2YUZpbGVPYmplY3Q7Ci1pbXBvcnQgamF2YXgudG9vbHMuU3RhbmRhcmRKYXZhRmlsZU1hbmFnZXI7Ci1pbXBvcnQgamF2YXgudG9vbHMuVG9vbFByb3ZpZGVyOwotaW1wb3J0IGphdmF4LnRvb2xzLkphdmFDb21waWxlci5Db21waWxhdGlvblRhc2s7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5keC5kZXguY2YuQ2ZPcHRpb25zOwotaW1wb3J0IGNvbS5hbmRyb2lkLmR4LmRleC5jZi5DZlRyYW5zbGF0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZHguZGV4LmZpbGUuQ2xhc3NEZWZJdGVtOwotaW1wb3J0IGNvbS5hbmRyb2lkLmR4LmRleC5maWxlLkRleEZpbGU7Ci0KLWltcG9ydCBkZXgucmVhZGVyLkRleEJ1ZmZlcjsKLWltcG9ydCBkZXgucmVhZGVyLkRleEZpbGVSZWFkZXI7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhU291cmNlVG9EZXhVdGlsIHsKLSAgICAKLSAgICBwdWJsaWMgZGV4LnN0cnVjdHVyZS5EZXhGaWxlIGdldEZyb20oSmF2YVNvdXJjZSBzb3VyY2UpIHRocm93cyBJT0V4Y2VwdGlvbnsKLSAgICAgICAgcmV0dXJuIGdldEFsbEZyb20oQ29sbGVjdGlvbnMuc2luZ2xldG9uKHNvdXJjZSkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgZGV4LnN0cnVjdHVyZS5EZXhGaWxlIGdldEZyb20oSmF2YVNvdXJjZS4uLiBzb3VyY2UpIHRocm93cyBJT0V4Y2VwdGlvbnsKLSAgICAgICAgcmV0dXJuIGdldEFsbEZyb20obmV3IEhhc2hTZXQ8SmF2YVNvdXJjZT4oQXJyYXlzLmFzTGlzdChzb3VyY2UpKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBkZXguc3RydWN0dXJlLkRleEZpbGUgZ2V0QWxsRnJvbShTZXQ8SmF2YVNvdXJjZT4gc291cmNlcykgdGhyb3dzIElPRXhjZXB0aW9uewotICAgICAgICByZXR1cm4gZ2V0RnJvbShzb3VyY2VzLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBqYXZhIHNvdXJjZSBjb2RlIHRvIGEge0BsaW5rIGRleC5zdHJ1Y3R1cmUuRGV4RmlsZX0gbG9hZGVkIGJ5Ci0gICAgICoge0BsaW5rIERleEZpbGVSZWFkZXJ9LiBDb252ZXJ0cyBvbmx5IGNsYXNzZXMgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgaW4KLSAgICAgKiBjbGFzc2VzVG9EZXggb3IgYWxsIGNsYXNzZXMgaWYgY2xhc3Nlc1RvRGV4IGlzIG51bGwuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBkZXguc3RydWN0dXJlLkRleEZpbGUgZ2V0RnJvbShTZXQ8SmF2YVNvdXJjZT4gc291cmNlcywKLSAgICAgICAgICAgIFNldDxTdHJpbmc+IGNsYXNzZXNUb0RleCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU2V0PE1lbW9yeUJ5dGVDb2RlPiBieXRlQ29kZUluTWVtb3J5ID0gY29tcGlsZVRvQnl0ZUNvZGUoc291cmNlcyk7Ci0KLSAgICAgICAgYnl0ZVtdIGRleENvZGUgPSBjb252ZXJ0VG9EZXhDb2RlKGJ5dGVDb2RlSW5NZW1vcnksIGNsYXNzZXNUb0RleCk7Ci0gICAgICAgIERleEJ1ZmZlciBkZXhCdWZmZXIgPSBuZXcgRGV4QnVmZmVyKGRleENvZGUpOwotICAgICAgICBEZXhGaWxlUmVhZGVyIHJlYWRlciA9IG5ldyBEZXhGaWxlUmVhZGVyKCk7Ci0gICAgICAgIHJldHVybiByZWFkZXIucmVhZChkZXhCdWZmZXIpOwotICAgIH0KLSAgICAKLQotICAgIHByaXZhdGUgYnl0ZVtdIGNvbnZlcnRUb0RleENvZGUoU2V0PE1lbW9yeUJ5dGVDb2RlPiBieXRlQ29kZUluTWVtb3J5LCBTZXQ8U3RyaW5nPiBjbGFzc05hbWVzVG9EZXgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIENmT3B0aW9ucyBjZk9wdGlvbnMgPSBuZXcgQ2ZPcHRpb25zKCk7Ci0gICAgICAgIERleEZpbGUgZGV4RmlsZSA9IG5ldyBEZXhGaWxlKCk7Ci0gICAgICAgIGZvciAoTWVtb3J5Qnl0ZUNvZGUgbWVtb3J5Qnl0ZUNvZGUgOiBieXRlQ29kZUluTWVtb3J5KSB7Ci0gICAgICAgICAgICBpZihjbGFzc05hbWVzVG9EZXggPT0gbnVsbCB8fCBjbGFzc05hbWVzVG9EZXguY29udGFpbnMobWVtb3J5Qnl0ZUNvZGUuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgQ2xhc3NEZWZJdGVtIGNsYXNzRGVmSXRlbSA9IENmVHJhbnNsYXRvci50cmFuc2xhdGUobWVtb3J5Qnl0ZUNvZGUuZ2V0TmFtZSgpLnJlcGxhY2UoJy4nLCAnLycpICsiLmNsYXNzIiwgbWVtb3J5Qnl0ZUNvZGUuZ2V0Qnl0ZXMoKSwgY2ZPcHRpb25zKTsKLSAgICAgICAgICAgIGRleEZpbGUuYWRkKGNsYXNzRGVmSXRlbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRleEZpbGUudG9EZXgobnVsbCwgZmFsc2UpOwotICAgIH0KLQotCi0gICAgcHVibGljIFNldDxNZW1vcnlCeXRlQ29kZT4gY29tcGlsZVRvQnl0ZUNvZGUoU2V0PEphdmFTb3VyY2U+IHNvdXJjZSkgewotICAgICAgICBKYXZhQ29tcGlsZXIgamF2YWMgPSBUb29sUHJvdmlkZXIuZ2V0U3lzdGVtSmF2YUNvbXBpbGVyKCk7Ci0gICAgICAgIERpYWdub3N0aWNDb2xsZWN0b3I8SmF2YUZpbGVPYmplY3Q+IGRpYWNvbCA9IG5ldyBEaWFnbm9zdGljQ29sbGVjdG9yPEphdmFGaWxlT2JqZWN0PigpOwotICAgICAgICBTdGFuZGFyZEphdmFGaWxlTWFuYWdlciBzamZtID0gamF2YWMuZ2V0U3RhbmRhcmRGaWxlTWFuYWdlcihkaWFjb2wsCi0gICAgICAgICAgICAgICAgbnVsbCwgbnVsbCk7Ci0gICAgICAgIFNwZWNpYWxKYXZhRmlsZU1hbmFnZXIgeGZtID0gbmV3IFNwZWNpYWxKYXZhRmlsZU1hbmFnZXIoc2pmbSk7Ci0gICAgICAgIAotICAgICAgICBDb21waWxhdGlvblRhc2sgY29tcGlsZSA9IGphdmFjLmdldFRhc2sobnVsbCwgeGZtLCBkaWFjb2wsIEFycmF5cwotICAgICAgICAgICAgICAgIC5hc0xpc3QobmV3IFN0cmluZ1tdIHsiLWNsYXNzcGF0aCIsICIuIn0pLCBudWxsLCBzb3VyY2UpOwotICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSBjb21waWxlLmNhbGwoKTsKLSAgICAgICAgaWYoIXN1Y2Nlc3MpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBlcnJvck1lc3NhZ2UgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgZm9yIChEaWFnbm9zdGljPD8gZXh0ZW5kcyBKYXZhRmlsZU9iamVjdD4gZGlhIDogZGlhY29sLmdldERpYWdub3N0aWNzKCkpIHsKLSAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UuYXBwZW5kKGRpYSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGVycm9yTWVzc2FnZS50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4geGZtLmdldEFsbE1lbW9yeUJ5dGVDb2RlcygpOwotICAgIH0KLX0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RleC10b29scy90ZXN0L2RleC9yZWFkZXIvdXRpbC9NZW1vcnlCeXRlQ29kZS5qYXZhIGIvdG9vbHMvZGV4LXRvb2xzL3Rlc3QvZGV4L3JlYWRlci91dGlsL01lbW9yeUJ5dGVDb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NThjYzUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGV4LXRvb2xzL3Rlc3QvZGV4L3JlYWRlci91dGlsL01lbW9yeUJ5dGVDb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBkZXgucmVhZGVyLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLQotaW1wb3J0IGphdmF4LnRvb2xzLlNpbXBsZUphdmFGaWxlT2JqZWN0OwotCi0vKioKLSAqIHtAY29kZSBNZW1vcnlCeXRlQ29kZX0gcmVwcmVzZW50cyBhbiBpbi1tZW1vcnkgamF2YSBieXRlIGNvZGUuCi0gKi8KLS8qIHBhY2thZ2UgKi8gY2xhc3MgTWVtb3J5Qnl0ZUNvZGUgZXh0ZW5kcyBTaW1wbGVKYXZhRmlsZU9iamVjdCB7Ci0gICAgcHJpdmF0ZSBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvczsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotCi0gICAgcHVibGljIE1lbW9yeUJ5dGVDb2RlKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKFVSSS5jcmVhdGUoImJ5dGU6Ly8vIiArIG5hbWUucmVwbGFjZSgiLiIsICIvIikgKyAiLmNsYXNzIiksCi0gICAgICAgICAgICAgICAgS2luZC5DTEFTUyk7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldENoYXJDb250ZW50KGJvb2xlYW4gaWdub3JlRW5jb2RpbmdFcnJvcnMpIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBPdXRwdXRTdHJlYW0gb3Blbk91dHB1dFN0cmVhbSgpIHsKLSAgICAgICAgYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgcmV0dXJuIGJhb3M7Ci0gICAgfQotCi0gICAgcHVibGljIElucHV0U3RyZWFtIG9wZW5JbnB1dFN0cmVhbSgpIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBieXRlW10gZ2V0Qnl0ZXMoKSB7Ci0gICAgICAgIHJldHVybiBiYW9zLnRvQnl0ZUFycmF5KCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGV4LXRvb2xzL3Rlc3QvZGV4L3JlYWRlci91dGlsL1NwZWNpYWxKYXZhRmlsZU1hbmFnZXIuamF2YSBiL3Rvb2xzL2RleC10b29scy90ZXN0L2RleC9yZWFkZXIvdXRpbC9TcGVjaWFsSmF2YUZpbGVNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyODA2NjEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZGV4LXRvb2xzL3Rlc3QvZGV4L3JlYWRlci91dGlsL1NwZWNpYWxKYXZhRmlsZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGRleC5yZWFkZXIudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmF4LnRvb2xzLkZpbGVPYmplY3Q7Ci1pbXBvcnQgamF2YXgudG9vbHMuRm9yd2FyZGluZ0phdmFGaWxlTWFuYWdlcjsKLWltcG9ydCBqYXZheC50b29scy5KYXZhRmlsZU9iamVjdDsKLWltcG9ydCBqYXZheC50b29scy5TdGFuZGFyZEphdmFGaWxlTWFuYWdlcjsKLQotLyoqCi0gKiB7QGNvZGUgU3BlY2lhbEphdmFGaWxlTWFuYWdlcn0gaXMgYSBmaWxlIG1hbmFnZXIgd2hpY2ggcmV0dXJucwotICoge0BsaW5rIE1lbW9yeUJ5dGVDb2RlfSBvYmplY3RzIGZvciBpdHMgb3V0cHV0IGFuZCBrZWVwcyB0cmFjayBvZiB0aGVtLgotICovCi0vKiBwYWNrYWdlICovIGNsYXNzIFNwZWNpYWxKYXZhRmlsZU1hbmFnZXIgZXh0ZW5kcwotICAgICAgICBGb3J3YXJkaW5nSmF2YUZpbGVNYW5hZ2VyPFN0YW5kYXJkSmF2YUZpbGVNYW5hZ2VyPiB7Ci0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE1lbW9yeUJ5dGVDb2RlPiBzdG9yZTsKLQotICAgIHB1YmxpYyBTcGVjaWFsSmF2YUZpbGVNYW5hZ2VyKFN0YW5kYXJkSmF2YUZpbGVNYW5hZ2VyIHNqZm0pIHsKLSAgICAgICAgc3VwZXIoc2pmbSk7Ci0gICAgICAgIHN0b3JlID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNZW1vcnlCeXRlQ29kZT4oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSmF2YUZpbGVPYmplY3QgZ2V0SmF2YUZpbGVGb3JPdXRwdXQoTG9jYXRpb24gbG9jYXRpb24sIFN0cmluZyBuYW1lLAotICAgICAgICAgICAgSmF2YUZpbGVPYmplY3QuS2luZCBraW5kLCBGaWxlT2JqZWN0IHNpYmxpbmcpIHsKLSAgICAgICAgTWVtb3J5Qnl0ZUNvZGUgbWJjID0gbmV3IE1lbW9yeUJ5dGVDb2RlKG5hbWUpOwotICAgICAgICBzdG9yZS5wdXQobmFtZSwgbWJjKTsKLSAgICAgICAgcmV0dXJuIG1iYzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2V0PE1lbW9yeUJ5dGVDb2RlPiBnZXRBbGxNZW1vcnlCeXRlQ29kZXMoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSGFzaFNldDxNZW1vcnlCeXRlQ29kZT4oc3RvcmUudmFsdWVzKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBNZW1vcnlCeXRlQ29kZSBnZXRNZW1vcnlCeXRlQ29kZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0gICAgICAgIHJldHVybiBzdG9yZS5nZXQoY2xhc3NOYW1lKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9qdW5pdC9BbmRyb2lkLm1rIGIvdG9vbHMvanVuaXQvQW5kcm9pZC5tawppbmRleCBiYzUwN2MxLi4wYjU2ZDBlIDEwMDY0NAotLS0gYS90b29scy9qdW5pdC9BbmRyb2lkLm1rCisrKyBiL3Rvb2xzL2p1bml0L0FuZHJvaWQubWsKQEAgLTIwLDQgKzIwLDUgQEAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCiBMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0ganVuaXQKIExPQ0FMX0RFWF9QUkVPUFQgOj0gZmFsc2UKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKIGluY2x1ZGUgJChCVUlMRF9KQVZBX0xJQlJBUlkpCmRpZmYgLS1naXQgYS90b29scy9zZWxpbnV4L1NFTGludXhOZXZlcmFsbG93VGVzdEZyYW1lLnB5IGIvdG9vbHMvc2VsaW51eC9TRUxpbnV4TmV2ZXJhbGxvd1Rlc3RGcmFtZS5weQppbmRleCAyMGUxZWQ0Li4yMGY5NTNmIDEwMDY0NAotLS0gYS90b29scy9zZWxpbnV4L1NFTGludXhOZXZlcmFsbG93VGVzdEZyYW1lLnB5CisrKyBiL3Rvb2xzL3NlbGludXgvU0VMaW51eE5ldmVyYWxsb3dUZXN0RnJhbWUucHkKQEAgLTM1LDEwICszNSwxMyBAQAogICogTmV2ZXJhbGxvdyBSdWxlcyBTRUxpbnV4IHRlc3RzLgogICovCiBwdWJsaWMgY2xhc3MgU0VMaW51eE5ldmVyYWxsb3dSdWxlc1Rlc3QgZXh0ZW5kcyBEZXZpY2VUZXN0Q2FzZSBpbXBsZW1lbnRzIElCdWlsZFJlY2VpdmVyLCBJRGV2aWNlVGVzdCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBfU0VQT0xJQ1lfVkVSU0lPTiA9IDI4OwogICAgIHByaXZhdGUgRmlsZSBzZXBvbGljeUFuYWx5emU7CiAgICAgcHJpdmF0ZSBGaWxlIGRldmljZVBvbGljeUZpbGU7CisgICAgcHJpdmF0ZSBGaWxlIGRldmljZVN5c3RlbVBvbGljeUZpbGU7CiAKICAgICBwcml2YXRlIElCdWlsZEluZm8gbUJ1aWxkOworICAgIHByaXZhdGUgaW50IG1WZW5kb3JTZXBvbGljeVZlcnNpb24gPSAtMTsKIAogICAgIC8qKgogICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC4KQEAgLTY5LDExICs3MiwzMCBAQAogICAgICAgICBzZXBvbGljeUFuYWx5emUuc2V0RXhlY3V0YWJsZSh0cnVlKTsKIAogICAgICAgICBkZXZpY2VQb2xpY3lGaWxlID0gYW5kcm9pZC5zZWN1cml0eS5jdHMuU0VMaW51eEhvc3RUZXN0LmdldERldmljZVBvbGljeUZpbGUobURldmljZSk7CisKKyAgICAgICAgaWYgKGlzU2Vwb2xpY3lTcGxpdCgpKSB7CisgICAgICAgICAgICBkZXZpY2VTeXN0ZW1Qb2xpY3lGaWxlID0KKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5zZWN1cml0eS5jdHMuU0VMaW51eEhvc3RUZXN0LmdldERldmljZVN5c3RlbVBvbGljeUZpbGUobURldmljZSk7CisKKyAgICAgICAgICAgIC8vIENhY2hpbmcgdGhpcyB2YXJpYWJsZSB0byBzYXZlIHRpbWUuCisgICAgICAgICAgICBpZiAobVZlbmRvclNlcG9saWN5VmVyc2lvbiA9PSAtMSkgeworICAgICAgICAgICAgICAgIG1WZW5kb3JTZXBvbGljeVZlcnNpb24gPQorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5zZWN1cml0eS5jdHMuU0VMaW51eEhvc3RUZXN0LmdldFZlbmRvclNlcG9saWN5VmVyc2lvbihtRGV2aWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgYm9vbGVhbiBpc0Z1bGxUcmVibGVEZXZpY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIGFuZHJvaWQuc2VjdXJpdHkuY3RzLlNFTGludXhIb3N0VGVzdC5pc0Z1bGxUcmVibGVEZXZpY2UobURldmljZSk7CiAgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzQ29tcGF0aWJsZVByb3BlcnR5RW5mb3JjZWREZXZpY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQuc2VjdXJpdHkuY3RzLlNFTGludXhIb3N0VGVzdC5pc0NvbXBhdGlibGVQcm9wZXJ0eUVuZm9yY2VkRGV2aWNlKG1EZXZpY2UpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc1NlcG9saWN5U3BsaXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQuc2VjdXJpdHkuY3RzLlNFTGludXhIb3N0VGVzdC5pc1NlcG9saWN5U3BsaXQobURldmljZSk7CisgICAgfQogIiIiCiBzcmNfYm9keSA9ICIiCiBzcmNfZm9vdGVyID0gIiIifQpAQCAtODQsMTUgKzEwNiwyOCBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3ROZXZlcmFsbG93UnVsZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIG5ldmVyYWxsb3dSdWxlID0gIiRORVZFUkFMTE9XX1JVTEVfSEVSRSQiOwogICAgICAgICBib29sZWFuIGZ1bGxUcmVibGVPbmx5ID0gJEZVTExfVFJFQkxFX09OTFlfQk9PTF9IRVJFJDsKKyAgICAgICAgYm9vbGVhbiBjb21wYXRpYmxlUHJvcGVydHlPbmx5ID0gJENPTVBBVElCTEVfUFJPUEVSVFlfT05MWV9CT09MX0hFUkUkOwogCiAgICAgICAgIGlmICgoZnVsbFRyZWJsZU9ubHkpICYmICghaXNGdWxsVHJlYmxlRGV2aWNlKCkpKSB7CiAgICAgICAgICAgICAvLyBUaGlzIHRlc3QgYXBwbGllcyBvbmx5IHRvIFRyZWJsZSBkZXZpY2VzIGJ1dCB0aGlzIGRldmljZSBpc24ndCBvbmUKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQorICAgICAgICBpZiAoKGNvbXBhdGlibGVQcm9wZXJ0eU9ubHkpICYmICghaXNDb21wYXRpYmxlUHJvcGVydHlFbmZvcmNlZERldmljZSgpKSkgeworICAgICAgICAgICAgLy8gVGhpcyB0ZXN0IGFwcGxpZXMgb25seSB0byBkZXZpY2VzIG9uIHdoaWNoIGNvbXBhdGlibGUgcHJvcGVydHkgaXMgZW5mb3JjZWQgYnV0IHRoaXMKKyAgICAgICAgICAgIC8vIGRldmljZSBpc24ndCBvbmUKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHNlcG9saWN5IGlzIHNwbGl0IGFuZCB2ZW5kb3Igc2Vwb2xpY3kgdmVyc2lvbiBpcyBiZWhpbmQgcGxhdGZvcm0ncywKKyAgICAgICAgLy8gb25seSB0ZXN0IGFnYWluc3QgcGxhdGZvcm0gcG9saWN5LgorICAgICAgICBGaWxlIHBvbGljeUZpbGUgPQorICAgICAgICAgICAgICAgIChpc1NlcG9saWN5U3BsaXQoKSAmJiBtVmVuZG9yU2Vwb2xpY3lWZXJzaW9uIDwgUF9TRVBPTElDWV9WRVJTSU9OKSA/CisgICAgICAgICAgICAgICAgZGV2aWNlU3lzdGVtUG9saWN5RmlsZSA6CisgICAgICAgICAgICAgICAgZGV2aWNlUG9saWN5RmlsZTsKIAogICAgICAgICAvKiBydW4gc2Vwb2xpY3ktYW5hbHl6ZSBuZXZlcmFsbG93IGNoZWNrIG9uIHBvbGljeSBmaWxlIHVzaW5nIGdpdmVuIG5ldmVyYWxsb3cgcnVsZXMgKi8KICAgICAgICAgUHJvY2Vzc0J1aWxkZXIgcGIgPSBuZXcgUHJvY2Vzc0J1aWxkZXIoc2Vwb2xpY3lBbmFseXplLmdldEFic29sdXRlUGF0aCgpLAotICAgICAgICAgICAgICAgIGRldmljZVBvbGljeUZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksICJuZXZlcmFsbG93IiwgIi13IiwgIi1uIiwKKyAgICAgICAgICAgICAgICBwb2xpY3lGaWxlLmdldEFic29sdXRlUGF0aCgpLCAibmV2ZXJhbGxvdyIsICItdyIsICItbiIsCiAgICAgICAgICAgICAgICAgbmV2ZXJhbGxvd1J1bGUpOwogICAgICAgICBwYi5yZWRpcmVjdE91dHB1dChQcm9jZXNzQnVpbGRlci5SZWRpcmVjdC5QSVBFKTsKICAgICAgICAgcGIucmVkaXJlY3RFcnJvclN0cmVhbSh0cnVlKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3NlbGludXgvU0VMaW51eE5ldmVyYWxsb3dUZXN0R2VuLnB5IGIvdG9vbHMvc2VsaW51eC9TRUxpbnV4TmV2ZXJhbGxvd1Rlc3RHZW4ucHkKaW5kZXggZTc0YmE3OC4uYjRiOTAwZSAxMDA3NTUKLS0tIGEvdG9vbHMvc2VsaW51eC9TRUxpbnV4TmV2ZXJhbGxvd1Rlc3RHZW4ucHkKKysrIGIvdG9vbHMvc2VsaW51eC9TRUxpbnV4TmV2ZXJhbGxvd1Rlc3RHZW4ucHkKQEAgLTEwLDEwICsxMCwxMiBAQAogY2xhc3MgTmV2ZXJhbGxvd1J1bGU6CiAgICAgc3RhdGVtZW50ID0gJycKICAgICB0cmVibGVfb25seSA9IEZhbHNlCisgICAgY29tcGF0aWJsZV9wcm9wZXJ0eV9vbmx5ID0gRmFsc2UKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdGF0ZW1lbnQpOgogICAgICAgICBzZWxmLnN0YXRlbWVudCA9IHN0YXRlbWVudAogICAgICAgICBzZWxmLnRyZWJsZV9vbmx5ID0gRmFsc2UKKyAgICAgICAgc2VsZi5jb21wYXRpYmxlX3Byb3BlcnR5X29ubHkgPSBGYWxzZQogCiAKICMgZXh0cmFjdF9uZXZlcmFsbG93X3J1bGVzIC0gdGFrZXMgYW4gaW50ZXJtZWRpYXRlIHBvbGljeSBmaWxlIGFuZCBwdWxscyBvdXQgdGhlCkBAIC0yOSw3ICszMSw3IEBACiAKICAgICAgICAgIyB1bmNvbW1lbnQgVFJFQkxFX09OTFkgc2VjdGlvbiBkZWxpbWl0ZXIgbGluZXMKICAgICAgICAgcmVtYWluaW5nID0gcmUuc3ViKAotICAgICAgICAgICAgcideXHMqI1xzKihCRUdJTl9UUkVCTEVfT05MWXxFTkRfVFJFQkxFX09OTFkpJywKKyAgICAgICAgICAgIHInXlxzKiNccyooQkVHSU5fVFJFQkxFX09OTFl8RU5EX1RSRUJMRV9PTkxZfEJFR0lOX0NPTVBBVElCTEVfUFJPUEVSVFlfT05MWXxFTkRfQ09NUEFUSUJMRV9QUk9QRVJUWV9PTkxZKScsCiAgICAgICAgICAgICByJ1wxJywKICAgICAgICAgICAgIHBvbGljeV9zdHIsCiAgICAgICAgICAgICBmbGFncyA9IHJlLk0pCkBAIC0zNywxMyArMzksMTQgQEAKICAgICAgICAgcmVtYWluaW5nID0gcmUuc3ViKHInIy4rPyQnLCByJycsIHJlbWFpbmluZywgZmxhZ3MgPSByZS5NKQogICAgICAgICAjIG1hdGNoIG5ldmVyYWxsb3cgcnVsZXMKICAgICAgICAgbGluZXMgPSByZS5maW5kYWxsKAotICAgICAgICAgICAgcideXHMqKG5ldmVyYWxsb3dccy4rPzt8QkVHSU5fVFJFQkxFX09OTFl8RU5EX1RSRUJMRV9PTkxZKScsCisgICAgICAgICAgICByJ15ccyoobmV2ZXJhbGxvd1xzLis/O3xCRUdJTl9UUkVCTEVfT05MWXxFTkRfVFJFQkxFX09OTFl8QkVHSU5fQ09NUEFUSUJMRV9QUk9QRVJUWV9PTkxZfEVORF9DT01QQVRJQkxFX1BST1BFUlRZX09OTFkpJywKICAgICAgICAgICAgIHJlbWFpbmluZywKICAgICAgICAgICAgIGZsYWdzID0gcmUuTSB8cmUuUykKIAogICAgICAgICAjIGV4dHJhY3QgbmV2ZXJhbGxvdyBydWxlcyBmcm9tIHRoZSByZW1haW5pbmcgbGluZXMKICAgICAgICAgcnVsZXMgPSBsaXN0KCkKICAgICAgICAgdHJlYmxlX29ubHlfZGVwdGggPSAwCisgICAgICAgIGNvbXBhdGlibGVfcHJvcGVydHlfb25seV9kZXB0aCA9IDAKICAgICAgICAgZm9yIGxpbmUgaW4gbGluZXM6CiAgICAgICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoIkJFR0lOX1RSRUJMRV9PTkxZIik6CiAgICAgICAgICAgICAgICAgdHJlYmxlX29ubHlfZGVwdGggKz0gMQpAQCAtNTMsMTIgKzU2LDI0IEBACiAgICAgICAgICAgICAgICAgICAgIGV4aXQoIkVSUk9SOiBFTkRfVFJFQkxFX09OTFkgb3V0c2lkZSBvZiBUUkVCTEVfT05MWSBzZWN0aW9uIikKICAgICAgICAgICAgICAgICB0cmVibGVfb25seV9kZXB0aCAtPSAxCiAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGVsaWYgbGluZS5zdGFydHN3aXRoKCJCRUdJTl9DT01QQVRJQkxFX1BST1BFUlRZX09OTFkiKToKKyAgICAgICAgICAgICAgICBjb21wYXRpYmxlX3Byb3BlcnR5X29ubHlfZGVwdGggKz0gMQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbGlmIGxpbmUuc3RhcnRzd2l0aCgiRU5EX0NPTVBBVElCTEVfUFJPUEVSVFlfT05MWSIpOgorICAgICAgICAgICAgICAgIGlmIGNvbXBhdGlibGVfcHJvcGVydHlfb25seV9kZXB0aCA8IDE6CisgICAgICAgICAgICAgICAgICAgIGV4aXQoIkVSUk9SOiBFTkRfQ09NUEFUSUJMRV9QUk9QRVJUWV9PTkxZIG91dHNpZGUgb2YgQ09NUEFUSUJMRV9QUk9QRVJUWV9PTkxZIHNlY3Rpb24iKQorICAgICAgICAgICAgICAgIGNvbXBhdGlibGVfcHJvcGVydHlfb25seV9kZXB0aCAtPSAxCisgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgIHJ1bGUgPSBOZXZlcmFsbG93UnVsZShsaW5lKQogICAgICAgICAgICAgcnVsZS50cmVibGVfb25seSA9ICh0cmVibGVfb25seV9kZXB0aCA+IDApCisgICAgICAgICAgICBydWxlLmNvbXBhdGlibGVfcHJvcGVydHlfb25seSA9IChjb21wYXRpYmxlX3Byb3BlcnR5X29ubHlfZGVwdGggPiAwKQogICAgICAgICAgICAgcnVsZXMuYXBwZW5kKHJ1bGUpCiAKICAgICAgICAgaWYgdHJlYmxlX29ubHlfZGVwdGggIT0gMDoKICAgICAgICAgICAgIGV4aXQoIkVSUk9SOiBlbmQgb2YgaW5wdXQgd2hpbGUgaW5zaWRlIFRSRUJMRV9PTkxZIHNlY3Rpb24iKQorICAgICAgICBpZiBjb21wYXRpYmxlX3Byb3BlcnR5X29ubHlfZGVwdGggIT0gMDoKKyAgICAgICAgICAgIGV4aXQoIkVSUk9SOiBlbmQgb2YgaW5wdXQgd2hpbGUgaW5zaWRlIENPTVBBVElCTEVfUFJPUEVSVFlfT05MWSBzZWN0aW9uIikKKwogICAgICAgICByZXR1cm4gcnVsZXMKIAogIyBuZXZlcmFsbG93X3J1bGVfdG9fdGVzdCAtIHRha2VzIGEgbmV2ZXJhbGxvdyBzdGF0ZW1lbnQgYW5kIHRyYW5zZm9ybXMgaXQgaW50bwpAQCAtNzMsNiArODgsOSBAQAogICAgIG1ldGhvZCA9IG1ldGhvZC5yZXBsYWNlKAogICAgICAgICAiJEZVTExfVFJFQkxFX09OTFlfQk9PTF9IRVJFJCIsCiAgICAgICAgICJ0cnVlIiBpZiBydWxlLnRyZWJsZV9vbmx5IGVsc2UgImZhbHNlIikKKyAgICBtZXRob2QgPSBtZXRob2QucmVwbGFjZSgKKyAgICAgICAgIiRDT01QQVRJQkxFX1BST1BFUlRZX09OTFlfQk9PTF9IRVJFJCIsCisgICAgICAgICJ0cnVlIiBpZiBydWxlLmNvbXBhdGlibGVfcHJvcGVydHlfb25seSBlbHNlICJmYWxzZSIpCiAgICAgcmV0dXJuIG1ldGhvZAogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgpkaWZmIC0tZ2l0IGEvdG9vbHMvdXRpbHMvQ29sbGVjdEFsbFRlc3RzLmphdmEgYi90b29scy91dGlscy9Db2xsZWN0QWxsVGVzdHMuamF2YQppbmRleCBjZDg1ZTBjLi4xYzZmYTk5IDEwMDY0NAotLS0gYS90b29scy91dGlscy9Db2xsZWN0QWxsVGVzdHMuamF2YQorKysgYi90b29scy91dGlscy9Db2xsZWN0QWxsVGVzdHMuamF2YQpAQCAtNTEwLDcgKzUxMCw3IEBACiAgICAgICogQHJldHVybiB0cnVlIGlmIGl0IGlzIHZhbGlkLCBmYWxzZSBvdGhlcndpc2UKICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVmFsaWRKYXZhUGFja2FnZShTdHJpbmcgamF2YVBhY2thZ2VOYW1lKSB7Ci0gICAgICAgIFN0cmluZ1tdIHN0clNlY3Rpb25zID0gamF2YVBhY2thZ2VOYW1lLnNwbGl0KCIuIik7CisgICAgICAgIFN0cmluZ1tdIHN0clNlY3Rpb25zID0gamF2YVBhY2thZ2VOYW1lLnNwbGl0KCJcXC4iKTsKICAgICAgICAgZm9yIChTdHJpbmcgc3RyU2VjdGlvbiA6IHN0clNlY3Rpb25zKSB7CiAgICAgICAgICAgaWYgKCFpc1ZhbGlkSmF2YUlkZW50aWZpZXIoc3RyU2VjdGlvbikpIHsKICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEvdG9vbHMvdXRpbHMvamF2YS1jZXJ0LWxpc3QtZ2VuZXJhdG9yLnNoIGIvdG9vbHMvdXRpbHMvamF2YS1jZXJ0LWxpc3QtZ2VuZXJhdG9yLnNoCmluZGV4IDNiMDlmODYuLjFmMzNjNGEgMTAwNzU1Ci0tLSBhL3Rvb2xzL3V0aWxzL2phdmEtY2VydC1saXN0LWdlbmVyYXRvci5zaAorKysgYi90b29scy91dGlscy9qYXZhLWNlcnQtbGlzdC1nZW5lcmF0b3Iuc2gKQEAgLTYwLDUgKzYwLDIwIEBACiAKIGNhdCA8PC1FTkRDTEFTUwogICB9OworRU5EQ0xBU1MKKworY2F0IDw8LVNUQVJUQ0xBU1MKKworICBzdGF0aWMgZmluYWwgU3RyaW5nW10gV0ZBX0NFUlRJRklDQVRFX0RBVEEgPSB7CitTVEFSVENMQVNTCisKK0NFUlRfRElSRUNUT1JZPSRBTkRST0lEX0JVSUxEX1RPUC9zeXN0ZW0vY2EtY2VydGlmaWNhdGVzL3dmYV9jZXJ0cy9maWxlcy8KK2ZvciBGSUxFIGluIGBscyAkQ0VSVF9ESVJFQ1RPUllgOyBkbworICBGSU5HRVJQUklOVD1gY2F0ICRDRVJUX0RJUkVDVE9SWS8kRklMRSB8IGdyZXAgIlNIQTEgRmluZ2VycHJpbnQ9IiB8IGN1dCAtZCAnPScgLWYgMmAKKyAgZWNobyAiICAgICAgXCIke0ZJTkdFUlBSSU5UfVwiLCIKK2RvbmUKKworY2F0IDw8LUVORENMQVNTCisgIH07CiB9CiBFTkRDTEFTUwpkaWZmIC0tZ2l0IGEvdG9vbHMvdm0tdGVzdHMtdGYvQW5kcm9pZC5tayBiL3Rvb2xzL3ZtLXRlc3RzLXRmL0FuZHJvaWQubWsKaW5kZXggYzdkNjFlNC4uZWE0ZjA5YiAxMDA2NDQKLS0tIGEvdG9vbHMvdm0tdGVzdHMtdGYvQW5kcm9pZC5taworKysgYi90b29scy92bS10ZXN0cy10Zi9BbmRyb2lkLm1rCkBAIC0yNSwxMCArMjUsOSBAQAogTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEpBVkFfTElCUkFSSUVTCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAogTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0ganVuaXQKLS1pbmNsdWRlIGN0cy9lcnJvcl9wcm9uZV9ydWxlc190ZXN0cy5tawogaW5jbHVkZSAkKEJVSUxEX0pBVkFfTElCUkFSWSkKIAotY3RzLXRmLWRhbHZpay1saWIuamFjayA6PSAkKGZ1bGxfY2xhc3Nlc19qYWNrKQorY3RzLXRmLWRhbHZpay1saWIuamFyIDo9ICQoZnVsbF9jbGFzc2VzX2phcikKIAogIyBidWlsZHV0aWwgamF2YSBsaWJyYXJ5CiAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtNDQsNyArNDMsNyBAQAogTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEpBVkFfTElCUkFSSUVTCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAogCi1MT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBkeCBkYXNtIGNmYXNzZW1ibGVyIGp1bml0LWhvc3QganNyMzA1bGliCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBkeCBkYXNtIGNmYXNzZW1ibGVyIGp1bml0LWhvc3QganNyMzA1bGliIGQ4CiAKIExPQ0FMX0NMQVNTUEFUSCA6PSAkKEhPU1RfSkRLX1RPT0xTX0pBUikKIApAQCAtNTUsOCArNTQsNiBAQAogIwogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKLWluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2NvbmZpZ3VyZV9sb2NhbF9qYWNrLm1rCi0KIExPQ0FMX01PRFVMRSA6PSB2bS10ZXN0cy10ZgogTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEpBVkFfTElCUkFSSUVTCiBMT0NBTF9NT0RVTEVfU1VGRklYIDo9ICQoQ09NTU9OX0pBVkFfUEFDS0FHRV9TVUZGSVgpCkBAIC03NCwxMyArNzEsOCBAQAogCiB2bXRlc3RzdGZfZGVwX2phcnMgOj0gXAogICAgICQoSE9TVF9KREtfVE9PTFNfSkFSKSBcCi0gICAgJChhZGRwcmVmaXggJChIT1NUX09VVF9KQVZBX0xJQlJBUklFUykvLCBjdHMtdGYtZGFsdmlrLWJ1aWxkdXRpbC5qYXIgZGFzbS5qYXIgZHguamFyIGNmYXNzZW1ibGVyLmphciBqdW5pdC1ob3N0LmphcikKLQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0pBQ0tfRVhUUkFfQVJHUyA6PSAkKExPQ0FMX0pBQ0tfRVhUUkFfQVJHUykKLQotaWZkZWYgTE9DQUxfSkFDS19FTkFCTEVECi0gICAgdm10ZXN0c3RmX2RlcF9qYXJzICs9ICQoY3RzLXRmLWRhbHZpay1saWIuamFjaykKLWVuZGlmCisgICAgJChjdHMtdGYtZGFsdmlrLWxpYi5qYXIpIFwKKyAgICAkKGFkZHByZWZpeCAkKEhPU1RfT1VUX0pBVkFfTElCUkFSSUVTKS8sIGN0cy10Zi1kYWx2aWstYnVpbGR1dGlsLmphciBkYXNtLmphciBkeC5qYXIgY2Zhc3NlbWJsZXIuamFyIGp1bml0LWhvc3QuamFyIGQ4LmphcikKIAogJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX1NSQ19GT0xERVIgOj0gJChMT0NBTF9QQVRIKS9zcmMKICQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9JTlRFUk1FRElBVEVTX0NMQVNTRVMgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixKQVZBX0xJQlJBUklFUyxjdHMtdGYtZGFsdmlrLWJ1aWxkdXRpbCxIT1NUKS9jbGFzc2VzCkBAIC04OSw1MCArODEsMzQgQEAKICQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9JTlRFUk1FRElBVEVTX01BSU5fRklMRVMgOj0gJChpbnRlcm1lZGlhdGVzKS9tYWluX2ZpbGVzCiAkKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfSU5URVJNRURJQVRFU19IT1NUSlVOSVRfRklMRVMgOj0gJChpbnRlcm1lZGlhdGVzKS9ob3N0anVuaXRfZmlsZXMKICQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9DTEFTU19QQVRIIDo9ICQoY2FsbCBub3JtYWxpemUtcGF0aC1saXN0LCAkKHZtdGVzdHN0Zl9kZXBfamFycykpCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfSkFDS19WRVJTSU9OIDo9ICQoTE9DQUxfSkFDS19WRVJTSU9OKQotaWZuZGVmIExPQ0FMX0pBQ0tfRU5BQkxFRAotJChMT0NBTF9CVUlMVF9NT0RVTEUpIDogJCh2bXRlc3RzdGZfZGVwX2phcnMpICQoSE9TVF9PVVRfSkFWQV9MSUJSQVJJRVMpL3RyYWRlZmVkLmphcgorb2pfamFyIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsSkFWQV9MSUJSQVJJRVMsY29yZS1vaiwsQ09NTU9OKS9jbGFzc2VzLmphcgorbGliYXJ0X2phciA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLEpBVkFfTElCUkFSSUVTLGNvcmUtbGliYXJ0LCxDT01NT04pL2NsYXNzZXMuamFyCiskKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfREFMVklLX1NVSVRFX0NMQVNTUEFUSCA6PSAkKG9qX2phcik6JChsaWJhcnRfamFyKTokKGN0cy10Zi1kYWx2aWstbGliLmphcik6JChIT1NUX09VVF9KQVZBX0xJQlJBUklFUykvdHJhZGVmZWQuamFyOgorJChMT0NBTF9CVUlMVF9NT0RVTEUpIDogJCh2bXRlc3RzdGZfZGVwX2phcnMpICQoSE9TVF9PVVRfSkFWQV9MSUJSQVJJRVMpL3RyYWRlZmVkLmphciAkKERYKQogCSQoaGlkZSkgcm0gLXJmICQoZGlyICRAKSAmJiBta2RpciAtcCAkKGRpciAkQCkKIAkkKGhpZGUpIG1rZGlyIC1wICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0hPU1RKVU5JVF9GSUxFUykvZG90L2p1bml0ICQoZGlyICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RFWENPUkVfSkFSKSkKIAkjIGdlbmVyYXRlZCBhbmQgY29tcGlsZSB0aGUgaG9zdCBzaWRlIGp1bml0IHRlc3RzCiAJQGVjaG8gIldyaXRlIGdlbmVyYXRlZCBNYWluXyouamF2YSBmaWxlcyB0byAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19NQUlOX0ZJTEVTKSIKIAkkKGhpZGUpICQoSkFWQSkgXAotCSAgICAkKGlmICQoRVhQRVJJTUVOVEFMX1VTRV9PUEVOSkRLOSksLS1hZGQtZXhwb3J0cyBqZGsuamFydG9vbC9zdW4udG9vbHMuamFyPUFMTC1VTk5BTUVEKSBcCiAJICAgIC1jcCAkKFBSSVZBVEVfQ0xBU1NfUEFUSCkgdXRpbC5idWlsZC5CdWlsZERhbHZpa1N1aXRlICQoUFJJVkFURV9TUkNfRk9MREVSKSAkKFBSSVZBVEVfSU5URVJNRURJQVRFUykgXAotCQkkKEhPU1RfT1VUX0pBVkFfTElCUkFSSUVTKS9jdHMtdGYtZGFsdmlrLWJ1aWxkdXRpbC5qYXI6JChIT1NUX09VVF9KQVZBX0xJQlJBUklFUykvdHJhZGVmZWQuamFyIFwKLQkJJChQUklWQVRFX0lOVEVSTUVESUFURVNfTUFJTl9GSUxFUykgJChQUklWQVRFX0lOVEVSTUVESUFURVNfQ0xBU1NFUykgJChQUklWQVRFX0lOVEVSTUVESUFURVNfSE9TVEpVTklUX0ZJTEVTKSAkJFJVTl9WTV9URVNUU19SVE8KLQlAZWNobyAiR2VuZXJhdGUgJChQUklWQVRFX0lOVEVSTUVESUFURVNfREVYQ09SRV9KQVIpIgotCSQoaGlkZSkgJChKQVIpIC1jZiAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ERVhDT1JFX0pBUikuamFyIFwKLQkJJChhZGRwcmVmaXggLUMgJChQUklWQVRFX0lOVEVSTUVESUFURVNfQ0xBU1NFUykgLCBkb3QvanVuaXQvRHhVdGlsLmNsYXNzIGRvdC9qdW5pdC9EeEFic3RyYWN0TWFpbi5jbGFzcykKLQkkKGhpZGUpICQoRFgpIC1KWG1zMTZNIC1KWG14NzY4TSAtLWRleCAtLW91dHB1dD0kKFBSSVZBVEVfSU5URVJNRURJQVRFU19ERVhDT1JFX0pBUikgXAotCQkkKGlmICQoTk9fT1BUSU1JWkVfRFgpLCAtLW5vLW9wdGltaXplKSAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ERVhDT1JFX0pBUikuamFyICYmIHJtIC1mICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RFWENPUkVfSkFSKS5qYXIKLQkkKGhpZGUpIGNkICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0hPU1RKVU5JVF9GSUxFUykvY2xhc3NlcyAmJiB6aXAgLXEgLXIgLi4vLi4vJChub3RkaXIgJEApLmphciAuCi0JJChoaWRlKSBjZCAkKGRpciAkQCkgJiYgemlwIC1xIC1yICQobm90ZGlyICRAKSB0ZXN0cwotZWxzZSAjIExPQ0FMX0pBQ0tfRU5BQkxFRAotb2pfamFjayA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLEpBVkFfTElCUkFSSUVTLGNvcmUtb2osLENPTU1PTikvY2xhc3Nlcy5qYWNrCi1saWJhcnRfamFjayA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLEpBVkFfTElCUkFSSUVTLGNvcmUtbGliYXJ0LCxDT01NT04pL2NsYXNzZXMuamFjawotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0RBTFZJS19TVUlURV9DTEFTU1BBVEggOj0gJChval9qYWNrKTokKGxpYmFydF9qYWNrKTokKGN0cy10Zi1kYWx2aWstbGliLmphY2spOiQoSE9TVF9PVVRfSkFWQV9MSUJSQVJJRVMpL3RyYWRlZmVkLmphcgotJChMT0NBTF9CVUlMVF9NT0RVTEUpIDogJCh2bXRlc3RzdGZfZGVwX2phcnMpICQoSkFDSykgJChval9qYWNrKSAkKGxpYmFydF9qYWNrKSAkKEhPU1RfT1VUX0pBVkFfTElCUkFSSUVTKS90cmFkZWZlZC5qYXIgfCBzZXR1cC1qYWNrLXNlcnZlcgotCSQoaGlkZSkgcm0gLXJmICQoZGlyICRAKSAmJiBta2RpciAtcCAkKGRpciAkQCkKLQkkKGhpZGUpIG1rZGlyIC1wICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0hPU1RKVU5JVF9GSUxFUykvZG90L2p1bml0ICQoZGlyICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RFWENPUkVfSkFSKSkKLQkjIGdlbmVyYXRlZCBhbmQgY29tcGlsZSB0aGUgaG9zdCBzaWRlIGp1bml0IHRlc3RzCi0JQGVjaG8gIldyaXRlIGdlbmVyYXRlZCBNYWluXyouamF2YSBmaWxlcyB0byAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19NQUlOX0ZJTEVTKSIKLQkkKGhpZGUpIEpBQ0tfVkVSU0lPTj0kKFBSSVZBVEVfSkFDS19WRVJTSU9OKSAkKEpBVkEpIC1jcCAkKFBSSVZBVEVfQ0xBU1NfUEFUSCkgdXRpbC5idWlsZC5KYWNrQnVpbGREYWx2aWtTdWl0ZSAkKEpBQ0spICQoUFJJVkFURV9TUkNfRk9MREVSKSAkKFBSSVZBVEVfSU5URVJNRURJQVRFUykgXAogCQkkKFBSSVZBVEVfREFMVklLX1NVSVRFX0NMQVNTUEFUSCkgXAogCQkkKFBSSVZBVEVfSU5URVJNRURJQVRFU19NQUlOX0ZJTEVTKSAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19DTEFTU0VTKSAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19IT1NUSlVOSVRfRklMRVMpICQkUlVOX1ZNX1RFU1RTX1JUTwogCUBlY2hvICJHZW5lcmF0ZSAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ERVhDT1JFX0pBUikiCiAJJChoaWRlKSAkKEpBUikgLWNmICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RFWENPUkVfSkFSKS1jbGFzcy5qYXIgXAotCQkkKGFkZHByZWZpeCAtQyAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19DTEFTU0VTKSAsIGRvdC9qdW5pdC9EeFV0aWwuY2xhc3MgZG90L2p1bml0L0R4QWJzdHJhY3RNYWluLmNsYXNzKQotCSQoaGlkZSkgJChjYWxsIGNhbGwtamFjaykgLS1pbXBvcnQgJChQUklWQVRFX0lOVEVSTUVESUFURVNfREVYQ09SRV9KQVIpLWNsYXNzLmphciAtLW91dHB1dC1qYWNrICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RFWENPUkVfSkFSKS5qYWNrCisJCSQoYWRkcHJlZml4IC1DICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0NMQVNTRVMpICwgZG90L2p1bml0L0R4VXRpbC5jbGFzcyBkb3QvanVuaXQvRHhBYnN0cmFjdE1haW4uY2xhc3MgZG90L2p1bml0L0Fzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbi5jbGFzcykKIAkkKGhpZGUpIG1rZGlyIC1wICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RFWENPUkVfSkFSKS50bXAKLQkkKGhpZGUpICQoY2FsbCBjYWxsLWphY2ssJChQUklWQVRFX0pBQ0tfRVhUUkFfQVJHUykpIC0tb3V0cHV0LWRleCAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ERVhDT1JFX0pBUikudG1wIFwKLQkJJChpZiAkKE5PX09QVElNSVpFX0RYKSwgLUQgamFjay5kZXgub3B0aW1pemUgImZhbHNlIikgLS1pbXBvcnQgJChQUklWQVRFX0lOVEVSTUVESUFURVNfREVYQ09SRV9KQVIpLmphY2sgJiYgcm0gLWYgJChQUklWQVRFX0lOVEVSTUVESUFURVNfREVYQ09SRV9KQVIpLmphY2sKK2lmbmVxICgkKFVTRV9EOF9ERVNVR0FSKSx0cnVlKQorCSQoaGlkZSkgJChEWF9DT01NQU5EKSAtLWRleCAtLW91dHB1dD0kKFBSSVZBVEVfSU5URVJNRURJQVRFU19ERVhDT1JFX0pBUikudG1wIFwKKwkJJChpZiAkKE5PX09QVElNSVpFX0RYKSwgLS1uby1vcHRpbWl6ZSkgJChQUklWQVRFX0lOVEVSTUVESUFURVNfREVYQ09SRV9KQVIpLWNsYXNzLmphciAmJiBybSAtZiAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ERVhDT1JFX0pBUikuamFyCitlbHNlCisJJChoaWRlKSAkKERYX0NPTU1BTkQpIC0tb3V0cHV0ICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RFWENPUkVfSkFSKS50bXAgXAorCQkkKGlmICQoTk9fT1BUSU1JWkVfRFgpLCAtLWRlYnVnKSAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ERVhDT1JFX0pBUiktY2xhc3MuamFyICYmIHJtIC1mICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RFWENPUkVfSkFSKS5qYXIKK2VuZGlmCiAJJChoaWRlKSBjZCAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ERVhDT1JFX0pBUikudG1wICYmIHppcCAtcSAtciAkKGFic3BhdGggJChQUklWQVRFX0lOVEVSTUVESUFURVNfREVYQ09SRV9KQVIpKSAuCiAJJChoaWRlKSBjZCAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19IT1NUSlVOSVRfRklMRVMpL2NsYXNzZXMgJiYgemlwIC1xIC1yIC4uLy4uLyQobm90ZGlyICRAKSAuCiAJJChoaWRlKSBjZCAkKGRpciAkQCkgJiYgemlwIC1xIC1yICQobm90ZGlyICRAKSB0ZXN0cwotb2pfamFjayA6PQotbGliYXJ0X2phY2sgOj0KLWVuZGlmICMgTE9DQUxfSkFDS19FTkFCTEVECitval9qYXIgOj0KK2xpYmFydF9qYXIgOj0KIAogIyBDbGVhbiB1cCB0ZW1wIHZhcnMKIGludGVybWVkaWF0ZXMgOj0KZGlmZiAtLWdpdCBhL3Rvb2xzL3ZtLXRlc3RzLXRmL0FuZHJvaWRUZXN0LnhtbCBiL3Rvb2xzL3ZtLXRlc3RzLXRmL0FuZHJvaWRUZXN0LnhtbAppbmRleCA3MmIzOTE0Li5mYzBmOGFmIDEwMDY0NAotLS0gYS90b29scy92bS10ZXN0cy10Zi9BbmRyb2lkVGVzdC54bWwKKysrIGIvdG9vbHMvdm0tdGVzdHMtdGYvQW5kcm9pZFRlc3QueG1sCkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBDVFMgVk0gdGVzdCBjYXNlcyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImN0cyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9ImNvbXBvbmVudCIgdmFsdWU9ImFydCIgLz4KICAgICA8b3B0aW9uIG5hbWU9Im5vdC1zdHJpY3Qtc2hhcmRhYmxlIiB2YWx1ZT0gInRydWUiIC8+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iYW5kcm9pZC5jb3JlLnZtLnRhcmdldHByZXAuVm1UZXN0UHJlcGFyZXIiIC8+CmRpZmYgLS1naXQgYS90b29scy92bS10ZXN0cy10Zi9ldGMvc3RhcnRob3N0dGVzdHMgYi90b29scy92bS10ZXN0cy10Zi9ldGMvc3RhcnRob3N0dGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzExNDRmMAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3ZtLXRlc3RzLXRmL2V0Yy9zdGFydGhvc3R0ZXN0cwpAQCAtMCwwICsxLDI0OSBAQAorIyEvYmluL2Jhc2gKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgU2V0IHVwIHByb2cgdG8gYmUgdGhlIHBhdGggb2YgdGhpcyBzY3JpcHQsIGluY2x1ZGluZyBmb2xsb3dpbmcgc3ltbGlua3MsCisjIGFuZCBzZXQgdXAgcHJvZ2RpciB0byBiZSB0aGUgZnVsbHktcXVhbGlmaWVkIHBhdGhuYW1lIG9mIGl0cyBkaXJlY3RvcnkuCisKK3Byb2c9IiQwIgord2hpbGUgWyAtaCAiJHtwcm9nfSIgXTsgZG8KKyAgICBuZXdQcm9nPWAvYmluL2xzIC1sZCAiJHtwcm9nfSJgCisgICAgbmV3UHJvZz1gZXhwciAiJHtuZXdQcm9nfSIgOiAiLiogLT4gXCguKlwpJCJgCisgICAgaWYgZXhwciAieCR7bmV3UHJvZ30iIDogJ3gvJyA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgIHByb2c9IiR7bmV3UHJvZ30iCisgICAgZWxzZQorICAgICAgICBwcm9nZGlyPWBkaXJuYW1lICIke3Byb2d9ImAKKyAgICAgICAgcHJvZz0iJHtwcm9nZGlyfS8ke25ld1Byb2d9IgorICAgIGZpCitkb25lCitvbGR3ZD1gcHdkYAorcHJvZ2Rpcj1gZGlybmFtZSAiJHtwcm9nfSJgCitjZCAiJHtwcm9nZGlyfSIKK3Byb2dkaXI9YHB3ZGAKK3Byb2c9IiR7cHJvZ2Rpcn0iL2BiYXNlbmFtZSAiJHtwcm9nfSJgCitjZCAiJHtvbGR3ZH0iCisKK2phdmFPcHRzPSIiCit3aGlsZSBleHByICJ4JDEiIDogJ3gtSicgPi9kZXYvbnVsbDsgZG8KKyAgICBvcHQ9YGV4cHIgIiQxIiA6ICctSlwoLipcKSdgCisgICAgamF2YU9wdHM9IiR7amF2YU9wdHN9IC0ke29wdH0iCisgICAgc2hpZnQKK2RvbmUKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBPcmlnaW5hbCBjb250ZW50IG9mIGludm9jYXRpb24gc2NyaXB0IGZvbGxvd3MuIFVzZXMgdmFsdWVzIGNsZXZlcmx5CisjIGRlZHVjZWQgYnkgdGhlIGFib3ZlIGNvZGUuCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitzZWxlY3Rpb249JDEKK2ludGVycHJldGVyPSJmYXN0IgoraWYgWyAiJHNlbGVjdGlvbiIgPSAiLS1wb3J0YWJsZSIgXTsgdGhlbgorICAgIHNlbGVjdGlvbj0kMjsKKyAgICBpbnRlcnByZXRlcj0icG9ydGFibGUiCitmaQorCitkYWx2aWt0ZXN0PSRBTkRST0lEX0JVSUxEX1RPUC9vdXQvaG9zdC9jb21tb24vb2JqL0pBVkFfTElCUkFSSUVTL3ZtLXRlc3RzLXRmX2ludGVybWVkaWF0ZXMKK2RhbHZpa3Rlc3RkaXI9JGRhbHZpa3Rlc3QvdGVzdHMKK2RleGNvcmU9JGRhbHZpa3Rlc3QvdGVzdHMvZG90L2p1bml0L2RleGNvcmUuamFyCitzY3JpcHRkYXRhPSRkYWx2aWt0ZXN0ZGlyL2RhdGEvc2NyaXB0ZGF0YQorcmVwb3J0PSRkYWx2aWt0ZXN0L3JlcG9ydC5odG1sCitjdXJkYXRlPWBkYXRlYAorZGF0YWRpcj0vdG1wLyR7VVNFUn0KK2V4cG9ydCBBTkRST0lEX1BSSU5URl9MT0c9dGFnCitleHBvcnQgQU5EUk9JRF9MT0dfVEFHUz0nKjpzJyAjIHdhczogamR3cDppIGRhbHZpa3ZtOmkgZGFsdmlrdm1pOmknCitleHBvcnQgQU5EUk9JRF9EQVRBPSRkYXRhZGlyCitleHBvcnQgQU5EUk9JRF9ST09UPSRBTkRST0lEX0hPU1RfT1VUCisjIGV4cG9ydCBMRF9MSUJSQVJZX1BBVEg9JGJhc2Uvc3lzdGVtL2xpYgorIyBleHBvcnQgRFlMRF9MSUJSQVJZX1BBVEg9JGJhc2Uvc3lzdGVtL2xpYgorZGVidWdfb3B0cz0iLVhjaGVjazpqbmkgLVhydW5qZHdwOnRyYW5zcG9ydD1kdF9zb2NrZXQsYWRkcmVzcz04MDAwLHNlcnZlcj15LHN1c3BlbmQ9biIKK3ZtdHBhdGg9JEFORFJPSURfSE9TVF9PVVQvLi4vY29tbW9uL29iai9KQVZBX0xJQlJBUklFUy92bS10ZXN0cy10Zl9pbnRlcm1lZGlhdGVzL3Rlc3RzCisKK2VjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorZWNobyAiRGFsdmlrIFZNIFRlc3QgU3VpdGUiCitlY2hvICJWZXJzaW9uIDEuMCIKK2VjaG8gIkNvcHlyaWdodCAoYykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0IgorZWNobyAiIgorCitpZiBbICIkc2VsZWN0aW9uIiA9ICItLWhlbHAiIF07IHRoZW4KKyAgICBlY2hvICJVc2FnZTogdm0tdGVzdHMgWy0taGVscHwtLXBvcnRhYmxlXSBbPG1uZW1vbmljPl0iCisgICAgZWNobyAiIgorICAgIGVjaG8gIiAgICAtLWhlbHAgICAgICBwcmludHMgdGhpcyBoZWxwIG1lc3NhZ2UiCisgICAgZWNobyAiIgorICAgIGVjaG8gIiAgICA8bW5lbW9uaWM+ICBzcGVjaWZpZXMgdGhlIGluc3RydWN0aW9uIHRvIHRlc3Q7IgorICAgIGVjaG8gIiAgICAgICAgICAgICAgICBkZWZhdWx0IGlzIHRvIHJ1biBhbGwgdGVzdHMiCisgICAgZWNobyAiIgorICAgIGV4aXQgMTsKK2ZpCisKK3JtIC1yZiAtLXByZXNlcnZlLXJvb3QgJGRhdGFkaXIvZGFsdmlrLWNhY2hlCitta2RpciAtcCAkZGF0YWRpcgorbWtkaXIgLXAgJGRhdGFkaXIvZGFsdmlrLWNhY2hlCisKK2VjaG8gIiIKKworcHJlX3JlcG9ydD0iPGh0bWw+PGhlYWQ+PHN0eWxlPgordGFibGUgdHIub2sgeyBiYWNrZ3JvdW5kOiNhMGZmYTA7IH0KK3RhYmxlIHRyLm5vayB7IGJhY2tncm91bmQ6I2ZmYTBhMDsgfQordGFibGUgdHIud29rIHsgYmFja2dyb3VuZDojZmZmZmEwOyB9Cit0YWJsZSB0ci5sb2sgeyBiYWNrZ3JvdW5kOiNhYWFhZmY7IH0KKzwvc3R5bGU+PC9oZWFkPgorPGJvZHk+Cis8aDE+RGFsdmlrIFZNIHRlc3Qgc3VpdGUgcmVzdWx0czwvaDE+CitHZW5lcmF0ZWQgJGN1cmRhdGUgKHVzaW5nIHRoZSBlbXVsYXRvcikKKzxwPgorPHRhYmxlIHdpZHRoPScxMDAlJz4KKzx0cj48dGQ+U3RhdHVzPC90ZD48dGQ+VGFyZ2V0PC90ZD48dGQ+Q2F0ZWdvcnk8L3RkPjx0ZD5EZXRhaWxzPC90ZD48L3RyPiIKK3Bvc3RfcmVwb3J0PSI8L2JvZHk+PC9odG1sPiIKKworcm0gLWYgJHJlcG9ydAorZWNobyAkcHJlX3JlcG9ydCA+ICRyZXBvcnQKKworIyAtLS0tLS0tLS0tLSBydW5uaW5nIGVhY2ggb3Bjb2RlIHRlc3QgLS0tLS0tLS0tLS0tCisKK2V4cG9ydCBqcGFzc2VkY250PTAKK2V4cG9ydCBqZmFpbGVkY250PTAKK2V4cG9ydCBqdmZlZmFpbGVkY250PTAKK2V4cG9ydCBqd2FybmluZ2NudD0wCitleHBvcnQgamFsbGNudD0wCitleHBvcnQgamNvbHVtbnM9MAorCitmdW5jdGlvbiBjbGFzc25hbWVUb0phcigpCit7CisgICAgZWNobyAkMSB8IHNlZCAtZSAncyNcLiMvI2c7cyMkIy5qYXIjJworfQorCit3aGlsZSByZWFkIC11IDMgbXlsaW5lOworZG8KKyAgICAjIGRvdC5qdW5pdC5vcGNvZGVzLmFkZF9kb3VibGUuTWFpbl90ZXN0QjE7ZG90Lmp1bml0Lm9wY29kZXMuYWRkX2RvdWJsZS5kLlRfYWRkX2RvdWJsZV8xIDtvcGNvZGUgYWRkX2RvdWJsZTt0ZXN0IEIgIzEgKGJvcmRlciBlZGdlIGNhc2UpCisgICAgIyAtPgorICAgICMgbWFpbmNsYXNzOiBkb3QuanVuaXQub3Bjb2Rlcy5hZGRfZG91YmxlLk1haW5fdGVzdEIxCisgICAgIyB0ZXN0Y2FzZWRpcjogb3Bjb2Rlcy9hZGRfZG91YmxlCisgICAgIyB0ZXN0bmFtZTogdGVzdEIxIC0+CisgICAgIyBkaXIgZG90L2p1bml0L29wY29kZXMvYWRkX2RvdWJsZS90ZXN0QjEKKworICAgICMgZS5nIGRvdC5qdW5pdC5vcGNvZGVzLmFkZF9kb3VibGUuTWFpbl90ZXN0QjEKKyAgICBtYWluY2xhc3M9YGVjaG8gJG15bGluZSB8IGN1dCAtZCI7IiAtZjFgCisgICAgIyBlLmcgZG90Lmp1bml0Lm9wY29kZXMuYWRkX2RvdWJsZS5kLlRfYWRkX2RvdWJsZV8xLCBzcGFjZSBzZXAuID49MSBlbnRyaWVzCisgICAgZGVwcz1gZWNobyAkbXlsaW5lIHwgY3V0IC1kIjsiIC1mMmAKKworICAgIGp0aXRsZT1gZWNobyAkbXlsaW5lIHwgY3V0IC1kIjsiIC1mM2AKKyAgICBqY29tbWVudD1gZWNobyAkbXlsaW5lIHwgY3V0IC1kIjsiIC1mNGAKKyAgICBkZXRhaWxzPWBlY2hvICRteWxpbmUgfCBjdXQgLWQiOyIgLWY1YAorCisgICAgaWYgWyAiJHNlbGVjdGlvbiIgPT0gIiIgXSB8fCBbICIkanRpdGxlIiA9PSAiJHNlbGVjdGlvbiIgXTsgdGhlbgorCisgICAgICAgICgoIGphbGxjbnQgKz0gMSApKQorCisgICAgICAgIGNkICRkYWx2aWt0ZXN0ZGlyCisgICAgICAgIHJtIC1mICRkYXRhZGlyL2RhbHZpa291dAorICAgICAgICAjIHdyaXRlIGRhbHZpayBvdXRwdXQgdG8gZmlsZQorICAgICAgICBlY2hvIC1uICJta19iOiIgPiAkZGF0YWRpci9kYWx2aWtvdXQKKworICAgICAgICBjbGFzc3BhdGg9IiR7dm10cGF0aH0vZG90L2p1bml0L2RleGNvcmUuamFyOiR7dm10cGF0aH0vbWFpbnMuamFyIgorICAgICAgICBkZXBzPSR7ZGVwc30iICIke21haW5jbGFzc30KKyAgICAgICAgZm9yIGRlcCBpbiAke2RlcHN9OyBkbworICAgICAgICAgICAgZGVwSmFyPWBjbGFzc25hbWVUb0phciAke2RlcH1gCisgICAgICAgICAgICBjbGFzc3BhdGg9JHtjbGFzc3BhdGh9OiR7dm10cGF0aH0vJHtkZXBKYXJ9CisgICAgICAgIGRvbmUKKworICAgICAgICBhcnQgLURqYXZhLmlvLnRtcGRpcj0vdG1wLyR7VVNFUn0gXAorICAgICAgICAgICAgLWNsYXNzcGF0aCAkY2xhc3NwYXRoICRtYWluY2xhc3MgPj4gJGRhdGFkaXIvZGFsdmlrb3V0IDI+JjEgJiYgXAorICAgICAgICAgICAgIGVjaG8gLW4gZHZtcGFzc2VkOiA+PiAkZGF0YWRpci9kYWx2aWtvdXQgMj4mMQorCisgICAgICAgIGVjaG8gLW4gIm1rX3M6IiA+PiAkZGF0YWRpci9kYWx2aWtvdXQKKyAgICAgICAgIyBWZXJpZnkgdG1wb3V0IG9ubHkgY29udGFpbnMgbWtkeGNfc3RhcnQ7bWtkeGNfc3RvcCAtPiBubyBzeXN0ZW0ub3V0L2VycgorICAgICAgICAjIGJlY2F1c2Ugb2YgZXhjZXB0aW9uLiBJZiBvayAtPiBncmVlbiByZXBvcnQgbGluZSBlbHNlIHJlZCByZXBvcnQgd2l0aCBpbmZvCisgICAgICAgICMgYmV0d2VlbiBta2R4Y19zdGFydCBhbmQgc3RvcAorICAgICAgICB2bXJlc3VsdD1gY2F0ICRkYXRhZGlyL2RhbHZpa291dGAKKworICAgICAgICBpZiBbWyAoIiR2bXJlc3VsdCIgPT0gIm1rX2I6bWtfczoiKSB8fCAoIiR2bXJlc3VsdCIgPT0gIm1rX2I6ZHZtcGFzc2VkOm1rX3M6IikgXV07IHRoZW4KKyAgICAgICAgICAgICgoIGpwYXNzZWRjbnQgKz0gMSApKQorICAgICAgICAgICAgZWNobyAtbiAiPHRyIGNsYXNzPVwib2tcIj48dGQ+U3VjY2VzczwvdGQ+PHRkPiRqdGl0bGU8L3RkPiIgPj4gJHJlcG9ydAorICAgICAgICAgICAgZWNobyAiPHRkPiRqY29tbWVudDwvdGQ+PHRkPiRkZXRhaWxzPC90ZD48L3RyPiIgPj4gJHJlcG9ydAorICAgICAgICAgICAgZWNobyAtbiAiLiIKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdm1yZXM9YGNhdCAkZGF0YWRpci9kYWx2aWtvdXQgfCBzZWQgLWUgJ3MvbWtfYjovLztzL21rX3M6Ly8nYAorICAgICAgICAgICAgdm1yZXM9IiRkZXRhaWxzPGJyPjxwcmU+JHZtcmVzPC9wcmU+IgorCisgICAgICAgICAgICBzdGFja3RyYWNlcz1gZWNobyAkdm1yZXN1bHQgfCBncmVwICJqYXZhXC5sYW5nXC4iIHwgZ3JlcCAtYyAiYXQgZG90XC5qdW5pdFwuImAKKyAgICAgICAgICAgIGlmIFtbICRzdGFja3RyYWNlcyA+IDAgXV07IHRoZW4KKyAgICAgICAgICAgICAgICBqdHlwZT1gZWNobyAiJG1haW5jbGFzcyIgfCBzZWQgLWUgJ3MvLipfdGVzdFwoW14wLTldKlwpWzAtOV0uKi9cMS8nIGAKKyAgICAgICAgICAgICAgICBpZiBbICIkanR5cGUiID09ICJWRkUiIF07IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgKCgganZmZWZhaWxlZGNudCArPSAxICkpCisgICAgICAgICAgICAgICAgICAgIGVjaG8gLW4gIlYiCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAoKCBqZmFpbGVkY250ICs9IDEgKSkKKyAgICAgICAgICAgICAgICAgICAgZWNobyAtbiAiRiIKKyAgICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICAgZWNobyAiPHRyIGNsYXNzPVwibm9rXCI+PHRkPkZhaWx1cmU8L3RkPjx0ZD4kanRpdGxlPC90ZD48dGQ+IiA+PiAkcmVwb3J0CisgICAgICAgICAgICAgICAgZWNobyAiJGpjb21tZW50PC90ZD48dGQ+JHZtcmVzPC90ZD48L3RyPiIgPj4gJHJlcG9ydAorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICgoIGp3YXJuaW5nY250ICs9IDEgKSkKKyAgICAgICAgICAgICAgICBlY2hvICI8dHIgY2xhc3M9XCJ3b2tcIj48dGQ+RmFpbHVyZTwvdGQ+PHRkPiRqdGl0bGU8L3RkPjx0ZD4iID4+ICRyZXBvcnQKKyAgICAgICAgICAgICAgICBlY2hvICIkamNvbW1lbnQ8L3RkPjx0ZD4oTm8gc3RhY2t0cmFjZSwgYnV0IGVycm9ycyBvbiBjb25zb2xlKSIgPj4gJHJlcG9ydAorICAgICAgICAgICAgICAgIGVjaG8gIjxicj4kdm1yZXM8L3RkPjwvdHI+IiA+PiAkcmVwb3J0CisgICAgICAgICAgICAgICAgZWNobyAtbiAiQyIKKyAgICAgICAgICAgIGZpCisgICAgICAgIGZpCisKKyAgICAgICAgKCggamNvbHVtbnMgKz0gMSApKQorICAgICAgICBpZiBbICR7amNvbHVtbnN9IC1lcSA0MCBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICIiCisgICAgICAgICAgICAoKCBqY29sdW1ucyA9IDAgKSkKKyAgICAgICAgZmkKKworICAgIGZpCisjIFVzZSBmZCBuciAzIHRvIGF2b2lkIHN1YnNoZWxsaW5nIHZpYSBjYXQgc2luY2UgdGhpcyBsb29zZXMgYWxsCisjIHZhcmlhYmxlcyhhbmQgdGh1cyBhbHNvIHRoZSBjb3VudGVycyB3ZSBhcmUgaW50ZXJlc3RlZCBpbikuCitkb25lIDM8JHNjcmlwdGRhdGEKKworZWNobyAiPC90YWJsZT4iID4+ICRyZXBvcnQKK2xldCBqYWxsY2FsY2NudD0kanBhc3NlZGNudCskamZhaWxlZGNudCskanZmZWZhaWxlZGNudCskandhcm5pbmdjbnQKK2lmIFsgJGphbGxjYWxjY250IC1uZSAkamFsbGNudCBdOyB0aGVuCisgICAgZWNobyAiPGJyPmVycm9yOiBncmVlbiAmIHJlZCAhPSB0b3RhbCAsICRqYWxsY2FsY2NudCAtbmUgJGphbGxjbnQiID4+ICRyZXBvcnQKKyAgICBleGl0IDE7CitmaQorCitlY2hvICRwb3N0X3JlcG9ydCA+PiAkcmVwb3J0CisKK2VjaG8gIjxicj5UZXN0cyBydW46ICR7amFsbGNudH0iID4+ICRyZXBvcnQKK2VjaG8gIjxicj5GdW5jdGlvbmFsIGZhaWx1cmVzOiAke2pmYWlsZWRjbnR9IiA+PiAkcmVwb3J0CitlY2hvICI8YnI+VmVyaWZpZXIgZmFpbHVyZXM6ICR7anZmZWZhaWxlZGNudH0iID4+ICRyZXBvcnQKK2VjaG8gIjxicj5Db25zb2xlIGVycm9yczogJHtqd2FybmluZ2NudH0iID4+ICRyZXBvcnQKKworZWNobyAkcG9zdF9yZXBvcnQgPj4gJHJlcG9ydAorCitpZiBbWyBqY29sdW1ucyAtbmUgMCBdXTsgdGhlbgorICAgIGVjaG8gIiIKK2ZpCisKK2VjaG8gIiIKKworaWYgW1sgamFsbGNudCAtZXEganBhc3NlZGNudCBdXTsgdGhlbgorICAgIGVjaG8gIk9LICgke2pwYXNzZWRjbnR9IHRlc3RzKSIKK2Vsc2UKKyAgICBlY2hvICJGQUlMVVJFUyEhISIKKyAgICBlY2hvICIiCisgICAgZWNobyAiVGVzdHMgcnVuICAgICAgICAgIDogJHtqYWxsY250fSIKKyAgICBlY2hvICJGdW5jdGlvbmFsIGZhaWx1cmVzOiAke2pmYWlsZWRjbnR9IgorICAgIGVjaG8gIlZlcmlmaWVyIGZhaWx1cmVzICA6ICR7anZmZWZhaWxlZGNudH0iCisgICAgZWNobyAiQ29uc29sZSBlcnJvcnMgICAgIDogJHtqd2FybmluZ2NudH0iCitmaQorCitlY2hvICIiCitlY2hvICJQbGVhc2Ugc2VlIGNvbXBsZXRlIHJlcG9ydCBpbiAke3JlcG9ydH0iCitlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKZGlmZiAtLWdpdCBhL3Rvb2xzL3ZtLXRlc3RzLXRmL3NyYy9kb3QvanVuaXQvQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uLmphdmEgYi90b29scy92bS10ZXN0cy10Zi9zcmMvZG90L2p1bml0L0Fzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0YjY4NmQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy92bS10ZXN0cy10Zi9zcmMvZG90L2p1bml0L0Fzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGRvdC5qdW5pdDsKKworY2xhc3MgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CisKKyAgICBwdWJsaWMgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKKyAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOworICAgIH0KKworICAgIHB1YmxpYyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgc3VwZXIobWVzc2FnZSk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3ZtLXRlc3RzLXRmL3NyYy9kb3QvanVuaXQvRHhBYnN0cmFjdE1haW4uamF2YSBiL3Rvb2xzL3ZtLXRlc3RzLXRmL3NyYy9kb3QvanVuaXQvRHhBYnN0cmFjdE1haW4uamF2YQppbmRleCBkYWM2ZGNmLi42MjIzNTA3IDEwMDY0NAotLS0gYS90b29scy92bS10ZXN0cy10Zi9zcmMvZG90L2p1bml0L0R4QWJzdHJhY3RNYWluLmphdmEKKysrIGIvdG9vbHMvdm0tdGVzdHMtdGYvc3JjL2RvdC9qdW5pdC9EeEFic3RyYWN0TWFpbi5qYXZhCkBAIC0yNSwyMCArMjUsMTkgQEAKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrRXJyb3IoQ2xhc3M8Pz4gZXhwZWN0ZWRFcnJvckNsYXNzLCBUaHJvd2FibGUgdGhyb3duLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGluX2ludm9jYXRpb25fZXhjKSB7CiAgICAgICAgIGlmIChleHBlY3RlZEVycm9yQ2xhc3MgIT0gbnVsbCAmJiB0aHJvd24gPT0gbnVsbCkgewotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgZXJyb3Igb2YgdHlwZSAiICsgZXhwZWN0ZWRFcnJvckNsYXNzKTsKKyAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIGVycm9yIG9mIHR5cGUgIiArIGV4cGVjdGVkRXJyb3JDbGFzcywgbnVsbCk7CiAgICAgICAgIH0gZWxzZSBpZiAoZXhwZWN0ZWRFcnJvckNsYXNzID09IG51bGwgJiYgdGhyb3duICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgZXJyb3IgIiArIHRocm93bik7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIGVycm9yICIgKyB0aHJvd24sIHRocm93bik7CiAgICAgICAgIH0gZWxzZSBpZiAoZXhwZWN0ZWRFcnJvckNsYXNzICE9IG51bGwgJiYgdGhyb3duICE9IG51bGwpIHsKICAgICAgICAgICAgIGlmIChpbl9pbnZvY2F0aW9uX2V4YykgewogICAgICAgICAgICAgICAgIGlmICghKHRocm93biBpbnN0YW5jZW9mIGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIGludm9jYXRpb24gdGFyZ2V0IGV4Y2VwdGlvbiwgYnV0IGdvdCAiICsgdGhyb3duKTsKKyAgICAgICAgICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgaW52b2NhdGlvbiB0YXJnZXQgZXhjZXB0aW9uLCBidXQgZ290ICIgKyB0aHJvd24sIHRocm93bik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHRocm93biA9IHRocm93bi5nZXRDYXVzZSgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKCFleHBlY3RlZEVycm9yQ2xhc3MuZXF1YWxzKHRocm93bi5nZXRDbGFzcygpKSkgewotICAgICAgICAgICAgICAgIHRocm93bi5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7CiAgICAgICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgZXJyb3Igb2YgdHlwZSAiICsgZXhwZWN0ZWRFcnJvckNsYXNzICsgIiwgYnV0IGdvdCAiICsKLSAgICAgICAgICAgICAgICAgICAgIHRocm93bi5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd24uZ2V0Q2xhc3MoKSwgdGhyb3duKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTQ3LDE5ICs0NiwxOSBAQAogICAgICAqIFRyeSB0byBsb2FkIHRoZSBjbGFzcyB3aXRoIHRoZSBnaXZlbiBuYW1lLCBhbmQgY2hlY2sgZm9yIHRoZSBleHBlY3RlZCBlcnJvci4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIENsYXNzPD8+IGxvYWQoU3RyaW5nIGNsYXNzTmFtZSwgQ2xhc3M8Pz4gZXhwZWN0ZWRFcnJvckNsYXNzKSB7CisgICAgICAgIENsYXNzPD8+IGM7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDbGFzczw/PiBjID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOwotICAgICAgICAgICAgY2hlY2tFcnJvcihleHBlY3RlZEVycm9yQ2xhc3MsIG51bGwsIGZhbHNlKTsKLSAgICAgICAgICAgIHJldHVybiBjOworICAgICAgICAgICAgYyA9IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKICAgICAgICAgICAgIGlmIChleHBlY3RlZEVycm9yQ2xhc3MgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGNoZWNrRXJyb3IoZXhwZWN0ZWRFcnJvckNsYXNzLCB0LCBmYWxzZSk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHQucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOwotICAgICAgICAgICAgICAgIGZhaWwoIkNvdWxkIG5vdCBsb2FkIGNsYXNzICIgKyBjbGFzc05hbWUgKyAiOiAiICsgdCk7CisgICAgICAgICAgICAgICAgZmFpbCgiQ291bGQgbm90IGxvYWQgY2xhc3MgIiArIGNsYXNzTmFtZSwgdCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQorICAgICAgICBjaGVja0Vycm9yKGV4cGVjdGVkRXJyb3JDbGFzcywgbnVsbCwgZmFsc2UpOworICAgICAgICByZXR1cm4gYzsKICAgICB9CiAKICAgICAvKioKQEAgLTgwLDcgKzc5LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAobWV0aG9kID09IG51bGwpIHsKLSAgICAgICAgICAgIGZhaWwoIkNvdWxkIG5vdCBmaW5kIG1ldGhvZCAncnVuJyIpOworICAgICAgICAgICAgZmFpbCgiQ291bGQgbm90IGZpbmQgbWV0aG9kICdydW4nIiwgbnVsbCk7CiAgICAgICAgIH0KIAogICAgICAgICBPYmplY3QgcmVjZWl2ZXIgPSBudWxsOwpAQCAtODgsMTYgKzg3LDE3IEBACiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIHJlY2VpdmVyID0gYy5uZXdJbnN0YW5jZSgpOwogICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4YykgewotICAgICAgICAgICAgICAgIGZhaWwoIkNvdWxkIG5vdCBpbnN0YW50aWF0ZSAiICsgY2xhc3NOYW1lICsgIjogIiArIGV4Yy5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgIGZhaWwoIkNvdWxkIG5vdCBpbnN0YW50aWF0ZSAiICsgY2xhc3NOYW1lLCBleGMpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG1ldGhvZC5pbnZva2UocmVjZWl2ZXIsIGFyZ3MpOwotICAgICAgICAgICAgY2hlY2tFcnJvcihleHBlY3RlZEVycm9yQ2xhc3MsIG51bGwsIGZhbHNlKTsKICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKICAgICAgICAgICAgIGNoZWNrRXJyb3IoZXhwZWN0ZWRFcnJvckNsYXNzLCB0LCB3cmFwcGVkKTsKKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQorICAgICAgICBjaGVja0Vycm9yKGV4cGVjdGVkRXJyb3JDbGFzcywgbnVsbCwgZmFsc2UpOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2FkQW5kUnVuKFN0cmluZyBjbGFzc05hbWUsIENsYXNzPD8+IGV4cGVjdGVkRXJyb3JDbGFzcykgewpAQCAtMTA5LDE5ICsxMDksMjYgQEAKICAgICB9CiAKICAgICBzdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0RXF1YWxzKGludCBleHBlY3RlZCwgaW50IGFjdHVhbCkgewotICAgICAgICBpZiAoZXhwZWN0ZWQgIT0gYWN0dWFsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQXNzZXJ0aW9uRmFpbGVkRXJyb3I6IG5vdCBlcXVhbHMuIEV4cGVjdGVkICIgKyBleHBlY3RlZCArICIgYWN0dWFsICIgKyBhY3R1YWwpOworICAgICAgICBpZiAoZXhwZWN0ZWQgIT0gYWN0dWFsKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIm5vdCBlcXVhbHMuIEV4cGVjdGVkICIgKyBleHBlY3RlZCArICIgYWN0dWFsICIgKyBhY3R1YWwpOwogICAgIH0KIAogICAgIHN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoU3RyaW5nIG1lc3NhZ2UsIGludCBleHBlY3RlZCwgaW50IGFjdHVhbCkgewotICAgICAgICBpZiAoZXhwZWN0ZWQgIT0gYWN0dWFsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQXNzZXJ0aW9uRmFpbGVkRXJyb3I6IG5vdCBlcXVhbHM6ICIgKyBtZXNzYWdlICsgIiBFeHBlY3RlZCAiICsgZXhwZWN0ZWQgKyAiIGFjdHVhbCAiICsgYWN0dWFsKTsKKyAgICAgICAgaWYgKGV4cGVjdGVkICE9IGFjdHVhbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJub3QgZXF1YWxzOiAiICsgbWVzc2FnZSArICIgRXhwZWN0ZWQgIiArIGV4cGVjdGVkICsgIiBhY3R1YWwgIiArIGFjdHVhbCk7CiAgICAgfQogCiAgICAgc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydEVxdWFscyhsb25nIGV4cGVjdGVkLCBsb25nIGFjdHVhbCkgewotICAgICAgICBpZiAoZXhwZWN0ZWQgIT0gYWN0dWFsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQXNzZXJ0aW9uRmFpbGVkRXJyb3I6IG5vdCBlcXVhbHMuIEV4cGVjdGVkICIgKyBleHBlY3RlZCArICIgYWN0dWFsICIgKyBhY3R1YWwpOworICAgICAgICBpZiAoZXhwZWN0ZWQgIT0gYWN0dWFsKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIm5vdCBlcXVhbHMuIEV4cGVjdGVkICIgKyBleHBlY3RlZCArICIgYWN0dWFsICIgKyBhY3R1YWwpOwogICAgIH0KIAogICAgIHN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoZG91YmxlIGV4cGVjdGVkLCBkb3VibGUgYWN0dWFsLCBkb3VibGUgZGVsdGEpIHsKLSAgICAgICAgaWYoIShNYXRoLmFicyhleHBlY3RlZC1hY3R1YWwpIDw9IGRlbHRhKSkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkFzc2VydGlvbkZhaWxlZEVycm9yOiBub3Qgd2l0aGluIGRlbHRhIik7CisgICAgICAgIGlmICghKE1hdGguYWJzKGV4cGVjdGVkIC0gYWN0dWFsKSA8PSBkZWx0YSkpCisgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKCJub3Qgd2l0aGluIGRlbHRhIik7CiAgICAgfQogCiAgICAgc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydEVxdWFscyhPYmplY3QgZXhwZWN0ZWQsIE9iamVjdCBhY3R1YWwpIHsKQEAgLTEyOSwyNiArMTM2LDM0IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIGlmIChleHBlY3RlZCAhPSBudWxsICYmIGV4cGVjdGVkLmVxdWFscyhhY3R1YWwpKQogICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQXNzZXJ0aW9uRmFpbGVkRXJyb3I6IG5vdCB0aGUgc2FtZSIpOworICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKCJub3QgdGhlIHNhbWU6ICIgKyBleHBlY3RlZCArICIgdnMgIiArIGFjdHVhbCk7CiAgICAgfQogCiAgICAgc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydFRydWUoYm9vbGVhbiBjb25kaXRpb24pIHsKLSAgICAgICAgaWYgKCFjb25kaXRpb24pIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJBc3NlcnRpb25GYWlsZWRFcnJvcjogY29uZGl0aW9uIHdhcyBmYWxzZSIpOworICAgICAgICBpZiAoIWNvbmRpdGlvbikKKyAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oImNvbmRpdGlvbiB3YXMgZmFsc2UiKTsKICAgICB9CiAKICAgICBzdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0RmFsc2UoYm9vbGVhbiBjb25kaXRpb24pIHsKLSAgICAgICAgaWYgKGNvbmRpdGlvbikgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkFzc2VydGlvbkZhaWxlZEVycm9yOiBjb25kaXRpb24gd2FzIHRydWUiKTsKKyAgICAgICAgaWYgKGNvbmRpdGlvbikKKyAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oImNvbmRpdGlvbiB3YXMgdHJ1ZSIpOwogICAgIH0KIAogICAgIHN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnROb3ROdWxsKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQXNzZXJ0aW9uRmFpbGVkRXJyb3I6IG9iamVjdCB3YXMgbnVsbCIpOworICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKCJvYmplY3Qgd2FzIG51bGwiKTsKICAgICB9CiAKICAgICBzdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0TnVsbChPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIGlmIChvYmplY3QgIT0gbnVsbCkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkFzc2VydGlvbkZhaWxlZEVycm9yOiBvYmplY3Qgd2FzIG5vdCBudWxsIik7CisgICAgICAgIGlmIChvYmplY3QgIT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oIm9iamVjdCB3YXMgbm90IG51bGwiKTsKICAgICB9CiAKICAgICBzdGF0aWMgcHVibGljIHZvaWQgZmFpbChTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQXNzZXJ0aW9uRmFpbGVkRXJyb3IgbXNnOiIrbWVzc2FnZSk7CisgICAgICAgIGZhaWwobWVzc2FnZSwgbnVsbCk7CisgICAgfQorCisgICAgc3RhdGljIHB1YmxpYyB2b2lkIGZhaWwoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgeworICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKG1lc3NhZ2UsIGNhdXNlKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS90b29scy92bS10ZXN0cy10Zi9zcmMvdXRpbC9idWlsZC9CdWlsZERhbHZpa1N1aXRlLmphdmEgYi90b29scy92bS10ZXN0cy10Zi9zcmMvdXRpbC9idWlsZC9CdWlsZERhbHZpa1N1aXRlLmphdmEKaW5kZXggMTg3ODU4Yy4uZTIyMzI4OSAxMDA2NDQKLS0tIGEvdG9vbHMvdm0tdGVzdHMtdGYvc3JjL3V0aWwvYnVpbGQvQnVpbGREYWx2aWtTdWl0ZS5qYXZhCisrKyBiL3Rvb2xzL3ZtLXRlc3RzLXRmL3NyYy91dGlsL2J1aWxkL0J1aWxkRGFsdmlrU3VpdGUuamF2YQpAQCAtODIsNyArODIsNiBAQAogCiAgICAgcHJpdmF0ZSBpbnQgdGVzdENsYXNzQ250ID0gMDsKICAgICBwcml2YXRlIGludCB0ZXN0TWV0aG9kc0NudCA9IDA7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHVzZUphY2s7CiAKICAgICAvKgogICAgICAqIHVzaW5nIGEgbGlua2VkIGhhc2htYXAgdG8ga2VlcCB0aGUgaW5zZXJ0aW9uIG9yZGVyIGZvciBpdGVyYXRvcnMuCkBAIC0xMTIsNyArMTExLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgQnVpbGREYWx2aWtTdWl0ZSBjYXQgPSBuZXcgQnVpbGREYWx2aWtTdWl0ZShmYWxzZSk7CisgICAgICAgIEJ1aWxkRGFsdmlrU3VpdGUgY2F0ID0gbmV3IEJ1aWxkRGFsdmlrU3VpdGUoKTsKICAgICAgICAgY2F0LmNvbXBvc2UoKTsKICAgICAgICAgbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKIApAQCAtMTQ5LDEwICsxNDgsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIltyZXN0cmljdC10by1vcGNvZGVdIik7CiAgICAgfQogCi0gICAgcHVibGljIEJ1aWxkRGFsdmlrU3VpdGUoYm9vbGVhbiB1c2VKYWNrKSB7Ci0gICAgICB0aGlzLnVzZUphY2sgPSB1c2VKYWNrOwotICAgIH0KLQogICAgIHB1YmxpYyB2b2lkIGNvbXBvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbGxlY3RpbmcgYWxsIGp1bml0IHRlc3RzLi4uIik7CiAgICAgICAgIG5ldyBUZXN0UnVubmVyKCkgewpAQCAtMjk2LDEyICsyOTEsNyBAQAogICAgICAgICAgICAgSE9TVEpVTklUX0NMQVNTRVNfT1VUUFVUX0ZPTERFUiwgQ0xBU1NfUEFUSCk7CiAKICAgICAgICAgU3RyaW5nIG1haW5zSmFyID0gT1VUUFVUX0ZPTERFUiArIEZpbGUuc2VwYXJhdG9yICsgVEFSR0VUX01BSU5fRklMRTsKLSAgICAgICAgaWYgKHVzZUphY2spIHsKLSAgICAgICAgICAgIHNyY0J1aWxkU3RlcCA9IG5ldyBKYWNrQnVpbGRTdGVwKG1haW5zSmFyLAotICAgICAgICAgICAgQ0xBU1NfUEFUSCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzcmNCdWlsZFN0ZXAgPSBuZXcgSmF2YWNCdWlsZFN0ZXAoQ0xBU1NFU19PVVRQVVRfRk9MREVSLCBDTEFTU19QQVRIKTsKLSAgICAgICAgfQorICAgICAgICBzcmNCdWlsZFN0ZXAgPSBuZXcgSmF2YWNCdWlsZFN0ZXAoQ0xBU1NFU19PVVRQVVRfRk9MREVSLCBDTEFTU19QQVRIKTsKIAogICAgICAgICBmb3IgKEVudHJ5PFN0cmluZywgTGlzdDxTdHJpbmc+PiBlbnRyeSA6IG1hcC5lbnRyeVNldCgpKSB7CiAKQEAgLTQ1NSwxNCArNDQ1LDEyIEBACiAKICAgICAgICAgfQogCi0gICAgICAgIGlmICghdXNlSmFjaykgewotICAgICAgICAgIER4QnVpbGRTdGVwIGRleEJ1aWxkU3RlcCA9IG5ldyBEeEJ1aWxkU3RlcCgKLSAgICAgICAgICAgICAgbmV3IEJ1aWxkU3RlcC5CdWlsZEZpbGUobmV3IEZpbGUoQ0xBU1NFU19PVVRQVVRfRk9MREVSKSksCi0gICAgICAgICAgICAgIG5ldyBCdWlsZFN0ZXAuQnVpbGRGaWxlKG5ldyBGaWxlKG1haW5zSmFyKSksCi0gICAgICAgICAgICAgIGZhbHNlKTsKKyAgICAgICAgRDhCdWlsZFN0ZXAgZGV4QnVpbGRTdGVwID0gbmV3IEQ4QnVpbGRTdGVwKAorICAgICAgICAgICAgbmV3IEJ1aWxkU3RlcC5CdWlsZEZpbGUobmV3IEZpbGUoQ0xBU1NFU19PVVRQVVRfRk9MREVSKSksCisgICAgICAgICAgICBuZXcgQnVpbGRTdGVwLkJ1aWxkRmlsZShuZXcgRmlsZShtYWluc0phcikpLAorICAgICAgICAgICAgZmFsc2UpOwogCi0gICAgICAgICAgdGFyZ2V0cy5hZGQoZGV4QnVpbGRTdGVwKTsKLSAgICAgICAgfQorICAgICAgICB0YXJnZXRzLmFkZChkZXhCdWlsZFN0ZXApOwogCiAgICAgICAgIC8vIHdyaXRlIGxhdGVzdCBIT1NUSlVOSVQgZ2VuZXJhdGVkIGZpbGUuCiAgICAgICAgIGZsdXNoSG9zdEp1bml0RmlsZSgpOwpAQCAtNTQ2LDM2ICs1MzQsMTYgQEAKICAgICAgICAgRmlsZSBzcmNGaWxlID0gbmV3IEZpbGUoc291cmNlRm9sZGVyLCBmaWxlTmFtZSArICIuamF2YSIpOwogICAgICAgICBpZiAoc3JjRmlsZS5leGlzdHMoKSkgewogICAgICAgICAgICAgQnVpbGRTdGVwIGRleEJ1aWxkU3RlcDsKLSAgICAgICAgICAgIGlmICh1c2VKYWNrKSB7Ci0gICAgICAgICAgICAgICAgSmFja0J1aWxkU3RlcCBqYWNrQnVpbGRTdGVwID0gbmV3IEphY2tCdWlsZFN0ZXAoCi0gICAgICAgICAgICAgICAgICAgIE9VVFBVVF9GT0xERVIgKyBGaWxlLnNlcGFyYXRvciArIGZpbGVOYW1lICsgIi5qYXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgQ0xBU1NfUEFUSCk7Ci0gICAgICAgICAgICAgICAgamFja0J1aWxkU3RlcC5hZGRTb3VyY2VGaWxlKHNyY0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgICAgIGRleEJ1aWxkU3RlcCA9IGphY2tCdWlsZFN0ZXA7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBkZXhCdWlsZFN0ZXAgPSBnZW5lcmF0ZURleEJ1aWxkU3RlcCgKLSAgICAgICAgICAgICAgICBDT01QSUxFRF9DTEFTU0VTX0ZPTERFUiwgZmlsZU5hbWUsIG51bGwpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgZGV4QnVpbGRTdGVwID0gZ2VuZXJhdGVEZXhCdWlsZFN0ZXAoCisgICAgICAgICAgICAgIENPTVBJTEVEX0NMQVNTRVNfRk9MREVSLCBmaWxlTmFtZSk7CiAgICAgICAgICAgICB0YXJnZXRzLmFkZChkZXhCdWlsZFN0ZXApOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGlmIChDbGFzcy5mb3JOYW1lKGRlcGVuZGVudFRlc3RDbGFzc05hbWUpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBKaWxsQnVpbGRTdGVwIGppbGxCdWlsZFN0ZXAgPSBudWxsOwotICAgICAgICAgICAgICAgIGlmICh1c2VKYWNrKSB7Ci0gICAgICAgICAgICAgICAgICAgIEJ1aWxkU3RlcC5CdWlsZEZpbGUgY2xhc3NGaWxlID0gbmV3IEJ1aWxkU3RlcC5CdWlsZEZpbGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBDT01QSUxFRF9DTEFTU0VTX0ZPTERFUiwgZmlsZU5hbWUgKyAiLmNsYXNzIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgQnVpbGRTdGVwLkJ1aWxkRmlsZSBqYWNrRmlsZSA9IG5ldyBCdWlsZFN0ZXAuQnVpbGRGaWxlKAotICAgICAgICAgICAgICAgICAgICAgICAgQ09NUElMRURfQ0xBU1NFU19GT0xERVIsCi0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSArICIuamFjayIpOwotCi0gICAgICAgICAgICAgICAgICAgIGppbGxCdWlsZFN0ZXAgPSBuZXcgSmlsbEJ1aWxkU3RlcChjbGFzc0ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBqYWNrRmlsZSk7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIEJ1aWxkU3RlcCBkZXhCdWlsZFN0ZXAgPSBnZW5lcmF0ZURleEJ1aWxkU3RlcCgKLSAgICAgICAgICAgICAgICAgICAgQ09NUElMRURfQ0xBU1NFU19GT0xERVIsIGZpbGVOYW1lLCBqaWxsQnVpbGRTdGVwKTsKKyAgICAgICAgICAgICAgICAgICAgQ09NUElMRURfQ0xBU1NFU19GT0xERVIsIGZpbGVOYW1lKTsKICAgICAgICAgICAgICAgICB0YXJnZXRzLmFkZChkZXhCdWlsZFN0ZXApOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KQEAgLTU4OCw1MSArNTU2LDI3IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBCdWlsZFN0ZXAgZ2VuZXJhdGVEZXhCdWlsZFN0ZXAoU3RyaW5nIGNsYXNzRmlsZUZvbGRlciwKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc0ZpbGVOYW1lLCBCdWlsZFN0ZXAgZGVwZW5kZW5jeSkgewotICAgICAgICBpZiAoIXVzZUphY2spIHsKLSAgICAgICAgICAgIEJ1aWxkU3RlcC5CdWlsZEZpbGUgY2xhc3NGaWxlID0gbmV3IEJ1aWxkU3RlcC5CdWlsZEZpbGUoCi0gICAgICAgICAgICAgICAgICAgIGNsYXNzRmlsZUZvbGRlciwgY2xhc3NGaWxlTmFtZSArICIuY2xhc3MiKTsKKyAgICAgICAgICAgIFN0cmluZyBjbGFzc0ZpbGVOYW1lKSB7CisgICAgICAgIEJ1aWxkU3RlcC5CdWlsZEZpbGUgY2xhc3NGaWxlID0gbmV3IEJ1aWxkU3RlcC5CdWlsZEZpbGUoCisgICAgICAgICAgICAgICAgY2xhc3NGaWxlRm9sZGVyLCBjbGFzc0ZpbGVOYW1lICsgIi5jbGFzcyIpOwogCi0gICAgICAgICAgICBCdWlsZFN0ZXAuQnVpbGRGaWxlIHRtcEphckZpbGUgPSBuZXcgQnVpbGRTdGVwLkJ1aWxkRmlsZSgKLSAgICAgICAgICAgICAgICAgICAgT1VUUFVUX0ZPTERFUiwKLSAgICAgICAgICAgICAgICAgICAgY2xhc3NGaWxlTmFtZSArICJfdG1wLmphciIpOworICAgICAgICBCdWlsZFN0ZXAuQnVpbGRGaWxlIHRtcEphckZpbGUgPSBuZXcgQnVpbGRTdGVwLkJ1aWxkRmlsZSgKKyAgICAgICAgICAgICAgICBPVVRQVVRfRk9MREVSLAorICAgICAgICAgICAgICAgIGNsYXNzRmlsZU5hbWUgKyAiX3RtcC5qYXIiKTsKIAotICAgICAgICAgICAgSmFyQnVpbGRTdGVwIGphckJ1aWxkU3RlcCA9IG5ldyBKYXJCdWlsZFN0ZXAoY2xhc3NGaWxlLAotICAgICAgICAgICAgICAgICAgICBjbGFzc0ZpbGVOYW1lICsgIi5jbGFzcyIsIHRtcEphckZpbGUsIGZhbHNlKTsKKyAgICAgICAgSmFyQnVpbGRTdGVwIGphckJ1aWxkU3RlcCA9IG5ldyBKYXJCdWlsZFN0ZXAoY2xhc3NGaWxlLAorICAgICAgICAgICAgICAgIGNsYXNzRmlsZU5hbWUgKyAiLmNsYXNzIiwgdG1wSmFyRmlsZSwgZmFsc2UpOwogCi0gICAgICAgICAgICBpZiAoZGVwZW5kZW5jeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamFyQnVpbGRTdGVwLmFkZENoaWxkKGRlcGVuZGVuY3kpOwotICAgICAgICAgICAgfQorICAgICAgICBCdWlsZFN0ZXAuQnVpbGRGaWxlIG91dHB1dEZpbGUgPSBuZXcgQnVpbGRTdGVwLkJ1aWxkRmlsZSgKKyAgICAgICAgICAgICAgICBPVVRQVVRfRk9MREVSLAorICAgICAgICAgICAgICAgIGNsYXNzRmlsZU5hbWUgKyAiLmphciIpOwogCi0gICAgICAgICAgICBCdWlsZFN0ZXAuQnVpbGRGaWxlIG91dHB1dEZpbGUgPSBuZXcgQnVpbGRTdGVwLkJ1aWxkRmlsZSgKLSAgICAgICAgICAgICAgICAgICAgT1VUUFVUX0ZPTERFUiwKLSAgICAgICAgICAgICAgICAgICAgY2xhc3NGaWxlTmFtZSArICIuamFyIik7CisgICAgICAgIEQ4QnVpbGRTdGVwIGRleEJ1aWxkU3RlcCA9IG5ldyBEOEJ1aWxkU3RlcCh0bXBKYXJGaWxlLAorICAgICAgICAgICAgICAgIG91dHB1dEZpbGUsCisgICAgICAgICAgICAgICAgdHJ1ZSk7CiAKLSAgICAgICAgICAgIER4QnVpbGRTdGVwIGRleEJ1aWxkU3RlcCA9IG5ldyBEeEJ1aWxkU3RlcCh0bXBKYXJGaWxlLAotICAgICAgICAgICAgICAgICAgICBvdXRwdXRGaWxlLAotICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLQotICAgICAgICAgICAgZGV4QnVpbGRTdGVwLmFkZENoaWxkKGphckJ1aWxkU3RlcCk7Ci0gICAgICAgICAgICByZXR1cm4gZGV4QnVpbGRTdGVwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIEJ1aWxkU3RlcC5CdWlsZEZpbGUgamFja0ZpbGUgPSBuZXcgQnVpbGRTdGVwLkJ1aWxkRmlsZSgKLSAgICAgICAgICAgICAgY2xhc3NGaWxlRm9sZGVyLCBjbGFzc0ZpbGVOYW1lICsgIi5qYWNrIik7Ci0KLSAgICAgICAgICBCdWlsZFN0ZXAuQnVpbGRGaWxlIG91dHB1dEZpbGUgPSBuZXcgQnVpbGRTdGVwLkJ1aWxkRmlsZSgKLSAgICAgICAgICAgICAgICAgIE9VVFBVVF9GT0xERVIsCi0gICAgICAgICAgICAgICAgICBjbGFzc0ZpbGVOYW1lICsgIi5qYXIiKTsKLQotICAgICAgICAgIEphY2tEZXhCdWlsZFN0ZXAgZGV4QnVpbGRTdGVwID0gbmV3IEphY2tEZXhCdWlsZFN0ZXAoamFja0ZpbGUsCi0gICAgICAgICAgICAgICAgICBvdXRwdXRGaWxlLAotICAgICAgICAgICAgICAgICAgdHJ1ZSk7Ci0KLSAgICAgICAgICBpZiAoZGVwZW5kZW5jeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgIGRleEJ1aWxkU3RlcC5hZGRDaGlsZChkZXBlbmRlbmN5KTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJuIGRleEJ1aWxkU3RlcDsKLQotICAgICAgICB9Ci0KKyAgICAgICAgZGV4QnVpbGRTdGVwLmFkZENoaWxkKGphckJ1aWxkU3RlcCk7CisgICAgICAgIHJldHVybiBkZXhCdWlsZFN0ZXA7CiAgICAgfQogCiAgICAgLyoqCkBAIC03MzUsOSArNjc5LDEwIEBACiAgICAgICAgICAgICBGaWxlUmVhZGVyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKGYpOwogICAgICAgICAgICAgcmVhZGVyLnNraXAocmVzdWx0LmVuZCgpKTsKIAotICAgICAgICAgICAgY2hhciBjdXJyZW50Q2hhcjsKKyAgICAgICAgICAgIGludCByZWFkUmVzdWx0OwogICAgICAgICAgICAgaW50IGJsb2NrcyA9IDE7Ci0gICAgICAgICAgICB3aGlsZSAoKGN1cnJlbnRDaGFyID0gKGNoYXIpIHJlYWRlci5yZWFkKCkpICE9IC0xICYmIGJsb2NrcyA+IDApIHsKKyAgICAgICAgICAgIHdoaWxlICgocmVhZFJlc3VsdCA9IHJlYWRlci5yZWFkKCkpICE9IC0xICYmIGJsb2NrcyA+IDApIHsKKyAgICAgICAgICAgICAgICBjaGFyIGN1cnJlbnRDaGFyID0gKGNoYXIpIHJlYWRSZXN1bHQ7CiAgICAgICAgICAgICAgICAgc3dpdGNoIChjdXJyZW50Q2hhcikgewogICAgICAgICAgICAgICAgICAgICBjYXNlICd9JzogewogICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzLS07CmRpZmYgLS1naXQgYS90b29scy92bS10ZXN0cy10Zi9zcmMvdXRpbC9idWlsZC9CeXRlc1N0cmVhbVN1Y2tlci5qYXZhIGIvdG9vbHMvdm0tdGVzdHMtdGYvc3JjL3V0aWwvYnVpbGQvQnl0ZXNTdHJlYW1TdWNrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI0M2MxNy4uMDAwMDAwMAotLS0gYS90b29scy92bS10ZXN0cy10Zi9zcmMvdXRpbC9idWlsZC9CeXRlc1N0cmVhbVN1Y2tlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdXRpbC5idWlsZDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLQotaW1wb3J0IGphdmF4LmFubm90YXRpb24uTm9ubnVsbDsKLQotLyoqCi0gKiBDbGFzcyB0aGF0IGNvbnRpbnVvdXNseSByZWFkIGFuIHtAbGluayBJbnB1dFN0cmVhbX0gYW5kIG9wdGlvbmFsbHkgY291bGQgd3JpdGUgdGhlIGlucHV0IGluIGEKLSAqIHtAbGluayBPdXRwdXRTdHJlYW19LgotICovCi1wdWJsaWMgY2xhc3MgQnl0ZXNTdHJlYW1TdWNrZXIgewotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVUZGRVJfU0laRSA9IDQwOTY7Ci0KLSAgQE5vbm51bGwKLSAgcHJpdmF0ZSBmaW5hbCBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbQlVGRkVSX1NJWkVdOwotCi0gIEBOb25udWxsCi0gIHByaXZhdGUgZmluYWwgSW5wdXRTdHJlYW0gaXM7Ci0KLSAgQE5vbm51bGwKLSAgcHJpdmF0ZSBmaW5hbCBPdXRwdXRTdHJlYW0gb3M7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHRvQmVDbG9zZTsKLQotICBwdWJsaWMgQnl0ZXNTdHJlYW1TdWNrZXIoCi0gICAgICBATm9ubnVsbCBJbnB1dFN0cmVhbSBpcywgQE5vbm51bGwgT3V0cHV0U3RyZWFtIG9zLCBib29sZWFuIHRvQmVDbG9zZSkgewotICAgIHRoaXMuaXMgPSBpczsKLSAgICB0aGlzLm9zID0gb3M7Ci0gICAgdGhpcy50b0JlQ2xvc2UgPSB0b0JlQ2xvc2U7Ci0gIH0KLQotICBwdWJsaWMgQnl0ZXNTdHJlYW1TdWNrZXIoQE5vbm51bGwgSW5wdXRTdHJlYW0gaXMsIEBOb25udWxsIE91dHB1dFN0cmVhbSBvcykgewotICAgIHRoaXMoaXMsIG9zLCBmYWxzZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzdWNrKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICB0cnkgewotICAgICAgaW50IGJ5dGVzUmVhZDsKLSAgICAgIHdoaWxlICgoYnl0ZXNSZWFkID0gaXMucmVhZChidWZmZXIpKSA+PSAwKSB7Ci0gICAgICAgIG9zLndyaXRlKGJ1ZmZlciwgMCwgYnl0ZXNSZWFkKTsKLSAgICAgICAgb3MuZmx1c2goKTsKLSAgICAgIH0KLSAgICB9IGZpbmFsbHkgewotICAgICAgaWYgKHRvQmVDbG9zZSkgewotICAgICAgICBvcy5jbG9zZSgpOwotICAgICAgfQotICAgIH0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3ZtLXRlc3RzLXRmL3NyYy91dGlsL2J1aWxkL0NoYXJhY3RlcnNTdHJlYW1TdWNrZXIuamF2YSBiL3Rvb2xzL3ZtLXRlc3RzLXRmL3NyYy91dGlsL2J1aWxkL0NoYXJhY3RlcnNTdHJlYW1TdWNrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U0ZGZiMS4uMDAwMDAwMAotLS0gYS90b29scy92bS10ZXN0cy10Zi9zcmMvdXRpbC9idWlsZC9DaGFyYWN0ZXJzU3RyZWFtU3Vja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSB1dGlsLmJ1aWxkOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotCi1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Ob25udWxsOwotCi0vKioKLSAqIENsYXNzIHRoYXQgY29udGludW91c2x5IHJlYWQgYW4ge0BsaW5rIElucHV0U3RyZWFtfSBhbmQgb3B0aW9uYWxseSBjb3VsZCBwcmludCB0aGUgaW5wdXQgaW4gYQotICoge0BsaW5rIFByaW50U3RyZWFtfS4KLSAqLwotcHVibGljIGNsYXNzIENoYXJhY3RlcnNTdHJlYW1TdWNrZXIgewotCi0gIEBOb25udWxsCi0gIHByaXZhdGUgZmluYWwgQnVmZmVyZWRSZWFkZXIgaXI7Ci0KLSAgQE5vbm51bGwKLSAgcHJpdmF0ZSBmaW5hbCBQcmludFN0cmVhbSBvczsKLQotICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gdG9CZUNsb3NlOwotCi0gIHB1YmxpYyBDaGFyYWN0ZXJzU3RyZWFtU3Vja2VyKAotICAgICAgQE5vbm51bGwgSW5wdXRTdHJlYW0gaXMsIEBOb25udWxsIFByaW50U3RyZWFtIG9zLCBib29sZWFuIHRvQmVDbG9zZSkgewotICAgIHRoaXMuaXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGlzKSk7Ci0gICAgdGhpcy5vcyA9IG9zOwotICAgIHRoaXMudG9CZUNsb3NlID0gdG9CZUNsb3NlOwotICB9Ci0KLSAgcHVibGljIENoYXJhY3RlcnNTdHJlYW1TdWNrZXIoQE5vbm51bGwgSW5wdXRTdHJlYW0gaXMsIEBOb25udWxsIFByaW50U3RyZWFtIG9zKSB7Ci0gICAgdGhpcyhpcywgb3MsIGZhbHNlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHN1Y2soKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIFN0cmluZyBsaW5lOwotCi0gICAgdHJ5IHsKLSAgICAgIHdoaWxlICgobGluZSA9IGlyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLSAgICAgICAgb3MucHJpbnRsbihsaW5lKTsKLSAgICAgIH0KLSAgICB9IGZpbmFsbHkgewotICAgICAgaWYgKHRvQmVDbG9zZSkgewotICAgICAgICBvcy5jbG9zZSgpOwotICAgICAgfQotICAgIH0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3ZtLXRlc3RzLXRmL3NyYy91dGlsL2J1aWxkL0Q4QnVpbGRTdGVwLmphdmEgYi90b29scy92bS10ZXN0cy10Zi9zcmMvdXRpbC9idWlsZC9EOEJ1aWxkU3RlcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMmMyODEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy92bS10ZXN0cy10Zi9zcmMvdXRpbC9idWlsZC9EOEJ1aWxkU3RlcC5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHV0aWwuYnVpbGQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC50b29scy5yOC5Db21waWxhdGlvbk1vZGU7CitpbXBvcnQgY29tLmFuZHJvaWQudG9vbHMucjguRDg7CitpbXBvcnQgY29tLmFuZHJvaWQudG9vbHMucjguRDhDb21tYW5kOworaW1wb3J0IGNvbS5hbmRyb2lkLnRvb2xzLnI4Lk91dHB1dE1vZGU7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoczsKK2ltcG9ydCBqYXZhLm5pby5maWxlLmF0dHJpYnV0ZS5CYXNpY0ZpbGVBdHRyaWJ1dGVzOworCitwdWJsaWMgY2xhc3MgRDhCdWlsZFN0ZXAgZXh0ZW5kcyBCdWlsZFN0ZXAgeworCisgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBkZWxldGVJbnB1dEZpbGVBZnRlckJ1aWxkOworICBwcml2YXRlIGZpbmFsIEQ4Q29tbWFuZC5CdWlsZGVyIGJ1aWxkZXI7CisKKyAgRDhCdWlsZFN0ZXAoQnVpbGRGaWxlIGlucHV0RmlsZSwgQnVpbGRGaWxlIG91dHB1dEZpbGUsIGJvb2xlYW4gZGVsZXRlSW5wdXRGaWxlQWZ0ZXJCdWlsZCkgeworICAgIHN1cGVyKGlucHV0RmlsZSwgb3V0cHV0RmlsZSk7CisgICAgdGhpcy5kZWxldGVJbnB1dEZpbGVBZnRlckJ1aWxkID0gZGVsZXRlSW5wdXRGaWxlQWZ0ZXJCdWlsZDsKKyAgICB0aGlzLmJ1aWxkZXIgPQorICAgICAgICBEOENvbW1hbmQuYnVpbGRlcigpCisgICAgICAgICAgICAuc2V0TW9kZShDb21waWxhdGlvbk1vZGUuREVCVUcpCisgICAgICAgICAgICAuc2V0TWluQXBpTGV2ZWwoMTAwMCkKKyAgICAgICAgICAgIC5zZXRFbmFibGVEZXN1Z2FyaW5nKGZhbHNlKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBib29sZWFuIGJ1aWxkKCkgeworCisgICAgaWYgKHN1cGVyLmJ1aWxkKCkpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGJ1aWxkZXIuc2V0T3V0cHV0KFBhdGhzLmdldChvdXRwdXRGaWxlLmZpbGVOYW1lLmdldEFic29sdXRlUGF0aCgpKSwgT3V0cHV0TW9kZS5EZXhJbmRleGVkKTsKKyAgICAgICAgRmlsZXMuZmluZCgKKyAgICAgICAgICAgICAgICBQYXRocy5nZXQoaW5wdXRGaWxlLmZpbGVOYW1lLmdldEFic29sdXRlUGF0aCgpKSwKKyAgICAgICAgICAgICAgICAxMDAwLAorICAgICAgICAgICAgICAgIEQ4QnVpbGRTdGVwOjppc0phck9yQ2xhc3NGaWxlKQorICAgICAgICAgICAgLmZvckVhY2goCisgICAgICAgICAgICAgICAgcCAtPiB7CisgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFkZFByb2dyYW1GaWxlcyhwKTsKKyAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIEQ4LnJ1bihidWlsZGVyLmJ1aWxkKCkpOworICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgaWYgKGRlbGV0ZUlucHV0RmlsZUFmdGVyQnVpbGQpIHsKKyAgICAgICAgaW5wdXRGaWxlLmZpbGVOYW1lLmRlbGV0ZSgpOworICAgICAgfQorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgIHJldHVybiBpbnB1dEZpbGUuaGFzaENvZGUoKSBeIG91dHB1dEZpbGUuaGFzaENvZGUoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgIGlmIChzdXBlci5lcXVhbHMob2JqKSkgeworICAgICAgRDhCdWlsZFN0ZXAgb3RoZXIgPSAoRDhCdWlsZFN0ZXApIG9iajsKKworICAgICAgcmV0dXJuIGlucHV0RmlsZS5lcXVhbHMob3RoZXIuaW5wdXRGaWxlKSAmJiBvdXRwdXRGaWxlLmVxdWFscyhvdGhlci5vdXRwdXRGaWxlKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0phck9yQ2xhc3NGaWxlKFBhdGggZmlsZSwgQmFzaWNGaWxlQXR0cmlidXRlcyBhdHRycykgeworICAgIGlmICghYXR0cnMuaXNSZWd1bGFyRmlsZSgpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIFN0cmluZyBuYW1lID0gZmlsZS5nZXRGaWxlTmFtZSgpLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKTsKKyAgICByZXR1cm4gbmFtZS5lbmRzV2l0aCgiLmphciIpIHx8IG5hbWUuZW5kc1dpdGgoIi5jbGFzcyIpOworICB9Cit9CmRpZmYgLS1naXQgYS90b29scy92bS10ZXN0cy10Zi9zcmMvdXRpbC9idWlsZC9EeEJ1aWxkU3RlcC5qYXZhIGIvdG9vbHMvdm0tdGVzdHMtdGYvc3JjL3V0aWwvYnVpbGQvRHhCdWlsZFN0ZXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUzNDdiMi4uMDAwMDAwMAotLS0gYS90b29scy92bS10ZXN0cy10Zi9zcmMvdXRpbC9idWlsZC9EeEJ1aWxkU3RlcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdXRpbC5idWlsZDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmR4LmNvbW1hbmQuZGV4ZXIuTWFpbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgRHhCdWlsZFN0ZXAgZXh0ZW5kcyBCdWlsZFN0ZXAgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGRlbGV0ZUlucHV0RmlsZUFmdGVyQnVpbGQ7Ci0KLSAgICBEeEJ1aWxkU3RlcChCdWlsZEZpbGUgaW5wdXRGaWxlLCBCdWlsZEZpbGUgb3V0cHV0RmlsZSwKLSAgICAgICAgICAgIGJvb2xlYW4gZGVsZXRlSW5wdXRGaWxlQWZ0ZXJCdWlsZCkgewotICAgICAgICBzdXBlcihpbnB1dEZpbGUsIG91dHB1dEZpbGUpOwotICAgICAgICB0aGlzLmRlbGV0ZUlucHV0RmlsZUFmdGVyQnVpbGQgPSBkZWxldGVJbnB1dEZpbGVBZnRlckJ1aWxkOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIGJvb2xlYW4gYnVpbGQoKSB7Ci0KLSAgICAgICAgaWYgKHN1cGVyLmJ1aWxkKCkpIHsKLSAgICAgICAgICAgIE1haW4uQXJndW1lbnRzIGFyZ3MgPSBuZXcgTWFpbi5Bcmd1bWVudHMoKTsKLQotICAgICAgICAgICAgYXJncy5qYXJPdXRwdXQgPSB0cnVlOwotICAgICAgICAgICAgYXJncy5maWxlTmFtZXMgPSBuZXcgU3RyaW5nW10ge2lucHV0RmlsZS5maWxlTmFtZS5nZXRBYnNvbHV0ZVBhdGgoKX07Ci0KLSAgICAgICAgICAgIGFyZ3Mub3V0TmFtZSA9IG91dHB1dEZpbGUuZmlsZU5hbWUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0KLSAgICAgICAgICAgIGludCByZXN1bHQgPSAwOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBNYWluLnJ1bihhcmdzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRlbGV0ZUlucHV0RmlsZUFmdGVyQnVpbGQpIHsKLSAgICAgICAgICAgICAgICAgICAgaW5wdXRGaWxlLmZpbGVOYW1lLmRlbGV0ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJleGNlcHRpb24gd2hpbGUgZGV4aW5nICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgaW5wdXRGaWxlLmZpbGVOYW1lLmdldEFic29sdXRlUGF0aCgpICsgIiB0byAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGFyZ3Mub3V0TmFtZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICByZXR1cm4gaW5wdXRGaWxlLmhhc2hDb2RlKCkgXiBvdXRwdXRGaWxlLmhhc2hDb2RlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKHN1cGVyLmVxdWFscyhvYmopKSB7Ci0gICAgICAgICAgICBEeEJ1aWxkU3RlcCBvdGhlciA9IChEeEJ1aWxkU3RlcCkgb2JqOwotCi0gICAgICAgICAgICByZXR1cm4gaW5wdXRGaWxlLmVxdWFscyhvdGhlci5pbnB1dEZpbGUpCi0gICAgICAgICAgICAgICAgICAgICYmIG91dHB1dEZpbGUuZXF1YWxzKG90aGVyLm91dHB1dEZpbGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdm0tdGVzdHMtdGYvc3JjL3V0aWwvYnVpbGQvRXhlY3V0ZUZpbGUuamF2YSBiL3Rvb2xzL3ZtLXRlc3RzLXRmL3NyYy91dGlsL2J1aWxkL0V4ZWN1dGVGaWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyOGU0NzcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvdm0tdGVzdHMtdGYvc3JjL3V0aWwvYnVpbGQvRXhlY3V0ZUZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSB1dGlsLmJ1aWxkOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlN0cmVhbVRva2VuaXplcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKLQotaW1wb3J0IGphdmF4LmFubm90YXRpb24uQ2hlY2tGb3JOdWxsOwotaW1wb3J0IGphdmF4LmFubm90YXRpb24uTm9ubnVsbDsKLQotLyoqCi0gKiBDbGFzcyB0byBoYW5kbGUgdGhlIGV4ZWN1dGlvbiBvZiBhbiBleHRlcm5hbCBwcm9jZXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBFeGVjdXRlRmlsZSB7Ci0gIEBOb25udWxsCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nW10gY21kTGluZTsKLQotICBAQ2hlY2tGb3JOdWxsCi0gIHByaXZhdGUgRmlsZSB3b3JrRGlyOwotCi0gIEBDaGVja0Zvck51bGwKLSAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBpblN0cmVhbTsKLSAgcHJpdmF0ZSBib29sZWFuIGluVG9CZUNsb3NlOwotCi0gIEBDaGVja0Zvck51bGwKLSAgcHJpdmF0ZSBPdXRwdXRTdHJlYW0gb3V0U3RyZWFtOwotICBwcml2YXRlIGJvb2xlYW4gb3V0VG9CZUNsb3NlOwotCi0gIEBDaGVja0Zvck51bGwKLSAgcHJpdmF0ZSBPdXRwdXRTdHJlYW0gZXJyU3RyZWFtOwotICBwcml2YXRlIGJvb2xlYW4gZXJyVG9CZUNsb3NlOwotICBwcml2YXRlIGJvb2xlYW4gdmVyYm9zZTsKLQotICBATm9ubnVsbAotICBwcml2YXRlIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCi0gIHB1YmxpYyB2b2lkIHNldEVycihATm9ubnVsbCBGaWxlIGZpbGUpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotICAgIGVyclN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOwotICAgIGVyclRvQmVDbG9zZSA9IHRydWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRPdXQoQE5vbm51bGwgRmlsZSBmaWxlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICBvdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKTsKLSAgICBvdXRUb0JlQ2xvc2UgPSB0cnVlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SW4oQE5vbm51bGwgRmlsZSBmaWxlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICBpblN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7Ci0gICAgaW5Ub0JlQ2xvc2UgPSB0cnVlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RXJyKEBOb25udWxsIE91dHB1dFN0cmVhbSBzdHJlYW0pIHsKLSAgICBlcnJTdHJlYW0gPSBzdHJlYW07Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRPdXQoQE5vbm51bGwgT3V0cHV0U3RyZWFtIHN0cmVhbSkgewotICAgIG91dFN0cmVhbSA9IHN0cmVhbTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEluKEBOb25udWxsIElucHV0U3RyZWFtIHN0cmVhbSkgewotICAgIGluU3RyZWFtID0gc3RyZWFtOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0V29ya2luZ0RpcihATm9ubnVsbCBGaWxlIGRpciwgYm9vbGVhbiBjcmVhdGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgaWYgKCFkaXIuaXNEaXJlY3RvcnkoKSkgewotICAgICAgaWYgKGNyZWF0ZSAmJiAhZGlyLmV4aXN0cygpKSB7Ci0gICAgICAgIGlmICghZGlyLm1rZGlycygpKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJEaXJlY3RvcnkgY3JlYXRpb24gZmFpbGVkIik7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oZGlyLmdldFBhdGgoKSArICIgaXMgbm90IGEgZGlyZWN0b3J5Iik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgd29ya0RpciA9IGRpcjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFZlcmJvc2UoYm9vbGVhbiB2ZXJib3NlKSB7Ci0gICAgdGhpcy52ZXJib3NlID0gdmVyYm9zZTsKLSAgfQotCi0gIHB1YmxpYyBFeGVjdXRlRmlsZShATm9ubnVsbCBGaWxlIGV4ZWMsIEBOb25udWxsIFN0cmluZ1tdIGFyZ3MpIHsKLSAgICBjbWRMaW5lID0gbmV3IFN0cmluZ1thcmdzLmxlbmd0aCArIDFdOwotICAgIFN5c3RlbS5hcnJheWNvcHkoYXJncywgMCwgY21kTGluZSwgMSwgYXJncy5sZW5ndGgpOwotCi0gICAgY21kTGluZVswXSA9IGV4ZWMuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gIH0KLQotICBwdWJsaWMgRXhlY3V0ZUZpbGUoQE5vbm51bGwgU3RyaW5nIGV4ZWMsIEBOb25udWxsIFN0cmluZ1tdIGFyZ3MpIHsKLSAgICBjbWRMaW5lID0gbmV3IFN0cmluZ1thcmdzLmxlbmd0aCArIDFdOwotICAgIFN5c3RlbS5hcnJheWNvcHkoYXJncywgMCwgY21kTGluZSwgMSwgYXJncy5sZW5ndGgpOwotCi0gICAgY21kTGluZVswXSA9IGV4ZWM7Ci0gIH0KLQotICBwdWJsaWMgRXhlY3V0ZUZpbGUoQE5vbm51bGwgRmlsZSBleGVjKSB7Ci0gICAgY21kTGluZSA9IG5ldyBTdHJpbmdbMV07Ci0gICAgY21kTGluZVswXSA9IGV4ZWMuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gIH0KLQotICBwdWJsaWMgRXhlY3V0ZUZpbGUoQE5vbm51bGwgU3RyaW5nW10gY21kTGluZSkgewotICAgIHRoaXMuY21kTGluZSA9IGNtZExpbmUuY2xvbmUoKTsKLSAgfQotCi0gIHB1YmxpYyBFeGVjdXRlRmlsZShATm9ubnVsbCBTdHJpbmcgY21kTGluZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBTdHJpbmdSZWFkZXIgcmVhZGVyID0gbmV3IFN0cmluZ1JlYWRlcihjbWRMaW5lKTsKLSAgICBTdHJlYW1Ub2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmVhbVRva2VuaXplcihyZWFkZXIpOwotICAgIHRva2VuaXplci5yZXNldFN5bnRheCgpOwotICAgIC8vIE9ubHkgc3RhbmRhcmQgc3BhY2VzIGFyZSByZWNvZ25pemVkIGFzIHdoaXRlc3BhY2UgY2hhcnMKLSAgICB0b2tlbml6ZXIud2hpdGVzcGFjZUNoYXJzKCcgJywgJyAnKTsKLSAgICAvLyBNYXRjaGVzIGFscGhhbnVtZXJpY2FsIGFuZCBjb21tb24gc3BlY2lhbCBzeW1ib2xzIGxpa2UgJygnIGFuZCAnKScKLSAgICB0b2tlbml6ZXIud29yZENoYXJzKCchJywgJ3onKTsKLSAgICAvLyBRdW90ZSBjaGFycyB3aWxsIGJlIGlnbm9yZWQgd2hlbiBwYXJzaW5nIHN0cmluZ3MKLSAgICB0b2tlbml6ZXIucXVvdGVDaGFyKCdcJycpOwotICAgIHRva2VuaXplci5xdW90ZUNoYXIoJ1wiJyk7Ci0gICAgQXJyYXlMaXN0PFN0cmluZz4gdG9rZW5zID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgd2hpbGUgKHRva2VuaXplci5uZXh0VG9rZW4oKSAhPSBTdHJlYW1Ub2tlbml6ZXIuVFRfRU9GKSB7Ci0gICAgICBTdHJpbmcgdG9rZW4gPSB0b2tlbml6ZXIuc3ZhbDsKLSAgICAgIGlmICh0b2tlbiAhPSBudWxsKSB7Ci0gICAgICAgIHRva2Vucy5hZGQodG9rZW4pOwotICAgICAgfQotICAgIH0KLSAgICB0aGlzLmNtZExpbmUgPSB0b2tlbnMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJ1bigpIHsKLSAgICBpbnQgcmV0OwotICAgIFByb2Nlc3MgcHJvYyA9IG51bGw7Ci0gICAgVGhyZWFkIHN1Y2tPdXQgPSBudWxsOwotICAgIFRocmVhZCBzdWNrRXJyID0gbnVsbDsKLSAgICBUaHJlYWQgc3Vja0luID0gbnVsbDsKLQotICAgIHRyeSB7Ci0gICAgICBTdHJpbmdCdWlsZGVyIGNtZExpbmVCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgIGZvciAoU3RyaW5nIGFyZyA6IGNtZExpbmUpIHsKLSAgICAgICAgY21kTGluZUJ1aWxkZXIuYXBwZW5kKGFyZykuYXBwZW5kKCcgJyk7Ci0gICAgICB9Ci0gICAgICBpZiAodmVyYm9zZSkgewotICAgICAgICBQcmludFN0cmVhbSBwcmludFN0cmVhbTsKLSAgICAgICAgaWYgKG91dFN0cmVhbSBpbnN0YW5jZW9mIFByaW50U3RyZWFtKSB7Ci0gICAgICAgICAgcHJpbnRTdHJlYW0gPSAoUHJpbnRTdHJlYW0pIG91dFN0cmVhbTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBwcmludFN0cmVhbSA9IFN5c3RlbS5vdXQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocHJpbnRTdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgIHByaW50U3RyZWFtLnByaW50bG4oY21kTGluZUJ1aWxkZXIpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBsb2dnZXIubG9nKExldmVsLkZJTkUsICJFeGVjdXRlOiB7MH0iLCBjbWRMaW5lQnVpbGRlcik7Ci0gICAgICB9Ci0KLSAgICAgIHByb2MgPSBSdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKGNtZExpbmUsIG51bGwsIHdvcmtEaXIpOwotCi0gICAgICBJbnB1dFN0cmVhbSBsb2NhbEluU3RyZWFtID0gaW5TdHJlYW07Ci0gICAgICBpZiAobG9jYWxJblN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgIHN1Y2tJbiA9IG5ldyBUaHJlYWQoCi0gICAgICAgICAgICBuZXcgVGhyZWFkQnl0ZXNTdHJlYW1TdWNrZXIobG9jYWxJblN0cmVhbSwgcHJvYy5nZXRPdXRwdXRTdHJlYW0oKSwgaW5Ub0JlQ2xvc2UpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHByb2MuZ2V0T3V0cHV0U3RyZWFtKCkuY2xvc2UoKTsKLSAgICAgIH0KLQotICAgICAgT3V0cHV0U3RyZWFtIGxvY2FsT3V0U3RyZWFtID0gb3V0U3RyZWFtOwotICAgICAgaWYgKGxvY2FsT3V0U3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgaWYgKGxvY2FsT3V0U3RyZWFtIGluc3RhbmNlb2YgUHJpbnRTdHJlYW0pIHsKLSAgICAgICAgICBzdWNrT3V0ID0gbmV3IFRocmVhZChuZXcgVGhyZWFkQ2hhcmFjdGVyc1N0cmVhbVN1Y2tlcihwcm9jLmdldElucHV0U3RyZWFtKCksCi0gICAgICAgICAgICAgIChQcmludFN0cmVhbSkgbG9jYWxPdXRTdHJlYW0sIG91dFRvQmVDbG9zZSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHN1Y2tPdXQgPSBuZXcgVGhyZWFkKAotICAgICAgICAgICAgICBuZXcgVGhyZWFkQnl0ZXNTdHJlYW1TdWNrZXIocHJvYy5nZXRJbnB1dFN0cmVhbSgpLCBsb2NhbE91dFN0cmVhbSwgb3V0VG9CZUNsb3NlKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgT3V0cHV0U3RyZWFtIGxvY2FsRXJyU3RyZWFtID0gZXJyU3RyZWFtOwotICAgICAgaWYgKGxvY2FsRXJyU3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgaWYgKGxvY2FsRXJyU3RyZWFtIGluc3RhbmNlb2YgUHJpbnRTdHJlYW0pIHsKLSAgICAgICAgICBzdWNrRXJyID0gbmV3IFRocmVhZChuZXcgVGhyZWFkQ2hhcmFjdGVyc1N0cmVhbVN1Y2tlcihwcm9jLmdldEVycm9yU3RyZWFtKCksCi0gICAgICAgICAgICAgIChQcmludFN0cmVhbSkgbG9jYWxFcnJTdHJlYW0sIGVyclRvQmVDbG9zZSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHN1Y2tFcnIgPSBuZXcgVGhyZWFkKAotICAgICAgICAgICAgICBuZXcgVGhyZWFkQnl0ZXNTdHJlYW1TdWNrZXIocHJvYy5nZXRFcnJvclN0cmVhbSgpLCBsb2NhbEVyclN0cmVhbSwgZXJyVG9CZUNsb3NlKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKHN1Y2tJbiAhPSBudWxsKSB7Ci0gICAgICAgIHN1Y2tJbi5zdGFydCgpOwotICAgICAgfQotICAgICAgaWYgKHN1Y2tPdXQgIT0gbnVsbCkgewotICAgICAgICBzdWNrT3V0LnN0YXJ0KCk7Ci0gICAgICB9Ci0gICAgICBpZiAoc3Vja0VyciAhPSBudWxsKSB7Ci0gICAgICAgIHN1Y2tFcnIuc3RhcnQoKTsKLSAgICAgIH0KLQotICAgICAgcHJvYy53YWl0Rm9yKCk7Ci0gICAgICBpZiAoc3Vja0luICE9IG51bGwpIHsKLSAgICAgICAgc3Vja0luLmpvaW4oKTsKLSAgICAgIH0KLSAgICAgIGlmIChzdWNrT3V0ICE9IG51bGwpIHsKLSAgICAgICAgc3Vja091dC5qb2luKCk7Ci0gICAgICB9Ci0gICAgICBpZiAoc3Vja0VyciAhPSBudWxsKSB7Ci0gICAgICAgIHN1Y2tFcnIuam9pbigpOwotICAgICAgfQotCi0gICAgICByZXQgPSBwcm9jLmV4aXRWYWx1ZSgpOwotICAgICAgcHJvYy5kZXN0cm95KCk7Ci0KLSAgICAgIHJldHVybiByZXQgPT0gMDsKLSAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgewotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUaHJlYWRCeXRlc1N0cmVhbVN1Y2tlciBleHRlbmRzIEJ5dGVzU3RyZWFtU3Vja2VyIGltcGxlbWVudHMgUnVubmFibGUgewotCi0gICAgcHVibGljIFRocmVhZEJ5dGVzU3RyZWFtU3Vja2VyKEBOb25udWxsIElucHV0U3RyZWFtIGlzLCBATm9ubnVsbCBPdXRwdXRTdHJlYW0gb3MsCi0gICAgICAgIGJvb2xlYW4gdG9CZUNsb3NlKSB7Ci0gICAgICBzdXBlcihpcywgb3MsIHRvQmVDbG9zZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgdHJ5IHsKLSAgICAgICAgc3VjaygpOwotICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAvLyBCZXN0IGVmZm9ydAotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGNsYXNzIFRocmVhZENoYXJhY3RlcnNTdHJlYW1TdWNrZXIgZXh0ZW5kcyBDaGFyYWN0ZXJzU3RyZWFtU3Vja2VyIGltcGxlbWVudHMKLSAgICAgIFJ1bm5hYmxlIHsKLQotICAgIHB1YmxpYyBUaHJlYWRDaGFyYWN0ZXJzU3RyZWFtU3Vja2VyKEBOb25udWxsIElucHV0U3RyZWFtIGlzLCBATm9ubnVsbCBQcmludFN0cmVhbSBwcywKLSAgICAgICAgYm9vbGVhbiB0b0JlQ2xvc2UpIHsKLSAgICAgIHN1cGVyKGlzLCBwcywgdG9CZUNsb3NlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICB0cnkgewotICAgICAgICBzdWNrKCk7Ci0gICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIC8vIEJlc3QgZWZmb3J0Ci0gICAgICB9Ci0gICAgfQotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvdm0tdGVzdHMtdGYvc3JjL3V0aWwvYnVpbGQvSmFja0J1aWxkRGFsdmlrU3VpdGUuamF2YSBiL3Rvb2xzL3ZtLXRlc3RzLXRmL3NyYy91dGlsL2J1aWxkL0phY2tCdWlsZERhbHZpa1N1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNDVmOWMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvdm0tdGVzdHMtdGYvc3JjL3V0aWwvYnVpbGQvSmFja0J1aWxkRGFsdmlrU3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHV0aWwuYnVpbGQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmFja0J1aWxkRGFsdmlrU3VpdGUgewotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFDSzsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nW10gcmVtYWluaW5nQXJnczsKLSAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgSkFDSyA9IGFyZ3NbMF07Ci0gICAgICAgICAgICByZW1haW5pbmdBcmdzID0gbmV3IFN0cmluZ1thcmdzLmxlbmd0aCAtIDFdOwotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShhcmdzLCAxLCByZW1haW5pbmdBcmdzLCAwLCByZW1haW5pbmdBcmdzLmxlbmd0aCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZW1haW5pbmdBcmdzID0gYXJnczsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghQnVpbGREYWx2aWtTdWl0ZS5wYXJzZUFyZ3MocmVtYWluaW5nQXJncykpIHsKLSAgICAgICAgICAgIHByaW50VXNhZ2UoKTsKLSAgICAgICAgICAgIFN5c3RlbS5leGl0KC0xKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgQnVpbGREYWx2aWtTdWl0ZSBjYXQgPSBuZXcgQnVpbGREYWx2aWtTdWl0ZSh0cnVlKTsKLSAgICAgICAgY2F0LmNvbXBvc2UoKTsKLSAgICAgICAgbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImVsYXBzZWQgc2Vjb25kczogIiArIChlbmQgLSBzdGFydCkgLyAxMDAwKTsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJpbnRVc2FnZSgpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ1c2FnZTogamF2YS1zcmMtZm9sZGVyIG91dHB1dC1mb2xkZXIgY2xhc3NwYXRoICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgImdlbmVyYXRlZC1tYWluLWZpbGVzIGNvbXBpbGVkX291dHB1dCBnZW5lcmF0ZWQtbWFpbi1maWxlcyAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJbcmVzdHJpY3QtdG8tb3Bjb2RlXSIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3ZtLXRlc3RzLXRmL3NyYy91dGlsL2J1aWxkL0phY2tCdWlsZFN0ZXAuamF2YSBiL3Rvb2xzL3ZtLXRlc3RzLXRmL3NyYy91dGlsL2J1aWxkL0phY2tCdWlsZFN0ZXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0NjU4Mi4uMDAwMDAwMAotLS0gYS90b29scy92bS10ZXN0cy10Zi9zcmMvdXRpbC9idWlsZC9KYWNrQnVpbGRTdGVwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdXRpbC5idWlsZDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLXB1YmxpYyBjbGFzcyBKYWNrQnVpbGRTdGVwIGV4dGVuZHMgU291cmNlQnVpbGRTdGVwIHsKLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGRlc3RQYXRoOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGNsYXNzUGF0aDsKLSAgICBwcml2YXRlIGZpbmFsIFNldDxTdHJpbmc+IHNvdXJjZUZpbGVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCi0gICAgcHVibGljIEphY2tCdWlsZFN0ZXAoU3RyaW5nIGRlc3RQYXRoLCBTdHJpbmcgY2xhc3NQYXRoKSB7Ci0gICAgICAgIHN1cGVyKG5ldyBGaWxlKGRlc3RQYXRoKSk7Ci0gICAgICAgIHRoaXMuZGVzdFBhdGggPSBkZXN0UGF0aDsKLSAgICAgICAgdGhpcy5jbGFzc1BhdGggPSBjbGFzc1BhdGg7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkU291cmNlRmlsZShTdHJpbmcgc291cmNlRmlsZSkgewotICAgICAgICBzb3VyY2VGaWxlcy5hZGQoc291cmNlRmlsZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgYm9vbGVhbiBidWlsZCgpIHsKLSAgICAgICAgaWYgKHN1cGVyLmJ1aWxkKCkpIHsKLSAgICAgICAgICAgIGlmIChzb3VyY2VGaWxlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgRmlsZSBvdXREaXIgPSBuZXcgRmlsZShkZXN0UGF0aCkuZ2V0UGFyZW50RmlsZSgpOwotICAgICAgICAgICAgaWYgKCFvdXREaXIuZXhpc3RzKCkgJiYgIW91dERpci5ta2RpcnMoKSkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiZmFpbGVkIHRvIGNyZWF0ZSBvdXRwdXQgZGlyOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIG91dERpci5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBGaWxlIHRtcE91dERpciA9IG5ldyBGaWxlKG91dERpciwgb3V0cHV0RmlsZS5maWxlTmFtZS5nZXROYW1lKCkgKyAiLmRleFRtcCIpOwotICAgICAgICAgICAgaWYgKCF0bXBPdXREaXIuZXhpc3RzKCkgJiYgIXRtcE91dERpci5ta2RpcnMoKSkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiZmFpbGVkIHRvIGNyZWF0ZSB0ZW1wIGRpcjogIgotICAgICAgICAgICAgICAgICAgICAgICAgKyB0bXBPdXREaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZpbGUgdG1wRGV4ID0gbmV3IEZpbGUodG1wT3V0RGlyLCAiY2xhc3Nlcy5kZXgiKTsKLQotICAgICAgICAgICAgRmlsZSB0bXBBcmdzID0gbmV3IEZpbGUob3V0RGlyLCBvdXRwdXRGaWxlLmZpbGVOYW1lLmdldE5hbWUoKSArICIuYXJncyIpOwotCi0gICAgICAgICAgICBXcml0ZXIgYXJnc091dCA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGFyZ3NPdXQgPSBuZXcgRmlsZVdyaXRlcih0bXBBcmdzKTsKLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBzb3VyY2UgOiBzb3VyY2VGaWxlcykgewotICAgICAgICAgICAgICAgICAgICBhcmdzT3V0LmFwcGVuZChzb3VyY2UpOwotICAgICAgICAgICAgICAgICAgICBhcmdzT3V0LmFwcGVuZCgnXG4nKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYXJnc091dC5jbG9zZSgpOwotICAgICAgICAgICAgICAgIGFyZ3NPdXQgPSBudWxsOwotCi0gICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGNvbW1hbmRMaW5lID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KDYgKyBzb3VyY2VGaWxlcy5zaXplKCkpOwotICAgICAgICAgICAgICAgIGNvbW1hbmRMaW5lLmFkZCgiLS12ZXJib3NlIik7Ci0gICAgICAgICAgICAgICAgY29tbWFuZExpbmUuYWRkKCJlcnJvciIpOwotICAgICAgICAgICAgICAgIGNvbW1hbmRMaW5lLmFkZCgiLS1jbGFzc3BhdGgiKTsKLSAgICAgICAgICAgICAgICBjb21tYW5kTGluZS5hZGQoY2xhc3NQYXRoKTsKLSAgICAgICAgICAgICAgICBjb21tYW5kTGluZS5hZGQoIi0tb3V0cHV0LWRleCIpOwotICAgICAgICAgICAgICAgIGNvbW1hbmRMaW5lLmFkZCh0bXBPdXREaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgICAgIGNvbW1hbmRMaW5lLmFkZCgiQCIgKyB0bXBBcmdzLmdldFBhdGgoKSk7Ci0KLSAgICAgICAgICAgICAgICBFeGVjdXRlRmlsZSBleGVjID0gbmV3IEV4ZWN1dGVGaWxlKEphY2tCdWlsZERhbHZpa1N1aXRlLkpBQ0ssCi0gICAgICAgICAgICAgICAgICAgIGNvbW1hbmRMaW5lLnRvQXJyYXkobmV3IFN0cmluZ1tjb21tYW5kTGluZS5zaXplKCldKSk7Ci0gICAgICAgICAgICAgICAgZXhlYy5zZXRFcnIoU3lzdGVtLmVycik7Ci0gICAgICAgICAgICAgICAgZXhlYy5zZXRPdXQoU3lzdGVtLm91dCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFleGVjLnJ1bigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBKYXJCdWlsZFN0ZXAgamFyU3RlcCA9IG5ldyBKYXJCdWlsZFN0ZXAoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBCdWlsZEZpbGUodG1wRGV4KSwKLSAgICAgICAgICAgICAgICAgICAgImNsYXNzZXMuZGV4IiwKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0RmlsZSwKLSAgICAgICAgICAgICAgICAgICAgLyogZGVsZXRlSW5wdXRGaWxlQWZ0ZXJCdWlsZCA9ICovIHRydWUpOwotICAgICAgICAgICAgICAgIGlmICghamFyU3RlcC5idWlsZCgpKSB7Ci0gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkZhaWxlZCB0byBtYWtlIGphcjogIiArIG91dHB1dEZpbGUuZ2V0UGF0aCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZXgpIHsKLSAgICAgICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHRtcERleC5kZWxldGUoKTsKLSAgICAgICAgICAgICAgICB0bXBBcmdzLmRlbGV0ZSgpOwotICAgICAgICAgICAgICAgIHRtcE91dERpci5kZWxldGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoYXJnc091dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcmdzT3V0LmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUsIGRvbid0IG92ZXJyaWRlIGFscmVhZHkgdGhyb3duIGV4Y2VwdGlvbgotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICBpZiAoc3VwZXIuZXF1YWxzKG9iaikpIHsKLSAgICAgICAgICAgIEphY2tCdWlsZFN0ZXAgb3RoZXIgPSAoSmFja0J1aWxkU3RlcCkgb2JqOwotICAgICAgICAgICAgcmV0dXJuIGRlc3RQYXRoLmVxdWFscyhvdGhlci5kZXN0UGF0aCkgJiYgY2xhc3NQYXRoLmVxdWFscyhvdGhlci5jbGFzc1BhdGgpCi0gICAgICAgICAgICAgICAgICAgICYmIHNvdXJjZUZpbGVzLmVxdWFscyhvdGhlci5zb3VyY2VGaWxlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiBkZXN0UGF0aC5oYXNoQ29kZSgpIF4gY2xhc3NQYXRoLmhhc2hDb2RlKCkgXiBzb3VyY2VGaWxlcy5oYXNoQ29kZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3ZtLXRlc3RzLXRmL3NyYy91dGlsL2J1aWxkL0phY2tEZXhCdWlsZFN0ZXAuamF2YSBiL3Rvb2xzL3ZtLXRlc3RzLXRmL3NyYy91dGlsL2J1aWxkL0phY2tEZXhCdWlsZFN0ZXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JkNWEzYi4uMDAwMDAwMAotLS0gYS90b29scy92bS10ZXN0cy10Zi9zcmMvdXRpbC9idWlsZC9KYWNrRGV4QnVpbGRTdGVwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdXRpbC5idWlsZDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBKYWNrRGV4QnVpbGRTdGVwIGV4dGVuZHMgQnVpbGRTdGVwIHsKLQotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBkZWxldGVJbnB1dEZpbGVBZnRlckJ1aWxkOwotCi0gICAgSmFja0RleEJ1aWxkU3RlcChCdWlsZEZpbGUgaW5wdXRGaWxlLCBCdWlsZEZpbGUgb3V0cHV0RmlsZSwKLSAgICAgICAgICAgIGJvb2xlYW4gZGVsZXRlSW5wdXRGaWxlQWZ0ZXJCdWlsZCkgewotICAgICAgICBzdXBlcihpbnB1dEZpbGUsIG91dHB1dEZpbGUpOwotICAgICAgICB0aGlzLmRlbGV0ZUlucHV0RmlsZUFmdGVyQnVpbGQgPSBkZWxldGVJbnB1dEZpbGVBZnRlckJ1aWxkOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIGJvb2xlYW4gYnVpbGQoKSB7Ci0KLSAgICAgICAgaWYgKHN1cGVyLmJ1aWxkKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBvdXRwdXRGaWxlUGF0aCA9IG91dHB1dEZpbGUuZmlsZU5hbWUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgICAgICBpZiAob3V0cHV0RmlsZVBhdGguZW5kc1dpdGgoIi5kZXgiKSkgewotICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoCi0gICAgICAgICAgICAgICAgICAiSmFja0RleEJ1aWxkU3RlcCBkb2VzIG5vdCBzdXBwb3J0IGRleCBvdXRwdXQgb3V0c2lkZSBvZiBhbiBhcmNoaXZlIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEZpbGUgb3V0RGlyID0gb3V0cHV0RmlsZS5maWxlTmFtZS5nZXRQYXJlbnRGaWxlKCk7Ci0gICAgICAgICAgICBpZiAoIW91dERpci5leGlzdHMoKSAmJiAhb3V0RGlyLm1rZGlycygpKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJmYWlsZWQgdG8gY3JlYXRlIG91dHB1dCBkaXI6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgb3V0RGlyLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEZpbGUgdG1wT3V0RGlyID0gbmV3IEZpbGUob3V0RGlyLCBvdXRwdXRGaWxlLmZpbGVOYW1lLmdldE5hbWUoKSArICIuZGV4VG1wIik7Ci0gICAgICAgICAgICBpZiAoIXRtcE91dERpci5leGlzdHMoKSAmJiAhdG1wT3V0RGlyLm1rZGlycygpKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJmYWlsZWQgdG8gY3JlYXRlIHRlbXAgZGlyOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIHRtcE91dERpci5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRmlsZSB0bXBEZXggPSBuZXcgRmlsZSh0bXBPdXREaXIsICJjbGFzc2VzLmRleCIpOwotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBjb21tYW5kTGluZSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPig0KTsKLSAgICAgICAgICAgICAgICBjb21tYW5kTGluZS5hZGQoIi0tdmVyYm9zZSIpOwotICAgICAgICAgICAgICAgIGNvbW1hbmRMaW5lLmFkZCgiZXJyb3IiKTsKLSAgICAgICAgICAgICAgICBjb21tYW5kTGluZS5hZGQoIi0tb3V0cHV0LWRleCIpOwotICAgICAgICAgICAgICAgIGNvbW1hbmRMaW5lLmFkZCh0bXBPdXREaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgICAgIGNvbW1hbmRMaW5lLmFkZCgiLS1pbXBvcnQiKTsKLSAgICAgICAgICAgICAgICBjb21tYW5kTGluZS5hZGQoaW5wdXRGaWxlLmZpbGVOYW1lLmdldEFic29sdXRlUGF0aCgpKTsKLQotICAgICAgICAgICAgICAgIEV4ZWN1dGVGaWxlIGV4ZWMgPSBuZXcgRXhlY3V0ZUZpbGUoSmFja0J1aWxkRGFsdmlrU3VpdGUuSkFDSywKLSAgICAgICAgICAgICAgICAgICAgY29tbWFuZExpbmUudG9BcnJheShuZXcgU3RyaW5nW2NvbW1hbmRMaW5lLnNpemUoKV0pKTsKLSAgICAgICAgICAgICAgICBleGVjLnNldEVycihTeXN0ZW0uZXJyKTsKLSAgICAgICAgICAgICAgICBleGVjLnNldE91dChTeXN0ZW0ub3V0KTsKLSAgICAgICAgICAgICAgICBpZiAoIWV4ZWMucnVuKCkpIHsKLSAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBKYXJCdWlsZFN0ZXAgamFyU3RlcCA9IG5ldyBKYXJCdWlsZFN0ZXAoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBCdWlsZEZpbGUodG1wRGV4KSwKLSAgICAgICAgICAgICAgICAgICAgImNsYXNzZXMuZGV4IiwKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0RmlsZSwKLSAgICAgICAgICAgICAgICAgICAgLyogZGVsZXRlSW5wdXRGaWxlQWZ0ZXJCdWlsZCA9ICovIHRydWUpOwotICAgICAgICAgICAgICAgIGlmICghamFyU3RlcC5idWlsZCgpKSB7Ci0gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkZhaWxlZCB0byBtYWtlIGphcjogIiArIG91dHB1dEZpbGUuZ2V0UGF0aCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGRlbGV0ZUlucHV0RmlsZUFmdGVyQnVpbGQpIHsKLSAgICAgICAgICAgICAgICAgICAgaW5wdXRGaWxlLmZpbGVOYW1lLmRlbGV0ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBleCkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiZXhjZXB0aW9uIHdoaWxlIGRleGluZyAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGlucHV0RmlsZS5maWxlTmFtZS5nZXRBYnNvbHV0ZVBhdGgoKSArICIgdG8gIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBvdXRwdXRGaWxlLmZpbGVOYW1lLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgIHRtcERleC5kZWxldGUoKTsKLSAgICAgICAgICAgICAgdG1wT3V0RGlyLmRlbGV0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICByZXR1cm4gaW5wdXRGaWxlLmhhc2hDb2RlKCkgXiBvdXRwdXRGaWxlLmhhc2hDb2RlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKHN1cGVyLmVxdWFscyhvYmopKSB7Ci0gICAgICAgICAgICBKYWNrRGV4QnVpbGRTdGVwIG90aGVyID0gKEphY2tEZXhCdWlsZFN0ZXApIG9iajsKLQotICAgICAgICAgICAgcmV0dXJuIGlucHV0RmlsZS5lcXVhbHMob3RoZXIuaW5wdXRGaWxlKQotICAgICAgICAgICAgICAgICAgICAmJiBvdXRwdXRGaWxlLmVxdWFscyhvdGhlci5vdXRwdXRGaWxlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3ZtLXRlc3RzLXRmL3NyYy91dGlsL2J1aWxkL0phdmFjQnVpbGRTdGVwLmphdmEgYi90b29scy92bS10ZXN0cy10Zi9zcmMvdXRpbC9idWlsZC9KYXZhY0J1aWxkU3RlcC5qYXZhCmluZGV4IGExY2RlMWYuLmU1NTE5ODkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3ZtLXRlc3RzLXRmL3NyYy91dGlsL2J1aWxkL0phdmFjQnVpbGRTdGVwLmphdmEKKysrIGIvdG9vbHMvdm0tdGVzdHMtdGYvc3JjL3V0aWwvYnVpbGQvSmF2YWNCdWlsZFN0ZXAuamF2YQpAQCAtMTYsMTIgKzE2LDE4IEBACiAKIHBhY2thZ2UgdXRpbC5idWlsZDsKIAotaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMuTWFpbjsKLQogaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEubGFuZy5JdGVyYWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmF4LnRvb2xzLkphdmFDb21waWxlcjsKK2ltcG9ydCBqYXZheC50b29scy5KYXZhRmlsZU9iamVjdDsKK2ltcG9ydCBqYXZheC50b29scy5TdGFuZGFyZEphdmFGaWxlTWFuYWdlcjsKK2ltcG9ydCBqYXZheC50b29scy5TdGFuZGFyZExvY2F0aW9uOworaW1wb3J0IGphdmF4LnRvb2xzLlRvb2xQcm92aWRlcjsKIAogcHVibGljIGNsYXNzIEphdmFjQnVpbGRTdGVwIGV4dGVuZHMgU291cmNlQnVpbGRTdGVwIHsKIApAQCAtNTUsMjMgKzYxLDM3IEBACiAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJmYWlsZWQgdG8gY3JlYXRlIGRlc3RpbmF0aW9uIGRpciIpOwogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBhcmdzID0gODsKLSAgICAgICAgICAgIFN0cmluZ1tdIGNvbW1hbmRMaW5lID0gbmV3IFN0cmluZ1tzb3VyY2VGaWxlcy5zaXplKCkrYXJnc107Ci0gICAgICAgICAgICBjb21tYW5kTGluZVswXSA9ICItY2xhc3NwYXRoIjsKLSAgICAgICAgICAgIGNvbW1hbmRMaW5lWzFdID0gY2xhc3NQYXRoOwotICAgICAgICAgICAgY29tbWFuZExpbmVbMl0gPSAiLWQiOwotICAgICAgICAgICAgY29tbWFuZExpbmVbM10gPSBkZXN0UGF0aDsKLSAgICAgICAgICAgIGNvbW1hbmRMaW5lWzRdID0gIi1zb3VyY2UiOwotICAgICAgICAgICAgY29tbWFuZExpbmVbNV0gPSAiMS43IjsKLSAgICAgICAgICAgIGNvbW1hbmRMaW5lWzZdID0gIi10YXJnZXQiOwotICAgICAgICAgICAgY29tbWFuZExpbmVbN10gPSAiMS43IjsKIAotICAgICAgICAgICAgU3RyaW5nW10gZmlsZXMgPSBuZXcgU3RyaW5nW3NvdXJjZUZpbGVzLnNpemUoKV07Ci0gICAgICAgICAgICBzb3VyY2VGaWxlcy50b0FycmF5KGZpbGVzKTsKKyAgICAgICAgICAgIEl0ZXJhYmxlPEZpbGU+IGNsYXNzUGF0aEZpbGVzID0gQXJyYXlzLmFzTGlzdChjbGFzc1BhdGguc3BsaXQoIjoiKSkKKyAgICAgICAgICAgICAgICAgICAgLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAgIC5tYXAoRmlsZTo6bmV3KQorICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKIAotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShmaWxlcywgMCwgY29tbWFuZExpbmUsIGFyZ3MsIGZpbGVzLmxlbmd0aCk7CisgICAgICAgICAgICBKYXZhQ29tcGlsZXIgY29tcGlsZXIgPSBUb29sUHJvdmlkZXIuZ2V0U3lzdGVtSmF2YUNvbXBpbGVyKCk7CisgICAgICAgICAgICB0cnkgKFN0YW5kYXJkSmF2YUZpbGVNYW5hZ2VyIGZpbGVNYW5hZ2VyID0gY29tcGlsZXIuZ2V0U3RhbmRhcmRGaWxlTWFuYWdlcigKKyAgICAgICAgICAgICAgICAgICAgbnVsbCwgICAgIC8vIGRpYWdub3N0aWNMaXN0ZW5lcjogd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgZGV0YWlscy4KKyAgICAgICAgICAgICAgICAgICAgbnVsbCwgICAgIC8vIGxvY2FsZTogdXNlIGRlZmF1bHQgbG9jYWxlLgorICAgICAgICAgICAgICAgICAgICBudWxsKSkgeyAgLy8gY2hhcnNldDogdXNlIHBsYXRmb3JtIGRlZmF1bHQuCisgICAgICAgICAgICAgICAgZmlsZU1hbmFnZXIuc2V0TG9jYXRpb24oU3RhbmRhcmRMb2NhdGlvbi5DTEFTU19PVVRQVVQsIEFycmF5cy5hc0xpc3QoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZShkZXN0UGF0aCkpKTsKKyAgICAgICAgICAgICAgICBmaWxlTWFuYWdlci5zZXRMb2NhdGlvbihTdGFuZGFyZExvY2F0aW9uLkNMQVNTX1BBVEgsIGNsYXNzUGF0aEZpbGVzKTsKIAotICAgICAgICAgICAgcmV0dXJuIE1haW4uY29tcGlsZShjb21tYW5kTGluZSwgbmV3IFByaW50V3JpdGVyKFN5c3RlbS5lcnIpKSA9PSAwOworICAgICAgICAgICAgICAgIEl0ZXJhYmxlPD8gZXh0ZW5kcyBKYXZhRmlsZU9iamVjdD4gY29tcGlsYXRpb25Vbml0cyA9CisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlTWFuYWdlci5nZXRKYXZhRmlsZU9iamVjdHNGcm9tU3RyaW5ncyhzb3VyY2VGaWxlcyk7CisKKyAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gb3B0aW9ucyA9IEFycmF5cy5hc0xpc3QoIi1zb3VyY2UiLCAiMS43IiwgIi10YXJnZXQiLCAiMS43Iik7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gY29tcGlsZXIuZ2V0VGFzaygKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsICAvLyBvdXQ6IHdyaXRlIGVycm9ycyB0byBTeXN0ZW0uZXJyLgorICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU1hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCAgLy8gZGlhZ25vc3RpY0xpc3RlbmVyOiB3ZSBkb24ndCBjYXJlIGFib3V0IHRoZSBkZXRhaWxzLgorICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsICAvLyBjbGFzc2VzOiBjbGFzc2VzIGZvciBhbm5vdGF0aW9uIHByb2Nlc3NpbmcgPSBub25lLgorICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsYXRpb25Vbml0cykuY2FsbCgpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdm0tdGVzdHMtdGYvc3JjL3V0aWwvYnVpbGQvSmlsbEJ1aWxkU3RlcC5qYXZhIGIvdG9vbHMvdm0tdGVzdHMtdGYvc3JjL3V0aWwvYnVpbGQvSmlsbEJ1aWxkU3RlcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGNkNDljLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3ZtLXRlc3RzLXRmL3NyYy91dGlsL2J1aWxkL0ppbGxCdWlsZFN0ZXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHV0aWwuYnVpbGQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIEppbGxCdWlsZFN0ZXAgZXh0ZW5kcyBCdWlsZFN0ZXAgewotCi0gICAgSmlsbEJ1aWxkU3RlcChCdWlsZEZpbGUgaW5wdXRGaWxlLCBCdWlsZEZpbGUgb3V0cHV0RmlsZSkgewotICAgICAgICBzdXBlcihpbnB1dEZpbGUsIG91dHB1dEZpbGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIGJvb2xlYW4gYnVpbGQoKSB7Ci0gICAgICAgIGlmIChzdXBlci5idWlsZCgpKSB7Ci0gICAgICAgICAgICBGaWxlIHRtcElucHV0SmFyID0gbmV3IEZpbGUoaW5wdXRGaWxlLmZpbGVOYW1lLmdldFBhdGgoKSArICIuamFyIik7Ci0gICAgICAgICAgICB0cnkgewotCi0gICAgICAgICAgICAgICAgRmlsZSBvdXREaXIgPSBvdXRwdXRGaWxlLmZpbGVOYW1lLmdldFBhcmVudEZpbGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoIW91dERpci5leGlzdHMoKSAmJiAhb3V0RGlyLm1rZGlycygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiZmFpbGVkIHRvIGNyZWF0ZSBvdXRwdXQgZGlyOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBvdXREaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gaW5wdXQgZmlsZSBpcyBhIGNsYXNzIGZpbGUgYnV0IGphY2sgc3VwcG9ydHMgb25seSBqYXIKLSAgICAgICAgICAgICAgICBKYXJCdWlsZFN0ZXAgamFyU3RlcCA9IG5ldyBKYXJCdWlsZFN0ZXAoCi0gICAgICAgICAgICAgICAgICAgIGlucHV0RmlsZSwKLSAgICAgICAgICAgICAgICAgICAgaW5wdXRGaWxlLmZpbGVOYW1lLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgbmV3IEJ1aWxkRmlsZSh0bXBJbnB1dEphciksCi0gICAgICAgICAgICAgICAgICAgIC8qIGRlbGV0ZUlucHV0RmlsZUFmdGVyQnVpbGQgPSAqLyBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFqYXJTdGVwLmJ1aWxkKCkpIHsKLSAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiRmFpbGVkIHRvIG1ha2UgamFyOiAiICsgb3V0cHV0RmlsZS5nZXRQYXRoKCkpOwotICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAgICAgU3RyaW5nW10gY29tbWFuZExpbmUgPSBuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgICAgICAgICAiLS12ZXJib3NlIiwKLSAgICAgICAgICAgICAgICAgICAgImVycm9yIiwKLSAgICAgICAgICAgICAgICAgICAgIi0taW1wb3J0IiwKLSAgICAgICAgICAgICAgICAgICAgdG1wSW5wdXRKYXIuZ2V0QWJzb2x1dGVQYXRoKCksCi0gICAgICAgICAgICAgICAgICAgICItLW91dHB1dC1qYWNrIiwKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0RmlsZS5maWxlTmFtZS5nZXRBYnNvbHV0ZVBhdGgoKSwKLSAgICAgICAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICAgICAgICBFeGVjdXRlRmlsZSBleGVjID0gbmV3IEV4ZWN1dGVGaWxlKEphY2tCdWlsZERhbHZpa1N1aXRlLkpBQ0ssIGNvbW1hbmRMaW5lKTsKLSAgICAgICAgICAgICAgICBleGVjLnNldEVycihTeXN0ZW0uZXJyKTsKLSAgICAgICAgICAgICAgICBleGVjLnNldE91dChTeXN0ZW0ub3V0KTsKLSAgICAgICAgICAgICAgICBpZiAoIWV4ZWMucnVuKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGV4KSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJleGNlcHRpb24gd2hpbGUgdHJhbnNmb3JtaW5nIGphY2sgZmlsZSBmcm9tIGphciAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGlucHV0RmlsZS5maWxlTmFtZS5nZXRBYnNvbHV0ZVBhdGgoKSArICIgdG8gIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBvdXRwdXRGaWxlLmZpbGVOYW1lLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgdG1wSW5wdXRKYXIuZGVsZXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmIChzdXBlci5lcXVhbHMob2JqKSkgewotICAgICAgICAgICAgSmlsbEJ1aWxkU3RlcCBvdGhlciA9IChKaWxsQnVpbGRTdGVwKSBvYmo7Ci0KLSAgICAgICAgICAgIHJldHVybiBpbnB1dEZpbGUuZXF1YWxzKG90aGVyLmlucHV0RmlsZSkgJiYgb3V0cHV0RmlsZS5lcXVhbHMob3RoZXIub3V0cHV0RmlsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiBpbnB1dEZpbGUuaGFzaENvZGUoKSBeIG91dHB1dEZpbGUuaGFzaENvZGUoKTsKLSAgICB9Ci19Cg==